From e8ec7aa8e38a93f5b034ac74cebce5de23710317 Mon Sep 17 00:00:00 2001 From: hongbotian Date: Mon, 30 Nov 2015 01:45:08 -0500 Subject: [PATCH] upload http JIRA: BOTTLENECK-10 Change-Id: I7598427ff904df438ce77c2819ee48ac75ffa8da Signed-off-by: hongbotian --- rubbos/app/httpd-2.0.64/.deps | 0 rubbos/app/httpd-2.0.64/.gdbinit | 273 + rubbos/app/httpd-2.0.64/.libs/httpd | Bin 0 -> 2192464 bytes rubbos/app/httpd-2.0.64/.libs/modules.o | Bin 0 -> 17240 bytes rubbos/app/httpd-2.0.64/ABOUT_APACHE | 277 + rubbos/app/httpd-2.0.64/Apache.dsp | 128 + rubbos/app/httpd-2.0.64/Apache.dsw | 1790 + rubbos/app/httpd-2.0.64/BuildBin.dsp | 97 + rubbos/app/httpd-2.0.64/CHANGES | 7423 +++ rubbos/app/httpd-2.0.64/INSTALL | 99 + rubbos/app/httpd-2.0.64/InstallBin.dsp | 109 + rubbos/app/httpd-2.0.64/LAYOUT | 201 + rubbos/app/httpd-2.0.64/LICENSE | 616 + rubbos/app/httpd-2.0.64/Makefile | 215 + rubbos/app/httpd-2.0.64/Makefile.in | 210 + rubbos/app/httpd-2.0.64/Makefile.win | 691 + rubbos/app/httpd-2.0.64/NOTICE | 20 + rubbos/app/httpd-2.0.64/NWGNUmakefile | 437 + rubbos/app/httpd-2.0.64/README | 140 + rubbos/app/httpd-2.0.64/README.platforms | 92 + rubbos/app/httpd-2.0.64/VERSIONING | 154 + rubbos/app/httpd-2.0.64/acconfig.h | 2 + rubbos/app/httpd-2.0.64/acinclude.m4 | 542 + rubbos/app/httpd-2.0.64/apachenw.mcp.zip | Bin 0 -> 189152 bytes rubbos/app/httpd-2.0.64/build/NWGNUenvironment.inc | 314 + rubbos/app/httpd-2.0.64/build/NWGNUhead.inc | 106 + rubbos/app/httpd-2.0.64/build/NWGNUmakefile | 119 + rubbos/app/httpd-2.0.64/build/NWGNUtail.inc | 319 + rubbos/app/httpd-2.0.64/build/PrintPath | 130 + rubbos/app/httpd-2.0.64/build/apr_common.m4 | 993 + rubbos/app/httpd-2.0.64/build/binbuild.sh | 206 + rubbos/app/httpd-2.0.64/build/bsd_makefile | 34 + rubbos/app/httpd-2.0.64/build/build-modules-c.awk | 70 + rubbos/app/httpd-2.0.64/build/buildinfo.sh | 171 + rubbos/app/httpd-2.0.64/build/config-stubs | 27 + rubbos/app/httpd-2.0.64/build/config.guess | 1502 + rubbos/app/httpd-2.0.64/build/config.sub | 1731 + rubbos/app/httpd-2.0.64/build/config_vars.mk | 150 + rubbos/app/httpd-2.0.64/build/default.pl | 496 + rubbos/app/httpd-2.0.64/build/fastgen.sh | 89 + rubbos/app/httpd-2.0.64/build/find_apr.m4 | 104 + rubbos/app/httpd-2.0.64/build/find_apu.m4 | 102 + rubbos/app/httpd-2.0.64/build/get-version.sh | 57 + .../app/httpd-2.0.64/build/install-bindist.sh.in | 176 + rubbos/app/httpd-2.0.64/build/install.sh | 123 + rubbos/app/httpd-2.0.64/build/instdso.sh | 93 + rubbos/app/httpd-2.0.64/build/library.mk | 22 + rubbos/app/httpd-2.0.64/build/ltlib.mk | 23 + rubbos/app/httpd-2.0.64/build/ltmain.sh | 6956 +++ rubbos/app/httpd-2.0.64/build/make_exports.awk | 164 + rubbos/app/httpd-2.0.64/build/make_nw_export.awk | 91 + rubbos/app/httpd-2.0.64/build/make_var_export.awk | 75 + rubbos/app/httpd-2.0.64/build/mkconfNW.awk | 105 + rubbos/app/httpd-2.0.64/build/mkdep.perl | 92 + rubbos/app/httpd-2.0.64/build/mkdir.sh | 48 + rubbos/app/httpd-2.0.64/build/nw_export.inc | 49 + rubbos/app/httpd-2.0.64/build/nw_ver.awk | 40 + rubbos/app/httpd-2.0.64/build/pkg/README | 16 + rubbos/app/httpd-2.0.64/build/pkg/buildpkg.sh | 94 + rubbos/app/httpd-2.0.64/build/pkg/pkginfo | 11 + rubbos/app/httpd-2.0.64/build/pkg/pkginfo.in | 11 + rubbos/app/httpd-2.0.64/build/prebuildNW.bat | 47 + rubbos/app/httpd-2.0.64/build/program.mk | 22 + rubbos/app/httpd-2.0.64/build/rpm/httpd.init | 127 + rubbos/app/httpd-2.0.64/build/rpm/httpd.logrotate | 8 + rubbos/app/httpd-2.0.64/build/rpm/httpd.spec.in | 514 + rubbos/app/httpd-2.0.64/build/rules.mk | 226 + rubbos/app/httpd-2.0.64/build/rules.mk.in | 226 + rubbos/app/httpd-2.0.64/build/special.mk | 38 + rubbos/app/httpd-2.0.64/build/sysv_makefile | 34 + rubbos/app/httpd-2.0.64/build/win32/apache.ico | Bin 0 -> 1078 bytes rubbos/app/httpd-2.0.64/build/win32/win32ver.awk | 136 + rubbos/app/httpd-2.0.64/buildconf | 189 + rubbos/app/httpd-2.0.64/config.layout | 324 + rubbos/app/httpd-2.0.64/config.log | 1534 + rubbos/app/httpd-2.0.64/config.nice | 10 + rubbos/app/httpd-2.0.64/config.status | 1250 + rubbos/app/httpd-2.0.64/configure | 20186 +++++++++ rubbos/app/httpd-2.0.64/configure.in | 604 + rubbos/app/httpd-2.0.64/docs/cgi-examples/printenv | 13 + rubbos/app/httpd-2.0.64/docs/cgi-examples/test-cgi | 31 + .../docs/conf/highperformance-std.conf | 70 + rubbos/app/httpd-2.0.64/docs/conf/httpd-std.conf | 1042 + .../app/httpd-2.0.64/docs/conf/httpd-std.conf.in | 1042 + rubbos/app/httpd-2.0.64/docs/conf/httpd-win.conf | 961 + rubbos/app/httpd-2.0.64/docs/conf/magic | 382 + rubbos/app/httpd-2.0.64/docs/conf/mime.types | 1351 + rubbos/app/httpd-2.0.64/docs/conf/ssl-std.conf | 246 + rubbos/app/httpd-2.0.64/docs/conf/ssl-std.conf.in | 246 + rubbos/app/httpd-2.0.64/docs/docroot/apache_pb.gif | Bin 0 -> 2326 bytes rubbos/app/httpd-2.0.64/docs/docroot/apache_pb.png | Bin 0 -> 1385 bytes .../app/httpd-2.0.64/docs/docroot/apache_pb2.gif | Bin 0 -> 2414 bytes .../app/httpd-2.0.64/docs/docroot/apache_pb2.png | Bin 0 -> 1463 bytes .../httpd-2.0.64/docs/docroot/apache_pb2_ani.gif | Bin 0 -> 2160 bytes rubbos/app/httpd-2.0.64/docs/docroot/index.html.ca | 38 + .../docs/docroot/index.html.cz.iso8859-2 | 51 + rubbos/app/httpd-2.0.64/docs/docroot/index.html.de | 61 + rubbos/app/httpd-2.0.64/docs/docroot/index.html.dk | 47 + rubbos/app/httpd-2.0.64/docs/docroot/index.html.ee | 53 + rubbos/app/httpd-2.0.64/docs/docroot/index.html.el | 37 + rubbos/app/httpd-2.0.64/docs/docroot/index.html.en | 38 + rubbos/app/httpd-2.0.64/docs/docroot/index.html.es | 51 + rubbos/app/httpd-2.0.64/docs/docroot/index.html.et | 53 + rubbos/app/httpd-2.0.64/docs/docroot/index.html.fr | 47 + .../docs/docroot/index.html.he.iso8859-8 | 54 + .../docs/docroot/index.html.hr.iso8859-2 | 35 + rubbos/app/httpd-2.0.64/docs/docroot/index.html.it | 39 + .../docs/docroot/index.html.ja.iso2022-jp | 42 + .../httpd-2.0.64/docs/docroot/index.html.ko.euc-kr | 37 + .../httpd-2.0.64/docs/docroot/index.html.lb.utf8 | 37 + rubbos/app/httpd-2.0.64/docs/docroot/index.html.nl | 54 + rubbos/app/httpd-2.0.64/docs/docroot/index.html.nn | 48 + rubbos/app/httpd-2.0.64/docs/docroot/index.html.no | 48 + .../docs/docroot/index.html.po.iso8859-2 | 40 + rubbos/app/httpd-2.0.64/docs/docroot/index.html.pt | 42 + .../app/httpd-2.0.64/docs/docroot/index.html.pt-br | 47 + .../docs/docroot/index.html.ru.cp-1251 | 34 + .../httpd-2.0.64/docs/docroot/index.html.ru.cp866 | 34 + .../httpd-2.0.64/docs/docroot/index.html.ru.iso-ru | 34 + .../httpd-2.0.64/docs/docroot/index.html.ru.koi8-r | 34 + .../httpd-2.0.64/docs/docroot/index.html.ru.utf8 | 34 + rubbos/app/httpd-2.0.64/docs/docroot/index.html.sv | 43 + .../app/httpd-2.0.64/docs/docroot/index.html.var | 123 + .../docs/docroot/index.html.zh-cn.gb2312 | 29 + .../docs/docroot/index.html.zh-tw.big5 | 46 + rubbos/app/httpd-2.0.64/docs/doxygen.conf | 52 + .../docs/error/HTTP_BAD_GATEWAY.html.var | 290 + .../docs/error/HTTP_BAD_REQUEST.html.var | 213 + .../docs/error/HTTP_FORBIDDEN.html.var | 372 + .../app/httpd-2.0.64/docs/error/HTTP_GONE.html.var | 422 + .../docs/error/HTTP_INTERNAL_SERVER_ERROR.html.var | 453 + .../docs/error/HTTP_LENGTH_REQUIRED.html.var | 222 + .../docs/error/HTTP_METHOD_NOT_ALLOWED.html.var | 213 + .../docs/error/HTTP_NOT_FOUND.html.var | 435 + .../docs/error/HTTP_NOT_IMPLEMENTED.html.var | 201 + .../docs/error/HTTP_PRECONDITION_FAILED.html.var | 205 + .../error/HTTP_REQUEST_ENTITY_TOO_LARGE.html.var | 226 + .../docs/error/HTTP_REQUEST_TIME_OUT.html.var | 217 + .../docs/error/HTTP_REQUEST_URI_TOO_LARGE.html.var | 217 + .../docs/error/HTTP_SERVICE_UNAVAILABLE.html.var | 233 + .../docs/error/HTTP_UNAUTHORIZED.html.var | 337 + .../error/HTTP_UNSUPPORTED_MEDIA_TYPE.html.var | 201 + .../docs/error/HTTP_VARIANT_ALSO_VARIES.html.var | 223 + rubbos/app/httpd-2.0.64/docs/error/README | 36 + .../app/httpd-2.0.64/docs/error/contact.html.var | 120 + .../httpd-2.0.64/docs/error/include/bottom.html | 14 + .../httpd-2.0.64/docs/error/include/spacer.html | 2 + .../app/httpd-2.0.64/docs/error/include/top.html | 24 + rubbos/app/httpd-2.0.64/docs/icons/README | 166 + rubbos/app/httpd-2.0.64/docs/icons/README.html | 815 + rubbos/app/httpd-2.0.64/docs/icons/a.gif | Bin 0 -> 246 bytes rubbos/app/httpd-2.0.64/docs/icons/a.png | Bin 0 -> 317 bytes rubbos/app/httpd-2.0.64/docs/icons/alert.black.gif | Bin 0 -> 242 bytes rubbos/app/httpd-2.0.64/docs/icons/alert.black.png | Bin 0 -> 304 bytes rubbos/app/httpd-2.0.64/docs/icons/alert.red.gif | Bin 0 -> 247 bytes rubbos/app/httpd-2.0.64/docs/icons/alert.red.png | Bin 0 -> 315 bytes rubbos/app/httpd-2.0.64/docs/icons/apache_pb.gif | Bin 0 -> 2326 bytes rubbos/app/httpd-2.0.64/docs/icons/apache_pb.png | Bin 0 -> 2089 bytes rubbos/app/httpd-2.0.64/docs/icons/apache_pb2.gif | Bin 0 -> 2414 bytes rubbos/app/httpd-2.0.64/docs/icons/apache_pb2.png | Bin 0 -> 2175 bytes .../app/httpd-2.0.64/docs/icons/apache_pb2_ani.gif | Bin 0 -> 2160 bytes rubbos/app/httpd-2.0.64/docs/icons/back.gif | Bin 0 -> 216 bytes rubbos/app/httpd-2.0.64/docs/icons/back.png | Bin 0 -> 316 bytes rubbos/app/httpd-2.0.64/docs/icons/ball.gray.gif | Bin 0 -> 233 bytes rubbos/app/httpd-2.0.64/docs/icons/ball.gray.png | Bin 0 -> 317 bytes rubbos/app/httpd-2.0.64/docs/icons/ball.red.gif | Bin 0 -> 205 bytes rubbos/app/httpd-2.0.64/docs/icons/ball.red.png | Bin 0 -> 295 bytes rubbos/app/httpd-2.0.64/docs/icons/binary.gif | Bin 0 -> 246 bytes rubbos/app/httpd-2.0.64/docs/icons/binary.png | Bin 0 -> 316 bytes rubbos/app/httpd-2.0.64/docs/icons/binhex.gif | Bin 0 -> 246 bytes rubbos/app/httpd-2.0.64/docs/icons/binhex.png | Bin 0 -> 325 bytes rubbos/app/httpd-2.0.64/docs/icons/blank.gif | Bin 0 -> 148 bytes rubbos/app/httpd-2.0.64/docs/icons/blank.png | Bin 0 -> 220 bytes rubbos/app/httpd-2.0.64/docs/icons/bomb.gif | Bin 0 -> 308 bytes rubbos/app/httpd-2.0.64/docs/icons/bomb.png | Bin 0 -> 390 bytes rubbos/app/httpd-2.0.64/docs/icons/box1.gif | Bin 0 -> 251 bytes rubbos/app/httpd-2.0.64/docs/icons/box1.png | Bin 0 -> 325 bytes rubbos/app/httpd-2.0.64/docs/icons/box2.gif | Bin 0 -> 268 bytes rubbos/app/httpd-2.0.64/docs/icons/box2.png | Bin 0 -> 336 bytes rubbos/app/httpd-2.0.64/docs/icons/broken.gif | Bin 0 -> 247 bytes rubbos/app/httpd-2.0.64/docs/icons/broken.png | Bin 0 -> 329 bytes rubbos/app/httpd-2.0.64/docs/icons/burst.gif | Bin 0 -> 235 bytes rubbos/app/httpd-2.0.64/docs/icons/burst.png | Bin 0 -> 344 bytes rubbos/app/httpd-2.0.64/docs/icons/c.gif | Bin 0 -> 242 bytes rubbos/app/httpd-2.0.64/docs/icons/c.png | Bin 0 -> 308 bytes rubbos/app/httpd-2.0.64/docs/icons/comp.blue.gif | Bin 0 -> 251 bytes rubbos/app/httpd-2.0.64/docs/icons/comp.blue.png | Bin 0 -> 330 bytes rubbos/app/httpd-2.0.64/docs/icons/comp.gray.gif | Bin 0 -> 246 bytes rubbos/app/httpd-2.0.64/docs/icons/comp.gray.png | Bin 0 -> 324 bytes rubbos/app/httpd-2.0.64/docs/icons/compressed.gif | Bin 0 -> 1038 bytes rubbos/app/httpd-2.0.64/docs/icons/compressed.png | Bin 0 -> 1108 bytes rubbos/app/httpd-2.0.64/docs/icons/continued.gif | Bin 0 -> 214 bytes rubbos/app/httpd-2.0.64/docs/icons/continued.png | Bin 0 -> 302 bytes rubbos/app/httpd-2.0.64/docs/icons/dir.gif | Bin 0 -> 225 bytes rubbos/app/httpd-2.0.64/docs/icons/dir.png | Bin 0 -> 301 bytes rubbos/app/httpd-2.0.64/docs/icons/diskimg.gif | Bin 0 -> 167 bytes rubbos/app/httpd-2.0.64/docs/icons/diskimg.png | Bin 0 -> 215 bytes rubbos/app/httpd-2.0.64/docs/icons/down.gif | Bin 0 -> 163 bytes rubbos/app/httpd-2.0.64/docs/icons/down.png | Bin 0 -> 262 bytes rubbos/app/httpd-2.0.64/docs/icons/dvi.gif | Bin 0 -> 238 bytes rubbos/app/httpd-2.0.64/docs/icons/dvi.png | Bin 0 -> 314 bytes rubbos/app/httpd-2.0.64/docs/icons/f.gif | Bin 0 -> 236 bytes rubbos/app/httpd-2.0.64/docs/icons/f.png | Bin 0 -> 305 bytes rubbos/app/httpd-2.0.64/docs/icons/folder.gif | Bin 0 -> 225 bytes rubbos/app/httpd-2.0.64/docs/icons/folder.open.gif | Bin 0 -> 242 bytes rubbos/app/httpd-2.0.64/docs/icons/folder.open.png | Bin 0 -> 335 bytes rubbos/app/httpd-2.0.64/docs/icons/folder.png | Bin 0 -> 301 bytes rubbos/app/httpd-2.0.64/docs/icons/folder.sec.gif | Bin 0 -> 243 bytes rubbos/app/httpd-2.0.64/docs/icons/folder.sec.png | Bin 0 -> 313 bytes rubbos/app/httpd-2.0.64/docs/icons/forward.gif | Bin 0 -> 219 bytes rubbos/app/httpd-2.0.64/docs/icons/forward.png | Bin 0 -> 314 bytes rubbos/app/httpd-2.0.64/docs/icons/generic.gif | Bin 0 -> 221 bytes rubbos/app/httpd-2.0.64/docs/icons/generic.png | Bin 0 -> 284 bytes rubbos/app/httpd-2.0.64/docs/icons/generic.red.gif | Bin 0 -> 220 bytes rubbos/app/httpd-2.0.64/docs/icons/generic.red.png | Bin 0 -> 286 bytes rubbos/app/httpd-2.0.64/docs/icons/generic.sec.gif | Bin 0 -> 249 bytes rubbos/app/httpd-2.0.64/docs/icons/generic.sec.png | Bin 0 -> 298 bytes rubbos/app/httpd-2.0.64/docs/icons/hand.right.gif | Bin 0 -> 217 bytes rubbos/app/httpd-2.0.64/docs/icons/hand.right.png | Bin 0 -> 322 bytes rubbos/app/httpd-2.0.64/docs/icons/hand.up.gif | Bin 0 -> 223 bytes rubbos/app/httpd-2.0.64/docs/icons/hand.up.png | Bin 0 -> 313 bytes rubbos/app/httpd-2.0.64/docs/icons/icon.sheet.gif | Bin 0 -> 11977 bytes rubbos/app/httpd-2.0.64/docs/icons/icon.sheet.png | Bin 0 -> 9018 bytes rubbos/app/httpd-2.0.64/docs/icons/image1.gif | Bin 0 -> 274 bytes rubbos/app/httpd-2.0.64/docs/icons/image1.png | Bin 0 -> 347 bytes rubbos/app/httpd-2.0.64/docs/icons/image2.gif | Bin 0 -> 309 bytes rubbos/app/httpd-2.0.64/docs/icons/image2.png | Bin 0 -> 383 bytes rubbos/app/httpd-2.0.64/docs/icons/image3.gif | Bin 0 -> 286 bytes rubbos/app/httpd-2.0.64/docs/icons/image3.png | Bin 0 -> 356 bytes rubbos/app/httpd-2.0.64/docs/icons/index.gif | Bin 0 -> 268 bytes rubbos/app/httpd-2.0.64/docs/icons/index.png | Bin 0 -> 338 bytes rubbos/app/httpd-2.0.64/docs/icons/layout.gif | Bin 0 -> 276 bytes rubbos/app/httpd-2.0.64/docs/icons/layout.png | Bin 0 -> 344 bytes rubbos/app/httpd-2.0.64/docs/icons/left.gif | Bin 0 -> 172 bytes rubbos/app/httpd-2.0.64/docs/icons/left.png | Bin 0 -> 260 bytes rubbos/app/httpd-2.0.64/docs/icons/link.gif | Bin 0 -> 249 bytes rubbos/app/httpd-2.0.64/docs/icons/link.png | Bin 0 -> 317 bytes rubbos/app/httpd-2.0.64/docs/icons/movie.gif | Bin 0 -> 243 bytes rubbos/app/httpd-2.0.64/docs/icons/movie.png | Bin 0 -> 275 bytes rubbos/app/httpd-2.0.64/docs/icons/p.gif | Bin 0 -> 237 bytes rubbos/app/httpd-2.0.64/docs/icons/p.png | Bin 0 -> 307 bytes rubbos/app/httpd-2.0.64/docs/icons/patch.gif | Bin 0 -> 251 bytes rubbos/app/httpd-2.0.64/docs/icons/patch.png | Bin 0 -> 313 bytes rubbos/app/httpd-2.0.64/docs/icons/pdf.gif | Bin 0 -> 249 bytes rubbos/app/httpd-2.0.64/docs/icons/pdf.png | Bin 0 -> 313 bytes rubbos/app/httpd-2.0.64/docs/icons/pie0.gif | Bin 0 -> 188 bytes rubbos/app/httpd-2.0.64/docs/icons/pie0.png | Bin 0 -> 262 bytes rubbos/app/httpd-2.0.64/docs/icons/pie1.gif | Bin 0 -> 198 bytes rubbos/app/httpd-2.0.64/docs/icons/pie1.png | Bin 0 -> 282 bytes rubbos/app/httpd-2.0.64/docs/icons/pie2.gif | Bin 0 -> 198 bytes rubbos/app/httpd-2.0.64/docs/icons/pie2.png | Bin 0 -> 275 bytes rubbos/app/httpd-2.0.64/docs/icons/pie3.gif | Bin 0 -> 191 bytes rubbos/app/httpd-2.0.64/docs/icons/pie3.png | Bin 0 -> 279 bytes rubbos/app/httpd-2.0.64/docs/icons/pie4.gif | Bin 0 -> 193 bytes rubbos/app/httpd-2.0.64/docs/icons/pie4.png | Bin 0 -> 261 bytes rubbos/app/httpd-2.0.64/docs/icons/pie5.gif | Bin 0 -> 189 bytes rubbos/app/httpd-2.0.64/docs/icons/pie5.png | Bin 0 -> 280 bytes rubbos/app/httpd-2.0.64/docs/icons/pie6.gif | Bin 0 -> 186 bytes rubbos/app/httpd-2.0.64/docs/icons/pie6.png | Bin 0 -> 276 bytes rubbos/app/httpd-2.0.64/docs/icons/pie7.gif | Bin 0 -> 185 bytes rubbos/app/httpd-2.0.64/docs/icons/pie7.png | Bin 0 -> 278 bytes rubbos/app/httpd-2.0.64/docs/icons/pie8.gif | Bin 0 -> 173 bytes rubbos/app/httpd-2.0.64/docs/icons/pie8.png | Bin 0 -> 262 bytes rubbos/app/httpd-2.0.64/docs/icons/portal.gif | Bin 0 -> 254 bytes rubbos/app/httpd-2.0.64/docs/icons/portal.png | Bin 0 -> 319 bytes rubbos/app/httpd-2.0.64/docs/icons/ps.gif | Bin 0 -> 244 bytes rubbos/app/httpd-2.0.64/docs/icons/ps.png | Bin 0 -> 312 bytes rubbos/app/httpd-2.0.64/docs/icons/quill.gif | Bin 0 -> 267 bytes rubbos/app/httpd-2.0.64/docs/icons/quill.png | Bin 0 -> 329 bytes rubbos/app/httpd-2.0.64/docs/icons/right.gif | Bin 0 -> 172 bytes rubbos/app/httpd-2.0.64/docs/icons/right.png | Bin 0 -> 257 bytes rubbos/app/httpd-2.0.64/docs/icons/screw1.gif | Bin 0 -> 258 bytes rubbos/app/httpd-2.0.64/docs/icons/screw1.png | Bin 0 -> 334 bytes rubbos/app/httpd-2.0.64/docs/icons/screw2.gif | Bin 0 -> 263 bytes rubbos/app/httpd-2.0.64/docs/icons/screw2.png | Bin 0 -> 339 bytes rubbos/app/httpd-2.0.64/docs/icons/script.gif | Bin 0 -> 242 bytes rubbos/app/httpd-2.0.64/docs/icons/script.png | Bin 0 -> 299 bytes rubbos/app/httpd-2.0.64/docs/icons/small/back.gif | Bin 0 -> 129 bytes rubbos/app/httpd-2.0.64/docs/icons/small/back.png | Bin 0 -> 181 bytes .../app/httpd-2.0.64/docs/icons/small/binary.gif | Bin 0 -> 134 bytes .../app/httpd-2.0.64/docs/icons/small/binary.png | Bin 0 -> 172 bytes .../app/httpd-2.0.64/docs/icons/small/binhex.gif | Bin 0 -> 131 bytes .../app/httpd-2.0.64/docs/icons/small/binhex.png | Bin 0 -> 178 bytes rubbos/app/httpd-2.0.64/docs/icons/small/blank.gif | Bin 0 -> 55 bytes rubbos/app/httpd-2.0.64/docs/icons/small/blank.png | Bin 0 -> 100 bytes .../app/httpd-2.0.64/docs/icons/small/broken.gif | Bin 0 -> 139 bytes .../app/httpd-2.0.64/docs/icons/small/broken.png | Bin 0 -> 184 bytes rubbos/app/httpd-2.0.64/docs/icons/small/burst.gif | Bin 0 -> 128 bytes rubbos/app/httpd-2.0.64/docs/icons/small/burst.png | Bin 0 -> 210 bytes rubbos/app/httpd-2.0.64/docs/icons/small/comp1.gif | Bin 0 -> 130 bytes rubbos/app/httpd-2.0.64/docs/icons/small/comp1.png | Bin 0 -> 216 bytes rubbos/app/httpd-2.0.64/docs/icons/small/comp2.gif | Bin 0 -> 131 bytes rubbos/app/httpd-2.0.64/docs/icons/small/comp2.png | Bin 0 -> 215 bytes .../httpd-2.0.64/docs/icons/small/compressed.gif | Bin 0 -> 128 bytes .../httpd-2.0.64/docs/icons/small/compressed.png | Bin 0 -> 212 bytes .../httpd-2.0.64/docs/icons/small/continued.gif | Bin 0 -> 114 bytes .../httpd-2.0.64/docs/icons/small/continued.png | Bin 0 -> 163 bytes rubbos/app/httpd-2.0.64/docs/icons/small/dir.gif | Bin 0 -> 132 bytes rubbos/app/httpd-2.0.64/docs/icons/small/dir.png | Bin 0 -> 175 bytes rubbos/app/httpd-2.0.64/docs/icons/small/dir2.gif | Bin 0 -> 122 bytes rubbos/app/httpd-2.0.64/docs/icons/small/dir2.png | Bin 0 -> 161 bytes rubbos/app/httpd-2.0.64/docs/icons/small/doc.gif | Bin 0 -> 191 bytes rubbos/app/httpd-2.0.64/docs/icons/small/doc.png | Bin 0 -> 222 bytes .../app/httpd-2.0.64/docs/icons/small/forward.gif | Bin 0 -> 125 bytes .../app/httpd-2.0.64/docs/icons/small/forward.png | Bin 0 -> 174 bytes .../app/httpd-2.0.64/docs/icons/small/generic.gif | Bin 0 -> 116 bytes .../app/httpd-2.0.64/docs/icons/small/generic.png | Bin 0 -> 149 bytes .../app/httpd-2.0.64/docs/icons/small/generic2.gif | Bin 0 -> 127 bytes .../app/httpd-2.0.64/docs/icons/small/generic2.png | Bin 0 -> 179 bytes .../app/httpd-2.0.64/docs/icons/small/generic3.gif | Bin 0 -> 113 bytes .../app/httpd-2.0.64/docs/icons/small/generic3.png | Bin 0 -> 171 bytes rubbos/app/httpd-2.0.64/docs/icons/small/image.gif | Bin 0 -> 126 bytes rubbos/app/httpd-2.0.64/docs/icons/small/image.png | Bin 0 -> 197 bytes .../app/httpd-2.0.64/docs/icons/small/image2.gif | Bin 0 -> 138 bytes .../app/httpd-2.0.64/docs/icons/small/image2.png | Bin 0 -> 203 bytes rubbos/app/httpd-2.0.64/docs/icons/small/index.gif | Bin 0 -> 145 bytes rubbos/app/httpd-2.0.64/docs/icons/small/index.png | Bin 0 -> 225 bytes rubbos/app/httpd-2.0.64/docs/icons/small/key.gif | Bin 0 -> 187 bytes rubbos/app/httpd-2.0.64/docs/icons/small/key.png | Bin 0 -> 210 bytes rubbos/app/httpd-2.0.64/docs/icons/small/movie.gif | Bin 0 -> 134 bytes rubbos/app/httpd-2.0.64/docs/icons/small/movie.png | Bin 0 -> 159 bytes rubbos/app/httpd-2.0.64/docs/icons/small/patch.gif | Bin 0 -> 182 bytes rubbos/app/httpd-2.0.64/docs/icons/small/patch.png | Bin 0 -> 211 bytes rubbos/app/httpd-2.0.64/docs/icons/small/ps.gif | Bin 0 -> 184 bytes rubbos/app/httpd-2.0.64/docs/icons/small/ps.png | Bin 0 -> 217 bytes .../app/httpd-2.0.64/docs/icons/small/rainbow.gif | Bin 0 -> 3811 bytes .../app/httpd-2.0.64/docs/icons/small/rainbow.png | Bin 0 -> 2427 bytes rubbos/app/httpd-2.0.64/docs/icons/small/sound.gif | Bin 0 -> 130 bytes rubbos/app/httpd-2.0.64/docs/icons/small/sound.png | Bin 0 -> 197 bytes .../app/httpd-2.0.64/docs/icons/small/sound2.gif | Bin 0 -> 119 bytes .../app/httpd-2.0.64/docs/icons/small/sound2.png | Bin 0 -> 171 bytes rubbos/app/httpd-2.0.64/docs/icons/small/tar.gif | Bin 0 -> 132 bytes rubbos/app/httpd-2.0.64/docs/icons/small/tar.png | Bin 0 -> 173 bytes rubbos/app/httpd-2.0.64/docs/icons/small/text.gif | Bin 0 -> 128 bytes rubbos/app/httpd-2.0.64/docs/icons/small/text.png | Bin 0 -> 163 bytes .../app/httpd-2.0.64/docs/icons/small/transfer.gif | Bin 0 -> 124 bytes .../app/httpd-2.0.64/docs/icons/small/transfer.png | Bin 0 -> 211 bytes .../app/httpd-2.0.64/docs/icons/small/unknown.gif | Bin 0 -> 131 bytes .../app/httpd-2.0.64/docs/icons/small/unknown.png | Bin 0 -> 172 bytes rubbos/app/httpd-2.0.64/docs/icons/small/uu.gif | Bin 0 -> 125 bytes rubbos/app/httpd-2.0.64/docs/icons/small/uu.png | Bin 0 -> 166 bytes rubbos/app/httpd-2.0.64/docs/icons/sound1.gif | Bin 0 -> 248 bytes rubbos/app/httpd-2.0.64/docs/icons/sound1.png | Bin 0 -> 331 bytes rubbos/app/httpd-2.0.64/docs/icons/sound2.gif | Bin 0 -> 221 bytes rubbos/app/httpd-2.0.64/docs/icons/sound2.png | Bin 0 -> 319 bytes rubbos/app/httpd-2.0.64/docs/icons/sphere1.gif | Bin 0 -> 285 bytes rubbos/app/httpd-2.0.64/docs/icons/sphere1.png | Bin 0 -> 368 bytes rubbos/app/httpd-2.0.64/docs/icons/sphere2.gif | Bin 0 -> 264 bytes rubbos/app/httpd-2.0.64/docs/icons/sphere2.png | Bin 0 -> 339 bytes rubbos/app/httpd-2.0.64/docs/icons/tar.gif | Bin 0 -> 219 bytes rubbos/app/httpd-2.0.64/docs/icons/tar.png | Bin 0 -> 270 bytes rubbos/app/httpd-2.0.64/docs/icons/tex.gif | Bin 0 -> 251 bytes rubbos/app/httpd-2.0.64/docs/icons/tex.png | Bin 0 -> 319 bytes rubbos/app/httpd-2.0.64/docs/icons/text.gif | Bin 0 -> 229 bytes rubbos/app/httpd-2.0.64/docs/icons/text.png | Bin 0 -> 298 bytes rubbos/app/httpd-2.0.64/docs/icons/transfer.gif | Bin 0 -> 242 bytes rubbos/app/httpd-2.0.64/docs/icons/transfer.png | Bin 0 -> 337 bytes rubbos/app/httpd-2.0.64/docs/icons/unknown.gif | Bin 0 -> 245 bytes rubbos/app/httpd-2.0.64/docs/icons/unknown.png | Bin 0 -> 316 bytes rubbos/app/httpd-2.0.64/docs/icons/up.gif | Bin 0 -> 164 bytes rubbos/app/httpd-2.0.64/docs/icons/up.png | Bin 0 -> 261 bytes rubbos/app/httpd-2.0.64/docs/icons/uu.gif | Bin 0 -> 236 bytes rubbos/app/httpd-2.0.64/docs/icons/uu.png | Bin 0 -> 305 bytes rubbos/app/httpd-2.0.64/docs/icons/uuencoded.gif | Bin 0 -> 236 bytes rubbos/app/httpd-2.0.64/docs/icons/uuencoded.png | Bin 0 -> 305 bytes rubbos/app/httpd-2.0.64/docs/icons/world1.gif | Bin 0 -> 228 bytes rubbos/app/httpd-2.0.64/docs/icons/world1.png | Bin 0 -> 332 bytes rubbos/app/httpd-2.0.64/docs/icons/world2.gif | Bin 0 -> 261 bytes rubbos/app/httpd-2.0.64/docs/icons/world2.png | Bin 0 -> 366 bytes rubbos/app/httpd-2.0.64/docs/man/ab.8 | 125 + rubbos/app/httpd-2.0.64/docs/man/apachectl.8 | 92 + rubbos/app/httpd-2.0.64/docs/man/apxs.8 | 255 + rubbos/app/httpd-2.0.64/docs/man/dbmmanage.1 | 118 + rubbos/app/httpd-2.0.64/docs/man/htdbm.1 | 169 + rubbos/app/httpd-2.0.64/docs/man/htdigest.1 | 57 + rubbos/app/httpd-2.0.64/docs/man/htpasswd.1 | 146 + rubbos/app/httpd-2.0.64/docs/man/httpd.8 | 116 + rubbos/app/httpd-2.0.64/docs/man/logresolve.8 | 51 + rubbos/app/httpd-2.0.64/docs/man/rotatelogs.8 | 133 + rubbos/app/httpd-2.0.64/docs/man/suexec.8 | 48 + rubbos/app/httpd-2.0.64/docs/man/tr/ab.8 | 125 + rubbos/app/httpd-2.0.64/docs/man/tr/apachectl.8 | 92 + rubbos/app/httpd-2.0.64/docs/man/tr/apxs.8 | 255 + rubbos/app/httpd-2.0.64/docs/man/tr/dbmmanage.1 | 118 + rubbos/app/httpd-2.0.64/docs/man/tr/htdbm.1 | 169 + rubbos/app/httpd-2.0.64/docs/man/tr/htdigest.1 | 57 + rubbos/app/httpd-2.0.64/docs/man/tr/htpasswd.1 | 143 + rubbos/app/httpd-2.0.64/docs/man/tr/httpd.8 | 116 + rubbos/app/httpd-2.0.64/docs/man/tr/logresolve.8 | 51 + rubbos/app/httpd-2.0.64/docs/man/tr/rotatelogs.8 | 144 + rubbos/app/httpd-2.0.64/docs/man/tr/suexec.8 | 48 + rubbos/app/httpd-2.0.64/docs/manual/LICENSE | 202 + rubbos/app/httpd-2.0.64/docs/manual/bind.html | 25 + rubbos/app/httpd-2.0.64/docs/manual/bind.html.en | 177 + rubbos/app/httpd-2.0.64/docs/manual/bind.html.es | 187 + rubbos/app/httpd-2.0.64/docs/manual/bind.html.fr | 194 + .../app/httpd-2.0.64/docs/manual/bind.html.ja.utf8 | 193 + .../httpd-2.0.64/docs/manual/bind.html.ko.euc-kr | 163 + .../app/httpd-2.0.64/docs/manual/bind.html.tr.utf8 | 172 + .../app/httpd-2.0.64/docs/manual/configuring.html | 25 + .../httpd-2.0.64/docs/manual/configuring.html.de | 190 + .../httpd-2.0.64/docs/manual/configuring.html.en | 171 + .../httpd-2.0.64/docs/manual/configuring.html.fr | 185 + .../docs/manual/configuring.html.ja.utf8 | 175 + .../docs/manual/configuring.html.ko.euc-kr | 156 + .../docs/manual/configuring.html.tr.utf8 | 101 + .../docs/manual/content-negotiation.html | 21 + .../docs/manual/content-negotiation.html.en | 666 + .../docs/manual/content-negotiation.html.fr | 715 + .../docs/manual/content-negotiation.html.ja.utf8 | 725 + .../docs/manual/content-negotiation.html.ko.euc-kr | 608 + .../docs/manual/content-negotiation.html.tr.utf8 | 640 + .../app/httpd-2.0.64/docs/manual/custom-error.html | 25 + .../httpd-2.0.64/docs/manual/custom-error.html.en | 208 + .../httpd-2.0.64/docs/manual/custom-error.html.es | 223 + .../httpd-2.0.64/docs/manual/custom-error.html.fr | 215 + .../docs/manual/custom-error.html.ja.utf8 | 201 + .../docs/manual/custom-error.html.ko.euc-kr | 202 + .../docs/manual/custom-error.html.tr.utf8 | 205 + .../httpd-2.0.64/docs/manual/developer/API.html | 5 + .../httpd-2.0.64/docs/manual/developer/API.html.en | 1223 + .../docs/manual/developer/debugging.html | 5 + .../docs/manual/developer/debugging.html.en | 196 + .../docs/manual/developer/documenting.html | 5 + .../docs/manual/developer/documenting.html.en | 84 + .../docs/manual/developer/filters.html | 5 + .../docs/manual/developer/filters.html.en | 210 + .../httpd-2.0.64/docs/manual/developer/hooks.html | 5 + .../docs/manual/developer/hooks.html.en | 239 + .../httpd-2.0.64/docs/manual/developer/index.html | 5 + .../docs/manual/developer/index.html.en | 73 + .../docs/manual/developer/modules.html | 9 + .../docs/manual/developer/modules.html.en | 273 + .../docs/manual/developer/modules.html.ja.utf8 | 274 + .../docs/manual/developer/request.html | 5 + .../docs/manual/developer/request.html.en | 260 + .../docs/manual/developer/thread_safety.html | 5 + .../docs/manual/developer/thread_safety.html.en | 285 + .../app/httpd-2.0.64/docs/manual/dns-caveats.html | 25 + .../httpd-2.0.64/docs/manual/dns-caveats.html.en | 245 + .../httpd-2.0.64/docs/manual/dns-caveats.html.es | 268 + .../httpd-2.0.64/docs/manual/dns-caveats.html.fr | 255 + .../docs/manual/dns-caveats.html.ja.utf8 | 249 + .../docs/manual/dns-caveats.html.ko.euc-kr | 229 + .../docs/manual/dns-caveats.html.tr.utf8 | 239 + rubbos/app/httpd-2.0.64/docs/manual/dso.html | 25 + rubbos/app/httpd-2.0.64/docs/manual/dso.html.en | 318 + rubbos/app/httpd-2.0.64/docs/manual/dso.html.es | 375 + rubbos/app/httpd-2.0.64/docs/manual/dso.html.fr | 322 + .../app/httpd-2.0.64/docs/manual/dso.html.ja.utf8 | 301 + .../httpd-2.0.64/docs/manual/dso.html.ko.euc-kr | 282 + .../app/httpd-2.0.64/docs/manual/dso.html.tr.utf8 | 312 + rubbos/app/httpd-2.0.64/docs/manual/env.html | 25 + rubbos/app/httpd-2.0.64/docs/manual/env.html.en | 417 + rubbos/app/httpd-2.0.64/docs/manual/env.html.es | 440 + rubbos/app/httpd-2.0.64/docs/manual/env.html.fr | 425 + .../app/httpd-2.0.64/docs/manual/env.html.ja.utf8 | 391 + .../httpd-2.0.64/docs/manual/env.html.ko.euc-kr | 370 + .../app/httpd-2.0.64/docs/manual/env.html.tr.utf8 | 413 + .../httpd-2.0.64/docs/manual/faq/all_in_one.html | 13 + .../docs/manual/faq/all_in_one.html.en | 206 + .../docs/manual/faq/all_in_one.html.ko.euc-kr | 207 + .../docs/manual/faq/all_in_one.html.tr.utf8 | 209 + rubbos/app/httpd-2.0.64/docs/manual/faq/error.html | 13 + .../app/httpd-2.0.64/docs/manual/faq/error.html.en | 85 + .../docs/manual/faq/error.html.ko.euc-kr | 84 + .../docs/manual/faq/error.html.tr.utf8 | 84 + rubbos/app/httpd-2.0.64/docs/manual/faq/index.html | 13 + .../app/httpd-2.0.64/docs/manual/faq/index.html.en | 49 + .../docs/manual/faq/index.html.ko.euc-kr | 47 + .../docs/manual/faq/index.html.tr.utf8 | 49 + .../app/httpd-2.0.64/docs/manual/faq/support.html | 13 + .../httpd-2.0.64/docs/manual/faq/support.html.en | 138 + .../docs/manual/faq/support.html.ko.euc-kr | 142 + .../docs/manual/faq/support.html.tr.utf8 | 142 + rubbos/app/httpd-2.0.64/docs/manual/filter.html | 29 + rubbos/app/httpd-2.0.64/docs/manual/filter.html.en | 84 + rubbos/app/httpd-2.0.64/docs/manual/filter.html.es | 81 + rubbos/app/httpd-2.0.64/docs/manual/filter.html.fr | 89 + .../httpd-2.0.64/docs/manual/filter.html.ja.utf8 | 84 + .../httpd-2.0.64/docs/manual/filter.html.ko.euc-kr | 82 + .../httpd-2.0.64/docs/manual/filter.html.ru.koi8-r | 85 + .../httpd-2.0.64/docs/manual/filter.html.tr.utf8 | 82 + rubbos/app/httpd-2.0.64/docs/manual/glossary.html | 21 + .../app/httpd-2.0.64/docs/manual/glossary.html.de | 544 + .../app/httpd-2.0.64/docs/manual/glossary.html.en | 449 + .../app/httpd-2.0.64/docs/manual/glossary.html.es | 397 + .../docs/manual/glossary.html.ko.euc-kr | 366 + .../httpd-2.0.64/docs/manual/glossary.html.tr.utf8 | 460 + rubbos/app/httpd-2.0.64/docs/manual/handler.html | 29 + .../app/httpd-2.0.64/docs/manual/handler.html.en | 159 + .../app/httpd-2.0.64/docs/manual/handler.html.es | 168 + .../app/httpd-2.0.64/docs/manual/handler.html.fr | 168 + .../httpd-2.0.64/docs/manual/handler.html.ja.utf8 | 163 + .../docs/manual/handler.html.ko.euc-kr | 153 + .../docs/manual/handler.html.ru.koi8-r | 168 + .../httpd-2.0.64/docs/manual/handler.html.tr.utf8 | 157 + .../app/httpd-2.0.64/docs/manual/howto/auth.html | 17 + .../httpd-2.0.64/docs/manual/howto/auth.html.en | 355 + .../httpd-2.0.64/docs/manual/howto/auth.html.es | 374 + .../docs/manual/howto/auth.html.ja.utf8 | 388 + .../docs/manual/howto/auth.html.ko.euc-kr | 325 + rubbos/app/httpd-2.0.64/docs/manual/howto/cgi.html | 13 + .../app/httpd-2.0.64/docs/manual/howto/cgi.html.en | 555 + .../docs/manual/howto/cgi.html.ja.utf8 | 546 + .../docs/manual/howto/cgi.html.ko.euc-kr | 503 + .../httpd-2.0.64/docs/manual/howto/htaccess.html | 13 + .../docs/manual/howto/htaccess.html.en | 386 + .../docs/manual/howto/htaccess.html.ja.utf8 | 347 + .../docs/manual/howto/htaccess.html.ko.euc-kr | 334 + .../app/httpd-2.0.64/docs/manual/howto/index.html | 13 + .../httpd-2.0.64/docs/manual/howto/index.html.en | 105 + .../docs/manual/howto/index.html.ja.utf8 | 102 + .../docs/manual/howto/index.html.ko.euc-kr | 107 + .../docs/manual/howto/public_html.html | 17 + .../docs/manual/howto/public_html.html.en | 163 + .../docs/manual/howto/public_html.html.ja.utf8 | 157 + .../docs/manual/howto/public_html.html.ko.euc-kr | 158 + .../docs/manual/howto/public_html.html.tr.utf8 | 167 + rubbos/app/httpd-2.0.64/docs/manual/howto/ssi.html | 13 + .../app/httpd-2.0.64/docs/manual/howto/ssi.html.en | 486 + .../docs/manual/howto/ssi.html.ja.utf8 | 481 + .../docs/manual/howto/ssi.html.ko.euc-kr | 426 + .../docs/manual/images/apache_header.gif | Bin 0 -> 4084 bytes .../docs/manual/images/custom_errordocs.gif | Bin 0 -> 23291 bytes .../docs/manual/images/custom_errordocs.png | Bin 0 -> 22907 bytes .../app/httpd-2.0.64/docs/manual/images/down.gif | Bin 0 -> 56 bytes .../httpd-2.0.64/docs/manual/images/favicon.ico | Bin 0 -> 1078 bytes .../httpd-2.0.64/docs/manual/images/feather.gif | Bin 0 -> 6471 bytes .../httpd-2.0.64/docs/manual/images/feather.png | Bin 0 -> 6345 bytes .../app/httpd-2.0.64/docs/manual/images/home.gif | Bin 0 -> 1465 bytes .../app/httpd-2.0.64/docs/manual/images/index.gif | Bin 0 -> 1540 bytes .../app/httpd-2.0.64/docs/manual/images/left.gif | Bin 0 -> 60 bytes .../docs/manual/images/mod_rewrite_fig1.gif | Bin 0 -> 3525 bytes .../docs/manual/images/mod_rewrite_fig1.png | Bin 0 -> 5597 bytes .../docs/manual/images/mod_rewrite_fig2.gif | Bin 0 -> 2553 bytes .../docs/manual/images/mod_rewrite_fig2.png | Bin 0 -> 4144 bytes .../app/httpd-2.0.64/docs/manual/images/pixel.gif | Bin 0 -> 61 bytes .../app/httpd-2.0.64/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 -> 7325 bytes .../docs/manual/images/ssl_intro_fig2.gif | Bin 0 -> 2700 bytes .../docs/manual/images/ssl_intro_fig2.png | Bin 0 -> 3190 bytes .../docs/manual/images/ssl_intro_fig3.gif | Bin 0 -> 4020 bytes .../docs/manual/images/ssl_intro_fig3.png | Bin 0 -> 5487 bytes rubbos/app/httpd-2.0.64/docs/manual/images/sub.gif | Bin 0 -> 6083 bytes rubbos/app/httpd-2.0.64/docs/manual/images/up.gif | Bin 0 -> 57 bytes rubbos/app/httpd-2.0.64/docs/manual/index.html | 33 + rubbos/app/httpd-2.0.64/docs/manual/index.html.de | 104 + rubbos/app/httpd-2.0.64/docs/manual/index.html.en | 103 + rubbos/app/httpd-2.0.64/docs/manual/index.html.es | 108 + rubbos/app/httpd-2.0.64/docs/manual/index.html.fr | 103 + .../httpd-2.0.64/docs/manual/index.html.ja.utf8 | 101 + .../httpd-2.0.64/docs/manual/index.html.ko.euc-kr | 101 + .../httpd-2.0.64/docs/manual/index.html.ru.koi8-r | 103 + .../httpd-2.0.64/docs/manual/index.html.tr.utf8 | 101 + rubbos/app/httpd-2.0.64/docs/manual/install.html | 29 + .../app/httpd-2.0.64/docs/manual/install.html.de | 406 + .../app/httpd-2.0.64/docs/manual/install.html.en | 386 + .../app/httpd-2.0.64/docs/manual/install.html.es | 446 + .../httpd-2.0.64/docs/manual/install.html.ja.utf8 | 396 + .../docs/manual/install.html.ko.euc-kr | 363 + .../docs/manual/install.html.ru.koi8-r | 406 + .../httpd-2.0.64/docs/manual/install.html.tr.utf8 | 380 + rubbos/app/httpd-2.0.64/docs/manual/invoking.html | 29 + .../app/httpd-2.0.64/docs/manual/invoking.html.de | 158 + .../app/httpd-2.0.64/docs/manual/invoking.html.en | 153 + .../app/httpd-2.0.64/docs/manual/invoking.html.es | 170 + .../httpd-2.0.64/docs/manual/invoking.html.ja.utf8 | 166 + .../docs/manual/invoking.html.ko.euc-kr | 142 + .../docs/manual/invoking.html.ru.koi8-r | 145 + .../httpd-2.0.64/docs/manual/invoking.html.tr.utf8 | 149 + rubbos/app/httpd-2.0.64/docs/manual/license.html | 5 + .../app/httpd-2.0.64/docs/manual/license.html.en | 238 + rubbos/app/httpd-2.0.64/docs/manual/logs.html | 21 + rubbos/app/httpd-2.0.64/docs/manual/logs.html.en | 587 + rubbos/app/httpd-2.0.64/docs/manual/logs.html.es | 644 + .../app/httpd-2.0.64/docs/manual/logs.html.ja.utf8 | 557 + .../httpd-2.0.64/docs/manual/logs.html.ko.euc-kr | 525 + .../app/httpd-2.0.64/docs/manual/logs.html.tr.utf8 | 557 + .../docs/manual/misc/custom_errordocs.html | 5 + .../docs/manual/misc/custom_errordocs.html.en | 577 + .../httpd-2.0.64/docs/manual/misc/descriptors.html | 5 + .../docs/manual/misc/descriptors.html.en | 233 + .../httpd-2.0.64/docs/manual/misc/fin_wait_2.html | 5 + .../docs/manual/misc/fin_wait_2.html.en | 422 + .../app/httpd-2.0.64/docs/manual/misc/index.html | 9 + .../httpd-2.0.64/docs/manual/misc/index.html.en | 121 + .../docs/manual/misc/index.html.tr.utf8 | 122 + .../docs/manual/misc/known_client_problems.html | 5 + .../docs/manual/misc/known_client_problems.html.en | 408 + .../httpd-2.0.64/docs/manual/misc/perf-tuning.html | 13 + .../docs/manual/misc/perf-tuning.html.en | 1058 + .../docs/manual/misc/perf-tuning.html.ko.euc-kr | 978 + .../docs/manual/misc/perf-tuning.html.tr.utf8 | 1100 + .../docs/manual/misc/relevant_standards.html | 9 + .../docs/manual/misc/relevant_standards.html.en | 199 + .../manual/misc/relevant_standards.html.ko.euc-kr | 191 + .../docs/manual/misc/rewriteguide.html | 9 + .../docs/manual/misc/rewriteguide.html.en | 2110 + .../docs/manual/misc/rewriteguide.html.ko.euc-kr | 2013 + .../docs/manual/misc/security_tips.html | 13 + .../docs/manual/misc/security_tips.html.en | 354 + .../docs/manual/misc/security_tips.html.ko.euc-kr | 345 + .../docs/manual/misc/security_tips.html.tr.utf8 | 344 + .../httpd-2.0.64/docs/manual/misc/tutorials.html | 5 + .../docs/manual/misc/tutorials.html.en | 211 + rubbos/app/httpd-2.0.64/docs/manual/mod/beos.html | 17 + .../app/httpd-2.0.64/docs/manual/mod/beos.html.de | 109 + .../app/httpd-2.0.64/docs/manual/mod/beos.html.en | 107 + .../app/httpd-2.0.64/docs/manual/mod/beos.html.es | 115 + .../docs/manual/mod/beos.html.ko.euc-kr | 105 + rubbos/app/httpd-2.0.64/docs/manual/mod/core.html | 21 + .../app/httpd-2.0.64/docs/manual/mod/core.html.de | 3422 ++ .../app/httpd-2.0.64/docs/manual/mod/core.html.en | 3250 ++ .../app/httpd-2.0.64/docs/manual/mod/core.html.es | 3421 ++ .../httpd-2.0.64/docs/manual/mod/core.html.ja.utf8 | 3203 ++ .../httpd-2.0.64/docs/manual/mod/core.html.tr.utf8 | 3177 ++ .../docs/manual/mod/directive-dict.html | 21 + .../docs/manual/mod/directive-dict.html.en | 297 + .../docs/manual/mod/directive-dict.html.es | 307 + .../docs/manual/mod/directive-dict.html.ja.utf8 | 304 + .../docs/manual/mod/directive-dict.html.ko.euc-kr | 256 + .../docs/manual/mod/directive-dict.html.tr.utf8 | 176 + .../httpd-2.0.64/docs/manual/mod/directives.html | 29 + .../docs/manual/mod/directives.html.de | 416 + .../docs/manual/mod/directives.html.en | 417 + .../docs/manual/mod/directives.html.es | 417 + .../docs/manual/mod/directives.html.ja.utf8 | 411 + .../docs/manual/mod/directives.html.ko.euc-kr | 412 + .../docs/manual/mod/directives.html.ru.koi8-r | 416 + .../docs/manual/mod/directives.html.tr.utf8 | 413 + rubbos/app/httpd-2.0.64/docs/manual/mod/index.html | 25 + .../app/httpd-2.0.64/docs/manual/mod/index.html.de | 183 + .../app/httpd-2.0.64/docs/manual/mod/index.html.en | 181 + .../app/httpd-2.0.64/docs/manual/mod/index.html.es | 185 + .../docs/manual/mod/index.html.ja.utf8 | 172 + .../docs/manual/mod/index.html.ko.euc-kr | 163 + .../docs/manual/mod/index.html.tr.utf8 | 174 + .../app/httpd-2.0.64/docs/manual/mod/leader.html | 17 + .../httpd-2.0.64/docs/manual/mod/leader.html.de | 97 + .../httpd-2.0.64/docs/manual/mod/leader.html.en | 93 + .../httpd-2.0.64/docs/manual/mod/leader.html.es | 102 + .../docs/manual/mod/leader.html.ko.euc-kr | 92 + .../httpd-2.0.64/docs/manual/mod/mod_access.html | 9 + .../docs/manual/mod/mod_access.html.en | 372 + .../docs/manual/mod/mod_access.html.ja.utf8 | 348 + .../httpd-2.0.64/docs/manual/mod/mod_actions.html | 13 + .../docs/manual/mod/mod_actions.html.en | 145 + .../docs/manual/mod/mod_actions.html.ja.utf8 | 150 + .../docs/manual/mod/mod_actions.html.ko.euc-kr | 140 + .../httpd-2.0.64/docs/manual/mod/mod_alias.html | 17 + .../httpd-2.0.64/docs/manual/mod/mod_alias.html.en | 430 + .../docs/manual/mod/mod_alias.html.ja.utf8 | 389 + .../docs/manual/mod/mod_alias.html.ko.euc-kr | 358 + .../docs/manual/mod/mod_alias.html.tr.utf8 | 430 + .../app/httpd-2.0.64/docs/manual/mod/mod_asis.html | 13 + .../httpd-2.0.64/docs/manual/mod/mod_asis.html.en | 112 + .../docs/manual/mod/mod_asis.html.ja.utf8 | 112 + .../docs/manual/mod/mod_asis.html.ko.euc-kr | 110 + .../app/httpd-2.0.64/docs/manual/mod/mod_auth.html | 9 + .../httpd-2.0.64/docs/manual/mod/mod_auth.html.en | 201 + .../docs/manual/mod/mod_auth.html.ja.utf8 | 226 + .../docs/manual/mod/mod_auth_anon.html | 5 + .../docs/manual/mod/mod_auth_anon.html.en | 240 + .../httpd-2.0.64/docs/manual/mod/mod_auth_dbm.html | 5 + .../docs/manual/mod/mod_auth_dbm.html.en | 228 + .../docs/manual/mod/mod_auth_digest.html | 9 + .../docs/manual/mod/mod_auth_digest.html.en | 358 + .../docs/manual/mod/mod_auth_digest.html.ko.euc-kr | 344 + .../docs/manual/mod/mod_auth_ldap.html | 5 + .../docs/manual/mod/mod_auth_ldap.html.en | 891 + .../docs/manual/mod/mod_autoindex.html | 17 + .../docs/manual/mod/mod_autoindex.html.en | 897 + .../docs/manual/mod/mod_autoindex.html.ja.utf8 | 963 + .../docs/manual/mod/mod_autoindex.html.ko.euc-kr | 817 + .../docs/manual/mod/mod_autoindex.html.tr.utf8 | 889 + .../httpd-2.0.64/docs/manual/mod/mod_cache.html | 9 + .../httpd-2.0.64/docs/manual/mod/mod_cache.html.en | 387 + .../docs/manual/mod/mod_cache.html.ko.euc-kr | 323 + .../docs/manual/mod/mod_cern_meta.html | 9 + .../docs/manual/mod/mod_cern_meta.html.en | 128 + .../docs/manual/mod/mod_cern_meta.html.ko.euc-kr | 120 + .../app/httpd-2.0.64/docs/manual/mod/mod_cgi.html | 13 + .../httpd-2.0.64/docs/manual/mod/mod_cgi.html.en | 246 + .../docs/manual/mod/mod_cgi.html.ja.utf8 | 254 + .../docs/manual/mod/mod_cgi.html.ko.euc-kr | 232 + .../app/httpd-2.0.64/docs/manual/mod/mod_cgid.html | 13 + .../httpd-2.0.64/docs/manual/mod/mod_cgid.html.en | 104 + .../docs/manual/mod/mod_cgid.html.ja.utf8 | 98 + .../docs/manual/mod/mod_cgid.html.ko.euc-kr | 97 + .../docs/manual/mod/mod_charset_lite.html | 9 + .../docs/manual/mod/mod_charset_lite.html.en | 209 + .../manual/mod/mod_charset_lite.html.ko.euc-kr | 196 + .../app/httpd-2.0.64/docs/manual/mod/mod_dav.html | 13 + .../httpd-2.0.64/docs/manual/mod/mod_dav.html.en | 268 + .../docs/manual/mod/mod_dav.html.ja.utf8 | 274 + .../docs/manual/mod/mod_dav.html.ko.euc-kr | 263 + .../httpd-2.0.64/docs/manual/mod/mod_dav_fs.html | 13 + .../docs/manual/mod/mod_dav_fs.html.en | 97 + .../docs/manual/mod/mod_dav_fs.html.ja.utf8 | 89 + .../docs/manual/mod/mod_dav_fs.html.ko.euc-kr | 96 + .../httpd-2.0.64/docs/manual/mod/mod_deflate.html | 13 + .../docs/manual/mod/mod_deflate.html.en | 356 + .../docs/manual/mod/mod_deflate.html.ja.utf8 | 357 + .../docs/manual/mod/mod_deflate.html.ko.euc-kr | 341 + .../app/httpd-2.0.64/docs/manual/mod/mod_dir.html | 17 + .../httpd-2.0.64/docs/manual/mod/mod_dir.html.en | 171 + .../docs/manual/mod/mod_dir.html.ja.utf8 | 184 + .../docs/manual/mod/mod_dir.html.ko.euc-kr | 171 + .../docs/manual/mod/mod_dir.html.tr.utf8 | 170 + .../docs/manual/mod/mod_disk_cache.html | 9 + .../docs/manual/mod/mod_disk_cache.html.en | 368 + .../docs/manual/mod/mod_disk_cache.html.ko.euc-kr | 355 + .../httpd-2.0.64/docs/manual/mod/mod_dumpio.html | 5 + .../docs/manual/mod/mod_dumpio.html.en | 106 + .../app/httpd-2.0.64/docs/manual/mod/mod_echo.html | 13 + .../httpd-2.0.64/docs/manual/mod/mod_echo.html.en | 74 + .../docs/manual/mod/mod_echo.html.ja.utf8 | 74 + .../docs/manual/mod/mod_echo.html.ko.euc-kr | 73 + .../app/httpd-2.0.64/docs/manual/mod/mod_env.html | 17 + .../httpd-2.0.64/docs/manual/mod/mod_env.html.en | 119 + .../docs/manual/mod/mod_env.html.ja.utf8 | 121 + .../docs/manual/mod/mod_env.html.ko.euc-kr | 116 + .../docs/manual/mod/mod_env.html.tr.utf8 | 117 + .../httpd-2.0.64/docs/manual/mod/mod_example.html | 9 + .../docs/manual/mod/mod_example.html.en | 154 + .../docs/manual/mod/mod_example.html.ko.euc-kr | 145 + .../httpd-2.0.64/docs/manual/mod/mod_expires.html | 13 + .../docs/manual/mod/mod_expires.html.en | 247 + .../docs/manual/mod/mod_expires.html.ja.utf8 | 233 + .../docs/manual/mod/mod_expires.html.ko.euc-kr | 225 + .../docs/manual/mod/mod_ext_filter.html | 9 + .../docs/manual/mod/mod_ext_filter.html.en | 373 + .../docs/manual/mod/mod_ext_filter.html.ko.euc-kr | 350 + .../docs/manual/mod/mod_file_cache.html | 9 + .../docs/manual/mod/mod_file_cache.html.en | 212 + .../docs/manual/mod/mod_file_cache.html.ko.euc-kr | 200 + .../httpd-2.0.64/docs/manual/mod/mod_headers.html | 9 + .../docs/manual/mod/mod_headers.html.en | 323 + .../docs/manual/mod/mod_headers.html.ko.euc-kr | 299 + .../app/httpd-2.0.64/docs/manual/mod/mod_imap.html | 9 + .../httpd-2.0.64/docs/manual/mod/mod_imap.html.en | 382 + .../docs/manual/mod/mod_imap.html.ko.euc-kr | 361 + .../httpd-2.0.64/docs/manual/mod/mod_include.html | 9 + .../docs/manual/mod/mod_include.html.en | 785 + .../docs/manual/mod/mod_include.html.ja.utf8 | 762 + .../app/httpd-2.0.64/docs/manual/mod/mod_info.html | 13 + .../httpd-2.0.64/docs/manual/mod/mod_info.html.en | 128 + .../docs/manual/mod/mod_info.html.ja.utf8 | 118 + .../docs/manual/mod/mod_info.html.ko.euc-kr | 112 + .../httpd-2.0.64/docs/manual/mod/mod_isapi.html | 9 + .../httpd-2.0.64/docs/manual/mod/mod_isapi.html.en | 343 + .../docs/manual/mod/mod_isapi.html.ko.euc-kr | 319 + .../app/httpd-2.0.64/docs/manual/mod/mod_ldap.html | 5 + .../httpd-2.0.64/docs/manual/mod/mod_ldap.html.en | 390 + .../docs/manual/mod/mod_log_config.html | 17 + .../docs/manual/mod/mod_log_config.html.en | 472 + .../docs/manual/mod/mod_log_config.html.ja.utf8 | 435 + .../docs/manual/mod/mod_log_config.html.ko.euc-kr | 403 + .../docs/manual/mod/mod_log_config.html.tr.utf8 | 466 + .../docs/manual/mod/mod_log_forensic.html | 9 + .../docs/manual/mod/mod_log_forensic.html.en | 171 + .../docs/manual/mod/mod_log_forensic.html.tr.utf8 | 172 + .../httpd-2.0.64/docs/manual/mod/mod_logio.html | 17 + .../httpd-2.0.64/docs/manual/mod/mod_logio.html.en | 92 + .../docs/manual/mod/mod_logio.html.ja.utf8 | 93 + .../docs/manual/mod/mod_logio.html.ko.euc-kr | 94 + .../docs/manual/mod/mod_logio.html.tr.utf8 | 92 + .../docs/manual/mod/mod_mem_cache.html | 13 + .../docs/manual/mod/mod_mem_cache.html.en | 241 + .../docs/manual/mod/mod_mem_cache.html.ja.utf8 | 238 + .../docs/manual/mod/mod_mem_cache.html.ko.euc-kr | 235 + .../app/httpd-2.0.64/docs/manual/mod/mod_mime.html | 9 + .../httpd-2.0.64/docs/manual/mod/mod_mime.html.en | 940 + .../docs/manual/mod/mod_mime.html.ja.utf8 | 938 + .../docs/manual/mod/mod_mime_magic.html | 5 + .../docs/manual/mod/mod_mime_magic.html.en | 274 + .../docs/manual/mod/mod_negotiation.html | 9 + .../docs/manual/mod/mod_negotiation.html.en | 306 + .../docs/manual/mod/mod_negotiation.html.ja.utf8 | 302 + .../httpd-2.0.64/docs/manual/mod/mod_nw_ssl.html | 5 + .../docs/manual/mod/mod_nw_ssl.html.en | 97 + .../httpd-2.0.64/docs/manual/mod/mod_proxy.html | 5 + .../httpd-2.0.64/docs/manual/mod/mod_proxy.html.en | 1016 + .../docs/manual/mod/mod_proxy_connect.html | 5 + .../docs/manual/mod/mod_proxy_connect.html.en | 61 + .../docs/manual/mod/mod_proxy_ftp.html | 5 + .../docs/manual/mod/mod_proxy_ftp.html.en | 59 + .../docs/manual/mod/mod_proxy_http.html | 5 + .../docs/manual/mod/mod_proxy_http.html.en | 64 + .../httpd-2.0.64/docs/manual/mod/mod_rewrite.html | 5 + .../docs/manual/mod/mod_rewrite.html.en | 1671 + .../httpd-2.0.64/docs/manual/mod/mod_setenvif.html | 17 + .../docs/manual/mod/mod_setenvif.html.en | 291 + .../docs/manual/mod/mod_setenvif.html.ja.utf8 | 284 + .../docs/manual/mod/mod_setenvif.html.ko.euc-kr | 261 + .../docs/manual/mod/mod_setenvif.html.tr.utf8 | 278 + .../app/httpd-2.0.64/docs/manual/mod/mod_so.html | 17 + .../httpd-2.0.64/docs/manual/mod/mod_so.html.en | 192 + .../docs/manual/mod/mod_so.html.ja.utf8 | 192 + .../docs/manual/mod/mod_so.html.ko.euc-kr | 176 + .../docs/manual/mod/mod_so.html.tr.utf8 | 196 + .../httpd-2.0.64/docs/manual/mod/mod_speling.html | 13 + .../docs/manual/mod/mod_speling.html.en | 121 + .../docs/manual/mod/mod_speling.html.ja.utf8 | 119 + .../docs/manual/mod/mod_speling.html.ko.euc-kr | 110 + .../app/httpd-2.0.64/docs/manual/mod/mod_ssl.html | 5 + .../httpd-2.0.64/docs/manual/mod/mod_ssl.html.en | 1576 + .../httpd-2.0.64/docs/manual/mod/mod_status.html | 17 + .../docs/manual/mod/mod_status.html.en | 164 + .../docs/manual/mod/mod_status.html.ja.utf8 | 158 + .../docs/manual/mod/mod_status.html.ko.euc-kr | 152 + .../docs/manual/mod/mod_status.html.tr.utf8 | 159 + .../httpd-2.0.64/docs/manual/mod/mod_suexec.html | 17 + .../docs/manual/mod/mod_suexec.html.en | 82 + .../docs/manual/mod/mod_suexec.html.ja.utf8 | 83 + .../docs/manual/mod/mod_suexec.html.ko.euc-kr | 83 + .../docs/manual/mod/mod_suexec.html.tr.utf8 | 84 + .../docs/manual/mod/mod_unique_id.html | 13 + .../docs/manual/mod/mod_unique_id.html.en | 215 + .../docs/manual/mod/mod_unique_id.html.ja.utf8 | 216 + .../docs/manual/mod/mod_unique_id.html.ko.euc-kr | 191 + .../httpd-2.0.64/docs/manual/mod/mod_userdir.html | 17 + .../docs/manual/mod/mod_userdir.html.en | 173 + .../docs/manual/mod/mod_userdir.html.ja.utf8 | 183 + .../docs/manual/mod/mod_userdir.html.ko.euc-kr | 161 + .../docs/manual/mod/mod_userdir.html.tr.utf8 | 180 + .../docs/manual/mod/mod_usertrack.html | 5 + .../docs/manual/mod/mod_usertrack.html.en | 252 + .../httpd-2.0.64/docs/manual/mod/mod_version.html | 13 + .../docs/manual/mod/mod_version.html.en | 150 + .../docs/manual/mod/mod_version.html.ja.utf8 | 150 + .../docs/manual/mod/mod_version.html.ko.euc-kr | 150 + .../docs/manual/mod/mod_vhost_alias.html | 9 + .../docs/manual/mod/mod_vhost_alias.html.en | 314 + .../docs/manual/mod/mod_vhost_alias.html.tr.utf8 | 305 + .../httpd-2.0.64/docs/manual/mod/module-dict.html | 17 + .../docs/manual/mod/module-dict.html.en | 119 + .../docs/manual/mod/module-dict.html.ja.utf8 | 121 + .../docs/manual/mod/module-dict.html.ko.euc-kr | 111 + .../docs/manual/mod/module-dict.html.tr.utf8 | 91 + .../httpd-2.0.64/docs/manual/mod/mpm_common.html | 21 + .../docs/manual/mod/mpm_common.html.de | 978 + .../docs/manual/mod/mpm_common.html.en | 896 + .../docs/manual/mod/mpm_common.html.es | 982 + .../docs/manual/mod/mpm_common.html.ja.utf8 | 956 + .../docs/manual/mod/mpm_common.html.tr.utf8 | 905 + .../httpd-2.0.64/docs/manual/mod/mpm_netware.html | 5 + .../docs/manual/mod/mpm_netware.html.en | 125 + .../httpd-2.0.64/docs/manual/mod/mpm_winnt.html | 17 + .../httpd-2.0.64/docs/manual/mod/mpm_winnt.html.de | 95 + .../httpd-2.0.64/docs/manual/mod/mpm_winnt.html.en | 95 + .../httpd-2.0.64/docs/manual/mod/mpm_winnt.html.es | 99 + .../docs/manual/mod/mpm_winnt.html.ja.utf8 | 94 + .../app/httpd-2.0.64/docs/manual/mod/mpmt_os2.html | 5 + .../httpd-2.0.64/docs/manual/mod/mpmt_os2.html.en | 73 + .../app/httpd-2.0.64/docs/manual/mod/perchild.html | 5 + .../httpd-2.0.64/docs/manual/mod/perchild.html.en | 266 + .../app/httpd-2.0.64/docs/manual/mod/prefork.html | 21 + .../httpd-2.0.64/docs/manual/mod/prefork.html.de | 195 + .../httpd-2.0.64/docs/manual/mod/prefork.html.en | 181 + .../httpd-2.0.64/docs/manual/mod/prefork.html.es | 197 + .../docs/manual/mod/prefork.html.ja.utf8 | 194 + .../docs/manual/mod/prefork.html.tr.utf8 | 180 + .../docs/manual/mod/quickreference.html | 29 + .../docs/manual/mod/quickreference.html.de | 743 + .../docs/manual/mod/quickreference.html.en | 721 + .../docs/manual/mod/quickreference.html.es | 732 + .../docs/manual/mod/quickreference.html.ja.utf8 | 670 + .../docs/manual/mod/quickreference.html.ko.euc-kr | 674 + .../docs/manual/mod/quickreference.html.ru.koi8-r | 726 + .../docs/manual/mod/quickreference.html.tr.utf8 | 723 + .../httpd-2.0.64/docs/manual/mod/threadpool.html | 5 + .../docs/manual/mod/threadpool.html.en | 81 + .../app/httpd-2.0.64/docs/manual/mod/worker.html | 21 + .../httpd-2.0.64/docs/manual/mod/worker.html.de | 173 + .../httpd-2.0.64/docs/manual/mod/worker.html.en | 180 + .../httpd-2.0.64/docs/manual/mod/worker.html.es | 188 + .../docs/manual/mod/worker.html.ja.utf8 | 190 + .../docs/manual/mod/worker.html.tr.utf8 | 170 + rubbos/app/httpd-2.0.64/docs/manual/mpm.html | 29 + rubbos/app/httpd-2.0.64/docs/manual/mpm.html.de | 131 + rubbos/app/httpd-2.0.64/docs/manual/mpm.html.en | 132 + rubbos/app/httpd-2.0.64/docs/manual/mpm.html.es | 141 + .../app/httpd-2.0.64/docs/manual/mpm.html.ja.utf8 | 143 + .../httpd-2.0.64/docs/manual/mpm.html.ko.euc-kr | 126 + .../httpd-2.0.64/docs/manual/mpm.html.ru.koi8-r | 138 + .../app/httpd-2.0.64/docs/manual/mpm.html.tr.utf8 | 128 + .../httpd-2.0.64/docs/manual/new_features_2_0.html | 33 + .../docs/manual/new_features_2_0.html.de | 265 + .../docs/manual/new_features_2_0.html.en | 245 + .../docs/manual/new_features_2_0.html.es | 274 + .../docs/manual/new_features_2_0.html.fr | 124 + .../docs/manual/new_features_2_0.html.ja.utf8 | 255 + .../docs/manual/new_features_2_0.html.ko.euc-kr | 235 + .../docs/manual/new_features_2_0.html.ru.koi8-r | 252 + .../docs/manual/new_features_2_0.html.tr.utf8 | 251 + .../httpd-2.0.64/docs/manual/platform/ebcdic.html | 9 + .../docs/manual/platform/ebcdic.html.en | 584 + .../docs/manual/platform/ebcdic.html.ko.euc-kr | 557 + .../httpd-2.0.64/docs/manual/platform/index.html | 9 + .../docs/manual/platform/index.html.en | 94 + .../docs/manual/platform/index.html.ko.euc-kr | 94 + .../httpd-2.0.64/docs/manual/platform/netware.html | 9 + .../docs/manual/platform/netware.html.en | 589 + .../docs/manual/platform/netware.html.ko.euc-kr | 579 + .../httpd-2.0.64/docs/manual/platform/perf-hp.html | 9 + .../docs/manual/platform/perf-hp.html.en | 105 + .../docs/manual/platform/perf-hp.html.ko.euc-kr | 100 + .../docs/manual/platform/win_compiling.html | 9 + .../docs/manual/platform/win_compiling.html.en | 431 + .../manual/platform/win_compiling.html.ko.euc-kr | 423 + .../httpd-2.0.64/docs/manual/platform/windows.html | 9 + .../docs/manual/platform/windows.html.en | 754 + .../docs/manual/platform/windows.html.ko.euc-kr | 688 + .../app/httpd-2.0.64/docs/manual/programs/ab.html | 13 + .../httpd-2.0.64/docs/manual/programs/ab.html.en | 200 + .../docs/manual/programs/ab.html.ko.euc-kr | 203 + .../docs/manual/programs/ab.html.tr.utf8 | 224 + .../docs/manual/programs/apachectl.html | 13 + .../docs/manual/programs/apachectl.html.en | 154 + .../docs/manual/programs/apachectl.html.ko.euc-kr | 146 + .../docs/manual/programs/apachectl.html.tr.utf8 | 160 + .../httpd-2.0.64/docs/manual/programs/apxs.html | 13 + .../httpd-2.0.64/docs/manual/programs/apxs.html.en | 339 + .../docs/manual/programs/apxs.html.ko.euc-kr | 335 + .../docs/manual/programs/apxs.html.tr.utf8 | 360 + .../docs/manual/programs/configure.html | 13 + .../docs/manual/programs/configure.html.en | 916 + .../docs/manual/programs/configure.html.ko.euc-kr | 932 + .../docs/manual/programs/configure.html.tr.utf8 | 989 + .../docs/manual/programs/dbmmanage.html | 13 + .../docs/manual/programs/dbmmanage.html.en | 193 + .../docs/manual/programs/dbmmanage.html.ko.euc-kr | 174 + .../docs/manual/programs/dbmmanage.html.tr.utf8 | 209 + .../httpd-2.0.64/docs/manual/programs/htdbm.html | 9 + .../docs/manual/programs/htdbm.html.en | 283 + .../docs/manual/programs/htdbm.html.tr.utf8 | 290 + .../docs/manual/programs/htdigest.html | 13 + .../docs/manual/programs/htdigest.html.en | 74 + .../docs/manual/programs/htdigest.html.ko.euc-kr | 77 + .../docs/manual/programs/htdigest.html.tr.utf8 | 78 + .../docs/manual/programs/htpasswd.html | 13 + .../docs/manual/programs/htpasswd.html.en | 217 + .../docs/manual/programs/htpasswd.html.ko.euc-kr | 219 + .../docs/manual/programs/htpasswd.html.tr.utf8 | 224 + .../httpd-2.0.64/docs/manual/programs/httpd.html | 13 + .../docs/manual/programs/httpd.html.en | 189 + .../docs/manual/programs/httpd.html.ko.euc-kr | 184 + .../docs/manual/programs/httpd.html.tr.utf8 | 175 + .../httpd-2.0.64/docs/manual/programs/index.html | 21 + .../docs/manual/programs/index.html.en | 101 + .../docs/manual/programs/index.html.es | 104 + .../docs/manual/programs/index.html.ko.euc-kr | 97 + .../docs/manual/programs/index.html.ru.koi8-r | 95 + .../docs/manual/programs/index.html.tr.utf8 | 90 + .../docs/manual/programs/logresolve.html | 13 + .../docs/manual/programs/logresolve.html.en | 74 + .../docs/manual/programs/logresolve.html.ko.euc-kr | 71 + .../docs/manual/programs/logresolve.html.tr.utf8 | 71 + .../httpd-2.0.64/docs/manual/programs/other.html | 13 + .../docs/manual/programs/other.html.en | 61 + .../docs/manual/programs/other.html.ko.euc-kr | 59 + .../docs/manual/programs/other.html.tr.utf8 | 64 + .../docs/manual/programs/rotatelogs.html | 13 + .../docs/manual/programs/rotatelogs.html.en | 148 + .../docs/manual/programs/rotatelogs.html.ko.euc-kr | 147 + .../docs/manual/programs/rotatelogs.html.tr.utf8 | 172 + .../httpd-2.0.64/docs/manual/programs/suexec.html | 13 + .../docs/manual/programs/suexec.html.en | 63 + .../docs/manual/programs/suexec.html.ko.euc-kr | 64 + .../docs/manual/programs/suexec.html.tr.utf8 | 63 + .../httpd-2.0.64/docs/manual/rewrite/index.html | 9 + .../httpd-2.0.64/docs/manual/rewrite/index.html.en | 99 + .../docs/manual/rewrite/index.html.tr.utf8 | 91 + .../docs/manual/rewrite/rewrite_guide.html | 5 + .../docs/manual/rewrite/rewrite_guide.html.en | 788 + .../manual/rewrite/rewrite_guide_advanced.html | 5 + .../manual/rewrite/rewrite_guide_advanced.html.en | 1289 + .../docs/manual/rewrite/rewrite_intro.html | 5 + .../docs/manual/rewrite/rewrite_intro.html.en | 117 + .../docs/manual/rewrite/rewrite_tech.html | 5 + .../docs/manual/rewrite/rewrite_tech.html.en | 166 + rubbos/app/httpd-2.0.64/docs/manual/sections.html | 21 + .../app/httpd-2.0.64/docs/manual/sections.html.en | 457 + .../app/httpd-2.0.64/docs/manual/sections.html.es | 492 + .../httpd-2.0.64/docs/manual/sections.html.ja.utf8 | 467 + .../docs/manual/sections.html.ko.euc-kr | 423 + .../httpd-2.0.64/docs/manual/sections.html.tr.utf8 | 472 + .../app/httpd-2.0.64/docs/manual/server-wide.html | 21 + .../httpd-2.0.64/docs/manual/server-wide.html.en | 103 + .../httpd-2.0.64/docs/manual/server-wide.html.es | 107 + .../docs/manual/server-wide.html.ja.utf8 | 103 + .../docs/manual/server-wide.html.ko.euc-kr | 97 + .../docs/manual/server-wide.html.tr.utf8 | 100 + rubbos/app/httpd-2.0.64/docs/manual/sitemap.html | 25 + .../app/httpd-2.0.64/docs/manual/sitemap.html.de | 256 + .../app/httpd-2.0.64/docs/manual/sitemap.html.en | 254 + .../app/httpd-2.0.64/docs/manual/sitemap.html.es | 262 + .../httpd-2.0.64/docs/manual/sitemap.html.ja.utf8 | 256 + .../docs/manual/sitemap.html.ko.euc-kr | 261 + .../httpd-2.0.64/docs/manual/sitemap.html.tr.utf8 | 251 + rubbos/app/httpd-2.0.64/docs/manual/ssl/index.html | 13 + .../app/httpd-2.0.64/docs/manual/ssl/index.html.en | 59 + .../docs/manual/ssl/index.html.ja.utf8 | 61 + .../docs/manual/ssl/index.html.tr.utf8 | 59 + .../httpd-2.0.64/docs/manual/ssl/ssl_compat.html | 5 + .../docs/manual/ssl/ssl_compat.html.en | 233 + .../app/httpd-2.0.64/docs/manual/ssl/ssl_faq.html | 5 + .../httpd-2.0.64/docs/manual/ssl/ssl_faq.html.en | 1043 + .../httpd-2.0.64/docs/manual/ssl/ssl_howto.html | 5 + .../httpd-2.0.64/docs/manual/ssl/ssl_howto.html.en | 284 + .../httpd-2.0.64/docs/manual/ssl/ssl_intro.html | 9 + .../httpd-2.0.64/docs/manual/ssl/ssl_intro.html.en | 641 + .../docs/manual/ssl/ssl_intro.html.ja.utf8 | 695 + rubbos/app/httpd-2.0.64/docs/manual/stopping.html | 29 + .../app/httpd-2.0.64/docs/manual/stopping.html.de | 262 + .../app/httpd-2.0.64/docs/manual/stopping.html.en | 235 + .../app/httpd-2.0.64/docs/manual/stopping.html.es | 272 + .../httpd-2.0.64/docs/manual/stopping.html.ja.utf8 | 261 + .../docs/manual/stopping.html.ko.euc-kr | 209 + .../docs/manual/stopping.html.ru.koi8-r | 251 + .../httpd-2.0.64/docs/manual/stopping.html.tr.utf8 | 243 + .../docs/manual/style/build.properties | 4 + .../app/httpd-2.0.64/docs/manual/style/common.dtd | 191 + .../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 | 23 + .../httpd-2.0.64/docs/manual/style/css/manual.css | 1017 + rubbos/app/httpd-2.0.64/docs/manual/style/faq.dtd | 35 + rubbos/app/httpd-2.0.64/docs/manual/style/lang.dtd | 24 + .../docs/manual/style/latex/atbeginend.sty | 65 + .../httpd-2.0.64/docs/manual/style/manualpage.dtd | 27 + .../docs/manual/style/modulesynopsis.dtd | 76 + .../app/httpd-2.0.64/docs/manual/style/sitemap.dtd | 38 + .../app/httpd-2.0.64/docs/manual/style/version.ent | 24 + rubbos/app/httpd-2.0.64/docs/manual/suexec.html | 17 + rubbos/app/httpd-2.0.64/docs/manual/suexec.html.en | 617 + .../httpd-2.0.64/docs/manual/suexec.html.ja.utf8 | 613 + .../httpd-2.0.64/docs/manual/suexec.html.ko.euc-kr | 536 + .../httpd-2.0.64/docs/manual/suexec.html.tr.utf8 | 556 + rubbos/app/httpd-2.0.64/docs/manual/upgrading.html | 29 + .../app/httpd-2.0.64/docs/manual/upgrading.html.de | 228 + .../app/httpd-2.0.64/docs/manual/upgrading.html.en | 221 + .../app/httpd-2.0.64/docs/manual/upgrading.html.es | 246 + .../app/httpd-2.0.64/docs/manual/upgrading.html.fr | 164 + .../docs/manual/upgrading.html.ja.utf8 | 222 + .../docs/manual/upgrading.html.ko.euc-kr | 204 + .../docs/manual/upgrading.html.ru.koi8-r | 218 + .../app/httpd-2.0.64/docs/manual/urlmapping.html | 17 + .../httpd-2.0.64/docs/manual/urlmapping.html.en | 279 + .../docs/manual/urlmapping.html.ja.utf8 | 279 + .../docs/manual/urlmapping.html.ko.euc-kr | 244 + .../docs/manual/urlmapping.html.tr.utf8 | 270 + .../httpd-2.0.64/docs/manual/vhosts/details.html | 13 + .../docs/manual/vhosts/details.html.en | 440 + .../docs/manual/vhosts/details.html.ko.euc-kr | 384 + .../docs/manual/vhosts/details.html.tr.utf8 | 401 + .../httpd-2.0.64/docs/manual/vhosts/examples.html | 13 + .../docs/manual/vhosts/examples.html.en | 654 + .../docs/manual/vhosts/examples.html.ko.euc-kr | 622 + .../docs/manual/vhosts/examples.html.tr.utf8 | 641 + .../httpd-2.0.64/docs/manual/vhosts/fd-limits.html | 17 + .../docs/manual/vhosts/fd-limits.html.en | 133 + .../docs/manual/vhosts/fd-limits.html.ja.utf8 | 131 + .../docs/manual/vhosts/fd-limits.html.ko.euc-kr | 126 + .../docs/manual/vhosts/fd-limits.html.tr.utf8 | 128 + .../app/httpd-2.0.64/docs/manual/vhosts/index.html | 29 + .../httpd-2.0.64/docs/manual/vhosts/index.html.de | 112 + .../httpd-2.0.64/docs/manual/vhosts/index.html.en | 112 + .../httpd-2.0.64/docs/manual/vhosts/index.html.es | 119 + .../docs/manual/vhosts/index.html.ja.utf8 | 108 + .../docs/manual/vhosts/index.html.ko.euc-kr | 110 + .../docs/manual/vhosts/index.html.ru.koi8-r | 107 + .../docs/manual/vhosts/index.html.tr.utf8 | 107 + .../httpd-2.0.64/docs/manual/vhosts/ip-based.html | 13 + .../docs/manual/vhosts/ip-based.html.en | 160 + .../docs/manual/vhosts/ip-based.html.ko.euc-kr | 150 + .../docs/manual/vhosts/ip-based.html.tr.utf8 | 165 + .../app/httpd-2.0.64/docs/manual/vhosts/mass.html | 13 + .../httpd-2.0.64/docs/manual/vhosts/mass.html.en | 419 + .../docs/manual/vhosts/mass.html.ko.euc-kr | 425 + .../docs/manual/vhosts/mass.html.tr.utf8 | 406 + .../docs/manual/vhosts/name-based.html | 25 + .../docs/manual/vhosts/name-based.html.de | 270 + .../docs/manual/vhosts/name-based.html.en | 248 + .../docs/manual/vhosts/name-based.html.es | 292 + .../docs/manual/vhosts/name-based.html.ja.utf8 | 273 + .../docs/manual/vhosts/name-based.html.ko.euc-kr | 238 + .../docs/manual/vhosts/name-based.html.tr.utf8 | 256 + rubbos/app/httpd-2.0.64/emacs-style | 11 + rubbos/app/httpd-2.0.64/httpd | 131 + rubbos/app/httpd-2.0.64/httpd.spec | 514 + rubbos/app/httpd-2.0.64/include/.indent.pro | 54 + rubbos/app/httpd-2.0.64/include/ap_compat.h | 28 + rubbos/app/httpd-2.0.64/include/ap_config.h | 256 + rubbos/app/httpd-2.0.64/include/ap_config_auto.h | 250 + .../app/httpd-2.0.64/include/ap_config_auto.h.in | 249 + rubbos/app/httpd-2.0.64/include/ap_config_layout.h | 59 + .../app/httpd-2.0.64/include/ap_config_layout.h.in | 59 + rubbos/app/httpd-2.0.64/include/ap_listen.h | 119 + rubbos/app/httpd-2.0.64/include/ap_mmn.h | 127 + rubbos/app/httpd-2.0.64/include/ap_mpm.h | 176 + rubbos/app/httpd-2.0.64/include/ap_provider.h | 54 + rubbos/app/httpd-2.0.64/include/ap_regkey.h | 218 + rubbos/app/httpd-2.0.64/include/ap_release.h | 56 + rubbos/app/httpd-2.0.64/include/http_config.h | 1018 + rubbos/app/httpd-2.0.64/include/http_connection.h | 139 + rubbos/app/httpd-2.0.64/include/http_core.h | 640 + rubbos/app/httpd-2.0.64/include/http_log.h | 334 + rubbos/app/httpd-2.0.64/include/http_main.h | 58 + rubbos/app/httpd-2.0.64/include/http_protocol.h | 697 + rubbos/app/httpd-2.0.64/include/http_request.h | 373 + rubbos/app/httpd-2.0.64/include/http_vhost.h | 109 + rubbos/app/httpd-2.0.64/include/httpd.h | 1760 + rubbos/app/httpd-2.0.64/include/mpm_common.h | 298 + rubbos/app/httpd-2.0.64/include/pcreposix.h | 99 + rubbos/app/httpd-2.0.64/include/rfc1413.h | 42 + rubbos/app/httpd-2.0.64/include/scoreboard.h | 197 + rubbos/app/httpd-2.0.64/include/util_cfgtree.h | 79 + rubbos/app/httpd-2.0.64/include/util_charset.h | 54 + rubbos/app/httpd-2.0.64/include/util_ebcdic.h | 78 + rubbos/app/httpd-2.0.64/include/util_filter.h | 516 + rubbos/app/httpd-2.0.64/include/util_ldap.h | 318 + rubbos/app/httpd-2.0.64/include/util_md5.h | 70 + rubbos/app/httpd-2.0.64/include/util_script.h | 142 + rubbos/app/httpd-2.0.64/include/util_time.h | 85 + rubbos/app/httpd-2.0.64/include/util_xml.h | 46 + rubbos/app/httpd-2.0.64/libhttpd.dsp | 666 + rubbos/app/httpd-2.0.64/modules.c | 95 + rubbos/app/httpd-2.0.64/modules.lo | 12 + rubbos/app/httpd-2.0.64/modules.o | Bin 0 -> 17240 bytes rubbos/app/httpd-2.0.64/modules/.deps | 0 rubbos/app/httpd-2.0.64/modules/Makefile | 11 + rubbos/app/httpd-2.0.64/modules/Makefile.in | 6 + rubbos/app/httpd-2.0.64/modules/NWGNUmakefile | 52 + rubbos/app/httpd-2.0.64/modules/README | 54 + rubbos/app/httpd-2.0.64/modules/aaa/.deps | 0 rubbos/app/httpd-2.0.64/modules/aaa/.indent.pro | 54 + .../httpd-2.0.64/modules/aaa/.libs/mod_access.a | Bin 0 -> 42550 bytes .../httpd-2.0.64/modules/aaa/.libs/mod_access.la | 35 + .../httpd-2.0.64/modules/aaa/.libs/mod_access.o | Bin 0 -> 42400 bytes .../app/httpd-2.0.64/modules/aaa/.libs/mod_auth.a | Bin 0 -> 45548 bytes .../app/httpd-2.0.64/modules/aaa/.libs/mod_auth.la | 35 + .../app/httpd-2.0.64/modules/aaa/.libs/mod_auth.o | Bin 0 -> 45400 bytes rubbos/app/httpd-2.0.64/modules/aaa/Makefile | 8 + rubbos/app/httpd-2.0.64/modules/aaa/Makefile.in | 3 + rubbos/app/httpd-2.0.64/modules/aaa/NWGNUauthanon | 248 + rubbos/app/httpd-2.0.64/modules/aaa/NWGNUauthdbm | 248 + rubbos/app/httpd-2.0.64/modules/aaa/NWGNUdigest | 248 + rubbos/app/httpd-2.0.64/modules/aaa/NWGNUmakefile | 246 + rubbos/app/httpd-2.0.64/modules/aaa/config.m4 | 23 + rubbos/app/httpd-2.0.64/modules/aaa/mod_access.c | 304 + rubbos/app/httpd-2.0.64/modules/aaa/mod_access.dsp | 128 + rubbos/app/httpd-2.0.64/modules/aaa/mod_access.exp | 1 + rubbos/app/httpd-2.0.64/modules/aaa/mod_access.la | 35 + rubbos/app/httpd-2.0.64/modules/aaa/mod_access.lo | 12 + rubbos/app/httpd-2.0.64/modules/aaa/mod_access.o | Bin 0 -> 42400 bytes rubbos/app/httpd-2.0.64/modules/aaa/mod_auth.c | 315 + rubbos/app/httpd-2.0.64/modules/aaa/mod_auth.dsp | 128 + rubbos/app/httpd-2.0.64/modules/aaa/mod_auth.exp | 1 + rubbos/app/httpd-2.0.64/modules/aaa/mod_auth.la | 35 + rubbos/app/httpd-2.0.64/modules/aaa/mod_auth.lo | 12 + rubbos/app/httpd-2.0.64/modules/aaa/mod_auth.o | Bin 0 -> 45400 bytes .../app/httpd-2.0.64/modules/aaa/mod_auth_anon.c | 238 + .../app/httpd-2.0.64/modules/aaa/mod_auth_anon.dsp | 128 + .../app/httpd-2.0.64/modules/aaa/mod_auth_anon.exp | 1 + rubbos/app/httpd-2.0.64/modules/aaa/mod_auth_dbm.c | 293 + .../app/httpd-2.0.64/modules/aaa/mod_auth_dbm.dsp | 128 + .../app/httpd-2.0.64/modules/aaa/mod_auth_dbm.exp | 1 + .../app/httpd-2.0.64/modules/aaa/mod_auth_digest.c | 2108 + .../httpd-2.0.64/modules/aaa/mod_auth_digest.dsp | 128 + rubbos/app/httpd-2.0.64/modules/aaa/modules.mk | 7 + .../httpd-2.0.64/modules/arch/netware/libprews.c | 70 + .../modules/arch/netware/mod_auth_anon.def | 1 + .../modules/arch/netware/mod_auth_basic.def | 1 + .../modules/arch/netware/mod_auth_dbm.def | 1 + .../modules/arch/netware/mod_auth_digest.def | 1 + .../modules/arch/netware/mod_cache.def | 5 + .../modules/arch/netware/mod_cern_meta.def | 1 + .../httpd-2.0.64/modules/arch/netware/mod_dav.def | 3 + .../modules/arch/netware/mod_disk_cache.def | 3 + .../httpd-2.0.64/modules/arch/netware/mod_echo.def | 2 + .../modules/arch/netware/mod_expires.def | 1 + .../modules/arch/netware/mod_file_cache.def | 2 + .../modules/arch/netware/mod_headers.def | 1 + .../httpd-2.0.64/modules/arch/netware/mod_info.def | 1 + .../modules/arch/netware/mod_logio.def | 2 + .../modules/arch/netware/mod_mem_cache.def | 3 + .../modules/arch/netware/mod_mime_magic.def | 1 + .../modules/arch/netware/mod_netware.c | 194 + .../httpd-2.0.64/modules/arch/netware/mod_nw_ssl.c | 1151 + .../modules/arch/netware/mod_proxy.def | 6 + .../modules/arch/netware/mod_proxy_connect.def | 4 + .../modules/arch/netware/mod_proxy_ftp.def | 4 + .../modules/arch/netware/mod_proxy_http.def | 7 + .../modules/arch/netware/mod_rewrite.def | 1 + .../modules/arch/netware/mod_speling.def | 1 + .../modules/arch/netware/mod_status.def | 2 + .../modules/arch/netware/mod_unique_id.def | 1 + .../modules/arch/netware/mod_usertrack.def | 1 + .../modules/arch/netware/mod_vhost_alias.def | 2 + .../httpd-2.0.64/modules/arch/netware/moddavfs.def | 1 + rubbos/app/httpd-2.0.64/modules/arch/win32/.deps | 0 .../app/httpd-2.0.64/modules/arch/win32/Makefile | 8 + .../httpd-2.0.64/modules/arch/win32/Makefile.in | 3 + .../app/httpd-2.0.64/modules/arch/win32/config.m4 | 11 + .../httpd-2.0.64/modules/arch/win32/mod_isapi.c | 1760 + .../httpd-2.0.64/modules/arch/win32/mod_isapi.dsp | 132 + .../httpd-2.0.64/modules/arch/win32/mod_isapi.h | 271 + .../httpd-2.0.64/modules/arch/win32/mod_win32.c | 553 + .../app/httpd-2.0.64/modules/arch/win32/modules.mk | 3 + rubbos/app/httpd-2.0.64/modules/cache/.deps | 0 rubbos/app/httpd-2.0.64/modules/cache/.indent.pro | 54 + rubbos/app/httpd-2.0.64/modules/cache/Makefile | 8 + rubbos/app/httpd-2.0.64/modules/cache/Makefile.in | 3 + rubbos/app/httpd-2.0.64/modules/cache/config.m4 | 11 + .../httpd-2.0.64/modules/cache/mod_file_cache.c | 416 + .../httpd-2.0.64/modules/cache/mod_file_cache.dsp | 128 + .../httpd-2.0.64/modules/cache/mod_file_cache.exp | 1 + rubbos/app/httpd-2.0.64/modules/cache/modules.mk | 3 + rubbos/app/httpd-2.0.64/modules/config5.m4 | 56 + rubbos/app/httpd-2.0.64/modules/dav/fs/.deps | 0 rubbos/app/httpd-2.0.64/modules/dav/fs/Makefile | 8 + rubbos/app/httpd-2.0.64/modules/dav/fs/Makefile.in | 3 + .../app/httpd-2.0.64/modules/dav/fs/NWGNUmakefile | 266 + rubbos/app/httpd-2.0.64/modules/dav/fs/config6.m4 | 23 + rubbos/app/httpd-2.0.64/modules/dav/fs/dbm.c | 753 + rubbos/app/httpd-2.0.64/modules/dav/fs/lock.c | 1517 + .../app/httpd-2.0.64/modules/dav/fs/mod_dav_fs.c | 108 + .../app/httpd-2.0.64/modules/dav/fs/mod_dav_fs.dsp | 152 + rubbos/app/httpd-2.0.64/modules/dav/fs/modules.mk | 3 + rubbos/app/httpd-2.0.64/modules/dav/fs/repos.c | 2130 + rubbos/app/httpd-2.0.64/modules/dav/fs/repos.h | 78 + rubbos/app/httpd-2.0.64/modules/dav/main/.deps | 0 rubbos/app/httpd-2.0.64/modules/dav/main/Makefile | 8 + .../app/httpd-2.0.64/modules/dav/main/Makefile.in | 3 + .../httpd-2.0.64/modules/dav/main/NWGNUmakefile | 268 + .../app/httpd-2.0.64/modules/dav/main/config5.m4 | 22 + rubbos/app/httpd-2.0.64/modules/dav/main/dav.imp | 64 + .../app/httpd-2.0.64/modules/dav/main/liveprop.c | 140 + rubbos/app/httpd-2.0.64/modules/dav/main/mod_dav.c | 4834 ++ .../app/httpd-2.0.64/modules/dav/main/mod_dav.dsp | 164 + rubbos/app/httpd-2.0.64/modules/dav/main/mod_dav.h | 2420 + .../app/httpd-2.0.64/modules/dav/main/modules.mk | 3 + rubbos/app/httpd-2.0.64/modules/dav/main/props.c | 1116 + .../app/httpd-2.0.64/modules/dav/main/providers.c | 33 + .../httpd-2.0.64/modules/dav/main/std_liveprop.c | 194 + rubbos/app/httpd-2.0.64/modules/dav/main/util.c | 2021 + .../app/httpd-2.0.64/modules/dav/main/util_lock.c | 791 + rubbos/app/httpd-2.0.64/modules/echo/.deps | 0 rubbos/app/httpd-2.0.64/modules/echo/.indent.pro | 54 + rubbos/app/httpd-2.0.64/modules/echo/Makefile | 8 + rubbos/app/httpd-2.0.64/modules/echo/Makefile.in | 3 + rubbos/app/httpd-2.0.64/modules/echo/NWGNUmakefile | 257 + rubbos/app/httpd-2.0.64/modules/echo/config.m4 | 11 + rubbos/app/httpd-2.0.64/modules/echo/mod_echo.c | 102 + rubbos/app/httpd-2.0.64/modules/echo/mod_echo.dsp | 128 + rubbos/app/httpd-2.0.64/modules/echo/modules.mk | 3 + rubbos/app/httpd-2.0.64/modules/experimental/.deps | 0 .../httpd-2.0.64/modules/experimental/.indent.pro | 54 + .../app/httpd-2.0.64/modules/experimental/Makefile | 8 + .../httpd-2.0.64/modules/experimental/Makefile.in | 3 + .../modules/experimental/NWGNUauthldap | 262 + .../modules/experimental/NWGNUcharsetl | 257 + .../modules/experimental/NWGNUdsk_cach | 261 + .../httpd-2.0.64/modules/experimental/NWGNUexample | 256 + .../modules/experimental/NWGNUmakefile | 256 + .../modules/experimental/NWGNUmem_cach | 265 + .../modules/experimental/NWGNUmod_cach | 264 + .../modules/experimental/NWGNUmoddumpio | 248 + .../modules/experimental/NWGNUutilldap | 266 + .../app/httpd-2.0.64/modules/experimental/README | 41 + .../httpd-2.0.64/modules/experimental/README.ldap | 47 + .../modules/experimental/cache_cache.c | 171 + .../modules/experimental/cache_cache.h | 112 + .../httpd-2.0.64/modules/experimental/cache_hash.c | 290 + .../httpd-2.0.64/modules/experimental/cache_hash.h | 161 + .../modules/experimental/cache_pqueue.c | 290 + .../modules/experimental/cache_pqueue.h | 160 + .../modules/experimental/cache_storage.c | 311 + .../httpd-2.0.64/modules/experimental/cache_util.c | 575 + .../httpd-2.0.64/modules/experimental/charset.conv | 55 + .../httpd-2.0.64/modules/experimental/config.m4 | 39 + .../modules/experimental/mod_auth_ldap.c | 1117 + .../modules/experimental/mod_auth_ldap.def | 6 + .../modules/experimental/mod_auth_ldap.dsp | 128 + .../httpd-2.0.64/modules/experimental/mod_cache.c | 1006 + .../modules/experimental/mod_cache.dsp | 168 + .../httpd-2.0.64/modules/experimental/mod_cache.h | 319 + .../modules/experimental/mod_cache.imp | 10 + .../modules/experimental/mod_case_filter.c | 137 + .../modules/experimental/mod_case_filter_in.c | 160 + .../modules/experimental/mod_charset_lite.c | 1082 + .../modules/experimental/mod_charset_lite.dsp | 124 + .../modules/experimental/mod_charset_lite.exp | 1 + .../modules/experimental/mod_disk_cache.c | 963 + .../modules/experimental/mod_disk_cache.dsp | 128 + .../httpd-2.0.64/modules/experimental/mod_dumpio.c | 215 + .../modules/experimental/mod_dumpio.dsp | 128 + .../modules/experimental/mod_example.c | 1313 + .../modules/experimental/mod_mem_cache.c | 1198 + .../modules/experimental/mod_mem_cache.dsp | 128 + .../httpd-2.0.64/modules/experimental/modules.mk | 3 + .../httpd-2.0.64/modules/experimental/util_ldap.c | 1758 + .../modules/experimental/util_ldap.def | 7 + .../modules/experimental/util_ldap.dsp | 140 + .../modules/experimental/util_ldap_cache.c | 450 + .../modules/experimental/util_ldap_cache.h | 193 + .../modules/experimental/util_ldap_cache_mgr.c | 762 + rubbos/app/httpd-2.0.64/modules/filters/.deps | 0 .../app/httpd-2.0.64/modules/filters/.indent.pro | 54 + .../modules/filters/.libs/mod_include.a | Bin 0 -> 204368 bytes .../modules/filters/.libs/mod_include.la | 35 + .../modules/filters/.libs/mod_include.o | Bin 0 -> 204216 bytes rubbos/app/httpd-2.0.64/modules/filters/Makefile | 8 + .../app/httpd-2.0.64/modules/filters/Makefile.in | 3 + .../app/httpd-2.0.64/modules/filters/NWGNUdeflate | 278 + .../app/httpd-2.0.64/modules/filters/NWGNUextfiltr | 248 + .../app/httpd-2.0.64/modules/filters/NWGNUmakefile | 255 + rubbos/app/httpd-2.0.64/modules/filters/config.m4 | 65 + .../app/httpd-2.0.64/modules/filters/mod_deflate.c | 875 + .../httpd-2.0.64/modules/filters/mod_deflate.dsp | 127 + .../httpd-2.0.64/modules/filters/mod_deflate.exp | 1 + .../httpd-2.0.64/modules/filters/mod_ext_filter.c | 890 + .../modules/filters/mod_ext_filter.dsp | 128 + .../modules/filters/mod_ext_filter.exp | 1 + .../app/httpd-2.0.64/modules/filters/mod_include.c | 3751 ++ .../httpd-2.0.64/modules/filters/mod_include.dsp | 132 + .../httpd-2.0.64/modules/filters/mod_include.exp | 1 + .../app/httpd-2.0.64/modules/filters/mod_include.h | 206 + .../httpd-2.0.64/modules/filters/mod_include.la | 35 + .../httpd-2.0.64/modules/filters/mod_include.lo | 12 + .../app/httpd-2.0.64/modules/filters/mod_include.o | Bin 0 -> 204216 bytes rubbos/app/httpd-2.0.64/modules/filters/modules.mk | 5 + rubbos/app/httpd-2.0.64/modules/generators/.deps | 0 .../httpd-2.0.64/modules/generators/.indent.pro | 54 + .../modules/generators/.libs/mod_asis.a | Bin 0 -> 33444 bytes .../modules/generators/.libs/mod_asis.la | 35 + .../modules/generators/.libs/mod_asis.o | Bin 0 -> 33296 bytes .../modules/generators/.libs/mod_autoindex.a | Bin 0 -> 150722 bytes .../modules/generators/.libs/mod_autoindex.la | 35 + .../modules/generators/.libs/mod_autoindex.o | Bin 0 -> 150568 bytes .../modules/generators/.libs/mod_cgid.a | Bin 0 -> 153612 bytes .../modules/generators/.libs/mod_cgid.la | 35 + .../modules/generators/.libs/mod_cgid.o | Bin 0 -> 153464 bytes .../modules/generators/.libs/mod_status.a | Bin 0 -> 97328 bytes .../modules/generators/.libs/mod_status.la | 35 + .../modules/generators/.libs/mod_status.o | Bin 0 -> 97120 bytes .../app/httpd-2.0.64/modules/generators/Makefile | 8 + .../httpd-2.0.64/modules/generators/Makefile.in | 3 + .../app/httpd-2.0.64/modules/generators/NWGNUinfo | 248 + .../httpd-2.0.64/modules/generators/NWGNUmakefile | 247 + .../httpd-2.0.64/modules/generators/NWGNUstatus | 248 + .../app/httpd-2.0.64/modules/generators/config5.m4 | 66 + .../app/httpd-2.0.64/modules/generators/mod_asis.c | 145 + .../httpd-2.0.64/modules/generators/mod_asis.dsp | 128 + .../httpd-2.0.64/modules/generators/mod_asis.exp | 1 + .../httpd-2.0.64/modules/generators/mod_asis.la | 35 + .../httpd-2.0.64/modules/generators/mod_asis.lo | 12 + .../app/httpd-2.0.64/modules/generators/mod_asis.o | Bin 0 -> 33296 bytes .../modules/generators/mod_autoindex.c | 2252 + .../modules/generators/mod_autoindex.dsp | 128 + .../modules/generators/mod_autoindex.exp | 1 + .../modules/generators/mod_autoindex.la | 35 + .../modules/generators/mod_autoindex.lo | 12 + .../modules/generators/mod_autoindex.o | Bin 0 -> 150568 bytes .../app/httpd-2.0.64/modules/generators/mod_cgi.c | 1235 + .../httpd-2.0.64/modules/generators/mod_cgi.dsp | 132 + .../httpd-2.0.64/modules/generators/mod_cgi.exp | 1 + .../app/httpd-2.0.64/modules/generators/mod_cgi.h | 62 + .../app/httpd-2.0.64/modules/generators/mod_cgid.c | 1744 + .../httpd-2.0.64/modules/generators/mod_cgid.exp | 1 + .../httpd-2.0.64/modules/generators/mod_cgid.la | 35 + .../httpd-2.0.64/modules/generators/mod_cgid.lo | 12 + .../app/httpd-2.0.64/modules/generators/mod_cgid.o | Bin 0 -> 153464 bytes .../app/httpd-2.0.64/modules/generators/mod_info.c | 533 + .../httpd-2.0.64/modules/generators/mod_info.dsp | 128 + .../httpd-2.0.64/modules/generators/mod_info.exp | 1 + .../httpd-2.0.64/modules/generators/mod_status.c | 857 + .../httpd-2.0.64/modules/generators/mod_status.dsp | 128 + .../httpd-2.0.64/modules/generators/mod_status.exp | 1 + .../httpd-2.0.64/modules/generators/mod_status.h | 54 + .../httpd-2.0.64/modules/generators/mod_status.la | 35 + .../httpd-2.0.64/modules/generators/mod_status.lo | 12 + .../httpd-2.0.64/modules/generators/mod_status.o | Bin 0 -> 97120 bytes .../httpd-2.0.64/modules/generators/mod_suexec.c | 138 + .../httpd-2.0.64/modules/generators/mod_suexec.h | 23 + .../app/httpd-2.0.64/modules/generators/modules.mk | 11 + rubbos/app/httpd-2.0.64/modules/http/.deps | 0 rubbos/app/httpd-2.0.64/modules/http/.indent.pro | 54 + .../httpd-2.0.64/modules/http/.libs/http_core.o | Bin 0 -> 47552 bytes .../modules/http/.libs/http_protocol.o | Bin 0 -> 188976 bytes .../httpd-2.0.64/modules/http/.libs/http_request.o | Bin 0 -> 47576 bytes .../app/httpd-2.0.64/modules/http/.libs/mod_http.a | Bin 0 -> 285478 bytes .../httpd-2.0.64/modules/http/.libs/mod_http.la | 35 + .../app/httpd-2.0.64/modules/http/.libs/mod_mime.a | Bin 0 -> 75212 bytes .../httpd-2.0.64/modules/http/.libs/mod_mime.la | 35 + .../app/httpd-2.0.64/modules/http/.libs/mod_mime.o | Bin 0 -> 75064 bytes rubbos/app/httpd-2.0.64/modules/http/Makefile | 8 + rubbos/app/httpd-2.0.64/modules/http/Makefile.in | 3 + rubbos/app/httpd-2.0.64/modules/http/config2.m4 | 20 + rubbos/app/httpd-2.0.64/modules/http/http_core.c | 322 + rubbos/app/httpd-2.0.64/modules/http/http_core.lo | 12 + rubbos/app/httpd-2.0.64/modules/http/http_core.o | Bin 0 -> 47552 bytes .../app/httpd-2.0.64/modules/http/http_protocol.c | 3212 ++ .../app/httpd-2.0.64/modules/http/http_protocol.lo | 12 + .../app/httpd-2.0.64/modules/http/http_protocol.o | Bin 0 -> 188976 bytes .../app/httpd-2.0.64/modules/http/http_request.c | 548 + .../app/httpd-2.0.64/modules/http/http_request.lo | 12 + .../app/httpd-2.0.64/modules/http/http_request.o | Bin 0 -> 47576 bytes rubbos/app/httpd-2.0.64/modules/http/mod_core.h | 80 + rubbos/app/httpd-2.0.64/modules/http/mod_http.la | 35 + rubbos/app/httpd-2.0.64/modules/http/mod_mime.c | 987 + rubbos/app/httpd-2.0.64/modules/http/mod_mime.dsp | 128 + rubbos/app/httpd-2.0.64/modules/http/mod_mime.exp | 1 + rubbos/app/httpd-2.0.64/modules/http/mod_mime.la | 35 + rubbos/app/httpd-2.0.64/modules/http/mod_mime.lo | 12 + rubbos/app/httpd-2.0.64/modules/http/mod_mime.o | Bin 0 -> 75064 bytes rubbos/app/httpd-2.0.64/modules/http/modules.mk | 7 + rubbos/app/httpd-2.0.64/modules/loggers/.deps | 0 .../app/httpd-2.0.64/modules/loggers/.indent.pro | 54 + .../modules/loggers/.libs/mod_log_config.a | Bin 0 -> 121544 bytes .../modules/loggers/.libs/mod_log_config.la | 35 + .../modules/loggers/.libs/mod_log_config.o | Bin 0 -> 121312 bytes rubbos/app/httpd-2.0.64/modules/loggers/Makefile | 8 + .../app/httpd-2.0.64/modules/loggers/Makefile.in | 3 + .../app/httpd-2.0.64/modules/loggers/NWGNUforensic | 257 + .../app/httpd-2.0.64/modules/loggers/NWGNUmakefile | 247 + .../app/httpd-2.0.64/modules/loggers/NWGNUmodlogio | 257 + rubbos/app/httpd-2.0.64/modules/loggers/config.m4 | 18 + .../httpd-2.0.64/modules/loggers/mod_log_config.c | 1519 + .../modules/loggers/mod_log_config.dsp | 128 + .../modules/loggers/mod_log_config.exp | 1 + .../httpd-2.0.64/modules/loggers/mod_log_config.h | 63 + .../httpd-2.0.64/modules/loggers/mod_log_config.la | 35 + .../httpd-2.0.64/modules/loggers/mod_log_config.lo | 12 + .../httpd-2.0.64/modules/loggers/mod_log_config.o | Bin 0 -> 121312 bytes .../modules/loggers/mod_log_forensic.c | 288 + .../modules/loggers/mod_log_forensic.dsp | 128 + .../modules/loggers/mod_log_forensic.exp | 1 + .../app/httpd-2.0.64/modules/loggers/mod_logio.c | 192 + .../app/httpd-2.0.64/modules/loggers/mod_logio.dsp | 128 + rubbos/app/httpd-2.0.64/modules/loggers/modules.mk | 5 + rubbos/app/httpd-2.0.64/modules/mappers/.deps | 0 .../app/httpd-2.0.64/modules/mappers/.indent.pro | 54 + .../modules/mappers/.libs/mod_actions.a | Bin 0 -> 36840 bytes .../modules/mappers/.libs/mod_actions.la | 35 + .../modules/mappers/.libs/mod_actions.o | Bin 0 -> 36688 bytes .../httpd-2.0.64/modules/mappers/.libs/mod_alias.a | Bin 0 -> 59550 bytes .../modules/mappers/.libs/mod_alias.la | 35 + .../httpd-2.0.64/modules/mappers/.libs/mod_alias.o | Bin 0 -> 59400 bytes .../httpd-2.0.64/modules/mappers/.libs/mod_dir.a | Bin 0 -> 37596 bytes .../httpd-2.0.64/modules/mappers/.libs/mod_dir.la | 35 + .../httpd-2.0.64/modules/mappers/.libs/mod_dir.o | Bin 0 -> 37448 bytes .../httpd-2.0.64/modules/mappers/.libs/mod_imap.a | Bin 0 -> 72260 bytes .../httpd-2.0.64/modules/mappers/.libs/mod_imap.la | 35 + .../httpd-2.0.64/modules/mappers/.libs/mod_imap.o | Bin 0 -> 72112 bytes .../modules/mappers/.libs/mod_negotiation.a | Bin 0 -> 149884 bytes .../modules/mappers/.libs/mod_negotiation.la | 35 + .../modules/mappers/.libs/mod_negotiation.o | Bin 0 -> 149648 bytes .../httpd-2.0.64/modules/mappers/.libs/mod_so.a | Bin 0 -> 29882 bytes .../httpd-2.0.64/modules/mappers/.libs/mod_so.la | 35 + .../httpd-2.0.64/modules/mappers/.libs/mod_so.o | Bin 0 -> 29736 bytes .../modules/mappers/.libs/mod_userdir.a | Bin 0 -> 40776 bytes .../modules/mappers/.libs/mod_userdir.la | 35 + .../modules/mappers/.libs/mod_userdir.o | Bin 0 -> 40624 bytes rubbos/app/httpd-2.0.64/modules/mappers/Makefile | 8 + .../app/httpd-2.0.64/modules/mappers/Makefile.in | 3 + .../app/httpd-2.0.64/modules/mappers/NWGNUmakefile | 247 + .../app/httpd-2.0.64/modules/mappers/NWGNUrewrite | 248 + .../app/httpd-2.0.64/modules/mappers/NWGNUspeling | 248 + rubbos/app/httpd-2.0.64/modules/mappers/NWGNUvhost | 248 + rubbos/app/httpd-2.0.64/modules/mappers/config9.m4 | 57 + .../app/httpd-2.0.64/modules/mappers/mod_actions.c | 198 + .../httpd-2.0.64/modules/mappers/mod_actions.dsp | 128 + .../httpd-2.0.64/modules/mappers/mod_actions.exp | 1 + .../httpd-2.0.64/modules/mappers/mod_actions.la | 35 + .../httpd-2.0.64/modules/mappers/mod_actions.lo | 12 + .../app/httpd-2.0.64/modules/mappers/mod_actions.o | Bin 0 -> 36688 bytes .../app/httpd-2.0.64/modules/mappers/mod_alias.c | 484 + .../app/httpd-2.0.64/modules/mappers/mod_alias.dsp | 128 + .../app/httpd-2.0.64/modules/mappers/mod_alias.exp | 1 + .../app/httpd-2.0.64/modules/mappers/mod_alias.la | 35 + .../app/httpd-2.0.64/modules/mappers/mod_alias.lo | 12 + .../app/httpd-2.0.64/modules/mappers/mod_alias.o | Bin 0 -> 59400 bytes rubbos/app/httpd-2.0.64/modules/mappers/mod_dir.c | 247 + .../app/httpd-2.0.64/modules/mappers/mod_dir.dsp | 128 + .../app/httpd-2.0.64/modules/mappers/mod_dir.exp | 1 + rubbos/app/httpd-2.0.64/modules/mappers/mod_dir.la | 35 + rubbos/app/httpd-2.0.64/modules/mappers/mod_dir.lo | 12 + rubbos/app/httpd-2.0.64/modules/mappers/mod_dir.o | Bin 0 -> 37448 bytes rubbos/app/httpd-2.0.64/modules/mappers/mod_imap.c | 897 + .../app/httpd-2.0.64/modules/mappers/mod_imap.dsp | 128 + .../app/httpd-2.0.64/modules/mappers/mod_imap.exp | 1 + .../app/httpd-2.0.64/modules/mappers/mod_imap.la | 35 + .../app/httpd-2.0.64/modules/mappers/mod_imap.lo | 12 + rubbos/app/httpd-2.0.64/modules/mappers/mod_imap.o | Bin 0 -> 72112 bytes .../httpd-2.0.64/modules/mappers/mod_negotiation.c | 3096 ++ .../modules/mappers/mod_negotiation.dsp | 128 + .../modules/mappers/mod_negotiation.exp | 1 + .../modules/mappers/mod_negotiation.la | 35 + .../modules/mappers/mod_negotiation.lo | 12 + .../httpd-2.0.64/modules/mappers/mod_negotiation.o | Bin 0 -> 149648 bytes .../app/httpd-2.0.64/modules/mappers/mod_rewrite.c | 4670 ++ .../httpd-2.0.64/modules/mappers/mod_rewrite.dsp | 128 + .../httpd-2.0.64/modules/mappers/mod_rewrite.exp | 1 + .../app/httpd-2.0.64/modules/mappers/mod_rewrite.h | 446 + rubbos/app/httpd-2.0.64/modules/mappers/mod_so.c | 368 + rubbos/app/httpd-2.0.64/modules/mappers/mod_so.la | 35 + rubbos/app/httpd-2.0.64/modules/mappers/mod_so.lo | 12 + rubbos/app/httpd-2.0.64/modules/mappers/mod_so.o | Bin 0 -> 29736 bytes .../app/httpd-2.0.64/modules/mappers/mod_speling.c | 532 + .../httpd-2.0.64/modules/mappers/mod_speling.dsp | 128 + .../httpd-2.0.64/modules/mappers/mod_speling.exp | 1 + .../app/httpd-2.0.64/modules/mappers/mod_userdir.c | 366 + .../httpd-2.0.64/modules/mappers/mod_userdir.dsp | 128 + .../httpd-2.0.64/modules/mappers/mod_userdir.exp | 1 + .../httpd-2.0.64/modules/mappers/mod_userdir.la | 35 + .../httpd-2.0.64/modules/mappers/mod_userdir.lo | 12 + .../app/httpd-2.0.64/modules/mappers/mod_userdir.o | Bin 0 -> 40624 bytes .../httpd-2.0.64/modules/mappers/mod_vhost_alias.c | 457 + .../modules/mappers/mod_vhost_alias.dsp | 128 + .../modules/mappers/mod_vhost_alias.exp | 1 + rubbos/app/httpd-2.0.64/modules/mappers/modules.mk | 17 + rubbos/app/httpd-2.0.64/modules/metadata/.deps | 0 .../app/httpd-2.0.64/modules/metadata/.indent.pro | 54 + .../httpd-2.0.64/modules/metadata/.libs/mod_env.a | Bin 0 -> 37500 bytes .../httpd-2.0.64/modules/metadata/.libs/mod_env.la | 35 + .../httpd-2.0.64/modules/metadata/.libs/mod_env.o | Bin 0 -> 37352 bytes .../modules/metadata/.libs/mod_setenvif.a | Bin 0 -> 55920 bytes .../modules/metadata/.libs/mod_setenvif.la | 35 + .../modules/metadata/.libs/mod_setenvif.o | Bin 0 -> 55768 bytes rubbos/app/httpd-2.0.64/modules/metadata/Makefile | 8 + .../app/httpd-2.0.64/modules/metadata/Makefile.in | 3 + .../httpd-2.0.64/modules/metadata/NWGNUcernmeta | 248 + .../app/httpd-2.0.64/modules/metadata/NWGNUexpires | 248 + .../app/httpd-2.0.64/modules/metadata/NWGNUheaders | 248 + .../httpd-2.0.64/modules/metadata/NWGNUmakefile | 252 + .../httpd-2.0.64/modules/metadata/NWGNUmimemagi | 248 + .../httpd-2.0.64/modules/metadata/NWGNUmodversion | 248 + .../httpd-2.0.64/modules/metadata/NWGNUuniqueid | 254 + .../app/httpd-2.0.64/modules/metadata/NWGNUusertrk | 248 + rubbos/app/httpd-2.0.64/modules/metadata/config.m4 | 24 + .../httpd-2.0.64/modules/metadata/mod_cern_meta.c | 372 + .../modules/metadata/mod_cern_meta.dsp | 128 + .../modules/metadata/mod_cern_meta.exp | 1 + rubbos/app/httpd-2.0.64/modules/metadata/mod_env.c | 179 + .../app/httpd-2.0.64/modules/metadata/mod_env.dsp | 128 + .../app/httpd-2.0.64/modules/metadata/mod_env.exp | 1 + .../app/httpd-2.0.64/modules/metadata/mod_env.la | 35 + .../app/httpd-2.0.64/modules/metadata/mod_env.lo | 12 + rubbos/app/httpd-2.0.64/modules/metadata/mod_env.o | Bin 0 -> 37352 bytes .../httpd-2.0.64/modules/metadata/mod_expires.c | 566 + .../httpd-2.0.64/modules/metadata/mod_expires.dsp | 128 + .../httpd-2.0.64/modules/metadata/mod_expires.exp | 1 + .../httpd-2.0.64/modules/metadata/mod_headers.c | 620 + .../httpd-2.0.64/modules/metadata/mod_headers.dsp | 128 + .../httpd-2.0.64/modules/metadata/mod_headers.exp | 1 + .../httpd-2.0.64/modules/metadata/mod_mime_magic.c | 2477 + .../modules/metadata/mod_mime_magic.dsp | 128 + .../modules/metadata/mod_mime_magic.exp | 1 + .../httpd-2.0.64/modules/metadata/mod_setenvif.c | 586 + .../httpd-2.0.64/modules/metadata/mod_setenvif.dsp | 128 + .../httpd-2.0.64/modules/metadata/mod_setenvif.exp | 1 + .../httpd-2.0.64/modules/metadata/mod_setenvif.la | 35 + .../httpd-2.0.64/modules/metadata/mod_setenvif.lo | 12 + .../httpd-2.0.64/modules/metadata/mod_setenvif.o | Bin 0 -> 55768 bytes .../httpd-2.0.64/modules/metadata/mod_unique_id.c | 367 + .../modules/metadata/mod_unique_id.dsp | 128 + .../modules/metadata/mod_unique_id.exp | 1 + .../httpd-2.0.64/modules/metadata/mod_usertrack.c | 454 + .../modules/metadata/mod_usertrack.dsp | 128 + .../modules/metadata/mod_usertrack.exp | 1 + .../httpd-2.0.64/modules/metadata/mod_version.c | 312 + .../httpd-2.0.64/modules/metadata/mod_version.dsp | 128 + .../httpd-2.0.64/modules/metadata/mod_version.exp | 1 + .../app/httpd-2.0.64/modules/metadata/modules.mk | 7 + rubbos/app/httpd-2.0.64/modules/proxy/.deps | 0 rubbos/app/httpd-2.0.64/modules/proxy/.indent.pro | 58 + rubbos/app/httpd-2.0.64/modules/proxy/CHANGES | 223 + rubbos/app/httpd-2.0.64/modules/proxy/Makefile | 8 + rubbos/app/httpd-2.0.64/modules/proxy/Makefile.in | 3 + .../app/httpd-2.0.64/modules/proxy/NWGNUmakefile | 247 + rubbos/app/httpd-2.0.64/modules/proxy/NWGNUproxy | 261 + .../app/httpd-2.0.64/modules/proxy/NWGNUproxycon | 254 + .../app/httpd-2.0.64/modules/proxy/NWGNUproxyftp | 260 + .../app/httpd-2.0.64/modules/proxy/NWGNUproxyhtp | 263 + rubbos/app/httpd-2.0.64/modules/proxy/config.m4 | 34 + rubbos/app/httpd-2.0.64/modules/proxy/libproxy.exp | 1 + rubbos/app/httpd-2.0.64/modules/proxy/mod_proxy.c | 1181 + .../app/httpd-2.0.64/modules/proxy/mod_proxy.dsp | 140 + rubbos/app/httpd-2.0.64/modules/proxy/mod_proxy.h | 255 + .../modules/proxy/mod_proxy_connect.dsp | 136 + .../httpd-2.0.64/modules/proxy/mod_proxy_ftp.dsp | 136 + .../httpd-2.0.64/modules/proxy/mod_proxy_http.dsp | 136 + rubbos/app/httpd-2.0.64/modules/proxy/modules.mk | 3 + .../app/httpd-2.0.64/modules/proxy/proxy_connect.c | 377 + rubbos/app/httpd-2.0.64/modules/proxy/proxy_ftp.c | 1936 + rubbos/app/httpd-2.0.64/modules/proxy/proxy_http.c | 1824 + rubbos/app/httpd-2.0.64/modules/proxy/proxy_util.c | 1120 + rubbos/app/httpd-2.0.64/modules/ssl/.deps | 0 rubbos/app/httpd-2.0.64/modules/ssl/Makefile | 43 + rubbos/app/httpd-2.0.64/modules/ssl/Makefile.in | 38 + rubbos/app/httpd-2.0.64/modules/ssl/README | 129 + .../app/httpd-2.0.64/modules/ssl/README.dsov.fig | 346 + rubbos/app/httpd-2.0.64/modules/ssl/README.dsov.ps | 1138 + rubbos/app/httpd-2.0.64/modules/ssl/config.m4 | 54 + rubbos/app/httpd-2.0.64/modules/ssl/mod_ssl.c | 428 + rubbos/app/httpd-2.0.64/modules/ssl/mod_ssl.dsp | 328 + rubbos/app/httpd-2.0.64/modules/ssl/mod_ssl.h | 724 + rubbos/app/httpd-2.0.64/modules/ssl/modules.mk | 3 + .../httpd-2.0.64/modules/ssl/ssl_engine_config.c | 1420 + .../app/httpd-2.0.64/modules/ssl/ssl_engine_dh.c | 207 + .../app/httpd-2.0.64/modules/ssl/ssl_engine_init.c | 1243 + .../app/httpd-2.0.64/modules/ssl/ssl_engine_io.c | 1746 + .../httpd-2.0.64/modules/ssl/ssl_engine_kernel.c | 1876 + .../app/httpd-2.0.64/modules/ssl/ssl_engine_log.c | 101 + .../httpd-2.0.64/modules/ssl/ssl_engine_mutex.c | 120 + .../httpd-2.0.64/modules/ssl/ssl_engine_pphrase.c | 789 + .../app/httpd-2.0.64/modules/ssl/ssl_engine_rand.c | 179 + .../app/httpd-2.0.64/modules/ssl/ssl_engine_vars.c | 687 + rubbos/app/httpd-2.0.64/modules/ssl/ssl_expr.c | 82 + rubbos/app/httpd-2.0.64/modules/ssl/ssl_expr.h | 104 + .../app/httpd-2.0.64/modules/ssl/ssl_expr_eval.c | 254 + .../app/httpd-2.0.64/modules/ssl/ssl_expr_parse.c | 1081 + .../app/httpd-2.0.64/modules/ssl/ssl_expr_parse.h | 27 + .../app/httpd-2.0.64/modules/ssl/ssl_expr_parse.y | 148 + .../app/httpd-2.0.64/modules/ssl/ssl_expr_scan.c | 1969 + .../app/httpd-2.0.64/modules/ssl/ssl_expr_scan.l | 225 + rubbos/app/httpd-2.0.64/modules/ssl/ssl_scache.c | 199 + .../app/httpd-2.0.64/modules/ssl/ssl_scache_dbm.c | 462 + .../httpd-2.0.64/modules/ssl/ssl_scache_shmcb.c | 1362 + .../httpd-2.0.64/modules/ssl/ssl_scache_shmht.c | 351 + .../httpd-2.0.64/modules/ssl/ssl_toolkit_compat.h | 239 + rubbos/app/httpd-2.0.64/modules/ssl/ssl_util.c | 449 + rubbos/app/httpd-2.0.64/modules/ssl/ssl_util_ssl.c | 574 + rubbos/app/httpd-2.0.64/modules/ssl/ssl_util_ssl.h | 93 + .../app/httpd-2.0.64/modules/ssl/ssl_util_table.c | 2518 ++ .../app/httpd-2.0.64/modules/ssl/ssl_util_table.h | 152 + rubbos/app/httpd-2.0.64/modules/test/.deps | 0 rubbos/app/httpd-2.0.64/modules/test/.indent.pro | 54 + rubbos/app/httpd-2.0.64/modules/test/Makefile | 8 + rubbos/app/httpd-2.0.64/modules/test/Makefile.in | 3 + rubbos/app/httpd-2.0.64/modules/test/README | 1 + rubbos/app/httpd-2.0.64/modules/test/config.m4 | 10 + .../app/httpd-2.0.64/modules/test/mod_bucketeer.c | 181 + .../httpd-2.0.64/modules/test/mod_bucketeer.dsp | 128 + .../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 + rubbos/app/httpd-2.0.64/modules/test/modules.mk | 3 + rubbos/app/httpd-2.0.64/os/.deps | 0 rubbos/app/httpd-2.0.64/os/.indent.pro | 54 + rubbos/app/httpd-2.0.64/os/Makefile | 9 + rubbos/app/httpd-2.0.64/os/Makefile.in | 4 + rubbos/app/httpd-2.0.64/os/beos/.deps | 0 rubbos/app/httpd-2.0.64/os/beos/Makefile | 10 + rubbos/app/httpd-2.0.64/os/beos/Makefile.in | 5 + rubbos/app/httpd-2.0.64/os/beos/beosd.c | 166 + rubbos/app/httpd-2.0.64/os/beos/beosd.h | 60 + rubbos/app/httpd-2.0.64/os/beos/config.m4 | 3 + rubbos/app/httpd-2.0.64/os/beos/os.c | 37 + rubbos/app/httpd-2.0.64/os/beos/os.h | 30 + rubbos/app/httpd-2.0.64/os/bs2000/bs2login.c | 266 + rubbos/app/httpd-2.0.64/os/bs2000/ebcdic.c | 210 + rubbos/app/httpd-2.0.64/os/bs2000/ebcdic.h | 24 + rubbos/app/httpd-2.0.64/os/bs2000/os.c | 34 + rubbos/app/httpd-2.0.64/os/bs2000/os.h | 34 + rubbos/app/httpd-2.0.64/os/config.m4 | 26 + rubbos/app/httpd-2.0.64/os/netware/Apache.def | 5 + rubbos/app/httpd-2.0.64/os/netware/apache.xdc | Bin 0 -> 128 bytes rubbos/app/httpd-2.0.64/os/netware/modules.c | 99 + rubbos/app/httpd-2.0.64/os/netware/os.h | 40 + rubbos/app/httpd-2.0.64/os/netware/pre_nw.h | 70 + rubbos/app/httpd-2.0.64/os/netware/util_nw.c | 105 + rubbos/app/httpd-2.0.64/os/os2/.deps | 0 rubbos/app/httpd-2.0.64/os/os2/Makefile | 10 + rubbos/app/httpd-2.0.64/os/os2/Makefile.in | 5 + rubbos/app/httpd-2.0.64/os/os2/config.m4 | 3 + rubbos/app/httpd-2.0.64/os/os2/core.mk | 7 + rubbos/app/httpd-2.0.64/os/os2/core_header.def | 19 + rubbos/app/httpd-2.0.64/os/os2/os.h | 33 + rubbos/app/httpd-2.0.64/os/os2/util_os2.c | 39 + rubbos/app/httpd-2.0.64/os/tpf/TPFExport | 7 + rubbos/app/httpd-2.0.64/os/tpf/ebcdic.c | 179 + rubbos/app/httpd-2.0.64/os/tpf/ebcdic.h | 24 + rubbos/app/httpd-2.0.64/os/tpf/os.c | 132 + rubbos/app/httpd-2.0.64/os/tpf/os.h | 87 + rubbos/app/httpd-2.0.64/os/tpf/samples/linkdll.jcl | 121 + rubbos/app/httpd-2.0.64/os/tpf/samples/loadset.jcl | 58 + rubbos/app/httpd-2.0.64/os/unix/.deps | 0 rubbos/app/httpd-2.0.64/os/unix/.libs/libos.a | Bin 0 -> 58996 bytes rubbos/app/httpd-2.0.64/os/unix/.libs/libos.la | 35 + rubbos/app/httpd-2.0.64/os/unix/.libs/unixd.o | Bin 0 -> 58528 bytes rubbos/app/httpd-2.0.64/os/unix/Makefile | 10 + rubbos/app/httpd-2.0.64/os/unix/Makefile.in | 5 + rubbos/app/httpd-2.0.64/os/unix/config.m4 | 7 + rubbos/app/httpd-2.0.64/os/unix/libos.la | 35 + rubbos/app/httpd-2.0.64/os/unix/os.h | 27 + rubbos/app/httpd-2.0.64/os/unix/unixd.c | 593 + rubbos/app/httpd-2.0.64/os/unix/unixd.h | 109 + rubbos/app/httpd-2.0.64/os/unix/unixd.lo | 12 + rubbos/app/httpd-2.0.64/os/unix/unixd.o | Bin 0 -> 58528 bytes rubbos/app/httpd-2.0.64/os/win32/BaseAddr.ref | 64 + rubbos/app/httpd-2.0.64/os/win32/ap_regkey.c | 644 + rubbos/app/httpd-2.0.64/os/win32/modules.c | 48 + rubbos/app/httpd-2.0.64/os/win32/os.h | 120 + rubbos/app/httpd-2.0.64/os/win32/util_win32.c | 147 + rubbos/app/httpd-2.0.64/server/.deps | 0 rubbos/app/httpd-2.0.64/server/.indent.pro | 54 + rubbos/app/httpd-2.0.64/server/.libs/buildmark.o | Bin 0 -> 5640 bytes rubbos/app/httpd-2.0.64/server/.libs/config.o | Bin 0 -> 171936 bytes rubbos/app/httpd-2.0.64/server/.libs/connection.o | Bin 0 -> 43584 bytes rubbos/app/httpd-2.0.64/server/.libs/core.o | Bin 0 -> 281240 bytes rubbos/app/httpd-2.0.64/server/.libs/eoc_bucket.o | Bin 0 -> 9616 bytes .../app/httpd-2.0.64/server/.libs/error_bucket.o | Bin 0 -> 12560 bytes rubbos/app/httpd-2.0.64/server/.libs/exports.o | Bin 0 -> 222032 bytes .../app/httpd-2.0.64/server/.libs/gen_test_char.o | Bin 0 -> 12160 bytes rubbos/app/httpd-2.0.64/server/.libs/libmain.a | Bin 0 -> 1779304 bytes rubbos/app/httpd-2.0.64/server/.libs/libmain.la | 35 + rubbos/app/httpd-2.0.64/server/.libs/listen.o | Bin 0 -> 37360 bytes rubbos/app/httpd-2.0.64/server/.libs/log.o | Bin 0 -> 88288 bytes rubbos/app/httpd-2.0.64/server/.libs/main.o | Bin 0 -> 61080 bytes rubbos/app/httpd-2.0.64/server/.libs/mpm_common.o | Bin 0 -> 69152 bytes rubbos/app/httpd-2.0.64/server/.libs/protocol.o | Bin 0 -> 116032 bytes rubbos/app/httpd-2.0.64/server/.libs/provider.o | Bin 0 -> 8360 bytes rubbos/app/httpd-2.0.64/server/.libs/request.o | Bin 0 -> 124336 bytes rubbos/app/httpd-2.0.64/server/.libs/rfc1413.o | Bin 0 -> 23664 bytes rubbos/app/httpd-2.0.64/server/.libs/scoreboard.o | Bin 0 -> 51568 bytes rubbos/app/httpd-2.0.64/server/.libs/util.o | Bin 0 -> 133536 bytes .../app/httpd-2.0.64/server/.libs/util_cfgtree.o | Bin 0 -> 3960 bytes .../app/httpd-2.0.64/server/.libs/util_charset.o | Bin 0 -> 2472 bytes rubbos/app/httpd-2.0.64/server/.libs/util_debug.o | Bin 0 -> 17968 bytes rubbos/app/httpd-2.0.64/server/.libs/util_ebcdic.o | Bin 0 -> 2472 bytes rubbos/app/httpd-2.0.64/server/.libs/util_filter.o | Bin 0 -> 57136 bytes rubbos/app/httpd-2.0.64/server/.libs/util_md5.o | Bin 0 -> 14024 bytes rubbos/app/httpd-2.0.64/server/.libs/util_script.o | Bin 0 -> 66232 bytes rubbos/app/httpd-2.0.64/server/.libs/util_time.o | Bin 0 -> 18000 bytes rubbos/app/httpd-2.0.64/server/.libs/util_xml.o | Bin 0 -> 29408 bytes rubbos/app/httpd-2.0.64/server/.libs/vhost.o | Bin 0 -> 65800 bytes rubbos/app/httpd-2.0.64/server/Makefile | 91 + rubbos/app/httpd-2.0.64/server/Makefile.in | 86 + rubbos/app/httpd-2.0.64/server/NWGNUmakefile | 251 + rubbos/app/httpd-2.0.64/server/buildmark.c | 29 + rubbos/app/httpd-2.0.64/server/buildmark.lo | 12 + rubbos/app/httpd-2.0.64/server/buildmark.o | Bin 0 -> 5640 bytes rubbos/app/httpd-2.0.64/server/config.c | 2045 + rubbos/app/httpd-2.0.64/server/config.lo | 12 + rubbos/app/httpd-2.0.64/server/config.m4 | 15 + rubbos/app/httpd-2.0.64/server/config.o | Bin 0 -> 171936 bytes rubbos/app/httpd-2.0.64/server/connection.c | 179 + rubbos/app/httpd-2.0.64/server/connection.lo | 12 + rubbos/app/httpd-2.0.64/server/connection.o | Bin 0 -> 43584 bytes rubbos/app/httpd-2.0.64/server/core.c | 4619 ++ rubbos/app/httpd-2.0.64/server/core.lo | 12 + rubbos/app/httpd-2.0.64/server/core.o | Bin 0 -> 281240 bytes rubbos/app/httpd-2.0.64/server/eoc_bucket.c | 55 + rubbos/app/httpd-2.0.64/server/eoc_bucket.lo | 12 + rubbos/app/httpd-2.0.64/server/eoc_bucket.o | Bin 0 -> 9616 bytes rubbos/app/httpd-2.0.64/server/error_bucket.c | 74 + rubbos/app/httpd-2.0.64/server/error_bucket.lo | 12 + rubbos/app/httpd-2.0.64/server/error_bucket.o | Bin 0 -> 12560 bytes rubbos/app/httpd-2.0.64/server/export_files | 97 + rubbos/app/httpd-2.0.64/server/export_vars.h | 51 + rubbos/app/httpd-2.0.64/server/exports.c | 1520 + rubbos/app/httpd-2.0.64/server/exports.lo | 12 + rubbos/app/httpd-2.0.64/server/exports.o | Bin 0 -> 222032 bytes rubbos/app/httpd-2.0.64/server/gen_test_char | Bin 0 -> 25322 bytes rubbos/app/httpd-2.0.64/server/gen_test_char.c | 143 + rubbos/app/httpd-2.0.64/server/gen_test_char.dsp | 94 + rubbos/app/httpd-2.0.64/server/gen_test_char.lo | 12 + rubbos/app/httpd-2.0.64/server/gen_test_char.o | Bin 0 -> 12160 bytes rubbos/app/httpd-2.0.64/server/httpd.exp | 421 + rubbos/app/httpd-2.0.64/server/libmain.la | 35 + rubbos/app/httpd-2.0.64/server/listen.c | 494 + rubbos/app/httpd-2.0.64/server/listen.lo | 12 + rubbos/app/httpd-2.0.64/server/listen.o | Bin 0 -> 37360 bytes rubbos/app/httpd-2.0.64/server/log.c | 1084 + rubbos/app/httpd-2.0.64/server/log.lo | 12 + rubbos/app/httpd-2.0.64/server/log.o | Bin 0 -> 88288 bytes rubbos/app/httpd-2.0.64/server/main.c | 683 + rubbos/app/httpd-2.0.64/server/main.lo | 12 + rubbos/app/httpd-2.0.64/server/main.o | Bin 0 -> 61080 bytes rubbos/app/httpd-2.0.64/server/mpm/.deps | 0 rubbos/app/httpd-2.0.64/server/mpm/MPM.NAMING | 15 + rubbos/app/httpd-2.0.64/server/mpm/Makefile | 9 + rubbos/app/httpd-2.0.64/server/mpm/Makefile.in | 4 + .../app/httpd-2.0.64/server/mpm/beos/Makefile.in | 5 + rubbos/app/httpd-2.0.64/server/mpm/beos/beos.c | 1159 + rubbos/app/httpd-2.0.64/server/mpm/beos/beos.h | 26 + rubbos/app/httpd-2.0.64/server/mpm/beos/config5.m4 | 7 + rubbos/app/httpd-2.0.64/server/mpm/beos/mpm.h | 40 + .../app/httpd-2.0.64/server/mpm/beos/mpm_default.h | 76 + rubbos/app/httpd-2.0.64/server/mpm/config.m4 | 45 + .../server/mpm/experimental/leader/Makefile.in | 5 + .../server/mpm/experimental/leader/README | 15 + .../server/mpm/experimental/leader/config5.m4 | 6 + .../server/mpm/experimental/leader/leader.c | 1976 + .../server/mpm/experimental/leader/mpm.h | 51 + .../server/mpm/experimental/leader/mpm_default.h | 69 + .../server/mpm/experimental/perchild/Makefile.in | 5 + .../server/mpm/experimental/perchild/config5.m4 | 6 + .../server/mpm/experimental/perchild/mpm.h | 59 + .../server/mpm/experimental/perchild/mpm_default.h | 71 + .../server/mpm/experimental/perchild/perchild.c | 2045 + .../server/mpm/experimental/threadpool/Makefile.in | 5 + .../server/mpm/experimental/threadpool/README | 12 + .../server/mpm/experimental/threadpool/config5.m4 | 6 + .../server/mpm/experimental/threadpool/mpm.h | 50 + .../mpm/experimental/threadpool/mpm_default.h | 69 + .../server/mpm/experimental/threadpool/pod.c | 108 + .../server/mpm/experimental/threadpool/pod.h | 50 + .../mpm/experimental/threadpool/threadpool.c | 2229 + .../server/mpm/monitoring-services.txt | 94 + .../httpd-2.0.64/server/mpm/mpmt_os2/Makefile.in | 5 + .../httpd-2.0.64/server/mpm/mpmt_os2/config5.m4 | 5 + rubbos/app/httpd-2.0.64/server/mpm/mpmt_os2/mpm.h | 34 + .../httpd-2.0.64/server/mpm/mpmt_os2/mpm_default.h | 59 + .../httpd-2.0.64/server/mpm/mpmt_os2/mpmt_os2.c | 577 + .../server/mpm/mpmt_os2/mpmt_os2_child.c | 497 + rubbos/app/httpd-2.0.64/server/mpm/netware/mpm.h | 48 + .../httpd-2.0.64/server/mpm/netware/mpm_default.h | 108 + .../httpd-2.0.64/server/mpm/netware/mpm_netware.c | 1295 + .../httpd-2.0.64/server/mpm/prefork/Makefile.in | 5 + .../app/httpd-2.0.64/server/mpm/prefork/config.m4 | 3 + rubbos/app/httpd-2.0.64/server/mpm/prefork/mpm.h | 51 + .../httpd-2.0.64/server/mpm/prefork/mpm_default.h | 65 + .../app/httpd-2.0.64/server/mpm/prefork/prefork.c | 1355 + .../httpd-2.0.64/server/mpm/winnt/Win9xConHook.c | 697 + .../httpd-2.0.64/server/mpm/winnt/Win9xConHook.def | 10 + .../httpd-2.0.64/server/mpm/winnt/Win9xConHook.dsp | 103 + .../httpd-2.0.64/server/mpm/winnt/Win9xConHook.h | 57 + rubbos/app/httpd-2.0.64/server/mpm/winnt/child.c | 1167 + rubbos/app/httpd-2.0.64/server/mpm/winnt/mpm.h | 39 + .../httpd-2.0.64/server/mpm/winnt/mpm_default.h | 80 + .../app/httpd-2.0.64/server/mpm/winnt/mpm_winnt.c | 1728 + .../app/httpd-2.0.64/server/mpm/winnt/mpm_winnt.h | 114 + .../httpd-2.0.64/server/mpm/winnt/nt_eventlog.c | 175 + rubbos/app/httpd-2.0.64/server/mpm/winnt/service.c | 1346 + rubbos/app/httpd-2.0.64/server/mpm/worker/.deps | 0 .../httpd-2.0.64/server/mpm/worker/.libs/fdqueue.o | Bin 0 -> 21328 bytes .../server/mpm/worker/.libs/libworker.a | Bin 0 -> 205932 bytes .../server/mpm/worker/.libs/libworker.la | 35 + .../app/httpd-2.0.64/server/mpm/worker/.libs/pod.o | Bin 0 -> 17496 bytes .../httpd-2.0.64/server/mpm/worker/.libs/worker.o | Bin 0 -> 166368 bytes rubbos/app/httpd-2.0.64/server/mpm/worker/Makefile | 10 + .../app/httpd-2.0.64/server/mpm/worker/Makefile.in | 5 + .../app/httpd-2.0.64/server/mpm/worker/config5.m4 | 6 + .../app/httpd-2.0.64/server/mpm/worker/fdqueue.c | 317 + .../app/httpd-2.0.64/server/mpm/worker/fdqueue.h | 64 + .../app/httpd-2.0.64/server/mpm/worker/fdqueue.lo | 12 + .../app/httpd-2.0.64/server/mpm/worker/fdqueue.o | Bin 0 -> 21328 bytes .../httpd-2.0.64/server/mpm/worker/libworker.la | 35 + rubbos/app/httpd-2.0.64/server/mpm/worker/mpm.h | 50 + .../httpd-2.0.64/server/mpm/worker/mpm_default.h | 69 + rubbos/app/httpd-2.0.64/server/mpm/worker/pod.c | 112 + rubbos/app/httpd-2.0.64/server/mpm/worker/pod.h | 50 + rubbos/app/httpd-2.0.64/server/mpm/worker/pod.lo | 12 + rubbos/app/httpd-2.0.64/server/mpm/worker/pod.o | Bin 0 -> 17496 bytes rubbos/app/httpd-2.0.64/server/mpm/worker/worker.c | 2136 + .../app/httpd-2.0.64/server/mpm/worker/worker.lo | 12 + rubbos/app/httpd-2.0.64/server/mpm/worker/worker.o | Bin 0 -> 166368 bytes rubbos/app/httpd-2.0.64/server/mpm_common.c | 1130 + rubbos/app/httpd-2.0.64/server/mpm_common.lo | 12 + rubbos/app/httpd-2.0.64/server/mpm_common.o | Bin 0 -> 69152 bytes rubbos/app/httpd-2.0.64/server/protocol.c | 1573 + rubbos/app/httpd-2.0.64/server/protocol.lo | 12 + rubbos/app/httpd-2.0.64/server/protocol.o | Bin 0 -> 116032 bytes rubbos/app/httpd-2.0.64/server/provider.c | 98 + rubbos/app/httpd-2.0.64/server/provider.lo | 12 + rubbos/app/httpd-2.0.64/server/provider.o | Bin 0 -> 8360 bytes rubbos/app/httpd-2.0.64/server/request.c | 1888 + rubbos/app/httpd-2.0.64/server/request.lo | 12 + rubbos/app/httpd-2.0.64/server/request.o | Bin 0 -> 124336 bytes rubbos/app/httpd-2.0.64/server/rfc1413.c | 243 + rubbos/app/httpd-2.0.64/server/rfc1413.lo | 12 + rubbos/app/httpd-2.0.64/server/rfc1413.o | Bin 0 -> 23664 bytes rubbos/app/httpd-2.0.64/server/scoreboard.c | 465 + rubbos/app/httpd-2.0.64/server/scoreboard.lo | 12 + rubbos/app/httpd-2.0.64/server/scoreboard.o | Bin 0 -> 51568 bytes rubbos/app/httpd-2.0.64/server/test_char.h | 23 + rubbos/app/httpd-2.0.64/server/util.c | 2170 + rubbos/app/httpd-2.0.64/server/util.lo | 12 + rubbos/app/httpd-2.0.64/server/util.o | Bin 0 -> 133536 bytes rubbos/app/httpd-2.0.64/server/util_cfgtree.c | 47 + rubbos/app/httpd-2.0.64/server/util_cfgtree.lo | 12 + rubbos/app/httpd-2.0.64/server/util_cfgtree.o | Bin 0 -> 3960 bytes rubbos/app/httpd-2.0.64/server/util_charset.c | 57 + rubbos/app/httpd-2.0.64/server/util_charset.lo | 12 + rubbos/app/httpd-2.0.64/server/util_charset.o | Bin 0 -> 2472 bytes rubbos/app/httpd-2.0.64/server/util_debug.c | 128 + rubbos/app/httpd-2.0.64/server/util_debug.lo | 12 + rubbos/app/httpd-2.0.64/server/util_debug.o | Bin 0 -> 17968 bytes rubbos/app/httpd-2.0.64/server/util_ebcdic.c | 126 + rubbos/app/httpd-2.0.64/server/util_ebcdic.lo | 12 + rubbos/app/httpd-2.0.64/server/util_ebcdic.o | Bin 0 -> 2472 bytes rubbos/app/httpd-2.0.64/server/util_filter.c | 601 + rubbos/app/httpd-2.0.64/server/util_filter.lo | 12 + rubbos/app/httpd-2.0.64/server/util_filter.o | Bin 0 -> 57136 bytes rubbos/app/httpd-2.0.64/server/util_md5.c | 173 + rubbos/app/httpd-2.0.64/server/util_md5.lo | 12 + rubbos/app/httpd-2.0.64/server/util_md5.o | Bin 0 -> 14024 bytes rubbos/app/httpd-2.0.64/server/util_script.c | 717 + rubbos/app/httpd-2.0.64/server/util_script.lo | 12 + rubbos/app/httpd-2.0.64/server/util_script.o | Bin 0 -> 66232 bytes rubbos/app/httpd-2.0.64/server/util_time.c | 240 + rubbos/app/httpd-2.0.64/server/util_time.lo | 12 + rubbos/app/httpd-2.0.64/server/util_time.o | Bin 0 -> 18000 bytes rubbos/app/httpd-2.0.64/server/util_xml.c | 128 + rubbos/app/httpd-2.0.64/server/util_xml.lo | 12 + rubbos/app/httpd-2.0.64/server/util_xml.o | Bin 0 -> 29408 bytes rubbos/app/httpd-2.0.64/server/vhost.c | 1072 + rubbos/app/httpd-2.0.64/server/vhost.lo | 12 + rubbos/app/httpd-2.0.64/server/vhost.o | Bin 0 -> 65800 bytes rubbos/app/httpd-2.0.64/srclib/.deps | 0 rubbos/app/httpd-2.0.64/srclib/Makefile | 11 + rubbos/app/httpd-2.0.64/srclib/Makefile.in | 6 + .../srclib/apr-util/.libs/libaprutil-0.a | Bin 0 -> 709894 bytes .../srclib/apr-util/.libs/libaprutil-0.la | 35 + .../srclib/apr-util/.libs/libaprutil-0.lai | 35 + .../srclib/apr-util/.libs/libaprutil-0.so | Bin 0 -> 415764 bytes .../srclib/apr-util/.libs/libaprutil-0.so.0 | Bin 0 -> 415764 bytes .../srclib/apr-util/.libs/libaprutil-0.so.0.9.19 | Bin 0 -> 415764 bytes rubbos/app/httpd-2.0.64/srclib/apr-util/CHANGES | 597 + rubbos/app/httpd-2.0.64/srclib/apr-util/LICENSE | 404 + rubbos/app/httpd-2.0.64/srclib/apr-util/Makefile | 119 + .../app/httpd-2.0.64/srclib/apr-util/Makefile.in | 119 + rubbos/app/httpd-2.0.64/srclib/apr-util/NOTICE | 14 + .../app/httpd-2.0.64/srclib/apr-util/NWGNUmakefile | 331 + .../app/httpd-2.0.64/srclib/apr-util/aprutil.dep | 270 + .../app/httpd-2.0.64/srclib/apr-util/aprutil.dsp | 595 + .../app/httpd-2.0.64/srclib/apr-util/aprutil.dsw | 179 + .../app/httpd-2.0.64/srclib/apr-util/aprutil.exp | 187 + .../app/httpd-2.0.64/srclib/apr-util/aprutil.mak | 859 + rubbos/app/httpd-2.0.64/srclib/apr-util/apu-config | 205 + .../app/httpd-2.0.64/srclib/apr-util/apu-config.in | 205 + .../httpd-2.0.64/srclib/apr-util/apu-config.out | 205 + .../srclib/apr-util/buckets/.libs/apr_brigade.o | Bin 0 -> 45416 bytes .../srclib/apr-util/buckets/.libs/apr_buckets.o | Bin 0 -> 8520 bytes .../apr-util/buckets/.libs/apr_buckets_alloc.o | Bin 0 -> 12624 bytes .../apr-util/buckets/.libs/apr_buckets_eos.o | Bin 0 -> 9696 bytes .../apr-util/buckets/.libs/apr_buckets_file.o | Bin 0 -> 22312 bytes .../apr-util/buckets/.libs/apr_buckets_flush.o | Bin 0 -> 9720 bytes .../apr-util/buckets/.libs/apr_buckets_heap.o | Bin 0 -> 14112 bytes .../apr-util/buckets/.libs/apr_buckets_mmap.o | Bin 0 -> 16600 bytes .../apr-util/buckets/.libs/apr_buckets_pipe.o | Bin 0 -> 14640 bytes .../apr-util/buckets/.libs/apr_buckets_pool.o | Bin 0 -> 15816 bytes .../apr-util/buckets/.libs/apr_buckets_refcount.o | Bin 0 -> 9712 bytes .../apr-util/buckets/.libs/apr_buckets_simple.o | Bin 0 -> 14928 bytes .../apr-util/buckets/.libs/apr_buckets_socket.o | Bin 0 -> 14704 bytes .../httpd-2.0.64/srclib/apr-util/buckets/Makefile | 12 + .../srclib/apr-util/buckets/Makefile.in | 12 + .../srclib/apr-util/buckets/apr_brigade.c | 670 + .../srclib/apr-util/buckets/apr_brigade.lo | 12 + .../srclib/apr-util/buckets/apr_brigade.o | Bin 0 -> 45352 bytes .../srclib/apr-util/buckets/apr_buckets.c | 46 + .../srclib/apr-util/buckets/apr_buckets.lo | 12 + .../srclib/apr-util/buckets/apr_buckets.o | Bin 0 -> 8512 bytes .../srclib/apr-util/buckets/apr_buckets_alloc.c | 193 + .../srclib/apr-util/buckets/apr_buckets_alloc.lo | 12 + .../srclib/apr-util/buckets/apr_buckets_alloc.o | Bin 0 -> 12616 bytes .../srclib/apr-util/buckets/apr_buckets_eos.c | 54 + .../srclib/apr-util/buckets/apr_buckets_eos.lo | 12 + .../srclib/apr-util/buckets/apr_buckets_eos.o | Bin 0 -> 9656 bytes .../srclib/apr-util/buckets/apr_buckets_file.c | 228 + .../srclib/apr-util/buckets/apr_buckets_file.lo | 12 + .../srclib/apr-util/buckets/apr_buckets_file.o | Bin 0 -> 22248 bytes .../srclib/apr-util/buckets/apr_buckets_flush.c | 54 + .../srclib/apr-util/buckets/apr_buckets_flush.lo | 12 + .../srclib/apr-util/buckets/apr_buckets_flush.o | Bin 0 -> 9672 bytes .../srclib/apr-util/buckets/apr_buckets_heap.c | 96 + .../srclib/apr-util/buckets/apr_buckets_heap.lo | 12 + .../srclib/apr-util/buckets/apr_buckets_heap.o | Bin 0 -> 13920 bytes .../srclib/apr-util/buckets/apr_buckets_mmap.c | 146 + .../srclib/apr-util/buckets/apr_buckets_mmap.lo | 12 + .../srclib/apr-util/buckets/apr_buckets_mmap.o | Bin 0 -> 16584 bytes .../srclib/apr-util/buckets/apr_buckets_pipe.c | 119 + .../srclib/apr-util/buckets/apr_buckets_pipe.lo | 12 + .../srclib/apr-util/buckets/apr_buckets_pipe.o | Bin 0 -> 14672 bytes .../srclib/apr-util/buckets/apr_buckets_pool.c | 142 + .../srclib/apr-util/buckets/apr_buckets_pool.lo | 12 + .../srclib/apr-util/buckets/apr_buckets_pool.o | Bin 0 -> 15640 bytes .../srclib/apr-util/buckets/apr_buckets_refcount.c | 64 + .../apr-util/buckets/apr_buckets_refcount.lo | 12 + .../srclib/apr-util/buckets/apr_buckets_refcount.o | Bin 0 -> 9664 bytes .../srclib/apr-util/buckets/apr_buckets_simple.c | 137 + .../srclib/apr-util/buckets/apr_buckets_simple.lo | 12 + .../srclib/apr-util/buckets/apr_buckets_simple.o | Bin 0 -> 14864 bytes .../srclib/apr-util/buckets/apr_buckets_socket.c | 114 + .../srclib/apr-util/buckets/apr_buckets_socket.lo | 12 + .../srclib/apr-util/buckets/apr_buckets_socket.o | Bin 0 -> 14776 bytes .../srclib/apr-util/build/apr_common.m4 | 993 + .../httpd-2.0.64/srclib/apr-util/build/apu-conf.m4 | 304 + .../srclib/apr-util/build/apu-hints.m4 | 45 + .../srclib/apr-util/build/apu-iconv.m4 | 99 + .../srclib/apr-util/build/config.guess | 1502 + .../httpd-2.0.64/srclib/apr-util/build/config.sub | 1731 + .../app/httpd-2.0.64/srclib/apr-util/build/dbm.m4 | 951 + .../httpd-2.0.64/srclib/apr-util/build/find_apr.m4 | 104 + .../httpd-2.0.64/srclib/apr-util/build/find_apu.m4 | 102 + .../srclib/apr-util/build/get-version.sh | 37 + .../httpd-2.0.64/srclib/apr-util/build/install.sh | 112 + .../httpd-2.0.64/srclib/apr-util/build/mkdir.sh | 37 + .../httpd-2.0.64/srclib/apr-util/build/pkg/README | 17 + .../srclib/apr-util/build/pkg/buildpkg.sh | 99 + .../httpd-2.0.64/srclib/apr-util/build/pkg/pkginfo | 11 + .../srclib/apr-util/build/pkg/pkginfo.in | 11 + .../srclib/apr-util/build/rpm/apr-util.spec.in | 93 + .../httpd-2.0.64/srclib/apr-util/build/rules.mk | 194 + .../srclib/apr-util/build/w32locatedb.pl | 217 + rubbos/app/httpd-2.0.64/srclib/apr-util/buildconf | 86 + .../app/httpd-2.0.64/srclib/apr-util/config.layout | 231 + rubbos/app/httpd-2.0.64/srclib/apr-util/config.log | 554 + .../app/httpd-2.0.64/srclib/apr-util/config.nice | 18 + .../app/httpd-2.0.64/srclib/apr-util/config.status | 1037 + rubbos/app/httpd-2.0.64/srclib/apr-util/configure | 37390 ++++++++++++++++ .../app/httpd-2.0.64/srclib/apr-util/configure.in | 216 + .../srclib/apr-util/crypto/.libs/apr_md4.o | Bin 0 -> 18704 bytes .../srclib/apr-util/crypto/.libs/apr_md5.o | Bin 0 -> 36320 bytes .../srclib/apr-util/crypto/.libs/apr_sha1.o | Bin 0 -> 36928 bytes .../srclib/apr-util/crypto/.libs/getuuid.o | Bin 0 -> 11680 bytes .../srclib/apr-util/crypto/.libs/uuid.o | Bin 0 -> 11168 bytes .../httpd-2.0.64/srclib/apr-util/crypto/Makefile | 8 + .../srclib/apr-util/crypto/Makefile.in | 8 + .../httpd-2.0.64/srclib/apr-util/crypto/apr_md4.c | 404 + .../httpd-2.0.64/srclib/apr-util/crypto/apr_md4.lo | 12 + .../httpd-2.0.64/srclib/apr-util/crypto/apr_md4.o | Bin 0 -> 18832 bytes .../httpd-2.0.64/srclib/apr-util/crypto/apr_md5.c | 733 + .../httpd-2.0.64/srclib/apr-util/crypto/apr_md5.lo | 12 + .../httpd-2.0.64/srclib/apr-util/crypto/apr_md5.o | Bin 0 -> 38384 bytes .../httpd-2.0.64/srclib/apr-util/crypto/apr_sha1.c | 372 + .../srclib/apr-util/crypto/apr_sha1.lo | 12 + .../httpd-2.0.64/srclib/apr-util/crypto/apr_sha1.o | Bin 0 -> 37568 bytes .../httpd-2.0.64/srclib/apr-util/crypto/getuuid.c | 208 + .../httpd-2.0.64/srclib/apr-util/crypto/getuuid.lo | 12 + .../httpd-2.0.64/srclib/apr-util/crypto/getuuid.o | Bin 0 -> 11632 bytes .../app/httpd-2.0.64/srclib/apr-util/crypto/uuid.c | 130 + .../httpd-2.0.64/srclib/apr-util/crypto/uuid.lo | 12 + .../app/httpd-2.0.64/srclib/apr-util/crypto/uuid.o | Bin 0 -> 11088 bytes .../srclib/apr-util/dbm/.libs/apr_dbm.o | Bin 0 -> 17736 bytes .../srclib/apr-util/dbm/.libs/apr_dbm_berkeleydb.o | Bin 0 -> 2504 bytes .../srclib/apr-util/dbm/.libs/apr_dbm_gdbm.o | Bin 0 -> 2488 bytes .../srclib/apr-util/dbm/.libs/apr_dbm_ndbm.o | Bin 0 -> 2488 bytes .../srclib/apr-util/dbm/.libs/apr_dbm_sdbm.o | Bin 0 -> 22032 bytes .../app/httpd-2.0.64/srclib/apr-util/dbm/Makefile | 10 + .../httpd-2.0.64/srclib/apr-util/dbm/Makefile.in | 10 + .../app/httpd-2.0.64/srclib/apr-util/dbm/apr_dbm.c | 207 + .../httpd-2.0.64/srclib/apr-util/dbm/apr_dbm.lo | 12 + .../app/httpd-2.0.64/srclib/apr-util/dbm/apr_dbm.o | Bin 0 -> 17632 bytes .../srclib/apr-util/dbm/apr_dbm_berkeleydb.c | 403 + .../srclib/apr-util/dbm/apr_dbm_berkeleydb.lo | 12 + .../srclib/apr-util/dbm/apr_dbm_berkeleydb.o | Bin 0 -> 2496 bytes .../srclib/apr-util/dbm/apr_dbm_gdbm.c | 270 + .../srclib/apr-util/dbm/apr_dbm_gdbm.lo | 12 + .../srclib/apr-util/dbm/apr_dbm_gdbm.o | Bin 0 -> 2488 bytes .../srclib/apr-util/dbm/apr_dbm_ndbm.c | 227 + .../srclib/apr-util/dbm/apr_dbm_ndbm.lo | 12 + .../srclib/apr-util/dbm/apr_dbm_ndbm.o | Bin 0 -> 2488 bytes .../srclib/apr-util/dbm/apr_dbm_sdbm.c | 265 + .../srclib/apr-util/dbm/apr_dbm_sdbm.lo | 12 + .../srclib/apr-util/dbm/apr_dbm_sdbm.o | Bin 0 -> 21920 bytes .../srclib/apr-util/dbm/sdbm/.libs/sdbm.o | Bin 0 -> 50192 bytes .../srclib/apr-util/dbm/sdbm/.libs/sdbm_hash.o | Bin 0 -> 7848 bytes .../srclib/apr-util/dbm/sdbm/.libs/sdbm_lock.o | Bin 0 -> 10704 bytes .../srclib/apr-util/dbm/sdbm/.libs/sdbm_pair.o | Bin 0 -> 19064 bytes .../httpd-2.0.64/srclib/apr-util/dbm/sdbm/Makefile | 8 + .../srclib/apr-util/dbm/sdbm/Makefile.in | 8 + .../httpd-2.0.64/srclib/apr-util/dbm/sdbm/sdbm.c | 588 + .../httpd-2.0.64/srclib/apr-util/dbm/sdbm/sdbm.lo | 12 + .../httpd-2.0.64/srclib/apr-util/dbm/sdbm/sdbm.o | Bin 0 -> 36664 bytes .../srclib/apr-util/dbm/sdbm/sdbm_hash.c | 63 + .../srclib/apr-util/dbm/sdbm/sdbm_hash.lo | 12 + .../srclib/apr-util/dbm/sdbm/sdbm_hash.o | Bin 0 -> 7880 bytes .../srclib/apr-util/dbm/sdbm/sdbm_lock.c | 78 + .../srclib/apr-util/dbm/sdbm/sdbm_lock.lo | 12 + .../srclib/apr-util/dbm/sdbm/sdbm_lock.o | Bin 0 -> 10648 bytes .../srclib/apr-util/dbm/sdbm/sdbm_pair.c | 319 + .../srclib/apr-util/dbm/sdbm/sdbm_pair.h | 40 + .../srclib/apr-util/dbm/sdbm/sdbm_pair.lo | 12 + .../srclib/apr-util/dbm/sdbm/sdbm_pair.o | Bin 0 -> 19056 bytes .../srclib/apr-util/dbm/sdbm/sdbm_private.h | 84 + .../srclib/apr-util/dbm/sdbm/sdbm_tune.h | 40 + .../httpd-2.0.64/srclib/apr-util/docs/doxygen.conf | 27 + .../srclib/apr-util/encoding/.libs/apr_base64.o | Bin 0 -> 9640 bytes .../httpd-2.0.64/srclib/apr-util/encoding/Makefile | 8 + .../srclib/apr-util/encoding/Makefile.in | 8 + .../srclib/apr-util/encoding/apr_base64.c | 268 + .../srclib/apr-util/encoding/apr_base64.lo | 12 + .../srclib/apr-util/encoding/apr_base64.o | Bin 0 -> 9992 bytes .../app/httpd-2.0.64/srclib/apr-util/export_vars.h | 20 + .../httpd-2.0.64/srclib/apr-util/export_vars.sh | 13 + .../httpd-2.0.64/srclib/apr-util/export_vars.sh.in | 13 + rubbos/app/httpd-2.0.64/srclib/apr-util/exports.c | 322 + .../srclib/apr-util/hooks/.libs/apr_hooks.o | Bin 0 -> 29096 bytes .../httpd-2.0.64/srclib/apr-util/hooks/Makefile | 8 + .../httpd-2.0.64/srclib/apr-util/hooks/Makefile.in | 8 + .../httpd-2.0.64/srclib/apr-util/hooks/apr_hooks.c | 427 + .../srclib/apr-util/hooks/apr_hooks.lo | 12 + .../httpd-2.0.64/srclib/apr-util/hooks/apr_hooks.o | Bin 0 -> 34704 bytes .../srclib/apr-util/include/apr_anylock.h | 128 + .../srclib/apr-util/include/apr_base64.h | 112 + .../srclib/apr-util/include/apr_buckets.h | 1495 + .../srclib/apr-util/include/apr_date.h | 106 + .../httpd-2.0.64/srclib/apr-util/include/apr_dbm.h | 224 + .../srclib/apr-util/include/apr_hooks.h | 273 + .../srclib/apr-util/include/apr_ldap.h | 176 + .../srclib/apr-util/include/apr_ldap.h.in | 176 + .../srclib/apr-util/include/apr_ldap.hnw | 168 + .../srclib/apr-util/include/apr_ldap.hw | 171 + .../srclib/apr-util/include/apr_ldap_url.h | 84 + .../httpd-2.0.64/srclib/apr-util/include/apr_md4.h | 135 + .../httpd-2.0.64/srclib/apr-util/include/apr_md5.h | 158 + .../srclib/apr-util/include/apr_optional.h | 99 + .../srclib/apr-util/include/apr_optional_hooks.h | 117 + .../srclib/apr-util/include/apr_queue.h | 138 + .../srclib/apr-util/include/apr_reslist.h | 141 + .../httpd-2.0.64/srclib/apr-util/include/apr_rmm.h | 137 + .../srclib/apr-util/include/apr_sdbm.h | 175 + .../srclib/apr-util/include/apr_sha1.h | 121 + .../srclib/apr-util/include/apr_strmatch.h | 81 + .../httpd-2.0.64/srclib/apr-util/include/apr_uri.h | 181 + .../srclib/apr-util/include/apr_uuid.h | 76 + .../srclib/apr-util/include/apr_xlate.h | 158 + .../httpd-2.0.64/srclib/apr-util/include/apr_xml.h | 340 + .../app/httpd-2.0.64/srclib/apr-util/include/apu.h | 85 + .../httpd-2.0.64/srclib/apr-util/include/apu.h.in | 85 + .../httpd-2.0.64/srclib/apr-util/include/apu.hnw | 91 + .../httpd-2.0.64/srclib/apr-util/include/apu.hw | 120 + .../srclib/apr-util/include/apu_compat.h | 116 + .../srclib/apr-util/include/apu_version.h | 105 + .../srclib/apr-util/include/apu_want.h | 50 + .../srclib/apr-util/include/apu_want.h.in | 50 + .../srclib/apr-util/include/apu_want.hnw | 51 + .../srclib/apr-util/include/apu_want.hw | 51 + .../apr-util/include/private/apr_dbm_private.h | 125 + .../srclib/apr-util/include/private/apu_config.h | 89 + .../apr-util/include/private/apu_config.h.in | 88 + .../srclib/apr-util/include/private/apu_config.hw | 38 + .../apr-util/include/private/apu_select_dbm.h | 27 + .../apr-util/include/private/apu_select_dbm.h.in | 27 + .../apr-util/include/private/apu_select_dbm.hw | 31 + .../srclib/apr-util/ldap/.libs/apr_ldap_compat.o | Bin 0 -> 1139 bytes .../srclib/apr-util/ldap/.libs/apr_ldap_url.o | Bin 0 -> 1136 bytes .../app/httpd-2.0.64/srclib/apr-util/ldap/Makefile | 8 + .../httpd-2.0.64/srclib/apr-util/ldap/Makefile.in | 8 + .../srclib/apr-util/ldap/apr_ldap_compat.c | 62 + .../srclib/apr-util/ldap/apr_ldap_compat.lo | 12 + .../srclib/apr-util/ldap/apr_ldap_compat.o | Bin 0 -> 1139 bytes .../srclib/apr-util/ldap/apr_ldap_url.c | 723 + .../srclib/apr-util/ldap/apr_ldap_url.lo | 12 + .../srclib/apr-util/ldap/apr_ldap_url.o | Bin 0 -> 1136 bytes .../httpd-2.0.64/srclib/apr-util/libaprutil-0.la | 35 + .../httpd-2.0.64/srclib/apr-util/libaprutil.dep | 274 + .../httpd-2.0.64/srclib/apr-util/libaprutil.dsp | 617 + .../httpd-2.0.64/srclib/apr-util/libaprutil.mak | 908 + .../app/httpd-2.0.64/srclib/apr-util/libaprutil.rc | 73 + .../srclib/apr-util/misc/.libs/apr_date.o | Bin 0 -> 18976 bytes .../srclib/apr-util/misc/.libs/apr_queue.o | Bin 0 -> 18544 bytes .../srclib/apr-util/misc/.libs/apr_reslist.o | Bin 0 -> 25200 bytes .../srclib/apr-util/misc/.libs/apr_rmm.o | Bin 0 -> 28768 bytes .../srclib/apr-util/misc/.libs/apu_version.o | Bin 0 -> 4016 bytes .../app/httpd-2.0.64/srclib/apr-util/misc/Makefile | 8 + .../httpd-2.0.64/srclib/apr-util/misc/Makefile.in | 8 + .../httpd-2.0.64/srclib/apr-util/misc/apr_date.c | 616 + .../httpd-2.0.64/srclib/apr-util/misc/apr_date.lo | 12 + .../httpd-2.0.64/srclib/apr-util/misc/apr_date.o | Bin 0 -> 18448 bytes .../httpd-2.0.64/srclib/apr-util/misc/apr_queue.c | 392 + .../httpd-2.0.64/srclib/apr-util/misc/apr_queue.lo | 12 + .../httpd-2.0.64/srclib/apr-util/misc/apr_queue.o | Bin 0 -> 18496 bytes .../srclib/apr-util/misc/apr_reslist.c | 375 + .../srclib/apr-util/misc/apr_reslist.lo | 12 + .../srclib/apr-util/misc/apr_reslist.o | Bin 0 -> 25056 bytes .../httpd-2.0.64/srclib/apr-util/misc/apr_rmm.c | 428 + .../httpd-2.0.64/srclib/apr-util/misc/apr_rmm.lo | 12 + .../httpd-2.0.64/srclib/apr-util/misc/apr_rmm.o | Bin 0 -> 29384 bytes .../srclib/apr-util/misc/apu_version.c | 37 + .../srclib/apr-util/misc/apu_version.lo | 12 + .../srclib/apr-util/misc/apu_version.o | Bin 0 -> 3976 bytes .../httpd-2.0.64/srclib/apr-util/renames_pending | 2 + .../srclib/apr-util/strmatch/.libs/apr_strmatch.o | Bin 0 -> 10112 bytes .../httpd-2.0.64/srclib/apr-util/strmatch/Makefile | 8 + .../srclib/apr-util/strmatch/Makefile.in | 8 + .../srclib/apr-util/strmatch/apr_strmatch.c | 118 + .../srclib/apr-util/strmatch/apr_strmatch.lo | 12 + .../srclib/apr-util/strmatch/apr_strmatch.o | Bin 0 -> 10128 bytes .../app/httpd-2.0.64/srclib/apr-util/test/Makefile | 110 + .../httpd-2.0.64/srclib/apr-util/test/Makefile.in | 110 + .../httpd-2.0.64/srclib/apr-util/test/Makefile.win | 125 + .../srclib/apr-util/test/NWGNUmakefile | 265 + .../srclib/apr-util/test/NWGNUtestdate | 254 + .../httpd-2.0.64/srclib/apr-util/test/NWGNUtestdbm | 254 + .../httpd-2.0.64/srclib/apr-util/test/NWGNUtestmd4 | 254 + .../httpd-2.0.64/srclib/apr-util/test/NWGNUtestmd5 | 254 + .../srclib/apr-util/test/NWGNUtestpass | 254 + .../srclib/apr-util/test/NWGNUtestqueue | 254 + .../srclib/apr-util/test/NWGNUtestreslist | 254 + .../httpd-2.0.64/srclib/apr-util/test/NWGNUtestrmm | 254 + .../srclib/apr-util/test/NWGNUteststrmatch | 254 + .../httpd-2.0.64/srclib/apr-util/test/NWGNUtesturi | 254 + .../srclib/apr-util/test/NWGNUtestuuid | 254 + .../srclib/apr-util/test/NWGNUtestxlate | 254 + .../httpd-2.0.64/srclib/apr-util/test/NWGNUtestxml | 254 + .../srclib/apr-util/test/data/billion-laughs.xml | 36 + .../httpd-2.0.64/srclib/apr-util/test/nw_misc.c | 17 + .../httpd-2.0.64/srclib/apr-util/test/test_apu.h | 100 + .../httpd-2.0.64/srclib/apr-util/test/testdate.c | 198 + .../httpd-2.0.64/srclib/apr-util/test/testdbm.c | 425 + .../httpd-2.0.64/srclib/apr-util/test/testmd4.c | 238 + .../httpd-2.0.64/srclib/apr-util/test/testmd5.c | 142 + .../httpd-2.0.64/srclib/apr-util/test/testpass.c | 129 + .../httpd-2.0.64/srclib/apr-util/test/testqueue.c | 282 + .../srclib/apr-util/test/testreslist.c | 232 + .../httpd-2.0.64/srclib/apr-util/test/testrmm.c | 281 + .../srclib/apr-util/test/teststrmatch.c | 132 + .../httpd-2.0.64/srclib/apr-util/test/testuri.c | 278 + .../httpd-2.0.64/srclib/apr-util/test/testuuid.c | 58 + .../httpd-2.0.64/srclib/apr-util/test/testxlate.c | 118 + .../httpd-2.0.64/srclib/apr-util/test/testxml.c | 287 + .../srclib/apr-util/uri/.libs/apr_uri.o | Bin 0 -> 24000 bytes .../srclib/apr-util/uri/.libs/gen_uri_delims.o | Bin 0 -> 10888 bytes .../app/httpd-2.0.64/srclib/apr-util/uri/Makefile | 18 + .../httpd-2.0.64/srclib/apr-util/uri/Makefile.in | 18 + .../httpd-2.0.64/srclib/apr-util/uri/NWGNUmakefile | 258 + .../app/httpd-2.0.64/srclib/apr-util/uri/apr_uri.c | 412 + .../httpd-2.0.64/srclib/apr-util/uri/apr_uri.lo | 12 + .../app/httpd-2.0.64/srclib/apr-util/uri/apr_uri.o | Bin 0 -> 23280 bytes .../srclib/apr-util/uri/gen_uri_delims | Bin 0 -> 12650 bytes .../srclib/apr-util/uri/gen_uri_delims.c | 47 + .../srclib/apr-util/uri/gen_uri_delims.dep | 2 + .../srclib/apr-util/uri/gen_uri_delims.dsp | 94 + .../srclib/apr-util/uri/gen_uri_delims.lo | 12 + .../srclib/apr-util/uri/gen_uri_delims.mak | 183 + .../srclib/apr-util/uri/gen_uri_delims.o | Bin 0 -> 10504 bytes .../httpd-2.0.64/srclib/apr-util/uri/uri_delims.h | 16 + .../srclib/apr-util/xlate/.libs/xlate.o | Bin 0 -> 21216 bytes .../httpd-2.0.64/srclib/apr-util/xlate/Makefile | 11 + .../httpd-2.0.64/srclib/apr-util/xlate/Makefile.in | 11 + .../app/httpd-2.0.64/srclib/apr-util/xlate/xlate.c | 464 + .../httpd-2.0.64/srclib/apr-util/xlate/xlate.lo | 12 + .../app/httpd-2.0.64/srclib/apr-util/xlate/xlate.o | Bin 0 -> 21120 bytes .../srclib/apr-util/xml/.libs/apr_xml.o | Bin 0 -> 59520 bytes .../app/httpd-2.0.64/srclib/apr-util/xml/Makefile | 10 + .../httpd-2.0.64/srclib/apr-util/xml/Makefile.in | 10 + .../httpd-2.0.64/srclib/apr-util/xml/NWGNUmakefile | 261 + .../app/httpd-2.0.64/srclib/apr-util/xml/apr_xml.c | 920 + .../httpd-2.0.64/srclib/apr-util/xml/apr_xml.lo | 12 + .../app/httpd-2.0.64/srclib/apr-util/xml/apr_xml.o | Bin 0 -> 58656 bytes .../srclib/apr-util/xml/expat/.libs/libexpat.a | Bin 0 -> 804898 bytes .../srclib/apr-util/xml/expat/.libs/libexpat.la | 35 + .../srclib/apr-util/xml/expat/.libs/libexpat.lai | 35 + .../srclib/apr-util/xml/expat/.libs/libexpat.so | Bin 0 -> 513838 bytes .../srclib/apr-util/xml/expat/.libs/libexpat.so.0 | Bin 0 -> 513838 bytes .../apr-util/xml/expat/.libs/libexpat.so.0.5.0 | Bin 0 -> 513838 bytes .../httpd-2.0.64/srclib/apr-util/xml/expat/COPYING | 22 + .../srclib/apr-util/xml/expat/Makefile | 113 + .../srclib/apr-util/xml/expat/Makefile.in | 113 + .../httpd-2.0.64/srclib/apr-util/xml/expat/README | 119 + .../srclib/apr-util/xml/expat/buildconf.sh | 78 + .../srclib/apr-util/xml/expat/config.log | 1017 + .../srclib/apr-util/xml/expat/config.status | 1006 + .../srclib/apr-util/xml/expat/configure | 22597 ++++++++++ .../srclib/apr-util/xml/expat/configure.in | 99 + .../srclib/apr-util/xml/expat/conftools/PrintPath | 116 + .../xml/expat/conftools/ac_c_bigendian_cross.m4 | 81 + .../apr-util/xml/expat/conftools/config.guess | 1502 + .../srclib/apr-util/xml/expat/conftools/config.sub | 1731 + .../srclib/apr-util/xml/expat/conftools/install-sh | 251 + .../srclib/apr-util/xml/expat/conftools/ltmain.sh | 6956 +++ .../apr-util/xml/expat/conftools/mkinstalldirs | 40 + .../srclib/apr-util/xml/expat/expat_config.h | 93 + .../srclib/apr-util/xml/expat/expat_config.h.in | 92 + .../srclib/apr-util/xml/expat/lib/.libs/xmlparse.o | Bin 0 -> 271432 bytes .../srclib/apr-util/xml/expat/lib/.libs/xmlrole.o | Bin 0 -> 83432 bytes .../srclib/apr-util/xml/expat/lib/.libs/xmltok.o | Bin 0 -> 423856 bytes .../srclib/apr-util/xml/expat/lib/ascii.h | 85 + .../srclib/apr-util/xml/expat/lib/asciitab.h | 36 + .../srclib/apr-util/xml/expat/lib/expat.dsp | 227 + .../srclib/apr-util/xml/expat/lib/expat.h | 1001 + .../srclib/apr-util/xml/expat/lib/expat_config.hnw | 25 + .../srclib/apr-util/xml/expat/lib/iasciitab.h | 37 + .../srclib/apr-util/xml/expat/lib/internal.h | 73 + .../srclib/apr-util/xml/expat/lib/latin1tab.h | 36 + .../srclib/apr-util/xml/expat/lib/nametab.h | 150 + .../srclib/apr-util/xml/expat/lib/utf8tab.h | 37 + .../srclib/apr-util/xml/expat/lib/winconfig.h | 30 + .../srclib/apr-util/xml/expat/lib/xml.dep | 45 + .../srclib/apr-util/xml/expat/lib/xml.dsp | 214 + .../srclib/apr-util/xml/expat/lib/xml.mak | 258 + .../srclib/apr-util/xml/expat/lib/xmlparse.c | 5817 +++ .../srclib/apr-util/xml/expat/lib/xmlparse.lo | 12 + .../srclib/apr-util/xml/expat/lib/xmlparse.o | Bin 0 -> 272664 bytes .../srclib/apr-util/xml/expat/lib/xmlrole.c | 1323 + .../srclib/apr-util/xml/expat/lib/xmlrole.h | 114 + .../srclib/apr-util/xml/expat/lib/xmlrole.lo | 12 + .../srclib/apr-util/xml/expat/lib/xmlrole.o | Bin 0 -> 86432 bytes .../srclib/apr-util/xml/expat/lib/xmltok.c | 1634 + .../srclib/apr-util/xml/expat/lib/xmltok.h | 315 + .../srclib/apr-util/xml/expat/lib/xmltok.lo | 12 + .../srclib/apr-util/xml/expat/lib/xmltok.o | Bin 0 -> 443464 bytes .../srclib/apr-util/xml/expat/lib/xmltok_impl.c | 1779 + .../srclib/apr-util/xml/expat/lib/xmltok_impl.h | 46 + .../srclib/apr-util/xml/expat/lib/xmltok_ns.c | 106 + .../srclib/apr-util/xml/expat/libexpat.la | 35 + .../httpd-2.0.64/srclib/apr-util/xml/expat/libtool | 7621 ++++ .../srclib/apr-util/xml/expat/win32/MANIFEST.txt | 29 + .../srclib/apr-util/xml/expat/win32/expat.iss | 62 + .../app/httpd-2.0.64/srclib/apr/.libs/libapr-0.a | Bin 0 -> 1237804 bytes .../app/httpd-2.0.64/srclib/apr/.libs/libapr-0.la | 35 + .../app/httpd-2.0.64/srclib/apr/.libs/libapr-0.lai | 35 + .../app/httpd-2.0.64/srclib/apr/.libs/libapr-0.so | Bin 0 -> 708933 bytes .../httpd-2.0.64/srclib/apr/.libs/libapr-0.so.0 | Bin 0 -> 708933 bytes .../srclib/apr/.libs/libapr-0.so.0.9.19 | Bin 0 -> 708933 bytes rubbos/app/httpd-2.0.64/srclib/apr/CHANGES | 1909 + rubbos/app/httpd-2.0.64/srclib/apr/LICENSE | 370 + rubbos/app/httpd-2.0.64/srclib/apr/Makefile | 149 + rubbos/app/httpd-2.0.64/srclib/apr/Makefile.in | 149 + rubbos/app/httpd-2.0.64/srclib/apr/NOTICE | 15 + rubbos/app/httpd-2.0.64/srclib/apr/NWGNUmakefile | 440 + rubbos/app/httpd-2.0.64/srclib/apr/README.dev | 15 + rubbos/app/httpd-2.0.64/srclib/apr/acconfig.h | 50 + rubbos/app/httpd-2.0.64/srclib/apr/apr-config | 249 + rubbos/app/httpd-2.0.64/srclib/apr/apr-config.in | 249 + rubbos/app/httpd-2.0.64/srclib/apr/apr-config.out | 249 + rubbos/app/httpd-2.0.64/srclib/apr/apr.dsp | 631 + rubbos/app/httpd-2.0.64/srclib/apr/apr.dsw | 71 + rubbos/app/httpd-2.0.64/srclib/apr/apr.exp | 419 + .../srclib/apr/atomic/netware/apr_atomic.c | 26 + .../srclib/apr/atomic/os390/Makefile.in | 14 + .../httpd-2.0.64/srclib/apr/atomic/os390/atomic.c | 44 + .../srclib/apr/atomic/unix/.libs/apr_atomic.o | Bin 0 -> 11888 bytes .../httpd-2.0.64/srclib/apr/atomic/unix/Makefile | 13 + .../srclib/apr/atomic/unix/Makefile.in | 13 + .../srclib/apr/atomic/unix/apr_atomic.c | 173 + .../srclib/apr/atomic/unix/apr_atomic.lo | 12 + .../srclib/apr/atomic/unix/apr_atomic.o | Bin 0 -> 11832 bytes rubbos/app/httpd-2.0.64/srclib/apr/build/MakeEtags | 39 + rubbos/app/httpd-2.0.64/srclib/apr/build/Makefile | 12 + .../app/httpd-2.0.64/srclib/apr/build/Makefile.in | 12 + .../srclib/apr/build/NWGNUenvironment.inc | 302 + .../httpd-2.0.64/srclib/apr/build/NWGNUhead.inc | 96 + .../httpd-2.0.64/srclib/apr/build/NWGNUmakefile | 107 + .../httpd-2.0.64/srclib/apr/build/NWGNUtail.inc | 323 + rubbos/app/httpd-2.0.64/srclib/apr/build/PrintPath | 130 + .../app/httpd-2.0.64/srclib/apr/build/aplibtool.c | 751 + .../app/httpd-2.0.64/srclib/apr/build/apr_app.dsp | 89 + .../httpd-2.0.64/srclib/apr/build/apr_common.m4 | 993 + .../app/httpd-2.0.64/srclib/apr/build/apr_hints.m4 | 439 + .../httpd-2.0.64/srclib/apr/build/apr_network.m4 | 724 + .../app/httpd-2.0.64/srclib/apr/build/apr_rules.mk | 194 + .../httpd-2.0.64/srclib/apr/build/apr_rules.mk.in | 194 + .../httpd-2.0.64/srclib/apr/build/apr_rules.out | 194 + .../httpd-2.0.64/srclib/apr/build/apr_threads.m4 | 267 + .../httpd-2.0.64/srclib/apr/build/buildcheck.sh | 60 + .../app/httpd-2.0.64/srclib/apr/build/config.guess | 1502 + .../app/httpd-2.0.64/srclib/apr/build/config.sub | 1731 + rubbos/app/httpd-2.0.64/srclib/apr/build/cvtdsp.pl | 605 + .../app/httpd-2.0.64/srclib/apr/build/find_apr.m4 | 104 + .../httpd-2.0.64/srclib/apr/build/fixwin32mak.pl | 81 + .../httpd-2.0.64/srclib/apr/build/get-version.sh | 37 + .../app/httpd-2.0.64/srclib/apr/build/install.sh | 112 + .../httpd-2.0.64/srclib/apr/build/libapr_app.dsp | 93 + .../app/httpd-2.0.64/srclib/apr/build/libtool.m4 | 6659 +++ .../app/httpd-2.0.64/srclib/apr/build/lineends.pl | 150 + rubbos/app/httpd-2.0.64/srclib/apr/build/ltmain.sh | 6956 +++ .../httpd-2.0.64/srclib/apr/build/make_exports.awk | 150 + .../srclib/apr/build/make_nw_export.awk | 78 + .../srclib/apr/build/make_var_export.awk | 59 + rubbos/app/httpd-2.0.64/srclib/apr/build/mkdir.sh | 37 + .../httpd-2.0.64/srclib/apr/build/nw_export.inc | 82 + .../app/httpd-2.0.64/srclib/apr/build/nw_ver.awk | 40 + .../app/httpd-2.0.64/srclib/apr/build/pkg/README | 17 + .../httpd-2.0.64/srclib/apr/build/pkg/buildpkg.sh | 72 + .../app/httpd-2.0.64/srclib/apr/build/pkg/pkginfo | 11 + .../httpd-2.0.64/srclib/apr/build/pkg/pkginfo.in | 11 + .../httpd-2.0.64/srclib/apr/build/prebuildNW.bat | 48 + .../httpd-2.0.64/srclib/apr/build/rpm/apr.spec.in | 105 + .../app/httpd-2.0.64/srclib/apr/build/win32ver.awk | 117 + rubbos/app/httpd-2.0.64/srclib/apr/buildconf | 91 + rubbos/app/httpd-2.0.64/srclib/apr/config.layout | 231 + rubbos/app/httpd-2.0.64/srclib/apr/config.log | 12911 ++++++ rubbos/app/httpd-2.0.64/srclib/apr/config.nice | 19 + rubbos/app/httpd-2.0.64/srclib/apr/config.status | 1357 + rubbos/app/httpd-2.0.64/srclib/apr/configure | 44615 +++++++++++++++++++ rubbos/app/httpd-2.0.64/srclib/apr/configure.in | 1998 + .../httpd-2.0.64/srclib/apr/docs/APRDesign.html | 399 + .../srclib/apr/docs/canonical_filenames.html | 156 + .../app/httpd-2.0.64/srclib/apr/docs/doxygen.conf | 33 + .../httpd-2.0.64/srclib/apr/docs/incomplete_types | 84 + .../httpd-2.0.64/srclib/apr/docs/non_apr_programs | 47 + .../httpd-2.0.64/srclib/apr/docs/pool-design.html | 100 + .../httpd-2.0.64/srclib/apr/docs/win32_builds.html | 57 + .../httpd-2.0.64/srclib/apr/dso/aix/Makefile.in | 14 + rubbos/app/httpd-2.0.64/srclib/apr/dso/aix/dso.c | 714 + .../httpd-2.0.64/srclib/apr/dso/beos/Makefile.in | 13 + rubbos/app/httpd-2.0.64/srclib/apr/dso/beos/dso.c | 95 + .../app/httpd-2.0.64/srclib/apr/dso/netware/dso.c | 137 + .../httpd-2.0.64/srclib/apr/dso/os2/Makefile.in | 14 + rubbos/app/httpd-2.0.64/srclib/apr/dso/os2/dso.c | 132 + .../httpd-2.0.64/srclib/apr/dso/os390/Makefile.in | 14 + rubbos/app/httpd-2.0.64/srclib/apr/dso/os390/dso.c | 109 + .../httpd-2.0.64/srclib/apr/dso/unix/.libs/dso.o | Bin 0 -> 13312 bytes .../app/httpd-2.0.64/srclib/apr/dso/unix/Makefile | 14 + .../httpd-2.0.64/srclib/apr/dso/unix/Makefile.in | 14 + rubbos/app/httpd-2.0.64/srclib/apr/dso/unix/dso.c | 250 + rubbos/app/httpd-2.0.64/srclib/apr/dso/unix/dso.lo | 12 + rubbos/app/httpd-2.0.64/srclib/apr/dso/unix/dso.o | Bin 0 -> 13248 bytes rubbos/app/httpd-2.0.64/srclib/apr/dso/win32/dso.c | 167 + rubbos/app/httpd-2.0.64/srclib/apr/export_vars.c | 2 + rubbos/app/httpd-2.0.64/srclib/apr/exports.c | 659 + .../srclib/apr/file_io/netware/filepath.c | 4 + .../srclib/apr/file_io/netware/filestat.c | 421 + .../srclib/apr/file_io/netware/filesys.c | 106 + .../srclib/apr/file_io/netware/flock.c | 39 + .../srclib/apr/file_io/netware/mktemp.c | 54 + .../httpd-2.0.64/srclib/apr/file_io/netware/pipe.c | 185 + .../srclib/apr/file_io/os2/Makefile.in | 31 + .../app/httpd-2.0.64/srclib/apr/file_io/os2/copy.c | 1 + .../app/httpd-2.0.64/srclib/apr/file_io/os2/dir.c | 175 + .../httpd-2.0.64/srclib/apr/file_io/os2/fileacc.c | 18 + .../httpd-2.0.64/srclib/apr/file_io/os2/filedup.c | 124 + .../httpd-2.0.64/srclib/apr/file_io/os2/filepath.c | 16 + .../srclib/apr/file_io/os2/filepath_util.c | 1 + .../httpd-2.0.64/srclib/apr/file_io/os2/filestat.c | 237 + .../httpd-2.0.64/srclib/apr/file_io/os2/filesys.c | 148 + .../httpd-2.0.64/srclib/apr/file_io/os2/flock.c | 37 + .../httpd-2.0.64/srclib/apr/file_io/os2/fullrw.c | 1 + .../srclib/apr/file_io/os2/maperrorcode.c | 95 + .../httpd-2.0.64/srclib/apr/file_io/os2/mktemp.c | 1 + .../app/httpd-2.0.64/srclib/apr/file_io/os2/open.c | 244 + .../app/httpd-2.0.64/srclib/apr/file_io/os2/pipe.c | 177 + .../srclib/apr/file_io/os2/readwrite.c | 370 + .../app/httpd-2.0.64/srclib/apr/file_io/os2/seek.c | 119 + .../httpd-2.0.64/srclib/apr/file_io/os2/tempdir.c | 1 + .../srclib/apr/file_io/unix/.libs/copy.o | Bin 0 -> 15048 bytes .../srclib/apr/file_io/unix/.libs/dir.o | Bin 0 -> 25576 bytes .../srclib/apr/file_io/unix/.libs/fileacc.o | Bin 0 -> 10544 bytes .../srclib/apr/file_io/unix/.libs/filedup.o | Bin 0 -> 15712 bytes .../srclib/apr/file_io/unix/.libs/filepath.o | Bin 0 -> 20008 bytes .../srclib/apr/file_io/unix/.libs/filepath_util.o | Bin 0 -> 10088 bytes .../srclib/apr/file_io/unix/.libs/filestat.o | Bin 0 -> 23928 bytes .../srclib/apr/file_io/unix/.libs/flock.o | Bin 0 -> 9552 bytes .../srclib/apr/file_io/unix/.libs/fullrw.o | Bin 0 -> 8576 bytes .../srclib/apr/file_io/unix/.libs/mktemp.o | Bin 0 -> 9416 bytes .../srclib/apr/file_io/unix/.libs/open.o | Bin 0 -> 25744 bytes .../srclib/apr/file_io/unix/.libs/pipe.o | Bin 0 -> 17960 bytes .../srclib/apr/file_io/unix/.libs/readwrite.o | Bin 0 -> 28144 bytes .../srclib/apr/file_io/unix/.libs/seek.o | Bin 0 -> 14400 bytes .../srclib/apr/file_io/unix/.libs/tempdir.o | Bin 0 -> 14232 bytes .../httpd-2.0.64/srclib/apr/file_io/unix/Makefile | 29 + .../srclib/apr/file_io/unix/Makefile.in | 29 + .../httpd-2.0.64/srclib/apr/file_io/unix/copy.c | 131 + .../httpd-2.0.64/srclib/apr/file_io/unix/copy.lo | 12 + .../httpd-2.0.64/srclib/apr/file_io/unix/copy.o | Bin 0 -> 15024 bytes .../app/httpd-2.0.64/srclib/apr/file_io/unix/dir.c | 323 + .../httpd-2.0.64/srclib/apr/file_io/unix/dir.lo | 12 + .../app/httpd-2.0.64/srclib/apr/file_io/unix/dir.o | Bin 0 -> 25544 bytes .../httpd-2.0.64/srclib/apr/file_io/unix/fileacc.c | 119 + .../srclib/apr/file_io/unix/fileacc.lo | 12 + .../httpd-2.0.64/srclib/apr/file_io/unix/fileacc.o | Bin 0 -> 10488 bytes .../httpd-2.0.64/srclib/apr/file_io/unix/filedup.c | 149 + .../srclib/apr/file_io/unix/filedup.lo | 12 + .../httpd-2.0.64/srclib/apr/file_io/unix/filedup.o | Bin 0 -> 15560 bytes .../srclib/apr/file_io/unix/filepath.c | 314 + .../srclib/apr/file_io/unix/filepath.lo | 12 + .../srclib/apr/file_io/unix/filepath.o | Bin 0 -> 19872 bytes .../srclib/apr/file_io/unix/filepath_util.c | 111 + .../srclib/apr/file_io/unix/filepath_util.lo | 12 + .../srclib/apr/file_io/unix/filepath_util.o | Bin 0 -> 10024 bytes .../srclib/apr/file_io/unix/filestat.c | 311 + .../srclib/apr/file_io/unix/filestat.lo | 12 + .../srclib/apr/file_io/unix/filestat.o | Bin 0 -> 23824 bytes .../httpd-2.0.64/srclib/apr/file_io/unix/flock.c | 120 + .../httpd-2.0.64/srclib/apr/file_io/unix/flock.lo | 12 + .../httpd-2.0.64/srclib/apr/file_io/unix/flock.o | Bin 0 -> 9472 bytes .../httpd-2.0.64/srclib/apr/file_io/unix/fullrw.c | 63 + .../httpd-2.0.64/srclib/apr/file_io/unix/fullrw.lo | 12 + .../httpd-2.0.64/srclib/apr/file_io/unix/fullrw.o | Bin 0 -> 8480 bytes .../httpd-2.0.64/srclib/apr/file_io/unix/mktemp.c | 208 + .../httpd-2.0.64/srclib/apr/file_io/unix/mktemp.lo | 12 + .../httpd-2.0.64/srclib/apr/file_io/unix/mktemp.o | Bin 0 -> 9352 bytes .../httpd-2.0.64/srclib/apr/file_io/unix/open.c | 303 + .../httpd-2.0.64/srclib/apr/file_io/unix/open.lo | 12 + .../httpd-2.0.64/srclib/apr/file_io/unix/open.o | Bin 0 -> 25672 bytes .../httpd-2.0.64/srclib/apr/file_io/unix/pipe.c | 227 + .../httpd-2.0.64/srclib/apr/file_io/unix/pipe.lo | 12 + .../httpd-2.0.64/srclib/apr/file_io/unix/pipe.o | Bin 0 -> 17896 bytes .../srclib/apr/file_io/unix/readwrite.c | 387 + .../srclib/apr/file_io/unix/readwrite.lo | 12 + .../srclib/apr/file_io/unix/readwrite.o | Bin 0 -> 28096 bytes .../httpd-2.0.64/srclib/apr/file_io/unix/seek.c | 105 + .../httpd-2.0.64/srclib/apr/file_io/unix/seek.lo | 12 + .../httpd-2.0.64/srclib/apr/file_io/unix/seek.o | Bin 0 -> 14360 bytes .../httpd-2.0.64/srclib/apr/file_io/unix/tempdir.c | 136 + .../srclib/apr/file_io/unix/tempdir.lo | 12 + .../httpd-2.0.64/srclib/apr/file_io/unix/tempdir.o | Bin 0 -> 13528 bytes .../httpd-2.0.64/srclib/apr/file_io/win32/dir.c | 393 + .../srclib/apr/file_io/win32/filedup.c | 216 + .../srclib/apr/file_io/win32/filepath.c | 985 + .../srclib/apr/file_io/win32/filestat.c | 767 + .../srclib/apr/file_io/win32/filesys.c | 229 + .../httpd-2.0.64/srclib/apr/file_io/win32/flock.c | 86 + .../httpd-2.0.64/srclib/apr/file_io/win32/open.c | 628 + .../httpd-2.0.64/srclib/apr/file_io/win32/pipe.c | 235 + .../srclib/apr/file_io/win32/readwrite.c | 524 + .../httpd-2.0.64/srclib/apr/file_io/win32/seek.c | 171 + .../httpd-2.0.64/srclib/apr/images/ScanDocBig.jpg | Bin 0 -> 5319 bytes .../srclib/apr/images/ScanDocSmall.jpg | Bin 0 -> 2382 bytes .../app/httpd-2.0.64/srclib/apr/images/ball1.gif | Bin 0 -> 1012 bytes .../app/httpd-2.0.64/srclib/apr/images/ball1.png | Bin 0 -> 499 bytes .../app/httpd-2.0.64/srclib/apr/images/ball2.gif | Bin 0 -> 1014 bytes .../app/httpd-2.0.64/srclib/apr/images/ball2.png | Bin 0 -> 436 bytes rubbos/app/httpd-2.0.64/srclib/apr/images/bug.gif | Bin 0 -> 1040 bytes rubbos/app/httpd-2.0.64/srclib/apr/images/bug.png | Bin 0 -> 383 bytes .../app/httpd-2.0.64/srclib/apr/images/caution.gif | Bin 0 -> 923 bytes .../app/httpd-2.0.64/srclib/apr/images/caution.png | Bin 0 -> 217 bytes .../app/httpd-2.0.64/srclib/apr/images/master.gif | Bin 0 -> 3955 bytes .../app/httpd-2.0.64/srclib/apr/images/master.png | Bin 0 -> 3371 bytes rubbos/app/httpd-2.0.64/srclib/apr/images/tip.gif | Bin 0 -> 1018 bytes rubbos/app/httpd-2.0.64/srclib/apr/images/tip.png | Bin 0 -> 331 bytes .../app/httpd-2.0.64/srclib/apr/images/warning.gif | Bin 0 -> 923 bytes .../app/httpd-2.0.64/srclib/apr/images/warning.png | Bin 0 -> 217 bytes rubbos/app/httpd-2.0.64/srclib/apr/include/apr.h | 414 + .../app/httpd-2.0.64/srclib/apr/include/apr.h.in | 414 + .../app/httpd-2.0.64/srclib/apr/include/apr.h.save | 414 + rubbos/app/httpd-2.0.64/srclib/apr/include/apr.hnw | 348 + rubbos/app/httpd-2.0.64/srclib/apr/include/apr.hw | 541 + .../srclib/apr/include/apr_allocator.h | 170 + .../httpd-2.0.64/srclib/apr/include/apr_atomic.h | 314 + .../httpd-2.0.64/srclib/apr/include/apr_compat.h | 231 + .../app/httpd-2.0.64/srclib/apr/include/apr_dso.h | 94 + .../app/httpd-2.0.64/srclib/apr/include/apr_env.h | 67 + .../httpd-2.0.64/srclib/apr/include/apr_errno.h | 1219 + .../srclib/apr/include/apr_file_info.h | 421 + .../httpd-2.0.64/srclib/apr/include/apr_file_io.h | 766 + .../httpd-2.0.64/srclib/apr/include/apr_fnmatch.h | 105 + .../httpd-2.0.64/srclib/apr/include/apr_general.h | 249 + .../httpd-2.0.64/srclib/apr/include/apr_getopt.h | 158 + .../srclib/apr/include/apr_global_mutex.h | 153 + .../app/httpd-2.0.64/srclib/apr/include/apr_hash.h | 201 + .../httpd-2.0.64/srclib/apr/include/apr_inherit.h | 51 + .../app/httpd-2.0.64/srclib/apr/include/apr_lib.h | 228 + .../app/httpd-2.0.64/srclib/apr/include/apr_mmap.h | 193 + .../srclib/apr/include/apr_network_io.h | 845 + .../app/httpd-2.0.64/srclib/apr/include/apr_poll.h | 253 + .../httpd-2.0.64/srclib/apr/include/apr_pools.h | 664 + .../httpd-2.0.64/srclib/apr/include/apr_portable.h | 505 + .../srclib/apr/include/apr_proc_mutex.h | 166 + .../app/httpd-2.0.64/srclib/apr/include/apr_ring.h | 551 + .../app/httpd-2.0.64/srclib/apr/include/apr_shm.h | 127 + .../httpd-2.0.64/srclib/apr/include/apr_signal.h | 98 + .../httpd-2.0.64/srclib/apr/include/apr_strings.h | 337 + .../httpd-2.0.64/srclib/apr/include/apr_support.h | 51 + .../httpd-2.0.64/srclib/apr/include/apr_tables.h | 422 + .../srclib/apr/include/apr_thread_cond.h | 128 + .../srclib/apr/include/apr_thread_mutex.h | 110 + .../srclib/apr/include/apr_thread_proc.h | 772 + .../srclib/apr/include/apr_thread_rwlock.h | 120 + .../app/httpd-2.0.64/srclib/apr/include/apr_time.h | 245 + .../app/httpd-2.0.64/srclib/apr/include/apr_user.h | 195 + .../httpd-2.0.64/srclib/apr/include/apr_version.h | 115 + .../app/httpd-2.0.64/srclib/apr/include/apr_want.h | 109 + .../srclib/apr/include/arch/aix/apr_arch_dso.h | 41 + .../srclib/apr/include/arch/apr_private_common.h | 37 + .../srclib/apr/include/arch/beos/apr_arch_dso.h | 38 + .../apr/include/arch/beos/apr_arch_proc_mutex.h | 36 + .../apr/include/arch/beos/apr_arch_thread_cond.h | 46 + .../apr/include/arch/beos/apr_arch_thread_mutex.h | 42 + .../apr/include/arch/beos/apr_arch_thread_rwlock.h | 45 + .../apr/include/arch/beos/apr_arch_threadproc.h | 95 + .../srclib/apr/include/arch/netware/apr_arch_dso.h | 43 + .../apr/include/arch/netware/apr_arch_file_io.h | 159 + .../include/arch/netware/apr_arch_global_mutex.h | 29 + .../include/arch/netware/apr_arch_internal_time.h | 26 + .../apr/include/arch/netware/apr_arch_networkio.h | 27 + .../apr/include/arch/netware/apr_arch_pre_nw.h | 67 + .../apr/include/arch/netware/apr_arch_proc_mutex.h | 29 + .../include/arch/netware/apr_arch_thread_cond.h | 29 + .../include/arch/netware/apr_arch_thread_mutex.h | 29 + .../include/arch/netware/apr_arch_thread_rwlock.h | 29 + .../apr/include/arch/netware/apr_arch_threadproc.h | 78 + .../srclib/apr/include/arch/netware/apr_private.h | 175 + .../srclib/apr/include/arch/os2/apr_arch_dso.h | 37 + .../srclib/apr/include/arch/os2/apr_arch_file_io.h | 80 + .../apr/include/arch/os2/apr_arch_networkio.h | 71 + .../apr/include/arch/os2/apr_arch_os2calls.h | 59 + .../apr/include/arch/os2/apr_arch_proc_mutex.h | 31 + .../apr/include/arch/os2/apr_arch_thread_cond.h | 28 + .../apr/include/arch/os2/apr_arch_thread_mutex.h | 29 + .../apr/include/arch/os2/apr_arch_thread_rwlock.h | 31 + .../apr/include/arch/os2/apr_arch_threadproc.h | 67 + .../srclib/apr/include/arch/os390/apr_arch_dso.h | 39 + .../srclib/apr/include/arch/unix/apr_arch_dso.h | 62 + .../apr/include/arch/unix/apr_arch_file_io.h | 140 + .../apr/include/arch/unix/apr_arch_global_mutex.h | 37 + .../apr/include/arch/unix/apr_arch_inherit.h | 62 + .../apr/include/arch/unix/apr_arch_internal_time.h | 24 + .../srclib/apr/include/arch/unix/apr_arch_misc.h | 67 + .../apr/include/arch/unix/apr_arch_networkio.h | 134 + .../apr/include/arch/unix/apr_arch_proc_mutex.h | 130 + .../srclib/apr/include/arch/unix/apr_arch_shm.h | 70 + .../apr/include/arch/unix/apr_arch_thread_cond.h | 42 + .../apr/include/arch/unix/apr_arch_thread_mutex.h | 39 + .../apr/include/arch/unix/apr_arch_thread_rwlock.h | 49 + .../apr/include/arch/unix/apr_arch_threadproc.h | 104 + .../srclib/apr/include/arch/unix/apr_private.h | 743 + .../srclib/apr/include/arch/unix/apr_private.h.in | 742 + .../apr/include/arch/unix/apr_private.h.save | 743 + .../srclib/apr/include/arch/win32/apr_arch_atime.h | 63 + .../srclib/apr/include/arch/win32/apr_arch_dso.h | 36 + .../apr/include/arch/win32/apr_arch_file_io.h | 276 + .../apr/include/arch/win32/apr_arch_inherit.h | 133 + .../srclib/apr/include/arch/win32/apr_arch_misc.h | 324 + .../apr/include/arch/win32/apr_arch_networkio.h | 80 + .../apr/include/arch/win32/apr_arch_proc_mutex.h | 29 + .../apr/include/arch/win32/apr_arch_thread_cond.h | 31 + .../apr/include/arch/win32/apr_arch_thread_mutex.h | 40 + .../include/arch/win32/apr_arch_thread_rwlock.h | 30 + .../apr/include/arch/win32/apr_arch_threadproc.h | 69 + .../srclib/apr/include/arch/win32/apr_arch_utf8.h | 56 + .../apr/include/arch/win32/apr_dbg_win32_handles.h | 217 + .../srclib/apr/include/arch/win32/apr_private.h | 151 + rubbos/app/httpd-2.0.64/srclib/apr/libapr-0.la | 35 + rubbos/app/httpd-2.0.64/srclib/apr/libapr.dsp | 653 + rubbos/app/httpd-2.0.64/srclib/apr/libapr.rc | 73 + .../app/httpd-2.0.64/srclib/apr/libaprnw.mcp.zip | Bin 0 -> 171800 bytes rubbos/app/httpd-2.0.64/srclib/apr/libtool | 7621 ++++ .../httpd-2.0.64/srclib/apr/locks/beos/Makefile.in | 16 + .../srclib/apr/locks/beos/proc_mutex.c | 169 + .../srclib/apr/locks/beos/thread_cond.c | 190 + .../srclib/apr/locks/beos/thread_mutex.c | 147 + .../srclib/apr/locks/beos/thread_rwlock.c | 190 + .../srclib/apr/locks/netware/proc_mutex.c | 118 + .../srclib/apr/locks/netware/thread_cond.c | 100 + .../srclib/apr/locks/netware/thread_mutex.c | 92 + .../srclib/apr/locks/netware/thread_rwlock.c | 102 + .../httpd-2.0.64/srclib/apr/locks/os2/Makefile.in | 18 + .../httpd-2.0.64/srclib/apr/locks/os2/proc_mutex.c | 234 + .../srclib/apr/locks/os2/thread_cond.c | 60 + .../srclib/apr/locks/os2/thread_mutex.c | 102 + .../srclib/apr/locks/os2/thread_rwlock.c | 200 + .../srclib/apr/locks/unix/.libs/global_mutex.o | Bin 0 -> 18376 bytes .../srclib/apr/locks/unix/.libs/proc_mutex.o | Bin 0 -> 49568 bytes .../srclib/apr/locks/unix/.libs/thread_cond.o | Bin 0 -> 15904 bytes .../srclib/apr/locks/unix/.libs/thread_mutex.o | Bin 0 -> 14992 bytes .../srclib/apr/locks/unix/.libs/thread_rwlock.o | Bin 0 -> 12440 bytes .../httpd-2.0.64/srclib/apr/locks/unix/Makefile | 19 + .../httpd-2.0.64/srclib/apr/locks/unix/Makefile.in | 19 + .../srclib/apr/locks/unix/global_mutex.c | 178 + .../srclib/apr/locks/unix/global_mutex.lo | 12 + .../srclib/apr/locks/unix/global_mutex.o | Bin 0 -> 18336 bytes .../srclib/apr/locks/unix/proc_mutex.c | 894 + .../srclib/apr/locks/unix/proc_mutex.lo | 12 + .../srclib/apr/locks/unix/proc_mutex.o | Bin 0 -> 48904 bytes .../srclib/apr/locks/unix/thread_cond.c | 152 + .../srclib/apr/locks/unix/thread_cond.lo | 12 + .../srclib/apr/locks/unix/thread_cond.o | Bin 0 -> 15896 bytes .../srclib/apr/locks/unix/thread_mutex.c | 138 + .../srclib/apr/locks/unix/thread_mutex.lo | 12 + .../srclib/apr/locks/unix/thread_mutex.o | Bin 0 -> 14856 bytes .../srclib/apr/locks/unix/thread_rwlock.c | 198 + .../srclib/apr/locks/unix/thread_rwlock.lo | 12 + .../srclib/apr/locks/unix/thread_rwlock.o | Bin 0 -> 12432 bytes .../srclib/apr/locks/win32/proc_mutex.c | 223 + .../srclib/apr/locks/win32/thread_cond.c | 128 + .../srclib/apr/locks/win32/thread_mutex.c | 136 + .../srclib/apr/locks/win32/thread_rwlock.c | 165 + .../srclib/apr/memory/unix/.libs/apr_pools.o | Bin 0 -> 69856 bytes .../httpd-2.0.64/srclib/apr/memory/unix/Makefile | 13 + .../srclib/apr/memory/unix/Makefile.in | 13 + .../srclib/apr/memory/unix/apr_pools.c | 2305 + .../srclib/apr/memory/unix/apr_pools.lo | 12 + .../srclib/apr/memory/unix/apr_pools.o | Bin 0 -> 69504 bytes .../httpd-2.0.64/srclib/apr/misc/netware/apr.xdc | Bin 0 -> 128 bytes .../srclib/apr/misc/netware/aprlib.def | 3 + .../httpd-2.0.64/srclib/apr/misc/netware/charset.c | 34 + .../srclib/apr/misc/netware/libprews.c | 179 + .../httpd-2.0.64/srclib/apr/misc/netware/rand.c | 72 + .../httpd-2.0.64/srclib/apr/misc/netware/start.c | 180 + .../httpd-2.0.64/srclib/apr/misc/os2/randbyte.c | 123 + .../srclib/apr/misc/unix/.libs/charset.o | Bin 0 -> 23920 bytes .../httpd-2.0.64/srclib/apr/misc/unix/.libs/env.o | Bin 0 -> 5688 bytes .../srclib/apr/misc/unix/.libs/errorcodes.o | Bin 0 -> 16784 bytes .../srclib/apr/misc/unix/.libs/getopt.o | Bin 0 -> 21456 bytes .../srclib/apr/misc/unix/.libs/otherchild.o | Bin 0 -> 15944 bytes .../httpd-2.0.64/srclib/apr/misc/unix/.libs/rand.o | Bin 0 -> 9368 bytes .../srclib/apr/misc/unix/.libs/start.o | Bin 0 -> 9200 bytes .../srclib/apr/misc/unix/.libs/version.o | Bin 0 -> 3960 bytes .../app/httpd-2.0.64/srclib/apr/misc/unix/Makefile | 16 + .../httpd-2.0.64/srclib/apr/misc/unix/Makefile.in | 16 + .../httpd-2.0.64/srclib/apr/misc/unix/charset.c | 83 + .../httpd-2.0.64/srclib/apr/misc/unix/charset.lo | 12 + .../httpd-2.0.64/srclib/apr/misc/unix/charset.o | Bin 0 -> 23816 bytes rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/env.c | 97 + .../app/httpd-2.0.64/srclib/apr/misc/unix/env.lo | 12 + rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/env.o | Bin 0 -> 5632 bytes .../httpd-2.0.64/srclib/apr/misc/unix/errorcodes.c | 414 + .../srclib/apr/misc/unix/errorcodes.lo | 12 + .../httpd-2.0.64/srclib/apr/misc/unix/errorcodes.o | Bin 0 -> 15416 bytes .../app/httpd-2.0.64/srclib/apr/misc/unix/getopt.c | 309 + .../httpd-2.0.64/srclib/apr/misc/unix/getopt.lo | 12 + .../app/httpd-2.0.64/srclib/apr/misc/unix/getopt.o | Bin 0 -> 21152 bytes .../httpd-2.0.64/srclib/apr/misc/unix/otherchild.c | 246 + .../srclib/apr/misc/unix/otherchild.lo | 12 + .../httpd-2.0.64/srclib/apr/misc/unix/otherchild.o | Bin 0 -> 16384 bytes .../app/httpd-2.0.64/srclib/apr/misc/unix/rand.c | 209 + .../app/httpd-2.0.64/srclib/apr/misc/unix/rand.lo | 12 + .../app/httpd-2.0.64/srclib/apr/misc/unix/rand.o | Bin 0 -> 9288 bytes .../app/httpd-2.0.64/srclib/apr/misc/unix/start.c | 89 + .../app/httpd-2.0.64/srclib/apr/misc/unix/start.lo | 12 + .../app/httpd-2.0.64/srclib/apr/misc/unix/start.o | Bin 0 -> 9256 bytes .../httpd-2.0.64/srclib/apr/misc/unix/version.c | 35 + .../httpd-2.0.64/srclib/apr/misc/unix/version.lo | 12 + .../httpd-2.0.64/srclib/apr/misc/unix/version.o | Bin 0 -> 3928 bytes .../httpd-2.0.64/srclib/apr/misc/win32/apr_app.c | 80 + .../httpd-2.0.64/srclib/apr/misc/win32/charset.c | 55 + .../app/httpd-2.0.64/srclib/apr/misc/win32/env.c | 192 + .../httpd-2.0.64/srclib/apr/misc/win32/internal.c | 102 + .../app/httpd-2.0.64/srclib/apr/misc/win32/misc.c | 237 + .../app/httpd-2.0.64/srclib/apr/misc/win32/rand.c | 69 + .../app/httpd-2.0.64/srclib/apr/misc/win32/start.c | 230 + .../app/httpd-2.0.64/srclib/apr/misc/win32/utf8.c | 254 + .../srclib/apr/mmap/unix/.libs/common.o | Bin 0 -> 6440 bytes .../httpd-2.0.64/srclib/apr/mmap/unix/.libs/mmap.o | Bin 0 -> 14232 bytes .../app/httpd-2.0.64/srclib/apr/mmap/unix/Makefile | 13 + .../httpd-2.0.64/srclib/apr/mmap/unix/Makefile.in | 13 + .../app/httpd-2.0.64/srclib/apr/mmap/unix/common.c | 43 + .../httpd-2.0.64/srclib/apr/mmap/unix/common.lo | 12 + .../app/httpd-2.0.64/srclib/apr/mmap/unix/common.o | Bin 0 -> 6440 bytes .../app/httpd-2.0.64/srclib/apr/mmap/unix/mmap.c | 165 + .../app/httpd-2.0.64/srclib/apr/mmap/unix/mmap.lo | 12 + .../app/httpd-2.0.64/srclib/apr/mmap/unix/mmap.o | Bin 0 -> 14216 bytes .../app/httpd-2.0.64/srclib/apr/mmap/win32/mmap.c | 163 + .../srclib/apr/network_io/beos/Makefile.in | 14 + .../srclib/apr/network_io/beos/sendrecv.c | 252 + .../srclib/apr/network_io/beos/socketcommon.c | 5 + .../srclib/apr/network_io/os2/Makefile.in | 22 + .../srclib/apr/network_io/os2/inet_ntop.c | 1 + .../srclib/apr/network_io/os2/inet_pton.c | 1 + .../srclib/apr/network_io/os2/os2calls.c | 132 + .../srclib/apr/network_io/os2/sendrecv.c | 177 + .../srclib/apr/network_io/os2/sendrecv_udp.c | 122 + .../srclib/apr/network_io/os2/sockaddr.c | 1 + .../srclib/apr/network_io/os2/sockets.c | 343 + .../srclib/apr/network_io/os2/sockopt.c | 161 + .../srclib/apr/network_io/unix/.libs/inet_ntop.o | Bin 0 -> 14512 bytes .../srclib/apr/network_io/unix/.libs/inet_pton.o | Bin 0 -> 15480 bytes .../srclib/apr/network_io/unix/.libs/sendrecv.o | Bin 0 -> 36784 bytes .../srclib/apr/network_io/unix/.libs/sockaddr.o | Bin 0 -> 51480 bytes .../srclib/apr/network_io/unix/.libs/sockets.o | Bin 0 -> 39776 bytes .../srclib/apr/network_io/unix/.libs/sockopt.o | Bin 0 -> 24368 bytes .../srclib/apr/network_io/unix/Makefile | 20 + .../srclib/apr/network_io/unix/Makefile.in | 20 + .../srclib/apr/network_io/unix/inet_ntop.c | 243 + .../srclib/apr/network_io/unix/inet_ntop.lo | 12 + .../srclib/apr/network_io/unix/inet_ntop.o | Bin 0 -> 14384 bytes .../srclib/apr/network_io/unix/inet_pton.c | 240 + .../srclib/apr/network_io/unix/inet_pton.lo | 12 + .../srclib/apr/network_io/unix/inet_pton.o | Bin 0 -> 15416 bytes .../srclib/apr/network_io/unix/sendrecv.c | 1014 + .../srclib/apr/network_io/unix/sendrecv.lo | 12 + .../srclib/apr/network_io/unix/sendrecv.o | Bin 0 -> 36736 bytes .../srclib/apr/network_io/unix/sockaddr.c | 985 + .../srclib/apr/network_io/unix/sockaddr.lo | 12 + .../srclib/apr/network_io/unix/sockaddr.o | Bin 0 -> 51472 bytes .../srclib/apr/network_io/unix/sockets.c | 422 + .../srclib/apr/network_io/unix/sockets.lo | 12 + .../srclib/apr/network_io/unix/sockets.o | Bin 0 -> 39832 bytes .../srclib/apr/network_io/unix/sockopt.c | 393 + .../srclib/apr/network_io/unix/sockopt.lo | 12 + .../srclib/apr/network_io/unix/sockopt.o | Bin 0 -> 24256 bytes .../srclib/apr/network_io/win32/sendrecv.c | 460 + .../srclib/apr/network_io/win32/sockets.c | 532 + .../srclib/apr/network_io/win32/sockopt.c | 280 + .../srclib/apr/passwd/.libs/apr_getpass.o | Bin 0 -> 5760 bytes rubbos/app/httpd-2.0.64/srclib/apr/passwd/Makefile | 13 + .../app/httpd-2.0.64/srclib/apr/passwd/Makefile.in | 13 + .../httpd-2.0.64/srclib/apr/passwd/apr_getpass.c | 231 + .../httpd-2.0.64/srclib/apr/passwd/apr_getpass.lo | 12 + .../httpd-2.0.64/srclib/apr/passwd/apr_getpass.o | Bin 0 -> 5720 bytes .../httpd-2.0.64/srclib/apr/poll/os2/Makefile.in | 17 + rubbos/app/httpd-2.0.64/srclib/apr/poll/os2/poll.c | 105 + .../app/httpd-2.0.64/srclib/apr/poll/os2/pollacc.c | 1 + .../app/httpd-2.0.64/srclib/apr/poll/os2/pollset.c | 220 + .../httpd-2.0.64/srclib/apr/poll/unix/.libs/poll.o | Bin 0 -> 20432 bytes .../srclib/apr/poll/unix/.libs/pollacc.o | Bin 0 -> 16824 bytes .../app/httpd-2.0.64/srclib/apr/poll/unix/Makefile | 17 + .../httpd-2.0.64/srclib/apr/poll/unix/Makefile.in | 17 + .../app/httpd-2.0.64/srclib/apr/poll/unix/poll.c | 605 + .../app/httpd-2.0.64/srclib/apr/poll/unix/poll.lo | 12 + .../app/httpd-2.0.64/srclib/apr/poll/unix/poll.o | Bin 0 -> 20392 bytes .../httpd-2.0.64/srclib/apr/poll/unix/pollacc.c | 152 + .../httpd-2.0.64/srclib/apr/poll/unix/pollacc.lo | 12 + .../httpd-2.0.64/srclib/apr/poll/unix/pollacc.o | Bin 0 -> 16768 bytes .../httpd-2.0.64/srclib/apr/shmem/beos/Makefile.in | 14 + .../app/httpd-2.0.64/srclib/apr/shmem/beos/shm.c | 147 + .../httpd-2.0.64/srclib/apr/shmem/os2/Makefile.in | 14 + rubbos/app/httpd-2.0.64/srclib/apr/shmem/os2/shm.c | 138 + .../httpd-2.0.64/srclib/apr/shmem/unix/.libs/shm.o | Bin 0 -> 20952 bytes .../httpd-2.0.64/srclib/apr/shmem/unix/Makefile | 14 + .../httpd-2.0.64/srclib/apr/shmem/unix/Makefile.in | 14 + .../app/httpd-2.0.64/srclib/apr/shmem/unix/shm.c | 568 + .../app/httpd-2.0.64/srclib/apr/shmem/unix/shm.lo | 12 + .../app/httpd-2.0.64/srclib/apr/shmem/unix/shm.o | Bin 0 -> 20936 bytes .../app/httpd-2.0.64/srclib/apr/shmem/win32/shm.c | 294 + .../srclib/apr/strings/.libs/apr_cpystrn.o | Bin 0 -> 10920 bytes .../srclib/apr/strings/.libs/apr_fnmatch.o | Bin 0 -> 11120 bytes .../srclib/apr/strings/.libs/apr_snprintf.o | Bin 0 -> 82920 bytes .../srclib/apr/strings/.libs/apr_strings.o | Bin 0 -> 23560 bytes .../srclib/apr/strings/.libs/apr_strnatcmp.o | Bin 0 -> 8976 bytes .../srclib/apr/strings/.libs/apr_strtok.o | Bin 0 -> 4880 bytes .../app/httpd-2.0.64/srclib/apr/strings/Makefile | 19 + .../httpd-2.0.64/srclib/apr/strings/Makefile.in | 19 + .../httpd-2.0.64/srclib/apr/strings/apr_cpystrn.c | 317 + .../httpd-2.0.64/srclib/apr/strings/apr_cpystrn.lo | 12 + .../httpd-2.0.64/srclib/apr/strings/apr_cpystrn.o | Bin 0 -> 11928 bytes .../httpd-2.0.64/srclib/apr/strings/apr_fnmatch.c | 249 + .../httpd-2.0.64/srclib/apr/strings/apr_fnmatch.lo | 12 + .../httpd-2.0.64/srclib/apr/strings/apr_fnmatch.o | Bin 0 -> 11120 bytes .../httpd-2.0.64/srclib/apr/strings/apr_snprintf.c | 1311 + .../srclib/apr/strings/apr_snprintf.lo | 12 + .../httpd-2.0.64/srclib/apr/strings/apr_snprintf.o | Bin 0 -> 84056 bytes .../httpd-2.0.64/srclib/apr/strings/apr_strings.c | 458 + .../httpd-2.0.64/srclib/apr/strings/apr_strings.lo | 12 + .../httpd-2.0.64/srclib/apr/strings/apr_strings.o | Bin 0 -> 23616 bytes .../srclib/apr/strings/apr_strnatcmp.c | 149 + .../srclib/apr/strings/apr_strnatcmp.lo | 12 + .../srclib/apr/strings/apr_strnatcmp.o | Bin 0 -> 8920 bytes .../httpd-2.0.64/srclib/apr/strings/apr_strtok.c | 56 + .../httpd-2.0.64/srclib/apr/strings/apr_strtok.lo | 12 + .../httpd-2.0.64/srclib/apr/strings/apr_strtok.o | Bin 0 -> 4832 bytes .../srclib/apr/support/unix/.libs/waitio.o | Bin 0 -> 12128 bytes .../httpd-2.0.64/srclib/apr/support/unix/Makefile | 15 + .../srclib/apr/support/unix/Makefile.in | 15 + .../httpd-2.0.64/srclib/apr/support/unix/waitio.c | 64 + .../httpd-2.0.64/srclib/apr/support/unix/waitio.lo | 12 + .../httpd-2.0.64/srclib/apr/support/unix/waitio.o | Bin 0 -> 12040 bytes .../srclib/apr/tables/.libs/apr_hash.o | Bin 0 -> 19424 bytes .../srclib/apr/tables/.libs/apr_tables.o | Bin 0 -> 68512 bytes rubbos/app/httpd-2.0.64/srclib/apr/tables/Makefile | 13 + .../app/httpd-2.0.64/srclib/apr/tables/Makefile.in | 13 + .../app/httpd-2.0.64/srclib/apr/tables/apr_hash.c | 443 + .../app/httpd-2.0.64/srclib/apr/tables/apr_hash.lo | 12 + .../app/httpd-2.0.64/srclib/apr/tables/apr_hash.o | Bin 0 -> 19368 bytes .../httpd-2.0.64/srclib/apr/tables/apr_tables.c | 1207 + .../httpd-2.0.64/srclib/apr/tables/apr_tables.lo | 12 + .../httpd-2.0.64/srclib/apr/tables/apr_tables.o | Bin 0 -> 68320 bytes rubbos/app/httpd-2.0.64/srclib/apr/test/CuTest.c | 475 + rubbos/app/httpd-2.0.64/srclib/apr/test/CuTest.h | 140 + .../httpd-2.0.64/srclib/apr/test/MakeWin32Make.awk | 53 + rubbos/app/httpd-2.0.64/srclib/apr/test/Makefile | 123 + .../app/httpd-2.0.64/srclib/apr/test/Makefile.in | 123 + .../app/httpd-2.0.64/srclib/apr/test/Makefile.win | 113 + .../app/httpd-2.0.64/srclib/apr/test/NWGNUaprtest | 287 + .../app/httpd-2.0.64/srclib/apr/test/NWGNUmakefile | 260 + .../app/httpd-2.0.64/srclib/apr/test/NWGNUmod_test | 254 + .../httpd-2.0.64/srclib/apr/test/NWGNUproc_child | 252 + .../app/httpd-2.0.64/srclib/apr/test/NWGNUtestatmc | 255 + rubbos/app/httpd-2.0.64/srclib/apr/test/README | 248 + .../app/httpd-2.0.64/srclib/apr/test/aprtest.def | 3 + .../app/httpd-2.0.64/srclib/apr/test/aprtest.dsp | 199 + rubbos/app/httpd-2.0.64/srclib/apr/test/aprtest.h | 52 + .../app/httpd-2.0.64/srclib/apr/test/aprtest.win | 18 + rubbos/app/httpd-2.0.64/srclib/apr/test/client.c | 153 + .../srclib/apr/test/data/file_datafile.txt | 1 + .../srclib/apr/test/data/mmap_datafile.txt | 1 + .../httpd-2.0.64/srclib/apr/test/internal/Makefile | 37 + .../srclib/apr/test/internal/Makefile.in | 37 + .../srclib/apr/test/internal/testregex.c | 91 + .../srclib/apr/test/internal/testucs.c | 176 + rubbos/app/httpd-2.0.64/srclib/apr/test/mod_test.c | 32 + rubbos/app/httpd-2.0.64/srclib/apr/test/nw_misc.c | 15 + rubbos/app/httpd-2.0.64/srclib/apr/test/occhild.c | 26 + .../app/httpd-2.0.64/srclib/apr/test/proc_child.c | 21 + .../app/httpd-2.0.64/srclib/apr/test/readchild.c | 46 + rubbos/app/httpd-2.0.64/srclib/apr/test/sendfile.c | 749 + rubbos/app/httpd-2.0.64/srclib/apr/test/server.c | 167 + rubbos/app/httpd-2.0.64/srclib/apr/test/test_apr.h | 68 + rubbos/app/httpd-2.0.64/srclib/apr/test/testall.c | 167 + .../app/httpd-2.0.64/srclib/apr/test/testall.dsp | 253 + .../app/httpd-2.0.64/srclib/apr/test/testall.dsw | 122 + rubbos/app/httpd-2.0.64/srclib/apr/test/testapp.c | 10 + .../app/httpd-2.0.64/srclib/apr/test/testapp.dsp | 90 + .../app/httpd-2.0.64/srclib/apr/test/testappnt.dsp | 101 + rubbos/app/httpd-2.0.64/srclib/apr/test/testargs.c | 236 + .../app/httpd-2.0.64/srclib/apr/test/testatomic.c | 344 + rubbos/app/httpd-2.0.64/srclib/apr/test/testdir.c | 275 + rubbos/app/httpd-2.0.64/srclib/apr/test/testdso.c | 247 + rubbos/app/httpd-2.0.64/srclib/apr/test/testdup.c | 194 + rubbos/app/httpd-2.0.64/srclib/apr/test/testenv.c | 144 + rubbos/app/httpd-2.0.64/srclib/apr/test/testfile.c | 782 + .../httpd-2.0.64/srclib/apr/test/testfileinfo.c | 263 + .../app/httpd-2.0.64/srclib/apr/test/testflock.c | 156 + rubbos/app/httpd-2.0.64/srclib/apr/test/testfmt.c | 113 + .../httpd-2.0.64/srclib/apr/test/testglobalmutex.c | 158 + rubbos/app/httpd-2.0.64/srclib/apr/test/testhash.c | 403 + .../app/httpd-2.0.64/srclib/apr/test/testipsub.c | 173 + rubbos/app/httpd-2.0.64/srclib/apr/test/testlock.c | 322 + .../httpd-2.0.64/srclib/apr/test/testlockperf.c | 282 + rubbos/app/httpd-2.0.64/srclib/apr/test/testmmap.c | 154 + .../httpd-2.0.64/srclib/apr/test/testmutexscope.c | 218 + .../app/httpd-2.0.64/srclib/apr/test/testnames.c | 273 + rubbos/app/httpd-2.0.64/srclib/apr/test/testoc.c | 126 + rubbos/app/httpd-2.0.64/srclib/apr/test/testpath.c | 138 + rubbos/app/httpd-2.0.64/srclib/apr/test/testpipe.c | 204 + rubbos/app/httpd-2.0.64/srclib/apr/test/testpoll.c | 526 + .../app/httpd-2.0.64/srclib/apr/test/testpools.c | 108 + rubbos/app/httpd-2.0.64/srclib/apr/test/testproc.c | 178 + .../httpd-2.0.64/srclib/apr/test/testprocmutex.c | 147 + rubbos/app/httpd-2.0.64/srclib/apr/test/testrand.c | 46 + rubbos/app/httpd-2.0.64/srclib/apr/test/testshm.c | 293 + .../httpd-2.0.64/srclib/apr/test/testshmconsumer.c | 116 + .../httpd-2.0.64/srclib/apr/test/testshmproducer.c | 109 + .../app/httpd-2.0.64/srclib/apr/test/testsleep.c | 54 + rubbos/app/httpd-2.0.64/srclib/apr/test/testsock.c | 175 + .../app/httpd-2.0.64/srclib/apr/test/testsockets.c | 174 + .../app/httpd-2.0.64/srclib/apr/test/testsockopt.c | 137 + rubbos/app/httpd-2.0.64/srclib/apr/test/teststr.c | 307 + .../app/httpd-2.0.64/srclib/apr/test/testtable.c | 168 + .../app/httpd-2.0.64/srclib/apr/test/testthread.c | 133 + rubbos/app/httpd-2.0.64/srclib/apr/test/testtime.c | 305 + rubbos/app/httpd-2.0.64/srclib/apr/test/testud.c | 91 + rubbos/app/httpd-2.0.64/srclib/apr/test/testuser.c | 171 + rubbos/app/httpd-2.0.64/srclib/apr/test/testvsn.c | 49 + .../srclib/apr/threadproc/beos/Makefile.in | 25 + .../srclib/apr/threadproc/beos/apr_proc_stub.c | 76 + .../httpd-2.0.64/srclib/apr/threadproc/beos/proc.c | 371 + .../srclib/apr/threadproc/beos/thread.c | 227 + .../srclib/apr/threadproc/beos/threadpriv.c | 180 + .../srclib/apr/threadproc/beos/threadproc_common.c | 21 + .../srclib/apr/threadproc/netware/proc.c | 438 + .../srclib/apr/threadproc/netware/procsup.c | 102 + .../srclib/apr/threadproc/netware/signals.c | 78 + .../srclib/apr/threadproc/netware/thread.c | 250 + .../srclib/apr/threadproc/netware/threadpriv.c | 102 + .../srclib/apr/threadproc/os2/Makefile.in | 18 + .../httpd-2.0.64/srclib/apr/threadproc/os2/proc.c | 605 + .../srclib/apr/threadproc/os2/signals.c | 1 + .../srclib/apr/threadproc/os2/thread.c | 259 + .../srclib/apr/threadproc/os2/threadpriv.c | 88 + .../srclib/apr/threadproc/unix/.libs/proc.o | Bin 0 -> 37760 bytes .../srclib/apr/threadproc/unix/.libs/procsup.o | Bin 0 -> 9552 bytes .../srclib/apr/threadproc/unix/.libs/signals.o | Bin 0 -> 16376 bytes .../srclib/apr/threadproc/unix/.libs/thread.o | Bin 0 -> 22320 bytes .../srclib/apr/threadproc/unix/.libs/threadpriv.o | Bin 0 -> 12264 bytes .../srclib/apr/threadproc/unix/Makefile | 18 + .../srclib/apr/threadproc/unix/Makefile.in | 18 + .../httpd-2.0.64/srclib/apr/threadproc/unix/proc.c | 624 + .../srclib/apr/threadproc/unix/proc.lo | 12 + .../httpd-2.0.64/srclib/apr/threadproc/unix/proc.o | Bin 0 -> 37496 bytes .../srclib/apr/threadproc/unix/procsup.c | 101 + .../srclib/apr/threadproc/unix/procsup.lo | 12 + .../srclib/apr/threadproc/unix/procsup.o | Bin 0 -> 9216 bytes .../srclib/apr/threadproc/unix/signals.c | 433 + .../srclib/apr/threadproc/unix/signals.lo | 12 + .../srclib/apr/threadproc/unix/signals.o | Bin 0 -> 16360 bytes .../srclib/apr/threadproc/unix/thread.c | 287 + .../srclib/apr/threadproc/unix/thread.lo | 12 + .../srclib/apr/threadproc/unix/thread.o | Bin 0 -> 22288 bytes .../srclib/apr/threadproc/unix/threadpriv.c | 129 + .../srclib/apr/threadproc/unix/threadpriv.lo | 12 + .../srclib/apr/threadproc/unix/threadpriv.o | Bin 0 -> 12216 bytes .../srclib/apr/threadproc/win32/proc.c | 874 + .../srclib/apr/threadproc/win32/signals.c | 62 + .../srclib/apr/threadproc/win32/thread.c | 277 + .../srclib/apr/threadproc/win32/threadpriv.c | 101 + .../httpd-2.0.64/srclib/apr/time/unix/.libs/time.o | Bin 0 -> 18272 bytes .../srclib/apr/time/unix/.libs/timestr.o | Bin 0 -> 13512 bytes .../app/httpd-2.0.64/srclib/apr/time/unix/Makefile | 13 + .../httpd-2.0.64/srclib/apr/time/unix/Makefile.in | 13 + .../app/httpd-2.0.64/srclib/apr/time/unix/time.c | 351 + .../app/httpd-2.0.64/srclib/apr/time/unix/time.lo | 12 + .../app/httpd-2.0.64/srclib/apr/time/unix/time.o | Bin 0 -> 18904 bytes .../httpd-2.0.64/srclib/apr/time/unix/timestr.c | 153 + .../httpd-2.0.64/srclib/apr/time/unix/timestr.lo | 12 + .../httpd-2.0.64/srclib/apr/time/unix/timestr.o | Bin 0 -> 13448 bytes .../httpd-2.0.64/srclib/apr/time/win32/access.c | 204 + .../app/httpd-2.0.64/srclib/apr/time/win32/time.c | 357 + .../httpd-2.0.64/srclib/apr/time/win32/timestr.c | 216 + .../srclib/apr/user/netware/groupinfo.c | 60 + .../srclib/apr/user/netware/userinfo.c | 98 + .../srclib/apr/user/unix/.libs/groupinfo.o | Bin 0 -> 10648 bytes .../srclib/apr/user/unix/.libs/userinfo.o | Bin 0 -> 15040 bytes .../app/httpd-2.0.64/srclib/apr/user/unix/Makefile | 13 + .../httpd-2.0.64/srclib/apr/user/unix/Makefile.in | 13 + .../httpd-2.0.64/srclib/apr/user/unix/groupinfo.c | 108 + .../httpd-2.0.64/srclib/apr/user/unix/groupinfo.lo | 12 + .../httpd-2.0.64/srclib/apr/user/unix/groupinfo.o | Bin 0 -> 10584 bytes .../httpd-2.0.64/srclib/apr/user/unix/userinfo.c | 177 + .../httpd-2.0.64/srclib/apr/user/unix/userinfo.lo | 12 + .../httpd-2.0.64/srclib/apr/user/unix/userinfo.o | Bin 0 -> 15544 bytes .../httpd-2.0.64/srclib/apr/user/win32/groupinfo.c | 124 + .../httpd-2.0.64/srclib/apr/user/win32/userinfo.c | 317 + rubbos/app/httpd-2.0.64/srclib/pcre/.deps | 0 .../app/httpd-2.0.64/srclib/pcre/.libs/dftables.o | Bin 0 -> 35784 bytes rubbos/app/httpd-2.0.64/srclib/pcre/.libs/get.o | Bin 0 -> 11200 bytes .../app/httpd-2.0.64/srclib/pcre/.libs/libpcre.a | Bin 0 -> 213630 bytes .../app/httpd-2.0.64/srclib/pcre/.libs/libpcre.la | 35 + .../httpd-2.0.64/srclib/pcre/.libs/maketables.o | Bin 0 -> 11272 bytes rubbos/app/httpd-2.0.64/srclib/pcre/.libs/pcre.o | Bin 0 -> 147848 bytes .../app/httpd-2.0.64/srclib/pcre/.libs/pcreposix.o | Bin 0 -> 21840 bytes rubbos/app/httpd-2.0.64/srclib/pcre/.libs/study.o | Bin 0 -> 20776 bytes rubbos/app/httpd-2.0.64/srclib/pcre/AUTHORS | 6 + rubbos/app/httpd-2.0.64/srclib/pcre/COPYING | 50 + rubbos/app/httpd-2.0.64/srclib/pcre/ChangeLog | 790 + rubbos/app/httpd-2.0.64/srclib/pcre/INSTALL | 185 + rubbos/app/httpd-2.0.64/srclib/pcre/LICENCE | 50 + rubbos/app/httpd-2.0.64/srclib/pcre/Makefile | 25 + rubbos/app/httpd-2.0.64/srclib/pcre/Makefile.in | 20 + rubbos/app/httpd-2.0.64/srclib/pcre/NEWS | 85 + rubbos/app/httpd-2.0.64/srclib/pcre/NON-UNIX-USE | 53 + rubbos/app/httpd-2.0.64/srclib/pcre/NWGNUmakefile | 267 + rubbos/app/httpd-2.0.64/srclib/pcre/README | 307 + rubbos/app/httpd-2.0.64/srclib/pcre/RunTest | 94 + rubbos/app/httpd-2.0.64/srclib/pcre/RunTest.in | 149 + rubbos/app/httpd-2.0.64/srclib/pcre/chartables.c | 183 + rubbos/app/httpd-2.0.64/srclib/pcre/config.guess | 1344 + rubbos/app/httpd-2.0.64/srclib/pcre/config.h | 48 + rubbos/app/httpd-2.0.64/srclib/pcre/config.hw | 46 + rubbos/app/httpd-2.0.64/srclib/pcre/config.in | 47 + rubbos/app/httpd-2.0.64/srclib/pcre/config.log | 455 + rubbos/app/httpd-2.0.64/srclib/pcre/config.status | 988 + rubbos/app/httpd-2.0.64/srclib/pcre/config.sub | 1507 + rubbos/app/httpd-2.0.64/srclib/pcre/configure | 5233 +++ rubbos/app/httpd-2.0.64/srclib/pcre/configure.in | 104 + rubbos/app/httpd-2.0.64/srclib/pcre/dftables | Bin 0 -> 24992 bytes rubbos/app/httpd-2.0.64/srclib/pcre/dftables.c | 148 + rubbos/app/httpd-2.0.64/srclib/pcre/dftables.dsp | 165 + rubbos/app/httpd-2.0.64/srclib/pcre/dftables.lo | 12 + rubbos/app/httpd-2.0.64/srclib/pcre/dftables.o | Bin 0 -> 35784 bytes rubbos/app/httpd-2.0.64/srclib/pcre/dll.mk | 60 + rubbos/app/httpd-2.0.64/srclib/pcre/doc/Tech.Notes | 253 + rubbos/app/httpd-2.0.64/srclib/pcre/doc/pcre.3 | 1991 + rubbos/app/httpd-2.0.64/srclib/pcre/doc/pcre.html | 2669 ++ rubbos/app/httpd-2.0.64/srclib/pcre/doc/pcre.txt | 2315 + rubbos/app/httpd-2.0.64/srclib/pcre/doc/pcregrep.1 | 88 + .../app/httpd-2.0.64/srclib/pcre/doc/pcregrep.html | 120 + .../app/httpd-2.0.64/srclib/pcre/doc/pcregrep.txt | 101 + .../app/httpd-2.0.64/srclib/pcre/doc/pcreposix.3 | 149 + .../httpd-2.0.64/srclib/pcre/doc/pcreposix.html | 191 + .../app/httpd-2.0.64/srclib/pcre/doc/pcreposix.txt | 159 + rubbos/app/httpd-2.0.64/srclib/pcre/doc/pcretest.1 | 282 + .../app/httpd-2.0.64/srclib/pcre/doc/pcretest.html | 369 + .../app/httpd-2.0.64/srclib/pcre/doc/pcretest.txt | 319 + .../app/httpd-2.0.64/srclib/pcre/doc/perltest.txt | 29 + rubbos/app/httpd-2.0.64/srclib/pcre/doc/pgrep.1 | 76 + rubbos/app/httpd-2.0.64/srclib/pcre/doc/pgrep.html | 105 + rubbos/app/httpd-2.0.64/srclib/pcre/doc/pgrep.txt | 86 + rubbos/app/httpd-2.0.64/srclib/pcre/get.c | 227 + rubbos/app/httpd-2.0.64/srclib/pcre/get.lo | 12 + rubbos/app/httpd-2.0.64/srclib/pcre/get.o | Bin 0 -> 11200 bytes rubbos/app/httpd-2.0.64/srclib/pcre/install-sh | 251 + rubbos/app/httpd-2.0.64/srclib/pcre/internal.h | 412 + rubbos/app/httpd-2.0.64/srclib/pcre/libpcre.la | 35 + rubbos/app/httpd-2.0.64/srclib/pcre/ltconfig | 3078 ++ rubbos/app/httpd-2.0.64/srclib/pcre/ltmain.sh | 4946 ++ rubbos/app/httpd-2.0.64/srclib/pcre/maketables.c | 132 + rubbos/app/httpd-2.0.64/srclib/pcre/maketables.lo | 12 + rubbos/app/httpd-2.0.64/srclib/pcre/maketables.o | Bin 0 -> 11272 bytes rubbos/app/httpd-2.0.64/srclib/pcre/mkinstalldirs | 40 + rubbos/app/httpd-2.0.64/srclib/pcre/pcre-config | 59 + rubbos/app/httpd-2.0.64/srclib/pcre/pcre-config.in | 59 + rubbos/app/httpd-2.0.64/srclib/pcre/pcre.c | 5185 +++ rubbos/app/httpd-2.0.64/srclib/pcre/pcre.def | 19 + rubbos/app/httpd-2.0.64/srclib/pcre/pcre.dsp | 193 + rubbos/app/httpd-2.0.64/srclib/pcre/pcre.h | 113 + rubbos/app/httpd-2.0.64/srclib/pcre/pcre.hw | 113 + rubbos/app/httpd-2.0.64/srclib/pcre/pcre.in | 113 + rubbos/app/httpd-2.0.64/srclib/pcre/pcre.lo | 12 + rubbos/app/httpd-2.0.64/srclib/pcre/pcre.o | Bin 0 -> 147848 bytes rubbos/app/httpd-2.0.64/srclib/pcre/pcredemo.c | 94 + rubbos/app/httpd-2.0.64/srclib/pcre/pcregrep.c | 540 + rubbos/app/httpd-2.0.64/srclib/pcre/pcreposix.c | 303 + rubbos/app/httpd-2.0.64/srclib/pcre/pcreposix.dsp | 154 + rubbos/app/httpd-2.0.64/srclib/pcre/pcreposix.h | 88 + rubbos/app/httpd-2.0.64/srclib/pcre/pcreposix.lo | 12 + rubbos/app/httpd-2.0.64/srclib/pcre/pcreposix.o | Bin 0 -> 21840 bytes rubbos/app/httpd-2.0.64/srclib/pcre/pcretest.c | 1262 + rubbos/app/httpd-2.0.64/srclib/pcre/perltest | 169 + rubbos/app/httpd-2.0.64/srclib/pcre/perltest8 | 208 + rubbos/app/httpd-2.0.64/srclib/pcre/pgrep.c | 225 + rubbos/app/httpd-2.0.64/srclib/pcre/study.c | 401 + rubbos/app/httpd-2.0.64/srclib/pcre/study.lo | 12 + rubbos/app/httpd-2.0.64/srclib/pcre/study.o | Bin 0 -> 20776 bytes .../httpd-2.0.64/srclib/pcre/testdata/testinput1 | 1950 + .../httpd-2.0.64/srclib/pcre/testdata/testinput2 | 723 + .../httpd-2.0.64/srclib/pcre/testdata/testinput3 | 1724 + .../httpd-2.0.64/srclib/pcre/testdata/testinput4 | 65 + .../httpd-2.0.64/srclib/pcre/testdata/testinput5 | 118 + .../httpd-2.0.64/srclib/pcre/testdata/testinput6 | 78 + .../httpd-2.0.64/srclib/pcre/testdata/testoutput1 | 3018 ++ .../httpd-2.0.64/srclib/pcre/testdata/testoutput2 | 2380 + .../httpd-2.0.64/srclib/pcre/testdata/testoutput3 | 2991 ++ .../httpd-2.0.64/srclib/pcre/testdata/testoutput4 | 116 + .../httpd-2.0.64/srclib/pcre/testdata/testoutput5 | 242 + .../httpd-2.0.64/srclib/pcre/testdata/testoutput6 | 319 + rubbos/app/httpd-2.0.64/support/.deps | 0 rubbos/app/httpd-2.0.64/support/.indent.pro | 54 + rubbos/app/httpd-2.0.64/support/.libs/ab | Bin 0 -> 104358 bytes rubbos/app/httpd-2.0.64/support/.libs/ab.o | Bin 0 -> 194072 bytes rubbos/app/httpd-2.0.64/support/.libs/checkgid | Bin 0 -> 13697 bytes rubbos/app/httpd-2.0.64/support/.libs/checkgid.o | Bin 0 -> 12312 bytes rubbos/app/httpd-2.0.64/support/.libs/htdbm | Bin 0 -> 44199 bytes rubbos/app/httpd-2.0.64/support/.libs/htdbm.o | Bin 0 -> 65256 bytes rubbos/app/httpd-2.0.64/support/.libs/htdigest | Bin 0 -> 30574 bytes rubbos/app/httpd-2.0.64/support/.libs/htdigest.o | Bin 0 -> 34768 bytes rubbos/app/httpd-2.0.64/support/.libs/htpasswd | Bin 0 -> 38642 bytes rubbos/app/httpd-2.0.64/support/.libs/htpasswd.o | Bin 0 -> 60736 bytes rubbos/app/httpd-2.0.64/support/.libs/httxt2dbm | Bin 0 -> 23394 bytes rubbos/app/httpd-2.0.64/support/.libs/httxt2dbm.o | Bin 0 -> 28616 bytes rubbos/app/httpd-2.0.64/support/.libs/logresolve | Bin 0 -> 29935 bytes rubbos/app/httpd-2.0.64/support/.libs/logresolve.o | Bin 0 -> 46184 bytes rubbos/app/httpd-2.0.64/support/.libs/rotatelogs | Bin 0 -> 26569 bytes rubbos/app/httpd-2.0.64/support/.libs/rotatelogs.o | Bin 0 -> 34816 bytes rubbos/app/httpd-2.0.64/support/Makefile | 73 + rubbos/app/httpd-2.0.64/support/Makefile.in | 68 + rubbos/app/httpd-2.0.64/support/NWGNUab | 254 + rubbos/app/httpd-2.0.64/support/NWGNUhtdbm | 252 + rubbos/app/httpd-2.0.64/support/NWGNUhtdigest | 252 + rubbos/app/httpd-2.0.64/support/NWGNUhtpasswd | 252 + rubbos/app/httpd-2.0.64/support/NWGNUlogres | 254 + rubbos/app/httpd-2.0.64/support/NWGNUmakefile | 249 + rubbos/app/httpd-2.0.64/support/NWGNUrotlogs | 251 + rubbos/app/httpd-2.0.64/support/README | 62 + rubbos/app/httpd-2.0.64/support/SHA1/README.sha1 | 34 + .../app/httpd-2.0.64/support/SHA1/convert-sha1.pl | 36 + .../app/httpd-2.0.64/support/SHA1/htpasswd-sha1.pl | 22 + .../httpd-2.0.64/support/SHA1/ldif-sha1.example | 19 + rubbos/app/httpd-2.0.64/support/ab | 131 + rubbos/app/httpd-2.0.64/support/ab.c | 2195 + rubbos/app/httpd-2.0.64/support/ab.dsp | 123 + rubbos/app/httpd-2.0.64/support/ab.lo | 12 + rubbos/app/httpd-2.0.64/support/ab.o | Bin 0 -> 194072 bytes rubbos/app/httpd-2.0.64/support/abs.dsp | 134 + rubbos/app/httpd-2.0.64/support/apachectl | 103 + rubbos/app/httpd-2.0.64/support/apachectl.in | 103 + rubbos/app/httpd-2.0.64/support/apxs | 778 + rubbos/app/httpd-2.0.64/support/apxs.in | 778 + rubbos/app/httpd-2.0.64/support/check_forensic | 51 + rubbos/app/httpd-2.0.64/support/checkgid | 131 + rubbos/app/httpd-2.0.64/support/checkgid.c | 110 + rubbos/app/httpd-2.0.64/support/checkgid.lo | 12 + rubbos/app/httpd-2.0.64/support/checkgid.o | Bin 0 -> 12312 bytes rubbos/app/httpd-2.0.64/support/config.m4 | 104 + rubbos/app/httpd-2.0.64/support/dbmmanage | 312 + rubbos/app/httpd-2.0.64/support/dbmmanage.in | 312 + rubbos/app/httpd-2.0.64/support/envvars-std | 24 + rubbos/app/httpd-2.0.64/support/envvars-std.in | 24 + rubbos/app/httpd-2.0.64/support/htdbm | 131 + rubbos/app/httpd-2.0.64/support/htdbm.c | 585 + rubbos/app/httpd-2.0.64/support/htdbm.dsp | 123 + rubbos/app/httpd-2.0.64/support/htdbm.lo | 12 + rubbos/app/httpd-2.0.64/support/htdbm.o | Bin 0 -> 65256 bytes rubbos/app/httpd-2.0.64/support/htdigest | 131 + rubbos/app/httpd-2.0.64/support/htdigest.c | 291 + rubbos/app/httpd-2.0.64/support/htdigest.dsp | 123 + rubbos/app/httpd-2.0.64/support/htdigest.lo | 12 + rubbos/app/httpd-2.0.64/support/htdigest.o | Bin 0 -> 34768 bytes rubbos/app/httpd-2.0.64/support/htpasswd | 131 + rubbos/app/httpd-2.0.64/support/htpasswd.c | 610 + rubbos/app/httpd-2.0.64/support/htpasswd.dsp | 123 + rubbos/app/httpd-2.0.64/support/htpasswd.lo | 12 + rubbos/app/httpd-2.0.64/support/htpasswd.o | Bin 0 -> 60736 bytes rubbos/app/httpd-2.0.64/support/httxt2dbm | 131 + rubbos/app/httpd-2.0.64/support/httxt2dbm.c | 336 + rubbos/app/httpd-2.0.64/support/httxt2dbm.dsp | 123 + rubbos/app/httpd-2.0.64/support/httxt2dbm.lo | 12 + rubbos/app/httpd-2.0.64/support/httxt2dbm.o | Bin 0 -> 28616 bytes rubbos/app/httpd-2.0.64/support/list_hooks.pl | 101 + rubbos/app/httpd-2.0.64/support/log_server_status | 78 + .../app/httpd-2.0.64/support/log_server_status.in | 78 + rubbos/app/httpd-2.0.64/support/logresolve | 131 + rubbos/app/httpd-2.0.64/support/logresolve.c | 400 + rubbos/app/httpd-2.0.64/support/logresolve.dsp | 123 + rubbos/app/httpd-2.0.64/support/logresolve.lo | 12 + rubbos/app/httpd-2.0.64/support/logresolve.o | Bin 0 -> 46184 bytes rubbos/app/httpd-2.0.64/support/logresolve.pl | 225 + rubbos/app/httpd-2.0.64/support/logresolve.pl.in | 225 + rubbos/app/httpd-2.0.64/support/phf_abuse_log.cgi | 38 + .../app/httpd-2.0.64/support/phf_abuse_log.cgi.in | 38 + rubbos/app/httpd-2.0.64/support/rotatelogs | 131 + rubbos/app/httpd-2.0.64/support/rotatelogs.c | 262 + rubbos/app/httpd-2.0.64/support/rotatelogs.dsp | 123 + rubbos/app/httpd-2.0.64/support/rotatelogs.lo | 12 + rubbos/app/httpd-2.0.64/support/rotatelogs.o | Bin 0 -> 34816 bytes rubbos/app/httpd-2.0.64/support/split-logfile | 67 + rubbos/app/httpd-2.0.64/support/split-logfile.in | 67 + rubbos/app/httpd-2.0.64/support/suexec.c | 619 + rubbos/app/httpd-2.0.64/support/suexec.h | 108 + rubbos/app/httpd-2.0.64/support/utilitiesnw.def | 3 + .../app/httpd-2.0.64/support/win32/ApacheMonitor.c | 1945 + .../httpd-2.0.64/support/win32/ApacheMonitor.dsp | 143 + .../app/httpd-2.0.64/support/win32/ApacheMonitor.h | 78 + .../httpd-2.0.64/support/win32/ApacheMonitor.ico | Bin 0 -> 1078 bytes .../httpd-2.0.64/support/win32/ApacheMonitor.rc | 97 + .../httpd-2.0.64/support/win32/apache_header.bmp | Bin 0 -> 6498 bytes rubbos/app/httpd-2.0.64/support/win32/aprun.ico | Bin 0 -> 318 bytes rubbos/app/httpd-2.0.64/support/win32/apstop.ico | Bin 0 -> 318 bytes rubbos/app/httpd-2.0.64/support/win32/srun.bmp | Bin 0 -> 246 bytes rubbos/app/httpd-2.0.64/support/win32/sstop.bmp | Bin 0 -> 246 bytes rubbos/app/httpd-2.0.64/support/win32/wintty.c | 375 + rubbos/app/httpd-2.0.64/support/win32/wintty.dsp | 123 + rubbos/app/httpd-2.0.64/test/.deps | 0 rubbos/app/httpd-2.0.64/test/.indent.pro | 54 + rubbos/app/httpd-2.0.64/test/Makefile | 25 + rubbos/app/httpd-2.0.64/test/Makefile.in | 20 + rubbos/app/httpd-2.0.64/test/README | 3 + rubbos/app/httpd-2.0.64/test/check_chunked | 58 + rubbos/app/httpd-2.0.64/test/cls.c | 182 + rubbos/app/httpd-2.0.64/test/tcpdumpscii.txt | 50 + rubbos/app/httpd-2.0.64/test/test-writev.c | 101 + rubbos/app/httpd-2.0.64/test/test_find.c | 78 + rubbos/app/httpd-2.0.64/test/test_limits.c | 200 + rubbos/app/httpd-2.0.64/test/test_parser.c | 75 + rubbos/app/httpd-2.0.64/test/test_select.c | 46 + rubbos/app/httpd-2.0.64/test/time-sem.c | 588 + rubbos/app/httpd-2.0.64/test/zb.c | 567 + 3223 files changed, 803169 insertions(+) create mode 100644 rubbos/app/httpd-2.0.64/.deps create mode 100644 rubbos/app/httpd-2.0.64/.gdbinit create mode 100755 rubbos/app/httpd-2.0.64/.libs/httpd create mode 100644 rubbos/app/httpd-2.0.64/.libs/modules.o create mode 100644 rubbos/app/httpd-2.0.64/ABOUT_APACHE create mode 100644 rubbos/app/httpd-2.0.64/Apache.dsp create mode 100644 rubbos/app/httpd-2.0.64/Apache.dsw create mode 100644 rubbos/app/httpd-2.0.64/BuildBin.dsp create mode 100644 rubbos/app/httpd-2.0.64/CHANGES create mode 100644 rubbos/app/httpd-2.0.64/INSTALL create mode 100644 rubbos/app/httpd-2.0.64/InstallBin.dsp create mode 100644 rubbos/app/httpd-2.0.64/LAYOUT create mode 100644 rubbos/app/httpd-2.0.64/LICENSE create mode 100644 rubbos/app/httpd-2.0.64/Makefile create mode 100644 rubbos/app/httpd-2.0.64/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/Makefile.win create mode 100644 rubbos/app/httpd-2.0.64/NOTICE create mode 100644 rubbos/app/httpd-2.0.64/NWGNUmakefile create mode 100644 rubbos/app/httpd-2.0.64/README create mode 100644 rubbos/app/httpd-2.0.64/README.platforms create mode 100644 rubbos/app/httpd-2.0.64/VERSIONING create mode 100644 rubbos/app/httpd-2.0.64/acconfig.h create mode 100644 rubbos/app/httpd-2.0.64/acinclude.m4 create mode 100644 rubbos/app/httpd-2.0.64/apachenw.mcp.zip create mode 100644 rubbos/app/httpd-2.0.64/build/NWGNUenvironment.inc create mode 100644 rubbos/app/httpd-2.0.64/build/NWGNUhead.inc create mode 100644 rubbos/app/httpd-2.0.64/build/NWGNUmakefile create mode 100644 rubbos/app/httpd-2.0.64/build/NWGNUtail.inc create mode 100755 rubbos/app/httpd-2.0.64/build/PrintPath create mode 100644 rubbos/app/httpd-2.0.64/build/apr_common.m4 create mode 100755 rubbos/app/httpd-2.0.64/build/binbuild.sh create mode 100755 rubbos/app/httpd-2.0.64/build/bsd_makefile create mode 100644 rubbos/app/httpd-2.0.64/build/build-modules-c.awk create mode 100755 rubbos/app/httpd-2.0.64/build/buildinfo.sh create mode 100755 rubbos/app/httpd-2.0.64/build/config-stubs create mode 100755 rubbos/app/httpd-2.0.64/build/config.guess create mode 100755 rubbos/app/httpd-2.0.64/build/config.sub create mode 100644 rubbos/app/httpd-2.0.64/build/config_vars.mk create mode 100644 rubbos/app/httpd-2.0.64/build/default.pl create mode 100755 rubbos/app/httpd-2.0.64/build/fastgen.sh create mode 100644 rubbos/app/httpd-2.0.64/build/find_apr.m4 create mode 100644 rubbos/app/httpd-2.0.64/build/find_apu.m4 create mode 100755 rubbos/app/httpd-2.0.64/build/get-version.sh create mode 100755 rubbos/app/httpd-2.0.64/build/install-bindist.sh.in create mode 100755 rubbos/app/httpd-2.0.64/build/install.sh create mode 100755 rubbos/app/httpd-2.0.64/build/instdso.sh create mode 100644 rubbos/app/httpd-2.0.64/build/library.mk create mode 100644 rubbos/app/httpd-2.0.64/build/ltlib.mk create mode 100644 rubbos/app/httpd-2.0.64/build/ltmain.sh create mode 100644 rubbos/app/httpd-2.0.64/build/make_exports.awk create mode 100644 rubbos/app/httpd-2.0.64/build/make_nw_export.awk create mode 100644 rubbos/app/httpd-2.0.64/build/make_var_export.awk create mode 100644 rubbos/app/httpd-2.0.64/build/mkconfNW.awk create mode 100644 rubbos/app/httpd-2.0.64/build/mkdep.perl create mode 100755 rubbos/app/httpd-2.0.64/build/mkdir.sh create mode 100644 rubbos/app/httpd-2.0.64/build/nw_export.inc create mode 100644 rubbos/app/httpd-2.0.64/build/nw_ver.awk create mode 100644 rubbos/app/httpd-2.0.64/build/pkg/README create mode 100755 rubbos/app/httpd-2.0.64/build/pkg/buildpkg.sh create mode 100644 rubbos/app/httpd-2.0.64/build/pkg/pkginfo create mode 100644 rubbos/app/httpd-2.0.64/build/pkg/pkginfo.in create mode 100755 rubbos/app/httpd-2.0.64/build/prebuildNW.bat create mode 100644 rubbos/app/httpd-2.0.64/build/program.mk create mode 100755 rubbos/app/httpd-2.0.64/build/rpm/httpd.init create mode 100644 rubbos/app/httpd-2.0.64/build/rpm/httpd.logrotate create mode 100644 rubbos/app/httpd-2.0.64/build/rpm/httpd.spec.in create mode 100644 rubbos/app/httpd-2.0.64/build/rules.mk create mode 100644 rubbos/app/httpd-2.0.64/build/rules.mk.in create mode 100644 rubbos/app/httpd-2.0.64/build/special.mk create mode 100755 rubbos/app/httpd-2.0.64/build/sysv_makefile create mode 100644 rubbos/app/httpd-2.0.64/build/win32/apache.ico create mode 100644 rubbos/app/httpd-2.0.64/build/win32/win32ver.awk create mode 100755 rubbos/app/httpd-2.0.64/buildconf create mode 100644 rubbos/app/httpd-2.0.64/config.layout create mode 100644 rubbos/app/httpd-2.0.64/config.log create mode 100755 rubbos/app/httpd-2.0.64/config.nice create mode 100755 rubbos/app/httpd-2.0.64/config.status create mode 100755 rubbos/app/httpd-2.0.64/configure create mode 100644 rubbos/app/httpd-2.0.64/configure.in create mode 100644 rubbos/app/httpd-2.0.64/docs/cgi-examples/printenv create mode 100644 rubbos/app/httpd-2.0.64/docs/cgi-examples/test-cgi create mode 100644 rubbos/app/httpd-2.0.64/docs/conf/highperformance-std.conf create mode 100644 rubbos/app/httpd-2.0.64/docs/conf/httpd-std.conf create mode 100644 rubbos/app/httpd-2.0.64/docs/conf/httpd-std.conf.in create mode 100644 rubbos/app/httpd-2.0.64/docs/conf/httpd-win.conf create mode 100644 rubbos/app/httpd-2.0.64/docs/conf/magic create mode 100644 rubbos/app/httpd-2.0.64/docs/conf/mime.types create mode 100644 rubbos/app/httpd-2.0.64/docs/conf/ssl-std.conf create mode 100644 rubbos/app/httpd-2.0.64/docs/conf/ssl-std.conf.in create mode 100644 rubbos/app/httpd-2.0.64/docs/docroot/apache_pb.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/docroot/apache_pb.png create mode 100644 rubbos/app/httpd-2.0.64/docs/docroot/apache_pb2.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/docroot/apache_pb2.png create mode 100644 rubbos/app/httpd-2.0.64/docs/docroot/apache_pb2_ani.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/docroot/index.html.ca create mode 100644 rubbos/app/httpd-2.0.64/docs/docroot/index.html.cz.iso8859-2 create mode 100644 rubbos/app/httpd-2.0.64/docs/docroot/index.html.de create mode 100644 rubbos/app/httpd-2.0.64/docs/docroot/index.html.dk create mode 100644 rubbos/app/httpd-2.0.64/docs/docroot/index.html.ee create mode 100644 rubbos/app/httpd-2.0.64/docs/docroot/index.html.el create mode 100644 rubbos/app/httpd-2.0.64/docs/docroot/index.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/docroot/index.html.es create mode 100644 rubbos/app/httpd-2.0.64/docs/docroot/index.html.et create mode 100644 rubbos/app/httpd-2.0.64/docs/docroot/index.html.fr create mode 100644 rubbos/app/httpd-2.0.64/docs/docroot/index.html.he.iso8859-8 create mode 100644 rubbos/app/httpd-2.0.64/docs/docroot/index.html.hr.iso8859-2 create mode 100644 rubbos/app/httpd-2.0.64/docs/docroot/index.html.it create mode 100644 rubbos/app/httpd-2.0.64/docs/docroot/index.html.ja.iso2022-jp create mode 100644 rubbos/app/httpd-2.0.64/docs/docroot/index.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/docroot/index.html.lb.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/docroot/index.html.nl create mode 100644 rubbos/app/httpd-2.0.64/docs/docroot/index.html.nn create mode 100644 rubbos/app/httpd-2.0.64/docs/docroot/index.html.no create mode 100644 rubbos/app/httpd-2.0.64/docs/docroot/index.html.po.iso8859-2 create mode 100644 rubbos/app/httpd-2.0.64/docs/docroot/index.html.pt create mode 100644 rubbos/app/httpd-2.0.64/docs/docroot/index.html.pt-br create mode 100644 rubbos/app/httpd-2.0.64/docs/docroot/index.html.ru.cp-1251 create mode 100644 rubbos/app/httpd-2.0.64/docs/docroot/index.html.ru.cp866 create mode 100644 rubbos/app/httpd-2.0.64/docs/docroot/index.html.ru.iso-ru create mode 100644 rubbos/app/httpd-2.0.64/docs/docroot/index.html.ru.koi8-r create mode 100644 rubbos/app/httpd-2.0.64/docs/docroot/index.html.ru.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/docroot/index.html.sv create mode 100644 rubbos/app/httpd-2.0.64/docs/docroot/index.html.var create mode 100644 rubbos/app/httpd-2.0.64/docs/docroot/index.html.zh-cn.gb2312 create mode 100644 rubbos/app/httpd-2.0.64/docs/docroot/index.html.zh-tw.big5 create mode 100644 rubbos/app/httpd-2.0.64/docs/doxygen.conf create mode 100644 rubbos/app/httpd-2.0.64/docs/error/HTTP_BAD_GATEWAY.html.var create mode 100644 rubbos/app/httpd-2.0.64/docs/error/HTTP_BAD_REQUEST.html.var create mode 100644 rubbos/app/httpd-2.0.64/docs/error/HTTP_FORBIDDEN.html.var create mode 100644 rubbos/app/httpd-2.0.64/docs/error/HTTP_GONE.html.var create mode 100644 rubbos/app/httpd-2.0.64/docs/error/HTTP_INTERNAL_SERVER_ERROR.html.var create mode 100644 rubbos/app/httpd-2.0.64/docs/error/HTTP_LENGTH_REQUIRED.html.var create mode 100644 rubbos/app/httpd-2.0.64/docs/error/HTTP_METHOD_NOT_ALLOWED.html.var create mode 100644 rubbos/app/httpd-2.0.64/docs/error/HTTP_NOT_FOUND.html.var create mode 100644 rubbos/app/httpd-2.0.64/docs/error/HTTP_NOT_IMPLEMENTED.html.var create mode 100644 rubbos/app/httpd-2.0.64/docs/error/HTTP_PRECONDITION_FAILED.html.var create mode 100644 rubbos/app/httpd-2.0.64/docs/error/HTTP_REQUEST_ENTITY_TOO_LARGE.html.var create mode 100644 rubbos/app/httpd-2.0.64/docs/error/HTTP_REQUEST_TIME_OUT.html.var create mode 100644 rubbos/app/httpd-2.0.64/docs/error/HTTP_REQUEST_URI_TOO_LARGE.html.var create mode 100644 rubbos/app/httpd-2.0.64/docs/error/HTTP_SERVICE_UNAVAILABLE.html.var create mode 100644 rubbos/app/httpd-2.0.64/docs/error/HTTP_UNAUTHORIZED.html.var create mode 100644 rubbos/app/httpd-2.0.64/docs/error/HTTP_UNSUPPORTED_MEDIA_TYPE.html.var create mode 100644 rubbos/app/httpd-2.0.64/docs/error/HTTP_VARIANT_ALSO_VARIES.html.var create mode 100644 rubbos/app/httpd-2.0.64/docs/error/README create mode 100644 rubbos/app/httpd-2.0.64/docs/error/contact.html.var create mode 100644 rubbos/app/httpd-2.0.64/docs/error/include/bottom.html create mode 100644 rubbos/app/httpd-2.0.64/docs/error/include/spacer.html create mode 100644 rubbos/app/httpd-2.0.64/docs/error/include/top.html create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/README create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/README.html create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/a.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/a.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/alert.black.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/alert.black.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/alert.red.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/alert.red.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/apache_pb.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/apache_pb.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/apache_pb2.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/apache_pb2.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/apache_pb2_ani.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/back.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/back.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/ball.gray.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/ball.gray.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/ball.red.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/ball.red.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/binary.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/binary.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/binhex.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/binhex.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/blank.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/blank.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/bomb.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/bomb.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/box1.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/box1.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/box2.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/box2.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/broken.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/broken.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/burst.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/burst.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/c.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/c.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/comp.blue.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/comp.blue.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/comp.gray.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/comp.gray.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/compressed.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/compressed.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/continued.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/continued.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/dir.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/dir.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/diskimg.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/diskimg.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/down.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/down.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/dvi.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/dvi.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/f.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/f.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/folder.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/folder.open.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/folder.open.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/folder.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/folder.sec.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/folder.sec.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/forward.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/forward.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/generic.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/generic.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/generic.red.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/generic.red.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/generic.sec.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/generic.sec.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/hand.right.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/hand.right.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/hand.up.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/hand.up.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/icon.sheet.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/icon.sheet.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/image1.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/image1.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/image2.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/image2.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/image3.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/image3.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/index.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/index.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/layout.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/layout.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/left.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/left.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/link.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/link.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/movie.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/movie.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/p.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/p.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/patch.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/patch.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/pdf.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/pdf.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/pie0.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/pie0.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/pie1.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/pie1.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/pie2.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/pie2.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/pie3.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/pie3.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/pie4.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/pie4.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/pie5.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/pie5.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/pie6.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/pie6.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/pie7.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/pie7.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/pie8.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/pie8.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/portal.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/portal.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/ps.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/ps.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/quill.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/quill.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/right.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/right.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/screw1.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/screw1.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/screw2.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/screw2.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/script.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/script.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/back.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/back.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/binary.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/binary.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/binhex.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/binhex.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/blank.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/blank.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/broken.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/broken.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/burst.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/burst.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/comp1.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/comp1.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/comp2.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/comp2.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/compressed.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/compressed.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/continued.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/continued.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/dir.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/dir.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/dir2.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/dir2.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/doc.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/doc.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/forward.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/forward.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/generic.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/generic.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/generic2.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/generic2.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/generic3.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/generic3.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/image.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/image.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/image2.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/image2.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/index.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/index.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/key.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/key.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/movie.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/movie.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/patch.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/patch.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/ps.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/ps.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/rainbow.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/rainbow.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/sound.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/sound.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/sound2.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/sound2.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/tar.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/tar.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/text.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/text.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/transfer.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/transfer.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/unknown.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/unknown.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/uu.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/small/uu.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/sound1.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/sound1.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/sound2.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/sound2.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/sphere1.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/sphere1.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/sphere2.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/sphere2.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/tar.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/tar.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/tex.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/tex.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/text.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/text.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/transfer.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/transfer.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/unknown.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/unknown.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/up.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/up.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/uu.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/uu.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/uuencoded.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/uuencoded.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/world1.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/world1.png create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/world2.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/icons/world2.png create mode 100644 rubbos/app/httpd-2.0.64/docs/man/ab.8 create mode 100644 rubbos/app/httpd-2.0.64/docs/man/apachectl.8 create mode 100644 rubbos/app/httpd-2.0.64/docs/man/apxs.8 create mode 100644 rubbos/app/httpd-2.0.64/docs/man/dbmmanage.1 create mode 100644 rubbos/app/httpd-2.0.64/docs/man/htdbm.1 create mode 100644 rubbos/app/httpd-2.0.64/docs/man/htdigest.1 create mode 100644 rubbos/app/httpd-2.0.64/docs/man/htpasswd.1 create mode 100644 rubbos/app/httpd-2.0.64/docs/man/httpd.8 create mode 100644 rubbos/app/httpd-2.0.64/docs/man/logresolve.8 create mode 100644 rubbos/app/httpd-2.0.64/docs/man/rotatelogs.8 create mode 100644 rubbos/app/httpd-2.0.64/docs/man/suexec.8 create mode 100644 rubbos/app/httpd-2.0.64/docs/man/tr/ab.8 create mode 100644 rubbos/app/httpd-2.0.64/docs/man/tr/apachectl.8 create mode 100644 rubbos/app/httpd-2.0.64/docs/man/tr/apxs.8 create mode 100644 rubbos/app/httpd-2.0.64/docs/man/tr/dbmmanage.1 create mode 100644 rubbos/app/httpd-2.0.64/docs/man/tr/htdbm.1 create mode 100644 rubbos/app/httpd-2.0.64/docs/man/tr/htdigest.1 create mode 100644 rubbos/app/httpd-2.0.64/docs/man/tr/htpasswd.1 create mode 100644 rubbos/app/httpd-2.0.64/docs/man/tr/httpd.8 create mode 100644 rubbos/app/httpd-2.0.64/docs/man/tr/logresolve.8 create mode 100644 rubbos/app/httpd-2.0.64/docs/man/tr/rotatelogs.8 create mode 100644 rubbos/app/httpd-2.0.64/docs/man/tr/suexec.8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/LICENSE create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/bind.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/bind.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/bind.html.es create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/bind.html.fr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/bind.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/bind.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/bind.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/configuring.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/configuring.html.de create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/configuring.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/configuring.html.fr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/configuring.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/configuring.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/configuring.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/content-negotiation.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/content-negotiation.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/content-negotiation.html.fr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/content-negotiation.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/content-negotiation.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/content-negotiation.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/custom-error.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/custom-error.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/custom-error.html.es create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/custom-error.html.fr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/custom-error.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/custom-error.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/custom-error.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/developer/API.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/developer/API.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/developer/debugging.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/developer/debugging.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/developer/documenting.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/developer/documenting.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/developer/filters.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/developer/filters.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/developer/hooks.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/developer/hooks.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/developer/index.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/developer/index.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/developer/modules.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/developer/modules.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/developer/modules.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/developer/request.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/developer/request.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/developer/thread_safety.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/developer/thread_safety.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/dns-caveats.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/dns-caveats.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/dns-caveats.html.es create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/dns-caveats.html.fr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/dns-caveats.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/dns-caveats.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/dns-caveats.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/dso.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/dso.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/dso.html.es create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/dso.html.fr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/dso.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/dso.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/dso.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/env.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/env.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/env.html.es create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/env.html.fr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/env.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/env.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/env.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/faq/all_in_one.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/faq/all_in_one.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/faq/all_in_one.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/faq/all_in_one.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/faq/error.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/faq/error.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/faq/error.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/faq/error.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/faq/index.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/faq/index.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/faq/index.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/faq/index.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/faq/support.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/faq/support.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/faq/support.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/faq/support.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/filter.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/filter.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/filter.html.es create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/filter.html.fr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/filter.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/filter.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/filter.html.ru.koi8-r create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/filter.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/glossary.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/glossary.html.de create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/glossary.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/glossary.html.es create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/glossary.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/glossary.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/handler.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/handler.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/handler.html.es create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/handler.html.fr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/handler.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/handler.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/handler.html.ru.koi8-r create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/handler.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/howto/auth.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/howto/auth.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/howto/auth.html.es create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/howto/auth.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/howto/auth.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/howto/cgi.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/howto/cgi.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/howto/cgi.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/howto/cgi.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/howto/htaccess.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/howto/htaccess.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/howto/htaccess.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/howto/htaccess.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/howto/index.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/howto/index.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/howto/index.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/howto/index.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/howto/public_html.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/howto/public_html.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/howto/public_html.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/howto/public_html.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/howto/public_html.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/howto/ssi.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/howto/ssi.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/howto/ssi.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/howto/ssi.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/images/apache_header.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/images/custom_errordocs.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/images/custom_errordocs.png create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/images/down.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/images/favicon.ico create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/images/feather.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/images/feather.png create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/images/home.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/images/index.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/images/left.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/images/mod_rewrite_fig1.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/images/mod_rewrite_fig1.png create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/images/mod_rewrite_fig2.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/images/mod_rewrite_fig2.png create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/images/pixel.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/images/right.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/images/ssl_intro_fig1.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/images/ssl_intro_fig1.png create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/images/ssl_intro_fig2.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/images/ssl_intro_fig2.png create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/images/ssl_intro_fig3.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/images/ssl_intro_fig3.png create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/images/sub.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/images/up.gif create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/index.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/index.html.de create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/index.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/index.html.es create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/index.html.fr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/index.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/index.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/index.html.ru.koi8-r create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/index.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/install.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/install.html.de create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/install.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/install.html.es create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/install.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/install.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/install.html.ru.koi8-r create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/install.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/invoking.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/invoking.html.de create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/invoking.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/invoking.html.es create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/invoking.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/invoking.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/invoking.html.ru.koi8-r create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/invoking.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/license.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/license.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/logs.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/logs.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/logs.html.es create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/logs.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/logs.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/logs.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/misc/custom_errordocs.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/misc/custom_errordocs.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/misc/descriptors.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/misc/descriptors.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/misc/fin_wait_2.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/misc/fin_wait_2.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/misc/index.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/misc/index.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/misc/index.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/misc/known_client_problems.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/misc/known_client_problems.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/misc/perf-tuning.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/misc/perf-tuning.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/misc/perf-tuning.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/misc/perf-tuning.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/misc/relevant_standards.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/misc/relevant_standards.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/misc/relevant_standards.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/misc/rewriteguide.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/misc/rewriteguide.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/misc/rewriteguide.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/misc/security_tips.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/misc/security_tips.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/misc/security_tips.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/misc/security_tips.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/misc/tutorials.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/misc/tutorials.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/beos.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/beos.html.de create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/beos.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/beos.html.es create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/beos.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/core.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/core.html.de create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/core.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/core.html.es create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/core.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/core.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/directive-dict.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/directive-dict.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/directive-dict.html.es create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/directive-dict.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/directive-dict.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/directive-dict.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/directives.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/directives.html.de create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/directives.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/directives.html.es create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/directives.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/directives.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/directives.html.ru.koi8-r create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/directives.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/index.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/index.html.de create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/index.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/index.html.es create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/index.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/index.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/index.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/leader.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/leader.html.de create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/leader.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/leader.html.es create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/leader.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_access.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_access.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_access.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_actions.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_actions.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_actions.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_actions.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_alias.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_alias.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_alias.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_alias.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_alias.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_asis.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_asis.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_asis.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_asis.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_auth.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_auth.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_auth.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_auth_anon.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_auth_anon.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_auth_dbm.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_auth_dbm.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_auth_digest.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_auth_digest.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_auth_digest.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_auth_ldap.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_auth_ldap.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_autoindex.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_autoindex.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_autoindex.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_autoindex.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_autoindex.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_cache.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_cache.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_cache.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_cern_meta.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_cern_meta.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_cern_meta.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_cgi.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_cgi.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_cgi.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_cgi.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_cgid.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_cgid.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_cgid.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_cgid.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_charset_lite.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_charset_lite.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_charset_lite.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dav.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dav.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dav.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dav.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dav_fs.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dav_fs.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dav_fs.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dav_fs.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_deflate.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_deflate.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_deflate.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_deflate.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dir.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dir.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dir.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dir.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dir.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_disk_cache.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_disk_cache.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_disk_cache.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dumpio.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dumpio.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_echo.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_echo.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_echo.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_echo.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_env.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_env.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_env.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_env.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_env.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_example.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_example.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_example.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_expires.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_expires.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_expires.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_expires.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_ext_filter.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_ext_filter.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_ext_filter.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_file_cache.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_file_cache.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_file_cache.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_headers.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_headers.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_headers.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_imap.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_imap.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_imap.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_include.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_include.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_include.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_info.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_info.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_info.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_info.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_isapi.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_isapi.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_isapi.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_ldap.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_ldap.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_log_config.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_log_config.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_log_config.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_log_config.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_log_config.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_log_forensic.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_log_forensic.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_log_forensic.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_logio.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_logio.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_logio.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_logio.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_logio.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_mem_cache.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_mem_cache.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_mem_cache.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_mem_cache.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_mime.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_mime.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_mime.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_mime_magic.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_mime_magic.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_negotiation.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_negotiation.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_negotiation.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_nw_ssl.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_nw_ssl.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_proxy.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_proxy.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_proxy_connect.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_proxy_connect.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_proxy_ftp.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_proxy_ftp.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_proxy_http.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_proxy_http.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_rewrite.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_rewrite.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_setenvif.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_setenvif.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_setenvif.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_setenvif.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_setenvif.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_so.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_so.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_so.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_so.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_so.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_speling.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_speling.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_speling.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_speling.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_ssl.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_ssl.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_status.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_status.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_status.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_status.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_status.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_suexec.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_suexec.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_suexec.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_suexec.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_suexec.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_unique_id.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_unique_id.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_unique_id.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_unique_id.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_userdir.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_userdir.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_userdir.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_userdir.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_userdir.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_usertrack.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_usertrack.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_version.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_version.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_version.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_version.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_vhost_alias.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_vhost_alias.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mod_vhost_alias.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/module-dict.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/module-dict.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/module-dict.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/module-dict.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/module-dict.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mpm_common.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mpm_common.html.de create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mpm_common.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mpm_common.html.es create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mpm_common.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mpm_common.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mpm_netware.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mpm_netware.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mpm_winnt.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mpm_winnt.html.de create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mpm_winnt.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mpm_winnt.html.es create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mpm_winnt.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mpmt_os2.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/mpmt_os2.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/perchild.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/perchild.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/prefork.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/prefork.html.de create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/prefork.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/prefork.html.es create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/prefork.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/prefork.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/quickreference.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/quickreference.html.de create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/quickreference.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/quickreference.html.es create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/quickreference.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/quickreference.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/quickreference.html.ru.koi8-r create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/quickreference.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/threadpool.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/threadpool.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/worker.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/worker.html.de create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/worker.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/worker.html.es create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/worker.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mod/worker.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mpm.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mpm.html.de create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mpm.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mpm.html.es create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mpm.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mpm.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mpm.html.ru.koi8-r create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/mpm.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/new_features_2_0.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/new_features_2_0.html.de create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/new_features_2_0.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/new_features_2_0.html.es create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/new_features_2_0.html.fr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/new_features_2_0.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/new_features_2_0.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/new_features_2_0.html.ru.koi8-r create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/new_features_2_0.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/platform/ebcdic.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/platform/ebcdic.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/platform/ebcdic.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/platform/index.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/platform/index.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/platform/index.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/platform/netware.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/platform/netware.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/platform/netware.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/platform/perf-hp.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/platform/perf-hp.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/platform/perf-hp.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/platform/win_compiling.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/platform/win_compiling.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/platform/win_compiling.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/platform/windows.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/platform/windows.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/platform/windows.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/ab.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/ab.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/ab.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/ab.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/apachectl.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/apachectl.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/apachectl.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/apachectl.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/apxs.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/apxs.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/apxs.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/apxs.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/configure.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/configure.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/configure.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/configure.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/dbmmanage.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/dbmmanage.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/dbmmanage.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/dbmmanage.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/htdbm.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/htdbm.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/htdbm.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/htdigest.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/htdigest.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/htdigest.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/htdigest.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/htpasswd.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/htpasswd.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/htpasswd.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/htpasswd.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/httpd.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/httpd.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/httpd.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/httpd.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/index.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/index.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/index.html.es create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/index.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/index.html.ru.koi8-r create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/index.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/logresolve.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/logresolve.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/logresolve.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/logresolve.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/other.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/other.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/other.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/other.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/rotatelogs.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/rotatelogs.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/rotatelogs.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/rotatelogs.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/suexec.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/suexec.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/suexec.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/programs/suexec.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/rewrite/index.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/rewrite/index.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/rewrite/index.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/rewrite/rewrite_guide.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/rewrite/rewrite_guide.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/rewrite/rewrite_guide_advanced.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/rewrite/rewrite_guide_advanced.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/rewrite/rewrite_intro.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/rewrite/rewrite_intro.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/rewrite/rewrite_tech.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/rewrite/rewrite_tech.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/sections.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/sections.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/sections.html.es create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/sections.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/sections.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/sections.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/server-wide.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/server-wide.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/server-wide.html.es create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/server-wide.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/server-wide.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/server-wide.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/sitemap.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/sitemap.html.de create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/sitemap.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/sitemap.html.es create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/sitemap.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/sitemap.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/sitemap.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/ssl/index.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/ssl/index.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/ssl/index.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/ssl/index.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/ssl/ssl_compat.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/ssl/ssl_compat.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/ssl/ssl_faq.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/ssl/ssl_faq.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/ssl/ssl_howto.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/ssl/ssl_howto.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/ssl/ssl_intro.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/ssl/ssl_intro.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/ssl/ssl_intro.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/stopping.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/stopping.html.de create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/stopping.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/stopping.html.es create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/stopping.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/stopping.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/stopping.html.ru.koi8-r create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/stopping.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/style/build.properties create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/style/common.dtd create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/style/css/manual-chm.css create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/style/css/manual-loose-100pc.css create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/style/css/manual-print.css create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/style/css/manual-zip-100pc.css create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/style/css/manual-zip.css create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/style/css/manual.css create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/style/faq.dtd create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/style/lang.dtd create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/style/latex/atbeginend.sty create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/style/manualpage.dtd create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/style/modulesynopsis.dtd create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/style/sitemap.dtd create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/style/version.ent create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/suexec.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/suexec.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/suexec.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/suexec.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/suexec.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/upgrading.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/upgrading.html.de create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/upgrading.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/upgrading.html.es create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/upgrading.html.fr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/upgrading.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/upgrading.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/upgrading.html.ru.koi8-r create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/urlmapping.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/urlmapping.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/urlmapping.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/urlmapping.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/urlmapping.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/vhosts/details.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/vhosts/details.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/vhosts/details.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/vhosts/details.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/vhosts/examples.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/vhosts/examples.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/vhosts/examples.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/vhosts/examples.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/vhosts/fd-limits.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/vhosts/fd-limits.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/vhosts/fd-limits.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/vhosts/fd-limits.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/vhosts/fd-limits.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/vhosts/index.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/vhosts/index.html.de create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/vhosts/index.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/vhosts/index.html.es create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/vhosts/index.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/vhosts/index.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/vhosts/index.html.ru.koi8-r create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/vhosts/index.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/vhosts/ip-based.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/vhosts/ip-based.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/vhosts/ip-based.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/vhosts/ip-based.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/vhosts/mass.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/vhosts/mass.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/vhosts/mass.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/vhosts/mass.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/vhosts/name-based.html create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/vhosts/name-based.html.de create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/vhosts/name-based.html.en create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/vhosts/name-based.html.es create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/vhosts/name-based.html.ja.utf8 create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/vhosts/name-based.html.ko.euc-kr create mode 100644 rubbos/app/httpd-2.0.64/docs/manual/vhosts/name-based.html.tr.utf8 create mode 100644 rubbos/app/httpd-2.0.64/emacs-style create mode 100755 rubbos/app/httpd-2.0.64/httpd create mode 100644 rubbos/app/httpd-2.0.64/httpd.spec create mode 100644 rubbos/app/httpd-2.0.64/include/.indent.pro create mode 100644 rubbos/app/httpd-2.0.64/include/ap_compat.h create mode 100644 rubbos/app/httpd-2.0.64/include/ap_config.h create mode 100644 rubbos/app/httpd-2.0.64/include/ap_config_auto.h create mode 100644 rubbos/app/httpd-2.0.64/include/ap_config_auto.h.in create mode 100644 rubbos/app/httpd-2.0.64/include/ap_config_layout.h create mode 100644 rubbos/app/httpd-2.0.64/include/ap_config_layout.h.in create mode 100644 rubbos/app/httpd-2.0.64/include/ap_listen.h create mode 100644 rubbos/app/httpd-2.0.64/include/ap_mmn.h create mode 100644 rubbos/app/httpd-2.0.64/include/ap_mpm.h create mode 100644 rubbos/app/httpd-2.0.64/include/ap_provider.h create mode 100644 rubbos/app/httpd-2.0.64/include/ap_regkey.h create mode 100644 rubbos/app/httpd-2.0.64/include/ap_release.h create mode 100644 rubbos/app/httpd-2.0.64/include/http_config.h create mode 100644 rubbos/app/httpd-2.0.64/include/http_connection.h create mode 100644 rubbos/app/httpd-2.0.64/include/http_core.h create mode 100644 rubbos/app/httpd-2.0.64/include/http_log.h create mode 100644 rubbos/app/httpd-2.0.64/include/http_main.h create mode 100644 rubbos/app/httpd-2.0.64/include/http_protocol.h create mode 100644 rubbos/app/httpd-2.0.64/include/http_request.h create mode 100644 rubbos/app/httpd-2.0.64/include/http_vhost.h create mode 100644 rubbos/app/httpd-2.0.64/include/httpd.h create mode 100644 rubbos/app/httpd-2.0.64/include/mpm_common.h create mode 100644 rubbos/app/httpd-2.0.64/include/pcreposix.h create mode 100644 rubbos/app/httpd-2.0.64/include/rfc1413.h create mode 100644 rubbos/app/httpd-2.0.64/include/scoreboard.h create mode 100644 rubbos/app/httpd-2.0.64/include/util_cfgtree.h create mode 100644 rubbos/app/httpd-2.0.64/include/util_charset.h create mode 100644 rubbos/app/httpd-2.0.64/include/util_ebcdic.h create mode 100644 rubbos/app/httpd-2.0.64/include/util_filter.h create mode 100644 rubbos/app/httpd-2.0.64/include/util_ldap.h create mode 100644 rubbos/app/httpd-2.0.64/include/util_md5.h create mode 100644 rubbos/app/httpd-2.0.64/include/util_script.h create mode 100644 rubbos/app/httpd-2.0.64/include/util_time.h create mode 100644 rubbos/app/httpd-2.0.64/include/util_xml.h create mode 100644 rubbos/app/httpd-2.0.64/libhttpd.dsp create mode 100644 rubbos/app/httpd-2.0.64/modules.c create mode 100644 rubbos/app/httpd-2.0.64/modules.lo create mode 100644 rubbos/app/httpd-2.0.64/modules.o create mode 100644 rubbos/app/httpd-2.0.64/modules/.deps create mode 100644 rubbos/app/httpd-2.0.64/modules/Makefile create mode 100644 rubbos/app/httpd-2.0.64/modules/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/modules/NWGNUmakefile create mode 100644 rubbos/app/httpd-2.0.64/modules/README create mode 100644 rubbos/app/httpd-2.0.64/modules/aaa/.deps create mode 100644 rubbos/app/httpd-2.0.64/modules/aaa/.indent.pro create mode 100644 rubbos/app/httpd-2.0.64/modules/aaa/.libs/mod_access.a create mode 100644 rubbos/app/httpd-2.0.64/modules/aaa/.libs/mod_access.la create mode 100644 rubbos/app/httpd-2.0.64/modules/aaa/.libs/mod_access.o create mode 100644 rubbos/app/httpd-2.0.64/modules/aaa/.libs/mod_auth.a create mode 100644 rubbos/app/httpd-2.0.64/modules/aaa/.libs/mod_auth.la create mode 100644 rubbos/app/httpd-2.0.64/modules/aaa/.libs/mod_auth.o create mode 100644 rubbos/app/httpd-2.0.64/modules/aaa/Makefile create mode 100644 rubbos/app/httpd-2.0.64/modules/aaa/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/modules/aaa/NWGNUauthanon create mode 100644 rubbos/app/httpd-2.0.64/modules/aaa/NWGNUauthdbm create mode 100644 rubbos/app/httpd-2.0.64/modules/aaa/NWGNUdigest create mode 100644 rubbos/app/httpd-2.0.64/modules/aaa/NWGNUmakefile create mode 100644 rubbos/app/httpd-2.0.64/modules/aaa/config.m4 create mode 100644 rubbos/app/httpd-2.0.64/modules/aaa/mod_access.c create mode 100644 rubbos/app/httpd-2.0.64/modules/aaa/mod_access.dsp create mode 100644 rubbos/app/httpd-2.0.64/modules/aaa/mod_access.exp create mode 100644 rubbos/app/httpd-2.0.64/modules/aaa/mod_access.la create mode 100644 rubbos/app/httpd-2.0.64/modules/aaa/mod_access.lo create mode 100644 rubbos/app/httpd-2.0.64/modules/aaa/mod_access.o create mode 100644 rubbos/app/httpd-2.0.64/modules/aaa/mod_auth.c create mode 100644 rubbos/app/httpd-2.0.64/modules/aaa/mod_auth.dsp create mode 100644 rubbos/app/httpd-2.0.64/modules/aaa/mod_auth.exp create mode 100644 rubbos/app/httpd-2.0.64/modules/aaa/mod_auth.la create mode 100644 rubbos/app/httpd-2.0.64/modules/aaa/mod_auth.lo create mode 100644 rubbos/app/httpd-2.0.64/modules/aaa/mod_auth.o create mode 100644 rubbos/app/httpd-2.0.64/modules/aaa/mod_auth_anon.c create mode 100644 rubbos/app/httpd-2.0.64/modules/aaa/mod_auth_anon.dsp create mode 100644 rubbos/app/httpd-2.0.64/modules/aaa/mod_auth_anon.exp create mode 100644 rubbos/app/httpd-2.0.64/modules/aaa/mod_auth_dbm.c create mode 100644 rubbos/app/httpd-2.0.64/modules/aaa/mod_auth_dbm.dsp create mode 100644 rubbos/app/httpd-2.0.64/modules/aaa/mod_auth_dbm.exp create mode 100644 rubbos/app/httpd-2.0.64/modules/aaa/mod_auth_digest.c create mode 100644 rubbos/app/httpd-2.0.64/modules/aaa/mod_auth_digest.dsp create mode 100644 rubbos/app/httpd-2.0.64/modules/aaa/modules.mk create mode 100644 rubbos/app/httpd-2.0.64/modules/arch/netware/libprews.c create mode 100644 rubbos/app/httpd-2.0.64/modules/arch/netware/mod_auth_anon.def create mode 100644 rubbos/app/httpd-2.0.64/modules/arch/netware/mod_auth_basic.def create mode 100644 rubbos/app/httpd-2.0.64/modules/arch/netware/mod_auth_dbm.def create mode 100644 rubbos/app/httpd-2.0.64/modules/arch/netware/mod_auth_digest.def create mode 100644 rubbos/app/httpd-2.0.64/modules/arch/netware/mod_cache.def create mode 100644 rubbos/app/httpd-2.0.64/modules/arch/netware/mod_cern_meta.def create mode 100644 rubbos/app/httpd-2.0.64/modules/arch/netware/mod_dav.def create mode 100644 rubbos/app/httpd-2.0.64/modules/arch/netware/mod_disk_cache.def create mode 100644 rubbos/app/httpd-2.0.64/modules/arch/netware/mod_echo.def create mode 100644 rubbos/app/httpd-2.0.64/modules/arch/netware/mod_expires.def create mode 100644 rubbos/app/httpd-2.0.64/modules/arch/netware/mod_file_cache.def create mode 100644 rubbos/app/httpd-2.0.64/modules/arch/netware/mod_headers.def create mode 100644 rubbos/app/httpd-2.0.64/modules/arch/netware/mod_info.def create mode 100644 rubbos/app/httpd-2.0.64/modules/arch/netware/mod_logio.def create mode 100644 rubbos/app/httpd-2.0.64/modules/arch/netware/mod_mem_cache.def create mode 100644 rubbos/app/httpd-2.0.64/modules/arch/netware/mod_mime_magic.def create mode 100644 rubbos/app/httpd-2.0.64/modules/arch/netware/mod_netware.c create mode 100644 rubbos/app/httpd-2.0.64/modules/arch/netware/mod_nw_ssl.c create mode 100644 rubbos/app/httpd-2.0.64/modules/arch/netware/mod_proxy.def create mode 100644 rubbos/app/httpd-2.0.64/modules/arch/netware/mod_proxy_connect.def create mode 100644 rubbos/app/httpd-2.0.64/modules/arch/netware/mod_proxy_ftp.def create mode 100644 rubbos/app/httpd-2.0.64/modules/arch/netware/mod_proxy_http.def create mode 100644 rubbos/app/httpd-2.0.64/modules/arch/netware/mod_rewrite.def create mode 100644 rubbos/app/httpd-2.0.64/modules/arch/netware/mod_speling.def create mode 100644 rubbos/app/httpd-2.0.64/modules/arch/netware/mod_status.def create mode 100644 rubbos/app/httpd-2.0.64/modules/arch/netware/mod_unique_id.def create mode 100644 rubbos/app/httpd-2.0.64/modules/arch/netware/mod_usertrack.def create mode 100644 rubbos/app/httpd-2.0.64/modules/arch/netware/mod_vhost_alias.def create mode 100644 rubbos/app/httpd-2.0.64/modules/arch/netware/moddavfs.def create mode 100644 rubbos/app/httpd-2.0.64/modules/arch/win32/.deps create mode 100644 rubbos/app/httpd-2.0.64/modules/arch/win32/Makefile create mode 100644 rubbos/app/httpd-2.0.64/modules/arch/win32/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/modules/arch/win32/config.m4 create mode 100644 rubbos/app/httpd-2.0.64/modules/arch/win32/mod_isapi.c create mode 100644 rubbos/app/httpd-2.0.64/modules/arch/win32/mod_isapi.dsp create mode 100644 rubbos/app/httpd-2.0.64/modules/arch/win32/mod_isapi.h create mode 100644 rubbos/app/httpd-2.0.64/modules/arch/win32/mod_win32.c create mode 100644 rubbos/app/httpd-2.0.64/modules/arch/win32/modules.mk create mode 100644 rubbos/app/httpd-2.0.64/modules/cache/.deps create mode 100644 rubbos/app/httpd-2.0.64/modules/cache/.indent.pro create mode 100644 rubbos/app/httpd-2.0.64/modules/cache/Makefile create mode 100644 rubbos/app/httpd-2.0.64/modules/cache/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/modules/cache/config.m4 create mode 100644 rubbos/app/httpd-2.0.64/modules/cache/mod_file_cache.c create mode 100644 rubbos/app/httpd-2.0.64/modules/cache/mod_file_cache.dsp create mode 100644 rubbos/app/httpd-2.0.64/modules/cache/mod_file_cache.exp create mode 100644 rubbos/app/httpd-2.0.64/modules/cache/modules.mk create mode 100644 rubbos/app/httpd-2.0.64/modules/config5.m4 create mode 100644 rubbos/app/httpd-2.0.64/modules/dav/fs/.deps create mode 100644 rubbos/app/httpd-2.0.64/modules/dav/fs/Makefile create mode 100644 rubbos/app/httpd-2.0.64/modules/dav/fs/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/modules/dav/fs/NWGNUmakefile create mode 100644 rubbos/app/httpd-2.0.64/modules/dav/fs/config6.m4 create mode 100644 rubbos/app/httpd-2.0.64/modules/dav/fs/dbm.c create mode 100644 rubbos/app/httpd-2.0.64/modules/dav/fs/lock.c create mode 100644 rubbos/app/httpd-2.0.64/modules/dav/fs/mod_dav_fs.c create mode 100644 rubbos/app/httpd-2.0.64/modules/dav/fs/mod_dav_fs.dsp create mode 100644 rubbos/app/httpd-2.0.64/modules/dav/fs/modules.mk create mode 100644 rubbos/app/httpd-2.0.64/modules/dav/fs/repos.c create mode 100644 rubbos/app/httpd-2.0.64/modules/dav/fs/repos.h create mode 100644 rubbos/app/httpd-2.0.64/modules/dav/main/.deps create mode 100644 rubbos/app/httpd-2.0.64/modules/dav/main/Makefile create mode 100644 rubbos/app/httpd-2.0.64/modules/dav/main/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/modules/dav/main/NWGNUmakefile create mode 100644 rubbos/app/httpd-2.0.64/modules/dav/main/config5.m4 create mode 100644 rubbos/app/httpd-2.0.64/modules/dav/main/dav.imp create mode 100644 rubbos/app/httpd-2.0.64/modules/dav/main/liveprop.c create mode 100644 rubbos/app/httpd-2.0.64/modules/dav/main/mod_dav.c create mode 100644 rubbos/app/httpd-2.0.64/modules/dav/main/mod_dav.dsp create mode 100644 rubbos/app/httpd-2.0.64/modules/dav/main/mod_dav.h create mode 100644 rubbos/app/httpd-2.0.64/modules/dav/main/modules.mk create mode 100644 rubbos/app/httpd-2.0.64/modules/dav/main/props.c create mode 100644 rubbos/app/httpd-2.0.64/modules/dav/main/providers.c create mode 100644 rubbos/app/httpd-2.0.64/modules/dav/main/std_liveprop.c create mode 100644 rubbos/app/httpd-2.0.64/modules/dav/main/util.c create mode 100644 rubbos/app/httpd-2.0.64/modules/dav/main/util_lock.c create mode 100644 rubbos/app/httpd-2.0.64/modules/echo/.deps create mode 100644 rubbos/app/httpd-2.0.64/modules/echo/.indent.pro create mode 100644 rubbos/app/httpd-2.0.64/modules/echo/Makefile create mode 100644 rubbos/app/httpd-2.0.64/modules/echo/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/modules/echo/NWGNUmakefile create mode 100644 rubbos/app/httpd-2.0.64/modules/echo/config.m4 create mode 100644 rubbos/app/httpd-2.0.64/modules/echo/mod_echo.c create mode 100644 rubbos/app/httpd-2.0.64/modules/echo/mod_echo.dsp create mode 100644 rubbos/app/httpd-2.0.64/modules/echo/modules.mk create mode 100644 rubbos/app/httpd-2.0.64/modules/experimental/.deps create mode 100644 rubbos/app/httpd-2.0.64/modules/experimental/.indent.pro create mode 100644 rubbos/app/httpd-2.0.64/modules/experimental/Makefile create mode 100644 rubbos/app/httpd-2.0.64/modules/experimental/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/modules/experimental/NWGNUauthldap create mode 100644 rubbos/app/httpd-2.0.64/modules/experimental/NWGNUcharsetl create mode 100644 rubbos/app/httpd-2.0.64/modules/experimental/NWGNUdsk_cach create mode 100644 rubbos/app/httpd-2.0.64/modules/experimental/NWGNUexample create mode 100644 rubbos/app/httpd-2.0.64/modules/experimental/NWGNUmakefile create mode 100644 rubbos/app/httpd-2.0.64/modules/experimental/NWGNUmem_cach create mode 100644 rubbos/app/httpd-2.0.64/modules/experimental/NWGNUmod_cach create mode 100644 rubbos/app/httpd-2.0.64/modules/experimental/NWGNUmoddumpio create mode 100644 rubbos/app/httpd-2.0.64/modules/experimental/NWGNUutilldap create mode 100644 rubbos/app/httpd-2.0.64/modules/experimental/README create mode 100644 rubbos/app/httpd-2.0.64/modules/experimental/README.ldap create mode 100644 rubbos/app/httpd-2.0.64/modules/experimental/cache_cache.c create mode 100644 rubbos/app/httpd-2.0.64/modules/experimental/cache_cache.h create mode 100644 rubbos/app/httpd-2.0.64/modules/experimental/cache_hash.c create mode 100644 rubbos/app/httpd-2.0.64/modules/experimental/cache_hash.h create mode 100644 rubbos/app/httpd-2.0.64/modules/experimental/cache_pqueue.c create mode 100644 rubbos/app/httpd-2.0.64/modules/experimental/cache_pqueue.h create mode 100644 rubbos/app/httpd-2.0.64/modules/experimental/cache_storage.c create mode 100644 rubbos/app/httpd-2.0.64/modules/experimental/cache_util.c create mode 100644 rubbos/app/httpd-2.0.64/modules/experimental/charset.conv create mode 100644 rubbos/app/httpd-2.0.64/modules/experimental/config.m4 create mode 100644 rubbos/app/httpd-2.0.64/modules/experimental/mod_auth_ldap.c create mode 100644 rubbos/app/httpd-2.0.64/modules/experimental/mod_auth_ldap.def create mode 100644 rubbos/app/httpd-2.0.64/modules/experimental/mod_auth_ldap.dsp create mode 100644 rubbos/app/httpd-2.0.64/modules/experimental/mod_cache.c create mode 100644 rubbos/app/httpd-2.0.64/modules/experimental/mod_cache.dsp create mode 100644 rubbos/app/httpd-2.0.64/modules/experimental/mod_cache.h create mode 100644 rubbos/app/httpd-2.0.64/modules/experimental/mod_cache.imp create mode 100644 rubbos/app/httpd-2.0.64/modules/experimental/mod_case_filter.c create mode 100644 rubbos/app/httpd-2.0.64/modules/experimental/mod_case_filter_in.c create mode 100644 rubbos/app/httpd-2.0.64/modules/experimental/mod_charset_lite.c create mode 100644 rubbos/app/httpd-2.0.64/modules/experimental/mod_charset_lite.dsp create mode 100644 rubbos/app/httpd-2.0.64/modules/experimental/mod_charset_lite.exp create mode 100644 rubbos/app/httpd-2.0.64/modules/experimental/mod_disk_cache.c create mode 100644 rubbos/app/httpd-2.0.64/modules/experimental/mod_disk_cache.dsp create mode 100644 rubbos/app/httpd-2.0.64/modules/experimental/mod_dumpio.c create mode 100644 rubbos/app/httpd-2.0.64/modules/experimental/mod_dumpio.dsp create mode 100644 rubbos/app/httpd-2.0.64/modules/experimental/mod_example.c create mode 100644 rubbos/app/httpd-2.0.64/modules/experimental/mod_mem_cache.c create mode 100644 rubbos/app/httpd-2.0.64/modules/experimental/mod_mem_cache.dsp create mode 100644 rubbos/app/httpd-2.0.64/modules/experimental/modules.mk create mode 100644 rubbos/app/httpd-2.0.64/modules/experimental/util_ldap.c create mode 100644 rubbos/app/httpd-2.0.64/modules/experimental/util_ldap.def create mode 100644 rubbos/app/httpd-2.0.64/modules/experimental/util_ldap.dsp create mode 100644 rubbos/app/httpd-2.0.64/modules/experimental/util_ldap_cache.c create mode 100644 rubbos/app/httpd-2.0.64/modules/experimental/util_ldap_cache.h create mode 100644 rubbos/app/httpd-2.0.64/modules/experimental/util_ldap_cache_mgr.c create mode 100644 rubbos/app/httpd-2.0.64/modules/filters/.deps create mode 100644 rubbos/app/httpd-2.0.64/modules/filters/.indent.pro create mode 100644 rubbos/app/httpd-2.0.64/modules/filters/.libs/mod_include.a create mode 100644 rubbos/app/httpd-2.0.64/modules/filters/.libs/mod_include.la create mode 100644 rubbos/app/httpd-2.0.64/modules/filters/.libs/mod_include.o create mode 100644 rubbos/app/httpd-2.0.64/modules/filters/Makefile create mode 100644 rubbos/app/httpd-2.0.64/modules/filters/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/modules/filters/NWGNUdeflate create mode 100644 rubbos/app/httpd-2.0.64/modules/filters/NWGNUextfiltr create mode 100644 rubbos/app/httpd-2.0.64/modules/filters/NWGNUmakefile create mode 100644 rubbos/app/httpd-2.0.64/modules/filters/config.m4 create mode 100644 rubbos/app/httpd-2.0.64/modules/filters/mod_deflate.c create mode 100644 rubbos/app/httpd-2.0.64/modules/filters/mod_deflate.dsp create mode 100644 rubbos/app/httpd-2.0.64/modules/filters/mod_deflate.exp create mode 100644 rubbos/app/httpd-2.0.64/modules/filters/mod_ext_filter.c create mode 100644 rubbos/app/httpd-2.0.64/modules/filters/mod_ext_filter.dsp create mode 100644 rubbos/app/httpd-2.0.64/modules/filters/mod_ext_filter.exp create mode 100644 rubbos/app/httpd-2.0.64/modules/filters/mod_include.c create mode 100644 rubbos/app/httpd-2.0.64/modules/filters/mod_include.dsp create mode 100644 rubbos/app/httpd-2.0.64/modules/filters/mod_include.exp create mode 100644 rubbos/app/httpd-2.0.64/modules/filters/mod_include.h create mode 100644 rubbos/app/httpd-2.0.64/modules/filters/mod_include.la create mode 100644 rubbos/app/httpd-2.0.64/modules/filters/mod_include.lo create mode 100644 rubbos/app/httpd-2.0.64/modules/filters/mod_include.o create mode 100644 rubbos/app/httpd-2.0.64/modules/filters/modules.mk create mode 100644 rubbos/app/httpd-2.0.64/modules/generators/.deps create mode 100644 rubbos/app/httpd-2.0.64/modules/generators/.indent.pro create mode 100644 rubbos/app/httpd-2.0.64/modules/generators/.libs/mod_asis.a create mode 100644 rubbos/app/httpd-2.0.64/modules/generators/.libs/mod_asis.la create mode 100644 rubbos/app/httpd-2.0.64/modules/generators/.libs/mod_asis.o create mode 100644 rubbos/app/httpd-2.0.64/modules/generators/.libs/mod_autoindex.a create mode 100644 rubbos/app/httpd-2.0.64/modules/generators/.libs/mod_autoindex.la create mode 100644 rubbos/app/httpd-2.0.64/modules/generators/.libs/mod_autoindex.o create mode 100644 rubbos/app/httpd-2.0.64/modules/generators/.libs/mod_cgid.a create mode 100644 rubbos/app/httpd-2.0.64/modules/generators/.libs/mod_cgid.la create mode 100644 rubbos/app/httpd-2.0.64/modules/generators/.libs/mod_cgid.o create mode 100644 rubbos/app/httpd-2.0.64/modules/generators/.libs/mod_status.a create mode 100644 rubbos/app/httpd-2.0.64/modules/generators/.libs/mod_status.la create mode 100644 rubbos/app/httpd-2.0.64/modules/generators/.libs/mod_status.o create mode 100644 rubbos/app/httpd-2.0.64/modules/generators/Makefile create mode 100644 rubbos/app/httpd-2.0.64/modules/generators/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/modules/generators/NWGNUinfo create mode 100644 rubbos/app/httpd-2.0.64/modules/generators/NWGNUmakefile create mode 100644 rubbos/app/httpd-2.0.64/modules/generators/NWGNUstatus create mode 100644 rubbos/app/httpd-2.0.64/modules/generators/config5.m4 create mode 100644 rubbos/app/httpd-2.0.64/modules/generators/mod_asis.c create mode 100644 rubbos/app/httpd-2.0.64/modules/generators/mod_asis.dsp create mode 100644 rubbos/app/httpd-2.0.64/modules/generators/mod_asis.exp create mode 100644 rubbos/app/httpd-2.0.64/modules/generators/mod_asis.la create mode 100644 rubbos/app/httpd-2.0.64/modules/generators/mod_asis.lo create mode 100644 rubbos/app/httpd-2.0.64/modules/generators/mod_asis.o create mode 100644 rubbos/app/httpd-2.0.64/modules/generators/mod_autoindex.c create mode 100644 rubbos/app/httpd-2.0.64/modules/generators/mod_autoindex.dsp create mode 100644 rubbos/app/httpd-2.0.64/modules/generators/mod_autoindex.exp create mode 100644 rubbos/app/httpd-2.0.64/modules/generators/mod_autoindex.la create mode 100644 rubbos/app/httpd-2.0.64/modules/generators/mod_autoindex.lo create mode 100644 rubbos/app/httpd-2.0.64/modules/generators/mod_autoindex.o create mode 100644 rubbos/app/httpd-2.0.64/modules/generators/mod_cgi.c create mode 100644 rubbos/app/httpd-2.0.64/modules/generators/mod_cgi.dsp create mode 100644 rubbos/app/httpd-2.0.64/modules/generators/mod_cgi.exp create mode 100644 rubbos/app/httpd-2.0.64/modules/generators/mod_cgi.h create mode 100644 rubbos/app/httpd-2.0.64/modules/generators/mod_cgid.c create mode 100644 rubbos/app/httpd-2.0.64/modules/generators/mod_cgid.exp create mode 100644 rubbos/app/httpd-2.0.64/modules/generators/mod_cgid.la create mode 100644 rubbos/app/httpd-2.0.64/modules/generators/mod_cgid.lo create mode 100644 rubbos/app/httpd-2.0.64/modules/generators/mod_cgid.o create mode 100644 rubbos/app/httpd-2.0.64/modules/generators/mod_info.c create mode 100644 rubbos/app/httpd-2.0.64/modules/generators/mod_info.dsp create mode 100644 rubbos/app/httpd-2.0.64/modules/generators/mod_info.exp create mode 100644 rubbos/app/httpd-2.0.64/modules/generators/mod_status.c create mode 100644 rubbos/app/httpd-2.0.64/modules/generators/mod_status.dsp create mode 100644 rubbos/app/httpd-2.0.64/modules/generators/mod_status.exp create mode 100644 rubbos/app/httpd-2.0.64/modules/generators/mod_status.h create mode 100644 rubbos/app/httpd-2.0.64/modules/generators/mod_status.la create mode 100644 rubbos/app/httpd-2.0.64/modules/generators/mod_status.lo create mode 100644 rubbos/app/httpd-2.0.64/modules/generators/mod_status.o create mode 100644 rubbos/app/httpd-2.0.64/modules/generators/mod_suexec.c create mode 100644 rubbos/app/httpd-2.0.64/modules/generators/mod_suexec.h create mode 100644 rubbos/app/httpd-2.0.64/modules/generators/modules.mk create mode 100644 rubbos/app/httpd-2.0.64/modules/http/.deps create mode 100644 rubbos/app/httpd-2.0.64/modules/http/.indent.pro create mode 100644 rubbos/app/httpd-2.0.64/modules/http/.libs/http_core.o create mode 100644 rubbos/app/httpd-2.0.64/modules/http/.libs/http_protocol.o create mode 100644 rubbos/app/httpd-2.0.64/modules/http/.libs/http_request.o create mode 100644 rubbos/app/httpd-2.0.64/modules/http/.libs/mod_http.a create mode 100644 rubbos/app/httpd-2.0.64/modules/http/.libs/mod_http.la create mode 100644 rubbos/app/httpd-2.0.64/modules/http/.libs/mod_mime.a create mode 100644 rubbos/app/httpd-2.0.64/modules/http/.libs/mod_mime.la create mode 100644 rubbos/app/httpd-2.0.64/modules/http/.libs/mod_mime.o create mode 100644 rubbos/app/httpd-2.0.64/modules/http/Makefile create mode 100644 rubbos/app/httpd-2.0.64/modules/http/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/modules/http/config2.m4 create mode 100644 rubbos/app/httpd-2.0.64/modules/http/http_core.c create mode 100644 rubbos/app/httpd-2.0.64/modules/http/http_core.lo create mode 100644 rubbos/app/httpd-2.0.64/modules/http/http_core.o create mode 100644 rubbos/app/httpd-2.0.64/modules/http/http_protocol.c create mode 100644 rubbos/app/httpd-2.0.64/modules/http/http_protocol.lo create mode 100644 rubbos/app/httpd-2.0.64/modules/http/http_protocol.o create mode 100644 rubbos/app/httpd-2.0.64/modules/http/http_request.c create mode 100644 rubbos/app/httpd-2.0.64/modules/http/http_request.lo create mode 100644 rubbos/app/httpd-2.0.64/modules/http/http_request.o create mode 100644 rubbos/app/httpd-2.0.64/modules/http/mod_core.h create mode 100644 rubbos/app/httpd-2.0.64/modules/http/mod_http.la create mode 100644 rubbos/app/httpd-2.0.64/modules/http/mod_mime.c create mode 100644 rubbos/app/httpd-2.0.64/modules/http/mod_mime.dsp create mode 100644 rubbos/app/httpd-2.0.64/modules/http/mod_mime.exp create mode 100644 rubbos/app/httpd-2.0.64/modules/http/mod_mime.la create mode 100644 rubbos/app/httpd-2.0.64/modules/http/mod_mime.lo create mode 100644 rubbos/app/httpd-2.0.64/modules/http/mod_mime.o create mode 100644 rubbos/app/httpd-2.0.64/modules/http/modules.mk create mode 100644 rubbos/app/httpd-2.0.64/modules/loggers/.deps create mode 100644 rubbos/app/httpd-2.0.64/modules/loggers/.indent.pro create mode 100644 rubbos/app/httpd-2.0.64/modules/loggers/.libs/mod_log_config.a create mode 100644 rubbos/app/httpd-2.0.64/modules/loggers/.libs/mod_log_config.la create mode 100644 rubbos/app/httpd-2.0.64/modules/loggers/.libs/mod_log_config.o create mode 100644 rubbos/app/httpd-2.0.64/modules/loggers/Makefile create mode 100644 rubbos/app/httpd-2.0.64/modules/loggers/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/modules/loggers/NWGNUforensic create mode 100644 rubbos/app/httpd-2.0.64/modules/loggers/NWGNUmakefile create mode 100644 rubbos/app/httpd-2.0.64/modules/loggers/NWGNUmodlogio create mode 100644 rubbos/app/httpd-2.0.64/modules/loggers/config.m4 create mode 100644 rubbos/app/httpd-2.0.64/modules/loggers/mod_log_config.c create mode 100644 rubbos/app/httpd-2.0.64/modules/loggers/mod_log_config.dsp create mode 100644 rubbos/app/httpd-2.0.64/modules/loggers/mod_log_config.exp create mode 100644 rubbos/app/httpd-2.0.64/modules/loggers/mod_log_config.h create mode 100644 rubbos/app/httpd-2.0.64/modules/loggers/mod_log_config.la create mode 100644 rubbos/app/httpd-2.0.64/modules/loggers/mod_log_config.lo create mode 100644 rubbos/app/httpd-2.0.64/modules/loggers/mod_log_config.o create mode 100644 rubbos/app/httpd-2.0.64/modules/loggers/mod_log_forensic.c create mode 100644 rubbos/app/httpd-2.0.64/modules/loggers/mod_log_forensic.dsp create mode 100644 rubbos/app/httpd-2.0.64/modules/loggers/mod_log_forensic.exp create mode 100644 rubbos/app/httpd-2.0.64/modules/loggers/mod_logio.c create mode 100644 rubbos/app/httpd-2.0.64/modules/loggers/mod_logio.dsp create mode 100644 rubbos/app/httpd-2.0.64/modules/loggers/modules.mk create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/.deps create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/.indent.pro create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/.libs/mod_actions.a create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/.libs/mod_actions.la create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/.libs/mod_actions.o create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/.libs/mod_alias.a create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/.libs/mod_alias.la create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/.libs/mod_alias.o create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/.libs/mod_dir.a create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/.libs/mod_dir.la create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/.libs/mod_dir.o create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/.libs/mod_imap.a create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/.libs/mod_imap.la create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/.libs/mod_imap.o create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/.libs/mod_negotiation.a create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/.libs/mod_negotiation.la create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/.libs/mod_negotiation.o create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/.libs/mod_so.a create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/.libs/mod_so.la create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/.libs/mod_so.o create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/.libs/mod_userdir.a create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/.libs/mod_userdir.la create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/.libs/mod_userdir.o create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/Makefile create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/NWGNUmakefile create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/NWGNUrewrite create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/NWGNUspeling create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/NWGNUvhost create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/config9.m4 create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/mod_actions.c create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/mod_actions.dsp create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/mod_actions.exp create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/mod_actions.la create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/mod_actions.lo create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/mod_actions.o create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/mod_alias.c create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/mod_alias.dsp create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/mod_alias.exp create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/mod_alias.la create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/mod_alias.lo create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/mod_alias.o create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/mod_dir.c create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/mod_dir.dsp create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/mod_dir.exp create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/mod_dir.la create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/mod_dir.lo create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/mod_dir.o create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/mod_imap.c create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/mod_imap.dsp create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/mod_imap.exp create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/mod_imap.la create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/mod_imap.lo create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/mod_imap.o create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/mod_negotiation.c create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/mod_negotiation.dsp create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/mod_negotiation.exp create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/mod_negotiation.la create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/mod_negotiation.lo create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/mod_negotiation.o create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/mod_rewrite.c create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/mod_rewrite.dsp create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/mod_rewrite.exp create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/mod_rewrite.h create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/mod_so.c create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/mod_so.la create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/mod_so.lo create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/mod_so.o create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/mod_speling.c create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/mod_speling.dsp create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/mod_speling.exp create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/mod_userdir.c create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/mod_userdir.dsp create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/mod_userdir.exp create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/mod_userdir.la create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/mod_userdir.lo create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/mod_userdir.o create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/mod_vhost_alias.c create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/mod_vhost_alias.dsp create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/mod_vhost_alias.exp create mode 100644 rubbos/app/httpd-2.0.64/modules/mappers/modules.mk create mode 100644 rubbos/app/httpd-2.0.64/modules/metadata/.deps create mode 100644 rubbos/app/httpd-2.0.64/modules/metadata/.indent.pro create mode 100644 rubbos/app/httpd-2.0.64/modules/metadata/.libs/mod_env.a create mode 100644 rubbos/app/httpd-2.0.64/modules/metadata/.libs/mod_env.la create mode 100644 rubbos/app/httpd-2.0.64/modules/metadata/.libs/mod_env.o create mode 100644 rubbos/app/httpd-2.0.64/modules/metadata/.libs/mod_setenvif.a create mode 100644 rubbos/app/httpd-2.0.64/modules/metadata/.libs/mod_setenvif.la create mode 100644 rubbos/app/httpd-2.0.64/modules/metadata/.libs/mod_setenvif.o create mode 100644 rubbos/app/httpd-2.0.64/modules/metadata/Makefile create mode 100644 rubbos/app/httpd-2.0.64/modules/metadata/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/modules/metadata/NWGNUcernmeta create mode 100644 rubbos/app/httpd-2.0.64/modules/metadata/NWGNUexpires create mode 100644 rubbos/app/httpd-2.0.64/modules/metadata/NWGNUheaders create mode 100644 rubbos/app/httpd-2.0.64/modules/metadata/NWGNUmakefile create mode 100644 rubbos/app/httpd-2.0.64/modules/metadata/NWGNUmimemagi create mode 100644 rubbos/app/httpd-2.0.64/modules/metadata/NWGNUmodversion create mode 100644 rubbos/app/httpd-2.0.64/modules/metadata/NWGNUuniqueid create mode 100644 rubbos/app/httpd-2.0.64/modules/metadata/NWGNUusertrk create mode 100644 rubbos/app/httpd-2.0.64/modules/metadata/config.m4 create mode 100644 rubbos/app/httpd-2.0.64/modules/metadata/mod_cern_meta.c create mode 100644 rubbos/app/httpd-2.0.64/modules/metadata/mod_cern_meta.dsp create mode 100644 rubbos/app/httpd-2.0.64/modules/metadata/mod_cern_meta.exp create mode 100644 rubbos/app/httpd-2.0.64/modules/metadata/mod_env.c create mode 100644 rubbos/app/httpd-2.0.64/modules/metadata/mod_env.dsp create mode 100644 rubbos/app/httpd-2.0.64/modules/metadata/mod_env.exp create mode 100644 rubbos/app/httpd-2.0.64/modules/metadata/mod_env.la create mode 100644 rubbos/app/httpd-2.0.64/modules/metadata/mod_env.lo create mode 100644 rubbos/app/httpd-2.0.64/modules/metadata/mod_env.o create mode 100644 rubbos/app/httpd-2.0.64/modules/metadata/mod_expires.c create mode 100644 rubbos/app/httpd-2.0.64/modules/metadata/mod_expires.dsp create mode 100644 rubbos/app/httpd-2.0.64/modules/metadata/mod_expires.exp create mode 100644 rubbos/app/httpd-2.0.64/modules/metadata/mod_headers.c create mode 100644 rubbos/app/httpd-2.0.64/modules/metadata/mod_headers.dsp create mode 100644 rubbos/app/httpd-2.0.64/modules/metadata/mod_headers.exp create mode 100644 rubbos/app/httpd-2.0.64/modules/metadata/mod_mime_magic.c create mode 100644 rubbos/app/httpd-2.0.64/modules/metadata/mod_mime_magic.dsp create mode 100644 rubbos/app/httpd-2.0.64/modules/metadata/mod_mime_magic.exp create mode 100644 rubbos/app/httpd-2.0.64/modules/metadata/mod_setenvif.c create mode 100644 rubbos/app/httpd-2.0.64/modules/metadata/mod_setenvif.dsp create mode 100644 rubbos/app/httpd-2.0.64/modules/metadata/mod_setenvif.exp create mode 100644 rubbos/app/httpd-2.0.64/modules/metadata/mod_setenvif.la create mode 100644 rubbos/app/httpd-2.0.64/modules/metadata/mod_setenvif.lo create mode 100644 rubbos/app/httpd-2.0.64/modules/metadata/mod_setenvif.o create mode 100644 rubbos/app/httpd-2.0.64/modules/metadata/mod_unique_id.c create mode 100644 rubbos/app/httpd-2.0.64/modules/metadata/mod_unique_id.dsp create mode 100644 rubbos/app/httpd-2.0.64/modules/metadata/mod_unique_id.exp create mode 100644 rubbos/app/httpd-2.0.64/modules/metadata/mod_usertrack.c create mode 100644 rubbos/app/httpd-2.0.64/modules/metadata/mod_usertrack.dsp create mode 100644 rubbos/app/httpd-2.0.64/modules/metadata/mod_usertrack.exp create mode 100644 rubbos/app/httpd-2.0.64/modules/metadata/mod_version.c create mode 100644 rubbos/app/httpd-2.0.64/modules/metadata/mod_version.dsp create mode 100644 rubbos/app/httpd-2.0.64/modules/metadata/mod_version.exp create mode 100644 rubbos/app/httpd-2.0.64/modules/metadata/modules.mk create mode 100644 rubbos/app/httpd-2.0.64/modules/proxy/.deps create mode 100644 rubbos/app/httpd-2.0.64/modules/proxy/.indent.pro create mode 100644 rubbos/app/httpd-2.0.64/modules/proxy/CHANGES create mode 100644 rubbos/app/httpd-2.0.64/modules/proxy/Makefile create mode 100644 rubbos/app/httpd-2.0.64/modules/proxy/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/modules/proxy/NWGNUmakefile create mode 100644 rubbos/app/httpd-2.0.64/modules/proxy/NWGNUproxy create mode 100644 rubbos/app/httpd-2.0.64/modules/proxy/NWGNUproxycon create mode 100644 rubbos/app/httpd-2.0.64/modules/proxy/NWGNUproxyftp create mode 100644 rubbos/app/httpd-2.0.64/modules/proxy/NWGNUproxyhtp create mode 100644 rubbos/app/httpd-2.0.64/modules/proxy/config.m4 create mode 100644 rubbos/app/httpd-2.0.64/modules/proxy/libproxy.exp create mode 100644 rubbos/app/httpd-2.0.64/modules/proxy/mod_proxy.c create mode 100644 rubbos/app/httpd-2.0.64/modules/proxy/mod_proxy.dsp create mode 100644 rubbos/app/httpd-2.0.64/modules/proxy/mod_proxy.h create mode 100644 rubbos/app/httpd-2.0.64/modules/proxy/mod_proxy_connect.dsp create mode 100644 rubbos/app/httpd-2.0.64/modules/proxy/mod_proxy_ftp.dsp create mode 100644 rubbos/app/httpd-2.0.64/modules/proxy/mod_proxy_http.dsp create mode 100644 rubbos/app/httpd-2.0.64/modules/proxy/modules.mk create mode 100644 rubbos/app/httpd-2.0.64/modules/proxy/proxy_connect.c create mode 100644 rubbos/app/httpd-2.0.64/modules/proxy/proxy_ftp.c create mode 100644 rubbos/app/httpd-2.0.64/modules/proxy/proxy_http.c create mode 100644 rubbos/app/httpd-2.0.64/modules/proxy/proxy_util.c create mode 100644 rubbos/app/httpd-2.0.64/modules/ssl/.deps create mode 100644 rubbos/app/httpd-2.0.64/modules/ssl/Makefile create mode 100644 rubbos/app/httpd-2.0.64/modules/ssl/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/modules/ssl/README create mode 100644 rubbos/app/httpd-2.0.64/modules/ssl/README.dsov.fig create mode 100644 rubbos/app/httpd-2.0.64/modules/ssl/README.dsov.ps create mode 100644 rubbos/app/httpd-2.0.64/modules/ssl/config.m4 create mode 100644 rubbos/app/httpd-2.0.64/modules/ssl/mod_ssl.c create mode 100644 rubbos/app/httpd-2.0.64/modules/ssl/mod_ssl.dsp create mode 100644 rubbos/app/httpd-2.0.64/modules/ssl/mod_ssl.h create mode 100644 rubbos/app/httpd-2.0.64/modules/ssl/modules.mk create mode 100644 rubbos/app/httpd-2.0.64/modules/ssl/ssl_engine_config.c create mode 100644 rubbos/app/httpd-2.0.64/modules/ssl/ssl_engine_dh.c create mode 100644 rubbos/app/httpd-2.0.64/modules/ssl/ssl_engine_init.c create mode 100644 rubbos/app/httpd-2.0.64/modules/ssl/ssl_engine_io.c create mode 100644 rubbos/app/httpd-2.0.64/modules/ssl/ssl_engine_kernel.c create mode 100644 rubbos/app/httpd-2.0.64/modules/ssl/ssl_engine_log.c create mode 100644 rubbos/app/httpd-2.0.64/modules/ssl/ssl_engine_mutex.c create mode 100644 rubbos/app/httpd-2.0.64/modules/ssl/ssl_engine_pphrase.c create mode 100644 rubbos/app/httpd-2.0.64/modules/ssl/ssl_engine_rand.c create mode 100644 rubbos/app/httpd-2.0.64/modules/ssl/ssl_engine_vars.c create mode 100644 rubbos/app/httpd-2.0.64/modules/ssl/ssl_expr.c create mode 100644 rubbos/app/httpd-2.0.64/modules/ssl/ssl_expr.h create mode 100644 rubbos/app/httpd-2.0.64/modules/ssl/ssl_expr_eval.c create mode 100644 rubbos/app/httpd-2.0.64/modules/ssl/ssl_expr_parse.c create mode 100644 rubbos/app/httpd-2.0.64/modules/ssl/ssl_expr_parse.h create mode 100644 rubbos/app/httpd-2.0.64/modules/ssl/ssl_expr_parse.y create mode 100644 rubbos/app/httpd-2.0.64/modules/ssl/ssl_expr_scan.c create mode 100644 rubbos/app/httpd-2.0.64/modules/ssl/ssl_expr_scan.l create mode 100644 rubbos/app/httpd-2.0.64/modules/ssl/ssl_scache.c create mode 100644 rubbos/app/httpd-2.0.64/modules/ssl/ssl_scache_dbm.c create mode 100644 rubbos/app/httpd-2.0.64/modules/ssl/ssl_scache_shmcb.c create mode 100644 rubbos/app/httpd-2.0.64/modules/ssl/ssl_scache_shmht.c create mode 100644 rubbos/app/httpd-2.0.64/modules/ssl/ssl_toolkit_compat.h create mode 100644 rubbos/app/httpd-2.0.64/modules/ssl/ssl_util.c create mode 100644 rubbos/app/httpd-2.0.64/modules/ssl/ssl_util_ssl.c create mode 100644 rubbos/app/httpd-2.0.64/modules/ssl/ssl_util_ssl.h create mode 100644 rubbos/app/httpd-2.0.64/modules/ssl/ssl_util_table.c create mode 100644 rubbos/app/httpd-2.0.64/modules/ssl/ssl_util_table.h create mode 100644 rubbos/app/httpd-2.0.64/modules/test/.deps create mode 100644 rubbos/app/httpd-2.0.64/modules/test/.indent.pro create mode 100644 rubbos/app/httpd-2.0.64/modules/test/Makefile create mode 100644 rubbos/app/httpd-2.0.64/modules/test/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/modules/test/README create mode 100644 rubbos/app/httpd-2.0.64/modules/test/config.m4 create mode 100644 rubbos/app/httpd-2.0.64/modules/test/mod_bucketeer.c create mode 100644 rubbos/app/httpd-2.0.64/modules/test/mod_bucketeer.dsp create mode 100644 rubbos/app/httpd-2.0.64/modules/test/mod_optional_fn_export.c create mode 100644 rubbos/app/httpd-2.0.64/modules/test/mod_optional_fn_export.h create mode 100644 rubbos/app/httpd-2.0.64/modules/test/mod_optional_fn_import.c create mode 100644 rubbos/app/httpd-2.0.64/modules/test/mod_optional_hook_export.c create mode 100644 rubbos/app/httpd-2.0.64/modules/test/mod_optional_hook_export.h create mode 100644 rubbos/app/httpd-2.0.64/modules/test/mod_optional_hook_import.c create mode 100644 rubbos/app/httpd-2.0.64/modules/test/modules.mk create mode 100644 rubbos/app/httpd-2.0.64/os/.deps create mode 100644 rubbos/app/httpd-2.0.64/os/.indent.pro create mode 100644 rubbos/app/httpd-2.0.64/os/Makefile create mode 100644 rubbos/app/httpd-2.0.64/os/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/os/beos/.deps create mode 100644 rubbos/app/httpd-2.0.64/os/beos/Makefile create mode 100644 rubbos/app/httpd-2.0.64/os/beos/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/os/beos/beosd.c create mode 100644 rubbos/app/httpd-2.0.64/os/beos/beosd.h create mode 100644 rubbos/app/httpd-2.0.64/os/beos/config.m4 create mode 100644 rubbos/app/httpd-2.0.64/os/beos/os.c create mode 100644 rubbos/app/httpd-2.0.64/os/beos/os.h create mode 100644 rubbos/app/httpd-2.0.64/os/bs2000/bs2login.c create mode 100644 rubbos/app/httpd-2.0.64/os/bs2000/ebcdic.c create mode 100644 rubbos/app/httpd-2.0.64/os/bs2000/ebcdic.h create mode 100644 rubbos/app/httpd-2.0.64/os/bs2000/os.c create mode 100644 rubbos/app/httpd-2.0.64/os/bs2000/os.h create mode 100644 rubbos/app/httpd-2.0.64/os/config.m4 create mode 100644 rubbos/app/httpd-2.0.64/os/netware/Apache.def create mode 100644 rubbos/app/httpd-2.0.64/os/netware/apache.xdc create mode 100644 rubbos/app/httpd-2.0.64/os/netware/modules.c create mode 100644 rubbos/app/httpd-2.0.64/os/netware/os.h create mode 100644 rubbos/app/httpd-2.0.64/os/netware/pre_nw.h create mode 100644 rubbos/app/httpd-2.0.64/os/netware/util_nw.c create mode 100644 rubbos/app/httpd-2.0.64/os/os2/.deps create mode 100644 rubbos/app/httpd-2.0.64/os/os2/Makefile create mode 100644 rubbos/app/httpd-2.0.64/os/os2/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/os/os2/config.m4 create mode 100644 rubbos/app/httpd-2.0.64/os/os2/core.mk create mode 100644 rubbos/app/httpd-2.0.64/os/os2/core_header.def create mode 100644 rubbos/app/httpd-2.0.64/os/os2/os.h create mode 100644 rubbos/app/httpd-2.0.64/os/os2/util_os2.c create mode 100644 rubbos/app/httpd-2.0.64/os/tpf/TPFExport create mode 100644 rubbos/app/httpd-2.0.64/os/tpf/ebcdic.c create mode 100644 rubbos/app/httpd-2.0.64/os/tpf/ebcdic.h create mode 100644 rubbos/app/httpd-2.0.64/os/tpf/os.c create mode 100644 rubbos/app/httpd-2.0.64/os/tpf/os.h create mode 100644 rubbos/app/httpd-2.0.64/os/tpf/samples/linkdll.jcl create mode 100644 rubbos/app/httpd-2.0.64/os/tpf/samples/loadset.jcl create mode 100644 rubbos/app/httpd-2.0.64/os/unix/.deps create mode 100644 rubbos/app/httpd-2.0.64/os/unix/.libs/libos.a create mode 100644 rubbos/app/httpd-2.0.64/os/unix/.libs/libos.la create mode 100644 rubbos/app/httpd-2.0.64/os/unix/.libs/unixd.o create mode 100644 rubbos/app/httpd-2.0.64/os/unix/Makefile create mode 100644 rubbos/app/httpd-2.0.64/os/unix/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/os/unix/config.m4 create mode 100644 rubbos/app/httpd-2.0.64/os/unix/libos.la create mode 100644 rubbos/app/httpd-2.0.64/os/unix/os.h create mode 100644 rubbos/app/httpd-2.0.64/os/unix/unixd.c create mode 100644 rubbos/app/httpd-2.0.64/os/unix/unixd.h create mode 100644 rubbos/app/httpd-2.0.64/os/unix/unixd.lo create mode 100644 rubbos/app/httpd-2.0.64/os/unix/unixd.o create mode 100644 rubbos/app/httpd-2.0.64/os/win32/BaseAddr.ref create mode 100644 rubbos/app/httpd-2.0.64/os/win32/ap_regkey.c create mode 100644 rubbos/app/httpd-2.0.64/os/win32/modules.c create mode 100644 rubbos/app/httpd-2.0.64/os/win32/os.h create mode 100644 rubbos/app/httpd-2.0.64/os/win32/util_win32.c create mode 100644 rubbos/app/httpd-2.0.64/server/.deps create mode 100644 rubbos/app/httpd-2.0.64/server/.indent.pro create mode 100644 rubbos/app/httpd-2.0.64/server/.libs/buildmark.o create mode 100644 rubbos/app/httpd-2.0.64/server/.libs/config.o create mode 100644 rubbos/app/httpd-2.0.64/server/.libs/connection.o create mode 100644 rubbos/app/httpd-2.0.64/server/.libs/core.o create mode 100644 rubbos/app/httpd-2.0.64/server/.libs/eoc_bucket.o create mode 100644 rubbos/app/httpd-2.0.64/server/.libs/error_bucket.o create mode 100644 rubbos/app/httpd-2.0.64/server/.libs/exports.o create mode 100644 rubbos/app/httpd-2.0.64/server/.libs/gen_test_char.o create mode 100644 rubbos/app/httpd-2.0.64/server/.libs/libmain.a create mode 100644 rubbos/app/httpd-2.0.64/server/.libs/libmain.la create mode 100644 rubbos/app/httpd-2.0.64/server/.libs/listen.o create mode 100644 rubbos/app/httpd-2.0.64/server/.libs/log.o create mode 100644 rubbos/app/httpd-2.0.64/server/.libs/main.o create mode 100644 rubbos/app/httpd-2.0.64/server/.libs/mpm_common.o create mode 100644 rubbos/app/httpd-2.0.64/server/.libs/protocol.o create mode 100644 rubbos/app/httpd-2.0.64/server/.libs/provider.o create mode 100644 rubbos/app/httpd-2.0.64/server/.libs/request.o create mode 100644 rubbos/app/httpd-2.0.64/server/.libs/rfc1413.o create mode 100644 rubbos/app/httpd-2.0.64/server/.libs/scoreboard.o create mode 100644 rubbos/app/httpd-2.0.64/server/.libs/util.o create mode 100644 rubbos/app/httpd-2.0.64/server/.libs/util_cfgtree.o create mode 100644 rubbos/app/httpd-2.0.64/server/.libs/util_charset.o create mode 100644 rubbos/app/httpd-2.0.64/server/.libs/util_debug.o create mode 100644 rubbos/app/httpd-2.0.64/server/.libs/util_ebcdic.o create mode 100644 rubbos/app/httpd-2.0.64/server/.libs/util_filter.o create mode 100644 rubbos/app/httpd-2.0.64/server/.libs/util_md5.o create mode 100644 rubbos/app/httpd-2.0.64/server/.libs/util_script.o create mode 100644 rubbos/app/httpd-2.0.64/server/.libs/util_time.o create mode 100644 rubbos/app/httpd-2.0.64/server/.libs/util_xml.o create mode 100644 rubbos/app/httpd-2.0.64/server/.libs/vhost.o create mode 100644 rubbos/app/httpd-2.0.64/server/Makefile create mode 100644 rubbos/app/httpd-2.0.64/server/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/server/NWGNUmakefile create mode 100644 rubbos/app/httpd-2.0.64/server/buildmark.c create mode 100644 rubbos/app/httpd-2.0.64/server/buildmark.lo create mode 100644 rubbos/app/httpd-2.0.64/server/buildmark.o create mode 100644 rubbos/app/httpd-2.0.64/server/config.c create mode 100644 rubbos/app/httpd-2.0.64/server/config.lo create mode 100644 rubbos/app/httpd-2.0.64/server/config.m4 create mode 100644 rubbos/app/httpd-2.0.64/server/config.o create mode 100644 rubbos/app/httpd-2.0.64/server/connection.c create mode 100644 rubbos/app/httpd-2.0.64/server/connection.lo create mode 100644 rubbos/app/httpd-2.0.64/server/connection.o create mode 100644 rubbos/app/httpd-2.0.64/server/core.c create mode 100644 rubbos/app/httpd-2.0.64/server/core.lo create mode 100644 rubbos/app/httpd-2.0.64/server/core.o create mode 100644 rubbos/app/httpd-2.0.64/server/eoc_bucket.c create mode 100644 rubbos/app/httpd-2.0.64/server/eoc_bucket.lo create mode 100644 rubbos/app/httpd-2.0.64/server/eoc_bucket.o create mode 100644 rubbos/app/httpd-2.0.64/server/error_bucket.c create mode 100644 rubbos/app/httpd-2.0.64/server/error_bucket.lo create mode 100644 rubbos/app/httpd-2.0.64/server/error_bucket.o create mode 100644 rubbos/app/httpd-2.0.64/server/export_files create mode 100644 rubbos/app/httpd-2.0.64/server/export_vars.h create mode 100644 rubbos/app/httpd-2.0.64/server/exports.c create mode 100644 rubbos/app/httpd-2.0.64/server/exports.lo create mode 100644 rubbos/app/httpd-2.0.64/server/exports.o create mode 100755 rubbos/app/httpd-2.0.64/server/gen_test_char create mode 100644 rubbos/app/httpd-2.0.64/server/gen_test_char.c create mode 100644 rubbos/app/httpd-2.0.64/server/gen_test_char.dsp create mode 100644 rubbos/app/httpd-2.0.64/server/gen_test_char.lo create mode 100644 rubbos/app/httpd-2.0.64/server/gen_test_char.o create mode 100644 rubbos/app/httpd-2.0.64/server/httpd.exp create mode 100644 rubbos/app/httpd-2.0.64/server/libmain.la create mode 100644 rubbos/app/httpd-2.0.64/server/listen.c create mode 100644 rubbos/app/httpd-2.0.64/server/listen.lo create mode 100644 rubbos/app/httpd-2.0.64/server/listen.o create mode 100644 rubbos/app/httpd-2.0.64/server/log.c create mode 100644 rubbos/app/httpd-2.0.64/server/log.lo create mode 100644 rubbos/app/httpd-2.0.64/server/log.o create mode 100644 rubbos/app/httpd-2.0.64/server/main.c create mode 100644 rubbos/app/httpd-2.0.64/server/main.lo create mode 100644 rubbos/app/httpd-2.0.64/server/main.o create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/.deps create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/MPM.NAMING create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/Makefile create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/beos/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/beos/beos.c create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/beos/beos.h create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/beos/config5.m4 create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/beos/mpm.h create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/beos/mpm_default.h create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/config.m4 create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/experimental/leader/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/experimental/leader/README create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/experimental/leader/config5.m4 create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/experimental/leader/leader.c create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/experimental/leader/mpm.h create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/experimental/leader/mpm_default.h create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/experimental/perchild/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/experimental/perchild/config5.m4 create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/experimental/perchild/mpm.h create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/experimental/perchild/mpm_default.h create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/experimental/perchild/perchild.c create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/experimental/threadpool/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/experimental/threadpool/README create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/experimental/threadpool/config5.m4 create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/experimental/threadpool/mpm.h create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/experimental/threadpool/mpm_default.h create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/experimental/threadpool/pod.c create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/experimental/threadpool/pod.h create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/experimental/threadpool/threadpool.c create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/monitoring-services.txt create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/mpmt_os2/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/mpmt_os2/config5.m4 create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/mpmt_os2/mpm.h create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/mpmt_os2/mpm_default.h create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/mpmt_os2/mpmt_os2.c create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/mpmt_os2/mpmt_os2_child.c create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/netware/mpm.h create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/netware/mpm_default.h create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/netware/mpm_netware.c create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/prefork/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/prefork/config.m4 create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/prefork/mpm.h create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/prefork/mpm_default.h create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/prefork/prefork.c create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/winnt/Win9xConHook.c create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/winnt/Win9xConHook.def create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/winnt/Win9xConHook.dsp create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/winnt/Win9xConHook.h create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/winnt/child.c create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/winnt/mpm.h create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/winnt/mpm_default.h create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/winnt/mpm_winnt.c create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/winnt/mpm_winnt.h create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/winnt/nt_eventlog.c create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/winnt/service.c create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/worker/.deps create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/worker/.libs/fdqueue.o create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/worker/.libs/libworker.a create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/worker/.libs/libworker.la create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/worker/.libs/pod.o create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/worker/.libs/worker.o create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/worker/Makefile create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/worker/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/worker/config5.m4 create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/worker/fdqueue.c create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/worker/fdqueue.h create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/worker/fdqueue.lo create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/worker/fdqueue.o create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/worker/libworker.la create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/worker/mpm.h create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/worker/mpm_default.h create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/worker/pod.c create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/worker/pod.h create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/worker/pod.lo create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/worker/pod.o create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/worker/worker.c create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/worker/worker.lo create mode 100644 rubbos/app/httpd-2.0.64/server/mpm/worker/worker.o create mode 100644 rubbos/app/httpd-2.0.64/server/mpm_common.c create mode 100644 rubbos/app/httpd-2.0.64/server/mpm_common.lo create mode 100644 rubbos/app/httpd-2.0.64/server/mpm_common.o create mode 100644 rubbos/app/httpd-2.0.64/server/protocol.c create mode 100644 rubbos/app/httpd-2.0.64/server/protocol.lo create mode 100644 rubbos/app/httpd-2.0.64/server/protocol.o create mode 100644 rubbos/app/httpd-2.0.64/server/provider.c create mode 100644 rubbos/app/httpd-2.0.64/server/provider.lo create mode 100644 rubbos/app/httpd-2.0.64/server/provider.o create mode 100644 rubbos/app/httpd-2.0.64/server/request.c create mode 100644 rubbos/app/httpd-2.0.64/server/request.lo create mode 100644 rubbos/app/httpd-2.0.64/server/request.o create mode 100644 rubbos/app/httpd-2.0.64/server/rfc1413.c create mode 100644 rubbos/app/httpd-2.0.64/server/rfc1413.lo create mode 100644 rubbos/app/httpd-2.0.64/server/rfc1413.o create mode 100644 rubbos/app/httpd-2.0.64/server/scoreboard.c create mode 100644 rubbos/app/httpd-2.0.64/server/scoreboard.lo create mode 100644 rubbos/app/httpd-2.0.64/server/scoreboard.o create mode 100644 rubbos/app/httpd-2.0.64/server/test_char.h create mode 100644 rubbos/app/httpd-2.0.64/server/util.c create mode 100644 rubbos/app/httpd-2.0.64/server/util.lo create mode 100644 rubbos/app/httpd-2.0.64/server/util.o create mode 100644 rubbos/app/httpd-2.0.64/server/util_cfgtree.c create mode 100644 rubbos/app/httpd-2.0.64/server/util_cfgtree.lo create mode 100644 rubbos/app/httpd-2.0.64/server/util_cfgtree.o create mode 100644 rubbos/app/httpd-2.0.64/server/util_charset.c create mode 100644 rubbos/app/httpd-2.0.64/server/util_charset.lo create mode 100644 rubbos/app/httpd-2.0.64/server/util_charset.o create mode 100644 rubbos/app/httpd-2.0.64/server/util_debug.c create mode 100644 rubbos/app/httpd-2.0.64/server/util_debug.lo create mode 100644 rubbos/app/httpd-2.0.64/server/util_debug.o create mode 100644 rubbos/app/httpd-2.0.64/server/util_ebcdic.c create mode 100644 rubbos/app/httpd-2.0.64/server/util_ebcdic.lo create mode 100644 rubbos/app/httpd-2.0.64/server/util_ebcdic.o create mode 100644 rubbos/app/httpd-2.0.64/server/util_filter.c create mode 100644 rubbos/app/httpd-2.0.64/server/util_filter.lo create mode 100644 rubbos/app/httpd-2.0.64/server/util_filter.o create mode 100644 rubbos/app/httpd-2.0.64/server/util_md5.c create mode 100644 rubbos/app/httpd-2.0.64/server/util_md5.lo create mode 100644 rubbos/app/httpd-2.0.64/server/util_md5.o create mode 100644 rubbos/app/httpd-2.0.64/server/util_script.c create mode 100644 rubbos/app/httpd-2.0.64/server/util_script.lo create mode 100644 rubbos/app/httpd-2.0.64/server/util_script.o create mode 100644 rubbos/app/httpd-2.0.64/server/util_time.c create mode 100644 rubbos/app/httpd-2.0.64/server/util_time.lo create mode 100644 rubbos/app/httpd-2.0.64/server/util_time.o create mode 100644 rubbos/app/httpd-2.0.64/server/util_xml.c create mode 100644 rubbos/app/httpd-2.0.64/server/util_xml.lo create mode 100644 rubbos/app/httpd-2.0.64/server/util_xml.o create mode 100644 rubbos/app/httpd-2.0.64/server/vhost.c create mode 100644 rubbos/app/httpd-2.0.64/server/vhost.lo create mode 100644 rubbos/app/httpd-2.0.64/server/vhost.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/.deps create mode 100644 rubbos/app/httpd-2.0.64/srclib/Makefile create mode 100644 rubbos/app/httpd-2.0.64/srclib/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/.libs/libaprutil-0.a create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/.libs/libaprutil-0.la create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/.libs/libaprutil-0.lai create mode 100755 rubbos/app/httpd-2.0.64/srclib/apr-util/.libs/libaprutil-0.so create mode 100755 rubbos/app/httpd-2.0.64/srclib/apr-util/.libs/libaprutil-0.so.0 create mode 100755 rubbos/app/httpd-2.0.64/srclib/apr-util/.libs/libaprutil-0.so.0.9.19 create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/CHANGES create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/LICENSE create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/Makefile create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/NOTICE create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/NWGNUmakefile create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/aprutil.dep create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/aprutil.dsp create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/aprutil.dsw create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/aprutil.exp create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/aprutil.mak create mode 100755 rubbos/app/httpd-2.0.64/srclib/apr-util/apu-config create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/apu-config.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/apu-config.out create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/buckets/.libs/apr_brigade.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/buckets/.libs/apr_buckets.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/buckets/.libs/apr_buckets_alloc.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/buckets/.libs/apr_buckets_eos.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/buckets/.libs/apr_buckets_file.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/buckets/.libs/apr_buckets_flush.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/buckets/.libs/apr_buckets_heap.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/buckets/.libs/apr_buckets_mmap.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/buckets/.libs/apr_buckets_pipe.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/buckets/.libs/apr_buckets_pool.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/buckets/.libs/apr_buckets_refcount.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/buckets/.libs/apr_buckets_simple.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/buckets/.libs/apr_buckets_socket.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/buckets/Makefile create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/buckets/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/buckets/apr_brigade.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/buckets/apr_brigade.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/buckets/apr_brigade.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/buckets/apr_buckets.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/buckets/apr_buckets.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/buckets/apr_buckets.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/buckets/apr_buckets_alloc.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/buckets/apr_buckets_alloc.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/buckets/apr_buckets_alloc.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/buckets/apr_buckets_eos.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/buckets/apr_buckets_eos.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/buckets/apr_buckets_eos.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/buckets/apr_buckets_file.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/buckets/apr_buckets_file.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/buckets/apr_buckets_file.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/buckets/apr_buckets_flush.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/buckets/apr_buckets_flush.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/buckets/apr_buckets_flush.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/buckets/apr_buckets_heap.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/buckets/apr_buckets_heap.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/buckets/apr_buckets_heap.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/buckets/apr_buckets_mmap.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/buckets/apr_buckets_mmap.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/buckets/apr_buckets_mmap.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/buckets/apr_buckets_pipe.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/buckets/apr_buckets_pipe.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/buckets/apr_buckets_pipe.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/buckets/apr_buckets_pool.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/buckets/apr_buckets_pool.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/buckets/apr_buckets_pool.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/buckets/apr_buckets_refcount.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/buckets/apr_buckets_refcount.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/buckets/apr_buckets_refcount.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/buckets/apr_buckets_simple.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/buckets/apr_buckets_simple.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/buckets/apr_buckets_simple.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/buckets/apr_buckets_socket.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/buckets/apr_buckets_socket.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/buckets/apr_buckets_socket.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/build/apr_common.m4 create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/build/apu-conf.m4 create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/build/apu-hints.m4 create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/build/apu-iconv.m4 create mode 100755 rubbos/app/httpd-2.0.64/srclib/apr-util/build/config.guess create mode 100755 rubbos/app/httpd-2.0.64/srclib/apr-util/build/config.sub create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/build/dbm.m4 create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/build/find_apr.m4 create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/build/find_apu.m4 create mode 100755 rubbos/app/httpd-2.0.64/srclib/apr-util/build/get-version.sh create mode 100755 rubbos/app/httpd-2.0.64/srclib/apr-util/build/install.sh create mode 100755 rubbos/app/httpd-2.0.64/srclib/apr-util/build/mkdir.sh create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/build/pkg/README create mode 100755 rubbos/app/httpd-2.0.64/srclib/apr-util/build/pkg/buildpkg.sh create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/build/pkg/pkginfo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/build/pkg/pkginfo.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/build/rpm/apr-util.spec.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/build/rules.mk create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/build/w32locatedb.pl create mode 100755 rubbos/app/httpd-2.0.64/srclib/apr-util/buildconf create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/config.layout create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/config.log create mode 100755 rubbos/app/httpd-2.0.64/srclib/apr-util/config.nice create mode 100755 rubbos/app/httpd-2.0.64/srclib/apr-util/config.status create mode 100755 rubbos/app/httpd-2.0.64/srclib/apr-util/configure create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/configure.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/crypto/.libs/apr_md4.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/crypto/.libs/apr_md5.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/crypto/.libs/apr_sha1.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/crypto/.libs/getuuid.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/crypto/.libs/uuid.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/crypto/Makefile create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/crypto/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/crypto/apr_md4.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/crypto/apr_md4.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/crypto/apr_md4.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/crypto/apr_md5.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/crypto/apr_md5.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/crypto/apr_md5.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/crypto/apr_sha1.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/crypto/apr_sha1.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/crypto/apr_sha1.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/crypto/getuuid.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/crypto/getuuid.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/crypto/getuuid.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/crypto/uuid.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/crypto/uuid.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/crypto/uuid.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/dbm/.libs/apr_dbm.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/dbm/.libs/apr_dbm_berkeleydb.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/dbm/.libs/apr_dbm_gdbm.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/dbm/.libs/apr_dbm_ndbm.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/dbm/.libs/apr_dbm_sdbm.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/dbm/Makefile create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/dbm/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/dbm/apr_dbm.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/dbm/apr_dbm.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/dbm/apr_dbm.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/dbm/apr_dbm_berkeleydb.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/dbm/apr_dbm_berkeleydb.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/dbm/apr_dbm_berkeleydb.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/dbm/apr_dbm_gdbm.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/dbm/apr_dbm_gdbm.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/dbm/apr_dbm_gdbm.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/dbm/apr_dbm_ndbm.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/dbm/apr_dbm_ndbm.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/dbm/apr_dbm_ndbm.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/dbm/apr_dbm_sdbm.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/dbm/apr_dbm_sdbm.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/dbm/apr_dbm_sdbm.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/dbm/sdbm/.libs/sdbm.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/dbm/sdbm/.libs/sdbm_hash.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/dbm/sdbm/.libs/sdbm_lock.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/dbm/sdbm/.libs/sdbm_pair.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/dbm/sdbm/Makefile create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/dbm/sdbm/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/dbm/sdbm/sdbm.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/dbm/sdbm/sdbm.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/dbm/sdbm/sdbm.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/dbm/sdbm/sdbm_hash.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/dbm/sdbm/sdbm_hash.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/dbm/sdbm/sdbm_hash.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/dbm/sdbm/sdbm_lock.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/dbm/sdbm/sdbm_lock.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/dbm/sdbm/sdbm_lock.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/dbm/sdbm/sdbm_pair.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/dbm/sdbm/sdbm_pair.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/dbm/sdbm/sdbm_pair.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/dbm/sdbm/sdbm_pair.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/dbm/sdbm/sdbm_private.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/dbm/sdbm/sdbm_tune.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/docs/doxygen.conf create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/encoding/.libs/apr_base64.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/encoding/Makefile create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/encoding/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/encoding/apr_base64.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/encoding/apr_base64.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/encoding/apr_base64.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/export_vars.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/export_vars.sh create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/export_vars.sh.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/exports.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/hooks/.libs/apr_hooks.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/hooks/Makefile create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/hooks/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/hooks/apr_hooks.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/hooks/apr_hooks.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/hooks/apr_hooks.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_anylock.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_base64.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_buckets.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_date.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_dbm.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_hooks.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_ldap.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_ldap.h.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_ldap.hnw create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_ldap.hw create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_ldap_url.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_md4.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_md5.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_optional.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_optional_hooks.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_queue.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_reslist.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_rmm.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_sdbm.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_sha1.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_strmatch.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_uri.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_uuid.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_xlate.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_xml.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/include/apu.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/include/apu.h.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/include/apu.hnw create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/include/apu.hw create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/include/apu_compat.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/include/apu_version.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/include/apu_want.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/include/apu_want.h.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/include/apu_want.hnw create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/include/apu_want.hw create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/include/private/apr_dbm_private.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/include/private/apu_config.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/include/private/apu_config.h.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/include/private/apu_config.hw create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/include/private/apu_select_dbm.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/include/private/apu_select_dbm.h.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/include/private/apu_select_dbm.hw create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/ldap/.libs/apr_ldap_compat.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/ldap/.libs/apr_ldap_url.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/ldap/Makefile create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/ldap/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/ldap/apr_ldap_compat.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/ldap/apr_ldap_compat.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/ldap/apr_ldap_compat.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/ldap/apr_ldap_url.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/ldap/apr_ldap_url.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/ldap/apr_ldap_url.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/libaprutil-0.la create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/libaprutil.dep create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/libaprutil.dsp create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/libaprutil.mak create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/libaprutil.rc create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/misc/.libs/apr_date.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/misc/.libs/apr_queue.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/misc/.libs/apr_reslist.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/misc/.libs/apr_rmm.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/misc/.libs/apu_version.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/misc/Makefile create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/misc/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/misc/apr_date.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/misc/apr_date.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/misc/apr_date.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/misc/apr_queue.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/misc/apr_queue.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/misc/apr_queue.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/misc/apr_reslist.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/misc/apr_reslist.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/misc/apr_reslist.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/misc/apr_rmm.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/misc/apr_rmm.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/misc/apr_rmm.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/misc/apu_version.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/misc/apu_version.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/misc/apu_version.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/renames_pending create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/strmatch/.libs/apr_strmatch.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/strmatch/Makefile create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/strmatch/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/strmatch/apr_strmatch.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/strmatch/apr_strmatch.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/strmatch/apr_strmatch.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/test/Makefile create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/test/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/test/Makefile.win create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/test/NWGNUmakefile create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/test/NWGNUtestdate create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/test/NWGNUtestdbm create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/test/NWGNUtestmd4 create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/test/NWGNUtestmd5 create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/test/NWGNUtestpass create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/test/NWGNUtestqueue create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/test/NWGNUtestreslist create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/test/NWGNUtestrmm create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/test/NWGNUteststrmatch create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/test/NWGNUtesturi create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/test/NWGNUtestuuid create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/test/NWGNUtestxlate create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/test/NWGNUtestxml create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/test/data/billion-laughs.xml create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/test/nw_misc.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/test/test_apu.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/test/testdate.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/test/testdbm.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/test/testmd4.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/test/testmd5.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/test/testpass.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/test/testqueue.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/test/testreslist.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/test/testrmm.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/test/teststrmatch.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/test/testuri.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/test/testuuid.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/test/testxlate.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/test/testxml.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/uri/.libs/apr_uri.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/uri/.libs/gen_uri_delims.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/uri/Makefile create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/uri/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/uri/NWGNUmakefile create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/uri/apr_uri.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/uri/apr_uri.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/uri/apr_uri.o create mode 100755 rubbos/app/httpd-2.0.64/srclib/apr-util/uri/gen_uri_delims create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/uri/gen_uri_delims.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/uri/gen_uri_delims.dep create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/uri/gen_uri_delims.dsp create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/uri/gen_uri_delims.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/uri/gen_uri_delims.mak create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/uri/gen_uri_delims.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/uri/uri_delims.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xlate/.libs/xlate.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xlate/Makefile create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xlate/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xlate/xlate.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xlate/xlate.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xlate/xlate.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/.libs/apr_xml.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/Makefile create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/NWGNUmakefile create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/apr_xml.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/apr_xml.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/apr_xml.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/.libs/libexpat.a create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/.libs/libexpat.la create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/.libs/libexpat.lai create mode 100755 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/.libs/libexpat.so create mode 100755 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/.libs/libexpat.so.0 create mode 100755 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/.libs/libexpat.so.0.5.0 create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/COPYING create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/Makefile create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/README create mode 100755 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/buildconf.sh create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/config.log create mode 100755 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/config.status create mode 100755 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/configure create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/configure.in create mode 100755 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/conftools/PrintPath create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/conftools/ac_c_bigendian_cross.m4 create mode 100755 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/conftools/config.guess create mode 100755 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/conftools/config.sub create mode 100755 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/conftools/install-sh create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/conftools/ltmain.sh create mode 100755 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/conftools/mkinstalldirs create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/expat_config.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/expat_config.h.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/.libs/xmlparse.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/.libs/xmlrole.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/.libs/xmltok.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/ascii.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/asciitab.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/expat.dsp create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/expat.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/expat_config.hnw create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/iasciitab.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/internal.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/latin1tab.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/nametab.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/utf8tab.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/winconfig.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xml.dep create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xml.dsp create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xml.mak create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xmlparse.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xmlparse.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xmlparse.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xmlrole.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xmlrole.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xmlrole.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xmlrole.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xmltok.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xmltok.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xmltok.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xmltok.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xmltok_impl.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xmltok_impl.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xmltok_ns.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/libexpat.la create mode 100755 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/libtool create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/win32/MANIFEST.txt create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/win32/expat.iss create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/.libs/libapr-0.a create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/.libs/libapr-0.la create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/.libs/libapr-0.lai create mode 100755 rubbos/app/httpd-2.0.64/srclib/apr/.libs/libapr-0.so create mode 100755 rubbos/app/httpd-2.0.64/srclib/apr/.libs/libapr-0.so.0 create mode 100755 rubbos/app/httpd-2.0.64/srclib/apr/.libs/libapr-0.so.0.9.19 create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/CHANGES create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/LICENSE create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/Makefile create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/NOTICE create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/NWGNUmakefile create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/README.dev create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/acconfig.h create mode 100755 rubbos/app/httpd-2.0.64/srclib/apr/apr-config create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/apr-config.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/apr-config.out create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/apr.dsp create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/apr.dsw create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/apr.exp create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/atomic/netware/apr_atomic.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/atomic/os390/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/atomic/os390/atomic.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/atomic/unix/.libs/apr_atomic.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/atomic/unix/Makefile create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/atomic/unix/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/atomic/unix/apr_atomic.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/atomic/unix/apr_atomic.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/atomic/unix/apr_atomic.o create mode 100755 rubbos/app/httpd-2.0.64/srclib/apr/build/MakeEtags create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/build/Makefile create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/build/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/build/NWGNUenvironment.inc create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/build/NWGNUhead.inc create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/build/NWGNUmakefile create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/build/NWGNUtail.inc create mode 100755 rubbos/app/httpd-2.0.64/srclib/apr/build/PrintPath create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/build/aplibtool.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/build/apr_app.dsp create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/build/apr_common.m4 create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/build/apr_hints.m4 create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/build/apr_network.m4 create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/build/apr_rules.mk create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/build/apr_rules.mk.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/build/apr_rules.out create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/build/apr_threads.m4 create mode 100755 rubbos/app/httpd-2.0.64/srclib/apr/build/buildcheck.sh create mode 100755 rubbos/app/httpd-2.0.64/srclib/apr/build/config.guess create mode 100755 rubbos/app/httpd-2.0.64/srclib/apr/build/config.sub create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/build/cvtdsp.pl create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/build/find_apr.m4 create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/build/fixwin32mak.pl create mode 100755 rubbos/app/httpd-2.0.64/srclib/apr/build/get-version.sh create mode 100755 rubbos/app/httpd-2.0.64/srclib/apr/build/install.sh create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/build/libapr_app.dsp create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/build/libtool.m4 create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/build/lineends.pl create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/build/ltmain.sh create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/build/make_exports.awk create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/build/make_nw_export.awk create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/build/make_var_export.awk create mode 100755 rubbos/app/httpd-2.0.64/srclib/apr/build/mkdir.sh create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/build/nw_export.inc create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/build/nw_ver.awk create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/build/pkg/README create mode 100755 rubbos/app/httpd-2.0.64/srclib/apr/build/pkg/buildpkg.sh create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/build/pkg/pkginfo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/build/pkg/pkginfo.in create mode 100755 rubbos/app/httpd-2.0.64/srclib/apr/build/prebuildNW.bat create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/build/rpm/apr.spec.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/build/win32ver.awk create mode 100755 rubbos/app/httpd-2.0.64/srclib/apr/buildconf create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/config.layout create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/config.log create mode 100755 rubbos/app/httpd-2.0.64/srclib/apr/config.nice create mode 100755 rubbos/app/httpd-2.0.64/srclib/apr/config.status create mode 100755 rubbos/app/httpd-2.0.64/srclib/apr/configure create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/configure.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/docs/APRDesign.html create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/docs/canonical_filenames.html create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/docs/doxygen.conf create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/docs/incomplete_types create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/docs/non_apr_programs create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/docs/pool-design.html create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/docs/win32_builds.html create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/dso/aix/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/dso/aix/dso.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/dso/beos/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/dso/beos/dso.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/dso/netware/dso.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/dso/os2/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/dso/os2/dso.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/dso/os390/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/dso/os390/dso.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/dso/unix/.libs/dso.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/dso/unix/Makefile create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/dso/unix/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/dso/unix/dso.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/dso/unix/dso.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/dso/unix/dso.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/dso/win32/dso.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/export_vars.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/exports.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/netware/filepath.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/netware/filestat.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/netware/filesys.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/netware/flock.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/netware/mktemp.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/netware/pipe.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/copy.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/dir.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/fileacc.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/filedup.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/filepath.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/filepath_util.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/filestat.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/filesys.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/flock.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/fullrw.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/maperrorcode.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/mktemp.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/open.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/pipe.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/readwrite.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/seek.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/tempdir.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/.libs/copy.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/.libs/dir.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/.libs/fileacc.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/.libs/filedup.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/.libs/filepath.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/.libs/filepath_util.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/.libs/filestat.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/.libs/flock.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/.libs/fullrw.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/.libs/mktemp.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/.libs/open.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/.libs/pipe.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/.libs/readwrite.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/.libs/seek.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/.libs/tempdir.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/Makefile create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/copy.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/copy.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/copy.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/dir.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/dir.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/dir.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/fileacc.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/fileacc.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/fileacc.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/filedup.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/filedup.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/filedup.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/filepath.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/filepath.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/filepath.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/filepath_util.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/filepath_util.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/filepath_util.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/filestat.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/filestat.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/filestat.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/flock.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/flock.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/flock.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/fullrw.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/fullrw.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/fullrw.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/mktemp.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/mktemp.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/mktemp.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/open.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/open.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/open.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/pipe.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/pipe.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/pipe.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/readwrite.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/readwrite.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/readwrite.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/seek.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/seek.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/seek.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/tempdir.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/tempdir.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/tempdir.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/win32/dir.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/win32/filedup.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/win32/filepath.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/win32/filestat.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/win32/filesys.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/win32/flock.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/win32/open.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/win32/pipe.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/win32/readwrite.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/file_io/win32/seek.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/images/ScanDocBig.jpg create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/images/ScanDocSmall.jpg create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/images/ball1.gif create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/images/ball1.png create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/images/ball2.gif create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/images/ball2.png create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/images/bug.gif create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/images/bug.png create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/images/caution.gif create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/images/caution.png create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/images/master.gif create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/images/master.png create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/images/tip.gif create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/images/tip.png create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/images/warning.gif create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/images/warning.png create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/apr.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/apr.h.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/apr.h.save create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/apr.hnw create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/apr.hw create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/apr_allocator.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/apr_atomic.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/apr_compat.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/apr_dso.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/apr_env.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/apr_errno.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/apr_file_info.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/apr_file_io.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/apr_fnmatch.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/apr_general.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/apr_getopt.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/apr_global_mutex.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/apr_hash.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/apr_inherit.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/apr_lib.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/apr_mmap.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/apr_network_io.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/apr_poll.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/apr_pools.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/apr_portable.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/apr_proc_mutex.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/apr_ring.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/apr_shm.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/apr_signal.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/apr_strings.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/apr_support.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/apr_tables.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/apr_thread_cond.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/apr_thread_mutex.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/apr_thread_proc.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/apr_thread_rwlock.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/apr_time.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/apr_user.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/apr_version.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/apr_want.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/aix/apr_arch_dso.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/apr_private_common.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/beos/apr_arch_dso.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/beos/apr_arch_proc_mutex.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/beos/apr_arch_thread_cond.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/beos/apr_arch_thread_mutex.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/beos/apr_arch_thread_rwlock.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/beos/apr_arch_threadproc.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/netware/apr_arch_dso.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/netware/apr_arch_file_io.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/netware/apr_arch_global_mutex.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/netware/apr_arch_internal_time.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/netware/apr_arch_networkio.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/netware/apr_arch_pre_nw.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/netware/apr_arch_proc_mutex.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/netware/apr_arch_thread_cond.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/netware/apr_arch_thread_mutex.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/netware/apr_arch_thread_rwlock.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/netware/apr_arch_threadproc.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/netware/apr_private.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/os2/apr_arch_dso.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/os2/apr_arch_file_io.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/os2/apr_arch_networkio.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/os2/apr_arch_os2calls.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/os2/apr_arch_proc_mutex.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/os2/apr_arch_thread_cond.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/os2/apr_arch_thread_mutex.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/os2/apr_arch_thread_rwlock.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/os2/apr_arch_threadproc.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/os390/apr_arch_dso.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_arch_dso.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_arch_file_io.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_arch_global_mutex.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_arch_inherit.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_arch_internal_time.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_arch_misc.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_arch_networkio.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_arch_proc_mutex.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_arch_shm.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_arch_thread_cond.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_arch_thread_mutex.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_arch_thread_rwlock.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_arch_threadproc.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_private.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_private.h.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_private.h.save create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/win32/apr_arch_atime.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/win32/apr_arch_dso.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/win32/apr_arch_file_io.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/win32/apr_arch_inherit.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/win32/apr_arch_misc.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/win32/apr_arch_networkio.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/win32/apr_arch_proc_mutex.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/win32/apr_arch_thread_cond.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/win32/apr_arch_thread_mutex.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/win32/apr_arch_thread_rwlock.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/win32/apr_arch_threadproc.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/win32/apr_arch_utf8.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/win32/apr_dbg_win32_handles.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/include/arch/win32/apr_private.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/libapr-0.la create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/libapr.dsp create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/libapr.rc create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/libaprnw.mcp.zip create mode 100755 rubbos/app/httpd-2.0.64/srclib/apr/libtool create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/locks/beos/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/locks/beos/proc_mutex.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/locks/beos/thread_cond.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/locks/beos/thread_mutex.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/locks/beos/thread_rwlock.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/locks/netware/proc_mutex.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/locks/netware/thread_cond.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/locks/netware/thread_mutex.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/locks/netware/thread_rwlock.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/locks/os2/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/locks/os2/proc_mutex.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/locks/os2/thread_cond.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/locks/os2/thread_mutex.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/locks/os2/thread_rwlock.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/.libs/global_mutex.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/.libs/proc_mutex.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/.libs/thread_cond.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/.libs/thread_mutex.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/.libs/thread_rwlock.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/Makefile create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/global_mutex.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/global_mutex.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/global_mutex.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/proc_mutex.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/proc_mutex.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/proc_mutex.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/thread_cond.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/thread_cond.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/thread_cond.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/thread_mutex.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/thread_mutex.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/thread_mutex.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/thread_rwlock.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/thread_rwlock.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/thread_rwlock.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/locks/win32/proc_mutex.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/locks/win32/thread_cond.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/locks/win32/thread_mutex.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/locks/win32/thread_rwlock.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/memory/unix/.libs/apr_pools.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/memory/unix/Makefile create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/memory/unix/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/memory/unix/apr_pools.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/memory/unix/apr_pools.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/memory/unix/apr_pools.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/misc/netware/apr.xdc create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/misc/netware/aprlib.def create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/misc/netware/charset.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/misc/netware/libprews.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/misc/netware/rand.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/misc/netware/start.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/misc/os2/randbyte.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/.libs/charset.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/.libs/env.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/.libs/errorcodes.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/.libs/getopt.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/.libs/otherchild.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/.libs/rand.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/.libs/start.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/.libs/version.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/Makefile create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/charset.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/charset.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/charset.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/env.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/env.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/env.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/errorcodes.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/errorcodes.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/errorcodes.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/getopt.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/getopt.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/getopt.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/otherchild.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/otherchild.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/otherchild.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/rand.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/rand.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/rand.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/start.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/start.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/start.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/version.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/version.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/version.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/misc/win32/apr_app.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/misc/win32/charset.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/misc/win32/env.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/misc/win32/internal.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/misc/win32/misc.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/misc/win32/rand.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/misc/win32/start.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/misc/win32/utf8.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/mmap/unix/.libs/common.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/mmap/unix/.libs/mmap.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/mmap/unix/Makefile create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/mmap/unix/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/mmap/unix/common.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/mmap/unix/common.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/mmap/unix/common.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/mmap/unix/mmap.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/mmap/unix/mmap.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/mmap/unix/mmap.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/mmap/win32/mmap.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/network_io/beos/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/network_io/beos/sendrecv.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/network_io/beos/socketcommon.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/network_io/os2/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/network_io/os2/inet_ntop.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/network_io/os2/inet_pton.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/network_io/os2/os2calls.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/network_io/os2/sendrecv.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/network_io/os2/sendrecv_udp.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/network_io/os2/sockaddr.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/network_io/os2/sockets.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/network_io/os2/sockopt.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/.libs/inet_ntop.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/.libs/inet_pton.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/.libs/sendrecv.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/.libs/sockaddr.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/.libs/sockets.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/.libs/sockopt.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/Makefile create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/inet_ntop.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/inet_ntop.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/inet_ntop.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/inet_pton.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/inet_pton.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/inet_pton.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/sendrecv.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/sendrecv.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/sendrecv.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/sockaddr.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/sockaddr.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/sockaddr.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/sockets.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/sockets.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/sockets.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/sockopt.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/sockopt.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/sockopt.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/network_io/win32/sendrecv.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/network_io/win32/sockets.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/network_io/win32/sockopt.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/passwd/.libs/apr_getpass.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/passwd/Makefile create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/passwd/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/passwd/apr_getpass.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/passwd/apr_getpass.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/passwd/apr_getpass.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/poll/os2/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/poll/os2/poll.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/poll/os2/pollacc.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/poll/os2/pollset.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/poll/unix/.libs/poll.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/poll/unix/.libs/pollacc.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/poll/unix/Makefile create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/poll/unix/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/poll/unix/poll.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/poll/unix/poll.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/poll/unix/poll.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/poll/unix/pollacc.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/poll/unix/pollacc.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/poll/unix/pollacc.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/shmem/beos/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/shmem/beos/shm.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/shmem/os2/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/shmem/os2/shm.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/shmem/unix/.libs/shm.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/shmem/unix/Makefile create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/shmem/unix/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/shmem/unix/shm.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/shmem/unix/shm.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/shmem/unix/shm.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/shmem/win32/shm.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/strings/.libs/apr_cpystrn.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/strings/.libs/apr_fnmatch.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/strings/.libs/apr_snprintf.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/strings/.libs/apr_strings.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/strings/.libs/apr_strnatcmp.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/strings/.libs/apr_strtok.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/strings/Makefile create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/strings/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_cpystrn.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_cpystrn.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_cpystrn.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_fnmatch.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_fnmatch.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_fnmatch.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_snprintf.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_snprintf.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_snprintf.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_strings.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_strings.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_strings.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_strnatcmp.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_strnatcmp.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_strnatcmp.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_strtok.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_strtok.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_strtok.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/support/unix/.libs/waitio.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/support/unix/Makefile create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/support/unix/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/support/unix/waitio.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/support/unix/waitio.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/support/unix/waitio.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/tables/.libs/apr_hash.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/tables/.libs/apr_tables.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/tables/Makefile create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/tables/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/tables/apr_hash.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/tables/apr_hash.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/tables/apr_hash.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/tables/apr_tables.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/tables/apr_tables.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/tables/apr_tables.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/CuTest.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/CuTest.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/MakeWin32Make.awk create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/Makefile create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/Makefile.win create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/NWGNUaprtest create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/NWGNUmakefile create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/NWGNUmod_test create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/NWGNUproc_child create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/NWGNUtestatmc create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/README create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/aprtest.def create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/aprtest.dsp create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/aprtest.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/aprtest.win create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/client.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/data/file_datafile.txt create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/data/mmap_datafile.txt create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/internal/Makefile create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/internal/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/internal/testregex.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/internal/testucs.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/mod_test.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/nw_misc.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/occhild.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/proc_child.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/readchild.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/sendfile.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/server.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/test_apr.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/testall.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/testall.dsp create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/testall.dsw create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/testapp.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/testapp.dsp create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/testappnt.dsp create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/testargs.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/testatomic.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/testdir.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/testdso.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/testdup.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/testenv.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/testfile.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/testfileinfo.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/testflock.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/testfmt.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/testglobalmutex.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/testhash.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/testipsub.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/testlock.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/testlockperf.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/testmmap.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/testmutexscope.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/testnames.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/testoc.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/testpath.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/testpipe.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/testpoll.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/testpools.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/testproc.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/testprocmutex.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/testrand.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/testshm.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/testshmconsumer.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/testshmproducer.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/testsleep.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/testsock.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/testsockets.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/testsockopt.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/teststr.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/testtable.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/testthread.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/testtime.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/testud.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/testuser.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/test/testvsn.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/threadproc/beos/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/threadproc/beos/apr_proc_stub.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/threadproc/beos/proc.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/threadproc/beos/thread.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/threadproc/beos/threadpriv.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/threadproc/beos/threadproc_common.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/threadproc/netware/proc.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/threadproc/netware/procsup.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/threadproc/netware/signals.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/threadproc/netware/thread.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/threadproc/netware/threadpriv.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/threadproc/os2/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/threadproc/os2/proc.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/threadproc/os2/signals.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/threadproc/os2/thread.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/threadproc/os2/threadpriv.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/.libs/proc.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/.libs/procsup.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/.libs/signals.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/.libs/thread.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/.libs/threadpriv.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/Makefile create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/proc.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/proc.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/proc.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/procsup.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/procsup.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/procsup.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/signals.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/signals.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/signals.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/thread.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/thread.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/thread.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/threadpriv.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/threadpriv.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/threadpriv.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/threadproc/win32/proc.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/threadproc/win32/signals.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/threadproc/win32/thread.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/threadproc/win32/threadpriv.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/time/unix/.libs/time.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/time/unix/.libs/timestr.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/time/unix/Makefile create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/time/unix/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/time/unix/time.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/time/unix/time.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/time/unix/time.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/time/unix/timestr.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/time/unix/timestr.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/time/unix/timestr.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/time/win32/access.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/time/win32/time.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/time/win32/timestr.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/user/netware/groupinfo.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/user/netware/userinfo.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/user/unix/.libs/groupinfo.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/user/unix/.libs/userinfo.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/user/unix/Makefile create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/user/unix/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/user/unix/groupinfo.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/user/unix/groupinfo.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/user/unix/groupinfo.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/user/unix/userinfo.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/user/unix/userinfo.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/user/unix/userinfo.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/user/win32/groupinfo.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/apr/user/win32/userinfo.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/.deps create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/.libs/dftables.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/.libs/get.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/.libs/libpcre.a create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/.libs/libpcre.la create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/.libs/maketables.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/.libs/pcre.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/.libs/pcreposix.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/.libs/study.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/AUTHORS create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/COPYING create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/ChangeLog create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/INSTALL create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/LICENCE create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/Makefile create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/NEWS create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/NON-UNIX-USE create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/NWGNUmakefile create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/README create mode 100755 rubbos/app/httpd-2.0.64/srclib/pcre/RunTest create mode 100755 rubbos/app/httpd-2.0.64/srclib/pcre/RunTest.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/chartables.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/config.guess create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/config.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/config.hw create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/config.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/config.log create mode 100755 rubbos/app/httpd-2.0.64/srclib/pcre/config.status create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/config.sub create mode 100755 rubbos/app/httpd-2.0.64/srclib/pcre/configure create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/configure.in create mode 100755 rubbos/app/httpd-2.0.64/srclib/pcre/dftables create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/dftables.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/dftables.dsp create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/dftables.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/dftables.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/dll.mk create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/doc/Tech.Notes create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/doc/pcre.3 create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/doc/pcre.html create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/doc/pcre.txt create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/doc/pcregrep.1 create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/doc/pcregrep.html create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/doc/pcregrep.txt create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/doc/pcreposix.3 create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/doc/pcreposix.html create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/doc/pcreposix.txt create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/doc/pcretest.1 create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/doc/pcretest.html create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/doc/pcretest.txt create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/doc/perltest.txt create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/doc/pgrep.1 create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/doc/pgrep.html create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/doc/pgrep.txt create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/get.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/get.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/get.o create mode 100755 rubbos/app/httpd-2.0.64/srclib/pcre/install-sh create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/internal.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/libpcre.la create mode 100755 rubbos/app/httpd-2.0.64/srclib/pcre/ltconfig create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/ltmain.sh create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/maketables.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/maketables.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/maketables.o create mode 100755 rubbos/app/httpd-2.0.64/srclib/pcre/mkinstalldirs create mode 100755 rubbos/app/httpd-2.0.64/srclib/pcre/pcre-config create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/pcre-config.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/pcre.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/pcre.def create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/pcre.dsp create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/pcre.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/pcre.hw create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/pcre.in create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/pcre.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/pcre.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/pcredemo.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/pcregrep.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/pcreposix.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/pcreposix.dsp create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/pcreposix.h create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/pcreposix.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/pcreposix.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/pcretest.c create mode 100755 rubbos/app/httpd-2.0.64/srclib/pcre/perltest create mode 100755 rubbos/app/httpd-2.0.64/srclib/pcre/perltest8 create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/pgrep.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/study.c create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/study.lo create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/study.o create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/testdata/testinput1 create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/testdata/testinput2 create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/testdata/testinput3 create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/testdata/testinput4 create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/testdata/testinput5 create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/testdata/testinput6 create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/testdata/testoutput1 create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/testdata/testoutput2 create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/testdata/testoutput3 create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/testdata/testoutput4 create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/testdata/testoutput5 create mode 100644 rubbos/app/httpd-2.0.64/srclib/pcre/testdata/testoutput6 create mode 100644 rubbos/app/httpd-2.0.64/support/.deps create mode 100644 rubbos/app/httpd-2.0.64/support/.indent.pro create mode 100755 rubbos/app/httpd-2.0.64/support/.libs/ab create mode 100644 rubbos/app/httpd-2.0.64/support/.libs/ab.o create mode 100755 rubbos/app/httpd-2.0.64/support/.libs/checkgid create mode 100644 rubbos/app/httpd-2.0.64/support/.libs/checkgid.o create mode 100755 rubbos/app/httpd-2.0.64/support/.libs/htdbm create mode 100644 rubbos/app/httpd-2.0.64/support/.libs/htdbm.o create mode 100755 rubbos/app/httpd-2.0.64/support/.libs/htdigest create mode 100644 rubbos/app/httpd-2.0.64/support/.libs/htdigest.o create mode 100755 rubbos/app/httpd-2.0.64/support/.libs/htpasswd create mode 100644 rubbos/app/httpd-2.0.64/support/.libs/htpasswd.o create mode 100755 rubbos/app/httpd-2.0.64/support/.libs/httxt2dbm create mode 100644 rubbos/app/httpd-2.0.64/support/.libs/httxt2dbm.o create mode 100755 rubbos/app/httpd-2.0.64/support/.libs/logresolve create mode 100644 rubbos/app/httpd-2.0.64/support/.libs/logresolve.o create mode 100755 rubbos/app/httpd-2.0.64/support/.libs/rotatelogs create mode 100644 rubbos/app/httpd-2.0.64/support/.libs/rotatelogs.o create mode 100644 rubbos/app/httpd-2.0.64/support/Makefile create mode 100644 rubbos/app/httpd-2.0.64/support/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/support/NWGNUab create mode 100644 rubbos/app/httpd-2.0.64/support/NWGNUhtdbm create mode 100644 rubbos/app/httpd-2.0.64/support/NWGNUhtdigest create mode 100644 rubbos/app/httpd-2.0.64/support/NWGNUhtpasswd create mode 100644 rubbos/app/httpd-2.0.64/support/NWGNUlogres create mode 100644 rubbos/app/httpd-2.0.64/support/NWGNUmakefile create mode 100644 rubbos/app/httpd-2.0.64/support/NWGNUrotlogs create mode 100644 rubbos/app/httpd-2.0.64/support/README create mode 100644 rubbos/app/httpd-2.0.64/support/SHA1/README.sha1 create mode 100644 rubbos/app/httpd-2.0.64/support/SHA1/convert-sha1.pl create mode 100644 rubbos/app/httpd-2.0.64/support/SHA1/htpasswd-sha1.pl create mode 100644 rubbos/app/httpd-2.0.64/support/SHA1/ldif-sha1.example create mode 100755 rubbos/app/httpd-2.0.64/support/ab create mode 100644 rubbos/app/httpd-2.0.64/support/ab.c create mode 100644 rubbos/app/httpd-2.0.64/support/ab.dsp create mode 100644 rubbos/app/httpd-2.0.64/support/ab.lo create mode 100644 rubbos/app/httpd-2.0.64/support/ab.o create mode 100644 rubbos/app/httpd-2.0.64/support/abs.dsp create mode 100644 rubbos/app/httpd-2.0.64/support/apachectl create mode 100644 rubbos/app/httpd-2.0.64/support/apachectl.in create mode 100644 rubbos/app/httpd-2.0.64/support/apxs create mode 100644 rubbos/app/httpd-2.0.64/support/apxs.in create mode 100755 rubbos/app/httpd-2.0.64/support/check_forensic create mode 100755 rubbos/app/httpd-2.0.64/support/checkgid create mode 100644 rubbos/app/httpd-2.0.64/support/checkgid.c create mode 100644 rubbos/app/httpd-2.0.64/support/checkgid.lo create mode 100644 rubbos/app/httpd-2.0.64/support/checkgid.o create mode 100644 rubbos/app/httpd-2.0.64/support/config.m4 create mode 100644 rubbos/app/httpd-2.0.64/support/dbmmanage create mode 100644 rubbos/app/httpd-2.0.64/support/dbmmanage.in create mode 100644 rubbos/app/httpd-2.0.64/support/envvars-std create mode 100644 rubbos/app/httpd-2.0.64/support/envvars-std.in create mode 100755 rubbos/app/httpd-2.0.64/support/htdbm create mode 100644 rubbos/app/httpd-2.0.64/support/htdbm.c create mode 100644 rubbos/app/httpd-2.0.64/support/htdbm.dsp create mode 100644 rubbos/app/httpd-2.0.64/support/htdbm.lo create mode 100644 rubbos/app/httpd-2.0.64/support/htdbm.o create mode 100755 rubbos/app/httpd-2.0.64/support/htdigest create mode 100644 rubbos/app/httpd-2.0.64/support/htdigest.c create mode 100644 rubbos/app/httpd-2.0.64/support/htdigest.dsp create mode 100644 rubbos/app/httpd-2.0.64/support/htdigest.lo create mode 100644 rubbos/app/httpd-2.0.64/support/htdigest.o create mode 100755 rubbos/app/httpd-2.0.64/support/htpasswd create mode 100644 rubbos/app/httpd-2.0.64/support/htpasswd.c create mode 100644 rubbos/app/httpd-2.0.64/support/htpasswd.dsp create mode 100644 rubbos/app/httpd-2.0.64/support/htpasswd.lo create mode 100644 rubbos/app/httpd-2.0.64/support/htpasswd.o create mode 100755 rubbos/app/httpd-2.0.64/support/httxt2dbm create mode 100644 rubbos/app/httpd-2.0.64/support/httxt2dbm.c create mode 100644 rubbos/app/httpd-2.0.64/support/httxt2dbm.dsp create mode 100644 rubbos/app/httpd-2.0.64/support/httxt2dbm.lo create mode 100644 rubbos/app/httpd-2.0.64/support/httxt2dbm.o create mode 100755 rubbos/app/httpd-2.0.64/support/list_hooks.pl create mode 100644 rubbos/app/httpd-2.0.64/support/log_server_status create mode 100644 rubbos/app/httpd-2.0.64/support/log_server_status.in create mode 100755 rubbos/app/httpd-2.0.64/support/logresolve create mode 100644 rubbos/app/httpd-2.0.64/support/logresolve.c create mode 100644 rubbos/app/httpd-2.0.64/support/logresolve.dsp create mode 100644 rubbos/app/httpd-2.0.64/support/logresolve.lo create mode 100644 rubbos/app/httpd-2.0.64/support/logresolve.o create mode 100644 rubbos/app/httpd-2.0.64/support/logresolve.pl create mode 100644 rubbos/app/httpd-2.0.64/support/logresolve.pl.in create mode 100644 rubbos/app/httpd-2.0.64/support/phf_abuse_log.cgi create mode 100644 rubbos/app/httpd-2.0.64/support/phf_abuse_log.cgi.in create mode 100755 rubbos/app/httpd-2.0.64/support/rotatelogs create mode 100644 rubbos/app/httpd-2.0.64/support/rotatelogs.c create mode 100644 rubbos/app/httpd-2.0.64/support/rotatelogs.dsp create mode 100644 rubbos/app/httpd-2.0.64/support/rotatelogs.lo create mode 100644 rubbos/app/httpd-2.0.64/support/rotatelogs.o create mode 100644 rubbos/app/httpd-2.0.64/support/split-logfile create mode 100644 rubbos/app/httpd-2.0.64/support/split-logfile.in create mode 100644 rubbos/app/httpd-2.0.64/support/suexec.c create mode 100644 rubbos/app/httpd-2.0.64/support/suexec.h create mode 100644 rubbos/app/httpd-2.0.64/support/utilitiesnw.def create mode 100644 rubbos/app/httpd-2.0.64/support/win32/ApacheMonitor.c create mode 100644 rubbos/app/httpd-2.0.64/support/win32/ApacheMonitor.dsp create mode 100644 rubbos/app/httpd-2.0.64/support/win32/ApacheMonitor.h create mode 100644 rubbos/app/httpd-2.0.64/support/win32/ApacheMonitor.ico create mode 100644 rubbos/app/httpd-2.0.64/support/win32/ApacheMonitor.rc create mode 100644 rubbos/app/httpd-2.0.64/support/win32/apache_header.bmp create mode 100644 rubbos/app/httpd-2.0.64/support/win32/aprun.ico create mode 100644 rubbos/app/httpd-2.0.64/support/win32/apstop.ico create mode 100644 rubbos/app/httpd-2.0.64/support/win32/srun.bmp create mode 100644 rubbos/app/httpd-2.0.64/support/win32/sstop.bmp create mode 100644 rubbos/app/httpd-2.0.64/support/win32/wintty.c create mode 100644 rubbos/app/httpd-2.0.64/support/win32/wintty.dsp create mode 100644 rubbos/app/httpd-2.0.64/test/.deps create mode 100644 rubbos/app/httpd-2.0.64/test/.indent.pro create mode 100644 rubbos/app/httpd-2.0.64/test/Makefile create mode 100644 rubbos/app/httpd-2.0.64/test/Makefile.in create mode 100644 rubbos/app/httpd-2.0.64/test/README create mode 100644 rubbos/app/httpd-2.0.64/test/check_chunked create mode 100644 rubbos/app/httpd-2.0.64/test/cls.c create mode 100644 rubbos/app/httpd-2.0.64/test/tcpdumpscii.txt create mode 100644 rubbos/app/httpd-2.0.64/test/test-writev.c create mode 100644 rubbos/app/httpd-2.0.64/test/test_find.c create mode 100644 rubbos/app/httpd-2.0.64/test/test_limits.c create mode 100644 rubbos/app/httpd-2.0.64/test/test_parser.c create mode 100644 rubbos/app/httpd-2.0.64/test/test_select.c create mode 100644 rubbos/app/httpd-2.0.64/test/time-sem.c create mode 100644 rubbos/app/httpd-2.0.64/test/zb.c diff --git a/rubbos/app/httpd-2.0.64/.deps b/rubbos/app/httpd-2.0.64/.deps new file mode 100644 index 00000000..e69de29b diff --git a/rubbos/app/httpd-2.0.64/.gdbinit b/rubbos/app/httpd-2.0.64/.gdbinit new file mode 100644 index 00000000..f60f31a4 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/.gdbinit @@ -0,0 +1,273 @@ +# 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 + printf "[%u] '%s'='%s'\n", $i, $t[$i].key, $t[$i].val + set $i = $i + 1 + end +end +document dump_table + Print the key/value pairs in a table. +end + + +define rh + run -f /home/dgaudet/ap2/conf/mpm.conf +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 = (apr_bucket *)$arg0 + set $sh = $arg1 + set $refcount = -1 + + print_bkt_datacol "bucket" "%-9s" $bucket->type->name $sh + printf "(0x%08lx)", (unsigned long)$bucket + print_bkt_datacol "length" "%-6ld" (long)($bucket->length) $sh + print_bkt_datacol "data" "0x%08lx" $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) || \ + ($bucket->type == &apr_bucket_type_pipe) || \ + ($bucket->type == &apr_bucket_type_socket)) + + # buckets that contain data not in memory (ie not printable) + + print_bkt_datacol "contents" "[**unprintable**%c" ']' $sh + printf " " + if $bucket->type == &apr_bucket_type_file + set $refcount = ((apr_bucket_refcount *)$bucket->data)->refcount + print_bkt_datacol "rc" "%d" $refcount $sh + end + + 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 $datalen > 17 + printmem $data 17 + printf "..." + set $datalen = 20 + else + printmemn $data $datalen + end + printf "]" + while $datalen < 20 + printf " " + set $datalen = $datalen + 1 + end + + if $refcount != -1 + print_bkt_datacol "rc" "%d" $refcount $sh + else + print_bkt_datacol "rc" "n/%c" 'a' $sh + end + + else + # 3rd-party bucket type + print_bkt_datacol "contents" "[**unknown**%c" ']' $sh + 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) &((apr_bucket *)0)->link))) + printf "dump of brigade 0x%lx\n", (unsigned long)$bb + + printf " | type (address) | length | " + printf "data addr | contents | rc\n" + printf "----------------------------------------" + printf "----------------------------------------\n" + + if $bucket == $sentinel + printf "brigade is empty\n" + end + + set $j = 0 + while $bucket != $sentinel + printf "%2d", $j + dump_bucket_ex $bucket 1 + set $j = $j + 1 + set $bucket = $bucket->link.next + end + printf "end of brigade\n" +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_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_rec + set $s = $arg0 + printf "name=%s:%d\n", \ + $s->server_hostname, $s->port + 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 diff --git a/rubbos/app/httpd-2.0.64/.libs/httpd b/rubbos/app/httpd-2.0.64/.libs/httpd new file mode 100755 index 0000000000000000000000000000000000000000..94f3320023789514be769a1e881c903fd85cf07e GIT binary patch literal 2192464 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 z%0D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

  • +Z!*?Hr!XiRhR>Gl!zxT%4&BtHK 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 +Q(6@uW4|KKf zpvDV~zngt_I%>QSrF^D*0e6}IG7w9CTNl5L0J$|I=$|i{Exg7W@8;|m@UlBxjm2nC zC2n%N-}^b&faU&`Zf;-$(%p!37hO85-@}61d0q#bGxoU%x-)8CvK{>o={^tl)D79*be{2`HJxa&iLg})E{o-1bcchLS$Jq!N`_yhj{ z{~quM!QYCwbLU6*m?A$9{xJBL9hYD4$B6wjd=~Zt{yy?M_gl<34m&8CHkkfdl^^jF zi2u7IUO?HuU0-|w zMU60$J>joQ!e0dciPmoi_;cXD4RPnzzx^J@2JnZYC&n-1&R-b=FIqvb|=R4+Fe~e=L#-&ER=$vlDI1xZ%O%T_KeMO);2WT_AGQa54WS@OqA=o>-b0lM6qs{uD7pr=8KBKr`+;|O1fdvnQs zXj==jBhXN(NZt&;8|7PLGJp3lk z!`Fen;1<#)443c^fgT2Zt)l3EGVY9mz7_Pp2}z}^{1#+#pc3Ci5PLwsjn_u;8z6jO zE7WoiApV;7%v$HvZs+_y4|*K*lJ`pObu|=<>zL|nBgP1q^%C7u#r`_R;P0=q{ap52_&ZKwK3l$s{^{28e0GB#1pS}Q=Lq75 z5r2o26ZQT-)#o9|OS$B;avRnM{|EVOLHyk(F`ru?Z*hOQKF2{1fqu26eCrh8r58}M4OFlb6-wk@yC7*NbI~CdI7Q{bz67zWg^47esT%UQ+BcT7Y`fUCZ z`VYiES^6A;yqrruM?pUb`ai4B1BhR}{^aGe@yl3Wg}iF1UtTg^b$}iN{am4y*yr_+ zplhB)N6imtOMkfm{PB~RuRV~LE6Gh*IeUpL}qZ^t=|=iveUm%IPK^KO!Tl0z8!d@4@)ULO7{@%R$9!9xU(SdJ3{wlu;{SMDMzH4pP0p+{ax~|N+hm^As z{0lx=-2PShK@WibLY7@X=so0rX$gG;=t1z;I_RRWE#yDbD&L&z{c_$5>v=9_$q7#* z!t+>~IwEV)EJm`5%AHw4Z|Bet)#m?`a$R}dFBj`tiq!Ijwz#skGtbWhZX&*)FqCMtB3}WbYu!Y~id>rxKB7`~O(X90O zSMYBIe?R%s*?QZyOQ+2;%>SdT@Rp z+wRZlCq%s)U0YR~AK%<_X>E?*cQ}M};$N68JSO=>J>vBUd_o+fqzud)59T9i{x>n7 z8=KYNi-I-DsdXu51Lz^pk6Q8Ns06-QCGl6tE4Om+Vx^4ma@4ief0MougKa^aKE%%< z{-Y8f{hxDx67ys3^UGm$*`h(ookJh{bIIR!$XWkI?1zaQUX8##pvOSR_O7!(!>_Jk z4U4_WQaNtSdl~yh|CJM{Kg64uOaE=M4zOB(Ck*R654$QFJ3rVqb2;gwTny1)AJPdu zI9mv?{X6{t_%ZxG3Xcz1W4`t$CH^?#d%lcwJItr^JQOyx2Is*!gC8M3KU$2O7F zhY&wK&UT4sxkPW3-$H$VWmbPzP_=K2g!+6OYLNZNQhbG{xh~9fgkFP*T=0q6!mmgZkn|UVeh~EY#eq@j zqjKEWU-4}bpRemQR|8QMDe0^ed4HTO`(FDH=vmOO0*|?be-!k^f8zQV10-KNK@T2+ zzUG==pzU(~3LiT@)%Wx%uK7}3x5%scHpYklo-O>k3JPJuNytV4itR)y<{3Q(E!SFghoACd7P9Im=>J6)qc?{orhE7k0 zJh|el!U|7Q|M5Egt@;Kol)4rWUraQ>VqgJ4=g*8)N8X`1WE_|46b+s;h-*Hp(>L_B z_v>eq?;QEe9Mh!#TtS!T;C-6Ez-NvfnoMw}o{5~qmM z#2I4M)4Cj|6YGgh#8zS#v6t9S93&1C$A}ZeN#Yc7nm9wO`W4eB))SkEt;8;3FR`CE zNE{}P5hsX~#3|x5afVoxW%|T=ViU2I*hTCm_7ew*!^AP-1aXo$MVuzi5UYO8^ojMv zCSohGi`Yx-Ck_&aiDSeG;v{j3I8B@(R{e(Q6YGgh#8zS#v6t9S93&1C$A}ZeN#Yc7 znm9wO`YqEZ))SkEt;8;3FR`CENE{}P5hsX~#3|x5afVoRfaw$KiA}^-Vi&QO*iRfJ z4im?S6U0g46mgn3L#+B8(xoUoR$>>im)K7nBn}hDh!ey~;uLY3 zI76&D$n=Tz#3o`Zv5VMC>?aNqhlyjv3F0Jiia1T2Ay)l?=@aXTO~h7W7qOSvPaGr; z6UT@X#7W{5ahfMu;6SWj#swi3IDy~KXvAaR&DMw}o{5~qmM#2I2$j_DKYiA}^- zVi&QO*iRfJ4im?S6U0g46mgn3L#+BwrcbOVHW6EiUBq5uKXH&aOdKOl5GRRK#A)IT zvFfi(pIA?9BDNB{h`q#q;vjLDI7XZxP7TgV+SWj#swi3IDy~KXvAaR&DMw}o{5~qmM#2I4M5vEV9CpHmViCx5AVn1<^I7}QP zP7o)FQ^aZF46*9JnLe?e*hFk4b`g7t{lr1yFma4HL7XH`5vPeW#HyoApIA?9BDNB{ zh`q#q;vjLDI7XZxP7?aNqhlyjv3F0Jiia1T2Ay&;YePTVaiP%c)BK8vdiG##p;uvv) zI7yr$P7`N{RnIYfVm+~m*h=go_7eMvgT!It7;%C)Nt_~16K9B31*T7|CpHmViCx5A zVn1<^I7}QPP7o)FQ^aZF46(|i*Xd3t))SkEt;8;3FR`CENE{}P5hsX~#3|x5afVn` z!Ssps#3o`Zv5VMC>?aNqhlyjv3F0Jiia1T2Ay#>rKCzzIL~JE?5qpXK#6jXPaf~=Y zoFq;Wr-?JfDj(A)))SkEt;8;3FR`CENE{}P5hsX~#3|x5afVn`$@Gc!#3o`Zv5VMC z>?aNqhlyjv3F0Jiia1T2Ay&;}`owx-6S0-pMeHT^69i?tE!kj zv7XpOY$bLPdx`zTLEc#;?|L!k=_6x8W;I{~J9gmVWX9EjL9>lst#mYB{M-{bT9h zcKwN^Z}LAEMsLt^;-A;)oBg*^{?hVqOPpBx!Mv6ms907iQaz`KwVd3s;_@$gP4hd$ z4R3#2_bcCU+2!ZH!&936X`eo^^j#Bm5+BrZA_4dO8P?MDpBg{0^rPo!xv3_1`SI;q zPPX1Xe6I8>zI9^hoA`eZqdmt@U;1TpxydTk&-g!?zvy*3ABk%<2EVV%nd7rt+CnQ$ zf8E0;rk~&zolfRn_wtATL(2)y5pMERn*Qp^6H7n&lukE7H1Z5aDJS-0_xu^Y()9m! zg6YSmwA>`o$TOIJRF@+&NB#_7Y5Hq_cw*(x9@6QDiAJ8m;A2`&?hpT1`On;QV(FW7 z3`U+UPAB*yEhqWsV!GisSX%yhCzyWnZ(43{Mq`-IaXu$AI{nDue=Pm>C;z$f$GvjG z&%WY&-R0OE`mVJ6{-@mIS^m?p;&e*ondjv1w4B6gn!f@8(hr4!0p3>v&AE>>_mzX( zUkGxYE6n}gG}rwy#GF@;J7KPeC!W^sWsLhn3C`1#lo#i^U5@KV3C^RE+)wjxUnOkh za-Aj0_3kkFvwY5S9V9||IqnOkxj&raK7ohxAoCsKx@3fyq@J_1uc)yX>MdgAkT1ye(o8SJ=diIS zwudzH7iD{ku$%!?f23!qr!4i6HTBH;$k09##_pL;mi3u7<)nFkbi7=dH`3#*uPpNuCp}8} zF{2;aUz+7l(0<}fKTJD{QU4LM_Cg7h*a|>LqCUHPi0cJ_6K7l<|_k)aj;7zsmk2OMRwkcTr-Na)Pw?oavv9 zzNps>%bzy-V7U`)7YWl(F+V}J>mcnYK{;WTH_iAF_Afcc&ryEPl$&}Bu>QlQoaBoe z`(pj&sK+GxksS3MH0iK@GnAKRK4Zpy_#7aH*?wY_6JdEntY?qOH}#jI-DFI^&-gi} z?_oVeDK9{M#7uw7@&x!CFzuCk2(nyJ%E>Sv8I~)>dI}mlWqV38+(WyFFg(Hh=1e`a zz2r=OsMjF#m0&sJELVW`6E)9_pJKc6P+u|Au1&k7oV2MAmM6me$7r7chKEdj&@N)k zSCaOXWO^y)Cqg@jvOh~ve>vtaK>i^0mnMIP?I+HBJaoSDD)DPt(SZ^slhbb>kIWg0I*bjxNuL$!UrTiqzmo?>K`GV{pqb9%1 zSB@BBd&#lhGp65UJ_D@39PQ6TJ4mt}CXD`#9Webc(+g2AG1gy-a^lQag7tghviAK+zIL-!}5fTzGx>grW0bj2(z47 z>OV+10orrav`^E|kT1#ddT37}>Nm{#%CNq&Y$pNQYl`wi)K8T83$Q#X<}1N?A=4i) z{~_unV8(OyYf0K!iunthcEk3VV0fDOh*FPf)`y4onKb#Oo}#Re0Mk#I{`pthABiyk zaposZy=7^aA@-k9%FCH{&vqPQzH+8sja*ajqn}oiG4cgXKSaG|sMi$j&O`ZW+EIY@7iYbsOuIMrOZiFaD@Z%=Fh4n# zFHO5k8a=Wevb4jn(I4|4q`VmQkYRX`=pkQ}_K>EXrdYl>%MmAkf_4|BJ_D?mF!h>X z`O?gPkok_1FGW2?*l&86|2X+lrhS_Ji~5Z)e=+JY#&V^YpE&gy_~UZb|KL}T(vjoCeX{+UiEu}@?2ry8Stj`{U-<}{6QV&GK$93)1n^>ct2uhP%y zQ#8hi3DSdn&Kf>ql9-~L1Tp(OEhj?^5F@8+dXSiXv3^dxNMoGO9zI76*6Q%&3&~GR z{Y~p7L`-}_KL>_2dOoc&`YDacdo(8Q)|i^q@^atQn0iEG?CTn%#N^lXbC?(+#!{N@ zA?CiSpF_mVL;5*Q^biwY(eyYmJ+7al#0W9*Wy&K4iP0}iwHi~eCVjU~H#e=(bB3lTjomcs=L|7mp5LVDX`+Xic%!DriRqAjju6Ad_!~4m z{C%Bn`r8_#FD3ou8bfc^n0=MTILi~|bB52Ur$t*7kItK zNQ1@{pFQUJb($U}<`_Tq8_NH+#t1Q;)z2wnk{BZ9ex<`b-y)iFvtH7#(di|&Gu-Hj z^^;+`(K9t)ju@ui(qGf@0({O+>E{Ubl%`$-w1+tPW5iU7@o&=Y)6sGmc`zz6hm z@D8@`yENwdG{!b+3=L=uFg*2M{Tx}RF-!gw`}HI-L5ve)#3(VC)a4It&~g&HG-inL zN14u~#t<<^3^F|V0OJ$m#OUWV-9yamCLb|m;xRn%S@PenF`d*HB?kV3@xQ1sLiB9Y z&z_wcQ{U4VdPHOPVU6*$#^m=kdWe}(K2u)e-}H0L$YZ+E?`nGdI}HCe<4q8^YfOJ# zWAe)y6U5+`^mBlicu+sbiCLB-LktlUBaCOTM%P>50ow29G-inL+x2sdn7U0rhc;@A z-oa<0hZz2XrhACt_miKP*`S|O2HW*>=6;Ql&udKFr!mOqzz6knHm)&DjNGN4J$%kF zoggvCbP~iEF+x8gNDTj0>nB8v{YF2>4rq)LlMGM)TGLa+T$cR5)0iWFd|E#TmuL(S zBVqlVIagzv=piQGsp$z~<{kPuMvM}Z&6*w{dWhk-YkKN!8k5BAIr=$Dj1UuxH9bfS z5F>9TeYM8KN{u06c&UEQU9K^8DW9*@7<@O8d{LG^#ODApd9~)tEYp}+t1;W7G0grc zcLVtt9$cZHLwpX?PCOCPFCahjAGt(7r@x{x`Bgp>Bg8DjBW*f7OiU5et(qPuW|ot$ zh4eKVW5gUWLJSa-EN}8+&7UA<*uSQU@hNTRQTic)muddc?=?NgXV1%-?lT(IqyYa) z_qXpn!Sh#%C0c&u8m1p6_Grw$V}(j0+@YU+Ot2F8GTtkw@cJs}Rh?3O>S_L(=hZ$x z@PZeupgWZq*@UcBVdi;sZ zkDvU>-lwL1y6nJg}|nC7hQGhP3vwAHlDrs?8eu>=~ngh#yj8Gcy_4qHJa)vV|>%=-*^r=HP4&W$9}!4 zh}EtIZ2;AaUkbqIPF1)$jQz7JS9bLyEnd&h-emaA;puN4m;XKZPNS9|eWiB(pSuwlKwLDH6Dvo-)Q~^-(~nSoc!NzzINlvpBys$ z<}hvI^b$rsYWZLLvEes|U+?5cbxLDt{_noiXX=-SRjbTsSrS3>4_~>1=j%!s zi}Lf-PYr+WmpjA8DyH`QhQr>txh+xpaP-uQB}QFy-mT)#o2a48J-2_@(2P zcgIe{Zw@QI;JEfPkv05j9(r73zK&E<2A%&82IjH6!RNGokU`h08&t37i;E0@+N%xo zx_Zr?;Ue!!#y;~DZNDCN%x6~X=X<@b;@LmE{9YqJ^cpSyRr8L=-~Cy`A3a<1KkPCP zhy-2UE#rni6w>^s%hx(xF3ta%v#O|{2%YUo^HrykI3mXDdFEQfAN-J(-^Th)ou)voY{yWY%h2@F;Q1kyvPF%WNTK~mWF>*nZB<)dX@&)|O<{!+E*^xw9sn)(iKabb?;OZ~ldwc!tv|Lw= z{7Ux(wETOkPh)w_;@@rV?5yAKFEIRBPGXlGH$Us%Z1~Nl)X$IGfBfM}!yovQ&VSQ! z$Cv1hhClL*=KtCy?ga?L)6=S`uGoy5ik0*5RdD>t^?#^)5BMmn?0x*b^G+u3n=+Zq zWRjUoU=o@ELP#hf5K0n=bcl#RL|3YUiXu%^1YF$}yP#NhS;dYWb?ps1b_5I7ML}0t z3kssHEdHP8-1|-jmT&w0e*c!whvA%a&pr3t-k!PRQ_klgeZI^s$d1pSxt2mF^Uo3% z_`8H1c!M+%Zt|-w7pk9!W%;3$HVrfODoc@GZjp1E}yMr+a@P zp7`^dZt>^Otl0nQ6nRP{ubugLax|`MdQXE$21TyBgt^ z&-ns68Q*sX?RT(9vNHB;0PR?r_rgv|#=api?_ACZ`*q}(AjtSlBD*UY!BR)l1vd%P z8A{#8=x!xGGkg*fv;059R-md46#NTGR(Bvd9SpUc!nXgznSwA9`%p!FQ=z#NQFxf06|2t4|YVHJ|L(=~|Ou5yMQ<-F`+sh9xoj>D| zM7M^dSek6Cao2zz6klf+rUI) z>Jvmg*Dc6WR(6T{7R(Cw8^-CVra<9xx0v~G!mM>`nT0B0*10tdsTO9v zdkjN*sEZNj5w{}?wwL&}!CgwV8np-MJa6URO1J-%xg6@T?6u6Kb4xZHxq+nRT*o55 zk=b>emVD5+vU)c}NC-0f)6IQa^Gl(ufse#0dC&=EL%{_H)jP zBEJ7_@EL8{0W$wiJ|oGV;d}==qpU4R$S#3;#=^1C35PPaoDN}R8fq!y9U(hHp7GxK zl+Gi$^=ifnvfoiCF63E3MrVldnO2ZVva1PiTbZSZ6v}u@I`0$6L&gWAX~zn(*KP6? zGcA7)B%S-@Ohot3A^GeV2+SloDfh)i_)oe@?nd2JI#cBpHb=)fAElrB8tIVp8sg`^ zLAx<$HImESbQ&Zj1@os`x$o0TsdEv^Aos%yAnxz{9*Vgivl#20ztPM#(nFl3G_#$h zI?TBhb(j0aYQ$}}!X>$zNk!++KE=v?`*A2l_R+?B?4zir55WW+)=5^9HCF4p8|sCm zL&3hjcfhy6exMQ3<-zs72K?`G z+z8(9lhSaHTLI>;!Z>a%sx|nKj~NNM1JPfCkNDO?7IV*_N00edBaKokYZ#mi-r^e# zYlWoO2P1y!xsQK?fT%y4#NQQKF}Iec%lxc_ zQnww|+6zo5VT>_@U|7U2|yZ_h+rqWNZhq?Drt*0=f+%Inj zQ{(4CwAnq9PS*-E$?b>9JvhLh0Y|5}s~tEx$j=|TpXL7886geA%ysW1Ggz!Gc2DdA zrb(D3Zthqx!z4e;-QPxm86hDn+-CR@9PMX)UG9z~Ggg>u+#qT?I8M~ox|?ty7920k z&F)fWVS+I0P=B|g$g){f0f#k)?hRvEPv9dM@IQyZLeizdOv!*QXjf>~m%*g+e|!YM2E36xZ92R?nVV<50&m*CSMI|3#$V(+m?V#D#78QTdRCw4Vr zxv?i8$%-}OGu!g7fzi<5?_jeqjzX9lQtAP$x7?3=L2k>iY`H%n^PvnGi5>TpE5Kwb z_N|aR02V{8VkO4h=}07$t?q-Y)cqRvLqT~$P$;CX2U8{eDil%dSGDdfR4Wvw z-Yr@TCZ^aEhDpl_CH34EpFU@X6)ID=z`!K8<~^u&P;9PK+%7N^>ZH~qWR?|nLL>LX z{fI@gqp|d~BIsRKXlx&ny-_-$aYELS96y=T2_z?;NAeH*K^}b*NGrs82!qO(4;lUg z4huivFbN5#sn+m(X#xSKEu<1m^9KccIs-f%rh6zIPZ7&oZH!)}DGr5?aOFZs{ns&z zlUZ;6{;Y#XpN2H^NR&@`=&=Hnj5Fv2h@TMuoExeA)a_7l9FEbU4a{7~+09yhmUd&# zTa>?W8FE|VJV^OQ#x1q{Q`la-E%M?g=$SB zm-4DpbTH%&qJsmZFT`XJ2{nkZQukzrH>n=<-5q%Wn2~A?lBseZWXL%65SUsw!E}yR z?|`Xyce4bis_(!IbMadrR%o__G`oeENkXTXMt0FsL?cJmn3H0f&X-9e;H(5K z<-{cN*_rY=H9+-7FNEpo5SFJ`f=_tC^gsu*!y)2_5EL^(kwWkz1c|BJAy~)7RHEfh zkhcpt4^hHdkHf13Z#lx*Lh|w=oFn8ID&z|3pfiSpLN4e8GEc~6SPX}R#F3m8&KI(R z(ZWLRLQ4ooge<3p0wD`fu;HkX(~;?Lp^%-KaFLMPXg4P0-zbd>`5Kcb7E+N+2>Bru zN`$nSa2p|`l(r=qj9?GQf3nt!qDUw$xt#7CW<&1UYiG`aI)r!Ao1t2`ZH5+FD?6Z1 zT1UcXvxnS`PMSo-gD($0gUbK%o^n2#yuG9mUicTnwtY57H~${w$X+TW9kkE=9i`lK z+UJo>+jOE{k$NDt>9n7eXgF%Yh%%GW_QIII;VhD;BME==T$0GL<)83JesY7F@iu)p z#0E7`c0YBvLCq||%wjgE&NoM~WVk_fzRLxvH>l1oPELA*>U`e^wBDdPd)@%;ZBU(k zH!w0csLp;JnHyB+H;F78RL4>eL!>vTj#9jN(Hm69Cn08o>Q;55d)%P9)pSobsBTXd zLcp1bPuZqstdPkhspS0c) z=MB6CG#5lY5HHss8W=;?gYP04E0_TvRd65Lh%fjCXgipTPk%6grjil-5_BMV2i(jI zj)Xo&34b=qAvA0&O!<8fh334?40c6{gie1FCjAdU9k4c}kx6oK=(;w@y|^A)t6gt~ z_0Ua>=s1nEcT0Py=Q!Um>K$}14=C%b1!&vJ^G!{^%}D|7W(Lcn3Z^oc_LkL%Do~h zc{>K%QJyeF-s5b9YWoE#=lTo!z5%7+baYr8rJ(yO%l`(JnFakHh1_3^o>_4E4v;aD zr3F4!g#Y7nG0-T%ILzF^zApq;ZX zg7~w?A;GLT9Q2OQK!==jF@hHC{2K1XoI8#H{R2lLy?ZR!!z`9N_hSw$*vApH%8``! zGp$<7e;Ir)IO|f_&mrmm6yk!V*D-C9wFT#9<3Aat3eM*!WjV(ou;5}AqvO;w&ugfX z<2?9x&^OB{?Ocjsx?ufO$Yaj&yFqU_3v{WI_YLS*SA#Bhu6qmgmIpysu|%&f1r^N0 z@M#6_fLUb~)0XZD0f(XC5;!oHLisp~)MS3JGEg@x&&Hy~er8OcjYUiRT%zf-v1pl}!-qZ_i?$a=pN&O3`Z<{Bv$1Fw3DIX`(F%Vj z9etDgE0DR zEIL@M>9etDlQ8;hEILf`qtC{oBP2whjYUWMS^4^GEIL*geKr;yCu;g^EIM8oeKr=I zAj~=|>k>qb-sU?GB^o1rP4sDd9YzsdbI;hi=B}gGbG9ztzoIIlFW4MSLhgrXmeH4O zj*~IBJ40R-rqqqXO7snzWnJ!Gi8JQtW?`z_=aOLF5vI1y7c{WdX8rh8vfjP^3Gg4; zi&0ub+N{SCFuKiVar=F3hq-lF%|^EiKg!()pQE3PnP&IbS3i3@iE%n``YU z?%Y)f_||5<%yP$9f%)Ffg7LZTM;C$FZBGER*xi01m>-2%9-lvLmKFU;a=1bUhx2g3AsA7#i#!qmH) zt_1Um#2MzkKu5PpNVCfsH2RrzsY$Ne0nFzt+ty96jtwB!_M@z>ao=SF2-%#0*1D1QV8X(z zbGaCf7TEM)y*r%-;!>xNxJOljN!aYV8{F%eP8*4{(S4mcEfr>yyOgHe3A5FGoH^|z z2DZ7sqqTBjcDQFVq>HqzFWn^L^p(2b<$gxBI$?fJenMuTFqTT*!G!9Cb5v4VOrvli zl^k$Qjjg1kmTqRqWTC)^Ol}b*=)p7Jl-Qrb}dyVJ>;p$b= z_ZM)Jgd3)kqnYQ);(xPBvRg)v6>hvr_9iz&w{cavaNcYydc1H`RFY@H(OJUHQpuCZ zog~~`q|SJAgj=kVJb8|uD%^6FoXs9}n%&n%U8-asYRmZ z;V$4sj#^%e90s^sqm2y_c+M|N<9lSzl1 zCy@WbV@byxw*A86NS8VU)(N0Q3Qr(i?_34{3QznL z$qtkItim~*AezhGM8hhatH-Ro=CbMZbiQVT&1Kz?kHUqT&26@FXeHp#`GE5cKC|_* zgtJ({;WUXI02~WA6{2_w8h>VQw8HYDuQ@n5JCRz^uHy^fQsMLki>;#F9DDV>LDAk( z5#+dVo>jC@#+3MUt4JvhJf*N0Li~3A=p!E0$eDTx$wyK z7xl=8v%&M=fEBEQNCh8(0bkGpZ3j1k_6IBBScc^v3tx(c?Lcfl%c5uov*Q00rB!r( z4_FB}wfK}}AWI-3AEmH^kP-;|H&XS2V?}kkr~1bOR3mgpR*VsjQkMTI6j0HnD<#g= zjKi7dRxgg#eiy3ADZ2b+NTQpmyYeuS=QF8Q<3L(|suW$pILPny3Y8Z8ki{Cj5CH|j zQSh*Ba4#g~!K;w39>F^y?{E3*8Sl}z5zjx9^}VqOQ8P)F7j2#bS{B|#Z_9GcS;rLL zr5}#71SX35r(*4QfR^j2SVwK2 zgG8*Hv~Fgxu2j+2Q?W|Y`g$r>O#3kzPX*-F_iJX38$z3c0#xT`pc>FcR@w&EnFuczWcwWkO< zlk2H?Nc|IxzMhIlWDBRSr{aae=;`qr}%`YNUzcq z*}>q-=a9k-J{3$=hay=E_z|86Esra+B ztFNcxFYH9K)7Mk+jf`8WuczYQpGo^u&>pMeKfFmpyq=2hCaJHd;(NZOSgxnydnwn~ zQ}LgemcE{f|137;dMf@4D}>imJjn@Di3Vij8u<#Gw}pKN(tyJ}1)P)NUcd>U=Ckue zkWZ3Qxt@wws&){>b|U($cz5*$7`dK`_mrlruczWQ!szR%c&%yVyq=2JDLSaHr{V*o zFX-#3c!L&oFyS#1Uj43ZdNlUoZ^XUDg*)NEPQtOGlpls z>iP)i;J28Rtl&G4sGuL8zTi3dw1bBsmY-)hz2Aje^w@`?P(#;?X3w=$9|~cPhhT}A z>X}*0)^!DRdU3?D3Kv_dmi8SvzfpZJ0UfgZlQG__ejkD9h#U5XMn=101Z0gQtxoeW zWvIa%r!3X!GkC9tkiqgL#0-vuk{r$rvit>*tEMm{hfSc>7pS0K17AK59E+iRDhS5! z%*DRe=rR@VZ=_n+JY-S5On_*~^qFt@VtEy^s1V6^9ewbmU{3g-QZ6?wZZP-$4>PjrDCqV;h z6355B264buXq_diWa54W?d zJ@6hb`WE4Hylda@{nkV8>}Vq*TNah#u$iXxq^DFfG)*Z@VWX#j;%2S)c$F=54*i^B zV(_+~e`-y)wq7phFqcc9B)Oc!Tz(I(k2GJ2J-`Orz^Xlk#)$i1rsp!#L{IiYn>mfm zBZ#BW+OwGIJU07@V0+EC)O<1zg6Vq-+r$Eq4H|MKVx8tBjMI+hH`r z;Q)%p-mS)2y>Cp*Z>0nrey!<6+;CI;I>FRS-& zX|^vsP_xl{LA`gVun{@H**nawOIPwa-L2l$CUg)&Uo@dhfZ7?4>a}_gH=!pYbcckF z_ni*skMKE*t=>nOQ094GD%9%zT$;@!ii_3k*_4)S_1kY$E`VWuRWJaG($!D5dTeJ& z55I|Cn;!_-M;d=>O#+84J<)fDb8I~ZMc=18hmGN^rpLju5szde-UFuV39lk-6zjTf zGwL{E%!#Q{8<1rGpCJyZ0pH+1Yv5=2jA4kgdV89e!ok0pJV+(jSs`WhUTqBBj^KUi z!K&J-xhE|!)x=dbvpx)?*L!S?_s~T(0h#GcoVU7%jk9wXW<|&@GfuYDdMb4}9n^iK ztU<@p%b2du&8hD2XenHugP^H!ec&<>yqTz91S0THeqNtWH(UrwJIn$NSAu9FaXpCV zNvs1=hAz7-Q>eBy}9DpfLR_uUQtbdLNq> za)uYO0wFakOb7=dPoLw|N`$Ulw=4j$)$cx2hCUn}_1k5bHejqCKXPu_$Kv)z;73yh z-4&60VzQB)>C^DAR_2-g)F!T|*SwhvEcF}N3`_}!V`#Ay8{bXfdiN-9M1W9Z9AuU!2#bvD3T%0EN`h=uo z^I~La#qqY1W8YX!9k7axTbGO;-DQ z$v<-1&6d?h&RsZ4>lGS1tu=DsYd{~IaT8NSLygF4X2d6GMH?DPb19_X|xYRKL58sNxoK4lCKq%NKuMYDprlNt2#VLBq|5_ANlq&$$!P^8IRZ)&IFg$NM{?8P zNNyS&$xVYJxoL1DHw}*DrooZ2D%hU&1#2rDDZ8c*nv#YieTB_K_9a8X2OQpZd1&_d&LIPh334AFe@THKz zmqG$x3VjK?fsnwLLI=W^d@y0)OK&h)xfoA}FP#Df556?iZ?YL$tFx)$ON{8jmqtU~ zgD;7D2EOz)vgg56@TEzJ>%o_3(}OSl0NR5uk@nzA?;@@TUn1?nmq>f? zr83YSe2KINUmAt1q~J@;mj_?k%rWKXlQ3QVe-*xzh2EyW5C!;B2+aRE_);OPrQl1Q z!2CY}Um`5%c`N@`)P5^`iJ3I;C6XR|iP=3EzVtq73_DHKVHk@Bi*85OfS{DMDboI) zG@`rvNbtd%s3c#A3ZKO`An>KkH26|xl7pVWmom#HfP@a=OPL0~l(~gpG!*z!<~u?X zzLfdi)07gvl)3dy#tIX@M4>pAXNB(q&k*4=tuWzB97Toq;7gfr$+%4TQsxH)N5N1x zd^qsHL^N%o=S{|sD-Ry?@Ueu)1kaHZD~ zSHqP^{fBU+2m25j?okUqBnU(mU7ycyOhCpgp+K7s##$SK`QXD7aD+^gXx|(@MdW*1>){ThS6YIiNWqn!h0ud5NlhLS zuJjVLQgEf$!KC0yj302e;4^zUK0LV64(fPtrJh*#dvGP)&JA3N%%R~*3O7V4xDx#; zwLG}eAXrPmmAGN^;7UIuP71CR29ts-(ZK%{uEfFQ&~T-CNj!bR9}G1y_0&>n;zjq-)N=m2~kQ3a-R) zG6h#6^S=vMT7}a3KM7Z2Rixlb9bh~KSDFhZ1y>?-Xt>gK2x)~Yak1J8SL%jMsRvim z1!mw%If&%Qx9b2`V(F#eN-;1gxDuHZT#3y8O>iZ)pcGt*>&+Bgi6MuED>3BIa3u~i zDY%kuf(EYC7FkHal{f>X;7Vjta3y+hXt)v+O~I8ICk0m`lY%Re`Jcj-SobNo5}6cS ziHwzkE0J?ja3ylBa3#9e3Rfamnu05lD^J0dSSVp3TuEg;)BygpWi}i#G9SB!igkXTCuq^T5O6ws>!IgdhQitf zmd(Gxm2MWxTahyZlW}nk>A_?cfi^H1mWlorcdVSW2a}r=WYz*_@L$7ZIC!RDG8`pRFc}V>DVWS3al4p;$y^L31(V@ClY+^RNx@_|&m0;i zLs*Lb7B^rr(vjs`+%}I`MHr){z`PjM51tC!R)9 z!(=W8Y2~sWeuJ%`e8`?P;IQxm4wH~@nraOXN)re;*^o*w%^wu(>2&dQnC_u;JjF4d zBE3pelru8`s30{k8P=PD$=n602a{1K83U6M{|rp#DyaNdFqtLDtp}4~+)@uFlLMO` zOlB(WYnTj44<@smVgr+*{7^6%v3U?oh9?HOENvQ)4O8$daNgGG1V{r8^Mo(cOV1?W zDEkKFCg9vel2Q*Q^H&H`Fqy?gXxID}_kSNILkABHlcBLg!(=W%ND3x%6POfC=2PVLlAeL5|MY+!pod&H-B>n<0U0h6J)1vM>nP zp^X?r{hh5jp^}`2*q^$YyUu^&p!|K^w@X?uZ()Nk2TuCUfRNHkqmi*<{pG zlnKpYPQ<7GRGdy1|GXMxCdp9ouaALtxPvbKmu#S&(KtmfmTz=&|GWXg*_@`cUVuDN zt9GMy1I`N&XU(HzhLOAn2@pzM3vplVJO|sVLRyydF|<@S(vEW#<&`X1V3d}S>HZbs zbM4z zHzI{Ll{QM8ZbS-oBT}fFAcZR5FxnX%jpp38ht{;Z-$Cytv2Zq-ND;P1{HZnX;{v-1 zx89T3g=(>CswUuHYhO)PN?9WB1=|C~b2KMT|H}1GFY5vD!emW3YYoIN0?B+Z|HoV z?Z(DGU_&2P?}Vk=HQ;_rTHU9yh8A$!w968^W7ld%xVK5x$_m$fsrf1gw#62rF9~f{-!6Bv=DZeK~}{;6UbK5PY3!}B5$k*Djnfl1QW*?t*lPCkoUCEyi;1b z(^Xj&^Nc22)ww3IMNCXuRiCR&a6cHTxWh1PHS0z9fF@SqWqcHrUr7tMDz=-LCm`fY zlZs?XTJ~-edJaN!QQOS$Qs%|Ai~0`LrPwFS3W)6Pd5OfSGmw#%_kaoH`Zf0|gp^@|w(AL|O zpH5arn|E)4^1Wbt&au>cwDdW{>hPhql1*TL*Apnz_sKj6rUypn57^x7m5<0kBMcV{ zy)LFZAF|n=LUtS3k47N9C&@naFR&jU1vY>cWbevkBP^mI%+}XS#(N?A zL*42<_#pk&Dg9qt^@Us^`jZaQe+l}1Wj?V5QqfNm&@{hJVfF5227IqSWR`gz?QiW5 zLe|t8Rc~O#&|y{FY3k-4RCW?^**xY$zSYP%k_<@6*~Ag8!Yha85o>~kj%UeQ6_=O{ zu$7*g9`Gj<@HYfppzZlru3Z+eDsqimY++k;$N??P&g!5{6C1~#HAx0$w6iZ;$3aKD ziW*D)!z}9`+LGkOD7EZ z3rkwDIhX{~y$nRZm zRml+fkWBQapVKkb<0m zbqGt)YI^=wIJBFSY>-~*Tu4x3|Id*^C&e+@q;TgQ*Z_4@oR>J}>K*Km%Wg!vYb9Nd ztLfK>fKUEwrjK%p#C;5v2?KmEYG|0NJhV6U} zJGa#=CU(#?cZU#Bn5_|o>;&2kxwajaaTl_G(JhG2W-lR!Tf++>i2Ho>C+!?a+_To4 zi$U7D5J{TX!k)qmRDm(;;GY6nip}-^0GQVq{ncMS4W9T9c#PWS!(sj&$aF|~( zdiI`7kb=>(5n}nzolS*1GeDk4GWBqn{R6tL|1Qb`&NB?rZ;07^xY{ppJ)3WcW%Qp* z3w%Q?qv4Mv`G#0V^I0TO5LU*7l_dATT*e%98Ott2yA8Ze&kjWH*?jLhvuq=EW(H7D zX~;eI8@!jNpA&PxtK_sJ?_ImQ_~f!i?z!L3Wai|(Yj+P3UmkML-A5dVJSXPv*OB?0 znERVV7UZ6bB^E^bIWbqM?Tjw(UAsOBiCH#5Cs~5rvlo&SV|Yz^$QC%BkyD`*~XqWC~F)qpdPvvd;HIkW11g@-DA32;SxsWqGwi5_uQu_7x)#LLaKZSZCP; z0p?eJ%eW+MzSNyxy&t^B1LpS{3Ks-;lV3y9l1IDqYp0QvN4xX;k=9R?<@YD8pD4>8 zh%p)H0Gy}7oPACKEDs?rE|X*|f9M6ELnqBV!^$5{O}wu-^<*o5G-=22wSjuG4>3b{ z05Lr9WhjRQ9~c&VU|8^hVZjH61s@m|d|+7cfnmW1h7CT@=JRIZVNB2F^Jd{Wdr>Ji z@qyvfw;(y2Z<>Xd{YdBJd9(0!Z=mEP+u^l3+r$TkZ(>A^4-DV(Hq*viPmLj8{H;X7?^z&vB zpD^|EV0y$ajDFrMk|B(K-YgOjMn7*Banwq9sPTc3EOj*)jSr0ENcYswn?*vx=;zHM zVR@ZQKW`REf8H#T{=8Wvrv3tJ8Xp)bQFnvU_`pa<#nTG?yji4D-2+BHZx-n;jDFrM zQYDOj-YilrjDFrM(nE#?{k&PEm-wciH;dG$2awM5R)qM#h1Tk{TZv zxsln`_`t}mtR6m?J_Ry7QiM7zcm^W69lZ?%rL0YnKIcgzdZ^e8K9BjZY_@@dv)BfJ zCxqB;izzMI>syeyB=h}+-N!;Fd_Tti<-YJ3jDO4h;ft`rTkeE=Kx26*dckut^D$H*#EJvJS;8pk<81RKp#@Of&KM9G0Nd(4<>b9d@*>}Skw=IWn{kEE$ z3uwnG=!TCR^am5s?t!FZPwqr?n~22Nv+`P) zfD>ac-Va3?EMgn=U_o$V>=pI}{gztnHPZSmwb&c9tHFt}P3-(7A-ts)d!JS`I5GC& zK=fY?PKD>$lWm+gYXhEw$JeZy|28Rag?+Oe)5=)M9V0Q|=jzcSb!vH8?T8?FP^SPKdxnosKJTxi&>2NEw%U>s%UUx{AQ-1!HMzp%Rp;zVtm83pfxx#{wkke(cr}R z7J}WXSfW=C1Qix=VpxL{6SSqfUBF>zZ~`2dL!o@kCv^rtSQ)4rma)F)*FTAX*U!9I zOkT&5;tx1~@IvT}4q*`@{`Fo6VHY}t6hfG)eod?-6#wj>;N4Rl9d>jx71MYeIb{de?x0t7lUv<#{QysgbYT` zM2rW;Be{lhoMsFc#iK}vESq0{Djv64ZtV93N3KKkOw+ii)}zB*`W^j6|(UjvvJe#Zf3@b!2w0cR*a zbNIMvHUW@{n|zZXh?6c)toQMyQ$dI&?)T|_MKEOIufk|BWa1%7P`}-lc*M65dDLLY z#AD)DDfT<);fY&(574x{-Ij>>xfT*IWFqS48wa|&5=DMKV4}g0iDEx9rooVj^tam* zWquA<`t7zvdtvn3ZHbP44qh4zndl-R`t7zvh5ut@OM@X3m3|hJe!DHvQyBerTcXC# zGSgtlM6ECy44D|<=i56P44D|@XEACpWTHVB4Tek%7Hj(LwnURK`t7#FFv*VwLncN@ zh<>{*G1||{*I>xRSYb36GBHln^xJKT@xti0+Y%FmS%+`ephYBZ^Mz5Oanjc$p0;bS znASD-jIC?#I%+*<>*6ICGVy}VX0G3EOT28$xGZnCC0-RqgCP@d*eq-Pc3WbzF#7Gb z#5=;&Ci!+-;-I(N5+B(Cl-7_W-)>86vsv7!x7!lih1YMlB|aB3`t7#Fm%>ac#@lU) zf7r7TOTXQg_||5V-IjRX$I>(1=_TLAU^Eyq z@v<-)44HUc7!8I@Z1J)5^xJKTccicAx7!jQ2&3O_OME1Ze!DI4iNw)ww{* z@tJff4Tem7?&IQGgCP@NN{9wSCU#03{dQa8dkN8C$i!|5(QmgUT${s;216#YZQTS3 zhD_wztB^SjhD?NP&UhLOnFtG`!H|gpn;vK|WFjtgs^4x)By4tF4Tem#kvJL*nJ5)T zgCP^`gwbHgL?8k3!~p|OQgTumgp;WufdRsI$?e;`-H7~pfHvyWues*G>9B}NKYs>=9wTVjlG<*JNtw7Bsaw1% zWnu>xW%fB&oU)W6>hmIn~jE?IL+RPDP@H!tnE8ET#R_TuAE92X3 zi7R!_@|E%Jw!}5Ut?-q7%aZ@IaF_eaRxs>3Ne?FhHs`mJ=DXmF21Aw{bt2l8fFVmJ zvSaAC+e%tU>$lrVCX?20x0M`ATEE>^avW*>c3a6*()#VTlIf)N+ifK?N$a=UN=_iH z-)<{8@l+(M!H^|$I6*YG=i6;1skhtO^X;~h)Z1)UO)`t3G4kGEm)nZxFd z^#_auMDWp%-wt*39O6 zZHa)t1I)(d?Y2aw%w4i1O1MI6Fk~Xz&v9RaArrYWd1^3ZB2Oky9*@LeC*X`i%gFb) z>2W={umFL=0t5;R5GX7_ps)ae!Wsx<^X;}a!{$NX=Gw8%3}(gV+ih*m-yk+$#HTDf zSps?TF%ZE>?GDBw5U9-s1l|Rl?>*H56k@At9^H`@Y92=^%jVl{Z7xkhDd2R(ryNH0 z^5R$>1qjsU@`;cX@$I%YD<6b~A_9Thtl9?BvZ>PM3dTWxufGichXn`}79dbqfIwjZ z0)+(#6xKi>n{T(Zd2|}|Z9dr6W+QKLG!UrG=5ImELch)1vRsq5+uFQKKQs`i&4t@!r zD^)ZowQVJ74N7fWO;W&|v|kh6R)w z7Eo&V7?vT26YQ)7lo}RLYFI$2VF9Iv1(X^VP-<9%Qf)pllN`JiHsf(5JU6M-8Z52_ zl$x~V07Jjsmdubd3;lLmGE;F9)1cI(t2l{iP--$;aT3#@)MQZo9?NnKN==5;3NRX! znvBSnQG-&Gg~Di1YBHuc-)m56GO162iivGXmZ?i&K!Z|~9TZn4`t7!4Cv`1CW?6+! za^&CPevySmXL7W{^;Z$!ZcC0WCD|LLlN={x9m(-SD4jrZ;vA9$r6!NQ7^D?sJ^Tt= zdGf&;LPfCf0}hjraGGij&yywq+%}{VO!Ef?dpeyw9j1FI9ZzwDr%12T6sKv2=0j@p zv7zK-)|=fQtN!Gp>mb#j)Z}A)%1gRH@(J-zK&i>6R#7Z(wJ^-)>93 zuo$`3pw#3>#x1q%DQqv_J1A`pN=^Q7ENB6xCU=w6pw#4^B@_!NHMy5^4N6V^#I*F= zZONa-rhrnDskhsBOckUO4ai10kNZDw%RC)Y{XAK~`KR>ED9E=fwWA2{C2NGyZ?`3DO(P$~_;rd7YEWu&fb<3Zc3ZMR zjA>A6GX3qgd4XZ3?o+oFr&EPxfv2jU~`hPD~Z#3t@UXgyrd#;4NM-J_N>5Za3PARopaW8uem#5TA2n4wX*+25g6 zl{P3s0&${%=mBREK65yg=ljd1UI-@qDCdOm5F9P4@O!9HU-%@HfE^|r+8q4Aa)S_90HRSvk#usRSp6Ub!8+*Wo{Ep8K> zW?uXo;{{0z#6IcFlbWoJ>|?35$7 zWlJcZB}7s8D)PYeT^JcmYvV~TkG%vzp@LsC|Kt_OZ^L3RO_7u^yeb#KjQq3X~~h< z24{H!^d*#Ubb?IxQqr58XQ^}97{uL*T3!vU0v^^-ASb9Uqyxd&<&1PWYs|ifX*_u% zq|)?Ofyk4OYe=yX>U9W9DDQQAz{Yq4!4gc{M=?v!+zvtFxm46j7|xTAY0$?BAVd*nim zrIF6%es#oFMt>V_sc|~`UX+bGlC3T?NP#q35>cxa^(zU!7Ze`6a_aO@$B1~&qX9l zCaJ|!N@0n;UY)^A;)hev_|%y!2HZKjcm?Y$(vH)fWwqoP&^b;|mhDouu#mHvDM*it z$=Xky!<0*%TAawJbL&8tJN&^>^+zUE<+Nj6oKLzI+YPmXEv;TQBez-F;9QL6Qec?MHvBL|Ih(8?1XGZu` zNCM$ua5FRfC?rm}1e$L6a?n}fyOFKzFc(ZY;kQBOTJaaILcY{}{$G)T%ilCn_xn!+ zZMjmi56Gs(u_|&#Ai+_bP3&%EKv?N#CCPWw&q}i3y6I;nIcr;$&$0}=C{~Ah5>dLJ zLY6(O`zZj`>X7cUQo>mfb`|yRfJAmx9CxaYXW@5~Sk<#;TB=f$b6Y9Aqi2K|@ViS& z)fn)*t2#JQ4M>-!P`DISu0R2)!(H*JS3CH^-5~^|d+^sjL5q(k&xF52MX`$eC^cNu z!={2BA#^p|7%AG-GgD;G>ba)^`gV$FaELg*6v>{;TDweS>X}rsm!&0pd0Mh7MX|># zY;CJt-U(=1_3BDEh~>nBS07Ply<`z#ddl1Cg&v8u1S>s2j2H-S(kmd{slx z%XK5Jl15zn9S6NaSsL1e=Jj|7-3bC_(&{^##j%~VnvOsg>2~Izw=}Bl?BTr^O@(v^ zb!rG_P+ySjSu=YEn%%Bxuu>x}?R%CfN|;}HQme&l^%88dSXN81=(1kzr&V1>PLnAQWL-?OS8na72xs&A#?(mgD>i?mBs zoxDt4)auejDVHuzxpZ-wOBbiPbV-^^m!-LMd74Wr(_Q*gnoF7nh7`9ymby`nfIW!V zA{HP1)S5HkWB=T-qQN$?5y}JRB4{Ad-fF!>>x1$E7F51`b474lyGF9s0{Nto{^giZ z(7~<LAs#>|MudGuIE^ZFH|(f~y0fjF*o-Tp|tO zlewNAjCzWm(XoelMz0DsiqQ?DJfpt$no1eHHr=SF2cw>%XY}Tj(W`^Q#OT^e&uIR^ zM(<8H>gfTy*uf~SN0zq0pkym_n6`s#sj4CT?$HoDAL;J3n)(>^x1g?&rl?QpbO?1d z#5#Pu(f+|Jub0!k*krs#0g}LlAgp3XpMDppm3<+Qc7<`jSq3CS7jr!W0at7%~U(z+nSu4$MtI~tC?A&$wb!Gk9n`3X{f zbe3hswRPPO7_rn~acZv7LaEE2S~Ina=hR?v>U1Qcof<4otp~52(iXk~ubpZVr`oka zm!hE9lPl$Nq4PLK&_c{-%q7GO44nD9i8qdNp~su`s3$d>ed!s0k6{? z6J(>Yk+Z?;51H;9xTrcwx*LoFO53D+L{~4roh03{u%pxMBH{7SqEt8FH5Ln_TrnI>`)mStcIEYxE;7M6MULE$i!hGn(*53oZqnHI>3 zuR|$T)u&(`6BS)`#PDAs`NAZy773^#HKGhF49h>VkpGR!#^b_}< z31DknAOX@M2Y+tltOfR*`2~m~ZMCj|-j0(Vy~}8|4j_}e!5j4Ganhr&McVy&sS2KF zG@sKq>CxkJ*-_fIgKxGO_Sl2>r(B?iS>=AKsk;fLC*`o7^2W7)Y8`o0Z>y=l(PSn^ z8%-GsT>D=}(;7X}C^5t6ah$zp$-dtkeeY$l<4>&_S&6)0DKRU^rNjyFRhR3D(!O2< z-|%~54GRhRdmYJE$=8!k4RR?rP`;j|>3xV`HGFqajNei*{+Jd+)4i}-w3?naG0uj^ zo#7G+z_rt60GV3&wVuJbX1=)*no>;o!~h*0;|*0|9V@_SX4uDd*$ z)h8kG{+F_RG{2JkQmjK&NWxzMUypTfD9D<%vD|BloAe(=`p;@l`JEN3sf!7C0|B3U zS@5P(Ys}#$*zIm|H_&)2?w2lT)Gm&hVDzdzy|G6Ql_1euewwFuywPj%^eWQrS*Lq? zi;Uhmo?dmj-ttpDy+0bg+daLSbiL5Yp59eP?=4TSE?sZeLQn5jqxXxa*O0DPKikuL z$mo@!Vx-nz{8HDXkQsDpE@#mGXdd;8r(s~2Dg(zt^73N~+QPrU z>&`V@rusi%ao^;Y>%_LB)wF@Zv?e{(IAt{zrztfas5J3z)9wd%O;bv|ioM?34R?MK$QR6~U{)EgNF1o=z$@Z!D9coP|K)FqS7e;lZE zRZ6Ma_{qhkjbcYbmyzuWBX7S{`-!jbS#?*UI@Ig-G?dmZ6TSfz$Un8Fum&v*mG-*L zT6-0R(7&$_JNDNF_i-c&re1b_nh#(y>My%Ljf3h;o`?(ehD}Q!fFF1UC%#RB$G8ZU zJ9Hk*za{4XF6>OK95#zPk7BMG_yFD8BI>g-tqtW*V!Unh?EWLL<2S+0UywyTUA${^ zx;RRv3r+j2hKeq_mE=mEa4?6Jt5)AH>Uwt3^fWe`2^%mdpKM~4!l3f|k3*zUUqF5j zG)8?0Vhf2)Abw$-rZGmp5oP;(D6<_bk&-_fpV+imO|h=pk*QGmlTpFCwW-#~x$(U} z71e4w!^r1Bf2Wqa_BvC`s8c&@uT9fEhv3VrNQK{vUIKd;rlsTStzChMrnl1UjneXi z>}C0lJ@h4Gl;6Bw->ip#R0{8>r7**!z?|$d^1mRtB}Pt<{$=F%LVkTp&Sse^oIw@3 zaNdB*i$-O>lpjm+h>V=M=aixg-fGlXCMe>A{Er;k|JV_&{&TU8d^q|Gk^zTEph4&4 zqmrkp^~U&DsX^-_wtq~|Q{_Ut1e5Mi8K$PoQOaSMd4}Q)Q*-B$JJI8QB8QQBhQz!T zL&d<2CnJ@avb2q2$Z2fk`N{F>Yoy`YYmd=BHm&HU3*ral@C^jDHl(F22s~wgZ#R#Q znC)u*GBmydj<_@yf%n_s@7$9pDPBdPNs*aWpjdl;kHPSwYE5oYo^b^tGps5YJ)Wkiwr*F>1AF;$11p z$wu;2N^+%#kPGot=rvDxZ*5`5eiUU>mu~yd0$zc^&nd-ir zDW!7_d*1`|K!uqsoz%gEKavnHO;2$KD{96y-sw=oJ6 zuT2>&*CM0P$0$_J55xSoa_FrF_Cw2&=JIXYY5TWnr|sW~Vh^d#?_BElkm}s!4gt;M z>mOQA)pu)B&iMC8#GciBPo!TKE2?@vF9Pa>?pZaFZVbwr#!T{Pfh`4xF{s1J!`Y55 z)d%T6r98Ye?I8Wqw1f1^L{WQqSyroumuGn%u4+ACze31~Pr+){uk_%iELN2@@nhzO zzWy!UzwO4qo>g_|W2#Bozo;E9{RGaoV=Fm9J3FS%E6x+roIN4U*;%Pm{}WrCI!TjK zY$uC?HK`pN_+`25>E6j%9Nm_GYR!9NFu>sa>oPh2a$tItIFiC%ZRF!XxAp zFM9Ncl3acKCQa}QD2;x>C~;fcw9PPFAa#W{1~S*~6&$J!G<|7;8!^TWmSB0jqG`90 zPl9~1jwb7>%qs0b>M(DIw-mD`aIp2ln>m7I22X;cqn1Hlf`6kH;$tLw_W*{rTnJ8~ zi?mz?;t3LKLA;9EZ@B}+Pe`@pArLPNu&kq>0b%2{i}CfShI58NvRNeSmL2_x5bKvs z-U*^*FFt-62*QVi9vlQB2;#|l5XB%0hF~RCkBP7+thNk?WC)7bYPh}Hy^~)SJLgaA6OvI~QiuIXUa0I;s@yZ38q$@fv+Q2?xZPnCJ#jt)&9oK5#8H zAXcLETN*$_kP#Ri0i&~eYNOj|bXv}l@O;!okpBXeQOiJdW>L-u(J~Um2_ROD0x=mx zE*jwgMr^qnoEi(_1`szlBV+6PX}cIY<*zHt=01d0jRW7%zrPL^MTngzprJs zW~HyiunODQx{7gRop-Lu1&@4oiVZyLRBnx4QKu8)+F*2h<1JGi{nF4@7Y6@e7`pK9 z$v^U+CclWeo$y>49$hh2v0pm2OWivMlMHz3cg#Mh9_8V?D7T6c$ma>AgrT7tOGHe z#Qh*{2f@FFT_*Fznz!cHLt`@fMcrgbCU6Nfp_lfv6wO6d=1gdSA74TKJ7|ph7{uYn zfOrc;<*^`M0P!w~M?pOLJNU|oEkA-=a2$x=K&+YqBC8*eKvUtvwg#O5`mp>ZkU~ol zLJOvWXb0jr5XWG-DZ!aWt))9cevc3gakc+xOQ<=xC0t_~BBD09y|vl)#_U3-emzQH z6HOnhAive9%rq)$RL%!1g)qW)L#vhO0!ioTkhBGH0f=J`j@wd$kf#ySQV-%s5Gdh( z?Vwqs{n)@_&dZqwZq!J~yUs`_PKD%rN~VMOiNr(@#qewZBet9c?s0G}=YyDeJcuhm z{ENi(AahIDRc8AEIK8{tObn4b<{2 zh$j)$@=p*ICxQr|MyG=~mb=c9fsJA-Pd<^A=W@P)M0TE=p(H!cy(GBvjGu%)U2dYR zLI>AI1{g`mGqN$K>tJJ~Kca|{DI{p*JQ^9DZe;u>xIGXtT8iM?Z3wrbV{~<{$0)B;Rqgs;K9`<^j>(%z2AIjH2pk4=a_@oy-;Vs z63A~g9=!tPH${$@^>!@{U{I9sr%d=)2>&S+Pc}%RHO{|sIW|g7$wAsa?G&LZFwz}h zr;iDzok0@L^#9$?pVRCdcL+NVq}e(DKejXGpGNOdtz+Z21|>24bRhOo{*_-ci+qb} zh-#77q(ZwEYt)G;THMpkr8?Xf|h?%Imir%)Q17&NPGHH_V|Y zm)~+=i02mOoPh<78Sdxw8Ez30Xc%s?iykO{m4_o|&!OvF$(+qGq0HGg2juKL6T+P3 zA`Xj6E-_5bR-5quC}$0u&2Tx_B)o$O&q2ZuBVp;PUmA_5(NNKxYoH`u^&2QjFAL2v zy^PTY|Ip07rq^n<09J6UdhZ~~8uOS5DgC#Qy=K+aD-~jmnPJ-Zur%2a z({zqWlZ`UvKDSjiwq}U-K{q{A^f_k9m$3BTS}3>t3BB|VR!&3XaIKGps{FMbj^L9K z{5pc=NV3IfT<&0ED9QZ|@ujudr$S>}eCBmKs9_+oq$lr!lLnXuL3qF&H+cn2ph$ z%VDEaTI;)3Y)I>CsxtBpP`XdsW~*%aW19ZUMjuUX^kP$v)F15?>Wg5SUK*y0kb_S7 z2=V8j1Hulu2Mj!Z{$i^PJ*DH&xA-^MFAktZ?0Fdj(B(dDG6R*cRLlyPI#srR&0lB|K~E!-*Vp^1&wzhzW^GeUI%eE zhye_3`4rrCa4kDQ;FqSXhD|1NPv!!D$Bsnk9)!+7=;*B`RJOm{4a5Cyd#LGp!=}W@ zxxcLwxjf4_c)yYB{jE9IcJ0<(Zd123jmwNhIsJBR?-m3F@7lvw&(hvC4N8mg%z-hy zE0Kd@9FZ1d_kl6I`;miU%uI_BLt!$X#;b?C9eUHnX-XpwRPt_A4l;YIiLrILWlfV9 z*mrfenl_|aI{!dR@1~OLX4)vr@~;0tY4D&lr8K9X^Q@q)7nrk%-EiXX#twVUg+}h2 zgY&A<%rlNQcFZxYyXn5P;ErDKub$neIi}CGMeG3*EK7{0g+|^B@}pYiqyJ!rf7xn2 zX-01{O=YH+vK!s6V;s~M*BscD(C4Km)_c2)rb=U?35mX962+Rash^RzAnTurT&Bd) zxn@5s&U~59Og5X~iLf;KLBojJPi8b{NYl}#&vHnt8zW`sb0%3$USFpCNKd}aYWmFR z&qw4%B0tJrwh7tL7&YAajQ-lFaNryrX=;?#eZ*cgNM$T(+OLt#KEIdC z6%Up8XIs0b)^x!M1FtQ=S3G3A6z;Rgl5K?X`q_Xa{UCQS`^lcV5Z8`Bh`AXH zaUF7QF3j&1jMC|tbo!qV6Mh;}=z2QOEP1%7SXOBIM)z79aYo2?>FkoV&7gbkrB|C#%owfU=Fy!uN{!U5k5AwrYs}m zk#u(yINFha<>j38;lX#~toP%l zXc|O{SHJ)&U_lTO)CedR#D=I>L{!Aa6$|#p^f%2e%{w-4Q2oE+*ee6%UJ^sxu48QQtUYV_@+)%4OX9(|G1S3&8U zO=z>~t3<(HAufH@MEdF*;L=x>T2O-1S4~|dkR^Q;2Pa8ibs)gLB3sd=nnm}O?4NZ{ zInttgs_#vw*=k|@sko{Y+lD~8vUQQ*vx$qXi^bM;z{S?bPPcWb>$qd)siu zrk2q$oLW+9ovCGX3?H9=33$)f6#sM=j*f`m!MS5h3}1cdiYcyVCF>P_De?0$Zv%hE zz$U|BbF_OIh{HztoI&$TOg;0z^i6Q$t ze8)9%mT3&SPM5Qji_KvTL|L$hL~|f1L6?&V6Z9@vFb37?L6Hfue6A!NfU0C*XIT$tpIQA+asP_oIxZ-L8& z$sZt)3zG=CTrN!d0Wga1(nb}-+Mys;7Rw$7rxUtzA}SY1r9NlD3{H}BahAnLUyf?J zHK1Fgg~02@jxqH5!@ArmGm1XbMxJ>VU4Q1sJgke(qwm#&Fm$R>{9M%djvt|nw_wl3 z<;n>U!JZr`7cVxP9AV8_n->HH_K4m7d*=;_G$T zaD(=w5}_`cWeHKoVf=~%w!-w=)+q9?{%`W0I~#E@ zbyr=CApRIt|F{XjK>+0|0UQIcp8y|~oVyC86&MCnNlcn1H|wfO0wjKz0OkA!pm^q3 zWglml(O{yD*jH7)t;;jILV3|S8nY2xvMuO^%ZYFpX2sa!LEt?8InYI0X>G@`&N32X za~UaK4SYQAna9|C6YEQ&*v@)wt~tfG0K?sNugwQ*?g7?Q-pY!#`3#144RCogE7pDk z_(b5P@{FEsbA{n~UZFgr=hOK1t9r{@T7Kbw3H0R~;gn&cFx|_OFx{mhaw~9oT14T~ zfE#`PJ5G6oH?R4(b_^DgN}_y?U(pDd4aq}~Snp}cy0F!8UsM5+2~fXhDP z&I)CAva;GRbL=sr(bIgw?*|acKBLL)0JzVf+M;cmMeT{Oi`4tqg%BZI)u%MUK2EG> z*^fK&&ZijeTV^=&b^s`PtFb)SLKCs#!R-LGlfMzLcmPYV|-9_=AbBG}xf2t*FuIp~J_boq~PkSe1fgpk+j2C}&0E`o&w z2e~nh4`IxiRi5#%-Feje3LX1q-MR{t%9Uo7yy`g%9U|kn%ENK|4p9t^3Gz;;zYZA2 z@dOXY@oHdd98dIc9KTLn#_>cC$8noGopC(b^9+=`SM6G;#&NaA_be=wXKkl=_)MdF z)xL$jyZ!=Wr+U)RhU>tu#`!dn|1k0Hh%9ru@Z0M#?hWi;o*IXWt68y7D%zr=@9((4JaUV0aj)95kQzD~#Wk9eZCj`*XCcfM>2fE`Xqbdq4;QDq*IW!J z=N*G9(0}|h>k20zMkJtKb8%r9kCsY6z2;&-eM=MpwO6tzw%7;^0kzk~fZ75~1=L;_ z1FF+qPC&ixVnFQxt`>$jVzUBg_s)VT+-wW+F*jWwLudaKfjt&p3B&jXQ) zErmY<98cOnS=aHXImA#s=;E_wUs2qiiAr3l2*r&q63HZaP};%I^9}k~6E$4|szK=* zn&ari2b{GC_Cl@_Aq&E8 zUG9ujI$4d>uH3?1?S}I)%v5ju=~8|$>z3ihh8n3?yE#&)ph+@PuXb~!9wUljagDs` z(E5IgAjXlp4VW6K*NAt%BQ8__wQi2o?9I+dT_*2AG>p{c8plYLsr)*@9|V2L#7pqx z^!1X+^K;ta&FZ-FZm_Gd^>~yk6}(TJ|HWw>@6~fW6~&?8pM=AxR+=&Q$)9(!qhm)D zhl0afK+-o?bJQvZ;{$N0ZNc*rdp$wbcabJ?W@IFl(8Kp7A-W7iYWOOgOh)lY&BZZ! z4>;iG)5hcrXC9L^^<%PHi{O~tsYGB2H;NYOa%W7|ub##C=z!&%VPXifb7j##ZO%Yn zeyd3tkZm;SnFI1e-4Ud`_-~YdyGVEXjaPq{X>$0W=$N*;QC#%63tlzTJmcXq=N-it zT&g#)-cLiRtoLcMfm{R6$}Ey58%W=SKrxG?%LcND7-o@l*+6awre=|J*(4n!F0)96 zY#=8+20dT>R@j}y;v+ufm@K zZWN!bxvC(&2RP(%Z1V!IQRK)|;U|khc`(5+uBewgQsjP8FIV9$AEn&q_4L3Hy+`Eg zi4Y;W0H)(Q2mi_L@k>q0z2aqmnP>H_Ea>v?QVD%7F*a|3yk7r)0FQx zw3?z<)O3vZ7j-$?)}_8&EqQ~?>56F~T%tZlG6W>@mQhEeN2jLfp4RU1sB_-lo$3aH zKeH~b2Ei$j+*;PdQSgOCa%))+)3*XeB)5_Eu$&koxs9xc`+=!QZX?r8@?%aUx0Utq zPT*?i+WxflutURon82mhNJn*(PFS5?M(<{afpm6fp?Vu=`>xS$X(4UJbBm}@Q+rX=w5#CK$8l72Izw;y zXmgR9PPzpIy+;P2p~y{Fz6Km4sQ~fy`wR>UY?k}EncsNe6Tsx{vtnu18sO!%ATvOw z!h5{5uj!M(Wyh=VbAcOuw_j37!3HKN`RhzBd6i<6n^^?LfNIb;nuwQRM)7C5oealn zkgJ&Ck(NxrXFel5u9Q)yLdveRp{kJyttJvXTa{! za$r?)PhCzE4>Xh)E!Us5~sT+M|GEiYw4@-%4N7kPsZ-^o~-k4}?J<--EqVT0ksg^YM!V=|;;zaE?F59CN(P_)}>@zRh2kMvY zh!(-Fnx*xyYdh(3&MhnJ%hlXcoOP+{ck2D*jC!Y^S?@-zS8kOuBHC+7RR3eW8l$K{ zm;Y_o;I*1y;Kj9r2YTF)jFFdbjR)+cDmacSAO4wjk6wm(NhYy;Nkw(eKY@?Oxop0q zqxzF5Cb904l4|Tzz%Yq*m$X#R0aKG$cgZdl+3rkY=UUv!tpcCN`1uG>wy=_okfMaaUNM%*--CZb%Q?FEfD=LkbWvwM6<8O zX7RnDzVB%dVIr5m^JY3D<5H{P`cJ{XK!DNr`x@125F~%|!J$UU5>eA(2XL8t6i&59 zah&F2^xqGTsOVp*9x~-q(6Zw`Uz73?jxQ9cJT}@e>&Q~b=JF~6t;BU58)Fo|saY9O zXQ7GEa#|$US`5CZ+wXWDRW1wjhw9Bk@xQeY22&p;M5ZaH;S8qH_2oL2r_5}K<-5+P zx$J+^9CS1fnx%y_EVj=>lq|Nk(c_9VblqzzPBq~zF4YHS-M~3coW3S;IuX4far&CX zX$lSu8K-+CP6rc1obHu4HFi32x>q`|J8{`IzAkY(6SzJm(sAkBKX^;y+pof^1nK(( ze*pAqv3*ydL z3%M%7|B?oMj4Bo33jdR&*O{@@Nze|?vtP%KM}Inbb@tXT8lTN`2IJSUJPDeJ zZkNIMbu3SU+%KrXcsQ0f^Cl9*U_2bllb|EO)S_`XmPen1cRPden^-Oy9|Bi{@w-@z zVoc)BqVZpiJB!81EM48e6|;TzYvS zRO4MG`8A9y=Q;x~J!;@7IO!!2^}TSm;&2v?$H1Y6R0kO-13;yQl)|ajDBi5~aG>l5 zhtmakGvV|_<0DPVMI#yRC#gE6RU6g+amnbYE#s0gLNT5ewQWy}9*RZOHY^wgS_GrE zM(gGugObk0#Hc&t6FRx0cyO60F9XgVD#ytMp5A?Y8y#aw}GbbcC9W|tNZi{ z)Gk5oPSlRPNt59~UDL4_o57^N&jC-L){FXC5lduFGH zhn=VTv-nXhf=+)>i4dndCMc(?13j5|jiT|I<$rMfg!y62%-zpTXG)b3`elO&yPKf! zTxKP;-DOVUy`u-D<)Tq2dXc56NfRq zwm_VGHzYs^cboaq)+sxV$rl@#+cc1i_5}E~K=m`8+*5Mz!0OZ2WIEHpz%vj`?Xwzr zvI@E5=lQe?7ibKA^!pg8Ezp z4@`_{{QP{jd}NA!r)m^a9q^o+%Z9#X6i|*mQgy^;mdI)y{ z7s){%a)zl|nW-(?2Gce~5&Onvd zszh=1n{U9;<%OiBw*yS59cV=cLdMiTUV)LVVknSr2q{CSe*P&+=gJeIe70YCR`uK- zM#+q4K+lI}8fxSN4aOy1F)SZJC2zZ`U=WRHIFy~U6@%w9xvk4rcLTh?D_=l0rrmY` zVwaGUXFy7!6CBHUnOda+Kh~AZ(&^aWcG-GN7dMx!7 zDLt2^lH+FD88bn0``_E((JfY?2y=Rpv+GCy*Pjj3&5T~4gLYH*yT(%kU| z{-$Mb!iDfO!h9P@N9AKX5f6Xx1)qiiZ&d#ay%>3yulJ~-$Dv_VkKBzB`6%DNQOr|z z)uFBHO};IoqJG9C%pxfljz@vls+QkN@EbRr`uBYVW1psD){;Sf*uub46b0@?8JJjr z&%&Xk`q*2z62h4EQVEI0>1Qj1i;ybCk|Jes5uMeQ9ir$Ei8*?8z19$JZg*UYeme|A(*1l zPsA`q`$SerYgiQ^wK2754eH~(L~dd|36*pnrv#)-D7_ZHs4`{uO`ty+^AKr878#6b zF_^8gucvvtoto*!w9)I)x)FS;j%TIPI%8@bnw)--48I>8TG41s^?ZpiDv*J|=NyzB zG7#iz#%dsZf#H_=hups4GXW~hrd556a9BAW2Jl{sa{kmk`(c%7vb2h&v`>9&g&vr0 zOdW%8&+adw$X%&?WKPWzHFMC~ncqDKTlS7*3 z2Y6;-g>cWOK+o(1fD3vM{3#aTLIHsq?j>-s;du~J+*b?Owgtdz7}HR~)HN}d=SKv- z`yp0)tru8hdcOyUrx)3t6=AcX&C_!tg`I#3Pv0vE&V^!6Sq(uLZ+M1X%is1;;TezN z1#=+TGXwLV;YoqpV%`&b9bU)e@OXd9mSe!Vs3{M{z5ZinY*(YL4 zVr6szXuF{+XdkHqp|2P%uzx5AX!u?ye3YLGcli#1#y<8Ot@d3+_@|*Z1Q_*A$#7CJzls9;lrZ~Ok-;!eqR8XVqDs^3Np^pG^n>k^ny}&d6|#JJ?P%U?f*om| zrz#C#XL>EpYthm1Gg0Y}Gg%uy3EuN3m{L9tl>UH8()g=ki$Bq1C&V{_tNbCPjt0CI zheG~j*@VOojt87#{zRIeQR#1L(p&Lqm;n5#W+BQw!(eAzTZ;EuH=-R0)S961JBhzQ zs`sHSzU#xl0|Y$_5S(SAzhU7nBXJA=uQd~wVqaJbo>Jgu;yMU$B~C{pJc-Yu#4aKC)cI22zvRjc5F5UBkdjPF7%t(` zaS-8gp(rfYdD>v$gy+6XU5|r2eAQkM*aYW=*WZI)lETT@)AAKk-o0Bu z9_Kqk)-5zI=;OzN!w=D$AzuqzK!qPE2OReCyX)btHPUo`YCXK|NtEaMhLr(+f->`b z|3ajN|2YD1zK>5~hqn_h@clr&JJ{!?zIQ(bypwR5@6tHXKSy|k4?%8(cdZ3|g^!;R z4DTjf?Q6;wzVrZ^Qey<}fy2BO+hw0X?MJCUcYx`>U#DRWJ;CrZe891usz4fM0{)Y5 z&^LkQe-RG*7D7zwNx~7|2FOW0ML5?#9D-Bvg%lupew_Uqsiq+L{^_tW)g?%Q{}fp~ zf|UCAk}O7$GXF<#NvcZA|E0#sbXw!j!#GL}3Uays z8`d=8>siJ;|II{FWCpJFzeQ=7I#ILO-7 zV|&`m1>`z^b0QrC+33$_6Y>Pv?C;8&j)H9Uk7i9LnZ~#KThg&z#I{|2W|TDjGKXn9|2%^7z1fnG6p;k1Gk%T#k0SL9UeQ2OQG)vz;<&E0+ihd za(gy!DW(SPcjFLEY2(pL_WJ_1B=3hAEWM22M{NNbv0P|bD24@$ShBN5@K__3DrIfG zAJlHcj^Mwb{We!?-%dEj{^SeM9@`ET6B`&kouE4X*&vObL2&n#sI&==NPoqTYZ4i+ z>3h_8J)0!2F&r)5QZzXIb;3d4>rkKmCgp~GYoIQDAID!t@~lcD{bNdr_^wAm`ll1{ z+targp_Be^y0O6bABs6ZxSww!#e7MxmiqWoNBW`G;4MQirN2WcG;7KwM*4f>K$i9= zWqiop3%ZFJFoK?p?!_QVtO8;rW@5OThUZO`Wc19#uO|&2$e23{U^>A_h6_16QB;F( zqvBNuF!{?d{xcHIshCbI|D*SzGRd64xyA5Y0jU{R+y(}lU_r)#-vRp;T#w=}I)O&5 zaT#BY1RV77b@7aE3((xKZ_9;%f8@*)@i9eh#!qZwu5VjB;6M49<~*NhK1p5qhUX>} zWn3A9-vB|+=hVG08K6xtKV!*az%nakEaj|Z_{OnuH_(liuYj$pBT1a^$*%$5Lmffi zie~|D{RnW_H|aRwT|WYj_yR`&?~Q}*T;KY)0l(W8a2`Fnb}c9p1DGzcHGx>u$fPV4 z`Cf~)P3OY^eyThyKd%#dhd=BL^bLIsN)X{Iq4K-g;i7uQCGN+EN}U=SqiV8RdQk zo`wy-aH|T-$f9tsRVFex0eGzkP!fsHLda+4yZ#9zop3O-yX!N`>V@#k?BU`L!SLVw z36Ne=K~qcy@N zF!P_HFzDxJ4>PyBCUSG+=i3LFJH)OC&i`O{=Dn^>6is+*W|HRw9O!@M2r802qp??2 zUd(LjnF9fq|1P#A&BKNT{g>i5GsDvZRAGNUMK_mIxQM?6$<(uhxqeP5nJqn>Q}X;t zBx@~X`Tm;uK-zllL^})oeBU6my@zfp^*=_k&Vmf|AASHxR}Xzw=D&zW=L<5zf9@4P zdU=My&4ev1KJRXYEs*ND7u>4n)|2W*w{q_jh~&(d-JDc{{!iJB|8jG>4EsB4LgDFck{cc{hDv3 z;RoDwx5w42)ZYVUW_~I7K>wd;b>=}4Q|AAp7RX^iMr2HxU}S#h9t*Atf6dLP_}}f)Mm`W*QqjpkrpnKc{%epw+r33(ultU zp_lo9i*I7LAiU9)`J8JNu91|(cIi-W_6NvzyJ{pJ`RSa@mt6Fo9!{^i<^u`Kc+dQo zAQAteDIj}8kX--s81I?y$~!B0{{A+Q_hqc)`zNy5p9s>^|1@j%3sT_UcMFiugs0U1 zG7UW-HD!J-q?upHkQ(8)bATLlaobtpKh_DzVX3M1^Si{E-wIES|F*V3j!Dfte---u0D^8VL>v7{*+7~Ivf0l)aAwF& z3%2^JC?Hk(bi03Odm!m<4&7b;4b+n?~nSwAXyJVe$D=jNN+(5GkXga6$oaT*%C2@f(6a&3$~%I zznB*`v(LpAIdgzu5i{Fnk6j>Gu9-cO+RDT&d1m&gk-#oe5pQPm5+ie%UrP-J z1S>VO2eHkg#Qrif`)Xoi1S>bQ&mlHJ#kiR>`?4uU<|M%?%*KF!Is4bOE zXR{exAj(?4g}`c7(*rafGf>vDik8k&XhK=bc4$Yl*$Ry>GXj+2wP?K8nugy5wL9S| zhMfvb@>-m7@jf{m?zN6#S+UQ7p4_bea&q#03&O0UyD){~g8uS(M%M9109vx|$U1Rf z23nkanUVFU%qbaFMwV%E;)y`k3jE*7let~y)5J$0-$=9}+DuGFGhIgf{g9oxQyzQv zTHFH0@8n$J_3##5I^jrWtgKyXBVY?`_@Ar=mEXg8-|`2z#>UIy8T3EO2|XZ-Cl5d@ z$njb|(Mr1uS`dl+V?9ceYcNMg=3{yXj9qqQA=g(cnQ4$BwS@(b{Bdf*T>lH#eVbjWFI^|4W;%) zm{xLgcI*NySCu(CRfuvhTCf_VIk%7EnSAm`a&P7jj?2K{|#U@sX9 zVVR$E`iiiKe>&Y%EO!@j{R5T*8DN$|O`iWr)(kPn1IhQNQ_scbA|M6+uSYNwhOG)&ZBT#ABBDwI+b+(l9b#0xCsd~L+H!@7{O!~KR+b;zMtqVzRC8HCe^ zb+e%+N?m+U%+xt=yZ;MHuSK%>XL3;Tu{#%VW_~>%X9G}VpdjeU>NE}iCti)k)kx$4 zkeRq0&UGakfZd6E0DBVKW6_NjebbHWyCME#fGZUaqFgNR+9e`!jWxc0n0iM@neLy=b-+YM7 z`jjmT`ZiF?=hPZjTc5AU8i7wJ&TCDQU)}+WZ~rl#8wi>op(LGfZp#!ijHMNaZ!N>> z@GWD~gjq(*G%2?H3sKopP3hqb?oC=YH*--IF=Dv^At+~`CiHOs;j4)jqne$V)>qK z0r)5{R3nCG2pNtIgPgM>LG!OKDX{OeC_72xaPSPZ<|%GYEdLjTk>3C`!R&mTMwzC` zTVlbWI$8b+6}cF}#;Jf2e=jw<%==JwcCP6$2O#qOm(M_9jLb0D=h1GjAeR4!$AQGk zni}-K*BpqY=bn@Bv}wzd7%}2UkqN3H?d*t|Xx>e+oZRu%UD+yS$VVfSgx>P!k~}2y zThPCYZA}&=1Fwj3R`!FvF+J)9`oR82?e93g5e{WVt( zR?zYEQM=p8+&;!E!T)WgE854%Uaj5Ls5U#tn3eT4onvID)}D_Wx$-#IxmTmI!zskG z!aMwlkaFd1LT7fkS4z3C80`kL4Yh9bVUV{OKO2u}*SZPA3U*`bLG=2|9-fGr$#70v z`6AiN9_q-0{jW-^@@B9tdpxA*csW`AC2i^0hwy9C#ypX}*F))fNRRZooDV?{gSUO$ z`7m#wSUw0sl;whVn2Eva8px?cSw2uKZ~c(?Tl&|W1r~ZXRR&%gNKcjSHCh)k{F*5$ zeq@+b&FZO|X{rFj<2ngJ^LbL?U61Qb&iQRB2|WYlMr%K*Y8BN%O;uY@Rja8+v&nur z)G+zP17-Q;$c3`}a(2>Y9%3ra#p;gd!yjgXi$km9cZ&cATwPEO$2^QEky|yzz}0}t zGFtC}W^+M|^vD5JP(D!Ds-k3J487R)i|ru0Du!1VZT~}-+8ADBwBXBX^JZNRIoHU8E9}>66$DQ%71}(0rEZyMRUNrJh8@`{54jXqiv)aM;UFE9D-LoV zX+aa@&#cQrWf%E=Tdw%b9NJ|P136c9PPx(f8}?`yVK389#BizOpILV?*w2B9T{QDK zaAuc!))IDecVVsg8|xa)+C7T3dp&D4!q2=@`m08>_EAcqm8r3)^-k$Pb11dmDP3s7 z;OVF}N6V?{R?UhM`7`S#qBUJMx`l$fXtY;aKU&6)S>A>FZE&+E%nQ4=i{OnAEd+fg ze`bZJ5K_9Gi@FzHM^Qc}gO^XIs`PX#NBI#_7~Lu8fF{8@DSyb_0XgSV4!*M7ol=he zjpRX+P!LFZa0h0-6JuOaC<1PjUli4?YlZa|gXoUa43&^tnU}dHo`60r|q(?_O$2wkWN9igw)3;iPI9uexeVngALrwcthTBt*Z$K#u7!oz6NZxATW+PXxw z7|k;C3Ybx)04aCv6Gl;MO>UQCeT7aT-?;b;4aK2=tTnsk_WP>xs+kbFR!j-x8M@sE5ozUEc&Qvrtc&Sr!BDDKk+onMd9PUM#aw zfy_Z2-Xd<8eFd9H46{<9@V)@-JkCr-YCbIMS{X5ne`|}K9yd#4HpAp@OHp?a9Np#v z$lV8ECV&e8lzgLE7Qrn>(K8xb59~#7qC;bjnKF!mXEH2+ z5WGGV9Cw~Hy1=Er+1uyWC?PTc8VMNh2!P`J3!>!oaMVx^!?k}6d{SJ4EF0x9^yeFB zai8T{_yw?#EtzG4(rdkrIPP&Nm%o-V&P3B)%wlh3v{t>*QhLMv9xzEG*-}ESC-8ne zfHzyka7%dy>nGroS-?4I{{g)8b@p~{3?+?vAD%i(&w30U6NP9fle)tsv%o0quWP3$ zE18CyZtF->heAc`i)m`5oba31fSrqbrCS#Fmm^Xo@Gs{B9`7baUKJ+e3Bu8d+o~yY zxZSY@m!_$1F8LkT?*=?g%BhH3M5Jm z_-N zjEx8s^BMP^HW=#tQT`EVyY&Ll^%DS{0o)3pKgk9T1@<3e2Z&VyOa2tVGyvTR%mr{A z0Q{BQsy((G-B|K`RF9Xu6OFvB&DaF8LCJbX&Vg^$#EYJn0f#SQAxk^P4BqE6ipFWW zr@_Rpf&YD^>~`y+hLO@_!WVWi$VVo16Lb_ru$=iGNG_z7{yA-+dzOpTK$r6LFypA;l6R9|_rne`81{ zEG!fq*TZvcG3NzLF(cq(zCEw#4+#CEq#yP_(i^RB=D2uNZMXN~NhjYxWF2)?Uu-jx$mxp=sabd&;lVNj2kQ%M*Mr_ddXV$gv07pRV5fS@4Eb2+o zM?`ewKR_w|h=@P$0A^sQ_(4=)0xp$#;;4)BK;(0Hr3NkB)m}NvE6$pN;=Z+uluxi_ zkiUyS(p$EL`EDA3H{kl*t7*PM=h1KT={LMY?98VKo4F`rDgmQt;8jZC?;x&$FuItI z=A=^esjf^Nh8!$XsinbUMjw*-myD=Y0=k2y&wE<+1wiUmn_Vcb3&s{>rCQVPLj%p@ zt_Y0oR)O*jXkNFW08SDZ0AR@%=xLG-oCfS?U;}3ZX!{iuJ*A~^npBG5j*_r0odNag z%BMHP>r;`=(=l(E17s2~7AvFIDleksoO2nHR;?h{NcS*BtHs%j0Ypy{2lkS+}C2YV%)mo>1_$YV%)m zMZN)8?+eIzO0F>bHIhbQ)IXelC(uc=@!y7}%=N#tX#(_c~Af-hw zqrxxOd?QfNzW^1o>j=oMV+G2Jy6XM!LU_atCbYvne_e!L%cIv8K-MZv!<_``PuoSL z$R?l@SATA)FsJQu<}~o0)b?+JeELXDC?rH~tb$uqNMK+zAYghyGkvU>%&r_Es|Io* zd^m#1abqSL_Mmvc*}wCVKK@}L?4~^YpllF6L?ipHXe#u)_{shT_`;NWd^GUhbzFEK zmTMr}U7_E^EP75i`#7vf?WCLTTm~6~{-di0swx#~_@>eH^TZHoV9oXQ4aCSF^pj?} zsxiwABTE`s%Jem!nk)v{S1SqI8nfIU6UE|OJ!_U`n&n_)mPq#~ma@i%b=EA**yThr zrmx9qQ7m~&8?~iWvkYj=vfbJFv48j7)QDw_W?9&n<>OsZ9*Z>Aa+zj%tTD^JXf1h- zwJg;vUo~cV=C&v;Mq`#b&C(PTW>oW=Z;xhaY}jL(<^0AhOTLX_*|oe;^Iy>{3mUWZ zi|&^L*EVALRI_Yt%(6Q=V0JZTIjUK{Y|Jt}+G86V8y0hoQkrs3qvj9S37aI6w>H+2 zrdj$oW(n_(YJN>)Egdw={KhO9r=nO6ENj&KewyXc#w?x>qF6RIHf*G3;TPGXy0TMB zR3xu#%yNllN$%Q+WmUH*ma@hyOEgPqW0vx0Ej5h?@;c3OWn-4tyGCiLXx#j*n&pwk zETbnxHGf}JSavi9?a?fsH)e51PfA-GvmDSYATmXgLSdwWK; zr69^<_(*549@UGo?e01tiab(Z&y0gc=NDRFO1@GK2c4=EnIutMmzs|$9$SMe<#2Ef zrtqHF8eA#IgKq-M=h<>AEz#$&Eik*SKzZ!9*y~&kpcjCA9$dH9lwOB2$Lv;(@>!%D z3*c4&gF9#{c?}E}=J9H5iaI#eRRKpp-9&BS6tVDW@YBL6V&RXJHdwP{4+l@@G`4oO zIz`nLaIO5Ab^L5ITRU51wfRoTnk};K1XfZVC980OM$}FelX%xVop6!eXXo!C&^1GJ zIRhcCURNeAw5e-`==wnGnjyLZ|ApOkQM!!IUvPUjQ)D^gutC-oEo-L8Dg`%vFjHhL zqO6A+$(l#Iu8__7R$URSx9dqQ>k2v3-JxY&A(sWmDQj0FSuTcKX zy0mju8;^-yZI39s)HmDa0V~?4W${WZ4#e1f@T%V!yuXo>M0VN{QF1_6G$^@BD>))c z9@9#WNaO#alA}>dW=1RdvyqYyxiwiMN(?;+8WUH-pw8yP;l9lU}NI<>I+3A((@yTs(CYSdmY!9TU)iS6~x^ zc2=zi(>HdWMeTJhXN6y+7TdGC9&%;|o*42l1DCD1P6fl@zM6pnGI(?pVsu`@iSLBi z=`2`t>+NjTTiJO+>>To=vQvG6@Ks=?^EhgL74DwLf&aoOQm z(UltGV6o8*P}%Nl^}fmIbG@#91)?Ybx{S{MW@y|Xq2cUZuC4dQ)qRvNZjjJu52M*< zH%Mq~0@iCI+PWEbnlg652s;=XbK; zsfB6^&>UxLi_AK+KskJ&ID9$`r^6SD!?yz~x>mFN28{1)#rh*7S)+*t{E0gy5kFzF%Z+GA{&!;h&rV?t4V4l_4zm3QG{@(De6xLYH?L z&T16cspBX{?5kq2oM!J4kbTt^A`|$qve)WMkZ%}yt$_qb3HTcHcYc!tXTPX)E|YFD zVGI7ux~WB~ANR{7G6#NSKkgS5?*l8Yf+e2`bC+Ln#>HMJx~@>T_hGo0UztaMox1|% z=ICyV@!uPu>oy0#Q2_l(H1Kv{xxWFp55NEd+W;&g@Em}93D8$Z3HV|ExZg2mjU?nv zgYbb(QSuW?24(~3^#=~9D9hDT>1f9TW)km4Lor$pIH%(MdBjTfs=+~HIvBOam(L|hCM+=cy zI=H7USG$ns8EUEUio#=4RX3kP7prdO)6?W}J$75PYJJInMbzHAyT@4+%Am-xQQJuOBUfW2| zHclFs$_>Shx&i{^&#X%*h8{%lrE)^m^)FyJ$-Go08?hxC>2cJQ~rzdv9 zhJJETo-EH#4|51_i}fY!=G z=7+^(X8oqIJgJT6$iyFO_nuzcCr{UIM)#=|oO}opqx003(Aq(?7HBG5rOBUJcN7be zYF7to*N-qnwX1`)>q65+yYS&=CEz+i*~~l<_zm!W?K$5mywv41vy*OSscL3tY3BW? zR`*%Xk!P@axJ{#Efi{Z0P_#iKFQOgK!ZvoB+$px*zm%#)lablQDEgPCm(x#bauE-f!V~#4bhsFnw?cU{zTOjaOB_!O7f)Ob+mt7Uizl81E}l>VP5>?J zrKK=BV5z>ds&Av>zYFE`_x}3L0l#=@bS|M87pe}?0(|vmoTxYBLNTL*$1&qVF{2u| zm@z~I+y%7o{QnPT@W@-KAIdm)i?A}ySWvJ2a`=hk*DYuGpHTU6My;Z66$AVRny>K7 zfS1kyvl%1(%lhKV2^b|_!C7BYqm_J#E;TxraVGp;UNl^(D{AVs_wTQ?e=m1U-UK&i zkMHFz%rx9+P_cB>&0B#N0WaF5MQ{>00MqNk#bxDUhpcOP*TfCc^|hSYaMuJR2Q-O$ zBqo_gBwdU?Cv>GARJQw_`kurk#tvr_gRkl=KOJ{{ZN}l?sT3 z@s5|&PX;h}gjSG=rs5{@K@e2vqDl24A2=VpMhoOgCa({`DFEl50I~OX{%$BwMxkfb zN6%kX-dvyq&tFxvP7BJ1>_rd(PkUCO0s~M;;ck9?2*W`Qju9LjM$x^Rjbr!@VFNkX zjFMM$O(l)({5uqxS+Y-c&fWRW5C6=%2?G%{IM>ONed+)kL4)NpOZKVn0y~cnH#T?i z=|v_j?{xs~X%3#!Eeyp17x_!^=x!fk1Xc+X!$slokhjdsTog4(f)Ma;+|Ny#U^Jr7yy* z2uJw9r~;Wt4zE&@S5k77Yp)~uHV}y9=Lk^p=agKuKwB~i{`v~UoQ;^Fy^kZP78Q(t z-k!o0BDw-0oL`})R9vH+)DBmBGf*JRiWX`sDD_;}T`zTou3!XGs!Y*pv7*{xj1;+w z^jdsmxqC4>aI5B7?m|QHXV!gs0sJ)#RUYJN=vD#XCj!#}m;nI1o?cGiY5=ze0jvb@ zaH44puLCfAGk><>XW&l!9BN`3178I|A-#6NaraR^S?nY&WDx<1-AjOqdW8T`^`iu6 zOmkeS_9y#5D%lNeAQk;afXe2l0HDGr01T(X0jnc8X1Tdgniavu&RiL@aS(KGM0s{o z(Nhy#Jmy_7Mu$<)Pm~t|h!^+8GjxHyYdC|oTgvYcYwG4#MJR=zd{dZ9w zA^Gb(f@|n9xf32-qnf_gRCQ+EuNPuM!@9Rj?wsEae{)4%CM$A_R5cM@C%jvT$>TBC z%X(|2VcL?%V{VlF)rG*-;~XoT?U;IY=_Wy!qPmxnVi<3g@xqhO%x@6BeW>XA4F>MN zwQ-mk<M?26I4F@; zE!TvY;^fcV;aLD$Y1I~*#8$mYfUQc+)J6^lP_|O@qQB*@p;gzAjtrX}hP?nTxJNUb z-l`g1F0HyoBY$sINl{emi$+AXejiMBgo+3HymJOAIOlUVDx6s8sLnTVVLK!dM;jP^3M*?y4C|>vcN0a_9Fj=I3!?hTmBS*t7I;x`tqN}r zy~Pksi)Tsa&OvW>)V0n7K66-Oo&!rwOqHYV<}lfIvkT`d1*7J1d4BvE$T$^9U>38{ z|3s*nPrQNvv)y^OR!aj$zlWYN_wfA_+kIGPeIET>OBDX=4k+OUF-GqPT7YVzXSSlM zR7-8bV4$%tK)lhRj5I#~I=3~cUVP#$< zqw3WUVQ!l20Qpd{VqHtt%Aaoo>p#hviRmOPKdcF7@P}cgZ1Y+aI_{>g@s`~Ee2Q1O zmHtvM##2O?m%dUl!Kmu?IY`@@d<1w3>3P5@b;h_i;hjJ^M|zkZP^J!~02*ynGKp^J zQ<}k(t1yp46=xN5d*|L{V(($_2}~`o?MkTnm^VD6Kp7;aiB;Vjtg4K82v5jLURyqr zCq_*$Dw$t7Ao-P3hoQ8wQAX80pTRvVJkP*3UX`n+@KLoe1J|hR{W|Quf<4E98|G*+ zDvQ^m@KVBjUQY4UyUUo!+}BM9&qEbnZbeHgU&Feb(3b|^NqYI|0YSnEBBsBrc=9W} zV|dbhsa~S=vY`9{*=zVu-W&axG_=X6wC}>5@3j=o2b`39e87xKCNU2V;o#uCZtdjl zpTb8?_ghoX0^bz>K z*&0?Ysjm`ezs)o;2oVPO_P{DxlMigWZtA{=ys#(mXbRqXWv7i}!u-&29tnl{dT6w|&k|rsnpnc~g@!75QQfG@ zB5P-pY`nx*=E(Tsk5O5D0QE1jnwQ0@nwpKObvw`&MzD|@VcQJH}en>d$++$M*aMAoQWhuBN#&q8jOHKqS{ zP*$^$+h$E!^aK?3U?I29O3{>8UPfUV3sr%!KY~j&qY%-g6Grc8g*@~4SD=^iDWK)w z&Rksn{r^cA?UF~;C1JFyAz`$uAz`#@$yn%-gwZZZ7+s$w+G{c6@dNF<_({rpF?GDBs8EV2a z%=8@l11>=UGt+bI(VIc&vJQbJ_ShAGJ=R5pe+t41%ZQas&#`~rMP_DtjyZ zrg*khif12FJliV8vyXX$ZI$BL*94BRLna2b;Ts$e7_TN1{u!3oP4OZ%V5W7pqtZJ2 z+HwSWtb=LOb}L(hwg0vnZ!nCmyNiHw%TT)%;PC(=>Y5wdQfc|nVbxB?G( z0EaB*`VBl1035cM>o>491-^+`%=H`CR)g|fYZ$Kf0#8t8p2b|hfq$L^oNqDLZ(uv& z0*kqR13T!~Qj2-c0y_zpSkn_He|0&@hSQ*_YurXbO^VGuLm>B}jpNiYy*MO6|QQixH&E{wM~BSCA35MIOs+ z0ihLk`XV4cGZ#p;-Jf>pT)#GR{RVZeU;7)@=v=?{%|vvrUz@ppgF4r*-Iq$kW_w6m zVl&roFvIK(WSM=0JUZ8}&0N31_U0x~ud|u!H`qatjW$C+m?y|)o4J029R=BHk7i9L z8PD78mUOJn^=mWNZ?LP`5C6Sn1n;BSx5w6kJRID}Mq14E8@!94VKLWl@NPEOvY6{P zSfA_n7<}ZlrlL8C4}y|rH{qUxrR+^9Eq6+jj3f@}D&Qfu!;oCRiB~cPB-d|jGtPOj zU&9VhY!)X&>j%KG%`X9nvKwJY?Cgg?lN^kF_f-_8FxPMF`vSHk?}s0<^fH1UeNC=J zPPHr)!vaPk*;ylatdU5SoLvQX8?g~E1!Lcq`I@ zU2^?4+1-`qNv_`}ue<_S#%q&3YP>Q{Ta(xBg$&DDN_DRj4qC5+zsZ}F8@8D1x5++^ zzl?ai@6+UCN{Lw4!v{@1(^RHF<;WFr4}EFXmaQvc*~6B zj3)08YRX){P2R)tl99q(zfC^m`h{+4gUSR?QgJNg z!jkJZ$z}Ejl3HUVS*EnlX2#v5M6)GsZdo>S{U#-uSwM8I-=r(b!4NCCev=M73D{z; z-=r^&U{1g~+8^*&A;a4m6DcnRx&K+`c1k)Ej9&^l2k{MIE%S{ zlkTC8pv7FjNn2L~4qKCs1K#y8;D{AC0(kGMfO9S8`b~QGYruK*=-MHG0+Q=DumxgG zBaO0DO9|b`A9e=%hCcRMw9;$QA6|LuHip)?{sXF@SQc9AItV0e#O)T3 zlHY56hhP6X{P=potk5RcpQIt28`|pPifwae658fcan2;ap(g~f?0gK4kWTVzGs$mg zyDJsP9ATSDenUINu883)#fS^t>*Dq&On7T3$-`ubHk15@l089O5-RtFntED8fMqku zZz#>fh6U|Q@f*@fer+cC4K??0`iR&}@*Bz)B-iF#5^Cw;WRhny$#1B&)a2Vt@*8UF z8G*JH*i7;p(n)^p$4I7={Mv^f0MgY%pOx86@*Bz*WQ5HmzoA|p9}KOqndCRr$MYMk zsD9*v2W;pNf;fLB)_5O-Jf6r?Iae`OcIB{LI@FouH?-T8118I6hQQEEE_zQ7 zr&nEhK*BQ6L;n&aVl&Ba=nX+~Z6^5*z3Za)@@yvg4e2DmHk15@bdq12Nq$2*$*;{M zzoE~Br__F#h8~a${xX{@Xy^+WQX_2Mz6~98alct%AL|6lHX9!%@t^)%_P5}CW36X zx%mx++_Ye;%_P4eo#fYMlHX9en?rY(%_P5}OySvMbE*wR1leaZ$#1BIARpOG@*C1g ze(kZ8rjz{I3s|F*{MuRM=`MYL)Mk?3P!B-mPAaUU_mpB zNq$59#k{bY#dn880|bkhSvGs@0>N_4EGGF4m5E#O%q%AP4PB%n-pt~)MQE5{1-Soy zC$JHMm6};h@*8rJ{AMx9Z^%jVo5du*p$RI+%?OkHh9(JCVP-K6XQ*1RYBOsZv1x+U zKs)(n2sY2mVzSTBrGnL(SxoX9n(4k0Q`s^zi%EV%v)qhl!b%HH(WqnW2-yzsa zR~D1}h8idNO)e{gEwPg1H+g6R;>u!@-{j#O7)WWhAMi-RmRzwVk0KnjnB+Hk4B@cF z*iRluIASr$Z*nE!T#K`6auwk`i%EWyClb!LnB+HkGT{P?>3Nf^75UaDgam z&LqFd^+|r4Gs$mqeUjhiO!AxDkmNT`CHbZCUMmZ~ezh%8DSf$2dM!@5UW>u&wMr5E zv6AFB<-eSqEGGF)Ia-$rlj51=H|03zUQ0F{DJK?((c<{aus4-CCAG>(F-=Z95y&dU z|1CVB?J}PRB*||;lKci#l3yQ_{DyYASAY%~Dq*;fiG4#}&mNS7CCP6nR@N@H5wHcu z7nN#3<@a#jx9k8c4#msj8MK+?Hx!V?lcx(iMe2&IFqS6=1x>S80JfNC zwP{P)hFA>Frn!Vw^P09HNzm#D`ljs(hb?BJZQ7Br+SoSjLU-g^90E=A$(v^}6K&J_ zOte&){Srdl6K>1TTLmN&Z9p>71|$=0U^GOy12^K=6Sxq{VgkJI@dhLlZQxsovjUQd zHn5Xhus~EM+HlcNv?~>gYr>|v9mgm3zq_EsE!UEU?5)B&6Rmy8YShG*YmX1KYz1p-Fc%tRZ`F}WgE*sWo8xRv=NYO0N7D?GrRj9@b;c2Fik z>`Re`xF^AL;GOUg0ecWEuVCpgg2R^+yyhgpi#G$rSG6FxDWH)2u!j%~biUW33aO{4 zhWe0%fY-`)sww`oYKMkrt0IDW&qU)8PI3roRTLq&6flJ!nw3nn;Zf{2$wV7|`X!Xc zN+#Oyj#PL?u6e>c#Xjq9I^?-WKw??T3GZU#f)+E;hIdnL*m|4gFW-XJW?0Nb8{R|S zh#{G1!^d(UGqwWpm>2%>3d+A^F=&nx#Qe4h@K5VlY^BZte1hdcitYOULEdWGK;XyOtfL0iPny1^y*BsHZ#$NbtYPyCs*MfCJhYQeQ01W84F>VM8bVV zSj3)AH|b2YHZ#$N2bgz3O`iQEYlfK50Li!0spn$z6CedPGtq`C&7Xjj+E39NQ>3QM zW+vM3B|6BN2Q56ujKSnsfu^w~X%roj>jkfMD`4>xRfM?94ROi`>HSU(^{E>A)A8U7 zPBkr1)f{kOJb;2UDwI+b{7%y0s7qrZXJ=g8rgSO+7La7H0Z9fM*pBw$D;pS(?tmnN z4MZh_O(`X}B!f+v!0B9)!KN&&Myc1j1ix}o%T*vGKSLk~HABe7WUwjAR}1NF4(ZND zq#>FkSIr^r)C@@mo3i3n;dz5RY{7nq$HvWUwh8&<@LDGT4+)*|MOu0m4!~r`E7qBEKSQ1U{iStcm#b{eXZ- z?Q8nM;kE9T@*Vi~b2&~An#~RXu^z^-Ftd2IU|0iM0ge#Hrvk4c()@YQwEVLrz|pkG z?2UT^tvJ=1qdDoF)sIx889c2dsp%L}<)##)bR21OMScZk=H5s#mC`Uo5(J+unf&f` z?igWI%AZ+x8#r6zL6dtKw6EdOkv13UyGl3Ux~eU6b5!Vpws=M)uPxvHYm2lq=i&z9 zB{b<)_NYUHL8Aq?Oow1RA9^bz)g3X7_7e?r9jzM-q=VRf8|}V~sMvl7Yfl2ryI!mO zf9$x?6uY?! zdac*1Sbt)rso1d~C|)o2a_trS^Zl;1&twmJfA91Bp7-qV&co%V?+3ZUoIgw<%evWz>OXG;U86ihPpN z;U-A02HX9}XQ9@S*?t*pk8g|x=H;KpUA7*{OYrKUwCWrO;ZJ$O0Zz|^CDcB^SOWlo z{x>>x4u#7|;#M2=9Re%_bX3(!Ah=nA2f%pfAx|5AD zv<>w02=LioiTV`mDFA|IPVZ`i|iwj z+3Y-hIFMj8!3jTC`NDuX-_PkW+8DSO23jLy+60{52bl1u5#DpQVOW<`;E2HQchG9M z3>k@d=6%AzS~mL&XCMUVu|w6DB9_>oS?^+2y_N4(1`+XcS5p}64snbBx{XCWtHD@FGD#pB^jze+&)j<$Ks%1sMAo7va9GL zn@6lB&A>2XZQ97gvznzcN~a4Nne!6nPJ?e4(NXaYYfRm)iBb)y(ymz9{NLak{?9MO z{%`ON|AVWqiEq$LuKxtz5N^gdw6O3Ek!E~D#KJd3zAWTAPw)+quf7VS2nF8|`Sv`7 z`}l@PGrl2W;Ts~qOJu<}L~MLR#C7K~y5JikdH9BCGrl3(jBkhvzCkat7L-Gwg>opg zP!5F_%AwFgITTtbhe8YGP-vkX3N4gFkwH21N7HFWIkfCI8oZ($QfNJ`_S_$Q3zAi> zx?BM|a(E4bYaasXMB0(=PM}0YUUIeSu?vgU;s~E*TlM6iU*@!;_%8g5$q%_0wa}UG z2VFECKUnzVS8x@vZqI^j##O|6?f|d2iddiaK_tbu7qNaM6;~0H*-mj4F$-4_vv3u$ z9Ij$8QzDomHoPxPD6S$l@(9qaiK~byuA((@6)_7}5u3P^dDHuyTX*{ujNmF-XN4rL zqPQ7XQ7pKM;!u3>%P{(S zD&qIirs68%4}_qjxQh6Lq!m{Ye~9I(xQh5Aq!m{Ye~h%^D&p(dCKOi@-#}V%74c1P zA}cvu1@oo2ijwaRK{pj#MTv#0D6w!AB^Iut#KKjSSh$K33s+HM<0?vQTt$hEt0=K? z6(u&VqQu5kltkQX;GyCwN($XoU=&wTV&f`GY+OZ&jjJfJaTO&tuA-#Oy&2XNS5Z>o zJ^)5>6(u&VqQu5kl-Rh65*t@hV&f`GY+OZ&jjJf>=W=^(lT>YOTcJDoR!{lY*-# zSxr)L6(u(?yNatQ$>A!FLRdKR4(c$0g@Hr2lT9EP%G#9B=lsxw(~5KA4)C!XsU*0H z#A$2;f~$yFxQfUg9E1f|5vl$FQJ_OyMa1ALBCiYqC%B5pRw0S2h-{m{&=W{*KNzHw zSPhzi;#g}ZaR+!xgm2*_h^yeJF1(Mch`c281aTFSH&V2N9WeY{>}Kt+@>a;gRU|E3Me+sORa`}K3;SP1Yv3x9uhWX+Dv~>j z(S;OOk+g6XNefqze3zxFxQgTl2O=(U70H)L39cg9jH^icxQZK*a&ait|70lr@ebwG zphFQZxQf)mOF$~FA{B7gg8{B06>%khf~!cy-M?aQKyekRgnK0zgR4lL@*E;4t|GOw z7DJujDpKzp&K(rNRixg#2(;oVQlD@#QCvmpYmPj+{ha!iSyWs_>X)rBqqvIHZ%oVJ zDpIFqA!x=`q!y0?uegfTS@$z-K0v0<<*1~%ij;+`NHtMKaTTe*F%894q}CKMKZ2`B zts{U$aTTd&hk#aGMe3D`ARyA%o|5>l|nRKt-GV9JYA@B9V- z%N~xBimNceP-Fe!LL?{^5qAQ-2YwY-fqH)e;j-UoXvI|+2Dl0u4@b@t8yo=2%SuNF zvEGaP6D#S`F)|#;MO~$Pf6PjW@LRXiv7|9Me~9-|rQ=?MjnGOD~Sc>M#XfDssnH!#52USS+wy$A^7 z*n;X&7>9RhU_G=2#^EgwNW+m=4W13-@GcMV<(a;B#+7XHae@!yVEk}|pMn%E!H>W= zyc+}Wf>s!Zw{?>=D^#^Kp84)4K$gFGsX!+S{ls&WLz;oTG% z3~LJG@Dicr*r*d2hnEWdfH+!Po)?OPQ5c7p2{B^|iT`jKi~G99}=UU{qloURD@|ad`Eiui%@)IJ_aD<1rX3jKgabMqwPD z4dd`^7>74X@}n>g&xUb$<3g-_g>iTjgi#oWXTvx=8^+<~!8p8I0)It`DvZN>Jh&dq zF|E1vL9IE$IJ}KPEndPnJR8R0Jssq*tS}DmSz#2$;n^?_&xUb$HjKmD4aVWUDc8j+ zjKkXv#^Kp84$p>hcovMqvtbiUa1>2!26vp9w6Pyc1VI1Cf!YGWxvtbRk+XBy{hzyLwdo0iu{ay=fooVWXad;a7MTn#@4sTO{rDwX+QvnZ*!Z^IA zg;5xX_q;F)3ghtFNF0T6cvZqEjKgayjKVlP8^+<;Fb>a#ad`cu?iI%24HQOU9Nu7I zuxn2khu0unL}47>P~i-W!y7H`85oDRw{TSox3wLAGZDiUS31?s&-nGIR7>Ab+<0zY02VWG% zQMS)_pasTJX2CehEEq?b1>-2QU>s!@jHAqgagjVS!#K+FVH{tJlb%gN*s~2=1fGHqV7)Sb34o(8& zNPl@bc3OcJ28<(Z!8p?2pN17faqAPD^e-}|0LGDaT@E}|u+<6ww+(p@%6R%GcQp%) z!+Rt+AA0zp15ICG99}qd7eW-q;kA&tOIAc)RA_~9cts(O`wHXmTFK<8Fb=O7#&M%q z-iDkBj3bkYU}HmJ9GQ0WK?{r{(?OOY0^`WkkX9H+rVCXR#*yhpT45ZSo}_gho#}HU zN=9KEnJnWfj3bkSaWF}Rag=x60{Z{m3x&&v?Vw)*<0yCC>#=GR7)QAc<0!Xb9OW%s z4xS3*D37`vJQc=KUgUD{R2WBj%smGyM1^tS-QtB{6vk1WkS7&|ag>(|qcD#0GMDp= z!Z^xp7)N=vyBr1-#!=qh<&3B>j`BU-CP)b5DBt@NE;=2qYR84JA1*MC@(Jxo_C+z5 zPZn|@$*Ch5I*sJM^GFiLQGURsAazgeH`t2F4{HbwjD?S{6c8+XZZy>_k4Y22?WhP9 zG0pEL_H{b>I!yP^bbQ5ez9PM{6!%q!79dn$9OctlZvx{eU;B52DvYE2AqOQRk67i8 zXcN5wHCO)F0dj&d8uQEtOH%54}&`9PNrDvYDt zhH;cPiZO+8l-n?l^1WRG0TjkjKH0qijKVm|4{+CmQ5Z-0EO!SOg>jT0B@%^klpkjr z`Kh;{L>IW9LTx6p#++nmIwsEx;mGNrrJR^VjH}!j-|0d15?{jfRKoJ~OYl}-Ob=Ad z4u^bvAe$%58&=+7w z`Y;ag0_;eiI}4%V$dUM!XJ^g}G5L80t9MBDW-J0b(&t|!sw;fe`}0&|bVnZBV_dr_ zup@oRI*Icn>_{)$g%AODq?b=4Nnl5M#Tg(K*pXhzILPnyJusF1@89y9 zUK@nI06Wr~_X4TFj`Yiyf|jnCepS0BfgS1B=!XJ3(mR+l1$Lz0W~vJ8NWaIZRVWjh z3r7axxA6QL^w#|XtSDSjijZ~}^+B@kA@6~Xhfs}9ydQMjctIzuj^gt{2jkoJgibt- zkb?L#2njpr1jmd6a6mkBkCj#xX~l?hBsfx8<~r_i3@?tnjOgxMhL_2!3U?k~K~zO% zQ2%&7r_@AtAZho6f53|#ky3`A$nx(4FS+Rux`{z2(aG|NyWm8odC|!zvObnN!LOm; z`FE^gl<(YpYinn@Z&vm@oG$E$?!bWmg0CBW!XK_$0W_j3;0FWck!c^iXRdw9yahZM zevXB>8!;(6O<*@-Qo0e7(oHZa-QO~TrO^IwHJu)JG2@TRci_IcIq350$VR;W?h1Iq z<1V}9C2*vtKvveflsKKif6i*!;64pLOJ2|o8{HSdPY2(NZ(`g{QeMj`e~alofs?9n z8($a5fp>UPQm^R>?r5J|0Ip|{x=%^@wyt%Z-o>o1&F&kp9bEq9;yyhvHupNjakoqI zw?U=vQUtw)*Ur5JR?+hFAQ{nubcI8srz7*ihy(Rm3vPTix|sM$}!)qQRlit5^2tCE)J08U>*0^7nD_3Iax zew~OU>$1ii4P=ioOk2ds)h8-d4o|E--Wt>&B8mU|E(sRH&&x5h{uy~^c}vc ztX*xqpv5J&+#P^yF-K~>_G6=X2o&WOVl=0o%y|!|Hu_i1%3mP6PmKg|o|aSB!4hz6 zU>6HVrpWJBC>C`_Q%Z36j`@|X_b3#;q=>t21MXr4$SWjw5^w+m(dgH4#uc3}G+sGbXKb7$|ksMtA66r5EXbd{+L>v$FrHm`ifb|ULaTd7a*Vw+5 zwmS=~=vFZ)gUp>AWSk*mPy_DI44!DR^*P>H@Xu{p+a43FV5ffOh;SQfu2DvXpKpY` zXLqnN7|5Hem1Jd{_=VQG^uP&=GP240tNXy#S1_&LDeXOnq$3@Kr=n>GbESjL1w^~o zafjpN_<*$V2f=HH3krW;FX>?Dp!#a7LvQU+x}ZJ|T+a_^JuDsUC-O2%wh;cxN1;ccP8D{oHS=@R?8yCAI?!!wW!M+1GXYP&&c`_YJraZ9#162ci~4-#VOh zIB%6&*-LCew?8D$K{8@Eh%Z3YEix*r(2nre?=!>WIZyujR%1|?Guyk%SHd-NX1mha zAC2NAU}z@`jul*t|E#;LOi8aJhE5 zXYdujM$AF*LlNV!$4g2^iZQ45G$Uro7qs)Ml94f#)&0$iT)V+ydWtG6 zy=Ja;LU|eSTKK_pWySxKkJ9#MMy^(-(J-f{iVne1qIpm*rDIIB)m|9O!Le^{YQ#-{nG%erI6*)uy zwhW!>8|q`krjUL&I;@hbM2AhzR7tjjY2S1OVbS2IJU5&ky%5d4Q3kLEql=}F{JBko zI$#AM1LuvhmbxFkZ={TzH_CeIbMi7)s)dgIfgBuX%y8I7@c_!X4_hA~c;di|&F&NB ziJ^M|hx&7FM4A&#)V?_n9)Jf8m{-o>*nc9-kCGAfT&`dq2U~lniNaCo3MjKeq~Ez& zCwsCHz9_l(1;bf5kt|Z~%#<%?%FB#qAeV9!^A%IRm?=jFU{Vl-qsCb?^=M@LNF42QlJa5O;v+*I=UZDU5$xk*Mgu1L;`mi<$DlnA~>P9Y-tK z{f!0f8W=rS<#!FIb`PV$LG&}p6fRuc&&k%AaMQv8)kFgq2zP=T4rR!Ltd>Gf@4@U| zx4PXB6b&}a*5R#)xg0<1T@=-=tHL0O*lcqf$q5rtk8Wdt-(28~zN2PK<|aOPjXZ4g zi6ABq+I*uJlOHaToQXSu=)glBm%g!E@W`aHW`#*Bwqf_beV9${St_x;$X=5Ee2nlI z1z6y5#W$Id%-AE~au?$dVzt13MeERiCKKZs`xjFd|d&HgS%n))K(V^z-U_@yNdqgG}oO@0V&e_udv zxkj+cO`M&$>UGGE53`9hM>83j@hoId%7=fPR5UID1kNO$gI1~Mpm9ym9Mze^Bl2RW z+z2hM31afJJH`7ewkO8$8Jeqs-MyGXz-w$HE9&Z;SPS!SZ^4I4#0NI?W*=f`b0{*N z@>hK!n*|3+5%1$n8F3}(xlEdURwL1#W^CHUuYkObVimD1#Q1}LjTRGfPHKZe!o4_z zCNc~LF2cW=rqfJ7E9c+Xo_NCk|B`{u-mQ>v;@7{y4w=Q&7BI?y62_f6}{TJ&vwuP^=jRZq$8(-wYJc!tu6FwYYV;FI)`4( zB3`Rd@!(31oN`)MOit^H{n7$;7n9SvVsctnOit^H$!T4&+tJfo#P}7}@5o9Ko|cM7 zy#-T(DlKk4t*f{hRa(4c4AM|kY4LUK(2KvU5l@?p4broBubroBubrnCvF8~x(TKouUMU@sm zMp{v&#nx$E#Ty8aS5#^7rW#}=hbm>h6jd7k?#=?_k*9UVEmUdTLY2lXRB7BomBuYp zY1~4U#%)w-+(wngZB%L8MwP~GRB7BsmBu6P2k=l)rSU@dQ!t7ujoYZwxQ!}}+o;mG zjVg`XsM2_u`!%d7sx)5V2GC;_RT{TZrEwco8t?Ajh&HUJb;WH|Y1~GY#%)w-+(wng z`?(RMv&m_FGipC>P^Ixz%%q@7%ajZe` z7mlztCA7>BO*kc-K01PzZ%h?cT5=lOKsdtSKf#uASToqtEJ)}yV@s38kyn-@FvT;w zB3p%2Z0Tx-Dz@})#wsSZl!4-2Yp3`Q@RSJO!YL-Ul;foE&Dc^Ic@kO}ig*8oBSkuJ2Y$l2|O?>b;;!ecLKZ%z~3Dz_rSkn~G z@Jjet(*g)vg_8Z>!2hvBxmbx=XLuzCJ%Mn+nkE;12~x49$$;Aq;~cQ2$%rfY6Rc@6 z?sB=KSkq*}C6>`(O_Qf|1gF9j`F)8soma!RqL$@e}7tyt5fb%s~cI>Rez zVNH|2)Inddrpe!!mcg1PPrC;8o3W$@>&^wOSkvUQt3fN)H2KPU&^=h9S9S#zlQXoP-o4 zOcmdIV6_K2tXa2#r+OXKGDg56s|#g-hKN z&=yYEXX-v-6!w|2VV|i71D^pAtFX^h-sxSbn*v>6O<|v@L})P<1p@m_r9$rkO=Cd1 zUg$R%P}pb6KD{et!#-0s>@#Jv$jKV%s^`W=msKP!|LqbzH$;;_osYYQG_L;I_pD7#mnX*ssO4+c_)VL5UUtyoA z3BoAsGiAd*Q#R}~l?VGw-4eI}C91H`)Z@WBv69r9TOZV#BkVJ^F{s5$*k{UyeWsoc za)eaaXX;sD6!w|2VV@}*_L;I_pQ+topQ$&4i&0t%`%LW&aw^Q7-j%XppD7#mnX+J? zDI4~g`aH;bQP^kdt6(vVE9^7%O>hPng?*;J6Gma5DI4~g`Z0I`)C}x1bz9&e6p?{_ zrXCBV(d@Lq)|sYG*k@`(V3)K@$@I`%LA*K2v$H&r}}lGnEJXOy$8oQ+cq@R37Xzl?VGw<-tBv#|MXC zS!-aQsS|^2&j$9H%7cBT&XJB}V4taTwOc9dGj(Z@bA*9?rdDXjQrKteGVNIk`%GOW zoPm9&t`*L}K2!Oy&(ewQ;fumPOZRz)-HE4nm0GaRQVaH3YQa8BE!bzN1^X@(F2`&=fLH%ZR;Fd*R1vdqs2R`6$8yV=-=6Yyu5b%s}&b%s}2 z7pf@uv#c9w1%HNd6@dH+_%m&TKhrk& zGu^`F5USwMbkyY#s^HIbk;@@e!Jp}vdoni375telb{B(D@Mk(9j}8j{OqU9y;LmiK z%h^W3pJ^NXnXY!vh5-eCrrW!m7Zv=O-qR&C66aP%(tH0C?x%oxaMI&`Ajvbl(i2Jn z21xN;Q+l$H14&LDz|d(V_dS#(!Jp{^&IIX{a5Lj87)ZzupRUl%SopZD4#6U)sb;yH z$p!JRzL@5B6Z<+95Qzz<`)4}7VuPkz8o&-6pz zfL4T=b%s~^vGW)#XLzM8@Mn4h?dlm`=_iguZWa8Qw$JcNe?@48fY&u|5QrY-Pi+B(B4odbVzAEAV$O#|}4l=v8&|LC+oLNOE}eV|jM ze_nu)qLmUrKx+|01^k)r=H83|1%IZyyGMIy*F3{3ZG%74Huy7bgFn;u8D41{{E4%Z zXiUMMX&d~R-rGG55(R&zC%cz}QSfK_0QWvH3jR#ba$f+W;Lr3?B2n;X`Z&|bPrU_A zae@0UsLe!PnUf4nC*-Li9GM4N%85xNxYkYFgmQxF8NP(+sf6X}m*BO&m>#H@9S#v6 zLO_NIN+<$erRu(reak?O(N1VeCnz2DyDy1h2v2axhB~!cg}h#k2#d)XUoko3EA}9U z+CWUs_=?FHUoq>9FK<*5`T_;@4&$INP*CsOLl7E{%*L-g^m499$WK@Fdq~DI7NMZt z`4@{SPx=zo2l7-CbVr`56U}FQd6%r0IK;b34qx-*7$~T>>_>#8c*d8vd|#4;f_f`> z%9tZ(e0eJw2l>6eC#JWUobeTtGrnSS##c9FK=xK`T_;@Hjf0UP*CsX zWuT>_daue!BN0MDz1Qf6LP5P9%$Y(#y|W)fl`qL4}`2{ zD;hZhB=?OolJsMYmwp3gKvBY(xnT_y6iT;#6J zk-M@-Xyn@F$lW#a5%gK+VRty*1!~IK=E&LR$o-om4j0*Vr{w%hqQ z_SPLnbKUkAk|lz_aAXX^ifTc2zwJBdyhk(s3pCV%{JBkwpw$EUdykdp?&EY{hRSe1 zWIfF@Z`+!cZ!^jt8s(lGOx$+vQlq&uXLbQz-t_{epqv3P?&|(w`{y zwiN4p#RGGSz!}Um8h(-S#@yZ$t!Oj-Xou#aW0}ND;QB8^j~@)n*|Xn9l(`&6TQoAtT%bSaG1B#5vmf?=^mwuzhT=Nt z3G7DmBVjZn;NSZ1gpp-5nFp6ITQcz2!*Ox^Ioz)dF28EYpvs$uGAqt$ zP(_}BZ$h;Nh~LZwkq(m28%BXOR%Sslb!C4Zfmpu~BcaW2Wl5%zA0 zv(v;uzm&i6j3dr$V4PQ})O&?-W-YR`1PZKi6dYUqaAZCjoRe!JlLJc-;bs%z4Me!A zIf7IFiV^&zg%b@f$i=`Eh78US)d4iI(BM zPVc_PZl)tnx)U8a+^qg=6K>bm5XX!ueWC1hf2|Wr{S%Ig{#erssq)WlT3U@(jkfy< z+ipF)sl!P4DJPL8Fxdvy_GgT`i?Tyc#37WQe*)=IBQTzgH^~e@G8?Ms_f)qx$`dWi z>3xzV{Ff2-rSL@HyA~PY!H7BJ48t4`ruY4ZSp=pM&at7ME)BKN!Cg6O`%$CR1f_mP zX#pbdG~sk;iiA&f`0$5VrLj7?v&n(O!#&feBF4#k)4)%FSmr>?Gqeh{5TfmjFP5D>$k1+gB);N)#OZXi$c_YXuI zMt#j3BOr6M)Mhj?x4ZfX8XC#W`I4n5Cby5Dv5v<4f6Q3ODEu*FTp=|W>D*k#9%_$_ zeF)JsxYPJGh_^`m3c?$Mj72b*T@RxF8u+ma%EPE5nGvO}kV*XNy#eK<(g;Qwe2Pga zY*IQMQAZ>p8NLU8=0JJq?kdB(Kyni#!~22Q0Rj~@-`J_MD=HeCHQuiqr+(UQSw7LP z%VIt+K7)kKi{JtMIalrXFN8#cGmlXVMJ$2Qv))A)zm>1WM-#eNc^kx8~*P%m!`$@$kkg0k za3q217(eKJJVov4a>mgtO?d|)Z4aR0guVWO&;C-mD2@6UF*hU9RPVD0Eu3?rzm$*({f z_^*SI7Dp5<0bbJ}M`k+{I&H)L#lv!g3VW#TTn&V_GnIhIY6V1UG_D1K7&#Ne2aXrU zQ3@~`!P=pjjLSJJ% z3EsiNz`;yZa>Jh&AUpN=`5&CT`7O+a=Ag2iP$`$8 zYoYH%ZpSJ-+%3gmM{Xi*QT+-H9UexAoYaZ;`H<>;q|wiak&*jIqhA~ZQtu;;etAg? zX7vNqO!TYypcSPU{kA14&qpane<7?^?jw!;u)VM!`IO=$+D7>UxAi0 zK1)VZ(~&biOU9AbyHiUh)*)swN*pCn(&+w*2*oVx(h%~(LWr-1g8Voop~T>62u}zM zGa)d{gupNp0>exQ3^O4x%!I%&6N30j*f7k*D4G@+W@1hky3NBq6ARx$T5@S>VhJxu zR2XLBy6Nb(3gB9$WkVQd;zmZ)!#xu>&4RkZFcY`aJ%wQ=?%-jk3d2m?*#KH$n29w6 ztm@&OiFyCT$pI(uQFsZ5U?KhG8ac7-kZ;#K4-uFq0MT05A%}OxiHa zWH*;hQ7=tRb{9rrn8_Z(=%uO2p2Fy*smWe4+~}pLNgIZl?B_NholQ>iX4G2Jz%Y}m zm`Q;aD$s7#xvoJ@aBT$E}I0VscGsJ`=tW61>=!Yh>OC1bex|G5& zQ>U>F2mmu$$$?ofO^xos5nBM5(dwf?LWcm%==>mbQpM3%HiDDGJ)>KNBmgtI?G=We zKyv%LjMa+s0RzRc)=n!%r$qP`PAewKDL{B1fEj&BCKUoOqi(dBT@(ha>JRKR8FlN&fE@o>-5&DviHxGa5!jZQC3Eq#u(UYc6^0_`f`vUCgk zpB(O4`Z}#B;Ieebi3rxiJxeXXWvK{%7@!nz=>^;oU;w!EBCh050GD3e zt;Q&?fJ-momV+^XOYfA4h@gN=Z|B{h1#s!T^D&md3b^#%D~7%TF1=4CAiH|Fr}s5S z9&@+Ux6Gm*?&HWsE4B*l`?Ge~-23&fJpJUo@<0tE#)gO`coyNHwmGp2= z&jMU}O;l09rS~_cp@2(o&846faOthP4YUF-y=OOqR=}nA%DbR@utcvM4=N#m%Y*@3 z(w4UTaD>w03*o@&43wX>! z;@ss+{+W}If`qAtaXmJc<;C7Rg{(T>d#a=YE=@4hSbu;(K&gnJ(r|>8sDMk<`)Gvg zQC3PT;L->HxTNvI9asl?8TSCt;mAz&NGUFRfj=l@IH#JOqyA4rS>?Cgdc&I zW^N4Zq>fw;n^_a!>np+BW$p=Remu3>7OR!K8cxfgT`WAJd%_QT6Vqg?rn#qKiF+Ei@W5Y``)gca(dO2*SoiKVi zY^FnqgQmhuGo3}Em&0bdhS*RPUYfDtr5PJun&}r}nJK(9lNCncrJ4HB=kQJ8rI{fi z9z>z=(oCZ;3NOvr@Y0M8FU^dS{OGBo85>@j85d&ZE4(x_K^TRXW^8zA#)g+>^5CVJ zTLRahL=|3|c|7w{WzgqLPE2DNwzFU>p=WP8=iVKYw$IUgvzH1n)53NOvP z5M){F<*=ETh0)7lGh2npR`PP#%x>_~%$vbWP+G$)c{yxmH+X5rhL>jE7c+V}Y~~|j zDw;_K z>4CyaGd8?5Qyyg3)l)??Z6uDKDw?ShMo$&Zv=v5A70uZ2(u@r+&DikLOn<3+g_mXq z3bU)~Ew=8#!Z>afPZiBH2p4gycsXolsBpz@6)%U)j28FG+$vrUo7r2qDz_?%E|3{7 zT#Z}B%V9GUrC55nRlFQFGeujxTgA&^Gt-1?aI1JZY-T^j+bnYb#J>CF~ywp(=!xnqQzhtwHwj&LWtRnJ@iZmw`k-6~!V zn>jwX5D#nTxmBEwGA9Pvo}EC|G;%(?wCZmw!JQ)=X=b2`m&0bx)ovB2;^nZJOM{#v z<^`&FIc#QycC0`ZFNe)sradcA#miwcR|$7spz3p${I$X@3sjv)Sw6h9d}1H?qVUr4 zeZB@Q@Y3>q*)jBT*z)~J>*cWJ(@E>)u;mAm*2`hb4<@ab!_`((*Z+ASSlu<*?;Bcxl^1(d^4}@Y1%t9Jc%q@KQRDgTT-= zigfwKSu7mkG#QR?$i=mFC_kM3hHjzo(uz+xI0?M8;>$(YZP!ypE56~_tH*9ue18bm z7d%z8;ujfH057d@T@E}|u(c=tZx_luDC22D;H3$HmnJNDY37mO3DCnuu3RPYLfA|= zbO%BdUYcnkbC)c|GEt!wUYaQiaoksUX{MD-o(eC`w3f+}+b65U@~g;MNvNV%M>v}h z&{RS|Qwaf0B?L5;5YSY@0!>wn`U$ZGG*xjJvm&6WigQQ73YNRfIG4LDfw=r|$p=X< z1PExV;`|du^%P&VDNi*{cVuN8=P2dK#fTM`+#+#!`w{<$;?5nyT1b zi>L~ks(6`)U&;eU#jCPh6VOz}YxF}wQx!XyGX+gmyvT(iOfNy1y z%SlWDzLhbz5X*lB_*NFX#b6ZRTbYnYRR#D~mI|W)UmUQ-`Cb9Om3!z0kX+JRS?!j> zfC79g+q+zuD8RRJPq!Kpp6*(?_guIyr@K~;JD(&TqMXVJJkwH6cdeW(B==Y=r#{Ef zX(adkjwAuTl?No#2q|VgoQ1%+{IG`53|RQMSP#J>r>SPS?nvU|TwhG{yNP|BJAECd z`)4}7;>*4wy|NT#S1ug+8DatWR!(QV3Bb22H#2UPBbW46enmi`0(>jKexHVpI}AQHWj8mA00sC~c6WaPBLLq@8{k`M1AHrOfN$kMmk#Rb zu9fxD7xa?e%0@A!0N+X*;9I%3+p3(6{C*blWVa(21^8AT;O+%R0lt;9+?ik$;9Gf= zNEF~(d7NqF#N<^jaF2)DOyrU|$8XU}>6c)w zFQx}7W`{$>u?Wa8K?y~`5uihrcx2zB&zT@wk_=7n2EP9a@+3o@@Kbfxov_ei{Jrq0 z>cXcWiyY7$!IxYK5+7xE1-*=P#M!f^y0;sLq4Xh#IMw}xbfR1>R@b{8!XwdgysoMq zDZtO-=+m`e#=31FDT{tZW|By%;2$@^!VzXJ9AV}QQ@tUd?9ze43rU~sB8F3VKu^%8 zD18#GpWzNgc)L*bh3ltsC|t-ezvRnfga0&|xzHPOG{4rYyvx;?aj9+U#gRzB>w zPW3u*Clsn^s4SuT8>GNOflNc?=AXcCGJIJ><=y0;QT;$^L*-C9y+wI9)lgX&guU%X zo@j`k&V0Ns{bE#fUl+oEN|8*AR^y4YdZ#e^Mfdy_%)7$Oj9%~znD<>S6lOb3{k<4o6WzWGl3nftu=Zf|4(9GxcO)ueU9>mb z%WuMLjxJ`o{VvRw%3aIBvT^2bG?X+zTr-~}%kOxGDXs&Gy z?PHe{zeQY`7uKO)w>>Ga4gqDPi`$+a_zsNh9JXB&IJF2iqUU#l)*0e@C`$Zi+q0xp zB0TT+(!wfucsRUrFXcLe-PYY4*b||NyOF4q@K7dh;sF#>z$tqMOqIJSFdy>h^B5r9 zCjzoYjaHoi=1E~9(b33(`;;)n(IeV{c`m?&%A$Oja-SDxDxAW(wEcplR<=J{NU_^B zbSq8seS%vXl5HLiWp1|+7ts-?kZNxC&>6ILBpa|7E-?0p$dJ)y|Hb!@_ z(4G6RFop=-g(J4xsPy#W9PM=dh{<0Ya-TIeuMJ7khaZQ2_*Z$lak^fAF?6dSqx5?%dg-7fFXb7r<$u)sv$`N5O|K_oK(S#|Vv1!B&HN#1Nr~Tgu_c zR+9IFtiA5vP>h9G%Wej3u`@e_3Fz_xtF}1A@J={nxkS`D%_Fv2X+5mGGvt!v0;lUT zHtst^?s$Z;_V1M9)iS*+#8(?mx0YkjUB+_m3@(LQcRl8seD~&KuDk0o*Ia-(wWr(% ztB1A_FPn_zLtC&cogPm=0$Hli-H!0i`#&ViSE9q3DJ!JinmIT@x~%XA1~0%z1?j>- zdj!j)B6W4Kw>kidX`qB?4d2V*w@9DxiJRzn0PE_qLUsd}=Vf;0dlC~+GoRE@h`MZ~ z+7*Q~)ny=@#PxQhdv;mDo^!P*;p>L^EUV=%Yu*PEl|hYvZqvCi-#fyFvRsyb0ND4r zi1l%fyX7{f0_d*%Qn^hBpt+E*bL45J-B_UO&txAzN9Lg!?Ut}tJ7<^r4nm$kF z`|@#sD!*@xo_Y$xVXnWT`uhW7+Q%6XzFm{N98v`F9L@ef{=1R*d4DB;3X4bieiML! zm2Nyyx-p^cL-3WsB423bJ=8BoAh{yvZII{>p9ucr zW1(1Iz^CDh$$v+Cg9|vSYy>}KHoEMP0vc+Gr}DZZpM|)wfRMM<;0INuaROjR)QJqU zBMX9v7g*jfSWa6XRj?Lr1eTA=ZZNLJPsL|6P)F90L$m?OiOJORQBHQ7QLKmJAftFX zvi6k~&d3OJ8b{rs<X9js8w%c4iiE_1$l>>ogp1qD+Q;lx8$o zbnIRdm*t7ZlAUD|nhk~Z;s9=VXSru_1-X%(3t9G7!>k7LK`u*pZER9t_-|HtClmev z!igwk=1->&fk;=U;VL6#zWw}#Bj?I8jBBl4e`S0BR5G^4=(fw%a}9>uzL=gql>*-% z8SN|e@o51^qnpS}g(&|P__|wZ?{leV>UX()68JBqT@1meGG7Yi0XSB-isQvsQiL19 zvw*)AKYj$4ea<+u6^?(d*^;wx>$e#Jds=qVKeVR4fK~#|GV_a2tw)=1JKIA!=kGLv zsZu#`psA`eAlOGkG<+(K3ts@@UnI^1QMM1D(=$PYf8y`;Ha+4Jgxm{-y{-WF{ z`*2`54FJqN`TCKJB0pm57pO`yqW}^bMfJUCL1GW+bEjrQTMq}YNvJ^lw;wtsn~#&- zWgIU&4b`tXg?zFz!27eflQph1y`fxiG#ITGu4deAdJv1IVcQ|P3=R!@2gEldJ_9j% zUmPR*BZv!06tu;cHXugx0||anG`d`fRZFtdja803D^ZR*@=S8-ms*1Cord9X!!IA% z4i~Vhng<^F(n&_1?88QzL;d@r&Cdw3&zRuu$p5d#2x>a}feGhOUV|*rI7cyjMAj~BVuML1Gap;Tg&oNVGQtpr*+Hs4aSQhTE`8a6KUZTJZ}*}j(ec3+%}T|dHz z4@PWf=o=`;i6*2$s|D@x7epKOZ-{ycM1u{N=-}cEYD68@2%^*et}}+K+3Sq*QnWz#fzWbv!jbnOTz*C|bo66jafomB zE~CoYod-RwH>aUwjTY1~$VIL$5rL!G0Jt!Q8Cz!}uVFfCL;pg2$<^I(WE2DUV%GLz zwsy-@{Rm^9Efh68%dpb&#SK(j+OM{T#g)e$b{T~E7{$LJrD`{oQ3|w}w%_P9l zWrXCg*&8J-lnm%^n+FeE299C?_GnS3QDa(Bj*=A60Hrs4xb z$+J7f+2<-QWLL8U))^z40&2x=`Ur(J7DiUn$O4qe_{Uh9H&S~m*`6#-f$fhx5bSwB zfxU%O$TF~lcA_<$jshNk&hH4{&RF*%JbTZ*T9O-({~usbYWHTpcC$|!@joFhMRXCb z&57SM;$09A^~E!D^?)h5S@)Rxnp2wP>u&N*H7qe=rj(xw7GI_`*gBj1sD3g|_9G)s zVyt>t#7OuU-*Wb6EA|_Ij6L%n^^3-T^u_PZF`YlVz!I0Ch{d<#bH@K-#C?!9_ZZNw zqQSFr;!0CMbZv&l#@s1N%?{QXC3W?!@Q&H+p%884~aj}eJ&G{9SdzI__m)6JkxvBKqI_uPagB*{D&v3uexfROGwTYB23wlm zjVxi|mmOhghWn`7@_>W01uV^;PIg~Qvq!#W($ehZWRJ2m56IU{TbjL{>}i(f+4-7P zmS!I(d$FZ?XTD~QrP=6>~CrI$5;85=F)u4VV33qC;OwNd3(O*XiIaTlP!8sn-}Z-)qKtImgXQQ z+s4xTEnjmVOS9g|cDFQZu<62vZCc0_OLMT3ZL~Be=W8BdX%2C+Q!LFz`I^UCnhj3& za7**%e9faR%|<7?(9+zJuQ}h+9O`7xw={ps*F4?Q9Oh)NwKUtKqgr`C+tM8FWdC7l zj?dS;z|tJyWFNOQPtMm|ZfWl2WM8s0Z^+mDtED;8$-Zl8K9{d~tED;08SuTOiQHh7 zxQ`6rYb~|W__p|^Wf-p>l?^jztv0Gh%pBr2?a1nw^{9+lUt`SD4Yx;S?pt^W<`CI% zdt5fyUIU-a8Y4ep>^cO|IWV#n$u3&^Z$?r%$YUBirciag9WPI8|mv8`=w-f7(y+s9DBDmqU9@{h$^(uLPvd5vARwep1 z65|%|U8ZvSzgGA$EWwwI8G6S`V_?XAhNR_($XJ}qPYbgT20U% zOfj6TvNT`H*R(qThO>WKnm^}j?lzniKHQvohXHx1?>3x`vNR{;YuX(Z!`TUz<|+A_ zb_c+4c7vsPW4`8Y1Io*m=JWZQb_c+Ka_S?^Ir<@A)1F9BN)K9^)dTbLZV!AY`L`_1 zz4JBgp&XM_=+WlXiMO+A)1I85IoZ;@K3~%wdZ2l-rTKKerag^8^EylOn|w{X|3mYH z$C~|YgNAAOX%9W9%^NJuk@=eTP>!kbWlQt;d`)|@N67~sZ%+N%d`){W?dLSqSellP z_ArhCzOkig@Fivl3!uO15OqT!9l(hmM_`N9GfEtynun(ah|=(a>8jkR&}1+oocT5S z?OoE}8;l!A8T)S2XGnp|y1N8keF^OAJBYia|33v@cBtW~5YXM}iMl)eUxBqyznI;N%r*pZ_+nL@EOWmnPi@U$uVHBDi_ML{=M!+54 zT&|wuh`2Q%uVsw+jQ6ns^HOx$Nj@0hrp?;gLLZDd zaf!DS@je-h79c16{8y0aZ-k;VXbmJGY+k5jtw?^Nq<-i+ZIXwcjuM@2n8jqE&epO7 zzqs(zpP;z5KGLY&3bl!%whzw-%C0uyk0Jax4G$Ln6%!m5@=pCzM*1#||6rIO!K}=s za{kd>E@k5M8axqTk&_u*XIkO3_vLu}BNk)sW(7rXUpah-l5+k7REm6j7 zA4|{^YM#)98E(Ry#?S^0#QZ9MBN0K1@DnM*o^x5aJ5jj54uhmCpD*8&jx!aKx=ncg zGW=h`59(2lEv81lUT5Uj>w!|QA3;y+^`Kn6HhyW`s5EZ8kaJ_Hx-k!KWUn+@ESPVh zp}9cev+3jt<~F0nf@uX`phdZpz0U|(03B4of~kMqg!h5jdfyY)Vf}BLnww68XUdNi z_vg*VXa&y25?u)S5$j5$9vNN~>if2_e?lO`5I@k=~2D2lymjZKV zIE@ugsv~&0BY*9|ib~w5Gz>NxBajK?c(*lJB51F{u=;w_tk96j8%*-^5VPTN!L!x?0D4gpm}ILn{$$VL^6Vs?9nDZ--0BN9$dmVAH6 z$}}3jrMO6a4MeJN!LbSF4#eO6JTz~~on?ui@x{#>de<2-UuS)h^GM1ew{KTJ-_+h# zxaTy^H0`?56neYiexaW)MZ1Va+t_2H=3)01%wA;&#=C>aE_camaHOI7> zcVfKgC=h@KBfxlUEFOSn-%qeF9R*ad42BPQqb*9xsJ8Z1JB1`=Doo#9*qrumPBl!h zT;WJ62PR@ytckl~MFlgBcyB+Ircu~V8R8w_vL zSK&qvQ?C5EO?Q|aZ<8Efj#RQw7$pKamO-ororc#`F?60$Oq&xqkMUxYJyLFdj>&}82>Izvoh<3C4Q{Hmw5%4V|3UKV~6aizt-k66;;FFF;`4}L+lw8e97 zLXFXHSYg8-@r=rs(aO`|y~e-_U(^4L$kOjcaAbOn+;wBJB zleini4It{58N1U^GWBbo8!9Eqsk8ob!*Fh{PZ|fwG#p}>KY)}%%eQm6vR`z8L#m<= zx}P(K{pVVfjME10zZ-sv?vF+IXYgSZ14r)*P9O}23bAwX=($4dT0G)35Q7$@TbDem z{&Cuv4-@FtQb?#2c{dwezH70QU1YS5L6)vltv`Yqb}n`r=9(N*(KeL>UCFu?bMzKt zaiWwC-f50S!2=X?lK^9HfNOQLS|MXMhlx6Jm!RdeGPZNC&N>{2K~?@5uQBD<&jefq zb9I6ky*vCQ!rH??_7&zr(mpmQyTLY*A@yh+MnHF(E4km$_` zFKQ(fnRML!!!_ej-6uizG1P_~1)|kb5C?(i3Boxri{^N!iFdRg@4WDDj5h+ZsZ{rg z>AP!=m;jZ9P|40WHu%#1B1C4P_2t4Dn7r^+!IYbgwUNehYcOiB0&yvm(|d z`Ku;8vJ~gvSm7U;aF#$|g2`74zp-ZvOvk6V+7~B%aedr~+rnzSKbjtjg=Y3V)91L* zoT3rA8pu9i!s`&@7zx)`d>btNvy48Mnu|VZLrIrTSBi_+a>-Ewb8h zJ9I;gTG617V?`pIC$W_g4K}~1#}k;3roaIeheaMP&#B#H& z%<2|_g;mkuam})tXz;*hu17RDrkTq|gJ&LOx>IoBIwUyQ7X}w@cDU8k&SYr`@;A=U zl7Hej`!7dh?h|Bt7){pX;i@SQ6aIk1k#doQ6M9_#vQalr2`^UhS>e7t_}c_6IiP;p zuqQEIcM!DjPNV+?M>71mOGyNjoc^dYFa*kmOve^n3I0f4He_mq zpM56QDDjtuiZS>ve>Y)SsT&gYlIS)l>4wB$0XhRYTVHD8a6=&5(=gl+I2@6=k|l-| ztM5@9*akQaXBd?~-+CC`f@;mLfB5PsZv!IhZc!iE6E;Z_R%6BUv?YGm7w6h%c8n48 z!8n2fqk{q=v;i#-86~>7w<_(nLo(^l-P}3fAGW@;OkDn_CVKq2iOc;K#}{1~K^h+U zZ_BIipIdp*cf=XWZx6N@8y!u(x=p*_)9~dGVSjkq!58EIn+2-wysV|$CD*Keo2t#~ zW@%Qf&qA}Bhj&)cM`Ls@BmY7d@VB&>fM%6Gn=5Q==ib)hLa^79Jp_x~+got`{WIA5 z5he*4H;*z5x5+L?N^B~u4@F$F$6abPxQ(|~G)#?|c@2+s*;|Yb``Sx69e}2+@Q<6r z8}@ibb4h(|0eEUV>|^9&jy$#XF!CkH0{`5m0z5qOIdzUawVi$rUh@gke6AqPCCBq5 z>hBOqj*pjzpLu`L2ZIv|Zmr^8e#2lC#)$=dgm5R;t&8EmlO*1AP^@e027bOEo4+96 zkNsEq4d;UYn(_tmlvH#c_&a-oUnu;u;D?-WH~>B;7aRnaljj4cDRpo1(gVv@_o{+# z_Q4{B6@MTUfE(JXC4qrP{=8|}j+O257mbs6jczQg#yHd+a+cVM=4u^mX9p(`@>g8mruV-b2d=h(cohyhEpGURh^NR(bh13TMC@JiIETX#a!W^tFOCt z+0iBr7ft`xIC&Ee%3rq5o$LWd^9fkbV6Qbd4m3lFo2}zDnNjET-b>WkOr7i_CY*!$ z7%TjJ6V7gSoG~w03e#vAw~Z-!7T+}*cemo}kt@EzMwj*;%d^*vblTst$8-FpaPz8T zrf;vouXgTOGV9F%rfJvQgLd+*4EJk{#pc1_p#8NQd@F;&&1gc>*1wnDU3LMRAo~6f z68l`Rb#Iixn)1;Lu{Ssqt#BfY)Q$fUf`}Z-whsi2vtQG?Z*cVQ9dx+;z# zM>Y(q<#0I6CkI_@qPz-KZIc{5h}oVb(~aCyakWumS9h`_4aec82yQTfeB;1shdx%( z!9u6X$*wVq-2HDSit~#FK7jisNGUI-YsQL}s z#0aWNz9E~Wp9W^x$0v(gC+w0>jqn4=F4H*@?4zNxd*;X!b7W6_I7&vFcW{*M*+m|N zl2JYgb&-dlWRz**Z{Jln!R(0WPUC3AJZ-s6n-15C9uXx9@?YT&3&`!juI1H)ZI~o=rl+?ytj5f&vTPy5Juw&SW zpEDM!DxtbHy7Ukveh$LFgTk=WKy$tj6zuNzC^+N(KcKbhvSw0qPKLeHhUQ;aFP`(Kv3 z|JlR4O$@FGUy~S^Retg_Q2&VS=xdgvnFIZ@6-T$9X_etsIY!EGk2f{5bZUPSO;AnI zU_(yxKYKXHL}!g2pG(!LA8&ey#5(>S^5>KC?dyRGyMP z^26|y#1d_?Qu!ih7|*6wf_q}kpzTZ&+_}Uziv-u?7%7VvEpvl&(VXnZmbv-4a54Ag zV#{2gTxP^vi+?t^qlTr{Wt0V_QFmSy|?oRZi+ zJ?ABC&&)Bo{!;4)nf~&-W%v1HaJWFV}9ZigOFj5x#X|^;P{OEM67qrVSr-7EytL*MO{Z?{~^Zn8X>EV||uXf)X4 zY%5zc&+-|TRl`mzT5fpJ2RwW+XOcn#fG(a$_#!g8U7KwJ0sM1!MBhhxvNG6b8K%(P z75?)op~9H*R|$)0FMFMt`T1_(*IZ8UVXp}<^g968|w}dxXLexOIxmcpXExE##wl~H^tANd?G+H!Rn~NZ? z=d$}-w%@aCOTtH6!Wb4ytQC{Z-Z?wetRMHf)`WbCK4@koP7uMOP_Y~HqE%QHo{aiv z{J|L9lckHllVP;W&wMbwAj(x_LmOjk1^G4~*Hu<_AWl z8@d{0edW&zMK6BYI7#rl)-uX;+3iSXXyHT?;V-!ilpUoR7%CZ<0T(m_LnQ+*(M8F? z|6=dW!=oyezwz#wVRB|Bgp&j^lLW}Hhb@FPku@M-K$L(Whzn~lvdJc*vc&C*JGi1E zqM+h(6>&pFMMXeGMG?W}A|NiPD2gI(@cVqK`%EUteeeA~@B94Tf8OwLrmCyDy1IHj z=Tz6}Eh_iE)l{I5U>5@$E@2V+h8al(&&i}ZCrNddg4%QCG1d7tQJvvQ)iH3%lgFt} zafMA}b^K7)R;gr@O;0}WKkUt?pvAcGE=zkSQO(cYvRkhaCLSNM%Oddc~dU>`g+T@~h2gtMV?r!P5TS4s6cEQWo)BfeVlzf629pOQQo z=Cfqy4&YBx{!>ElPFzCKJT3TDz=(onf@`{X(IL)O^{w|32y$g0ki{9N@|}r!1e&^(*;0}yOF$$$)&)a z0){`4n7-FYjORh((eMIKV*RC7Vow02q>98(fr-SX_aM29$&`2(Fi+x-R^mcROpko* zNvyHVO3VjPN~%a)1xzIV&SXXd6N%^FTP5+fFN}^V4vB}utza>!^+({5TK@^4lvI&; z`+Zj8ZUCi)Os0;fFBgg3hFKeON$B>JRhCG}6kASW74=@`VigVf``S$gm#Vce<*NH6~LFb1Y=#nCj##=YZ9J58vI_; zPiN<DCs91Dpf!h4Kh}xRwAz_3<3?t_X$DUu#K(FI&7aaS;|pKMSkuT`FKL3%ah1H*j;M=$Eju%tKvs3`7vk|7qYjX zh5JnLrQaJiiP` z{ftfkfb$XHbI^f`u4#=78zrpZ6`=Ib2VvAcqs%A@dppv8I)t47_-!zhGO^EzxcDE# zv^UGLQtw~?rgw4wB)zjBMs$C7oV7{GS(a=LyQ8D5uc}sYu@&u9;#Ilil{vFpiA~>p zDZ1Nmi!lDig0s4BYTqa<-s zmDe=Y>`P>)KR&bNTYk}ik-i@kQ`@>gcl zow(|jV>OZYKm9qA_xQ#%+A=ha{w(r4m`@yl^rmR06H5S$C(r@F0|fE`dx@s&v;oltyQuULmco~o&sC#bXDRGp-v|ZW zv}K~D2g&=*!C0NKCd;eq+mj0Mp%QFiG-`>bqW4~uH~n2JQKOf@)P4N<=fh!KboDP< zIludinOKL?Wu^5mS~cIipUg<*-qnvCcF!HQlw4ckSrB5(k|#pSS>bb{-x;G`D|)~w zYUO-&PJ5g9sF%3P99ddJhbi>_F}*DVdbs3J#ZTIH|Nc_MyOM0!&x?oa5UD>-f-S?j zrrnl}&Mj@xp&PDAl-othjXZ%K)b#);?!yjRbog8vw1aM)24HFJlzQ4ql4l% zZF&*-r&xZ@ra#zp9^<*rr2E6mywj2CcGY2#CG9Oj(a=qvNFXkK19;|gC%hiH<*Y!l zI<0#v%&h%CLQ2R#>ITzoBToT6?G4;p>l-CDaw6u{@E>`5c&S9I#_LcU32S(EAyO}s zXaRU^e;%GL;BV~c&*2NOl3#`#%P)~PdWhgSetkSTL_QNdc3A-&DBtH(wXt2=0{mnc z^Z6jH@#j=@96wLqpp9;o1Nc)E-S8hieq*luo@Y>%Qi*`d*rO(B{6OSTm#DuLH6F#5jZzhTZU^i6l*@k5NfH4F)N^gd}N0{e}>GqP~{a4 z3}rrp&7F}L%2=yn_sfv^3E3KxA{WUNbXp)G!Vlq8jQb8ZM+0e5`qj$E0n!=MNsWJE zEwcZ?;C$(PPHu#r_b!Z)bBlzWDF1CEv?`KNOpNbl%I4!bV}tQ8Zb8vU7_iNd7*8&p z7d3tmTC(x}wFwd-Gy=_8@#Lov`!H?6sjjNBqty8I4?w4bbn&gy$tX5q-P0hsy7rvE z)5>4G4NBJ%7qt$gvvV7jj1k+v2YO8CLykkQIP*c=4ECd07zxT0c<$FvA&Bl!CYHx< zME>99FxoB0$zOhCIU4D73CqtgNl8Ul_+CSAC}GcFpd`^uO?Y}QM$!@eg_mN+i=e!~ zP~YN5KF-7Q|K^(w6;G~#sB_qPvoU&(8E9&J!7Vthw2qNEO!LY7Et-=A4AAi zIWN!2)6}8-s)sP2tdK+YoHV5)8Fi)2Od-878lw9G+>~)LO*g4w2&|hYMbpi)s%TX{ z?`C8O%e=u8&t~3W2a|7is`0x~p@u!UuA8X$<6A9+tv;eR@NsR$INw4TrOqwHblIX^ zHcVK-kJ-1BkJ)q0GdZhQ-_2o0xLn z<~=^o;iR*CRi26A7dLXl9;aN9Ru5|nfD=~dH zXz$}uEmQLe-(YrX71TVNWQ@-zHmc&Rr5IhqIV17pj?5*heEu#d&`-?DGcd(u+C%Z0sIN*RUD&ToNNEPVlNBUuR^$S@j=fAt+C ze(6;HU2H|))o9b}s6#`NSq-VVs#tduGL5GsuIA~il$x+^33|^`&HaG%992FFeIU9) z%sY~)^!-)kd7OdTYtD%CnJV2fF~6$v_pgVXi!`74tRP*CAhi(<_<%>1e*z7nbHs43 zlZm3!6YJP0RX&S7e4H?R^LGYQkMboiW7avX2K#Z1OFdPjUCVF8Fl;zcY|6K+QhSJX zungy{l#_sbO=*;q1|C0UC+hWnDN|WDRq;Feb?ZV3=PNy9KiW)<-+|89a4=uknLbnA zWj_*zOKCS$7hAqF4KqoOgc0G5o+(jmB2&qv-%;~gDu8L9CGkevut-Vg&CNpy`k6j7 zjVkxQfmNZ0EH>P!TO0fXYDf1;BXQqnEXi?_{x8f9YVr!ub8ZMwxM?cBj7i@N6oG>q z!>I(H;llF?eSH9%r6=2C6W0Q-!t741eof(1&HCa!nRdRYfgfMWR!H{+QkH?{b5ic& zj}Cq%v>LM^#viD0-jtc3@u8Or%)kQepVJF$feT;^|J*JFe@+27Pe7o`fB88~eFRec zR}h5csp$1JoS^dvQ62mqv_Lm9yeQc&fZRaWa%MXOVS%2P5WEmY1j?oogqkXF`agK( z_N<0@^Fl7V29?9JLqrdOykG;26cs2B;%gsuI{-}aBdhD|9|{hq543Q8s0mOxn+YHI z5{y3QOYk^9z706woJRQPanQn1DUTzmuEWRh%2~(^M@;68OgJi;LyMRJZ#a+?2%(M9 z0QzKR4;8?Gj!!7~4E15i3Kh1ddKVCEOZ5U{a{#ud5yI1u8cx+r4v&X`aGLbO@JO(P zYsm*`!dF0vaJqa;CY%97glp@4pp_E0*)#t3YK#MDkF0#79vs0R&e=FM z>^Q!9U@!X^Wx2`?WORR#C4C4LReBB7PpAKhCiJDh1K6Kl6W2g`5dFDE`qzMi=?|ld zDd{JJ|0qZiG*d1EaSo#Au{kJ*fZwuqjCgiXDoe{or_;&$yjEp zT?XkH%bC%Uk3(kMzX|NA&VFWnnCiI>zb2aT=qsphZKq)t;Kw!tjyXTG&{bK0fzZ>ht$sTpetmpSLBg8wDL z!yUe6$ynDK@F@8%TgIz|E1W26xPBw5GF7FnfWd+e>y>f{)E$|>oPrj14o^hPkV7(u zI;e`u{KGWB=_oz(Pr|MnK*L`q%brc*Gw%) zacB~X%=8IT5<1E(0YOSbZ;`ErAZ4K)HGl*K86I+&$I(|p=%`Tcr9i^^S|Amne$*>f zhVIl*A_WuQDE>+IOZ@f<2bGjFoimk3f-o2`XnPO?)4#>o{km1Aah8 z6=AU>nv(jgmzt>pZ1mcfu+anmr0DvbM^nB+!2u_a6Rh(C zV5h;W0Fib**qsZw7G=85)?8*DgJyBI3D^Yb&i0l}olbB^7l3#o0ho!RNi9{A*+~&R zMb%`HoUsM>tCTo0xz2mC2CRi8oR5E$(rdN`VW!8Jq5|zube$JpMfSjCg0Ef!VhX|G zbvERnv&sOiv&jt5=45&Ee#mf~t01t>X2Pzs8TsqHL%A{MRuorf3kO`?S~EtgIv-I= z+~G}4olnBJc6Ba;t?K-X1}||wqnKTUdpmfDtm=Hu?ojIRoqU}yPe9%>^qxBJ6RI=g zyeX>A2QjeK{*yAcb4^5R%}2>@AnSx7U`ij05vkJaMKFV@z&qGqWOeO<^Z@n9x^M!o zqEePm-wh->Rb@F^>KEd7LbB5JMablY9)AFwnR*5gtbG?jYSu+7ks*a(N!G3qew?}2 zB6&|w@L+B32Y7D}1#X1yS(nrXA(dcYH=wL}jd4vOSe$kFBK*iSlyw!SA?1u@wXUNX9j63RvX+n~ z)p`0Wz$;jW>)e2OIBV5cfMd@1gMim*aK@cl`vJd|3pn3did*ljtz7^Y(xSIN0Pgf! zm>*U8!${OBMp@ac0PId`PD3cLjfrykgb=mNW@CVdHpcf@!4!08kD&9cmy5-lTw?y9 zv)`jo8AD+fHbjekFCjgPup2$W_a%jNgVxb5 zKJE%s=qBD;cN2nx{G1uGm?a*)(N}=>jgC8Sx{5CHNlVIi2BSC27TpQ)OViO?eeJrrw6W)?;tYV4QfS~`^u1zML0jY%6AVC`SMwGwa@hPkqf}} zlps#17=tJJj1=gGx(@}i#y2?wWrQwb^_~~K;woH<5f{DR_XtH3UKPy@9KlK(dI9|> zS|>0rla=MTjYb3WAixRTi}@m&6JW*M(D}GV>jt>tiiL_PxfoT4{MBp+|_EDAHz!CbR(3N02$8ngfB9 zN_{FrM+X4uFO&r#>@rmJlmHulVd!Kc0|i+eO2eitI#}42g|=X;ga^AErz=A9{seNm zAS+e)dSs10=nHe=AiOyGvcCWw)3n?xe$#SG$@QAwnD;4EG5WfHIi$IvPuPra_&HC; zLTyNSOOSY|4n#)Z@zd7%pV=7eiSE=CwnUJHu`NL?w zg(`d(Y!iLR*BL+c2`}^E8Q2|I%8kL+*{)vy53s%Jn+@4ch~J@$uJ_S;b~tVHT>&H} z13mhNAo0+b=Yj2QLGnW{!=QLDM(Y)Z`h|dOld)19DrdDn7Nl$FIZ{3qq$ITE79cw% zPig3ND!NN3Wg)Jh(LFMxhKE9pfqdcP26I&C$96!z7D|PDTQT~LwP%1;8P=k=4)69a;N_W*PwEXLm#pOxPGoc%R-rrfMf`=GQ{0( zw6>obtO|{#fNW{gH6i-rM05Qdy6Zx8Qi;}+Je%b6jM2CtTSD_Fx}hLDLNBnUO+~=2 z&^eTrFUa1|TvA#{-}*X~$2=!U+aCz+AzK$g4(IJ8(p?ax^B$&2O9XRt-Vj#2mtd~W zJ9Ra%exhDX=kc4O(US#>>%0(K>{P+>b>0~)txU{PsPoP|1K4S%$Ll=aOyC6u+qOjK z@zbr*;ewUwyi-``Ge!S0op%MXvjrQX^Ewh6XZpB~UoibV6&)|wD4ll!%c~HqLg!5+ zHc_ytD4qEx3pQKly?G6=^98HadFOFNP4n->RJK6p@hha!8GiO><;y#r*jy=nxG!(T z&A_gdfi%jOm(w2DRc2WE@?^od(a$wvsxOb9SB>6e29__6-&c*^Vn&uPuQRQ*Sg-}Y zyzgoGy98V4%UeL&QYmk-PX#tWTC8jZbV(sNJT`O;`jxW}kN9K5XguXaJ_URRVMlJ! zVrLR|owcZc>}W5uSLIjdG#gR#_fhC$QH8ni||Vhojx8LeiSN~M&bL*;|c z3|u2-Tf$W==x~_~I-GKY&T3)Yj?SOb5xp=!`#Vlf&Nm=tA2^JAYgKD3T*9&sa_%+X zjL$x_6BCnLYr4w*Q|6TDSe30cC!RPY-iF_Xf#@2UPtzYmi7K6&51n2I)%2TN*kPcA*VaHvFi;m_vk1qdDYAB%H8v!$3O!v3u1J9Mz7whijiWVX@pMCvb3(5r zizgouxR4WcdZU(M?j3UO)7(6`f$Vn6K}o*?MXK~dR9vU8K~7(~0_;!U1UQgh03~av zz(ACeT{;W=0oo;d9IF-B4LR9Ytrz)k;wl?8S|eL74?qq|evG;9BkR>a2wo){q#df$xpux^=g;?2-3T%Kne3bHy-?f za<=`ZhXAG!%+G%RC&01^&;CHRZq7=U_#yRhoH-Dg{RwO4I`>e@Zk8I8y=nGdW{smd z6o)S)$u)py)Dd>S!1K+qnZ30(@Kl10`*lF0^w7PL&;%}wJ!sXYXFrR?685wvGvPwg zlaOkb+8-@9fW6W`3+zqJ2SSNAt@=P{Q}cn)eMnXLofkpQLhU_d{SIA&e|pJvc)HSj zI=oR9YRaC8SNzQr*j8XIvQa|ekG+H+p#14q^%sC!o`8!!y=4J^PHWW!KkZhdH6>3U zo2QYN=QUjig|%j$*32RN7342C@qm$E-T*W(wSia7EEIc%O`n7G!uyhub;-!iB&498 zE%!m>nJ2Q~8`}o{2o!j!C2j^$f!N);W!84Y=6Pm;g zoeo9?uiEs3NH4BR@9>^Yr)nMcStQgDDtF}TBYpA#o3;Y_@=q^$E*r;Wc)zMo9)^TX zP^$=)IGGK7<5O@4>qebVA#KjnK-aDWdMc;ldx*-h{eh%5cn0WaG)EcphVUTb1a^zj zKbdB010MeAX-A=5E4HwIjaIGL%1sHdXY>PLvfXa8wKBPsp57^DvrY1{-RNao&1{{^ z(2I6~saV1p+|4%G213CP2aN_f4e{OqbeK2f&tKTrNG?!68*)dGuk*;>kxx~SZOP32 zh(|6;YKO`nf+7Y)NM&i3}( z8r*^Oe49QO={;@w<4B)o(h-W->W1Qc&hzNhx_ujZb+r-iv^ETQG}UAA!Q%>oIt;gh zK8B!zOOk55T%^KY-Z3-|66EM|i)CW(GTn9v=BGE={;%rak*f)M(W~qUUE$@oo{L}C zF^EpHiEBVNydKdX@P55pcX8zVlra7}mbQd|-OH@-$!J#o;WSq+UJ63uZc03iRxOsX z^f`N8<#U*U*pI)l+2%+lWJ}iy`C7dW+7DpraV$g0JD?1DUaOMr0ImYiv*j_MWy*IpMHLp?3=|mMCv1&CyVy|YFqiceL zE!2)J)D|tIvA0zPFWVgauz5Yy!1MzM1i8Sg1P6IXAF7}{* zSmFa9PDn^p19(%0B@Ht(HP=_h_<)7L`I6Sk0cs^FKTj%&2uG^GP_# zR8QtoESyCkM)*7>==37k(~te(j}+2ereD`;@;lP`rAoPw;BoH9s)xEYzLtFu@lex z)tJP^9iJYf@2rPBhmqd*MX-JkU?PD2q?Y&~Zzr&lGyu(B0+0isKY^wI9tKdj#EN?# zDil0nk*|OZf?$~3oVhCa%2G7s&P}4AONIP{z1cu~KYJaryqxejvM*FYJLv7Az3Z^4 z0_r7ydX9dd)!>xA8%oKP9(Wl5r}Sn3%wqqG%?IsFzPZ|0|8I+ZfASZ!vZjqf;T$m8 z-c#V2ycN>hOFF*lv&^RoHrfm)fzaO&G&<%-HhBz^E3BMZkS1qi3wK-UMW7a>*m~az zAO2ahrWpUd{J)zbNM;%*ruH*U~QZ+GR%6VbUZGzPyr8}n%B{^F ztB={*usolYjOyB|{Ivd3Y(W^536IOzIF{83nX%L+>&8=E653 z*+*y=mUprm%#c|1&*5GnSuB0avi=Bg6U3cEHsAiJGWyMB=V{8|)}iXYSe4PyFY6^A z_fp(Qm@1iEbo9$kmt5RFROLGMZn~_~=P>zxF*)}PNeT_RX*asb3f6fUDRLoZS|R9! zFtL|4{R(v%Eq#^S0Ye*nS9@fAkn2%ZHZ_QDYU#td+;hH^#!-VRb|LXK*$80dm`aG9 z2hp=Pel1&o3xH5gR)bDlhK~FtIXL}`T~!&Kn^Q~WoiOKIBjqOzrm|~b!1^`xHRvdu z|C0(B*x?{ZK_4f6Q*YBBV(3FTt^GG5ng1mRy8Hz6@UlIxpxdTPU*SY;s#~_^6KEQh z7wMdmlgcQYgKklOxY&o&gvl_Fr`qc`)|@M{shR0Rr&X*$aP+RPHzZiXrf0qrwUH<kRcX#04g^(f^ZQ)QjXP z$J|!kFKQxM-TFl}Vh6B(QJ;g+^NV^Du;&*w8qc$;{G#~c-1I<7M4X&{GZYab`ekb zKc%%j0NnULrFA#~W)MGvv`z$#|5I9$|5I9$|5I9$|5IA`Rbc1C%`+g*dSxA8a~ZEJ z0gYGIPMX1ZWo-pm6aG$*psY0UcS;j~r!?_*N)vylH1T&z6Mv^P@pnoSf2XwS{!SAi z!umVyWwFNJX%ovb{!ZJ$;Q2eP3fO99EHl+K{!Yy3`8z!WcF*65>UsW7LjimKPNM*O z{!Xn>ZO`B76{LIqPL%2SJJkk{=kG+=^LOe2e$U^Du;=eY*z1k9Y z;qSzHdHzmaFw&0W@5E+u9OLgq*z+jSHX+h@&w4uwXf@-HP0l-wYrlj8QrDm!OuEb9P&s>;A+(VBMcM zDSGZtoJXzu)5`$CW89yxiB+}X{uIM(TF1CQ325A(@|ilF!(s=W6O_wYnu(%VE#)#h zDT1dcmql`77QD*+Nv3+^{`9?+?zV=sX&z(3{b>iXTlc4{K=j<7qIe%*-Ji^OHSSOB zO`iJ`VbA@Eay|Daj=#ED;{HS_p8HcAL+F3v{?rM1%T#T+KM{%=_oo8Lu4CMvxb&f! z=Ah)7aDN&ErZjPXN~`An)D`L0{pnnQG0*+!P9WLh{v`GD+@EG)f0=N9nhGT0{&YVw zcABeiDh{1PkRA-?oUSmd+tv$ljYjx=$9N;B?H zIh193e$XK`qZkUj&qTTGAheSgHU`>;HV!(}GU(7A2*B^b z1dt#lwM$S4fx=RQPJJMBe;SEj>;6R0bAOU#u(ADu4jly|S(1;981vkpmLlDAe072(zq}21gpk4(M%fmE8FQ{*TcwSIkg%e&-B+v`$3s@xf5)gVp zwTqx5S}!PR(BpbR6@e?^1=S5m!V8M|gU*S#Mh-xv=LI!{Jf0WSav+`;lLJwgzwm;h%@STvL=s+5W1wil3#vbCknn;c@?UsCu|CK5f?^vdyr78u zkG-JMV9}W81=SAkL_IGk({k*P@PabtJ)Rd7r^|#F6p@4%lrgXMf+CXef)exA|2JMx zK3J=F{r|=bieeI8P(+4jAIA%dO_A_|x&_@N;RUq|NWu$>NM-i%yr9ycP?Z-{cbF(I z;RSU!w&R``lrfm~f|?`!(RxAAdI>M61wayBP(%`5P(%`5P{v^YGcPFSIldPZdr-m) zirdbF7ZfSS_ktqj_+C()W)fadrVCmxs2fm)gclSSqJ$R|k%Si%H8{Q(6bnswK`~Fl z3yMg>3yR49)C-DjpYVbrayY(|y}P@gh|+QE1x3u!aq9&|%++!01x58@I&Qt7h{bi> zdO;D(*Kz9wMY9y@xb=c!%M|Ol^@1W+qT|*JiddkruyR63rYr-FK)e{WMui`)(eW*0$<#EK@nT%iyzkuY9(~> zyr9OjO^g>5)%U!h2zy>oggq}P!k!ltVb2SSu;&Fu*zE_Pn4bqFB!hiVH+p z!|Gm84Xb-WH9Wo-6qOG;7vdUW9|<~K#jvM=&4Lc6Ts+-DZ-Ij~sGb)TEn~f)+TfXi z%KEz(R2@7Ya1rt+`%jruvc(IE6Hgqn?!<2+dO>kMO%pGuH1UE;tL_E$CHR64w}74( zR2&&%o);9?F3$^!aKa0UQ+>hP0NFi8~)96dU z&IvxPa+=U4%3;YXRYyllBMTwuH_8HmAdKWX*Rt1agX*x6nz) z?NN?A#3)ATEVA)>bn!rLtDbnul6E#URcSlHq|^4|>PtHd3I4R}aSfymLSZ%1wsXgo z)(_W|v~R%Uq}`5Op|rI~38$6e8c~5I5Sn}90LYAGqu{BzTDy2c6Z#h(2<7_aajBBM zRc;M=r0ImF+zd*J=H%&yx$(KDqB1f5GfGQ}T5_IU2}cv$Z7cs$0JJVt7j z#K@a!sPYxafu*eCnQXT}SGK`(b-|l*S`C;!_xWjn<<=*6t?1|6NA8z`Om?m&ypEM~ zorB=deU)-!&U;LM{X2BKy3W%~-^9Fe#BgVS`Ed^A6D-XA={*XXav72j62$y=Dd3+E zi2UqXfDbXCRrpaXXSo~v^E}cLkKc$AMXWsL!U-B&BU~hE!f}*e;z<+7(KK-!O%eNP znN&yayEC~H^BhMk ziQ{ORIF6=?<7nC;tUCE=;y9XC&2jW@@LR{xT>w4D(dJk>Wz1xMV8*a<9Hkzf<0xz9 zIgYYa&vBGl<1himVQI!SoYD!y`eZ#;tk@Csln*i6ySmdPuNYkMB4c zeZooP9}Wq{y4w!&XLm%hJXTlE`AFA2nAdS$V0sB**WpG}_aq#1_K~L-;kd)Cl|GSh zzQawI?oGH*1z3RYb0OsC#`P)rxe$1i#h*%0Ij2zeAg(%&^DyDln9p^ZG22i!TFlu< zcsSv@s5oC<1bQ>+oX=T0#c#VPV!(=11*O9danI8Fz`=gAD>{6TnvdAcPcCNe9VWh$j|SFR^r0Bm7f z?IC#cD%WY#9s^8!d`h{+rggtZmS)`7Ac0$qW|Kz}Wb?KSVGTnJGBM(0rMqY{qu2sy z+;ldD?39g>?ob~YQNx|GgK8_WZ+A+*W)eN_GXu*v%RbY5%&6L(%lw5x@Lm&VA)SAE z$)yn3UbHF{t@O|iZLlo`KNZtM+K--&P}glGw;rTAa+%T_{Riy(W_U!%pI#EogTpX1 z+vun9JG=&e;gmmn32`_S_ypw?Gw9#czf58=y%vl4$;D#$mvvSr)VJIhfm=8$11C!M zV>wmlZfx#ZR4{Hc6$>X)mrQ~lU7*J-sxcXAbd~zdV)uIhXgBfJn@t1jvhD>o|DC2# zdRe15pA(1Ow$g6k(WpsT8!R9-NKL~&K^>D_!&}MoXa=PDa zkqut$rcS63Q78`4R-NL;PH|H>EC0&gw}4e!XLI~h*jVP)xT)F#R&6wj=)%Aa`f5%C zcLMFYmv*_v!BE^v^ij&XmekbOfz~JWI-L!0nEx>kowZlWvF#Kh5zNak}gyKk=`CcfzEyRPHXW z#7p~99E?~d_a}ixt6rX8ih2KDO`(BB>t3GUZyT+1pY-!ao3!dDADUaC`SAXJ;QhxO zG5vOm(MR=bi2d9o2zgQRz@hTx`8~$MQ`O+#GtWYs2UCvxwL+dA<+H)`x(w&WZ(x+% zZJGAM$aH){--jz4x`l{TMJp}+DCiLgAbkdU)GIbU9g4Hh&cJn$FLV^ci2=k__e+ul zA0t#1J!gkuTjU;XrOtvc^){P60O?nmbTJo8m@6fq?4l!fL<1x*DQL`jfU|mz%%3CBq@6gk=g0*598qcUToKUnO-vM+;p@o^Pij9|km}3Y zH51g5(`_01QEXAUMSK`%{D^>QXjL-Jrn6IYzsn+Z!2|}~fu=9PWHN-BAEM%`EX&}; zaN5xXlZhyPh^x`VD7p*vKC~Ql3%!L2;vdZYD|1%>?IN`h^eLbNP>J6-iS7r|OV-cd zIe84g>Fi#zjr?O61YHJnfXq^VaspmMs_X&&BH9eEWly2s@d$MyP&5UqsB3Bs-Fh!a zdU5Z?xT-$a<9Zd};TCM!YXrlRO@Qu-L1 z&R&^gRp|m_R$4jU&{8G+ER}t>$kUp$+WnT*DON>KTP8NziwO~``Sc`ZNO23BW+I zm-Pa6Ca|(o0L%k0Xr+~QGt}T;*)UL^2BrVomf}sJLr_xLSWq+Gx2wu8mZP)DipeyC z+Hh6r2p(BjMiAh_G8X{C>Dw%9gmz%YY=H@Devl&tjnUl`X^d{BR%?1cT-Y&up0^U% z;@&(-4(d=;k|h2{BVJ}&*&`H9wA2yE`dktfAJOxcZ%jWpozeYmpJ~>$rVvpP9@*SS zx_(3Y#jEs^z4@s0I*{&VT{i>xn80=bCv1hSKL@ZFK>tdcb+*lVx0mr(P=&wV2UbD} zfI-LdpGHYV*IOwcLbr<{fkt4L#~FZ+JqPpdOOu$A81{G!kkdSg<<;tPHhOH`&rV`W zlJl0wpa%a8om{*3J1=3A6Pv>(HPF+?vPQK4yhi;QrW*~Csvxv;3uKz`A*7w< z=OkYL6Rn1x!3~+g87#c$YMaT$PHZwVaQWb_oC|dK`z^5}h@5AUfh4C3X3{q-t<;wG zYofIAQreJ2X$F_l_SsBBA@Gx9ORJG$^gm8%Mbm2-8Yl5uFoqeX=(#qXL$|f0^9Tc# z#PBV8(o!!*aeZtq)T?BlO_vq6xz%YAm}UtRz89kw*}aMk-lDTYrg#=}%ioGQ-%?r3 zqgBNejYu`QSj+~K9zZbkpz7{RGZb&ZZpQ^1xrew|E#|fNZhf!t^G>_puQkwSS4u-) z1FN3G8}_l*SgVjhU**38JIp@UAbsYi7!wKL7Nms!g{hisWlMpT11oz7ztcQJZ| zZ!3J1`|LsbcVHN_$(jhb{0XJ#OD=Jz^U=n9YpSTF>qWlWts$Tgw6nlA=vaob&Y-Lj z0jKamhpK5xU&zvL@tw-d!;v2R3bkiq*%)BsfR#-Fa5n&)dZ6B$ZCk8k&RM?s%t^fi zUn8gD>O*WGFwAflTeEYqxd)u+htj07*yO7s*VdDJ)4hg%%--}YAKMx`G@QJ|(h$I* z5iC{M9(S}|P8GEao4W8$)`uHx6ynVC?huOxTPoLx7KZAn5LmR3!sH-k(JaeHRr^)v z)1|8DENd`odV?V!qv_rMS<^d`gls*okQM(~NRDj)R`*9EB&oV*S}OJIgtNjh#xZ)n z@SlsgDoMy?#}#tIzZ0_T=DyM=<*sEGy1>&`7VZDAk#$`A*QjM$k&6Ft+%jkXyE3b~ zLQ#^CE``Udebav@2-qd1bzyiqa3!wbSm=e>-}}wVZz~d_qu(U$oU-QaRS`#QbhOEh^g*_ zSS_F_k6ar$QA=1xISc)xJvr}ta(?mT#J+)?Hr3?>Ide3^6gOlS@?V9_=F42S`ne14 z*Up7d15ZY7RpM#Q$)%{DmBsaMHL_AK**;Rcq8BWc>+4>jVtqZUYJCm)w?0}m#IRK^ z+K?pg&xAZx^jDIkrdT8~(}nzl5|Rev8zE-1UF6v1gc@}hPI+Wf^sb$+s7uBFN<#OK zEhiwFHzDQa(-xVXP8g$&VlfiLN0Y1|U1qAhlR zO3r=NIg5U_wDnLR1zSQYAy0*TP8(H}Yj-f*D>W4=c4w>1?yNu+F*-Sb+&dJ6a6cs^{Oi@JQp`-jJrp@uHwXd0!{@q@do+f1K{d<%}DdzgQT z=JWlKztnzDW7z1=;d{E09__<;>apHK1cx68fOo4uhOI`(uWVswJpUu!@NDq&*>k46 z;iPA0rd)=xsn1ybjJ!i*htKSZXO)Il#V{i2ycw-$-j0fM?wR~pM*6^YNQDb3cH(C- zh<1I&Alj=Sn-Biv?SG~eHR7zd;Qh2AKoa-6MiRT1I%CRmklF=#FKgcZp3M(+)Ev^5 z39No5pXX-s39vwF#K!HYSdQGC@R6Po#@hik;<*<<8sg&<&PgQ6h0ho~R|NWUoPFb0 za2$M)&pWDg6h$+cG4sBdC7h#1`d))BB~)XzSCkr2fqLXlk^7nVnaXOJH~bW@M*Ot` z^f^N3^S4Y%9mP=iBl&TUw2M$>#V0A5e3PR_nnRnE!eNtCpOJlT2mATt;y&F_hJnwR zbtJ#GQ1cv00#jc7gmPmA^cZTOhgIz%<$xO?Wln2;VOTom&9PyY;n+Jk=Y( zw1;FI`O}>!p&v`&jkeK`!eJu^M>)+mL3pof3@wc`auduGpUmp=7OkqfnbNgJ)LRR` z=rc55hI1}3Iax<}d!I?KDm7xoPV|}^q(kw}%Loxa^k+a;Bi_FrLM{>^9IeL{at4nD zH|(W3%8hKJpE;39{kSBF=yTL)zPY3poV|=shnQuF6xVVMYMUYtz&W*4bt^T7$9U5Y zX3}{v$q1@uAMD4~S6JTdvB#5pBN}{n?CR~py^viAe}_*)UvX3BcEgVe=k7&(4+K8N zL#5*%i9B93cpC=33xwJ*@WTlHoPuZ4^8{ph{>w4*C>sV|KtAI4UpWb>HX?i=j&l81 zk;vfi?~+n2IJ^im!Qp36m`ejY(|Hx)Sj7G4WbL}1Lr1RFwjjV|Z|=4fQ_ z1JO4Xk3v$q609CQK81x3!}{$!4Is}%lXn_?$m~2d8LC?bFyu#BZg~I0U<~*1;v$mT^=_qREHlX({luZ4fSp7;68u7uq%gPhdr{sv(BCf*Eja){9_=t+== z7~Nt4d5AH+^{-%*LyYO2zM~WzV!Q~FT{*<)${|Kq4l%lNh|!fpjIJDFbmb7ED~A}} z>W3J)DA+@c%~`BD#JHPfnL~{CgCS&tw$Ec5vYHvoOf}6RMrL%vy;6~WzqCf!1Z@}f z!X{{YBZ#RTHbL790LQ{6X!|tejfYLp_8XC&A2vbTDYGzag0}N~XK~mBZ6{n3{vi!z zJx{}yhE33R!ewC-w4LzqunF3}0Q{rE^a0Cwm2gGa1Z}?@Rhg>NOwe}LD|84{1Z@wY z%Y{wQb~cj=V**Feb~cj}HisAqyWw$6|4W)LY=X8Ej)(7ooXn$y^CLEBJCVZ3bY{?+ zNO8mlZ6{I^Im#>np_E3jMPSf&QpzGWXgiVN5eI4_XnRj+I4Y8RDUh%}2}nhxAG#ZY zwo~D$5gW9f$jk_C4H&eYv&-zrO+>O}I8{b$(Drjcxh&EXR|IWmjPuJQHfa0VKo&&y zGfxwJ4;U6kY|!?NKo&pPLx&>;rO$F8-5u&WeKnoJbMYN-@vCq?iSmBJ!rp5*lHSD`q5 z-0*vxdBZ%!82*^9z7W(8mmXCaZ4CE%$ZiiY4h1n}W4M38>>RIkHkt8i4l%MfIbjpS zov<6myF0{ir`%ZhRuorf3&)>5#7HUeu!-Sbj^wUk6T_WmED3+cs_r7(J3NnKKHmtq zG;CtH2QYffAx1*>5aVRBnL~_RiO@{_QA8~qV$1`RD~A}}YKIs(2<;)pjsO#f7`eML zhZv=P5gWt3H+FMQ#Kv&%4kU4iaRxGkYz+4g0EbNs_f&5G!hD{ewYNQBH*8|KpMvVf z!X}10XP$VNt`%87vx@m)6T^K@h%=Rm;m)!WhZsMD{IsMP?mw_>8^ir9WRh7a>nhGl zDr{o7(~M5o#Be7|YS_eZXBlqT#Bg5?I2Im%5W2403^*P(G2FidoF6tZ+=I}gkQTjt z8gt4aM)zSP!n>WaOwWh&E#Qo~P+%Do=q8!9B^y2_Tgx77@e!YNRJlFFpYz(hdC*G2FTQ zs)&u@P6Bm!5{Ze^i@zb!JH03^8R0X1#Bi6UjL2b>TYX2s<%(vA;U2&qBBs(z40q-a zI$;L^zBQ!`<|AdwP+G6X9WK#BgVUZp6lLFUB@I7U2Sn z81B?7j)*Ck;Sj@}_g{(Ai*KYtw2k53CXfD^fwb;$`(fE%$f+_^oAMQjZB zH-N+=HikQq{0Qd~#Bk?iQW(jk1}y@l6h~|f_X|IEm)}@gr$ktwv0TCO+ zoi;0r*ck3ahDSPI1h#I0=1_E0#Kv%sA!|j%#&9PxHDY79Q}pbJjp0sYPQ=D=XMHLo zHikPX3nJWNB8EHLcwyvZA_E0k9I-Ln$+j$FW4IGp5t+v-oGx0gRH;0%h#2nMQehs# zjN$$p_MoQaUh$ijTS~6i{KmZY^de^yH)3PBbDoSvYz%iI@kkv=K@4|eUVD0xNMXdr za2NA>G2G>*L+6!5Yz+4|(2|K5?o^yH+#@!IJMjS#8^fJq$|8SMqO`B2H1G5x_tv8# zQ*Q#{dq10^A|hwee)OLS;Zq}Wtm>fuK_Igua^mV2K@z7IS;GY~AtQ$SHn1&JsXVcW z816OjQx(H~T)Jnlb+)V9(~Bn}lM{)~MxOOPTF(xrjlO|EVlvPX!<|SxVq>@y$&b7Y z8zP3gF_=BQ$Z8iyYz%iIT_ZMzJCTxzjp5EbrIFXE=q?#wWf88Rh~ds2G(2KsxO2Zb zDq>@}lTs0(iy30LQ`*#sjp0tp?1+uwPD*9O#&G8}vmjz)xSK9$PcIHd6&6Q6WCw8l zT!EHFG8+NO5M*V<#&D+wt0FdrJ4LUF*ck3CbX~;8aHoJxk+(w-5ElVkA~uFQDLW!I zhC2o9ik!oqn(rsFH)3PBvu}MJu`%4)_6H(1hC7i&40j?b5yPFBlZfF?tSW{()vJo( zPAr~?;Z7_+5yPEksfyvwmMKoea3@xhh~ZAGG!es{`d7tpCsq~1ot(oHG2DrbO2lv{ zR*{I|POK`1JF%)5?!+n+G2HJ&Q!GftaA$w6is8=Et75owAXUY1mtmEN;m$RpDu%lZ ztV9fVVwH&)?!>BMxD%_2;m-0FCt|pt4_!hwhI?!9h0WHio6ru$mdb83Hkk{A z7sK7mS&10#22I3pHz;Dbr%?*NCj%)#r#r4S*++s7S22X_g3W>sr`({!?~&p>Bd8(9 zDn|@=S|)5_xVOjC1Ml=AXC_BB9NCAm@u~y$oKIajz39s6 zMc15OOtmrG{|R!?;odLR#&G`%DT&jIT)WH~8{nrbmjD-TkZ5>CS)c~FK!1Cv8NZQn3BB}PA^g$Ct^=8a`JQ| z_VglWiCDy*UgYE%kJ!_TFXB03e#D+$d<{sUEX+8)$c4E$Voxs;DUo#srx&@-l**<7 zrx)1_iPMX3K)~=wr|sCZHr6tbBlh&-2cVeKiw*1GHivF#xugfcBtt4npFKz^=GT08C0A_oNj|O?^ zZLm1us|l}T<=n72y-2ySFq{idXahK-s!~?Au}`zZHCi}iz(lnUL=V5 z?Na3Z`B}hD*qmNux*Im97g<)!=yO5~mj*kD@Ev(~Dxgh&{bXBoMh2dr_QTB;rKu z=|w8&Mtb0i(~F|HOd>eFNMZ5FB$}y@Jk-pO*wc&aKq-toP0C>XF_7YjJ-x`ohb0kv zdXa|?OC!&sG@M=}r7V&)6vz~9I{C#90-2>7gKZS5#+u|%bf(-dAPx**u@j5Pm4_Ev_Q>3G%YYOlhlHIQqB~ zNv<4ybmi!yD@Pw)-q8A8Ir`{UJNifw_UI#*5qtFUC{lw?4J~>Zms#U50mb21iCo#s0=G87%y4S~I(g7315-_| z|4n92o}uFP8s5YL@9BdV#Els?QH5{n4Y&zmC%o+hz|9D|;r1nf^9kcg(f8d^x&E|S ztw8;Ot0BW(TZ;XxJFP4Baw^b?^uc!{J@9K^fah!i*p#5s^+(;7i*i;>L;7gxFIh7Y z0jB=g9^k<&*Bt5P{lMvlCou1LPXDp+2K>}Nm#r5MpUdQ1 zLR~AvJ%d`+pFx$Eh3~6G`b?(pGLK9jK(aia?4fdF^)LJuXn5a5FwK^Vg|nvvzKC!j z+>1(FOj|kOE++xLgtku&PhB5s+J-ofj$okAq;knF<6Z!f1IN?#6HkeTFvA&+D)U$zl5L7*K^jYfYFP*a?4B zK$s6(+%Wz53>*tjX+xMg#!<)(luU7X9qs^FD-bVT(hyk=poYrrg(9{43&=kAX25=T z33_S3ZPkT)r&;KwL6@&)Q`~Mycia`QSIBMA8EU!pi?EWoUBH>@-rW*1MZiiM) z-OVVgnfoR!>K+B$+mpYV_gC0_opL9j$XArR4P37(cMghsO}WF6f4y>l2K(#EU4^=AP;M)5 zZdC3v&^9S|6SBX7uxBUYV<5`C3_ouvw=GKF%$OQVy{+8!DDxfVmg47K<&K9HwkY>v zDD|FlF9hfN%KZW+*s9!HLHj_tt6_?5$cLJIsNDB}ZO7pyurmn&<^B%rW96QU z@;*`Sm-zYAc-H?*$%hYiD)(jR`I&ORMuuI=Jp;PzR&H-pWsh=C!_Vi+9fO~}%54bE zzCb>x^rdn;Ly51HI~>^8P!P0z%KZ^~exuyQkohgF1kJuv?jkhMe&z0i3BFfuKN#c( z<(`QaJfPfN(E3N^?#Ith%AE$E_agfe?KVfTcWd`{m|&@PM?vd*v^xcy%d~r_ z6V8li_c=76XULfEs~odnCT(QW`$c}}~#AnbYVz6&K@fG|{gE$RS0U)1hp$o`Uc zw*Y%tyO)EuPP;49iKMd`0_?a=LhX(Aj1Le_Chs()NUJ??kDYj0`nZyZa>g|)@}&h`xotg z4%#8@K7`u-3iCj-!x~}zP^FlDZF57+kyx4Zdb9AI10D72W(Al9R=t6+i(}s?NMEP- zgFhc9O|IjvvH2CdnJ7E67SAH5FIRjO{EjRfXbt+>B|f@(}scZ}72&bFF(!dM|kXgN&~xg#4p2pbh@;xd-{S6)!x1U2w7GZU^q0J??cj z@mTJ{MV4?HxJB-=f5WL-jfUBEiQi+uji3DC%y?s?a*3#1=Uc5>sIox(Nk+yLe@i8Rx6Qp6>_(i7 zpNK+>>`J|;Mjx-v!RD{x-3aKFv}bgyLbA^(eapi1)B z?d~L&M$=#k?4hXp^q0uS!F-<#=H-|m z^nHBI)T>QjfGb#|6Dy{pZwuI~Rv$05*9!7Vs%mx#W+}Z`r!+Id7K^ZRF%#*XM~U*z#-PscK;OY!tap-m zF44CWXxBf0RiAeza#?uGz$3fv}p#E9;p&Krqd0{!$}q9^_Z^pz5zUl2__ z0`y+a<6rVd;1!~oM8D#F!-+?M#+mo)H^BTY(MhE4V^dTrpDLMofzsdbhH;Nzu%lp; zG-+c!;vs{2)JmUEbt%Ij&1jAewAO{h@Ayoqw|Ly#w$QsO(=M-6=*@wHX>Q^32dgCa+vY~R5gIz8kG);Az@c)d0>!{3)^Ck#OxA>de> zkCYBYmc;YZhJ+d^2sxKE5<%aIp!PNJ$)_K<&Bk9H{PY2X71N<^%%m3@DItIDjnEB$ zUO8O~A@Wv=l&K|GR+{r5vcoktE2mT{K&`rr0yhsGo+Qy$>T5bNtN`~(i0_am%lF5? zO1aQ?Zeof~mGV&UhWdAu)App9~bn(&yq{r?XA3 zM0(p(EOHll`XAv+tzIxQsT3b{MHNH- zEmnYSn}SP|n3{P^yN_Y&kyO?IkLj3J?l2&UNs1bHOgAXKqbY8T8ydB1W1R3$->vU2 zM2kHJ+A`Rt^ZfvthkdHwv7G&%17$iW{nrCnlLp{j0DmCjSpSa!ycUIJAF<+Ty65p6 zz;r4x-Hto^N{RTm+B+BozjpYw_0O%{s~4ERqxP@9Q}S!;Cck!>p&E8<`rmQ=2TA|6 z9H&Rqx|HQUvh88{*W%aKo;vOROI`l|*O*#kqx+rD-|1xRNAc&cV;lazQ|7zdHuQ0-OJJt3ho4gsxZGTHfbfzijD^emB`3XotcZ>W5pelGUDO3CEnNqxU zr{K9HrgN$@)vmG*CRkN)IEnT0>Z}bC@|xRS1vOn+ovARvG%1Pc?dnWD6HNa|VhXgc zR_9Gi6Lqe!Xz~180;qJ2MJoWPf}3qNE~L#(wvhj!L{(&~RB&d}9_Lh#>6jI;;6BUL z28}VpV=BJeE80l%hAM6SkjGSU3{#yXrguE1WydfzOkz6dG3_{p zsZA17439O%1R2Nlvk^&53<@Yr#rIaP-A$H>Hx_3aCRuOH=aE-gD(@|3B&e#OYp$s- z$NN&7ZkGpjpI3l{S|}K0S!tOUJuN0IF-)r9(m6x+ovV8Mcl9Xon0ps0uqE7pq&Dt7c*K)mYpqP*Yl+WVZGpwE5E@ArJ(H-DV0 zwb$Bfuf29XXRq0-qoRkcvvf)BR@p34np4O?zYyMsRqkjim7V_|i751mSmhUiJL#xL znNP^Wu8_j7U9+e$(?c_zf=S>tVH#;I+k+1-{WW0~2w%E{_4wR3(wC!rrVq)&do`+O zEn9)?%QS&4(_099A(MrBzR#ZA1B?}`KC3gZ%Eze;VQYrhK5zNRXS(Et9{Cd=`8t<8 z+9U7xksou(M|ot!_ulfJOYY{8vwh@WTyjf~TUfb+0aG5&>7f8@o7WV`&X|m{^27RyX3td zIas31!rZ-G^4~mi%tt=XB|qztOMT=sUGjq-xs#84ol9Qtk*j^=$6WF`9(kyb{GLm` z)FV&!k$-W?nO=LJr#rq!qx~+1TSsqG*ol$WVb)wm+c;3HhkWh(2y-` zo#1V#c+*{{c{s{D`K%^`=jV@eWLGcEc$_eBRb%FNqwtvwhFzkG|Ju2 zMr`(96jRuG)|0B1&Op(2XOedpvT7@(NkQBZN%JCsp=t54!d|B=MB zmJR*(ipCPhdKDPqW7^!9>11z>Ia@PvFY<=RWRzc~(^;{fTs1EAI+Ci`1|L&l^?y+N zZ9X-ID<-%0E4)oS-hvN%o7&-%z1Wp~!(j?+*012y{xVOtQU1J6r}huInXf!7v*UX; zf6vQ|o*cHuy7uW>qM0a38h5X^Jctc&&O}G2LDypJm~#o@@*I7^Njlv~Ti0Nx_^<)0 zG3Xbpt>(GCkb;{{?o@*$D-UQoJ&EdEPRkf{3-mExoFSa+H)zgka_)er(_PMpF{mxN zruoJR!da&amU!|lHXIwmc?xeq53ALCT3`Mvai3EAfqfwmMML7LxxA|wvJ7_(pV z2VMcKh|XF=%8=I_YJHSPU03K^SccMZ%$&&#Vaq*K9ZC-}H_<(bt=oUScwzFWI<_`} z2i>dGgV~KbeW43ar(@#uc{sxf>&4TPUqfQz>3JB#u%*Q~-&+*83(|&%Z-V2}+NA-w zW00Rk#PWd|BiinSn8)R(J{*6_<#`M!#)zk3n&fghm*CN&au4Nk+(={i3Af{vYXFZR z`BtL5r-vW&0E~1ekD3g02UUvHX7~vofpQm5op`9Bd`w52{SD*~75VHwil3){#)w|u zf;3i0JW&w&$|H98Td-E(QM`B>JW^1Uo@f#+blp;%NL(gA#9rajjS=VFf}W#Tc=W`DdoY|jSZkBR2z+0_Y|azNP7`FaDS*2RW)0@7NiM6;$rI~4R85( ze4crNY+P=Y(MMc%6{;{t+Jj50q>eO(?YIYGt`NtLVGC~te3QUq1~dIE`9Y)-O_Ma} zivczl&VR-;-7)sfOM)05y$7fZQTFKhWEtiQ{!N;I*8Z=@foJfLU|Bsf27_tG&s${Z zTU0Fmq&9eFUl6QQ@JqMgQtZ_Xi?^W!mk9{e2%d91Q}0d#crHPG1q$yyL8H6(o>(a| zJR#Y5?@3zKd}ialCuuc*A;^1A((2A22s;{SqgNBm%Rt57rVfp-HL?0YUV4is$TI`; zie1DWm(Hxw@V8S;q#O*SrwaZa-q#7Gso?M7{RvjX9s&OFkNi1}8~iUk?QdplSn73XHA2t zBVA~O2rn?n$dnVq$V>>xaLjt9pNoPsnwYd?gqN0N#2W&>XXKe*F&$^{Mn*pF%m&O$ zOEL;fTFBz1C7B&42C>>uGl}wUy#t9^-TMNUDDT!+*}yLu4m@O!#WSlO8D;@+2%v$Z z0NXA=LMB0rH=AUapG};g#hXpCJFNk(BDH6C-33@eB4>9es3NszGt>t{q_7)jA4xdV z{sqtMD#B4)U2?J!Fn_|-1Np3OSs;|-?oh*0mz)TAAc@qm0f<8b0km2 zZMlFuHUm73aL{hs0`LsNw!O0y@GQcab|u9ePdIAdN1i!^<93)la|tKxSxi5PaFN}M z@X3Tr?9V8FA>o$xyq17ZAzWry>H?Mzp@YRJ@=dzG1&|l8d<7N%rx&nT8EDg-+B+e_ zDi{p#_(K3Q30eWPK#pi@HAI!ScneF;@>ZA>+^F)u1C}PqS+ANzUC2VU-Kg?Gu((m> zMO|B6$U^J7QRQy{>_(N(MH9JE<+G8u%vKk&P^KGI9=;S_RC&T~RQZpQ*NrMq*o`Vr z*o`XR0k9iYp0FEL-oi-tqRO*g=|6#r3t28eN7PZ}>tS|O43F5q*rn|MH=@cv4Gq1h z@-G1KqRLa@`QZwfHx`wFzbLFPWZ|^8B)kU3!-XuIHCBZ6g)IGnoE@&g6Bn|)3Ta+c z`4512QRUZxVO3aP$Z{W$tHUio$Av6J)`u%$y;y}H8^ZcR7E(5b^@S`y0`a2CQ_-#A zWfaieWZ-u1LYDLu5R{0mXC-x1d4g_Kc~;krDo-JFvtNZYT)lz@&EeWWwPSYxU@BWv zQV+PPF*P*>FgrR_(6H2nEbIf;y}-lGIS;3Q2|X|wbApzr^5GWz)f9MmAxrp_N5K=1 zhTq~WD;Kha-w}`(vV?b@%G3n}-~9`7<#76Eq9~Sa*)86}lDq945Z$QqGthT+RCzUC)rBmoFRz3} za$h0rMwO>rH>y0xpT3ZVQrxKWVOYhDDo^`Y+aFQP9>Pc2>OvM;wN@g7=YDZ6@~R72 z2BoHi>M1(IPb`qZH1S|8-*^PfXsyt^UH>y0% zXxr70lDCd5Zd7@e;YO8bFm^YpJbxJFMwOol*o`Xx7r^R5mi^4x=t36CQawLplbY26 z3X~v&BahaEI`F~9K-QWV(}`Mm><7SbSYFuQJ4jJhP#v%9)%Dn zEEV^!;mHeG?!|u{Ri2<5RbG<8#`X)@n?cE#4&6gG8_~Ov{NyP5_bX2Vw8_MIem!3fcUrvus_Iwi3yxUt&&4Orsd&}+^ zE30pB`3VBN*z*+d-;F)bndi@A&;N`j^J33a>)P-Gm=AG#3z0!#eR~US=Ea^T;>Di- z8x)-q*0;BO1KqsX^F+MZ^OUwEtZ#22a;Ail&94ozJ}bid_7+mk57*&|+gsSiUhH`y zUhH|Ytq<$lTZr5m*0;A1*Lg{4lT6!tE_*gVGRt{y~_iA@+O|bUQcpyfT=+y=9;DM}2z> zt>?v_KM2H&Jx|1oJx}D%W6!hNm0^8*3z4d@zP*J=by(ltLW6j*=Sisx>)Tt{gS^=D z+?;x`=SlHm&oj^bu)e*86fgEXDJ#OeFc$N}7N;36_PpwX`u3IpY~{tC=W^x6o+skP zo~H(0?0Jgb6xO%5uuw1dJo9+5=ZSc+=ZSc+=P6)McoKVRnMLHYu)e*8Z=`#}`t}yK zy%&3)h!=aFh+(?1=ZV>-8+)Eu)O2IdQ@w=g#-1luV!E;CiIsV==V_J-^S>W^p8D6B zZtQttBhCNK*zPU=&$B-pUhH|6J~rUSp65WC;>DhqVdcf1=Nd6T;KrVpf#t=X zmyzYgo+oy`7ki%ADlhgt%ey*YSiG_&QC9?A+}QK)1OC4dd;TL7>&Bkv0`WhKJx}HF zQ(QbV*hfM(SFw=IWin)Q%Eb+Bs4>FRgX+efr)6~P`P1=r#l5|SGm{GLTJRHt{Hohq zWKJoN*z=rtN+8QYeu+KL`See2Z;9yJTgHPNvbj-oW6xiK6z}#Hu3c{IdBR@oc~13S z?0MSe53%RZ7s*>tGwXc}*QQOsMM643#GW4?M|O343vJ@Yo+s?ao+pbNd!Dcxd!Dcx zd!FWSW6v|M8+*PU>Aby#MY^%)AEvzjziw}_)?o`!*l#QKf)}L3ofc}|{Q?0L=-UhH{Jo?h(v6Y{wj=-XT71My0 zUIwxod;Tm?)a@-hpuWDnWRDo{9FKu)QJBRep4G{G^W2&&s#76HWV z!cd8~pg8gnL*UK~7z!7LAX(@X)j)To3xw?NT{6WVMs|4|kVFK_{WBhyv9rrat$d7Z z45%^zsn!jw;smyvrDD(X?rk^r{O5pm?0L~o$DTi($vXBtE9b_Zr(8Go{1nvIjXlr2 zC5APH{bm0?$|s21TaJe1b?kY9ZtVH#OtuS71^Z7-cVo}9EI0PN$UH3eJU=gFk%Q{C9}S0ll@y=5X!S=`w3Vm&wZJP|MU zJP|vrZ*QT3UhH|%+>Jd?VSgTbel93p?D>^Iyx8-%1My36_# zrgvotW!_Bai*q6M@2OR4jF`%E`jI*k!%85vxOW1~qdZsuW~9&_^;ZbL|PRk5m>Z}VQ{ zvv`?G!S?pZ>V}kG1XzcZS3^_Xt3o~8kn*gV8&aO7x*_G6wFEYyIK27G^DlU2a3N0r zc>t*9EZ%RTVxu$S1K<^du|YhZux+my1o#BPQCs2;&mo*J(jNvPVa`h{1Xr>QOed+# z^M(MPuQC^W0{CQ_F=~I?AMgUgal>L}b0G^(e+uAy^OP){klI68@M0xr&_KXT)Ti!~ zn0^}JO#2!rZJtgzYVT(H86wkOK>jlcC+weD)>6Vnb`{f?5iYTxVczA0TiS)xa|Pit zyBFo0^$6e&_I|==6YgjaA^*9uxwVIq|2)E#_UVNGLb%%A%c`s-Tx$J0Af<(i&P>-#GB*MH*-F!O0zFbmpB7(eb3-HaOOy(l<84+9&euP<`4Y1yo z;ZLZSLaM^AQ5S_&7f9gO=K?gtQQ@ChmFFc-ExJ(x8n&5EIb+jU53?B#R?6`E`LSt) z+KN_+)b@GmJ}!;T)mB<%TpEjR_c#liAaMI7hB;9n$YwWavy#MpCOf-%5@pLzulJc; zV#`pmee&76?LXO4`-QDc^i^=Xhnf9=Xk~Orr|#F9*Fj82{LJ@SPEY0isr2-2YVYYojWqLQ1I^fvb|NnQUL{NiT=sD#uLeBAvc(f;YxI zIqR`@QyID8Ax}D?(V45U`K0Y0R$_Y`3IYOjA0=#Fm9X>sjpq1qZ%on87KJDa3$qGL5 zF0Dg%Xm0ef%alggdB|S|lu%h``m!pxs#r5i)~YYHppg)i>Z?iffOLlp*aScEfidU^ zUNuWo$y#-$MlPTNA)6KJTtORMp0-MpUeel_>n<*Zeb6;7Phmk%F%YEOksi5M$c*(a1u(b zesmzxuTG-|fz@?2&D$zV-2$~yudsFT3&)6>Xl&5Y+Ia`eao%qm0avKs;&n5}hOImu zYpokt4wxgm1r{6l(T(;M17^dc(nyWaWjuy5mZ4l&QMe`6_9&xjyr#cH)5$^II&jIU zm~C{voC>e9rf8t?l7MqFjlh{qM9kIf_}zZUNR*0=r?;A<@M;Rg>-E$=aH zHcTv&PI(EsAZCLrEFMitpKbGM#=H(-t4oIG4%&v6MSRKG94K zO}hlF{V*kQ57_-acH-p{N@}0xWYh}&nd^FBjo=_z9%TFWf!(W*=d^oPkQ6ai^^5Er zXNiD_b)(ks#_D$DJ3GjpfY8`zKP>0x$YH?^5Yyu{7pp7!UTo31kVf$`H#LqK24}+M>zr zz`IV!qcDUx&vwGdvm%GGjnr<$Iae+;Z)9G&`Jr8=Rt_qunt&Vpe zBPw%^t1waveGcWi4_UQ)_i0Zf&r@^1!S^UHryUS|%zW@`6QuG$70U0uH? zyz-h!d1-A_dCjD}-o$1s!Jbv+Uktn^PYdzak5$78#O0;?jjUgqlvkozU-ruTqODuM zG%0VRE-y{W`wCcZc{Nb^Ys*kRdtyk$-2t>xcE7gl+{s?~B&VFP?2JQ*SW|h=D&P^5 z9eF75sw%Am`(tX5MhvvsVyMCm#F^6N5O*_mmZq{R-XzpvLdDMu8oCZEnYvtavNLZM zPWi!eYNJkX4*73*@{O7=eEjU-Sa*!>wbZ~}I)6gpal!QD;pL&RS#2i{%ql^EES zxzmC7Fu9@0?g(7okSfK_EUk7vb}W^ra;)^0t?gJa_2)KtLub{gyq)Z&=C|M-umiNT za&(x7G(#5{g$7?9@rDIJg>7ZJxH!U|(<1~SbQ(*^fE0V+3U3w`sQuBOF)s2}pc}(Z{m}WF) zdd_3I+Q)QZW2PM*)4e{X`x`TT;4y9UF}>ZGX|Kn$)5rAB#!Ub4nBJzVJN{^b<{cZE zAjs=N`Iq|2$JDPeQ&W%WcOTR2#!TfNQ>;@%ahEh^>gO?)`IsJT%v9$wrF={~8#B%D zn1=h94mM_5;4#heF}1)Ll@X(Q!3vM*Odr!RjhQa>m{$9k<}_xy)?>Qe$F!<3)5Nb` ziyx~;Fq`G!#!TxyN!Mwnh3MBGHDV zEf;i7j|a@*M$MJ3@-R6}V=Xp9*e&Gj_G|4OKEf2~>8#uTxZ{OTZXfItY^Aq?UozwLMEvgXWNTteEE=CT{}Q zvC~e(C49to0ZVME}BUP1v-PTAIc2~`C8`6K%>8oooI0AMDqo$LlatFXJpgwRc z1w35#4ZY@T2G{CCpop^io(8K6*s?3FzDo1s6NvoXNX5nKpHtOZFs0VHD#7X(g3jK9 zO-jujI{k8GbWtGnrmh#8=uyp#4=^)RjSA4p8#VoAXvIHsU5l>R z<)HaT1^CTt88qpApoPc(0r89RVxjX_bqg5nB_R8l0Ka}#&ZUsC0$&GOkEzqqpyLGp z6?h##TfV9btwWQU69T7pF^plYurruHtSO$xfNVU+bw}wbm-9K)^$M`j_%u7-(dHYe zl|59W?E&>3j|$8A(x3IEKj2H>?Mr{&m;R$KeU~pi6J}AR8#ViU={n8m{xFAhFEQ$r zo=PwJk@L@7x3ZfuYA-SBcGRu6TtwPSzK^!S4=|JwQ(`DF(n2j{6^)b%T!-@iV5BMh z(mjHBa@7WFM)NiOj~<%TG1CO7|`?Qq6rVhyI+UtB<7xD#L0^86w53HBtk7 z97p|uBVePPDL$52f67vGs*j~{8I)iQe}N;Wm#UHNnRhpY4d9jVcfue8z60UwGBiwTf<8v)As1wbvCM=@(^nl74)Cw~Y&nGDHCXQp0^r zIWU8-z$|^4ASQnwlh;(Z49G3Y7|zq1eVXe5B^q|ku7rgi0jazSO>+-`(64;nIC2}F zw;*xkYXH6>@IHX-6oAhG%mvWXz&`ays5EjPQf?*bR{-AwNDWP?CTxqI{CPVp} zuDw+~PY1&78y2OSxBp{R&x4TpI!jY;$lTo%s$K5q_C?bi(&f|mqd`%IHd3wn zsH!l1o-cj8PQM1}=c{ylY+N2PYF79tl(G!QuewHy=Lbb&I1i{+xq`j6VGxc1eL=bt z3Jn+n;Aa4%#{;ldzkYhnD>?_;kb?Ps!S8ac#L@PBv7l$Cl`I>U}K{kYy?)@{F3{ilyeq%`|`W| zU(?j*+7*v2uas|N52bONk$x=Jokdvd9~QK718eh$WbFV_^~52-A5GhZIWoBVeB_mb z`%S_ys1_e2G9_XCRva7*wEfSSiO`$N+CN2RUazIk~_HUuSXrq%BP#Rc7aAnmF? z=zT|1rB6h~RfAC^JI8{-s>r&IpnZ|nyb49KL)YFI z-hA~h$YhPzdMq=lQ!Sg~j>U?$Wpb5ds;w5oldm=@H7xYP^tq=zY)&yW1-`=dbghIe zgH#q=RqipXnoiJ6tm)dua(8;H*m)2B&uco@SKb!4yu&P8^^#`#0p>`3rV&=k=-sGN zS9yiw^Wym)BA*wV4{2!ORw`TAdd%Zd73<<-8sIV=Ui(p+iM7A7u>$UDF715Oe_s0& zeC0j%AC-5pue`KAjVkPJFQmK?|9N?nhbkjv9gif5QuArJN0q2ys>`8;aKsd>>cX4#7IRXj&bn zrJFd~voy(&fJEmG`t_4tFfhYhQp~gn4LQ^RGLPensYEr&*=@sie z6Urzw`qSN{R&(X*(#=mok-nJcF9L1RFwFBS0Nh646ad=+)EuX?Tmn@fIBoS_nb-K% zjTTE=y$>jw;N4>z*Xv}6RrT5sYN*$@nv3-s01jz;)~m*>Rr!@afw$Ek;MIZ?sj9>j z&FWR+lF$yf65qL%C?2jW(HB6?DLTu)uSC_d8l{9xi5oORjd;e4%DXF1qbae#Q*mq> z7a&afxIy%CcTi&W;S%tPmd1AD0G2k&_p+*)@)sY|BA02&VN8Y|33tJU7i+!F#1vkv z)2aNek}h9HQbTk)>+w&`uh%P|&xT$rIrx0e8I7DWxQc4ujMN0*aBO~*uFg$|Y5KWl z;(Pu;VH$>=sZ6M!aiJc=ch9ud8`*s9Y>eGXX4pE#Z85#`I8QUt&Oa(9eke-a>XVdtwDe&~ ze@my+&Qm4b>n|NV!(hP3p5(u3=M(f?LK9vpLjR2kmuY5du&J>I^_~W@A-T*qMSY++ z!`6u&kFtD3k9>;jgk6$v06gfi`YUvwm#Q~lVe1w*Ne_c-wM@2Ve=XB4F;W|KI$LC( zN)KDhv`(L zUmDmqo^CAZuz}Fo_YShh71vseGg5e};%v>|uSKOa9meK2aT_H#B64LR4%Dv;;^1?V9 z3u@KPnuU|2dVO3vNY%n9#}2VDbR6=?>*GaSi23?>AAnj?eXoyC=}dq2`q*o`-lDtf z{H0ormqd-65m4i8%_3@~hU&NAtP>Ci4$P>XyrE;CqWn)WaL&^_{4D&E@F?fFD}Cvo z_|o_5bT&>pcF1C}z+sK^hHpCU;4=Mw*n0A%kBPqZe`fpCk3ObTU8W(PYo(f)+a2A| zVXkzUZgDU3OC6`le3ja*$nIeK!z;7A^Zxnk@;qNDhm@Ff`L2+}8@5v93?EBNd{U4q z9li_rtBr***h;Hz8p3$UNRK25_WSRb6BeeQB zmBY1Fqh)%ZH(F%rY3cidvCJ*#{>BBRn)u#?>5TQKBdV2V;>5YVu>#(lnCj_c`nEAs z!|XcHS6mKW)&8`&wLYdEF4N%_dRa3yctef?t2izPjj_8h{g}^M=C4TOZyBByKjpT| zFrfqH%Y554XhOjCgpY#0=5q>`AAme3Jni0O`U@6+1>YY2%-hAkxjlU;Ulf7uc4APQ zFGd?F@GI(v7)#OX%~#bAF(~D0i@#38hp%*Icr^GlcJSuubx=dT&OREX z8yA0SvMI=ePpZFJ+;H2<*V@g&N2s!VseMdf{-k7!h-vp4^?5>ka>p@Vbh|M*NO(8M zS{g?v>^+4UZI+SwD^-4zVUXGG8A%XWbop9XsmtFzUB2<@@{LcIZxx&@gN*Ow(hf1y zK4GVd`=z9D0hFW^X)TM8t5zF@!GAv=92xv&{@5dF|LUN59#UwBYE|~YM)chUoL}Y@ zRyhvTU{g@9m0xsB1Wqq&g^e1|gL72nI{9tL5}=hSidvUW=ZA$8fJ?()pUzHr#6;lI z>2648ryFz}aOrqA3f^ZDa5*DbFIBmLcpIvIli(9313yUlH>dNQU)p0ESKn@FIZrGXT5;Ablo)j{#f&pg(_UmKv@U z>BOFZKeI!y1CD0~Tn1XZSyTqVU;<|VSOB1Ap3cJA+FR9{Tk{{lD-r&zefne9>b+-P z5!7GAvAYUe?`jUb+z0p>9l!Btr4M28IfS2XdM!ClsdK)FLU>!~GV(hpd?iX2g;!{f zBQ%G(&-%bsc$2H}E>~e=HWa>JXZc@HxaLDGJ9UCG#xkfSde%)p_}%7(39yv@-(AJdM;Oou$C^EA_9NHRzN zsU&IbZ1;RUwMOSygB-0J=V%bSMKjS|xlWiEyi_E0zh3n$<&&LyUvqANxOrL}In{Qv zNcT>vcTMBM+=@b|ob`0^u|D6J)zu5E2;_7oK0RHanO}h154}>2s%g3d@BlS6UnBHK zh+s@Zsj$`Xi;S-)t3JU7K32%yp0L^*2>OUAY#Apts`lV1Dl@HkqR#w>7R=XOh@O0_ z6jRvhHq;d)o_V#JryVrjtavzgpsF|n#E`}CR6h>6Of#-4h5xswu2Hp4r}GCMXe@3) zF4fjq&-rYC{lGZG7~ccS^MLkvT*_YF0>E|x`2gl04*=y z5bGxO{Q;5iIDNN{&n`OL%LV+eDz47;Ehx$g}TW}8QF-^LsRGxa*Co@ zXKtn5I&0f{WejG$LNSD`nBG4dHG_R**`j(RG$;=NKGW*1pz(*>8RKDm9sqEKlLLSs zVN^K)D42_>>tCAvlH*x%=#McY%53F-jG?`#sZqyGpv$_El25X?PlV(hNFN3{!ffSwfG;jP;X6b^Ys5Kc zxMIYdXrx?C*cf?ro2_sYN= zV0JQ6ZGFUd4<{b0iR^>>6_I@qU0oBXb{NgewT5ap8K;Wk6yH(OF`6cL?{xAuJx23T zodI56s)O$`3w*>`hZ8T?!-&5DT<#H#svC4VjgorGH=^!VO#Wf|6TkbMV(V@0G8sy*>wNpzujbel$R>`}=huIM$%9J9bX1iuz2zIclsaysAt}8+ZUo&1= zy#iZ2^8&kaGK%km^iNr87XZgD0?-z~2>@!zHhLg1*-wrF@H~=7P65#W6aXgzcoIOb zJrk8&^l15uOu~pd4b)>!#e|T3*uLmg@T4|tRk(7Of?f4^BlVF^zaCXMR?^`E;zm4m znZDLc{Kz)hm-%O3`nhgqH^`rx*`A=3WtUv1n6L#ks$SNWkk$KLjd1neu1fH)-Y@vp z)^FT`4qIFI`PSAZu(a18{vTc1dh+GE+Ey`P;2TxBI$f=+Jy&!xjJu~8Ms6CV%TS6GcN>qPa8nL^BJaP--DvZKM2}@JMhR{ zg1#rL2|Zvu)+YAOMy#F5+Uq2(?LKLJ{O%H}_Ly-Jj{5UtIE)2X)ytY`6DOf}HL?>( z65KEjT+=WK)pVYwn&(?tKCp)AX%rSnU7(Dm@5;ipi*<@7U!^)}U*5XkmMQSl# zr}szt4qtk`PM?hQFMa7J==AwWKh%(3b&gIy3+bsXdIrA=$bfp?0PlDTp~`opa|P@| z|18=Dr{o*;Yon2h>7h;=O_$swgUgIAE%8%mO?et}uTXN;>y3JcFe_nY?5Nx5rca%$ z`RUsDX(N6*vFaa6iUK&Ve@HgP@Dw|LDR##=q)c0Vu7d2~>R-?ks?N~jq>k={%Vy4+ zrkdYv=Bf#L49Hi#ko}{D9~JBzgz>xDh8o5cJrI5e%s+G8!s+VU%xat8W@=8u_YHil zy4>cMnIC{vPUi}Ah2-vaI$TJjoiXR5Sal`ERrZe%GeLg4qTo30YXD0jFk5Mbo!ZS&Lea>`&SwSa=Mk%^uyQnuKhJ9KXh?YJYeGe zGIg=8?k^}0zXv6SeXr&-oz89|W3*8h*<|Z3f`Q}fC&q)vh|TcfBguMQ_6X3hRj(rf z4Xq#8kT}&%oI0Q(af(jN;jL-gppJZOb&TqpC@wefE|L%d=pj{1#)Cj7PW=?G9~*dS z{KRp01H6;qaV1@Go%8qrZ+4u-sO;u5_Qma82zXQn*<8DD|^#ykF!6NaAfFKGM{xr;%w4DSQF- zQR*4ZNzMkwLxZkoq<&s7H#_?$(Z`r-RJ^$(R$o1 zsLIg9=m$C)6KOnAYM>eQ47Al^xeO_~6v{}Gf~P^^Q}{8>^;EYXN%Hs@7;N}6{!N{@ z8T3y{r)!)voVrJ!?Vz-09;5!aze2VCViLZP%WZ$EooDi%C{~FxxvG*}Lw^U7p!ZUk z@-hkB!_!O=Y1A`zSBs&dGF_;|cB{~h(q@1G`BKS8G|)#_Qq z)Ysodj?Jt?Cz9nMgY8%(IX#eu+A<+z;~TCqb=rH_E3T?XGQV7^VyAu#LuK!xu}@^8 zJcuFF0wiQ$(`(Fn_I5BG;MX#T$6HDX;hOcp7LfkMw~z*sF}2rSD5^iFH@+n({uP+P z<*r3z*3+S`jTd0{HPq}J>3VtrK>XP|MfhyQzu;9 zA?teG`w>e1fhA|2h(viv$-22>?J}$X0VHhTR!k*K{o8)Xm1Tige-_|Nv*8PWb~jNo^c`qHhCd5P__N?CkZV=VV78wi z%&IwqAj6+ob@K_rScWzFF9h>4@OYa#G!B0j>;rjeEnqGq$na+&U-+~1Z%1JolkjKh z-!n#-3V)WqZxk3+__Or=Re)9av-BU|0_=uAOFwuMGp~XH(|=c)8U8H&kYtwdXX!YK zMv@ADmTsDlF}s96OAiPoVFVfe%$D$H!BYrI__H9xpVY)eg+B{2{8^*}#f0oOFk%K9AovcdlF_{f za0!1F90QYPmUEVraArYw>!77|t=8=R|IJ3+u z!YZ6uX7AeoGn^Sae30SHvdVdpcaT#=R;7Rp8Rm4vQV;KQ^aQ8-c7R#I?A|$0)cG5< zGn_Q!G@XO&YR+qbEhh`lpc6tTNptoB4mpgClI{!y{~?eVGAz6HO%}@#VcBzEW3dbo zmc951mc9;0ILvT*$vLCx0 zc~yw8>@9>0zWHrLxe?(%%6a$5Mj|)=4!C15Mj}B z^A;c~L|F6)K~#vaXoVmuL|C+wASy&yw6ly!6(TI!RdiD!!lK>HgDB@&Bl~vtmTOgr zu;_YLQbL49Zz8Bdghg*=bybM4=$p*r^2PQWT!SnTUBpq`2r7W;vdkcyKK`;k>t(ZXT} zOTe$9g~fhnS(QeR(ZXV9oCEn1EiA|oVXu!xW|r3OLBCN(Dy3LM2mc?=*_#|Ik&Z9^M}Y-)*n)?tH?-P+B?;#Dp&f5@KbQmBlg zFbndW>QZj?D1<;^sR;RpXJIt<$s71D(ZUp{qJ`;Xu(AC@_6K0fIA1_EqKX!Vc8{Wl zav8OTRkSdTAX*rOhwRr-FH{0uE>eu46|W3*L_QS&EZ#FPib7J*I^HY5l~@G;i>HLZ z0APb)3Kak>ep%ppa7zHN`09YPqyzwqUmlRAlmKAyD+4!!OGPY-uMKQqX-4KYu_*J0 z?ECP{n1F`_0E^!ec#1p{04%;S;GjE6RHXQW0oBhL04)BHASwV@{1GWo1pte03hZuz z{NdABy~jka5<>!j#cvBVg)|iaEFKHa#eP5nfW>ozZ{@JE3;-6-4}J>)Dgao#X^<6D z0l?x#!Cv4>gexh!MUc}+Nw^f#N<1k@S@;#2u2qnei3$J~Zzq(>@cc7D=@2YL-BbXu zczKX!QUSo?T?A19z~bG5w3!M37OxaU1pteug0DhR6#y*WC-?w#Qvtx@HG-%BVDWw; zO$7jpA1#Oq02Z&6`ltY4@c}|n0l?yegKT^i04zRK5ETF{K3v#T0I>K-K~w;+_-H|N z0I>KSfzx176#y*$lyyC}V5;Swwp7dAfCA#rSjxN)p(*0eS)5H&0I>Lr7UxM704)Bp zASwV@{56ZVE(>3Q@6ho#1*r%>Qw-!CK`NVlft>MoEw)e4EUpgUh_~+eZfh>AbyTyB z*!{)#STwg604)Bg;3@!E{Bseb0)WN$3Np6f_~}Oc?-sY&DgapgJB#h20)WN$TZhn1 zQ~;{UWx1Dg&27QZuaCrs4*I&3M|2jWi#Y{*jv z+p4=d1AxW11-_L2$N*sRX9KjJ9!@U=4ggUBz~V0oq5^=$Ull|J0E@pBp!F)k{V@Z? z-;uGR0)WNe7eoaBi|-ah1pteGD0x%>u=pOKr~qK`Ph?1`0ATUY1KfJ50ATUGLQw(0 z;$KT16#y*0UnnX7Sp0xcQ~nJ zQ31f>af=$L0ATR~X;T#dEM6$L9IF6e@n(`o1ptee2%-Xj#Y+WI0l?y|MSuzb7B3S- z1pte;lfI<_fW>=C+p7Rz@m_-bQv4x%cW*%qvzV(;yjn2ZEFM__tgm2Evv|mZ!1{}N z3A6af1;7RhR$>Mx+qJN!Pd@ix$1RH4MT06nx%`&lGHmS7e(6GBCkeK~EIuADZ1Iz=E|?h4H;a3abD_olYy^r&6I&{!j|~*xdO5K3 zWFSom6gTYxY^54jf#RG?fL&&BjhG)O{*)!GQ3ESby!#?xSE!K{C_a)_x>~UF1I6Fb z^4AHrDp1U|F@A%TcXhxBG5}a^T@1RY0ARVJ-T*8Cz;efMU>J7BZm^6aY|G1A?gYY7 zdkgBHdmQ0}&D~?}WWpu(b4;H~xXkALzPZx~SJ(@1)lu#Y!j*Oi7RjAOxZ1u7`sJSR zHx#P^faT8R0#Vmu2S$GGd^Klf*R_~NO&2QEscX>@^~gO%p;>iCCZ&XIDvzi;cxI?= z30Em^z5MoMQ31g6%L%IhVELU0tBq}bSDHfw0L!mrUKIc= zUp{0o02qr*K8r3MOmw&h`5XxV=6r~kC)4>1&ww)#A}j~p7#|{rLC-X2Ct5n>^v5&Z z`5HX7vlf*NJ6n(vaq95QFoNqKG|}%->Q#V(=O;|_j5xSH=!z6eUMp1qutb`?NvZ%~ ziFA{;PyxUaVUv@m3ILYKFgbau0ALBnoSMhglNL%u%~?QH0I)<%UL8~butc69)nTqP ziG;~@Mg;&%6svdh0^W9*XkpHU02Kf%(bD9KI7I@0C0d(HKw$u|#K7mFz61bE4BkVK z0l*SN4-xDJ>m-H?$j+S@nZ(hW1OQ8n8AOl)z!Kx<05o#g4(}sZOdf0@Gz5*0z(`0I zIz=_mW6}k%U3bY8e;C>2Ndrklu-rf6aT(jXjMU1<$Snm_8IIH-1Arwau-$?T0G8Oi z5~(TxSmLqWfaRShu|@Qg0APtHPiC?N084CT6u%nIgpF2WSf zww&#NgHAc7>oghJ8~F34bAk^t09fA26r_aget62uG1rBdJaQoilr~5R zG5}cK1+#^9p3Azr5o?U<$a{2*dp9G<0AP8Su9G}BGtU^LKH%mtS~9wqoww?3q(}g; zyw#lvG5}cKn&SW(L9*ms&OE5^jhR@=oLyXOoC`sSJAhfaQJ6QdI!3 zyw8}m1U8{Kyr0W+DV`Zzh+9d#nseOq7K~!~GuQ0|M{E3w=p6Q!E8qsXHLMzAn zO&Q(9R_KH>-hy97FWoYDZXJoU>@V@{&McY0(bcTls&LPU>LfY0} zLHH5k)FWWjsCZDThg!nq*y(B7UxN@jR_u=K+2rFZ3auR%+x1WZdg!%$%z;c3H2(o#2eQLv=G=TJ%D!7wiH~eA^VdT!iRE}{rXSQ^K?)$IDsNQ3-^TfWw zycpw0B=z7}GkTo(1HL=|WOB&xr))6}q?mkDCyLR}o?FR--lp%dqsY!7#=PpmjIqTS z`9kPv97)fhCQmY%T}k8_J(@fV@W}v22>X;;82Dk;=+Sf?@Q2gb;n~BK0xUGfuZ(`q zqizNMRgj$Qele9l@;+v@VyOT-fNxGelCDrq9-%5DNs$L9gBU-A$9TZyu0^c%krmLq za1^V?wv-h~X(LPDk#v~I+{OHtlPnKnu+cS0$l!~~k#vD7lGiD=o6=sGdSxHLN%sB9 ze6rXX15d}iZCuv}^RYV0ZaY>TWzW}xX<2(n$KO@+FnO5v=V;|XApI?r69}fS2LT7e z*YTej`ci0VORzz+{&ki3Tcd$b#QqQBc^s#raawJkNnuL@zJ6KQT8Y00rDD?&bf8b8)9s!%w0lc3e-ty2M z{?qbM!)bYX!)bZCIxRm0ap}jbreq$Rr#Bp&r;o!^e%e>r5Sl18U-RBph8w;5#V5C;wTs)GJGg17byfBiQG9FE8B{a$V|{zMAgZChB~=_ z1wx{cD|v2gZ$p;ITFN%;MTD-6sUh9MBbxc`-S{UC0-4{dVqU>G$lNyvn*-$_khy<2VC5i?`QulB`GFii z9D?CO=-rtIf1?Px31t4RM9@tj^N@&eR)d&{1rQxF=-^YPk!hMd@wJ_Dbk59xQ26T0 zkGxqA!8jq?f~>50qP0ViKl%^Z1q8nluqD9sr7+#RtY#wt+x)3TR)rS1&10pO&@EsA>oZxQMz!~3`V6lL#K(tQe zP6h}?9ayFb8x)l$$OaABEeWzgQ7M9K(2#v3K{jZ}KAIpKCS=zUq(u?6nIJ71vS$*c zMML(<1ZmNbeI`L#G-R(NNQ;H+H3Y?Ck5aYCHv@;oCLM`}jEco3iSfi@lVYGMi%n`y zP%Jj7EkUu^q^<ja zO_Uo-?qux3nq-@t1#{1ZX__dPl-wM2;wEu(F8X@z+9rT=&3eLgPic~84kAqVlqUJ+ z-GrOsy`YKDJtarGr~C_=pe)pa?kTbE8PFq(VDPJK;Foam#m6o@^QdP90Ht{F$0*(g z+V&zpL2)w4E$7L&IGN;D3P>lDypA<2fKDcP-P;qS>q~z5V&)|%t}pqWcwVerU-G-Y z4pH1Y=%w(S5G{rtMCP>HCK2qt`OyZu=sH1X)N!<uyTb-Z2S;;l`Bl*!P($ft}uy*C{ww@ zBp!JluyTb-Y$B{&VG@s3LymHVNo*mkTwxMV5>~D-iLL(tzjB31Y$L2(VG_?yL{;V+ zS@eBC9|xjbVG91ioszi16!=_W3jU=UU^MJfaFDQag(>)ra6(*R3VtW7Tww|h5iWD+ z3R7U1L@JyGXwCvtkV=QHFa_ACfKu(y6{a94NUifS+0q25bLa|F5E5jp!#SnEHk)Dt zHpMAC3rNH)0W#a^4>1MW6~?K+_$bh>FwR$`8BU^W~3gtX&6x>d=wJS`)dR9_gVG3>{s9a$RZf13rD@?)d z9Pv@K-dAWb#9>Dp%F0i*W#wloTT@c`T|iP}YO0t3JjQw`|Cgp`un#1Hg&i*eA@X-j ziAE%Z$=!_9V0j8edST08MP5L9&Oe{1>2CwhpO4eR!ZXLfU`GD& z^Nhk}Otte*I%SbjxPovre+I6)DLk7n=Kv}Zq=dq&t|oXb7Tdy`_W{gF!^9KgAd7vC zE)Zka#T*4y3h#-6ltmEgZm9wixfzS85orUh%*bbW1|k!&ELf3umAcp9U*Wb~aEgOZ zW^-;hl!H%ZF?S;3;FHvvIdj3YhG9eXhR}&JCXo_Cqs8S9-MXwN64n9S%QLb|EDSDj~Oi}*A zsYcOzl%gDbigvw;WaZ#fY5p1`eceMCL(R(1!y;(ULVs#jF#|-yE-HCd_6T%=W+}YqLFqP3 z@4Xsu!VaLln^n&TTx9=_#%(4W{1Uq><@DoFXlYL-d^Bak4~9GgIP5Fz`v?!&4Y<Z1< z0joh2vY8${8`7I!N^KIs;-1eVDI(rX5uZ0xan%E4r8iUY;@toX36>NGOuFe5%{Pi| zQySA@pzPu%=KI+&jC23(;E$Pa1JT}0#iuppI}IJ1s*CrW0a(15ia)s-Jj$D?__G%Q zD{rRaukSHjPWKrHs#kaBy<;_&Qu@>pdo2htfJz(X{RQ&Rp zfR#5>@muQvSJ0ws6M!P(%@k4IOnICgx+66vk19fa`JnC5@5mdnsT7=S0Yt zV(pMU#HFxoMPU}?ob6Js@+gErVW}beY&@Gqi$8e=|HXMpfy#MFCxea66|(t5vnCe_ z$Tlk^7)3J&qS(pO`$oft^G~cp8nKP$6pph`)GL_R6o%@>ZEBDginQp-ZEMJG3kk)+ z%kyziIgEXEXASM&Xl~uS=4b1wH_G(e&dN7|GQE=?2cv$dlBr zP!3PFlUD{l0asM&nOqy#3nXD=DOV`whbthSO|HWum+nu=TLOmw7m6!Xa${f!Hq*{^ zr-1NaKn)VQLM0y(#C9q%btknel+znSH@PXmZ}16+u29LxM6VJfw-$3#^0vTuNGl|~ zF&PWqn*-60e+xoxFb0FE#z^J|J3@f%+{C&x4YFcU2Nz)&N$m>d&=o4#BFKrh#3?0P zQjju-u29KVK~B3B4&U{X?SxY4&=o4#A;^WW+WGrIAlenmd4O!%70TIrCy?$z+N{nQ zL8U7N8S5N*8jw^l3yMy0u0+|%KEZ)7*lgz?Z9%CKWWIAZ5$y`)oX`%4c7<|yXrHW= z`mAsc4FaNFp`1F@JvlhY#$V+OBr;Txs~zVTAlenmc^w`_N$m>dEMpa1SEyX>A(D3l zHp8NYgs)CMWqp9IrdsZ4OSK$bp_0#7%Di-iNvW$mE3LJimmBF^^ zu1;5|;@@3gukW0my!#EODCAaM~5h*+mV)7N?o>ojL3p8J6mTbcIT0Sv^s? ztDV2G14Jz@U+bM%5=f398=SXx0f}4GV52jQ0<`}l5W&jKQo2GV>%=S-W+`2v zk|R`)H%sXXl^iWtwOLA6sN`6|YRyu*LM2^Ss8YH@C0$pjQo2GVr>j10Cg}>5oGI88 zvy`q-$=QO2SB~P{%VicZlmeLg}xzJ*N zHUgz|g-W`vP^EN*N}eYJX-c4!u29L9YFGtIWx=@2;unG zupd5bVOXT|pu4QqH=LZr6{^*~>#&nB@~16YVzfHIxmWoLwfgBStSiy{1xBlbGN%+x zGg_G@C!P|>IvW351(Ta(K8=VgR76~%BFYsi_YMw`Ef$ZALpC>#xmz&ylA++sNGT*- zl1!JiOKk+g0vpc5E5MZ@r{uPi%{4Yl7SE`2KPU8TSv>jT_>@RKfSM(OtvVkAWh3XJ zZbn27{UdVdACW`GP8373SgIY?qtIXf22StycYxl<1on z9j#VRB*;VmR%=!QH002~)#c2C`rgy15ml7wN4fkLJ%FUTDMa2IZ3oGBdoev>-J<(E@`dH2`iVh)}08ex0BXg z--iK|OIqtn=2b3ftv#1C78!mPyQW}ShegO25tp=xxTHnIB`q=$BCN@Uh`6Lh#3d~vE@_cE3>NK@R@QGhWEP4`TA69~E5f2om$WiVKJVZ<1E^G{UDBL+ zn9j=5O)g?lCxt#+7B;zvC7fy4yp?5`T*OM8Zy>+SG21rhKU%0PY90ZkLe~4Tn7sd0 zI=7K6PmpR^@5>S<*ZW%8yp4R5 z9^2t&&|~so3!xj(_#vA`2%STu@~5CbR+Rk^gyqF0t?U3n<&swRW0J{s!KoBA*IPtl5h+`rsn>2 z7RoI*#~`8bYY3ZNc7$1o-LpfNv@-3I=47$=YL_(UtU4gtCC#BrT3IiX3Pzni>|!Yy z3kjLb%W6beiE|=Nsa?_>x}=p2G&`V}3g=-`hMUI#sdNfi&Ulk|AXYmEV79WU=5ipl z&ZE$+?0BKnIeB=QE1Rb~IlYR?PBmA7Z3=41n&eP)Oy1jYAOcwI#3IyJL@vEx?d(!m zo}$p6t_26VWNM(u9B{}u2MIYWP*Ra_9^hQQxR%{)^37Fd^#{nn71PMQ2TO3-^VSnc zQ4_wKSBd2-P)y5auH3pl;NN523^-(ejAyVp`fS^-zXQx7*ru#q7jtk4dR=|J(XP9I zhP-^VOPM2(ZaamY;a_yDcn(IL7drwOWR3$R;p`_eOeiIg&(BUFn>7#Fv`lU;c3$m< zn--Wu|A({p0I#C>`p0+g-duJA#1sja5a0@e2}wvK0)Yr5z$JlPAR!>33J9TuCeoCW z*efL#)UQzxEMP(G=vRsgiXBB11rbrPD+pFBzt88)?9GC{@B94!c^;NCr_Gr&XJ%(- z=kBqOi4F4sC#WUFhlsm?eGL&@S+r=Bk?|}FP3Pj7C?k`vkBp|12xrOrBRhK{zJc6< zqtG_|1&E!D?4{uM&mIi$>|FqpKgNask}kvr%Be44@4&T1Fr(+0XF&9Iau=v^nbW{D zG74FfZI3Pkz87n1WdBGW+5W?O@@eHL^!Wxlg8s}2qo5=9nbV;?wjbPQ#`3JDFP7)k ztk{HPm=ik}jlogCwOA)*PRs_szcdlxl-U3q6Kv22eR(jm>f6?+xUvms)2J33J5_+E zk0EGx$Dqob!PdsxL!dEprrKzmM*J+|LpC3RGB4z2)tUAc#Lp%^&E{8#GA|;WXLU&Po76T4%pN{_E(fjrJVcb3OSt*<)CjYzA(#YcOkOE+u}a9mjf?5#D9L zK%V73cz7?uVA2`5|8nPw2-$3Pfc+7g{b>|hF&_;64Xk5xOR&fQ>kA-BE)hZ;g=+mq z4<)U{1v+eya2^7x{X^NL=SKsPI6o>nJOp03uut$yPWp1kWuPb1&u*&P0eE_6kRYr@DdB^E^dbamriZkm}yuXSeXx>TK zwx1aUSkA=6+g%3(UParm34C)I3ahEAMX9-FHFX%&u~uxi_u@bEo?hU^a;_BcI^yH) zUolL~^@LBiQ^@lG2Vc;hNuCGUk~DiN>wJiCj$K&+_+i3%_T|KHAY5Q`+sb@|dWtbw zk!fQq*wDNRHU!N%{sSna;wa`^zs!hnV$VFk7!)_@HSo_D9=^k(1JbtAfPl~Z3x)KH zrc7di>W%hK=brm)eWQGf78h_((;;&05hs+@fxme^KAgzpusNaPHq_bw#bG~40m zB)oPZoz@WvelC)TXwR1?F*{TvGr*J45M2QTsTs>5514p3b2}a)GGAv;-D!!=2Y^q9 z&O0qC%@E(;X|aFOXHP^GiY=W7V(+r(sEl&QB+S^&f{RvL+^NjvbG>=DMg6&)9n3Wr zRp%~dM6H#&RCqrNtb}*a=ujRo4XcuxtWSVe-jH(kADEr2N@-sQekjSx5vL`c<+4dx zvE{Invc+jR;I}O_8nAtc+DycmQVY>A0f;rJ8(ZR2XgL9AXg^E|j_$++F_BDZ&gJ1VJ_ziI|`ZNZ0C2+evV8;`D51`B>?NB;r zC;I*GRz_Mcc0_u>oC74?ksgo^=UWB9e43?|83FE9cA5yL+{+QdW(Q$2I_ItdhnXK> zXCZ`MrYm{}a79j1+`!VgPXGkxK5<#^0H@lFJHHk_O0m*DqAeYc>7%Qhfp+%|3=g4t zd|uHk5|uK@iUSO{-1l)?F#8EQ_j_8@Kfun&LbsFz=+fN3X-gy^VJPuCAi(&|<+GSM zC_wW%^}!|gFlGj`Lc}}g%E{>p(SX-PsyIg%1NMVZka;gBQA zB(BmjMlclo)*`gQ=rW13@VDlEuxCHa8TVWID7zot*O=eRbRg+91e>>wL+N`8=B;5P zejsn&3W^;ehwKjvrweU-mfdEam4R6ao_UtH{cOHFFrQ_A zXLH+8gRSX#!Ja*CUJkNp3j-he&Hr+gbwu!Nmd2mQE*7xkIE2O)R?!hDIk!@xdH=C1=p$bU?Stdw^Nl|IB|$|W`F^g^GoCKo8aSdE z&yHHs3GT<6de9gwMbOq`UI*|#9|(hjZ*p$!E4<;@$-NaY18a1UP#3;FyFwvRWj!lu zHgi~UH>2+vTB;IKB2lm~DnX_wr_qp6$2#R!WEu&yEdO2(-Zs+G9IXm$@`r8(N6`oe7cwYyqNtQv&fidVETzXsd=`6 zC$h&=FnX@%l-SsJL?b6fTYG6XoXD57pfUs|T;?+hc=88j4#yW!E}AhA^f-AFblT-? zo?*tzYpRhb^_qubf{#6b->!t4Oi?}j8jMJTat38>u|&w7`j;1s&5O|6Z8hsRVC}0} zFOqi6L%!RHrUqu}*m)=_j!z+{_!vF8h%ov+h>RGRoSyV(s-% zsjQtV)^0~xS*tYsi88I7FV^~U05$-K4Ar6>m?cwn;VK;j3}2?u)T08)K-*z1(@fXm2FO3Nt~C}<{dLAwgt`zHeU20)3wO1b+!)eQ4&*l*RYSb{lPadWQ=op#ae(*5C z^vK_uX&mZ{IMbB7=AmHZUtNwaZ7;W}cun{-+S7$yFeQ)U&}#2r5QDwm>o8C-$F`Se z^S&q*$uQ24C-Qqy?h)Y)Ez8dn|5oj`C52qMt3xUufm}QXOD;28s*7BYaxW^+k(JX* zl>2d>OVoD6qd8_r|Ht@G=C~Q2Iqows8~ymen60^Ik^3C~85k7j?E${*Rb2eFFDzMA za=B(%h!%4iT+A8UXHSFsHfjO86X9I_HY+Y@Agc_2k&>7{tBfEW620_)%d$md!5E#1pGdYe+2l)1&;~M2p`wzSAc$3u`{CalT6wHhJ@*= z|GosnuhDuqa^)WEvu7BQmYRpdJlsVWXjqHR$^|rRgvN97n56M?GY`~mToPzwqdo=2 zOL+fcO1oF+b`RsY_LI|yEcI5m(W7?D|E>18Qk(Nnwc$6krUn-p##f?gh&>MnKhLy7 z?O>c^xhpXvY|T(kVOw$$we05qyDdBaS!txP)})5V8|NXa?vwRdye0$?dHgf$W_HC~ z%=OuQvcSr@L5+_4Og=s@N2%zi1tQJ|lDNo? zoMl+f%$|55rahBebXM(=CB@v#!7o3!7^(ujShnFFGWn>{Zn@7Gz>ShY+R8Yw5&Vyu z?eZ{fHaH8vOa@c`KfqK&;3$B#0E~)jW@_hYnOX?+STqR2yG<_it=cb_L~1otcXUSh zeqG?*Xc4&SZdqKAm2sM9lx+3zC^`iDYV*pWWxW=}L>+lX<3;;Rp2C}&iPPBo9(?2n zPaz!VsjCrsC2Eh%<{0axMmXQYb7qvs2oLn&dqweTJQ?AM9_olF)hKahDWA~;ZtF6i zVzhi1!^cYVF04z^v55FEhP}@njt^t%w^crj;kHV~upl`1#qeP(;{*_ZR|3xBs`n#d z&&}oxc|dgLu1x^^v9RYhVqFUEoXZ4z=HD^wtX%m?x)I=0OcoZ9W`GAUI;Fv!+-{U_ zthPpElS9Eqr@m2Yyoah_qtk>aHOWI&u+izVC^gwbRWNo>q|Rm@ih|*ye5SB8FOmJ5 zkap)vz2GtHW`((E8h7Vp=H z#zr^cR@XHd^h*QW&%->pwR-qQ+=8CXho5Et;g$e5Ac|!JLcxn5HG)jVvJ-JjfLjs! zfh?Boh+D)HZExoMGW-bGK7+1e@!z9T>kA+iOTVe|=VToo!ad-}p5T=2u+_3PX5WH) zDW|80FH~V#1157_;E5iX3LXM}5*Yfg2Jj4ln*sP%0=N!9I|4NTW&#*N!SYQgeUDQ4 zivarH3g9gOw-eY0;Bx>K3+Abs^7QH<9aWWo3F=UMORD@hfQ1AMM9a$nhHr!7r_Tk? zX~29-7L-oo!8sSpSLuEGnjfqIva*DE&MIL2fa;z+mRfx3k79A(wK~q1aNn#p`Fohc7 zwAsp5avN^zlh9&dukBm-xysM`sq z$l02yA8I!uuW1jRk5c4IUATm#kvD7KTm&sNQ*8|JVQH}TQ3Y~9g|Ir}^6U@YD6S~C zDGA3q>5*f-bTKy!_y8My;OOXfiEq9gQ+q@rs?l845C+>`UHxJ_xwX)Ec05gzl^<$1 zDn@H#lXTP1D{$wdRi61s!Qa3QgHIJubJHrBn@a9*=cZLMH_bp9@xk{5m+L+)MIV^A z2AcH2#PAsKZ-b@(Ishqk0O|l-K%f@DAp%zdIOk4GEEFt%4yDB?4cQ66UwiY`>hj%y zJ^-rx0D#C{0KNt=lfcga?gcQ!z!ti{b{)7I0oqAg5J18z%zAvYu}mAcg2t5vR`r5$ z-GM&`4E=KfOam~2)bf5PJ&97q%UY&bJ8n0Er@Ru>Z$OQ_rKz_dBEnzl!Xqdw1e@Cf z7!2pc>8+pekDBRKFs)Qf?mY3gCLILnQ6XXI%M?;_+C{3vsoJCVvw>>dV>{%C?)q!A zo#hpofycmH9!Br6XK^>fdaogTP@WFd zXf&&$N{>_514k&(8Pu(8^rDkSalRgWGK$COf{fxwOYPaSIh~!Y3*5@+f!g35i9R*m zp{1OQ!qYStAA`Bq6Q$~5KUl_Hg^8K?VplsxeT`x@i;eKz8qFt|Rf5J-%fX8Q@h`kd zlS^RJOG1Vj2y0ZN&5{0iRkO_l+vl#9=(A7cBTc>$pU9Fhw zCp{zFP)|yn##U)vuqB+T@tnqO z_3zW}ulgC#2;ZPp$TNsiA@{yJHJ(U-v-|cPFm|=7_{>-}e2;KhQ zfixao?f)Bq_X)({MO*wD%v}ipZX?hfz-9o$SD=fUK&p(){$u8lRlMpsfOhx5;L!j!5SRpDH-O>WVANZ*oXpB{ay$1zjEaT=7(u2{lpRI6zVlDD zyz+mryq{(~$?}d^MAvA-2s#{pX5CQC!~J`Mv)VBlx2kP z(4yR)$%hc*oMUIR#&dfn8vAr$W_%ecSgBqSE`|i3?N-W;n0i^bQeGAs`7?%q??K^n zhdh4?uk3rjAGX%M8!Q|j0(BXTDwfyM5BvFA`WKXYar110Y?fiCv0C2cJR-$u_q*Ez z8~ti~U`2H=c~kkQRBqMYP_4EL9+UdlfWIGIvicG=_Z&eFm~Z(9z>5B}fd2~&Wt9NT z^6(>?hbmX=X<{11a!e_NKa|STH=z6>tTOj0V_4qE!KKQdqbx&UzmWa4`!`n? z$`0B`{^21^C6C}CTuyi#ke@{QYY%R&R%7U68AFePLEcawltJ(=io-+b$xbEin)r~P z&*)>+ApwD#VmnMnKx5@mW6~+?>XBZFPT9ysODU8tjdC3pMT$$ocav)XPj&5Dq{bf} zaOKZD>bD~pgWrQ@;#cp3Ph}|o1(Y*E34fwRC*wBs4Jwm4{#N(ltK^s_?{ugCB`ygD z@^OCU0NnBi{)T!AWCy7TN{8}tKciz-G|Y1-$ghf|Pj=ZbBz_<%_=HjI*&-TLN`QEqbKB#mneTw638&WfqsxLH44 z>p>-tZASQ0%{vIZ1;UG`X!082-#w&}Cy`19ahZp|e;>GgV>rGs*;UBYiQ&8JziOVt zGg?};5`9P%;AGH117mb9#_TgO{FT*BaLw=>cyAB8OrBeJN|!waf>H5^7EjjVC!$=h z3fBkZipV;U5>hCFYy|Qia(&Whn#-9 zHYU2|RVW7muao|-cpO%*hUE2VjS0o(>)1a+3rMXBr4 zSOHuL;1d9&mI4@ZJ1+j(FE>}0uLab56CN%f7Sxf=)kB^U2!o+~2cU~VEZ+s7j=+8Z zC&+$Sm=KLaeiUfM)@pfwS)p5Wn(ig@ZR>eVtn&WyvS(l)-(Low#UPlZIqy@q0C~|P zLk@k_Rnr!tufn(L0^dL$hc1i?v7Mn7eFYg_tGRf3s1ascjvaRUpBgW(CL3R-{LNRB zxr)hO3)7A87){~3$q_<1`Q4;uyV%24?Xr1aPVxcj8qKr<*59RSajYHgycB-UqhqtH zJEFX&h!yj)XgVxds* z+;IBKdaRDzs>xFo366wje=VXzCLyR$Gfwz`N6)pco16uR|AJrBt^-=_;Q&i~W}j`MIk-TSYhkb`9> zqe7N8(j<6;RfeC_T)f8&5-wO4-3SdI_JkHsGwRR^f3NXhLwU6a|C4qKL-AG*{!fi3 z|05oJL)~KTvb-sHR3H6dX}G;68*}j-;*vjezh_#~Nt2U7re*GN2DE;!zNKe^)D9Dy zGMw|BosBI!O)Uboho*8R+C|?|M*)AH2j5fUrvpEu9v>N`@v_A*UKhApyjwBJ3Wk-^ z@yuRsgkRBId~bO;s){^|`2N+mNWFW#881mIxLb%D$!dKgkr%L{r1@eMTvU=V#M`$g zDY?m`F$*)c?vxOOt;-K`EhX%EzlJXlnv7`fFkU!%Fzah;$~+Ui)Y$=vFA zRM{x&H8fSbMYcNDXf|$j>~gi#Z*@GS$r9`bb%BP2Tj=}P67&fUR>EYwF*m|~JqGBS zzJhkc{(p2$+CN;A?oo36|E$E@Nu~c#a*0;L^};Jk$te#=ssC6rtas;+@G6f9aaiEj z58wZ>9Scr1AyTRbi0oBla<((u`1r7IF2FTImVj;K_*||W<7n&4ws33aQ)oNk1K2SN z&&E@QLgzL^Pnl==I%6%ZPOhi<_(iDPqA9?q%W1w`ITqbszC4ke90oqaCr7bI@M$8; zR~6z>>(i*HQtHZ;$Bs$z35hIO^-uP3)t}1`w3t)m11-7Nl7Fi2I#$+~imDX68ZI)Y zDY%S0(|!D+NEVh@Gvv5nZdcqt&6z$nJXcO>&+;vzc8A;-`sBoTIcu8j;{$fCynDY$ z4kC7%452J}+FtIH@0NAW;#74n=tfQB_uQwAauq@$OfnM@{pL+(q z6O)A5SGaStslUi<0gl`zm4J)Qa<)Ni z?I-ni&XxE0bL2ff4WkPKHk%Z%&j(yOJRQ3NIxylJ!Fc?cbpz0I{ilMIj}=P)IRJeB z1yBRv4*(TcUa6*>478Jf%O-=L)c-uE`Trn54YixG_rQnJo3so+R$#_k{V9?KeCie~ z(uf?=6(tL&hRVYLwgWw+R505YmyZH)!B+0z0PsBz(nUhrxp+vm0J|2KUk`xF%5Md5 zA$ZEy0(b*}oGZ$_O4+=T_4oC4ACCHYcCyb4u$0Fq*Ad_eO8Z5wOP_6r=4+XQlqvRI zP8psqGPi@3Cyd$xC>gD}^Z_Far;a#z^Mujx5Z+amPDJB2ikYu3E`JWdYKWEZ1mN3& zrRci=$`9gFhEn;r0JahM6+qjU0Py+uW&oq&0Sw`>536?X;_`L?J_343N5LFiJfw#J zM;4Fj4`6r=s=j3eBt~j__|I#V3vQo_rw&jsjbJ^u7(1hwh1cQDS90Cq_oFM?KF0e;+vd zZv@cgRRH$@xSzm(05p9Kz;XZ=0T@BS@|`HXh0>^Z0F)oVrP=E!ea+I(xXedMLhPWf zZUw6=F;|b&&1&@qbTY&)CqNTF1)yYBT%%mEi!#H_?_8OJH?_~2g>ALSzgyT#Q==AMU>hOtI&BH3LnxU|FBRx@hwd?@DkdbZC1O=G9fC;1`%L$@1U|DPgW+c#Z`|~{H96c zwDWq7!C)$grYCCs%ZYvxJh}d+=@`5r5o+pRS{Y#x=rt*R2VU)ty0n zW)v?o-!+S|*Hi7G_leStup3{jXO!T@W8u#=Kk;+w@g;@JRhP0J*OPc>ju#z&Emf49 z9tf~xFz%u~GlC%N9djzfk5WkzV5;T-=M`<)l`8vum>&gaAsS*Ge<&AQ(iJXQ~ov^`ME0kVbwWBPjlCBrrMNintk%z=}I zDzq|;@ROR2@79mHY@5)DCA&3+@4#VNy?Roych+=;as$Sg{QZJHD4&8UJmEbYproUU zG)JuFFn{$;Vn=bMa1NNnTNMQ8twjLT!OJo&rx!$q`I~PQ<#_P&F|zaE<$DCU`}qgu z!X2~>Z^zrgEEcQVv6@DBGja9?2r*&sYeIRJ1qo0=5^; zd|ehVIH$12L+v8ep=xOZrtL1%>zZjfRFt|*d*PxVG+`qMlY}5gvd_Gsw?qpau}blu z;)rdo!FYh5?3x;RP)`W&L0x2%E*wQ6{Dv+xnvZ*zXq312;m`wD_c7jr!yDBz7ZsN`*%nny%500X->- zj!e^Nc4hc-U3dpPtCS6nWlY0rAAiyr>PHjj8sSGZ>rt@oR;+qcihDQMl)|JC-Fv`! z1B~Iw4lQ%$0@QU>7wGu56Q#YUIQ~=D@oEPH?!QgDUtTz3S}M6okEE{9$mvXq z_ z{T<8wX^;{5LG!%9`eOA{#-}L!;WpO&jVYCKDagxUpYyX3IZd-$7eh9r3;b0<`$}o& z$-gR?q#0tt-Agg}?4CxrM&m=kPgVF+XAl13Abh7YlO%oT$?LoYPx-y)#UjezJJRP$V42}UC_ z+^cG-M^)9os_OI)RTWWHw|Z4=^Qe02UsVnKhpKf^RhfE_O9Kb!0z=%yAVP$m65>Pu zp=wuD)pU=ll9e7+|5P*TA8LMe)u3md)N}F*^Z-6dDgy;QQ*wdU$w44GuUQ!#=`xa3 zMDpN7WWU~KSi`PvszZAN3R|>7cgL1-j6+qKn&nln9M>$eXYE+=H>w#IoHAp`OY#a- zXhbTslz8uAU7+`RPWdeyf_p+kSf3VcYkg?+*E;N)@4`W z4#8 zGinEbQM+)dSfne&{Z0NRyDBc-rzP(tKwSp_3_g{A6m<@vK40y$a;h}ldG(HdbcvOY{GrP0#wbSrhG)?4i7_5k=OeXmJ1_odBln!qvxMzOpE?G+U zXbtRn4nFMDBWSvLjHyw2NeP#FxNj4@`n~lujpreoM+DDXV#${tHH9#0oFiFcwK^l76bV{v=lID~2EVp=vaaiI|jV6sfLH-Kp z1G2_NzHlCp!@0%lSc_a_b~%vTwFYv5i)=F($dUZ!hhxohk)5e?l&Wa5i#(k+kA5~p zPIpz*kRRLI1Y6~k1Ae1N0;ihg)|+B}Xsa4I3F}ZCH||p`@Z0F>LN6E-nF0_Wq2uZ=>AQbnsN^>bJB*VJ zY<@K$NyH|#LO=ML@k2@cOcJMSA=H1N(3qUl0dFfi@~5Yjuj~Q+YuVK1uk@43;X(PL zqx!U7<@{R>e63i1Y{lqS-^=517GuitFEC8+mx+J~RSRuUSwb#zHBB`tS3L!6v3y>E zhYXb#{;bNVeEEH}GDY4;@Q2-=3aWO)A^xYwfa@w!q>|y(Dh;i?{vet^!(=P(BVDR) z6Awr}NmO|lj)XUjQPm7hNSqG*zUw+mTo@DnHo=?0j)4f5YI>Rrw7j$2R?h#1ql=BsD0jVjhAO@~uI>t`{=KPv9H8 zhU~zx%NNy3h^82of8B&6Ez_kzvq+MmB@lfloapWQ&>a&$djW_>KE9+@8lvH5R5DL# zt1aR(9@0>B)ycc)%~dK0NRn};NRw@ZVzLZD9+mSrW_ssDk6l)~7dP#7#Ux}_t5GEdhtM95)ze!zr9`v``EiXZNs6>yGKIqR@UrB86 zERKqes!9*j%o+nX;iK~3er#^@r;VcRI#$^`(5an z@$@xMji?Bgc;ob9RE}K%BVH2IcsxWx(U|h+b1>or4}{bQlre>gQga{SSrBCahm28~ zu?aqIAYabmK@de^eMVKAwYXhY5#~`4Jw}ec1%rxt21Fx1eFKO>9zf88<|CLKr#|w` z9lrWm%cy!Bm8FkicX5j~sVanv^vkoHHKy}hfFyF4RduQanRM!;-!Z+OZ7??yo6fCL zkFAyFCy4vU<+Luh233Gbh8t!CG^V@>E7ON?XYiC-rG8`L=?q@SZ&vEMl+7l zfC)s3B@-<`EF$JP$5!@1cegB;?&GeRXL!h+hjX1#S-uS)dYmmx50FVNLJHV?6JNRb zQ83&g470LQ+Fse~2%31a3~g?fsV1sv;x|lO&7Tkj+&W95R`Cu7@Z%u8 zASCXdDH2Zw7?pS84%b|*EqX;sgizz>;HVsR7y>&)mb+%Et7MW+<8-WAH}iXFSu9L9 zMzu)mqZgynhv~NYdSQBuOsBN4vL_~>=1YbC&cD#Bnr0$O!^2=2H_enG5;(Gys9O6S zUTIF@{h0e>YH6@21W1gnU$}{1#O$iwxXtDbBb^&y+F8Cjn9)*(6Zg83{tq3#7ZFqi zRj7#j06K1V?FIM@ZMmCBxve8tcS?~(>&%~M%YD9CAXPq73itzAzHxs_xtf%ug}4}# z&;1A%7Ex|uzaOzsY~|wyh-for9=aF8$9?DnW8(TJ;Pj7t-0n~@Ena7?I%DD`AAnZv zJ3^YE1(Nw*#s~cfNBsgJu|gM%tJW_=%Lj)*;y>lQfZZ65o%mnI+;ShE7}bEQ|-ueq@Z^Bc8cPCQHfcvSe$`8c6F7CX`UxvjDX+0a_-!~B0pC!L-G zy=mhi=szj5v~>|~d;UdSELwBp07_o``ie#tD2NeJNOQ^@cjO!QwtP-lydu>_Ct6%_bO2{Ze#^S1~)wXn^>_eFv7J9yYK9Me3P;!X#2iQ^MW(6D}m`dCR| zYt1Dn32dzk;ObaOU>nQqv<+2u+E`|%#dkr+LtX3@sJLN*Nl(TyBW=Ue&Etfbg|=a` z`4wSip>5dIY>fY6nT58Y%0g?M=V0-fNj3OrIt*<{p9Jjg1lbqX9w=|zc>v0d2wI(> zG_J$v&|{^*{J1;;nPB#`tOFEag4xqL?u znEnA9%%rgi^LL^O>v4!DR8IhxN*bGRS9f?rnv$?uHHArI6V_5tC5=tEw>OpA-%<1d znyZq=COkA5^{S+?2^%f~tdhniY-|EpC5=sZY#{hm(%6J2s8c14O?Zmmeo{$e6E+c6 zNn;b99Sm8OG&bQm!YXNO!WP0RX>7u_E`Y~MUW9}f2&<&A3EO+2DYJ}5_aMd)3Me%A z8PvUrKkdW_lBBVTKaYnO&@fyQPp~U&n?IFH{DZJc8k_j1bde;DP5g_nN*bH^H{mpA z7@{E&ACpEQ$HB9Jk!VUG&tcNoM4uE2oWD_ZqF)Nd&TC|gkwU4n7uF;Oq)_45l)>@} zO2;}(8k-nv22hyn^rKykOd34P$$=Xayz-G9oI1x|Ha4MbUOYE#WC4g%{C+M z0sdcO#xc=N4P=T@HsfxC0$<#;1Wb)_n}M+n>tWR8wB&5r;0rVtQzoZTN!{w4!CGMo zQ@1*Ep9atA@y_l>C^Z?6#yEQfYzw^eek!rE3GU4Vh=k>UiIn!AX2esR6e%|_;#no< zWhuLSs8Y8!d8r|Wh)fGj zcB*NC>C~FM%BWYVTbsO2Sfy@l@+S4F)U8c+ahRtjBXw(&52!_@Zf&y9fmc-O)+QgZ zV+!n#VONubg!|Y_Ak^ejcAiSz+T?J1$d($Xr#5+qP*bLEZSrm#vN3gQllOV&Lp01n z&5ixZUBh6ClWeAODx0bGCKlAm=jH%!F@H=vswIZzO>I_Hq+z; zb1H;v=aKuspJYxz0e3j2FipPrb_l3!rpX6?2Q1l4lMi(SkIH76{Mm58Dw}EY*GFNV z%4VAUBPTeOFDUsqo2asxCjYSpid8n#k{MFfaM? z%kZB}e#uvJ@-rlxY4Qzpqiq*JOL84qR5sJ(dsv6cW}3WlFJP6;G|TPG)7S<0-0Z33e#UJ3L#KfYrsxKp?Q4rp>q5$=}i@=(wk~D z*w}wKiVUWPu_DJ#3`%-a^!ts#JNyv2h7E`5O?AOGQmH&(mx_)E;x_iq2!isk?-9X2 ziK|ROuK-AjULf%n5G`U`VH^hYeEU%d5{?gc_4(1gPIpF0zK@F$!(sN)V0R%fd+9Rx zEw}|Dq2O{~1l-M-y);X`zA|vdOEZGE`nYxp8jW5M_ftM# zkH)oOEH1I#(T3n!-wg5)P77}IZAQW2hjD|C`P86b_R`=JQm`FnFAY8=6~;R}93R}| zyB?cDLFZyN?^&@cWW;jT4&Li~g{lc}3?}(g8$&g-mj;{oFT;eXd>w4+uY&^HVfNBs zik}UOcV@EPI(w;;N7ZNeIoE`o)?{lVg*4}Nx~{FCGf$3_M7H)q$#a;!G??kX6Rs<8 zm!|bKOJSkK-%w8Jo?q38$$2!bj8tmyG4XY+Q z%w8HSl)@~B*-L}HMcV?0*-L|ADJ*gt4?>|>+Ee2&dug!0P_A)GVMlO)pPj$LDPdud z6mD~vy)-yj*j78tUK$)Cg?k)kFAbh2g>^okYiOM~x7A;)3%(%>E` z(qMh|Qis_~gZr&ic&krKW-kpMwCHZXuVt~r?4`j^r5tgXy)^i_s3~<$)S&RC z6e^nG+vmY=tSOKh>o9w1@Oz8>GT9lDgThg31HxpM!?cRQW7h8|EO3}{G5C`dYML>7 zY48_m;WaXQ2Y<8DV9*L9mKjTf>wOjYua(MP8rf3avw>$y17kn!v9+|x~ zxZOwZ>EZOUZw(4TnH7SsNFn4LhQYx%q>$z?duedDkKW61n7uT(N5)E?!|bKO52bLf z!|bKO{Zc4!n7uT3KxB#?W-kpM6iTVX+imcW45Nb&hsK;Y*=RcK9Lx z;MXEE%VGA?;8CG0aG1R`cuXiY4zrgA9gEYZ+Z<*u4Ym-Ooer~?218QV zAXRdwr2LyX8i4s;Wtk!ZO!bZ&7#>$TQhrUv-<3%ja2qh z8XvH0ac!v9FuaQeY~Ci3TM`Pfs|a@l>?H_(mAy3OTTV`ry)@-W2+tQrGCwVua%=-Y zl~yw4=K!81;*)0^DSybE((D2w#WXqbgrMsQ{NKhO+$8g9oMbPJlkBB&Dtl=xvzG?3 zu*d9%pMN3rW0|ou81Q!kCMelUgAL@~r4|B?z=rc=4ag1socC?#G*}#LEH}@1huKSm zr^(HeI};s5^LVt<`Vccg^OT!_P+2pZw=wW|Bv~_?x0Pjx&ERaFMp!kkc?MZj*39M| z2&=4_&Ce#RR>95Bp*vL8%;tHNRarBe%dSZtY+#jVZbyjwQ!__GE>5y$#!1%9ILVqB zHwr4OxTU!I^{Fse?8U?1ToS z4i=E1pE~3nVzEPQqz*el@XEgcjz~!cCXxMcEs#laVGp4r==^}qDuhl|_4FhOfq;FB zOQ!l$$S%(lE)VPdHy)R9uggfQJdErNm|_BJ-Nh!3WWQPGvJal=46MqUnfmPYfaL)x z^*OQ6UPJCJA)+N~X6iOJPG!wZeSvy|_S@vy5kPBI*38tMlnoiySjNlImDEo#C-ui~ zsA$GzKp!KhvSy|pk41;5teL4l6R)ynrvAdZRMyPYUqz>6%}kAE&EzgdBAKW_p01LP zqvSqk9fhiZ%{Ji`zl_Y*;A@y6h%AD{#xiSWY6r6i5W%k@J~=hp^aT;u%$k{+E1_&S z%$k|nSqgsV(oz)ibddL?e7;EowuJHB_hMb(9)){u8h%EayqB1xEz=!%;}s``w28O zVNU0i8yf*@SY%1Li85&Ks{i8uILYZ8Cpn$tBCxP!oaA(llbp_RDyOqmK)Gj@f!~@K z2XN=x098)sly_2aN0gzN@~#@1%;}u+9_>&$om2L)Wh$q0$|tN<<#bN@jG`g9fa>t% zk8A7?7y~T|P1Q5)K#y(E8JH4{$pZ$D?6@}M&ANHKnKKUsJ9z{;>}>Wjwg_++F*|ZL z#}-}#5^{%vr@`022h9hzke@@td{AP|P8<#RAwk>4Aes*oZe$;#o(<%QH++8o{%&YK zb(oJ_3VMT;Bk;sx?s%g))J^>W=$9n6?7uSrzf4!yb`4d_tP^ieHD9B-Y4+pff1UUoTe8)>K{(GII2QQ5G^@b=FHQJ>a38w{Hkcn0F1DW-4tO8o zh~1ES_7g5uP5PMd5c`TxfImnZD(v^k^9fxx)_$Ej4-uYVXO02mc(Oy`{V9}N}qAob<|Qz zSDI}>Ov9JnYi0UMe~ERjYapb>Ahn+{5nmc#*MM-wV~Th=;g_gyeFK5}u-5ert_41` zFX0Cp(3x3C0H7dPzXL`FYzAwn$G+KxZzO1Q+xj@*mrjNr1 z)fL-DVfnh6h`s4HIYJYY$x-P+N8nAe3y^2KBNE?vN>; zHt*ViQklc!p{A>-f!w_Re{$N+Zl1antn2FLsjHi=3m$qDwKdE_({i3>WBN5P=e2S> zqo1cU`bh_5u4HtTG$0SYHi5=Qq_LSNh#w&M%suR|fvRKhMTS9AS%*xSh^9B-pvW$O zyzFnp&l5s4utJ~v?dkWGOd~MZt zi-K`r=tabXFJ&(zEnYhA!7S}dVTT$%+rMuNjzl%;4`PJ(Xe%KE7L|dN<&GC(q*@VH z-cgciMp%Q9vxr808!)Gz;kx$QKz*El8=!goc*XYtiYh1n5TKJYWokYWpaIIsM+Ki< z7Xm^e)AIO9!P-xj$4{0UUGGNa{2n<4YdOD1&hN_Q!Su{A#;3n-0tNqPe&==8FdziiiF5UdC_^ z{lk9xH}ffW!k4nEnK^*5{*}P$ODtcDg6zG~M*Zfm4-N$z+3`@Xn*6(ms$gy7@BaD` z{k!Nyv=>L^PI%-LtmRI4o5}l8rUKO2E?kE{y zbGW~+qBBQD=P){~hiUExdwbl^dYHVSWmM8%3N~_9uz**^-+?D1n=Vf@=~W}A8-|40 z+Gk#cT|P>;mJLNUo458c$}?Xh|CzG0mo;Z*6>bHxXP7;OyKB}n1qe#J8QHe)UiL2<7s9eM&r(i7?@yJD7xn^jq3WNb3 zIR$IE0Uo&lu3TAEZjeV#!CG#RM{bao(}6I;Bcos~Gr}V?LdzKGFSBE+16%@`ud;LG z23zf!c&cUM$-HDVI4%uvORhsEzf)jd8{jOB*>nth?lp%cvu|6~!LK_aJWw4H1?)59s-$bsrM~`J7mfo{X<7aBKHo>eU8j&;|T8;(M(wfek6DV7C%B_ z#yjSl?Nq(-o_gb@-i+sHY=WvyQV1tG+-lD}pTquiRoSzIo9N2OpRC{@r+}sk-bXm7 zU|A3}lO|{8UJ87Qg5Tl@XfCjtGEyD7R<*r_YJjx3rLyNC*4s+KCYusca7)5xD0t*p zz^xVhMg`zD0&^j9ra;tCwie`b`J30(w=2nW z`Ag?>`Ag?>@v+x#_-ME0ZZ;8zTU_p%xBiVg$LKyrb9V!`(!1l|IJ?2*S&Zl$bF7w_ z6*c)$^mMm*<1jbm$j#z27~Ml|9yzkgO!>%X^xTCemV!|Qb{9F7Qy|N11v^IJeOfc7 z3i-P%%AP0ey@XxC<wU8DYR}K`}gT0zPIofW_R8k=}O3M8xGl7R}P4 z!@9DO%E!!g%U&yhMFvMr0WAvMto)8j<q_>*WQy>ulVwEVwR z^3y0(GLnH?s+sylE9sJfW=r6XWZRn#M%m|k z;zq&u(Dgk-J&|z*cJ(Ty<(JCd_kK|NbDp?Nig}-+IB^DI;BqN9{|tsL)-~DMu<}gk z7={~{dA&IvxCvk?zDzSc05=(hzno&+l@L*FdB|g&f|o(uDB;7;hLx&Gn8)PLyx-go z!N}{NJqE6#O`72)6@mCAsZ1NFaF?dwb)EeE9IbG@r$PnqiB|ZS?-Z}Ru+$Y5PaZtyR46pVf^@kX*;wqnNW$}wK$&#b$%gNoGc z>MaQ>RFSzuB6AhWz2qtSWs#3Nj5%-?0%KT8*SpinJL^aofS z>sOug%P3x?nK)(S@ApVNda}gdQHd|T62EyQK0R5&+13|Eb9-qAc{S(VsY=1+}1MaQ7d9;6)ovr$3e?zXnR?z3N3v)nT z@n+yCb+1dgT>H4;M#$H(EL)2Q8**))_>~)bpETsG*$HL#*&(T|0;Qe@(NE)0NiW&0 zIWB4zfl!$FAJq*|BY&x2QiJU0hV_d#1s8SE%oo5RZg}ETy%6kOq)Cmm9;M@iM~8xo z%1_ndV?dw)Or)x%`wEhMxg zWzT`q>s#E)?$MM>QC-m{UASAv#(eZ%84|-W#s~2^)u>ZGI7{4uV6MBV6TUw7IY@!u zd0kb$PhehGNha`#sHN;r6gLoP&=y;o-yxXe3$TWPY}x6+bOoj?1YjnCOaS*1$OEts zK>m%oT28fZpyeuVjr_Yk_|HA~jUN1;9(>%L%6#f+a!$RT79M<-2cPD_hduZ%9{gwz zzLy6-*Ml$f;Fo&vvpx8GJ@`vK_{|>tZ65p{5B`1+{yPu;d5wP!{n-%C<|wUZpZf4Q z^ZdOYsWw989SKvu2d_PC1e_w{&sQoW9RdeZzw^4v3zy9W=8PW@G?xO{OkgR1 zW=8?48R@$V+ec#U_F8F0DMf~Hvs1z2N2T^ z(M%u#!0kT)XaS%NeiBla4&Y$|od9(C1wbKyuK@HcD8NT_@JuFowb!+P!}j!NKIE$)0k5= zt*G{BLZM#MY|R>CFW~PoYPy}8?xm(1Pt{c8)r5l9gh)GmkrB0akx^g6L#NpKI%{~G zHEd-KZ=71gHQpLfh-%9JUbAvIe+DfK){Afp`qP8|!-H>hcYRQvj;9)zzpch|d6Oad zA!cVIzgVMxs>CORH9JQShzMQB+T*St@<)0UPxmNZ?!jN_!QbV<-|4}x_u!xO;6L-= z-|*m%dGMcm@X2dbLpjR+6ucVoJ2hVBzpnKTc;AE1^5749@L><$SX=MN(H{J19{gMn zzNH7h)Pv9S;P3U|i#+(v9{hP8{2mX!M&o%ywlKulv5VPLemtJwF@@i<9m?Ayutxq} znw#C7BHTmFzW7SGMzgykN{PRAHN`=e4nOO{zA`4TX~V@%{tF&+Cg^Gze{Xy6i|X-3 zpLp;(_Kf_4dge=>gp3fvT-Gu=Zmh?3j3IaW&HkKp8Skjx!*RFE@vVo$hn}B%i zS-rnrF0ZIFpCI=NoA1}v=Jkz==RMYav-}1{Zw22g1istmPHRrDv0zvdW3G?Zza)nB zD=jrKWMci7#*Bx_TE~@whV<#fAzc?Rn{;=ruk*YfsEfXryvy@ma+SP)hk_kAZ!%^>dGID(#9BbP!G4Rjbf>K*S}Fr%B-TU$Hdm`R4``t z90|mp7&=@z?>z;}`(_RQLZ0^(UN)un#_;JU3!5+s%4|9Y93RApx!<$RA4(N`SFuk) zaFK#CZ@{wC+#kbV?_^#~a}=E2nC8g)&Z9BMpNzK&V0V+h!b4Fo#?S)xMo6`7CX{5+z=Sib^G^SEBY zh^+6~yD_omO_1js$QaMdi5Ph~Vf4F_JlDq32Q_*!SkeRq{F!xU3{p?k*NWgSEStK? zyRvIV*!~SWIQKEeu8ZYx?)^K;GAUdq`WB+xOWru$Aa6f5pYXvKtZ%8%vu01ksh4E} z_eYN}7w90k3XOZ!T!x(;`MaP1PfYTrY>lY$|A8&DIL&l{OkUU&!Jfnbu3U>Xp$1as zbFsVeU*t{TyF)7S0)W1M`ix(oZse|`l)m~*mxI`-PmHII9t=m zi267yUZ-Vufz{j++p<6E^TQ$cKyl<(Fm(JI^^sZ@5A+F?%2EKtn3hr24#1f{0389G zV*%&^UHVZ*%c@~9s{`*0KNjyyVK*U z9U)lCzp^_(X&kT!_l)laMKHB&7?6{J9KhM`pswZ!saxzHpdiu#_#O=`BhnhcJ^;f= zE$fET0^7na9hh?PudD^MOsfKLfr0N}Y;05bthYzSZ>fcFSo4WMHq0JQ)X6Sxz= z8I1v~2XH%q#{s-eU^9T92)qKIG7gn)LxmU9j5v(^oxl{GcmgQ=U8-(oY7wG#LT7DM zBzI%^c?gz%2vuc=aXA9%-lwvZ9RnrpG*tOFfC~X2Flw}()u`eF=+Fy^{OdjVqZ+>$ z{A)CxCN+Tx~Ojpk#tlRsdi;fC}DBay8p|n$5f*5SgYqBVz$vO=YKYl`Q~eGnHKd;2?nf`C1WM z{Z_OUM$wfT?>byrj&`fRlI1OsE$u#KYl&;bgZAt`h^f_}^-MraJp^DpfZnHamTdy% zN>IvP0I;4cqqQ=3kF4}9P)hgVQZz-A^z$0loctTW+y8V;3ZY)}N!!NaDe?mFue186 z0IW$wNRwLjCQ1wNqrdlVQ(ma=_7mj>aYF92Lc;23~j%>euj;0FQ?TVV!F!Q`+J62GIL%aVcl2AIN{ z2bD#xKc57(^ej+Ib8#uUUX$JMkw;CLJ9^)wNdaZNQCbLrvH`e^Y>t>bm0UIgl$$^) zs|4^00Q}{rYbD%sO+-`m#8KotqRb***^oECf(_lCbIt%St zcq(fjs4^yX)26|DA%OOEbsjd@y17iQ4jo}{HF%B2ttuW0;+vY1?{JsfrdK%6m`d1uDt6&ObnWk;6~aLge;a(t8$j<< zIful9!WZ;qsQ?}YOW|ox_ZBS)N|(`k0Q{W=YFSrYey6{C#$#UUM*KYDFT=^QFAkVY7OckD4n#Y|`FC))k^8AR)8uIikfd0pbAABb8V{rKp_+dnsRiX43 zN@eo_oRJ20qp;;0XwEh*a`m%G8#`&5>)E}-lHrK~rAFO{AGt*5Kja}K;% zHW6lZNXN?kJWY*G3vW%(y=COTr@Mf(a!5%GwQ{G8{9@hc9jSdPEkbIl4p81b$1 z5w2}TJM^@nBTcgmX~1#Y#*H^mg~lKrBQ%~>wQkX_GV9uuBIIU)R0d~776SNyz?A^T zwTGXV0r&$z&spfk{di^<(iIt+c^3hSJDKQe@|02{f4Z({6q@%qq@shtvHs(>q5A`x zi94j?`uG=B*P!7zmsQ5$g7-*9eu_t%34=Y_Mt$v$y|9PL!*G*ZosoWm8+!xgNAcza zsL9w4$7=-lFa}zD!7m36ONFaLrW_C|x5kUVa{7z}e~x7?fpGiD6L`i>_>A-~&j)3n z94;}pk&1n=eR38hW9Mj)_M6-w%DiJN-~+mQ=O94x|f_pon@WjGmJaQAPv0GN``hx^qkq3md>_#V05IM zTfE5P55Yj(Qr+tg66c7uhap|E8KJme1jTFh5U2Z#5V$)x>q;kKb)lIS1OJi6-wNUPy~2+5XLJrIGdmgiF| zr@{G);*|O^UZjR09(q%>31*x`|9|Yg33yb+wl=(XchhtT!A?4RXLl1x0D%x75Qq#( z7{d?!wA{+&eiX3N-dITImMMZHIJ&35Fh=?dSp&~fzK@kU>P#kdn-gm9q zod&$$@BPmG|NA}vCC|fVt*TY4R?W3{t*-YJ6Tc1Vi4NeWTb`0`@E@dmF(v-AL*x5> zo}$<2#Ja}jxZG4svN>K1-U|iN92XU%Il8}GiRm33z4gP#p)LL{Lujo0e(^H7SwjHk z2XSWl$>b8n#t?!x42PZ`2wwp`14}@B2VxXshYSGMtvz-#*FK>&#+h{(5}-y7npr0W z&CH7F1=Fj16~W~ChCllRW=FVt==ax6wVDpqGU|`Dj6O&Ux*zA7CH$s@zX>eK!r&_` z$>|6$>3}tAt%tOeK=LzuUl|}n{b8x4=OH~{%4w%s_9Mc#C<$8Q#EE)M zkRQ*1O11vHLC-+%rYAMOmzm#V!Q-K5;LixZ2q^}B1>!LhyFi4F2Jt$GQ$dWP{E)hs zd2R(aBnF~+M-X`+`hytW3WRj9LFdBAUra6*cCB_SxMc)#S&s1YAv$mgh{s4=0pdLn z{bC!{s4vho954FnE+(8^w8krmlA$63I(icPO=wxE4yWGSgyx%+%-Uq3YdhKFSi?NPoD?8m}&t2ebNvh*- zt_eQ{Nv}?-L?dG5s@!DsUW~|or#rLwp>`iqRzJcl}C%(yo+74y0Caj*H8%_8o zEq~RcFjeMrEG-H0x5GL?*{1i>U9lJvu*u8}GB@>$nRxoRqtG(H`ZDOWT;nb@BJJ3` z%Y$_=W(Qt}@OUS*>Xjf)1~H1ULv9Cm1-R}r!0kqMLslVVB|^&97%lv&y-Ezx7Jbfy z(;@VA6HcE>m^p8~IG>^lUo%1$wrEzr>kP+pNH&y++wD1=J0relho`lUu``#yV_B#Ok@l%uCN0+v;Ow>~%MmJ$s8>LNye|RB=$fW(3z5LHoJjZ^%Oi))^3zfpt9z z4lE`^HJLPWa!|$Jpv^TUDD<`L2+l-~1J@z$NhW><#K$1Y78%J0P?!-ALB-ZtxRax? z-%=B`8Bxh#6pY)lvQB2*eIJq6`{}kww}n^2->`cN*8BYkt8$T9?6_O5bd90(u&(rN ztamchePHt9yd6NbAism=?YaIK8J#jbI-B8PRbFK(KM&flpW>E7?)+>4W#jKe*zb8( z{~;VE4aN6znURP0k^I?9FUMAmp12Lg(=($BI*Xi19huI}&Nbl2$!4fgI+X_&_82Rt zcX{bN@eM4j93ZDo`Jz2k8nk*nz~*f%4xO{WcV9LD=LrbYW4or}fT_Q`P};S6K5eY> z-?V-@NL+t+q2lYH6U!--K7oDF0Q@qzT{CgG>I#p%2jqOgps1}-f~=k13R zz;(CqLS2cSU#}jSuyC40T#E?2#UW-=GUhaiS<9HRXP&8$dOGT4Om&dp0F=-2GE?eL zUXI3k%JFzCq4CPTHYxayzClvpvrJ-RUr~cWn-=`)b!Duwz-HB62JLSowc||8gv;x9 zsbPjd=+|1IvS}uKD#9I9g_?$sOD6nWgtw^;ue{oXUxo0>b%wd0%=?CU158=k7PaY1 zFsDj#afYqzWx{Dwxy@V1Pri$3{q1N zAiZM?p924r+;0|KxZzxV$M{*^F@{lIUL$^y*9gSV)wS|hSu2A;&(vA?H<^W(LcZ7P z3DEbu~byO84`g*Unsn#%D{(wq}$ch}IsC)EdF=6)D2O zmx<-(CKmVCWTdJ2yvy5pT3>7d9-vyUYYuV7}R3nd%1|o{( z(tTv@fV#}c%tEK0qcZGQvZ8--4!?`as~*2jlx;S${D!nxWHHAD&4{*xcj zDztF#Ibo~vF%u&bTeh*8o3+^;M51G8IHhzmy9 zeiP0O{I9B-Gfr83(+FQc-o=nYK{zp3WhEve>r{*mKSEkE*rU%;R@pLRD>ofyYWzW) zj?55um--n_%*B>Gx~Z>LLgjNNJ*%>;z!a}NGP_HZVIMRHb8lME|BZpw@As`*PUZ+R z56bOvKR10fH8q4RJNsE;XM>kOY-BKg?DJ)-;s2iWHQO}J(px9%M&^9k$m~L^=tky3 z*~nbo3v;6ETrTo=F6v98Y_I~;i_BXWOY$z@b!T&lWOprj_|#k~+>qWu>$uxEc`ZtR z+VrKKI}H&ton=D}W<2q+xmI%gClXbDX@od5te#6=)_RGXB>R#{o|Yt^Fv$udBuUDa z8wJBq-{~kZs#Dg(2TeHF(xxfl>rFVfd1WU29FP@8E7#BClkyk`GRlWwV+TJ4BSVDD z*&?Iwf5oq;**rVBIvLI`gO`^9CQ{6e^8U3|5HYu|A78*3e(`36qy>9CtvxE8EjMA} zE_}JVD;x$%9K}X=lbpCS2>B!Gx6fgMWd;FpQo#*!qZNN(9BZGzgZC@z16>e%xm8#q zaKROSQylC4M*@UM#BF8tnvE^-{KTS0G}I7yFr!lLcH=ao_o4A~gEhI^3)p0zbw5bH zlEvs9XHD+27=fpe<}P2wsVOGvrkvowX?4g$hzds@ljoCorsECJn*2GMCg(O@0>f7* zx!*6wCDE#>_XzHF3fEZ)n(u_;P-zGhpG4ha@aO5}yq|Zgn2}H2Wv);sW64LyQf|Su)2x~Gw zfc9HO`z;4(*Z9dxR-@^6@Vn>JjFyKa=jHce3+y}=Z9I9zmoR1xOS&hiNT{wz457UU zP5%eznl10(=S#Ny`j7iHDR_)6BYB=^O(v3D{$*4}H(bf(L~GK9hmb+k=C(Y>-w~!1 zW9p_m5VwzCq7IHaf#6Ogqtr|kyHFg6m8$b8f zmd&d95C+9o+f2fbx!M90jPVuGs(G&gk|rc6KjGFUHPv!H)88iP`H5E3YtoNj2Y;_b z@q<|mqtIwQiTBNL(D7rK-v9V4a*Lrdk>yv9fvk{p{0t_BsL(bRyyiEIl*S|Fm(l#- zRcn$}bLuzXzn7#_l1Y1p5l9wYj|USqzhRIzoiFnNzijE{^(?bBnSfnKjbgR&(}<|H zYJ$(AdAiGOsN551=+tN5M%%v1t$?&`Y$y_0lkZ&$z`tAAzxY`}V^lTaLt_uKqWQTX z#^VSzUB(aABr}L66ZbQ=o`U=mpzUz-ndrMyi#8+6{d~i$ReYi~^{Ms9a~d~I8q7jk zlZZ*#te4GKN)2YItjSxyLhz$Bi7%BBW7S;03V~Z?9P*XYgc48DT_4~pINvR`^AWVc zs!5=j?n8C>KF&8yZ6oHZqxS=36;nwf7`mT^D9P7Q6G{lnM4mJh-#b&TfSkN)2ZqQs zoPC=zMpSY3uxbc9>GhWxim!3C<3uOssh{pa_1w-kIjvX@OKb9g&+!eo3k%Hcu*PUr zcuzro8l@I9MjkS3D6AtGpJ5P{F4Nj;Ut~-)rP=aW&PJNt6a%HjDa?_pzBcM9r3+E$wb~=3f~-&S@yXR1T?G$Hg&sR^ zBG$_ZSiH^he^Ll4@OQ^$_)26)cGtmwfx554-ax4CGDHBq3#&Nd!XHaqojFJmJOFPj zG%JFjb9zB6M7*(};Ejd8tqW4{#w3s61=xsLA>xe%FC>|QH+HY)K)kUK@y3FJHx?q^ zSg3polYI|mp`K@xoQ*6()iX%KOe-|rYrz|fd__<$#T$$49RNYa8;g8h3|jHVBHwNS?cNOC^ zJi!~Qmua&m1#hfgw*4t-;*HgF?e|C%Z>(O99pHb&8>^>yV3!!k;iftK4ZGdhw~;INF&RII>Z8KtBZ zI4q-_v;v1^bh{liujl6OC!}y@yq-IxaAra(oY|`o3@M!17LXaCXtyjF`hN;C79z-4 zv~nA>4WLxfX`8jR4lr(9%uy>i>@kwyn>2FS5v2gibWs(2DE~T zMc0s4P_gKvcOb2TibdCvR#36%deRCi7Tv)4XM)`I8r?`*LB*n*a#55ds2Iyt7e5@e z-pKs!RtysX70djd&4hyCk@+*5NkPRje<7`)Vwt~6^9iU}=5M4GR4ns%(h4e;Y1w2H zR4mgLMnT0g1Hve%SY}8V1r^JzBaDKIWrl@OP%%uFZ`DDO1XL`up1l){f{JC7LGJQ8%8;NX?7--Zv2HKY)uKRk1;Eu02O1xhTvl? zhZQ1{Sk~F>1EKrCM;dXiQnar~9w#wD`-(Jf4iYj%`-+^g0y5dr$g4Pku>|cavO~yb z2#>seB|~SDeB)-OigJo%pqK!(FD7S<@Id=wmYfxZ_tCy0ugE;R4#Ohy)(Gmc1nuh$ zU$CwfYL5cO9^Z)MA)Vf}2cUh0wqljfE?luyvUvNP>>F^MVKS9Z*P9SqhNqJ3qbRUZiy?JIldG|+<{_o zp=e*(dp?4BiuRTL4QC$3ImrH&MO3t}>|Y4trD$K-zcH`QR)`Q^*=NszenI;R5#lR* zE>Sh=3ffop1>Z4mUL}%!31=lm`^vtY)u?D+*-I&+XkXd4F%L!i%3fIoTG76;H%tMo zXkXdSp9fmezOrAv88p$pvKJE*>p-+G>e8McjxaXMg#ld{D39)>`tZTVK-;j6!x35; zj<7z$k%oRMX0NHF`oobSehiJ#7$!lQQ~a3gk};$Z!(79Wi|}k1&HjLUXhHi@QqjIl zFvQq?;RxT6($5u=ji_i}X!knkEON2Ep%v}RFhKjF@^IuSlnaGGmlFUlr*ohQ(kXzK z(or!2tbR{^}7t`b22uYsrv1@LmN3@n1Q0C+hI1JaTLGT~emkfsy>FXtM0 zy->s}vcJ{;j*HoY1T0q}B`2Udet054}{Ac*cHXcNw=fcA3&csZ+uQ2;OJ zVaZSdyqq#jboy0KA;r14lrc0(d#G&?IaE1i;I2LRrfPBQvffgD8y<~ z057M5Fbd%1bPVy8OaZ){&cY~wm(w-05r!&&m(xA;0BlnLFQ=z43gG2bh&BcAa{36P z0A5a|lt%%)oB9c`B&YyBba5JRRh0q5xjbvq8?23gG2DFN^|sIa`CQYX$If zwh5yEUd|3-Iv+^@FXtctF9$b1qqcecZ5*@FXuf;qX1scPKi+fFXsapQVQVZ><)0h zsQ_NiClaFoUd|p#qX1sc*Ak-uUd}#=Q2;L|P4IXWz{^PwY8NDcmy;3v5`|L$FDDx0 z3ZwvDPL?nV;N@foX@LTGIdN%I1@Lkj%K54ScsWN(8U^rj@`X_VFQFwY0PI2;k)m(;jc<)kk-6Mhe%%&I{ZKZnSWf zb{+w|oUvkmwVg)*FK4`P!|gl*csY}`j{~v`0A9`s!cDOAcnPmFRk*2k9s#_ZQ-qs= z+?j5gaC7Xu=l%}vG~wpic?9rsP7m_n=TbY50A9|lAp5fw$RmK4bFSn*I*>;IFXti| zND~5i1n_b$(P0(HBY>B4rTF5`2;>pK%UPrYE09M3FXw6P=@uU^N z%RQd70(iL-Nh^StTSHm_yxb|I6~N0qk+cGMxhFr5Y!$%EoyG;Cx-kK~+$4ZkV*+@& zNdT|L1n_bX0q~;n;mGTFrt7wZt5`U~WilM$lpBt?sE%-?9K%8ZymCJ0&@@VwB_)sCsNDlWLgpMRRswYVTc*Vy|0I9%0FCkS-9&8~r1S=m$a|jmT zAgZd3m(vkMzwJj;{Xx;b%ul`y^Zg?kU$7D4B`;c)BFHTT^6H1s5COd6W7%#Y0(iyO zo`X;Y@QOeB3TS!fiLcWxdMl;Z^Qch)yy6>JI0f*EZ=_xY@QOb@5T#WBulN?G&9_1m z*k8VWhx$pji+@v$nil}C_&$;f;1&P2n!%CynGpY;;R@gt|ABcafLDCK=oA32coM*i zUktJ+L}c+!&{Ph#v39Fh7l9efl+cmLE+EG@1hr36~%s!3-r70jnrF3US*Q z$k`b$w>j;92luDoxFs>0( z4*{WDDLTJOM2GmIe>p%jMswt?ImVru6(U?$&OgqRG#4?=D1=_^r?HL_xUQT9k03eDU5TFdQz(2mGDgB@ z;+f8cI3r{?Sp=p*{fQ_|gH!Re8%)3xn-Z5y^Vx{4dkn~^U9b^!WXA*qx8yu-MfQ>| zq=JYQx}Z6jRyTraR(}9A3}jyl{tmu5fo7C%PN126imi_-lbG;4=H{!s0qbMgH53XiTzOu*A18pF+!JiKzCo)U zutDI!NX1W+eV?%>kR8x3XcfOa5Z|M6F=;%`@N+qezejlcw%aN|;sYiuKei#Qr)MiI zF1FeaG?D*AG?Lw=$>WTj=sU<#p#59 zy;1g#a+B5d>^1G=_Ix2*SEBxltwC6YP?hb1tj2p-Ka&wr#2?q)%jUQbTyZs|{*l!5 zSgj@@i~B=UhvHYY7)Rx!$P)}hJ9$yO*qTyltgdNB=4d2%M`Y;QB%Q`;zrsWgN94E3 zNUOuyrUFhzc!wKPnI}>ht7L(xhrdG(JyZOHqbwc!jeL>j&}Kl3-Yj`rnKgE35h@YP zKYQsGNVk%k@!N77jX+8D0{*tk5&sC-Rx+3*xjR66ZZUf<<2vLTh0F5Mb`^$s2n@$Z zdlt1b40vh+vKmf>)kfqP(EPKPUeZX%+;EP$OOb&h5{UGZWCf8x*!-#>uI-e*2Fs@OXMu=9I)DcG8wk?>V}ZC;Dl#%N7yyZ#G#+h5JWt^gjC)250g-RSU!HG#u0b^>Z8#_y5(;A~@cr<;S*zYdGWZm+99 zyH!l$d(bB;_cBIvf{^H*R*xA^<6QqChH`pHNhCXhUUZAf*vF|M#_v+|FW0uCs(GMTH@olaJbu9WjIc6Hre_n?zr##!tb?D8>L|9bRUjKI@Kv*A<| z>qjf8fH{@uqI43A3-MaHBab#mxqpgKey`g zkS;g!%Uw*oAc)6rnpj;PB(d-EupTl=mxm*n+;@3kOw#3{gyyNs1I;ro54}LvI~|$9 z<$=NVPJjZqJRC>*LSzh=2iBzT^01e*ae3HH`a9$Smxna|XIvhnmDJ^dY5)n2Ql?Wo zPGLy0EsXa=fAHe{kP*skdk>fft1wZ_3p6+e)6cw6gUhhhnHOo$9?Q+VXoIWJqvqu| z_>_SgtOob+|9N(UOE6aEAx$NCyTKAD2sAhq<091HafF~Y<;*?fyF$Dx%9(q{_cRQ< zP&_hz#vA~0BubF+3u!%b&-j(JCui;%zme86_l)03>zR87eoP2P&)hR?Vf4&BBOr{P zxnp}uF+Fq7s3VM?xo3oh(KGi90ENOrJ#){fXHNyAXYLvGr9t$}JtHcNp1Ega+3cHo z=APk78_r962`Mvjcs+u3ep*jFGdz1b!t~5NBiEh_M$gQxYR^Dz63HOl-2DlN2g%DSlnyhOwJhL;aR~f zIr$1->scYwxq4PSCAmjA5BK#2jb}yn^G@JJu9-`u7jFX&x-7K*_qX|B6}xk^{mL= z#j&HF71#s?h9mp%Y#4PuC_$ijRw${S z6($&BY`<`%2ZYi;6OxUno)u{KSqRr-3#HYw!bHHcg37TfNW%FTPvTkOb`C5+xO!H& zT>@*Ugq{^{S%9;!dRDkyC4!z64`TjT&kFa-fR&COIQgWRmb)+@Eh(NA?o|P4O7X04 zuL;zFlpY1Uiv#IklAaYzAC6?=nZ6zwi)V$qJkW$PU14H@yE4G9MRGpxt_o;Br)Pz` zS{U`La37Wo)w9A~6X=ewy6RcsJ}P$QTjE*a-X1uYsw+{3m2NEba($?N>g5(Mm;OsN-2+eR=5KsMm;OsK_NE2dRDlDg;CE6cc_S|XN5al81<}h zM+##+E8IH+@1RE2v%-BMXknSumU}X&Eq4<#aGwfl_0qG#eL8p#>Oeg!+-HNFC)KmU zeO?&#tZ=smS=Z`W;cgQ~JuBQD!l-A3`$mxM6SDJqq}{v@+TRJjjFwc-3U{aYNF+Tg z++D(}XN9|4)Tn2L`-w2(S>b*boC1~VS>b*eWV@(mh5NM}Gpc8WyDxY@a#GI<_d8+K zv%>vBN~oR{?vKHDAZ9!(+`9wyQANhH0>5xL1^aHTunnfG)3d_e7#JY^F=q~#O##-P z8BUu6Bf+R=h5M{9>RI8wD2#emxUU9Sd+J%??vSyfo)zv}!l-A3`;IW`S>e7XY1FgA z-6=8ZS>b*lLrOg>+}#0gJJhqn{X}Bav%=jYY1FgA{aRwwv%=jcG3r_2rUg08sAq+n z9@H*K&k8pqI1YtV&k8phgR=>RI7t2Wf$NR=9C#Q}wKH8wNRa)w9AqQqrhr zg_|#odRDkigi+55x49@#&kDCd81<}h3#D&;l9rbN+qy{Gt7nB|!kw&rTskqji`S>axy!%96X+$)1zBaCN-yGRF? zdRDks>&Q~i3U`Tc#~1R?mu@8q(@nku!y~dRF9|NLoEBa!&4oY}K^{mL5p>x&|)#6!^GfUY9)#6!^bB3}R)mHs$F?)t1G(H^ZgJ-&KOSp=KBU~oK z5l*={{}VyJ%Bg3C_cL`fNvm)M^Y1OkLE-$h4tYDVvS&?Xc1U{$y*LqeYDiYAC zo)rn(eh-XzRwRP*#XvnP5_RMwfqGUX>e`$<)w3dzW^?jX&x%C4&B;?eD-sRtP5Ab! zo)w9x{TvwetVqP<)j>Tg60R`nS&{H;t~2UcfnUh6A6JWKMWV6&G8Cw1MdB!%E24T< zB%0fABZi(8iK>?Pk|drLi9r=4=~rMxRwT-78mOKX ziLNph)UyJo7gVO66^TA}f7+f_H6LlJ?9GT#&x*uQ`+YF#S&|5Q%~&sJ5$lu!khoRh`!>BetUpujONID zbc}m9^|kQ+@w=pTBU$#WX1I&8Ol2 zKksYdt?dPQ@wM=_Tm({mExc`8LCetew(HQOuZ8y-?NDC}?`@V$eJ#BAnXCF*cpoxp zK3ah4@P01Oop`2mA#Ui|qqFcSKGL=Z-_~V&VMX4X1bPhnNF?&}M9{j`utM|6jN6UG z%@$LpLgrk%e?z!Q;PAS_X2Z9bhJ>JLXNwc@Vc*aNH(|KheP!4byhlxjzKmJ-6IBKG zQEjE9Ex7eH(ET-hFvACE_|r^VCE+dKf$ary)_#tBrY?}fcBKmo=0_oUj@ValtkN9dgLG zR)-ws+FBiQIMrLl;x~g^gUyj7dYJs#OMgcC_BaKfC9n1Kaqit=ml0}wG&}?7IkW83 z3Xv|M=S&GbXG-8XQwp^mSjOh|UXx-@Qtc=>CmelCV~Hib5sHsquhQf@4GLNvi^vy9 zORfOlDeX1Qrx!9t6|jXne@2<(ShN`?wlJ9qfoi(I_TxBLA9)P!U2dB}X(k*Aw(O)D zdhSrnt}dTz(ht*O(M^B_s$^Ci+MQRhwohhO%Z%v7$*kz>z^qPYR#!5seJq?vZy_tb z4#HLshDU?=I-JU!yH0}=dm70%5YtV39j22VRE;~z*t8Fu?68c;pM5HQ9eON5l-J`5 zJguJR=Vtv7EE4O+dc zLG&JnN1v&9SbhE?&w28^oX_4%@a#Kp5aw8_V!|tj8C9jjK~OpFmco^>kg24;E#NAt z^Qe&^sCOC(s{Wb;wU>?p!3-`S!94B&(Kr7X%OU`EZwG^;vN0a}5ZsT!l||sXkA`$9 zh#NrQ%BOm7X@OB+^0$d;--ou!FYx#cLIVyKsr(5sO>q4}Wf*$;@E!)M|7AuGHhl6| zKOcJTrk;oJ*bJco2a8m0M9gQ@vlT>xG1OBv*EGO%bh2XT!1#fG5BgbJ@Ll8GVO3p~ zA~f<179(*?;v*IHz_KrB5$g`pAi#5_m^UQjLP=%D>qCUyIz z-kp;3oyk~h&>5zQ&q2=5NH{Ka17s@avUXPa4iinoWY#;tsB@D>aq>&r)Y-QQB_5vA zV68D!Qkvd1_j_7ZC#47tIZ)^gzal$5WQ1fM>@^&{bf+?W{m;X z#S{?XpZL7FZ#Bls7N|aktcd&!k@B8zYvV1F@}WQaUVf-;x&m5NKblO~cfT;UNoT_C zZhp5cKfPMZQq8pTqSqvKA}W|WuMUYDKcN% z_7)@ab&AZ_x|e9%m>K+T+xv~o?G>+dx+57LsoR`Q+N- zP1o^Ts?Vb{F6*P5}U0^TauN((HK}#xx?=&8~?5lbUf7)^2XS3z{ z1Zeji$AcHlg}wnE8Ac|8e~$5$0q)|ufv@J3iFW@0ccY<&J7K`Lv}k}7b?hVv$ZmX~ zWDr{TG6XJQia{c<7Xm|M^D#KUm3~eQa*#KNA(G%L^78gDRQTg2gO@jmVZy%%zWSfc za72KgdqNA}SasgelbFHK;En&PkQyF(I|W7s#~Xear-TvjXyiOh0`_Tve>KMxkcaT# z6fV#R99{@cN>q6?sDTJCztbeTPp3Yaa4|Qc)W~QA2l2~BVy5H_)iVMowt(s(h}UHT($Z`jm+Gwt@5IGD@4C<2dDp}9m8%z@;ydk z1B-WY;EV#;@EF3+f!c}(K&+wuAB_~}sI{UWw|DP$0C(W3uc>W7828J)kC{AQwk09h2FeD*ESgmSPP=+LX(cwcVtUl4!BmMj+5&})paRCy$%#gt{GJ; zQ-n@dp_B@)ZLrNLa*Ga;t8K9NQsf>zM6R~M>VKdm{{Z##jWNzFXqP8zYKV*nIM%x> z{0+#ppVX$SKy{@ogy;Up>9}t=53<J@>F ztcHUst7<`t=IMuMu5Gg?QZz67Gn&hHe^em@BsmHW9!$fy3Xj>PQWIEV z;oz{=sIbcrzK``Z55&7CVG3nz<+b1jos1dnW)QEFxCcbPQ$Rcf;t>+-LFAo^6w8=m z3%Ej6DH%WiUyyP6#VHvdSlVO< zw1&+?Y-?d0S8M~T3Gf*Bc?JP#9|N_NL(i0 zGLvgH+p0A9FRJ4b`5HvZ_n64!N2sZwV|L?N zAXA&BCfWVy6xTj+c*p3BQyT zrj)36BX&8g&uY)gz(!|AZ6yTeB4}t}Zp5lO-t0eE7hOcujQctZFI~lL=nz5;RDEcc zGFESm5ihHvbBHw6)rO(k0AAgaQ-r3ms#X{Qer#;20>N4P?UDQfflgp``ZiVFv1W*~Fr!qu zwlFvNh3T~3h=~b%Qqo*@aGHTL{f*fUGn(1h_xWN6GL*VEeD4mLdh{gV+3R}V6r@IYw$9@xJ?!(7XMSaF&J;j z&qJJV$&-UT6uKJ|MF0CtCfQKJzY8Fu2P!8A_k!;zhc`+$`U_^1{!g0}86uBqKbhi` zloU$$Vu}v$nH2njfcE6qa1@A#zHcL~SPoqK?X>)?y$DGQZg^IWPN&7kPTYkkK<+BN6KZ~{6NE|(^$#mc;1NJ zNSuE7-B4A^8R2-|s+(I^zVPs)XKEt;1TOC(s^dq`+C+MEdpv*V*5GYwaWF&09;d}DTLf%{E3~#uc5U{5QPan_ewb>;}oamn80he^WWrm%34!mEJTc-D`Icq zTu~w>TE|msqsyq8-}OZGL~8vK#-K3YzRZM~;i8X%hV`%Q-@@b_VqvRpS z>85JB*(RWcl(ee`DH9+PnZJpp*iW+sFQQG7z+eFV;i!#5KjzM0rEzn?pNGqE-2@Xf^j@8|yAn~8Z> z)*szW%#W0ZZzeXspF4ar@!^|^Q|@*PM-JaieE4Q!ysBJ?&-DK{+)OOLpNsDd>W#R( zbC`D(XJQKf^S__Vsr(S>4!x_mJ+y=)o$-{riskT19_Fs%T*R2WipPs+jW2pJ2tDkg zXpH6@dROs6Nwb(~Mqwr5@AM>1@~+}%5n}EtZb4G-D&}wfEOS>e)9|ih8%x=r|NUIf z+U-bZ?kdhfQva^v384Sru43BZ-&M?#`F9mFSO2bJCe24}Q5}$j<+xH5!X@GfG&~X<|obveKe~f60oAYEb?K9%V)CgRtUH5T6X8z2x*aW8!>MK zEvUVXxIlmWL>&eC zMsUjFPoJVDpf!K`)S5qiYOR+Bw~5Vwin+|om$~1Tv`~C8&b6oAMJGNF z>3IyVJ_FYV{{=YZEaG)wiX4_r*zd^hhfezf#!hi&ceH%vz`s8jj_pntG& z+vKw3H7x1|BQ#p85Oo;GnQ)<8Z(GCbZFi&ih0~5d6Y|R;(`Yt+sCHdzB%jRW>&QyQ z3Hu$`w$pIeGAsPLIYFx=3r;`wiL6I^Nc-(3vnsU+XWv6$OeT#PLv8t=YYpZnjaim7 zW(0sN+PtW?3 zeVnZPMr{Duv~$3sqsc|yL%|e}H+l27SbdNy8}3{@;UyFe;0J>yda-HKbCFS-7OcQ> zTE5dn<9t~D?4@bwOSHV4mY<0nI>=A;%5O*f4zNdyG2LiP$0yM>_8ATHs-d&n%dnu+ z#|VxFI=_SetS+zM+2GtDdaExZtS#lF^9A=rDcuV%z zAgeQq5Q3X^pVzLOPPyVI}cuVQ)kdT{r%WV2OJZ^5{ojz4^DW|Ig)*_D2*n2s6 z9CQzLucM4S*l92%ZbpFIjN2{cx?Yarl$&?igRQPS^=~NG^>XY=ba$)A5&Ljr z{!flt-LAO;XoqI~|8DGtHifqZa-xz#uw&n(tq_I{>xf zU%LB07iXB4l4i7d6}>|)CC%u#g(M+|8x)O4A4|O|bsBj8s?>);o2ybu`d6iLO!-%( zl2-KL1}W&n4Gu*gKB9ZSphPmJT z@5LFW1&48l5916U#u+{UXLu-v#UJ1d^8n(HPV@Wnzyi179>y8Q&%^%boaS?#N#YEX zIgB%m@232OTl>IQ=fkJ@hfnj-4gMca^ErP07-v{w_(ea)2Q(dsGc3`E;0!YqqQn`l zw-I#wR(lb4&~gec$0l-i!E^j{Oy2*Qb9|;g^c=r6w1gu(&6jh0t_U%Cm~(s=0p=Wk zl!)>)Uqt5}AR41Nho0kKCTVz@FD2luyP`gMj{g)w%sGBzl6sC$PXhlOpJ{lG|1xPT2FBX{SyC~x#h<;j5soPfaGE*R zW=9@{bI6uw79nE1%{waLHSnSyAGSQT9YT+@J4mQyLJJ=^hf}d8IOv2at>|e`{bhw{ zZzcC98PQg}D92CNN-kY({fbFlg4B|7rwKqxyB$*S!7Fvti-H!(5vOgX({6dR`I_}o zVYBA_f3Y(3x0L3dxpw8_+B41}N_$RLb-_Pc1G6{U)eq+OM7yXGEa%D*#q;b_FJ>i|Q73tygl^ak{63z>9~4*9KW z+%UI2u?Ot$nCd>HD#3+&!W{cIFf-xD@V$%d-T~MCVw&;;OZhw4j#qr8J)sN%{Of{K z?Ut`mCfBCA;KD6)3vV<+n^1Kg1ke*0&iXqSHwQmqqIV%$I*|_%-O85hTMC;Pfgd3- zMA8q(T~t=5_9i^LDGu!W8Ky0mb2JmQ3-gE+T7}1%*g=TBK~)47Zh#3xB>KXX#A{9B zGc|FkRrp>??CXcb2KH(d(0mIA+RTz^d5I7@w-~{46t*^k(_lk$5kxh-EY%?L!Fn_P zW)%)jQCE?oj-#Zo*VmfYVyKv^k!eA{>uQ!(;ax_E1}!lfSQ9BQ*R+e)iCsUZ$Um8q zV`>3-Sx?~+-_+*5)6d<%n$v1qZlbjvQ!7E6@i8-k*ams%gs3QXS!si|R^eABn!~b_ zMoag2!I;Nz(`7L0st4U@$fa|(ZMTShZU#Ga4`W6&>EiTRK1QFo=ggo-%=GgCm@FsEc9=r?U}a(}J6mGtv5##QjqezhJ`I3r;kN zrGe?MRQO$r>dOyQ{ZdkOcwdFZKj#0yfkJO2g>q7aUOQ0eU%pV=N+a|lG_iD?3xOTL zHW|mdn6MlH)kbI{X#UwtA8(9;V_BNORp|s&Rq-q^+!03qvP0 zrC8-L0fg@P$XD3P)o^xS!x(w2Cq*S92uXhf}rY-#rah_F8Z=qE^)5dcuiYqoe@6c|%Ggxgmvvi<5@t zL|LoXZSNuBKSbxWWJ2nUq0V9GlGWH#?4Y3w87&VnbgON$L6JHHFo#6RnJHn^ zLoPhqEQQ=o`(gx|MIg7+zRCcp-al!3AAz8H|D=6=6KI9pPW$#~Sm8r%r~PsZ6E8qx zrv0Xg3Avs2yCfFK?KEtz5TuaXX||oq!7LXVNxm~Ya8=6PR?Rv#DPawDJbzmig zBWy_l-cGO2IYEK9(;L_l&Z#FoQ*Lt+;O+Em!EqPh?R3{hcU9o+^c)-a2rKY*dfb+_ zBJg(o)>H#91ym*PX#&}qBwIv)w=+6cf=>c(-wo#f4d89#RJ59T(Z49P36;^HcoTTv zsVDv&u6ctw|;xA(-{O{r~cZUjtzr3B< zD*p20tYXDqz83;M{xX5E4gRtgQ}LIX(8pi?JH&nbWt!*XFSi8k<1d$h_VJhDj|$YU zJL}_Ra@92m_wkph)5l-l58B6HChg-d#~|ajY)D7<T!YI6Yter3luO2HFM&Z?CsTYUDO2jsWSC4hHPl6r;uO7R; z?mRSu7hA?c3cPyk7Lp3D9=nyrRe1H-9c&)LtGfsbN3KL0ic=BImOTkW*_sl1mLCdu zbtb$Nyngc%;O*?Q*#|=RAttR6Cq@O{PRrwrDZtxljjsX;83J#oov{Kk+0nFDKS!Vd zZ>Q}LlEB+(um8eO0&l0iQ6J(~l=CqI#V~Vm2xEi?@HVsL6fC?Cyq)%nOzP{Sacv3Dr&w)0UvERzJ@cD9ic z;B9BS2ivd9RzU7A7YP~dI1Jc@7u-gak~fmGmaH(*Z(1K@2pVoUkN z)yU1X2Vm!*z}s%j?hVEOZ@Xumg#-$`?e2UFv;c3rA7pW>5#f&j+z-2eR^V-S&*v~t zfw$dnIP)kzq5Cb1sKDFqFXv;aQs8a(H|Ax4x81XMLw_yswmbJb=KVgTJG&Q5!hbR= zxtDNOQs8a(a#o`PZ@Wt=qQKkkZOlV~x80R%Kr8UJyI~t>1>Sa_{~WXeZ@aJ7haCjo zb{Ee^=z+l7)a8HeWo%Y147h`V@>oG?6(4L2v<>SRUtb{4`n5HqL5W`%7=Z0s)sQW<&1PbuBk_xA#AONk(^;4Qw4ual{5S?kXGb#CL2LIWQ9(Nff@M>7{U4W zItP9OtvKIamq2suC76;A(lf?OE`f%htJkwj_AvoXO^1uSh2+p^+GVm`ja(RQd zDxkxPo=x6rVbrt9dss45oNsSU;6Bu!;(U9Lie34Z;Cy?x2R@@}!TI)Lp>7#aO`LDf z3EhTz(bn>ELhGSGalXAohy_!eZ!b5*ji%y!dyVDgMsdEqrot%Bx7RGhxl3`ry+Vmm zoNupn=v>sc;(U8WAvT%fe0!<)lz1IOtTV;=_BsorINx5^5E0!J=iBQZYJ|yHJ)69q z!l-AHS0Snu=iBQejN*Kw>@1Jse0u{VMsdEqK_NE2;(U99g;AVuZ>WeV&bK#Q7{&Sa zMhatazP&pG15l%i^X)wmoQ~HIZMi3d+H&-4@}3H6^%CdXdpgK&t~lS`vq4VFiu3I~ zFO1@Rds~CLgSi@C_q=VwD9*RHLm0*R_TC7}+mLN=zP)#X-B4SK^X=^nvbvKv-`+0a z73bUAEov0!+xtWq!TI(+ldD!0=iB=-$aYbjZ|`dXy;YoVZ(lGMIVsM!_nk0`^X>g0 zB~+Ym@5kT(h#8!3@9w}~QAGyl+gl%a6GK`nY=i0Q^lb7r2G&S_B+j?DDZtt@!)bG1 zlXUeT>j9(kSz#3C+j~(M#rgJL4Y2kU=iA#MV?}Yky|;u>oNw-`;59Di!D3 z8!Pr3oNsTua0chwo2-3YalXA1gqxr^-`-T=rYg?2cZzTZ=i8emoWc3_P7`jP;(U9j z2bZBKE>)awZ&r}~+2DM8=SuDd=i9qT29m+~_Ab$3r8wW-l|il%2It#bqytOuDe zk)=4_-V)&q&bN1ia0chwyGim}60kzgKwG@}L)fA?-|-Q*aySv^J3fj7Lvg<2$C6f@ z@Az2Kit`;GPg-%lFnO&2v@Oigv%s$N0?8rd%-jtj_?D7 zdNw6K=j0?f--*4gu^Uj&ro=wZy$Xb#_&zHeC5C5H;uo1y;x!h)raAHCL)UBgze&hj zBlGEhg!ApK3pPPM;Rv^yg7fW#L*o#lINx4fS-WIM1^{KRAyMG$Qhm+Tjvzu_snPS!w79JN(cWsdV@nC~CS_=4yAg0w0{aFiN!FG2-xJ$EeIP4L!p*X~59;;rXCdNgWAhCuE* zu}|>UbJsry5ye~2-N3>r-g@pv>Q%h;+^1Kf+bQ09?iQxaw?Y%p33I>h0iBAsp8E}< zsReI6cOOZ`ThIM=HG>6jJ@@J%!jacWGF0%^bBpXx5TJPLxozzgctaGt_1q59l@)J2 zx1%tMx1QVCbaJ{o>O3F^adIJKc10y3gdEX*Y)01Qd-WNlqin=3i8b`&j}}=g^eIi~_#5JzolmlhOh5KU2of8!i_LPk z5cOST(rdAh8cU_uv=CIpQhOsNoPsZ#BfMNv7DQWs?rLv=mV)0H-c8iD#GMh{C1qht zoICdt;g+Y;bBKem)hfuhJYy!Ls%+U<78Z13ZYM};NQ5JsVQG|~Ki+_>e7j7uT7QL& zU%(X|!S4~?Vh0)p0jyc8%{x>vg|s~f_i_}87s3?Iac#u|VG8?7(Fw?gGDRr05N#W> zKI9INb~qP5iCv~x?qxZdYT6mdW@J|^MW4nxYX{q>vn++}P{2zWM620G?RgPRa3C`a zu7rZNyog5mw!DZYD7R^}`2b{fxSJMaNxA$Z$_uFwfA-Q$yeF4PWo1c0?GZr~doa0d|I zwC(mL#H0o1z1&x1OHVdQpU2%Q^AS}>-?RlktG+UNn3d7##g{J=pS1G7nN*)6m86LN zbYKc56Ugu=+k|;aTL-LkTGn+l3wAf778p$rq6_lRUiuFFQMySR-_16zg6-Y!W5MrX z%spfuB6}~Be?a!pBs=dCu!E_51!IdZ1uNZP1>5u`usx*N?`Ojn%?FE~@lW=Q$zXa$ znQ|q2$9%FfI#w~|uM|bcdXQs!2~Mnfpu4SR7DrwN=8Tyb0}qkC9BeOk?a239Ay6%U z_J%!;03h`#qJD!+?;I1K(MDW*lnt%J))05u~Eq?k{0~rC2cyZ^v4vT zk^_alND38wr-lrICc4T|(>b{0Wv~gaL3rsB!!WzK2WquFvB} zXb#nWX_)z7wn~cOfw{0?2+Csh>1L{c7GR8VZtGgk7TCj@tTwTn68UE@{Y$>zG4`-y zG`<{-D;;Cca>S1zD;?uACclcTbPQo%09!uRsC-uYIWcfh>G*FrOyaFP=(D_)r;I*b zWpZhf)paT@+Dnxa4zVbwv2W2{T2$u>-=e*=s2f?a=xZjQO;#)tb|qQqs^2j7Q?TWy z{CNXm=V+RUA>TECrQhB~Ei;S)ysF8cz4XzfiMwcGlYjUo?xKlf$%=^|GWpeH#YACW zBr7KFW^DLMm^kM@Z(=)`_$-I$KxR45C_sSx*-P(gg1W+7H83M+S>2IIce&+Aq%R}e zs=!bDI@op-E&CXb(Vo+wz^*3Q6pjl$AGd)mJcR5xu)XGjxY1;Wn?E$OV~#^+eQ!fl zwC{CzS{47m^BVd+l={MVqd%SvvE-PudswAU7)_fHc~vsf>iud;xF$epe`IM#v$T6n zbfxBxUOcy{mUc8t`yMjZ(u#E9Lcg@ao(Yzv9m9!FOFNF_Mucl=$CLdTtdut6hYHE2 zuAkYMfyhis8%Zf`$s*)j>I<{9Cqb;Xw4JTqEsQ3XHd(6S90{e%p}dEQ9^+@Ubl6c^ zs#2EfTx8G<6Kg3a)@Q-65anzbF|)>`PBu#UKIDH$qXe#ks?uRbm}W+iNv)Y^l-VZo zOGI`!AhI_nnMi@v`|=c#+O&SO)pa2Y)tiM{W+cm#g{sp`3)P#2s)9M)0EONAcEm3R z!$S3C{Y#m0duDf8z7zRJ#9og!~GD0Vjb7E?h9T{}~|iuK_IC z-$0yoEnqF%4FTjBp&eI(>whhXpFs?qfZ*p*Mg1Q{Nb%yJRk~__h1io(1XNVSz-CNP zy`MJ0Z4k_D0Vae&jek_pOH6H_+uX7S+zv&-g*)e#wl}dAND)8`=VydlrF~4qR75nE z2>8G5oGX=+ZK93M_`elYG(01ZG>*6__0rXWG(!W`D{dJs!qzDqxzS zb}^GL9A}mO#fWgDM4)k-b46<-v8F@r#Pk{M{mgfmUlgecVfrGBT{u5KNK&?$@Z*d#s6OF14+Q?V7YA_K_{H zMen+w{ryJS5*hin$?kr6D@^P1f^j3aMCV**y%qjL7YY+41&2-F+u+>;I<;Te=iXG zNDKne@-h#AMsw`+5_8+aC<8K;&}jDKUC5o+g<7hu!*eldtU7QNxe0hL^KmmKl|El6~t8 zycTK=FJ}#hZt`n*IcxYVu&iN8yowBJ_%>>4akHu62aU?Ttl>MPhL<8vYS@+<-T_u> zc)&7K!_1|M38aRfK(N&Cha_0Tjc*BB)vV!a)^4AzCJUCQ_rDA?A52PxvOrOOsJjRS zk{8&BHKdpY|KWOsqy?9m*XVSXc<97kI4QnsP#7e=)*IbTa+p;Y@^9Pk;By$<+)tY- zwKSYw>-Z4G7wFhA=&><6MCfA_C59K=Am63P7=cSZ5Tm6`h4-D=Pp8`M_VIKd;nXdTj{_w z$q&^^A&cz!*=ocWNE*L}nlDKT2~~z52wj2DbV`n_xCTbl57Vr56lIO5zE2SplQ5~0 zaD*SdMlO0C@<)ZKn)6$V(NcTKMAotDQqM&{_AxyETuG+M6>WnINi_sccf8p9tIG)?}f zfD_68qU}wfqbjzr(Q~>_I;WF#Iz1%mG$bUDCJ6*c0))^c%xDx8WDrDD0?4FjFrX-c zD5&UlAdaZHiXwuDil|paL{yw76bB}i>xf?G*$cw^zFl>a7IOdh*1y)vS{(LNyLRmw zPF0=VRV_)3Q?LILidMH!5|m7BQDX3Cv6iu5B6dntEdRD?sAr)0ht$B;WWfUborc2x zU!UYj1@4wmefN=}`d5RW7^?49q52HJxBgf7eNsUqQc3u|Cn5Yk`CA)r7zw{m{(dVY zRQP@J4-6Ak;rGcuo&{Ki-zWd#N`i=y{4mCdw#f%aGclK;$%j;8hTkV2mc$Z%pKO>j zK~mxO$)@=gRH^X$WS4Ms_`Tf{es8yg-`f&?FM;>ogur`mLg2kOA@JTCHk(j_lwXmf zH`{z1u*CrT6xqo3*xWEqrSl}JKDF{4;1X4D-GORMEB%BxL90FS^2;d7Ab4N-Utp;q zcwdiW(6l7l)K^JR1;PJ+yFGIW#QDvcZj#9N^r~x_>AlHNFM-+qU-!bD5}55z2+Z~$ zU{V#B?LSCZ1!nvI5|#EsDDWR5tOB$BhY72|Y(LKC2BHG9{iYx)Fx&4ELm^&{mp^dpCX~h zo`ANH&elb<{qq5k%Gwm_F%C6kWN?@o13bWT7!sJBF@G%5OJH_#9=nVR%ua5{z9fO! z$psSuLWY6a$#c(uOfVyP$CDt2CZSg*zb7CAvy(q~g;WM+C-29^(Qp zZp44mRRS-ouEN0Vz^hB3Lj`6BUMH*qvjcBZuL{f#Y`+v5+lCwJjKD5xQGwZkJ*z-g zf!TqC!0bRmV0PeBdQ}Bx2fp|KX-6QmBJd8O%!V1~7=d?RgFuKkItD)A@P}&31=C}* zPVg=VoFy@=!7A5pK(gDx0U5#Gt~`td62lto<6^&6F|5HFVK9dEClJ$~Lq&S*LdZ(k zX>g^h58&(?Jc@(sT~|{H?+goWaEVjA3_A@zCWs0<4JL-21~VW+{E#hOuJr@>CbQDLXSQtLx-RM=@SG3+#$7q3OfxZhMfiz!%l;>QXUm{8cYm34W3}JzEs$0aJV2U>@=7d zb{b3!I}JKvryl!z_%fBQ^4P2~kNq_YDzQgFkCg_Svp0i~A54}4C`Wq*RLS1F#|pkHEMLeVopP%$r|4(|Y#n3qtDb{IBeUP8r$Rm@AM zGeuO)OQKg;_?np@m!F(k^&g=A4F-8#y1L zFPJ%>;pxhm0D?Q`T0E_slb|9g=L5PV=Quo*bH0X*opUSOUe0DvQgTM%nQB-~P#PXo z1)bSBsMq?iX&wY3F)v}ajLs_NC7c-Z5>7VRw^Yna*lV&9Rm@8`)%-7VQ86#!bn_ET zcvQ?wIK$izM8&*>Lnix`ig^iV38G?N!V&WqC{Qsk;dbg37v-WlTws0&1uEtxTxhbn zs+gB>NApi`rW-*!JoMNU)Bs~%!Y9-bWXwx=_#%Qm;hpeE0Xg3ekG_}GlL?M}gCJvG z!sEXIXk@S+P6ZT@2Wtq;fX>H{Z9x`3RkiQ~(gZyAG>1*~N3b24D;yc-+nS6cxYiM* zRSAN8Kf#n8pi0b3_*B-L#Jq%`wBZdE^Ag^48eoZe32zqrB<3Z&g<*m!<|Vw9g;Oyv z;e?o%@C!T9>{QH4_+_TeS1~W)AE#6QL^PeU@J~-u|2a?*{+XbPc?tirmt=`~3I9gA zig^kD&b(C2OZX4bDKRhM=9m}0gEJ^Z1@iKh<*|AV<75F)JvPhavB$$akNpea)W1*~ zkA0XRsS@)N?rLVFpz^st(9Y!(;CTEPi4Z0d}Uq5)>4o|8Y3XPjTo^$Ad|rNwT4Cv_-0A$haYRgGP4&9Gs|N9d>!L< zcppbZZHF60p2NyHcR&%^zz66!GNrx^N@W^)*eHI8zPdyDl$P#~A%uTs(;~!_mPn1= z!3w(-4(}utb_W~5Z$vL<@+KxfYb8*rK0#jv+Ib1NcdE);v7qx{qIZ1>VRz%21*OtL zSFnZlyVq@$UPtcTRJD|-Y){`q6ZR9`MDEHffW}q9AZE z1Y?f;t;<04$7Vdt&1|M!E1JQME41hecnGb6HE47z8;S2Z*zPIq#Y|qHMKxIClny2O z;%z`1h}IK*iRccX9S&$!@U8p>p+V)khq;zYt^#^j!^4H|Yxyn6x*D=*DA?JB5nlJ% zPDOHi)+qc!OMVE+(an-Z;g1RQvo#$BDEx;xSS+CCtDEU8-o*$LTc^3rjs3!w+?>X~ zubCw0&~(VqY5I#^jGow{>MXtNN7c#JFDNY3GVEk7@THTjZ|P)%kIXlrlUa?+7kFCh zW*r{UsgBb*zXZ*yf1A30BkLCuvR=?i*1sN^wY}r0{(VDBk+n7GQ4@aDa;^((>Gi|3 z%h~HcRypzWRbd}Px%_9)e;2xZ>?<6t=^PCr2q>4)UN-L`vF~BIC zqg_V3es0ySr)gIYJp{q7jYrz$b19#&q2;pQvT2WUq+neGNc?(Pn5QKhkXcWWl&=?s zJv9Al(8ntck_casMrf8%I9NklA#|Py$?0N6j)Wfk_@?vNm*ZKyjve>%N6>K{nV4=} zX45Wc=yV)@yk%a_F>V05sv3H(5nPqFx4!_Au>{K%1cKf!d4*}K5*iBH8ST6mA^O<=w7&oHN(oNM4?iT?Ic z)qXeD_Ms1D|3^svaEKjd;@nu&$25_n#-3#xnrJLA!THMsz=-c!YT-e>k z&J$pTDgX3+{4>lP51EY1SK?9{LHR%@c?ADuFkf~lHAC(D*9%a#-^DhsQn3|_TBGl6 zFM(I(VpCL<_+9@(9J8v~!FQ)xDs=(z+-htNVvXWPTiKBDy4UPNzUkWd29#pukq#5VT z0WWDC%40QPN?={w7h?LbpI!u66l3mE6Gf< zJvQd3%=bIwYt``av?xl$8Md*kphQ?Yy?2SZx4$V`N%sd61~4?B9H2!i&M?1snhXSM)Yy(w3dZe|*Y}ZJ0!`2Mnw>u#yA3c2EF9WDPdiZ|0FNM0l zfQ;|QYXPf|9==}+VZUvp$wv?0!9wumqlfR1O3dAS-(gAYYh+>sk>Nkfhqx2NXPT)@ z?(2$r^tptiKYFB>mC!t%Ih0;b^W@B-^zQU}`crd|$e%wQiu_N{!lONl>0b$d_&Yof z5DqyHaN!VUHL@OHd@ZQSw*UCMK(Zs}f;5a(Vc2J(1^Q2r$}*BO{3pFmfpd|Ae-yQ1 zqq_m{Xu_7gk@PXl7$15v{HOfctnJhUZ4*SB5o}3^&MG0R)E6-#u zw!M$WPi=ti4EsSAY8v4Pb3E$|DjCB<&yteb2d4o(XBZPw;Jif?7&RNjIc&U!okaWR zie?I2_#g$!&jNA2(%@ni7ptrf(Hjfsv6Gtl;*!2G>nS)kn{g3rR7K*2_U*mQOzLjs9+aKII)9-HaXwn2D#AaVe(osRqi z9jM%}zd#)ZI!`hywPTtc=VhC}%KWvPLt5=rh5v89;WKe9Hy1Ow@{z$!~kXY?D1b zGnxiC$K;40-}yqNREgOUx_%bN1NqJuuDls|_IprnedWgxf9)#ZIKvmu2or1qpnPZj zk^!|PFHoMKwICOoO5P(*P|mH&?pg(0zTRb53CMG+B3(XbhK(4RBbB=e@(8V*t^t%g zyZJP&oN^u}l*Vt0`8hpi;y?L1l2b`geMroyqD|_GzMME=bwyuJHQ@|<>YY&A_X)t< zK)xELybYCK5{go+=DTr2jOE^^i9C-s1Hvo>cQ$hDY_r9C%P79CP#-t{xDdn z@ME;L9xCL7tmv$K7LX@oMK5>@D&>T%=p}n0kjBHZ=0)#(9O}jN=n7>zPsoa{WI}a9 zR&>=<6t};Hd~_|%Qzv9a*Zlw)bwXD3p#y-`30cwg(*dg!vZ5PaguFT-EBY99suQxJ z{~7^UosbpXNLZba72UKOusR_tx|y&#AuGCtusR_ty7dyk6J={D`W#_(LRNI!CKRRK z$mSO*Xszobg!Lu{Kvgw==G zHirop`^KU~ZEzMHkTM_oh0(?oq{??TI!qg!MF(1c-(id?Z7e}*eXmh0Nstk~oiMqL zN04zon`vxw9xR;bNbDds{T(|yOGW3)+=zE$rlLz~BswP^hu-&f=WWim6*cLR|u z>5hwhZ&6#eIRs*t`35l4h`9vX7W=|jL9}UW-UMW+?^~vcnb$&KnJ>!nbd_)H%YAIr zZMq4v!pF1g+LQ^h##c#BxghI({6gBMLi+SZA3wyl=^?gl^(~}WrFlE@*=DrCHiXgU z_OwM1kF;6ALdu8OHg^+LA7b0w!{VwBv2E^?o`Kps7Br8&6?G`n0h%qNE~%_dp{{kP zA=Uk#1Rhc^RJMV(^VtS+tlR+~gAwIx&WzrTSE4IAyB>YPusQq4~@^dfh zn1XcmI8r?K;sdbIXp66mxeH0P+nzgjj*+{Fa7NoR&pXe^y^JvXE;F{MA@`QA2_A+= za_<`mZZ<(HI0N|oBZ(8V%3w<$wQCiy+Dx9$i6&ILejp(12d8P zK$g$QzJkjDg2vCtzPa7N&dBiX*aM=UpOJm<3CPdLz7PIGDnBFpb{=3VFXuia>Y19C z$;lBs+3+$;PIm-%%fYvpZ@n!OsLiNW-|k1K$MBZm(ZdnM`Cj!P!A`w7Z^*Ga^nM+TXgzE&qV3VZ&FB-;Xl+x7H;Tpf(_Hs?DScHPb8dfuRIa(@IN4vVc&W-;1R5X2&^vb zeLmDhCwpmiF7h@F>rI$cSj}wY1hv8ot^t@E#h{&E=rW%Hl2>mO+NR|18=Ynvg#q(w zyt-}Q!}lR+$Xo(MpP*KF;j2iHb|Et8U%0O`UT$)NTHz-nA)`)EEBx$2!0H6G!mkIz zVs(OA;ZJ-ssjshvztCcJf?DB0R+u_Lt?&@@(kG}D&aZ_2?Ca@59-CIU@EG7}a)Mgn z;zyY`e&uXi`tiW~8m`2-KXZ`Z7a)Y>@eQG$_@M7m=X5E~*n*J9X7N2X zRY)r4rc#NwJ@z4o!@L!TNsuN2f~4UrN^uB*!(8#>b0EnXg`YIwe>pHsf$G3CO@fDsqJBJ@)Z$26 zNo<2lHE0Hr#2ypG_ElkQkNrzB%<%Oc17xFXUN-XZUC82X61(z^Oa_j`R=NH~)e=M! z3t8SERP*ezSf+JugoUN!V%gSJP+F@i`K_Fc%x~bOp2*tV!GR(LCejt?= zeKx{3ibhunGR_yj5J-(R1BOoY-Hd3SSU-!KD${+xmVh%rkb2((Ld)}?w%d^X3FSt2uWcc>58eehq z6%+AwBj+_i@_m_Tsd>~yn!ESz2DyK6J> zy>4!14Q{udhVOIJ-8{R@*9QfSeJc1c-$CRV`&`tF@EuqLWWONe@-WSb{m0Ek+C*Rd z4PbodX1z@JjV=T7qx+6*%%^>O{{iG@_m@EC`98fG$ghGd%4?W3-H81zC0r^aZ|qNZ zCJb6;WZr@98oS>$1TM-ayuuaR;<^`Gk*cY0)lHpem&KlQErxE}$Fs{~+g$XX?oKbc zt_Kp4E*^VDkbK`4Ga&YcAjQ6C@KT8Fa6N%Cl=+VH0(npRN|oA0VTv&grH7I@tpW|sQSV$(=HN5Mx#`U+y01)O}x`U_^8 z1=3;$3YK9OoVWqJK2_`=VHPYQcA8+L&4Ql9rl>Y1M%M#Lg0|9=S8!EWzfP1q{)Ooh#TPvtR~$)NJ?L7{HgB1-&TQ;AVR^Tm>f+ zTOhfQa~0fsBe2V*BTaM_M7smKQgtg=fxIxTck>-l?<$bKbc5sZGDu~ld z%LQBND)^3`zeBKPu7aiH-6{DwXP0#x@i1&jdlBtwT*oo9(5~d{vW{cfG1S>*9Zw;w z&MxbCDq(eYS;x}|tFy~Go?6Qt$5>{uIb(}_6on6*(=6Tti zRr3weaTZ??BRaf=hSjmY7i28cKcd5A5IZ&~G<`&eE+|LGxeCP)oqY>R>9J|N$6knM zmYR_8E#|TLn)KKla{S7F zMZfjM#5<$yc}CGe8B_8m8%3tcfhQlj?#BOxR&1k;r_qN{p+?jT)n+skdAW?t)$Agh z-QPmaV{?+1$(X^I$11{jmn-puv1EC7sdubbV8i$LB1olL9QSRXpYK?oygV~}4|72G z%gd8X$TrY}Rfd$ZR2*?BC|NAF1QZrWdEHmqZg{tUafd^IC7`f4Ci4;rC@d}}tjb&5 znIbBnu(&H>6;N1QPFPK8i+j*NDxk2qifL6qVX^F0Rlyu)8QX@}w^dSl3Xi&xfWqiU zcx{_e2`G$CfC_i?T0E`jNiZ%cDglL22`G$8Kw(q@3ZoKG7#)FH(*cDggQh@dt^^d8 zm}YSlZ-)11XaiPf17?4OPBX6w4B%zr1)#A|_uvwK9t+X{WYo@)&AT zQeZ}*V4Sb=1EeW5`HGzA>x8;2>1guDcGKbKlA#SS-_L-;k`t~a$biC<;p+(Ygm+3t z3fPC>=1rbQNG(?UZa5 z`y`;SWD9>it^x{6wz6<4ps?gQ>Q#qmmAqh~v?`#maN`B%= zCK6Cs@-smdP+0PdjS5i#g(bg{t^x{6erH}Pps?f*(J29iC4cq;orh@gbtc;|R3K~d z5O=JdRr&W&<*`{Nk9`Gtg~!f^Tvmw?Iuj%{^U-Oj$gXBJ2)SQF^Yjw@>=Sc3--sYu zVs~lEhR?^=TPcX;yL1GQD&5GrIxOj9(!dN~KQ^%%=?f7VRZ6gB4`unjv)Q(W$aZ_IU~)^K&pIgn9q3gcp&|KKf`S$b>mZNdAZ=(@#{ z<|?LP_uxHXqTWcC!y${7Jq3#Y9m+Q55aczFMK=rvXjl{}x{+y6-n)Lr|Is}tN=o!< zFv8JcC~02wH&BYBx4;h-(FZ`UHmv?k_vDL^m%|~8UiQL&X=mbq-!;-1PA&dUaT-D)_MV~QgK72xT*hK&bd-UQZwx5o3W;Gc3o!YNv z26qiX$V;IIP1&$-7z{W@*tXy64Y-JKhTXkC;9|nq=lQNLqQ8!(k8-Te!(W1q=;m71 z>g;O1y{$^}M{WS!`u!Myr+)~rh@fG1p7=mMl;4X@vd(ofy0x8yg;D3pi}}vBIoI!e zCLYLhCeu!ZE)?p;K7gmG{h?{3Pba`xjstu) zr}edVRvhpw!Xxa;et^%N3ERfmzYYOBoAi11WTrijKg?NV4?vMSH_+r2_C1S0pF{dS zwITi#$g*GC&q$7RzQ8Cz3BEcDLi40xb`ECZoi8M8*#l|BMf8le|kTW$bx89{uUMEcH+SCDMGSywk)1DH2uum~PIRh~D<^Bt-`@H2#Nqyg3@)J^A` z9|D+7&>Dh@EN#05cpAat(hi>X(94~V(xNheM%#udMrmhmciQ&+21s|~^en@EU^?LL zl#bYsV5_sV7fsGLENd>1+yEFD<;doC8dZf(hcO|6^mz0rO?u;O{3N*J00^WJjC3ik z2W-Cy{as49L1Nf#pt4IR!Zx;2yL4u9_`BvDglLxX@Skjg)@id4{h9v{;sn!@P@;@( zoi>2LQgoA2a5J`BDK+4{K1y`!x(otoqfqn3-O7R;z+eDbw{n7*hvH4pt%7BkWXH zGhK%L`wYOh-31xWm&sQ@v9OMTXUy9tf>GQPrkWR;X305lgL$QC?f|t@J}LnS)fgq~ znY(40-;&c2B>*Cv;&$f(3A)VAX~$#K7{|vWS%6Jl?J4+05Uk^o{ zcoHE9GTL@&pqqlSQEPt4Y$OyqXmhHl;-G^vrgoL95S3tgCJP*v@A%#L*~-ik1xA-l zI_v9Xsx~{v9Bp4Gw`lu1nNCpJlwkSi^w>AaEUD7=ohUH6{6Qzbp|s6v*7in%wl@;A zy(xl9!*;FVX=-Rx8lGy_(3qg1F+sx(B3S+`6Wx?x&&^ufnHQUv>N<+Vnj(^Tg&~R>ohWZ2z=V=Y44bU)IX}Gjm!{h`FlM^&dNzgD= zX{gAj4L6uub^Iho7x^=rUWB^t4Kt>ZE6r|9kM(HLM+x3!8WoE%@R+xnKWHW0nw9vA z93{7EB|V>n5=U_2NTj>Xtb7qP^CZj>E@3n8;mUUp78R~$Mb*uUddTLNImYNUr5?iL zWSgQ)CqP@4KeK5T5>#Ep!YK(Ps94FWY%)h^;a9bKv+1W!2tUM!KJzYfi-qoh3s>Xy zTI#-uhVdwr;V2e&<4&A%bc1F*3&wkjVfN#h8W*TTN{smZ2@=0+2^?>gAn|g7L{70N zH*5bU@nwQUA1!g*-y}SiauV&(C;pfPf*#^4`x zxKrMe(}HkLOY^};vo+hO-kYfEuLM;KTUE90C{=&xa9^W3oTOYRR`t{ft$L+ZRqKyZ z6>hd_SfZ*~397dwTmL#fLm7wa3R#k02%BtSYsx~L8`Y=J&+E!IP zca*AO&8mJ$P*s!ZQI4apjxOBmN2xi(QDao3a>y!j0IIlP67zm0~vi6%Ed}I3HLIlLqi@+TP;Z^k-W5%`~tT?rJtcA3MBKNuiPw9$^AIoRpv%txj8wS3w!{6 zS@a(nRi7os;(p_1ansg1#Z@>C6&t(^BlsF99kROs`oEWC(;*ihsPm>-Kfq3S03k&2 z(VF}+$f-z&`b$d7zdIR2#3`CZr^heT2>moh$$8y>8zPd$SIz-xa9GAJ?XdVKIx*{@ zK_!N*tn-V}7*g&3Qx*6Us$flX6~ymNP`R~PrBSmz!Oo*QLUw|(omv@=Y%|y>jfzRE z))UM{x&mWTN35k`=oI~5oh95+puP)-R^O?`cA-!;t2FW-AnXF7?=MWL&6CabnwQ$F z?>gvHJ?mt73#Z@$%bKUO7@GuCpmL0o>a(C>lG}VA3A)a~1agv_VEMCrEl-ikE#F0% zGu@mfmrr9mo9f;R8JT2GlXik>^D1z0MgpF_`m>Y^S3Jc^&4DpNEdr6XFJ!q)8Xl3+ZJLmaclrjqt=7xzaVTJN9iTWYH0O2)pw_RB2v^c z#V$zIGSNW-OxI&QsD6LVwTNjWM3M1}R{GCwnt0=&cip56t09_$Zf*zl!k)1#a&>h4l zky{;~IL(1NdJ9`#Y4P>iI1Z$vRkEbC{sXZs7@wz&_zOuI6w7MdC{@B@y`tIl@+K!k z$IB?4JLMfWUqcB)>k2)zV(hY$8rQ&2M*Kj6nq5b#F=~>IsH}b%@SdN6DjJo%OtY|& zC4Xj9V|NS#SkaD3=8E9()yTQS6?VqcmJ^q+ZnmrlEzk(&sT9)Nhf^(R= zBhQMA8-rfcsj84lQfzlD(8s^a$$~ELZ^(;_Rc4y961JH}7ES9FZ2tiGM3C%GKs z?MjT+45@(x&3^&r_m@Sv!VeLbh54_-@3jHNi*t1UT{L>#>vRtoau+uU{t)UqNDVpu zjb_~YDDWz5>S%sH;%%AhpB{dGx{A20RsSpaGr(nNJ0J^x?_)TUo$-EG_CQ}*up8-; zlletqBp5iUG*!9q6nN+nNWe?@Z5REZFOzn*WzFVYMuAFEO)D!(Ry zeZIr~p*ioS1oq7i`(QJBO#=HdhwXV^PcN$9((D(IclAz<>;X~}(8EFNv%6l&^dV+< z>hN{1JK(4^hP6k3H}{%(XiF#H4fGLe3O@wn=2Dr~xl*+^Ob=dzQ0+dj)}ro)PuKh@ zn*TJo$CB$hjxF$TY(llq;LN=$5!M z&G5)H<7AXmO*2%A$AJ%+1HaocEg(ANCfbKz?;?xui2q5uQUovj7tV$ids5vj7k=7* z$q*?+nww=95B`vW9PE4&w{-*Xe#a6|7u<~(r1VX{OglO~0r9&yAY_R8b-+(LiQbI4 zr=_b7a11NGmtP@UVU&5idl0@>)Oz3p=2!b)2$XLG@Ew3@1U>=qPXapuYz1&U6Ald` z#qYp|<^kyPq}v$T34put-b+SS3b65#c%9Cv2=)AYm2^%wULkxtT!3Hd$?vTB&TBv) zovme0fb1uZ?7fubbUS{lW={j#4~sFhI6C;=9f=d7vEIRtu`lr$@wHm`W(apt!opWG z_YIo+0Jt2XE0m7Yxkd9bF9_#2wfVIhL1DDR-Zy>SQPjf*8rtur9R ze^0Qzk4mBjWU*axHMKYRnjfb{IOF0vtGYrneP^PdzNe86K;p@IHb!ICwrWfpdHwT# z2(Npev#6>G=yV*DPyntodky03w~y;_RD(0gyVhc*fZX&tUioTn-^azZ<_I)3)#+4< zhk;9{t8sAwK~#0RzS7AL5bw+k`bjKb-X^Eh^_L9kTGgor2%qh<_c{0lt)zB0uDhgP zgnep|i-x!w`%8}-?BYsxG;|F(8#~oQTxIRiiJn4MU$DO`{9fWEOni(e3*qMoC*c+# z!+g;7QDCr?Z+IUKtQ6ER_$6?FoErWQ$zul+_4|#R1J~fUxU`@)K31pciHh(+URuaH zG?bAp?_nc;xn{F!h6o#{g8!|Z+~Q)x#VOjTnhDK~<$9ftRWm`QL-o|WsmW&`H+GlC zTEiG#5>)n&(`J7N`60DYnE8T~)%!H&&KGDQ8uCi3hP(+wV8hnk`lVQNsZNs6JdXJm z_WYsg#%N@5ipz^Hdo?RV%7z5l;cGNa>oXQZuwMs`nHya1NCno$H)xq9D9{k_b)l-C z)AYMQkH4pp$AQdMLVD=pEDwiB8`Ym_kzEimhP%SLMzu%wAd&LO=i-t6^vFOhM320r zw6;`@Q8P@l6H9cGrYY?x2);Wiy>mtH1<-56Rh<>s^St%y7QWIYH4|?q(T|>XmW@y3g zNcD&as)ZFjajE8=4&HW0$xdepUww~eF9y5%NsaKBqv|ahSp_8inMPQhSp&2w&Pa!A zl{A|x{Vs~lD$4N=6gNHs6@xVywa`VAWfy;pMz~&{Au?EV=Ns`En*KV{UaHc^c%ZI1t@$sVi-$`u)@^w%Jx+DHKnf7~sPr)Y%Da*S3{fmM?xbANc2kkx#q zy{2;*Sfa(@)^bheFtElU|9u#!uF*1WVO8~c8lerQ6y z2B+8d2J1s4tQ`cP{5b%_0n8+DDu9&$hMoyvFM#1m*@Go@vDUF`2*y!ru<*_0u1cx^ zH2SVe>Hu`oU6oV-mjNy`o;$>T;ck z7V{JAff9TH8fnCLX~twQ0w}66VPz73FrgAAA=%Lt(cMOu z#rV##nEj^tb8*>T-F4#!5|ljHs*=tvN|?8^JF{QcCO19ZDfuTFHL=KGDMjmb)3rs- z-)(tVR}sJbh$6JFLE5T&RLS{q5Dmc`j!hrN-SpQvwN&Ho<4}#?fz=P;^0og3Fpq#I zhF3Iz(Ln%1^YF-cftx})y;F_PAax~Et7>F&RgFxKYCKY2)QzS(sYZw0T#Y{`e}-n| zRO1CYxBpR%Pbavo1cn@4jj8|3b!(cdF*Rp!v+w7$s>I!*B(WMNY85Tj*fT-Z(YAP6 z)cm~~UvH%vN9m%qQjH9F8liJKs9HaU$`^;C8mqxN8`V@>3t$z2(EvUIFmxh-nio-n z^K{a8b&d@r9$k%^$+{S=)HTD=Mri%>T&l**rrXe)YZrob8!EK+Y5?yLxCKD!OX#xq02ulZ z9y5UrpQqE0(CHT6Fb)EWu z)cS{-&5>>|k{#`^7h4?m_ii%oW2fH3ZCWa=-3hHJxwAz{V$)gfR9d`mf{ID4s<^v# z72BItOixg;s#O*Dwywhbz$r*mf{OjEs(7Gv6@N5au_Hl6=M!7=#Y3&DDEr8<;;#f1 z=d`L~L+dK0H>>E~wxvcMX;sC>)>SNPR&i#6ir-pQ@l=b7zqgE+o0Z&>prjAl`O(d5 z%l}gHhohwCi9{twP0^nHUkb{c_KAUZvTo+BbZN$iZr3?fHxJ(zjzE`w9jso6VW`~+ zpq{{I0PY7c^alX;E9lL?>ZI8^>FG#V$%LvmGo|XyOp4xor2J@V8pBR}B*(lq*?I3; zxvDx_@5CtIr`n2E%EyS+44wYb=JK^4iSng)G>j=IL~RtnKM8aM@IHW{6##m^iu=ZB zS(Q%S{9?Hv`M)ftp4=V#f3$A+Nt%sigZw2U>q=&=JjA?}hnP7$bfo-f+7drcYvDk( z_@vfa(uFMzA#sdZ>NJD+jR`7VY*oel)>UkERMb3{pyKGZyrA{ue>lleQ602`Rw}9= zin(30TN)yF5Nk(()ri`todDof0@DGwUqeOB0Wb-`@LzROry+hxH#4DfGgB%zGbtP5 z5%Qy{Nj1bHIObU`4KeTkts&~PN0;wp@7>5Z*W|W*hF0@Yb9)?wV)h??j!1B2xdlb4 z;^`Jh!TVHP#AcNqo6{Gp2ZK5ZMO;LBO`6BN9k^b-X(PAPx79@s+)Q%4Zq4Mh_F(9SqH?LKfT zBqYITr)s$bF5sWpbo>NV&*@7=f}sz;qk2^6LxqGoY`vEeIS>;?RqLO?V4mF0TOKZd|@_ zi_R!w6bcKPRae4_&$w1jV{rIY`7A|=Yi*nl?BxPqmYl>2iYPy zRO)RIy%O=>*2;3mtcF-lsL9z9gvE(%oumV98!Xg1l1_tWj- z1DH7q6^G=kdsypkY~l^c?#2~}&!3>h{({)qju;v9HKXkeY@a4F)@TNI;T}{B=VL2B z;_|hjzPRefL#MqUa&mlr{6_6RZc*-2>603lEJShRZtm*gk9q!?kY{z4W|V^w@1l`o zfV4w%my*Hcn%SDsdIg8M8Hd9A1slWH6serA&{f{;6nuW#d^OtZJ)TQ2bS_0J ztA0ug)zOOAG;%SJdzBTKz!}x=YC3lY<5ohW_*DrVu{pL%tV(DU^?D*LjRFd5N)mJ& z-3Hc5`kpO~>N;m4Zd7;DL(mPhcbZ0M{AiR8s%UR~zNX&~`X$YD*=K9#n4Yp`Pc2E1|D{u4c*!Xmfu-1a(#jqoMbj6Wn z-00L?^(>t@otkb*&@`b{O;;W1?E#Lrs_)Q=qtH~nRwFU0-I<_vQ>$vP5w!_>;UgW- zu}jm-{dH%EL*d(^gWp!;$7}K!koPOq{8BbwlczHKI}=)U_|zl(W5joBHn+6P6k8(p zIVP3rw#ZzM6`tf;smaXsbSH@sKUI@i5qBJ!5yy>`9Y zn{e~?e#EKE_#IjW2ZleD3TI##mCy$&@ftn4A8b9+v|7isnwdH=y}%&=u^8h|1Z=1B5~zowj-jF*5Tc{-CXP?EKdy(94)Fs{buLlF{tmH;87)%8 zYKNFb$x9Wn${}7(;$@21!y(RQ?u!+%%pq>4ol6w4)FGx&@^VEic8Ei1=M@j1#CYXITKmS4{DH)6 zin!k)zQ;1YaHH7ZgkgJZ{w{sIP1egd0c;r%#}|{h`+1Syu9e^>LkRV2OCP#SW%SFM z*KY$$GSRFzsb-r)9o_(Hou+PesJWchPSVuP4)t;RZnCCsbg0{@x2w!qz3!#Dz4d#G zWvtND$F!`MM`$#hp=Y!{qu>417`Lwi$?IOBBa5>p1D#O!DMp+%JT7(uuYM@IU%*>n zZg~;knG-S*Bvd?r@wOBGJp?}sfA9q)^VrJ^Kv+-$!ozgHY1d$(W==7`kt~YW!fW_T z_Ve1?aQd6)4yQ*mV?N>?ls!l(>t(6?^SNRMi=b#!!&s<^55vV3KL~gix=h8NJZyC0`=n-@ zr6}NO8F-i{+GQvqveNn2EraHa52)=aC=c<0Qu9YylXwJphFj|W-{es!B+xfX>P!5W zwZ&orKI`5<#u;*ODt{O#y3~o25OPpcu8SDn}~xvVRr-?`$O!fP&itmZGd z7vrNPNjvUUyAOtxq#;7}SA58p?#_%^3 zAx4aZ7zh#?3p14tjt0i0NB)hU6SS4G%%P+_bXnNp>t6o>&2<&a!cYm7vv^1zJi^MD z#7iy0wPFK*tDp`&k;6FaEcC!`aT>xOE`&HvDjkx2-E(Mv-P)7=JK6FeN0l6Ba6-PW zFFca_2ZgdHgGK8?#EhxyA4Nd%+inKzhqmY9!4oOfgXS4ir#%CKP3}`DAP2V`Au#Eq zbnH|`CD7_Z3bE0vN5F)Fy6NcOm0Z~w3_w?h5=|Mi7dv~kj67F$HvLqz?$SYZJ8r>l z*VZQ>`~rCdlrHhbq>HXYInI`-KhBX=8D}g&caP6;Er;-=PhP}fC_SV${-OkjOrx#> z-Ktv+OB|d6B7JDojYBW!R!m|MiFA}PrN`5#tQE(SAdhBOI{suRblt;uq0YZ&(rJ{u z4w>kjF1ra6h2cDm>}GN#xpXfY62df1w;e_=8&jV97}6z-vJEkbI$&o?(<`7>Z+580 z)D1qg&`-@bNnz_X>h55pD5L=lg%#VCBkM9*s%mnQ&jd%B3*RFlqUc_RZle$%U@_=$O2M6AUCMx|5b=;|``dTIBGI~w94V2w^!6kz zXiTy1K+2hn>QgDnHzt*SkCyVM#H%Jv1&a^lm5Tqecp7(ImnUKHc-qp9e0fOGB)!L` z-E}v-2BAwR#3`~Wzm$r_G3vfR*Kgnd9I*IL^-4m>Xa%af?oBl6ZXKEYI`Y}VR5jG4 z-j4O>baEKT7vkF=zow=C*O{A0ky5fN8Fg(xg6sv9Wwf4>ts8VURQDnAI})Xu#WFF! z?qcTLmu&Ym%{J<0U?9qnxgVp{LhLW9RZr>%@rpd@H4H_Q7lKiDHK?8Mppua!ib(>= z$l$TZfr?uySkjlifsJQSbOA->Ap?Q-CJQ*Z`a^X3W0`oW|5c1CyW9*>Q+nA)j2Vlz zpw{+F|DKd}Ka77@hD3&vsWZIPkn-rK5PO5UeL;>qbVeMa>puAe{P)ObY?m6gS-04z z{T7@bB?AUng;tST_h$p5-@4H-1~7#6CVI~DJz z(i50sGKpe+-IJJ^b?GWjAW{6a01%u+m32Gt#&kcyF@U?XYFwMr4iNPilS)2-Po9$F zN4Y#cY8Ad7p-hK-M}4! zgjUAcl`3%Ew;NEFr{Wn;LTcid}+A!s+X|Y}?NQ^#10;{KWg~ zH2jzH2l|2cx3M4_DK?o0mf&fpoQzz&2MK4S;H_nN{~{boS(ps?5aIk3-sevP)2WtAahcAJ%=}Fo(ayp)EkIo;nGaQSd{t}wPl;f z0l6%70G{56`2e&nPUZC+-nQmbK$fO{%QP_)(+^`=DzE48b~P^pvOJa7b9lQ6vLcn& zb9l=HS(D1^IlSe9tWV|j9Nr44l#Qvpp2OQiY}=Z;kYbhQvk=&3q}@leZ}%<&7V)lN zAyZbR!jQWO8Yy?u#rLcNY^R(O0DK=y%VW9D0S))P0rRny(Cqa207zwR3iWM=8ZzWk zh?EU`L9y#gBrQO{$EJ*&dX-xGCz;KsUZv%GX&g_zDlR$5P584)YfDk+l>hcRz>0+`4Cj{aaaX;rrhnMMTEfmD|PbPqrgg6cpj z;=z`CkAvz!D)vMpG>v6kjrBqEkP#&ve`eDiP!X0JC0A3$JJ@N?9Eow;yq_GRSv7i` z!BMS7)-f8%1OgKe!LHCQ>d&SA5t_@vlYeGY7#%3QLIkKk?*q4yJsaQN+L0j`kbIVY zCRkZh67xDIA+M~PHPT6E?1JyOaxqJo@p{c2gxO7W>ftIpIz>4++xh&cVPoqsc zJSl6mbp)$n>RS-Ym2k;i{EEUZGul>l8Vqs#6c*f{G`GP9*DT9LaMt-yFhPr443P{N zPX!GbR6y=|noITU>CNg>E;j7^LOZ`>_d+A@7A@5Tsb&dR17O}ys*A!ZWEmq|4VcHW z@J454-aNwiGn>9>_T;gYoxU5c8%s~t(vzM&+I7b>^}WEdGPR0#kafG`HS#5ptQi_P zNY1_#Tx8)!kD7fv6(S6eWdskZ^k-;OFe z1&L6n6^3~Z>D@nsWjUp)a5Toqx?N{PJF_0sNC23}ELdMAH`tH^O8))TCcoj|hDr+6ETal*&ioK4g_8(7<=S~;8FY^ZH+ zTP@A+UM<4rcfBJLahl%~n#<<*xaOV@HKUuGUk^0Dq%O+Stu{Yr=7NUDRfzdMt;^6U zMgZm?&IR*2rGB5KUJdgLFf5zzb69S>4;X&B{5}ia2qbgcBS^H9gRtk{y4bs@xCB^M zN3C6IVU$Ls8BWxQs%tKO&EJ^JpfJ&?QlZxL2mUVujJ&g$_WIe4BHpF({CvebLS@8DUiZI)mRP}>qccy{(Gn+1i zDIKJxv@>a>^{Lw^wBw$X_AqCJ;@W*149uNgf>mKlBB zoKY9asL9EwnkINsU)M?1l_SQ8p(hbv_Ls<$>_*EUEdncF*=^|0KoeR7FBG* zhHO2H%a=|u-Xi*%sKsl^ zDth%bXc#~ZykfUl9({nRl-MeV%A(kIXFiOvcYISLCyYtoJVWO^pXH5v>???Fa|EI-+^;0J1 zD(kqQ@Ypxw>8vAaFkrf$rq8WkAY#p0LNE)ZPikd#Ay>b83OFdr)vw8IIgd_u!{HhB zw|OXsT>WZ)|31j->R0=RdUOGG^{f5kSitJ)SNoUm0OQV4x%$;UIFpH&p+4F7xn|CCE4>VA4M+K@>hEY;GXTJ26wT&DW^rWDJF=jDUd)c?nr6{U{5o zw95U!(_~@A3n+c%e*jOGyC{7<2GDp;dwi7y)m@anDk@TUQTpP9)m@anYQpL+N?%`& zdpunAL#UH$G1IG7GAG`qmn@4l|F4)-sk;>YYO!YHePH+xFsZsr(SMMzx=Ydjm#CDx z6#a(?tGg8ahY1&Zxmfe#WLO|&UM|-BrXW?`v*BpJOOXCvF4p{(AhljP$Dbs~2rn0F zevcsIyf)L=rXT-J^m4K0PcburO!soJ=GTigFBfZmy;$>dvF6u{H7^%ye!W=pzC~?% zvF07XOe1C+&=z~SSo60vI|EtjvNZ z^fxcoFgrkeV(0KizJ(tH&XJptrR)H9pgle(h6Oh*r+8;bl>UjirzQ9!J?0+Omo_-^p$;lBs z*+^%W?>V^JNX|#14Et^A#Q5pHVeg(#Jw`fv-yug3*AG@8>%i0hKytZmFz_7bXvuQj zVBp1jX&3uO;APb}N+|s*+n>5_Fz`BIb=_d#P3l$G4FKBQ38R47@`q#OnqF@BSMCfrH2_@Bs%k z)QcBPkNq$ZeEb5#WA6b4m-4c?rK#J+J^>}A25ls`()A}`xn8U|xZYI@nwO;vZg5F4 zz5F^Id`uAA%PYl#|8hyk_wq`y;6~SK&?4Ro;n?6N*E`4~-$i>(ia zEXsL#rC2c2N@LIW@?h;?wzYwcz{@Mef>DbKGQ7M}EZElKKp62>QFVbu@8)~kQ>=p^ z#opH;9E@4?b(uFru};FN^72ZtV5!CRRDUn86bp8>Xmza@XEqtZ?t%>S@=CE_rS&Dm zMtDcj=qf?RdE*xXsj+a3I0gh>DHiN!9Sf_bdwHc;aDX87-Uo;b5^eLmyizPUM39TU zyizP!E9F__<&|Q=T- z@MJ;Ophh2r%TnnokIfoO*-Wo^tZg96?K1hnWHDX2*ekH%eS8t5QZ2R~+shkefnSYXmcHQhh6PggW&!*H4Gj{oEjooClkDk;4%NFjpvh%YEh*8LoCFUebZr5};TmHHW9JI zsBAYHMa|*J!Eu8vMCHw)qCy6VUPG6o(m$r=e6r;sgPO-?NEx#@T;P-`K$+*&9gbFf;z z%2-E!l|gO&Z8c@7)zn<*O{zYViGPE#qyh5@UVto;Mqu**_d?>4bn+Dhx!m&nujN*9 z0sSY-EjwYk<^6UHTq(;f@Ap1{YPse8;cUEB)N;%F<0!si>`}#&~Cl-_j@ix5SxO0N=-_uu-v>|laMRFJ>&WrEz6$mlwU zX$e|fxMh?t0j}0?89m+rEc4WiN`h()myxiB%Sc$mWhAWOGWxE9IA8x=kS^T{^yQ4o z|30$8q6s#d{)6y~%l{@|x8H}S<@d0a`1b?$_}9YBWdBgeW9DL|!ViJk9Z+TEoB(h} z3AFhLS}uqLX1&D%cZP=o7oam5)}u%sxMVn_k_pZW+*u57s44dfRg@9PEwGXaZF?Z~ zuj&f%H2Yg7T}yK_Y+n5sSjUDGw%ca`e&}?-5&IWrx;_Ri5!u{>ZJPt)n7aFo!9*5eR zK_F^*9E!=O$YruT4s|tGLfdj#9*4RKvO<=}p)x_%$nrQ;F35UW9)~KVyQ<}JC~~>3CK0G_k%}BJ&)kdXPGL%L6k%>&yNlQoE*WEjR3RcxGA`^X7;`< zBQe*^-rW~aj}hpC$A29`y=KmQ`gtUmHFM^388A<+nKNHp0a!Y4=F6%BbIqLj>MH0^ zYv#3*36mP*&*9zW6hkoi(1s0Idjipkky(wGhxk~nXqQg{FJ^`Yv#-^ zo=yv1TUovTga7?z3PVfte-eGsp~ki zeqou_4f9zCSq^o>eAXf6Rb^P$!}hHC4?w?or9gGVye318)#b5&fl%6d0a<5JxnUmF zT!iI{EV(soczMITMr=fyNmiU>rT%jmCc$60`XYtL9*n1q4dVcWn;+otvgN$gcIbhT zDi<$;juOs@^mg3{#LMgGBYj+)Fc@B5M<1yX2Ct*P5FU$efmD9vde9Ys0_qV|p=F^gl4 z+B=GL5{}wCij-Od!BKlhk;J{DNaEg6q|&0#)ZS5~N)WYo6sfUNVW`?WiuAK;VVl}J ziVP4$?HxrD_l_codqD7BsEVcSb7m&9 z5J-kFgh_IM5dql=OCYj@V1^-xVnB8zB<#2%yC@KM^okJWDrywm!G()n7xbcXU2(aJ zySU;mDvF9LsNeHc^_d(Z_x;}QpD({3LswUIb#--h^>WVX@}3>Vy=O;p_v|Q>A?V|` z`yPZw^O;^3f6V_*6SwF7?bn{WfmBcURlWD2E80_c1hNF)^>lb$#=}ye^0wf{~ zM<0LDPhEG2FdTjS6#)t(3`ZY-T>uS7AAid)I~KcjX@ueExSgK_B1b`y7ok;ppR! z`ch3@g>5&c&T#bc$9?TkC>&up`uLMRYR?R(XM8;X#Kj-PpA{exVL1Bue+1|d;ju>i zRUfri7-2a2`0Fw_izD1b$KMuUK;$7}-W8xU!f^EQ_oYmEgyHDpy9HAb;Y1t%NQTt- zNTe-*PkmgcRz(<&KK_MZW=AgR2;fU8GdIF;^zrWmvn0ZB^zk1AQxjo0`gp`oH?uNA zFBH%8s|hk3eY}akFB-Ql!f^EQD2^*|#1d(CB!Cr6zU`vGI=;L|Pr&}Wo zM;|ZnbLei5FdTinrIgtb`43x~5MXCyIa#+6;H?P5(Z|~hgWVB&$an_a(hNF*{3KX^_9DV#4fugpAqmK_0@k}`S_;7&| zwuGaPj}WMXhNF*Hh*}CY9DV#mwRl^?(Z|OMRBB5&`uKQ($~7E)e3HmtVM{pr_+)`h zIQsZ>wQ*a*(Z^>BRAoyz`uJ>tX4?{uK7NWob2S`&{4{|~IQsY*0@c_Ojy`^-KZ$8% zr7hv;cIi8pf1YF%q(bm>i!sCL4Ao;pp?mabRdT`n(BD zYdHG6Nla@v`n<_ZYdHG6DNJiP`n+nUH5`53G^RBieclYFH5`53ET%Oaecs72RIB0W z^G@Rgq2cKB=Bm#!;pp?`D`>*e=Pgta;pm%O1-0NEY;eKX3ixeI^A3hNi{axcG!4&W zV4T756d{}gY)Hb<=YLJ-B;n}u_nitCitlF-jz0ef`d$ssp8wM*2Q6+f&&oe2KBZuq zm2ca0JPB|t!~bmq@vY)dvp1tgD_g?RXKOh6OopS6Z}YDP9VCL&$>hU>crfrRa`Kr@ z#6vQ7=^Pu8v_3qDX9no^_2EIhiA;8y{Qh3K3`DGvKoE9Ku$J_ zAp@(_=<`mOFOklc==0g{V>w}Ge}Z3M_DNvj&t8S!K=w#@tc>h8(bK`~VfYPYe+im! zwnU%L-iDk;*`Db0PT7y(nV*M>=Q_6iPz;j+qt82j*?3yAwsJD$d3`u?`jxPVEiQ2aUD3m3Y(@ZuL#gSV{mMcK1 z%rj2h<~&m_51gFVx_d8RbWi69`%W+zAL;WZ%CxmPBUVK^L29SH{Qxktt>$58c%V7< z1{T>K--<~*l(U=@1~OR$?Kq<(N#k}#S2K4kljAOBlF{d#iJOqLnz0|^NX6ubJ%o;+ z@`GVkA$YQ?$H&A3g5kCqf#wDEP5>hG;A(s>oWesvA`n)rV{U*`p zorj)6Zb+ifI}hhWGqMwMwuyWaecpNWA0W}_^UiiQPNUB|kCU%PpLd@6J6fyJ=bara zo3H{^eq?>u4m?9l7CPTACI8dUL-r3$YV>($|251G=Pg41Pt4co^Ulw#OQX*_zX(r> zKJWa>4q^0p9xpT_5gEw#HMR$kyOFIyZZMoLzb&LQ?m@co!)Q$~yp2ibX8v;)>g{I# z2O0TaqWEm5yItD?cFpMXPA@TKE7FA4+ed&vgwf}nVq@ftKJWCmDPS}*2*1ui84Gc7 zBF*eitsMv8}J3a1on zSu>e}Co9an3$wZNw7)(0ixf#D8b}cnb>?3U**k#r%Csn&HljT373FEKC<+)+o=%IB z4?dY>3ZASra{zWB&dVZ7{vzae0AS(WcGbS7O=T~8D|^{nnF6M=m(!Kq$_mI7Jnv!p zUu}`z3-r>B=;1D%E1x#hSC1Ve-W(8ylp4Tz`6f55A4;Ppoc90Mo z*Y7RzlV?+az5Y{>ud3Fx5n!)ZfW2M;6fgqpO}F+SD8wD0&lXsJWnX~Z3Es-WAh)ymx`Z#= zLfW6b1L;6^H*8xotiTC894h}3H z(*_xVn@D=eG$Ebil3sQQX^i5?Sy_x5FDvjU)_nPwUoB;>XBm2kyWBEX`+Zn>hV$3F zgq+-0NL$;L$%|Rl72}b#0wl@5l4a1|^&zZ7v)@5e8f9M!L@fI_NZ2a-C**XR$!mlkwAC+;% zWrYvGR5Tq94?wSKIvQ@3&X0$u!h30cBK$*|rbGDpbbeuY4@SDu;Bd8?!2O(70-v+4 z2RM%$6}5+C^lb%`zk4$BQW+vZq$?{LnlX;TSebnYm1i^q*->G8WyVC(^Ffk*Nrp^L zR^~j`dTB-(Fdc4w9Tql|W&P&^?zk7y`Dap@ovhA9XM^y{kbMs@UFPE5iYr50{dJj( zHvz5;F}EvX==?pz;?UN=f$N|j2T^_gJ!GgK2NCXA|8Y=9{Wxe3%XPb)4eTb9zTF)D zwEF}YH!^6sg+1i{zMi^Ru)1YZFYPlZpIuAZ_o&VG(z5Q)U7ALA-{433s0^+fyUexh z4jG)Ax=Ua^lWxvxJ7x%%tOH1Q%HZ0#>uK_?NrtqJOJ2Kc1{+OlVEfK{6D^w}3VRF! zbbJE(_D_+d=x&PYE*S2Gm3Yr2l(A(FNV z$t>DyBm1#Zdewd6&y5%V?7ET!K0AGq4XDhZYV9#a+X+==5QEUcc=iM3_h~_O?O^St z=B)uN9^}uidl!^_A&xvosltmI#SgN|=g9Bq2T^*0DPoOf_I8l>dk@*yfVBTBNLc-z z!S71|2h1|02+L><`jL&Ek?);_SDxC@Ra6_g&wnb54Z3YdlN6-57F=w0F z7ePpN@lr5s%pudO$0C%tQckXF4ADhc7W2=pI{-Bf663hiN8^}|O3TFLuJqC5z9#$< z&3LVk`kcBKu$bps;rPzCka@9XUnS>kdHV^W1q!zKiC`}mO#Y190PoKLudAi(Gk}L| z?3ol%T&9e>CH;3B~ID*HX7+O^PsTdniq*hvqVu zX3Li;QNlo5+B?@nv&E%}9?EBxhvqex#`?$RX5QDJy)P4i53kKl1Z^=|+r*s_2J3G&Rq9>ICzjst#c#1x2ak06&J2XV*rVpG9x_Q!Ju_z{2w z3N$<7zb~y(c|8@~jYl#g;foA$^h~@+EyTEImL5FZ!74dukllf7$R*<6e)VkAo?v(- zT2XQ9n-q%6}bC6s_6>rI9@kpk6dGz)vNZ#PDZsOc{DN`>QU8>q-ysO6x9m&x8GgWj-+aj#%J!T z+L7e)8o=@gO$DObMn`MAsM<-O5T!i+UsT)P5L2~FgxI6n0S1{?t%pm*zr&;2EVQDc z^@D6IRa;>SdQ|({HX_-8Dud+mkAHSu4_N9LKFzmBa>Z+(H0JUaX<+ggS*k0hQq?Xk zSG5aEqjpV0?GJy4;$wH4it5!K?_$(Gmd8LpLv^b5u~hqtKV7v8n2&dE)uP8z>Ky=8 z?PJMhnjNspL;Y0KqV|afpxR$SgGBBB`7df;WQeKuZ-v;S_R9=1t#%I=yv^@X`!!U1 z>=8DWYTsZAdelCOYL^CVG04A((ve&DPqahTKGv&t1&rDis2qjMxX1D!&7Pt?AWG04 z5bmZ2G>snMMQrx!(*CNT`X0CzK0$oSYMzZ<1TAV0tY!~n`2dRH3%H4(_>|S`fpLDf z2Ue5I_W;XhnF^!_9yS1bU^FPC2X_6J9(cnLvj@%;VowizZIJ06@NmJkmYyC6q7@bG zKVxHM3qIg4KINmEiDUz!23g+&MR2Fu1FO9~pn&NC1*8X7dwW2XpgkbmO%G@qJ#g{{ z)Vp?rsk6QZ95`v|fwep!Y#wlXU@d##dVtWbQ>4A^`OAquh#O#3|gxJ#q#~Eb02RvLN{@tD)IG;VR{z*2LJy2x|){lX) zyq(KlJJ%q_qapmW>sFx+W8@~(wW@tu`C8HOWVLc>CKLpGr=-U8jIWv`=NyM$c53iu2`vFvr!>%y?B*LCC)#aH{~Kbs0fug8|u>$Mvw zM6YelLK;hAOp~M2v*k=fOuY^lVvkIN;p7QpB zdQ`R7QMLafC?+f5*ha2uucKsvOjotnk;{63iO8luAT+_ zl%SaK4HWarCa#`uAeU}g(DPzbf#~@;15nR=Nl5g3@W1H!Geb;0XMr6|+_T^_$h4k4 zTyVv)N6+t5&nIxa-atJ^2Wx}t^*na^lSC#Aq9m>3HKWhB&a{As}1yGgx;VDF^>KO~rq@1sY^N!!P~dhB$99nS{# z6N1kX%p~|J!Q3do$7TWijOUS40gf*m3n@|G1blL}hrO^4xfACicfxcm+rJHiuu;>1 zHEfd+6H3R~2mVSfHaX@Xx0bo0zxgkm> zq(9+>@W^!1%qu|NR=6bo!ezhV(pI>fMK0|Q$K|A_prFFP6z^7qv&J`ox|b!34p(y0 z#H&#M068WuH3XAvX#`r)uP<5wzcj$+==lmQ=C#ZqlL&@y zUi(`mR~hV6BC^P2O{%^U&0HeAx541C=vAH8-9%fEquV7mk7~=%@-n`rh!Q-y-wHUH zgGGY9R5*M`&D>?!ysg!6=EYUoi*E$eEF%v@9&N@^GG(@NxWMMafNF zd{t*t9@$3VZ(oGK>+Dj4I4?aw?mAipUMB+gMeQ8)>qOv9fKtm$kt0ymom!PSRSkEy zQdfJh&mM|B$vWXdgQe#8D3(sctYEBE!4Pfd0PyYtLH=qh_t92-;e=}}cA?nH7sghs z)Bq2Q;SE_>sgyy_LJd? zI#z3{TP0QVVOGS)$)iJDdo?0&7taG!3c)gcq`MPP$t8vbtrvpmC{xP`hRI>dHP4`~ zgm1ecoRF@IZ^sUj2WJVX>tn;cjd1Ut$GYHajudbyz~ob(fmK_16kz3}@@EZCTB25t z`W}4}L?yn&P}NZLw7uSs`pS6k1F(D-r!QErHKkI)CV^1jU;*R>8k=JJ5a@-TI(K+)OxySF0Q<$#4OEERyW>k%iq6*jP3n={8nhF>UFm` zEqZ%-J>zYNQ^t3@?4zW_2`yoB(@ilR#nR@el1YuXgQ%Aftugpv$mgG3_YK)@S&U?F zVS6XosNMJWa~vgFK_}~o?;{-kPFMzfUq46C^MFepGHj_{x7uEhoP|PDgz0XBFA2ES z?iq~X1;tO1FDW{;MqBvKrh&^65aLuk{FTzH0qLX2DnIA99fVUf%W6NLb>DOZ;FGw* zoGS1+Z30&BIHnkTn!vtVEBR&tz!}1B?2!S)aJ&@oOo0(KYeiBtFiYP4egOC$H!cAl z?~S7?s>KV;k=FWaH?Am^srF>i#_+aSzHS(c*H{K&F*27eUM@^-2cl&3vD(!&I`m{= zG?mYx&oYReC~05pKN^MQLG*hl)sGLNyR<`s&!U$gVU16W!{>yo;oL0Svi~JDG-;1X ztk>}R8cqg*@iVE(CZBe2o}2H(LnV{X2LS&u`Fx0oS$LM2W#N|*Kqn0_qPR>=E$&hW zJrK(nJoqRnK3=OPD^@FPgc#2hO7|LKdERM_uR;TUF2zj)@`}Q0(W}39%Zh1yJ0fwM za@qhQ`wD-*W05xxt?M`1O`M9vlgz0?;tM89keGH95ciYR~&&)J_XGOba0Lo6FT7tEy)|@@Y#Y5Rrl;^WGYtk`m(355Ip-{r8>`oy-cHPEf;Bolv4=8v@b$tg6-%%Vo zNk6xf#T@}3xC!tO8K18LR*#gDF<8_IcsXTHiSzh7;N*#mL0>L4{z&*E2ktVZQf0v+S9drcnuW3d%<`@@=a%Y!KVj#R$W&~&m@e!H$3CP2^ij#U09n5*Y{ zSKz)~0B`W4{Cnc7&L=Fs>V5G=FA)}B^?|?z_~gB;35DM+qk0zLQh2_P1lj>e$Na|v zx9A2~T-hfg-3fqoNa1@gxGI`*Dtv+(DedLLGBtEsGIl6d!b%-w&>Xi9D>_iSZUvi< zOI0Qu$<|OyJ|nrh`!jnXJ>t%NUu!w;#B%g4tT#aybbE<%>Z3PjK%p znhyr}8o$0j6$)?$=`Q9L4$$26?WjfpPG*H&#kV&J$Q0b;S56x7z|COYL$uyfSQqMq z-!ZU<2zf0<(}g`QiK0Zu0ACO3A+Miwl*_2Zb|y9d7RUj@!m7|dYM(Z%3*a!-PzD6p zmGjWGYDfb`^iT1%4m!#C>pmJ>Z+Nm+oDL&hxj7gr3|^y`O^dYty-NR?wqx)UCO8&jo^ z6Qv*13$6!aeSCnYU^fENv97Sy8?dZ1CIq++nF6>-EN+r?p|7^INQU}J1}x{uo-CgL zeGXcE1*%eIDZ&&r(+I?oI|!ms37(O=$)Gt1D-BxSSkZy~f9nQ>x{V)zfC8{B;@p1_%ysnX0i)YWuvH$B8h!$A)9Ekv|!X)@M*a5*BrO0`P_m ze$+=sN$IN_<(<8(62B#bAL3W^gIqGuZp|1Y z?6)sZHaP+0x5|r~7Xd%M26FVrN?YBBj(W^N}by+fWS?Ytb`p99gFqedFQNmj!VMNS0q4;!dc8fA+?V zQO9CYMz)RoHKx$|+2mf5J67vIl(S0&(-qD%-f#{4!pp`Qx%!z4rZiodmpH+v4jAkl zh+Yzl_5P1!dIU!hpjmw?`ScVXYLw5^(!+Ha@(>N?mArhX+Y_Dn}k9B}_js8&dPW zxYVOYogKmHJyUtTvIiN_lEC_olTt?6B9&aipPFunINNn~iA0fxh@#6{yL_o3JsJGU zGmMlq08)Jnz!QyHWfJipauWMthBPk$UOZUCLL3T-_&a=qYVilJ7Zw94^)!B?azaZ} zk9aEh>aZ1jefSE-n+mMdM;;bMa1hX80~z-no<-4cbgjy0(K<`q;p6EEgyDn>3x@et zuUwup12xEfg7v$+PEmEm^a?DXVzB-|7I^epkyS796vs-A~O2(!fDeF9h~v)SUO zdkj=RJzM~ar_Y^e0FJzH~l7Jup4m4=h2XD6NVZ|LlDSrV)< z=tg1>$gZnFb;D(adbuo5>@mI1;;g({mZ?fkN!|sd9~v)V(orb$#;fC7a}l?4X);`N%Q^* z_IF9`(eY|aJ=5~R6)?U7aRi;$%(2lD}7p5f*n1KCz^sDCBpeYLY?q4aft z3#FOBmTWRCKQ+p#osG`cBal(@3}ie2oMcYQy%lVp6t??J87$%C&#rrwVu*o0DQ)@( zSZfDADXnT-<{Icz!r>agx+Z&G;3JZ52frXny$EnBXM)-h6?P{opa;RsJ>YngpWawp z;PFtf0P#?e_}bSX@vp+a!W5~0Nc+ZUSK?nq;%%t0j32F|1X^kp3<+4(*b*EFkTOua z^RX3rFnLfI25NUaW=jQ9F;NPO9V!wBr-u1@QoM{23bp2kg4zA~GiZt{7yu*}WJ z0o7>E1F0JgmX+-|Y-JFz!O^FAf}1`J(WB4uJ6!=5pa*0E{u~VF)B(abPg6GD1e^FR zV~e30l-?;lHxc%L8TdDufsaK;=}zf4>A05&%XadB%)nO;)fxDp%(&kJ(i!-7fk&2O zhp`*0^nc->?sTHTLw7n&gNN>Pa)LM>u--sH-RU$7@@@vGXC3?n+97 z-1+oJrtW-7MbI+=W9L(MlG?lbw#zkXzJon{HT@cj3~pFJ>liF`{F1I?u+&j-9P5ys z&zQ+tPX)xX`v$*8HL~-m28rx^Rv}Sxj-fhqe{#sqXG41DbCDrVpbq}oor8>wC2Y5V zn{Ih-Ysk{lW(?L)ykAZ5_NDq-KltmYG4#7VFc7^}!kA zWl%$;`v;7dHj`8zGWCI(x)66X^)*;NJ?ASs_3naC&xadq_Choo2S6#9U@D+{#T=OnNJaqFnC7ZKv)uWZcSK;H@CNm3!P!a4UDS zp%6c(JGn0nx-BGs+#>;3C%vuIPX^76-rJ@$olDdhDK~n*dF$1Nl|OFqveEm%0Nm(x z#^@#Qh8w*mrjxkQn=+u`Z@dbd8sryt9P-kWHRzh+Ju|QEuGl zxE99j+tb-4-(U_!BXitXSR0HIJ=e&PQK-kDnoe~!#GF){fG}-35&!+hmE-x5 zA=0O}W9Xx;A*CiWVX8R;rHkfd!-|4wXI3)a5S5{i>g|p@$B~#XB$Ga}Q zGRQ;Sv4FXfniAxB;!VWL;g`bp2sl7FRH_bgWz`R`ZmOmRzih@ct9{E;8!L5K@_2jt zBvF9-FbQZY^{v4(KH)~iH`w8vCZnbP)f1WKu{*BcyvC+z9pv%DVR@YSUw9m{$3Z8Q zv~pR&#L!nfN0=0$@)nE#O&IixXfFTky5>`G1S>DAEe*Zdr<|ZV)r_*X~$8 zl`j^4QKcQV1%>Pl!E;cXyj6JWD7+u?n?WWM;G1g6M*;Zbj=2tW=nQ}DPVThH%_{F@ z@Ul&wYyiIN_L~wnFrqtX0CcK)z#{$#HuU6!=@S;7UdTbq3e>*SF#Hoj5_S;RdZ~_m>J+1#*i#2Hd{nGlLoGZ-|aqhQ=G~6n=&oE&~MYJ~JzxQ-Q!P$1J zA?GO$jVT!BeW8<*JJF9XN}umDi|14L9-{-8Z)s}w zG^H+tKd|=%zX7$F+A2_#G%-k;8a*<7dCKKa^)`kGir@kwyv0iGGPQH2?&ihv1xn0^ zR_c2XMa5w$T$xzy>@&#J`FEIBw9)8Vks%d!Nj1DfUlLmgL=`WicHlQ%nMNY0S|`V4SfyR=)t?C=mexsy4}rY zwhggo?6J^FcX<)6ZHO%$u+51MD(;HOig>`U9L^ zPXWyVvea83erM+uONaf*XT8?R4=qNKm!#nHrr=8~sPr$_)4wXuhEHYxzVSP_V5DBS z6=jbV33i*N4N33w7SF;QCQUe2n&2OYu9b=YSZT--!ZPy=4{@S@ld$akjtlWYV#RoL z{X2b7!wA7Y3z)BSpCG0G1jP1NNbOT;MV}iHw$mgkLW5?)B>Etqr2RS}Q8WQPO>AW; zpgRD~7>P(of`8ZZ&n@%5!e zOz`!k%}7{N*`>W_YAqG4r7ZN|bd)&*`7e`nCKCCRAR@6dmH?_eA3qhyl6yPmnZj#W z`1f;JmY!-p@KWDZOt8KektkVVsMA+>z@ey1a{16Dtp^vnBt3sT2k(PyGUe)XF-t&v zTGayvx1ACsLl@702@A6ra7|)em>2Adh0`5=y=? zf*%b4B1HV3r;m9sUDiL(!J?k`L0VHkht0J#g%XpY(@`OOC~o!JkNiKV!j1+xMme$; zylrnX`HbX75lIiWMh5U=7v^zyFSQ)B6^51@mwy{tvp=N^OwBWR9`}6Z<>li}%**Lg zPp!@24ya>pGx>hip_B!)wg31?VwzHVTaTl%$`H$i+n}7kQSpfS=UKnH3d6aS`r(px zhMQ;aHs$xHpsQ0ug$9K+g8bQa-=aFMC{7i>GITOl4Dc(bieI^s5Z>%PO)f?H0MO8h zhQTh=9`2U(O{%2^!&XWzZE(tS|3tk@LTe1NPrBX#vt9qVMEqmtO87U_wN&a_3~1N` z9**qBDVv`FvkyW$O@1uxY@42r^H1L7^r773bS-(|JI9aY3a3v2P30|6(K)K+3fj$A zp_Q2E`>jEKWD3UMbx6!YVj{7Xw*h(rkbKhMmPYmWRUx?_<_#McMwOKTO;5i$l)48)YR46jiI?NmmA3C zj>B^4urFl_2$v@ta=A0~fXn4Ma(Vr*T*e>D<&%b7?g<@qxpbQfE|qp?cZUZ>YCLM>pj1RA{BksXPa=GwO zE*lL|+|}-Np$#sVOUdP-!*c0+D3>PbZ{AYST17@B$wL%4VMiKxjYd{(iQOwsVm6kp8pG%)94wt8=^c{FB?O`;ZbsU z`LG;H(>gKUrN0@l&0QX!gB^6B_!3Ju1nF8Q^g8VL7x)bFik& ze;Us5yU;!(@^Dv{x`*i0;l+OtFTNDq#HoH~2zSz{{uo*Ws@YUsiFK;l+Y0r<5&x=m zEh1;s;M1-BS>?Qea<((bLv8W$KU{xdogRJ^_5CJm@lrz^Ov`%Wv+#s=8ACbL-_vs9 zfeK`9;u%%Me~bB+_r$x;Lgqg-bA!n&TFA}MXMrwfkaV~4yN!9^cSiNcc&}q4V=A4& zAc8rYBzfsGNZujI4c)LLdWD;oGy3;H@*VO%!-v_o<;UDv%x#Vt#vaVGN4$z_YMeWX zHQvKbO~gOjWHu$Z5i*=<&0B-UIdAx`2Q=?)aB<#|^jts7-OH~+BK|6u*;m|2AI-`l z{&jBVRaiOO{WWuqn|U!Q2lAOy#J|$be3P5763wh}Gml|KgEVuA$(+w?7;i@NxNMbM zhvnwfSRFfJ!TJYq)Lbr?Df2i@?~#?DHVa?MwyajxF8oqCeEcVuVCzlTi!$!QOQ?Ul z6&M~XNx4qef|H)dwVF@MLsvdcRCd)7)-)Rrq7cJ~y!aHr%d6xCEHuudjQl!0M)|G9 zkL*Ne{1HVzC@H@|kMYM^G~{Z~pFuKy1Fn^juU-kec;tsDxpzpqBvUxQApN3ic0=s* zSrxxu)uIv+N7}rk@+CZAImPDronEB8xXT(`HMfhOoT?bMf)cPXUq6?ly=+Lv-wfuBcxi6@^9A}+_L@69aLT@dy7UR%*9BbnDoZ4M1 z2n7#pk8dG*%Uywdgro%)blwWxhUD{IE{8qUE@n8)Hn($GTc4{OMgB|be2#4@J$p0ydY3$L=ZT~0l44qmrrrWAON<15C*j4k zgQF=pj^m0?w`1J3#|Y^Un+!|Yf}wM|D1|S^%SGCH>o||2twk-mK%60@<;yPh0gZ&l zTJ+C%QTZM0f?-5+kc-5ftVKUyeE9h=(3(ROuj=$_chTJ+;JNhoRLn}^<%ca2CNLpB zCtfgyL}8m$n@J@<3@8>O8dQ9GyrAhv(9TWrQY#-`)r+CpTlB_v;PM-p>>*l;F7b~* z5B%=q(+M5UAEgrBby)>mpRc<5hH z>S!M;oKBSdq;&(SsoMp=qvM=&MD=`N6BC6mT?E5kkPG{Ds(j4hYe@CHRnn#GM7boM zDQnTISWdNguo6kW>Z7)IK8;QKc**G)g7Ka~zS*J|r7zeCTWdN=)XE1>F(DS^%a16S z@>+|!qs8qi$%juHjXo#7$a6b3kB_&sJ}D^mEn0akxPL-4AI@l>HQ>9r+gc2j?L2ta z;wAae#u16t>nIq0EQHE7K&SCD zgWT8Gi>N)Y_`^pbXM)==k;7V83c*`h$Ksa_=ZZin&mM~TriYRyxKAtQD$#Y2g4(nWapUB zwG61*SVGtC!P=wAs?z}nB`ie~igrH0EGDeL{wR_iFDE^dftFoysY-_%0B3K;5C27P zC#4lyh&dx3wZ1}Dcu;rbTkL!*T$D}+!XI^JK4vxC7#;z=rlVG%E%{Ep5@iELP2fkm z{X{M2L$6JXCCO;IIbGjJNr|SL)8|zt8A7*Nx317w<8(CLW<3T1)@ZuTdS8UJM6hhu zhe?g5+pL(a3x}H^ry`P3yGc^JMBw0kkNBvi+8Xo44E5S!OMU(dT#87 zm(h9=J+?tbXY}0I%`B+Vb7Qx@3382|8@q$zY4qIKU5$~}=((}YEs)mexv?$npQfJV@ApwV*?5p+Eytcnzz3$Ys6{3cwZ=jM8&=jM8&=jM8&=jM8&=jM8&=jO)k zJHbt(=jJ;0zW`|T++1(;+}v(9M~+6%&FwCLM$gSH6hNcr=JpUkqvz)KwCOxFdTy>a zdTwqXoAG0xw3^)pL&&{0RD-^Y=WbvlC3La~iA2!`34lFOj9lH1IZaJencX8(tJW1*6WFO6de#pcdI^uKfVgM}4CeAoDL z=7wWuEL>p4YnYD4X5e#x_<2loM3QHK9O75K%jC5cNZ!;N*yh9Vlf~hZ)f4T>q7lMl zj0XO$(Lgn3vS}c`tp-5OP2+*hIcf~HbUB~k*OznB30S`7ymcZ9S%GWtU;Ob2pllk* z>;5@Q+}qr;YJ52(^6_6F=WosMUpS{HPNZt0IakK;Um|A@Gq+QfboQw1Lzb~g8 zu${9G4177KHbn(Fk02*(nV7+xJlvSUoNr9bVAcv+jT!tnXmSxVxD@yn8Z%gu8Z)?p zxf(OLieo36vl%l*{n=JFixVSo$jWAwoWKOGj~Oge;x?!-@^&uyAc{GDu5k%X%;5Y- z-bZnX8Jz$4KY-Mj!TC=Qf=?5-mA^yX7GDL(e~trAV+QBHz_i8;&VP}7HD+-BPP!o{ zhM2+myU0aj2Is$%k51H>!TFw;!TGyshsp4A6w3dYBST{b=YLj-vK3aYlm7}+5;Hje zHNFVd;vh^f|4l9tU`4l}=B9yyqt60Sj)Vx#@q`F27%(0A5+b-@@oFUVBt&q5&wd<0 z{#>gdY)ktjL~ub<`v%NK8X~x$nY|8x2@zay76Tz_h~R?V-LT1!5Wxi>%><2x2rl?! z71A0axZq142V(e+k=Vw4PX}ybrtN1FHAHa1!8gE0Lj)K6!MaR{;DWP{2BL8~L~z0K zVSqy)LV)6e^B-W{gJyy6#WF6!Q=owYPl(`xI+AFJ;DTFNhlU6)*wUEo3D5ii^xNAb zts#O7o-ajOLj)JRT7`5WHG1{)D48Q6f^#%PaC7p?VgsOeVw-Su{>DuCu~0NC$RBnF zXsF|0m{JDA)JHJt-){#KtZ(NBZf|q zNF|!on879+Wb8j2Zh$DWM9Q%f^CV_4`u%C-OOPy+)|kNt2wM)B2g3|E6AZtJbjwDJ z0PGa|J^_#?(SV(!eT{LZA<=-H{yr{vG#aooP!Nm;+!KZJBpR@@+BX{1`HTka)cT|= zHDaAN8nE+s-vm%;_)_O;-xL6GtMTKaOqLIZ8J9FO2S1Gl!izdL`xYUc$8-m0i|;7_ z8oKUYpBg%EHgN6}K%)UW-e|ziR^OFyXc`UJd06C1SdGdtflJ{vRew&4z%BHMksIMKoO}tgtI>cRZ!}=%hyeYEMgw+^6hNZ^JM9AWCK?Uc z=_DA92JCbRaPH7(z>YT>u;Yye?DPpxXBrLIDHcGZ0XqW&7eG*r2J8$9*ys(72J8$L zK%)UW-e|y%HyW^0F7451z>YT>uycHXov+b=of8DmXuys)8nEMy2JE=efEzIauyebw z5E{*sXu!^6{?S+~YtQ}LuRX_Tz|IqXRWG9fJ5TvJ8Z{cQ^Q>PSr9=aEo);h?(SV&7 z{nWKa19n~!K%)UWuM1Gz>NDuoX%G$AdDq_-+Df+Cg2e~IOwm!NqX9eKXu!^=!bYP3 zJ6{MeJ|F7=#~TgU`Nq$F(P+TVcm4-pCK?Uc`N8i)O&Sf@`B8wHd`1IyewG$$G+^gf ze<8@$SdADB*xBT(f{I!*y}{=^>U#|52CA^_#?%=N*m>M{gV-Z)1aY49QF~@MJ>%o- zuF-&YT>uoLmq&1f`WC)2Mc$Y{V$6aN-8PNM-k zQ9q|3jRx%G2%yn`otU2zXf$BQ8x7bg@Y5%0G+?Ktl+kFwPC@{U2JEyEK%)UW-e|y% zHyW_xjRx!-Eq$-ifSvvV{E~Q|)?FfiWhd@{r*%pN3fqa%g@BF`C~7B0+zV)!h!?jL zyq3}#E>OZwMBqA{5dw9v6BDqXb1FnFg?3`n1VAUM#oLL-Q9xq_Dzy{7>j8}ysN7B* z4?A_-XuydJ2u&9IA8jX!2u)WTw~tsjZ;s{66sXEh@SQ7Xwm`G(#3_VM5oj)IXSve^ zT4E=7Ka_KZKs9!PZ=gG8`VsO5(SQ?uNjcw7d$xRuv4oaM?c;rkTdo9jp$w!dUn0L3 zpo?`_`4S8t@2vK7j+pC9FtWCDg$^uVfPwK}qViGE=~>jYZqOMFAkUnkHSUt%S3 zheiW#S@9fX(P+Re$E<{1Ni^V=d4p2i8HqRmSf`7P7YfZI%i*|$tb z18&n5G%f3+0XM!1twd}CaKX#4_|4RH31_ijnA2o1OqUxBzXd)B{D!{JXuz$$rgM^L zz^(S>39<0wGICt8F03WKh2S7 zz&R2PI7g!aH)1qkXPZ9^Cc!Wle~lOc*a-%XK~5gi2`40Tmj?2TNLr%-JDCCceT@d} zG?B?uqX9eFGI?^Z)kip=j8--cwCec?pd1OEmm{I`a<;<#`*I|7UXFy$%khNHYgN7m z^b$I+)pRyRLg%%*_fFIn44v2Nk_h%oh{TLvA?=AoJ!uxj zktJgmy_6-P^IBcbAhigj%rcyLM!99Iwh}t8)tZIKX~EEWt!iHdhZbC-wYuUDBrOS@ z*Xl}^L3`KVjsJ5bbY6~x&dZU|c{vg~FGoV><=ly}YC`9=dZ-5U5<0Kdjwg`R(0Q$1 zX^g&?m3OPxWVt4x^IE+@IW%-$t9RHk4V~BOL)NOH^ICnvq6svI?1JH~@=N1x)NL20 zu&CV$_&laNw9d6p27s+e>$q-B@@Gz;Z?(>s>~LgxD->ugM;h^b?zvkZVe?5s!pi32 zh)LNA+Nh@$G8)}`4hjshF9V|a!}yWiv>XiTkL<7o@f5LKYUqYL7~YPIOdT4}Gs*Fh zH*FcE9AdX_f$5eJQ%zc9I|86?G*&49E+#c%ssS{%BLH?PRl?A?jmQ*vJCQDk+Wkg> zcX)L-Y_WugD?o+OfjlX zH$xTvmj2Ns`3W`nTaH7K_7W+tB}qD4U0!0%oBj5Kto80O0+322*enuskZ(se%funl zY!PX?-o+;0BT{$035D!?g``_YiHh^ApFGW}&ofAhF)g-^n!sY&(rflfI1K5I_xiHM zKs)S+pxN2d?;TcCvZzpWSkEGQlGbq^UZBghsj99=pMdNZ_Ea$GI&n18aWUYof08`U zX8&~klx#HJtt;nB`$#(uC3f9&HPUURE-IG9c-)BJ!gE>tCf49SS%FiPKfCVlsH+EF z?!JlLi7&x>vWKh80~nkF8M604*6S;vp2KS!y?-`|qSFjv@j$%jyvPGseHNp$?7gDQ z8iVMXX15BQ`-)BMl^)5R8L*0J7vD-x5ImZKTy08nzUQC4-+va0iX>A()UP3dh(=7& z29GpFn>+yCv35%x53vW}J=sBc7w~H;>Cr8Q@JOu>p9*}4`tUll{V0e3b>Lir7d0Q{ zTKP2qgQhLS7gF0v)MOTFeb!r1Fnm4QFmT$v;JjnE!N8l!pIz6xKsn1XQXxv0?lm;C zMJ~LT8(ueCh#{nYr$2bvGhp_)z0XjVDl^FWcW^rfqJ3^twsXL)OibkqF&kVBkZgKd zQmD!OVo(pjE2Fiut)fmQ|9s?IgWK&w1w8_VCNr9@;8Rw>KI#$R*xf;aOAXb{sz}N> zfFIeoJq~`0p8&r;0he-Xn%^r9`QgR>J^?z+*zADScTqPXrfaMtEI}Fi1PJ$?16ZO3 z^pQIRJ_S5PA}I9D>~D!y=JXIOz1huZQQr?22|Nx|?+`ABr9oqao1Fq!Tv?w02lsHmw17SV&RORZ zf^GH*aPoQyQ2BKWr7R5@7qgZxJttk2uQu$}Wx=T!j(7)5>nQ;=Y?Tog&BqN&D}vBp z2HxUc8-R{7YVVW8s0@6r!W`a%GyoSxEwcvra6#a5{ujpU*SLJ9^)ght&)#C#{elw{ z{@Hbt+PJOXCqC?Y)T*uDC$9C=)7;i8-0F0<_1}r}90!=K|ITLX*ARkZ{oW?u1!n}T z;n2koHg&_!gq5YUVBhz8dR}pkbVu z=NgKHFo9h6_?jTyYbbEJ^8;3|0Z1H!ME{kBa)t5=*6#lUbb9r!uhWu z-ve{My5X&Q>@?qXL|f&w>PEuih82FBu(;uee00Oj7N{e7$VW$X93gQpdSZMb;LaMo zcbkvz65vwc<^6{)Q2lcXfaA0a={My!EWc4qQWKCDCpDIF%in^e|B)4)DS5f=${%c} z%ZmTd&%cW5M#`O#FLFw`c45F8wf1Zj-pTbLE{+<+<>$-fRJ(0U~&hAYK^RlG@Yjn3os+?h3f%PPerFdpFh)%Lu*JU6|jy6QQ(EcqTV6Q{e z{%4r{{m6$6*!?jDRaN5h>kha-qB|D0_Ar^^o(GfTWQVj^Yuf-K`vkiO=z9Hz8KTqK zm@2+OVm%WdA@KndZy}L)PQV&N`rbioIi>;{+Y||21wO7N5@S0Gv~|VUA|!B|>WJ+i ze&i@%j**P=-XrjTav63I8?hLB!idn?G}!K7uWJu6UIcCxhe0T7GTBi_$wT-(ZCrIl?qG`&H?0JTO($wy882;_gC&S%+h!b)x?x$!o+&G2ddw(vfSo=|i@Sh-@YzTGk;OOLa&&g*D$x9$vAS5I0 zLM!>6$^H@9f2+^_)?{;dZZZsOOO0Ip!)K{nEJXH&5Fufj(tNOGy{jeINp4f788mNI z|6R~J^Ro?%-kV%x2qu9b2E#x>Tv5^g5|h0M*~miFv!z61mi4ic9S!A!puEpZ=?nL>lGl62z{^JL z{!;H&EBU-Z(p`RQin`rmCHEOD-DMk$HFo~8?QErVazn4lem>oF3mZI3i!^BT(!VtN z5Dx>_+y5R9lfPxUF{&c9&zAE-N%M^EFArnkC497@z!#co^4?79=X zVCv*kR8VmCDPOMsNuhHA^_6e2FBI%`E)?&Uw*q_Cy@W3oJV(Y5`3!%h;Fkbj ze5Pe9v>DKlBe-t9M5Or{@Q8iz1-m-IrSW_9+ht!+R)c-vY9p$6^ji!d9{mvmypG;3 zdc^?Z-p@9McX(sFn`+}E!pqQQB1)w7HM*%O8dk+v1)Xs|vkhBm`xSXzsjJ*vuIc`H zhWK+xKwChQtYoo~B;y#kR+L7+$ubt-^rBuYyUhOIN|qYR_Mn`crnHhHP5uDn*J!@F z8Vp}E1gi|msUTS|Bp7eco6%q;=NU8?6x$4Eww2>F+1E%-RrY-_PRx4R+NX`fQ zOjw54-ka&chPvK5aj0sjXuYA`1ls=F4RCnPKlc~Sm!~y<>?Jf$zwJ5=94E-1UH2tT zQ+9oRF|NyC7RT_dD^PRw^AzB|r*mHykZoDhbFqoZJ6nCv;ROkbAibbWtj=(f;7;-B ztqoQra=3uk2W!E&vmAyc3{M=08qw~Dl$^yo%fswSRNPmVVV&h!-6MqWV6(dTN!jzf zfHh$^?Y^7;Ux4$==JF7*yI&V{!GuN5sf($b^-yQ|t^y+=F6VCm7mGFX`+xyef}|LDlhF_fGZ!;qTx ztmbm8mAuv}rTOoi)f zS(nDo(JuZHjBhuB=?b^Df+M`2Rn*>)&?~?f?#FK?^)s07#@iG9g$947^e3|F{(=2+ z-(KvqiK6%kP;}n_`%K~0gtri{Pg0*^M_iA`GxlUZ%lZ+Ip=h#UD|@op28fj5>jY3x ze_U4AnS83^M$K=aiYlr?R=XUTu8pocR1an~ivOZ|XcMO!D!S2dKN7X-+m4T+4mtOZ zTN5+cpnL5-$eIN6y_X(;63+APr6rzJO6>hS7`6JO*wlGqlUoeSkx(H2>^k0PBIk

    }4v4Da@6 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
    #1!Uq;WLF2=CfF5g*Y4cD=YNmN}YbY!E~ zrJrLtx`i{43MJDzd9eT0eU>G!H+qhI6s(SuZ+~!RQLNbG6|0`Fe1`ZJCH`#2%Y(xO zV`O9=WT7YQr1FH#QC=r$Id@9dxSr1wYbiOg#wgAqtwI?+qsO5F?v?{loCZ`BOIdI1 zf80%AJ&vh35y%^<#2dY-dFe^l@Uiox7OK$*b@E`+I&QV=D4l|2E9A8(b^CHv8_~Sv<@nh4Zbt!>k8SU_8!5W@*!J!i>H%NzvF-hCKfubzws-eSfU`cf zy?cf+F*PsV-&JC^p?9w&79ZPQ!#o8+%Ez|XG#_Mg@v-f7NsQLK_*ykDzE;hPueLWN z67SkL*+9*Uc-OXaylY$9yEe5gILSb5i`TjxNbo{{qGIva@wHI7%cjO8P`w4Xa$z0l zkwga(zp{Zkg35(;AjgGuAjgGuAjgGupwA+ZbN|PeSn;MEtiOag@x@xXU=DqM8!AU! zFo%>LMO-k4lpaM~Fo%>L#X26$LQ0P!E|^2Vlf81m98!7|alstYdK5qPC?Ty!5f{uM ztw#|T%pt8u@uROAA+1Ld7tA58M-dmyAmEZ0N>}ty~P|E z;)2;*LiHoUs8;dL90!_s%=_y32o$x7_jLiOR`I?;4UDK&yl>vZR1uCl28sxW0VGETMM69N91v$wiG4dEy5|Di_R=r_RG% zBSR&!Sq&AcQ6fr>A}*LCN{u4!=^`(XuX4d0dFd>06g5iZEpkyVm?Q68jbP=1Ig;ao zIg;aoIr1@URk>h}e6|{CsYZ#sLP*pok=NM6MU4`9gOeGW=_};ywb&-&pEg?W+5qzW zVw5}<-Ou$Y5b;kN?d{@#RsLzC2TBBwjci1q_AdJsXvL*$^hTEplZVo`MAy2801^LZ z(R*A{8-D6rqW1}+T*^jsUCKt+xz?hol}p*^!!ByVGKRR6jjnc$C2P^QL=zs;iA&jN z%F_lfy~?F*)bXrGgmNhxE%b;gOs!R7 zY_zK!!BZ|}qq#0+qq#0+qjjDgs1D^)Hd-%;aw!`<(366o%B5`dAWtEByK*TT?JJ0K zDI3joDI3joDH|OiYFm0!VV(8I2#{0c_HQiIB`V6;^M@HF^% ztsg)qeg$KNT~Qgnw~=c@tn6yQ;#V-%o^lxCS1?vVSosxrJD;TRJto#bbstGH< zg0UVP2FkBste$C=U%^<5UqNQ+Y(fwB*j;y%$5;r36HRDwGyMskuJjlLxYL*5=}C)U z!L;}lOdp1d@ukJDV0tN1`O}XeB#_SWD`@{^FL>sQUqRb6|AD=z_!YF>Vl7jC1?^nF zg0|1(*iwE4ZNJGzRDK2Rp!qm*QGNyOh`9#)7Ufsaj+u7>QGNyOgvoKG{0iFnf+)X& zcG~1fP<{pNVs%VX{0iD7=KWxx{0iFTCcA5s_!YD}m>Ur@(TH32pa{162?J%ckEkFB z6)jYG{R#F&?bt&FR}iFML3`A_0F^eo6p$?swh+1jD<3D%5G>km zvTBXDr3-ki%4{^*?-QM+IU-BLeE*ClOL%&gkW%Fka$$lf*C5nGzk>E?www4Bv>$pA zp~|nI{ct&IMqHTLkEkxXiqwxj1QO*}(B83ffQJfYK_zg7#*n%^2cW z(Eg6fN#$42-noeUr+|gMi=gr=Xz#v}!QxlY{(<4jub}-S^HP2V?Vp6F_!YEU{0egM zjgg29WYx8o15@iS4h|#KYq3mTt3(=OJ>cLblm@=p2{Kgt3fh(C8wkk%63Hjp-OX#E zun@n3cCKGRJJ+wEo$FW7?hQvL5Jvn8+6T&5P<{pNzQRoT6|{5x3fhCrzatyvSI{16 zJ_SVi6|_g0p8`>S1?}mgDC}f5bihw-8;#bgKWpb@- zv)^Nwa5^)e>^l)c zY18o<@a@6co~p@O`M#q0O7wS{Zx8bAj6)S|XZ}xoE7pOpY~>gJfp2FhK`5_8PXH^* z+lPFYlkd4Y!Owpt@9_2DJAm>o`2*jxHD8H-UGp74zL62&d*%Pc_tzW2cPQ(3#UJ=m zX+wD>x<6P^-l3FXA^EP>36gk={X_kJ@iq94A??~f@U1}s$ycHu(tHKkNxt|0PkcXI z1HLD*cWu;Un1keJE}sOx#S@@mJBg5abn#@voH&c%Fm$cc0R;2Wv|ej2!7b?DnND{g zcJ51mVD%4B2&=h-6sx(4Rq?FxryAxwihxf`z^Nu!mMCow_x~kIn?tbFgYKR9nw85o zmHE|XvlwN(jF#}pQp4)Yi7NjcEs_{6Q7V{~h{Gp^m}`w0&tr~Lx`NJrr7PH~g{M_d zeprkD*Sdn~n95vp4+bC4Otijh9#<{TZj4sfd;yum|D;T~o$>mbMUFCICiuD!IDyQ5 z05f;rGYQT{7VgHW1S!0G_<02X!@-ezNYi@c!>5mY9F1DC)RB)cD@+s*z8ySAr4$do z?_L9}6c4`LlORx5@!;FDl8M!k50#jT2j5;vEQ$vl`FIdPO7VarA48d36c0G^!I=Nz z$cHE%^pOuyJm@1Ift({B0e$4-3zQ%*7(ENeW8WvNkAFZH4VQ}OR{jE0T8TH%vPVHW zq7s8_0DTms7jUJg;7N~AWq;xXJ=9x-s*eG#^cJBWD*(&OSg4Mm(p!Xb^cJBUy+tTT zZxQOV8syYlbVWKjbP}%QUR6{W;d%iNMfZ<%dzGR!qvj%Yn*oMB(LQkulgK|I5)Nme zv}R-v+bi+{V0R>przhe?C&`O!1MH35hQz+eAkf3K=n0}8q61!Gwk`xkC%?dKyP!s* zvvFC$@Z1aX=z>1T!$)vV^m@mmiy2*^irEP6(Hoi2vJNJ{)jZo8vbHnnZ4@si?$@J# ze+2m?tiQBl^Hj!1dNkq+dt4 z!TOf@K72FM4zON*2k;|=8?DoDG(Y+%;Stu1$q3(A0=P-GQ_&{~PqZACa8nVAGF54Z zycWx)bVRZ5S79X+9Z@VtM-=;&&18v=D7J@iOmsxC-=z6OM-=;=u+kC5_7biT9Z?Ma z*ML-sjtIWqh}4UYDCQERL3Bhhk01j?M-;>LZ;&;Ljwt38WQ6F5VwU-K9{160&VmpD zb1RUEex9|7Iu zI-*#mc_X+j6CF{kyC5q>M-;0P|ZBjma^&PIN@j;&K|_=%0^q6st4$ zARm3!CZ=^nu@x+&=!jw~2`U{?Y!!>EbVRWh9nl(u;dC$BFm^jADYk4u8Oqj_&=B&H zP<__MK9h~^8Hr^e-n|r&K7z4$O@F}Fx8tD!>cRekYfX3|iPuRmvq7}y1*kUS`;TBM zg0c94^O$P)n@DvKL2R(k0o+%Dk;)I8$l|qFuF%I|ga$)|*J2%c zt;10dp55gC{3Zm42

    OTr`v#&sWTKM$~w|l4k%S%_aEboB4OpByc*a6q8X>osJT) zJ=4BX!%%fP>R^CIjH?&}rI+Az6q7SXaGZ`}mRz_5&#Li!FUwM>PDlMDxy$LOGqZ$R zjhEQ)1d@vyFYyE?aizvfJXM0(NLG%-W;LZ!jhA?KHLFV0c!}o-$3%^nc!7MC8ZYq@ zr^uo>PD3T$A{V8`OT6UQwXBu?9&0}6U-!C=1oAHshIms zDW9LWr;@h05VN`E=lPOk!aM^AIyvw5CI5OCo<6zem)siTOE0haB|jPf8f;Mx1N_Np zfMXWVb|=654C19NUh_-t-IG|Am8Vui(Pe#t%Sz^2NQoPTFt^@itC{7IhK1`#2G zo)4M#{4T(K1nZOMEMwjWorK`?Wq?_{=9g60{48GcOD-o#$h!Y?z&A0En8j;;$+h1A zPFpA9VqJ2h1@0M(*Zh)ON�`yylmD^tTQ6|exPcg7ax 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%0D-T|NGFMEf%B9VH>JM@)wk7oqo6m@ntw^K*UbCKl ziL#2!ONKBpN_Q6-Hcw!W13q;0$-Vlb!o12kZju-go%SsI^zN9Jyzl zo)K9h8y=^LR4f$TAYQ%mWb>Mu&jKn0Y>M|z+ zmvgIIeDDx29;QPmQ`s+&lkVIMDB~yn9hR(3^j>+8yjm0ex!jsDsfORsR;`Qv zRIZ~3@P_{pZGC@}*h;tg+9oR_W9i`)AR8Hgbe|Qi^d#Z!{}zy^cRLVGjD?2#BH`hm zSb<83AUmi24l#Q5*p$`N4*;1Mvpbc3w!&KFH`AIv90i5;#YFEQ2Q|#TC(8mAAc5=# zx(tamttcjdPUQIgW&}BlAz&_fN}#xkFCo_ zN^*f>o(vxDo~8L5GlgE#f>wS3YLpf->~V8aM7|iDP0t{3EZ-M{G@#926e1cxeKEL; z{W$#%vicQW9Mw1)Kdti8dnByc&GagXK$Dkdc$h@0ekE#XVqic8yx29mQoU!w^g_C; z6(Pb#Wb`}ppWkG$Bii1c?FB_B^6N$H^Bk^)yQIu;C&ju%Cg_mb+dv{C68ud}?+G)x z7%1k@KL8)<#KNOno3g!Y=-u*sK&R_P%~qJOKh%1}^+J!bP?n9Vt@1WNgfRe6R}eHf z!m%GnCj;b@18}Y1pjg_*Xy~WG<@t0kh}=Ie&p$G1^eMb^1NEgm&EbdS@!pyE=Dafr>m(Jw%c1GIFF=Tq7N zu+|@)aIUn10f{yY40NWadOxKh9-3#O@8TanN&uSkI*=_5`V@3NTT1brC}|K zAVz5={HZF$FXdXZTI_D#WqHB!!Q1Pqwys%6O9J9F492A*e$caKO_!m_gbVPnY~=GAs7Pm%>xfb64n1%SqTLDLEuvF>K(58WYm`ZbnGSCk zN_JUi!J^!LAceLs$8bV2FaO!!(13cB4ZHEtK*yu&4^TrzP+W&!W{aYe!v>x#ysKxI z=|UIuzT)9N_4C-^iczi`{PNmgPx&d@VD& z#W07`L=&Z%L{hDqZcg6GRmQF~m(nN(G_(Lqxdi4MroeY)+2LJUj?2S_0ip_cA*b1& z!{GHlL^*80+}$crniRtf&NX4~%r@H6y}~R>O%Uxx*9jo6>`CO61u8Hg%dL1*2LAuh zD`>xV85_2L>ca+f?J~9m-{^xWFd5Wio71yb7lDRv5$|+{MNY^{@04nX2g76#=Y(=Bx7XnUGg59E(rpsx3Tmn_uFBCeMP=>v}xO z<8rU`^td+~ky7nppjC_*Vxi}wLXxjhyRD;>tD?#ZGBM&8nREQv0B%80$$*-+H8hpr zRc#lc$;G36Ot$OMZaI5K49z||^N?B$E7W$sNck0iK|3Wud_(-8httoN!tR8VhF@h< z6TObI#Gqo@yv%^!LT_Vh`!ZdxK6b1RCyQ{ZAYRXO6i2OkGKB`pa2_gih$qBmsE6_l z(0pCUUlg-&*5X;$hcAM0E^;ybn`=Z76B#YD&X_R$Kwc(?>|?Fz7@;_k*^$r*@Jpa$ zqIlm^7)A4h<3ZU5Tw3ePA>@|jeA0U#-OxxgOf=eniTNyU2bDT_ERyyN zFR$Z8Y9XSVF~=F-hYH~Rt+zjxY_7!tW=C`1_Y8jT>_A(Q4Qi^DrkE%d6-XTb>FV0j zjV;JWv`S{_cVO8mQGbT5_pRyu4dD~!6&6J@2)+`T>wler{q<7>!bbF0XKH0j^FLxq zpJzLtW8?NTr6o?`H(`4>NfTd7yEG^)4bG%?arukK+k>A5()^i;H3-8%E59OUa-Jg0=I)lJF02A3!Z?<%%A55ucE*^88(_Otsj!!CJ zmGZkHlqA5KOel|m%-J$gLCf(u(q>?({EipZyr|&C`}BLT3ZkesJ0*PZ$3wVazbwp= zsf-+q8NYFT`r)n8L-raJ{7W0D(9{5!uVQmr zhhkbV(|)=N1@R!A7>lnWgwcs(Kg6+49Qz@TUGCY7av)ofvC1q*jkPc$9pZEn8y0KC zkQ6uK0N|fMR#RV-k{U~Mf^?m)W@hORks4y9u@0mLK};fETeaF!k~Q{Z)>y=eXN>P^D=lll}&kDTOoP*MIm4h$Wj%oH;G>Oht$hmI8_j3vlVu@A{+H3%Uj=);6@fhRu51TEHtYnx>ORm#Y*~&O z)thmbd1H-zT6)H`40_*>og8`6E}%90;lR2ARqzdW^kQ~Ga@S@5&9-Cj|q-qW4j>W=t)&W!i|+u<1x z&X!nIL~4hRLASe@kxivmagF<*3*XI^!wBRDld*zqkPKMpMas0nFgIs|Ejt!oSqLU_ zAioRImwJxDps0Kyhi4RsN&a9_$*v5jx1Qk>_quJMW=BEDJD1pMv-PNZl7Ld7YAxu8 z>t@#ER!kOU8@)2{gG&zZ^`TOL6uxFzr;vI^>mRAdQch_cI zMmQ4d%pK-r^MXo5a1nTTSC033?PKCrMB$q4i8+(1ZTF`%i%s$XoP3vs(2EcWTus4= z{3K9$^$)|?613a7fUG%?u!0ZqKPY4JGTrX6syO7a;uAbJ0Q3;Fg& zx*5Joqy;44<3fa-u7%!Ub4X?wBk}VJBNz$-6&4oNjI8M#0{Zo2$y?U=3Ig}AKZ3Fm41*jb76ZaQKSErocR~& z1OK6lN&oX}wK14w?!v;kT{=ZK{Z**9{`a$Td{rwu48Z>!dD83XSE0W8=J5DoWuY5> zf4+E$$P@+xNhnG;5+$_FG+98khnwm}h1_L>_ZB`ZaGvfA3!F`gMmn`x%z%f$^hDlm z$Pf;hdvs3-+7JWWETWSVy0L}_t2EE|%e8DX#X30K5lGtmHGxctlYbS=J;0?QY%A)1 z#(CxC)|M#~W^HmO)3N}?>b5q8gi=T#F$_+VeM7@xbLuEiN))?Pwlr)gx02j~e_|}x z%ZV2WkQ;UggO{T?_Z|gu9ZdZgBids>ilrh{4nJ8Dv}GNMrdiRN6F;4-?lW!@)p7^E z9#`~3-N%y%p6RlK?h$)VhmpW&(HdGR#A+zSO?| zS9-V=;bj2RzqO`#IV{T#c0BZt#Ex+Ka$3}?Ty=??V%wo>fy+v{;S!4Rh*to85D8xM zTgPB|pKJo)pg$U2;4%YgD>|I?=}Hfb!+bH?3!zC1QCJB49L%(Ao>A=;chTjr3k!wy zv~ttnTY#fP!SGvz?j(2wJU2m@a-j+*kS7Kd^hOX9=y4row$s>9*y0k1S0!rF*9lv& z#bdww?(-3Y<8>3etHJev{^Ry2QBrMDP6J&r%F*2l09gHrA@*=!_ww4MKgTj zv8iIL4Qbrqyac{?FUr4{Ul z$4Iuqm4t|#*lb2DZ;u(VONnR7W4MTJ-EWd_d_}qHa)- z3WUVdFd&7vuq^y`O1g$?J2{>avrapqtymK#Z_aU-(4FnWW>!NYC^U;D!f=NeE;WyL z`}3f94v+eE{TaQw`1vE`o50lmkJmiDnuSxkxM)G%XT|-{S1}mSwJ|C`17wSl*dtjn zGJ^3FBGV3)x^W%Puz3qnOBL%l`y3umKKjLD9b=+vtg~b&v=@d_k@?adxs6y4d2d4B z8IlPYDC}y8$b|4_L?(ncKP%O-peS!H=)#>2(5ZE$JodJyzS#Eq9PJ2Cz&CWBwe_VE zAo)tT`R_jWzKRPLb>HOqd68Xjsq66e}?GojFfN-*{T z{WN-dMR4u$o%ii_9~KLDxL=b0UKT@IcDN5Ah@qqXT!nBHOuiHgE3VkjP?pvx;Yk=>>{o4KxEWQn8jqw*mC$7e>Iotagd`ng z6Djn(ROXtr%%k;OIVVFP+r8bXt`i08sIZj=vuo-X<%|+((FT}(d3+<;gOul@35}xk zA5CI^CNxRlYe!CAnNm7S>|S?(5!D(%bPoDe1QS4Yreg@-tlQ0*xo;RtvYl1y5Tg;g zc~z+8zF!i!<|wylz>gH%Ps4mnrQL)bwJO& z>a{IzvC@bWR*Z=i=6;V(1M0;@U2 z==D~CtPXRZZLL4su4e0Bo>!}HnIV3T*)2!~Cc4y0PZUFGuC_lgd-iYfB57KqP`&CK zWN2rQ8)99uzGr_2ISrr-Fcj#G+iWzxo-76|<;LK{um!bE!?R2SDMpKt&|316e8z235>Bb2?MR?Ey3inmtF^HSifA zIx!oJT6K6|E0x3o~~U+@(eY#nA@4jN2ewl=QlC= zHk1tXN&`x8pnREwCIXhI@$4`CssE6z7S0P#wx50v{wcqv9Y7&HIEI=^gxV zH-h+lRr^tF_WTmW0})FRzN7A%*HC|rE7#%2bn3yBg<@xeX*zr>%2k)XSc?qA4$5(; z!k%bEmZc0rYL#IzS~m(c4ntZd0d%~Nf*GYrCGR|>r*aqITBo@p*lq=3E~$eUX$V7~ z{zEGWBrpN#_?Cfbhyx@ zCW2}fkaqC$oTe;{{o(Pr9RJSp+638FD$;ocX!dn=${23>X5k9m#dtKfzL<@&qi`dI z@9bi}vn{fG;h!#SPqgci(}cg^Gp_HxY8PK69*o6UaM)|zRrrg#W9}+@ZDcFX<%TSC z1CgxKPc??YbU*|V`WszPWVa{V?@_KD^!GB`2L2KKV!aq+18l8dzWvl6>J(i(|1%Bt z?*IZAc(w*n+rTvT3%2(4JG-j_6L(}Ze`E3Vjb}J3br&(6|xyCiG7QonA0O{yD zD|#Wyow_LvNY|gjjdx9fQ@l~PDntBE)a){UvLhKjxtOxzlzA3ovRR)9biPf**^i*4 zX(Q?jb~si4c5k|f{kVoE2LL*($5+J!iV7AWSlftVavtT{*jLxJaW8j32Tt&#WG(Z@ z{UfT~3%6l_hKl;4f&zrH4@I@ltV6OZ#pR>!V(u~UFBvt6_$D0i0|JA{U_jG;5-`yY zU}G+66)Cc%4kUt}p%k<=BEUgR9+xNvb8sfue1Xdxso`Q1$df?UA$t3w0OcZJE8aw9 zRfkU*4n-Mez$@AtL$ge+(3nzp`ptZc`&U_a-XZf@Fa@wE_~!;ckKzF#1i2lF4*Xp- zLf7O6i(Crf&X1qy@%}_6&2A!?&en=QVQ5}hr92g6+=7eGGU=S;5am1 z)*>Q`LwGZyfQC22Do;e)#NKo4&tB$c?~B5E5_U%Ju$P_$O`H{x(bt9*k%u*!gd4pz zsIuT&aP2V5C{<=kiXq%XvU$NhPvN9Mk;>_V48I#6N;GH}K~SvScE9?1RP>8cpEclz8%sXVx8`dmojlA=^D8=}m2wu~Bm z9pJC}l44_ChBxy?WT#tckcSo|AOa@h6H>s!3h=xm-KkFh4$z;v+>zGF6dOQ}$l13i z7|l#5t4MIMvMWbqB3x%5be4NFG27{&q8!4M+u>Yi zNn4PR`pRN&=64@TNTmw{OVXV+#w#VbY`5%>*J1f@_s6imu7<6nLMw~YxcM8Ty*ffcZlP*hT@xrhp zR+n^(OC5E_rzIbm9u-ZoR0ITA58&?>A8+$H|>up@9WkF7g(;j#6b zC{2yJQ4E3{*XyMaMuAt(F+_qu!;Aw>BEIf643kn;9r_C$2H!_s~YL^Jx0QRto#4_iN-y8@>d-yJn(w?2+$VVz-Yj*h>Rnc)O_C8@)vLe zJqUz)J3{$jFH^kBf)C%toL5rpa*jT%Y*Z1{n9Yj^jf@1Prx#OofEn+ckV9suk zKkB^3B-F3MSf&~*G}?OY@j4NE^pV7yneBKVLm&GI#}RqVqdg|Zv~4un!e@&42sz}p zA#n(Jwg|^uD5NCDiMW&9taEWtSLdTH6X&?Z9O>H6P_*h*5#{fA6bKp+4419zv?$1Q zwFcj&M!wLY6;Ainfw1X|8t!?vqW|KSWsw%eBkBQD`ocyd&xI$f`{ENh#E2I0 z0!IIf7a$+XAOL1~HVOp4A1U*R5QTZ(5Z)MR1yTH(q>}Nt5AZY9BMdikF!BcwkHSc35<`=n#kRB?8`Aek z>_6;dWTPe|q^?uve|Jr#zR=6uDz5<^i>rTvEX+F8tGCQ6`S3C7A2`k?ms$lZaI7oc zo=(}VO?mc|qyoKieLSqIrGhhZQ8Q-BV0txqyor7unVhDyd$j9-`a;J7AI$(y zbqP`$=hd4l>B`208{rn>H>U+NRjtvzC*fvfDv6y-IBB0TVCf}U>zy^5r~hafP`Z3# zA}{zoDS2X9&7{(C!oIJX)6x`~hp$Myt~{Q-CXehG>ps-2zCjafK2Re%J`{<1F?^>o zF7|ZpNWIvmr&U)NE=#W4%ipAGmP0f1M!yQ2aqNjzl!S%ZnHPnJOCl| zqOA4yxR&+y7iD?3C$z}B%~)kNCYiy2U}64luQ|K$@s_Qr=>QH_S<+$qfeJ>UPs-#w zuDn1&dBIXW{Z0|qQhE~^e?CGDz!ioX`Y~B^{z!j7VW4K9Tv)BwyaTN3Y8ne*@v8O^ zv5HUIhCE0Slj>ei`2jQh2Zm7V%$4)37OlhY=6wY&o^&()O<`BqHl%8In$yje*|WJ# z1fQ(UZq6P<*jVU}G@i-b7$a z&6t$aAu_#sN=A0&j0u(ux+O>{4uD|j$^g@=tF02Xvtho_=gtQ0*R9ge`huB~+tDoQ ztaJT?9DLo#VBO5RNoM0l8~d6xek~*T!1+)PztWM=_c^o=&>)~}76so@Znz9&4qOGu zz;<_8KGV&$KQI9vuyHS+MrckahOFlXfQa7R;(kGz{%`OOH%dn?dstOxin0o2>7_5* zes6=34W~&RWy0a+cMDD>R9NsT%2gLLP`=O#hYwQiFh+JcB_G7A{Tk&4TWv=$pP+Q! zDrNK_IQy{sJqNpj4)tSe{~$c6a1s~g|9Ke{(i}DSx|vT?X>0Yt3T45ixxdYY593xvn9TC%Yxh23WS94^!Zx9SO``f{Elj}&ge}}U2|Qj7(3`FaPbMTAmeeF zQkSOQzbQ0(__VKW63^4Et`$fwe>!E;tWt2iC7{}X2??$FbZtA*8OI$w`okQ2D>n~U z791@30*TxVsk$gM)gke6xR{yBu!@v4Tbd1|%{n)n;+ScUfjp}nQ{fQc3;G3judd21 zNwU2JU^)DBk@wvIc7A{f+#jek8GYguN}q&F&oc)Xe{GX^!tWI~@e7t^J``p6#qa^j z;#>8U%Y;&oIOJM zyQ-IQMTx$;AHmbZzsfV1^x;``0C46B6Y%A0JDhtjCfbE0H0gDVs3BS;VgbOYSf!xcR z)0|Fofw^jFruu@@2Ii$-!y|N{zX6|6a{5~>3u&3h-n2gzgi>^(h==^n0dNe6_-Q$G zpQDvd^#>`$j~%A1prQ|Mo|e(HlHTdxDu&&WS?H{CRuwLU%%JZDAk%hGS>Qb?4Z^<` zBpZBi)|ND~f%=3Rid<;-cLVr_8;babU*#L#&rpkES2~ldJN(A%QjTwD#Io3ES0kL?Ey-P z20;yjk{Ay`fT}rOG0clf++%7wyjfd7$0uSk?;1WbS1=vDd#R)s`^QB-(S%LcQhtin z1Ht-5w0bEg@VY@nfQ^4F;d^xtWGV0u$!Na!B1Z!@US7&C>Zyw`xQ1c#pxk^8o7iYt z$`opcut9ej=nCC>X1HrW`4zlbWUJiBn?I48$9R(&@BH%mQ=#jBw3J23V;3Q6gF`RL zo5P`cAPt#ot!gQTfrbv_T5LUmsTf;p1}Z<&XvBQ%IlF`>^m_;LkP0s0_bJzTruk#>upY4Y0eFsH$(R-fzb0WkiW|^7L|Q0wNKDn)I-9d#wJaOx|-s^DsT< z7BPbqe*E+8!>yHL+>g%YOdSHgj(ymfPuJ9?OH>(QiKbx%ROP z)`#Ctw>jJ$sqgx+@v}xeaQLx%8v2OXhg@K|zRMd3)0^$$84JU9@lIr2?52ZSD|}g- zcCtgu3G&kc9%?Cf3@LGYlX6dKjI=`uRIlFT_MWC^qw{0We2&?|R8%g4rn83 zgwV}au8nUx<~}jjy=$DvxGz;W-C)1z8&F1FE*nC6hz%Bjp7r5hEtmX?&qj0MJCX5UvrRM<(=p0v4M#i+I_5C5@HU;AWTPux z2-@>)2&u->ATW{$M?i_(RVFouK9=CfQ=vooV(}V6vN7<(4&Pt;VZ{ZQi z?$`>(r=*luM2))>ioS_v8fdsj85V!{QRoTc%-!IHKN5G8y0o+iakTFs(~he>Gna8b zG$4!mfEY9LOs6vbGQ_3~VAGUfe0XKp3q#i`sT#T!KONwq1DFm6fYKo%cB7GdhQv!e zrESOhGv%x^Jf#haWMj^CW5(T)X?xX6KStHDxB7U%AYxLT<|6uY9~aG6Zq|q_K;*2l zlxxn+94Pn6QzqJ0o81RR$uqR9vD1>Idcn73s0TsQC_JrAv`?y5JJvbTZ_k3HEM3!# zL__>a!@I1Kc zdrqqO^?2&A=Q%)@AM)w)c6hSD(a6k*s7=Ikj8%C~BpMTLqZ`u}-qC9&#JR=B$^-*EU&?Rod)70qSLTlmhp{MY9y5zaX! zsP9lHF=XM`Q1_1T#og0v_?hNJ{KVl0>oH4rO`G9Ei{@RAy9fu45~^?J2{ej+r_m&g z0Rm~P&^>xBh@lTcU@3Bj*+~6^K%6fUhcSS`syu>CMYt=1;tc+thI8u*xh{blp*`XK zKKRJMpA{S=M=56Mz5Q+secL}3(EFf*(ft}7y@?WuK8@9d9UkoP;Zp$IqX%LLLM;em zA5v|T29~vo`qyW!8^a`uC<>XJmj{ktgZfa1ZCYwtirVJ%BB|O1gVsc+(56>oDu!V9 zcL?JNr+R`-M4RNSgcvzUZ=k|j1A*$V43Lo`pGsC8gn3E3ib<`>NzJGqsK9W-S7*Rp zP-q;l&InD%qd9u!A?0I`6zyN-D_3`@%_zNM1zy3)gaDN1>x6~QyyTO3#y%^H5q=*a zEo_{T8$V#gRu)&Sv`c>r1)|y!wTtb*MAx@H*{RP zPJc5-PiVx3CGr2REbnv7jnBauhhR*MKVHsh#${{XaKDPlREW9 zWnPagasl!~p{wG8g<^BYQF}IBr9+Ja7sJTX+Re#hZl9tW*_oNDqgf$eBZx{vVY+-R z3gU$|Ns)piq`|^%hC>bM;i3Ite~1(#Sp^{_@95(w!G?^6F)NxZUdZ7uWxHIH`z&1t zE;4xhKcff z#XN3;xgO){sgA``j2K%5Bo>lSYjdV8WDj7;yJ_&f`rPL1&A{?F05WTr7v+XNyrLZZp~Nt1v2wO~dmX7~F>F+M&$Err0BZ-U8j177Ey94-Mv zy|nyb`1m#e<0>2|L#T1Mv+?7$(B29Yy^QJVr(AchZ$NdgPBmkP!<{Yw{ei>M0cuGj zEp^cM@{hbKMx=?7-L$`geaO$jGHj|a?al&Qp(X&62cTUSV72QjSR4L_rX8#w4!0R= zrd1&yG{W4LYF> za6~M{#B(smyawGqPJH*^Ve>2{DJ~D}zTOI}xE{uRvp73Tg=q%YFkIf~QtfmU96*m( zc*KxBG|!Xn6zhSr-h%oFT-S2ZrgUl4ah6_r{`$j~Ir}+Ioe=m_=G4h|&7X>(&ZG2m zaAP_e<*S^3M->P59_-VIG(1EcgY*Ux9qam_Xvs2bEq=thJ^^#Os*ab4n8b_O8kzC! zH2KX;lPu#u!#UXH0P5ip?6LZva1KUn5zH2t(&pXOt=o4c^@V4*&+`g?@jS`~&R3s2 z|J@X3IZ<}mHkc_LdBu)7cNffM2r2&bm^gddNjULb1Lh07fL#_+WQOgUQe~Ux17hx) zTby^p_-=b8>b~%-`+Ogb$GBHad00+Y$nFSLV6|%1=TcWaaU(6Z(!LcgvyI-0cEr(u zU_z>#@Jd(^jp9X#la>Tcscp7AI#C`RGbzW`9E$gi1vf2DP~h>|v+0VIBpa0_+`~N7 zXW@H@L56}Dk8-uMkV;Y+I;~!7G@3=pFDg-u*_e|nkT9&$La>n z1}qN+sdBKeq2#_u7}2B!!JvelAfnE?n9CESNKu# z{cq&(w2FcNpuW#>w@AMV-wGH>F@ebmF49=)=|myvW<=6lZf=o?IYR>hR^Mk_nnR1~ zK_F%^UT4iYISS}%gyiC#Vqa;tjbiHk*q<=Hmhxew7r=NiF7e7scDa0W8{y!}%$6GYSei%#fL6r3|Y?C2e z@vggS-4Sv+pf91l$3pdGUQ$Br5zCr3ZQaiY2Q{W;peg~F(?VZp)k-V^r}PN_VZH}9 zro4fHl*kF7F4pVO;NPXuRYh!o{ascOsFv%W@H$^dA1RG!;x1kXYd!P6(hVjuwPsO@ z=Td$gq#kehF$ zf0}JNz!otL>Bfd+>TjaLMu4t@B6hN92#w4}?Gy5WLf{9m(6xp3JG6Uv{~3Q|v&2Go z!*}^TR7L=!xfPD;200q0%7-&)WuL^2Hm7YBB~7A?=AduVxFB8FP7W8s&G26?NO|Oe zWHo6MT_p@HdFJQA3?RQ8;3S(T=LPe-2(RKkTy46$ZjH52)8mk)@$y(>4({7Hz$@n7u7gew$43(v`)GLREBWB7`AN{ zzoPLbnhp$sF{A8R8t&>;^UP}HjFE^jTfj63XYMmmNEVyoV4h;N9@!6m0Nh-{V0^%A zHk!>PA~V5g&$-t!T@-w5=Wh{rO8kft^l7Ec(^Q236%04hXj{}!C$?%A04xPUDBcT- z2Ye{9u8}7E1M_})YBF8e8uFK?@8K?s{sV%UWNEy#AwLTvx7>6+c~`ZIQZtPX@eJ1S z<=)yHip{4*CXC$8n>X_={4ApDO%HNVwnweqNFy8B;DCaOid^;7U-kg_;D-Xk$X{sC zo+P_Zj1M8k9pQccmwX9<*MYla@aDTDr_7uHgnE zy{If1-N=z6#-P5nstkjZ-iLy?s73|mjC>YnK%&GmnFJ`&m)4W9o~*%S`=bFkcu#eQupq_2T+dxh>{ zu95`stZwXVQfbnB-KE*mxslb6;PZ+1x4Pj(bAtFS=k|gvw^7$Dqd3$S%kwyp2 zqf+!t6naT8*^)gTAf<$K`vUiRVuDqSPFq=Z z8Q>#;RR-syK~6Qbqe)al@WI_0K(q6JkwSrldMYr0Ma7$(px?PEO$`0cf(fK+h4LUq zOiBgwNeq%54TuXC(-j7~+hhd2f5T&Gi%}~kMWo^?qZlz^fxS7~$h^!EjR?hQ-cNJ$QwiZ)VU#hDuR(jpIC(Kuql6j7DdQCkf>)(ph4ZmVe)3vzR} zU`lRKoe;;*N|esN0qkusS?Dg1?FBiK_O#sp>j5Ic$Wzq;x%t8X=~CDyHv$8!d?d8d zfV@k*hRY0OPsoA9*m6*mCZ!xQasY6dZ}*dQrHSU|qjqO1%?XGb+_T)M=H_1OhC>@J z>TRf`@Ky!!fiK}ej+d{=pS4)#~7GkSzx+0&l*d4@r zDa3kA3T7V~+=xOG`9^9(dq3s&j-b7VWqZ$RkPm4`TC|R40}XhQ>peF_9j8tfSZQ3n zBegj(!!N4CpKH!e9FATEsz5C9koPU+SmK{AVu#A+r3{$)%SA3P7k2VUcunU;F8HXh z`6CI$Ie8IlRzH>}c3xx^GioF_H3T9{cB|`d8HW;pO}`SQL(+{ln|_onr)x!~WXUr_ zi6wIM<*lLkdIY9FDdPL6Ms7H-b3S-vT>_*$1FY2&baz@Ab14URf=_TMfNC^pHDT%}PhfMZMsc(X088%Q^J@P40d4Vp3{%fiVUn(wrT53oO%(*$4 zDF6#_KmLo|C>}$0d44jLcsP9dFswu+YT7s8F!+{pBrhDcE55s^5W&Rrz3W{TC_Dt8 zkw=3c0cV8bpNQQ3i})w3ST>7g{1ffLV27m|w)rC<7U@?GLx#}e`Nnc25i{Z|h=epF z+n142PlG$tG9avtz^&713BevWWlb4g3sPw+;xW^|Gz zYdZ$|w$nWPpr{lKZ!zl%D#R1ly`Q9rnmJm9~E zBjK<{dbfl?7=RIMIbcb*HBQAq(L9G6-f{EnLE4<(U&_An!T;dVd86Y}+wM!msjT6x_=mcJdqU zWVMeL@ZyiWfc)l$0rmwaFhE=c3FmPB#xYb514K=C6oKiXA{O`Y7{>u{ z%R7|zbR)J;tmGMZ2go=sZv_i`JL-&;&ID}>u=9Al%`3Q6uCASKv-VgTqFt^ATyIVgmYlQ}wy#mB?nFB0`NaY=F;$+WiH5HI1|8h zO;*wmhxYL^N>+5t{$(Kznq(9O+Syh*3s9`WiuwwFoX{2*1g1-Ay5Hrr$cDH838ENp zy{=JRI7?OP;pr)@N?L-qfjFkA+cX`is&hXjsWXW#?Ucw9?fP#&g5fT%^c)`do zfmNva_{|Hg&g`4z6ldeT$E|Q*jCmThIppjm+wExIh+v93NI4gKp!vZt6De`ZvS+#4 zJz3~C$&26FSK71P2g7ByFEec_*V(WEi%f>JPdntFqEG$33?z;b#0sH)R<3e3_i2QP zm;+b3;}Zx}P-661xJ&71#`=`w6IZ&6KY|!U9YJ*#qx?zxs2@S?V=ShV4q4PqieGj1 zrN)c%dun$M3mU?Ax_*MAewyTfZxjh}5rF}5z_j&KMYR<)Y7wjcM>l9n44yu$h97>4 z(=_mDxcWwC<)vfVS?NQB93k#e`ol&I|E=N?^rBhZDV{b2#X>V)%y>Zz3ZkFiScl3* z;5@K>@gI>i0HZGq=xuVbxK=uH#2pmOxH?Fs(NA`S=0W^{RrK*AGNlD|uH>X2Q~9Gc zK{9ni?&QC0pP0W)>|Q6cBH}*`viB+RwlRFY_%D0`Yx7_~gufu-&gr!fuMuvVMnQ*n zBaPDt8xr}HzGtLxn^|F5jXEF$iH-L?-1z*=!grDM2L~bo3pe3m)OxaKTXpd)Z^=sW zEFw3bgn0dIiy2mYX|X%|<+sE|eFvTl`P1%^Cn#X_9fX9Sy-_C>lY)CJ)D;pJ2k~bE zLO{QRra4~@iVCwxO8!7B@0JgVBqSoj0OszN8}oLF)q}sciB@sGB-s3r-}kqK`MtT6Gk4+ToavPlanTce zb06RQ1mE1pH$1^NAK>>t;F}K^<8L;NfSgdyk&($b7yqct@F^7M|Ek7Lo0&X4`TE%@ z=!Ai&=oFmR6je8N*vZuiT{ONuO7uVsbh#sr{z2@}NE1=KcmvS?o)WU!0zjmQw*K=g z!=7H!H5$LK&0u(JJ4QLC^`(Vo*@^3M0RNp;?aEoMV%=dSP~m>_M4l`pQH()AW^# z$)qD9=YX2qmR+6qUuYpMv(b0gU)^uJ0p%IIrm17SVjk|1V-93iV{G|7_$(=JElW-~ zDV%-s%C-0~hW-a3{9rZbnsp>}QsBg&S5rRkRy4b><{G3PGnpXxJ^xCHxBrR8&nD5a zhTd;ZKuuKQHE8kio7LS(DLX?J|AOPHU|NFAawMdsA`WFbf?`%hmQzuJU%+oTH&zP|?175$xyJ!#ZU4%F>*Za5i=#(jz4Iq^31f z-u@RH%5kM!f>tD=u?v3+s@}`)ag|AR-;(LhWk~Aks!lJRx)bCdwJgyjFd6>tbdnmoSrCv9a9T11lvHW{@0!+QUM{?%(d zrWuqF5sv-%U(7Y`H0nPdGEx=H9?mRV(`PGb4#|rrl~|n1iyP%7ac`(v=XDr-@D>8* zzX{qV&&)yu&md8MY%*LMok-cADVsy4E6$eNnPSg!4y^K^V($L>_r~I1pLAq zifN6x^!~YGIYvS#foJGF%I0{>Fhrie$H{%&!?U{1DkUtc4KT5VhD(*SHBR|2 z$UgvC{e(nnU2)KuNmNzPKYxl>MAI7nWokUJq%*7E^vf{rFr0Z1Pk8-r8c+Bdl9_vU z-_H?!%bx49ESZsl6SW$I(AiIP08s;GREADLbjt0Niab#T?!ZC(uCX(*DHZGuf_id7 znVd-PHtrCC!JWua+P*G%Kge`ahp(mQcp(((Lt@vDdcUP_g^`Q2sh2O(rjb7`?;l0hnv5#Cui{oyE34*hUKhrMkX z{cu>-J?d*mI0iC9IphR^7)R(gRJ!5EqXrFqq(Go4Hbg-@iZH8gd;{0{iyg2s`@6P;CHMKAG26($7K=9h1_)D z2~@^$%nPAF$$()%R^ewbj&`b$)(y8v7;X{bN+zPJrti=n4&?joA8s#y-PX}q28Te> zNsFi%Lc~SzMHKv57()4{=kc6X(nEEvW)5ZVmJ_pgi?C6Sv8B<5U|aDwf$T5|h)Y}# zD8~PQI8xsakIV74H2=ph{uzQO;(wrvzjhqek;aU*Wu_r}Wg@-$QH?3tnCN^2S0}O? z8ykVHIy9bGMPX^XfGyiZO0Ur;3OePD_lqW~G$bcIFGhBgqiR&|bEwLU*4#XW_5@Su zScIYkQG6L&-t1T`YLex8^b;G}f70fbrS4bd0E$RIlV0L1ak@{IJthb7G4i%NRK^K} zJrI~ohHv5TXXXNDXXuY7=keM?R51V}((M({9CWb}Z{5u#b83CI3_s-wf9HRA!Ye|) znyT6g|0+e>@^p!2i3q z>3_zY_W5w%I6b72;H;Rz#|t^@8wX_5R6FcIbPHi?_=nnx zuKg(-nE2c2-1@&^!)gw3wmyAm)%k=}y4VCyS00&6i_UG}t0u)3xN z3$C%-e@KCfCP}gNif5%hwKwE;T8hLGC~ISFR6`@sS)cowcNffw4tZ)HLIS%{=kvCG z3$As7J-@6~tV*^~#MnzM6vMUKNUp<|SuuLV$kRN^xr$`UL(eyQ7|f*{qKODJ{`evp z+_WG15cioPZj#BRQ1xWuj<%y6$ZHlKw#YFjZ$A~Gq8tYeeG$Yd7Ee!w?tl`b=)s0; zJKS%C#sSYa9`Fp3_3-g&@KN!=`aapXwrOLJXza9!k0^RJv46ofx$Ul-olYlY7C9xS zFlQ$e7l-ZH6lq=Ke5&2spJMyfgmsiTM(yPh{)ODXtT*R4)9ka+5D$WkfW}!Old93! zYM1&Zg4)ZQY?0QKjoB0)Ini8gx_0b=BcXt)XrjDT9~KOvL-C=dAi2Kh%+Aso7Ty*ARv_+=agj?&#I-2?$98lazA?W0aN@llr$G*u)< zj6mi1@W+KW!G5gM7VYwwih!Yr9^5ouW6KvC6Pu6Ps;@|QN==&$Sg=a z772FxOA@eXeV}W;r6f|?G&N#(cUal^br<(I8;^1S<=7G@X~kH0+?W3gwCS@_z0rX+ zRO1e$(7uCl`|E@CmGx&zYt&IL&NfYaNViA>`$8OThu{Bce)7|pJs$oEdb%c>Xq@{q zS)DbES3<(4#3i^)qMCcQb*;Aj}Z?{f*%_V zmE=z!54Aik03dIIMr`hs#!wDQZaHoD$x^HMmZ?vs&&{bjD&M{v+%()sv1K2jlEEUB zGbnuur83T4^}y@>%PcdSTN<3z#5d;%3CR}7=TQW6=-~9 zH%y%#6hMBz(B|yua5{hKgmUi?*A69F8aE!hOpNXmqm#H@4A~k~K&IdXFcE?Qb=K7< z=E_-fmaR>JSC(obU)%?EwqG9H{G6B}&C8c8q`1z_Efj+OH$;MJWfsCD&tN>%yfner z$nXA2(R%!@%|!IrxJ&$Sz4=E!l9M-)+;G8wJ=1=n1x@{bvgyOCj@gc1G^ejTV_WKc#HhOmy`@Y8Q$OKVod3 zF|RT8IwY()r-?*|v_|B`i1gab#vo+rVw18mw;~C)l{$aFw1$iOJa&%sq~YUpYv?)O zKgS^~VcdkE4pgE~I)wVn(y_$e7@-hL>)gd+~O*sM}$$?UR=-z zS96#IMe4SN$k-tmR;pU%FNGO~<$dc10}+^r2E|7$gXk1YwTmh?i$S=`w^AlRsTIjA zy~e)1_R!8q7e;_|*Ld{4kaK>hi~mD3Y-s1wX5{;gJ&EeRNtUu*#c7wJMU43_`3$5v zHgYGU0(l3F;3=r_dohwwU`0wsWn;1{C9gJ3pO|D}8yICEC8FqX()04K?|l(|oZgfY zTSZR2UNc!o+U88!0GMabbq1k;W0(<_ zU77ZkawZ%xtGivtvzJ0B-;M@rYX+BZOSF33m&&3*EV$dkA2^|&i96O%>D*K2P)x-gYbfsXy>n3C zIMW59oqhCMX}P5v8l4+M(f?3nYk%|HP^c#aUso1FKJB}Ec7{-73ywGO4AQ!@u~+Xl zA;86q?dkqyL@t0Ea7|X8_=c&yUyOmpu}fMas1FiG*(}60m!{fL7L!8TF+^7Rl7;9& zcVhP&jlV2=v|@G21E$L-h(Cg&jqetT-L0$J?8UpiL;@!C@i6zT>ux0CNtNHF_b8fv z%l4jrR8K*ei;TEXUl0|Ivrpn$%QUChy555qtn^i`s`%IlWNpiS)7(S^=%6-C5Uuz^ zNC=P}l4JkH6!4c(eSr`%kghR?M0g!uQqfRS{K_;S=FrjT9q}m|xwiYgrpq9V|NLT7 z<6ih21oQt3BXOUd>Yxkeki(i+|9!WxEPqzge|;bYVFb+(Q4yng29F!WJSD9{)IWm) z0HHss001}6Rsn!4Nb=*SB`1-@s%x#9w0xQZFkGgkPoIO(kEPN`!-W3f;xhewCZpdl zq5q#O$`6lWIgRY?XBv3HGU*&IjuD@V%; zJ8tuSwEXNDZlBZE3ej?WX49sgo*v3q{erni_)&%!(H2Nv zHHR$QL{`{lE5UQTRI%a}18V%r+B;hp;G6rXoSgW*fl_|&TTjy%Gz{VWz1sUQzbA+A zpuz04FP#gPjprNRgk}RxEeoF8L9r4_AQ(A!IM~Dke#irE;z9n42W->chdZp6g<^S7 zbe#uLfx0Pp#QEs>i0XMmWwqkMENQ!6TqixD-EMjgDhCg3KLl|N)fk*TJ&!`L?30OK zzaOt)@W^~il;{rYSQV0`h&jCp30P?BJCka$HOVaJ+N+(9qET%UWWLl+Va-C06#K#Ev2IIF{ZLQHn7su9J5;>w|Er6ppS zG{5uCds^~WA~K+N?OG%590f!33@FA3=kaV0pnvkCe$&(myo%;Q1OWRX2BRE{_~Qtg zk?oBT>X3>Y)2D@tNq?@4Q!_^mX} zG3LqXC^ecA{daowT`L-u%#dY&X^#E(a&t+OIOeC8H0F7TFy6I%9o)<4_IpiYq%F6U z@hSlgr+O38?!9S#b@SYE$diNOi-^{BAWc0*)DMbd=g7{JHhZdlHpc=aDE)v;l1A%o z@(~*h1)@HP;wK@~vg!JLocrLPzi;06-V3Vnsx5EYufN!9aX%M-)&qrG%zL2sCzrLP&W|Xwcbd*jIizxD8 zMH8P*;(4-vtNFEWF5ADFXw=PHKqEUP}X(;>V+^vB|7*$4k9^EBw9+DOWURe-p zHJB*A**vs0@EFezX%n1NiHHZF)|efr+zM+48s!F4dRB^6gNUUNW3xa(5S9&t%vW)O zCk? zd%rz9mFzkDmT|D-?#ZT1BZkh}hw43oO232NKtRH|LVQp|ez47n$z1{Jsq%ge zk<>d9sa47;{^^cH^Nib5?fCo#fBr@yHQ+v`y=N-u@em31A>0uwMlG6&_7s#6&ORo5 zeK~)`pX`0&*eyfQs2sog>Sn0d1Haz8Lsn;Bd*d~>aujUIvU(9_HwI>ctize5_qo&1 zzZzeiSSR~Btc-;BKlL=Uwk~w*3t4CGr<}d>i7(cJML5JCOoLOFF4!mDS&OalqOL>J zb~&X@h4wfS9+fSTZKZerJ1Ua-LEPS3H$){v!{Sg-dLAga3qX7ImN1t5ZGqYiCUKZ+ za^XYw%9S$lN!!*mf-h2biWi>#&XG`@jtt!3pT$QQ6uE3d-mhHdpHC5gpsOL+`}%&KO0Rp;xP9`^hC zpX$oRzd1eGZ)~vp4$9?7RNm0B>*aeo7M$FBSAUcGm$n%JQb(JofvVlhY`EY(yufyp5L!;46+=Qd`nZ)XEqCUEf!u_1RNA)c zX{}-$nP0}1I3J+?W@E&kTEckaL8f>2(rw%19#PjjTht|U85jg8n{n?PVIisq5cVU~ zsr|v$OxwoIh<)-P5m_qYGL(Q2t=_$41T*KYvI~C}3XurE19=`uPwAvP&^w(p9rvKA zx<&rc`8)Y^+FJ)6r>`*1{IsbyM6jC0vGd^ir9DIWxa|)f;@#^^5Er(W;eV&N2Q^BM zo6O?t>y+ypEhs-A0GtGiInp8>d-;aG1W@wxWYU%t+23ImkNyCmz<0J_LH$U`PJ-0{TY13gvOPKv)`V8%pb`v5b!Kxx z)U3u0UAAdtuOL)!k07?sd^^QBBgWX$^lyjKHXP1OOKaVLf-ZfTv?Fe__@W2FW7v)k z5;cuG#aqS!(^tmpQ-MWe*v5T*N57!i$#8Wde9%nO6Ar%U{-1%=Cxm^zV| z1ZHd#H3OnPdCRmpTjq#A83wkXkgV)BT|Ta>tcz{AqH7&!Ji`6R1p8JCa+t7jeHBD| zpSTR)zG@s0mk%D1>tzQe^57sLvb+=huFq?qgZ{!larb_*v5O3tCT@W#9uu&uAU57& zKVXsLqHiVzETtBaf|Z4PBF<8AF`~`~A?Kw`W4D2vOe4INOMgvQ6C_MemZOPWI}TI# z*g#Wc*VtDgyT(QTZ{7RKxZ@%13pwe-35RhDOZ3Ko7=uRh?M=^FN^IZ09$m}3@H{{lUpXLh+HtMCGIsG{M0<=A=ffRgex(c527=rFJrCumknfBj zL!^1#+}j~%Smli8P=#n*py?rP9zZ|T{WU*H3kNe}bLU2MH(%H_A2pM5VFfme+^n+o z3%bZa+%v!2`Q?t1o@qZTzjS+pyqf@Yzxd)%c4dF#9v;z=@WwKXxlOD_Jzuj^Zbg+~ z`T?QkNj+jxuW)A(61u^zgD5v7g9sJ}%5@-~yAO8Y;3F>q(+>)qZXdHwB$G; zFY_2Hkir1Dq`s3nde$csuc>c$9+|taw5(h}5}nXlotc&jzsc4%l(R^tGyxRs9q$lb zkdYgU?WN2A15X+d16zwHQ=h`~lEFBiuB8rQd&dmg_lxrOt;MCNz(qO)TH-pLPr>~X zM$~-y+=b9CaP{x`>bu4a=EERQjs>}@OE^98mwdpNe00&UOG@=iM$;%;>gbtoUNm^4 zSd)aFfM&U}OWf$01Q$G}MfF7bG}4IXuu7qzx|>T;?=XnMoSow4D^;yyPtFo|A+%+3(_#u~cdKRU`g?N&yJw1!&jHwJRTyotH(e@Ob z2V{Fn$su~sD0o^1WLeSHcaeN>hKKI}2YW{p4&m~0P9ca24@SNBpf4yc%`yG)= zApij&*nu))Q2YkZ{KH?@$-(V~j&i5C+#xCkN^DJHBGJ_@IJve#DHz8@_RAy+`B1O* z82v{TJ$?$h>OqVzSkYYta)MJ>s8ZE4sDy`AZ9bRew-1_Wg`3Ycm-^FYybr(0h2|H* z*T>AaNp~IsvZ*LZeo&-jvHE5fH+CW<7DduJt3T)$Um`sQ9S1M$#wotLiR6PfSbDm< ziFo7*X<9;IP4_er+Px}qw$T4cw$Cg)WIINCGcFlCFj;PUTr_pd$WZ7Z5WNgEeI?ghAxT2m|=PgtzTwizRSe9q9Z;&3VX1uVAgC3((`78)7l z=`*BbyG*+i*k)h(_#xbWVW)%!gf5RD!_I*CaR`NKelpSw8NmerX=KEUS@gyb(-u5^ILn9Jo=n8D(boRj7E%vox) z=VsVeX4=c_q74lERgyEev;?OY%cN5BCt#+ijmZ<8nG8iRizixEWNWR%L?4v<)ik}R zOydl+?ZXUx;E2%~dQm*59f8{)QUv!Xv;pqKq<+)l;ql9tSZwz4mNa`Q6di}y4a znc&((8+DDUOWI4eqMKEUoY6yYndp&_47b^=Aulr5&2Mhox9<@3;U0nniAp`)vhmRl zAVwxQa}e$(tmQI_=7|=-n}VXh@OonoC7`WG)}qdtoE~^&O{;gl&1rSYOn&fN&L^_T z5es~Hsfl!pN3{2ZDSM>qUGj@2a_BsKKCDYK8)l;DZ{nL*FMBv;|FVM3b8?;AJ09Nu6!X`GUoLr zdPAY7z|9XP-iN-Vy>gQX^c@qwLLaFli}=CKa?GBxvYZz?#1rQSThT!h>~ZLwcf`LL zhsGUh>xT;%5>}E3m_u@QakjOI3Yfx^t6LgZQSBYX03?XEkKFI2g>+rXv&SUIyJ3FCT4zv1hwZz^`h=Gw9qNz?h5QFC*$F$WDdyt zx6$OuxgD1K{|m9AxIx&2|B)y?-N;^fmhsY2cL}*pP`|)UZKbr3sfwy93VX(>A5C$2SYKnjZA3KIH zYG`F}F|cMhkWAZ_KyBrL0BJP75z0TkbqD3a}9#mP~)Kv zCfLVYV60nUy6R%_p%GjIjgzPdCH27=7yPlPmILBym~KGhk+MX0KMzFNu|FWKHtfe~L15g$E1lDO^HL&Ra<97%x@rM9ID z5bOPu?De}3?LWS(`Ol$Hpz#nC$Vc0#4DX@Chj7E2hzY?Re>1`CDAQoeg)1P4Zl5T| zWwyce`32-o!QCOdON$$+*z`E*dFQCS+v(ohVF`#!yOHQ8&JT)Ga|nI7MRib2%(6uy zs3J`<7Z-Ur;wSs&8Jn&t_nKymUm>0nz2Yxue;25Embn!BtN?(p^+ zn$4DTf>inStu^Gux$hjpx!z^@Kro17H2(oZyG7xMiuRqWOJ|nEhLH~h5qU;k&63x#RTbHZVt#i- zs(>h1O-6RZv=W+c>7mIywwfUOd;*!;zsK)iOrVK9$~DzrN^o?AZh9Uz+xt<(7mk!) z--T-XLlG1;fi>m)p&jD=b;>w1fKt!SfPI5gOdYb9*u_`6OM0v&vT4(650Q;|RQtPZ z)c7OKTbaYim1neyQ$!cOXM{v{z|dJDHm^lf=?_PED0MKiZ#P;yDYf4LV<3(u6NQIY z)1e(mpeVZUt|nmqlIQ#|&;L+D7?N=qX3WvD`-FJbG>CMLuy`63yla%#p*Mj6^An`s zLH4hgS=)BMEAKhNyW9R0ftgYUQp`_^d^4;I5o+VvnA+&Q^}#s-TW*Rhhd2(4B0c`? zX45ev6%u@dtD_r5=Q_l}pauZMY!PZ-DW6+mx^leuBiiU3oVQ0jHv(3HFtyxMMysFP zqRGU8ZPNMyQsE(X=E+SDi0zQu{%A0t1O}rjfw)o*Hm@ib7xf|{rk%k1aEpUps2XGn zNrEr1iLbRK91>5BfJuEU^ryw*R+#+YZJ>!axGr0Io)-jdpk-!sv`1eq;F@ zYaYO27mFQ#rJ{%xLpHAy+HX5jXffRTa^b4IREA)T`0o1l5FEBlvqud;VLUn?GU3V> zpgrGED=phUh-g!^p|rx|nBa4U&Ns=zGJ@teGRrbQ1sSQEI{s)+jaW*ABfRafnjij} z5?0dR7U*Z4;=kY|J)zAjTafjmD*Q8GL~^N>O8MiI0ZMClVn3&eVX`6dD9n-__WS#D zR@_g8Lr0tD8j}{3FV94`_xZA?WF1oOE0&38gWZg~yyGJhPVfY}6ZXkTM@nt|hu{Ib z-uN_{J=s%tgYb-@pJ9%a3;8-^+NL9N33zu5ounQ>BdRTw^7=MJ^LOba;IUT>{g`eg zUWr}NOfqh(|-+;zf9S9t#Ca#LFX5N_+o$$I<&Nq50m{lh&@4*oZ-KJ$btK1c>0j zJepmS@UoFjzlXm&f_(!|w;07zSWZ*!V-)I!xzDq_^xiZG6Px5h)8vVf08HgUIjI9{ zN`6eH)7<3Md!YxS%hVdw@Qln9tT!SHLv-+vPP z&OQnDGeY|F%eOMP>npY9^8bSgRB>7bZLQ&uwzcC_a+J}6rYLO(C(XC)3`O8|!Y7#7 zOeXBttw14@q3{3puF4%3-&ILRMCnhTn28*(S>ycSAR;0${vc`}^@E6yr{%%LBL1{X zn`>0%ZcWQp(PsD%x5dLXMcfy!>Cyi0)c5~7Ff$lW5r{oXCYPTC$um*JmB~wg$Tg;N zN{AMkD7wK!p)#h8H9s$PB7OmlDxBzYC1wm!(x>D7(o_)nED}NIavz9Hew)>CfNo+Z zwd|p{s;i{_(m-DkKQ(=OwkqXs__+oC82uzZT~285lk~w=k#U5ABI7VN9znHXVs;MPGTe+27nez6u(?VvT?s11oa;yi zy)mGtwNZ>2B0oIj8uXJz?n?kED(IK}3M32`${fxE-z|085b@sm#3rEco$D!(=%}IZ zI(*o^9)1ZzLX>Q0k6?mKO6W+t7v^i{W=K2ms5KzyULG%UqFIL}4YrFF15hvq+o)X$ zcPlx8z<^PZ+(yAnYnprsEZBqi?4cAI&&iUMQt_XtPmXroR~rw)s?rJlaJmtKCPHhx zgJJ@GK#NY(1;F^r82gX^Bb4}m751}9s>;10a z5+qQT5jfg8^1nX^gvmF(reQKX`czluWB-pDN{qnxm1sH-7;-TVxXJLHe}q12wCCgW z@&DJlU(K~z-tn2G>nJ7?ZT)AN&ZCG4WQjve?bGliVnu*I*4RWt@fdm5Zl>jN^gN9_ zj8OqqK9@^u0`kp;*X&x)}us{ zLq4}jzWZLYoU|!&PrtYXvCPo$K}Qc79Il$f}iiiPdss!oJX6qSQK zn=T)V&di*~KOPG*87>2Z`9$I2Q&NFqHLU-sC*`xMDQ9z^E?%5fE>5iW#Ak3wouTNg z%8Aefnpk1&m?#b6rJuC8w@Pw}_8B^@ln*Y9o;~fo=C;Boc3S}tqmmC8D3D!=AcXb0 zPOKrk&J?tdK~-F*HWYL>$L{$YPNbT~r+cpSGlvWpnyor>lwE>G&#p?3H|Te3jeLeP z7F-{fAOt|feF8XXENyMDB18)Z#manZ&!Zn*r>)*wQ@^63CjMJh92QIRHPBFanx6au zF^nE{T5VZ(t-6YS(p_9w6YUW>zc5g=qU^Aw9ZU)X<1%%TDn*N{^*zLc8~l|)qG^mW zS_>sy!N5^;M_XA;#>7?!ct*H~DAM%bYFziE0a?GEyTn99(Lzm1g4~80s3SX(_yVIR z*AWpR2!JFaew+S~8e_a>7S+>%K^79^ODN-GM1z`Myng}Jvgy6~n-s$`0p?-h??g`U z^_)DCYDCl%1(hHMrJ-+rsO(xF9wwXBx7YpK;pcJ+vwILnT>fWY*WL6SG^lNTzkzro*8T*mFr&PU~1!w2!gU9Fo>_j;}cL?kfLmAWztqWWsFA@3`WFMa!2G0 zpugZf&NOE}8fW5?2GG_3%%up56_dNq%HIPsw76aQx(#N#^SebsFLKDUT2s@!U=ssb3nC9RZwejCB?%u95@_ZM zFCz6{>P1XSSZqd|#0Lmay_>=}e{Vo3!--4E@yWqz-ee~m4tOM3W#~|Ihd(%T&ITWYefPvVO=Bz%2HAvuEjr4?cDyl3POMU6QAsdkNV-l z9m6#$^=SRb#7c3|QMm9A+EMtb(I}OlO1W_4tS#GAQpR+`uqE`Tyc}3wN(g^d_bPbT z{JpmkYdLVQRmke(vFtSv)HH0Nhx$^3;m(^7WDDzB0oka!gIUD zOYn${?>_9G?B~2Iv$!CM+NxfVwH~oTjYuUScrmgnmz}6W2C5j#`|rq4()~PBEd|TavU; zmcrBMpqwv`w7Q@d5%cao3JuPtoK60+t{eF*G!A7X{^VRrYJ&Tx9$89Z>L@KPkFJ^i2`n6DvkaeJlkWleClYoC!EX|R}aX^h2j-S zab>%j*sCJKrXdlL=uJmWT!)a7D5rGU#O)>+Q#z?xDqd{s`DuL#DdN{CGRMpjbv9(z zR`FXSJHa_U>d8ZCHqq6>i#RF0rsT2W14PT6-)Z{FIMp>2LE+LT`p#)b+cq5ay|Rf0 zmT%umOG=R3BP%W zH$Z%$mlM_!OxKP{=vu10^_&BT70Fi(9c5ZRnp#Fz-hC$iSH%$k>Mm zD*9%cJSIU#PJ0Hv`|qD|!VvCoW{N9NyB)Rnf`nhZ_CvQw&(dtFhQHBXY;%V8;vBX1 z!+Rq;m-01^gxwvti9b=JlTAey%LYrUxEY(Bh@kASQ(T(NJ>t#O5%{nH)m$z)i1Z3m zaw6_UB4WZ$TZs(;KXOb&JOMY`v*%)kyViPoN-Xwy+e)4D5$&E-md+1Cpx`Bt6;w_x z4m`;qf9 z%3%`+M7M34(<@6562jyl z)**I+V)h$BL(`ryO}m7DxkBzk$SC3wtSVER3Tbae%U)Hi+9Vz}@i9%1ICpKxMP-O0 zzRS@8at*=yF#)!G?`k=Cw9Cy*`&lB*|2_iS7_y{nur-R#TOf2N&bL(4&nWkA>K3n$ zfRVI!FQUbQ;##~G;`K_rI`KLQugmdzDPDsrp+klcc{YFoRb%#|g{3qrrd6#SRU9KP zqdo#!+fCQf?jh_0$uwK(U4m)Wn1sVD=b(J^0rl0K=vSA2{HvzV@D+7W9Ru1tB<^YM z1&2j!LFOApsZLvJZc%na&ibjjH-py7v~P=Bsf7h!|CZ6Tn7%hL0WyM8 zPK{n0|J}Q50V!)}qdlZDBPmkp(7Hj9B|ZIHY#lI-KR=@P2n9paL&TV{Y@4@Lw!JG0 zcZ*kAh}pb1A}HQR>6^a@d}85ET-;mQktbGTWM>}Y7m#ZD1-?B&dVpMEXeg*8hIqmw zu(H$Zz3amAGF}AYkoUnUWk*^#?zWs1r`Ccx@rfjk*hLJ|h^$|x`T64RTau9*p4E6l zk(;ZT+{lk8Fq$qjO-&T7Fgfx2YZApiFG7OG_E>FlZ}H6K8C$*2+D@W$)=lDK#7!ef zo`@NO6qZ8(LB3V>e$$-9yIMs}_id>9nvy2!!#9hXc5#IVCB4D4(+~`o49pf^r#%ou zC_%O+>-%!&A}=~vQ4m>k@Fv7`A1Sujta%5mcITbqHV99ltjAKJNp2+mKe{``+Tpe# z9b7srTP)KNQF2~8R;51RL@} zvThXn)&S*t9*1uP;`Kt}A&`;*ac~VnR#4~%VR$_V zNU9e1CdlxilpCPL)ix?xgc|j~=KbhPxK50P-q&u&M8Y`9kRfGQ`fTDtI8kIf$`BzM%wA}M2*-g}68&4-Wuz1-IWoZcc=d>Xrw(GM{5B}QHbM@jWLi4V>O(w6F>fTacGYAoL-%6wv(++re}6S@ z7ZclC#XAWSkbDlB>hp~d6U0VZNp&%AO`dpdjZFS-Y12I0zFG?eh-~5RB_N`dKrd8& z(CSmD?*R^cXwy^#lR-$@2nW~@*#3Nk_)v4HAPd_Ta^lm|x-?3stsWWA_T4F6bP zD_m5l-!zuu2=5M%8R6B@)Xx5)04a1wM|aMfle;p2P+ArGo0e(mr`+h<8>d#=t%q!f z#3Sd(;FgZk7mhC8+G9(x`5VC{!qB#ZR?&$7xZfMhc2v@M7P&s(L{d1#rmX?$oNA#n z{2SaW-az`O=rWp-1-Zbq5I8WgT`t;a*;#!`>}ZAy?XTxzjXT!K_C40yXh9cI^6Se1 z^4IMdO<|6|;Hf?`y4!X)$PCy}8#3X95BYCFF%(sFuf&1NLCK4Zw0KvoL!hnDbOF$MN?t_Cs9EGBnaHp((6ETd6t4ArYC$*gg3gWN23 zfw)h=>AxIa=YP6MZm53xMjZAyLW4<#X?bWppGD5C>=Aw z3=t;0@!R6qx^M?F)5B0m%m@v~3dC{Iw^7`&7QWLU82C`nk5QUzu%}Eu(?c7I0P!Al z&l5GWw?|xnG)kffKN`_3$^q1|W`@wcSaSw8C)F$l*LD`9i^^W{a}sF9j&o$v-X2VQ zV?7nPzJDZo;(-*EpBOtf`>9N;^lR{;sdns+lgJH z%zCrfe-1=9JT|e9!t~6d6%>5)dOB>s^oME4(G*_#07KJa1K|-XlUbI-p#5@ zp(xWsK{UIuU($ivnlgE7YFb^$wiX#ajvKS(rRD3LrSiUrOv^2B-oL7B-hPcC+Y{&Rf4&iLpomwJazF9UhII;qA<>xox8{fnrcprZI`?M%Fav&$Ngq zZyCgS?rC+Fl!7gF&q3;#J<mGdmg)vxju;*IqX7LwXHBt`Rw#ro4tL*YrkC+C`A$c73B-9VFiBj45!Zln^iG-bC z=VJN|Yyd=_CYI2y(4&i**uurWcodZIQB5Jz<{#y^DkGx4~r7zt=LRHtgfwH1KTP$wA z^s*pMGBmp*rk ztw(6{I9PTfBaoo?q9M4^*3a{Ebc%yW^I)ZijCjV9$R1Y8(3P?sZNnt$ed>U7?iMfN zkk*+IYu=7vWy{t07gB^}h8Jd=O+SZVMI#(WvSMZ@1%OZk`YkA%i24EVuS4nkV=az; zFhC`bek33u+_6@g*M{iC92Xujuom?xO?~3m2qdOSn8a=Cg3jGM(H`WePZnE7ginh1 zjeTPK8i&|y?Clpm$8G(h4&xrZuw9vEAn_tu8{sFx(i^MkUWy?(b|80tBtv}JOjWW_ zHMQBCjtX5_2HM6A%gs(-}P z2dA|(^kmn4sSvarKLH2oq-@T&BjWP*4IyO6t{6JdT3mCoZ5zfChj&KSE$l()?RbU3 zZz06FV~d5(w`vO;*qTZ6ge|xiRd+1?^PT--F8H&(%1+;F^nmIrgvDL!Ww4RHm54-^ zi|F0qtv1sY7pX(UotKRXO24~eaI0zBg;*O)|0>u&0Wjcce3c(LXz)~v`2&<~aPmHE z{Wl!M8``eqJH9IuzavnsSbVc($TSMJVVA4k<8cKIE^DsK@2)__x}YCENtddZXbAY~ zu6L13(opI3Rq5XbD^|H@80hazgDX&tPB<$<9zzq_(YWd=(5;bwnq{ySX5^+U6lk60lWk}7fiR-?f1G}%1w*< z*mdals|K#9Tor0iV^erRmCvsau2w{eXraoW0ltQs`btAZC|Ipu;IC+Mp#XY-zO47v zRk@q>UtF$`g2IgJ4IZCA5Oh^mW3iY;uo^}FYAXV(4D1iBt2ZpMr!S4I*j-m;aMuJ~ z0pA+8p|-;7t29Ihn>7&j$iCmQiS^+$hO>kb)1@6kAuhC5#T#wzsUI*N`2F^?JJJ-1D@C&`;Y53|4 z)%92$k3)}csPNYYbcn%I857Bq3@=a}JhgRhS6!%fh1<`Nq8>(g8>qm16vlaK>YIEB1>v8Y{5~v}@DfXE@Vn_* zZXFk~TMY~ZS0k2+77thtA!O1p#GxrM76;S|VfzxRU7=>60svxctix6X$R&$$JcP+K zxVFjES)0Ju50vpbkxyi=ksy^3nm9dAa{tG zB_9{w4s7f7vuW~l;Iy%#Tfkrdx~{?nfMui49}HF00KRl_h_QrroTj00fc@6>HMqRa z?X3^`DuTZHI(QBn&kE~=$DAU{^x2_VPJ`R!t3s7iROzp)0^O+8 z;X!X}P}ve^5L;alB6v2}_-e6(RlEv1`E)4MCh?(GXMpy8X--knq9g>gCeKcqRvQe} zxh-CIo!jrL#K#JMWwoVw?)B5I$B*8mX}L3#rg;KE9QbLJJj%Ooa5b{GNJsR-bX&#@ z1O1)Je`gtLX(4gM%}{{@QePKEP;%Of-ZSTsr# zJ@0cFq|wtBJgX|S20k(TU?$a!B*4(xfLDh(pIrjH4?Pp~SrdjcViT~VXMx;l2&cH& zRS)F#BLTxuSFdOu0t_@-5*>j~_zZQ3f$zbJU?>VDKK-*Pi-XBGJ)A+Upgdz%+_~k= zuFy~#FeBO%!oJVAo&XrC1C_2)$4NhMbi{pitKyD$&|Qm@UteDnPphui9yyDLtnm9Q zR=cXf!Eh>rhMZhidj8S^1H%Rz;Ue@>w2}!mitE+|=hAd)d==4U;Vk3i12h4kgvMjy zh%859Xt)D13rtst?P^vuA^-+eSre*?B3OQUi8c)^8V{T`6Hlbtz)=`umlSzp`lFp+ zT*N2~Fb0UR638_2K}Vl3(U6|!%FbP!;mSxaT$FEL68r4POfM=Zv=(RJ99H7wGTEzG z0g{LlSm?^gDaMu(FQ+l`U5l;x_|}?7zyak7;&4{hBhuQ-PgOB=t`&Zt7l1WX;haz~ zPE8}mqC;2jst*MlLP44y9QaI(eRcE&z(fQCR9-PK>_H{Ce`Re09$)2d#BWX2ZoeB3 z&&(|-L~;oj4W7@BRnsF5-BjhSTg^ezJllfYMK%o_;0_ogSnbA)ZVtHt629IAqKPrn z?REmml0s)*hATg#Ah#%gQ3iN-jUv9$p9=HSa|#v#kaYE;+?*WOB71Iux{}x#4ofX) z3xk}tLCqY;Of6Vng$t5IAg}_osHwtVMPQ(ecRn!+%s1FEb4(+<^hwc>ghxLHWJ^# zjIlK?C3k^X>CZ06%UD!oPiMr@gfboTK_dB-1G0hW^-D7f?be(OVn;y!3YJ`=P|eHF zEzDh%YX|fo7F1S;=rpT^<5Wjaiv~l?7zjjC4sfuJxe2X?kbzExCgtJD`K}v^7TGci zUD+9h>5J0~(-9k`%?(%yUc-y!XYx|r#L6|A5Fkv|a8_Yx3}w~nYH*XVqsAaEjkom3 zoZOta%~R;09V)_4qEajc5@_;WML9N>D+mD;CkpbZA)bg!Lxla6)%e4V3vX9}GWu$0 zzZe2^pLXb2K;`*>bm;iT7jX|4h+K-zlFUfAA-)b*SF)t3Ca%qdRzB>0P&piC7aoLD zi?Qi!R+Dt40HMK-KH^G@89M_mY`3og`~;FA=r%o*VMA1tf;JZ8;GcbeL%Km zDGqqsyc);U0IsDIG+zS{8gaWAAGax51;Jvq!54&(262s`Yp4X>_6DoL1si>pZo)o3 zqyTeHZb=TNj0X_*F!@m+3@d&^>P2M>TtD!KchhjYhuKbLp{Cb1krY)FOs!kae zT?cYifxQgX)~;qqX%bN!DIlqifTk2Gou1ZI)OkY{UMNMC6?OG>KBCE(uA8|XHY{x@V3It(D^*~X`(nQ}BQW!k`3U4hD90;_~<#aT&Wn|=~ z+liMJx|XC{nWZqLw&qw14bizMVy>2iiDu^J+O&aj!0{xONB|P(GqffsWvl`zKD>Y>!JH#&W-w1Hv2 zNC@_T?!ti^rvf>9sAw<)T!H0%55Co#hKK(O1VtvUywl(5^><-3|Afm zm7MhK3_~53Mo8@<$_qNG;k(}(;-xcjguEIcshLhD1a6W)UDkpI06(Y(UJTu=X$6ia zRYZS7tktP2$|O(QHXO7QhXy(HuXJ2VMS~PuHtk%?d=MX`c>N3F{GjU4S`kQC72-h zro-%+F5z?%HS*MgYtuw9L`6+Qb%g>D<7|M?hG+tSN!Wv^@Stv=z-@d7kv&2ejdU{i z_V7x1FSO;-wSk5T@KD+`O*bbzhnPa*BI_*ylAfanF#6?iO96C_oI-1%6DqvV0|^{R zr_fwYAbJ*DWQ-x%2FgQqkdLp9Y>m)Dp*w)MKq|!4m81kxOE?FY&mU^XO3dYSM*WG!)>M!yXHT9=!wayntbJ3r<@#|siy zl_BmX##;3Y6WsXOvT0Nu+bY_f)09OeK7#ng0LDa<6C#17p4g6|vo$n(LokkN(YDg5 zW|g1tL*F`3`h=L;fhL5sComNKEBtiC2&XmlBFrT!Ml&E=nYx4Vgt-+_ zAr{bieGM?f5S>sWq>lcvxkNDpc635Nom$grg4M)L_H{bbI>*6sX#$GGYFnklkU>BK z6RD7{6)>wd5%y|VX-{H`L+Yk}mqIx0SH**(zbOC#)tgyvW|OT_Ne!49WHy$06&?_G z)W@Xi9qNu@gro_E8Qu>=O~snkE;kWil1IR7YIGqXx;b%z0#<-?2KWH2VOEGfCXQ`t zG!$3Tp$OD#C|U2p{vex>EWZl*p|j{1LL{0fmVzdA>KY8`%d%?27^jI;9k~4+UjBqsy;a0g<^BJPY zsms(9c=)(Q#f~Hxny(Io9by}6$T7wb++zd=-BRc4<`66(ARD>?i}+uFj+Oyt?m9?+ zB*53W8?h@`1`{|!q&nz#JP?`MX3fM|Td^8^Oaq^OjDW>Dd#+=r#jukTkGL2>!3|=r zj`zS_mNc`&=21k*=yXP5k4?uOEACtc zxs_zsc)r0LS))21BYVR*rlPcD#%2Ix4WzYc*c$}_AvOzRr?Wv9(F9gYv;{#k(XoXz z8gdpYTkLS@C3XV9C|nr@i=f7>R%%E9f)uILt`&s0Q5lIW<7}ga%mP|LN+h5{rZ_yL zvL?WmXZT*cbp{r@NVNd);76o8btRT*d1VOark1~FlEJc1T$&~ZRQHh05l%cP!Soph zaZTJmE0;lvu8-qhFBxSqZC{`YgOL_T11cl|#PFsH+A@4YB$8>#skGU(q^qfwR@AMA zxU$L>!uQ|=l{FRkiMO&67APOsA9xlqqo5yRw}+)0uK_M1IGkXU^Tl9+r`0J-5p6Tv z38c7#?A6k^cs};HF$P>t-NZASX-M|E@oySmrDf1V)y}ZeuR%{YjDo7tMGd40!X%-P zgT5gRLW8q1FjR&7nuE+&>95DS0TrdwpDrWP?TS!9)FLEdVS?9+pGcmlg;QLEFN2yE z3TOpGpsKMcXru)v1kt|fkWo^hIkgo!0t5zH3z(Cd2e>A^(QJ}<%Zy76 z#okGF2C7TcN&#AcBqb-ek@h8iF>duY_z(EOMR(dluuV5!xv04;+>HMNvsn@s*Nax0QO0ooMED}*;# zNywTPJ8k5|R4AxWo!~p{0%f}}#OBJ#t9*gO;6WBT1_!o;T)k{=RNjAlv%0EcHIr}+ zlH@&9xyg*%Y&K_f!?jIxEw)U@sr3aa0YnzC;h2GanAzI_807VEA8pXohP$3k4>CYmgdLu(a!B8CtT8$frkZy)#qHs*#ZS1*!HADbD zOstk+V13-UBdAe8f_5Bj^EWX8!Awa=@xfOBa~9JMb;@)sgLzcR&iWS$lnU`;8>y63 zHFt$b8a1J*V_p>Afz?!_BRfq|N0=B?m|6@&2R>AlH68|?5>rUh#DsNfKr}&7O8fx& zM>|0qN~7vf(&>oiIgFdJMg>5x;x~yz@3?)?a7)>B2!u5DFw2I%6m8!$)EK_KN@k;5 zH9`oa#Y`{*92CYy-Wk%YAsv8XX>>(j1cL%YGG(J-;!cJ}Vf9PN`cH$MnIy-ZO??jt zYTnu)NtjI4+2z8^)Xq;F$l@ML0wR=QgO09{yTR9JZ+Vh@8g&jp%y$@!>1I+oX(@5u z8$=z^0Q9YPRN^jRJLNFBfiC15_=z!w42U$4+D|tF$sxdyzm*18!zp6Pwj7dRlmI}3 z@$cFrqGTIvkQp%n75-4I$^iuDxRXt@j{h9b0d=j2#)*^f=*jezk_+ewYxQ z06|Vw@m0geL1av95H=Knf8i?w0z&FME{ZZxpU*Td{|H_HwL5MuJYsC7*r3Y4PsEA( z9!a#pTu2H8fi;jj(+UAEKjX%ti~{x;X67!&<3LTpTik)liU#N+o_d%lqZjAo7J`d; zl{pQEOIhn+RifN<9kyzX(0nvp4KzaP#>4gRF$1{N)B~a@svSip?IbxwLvXZUAvG2r z-cSSk0Y%nm)TW{aMr5~-%4INcKqB!<;<`R9DDc|o{5^I-JsZvsI9EudW*5?#pGa5& z?HcA}#=!>qOW=c7fMh&hEwOCm>iMv_unt1J3RYG}g$P14{gKf@3o`PHGxF7( z$YenFpB1nLaI}FQH#i*bF>K-Ga6m%rJ2l6sPn#aP!e8Hn!%Jc>kS-eSr8tvLmq=)$ z;6`kwF7}els6y{ZUZyp}& zN|BdcyNiC)pRU(d(WY?vNJQ?*0D(LBN)4AZQ;zm@H3l{XT8XwRsw@dp0qqIg@mkHI z8u6mEP}2NWR2!BXn?5~^>8Q@n*nfF;@la9ahMr0T#iL4eU6I+Ld zf{&*y4gr{iBl@IxIht>a;e!3c9_c2+)9$VeFbdM$I>dDd=>uvf z@((PxuOQk~0h|ZD_7U?&m<5Sd3UtbNqm*`iO3Wx=N2E{@JPm3C;_eJ|Y$=|Sy(c(@ z6^4Mn5do=Ql0G;bjtK;gy$TrPOUS_k%PbjqAe8Z`<5(UBV8B3LSK{IdY1x|@0QG{Y zEWo~5vZ87>Hj*WALlpRA9dv;Qu~I|!F@&vY0Th^ma!TQmT2uv|;BSB%9-B?@W#t7F z_J-WWPS>K$B6es;T_1k8rxHMeaTP1)GXm)iF$%B+Qb=ee&^)?yOr9~Pp}xjfxf%-s zu$ivFN9EF*USpo#x=^J)S=glOpfb}rV`Htxy-D+DI>#>Qn^}HptZ8&Lxhqx~8Zsg0 zQcUG42q?G#yQrc|l`WaJ6c}8KJu;9I1KTMqL(Oo|u>S)UgKoy=x)Hg{Iu=VHpgFE6 zI1TkN;K9CyM}XWQ@=A$@;2mpn$e0PqsnV@x6oB)91Qd`Nis1l;2i6pXIKrnMwgMeM zieD3DBZ>=1Figplfdyy*8yxdNs6dbeVX0(xf_oTCfU27Dh;5NLgu(h?MGaqzXXb$) z5GmDZfHob)hV4=cV zX<Q>p4vB^Mr7qWx_(VFy8i7$L54RVEVfgETi0p}HeAh^^aueVdf)+@1T(}+Z zKymi~>=ywKVrM*LYef7W0LXTQc&DH;@M-u0FwtQHd5J<;8Rj)}H<`WlNdg)as=b1& z--z4=oBcu-01md`l7_ceS{qHA=Xht^md5m`VG zM4!VsNxXoRR}DhU_9^}e_bcrL6Y(Gh3-&n7zS3U43_YONQZ`qU^ZmV=FBjFZ8 z3vFj2n7EX8hNBS(A;^{i=TaTqpG23rt`!kp=IClN;8946&C-wC{%LWm%4`!O%o_6Ih><-aipu0dWDgmWILu1X8zRzb z!vH0mA_5BFKsfU;xq>%Zn;m!|DP-=d<_&m4Izgy-tU?L;U0@)hXX0>5XrdG z7Qm~$(eVgNB$CV4G#s!R(x+$=nl!;c87?|0pea{VsDbP{E{Z78x@zl zD1_doA`8_Vc?6yXX3MT3W!-G_xtkE9%Um4$0izfs0cNe*GKLAi^l0S`0h(&@w+wEw z-?g<3oC*fqt6l zDkyO+&OoF*U1!bC$S>fx1(_L$E2l5Bq4?%I5eWkISA}QOw*`wb)AL=~=?-nB0BO+SKbW;F2t@Q z8lInL$9>o>81(pXFMVz9=)pRbVYe7(I;ioYh7Gse!D= z%5)V!3ShV>1CK5M>@pVfFIl-aP@HdJK0?TWym7P1vAc3;VTfacw;9jGdT&TCh=C?A zSKFcD>s?lR9{kR^OO_zhj<3aq{KlRO_}rjD0|EaC%`adOQk*?qSv<#O&%438ly1fg zf0vG24Z9Vo6}eH+Qh>Fqz*$h3kRI-s$nT&KKfH(>1lfk>?_bGpmrE= zTx843wdSaOWBAV2;EUbLRl5P05CRccSk4IH1#|{wR>4%F`!d62RU4yj)HF97<`7Ig zOkh}7NvAv-XkGQ1zyg1;X1u47^75^@z#=E!XJ#xe!g>^JuzmR%d3IhKPC7I^0%F{H zmJ~R17U>3DVv;KA0aq~$(+h#KHz3MNVPsBeM!rIQ1&8!Si*kz)bf!IRri;;%A5!4V zw&&&|fkHcU**Cg!^D=VyGqhfc2t#U|6253s1sU0{9Q=u4ZBapHJ`9BV{kgCL=H`GN zFkY~R8;`U&Tp8)v(aY0mU77i~si;6du8Z=Dh-UEg)ck>AoCk~N=OduBNKKcOQXn^L z`wXx-F_hJ@j`ti3<}*e3!{>^w&eP9pEuwcgvVsLjb!r)bVR`}nUO$^>lB1oo-24JM zTTA#$2gAy-sA$+`fw<9`AS)!2HNi9#qyf3&bbC<@gB2{)mT4p9EmcP?`f*nLbMltX zHWb{TpLETfzbc9jV2M}@XZ*20mT%3oT0y*!NsOp>*W#u5>FTHz02y%jv_O8JEaIKleHYC-cl4k3SKDT4l)OhvEJ=o(=os3@o_8#W2p*4*OQReZ`p>ky+q z>FVv;5S!T}#TeM#E%<*)kxDyl5( zlk$UGs+lvb$KviR5tS?Jj(5bwSiutS;1LTzN=jX7;(; zMz^%$j4Bs~^W|7X@P|^yG3$uAytLVwl%Q7_Mn1ajRhGgzzACpwKnr2q-XENF{Bp1u1I-HzUL zMw->$w(p>;Zbq((nMcE&IICqm6fEa5+^Cp|+-O`la5Yf_8h!pvhSuBIkGXG?%V@jV02?G8^b4(+tw&R~=1dL*bC!}G19D(w zDqfMjlmlUjSZ$rjl=KB}e%JKjVWCZ?X`bgCX+%Abi`96i^?Y$--Q}FuAuhMZMmuN8 znY%~63uO1TiFF(jr_%1{an6w&v6WikB>1k}~Jihae1K!&Ng#1*>VsM;2?I zeS-IQ?{hUR#0LX+qO6O#jtxdxI5*x0a~sY9yclCXG4>$|$wM)UOmHp38ZyycSqjiW ztw)JH3WWjcE*Q1!e5o#WO+hSZBt}-`(YBR@`9_AL>g;?LYp+b!9TYd1`MdY*H3v>! zs$s(;w%B%j&E1F7XxJ{M&&&AA5H(ro>Wz9}w4%X;kQZ)9!=+U1TNZ5DXC#0Hbc)z^ zXcBvX*R>wP7qS93v#6ewKG#|-ea{@uCqf5y*=}oAcWKP3oAJHp@F|Pwgq_?_U*n30 zEK#~bBTbsUnAW!+@ChSTU!r(z;|$MQ7aE1(2-UkZJfn9xNX0T)b261XA}SUYQ}3m$ z;%w@kxsK>ItBK2}vh18K)o4%ghn=W{Rz&&$4cgQc%L*oFas5| zqjLKk3VG$iVgH`nckViD?LcUuDYXyrpf9GTz{u3aI!?r@S^c-}|FfEmdJN6A{ zUogNXygBUHz75ona}LZ=HVR$woGY#{r|eLm=}&SC`&QQ(96h6VF*fKJ34w?iIIqkr z%Y*(Ni@tmwI~3TTarZx*mpsfFHx|*!UVNGy;?mh6gfEId4d?g&K>-IFr46=_fDY~)VQH`!j*X9B(^dx**1V46M3U>V9YsBuiZJ(H;4#&1%>0>nXK)6ITk|_@1dW1;o6rHm82_9qLc@rTRMPx)= zSb7zry3OZlXmV+{;BK7dwa85)fN_YO0mIExKqX4~ZcIW0y#XS`<= zBRHb#_d=}?&Y8#5G4N9C7WT&0&y%R$_l48gkkWuzM318T&*MlgZ9BMj1}Es>^#(y+ zD`F^O+sB;7B<~`&vT^#vH2Nk^#uhnDCU7nHt_%SGEa60? zEebei!i{xoFOjP-c~)^A$$9~FEpo_rUDq)5PTGZK?w7_X=3x97LhZNMVv>22RPeGF z*ju*bKeHHV}+aVw{DI0(bY20T!AKpd8og<~sMsJQ5iP2w(NANrtYl5V?;-#wo_gdRpo)-wD+TSuWgYn=R`Le$yKeChxJV zr$Y!jeXLc8V(i_Sh~vgJRuFzKu6XnbVo2R8Lv3+i7(-6Iylu>t$YVosk}pq!j=QwT z(@>}nckTGC33gfr&ZY^~Uv9tS0s!vai`(o1K%ZrUwXo(_bIxAG zf$|0H4Pm8a3=RSYLWM-bkd~(hHWY9Rn#SssA&t;B&)D0jNBcahZaCw@k%cpGG9m0K z9B>}Rhh-W2ntsQdy$}`)gQM&&w36W11)aoQ1t72?f=z3?NhZ+ReIO6W2F?!Iy@I9{ z7^Nc`fCP^=Y#-Z^qJMrB3nSM<&I0E-caD-n5G{>?DCmX#+%?=(U_yL}``*WKT?I0L z`nu=__E%JpSpGOjJMqDe9^!~`$PsXR@E;=jsRk2uXzzK#T-tF9nQn{PI~sc;R(Z>~WKrcMKGRBzni%)E?S9l=o~RpK`sEu(lyvccc>zf0h)}Iah5jrzk3~cE=YJ?%W4$7`pRe{Da%C$~+b|;Lc)njl6(fB0i2&jT+}!1eV#Ymd0X? zI$c=Ti9-$<+UIyj%fULW@qXt$@A0&>XHiS5sa5A|>wk>~HaP~C4oO}Eb#wKcA%yFr;Nj1bS z0Pf*QAqY>WHYL+j$R8C^5xdj+ic-*__fAoeqr@V|SeGmD zK9sH+Z5TT*vVbKg$%A{+Ahswvc!wFHlyRWz^ePsz4X%uqH_qU|UgGJr_2t2N#Lr?5 zpi_(795v&>xi^r<^{qh2Gze$WN{#DMZRzZt){(g`)?0`KuK;SZe?ae+yd zyFlfZ!Ad;w2E#s#eIH9ZFOPlqRhWBNtWPX2!TA-MEGo7BU|PVtB}@e1xQR(#M(PMX zn2b?7W4|n}t^B4PW0C*|>pT<)RyQe)g&8shyYaXt)~p?0oIGBb@kNO?2o_=|86t^& zFvY%6jXpC#EGX88}n>TriBp?8k9P!{9Eb5C>1=Dx-h;gvD{BQ{Q)2tFg0=wB=+-8teoq*_!8TyWZ`8zFZk-JD1? z^f`n0#hb%0?QL#alsSSpIT!89X6W}zXTe^Sgf2_`ssYSV3lmHo!+}Z*1_ZBQ@|z!q zctN7$4s#O*?$Q9Cp2y`!n5N`3sMHXqxb&Q7J#hUaMVCm550gjdG;te~D2^8y*NcPBCH!YHVuZ!`2Mr+Q=J}h1`lC6ZXb}P7F}k zxHx7lbejtl=jy-VX>O%Xb6i`j5{v(}7H(oQJB%qog|r61-bmC1Rj}?-3M?bIs-8N7 zRsI4A8GOTFXM|HC0vl1?amEqcrA|Pekrsx9hjfA+ZI%42!XX$i%iASN*R8RgrhQBF_-&9JR zY>cY7;`v<5NI*_m;J4Q~bC8#LM*RoP)#=!AkWmPOYnOMk1MD(x^o0HorEYl*3nF@W zW&@$_yeF1x$LdK;5~?^${M~`ycm)B}3gQLcpghM} znF*CE$g>@g33iynn#1VdLnjwJIc&ud;u%=%GEjc-&|IJeLRV6b!oUQ{E1>afCwEN=?IxdtqLL3NxY z!%fT>l}j-yFoH;F2yhM`Mma7#grNh^2WAQM6H}{MDL5eauG4FVCJ|7gEQL;h;~hl?qjvvf9Yl=JDVwG zEFHRKB*g4AQ_CWD4Dx9J23%Ogz2XX$H%|^HU6kd~b30vQwOhnJ{ovpcb0wK@STQ}8 zn=4>`9E)Rd@CmXd1ZdTF+)i%%d3Xsn9WXL}hDSg&m+OzJcz~STY4%NQ7%Xw}VgjID zGh#MCOS@d&O&se!e#Y7DRX^*8xdCJ%(+S)gLt4NbFn2dKRO^w~VbyZO!WuzAtbS`J zIp2^5z9JWpIXpKrVavsa(oje&1VhXwu$am76Xhu5$XYAtD`XMy^+9Gu7~*Jwq-6a< zV8?(xAX3jy%wkO!xF~PbYBk|nE3Cg>sjbJ_+pxj~VxGm7kKj_v;uw~wPNKI*!x%Q*4PB2I9I4p84 z!+{5-o3n(O@K@!%avaw@Uh% zCxMC66m6U6Ub`^BWo?j?a9Vj>$0!-Ex zCUkz#8^{|q0!6!_jZOiE`o}9S@P$JBu0RxXCB}JMULOxjGhL#=%1^+*gIx{ZDlmg< z0M8;$Y8JTCp9``(rMSI=vF5ofZ1uo`=ecBI!-|fb!XrQyOoIiMCgr12pnQmKK-X?? zl9>ucEgu)OLaFe^(ccaUDU6rxd7V=m=a;bef#6)<0t>p+VFT5NZUoeW-?4oQpAjD_ zf;JASV55knh6aqA%#0Om|4REk8bAMueim$dqfy;yWiK8@?=gHdUm)Uqg)dNccN~u( znW+{&UwLlnFtSs3~La7gs38=Pf$DJ>|rPcAB%DvQZx8*olXcy0w;?PTI6!4JQrFVdFrJ3Jsoh| zupi_On;hVH-ap2(wAeKBZE^auqo@rr!=OSicwf0^$ajniW(T%5mga^4&%l{M&j7Ax zJ9Zp~8sC_hz|EIuhYv63hxl}rXKaHTDLHJC;&ji1(YO$gejNrKg;@6ZBLkQwdv_fi z?~lzmUTjO6Fk%eA2V0beDD{gwG7BylBxbUpp1Ae9^xLMZ*r* z+O>+52;5e16N+dM8yF7mH@8K@9J1u2&a4LIu!M2q^4f+K+?9Wvh7WJ@E|>x93<(e3 z#&T|`(DpP>x-~>O&SlD^Z!!2}fh@06Q*7_zDLZE_`<=sn8n^DcFUZ*&6Uh9R*viC~ z1P2QX8i&m$zu`xAVKE4nG*Nw=mIjR6fzro!C4w1o9q7I}91kKvNf|#>i{Ueq6eH!6 z7Z3A5I3g4hH0&%Zu`b$uo%qdL#F}A;JE@bgB|J`q82w!=9D;%jhOf2bc9oz-CEC#n zMz=5Fs4RLN^U72bZ^arWYqQ&?g6A5I;pjfMd-usg$he4&S*I=Cx*a@>_iQ1i ztJ9qdPMQ?HkR&D5D@@T4J=rPG2cbh#;V z+ENhx^H(mGxwLJZvE4iyZZN7AvOIUW+(>6g>J4?mMe;su*Gp6)%;h2748dMdOQ?w0 zcyNaxmBfX`Ftxc|YU)a*oCGs7(uSR|%eN3F5?Hz1FruMDHrt_Ti4S{-Rk{7n zuu{V-dL7a~gtE=gtnF|g6)Uc5Rarx$NJhjIrlN7SRkt3xs5QnV6En%CkBJ^W005Ug z;|jo~fh>}ivb;rv`c6a@vqmo1lCQ;*Y~m-&3v*oHwj7WI9p`$4qL~^pbzTKWP`u;k z%M>gDG6b-*pGsn-UC}0Vb{_3OjVI1 z4W7S;9=wDkM#S!U!TivVh`peE=9ZGPkQKpBFXO9hQyOelr1_43m*Ij7O%u1-Ega)M z<%uOrfHhXq#ABLhdBG$)K@H1L)N-5+W_DFfL9>rEpv~`>&)6Fscq|1skJB{vYmMx_ zHZC4m+<2jDyu)exby`AD-lDKQ>=z;id)RR5WBZ#rE~~enoqxH~G7+Ihe2$a1=YwR- zMA?sW79ULck0lISNc35S9|)%zFvQU+>Hv}uzVLPXMKe%f?5;-M#w64b%K)F^dDzH^ z53(zmykcnINn=fxfp-&LbzOHN%<}?|RANYJ0HmW0#7YIsX=%d(y(BMFw z#1$A+4RwhRt|zhqu@TKfp&{Cu1w!DElqI^@_vKQbS~PbA!y9m|y)ghSRjkywMcQ3p zQIGc)p&2XYnCs94;_C^jj*^^?|};+m1V)0$!@MUillp>SyJn>XS-}Jmk8$qF@zSB<%l8Q z3GCV#dFUqgs-QyAAU(6+*RzvYmaY9%D6c5o(rMd-jYAJpJHIdjQt%H#Nl&ni%eYw+R}W zy~*h1liZfGBRDj|kz$Y7QqhVlc1j@yRh3{~-Iy?L^+;thtX0$-LOB z^nG~zj8{ky1j)$*83F<6JEn^ZOTJtH3%iO8{a^5SE!&(xqsk2^xcH!-Sthm1(v{fS){Y$Q-=g$EY;1hBw;Y_{Xa zPMej1IkIA}=W?{?gc!To7Z;1ORl%0V$+JxX-~>L3jVylIL(Zrq8xgIDyS zci4hn!f?~E?mlyJ3B)gm*62=%JmDt1q$rxg%xh4kV{S`FI?7YO}S=! zwv>?y5fT7mBvfgn+KB>VPF%%m_)u8*z5du{hadASk5kD^uwLLI(NqVH0q`ty6mS+r zf3YAya-{7hWiLBxl%!O63xSpb-fx3EsqbV#K<`r2={483YX3 z3O9S=FH~#3apJPV{7Bpt#~TKiCKy3`F~f7vbqGa|Rj*MA{LK03G#TA7Gv19ylKrw3Sv%4~Rk^uhQdVBiVt2E& z$?mG;v=^ogK2XGjQU7n;e2L9VYS7r7Or69C_<1bYDR|t$97n08rhjJ4bW_b~Nf!?- z4PPJWU(=cqN4Lxegbi@u>0Uz4ENY`jAisJdoaGJxs|zo%_whmz3AwLqe8IyNZ;SM^ z=2O+aFW0HKYRv*2K~f8frW|HwdZ{A*1gjQQe)DOXqD~tsHC?zm8HQ)O)alp3XwO01 zZMg4tyA|bRgnz?hh8gJ&^ug*y+m6SKTD=Ilz_#i8@mcG6%tl zv1T#*SX4Q>5XDgU7*2K(1Am@j#wo}X4FjgOqw*j%^ z3WI6x_mY`BW?oPevEq93A2)JmcAvt;M#HN)obwPwF zc4l@T;^hN(P-X==){fgtBE-)MiPH1{kPOQw5i$rdi;I=5=D}GUYF)GaH!8kH;n;g| z@kb}BrGh}QKD!6q;t*gApwHOiWc#KG>(GMv5h?F5l?J!t<>HwkL?D#8yTdV@2D-CJ zO2mR}>@O8{3p+(CJPLzWa`$5olNdr@;Lx4Km607@sP~4e4IKdFdfuHV#+J!^t zsDzKuV*#;O!=1-NeWYuizXLP78XAH>zR_8R%H`j|Yw?pT;%)||((ef;6AoTdjG1N; z>WI575bH2&%h5=L;^yAL~T)zHr%6t*$kYc)Az-Z1@S z7j%%26z<@{qE@Wji+DZ=JC_ztm77cV|CxaJ>DpHNOHrcvHQk~f)H5tLK%Uao+2xqYUrSdmfhq3PwwoXwq!gF!! zgWdQXA*%UDGoLL&Q9@Z%B;R$ozSE|?wg4Zi-~SFSfm6Dyl`9Z%UgnD_aK)45IzOLU zxM||IJ$KVNJPc985}fn%rsq@G_>cWSoK(oa#Vd-j!Cj`q9agy5(}2nUS!^G4sx!3; zN|q^TWqr0C7HGalXoa$8kAL= zUWFADgkd)!>Wg33CKuMvxG%Rz70XEy7C%9+^lfe1R>RCJe)C-iF2}iNkP%>KOeZuB zQ>3Q5`NU|+o!}EnSln$-swf|`4Eiia`2tQ^m1INZSUf9Q+FDB~SJa|wQaVXCblhdE z^ZLdgqG~N1tL#f~1mz$MG;{308Evl2G{wLaU=%;x-Q^7Db~7v~Z<=|z$7g+&nBQ28r`WT9Pz&oLJ#{n6Kj#dZ|1Nr02_c4Qa6e1Bsxbw{knT`5|-of?sH zhL^9GiM&m}rl@8T{4iKm$&p2oJj9PAae=1o9YY5!TNH}$H{f8Zy+b6)6Ey3}rcPlB znm(!FRzi`LL~{1zB~E4g7;$=|DF>jJc77sv*!A=|KfMSPmX!qH_)%lRI%p2Hq5xDf zhC3FcixUiRtQJ{#SysUxZuS-#F#2xZG{PIQ*_1YJ(Ex#SokPU`(#dzwf*}JX&V~*{ont|&>S6I<*P_^D zm4}F4aC5u{o$JFAXt4smxziPW>838XQi?)r7dTmq`dtVU^BirWB^Wv_jC_CYAlCtV zYxN$^?rtqqT&h(Wl;oySEd@gb0>hZ4nZyYrK5#copZGJ`QwxW+$)(dPXcLZh+_GWM zWhTtwaK#&hoKJRHR*5|=MqBuRfIq3#>4;ByiwZ1Dt&?FY^~-fcL%UB&EG0{)30or& zq0rIJ?J02&+9)=XJLSOiR!N+SB2kPHnw~sN9y84G7A;!%jih z_iUPC3iV8CL$XH+z{`E=6T*IOgw-DB= zimBo_5`i$O>>|V(3~W#)KlDkLq;VH~O|zzl={F*2pl^-S&S<uUg^YxPKz9jZ%E|_$SE57funl0OA@sh?V0-jj3~IjOUwg+wx>bqY5lxcIo6-NT9Ajuwmh>uXPG%I1en-v#Ysr6tjqm zsIyrScxVlB)rL16iY<$4l)6j-*9+8=9hLdY3Fup)osOZ3;$&e}5yBF1-+-&typ*TQ zv|N*GN)g{sRj?moMh=$UV>t2Mv2}b%is+l%tN6)R>{vy46-3TKJsox>?g4?`YEhw` zA6qRQ&)30M*vUj?EQBEX+!!(Rdc%4y>?5D%Jxi5qyihFYY_<)^jH$b_X>C>O1e`4_ zXYPb9%|imaj_|M={8pYBFe{B;Y$}#3s7>kgo($9v#|}~>NoQa`%Zd6RthyfT#BuCKd1*J7W--yYKZaYrAZ}J1a7I4VQ&c@jIN+EF37=ZU1aL<2X$>xSvUq(tCR>I zUap16)n)FG*2f`P8btxzjaF(;i~JsqwFfeiHzKAbW1IWzK20h*9g?sW?1$A26^mhm z8iNEp=7vjZQJc*H(~<3jNQp&wrg1C~!5rleHgS9PIq(T4KSN?FCP{l2%h+sN`>lLiT(2ZDSBt-Vj>2cz$2!8C4aD7D!$y)*6*^?#1o+g*AB;M3zTX- z%3Roc^u-{Xy$RZK7&H>>O!Rs+0tGrkc>PjAaxVDvrdg-#KaOU`Y z#CUUOIOp@NAI?P@rp;tGfnt(4!l`pfL`K=Rn^)XQ0nHd#k#Ns5uFKxG@3hSgChiz_ z*9zlakHY7=T`igPy>4m0b=91Pjy3ytJzQyKAquTp8aba(H?}s-^jbyWe%>jF9YbG* z5X@El#0?@WO5NF_6|2t=ZUpaj0R(5;rDDyrjnm)YaeJD*z`%yV547?w7@USF@QWU6 zfMJmqKZY+ihJZBhu3t7x*6GF`4%U#5y0Q}|Yt0rI^SOj|y-AO)>J++_q<)Y(M0&SX>hwv@*$Mruigr9_jo8*0@o!P5kuh}3a55La zuF(q%Q^`bfk?#F@__=K=!B+Dq`L$>ecGa)+lh)jJjfnw<(BckL%g9MMaI3i5f1*EB z-gK&FcILn6T4itcSQlx*G1a%OKM5X}NthF`kt)rnYfpB406riVInRKXj*^9`dv*n$ zE{3t@Nd|ms13g>f4~fKiQysT>i3Y`OOo_%t zXA-iPDKMyo>fDv!AWCfNx6UV&=D>KS(OG$I>;K8BgbOx?TNEOh2dHL5q^7mOI}2BEAD_ zMk79ah-y2J&J4T%4&F5n0!#uom_D@Lh6JT!tCclD@y0CU9FLP|ef{U8;M!(alUBY| zKPeTb&*1Sb$igBp+jtb#Ikfx@VX$^3c!(Uom^afrjkN7kH?xwHvYuRK3e$nnjV-g} zN09y<{jAeib_TEMxO`s3&^bQ~k@4mLb326xHE3O8)2{XgXm+jkLvEB|cF=fGa*zONYvE-Lhb8J*MAjznEp6)F%r>K$xr`vOx9X<0Woj|Ll;_@mm zJA>hEoC8}d5e5A{4z8K~ZY{;LB=OhR zoL#ym4r=OivUP|`SphS&QUu7JTkY4`40PM4DsW%!|Ka!S+E1tm9qnPZ9+MgJ$^s?ABVW0V*-^%y8Z%bQv>ltVfLR`?=`-OT z#wi=>HQh*v=q(wCPN^R5Hj2TB#C}4Nof3;Xz-1Er{^9SUT3GzT$&1UTOUIKf*YGcU zJSYvFB0q}5TyDDN<}{W^-hfnMZX3AW$+rbx5|OUGm={i$!JUd5Zx772P6peBfS{=2 z#%u{Xd*VbbLeRvCW)CF@T-la97GQ^uS_{e>g`|RHX?RWcf~@flx-rK=S=e$-gaCA3 z(>=(;HRc`&fr1z8dHF4CZ3PE6Oi$7jDazQIhsyfYgU~oCMVD8V;KE|~Iy!!F40<=V zxsCq-A7O=0aU}&7@)I^q#o}%Q(^=bjq=g;mu0j~rx}}t?s)E)JrwlC%@v(8bkc+Ay7r!-gpuvI+`y1_cmTw$HqL#)tIg zw%COf_t)ib^?L z3MPxM@BGR&u#;e;09&qfN}1$ARGps!ivaCTDQbEqrnofPndC}Xb%YB#&KsCAmbOH7 z57Flzlj_=>LeLn?_-L7goZMLtja(sd;U)3QsbYpXOKqV;kS=Cf#>EXXALOm`w-u9% zG*npzKH%h1*_qV~>wV5Z+Z^c*w<|7{aBznOME7alrGfK%?zHGkn(p-lCowm9;u=@8 zb@0%T^{5wQJzmgl9j=igLviBwtSS^m3|Qo$A`V8;Af@dx-+Zjk2S~2-CchFtigZ)7 z>h`hy-O1S1CMU4j$_Z*}&KW$D3cZexKa@={^rDUoVb6$a7=A^5i>p3n3UHAc8%XA& zhzm@`8d5wjb}^bhJx?{>k|89b(H!ZBo_THRs0pl#U^$$DCn&n z^9L94s>PCWrfYko2=y_0ej>LoQ4S8Q6h$bI7L?u-++l&6zybP-9jWc_4}&4?`or8B zub+W*uIGY6%45HcvbfrVPt(@i_GW+;jT+gvb~2e6-*55A`o}iUGM3lwsz@pA>jI`; zIWt3zqNIcet~x=&u#Sowlj!4(cm>{2AHuiSOkM>-z~8)vh_$kHXEOTI>_}R7W5j+; zo4;Ef-=aCvis9^kw(AY6POzgGQB3`go3(=(=D5GP;>KtBn-s!&>_i(|cHoD=Rg&D( zuBmE#!;72?^4Ve}-oet<97h0)LI%*|Wlso{QoY`-ZXGF9L$OMm5mmM-gb{2*-wXC_ zDi=&}N0o|I_Y97hhnx>Zr#iq$p~cN!uv^S5zceIIpcsTL966H{w(r~_k*ON_7Bj7p z(0=idCQp#`=v;EZ!C&7nX0h_}q(&{(!vwCq0G)%X1%7!3w914J09fM85??Fq8wnGJ zSgB68({O#|IA6p{W9~t)6#hHf9bvch@MCc~TTvE^4>!5pr_f2K-$%Y$JGVx+QI7)% zY>0Q`U(j9gY%`-Lc+LzUI~!v2$?mGm9YOtWo|0SI$YkP*6}L6yjaC+A*i0^|0?lA^ z<+gBz-c1!?M{U=x8!hn*y$tXA;vVn%Y$p2Er9(EZBFvye;7kjHI=_k6JeINJJqX*q z-3m&hRXffh)NmUH^@W;uV=aaUhBw|b8la1XUyi_`f}Bo|ZkGfx(%b%SsicP-=Pgqe zmC9qtT=2VYL7Rb{$ky&8k+SqSmhflx7u}y}-cqCUuCe z@Zz`B8IL1v=MAqqFF7D2YCbpL7D-V`Tej(Or*&)&jYhi#mG>xi8tw2%(_pYQ$!v!` zJ4I8t_xV?M(oH4ot*SP-7uMH}3Hv-Yt7d`X1;~;}Zniz#*2k&`3t^hoCkOo`t{oCi z*QA%^M<<~Zb$Sv)Di-n92&y*o`!=*qC+R9GCNO!u6P{!%l?F_aOHiJ8Z7+;fbTw{A zOHQGXWu!YdCV_B)t+ArLA{TlU*6a@LpmLn?JG{zXcMkFUT@_`eX=ZE@wtRvcleJ4X zMgJ8wc_eJJkQps{_TtU5;o{Y@T}+dXVDB_!dWVZTw<$kNb($-d@jv(f-{l znLM4U^D19mu0S+!6B7^p*V{#ypnVj~Tf`mlXG&tHP4SvX0yTbWQ_kvbD{&OkaG z!ao5Mm-p|LL=EZPVH>;+gO^;Wfp^V9F{{KuSIFQp2HX=)#sisoizwGCuPd6xtMRQL$FF5Zcu4%C5>@=x$WX&7lywf?yjxot&)I_Kn+Gz5cDv z@b}4g9}vE+S$Udh!PmP3zB-|6dAGxFFDi%FmmvlO79GL90-}p}c%?oL9~|gBQ2Run zZW<54_1LK_WMg%sPH1Vaj#MsaTRqC1h1Qb}lVag+_?>;@6PJ>9qIA+An@EZ~#L9ka z*txG-dT#Puq+>abVQo1RIR$&JPcb3dIda(I?>k4nDOjzYLf-rfvGHGXsJt*e4&6BG z(~S%Zwq;nVMZ7lkm7C9<(TgF+GVZgn??)4cJ(Az%wJ!)g&PCfg#M5ZFVW(&H3vH)2 zK9@{QFLB-j>0p)g(j;JTXL33E5~LnP*G8$~sRgX{?KF#WJjhZrzgZZ3`M{-BWf>HQ z%TD0rTY(G~Rq(LsGmdS!a_chkGC%iE;Xx{sjLb$8Y!UH38N1iL%n<>8+(E!Vz!_Ta znwh<~fuZPbvtdftekeMG{jtHa0d6@FgVT^0c4oKih7QhSM+|w&VlMdYO0B+djqd&8 z^n{d!@c{OQ?Uz;?BjL@msDb8ayiNRI$&URUMx9;qTD0O~%BEtvWU2B-xcO}trP$5u zozk&$RoK}z4M@6h33f`F04jq|#nweG+Zlk}Qb(m4U3n{iv#rR1w#BFQYO+D=s9W3J z6&y^3<8>i+3JkE-0ETEya7>Yy!R?`g>_Xczrt|dOJl|Zj(UW96eqp)NPaT_L3BgD= z2lbQA7h87;k)%jKi8a1Tzc6aV&6tj^ZanN9xacqM<&mI{0sneF6w_WM=)3mhz&`mR zx>0R!Zcvi+(Z(7^y@RY-uy&BXBfL8bTys(#asfdjjfEX^0#Z;y(&Joz4^S4$Z$V;=vvs3FyzD>-7 zp-_yMaDZ{~9z+WlIpWF`mnjfB_UJ^O42A95^j?#waqEK%{FdchPYx>WhP3)JOs&d7 zhYG|{2{-Q8y-uo6>Ar}oM!|N8yOl#MuMQ7)UyC2##O644_zohW;#QlSea2Q-^8pk3 z=}R+#nl+eYu8yskl-T+*21CR+1lxM`?s{p5^&L)i{nd86b;PAc*C&~)tnEazP=Dau z(8jdFZe1zplv}(w&r8Ss3YUXU;ljQzRT)v11`%H+>A8-QZj0s$AY)-JH@5E7m{Ocs z*L-ut&8{xiA=^cs-f3nL_Xzxf;^I$ZYM0rjCmL0RSMQ367U&)5D(4o)*CCAcxzCSN zP>jsbDby2+oh|ywDZU7qR|8L|Wqa=9Sj3qD0FsMP##zTw>( z>lqE>YN)UsiA5hHt_^Mdi$T)h_``_SS_{`kr?iW+?gC=;rQ+Uy0>&aDELN$#&B|oK@y^Z1b}gWX``bcaG;ii! zYioskaxY9Dzs0f}J4cPKMk2T$tQ@zb8&n4_b){o-b&#_e-@5O+vCmI)S0+*(WjpI_ zLtQ!Yj7j`%*LtiNs8@O4V`jQnk)pnuU#>~}aigtndkr;4VOyK#+1Yf)B*mUJdW&)O_Z!l_ov~c& zmA0+Hcwjyu052;H3L6{l@nZj~5)ANvZef#$!RY}zc9Om?!YU5EG}nVB<}-SCyN$k? z+t&h7JJjkBYGN1lb$*9aB3)oy)hSC7TDAw!6$P~x;3V?$+SxPJbvtAenUNKHJ2w{2 zBg8CLVotKv#B<->KhoOl=F{%pCQPU$++c|?Zg>dVYc85KYU7N=TG6>o>GOCbr_|ku zDom&aKZw{VVm#DwY;?N?mAXiWlwJVe_PD3l|vFhg(D3ZMCsa ze-y)_ib^_Cq1Vep^Bw>1oXALuUmU$}{lrNi*lS7^M-lO^JasWle~E4juBn!D^!mMR zM5~iJyb{h=K&ut%#7S5k%voQ<6s|~bqo9rp;VlJlo>b%qldNT7CSvl~VbwA{DN>cW zO!r4@EZXK{R}m%NHeZ$zc3df`{S1=S%vjxe6wQfw=IZP3y8UW}1%38@b$E4#x_th# z=y5`%4}(OFEga<8U0QE9nirSFyS!wq;LBWJpa*3VRi^HuaQZm*pG_Y(CrY- znxjmiWpO^Y2he4Xx|sKX|K-+i3z5p%K#JAx^lX6LfX<&Pk4{MC{ zIV596^7-$UGt>vz*d|6hRyKrU|CuN7?&>NE^xVs8yZa22X%>OZX?}NXS5U+v@3g6O zj;tSXK)2u>6UMcJ#7k~<(25SII%qJt0XsXF1?j2yAMZVEw599_#gi}Z6cu5n^lYCe z*WmHaA{6QciHeo3sKs_!A13~l1Gon5f2DK$EKS6%+zegwvpX9p=*-`ow1n8$?HFYk zNw|`_UQ}C4tIKIqhy9AzqH9T%Fd(%jy<9@N%!GEJ8=dGbelZGAHI}f0gQXE6ALsE( z9^yE;+x-i!YoNXIlTou4%-Kmahc5pCbNKFrxrHne$R7U&{js*;Ekry) zw?0_H6?i6VPcP$nDSLOfAQz+DJ9XvXir6>4Zfp=N1m7&CpiSulhq!*_R=FIme{ zOmh!M$HTrW8;F(ynax{{CNPa4CVeK^PCF#8d6Dsw<;k=5pf}%pbc5f!ux~s$IGjGT zYry{CWB1PSPO_!$?>es^4j!`SUx^rZFFnj~ov)?ZH|S!ECC_y*cq7$5Js$5nuqViT zddXgQ_1nbOK`nUba~1jftsI{s?g>uf~6|eO>IO+Pc@#DZtTq z&H0uaZ;Z7g=)=yJ2(ek-W`K0`VGX1013Ize9%=Bz-z6zIwFbCn0HZ;Ug2_bg_NfmB zH;F}ydjK}jg~rEEZO(s3<{{nFh~<4)I(lpR!C7neW?T4LeKED7N}A(bMe3 zFTB)r?d+v{I6v&g#{GwO?cDD}Ry-_4Iw<0)UU1vP zI&%?E2u7T`9S>7qF?sB|9bWAdJQgSN?OAlrU)+-5jh)3ww+qKt_<*8`72ab*4+EwP zd|WYiZ66t8jT7D2CF6;w#waZKSm$K<1cVml_Zgng^k<_@W*Q|X!=2+htWn;Mz@w6! z<*Z3Dvc_TyK2h<6yS+hYX~7?C9#3BL)poS9gtt_orrHk60D(m479WCkM6hbIb}L;9 zLj@$-55mJ)j`r2^F|ZV0+nnBW;Lvza2zE%P-7~w!lS2phA7G@C2T{dt-H7%g3(a45ZgN8xI@NDl|UU-kqb|ivy$Er)Kud#KPH894Oh(@Vec# zfp4m-k9Qwm#eLljvJBF2>l7C~8g4Gwj;(HJ=y!fS^re`hnBr-!1TuR^`|jFfEFrdJ zM8Zun+N@wlGMM1kq=s(J;2}_q9k*-S<1DT_cKW8Ek=vG{L`RA~N)j8GW`0xpUKl_n z<-rVGQfgO|u=^pr)TQ-I*6GoR^}(rk)6F+M-w5NKuocTE#i0@3iKa{dp?ww~+ItW# z7;c2s%N@mxFF!_+JjF~5b8jw|br+v(Jg8>pG}e6tI^%0i8{=VJl_DC}%D_dVOLOR2 zi+DR13Pp_Bu0zwoFr^E|5aV3t!abSzjez*@Hw#Q~Xl@k*31!kftnl+=AY3$%=ddwr zS?OCqyZ}7TS!LL_YY%&At#v(O_Z=GWA`Oxch;85w5wlP_sts#3 zL2tq|cI`la(HyoYB7c^!Mu67`HsSqRQXcq2x}MQBDKa<~<~?3Aw#jYnl{K4)w_O87 z8$mzB&Lg&+Y=c49=IXSgVU^{E2`yMOK+Ls0N4q=ef%qzRzrtjIPJ-xei(E29x_Mz# z!`&+B$L^Rz3_PC=ba!|o!OC}$@r4<0HY5@n^>i%)3Te%7+rdsq;#xvc)T*rRjo<>v z@xuJ}8*_1A2lJ&SO7|REfE2+pdVXNo8}X5thK?=(3MxJ_m8G%^3Jby=TM|8npQ<06RI$zW6c; zsm4|F6r?{c6EBAuQ@+@X7Pj3~)vK}=fozRAC|TlaG+boIPHO%96+H8C)CeS#R@)0md9u|lSEme4{X zOLMIuPvO2aYN`-n{J>K!{-F}kGVmfwe4%FZ@vqw*Z^|Mqi#|B~vT=SHOvmH3$PPaS ztN}X_Pe%{f0(ub6dd2~9`kgU|?pXlwmKm<(!6IjH9RoCds^VqzNGOL!pH&!1J}DK? z>p7WhSimO$98`gA8oBO&%#dLv6)Gt+x4Z@%u?Rq%KvRMS49UD2&RgH=S;vBU%vGRc zxGE_d+x25vQ0dly2~Y#^@z-P1>3B6xu$>J&`Sh>5EYpMFT365 zJQC=Wh9E_g+9SkVTBRtNxSMW*<@Q{lgXvIKi-Hm`=Ed0HgQ=MNm`Heq6u+W+I2q{T zSiQ)8->`W0{CP}u+$ght!`jB;;@R~ZurYH3eWOdy+wrwGe(eixz5!|MA_|)$YXW}U zfY@6?#0Ji; zuX=;W*3PaY03V#kL1YdCTmXT6c(&utW7;D;haCYbP?Oy3<<~AfjaI7L=|JdEQc8q#A z;&p)$L;&JuS;IQ-j7-?z&0{=w5e_0&xN|hxGd%{0wQiE=wiSws?)HWb49AC~N!kaj z)}x^eGW6mG8NNdnIfpx;6Iup)lbCJYwsZGw)Bf{q)BKr<2M->3{)LR(#0f(%^e z6VOIL#6#g)(*Z7Qf%lWyhC8SC98`61qk8%7pcM&YWMsW(n4x({wucZ{8^=Q)iYqODw9( zhS25;S|Nqgh=93#>(#l;34@?g+k?TC9RqLs7<|-5r=16F6pbX#4NwwU1^gn|{sdzg zN#=I$8V_zebZEabtC0#O08qeT$R*2iXgA$zws@@2z{2hZJT;SDcVHB_$A%wYW&0*r zqM#vOIxex}&N%B0y1vTFe4LE<7>&uH;dtMngCkHI`*-k412r-{ZP7DJzFc`BA0|`E zz2^|u)X@E7M{tXW*aqdS=d_DXui_ zd((T2M1aA>2WJl4wr3hb8Rbnk!|HPqf;EV5YN&IGjR6PHi<`)in?{Xlbd~|+lQjTe;o{WP4AiP znVvpGC+B!(`rrV=j&4IkVUMsQO-6EY;Zp<5gE8VQR~#=mx_zd^n9=g!T0;&Zd6;ba z1^^(e*0Ix;yx!)c758Y7*uj!05YiOb-nnPY85@Y(_(c1`GT{CVh-9A!!E@i`_5h8?q%ZX~!{eUi)aa=?0lgjd+vd5E)@X-4 z-8Cq}FlA8!><22C7zGp9?^w{C68znz^KIN7!k14p>lhp0!{DPH8VZh!)d{z0o>|dHMF4g;O7v|CS?rSxCOfqOV4+i z>ci{{RvsFcXox3?c|%F%TxoMxObBW_!J)`HMbY+dC~m9?{9x?^G^&y;9M;7AW~@M< z1_~6p!KYcZg8SY)H2&N;Fvo0MdPUf|VO{e$@57sTIfgBgKOj-;ywf4yyHQyKMldjQXgzbGj1o|H5% z@YRvzb?NJeaz=q~?qrOQ^k;iOx5VFVgR#K#DQP57&9Kq&roQga83mS&j<@XTt*PLY zz>SnND^Sg_(W%tv8*@g1WusF~qc=tYb?^U|p3X(1llXhZ;KohC%c%!Lfu|$s%E9Wk zrUR-=^w>6-j_m2r0|C7w{(^-B{=_y<+cp>pd`BcX3+e0DD^f;*Ul&Q9G3ri#9th}X z<1Yv+@Y>Yqyuh-qmNQh>2U1;A0^gqMIwDXgJ7?%iEo>VciCWU1w)$yRuTrdQx}p91 zqYCw6+u%`lNCmzqVLudje@dDc>LNI*PdEqg;rRQ<@ps!`C@@zvtBS5qgE%WtbzeES z@S3K7!@%Wm!f7aQDUysQ^|6}rP5pU*SEMF~HSXsk%YCWT@cjX*G`e$TRPeN|D|%V{ zG@Y`{2>i#CG%N5kk>qTvua{iu=xrO!)_AJ=y{WFTK$T)$E!+M~6nINaOI^{+q64o^9hnjMyD4cR@b@CgiJ-45t`ZR@0>31ZJfpt8@G&Xl zR(Q;(MyCa;6zggyQ`>>5y6yu}=Lb{WM+K@2j~m>C%CGs%mtMcAq^G1_9Tlj46uFfo zB)1KYZq>Z#%JCHZ{)E!3+7$`GQf=i8m#J^6u&n$yQswh)<@2iiZ0hIyV`F@tkjANz z91qu?Fu!u}FYddn>KCJWOVr0oYI7)1ZCgHlWU4ld`_H2aWwmlO>6Phwa(e=ca`#`Z z%YAR;zd!z>^4B$)emH)7cdopyXL}IxTq5X(5fg8G&DMwKoJ7 z5%|@Sm@^7I*~zG{Z_gP8{zOWe5%`}|Qp1P01(v^+u$@;2o|8(=3$LY|Bn)!h z4bQ3WS4Z8(;{mIYs|KI<{o6M6^|+{?IR*c-)aFQNsBLBw{Ogg;E7VuUZd8x)-oWHN zspm(8##f~#kEqELIY}+%x*HWkZGB+?P{9O#Z6x`CE2I8OKRuWW3X~E7<`MYCv3`18 z`r4Hi*k-g<{k~NFSl}0?Qu6{;A*&y6>MK{@47jR)RjPhUp!6N+V**tntDowrzM<+b zM78fo)i=`R?)YgvXHhd>o;o-bcxy^(lxXQf-2$bT9t_XZntld5k`ufeZq8}0X zo=(Oy#c8D?@ZNC34Aam%?eb7K0NwTN5F*w z)uLyt8(oc>e;{>WUUjKpkD~j=DD}e$uc5#bWJ>h+1M@-ID^J?HMnDzm||Vs`_)Eo5}ZO zQGo~wp&@L92$JgNMXBr4kiK}c9p)Er3ISDl#o)!wkp5_3kn6g+r>>iO>bkk9>!GOY z2??)Tddl6>l)EwJ!fcuoGXj4wC5;5WDUy87>+3IaMuC6X$*8XvCq1PR4%1QKjj67A zRsUaeQd?0ogYSvl-`(uo?xvITf4{_{NlUSm2u?DOe%C zelceh_)DFPHMVN>yHdfiK((}OaF@Wc(eb9f)DkiZEF0arr>b__U`n9sWVfbL3vWr- zO$jVpXkEGL)_tkqw7~C4NzF=rZ~XMy_!? zTebLL?u@{U#FW6YuGZNiB$RvG;IP25V7nb5q;>`XLq?$N5_Cx5T{)LP2@m92j9)M0 zTmhv&UmVag;xAWV!FwYO9&go@wfsiW`o_rpy{XiUz`u#4{<%Ha=0D#Yf6-%sUmr!E1rM->PN4-`k8fQTjxxb2O$0W zn=%>#e<>x+3j9AJslV^4>q06x7FZT+XZv?Vf$vKNhXQ{wC5;5Ct{%7M_ebsrQmLUp zmA+!Ieyw2Dbj4ux+L|!$j4D2qs+tjab!g%JR8YZpr-EaFWxA91!Lh)yVB2REydf2w5?B^& zd-K&%;DxDR(;Io>_oOT{0_P&Bzc(s)XDT=r`0|uA5?I#Nc2IR4N(H9`mId1m-Vp`V zGIqoSs%6;d0?WEuBwiVH9ZyKi2)r0c{ghC_yHmljzzZp9B(SV&Yb4I5f>Q#^f-NOZ zMFF)8N(fZTpoGA(t`>=JjJobmNX!V-j?cEioWLuR1v4X1`wqxeOAOWhu~he1U@kS@ zs?@ioQd0s|ieuA~<@ch%N8>NeRKcH0l?`7KeNbi0R^y-sMG7oh0!50?nJQ{`F4Iz= zEVX{#Q^DP-;8u8l12hgM3VPLUq6>K z)@-#se%hI`%&FAROFD*F{HOpN!cVf!Yh{@1qL7ITaiW{BTN| z75I@zVqN1+ePsiFR^X>P8TBPpdK@^y~Ol12j6GVz#7c>GPyC{QhXMtx;G znz{als6#}+x+73T0QLe)JpO6vu{|uf8hD&${I6qQsBHUx*xm@47~`J|ghlk>sPNuNOQnWfXX8BzZ=C4L>hstotrJ z?oW7(1%5Im9TupTeNgoE`w8L00v{VKdPaRcH{o$u;GRf=%lM(o`VhWedMlKFIpNpD zc&JxDld?<;{MCf)yg>DX%}sCW>%ZiT0!2^HsIT{>VVD=F4tqv@sarjMd?74CL$4Aj zETPN_6pE~VE+PDcgvUsrQ1p!Y`gG1HP$+svePx83+4h#8tjG%giNN2;gcG7Srxxdh zM6O%ToHWj=`_s_|{WXHGN|g@Y^+>2P&%@#R%xLk-!Q(!&sgIiy8Y6+~2$VR1|4?*5uu!z>^zl!L z?{x{a!+m)Cf7|4=n*7tE>w-lBQ0UQM@xEZWJWwy(RP|z!D+VvzZ0mYqGw6>GR#jbB z4z9WMh?%Y$T)6MbN6gi?4IhH^RY}Iq2>h0mH2U5E-;|RC{zOWe75Mg)G%s-1=Q~Sd zvI(4|r1=v8{&Gs175JNxgc#9#H}&y}l=zybA1n*3S(rQxh@zdCAUn&59&D}!&iys3}PgvAko zLb@kp@Nc83Yf`DB0>3CF4F%qs8pMjKTGjn420Icd{$naTB`}d>aPIP^K0cN6)#G8S zc1?cq*xM5Kj0B2{;I|ieXR3W9P~=1|fqAr>m8kAF2w0=pL(`YVNDtHC&j@^FN*W2g zJ0*<;u0#@7%yx&Pt$wWPPo}zN1*%Rgq5{k6Tk~->>ex(m%?SMcNW##3{9b)*KE(&g zk=55HBGt0$@g1G4HOHtszmU2!7Wfrk;F%$B z1paX(u`}aMeSOUnQ$~U6r)SjHN2AxMQQ%)~_p+W*U!RUtWE3cJct(Bw==G^-f&X_T zc}9Ib;n^vpz+Z_ZD<%|NqvY_C2Q(v!$RNyGEBz4O<-zxSmLLL$712%7T}LP zOXQ!lcurcRnuSHkJnjizQLmwR@5fl9p(I1U&Ux*g4&}(?UG!4&4 zl=!VgiIFHF21LQOkE3=hMs2qn3Hx(_)U^qzd13G;34?iI@NW{8=UWWs+vXbeUwyxv zni~pyOG;{x{FV6WgYg&Q=l;w3km%@3I{fb26S%K=Q<&%&+_2te0mZ*<6M&cEN z^8>+}HI`8yk|sTZ#qwzkMLtWc1%@To!od=2L12lFZ~j-56n7!h$L|#xo}I`r6j+eq z=7jU)mH>tGw!uUg zKlsnQA|(BMfa(O2>MkIu?f{Z%^pR8}kE9y)-wM><8-F2}1b!xxuI3nA{jBTsU5w3r zm(@=V2sWp$6ReJ69PYcUu8P|%Q6FMGHKlJ6!7|rmu*8}WmROU*5^G{u;#TDNzBG~} zfp1DlQvx4MNh8tWtJ8RoG~PcH(eRLc?+);{Q_`%!-+Z!IVDu*e{&h;46?j7gji9cV z2Ka3`N#JW!(v(1r1qx~;{`|Vs;{OQn8DEl;1b#y#fn0xi?_1*Ix4$&y6ZqGWWcl>* zmc-X1@wJ8)hzK0S+Gs^TFFqdBf;kuo{I@A-N}w17wbkr_q?$R9B-XelX(%IsS_2G? znp;rRyPW^MGDiQgi3^4TKa!G;iVN}p9Mu54Em7yFsG|u1(?Hb8T|C-$@o3w{qw1pi zgSy(@9L@c3NP<9X60OtsL^pmvb!Q|{LICnYtgoK3&SjRpR8Bwab!*tV&U?WyDAr$y(~S**;bwtJ&% z@fQsU{F9V4`?Fu+x&9#jB9|xRe{YL1osPf6Ua&+SEL{!iBn{-$#V2_!e-(d$)ep3C zP4Y~V3%MR2-BGtt{hPnU>yltWF3FC^eVPA+q~F}`VD91YzK{hH1gJ}3o-ngBU+D#p z#b4y|g#54QAenv@!^t<*?bFdQPt{kJ=tr&!8LjSmMs-@^+EXR5B?>(CB~Nu^-V}d5 zRbPJ>sT`iq1pI`M)=U%pdy(d)^(DCu14Q8Yptxt$*LO!MGHNK^8v@-k>PzAt83hiv zdj~w@TzqK;dFrPl^)WGQo~kd&d{in>gXkG+!RM)xea}e7Du+&An~_Q?36`PZ84LQnnq;K_HyUr*K7ze^l@MBsmWPDy8dY4u_^ z1wS(x%mGVqrT3kwQ(r$TRIu_C7T}O=BVX=wTx(;z@qx;do`=>iCJZd z`gl#!iN*poQ7oTU%?|~qTcSQb5{cOL7AOX^eBwW`l_l0(Wr<=cv5F;%Q~ohH#S+s; z8vmgfMWnWTBDSbyiJ4Lkt%MlPqIcAa%SHv+7gD*9&UM9YmZp}kiskpF_=|Awx)x>m zV9GKl@XA;Q(5<&#{-#(}waQ|{@cohWr)j~RJJks9xeteDO2#D$){_=VTcIT!VBoYE zOoYKF5(bkNgGr0Qq{X1IpG26oOc;T`l#-@eqr1>P)F*B4H*%7| zPeqb7aec7tIR2ujz{Nly9@3R6$A=LiX%leSA40T6f)|+QV$=vhVnom)%W>KK=>Ft4j5>ZFw z5y>Q*70DKZWGL7YY*qvlb&yNUDdiAJ0;L%OFM*o!$W?PMl4{09(j$|8(vp56(r02# zT4GIFVogM>Oqt{hmDGb0&{Ag7Qf4B`{H%dUg4uCA`^RLD{MUue(nUaQ@ zxId64?ySIfr=+2Xb!FyLftmm2#eXkNGjvwqZ7FG9pyny?5}3zgsImA@xu8I;QE-xI zEHuFpKqfE`Ph#BXWX2UJUPkc6w#|0ThV7UoZvOmiqX_)+NV;&zXcvoxq2plGLJLCW?OzfA{uJOV?0E|=Vo~za4sc{B@f<| z$ePSlE%WG*C@853`$%9G5l1u;Bo|On;FA-bX9eczGSqZAn{pk|bdimSx@r-zH(2{< zV)5xZ%SVH>UyvD4;8P+A!+d#DA6lMzVi>QA{7;I%pFcP^z#UpUu3sIrF}KeS0#C(X zYL%kl2f`$0nqU#LM+sL|FG*uI6nH2lO{wztBzu2K;3rekP~hLCq-lXqPD|rZ;8Ro5 zw7{oFQtvg3&yBf}9eNXO8^{KQO#SZg-pMFOl2|*t>L&8EN{dG>xmBf|BWZ5C5BRD0 zizI2|ve1!KGllRxANWEW5S~{Aa!6|NysJg(t`@1gTBPoJWDMq74CY!4=2{HqS`6k| z4CZPKZj8RaEYVQPHS z)FiK~Ml_fz%`Z7Le7qF;=kFa@?MwVJZLLZH~Fw;#=`i^XD(4hGF2V)unX#wxxe7U0S5J zHyO4vMTi zACeF7e>lJ8f5o0TOEZz*P__1i!G*!=wdDsTtry@l$SVwr#5!%M>$}%$td#fpU=3MCO+&1Sx+uL?Un9BvFt)Q1RTLoTGhF<8TL>O=Ih zoOL%W=Og!FRv~Pg8Rwr0P$6m%0Rlf5Kbb($hx&$mbEj3AQ21!t zmgj|phPGQkc>Q`>Q0E1{E0Veel={J3K%iz+w?IvPk$Nf-5&Mq%SWm>B603YHCkgyS zDtd0)rat~Y60e3ewSgs6-=B%}Ydrl~+cuSQRfrCicw&5CSEbiPwMkKTs~x?$cJ$`z zst}2y5%~9sppC1p?l=85>b5$8z|0!|o>@k3jB$b z)F=xNM4j)>b^msNA5KZr0{X#K`qr$hg5{Pv75_iuPH1im3yRNzCA#QPuxYZv7)gUi=m{j6(q zJq|tNss2}6pFNuGe-DB7cS*1f1%7@qSQ@I-S$GVnZoJL|mEoankCds0k6#>UD6F<; zXrKB_uUF?CamT?&Hx*i_ol{HHW~MAHORSNqtE14WYhzkn8Pm3^>!pDruow8xQ_@^r zJIGL1-qY=0e3rNNzW9sVL$9gZR~}iqI31!$LK%NO=hAh0GMAcfOU>79?F~=Wq2#d| z3LHfem|)wcJ|-#OR9)4*@zXb@EJJ}Arz3T#*FD!$ek%TAZ54RUSNTtvzXG2WNj&sC zv#GCJaz=qK?qt;0IA;_%pOR(-9_f^QWQ3=M@MBY5BY{GZ2u~-3Z_XJ73PsPTuTjn@ zP*`Fy6IdeL-rx3>QO6CbuHo(gRY4D<{!NU>wW(Ay;O~np>MKN*z;3r|623C(yg$`F zBk=RS+A~8HeBEVz{If{(QPEjt03xSg|pFY%GOlE=VuGOaxbr}1<0v{^t(}$>l`UHv!R-ZmH<4r#@Tf}!TIf%`*1$ogY)5<&YHS^oTl!mou?zw^Xt+)9ck8lEb-zLRN^G}?x?^Yja<;cU$&_aO)03P0yVoV zU(KtR0-@hch)vD~Lf@PaoBTk48YV0=V#wDdTqoZipb$i^mRgM$S{VFf!eCC|dm;%O z{lI0Rbzeej?rjZPeX{m}%XOz;6!pF{H90TveJN=u@IxgQ`nW4$F)uK4_*l4Rdd-Vo z-xYW^aIQ(Hh=pr}VK3o?rrRj-f|_vLyoNB6{xs6?Q8kTch` z{EHxfG=Lt%PSQ@Iu1B^!H;{f&;*o~Z%JL{`5iTayYlIh~3DF6?-71R&F%TA*Id-Nl zC8?zKr-u>}%aX}Gl-L%7@daD+oU%NMS~4z;PA!QkzUV<$ONQ2q9(1Py&7)hRt1OSA z7A+p|Gz(mbihIX$@U=b&2jee{CV?N@;Xk1&f&Von%?W($^HVN?kB=lbtn@W?bIK@i zF_Ju^zV7?qQbq@ge;aJa!d9i+A}WeF*c6=VE7)F{-qL5fuV8C(w*}|=3eIglGOCCB z3Lb6>D%USYUoqaVyZn*(*n5MwV~Ia>qklXQf3XHUC&uh=;;-dgEx7VC@63gNmmSBbFJXl=4=ALFK4?(@V>;i^8yb> z5^EDIHb5KbeyR{%s_|_qu)W3%uRM_=|Q0 zo`@v2EBIBB7VVyi&$V1y;6o{C^064f|CvT|DDa9~y?M5AL%=^Ae=!2T65t0?(oo0-=x0sq9`&jv>(QSJa*79`w~2-y zOO!q;P=o_gFO2Ss97y`fNO~w!MyrX)fm{Mb4m@@!@K-ajS~46K86HT)ntpqLTB%We zJu8qTVrfnwX)7KS8MqH7I!Ik$+H7>~U#2dO1wNRPW(0~5*fqYqsgHN1d~>4CH>7@# z1&SolK?P>&j76PiB~pw9ib`+<3KVtNftox_tLekE&xSynBrGSkcyH?ENWGj(y&MT# zh$NO2oVz(vH`NhH27#}Qp0lLj*GC%sEH`YvIX=W9C@b*M(&NWMZDAXNGY^eE8xm>o zSyfFBrnLmQsUZmSi6RP5ES)==4(r4@TD zP}N~wuj@k6R!H2JDmvPhI=WS<+}4q{RI@JM9&JpgwuS<8MYF2ta5B+m1->FB4FzU3 zVD^!a4EtcOuO zdw=TLSm5JQsd<6wi%%PU2_I}`3slRVQC}I4`K|EyPYI7HfzL>I%nDS?tbS@!Uuqo2 ziog@OtUw{-W%ZR&YdBpb5(EBl~HS^#ixQ= z8XuUd0-qk$v##-`8daU1S`UJ%Q(350Dkv0@B(SWj^`5kK&8jYq1av)tWnHZcr>$$G zy2SXHegez7+NT*_7j*fRME)6p?=46+v#GDY$QcDb@1>gavjQ(f5(zuAsjnZ-83q2~ z*LhjbSdT!9-MA0Cal-Bo5_V&OWee>K0Bs9XeJxC-7CxL>m=dTKz;2J+f$6^Lr&INR zlB%B;sOm|gma*Cn%=NV}ms-%ML9Po_3q4DATm9j_>JRr+f4Hr_QMdL7M+_5Z395wChx)B_Rpf}I;iuem3#XxXwuu)vTU7jtCSsR+~QlL&`T6C=?M;+(aPuV0Pc- z|Ha;$fXP)=d*77=LI^{`j1VA%Q3ef@1O*9#Oah*&I#qN-Rd-MnRECf+$drzN2r?KD z6cMO6AcF!?9D*`~f{523qY43?=ihX#(_770j3 z>L86ob%#j-l|dt!2K`#{!u&zP@t?@EI})*@tDI{f>2&qdRMMi2skpAS&U6SwXHM^( zoVi8ZE{^>}S^aZM>S8I>`a1@H?!gA|uPSN*UlUQdw$tjJj;*;`TK75bvGTs`Roog@ zF?>dO)qybazN#Hs zGrm74KAX{Z?2>>^kW+J`3NSM2v$6V8M>db9wKDfi)+)1BCa<(Wegi{=-X}%#8yGMy zO9nvds=U@|vNI&e_vGlNJMe-J1!cGA1$IQ_M`fc!>$aU$5qOt~f+DToMa5td|Ft}F zcwpt$S^I{PwX0&chw^U%VeDyDmH#bDs|kd0P^1NulImL?HF#X4Joa#dGx^JeC1IG7J2k2kDHZ89Y|!)!`){X9%h-eJbK}Aq4H=0i#&Rj z$Iq2V8%Si&!`+Y=9%kLzd8aVO4wR#t6$eZFLzG7bJVQlQ>)T9T652$4_dh1^X%%I_ zWz={7n*tBe1pDJm2ngRdO%H9q`v<=yGMCE&iGy>mMlp%vW#FYWVz#EhNFoDXEvLL? z2p|82*!@Dn>wwqQtb6};V!aR>js@<2DG`f#KP=VtGBEkOl8q!uJ8J57JeVkW=2Keaf1|TJscI&0$Lt9Jh1XXOSZ=*fhvakXt*X2%HCI16F4F& z0-+ofX+fprI%pH9!2>Jrt7Lm@66i?{-3GuuNwEQYv1@8R{lH@4y_)#3Q4vV0o@{T2 z7Acg>zT-X|`toyfbmIQYT5P@ z^dv1&AFvp-SA&vP$)F#*d+5wH<>($EEh}!{rS9{z!zYRME^3wSDB3%#RR*LYB_sM| z8KxKMa5dY43nfORv){QAg9?^>jUQImh_&Bufge}awZ91*qpWMGb8ngEPu_SedcRw} z_W&OzO69209U75E4-htP(gGu~o{hP&?MuJop)>c9O8FaqaO_|cEp_Ft zJa~#$W}#akK_=`OD(?ycT=)@0b>NbF1(ExUkjuj#1|wNn&V==i*6t#8lNDGqE|B~p zDg)QpJB=6G@n6e7hd;)il3ft3VHHDia{C$}355lb)*i~Z2_%`INDC?@J0;7b1`n*f zFS|xs!yXJ_?G|bvl)bN>4y})90xckvgCZ@clzi}MdGx{qtI|i~PbMSJ&+Hpz6h5q@ zv41n6xP?+RlL+l)b--r76-fGSGMp|B&W?^23tUBpnbQJ7-MwWU2b-W@2)jQhOGC*f zw`GT_^eN5u#|3^Sie?HtI*N`L7?Ww!fqQE*ZQE65cesrZ#?k1?Ryq`@ua~8+yezH4 z`^DFZu?WRxhOxUp!1u=5Q5let?X(Ej zidw+Ppg-*bJMPWrELO#I$t;O^T8y0rqE>O-OzXfaPLye;*381!bwC(`R>ctf7iZ~Y znbarfQ4#o~L5j3)kBY!w4^pJH{6{r3a3v9i&}r>$ z8aZiAuvq}Hp{;8F4f;#0}E z_t#a+qM5SrYQ!SjlI_Z~%qC@;F|>ahMQI0}EvJ|+ZmmqGi4&z(u)aWI`p1Y+JWM=# zS!!pa_1S1mnyUx!b0P|pme!Y}BJiR?inON4M%;M>ZYrYSk=75R zVw$EUoI@BZ@2h0On@p=19;XSkfaK84xNnRHY6)NJRdg7krEctCRk@ zQAGOpMG@&AsJWRNV@lg2R{lvMp2)xK>Edm|FWPNYVrO^8*gc~u=fLMh0eFqp zY;xd+BI@eF_3omOyjzlYS2Ha>OzxDhez$!jyKRL35l{RXl1IGqw?WUi*YXO?BFB4voa7|h=r+KW{&UTzla)#R_u+>;RCLn^8R zw~%4x*B!TCl-53SbQ?=xV~`@PQ==mAj6sSqyMQda9CifvRC1;AL5+|DixKQq!A7VO zVMX=T4=e_)mISR5l=R$A1z6-^9~xU8HFy+*)=Glb2wIF_uL?Fo4-rVuz5fU-26cNw zDFu<-yVXF_bGE=D54&BoJbK~r9<6vEkjTE9-A2&x=!FMC-L^FyMWbXO6UJYkz~t+; zB&l<+hIdjc*&BXVyq~4hCBy2&nva=xFN$`IpQUrBtxo;q!7V@3&N|lPJQizCZ6F=%-S?JI>xJ66O05knQtK_D zW>$dZ#YfRF?_4L+U&zr@vHLe{3GUVfV9{N#aaXc{;ENi&MOHWX18LkTGq7Ttzj0W8sDaOo=K1rHUnA zF|$}`yscR^fZL7^UfiMr++IXsYSG$V6&t`F6*YnFLAJEch>E~@gA{4q92J2-AEZd@ z?x>j7gJj>-WOLvaYSjjkUbqg?+C>#}Ah`rZT3=GdHjrF`BCXq_B9I({;!tVOQSLP; z;QQ299SCvntJ$*IzR?y)F2R=87o#GOT!JF4o1!9+UJ8n|$k(mnX|iL*#|G*v z1JY6MvJJJfRI3Gvuc;^l-l`&V3ENmsZLTUAFovrU?j+Tcd-2GA4>?s+m5glfh@z+; z&>}hYl&UmoH4?Uh6hY^W#$61jU3rST#4o&gD1da)%W zPTc?io~|KVK%#_MPK!X!7Dx%)6b3>g*v6y-`nm*rNQ3sLDv&rwRWe}gq844WnHHi| z7YKurrzM1+AAJMy?aH@c0Pm#U6{h~X!j!#@P$xpndH>Yv_M|L+=YjgsIxhQwr-;a_ zfiH_{zy&JGNa*h>>LZ=~rEK0AIF`_Cz!*uyEpmtf`_q74jcVfE%hF2Bl1k7WZuf$# zO|+|AFDrL*C;GB< z!$eUj>vMFLQa8Q8sUmVeYXZ2VE`NPD$0THR-z@Yrpn1Ls9gj2YZbMCzZFsFds@?$Vvw|eJBTPK(prC< zDgtMzr~!ObMJ?cyA`0$k9lEr-1I`jrP^5K|DmH-gRn!9Bpdxu-6?@QDDW^*JXqEba z)Wws?JG8dfD)j-WOHiamY20%>;Ne=59QcHa`he6WxTAH1rqu_eE_bDUG87 zj8&3HxwcBXYe}lWyHr#MQWsC6s#V%Xt5gS4m!L@N51M}+NX9{t)~7YCI*^QmBCVL2 zS)Y~_RvRk2Y;$qDmAcQi7x>{Qip2@&UU5Ljx~sn(k>*n%v`N%m^?+nKIA_Q?MY1D| z6Q!hZ&(L!F4Io3y4FF&ygTAYpyljS>d|;L`U8%W zq15$9W4w;99Jq2(kH%V254dqrk4Egf+?LHeUN~M@4k+6Uc#4QdSLTcZe>tjAx9_Q_ z3cOWB-5;T+akuJaKwf>E0*3n-f4NHC&k!GntFH#|d=<5U7lLW9a_=7S$c02ANR=7Z+yYg%v?6EOUz2{Wbv}1=GIzMV03JrguX&fYL#s&aIYu= zW-2mE)l4~ctg1AC_bx}Z>%jX&6uKqtVtk#bzH(sE&_2MlhSf4d`($#l@Oet9Hh`}T zOBKV%)i4JZ4J}pN|F3BHyg&@yH7u=+wQ5)^bM<{z92a7xj;)IEQdvG2jhCa_H2^1w zsJuHdTuKddVA0UlXrdUbr-lvS7AmR(cMwq^L2K8j2;5CYCPyN!t|~bYt1#8m`ekCU zuNpRhEfJL$2g6(qb70ZX7H5VS9HfQ~;330C#PC2h%z;Hi8*!!>9HWK};M`#&VtBk7 z=D?z%jmX(E)UW~ks*38si-skEuP>=#4lEj467$92yK2|~{zOG};PoOZ?`?ctqlP)K zXlO~?EC#<)!v^p{71eRCgzJ8;IIk0GGNh}tFXVtI)e16!77(T6rIk0GGBfcO8 zD@_O!&aFAX)kPF?q_tsGOs6QmUX3JxSb1NT1X^R&cMcqnf@%oESz>ATdf>E6dT{j{qkPQcQ;( zL9f*axx#{>`*-vvMk`WNA9{Mdi2Zr2%|VMRnjyA_{#=Yl9VnS2tvV z8;U3>zH`u=p!f_ONo%}D$bieMCnv4SUrt@3Ds@O#w6Dywln;pZlAIXvBEzH2zq82cwk^y75A+v*-dr|~ERefi`1uAL+VdDPA5eO6K3kVaxf0a5$ zQs(Uie3Q7d0usYN(K3$Ar!&Jix7cZwB` zMpp)8nU0zzI`ZgzXdU;LA@O8D6Qv@n%h63Q;A9omfg6aZeEqh*a(opH?b10_-0r9m z8^D^1>cD-6C4sLGs9_E)8d?%F#NY%qYyg*EITXvyJ>Ucpg-XzBMa8txxSy@=bKrQj zY65W>)^A$Ty&1N+hqC)f1-PubZvk=W-B&xbqI+|BI7wJvsq8c0f2wFdg&MJr@4AXI z;C?Eqn_|hSFRMxec&&&+;b~nT6@jk~QXDG6*VQlw;xp8q)}2uiSd36Ip2Xl-HLL=! zQBfU8n9w7%9*&B@#Ucudw4mbF`JpoHsIMAufr^?yB766>4z0UYu?BoZMNJ@Nf-S8` z%?#SJ#K#ZRSBr>$j3VpE4A06cA?s;!bgLNf4i&Y4cZ;&xSkqTfxl8w9}p(qSG9zf*%RU(GVbp(fWK7tZD7%Tt;D_g^E&Ik2lqc$_f25Y zeNTyd)BBr=kEwE8y)tIp!3TG1&tI`@wf@XSm9bOMpikE<(>&@<_v7%{*eNJMwN&{8 zQBHe$XW`PP`DMV{Ra7TcI=^Jry&&3esZ|5`cM*l*mol)1d6}UdYu2z@W@tZ|s;n9~ zEGZ8Ct3nh0l8Z8 zP`)-&Usd2V71e<_bbC}_^ldhSocfqLY5;FiQ4@Hxh{}5mUrja4fki{xW1kU&W7IGM z-l(EF5ML#ao;mfnS~Y;ri>RDBhR>*B4lEj4>UW931JUqdfjDpvd4T_{uLi!z!p$CF z(U<*8n-_${N~?v@SO37>-iI99T58m3V^+Si`Y}h_20sM`Mn!xwID{u+@ zMr%8fx?%ux6*YmM9%P&51dr=9Xb$|jit0cjhx*W}YtTBd7}Smz-2GM~WWW`ouXhO~ zjJp`_FCyHRTp#hh{pyVV+&VJr>{G&IMGfDyR!tkenbtFPv}EPz%2sQ1QfDGg9f~-0 zI$Cm}67I*xH}0giUExrcD{EdY;Hn~8u5w~!%-r+C{%DF}>R#YVBbB^k55xc0-M5pZ z`sLVtHoWP+M@4&S$*Hs!sZz<{u`1?{V5Wq)UMt!F-lC#9@K+)V6PMQJYcMwJz{^Aw z6lpyc6@iOCD= zBd;>{;$YPWyFfwYyT}C^hhbzEGbs_5kQg%OP(*N+pJa@AX zSj?bS(w)sT181AkccP&pvgo-FX@JFu)sl$)He$bxXjVybkA{YSb4#ADgVyzsj~qt$_QiJRaX zN??lMM0Nz!(;B=;$1QIzY(uzFVDUTh+ z$8K`;GXwwks{huDK*`9fjS_rTi( z#>!3+ctI3R75=+u9_A$sNFSnBb>J)!jj7D;>CpH^)JqF~v7Gve97k7j1&DkcykZ)NSVI&f_fb-RN`9HC|z-b3_1 zF2}O&7-=|s4HFJmFmv5utxQR*RiCx$OS>bJl!l>WRZMKFVgk*VKnvyQ)>PmhMHCiL zT7QX(z&8ddrm5HnIT0RJUriuk!XilPKUFaY60~F!Y9m&Oh(qtb+M)G?x~~Fp9~9p? zry3C+QD1f3zo4QT5ceeuAC7*mRvB=Si2Mo;CP>K*46Nnv2`a8{fh)??7Bo|iCBtj3oH|!k8o;YXR9*@U&sW17_&pWXfkj{T={mknRl_RqDit+> zMPK$~iUneDtr|9f_lu}JAq;=2hB@#C6*YiGUp66p{ag*Jz+bB<2Nrz|oeg~r!Q>MIAnSA8{sMPDP~ zRfX3D>Z=b}^kobEobZ8+s}~S5ZUO;|zAP_%LB_p<284{;-2;ohEU(d$$kLin20Twi zEg-&1mQbkEO)i^Hii5+|QC+H_hYjUaw90@p)T#~ql!`LoS5(wirvg$&{#tN!K&%i&buR0K4C8Oa5(SBX68o;Ug{g6%IRw4@7(E4Ol1b%9e zV%p&Z9jAsluxM!0wuV&<->bgrK=^sK)efysL`7gRsGWJQNNI@VRs>+t(6U`ZB5kP= zTaY+7iqhgNEvMe4Dj8NEjH1*E6;g7$Fkq3S%??9)&MyZNrf6ti*MPx_0^C&u_#P3J z5BjNc_R44o++4ns&OPx2ZY`qVi`I!z5qPnR8sbAAEd7r;aH^(V2VSV_R7~-y5;2Z0UB))j;{x_W7Wo)!WxDv=EM z5v@ia1v)v3fM=>G174+~J_>e26anv0Q4S;tx4xw0ohYSFM{c0s8ry`_W$L?mt_+z= zbm*ArfP>A{Q9p1C5xMX8-MvF&*QobJfnQTm2HZ`$%&m-j2;5s~_1lW}Q>$2o{-%&7 z3FnJE=+%;i_hIQvMwD9=fIABVzbb;E;>O3k0UDPU6u}VeD$;L=|ux6)2;VzbN zm&(!qWh6Kb^u9DfH)}1ce|=G~)1l9DH|qr4U)4F-lw8I;PWb~0bdo-n98hC9U4qfcSW!X4OuK0 z`>_X(?0YQx9@xhM_N4L31~L^SNHO63TEW^M1V#=uIPeA5EI`(VL(lTWzqebCk z^~?f<3LWCsDByBKkC+$a)D+zowWbSXzL)G5uzFprM^|P~OXuhta&Dq}&W;m!RurXH z^W@Y;s?q>nETXXSduPME%+NlsAmRlYu?ob2>q=megng_qUwr&PeKmmhsi+COUqs~z zT_&$ZlQ& zi-wj2hJe@+%pTguVRGvJ#lssrCvQ3F_!rw~I-JvqC(KC5T|uarHl z+wjgE5Wn$Y>~icD>+``n@O2e6f$taZ?y1230{P_}Ct^PhhmvOpTL^=uI%?x6TA6(; zR!@qxzx0Fut~F=^c{uLXNM<7m=w;x|ltc#P2c5i{O~>4Wen5ghq9j@=3Ag<0DutY- z1ZBeaQcC*8|QONL2)H%9e9MO*@YtOb~HA{}Z0^rE9 z{~7T#x=>G^bgf*FQP4PI`YrW-TjKsWSObC=b@jZ!bhN8+880}({SRo2g5HWUj+ zo!0^LV}{N>5Q1(No;E-Ow%)dkF5HS`1XE5I12|j?PA$z~OX)bC{=08VtH_UEBKokX zxX-Xs>yjays+=I!aj+N;R>ch7PskXWt3$q)2C^!~3)aKT5tdRHgoLfdeYafOn{Q0~3RS1IyFNrPmC5AP$5o{PJVZrJ z;E^H1s+tySo`m_9hHC)7r=lkChaw8TXx$nWfe#E) z94hEn)i4JZ4Q&ruwpG|(tG-%5_=O&#MTC+bx>9_QuInM-0(D;p{z63=F#0w(rww=ZzZo_8OBq z2%)lc<>*n}Q|p-B-((q8Tg%Z6W+1l&zM4bd2X3Z@Igl=M)dcdK+U>u9MfY}$T3%In z@rOySDnNYt-vnIZb; z%hB&qz*mXPk;2nb>WPwyPNjkseY>pt3X5^m)*m-*!*Nq5b&!5jeO7N4xJZsZH26W0 z6`X84se|-kIqOyo;GYXlz%N-R`%da0eKk4}qzC(^LW4IIPSFB1fu9#q`2fY&MrxP? zi-vaSS;H!ZC#$bIu;|MUvvtIP*E&a4_66>y?A_1%c4&P}r0(`=dWQxvoG_z5wPy3g z;(Ky*!xZ?S-t{zrkBTVNjMm?xqWTqZtepChs${^MRg~W%5Qinx>1pA2ky^FTj^WMD z`X;fuO|#2@e^5tl>&R@Z?+^!tM+ZRO+Hva@u%f;*U{ghPV2_G2;CvO;Eh)1IJR+nX zQL8>{Wj+$4g2eLk7ranC)q(U)cV(h+Pt;3$Jau2PFRRGSTYOij0bE<}Qrf`v2HmBk z;qbMj-e=~(qM@Cq7_O;?RbbJuWKxR3hH97r_f=5~c#n$ez{M(R0iP9-`(f8n9U9L^ zJ>Z+FH+xiv#ssaI86jT~{hQTQ^KF6S)rw12I5bzJwQ(qe2tEmqG{9^HL z8m$WKQBf24NfqV5gG3ZIWwef0#U}7%73DyF%{th=GqoDjiiY-YLu^hx7{=d{ZUITe zeFg|53(u>kL+eCMpamomcfkY}soCEE=9jiVroJ*D!JRK6;PEETmZ19L&#N3`o|Wj2KK< zE>?aq0AH`3vKs_)hwX+Q@P0Yf{V7fw+-$lpMjtSX3n$-D{|(@ta%1EA7|5GDVKC5o zJ}LtLDx#oBtD^5fm{k@Y`~tVTO##MNYI3^3GBy4z0tYBJem71w~p5qvB9Jrl?8|%v4kd5;+uy)@Pz3 z@K_b)K*$7JT9KORU`hlZw}t|%>b?ntjCWt{&^jb40^#G_0U;A?X`QLIRbXUmRvF8- z2HS=@Y6IctBi5Ad%%}*2Oi-kCzADy$k(${?ZzS5gsg+rNCdvyQ>&16JfTyXb4m@+v z>mao58y^N&$qJ8qUM2GD6lOn`PqV!Y{0serJKJBp9wkSw20lq6nuK;0ihC;i40yVV znsA8JO}~CbwD(slvjW^LY@e3n*vc&ThV`Tl?NLgz2IDhDw0vdu#Ifsr_Pix#-d#Cw ziAkM{M1H9paYg$okuQUtkAv_UIXRJ&M|7RKU#;TIPeo%zG-i(*yWUg zT7PA=0bEi=b>IXM`ElCl&^j(E0#6^LNb4iZ4LNrBz1gYiD+8XYqBf4sQ&9$tzRk?& z7j1ru)?FAc6w!j{=-g!kxl83(vU7V-PCY%e%J;?L4bgF0@>k{52GI*}KNa->Pf<|@ zgsFRF_F6f6W7Go1f|%P>D*F*7SxZUoC#OzPl@>LNj?EmoU9^9xRvGZuDl)NN7V@vf zB!F+J$b33HRtD3SI;f1}RK?9F_v?krPXEw^%9>^-Wa6hs{WX9)>96+Hfge^;1GuY* z!sJK`n#tLNqapBXDrx~Q9OR4E@1r8{2^BSf{9a(m(*a8&hs0OZQ5{HFpHSYR72TU_ z`DxfR`NTHqT|loo5^#2{Hqj&4&7TSXc0dn#%IZ&6VOd_YA_AU|m4A_B**2-PNVT@_`(_o=7}+*w5#ut!Br z;DIX2fXAw+2|QUv88CLW*#Xei>q=h~UR6OfvMwJ%3w0S z-_n`T0KP7w@~xw!YMf#l+D5rO35w16byBUU@K7HL{-U@@&~ht`3bRuxDtE(oxg zmVGL2hg&U8%d@L>Y-TkwgO4Z*D=4`KsK6h~Dffxi3v+1vOup1JSkrn?q+L}S#Z>I` zU7Jcznu^=i+B|y5<5(Sdee}g~+82Gm0TFq=Jsn!qz(+6z=%D~4;Iz{5^`eZgWt2n) zTvbH=uew$fymeFq?pjdG<*W8*$TS4#^Q4P3rL5*(#ouacc18y!Nmwe?tg0rXw++WqWlEwnBE2W*KHLKIV zGnH2zc&UmqAcN9fQ-Qb3_;iH@#?Cd1`VWM`kLBpBfOm?hJJ6x^WntPCULcL{EB)*T z0&k0=y97QhNB@*#1?ks~Vwcm^Pesww0$+=ww*|gidwgo=Aj$afn0YL5K;M#Fu8e5{ zNz?tEFiFC+drpEJA|(BY14F#*)u$Uo z{}wsA5&)OciET(eEZU2s6_6`kX_ZE}w4}-Xi%ZQ27uhr#+m~O)MHk4`q~wl!glljb zY=moaYBp2)hA;7T8&lxt<&?i9+IPn0$=OS^a~r@bhc#RvXK#*%z@MwA4!mQKFIulh zMc|u*6w@?q(43(7^l9cDT6}@B`}7F-h6Zf{i$U#e$8}X;Iy4?uZ#fWeUA;7e zCq@6SYF8af1$OR901($9$)OCXrMn^mi-vX(RMrlz_^MzxdVo{ql=B7LQbb`u(b_R8 zro5)hsUB5n0FPEt6L_488o=X46e7|(BPs&VQBf0k?jYNts2!k&Iq)bI)q(ICQ#tB_ z(KMhF`h?cJXbmhfv7?Ny)qPV98^GPx3A9}w0Q*H0Dne_m4OJ01MMOa{P2UF13EI-2 zeL%v5OljRdg`j=FU#Tbup1Xl+0WVZh4uoyV7W`*Ympb&p@{h%;A1YxUo1m_v`Qc6p~0 z&WTEDNb1b2k=5`%sbO5a%6zAlPp#Z=m^;u(Nd;+YyVyj`Fnm~-OS7c?PEKv1%V!HX zTSV@)%!4~LScghB(r=2Zw_`LQR&MStnv)V=PU5^vDP+Kc-9sa>d$+jQTwOJRyNPH_ z<>=|1lmflP;OH)t>G0?Zxu&q7b%m+Bn`K$QLyluBpRLStF9^{7mB`(XyId>9`l%dI zrG29ovnP%6UODvvIr=+CaIR)8U|U44I|n*6$g!k5Q}^y+Xv$!etYu5;GM53FH6@Ps z6z$n^EW5i!XPApIDs^$=|B7cOf5n3kd-qwh{((zb z+=ZC6_cy}k;dlWAKB=M{7#+3JzL_ff$-Q)|*#NG*QBZcujtZhvKol^2mWdR#6K`!#&Bla`56iGwHOZgE_Ku;a-pA^f5NhHcq| z%%q1;*Pd=De7AP~D1l4LF$^bK8%0InrYdRxk5`d-01SzFN+Jg?p;j#*VZ#uiwRThl z64^a_07epKd_dx8B~b<5CnEnHHQ+~8c0>hCV6O)zvfFF{AyM{~H`j^VpDT;(j{={G zB0O!YNoOsAGomP+vR@Ym3!@|8TPkYWf;I`allpD~_fk;?B)yV*vALq%QL6^aM-7WBeC?eb;>N^7-Eh4vP zxPBlF*e5Oyjjn)4sHg!Xu&dpFm}JZvbDt#fkS1f^)uQ6$>(>S9yS2pkGH@i&2b>^8 zyc&4rSOs8BMSawY!gx#Ym!lfpMW$X29J{bDt>`cu_EG088_&%6f4w$sYD4m#Iyh4j z?U5CtJ+eZWHUA&de`{*M=Gp@HiXvMGGmc=sky>Tj2%H{8I66Lx(yn1D6{aax*Q!;W zbYmZzD?(+n;CfX#x(A}bNh)dr*A-E?EYX^!iVfhVn+LZgOVb?DenPFZrY@z*ZCi4^UACjMFs`nls0lRvs|E@3{X&Z?XEZseCYFBa_Y_00n%8oG;t7Waswdjs*0_We! z(am9CtehD-zZdOiqtzrC{hR76$kJ*|+#*P}mE-uzm}zr&?aDf*itL+mbUd;xgZeRY zbn4Sj67{iLg>%cu(WxIH@T@2bI`Q8>Cba!B18=e|yID!?Tr|vvNf)apB&vI$u!%lU zKu84(4-`_@g;Oz=fO@6R&(gta)`myr)C;Q8NWDy#E~{(THGs#cs0lnyL}Bq8%GaK1 zm;;YhQ43h~m7CRlKQTB|4Kv`;DyjqV>?fVSib`3L zQ=O6`PZh4)E9VCAP!+X-vqThXN9!L^G0hG4d#g$g#LC_0FEsc0`-uL>)h;927o#YR z_60eGimwTnaBdTon*CVJ7OCfc-~%G+{%tvp-$&sbv%LRQPNM9dQ~?Wi105PKYS3!R zYw~tMa)}(>f&{$d{o$1R-~f21h(h1cdQ%k}z;Av)ZGqnsQLv?TjVd;Pcc`cZymOE( zt<$#GAOXaGN$Z=MRt|)9m`}9c)*Nym6oVqI>y%v%ghx<}Bmz2DDBP|Q>Q4*osIR)s zsXmmW?`TdLj>f1XGlwq|Z4z}ee+khhB`31shjjGQ7#{e071e-$Q&Dwi$#!o!x^X_L zL!+iusRDb8dNe*A^{y94MqPj8v|6kLa61)MfqSYbza%Nfn97l(JCx%-IoSIbP6DrDpj1xCq)4ttK%Jm5?TSo8Ppy5oHR7E?};xsABe6?!g=;kOQzxOK1 zCcF=iqT>Wc-p!QvBf@|__NyV7{`4Q?5%5vr;AOUWy=kS&E;xUdklSd|Jt-?x3WE?h zMy$F$N@KFRsscAE>e1LD>H!(YLk;RQ@vh!G@%3p#c$~&;EGv-0y0toW??mt9d`xBB z_Uav%?vGl46EyQ#Cv<3RqAY5__eQ-X%oPguZ|iu@fw)|z`%%36rpFC-T%)s^I9o%G zOS-QMaAKNN+kGySrgwl?TqQ^MN&ZkOg*60tyjXR+g~kQystW8B^=MoX^?=_m>d|1q zDw+4NhmY@h@LYA@I7MLeWV$)^)a_%bMIdD!A2xFnTgmH%+qJ&A7tebu)0RX5_k=#=07^2HY^}*>1-F zt5QanArO~?x_NnVwt^g`n`u(Tl0wZBi=WBS4Rqj=JA}#OZW@6rizwVC(AqpI0=F8Z zm`=i1B-l!7n5`pl{U}PUZWXIvDb);!!;;sit`O}<)T#;mPZ4z=JkfYr^=d%8uTVL< za`fmE{SQA(efP$rDyyz!F0DTlYfMTWgHM+Xuh&c)z(p$R13o6AP;pxSP{juD;OX>M zAMmtYg2>%qpEf|_4H1^Sl5UyhmRY-uS>A!!m=8iD2SUfy0tgw$?4da{BC~ez5&!L% zeE*<%w+I-mT2VisPl@)SYLx-W%l+BtI4~X^sb}WUSW5EoieN%^71N+ZxGV;}N+5yU zEnVu~iLTlyxOz~IP6Ygeh(=eAo;dnLL2Y$8I<;kY4x%Y?bfT>UW>K`Gbo>k*0NDWo zPl}>6oexhBlD*~Vd;{sXl23o{6z%_rR=|fNl zecu(hKt)yHike?vCHW6pk7?E0UlBTyR(p>4B&@3f;iB($;<|FWr22I^IxFDMRMZCE zq@o5{&DT`gz;BDl{mG8~u0sa=7iGZts~$KGzAA(7B~f#i1>j$_E9!K`I$FFsJbRNKGXqXlQSE&K_ft`}zraJIi0->z%a8$or=nUV`Hv#7PWd8`G3$?)fe)5| zZd{!*K!Y*hKQ;r?`CUaCbd^^G|55wMd8ENO@rq#T+4V?+;(CrrYL(?>HQGRqZbShm z?iiHaYy@s2B6oc|u5*)g<09?O4EUgmn!v|YlmX#YGTnbHbbcFY0hd);{W$t_^bL%@ z`_q)~6`xN<-+vJY(aJo0Iasuhk5)j)mOKYuOUQmVl1}MVW~mCQ&-56#AU;I1hTr8Yy`O&J{8wuVBB`J(;|;>1CyGSY-m!I z&E=}JyI!3#;Qk_VOX%eTq)ygdVd{)a+zZheaEe}4%=7({Jyz?l*Dum?+3 zMzANtWEBDKo(*`z=pb{W8F-V3!W{%HejKr6*yDbEb)N%oRQF9F4#Vdww4!_SRQg2m zfvOvlkBcZ;nFalPW7U8s#}`E9WjVUC0Jj?xltK+K;Ajo=GDG|6_*)W*9}{q?04GUA zS6|>{73J#++(bngaBCISfzwoEavm$ER#25}MS(G#`i_oFeW#06Qyn#coh3q{+|4!c zauJ1k(mHoZRRn%rL_v`j-}&u40T5DUpX)122kdK)R!BKS!SYnueSBz>Ae?6ByYyEc<54-uZ(3 zJZ05{JOj;X0m)(Tm?I6h^8+&WoGp;C=XxAS-oYI`%kld%#+Hp~a*Cr>F&9`=o*sHI zb847CR>cIeDrVMXQsjfR*hb|AIkn{2kfW;>@J}kL1D_O;FJPlXYmKF_tpndJqM%5t z9Tll4#|h$@-*a=9Al&m)1y1yWXz{J@PPC`^+*f^PJpyAmllJ??5sA5R10-yqzMS|X zF{cP5tDs0C96u-#o{*!vM&OHI94L9pTNUkwT4lh;RMf=LnwqoOot!4xSE^M8{E>)8 zSB@M9TaGit<6-K#0enf69c$nf+Jn@a4>HDA+vR>h2b zRA#9c^On(vnMTErCCbB6!>pMQNHx%Bi!X3h){g)q&A>1K+nsEnp0nlOWmn z*^vCVSR7QA4JZ8U6ZlCL)qw|zD0CXFIZ-k3Ua{_T++!UUV_L_nuN;W`pqNJ3LJW3_ zhIN7XEO`NBuBgmcs|Ikwa#W%YoG7A@Hm$XzVoJ)o&vB1+$cEOM>MIB0zC7(e3i0PO zf!dn_@##L}PkBLNk*NA51su)HOrI=%;QcCU0v`}jU{C95RWy$;ej}$)Etyd-h{}?q0&qD4FBVaGu`ql^ z!{@-Fq0JdX!nlvefJH<5_14y~hT+$heH~czWxrqA`s%^gMe3^wEc&uP_-B3f;;U%b zYj#g#B@&d~mJV1nwCpj2pW7G#i-wl!e2Mss=GXw%^|4+P$SURK(t?un2rRO*gMkV|$t^z5OBt8YpcxRBZmdBRKK_nEO0%q% zC<8*KPc%$eIR6(7Toj0yl#{O z57vl%Kpcj8(u(f;((c0jlIp7pTvJ6YAdb9yyIfdbHGCBf?M&v;8HxRybIc@>nkJM1 zc|2V5KHcA?Uq7u@{kERwwr-+mudG%XkeF^E!O@edRR_MVqU>#f6t83jqGQ&HR=@*Q z)B=+2l9dzP4-rg(Mf7h5_m{-URq8AQ!p@Zr7#*1vZn}){!*!%LfcL4W4*Z=w5_1m^ z77Wl>TA!KJfoqGXt4CwosF#j*SR9}sbKq}P)CVMR_YnpSLc5Q*fduaA(TFU}oPz}g za2r7&1#mBs01528UtUs+{t_0K4_Fpvr0yvRQvf&VfE2*x2rRHzSi<68t_3V8!2g+A z94)nopGsxG`(!A(VGfLskTW3lc3QvCOv{ zApj)?*r*EkY^s^6_#05vBSUim<-?0tbS`DUWi_vU;QA`cfS(aj*>kqPi&Jz;-m}_3 z%u#VKQB5;9AF0v^{FKp|F5SC}c5?%`jXabL*LW?e01Wq1!yGuEq9$;zh{6S(77^UW zVkq}~=;9_6aE`jK192EG=(M7H)5ZLFE|lG>0fe$61;pWq*)I@^Q-&>Js#S7fv?{hz z5~C?c_XGg=Z56eEm#e4&yh21n^s}7Br>hk38|teL#HZ6TJ!%|Par8}fWU^Zzr+C!v zvIBlhpJLU4hYWgjM(enh1DBHez9R11>Z>2CeOJV)|6qYPucV^81V-QH%ES}()%59k z2E0_BgSv%n{r~}A5)NJAoQWaSxpM3Z7fa*KqL9YK6(E-Z*Ah|JcvVSaCpmV7!6g1$ z7q0t8&cL%()C7J*MH%p9eMH<$^Kug^&B}?=oSbNK!qkZ(!+_3|T3w?3mZd6;oR14h zzxadSQsRBUkH;>VH$Wo}i$1b>P$TvM3mrFafCj0$%?Gg1m-7Z_(0xu1NVj>$V0zD~ z0V$JL0~b1X-T;j_lKX&+Xm1OSqq`5tDEDgMIO5HYkm1cJavit23_MGKpRApuBDvqRZUBz^?o+l&nw!&xy->;)J zV-(JoQRs=Jt}YaH%)HLyB3oZSU~6wAFpr`c0uRwi+$LbB5D@&FPK9X){ODCb1rI~VZAyaqRBhg(o zsd}1}(;_E`IZ?{XiBeill(KT7p-8Q!W2Q+RR*>4bbzq*r>!axXa-pRPC94I$Mt+a> zeiQg9{lKaUT%e+wLM4@r5;#td-51JftfhJlD!S70Ayc<6nIv!%Il6g1Z-B;{GQEA@>gzwH4}iueyoAc+E0v z5QC>MFzLuY7dw*1>)PRMAbs2I@N`~vg>)tz&=t}Jh4G(uL02#BgszZop!RNB0I6wL zk49noP`WjwI9R#K7+gOR9B& z+01yCC6&2gfHFKMqtPpZ$LnaxfE1`3nbI(Bx$u8*wOGOn252zYeBiW#r%9DA z)lrlIshR6ZASLsjC<=>!QzQLTb>3w_hDXV2nO+{eb5^sNLd(k_!8OCn7~B`h(&c4f zy3k+ZAjx?5GB7KSw@t^pmqDEo>t*!IaHS=$E95HRenn~`m`kDS&&zd(PGVglnUO_T zNX?<#6{eiKLb?LdU17?)D@;d3O51IaOIXh@V?DoY`ph3FVLjhWAID|>Knd&l10}5I z52UQGmm>4dk7Es_*6x!&hSeE*@oS}Zc3SXdfH)CLBZYUOwCqll(s!biyc4C=zawLu z$>pfSfMM%IsnsvVidj+efMeLL!*+J-z{=^i4rw$Bhl=a1d8QApkxBS#-A803z_!38 z!gkSp+9q}}#vh>@X)K^!SrekSUp@lQI7r@nh%Crh(Xt=LB zvfn6(ckD}f`2p_2Ve>S~l+ zZ@46t+*7d`VRds?09Z1sN-hdp%MAU1&eRO}c@>$x(=b-ML@QvXq8hMIMGauTh?eq0 ze(ZXqItY%G6U%f@oUr=XDefe~&&tX1-IFsb{#;r-%eMN?DtW51pG1PM8@TVRG6FAJ z06IUD>wteZe;uWT`{1m-?C|6Q3LVk|hxn*?m;pItJWH&Xqq> zX0_oPlbj*&z<<&(FEh07C(RVM{B5|42z+YTh!`F#T5j0~77d4v_!~8>0*i+B?E@mB z?Os*_77gv&2QNsZw=`k{IFa{>x^KV8c|BnGiW=&hfJH-_BZh==Qvo%;zc(I6rV#*mqG8}QTyjORPMr;6IQBfQCW`RVb zLu;(QD%J)rBO=e%{&+P(f1(j`;2SFH0}>`=PHVgd?E@Br+L3;{c>aw>sHas-Rs3xW z>MyC8`5*(8M^&ZDi-3PtQ3fP|l8erbqJ2lS0{%@!EgbMVVafh@q7-LiEm8ycd)^VN z^aIb9kF(tlb>RSwL*!Gn(1Wzj7HLqG#*gIaKE4M2YLGRp&GaF7KX8id$wL@g?-i-@ z2%In5rl3e`sZ~NBIz`~TRf8xfrd_;|q`#|{Ap^EmREO|yHM0yjT63ramse2+Tt`K9 zAQ`)>@RO1YluMqq{#bhMr`m%VkQ%!_cwr7qsa#h`%_v1zm{x+9C}zZu;%}cAl&G%b z1;yL6(Dg?I;=P3Z3sTC}M;`&agFZyAe_G&@dWTo1hSa1a%bAiT^T;~~H#EyS@GzZbvj;jfm~PJf z&XNgL@$SISYnFAJWqrJ4N4DM)ypLwtwpq5fkc6vp^p@bqv=~iWj5cG0vFt6=A$GEK z|IhT5y&8~r49B`J+I8Q-+p$^IQg3r*Do|n{5lk7~NdNXg>Z>bc4VX|n>zmo~myB_=c0fBMG*S;+y^^bCNiy`pO zIz^AEFy404>p%vqi^#tSwSlZx@0X+V2HZnLuHu)^IY=5OMLpm-MZI*yT`rWM=3Y;O z88n;-7Tc)zULY(ySxB51)qs#Fd%5eXgu_zqYpch4mw`y$|bWSMgPwQx?lP<4gm%Yxh$raXwSg06b4 z)S25Z;p)>9g1r-+DG=`^o2pxd^`gigSYUs18T*^(5OSK1=o*laE}@&bqt(2ITWYq{ zsn*_B;GR(g+($(jbCcE5J$g#l1tnjI$ zy_~m1SB=v|oeg=jbb8i&0&*LApMpuEA)gT{gzon*oKYK zJ!xjAeYU4efPS3_88GgY`|L#Mqj0Qa?)A2`Z0Y@gyHIn*U=?r+t|iqvNXQ%)Ndccw zQ4WK>baBnO2!2SfwmDb1FGf+y^LsMx7s%1^1a7Fef_?C0?74&)dhEKLh5s}7I#75Vb&Gfk5!t0L84KjnV& zZf&y^<__v(`j^HJnhvczs9NB?YKW@X(D?d^04HdVS;PCcS3`jG8q zdD!OG@-*Mn%J((TGhPuhF9Y*Tpu`ns&x+Z&%52Boe}su7@-VLo@WkbS!c!RVP5Kn3 z4ZKT4?uER84vpVLy);c;izAFr34FMk)sGZ-oE*Ix_=>0oyjn!=i<|~JG~zQO^KkuS z(LY0uOS_+%m|0o-#LAQoqKh<275FWyou+q_yle2JzH?9quA*;M<-n~~R0CE;w7DB^ zZo|F#-!`9k`f1_6x8=XJ$4!5A^9^48z>$?H+id8bSnassqz-00G5VV8@^>(w?afD~ z^$wm!?59hWfy>6@zcE!dL^XMg|KFJEPy>+xQTR}T!aGr#pcAEzwvz$5pN`ck5Z@mi zHL_teGOd5-VDr8ve)s+>yZ>+U>gG(HEk`);|MxR4og)8J;9(cSe`@{d7C0UE|5M<9 zbAg9iMSAsx={As6!Fma40l9?S_TTodXX)G59@+I_O3BLD zN>|4JEAq4xzLie+|10uL$1%?X`g9yOfsEtLM>vkVqpEDgG}96DPkOX{(@gv3pY)hk zVYFo5BhRSZ^V-F8PLT$6=nB~>ur25cA;_hnD}1LI?(Q~?@GsvM6H7kj@h__bC9_KT zOMjEaGMA$>1fC$GU`Xras0h45Ucek_gq#Tb7b4^xTJtqR4!moSBCThmB5;KQmApf1 zO?^W&2NpTo7h<9EX^l{yC-Ax`g2%&A1dn|+V*PM|L@aq*&W39e?#Jr8X~Q)MmutAD z4QD=RpDaG<2LCh@3YW<_FC*Za1=&&(iPE~~y}%vils5(QM!Qq{n4E^769KqX&ZWagT=rw%5Lk6P8J2Poqz@Dn2P#$Xt^ z*S3L0a`ulvAjjM3?qw%nkw{I6;MOSuixKQ!ix44x!D|n&7@?;mLQh!)`(4FESVwEr z3oJ(HEs4-u7Quf1GH-@_StB%nKTuH)d`;dTaUVGW|1P31%4v;`pJ3^z6+px`KmY~0Rb%J}J%C+S}oR^=RDD(t=-Zo|$gBK(aUOa3m9 zUtU{BRT{uqDyjnqRMY@Q-}RI?zW0h&pAyJ7&$`QIYQ@jmEvHsyh2m>S9+KB>BQIY9e`sXI;wb7M5%%%F#M|;R)Mdos0Uc|W%mOWdGTRceF35YTt`IZ z>@i$H4Rc`8(6YyHB{i%9S5r|Bu;|OOpDYHOsbK@SgNVx6W4MJH=D?z%Wsl)DYFGsp z4K3B_Vz93oHh{~>>mlV-G2CAbbKp%XY65Q;k@uB%Xc3|0N@d+waete-Zv%1Y-B(N8 zo404I`x@?VQTHui(S5DNy_tLmiI2~yuMBvjit4zHWiaa-JWms=@fBURI>_d$$2|2| zR8QymMCo2$7;+mHV2}PmULSCO5rx4(Ybkx{yAQ~Z!39NHo9WA@_M%~UJKPJM`j_|RT3IoC>eMyO)?|NqY7$ZvUS6bVt=)u2EHKcz`~Svt`9iaEX^X-s8ce22!pTG$5gF%fn3QfJfTuamadKYAKirbA;l{nMoe zuvyegoxLU}--=4(J2aNkH|iR|DI)4J+e{koFACELx68>pqtXf;8uyCOt+l}aRn&V; z8e?U-bYWL8)txFQdvr~00QovI_e2pmTeQM@OzSqaH6zWs&v8FXty(}FdiQyU*72&C z1J6}a3)oRn4vf6al!n&_)T#=EpL?|!2ouk%s=O{&+a4eh-Qz3s5;7ri>Tdmj2dk$l zp}r7BWJnNqPYwK$XnA6_4z0+-{!k_Uaa#5o`W52!hsq%X4(EE2s6VG>4d5jGORYL^ ziipBcqIGgq1fD)fk=ET&F`YEWEa}UpAmgW0{CsP({RmJKJapZYdJG3UKuPPAtK`~9xMyQoVsA+^T8o@o%3*MHN}1FjLd9owM+H@Cq^>p}86 ziA%rV1{20jHS4LGdYUScw^33J;P_R8au~lu8SbElIq=&mY5^}5Q5e6ph){Crf!7}D zs|xI>s0qYj7(KM2do$In`x@>qQTKHq4!!$YhgNiNw#(DR2NiKM8AwH3&OjWFxHw0P z`-|o14I7H_)MR zh3fS~;N~bwy<-IdzczrsrDmq;sPw2x6WAxBF_oidbZC4d>ZJ^Dg{r&u94^|QQ>zR( zUqxp8ERs`yQk5Kd*lHoFd)x$^Eut_IXq^%jfu|2rOxZ6bXD7(f*AM(@b=FMH#w2DX z@9&^O1a|=j9-@w05I-r3(pb=0O;s8@3*0-3fOQq+Lpge{s?>p7i^%^m~;&SfW zNZl7}CT5DJDt@-0Ue{nv;?IpD8{f<+94)0*b>MO$a>H{*hej>x*?@H$&}6ef9Q;Nd zHGqHCfafeck;dOdSUw=}cDH)VfjDrR(IY!Fir(y}d6jpC!T$j{y2pjU_16fe++YOm zsG=rthqa5dht``Sb+*9IPbn(WdVD<%0{qqbMMYZAh}3xm{(X=lt$R0CkH9~RsJx(* z;DcI%92gDHS$y3<@LTv-3_h%eRp2}oHG%s`rc1bwIIbI@^+nCU3H<&>(GLdQv|{%DAKw|+0}vTYthen=(+(~k+Y98 z6z9W~a}V&fwSuzyx)vaV%~R>=(0WSyzYkapYG07FF@wAdO^UfcDg{OwCW;YVmn@nk zCM05c+{eOb$|b>!Eb$?dv>vvoYe0sb6Qo7-xk+#-Y%v*z-LDnA)~0R-ELCvXb$yHi zT!~|0T6Nopnm`7o6QuPe-JN841(w1Vi-i59OeK&s2QLHbYdV$kZ}bCGFPR_j-ON>?u2-Rerz<6o1p3-E z=6X5cetO!-J%B%GCy*v^mQsZ|8lUxYz^lu0G#DKc-V9yBzoXaO?e&Ton>iQu?wuO> zZ!Lr9AvYpqA;bPt-#xG})DGR2UklxrUkk%vqo1lr5}5@Huj@NHI;dovSvaUT!Ne*e z>Wukw?F^n9P0Vd!sS(?;vm1taP!v!L#Yb%qZG~E4a`FH)OhYJgn75JB7pkrB+j^Ct zmR;9JYr)1Q_!EV<=+z0*V$h4lup~l-^$;pdVDk+fvyEQm@eOciqk68^;#{LwkpfEb%WO+COQb2Mm|o50B1MAY5 z<5rC3Haj?}<90N~gLZQ8OS>5Lq{20JHR>>hOFXsOZtm6J=v6$%#fqL-jor#=?V{Jj zd#nd(qM1(^_~6z~TOJSIJUdLeAj6~!GEBQ5!^8_ROuZmUzOBg@WSD+Ih6N}{7qb7C z{NB*~@;hO0DZxcig1KOrU(S)<4DH>V18=20Es-pmO=AxwbHPLz7R^qSVbSbF85Ye> zlwr|q%J8C2rNTLlzuT0{fYWqx6>>XjnaY3+D|tEy zq!PI%m|-PiKt@$A2BvZ%24uM8Vqnr2G2p*CbpE7^1S@ZDerH`kSs!Hp@3ONiD*+01 zl6DbYRT}0S+g{ki@SX2RIq+$t>Rai0#-b;0u*&#e+kUX zxt+f|O&wg8&puX{LPnF=q_E5rGhPwYV)%0vH#So zm|GeNt*gg_4g4_y*icIJmPL9@#1phaQkk_rsLwp$zF_09&W2vKLwY@&jb#gAH=nMS zyv5GgVrQuJF+FLQZWhAMko_qf&O$L+=?J0d26iN&!cGusun0=iZ<)=s(tuc&8W77; z17g{1A}I}sWvKxX_ZjslMRU%aup-ji=gbLfQjlR)3NjJRIdj6w6q1A0W{$rf0zPI` zH*lFz8L*p7eWz~AE8|Y#WEpMVNj=NT`6XM7ywVP0%yRs#oo=p z`Ly0f%TfoNq}zt{4Cy>*>2$~GbjRs*$LVy(=|mk*I>ehl(FK=={rxrx=WF!2Aeiv; zT7c=HTrNyNhWGucxq5$UuHJ8RwXGX{ZW2sS72Oc@)k@~JiHW!0$^$2EVbeigLMAV z)at!7Rkfw5sx7suQK7ChAzBtuo@j(>Le|yJaIhCl`aTwb|aWBEx z7K#P3vakk<(TjAg#&QecYo9c;cqm${W zx<#FCTU7?+;fD;5C9}g&3o^W?F32!8RwVjb-WATG$5RCv*0CVNN)}{T%YuwU6h~n_ z3(2se1-YWQ^Gzn~{G1D;&bct?oC{;lxiI9M3nR|CFyNdUEZ!Gw#mj*ETIcov>0DVJ zICR`=hmI!jcSiMup^74r`ZH7(j)=tSbFl_ z)U_a~5$jJu`Xn7nM6);*&Eixvi)SaISv)%t&EnaKXyQdWj7C<`urfl0brC9zL#Qwc zp~4u1T2VdZ?Xft5RvdvXzx0bJ#u2pQ2%?2GtbugfwW%JtHq|57rh4SsRF7Pn>XCS{ zCYon-)XJN;3+A+G{aslZ`#^@Z6AWwT*sy$#4g1isVG$i0*3q$HXTGW7jkSjw8IUmL z4k(OKsCD#x6lR`KVRS-;p$QenB~%#Haqn`>8G0QpzXLT&w!2Z2VV=@gtXlPZ&Ge?j??!V4XSbF0?IuROAah4~k|Rak+73~Nx3VHJ{_UFbO9 zU_!q+7rM>4&}+_xPIGRsWS98?0VIF91rMVTDhxvIrNbCRDhwfUJO2}1)Bm=ei!CAY zTp%LVJ1xp26v`(+?@CF{iKMR4w@!G>A}h{0b6CeXP8K8w3UV(Z?4wo z=y1I0BNoEM|Fx{T{Zbcr%wbo!#c4&R0o zss31scN~A@-*E)qVN@sZ9;14I{;kSR;2N5sOqnIK->!{Kjg-Ikr@@<>@-zzQ-{>VH&4%r(u&^1i4NgPLb3W)Q>d%;($p+_w93_}~4p)7PiNnhH2a1m5iS0E(? zuC0`-AA(#bDR`e=MG<(TQ8nQ0N;zA!CJ%G8>@q<4cH81VCrE45a1(UE|EsB0Zc$2Z z7BIi5nQz60THb_1Pb%@I8Onegn4!*{6@JjD?8^#&<|*J^Ms*(0;p`r)S6L>0rSL^h z0V|ep^iJO~YV$<1odJJqRM#IB{>@Xs7mdn*r&t7Cn!R1{{}E+6D!WC?)JIhP(`F_E z-epu1_)DYeK>AmHh&Dc-eMaTKX?odJ3eivOfe9_kNx@23(eq>F09BDu4m?FE`LO8rEMT1}B%rYkziM50+eS6}+Fi8O#eP%7>IW_^|UA;|#m7*cVGzWR(_ zMG-jB22(e1W2IaWv}#@u*c>28>m)Cz?(7oBQ74W`rqu()a~?;%O{?Jrfp~U;w0s;r z7Jz~{jw*5ZrJ@DIb8fzBaeT<)XaVu;1Znv=q9v6X8s>OFl6ss$|DivNq7HT1>Q115D(PJsfYEz2{sb9^b54W&sd=wKz;>A z9+oWX4NaqWtLfE&{Qim@Ab@L+a{76B>TOy$NIYf3{PSkM3Pel7>W{)&XQXp9Q?Ig@ zo}+MqQ5kToh9y$OG{LA0h(nPItFX4(#BF|v1+Qk7S{V11qM;jF8dX_s!CAv9W^IgF ztHsu$CG{yS+v=v(1w>m$%+0-tu82-7{HV=hv(*4DT*VbcDg*q1Qf`T$b=7DS3`>al z-{Kh`wc-=y)12OLeSL~r0dXOUu=KpTy ztHAM=W(`PUZl2S6ejI7mfUha#1ZnMK^{4@T4ykXNr%I37(CGwz%A)HA5|5kxwD6GF zEiq4BqZ3?lzZ`;7Izu{isqgt0tZNPddJnl^=wU4# z*qD_+Jp-0JJm)<;V;(wzB@ZGPdbnCWJYZ8O`<~jsgRC>#XbmZ#P>hdPY{+Cl21$qf zPGFV}qy-M!^@gr{;hdzV~?F$v!zFBSF;cWx&QEEhG#?>8d zY^|sL?AXv;OuLMwFO5LOVOW2GB_L-ldIGe+f%MY1ry zZXHEO`T+*?D{NP|!X|q67B#>gDOrTR*n^nq`IZ?@^_*jV5YlUowAGPfe64OI$himILPG)jI)bgf<-;nsjW~i=jn%_86KIDzue&LV3NW zezTPz1I}2@d6l8wuaE?Uifu>FA_(#^wVfYmu=K22%sKFCc3RHDWOA|4W6p(jxkX+5 z#-|gCkk-kTUIrw%#N__0N`J>|g@*T5pT0;vVH&b$hgl@H@iFRS>WY26&q~`n4rlzR zTt}r>S0o>49OJ(^qcFtyk&@xx&+%wP^k}#<^(uoqv6J%ia}V0BVg`J~sOi9$l}g+C zo!0P=zLr3Sn^UA;Dt0TK0lC3Rdss~skV-83@%>tpO#-)xQ*o^I@80EQ8saA`w+4`3 z9+M{)z_V2L#X7L87{6PEVwWjafoB@k1QK5!ZPlW^ z)C&TyGO7wJ#}U8NMI4=~n0!0&WPNd-S#J^1<(>*_g9x!n?*oZVJ_!OGI!tWQE7Fs| zvSK4zEBiIRUs{|E;NwQsfKMysMg^@`y&!OvwOqDNFw7jMH=AM|SXPWj1&TMAViov= zQB5H6xluvuH7^JprO`^cf#o>jQ9&HnsIBCvxKCev${ex4dB5>wSd!=a-B`pc%=6L8d#TvE__taooo0&*+ zYlSsWVdw}?g@$J6OJ6jR2Jo9k)qvku%H>RJx3!&BDKzlsN~LGQ?Eej?m#I^7kuQHpTKH4IuSP?2Sv*;F{y9dIQMM2#OYP z$~sQUbp)+x8=%_+?yi&*r1g~zO%OO^LfIm%Un(oEfo~2Fq_ycg%%TJS-;tWpYL;0B zB*Tu%tkK|)s963C1iZug1b4w*H}uikOW9l!OdN8u5lJ6}LocXp$|!@SUn_a1UK59% z&jngzD;L~(LtpXav`y)Wsr(u-J*X8czqV94;w`@xMoj^UI=@Z8@0sg5>6`=a`gX_3 z33e}qZBKoCJ@@L3dd)S#PbnvwK$1w^n;ff!nWI;!9k9=+dRRVLPl$edjb5lQETIU2 z+6wirlx9|8KIt|F8Ar^tG7{v$nX*^`hM-9k=QOMC?$q;)$ zidD#kwMumGJ2daTeE#oN*znZHHN$iCDmk62@JF5sJE13-*YYrdfw`X9Zc%1G3R@JG zB8eiU>9i%dHBaFtR;^YT!I2ulU-dewGADl@$7VN+6Fjld-|%Z_lEerf`eWG5)#V@` z@ZirIw_UUzq$WSMSaot4@MK$VdJa?gXHOA5qg5UlP|^LYw|c_ZsnPScvSdIOMp?F~ z*j$@fwvtgKkqT`;tc(9B(~5TWyHsR}-zTnA>3*+uux9ChI4~pIyKG2hz=w_Mq!uHs z02y$MQJrDj>uD{v(QE!UJB$HJn)*AQaO8JXcCj&se$HWoS(|g=q|Lc7uEVrQ^hV;m zbE1lT+SfC*a;?_&P#Zekj3y?6JYprr-&mQtnT*Upk&2h3=yOclsvGvq#B(e}c2dzX zl|K2ImEz|Gp!T$2t3V8vq{CD(j7s8TgosQt-}x3cYL@(A1C-Zpgbr>}tr0flq7j~0 zYC|iDr8g8|0i0zEVFvWw(V{!f)MJn=*g$rQ#G~DxX&2vRU7Z2xa_KbS`+NjI#<56+ z!#L5~iCrbkb|rS18#GwL%GXIMK^bz6yooXA!XR@l3<3M4%?R^D>^!knddtTY`@C$? zK!Pu}@-X_9-QS6W>gf9oxW$Lkp%^4YDebW4B5UR#T#Khqy2($A&RE zmXL7d*unfTie(xAaV_IA^ea^8bmay##r8vGko!bDa&su_H;^82H`(+BE4b zdH4w2T6YVTq~pj{>2L%o%_w4MD;;(!QQdr&5s1yV$OAngB?8hDvdaPK3E97Z^n@q^=?Ren z(i36}Nal%7A#J9^|KiM;qJ2xbC0e?UI{lw0*^f2OpW9f>fG6nsB7Yuq<{Z|N8+3({ z4go%{R3SH6mym{D3-Tx0pcn;7Ikw)+joE?>2lBca!v?n2WkAA{`}~$h(CdTiQ+So9 zfIl>G|?nVvdX;g>zdjQEUSfX-BSzNZ!_T;!?i z6#m>(`)}bYSl6q>1w6~Bu5T&4!Ke&4Lf3oAaWjQm8x@^0m}qPG?g9GlX~k7;#Z_*_ zRc?i&fi=wAZZa+zZ?e+Gwr$m<+Y)EenofX&{X_ubPDbeYHW6@GkfF&D#$=B^ufxl&^*b1K_yGN&?m%CI&|w-2Q|bkg}hn^Wx0 z_9_yPr9FolZwga<7yZjZf-;$+@$1Z)XWiEfBv~TYkWgUC`0S3cWp|lC!L< z*mErXLT@@Yj5+j^#}azUxzI<>g&u~=<8{qPCKQm=WM>II3WY<8B@~c6#a0+XVwXBp zdjof}-cO2BEXdGhL53a*GOS|gV?|XYla;L^_D|4UBy%8X$-zCYVk=BZq{4)R3e)+B zy17@cvaUWir%mf&3!)Ar2qzfE;n*+~$A-~3cCdi(Gph2!CO?tyBnUmhhrZxLZ}2PO zZ^J?S6@0>9!6*C`{EGao^ppr4B*s6TN$q4Uqio~tSl<<9AX2Q*>_b9@aeq!Xv$OS@ zk7w{7m6KiMX@&1Ie?6h4y>!E^`i&QOh*GOmPOMDZq_;8|;xK(-oIJwny=a7cyQz=} ztv@o!F)!*>=Fc0d%(gBRoBH2$trqGzg{xaK*%}Hr^3lQp&(u6{@>8YTfJ6c|59ITAS;L*Oo6N*at<69kHM%w zleE`%)obDpNf4o9^Ze*p_RW=Dcd_+Oa~DN4TVGmWBGGvUk+&iuY|S%wQA7*%rMpce ziU^UnA|h;EYwn_m?$wuYC%s0GY;IE~3NqCC?{p-#9v(c%cWETY_=w^aFbWc_e|2P` zx4U_Zsy0hsVnI!ebwpC$2|h0yOAcqjobxM!L)bcF@Q4=aOMX#{>Jf^hJRx)Y;GTY{ zcMhDoS2hXsexmwv>j>OZmtVQJS~iEq_DXhCPOgCQSqO%eE6A{P-w&b{p?Rs>xA<-l zO@fqd0$2)Te#+SV=w5KRCc`7-{0%H{$y&cz;~r4r?VrPqAa{WU8D@G*kg1GGDugki z&en%yyW3;1Xq-&bSohbfBo6$TQWC(TC`UT@c?~2V7+`WO=Y4?LuK~Ng{cGpojQW(G ztv~Bkfj-CR{y7hX5?*Z&343@rNL3TJ*{Lb=kfuj!a`ple>8h39ksNt!f)n6?7YU0P z2D}*dFrIN!o_Sa==ZevxvRJ0sNGFHxp3zdhX(g+NBLAf?A)5MFRV))PaL7Dmt}-B| z6K^{{x)R<)8M%pB9{(@~QaF`r0Eh6;l6{!Xr3UZ;qnf}!D3!le)o9bYcq>=a#N7er z-)pw&K(umO@!#m6IMWoXz_MceM>Qy(YKon}UmH~e?xCUQL3Flh^;tqSVA*MBw7Gp$ zE&oQZ`Dmp&7|l5_)>6Md@lCaHvqc+?YTS`UZW>Go()~p6l(z&V5Lu6aKBjnVXIhX8 ztuRqc{Nm*uCei>tsgxTvv|jLnz>clmKyre#)=*Y9Tj0kA2-2GA1%bT-1jDIM%)hWu z>cA(AssRby4Om*k%xMis;7*X%94`ngM;A|lIJzp);XL!gQf`L&>#e|(z z705~r)Kg?7k16gX6!p`c6-fqIR*Wk(RW+8WtDTOz^c|l;=Y22+iB}C~~;M!)Z2Epze&-H8w8KS~-#PZt;0w}oK`<^0L7$C7>#LP*^_nlJAG)0v9MHKh@ILrg4*(1Fmb4)`+y_Dd15? zWk8=#jeI_!c}XFFKE>!{fT82fb`7||sBHhJR?$xSCC!Q~N6Wj<>0jnuMeWi(9hIG< zZSh8xdC+2rBIhMa&{5eTGV^y;M<%g=@RA>6@g_Y((?8cr+W_8TR1^4frQA|Y>uwWl zghL_ig}X=%e8n3Al0srGd|#!1s~N4fAL7i{8+EDB?BK(YGh^R7Ne$c(li5geYtMNqc>keIQyUDOV_3-}Qn(zA@Vg(z@LQ8^Faz zMNbIt($LN`krp1m> zF|Xh;eQATyj!3PNFRp~l2-U}qOuo=nDAG~cDO!-Hs+sreRYpFrs+1eOw2twDp+9UL zWFmDS+PSTIo0hi~J?-3IZD2qS&_J}EtuP1_$zsriLd6;C@v|0v6?m>uHQ*PO%7du3 zX)QFtD)5g+)qsx-(53aH7X*$Rr)fp=rK;KuvyuU~(uW4J`U7_|D(Z_a zHSh_&=CcayzyG%deAN6^fy2#swA_qSX})NBH94P-nzGtOBi=o6N=GzYaf@MD171}F z-bb{-##&u#jdi8ru~zr`k*{c#=ey-TY=x=>jJ)8DL43N zjkT{?>H@BzloOZ-*+Cy_A!kK=W;f~|JCNQ zg)6*>RBSt%4WaFPs)fdL4o5etLy3KPFO6F*iVV2Fep7ED_Z4ltG0vq{kYT*JmoVU* zTTwMu6!CRF;<R;b0kYk{SR&rd~s z{=XeDgN$#Flp)L)NIs+AKq=HVI-0iEtK8<&gJ01BCQ{+B*-H&%W+($5Y*YidhS~1H zHiI|u>Fn>T+dIsC2Kg5}Yx)i%?GXDeGA zGoW97qRs3$HQuY&k(C*h117dglo2halstC^QV%B>2NE4$S+2(DS0u_!7jX5>-Ety*a93}*vc!6I^jQB;RAnCmZNdImjiAyxnz&Vu1bnM;F2jNIU1X6>PV3TZmX1}x~P}N*l;!31Y7qodXeUUET8ki%N;^SX6k7y=l-dc>qS_(|q<~J)CFuXX zLo3cmO+1JCOCXYON#1}%sPAP1y$0M*sS%Z#iQgRK+g<4+2^>fVxxi`BMArc3J0dQ`|E;AWEJCp^gf%G0cr32mBEVM+Utwb?i~BN* zdo6pnE!xeF6!WD4%r|^WCYSZ{1%=;O*9)Gf zU($B;Mvf~4d$n;+nY?(ClPLAxWxcm=>_`Sgp`J+kvQ*NS_5Ns6r_N|C)Jgi|ep9=w zx2=tr%cN8G|E^>u`iHEr@uE*p8noMdHPf3=}(P`{#1GTQ|0Nm zF;OZ{f2ut3&*(DZDbuLR6(jQE(H^ejLNZ^{J6aoyd^wi%(x5EEDn|lKb4HXWxlUno zz!UA#7+TVsm^e#PMOu<7(vsA~Sz<*htpH1+vm%q@R83Wutp8N_f~S}S-_gk+QWxkT zWKbs7x~p|k_WN}d_%o$OReJOL>Gf!rin1(Klx3-+EK3z-S*j?@Qbk!773B_%?iW6A zU@5=_sQ?$G0$h*^a6u}-1*rfR3>qMd_5ZW$_V2X9K9SCF-XxwCBeK0tvD873*Y;4E zQI(VAktjB%#S)> zM#TKSL=y9@`?*OdBoo~~zb|pdm>-RaLfvQO(DfSa_Ez{#ARQpzdVO=ghSM%(^IU58 zf6l7^O+Rj*OI825XyGHAziU|e%m?FNo?Qbc`B^oum&T?_%GdywLY|ijd7g#*NgwjO zUK*cMQal4oQ*xfAwxu5R5_{!Pi5+IO?*WpF%wr%qNDz#cDHc}?$RSmv!Z{#RICz8# z2L#nVLW9bC0Q`y%6i9SZ?8CI~1e$Bckwy+#A-l|Y3;3c@k@3=!N$L{9$|REt^Lahu z^LPC#(SaQIs24+WSmkgag^-DNna%Ktet=!pN9gogAsO~tL54k7kYTz*4YE=&_ob%5 zeKrM3L;F4(+B_f^!}OP}F*r|OlAi$GY9>Fk9R~E6j`=<8k?@#*wrP}hw|S|%!Fkbe z3(e)jEp)k`y283-7jBY?gweXV9O#NoH)GS$usT>xUaeO-(ual-Ib22ZyudR|tp|9j zQo}2KeQg@ve6-MRug^~A=rwUhj76d#_fzdd^qMSwAd~nc7D4>~>x>;|)fL}4bj5cL zUEDdab;w=@EG^vsOXuJ7v^(!CbvZdat9L)CVG!yKt4t5ogbHT?HN+bmE$tKZu1uEJ zdA;XogJD#Vl>AwJ?pKhZXUtOhmYz7_R}@yh@DftV`}w^I@8|c1-gE8Hb80Ea!{v4> z+5=o@b?7^`O@m0}U`HIcY88Y6`of56m?$nWDa&MkP-UU8j;X|AiXj4)0D#z*rR&&s zZ2c{ay%k%xn|U95YsE$AjtzCkMTnM5w0@!`?5NDv&z^dh6zUP3Uvm0fq~iDKRVbWY zX#JT17uZ0b5r6peS+%;UMX+ns=fm|iFBAWT()dUw{tFX^-^(g1GjDG1M!H0tsaM%| zfJ}=*u1~*Iet}*Kl1Hz9)!dzM`dNWwC#CdC=o28;bq z+COp#A$E$8FXUh!e0LmaH<8jcxn|fmITvR9YknAX zK@v8h79Fo&aqA(rRKZ%~x$7V0s`$UR@r)znQk$a-#5_~Ol7W%s~FrM#4p;~Hx3iZTvs5XSRZ>!h*=An<92gqymMfrIrZaTuK|DnUU)23nz zc!^R)@5VE)#Uk@#zu3&{WunpRi8bS0Y8O9wht|~w6FW7S*9r9GNE}BMtu>=mYiGU6 zvvME_%7+Osjjmnx3I zRy;Z)RZ*-TXSL}8o}yH7yrAKu=m|X*a$!c;M?W9_p<-%EgnBZFP+Mp#f3z2&)uW;3 zQ(`t#0`jB!;+V?p!KTEz>S7PQroPZ&^GGJ%$r;OxmHg-K!eNm53B3Q*5P54=23~*f z0UNpE4tR$-taqp>U$6SqdLt^8P#Jzj`cn5$H8G#@I^ccbP*0MG-&uV$$W$Kug(2~y zQ*1ee&aRCgc;0K}0|4-Y*&XmUerU9)d}y&C2Qx>QQl`+DP@$(slf2bkUEcFI@iQeF6>JHJYQ`7YW`r1%3FRtt2<_1I# zjl5aLhXfK2v(VbiZdYnR3`x!J>c!LyD{u{n^+GPJ=I^wxUeW8Q+}Nlo=?&LETiJdPt)Eyh@jtzCMD54_m&{RQ&#*zj4WRzg-L8V@@ zoHO7keI_k;Ai&j?%70}6JkN`TL5OCU(S9o3Wm*}~*Ere=i4vbOv}0e9)&}Z>Z`)0M z(H{?kc{8P`8}Do|aFWFgHD$nudWkvEy@{*Hm-Q-l@jyb5B@#pLv3C!n^>8CKfL2Fk z$2MxjopWIa95sX_f81Fd!D}(j)Dt~|gkE3pJTqkD4E5j( ze&r?&xR05y0n2ezEspPcK_I^yCFXzxlZRGq)AFH3OX&nPOI_qI`+?L&_9kFCw70fI zGc*ozlT{x`ZiA*7c00D{FG&DMMO@bnrpSPkK?*D@#^0{DM5Et&3ujUWJaDQ~xyMGE z)-)5$fCn1Y0A9JhGbdl&de;qoVYE2i(-iAK49La+EZJHzxUGH7Rux!MTpBB`sS4|w zVg@7_`P1;xV4~@$%oq(WIk-P|@E$e1|CW?CyJ@O}kLy*k1U_$6XIQR1)BuL^dw=j5 z`W={3=-Y4Tqjiz8xg_|z?{s#Z|hqpun|?Gckj|3m(}N23fIyuP8>tS&}6v? zt0Ghwlu(039ldN$5W^|fhS>g9;xN=v2zJbPP8Tzm9g4(@HsU5#-; z>ZK|iVpV7X`;2N(qaPSm+dvnDi}acp`xKktLm|K44UXY}U4H8o&*d zl5!1e)7Z$%xia{FsnNMss|<)2iIlSWj;@g^OGhH*^VH^-ylvp6N)4~f7}ln7pO=fR zXFg_!{-Dx6%&s`h=mrk0hs{?5=nbXv9nAgXYDlKvJXz&wzG?QWKVnQ{E)lLsM1B_Qw5S6@J5tvC>=oKNPZvbaVlv1QC+UP#;y~Z8iQZ!g zH-M{6bB<+g1g@o&ySt&azzYJe8X!pPiXF{jnA4l;zr$>0z*UTD;_*YC!uD@GHBsGc zZtkL6^x-P)ZD-it(hOx=DV*l1IXk$>&(W)N^|=bK^i-H#w;DLk8#-R$XFUZx*Qk1E z=yzJCrzuxum-gM=5x4%^B=e*YQ3fHq9 zi6%%wD@=YRtSnFmOLlU~a^nHqYG`KFGy0_(S}wAB(Op*jO%fAh6g$4VgCSM>rm^js`Y{o z6}Y_)8}YVu_D2pruGZ+SZ&aQ1-W}LISO*HSjO6TZ31zd_*4=i>zGysJk+S} z;}o7|R0f=FR5#GOi~4qbmG-uybI-{^1v)ARw!;GCT$uk?Rqxw+O>HdUgiW4nLZS3P z9@(sS{mdA@ejG|SR0f=GR2T3_qcY$L zMs>xd>zbzV9bj>GH5B^J>snDY^NoPYu3`Rc6j9+^4E!q-iwAvK0aKZ-t8AIf~yGnW_pGc}3uQ!yG4*1UOkKH%Vym%LyU~ zysX3NIzd|P;bu|Y+2uS%Kh~>kJ(xe*;%N1&*?aXWQfH{mFPrUX>U>lU{L&0{0e_>^ z@XDOi+B80E*1KL&h!=U!_VeoK61~crCy#e&`4qb>HwA=oiiOcSLm{3eAK>pSve|uY z8a}dC99fIVh#_^7p}+ZwqkKeDXrjqE@Ud2l?&B2B^%NaTFu5l9IO~um&{we==wppP z2L6l|?jJTLvgg$|P7;UB-L-Jks-v>M#pJ#1A8nnFsNVB>l_>=Lr&0Cc8o+8+ghtrU zlI}-cGhc0WsfLfejepo zv)usRWn(*kOO)1qUJ$r!fM6I!?4gc_pPQ{35I6anQ8%Y}ki})i=Bt>$)66%4W%E@t z|9}Zrf!<@Zus^5LBS*McWQ+j!Qp&A(VW=qn!`#(@JD9B|aL1CZdYcv=5_g4|Cm4C) z1)OH)Yd{R9api%J!5)zH9a zV!>aa^4~L44dC5MrTYZMZ<}HrSXPWvT%rn3m|_Fi)D=GM5yb~gu@2nAwuUBf%aW~n zo7P@l5cuu^g0u)Fv0e}dQOkM(+}zC9fOyVxs#+ZUu%GlV5YJAKmX9M^Sl-Y&kgvq-Dy1%V{(1ZmCng21awC8)P)`4U7^fD(MhN>BwZHL3~R zy)-bYRsu$YOdlY*mC}Ns-s_9)KGgRUaY_ zYU<*kHQxqV6Zj3Is__VmPHcqA7?Q~jWB|E7B>{$p2m*=P3DRO{h#-)togghLEP_DF z>;!2IF-k~-1w!T$u$)H220N2n1c3yeJ8jsIV3La&~m>U+G8fkJ)DsAyGSzW>!P0YH9VR8B&44Q>;MqdpCfFl7+(1DALE zWG>Wr&mTOZT~y>qOD)sQ+b%;C4qtM!x~PwE8TSQgRuud|qeHW!vVEH{zpgRl+=&`8 zMa{Vt*^+fKG$j<4SZIU-me!om_K!5q8}urFd9bbizer^v382&?VYSBTspTDZdZ`1ujH&^9lyVC?t<$|A zuy24Mtt#kD%OV_Om`S~}eK7BQ(HtlU?_50Rvt{uSLs{|cMvUty_Ksegq{^slgC-R{(>v#!=H zf2_@vSh|Xn&N*2N!YMT zxqhNXB6+jUh&%Ku{kEdAjjddvbN{)U!t#}0OO&xcSw>+KWfV41Mq$G;mVGA5DH>rp z%NmKYibkTW!iHrn+ewsHG=3bESGrf&u)=HUfMj4wCs5eBpW~rcMThK3dL1nv5|zm` z`ohsLSLiEa^p(Re91V4&zOw753-JS7GVcfx6+kuwH4Hh+i8r7mlVoKA~&l z;F4j%2bT!hg<@~Hdue9Xbf|Plu%*vLXkUp=G6}Nd7(mguSV{= zV|U%LyYARsckHe^boaJs5_jS5vo?vNy_}ae))^<;JrOaXgbF)4aVWsh6Y8tHHo^H{ z6+b+5QWlTB9Udmj+T$%o@0TL7wq}+OPVlCdZ3blNk#{ZzbM^_<8W5{;tZVY6EkG>F znk$Q2Xp|oeFKzP6f6$lMKZIS8uAHMo#l+FNUk}3UbqSIG)RU)QwR+<7U{4rMthF+y z$WTklB&mk(9J^wVwNNpU-BG$0FVL%esQw2x^|fjC+frQzK0Hv8=CfWB$aq$pEY+O3 zl@9YDBD7t$p>nzgp{^txDkf_1X+21PUau0^(rfzKG|%(rY~T+EO47X1BpblZbQe>b zG(TvYTNTKDr;@Cz?0HJF@4cb>pVF`B(%YeTC`yO5B~yIKcOMP=g514_&fr6D@S!{S z&>vNJRtqz{a&ljr#xScv9Y|b-To_bAh7lEH7>>O88b(6q^kBa7f$=I|{1*BYD)cB+ z>@WJLHvXtU?how!O^^LekNr)@->Y_)I(@MGur2dL4xXWT$A%spixY;BV^_kDEaVA4 z!Y2F(oA8s^3aHiXHl>byQ{lBXZjKE7CcY2~LywuEBY-a`mHz<(7$?G=wuU;Qro$>n z#14-j%jG&FMGD9y%^iek=MKW+66-@2>oGv$T2Fpj{-nzI@f%K@;7))$Y;r+m^4JBN zP1r7q_Lw-@V~Cc}hE%u*%UpMNu3bM{#r<#nE9DVr#|j4nIC}cX;gX z@YvnqvAgIzwYJ{=bBsuwf)L?hliVZ%y;gL-L<3H+yHZ7q+En>+h6b=6^^eDk0a*z%W z#Rlu}{nXq??1XYu{#b-2UPe`fmS-Yid1Lh>)9OMW5v%h|U?Y2^77g$Z1&@U!kw-tT z?`)K#3FQW@pqx4qsw>YU;c34acV&nfqa}v7E0i@ z`kt=Kn%1exiXd>#06|)x^Mb&02ME%-#|x4f*L@V+W&t;eV;|FMUZT(&iXNR{;MZm- z1OC>iCN@v=wh0m+iO0!5Q0W^?EBkpAQKnw(!lwwoVeVVMP)KCr3&;n)WRu!MZ4<2Q ztiU1Tj-Enr3}y((*&KMHMl!r|(y(ZV^5O9NEZ+uj3w?9h4H?T-0g8Vz#X9gcqiVo6 zl*(<@+qA~22N{0A)k;q5ZCaanL0~z$#D^u-A0f$S4S{9F_)|u4TAe7qZfP}vB$B7q zX=$x$(Kdl3;sj}J?gfEFH@0$OW!ffEtjSZN9pJ$zx&KS0pQ=giX2~^xnNsNyh2qYp zSO@ayDH$lhvaPuPv9+h!ssi^hstzpMiiZTYkd~6*04kU|}P6$t* zu;?4Wr;O?XKCM)`(AerR#X9iMMzw%tTXCVWMKChafKQmMCa`QPF7%D` z2rS!*<2q7p5zK!luG7?3pCyz5A2+H7B(B8f!r$0@PPOt!A>q3E9Ix3&o*EqrKWbDH z_%WqiN7MR_7aYtyf8!%H2BMYQiVHegZSsLWNe_6exvK%Ol_&xct*1cFEx_%RN)Ow; z_0^hJ1YT@Z6L^_Y&K9k&dqLp01_)}yE_*9FS+9AQf#)eFNdo5^RRiKWQ3~FrVW$=m z;H74$g@LO)rN}P*iiX=3)c{`YI|q2JQm!<#p74UezYY+jHCt~5WbFc;sg$!w%l#C3 zMUJ%elLh=x5b(&#tZ}2JWCXo|<}tD|Gp9{W!Qb?Hq@~*=i~B5#<~R*%XNxyFNpeVA z%?xEgLKt3|xm2g54`ZUrPw{%dA6NigaZFv*@C=KoE3Q`bnB>DMeY|N!CE;j0ndL*q zDVQUZ3@_l(B{A?x%83~8dzMU-$XC@E@`(VZ(xOSR>HE|YN30yIa~Uu(%h@=LRj4os zp>R0IYSWA>8g=|Rn(L)LXWzRHwY6`r@_h{ap_QeZhQ{TKUQ0bdY zs{!20-Ux33_fyJEI9mN)(CjL}{OxAG4n!-r6|eg!^7%*ENP(lwT?cYI&ie}CxD!sL7MKgzwWj<_`$$)#BRxS1wt!dO?7t?Bm z*(UNL_*+e@0UT#<%r}92tiknr*vZ)XvDvBv%ZhO)|3Vd>H^mINh6ParVoRob7y)fn zlBJ)I2vyG1*V4lb#mNdp5xBikoxn4Us-qZQeFP04Urr!H7>Ggnt7o9MT@7uXuf#X? zDn}RKElQ<3W{JMKp{*qi;7^UJ0dH5z*`oCsTdJawhxyTFs}4jf`3KwRy=nPWf%}=M zCXhh#u&QlZ8(LUR;QmTEL0TN;Wz7Z>oD_T*#SSX!9o{`Ac$^wZex7BIUt!vSB z1Bp`RB9IWBE-j)IC%|&R@%>&L@boxfd%jZ+c)A6=x&_<<5>Fo8^foO*k~Dzj=%zlqP^Pkun&b;X zWZeNWi&iThmx!*M7Dr8nB|rD-OnnuWu#$fXGD&?REIxsZIMM6xqj8(1-E+G_Mpq$6 zgYJ_rgaUHgTgZidnfT%;LVLgZ$&XLqpII19!r&=HE(XT6WCg@=E(WGTGG)U~Aqa{h z4@H2tSPb37z}%Cm1f(FPY3SW`uh^YUE&rspg*#@B*aqUxO(I&}V=MF+)+JGc^L2b* zVso|uyi}>&UHnY|v0^=?81K`uVl|~0KU#?uJ5!4Bn#SL4eaGhr{O*uB#)|cnVw_{F zSWPL$ImU{eDaDn^ae7KIUQ+wD0zdJ^0WKP{II&_qr5G0{R;;EJajjR$iAVDNf>Qhzv{if9b&NQkCJWZ)|_h4%` zQ>+6|HL43(wiQMm2$dP%7O$*gDG;>%g*NT!xEP;m4+!0q-}e2E!26@}M&3b@Fq`gIB)G%5o= zVpM&p!Y7Q%fUhW(CjfrUivh=5si(HV>swc5?^L*>r&d(^+#wz5)uJOgBHyvv*MQe5 zB@eTww`q7&(F29wsQmM0DkD7}0ww0f3o2dlMFEa5DjG(a7UC=`NCWtHqiVp{lyb9) z*1q-^8#Um8N;yGVcX`3E>cr8h9^_VZDG8ZuC?tPgw8aU>7B2^Xh-4}X&Q-HtwVX2G za-*6gw4cSmtuVTUmP zn3=Bw(aLSb+bD|nnqn2WzqxAxi6pmGZPUVooU2wGS0{13Xdauu4)vISc`z8`xyyKy zyj6{0R30<~%ZhQ{vEo}B*o_((#gv0DkYY-?fK+m&>q_{yshi}Jwm;~L2Uc3O!J_JY8&(|8s?tr_A;W-+j=7?&tk{2z>#&XB1M zq%&k{1Is0Awt*M&72%235m>*{5>%bXC zwSe67yZX`M-d@Hk5Rd6X<8*8DPz63>54xH_vT%i_g@;6;WAmMuKg>MVfMk)I?`+c| z5gCX;JUYR!kbHjRN9G|rLvy*wa^bp6Rj}qP$a+0CS>|9=fG=Qgr#r^b#xGjNUel z7mS?K+os{|+czotsG^U^t$)Nqz_p&p}d7aQ9RAPcZm z4%kqsd^W{znH{FDp5$!-FEy$Oylkax9b<}hU|BKV4?d|1=b2&#yu_#)5L=1k@T5`u z7sc92ud?9*KVVc1_(7%8m02=s-@?|DdKFv1r;Vxu*I&g+r)~X371mHG2_3k$QJrBw zV{)zI*hCt@pDC5@&71YrN4+9&-dHyUWJ_Aq7lw)6OQu%` zmh=`xdVf**znNYq5PkXC`3m?A6_Y{Ns$iqKW1!1|{0haXU4XXF)F)nSH z5N9hyPpGgC+mCkA2kTYlBk)Y4y6#a!518!?_&1}vMry$)>NRmAzt1YpU5{SH-C+tp zDW(jcRMFOC9I~?V(h@ zE0HA9BGtO zA`dZkQ6G&fEYD70DUyp)kz5qbf}y-VtsN&`7xw*48zmPDQ!e5kp?Om$=-z&4gw;J$ zUs_-y(Tax%{`2yLwN7;$dgq(zXw?5*Q~QJ#RPtTWw}Z|Wx~?F@xJRl6n)2DOP%rUu zu`!WWSF9DC6jxWR-SnC`#O$sw9ppt~!%_P21kX0miZEXjzRuVBeA5=M25_-b=^bc^ zzPj8i0yln}TkTd>v7S`EOzA)8;?gg@3It{nkXXrxd>GDd0FOWPH+7>0R|Y zQoa&=^o6_7{G`&ObGlPrnF>R2st}fXs=BP3>jtpLs2cEarQEoub-5P={&s+1==AgY zYFn>)eZlvdv1X{YRA2g=i8O$3Tf?RYa4n@=thCl0XM%&7Uu|_n>Oiz|Tk*7gUE>*J zK{R7`Q8xcntUwK(L;x_KzvU9EHZx?@Rvq)62c}HLWaK%>*EYK%BW~&4OJOZ zm%S1ATMZ%q`cbg2Ob=mMERr*rIwW@5xLZ5JZcVIHu~s$KiUuB9^jPBN0THYXs~id> znf&8G;eVHFUwqs53GguKes+(e-ZdK3bD!kBBuPWTrN}d7tF{-nwka{N0Zj}5g zD@*O`n(G%Vs2UMmY!TEJDty*cVW%IWHh*WuYXToOss@~FhMLsC+iu3GM6(We^l-iy zf_<0DH*LE9dtB4Yml?2+p+*d(oQr|UT^0=BPFm_*j99;1;=sNuqK)TZ4Q#H}CIg;n zRJ6Emsc9T<=}c{d{osop8+T}IJ6MeJ2PlfkCGoVG)GjEgfk`o;#-qUP>_J-tc)w9K z;Im4()rHm;V|ZFw1MaVs6Qp(ZSQ89KSr1eM;*IF9>|fs0MJ=bQkfN0@H-l7J2kI{7gv!?sHrJVsMn#U#ye!)|~FB+8re{EC~_(!8MAn_*N zY#pZ++R7@`0G?%3)Ptc`akN$O9ZjtU+|Q^CIMb*a@KmFs#}Mc1OIMgk1Nd#F##Dwc z|H`pNFGFqfcGvrEes6uL(?lA;{nsC=SSTK7igjRFF)kL0xRGK3k1|_L;L%FC zV$s4wqF9Hh!iUXPhSn*b0?s$8_6vnmHSI*PGJWX?6KMe7zrj$&La}LzbzoUBE*6To zkzxT)Hd{^LETvqrXyGAItdFX~$IVs-oM}`Ic$QHa(A$od{Y)!zgkEJD0`HnIWU*AC zX^M4VSus(p$YT|cC!4J%aF$Y9EN$T-QLH0X&WBz3pfyk5lQ%rqux6 zHe|6-T-Oxqz_MaoEEI7g#RBeNwwk~lOF_u5!)priG8t_1)GN88| z6>Et~KW17D;A#_x99gRHdsD0f%ZhQaVvkikzGSwVz?YTMk)B#QNviu}cFWxyAW zssV>3%Qy(G&F@Px_b!qd7$ zSrG)DvRPS>)-}qCAn=II%Yw8PDl3A(Ew?NShKEtom}qI#fn~+G&r#gc6sy4D8#|A3 z0}CW$*XOiIS_FY)>;!3j$?|UjFE?sBkkW`bAa!x(Xi*vw1eTMH5729Ck506n&481Y zlG}jRSKVy@)D~VENIm4a{h7UA($2b6uLVhiz)}y==WETcvf5{->rkSOGWsdr#a5{d zNX2AJ3kSqY8g!Q$EP}%7g`2vbEl3&*l*}UquQpu}DE>~IzHQ=|5 zssk4)B_BrXYt!gAxoBy-S}XL9DX!Csdu7GdO_-uxz=l%8D|3dmX&k1c{4C%7b1oV& zWmtQ$GRyRuTir~Hw69*}{b&Zlk32O}7b1E**9@!lUXAa>Qp};uPem)j&&mWvFb```GPi)wC^e!oV{Y%D*-%AUZ{nz0MCD5rJ<(g4lw|_V?Y&j=f70sE z3_TWd_@ojAdF~c&P~53knKUa?o}q$UN8=Ft56z*myOHv#N*eFBh%+FaStuvccxX-{ zjfdv^J24NhjQMAKEA7mZ-{o@>e(z8DT^{)@Z2migSMq&5<@fcJ-`69*sd+V2ACazf zcbKeDVTo6AP*6+eP99XB*7shUM^)hcN)4}^*wLoJBpY3sG47&aqyM=<8-{5&rZVIF zUiVU1=u`j%bG8LA{X&JTg7OW2WbEhT^nb&dn z#D;o{o+k2&gYULuVFujRCV8}RU|Ihdvm!@Z;QIQSoG*bJD3v}YPtsTUgD9~DJjrae zfHQ}*wU@s79=+xng6Sd&40yDP75gQPPbevJitI915#Puxp#u48Ioa5N8|vRkxU^}_ zR8|CmrwkCJ<-Z6nddrwN_(L{%J`7yb%r}8}&f}=JX`SE&fp~U;w0s=Vvv%URT*h4YQTuj6ctk9T~WtNp%DH@;#9P&hk<~ zA`vM~*e+KpT5OfbfaAR3WC4yS!(7R!0{c< zqzr1{21?~sZnSA_>IH$D4-llauNMR!G(b=*VHcu%+@h-k*D+g7An~}dNNY1M2qYdS zNNYbY2rNez->g2NQSs+c(#JT(W}@3Ob#t`2YXBD;RRjK7DOYh?PkTY&ivt9$f(mf@ zQB$k~?=h+c#Eq*Dtrxr?u zOe7lZ75#fYeor9ZgOplJuQJ+!Yb)hyPiq@52;6>vU|9RN>8qQYViecj`clnA8o(~2 zYQV#la&gi6y%z*NG(a$n3#acf#X9gXqgp`RxG_QNK`#g_JB`N#P7gN4DzMwACJ;Bd z(`uX6e|bS**=hWsWxgsb)NAT2J6&I!X~wgY74m&$iOIZFMV>dU2JkhbYQTRgU5>5{= z#X4}dQ7s^DTqn``sTTy6oyMIMJFVjMQ)a6P#Et7DT8q3Ou96$FrKT8V^PIl4+(a6{ z4*ROH8gRH$E-qS=ydaRD3y@6-xak1hFw{5H|J%)0ww^)^B$h0!Y^*?T1c3auj2ndr za@||OF?to-z>gW#3FPKWW)=|hiJ<1H0d7g82EYf+b`AJPrCdq1VVAjz&ep3W2z zCa`QPo>1Rbh1*Rr1O8sAj>-km&BaoE?HN;R0Qu3qbnGMaNV&RRrBvJ+zQa>$)h^E~ zdR4FTsORHtYnWbrxI$tmh`8s1MXy0^l@agyhs$$ z-l~0|S!n>@r&Ky36!$a5Ip&JT(FLw)_@ia>tw_Xs)xRM96K(=dnt_fsZi4?G5W1tFTT!|ELmX`uDu0#sR z0xKSYFPmZ)kVkkT1!P=_E#OoeCRO0&Ms)!hRIWa>eq@4GAmd6r02x;j2as_kQo!SE z@Kk|}E0F^J)k^^xS0V-E4oEx#8CN0&Y}(+d0*_G2rAdp?Cc3~SUKi*GUY8CVyD;#+ zX5*<7$iS0>*`hug3^w^#1(3m3$kABGI=vIfa4Y0!ba^=-1Fn#xG0V#V8FGaj4F;XW z2mFbu7IHLhR5Je(6!6PsK^kk=KhK`@i45TsGH+0hAPE){Y#_)_(}u3%toN)T`V_0$Bz`iuZ@+dntYfjtMG?K&GcC?yS>nUz@2J z@NA=cu2*=sQ5lfwCAKE$Xq~E8@%Sl)%n+e~40}<0RizlsA_ZhDi&Uo$Q--KW0oT#- zAyUAtjLO1cDIfj`N2MtKUKLK&eiRBwzl%rUkGvG{I-?pu`d@5?z0WVC{mu7SORIZ= zukshPGAtYt0npd4o2Rnxv{PBuqmYMlq6oakq`HB38#M$4(ce2iq1E&AqGxlh+s=B;?-tM3YTc?=N%~`&*;jpr zPbg%h$Z*(HL-4V)wOhAAd{8?l_Xj@3I;;islP3f6V_q^Cfb3xsD3HA=w-4Ug@@WAN zHYx*Bzg*M8R={tM6H7;B`xVMaP=lG7qY00#>^!4Ve7|214u!KEq0*Z+2h+y}0_izIE0zz06RK&Q1MNxjI=hVBZZ=b$N_&(3;`RkWIGM}oh`qbyt zIlW9z&z+v`rVRoWyU4&8Rh`mmOpQ`P_7J+VQhfX%P+2KH$}dIfMERM3_sgrh@c=wg zU2WjW;wmmdvmEPU3k34>2tE+&Neiq_3Oe}73ik#KI8(C{Ae9UHRCQcvfxs)&l>!mt zbFoZXvTSKF(vDa97O*TWR%xHJKp=YD`v4$f3TbhUb%W-{KvNsMj|>~xMD0mR)B%>& zHdXCB3j`vjkk(Xb-`Bt<(4+S_ajAg)4GmSa6? zfk6J2zYoM(YqX#0niCs3&Qh)v$ZtNlJ4Zk&7xby>__^jLz~8DX1tP}hVwtpHIfl|= zq%keyk{-$OH%W;9MkVkZ-WWb^NC*0e>5#lODWjPjq2HveQ;N}AY zv5qpv>LCanzf>J5u%THAkjj2ZVXbR{z|GW^0ukeLu}oU997Aa_(uOE~3y7G4KGqgZ zus|Ss+;RjW#^++~s<|=H)CS8jRNF-Da3yko9@I}jS#49*PP9NEVhU-^9BXe4YywSM zupECQbNhzQaj+c6kM+8?l2>6{4~nYmNm1KRX~0>p=^wE=P21ry(hD zhPo0Ul?xrI>Nvv!ffuMN1tP}hVwtpHIfl|=q#dU8Enrz%tkTZ3Kp=YDas(o#kQV1y zS88qyG_}EU4AnMK`*9`e0LyBds&=jg0ufV4YpS$sG_VOYX~A;bNum$dtYA6LT){7l zi{#ZUN8ml`Y6I^VS0O6Pv7WU+;GYHrVoe$6i`AU0(eVZ4N`ZH)D*;m3FDb02EfDxe zb)`VW_*^WL7A(h5T8y-xD18fvn1Vjm7CmEuK=iof2t4iQ4;= zr~@pkZK~Qu76?R4A+4EX4c7^60!>=59KS5IKUDf)InEctJC!&C{zF}D;OpWlL}fYF ziYw|W1Fj=3ABfd!fz_iUI)17}Q{ZBCB|s_{^r`9?tMmzQZFQwU#Q0n+lNKz;P+E+% zzp1nquq-WBX)CCX77#sdIRX(=NQ-lGQC~*dyyppam;3ncKL}fYFZWajq(11X!^DVHt z9MSQ2)sX@xYE}ZIvR_hI@3TPQ{_0ABi1E2tCM{Twp|luj8!CMZh?s&t))wt*fk5=Q z%kd4F+ch;S zSdJ6N`-Sm-c`a`A2s}|;ZQ#k`Dnz*(Jz`yKfxxc}2*i5Q0;|gr9eZd<3Y@8~1W4sV zhr7`u0T)^z@CtRMK*ac5ERz;2$52{~wBwb&1w>3i?{4%+z~?Lwh#t2bfr#%W+?cK2o!y>N1$RviG#) z)h$Qh1M2Dk9~M_3D$B8+vcSRU57Lknc%Qo3KnM%^w1z(T+#^&Uqy8SHZvo5naSeSi zwTB7EQOXqof3B|SKbr0nL%Uthj%s~@S25@05u|VLz z1_WXqy{a$oR!&vN2-&owh9tnIx*}kox{@lWtZZ}tzcq7?# zgNC%pdc$1dP{YHCM0YeR7{vav=|Bw$20`{b4N0gyM28*_pC-|>H7g*lX?wL5VMtsJ znJF4hQ7swpe03$jOT^{(3aqbMAn?iofrAx2LlaYAIZ+?*)ci9g;UZ0p5b+grX}Ey- zvg!L8k^$dTR|5RExcnHghOg$y+~*6xk?P6@t9Xafr@*(=)dK!YT^W$F{-BR#71L_P zp9;tG@;at5biyC^=|%;ggN_&B``G}1{pw19=c+3Mo+mEfBCId0t}UvnqvGDml>*OF zR~twf_h}=L8onP`k7;fSY^aDfa1C+!T&%VRra%VZ1FK`0F9~mGVg?+!h7b1rz&cR8 z?igR?`nGV~t6WXsZ`Bn+G){?{z_rvBZ70ymHLK+!3F+0W40x`(65x5_Dt@uN`Y&Wk zVIr-*dozUebgdTwNgUdkIVxDI^CbRq&C7tVs4D^fQCxl^s^aI%)|)gj2Hq|%_eVfR zK0{h0wEmQIN?-fUubc_Csl=u!}y)WElWl5cm^Y~w6vPGSQvZP^jq8l z1^!%JE#N|N`JQ4urGXi6_*&4lsueet=v1@f(*<6tuI3E_Z&geaM zl}*=bNCy0~y4t}1h^v0T2)WXbt5e4no}n+3N^hu$WLeVd9x7_cpLkhAUfmJ}eo$R4 z;2z@g!^4U!5Eu^#tO}#(N}8AgcUM;eq>P&{;72T~$~{9iouDBZ@CtRcfd3;dKOn4Y zEfDyv0fEadno{&CdQxr{etm`ZgSS}i_fD0tyVoi+TBC%#~JXWGF*Q|uBYs>{i zNl)X<1{m_j!KK&+J~C?jybxI81) zD(h(=a7}UfK&(S75P0Q)K&%HX5ct}F!0HmAF@Mm;q`-fuD+89f!kLGQXm{QOmJ`D- z35JPH5>MBr_W_xYqD9Rdiz#tWeFB*eABc68&Q2eY`S5{Qt7$L$fXs&v#A0wYzf~WO zte26^(vh`*jHRIOtr=OXZe+bVBm1(BtOaB&o)K$B9a#&=SbQLsjVw5&ha;QD$WGRg zwSnc4O{*DMyKZFDbYxfP$l5^0QV5=wV~y95wSkPq2V&XC+Jo&9PsuQf^Aj!JNrV(W zYO+TbKK4WC>&|WCCrkl%GaA|y1u z>#WXdm99Liuob>4S=|i6HOmGBJX1R}J)FVm^e@+8Pp94*+P~?{APdVa5FkUW`SG$* zQh7^N5Cc)-zAJKhKLv+q!5BDHT%#H%y7zvQww(~X9jiZ|p^mjs>}pxQd?z3n*O8VK zr}XMSVm6Z)_iNY-`g5%JXftCV6Y2v)c}03Cuka35np1^4#sjTLaUQA`ae>teHRlIL z_EjB2CnV~GM4iEO(nfc|3@jZk;4U2-Lhj&#eO(bpcinm<>lIx@!T!5gHm$zC*Xk4j zC#$OkoFXp2bg=p?5P0~2K&;a=Fav&7UBS64l$IiGW6f#<5mQJ@bF3K_2t~tMeF2i;)IlK_BN>pH})92)z$nc7b?zqf|JH{?I1 zO5a#P20Tdzo&cE}w?Kg%ivrR)7X|#RMFGE{t_Vn9YfhizC3;iM>Y!k6a{=4xihw8? z**KxG{YJ+(CgHH6!9G70}z70SZ1n#Sw!26V|11xieKOYrx^}=9>WZp}7%|T(>Uf_gBYxoW!49 z%B#dIlufT|NCy1!L?7!uy1r82^XB@4z}L;ysQe4LQ@AhHtOQ66zbvtywLl=1eISbrlZrS{Cib;{8i=Z15##qaY~vz1M~M538aoh zVp`e0O4Y_#Az^^-z6g*y1IPNfR_%oJ!Kk2T9^JtdSf)>NETd0C`e5>)uUU-`sm^vt z6r6}xk?8F-tF@278S09Fm#M3T?i3VcXi9Uz1SeOf~w>`Tz^ zs9Z7dVRiKZ%k*&#eQ+cQ>6_61Na2m15XiuMAXcXBPJnla%Liha;KXLcqfl@! zf{#)iZ6Fd0`rev;1gklup9cNSI_=Ye52-5xGWYIc@aowZ%)YzBgd#fCjiW*1wL#N? zG|KbIcKYP_fX{1c1f+}I)M_7@(*3n*5zy4?GmMx2n3Y#iTkKOPhQDT@6h zo4~s3sA^1&QbGmjSsv1H%3 ziQnR`ser!_mz&UA`!RYq^>M|4FZ{7X*!EGj6bM0&>oT}Z7Jfnr*&0d~14oJq_x2Sy zsw6DVv8Yh-oxP$ZF42eEcUV9oRHNc-Rrs{}i%BBl6Bm>^Bt_1jyxcsWY`jrI^Mt_Nh zq(HI?u5i(y>kLhdfe)yw1w=`~73Ww~sF?}qej`Uf><# zs-GFS`ZO^GLf|f8fMu?5W=<21tCTDHy1?(5>t=y))ts&FmXP0RRt8+6t_1jRarpsa zt+1Kzw!4%At|zYgPEhnAt&jrWR972FnSv|Lu~yQeZD6@**fNSfuN7k8>*{I&DN_`U zwdgo4+5%2cR}3uc2=|Q_q}V^TXar=$!`irt%g-^^8Jp{32=>8%K85~9rEdcv^wW+tMd{nXlf~u! zGJAiHfefErRdR}yJ59?*6nNTPzzwx#3%I4aA|RD(PAC5n&QX@NhCm2w=5Vfr{6@1f z;Gedj$sORE>dJuWmKp_|CN4i`SU=uM1FM}1MWl$BqZQjg#Q3gbEz!UfI8~*!fs0Gh z(j03AmDUEXEG}OJ%f=AADQ66iX(MA`OLg=CX-YvK=U7G`+>(R-PNi=GBc*QvAuQ;d zHT1z*5qjG0ev%SMgWdah;M>~kUSO|^m<}w9=&cbky}Ar;5{|p%wYbs&FH-&l$n4du z>X)TUESZ7{%plwa3JQ&>U7hK=tF5PH_|It@A|T}5H?C-ZMzoK1PuFa}(V2B`z}rG~ zx>2HJBVC-qg+q@-kFYG@$?8ggC2jL(SBLHd&!0_6TZh555hX_of6*WC8d@^~uA{Cd zuq5O1IvJM-GMu){XIB@?SA-e5;w}J#I!6~!cxT}2l6RXbORH(_>qpgUWPMw*iaP_d z_$!sn55rZQkmI7l=*FzU{$l11 zvglg!y0kk3#2%mvHMlbX&Bu*y=fCdLZE|qyX0F71(PGCB7JIkEoVc~0Fn7lRc#62X zcN{QY6K8Q;4DUF=_O!6N?gAlj#~NUntL8#bIG#|h72iO(N-QeW+`U99 zV%!rGK(hR?zq*j;2>0hzLnfY+&OI`9T{ML?T^;HvCCQD8#}4)1ph;qR0<1FpWk zpA2`k1zb;E8E}1Z6-zkFu|BGS!9GXD$FyP!TvM|;K+3oSI*=Mg#k8hk@V1qT49wj{ z0j{bQTfj1XTtgomqeA*7^lK}9AFxc{tf3FyKD;P>8oeFU5dl|G`UFUm+!(23a}ibd zt|x_)`F%H2UFDi7V!o)NGT@Cn_~7mdec5>_c_&Jq+f9I{s4E4YDlWesu&C*Bs};`? zg-0t_E6fU}`J0l}(X4iu6|D9!s}p7gE4G@|ZCo|4wwu*Vchs%s)f|YwBV+rC&Ry>l z0{>yIY9Fgv#h;8J?KMd&eAT=K(!r;+lNoUP_xND95P`?+QDA!VCKA3O9p`{fVOWgWA1_nYhPXRk@EyGY;2~7K#{W%|$F(EED%; z0mw4>zrSK$-_eWj(KQ)eFRJfU^}!+aB^lrt$#&OIz>jKH0))^-0j&*5wRyJ-CmnNN znwpqb^SaJuWfs>$)x^5%BPuSj(Nw9ok@heocX$D!(~XX$v6Rt4R9YHgR&ZFJCgp#m zvlJZf_mEA5x}{Pb1R*FcdQmN2*B|l@((1v2m?xXw-LUSItgUs;Ot0#xIkR0WS!CCY zl#q8jQu4kx_(&g?P0tM;@=w|HriNs|ch{fB&VC9vlUH{{0A}iH1AE0)9Q4AQ2O(Dq zSE5`kV3{ktc>vc&nivE3Q&$2kbA_J-&5(qXG%*8Srmhz7OX8{@<4oClsU`+TmxpE3 zpDYCUnz-Db@|coieCvIF3Tmz==1cs2@>;j+JR#elb2PwzTe;r+BfI!A_r6!l{a)Zw z6p;0dWV%c z22K^1``(7JJHIvBZ?-cozebyeCwbQ}FE)zEF#wXvD-yjNab|JJ8QHFlwl?>Tv`J07uZ^sYYJ@m>7iLDuki zDX^Bjx=RqCe4gKM=QN;vtl6kPJx>)5Iq|u~49K;r;{tLMMqcX2eLpfLE$31zshtdY$uS>jF*8fX}Hb0WK0( zJr`U5potmquj)#Hi*&3S|IQf>Pmr#@wr$gEm#Jjv>0h0RQeVWF$I0B(%KdXM31{&3Pg<0 z#X3`SW1y*RX$J*_YMZFtTZuZrvf8Gqone7M#1zt+Io3HE*aVt14i&0!O^N1*GTnP~ z-6r5}30b+vJKS;v@|&dYmeO_o%g#${@)j&dUR;xR%W~v3Yw~Vgj=Wy-4%8vHfeg85 zdiXu_uvgPUu1+0S_?7avg1#S8ZE-cEIEPX1eX6|$e80GcHcsx(F%VO8pKXT3j~uEq z51cA4_vcyO{O=sBSr!P~XSmPxfmrEyP7%)8$iu$X$63uNNl9Vj3Z=c0hjnu`K5Yc2}N zG`J{WqBGJ9WSBMgyqJ!cv^mp&jCDxk&~P+|hSCp3`s=n%=f5)t^+)OQn+9YQu0p8( zP+Kz|(Z3CbdE0%|0NhVq(}BNLS08YM=-Rk3r?JZ9x%?Y4=D!=Pv0BOAYRZtt8ms0z zO8EJ@gY^MFC$6E5IYV*`I^s?nf0ONWqNi~{&X25brhS+Wq(yE-XUJAsQyj&>^vHz) znc=z%_Curt=UOM;BkV2J5PYV3zbpi1zhGwi_mfp$_`uAHyNg5v7`1aTGKN*B^Geb8 z6V(}w1G2aH!0IZjE~YJ)YcXBYm^3EZ zJ^b4yZ^%Tfr8{jfb~Z8P?tRye2khIGl~=`8W9x@7LyEnwMKj<#;_~OBDt(xk)+L5- zX2Qg{F0tl5Zy>c8=n77*bD zSDIt-W5Mp)3b=ErXqsbPsOnn4vbu0}?IaRfDkTCUsW^+u*263cc)Ge;^zu1#0so<{ z2sqxP0yj`s1Y}@t(m2(mJN353E*ofz{qpl*AE@zrVhpyMC#r z;vX!Zp14m;hvW#nT$Wb-fd5ig6HTj#CO0Xo z3f$OSn+V+5T)PN7&|Fsuclcx8s~7w3jJ;a7wsQqQ9?M9pF>yN+3E%iGpM0RuVm1UW?D$ z!567-s*VK8y1$T;O8hbM>edkL*hCdXz|GYa9RHb+pK3@3d{kWZYly@83S>x!N&R9D1L=XT76)E}6u zs`E{mz;!GHG1r)@nnkntePOqlfegtV{U~qa2==f=Qe%bjzJ!~4V63j-d>>||VODTh z2(#iaD>wwr5E=YttWyXaw=$wz!13bpixca+t7u@glNSj6pXIeU{gC#AkQKhULcxzM z)}5xlARO1otD60~wnS#5!3=8UxYc1FIvQBh1uyUrGZqJU0L!dX{^nBrrd227pK|xU&3g5&nav z&I@!j!M&jbmg(YJy71BpI&$4et2%0C?=flF3py#$N}_sGZGQyO=gd{@{oS%DTitJQ z%>nj_%Qt7)iD_M8cwrh=jO!A^PKAlhy2S8)K8d^P7<+*bxZCpQ&%r1UJiN&d+cwHJ z4G2N^CO<}*ExgG;Ls-sJwhY*_22;`kt|%@)C0M6fAn?oqfmqL2V0Ah}9Vt4#rqUAN zo+bJ;$2wK%6Cf4+&RQ)B-4C@w1Z2c+?K4cuI9E8Jq{{t-aQ?-($+}#1MnHZK)xA5e z5?w3=mm3k#M7BebZS)>(<$!0XtBoi+Rdf1YB+=)t>9x6i6u9PE-c`SkhKXriVz`fz zxVKh}fj>}J0xXLNcU!oq>{<*gCx*K%iTi8CUf{jzY5{*HuA&pYITjUa?&m>2L%F5_ z?^jnF2w_1#t%g2$2gGlx-YGNWCJlK1QYS4;OzRTENedI>y2NmX!o+4>VmL!2-lk*h z1wt^SF%4KAc6eBY>l)>n285t{Sj8x_g@@IN=j_$pF*cP~cS!-mbe@7qGZZ?51m&5T{wcwGLnraXJTR!Uvt4*(| zrr}|=>Hgqu|5vM(dp=|(8r%VnP*()}$asx9O5hT6?Y^?#`cZjxPvP7v@K5Hd4x&(D z8aS(&oYJpsK zx9fBdjBaBOG}o1~FurCBq)K#vbT-uvw}8{cL21QSJno zsVf2=qOJruS6vYhy-or85a;f84A#%LM3g(K?a3Ez@FB^~7?57O@NEgNQjZmF-j~AI=LU;iQQBJS+5EvYtS3i@R9=_X z-}i*EgZ7sm%Dsz*yP^Tkm2K|44*ayZ>fhqX#s&oLzyX}3TrJ?n>PmoI*VG)hAR^T5 zdYcQuCyYptzAWnTa7BHLGy@(lEgoeRSkR|AmeHq!(WB4Z z$^ssv^lc!71$|sYA1|A}3H>LPz6C7PH*4sFH|8`4PWNa#@Doa(0L%2fN`J8h0Q->a?^xU1?)fZrP;8s308N0={_*ShybXUaCd4dSK= zNZQcG?0NE)H5*WsyJqoxU#R~fuQl(D389JZ{T-03`hNaQI3JVOVrXE#uu^jdt&+QX zHYAU#%ryg>C=;=bPDln!#Z|9*hHRZt9>y;~l zUbDluD&wVZeE+04A&6@;d99ya64%wnr@(SzxSx_ZQ4?d}6m_M*GFN!-bgCqrq=^~u z_wuNodpq;yaTtHp=l3$;2J*aFH?F#LLjDx~?e(eC4sd626%BJ=iV%z1Ztnw9+g&aL zkx{dc<}$dIv|Z9kuz3=0Kkl;Lb$MhbOT|$`SS#wg&Du=7A>H?&IP2m^?O^$ z)rRYz+SXv`M+XY}$l@t__lYkM1;gFNayD7Ut)pomVP_#NE;hiYsfG^FMjd=cymcTe zLDt`tC^%A4YhMkC4i@++bD3U`7!*_PI?keF?bNK|56kRZRy)iJ+C5ydHe&6#4uNCw zxeFcOyCWYLNJ>IULDLq?G_I!)b!WgM)zt#d6qjFvSm$YA2K=15Qs6}ca;wu2>PXRX zv~qQTR4#O+Io8=4m;x#8_Gw^QM|ieC#~R8N1CLc#ACSt0j#zcf(!dyafx7yD=y3;q zU|CvtPWgavOjoYpl5f0hqIJbC2;NK6Vql30c$h_1r)XW-bg+gbhX_2vT!UqOLPLVx zf}TebQm6(~!A&3#iA5NgiEv>+npuQZMbVSZwBm`Qwif)6lCPRKPqzJBUftXQ`Bs5@ zn+RNA9J_! zEh~6mu(z}-lGoyveJ1#mC117LZj~4}w3EeUtqw*D%NhdQssUakF26(wtiH;T-F@zx z0?$^i1bBXlE6uT}Q1b?XGKg`f9^g4j-vUDDk9Al^--53C3a5K?2Y8;+w}B8A^vxRe z!BImVIc-cenn=ueLMBuN~l>mSJF1b>;%8B9WKNJzyC59*G+eFXfDm7RYi)7QQ8j=AQt1AVL zluxwkyZrM1MXvEuX;XQ1D+G9qy4t{*>dJt}i_1&JIzt27zH2GC(4xaMpb_M?efDi_0S*7T!^ z4(NSgwI4r|LBDB(2d=0CNP)YlD*^7Qu9RUeR#$KZNV#80x#8}4(I5BcnDpIs7Kj?x zSs-fM$sM@4mW+YhiK}}8#Xz-V1JX#x#sI!uPQ|#%oIN?lkIgwO$5<#%R|NQ?#r5PE zEC3e=wAN+SnR0)hsQd49d38Mkep+09Kg0UG1p@CF5QsH;m}hp3%PyMM6;1Q7Xj)e^ z&BLO>0gRDuENY8u1#nXb)mtrDgk33{ub0=+jg#H}kxiI9B)>&m2pB1wRMFE${i?vX z%>|@cbr&$pDSU>o9x1OQ+;1z-YD@@vSd>8R|GBuEq#AvwIl7ORh0wMI0sODH+=mXg z_G9oAl3O^yRGvNQ#$iksXUzf&OQw|kx2os^YT@pAR4t`Xk->9l?oJ|bcZu@n1*}+e z`+%tSfmk+%V7+cuXBGbKD$bU#f$P9u)YLypC=37frr&Sg~qf66c@f zb+m5GtHUqKGJYQVa+AzR50H_fq&l#=1^s_Gvg<_jP4YUTaeTK4{|}TODxh zarbND#oh8rbc81X%iF34z~>~Nd8pZIW=LaC)uogHKdr7N@MdxOV|BG0T(dPX1%6Lm zEg)QV&l~Yn9_j9i5=gqcQUk)|*L+pg-BS8-m5>2{Ew1kSJ`DaoaQzrzBf404;Aezx zr2Dd5aoo;d633sb8>$)`@;uW7eXc13X6kAI4-r?rLbz7a#1we2y4t`pSNQG@F2uN# zJ#d0eM)?t>af^>&Eu@3UEtx1@DgGzFoOf;LGZ21F7Nn5v)y> zz73?J53DX!68|X`M!7S?@r_CDSdZsT*-{*--Ig4C9VulQ%jQ0FQ10%Q8g4SG-1ms8 z=jC;H!PF)%BM0G{LS?UU|$0?U-ND8#9-~uI76jR=^ z;_A@mN{zF%Rt7vrT=hqUFfpx54EOagF|JDt4~$`Avo10Ga(tNBTbCGq6Mmj_;8JT2 z@Uo>gCrnK162s<%iE&+G*qku2S(g|#XTA*NX&WPOmr;JT6n~u%e5v^SqQK(MW*3p* z@5r-eJ`#(+ne28U;H?r^B!eFipL>U~pdW*0GHc#pgri6q#jc{*oj`!d_Q!54gu6f> zs(m2V{UXkt-hfE-fmkLu*jq!vF@h=6eRqXHA$Mf~q)Imq!%7CbdRVea$#b+vZ6IAK zM%2u)kmEjM1R}@XS^*-)=VF<(X7wl(O6v`!b?T(`)=2Aw(t7Kp_2!|p-m0|gWWTsy z_m373iN%#U_zxPE0NHii+f?9w+V2*S!MP}!y}GWmKHx#>Y5`AFS0C_Pb+v%B#L)xU z*9!Sy{sw!oFM@w0Y|eKon7=pgd^5p!S=>=zo*H*?Gr&K!xLz>RA0Xl8Vmzfpj0HCJ1`R|F!(%_}Q^vT{eK3S@29yj^E^WOiNCX#)D4Yg-}OUS7FJ zhi$VM0U2t|Td*l2-f9MS#tC6=ig(56p;L9YXvo{aT2)=gOvh3L62e$&&Z7&Z6R*gt z3jy}XQ_=1W^lN!s_yv7zIJkx#F41Ex3wW%$n!p|`U+sr@;|zbvjgSxf28+R~k&jafr-j8ACG z(y%{i*o>5sU#J>V;KizSR)3B`TWWSCw4S0GYUZeBLSi%+cW_CA!dPow*E*Zn!GYFGKG3|QStt%fw@x%3h8>ee^#L*gnfTEagnzm&u^lq&+RFRt!a zgfS>k)8k0uKc-X}aIU$47b^QnLvoDIXzg!RlPg4QM_vaW! z6?A=`#D84{WWe95s||cgTz(?3UbR5rVs&M}zYWN(&OSQ$1qOEk4}3zo5+Ice9chmB zyafWwMZ>pr-;{)#G%P9*JIPS=G^eUpD2C$8@OVvNni>8BNIOUoXt00hN}5zM#wMio2j#FO0pvnpZTX%xw@lo`o) za{)wK9o1CPeTL}=@+YCfymI%B>T?r7$J??WEFoK5`dld#nYmV4w3hif=J~+M+a+`((-)$!ZmO@eW z-$F_MjnZVmC&lHbblHh%U1E4>2rI^QiQzOX5yDsZ-bBcTsCM_l#lL#`CAQ%cI)pt%PGI*&%0WNU&V0EQP}A zzqyirw$fz4bHr8O@Gvp0OANa^PiVho6@kB1R|oji01;R#>bF5Uz?H;Rua=_MYK0W| z8+EmTlqtB}Ia2~w(4uW%x#-{{y-_Q~z;a@^W85MM4{2fq{JFTgKNXF#KUo}*uSL1r zfYm97f^2uLAo?vM0*=v9w}6PRIpL3&=ruJf1Fj{m`UwgX)4Ig4$zft#ml!sAqUhPz zqynE+R~y(E@7pNq#rllA)_hqZq)(yeXGz>w9D%^At_&s$+RD4}s36RP??t6M*>iXlGh&WiA5uFg|imI#dEUEOgRRq$Mq9Pc9-HOA6 zew>ADgsws#ka!Ua0RX*E-wP>4hyU{5Bgh_J_Wv` zt`=~_%0AzH9`N8CjGe^kF6)82iObzA9CeZuzd%Jq|0D1l=DJ0oNez1cis+%PySoOw zL+ZId8+!MgTrH(f=mceaV6_=kI8H}29XMBA5pbB&Pp{I~+<@hqPCqjupb-UE(M!pC zRf(Ga6lg@v>d+pN=GixpBOqTWbMpse{@i{8{JfS+fL|6@_m5j+(0s=hb|sCQ%B#bDlt2`g3HL;y{CDc++)TKY7bcDGO zVLwI_1OIDLK$H}^!mGS9CE?SW7y%zpR|iPt;wmHfFkq6zoA`*n9-vgwhXtN$E);I0 zlN(i6_Q4W;jJ)|V>B@Z+OPX0K)Bo&K_@O- zLX3oql)MEjF|D<1rY20ESEe?w#8f3}FgnuRpK=9WqD&oNi77ZLg-p|6`l2%R0ZUAB zGBj!PCHy)~%YX~il>omhEpP_ttzbr z+(>(r0JjvEyU^;-F}An3YA>D=)@PMH0PjeQ z+)1@paQ{HFI$>6DX?cO@U##PZ{w8pguCr*gK=uzeG#1$b7S%8CJae5d(3WCwc4J6a zOWES12(bN5RRa8%3he+*Rf4K*RYC{&L3Jg-UUhYVN2n_So}{i0(1sIC!`%}73(d-a z7s*M@?T^5V#Z~OMS&sF#1p@ywAh0_3VbPSL7b;f^NEv^0!}_NM0?S3iI|Gl%2*+w- z0*uww1h&N0-JvjEu{hx0)s+B|QFGD%dPPIAcn~o~nWC))w#~(`zh?aszZSLi>sibHHTQ({|H3ikj5eZTM_hzeD{a}kZ#wFr?IwQaVyEI zJGBE3R96eQWE~&v7d6(~;;p&q4E@^5l>#?bR|bU0FW>5}u%#rtM-wC9k?Kki^@fUy zfY7@e2vzP63Blb)1bj?f-BTpS%NF;#KngE~-DF0<)0O??Avwlv%H9IrTaLpp6)jYZ z)?v4RI@?1A9>b&^w7)f47| zoXK&Qy1;E@GzA%WA02eMzrce^Vc-ibY@R?`?h4!^u189lU>jr#WOrKHVTBc4#DEv* zDBD09P~83kTQk};gZXr)Ss-GHOz`puV;0K7=Bcng;AP?}!a`wv9qH6Z<<;FU|KEy0 zkPW-Tus@^h9cGOx?z1G|(nkFqVYo$J$GPuCT{=X*Z8~BSZg#a5%9|%u_m0N8-m|&9 zx>E-5*!BG;e|}hYVoKusm8%6TbA^{Ep@1hMF@9-rz}L!g7$|oWjNJWoTpi%S;_8;bIK$$A7nI{L zerR#P`^s?`8)%z4z>U<^yRE>cx;nINwz+`ksw)CsrLGR}o9c>ycdDxcykA`r@Zaj{ z09TSF>Fxyq*HKpoxVgG|fr+|0z-j901@@_{13XGyy+B()op-TQ{6W`B3-~u(D<}8o z7~^#!Tdb9Xv=J?4!!!ivJ9Z`(b8)l-pQa+3;Tmotp`j9*K%^98-~%kIEs!PZ-U3`A zE>@#+JtD4uS>ihaSJ5Fhfh^17WB_J;7BavrJy!rYPuPkuFssUi0iP&^fft*Q{|X$T zOQ6XLTi;wPC!3MrBM)YTgJB^HY=?$k`uag_PcMBv(OmTPCUeo(CFY{9YwB=%>EQ+D zqBoD3i$46(T(1daCv-dCVC$Yyl}E_hbLV*=2h}2sb$GWf%{GwrSgZiB^{Y+4B9+=^ z_uxR|Y62NWK?b%tYrmTjnT8Avf7RA!w0>({BN=Pt!s9Ve{k1+ zwBe)Lne<43rYc3%;i@XFs@g_2y+>Zhx@!r&(7*}L7~2?JX3P|VFKev~c<=_ksyiP8 zd&T9iJg{b4U{z;GpF*E$Rv!?;fTUAeQOqG%Ei-BODjXt2>5PA{rOV zrYkfg3W&q#T7Qwf}*t`_hxarxQBI>G|0qM%<@LsH;Y>PmnR`U%G}`rxM0 zhQa}XThqYpl|BXTs;(Hgr?|R*AP(aoivyy?9mjztD`+aRKBPnm5W?=gE{y3G7qSO~ zo+;6v(X0%3p&aA={8T4{#A_w7IMajokxaL+_7^x^UW=16_!J8}TOc(Hws%u;Kc(tW z@i=qM6leuI%TsWk42@yA1p(Yk$y?Mj@)qP5XjBAbfHgN?KP%;K)~SeqKUP-)d`w*t za7!(h0C!bagie~_4p9F)oqv_es|t7bsV|JF=Iqyrret@WR;TrCp<79%#z02l8V`iu zJtg1II)c9DBs5P*zoFzA@Y|EUlKSOM;{B3XEJ$#lWV+>jn7}jSwOHQZFI(8v0;yTI zyq8vShEjE?XzZQkVP7EQU<|HT!1pM53%G~4y3em;v@I?a(L%(xG%5lz>Y6ow{ou0R zt3(M9CEay|aj3;1iy3fB9C)5YxzwH~K6_@`e`J^1%>PFP1M9m(uKv?e30vYgE>S_U>S62pnL0o=6!dk3>E#T|w z%7AYS$gLh3kamwIroboE)dr%+JbjsL0^OK;Ux&0tb__K&7O>8OoIa(c{m?SdUvEkmBxa41BVrBh9f;S96e{ zOIL`r;))x5wfNjIwLizWS;r6qA1}vY&}%nYf0OOQL|jn=yrK9;y1QNzXSu%_fMa9X zFv9(X?i1bZu&HA2T1}uq%vo1022-Z=I35$4LQAzxb?-Ws)+ZZk@6v{PsFZYvhpJ}x zK|)ori~8ScMFdscp)q8Ss-v#C=G{>g$J(qNf(tcbJ|HnG6n_`A`y*2B4?gF3545eb zZ7W{*UGAB-wYnEEhVz!9hL|~4ucQVq46a^DO|>3T*J-^SgV7W7rP_LUuduD9@!^HP z<~YtKRzgqXJ%I#bZnq+(A>+Nvww_@v#tVOqghi70ro6hNBk+t(eaqZA9e9?w`~?rz zgee*boUE?kz)i)swPFffTPr3&2>sC#%jkm(hjGGzWVh}^oxv%MEXukp;66gwy&lCl z$ecYn#*r#N1|Dy5?(f-&VbWrxeYG5i@eOnKa-(X=_lM|Y3 z?7^z38Pd?YA@$b{sd{9A>{*dI!v8Jh9Qy_Fk8)?e?(bpY~aIW?#241hOCh&XOI`<|L<5rD}fp=NlkR0Pti~E(pC(Q+1qOK-ztcb(oU?O`^{gYnDHhk0W6X`-2F@(UVVq=fz`5l( zjB_jw$Yi@|tj_el(nT9+FKfxNf@d>WAM7b^*#ntG_ZR;9bw(f3xk`adayO1SMMc+% zjstX*juC^Fy2?OC+fBx>L8R58|6N3}db)3;FjzfqDGkjrSUt|!U$>M7tMH~&D(;)Q zM;&tPx5Yoo^{W2pG*8CcEUxpYaOth7~XJOD6}tV#SHid zbu|@k?%Pl=0xpeiqzX%kp@{Lab+Wv=wG8}_x>~?*mbk)Bz%@k^Q{dU^>I0rr;!1O@ zYb_91E;{%CsN@bQz`4rR22w^2NtPfit@W26qRbgS#l%nOta8G!@(C(!bBSaivu4=hRHnlY*1Abgx z3GfJU`JQ4OV}Zb92Lvv=XiCv?VmQW*(0)uSMu<4tT-9k4I<=c&Q{#F`TrGHLn*OJ6y zRZkJTjq*ppY3fQK|5+*XQNbgnV8I4nMMXrw&y>Qd!sZLr_qAdKB+VW2t62=^Me7#u zA|WdNO4RHe>k6gMfG-XR#QKK?0^b@Ch}F<>ra=1dOIJ02OK2FLJJkS}GE%ZEBzQJ( zLs7EzQrbLEwtZDqXTaOll>irttNsWH*EcjV1wN*(7O>0}?zdF@u_i{qN7a=8;i@@H z-!0LPXjX9FjO^cONCq6SwVy3_O#)n7T=hMG>v`o$fomvN3s~j~dqBl8niv6BS62dr ztELApit2son+H~8WI6dR9Em> z-~O_RYD+zI&XwRr%9jB@xQ*B2ClTut;;p%cg6m7ll>%QHzdbkv~EWRCK@+$NRGjH-ChJ_xGoiF zBM7%^M8Jk>Z30KC2KVVR1_O2w zB4q~wZs!2*F{Hc~5m?fSO!LKbZY(a}XsjJA5V-SzK&-kdmml+^5eH2xo2t_`Hz=;BvuyHAm5$Ea1>go~P^i%%+i z7A|CzvZ|{EIn;J%4u(2ahniFgUDRMiujsfkpmBHLW_7zg0!R(NM_@4o7g()0Q}lgK zb!Nb))HNOW#i2gG`{R@tkBhVBk3hgaPpMKMl&%Xv2n+FPj%D;gyDk^nuPS{6{H%&< zg+#%A01-;uk_)qf+Zne>**mQ~@Ej>${GA>!jIMbL`Y|3a1y<+gVc|tpah?UAq~n`j zO+yyxMH={GP3xfGT2$Ze3;+juI7LfM&jxKHx!rONwBsVrGZuY?S*!IKJ9r=NmYjS^oj&Y;K0c{{IuG)apB>rs8 zYm#@rxvE)L$)>C2b+kM7j@WLanT-*XaD7uYjbhWJD#^1FFQ{4f=@k!r2JMQ1fuZPg+#$sRdckbM)Lm?^@mE)o8;A9SpgqYSGvCp-`Wrywyu-t`!p*dE7Il#S-Z(5 zLW?^E)dq(#;hlqOOwGAykqFyXO7=8%4oZDoChRnwxCrN zzA2kVXm^5;8M5gb4atD^yHhRTi*kF)FLA6#S7PP1fc!*|yWj!-$D*q3M+85E>+bmh zA#@*tJ$Y9@7Mv~+2)z#+tipG6m@)7f8I#)=fDEh{W}IVD+yw$D?(Q`L(cz*76LFD> zXab*A5gj093lU8fVf4Yy{WYQe#WdF7mMZN8L*gbA6p&Sol^BD zx}G8+v@UVsUHvt5&ReB>RA?3%9q=V}rNB~!2Wu-hZ?(eXG6nq9t6N3DKkMuSZ)d+G zo5-%Y@4~D-C$m>vP=i@+ZdKEVf5>Vn!oY9p3JQ*qFffBPHxyW!{6OFE#wCmH>d!G* zrY@6}O8;ue4iqV5^)wF3t7(O=+FtTv9ZCu;?d?^jn!Oz&1T3Fyelu;Q@m`oa_5;U@ z%bz!@x=9?Ni75~QcS#20{;$i>>-ZlnVF z)XLQbMivE(#pR`79btjMBL@Ux-DrWLD|n#~ZdCyf*I~7RG@;Ou=2-N>Y|=|wy`!-&dDi0;G$R-50b6mo&={gkYMyoaG7cSa~3Gvs~o~X6lx+ zJmEIe!TV;G^e!6E+2d4D5@)VIp&xK?xU;nU?2tIwD!P327GL(6~n}| zE-|dQP-tI}S9b*pd|6!yaGZSP+Wp`WV>NU37(X=UN;$^8<{Y16JY&vPa*V&5bJZN?f6 zW2`>ZuPZmA)pLv;%(+I6ahN&R%rQ}k&RbBw*j>G!?$2VDkN$PBr42PCzA-TgokSPb2r2ZP1X-FYy6 zu8Y9!d*OV$r^dticDpX~y}q{0rC0Yorurrca{C^TVGO?SeL;jV@a66SiF-(shcpfb zQnhy9L;ZRJ+$j#oyAAiw9?0dTKeJ;Ur@3w5>EiN%ShrfBpx|YahNM8QPTkvBAeH@k zz&cuU6X0p;N`Z*+xmYHRu`Wegj5Hoqa?g(d5mV5|Io2_%qXk5d`&S_a@5LYpOS&sFZ1p@yyAP{Tk9$&uZ zGiP*sUAa;q*Q4&(2c&YLBUK%L*4za6mby|PVtg)^NedbqN{f;93#D%X%hF<%_NoN} z(c_MNK*adn18W8CS`0L`9K3X1L$yuR{#r$JfMvB!RlC>%fru%jHFK=hRaz5h(t=~( zH-+{Ar4N?l0wH`vi8J6(y(DS_M~JHsmE~CLTOe@r0fAUYS)jI006KoDI#OUmvl1Yc z{gT33*8+i?sVfB{#^++0v|u@g(qg0yQTi4TF$I0BEt+6~K=iof2t4iQ3^x)B%>&HdXCJ3j`vjkk-tx_SV2A(4+;+@i#KJZ|EEc%dsKXuPf_yYz915 zT`eGQTMAL(J)en^Fhvt1;4$h-fG4Ue__Sv;+4La|i4G8GS;0_hvZ{-IIauaOp?kD; z2K=YGTEMmCLfkh5Yb(7xZvoF45Lnf9xNJR56NAygO~{DG3Ukk1zY&~%Zx)d#EY7Xu z@*bh^fj=cBN4Y;@G5WvjPhLOAb3$dy#2gPAT+WapXJVk@hoWLl9Z-S@I#Khq!#s(e zuUQ%JZgnNVpNh-(9_uL!1U{#(47g}OZgo0B9Vt3~qFgN?l?xqdj`g$!0?S3idrLP+ z0upO3WzZ?l)->GPIN+ADt$xpxr&b$VNK{Slr^+U70XuHsFXf=)xv{v_;sSwuxu9MI zXXF?42-54MqbhNjD!?x7i?(}5D7&X6uf>&z!I(2A&oCgxi?L~sd~`t1@5h` z&OQRESM#w52hGyZaIVsg7foi={dc1y$3Sjp2mrz!V$N_5x2v7!DFw~W5mS+*j4hv zS7k4JRrk3Vg4+qK^o)l@wK5Uvp;o zstnK$ED;1(8#nMebp=nA>@FwnL-krG10JTX1bCdd`~e^9B?|=JHsE}V^^l$;6W|Ub z{Oox~tlh-x_F~}c0|I5r^@U;ZT`qTr63@>+Kc zsK(S3C*neMIA1dY0XLY2q8Sql$<5-tL6fJM_o<2 z%f+)>N5I!C3I&r*Z*|eWEnT$^CJdPD8r>%d;aNt^Ox|X$YORKRH*lQ178mFO`BtYt zunm?tLK9P9IWat5g%x8euBKcGaCLF{qYKuq76>dC4WFP~Q4&_w#0aiU%vBvDA=GeP z2QIzb?!x&Y<<5X7s4D@^5|?i@))y_Xstfu(H6#U+Rd9v9C-Ebi7y}PhR|YI|g)Kcw z5{}ix2$O}4{H3}Q;IG8xyNvY@3#>|o{u>&S z0?DfHGKn{7VhsGDx-wvyE9~-vlJJNoMo53zTvh3`fwHd4K+3u<1DCDTru=zt{^_+bJBo6kWG#r$R~ha2Ufqm zPg7n2bLDluyt**~xrld{H$Vven!qyp;FNcb&_dwO7i2BeiqSaHH&t~;2MC;IE{WF{ zK5^jfyXy?_my+e%pcw+f#I!CkJhUuAjJ|!yh6qg6l>l4f@*=QS)~oyk$m2mi5bHb( z1YRI6ABgpJ3k2RbAQ0<03#_(;k@44f+%f>Jq9bbo8B3uf&9N@DK;V*63(_2GjOu6s zk>(kz>P867W?CTv?y0UOIzFkc;C3y;{D_1UH#bN-rQ`#nxVWSSH${Dsd#GUMtnh)E ziy{}yOcZfohF*8szBIkGuE?vaxjg)5%b0JlmO;xf-QLeAkF$AW?R{BYQFV+p?}{i# zD|;F{=G3z`>=?YIm@o1yZ-<W*f>9=TR_$9dpTarHE2au->58lI`*5jV#KJWA61 z0R-z5<Q9d?wuxZdwqM9?I7@YeajNO z`TUrKTp+K7cJQUjG#&Uq>WYB&fyH#-A1x}8(lb=Tbl}ItRoAXJgkiL%MZi_nH66Ht zx}r@4ZlSK})s8N0$fi6&!a>TEgo8=y2E)LPvCOK51+om*u}%S54(@TM2j^7tS`yC~ zT+qF9Fm~2@ZImLV=7E$ogo>q99Nxi{>C$7&kOcQ&c@s zs;&fB<_h1jz;&4>Hi3w7KkNxCbA?ZgeOEZ{SFYf)Wua{PjfQ0ZA9HUWC`VPTeRt-B zF^mQX5E76T{C&_)U_j|wmk$(2-wVw6twO8$`9;y#;1$}|k z0Zlv0TqzJe1y^0wofI5_=<$w>kmAnCRULnj>QD!F_>pWcrB8szi)o8w7)7(O;eYIs4If08ij({;?lXhfx!hDmjjX4@nb+9 z{|);A=1OC+@ccFK0r|}=*Gs_K2rp6=Nk(hQqjLnV-N%tpJvde;`!~t|p6W=5T3@5g z4y1a-r8D)xGFVmPav<_LehkRdUx^M8o~eNkI7>|_@atmoC1P|U0Z&)1CJ-eBSG~=M43SqwCke-?%9RjxVK7x^vp}A@S6y=8lVXzQsYDX^ zBMr=eQ2|l>+}RCO;uY?y|r0uQ(3?<sm^tzxQr#FmIFU0rubY5Tw4P( zU^&pvl|a(C#RG1yTutB(B@y*DBQivKcykH(gmNXo?bMV4_f}H^4BX~?nuzyt8kGZ2 zS5p&smY96~81dtD5$Vt$q+A)0sDjIult9F|k^;|At`-m_zI_;xA#$;GmvB6uR%IE#7yAC}1G!2969wz#!7RPCZdLrv`4O_MKn?zNDs3CG-wKR=9vp$c>Ep;~>y>;ZBRzwT{gf*M5*6@Ue_g7wNZyg`=fh3Gfg#rNAj_N`MR1l-hJ=DaT87 z_tz@tz#r>x%r$`v#pIWg(TBmY+VovQ+fw=jc$Y?{mdNOQSqR<_M4u3X9h4{mep*aJ zYLnl;da$_&JWfbXl}GnIGC@KAJ7OVA@g^xc-xT`779u=aS)LoKKHEp)wl{ItivR8M z=)UK$V97omPUCBJ*f&L=7M`Hh{>W!de)(@5d35hI06(FoCUCr%{Ngj36dZwH?&HX4 zdT^}P3?0MNB?A&wB(-}#fv9%JG4PYh)dC{fAB&9m`9pUs0*}+!I*?iTSVpLe9LIYJ z$NtKd0DINc4G}*h8TqE{81WvfQ3-GhHKo8$sVM;-tfrK7LAN>3W{LM4jmm)+i^(@Y zbrI*wvp)=h!2RS?T(^Y-_ZO4rV#IIYMfQ5=?^5~1->H z?oa^UEvERiZD1A)w7t8D(0)5)yiDM=!34ZnOoM7uXSNxjEbWf9CY>@wyPu?R+}<%-eC9Vr!a)rF6PKbN0s~QEiOeO} zM2Y&k5;cHx)O0W~a5pS>L;Uq&k)Vg=(Y*l*SEOkvu*okM4`Kz;d8{hZ3*X zLLhL7ni7S4NM36U61b9@5+E6!2%*r2G2*?uM&-a4#N>|%Mto`5bt7<`d@|S1p<^;+ zWVlR|rohWfNwYR1GDO}0v=gX9&o_eIJ_CfXkXl!I=H?uM%*~x^fI)=$=7kl}Km>$E z#zvbFoNh&c{Oua|4r2>UN*}C?CV&(NOU;Vo7(81`JCQkGU2>}?h<*M9#W$2{5)^j^ z6OfrjcByy7dj;u}$jc^N`0~NZwG-Xm;{V9d_8Ye`2L|)eB@DO}cMVhv#<$uJRUtWW zuznKU0~{tM-`0$d368)M)szE2Qj_`eEh2VR5gCv>Bi&Ej0!dql$l8noeQ$qrJVNQ~ zKt7FkM-lK<@p2z+j{=jVNLkmE`|6BRVE6=o@+dGh@xhGvsUmkY0mBr`S(*x=+Z`mp z4|P^eU|DWM<&xPQ(m*mhI$#iC4rwc*3lRgg6y3nGh^~l;ZY!b-5qAbU;6gR!z#x@V zwXVFCIuWVdyj)zm3TIjB#E8_El{yirL4^5sc#o_MnFrQRs8yK;y1y=1{dc6qy{jvm zppbC4Uz{T1&(*@{-&5kxFhzD1zFG99a_4ZVzmYJ4*3}4D&R{=0Cc_UkLjwqBk)aWp zLnD^KUa*m2xMt`A?xd!Jfn~M!M@Zn>NCPJVf1su=V0i))BNOO~O~C$I2}xIy)pHjh zrV}=k>`cS;5bzom){7wS=5XgR;Ge~7P|f`*BL?q<&}v2!eqLP;CW=`_epLlche=d% z=z@bzvv(1;yMzs^P4lm8Fof8YIR@?K{KYNyQ&f90OJE>MERlI-(<4#mE72t2x75@F z4BV3}_oQlp$IEKB^q9?obJWxXepWsa_ZtNx{uq|)2H=I_7< zhr@l45}6mG5TVy?20)@azmvp(KhNd-fXM9lExR<02>)F(Eq^1zZ+}k7>hFU8bS-@f zBui2Ht~Mhk5P3!Px_l*K1Fc{R+)Pagf0=EMU;>gO!aY^=eNA;Hz+2SR3tU&Yi*pkg z39j<Yz&fdddQ=NBjRfWsYpNP`e*(M9? zshY3{NDfy(;3k@`$EGu{5tz&<LozmM7(zVe-t_ zY9Wr2B{@TvCIN<{%bY8?7w0C8%7HhF$#0U?bPMF!pM*f*JxdK-B+ot`0)gDQ6VGS^ zvsj?LEVF_2SfIVyvVo0QpuLD%EOYxym?Q9QF~#R-1G8A5oudt`#{%sfZD1o7Xy;gy z_anmJ;>>|N$WwlfjP?+#JH1w$$#P{euB>gj%<0r})ni=ls|lhf=&~df&5*@1WNn)vi)FA~W;4`d8S0S?^;ibmjy6Lh zmZ1^J(1>NQeLGjmdVeS{kiXyQ%ggB5;8^Wj%az5rvbN3L11@r58S;^CHmvqMY%E{1n!st zmbvWSg$M}T`wTz`mYZvW=;>8mIdGf3nhws3U?uAMD=H0g~1q;f%=a9Dx_=1nR&b!n}U8A{vO; zPKjDT(iS2bkxI0zh=vtmUfvxe3q4*lreuOJ^0vsC5_PS%Npg$8MZpBoKFXbB0{Ob3 zJ79oEs#iDg1T`hVAj*6!L_PW1Xz^w!_}i+g`*MK~1rtKa>%Ol9B(D<+EJ*;e%CV1? z=gTDS)XC()m(|n+{y|MS@Q-5h2VV7fg8nBOm;ql>QwoIB9VWmsz1>{y5e~c~Z(l4C zm&x+oLburfXRE0WJYP)l*}yeP12Z55P64pYWu?y*j%$@G2l6#W_m(=4Z$!p*!4Z$`Fa39$M%Ut%Vl5UW%kJX$A;M($>TWa98YH9)x6H|QJ(8~%t zdJf>)AP^E7Ip^voSWbr;jqjKOgV)7GY^h$6Pqz?-O z;Tk)pmxvF)E#k@!KuW`^l@Z#LvU1)0?@I#x@5o!YD$4* zE_7sVMw5ag@JnjSfQa$2jDj@to~o5rN7|lB-vlD2ps%a6R&WHO$9=W|M2wGRbehK2 zfkAC^*@bMNc3&mx2A0(}RP7F{xP@Des;C!*0N2=Yv{*V5|g`Ka%P*sA;GV@a4X7FqvdhU+Mu`P zR96jt_LMI6%T8_gnB=5Z7yE za^TZqif`it-lTyU@YiZ;0?S zyozdqw^uTAh)j^DzMw8S@NhMyKt2qOR}ZdC12bTknsQ*7%T^CAyxpl1_(kPv0^xFB zP_6D9HOth1=}2X20ZUABKnFtJ?mb4|?aF~)5mUS{1Rkw{8Sr>D)q!O$TNt>G2!TKd z+zSF=najQo8Y6StOdehT0k=|93fx*uevXW`501c{)szGI`NepBCP)BRaZU&Do66M$ zatmDK6%9nZ9&)d|fR`&#HxQyilr1z|hiYIQ$Somm>j9RzY@sbz1FkETz6V(5vL9F+ zApyr~U;+$xt(dK5zIflEQ91BMH8p{MQBwwdQ%vy{oG;Jb5(0s*si_5o(;d{nGQC|3 z=zpqQb>N@W)D48w9S6WNybc_}TM-inDhX`WL+!g{{Tcdh_qt(;^ zBH8aMjP_B-40w^6dVuKjv5c-&#|#)IV7?W`1b!wHaR(W2xDqvisCKvB0g+sYsJ9vM z>#vRuctM~8BH70>LbZzph6$J}=~G2G_ocb_l@Y-o`*0>8Yd^3ybvXE2Dy$m`Az!!9 z>%$yD*U6)MdlPuKnv$0VzAlgMb>X{%8LXfQTWFw2?pU{TZV8D#urrKOqFx)-tL_3G zmPcg7e#FxH*ssaq^OEpI_NS%@<2@SZ0=!T)w}9VKli4s1m8XJ>*)SG~%OlE?1K(9s z3gj;)7A=>z8F4R|+gX6a2KwoFN13WVjFe}$kVm&m0WVQg3&+TPAZVQv)s7?_=XU9sf@1I_l}ytAF3$_-m4~alv)uP zB3@DHDUh_TZGcxRcM3#_^8(%#ynsQJ>6~rFo9M_b^bd=;Kd8tSiUP4YKGziD^;Av* z47to!yhyws*Qgx$ikea&zbzZ@DY*D!Q0}}0ECHDJI5J%rPl0kgoiWc4xv3RzD4<3G(jO zG>{2%wF>7OeYIGBbaUz$k)=H*GFO+q^+9JUHb;pqXM4`CLjwRx%|IDBo9*s zz1$vftD17s9jDyp3Z&Yi#k)?F{v|C!`g?(ED^m(NZ!NhKb@iBVre!r#Ip2f24z0fl zN0wDJ)xoc722%T~ZRlFVK0#P+ZwVSiUhmvlH&e*&Y`*CsEO<8)#bxbgkD=eKk zr|d68yo>HS1;{?&j`a6uzz$W%SS=@HELpjnH^^jM;3YE|ED&RHMFTEnxWpVcEXqGb zcBC0!kf(SD-OZ?~6PLhZIs+G22D%$Ms{iad@q$`Ct&6#WrCs=S<-x^0N<;6HCgO$? zHwz$d&3ea`Wx2W4$vFbom#4fV4aZN=M(Toutt9!-+LYRfwb5x22J>1v`RH>yHtQ1xF9j=*wK`?ep_!ksV) zu&G=r$&L=D>OyWJPjPFFD;Dq|jcP)~Z7A+FV3laHcweAV`U}eE=;sMN!1KlA8-meQ zD|lA-1yLYhX!MSZww3oGog;7uF?mNuy}=Q9SRY45_Xfvh&n#n-vvp=oAaf~nWNk+L zCZ;PKkhyqAMq8?mCXl&!M@AEaBapdxM@C_0%UrYK9L?1B)~ThyFQ_R2epyW^Q{^kO z?h@++Sd9`SV?0OIcBAqnkrv%J zV>zhLdCJwx%n#OS_CkM6FfsG(b(+1*oS!gt_x;+Ln+xN+B=cjcAOZGhx;p88A56e^ z)MT!PmNw(FG+&DuU!hDb@`azKZ85z`I^&j|p1I=vxun@pxx0X2dI{-nQ?CRVzDL{z zd^&gmDMsXn;TFmk_M&cO32ibv5LLGc8iQu*T=2?VzATT$wJo*dxGemtT*JkGdwFyp zH(ew}yk3iGUI^?U-g{}3SzlZ@ej~4gc(a{bt?o<=NLYFaf@$rY7(mHQAeC z<%`3Ket|d#zM!TQ_@bENqH6N&ff|?rf1{=*5UwG`1jlVwt=3|Rcv~ZL;NQj6kBXH& z)o^)qmxjPK)szC)5|ig*G&(o}$EYa>Zqz5XI)U->?4BVIc#4`*;Ebhm&5~!&*T5Xe zFWtJ+Gw{AXT#SCMu}$D(YRZ9+_lafnygD|4FRCdA{-&&a45 z9IM4ZFh6MPUQ_{ZRvk?s5)1mQ&FHP*2t=ZHWb`T3(F7vVJ2DD_&Bf>;!f~c@<-ikG zqaH2bDPr>VV03SA1U}fuk0Jy38H@wCgAVYlmJ6I^8xtTqWeINO6Lf? zJD4ny*<;Xsr9>51O{iQ`R<5vt(NtV`lV5SRp0RqL~oe6i|E(DOksQQnDK(*$_Dno=MO?)FC@i{kb$G{2>R z32;Qv31n98_0tVAtK!!digg1OkU~b|J}&5JFX_bpN{!2a z|D~oT5Guck^{3%#4XgtPi3azI4p`>0?;u*_xO9I{+pa1BshJ-{-T z{XxKQO7f3XggM4>`M$Umhaq^8h9$uF)MO6wpUP9Ot4mU?`AC_-wmOj91;5lk)0?Ssun;K}= z510MLrC2|3u3-uAY&E6Tf;Q!;8R}xzZ@xVBH+9K@ABxE@mX6l+S==j-!2(y3$M~v} z;YQ7n0so?=1o(lPGBOU+j0tc>HD$oE2-^coKo5aC!mITgDQVW$bUAP@HKoA4 z)sz4mYD$5rnBv7E<0myR1MaA%99ZVEb3Q}@P6>g)xoT^5_~Bc$1o%zy)IR(`Ix}aIE$O^ara; z2JBH&9SBiDZzl-XK_L(bf$K_OnagfcM+(Qe%GCm1Ag1EOqu6^mUyvN8rwV z9IMOxq$K-?CQXM)!1~ISR-^tT-ha`k1Q>{#)u`$Oiw&O{j?rYM(I?1LpI4V0c%_<} zz-z=5U!2d%vsY`NNq3|?b&R?sz{}KRDsrqm^(}QVr=SJ$)Z^-s18bvL-xN4pOnx4W zRtt{6wbYaY$EwNbd_$7IsUi~KAdPAPhpDMvUCf7s;6){B+VrLch+^Vy(*iQ_;;msx z%dCA3EWMc>Tra68vkK#d`#_yq4m?9mE#O&V@(LJT861H(_HktNT5zn^4;>A4$$+!e zlmf|I=*ZfPz7rgQ-&0ctM2wGR6r`CdT4{Bpov!pvAYuyox=On|I0Dh*KJ*46#>X2pw_gMRog)AnM%|REURs(+WEl|h?qiJqs{0cb!-5GG;@V}ka(Z0QKlUyuj3oz ze0g*S1n>bhwSYepQz0sEGx}|C1pcXyBcsjMWt%a(9yl;Wjtp4Ss1!(M-%^a$3y#3e)sz7d<6{{GX{H^mv^vrT zD18%%n1a5pB^n(Zf#`AV2t4zN2ew+HtWEzNy4HaLQ=fF$JC^rb1NSX7tnG2z;QABcneC$7(yG z<1N*Z0jFwI6G-MlN2WUN4~{@Gdq+l(s$&KW(#!%QZC!~PR2%+Co59vfm7FW^hrvX` z$I77$eii(x)mS1=t-L-sRUX~j#lW_jnmY=? zQA%V=bBuVOs!^uF9^Js_dO{vuF5q8uD&2^_O^Lc+6By=U`g>m~&#_vj1o)V8r@$p* z8dRH+v`Ki8CQN~ppyS8jy5I*yYsZfPs@*h!H){P-Aam-3R#%6Lq1#=q1OHd2@PDg! z>oI-?+sUJwI&hMjnx}2#z2?Ycey^ zR&=v7ohu8%YDA>`Ub^)?c`RN?gWK9#O}dB@I3^l~hHxehAo51?{aNz7C6De~u|U!e zs!hIO0E0iPh87w^!WMI;%_859hG?`BCI2F@5lld)>^^vzGn0hx2fym1JATz^cZ|LX z!vBk8End`vBnPgsiFb4AfoqG&?{ti|3XZ^C`#3T>B{&8J9--r9)sX>5YE%j&vp=mc z`b2O9?xLm)h!`KsC`dDxLsnWHX{#xH6Ns3CzTRfEWpD(d$6XEq5#wVSeNJQRz@XNg z60F(=YS&VtZXo)Kj15&gJ~#pq;~g30>ev7VY36kCM_Jop8fDH_i=;1}lt=es5%`~K zN`W7UsSuU78F5Q|@it54-y#`5BaiN@8^D*<)C59U&}T}&$^h@_Vu2x}T@I76PR92& zV+&Z$Sl5grG-DkYGPZ<8A5j0g(kH<8)MRvyksMoTt{lj3JGy$-%d3VlmZ_YQz4?>X7tVt=wA*dOJsV2yX)7KdbxuUc;!+{ zNFaZT)*ULqZslqMdrDkco6*$Z2t28eBO|0l&g$scOu6d7mYPx^nf;0|Iw3d$$?P2& z1s!JF`IvA}g#TCd;P(F;bWS;N2sfP9T0s6ztv^f{tq>fmM-KG-1zI;vAb(8NwJQ+9 zf<9|A3iPIm(EnJ~*MWmnR1*lHUnE9>-gNr{p+)jPSv~YGNScAQZQI}hDnF|VE!?Vg zChTRU8s7&0U5k?d|5Hrv0(OAm8Y!taRtY)q88tP5&x^^o1fy*SdxfzhPy)s%R|X`? zuYYxp{7}Pl8rZVw%(-t1@lG@<0Y0s!6bPYv!32CWcmdJrys9E6$i%sq*KLr%$A@T5 zfKQ6a7mv}$^-fLGk|EM0Y6V9izb5EvUtJ!XF(V_~%WW1ABC6`%Jl(84O;{;n$5@?SHL|Em zHL$QPE6x>|u=zTh1c-#lbu2}ET%)>y|Dh&xl|Y%OO-$mZQbK&9^RGHBjpzVflLQEN zWMY%Wd!9z+KyG1kjSBo%xiQS2HW)3^+r_$p5A|_mw2t0aXByb*$j}k)=S+cQ_FE>S zpQw%$NM`TIDCjUtW_8rjK~%wIzbSRLDdhi~380og`dPFJ_!pwF_@X-aSGw@YAh{Fr zTzM=)!567*_cnNl)VuHlucd2{05{TJm|PpvX0%&y1n%F*kmq*( zEZh~}4di}mzp*k(^@dKfUt0Q%Oq=U1tSumfej8*I=*{)GrLRMOkW6e~?ZW-Rlhih) z28O-xs}_1&Q=EUQ`VWMDm{uam1s)qrCkwnJn3kopSZM0-Ne%0vpnC=r@H1j6`V>rM zB7Y(6Fj3B(=tUTKLuGH05XLyWc@bA-ce{-xPpjn4i#$QOIdL8$y~>|#a<74a`{{kA zP2d4y^8L=JD>znHVkz`L(4(XYd{0d&kQUQIcWyJX$Y4?JJIdZ@kTc z50CU!@+(-a*c0;XsMY*4?id5Ev${9A4_56RdNwYL#Lb_%?0j|N-c|`IaEM4KwAb5= z5Ed!8mDPZLpm4b@5(r^I--yunEL(jS^fjgL2A1i&BJ}1ATvcD}!SGWOcWlBN>R^t- z1EiKyw5G`m0$&Lxh*nqa=7{26QDl@Qoi9wTLFUb5aJka=0^4e80B==O@6QCH&s{_T znR6#WRcyzI@=yvhgQJ8$+%{Z?Dn!+*D?LU^vZt0N2hLMd3gk{ue~d9&e+|zX=~GLe zLC@W&?gaqw3eA`S$x&p?+Kj#z9DzZE+2pK| zMl5SXCq*jv1{9D??m}=Ma5<~Jozc#+6b^lmadlT&TQk{#ma7}9YU@!rH zsip+Tq$01y_7Lw&<#ANP+jRUGY$NOBDH)-;Y{WAb#a%>MBfc^i(bdb;0I!KuMsYknjyX8#{lu} z?PTD7VIG&vyk7<=?*vyBZzN7cx};SX?uYHw#ZQhGiRT2Vz^l|$zg-~r6FP3-&x6+; zl{q@EqeawId32^b1u`jT0{%h0>cG;J=b0<8ou#F|s;!k$(olu8S_SUw9;;R8Wfh;- z&hCYPE{VJ$LfSevWdo#K^+bv~% z4$yTnZLy2wyg%foUC|IZ@6$xw%J3!cc~uTAUb^cNc$4(Co7r76>1Z0OW2};`AUhV$uDDf~ zXG99>2i7K-ms{4yzWa;MpLJ>p5b8+pPY{8p>M1Y>4$)hBQs4+N6&tYq4Z3dO7_Ncl zOa}K{O_$sxa6vFVE^u)${g=R+a+^Yql&8k2OAfq5O->U8n8jslC<3 z9LBipp)N+`5_#$^b;*J6iYZ=P0^iZV3|J1dUy`fItuR~aEipOp2sNd^qr~JzFuEi- z0x#?1$mo{fSgqfB^3;*)(uDrfV6sHbD$%Cmy|X+HtZm<}h84DI+&{3$-JWNc!fQ(+(Z@HVM`JJThR<3RvWljfwTi?t4hdjEC1$edQ>Ul)q zv%yrI-5_~tgt{cat<}^EOx2XY{bVo!L%QB-x>sbjb)9XC*{-HUEv694W_FTK2*Gwr zlmK^7Q}f4Co<~BNfK1$Niln<$6(m4r>AaZLE5QpGbeakORm6O3v@eBQDB$L5Y8)>5 zP6|3RN%O6c4tTkm8rAyNBweU)5A~&G+$#Vk9A?+U?7~!fs@zu#_kHp>sy1l&1xI(h z_}k6fZG7TugNKfNS!TAXOs9X(Y7Tl2g^^QMq!+6!OQb*pH}ucA*LuKP)zk$3NKF2a zWfbn!GCL6T+*0B$YJhhreG3R-L7%l51$xuk9}|xClq&(=qNdamnXQFeT{hLIWG8_K z1ruo0az%`V<1w>y# zUvD$|PH+U0**h`{I!w=59SwA>qx8K%GP}=57S|YD75soCE@U*?jDn2bWtXE18M}}1 z&YkOQ2IMXhbZJ306(t>424wZF%T7Fz#2?dn^#Doh=0A4;gLd!(GUFoW#K`>37Q0X; z`73#JXNy+_z8g%3Nv7GFF#*z>?yVG(Gx5l4kBx-$bAcN;Qn^zgX&n*plHg_2nf+*y zc>h+Ta^Tm;);j;(yNbYb#Z(k8Z!`LSa0K4n$C1&q!O>HP|IzUe)sX?u(x`4AnF}46 z>bN5~0?F(h8U33&X22lL><37DOQqF;s|iu3s~M~-#(}jdH87bwjtt1{HW(l>I)0%# z9wFpC7199C(HZps%Qb3fjqVJNK;#rPYP1=l$aO6cagnbN3=-PYl|Ci^f?)cUK!}Qu ziTax)jD-)lrBtn>1Gqj=*I{q|(lDK_7#Ph?A2 zEV=%o3UlDz<9z+x``Ew(#pI7sMmGjW;B9>ztLs40S2bw{EC*(00SWxO2G)TiRYVRf zbJ_1U!iBeMM&O>x)dVtE-^h$^2#&yV(uSG9FbUXK1H0k6Ihd;TnlDe?sxIbC0x?r? zm%zZXB3p*dg>w((ZcY_Q+Q>&g3&iDqjmm-lCMMq_)u|A8mj-4)2nN@t%%9n2RHm~H z0Uh3My91U3?X+!RBNk{^@CgzAvQ8ie{%NT*C-6B9%zzNMncpz8&8SRgXAT|SZsx#p zpq;r5Y{UZX%$JDpk8}b#aM;Fvo#Sgx;JX@_0U>ZRUof-Hs7z;P4jtZZ=D>2Gow*Hc z!~*TiN6PfJkwfMhP{>#F0a;0PqMcVrZFm{&1J3dfnsm8>b% z8?RL~@5z2nyyt6Fio_>^X$2uzB@h9FB6G<*LA(#ws2uo!nwr1|#Z*iGJuUDAsLUaF=9_!BjmwOK4r{a#&i;Jae-3sF@-;2Rp40pC$m3M_Nk%?qwKHLwmW z2inc+H3=ZIdlL#sX7_0yu*_ve)IRQ~xQ0Bs{R}u?O-1JUFAp3%d>5r`h|$Y_vAaUa0~%j){C-G-W>4%|ykDX^}l zUpmMz$Ox32{RGzw89*bWzF20pRg&wNdDaZgR2>w;xhQ!U4 zNB5cn%6ozdHYOc;<#C~S6CH6On!a(TL}0mO_M^#>GKnp9b#vg;YU&0)BPQRDj6MvG z)fzy*p}J(ir_|H}Lg*WhQJ^=cHRzG-E^vTPDt!|OVL@MSGYa(P?d)}h1IcbD0V3JG zc-r5y^m13Zwwdpm(emi_ zSm3X>^iMf@;PYZC=<_zCW42PqY70WYg3@Qe=ajx12%%p@MoT^keK+s}HD$mc!dwR; zf{D4M20o)AT0qkJ5;6+(<~SH4b7NwzQGra%ZQDQy|H*S))vV(`b&g|%ek)za1o)Je zFaEqO$+{MLt3lJ|&NXYb!i5puN5{ zV?!Rjb%Y!g2g;+jR*w%DPtmzg-+2Rx*jx{*47jD3+}}sv8N8#|2Gyp_G;idPbpUh+;2Pwau4tTG5Mo`(X`-LEg1BVD19CH zvYHa$9zs-n=^9KD_jlUo-ZzsGDGSf)KXN{!2^zp7RsV&T+&7caS2XPjH82TWTIbnc ziVrnK7jW&Zy|deffru`u*41V-RjbwnhNOjKe@TaFhKazvm8%6LO_6k>CMAPA6<6th zBy$-q^u;j@-d$5B2MatVn1JV%BEjDcZoma4H}I0+HcIC51)Wop3Y;vDg*5Qjf?IV) zBZYKNbupE8t5l83C5l-U$-wujOtUS{k|bAYvK%;JH=o0OM6!5VH63yPu5lUg=v_7L z-DwPt6QetA0Z;l=$&bM-F*-ls8EVRbFO)+W{7#GmYbVser8&H7=J3WgUcmeE=(eq{ z9lYsod32w^d~HW>I!hj%*V6)j6HLIj)YP;4EVQsXT#jpzI#4Yx!a?o>Uj6Ck@^ z@!>X@?QdXhY7Iebob`aoi;6j#0YEJwUp| zWqe{9{jpo{1JWl&N#xmUgV$<1`?d=$GrkS}tZte;z!SyPNy-jNKNV*{@V{t>^Z-i> z_QW)r>-^vcyhBW#91Li)A_tf@bLWi1WIfpc3pYQp@IR|CqqGX(M|BhE0dnBG_cei; zu2miQu9{LH%U7Hh!Fz|(8+*W7x(DIPYda&cBYHZdp~9w^$-DUE|z{e3- zq^DdU9d(&{r9ieVcZ~z2hg={qv{TB?v{1K+9v}yL3D}k~JyWT3U=IkSe-ef03TfLLHmb@oMeOCXo7cLaEU4 zTC^sRqILY1uWU`qwm^54CXn)V=onDHcrBaNT1H-1E?@U`Q%dUQ-X^o%*G<)!y7OAT ziFY$`Cgvi6OP^!6ouhf{c4>3`uI!7htanXg@Pn{f0yz>pe${GpjMaK{jMa*CjLTD# zj$^ed9pm!UrQ=wwOvm`&*?sN|wOKHY0WU|~1s;iJaam8OWjR9vI zcTYL+Rt-&o|DmQXAiJ)+a;Yw)4rb}(QgmmlZVx&NJeAn`%J612%%v)|O@Rmx{ z3mmVeoF(~4mnH#*lVLCEc%cz_&3b_>$)&n9NwolWL0i8S@34BUYSd0rcb3pq7Wi#> zs@kUWQywGBWY;7mDlCAh_T{oi-Kbl30%Ut~pE_*DPRa$jTgs}$b>)b@ zMIMWDD)Jm)d^Po%FC<8s2yhFTKq&@D55Y(Z%Y4Z_<8m zTBc@Iz#KV`@D@Pq7ZR+G-Ce3ak^PPN?6035=XyP8_SABo9No6+OJ5%}+Y92t%Jw4ZHc<3Y#Ql`8`- zP*VydbD_iCSSt>{2#&z#)sz7d<6{{GX{Md6v^vthuk=kIVhZ}YN_#Xo0@33(5FlcF zETcbbY#kWXnnT8_ZJ_oJCF%y2)izY^6TuOPm_k~k&FJsy*Z>A;W_$aFcwetk<|<=> zbjZWnDLL>-F%=5z*Zc_lg$8E8C)AVz;c|EWR*%0LOm|6G^bYo^Pt=CWjYolCu|&M1 z33G+Jd$+iF0{=?`Ghj^u-Oj5}Ofm5=z4qT0KT=pnX~G=1iJ0Qz3EWTvGvLN*N`Y|2 z#E%#E$r_dePf=3_TyKx1l@zXHLm;pmXus4;;Iz{AAkW<3&o zVQ>pALI(>RrKSYP6eAmLBAmU--2|d`VC}S(z^EPKln))Z62k$S zvx$t5)9gvP#}CQdF06@&s==Paa3OE3xf1p1RomR0gK+$Wzfy>v-aEr6uv~;s5=_ z1#-z({4@t9*y8yLPdqC5il;&*kLF9hx8>1&(+&8EJ-v%-Lf}?n@;eEm9n>)g{!&dX z;A?8ifj94^89WI8TU{BtNLz@=+KkBTK9&NK**h|NMRjCAba=-g!XqoCj+D)mD+Qvb z;HpQ|)vM~AK*eu|CMIzRV{Q{3mF|Kf~)@F$WZM3(4#vP=e=C}uHamW_`Oyt2mV1!ez_QZ6dbEukI7TNRF~uffg#Eq22}-7 z?VVXxCG_uERklcEyrjzVs!MGjZ&_I$T`L1mQd2kZY&GS;bHwD!#pqgf>;~ScrW|-z zpV2wf*9&|wm>v=s6qucIvAFzQqjKPm`>|rZz@5b8+k(*>!4df9K8}or@2`x& z5n}R;)!L)(Jyn+h%Yk+eA#kuts{@CNsra@g7_#D%h?!Lp8%V&m%GJ%x{}@cnaj?$O zT=hXTNfnH5gTJdxP2deBH`r^+ZjPd-#U0nkrQbMl*;kX9en8JubxF?_c)pqvAX42X zN7|3n%Uo2!eU!Q+-xPRFFkLG!a3^qo7`&>BG*Sw)u@)!?W@3uB7=fcTFavI_rWCkM zi7RU}B17bL3-pL_Co|x9rEdZuETq;W^k&gNCLBn1F9?B1cA|h~`sGr8h|r&?Qgh&K zVv1Llz~ePA1D>v?CUAC%D{C{lIXD8#N$o*TQY5-s1J6*d7LYW)){Jfqj=*wKd*SdU z31E6|1%OP?eT)bsO_B6}Fw<$0^kP+;0Iye*IsQn_#N10v;L_(vAj{w;1S|*I6)g=QG&eMVk6X;ka43 z65s+grNE!5DFHsJrqrf0P5r+-n_q|+l*E?{yyv=C8;0Qdpk0Ybwf@8I*(J@S2G9Xd$DiVllS2Ex@ z>HEOXM!VeqMGVJX5nKQp)S(Y>k7wcI2VT_Cl?6y0-3kHAT(+sV|_2@WT0?t*ggs5wS3Am5U(Y=EFjKJf9=>&lxo#~`M z3n$UOSl_4w#!Fa@b+f4kMkY94xPPoVbKo!3)C4{*Ca-|e*aLmpmO_8Ma%DiG3NE{@ zR#zQe&kI-aV}#%r)i$LDCPCp>UDsE|{~xL=0p9UBX43-RucibDd1UulB%JpLZYqT| z_f`||EagtG6L@bh*>t97#!L10)>X)XkBBMWFa++Zff+DWQwx}txUx1QGDOM%J!0JM z1FS2369{1;wH~22N9GQ~fn@hG5Qt>AF3HS{)rPm1zl`$(e zOyv+wa zVqA9smneM`2%+x|MuFaR$FstLWY--)Bs)<+2$x&^NGaXM^5`z!fS+G#RS6ueff;aX zHKo99N?h*kM;VbJQdQ^?E*lveKu(v(%IT1GgzO>8X(0T7X3Ps#c3NU((#J>2lybYH9)>6qDy- z^k{GdzS76Bzoge|U!^J|xmrN<`4wVBhR6!tEgVeOtq^dL(xzZqgHUNt_Ae(=xj0|Q3aP>3jz`2 zjuznhnyv*ziC+swWQeTAA;NK@a^=7`#1yX=fyZcI20TMeE#T}Dm-{qAMr2qnU3GMw zuJlbHgnrtL0=?Ogj}Q(dyA2tLWG4y;pJO%YkYaCUXhC+>tg1yL~@OgPj8EZLg1QeN`dQ&$tz-Xa&QFB?c>PkzTjw%9?|iR zJi6rq66M#Xzd%$MM~|dgOVc%hNG`bCUlS9DQ-UM#0yWiv%)-YqLS3Z%D+tG`%9W6D z%V4Tb2p5z%VjxP~9D&GKZc)&)Qtqk*Smw&xjKTy>qi!d&I3UahI7v+{V6U2T;50D} zs+~4K6Smb)K&a4lV!2)(V_!U9-gJT0qea5`tUS6S0r*!j6-Bmh&=B~r24=u=pxyWh zB#m2E;O~^H34FOEqTXgihDiJUn*_Y5TrHyB2&QToo|312t1c-~A(!cdTHW)kA&;(j zz)QpwFCKv_XkZ2$r=}Kg;}TcaW<-X_Nd|hvxDo?5Qu-zkLVqwZ3iReAGekI$>~<|6 zlAS0Zga!R_sb5#ok1h#M2XaqXuTc2h`L8J}4$%Uq)nzbO-c^aoqv@snR!r5Ek_HHlsjqy5lebjS1Jf@^$vs$P-qur8)M#z+fnCy#FL z0A9M(?jUdr4a|UhtEmOtr^J=D8Id8<9nd4jbq8=yrEdZu^xeTI(3|eqL^zP_x&w%0 zCkhCm?+!+R-c)s0q2EoVCPZby1Uynr>1hH3x9N_F;(}|uJE~rh?yxRq9`hyFJ*qGV z{+pUwz+Z^TD`NCHnSrY(@IWznM@9oPzZ*rm0Uft$(hT^Bnwmf|`{iPEfa+)h$?P2& z1s$es&_NMgS1J_x;$8g#f`_PWN=>oMGWPEO_hc^2&2=S^xw&-&GO>UDG#87GceJ+Y zYBH6z*?j*LdC;BMfyCBa#n zQ4nmts%#5ar*Nor#~Todg^qfg(N!wA1^lQaxZY;8iVAK4H&Rm_h-#mN(QI{W0oRsw z@Q#c|>*}>4s9UCcefP) z5mV4-x(;-Ua|FItT8FI7h;DI?K+5bH8Bw^%9Sz$HGm_i^kE$Lmk-SU^6~~1-x$O$r zw`7ch0#h=$=sDM?Kvu>tI3s$_IRfc9w^0L`yN_i=&$(D24d)#h(R0ob$Q-<5D27K& zgC+a_Wc5hOM)yD2^Jd9%&k4&8r1I`}=78(#!IIcD?x_~%B*U#lt1FR-sIPd zO>14uJQhoiKdHhT_!;?%m^;G)KPM)yh|wMg`-X9j)gFTWZKcnE`zd`l5JJBSi~_wm zZlE8cTy@|{V(Q$E$zY}!i~BagvnP7d9Y+Rp#8^0j(Gk7D^L1hVK$RrG!NTPl9Jooy zIp5qXy0TEL7N~%`s;QUi+#F2D3hO9|Y41vRYf|s`XY^ZGGX~NVyXr3S1H9 z%|t_KI`d|t0{)I?e;M}G3@ykgbEKc25bs}WR01qXxWrVH`5?Zyq9GmiD{SB&1%4p2 za=*9>q^3nAnBuxC9Uyfm+`wUu{nmbO)zCz0h%$#UGvr8eSNcGrm;0dlq-5Sk6(qpD z)RaOSM45eTXYr=&t|&wur$h-Y`lz;O0(@Fc^0stnqxIz}7Q?;Du*EfsY*e?6GP}$+ zl4}>0W3JPX!DNa*Fk~BGn|7FhN5rwmxDx%VWVvnG*`|uiinZZ0CfDW-aDU@?bQ>d- zBWjZebe`JKWJm4mn#ye86J(d@(cK~kp01`8c($1Q`GL_^ll){OZ)!ompK@hDqI}<0 z3rFB#8dwLOrluweZVe{j?P^MZKT}h-l1N5G&L z8F`g-ym+4!qJXp2)UxT#Rnb?)dyYo+*eKHkCyRHeY(ms`l_){~n!4QPFc~jTeOg^| z;5;?;0xuGi?H&QYKP;);o$PWER2Ljc0i&Y64ySbJd98-<&;MX zmM*r7$ZCFCS2YKIQ%$|V3&i9%DMs5K;-|e7`kj<30}|EGCM5w44Xgtn6qDOhZkWm7 z5iu5f4|qx0k-^&~M=(-4jMXKaEj@jqJVw^*VBtJc9-RwtmYRAf*Lq6Sv#G!@1k=b~ zFJO{9x})(DfzJlh2q`(rBdQ=b)G8Tl*08QQ8z15LQ7q%EoClW zo)mB77u(xr;!b#BTPQX(#kN7XIN+QpioCy8FM<7lAPRD77diNz6P+*0<52hd-~{)# zDHxM;Df=WnTAnHyS*h5xhtG!aDOp*NsKNFj=(GXI5Juo9D(=uajX=+hPpqgx(v9VaIqQG;5sTxHUh$^~_33f|Zv85vb<*{x& zPyF$XZ1X&|P!**>nBxb`6B4lD;eH10!&TsoYU&0)AtukoXv!Cf?FN2LOiNEXPBUb{ zpQ$MYlE(KXBQive@ZrLNYIouw>J_Co7v1BJ@Uz%O9$h7XXQ?R#enU)tf{cC{9IFih z{ioF>0}|yYxa`1sEYP;Q&De+qHq3FduSjIBuEanly4=&Q9qH$@r#!l<0`F8)3cO29 zo}SU~gJZQg8^}|8s7oD4nssBpQ$E%GrH#b>uDFEFmdB{?iQX4A_bi9+Q{sd2rSbMR zCA5_)wztr_1py{%%77Eql=KSxvYN6}1zs9VsC`9E<{V9(Nn31F;CUKWr$&zk6XcY_ zeJ0u8j3F$O&sU}#^1x)S>bDi|^EGNBkogubfnmBoxLKL<2}KaQi+F!Sqq-n^D42i{ z7Wu$IxqKKE$d?Gir;qYBx9Y$f)zk#uA|`*F1Qw50mS=C)K(pDU^3?I_VwQZWJauw# z0bZ*nbGfMkQ;2Uac0g)0}&U3|^w9W;1 znG&TacrBRVq}*Ebu)8rtvbc7 z_weZoxqxs-UJFka?@Ki*2VN_tVlM*UCN|%pItc-g%~P@r2!Z><0>CnteL=85IR2_! zIdJSipU+JPxVf0TE=GH)V-C#J)B+x(rW|<&P-Na?IZ?ca3$Z)mPBBMZ)oDQOplT;r z7rUC0;xU~=4jeRCTMRf^+5#t>h?W>LrV320o`dL}qcXW--@v>M5KTzTvxZMzKN8pZP zDn#XNMxPIkz=QiZGP)!%gGaw4+tqKIHbXnp(gk#Z-vO+l*!eN8mYq92q?l z9INe!j&0Q?10JHL6i8;@QjAUwj=;0klmQXrV;Kc$rX8)cI?@hR`X&%D1$|vhbXsr( zqQ|u(5HUWM(d8Oj2L`pK9j)31YL8H&ZeUq$L)Fd-jzGi|(i&|>*QsLz7^InY+)2C- z(kRo86NdT5=$1#qcViMoMhwGCCfAUFaMQ%Gy5w5Qdv0SwYiJ02z8-_R)2j)25F`puNT^fmEN@D0wH`%iF4qf6|{MPL&a2x%G-=K2#&xl z`ZzK=IyhE$M|Av3b!5PrMx{V97dkT4v0iWlZmy;bh!`KsC`dEyXr_QpmvB7bpz2?WOOfO#9>Tu1R};eGTK)i z8^9pVwBxg~w(sZ~n|53xge%LNzixK~?yaU4@L$AKh|1fHdV(YHm_Ck-ZU~Omc0|YO z>XHE`s3`@KxzLfRj!D50_$4)EK*ac1MnRfsM=Pz4v^|x+2`o#itF%^d1fs{aBM>o# zw0fJ-X&PGx2DPRgt=a}^_f?{9U|DTL)gBTYfru%jHB{P}>ev7VX{H@NCf++~lxfE? zEBVIwv^=_Y1fHm-7Vso76{7Msqi+UB;AMRr89f&qtL=!6z0@TGPF7P2B(rZRM&|}c z;H7HHfQa$2jDj@Nj#gS7X(uRs6Ns3CzOE%YFE|3xev7VX{H_b6Yrxm%CzJ7m3?CzD37ikfoG_x1w2bk zg{ZvE=*r*-ys?iXqt}9CwH?vXP?roiOHC<|%!Q6jb$ll{0>7uG42T#X%P2@Q?P#Ud zk#@S$H-Tkob(MB`a0H^qwIdKQg|vE`(LEYl2L`pK9j)31YR^=nZeUq$L)Fd?jzGi| z(i$r5A$4p3gEZ5Q2Z{H|8fDsX@+!VD&XGsgj=Ys8qt^r>bQz0sEGdgCZI##<3 z`ZJY21HPp6Eg*!xQy2w$^Qrd_g!Vb5Pk_Hw`VIAGd{|-IMex_wgsNwTz$G73 z6L5o3ArjmrHuupH@UoH{_=@0mwZLwjWDjstnPediyoFA@XKR5c1`}|*^@B9*>h0rPO3 zWh25rXGWF(ZsCR0bubW0r|aG63_j5MClUU4r&syk5&jQUe*&b<9RF+6Z;_rOPshk= zmMZj`$?$7oeko-5a5XPuh#oo#kfiPde_H$G;Dw3@)s+5pEzh<3+WyfM=rrlYbG1Da z+VhrRx>zdpP^cJiiJBU;;)S|y$s&Od1k=vasE5d-6LF8g2ZE_u`!(b^jUBrjovse{ zpiDUcN3X-A)2?+rVUiKg|XX>kD2^Y(w`(zu)61o<7 zRr}^vnQO<$;0-Yr2QGNB>{J~`25eu2BluET@Q&jZGT2D=w~mp);bJVJ!PK|oSgml! zNR4ToA{u<5)V<@#;4v{4j^MY;j@2dVM6+J!hMognB&HF?0XTHrn4#lV!c;m8U!Bfj z$WB@asIGk{7ps4jEP2OxU1j|{#%c$2jMe_72Uu`->k9|y99das0zRvzZr}@QN`N=% zIjb8uSC8yo;MHpC1|FbiwqD>D)RX{OcBiYl=+4BF->rvLFL0rn5+G~q0$Ev>#hI#$ z;!M>waVAzI9DKdi(mSte;jfc}?p{6klB&xu1kQnLc!KZS1&#<~t(45uexf6k%$^ zzPom4KOkGNlQDb7Ueaaf%A+&BKb;L^TG(mcpZ&r(wZ$dY!lGPqSYkFMWTR@Wt9 zjZ(Ru=!7!hlG*vOY@9ecehj!6amMGScgbeY!R0O?ShR_Hq0t58l->zt9l84G7&)zT z9n#6n;MH&fcy9U#xqN01>Uc)l;5pOL9BZuQu+DKgZoqOJlv(xYcwW}!U0t7~D$JFn z8Z}aSgA;@MsEh^V0CgtdIeN^xzZ}9KEOg5*bc=-!Yuc(VpG&a2S-cjD$4WUb*6GVq zeP?1pn5r{T`7yFA&QzWCRx;~}dSoQP$!h9G`j+9E7r2|6x~tsmQmkolF~Q-rD)Tp*D zW|tf<8|cxxk>x2>@(eC#T zfwzzG@$S+C7`RPSLiBs(ZUNCfur|GBg}3gLJgkyi>gwu5juS{%-%wRvBk(uD1YAXO zxRT#BlSY~>#>lnRuVofwDcYkdJ=QY6l(^q%6*3@HLu%8DcQY7H5V20#yqOG66=RVC zT$;kXnGDbr)93bKjwp_%P76xK6hP+V z&RRfb;grmu$pGzcb%3R5%-2;cO~d{qEaJ{l9X*!_B#(QapNfQ?rN{0pJ)t-r-95%X zE|fz%w*@yK>I=6Z+@s?~{#ja`6iArs zo4aQA7x!0=4ja?gY3*OO;Y8WJY%6`9kphKm@!)P1%nH{!C2? zkcD&?rqu;>CT5pv$&-Twwt@+GteWb;Q^Zu4fxq-v1>(!-sN#=q0V%e+e zW3BM-61S7qxCeNQn2Ink-Rq8UmV#C-+`zl&e0qSN7So{Gi~(&16f<&9*>6Qyj|yu6 z4^>kF47ytA3fyMHphzn#QR7U3R|gZ58Lg8suL+)zr~areIq*X@HGzXR_N(T%8Ac<; z>W&HEYJD6TZKjSna9=ews|{hLWk`dt(2=zn?W9~85c=33>3UJ-_kqqcWk#ziQwlju zk>fQH?=FqXfj6ls1>P(sUqePe3XZ@#`#4ssGf|$MqJieUpd;m}v(&{LbXAw)5WxKg z4KvJ(2r zG@(HhL{UVPCa8c)GysBP1ann)SJ^;!!x$MOCNOn_865*SsEmUa>Wn#H98^?BM~877 z#f%vY*=Y6j4y55&RxbL;j+H0?!!>Ou%*{Sl-SERC;AnnxG zr48%!0~Kd`7e_sz)p->`9PU*oi9Y9os842>7{t9dvjOZWG6NET%XCVE9$#Z zV&dwgmhz3*knA&w9a)uXh?Xof(S#=LGZlyLJtpo%i5*gCYYG^4_mzpZNgNJC6O&^@ zT8^P@nH(1@N8dpbIff=C$C|VpL)$Vro~IVP#5HOn$D~Q(A}MK-X!OzQ7h_#l$wOas zss`vwQrW2qsY^fGL}m8txX(IYwb19Csve5N$bD@Q$-7TXMYwNpzH-oKovHxEVdOqn z#(iq#;L{xQpad29O8#8a!OHwd7ep5Nj8oM>iOci@DDKOQrcdNxm2;H+R;zPPYA_<+2un^eIbZSbM70V z4! ziPu;`38KuPUm^$3I!9S34l6RpugoCe()?iKO5Y*G?o%Gt-_NR$jKwn9k!p#rHB!BsUPYuLFB>EY$gi9hj3Ma(VFh^ZraO3M+~r4VcHJ5lT^{L z&KHr^ALtCj%ENuNb6*SH&bco@aTvL;E#p2p6UuF)bDx6}l%37OxQCLK)-E981v zzvfb9*HN?jq9)4mx~xCmN7t^{&>8Z~!QREpiInz1HLuX25gAXI^B*ivDbGZ+_#Hkvgmr7-QA@yrv z)n%?3aX-rWs)f#Rs)M(%5iNPqQ)(5IcM7V3jY^rB=CIfA&rIVwQOHVPtFCWt~Z zh+Hy=#H5f6qM9HsazWHXOM|E`6GVM7i0WhziGi66qK+VDxgZ*#r9sq{38EnxL|rn7 z203=XHE*5EF$?{jQ`L|;d6+5f8$E5?!V)typgo+b2HM-HvQXbg66fs0<@-z*L6!(u z@l1B}_4Gb(1tre1Z+5b>r$NjpgOZCWAM`R=n^*P2L=&))G{zJ3dZ(&^-Y-@8v5(V1 zE@3V7PNynB?StzEkC)A4pZcl^5&jb1q>m^i8L#f#TD=iieiEPae`&%1386-15*>Qk9R3 zgx|U#YN1~^Uj^uwCBABlNaRqa_wA(wSz+8l;uC~zGRK;?gvr(o)0(k~n*)@zB6D1e zBEpeg*;GWB?Ul_%gnPYmdJ*AYQks)0^qEpSgcrQBxrp$MS2iWO=|+0EgV1zI=toXf z1I3lGQk!^aY3cex(?_92rz$|_OJy4#>CfKK`xVopZJbFh^eU&Sf#NW7Ut2`-?h}*y zAo`2?$#8kor)TpA`qZ8RTd7Wi8TwOR)7lhmC_u?Mileqn9Et5dIb@u#ER<}@RL)R^NXTXthT_nqg5t;qg+$245c;d5Ck|TX zf4Pxxe};-{CXum4go|7=<)O59Y!|lpZnDq0blIasPw}dYMQ`(}+eIJqs>elN^QzZH zzw#<-dQ0E7&|ywhO{E{G=*gUkgp4p*>VTf3po(U~YnA{(Bl85z$CP!!&smkY=OjuhkVKT=mx$Wa~gzDXQ zrhJacgtg@oCUYF5oVM{fLbsKwe2&S4wdE2fa~v(VyZIcUyZ>yC$%M7#5+-xZ%5AOB z5t{$m9Fqxa%Oy4tJArcj0v{$w$BJH@Et;CqO>B#ZSGUggY1y66!H zPSX~l3H$k0GBs~9TNDvGI@ft9E@QjU*;3iR?bAVfxeAZAjA;p9bO~#rr3sU>Q8LFI zIez7Q6`=o-Dw>UQMWmi?s1%^3nI=EA@S)taaS5|f_Vi`WJ%ePui%aGHcE=%7r7TB! z%3rQ9QzEo9VX|_PIp)Z`)&)_3=1YRe6_LoH%t+r;3HElrvd|i*s)5!!RTk=fCk}~I zWPP$rm509PR5j4|r7B;4EA_O4+mq#?e|M?^lpUP)h198)?XspCpk1W0hDbYjL+I$$ z43VDjhT&)+;QzXk)!IXm4bw91=5okE*)y9@M305%WETBx zb2u49c58NDjr$9ntJ$OBvz+dP47|ks=ry~q!~HZ@pav+F6xBqXtFrZ7l{G+VENh5V z?G2%qNM#L?h`7ur8fd-4U36LKY^SP+-r!VOf;hkhQBQXBoGJ_T5hOM`+so$;-Z%7d zr>dc zL#831gc_wx>rJ;PuE++?A4)N6Db$BwPx$;HnJ6WElncL}@QE)ngA<_Hu0nq<)+-ca zNf!x=6XsUtB6O)@`^3eVhxTr5{h3tI&83QZd%lRYqc?=^wVEN)Om7&5N*rIfIBKC) zE>#VboTE5uT^u`jL+GAPRSP8;n-&_@+QxQ_zCv?70e!ozeH2BI+(>2;32VcI=J&DA}5=SO!kMW+G2IPizlxPMJ)U z(4Q|}(syd$w3}I$p#&TC5Z{D8^oFGSM9UC5J=XL|XsLVOdA<9IN%x69iF*d78Bx$u z_kN6e_l2bU#LSKRiLO;s=AF=&osGf~ggb(Wr@t_1**TGvS16EZlR^RU7U^)-OEYt% zgY%ba%uDoV^qA2enT5gTW%C=M>2%POoGJ&!qltb&Vn)XmM&?7ci?d_m3=`R&q7qWl z*x}!#q^KqqN_wPXiS5XMa+Qtd_dyON&h~Ky%R+H!TrHfAfPa%TthTJYPY@atD7~m6 zbL{jYLebgPgbix;_mt9SnAi)gRLuW%vFD-dRNCl_BWOpdq7IrbB0b;@!}4_1qoK|u zd!pzZuL@KBQI8g+n=IC&C!9$h`jk`ELf??e#vNw2Tu)cIgn4MLovQST@uasYWZcZzf0Fh|tK*?=`jDk3oJ!-AZx{bHEB^cm?v z{G29*+2DoA%e)xaN!AAlTV{4HQdE|wXn}-NkjRdl!3iRV2u(XdkCdt+Gj)1uI*iKP zQsLU0B=(6*mBn)|_dN79sqDa!;9$AfzlCNXLHoL^`x@xLlB@fC5ovpG2<5Y2KcDF* zF4J0QOXn*OE%lWgTNHrLN1A$vmL^QjcI5b#f@p0%@Hn_z5s}=@1Odfgn`mGT?UrcD zZ58_wt_%g<+L5%(xsO!Cl`86R@WY*_nxv=1eqe^IpK_`4(5dbcdm?n&YS;Bh=X*ow zE1cI}vU0@=~_;SQ|oXemAI<2Jmxgrvwo1qUSbkm!m#BHpg#BHpg z-}p?S)N)jSToH+4m6>mnWvZr3M?3cg=(LhDRhKDKAz7yCWSI)dGF4NiFMXy^N)eT* zx=fi8%M)d~-HnYpC^ZrJs!I&&mdbpT3nB}h>{Rts!nsbBg;IR8N>l7Vdn*dEmKy?D zXlJS7-k8?!{0AQf72)eS_w{7{AFm=uid|;+KxNVD(Ub(|^J8Y0M4`#VsGyWIN(rZh zjT!V`3M(>$KkGuxLcegTnq>5AoCZsy_f6KAjK1-gMc+vD%n(rq@NZqHjmc0GS1_Gq z-Ax#If)8_^YUyzMI8|Z;K>yfW#7uusKDlEjFr+Eo5PF|f))1+M8!@%eF;ZDWq;tF> zl+O=aL!?ij98xtcH5hAr=epVVq&sx2asLzy#G=sy0A zIT`%uGHAqAg?rK6SSjkgud&ooW8?fCR}&3T_Ng_6u2$ap(L9;5R@z=A6Q0tYO z7ZHwh6;cB|!P}iyJWaxRUfH5}v4p#XCTHmLPL+ke?o>63 z^3b*2Cj)9aiuU)aF#DvVS{$w8QWc;$v?Cg6OK%9>N-Ap@W=al^x#+W>L7lHG?l<+S zH9K-2D{0|U<&ut=z@5KAvfj?6%0n-As+zf?_j;A{AVR9~&LlfS^kT2V(G6a;W=FX* z6OM98M~R{>R;s66UU}%DZEUV)03I%SmRE%lB^}k`=(jFaJrsww2OxR(iK9^HKA!x^ z;4qg#0as^uRT$~_Dr%)O$xapZ0VKxMdrI}4tElW&N;S?qB6}Q`nK)L+!M}ykce10u z`+>aDWl&894K9P~WCn@-^ekCl=ThaN-Stv2s`ljiO~MCU!dmE~QnfLkNsWFJ=^4qd z2rG^D1oH>aS`^W|=TgK^ipZZhz4i2^K1w)E33YQ`+3@XH&jG(2>l>FH?;=fNdX3iqe(uB!dFFwI? zmlAf!oSdnw>Qh;@`KhL;XsL^hqdsCE59xDUWt(1eT6trPe7`u^R6x0Y5$j9(1!Zhw zGLKS(6$rFpp8z|0G;ks1?VkK)d0QCsq)Z8PE~;Nr@l>3gud9(1p)n5D${#f6cJur&)bQ< z=Ttf9!RtG#dqh9?D(EiyzNvW|06om93ecicH9)U+syy^=rz${~I#nL}ty2}CyKX?J z4ba~@RRManQ#C-Zb*en{Zl@|hmpWA*dc;QLSb(1ERE^NeZq5qY#i?@8K2BAD4sog+ z^zrV_7xYc1%0oBn;jEzBI8_65QI)fTKH^jj&;dQ26?7Y?YJgtnR0ZfQPSpTy)eB#Z z(2h=3fOc`J2IvV+)d>BfH@*trh|cNbRL})Zm4{xinX`hr&AT6-#Jy{f*`rf)Fzjin&dK5!!k3)tvof*lcb6d`UvyA9rOlo*P@7! zb!$`&bb?gzQ6FKUw}U?D?3$(*5k|Vzrv`eDQ{|wKI8_aFnN)GE2rOV`TLW!!%Sa9M zY^hArmPLfk+cPtax?w$O+|zqy&d!zr)q?r6?bTaZ@lu=k1^m zI8`2chgpe&3g6w}A`{9nR2K7=>i8d3wjc|%Iu2;HJ9sv78BPSpT?#i?qbr?|zZ z0m>p|j@HlzWEDq-z%pd)pjBFaj9rT&0t=BDY|vS5nW}+a?vwT`B7EZQpsSoJ4`snJ zH^@*HEE5}aH@BQMLMJ#?4fJrQYJe_ssv2m=Dyq9-L(z?erszG32m_p54RkwiS5ZXx zt+#_-Txy5#s9V%(pi7;q;V01wEpBmFeOSWdZt<&uKIK%6&^O%TSF^X4sYBgz)d+pn zscN7sTV^{4W!W-q0QDMX3Y>SiO}CI?0G0P7TX~_?d_n{ zXl$1W{!yoF13om$xVMn#+x+^SIjwCHYbYM;HZ8DYE&zMiFm`PX=ZKI^7plN5n{q_Mk2 zL+!tAB-BGITvg=Sh%zEfLMTmY+HGMog0G*%6(jX?kQ*N3pp%^{3q46SV7%YZj6k)R zehZ~Uu^qxmZbr#N2`sh?n{I^i-%A)5DKt7&56^bNHbQ?dRjW+%-!ny|%cbRg1WoU+ zNE&JS?r#6p2;EXDv%TnCMA*qGPwiYp*wZPEWkLI@yWRe(5&Ec9#^c6CgqNK1q>YOR zZ#kv0e19EV6GPorsS&!HRNS#9cU6t-s$L09x6|%vH@C5Bgx2_tRi7e4qf;K&r-(4c zDVzHg5t_Y6=!H_z5^T**bR($|da_iQB46nA_BxsU(@$=*)Cg^*k%x4aiQZ%wNVCBc*6;-xN+#xi1 zGxS(8j4HWqyG8mlt=kkboKs9{n}h#QGD(?_Pu!t|cMGHLc#63+M`n^T4r%uz)SxCcbhWNfNOXmBmEtL%63RSe zYRD|_TJbm$nr`}$y2ZzC@|j}ZX7wr}bJ#Pl!JsAGX1QDTxn(rvctcl+-1$W+ozK2; z=d@ZV^Hdxlo$vv5LX#BwGaW8jAsl+h9VK)-ry39aqf<3NZ*!{gP;NBM>mKNaZu2!B%Hm+G%FGzc zo0G@6TCO+Ga>u#x4~a6rL|s>^lBs5SGXiHlQ)$p6+-7&YtsejX&YA<59@=D%kKY^5 z(y(PFM^7)#s>`Ae%YxqLWZCgr&t?mwX&1ggI@6AAwENmz7@5KMl+Kv3Lj9ytL}qY5 zi{&b`Tj?*1%;3x%X5IT*kJ-sYW?i+b8R5>NIbM_eR;tJhKF^!IBicq&Phe0J_@?K$s+7l+~{&*FgqzI z=YwY!pSMv>cHP8Y@)%GtuaPKWvpSz|_B`9@(I zv#p9gwSmlP@3Z1SvD~fQc4Lmr8^6lT)J(hwa_;~c7v_oG9TmH2j8_TUWR8n-M`i^1 z6k}z{@x&Aq%HhP^8bH}07^@yy=0tT+R?yCF1#N_~g2tZ1>B97tO*J$05pq&P-bH#p8qnn2lO~0M z=77K#@?@8Sk%i`1_XJ3&+SS-#sv`{X&Tn#`ZrxL=PJ z3n?%%uPS|k(Qx1E2XiL)$4w8{cG2N2yu68Y+}<#oMmjiiqnT_urk3e*mh3auABl;GBe_B?Zp5$IM#LKfArepdy@^&;$Zyl8bVH z`w6ca%04PGgL4itnKBj!gEJGElu)*Tkr|xRj42jpm~>#)$<9U7`RZ=C5> z94+4Qs^pQOn$tr^&1_Mu8;b8%qJ!@(ojLVGnJ?q|MqtK_{K5a`($+Cia-uLzz?{h3 zXDX6OkF$cYVzOgL75Rsk+%&w~jKH2dGK4cpnnr;7?UfnN+I{)+MO|{Pnh?%aCSIng z7u}3D0qSS2Iw)t6xZV&B(41vLV`lRQlRD-nZmgq1WrBa#=xX^^p;-ZV*LR0|*Vh20 z-Axb+nz^8(LStp%J`-MSo4Gi=)oy2ZBb8&i7q3c0(?~Q|xM&)oCDAM^7tONfFq*%} z$={r_T4;&0#pRqWPIXq2a!I+AOA;v`NraIv6UOu9oIRg#_I#x+Wk2`nk;GR1U_IjZ zbxb2e=eSh0&>P%mPEJVv-KIhM2+4S%*+#dp`$9D5=t+B?4DMc>EghdtDSZ~U5%>J8 z3Z}<|*U?7BtTUj>rZ*}E;u&r{m3c|q7-n~T@Pe%5#n(UF$+Mn`gm+zK-d-71n(qp? z?9?W&@N1L4Yq`Zf!M#7L4SnCGxOsgQ|A0oHBF@g$&QIzv^%Y8egV3Brp|?q8{*Ks* zMFetN%lxTbdk<_zD@sBzPQvVsD$IJGDx+lKeZHAyyrRmQo4MrqW+oOU=U7>0K1_}Y zKIK9lrg!l6gSQ<<6=rHwWI5d(sT;!#ja68r({$wGLoTM&$=4!@inuJ1sydmfI?OA) zDlrEZZc1)-{k6cy`xq0(Ds;rvjCUKAo*^8SIy1GqF0m_!gbcMyu2&Z{FDEpw;4&gO#2W4{<+aZkH)Yg@W56X@y zwnLcb?VyiI726^F;O(H?(8hMG=D%^Pc>&6*9@~X2I7Y|V-@4;$7J8Ia>t~K{9go++ zeU5Jxli_`O78zx1waQzC*=4qnMrby5sMeFJB6DJkBEleNm)ll!q_aD=MR7+7dzLB@ zCV6GcBEl3Y%gidX^yrVyBoBSvsj|?m`_jVWp?f-27J7tJjfWoNREhCK1lKFOXtxEw z%Y~3%B>J3JZ7Zjvo%4KH_wUL2YhmOZ-pVB#x3=hJUbU;}1g|<&)E8!4nBNqcY}Jp7 z%0qXR%5=%sn)Z|M@UGS_R;D@Yl5R;; zS~^N*cG1w1bje+0vU2Lmq??}_C&n!@#tG}8fwz7r!P-s3^cFPc} zx=(0cYOKGVR6=95_He7J5*k(OU976N(5NmHz09kujsL%^g6ZLc%0elWd0hhC(OW_H zk}Ceovk2ABZo>9k+RSzpn*G%kqSrW8!*`;Us)*Pd!dk9&3RKw9PL+ke>Qn`&uh#50 zTiY=D46tZ=_>Ae>OW46F%{N03MoVdykBNhAqJxC-XWtPfOKI#b7rnOB4&erG_qOOq zUNw5C%_1u_)pW=B3S?KLjwKO-Dorl@{x(K7tqVJm_Z!f*6rex#{6yl|0zZ7Q`xIL|AWH6hgcg?VAqI0+@qw=mI#!rG78oyuR^SNFU`&=dDTXGd^ENEgc`j=AW{lU;EbI_iu&i}HTY$ih4y;NkTPcAa( z>CNVo;m~{i0QjK^;afKVCN^mK?yi;DB!!+MRjbVOMbnE&%e^6#6+DiG3F9j_hfIXh zg^b-EMON5eBW%N)jG@O$W$gAXo+sf#ZwH;{?T#)Ytn_x!3b!UtKe~9Cge!z5U+9hA z?(ibQ9o~-Rx$`I&GPJ)`CglB#>uSyJ;@0ko&^}TbyCaJT$9lW(MJq?UETC0VnWVYm zmpj|%zL%P+I!xp22shp)LeG@SB(5pmB;hV^SEbHKU$$*-^YH&)u71cax@BgUBAgCs zjzaV)c9AVJ!(I28=ekcd^siExYr{ibbJLv0-D7Iek6p`F(}*;Zv7*vv#)n+cjX(!3ESI;rwPrmW&`caZgShU%3X@Ps?m>fjbFKQ5n+y3jx63QVYyfC zSVU;Qqs^`&Q#q!%i-g~L<*4G(YVA2fW4TKa;Xbe2sradyw5ywGj87KfRaX(4!WyU#{beL1p1w^gC6XXX6J}L;8kylw)CyY;lI(Ta$ExV z!+mW}?W@N4t=I(7DP9FVUMlnIN}p3NO5=5Fcka(Y2TNuCxJirRei9z=cF>1Q?HK=+ z>dI!<0^P)^a(zYV_@-Lu+w9#|ge9cMmmC)}B_T ziFy>1_ZhY9W7xD9cWn8VxQ%cPbeLNLa=U3m!#FbqV9(p2J#pNL5t`iPK+QFxk2+O0 zd4*8Rwx`*xb2U&lL8dyOeu1oIfn=X!iqu=XmgC*-r3QM2Q)Qtnr>)HONe{O}@;jee z=#MUK4R;!>jHWss(Bk-{yT+)2zTs3^=-X~7ozlW>nf&TqTQ%Bt;=w|b!Oo()3T-1J z9pDUe&r5ZZDhZ7i)BWY8W`#pNC*VZ>^wk#asYG+&yU?Zv;GT@Cd8)f^(RH8t(Uv1t#t z(X3%3%1O#tCAVp{>`Wg}!gydIJng+@f`8#A#$0KJ3yAr7+ZIJu6Bdc`H^l$Z(!r&0 zG}mbb@JmR66`y(E#5!X-0yn$y^({ilH80aHH@j)qyt6b1bF&-UA(UM6J|Vl8-JER( z7Xo*{=5DfO5uxNln7N&)+SCg3Fel9a<2&LZ+U)NxH0=-FN2>T|4-guhT^`D1vZ;es zKYO!$iqbOWo4l@-YMFD}0R2>|icC|BBElD5*|LbRmb))#swg7(^(6Z%?xp{CFQKzq zIU0qghFTX9SYFH}^lUx%Ye@E8sr(_U0s5WuW-7)BZY9Xh5Isj2_e}(r7L)5$dhQQx zSt#p^IXb*AEAGzIF49+M`QYx{W?BNfDTkP14)+oY~j3#{R**fGO>{Qq6Uz$*C=i2;6iTZ<*lVE83%f?zZhUOoZ%i z%>eDHt?LPH3tNCPSDFcSK{In66JD%jw^r*9Eeo32d_C_rUo~u$*d>{0*&WSR_cNi~ zsUF6*Ce9+c2qg-7d2rY*Jx+1LF;&Z@QAakhW_2z9oM3W@SL-&gMQ;w4cuF@vp0dTxqrZQs)k=Wm2>g= zflmtM#e?aO(BEkCHF>i0f7Pq#wI{n?+rVth)M^s`(sz?=cQ-rS)l6zrUf&b%`G>J&TVG<$4Nc5Wb`t0V)^d-`&-0=jnoJkAvdJZEPooN3)2L`mCMBcdDxtNX zcUW_oe~eYwv_=&+Y+QVeVGgOr49W>LGK16nQPa@+1N>+X+unE!Ti&SF)b8>1^9kw% zCHHkyKKmAPf)C@0lZO7eb@Xp7%qva?;jtx~pC$zVDkIAfWM5=@?t&&pmVdutl+56~ zT8S;0QF&7pD;aJyNUUVIG16isFHJf0$4Um#d#d^`5x{GvF9kmqc!fHyc8FTDE-AtunJ`O;6OQ)rNIywPCGVZCI~X8`iAVhIMPTVeMLNSie>q*09xvb!@d^ zEn96^&sH1OwAF@nZM9)-TWwh1uV`6g^U@~s#pDayXEI?QM$cNu*he4MBzkJCw~jdI zsUda>=)6#K<@1H_U9pxPj`B2 zA7+K0WEEKZWKpd?EGl;@dF2-k8#v8omeQr=jsr`Z!v>2j!;qr=eAptfVHjh%A^U;i zA{Mh)hrOrF`c0~DOG*Xzp7Kdg`LKTa%ESIblNppIYME*71jo54-{NvrwzyoCEpAR$ zS#zf{Rkpa9DqF1GkO>F+gj7*Da2EDBoUmwzsz^r*&94_MFdyfeVm?}kYRT%4%(MwRA>T8=sj`~rm-zq`3o!mjQjsvb(q828C$Pu%B~38Jlh zc5=RJp(CW)(0ne_e8`-?no==i%9yw)y)fW3w~;YBG1F_Xe)VohA8#54m+CXDq?>f~ zyI&X$JNV1)SXd9`Gy109rkDA^etk>bzwuJW)ChE(yP9i+`u8r)E!=w-|8Ax6=$&l1 zT!$NPY&J*kY9E=;aE3R^We+%fa_o<;oP&z+zKYEB_vP;MEnLyXN?vO$)%rTNcB>>DJukNBuRlxkC5*MPY|%r1JN# zifHd}Zvk>poUWcA%{|s-Zi$HCTIFG`gyXWj0KEsms*~ z&21Bu!Tj@O!ogwAL82Kk!Lb>yP*TP3*Te9q>vLb+Ih$QJ2QKywM#UMR+P&^5K)EkA z<>utWwVz2C9&pOk&i8t$-$K`C{Qep;cXb^y&6RD;x^92EA}q%kMYgAlFbCaNs_2_* zaH5V6A7PNOGR$DoP^&pd$Zt*|&yl{;e2T$_h~_ev!v3%vZ5}kYmTUV6AsMteu z!Dv*;8^pu}y`!%6^6uU`+aNmItGHxqbW2?}EXsp=709bWGcrSy@ZetdE-5rBe_|iK zn{|GP(BuZ)es}vQ`r`$;#FRN&PlxYet;`$^UA(_lnMHfWRD@TgGcWH#{m>7CnbQ!q(0EVH1%s)6 zaLk;BFi*I+rO7lr}VN0PW$2<;-aa1EfsN1A|GWsS%pil==)A zlys$;)55N_T%F@9H%7D2ckKB*V|HNBjCxJ94G^WD7%O^5OErmHwg| zvsvhCPSpUV=1maPWIq+vsG!uHaUa&0QH9m;+hB%{UM?|yX1J;;K+khS%6uSfu7qBD zTCZl?1U=QM#zQZZ%6y!zqBuvwPtL9YZNHcG7QI&<(r0$2SNlP&x}#igZ_Y8xK8Ns`yii2q!qZ9CWI;t0|q zLEn|i%z3M(A`En^Ljk(KQ;mn7;-|q?QxWcTO4DP)IW+31Orn!CUz((sR(Mn_xtgKk=zI90>sF*lqhUZrmOyz8zLy<5xJ)-XSqtqGK= z!c0wfYNB}AO(;2L&oM579CVyirkz$!ML5^n-7R{rS3M&7q*wi0bZs}oWTBniOk}<% zg>Zng%R!mBObKq+(|5g9N6k~~3r*3l5WUH(pm#}CnVDW;Pg%@M2fGT-(FSLE)wPLc z$X}*wc7fmxhpS(2V5>L=f@=y34o-|+iCyD?~3r#;JAEoIm%@#rq zz{pH+anD6yiZi{4`HIbf=`!r(25EBgg?e2Ywhd&)?(Ig+T<9N=%$_0+;%h0HpG=NW zwh*Lee!0laFQ#qhOIRTE;oUFIBZ(*B9MPQEVhnOy40h!v*t4cFC$Ip_A8N&5zj^>(!ui@$SpHNif}q>WJhZ-3q-nbq(?eNHytq2{ZIOz zIZ7~Ge{gGJ1C%~!Zf>U+X%sr7Ng8%XqxvPC(U?(hl-;N(I>Xece#sy;W??5Zs;~o!+X5 zKqoV|Fxu#Ad*3!4_BV)Mb4BkEji9^derNXEvo8W&~4N)Ga& zWd?aRImm~W8RSFVAirOWNHkL6jBK+$LkTc4OAg+lWd`q1H+X5}C@l@`2cJ*;~hUe2hoBo7^>_s!<&8v2>ejpi5c<~Fyf+`M}cO{)W}=jeJmUqsqZT5pf$ zLp?Fhp_y^kg*QesSWk>G^x%Xsn#;T~^tyyGnmfF4TFneoBbwHPQi!OqwMC?}U6E>` zf04?x>4Ihi0=21;h}C2RB}i+CM98tvw4f){*e9l+KndQYn>!tW*rP0RiIT*ol!ZX8 zDH5@ojGzQ)4bvjbx(KVG_>2-(7m;vlwpY;79I6v@AYJ++*QM*Ad%H~YP_i*)UEGX7 zM&`{Clssd*v_cJc{>MS@cB(A&ey7So$v7(dxH3i0hGAI4Fpk62R~fISRp@n$vS{W| zryuM(e_}G(P>z~h=Wl=(r7{(qR^WN^iMT8fnY?F!q zqE!+3EuSm2ttPGb<6j6&QYPPUW-_WU;5aGKQ&&;QLAAwp)FBOM?4UGRY==Nq7(1x% zS*FNgi&8J$OUp&``f^Q7mTMyAddf{g#y z5Oo$k*{hO8ZKSAl^4MGJI#s6Y=8ZpF)ZyOl7Z$bgR~7Yp4f|-n3;)qg1z9MKYR1?6 zX39!Hu@Zqk6*+|a&SX-jbtc9|ln`E$?Gl$Q^=h(R(u}~+h*HC;*w_$ZD^+M@2xq*Q ztq7Fj#Ay*IPifhx?br~30!M~nd71WE?aWI^C|xc7=r6+W+>WOX`h!!|&=n`Su2=&- z(y8j8A2?MFjkvknAk;yrQ?s*yvfi3tq13V|_$;@L@O|C<@C*Wd-uQ#|)i5yrpjoG? zfzEWQIw;L(d_iflxYiK-xT%BEiY6(P1~p-XO&1p{Y`Z^cWSsBnu>hs3t`qGO><6aJ z?xmO8by6ATH3yW+2$P^EaFYZ|;9(L9LdPrfGNpxLf8KST`YtL4v73)#&@Gm_s;{S> z$-`KMm1R_6RgoRt*wi|d?EIb@4Y@}fiT^h?>{J6o{Qrs#dl+;yjZpxa%8ZYN<)-9? zKRYGUf8*2$bgYzVbzyVZ-O5d?XQ+Fh=N7L#v?SyUT*zc@BDtWM2pB%GGVIX|{u`7- z8}r%5=$lW-WMjTS@^G_#QAU3zvyw+)mL-qEjL+7N((h*zC+5o%CgVdd4<`nD!V3fR zYBxnxQvwzObKqfm`kk91s*|&>jyXPv-R1L4=R1qas^ds zzFT9vQ!?Dd8R-aRb%KyrWXP}N2t8V z2wxA{@3x@*Tt*_5>QD49>ifT{_fB1{;Tyt=jjVj8@Ot56-K_p;;g`Z}mDSe?+bhn= zLi*R`inBuXzP9i&)i;0kZB<|EZGjEg}uA||)5&FBkx79Fi!gV*ae^ULvWq&#m)hyo1;;~y>JXiRj@DpK}em|wF75+weu<$V9k-{+j^Z{0Lw{W@eg@IO|9b)l* zVbxG8ebO9w@v;XrKE3Yqz!h0O17TVM1?d*}&lzhY3dtuM|Eq!akp=?-hpW zm+JYm!WV?Qr`UfjeUFjW({F@_2#*w=Bn}Zl5gJ!{Teg(0=PN zRx?)kXW>p`r5A3rrRN@`$9fU71}?md|nd1CR`~D?UyUx_k?h9QA zeJ%W6xOOg##L8z#e~$2X!Yfnk*U8&-rwh*(o-bT1d|Vjj+O>t%^b+ge;X}gE|7hu}g^vlJOtD{HVLgm*WpSnON8zN_RzFo3=J&bM z5Bi1n3+3k#;Xi~=rTEXZu{pLEt}EO?7{)V8`g?@SgoD~z%hAHVl~x|q&f+1$GlcVn zp?}i7sProWKPLr#!t~49TTP3#EOr(iDqNHOpf%Xn=-hjb@OHi{JC2X~B zXldn&&KBDXJA%4L2~*A2^OeGk>?%|2o1~vEJVW@h@NMCH!cObk9P5N({!i!}@}h9L z@H1g(|DE)0IKK9!e@kU2;UQaAq@Sul)trvgJg&Q(7sc5 ztJy%F-uOKO|(`{k!DQzLND)xQ%c-;b`Ih z!Z7`8DHaG9V~|oG8O6P`a5v%JDdm}>es!{t_abLWCOhy`m2+*yn-!js5`QP@y9wD( z%ulg@NbCJ*t?SLg=Y_-p_SE{C70wi1&;^Ut@hGiFS*-^%ge!$pG+)k0nO~n&`lZ6p zg>997_1rR<4W-{y*i$$t#r|@wBlCqX2&ZV>$ZB2>7{-5TmDT(~c%ASzVU^MiN=g5`?EWo$p;spUx45^(@PF){>}j7&k^SFm=MzxMj-y+z!(3EZkREpJM-l^!Mu?Ztg%u zILP8c;jrz($gSL6>3Rvb5RMhDDg9E}h53$EzLSMBgmZ=X4Ws(^aI4vNgvH^)U4^0j zD%p3?^L2$=2>S~M3d8jLrI=gw{0`xw6#FUCpC#naa1R&#-Hj*vg| z720R@{2<|EVYBdbA%8h6OwS(%+iIkJGEg{N7}~FtzY0CC6mBZ)DcoEbre8G5YL*H= z5pF%&>Syj|@jIcF{Qubhz$Wj92)t#BWq&)Kq*qz~gIpU|Ga zPIiyd-6wonNO|u`DeuLjt;f%W+?U?Ci`8@AIdfMl&lRTKe};b2(sfRW=hmHVK6eNg z3Lg+YDtt=#jPM1aP3`~ht8(lu%nI|u2|~*4Q(87u3NI2~CY&z}9HWHu zh1UsJGd98xs=v;vx1WS-tNwZj`=``r3+aEUJ@t5o>ho+N?H|@-7;j(M4;F4C94QR# z$4I}AFe}Up#|tM4!}P>AOV4i>-Y&dDxJVeLuWDg6n+azKuM~#%Lt9$SC?V(OwDa=v z3Tt1jc_1%5ML0$CPuhJ+mFAf`;Ss{IzcBqw&6ke~|1Nw|7?y8c#WOxms;hDk*gbxd!5Qg!!RR13%B%iH*$te)vH;;l9F2!WqK3!kdI) zybtUC;~&DOgs%!i`*);&UpTXuEP7jPC)^X<-0JVx!s3*^7H<+R5Gd--Ha;#9?v-(*5N?~R*D--AYDe+z@yQhS& z2;UT1FaG}ty5~4dc)0M!Ev-#Yx43ec#ZJR5P7)p`?5T6`Gb!ic+vN9N;iJM= zbe|IXohQFbg(Gxcohr0Z`2Uy4-xI=r346%@0O4R^=-+#?>>AnKAiP`n7h!1MYHO=m zN4SA-V_|5IzE02Q2>DaR{9(Cs2icVG54N~qh{Y+}T3jfcul89As@}LSvDW^7^6#yD zw-9b6oIKFl9wj_Zc%smIvW#@YmHu?uot0w$-~gNMVc{df4P+mdFU)VH>SdL%LiN*I zI6z3fh3W4cYBhtlu}D4A@8_x>saN_n{V?>0pYif{knm{X6d`{kWw_dnax%`ymvKcu zr5zb(r)nHbPr08tL;7=tvxM_f?7NP#B`OHV3nvK=7ETd{xIjOpCD`B$o?^m;uhK6C0r={yD+qWMtbsTFaOJh z*|lwo<-*F2R-UW<-U8w0!qESy6n}MrztJh_Ym^`7z@sFeE)4TKNBRqemkX~E-YC3P z7^c5d`g?_c7rr2TN%*QTOutpRJ9RK7KpXKR&zuy8x!SYepoEY-^&gjWi$PpPk! z(tj)bQP@`JrO^K%ou9TBju8G;7}`H8{Y%2u>syQUg`xdm=|>313inO1KT+qbQ-m{w z$Lrk0`}FfAKh)Lc_@OY&pZDnp$bP(Vk}$OA9M@mZhYNR1v0q>Lb`@?S>?!Ok93c$z z+i@eS;d>^_yIXm)O+rg6A1M1ng+~aF5l$7(6oy_dlzxuz3gMrHw+inNhUp)aeyGlA zGlf$W_mje3S{}ZKHL91*X?Nk zY5n6h`TJ1#sqk}Q7~knqoFlwkc!lsP;kCjWgm(x-$hEYZ?iCh$3O5sGh3jh{yPNQ6 z_O*e-`O@Djyid3&#r|FC-xsp~-l4U1T-V0pHNqgf%<#5WbCi(p#TO-q_EWUqWk39} z()LE&e9lTH|WCu&3I+K^XeO&kb5{ zZx;SX_^t3Et+S5{{~;Wsb#EWxEa3)P&w2>&)x1-wI1ds2K}b24XxxS6SlZi0evjs> zuv|x|d`01ZQp&qX^|n~}nDBk!3L&3w5975_`2Vr{kJ9zkzGqGK*-7=6R$qsxzM6#> z2><`CudsaeTEAy#{aaH!W7H3SY5Vz_wJgm4<{)VAqPz(X*fGB_KTr=dR1fooOE4J`z4GB>yly^B=!6 zKs$wTE>XOU3*uxRreB8s>$+IYQ9|BFx%`3zx66+CW1;GYdK#;Fg83szo*_=sQIDis z)BHJ4`}uE$*uRr9-+rliZgcfF=IKjQ>|as*ZwcQMekcsf!~XB$D*J?Wka>Z1;K!8w zu>VQvTWUUNBV1GZ(S2;bV}%C`j}qFa{{O|&|3mn`@P`!pDcT3#B)mB71Ft=xL6&~kPC&3b;-)>c1#ki{Q_R}CqjzP-||BkU}^F7S7Q{O&v0`ngybdd2Q# z*{>LAEqW-9(Eiu~R)gJW*%AL7#hn)a^Gg4c@D<@r$~VlfgY@eQy9#@!*w0ZpuM%D@ zUXj1zZR~^{!aP%i|`TQGb#QT47DY!+ScM;!mET~`T1Ml4{u|iJSlue zxJ>x5Fiiis^k4H_`K+IopY(4C-xqGMo%P&Rc%v}PZ;S1%W{_|n;f!HcKYF;uxAdN; z-$*N;BeatLe|bv!-Q~wyTGmPVbP;YO>@KVl_7#TdcN$?e)xt*MPr}eXw5w3LC|_tl zM~d}YSi0VCOQqv;QDOd9%kBx;eI)!; z_=B*6^6MmAPq>M2KVh{nFPtd+T`QaOEaBxs&ZBAXYwl3~4+>9Gx-*1fc_y{Cnq!40 z3i&)&Xn%GaY1&$RNcgz$$WB&&wlGZJtT?^T|6g+Hd0?;)lCLip4Fp}$tDpAN$H zgw$JD3hHrR#mDbwRi~7uZWP`u zTq*3N{yJKCjBu*(R3YEfyGn8xZ&vzig?9^w(T{@!%k=ye;c{VXjf=oM^LO><5$)`g ztnf`?XkRIP-(P6|rR=uXd&eDwyocOJa!wfLH(&M5_aY~$erF3q`;{$si&b9>e-ien zu=>z`aNAvC)fvJUgq-eJ-(%FY(L#d{nnxS??%E~ z+L!Oo+)vL}M%N0z6Y}}%M;V9G1AK4%!kV!ztOf3Glx?&@1G_- zTX=_Xsqht{ODGbi|6`CowCDS)BfHrr^L1~uH0AziPucA)+)sF^aE9&|77MHN-f>dO z`^WE;F>vA@Vae@b^pe-&E-=<;Ln#ydn@azd@Ll0{x~CxhO)2SH zDWA5&^@JM<2MW&-hV`|J^!p17!f`3~__;vOX9+2P=>IxBze{+(@Ihf{kDss}zfG}U zu6vJ}Owi>?Ix?Ja;DxKFu`^7p(ysC5d8^X7Rhw422pfD}H`@IsS8ztOXi2pVD<9k6D zu5EK_uXFj9!Z81<*0q{jg|`bI7KZknI$O;~!cBxDg`xd|^{i&n`W9yj?-hpjcWU2w zx9|bsV&OBwSB0Mn4`0jfH%}8T6TUC}NO;0})~;C?=6`Jm`}{uPlfro&t$wn8*mIe1 z^tx7mpzv?PkA$KBW2HY^*rT&ezojs=uR43TST%X3#RV$wlPU3cl>?SbEsvSsN`Itq ziZBHJ9zv@M`=q_FqmX;KjU|Wat2AB)3U?Qd6^8Z;G_IBkUl-Quo}f-RQFx&6NMV}4 z#qv`jyG|+gZ^`c8LhOd7*w2^#dfhWTC0r)tcZlX_+=lUer1YN)|0C?C^r8JR(l-mw z7G9cSKST4;*}~bvg~HH(PH`S0JY0BsO8ob0UU^hFOY_PK;dQ!io7~Cfbgb}gVVHkM zrRyr}DGdF7EPa@MwDeD%MZ(#_(EqTYKkXxVe_?3< zf!4918`vjfg;RwaZD{rUo>!QDd)W;S(sfa~e!{ziVS4`F!9ab!VyJLCVQ9~JY)EhW zWTbEx;SAv{VVHhcAFJ6>xQlQfVOH264AVa&{eOimwNP=c4DC4wj+WhS!W;`+kbuu; zF5KKccu2TJ7?@|4ZDBQU2;UZdBK%y~sc)Fl%3ny&-}U%Ga@&6P`C7s%Vd!O_{#H{h z%nKWYq5UlBe=odD_{S9cJGZnR{v!Ol@JZpD!gqyXemCkI{SRT+t*ynG!qA@AqRaK* zb74o#Lw$w)h1&^t5r+PrlKv&(Tfz@h?6+!bJq#3XBV?cPpyWq{VSapml)tNVwe0?s zVqdNK>N(-ywXDYmVd$Uz0qgP~+FOhH!qEO{%~Py%eD7$L*0InYJLao#nztHK=C608 zze4`*7e1BZANwzq?i*nn*{>z+Cfr20m2jYNUtt*k|CZnC6#x4v!wEw6!3)AbBsU3f z6y7RKvtOy_UkSev($6J2;5|IQGx4JO^{YbO&wr58-%qcwuFesjC%i~_iSP=c%UGnU zl_h9u-(lkj%oUBZPz&T)@Q z4*i{__MJ<=P&=-h(w_5WcdHP)O;haek=-N0Ua}jQV*iBfUJ?$K-Du%0!Ut2*Pf`Ck zRoE;%L&)#0&6RwW@EsxFmzbn}5Z2dbQd};aFT7tE!VoF2zd`aXp`qlF!d->C3lA3l zR(OeUP5!>uxNE8UY$NO_lp6;(OaGQ|chxiR@tvVaUyV;b@335Q2i0dM;d;VNguR5J zzwHBmD6xWTyJA_B7Kb$IjSoo;$Sz#Don!mj4 z@i$-c4Z>Se{4o!1{R{2c7u~A;5#I-{*Z%4^!h=)xTZ^P$EPPz}T8e#Z)puJV-+SsR zxx28ZFs!c~rKeq4AL~-=r%QjeaIo5o&y|J#`Q5?L?nk9-sd_yorT$6ZBgp5;UzmQ^ zN*hsY?RTq$HNr67Eu|PJOSDg9HzXN1oSUlzVDT$8`i`W(tG!rg_J3vcgb16Uyp!pS_Td$oi0 z{gze2r>d;wq@EU+3h^_!x78ok$KvmVR`UOMmp}Zk$)4}&ZlQfne_^wb&xa1tyySDT ztXBGhaGY>~@B__bo2RTNlck>~JVkiE@Iv9G!aoS-3B!06OaF82zL>N`R%9qXkE=C{C%gI4xy!$TWH>BE$k-TLCAZH`I18~*k$z`ySG#957Ib) zNcdOb`az4&!U5@w~3EtB`y3&_29pA0_+! zg`s`-Dy!l1S3M=4BCOIpF{r`NQ^wfzYS4te^D5gd>EbQtT&h zX46d*o-VvY82TTyh1KjT94kCn7}{6$wVG3ed@ifqfY8#)jr}bCMtF#Dfp8PuLstv& zvu}#O{Rdlr2M8O4MScF~8sYWA`-O{y&k85&B5Rtkb_eU1zfZvLG2SlyXb#5K%>ADh z&t%25Ot{k!o8&%WW~i0`%w$}@T z9fYHVwZbsIe@V~pIWCj@zL3u)eUg&?Qq|v0!tncdm#Dt(5r+A9Q@!u6ez0IWYw@LU zlkKg%uP{tcx;mvN-MX@;9T%!T!}ML05BaXAewEh0>SWL7$kt?^mA@Kct#I7`$J~3z zJ5{A&+nb^udsNheHHrl+7(4c$s0T%j9UYaRpa%ua0P3;FhS(ruJ@$;EBDUyQP-n*I zsDnLrtP?wy(b%!SYpv&6Nbcdxyx;rRw|_ra$(4KG>sf2Bws&^+A=P*W3^X#7G*4P3 zRsG7_8yQ5p8|kg2s;}-~M7juR zFVfZa)12&mj{S#`jvzgPRQI|JzspIlB7K+ibJFFy$glGNbG)DQucR|c7dg;A?@y}v z-+qXZJ4vggPmrp9<6%ZhqzmWm{YIqr?)U%y4gZ4lE7H}5n2sv2F9SXz zZII@>@j{Z7;MNM=|g%csp@ZA!pI$@cag^5 zP4-RM=SPz2{_%G)`z>vsR7me5eSoyV`aIogy7(OQD|r7+Z{tH(u=KkXEnRyhOE)0h zk#s!i0M_wwy>9B?|9^q}Un8xPzDF9bgM7mK-}kgv%W>V~f5m?r<=B?E4<_v@-cyJ> zKJUD%__rhfPf6#HcJ{LPO3PU~ja1{0&yRTmeblvcJYxM{NBl9KzY?FG52^ol%Np5< zbTH`<(tSw}B-Q=P#Bn=mtgraooP9aY2a@Xk>l61zq??g$LAo{RAX43bN!r~Sr0bLZ zo%CVS`1c64J$A}*RR33r`yJBwJE{-6D9;0{n8UlI@%i_yY2#_q4M_8((?}EDxPEjh z>A9rQFYaGt{}O3ee(^fi7pqxDKak$Gy1lQEK1$ls$9Nm5z5D(D7Ib4tk0XtK|7-tW z*D$Y+H7(7rWod!*_nhq27Vs=-gEY0aD(!vCI+kumS|+WM>RxxRYa~9u|8KmH&)uKJ zeN!Khenk2)srvQqW+X$pG3n-{sxJc0B0ZP%DN;=$pUnr~lm0@wBKhn~I)}8iyE@tX z=<}`kBwfV220r@Sh!5Z?=B+JAbEHf5oPYjtSvHi94O zKAQB8r22RI;`g7r|8wa3a9lH_BS{OSXOimvN6`+p=Xk~6bNslLD((Gg=;QsGM>2mc zpSI8cvAU%_`dF&}7wACodGaOJmsQf}vtruzT!pkh>G$~leGU8ks5LEpgVf&r{(o*M zd)>x*@<7r8>7%T};&t~4#D6R4;nc%jUDU^A_&-Og`~Mz^y^8tfSvQtg&s0fcIj=~Y zKGx$yl>2SU-PP}Hqi_6se*dOkeLnhR=<_W5#p9smtH*UO>&G1H zs`Y3mG46QW{$qdEg|S}Zan<9{Rr?%3ImeL3dVHGt)cl_7YvcveOh0=c|IYFntSkP- zdLaI8`IQY!_d033?%UYN`01NjdJgG@q?eHHvx9wp0O>=dMt}cb<2$*F`1E(x8sDwN z72}J~`Ffmq7T?11Op`9Ky}j>4dI9OBr2nt+*Sm;6Mg8_A{r_uuY8-E^-`0%P*PsEG z4kfjBzyBX~xebj~NNc3=@97NP+&+)b8|$-`y?>DUuaf?Q^f}VsbFx?Qd4rpGk)P^g z9ABaD*u)g2O)VWqxxOL&o;0?f*JwZQlU}u@?e`ez!0qh)EYdXXKDHWs2J%e@?`@j0@{{Ks# z+t?h+q@U4Fej-)>LA1X->AsM6BXeClHNfY zk7FFKr^`68AnkEs(%5eQ*L<`&^>zbk)Q`i*qW}H>IDf25{u_}VLHfJWUTw6KrDf7o zo4x;Xh^5=@W@&W~OV`d>dhDK-UPby0=@NSxUzM~!X`b|S(x*vH{rmqho-FaS4z|x$ zAzhtxI%x-S-c9-*sm8w><=B97%pm>rP> z*3ZYpxmXu*#r;n1qCKp-uQ~oqy7YebeizaL=@+Ce``hO^(gtaAfbk7UN01u*{r}s$ z$gdUu>QJ;@?Eeh=e=qUI{eRDiSN+EyKW4)4LzDjFCycYSJ-!+>cEZSUg{1%3qbH2) zKXCiO>rWVd1n-U*drbdBj~O+3#QLK~B>nxn_Tl5(ll~))AM5-qoiNTmIdIkn|rlc9i>n!pIKy|KaY9`|Riu!zT<+`j2cMcKEpAV@3{Z zAK~_m?`)4@!^e#qe!T4wUmtmxlR5X{W87C;{f{`>8M^=ahg{6@(DCDw{)ZhsX3WU3 z?!yry4?X4xxAX9^M~rmb-i{i3_|ft8@IwzBH}cr{ZuF?JBjamVU-9MWqg`gUFHZka z;s2k(if)f??q7HI9MC-*Ud2lpE5T#pwexO$+#7!uANSv6l6?T_@b35jxWX|P zZ0KIiyZ?ml+3?u}_U8;WF#n(KKghA~e*5j{n15&YtRqPheO(!IX&FJxPRyJHfMG&Z#A{^F$hVt{tj{c zw|U~PGZ)v-H)Z#wY{wXX%qONtxsQLHXaCt(TmG}T=2^7eL;QZ97(X~U!M*Tx8vWX@ zvHjbxvHTkdWBzgfSpG9*|Do5~{zI>|{pYZR@%u04{^|ac9rH?GzkbWTW&7vevi&*p zwh!I^di>9EY~K9~>|bF2e80K7h8HQ`#`I#@KR)uX#&3`A8rYm;+%LLbA^V@%W^?1Xv2ZPM`t=`@#mMcjYHxShi%BgWaawUwj;YyS7j z{>90*e{r(y|JnV)Ztj2a_(f24FP3osd>`;zWw&-xQ>tFy`|h=*`xp10!TvLL`@h?N zmfP2tKki>;|LXtc{%^T`ecOxs&t(6Z?4O}xWBZKp$9C|cIhS$Hki9>c#&>?oBZhBdu1$t{UY1Hc9HEr zbF=0h(#>y^-`sm&{~6(Ne^yp=KaH(9rY-J8d_7m>UaWjE@h>tj{ZFkQX6Lv6`q$Y0 zH^twSVWZkUUF`qTws!4u|2O}8{u_3&|GF#MfjePbbB@jLl4Kk9*ZRBRf@MR-PqsGi z5#PnMjs2UWOp>E-TrQx)`&vE3&*Oga{oY;d|MIh|1WD=7QE92}@298OcIH)%EUX&d z4woI|Z8&yu?3#D~mJ@CNwk2$jHQa~)aKc!cIRE(Zb${m085 zF1i8Tv-9EI-TG#Jyhk!&zPzVfkIYZMKoZv*$vj&RHzLJ##5~xQbD<=z51M&P66gJ9 zzHk!f^JczC66fh=zUbWfx0x@N#Cf%uFP_BtvY9WD#CfopFPX&ot(m8iIBzxcrII)w zHS?wC&NIz?nIz61&Ae9<=Y?jzY!b)&X1<&ozuV_U;dPH>dAC5BA8$?KxI6DoJ(Au@ z98a6Mu4?Sl9*JL#|L4{tJ||Z`>XEE0#NPHutnccFJ>vZ)@4wB{qsEbm%)K1$zNRR{RfEu6XGc)#{+!8g>%pt=nGD8T;*%zxSU)?%TZJD0uSve`_}3S= z`rM2Ic`Q7gGJZi%i)SJ}pWy>e{H-89{?a0*=L&Ulbuk^Cx`v-SC{8opjIPS+8PQHX^mN$L8m8QFE@4lYf zB%WpAgM{~Y+{c-1ZT8s?{SeXbg+9k`9eyUB_Q+Q-pAHwF-#XwmeiN~^;lw{8$mg3{ z+4O$g@!Qm>he!SWj{9=mE$!iT_zdA62Hu)XlH>jz`jnK*KhnqhSH!1x;BK8je~jl} zYdSu^d1pPxeYxVJQ*G6qBtzg?9;w>m;_#b)bkY2L4tBg-@}KL3Bk@UkZEptre=0m9 z{6cs^__W~PJIP*R;{eSqxi9elT(`W9Pf2_}3HtwB|M*7`%&%PjQ6}@_{uUx%Z&m#5 zY$r)JfY*CldG9Ase`}G~*U_IuJ?sR}FKc=(8znh-vb^!wZbwDlYWxNKPj$STyAn_z zY~yel|MLRxoeY$E^N+;&Z{;elX#R2jy`Fq)Y2%BK?}PBdD#j1$ZW%ul_4q7<{v~*0 zCDX@S4&R5@S2Ny^_iqRdzugS4;oqC3>-~|V-^t|3OYrm><{$Y-@B+Lq`k&xscsxH$xyx9gyl}UI58GPs zI=l+s7+zk}^4%Ri7~X)#avkBgAIFB$KI8o2ANApRPWV~)q$imFQ?#oo@ZukhU)AJX0YmyMiuHJN%|9bW8f`a|&<5cU0xSMl+; z8hZcAdd5FS?=Ro^@uYl^wVVO?9~iisuVp+L6a9BJpJ&jY3D4(@PjZLCZ&UEE;~y{6 zTxww=&d{$%=dx*I|FYDWXC?H@!>i|5zEe2v{t-i7U!Q0^>Nkjb;akDW z_{8$=3a_A#=Y#$cWZu7kz8~?7hSw)qz7ydc(I211;1|G4!u_9e^!_>c=IHN&=kbr{ zBmR*|USFerVmo{mUV*3aX}}Bcc>cS93(Wgu$u}OaW#MUfyiSsam(REI#`d{x^x@vF zPsn#mcxJNc89tN2Q4e>`AZ!Q1bMP$ukMI(_06!a^r~MobztM5uUy8Kq@sY@)L zIR8Eo^h+ki;Wl41(7)#R{KoS*US%&cpSXU05C1%TUwpoSSK)D8x`e9`U;hpGn&{Vp zr#sC*ehs%Zybd3TelK|Da?>9VALF>62aAVUxyta99sh6Ts^AmjJU`|OAH#Tc1w41P z%B}G1b;jM>u+4~i_@;3G=wn|GC3tuEC-Aax|41IMufW^TuLw`Bw|w*PzK;8P z$hKQO%!F^_`26Z&Fg|&F7DT@=PZx6--s8J@k_e2zx{lH;69&(K99REmYf4pk=#CaqOPjOG-?ZmkUyb3=CJ{+FC#mY5;@qaYD za;tHFz0z-|!0Wde-^Xy$8GUXyz7YC5;ki4EXVE|7cxXS9t=?iiyotVqK8?>$==11j z!du*g;_EFd^|qwr^Q-?=9QXB>`p)9{k$$&D7y3cyYd@KO?zqi)XanA#a_x)0@Qdl= zpOQEnUhKI;P(JDA55J9tr++qmTvz))1?=O@!}m9NGTCw89tuZVdvI^Vb{YCA`rF`l z1-)CJOa1&4edagIH@1hj;1&2@)N=!#>SpnO4`0ZAVHxVPhw*R8w>5IgI|{zBUU3}ArObaIKD*$bU)p$)3sncetLTqKKN4Ps$Lm_hIquufLDWy| zU#G!ya1K{88K3M@mTwyW>)?6#1@OCqk2`OgX64Pp{iDcyJtQ|9&%s}E{J+&heJ#s3 z&X4cMd=E43zn}2ixA0_b0ffAZN2-dM-<-*MbmjeI@h zkK@zNabKT#>J53aG5YHIrnhgSlf?gt7T}?v`};Ed<{z;T z`peeFUpJh*4{yNlgwKIjwlRHNw=C=$fcGhEYkUR#{h!kIZ-cmuv6{AI^Oe|*Tw<%YYky^Fq5vV8sbYJU3+o;}g{ zzV1BMZ$H2@?Z(|S5w=C$faA-Xg7T$m#0bdKAA7wuK!MA`{;c?#CJ^H}cM}HVR zeWdxsdG>h6eLLx(oy2kPeDqoLaXon%yaAL_gvQMzka;=>_?o-z^fg`<2<`2 zJdHl`jp0RjydL5o<>8NS`AqXkQGk8msSAz2O}U0S?(1ig#5n?9lzJNnZx{VZ@PhD3 z@Url00$(yo)6QoS&osy9*MA>y+?T6C{C&{Jc{zQNm1|pg4So4?Y(A@@-wd9E4~7qcm*IaW-~HhE%giSp z-;wYt`~~7aA@VCszZd>f;OQ%kZw9{#o`+uop8-#a>gw!GC_75*X@2v&fXW}5y({MU8dkB8aEY&8JOw559ue zUpIan`krox^#1ubjQjI#zpdc7FK_jU=Hs=7mLo|{ZpTq|LwH%f$-|5 z#)n$A$q;z@GvjIa{_rgP3U~othd%&6$8jHj`l;sQb&2EuE&lSqE#EkgUyo1njQPZQ zyaG=N|EuG^yt&WK=kp#G(6jJ5{&8M@2cG@P^zqRjpGTjsjSr_>J$q9w@{Q~Kr5vAM zxmI@E$5X}UOnhSd%zb12vApZzU#wYqT^L~-fKTZs)4u`V9iIBpc>KQgz^KRnFC6y* zJolaH<9X02@VxLp!3*#>FJA*M!bcL%o$v-c_V=0a?Dv*$9Eab8m*MfcjejJXueUmU zJ;u*PRxn=p*?cyjT)p7sU#JJ-S;KMP4$IW1zhBC48#q3{6nrxM%-_8Y+Z1>XzBl~3 zE_|k;&-XW<3F!aPh5l*unT+Y<`t1#P7QQw0|pj%klXguk+C7Mw_1DJh?jfyGGsF9s-H|Xgc~ldRHxBdkkKL$MyfK z__T;mte;ll@8VM#Yw^tKY5rdZA2*+VYvnDG@6Y(B#HVE?tGD_w=CeNaw!GuMJtyCp zPmcbzI{L;5rjO?}8^J3l8ISh|ZXfxn#^e2FLxX>7(kb^%9pU)=>i=kb3X{y|G|F`j zJUPes?u;jw!E@&szZd;&@YMOnZ>C%iz^fM+e+2!Lj{A0)rQYI=`2G=io@b;!--q`V z{tY}Wd|`LNWPasMIqutYa;3#{0r9K~FTvxyxjwuMkLRBBuxtTAv%KY<<{WLqx^l^Ug-GzR2 z$9;KgA6h)?QLZf=_wkIthj5Zz;d$Z1;O)W-@B%!JOQ*m)M1O(f^Q+G*91n4RZgIx> zWi!{$e4JN_&rRraUzk4LFn?d<4de0r>mQDLpR&a1e}?0EMfl6`X_D{1;hn<2aeRK| z>h3OVhW7TW#p6csur1}d&$lZ1t_zU$a=&bW80?^U&MA8`^y~BA4|Jxz`hO>I_kGqB zJC2cmg}xwhc3aKzZQ#$cB3TTcY-{nvbyV7M|9x3I{;{2Ggg%A-pv1N<;RX2i@SWgQ z_(kyj;rZ<>-^uXN@CN)y_=Kp>nm+cs$?(!Z;~#dj9d3XZcQC#Q{9brWz6bm> zcrwxShrxe?7vQ7ez1Fb$uM1xfo;%xoqJBGg6&|lM>;Z2~GJX7B^&oihT;rYOJ06}s z&-k|RGvImQQ{ZK|omIKzJ-h+m0iWsc?D@^{KLD@5&qM!A)L&rw*lyp2rzRVZ*Q0)b z=isqiORQ=2*?=F9|LX9<6!VFEqo{`;%7Nbwp8u2Sm!e(m1utG?{6YLjz_S+{-xods zUWQMEpAXMmV)|kDcfw1T8ISG%R(P?~_;18{U*uO9_rGiM+avJIwZ`8yoILNiUoX|S zvH7}#>+}8*oAaB0KftGWgZbF(>Av@eH{jpnzrb45|Ba^K4!$frbCdC(i9hzoGX1U% z{d&>oFQ)$y{WgxzFU~gfxtC2J=jGv!`*C2l^!IUH_?(JQ@~Zj7b=QhKeG$|Vi!EtXG6;SMi=^z9QW;^xR1pjueW>wukLF+ z&g0+1)9~{t@6TQM_gLH7L+*1cZ;JBzN4xuctA8~AOYvz%pKq8xe$U%4@~?~^i#`jl z!>@u5ffv6v{n_vX;HhtnKMHS;KJZwsaqz;orhna?C-|+yaUcJFJhx>*!$}c-knl

    qTXUVe-oaC$9_5+UgU2h#rpXn@YbZr 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 WcS~L!8L*d>q*~Hl+J7Vj#Qzs2p0ED^ literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/ABOUT_APACHE b/rubbos/app/httpd-2.0.64/ABOUT_APACHE new file mode 100644 index 00000000..f1a193cb --- /dev/null +++ b/rubbos/app/httpd-2.0.64/ABOUT_APACHE @@ -0,0 +1,277 @@ + + The Apache HTTP Server Project + + http://httpd.apache.org/ + + February 2002 + +The Apache 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. These volunteers are known as the Apache Group. +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, 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. + + ============================================================================ + +Current Apache Group in alphabetical order as of 2 April 2002: + + Greg Ames IBM Corporation, Research Triangle Park, NC, USA + Aaron Bannert California + Brian Behlendorf Collab.Net, California + Ken Coar IBM Corporation, Research Triangle Park, NC, USA + Mark J. Cox Red Hat, UK + Lars Eilebrecht Freelance Consultant, Munich, Germany + Ralf S. Engelschall Cable & Wireless Deutschland, Munich, Germany + Justin Erenkrantz University of California, Irvine + Roy T. Fielding Day Software, California + Tony Finch Covalent Technologies, California + Dean Gaudet Transmeta Corporation, California + Dirk-Willem van Gulik Covalent Technologies, California + Brian Havard Australia + Ian Holsman CNET, California + Ben Hyde Gensym, Massachusetts + Jim Jagielski jaguNET Access Services, Maryland + Manoj Kasichainula Collab.Net, California + Alexei Kosut Stanford University, California + Martin Kraemer Munich, Germany + Ben Laurie Freelance Consultant, UK + Rasmus Lerdorf Yahoo!, California + Daniel Lopez Ridruejo Covalent Technologies, California + Doug MacEachern Covalent Technologies, California + Aram W. Mirzadeh CableVision, New York + Chuck Murcko The Topsail Group, Pennsylvania + Brian Pane CNET Networks, California + Sameer Parekh California + David Reid UK + William A. Rowe, Jr. Covalent, Illinois + Wilfredo Sanchez Apple Computer, California + Cliff Skolnick California + Marc Slemko Canada + Joshua Slive Canada + Greg Stein California + Bill Stoddard IBM Corporation, Research Triangle Park, NC + Sander Striker The Netherlands + Paul Sutton Seattle + Randy Terbush Covalent Technologies, California + Jeff Trawick IBM Corporation, Research Triangle Park, NC + Cliff Woolley University of Virginia + +Apache Emeritus (old group members now off doing other things) + + Ryan Bloom California + Rob Hartill Internet Movie DB, UK + David Robinson Cambridge University, UK + Robert S. Thau MIT, Massachusetts + Andrew Wilson Freelance Consultant, UK + +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. +Frequent contributors have included Petr Lampa, Tom Tromey, James H. +Cloos Jr., Ed Korthof, Nathan Neulinger, Jason S. Clary, Jason A. Dour, +Michael Douglass, Tony Sanders, Brian Tao, Michael Smith, Adam Sussman, +Nathan Schrenk, Matthew Gray, and John Heidemann. + + ============================================================================ + +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 +CVS repository. Everyone has access to the CVS 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 CVS. 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 Apache Is Free + +Apache 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 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 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. We would even be happy if some +commercial software companies completely dropped their own HTTP server +development plans and used Apache as a base, with the proper attributions +as described in the LICENSE file. + +Thanks for using Apache! + diff --git a/rubbos/app/httpd-2.0.64/Apache.dsp b/rubbos/app/httpd-2.0.64/Apache.dsp new file mode 100644 index 00000000..9ac8d603 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/Apache.dsp @@ -0,0 +1,128 @@ +# Microsoft Developer Studio Project File - Name="Apache" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=Apache - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "Apache.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 "Apache.mak" CFG="Apache - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "Apache - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "Apache - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "Apache - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "SHARED_MODULE" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "./include" /I "./srclib/apr/include" /I "./srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /Fd"Release\Apache_src" /FD /c +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib ws2_32.lib mswsock.lib /nologo /subsystem:console +# ADD LINK32 kernel32.lib user32.lib advapi32.lib ws2_32.lib mswsock.lib /nologo /stack:0x40000 /subsystem:console /debug /opt:ref + +!ELSEIF "$(CFG)" == "Apache - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "./include" /I "./srclib/apr/include" /I "./srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /Fd"Debug\Apache_src" /FD /c +# SUBTRACT CPP /YX +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib ws2_32.lib mswsock.lib /nologo /subsystem:console /incremental:no /debug +# ADD LINK32 kernel32.lib user32.lib advapi32.lib ws2_32.lib mswsock.lib /nologo /stack:0x40000 /subsystem:console /incremental:no /debug + +!ENDIF + +# Begin Target + +# Name "Apache - Win32 Release" +# Name "Apache - Win32 Debug" +# Begin Source File + +SOURCE=.\build\win32\Apache.ico +# End Source File +# Begin Source File + +SOURCE=.\build\win32\Apache.rc +# End Source File +# Begin Source File + +SOURCE=.\server\main.c +# End Source File +# Begin Source File + +SOURCE=.\build\win32\win32ver.awk + +!IF "$(CFG)" == "Apache - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=.\build\win32\win32ver.awk + +".\build\win32\Apache.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ./build/win32/win32ver.awk Apache.exe "Apache HTTP Server" ./include/ap_release.h icon=apache.ico > .\build\win32\Apache.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "Apache - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=.\build\win32\win32ver.awk + +".\build\win32\Apache.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ./build/win32/win32ver.awk Apache.exe "Apache HTTP Server" ./include/ap_release.h icon=apache.ico > .\build\win32\Apache.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/Apache.dsw b/rubbos/app/httpd-2.0.64/Apache.dsw new file mode 100644 index 00000000..f9064c64 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/Apache.dsw @@ -0,0 +1,1790 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "Apache"=".\Apache.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: "BuildBin"=".\BuildBin.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name Apache + End Project Dependency + Begin Project Dependency + Project_Dep_Name ApacheMonitor + End Project Dependency + Begin Project Dependency + Project_Dep_Name libapriconv_ccs_modules + End Project Dependency + Begin Project Dependency + Project_Dep_Name libapriconv_ces_modules + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_access + 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_asis + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_auth + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_auth_anon + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_auth_dbm + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_auth_digest + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_auth_ldap + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_autoindex + 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_dav_fs + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_dir + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_disk_cache + 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_headers + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_imap + 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_logio + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_log_config + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_log_forensic + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_mem_cache + 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_rewrite + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_setenvif + 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_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 mod_proxy_connect + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy_ftp + End Project Dependency + Begin Project Dependency + Project_Dep_Name mod_proxy_http + End Project Dependency + Begin Project Dependency + Project_Dep_Name ab + 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 + Begin Project Dependency + Project_Dep_Name gen_uri_delims + End Project Dependency + Begin Project Dependency + Project_Dep_Name xml + End Project Dependency +}}} + +############################################################################### + +Project: "dftables"=".\srclib\pcre\dftables.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +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: "gen_uri_delims"=".\srclib\apr-util\uri\gen_uri_delims.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +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 +}}} + +############################################################################### + +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 + Begin Project Dependency + Project_Dep_Name gen_uri_delims + End Project Dependency + Begin Project Dependency + Project_Dep_Name xml + 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 pcreposix + 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_access"=".\modules\aaa\mod_access.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_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_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_auth"=".\modules\aaa\mod_auth.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_anon"=".\modules\aaa\mod_auth_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 +}}} + +############################################################################### + +Project: "mod_auth_dbm"=".\modules\aaa\mod_auth_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_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_ldap"=".\modules\experimental\mod_auth_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 util_ldap + 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_bucketeer"=".\modules\test\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_cache"=".\modules\experimental\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_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\experimental\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_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_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_disk_cache"=".\modules\experimental\mod_disk_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 + Begin Project Dependency + Project_Dep_Name mod_cache + End Project Dependency +}}} + +############################################################################### + +Project: "mod_dumpio"=".\modules\experimental\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_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_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_imap"=".\modules\mappers\mod_imap.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_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_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_mem_cache"=".\modules\experimental\mod_mem_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 + Begin Project Dependency + Project_Dep_Name mod_cache + 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_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_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_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_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_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_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_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: "pcre"=".\srclib\pcre\pcre.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name dftables + End Project Dependency +}}} + +############################################################################### + +Project: "pcreposix"=".\srclib\pcre\pcreposix.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name pcre + 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: "util_ldap"=".\modules\experimental\util_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: "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 +}}} + +############################################################################### + +Project: "xml"=".\srclib\apr-util\xml\expat\lib\xml.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/rubbos/app/httpd-2.0.64/BuildBin.dsp b/rubbos/app/httpd-2.0.64/BuildBin.dsp new file mode 100644 index 00000000..eda300bd --- /dev/null +++ b/rubbos/app/httpd-2.0.64/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.0\bin\Apache.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 _tryssl _tryzlib _dummy" +# PROP Rebuild_Opt "" +# PROP Target_File "\Apache2\bin\Apache.exe" +# PROP Bsc_Name ".\Browse\Apache.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.0\bin\Apache.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 _tryssl _tryzlib _dummy" +# PROP Rebuild_Opt "" +# PROP Target_File "\Apache2\bin\Apache.exe" +# PROP Bsc_Name ".\Browse\Apache.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/rubbos/app/httpd-2.0.64/CHANGES b/rubbos/app/httpd-2.0.64/CHANGES new file mode 100644 index 00000000..ee24f578 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/CHANGES @@ -0,0 +1,7423 @@ + -*- coding: utf-8 -*- +Changes with Apache 2.0.64 + + *) SECURITY: CVE-2010-1452 (cve.mitre.org) + mod_dav: Fix Handling of requests without a path segment. + PR: 49246 [Mark Drayton, Jeff Trawick] + + *) SECURITY: CVE-2009-1891 (cve.mitre.org) + Fix a potential Denial-of-Service attack against mod_deflate or other + modules, by forcing the server to consume CPU time in compressing a + large file after a client disconnects. PR 39605. + [Joe Orton, Ruediger Pluem] + + *) 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] + + *) 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 + for OpenSSL versions prior to 0.9.8l; reject 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 or later. + [Joe Orton, Ruediger Pluem, Hartmut Keil , + Rainer Jung] + + *) 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. Elimiates a problematic + optimization in the case of no request body. PR 48359 + [Jake Scott, William Rowe, Ruediger Pluem] + + *) SECURITY: CVE-2008-2364 (cve.mitre.org) + mod_proxy_http: Better handling of excessive interim responses + from origin server to prevent potential denial of service and high + memory usage. Reported by Ryujiro Shibuya. [Ruediger Pluem, + Joe Orton, Jim Jagielski] + + *) 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] + + *) SECURITY: CVE-2008-2939 (cve.mitre.org) + mod_proxy_ftp: Prevent XSS attacks when using wildcards in the path of + the FTP URL. Discovered by Marc Bevand of Rapid7. [Ruediger Pluem] + + *) Fix recursive ErrorDocument handling. PR 36090 [Chris Darroch] + + *) mod_ssl: Do not do overlapping memcpy. PR 45444 [Joe Orton] + + *) Add Set-Cookie and Set-Cookie2 to the list of headers allowed to pass + through on a 304 response. [Nick Kew] + + *) apxs: Fix -A and -a options to ignore whitespace in httpd.conf + [Philip M. Gollucci] + +Changes with Apache 2.0.63 + + *) winnt_mpm: Resolve modperl issues by redirecting console mode stdout + to /Device/Nul as the server is starting up, mirroring unix MPM's. + PR: 43534 [Tom Donovan , William Rowe] + + *) winnt_mpm: Restore Win32DisableAcceptEx On directive and Win9x platform + by recreating the bucket allocator each time the trans pool is cleared. + PR: 11427 #16 (follow-on) [Tom Donovan ] + +Changes with Apache 2.0.62 (not released) + + *) SECURITY: CVE-2007-6388 (cve.mitre.org) + mod_status: Ensure refresh parameter is numeric to prevent + a possible XSS attack caused by redirecting to other URLs. + Reported by SecurityReason. [Mark Cox, Joe Orton] + + *) SECURITY: CVE-2007-5000 (cve.mitre.org) + mod_imap: Fix a cross-site scripting issue. Reported by JPCERT. + [Joe Orton] + + *) Introduce the ProxyFtpDirCharset directive, allowing the administrator + to identify a default, or specific servers or paths which list their + contents in other-than ISO-8859-1 charset (e.g. utf-8). [Ruediger Pluem] + + *) log.c: Ensure Win32 resurrects its lost robust logger processes. + [William Rowe] + + *) mpm_winnt: Eliminate wait_for_many_objects. Allows the clean + shutdown of the server when the MaxClients is higher then 257, + in a more responsive manner [Mladen Turk, William Rowe] + + *) Add explicit charset to the output of various modules to work around + possible cross-site scripting flaws affecting web browsers that do not + derive the response character set as required by RFC2616. One of these + reported by SecurityReason [Joe Orton] + + *) http_protocol: Escape request method in 405 error reporting. + This has no security impact since the browser cannot be tricked + into sending arbitrary method strings. [Jeff Trawick] + + *) http_protocol: Escape request method in 413 error reporting. + Determined to be not generally exploitable, but a flaw in any case. + PR 44014 [Victor Stinner ] + +Changes with Apache 2.0.61 + + *) SECURITY: CVE-2007-3847 (cve.mitre.org) + mod_proxy: Prevent reading past the end of a buffer when parsing + date-related headers. PR 41144. + [Davi Arnaut, Nick Kew] + + *) SECURITY: CVE-2007-1863 (cve.mitre.org) + mod_cache: Prevent segmentation fault if a Cache-Control header has + no value. [Niklas Edmundsson ] + + *) SECURITY: CVE-2006-5752 (cve.mitre.org) + mod_status: Fix a possible XSS attack against a site with a public + server-status page and ExtendedStatus enabled, for browsers which + perform charset "detection". Reported by Stefan Esser. [Joe Orton] + + *) SECURITY: CVE-2007-3304 (cve.mitre.org) + prefork, worker MPMs: Ensure that the parent process cannot + be forced to kill processes outside its process group. + [Joe Orton, Jim Jagielski] + + *) mod_proxy_http: accept proxy-sendchunked/proxy-sendchunks as synonymous. + PR 43183 [Brian Rectanus , Vincent Bray] + + *) log core: ensure we use a special pool for stderr logging, so that + the stderr channel remains valid from the time plog is destroyed, + until the time the open_logs hook is called again. [William Rowe] + + *) mod_ssl: Version reporting update; displays 'compiled against' + Apache and build-time SSL Library versions at loglevel [info], + while reporting the run-time SSL Library version in the server + info tags. Helps to identify a mod_ssl built against one flavor + of OpenSSL but running against another (also adds SSL-C version + number reporting.) [William Rowe] + + *) mod_autoindex: Add in Type and Charset options to IndexOptions + directive. This allows the admin to explicitly set the + content-type and charset of the generated page and is therefore + a viable workaround for buggy browsers affected by CVE-2007-4465 + (cve.mitre.org). [Jim Jagielski] + + *) main core: Emit errors during the initial apr_app_initialize() + or apr_pool_create() (when apr-based error reporting is not ready). + [William Rowe, Jeff Trawick] + + *) log core: Fix issue which could cause piped loggers to be orphaned + and never terminate after a graceful restart. PR 40651. [Joe Orton, + Ruediger Pluem] + + *) log core: fix the new piped logger case where we couldn't connect + the replacement stderr logger's stderr to the NULL stdout stream. + Continue in this case, since the previous alternative of no error + logging at all (/dev/null) is far worse. [William Rowe] + + *) mpm_winnt: Prevent the parent-child pipe from leaking into other + spawned processes, and ensure we have a /Device/null handle for + stdout when running as-a-service. [William Rowe] + + *) ApacheMonitor: Fix Windows Vista detection. [Mladen Turk] + + *) mod_so: Solve dev's confusion by reporting expected/seen module + magic signatures when failing with a 'garbled' message, and solve + user's confusion by pointing out 'perhaps compiled for a different + version of apache?'. [William Rowe] + + *) mod_ssl: initialize thread locks before initializing the hardware + acceleration library, so the latter can make use of the former. + PR 20951. [] + + *) mod_ssl: Support limited buffering of request bodies to allow + per-location renegotiation to proceed. PR 12355. [Joe Orton] + + *) mod_cgi, mod_cgid: Don't return apr_status_t error value + from input filter chain. PR 31759 (mutated). [Jo Rhett, + Nick Kew] + + *) htdbm: Fix crash processing -d option in 64-bit mode on HP-UX. + [Jeff Trawick] + + *) proxy_http.c: Overlay existing cookies with proxied ones, ala + httpd-2.2. [Jim Jagielski] + + *) mod_proxy: ProxyTimeout (and others) ignored due to not merging + the *_set params. PR 11540. [Jim Jagielski] + + *) mod_isapi: Correctly present SERVER_PORT_SECURE. + PR 40573. [Matt Eaton ] + + *) mod_isapi: Avoid double trailing slashes in HSE_REQ_MAP_URL_TO_PATH + support. Also corrects the slashes for Windows. PR 15993. [William Rowe] + + *) mod_isapi: Handle "HTTP/1.1 200 OK" style status lines correctly, the + token parser worked while the resulting length was misinterpreted. + PR 29098. [Brock Bland ] + + *) mod_isapi: Return 0 (failure) for more of the various ap_pass_brigade + attempts to stream the response at the client. Log these as well. + PR 30022, 40470. [William Rowe, Matt Eaton ] + + *) mod_isapi: Ensure we walk through all the methods the developer may have + employed to report their HTTP status result code. + PR 16637 30033 28089. [Matt Lewandowsky , William Rowe] + +There was no 2.0.60 + +Changes with Apache 2.0.59 + + *) SECURITY: CVE-2006-3747 (cve.mitre.org) + mod_rewrite: Fix an off-by-one security problem in the ldap scheme + handling. For some RewriteRules this could lead to a pointer being + written out of bounds. Reported by Mark Dowd of McAfee. + [Mark Cox] + + *) Win32: Minor fixes to build more cleanly under Visual Studio 2005 + from the command line build. [William Rowe] + +Changes with Apache 2.0.58 + + *) Legal: Restored original years in copyright notices. + [Colm MacCarthaigh] + +Changes with Apache 2.0.57 + + *) mod_cgid: run the get_suexec_identity hook within the request-handler + instead of within cgid. PR 36410. [Colm MacCarthaigh] + + *) core: Prevent read of unitialized memory in ap_rgetline_core. PR 39282. + [Davi Arnaut ] + + *) mod_proxy: Report the proxy server name correctly in the "Via:" header, + when UseCanonicalName is Off. PR 11971. [Martin Kraemer] + + *) mod_isapi: Various trivial code-fixes to permit mod_isapi to load and + run on Unix. [William Wrowe] + + *) HTML-escape the Expect error message. Not classed as security as + an attacker has no way to influence the Expect header a victim will + send to a target site. Reported by Thiago Zaninotti + . [Mark Cox] + +Changes with Apache 2.0.56 + + *) SECURITY: CVE-2005-3357 (cve.mitre.org) + mod_ssl: Fix a possible crash during access control checks if a + non-SSL request is processed for an SSL vhost (such as the + "HTTP request received on SSL port" error message when an 400 + ErrorDocument is configured, or if using "SSLEngine optional"). + PR 37791. [Rüdiger Plüm, Joe Orton] + + *) SECURITY: CVE-2005-3352 (cve.mitre.org) + mod_imap: Escape untrusted referer header before outputting in HTML + to avoid potential cross-site scripting. Change also made to + ap_escape_html so we escape quotes. Reported by JPCERT. + [Mark Cox] + + *) Add APR/APR-Util Compiled and Runtime Version numbers to the + output of 'httpd -V'. [William Rowe] + + *) Ensure that the proper status line is written to the client, fixing + incorrect status lines caused by filters which modify r->status without + resetting r->status_line, such as the built-in byterange filter. + [Jeff Trawick] + + *) Default handler: Don't return output filter apr_status_t values. + PR 31759. [Jeff Trawick, Ruediger Pluem, Joe Orton] + + *) mod_speling: Stop crashing with certain non-file requests. + [Jeff Trawick] + + *) keep the Content-Length header for a HEAD with no response body. + PR 18757 [Greg Ames] + + *) Modify apr[util] .h detection to avoid breakage on VPATH builds + using Solaris make (amoung others) and avoid breakage in ./buildconf + when srclib/apr[-util] are symlinks rather than directories proper. + [William Rowe] + + *) Avoid server-driven negotiation when a CGI script has emitted an + explicit "Status:" header. PR 38070. [Nick Kew] + + *) mod_log_config now logs all Set-Cookie headers if the %{Set-Cookie}o + format is used. PR 27787. [André Malo] + + *) mod_cgid: Refuse to work on Solaris 10 due to OS bugs. PR 34264. + [Justin Erenkrantz] + + *) mod_cache: Correctly handle responses with a 301 status. PR 37347. + [Paul Querna] + + *) mod_proxy_http: Prevent data corruption of POST request bodies when + client accesses proxied resources with SSL. PR 37145. + [Ruediger Pluem, William Rowe] + + *) Eliminated the NET_TIME filter, restructuring the timeout logic. + This provides a working mod_echo on all platforms, and ensures any + custom protocol module is at least given an initial timeout value + based on the context's Timeout directive. + [William Rowe] + + *) mod_ssl: Correct issue where mod_ssl does not pick up the + ssl-unclean-shutdown setting when configured. PR 34452. [Joe Orton] + + *) Document the ReceiveBufferSize change done in r157583. + [Murray Nesbitt ] + + *) mod_deflate: Merge the Vary header, instead of Setting it. Fixes + applications that send the Vary Header themselves. PR 37559. + [Paul Querna] + + *) mod_dav: Fix a null pointer dereference in an error code path during the + handling of MKCOL. [Ghassan Misherghi ] + + *) mod_mime_magic: Handle CRLF-format magic files so that it works with + the default installation on Windows. [Jeff Trawick] + + *) Write message to error log if AuthGroupFile cannot be opened. + PR 37566. [Rüdiger Plüm] + + *) Add ReceiveBufferSize directive to control the TCP receive buffer. + [Eric Covener ] + + *) mod_cache: Fix 'Vary: *' behavior to be RFC compliant. PR 16125. + [Paul Querna] + + *) Remove the base href tag from proxy_ftp, as it breaks relative + links for clients not using an Authorization header. [Graham Leggett, + Jon Snow ] + + *) http_request.c: Add missing va_end call. [André Malo] + + *) Add httxt2dbm to support/ for creating RewriteMap DBM Files. + [Paul Querna] + + *) support/check_forensic: Fix temp file usage + [Javier Fernandez-Sanguino Pen~a ] + + *) Chunk filter: Fix chunk filter to create correct chunks in the case that + a flush bucket is surrounded by data buckets. [Ruediger Pluem] + + *) mod_cgi(d): Remove block on OPTIONS method so that scripts can + respond to OPTIONS directly rather than via server default. + [Roy Fielding] PR 15242 + + *) Added new module mod_version, which provides version dependent + configuration containers. [André Malo] + + *) Add core version query function (ap_get_server_revision) and + accompanying ap_version_t structure (minor MMN bump). + [André Malo] + +Changes with Apache 2.0.55 + + *) SECURITY: CVE-2005-2700 (cve.mitre.org) + mod_ssl: Fix a security issue where "SSLVerifyClient" was not + enforced in per-location context if "SSLVerifyClient optional" + was configured in the vhost configuration. [Joe Orton] + + *) SECURITY: CVE-2005-2970 (cve.mitre.org) + worker MPM: Fix a memory leak which can occur after an aborted + connection in some limited circumstances. [Greg Ames] + + *) mod_ldap: Fix PR 36563. Keep track of the number of attributes + retrieved from LDAP so that all of the values can be properly + cached even if the value is NULL. + [Brad Nicholes, Ondrej Sury ] + + *) SECURITY: CVE-2005-2491 (cve.mitre.org): + Fix integer overflows in PCRE in quantifier parsing which could + be triggered by a local user through use of a carefully-crafted + regex in an .htaccess file. [Philip Hazel] + + *) SECURITY: CVE-2005-2088 (cve.mitre.org) + proxy: Correctly handle the Transfer-Encoding and Content-Length + headers. Discard the request Content-Length whenever T-E: chunked + is used, always passing one of either C-L or T-E: chunked whenever + the request includes a request body. Resolves an entire class of + proxy HTTP Request Splitting/Spoofing attacks. [William Rowe] + + *) Added TraceEnable [on|off|extended] per-server directive to alter + the behavior of the TRACE method. This addresses a flaw in proxy + conformance to RFC 2616 - previously the proxy server would accept + a TRACE request body although the RFC prohibited it. The default + remains 'TraceEnable on'. [William Rowe] + + *) Add ap_log_cerror() for logging messages associated with particular + client connections. [Jeff Trawick] + + *) Correct mod_cgid's argv[0] so that the full path can be delved by the + invoked cgi application, to conform to the behavior of mod_cgi. + [Pradeep Kumar S ] + + *) mod_include: Fix possible environment variable corruption when + using nested includes. PR 12655. [Joe Orton] + + *) Support the suppress-error-charset setting, as with Apache 1.3.x. + PR 31274. [Jeff Trawick] + + *) EBCDIC: Handle chunked input from client or, with proxy, origin + server. [Jeff Trawick] + + *) Fix bad globbing comparison which could result in getting + a directory listing when a file was requested. PR 34512. + [sean ] + + *) Fix core dump if mod_auth_ldap's mod_auth_ldap_auth_checker() + was called even if mod_auth_ldap_check_user_id() was not + (or if it didn't succeed) for non-authoritative cases. + [Jim Jagielski] + + *) SECURITY: CVE-2005-2728 (cve.mitre.org) + Fix cases where the byterange filter would buffer responses + into memory. PR 29962. [Joe Orton] + + *) mod_proxy: Fix over-eager handling of '%' for reverse proxies. + PR 15207. [Jim Jagielski] + + *) mod_ldap: Fix various shared memory cache handling bugs. + PR 34209. [Joe Orton] + + *) Fix a file descriptor leak when starting piped loggers. PR 33748. + [Joe Orton] + + *) mod_ldap: Avoid segfaults when opening connections if using a version + of OpenLDAP older than 2.2.21. PR 34618. [Brad Nicholes] + + *) mod_ssl: Fix build with OpenSSL 0.9.8. PR 35757. [William Rowe] + + *) SECURITY: CVE-2005-2088 (cve.mitre.org) + core: If a request contains both Transfer-Encoding and Content-Length + headers, remove the Content-Length, mitigating some HTTP Request + Splitting/Spoofing attacks. [Paul Querna, Joe Orton] + + *) proxy HTTP: If a response contains both Transfer-Encoding and a + Content-Length, remove the Content-Length and don't reuse the + connection, mitigating some HTTP Response Splitting attacks. + [Jeff Trawick] + + *) Prevent hangs of child processes when writing to piped loggers at + the time of graceful restart. PR 26467. [Jeff Trawick] + + *) SECURITY: CVE-2005-1268 (cve.mitre.org) + mod_ssl: Fix off-by-one overflow whilst printing CRL information + at "LogLevel debug" which could be triggered if configured + to use a "malicious" CRL. PR 35081. [Marc Stern ] + + *) mod_userdir: Fix possible memory corruption issue. PR 34588. + [David Leonard ] + + *) worker mpm: don't take down the whole server for a transient + thread creation failure. PR 34514 [Greg Ames] + + *) mod_rewrite: use buffered I/O to improve performance with large + RewriteMap txt: files. [Greg Ames] + + *) proxy HTTP: Rework the handling of request bodies to handle + chunked input and input filters which modify content length, and + avoid spooling arbitrary-sized request bodies in memory. + PR 15859. [Jeff Trawick] + +Changes with Apache 2.0.54 + + *) mod_cache: Add CacheIgnoreHeaders directive. PR 30399. + [Rüdiger Plüm ] + + *) mod_ldap: Added the directive LDAPConnectionTimeout to configure + the ldap socket connection timeout value. + [Brad Nicholes] + + *) Correctly export all mod_dav public functions. + [Branko Čibej ] + + *) Add a build script to create a solaris package. [Graham Leggett] + + *) worker MPM: Fix a problem which could cause httpd processes to + remain active after shutdown. [Jeff Trawick] + + *) Unix MPMs: Shut down the server more quickly when child processes are + slow to exit. [Joe Orton, Jeff Trawick] + + *) Remove formatting characters from ap_log_error() calls. These + were escaped as fallout from CVE-2003-0020. + [Eric Covener ] + + *) mod_ssl: If SSLUsername is used, set r->user earlier. PR 31418. + [David Reid] + + *) htdigest: Fix permissions of created files. PR 33765. [Joe Orton] + + *) core_input_filter: Move buckets to a persistent brigade instead of + creating a new brigade. This stop a memory leak when proxying a + Streaming Media Server. PR 33382. [Paul Querna] + + *) mod_win32: Ignore both PATH_INFO as well as PATH_TRANSLATED to avoid + hiccups from additional path information passed in non-utf-8 format. + [Richard Donkin ] + + *) mod_proxy: Fix ProxyRemoteMatch directive. PR 33170. + [Rici Lake ] + + *) mod_proxy: Respect errors reported by pre_connection hooks. + [Jeff Trawick] + + *) --with-module can now take more than one module to be statically + linked: --with-module=:,:,... + If the -subdirectory doesn't exist it will be created and + populated with a standard Makefile.in. [Erik Abele] + + *) Fix the RPM spec file so that an RPM build now works. An RPM + build now requires system installations of APR and APR-util. + Remove some arbitrary moving around of binaries - the RPM now + maps to the ASF build of httpd. + [Graham Leggett] + + *) mod_dumpio, an I/O logging/dumping module, added to the + modules/expermimental subdirectory. [Jim Jagielski] + + *) mod_auth_ldap: Handle the inconsistent way in which the MS LDAP + library handles special characters. PR 24437. [Jess Holle] + + *) Win32 MPM: Correct typo in debugging output. [William Rowe] + + *) conf: Remove AddDefaultCharset from the default configuration because + setting a site-wide default does more harm than good. PR 23421. + [Roy Fielding] + + *) Add charset to example CGI scripts. [Roy Fielding] + + *) mod_ssl: fail quickly if SSL connection is aborted rather than + making many doomed ap_pass_brigade calls. PR 32699. [Joe Orton] + + *) Remove compiled-in upper limit on LimitRequestFieldSize. + [Bill Stoddard] + + *) Start keeping track of time-taken-to-process-request again for + mod_status if ExtendedStatus is enabled. [Jim Jagielski] + + *) mod_proxy: Handle client-aborted connections correctly. PR 32443. + [Janne Hietamäki, Joe Orton] + + *) Fix handling of files >2Gb on all platforms (or builds) where + apr_off_t is larger than apr_size_t. PR 28898. [Joe Orton] + + *) mod_include: Fix bug which could truncate variable expansions + of N*64 characters by one byte. PR 32985. [Joe Orton] + + *) Correct handling of certain bucket types in ap_save_brigade, fixing + possible segfaults in mod_cgi with #include virtual. PR 31247. + [Joe Orton] + + *) Allow for the use of --with-module=foo:bar where the ./modules/foo + directory is local only. Assumes, of course, that the required + files are in ./modules/foo, but makes it easier to statically + build/log "external" modules. [Jim Jagielski] + + *) Util_ldap: Implemented the util_ldap_cache_getuserdn() API so that + ldap authorization only modules have access to the util_ldap + user cache without having to require ldap authentication as well. + PR 31898. [Jari Ahonen jah progress.com, Brad Nicholes] + + *) mod_auth_ldap: Added the directive "Requires ldap-attribute" that + allows the module to only authorize a user if the attribute value + specified matches the value of the user object. PR 31913 + [Ryan Morgan ] + + *) SECURITY: CVE-2004-0942 (cve.mitre.org) + Fix for memory consumption DoS in handling of MIME folded request + headers. [Joe Orton] + + *) SECURITY: CVE-2004-0885 (cve.mitre.org) + mod_ssl: Fix a bug which allowed an SSLCipherSuite setting to be + bypassed during an SSL renegotiation. PR 31505. + [Hartmut Keil , Joe Orton] + + *) mod_ssl: Fail at startup rather than segfault at runtime if a + client cert is configured with an encrypted private key. + PR 24030. [Joe Orton] + + *) apxs: fix handling of -Wc/-Wl and "-o mod_foo.so". PR 31448 + [Joe Orton] + + *) mod_ldap: Fix format strings to use %APR_PID_T_FMT instead of %d. + [Jeff Trawick] + + *) mod_cache: CacheDisable will only disable the URLs it was meant to + disable, not all caching. PR 31128. + [Edward Rudd , Paul Querna] + + *) mod_cache: Try to correctly follow RFC 2616 13.3 on validating stale + cache responses. [Justin Erenkrantz] + + *) mod_rewrite: Handle per-location rules when r->filename is unset. + Previously this would segfault or simply not match as expected, + depending on the platform. [Jeff Trawick] + + *) mod_rewrite: Fix 0 bytes write into random memory position. + PR 31036. [André Malo] + + *) mod_disk_cache: Do not store aborted content. PR 21492. + [Rüdiger Plüm ] + + *) mod_disk_cache: Correctly store cached content type. PR 30278. + [Rüdiger Plüm ] + + *) mod_ldap: prevent the possiblity of an infinite loop in the LDAP + statistics display. PR 29216. [Graham Leggett] + + *) mod_ldap: fix a bogus error message to tell the user which file + is causing a potential problem with the LDAP shared memory cache. + PR 31431 [Graham Leggett] + + *) SECURITY: CVE-2004-1834 (cve.mitre.org) + mod_disk_cache: Do not store hop-by-hop headers. [Justin Erenkrantz] + + *) Fix the re-linking issue when purging elements from the LDAP cache + PR 24801. [Jess Holle ] + + *) mod_disk_cache: Fix races in saving responses. [Justin Erenkrantz] + + *) Fix Expires handling in mod_cache. [Justin Erenkrantz] + + *) Alter mod_expires to run at a different filter priority to allow + proper Expires storage by mod_cache. [Justin Erenkrantz] + +Changes with Apache 2.0.52 + + *) Use HTML 2.0


    for error pages. PR 30732 [André Malo] + + *) Fix the global mutex crash when the global mutex is never allocated + due to disabled/empty caches. [Jess Holle ] + + *) Fix a segfault in the LDAP cache when it is configured switched + off. [Jess Holle ] + + *) SECURITY: CVE-2004-0811 (cve.mitre.org) + Fix merging of the Satisfy directive, which was applied to + the surrounding context and could allow access despite configured + authentication. PR 31315. [Rici Lake ] + + *) Fix the handling of URIs containing %2F when AllowEncodedSlashes + is enabled. Previously, such urls would still be rejected. + [Jeff Trawick, Bill Stoddard] + + *) mod_mem_cache: Fixed race condition causing segfault because of memory being + freed twice, or reused after being freed. + [J. Clar, W. Stoddard, G. Ames] + + *) Add -l option to rotatelogs to let it use local time rather than + UTC. PR 24417. [Ken Coar, Uli Zappe ] + + *) mod_log_config: Fix a bug which prevented request completion time + from being logged for I_INSIST_ON_EXTRA_CYCLES_FOR_CLF_COMPLIANCE + processing. PR 29696. [Alois Treindl ] + +Changes with Apache 2.0.51 + + *) SECURITY: CVE-2004-0786 (cve.mitre.org) + Fix an input validation issue in apr-util which could be + triggered by malformed IPv6 literal addresses. [Joe Orton] + + *) SECURITY: CVE-2004-0747 (cve.mitre.org) + Fix buffer overflow in expansion of environment variables in + configuration file parsing. [André Malo] + + *) SECURITY: CVE-2004-0809 (cve.mitre.org) + mod_dav_fs: Fix a segfault in the handling of an indirect lock + refresh. PR 31183. [Joe Orton] + + *) mod_include no longer checks for recursion, because that's done + in the core. This allows for careful usage of recursive SSI. + [André Malo] + + *) Fix memory leak in the cache handling of mod_rewrite. PR 27862. + [chunyan sheng , André Malo] + + *) Include directives no longer refuse to process symlinks on + directories. Instead there's now a maximum nesting level + of included directories (128 as distributed). This is configurable + at compile time using the -DAP_MAX_INCLUDE_DIR_DEPTH switch. + PR 28492. [André Malo] + + *) Win32: apache -k start|restart|install|config can leave stranded + piped logger processes (eg, rotatelogs.exe) due to improper + server shutdown on these code paths. + [Bill Stoddard] + + *) SECURITY: CVE-2004-0751 (cve.mitre.org) + mod_ssl: Fix a segfault in the SSL input filter which could be + triggered if using "speculative" mode, for instance by a + proxy request to an SSL server. PR 30134. [Joe Orton] + + *) mod_rewrite: Add %{SSL:...} and %{HTTPS} variable lookups. + PR 30464. [Joe Orton, Madhusudan Mathihalli] + + *) mod_ssl: Add new 'ssl_is_https' optional function. [Joe Orton] + + *) Prevent CGI script output which includes a Content-Range header + from being passed through the byterange filter. [Joe Orton] + + *) Satisfy directives now can be influenced by a surrounding + container. PR 14726. [André Malo] + + *) mod_rewrite now officially supports RewriteRules in sections. + PR 27985. [André Malo] + + *) mod_disk_cache: Implement binary format for on-disk header files. + [Brian Akins , Justin Erenkrantz] + + *) mod_disk_cache: Optimize network performance of disk cache subsystem by + allowing zero-copy (sendfile) writes and other miscellaneous fixes. + [Justin Erenkrantz] + + *) mod_cache, mod_disk_cache, mod_mem_cache: Refactor cache modules, and + switch to the provider API instead of hooks. [Justin Erenkrantz] + + *) mod_autoindex: Don't truncate the directory listing if a stat() + call fails (for instance on a >2Gb file). PR 17357. + [Joe Orton] + + *) Makefile fix: httpd is linked against LIBS given to the + 'make' invocation. PR 7882. [Joe Orton] + + *) WinNT MPM: Fix a broken log message at termination. PR 28063. + [Eider Oliveira ] + + *) Prevent Win32 pool corruption at startup [Allan Edwards] + + *) mod_ssl: Add "SSLUserName" directive to set r->user based on a + chosen SSL environment variable. PR 20957. + [Martin v. Loewis ] + + *) suexec: Pass the SERVER_SIGNATURE envvar through to CGIs. + [Zvi Har'El ] + + *) apachectl: Fix a problem finding envvars if sbindir != bindir. + PR 30723. [Friedrich Haubensak ] + + *) mod_ssl: Build on RHEL 3. PR 18989. [Justin Erenkrantz] + + *) SECURITY: CVE-2004-0748 (cve.mitre.org) + mod_ssl: Fix a potential infinite loop. PR 29964. [Joe Orton] + + *) mod_ssl: Avoid startup failure after unclean shutdown if using shmcb. + PR 18989. [Joe Orton] + + *) mod_userdir: Ensure that the userdir identity is used for + suexec userdir access in a virtual host which has suexec configured. + PR 18156. [Joshua Slive] + + *) mod_rewrite no longer confuses the RewriteMap caches if + different maps defined in different virtual hosts use the + same map name. PR 26462. [André Malo] + + *) mod_setenvif: Remove "support" for Remote_User variable which + never worked at all. PR 25725. [André Malo] + + *) Backport from 2.1 / Regression from 1.3: mod_headers now knows + again the functionality of the ErrorHeader directive. But instead + using this misnomer additional flags to the Header directive were + introduced ("always" and "onsuccess", defaulting to the latter). + PR 28657. [André Malo] + + *) Use the higher performing 'httpready' Accept Filter on all platforms + except FreeBSD < 4.1.1. [Paul Querna] + + *) mod_usertrack: Escape the cookie name before pasting into the + regexp. [André Malo] + + *) Extend the SetEnvIf directive to capture subexpressions of the + matched value. [André Malo] + + *) Recursive Include directives no longer crash. The server stops + including configuration files after a certain nesting level (128 + as distributed). This is configurable at compile time using the + -DAP_MAX_INCLUDE_DEPTH switch. PR 28370. [André Malo] + + *) mod_dir: the trailing-slash behaviour is now configurable using the + DirectorySlash directive. [André Malo] + + *) Allow proxying of resources that are invoked via DirectoryIndex. + PR 14648, 15112, 29961. [André Malo] + + *) util_ldap: Switched the lock types on the shared memory cache + from thread reader/writer locks to global mutexes in order to + provide cross process cache protection. [Brad Nicholes] + + *) util_ldap: Reworked the cache locking scheme to eliminate duplicate + cache entries in the credentials cache due to race conditions. + [Brad Nicholes] + + *) util_ldap: Enhanced the util_ldap cache-info display to show more + detail about the contents and current state of the cache. + [Brad Nicholes] + + *) Enable the option to support anonymous shared memory in mod_ldap. + This makes the cache work on Linux again. [Graham Leggett] + + *) Enable special ErrorDocument value 'default' which restores the + canned server response for the scope of the directive. + [Geoffrey Young, André Malo] + + *) work around MSIE Digest auth bug - if AuthDigestEnableQueryStringHack + is set in r->subprocess_env allow mismatched query strings to pass. + PR 27758. [Paul Querna, Geoffrey Young] + + *) Accept URLs for the ServerAdmin directive. If the supplied + argument is not recognized as an URL, assume it's a mail address. + PR 28174. [André Malo, Paul Querna] + + *) initialize server arrays prior to calling ap_setup_prelinked_modules + so that static modules can push Defines values when registering + hooks just like DSO modules can ["Philippe M. Chiasson" ] + + *) Small fix to allow reverse proxying to an ftp server. Previously + an attempt to do this would try and connect to 0.0.0.0, regardless + of the server specified. PR 24922 + [Pascal Terjan ] + + *) Add the NOTICE file to the rpm spec file in compliance with the + Apache v2.0 license. [Graham Leggett] + + *) RPM spec file changes: changed default dependancy to link to db4 + instead of db3. Fixed complaints about unpackaged files. + [Graham Leggett] + +Changes with Apache 2.0.50 + + *) SECURITY: CVE-2004-0493 (cve.mitre.org) + Close a denial of service vulnerability identified by Georgi + Guninski which could lead to memory exhaustion with certain + input data. [Jeff Trawick] + + *) mod_cgi: Handle output on stderr during script execution on Unix + platforms; preventing deadlock when stderr output fills pipe buffer. + Also fixes case where stderr from nph- scripts could be lost. + PR 22030, 18348. [Joe Orton, Jeff Trawick] + + *) mod_alias now emits a warning if it detects overlapping *Alias* + directives. [André Malo] + + *) mod_rewrite no longer turns forward proxy requests into reverse proxy + requests. PR 28125 [ast domdv.de, André Malo] + + *) ap_set_sub_req_protocol and ap_finalize_sub_req_protocol are now + exported on Win32 and Netware as well (minor MMN bump). PR 28523. + [Edward Rudd , André Malo] + + *) Restore the ability to disable the use of AcceptEx on Win9x systems + automatically (broken in 2.0.49). PR 28529. [André Malo] + + *) now applies to all IP addresses for myhost + instead of just the first one reported by the resolver. This + corrects a regression since 1.3. [Jeff Trawick] + + *) util_ldap: allow relative paths for LDAPTrustedCA to be resolved + against ServerRoot PR#26602 [Brad Nicholes] + + *) SECURITY: CVE-2004-0488 (cve.mitre.org) + mod_ssl: Fix a buffer overflow in the FakeBasicAuth code for a + (trusted) client certificate subject DN which exceeds 6K in length. + [Joe Orton] + + *) mod_dav_fs: Fix MKCOL response for missing parent collections, which + caused issues for the Eclipse WebDAV extension. + PR 29034. [Joe Orton] + + *) mod_deflate: Fix memory consumption (which was proportional to the + response size). PR 29318. [Joe Orton] + + *) mod_ssl: Log the errors returned on failure to load or initialize + a crypto accelerator engine. [Joe Orton] + + *) Allow RequestHeader directives to be conditional. PR 27951. + [Vincent Deffontaines , André Malo] + + *) Allow LimitRequestBody to be reset to unlimited. PR 29106 + [André Malo] + + *) Fix a bunch of cases where the return code of the regex compiler + was not checked properly. This affects: mod_setenvif, mod_usertrack, + mod_proxy, mod_proxy_ftp and core. PR 28218. [André Malo] + + *) mod_ssl: Fix a potential segfault in the 'shmcb' session cache for + small cache sizes. PR 27751. [Geoff Thorpe ] + + *) Remove 2Gb log file size restriction on some 32-bit platforms. + PR 13511. [Joe Orton] + + *) mod_logio no longer removes the EOS bucket. PR 27928. + [Bojan Smojver ] + + *) htpasswd no longer refuses to process files that contain empty + lines. [André Malo] + + *) Regression from 1.3: At startup, suexec now will be checked for + availability, the setuid bit and user root. The works only if + httpd is compiled with the shipped APR version (0.9.5). + PR 28287. [André Malo] + + *) Unix MPMs: Stop dropping connections when the file descriptor + is at least FD_SETSIZE. [Jeff Trawick] + + *) Fix handling of IPv6 numeric strings in mod_proxy. [Jeff Trawick] + + *) mod_isapi: send_response_header() failed to copy status string's + last character. PR 20619. [Jesse Pelton ] + + *) Fix a segfault when requests for shared memory fails and returns + NULL. Fix a segfault caused by a lack of bounds checking on the + cache. PR 24801. [Graham Leggett] + + *) Throw an error message if an attempt is made to use the LDAPTrustedCA + or LDAPTrustedCAType directives in a VirtualHost. PR 26390 + [Brad Nicholes] + + *) Fix a potential segfault if the bind password in the LDAP cache + is NULL. PR 28250. [Jari Ahonen ] + + *) Quotes cannot be used around require group and require dn + directives, update the documentation to reflect this. Also add + quotes around the dn and group within debug messages, to make it + more obvious why authentication is failing if quotes are used in + error. PR 19304. [Graham Leggett] + + *) The Microsoft LDAP SDK escapes filters for us, stop util_ldap + from escaping filters twice when the backslash character is used. + PR 24437. [Jess Holle ] + + *) Overhaul handling of LDAP error conditions, so that the util_ldap_* + functions leave the connections in a sane state after errors have + occurred. PR 27748, 17274, 17599, 18661, 21787, 24595, 24683, 27134, + 27271 [Graham Leggett] + + *) mod_ldap calls ldap_simple_bind_s() to validate the user + credentials. If the bind fails, the connection is left + in an unbound state. Make sure that the ldap connection + record is updated to show that the connection is no longer + bound. [Brad Nicholes] + + *) Ensure that lines in the request which are too long are + properly terminated before logging. + [Tsurutani Naoki ] + + *) Update the bind credentials for the cached LDAP connection to + reflect the last bind. This prevents util_ldap from creating + unnecessary connections rather than reusing cached connections. + [Brad Nicholes] + + *) mod_isapi: GetServerVariable returned improperly terminated header + fields given "ALL_HTTP" or "ALL_RAW". PR 20656. + [Jesse Pelton ] + + *) mod_isapi: GetServerVariable("ALL_RAW") returned the wrong buffer + size. PR 20617. [Jesse Pelton ] + + *) mod_dav: Fix a problem that could cause crashes when manipulating + locks on some platforms. [Jeff Trawick] + + *) mod_headers no longer crashes if an empty header value should + be added. [André Malo] + + *) Fix segfault in mod_expires, which occured under certain + circumstances. PR 28047. [André Malo] + + *) htpasswd: use apr_temp_dir_get() and general cleanup + [Guenter Knauf , Thom May] + + *) mod_ssl: Fix memory leak in session cache handling. PR 26562 + [Madhusudan Mathihalli] + + *) mod_ssl: Fix potential segfaults when performing SSL shutdown from + a pool cleanup. PR 27945. [Joe Orton] + + *) Add forensic logging module (mod_log_forensic). + [Ben Laurie] + + *) logresolve: Allow size of log line buffer to be overridden at + build time (MAXLINE). PR 27793. [Jeff Trawick] + + *) Fix the comment delimiter in htdbm so that it correctly parses the + username comment. Also add a terminate function to allow NetWare + to pause the output before the screen is destroyed. + [Guenter Knauf , Brad Nicholes] + + *) Fix crash when Apache was started with no Listen directives. + [Michael Corcoran ] + + *) core_output_filter: Fix bug that could result in sending + garbage over the network when module handlers construct + bucket brigades containing multiple file buckets all referencing + the same open file descriptor. [Bojan Smojver] + + *) Fix memory corruption problem with ap_custom_response() function. + The core per-dir config would later point to request pool data + that would be reused for different purposes on different requests. + [Jeff Trawick, based on an old 1.3 patch submitted by Will Lowe] + + *) Win32: Tweak worker thread accounting routines to eliminate + server hang when number of Listen directives in httpd.conf + is greater than or equal to the setting of ThreadsPerChild. + [Bill Stoddard] + +Changes with Apache 2.0.49 + + *) SECURITY: CVE-2004-0174 (cve.mitre.org) + Fix starvation issue on listening sockets where a short-lived + connection on a rarely-accessed listening socket will cause a + child to hold the accept mutex and block out new connections until + another connection arrives on that rarely-accessed listening socket. + With Apache 2.x there is no performance concern about enabling the + logic for platforms which don't need it, so it is enabled everywhere + except for Win32. [Jeff Trawick] + + *) mod_cgid: Fix storage corruption caused by use of incorrect pool. + [Jeff Trawick] + + *) Win32: find_read_listeners was not correctly handling multiple + listeners on the Win32DisableAcceptEx path. [Bill Stoddard] + + *) Fix bug in mod_usertrack when no CookieName is set. PR 24483. + [Manni Wood ] + + *) Fix some piped log problems: bogus "piped log program '(null)' + failed" messages during restart and problem with the logger + respawning again after Apache is stopped. PR 21648, PR 24805. + [Jeff Trawick] + + *) Fixed file extensions for real media files and removed rpm extension + from mime.types. PR 26079. [Allan Sandfeld ] + + *) Remove compile-time length limit on request strings. Length is + now enforced solely with the LimitRequestLine config directive. + [Paul J. Reder] + + *) mod_ssl: Send the Close Alert message to the peer before closing + the SSL session. PR 27428. [Madhusudan Mathihalli, Joe Orton] + + *) SECURITY: CVE-2004-0113 (cve.mitre.org) + mod_ssl: Fix a memory leak in plain-HTTP-on-SSL-port handling. + PR 27106. [Joe Orton] + + *) mod_ssl: Fix bug in passphrase handling which could cause spurious + failures in SSL functions later. PR 21160. [Joe Orton] + + *) mod_log_config: Fix corruption of buffered logs with threaded + MPMs. PR 25520. [Jeff Trawick] + + *) Fix mod_include's expression parser to recognize strings correctly + even if they start with an escaped token. [André Malo] + + *) Add fatal exception hook for use by diagnostic modules. The hook + is only available if the --enable-exception-hook configure parm + is used and the EnableExceptionHook directive has been set to + "on". [Jeff Trawick] + + *) Allow mod_auth_digest to work with sub-requests with different + methods than the original request. PR 25040. + [Josh Dady ] + + *) fix "Expected > but saw " errors in nested, + argumentless containers. + ["Philippe M. Chiasson" ] + + *) mod_auth_ldap: Fix some segfaults in the cache logic. PR 18756. + [Matthieu Estrade , Brad Nicholes] + + *) mod_cgid: Restart the cgid daemon if it crashes. PR 19849 + [Glenn Nielsen ] + + *) The whole codebase was relicensed and is now available under + the Apache License, Version 2.0 (http://www.apache.org/licenses). + [Apache Software Foundation] + + *) Fixed cache-removal order in mod_mem_cache. + [Jean-Jacques Clar, Cliff Woolley] + + *) mod_setenvif: Fix the regex optimizer, which under circumstances + treated the supplied regex as literal string. PR 24219. + [André Malo] + + *) ap_mpm.h: Fix include guard of ap_mpm.h to reference mpm + instead of mmn. [André Malo] + + *) mod_rewrite: Catch an edge case, where strange subsequent RewriteRules + could lead to a 400 (Bad Request) response. [André Malo] + + *) Keep focus of ITERATE and ITERATE2 on the current module when + the module chooses to return DECLINE_CMD for the directive. + PR 22299. [Geoffrey Young ] + + *) Add support for IMT minor-type wildcards (e.g., text/*) to + ExpiresByType. PR#7991 [Ken Coar] + + *) Fix segfault in mod_mem_cache cache_insert() due to cache size + becoming negative. PR: 21285, 21287 + [Bill Stoddard, Massimo Torquati, Jean-Jacques Clar] + + *) core.c: If large file support is enabled, allow any file that is + greater than AP_MAX_SENDFILE to be split into multiple buckets. + This allows Apache to send files that are greater than 2gig. + Otherwise we run into 32/64 bit type mismatches in the file size. + [Brad Nicholes] + + *) proxy_http fix: mod_proxy hangs when both KeepAlive and + ProxyErrorOverride are enabled, and a non-200 response without a + body is generated by the backend server. (e.g.: a client makes a + request containing the "If-Modified-Since" and "If-None-Match" + headers, to which the backend server respond with status 304.) + [Graham Wiseman , Richard Reiner] + + *) mod_dav: Reject requests which include an unescaped fragment in the + Request-URI. PR 21779. [Amit Athavale ] + + *) Build array of allowed methods with proper dimensions, fixing + possible memory corruption. [Jeff Trawick] + + *) mod_ssl: Fix potential segfault on lookup of SSL_SESSION_ID. + PR 15057. [Otmar Lendl ] + + *) mod_ssl: Fix streaming output from an nph- CGI script. PR 21944 + [Joe Orton] + + *) mod_usertrack no longer inspects the Cookie2 header for + the cookie name. PR 11475. [Chris Darrochi ] + + *) mod_usertrack no longer overwrites other cookies. + PR 26002. [Scott Moore ] + + *) worker MPM: fix stack overlay bug that could cause the parent + process to crash. [Jeff Trawick] + + *) Win32: Add Win32DisableAcceptEx directive. This Windows + NT/2000/CP directive is useful to work around bugs in some + third party layered service providers like virus scanners, + VPN and firewall products, that do not properly handle + WinSock 2 APIs. Use this directive if your server is issuing + AcceptEx failed messages. + [Allan Edwards, Bill Rowe, Bill Stoddard, Jeff Trawick] + + *) Make REMOTE_PORT variable available in mod_rewrite. + PR 25772. [André Malo] + + *) Fix a long delay with CGI requests and keepalive connections on + AIX. [Jeff Trawick] + + *) mod_autoindex: Add 'XHTML' option in order to allow switching between + HTML 3.2 and XHTML 1.0 output. PR 23747. [André Malo] + + *) Add XHTML Document Type Definitions to httpd.h (minor MMN bump). + [André Malo] + + *) mod_ssl: Advertise SSL library version as determined at run-time rather + than at compile-time. PR 23956. [Eric Seidel ] + + *) mod_ssl: Fix segfault on a non-SSL request if the 'c' log + format code is used. PR 22741. [Gary E. Miller ] + + *) Fix build with parallel make. PR 24643. [Joe Orton] + + *) mod_rewrite: In external rewrite maps lookup keys containing + a newline now cause a lookup failure. PR 14453. + [Cedric Gavage , André Malo] + + *) Backport major overhaul of mod_include's filter parser from 2.1. + The new parser code is expected to be more robust and should + catch all of the edge cases that were not handled by the previous one. + The 2.1 external API changes were hidden by a wrapper which is + expected to keep the API backwards compatible. [André Malo] + + *) Add a hook (insert_error_filter) to allow filters to re-insert + themselves during processing of error responses. Enable mod_expires + to use the new hook to include Expires headers in valid error + responses. This addresses an RFC violation. It fixes PRs 19794, + 24884, and 25123. [Paul J. Reder] + + *) Add Polish translation of error messages. PR 25101. + [Tomasz Kepczynski ] + + *) Add AP_MPMQ_MPM_STATE function code for ap_mpm_query. (Not yet + supported for BeOS or OS/2 MPMs.) [Jeff Trawick, Brad Nicholes, + Bill Stoddard] + + *) Add mod_status hook to allow modules to add to the mod_status + report. [Joe Orton] + + *) Fix htdbm to generate comment fields in DBM files correctly. + [Justin Erenkrantz] + + *) mod_dav: Use bucket brigades when reading PUT data. This avoids + problems if the data stream is modified by an input filter. PR 22104. + [Tim Robbins , André Malo] + + *) Fix RewriteBase directive to not add double slashes. [André Malo] + + *) Improve 'configure --help' output for some modules. [Astrid Keßler] + + *) Correct UseCanonicalName Off to properly check incoming port number. + [Jim Jagielski] + + *) Fix slow graceful restarts with prefork MPM. [Joe Orton] + + *) Fix a problem with namespace mappings being dropped in mod_dav_fs; + if any property values were set which defined namespaces these + came out mangled in the PROPFIND response. PR 11637. + [Amit Athavale ] + + *) mod_dav: Return a WWW-auth header for MOVE/COPY requests where + the destination resource gives a 401. PR 15571. [Joe Orton] + + *) SECURITY: CVE-2003-0020 (cve.mitre.org) + Escape arbitrary data before writing into the errorlog. Unescaped + errorlogs are still possible using the compile time switch + "-DAP_UNSAFE_ERROR_LOG_UNESCAPED". [Geoffrey Young, André Malo] + + *) mod_autoindex / core: Don't fail to show filenames containing + special characters like '%'. PR 13598. [André Malo] + + *) mod_status: Report total CPU time accurately when using a threaded + MPM. PR 23795. [Jeff Trawick] + + *) Fix memory leak in handling of request bodies during reverse + proxy operations. PR 24991. [Larry Toppi ] + + *) Win32 MPM: Implement MaxMemFree to enable setting an upper + limit on the amount of storage used by the bucket brigades + in each server thread. [Bill Stoddard] + + *) Modified the cache code to be header-location agnostic. Also + fixed a number of other cache code bugs related to PR 15852. + Includes a patch submitted by Sushma Rai . + This fixes mod_mem_cache but not mod_disk_cache yet so I'm not + closing the PR since that is what they are using. [Paul J. Reder] + + *) complain via error_log when mod_include's INCLUDES filter is + enabled, but the relevant Options flag allowing the filter to run + for the specific resource wasn't set, so that the filter won't + silently get skipped. next remove itself, so the warning will be + logged only once [Stas Bekman, Jeff Trawick, Bill Rowe] + + *) mod_info: HTML escape configuration information so it displays + correctly. PR 24232. [Thom May] + + *) Restore the ability to add a description for directories that + don't contain an index file. (Broken in 2.0.48) [André Malo] + + *) Fix a problem with the display of empty variables ("SetEnv foo") in + mod_include. PR 24734 [Markus Julen ] + + *) mod_log_config: Log the minutes component of the timezone correctly. + PR 23642. [Hong-Gunn Chew ] + + *) mod_proxy: Fix cases where an invalid status-line could be sent + to the client. PR 23998. [Joe Orton] + + *) mod_ssl: Fix segfaults at startup if other modules which use OpenSSL + are also loaded. [Joe Orton] + + *) mod_ssl: Use human-readable OpenSSL error strings in logs; use + thread-safe interface for retrieving error strings. [Joe Orton] + + *) mod_expires: Initialize ExpiresDefault to NULL instead of "" to + avoid reporting an Internal Server error if it is used without + having been set in the httpd.conf file. PR: 23748, 24459 + [André Malo, Liam Quinn ] + + *) mod_autoindex: Don't omit the start tag if the SuppressIcon + option is set. PR 21668. [Jesse Tie-Ten-Quee ] + + *) mod_include no longer allows an ETag header on 304 responses. + PR 19355. [Geoffrey Young , André Malo] + + *) EBCDIC: Convert header fields to ASCII before sending (broken + since 2.0.44). [Martin Kraemer] + + *) Fix the inability to log errors like exec failure in + mod_ext_filter/mod_cgi script children. This was broken after + such children stopped inheriting the error log handle. + [Jeff Trawick] + + *) Fix mod_info to use the real config file name, not the default + config file name. [Aryeh Katz ] + + *) Set the scoreboard state to indicate logging prior to running + logging hooks so that server-status will show 'L' for hung loggers + instead of 'W'. [Jeff Trawick] + +Changes with Apache 2.0.48 + + *) SECURITY: CVE-2003-0789 (cve.mitre.org) + mod_cgid: Resolve some mishandling of the AF_UNIX socket used to + communicate with the cgid daemon and the CGI script. + [Jeff Trawick] + + *) SECURITY: CVE-2003-0542 (cve.mitre.org) + Fix buffer overflows in mod_alias and mod_rewrite which occurred + if one configured a regular expression with more than 9 captures. + [André Malo] + + *) mod_include: fix segfault which occured if the filename was not + set, for example, when processing some error conditions. + PR 23836. [Brian Akins , André Malo] + + *) fix the config parser to support .. containers (no + arguments in the opening tag) supported by httpd 1.3. Without + this change mod_perl 2.0's sections are broken. + ["Philippe M. Chiasson" ] + + *) mod_cgid: fix a hash table corruption problem which could + result in the wrong script being cleaned up at the end of a + request. [Jeff Trawick] + + *) Update httpd-*.conf to be clearer in describing the connection + between AddType and AddEncoding for defining the meaning of + compressed file extensions. [Roy Fielding] + + *) mod_rewrite: Don't die silently when failing to open RewriteLogs. + PR 23416. [André Malo] + + *) mod_rewrite: Fix mod_rewrite's support of the [P] option to send + rewritten request using "proxy:". The code was adding multiple "proxy:" + fields in the rewritten URI. PR: 13946. + [Eider Oliveira ] + + *) cache_util: Fix ap_check_cache_freshness to check max_age, smax_age, and + expires as directed in RFC 2616. [Thomas Castelle ] + + *) Ensure that ssl-std.conf is generated at configure time, and switch + to using the expanded config variables to work the same as + httpd-std.conf PR: 19611 + [Thom May] + + *) mod_ssl: Fix segfaults after renegotiation failure. PR 21370 + [Hartmut Keil ] + + *) mod_autoindex: If a directory contains a file listed in the + DirectoryIndex directive, the folder icon is no longer replaced + by the icon of that file. PR 9587. + [David Shane Holden ] + + *) Fixed mod_usertrack to not get false positive matches on the + user-tracking cookie's name. PR 16661. + [Manni Wood ] + + *) mod_cache: Fix the cache code so that responses can be cached + if they have an Expires header but no Etag or Last-Modified + headers. PR 23130. + [] + + *) mod_log_config: Fix %b log format to write really "-" when 0 bytes + were sent (e.g. with 304 or 204 response codes). [Astrid Keßler] + + *) Modify ap_get_client_block() to note if it has seen EOS. + [Justin Erenkrantz] + + *) Fix a bug, where mod_deflate sometimes unconditionally compressed the + content if the Accept-Encoding header contained only other tokens than + "gzip" (such as "deflate"). PR 21523. [Joe Orton, André Malo] + + *) Avoid an infinite recursion, which occured if the name of an included + config file or directory contained a wildcard character. PR 22194. + [André Malo] + + *) mod_ssl: Fix a problem setting variables that represent the + client certificate chain. PR 21371 [Jeff Trawick] + + *) Unix: Handle permissions settings for flock-based mutexes in + unixd_set_global|proc_mutex_perms(). Allow the functions to be + called for any type of mutex. PR 20312 [Jeff Trawick] + + *) ab: Work over non-loopback on Unix again. PR 21495. [Jeff Trawick] + + *) Fix a misleading message from the some of the threaded MPMs when + MaxClients has to be lowered due to the setting of ServerLimit. + [Jeff Trawick] + + *) Lower the severity of the "listener thread didn't exit" message + to debug, as it is of interest only to developers. PR 9011 + [Jeff Trawick] + + *) MPMs: The bucket brigades subsystem now honors the MaxMemFree setting. + [Cliff Woolley, Jean-Jacques Clar] + + *) Install config.nice into the build/ directory to make + minor version upgrades easier. [Joshua Slive] + + *) Fix mod_deflate so that it does not call deflate() without checking + first whether it has something to deflate. (Currently this causes + deflate to generate a fatal error according to the zlib spec.) + PR 22259. [Stas Bekman] + + *) mod_ssl: Fix FakeBasicAuth for subrequest. Log an error when an + identity spoof is encountered. + [Sander Striker] + + *) mod_rewrite: Ignore RewriteRules in .htaccess files if the directory + containing the .htaccess file is requested without a trailing slash. + PR 20195. [André Malo] + + *) ab: Overlong credentials given via command line no longer clobber + the buffer. [André Malo] + + *) mod_deflate: Don't attempt to hold all of the response until we're + done. [Justin Erenkrantz] + + *) Assure that we block properly when reading input bodies with SSL. + PR 19242. [David Deaves , William Rowe] + + *) Update mime.types to include latest IANA and W3C types. [Roy Fielding] + + *) mod_ext_filter: Set additional environment variables for use by + the external filter. PR 20944. [Andrew Ho, Jeff Trawick] + + *) Fix buildconf errors when libtool version changes. [Jeff Trawick] + + *) Remember an authenticated user during internal redirects if the + redirection target is not access protected and pass it + to scripts using the REDIRECT_REMOTE_USER environment variable. + PR 10678, 11602. [André Malo] + + *) mod_include: Fix a trio of bugs that would cause various unusual + sequences of parsed bytes to omit portions of the output stream. + PR 21095. [Ron Park , André Malo, Cliff Woolley] + + *) Update the header token parsing code to allow LWS between the + token word and the ':' seperator. [PR 16520] + [Kris Verbeeck , Nicel KM ] + + *) Eliminate creation of a temporary table in ap_get_mime_headers_core() + [Joe Schaefer ] + + *) Added FreeBSD directory layout. PR 21100. + [Sander Holthaus , André Malo] + + *) Fix NULL-pointer issue in ab when parsing an incomplete or non-HTTP + response. PR 21085. [Glenn Nielsen , André Malo] + + *) mod_rewrite: Perform child initialization on the rewrite log lock. + This fixes a log corruption issue when flock-based serialization + is used (e.g., FreeBSD). [Jeff Trawick] + + *) Don't respect the Server header field as set by modules and CGIs. + As with 1.3, for proxy requests any such field is from the origin + server; otherwise it will have our server info as controlled by + the ServerTokens directive. [Jeff Trawick] + +Changes with Apache 2.0.47 + + *) SECURITY: CVE-2003-0192 (cve.mitre.org) + Fixed a bug whereby certain sequences of per-directory + renegotiations and the SSLCipherSuite directive being used to + upgrade from a weak ciphersuite to a strong one could result in + the weak ciphersuite being used in place of the strong one. + [Ben Laurie] + + *) SECURITY: CVE-2003-0253 (cve.mitre.org) + Fixed a bug in prefork MPM causing temporary denial of service + when accept() on a rarely accessed port returns certain errors. + Reported by Saheed Akhtar . [Jeff Trawick] + + *) SECURITY: CVE-2003-0254 (cve.mitre.org) + Fixed a bug in ftp proxy causing denial of service when target + host is IPv6 but proxy server can't create IPv6 socket. Fixed by + the reporter. [Yoshioka Tsuneo ] + + *) SECURITY [VU#379828] Prevent the server from crashing when entering + infinite loops. The new LimitInternalRecursion directive configures + limits of subsequent internal redirects and nested subrequests, after + which the request will be aborted. PR 19753 (and probably others). + [William Rowe, Jeff Trawick, André Malo] + + *) core_output_filter: don't split the brigade after a FLUSH bucket if + it's the last bucket. This prevents creating unneccessary empty + brigades which may not be destroyed until the end of a keepalive + connection. + [Juan Rivera ] + + *) Add support for "streamy" PROPFIND responses. + [Ben Collins-Sussman ] + + *) mod_cgid: Eliminate a double-close of a socket. This resolves + various operational problems in a threaded MPM, since on the + second attempt to close the socket, the same descriptor was + often already in use by another thread for another purpose. + [Jeff Trawick] + + *) mod_negotiation: Introduce "prefer-language" environment variable, + which allows to influence the negotiation process on request basis + to prefer a certain language. [André Malo] + + *) Make mod_expires' ExpiresByType work properly, including for + dynamically-generated documents. [Ken Coar, Bill Stoddard] + +Changes with Apache 2.0.46 + + *) SECURITY: CVE-2003-0245 (cve.mitre.org) + Fixed a bug causing apr_pvsprintf() to crash by sending an overly + long string. This can be triggered remotely through mod_dav, + mod_ssl, and other mechanisms. + Reported by David Endler . [Joe Orton] + + *) SECURITY: CVE-2003-0189 (cve.mitre.org) + Fixed a denial-of-service vulnerability affecting basic + authentication on Unix platforms related to thread-safety in + apr_password_validate(). + Reported by John Hughes . + + *) Fix for mod_dav. Call the 'can_be_activity' callback, if provided, + when a MKACTIVITY request comes in. + [Ben Collins-Sussman ] + + *) Perform run-time query in apxs for apr and apr-util's includes. + [Justin Erenkrantz] + + *) run libtool from the apr install directory (in case that is different + from the apache install directory) [Jeff Trawick] + + *) configure.in: Play nice with libtool-1.5. [Wilfredo Sanchez] + + *) If mod_mime_magic does not know the content-type, do not attempt to + guess. PR 16908. [Andrew Gapon ] + + *) ssl session caching(shmht) : Fix a SEGV problem with SHMHT session + caching. PR 17864. + [Andreas Leimbacher , Madhusudan Mathihalli] + + *) Add a delete flag to htpasswd. + [Thom May] + + *) Fix mod_rewrite's handling of absolute URIs. The escaping routines + now work scheme dependent and the query string will only be + appended if supported by the particular scheme. [André Malo] + + *) Add another check for already compressed content in mod_deflate. + PR 19913. [Tsuyoshi SASAMOTO ] + + *) Fixes for VPATH builds; copying special.mk and any future .mk files + from the source tree as well as the build tree (now creates a usable + configuration for apxs), and eliminated redundant -I'nclude paths. + [William Rowe] + + *) Code fixes, constness corrections and ssl_toolkit_compat.h updates + for SSLC and OpenSSL toolkit compatibility. Still work remains to + be done to cripple features based on the limitations of RSA's binary + distribution of their SSL-C toolkit. + [William Rowe, Madhusudan Mathihalli, Jeff Trawick] + + *) Linux 2.4+: If Apache is started as root and you code + CoreDumpDirectory, coredumps are enabled via the prctl() syscall. + [Greg Ames] + + *) ap_get_mime_headers_core: allocate space for the trailing null + when folding is in effect. + PR 18170 [Peter Mayne ] + + *) Fix --enable-mods-shared=most and other variants. [Aaron Bannert] + + *) mod_log_config: Add the ability to log the id of the thread + processing the request via new %P formats. [Jeff Trawick] + + *) Use appropriate language codes for Czech (cs) and Traditional Chinese + (zh-tw) in default config files. PR 9427. [André Malo] + + *) mod_auth_ldap: Use generic whitespace character class when parsing + "require" directives, instead of literal spaces only. PR 17135. + [André Malo] + + *) Hook mod_rewrite's type checker before mod_mime's one. That way the + RewriteRule [T=...] Flag should work as expected now. PR 19626. + [André Malo] + + *) htpasswd: Check the processed file on validity. If a line is not empty + and not a comment, it must contain at least one colon. Otherwise exit + with error code 7. [Kris Verbeeck , Thom May] + + *) Fix a problem that caused httpd to be linked with incorrect flags + on some platforms when mod_so was enabled by default, breaking + DSOs on AIX. PR 19012 [Jeff Trawick] + + *) By default, use the same CC and CPP with which APR was built. + The user can override with CC and CPP environment variables. + [Jeff Trawick] + + *) Fix ap_construct_url() so that it surrounds IPv6 literal address + strings with []. This fixes certain types of redirection. + PR 19207. [Jeff Trawick] + + *) forward port of buffer overflow fixes for htdigest. [Thom May] + + *) Added AllowEncodedSlashes directive to permit control of whether + the server will accept encoded slashes ('%2f') in the URI path. + Default condition is off (the historical behaviour). This permits + environments in which the path-info needs to contain encoded + slashes. PR 543, 2389, 3581, 3589, 5687, 7066, 7865, 14639. [Ken Coar] + + *) When using Redirect in directory context, append requested query + string if there's no one supplied by configuration. PR 10961. + [André Malo] + + *) Unescape the supplied wildcard pattern in mod_autoindex. Otherwise + the pattern will not always match as desired. PR 12596. + [André Malo] + + *) mod_autoindex now emits and accepts modern query string parameter + delimiters (;). Thus column headers no longer contain unescaped + ampersands. PR 10880 [André Malo] + + *) Enable ap_sock_disable_nagle for Windows. This along with the + addition of APR_TCP_NODELAY_INHERITED to apr.hw will cause Nagle + to be disabled for Windows. [Allan Edwards] + + *) Correct a mis-correlation between mpm_common.c and mpm_common.h; + This patch reverts us to pre-2.0.46 behavior, using the + ap_sock_disable_nagle noop macro, because ap_sock_disable_nagle + was never compiled on Win32. [Allan Edwards, William Rowe] + + *) Fix a build problem with passing unsupported --enable-layout + args to apr and apr-util. This broke binbuild.sh as well as + user-specified layout parameters. PR 18649 [Justin Erenkrantz, + Jeff Trawick] + + *) If a Date response header was already set in the headers array, + this value was ignored in favour of the current time. This meant + that Date headers on proxied requests where rewritten when they + should not have been. PR: 14376 [Graham Leggett] + + *) Add code to buildconf that produces an httpd.spec file from + httpd.spec.in, using build/get-version.sh from APR. + [Graham Leggett] + + *) Fixed a segfault when multiple ProxyBlock directives were used. + PR: 19023 [Sami Tikka ] + + *) SECURITY: CVE-2003-0134 (cve.mitre.org) + OS2: Fix a Denial of Service vulnerability identified and + reported by Robert Howard that where device + names faulted the running OS2 worker process. The fix is + actually in APR 0.9.4. [Brian Havard] + + *) SECURITY: CVE-2003-0083 (cve.mitre.org) + Forward port: Escape special characters (especially control + characters) in mod_log_config to make a clear distinction between + client-supplied strings (with special characters) and server-side + strings. This was already introduced in version 1.3.25. + [André Malo] + + *) mod_deflate: Check also err_headers_out for an already set + Content-Encoding: gzip header. This prevents gzip compressed content + from a CGI script from being compressed once more. PR 17797. + [André Malo] + +Changes with Apache 2.0.45 + + *) Fix possible segfaults under obscure error conditions within the + cgid daemon. [Jeff Trawick, William Rowe] + + *) SECURITY: CVE-2003-0132 (cve.mitre.org) + Close a Denial of Service vulnerability identified by David + Endler on all platforms. An unlimited + stream of newlines were acceptable between requests where each + would allocate an 80 byte buffer, leading very quickly to + memory exahustion. [Brian Pane] + + *) Added an rpm build script. + [Graham Leggett, Joe Orton ] + + *) Simpler, faster code path for request header scanning [Brian Pane] + + *) SECURITY: Eliminated leaks of several file descriptors to child + processes, such as CGI scripts. This fix depends on the APR library + release 0.9.2 or later (0.9.3 was distributed with the httpd + source tarball for Apache 2.0.45.) PR 17206 + [Christian Kratzer , Bjoern A. Zeeb ] + + *) Fix path handling of mod_rewrite, especially on non-unix systems. + There was some confusion between local paths and URL paths. + PR 12902. [André Malo] + + *) Prevent endless loops of internal redirects in mod_rewrite by + aborting after exceeding a limit of internal redirects. The + limit defaults to 10 and can be changed using the RewriteOptions + directive. PR 17462. [André Malo] + + *) Win32: Avoid busy wait (consuming all the CPU idle cycles) when + all worker threads are busy. + [Igor Nazarenko ] + + *) Keep the subrequest filter in place when a subrequest is + redirected. PR 15423. [Jeff Trawick] + + *) you can now specify the compression level for mod_deflate. + [Ian Holsman, Stephen Pierzchala , + Michael Schroepl ] + + *) mod_deflate: Extend the DeflateFilterNote directive to + allow accurate logging of the filter's in- and outstream. + [André Malo] + + *) Allow SSLMutex to select/use the full range of APR locking + mechanisms available to it. Also, fix the bug that SSLMutex uses + APR_LOCK_DEFAULT no matter what. PR 8122 [Jim Jagielski, + Martin Kutschker ] + + *) Restore the ability of htdigest.exe to create files that contain + more than one user. PR 12910. [André Malo] + + *) Improve binary compatibility of the core between debug (aka + maintainer-mode) and a non-debug compile. + [Sander Striker] + + *) mod_usertrack: don't set the cookie in subrequests. This works + around the problem that cookies were set twice during fast internal + redirects. PR 13211. [André Malo] + + *) mod_autoindex no longer forgets output format and enabled version + sort in linked column headers. [André Malo] + + *) Use .sv instead of .se as extension for Swedish documents in the + default configuration. PR 12877. [André Malo] + + *) Updated mod_ldap and mod_auth_ldap to support the Novell LDAP SDK SSL + and standardized the LDAP SSL support across the various LDAP SDKs. + Isolated the SSL functionality to mod_ldap rather than speading it + across mod_auth_ldap and mod_ldap. Also added LDAPTrustedCA + and LDAPTrustedCAType directives to mod_ldap to allow for a more + common method of specifying the SSL certificate. + [Dave Ward, Brad Nicholes] + + *) Fixed mod_ssl's SSLCertificateChain initialization to no longer + skip the first cert of the chain by default. This misbehavior + was introduced in 2.0.34. PR 14560 [Madhusudan Mathihalli] + + *) mod_cgi, mod_cgid, mod_ext_filter: Log errors when scripts cannot + be started on Unix because of such problems as bad permissions, + bad shebang line, etc. [Jeff Trawick] + + *) Fix 64-bit problem in mod_ssl input logic. + [Madhusudan Mathihalli ] + + *) Fix potential memory leaks in mod_deflate on malformed data. PR 16046. + [Justin Erenkrantz] + + *) Rewrite ap_xml_parse_input to use bucket brigades. PR 16134. + [Justin Erenkrantz] + + *) Fix segfault which occurred when a section in an included + configuration file was not closed. PR 17093. [André Malo] + + *) Enhance the behavior of mod_isapi's WriteClient() callback to + provide better emulation for isapi modules that presume that the + first WriteClient() call may send status and headers. An example + of WriteClient() abuse is the foxisapi module, which relies on + that assumpion and now works. [William Rowe, Milan Kosina] + + *) Check the return value of ap_run_pre_connection(). So if the + pre_connection phase fails (without setting c->aborted) + ap_run_process_connection is not executed. [Stas Bekman] + + *) Fixed a problem with mod_ldap which caused it to fault when caching + was disabled. Needed to make sure that the code did not + attempt to use the cache if it didn't exist. Also fixed some memory + leaks which were due to not releasing LDAP resources on error + conditions. [Brad Nicholes] + + *) Hook mod_proxy's fixup before mod_rewrite's fixup, so that by + mod_rewrite proxied URLs will not be escaped accidentally by + mod_proxy's fixup. PR 16368 [André Malo] + + *) While processing filters on internal redirects, remember seen EOS + buckets also in the request structure of the redirect issuer(s). This + prevents filters (such as mod_deflate) from adding garbage to the + response. PR 14451. [André Malo] + + *) suexec: Be more pedantic when cleaning environment. Clean it + immediately after startup. PR 2790, 10449. + [Jeff Stewart , André Malo] + + *) Fix apxs to insert LoadModule directives only outside of sections. + PR 8712, 9012. [André Malo] + + *) Fix suexec compile error under SUNOS4, where strerror() doesn't + exist. PR 5913, 9977. + [Jonathan W Miner ] + + *) Fix If header parsing when a non-mod_dav lock token is passed to it. + PR 16452. [Justin Erenkrantz] + + *) mod_auth_digest no longer tries to guess AuthDigestDomain, if it's + not specified. Now it assumes "/" as already documented. PR 16937. + [André Malo] + + *) Try to log an error if a piped log program fails. Try to + restart a piped log program in more failure situations. Fix an + existing problem with error handling in piped_log_spawn(). Use + new APR apr_proc_create() features to prevent Apache from starting + on Unix* in most cases where a piped log program can be started, + and add log messages for the other situations. *Other platforms + already failed Apache initialization if a piped log program + couldn't be started. PR 15761 [Jeff Trawick] + + *) Fix mod_cern_meta to not create empty metafiles when the + metafile searched for does not exist. PR 12353 + [Owen Rees ] + + *) Introduce debugging symbols for Win32 release builds, both .pdb + and .dbg files (older debuggers and Dr. Watson-type utilities + on WinNT or Win9x don't support the newer .pdb flavor.) + [Allen Edwards, William Rowe] + + *) Fix bug where 'Satisfy Any' without an AuthType lost all MIME + information (and more). Related to PR 9076. [André Malo] + + *) mod_file_cache: fix segfault serving mmaped cached files. + [Bill Stoddard] + + *) mod_file_cache: fixed a segfault when multiple MMapFile directives + were used. PR 16313. [Cliff Woolley] + + *) Fix a nasty segfault in mmap_bucket_setaside() caused by passing + an incompatible pointer type to mmap_bucket_destroy(void*). + [Gerard Eviston ] + + *) Enable the -n name parameter on NetWare to allow the + administrator to rename the Apache console screen + [Brad Nicholes] + + *) Fixed piped access logs on Win32 by disabling OTHER_CHILD + support by default in APR. More development is required + to deploy OTHER_CHILD on Win32. [William Rowe] + + *) Use saner default config values for suexec. PR 15713. + [Thom May ] + + *) mod_rewrite: Allow "RewriteEngine Off" even if no "Options FollowSymlinks" + (or SymlinksIfOwnermatch) is set. PR 12395. [André Malo] + + *) apxs: Include any special APR ld flags when linking the DSO. + This resolves problems on AIX when building a DSO with apxs+gcc. + [Jeff Trawick] + + *) Added character set support to mod_auth_LDAP to allow it to + convert extended characters used in the user ID to UTF-8 + before authenticating against the LDAP directory. The new + directive AuthLDAPCharsetConfig is used to specify the config + file that contains the character set conversion table. + [Brad Nicholes] + + *) Don't remove the Content-Length from responses in mod_proxy + PR: 8677 [Brian Pane] + + *) Ensure LDAP version is set to v3 on every bind. PR 14235. + [Sergey A. Lipnevich ] + + *) Fix mod_ldap to open an existing shared memory file should one + already exist. PR 12757. [Scooter Morris , + Graham Leggett] + + *) Fix the ulimit command used by apachectl on Tru64. PR 13609. + [Joseph Senulis , Jeff Trawick] + + *) Change the ulimit command used by apachectl on AIX so that it + works in all locales. [Jeff Trawick] + + *) mod_ext_filter: Fix a problem building argument lists which + occasionally caused exec to fail. PR 15491. [Jeff Trawick] + +Changes with Apache 2.0.44 + + *) mod_autoindex: Bring forward the IndexOptions IgnoreCase option + from Apache 1.3. PR 14276 + [David Shane Holden , William Rowe] + + *) mod_mime: Workaround to prevent a segfault if r->filename=NULL + [Brian Pane] + + *) Reorder the definitions for mod_ldap and mod_auth_ldap within + config.m4 to make sure the parent mod_ldap is defined first. + This ensures that mod_ldap comes before mod_auth_ldap in the + httpd.conf file, which is necessary for mod_auth_ldap to load. + PR 14256 [Graham Leggett] + + *) Fix the building of cgi command lines when the query string + contains '='. PR 13914 [Ville Skyttä , + Jeff Trawick] + + *) Rename CacheMaxStreamingBuffer to MCacheMaxStreamingBuffer. Move + implementation of MCacheMaxStreamingBuffer from mod_cache to + mod_mem_cache. MCacheMaxStreamingBuffer now defaults to the + lesser of 100,000 bytes or MCacheMaxCacheObjectSize. This should + eliminate the need for explicitly coding MCacheMaxStreamingBuffer + in most configurations. [Bill Stoddard] + + *) mod_cache: Fix PR 15113, a core dump in cache_in_filter when + a redirect occurs. The code was passing a format string and + integer to apr_pstrcat. Changed to apr_psprintf. + [Paul J. Reder] + + *) Replace APU_HAS_LDAPSSL_CLIENT_INIT with APU_HAS_LDAP_NETSCAPE_SSL + as set by apr-util in util_ldap.c. This should allow mod_ldap + to work with the Netscape/Mozilla LDAP library. [Øyvin Sømme + , Graham Leggett] + + *) Fix critical bug in new --enable-v4-mapped configure option + implementation which broke IPv4 listening sockets on some + systems. [hiroyuki hanai ] + + *) mod_setenvif: Fix BrowserMatchNoCase support for non-regex + patterns [André Malo ] + + *) Add version string to provider API. [Justin Erenkrantz] + + *) build: './configure && make' now works without an in-tree + apr and apr-util. [Wilfredo Sanchez] + + *) mod_negotiation: Set the appropriate mime response headers + (Content-Type, charset, Content-Language and Content-Encoding) + for negotated type-map "Body:" responses (such as the error + pages.) [André Malo ] + + *) mod_log_config: Allow '%%' escaping in CustomLog format + strings to insert a literal, single '%'. + [André Malo ] + + *) mod_autoindex: AddDescription directives for directories + now work as in Apache 1.3, where no trailing '/' is + specified on the directory name. Previously, the trailing + '/' *had* to be specified, which was incompatible with + Apache 1.3. PR 7990 [Jeff Trawick] + + *) Fix for PR 14556. The expiry calculations in mod_cache were + trying to perform "now + ((date - lastmod) * factor)" where + date == lastmod resulting in "now + 0". The code now follows + the else path (using the default expiration) if date is + equal to lastmod. [Sergey , Paul J. Reder] + + *) Use AP_DECLARE in the debug versions of ap_strXXX in case the + default calling convention is not the same as the one used by + AP_DECLARE. [Juan Rivera ] + + *) mod_cache: Don't cache response header fields designated + as hop-by-hop headers in HTTP/1.1 (RFC 2616 Section 13.5.1). + [Estrade Matthieu , Brian Pane] + + *) mod_cgid: Handle environment variables containing newlines. + PR 14550 [Piotr Czejkowski , Jeff + Trawick] + + *) Move mod_ext_filter out of experimental and into filters. + [Jeff Trawick] + + *) Fixed a memory leak in mod_deflate with dynamic content. + PR 14321 [Ken Franken ] + + *) Add --[enable|disable]-v4-mapped configure option to control + whether or not Apache expects to handle IPv4 connections + on IPv6 listening sockets. Either setting will work on + systems with the IPV6_V6ONLY socket option. --enable-v4-mapped + must be used on systems that always allow IPv4 connections on + IPv6 listening sockets. PR 14037 (Bugzilla), PR 7492 (Gnats) + [Jeff Trawick] + + *) This fixes a problem where the underlying cache code + indicated that there was one more element on the cache + than there actually was. This happened since element 0 + exists but is not used. This code allocates the correct + number of useable elements and reports the number of + actually used elements. The previous code only allowed + MCacheMaxObjectCount-1 objects to be stored in the + cache. [Paul J. Reder] + + *) mod_setenvif: Add SERVER_ADDR special keyword to allow + envariable setting according to the server IP address + which received the request. [Ken Coar] + + *) mod_cgid: Terminate CGI scripts when the client connection + drops. PR 8388 [Jeff Trawick] + + *) Rearrange OpenSSL engine initialization to support RAND + redirection on crypto accelerator. + [Frederic DONNAT ] + + *) Always emit Vary header if mod_deflate is involved in the + request. [André Malo ] + + *) mod_isapi: Stop unsetting the 'empty' query string result with + a NULL argument in ecb->lpszQueryString, eliminating segfaults + for some ISAPI modules. PR 14399 + [Detlev Vendt ] + + *) mod_isapi: Fix an issue where the HSE_REQ_DONE_WITH_SESSION + notification is received before the HttpExtensionProc() returns + HSE_STATUS_PENDING. This only affected isapi .dll's configured + with the ISAPIFakeAsync on directive. PR 11918 + [John DeSetto , William Rowe] + + *) mod_isapi: Fix the issue where all results from mod_isapi would + run through the core die handler resulting in invalid responses + or access log entries. PR 10216 [William Rowe] + + *) Improves the user friendliness of the CacheRoot processing + over my last pass. This version avoids the pool allocations + but doesn't avoid all of the runtime checks. It no longer + terminates during post-config processing. An error is logged + once per worker, indicating that the CacheRoot needs to be set. + [Paul J. Reder] + + *) Fix a bug where we keep files open until the end of a + keepalive connection, which can result in: + (24)Too many open files: file permissions deny server access + especially on threaded servers. [Greg Ames, Jeff Trawick] + + *) Fix a bug in which mod_proxy sent an invalid Content-Length + when a proxied URL was invoked as a server-side include within + a page generated in response to a form POST. [Brian Pane] + + *) Added code to process min and max file size directives and to + init the expirychk flag in mod_disk_cache. Added a clarifying + comment to cache_util. [Paul J. Reder] + + *) The value emitted by ServerSignature now mimics the Server HTTP + header as controlled by ServerTokens. [Francis Daly ] + + *) Gracefully handly retry situations in the SSL input filter, + by following the SSL libraries' retry semantics. + [William Rowe] + + *) Terminate CGI scripts when the client connection drops. This + fix only applies to some normal paths in mod_cgi. mod_cgid + is still busted. PR 8388 [Jeff Trawick] + + *) Fix a bug where 416 "Range not satisfiable" was being + returned for content that should have been redirected. + [Greg Ames] + + *) Fix memory leak in mod_ssl from internal SSL library allocations + within SSL_get_peer_certificate and X509_get_pubkey. + [Zvi Har'El + Madhusudan Mathihalli ]. + + *) mod_ssl uses free() inappropriately in several places, to free + memory which has been previously allocated inside OpenSSL. + Such memory should be freed with OPENSSL_free(), not with free(). + [Nadav Har'El , + Madhusudan Mathihalli ]. + + *) Emit a message to the error log when we return 404 because + the URI contained '%2f'. (This was previously nastily silent + and difficult to debug.) [Ken Coar] + + *) Fix streaming output from an nph- CGI script. CGI:IRC now + works. PR 8482 [Jeff Trawick] + + *) More accurate logging of bytes sent in mod_logio when + the client terminates the connection before the response + is completely sent [Bojan Smojver ] + + *) Fix some problems in the perchild MPM. + [Jonas Eriksson ] + + *) Change the CacheRoot processing to check for a required + value at config time. This saves a lot of wasted processing + if the mod_disk_cache module is loaded but no CacheRoot + was provided. This fix also adds code to log an error + and avoid useless pallocs and procesing when the computed + cache file name cannot be opened. This also updates the + docs accordingly. [Paul J. Reder] + + *) Introduce the EnableSendfile directive, allowing users of NFS + shares to disable sendfile mechanics when they either fail + outright or provide intermitantly corrupted data. PR + [William Rowe] + + *) Resolve the error "An operation was attempted on something + that is not a socket. : winnt_accept: AcceptEx failed. + Attempting to recover." for users of various firewall and + anti-virus software on Windows. PR 8325 [William Rowe] + + *) Add the ProxyBadHeader directive, which gives the admin some + control on how mod_proxy should handle bogus HTTP headers from + proxied servers. This allows 2.0 to "emulate" 1.3's behavior if + desired. [Jim Jagielski] + + *) Change the LDAP modules to export their symbols correctly + during a Windows build. Add dsp files for Windows. Update + README.ldap file for Windows build instructions. + [Andre Schild ] + + *) Performance improvements for the code that generates HTTP + response headers [Brian Pane] + + *) Add -S as a synonym for -t -DDUMP_VHOSTS. + [Thom May ] + + *) Fix a bug with dbm rewrite maps which caused the wrong value to + be used when the key was not found in the dbm. PR 13204 + [Jeff Trawick] + + *) Fix a problem with streaming script output and mod_cgid. + [Jeff Trawick] + + *) Add ap_register_provider/ap_lookup_provider API. + [John K. Sterling , Justin Erenkrantz] + +Changes with Apache 2.0.43 + + *) SECURITY: CVE-2002-0840 (cve.mitre.org) + HTML-escape the address produced by ap_server_signature() against + this cross-site scripting vulnerability exposed by the directive + 'UseCanonicalName Off'. Also HTML-escape the SERVER_NAME + environment variable for CGI and SSI requests. It's safe to + escape as only the '<', '>', and '&' characters are affected, + which won't appear in a valid hostname. Reported by Matthew + Murphy . [Brian Pane] + + *) Fix a core dump in mod_cache when it attemtped to store uncopyable + buckets. This happened, for instance, when a file to be cached + contained SSI tags to execute a CGI script (passed as a pipe + bucket). [Paul J. Reder] + + *) Ensure that output already available is flushed to the network + when the content-length filter realizes that no new output will + be available for a while. This helps some streaming CGIs as + well as some other dynamically-generated content. [Jeff Trawick] + + *) Fix a mutex problem in mod_ssl session cache support which + could lead to an infinite loop. PR 12705 + [Amund Elstad , Jeff Trawick] + + *) SECURITY: CVE-2002-1156 (cve.mitre.org) + Fix the exposure of CGI source when a POST request is sent to + a location where both DAV and CGI are enabled. [Ryan Bloom] + + *) Allow the UserDir directive to accept a list of directories. + This matches what Apache 1.3 does. Also add documentation for + this feature. [Jay Ball ] + + *) New Module: mod_logio. adds the ability to log bytes sent and + received. [Bojan Smojver ] + + *) SuExec needs to use the same default directory as the rest of + server, namely /usr/local/apache2. + [SangBeom han ] + + *) Get mod_auth_ldap to retry connections on LDAP_SERVER_DOWN. + [Thomas Bennett , Graham Leggett] + + *) Make sure the contents of the WWW-Authenticate header is + passed on a 4xx error by proxy. Previously all headers + were dropped, resulting in the browser being unable to + authenticate. [Dr Richard Reiner , + Richard Danielli , Graham Wiseman + , David Henderson + ] + + *) Make mod_cache's CacheMaxStreamingBuffer directive work + properly for virtual hosts that override server-wide mod_cache + setttings. [Matthieu Estrade ] + + *) Add -p option to apxs to allow programs to be compiled with apxs. + [Justin Erenkrantz] + +Changes with Apache 2.0.42 + + *) SECURITY: CVE-2002-1593 (cve.mitre.org) [CERT VU#406121] + mod_dav: Check for versioning hooks before using them. + [Greg Stein] + +Changes with Apache 2.0.41 + + *) The protocol version (eg: HTTP/1.1) in the request line parsing + is now case insensitive. [Jim Jagielski] + + *) Allow AddOutputFilterByType to add multiple filters per directive. + [Justin Erenkrantz] + + *) Remove warnings with Sun's Forte compiler. [Justin Erenkrantz] + + *) Fixed mod_disk_cache's generation of 304s + [Kris Verbeeck ] + + *) Add support for using fnmatch patterns in the final path + segment of an Include statement (eg.. include /foo/bar/*.conf). + and remove the noise on stderr during config dir processing. + [Joe Orton ] + + *) mod_cache: cache_storage.c. Add the hostname and any request + args to the key generated for caching. This provides a unique + key for each virtual host and for each request with unique + args. [Paul J. Reder, args code provided by Kris Verbeeck] + + *) mod_cache: Do not cache responses to GET requests with query + URLs if the origin server does not explicitly provide an + Expires header on the response (RFC 2616 Section 13.9) + [Kris Verbeeck ] + + *) Fix memory leak in core_output_filter. [Justin Erenkrantz] + + *) Update OpenSSL detection to work on Darwin. + [Sander Temme ] + + *) Update the xslt and css to give the documentation a more + modern style. + [André Malo , Gernot Winkler ] + + *) Fix some bucket memory leaks in the chunking code + [Joe Schaefer ] + + *) Add ModMimeUsePathInfo directive. [Justin Erenkrantz] + + *) mod_cache: added support for caching streamed responses (proxy, + CGI, etc) with optional CacheMaxStreamingBuffer setting [Brian Pane] + + *) Add image/x-icon to httpd.conf PR 10993. + [Ian Holsman, Peter Bieringer ] + + *) Fix FileETags none operation. PR 12207. + [Justin Erenkrantz, Andrew Ho ] + + *) Restored the experimental leader/followers MPM to working + condition and converted its thread synchronization from + mutexes to atomic CAS. [Brian Pane] + + *) Fix Logic on non-html file removal in mod_deflate + [Kris Verbeeck ] + + *) Fix "ab -g"'s truncated year: the last digit was cut off. + [Leon Brocard ] + + *) mod_rewrite can now sets cookies in err_headers, uses the correct + expiry date, and can now set the path as well + PR 12132,12181,12172. + [Ian Holsman / Rob Cromwell ] + + *) The content-length filter no longer tries to buffer up + the entire output of a long-running request before sending + anything to the client. [Brian Pane] + + *) Win32: Lower the default stack size from 1MB to 256K. This will + allow around 8000 threads to be started per child process. + 'EDITBIN /STACK:size apache.exe' can be used to change this + value directly in the apache.exe executable. + [Bill Stoddard] + + *) Win32: Implement ThreadLimit directive in the Windows MPM. + [Bill Stoddard] + + *) Remove CacheOn config directive since it is set but never checked. + No sense wasting cycles on unused code. Besides, the only truly + bug free code is deleted code. :) [Paul J. Reder] + + *) BufferLogs are now run-time enabled, and the log_config now has 2 new + callbacks to allow a 3rd party module to actually do the writing of the + log file [Ian Holsman] + + *) Correct ISAPIReadAheadBuffer to default to 49152, per mod_isapi docs. + [André Malo, Astrid Keßler ] + + *) Fix Segfault in mod_cache. [Kris Verbeeck ] + + *) Fix a null pointer dereference in the merge_env_dir_configs + function of the mod_env module. PR 11791 + [Paul J. Reder] + + *) New option to ServerTokens 'maj[or]'. Only show the major version + Also Surfaced this directive in the standard config (default FULL) + [Ian Holsman] + + *) Change mod_rewrite to use apr-util's dbm support for dbm rewrite + maps. The dbm type (e.g., ndbm, gdbm) can be specified on the + RewriteMap directive. PR 10644 [Jeff Trawick] + + *) Fixed mod_rewrite's RewriteMap prg: support so that request/response + pairs will no longer get out of sync with each other. PR 9534 + [Cliff Woolley] + + *) Fixes required to get quoted and escaped command args working in + mod_ext_filter. PR 11793 [Paul J. Reder] + + *) mod-proxy: handle proxied responses with no status lines + [JD Silvester , Brett Huttley ] + + *) Fix bug where environment or command line arguments containing + non-ASCII-7 characters would cause the Win32 child process creation + to fail. PR 11854 [William Rowe] + + *) Bug #11213.. make module loading error messages more informative + [Ian Darwin ] + + *) thread safety & proxy-ftp [Alexey Panchenko , Ian Holsman] + + *) mod_disk_cache works much better. This module should still + be considered experimental. [Eric Prud'hommeaux] + + *) Performance improvement for keepalive requests: when setting + aside a small file for potential concatenation with the next + response on the connection, set aside the file descriptor rather + than copying the file into the heap. [Brian Pane] + + *) Modified version check on openssl so that it finds the executable + first and then performs a check of the version, only warning the + user if they chose, or we selected, an old version of OpenSSL. + This change also allows the code to work for non-openssl libraries + selected via the --with-ssl=dir option, which can override the + automated library check in any case. [Roy Fielding] + +Changes with Apache 2.0.40 + + *) SECURITY: CVE-2002-0661 (cve.mitre.org) + Close a very significant security hole that + applies only to the Win32, OS2 and Netware platforms. Unix was not + affected, Cygwin may be affected. Certain URIs will bypass security + and allow users to invoke or access any file depending on the system + configuration. Without upgrading, a single .conf change will close + the vulnerability. Add the following directive in the global server + httpd.conf context before any other Alias or Redirect directives; + RedirectMatch 400 "\\\.\." + Reported by Auriemma Luigi . + [Brad Nicholes] + + *) SECURITY: CVE-2002-0654 (cve.mitre.org) + Close a path-revealing exposure in multiview type + map negotiation (such as the default error documents) where the + module would report the full path of the typemapped .var file when + multiple documents or no documents could be served based on the mime + negotiation. Reported by Auriemma Luigi . + [William Rowe] + + *) SECURITY: CVE-2002-0654 (cve.mitre.org) + Close a path-revealing exposure in cgi/cgid when we + fail to invoke a script. The modules would report "couldn't create + child process /path-to-script/script.pl" revealing the full path + of the script. Reported by Jim Race . + [Bill Stoddard] + + *) Set aside the apr-iconv and apr_xlate() features for the Win32 + build of 2.0.40 so development can be completed. A patch, from + + will be available for those that wish to work with apr-iconv. + [William Rowe] + + *) Fix proxy so that it is possible to access ftp: URLs via a proxy + chain. [Peter Van Biesen ] + + *) mod-deflate now checks to make sure that 'gzip-only-text/html' is + set to 1, so we can exclude things from the general case with + browsermatch. [Ian Holsman, Andre Schild ] + + *) Accept multiple leading /'s for requests within the DocumentRoot. + PR 10946 [William Rowe, David Shane Holden ] + + *) Solved the reports of .pdf byterange failures on Win32 alone. + APR's sendfile for the win32 platform collapses header and trailer + buffers into a single buffer. However, we destroyed the pointers + to the header buffer if a trailer buffer was present. PR 10781 + [William Rowe] + + *) mod_ext_filter: Add the ability to enable or disable a filter via + an environment variable. Add the ability to register a filter of + type other than AP_FTYPE_RESOURCE. [Jeff Trawick] + + *) Restore the ability to specify host names on Listen directives. + PR 11030. [Jeff Trawick, David Shane Holden ] + + *) When deciding on the default address family for listening sockets, + make sure we can actually bind to an AF_INET6 socket before + deciding that we should default to AF_INET6. This fixes a startup + problem on certain levels of OpenUNIX. PR 10235. [Jeff Trawick] + + *) Replace usage of atol() to parse strings when we might want a + larger-than-long value with apr_atoll(), which returns long long. + This allows HTTPD to deal with larger files correctly. + [Shantonu Sen ] + + *) mod_ext_filter: Ignore any content-type parameters when checking if + the response should be filtered. Previously, "intype=text/html" + wouldn't match something like "text/html;charset=8859_1". + [Jeff Trawick] + + *) mod_ext_filter: Set up environment variables for external programs. + [Craig Sebenik ] + + *) Modified the HTTP_IN filter to immediately append the EOS (end of + stream) bucket for C-L POST bodies, saving a roundtrip and allowing + the caller to determine that no content remains without prefetching + additional POST body. [William Rowe] + + *) Get proxy ftp to work over IPv6. [Shoichi Sakane ] + + *) Look for OpenSSL libraries in /usr/lib64. [Peter Poeml ] + + *) Update SuSE layout. [Peter Poeml ] + + *) Changes to the internationalized error documents: + Comment them out in the default config file to make the default + install as simple as possible; Correct the english 500 error to + be more understandable; Add a Swedish translation. + [Thomas Sjogren , + Erik Abele , Rich Bowen, Joshua Slive] + + *) Increase the limit on file descriptors per process in apachectl. + [Brian Pane] + + *) Fix a dependency error when building ApacheMonitor, so that Win32 + and MSVC now trust that the project is current (when it is). + [James Cox ] + + *) mod_ext_filter: don't segfault if content-type is not set. PR 10617. + [Arthur P. Smith , Jeff Trawick] + + *) APR-Util Renames pending have been completed [Thom May] + + *) Performance improvements for the code that reads request + headers (ap_rgetline_core() and related functions) [Brian Pane] + + *) Add a new directive: MaxMemFree. MaxMemFree makes it possible + to configure the maximum amount of memory the allocators will + hold on to for reuse. Anything over the MaxMemFree threshold + will be free()d. This directive is useful when uncommon large + peaks occur in memory usage. It should _not_ be used to mask + defective modules' memory use. [Sander Striker] + + *) Fixed the Content-Length filter so that HTTP/1.0 requests to CGI + scripts would not result in a truncated response. + [Ryan Bloom, Justin Erenkrantz, Cliff Woolley] + + *) Add a filter_init parameter to the filter registration functions + so that a filter can execute arbitrary code before the handlers + are invoked. This resolves a problem where mod_include requests + would incorrectly return a 304. [Justin Erenkrantz] + + *) Fix a long-standing bug in 2.0, CGI scripts were being called + with relative paths instead of absolute paths. Apache 1.3 used + absolute paths for everything except for SuExec, this brings back + that standard. [Ryan Bloom] + + *) Fix infinite loop due to two HTTP_IN filters being present for + internally redirected requests. PR 10146. [Justin Erenkrantz] + + *) Switch conn_rec->keepalive to an enumeration rather than a bitfield. + [Justin Erenkrantz] + + *) Fix mod_ext_filter to look in the main server for filter definitions + when running in a vhost if the filter definition is not found in + the vhost. PR 10147 [Jeff Trawick] + + *) Support WinNT CGI invocation through ScriptInterpreterSource + 'registry' for script interpreter paths and names with non-ascii + characters in the executable filepath. [William Rowe] + + *) Support the -w flag on to keep the Win32 console open on error. + [William Rowe] + + *) Normalize the hostname value in the request_rec to all-lowercase + [Perry Harrington ] + + *) Fix WinNT cgi 500 errors when QUERY_ARGS or other strings include + extended characters (non US-ASCII) in non-utf8 format. This brings + Win32 back into CGI/1.1 compliance, and leaves charset decoding up + to the cgi application itself. [William Rowe] + + *) Major overhaul of mod_dav, mod_dav_fs and the experimental/cache + modules to bring them up to the current apr/apr-util APIs. + [William Rowe] + + *) Fix segfault in mod_mem_cache most frequently observed when + serving the same file to multiple clients on an MP machine. + [Bill Stoddard] + + *) mod_rewrite can now set cookies (RewriteRule (.*) - [CO=name:$1:.domain]) + [Brian Degenhardt , Ian Holsman] + + *) Fix perchild to work with apachectl by adding -k support to perchild. + PR 10074 [Jeff Trawick] + + *) Fix a silly htpasswd.c logic error that incorrectly reported that + both -c and -n had been used. PR 9989 [Cliff Woolley] + + *) Fixed a mod_include error case in which no HTTP response was sent + to the client if an shtml document contained an unterminated SSI + directive [Brian Pane] + + *) Improve ap_get_client_block implementation by using APR-util brigade + helper functions and relying on current filter assumptions. + [Justin Erenkrantz] + +Changes with Apache 2.0.39 + + *) Fixed a build problem in htpasswd.c on Win32. + [Guenter Knauf , Cliff Woolley] + +Changes with Apache 2.0.38 + + *) Rewrite htpasswd to use APR. The removes the annoying warning about + tmpnam being unsafe. [Ryan Bloom] + + *) We must set the MIME-type for .shtml files to text/html if we want them + to be parsed for SSI tags. Add the config for that to the default + config file so that it is easier to enable .shtml parsing. + [Dave Dyer ] + + *) Fixed a problem with 'make install' on ReliantUnix. + [Jean-frederic Clere ] + + *) Make the default_handler catch all requests that aren't served by + another handler. This also gets us to return a 404 if a directory + is requested, there is no DirectoryIndex, and mod_autoindex isn't + loaded. [Justin Erenkrantz] + + *) Fixed the handling of nested if-statements in shtml files. + PR 9866 [Brian Pane] + + *) Allow 'make install DESTDIR=/path'. This allows packagers to install + into a directory different from the one that was configured. This + also mirrors the root= feature from 1.3. We cannot use prefix=, + because both APR and APR-util resolve their installation paths at + configuration time. This means that there is no variable prefix + to replace. [Andreas Hasenack ] + + *) AIX 4.3.2 and above: Define SINGLE_LISTEN_UNSERIALIZED_ACCEPT. + These levels of AIX don't have a thundering herd problem with + accept(). [Jeff Trawick] + + *) prefork MPM: Ignore mutex errors during graceful restart. For + certain types of mutexes (particularly SysV semaphores), we + should expect to occasionally fail to obtain or release the + mutex during restart processing. [Jeff Trawick] + + *) Fix install-bindist.sh so that it finds any perl instead of just + early perl 5.x versions. This is consistent with a build/install + from source, and it allows the perl scripts installed by a bindist + to work on systems with perl 5.6. [Jeff Trawick] + + *) Fix apxs so that the makefile created by "apxs -g" works on AIX and + Tru64 (and probably some other platforms). [Jeff Trawick] + + *) Allow CGI scripts to return their Content-Length. This also fixes a + hang on HEAD requests seen on certain platforms (such as FreeBSD). + [Justin Erenkrantz] + + *) Added log rotation based on file size to the RotateLog support + utility. [Brad Nicholes] + + *) Fix some casting in mod_rewrite which broke random maps. + PR 9770 [Allan Edwards, Greg Ames, Jeff Trawick] + +Changes with Apache 2.0.37 + + *) allow POST method over SSL when per-directory client cert + authentication is used with 'SSLOptions +OptRenegotiate' enabled + and a client cert was found in the ssl session cache. + + *) 'SSLOptions +OptRengotiate' will use client cert in from the ssl + session cache when there is no cert chain in the cache. prior to + the fix this situation would result in a FORBIDDEN response and + error message "Cannot find peer certificate chain" + [Doug MacEachern] + + *) ap_finalize_sub_req_protocol() shouldn't send an EOS bucket if + one was already sent. PR 9644 [Jeff Trawick] + + *) Fix the display of the default name for the mime types config + file. PR 9729 [Matthew Brecknell ] + + *) Fix the working directory *for WinNT/2K/XP services only* to + change to the Apache directory (one level above the location + of Apache.exe, in the case that Apache.exe resides in bin/.) + Solves the case of ServerRoot /foo paths where /foo was not + on the same drive as /winnt/system32. [William Rowe] + + *) Make 2.0's "AcceptMutex" startup message now "completely" + match how 1.3 does it. [Jim Jagielski] + + *) Implement a fixed size memory cache using a priority queue + [Ian Holsman] + + *) Fix apxs to allow "apxs -q installbuilddir" and to allow + querying certain other variables from config_vars.mk. PR 9316 + [Jeff Trawick] + + *) Added the "detached" attribute to the cgi_exec_info_t internals + so that Win32 and Netware won't create a new window or console + for each CGI invoked. PR 8387 + [Brad Nicholes, William Rowe] + + *) Consolidated the command line parameters and attributes that are + manipulated by the optional function ap_cgi_build_command() in + mod_cgi into a single structure. + [Brad Nicholes] + + *) Get rid of uninitialized value errors with "apxs -q" on certain + variables. [Stas Bekman ] + + *) Fix apxs to allow it to work when the build directory is somewhere + besides server-root/build. PR 8453 + [Jeff Trawick and a host of others] + + *) Allow ap_discard_request_body to be called multiple times in the + same request. Essentially, ap_http_filter keeps track of whether + it has sent an EOS bucket up the stack, if so, it will only ever + send an EOS bucket for this request. + [Ryan Bloom, Justin Erenkrantz, Greg Stein] + + *) Remove all special mod_ssl URIs. This also fixes the bug where + redirecting (.*) will allow an SSL protected page to be viewed + without SSL. [Ryan Bloom] + + *) Fix the binary build install script so that the build logic + created by "apxs -g" will work when the user has a binary + build. [Jeff Trawick] + + *) Allow instdso.sh to work with full paths to the shared module. + [Justin Erenkrantz] + + *) NetWare: Enabled CGI functionality and added mod_cgi as a built + in module for NetWare [Brad Nicholes] + + *) Changed cgi and piped log behavior to accept 65536 characters + on Win32 (matching Linux) before deadlocking between outputing + client stdin, slurping the output from stdout and then the stderr + stream. PR 8179 [William Rowe] + + *) Fixed Win32 wintty.exe support to assure the window title is valid. + Elimiates possible gpfault or garbage title without the -t option. + [William Rowe] + + *) Rewrite mod_cgi, mod_cgid, and mod_proxy input handling to use + brigades and input filters. [Justin Erenkrantz] + + *) Allow ap_http_filter (HTTP_IN) to return EOS when there is no request + body. [Justin Erenkrantz] + + *) NetWare: Piping log entries through RotateLogs using the + CustomLogs directive is finally supported now that we have + the pipes and spawning functionality working. + [Brad Nicholes] + + *) SECURITY: CVE-2002-0392 (cve.mitre.org) [CERT VU#944335] + Detect overflow when reading the hex bytes forming a chunk line. + [Aaron Bannert] + + *) Allow RewriteMap prg:'s to take command-line arguments. PR 8464. + [James Tait ] + + *) Correctly return 413 when an invalid chunk size is given on + input. Also modify ap_discard_request_body to not do anything + on sub-requests or when the connection will be dropped. + [Justin Erenkrantz] + + *) Fix the TIME_* SSL var lookups to be threadsafe. PR 9469. + [Cliff Woolley] + + *) Ensure that apr_brigade_write() flushes in all of the cases that + it should to avoid conditions in some modules that could cause + large amounts of data to be buffered. [Cliff Woolley] + + *) Fix problem where mod_cache/mod_disk_cache was incorrectly + stripping the content_type from cached responses. + [Bill Stoddard] + + *) apachectl passes through any httpd options. Note: apachectl + should be used in preference to httpd since it ensures that any + appropriate environment variables have been set up. + [Jeff Trawick] + + *) Fix the combination of mod_cgid, mod_setuexec, and mod_userdir. + PR 7810 [Colm MacCarthaigh ] + + *) Fix suexec execution of CGI scripts from mod_include. + PR 7791, 8291 [Colm MacCarthaigh ] + + *) Fix segfaults at startup on some platforms when mod_auth_digest, + mod_suexec, or mod_ssl were used as DSO's due to the way they + were tracking the current init phase since DSO's get completely + unloaded and reloaded between phases. PR 9413. + [Tsuyoshi Sasamoto , Brad Nicholes] + + *) Fix mod_include's handling of regular expressions in + " and directives [Brian Pane] + + *) Fix some mod_include segfaults [Cliff Woolley, Brian Pane, Brad Nicholes] + + *) Update the "RedHat" Layout to match Red Hat Linux version 7. PR BZ-7422 + [Joe Orton] + + *) add compat layer to support RSA SSLC 1.x and 2.x in mod_ssl + [Jon Travis, John Barbee, William Rowe, Ryan Bloom, Doug MacEachern] + + *) Add a new parameter to the quick_handler hook to instruct + quick handlers to optionally do a lookup rather than actually + serve content. This is the first of several changes required fix + several problems with how quick handlers work with subrequests. + [Bill Stoddard] + + *) worker MPM: Get MaxRequestsPerChild to work again. [Jeff Trawick] + + *) [APR-related] The ordering of the default accept mutex method has + been changed to better match what's done in Apache 1.3. The ordering + is now (highest to lowest): pthread -> sysvsem -> fcntl -> flock. + [Jim Jagielski] + + *) Ensure that the build/ directory is created when using VPATH. + [Justin Erenkrantz] + + *) Add some popular types to the mime magic file. PR 7730. + [Linus Walleij , Justin Erenkrantz] + + *) Remove the single-byte socket reads for CGI headers [Brian Pane] + + *) When a proxied site was being served, Apache was replacing + the original site Server header with it's own, which is not + allowed by RFC2616. Fixed. [Graham Leggett] + + *) Fix a mod_cgid problem that left daemon processes stranded + in some server restart scenarios. [Jeff Trawick] + + *) Added exp_foo and rel_foo variables to config_vars.mk for + all Apache and Autoconf path variables (like --sysconfdir, + --sbindir, etc). exp_foo is the "expanded" version, which means + that all internal variable references have been interpolated. + rel_foo is the same as $exp_foo, only relative to $prefix if they + share a common path. [Aaron Bannert] + + *) Fix some restart/terminate problems in the worker MPM. Don't + drop connections during graceful restart. [Jeff Trawick] + + *) Change the header merging behaviour in proxy, as some headers + (like Set-Cookie) cannot be unmerged due to stray commas in + dates. [Graham Leggett] + + *) Be more vocal about what AcceptMutex values we allow, to make + us closer to how 1.3 does it. [Jim Jagielski] + + *) Get nph- CGI scripts working again. PRs 8902, 8907, 9983 + [Jeff Trawick] + + *) Upgraded PCRE library to latest version 3.9 [Brian Pane] + + *) Add accessor function to set r->content_type. From now on, + ap_rset_content_type() should be used to set r->content_type. + This change is required to properly implement the + AddOutputFilterByType configuration directive. + [Bill Stoddard, Sander Striker, Ryan Bloom] + + *) Add new M_FOO symbols for the WebDAV/DeltaV methods specified by + RFC 3253. Improved the method name/number mapping functions. + [Greg Stein] + + *) remove sock_enable_linger from connection.c [Ian Holsman] + + *) Fix for virtual host processing where the requested hostname + has a '.' at the end (PR 9187) [Ryan Cruse ] + + *) mod_dav's APIs for REPORT response handling was changed so that + providers can generate the content directly into the output filter + stack, rather than buffering the response into memory. [Greg Stein] + + *) Fix a hang condition with graceful restart and prefork MPM + in the situation where MaxClients is very high but + much fewer servers are actually started at the time of the + restart. [Jeff Trawick] + + *) Small performance fixes for mod_include [Brian Pane] + + *) Performance improvement for the error logger [Brian Pane] + + *) Change configure so that Solaris 8 and above have + SINGLE_LISTEN_UNSERIALIZED_ACCEPT defined by default. + according to sun people solaris 8+ doesn't have a thundering + herd problem [Ian Holsman] + + *) Allow URIs specifying CGI scripts to include '/' at the end + (e.g., /cgi-bin/printenv/) on AIX and Solaris (and other OSs + which ignore '/' at the end of the names of non-directories). + PR 10138 [Jeff Trawick] + + *) implement SSLSessionCache shmht and shmcb based on apr_rmm and + apr_shm. [Madhusudan Mathihalli ] + + *) Fix apxs -g handling. Move config_vars.mk from the top build + directory to the build directory. PR 10163 [Jeff Trawick] + + *) Fix some mod_include problems which broke evaluation of some + expressions. PR 10108 [Jeff Trawick] + + *) Fix the calculation of request time in mod_status. [Stas Bekman] + + *) Fix the calculation of thread_num in the worker score structure. + [Stas Bekman] + + *) Use apr_atomic operations in managing the mod_mem_cache + cache_objects for SMP scalability. (see USE_ATOMICS + preprocessor directive in mod_file_cache) + [Bill Stoddard] + + *) Add filehandle caching to mod_mem_cache. (see CACHE_FD + preprocessor directive in mod_file_cache) + [Bill Stoddard] + + *) Implement prototype mod_disk_cache for use with mod_cache. + [Bill Stoddard] + + *) Add a missing manualdir entry in the Debian config.layout. + [Thom May ] + + *) Stop installing libtool for APR and tell APR where it should place + its copy of libtool (via our installbuildpath layout variable). + [Justin Erenkrantz] + + *) New directive ProxyIOBufferSize. Sets the size of the buffer used + when reading from a remote HTTP server in proxy. [Graham Leggett] + + *) Modify receive/send loop in proxy_http and proxy_ftp so that + should it be necessary, the remote server socket is closed before + transmitting the last buffer (set by ProxyIOBufferSize) to the + client. This prevents the backend server from being forced to hang + around while the last few bytes are transmitted to a slow client. + Fix the case where no error checking was performed on the final + brigade in the loop. [Graham Leggett] + + *) Scrap CacheMaxExpireMin and CacheDefaultExpireMin. Change + CacheMaxExpire and CacheDefaultExpire to use seconds rather than + hours. [Graham Leggett, Bill Stoddard] + + *) New Directive SSIUndefinedEcho. to change the '(none)' echoed + for a undefined variable. [Ian Holsman] + + *) Proxy HTTP and CONNECT: Keep trying other addresses from the DNS + when we can't get a socket in the specified address family. We may + have gotten back an IPv6 address first and yet our system is not + configured to allow IPv6 sockets. [Jeff Trawick] + + *) Be more careful about recursively removing CVS directories. Make + sure that we aren't cd'ing to their home directory first. PR: 9993 + [Aaron Bannert, James LewisMoss ] + + *) Add a missing errordir entry in the Debian config.layout. PR: 10067 + [Dirk-Jan Faber , Aaron Bannert, + Thom May ] + + *) Rename the filter ordering priorities. The recent filtering fixes + have showcased problems with their usage. Therefore, we need to + rename them to increase the clarity. (CONTENT->RESOURCE, + HTTP_HEADER->CONTENT_SET/PROTOCOL) [Justin Erenkrantz] + +Changes with Apache 2.0.33 + + *) Fix a problem in the new --enable-layout functionality where + it wouldn't allow overrides from variables like --prefix, + --bindir, etc. [Thom May ] + + *) Fix a bug in the core input filter for AP_MODE_EXHAUSTIVE. It + no longer hangs around waiting for the socket to close before + returning exhaustive data. [Aaron Bannert] + + *) rename apr_exploded_time_t to apr_time_exp_t (as per renames pending) + [Thom May ] + + *) Change mod_ssl to always do a full startup/teardown on restarts. + this allows mod_ssl to be added to a server that is already + running and makes it possible to add/change certs/keys after the + server has been started. [Doug MacEachern] + + *) Introduce PassPhraseDialog "|/path/to/pipe" mechanism to mod_ssl. + This pipe must be a bidirectional 'console' style relay, which + mod_ssl prints all prompts to the pipe's stdin, and reads the + passphrases from the pipe's stdout. [William Rowe] + + *) Fix bug where --sysconfdir and --localstatedir were being + ignored. [Thom May , Aaron Bannert] + PR 9888 + + *) Fix --enable-layout to work again. Caution: When specifying + --enable-layout, common arguments like --prefix, --exec-prefix, + etc. will be ignored and the settings from the layout will be + used instead. [Thom May , Aaron Bannert] + PR 9124, 9873, 9885 + + *) New Directive for mod_proxy: ProxyRemoteMatch. This provides + regex pattern matching for the determination of which requests + to use the remote proxy for. [Jim Jagielski] + + *) Fix CustomLog bytes-sent with HTTP 0.9. [Justin Erenkrantz] + + *) Prevent Apache from ignoring SIGHUP due to some lingering 1.3 + cruft in piped logs and rewritemap child processes. + [William Rowe] + + *) All instances of apr_lock_t have been removed and converted + to one of the following new lock APIs: apr_thread_mutex.h, + apr_proc_mutex.h, or apr_global_mutex.h. No new code should + use the apr_lock.h API, as the old API will soon be deprecated. + [Aaron Bannert] + + *) Merged in changes to mod_ssl up through 2.8.7-1.3.23. + [Ralf S. Engelschall, Cliff Woolley] + + *) mod-include: make it handle flush'es and fix the 'false-alarm' + [Justin Erenkrantz, Brian Pane, Ian Holsman] + + *) ap_get_*_filter_handle() functions to allow 3rd party modules + to lookup filter handles so they can bypass the filter name + lookup when adding filters to a request (via ap_add_*_filter_handle()) + [Ryan Morgan ] + + *) Fix for multiple file buckets on Win32, where the first file + bucket would cause the immediate closure of the socket on any + non-keepalive requests. [Ryan Morgan ] + + *) Correct Win32 failure of mmap of a segment beyond start of the + file; fixes large SSL and similar transfers. [William Rowe] + PR 9898 + + *) Implement apr_proc_detach changes and allow -DNO_DETACH in the + multi-process mode to not "daemonize" while detaching from the + controlling terminal. This is necessary for Apache to work with + process-management tools like AIX's "System Resource Controller" + as well as Dan Bernstein's "daemontools". + [Jos Backus , Aaron Bannert] + + *) Convert mod_auth_digest to use the new apr_global_mutex_t + type. [Aaron Bannert] + + *) fix bug in mod-include where it wouldn't send a unmatched + part if it was at the end of a bucket [Ian Holsman] + + *) worker MPM: Improve logging of errors with the interface between + the listener thread and worker threads. [Jeff Trawick] + + *) Some browsers ignore cookies that have been merged into a + single Set-Cookie header. Set-Cookie and Set-Cookie2 headers + are now unmerged in the http proxy before being sent to the + client. [Graham Leggett] + + *) Fix a problem with proxy where each entry of a duplicated + header such as Set-Cookie would overwrite and obliterate the + previous value of the header, resulting in multiple header + values (like cookies) going missing. + [Graham Leggett, Joshua Slive] + + *) Add the server-limit and thread-limit values to the scoreboard + for the sake of third-party applications. + [Adam Sussman ] + + *) Fix segfault when proxy recieves an invalid HTTP response [Ian Holsman] + + *) OS/390: Get make install to properly copy DSO modules. + [Jeff Trawick] + + *) Win32: Fix bug in mod_status with displaying "Restart Time" + and "Server uptime". + [Bill Stoddard] + + *) Fix IPv6 name-based virtual hosts. [Jeff Trawick] + + *) Introduce AddOutputFilterByType directive. [Justin Erenkrantz] + + *) Fix DEBUG_CGI support in mod_cgi. PR 9670, 9671. + [David MacKenzie ] + + *) Fix incorrect check for script_in in mod_cgi. PR 9669. + [David MacKenzie ] + + *) Fix segfault and display error when SSLMutex file can not be + created. [Adam Sussman ] + + *) Add reference counting to mod_mem_cache cache objects to + better manage removing objects from the cache. + [Bill Stoddard] + + *) Change the verbage on the ScoreBoardFile in our default configs. + Also change the default to be commented out (unspecified) so we + get anonymous shared memory by default. [Aaron Bannert] + + *) Implement new ScoreBoardFile directive logic. This affects how + we create the scoreboard's shared memory segment. If the directive + is present, a name-based segment is created. If the directive is + not present, first an anonymous segment is created, and if that + fails, a name-based segment is created from a file of the name + DEFAULT_SCOREBOARD. This gives third-party applications the + ability to access our scoreboard. [Aaron Bannert] + + *) Allow mod_deflate to work with non-GET requests and properly send + Content-Lengths. [Sander Striker ] + + *) Fix ap_directory_merge() to correctly merge configs when there is + no block. [Justin Erenkrantz, William Rowe] + + *) Remove spurious debug messsages that are normal under HTTP + keep-alive logic. [Jeff Trawick, Justin Erenkrantz] + + *) Fix a bug in mod_cgid that would prevent proper shutdown death + of the cgid process. [Aaron Bannert] + + *) Add signal handling back in to the worker MPM for the one_process + (-X, -DDEBUG, -DONE_PROCESS) case. [Aaron Bannert] + + *) Performance: Reuse per-connection transaction pools in the + worker MPM, rather than destroying and recreating them. [Brian Pane] + + *) Remove all signals from the worker MPM's child process. Instead, + the parent uses the Pipe of Death for all communication with the + child processes. [Ryan Bloom] + +Changes with Apache 2.0.32 + + *) mod_negotiation: ForceLanguagePriority now uses 'Prefer' as the + default if the directive is not specified. This mirrors older + behavior without changes to the httpd.conf. [William Rowe] + + *) Win32: solve the win32 service problems in 2.0.31-alpha, by fixing + the service, mpm and logging code, and bugs in apr_file_open_stderr + and apr_file_dup2 functions. Win2K/XP services have no handles + associated for stdin/out/err, which caused unpredictable behavior + in the prior release. [William Rowe, Bill Stoddard] + + *) Win32: simplify the Application Event Log messages, since there isn't + likely to be 'more information in the error log' before an error log + has been opened. [William Rowe] + + *) Win32: substantial cleanup to the mpm_winnt code for legibility and + to follow the program flow of other MPMs. [Ryan Bloom, William Rowe] + + *) Win32: apache -k shutdown now behaves like apache -k stop. + [Bill Stoddard] + + *) Fix prefork to not kill the parent if a child hits a resource shortage + on accept(). [Greg Ames] + + *) Fix seg faults that occur when what should be the httpd request line + starts with \r\n followed by garbage. [Greg Ames] + + *) Allow statically linked support binaries with the new + --enable-static-support flag, and enable this behavior in + the binbuild script. Also add a new --enable-static-htdbm + flag. [Aaron Bannert] + + *) Allow mod_autoindex to serve symlinks if permitted and attempt to + do only one stat() call when generating the directory listings. + [Justin Erenkrantz] + + *) Fix resolve_symlink to save the original symlink name if known. + [Justin Erenkrantz] + + *) Be a bit more sane with regard to CanonicalNames. If the user has + specified they want to use the CanonicalName, but they have not + configured a port with the ServerName, then use the same port that + the original request used. [Ryan Bloom and Ken Coar] + + *) In core_input_filter, check for an empty brigade after + APR_BRIGADE_NORMALIZE(). Otherwise, we can get segfaults if a + client says it will post some data but we get FIN before any + data arrives. [Jeff Trawick] + + *) Not being able to bind to the socket is a fatal error. We should + print an error to the console, and return a non-zero status code. + With these changes, all of the Unix MPMs do that correctly. + [Ryan Bloom] + + *) suexec: Allow HTTPS and SSL_* environment variables to be passed + through to CGI scripts. PR 9163 + [Brian Reid , + Zvi Har'El ] + + *) binbuild.sh: Make sure that we use the expat from our source + tree so that there aren't any surprises on the target machine. + [Jeff Trawick] + + *) mod_cgid: Add retry logic for when the daemon can't fork fast + enough to keep up with new requests. Start using + HTTP_SERVER_UNAVAILABLE instead of HTTP_INTERNAL_SERVER_ERROR + when we can't talk to the daemon. [Jeff Trawick] + + *) apxs: LTFLAGS envvar can override default libtool options. Try + "LTFLAGS=' ' apxs -c mod_foo.c" to see what libtool does under + the covers. [Jeff Trawick] + + *) The Location: response header field, used for external + redirect, *must* be an absoluteURI. The Redirect directive + tested for that, but RedirectMatch didn't -- it would allow + almost anything through. Now it will try to turn an abs_path + into an absoluteURI, but it will correctly varf like Redirect + if the final redirection target isn't an absoluteURI. [Ken Coar] + +Changes with Apache 2.0.31 + + *) Create the scoreboard (in the parent) in a global pool context, + so it survives graceful restarts. This fixes a SEGV during + graceful restarts. [Aaron Bannert] + + *) Add a timeout option to the proxy code 'ProxyTimeout' + [Ian Holsman] + + *) FTP directory listings are now always retrieved in ASCII mode. + The FTP proxy properly escapes URI's and HTML in the generated + listing, and escapes the path components when talking to the FTP + server. It is now possible to browse the root directory by using + a url like: ftp://user@host/%2f/ (ported from apache_1.3.24) + Also, the last path component may contain wildcard characters + '*' and '?', and if they do, a directory listing is created instead + of a file retrieval. Example: ftp://user@host/httpd/server/*.c + [Martin Kraemer] + + *) Added single-listener unserialized accept support to the + worker MPM [Brian Pane] + + *) New Directive for mod_proxy: 'ProxyPreserveHost'. This passes + the incoming host header through to the proxied server + [Geoff ] + + *) New Directive Option for ProxyPass. It now can block a location + from being proxied [Jukka Pihl ] + + *) Don't let the default handler try to serve a raw directory. At + best you get gibberish. Much worse things can happen depending + on the OS. [Jeff Trawick] + + *) Change the pre_config hook to return a value. Modules can now emit + an error message and then cause the server to quit gracefully during + startup. This required a bump to the MMN. [Aaron Bannert] + + *) Fix some unix socket descriptor leaks in the handler side of + mod_cgid (the part that runs in the server process). Whack a + silly "close(-1)" in the handler too. [Jeff Trawick] + + *) Change the pre_mpm hook to return a value, so that scoreboard + init errors percolate up to code that knows how to exit + cleanly. This required a bump to the MMN. [Jeff Trawick] + + *) Add the socket back to the conn_rec and remove the create_connection + hook. The create_connection hook had a design flaw that did not + allow creating connections based on vhost info. [Bill Stoddard] + + *) Fixed PATH_INFO and QUERY_STRING from mod_negotiation results. + Resolves the common case of using negotation to resolve the request + /script/foo for /script.cgi/foo. [William Rowe] + + *) Added new functions ap_add_(input|output)_filter_handle to + allow modules to bypass the usual filter name lookup when + adding hard-coded filters to a request [Brian Pane] + + *) caching should now work on subrequests (still very experimental) + [Ian Holsman] + + *) The Win32 mpm_winnt now has a shared scoreboard. [William Rowe] + + *) Change ap_get_brigade prototype to use apr_off_t instead of apr_off_t*. + [Justin Erenkrantz] + + *) Refactor ap_rgetline so that it does not use an internal brigade. + Change ap_rgetline's prototype to return errors. [Justin Erenkrantz] + + *) Remove mod_auth_db. [Justin Erenkrantz] + + *) Do not install unnecessary pcre headers like config.h and internal.h. + [Joe Orton ] + + *) Change in quick_hanlder behavior for subrequests. it now passes DONE + (as it does for a normal request). quick_handled sub-requests now work + in mod-include [Ian Holsman] + + *) Change SUBREQ_CORE so that it is a 'HTTP_HEADER' filter instead of + 'CONTENT' one, as it needs to run AFTER all content headers + + *) Rename BeOS MPM directive RequestsPerThread to MaxRequestsPerThread. + [Lars Eilebrecht] + + *) Split out blocking from the mode in the input filters. + [Justin Erenkrantz] + + *) Fix a segfault in mod_include. [Justin Erenkrantz, Jeff Trawick] + + *) Cause Win32 to capture all child-worker process errors in + Apache to the main server error log, until the child can + open its own error logs. [William Rowe] + + *) HPUX 11.*: Do not kill the child process when accept() + returns ENOBUFS on HPUX 11.*. (ported from th 1.3 patch) + [Madhusudan Mathihalli , Bill Stoddard] + + *) Fix a problem in the parsing of the directive. + [Jeff Trawick] + + *) rewrite of mod_ssl input filter for better performance and less + memory usage [Doug MacEachern] + + *) allow quick_handler to be run on subrequests. [Ian Holsman] + + *) mod_dav now asks its provider to place content directly into the + filter stack when handling a GET request. The mod_dav/provider + API has changed, so providers need to be updated. [Greg Stein] + + *) Clear the output socket descriptor in unixd_accept() to make sure + we don't supply a bogus socket to the caller if the accept fails. + This caused problems with the worker MPM, which tried to process + the returned socket if it was non-NULL. [Brian Pane] + + *) Move a check for an empty brigade to the start of core input filter + to avoid segfaults. [Justin Erenkrantz, Jeff Trawick] + + *) Add FileETag directive to allow configurable control of what + data are used to form ETag values for file-based URIs. MMN + bumped to 20020111 because of fields added to the end of + the core_dir_config structure. [Ken Coar] + + *) Fix a segfault in mod_rewrite's logging code caused by passing the + wrong config to ap_get_remote_host(). [Jeff Trawick] + + *) Allow mod_cgid to work from a binary distribution install by + using 755 for the permissions on the log directory instead of + 750. [Jeff Trawick] + + *) Fixed a segfault that happened during graceful shutdown (or when + the httpd ran out of file descriptors) with the worker MPM [Brian Pane] + + *) Split all Win32 modules [excluding the core components mod_core, + mod_so, mod_win32 and the winnt mpm] into individual loadable + modules, so the administrator may individually disable the former + compiled-in modules by simply commenting out their LoadModule + directives. [William Rowe] + + *) Saved Win32 module authors and porters many future headaches, by + duplicating the appropriate .h files such as os.h into the include + directory, including in the build tree. [William Rowe] + + *) mod_ssl adjustments to help with using toolkits other than OpenSSL: + Use SSL functions/macros instead of directly dereferencing SSL + structures wherever possible. + Add type-casts for the cases where functions return a generic pointer. + Add $SSL/include to configure search path. + [Madhusudan Mathihalli ] + + *) Moved several pointers out of the shared Scoreboard so it is + more portable, and will present the vhost name across server + generation restarts. [William Rowe] + + *) Fix SSLPassPhraseDialog exec: and SSLRandomSeed exec: + [Doug MacEachern] + +Changes with Apache 2.0.30 + + *) Fix the main bug for FreeBSD and threaded MPM's. There are + still issues (see STATUS) but at least the server will now + run without crashing the machine. + [David Reid, Aaron Bannert, Justin Erenkrantz] + + *) Fix a typo in mod_deflate's m4 config section. + [albert chin ] + + *) Fix a couple of mod_proxy problems forwarding HTTP connections + and handling CONNECT: + (1) PR #9190 Proxy failed to connect to IPv6 hosts. + (2) Proxy failed to connect when the first IP address returned by + the resolver was unreachable but a secondary IP address was. + [Jeff Trawick] + + *) Fix the module identifer as shown in the docs for various core + modules (e.g., the identifer for mod_log_config was previously + listed as config_log_module). PR #9338 + [James Watson ] + + *) Fix LimitRequestBody directive by placing it in the HTTP + filter. [Justin Erenkrantz] + + *) Fix mod_proxy seg fault when the proxied server returns + an HTTP/0.9 response or a bogus status line. + [Adam Sussman] + + *) Prevent mod_proxy from truncating one character off the + end of the status line returned from the proxied server. + [Adam Sussman, Bill Stoddard] + + *) Eliminate loop in ap_proxy_string_read(). + [Adam Sussman, Bill Stoddard] + + *) Provide $0..$9 results from mod_include regex parsing. + [William Rowe] + + *) Allow mod-include to look for alternate start & end tags [Ian Holsman] + + *) Introduced the ForceLanguagePriority directive, to prevent + returning MULTIPLE_CHOICES or NONE_ACCEPTABLE in some cases, + when using Multiviews. [William Rowe] + + *) Fix a problem which prevented mod_cgid and suexec from working + together reliably [Greg Ames] + + *) Remove the call to exit() from within mod_auth_digest's post_config + phase. [Aaron Bannert] + + *) Fix a problem in mod_auth_digest that could potentially cause + problems with initialized static data on a system that uses DSOs. + [Aaron Bannert] + + *) Fix a segfault in the worker MPM that could happen during + child process exits. [Brian Pane, Aaron Bannert] + + *) Allow mod_auth_dbm to handle multiple DBM types [Ian Holsman] + + *) Fix matching of vhosts by ip address so we find IPv4 + vhost address when target address is v4-mapped form of + that address. [Jeff Trawick] + + *) More performance tweaks to the BNDM string-search algorithm + used to find "" is the last byte in a file [Brian Pane] + + *) Add back in the "suEXEC mechanism enabled (wrapper: /path/to/suexec)" + message that we had back in apache-1.3 and still have scattered + throughout our docs. [Aaron Bannert] + + *) Prevent the Win32 port from continuing after encountering an + error in the command line args to apache. [William Rowe] + + *) On a error in the proxy, make it write a line to the error log + [Ian Holsman] + + *) Various mod_ssl performance improvements [Doug MacEachern] + +Changes with Apache 2.0.29 + + *) Add buffering in core_output_filter to ensure that long + lists of small buckets don't cause small packet writes. + [Brian Pane, Ryan Bloom] + + *) Fix the installation target to make sure that the manual is + installed in the correct location. + [Yoshifumi Hiramatsu and + Gomez Henri ] + + *) Fix the cmd command for mod_include. When we are processing + a cmd command, we do not want to use the r->filename to set + the command name. The command comes from the SSI tag. To do this, + I added a variable to the function that builds the command line + in mod_cgi. This allows the include_cmd function to specify + the command line itself. [Ryan Bloom] + + *) Change open_logs hook to return a value, allowing you + to flag a error while opening logs + [Ian Holsman, Doug MacEachern] + + *) Change post_config hook to return a value, allowing you + to flag a error post config + [Ian Holsman, Jeff Trawick] + + *) Allow SUEXEC_BIN (the path to the suexec binary that is + hard-coded into the server) to be specified to the configure + script by the --with-suexec-bin parameter. [Aaron Bannert] + + *) Fix segv in worker MPM following accept on pipe-of-death + [Brian Pane] + + *) Add mod_deflate to experimental. + [Ian Holsman, Justin Erenkrantz] + + *) Bail out at configure time if an invalid MPM was specified. + [jean-frederic clere ] + + *) Prevent segv in ap_note_basic_auth_failure() when no AuthName is + configured [John Sterling ] + + *) Fix apxs to use sbindir. [Henri Gomez ] + + *) Fix a problem with IPv6 vhosts. PR #8118 [Jeff Trawick] + + *) Optimization for the BNDM string-search function in + mod_include. [Brian Pane] + + *) Fixed the behavior of the XBitHack directive. + [Taketo Kabe , Cliff Woolley] PR#8804 + + *) The threaded MPM for Unix has been removed. Use the worker + MPM instead. [various] + + *) APR-ize the resolver logic in mod_unique_id. This fixes a bug + in logging the error from a failed DNS lookup. [Jeff Trawick] + + *) Added the missing macros AP_INIT_TAKE13 and AP_INIT_TAKE123. + [Cliff Woolley] + + *) Get mod_cgid killed when a MPM exits due to a fatal error. + [Jeff Trawick] + + *) Fix a file descriptor leak in mod_include. When we include a + file, we use a sub-request, but we didn't destroy the sub-request + immediately, instead we waited until the original request was + done. This patch closes the sub-request as soon as the data is + done being generated. [Brian Pane ] + + *) Allow modules that add sockets to the ap_listeners list to + define the function that should be used to accept on that + socket. Each MPM can define their own function to use for + the accept function with the MPM_ACCEPT_FUNC macro. This + also abstracts out all of the Unix accept error handling + logic, which has become out of synch across Unix MPMs. + [Ryan Bloom] + + *) Fix a bug which would cause the response headers to be omitted + when sending a negotiated ErrorDocument because the required + filters were attached to the wrong request_rec. + [John Sterling ] + + *) Remove commas from the end of the macros that define + directives that are used by MPMs. Prior to this patch, + you would use these macros without commas, which was unlike + the macros for any other directives. Now, the caller provides + the comma rather than the macro providing it. This makes + the macros look more like the rest of the directives. + [Ryan Bloom and Cliff Woolley] + + *) Add 'redirect-carefully' environment option to disable sending + redirects under special circumstances. This is helpful for + Microsoft's WebFolders when accessing a directory resource via + DAV methods. [Justin Erenkrantz] + + *) Begin to abstract out the underlying transport layer. + The first step is to remove the socket from the conn_rec, + the server now lives in a context that is passed to the + core's input and output filters. This forces us to be very + careful when adding calls that use the socket directly, + because the socket isn't available in most locations. + [Ryan Bloom] + + *) Really reset the MaxClients value in worker and threaded + when the configured value is not a multiple of the number + of threads per child. We said we did previously but we + forgot to. [Jeff Trawick] + + *) Add Debian layout. [Daniel Stone ] + + *) If shared modules are requested and mod_so is not available, + produce a fatal config-time error. [Justin Erenkrantz] + + *) Improve http2env's performance by cutting the work it has to + do. [Brian Pane ] + + *) use new 'apr_hash_merge' function in mod_mime (performance fix) + [Brian Pane ] + +Changes with Apache 2.0.28 + + *) Fix infinite loop in mod_cgid.c. + [Dale Ghent , Brian Pane ] + + *) When no port is given in a "ServerName host" directive, the + server_rec->port is now set to zero, not 80. That allows for + run-time deduction of the correct server port (depending on + SSL/plain, and depending also on the current setting of + UseCanonicalName). This change makes redirections + work, even with https:// connections. As in Apache-1.3, the + connection's actual port number is never used, only the ServerName + setting or the client's Host: setting. Documentation updated + to reflect the change. [Martin Kraemer] + + *) Add a '%{note-name}e' argument to mod-headers, which works in + the same way as mod_log_confg. [Ian Holsman] + + *) Fix the spelling of the AP_MPMQ_MIN_SPARE_DAEMONS and + AP_MPMQ_MAX_REQUESTS_DAEMON macros in ap_mpm.h and all standard + MPMs. [Cliff Woolley] + + *) Introduce htdbm, a user management utility for db/dbm authorization + databases. [Mladen Turk ] + + *) Optimize usage of strlen and strcat in ap_directory_walk. + [Brian Pane ] + +Changes with Apache 2.0.27 + + *) Introduce an Apache mod_ssl initial configuration template + (ssl.conf, generated from ssl-std.conf). [Ralf S. Engelschall] + + *) Fixed a memory leak in the getline parsing code that could + be triggered by arbitrarily large header lines. Requests + from the core input filter for single lines are now limited + to HUGE_STRING_LEN (8192 bytes). [Aaron Bannert] + + *) Fix a truncation bug in how we print the port on the Via: header. + The routine that prints the Via: header now takes a length for + the port string. [Zvi Har'El ] + + *) Some syntax errors in mod_mime_magic's magic file can result + in a 500 error, which previously was unlogged. Now we log the + error. [Jeff Trawick] + + *) Add the support/checkgid helper app, which checks the run-time + validity of group identifiers usable in the Group directive. + [Ken Coar] + + *) Various --enable-so options have been fixed: --enable-so is + treated as "static"; explicit --enable-so=shared issues an error; + and explicit --enable-so fails with error on systems without + APR_HAS_DSO. [Aaron Bannert] + + *) Fix a segfault in the core input filter when the client socket + gets disconnected unexpectedly. [Cliff Woolley] + + *) Fix the reporting for child processes that die. This removes + all of the non-portable W* macros from Apache. + [Jeff Trawick and Ryan Bloom] + + *) Win32: Track and display "Parent Server Generation:" in + mod_status output. The generation will be bumped at + server graceful restart, when the child process exits + by hitting MaxRequestsPerChild or if the child + process exits abnormally. [Bill Stoddard] + + *) Win32: Fix problem where MaxRequestsPerChild directive was + not being picked up in favor of the default. Enable + the parent to start up a new child process immediately upon + the old child starting shutdown. + [Bill Stoddard] + + *) Fix some bungling of the remote port in rfc1413.c so that + IdentityCheck retrieves the proper user id instead of failing + and thus always returning "nobody." + [Dick Streefland ] + + *) Introduced thread saftey for mod_rewrite's internal cache. + [Brian Pane ] + + *) Simplified mod_env's directives to behave as most directives are + expected, in that UnsetEnv will not unset a SetEnv and PassEnv + directive following that UnsetEnv within the same container. + Also provides a runtime startup warning if a PassEnv configured + environment value is undefined. [William Rowe] + + *) The worker MPM is now completely ported to APR's new lock API. It + uses native APR types for thread mutexes, cross-process mutexes, + and condition variables. [Aaron Bannert] + + *) Sync up documentation to remove all references to the now deprecated + Port directive. [Justin Erenkrantz] + + *) Moved all ldap modules from the core to httpd-ldap sub-project + [Ryan Bloom] + + *) Exit when we can't listen on any of the configured ports. This + is the same behavior as 1.3, and it avoids having the MPMs to + deal with bogus ap_listen_rec structures. [Jeff Trawick] + + *) Cleanup the proxy code that creates a request to the origin + server. This change adds an optional hook, which allows modules + to gain control while the request is created if the proxy module + is loaded. The purpose of this hook is to allow modules to add + input and/or output filters to the request to the origin. While + I was at it, I made the core use this hook, so that proxy request + creation uses some of the code from the core. This can still be + greatly improved, but this is a good start. [Ryan Bloom] + +Changes with Apache 2.0.26 + + *) Port the MaxClients changes from the worker MPM to the threaded + MPM. [Ryan Bloom] + + *) Fix mod_proxy so that it handles chunked transfer-encoding and works + with the new input filtering system. [Justin Erenkrantz] + + *) Introduce the MultiviewsMatch directive, to allow the operator + to be flexible in recognizing Handlers and Filters filename + extensions as part of the Multiviews matching logic, strict with + MultiviewsMatch NegotiatedOnly to accept only filename extentions + that designate negotiated parameters, (content type, charset, etc.) + or MultiviewsAll for the 1.3 behavior of matching any files, even + if they have unregistered extensions. [William Rowe] + + *) Fixed the configure script to add a LoadModule directive to + the default httpd.conf for any module that was compiled + as a DSO. [Aaron Bannert ] + + *) rewrite mod_ssl input filtering to work with the new input filtering + system. [Justin Erenkrantz] + + *) prefork: Don't segfault when we are able to listen on some but + not all of the configured ports. [Jeff Trawick] + + *) Build mod_so even if no core modules are built shared. + [Aaron Bannert ] + + *) Introduce ap_directory_walk rewrite (with further optimizations + required) to adapt to the ap_process_request_internal() changes. + Optimized so subrequests and redirects now reuse previous section + merges, until we mismatch with the original directory_walk, and + precomputed r->finfo results will cause directory_walk to skip + the most expensive phases of the function. [William Rowe] + + *) Allow ApacheMonitor to connect to and control Apache on other + WinNT/2K machines. [Mladen Turk ] + + *) Remove the Port directive. In it's place, the Listen directive + is now a required directive, which tells Apache what port to + listen on. The ServerName directive has also been extended + to accept an optional port. If the port is specified to the + ServerName, the server will report that port whenever it + reports the port that it is listening on. This change was + made to ease configuration errors that stem from having a Port + directive, and a Listen directive. In that situation, the server + would only listen to the port specified by the Listen command, + which caused a lot of confusion to users. [Ryan Bloom] + + *) Added mod_mime_magic, mod_unique_id and mod_vhost_alias to the Win32 + build, as loadable modules. [William Rowe] + + *) Fix --enable-mods-shared processing. If most is specified, + then all modules that can be compiled as shared modules are. + [Aaron Bannert ] + + *) Update the mime.types file to map video/vnd.mpegurl to mxu + and add commonly used audio/x-mpegurl for m3u extensions. + [Heiko Recktenwald , Lars Eilebrecht] + + *) Eliminate the depreciated r->content_language, in favor of the array + r->content_languages introduced many years ago. Module authors must + substantially overhaul their modules, so this needs to be upgraded + if the module still relied on backwards-brokeness. [William Rowe] + + *) Allow configure help strings to work with autoconf 2.50+ and 2.13. + [Justin Erenkrantz] + + *) Rewrite the input filtering mechanisms to consolidate and reorganize + code. In short, core_input_filter does something now and + ap_http_filter is now only concerned with HTTP. [Justin Erenkrantz] + + *) Update the Win32 build to re-absorb mod_proxy and family. + [William Rowe] + + *) Resolved the build failure on Win32 using MSVC 5.0 (without the + current SDK.) [William Rowe] + + *) Some style changes to the code that does ProxyErrorOverride. Fixed + config merge behaviour. [Graham Leggett] + + *) Allow support programs to be compiled against a static version + of libapr. This allows the smaller support programs to be + relocated. [Aaron Bannert ] + + *) Update the mime.types file to the registered media types as + of 2001-09-25, and add mapping for xsl extension [Mark Cox] + + *) Fix MaxClients in the Worker MPM, so that it specifies the maximum + number of clients that can connect at the same time, instead of + specifying the maximum number of child processes. + [Aaron Bannert ] + + *) Switch proc_pthread AcceptMutex configuration directive to pthread to + be consistent with 1.3. [Justin Erenkrantz] + + *) Cache apr_explode_localtime() value for 15 seconds. + [Brian Pane ] + + *) Fix mod_include to not return ETag or Last-Modified headers. + [Ian Holsman ] + + *) Fix worker MPM's scoreboard logic. [Aaron Bannert ] + + *) Eliminate the wasteful run-time conversion of method names from strings + to numbers in places where the methods are known at compile time. + [Brian Pane ] + + *) Turn the worker MPM's queue into a LIFO. This may + improve cache-hit performance under some conditions. + [Aaron Bannert ] + + *) Switch back to SIGUSR1 for graceful restarts on all platforms that + support it. [Justin Erenkrantz] + + *) Cleanup the worker MPM. We no longer re-use transaction + pools. This incurs less overhead than shuffling the pools + around so that they can be re-used. Remove one of the + queue's condition variables. We just redefined the API to + state that you can't try to add more stuff than you allocated + segments for. [Aaron Bannert ] + + *) Fix SSL VPATH builds [Cody Sherr ] + + *) Fixed persistent connections when a request contains a body. + [Greg Stein] + + *) mod_dav uses a new API to speak to the backend provider for dead + property management. [Greg Stein] + + *) Remove the Win32 script-processing exception from mod_cgi, and + roll build_command_line/build_argv_list into a unified, overrideable + ap_cgi_build_command optional function. [William Rowe] + + *) Rewrite find_start_sequence to use a better search algorithm + to find the start tag. [Justin Erenkrantz] + + *) Fix a seg fault in mod_include. When we are generating an + internal redirect, we must set r->uri to "", not a bogus + string, and not NULL. [Ryan Bloom] + + *) Optimized location_walk, so subrequests, redirects and second passes + now reuse previous section merges on a by + basis, until we mismatch with the original location_walk. + [William Rowe] + + *) Back out the 1.45 change to util_script.c. This change made + us set the environment variable REQUEST_URI to the redirected + URI, instead of the originally requested URI. + [Taketo Kabe ] + + *) Make mod_include do lazy evaluation of potentially expensive to + compute variables. [Brian Pane ] + + *) Fix logging of bytes sent for HEAD requests. %b and %B should + log either - or 0, before this patch, they were both logging + the file size. [Taketo Kabe ] + + *) Make mod_include check for BYTE_CHECK_THRESHOLD per bucket rather + than per character. [Brian Pane ] + + *) Normalize the primary request, redirects and sub-requests to + run the same ap_process_request_internal for consistency in + robustness, behavior and security. [William Rowe] + + *) Fix a segfault with mod_include when r->path_info is not set + (which is the case with mod_proxy). [Ian Holsman ] + + *) Add -X functionality back. This indicates to all MPMs and any other + part of Apache that it should run in "debug" mode. [Justin Erenkrantz] + + *) Some initial support for the cygwin platform [prefork only]. + This is not to be confused with support for the WinNT/Win32 + platform, which is the recommended configuration for native + Win32 users. The cygwin platform support is recommended for + cygwin platform users. [Stipe Tolj ] + + *) Changed syntax of Set{Input|Output}Filter. The list of filters + must be semicolon delimited (if more than one filter is given.) + The Set{Input|Output}Filter directive now overrides a parent + container's directive (e.g. SetInputFilter in + will override any SetInputFilter directive in .) + This new syntax is more consistent with Add{Input|Output}Filter + directives defined in mod_mime. Also cures a bug in prior releases + where the Set{Input|Output}Filter directive would corrupt the + global configuration if the multiple directives were nested. + [William Rowe] + + *) Cured what's ailed mime for quite some time. If an AddSomething + was given in the configuration (Language, Charset, Handler or + Encoding) Apache would set the content type as given by AddType, + but refused to check the mime.types file if AddType wasn't given + for that specific extension. Setting the AddHandler for .html + without setting the AddType text/html html would cause Apache to + use the default content type. [William Rowe] + + *) Added some bulletproofing to memory allocation in the LDAP cache + code. [Graham Leggett] + +Changes with Apache 2.0.25 + + *) Move the installed /manual directory out of the /htdocs/ tree, so + that it can be kept more independently from the remaining document + root. The "Alias /manual ..." already allowed for easy projection + into existing private document trees. [Martin Kraemer] + + *) Add specified user attributes to the environment when using + mod_auth_ldap. This allows you to use mod_include to embed specified + user attributes in a page like so: + Hello , how are you? + [Graham Leggett] + + *) Fix a performance problem with the worker MPM. We now create + transaction pools once, and re-use them for each connection. + [Aaron Bannert ] + + *) Modfied mod_mime to prevent mod_negotation from serving a multiview + of a 'handler' or 'filter', so that any filename extension that does + not contribute to the negotiated metadata can't be served without + an explicit request. E.g., if the .Z extension is associated with + an unzip filter, the user request somefile.Z.html, mod_negotiation + won't serve it. It can serve somefile.Z.html when somefile.Z is + requested, since the .Z extension is explictly requested, if the + .html extension is associated with ContentType text/html. + [William Rowe] + + *) Introduce the AddInputFilter filter[;filter...] ext [ext...] + and corresponding AddOutputFilter syntax, to insert one or more + filters by mod_mime filename extension processing. + [William Rowe] + + *) Fix a growing connection pool in core_output_filter() for + keepalive requests. [Jeff Trawick] + + *) Moved split_and_pass_pretag_buckets back to being a + macro at Ryans's request. Removed the return from it + by setting and returning a return code instead. Updated + the code to check the return code from the macro and + do the right thing. [Paul J. Reder] + + *) Fix a segfault when a numeric value was received for Host:. + [Jeff Trawick] + + *) Add a function ap_remove_input_filter. This is to match + up with ap_remove_output_filter. [Ryan Bloom] + + *) Clean up location_walk, so that this step performs a minimum + amount of redundant effort (it must be run twice, but it will no + longer reparse all blocks when the request uri + hadn't changed.) [William Rowe] + + *) Eliminate proxy: (and all other 'special') processing from the + ap_directory_walk() phase. Modules that want to use special + walk logic should refer to the mod_proxy map_to_location example, + with it's proxy_walk and proxysection implementation. This makes + either directory_walk flavor much more legible, since that phase + only runs against real blocks. + [William Rowe] + + *) SECURITY: Fix a security problem in mod_include which would allow + an SSI document to be passed to the client unparsed. + [Cliff Woolley, Brian Pane] + + *) Introduce the map_to_storage hook, which allows modules to bypass + the directory_walk and file_walk for non-file requests. TRACE + shortcut moved to http_protocol.c as APR_HOOK_MIDDLE, and the + directory_walk/file_walk happen as APR_HOOK_VERY_LAST in core.c. + [William Rowe] + + *) Add the ability for mod_include to add the INCLUDES filter + if the file is configured for the server-parsed handler. + This makes the configuration for .shtml files much easier + to understand, and allows mod_include to honor Apache 1.3 + config files. Based on Doug MacEachern's patch to PHP + to do the same thing. [Ryan Bloom] + + *) force OpenSSL to ignore process local-caching and to always + get/set/delete sessions using mod_ssl's callbacks + [Madhusudan Mathihalli , + Geoff Thorpe ] + + *) Make the worker MPM shutdown and restart cleanly. This also + cleans up some race conditions, and gets the worker using + pools more cleanly. [Aaron Bannert ] + + *) Implement CRYPTO_set_locking_callback() in terms of apr_lock + for mod_ssl + [Madhusudan Mathihalli ] + + *) Fix for mod_include. Ryan's patch to check error + codes put a return in the wrong place. Also, the + include handler return code wasn't being checked. + I don't like macros with returns, so I converted + SPLIT_AND_PASS_PRETAG_BUCKETS into a function. + [Paul J. Reder ] + + *) fix segv in mod_mime if no AddTypes are configured + [John Sterling ] + + *) Enable ssl client authentication at SSL_accept time + [Madhusudan Mathihalli ] + + *) Fix a segfault in mod_include when the original request has no + associated filename (e.g., we're filtering the error document for + a bad URI). [Jeff Trawick] + + *) Fix a storage leak (a strdup() call) in mod_mime_magic. [Jeff Trawick] + + *) The prefork and OS/2 MPMs are overwriting the pid file when a second copy + of httpd is started and shuts down due to socket conflict. Moving the + call to ap_log_pid solves the problem. + + *) Changed the late-1.3 log_config substitution %c to %X, to log the + status of the closed connection, as it conflicts with the far more + common, historical ssl logging directive %...{var}c. [William Rowe] + + *) Added the common error/ tree to the build/install targets + (similar to the common icons/ tree) for the multi-language error + messages that Lars committed earlier. [William Rowe] + + *) Added a multi process, multi threaded OS/2 MPM mpmt_os2. [Brian Havard] + + *) Added a default commented-out mod_ldap and mod_auth_ldap + configuration to httpd-std.conf and httpd-win.conf + [Graham Leggett] + + *) Added documentation for mod_ldap and mod_auth_ldap. + [Graham Leggett] + + *) Enabled negative caching on attribute comparisons in the LDAP cache. + Fixed a problem where the default cache TTL was set in milliseconds + not microseconds causing the cache to time out almost immediately. + [Graham Leggett] + + *) Fixed all the #if APR_HAS_SHARED_MEMORY checks within the LDAP + module code to follow APR. [Graham Leggett] + + *) Fixed LDAP cleanup on graceful restarts. LDAP connections are now + cleaned up when the connection pool pool is cleaned up. + [Graham Leggett] + + *) Fix a minor issue with Jeff Trawick's mod_include + patch. Without this patch, the code will just allocate + more bytes in get_combined_directive than are needed. + [Paul Reder] + + *) Added the LDAP authentication module mod_auth_ldap. + [Dave Carrigan , Graham Leggett] + + *) Added the LDAP cache and connection pooling module mod_ldap. + [Dave Carrigan , Graham Leggett] + + *) Fix --enable-modules=all breakage with mod_auth_db and mod_auth_digest + by allowing a module to disable itself if its prerequisites are not + met. [Justin Erenkrantz] + +Changes with Apache 2.0.24 + + *) Fix a couple of issues in mod_include when the tag appeared at + offsets near 8192 in the file being parsed. [Jeff Trawick] + + *) Fix an assertion failure in mod_ssl when the keepalive timeout is + reached. [Jeff Trawick] + + *) Numerous improvements to the Win32 build system. Introduced command line + builds without requiring .mak files for MSVC 6.0 and later versions. + Improved .dsp file compatibility for both Visual Studio 5.0 and 6.0 users. + [William Rowe] + + *) Assorted corrections and improvements to the winnt_mpm startup code. Better + reporting of uninstalled services and other error conditions, and changed the + default service name to Apache2. [William Rowe] + + *) Numerous improvements to the Win32 ApacheMonitor utility, including winnt_mpm + compatibility with existing Apache 1.3 Win32 Apache management utilites. + [Mladen Turk , William Rowe] + + *) Fixed the segfaults in mod_mime introduced by hash tables in 2.0.20. + [William Rowe, Greg Ames] + + *) Rounded out the mod_mime Add/Remove pairs by adding RemoveLanguage + and RemoveCharset directives. [William Rowe] + + *) The Unix MPMs other than perchild now allow child server + processes to use the accept mutex when starting as root and + using SysV sems for the accept mutex. Previously, this + combination would lead to fatal errors in the child server + processes. perchild can't use SysV sems because of security + issues. [Jeff Trawick, Greg Ames] + + *) Added Win32 revision stamp resources to all http binaries + (including modules/ and support/ tools.) PR7322 [William Rowe] + + *) Fix ap_rvprintf to support more than 4K of data at one time. + [Cody Sherr ] + + *) We have always used the obsolete/deprecated Netscape syntax + for our tracking cookies; now the CookieStyle directive + allows the Webmaster to choose the Netscape, RFC2109, or + RFC2965 format. The new CookieDomain directive allows the + setting of the cookie's Domain= attribute, too. PR #s 5006, + 5023, 5920, 6140 [Ken Coar] + + *) Tweak server/Makefile so that the rules for generating exports.c + are compatible with make utilities which don't expand wildcards + in a dependency list (e.g., OS/390 make, certain levels of GNU + make). [Jeff Trawick] + + *) Install the SSL headers. [John Sterling ] + + *) Begin to sanitize the MPM configuration directives. Now, all + MPMs use the same functions for all common MPM directives. This + should make it easier to catch all bugs in these directives once. + [Cody Sherr ] + + *) Close a major resource leak. Every time we had issued a + graceful restart, we leaked a socket descriptor. + [Ryan Bloom] + + *) Fix a problem with the new method code. We need to cast + the 1 to an apr_int64_t or it will be treated as a 32-bit + integer, and it will wrap after being shifted 32 times. + [Cody Sherr and Ryan Morgan ] + + *) Fix a bug in mod_expires. Previous to this patch, if you + told mod_expires to add 604800 seconds to the last-modified + time, it actually added 604800 usec's to the last-modified time, + so that when looking at the response it looked like nothing + had been done. The root of the problem was that we always compute + time in usec's, but we ask users to input sec's. This means we + need to convert to usec's before using those values. + [Ryan Bloom] + + *) The worker MPM now handles shutdown and restart requests. It + definitely isn't perfect, but we do stop the servers correctly. + The biggest problem right now is that SIGHUP causes the server to + just die. [Ryan Bloom] + +Changes with Apache 2.0.23 + + *) Use the prefork MPM by default on Unix. [various] + + *) Added a systray icon monitor application for Win32. + [Mladen Turk ] + + *) mod_rewrite: Fix the line ending on some non-Unix systems for + messages written to the rewrite log. + [Richard Labennett ] + + *) All mod_autoindex query parsing is now quietly quashed with the + IndexOption IgnoreClient. The IndexOption SuppressColumnSorting + still drops the column sort 's for the column headers, but + IgnoreClient is required to ignore these Query options entirely. + [William Rowe] + + *) Introduced new mod_autoindex query argument parsing for F=[0|1|2] + to allow the client to select plain, FancyIndexing or HTMLTable + formatting, V=[0|1] to inhibit or enable version sorting, and + P=pattern to return only specific files. The old Query Arguments + were reorganized as C=f for sorting column 'f' (same N, D, S, or M + as before), and O=A|D for ordering ascending or descending. + [William Rowe] + + *) Fixed an error in mod_include's directive parsing routines which + caused #if, #elif, and #else expressions containing backslashes + to be improperly evaluated. [Cliff Woolley] + + *) Introduced new mod_autoindex IndexOptions flags: SuppressIcon to + drop the icon column, SuppressRules to drop the
    elements, + and HTMLTable to create rudimentary HTML table listings (implies + FancyIndexing). [William Rowe] + + *) Re-introduced the mod_autoindex IndexOptions flag TrackModified + from Apache 1.3.15. This is needed for two reasons, first, given + multiple machines within a server farm, ETags and Last-Modified + stamps won't correspond from machine to machine, and second, many + Unixes don't capture changes to the date or time stamp of existing + files, since these don't modify the dirent itself. [William Rowe] + + *) Re-introduced the mod_autoindex IndexOptions flag FoldersFirst + and DirectoryWidth options from Apache 1.3.10. + [William Rowe, Ken Coar] + + *) Eliminated FancyIndexing directive, deprecated early in Apache + 1.3 by the IndexOptions FancyIndexing syntax. [William Rowe] + + *) mod_autoindex now excludes any file names that would result in + an error, other than a success or redirect. Also optimized + the parent directory, always included except in the URI '/'. + [William Rowe] + + *) Refactored mod_negotiation and mod_mime to help mod_dir accept + negotiated index pages, and prevent the server from defaulting + to an autoindex of the directory. mod_negotiation will now die + with a 500 Internal Error if it could match some filenames + (e.g. for mod_dir) but none can be served. mod_negotation now + refuses to serve any file with an extention that mod_mime doesn't + recognize, and wasn't part of the request. [William Rowe] + + *) Eliminate mod_cgi's handling of .exe files without the .exe file + extension. This is already handled by multiviews, if the admin + wishes to AddHandler .exe or define a content type handler and + associate .exe files with that content type. Multiviews must be + enabled to allow these to be served. [William Rowe] + + *) Speed up the server's response to a spike in incoming workload + or restarts by assigning empty scoreboard slots to new processes + when they are available. [Greg Ames] + + *) Add a handler to mod_includes.c. This handler is designed to + implement the XbitHack directive. This can't be done with a + fixup, because we need to check the content-type, which is + only available in the handler phase. [Ryan Bloom] + + *) Make the includes filter check return codes from filters lower in + the filter chain. If a lower level filter returns an error, then + the request needs to stop immediately. This allows mod_include to + stop parsing data once a lower filter recognizes an error. + [Ryan Bloom] + + *) Add the ability to extend the methods that Apache understands + and have those methods able in the httpd.conf. It uses + the same bit mask/shifted offset as the original HTTP methods + such as M_GET or M_POST, but expands the total bits from an int to + an ap_int64_t to handle more bits for new request methods than + an int provides. [Cody Sherr ] + + *) Fix broken mod_mime behavior in merging its arguments. Possible + cause of unexplicable crashes introduced in 2.0.20. [William Rowe] + + *) Solve many mod_ssl porting issues (too many to detail) with + help from the whole team, but most notably [Ralf S. Engelschall, + Madhusudan Mathihalli , + Doug MacEachern, William Rowe, Cliff Woolley] + + *) More stall fixes for the threaded & worker mpm's. + Make mod_status output more accurate. Don't + count workers in processes which aren't actively + serving requests. [Greg Ames] + + *) Win32: Get SSI exec cgi tag working. [Bill Stoddard] + + *) Add a single listener/multiple worker MPM. This MPM is + definately not fully correct, but it allows us to solve many + of the problems that exist in the threaded MPM. This is a + modified version of the threaded MPM. [Ryan Bloom] + + *) Improve content generation throughout Apache, providing closer + compliance with HTML 3.2, HTML 4.01 Transitional and XHTML 1.0 + Transitional specifications. [William Rowe] + +Changes with Apache 2.0.22 + + *) Fix a problem where the threaded MPM stalls after restarts or + segfaults. Also prevent multiple active processes from using + the same scoreboard slot. [Greg Ames] + + *) Apache/Win32 now fills in the service description with Apache's + server version string, including loaded and advertised modules. + [William Rowe] + + *) Improved support for the Win32 build, to recover gracefully from + missing apr or apr-util directories or the awk interpreter, + create the proper cgi-bin examples, including a test-cgi.bat, and + fix the perl shebang line for printenv.pl, when installing from + the build environment. [William Rowe] + + *) Fix a segfault in threaded.c caused by passing uninitialized + apr_thread_t * to apr_thread_join(). [Jeff Trawick] + + *) Use new APR number conversion functions to reduce CPU consumption + when setting the content length, and in mod_log_config. + [Brian Pane] + + *) Fix problem reported by Taketo Kabe + where HEAD response headers were being repeated twice for + files greater than 32K bytes (4*AP_MIN_BYTES_TO_WRITE). This + problem in the http_header filter was exposed by the recent rewrite + of the content_length filter. [Taketo Kabe, Bill Stoddard] + + *) Fix seg faults in mod_status with ExtendedStatus enabled, after + restarts. A garbage pointer to a vhost's server_rec from the + previous generation was being left around under certain + conditions. [Greg Ames] + + *) Fix a cosmetic problem with mod_include. Non-existant SSI vars + used to appear as '(none', without the closing paren. + [Günter Knauf ] + + *) Improve the exports generating awk script. In the past, we had + work around problems in the awk script by avoiding some #if and + #ifdefs. This has bitten us many times in generating the exports.c + file. This improvement allows corrects the header file parsing. + [Sander Striker ] + +Changes with Apache 2.0.21 + + *) Resolve the Win32 htpasswd bug, where a file that existed would be + overwritten, regardless of the -c flag. + [William Rowe, Mladen Turk ] + + *) Introduce connection sub-pools into ab. Truncating the lifetime + of these allocations means that ab no longer perpetually grows + its working set, running out of memory on large request attempts. + [William Rowe] + + *) Make scoreboard creation a hook. This allows management + modules to have access to the scoreboard at the time that it is + created, and at every restart request. + [Cody Sherr ] + + *) Changed AP_MPMQ_MAX_DAEMONS to refer to MaxClients and + added an AP_MPMQ_MAX_DAEMON_USED to refer to the highest + daemon index actually used in the scoreboard. I also + updated the pertinent calls. [Paul J. Reder] + + *) Win32: Prevent listening sockets from being inherited by + the Apache child process, CGI scripts, rotatelog process + etc. If the Apache child process segfaults, any processes + that the child started are not reaped. Prior to this fix, + these processes inherited the listening sockets which sometimes + prevented the restarted Apache child process from accepting + connections (ie, the server would hang). + [Bill Stoddard] + + *) Provide vhost and request strings when ExtendedStatus is on. + [Greg Ames] + + *) Fix some issues with the pod and prefork: check the pod *after* + processing a connection so that a server processing a time- + consuming request bails out as soon as practical; when the + parent process wakes up a server process via connect(), use an + APR timeout on the connect() so that we don't hang for a long + time if there aren't server processes around to do accept(). + [Jeff Trawick, Greg Ames] + + *) Performance improvement to mod_mime.c. find_ct() in mod_mime, + spends a lot of time in apr_table_get calls. Using the default + httpd.conf, the tables for languages and charsets are somewhat + large, so the time spent scanning them on each request is + significant. Replacing the tables with hash tables provides + a nice speedup. [Brian Pane ] + + *) Add two functions to allow modules to access random parts of the + scoreboard. This allows modules compiled for one MPM to access the + scoreboard, even if it the server was compiled for another MPM. + [Harrie Hazewinkel ] + +Changes with Apache 2.0.20 + + *) Fix problem in content-length filter where the filter would + buffer all the output from a CGI before sending any bytes + down the filter stack to the network. This problem would cause + significant memory consumption if the CGIs generated + lots of bytes. [Bill Stoddard] + + *) Get non-blocking CGI pipe reads working with the bucket brigades. + [Bill Stoddard] + + *) Fix seg fault on Windows when serving files cached with mod_file_cache. + [Bill Stoddard] + + *) Fix a bug in the threaded MPM that would cause it to kill off all + workers immediately after starting if the number of workers started + was above a certain threshold. [Ryan Bloom, Bill Stoddard] + +Changes with Apache 2.0.19 + + *) Fix problem with threaded MPM. The problem was that if each child + process was busy serving a single long-lived request and the server + was sent a graceful restart signal, the server would stop serving + requests. This would happen because each child process would wait to + die until the last thread was done, and the parent wouldn't spawn any + new children until a process died. Now, the parent looks at the fact + that the children are dying gracefully, and starts new children. + Those new children only start enough threads to compliment the number + of threads in the other child process that shares the same spot in + the scoreboard. In this way, we make sure to never go over + MaxClients. [Ryan Bloom] + + *) modified mod_negotiation and mod_autoindex to speed up by almost a + factor of two on apr_dir_read()-enhanced platforms, such as Win32 + and OS2, by calling ap_sub_request_lookup_dirent() with the results + already provided by apr_dir_read(). [William Rowe] + + *) mod_file_cache is now more robust to filtering and serves requests + slightly more efficiently. [Cliff Woolley] + + *) Fix problem handling FLUSH bucket in the chunked encoding filter. + Module was calling ap_rwrite() followed by ap_rflush() but the + served content was not being displayed in the browser. Inspection + of the output stream revealed that the first data chunk was + missing the trailing CRLF required by the RFC. [Bill Stoddard] + + *) apxs no longer generates ap_send_http_header() in the example handler + + *) Fix an ab problem which could cause a divide-by-zero exception + with certain invocations (e.g., ab -k -c 6 -n 100 localhost/). + [Ian Holsman ] + + *) Solve case-insensitive platforms' confusion about negotiated + filenames, allowing files of differnt case to match in choosing + the document to serve. [William Rowe] + + *) Fix brokenness when ThreadsPerChild is higher than the built-in + limit. We left ap_threads_per_child at the higher value which + led to segfaults when doing certain scoreboard operations. + [Jeff Trawick] + + *) Fix seg faults and/or missing output from mod_include. The + default_handler was using the subrequest pool for files and + MMAPs, even though the associated APR structures typically + live longer than the subrequest. [Greg Ames] + + *) Extend mod_setenvif to support specifying regular expressions + on the SetEnvIf (and SetEnvIfNoCase) directive attribute field. + Example: SetEnvIf ^TS* [a-z].* HAVE_TS + will cause HAVE_TS to be set if any of the request headers begins + with "TS" and has a value that begins with any character in the + set [a-z]. [Bill Stoddard] + + *) httpd children now re-bind themselves to a random CPU on + multiprocessor systems on AIX via bindprocessor() in 2.0. + [Victor J. Orlikowski] + + *) Fix htdigest. It would go into a loop in getline when adding + a second user. [Bill Stoddard] + + *) Win32 platforms now fully support mod_userdir options. [Will Rowe] + + *) Automatically generate httpd.exp for AIX. + DSOs now work again on AIX in 2.0 + [Victor J. Orlikowski] + + *) Add a new request hook, error_log. This phase allows modules + to act on the error log string _after_ it has been written + to the error log. The goal for this hook is to allow monitoring + modules to send the error string to the monitoring agent. + [Ryan Bloom] + + *) Modify mod_echo to make it use filters for input and output. + [Ryan Morgan ] + + *) Extend mod_headers to support conditional driven Header + add, append and set. Use SetEnvIf to set an envar and conditionally + add/append/set headers based on this envar thusly: + + SetEnvIf TSMyHeader value HAVE_TSMyHeader + Header add MyHeader "%t %D" env=HAVE_TSMyHeader + + If the request contains header "TSMyHeader: value" then header + MyHeader: "t=xxxxxxxxxx D=yyyy" will be sent on the response. + [Bill Stoddard] + + *) Extend mod_headers to support using format specifiers on Header + add, append and set header values. Two format specifiers are supported: + + %t - reports, in UTC microseconds since the epoch, when the + request was received. + + %D - reports the time, in microseconds, between when the request was + received and the response sent. + + Examples: + Header add MyHeader "This request served in %D microseconds. %t" + + results in a header being added to the response that looks like this: + + MyHeader: This request served in D=5438 microseconds. t=991424704447256 + + [Bill Stoddard] + + *) Fix reset_filter(). We need to be careful how we remove filters. + If we set r->output_filters to NULL, we also have to reset the + connection's filters. [John Sterling] + + *) Optimise reset_filter() in http_protocol.c. [Greg Stein] + + *) Add a check to ap_die() to make sure the filter stack is sane and + contains the correct basic filters when an error occurs. This fixes + a problem where headers are not being sent on error. [John Sterling] + + *) New Header directive 'echo' option. "Header echo regex" will + cause any headers received on the request that match regex to be + echoed to (included in) the response headers. + [Bill Stoddard] + + *) include/ap_compat.h tested and set APR_COMPAT_H instead of AP_COMPAT_H. + This prevented the inclusion of apr_compat.h. PR #7773 + [Oleg Broytmann ] + + *) Moved util_uri to the apr-util library. This required a bunch of + apr_name changes for the uri utility functions. [Justin Erenkrantz] + + *) Move the addition of default AP_HTTP_HTTP_HEADER filters to the + insert_filter phase so that other filters are not bypassed by default. + [Graham Leggett] + + *) Reimplement mod_headers as an output filter. mod_headers can now + add custom headers to inbound requests using the RequestHeader directive + and to responses using the same old Header directive. [Graham Leggett] + +Changes with Apache 2.0.18 + + *) Fix command-line processing so that if a bad argument is specified + Apache will exit. [Jeff Trawick] + + *) Change the make targets and rules to be consistent in all of the + Apache-owned source trees. [Roy Fielding] + + *) Fix processing of the TRACE method. Previously we passed bogus + parms to form_header_field() and it overlaid some vhost structures, + resulting in a segfault in check_hostalias(). + [Greg Ames, Jeff Trawick] + + *) Win32: Add support for reliable piped logs. If the logging process + goes down, Apache will automatically restart it. This function has + been part of Apache on Unix/Linux/BSD since the early v1.3 releases. + [Bill Stoddard] + + *) Do not start piped log processes during the config file + preflight. This change also circumvents a problem on + Windows where the rotatelog processes created during preflight + was not getting cleaned up properly. + [Bill Stoddard] + + *) add "Request Phase Participation" info to mod_info + [Doug MacEachern] + + *) Make first phase changes to the scoreboard data structures in + preparation for the rewriting of the scoreboard per my posted + design notes. [Paul J. Reder] + + *) Fix httpd's definition of LTFLAGS to be consistent with that of apr + and apr-util, allow it to be overridden by the configure command-line + (default="--silent") and introduce LT_LDFLAGS to replace what we were + formerly abusing as LTFLAGS. [Roy Fielding] + + *) Clean up the reporting of incorrect closing container tags. + [Barrie Slaymaker ] + + *) Simplify the configure process by moving all libtool stuff to APR + and moving hints.m4 inline. [Roy Fielding] + + *) Add the AP_DECLARE()/AP_CORE_DECLARE macros on the return types + of functions used by mod_proxy for export in the DLL + [Ian Holsman ] + + *) Prevent a hang when a cgi handled by mod_cgid tries to read a + request body from its stdin but no reqest body is being written to + the cgi. [Jeff Trawick] + + *) mod_log_config: %c connection status incorrectly logged + as "-" (non-keepalive) when MaxKeepAliveRequests is set to 0. + [Bill Stoddard] + + *) Get mod_cern_meta working under Windows + [Bill Stoddard] + + *) Create Files, and thus MMAPs, out of the request pool, not the + connection pool. This solves a small resource leak that had us + not closing files until a connection was closed. In order to do + this, at the end of the core_output_filter, we loop through the + brigade and convert any data we have into a single HEAP bucket + that we know will survive clearing the request_rec. + [Ryan Bloom, Justin Erenkrantz , + Cliff Woolley] + + *) Completely revamp configure so that it preserves the standard make + variables CPPFLAGS, CFLAGS, CXXFLAGS, LDFLAGS and LIBS by moving + the configure additions to EXTRA_* variables. Also, allow the user + to specify NOTEST_* values for all of the above, which eliminates the + need for THREAD_CPPFLAGS, THREAD_CFLAGS, and OPTIM. Fix the setting + of INCLUDES and EXTRA_INCLUDES. Check flags as they are added to + avoid pointless duplications. Fix the order in which flags are given + on the compile and link lines. Remove obsolete macros APR_DOEXTRA, + AC_ADD_LIBRARY, AC_CHECK_DEFINE, APACHE_PASSTHRU, and APACHE_ONCE. + Added APR_SAVE_THE_ENVIRONMENT and APR_RESTORE_THE_ENVIRONMENT macros. + Renamed AC_TYPE_RLIM_T macro to APACHE_TYPE_RLIM_T. [Roy Fielding] + + *) Get mod_tls to compile/work better on Windows. PR #7612 + [Bernhard Schrenk ] + + *) Fix shutdown/restart hangs in the threaded MPM. + [Jeff Trawick, Greg Ames, Ryan Bloom] + + *) Removed the keptalive boolean from conn_rec because it is now only + used by a single routine and can be replaced by a local variable. + [Greg Stein, Ryan Bloom, Roy Fielding] + + *) Patch prefork to put enough of the signal processing back in so that + signals are all handled properly now. The previous patch fixed the + deadlock race condition, but broke the user directed signal handling. + This fixes it to work the way it did before my previous prefork patch + (primarily, SIGTERM is now working). + + *) Change how input filters decide how much data is returned to the + higher filter. We used to use a field in the conn_rec, with this + change, we use an argument to ap_get_brigade to determine how much + data is retrieved. [Ryan Bloom] + + *) Fix seg fault at start-up introduced by Ryan's change to enable + modules to specify their own logging tags. mod_log_config + registers an optional function, ap_register_log_handler(). + ap_register_log_handler() was being called by http_core before + the directive hash table was created. This patch creates the + directive hash table before ap_register_log_handler() is + registered as an optional function. + [jean-frederic clere ] + + *) Add ap_set_int_slot() function + [John K. Sterling ] + + *) Under certain circumstances, Apache did not supply the + right response headers when requiring authentication. + [Gertjan van Wingerde ] PR#7114 + (This is a port of the change that went into Apache 1.3.19.) + + *) Allow modules to specify their own logging tags. This basically + allows a module to tell mod_log_config that when %x is encountered + a specific function should be called. Currently, x can be any single + character. It may be more useful to make this a string at some point. + [Ryan Bloom] + +Changes with Apache 2.0.17 + + *) If a higher-level filter handles the byterange aspects of a + request, then the byterange filter should not try to redo the + work. The most common case of this happening, is a byterange + request going through the proxy, and the origin server handles + the byterange request. The proxy should ignore it. + [Graham Leggett ] + + *) Changed the threaded mpm to have child_main join to each of the + worker threads to make sure the kids are all gone before child_main + exits after a signal (cleanup from perform_idle_server_maintenance). + This is an extension of Ryans recent commit to make the child_main + the signal thread. + + *) Add more options to the ap_mpm_query function. This also allows MPMs to + report if their threads are dynamic or static. Finally, this also + implements a new API, ap_show_mpm, which returns the MPM that was + required into the core. [Harrie Hazewinkel ] + + *) Do not install the binaries from the support directory twice. + [jun-ichiro hagino ] + + *) The ap_f* functions should flush data to the filter that is passed + in, not the filter after the one passed in. + [Ryan Morgan ] + + *) Make ab work again by changing its native types to apr types and formats. + [Justin Erenkrantz ] + + *) Move the byterange filter and all of the supporting functions back + to the HTTP module. The byterange filter turned out to be very + HTTP specific, and it belongs in the HTTP module. [Greg Stein] + + *) Make clean, distclean, and extraclean consistently according to the + Gnu makefile guidelines. [Justin Erenkrantz ] + + *) Fix errors in the renaming of the apr_threadattr_detach_xxx functions. + This may have been causing problems stopping processes in the threaded + mpm's. [Greg Ames] + + *) Fix content-length in mod_negotiation to a long int representation. + [William Rowe] + + *) Remove BindAddress from the default config file. + [] + + *) Allow module authors to add a module to their Apache build using + --with-module, without re-running buildconf. The syntax is: + --with-module=module_type:/path/to/module.c + The configure script will copy the module.c file to + modules/module_type, and it will be added to the relevant Makefiles. + currently, this only works for static modules. [Ryan Bloom] + + *) Changes required to make prefork clean up idle children properly. + There was a window during which a starting worker deadlocks when + an idle cleanup arrives before it completes init. Apache then keeps + trying to cleanup the same deadlocked worker forever (until higher + pids come along, but it still will never reduce below the deadlocked + pid). Thus the number of children would not reduce to the correct + idle level. [Paul J. Reder] + +Changes with Apache 2.0.16 + + *) Change the default installation directory to /usr/local/apache2, + as now defined by the "Apache" layout in config.layout. [Marc Slemko] + + *) OS/2: Added support for building loadable modules as OS/2 DLLs. + [Brian Havard] + + *) Get MaxRequestsPerChild working with the Windows MPM. + [Bill Stoddard] + + *) Make generic hooks to work, with mod_generic_hook_import/export + experimental modules. [Ben Laurie, Will Rowe] + + *) Fix segfaults for configuration file syntax errors such as + "" followed by "" followed by "". [Jeff Trawick] + + *) Cleanup the --enable-layout option of configure. This makes + us use a consistent location for the config.layout file, and it + makes configure more portable. + [jun-ichiro hagino ] + + *) Changes to 'ab'; fixed int overrun's, added statistics, output in + csv/gnuplot format, rudimentary ssl support and various other tweaks + to make results more true to what is measured. The upshot of this it + turns out that 'ab' has often underreported the true performance of + apache. Often by a order of magnitude :-) See talk/paper of Sander + Temme at April ApacheCon 2001 for details. + [Dirk-Willem van Gulik] + + *) Clean up mod_cgid's temporary request pool. Besides fixing a + storage leak this ensures that some unnecessary pipes are closed. + [Jeff Trawick] + + *) Performance: Add quick_handler hook. This hook is called at the + very beginning of the request processing before location_walk, + translate_name, etc. This hook is useful for URI keyed content + caches like Mike Abbott's Quick Shortcut Cache. + [Bill Stoddard] + + *) top_module global variable renamed to ap_top_module [Perl] + + *) Move ap_set_last_modified to the core. This is a potentially + controversial change, because this is kind of HTTP specific. However + many protocols should be able to take advantage of this kind of + information. I expect that headers will need one more layer of + indirection for multi-protocol work, but this is a small step in + the right direction. [Ryan Bloom] + + *) Enable mod_status by default. This matches what Apache 1.3 does. + [Ed Korthof] + + *) Add a ScriptSock directive to the default config file. This is + only enabled when mod_cgid is used. + [Taketo Kabe ] + +Changes with Apache 2.0.15 + + *) Untangled the buildconf script and eliminated the need for build's + aclocal.m4, generated_lists, build.mk, build2.mk, and a host of other + libtool muck that is now under srclib/apr/build. [Roy Fielding] + + *) Win32: Don't accept more connections than we have worker threads + to handle. + [Bill Stoddard] + + *) Fix bug in the Unix threaded.c MPM that allowed child processes + to fork() new child processes. + [Bill Stoddard] + + *) SECURITY: Fix a major security problem with double-reverse lookup + checking. Previously, a client connecting over IPv4 would not be + matched properly when the server had an IPv6 listening socket. + PR #7407 [Taketo Kabe ] + + *) Change the way the beos MPM handles polling to allow it to stop and + restart. Problem was the sockets being polled were being reset by + the select call, so once it had accepted a connection it was no + longer listening on the UDP socket we use for shutdown instructions. + APR needs to be altered, patch on it's way. [David Reid] + + *) Empty out the brigade shared by ap_getline()/ap_get_client_block() + on error exit from ap_getline(). Some other code got upset because + the wrong data was in the brigade. [Greg Ames, Jeff Trawick] + + *) Handle ap_discard_request_body() being called more than once. + [Greg Ames, Jeff Trawick] + + *) Get rid of an inadvertent close of file descriptor 2 in + mod_mime_magic. [Greg Ames, Jeff Trawick] + + *) Add a hook, create_request. This hook allows modules to modify + a request while it is being created. This hook is called for all + request_rec's, main request, sub request, and internal redirect. + When this hook is called, the r->main, r->prev, r->next + pointers have been set, so modules can determine what kind of + request this is. [Ryan Bloom] + + *) Cleanup the build process a bit more. The Apache configure + script no longer creates its own helper scripts, it just + uses APR's. + [jean-frederic clere ] + + *) Stop the forced downgrade of the connection to HTTP/1.0 for + proxy requests. [Graham Leggett] + + *) Avoid using sscanf to determine the HTTP protocol number in + the common case because sscanf is a performance hog. From + Mike Abbot's Accelerating Apache patch number 6. + [Mike Abbot , Bill Stoddard] + + *) SECURITY: Fix a security exposure in mod_access. Previously when + IPv6 listening sockets were used, allow/deny-from-IPv4-address rules + were not evaluated properly (PR #7407). Also, add the ability to + specify IPv6 address strings with optional prefix length on Allow + and Deny. [Jeff Trawick] + + *) Enhance rotatelogs so that a UTC offset can be specified, and + the logfile name can be formatted using strftime(3). (Brought + forward from 1.3.) [Ken Coar] + + *) Reimplement the Windows MPM (mpm_winnt.c) to eliminate calling + DuplicateHandle on an IOCompletionPort (a practice which + MS "discourages"). The new model does not rely on associating + the completion port with the listening sockets, thus the + completion port can be completely managed within the child + process. A dedicated thread accepts connections off the network, + then calls PostQueuedCompletionStatus() to wake up worker + threads blocked on the completion port. + [Bill Stoddard] + + *) Bring forward the --suexec-umask option which allows the + builder to preset the umask for suexec processes. [Ken Coar] + + *) Add a -V flag to suexec, which causes it to display the + compile-time settings with which it was built. (Only + usable by root or the AP_HTTPD_USER username.) [Ken Coar] + + *) Mod_include should always unset the content-length if the file is + going to be passed through send_parsed_content. There is no to + determine if the content will change before actually scanning the + entire content. It is far safer to just remove the C-L as long + as we are scanning it. [Ryan Bloom] + + *) Make sure Apache sends WWW-Authenticate during a reverse proxy + request and not Proxy-Authenticate. + [Graham Leggett ] + +Changes with Apache 2.0.14 + + *) Fix content-length computation. We ONLY compute a content-length if + We are not in a 1.1 request and we cannot chunk, and this is a keepalive + or we already have all the data. [Ryan Bloom] + + *) Report unbounded containers in the config file. Previously, a typo + in the directive could result in the rest of the config + file being silently ignored, with undesired defaults used. + [Jeff Trawick] + + *) Make the old_write filter use the ap_f* functions for the buffering. + [Ryan Bloom] + + *) Move more code from the http module into the core server. This + is core code, basically the default handler, the default input + and output filters, and all of the core configuration directives. + All of this code is required in order for the server to work, with or + without HTTP. The server is closer to working without the HTTP + module, although there is still more to do. [Ryan Bloom] + + *) Fix a number of SGI compile warnings throughout the server. Fix some + bad parameters to apr_bucket_read(). Fix a bad statement in + ap_method_in_list(). For the mod_rewrite cache use apr_time_t + consistently; we were mixing apr_time_t and time_t in invalid ways + before. In load_file(), call apr_dso_error() instead of + apr_strerror() so that we get a more specific string on some platforms. + PR #6980 [Jeff Trawick] + + *) Allow modules to query the MPM about it's execution profile. This + query API can and should be extended in the future, but for now, + max_daemons, and threading or forking is a very good start. + [Jon Travis ] + + *) Modify mod_include to send blocks of data no larger than 9k. + Without this, mod_include will wait until the whole file is parsed, + or the first tag is found to send any data to the client. + [Paul J. Reder ] + + *) Fix mod_info, so that and directives are + not displayed twice when displaying the current configuration. + [Ryan Morgan ] + + *) Add config directives to override DEFAULT_ERROR_MSG and + DEFAULT_TIME_FORMAT. This was sent in as PR 6193. + [Dan Rench ] + + *) Get mod_info building and loading on Win32. [William Rowe] + + *) Begin to move protocol independant functions out of mod_http. The goal + is to have only functions that are HTTP specific in the http directory. + [Ryan Bloom] + +Changes with Apache 2.0.13 + + *) Don't assume that there will always be multiple calls to the byterange + filter. It is possible that we will need to do byteranges with only + one call to the filter. [Ryan Morgan ] + + *) Move the error_bucket definition from the http module to the + core server. Every protocol will need this ability, not just + HTTP. [Ryan Bloom] + +Changes with Apache 2.0.12 + + *) Modify mod_file_cache to save pre-formatted strings for + content-length and last-modified headers for performance. + [Mike Abbot ] + + *) Namespace protect IOBUFSIZ since it is exposed in the API. + [Jon Travis ] + + *) Use "Basic" authentication instead of "basic" in ab, as the spec + says we should. [Andre Breiler ] + + *) Fix a seg fault in mod_userdir.c. We used to use the pw structure + without ever filling it out. This fixes PR 7271. + [Taketo Kabe and + Cliff Woolley ] + + *) Add a couple of GCC attribute tags to printf style functions. + [Jon Travis ] + + *) Add the correct language tag for interoperation with the Taiwanese + versions of MSIE and Netscape. [Clive Lin ] PR#7142 + + *) Migrate the perchild MPM to use the new apr signal child, and + APR thread functions. [Ryan Bloom] + + *) Close one copy of the CGI's stdout before creating the new process. + The CGI will still have stdout, because we have already dup'ed it. + This keeps Apache from waiting forever to send the results of a CGI + process that has forked a long-lived child process. + [Taketo Kabe ] + + *) Remove the rest of the pthreads functions from the threaded MPM. + This requires the APR support for a signal thread that was just + added. [Ryan Bloom] + + *) Make mod_dir use a fixup for sending a redirect to the browser. + Before this, we were using a handler, which doesn't make much + sense, because the handler wasn't generating any data, it would + either return a redirect error code, or DECLINED. This fits the + current hooks better. [Ryan Morgan ] + + *) Make the threaded MPM use APR threads instead of pthreads. + [Ryan Bloom] + + *) Get mod_tls to the point where it actually appears to work in all cases. + [Ben Laurie] + + *) implement --enable-modules and --enable-mods-shared for "all" and + "most". [Greg Stein] + + *) Move the threaded MPM to use APR locks instead of pthread locks. + [Ryan Bloom] + + *) Rename mpmt_pthread to threaded. This is more in line with the + fact that mpmt_pthread shouldn't be using pthreads directly, and + it is a smaller name that doesn't tie into anything. + [Ryan Bloom] + + *) Rename the module structures so that the exported symbol matches + the file name, and it is easier to automate the installation + process (generating LoadModule directives from the module filenames). + [Martin Kraemer] + + *) Remove the coalesce filter. With the ap_f* functions, this filter + is no longer needed. [Ryan Bloom] + +Changes with Apache 2.0.11 + + *) Remove the dexter MPM. Perchild is the same basic idea, but it has the + added feature of allowing a uid/gid per child process. If no + uid/gid is specified, then Perchild behaves exactly like dexter. + [Ryan Bloom] + + *) Get perchild building again. [Ryan Bloom] + + *) Don't disable threads just because we are using the prefork MPM. + If somebody wants to compile without threads, they must now add + --disable-threads to the configure command line. [Ryan Bloom] + + *) Begin to move the calls to update_child_status into common code, so + that each individual MPM does not need to update the scoreboard itself. + [Ryan Bloom] + + *) Allow mod_tls to compile under Unix boxes where openssl has been + installed to the system include files. + [Gomez Henri ] + + *) Cleanup the mod_tls configure process. This should remove any need + to hand-edit any files. We require OpenSSL 0.9.6 or later, but + configure doesn't check that yet. [Ryan Bloom] + + *) Add a very early prototype of SSL support (in mod_tls.c). It is + vital that you read modules/tls/README before attempting to build + it. [Ben Laurie] + + *) Fix a potential seg fault on all platforms. David Reid fixed this + on BEOS, but the problem could happen anywhere, so we don't want + to #ifdef it. [Cliff Woolley ] + + *) Add new LogFormat directive, %D, to log time it takes to serve a + request in microseconds. [Bill Stoddard] + + *) Change AddInputFilter and AddOutputFilter to SetInputFilter and + SetOutputFilter. This corresponds nicely with the other Set + directives, which operate on containers while the Add* directives + tend to work directly on extensions. [Ryan Bloom] + + *) Cleanup the header handling a bit. This uses the apr_brigade_* + functions for the buffering so that we don't need to compute + the length of the headers before we actually create the header + buffer. [Ryan Bloom] + + *) Allow filters to buffer data using the ap_f* functions. These have + become macros that resolve directly to apr_brigade_*. + [Ryan Bloom] + + *) Get the Unix MPM's to do a graceful restart again. If we are going + to register a cleanup with ap_cleanup_scoreboard, then we have to + kill the cleanup with the same function, and that function can't be + static. [Ryan Bloom] + + *) Install all required header files. Without these, it was not + possible to compile some modules outside of the server. + [Ryan Bloom] + + *) Fix the AliasMatch directive in Apache 2.0. When we brought a patch + forward from 1.3 to 2.0, we missed a single line, which broke regex + aliases. [Ryan Bloom] + + *) We have a poor abstraction in the protocol. This is a temporary + hack to fix the bug, but it will need to be fixed for real. If + we find an error while sending out a custom error response, we back + up to the first non-OK request and send the data. Then, when we send + the EOS from finalize_request_protocol, we go to the last request, + to ensure that we aren't sending an EOS to a request that has already + received one. Because the data is sent on a different request than + the EOS, the error text never gets sent down the filter stack. This + fixes the problem by finding the last request, and sending the data + with that request. [Ryan Bloom] + + *) Make the server status page show the correct restart time, and + thus the proper uptime. [Ryan Bloom] + + *) Move the CGI creation logic from mod_include to mod_cgi(d). This + should reduce the amount of duplicate code that is required to + create CGI processes. + [Paul J. Reder ] + + *) ap_new_connection() closes the socket and returns NULL if a socket + call fails. Usually this is due to a connection which has been + reset. [Jeff Trawick] + + *) Move the Apache version information out of httpd.h and into release.h. + This is in preparation for the first tag with the new tag and release + system. [Ryan Bloom] + + *) Begin restructuring scoreboard code to enable adding back in + the ability to use IPC other than shared memory. + Get mod_status working on Windows again. [Bill Stoddard] + + *) Make mod_status work with 2.0. This will work for prefork, + mpmt_pthread, and dexter. [Ryan Bloom] + + *) Correct a typo in httpd.conf. + [Kunihiro Tanaka ] PR#7154 + + *) Really fix mod_rewrite map lookups this time. [Tony Finch] + + *) Get the correct IP address if ServerName isn't set and we can't + find a fully-qualified domain name at startup. + PR#7170 [Danek Duvall ] + + *) Make mod_cgid work with SuExec. [Ryan Bloom] + + *) Adopt apr user/group name features for mod_rewrite. Eliminates some + 'extra' stat's for user/group since they should never occur, and now + resolves the SCRIPT_USER and SCRIPT_GROUP, including on WinNT NTFS + volumes. [William Rowe] + + *) Adopt apr features to simplify mod_includes. This changes the + behavior of the USER_NAME variable, unknown uid's are now reported + as USER_NAME="" rather than the old user#000 result. + WinNT now resolves USER_NAME on NTFS volumes. [William Rowe] + + *) Adopt apr features for simplifing mod_userdir, and accept the new + Win32/OS2 exceptions without hiccuping. [William Rowe] + + *) Replace configure --with-optim option by using and saving the + environment variable OPTIM instead. This is needed because configure + options do not support multiple flags separated by spaces. + [Roy Fielding] + + *) Fix some byterange handling. If we get a byte range that looks like + "-999999" where that is past the end of the file, we should return + a PARTIAL CONTENT status code, and return the whole file as one big + byterange. This matches the 1.3 handling now. [Ryan Bloom] + + *) Make the error bucket a real meta-data bucket. This means that the + bucket length is 0, and a read returns NULL data. If one of these + buckets is passed down after the headers are sent, this data will + just be ignored. [Greg Stein] + + *) The prefork MPM wasn't killing child processes correctly if a restart + signal was received while the process was serving a request. The child + process would become the equivalent of a second parent process. If + we break out of the accept loop, then we need to do die after cleaning + up after ourselves. [Ryan Bloom] + + *) Change the Prefork MPM to use SIGWINCH instead of SIGUSR1 for graceful + restarts. [Ryan Bloom] + + *) Modify the apr_stat/lstat/getfileinfo calls within apache to use + the most optimal APR_FINFO_wanted bits. This spares Win32 from + performing very expensive owner, group and permission lookups + and allows the server to function until these apr_finfo_t fields + are implemented under Win32. [William Rowe] + + *) Support for typedsafe optional functions - that is functions exported by + optional modules, which, therefore, may or may not be present, depending + on configuration. See the experimental modules mod_optional_fn_{ex,im}port + for sample code. [Ben Laurie] + + *) filters can now report an HTTP error to the server. This is done + by sending a brigade where the first bucket is an error_bucket. + This bucket is a simple bucket that stores an HTTP error and + a string. Currently the string is not used, but it may be needed + to output an error log. The http_header_filter will find this + bucket, and output the error text, and then return + AP_FILTER_ERROR, which informs the server that the error web page + has already been sent. [Ryan Bloom] + + *) If we get an error, then we should remove all filters except for + those critical to serving a web page. This fixes a bug, where + error pages were going through the byterange filter, even though + that made no sense. [Ryan Bloom] + + *) Relax the syntax checking of Host: headers in order to support + iDNS. PR#6635 [Tony Finch] + + *) Cleanup the byterange filter to use the apr_brigade_partition + and apr_bucket_copy functions. This removes a lot of very messy + code, and hopefully makes this filter more stable. + [Ryan Bloom] + + *) Remove AddModule and ClearModuleList directives. Both of these + directives were used to ensure that modules could be enabled + in the correct order. That requirement is now gone, because + we use hooks to ensure that modules are in the correct order. + [Ryan Bloom] + + *) When SuExec is specified, we need to add it to the list of + targets to be built. If we don't, then any changes to the + configuration won't affect SuExec, unless 'make suexec' is + specifically run. [Ryan Bloom] + + *) Cleaned out open_file from mod_file_cache, as apr now accepts + the APR_XTHREAD argument to open a file for consumption by + parallel threads on win32. [William Rowe] + + *) Correct a bug in determining when we follow symlinks. The code + expected a stat -1 result, not an apr_status_t positive error. + Also check if the APR_FINFO_USER fields are valid before we + follow the link. [William Rowe] + + *) Move initgroupgs, ap_uname2id and ap_gname2id from util.c to + mpm_common.c. These functions are only valid on some platforms, + so they should not be in the main-line code. [Ryan Bloom] + + *) Remove ap_chdir_file(). This function is not thread-safe, + and nobody is currently using it. [Ryan Bloom] + + *) Do not try to run make depend if there are no .c files in the + current directory, doing so makes `make depend` fail. + [Ryan Bloom] + + *) Update highperformance.conf to work with either prefork or + pthreads mpms. [Greg Ames] + + *) Stop checking to see if this is a pipelined request if we know + for a fact that it isn't. Basically, if r->connection->keepalive == 0. + This keeps us from making an extra read call when serving a 1.0 + request. [Ryan Bloom and Greg Stein] + + *) Fix the handling of variable expansion look-ahead in mod_rewrite, + i.e. syntax like %{LA-U:REMOTE_USER}, and also fix the parsing of + more complicated nested RewriteMap lookups. PR#7087 [Tony Finch] + + *) Fix the RFC number mentioned when complaining about a missing + Host: header. PR#7079 [Alexey Toptygin ] + + *) Fix an endless loop in ab which occurred when ab was posting + and the server dropped the connection unexpectedly. + [Jeff Trawick] + + *) Fix a segfault while handling request bodies in ap_http_filter(). + This problem has been seen with mod_dav usage as well as with + requests where the body was just being discarded. [Jeff Trawick] + + *) Some adjustment on the handling and automatic setting (via + hints.m4) of various compilation flags (eg: CFLAGS). Also, + add the capability to specify flags (NOTEST_CFLAGS and + NOTEST_LDFLAGS) which are used to compile Apache, but + not used during the configuration process. Useful for + flags like "-Werror". [Jim Jagielski] + + *) Stop using environment variables to force debug mode or + no detach. We now use the -D command line argument to + specify the correct mode. -DONE_PROCESS and -DNO_DETACH. + [Greg Stein, Ryan Bloom] + + *) Change handlers to use hooks. [Ben Laurie] + + *) Stop returning copies of filenames from both apr_file_t and + apr_dir_t. We pstrdup the filenames that we store in the + actual structures, so we don't need to pstrdup the strings again. + [Ryan Bloom] + + *) mod_cgi: Fix some problems where the wrong error value was being + traced. [Jeff Trawick] + + *) EBCDIC: Fix some missing ASCII conversion on some protocol data. + [Jeff Trawick] + + *) Add generic hooks. [Ben Laurie] + + *) Use a real pool to dup the error log descriptor. [Ryan Bloom] + + *) Fix a segfault caused by mod_ext_filter when the external filter + program does not exist. [Jeff Trawick] + + *) Fix an output truncation error when on an HTTP >= 1.0 request an + object of size between DEFAULT_BUCKET_SIZE and AP_MIN_BYTES_TO_WRITE + was served through mod_charset_lite (or anything else that would + create a transient bucket in this size range). ap_bucket_make_heap() + silently failed (fixed), transient_setaside() discovered it, but + ap_save_brigade() ignored it (fixed). [Jeff Trawick] + + *) Ignore \r\n or \n when using PEEK mode for input filters. The problem + is that some browsers send extra lines at the end of POST requests, and + we don't want to delay sending data back to the user just because the + browser isn't well behaved. [Ryan Bloom] + + *) Get SuEXEC working again. We can't send absolute paths to suExec + because it refuses to execute those programs. SuEXEC also wasn't + always recognizing configuration changes made using the autoconf + setup. [Ryan Bloom] + + *) Allow the buildconf process to find the config.m4 files in the correct + order. Basically, we can now name config.m4 files as config\d\d.m4, + and we will sort them correctly when inserting them into the build + process. [Ryan Bloom] + + *) Get mod_cgid to use apr calls for creating the actual CGI process. + This also allows mod_cgid to use ap_os_create_priviledged_process, + thus allowing for SuExec execution from mod_cgid. Currently, we do + not support everything that standard SuExec supports, but at least + it works minimally now. [Ryan Bloom] + + *) Allow SuExec to be configured from the ./configure command line. + [Ryan Bloom] + + *) Update some of the docs in README and INSTALL to reflect some of + the changes in Apache 2.0 [Cliff Woolley ] + + *) If we get EAGAIN returned from the call to apr_sendfile, then we + need to call sendfile again. This gets us serving large files + such as apache_2.0a9.tar.gz on FreeBSD again. [Ryan Bloom] + + *) Get the support programs building cleanly again. + [Cliff Woolley ] + + *) The Apache/Win32 Apache.exe and dll's now live in bin. The + current directory logic now backs up over bin/ to determine the + server root from the Apache.exe path. + + *) Apache/Win32 now follows the standard conventions of mod_foo.so + loadable modules, dynamic libs are all named libfoo.dll, and the + makefile.win populates the include, lib and libexec directories. + + *) Apache is now IPv6-capable. On systems where APR supports IPv6, + Apache gets IPv6 listening sockets by default. Additionally, the + Listen, NameVirtualHost, and directives support IPv6 + numeric address strings (e.g., "Listen [fe80::1]:8080"). + [Jeff Trawick] + + *) Modify the install directory layout. Modules are now installed in + modules/. Shared libraries should be installed in libraries/, but + we don't have any of those on Unix yet. All install directories + are modifyable at configure time. [Ryan Bloom] + + *) Install all header files in the same directory on Unix. [Ryan Bloom] + + *) Get the functions in server/linked into the server, regardless of + which modules linked into the server. This uses the same hack + for Apache that we use for APR and apr-util to ensure all of the + necessary functions are linked. As a part of thise, the CHARSET_EBCDIC + was renamed to AP_CHARSET_EBCDIC for namespace protection, and to make + the scripts a bit easier. + [Ryan Bloom] + + *) Rework the RFC1413 handling to make it thread-safe, use a timeout + on the query, and remove IPv4 dependencies. [Jeff Trawick] + + *) Get all of the auth modules to the point that they will install and + be loadable into the server. Our new build/install mechanism expects + that all modules will have a common name format. The auth modules + didn't use that format, so we didn't install them properly. + [Ryan Bloom] + + *) API routines ap_pgethostbyname() and ap_pduphostent() are no longer + available. Use apr_getaddrinfo() instead. [Jeff Trawick] + + *) Get "NameVirtualHost *" working in 2.0. [Ryan Bloom] + + *) Return HTTP_RANGE_NOT_SATISFIABLE if the every range requested starts + after the end of the response. [Ryan Bloom] + + *) Get byterange requests working with responses that do not have a + content-length. Because of the way byterange requests work, we have to + have all of the data before we can actually do the byterange, so we + can compute the content-length in the byterange filter. + [Ryan Bloom] + + *) Get exe CGI's working again on Windows. + [Allan Edwards] + + *) Get mod_cgid and mod_rewrite to work as DSOs by changing the way + they keep track of whether or not their post config hook has been + called before. Instead of a static variable (which is replaced when + the DSO is loaded a second time), use userdata in the process pool. + [Jeff Trawick] + +Changes with Apache 2.0a9 + + *) Win32 now requires perl to complete the final install step for users + to build + install on Win32. Makefile.win now rewrites @@ServerRoot@ + and installs the conf, htdocs and htdocs/manual directories. + [William Rowe] + + *) Make mod_include use a hash table to associate directive tags with + functions. This allows modules to implement their own SSI tags easily. + The idea is simple enough, a module can insert it's own tag and function + combination into a hash table provided by mod_include. While mod_include + parses an SSI file, when it encounters a tag in the file, it does a + hash lookup to find the function that implements that tag, and passes + all of the relevant data to the function. That function is then + responsible for processing the tag and handing the remaining data back + to mod_include for further processing. + [Paul J. Reder ] + + *) Get rid of ap_new_apr_connection(). ap_new_connection() now has + fewer parameters: the local and remote socket addresses were removed + from the parameter list because all required information is available + via the APR socket. [Jeff Trawick] + + *) Distribution directory structure reorganized to reflect a + normal source distribution with external install targets. + [Roy Fielding] + + *) The MPMs that need multiple segments of shared memory now create + two apr_shmem_t variables, one for each shared memory allocation. + the problem is that we can't determine how much memory will be required + for shared memory allocations once we try to allocate more than one + variable. The MM code automatically aligns the shared memory allocations, + so we end up needing to pad the amount of shared memory we want based + on how many variables will be allocated out of the shared memory segment. + It is just easier to create a second apr_shmem_t variable, and two + shmem memory blocks. + [Ryan Bloom] + + *) Cleanup the export list a bit. This creates a single unified list of + functions exported by APR. The export list is generated at configure + time, and that list is then used to generate the exports.c file. + Because of the way the export list is generated, we only export those + functions that are valid on the platform we are building on. + [Ryan Bloom] + + *) Enable logging the cookie with mod_log_config + [Sander van Zoest ] + + *) Fix a segfault in mod_info when it reaches the end of the configuration. + [Jeff Trawick] + + *) Added lib/aputil/ as a placeholder for utility functions which are not + specific to the Apache HTTP Server (but do not make sense with APR). + The first utility is "apu_dbm": a set of functions to work with DBM + files. This first version can be compiled for SDBM or GDBM databases. + [Greg Stein] + + *) Complete re-write of mod_include. This makes mod_include a filter that + uses buckets directly. This has now served the FAQ correctly. + [Paul Reder ] + + *) Allow modules to specify the first filter in a sub_request when + making the sub_request. This keeps modules from having to change the + output_filter immediately after creating the sub-request, and therefore + skip the sub_req_output_filter. [Ryan Bloom] + + *) Update ab to accept URLs with IPv6 literal address strings (in the + format described in RFC 2732), and to build Host header fields in + the same format. This allows IPv6 literal address strings to be + used with ab. This support has been tested against Apache 1.3 with + the KAME patch, but Apache 2.0 does not yet work with this format + of the Host header field. [Jeff Trawick] + + *) Accomodate an out-of-space condition in the piped logs and the + rotatelogs.c code, and no longer churn log processes for this + condition. [Victor J. Orlikowski] + + *) Add support for partial writes with apr_sendfile() to core_output_filter. + [Greg Ames] + +Changes with Apache 2.0a8 + + *) Add a directive to mod_mime so that filters can be associated with + a given mime-type. + [Ryan Bloom] + + *) Get multi-views working again. We were setting the path_info + field incorrectly if we couldn't find the specified file. + [Ryan Bloom] + + *) Fix 304 processing. The core should never try to send the headers + down the filter stack. Always, just setup the table in the request + record, and let the header filter convert it to data that is ready + for the network. + [Ryan Bloom] + + *) More fixes for the proxy. There are still bugs in the proxy code, + but this has now proxied www.yahoo.com and www.ntrnet.net (my ISP) + successfully. + [Ryan Bloom] + + *) Fix params for apr_getaddrinfo() call in connect proxy handler. + [Chuck Murcko] + + *) APR: Add new apr_getopt_long function to handle long options. + [B. W. Fitzpatrick ] + + *) APR: Change apr_connect() to take apr_sockaddr_t instead of hostname. + Add generic apr_create_socket(). Add apr_getaddrinfo() for doing + hostname resolution/address string parsing and building + apr_sockaddr_t. Add apr_get_sockaddr() for getting the address + of one of the apr_sockaddr_t structures for a socket. Change + apr_bind() to take apr_sockaddr_t. [David Reid and Jeff Trawick] + + *) Remove the BUFF from the HTTP proxy. This is still a bit ugly, but + I have proxied pages with it, cleanup will commence soon. + [Ryan Bloom] + + *) Make the proxy work with filters. This isn't perfect, because we + aren't dealing with the headers properly. [Ryan Bloom] + + *) Do not send a content-length iff the C-L is 0 and this is a head + request. [Ryan Bloom] + + *) Make cgi-bin work as a regular directory when using mod_vhost_alias + with no VirtualScriptAlias directives. PR#6829 [Tony Finch] + + *) Remove BUFF from the PROXY connect handling. [Ryan Bloom] + + *) Get the default_handler to stop trying to deal with HEAD requests. + The idea is to let the content-length filter compute the C-L before + we try to send the data. If we can get the C-L correctly, then we + should send it in the HEAD response. + [Ryan Bloom] + + *) The Header filter can now determine if a body should be sent based + on r->header_only. The general idea of this is that if we delay + deciding to send the body, then we might be able to compute the + content-length correctly, which will help caching proxies to cache + our data better. Any handler that doesn't want to try to compute + the content-length can just send an EOS bucket without data and + everything will just work. + [Ryan Bloom] + + *) Add the referer to the error log if one is available. + [Markus Gyger ] + + *) Mod_info.c has now been ported to Apache 2.0. As a part of this + change, the root of the configuration tree has been exposed to modules + as ap_conftree. + [Ryan Morgan ] + + *) Get the core_output_filter to use the bucket interface directly. + This keeps us from calling the content-length filter multiple times + for a simple static request. + [Ryan Bloom] + + *) We are sending the content-type correctly now. + [Ryan Bloom and Will Rowe] + + *) APR on FreeBSD: Fix a bug in apr_sendfile() which caused us to report + a bogus bytes-sent value when the only thing being sent was trailers + and writev() returned an error (or EAGAIN). [Jeff Trawick] + + *) Get SINGLE_LISTEN_UNSERIALIZED_ACCEPT working again. This uses the + hints file to determine which platforms define + SINGLE_LISTEN_UNSERIALIZED_ACCEPT. + [Ryan Bloom] + + *) APR: add apr_get_home_directory() [Jeff Trawick] + + *) Initial import of 1.3-current mod_proxy. [Chuck Murcko] + + *) Not all platforms have INADDR_NONE defined by default. Apache + used to make this check and define INADDR_NONE if appropriate, + but APR needs the check too, and I suspect other applications will + as well. APR now defines APR_INADDR_NONE, which is always a valid + value on all platforms. + [Branko Čibej ] + + *) Destroy the pthread mutex in lock_intra_cleanup() for PR#6824. + [Shuichi Kitaguchi ] + + *) Relax the syntax checking of Host: headers in order to support + iDNS. PR#6635 [Tony Finch] + + *) When reading from file buckets we convert to an MMAP if it makes + sense. This also simplifies the default handler because the + default handler no longer needs to try to create MMAPs. + [Ryan Bloom] + + *) BUFF has been removed from the main server. The BUFF code will remain + in the code until it has been purged from the proxy module as well. + [Ryan Bloom] + + *) Byteranges have been completely re-written to be a filter. This + has been tested, and I believe it is working correctly, but it could + doesn't work for the Adobe Acrobat plug-in. The output almost matches + the output from 1.3, the only difference being that 1.3 includes + a content-length in the response, and this does not. + [Ryan Bloom] + + *) APR read/write functions and bucket read functions now operate + on unsigned integers, instead of signed ones. It doesn't make + any sense to use signed ints, because we return the error codes, + so if we have an error we should report 0 bytes read or written. + [Ryan Bloom] + + *) Always compute the content length, whether it is sent or not. + The reason for this, is that it allows us to correctly report + the bytes_sent when logging the request. This also simplifies + content-length filter a bit, and fixes the actual byte-reporing + code in mod_log_config.c + [Ryan Bloom] + + *) Remove AP_END_OF_BRIGADE definition. This does not signify what + it says, because it was only used by EOS and FLUSH buckets. Since + neither of those are required at the end of a brigade, this was + really signifying FLUSH_THE_DATA, but that can be determined better + by checking AP_BUCKET_IS_EOS() or AP_BUCKET_IS_FLUSH. EOS and FLUSH + buckets now return a length of 0, which is actually the amount of data + read, so they make more sense. + [Ryan Bloom] + + *) Allow the core_output_filter to save some data past the end of a + request. If we get an EOS bucket, we only send the data if it + makes sense to send it. This allows us to pipeline request + responses. As a part of this, we also need to allocate mmap + buckets out of the connection pool, not the request pool. This + allows the mmap to outlive the request. + [Ryan Bloom] + + *) Make blocking and non-blocking bucket reads work correctly for + sockets and pipes. These are the only bucket types that should + have non-blocking reads, because the other bucket types should + ALWAYS be able to return something immediately. + [Ryan Bloom] + + *) In the Apache/Win32 console window, accept Ctrl+C to stop the + server, but use Ctrl+Break to initiate a graceful restart + instead of duplicating behavior. [John Sterling] + + *) Patch mod_autoindex to set the Last-Modified header based on + the directory's mtime, and add the ETag header. [William Rowe] + + *) Merge the 1.3 patch to add support for logging query string in + such a way that "%m %U%q %H" is the same as "%r". + [Bill Stoddard] + + *) Port three log methods from mod_log_config 1.3 to 2.0: + CLF compliant '-' byte count, method and protocol. + [Bill Stoddard] + + *) Add a new LogFormat directive, %c, that will log connection + status at the end of the response as follows: + 'X' - connection aborted before the response completed. + '+' - connection may be kept-alive by the server. + '-' - connection will be closed by the server. + [Bill Stoddard] + + *) Expand APR for WinNT to fully accept and return utf-8 encoded + Unicode file names and paths for Win32, and tag the Content-Type + from mod_autoindex to reflect that charset if the feature + macro APR_HAS_UNICODE_FS is true. [William Rowe] + + *) Compute the content length (and add appropriate header field) for + the response when no content length is available and we can't use + chunked encoding. [Jeff Trawick] + + *) Changed ap_discard_request_body() to use REQUEST_CHUNKED_DECHUNK, + so that content input filters get dechunked data when using + the default handler. Also removed REQUEST_CHUNKED_PASS. + [Sascha Schumann] + + *) Add mod_ext_filter as an experimental module. This module allows + the administrator to use external programs as filters. Currently, + only filtering of output is supported. [Jeff Trawick] + + *) Most Apache functions work on EBCDIC machines again, as protocol + data is now translated (again). [Jeff Trawick] + + *) Introduce ap_xlate_proto_{to|from}_ascii() to clean up some of + the EBCDIC support. They are noops on ASCII machines, so this + type of translation doesn't have to be surrounded by #ifdef + CHARSET_EBCDIC. [Jeff Trawick] + + *) Fix mod_include. tag commands work again, and the server will + send the FAQ again. This also allows mod_include to set aside + buckets that include partial buckets. + [Ryan Bloom and David Reid] + + *) Add suexec support back. [Manoj Kasichainula] + + *) Lingering close now uses the socket directly instead of using + BUFF. This has been tested, but since all we can tell is that it + doesn't fail, this needs to be really hacked on. + [Ryan Bloom] + + *) Allow filters to modify headers and have those headers be sent to + the client. The idea is that we have an http_header filter that + actually sends the headers to the network. This removes the need + for the BUFF to send headers. + [Ryan Bloom] + + *) Charset translation: mod_charset_lite handles translation of + request bodies. Get rid of the xlate version of ap_md5_digest() + since we don't compute digests of filtered (e.g., translated) + response bodies this way anymore. (Note that we don't do it at + all at the present; somebody needs to write a filter to do so.) + [Jeff Trawick] + + *) Input filters and ap_get_brigade() now have a input mode parameter + (blocking, non-blocking, peek) instead of a length parameter. + [hackathon] + + *) Update the mime.types file to the registered media types as + of 2000-10-19. PR#6613 [Carsten Klapp , + Tony Finch] + + *) Namespace protect some macros declared in ap_config.h + [Ryan Bloom] + + *) Support HTTP header line folding with input filtering. + [Greg Ames] + + *) Mod_include works again. This should still be re-written, but at + least now we can serve an SHTML page again. + [Ryan Bloom] + + *) Begin to remove BUFF from the core. Currently, we keep a pointer + to both the BUFF and the socket in the conn_rec. Functions that + want to use the BUFF can, functions that want to use the socket, + can. They point to the same place. + [Ryan Bloom] + + *) apr_psprintf doesn't understand %lld as a format. Make it %ld. + [Tomas Ögren ] + + *) APR pipes on Unix and Win32 are now cleaned up automatically when the + associated pool goes away. (APR pipes on OS/2 were already had this + logic.) This resolvs a fatal file descriptor leak with CGIs. + [Jeff Trawick] + + *) The final line of the config file was not being read if there was + no \n at the end of it. This was caused by apr_fgets returning + APR_EOF even though we had read valid data. This is solved by + making cfg_getline check the buff that was returned from apr_fgets. + If apr_fgets return APR_EOF, but there was data in the buf, then we + return the buf, otherwise we return NULL. + [Ryan Bloom] + + *) Piped logs work again in the 2.0 series. + [Ryan Bloom] + + *) Restore functionality broken by the mod_rewrite security fix: + rewrite map lookup keys and default values are now expanded + so that the lookup can depend on the requested URI etc. + PR #6671 [Tony Finch] + + *) SECURITY: Tighten up the syntax checking of Host: headers to fix a + security bug in some mass virtual hosting configurations + that can allow a remote attacker to retrieve some files + on the system that should be inaccessible. [Tony Finch] + + *) Add a pool bucket type. This bucket is used for data allocated out + of a pool. If the pool is cleaned before the bucket is destroyed, then + the data is converted to a heap bucket, allowing it to survive the + death of the pool. + [Ryan Bloom] + + *) Add a flush bucket. This allows modules to signal that the filters + should all flush whatever data they currently have. There is no way + to actually force them to do this, so if a filter ignores this bucket, + that's life, but at least we can try with this. + [Ryan Bloom] + + *) Add an output filter for sub-requests. This filter just strips the + EOS bucket so that we don't confuse the main request's core output + filter by sending multiple EOS buckets. This change also makes sub + requests start to send EOS buckets when they are finished. + [Ryan Bloom] + + *) Make ap_bucket_(read|destroy|split|setaside) into macros. Also + makes ap_bucket_destroy a return void, which is okay because it + used to always return APR_SUCCESS, and nobody ever checked its + return value anyway. + [Cliff Woolley ] + + *) Remove the index into the bucket-type table from the buckets + structure. This has now been replaced with a pointer to the + bucket_type. Also add some macros to test the bucket-type. + [Ryan Bloom] + + *) Renamed all MODULE_EXPORT symbols to AP_MODULE_DECLARE and all symbols + for CORE_EXPORT to AP_CORE_DECLARE (namespace protecting the wrapper) + and retitled API_EXPORT as AP_DECLARE and APR_EXPORT as APR_DECLARE. + All _VAR_ flavors changes to _DATA to be absolutely clear. + [William Rowe] + + *) Add support for /, //, //servername and //server/sharename + parsing of blocks under Win32 and OS2. + [Tim Costello, William Rowe, Brian Harvard] + + *) Remove the function pointers from the ap_bucket type. They have been + replaced with a global table. Modules are allowed to register bucket + types and use then use those buckets. + [Ryan Bloom] + + *) mod_cgid: In the handler, shut down the Unix socket (only for write) + once we finish writing the request body to the cgi child process; + otherwise, the client doesn't hit EOF on stdin. Small request bodies + worked without this change (for reasons I don't understand), but large + ones didn't. [Jeff Trawick] + + *) Remove file bucket specific information from the ap_bucket type. + This has been moved to a file_bucket specific type that hangs off + the data pointer in the ap_bucket type. + [Ryan Bloom] + + *) Input filtering now has a third argument. This is the amount of data + to read from lower filters. This argument can be -1, 0, or a positive + number. -1 means give me all the data you have, I'll deal with it and + let you know if I need more. 0 means give me one line and one line + only. A positive number means I want no more than this much data. + + Currently, only 0 and a positive number are implemented. This allows + us to remove the remaining field from the conn_rec structure, which + has also been done. + [Ryan Bloom] + + *) Big cleanup of the input filtering. The goal is that http_filter + understands two conditions, headers and body. It knows where it is + based on c->remaining. If c->remaining is 0, then we are in headers, + and http_filter returns a line at a time. If it is not 0, then we are + in body, and http_filter returns raw data, but only up to c->remaining + bytes. It can return less, but never more. + [Greg Ames, Ryan Bloom, Jeff Trawick] + + *) mod_cgi: Write all of the request body to the child, not just what + the kernel would accept on the first write. [Jeff Trawick] + + *) Back out the change that moved the brigade from the core_output_filters + ctx to the conn_rec. Since all requests over a given connection + go through the same core_output_filter, the ctx pointer has the + correct lifetime. + [Ryan Bloom] + + *) Fix another bug in the send_the_file() read/write loop. A partial + send by apr_send would cause unsent data in the read buffer to + get clobbered. Complete making send_the_file handle partial + writes to the network. + [Bill Stoddard] + + *) Fix a couple of type fixes to allow compilation on AIX again + [Victor J. Orlikowski ] + + *) Fix bug in send_the_file() which causes offset to be ignored + if there are no headers to send. + [Bill Stoddard] + + *) Handle APR_ENOTIMPL returned from apr_sendfile in the core + filter. Useful for supporting Windows 9* with a binary + compiled on Windows NT. + [Bill Stoddard] + +Changes with Apache 2.0a7 + + *) Reimplement core_output_filter to buffer/save bucket brigades + across multiple calls to the core_filter. The brigade will be + sent when either MIN_BYTES_TO_SEND or MAX_IOVEC_TO_WRITE + thresholds are hit or the EOS bucket is received. + [Bill Stoddard] + + *) Create experimental filter (buffer_filter) that coalesces bytes + into one large buffer before invoking the next filter in the + chain. This filter is particularly useful with the current + implementation of mod_autoindex when it inserted above the + chunk_filter. mod_autoindex generates a lot of brigades that + containing buckets holding just a few bytes each. The + buffer_filter coalesces these buckets into a single large bucket. + [Bill Stoddard] + + *) Add apr_sendfile() support into the core_output_filter. + [Bill Stoddard] + + *) Add apr_sendv() support into the core_output_filter. + [Bill Stoddard] + + *) Fix mod_log_config so that it compiles cleanly with BUFFERED_LOGS + [Mike Abbott ] + + *) Remove ap_send_fb. This is no longer used in Apache, and it doesn't + make much sense, because Apache uses buckets instead of BUFFs now. + [Ryan Bloom] + + *) send_the_file now falls back to a read/write loop on platforms that + do not have sendfile. + [Ryan Bloom and Brian Havard] + + *) Install apachectl correctly, and substitute the proper values so + that it works again. [Ryan Bloom] + + *) Better(??) handle platforms that lack sendfile(). + [Jim Jagielski] + + *) APR now has UUID generation/formatting/parsing support. + [Greg Stein] + + *) Begin the http_filter. This is an input filter that understands + the absolute basic amount required to parse an HTTP Request. The + goal is to be able to split headers from request body before passing + the data back to the other filters. + [Ryan Bloom] + + *) Bring forward from 1.3.13 the config directory implementation + [Jim Jagielski] + + *) install apxs if it is created + [Ryan Bloom] + + *) Added APR_IS_STATUS_condition test macros to eliminate canonical error + conversions. [William Rowe] + + *) Now that we have ap_add_input_filter(), rename ap_add_filter() to + ap_add_output_filter(). [Jeff Trawick] + + *) Multiple build and configuration fixes + Build process: + + -add datadir and localstatedir substitutions + -fix layout name + -fix logfilename misspelling + -fix evaluation of installation dir variables and + -replace $foobar by $(foobar) to be usefull in the makefile + + Cross compile: + + -add rules for cross-compiling in rules.mk. Okay, rule to check for + $CC_FOR_BUILD is still missing + -use CHECK_TOOL instead of CHECK_PROG for ranlib + -add missing "AR=@AR@" to severaly Makefile.in's + -cache result for "struct rlimit" + -compile all helper programs with native and cross compiler + and use the native version to generate header file + [Rüdiger Kuhlmann ] + + *) Prepare our autoconf setup for autoconf 2.14a and for cross- + compiling. + [Rüdiger Kuhlmann ] + + *) Fix a bug where a client which only sends \n to delimit header + lines (netcat) gets a strange looking HTTP_NOT_IMPLEMENTED + message. Start working on ebcdic co-existance with input + filtering. + [William Rowe, Greg Ames] + + *) If mod_so is enabled in the server always create libexec, even + if there are no modules installed in this directory. This is a + requirement for APXS to work correctly. + [Ryan Bloom] + + *) Connection oriented output filters are now stored in the + conn_rec instead of the request_rec. This allows us to add the + output filter in the pre-connection phase instead of the + post_read_request phase, which keeps us from trying to write an + error page before we have a filter to write to the network. + [Ryan Bloom, Jeff Trawick, and Greg Ames] + + *) Cleaning up an mmap bucket no longer deletes the mmap. An + mmap can be used across multiple buckets (default_handler with + byte ranges, mod_file_cache, mod_mmap_static), so cleanup of + the mmap itself can't be associated with the bucket. + [Jeff Trawick] + + *) Add .dll caching directive ISAPICacheFile to mod_isapi. + [William Rowe] + + *) Radical surgery to improve mod_isapi support under Win32. + Includes a number of newer ServerSupportFunction calls, support + for ReadClient (in order to retrieve POSTs greater than 48KB), + and general bug fixes to more reliably load ISAPI .dll's and + prevent leaking handle resources. Note: There are still + discrepancies between IIS's and Apache's ServerVariables, and + async calls are still not supported. Additional warnings are + logged to facilitate debugging of unsupported ISAPI calls. + [William Rowe] + + *) Add input filtering to Apache. The basic idea for the input + filters is the same as the ideas for output filters. The biggest + difference is that instead of calling ap_pass_brigade, ap_get_brigade + should be called, and the order of execution for the filter itself is + different. When writing an output filter, a brigade is passed in, + and filters operate directly on that brigade, when done, they call + ap_pass_brigade. Input filters are the exact opposite. Because input + is not a push operation, filters first call ap_get_brigade. When this + function returns, the input filter will be left with a valid brigade. + The input filter should then operate on the brigade, and return. + [Ryan Bloom] + + *) Fix building on BSD/OS using its native make. The build system + falls back to the BSD .include directive on that host platform. + [Sascha Schumann] + + *) Expand dbmmanage to allow -d -m -s -p options for Crypt, MD5, + SHA1 and plaintext password encodings. Make feature tests a + bit more flexible. [William Rowe] + + *) Charset translation: mod_charset_lite handles output content + translation in a filter. mod_charset_lite no longer ignores + subrequests. A bunch of cruft related to BUFF's support for + translating request and response bodies was removed. + [Jeff Trawick] + + *) Move the addition of the CORE filter to the post_read_request + hook in http_core.c. This removes the need to add the filter in + multiple places and allows for an SSL module to be added much + simpler. [Ryan Bloom] + + *) SECURITY: CVE-2000-0913 (cve.mitre.org) + Fix a security problem that affects certain configurations of + mod_rewrite. If the result of a RewriteRule is a filename that + contains expansion specifiers, especially regexp backreferences + $0..$9 and %0..%9, then it may be possible for an attacker to + access any file on the web server. [Tony Finch] + + *) Fix a bug where errors that are detected during early request parsing + don't produce visible HTTP error messages at the browser, because + the core_filter wasn't present. [Greg Ames] + + *) Provide apr_socklen_t as a portability aid. + [Victor J. Orlikowski] + + *) Overhaul of dbmmanage to allow a groups arg (as in Apache 1.2) + as well as a comment arg to the add, adduser and update cmds. + update allows the user to clear or preserve pw/groups/comment. + Fixed a bug in dbmmanage that prevented the check option from + parsing a password followed by :group... text. Corrected the + seed calcualation for Win32 systems, and added -lsdbm support. + [William Rowe] + + *) Configured mod_auth_dbm to compile with sdbmlib under Win32. + [William Rowe] + + *) Avoid a segfault when parsing .htaccess files. An + uninitialized tree pointer was passed to ap_build_config(). + [Jeff Trawick] + + *) Change the way that inet_addr & inet_network are checked for + in APR's configure process to allow BeOS BONE to correctly + find them. With this change BeOS BONE now builds from source + with no problems. [David Reid] + + *) Fix a bug in apr_create_process() for Unix. The NULL signifying + the end of the parameters to execve() was stored in the wrong + location, overlaying the storage beyond the newargs[] array and + also passing uninitialized storage to execve(), which would + sometimes fail with EFAULT. [Jeff Trawick] + + *) Fix a bug parsing configuration file containers. With a sequence + like this in the config file + + + any stuff + + + (blank line) + any stuff + + + the second container would be terminated at the blank line due to + sediment in the buffer from reading the prior and an + error message would be generated for the real for the + second container. Also due to this problem, any two characters + could be used for "] + + *) Fix chunking problem with CGI scripts. The general problem was that + the CGI modules were adding an EOS bucket and then the core added an + EOS bucket. The chunking filter finalizes the chunked response when it + encounters an EOS bucket. Because two EOS buckets were sent, we + finalized the response twice. The fix is to make sure we only send one + EOS, by utilizing a flag in the request_rec. + [Ryan Bloom] + + *) apr_put_os_file() now sets up the unget byte appropriately on Unix + and Win32. Previously, the first read from an apr_file_t set up via + apr_put_os_file() would return a '\0'. [Jeff Trawick] + + *) Mod_cgid now creates a single element bucket brigade, with a pipe + bucket, instead of using BUFF's and ap_r*. + [Ryan Bloom] + + *) APRVARS.in no longer overwrites the EXTRA_LIBS variable. + [Mike Abbott ] + + *) Remove ap_bopenf from buff code. This required modifying the file_cache + code to use APR file's directly instead of going through BUFFs. + [Ryan Bloom] + + *) Fix compile break on some platforms for mod_mime_magic.c + [John K. Sterling ] + + *) Fix merging of AddDefaultCharset directive. + PR #5872 (1.3) [Jun Kuriyama ] + + *) Minor revamp of the rlimit sections of code. We now test + explicitly for setrlimit and getrlimit. Also, unixd_set_rlimit() + is now "available" even if the platform doesn't support + the rlimit family (it's just a noop though). [Jim Jagielski] + + *) Migrate the pre-selection of which MPM to use for specific + platforms to hints.m4, which contains (or should contain) + all platform specific "hints". [Jim Jagielski] + + *) Remove IOLs from Apache. With filtering, IOLs are no longer necessary + [Ryan Bloom] + + *) Add tables with non-string/binary values to APR. + [Ken Coar] + + *) Fix some bad calls to ap_log_rerror() in mod_rewrite. + [Jeff Trawick] + + *) Update PCRE to version 3.2. [Ryan Bloom] + + *) Change the way buckets' destroy functions are called so that + they can be more directly used when changing the type of a + bucket in place. [Tony Finch] + + *) Add generic support for reference-counting the resources used by + buckets, and alter the HEAP and MMAP buckets to use it. Change + the way buckets are initialised to support changing the type of + buckets in place, and use it when setting aside TRANSIENT buckets. + Change the implementation of TRANSIENT buckets so that it can be + mostly shared with IMMORTAL buckets, which are now implemented. + [Tony Finch] + +Changes with Apache 2.0a6 + + *) Add support to Apache and APR for dsos on OS/390. [Greg Ames] + + *) Add a chunking filter to Apache. This brings us one step closer + to removing BUFF. [Ryan Bloom] + + *) ap_add_filter now adds filters in a LIFO fashion. The first filter + added to the stack is the last filter to be called. [Ryan Bloom] + + *) Apache 2.0 has been completely documented using Scandoc. The + docs can be generated by running 'make docs'. [Ryan Bloom] + + *) Add filtered I/O to Apache. This is based on bucket brigades, + Currently the buckets still use BUFF under the covers, but that + should change quickly. The only currently written filter is the + core filter which just calls ap_bwrite. [The Apache Group] + + *) APR locks on Unix: Let APR_LOCKALL locks work when APR isn't + built with thread support. [Jeff Trawick] + + *) Abort configuration if --with-layout was specified and there's + no layout definition file. [Ken Coar] + + *) Add support for '--with-port=n' option to configure. [Ken Coar] + + *) Add support for extension methods for the Allow response header + field, and an API routine for accessing r->allowed and the + list of extension methods in a unified manner. [Ken Coar] + + *) mod_cern_meta: fix broken file reading loop in scan_meta_file(). + [Rob Simonson ] + + *) Get xlate builds working again. The apr renaming in 2.0a5 broke + APACHE_XLATE builds. [Jeff Trawick] + + *) A configuration file parsing problem was fixed. When the + configuration file started with an IfModule/IfDefine container, + only the last statement in the container would be retained. + [Jeff Trawick] + +Changes with Apache 2.0a5 + + *) Perchild is serving pages after passing them to different child + processes. There are still a lot of bugs, but this does work. I + have made requests against the same installation of Apache, and had + different servers use different user IDs to serve the responses. + This change moves to using socketpair instead of an AF_UNIX socket. + [Ryan Bloom] + + *) Perchild MPM still doesn't work perfectly, but it is serving pages. + It can't seem to pass between child processes yet, but I think we + are closer now than before. This moves us back to using Unix + Domain Sockets. [Ryan Bloom] + + *) libapr functions and types renamed with apr_ prefix. + #include "apr_compat.h" for 1.3.x backwards compat + [Perl] + + *) Fix problems with APR sockaddr handling on Win32. It didn't always + return the right information on the local socket address. + [Gregory Nicholls ] + + *) ap_recv() on Win32: Set bytes-read to 0 on error. + [Gregory Nicholls ] + + *) Add an option to not detach from the controlling terminal without + going into single process mode. This allows for much easier + debugging of the process startup code. [Ryan Bloom] + + *) ab: don't use perror() to report the failure of an APR function. + [Jeff Trawick] + + *) Make dexter, mpmt_pthread, and perchild MPMs not destroy the + scoreboard on graceful restarts. + [Ryan Bloom] + + *) Fix segfault/SIGSEGV when running gzip from mod_mime_magic.c. + An invalid ap_proc_t was passed to ap_create_process(). + [Jeff Trawick] + + *) Allow modules to register filters. Those filters are still + never called, but this is a step in the right direction. + [Ryan Bloom and Greg Stein] + + *) Register the mod_cgid daemon process for cleanup so that it is + killed at termination if it does not die when the parent gets + SIGTERM. This change is to fix occasional problems where the + process stays around. Bugs in similar logic in mod_rewrite and + mod_include were also fixed. [Jeff Trawick] + + *) Fix a bug in the time handling. Basically, we were imploding a time + in ap_parseHTTPdate, but it had bogus data in the exploded time format. + Namely, tm_usec and tm_gmtoff were not filled out. ap_implode_time + uses those two fields to adjust the time value. Because of the HTTP + spec, both of those values can be zero'ed out safely. This fixes + the bug correctly. [Ryan Bloom] + + *) Fix a couple of place in the Windows code where the wrong error + code was being returned. [Gregory Nicholls ] + + *) Fix POOL_DEBUG (at least for prefork mpm). [Dean Gaudet] + + *) Added the APR_EOL_STR macro for platform dependent differences in + logfiles and other raw text (such as all APR files). Fixes logfiles + not terminated with cr/lf sequences in Win32. [William Rowe] + + *) Move all strings functions in APR to src/lib/apr/strings and create + apr_strings.h for the prototypes. [Ryan Bloom] + + *) APR lock fixes: when using SysV sems, flock(), or fcntl(), be sure + to repeat the syscall until we stop getting EINTR. I noticed a + related problem at termination (SIGTERM) on FreeBSD when using + fcntl(). Apache 1.3 had these new loops too. Also, make the flock() + implementation work properly with child init. Previously, ap_lock() + was essentially a no-op because all children were using different + locks and thus nobody ever blocked. [Jeff Trawick] + + *) The htdocs/ tree has been moved out of the CVS source tree into + a separate area for easier development. This has NO EFFECT on + end-users or Apache installations. [Ken Coar] + + *) Integrate the mod_dav module for WebDAV protocol handling. This + adds the dav and dav_fs modules, the SDBM library, and additional + XML handling utilities. [Greg Stein] + + *) Clean out obsolete names (from httpd.h) for the HTTP Status Codes + [Greg Stein] + + *) Update the lib/expat-lite/ library (bring forward changes from + the Apache 1.3 repository). [Greg Stein] + + *) If sizeof(long long) == sizeof(long), then prefer long in APR + configure.in. [Dave Hill ] + + *) Add ap_sendfile for Tru64 Unix. Also, add an error message for + machines where sendfile is detected, but nobody has written ap_sendfile. + [Dave Hill ] + + *) Compile fixes in mod_mmap_static. [Victor J. Orlikowski] + + *) ab would start up more connections than needed, then quit when the + desired number were finished. Also fixed a logic error involving + ab keepalives. [Victor J. Orlikowski] + + *) WinNT: Implement non-blocking pipes with timeouts to communicate + with CGIs. Apache 2.0a4 had non-blocking pipes but without + timeouts (i.e, if a timeout was specified, the pipe reverted to + a full blocking pipe). Now the behaviour is more in line with + Unix non-blocking pipes. + [Bill Stoddard] + + *) WinNT: Implement accept socket reuse. Using mod_file_cache to + cache open file handles along with accept socket reuse enables + Apache 2.0 to serve non-keepalive requests for static files at + 3x the rate of Apache 1.3.(e.g, Apache 1.3 will serve 400 rps + and Apache 2.0 will serve almost 1200 rps on my system). + [Bill Stoddard] + + *) Merge mod_mmap_static function into mod_file_cache. mod_file_cache + supports two config directives, mmapfile (same behavious as + mod_mmap_static) and cachefile. Use the cachefile directive + to cache open file handles. This directive only works on systems + that have implemented the ap_sendfile API. cachefile works today + on Windows NT, but has not been tested on any flavors of Unix. + [Bill Stoddard] + + *) Cleanup the configuration. With the last few changes the + configuration process automatically: + inherits information about how to build from APR. Allowing + APR to inform Apache that it should or should not use -ldl + + Detects which mod_cgi should be used mod_cgi or mod_cgid, + based on the threading model + + Apache calls APR's configure process before finishing it's + configuration processing, allowing for more information flow + between the two. + [Ryan Bloom] + + + *) Change Unix and Win32 ap_setsockopt() so that APR_SO_NONBLOCK + with non-zero argument makes the socket non-blocking. BeOS and + OS/2 already worked this way. [Jeff Trawick] + + *) ap_close() now calls ap_flush() for buffered files, so write + operations work a whole lot better on buffered files. + [Jeff Trawick] + + *) Fix error messages issued from MPMs which explain where to change + compiled-in limits (e.g., ThreadsPerChild, MaxClients, StartTreads). + [Greg Ames] + + *) ap_create_pipe() now leaves pipes in blocking state. (This helps + reduce the number of syscalls on Unix.) ap_set_pipe_timeout() is + now the way that the blocking state of a pipe is manipulated. + ap_block_pipe() is gone. [Jeff Trawick] + + *) Correct the problem where the only local host name that the IP stack + can discover are 'undotted' private names. If no fully qualified + domain name can be identified, the default ServerName will be set to + the machine's IP address string. A warning is always provided if the + ServerName not specified, but assumed. Solves PR6215 [William Rowe] + + *) Repair problems with config file processing which caused segfault + at init when virtual hosts were defined and which caused ServerName to + be ignored when there was no valid DNS setup. [Jeff Trawick] + + *) Removed pointless ap_is_aborted macro function. [Roy Fielding] + + *) Add ap_sendfile implementation for AIX + [Victor J. Orlikowski] + + *) Repair C++ compatibility in ap_config.h, apr_file_io.h, + apr_network_io.h, and apr_thread_proc.h. + [Tyler J. Brooks , Jeff Trawick] + + *) Bring the allocation and pool debugging code back into a working + state. This will need to be tested as so far it's only been used on + BeOS. [David Reid] + + *) Change configuration command setup to be properly typesafe when in + maintainer mode. Note that this requires a compiler that can initialise + unions. [Ben Laurie] + + *) Turn on buffering for config file reads. Part of this was to + repair buffered I/O support in Unix and implement buffered + ap_fgets() for all platforms. [Brian Havard, Jeff Trawick] + + *) Win32: Fix problem where UTC offset was not being set correctly + in the access log. Problem reported on news group by Jerry Baker. + [Bill Stoddard] + + *) Fix segfault when reporting this type of syntax error: + " without matching section", where + container is VirtualHost or Directory or whatever. + [Jeff Trawick] + + *) SECURITY: CVE-2000-1204 (cve.mitre.org) + Prevent the source code for CGIs from being revealed when + using mod_vhost_alias and the CGI directory is under the document root + and a user makes a request like http://www.example.com//cgi-bin/cgi + as reported in + [Tony Finch] + + *) Add support for the new Beos NetwOrking Environment (BONE) + [David Reid] + + *) xlate: ap_xlate_conv_buffer() now tells the caller when the + final input char is incomplete; ap_bwrite_xlate() now handles + incomplete final input chars. [Jeff Trawick] + + *) Yet another update to saferead/halfduplex stuff -- need to ensure + that a bhalfduplex call occurs before logging or else DNS and + such can delay the last packet of the response. [Dean Gaudet] + + *) Some syscall reduction in APR on unix -- don't seek when setting + up an mmap; and don't fcntl() more than once per socket. + [Dean Gaudet] + + *) When mod_cgid is started as root, the cgi daemon now switches + to the configured User/Group (like other httpd processes) + instead of continuing as root. [Jeff Trawick] + + *) The prefork MPM now uses an APR lock for the accept() mutex. + It has not been getting a lock at all recently. httpd -V now + displays APR's selection of the lock mechanism instead of the + symbols previously respected by prefork. [Jeff Trawick] + + *) Change the mmap() feature test to check only for existence. + The previous check required features not used by Apache. + [Greg Ames] + + *) Fix a couple of bugs in mod_cgid: The cgi arguments were + sometimes mangled. The len parm to accept() was not + initialized, leading sometimes to an endless loop of failed + accept() calls on OS/390 and anywhere else that failed the call + if the len was negative. Use for struct sockaddr_un + instead of declaring it ourselves to fix a compilation problem + on Solaris. [Jeff Trawick] + + *) Add Resource limiting code back into Apache 2.0. [Ryan Bloom] + + *) Fix zombie process problem with mod_cgi. [Jeff Trawick] + + *) Port mod_mmap_static to 2.0. Make it go faster. [Greg Ames] + + *) Fix storage overlay when loading dsos. Symptom: Apache dies at + initialization if ALLOC_DEBUG is defined; no known symptom + otherwise. [Jeff Trawick] + + *) Fix typo in configure script when checking for mod_so. bash + doesn't seem to have a problem but /bin/sh on Solaris does. + Symptom: "./configure: test: unknown operator ==" + [Jeff Trawick] + + *) Rebind the Win32 NT and 9x services control into the MPM. + All console, WinNT SCM and Win9x pseudo-service control code is + now wrapped within the WinNT MPM. + [William Rowe] + + *) Make a copy of getenv("PATH") before storing for later use. Some + getenv() implementations use the same storage for successive calls. + CGIs on OS/390 had a bad PATH due to this. [Jeff Trawick] + + *) Server Tokens work in 2.0 again. This also propogates the change + to allow just the product name in the server string using + PRODUCT_ONLY. + [Ryan Bloom] + +Changes with Apache 2.0a4 + + *) EBCDIC: Rearrange calls to ap_checkconv() so that most handlers + won't need to call it. [Greg Ames, Jeff Trawick] + + *) Move pre_config hook call to between configuration read and config + tree walk. This allows all modules to implement pre_config hooks + and know that they will be called at an appropriate time. + [Ryan Bloom] + + *) mod_cgi, mod_cgid: Make ScriptLog directive work again. + [Jeff Trawick] + + *) Add pre-config hooks back to all modules. + [Ryan Bloom] + + *) Fix a SIGSEGV in ap_md5digest(), which is used when you have + ContentDigest enabled and we can't/don't mmap the file. + [Jeff Trawick] + + *) We now report the correct line number for syntax errors in config + files. [Ryan Bloom, Greg Stein, Jeff Trawick] + + *) Brought mod_auth_digest up to synch with 1.3, fixed ap_time_t- + related bugs, and changed shmem/locking to use apr API. Shared-mem + is currently disabled, however, because of problems with graceful + restarts. [Ronald Tschalär] + + *) Fix corruption of IFS variable in --with-module= handling. + Depending on the user's shell or customization thereof, there + would be errors generating ap_config_auto.h later in the configure + procedure. [Jeff Trawick] + + *) mod_cgi: Restore logging of stderr from child process when ScriptLog + isn't used (as in 1.3), except that on Unix it is now logged via + ap_log_rerror() instead of by the child having STDERR_FILENO refer + to the error log. [Greg Ames, Jeff Trawick] + + *) Add '-D' argument processing for run time configuration defines. + [William Rowe] + + *) Organize http_main.c as independent code, such that no code or + global data is exported from it. WIN32 will dynamically link it + to the server core, so this will prevent mutual dependency. + [William Rowe] + + *) Add separate dynamic linkage tags APR_EXPORT(), APR_EXPORT_NONSTD() + and APR_VAR_EXPORT to correctly resolve apr functions and globals. + [William Rowe] + + *) Add Win9x service execution and Ctrl+C/Ctrl+Break/Shutdown handlers. + [William Rowe, Jan Just Keijser ] + + *) Add mod_charset_lite for configuring character set translation. + [Jeff Trawick] + + *) Add '-n' option to htpasswd to make it print its user:pw record + on stdout rather than having to frob a text file. [Ken Coar] + + *) Fix saferead. Basically, we flush the output buffer if a read on the + input will block. + [Ryan Bloom] + + *) APR: Add ap_xlate_get_sb() so that an app can find out whether or not + a conversion is single-byte only. [Jeff Trawick] + + *) BEOS: ap_shutdown should return APR_SUCCESS or errno. Note that + the BeOS 5.0 documentation says that shutdown doesn't work yet. + [Roy Fielding] + + *) Fix some minor errors where pid was being manipulated as an int + instead of the portable pid_t. [Roy Fielding] + + *) Fix some error log prints that were printing the pointer to a + structure rather than the pid within the structure. + [Jeff Trawick, Roy Fielding] + + *) ab: Fix a command-line processing bug; track bad headers in + err_response; support reading headers up to 2K. + [Ask Bjoern Hansen ] + + *) Fix ap_resolve_env() so that it handles new function added in a prior + alpha (see "Added the capability to do ${ENVVAR} constructs in the + config file.") as well as the constructs used by mod_rewrite. + [Paul Reder ] + + *) Apache 2.0 builds and runs on OS/390. [Jeff Trawick, Greg Ames] + + *) Change the EBCDIC support in functions for MD5, SHA1, and base 64 to use + APR to perform translation, instead of accessing the hard-coded tables + in 1.3's ebcdic.c. [Jeff Trawick] + + *) Fix some bugs (mostly lost 1.3 code) in ab's command-line processing. + [Jeff Trawick] + + *) Add the ability to hook into the config file reading phase. Basically + if a directive is specified EXEC_ON_READ, then when that directive is + read from the config file, the assocaited function is executed. This + should only be used for those directives that must muck with HOW the + server INTERPRETS the config. This should not be used for directives + that re-order or replace items in the config tree. Those changes should + be made in the pre-config step. + [Ryan Bloom] + + *) Add mod_example to the build system. + [Tony Finch] + + *) APR: Add ap_xlate_conv_byte() to convert one char between single- + byte character sets. [Jeff Trawick] + + *) Pick up various EBCDIC fixes from 1.3 (from Martin + Kraemer and Oliver Reh originally according to the change log). + [Jeff Trawick] + + *) Fix a couple of problems in RFC1413 support (controlled by the + IdentityCheck directive). Apache did not build the request string + properly and more importantly Apache would loop forever if the + would-be ident server dropped the connection before sending a + properly terminated response. [Jeff Trawick] + + *) apxs works in 2.0. + [Ryan Bloom] + + *) Reliable piped logs work in 2.0. + [Ryan Bloom] + + *) Introduce a hash table implementation into APR to be used for + replacing tables and other random data structures in Apache. + [Tony Finch] + + *) Add some more error reporting to htpasswd in the case of problems + generating or accessing the temporary file. Also, pass in a + buffer if the implementation knows how to use it (i.e., if L_tmpnam + is defined). [Ken Coar] + + *) Configure creates config.nice now containing your configure + options. Syntax: ./config.nice [--more-options] + [Sascha Schumann] + + *) Fix various return code problems in APR on Win32. For most of + these, APR was returning APR_EEXIST instead of GetLastError()/ + WSAGetLastError(). [Jeff Trawick] + + *) Make piped logs work again in version 2.0 + [Ryan Bloom] + + *) Add VPATH support to UNIX build system of Apache and APR. + [Sascha Schumann] + + *) Fix ap_tokenize_to_argv to respect the const arguments that are + passed to it. + [Ryan Bloom] + + *) Fix mm's memcpy/memset macros, pointer arithmetic was broken. + Patch submitted to author. + [Sascha Schumann] + + *) Fix mm configuration on Solaris 8 x86 and OS/390. Don't require + /sbin in PATH on FreeBSD (all submitted to rse previously) + [Jeff Trawick] + + *) Fix building Pthread-based MPMs on OpenBSD + [Sascha Schumann] PR#26 + + *) Fix ap_readdir() problem on systems where d_name[] field in + struct dirent is declared with only one byte. (This problem only + affected multithreaded builds.) This caused a segfault during + pool cleanup with mod_autoindex on Solaris (Solaris 8 x86, at + least). [Jeff Trawick] + + *) Fix some make-portability problems on at least Tru64, Irix + and UnixWare. + [Sascha Schumann] PR#18, PR#39 + + *) Add ap_sigwait() to support old-style sigwait() on systems + like OS/390 and UnixWare. + [Sascha Schumann] + + *) Add POSIX-thread flags for more platforms. + [Sascha Schumann] + + *) Fix some minor bugs in ap_strerror(). Teach ap_strerror() + (on Unix, at least) to handle resolver errors. Fix a bug in + the definition of APR_ENOMEM so that ap_strerror() can spit + out the correct error message for it. + [Jeff Trawick] + +Changes with Apache 2.0a3 + + *) mod_so reports ap_os_dso_error() if ap_dso_load() fails + [Doug MacEachern] + + *) API: *HOOK* macros now have an AP_ prefix + [Doug MacEachern] + + *) Win32: Eliminate redundant calls to initialize winsock. + [Tim Costello ] + + *) Fix bugs initializing ungetchar for pipes. + [Chia-liang Kao ] + + *) The ab program in the src/support directory is now portable using + APR. + [Ryan Bloom] + + *) Support directory is being compiled when the server is built + [Ryan Bloom] + + *) The configure option --with-program-name has been added to allow + developers to rename the executable at configure time. This also + changes the name of the config files to match the executable's name. + [Ryan Bloom] + + *) mod_autoindex: Add `IndexOptions +VersionSort', to nicely sort filenames + containing version numbers. [Martin Pool] + + *) ap_open(..,APR_OS_DEFAULT,..) uses perms 0666 instead of 0777 on + Unix; access_log and error_log now created with these perms; non- + Unix is unaffected [Jeff Trawick] + + *) Finished move of ap_md5 routines to apr_md5. Removed ap_md5.h. + Replaced more magic numbers with MD5_DIGESTSIZE. + [William Rowe, Roy Fielding] + + *) Win32: Get mod_auth_digest compiling and added to the Windows + build environment. Not tested and I'd be suprised if it + actually works. [Bill Stoddard] + + *) Revamp the Win32 make environment. Makefiles have been removed and + Apache.dsw created to bring together all the pieces. Create new file + os/win32/BaseAddr.ref to define module base addresses (to prevent + dll relocation at start-up). + [William Rowe, Greg Marr, Tim Costello, Bill Stoddard] + + *) [EBCDIC] Port Paul Gilmartin's CRLF patch from 1.3. This replaces most + of the \015, \012, and \015\012 constants with macros. + [Greg Ames] + + *) Add ap_xlate_open() et al for translation of text between different + character sets. The initial implementation requires iconv(). + [Jeff Trawick] + + *) More FAQs and answers from comp.infosystems.www.servers.unix. + [Joshua Slive ] + + *) CGI output is being timed out now. + [Ryan Bloom] + + *) Fix the problem with dieing quietly. dupfile now takes a pool which + is used by the new apr file. There is no reason to create a new file + with the same lifetime as the original file. + [Ryan Bloom] + + *) Win32: Attempt to eliminate dll relocation at start-up by specifying + module base addresses. This will help shooting seg faults + in the field. [William Rowe ] + + *) Update Apache on Windows documentation. Add new document + describing how to compile Apache on Windows. + [William Rowe ] + + *) ap_set_pipe_timeout(), ap_poll(), and APR_SO_TIMEOUT now take + microseconds instead of seconds. Some storage leaks and other + minor bugs in related code were fixed. [Jeff Trawick] + + *) Win32: First cut at getting mod_isapi working under 2.0 + [William Rowe ] + + *) First stab at getting mod_auth_digest working under 2.0 + quick change summary: + - moved the random byte generation (ap_generate_random_bytes) into APR + - now uses ap_time_t + - compiles and runs on linux + - tested with amaya + [Brian Martin ] + + *) Win32: Move the space stripping of physical service names + fix up from Apache 1.3. #include'ing "ap_mpm.h" fixes up an + unresolved symbol. Add dependency checking to the + CreateService call to ensure TCPIP and AFP (winsock) is started + before Apache. + [William Rowe ] + + *) Win32: Add code to perform latebinding on functions that may + not exist on all levels of Windows where Apache runs. This + is needed to allow Apache to start-up on Win95/98. All calls + to non portable functions should be protected with + ap_oslevel checks to prevent runtime segfaults. + [William Rowe ] + + *) Fix fallback default values for SHM_R and SHM_W [Martin Kraemer] + + *) Get lingering_close() working again. [Dean Gaudet, Jeff Trawick] + + *) Win32: Get non-blocking CGI pipe reads working under Windows NT. + This addresses PR 1623. Still need to address timing out runaway + CGI scripts. [Bill Stoddard] + + *) Win32: Make ap_stat Windows 95/98 friendly + [William Rowe ] + + *) Win32: Fix a bug in ap_get_oslevel which causes GetVersionEx() to + always fail. Need to initialise the dwOSVersionInfoSize member of the + OSVERSIONINFO struct before calling GetVersionEx, so GetVersionEx + always fails. + + The patch also enhances ap_get_oslevel (and the associated enum) to + handle selected service packs for NT4, and adds recognition for + Windows 2000. This is useful, eg. if we can recognise NT4 SP2 then + we can use ReadFileScatter and WriteFileGather in readwrite.c. + [Tim Costello ] + + *) Get mod_rewrite building and running, and mod_status building for Win NT + [Allan Edwards ] + + *) Patch to port mod_auth_db to the 2.0 api and also to support + Berlekey DB 3.0. It works for me with both Berkeley DB 3.0.55 and + 2.7.7. It should work with version 1 as well but I haven't tested it. + [Brian Martin ] + + *) Get APR DSO code working under Windows. Includes cross platform + fixes to mod_so.c. + [] + + *) Fix some of the Windows APR time functions. + [William Rowe] + + *) FAQ changes related to tidying up historical documents on the web site. + [Joshua Slive ] + + *) Move Windows DSO code into APR. + [Bill Stoddard] + + *) Eliminate apr_win.h and apr_winconfig.h (and the ugly #ifdefs they cause). + Now, apr.h and apr_config.h are generated from apr.hw and apr_config.hw + at build time. At this point, the server will not compile on Windows because + of the recent DSO commits. Fixing those next. + [Bill Rowe & Bill Stoddard] + + *) Added error checking for file I/O APR routines. + [Jon Travis ] + + *) APR: Don't use the values of resolver error codes for the + corresponding APR error codes. On Unix and Win32, return the + proper APR error code after a resolver error. [Jeff Trawick] + +Changes with Apache 2.0a2 + + *) Renamed the executable back to httpd on all platforms other + than Win32 + [Ryan Bloom] + + *) Allow BeOS to survive restarts, log properly and a few + small things it had problems with due to the way it setup + users and groups. [David Reid] + + *) Get mod_rewrite working with APR locks + [Paul Reder ] + + *) Actually remove the sempahore when the lock cleanup routine + is called on BeOS. [David Reid] + + *) Clear hook registrations between reads of the config file. + When DSOs are unloaded and re-loaded the old hook pointers may + no longer be valid. This fix eliminates potential segfaults. + [Allan Edwards ] + + *) Fix a problem with Sigfunc not being defined or bypassed + if sigaction() wasn't found. [Jim Jagielski] + + *) Fix the locking mechanism on BSD variants. They now use fcntl + locks. This allows the server to start and serve pages. + [Ryan Bloom] + + *) First cut at getting the Win32 installer to work + [William Rowe ] + + *) Get htpasswd compiling under Windows + [William Rowe ] + + *) Change the log message for a bind() failure to show the + interface and port number. [Jeff Trawick] + + *) Import the documentation from 1.3.12 and bring parts of it + up-to-date with respect to the changes that have occurred + in 2.0. + [Tony Finch] + + *) BeOS MPM updated. CGI bug on BeOS fixed. IP addresses + now logged correctly on BeOS. + [David Reid] + + *) Create one makefile for all Win32 distributions (NT/2000/95/98). + Makefile.win includes the same user interface as the old + Makefile.nt + [William Rowe , Jeff Trawick ] + + *) Win32 exec now uses COMSPEC environment string for command + shell path resolution. + [William Rowe ] PR#3715 + + *) Win32: ap_connect() was not returning correct error condition + PR5866 + [Allen Prescott ] + + *) Win32: ap_open() was broken on Win9x because an NT-specific + flag was passed to CreateFile. ap_puts() added an unnecessary + '\n'. + [Jeff Trawick ] + + *) Put in Korean and Norwegian index.html pages (2.0 and 1.3) + which where donated by Lee Kuk Hyun and Lorant Czaran. 'Fixed' + confusing ee/et name and made all extensions language/dialect + rather than country reflecting. Changed example files to + explicit reflect the ISO charset and added a few common + ones to the example config [dirkx] + + *) Extend external module capability. To use this, you call + configure with --with-module=path/to/mod1,path/to/mod2,etc. + [Ryan Bloom] + + *) Backported the various "default charset" fixes from 1.3.12, + including the AddDefaultCharset directive. [Jim Jagielski] + + *) Added the capability to do ${ENVVAR} constructs in the + config file. E.g. 'ServerAdmin ${POSTMASTER}'. As commited + it does this on a line by line basis; i.e. if the envvar + expands to something with spaces you have to protect it + by adding quotes around it (Unless of course you expect it + to contains more than one argument. Alternatively you + can compile it on a per token basis; which is what people + usually expect by setting RESOLVE_ENV_PER_TOKEN. But this + hampers fancier hacks. + [Dirk-Willem van Gulik] + + *) Changed the 'ErrorDocument' syntax in that it NO longer + supports the asymetric + + ErrorDocument 301 "Some message + + Note the opening " quote, without a closing quote. It now + has either the following syntaxes + + ErrorDocument XXX /local/uri + ErrorDocument XXX http://valid/url + ErrorDocument XXX "Some Message" + + The recognition heuristic is: if it has a space it + is a message. If it has no spaces and starts with a / + or is a valid URL then treat it that way. Otherwise it + is assumed to be a message. + + This breaks backward compatibility but makes live a hell + of a lot easier for GUI's and config file parsers. + [Dirk-Willem van Gulik] + + *) Changed 'CacheNegotiatedDocs' from its present/not-present + syntax into a 'on' or 'off' syntax. As it currently is the + only non nesting token which uses NO_ARGS and thus is an + absolute pain for any config interface automation. This + breaks backward compatibility. [Dirk-Willem van Gulik] + + *) Add ability to add external modules to the build process. This is + done with --with-module=/path/to/module. Modules can only be added + as static modules at this point. + [Ryan Bloom] + +Changes with Apache 2.0a1 + + *) Fix FreeBSD 3.3 core dump. + Basically, ap_initialize() needs to get called before + create_process(), since create_process() passes op_on structure + to semop() to get a lock, but op_on isn't initialized until + ap_initialize() calls setup_lock(). Here is a slight + rearrangement to main() which calls ap_initialize() earlier... + [Jeff Trawick ] + + *) Enable Apache to use sendfile/TransmitFile API + [Bill Stoddard, David Reid, Paul Reder] + + *) Re-Implement Win32 APR network I/O APIs and most of the file I/O + APIs. + [Bill Stoddard] + + *) Make file I/O and network I/O writev/sendv APIs consistent. + Eliminate use of ap_iovec_t and use Posix struct iovec. + Use seperate variable on ap_writev to set the number of iovecs + passed in and number of bytes written. + [Bill Stoddard] + + *) Adapt file iol to use APR functions. Replaced ap_open_file() + with ap_create_file_iol(). ap_create_file_iol() requires that + the file be opened prior to the call using ap_open(). + [Bill Stoddard] + + *) Port mod_include and mod_cgi to 2.0 + [Paul Reder, Bill Stoddard] + + *) ap_send{,v}, ap_recv, ap_sendfile API clarification -- + bytes_read/bytes_written is always valid (never -1). Plus + some fixes to buff.c to correct problems introduced by the + errno => ap_status_t changes a while back. Plus a fix to + chunked encoding introduced right at the beginning of 2.0. + [Dean Gaudet] + + *) Revamped UNIX build system to use autoconf and libtool. + [Manoj Kasichainula, Sascha Schumann] + + *) port mod_rewrite to 2.0. [Paul J. Reder ] + + *) SECURITY: More rigorous checking of Host: headers to fix security + problems with mass name-based virtual hosting (whether using mod_rewrite + or mod_vhost_alias). + [Ben Hyde, Tony Finch] + + *) Add back support for UseCanonicalName in containers. + [Manoj Kasichainula] + + *) Added APLOG_STARTUP log type. This allows us to write an error + message without any of the date and time information. As a part + of this change, I also removed all of the calls to fprintf(stderr + and replaced them with calls to ap_log_error using APLOG_STARTUP + writing to stderr is no longer portable, because we don't direct + stderr to the error log on all platforms. + [Ryan Bloom] + + *) Convert error logging functions to take errno as an argument. + This makes our error logs more portable, because some Windows API's + don't set errno. This change allows us to still output a valid + message on all of our platforms. + [Ryan Bloom] + + *) mod_mime_magic runs in 2.0-dev now. + [Paul Reder ] + + *) sendfile has been added to APR. + [John Zedlewski ] + + *) buff.c has been converted to no longer use errno. + [Manoj Kasichainula] + + *) mod_speling runs in 2.0-dev now: a bug in readdir_r handling and + interface adaption to APR functions did it. [Martin Kraemer] + + *) Support DSOs properly on 32-bit HP-UX 11.0 + [Dilip Khandekar ] + + *) Updated MM in APR source tree from version 1.0.8 to 1.0.11 + [Ralf S. Engelschall] + + *) Cleaned APR build environment integration and bootstrap APR + automatically for developers from src/Configure. + [Ralf S. Engelschall] + + *) Fixed building of src/support/htpasswd.c + [Ralf S. Engelschall] + + *) When generating the Location: header, mod_speling forgot + to escape the spelling-fixed uri. (Forw-Port from 1.3) + [Martin Kraemer] + + *) Moved mod_auth_digest.c from experimental to standard. [Roy Fielding] + + *) Change all pools to APR contexts. This is the first step to + incorporating APR into Apache. [Ryan Bloom] + + *) Move "handler not found" warning message to below the check + for a wildcard handler. [Dirk , Roy Fielding] + PR#2584, PR#2751, PR#3349, PR#3436, PR#3548, PR#4384, PR#4795, PR#4807 + + *) Support line-continuation feature in config.option file and + allow the loading of multiple option sections at once via + ``--with-option=,,...'' + [Ralf S. Engelschall] + + *) Rebuilt CVS repository with Apache 1.3.9 as basis. [Roy Fielding] + +Changes with Apache MPM + + *) Use asynchronous AcceptEx() and a completion port to accept and + dispatch connections to threads in Windows NT/2000. + [Bill Stoddard] + + *) Implement WINNT Win32 MPM from original Win32 code in http_main.c + [Bill Stoddard] + + *) Implement the APACI --with-option facility + (per default used the config.option file). + [Ralf S. Engelschall] + + *) MPM BEOS port. [David Reid ] + + *) Start to implement module-defined hooks that are a) fast and b) typesafe. + Replace pre_connection module call with a register_hook call and + implement pre_connection as a hook. The intent is that these hooks will + be extended to allow Apache to be multi-protocol, and also to allow the + calling order to be specified on a per-hook/per-module basis. + [Ben Laurie] + + *) Implement mpm_* methods as "modules". Each method gets its own + subdir in src/modules (eg: src/modules/prefork). Selection + of method uses Rule MPM_METHOD. [Jim Jagielski] + + *) Port the hybrid server from the apache-apr repository as + mpm_mpmt_pthread. [Manoj Kasichainula] + + *) os/unix/unixd.[ch]: detach, setuid, setgid, stuff which will be common + amongst the unix MPMs. + + *) mpm_prefork: throw away all the alarm/timeout crud; and clean up the + signal handling for the new world order. [Dean Gaudet] + + *) Crude ap_thread_mutex abstraction so that we get the pthread stuff out + of alloc.c for now. [Dean Gaudet] + + *) Handle partial large writes correctly. [Ben Laurie] + + *) Eliminate conn_rec's pointer to server. All it knows is the base server + based on IP/port. [Ben Laurie] + + *) Port a bunch of modules to the new module structure. + ["Michael H. Voase" ] + + *) I/O layering and BUFF revamp. See docs/buff.txt. [Dean Gaudet] + + *) Basic restructuring to introduce the MPM concept; includes various + changes to the module API... better described by + docs/initial_blurb.txt. [Dean Gaudet] + +Changes with Apache pthreads + + *) New buff option added: BO_TIMEOUT. It describes the timeout for + buff operations (generally over a network). + [Dean Gaudet, Ryan Bloom, Manoj Kasichainula] + + *) Created http_accept abstraction. Added 4 new functions (not exported): + init_accept(), begin_accepting_requests(), get_request(), + stop_accepting_requests() [Bill Stoddard] + + *) Fix to ap_rprintf call that allows mod_info to work properly. + [James Morris ] + + *) user and ap_auth_type fields were moved from connection_rec to + request_rec. [Ryan Bloom] + + *) Removed the ap_block_alarms and ap_unblock_alarm calls. These aren't + needed in a threaded server. + + *) Initial pthread implementation from from Dean's apache-nspr code. + [Bill Stoddard, Ryan Bloom] + + +Changes with Apache 1.3.x and later: + + *) http://svn.apache.org/viewvc/httpd/httpd/branches/1.3.x/src/CHANGES?view=markup diff --git a/rubbos/app/httpd-2.0.64/INSTALL b/rubbos/app/httpd-2.0.64/INSTALL new file mode 100644 index 00000000..9f5dbddd --- /dev/null +++ b/rubbos/app/httpd-2.0.64/INSTALL @@ -0,0 +1,99 @@ + + APACHE INSTALLATION OVERVIEW + + Quick Start - Unix + ------------------ + + For complete installation documentation, see [ht]docs/manual/install.html or + http://httpd.apache.org/docs/2.0/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). + + * 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 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 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.0 + is to run ./configure --help. + + + Quick Start - Windows + --------------------- + + For complete documentation, see [ht]docs/manual/platform/windows.html or + http://httpd.apache.org/docs/2.0/platform/windows.html. + + The Apache/Win32 binaries are primarily distributed as a Windows Installer + package (.msi), and may be available as a .zip file as well. These packages + are named apache-2.0.xx-win32-x86.msi and apache-2.0.xx-win32-x86.zip. + Please choose the .msi package if at all possible. + + If you have unpacked a source distribution (named httpd-2.0-xx.zip, without + any -win32-x86 notation) you must compile the package yourself, see the links + mentioned above. Unless you intended to do this, please look again for the + binary package from http://www.apache.org/dist/httpd/binaries/win32/ and + install that .msi (or .zip package, if you must.) + + If you have unpacked this binary distribution from the .zip package, you + _must_ edit the conf/httpd.conf file (with notepad or another text editor) + to reflect the correct ServerName, Domain, and directory paths. Search for + the text "@@" to discover what you must edit. To install and start the + service after you have corrected the httpd.conf file, use the command + + bin\Apache -k install + bin\Apache -k start + + The .msi package configures the httpd.conf file, and installs and starts + the Apache2 service for you. It also installs plenty of useful shortcuts + and the taskbar ApacheMonitor. We strongly encourage you to use it. + + + Postscript + ---------- + + The Apache HTTP Server group cannot field user's installation questions. + There are many valuable forums to help you get started. Please refer your + questions to the appropriate forum, such as the Users Mailing List at + http://httpd.apache.org/userslist.html or the usenet newsgroups + comp.infosystems.www.servers.unix or + comp.infosystems.www.servers.ms-windows. + + Thanks for using the Apache HTTP Server, version 2.0. + + The Apache Software Foundation + http://www.apache.org/ diff --git a/rubbos/app/httpd-2.0.64/InstallBin.dsp b/rubbos/app/httpd-2.0.64/InstallBin.dsp new file mode 100644 index 00000000..e772efab --- /dev/null +++ b/rubbos/app/httpd-2.0.64/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 "\Apache2.0\bin\Apache.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="\Apache2" SHORT=R LONG=Release _install" +# PROP Rebuild_Opt "" +# PROP Target_File "\Apache2\bin\Apache.exe" +# PROP Bsc_Name "Browse\Apache.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 "\Apache2.0\bin\Apache.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="\Apache2" SHORT=D LONG=Debug _install" +# PROP Rebuild_Opt "" +# PROP Target_File "\Apache2\bin\Apache.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/rubbos/app/httpd-2.0.64/LAYOUT b/rubbos/app/httpd-2.0.64/LAYOUT new file mode 100644 index 00000000..dbeee7d6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/LAYOUT @@ -0,0 +1,201 @@ +The httpd-2.0 Source Tree LAYOUT +-------------------------------- + +./ .................... Top-Level httpd-2.0 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_dh.c ......... DSA/DH support + 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_expr.c .............. expression handling main source + ssl_expr.h .............. expression handling common header + ssl_expr_scan.c ......... expression scanner automaton (pre-generated) + ssl_expr_scan.l ......... expression scanner source + ssl_expr_parse.c ........ expression parser automaton (pre-generated) + ssl_expr_parse.h ........ expression parser header (pre-generated) + ssl_expr_parse.y ........ expression parser source + ssl_expr_eval.c ......... expression machine evaluation + ssl_scache.c ............ session cache abstraction layer + ssl_scache_dbm.c ........ session cache via DBM file + ssl_scache_shmcb.c ...... session cache via shared memory cyclic buffer + ssl_scache_shmht.c ...... session cache via shared memory hash table + ssl_util.c .............. utility functions + ssl_util_ssl.c .......... the OpenSSL companion source + ssl_util_ssl.h .......... the OpenSSL companion header + ssl_util_table.c ........ the hash table library source + ssl_util_table.h ........ the hash table library header + + test/ ................... not distributed with released source tarballs + +os/ ..................... + + beos/ ................... + + bs2000/ ................. + + netware/ ................ + + os2/ .................... + + tpf/ .................... + + samples/ ................ + + unix/ ................... + + win32/ .................. + +server/ ................. + + mpm/ .................... + + beos/ ................... + + experimental/ ........... + + leader/ ................. + + perchild/ ............... + + threadpool/ ............. + + 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/rubbos/app/httpd-2.0.64/LICENSE b/rubbos/app/httpd-2.0.64/LICENSE new file mode 100644 index 00000000..20d87e6a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/LICENSE @@ -0,0 +1,616 @@ + 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_imap.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 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 srclib\apr-util\xml\expat\conftools\install-sh component: + +# +# install - install a program, script, or datafile +# This comes from X11R5 (mit/util/scripts/install.sh). +# +# Copyright 1991 by the Massachusetts Institute of Technology +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of M.I.T. not be used in advertising or +# publicity pertaining to distribution of the software without specific, +# written prior permission. M.I.T. makes no representations about the +# suitability of this software for any purpose. It is provided "as is" +# without express or implied warranty. +# + +For the srclib\pcre\install-sh component: + +# +# Copyright 1991 by the Massachusetts Institute of Technology +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of M.I.T. not be used in advertising or +# publicity pertaining to distribution of the software without specific, +# written prior permission. M.I.T. makes no representations about the +# suitability of this software for any purpose. It is provided "as is" +# without express or implied warranty. + +For the pcre component: + +PCRE LICENCE +------------ + +PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + +Written by: Philip Hazel + +University of Cambridge Computing Service, +Cambridge, England. Phone: +44 1223 334714. + +Copyright (c) 1997-2001 University of Cambridge + +Permission is granted to anyone to use this software for any purpose on any +computer system, and to redistribute it freely, subject to the following +restrictions: + +1. This software is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +2. The origin of this software must not be misrepresented, either by + explicit claim or by omission. In practice, this means that if you use + PCRE in software which you distribute to others, commercially or + otherwise, you must put a sentence like this + + Regular expression support is provided by the PCRE library package, + which is open source software, written by Philip Hazel, and copyright + by the University of Cambridge, England. + + somewhere reasonably visible in your documentation and in any relevant + files or online help data or similar. A reference to the ftp site for + the source, that is, to + + ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/ + + should also be given in the documentation. + +3. Altered versions must be plainly marked as such, and must not be + misrepresented as being the original software. + +4. If PCRE is embedded in any software that is released under the GNU + General Purpose Licence (GPL), or Lesser General Purpose Licence (LGPL), + then the terms of that licence shall supersede any condition above with + which it is incompatible. + +The documentation for PCRE, supplied in the "doc" directory, is distributed +under the same terms as the software itself. + +End PCRE LICENCE + + +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 waranties, +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) + +*/ + +For the expat xml parser component: + +Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd + and Clark Cooper + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==================================================================== diff --git a/rubbos/app/httpd-2.0.64/Makefile b/rubbos/app/httpd-2.0.64/Makefile new file mode 100644 index 00000000..24a904bf --- /dev/null +++ b/rubbos/app/httpd-2.0.64/Makefile @@ -0,0 +1,215 @@ +top_srcdir = /bottlenecks/rubbos/app/httpd-2.0.64 +top_builddir = /bottlenecks/rubbos/app/httpd-2.0.64 +srcdir = /bottlenecks/rubbos/app/httpd-2.0.64 +builddir = /bottlenecks/rubbos/app/httpd-2.0.64 +VPATH = /bottlenecks/rubbos/app/httpd-2.0.64 + +SUBDIRS = srclib os server modules support +CLEAN_SUBDIRS = test + +PROGRAM_NAME = $(progname) +PROGRAM_SOURCES = modules.c +PROGRAM_LDADD = $(HTTPD_LDFLAGS) $(PROGRAM_DEPENDENCIES) $(EXTRA_LIBS) $(AP_LIBS) $(LIBS) +PROGRAM_DEPENDENCIES = \ + $(BUILTIN_LIBS) \ + $(MPM_LIB) \ + server/libmain.la \ + os/$(OS_DIR)/libos.la + +PROGRAMS = $(PROGRAM_NAME) +TARGETS = $(PROGRAMS) $(shared_build) $(other_targets) +PHONY_TARGETS = $(srcdir)/buildmark.c +INSTALL_TARGETS = install-conf install-htdocs install-error install-icons \ + install-other install-cgi install-include install-suexec install-man \ + install-build + +DISTCLEAN_TARGETS = include/ap_config_auto.h include/ap_config_layout.h \ + modules.c config.cache config.log config.status build/config_vars.mk \ + build/rules.mk docs/conf/httpd-std.conf +EXTRACLEAN_TARGETS = configure include/ap_config_auto.h.in generated_lists + +include $(top_builddir)/build/rules.mk +include $(top_srcdir)/build/program.mk + +install-conf: + @echo Installing configuration files ; \ + if [ ! -d $(DESTDIR)$(sysconfdir) ]; then \ + $(MKINSTALLDIRS) $(DESTDIR)$(sysconfdir) ; \ + fi ; \ + 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 *-std*.conf; do \ + ( \ + n_lm=`awk 'BEGIN {n=0} /@@LoadModule@@/ {n+=1} END {print n}' < $$i`; \ + if test $$n_lm -eq 0 -o "x$(DSO_MODULES)" = "x"; then \ + sed -e 's#@@ServerRoot@@#$(prefix)#g' \ + -e 's#@@Port@@#$(PORT)#g' \ + -e '/@@LoadModule@@/d' \ + < $$i; \ + else \ + sed -n -e '/@@LoadModule@@/q' \ + -e 's#@@ServerRoot@@#$(prefix)#g' \ + -e 's#@@Port@@#$(PORT)#g' \ + -e 'p' \ + < $$i; \ + for j in $(DSO_MODULES) "^EOL^"; do \ + if test "x$$j" = "xssl"; then \ + echo ""; \ + fi; \ + if test $$j != "^EOL^"; then \ + echo "LoadModule $${j}_module $(rel_libexecdir)/mod_$${j}.so"; \ + fi; \ + if test "x$$j" = "xssl"; then \ + echo ""; \ + fi; \ + done; \ + sed -e '1,/@@LoadModule@@/d' \ + -e '/@@LoadModule@@/d' \ + -e 's#@@ServerRoot@@#$(prefix)#g' \ + -e 's#@@Port@@#$(PORT)#g' \ + < $$i; \ + fi \ + ) > $(DESTDIR)$(sysconfdir)/$$i; \ + chmod 0644 $(DESTDIR)$(sysconfdir)/$$i; \ + file=`echo $$i|sed s/-std//`; \ + if [ "$$file" = "httpd.conf" ]; then \ + file=`echo $$file|sed s/.*.conf/$(PROGRAM_NAME).conf/`; \ + fi; \ + if test "$$file" != "$$i" && test ! -f $(DESTDIR)$(sysconfdir)/$$file; then \ + $(INSTALL_DATA) $(DESTDIR)$(sysconfdir)/$$i $(DESTDIR)$(sysconfdir)/$$file; \ + 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 + +install-build: + @echo Installing build system files + @test -d $(DESTDIR)$(installbuilddir) || $(MKINSTALLDIRS) $(DESTDIR)$(installbuilddir) + @cp $(top_srcdir)/build/*.mk $(DESTDIR)$(installbuilddir); \ + cp build/*.mk $(DESTDIR)$(installbuilddir); \ + sed 's#LIBTOOL = \(.*\)#LIBTOOL = $(SHELL) $(installbuilddir)/libtool $(LTFLAGS)#' \ + build/config_vars.mk > $(DESTDIR)$(installbuilddir)/config_vars.mk; \ + cp $(top_srcdir)/build/instdso.sh $(DESTDIR)$(installbuilddir); \ + cp $(top_builddir)/config.nice $(DESTDIR)$(installbuilddir); + +htdocs-srcdir = $(top_srcdir)/docs/docroot + +docs:: + mkdir -p ./docs/api + srclib/apr/build/scandoc.pl -i./build/default.pl -p./docs/api/ ./include/*.h + +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) ; \ + 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 + +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-include: + @echo Installing header files + @test -d $(DESTDIR)$(includedir) || $(MKINSTALLDIRS) $(DESTDIR)$(includedir) + @cp -p include/*.h $(DESTDIR)$(includedir) + @cp -p $(srcdir)/include/*.h $(DESTDIR)$(includedir) + @cp -p $(srcdir)/os/$(OS_DIR)/os.h $(DESTDIR)$(includedir) + @if test -f $(srcdir)/os/$(OS_DIR)/os-inline.c; then \ + cp -p $(srcdir)/os/$(OS_DIR)/os-inline.c $(DESTDIR)$(includedir); \ + fi; + @cp -p $(srcdir)/server/mpm/$(MPM_SUBDIR_NAME)/*.h $(DESTDIR)$(includedir) + @cp -p $(srcdir)/modules/dav/main/mod_dav.h $(DESTDIR)$(includedir) + @cp -p $(srcdir)/modules/filters/mod_include.h $(DESTDIR)$(includedir) + @cp -p $(srcdir)/modules/generators/mod_cgi.h $(DESTDIR)$(includedir) + @cp -p $(srcdir)/modules/generators/mod_status.h $(DESTDIR)$(includedir) + @cp -p $(srcdir)/modules/loggers/mod_log_config.h $(DESTDIR)$(includedir) + @cp -p $(srcdir)/modules/http/mod_core.h $(DESTDIR)$(includedir) + @cp -p $(srcdir)/modules/proxy/mod_proxy.h $(DESTDIR)$(includedir) + @cp -p $(srcdir)/modules/ssl/*.h $(DESTDIR)$(includedir) + @cp -p $(srcdir)/srclib/pcre/pcre*.h $(DESTDIR)$(includedir) + @cp -p $(srcdir)/os/$(OS_DIR)/*.h $(DESTDIR)$(includedir) + @chmod 644 $(DESTDIR)$(includedir)/*.h + +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 + @(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 + +install-suexec: + @if test -f $(builddir)/support/suexec; then \ + test -d $(DESTDIR)$(sbindir) || $(MKINSTALLDIRS) $(DESTDIR)$(sbindir); \ + $(INSTALL_PROGRAM) $(top_builddir)/support/suexec $(DESTDIR)$(sbindir); \ + chmod 4755 $(DESTDIR)$(sbindir)/suexec; \ + fi + +suexec: + cd support && $(MAKE) suexec + +x-local-distclean: + @rm -rf autom4te.cache + +include $(top_srcdir)/os/os2/core.mk diff --git a/rubbos/app/httpd-2.0.64/Makefile.in b/rubbos/app/httpd-2.0.64/Makefile.in new file mode 100644 index 00000000..5d6eae4c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/Makefile.in @@ -0,0 +1,210 @@ + +SUBDIRS = srclib os server modules support +CLEAN_SUBDIRS = test + +PROGRAM_NAME = $(progname) +PROGRAM_SOURCES = modules.c +PROGRAM_LDADD = $(HTTPD_LDFLAGS) $(PROGRAM_DEPENDENCIES) $(EXTRA_LIBS) $(AP_LIBS) $(LIBS) +PROGRAM_DEPENDENCIES = \ + $(BUILTIN_LIBS) \ + $(MPM_LIB) \ + server/libmain.la \ + os/$(OS_DIR)/libos.la + +PROGRAMS = $(PROGRAM_NAME) +TARGETS = $(PROGRAMS) $(shared_build) $(other_targets) +PHONY_TARGETS = $(srcdir)/buildmark.c +INSTALL_TARGETS = install-conf install-htdocs install-error install-icons \ + install-other install-cgi install-include install-suexec install-man \ + install-build + +DISTCLEAN_TARGETS = include/ap_config_auto.h include/ap_config_layout.h \ + modules.c config.cache config.log config.status build/config_vars.mk \ + build/rules.mk docs/conf/httpd-std.conf +EXTRACLEAN_TARGETS = configure include/ap_config_auto.h.in generated_lists + +include $(top_builddir)/build/rules.mk +include $(top_srcdir)/build/program.mk + +install-conf: + @echo Installing configuration files ; \ + if [ ! -d $(DESTDIR)$(sysconfdir) ]; then \ + $(MKINSTALLDIRS) $(DESTDIR)$(sysconfdir) ; \ + fi ; \ + 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 *-std*.conf; do \ + ( \ + n_lm=`awk 'BEGIN {n=0} /@@LoadModule@@/ {n+=1} END {print n}' < $$i`; \ + if test $$n_lm -eq 0 -o "x$(DSO_MODULES)" = "x"; then \ + sed -e 's#@@ServerRoot@@#$(prefix)#g' \ + -e 's#@@Port@@#$(PORT)#g' \ + -e '/@@LoadModule@@/d' \ + < $$i; \ + else \ + sed -n -e '/@@LoadModule@@/q' \ + -e 's#@@ServerRoot@@#$(prefix)#g' \ + -e 's#@@Port@@#$(PORT)#g' \ + -e 'p' \ + < $$i; \ + for j in $(DSO_MODULES) "^EOL^"; do \ + if test "x$$j" = "xssl"; then \ + echo ""; \ + fi; \ + if test $$j != "^EOL^"; then \ + echo "LoadModule $${j}_module $(rel_libexecdir)/mod_$${j}.so"; \ + fi; \ + if test "x$$j" = "xssl"; then \ + echo ""; \ + fi; \ + done; \ + sed -e '1,/@@LoadModule@@/d' \ + -e '/@@LoadModule@@/d' \ + -e 's#@@ServerRoot@@#$(prefix)#g' \ + -e 's#@@Port@@#$(PORT)#g' \ + < $$i; \ + fi \ + ) > $(DESTDIR)$(sysconfdir)/$$i; \ + chmod 0644 $(DESTDIR)$(sysconfdir)/$$i; \ + file=`echo $$i|sed s/-std//`; \ + if [ "$$file" = "httpd.conf" ]; then \ + file=`echo $$file|sed s/.*.conf/$(PROGRAM_NAME).conf/`; \ + fi; \ + if test "$$file" != "$$i" && test ! -f $(DESTDIR)$(sysconfdir)/$$file; then \ + $(INSTALL_DATA) $(DESTDIR)$(sysconfdir)/$$i $(DESTDIR)$(sysconfdir)/$$file; \ + 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 + +install-build: + @echo Installing build system files + @test -d $(DESTDIR)$(installbuilddir) || $(MKINSTALLDIRS) $(DESTDIR)$(installbuilddir) + @cp $(top_srcdir)/build/*.mk $(DESTDIR)$(installbuilddir); \ + cp build/*.mk $(DESTDIR)$(installbuilddir); \ + sed 's#LIBTOOL = \(.*\)#LIBTOOL = $(SHELL) $(installbuilddir)/libtool $(LTFLAGS)#' \ + build/config_vars.mk > $(DESTDIR)$(installbuilddir)/config_vars.mk; \ + cp $(top_srcdir)/build/instdso.sh $(DESTDIR)$(installbuilddir); \ + cp $(top_builddir)/config.nice $(DESTDIR)$(installbuilddir); + +htdocs-srcdir = $(top_srcdir)/docs/docroot + +docs:: + mkdir -p ./docs/api + srclib/apr/build/scandoc.pl -i./build/default.pl -p./docs/api/ ./include/*.h + +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) ; \ + 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 + +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-include: + @echo Installing header files + @test -d $(DESTDIR)$(includedir) || $(MKINSTALLDIRS) $(DESTDIR)$(includedir) + @cp -p include/*.h $(DESTDIR)$(includedir) + @cp -p $(srcdir)/include/*.h $(DESTDIR)$(includedir) + @cp -p $(srcdir)/os/$(OS_DIR)/os.h $(DESTDIR)$(includedir) + @if test -f $(srcdir)/os/$(OS_DIR)/os-inline.c; then \ + cp -p $(srcdir)/os/$(OS_DIR)/os-inline.c $(DESTDIR)$(includedir); \ + fi; + @cp -p $(srcdir)/server/mpm/$(MPM_SUBDIR_NAME)/*.h $(DESTDIR)$(includedir) + @cp -p $(srcdir)/modules/dav/main/mod_dav.h $(DESTDIR)$(includedir) + @cp -p $(srcdir)/modules/filters/mod_include.h $(DESTDIR)$(includedir) + @cp -p $(srcdir)/modules/generators/mod_cgi.h $(DESTDIR)$(includedir) + @cp -p $(srcdir)/modules/generators/mod_status.h $(DESTDIR)$(includedir) + @cp -p $(srcdir)/modules/loggers/mod_log_config.h $(DESTDIR)$(includedir) + @cp -p $(srcdir)/modules/http/mod_core.h $(DESTDIR)$(includedir) + @cp -p $(srcdir)/modules/proxy/mod_proxy.h $(DESTDIR)$(includedir) + @cp -p $(srcdir)/modules/ssl/*.h $(DESTDIR)$(includedir) + @cp -p $(srcdir)/srclib/pcre/pcre*.h $(DESTDIR)$(includedir) + @cp -p $(srcdir)/os/$(OS_DIR)/*.h $(DESTDIR)$(includedir) + @chmod 644 $(DESTDIR)$(includedir)/*.h + +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 + @(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 + +install-suexec: + @if test -f $(builddir)/support/suexec; then \ + test -d $(DESTDIR)$(sbindir) || $(MKINSTALLDIRS) $(DESTDIR)$(sbindir); \ + $(INSTALL_PROGRAM) $(top_builddir)/support/suexec $(DESTDIR)$(sbindir); \ + chmod 4755 $(DESTDIR)$(sbindir)/suexec; \ + fi + +suexec: + cd support && $(MAKE) suexec + +x-local-distclean: + @rm -rf autom4te.cache + +include $(top_srcdir)/os/os2/core.mk diff --git a/rubbos/app/httpd-2.0.64/Makefile.win b/rubbos/app/httpd-2.0.64/Makefile.win new file mode 100644 index 00000000..92d40bc4 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/Makefile.win @@ -0,0 +1,691 @@ +# Makefile for Windows NT and Windows 95/98/2000 + +# Targets are: +# _apacher - build Apache in Release mode +# _apached - 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 \Apache2 +# PORT 80 +# SSLPORT 443 +# SERVERNAME localhost +# +# For example; +# +# nmake -f Makefile.win PORT=80 INSTDIR="d:\Program Files\Apache" installr +# +# Be aware that certain awk's will not accept backslahed names, +# so the server root should be given in forward slashes (quoted), +# preferably with the drive designation! + +default: _apacher + +!IF ("$(CTARGET)" == "") && EXIST("Apache.sln") +CTARGET=/build +!ENDIF + +!IF !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 +!ENDIF + +# Note; _tryssl: is only used by the msvc developer studio environment to 'fix up' +# the build, since conditional dependencies aren't supported. +# +!IF EXIST("srclib\openssl") +!IF "$(LONG)" == "Debug" +SSLBIN=out32dll.dbg +!ELSE +SSLBIN=out32dll +!ENDIF + +_tryssl: +!IF EXIST("modules\ssl\mod_ssl.mak") + cd modules\ssl + $(MAKE) $(MAKEOPT) -f mod_ssl.mak CFG="mod_ssl - Win32 $(LONG)" RECURSE=0 .\$(LONG)\mod_ssl.so + cd ..\.. + cd support + $(MAKE) $(MAKEOPT) -f abs.mak CFG="abs - Win32 $(LONG)" RECURSE=0 .\$(LONG)\abs.exe + cd .. +!ELSEIF EXIST("Apache.sln") + devenv Apache.sln /useenv $(CTARGET) $(LONG) /project mod_ssl + devenv Apache.sln /useenv $(CTARGET) $(LONG) /project abs +!ELSE + @msdev Apache.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 + +!IF EXIST("srclib\zlib") + +_tryzlib: +!IF EXIST("modules\filters\mod_deflate.mak") + cd modules\filters + $(MAKE) $(MAKEOPT) -f mod_deflate.mak CFG="mod_deflate - Win32 $(LONG)" RECURSE=0 .\$(LONG)\mod_deflate.so + cd ..\.. +!ELSEIF EXIST("Apache.sln") + devenv Apache.sln /useenv $(CTARGET) $(LONG) /project mod_deflate +!ELSE + @msdev Apache.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 installed 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 "$(INSTDIR)" == "" +INSTDIR=\Apache2 +!ENDIF +!IF "$(SERVERNAME)" == "" +SERVERNAME=localhost +!ENDIF +!IF "$(PORT)" == "" +PORT=80 +!ENDIF +!IF "$(SSLPORT)" == "" +SSLPORT=443 +!ENDIF + +!IF "$(LONG)" == "" +!MESSAGE +!MESSAGE INSTDIR = $(INSTDIR) +!MESSAGE SERVERNAME = $(SERVERNAME) +!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 .. + +_apacher: + @$(MAKE) $(MAKEOPT) -f Makefile.win SHORT=R LONG=Release _build + +_apached: + @$(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 EXIST("Apache.mak") + +_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) + 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 ..\.. + 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\uri + $(MAKE) $(MAKEOPT) -f gen_uri_delims.mak CFG="gen_uri_delims - Win32 $(LONG)" RECURSE=0 $(CTARGET) + cd ..\..\.. + cd srclib\apr-util\xml\expat\lib + $(MAKE) $(MAKEOPT) -f xml.mak CFG="xml - Win32 $(LONG)" RECURSE=0 $(CTARGET) + cd ..\..\.. + $(MAKE) $(MAKEOPT) -f aprutil.mak CFG="aprutil - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f libaprutil.mak CFG="libaprutil - Win32 $(LONG)" RECURSE=0 $(CTARGET) + cd ..\.. + cd srclib\pcre + $(MAKE) $(MAKEOPT) -f dftables.mak CFG="dftables - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f pcre.mak CFG="pcre - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f pcreposix.mak CFG="pcreposix - Win32 $(LONG)" RECURSE=0 $(CTARGET) + 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 Apache.mak CFG="Apache - Win32 $(LONG)" RECURSE=0 $(CTARGET) + cd modules\aaa + $(MAKE) $(MAKEOPT) -f mod_access.mak CFG="mod_access - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_auth.mak CFG="mod_auth - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_auth_anon.mak CFG="mod_auth_anon - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_auth_dbm.mak CFG="mod_auth_dbm - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_auth_digest.mak CFG="mod_auth_digest - 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_file_cache.mak CFG="mod_file_cache - 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\experimental + $(MAKE) $(MAKEOPT) -f mod_cache.mak CFG="mod_cache - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_disk_cache.mak CFG="mod_disk_cache - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_mem_cache.mak CFG="mod_mem_cache - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_dumpio.mak CFG="mod_dumpio - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_charset_lite.mak CFG="mod_charset_lite - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f util_ldap.mak CFG="util_ldap - Win32 $(LONG)" RECURSE=0 $(CTARGET) + $(MAKE) $(MAKEOPT) -f mod_auth_ldap.mak CFG="mod_auth_ldap - Win32 $(LONG)" RECURSE=0 $(CTARGET) + cd ..\.. + cd modules\filters +!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_include.mak CFG="mod_include - 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_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 ..\.. + 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_imap.mak CFG="mod_imap - 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 ..\.. + 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_mime_magic.mak CFG="mod_mime_magic - 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_connect.mak CFG="mod_proxy_connect - 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_http.mak CFG="mod_proxy_http - Win32 $(LONG)" RECURSE=0 $(CTARGET) + cd ..\.. +!IF EXIST("srclib\openssl") + cd modules\ssl + $(MAKE) $(MAKEOPT) -f mod_ssl.mak CFG="mod_ssl - Win32 $(LONG)" RECURSE=0 $(CTARGET) .\$(LONG)\mod_ssl.so + cd ..\.. + cd support + $(MAKE) $(MAKEOPT) -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 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 EXIST("Apache.sln") + +_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) + devenv Apache.sln /useenv $(CTARGET) $(LONG) /project BuildBin +!IF EXIST("srclib\openssl") + devenv Apache.sln /useenv $(CTARGET) $(LONG) /project mod_ssl + devenv Apache.sln /useenv $(CTARGET) $(LONG) /project abs +!ENDIF +!IF EXIST("srclib\zlib") + devenv Apache.sln /useenv $(CTARGET) $(LONG) /project mod_deflate +!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) + @msdev Apache.dsw /USEENV /MAKE \ + "BuildBin - Win32 $(LONG)" $(CTARGET) +!IF "$(CTARGET)" == "/CLEAN" + @cd srclib\apr-iconv + @$(MAKE) $(MAKEOPT) -f build\modules.mk.win clean \ + BUILD_MODE=$(LONG) BIND_MODE=shared API_SOURCE=. + @cd ..\.. +!ENDIF +!IF EXIST("srclib\openssl") + @msdev Apache.dsw /USEENV /MAKE \ + "mod_ssl - Win32 $(LONG)" \ + "abs - Win32 $(LONG)" /NORECURSE $(CTARGET) +!ENDIF +!IF EXIST("srclib\zlib") + @msdev Apache.dsw /USEENV /MAKE \ + "mod_deflate - Win32 $(LONG)" /NORECURSE $(CTARGET) +!ENDIF + +!ENDIF + + +_copybin: + copy $(LONG)\Apache.$(src_exe) "$(inst_exe)" <.y + copy $(LONG)\libhttpd.$(src_dll) "$(inst_dll)" <.y + copy srclib\apr\$(LONG)\libapr.$(src_dll) "$(inst_dll)" <.y + copy srclib\apr-iconv\$(LONG)\libapriconv.$(src_dll) "$(inst_dll)" <.y + copy srclib\apr-util\$(LONG)\libaprutil.$(src_dll) "$(inst_dll)" <.y + copy modules\aaa\$(LONG)\mod_access.$(src_so) "$(inst_so)" <.y + copy modules\aaa\$(LONG)\mod_auth.$(src_so) "$(inst_so)" <.y + copy modules\aaa\$(LONG)\mod_auth_anon.$(src_so) "$(inst_so)" <.y + copy modules\aaa\$(LONG)\mod_auth_dbm.$(src_so) "$(inst_so)" <.y + copy modules\aaa\$(LONG)\mod_auth_digest.$(src_so) "$(inst_so)" <.y + copy modules\arch\win32\$(LONG)\mod_isapi.$(src_so) "$(inst_so)" <.y + copy modules\cache\$(LONG)\mod_file_cache.$(src_so) "$(inst_so)" <.y + copy modules\dav\fs\$(LONG)\mod_dav_fs.$(src_so) "$(inst_so)" <.y + copy modules\dav\main\$(LONG)\mod_dav.$(src_so) "$(inst_so)" <.y + copy modules\experimental\$(LONG)\mod_cache.$(src_so) "$(inst_so)" <.y + copy modules\experimental\$(LONG)\mod_disk_cache.$(src_so) "$(inst_so)" <.y + copy modules\experimental\$(LONG)\mod_mem_cache.$(src_so) "$(inst_so)" <.y + copy modules\experimental\$(LONG)\mod_charset_lite.$(src_so) "$(inst_so)" <.y + copy modules\experimental\$(LONG)\mod_dumpio.$(src_so) "$(inst_so)" <.y + copy modules\experimental\$(LONG)\util_ldap.$(src_so) "$(inst_so)" <.y + copy modules\experimental\$(LONG)\mod_auth_ldap.$(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_include.$(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 + copy modules\loggers\$(LONG)\mod_log_config.$(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 + 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_imap.$(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 + 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_mime_magic.$(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_connect.$(src_so) "$(inst_so)" <.y + copy modules\proxy\$(LONG)\mod_proxy_ftp.$(src_so) "$(inst_so)" <.y + copy modules\proxy\$(LONG)\mod_proxy_http.$(src_so) "$(inst_so)" <.y +!IF EXIST("srclib\openssl") + copy modules\ssl\$(LONG)\mod_ssl.$(src_so) "$(inst_so)" <.y + $(quiet)copy srclib\openssl\$(SSLBIN)\openssl.$(src_exe) "$(inst_exe)" <.y + $(quiet)copy srclib\openssl\$(SSLBIN)\libeay32.$(src_dll) "$(inst_dll)" <.y + $(quiet)copy srclib\openssl\$(SSLBIN)\ssleay32.$(src_dll) "$(inst_dll)" <.y + copy support\$(LONG)\abs.$(src_exe) "$(inst_exe)\ab.$(src_exe)" <.y +!ELSE + copy support\$(LONG)\ab.$(src_exe) "$(inst_exe)" <.y +!ENDIF + 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" + -mkdir "$(INSTDIR)\bin\iconv" + -mkdir "$(INSTDIR)\cgi-bin" + -mkdir "$(INSTDIR)\conf" + -mkdir "$(INSTDIR)\error" + -mkdir "$(INSTDIR)\htdocs" + -mkdir "$(INSTDIR)\manual" + -mkdir "$(INSTDIR)\icons" + -mkdir "$(INSTDIR)\include" + -mkdir "$(INSTDIR)\lib" + -mkdir "$(INSTDIR)\logs" + -mkdir "$(INSTDIR)\modules" + -mkdir "$(INSTDIR)\proxy" + -mkdir "$(INSTDIR)\symbols" + -mkdir "$(INSTDIR)\symbols\exe" + -mkdir "$(INSTDIR)\symbols\dll" + -mkdir "$(INSTDIR)\symbols\so" + 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 +!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 << + srclib\openssl\NEWS "$(INSTDIR)\OPENSSL-NEWS.txt" <.y + + Apache HTTP Server 2.0 Limited OpenSSL Distribution + + This binary distribution includes the minimal components of OpenSSL required + to support mod_ssl for Apache HTTP Server version 2.0 (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 << + srclib\openssl\README "$(INSTDIR)\OPENSSL-README.txt" <.y + + Apache HTTP Server 2.0 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.0. 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. + +-------------------------------------------------------------------------------- +<< +!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 + $(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 quiet="-" \ + inst_exe="$(INSTDIR)\bin" \ + inst_dll="$(INSTDIR)\bin" \ + inst_so="$(INSTDIR)\modules" + 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 ..\.. + 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 + xcopy srclib\pcre\pcre*.h "$(INSTDIR)\include" /d < .a + xcopy srclib\apr-util\xml\expat\lib\expat.h "$(INSTDIR)\include" /d < .a + xcopy srclib\apr\include\*.h "$(INSTDIR)\include" /d < .a + xcopy srclib\apr-util\include\*.h "$(INSTDIR)\include" /d < .a + xcopy include\*.h "$(INSTDIR)\include" /d < .a + copy srclib\apr\Lib$(SHORT)\apr.lib "$(INSTDIR)\lib" <.y + copy srclib\apr\Lib$(SHORT)\apr_src.pdb "$(INSTDIR)\lib" <.y + copy srclib\apr-util\Lib$(SHORT)\aprutil.lib "$(INSTDIR)\lib" <.y + copy srclib\apr-util\Lib$(SHORT)\aprutil_src.pdb "$(INSTDIR)\lib" <.y + copy srclib\pcre\Lib$(SHORT)\pcre.lib "$(INSTDIR)\lib" <.y + copy srclib\pcre\Lib$(SHORT)\pcre_src.pdb "$(INSTDIR)\lib" <.y + copy srclib\pcre\Lib$(SHORT)\pcreposix.lib "$(INSTDIR)\lib" <.y + copy srclib\pcre\Lib$(SHORT)\pcreposix_src.pdb "$(INSTDIR)\lib" <.y + copy srclib\apr-util\xml\expat\lib\Lib$(SHORT)\xml.lib "$(INSTDIR)\lib" <.y + copy srclib\apr-util\xml\expat\lib\Lib$(SHORT)\xml_src.pdb "$(INSTDIR)\lib" <.y + copy srclib\apr\$(LONG)\libapr.lib "$(INSTDIR)\lib" <.y + copy srclib\apr\$(LONG)\libapr.exp "$(INSTDIR)\lib" <.y + copy srclib\apr-iconv\$(LONG)\libapriconv.lib "$(INSTDIR)\lib" <.y + copy srclib\apr-iconv\$(LONG)\libapriconv.exp "$(INSTDIR)\lib" <.y + copy srclib\apr-util\$(LONG)\libaprutil.lib "$(INSTDIR)\lib" <.y + copy srclib\apr-util\$(LONG)\libaprutil.exp "$(INSTDIR)\lib" <.y + 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 + copy docs\conf\magic "$(INSTDIR)\conf\magic.default" <.y + if not exist "$(INSTDIR)\conf\magic" \ + copy "$(INSTDIR)\conf\magic.default" "$(INSTDIR)\conf\magic" + copy docs\conf\mime.types "$(INSTDIR)\conf\mime.types.default" <.y + if not exist "$(INSTDIR)\conf\mime.types" \ + copy "$(INSTDIR)\conf\mime.types.default" "$(INSTDIR)\conf\mime.types" + copy docs\conf\httpd-win.conf "$(INSTDIR)\conf\httpd.default.conf" <.y + -awk -f < "$(INSTDIR)\conf\httpd.default.conf" + BEGIN { + serverroot = ARGV[2]; + delete ARGV[2]; + gsub( /\\/, "/", serverroot ); + "cd" | getline root; + gsub( /^\//, substr( root, 1, 2 ) "/", serverroot ); + } + { + gsub( /@@ServerRoot@@/, serverroot ); + gsub( /@@ServerName@@/, "$(SERVERNAME)" ); + gsub( /@@Port@@/, "$(PORT)" ); + print $$0; + } +<< + if not exist "$(INSTDIR)\conf\httpd.conf" \ + copy "$(INSTDIR)\conf\httpd.default.conf" "$(INSTDIR)\conf\httpd.conf" +!IF EXIST("srclib\openssl") + copy docs\conf\ssl-std.conf.in "$(INSTDIR)\conf\ssl.default.conf" <.y + -awk -f < "$(INSTDIR)\conf\ssl.default.conf" + BEGIN { + serverroot = ARGV[2]; + delete ARGV[2]; + gsub( /\\/, "/", serverroot ); + "cd" | getline root; + gsub( /^\//, substr( root, 1, 2 ) "/", serverroot ); + } + { + gsub( /@@ServerRoot@@/, serverroot ); + gsub( /443/, "$(SSLPORT)" ); + gsub( /SSLMutex file:@exp_runtimedir@\/ssl_mutex/, "SSLMutex default" ); + gsub( /@exp_runtimedir@/, "logs" ); + gsub( /@exp_htdocsdir@/, serverroot "/htdocs" ); + gsub( /@exp_logfiledir@/, "logs" ); + gsub( /@exp_sysconfdir@/, "conf" ); + gsub( /@exp_cgidir@/, serverroot "/cgi" ); + print $$0; + } +<< + if not exist "$(INSTDIR)\conf\ssl.conf" \ + copy "$(INSTDIR)\conf\ssl.default.conf" "$(INSTDIR)\conf\ssl.conf" +!ENDIF + -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/rubbos/app/httpd-2.0.64/NOTICE b/rubbos/app/httpd-2.0.64/NOTICE new file mode 100644 index 00000000..539745d2 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/NOTICE @@ -0,0 +1,20 @@ +Apache HTTP Server +Copyright 2009 The Apache Software Foundation. + +This product includes software developed at +The Apache Software Foundation (http://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). + +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/ diff --git a/rubbos/app/httpd-2.0.64/NWGNUmakefile b/rubbos/app/httpd-2.0.64/NWGNUmakefile new file mode 100644 index 00000000..a30d8973 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/NWGNUmakefile @@ -0,0 +1,437 @@ +# +# 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 \ + $(AP_WORK)/include \ + $(AP_WORK)/modules/filters/ \ + $(AP_WORK)/modules/generators/ \ + $(AP_WORK)/modules/http/ \ + $(AP_WORK)/modules/loggers/ \ + $(AP_WORK)/modules/mappers/ \ + $(AP_WORK)/modules/proxy/ \ + $(AP_WORK)/server/mpm/NetWare \ + $(PCRE) \ + $(NWOS) \ + $(EOLIST) + +# +# These flags will come after CFLAGS +# +XCFLAGS += \ + $(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) + +# +# This is used by the '-threadname' directive. If left blank, +# NLM_NAME Thread will be used. +# +NLM_THREAD_NAME = Apache + +# +# 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 = _LibCPrelude + +# +# If this is specified it will be used by the link '-exit' directive +# +NLM_EXIT_SYM = _LibCPostlude + +# +# 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)/Apache2.nlm \ + $(EOLIST) + +# +# If there is an LIB target, put it here +# +TARGET_lib = \ + $(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)/eoc_bucket.o \ + $(OBJDIR)/error_bucket.o \ + $(OBJDIR)/http_core.o \ + $(OBJDIR)/http_protocol.o \ + $(OBJDIR)/http_request.o \ + $(OBJDIR)/listen.o \ + $(OBJDIR)/log.o \ + $(OBJDIR)/main.o \ + $(OBJDIR)/mod_access.o \ + $(OBJDIR)/mod_actions.o \ + $(OBJDIR)/mod_alias.o \ + $(OBJDIR)/mod_asis.o \ + $(OBJDIR)/mod_auth.o \ + $(OBJDIR)/mod_autoindex.o \ + $(OBJDIR)/mod_cgi.o \ + $(OBJDIR)/mod_dir.o \ + $(OBJDIR)/mod_env.o \ + $(OBJDIR)/mod_imap.o \ + $(OBJDIR)/mod_include.o \ + $(OBJDIR)/mod_log_config.o \ + $(OBJDIR)/mod_mime.o \ + $(OBJDIR)/mod_negotiation.o \ + $(OBJDIR)/mod_netware.o \ + $(OBJDIR)/mod_nw_ssl.o \ + $(OBJDIR)/mod_setenvif.o \ + $(OBJDIR)/mod_so.o \ + $(OBJDIR)/mod_userdir.o \ + $(OBJDIR)/modules.o \ + $(OBJDIR)/mpm_common.o \ + $(OBJDIR)/mpm_netware.o \ + $(OBJDIR)/pcre.o \ + $(OBJDIR)/pcreposix.o \ + $(OBJDIR)/protocol.o \ + $(OBJDIR)/provider.o \ + $(OBJDIR)/request.o \ + $(OBJDIR)/rfc1413.o \ + $(OBJDIR)/scoreboard.o \ + $(OBJDIR)/util.o \ + $(OBJDIR)/util_cfgtree.o \ + $(OBJDIR)/util_charset.o \ + $(OBJDIR)/util_debug.o \ + $(OBJDIR)/util_filter.o \ + $(OBJDIR)/util_md5.o \ + $(OBJDIR)/util_nw.o \ + $(OBJDIR)/util_script.o \ + $(OBJDIR)/util_time.o \ + $(OBJDIR)/util_xml.o \ + $(OBJDIR)/vhost.o \ + $(EOLIST) + +# +# 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 = \ + libcpre.o \ + $(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 = \ + @netware.imp \ + @$(APR)/aprlib.imp \ + @libc.imp \ + @ws2nlm.imp \ + GetCurrentAddressSpace \ + $(EOLIST) + +# +# Any symbols exported to here +# +FILES_nlm_exports = \ + @$(NWOS)/httpd.imp \ + $(EOLIST) + +# +# These are the OBJ files needed to create the LIB target above. +# Paths must all use the '/' character +# +FILES_lib_objs = \ + $(EOLIST) + +# +# 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) +# +install :: nlms FORCE + -copy $(OBJDIR)\Apache2.nlm $(INSTALL)\Apache2\*.* + -copy ABOUT_APACHE $(INSTALL)\Apache2\*.* + -copy README $(INSTALL)\Apache2\*.* + -copy STATUS $(INSTALL)\Apache2\*.* + -copy LICENSE $(INSTALL)\Apache2\*.* + -copy CHANGES $(INSTALL)\Apache2\*.* + -copy support\dbmmanage.in $(INSTALL)\Apache2\bin\dbmmanage.pl + -copy support\logresolve.pl.in $(INSTALL)\Apache2\bin\logresolve.pl + -copy support\check_forensic $(INSTALL)\Apache2\bin\check_forensic + -awk -f build\mkconfnw.awk docs\conf\httpd-std.conf.in >$(INSTALL)\Apache2\conf\httpd.conf + -copy docs\conf\magic $(INSTALL)\Apache2\conf\magic + -copy docs\conf\mime.types $(INSTALL)\Apache2\conf\mime.types + -copy docs\cgi-examples\printenv $(INSTALL)\Apache2\cgi-bin\printenv.pl + @echo rem copying the docs directories > xc.bat + @echo xcopy docs\error $(INSTALL)\Apache2\error $(XCOPYSW) >> xc.bat + @echo xcopy docs\docroot $(INSTALL)\Apache2\htdocs $(XCOPYSW) >> xc.bat + @echo xcopy docs\icons $(INSTALL)\Apache2\icons $(XCOPYSW) >> xc.bat + @echo xcopy docs\man $(INSTALL)\Apache2\man $(XCOPYSW) >> xc.bat + @echo xcopy docs\manual $(INSTALL)\Apache2\manual $(XCOPYSW) >> xc.bat + $(CMD) xc.bat + $(DEL) xc.bat + + + +installdev :: FORCE + -copy $(subst /,\,$(AP_WORK))\include\*.h $(INSTALL)\Apache2\include\*.* + -copy $(subst /,\,$(AP_WORK))\os\netware\*.h $(INSTALL)\Apache2\include\*.* + -copy $(subst /,\,$(NWOS))\*.imp $(INSTALL)\Apache2\lib\*.* + -copy $(subst /,\,$(APR))\include\*.h $(INSTALL)\Apache2\include\*.* + -copy $(subst /,\,$(APRUTIL))\include\*.h $(INSTALL)\Apache2\include\*.* + -copy $(subst /,\,$(APR))\*.imp $(INSTALL)\Apache2\lib\*.* + -copy $(subst /,\,$(NWOS))\*.xdc $(INSTALL)\Apache2\lib\*.* + +# +# Any specialized rules here +# + +$(OBJDIR)/%.o: server/%.c $(OBJDIR)\$(NLM_NAME)_cc.opt + @echo compiling $< + $(CC) $< -o=$(OBJDIR)\$(@F) @$(OBJDIR)\$(NLM_NAME)_cc.opt + +$(OBJDIR)/%.o: modules/arch/netware/%.c $(OBJDIR)\$(NLM_NAME)_cc.opt + @echo compiling $< + $(CC) $< -o=$(OBJDIR)\$(@F) @$(OBJDIR)\$(NLM_NAME)_cc.opt + +$(OBJDIR)/%.o: modules/http/%.c $(OBJDIR)\$(NLM_NAME)_cc.opt + @echo compiling $< + $(CC) $< -o=$(OBJDIR)\$(@F) @$(OBJDIR)\$(NLM_NAME)_cc.opt + +$(OBJDIR)/%.o: modules/aaa/%.c $(OBJDIR)\$(NLM_NAME)_cc.opt + @echo compiling $< + $(CC) $< -o=$(OBJDIR)\$(@F) @$(OBJDIR)\$(NLM_NAME)_cc.opt + +$(OBJDIR)/%.o: modules/mappers/%.c $(OBJDIR)\$(NLM_NAME)_cc.opt + @echo compiling $< + $(CC) $< -o=$(OBJDIR)\$(@F) @$(OBJDIR)\$(NLM_NAME)_cc.opt + +$(OBJDIR)/%.o: modules/generators/%.c $(OBJDIR)\$(NLM_NAME)_cc.opt + @echo compiling $< + $(CC) $< -o=$(OBJDIR)\$(@F) @$(OBJDIR)\$(NLM_NAME)_cc.opt + +$(OBJDIR)/%.o: modules/metadata/%.c $(OBJDIR)\$(NLM_NAME)_cc.opt + @echo compiling $< + $(CC) $< -o=$(OBJDIR)\$(@F) @$(OBJDIR)\$(NLM_NAME)_cc.opt + +$(OBJDIR)/%.o: modules/filters/%.c $(OBJDIR)\$(NLM_NAME)_cc.opt + @echo compiling $< + $(CC) $< -o=$(OBJDIR)\$(@F) @$(OBJDIR)\$(NLM_NAME)_cc.opt + +$(OBJDIR)/%.o: modules/loggers/%.c $(OBJDIR)\$(NLM_NAME)_cc.opt + @echo compiling $< + $(CC) $< -o=$(OBJDIR)\$(@F) @$(OBJDIR)\$(NLM_NAME)_cc.opt + +$(OBJDIR)/%.o: os/netware/%.c $(OBJDIR)\$(NLM_NAME)_cc.opt + @echo compiling $< + $(CC) $< -o=$(OBJDIR)\$(@F) @$(OBJDIR)\$(NLM_NAME)_cc.opt + +$(OBJDIR)/%.o: server/mpm/netware/%.c $(OBJDIR)\$(NLM_NAME)_cc.opt + @echo compiling $< + $(CC) $< -o=$(OBJDIR)\$(@F) @$(OBJDIR)\$(NLM_NAME)_cc.opt + +$(OBJDIR)/%.o: srclib/pcre/%.c $(OBJDIR)\$(NLM_NAME)_cc.opt + @echo compiling $< + $(CC) $< -o=$(OBJDIR)\$(@F) @$(OBJDIR)\$(NLM_NAME)_cc.opt + +# +# Include the 'tail' makefile that has targets that depend on variables defined +# in this makefile +# + +include $(AP_WORK)\build\NWGNUtail.inc + diff --git a/rubbos/app/httpd-2.0.64/README b/rubbos/app/httpd-2.0.64/README new file mode 100644 index 00000000..581e11c3 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/README @@ -0,0 +1,140 @@ + + 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 http://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 + http://httpd.apache.org/docs-2.0/. + + 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 SSL encrypted network sockets in the files under the directory + srclib/apr-util/ssl/ + that makes use of a general-purpose encryption library, such as + OpenSSL or the operating system's platform-specific SSL facilities. + Apache httpd currently does not use that apr-util interface. + + 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 + http://httpd.apache.org/lists.html#http-announce + + o If you want freely available support for running Apache please join the + Apache user community by subscribing to Users Mailing List at + http://httpd.apache.org/userslist.html or one of the following USENET + newsgroups: + comp.infosystems.www.servers.unix + comp.infosystems.www.servers.ms-windows + Also available at: + http://groups.google.com/groups?group=comp.infosystems.www.servers + + o If you want commercial support for running Apache please contact + one of the companies and contractors which are listed at + http://www.apache.org/info/support.cgi + + o If you have a concrete bug report for Apache please go to the + Apache Group Bug Database and submit your report: + http://httpd.apache.org/bug_report.html + + o If you want to participate in actively developing Apache please + subscribe to the `dev@httpd.apache.org' mailing list as described at + http://www.apache.org/lists.html#http-dev + + Acknowledgments + ---------------- + + We wish to acknowledge the following copyrighted works that + make up portions of the Apache software: + + 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). + + 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/ + + Apache 2.0 relies heavily on the use of autoconf and libtool to provide + a build environment. diff --git a/rubbos/app/httpd-2.0.64/README.platforms b/rubbos/app/httpd-2.0.64/README.platforms new file mode 100644 index 00000000..3c8e6180 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/README.platforms @@ -0,0 +1,92 @@ + + Apache HTTP Server + + Platform specific notes: + ------------------------ + +================ + Darwin (OS X): + Apache 2.0 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.0 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.5.2 and (g)libtool 1.4.2. + + Earlier versions of OS X are not so fortunate, and the bundled tools + are not only older versions, but also, for the most part, do not work + well. If you are interested in developing under Darwin, we + recommend that you obtain and install replacement versions of what + are normally installed on Darwin (and OS X, as of v10.1.5). If + you build your own versions of autoconf 2.52 and libtool 1.4.2, be + aware that there are some Darwin specific patches to the official + code that still must be applied for them to fully work. A useful + page to check out is: + + http://fink.sourceforge.net/doc/porting/libtool.php + + Pier Fumagalli also provides pre-built Darwin packages of the + patched autoconf and libtool suites, available at: + + http://www.apache.org/~pier/macosx/ + + You will note that GNU libtool should actually be installed as + glibtool, to avoid conflict with a Darwin program of the same + name. Pier's packages have this change already. All files are + installed under /usr/local/ so to use these versions, and be sure + that /usr/local/bin is earlier in your PATH. + + 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. + +========== + 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. + +================ + 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+.) diff --git a/rubbos/app/httpd-2.0.64/VERSIONING b/rubbos/app/httpd-2.0.64/VERSIONING new file mode 100644 index 00000000..18ba70d5 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/VERSIONING @@ -0,0 +1,154 @@ +APACHE 2.x VERSIONING +===================== +Last modified at [$Date: 2004-11-24 19:31:09 +0000 (Wed, 24 Nov 2004) $] + + +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 compatiblity 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 CVS tree should not remain unstable at any time. Atomic commits + aught 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 CVS head 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 accomodate 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 resposibility 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/rubbos/app/httpd-2.0.64/acconfig.h b/rubbos/app/httpd-2.0.64/acconfig.h new file mode 100644 index 00000000..31ad39f7 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/acconfig.h @@ -0,0 +1,2 @@ +/* Define this if struct tm has a field tm_gmtoff */ +#undef HAVE_GMTOFF diff --git a/rubbos/app/httpd-2.0.64/acinclude.m4 b/rubbos/app/httpd-2.0.64/acinclude.m4 new file mode 100644 index 00000000..993b8a81 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/acinclude.m4 @@ -0,0 +1,542 @@ + +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(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(LIBTOOL) + APACHE_SUBST(SHELL) + APACHE_SUBST(MODULE_DIRS) + APACHE_SUBST(MODULE_CLEANDIRS) + APACHE_SUBST(PORT) + APACHE_SUBST(nonssl_listen_stmt_1) + APACHE_SUBST(nonssl_listen_stmt_2) + APACHE_SUBST(CORE_IMPLIB_FILE) + APACHE_SUBST(CORE_IMPLIB) + APACHE_SUBST(SH_LIBS) + APACHE_SUBST(SH_LIBTOOL) + APACHE_SUBST(MK_IMPLIB) + APACHE_SUBST(INSTALL_PROG_FLAGS) + APACHE_SUBST(DSO_MODULES) + APACHE_SUBST(APR_BINDIR) + APACHE_SUBST(APR_INCLUDEDIR) + APACHE_SUBST(APU_BINDIR) + APACHE_SUBST(APU_INCLUDEDIR) + + abs_srcdir="`(cd $srcdir && pwd)`" + + echo 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 ## APACHE_OUTPUT(file) +dnl ## adds "file" to the list of files generated by AC_OUTPUT +dnl ## This macro can be used several times. +AC_DEFUN(APACHE_OUTPUT, [ + APACHE_OUTPUT_FILES="$APACHE_OUTPUT_FILES $1" +]) + +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 APACHE_MODPATH_INIT(modpath) +AC_DEFUN(APACHE_MODPATH_INIT,[ + current_dir=$1 + modpath_current=modules/$1 + modpath_static= + modpath_shared= + 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 + 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 + libname="mod_$1.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<[ ]*/d" \ + -e '/[ ]*<\/Layout>[ ]*/,$d' \ + -e "s/^[ ]*//g" \ + -e "s/:[ ]*/=\'/g" \ + -e "s/[ ]*$/'/g" \ + $1 > $pldconf + layout_name=$2 + . $pldconf + rm $pldconf + for var in prefix exec_prefix bindir sbindir libexecdir mandir \ + sysconfdir datadir errordir iconsdir htdocsdir cgidir \ + includedir localstatedir runtimedir logfiledir libdir \ + manualdir proxycachedir installbuilddir; 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 APACHE_ENABLE_LAYOUT +dnl +AC_DEFUN(APACHE_ENABLE_LAYOUT,[ +AC_ARG_ENABLE(layout, +[ --enable-layout=LAYOUT],[ + LAYOUT=$enableval +]) + +if test -z "$LAYOUT"; then + LAYOUT="Apache" +fi +APACHE_LAYOUT($srcdir/config.layout, $LAYOUT) + +AC_MSG_CHECKING(for chosen layout) +AC_MSG_RESULT($layout_name) +]) + +dnl +dnl APACHE_ENABLE_MODULES +dnl +AC_DEFUN(APACHE_ENABLE_MODULES,[ + module_selection=default + module_default=yes + + AC_ARG_ENABLE(modules, + APACHE_HELP_STRING(--enable-modules=MODULE-LIST,Modules to enable),[ + for i in $enableval; do + if test "$i" = "all" -o "$i" = "most"; then + module_selection=$i + else + eval "enable_$i=yes" + fi + done + ]) + + AC_ARG_ENABLE(mods-shared, + APACHE_HELP_STRING(--enable-mods-shared=MODULE-LIST,Shared modules to enable),[ + for i in $enableval; do + if test "$i" = "all" -o "$i" = "most"; then + module_selection=$i + module_default=shared + else + i=`echo $i | sed 's/-/_/g'` + eval "enable_$i=shared" + fi + done + ]) +]) + +AC_DEFUN(APACHE_REQUIRE_CXX,[ + if test -z "$apache_cxx_done"; then + AC_PROG_CXX + AC_PROG_CXXCPP + apache_cxx_done=yes + fi +]) + +dnl +dnl APACHE_CHECK_SSL_TOOLKIT +dnl +dnl Find the openssl toolkit installation and check it for the right +dnl version, then add its flags to INCLUDES and LIBS. This should +dnl really be using a custom AC_TRY_COMPILE function to test the includes +dnl and then AC_TRY_LINK to test the libraries directly for the version, +dnl but that will require someone who knows how to program openssl. +dnl +AC_DEFUN(APACHE_CHECK_SSL_TOOLKIT,[ +if test "x$ap_ssltk_base" = "x"; then + AC_MSG_CHECKING(for SSL/TLS toolkit base) + ap_ssltk_base="" + AC_ARG_WITH(ssl, APACHE_HELP_STRING(--with-ssl=DIR,SSL/TLS toolkit (OpenSSL)), [ + if test "x$withval" != "xyes" -a "x$withval" != "x"; then + ap_ssltk_base="$withval" + if test -f "$ap_ssltk_base/bin/openssl"; then + ap_ssltk_version="`$ap_ssltk_base/bin/openssl version`" + else + ap_ssltk_version="unknown" + fi + fi + ]) + if test "x$ap_ssltk_base" = "x"; then + AC_CACHE_VAL(ap_cv_ssltk,[ + # + # shotgun approach: find all occurrences of the openssl program + # + # The IFS=... trick eliminates the colons from $PATH, without using an external program + for p in `IFS=":$IFS"; echo $PATH` /usr/local/openssl/bin /usr/local/ssl/bin; do + if test -f "$p/openssl"; then + ap_ssltk_version="`$p/openssl version`" + if test "x$ap_ssltk_version" != "x"; then + ap_cv_ssltk="`(cd $p/.. && pwd)`" + break + fi + fi + done + if test "x$ap_cv_ssltk" = "x"; then + AC_MSG_ERROR([requires OpenSSL 0.9.6e or higher]) + fi + ]) + ap_ssltk_base="$ap_cv_ssltk" + fi + if test ! -d $ap_ssltk_base; then + AC_MSG_ERROR([invalid SSL/TLS toolkit base directory $ap_ssltk_base]) + fi + AC_MSG_RESULT($ap_ssltk_base) + + AC_MSG_CHECKING(for SSL/TLS toolkit version) + AC_MSG_RESULT($ap_ssltk_version) + case "$ap_ssltk_version" in + "OpenSSL "[[1-9]]* | \ + "OpenSSL "0.9.6[[e-z]]* | \ + "OpenSSL "0.9.[[7-9]]* | \ + "OpenSSL "0.[[1-9]][[0-9]]* ) + # okay versions that do not have known security holes + ;; + "OpenSSL"*) + AC_MSG_WARN([OpenSSL versions prior to 0.9.6e have known security holes]) + ;; + *) + # unknown version -- assume the user knows what they are doing + ;; + esac + + AC_MSG_CHECKING(for SSL/TLS toolkit includes) + ap_ssltk_incdir="" + for p in $ap_ssltk_base/include /usr/local/openssl/include \ + /usr/local/ssl/include /usr/local/include /usr/include; do + if test -f "$p/openssl/ssl.h"; then + ap_ssltk_incdir="$p" + break + elif test -f "$p/ssl.h"; then + ap_ssltk_incdir="$p" + break + fi + done + if test "x$ap_ssltk_incdir" = "x"; then + AC_MSG_ERROR([OpenSSL headers not found]) + fi + AC_MSG_RESULT($ap_ssltk_incdir) + + AC_MSG_CHECKING(for SSL/TLS toolkit libraries) + ap_ssltk_libdir="" + for p in $ap_ssltk_base/lib /usr/local/openssl/lib \ + /usr/local/ssl/lib /usr/local/lib /usr/lib /lib /usr/lib64; do + if test -f "$p/libssl.a" -o -f "$p/libssl.so" -o -f "$p/libssl.dylib"; then + ap_ssltk_libdir="$p" + break + fi + done + if test ".$ap_ssltk_libdir" = .; then + AC_MSG_ERROR([OpenSSL libraries not found]) + fi + AC_MSG_RESULT($ap_ssltk_libdir) + + dnl # annotate the Apache build environment with determined information + APR_ADDTO(INCLUDES, [-I$ap_ssltk_incdir/openssl]) + if test "x$ap_ssltk_incdir" != "x/usr/include"; then + APR_ADDTO(INCLUDES, [-I$ap_ssltk_incdir]) + fi + if test "x$ap_ssltk_libdir" != "x/usr/lib"; then + APR_ADDTO(LDFLAGS, [-L$ap_ssltk_libdir]) + if test "x$ap_platform_runtime_link_flag" != "x"; then + APR_ADDTO(LDFLAGS, [$ap_platform_runtime_link_flag$ap_ssltk_libdir]) + fi + fi + # Put SSL libraries in SSL_LIBS. + APR_SETVAR(SSL_LIBS, [-lssl -lcrypto]) + pkg-config openssl 2> /dev/null + if test $? -eq 0; then + ap_ssltk_incdep=`pkg-config --cflags-only-I openssl` + APR_ADDTO(INCLUDES, $ap_ssltk_incdep) + ap_ssltk_libdep=`pkg-config --libs openssl` + APR_SETVAR(SSL_LIBS, $ap_ssltk_libdep) + fi + APACHE_SUBST(SSL_LIBS) + ap_cv_ssltk="$ap_ssltk_base" +fi +]) + +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) +]) + diff --git a/rubbos/app/httpd-2.0.64/apachenw.mcp.zip b/rubbos/app/httpd-2.0.64/apachenw.mcp.zip new file mode 100644 index 0000000000000000000000000000000000000000..6e7e7224b328534b6c85754575375a52d75d8ef7 GIT binary patch literal 189152 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
    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/rubbos/app/httpd-2.0.64/build/fastgen.sh b/rubbos/app/httpd-2.0.64/build/fastgen.sh new file mode 100755 index 00000000..87bce15e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/build/find_apr.m4 b/rubbos/app/httpd-2.0.64/build/find_apr.m4 new file mode 100644 index 00000000..90865aec --- /dev/null +++ b/rubbos/app/httpd-2.0.64/build/find_apr.m4 @@ -0,0 +1,104 @@ +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]]) +dnl +dnl where srcdir is the location of the bundled APR source directory, or +dnl empty if source is not bundled. +dnl +dnl where blddir 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 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 "$ac_cv_emxos2" = "yes"; then + # Scripts don't pass test -x on OS/2 + TEST_X="test -f" + else + TEST_X="test -x" + fi + + AC_MSG_CHECKING(for APR) + AC_ARG_WITH(apr, + [ --with-apr=DIR|FILE prefix for installed APR, path to APR build tree, + or the full path to apr-config], + [ + if test "$withval" = "no" || test "$withval" = "yes"; then + AC_MSG_ERROR([--with-apr requires a directory to be provided]) + fi + + if $TEST_X "$withval/bin/apr-config"; then + apr_found="yes" + apr_config="$withval/bin/apr-config" + elif $TEST_X "$withval/apr-config"; then + apr_found="yes" + apr_config="$withval/apr-config" + elif $TEST_X "$withval" && $withval --help > /dev/null 2>&1 ; then + apr_found="yes" + apr_config="$withval" + fi + + dnl if --with-apr is used, then the target prefix/directory must be valid + 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 have a bundled source directory, use it + if test -d "$1"; then + apr_temp_abs_srcdir="`cd $1 && pwd`" + apr_found="reconfig" + if test -n "$2"; then + apr_config="$2/apr-config" + else + apr_config="$1/apr-config" + fi + fi + if test "$apr_found" = "no" && test -n "$3" && test "$3" = "1"; then + if apr-config --help > /dev/null 2>&1 ; then + apr_found="yes" + apr_config="apr-config" + else + dnl look in some standard places (apparently not in builtin/default) + for lookdir in /usr /usr/local /opt/apr /usr/local/apache2 ; do + if $TEST_X "$lookdir/bin/apr-config"; then + apr_found="yes" + apr_config="$lookdir/bin/apr-config" + break + fi + done + fi + fi + ]) + + AC_MSG_RESULT($apr_found) +]) diff --git a/rubbos/app/httpd-2.0.64/build/find_apu.m4 b/rubbos/app/httpd-2.0.64/build/find_apu.m4 new file mode 100644 index 00000000..f62d7b11 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/build/find_apu.m4 @@ -0,0 +1,102 @@ +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, path, implicit-install-check]) +dnl +dnl where srcdir is the location of the bundled APU source directory, or +dnl empty if source is not bundled. +dnl where path is the prefix to the location where the bundled APU will +dnl will be built. +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 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: 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" + + AC_MSG_CHECKING(for APR-util) + AC_ARG_WITH(apr-util, + [ --with-apr-util=DIR prefix for installed APU, or path to APU build tree], + [ + if test "$withval" = "no" || test "$withval" = "yes"; then + AC_MSG_ERROR([--with-apr-util requires a directory to be provided]) + fi + + if test -x "$withval/bin/apu-config"; then + apu_found="yes" + apu_config="$withval/bin/apu-config" + elif test -x "$withval/apu-config"; then + dnl Already configured build dir + apu_found="yes" + apu_config="$withval/apu-config" + elif test -x "$withval" && $withval --help > /dev/null 2>&1 ; then + apu_found="yes" + apu_config="$withval" + fi + + dnl if --with-apr-util is used, then the target prefix/directory must + dnl be valid + if test "$apu_found" != "yes"; then + AC_MSG_ERROR([ +The directory given to --with-apr-util does not specify a prefix for an +installed APU, nor an APR-util build directory.]) + fi + ],[ + dnl if we have a bundled source directory, use it + if test -d "$1"; then + apu_found="reconfig" + if test -n "$2"; then + apu_config="$2/apu-config" + else + apu_config="$1/apu-config" + fi + fi + if test "$apu_found" = "no" && test -n "$3" && test "$3" = "1"; then + if apu-config --help > /dev/null 2>&1 ; then + apu_found="yes" + apu_config="apu-config" + else + dnl look in the some standard places (apparently not in builtin/default) + for lookdir in /usr /usr/local /opt/apr /usr/local/apache2 ; do + if test -x "$lookdir/bin/apu-config"; then + apu_found="yes" + apu_config="$lookdir/bin/apu-config" + break + fi + done + fi + fi + ]) + + AC_MSG_RESULT($apu_found) +]) diff --git a/rubbos/app/httpd-2.0.64/build/get-version.sh b/rubbos/app/httpd-2.0.64/build/get-version.sh new file mode 100755 index 00000000..ddf175ce --- /dev/null +++ b/rubbos/app/httpd-2.0.64/build/get-version.sh @@ -0,0 +1,57 @@ +#!/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" = "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/rubbos/app/httpd-2.0.64/build/install-bindist.sh.in b/rubbos/app/httpd-2.0.64/build/install-bindist.sh.in new file mode 100755 index 00000000..f304ac7c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/build/install.sh b/rubbos/app/httpd-2.0.64/build/install.sh new file mode 100755 index 00000000..c5d20dac --- /dev/null +++ b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/build/instdso.sh b/rubbos/app/httpd-2.0.64/build/instdso.sh new file mode 100755 index 00000000..bcd96fff --- /dev/null +++ b/rubbos/app/httpd-2.0.64/build/instdso.sh @@ -0,0 +1,93 @@ +#!/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 + +CMD="$SH_LIBTOOL --mode=install cp $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 + +DLNAME=`grep "^dlname" $TARGETDIR/$DSOARCHIVE_BASENAME | sed -e "s/dlname='\([^']*\)'/\1/"` +LIBRARY_NAMES=`grep "library_names" $TARGETDIR/$DSOARCHIVE_BASENAME | sed -e "s/dlname='\([^']*\)'/\1/"` +LIBRARY_NAMES=`echo $LIBRARY_NAMES | sed -e "s/ *$DLNAME//g"` + +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/rubbos/app/httpd-2.0.64/build/library.mk b/rubbos/app/httpd-2.0.64/build/library.mk new file mode 100644 index 00000000..930d4655 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/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) $(LTLIBRARY_LDFLAGS) $(LTLIBRARY_OBJECTS) $(LTLIBRARY_LIBADD) diff --git a/rubbos/app/httpd-2.0.64/build/ltlib.mk b/rubbos/app/httpd-2.0.64/build/ltlib.mk new file mode 100644 index 00000000..3b87dd36 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/build/ltmain.sh b/rubbos/app/httpd-2.0.64/build/ltmain.sh new file mode 100644 index 00000000..2bcb8482 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/build/ltmain.sh @@ -0,0 +1,6956 @@ +# ltmain.sh - Provide generalized library-building support services. +# NOTE: Changing this file will not affect anything until you rerun configure. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, +# 2007, 2008 Free Software Foundation, Inc. +# Originally by Gordon Matzigkeit , 1996 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +basename="s,^.*/,,g" + +# 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 $basename` +modename="$progname" + +# Global variables: +EXIT_SUCCESS=0 +EXIT_FAILURE=1 + +PROGRAM=ltmain.sh +PACKAGE=libtool +VERSION=1.5.26 +TIMESTAMP=" (1.1220.2.493 2008/02/01 16:58:18)" + +# Be Bourne compatible (taken from Autoconf:_AS_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 + +# Check that we have a working $echo. +if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X$1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then + # Yippee, $echo works! + : +else + # Restart under the correct shell, and then maybe $echo will work. + exec $SHELL "$progpath" --no-reexec ${1+"$@"} +fi + +if test "X$1" = X--fallback-echo; then + # used as fallback echo + shift + cat <&2 + $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit $EXIT_FAILURE +fi + +# Global variables. +mode=$default_mode +nonopt= +prev= +prevopt= +run= +show="$echo" +show_help= +execute_dlfiles= +duplicate_deps=no +preserve_args= +lo2o="s/\\.lo\$/.${objext}/" +o2lo="s/\\.${objext}\$/.lo/" +extracted_archives= +extracted_serial=0 + +##################################### +# Shell function definitions: +# This seems to be the best place for them + +# func_mktempdir [string] +# Make a temporary directory that won't clash with other running +# libtool processes, and avoids race conditions if possible. If +# given, STRING is the basename for that directory. +func_mktempdir () +{ + my_template="${TMPDIR-/tmp}/${1-$progname}" + + if test "$run" = ":"; then + # Return a directory name, but don't create it in dry-run mode + my_tmpdir="${my_template}-$$" + else + + # If mktemp works, use that first and foremost + my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` + + if test ! -d "$my_tmpdir"; then + # Failing that, at least try and use $RANDOM to avoid a race + my_tmpdir="${my_template}-${RANDOM-0}$$" + + save_mktempdir_umask=`umask` + umask 0077 + $mkdir "$my_tmpdir" + umask $save_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$my_tmpdir" || { + $echo "cannot create temporary directory \`$my_tmpdir'" 1>&2 + exit $EXIT_FAILURE + } + fi + + $echo "X$my_tmpdir" | $Xsed +} + + +# 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. +func_win32_libid () +{ + 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 + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | \ + $EGREP -e 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then + win32_nmres=`eval $NM -f posix -A $1 | \ + $SED -n -e '1,100{ + / I /{ + s,.*,import, + p + q + } + }'` + 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_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 () +{ + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + CC_quoted="$CC_quoted $arg" + done + 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 "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) ;; + # 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. + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + CC_quoted="$CC_quoted $arg" + done + case "$@ " in + " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) + # 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 + $echo "$modename: unable to infer tagged configuration" + $echo "$modename: specify a tag with \`--tag'" 1>&2 + exit $EXIT_FAILURE +# else +# $echo "$modename: using $tagname tagged configuration" + fi + ;; + esac + fi +} + + +# func_extract_an_archive dir oldlib +func_extract_an_archive () +{ + f_ex_an_ar_dir="$1"; shift + f_ex_an_ar_oldlib="$1" + + $show "(cd $f_ex_an_ar_dir && $AR x $f_ex_an_ar_oldlib)" + $run eval "(cd \$f_ex_an_ar_dir && $AR x \$f_ex_an_ar_oldlib)" || exit $? + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then + : + else + $echo "$modename: ERROR: object name conflicts: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" 1>&2 + exit $EXIT_FAILURE + fi +} + +# func_extract_archives gentop oldlib ... +func_extract_archives () +{ + my_gentop="$1"; shift + my_oldlibs=${1+"$@"} + my_oldobjs="" + my_xlib="" + my_xabs="" + my_xdir="" + my_status="" + + $show "${rm}r $my_gentop" + $run ${rm}r "$my_gentop" + $show "$mkdir $my_gentop" + $run $mkdir "$my_gentop" + my_status=$? + if test "$my_status" -ne 0 && test ! -d "$my_gentop"; then + exit $my_status + fi + + 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 + my_xlib=`$echo "X$my_xlib" | $Xsed -e 's%^.*/%%'` + my_xlib_u=$my_xlib + while :; do + case " $extracted_archives " in + *" $my_xlib_u "*) + extracted_serial=`expr $extracted_serial + 1` + 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" + + $show "${rm}r $my_xdir" + $run ${rm}r "$my_xdir" + $show "$mkdir $my_xdir" + $run $mkdir "$my_xdir" + exit_status=$? + if test "$exit_status" -ne 0 && test ! -d "$my_xdir"; then + exit $exit_status + fi + case $host in + *-darwin*) + $show "Extracting $my_xabs" + # Do not bother doing anything if just a dry run + if test -z "$run"; then + darwin_orig_dir=`pwd` + cd $my_xdir || exit $? + darwin_archive=$my_xabs + darwin_curdir=`pwd` + darwin_base_archive=`$echo "X$darwin_archive" | $Xsed -e 's%^.*/%%'` + darwin_arches=`lipo -info "$darwin_archive" 2>/dev/null | $EGREP Architectures 2>/dev/null` + if test -n "$darwin_arches"; then + darwin_arches=`echo "$darwin_arches" | $SED -e 's/.*are://'` + darwin_arch= + $show "$darwin_base_archive has multiple architectures $darwin_arches" + for darwin_arch in $darwin_arches ; do + 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 have a bunch of thin objects, gotta fatten them up :) + darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print| xargs basename | sort -u | $NL2SP` + darwin_file= + darwin_files= + for darwin_file in $darwin_filelist; do + darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP` + lipo -create -output "$darwin_file" $darwin_files + done # $darwin_filelist + ${rm}r unfat-$$ + cd "$darwin_orig_dir" + else + cd "$darwin_orig_dir" + func_extract_an_archive "$my_xdir" "$my_xabs" + fi # $darwin_arches + fi # $run + ;; + *) + func_extract_an_archive "$my_xdir" "$my_xabs" + ;; + esac + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` + done + func_extract_archives_result="$my_oldobjs" +} +# End of Shell function definitions +##################################### + +# Darwin sucks +eval std_shrext=\"$shrext_cmds\" + +disable_libs=no + +# Parse our command line options once, thoroughly. +while test "$#" -gt 0 +do + arg="$1" + shift + + case $arg in + -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;; + *) optarg= ;; + esac + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + execute_dlfiles) + execute_dlfiles="$execute_dlfiles $arg" + ;; + tag) + tagname="$arg" + preserve_args="${preserve_args}=$arg" + + # Check whether tagname contains only valid characters + case $tagname in + *[!-_A-Za-z0-9,/]*) + $echo "$progname: invalid tag name: $tagname" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + case $tagname in + CC) + # Don't test for the "default" C tag, as we know, it's there, but + # not specially marked. + ;; + *) + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "$progpath" > /dev/null; then + taglist="$taglist $tagname" + # Evaluate the configuration. + eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$tagname'$/,/^# ### END LIBTOOL TAG CONFIG: '$tagname'$/p' < $progpath`" + else + $echo "$progname: ignoring unknown tag $tagname" 1>&2 + fi + ;; + esac + ;; + *) + eval "$prev=\$arg" + ;; + esac + + prev= + prevopt= + continue + fi + + # Have we seen a non-optional argument yet? + case $arg in + --help) + show_help=yes + ;; + + --version) + echo "\ +$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP + +Copyright (C) 2008 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." + exit $? + ;; + + --config) + ${SED} -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $progpath + # Now print the configurations for the tags. + for tagname in $taglist; do + ${SED} -n -e "/^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$/,/^# ### END LIBTOOL TAG CONFIG: $tagname$/p" < "$progpath" + done + exit $? + ;; + + --debug) + $echo "$progname: enabling shell trace mode" + set -x + preserve_args="$preserve_args $arg" + ;; + + --dry-run | -n) + run=: + ;; + + --features) + $echo "host: $host" + if test "$build_libtool_libs" = yes; then + $echo "enable shared libraries" + else + $echo "disable shared libraries" + fi + if test "$build_old_libs" = yes; then + $echo "enable static libraries" + else + $echo "disable static libraries" + fi + exit $? + ;; + + --finish) mode="finish" ;; + + --mode) prevopt="--mode" prev=mode ;; + --mode=*) mode="$optarg" ;; + + --preserve-dup-deps) duplicate_deps="yes" ;; + + --quiet | --silent) + show=: + preserve_args="$preserve_args $arg" + ;; + + --tag) + prevopt="--tag" + prev=tag + preserve_args="$preserve_args --tag" + ;; + --tag=*) + set tag "$optarg" ${1+"$@"} + shift + prev=tag + preserve_args="$preserve_args --tag" + ;; + + -dlopen) + prevopt="-dlopen" + prev=execute_dlfiles + ;; + + -*) + $echo "$modename: unrecognized option \`$arg'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + + *) + nonopt="$arg" + break + ;; + esac +done + +if test -n "$prevopt"; then + $echo "$modename: option \`$prevopt' requires an argument" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE +fi + +case $disable_libs in +no) + ;; +shared) + build_libtool_libs=no + build_old_libs=yes + ;; +static) + build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` + ;; +esac + +# 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= + +if test -z "$show_help"; then + + # Infer the operation mode. + if test -z "$mode"; then + $echo "*** Warning: inferring the mode of operation is deprecated." 1>&2 + $echo "*** Future versions of Libtool will require --mode=MODE be specified." 1>&2 + case $nonopt in + *cc | cc* | *++ | gcc* | *-gcc* | g++* | xlc*) + mode=link + for arg + do + case $arg in + -c) + mode=compile + break + ;; + esac + done + ;; + *db | *dbx | *strace | *truss) + mode=execute + ;; + *install*|cp|mv) + mode=install + ;; + *rm) + mode=uninstall + ;; + *) + # If we have no mode, but dlfiles were specified, then do execute mode. + test -n "$execute_dlfiles" && mode=execute + + # Just use the default operation mode. + if test -z "$mode"; then + if test -n "$nonopt"; then + $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2 + else + $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2 + fi + fi + ;; + esac + fi + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$execute_dlfiles" && test "$mode" != execute; then + $echo "$modename: unrecognized option \`-dlopen'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Change the help message to a mode-specific one. + generic_help="$help" + help="Try \`$modename --help --mode=$mode' for more information." + + # These modes are in order of execution frequency so that they run quickly. + case $mode in + # libtool compile mode + compile) + modename="$modename: compile" + # Get the compilation command and the source file. + base_compile= + srcfile="$nonopt" # always keep a non-empty value in "srcfile" + suppress_opt=yes + suppress_output= + arg_mode=normal + libobj= + later= + + 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) + if test -n "$libobj" ; then + $echo "$modename: you cannot specify \`-o' more than once" 1>&2 + exit $EXIT_FAILURE + fi + arg_mode=target + continue + ;; + + -static | -prefer-pic | -prefer-non-pic) + later="$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,*) + args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"` + lastarg= + save_ifs="$IFS"; IFS=',' + for arg in $args; do + IFS="$save_ifs" + + # Double-quote args containing other shell metacharacters. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + lastarg="$lastarg $arg" + done + IFS="$save_ifs" + lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"` + + # Add the arguments to base_compile. + base_compile="$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. + lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"` + + case $lastarg in + # Double-quote args containing other shell metacharacters. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, and some SunOS ksh mistreat backslash-escaping + # in scan sets (worked around with variable expansion), + # and furthermore cannot handle '|' '&' '(' ')' in scan sets + # at all, so we specify them separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + lastarg="\"$lastarg\"" + ;; + esac + + base_compile="$base_compile $lastarg" + done # for arg + + case $arg_mode in + arg) + $echo "$modename: you must specify an argument for -Xcompile" + exit $EXIT_FAILURE + ;; + target) + $echo "$modename: you must specify a target with \`-o'" 1>&2 + exit $EXIT_FAILURE + ;; + *) + # Get the name of the library object. + [ -z "$libobj" ] && libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'` + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + xform='[cCFSifmso]' + case $libobj in + *.ada) xform=ada ;; + *.adb) xform=adb ;; + *.ads) xform=ads ;; + *.asm) xform=asm ;; + *.c++) xform=c++ ;; + *.cc) xform=cc ;; + *.ii) xform=ii ;; + *.class) xform=class ;; + *.cpp) xform=cpp ;; + *.cxx) xform=cxx ;; + *.[fF][09]?) xform=[fF][09]. ;; + *.for) xform=for ;; + *.java) xform=java ;; + *.obj) xform=obj ;; + *.sx) xform=sx ;; + esac + + libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"` + + case $libobj in + *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;; + *) + $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + func_infer_tag $base_compile + + for arg in $later; do + case $arg in + -static) + build_old_libs=yes + continue + ;; + + -prefer-pic) + pic_mode=yes + continue + ;; + + -prefer-non-pic) + pic_mode=no + continue + ;; + esac + done + + qlibobj=`$echo "X$libobj" | $Xsed -e "$sed_quote_subst"` + case $qlibobj in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + qlibobj="\"$qlibobj\"" ;; + esac + test "X$libobj" != "X$qlibobj" \ + && $echo "X$libobj" | grep '[]~#^*{};<>?"'"'"' &()|`$[]' \ + && $echo "$modename: libobj name \`$libobj' may not contain shell special characters." + objname=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` + xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$obj"; then + xdir= + else + xdir=$xdir/ + fi + lobj=${xdir}$objdir/$objname + + if test -z "$base_compile"; then + $echo "$modename: you must specify a compilation command" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Delete any leftover library objects. + if test "$build_old_libs" = yes; then + removelist="$obj $lobj $libobj ${libobj}T" + else + removelist="$lobj $libobj ${libobj}T" + fi + + $run $rm $removelist + trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | pw32* | os2*) + pic_mode=default + ;; + esac + if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; 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 "$compiler_c_o" = no; then + output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext} + lockfile="$output_obj.lock" + removelist="$removelist $output_obj $lockfile" + trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 + 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 "$need_locks" = yes; then + until $run ln "$progpath" "$lockfile" 2>/dev/null; do + $show "Waiting for $lockfile to be removed" + sleep 2 + done + elif test "$need_locks" = warn; then + if test -f "$lockfile"; then + $echo "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit $EXIT_FAILURE + fi + $echo "$srcfile" > "$lockfile" + fi + + if test -n "$fix_srcfile_path"; then + eval srcfile=\"$fix_srcfile_path\" + fi + qsrcfile=`$echo "X$srcfile" | $Xsed -e "$sed_quote_subst"` + case $qsrcfile in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + qsrcfile="\"$qsrcfile\"" ;; + esac + + $run $rm "$libobj" "${libobj}T" + + # Create a libtool object file (analogous to a ".la" file), + # but don't create it if we're doing a dry run. + test -z "$run" && cat > ${libobj}T </dev/null`" != "X$srcfile"; then + $echo "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit $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 + $show "$mv $output_obj $lobj" + if $run $mv $output_obj $lobj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + fi + + # Append the name of the PIC object to the libtool object file. + test -z "$run" && cat >> ${libobj}T <> ${libobj}T </dev/null`" != "X$srcfile"; then + $echo "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then + $show "$mv $output_obj $obj" + if $run $mv $output_obj $obj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + fi + + # Append the name of the non-PIC object the libtool object file. + # Only append if the libtool object file exists. + test -z "$run" && cat >> ${libobj}T <> ${libobj}T <&2 + 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 + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + qarg=\"`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`\" ### testsuite: skip nested quoting test + ;; + *) qarg=$arg ;; + esac + libtool_args="$libtool_args $qarg" + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + output) + compile_command="$compile_command @OUTPUT@" + finalize_command="$finalize_command @OUTPUT@" + ;; + esac + + case $prev in + dlfiles|dlprefiles) + if test "$preload" = no; then + # Add the symbol object into the linking commands. + compile_command="$compile_command @SYMFILE@" + finalize_command="$finalize_command @SYMFILE@" + preload=yes + fi + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test "$dlself" = no; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test "$prev" = dlprefiles; then + dlself=yes + elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test "$prev" = dlfiles; then + dlfiles="$dlfiles $arg" + else + dlprefiles="$dlprefiles $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols="$arg" + if test ! -f "$arg"; then + $echo "$modename: symbol file \`$arg' does not exist" + exit $EXIT_FAILURE + fi + prev= + continue + ;; + expsyms_regex) + export_symbols_regex="$arg" + prev= + continue + ;; + inst_prefix) + inst_prefix_dir="$arg" + prev= + continue + ;; + precious_regex) + precious_files_regex="$arg" + prev= + continue + ;; + release) + release="-$arg" + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat $save_arg` + do +# moreargs="$moreargs $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + pic_object= + non_pic_object= + + # Read the .lo file + # If there is no directory component, then add one. + case $arg in + */* | *\\*) . $arg ;; + *) . ./$arg ;; + esac + + if test -z "$pic_object" || \ + test -z "$non_pic_object" || + test "$pic_object" = none && \ + test "$non_pic_object" = none; then + $echo "$modename: cannot find name of object for \`$arg'" 1>&2 + exit $EXIT_FAILURE + fi + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles="$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 "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles $pic_object" + prev= + fi + + # A PIC object. + libobjs="$libobjs $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + non_pic_objects="$non_pic_objects $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; 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" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if test -z "$run"; then + $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 + exit $EXIT_FAILURE + else + # Dry-run case. + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` + non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` + libobjs="$libobjs $pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + fi + done + else + $echo "$modename: link input file \`$save_arg' does not exist" + exit $EXIT_FAILURE + fi + arg=$save_arg + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + $echo "$modename: only absolute run-paths are allowed" 1>&2 + exit $EXIT_FAILURE + ;; + esac + if test "$prev" = rpath; then + case "$rpath " in + *" $arg "*) ;; + *) rpath="$rpath $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) xrpath="$xrpath $arg" ;; + esac + fi + prev= + continue + ;; + xcompiler) + compiler_flags="$compiler_flags $qarg" + prev= + compile_command="$compile_command $qarg" + finalize_command="$finalize_command $qarg" + continue + ;; + xlinker) + linker_flags="$linker_flags $qarg" + compiler_flags="$compiler_flags $wl$qarg" + prev= + compile_command="$compile_command $wl$qarg" + finalize_command="$finalize_command $wl$qarg" + continue + ;; + xcclinker) + linker_flags="$linker_flags $qarg" + compiler_flags="$compiler_flags $qarg" + prev= + compile_command="$compile_command $qarg" + finalize_command="$finalize_command $qarg" + continue + ;; + shrext) + shrext_cmds="$arg" + prev= + continue + ;; + darwin_framework|darwin_framework_skip) + test "$prev" = "darwin_framework" && compiler_flags="$compiler_flags $arg" + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + prev= + 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 + compile_command="$compile_command $link_static_flag" + finalize_command="$finalize_command $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + $echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2 + continue + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + $echo "$modename: more than one -exported-symbols argument is not allowed" + exit $EXIT_FAILURE + fi + if test "X$arg" = "X-export-symbols"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -framework|-arch|-isysroot) + case " $CC " in + *" ${arg} ${1} "* | *" ${arg} ${1} "*) + prev=darwin_framework_skip ;; + *) compiler_flags="$compiler_flags $arg" + prev=darwin_framework ;; + esac + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + 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*) + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + ;; + esac + continue + ;; + + -L*) + dir=`$echo "X$arg" | $Xsed -e 's/^-L//'` + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2 + absdir="$dir" + notinst_path="$notinst_path $dir" + fi + dir="$absdir" + ;; + esac + case "$deplibs " in + *" -L$dir "*) ;; + *) + deplibs="$deplibs -L$dir" + lib_search_path="$lib_search_path $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) + testbindir=`$echo "X$dir" | $Xsed -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + *) dllsearchpath="$dllsearchpath:$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + *) dllsearchpath="$dllsearchpath:$testbindir";; + esac + ;; + esac + continue + ;; + + -l*) + if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos*) + # 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$arg" = "X-lc" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + test "X$arg" = "X-lc" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + deplibs="$deplibs -framework System" + continue + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + test "X$arg" = "X-lc" && continue + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + test "X$arg" = "X-lc" && continue + ;; + esac + elif test "X$arg" = "X-lc_r"; then + case $host in + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + deplibs="$deplibs $arg" + continue + ;; + + # Tru64 UNIX uses -model [arg] to determine the layout of C++ + # classes, name mangling, and exception handling. + -model) + compile_command="$compile_command $arg" + compiler_flags="$compiler_flags $arg" + finalize_command="$finalize_command $arg" + prev=xcompiler + continue + ;; + + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) + compiler_flags="$compiler_flags $arg" + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + continue + ;; + + -multi_module) + single_module="${wl}-multi_module" + continue + ;; + + -module) + module=yes + continue + ;; + + # -64, -mips[0-9] enable 64-bit mode on the SGI compiler + # -r[0-9][0-9]* specifies the processor on the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler + # +DA*, +DD* enable 64-bit mode on the HP compiler + # -q* pass through compiler args for the IBM compiler + # -m* pass through architecture-specific compiler args for GCC + # -m*, -t[45]*, -txscale* pass through architecture-specific + # compiler args for GCC + # -p, -pg, --coverage, -fprofile-* pass through profiling flag for GCC + # -F/path gives path to uninstalled frameworks, gcc on darwin + # @file GCC response files + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*) + + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + compiler_flags="$compiler_flags $arg" + continue + ;; + + -shrext) + prev=shrext + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin*) + # The PATH hackery in wrapper scripts is required on Windows + # and Darwin in order for the loader to find any dlls it needs. + $echo "$modename: warning: \`-no-install' is ignored for $host" 1>&2 + $echo "$modename: warning: assuming \`-no-fast-install' instead" 1>&2 + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -objectlist) + prev=objectlist + continue + ;; + + -o) prev=output ;; + + -precious-files-regex) + prev=precious_regex + continue + ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + dir=`$echo "X$arg" | $Xsed -e 's/^-R//'` + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + $echo "$modename: only absolute run-paths are allowed" 1>&2 + exit $EXIT_FAILURE + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$xrpath $dir" ;; + esac + 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 + ;; + + -Wc,*) + args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'` + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + case $flag in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + flag="\"$flag\"" + ;; + esac + arg="$arg $wl$flag" + compiler_flags="$compiler_flags $flag" + done + IFS="$save_ifs" + arg=`$echo "X$arg" | $Xsed -e "s/^ //"` + ;; + + -Wl,*) + args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'` + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + case $flag in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + flag="\"$flag\"" + ;; + esac + arg="$arg $wl$flag" + compiler_flags="$compiler_flags $wl$flag" + linker_flags="$linker_flags $flag" + done + IFS="$save_ifs" + arg=`$echo "X$arg" | $Xsed -e "s/^ //"` + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + continue + ;; + + # Some other compiler flag. + -* | +*) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + ;; + + *.$objext) + # A standard object. + objs="$objs $arg" + ;; + + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + pic_object= + non_pic_object= + + # Read the .lo file + # If there is no directory component, then add one. + case $arg in + */* | *\\*) . $arg ;; + *) . ./$arg ;; + esac + + if test -z "$pic_object" || \ + test -z "$non_pic_object" || + test "$pic_object" = none && \ + test "$non_pic_object" = none; then + $echo "$modename: cannot find name of object for \`$arg'" 1>&2 + exit $EXIT_FAILURE + fi + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles="$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 "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles $pic_object" + prev= + fi + + # A PIC object. + libobjs="$libobjs $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + non_pic_objects="$non_pic_objects $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; 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" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if test -z "$run"; then + $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 + exit $EXIT_FAILURE + else + # Dry-run case. + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` + non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` + libobjs="$libobjs $pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + fi + ;; + + *.$libext) + # An archive. + deplibs="$deplibs $arg" + old_deplibs="$old_deplibs $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + if test "$prev" = dlfiles; then + # This library was specified with -dlopen. + dlfiles="$dlfiles $arg" + prev= + elif test "$prev" = dlprefiles; then + # The library was specified with -dlpreopen. + dlprefiles="$dlprefiles $arg" + prev= + else + deplibs="$deplibs $arg" + 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. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + ;; + esac # arg + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + fi + done # argument parsing loop + + if test -n "$prev"; then + $echo "$modename: the \`$prevarg' option requires an argument" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'` + libobjs_save="$libobjs" + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$echo \"X\${$shlibpath_var}\" \| \$Xsed -e \'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\" + + output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'` + if test "X$output_objdir" = "X$output"; then + output_objdir="$objdir" + else + output_objdir="$output_objdir/$objdir" + fi + # Create the object directory. + if test ! -d "$output_objdir"; then + $show "$mkdir $output_objdir" + $run $mkdir $output_objdir + exit_status=$? + if test "$exit_status" -ne 0 && test ! -d "$output_objdir"; then + exit $exit_status + fi + fi + + # Determine the type of output + case $output in + "") + $echo "$modename: you must specify an output file" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + esac + + case $host in + *cygwin* | *mingw* | *pw32*) + # don't eliminate duplications in $postdeps and $predeps + duplicate_compiler_generated_deps=yes + ;; + *) + duplicate_compiler_generated_deps=$duplicate_deps + ;; + 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 test "X$duplicate_deps" = "Xyes" ; then + case "$libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + libs="$libs $deplib" + done + + if test "$linkmode" = lib; 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 test "X$duplicate_compiler_generated_deps" = "Xyes" ; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;; + esac + pre_post_deps="$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 + case $linkmode in + lib) + passes="conv link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + $echo "$modename: libraries can \`-dlopen' only libtool libraries: $file" 1>&2 + exit $EXIT_FAILURE + ;; + esac + done + ;; + prog) + compile_deplibs= + finalize_deplibs= + alldeplibs=no + newdlfiles= + newdlprefiles= + passes="conv scan dlopen dlpreopen link" + ;; + *) passes="conv" + ;; + esac + for pass in $passes; do + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan"; then + libs="$deplibs" + deplibs= + fi + if test "$linkmode" = prog; then + case $pass in + dlopen) libs="$dlfiles" ;; + dlpreopen) libs="$dlprefiles" ;; + link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; + esac + fi + if test "$pass" = dlopen; then + # Collect dlpreopened libraries + save_deplibs="$deplibs" + deplibs= + fi + for deplib in $libs; do + lib= + found=no + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + compiler_flags="$compiler_flags $deplib" + fi + continue + ;; + -l*) + if test "$linkmode" != lib && test "$linkmode" != prog; then + $echo "$modename: warning: \`-l' is ignored for archives/objects" 1>&2 + continue + fi + name=`$echo "X$deplib" | $Xsed -e 's/^-l//'` + if test "$linkmode" = lib; 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 "$search_ext" = ".la"; then + found=yes + else + found=no + fi + break 2 + fi + done + done + if test "$found" != yes; then + # deplib doesn't seem to be a libtool library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + else # 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 "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $deplib "*) + if (${SED} -e '2q' $lib | + grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + library_names= + old_library= + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + for l in $old_library $library_names; do + ll="$l" + done + if test "X$ll" = "X$old_library" ; then # only static version available + found=no + ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` + test "X$ladir" = "X$lib" && ladir="." + lib=$ladir/$old_library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + fi + ;; # -l + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test "$pass" = conv && continue + newdependency_libs="$deplib $newdependency_libs" + newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` + ;; + prog) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + if test "$pass" = scan; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` + ;; + *) + $echo "$modename: warning: \`-L' is ignored for archives/objects" 1>&2 + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test "$pass" = link; then + dir=`$echo "X$deplib" | $Xsed -e 's/^-R//'` + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$xrpath $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) lib="$deplib" ;; + *.$libext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + valid_a_lib=no + case $deplibs_check_method in + match_pattern*) + set dummy $deplibs_check_method + match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` + if eval $echo \"$deplib\" 2>/dev/null \ + | $SED 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + valid_a_lib=yes + fi + ;; + pass_all) + valid_a_lib=yes + ;; + esac + if test "$valid_a_lib" != yes; then + $echo + $echo "*** Warning: Trying to link with static lib archive $deplib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because the file extensions .$libext of this argument makes me believe" + $echo "*** that it is just a static archive that I should not used here." + else + $echo + $echo "*** Warning: Linking the shared library $output against the" + $echo "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + fi + continue + ;; + prog) + if test "$pass" != link; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + elif test "$linkmode" = prog; then + if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + newdlprefiles="$newdlprefiles $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + newdlfiles="$newdlfiles $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=yes + continue + ;; + esac # case $deplib + if test "$found" = yes || test -f "$lib"; then : + else + $echo "$modename: cannot find the library \`$lib' or unhandled argument \`$deplib'" 1>&2 + exit $EXIT_FAILURE + fi + + # Check to see that this really is a libtool archive. + if (${SED} -e '2q' $lib | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + + ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` + test "X$ladir" = "X$lib" && ladir="." + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= + # 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 + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan" || + { test "$linkmode" != prog && test "$linkmode" != lib; }; then + test -n "$dlopen" && dlfiles="$dlfiles $dlopen" + test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen" + fi + + if test "$pass" = conv; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + # It is a libtool convenience library, so add in its objects. + convenience="$convenience $ladir/$objdir/$old_library" + old_convenience="$old_convenience $ladir/$objdir/$old_library" + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if test "X$duplicate_deps" = "Xyes" ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done + elif test "$linkmode" != prog && test "$linkmode" != lib; then + $echo "$modename: \`$lib' is not a convenience library" 1>&2 + exit $EXIT_FAILURE + fi + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + for l in $old_library $library_names; do + linklib="$l" + done + if test -z "$linklib"; then + $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + + # This library was specified with -dlopen. + if test "$pass" = dlopen; then + if test -z "$libdir"; then + $echo "$modename: cannot -dlopen a convenience library: \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + if test -z "$dlname" || + test "$dlopen_support" != yes || + test "$build_libtool_libs" = no; 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. + dlprefiles="$dlprefiles $lib $dependency_libs" + else + newdlfiles="$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 + $echo "$modename: warning: cannot determine absolute directory name of \`$ladir'" 1>&2 + $echo "$modename: passing it literally to the linker, although it might fail" 1>&2 + abs_ladir="$ladir" + fi + ;; + esac + laname=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` + + # Find the relevant object directory and library name. + if test "X$installed" = Xyes; then + if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + $echo "$modename: warning: library \`$lib' was moved." 1>&2 + dir="$ladir" + absdir="$abs_ladir" + libdir="$abs_ladir" + else + dir="$libdir" + absdir="$libdir" + fi + test "X$hardcode_automatic" = Xyes && 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 + notinst_path="$notinst_path $abs_ladir" + else + dir="$ladir/$objdir" + absdir="$abs_ladir/$objdir" + # Remove this search path later + notinst_path="$notinst_path $abs_ladir" + fi + fi # $installed = yes + name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` + + # This library was specified with -dlpreopen. + if test "$pass" = dlpreopen; then + if test -z "$libdir"; then + $echo "$modename: cannot -dlpreopen a convenience library: \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + newdlprefiles="$newdlprefiles $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + newdlprefiles="$newdlprefiles $dir/$dlname" + else + newdlprefiles="$newdlprefiles $dir/$linklib" + fi + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test "$linkmode" = lib; then + deplibs="$dir/$old_library $deplibs" + elif test "$linkmode,$pass" = "prog,link"; 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 "$linkmode" = prog && test "$pass" != link; then + newlib_search_path="$newlib_search_path $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=no + if test "$link_all_deplibs" != no || test -z "$library_names" || + test "$build_libtool_libs" = no; then + linkalldeplibs=yes + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test + esac + # Need to link against all dependency_libs? + if test "$linkalldeplibs" = yes; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi + if test "X$duplicate_deps" = "Xyes" ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test "$linkmode,$pass" = "prog,link"; then + if test -n "$library_names" && + { { test "$prefer_static_libs" = no || + test "$prefer_static_libs,$installed" = "built,yes"; } || + 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 + *" $dir "*) ;; + *" $absdir "*) ;; + *) temp_rpath="$temp_rpath $absdir" ;; + 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 "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if test "$alldeplibs" = yes && + { test "$deplibs_check_method" = pass_all || + { test "$build_libtool_libs" = yes && + 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 "$use_static_libs" = built && test "$installed" = yes ; then + use_static_libs=no + fi + if test -n "$library_names" && + { test "$use_static_libs" = no || test -z "$old_library"; }; then + if test "$installed" = no; then + notinst_deplibs="$notinst_deplibs $lib" + need_relink=yes + fi + # This is a shared library + + # Warn about portability, can't link against -module's on + # some systems (darwin) + if test "$shouldnotlink" = yes && test "$pass" = link ; then + $echo + if test "$linkmode" = prog; then + $echo "*** Warning: Linking the executable $output against the loadable module" + else + $echo "*** Warning: Linking the shared library $output against the loadable module" + fi + $echo "*** $linklib is not portable!" + fi + if test "$linkmode" = lib && + test "$hardcode_into_libs" = yes; 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 "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + realname="$2" + shift; 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 in + *cygwin* | mingw*) + major=`expr $current - $age` + versuffix="-$major" + ;; + esac + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot="$soname" + soname=`$echo $soroot | ${SED} -e 's/^.*\///'` + newlib="libimp-`$echo $soname | ${SED} 's/^lib//;s/\.dll$//'`.a" + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + $show "extracting exported symbol list from \`$soname'" + save_ifs="$IFS"; IFS='~' + cmds=$extract_expsyms_cmds + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + $show "generating import library for \`$soname'" + save_ifs="$IFS"; IFS='~' + cmds=$old_archive_from_expsyms_cmds + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + 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 "$linkmode" = prog || test "$mode" != relink; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test "$hardcode_direct" = no; 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 module then we can not link against + # it, someone is ignoring the new warnings I added + if /usr/bin/file -L $add 2> /dev/null | + $EGREP ": [^:]* bundle" >/dev/null ; then + $echo "** Warning, lib $linklib is a module, not a shared library" + if test -z "$old_library" ; then + $echo + $echo "** And there doesn't seem to be a static archive available" + $echo "** The link will probably fail, sorry" + else + add="$dir/$old_library" + fi + fi + esac + elif test "$hardcode_minus_L" = no; then + case $host in + *-*-sunos*) add_shlibpath="$dir" ;; + esac + add_dir="-L$dir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = no; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + relink) + if test "$hardcode_direct" = yes; then + add="$dir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$dir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + add_dir="$add_dir -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test "$lib_linked" != yes; then + $echo "$modename: configuration error: unsupported hardcode properties" + exit $EXIT_FAILURE + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;; + esac + fi + if test "$linkmode" = prog; 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 "$hardcode_direct" != yes && \ + test "$hardcode_minus_L" != yes && \ + test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; + esac + fi + fi + fi + + if test "$linkmode" = prog || test "$mode" = relink; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test "$hardcode_direct" = yes; then + add="$libdir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$libdir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; + esac + add="-l$name" + elif test "$hardcode_automatic" = yes; 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$libdir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + add_dir="$add_dir -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + fi + + if test "$linkmode" = prog; 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 "$linkmode" = prog; 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 "$hardcode_direct" != unsupported; 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 "$build_libtool_libs" = yes; then + # Not a shared library + if test "$deplibs_check_method" != pass_all; 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. + $echo + $echo "*** Warning: This system can not link to static lib archive $lib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have." + if test "$module" = yes; then + $echo "*** But as you try to build a module library, libtool will still create " + $echo "*** a static module, that should work as long as the dlopening application" + $echo "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then + $echo + $echo "*** However, this would only work if libtool was able to extract symbol" + $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + $echo "*** not find such a program. So, this module is probably useless." + $echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + 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 "$linkmode" = lib; then + if test -n "$dependency_libs" && + { test "$hardcode_into_libs" != yes || + test "$build_old_libs" = yes || + test "$link_static" = yes; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) temp_xrpath=`$echo "X$libdir" | $Xsed -e 's/^-R//'` + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) xrpath="$xrpath $temp_xrpath";; + esac;; + *) temp_deplibs="$temp_deplibs $libdir";; + esac + done + dependency_libs="$temp_deplibs" + fi + + newlib_search_path="$newlib_search_path $absdir" + # Link against this library + test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + if test "X$duplicate_deps" = "Xyes" ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done + + if test "$link_all_deplibs" != no; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + case $deplib in + -L*) path="$deplib" ;; + *.la) + dir=`$echo "X$deplib" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$deplib" && dir="." + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2 + absdir="$dir" + fi + ;; + esac + if grep "^installed=no" $deplib > /dev/null; then + path="$absdir/$objdir" + else + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + if test -z "$libdir"; then + $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + if test "$absdir" != "$libdir"; then + $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2 + fi + path="$absdir" + fi + depdepl= + case $host in + *-*-darwin*) + # we do not want to link against static libs, + # but need to link against shared + eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + eval deplibdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names" ; then + for tmp in $deplibrary_names ; do + depdepl=$tmp + done + if test -f "$deplibdir/$depdepl" ; then + depdepl="$deplibdir/$depdepl" + elif test -f "$path/$depdepl" ; then + depdepl="$path/$depdepl" + else + # Can't find it, oh well... + depdepl= + fi + # do not add paths which are already there + case " $newlib_search_path " in + *" $path "*) ;; + *) newlib_search_path="$newlib_search_path $path";; + esac + fi + path="" + ;; + *) + path="-L$path" + ;; + esac + ;; + -l*) + case $host in + *-*-darwin*) + # Again, we only want to link against shared libraries + eval tmp_libs=`$echo "X$deplib" | $Xsed -e "s,^\-l,,"` + for tmp in $newlib_search_path ; do + if test -f "$tmp/lib$tmp_libs.dylib" ; then + eval depdepl="$tmp/lib$tmp_libs.dylib" + break + fi + done + path="" + ;; + *) continue ;; + esac + ;; + *) continue ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$path $deplibs" ;; + esac + case " $deplibs " in + *" $depdepl "*) ;; + *) deplibs="$depdepl $deplibs" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + dependency_libs="$newdependency_libs" + if test "$pass" = dlpreopen; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test "$pass" != dlopen; then + if test "$pass" != conv; then + # 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 "*) ;; + *) lib_search_path="$lib_search_path $dir" ;; + esac + done + newlib_search_path= + fi + + if test "$linkmode,$pass" != "prog,link"; then + vars="deplibs" + else + vars="compile_deplibs finalize_deplibs" + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # 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. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) tmp_libs="$tmp_libs $deplib" ;; + esac + ;; + *) tmp_libs="$tmp_libs $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + # 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 + tmp_libs="$tmp_libs $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test "$linkmode" = prog; then + dlfiles="$newdlfiles" + dlprefiles="$newdlprefiles" + fi + + case $linkmode in + oldlib) + case " $deplibs" in + *\ -l* | *\ -L*) + $echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2 ;; + esac + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2 + fi + + if test -n "$rpath"; then + $echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2 + fi + + if test -n "$xrpath"; then + $echo "$modename: warning: \`-R' is ignored for archives" 1>&2 + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info/-version-number' is ignored for archives" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for archives" 1>&2 + fi + + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + $echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2 + fi + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs="$output" + objs="$objs$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form `libNAME.la'. + case $outputname in + lib*) + name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + ;; + *) + if test "$module" = no; then + $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + if test "$need_lib_prefix" != no; then + # Add the "lib" prefix for modules if required + name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + else + libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` + fi + ;; + esac + + if test -n "$objs"; then + if test "$deplibs_check_method" != pass_all; then + $echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1 + exit $EXIT_FAILURE + else + $echo + $echo "*** Warning: Linking the shared library $output against the non-libtool" + $echo "*** objects $objs is not portable!" + libobjs="$libobjs $objs" + fi + fi + + if test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen self' is ignored for libtool libraries" 1>&2 + fi + + set dummy $rpath + if test "$#" -gt 2; then + $echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2 + fi + install_libdir="$2" + + oldlibs= + if test -z "$rpath"; then + if test "$build_libtool_libs" = yes; then + # Building a libtool convenience library. + # 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 + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info/-version-number' is ignored for convenience libraries" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2 + fi + else + + # Parse the version information argument. + save_ifs="$IFS"; IFS=':' + set dummy $vinfo 0 0 0 + IFS="$save_ifs" + + if test -n "$8"; then + $echo "$modename: too many parameters to \`-version-info'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # 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="$2" + number_minor="$3" + number_revision="$4" + # + # 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 + # which has an extra 1 added just for fun + # + case $version_type in + darwin|linux|osf|windows|none) + current=`expr $number_major + $number_minor` + age="$number_minor" + revision="$number_revision" + ;; + freebsd-aout|freebsd-elf|sunos) + current="$number_major" + revision="$number_minor" + age="0" + ;; + irix|nonstopux) + current=`expr $number_major + $number_minor` + age="$number_minor" + revision="$number_minor" + lt_irix_increment=no + ;; + esac + ;; + no) + current="$2" + revision="$3" + age="$4" + ;; + 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]) ;; + *) + $echo "$modename: CURRENT \`$current' must be a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + ;; + 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]) ;; + *) + $echo "$modename: REVISION \`$revision' must be a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + ;; + 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]) ;; + *) + $echo "$modename: AGE \`$age' must be a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + if test "$age" -gt "$current"; then + $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + 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 + major=.`expr $current - $age` + versuffix="$major.$age.$revision" + # Darwin ld doesn't like 0 for these options... + minor_current=`expr $current + 1` + xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + + freebsd-aout) + major=".$current" + versuffix=".$current.$revision"; + ;; + + freebsd-elf) + major=".$current" + versuffix=".$current"; + ;; + + irix | nonstopux) + if test "X$lt_irix_increment" = "Xno"; then + major=`expr $current - $age` + else + major=`expr $current - $age + 1` + fi + 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 "$loop" -ne 0; do + iface=`expr $revision - $loop` + loop=`expr $loop - 1` + verstring="$verstring_prefix$major.$iface:$verstring" + done + + # Before this point, $major must not contain `.'. + major=.$major + versuffix="$major.$revision" + ;; + + linux) + major=.`expr $current - $age` + versuffix="$major.$age.$revision" + ;; + + osf) + major=.`expr $current - $age` + versuffix=".$current.$age.$revision" + verstring="$current.$age.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$age + while test "$loop" -ne 0; do + iface=`expr $current - $loop` + loop=`expr $loop - 1` + verstring="$verstring:${iface}.0" + done + + # Make executables depend on our current version. + verstring="$verstring:${current}.0" + ;; + + sunos) + major=".$current" + versuffix=".$current.$revision" + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 filesystems. + major=`expr $current - $age` + versuffix="-$major" + ;; + + *) + $echo "$modename: unknown library version type \`$version_type'" 1>&2 + $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit $EXIT_FAILURE + ;; + 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 "$need_version" = no; then + versuffix= + else + versuffix=".0.0" + fi + fi + + # Remove version info from name if versioning should be avoided + if test "$avoid_version" = yes && test "$need_version" = no; then + major= + versuffix= + verstring="" + fi + + # Check to see if the archive will have undefined symbols. + if test "$allow_undefined" = yes; then + if test "$allow_undefined_flag" = unsupported; then + $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2 + build_libtool_libs=no + build_old_libs=yes + fi + else + # Don't allow undefined symbols. + allow_undefined_flag="$no_undefined_flag" + fi + fi + + if test "$mode" != relink; 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) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) + if test "X$precious_files_regex" != "X"; then + if echo $p | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + removelist="$removelist $p" + ;; + *) ;; + esac + done + if test -n "$removelist"; then + $show "${rm}r $removelist" + $run ${rm}r $removelist + fi + fi + + # Now set the variables for building old libraries. + if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then + oldlibs="$oldlibs $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + #for path in $notinst_path; do + # lib_search_path=`$echo "$lib_search_path " | ${SED} -e "s% $path % %g"` + # deplibs=`$echo "$deplibs " | ${SED} -e "s% -L$path % %g"` + # dependency_libs=`$echo "$dependency_libs " | ${SED} -e "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 + temp_xrpath="$temp_xrpath -R$libdir" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; 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 "*) ;; + *) dlfiles="$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 "*) ;; + *) dlprefiles="$dlprefiles $lib" ;; + esac + done + + if test "$build_libtool_libs" = yes; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + deplibs="$deplibs -framework System" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # 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 "$build_libtool_need_lc" = "yes"; then + deplibs="$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 + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $rm conftest.c + cat > conftest.c </dev/null` + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null \ + | grep " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib="$potent_lib" + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; + *) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \ + | ${SED} 10q \ + | $EGREP "$file_magic_regex" > /dev/null; then + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + $echo + $echo "*** Warning: linker path does not have real file for library $a_deplib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $echo "*** with $libname but no candidates were found. (...for file magic test)" + else + $echo "*** with $libname and none of the candidates passed a file format test" + $echo "*** using a file magic. Last file checked: $potlib" + fi + fi + else + # Add a -L argument. + newdeplibs="$newdeplibs $a_deplib" + fi + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method + match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` + for a_deplib in $deplibs; do + name=`expr $a_deplib : '-l\(.*\)'` + # If $name is empty we are operating on a -L argument. + if test -n "$name" && test "$name" != "0"; then + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $a_deplib "*) + newdeplibs="$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 + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + $echo + $echo "*** Warning: linker path does not have real file for library $a_deplib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $echo "*** with $libname but no candidates were found. (...for regex pattern test)" + else + $echo "*** with $libname and none of the candidates passed a file format test" + $echo "*** using a regex pattern. Last file checked: $potlib" + fi + fi + else + # Add a -L argument. + newdeplibs="$newdeplibs $a_deplib" + fi + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs="" + tmp_deplibs=`$echo "X $deplibs" | $Xsed -e 's/ -lc$//' \ + -e 's/ -[LR][^ ]*//g'` + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + for i in $predeps $postdeps ; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$echo "X $tmp_deplibs" | ${SED} -e "1s,^X,," -e "s,$i,,"` + done + fi + if $echo "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' \ + | grep . >/dev/null; then + $echo + if test "X$deplibs_check_method" = "Xnone"; then + $echo "*** Warning: inter-library dependencies are not supported in this platform." + else + $echo "*** Warning: inter-library dependencies are not known to be supported." + fi + $echo "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + fi + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + newdeplibs=`$echo "X $newdeplibs" | $Xsed -e 's/ -lc / -framework System /'` + ;; + esac + + if test "$droppeddeps" = yes; then + if test "$module" = yes; then + $echo + $echo "*** Warning: libtool could not satisfy all declared inter-library" + $echo "*** dependencies of module $libname. Therefore, libtool will create" + $echo "*** a static module, that should work as long as the dlopening" + $echo "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + $echo + $echo "*** However, this would only work if libtool was able to extract symbol" + $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + $echo "*** not find such a program. So, this module is probably useless." + $echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + $echo "*** The inter-library dependencies that have been dropped here will be" + $echo "*** automatically added whenever a program is linked with this library" + $echo "*** or is declared to -dlopen it." + + if test "$allow_undefined" = no; 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 "$build_old_libs" = no; 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 + + + # 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 "*) + new_libs="$new_libs -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$new_libs $deplib" ;; + esac + ;; + *) new_libs="$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 "$build_libtool_libs" = yes; then + if test "$hardcode_into_libs" = yes; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath="$finalize_rpath" + test "$mode" != relink && rpath="$compile_rpath$rpath" + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + dep_rpath="$dep_rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + if test -n "$hardcode_libdir_flag_spec_ld"; then + case $archive_cmds in + *\$LD*) eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" ;; + *) eval dep_rpath=\"$hardcode_libdir_flag_spec\" ;; + esac + else + eval dep_rpath=\"$hardcode_libdir_flag_spec\" + fi + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath="$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 "$mode" != relink && 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 + realname="$2" + shift; 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 + linknames="$linknames $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then + $show "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $run $rm $export_symbols + cmds=$export_symbols_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + if len=`expr "X$cmd" : ".*"` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then + $show "$cmd" + $run eval "$cmd" || exit $? + skipped_export=false + else + # The command line is too long to execute in one step. + $show "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"; then + $show "$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"" + $run eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + $show "$mv \"${export_symbols}T\" \"$export_symbols\"" + $run eval '$mv "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"' + fi + + tmp_deplibs= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + tmp_deplibs="$tmp_deplibs $test_deplib" + ;; + esac + done + deplibs="$tmp_deplibs" + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + else + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + func_extract_archives $gentop $convenience + libobjs="$libobjs $func_extract_archives_result" + fi + fi + + if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + linker_flags="$linker_flags $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test "$mode" = relink; then + $run eval '(cd $output_objdir && $rm ${realname}U && $mv $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test "$module" = yes && 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 "X$skipped_export" != "X:" && + len=`expr "X$test_cmds" : ".*" 2>/dev/null` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # The command line is too long to link in one step, link piecewise. + $echo "creating reloadable object files..." + + # 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 + output_la=`$echo "X$output" | $Xsed -e "$basename"` + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + delfiles= + last_robj= + k=1 + output=$output_objdir/$output_la-${k}.$objext + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + eval test_cmds=\"$reload_cmds $objlist $last_robj\" + if test "X$objlist" = X || + { len=`expr "X$test_cmds" : ".*" 2>/dev/null` && + test "$len" -le "$max_cmd_len"; }; then + objlist="$objlist $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test "$k" -eq 1 ; then + # The first file doesn't have a previous command to add. + eval concat_cmds=\"$reload_cmds $objlist $last_robj\" + else + # All subsequent reloadable object files will link in + # the last one created. + eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj\" + fi + last_robj=$output_objdir/$output_la-${k}.$objext + k=`expr $k + 1` + output=$output_objdir/$output_la-${k}.$objext + objlist=$obj + len=1 + 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~ + eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\" + + if ${skipped_export-false}; then + $show "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $run $rm $export_symbols + libobjs=$output + # Append the command to create the export file. + eval concat_cmds=\"\$concat_cmds~$export_symbols_cmds\" + fi + + # Set up a command to remove the reloadable object files + # after they are used. + i=0 + while test "$i" -lt "$k" + do + i=`expr $i + 1` + delfiles="$delfiles $output_objdir/$output_la-${i}.$objext" + done + + $echo "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" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + 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\" + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test "$module" = yes && 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 + + # Append the command to remove the reloadable object files + # to the just-reset $cmds. + eval cmds=\"\$cmds~\$rm $delfiles\" + fi + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$mode" = relink; then + $run eval '(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 "$mode" = relink; then + $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 + $show "${rm}r $gentop" + $run ${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 + $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)" + $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $? + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test "$module" = yes || test "$export_dynamic" = yes; then + # On all known operating systems, these are identical. + dlname="$soname" + fi + fi + ;; + + obj) + case " $deplibs" in + *\ -l* | *\ -L*) + $echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2 ;; + esac + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2 + fi + + if test -n "$rpath"; then + $echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2 + fi + + if test -n "$xrpath"; then + $echo "$modename: warning: \`-R' is ignored for objects" 1>&2 + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for objects" 1>&2 + fi + + case $output in + *.lo) + if test -n "$objs$old_deplibs"; then + $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2 + exit $EXIT_FAILURE + fi + libobj="$output" + obj=`$echo "X$output" | $Xsed -e "$lo2o"` + ;; + *) + libobj= + obj="$output" + ;; + esac + + # Delete the old objects. + $run $rm $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # reload_cmds runs $LD directly, so let us get rid of + # -Wl from whole_archive_flag_spec and hope we can get by with + # turning comma into space.. + wl= + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" + reload_conv_objs=$reload_objs\ `$echo "X$tmp_whole_archive_flags" | $Xsed -e 's|,| |g'` + else + gentop="$output_objdir/${obj}x" + generated="$generated $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + + # Create the old-style object. + reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test + + output="$obj" + cmds=$reload_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + exit $EXIT_SUCCESS + fi + + if test "$build_libtool_libs" != yes; then + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. + # $show "echo timestamp > $libobj" + # $run eval "echo timestamp > $libobj" || exit $? + exit $EXIT_SUCCESS + fi + + if test -n "$pic_flag" || test "$pic_mode" != default; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output="$libobj" + cmds=$reload_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + exit $EXIT_SUCCESS + ;; + + prog) + case $host in + *cygwin*) output=`$echo $output | ${SED} -e 's,.exe$,,;s,$,.exe,'` ;; + esac + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for programs" 1>&2 + fi + + if test "$preload" = yes; then + if test "$dlopen_support" = unknown && test "$dlopen_self" = unknown && + test "$dlopen_self_static" = unknown; then + $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support." + fi + fi + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$echo "X $compile_deplibs" | $Xsed -e 's/ -lc / -framework System /'` + finalize_deplibs=`$echo "X $finalize_deplibs" | $Xsed -e 's/ -lc / -framework System /'` + ;; + esac + + case $host in + *darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + if test "$tagname" = CXX ; then + compile_command="$compile_command ${wl}-bind_at_load" + finalize_command="$finalize_command ${wl}-bind_at_load" + fi + ;; + 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 "*) + new_libs="$new_libs -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$new_libs $deplib" ;; + esac + ;; + *) new_libs="$new_libs $deplib" ;; + esac + done + compile_deplibs="$new_libs" + + + compile_command="$compile_command $compile_deplibs" + finalize_command="$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 "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) + testbindir=`$echo "X$libdir" | $Xsed -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$libdir:"*) ;; + *) dllsearchpath="$dllsearchpath:$libdir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + *) dllsearchpath="$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"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath="$rpath" + + if test -n "$libobjs" && test "$build_old_libs" = yes; then + # Transform all the library objects into standard objects. + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + fi + + dlsyms= + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + dlsyms="${outputname}S.c" + else + $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2 + fi + fi + + if test -n "$dlsyms"; then + case $dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist="$output_objdir/${outputname}.nm" + + $show "$rm $nlist ${nlist}S ${nlist}T" + $run $rm "$nlist" "${nlist}S" "${nlist}T" + + # Parse the name list into a source file. + $show "creating $output_objdir/$dlsyms" + + test -z "$run" && $echo > "$output_objdir/$dlsyms" "\ +/* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */ +/* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +/* Prevent the only kind of declaration conflicts we can make. */ +#define lt_preloaded_symbols some_other_symbol + +/* External symbol declarations for the compiler. */\ +" + + if test "$dlself" = yes; then + $show "generating symbol list for \`$output'" + + test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$echo "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + for arg in $progfiles; do + $show "extracting global C symbols from \`$arg'" + $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $run eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + $run eval '$mv "$nlist"T "$nlist"' + fi + + if test -n "$export_symbols_regex"; then + $run eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + $run eval '$mv "$nlist"T "$nlist"' + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols="$output_objdir/$outputname.exp" + $run $rm $export_symbols + $run eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + case $host in + *cygwin* | *mingw* ) + $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + $run eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' + ;; + esac + else + $run eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + $run eval 'grep -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' + $run eval 'mv "$nlist"T "$nlist"' + case $host in + *cygwin* | *mingw* ) + $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + $run eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' + ;; + esac + fi + fi + + for arg in $dlprefiles; do + $show "extracting global C symbols from \`$arg'" + name=`$echo "$arg" | ${SED} -e 's%^.*/%%'` + $run eval '$echo ": $name " >> "$nlist"' + $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" + done + + if test -z "$run"; then + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $mv "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if grep -v "^: " < "$nlist" | + 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/$dlsyms"' + else + $echo '/* NONE */' >> "$output_objdir/$dlsyms" + fi + + $echo >> "$output_objdir/$dlsyms" "\ + +#undef lt_preloaded_symbols + +#if defined (__STDC__) && __STDC__ +# define lt_ptr void * +#else +# define lt_ptr char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +" + + case $host in + *cygwin* | *mingw* ) + $echo >> "$output_objdir/$dlsyms" "\ +/* DATA imports from DLLs on WIN32 can't be const, because + runtime relocations are performed -- see ld's documentation + on pseudo-relocs */ +struct { +" + ;; + * ) + $echo >> "$output_objdir/$dlsyms" "\ +const struct { +" + ;; + esac + + + $echo >> "$output_objdir/$dlsyms" "\ + const char *name; + lt_ptr address; +} +lt_preloaded_symbols[] = +{\ +" + + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$dlsyms" + + $echo >> "$output_objdir/$dlsyms" "\ + {0, (lt_ptr) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + fi + + pic_flag_for_symtable= + case $host in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + case "$compile_command " in + *" -static "*) ;; + *) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND";; + esac;; + *-*-hpux*) + case "$compile_command " in + *" -static "*) ;; + *) pic_flag_for_symtable=" $pic_flag";; + esac + esac + + # Now compile the dynamic symbol file. + $show "(cd $output_objdir && $LTCC $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")" + $run eval '(cd $output_objdir && $LTCC $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $? + + # Clean up the generated files. + $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T" + $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T" + + # Transform the symbol file into the correct name. + case $host in + *cygwin* | *mingw* ) + if test -f "$output_objdir/${outputname}.def" ; then + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%" | $NL2SP` + else + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` + fi + ;; + * ) + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` + ;; + esac + ;; + *) + $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2 + exit $EXIT_FAILURE + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s% @SYMFILE@%%" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s% @SYMFILE@%%" | $NL2SP` + fi + + if test "$need_relink" = no || test "$build_libtool_libs" != yes; then + # Replace the output file specification. + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e 's%@OUTPUT@%'"$output"'%g' | $NL2SP` + link_command="$compile_command$compile_rpath" + + # We have no uninstalled library dependencies, so finalize right now. + $show "$link_command" + $run eval "$link_command" + exit_status=$? + + # Delete the generated files. + if test -n "$dlsyms"; then + $show "$rm $output_objdir/${outputname}S.${objext}" + $run $rm "$output_objdir/${outputname}S.${objext}" + fi + + exit $exit_status + fi + + if test -n "$shlibpath_var"; then + # We should set the shlibpath_var + rpath= + for dir in $temp_rpath; do + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) + # Absolute path. + rpath="$rpath$dir:" + ;; + *) + # Relative path: add a thisdir entry. + rpath="$rpath\$thisdir/$dir:" + ;; + esac + done + temp_rpath="$rpath" + fi + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath="$rpath$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + rpath="$rpath$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test "$no_install" = yes; 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 "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $run $rm $output + # Link the executable and exit + $show "$link_command" + $run eval "$link_command" || exit $? + exit $EXIT_SUCCESS + fi + + if test "$hardcode_action" = relink; then + # Fast installation is not supported + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + + $echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2 + $echo "$modename: \`$output' will be relinked during installation" 1>&2 + else + if test "$fast_install" != no; then + link_command="$finalize_var$compile_command$finalize_rpath" + if test "$fast_install" = yes; then + relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $SP2NL | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g' | $NL2SP` + else + # fast_install is set to needless + relink_command= + fi + else + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + fi + fi + + # Replace the output file specification. + link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname + + $show "$link_command" + $run eval "$link_command" || exit $? + + # Now create the wrapper script. + $show "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + # 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}\" || 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 + var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` + relink_command="$var=\"$var_value\"; export $var; $relink_command" + fi + done + relink_command="(cd `pwd`; $relink_command)" + relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e "$sed_quote_subst" | $NL2SP` + fi + + # Quote $echo for shipping. + if test "X$echo" = "X$SHELL $progpath --fallback-echo"; then + case $progpath in + [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";; + *) qecho="$SHELL `pwd`/$progpath --fallback-echo";; + esac + qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"` + else + qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"` + fi + + # Only actually do things if our run command is non-null. + if test -z "$run"; then + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) output=`$echo $output|${SED} 's,.exe$,,'` ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) + exeext=.exe + outputname=`$echo $outputname|${SED} 's,.exe$,,'` ;; + *) exeext= ;; + esac + case $host in + *cygwin* | *mingw* ) + output_name=`basename $output` + output_path=`dirname $output` + 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 + + cat > $cwrappersource <> $cwrappersource<<"EOF" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(PATH_MAX) +# define LT_PATHMAX PATH_MAX +#elif defined(MAXPATHLEN) +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#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 +# 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 */ + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free ((void *) stale); stale = 0; } \ +} while (0) + +/* -DDEBUG is fairly common in CFLAGS. */ +#undef DEBUG +#if defined DEBUGWRAPPER +# define DEBUG(format, ...) fprintf(stderr, format, __VA_ARGS__) +#else +# define DEBUG(format, ...) +#endif + +const char *program_name = NULL; + +void * xmalloc (size_t num); +char * xstrdup (const char *string); +const char * base_name (const char *name); +char * find_executable(const char *wrapper); +int check_executable(const char *path); +char * strendzap(char *str, const char *pat); +void lt_fatal (const char *message, ...); + +int +main (int argc, char *argv[]) +{ + char **newargz; + int i; + + program_name = (char *) xstrdup (base_name (argv[0])); + DEBUG("(main) argv[0] : %s\n",argv[0]); + DEBUG("(main) program_name : %s\n",program_name); + newargz = XMALLOC(char *, argc+2); +EOF + + cat >> $cwrappersource <> $cwrappersource <<"EOF" + newargz[1] = find_executable(argv[0]); + if (newargz[1] == NULL) + lt_fatal("Couldn't find %s", argv[0]); + DEBUG("(main) found exe at : %s\n",newargz[1]); + /* we know the script has the same name, without the .exe */ + /* so make sure newargz[1] doesn't end in .exe */ + strendzap(newargz[1],".exe"); + for (i = 1; i < argc; i++) + newargz[i+1] = xstrdup(argv[i]); + newargz[argc+1] = NULL; + + for (i=0; i> $cwrappersource <> $cwrappersource <> $cwrappersource <<"EOF" + return 127; +} + +void * +xmalloc (size_t num) +{ + void * p = (void *) malloc (num); + if (!p) + lt_fatal ("Memory exhausted"); + + return p; +} + +char * +xstrdup (const char *string) +{ + return string ? strcpy ((char *) xmalloc (strlen (string) + 1), string) : NULL +; +} + +const char * +base_name (const char *name) +{ + const char *base; + +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + /* Skip over the disk name in MSDOS pathnames. */ + if (isalpha ((unsigned char)name[0]) && name[1] == ':') + name += 2; +#endif + + for (base = name; *name; name++) + if (IS_DIR_SEPARATOR (*name)) + base = name + 1; + return base; +} + +int +check_executable(const char * path) +{ + struct stat st; + + DEBUG("(check_executable) : %s\n", path ? (*path ? path : "EMPTY!") : "NULL!"); + if ((!path) || (!*path)) + return 0; + + if ((stat (path, &st) >= 0) && + ( + /* MinGW & native WIN32 do not support S_IXOTH or S_IXGRP */ +#if defined (S_IXOTH) + ((st.st_mode & S_IXOTH) == S_IXOTH) || +#endif +#if defined (S_IXGRP) + ((st.st_mode & S_IXGRP) == S_IXGRP) || +#endif + ((st.st_mode & S_IXUSR) == S_IXUSR)) + ) + return 1; + else + return 0; +} + +/* Searches for the full path of the wrapper. Returns + newly allocated full path name if found, NULL otherwise */ +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]; + int tmp_len; + char* concat_name; + + DEBUG("(find_executable) : %s\n", wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!"); + + 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 = 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 ("getcwd failed"); + 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 ("getcwd failed"); + 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 * +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 (strcmp(str, pat) == 0) + *str = '\0'; + } + return str; +} + +static void +lt_error_core (int exit_status, const char * mode, + const char * message, va_list ap) +{ + fprintf (stderr, "%s: %s: ", program_name, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, "FATAL", message, ap); + va_end (ap); +} +EOF + # we should really use a build-platform specific compiler + # here, but OTOH, the wrappers (shell script and this C one) + # are only useful if you want to execute the "real" binary. + # Since the "real" binary is built for $host, then this + # wrapper might as well be built for $host, too. + $run $LTCC $LTCFLAGS -s -o $cwrapper $cwrappersource + ;; + esac + $rm $output + trap "$rm $output; exit $EXIT_FAILURE" 1 2 15 + + $echo > $output "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP +# +# The $output program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='${SED} -e 1s/^X//' +sed_quote_subst='$sed_quote_subst' + +# Be Bourne compatible (taken from Autoconf:_AS_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 variable: + 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 + echo=\"$qecho\" + file=\"\$0\" + # Make sure echo works. + if test \"X\$1\" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift + elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then + # Yippee, \$echo works! + : + else + # Restart under the correct shell, and then maybe \$echo will work. + exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"} + fi + fi\ +" + $echo >> $output "\ + + # Find the directory that this script lives in. + thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\` + done + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test "$fast_install" = yes; then + $echo >> $output "\ + program=lt-'$outputname'$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 >> $output "\ + + # 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 $EXIT_FAILURE + fi + fi + + $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $rm \"\$progdir/\$program\"; + $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $rm \"\$progdir/\$file\" + fi" + else + $echo >> $output "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + $echo >> $output "\ + + if test -f \"\$progdir/\$program\"; then" + + # Export our shlibpath_var if we have one. + if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $echo >> $output "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` + + export $shlibpath_var +" + fi + + # fixup the dll searchpath if we need to. + if test -n "$dllsearchpath"; then + $echo >> $output "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + $echo >> $output "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2*) + $echo >> $output "\ + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $echo >> $output "\ + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $echo >> $output "\ + \$echo \"\$0: cannot exec \$program \$*\" + exit $EXIT_FAILURE + 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 $EXIT_FAILURE + fi +fi\ +" + chmod +x $output + fi + exit $EXIT_SUCCESS + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + if test "$build_libtool_libs" = convenience; then + oldobjs="$libobjs_save" + addlibs="$convenience" + build_libtool_libs=no + else + if test "$build_libtool_libs" = module; then + oldobjs="$libobjs_save" + build_libtool_libs=no + else + oldobjs="$old_deplibs $non_pic_objects" + fi + addlibs="$old_convenience" + fi + + if test -n "$addlibs"; then + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + func_extract_archives $gentop $addlibs + oldobjs="$oldobjs $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then + cmds=$old_archive_from_new_cmds + else + # 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 + $echo "X$obj" | $Xsed -e 's%^.*/%%' + done | sort | sort -uc >/dev/null 2>&1); then + : + else + $echo "copying selected object files to avoid basename conflicts..." + + if test -z "$gentop"; then + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + $show "${rm}r $gentop" + $run ${rm}r "$gentop" + $show "$mkdir $gentop" + $run $mkdir "$gentop" + exit_status=$? + if test "$exit_status" -ne 0 && test ! -d "$gentop"; then + exit $exit_status + fi + fi + + save_oldobjs=$oldobjs + oldobjs= + counter=1 + for obj in $save_oldobjs + do + objbase=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` + case " $oldobjs " in + " ") oldobjs=$obj ;; + *[\ /]"$objbase "*) + while :; do + # Make sure we don't pick an alternate name that also + # overlaps. + newobj=lt$counter-$objbase + counter=`expr $counter + 1` + case " $oldobjs " in + *[\ /]"$newobj "*) ;; + *) if test ! -f "$gentop/$newobj"; then break; fi ;; + esac + done + $show "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" + $run ln "$obj" "$gentop/$newobj" || + $run cp "$obj" "$gentop/$newobj" + oldobjs="$oldobjs $gentop/$newobj" + ;; + *) oldobjs="$oldobjs $obj" ;; + esac + done + fi + + eval cmds=\"$old_archive_cmds\" + + if len=`expr "X$cmds" : ".*"` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + $echo "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_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 + for obj in $save_oldobjs + do + oldobjs="$objlist $obj" + objlist="$objlist $obj" + eval test_cmds=\"$old_archive_cmds\" + if len=`expr "X$test_cmds" : ".*" 2>/dev/null` && + test "$len" -le "$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= + fi + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test "X$oldobjs" = "X" ; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" + fi + fi + fi + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + eval cmd=\"$cmd\" + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + done + + if test -n "$generated"; then + $show "${rm}r$generated" + $run ${rm}r$generated + fi + + # Now create the libtool archive. + case $output in + *.la) + old_library= + test "$build_old_libs" = yes && old_library="$libname.$libext" + $show "creating $output" + + # 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}\" || 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 + var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` + relink_command="$var=\"$var_value\"; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e "$sed_quote_subst" | $NL2SP` + if test "$hardcode_automatic" = yes ; then + relink_command= + fi + + + # Only create the output if not a dry run. + if test -z "$run"; then + for installed in no yes; do + if test "$installed" = yes; then + if test -z "$install_libdir"; then + break + fi + output="$output_objdir/$outputname"i + # Replace all uninstalled libtool libraries with the installed ones + newdependency_libs= + for deplib in $dependency_libs; do + case $deplib in + *.la) + name=`$echo "X$deplib" | $Xsed -e 's%^.*/%%'` + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + if test -z "$libdir"; then + $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + newdependency_libs="$newdependency_libs $libdir/$name" + ;; + *) newdependency_libs="$newdependency_libs $deplib" ;; + esac + done + dependency_libs="$newdependency_libs" + newdlfiles= + for lib in $dlfiles; do + name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + if test -z "$libdir"; then + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + newdlfiles="$newdlfiles $libdir/$name" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + if test -z "$libdir"; then + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + newdlprefiles="$newdlprefiles $libdir/$name" + done + dlprefiles="$newdlprefiles" + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + newdlfiles="$newdlfiles $abs" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + newdlprefiles="$newdlprefiles $abs" + done + dlprefiles="$newdlprefiles" + fi + $rm $output + # place dlname in correct position for cygwin + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; + esac + $echo > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='$tdlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# 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 "$installed" = no && test "$need_relink" = yes; then + $echo >> $output "\ +relink_command=\"$relink_command\"" + fi + done + fi + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" + $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $? + ;; + esac + exit $EXIT_SUCCESS + ;; + + # libtool install mode + install) + modename="$modename: install" + + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || + # Allow the use of GNU shtool's install command. + $echo "X$nonopt" | grep shtool > /dev/null; then + # Aesthetically quote it. + arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + install_prog="$arg " + arg="$1" + shift + else + install_prog= + arg=$nonopt + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + install_prog="$install_prog$arg" + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=no + stripme= + for arg + do + if test -n "$dest"; then + files="$files $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=yes ;; + -f) + case " $install_prog " in + *[\\\ /]cp\ *) ;; + *) prev=$arg ;; + esac + ;; + -g | -m | -o) prev=$arg ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + install_prog="$install_prog $arg" + done + + if test -z "$install_prog"; then + $echo "$modename: you must specify an install program" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + if test -n "$prev"; then + $echo "$modename: the \`$prev' option requires an argument" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + if test -z "$files"; then + if test -z "$dest"; then + $echo "$modename: no file or destination specified" 1>&2 + else + $echo "$modename: you must specify a destination" 1>&2 + fi + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Strip any trailing slash from the destination. + dest=`$echo "X$dest" | $Xsed -e 's%/$%%'` + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=yes + if test "$isdir" = yes; then + destdir="$dest" + destname= + else + destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'` + test "X$destdir" = "X$dest" && destdir=. + destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'` + + # Not a directory, so check to see that there is only one file specified. + set dummy $files + if test "$#" -gt 2; then + $echo "$modename: \`$dest' is not a directory" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + 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. + staticlibs="$staticlibs $file" + ;; + + *.la) + # Check to see that this really is a libtool archive. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$file' is not a valid libtool archive" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + library_names= + old_library= + relink_command= + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) current_libdirs="$current_libdirs $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) future_libdirs="$future_libdirs $libdir" ;; + esac + fi + + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/ + test "X$dir" = "X$file/" && dir= + dir="$dir$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$echo "$destdir" | $SED "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. + if test "$inst_prefix_dir" = "$destdir"; then + $echo "$modename: error: cannot install \`$file' to a directory not ending in $libdir" 1>&2 + exit $EXIT_FAILURE + fi + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$echo "$relink_command" | $SP2NL | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%" | $NL2SP` + else + relink_command=`$echo "$relink_command" | $SP2NL | $SED "s%@inst_prefix_dir@%%" | $NL2SP` + fi + + $echo "$modename: warning: relinking \`$file'" 1>&2 + $show "$relink_command" + if $run eval "$relink_command"; then : + else + $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 + exit $EXIT_FAILURE + fi + fi + + # See the names of the shared library. + set dummy $library_names + if test -n "$2"; then + realname="$2" + shift + shift + + srcname="$realname" + test -n "$relink_command" && srcname="$realname"T + + # Install the shared library and build the symlinks. + $show "$install_prog $dir/$srcname $destdir/$realname" + $run eval "$install_prog $dir/$srcname $destdir/$realname" || exit $? + if test -n "$stripme" && test -n "$striplib"; then + $show "$striplib $destdir/$realname" + $run 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 + if test "$linkname" != "$realname"; then + $show "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })" + $run eval "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })" + fi + done + fi + + # Do each command in the postinstall commands. + lib="$destdir/$realname" + cmds=$postinstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$mode" = relink; then + $run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)' + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + fi + + # Install the pseudo-library for information purposes. + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + instname="$dir/$name"i + $show "$install_prog $instname $destdir/$name" + $run eval "$install_prog $instname $destdir/$name" || exit $? + + # Maybe install the static library, too. + test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + destfile="$destdir/$destfile" + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"` + ;; + *.$objext) + staticdest="$destfile" + destfile= + ;; + *) + $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + # Install the libtool object if requested. + if test -n "$destfile"; then + $show "$install_prog $file $destfile" + $run eval "$install_prog $file $destfile" || exit $? + fi + + # Install the old object if enabled. + if test "$build_old_libs" = yes; then + # Deduce the name of the old-style object file. + staticobj=`$echo "X$file" | $Xsed -e "$lo2o"` + + $show "$install_prog $staticobj $staticdest" + $run eval "$install_prog \$staticobj \$staticdest" || exit $? + fi + exit $EXIT_SUCCESS + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + destfile="$destdir/$destfile" + fi + + # 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 + file=`$echo $file|${SED} 's,.exe$,,'` + stripped_ext=".exe" + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin*|*mingw*) + wrapper=`$echo $file | ${SED} -e 's,.exe$,,'` + ;; + *) + wrapper=$file + ;; + esac + if (${SED} -e '4q' $wrapper | grep "^# Generated by .*$PACKAGE")>/dev/null 2>&1; then + notinst_deplibs= + relink_command= + + # Note that it is not necessary on cygwin/mingw to append a dot to + # foo even if both foo 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. + # + # If there is no directory component, then add one. + case $wrapper in + */* | *\\*) . ${wrapper} ;; + *) . ./${wrapper} ;; + esac + + # Check the variables that should have been set. + if test -z "$notinst_deplibs"; then + $echo "$modename: invalid libtool wrapper script \`$wrapper'" 1>&2 + exit $EXIT_FAILURE + fi + + finalize=yes + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + # If there is no directory component, then add one. + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + fi + libfile="$libdir/"`$echo "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test + if test -n "$libdir" && test ! -f "$libfile"; then + $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2 + finalize=no + fi + done + + relink_command= + # Note that it is not necessary on cygwin/mingw to append a dot to + # foo even if both foo 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. + # + # If there is no directory component, then add one. + case $wrapper in + */* | *\\*) . ${wrapper} ;; + *) . ./${wrapper} ;; + esac + + outputname= + if test "$fast_install" = no && test -n "$relink_command"; then + if test "$finalize" = yes && test -z "$run"; then + tmpdir=`func_mktempdir` + file=`$echo "X$file$stripped_ext" | $Xsed -e 's%^.*/%%'` + outputname="$tmpdir/$file" + # Replace the output file specification. + relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g' | $NL2SP` + + $show "$relink_command" + if $run eval "$relink_command"; then : + else + $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 + ${rm}r "$tmpdir" + continue + fi + file="$outputname" + else + $echo "$modename: warning: cannot relink \`$file'" 1>&2 + fi + else + # Install the binary that we compiled earlier. + file=`$echo "X$file$stripped_ext" | $Xsed -e "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) + destfile=`$echo $destfile | ${SED} -e 's,.exe$,,'` + ;; + esac + ;; + esac + $show "$install_prog$stripme $file $destfile" + $run eval "$install_prog\$stripme \$file \$destfile" || exit $? + test -n "$outputname" && ${rm}r "$tmpdir" + ;; + esac + done + + for file in $staticlibs; do + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + + # Set up the ranlib parameters. + oldlib="$destdir/$name" + + $show "$install_prog $file $oldlib" + $run eval "$install_prog \$file \$oldlib" || exit $? + + if test -n "$stripme" && test -n "$old_striplib"; then + $show "$old_striplib $oldlib" + $run eval "$old_striplib $oldlib" || exit $? + fi + + # Do each command in the postinstall commands. + cmds=$old_postinstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + done + + if test -n "$future_libdirs"; then + $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2 + fi + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + test -n "$run" && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi + ;; + + # libtool finish mode + finish) + modename="$modename: finish" + libdirs="$nonopt" + admincmds= + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for dir + do + libdirs="$libdirs $dir" + done + + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + cmds=$finish_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || admincmds="$admincmds + $cmd" + done + IFS="$save_ifs" + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $run eval "$cmds" || admincmds="$admincmds + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + test "$show" = : && exit $EXIT_SUCCESS + + $echo "X----------------------------------------------------------------------" | $Xsed + $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" + $echo "more information, such as the ld(1) and ld.so(8) manual pages." + $echo "X----------------------------------------------------------------------" | $Xsed + exit $EXIT_SUCCESS + ;; + + # libtool execute mode + execute) + modename="$modename: execute" + + # The first argument is the command name. + cmd="$nonopt" + if test -z "$cmd"; then + $echo "$modename: you must specify a COMMAND" 1>&2 + $echo "$help" + exit $EXIT_FAILURE + fi + + # Handle -dlopen flags immediately. + for file in $execute_dlfiles; do + if test ! -f "$file"; then + $echo "$modename: \`$file' is not a file" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + dir= + case $file in + *.la) + # Check to see that this really is a libtool archive. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Read the libtool library. + dlname= + library_names= + + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'" + continue + fi + + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$file" && dir=. + + if test -f "$dir/$objdir/$dlname"; then + dir="$dir/$objdir" + else + if test ! -f "$dir/$dlname"; then + $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2 + exit $EXIT_FAILURE + fi + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$file" && dir=. + ;; + + *) + $echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2 + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir="$absdir" + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic="$magic" + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case $file in + -*) ;; + *) + # Do a test to see if this is really a libtool program. + if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Transform arg to wrapped name. + file="$progdir/$program" + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"` + args="$args \"$file\"" + done + + if test -z "$run"; then + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved 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 + fi" + done + + # Now prepare to actually exec the command. + exec_cmd="\$cmd$args" + else + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\"" + $echo "export $shlibpath_var" + fi + $echo "$cmd$args" + exit $EXIT_SUCCESS + fi + ;; + + # libtool clean and uninstall mode + clean | uninstall) + modename="$modename: $mode" + rm="$nonopt" + files= + rmforce= + 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) rm="$rm $arg"; rmforce=yes ;; + -*) rm="$rm $arg" ;; + *) files="$files $arg" ;; + esac + done + + if test -z "$rm"; then + $echo "$modename: you must specify an RM program" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + rmdirs= + + origobjdir="$objdir" + for file in $files; do + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + if test "X$dir" = "X$file"; then + dir=. + objdir="$origobjdir" + else + objdir="$dir/$origobjdir" + fi + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + test "$mode" = uninstall && objdir="$dir" + + # Remember objdir for removal later, being careful to avoid duplicates + if test "$mode" = clean; then + case " $rmdirs " in + *" $objdir "*) ;; + *) rmdirs="$rmdirs $objdir" ;; + 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 test "$rmforce" = yes; then + continue + fi + + rmfiles="$file" + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + . $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + rmfiles="$rmfiles $objdir/$n" + done + test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library" + + case "$mode" in + clean) + case " $library_names " in + # " " in the beginning catches empty $dlname + *" $dlname "*) ;; + *) rmfiles="$rmfiles $objdir/$dlname" ;; + esac + test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" + ;; + uninstall) + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + cmds=$postuninstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" + if test "$?" -ne 0 && test "$rmforce" != yes; then + exit_status=1 + fi + done + IFS="$save_ifs" + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + cmds=$old_postuninstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" + if test "$?" -ne 0 && test "$rmforce" != yes; then + exit_status=1 + fi + done + IFS="$save_ifs" + fi + # FIXME: should reinstall the best remaining shared library. + ;; + esac + fi + ;; + + *.lo) + # Possibly a libtool object, so verify it. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + + # Read the .lo file + . $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" \ + && test "$pic_object" != none; then + rmfiles="$rmfiles $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" \ + && test "$non_pic_object" != none; then + rmfiles="$rmfiles $dir/$non_pic_object" + fi + fi + ;; + + *) + if test "$mode" = clean ; then + noexename=$name + case $file in + *.exe) + file=`$echo $file|${SED} 's,.exe$,,'` + noexename=`$echo $name|${SED} 's,.exe$,,'` + # $file with .exe has already been added to rmfiles, + # add $file without .exe + rmfiles="$rmfiles $file" + ;; + esac + # Do a test to see if this is a libtool program. + if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + relink_command= + . $dir/$noexename + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" + if test "$fast_install" = yes && test -n "$relink_command"; then + rmfiles="$rmfiles $objdir/lt-$name" + fi + if test "X$noexename" != "X$name" ; then + rmfiles="$rmfiles $objdir/lt-${noexename}.c" + fi + fi + fi + ;; + esac + $show "$rm $rmfiles" + $run $rm $rmfiles || exit_status=1 + done + objdir="$origobjdir" + + # Try to remove the ${objdir}s in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + $show "rmdir $dir" + $run rmdir $dir >/dev/null 2>&1 + fi + done + + exit $exit_status + ;; + + "") + $echo "$modename: you must specify a MODE" 1>&2 + $echo "$generic_help" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + if test -z "$exec_cmd"; then + $echo "$modename: invalid operation mode \`$mode'" 1>&2 + $echo "$generic_help" 1>&2 + exit $EXIT_FAILURE + fi +fi # test -z "$show_help" + +if test -n "$exec_cmd"; then + eval exec $exec_cmd + exit $EXIT_FAILURE +fi + +# We need to display help for each of the modes. +case $mode in +"") $echo \ +"Usage: $modename [OPTION]... [MODE-ARG]... + +Provide generalized library-building support services. + + --config show all configuration variables + --debug enable verbose shell tracing +-n, --dry-run display commands without modifying any files + --features display basic configuration information and exit + --finish same as \`--mode=finish' + --help display this help message and exit + --mode=MODE use operation mode MODE [default=inferred from MODE-ARGS] + --quiet same as \`--silent' + --silent don't print informational messages + --tag=TAG use configuration variables from tag TAG + --version print version information + +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. Try \`$modename --help --mode=MODE' for +a more detailed description of MODE. + +Report bugs to ." + exit $EXIT_SUCCESS + ;; + +clean) + $echo \ +"Usage: $modename [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: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -prefer-pic try to building PIC objects only + -prefer-non-pic try to building non-PIC objects only + -static always build a \`.o' file suitable for static linking + +COMPILE-COMMAND is a command to be used in creating a \`standard' object file +from the given SOURCEFILE. + +The output file name is determined by removing the directory component from +SOURCEFILE, then substituting the C source code suffix \`.c' with the +library object suffix, \`.lo'." + ;; + +execute) + $echo \ +"Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]... + +Automatically set library path, then run a program. + +This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + +This mode sets the library path environment variable according to \`-dlopen' +flags. + +If any of the ARGS are libtool executable wrappers, then they are translated +into their corresponding uninstalled binary, and any of their required library +directories are added to the library path. + +Then, COMMAND is executed, with ARGS as arguments." + ;; + +finish) + $echo \ +"Usage: $modename [OPTION]... --mode=finish [LIBDIR]... + +Complete the installation of libtool libraries. + +Each LIBDIR is a directory that contains libtool libraries. + +The commands that this mode executes may require superuser privileges. Use +the \`--dry-run' option if you just want to see what would be executed." + ;; + +install) + $echo \ +"Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND... + +Install executables or libraries. + +INSTALL-COMMAND is the installation command. The first component should be +either the \`install' or \`cp' program. + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + +link) + $echo \ +"Usage: $modename [OPTION]... --mode=link LINK-COMMAND... + +Link object files or libraries together to form another library, or to +create an executable program. + +LINK-COMMAND is a command using the C compiler that you would use to create +a program from several object files. + +The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-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 + -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 + -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] + +All other options (arguments beginning with \`-') are ignored. + +Every other argument is treated as a filename. Files ending in \`.la' are +treated as uninstalled libtool libraries, other files are standard or library +object files. + +If the OUTPUT-FILE ends in \`.la', then a libtool library is created, +only library objects (\`.lo' files) may be specified, and \`-rpath' is +required, except when creating a convenience library. + +If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created +using \`ar' and \`ranlib', or on Windows using \`lib'. + +If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file +is created, otherwise an executable program is created." + ;; + +uninstall) + $echo \ +"Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + +Remove libraries from an installation directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, all the files associated with it are deleted. +Otherwise, only FILE itself is deleted using RM." + ;; + +*) + $echo "$modename: invalid operation mode \`$mode'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; +esac + +$echo +$echo "Try \`$modename --help' for more information about other modes." + +exit $? + +# The TAGs below are defined such that we never get into a situation +# in which 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 +disable_libs=shared +# ### END LIBTOOL TAG CONFIG: disable-shared + +# ### BEGIN LIBTOOL TAG CONFIG: disable-static +disable_libs=static +# ### END LIBTOOL TAG CONFIG: disable-static + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: diff --git a/rubbos/app/httpd-2.0.64/build/make_exports.awk b/rubbos/app/httpd-2.0.64/build/make_exports.awk new file mode 100644 index 00000000..c5990581 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/build/make_exports.awk @@ -0,0 +1,164 @@ +# 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") + printf("#define CORE_PRIVATE\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/rubbos/app/httpd-2.0.64/build/make_nw_export.awk b/rubbos/app/httpd-2.0.64/build/make_nw_export.awk new file mode 100644 index 00000000..b958903c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/build/make_nw_export.awk @@ -0,0 +1,91 @@ +# 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 { + printf(" (APACHE2)\n") +} + +# List of functions that we don't support, yet?? +#/ap_some_name/{next} + +function add_symbol (sym_name) { + if (count) { + found++ + } + gsub (/ /, "", sym_name) + line = line sym_name ",\n" + + if (count == 0) { + printf(" %s", line) + line = "" + } +} + +/^[ \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]*(extern[ \t]+)?AP[RU]?_DECLARE_DATA .*;$/ { + varname = $NF; + gsub( /[*;]/, "", varname); + gsub( /\[.*\]/, "", varname); + add_symbol(varname); +} + +#END { +# printf(" %s", line) +#} diff --git a/rubbos/app/httpd-2.0.64/build/make_var_export.awk b/rubbos/app/httpd-2.0.64/build/make_var_export.awk new file mode 100644 index 00000000..b28e20ea --- /dev/null +++ b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/build/mkconfNW.awk b/rubbos/app/httpd-2.0.64/build/mkconfNW.awk new file mode 100644 index 00000000..dcfd93d6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/build/mkconfNW.awk @@ -0,0 +1,105 @@ +# 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"] = "SYS:/APACHE2" + A["Port"] = "80" + 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["listen_stmt_1"] = "Listen "A["Port"] + B["listen_stmt_2"] = "" +} + +/@@LoadModule@@/ { + print "#LoadModule auth_anon_module modules/authanon.nlm" + print "#LoadModule auth_dbm_module modules/authdbm.nlm" + print "#LoadModule auth_digest_module modules/digest.nlm" + print "#LoadModule cern_meta_module modules/cernmeta.nlm" + print "#LoadModule dav_module modules/mod_dav.nlm" + print "#LoadModule dav_fs_module modules/moddavfs.nlm" + print "#LoadModule expires_module modules/expires.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 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 vhost_alias_module modules/vhost.nlm" + print "" + next +} + +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) +} + +{ + print +} + + +END { + print + print "#" + print "# SecureListen: Allows you to securely bind Apache to specific IP addresses " + print "# and/or ports." + 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 443 \"SSL CertificateDNS\"" +} diff --git a/rubbos/app/httpd-2.0.64/build/mkdep.perl b/rubbos/app/httpd-2.0.64/build/mkdep.perl new file mode 100644 index 00000000..5130e10a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/build/mkdep.perl @@ -0,0 +1,92 @@ +#!/usr/bin/perl +# +# $Id: mkdep.perl 106510 2004-11-25 00:08:45Z nd $ +# +# 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/rubbos/app/httpd-2.0.64/build/mkdir.sh b/rubbos/app/httpd-2.0.64/build/mkdir.sh new file mode 100755 index 00000000..e2d5bb63 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/build/nw_export.inc b/rubbos/app/httpd-2.0.64/build/nw_export.inc new file mode 100644 index 00000000..7d2bce64 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/build/nw_export.inc @@ -0,0 +1,49 @@ +/* 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. */ +#define AP_DECLARE AP_DECLARE +#define AP_CORE_DECLARE AP_CORE_DECLARE +#define AP_DECLARE_NONSTD AP_DECLARE_NONSTD +#define AP_CORE_DECLARE_NONSTD AP_CORE_DECLARE_NONSTD +#define AP_DECLARE_HOOK AP_DECLARE_HOOK +#define AP_DECLARE_DATA AP_DECLARE_DATA +#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 "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_vhost.h" +#include "mpm_common.h" +#include "pcreposix.h" +#include "rfc1413.h" +#include "scoreboard.h" +#include "util_cfgtree.h" +#include "util_charset.h" +#include "util_ebcdic.h" +#include "util_filter.h" +/*#include "util_ldap.h"*/ +#include "util_md5.h" +#include "util_script.h" +#include "util_time.h" +#include "util_xml.h" + +#include "mod_core.h" diff --git a/rubbos/app/httpd-2.0.64/build/nw_ver.awk b/rubbos/app/httpd-2.0.64/build/nw_ver.awk new file mode 100644 index 00000000..f908fe34 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/build/nw_ver.awk @@ -0,0 +1,40 @@ +# 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 writes them to STDOUT + + while ((getline < ARGV[1]) > 0) { + 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_ADD_STRING /)) { + ver_str_release = substr($3, 2, length($3) - 2); + } + } + ver = ver_major "," ver_minor "," ver_patch; + ver_str = ver_major "." ver_minor "." ver_patch ver_str_release; + + print "VERSION = " ver ""; + print "VERSION_STR = " ver_str ""; + +} diff --git a/rubbos/app/httpd-2.0.64/build/pkg/README b/rubbos/app/httpd-2.0.64/build/pkg/README new file mode 100644 index 00000000..147c1f1e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/build/pkg/buildpkg.sh b/rubbos/app/httpd-2.0.64/build/pkg/buildpkg.sh new file mode 100755 index 00000000..99ba3ee6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/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-config` +apu_config=`which apu-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/rubbos/app/httpd-2.0.64/build/pkg/pkginfo b/rubbos/app/httpd-2.0.64/build/pkg/pkginfo new file mode 100644 index 00000000..3465e154 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/build/pkg/pkginfo @@ -0,0 +1,11 @@ +PKG="ASFhttpd" +NAME="httpd" +ARCH="x86_64" +VERSION="2.0.64" +CATEGORY="application" +VENDOR="Apache Software Foundation" +EMAIL="dev@httpd.apache.org" +PSTAMP="dev@httpd.apache.org" +BASEDIR="/bottlenecks/rubbos/app/apache2" +CLASSES="none" + diff --git a/rubbos/app/httpd-2.0.64/build/pkg/pkginfo.in b/rubbos/app/httpd-2.0.64/build/pkg/pkginfo.in new file mode 100644 index 00000000..928dad46 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/build/prebuildNW.bat b/rubbos/app/httpd-2.0.64/build/prebuildNW.bat new file mode 100755 index 00000000..0ce59f1e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/build/prebuildNW.bat @@ -0,0 +1,47 @@ +@echo off + +if not "%NovellLibC%" == "" goto CheckNDK +set NovellLibC=\novell\ndk\libc +@echo Could not find the NovellLibC environment variable +@echo Setting NovellLibC = %NovellLibC% +@echo --------------------- + +:CheckNDK +if exist %NovellLibC%\include\netware.h goto NDKOK +@echo The path to the NDK "%NovellLibC%" is invalid. +@echo Please set then NovellLibC environment variable to the location of the NDK +@echo --------------------- +goto Done + +:NDKOK +@echo # As part of the pre-build process, the utilities GenChars.NLM +@echo # (Gen Test Chars) and DFTables.NLM (dftables) must be built, +@echo # copied to a NetWare server and run using the following commands: +@echo # +@echo # "sys:\genchars >sys:\test_char.h" +@echo # "sys:\dftables >sys:\chartables.c" +@echo # +@echo # The files "sys:\test_chars.h" and "sys:\chartables.c" must be +@echo # copied to "httpd\os\netware" on the build machine. + +@echo Fixing up the APR headers +copy ..\srclib\apr\include\apr.hnw ..\srclib\apr\include\apr.h + +@echo Fixing up the APR-Util headers +copy ..\srclib\apr-util\include\apu.hnw ..\srclib\apr-util\include\apu.h +copy ..\srclib\apr-util\include\apr_ldap.hnw ..\srclib\apr-util\include\apr_ldap.h + +@echo Fixing up the pcre headers +copy ..\srclib\pcre\config.hw ..\srclib\pcre\config.h +copy ..\srclib\pcre\pcre.hw ..\srclib\pcre\pcre.h + +@echo Generating the import lists... +set MWCIncludes=..\include;..\modules\http;..\modules\aaa;..\os\netware;..\server\mpm\netware;..\srclib\apr\include;..\srclib\apr-util\include;+%NovellLibC% +mwccnlm -P nw_export.inc -d NETWARE -d CORE_PRIVATE -EP +awk -f make_nw_export.awk nw_export.i |sort >..\os\netware\httpd.imp + +rem cd ..\srclib\apr\build +rem call prebuildnw.bat + +:Done +pause diff --git a/rubbos/app/httpd-2.0.64/build/program.mk b/rubbos/app/httpd-2.0.64/build/program.mk new file mode 100644 index 00000000..bdba429d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/build/program.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. + +PROGRAM_OBJECTS = $(PROGRAM_SOURCES:.c=.lo) + +$(PROGRAM_NAME): $(PROGRAM_DEPENDENCIES) $(PROGRAM_OBJECTS) + $(LINK) $(PROGRAM_LDFLAGS) $(PROGRAM_OBJECTS) $(PROGRAM_LDADD) diff --git a/rubbos/app/httpd-2.0.64/build/rpm/httpd.init b/rubbos/app/httpd-2.0.64/build/rpm/httpd.init new file mode 100755 index 00000000..be9c2e16 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/build/rpm/httpd.init @@ -0,0 +1,127 @@ +#!/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. +# +# +# Startup script for the Apache Web Server +# +# chkconfig: - 85 15 +# description: Apache is a World Wide Web server. It is used to serve \ +# HTML files and CGI. +# processname: httpd +# pidfile: /var/run/httpd.pid +# config: /etc/httpd/conf/httpd.conf + +# Source function library. +. /etc/rc.d/init.d/functions + +if [ -f /etc/sysconfig/httpd ]; then + . /etc/sysconfig/httpd +fi + +# 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. + +# Path to the apachectl script, server binary, and short-form for messages. +apachectl=/usr/sbin/apachectl +httpd=${HTTPD-/usr/sbin/httpd} +prog=httpd +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 + daemon $httpd $OPTIONS + RETVAL=$? + echo + [ $RETVAL = 0 ] && touch /var/lock/subsys/httpd + return $RETVAL +} +stop() { + echo -n $"Stopping $prog: " + killproc $httpd + RETVAL=$? + echo + [ $RETVAL = 0 ] && rm -f /var/lock/subsys/httpd /var/run/httpd.pid +} +reload() { + echo -n $"Reloading $prog: " + check13 || exit 1 + killproc $httpd -HUP + RETVAL=$? + echo +} + +# See how we were called. +case "$1" in + start) + start + ;; + stop) + stop + ;; + status) + status $httpd + RETVAL=$? + ;; + restart) + stop + start + ;; + condrestart) + if [ -f /var/run/httpd.pid ] ; then + stop + start + fi + ;; + reload) + reload + ;; + graceful|help|configtest|fullstatus) + $apachectl $@ + RETVAL=$? + ;; + *) + echo $"Usage: $prog {start|stop|restart|condrestart|reload|status|fullstatus|graceful|help|configtest}" + exit 1 +esac + +exit $RETVAL diff --git a/rubbos/app/httpd-2.0.64/build/rpm/httpd.logrotate b/rubbos/app/httpd-2.0.64/build/rpm/httpd.logrotate new file mode 100644 index 00000000..dd0ce1b9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/build/rpm/httpd.logrotate @@ -0,0 +1,8 @@ +/var/log/httpd/*log { + missingok + notifempty + sharedscripts + postrotate + /bin/kill -HUP `cat /var/run/httpd.pid 2>/dev/null` 2> /dev/null || true + endscript +} diff --git a/rubbos/app/httpd-2.0.64/build/rpm/httpd.spec.in b/rubbos/app/httpd-2.0.64/build/rpm/httpd.spec.in new file mode 100644 index 00000000..0aea4053 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/build/rpm/httpd.spec.in @@ -0,0 +1,514 @@ +%define contentdir /var/www +%define suexec_caller apache +%define mmn APACHE_MMN + +%ifarch ia64 +# disable debuginfo on IA64 +%define debug_package %{nil} +%endif + +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.gz +License: Apache License, Version 2.0 +Group: System Environment/Daemons +BuildRoot: %{_tmppath}/%{name}-root +BuildPrereq: apr-devel, apr-util-devel, openldap-devel, db4-devel, expat-devel, findutils, perl, pkgconfig +BuildPrereq: /usr/bin/apr-config, /usr/bin/apu-config +Requires: apr >= 0.9.7, apr-util >= 0.9.7, gawk, /usr/share/magic.mime, /usr/bin/find, openldap +Prereq: /sbin/chkconfig, /bin/mktemp, /bin/rm, /bin/mv +Prereq: sh-utils, textutils, /usr/sbin/useradd +Provides: webserver +Provides: httpd-mmn = %{mmn} +Conflicts: thttpd +Obsoletes: apache, secureweb, mod_dav + +%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: libtool, httpd = %{version} +Requires: apr-devel >= 0.9.7, apr-util-devel >= 0.9.7 + +%description devel +The httpd-devel package contains the APXS binary and other files +that you need to build Dynamic Shared Objects (DSOs) for Apache. + +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. +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 -n mod_ssl +Group: System Environment/Daemons +Summary: SSL/TLS module for the Apache HTTP server +Serial: 1 +BuildPrereq: openssl-devel +Prereq: openssl, dev, /bin/cat +Requires: httpd, make, 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 \`pwd\`/include/ap_mmn.h | grep -e '^[0-9]'` +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 + +# regenerate configure scripts +./buildconf + +# Before configure; fix location of build dir in generated apxs +%{__perl} -pi -e "s:\@exp_installbuilddir\@:%{_libdir}/httpd/build:g" \ + support/apxs.in + +%build + +if pkg-config openssl ; then + # configure -C barfs with trailing spaces in CFLAGS + CFLAGS="$RPM_OPT_FLAGS `pkg-config --cflags openssl | sed 's/ *$//'`" + AP_LIBS="$AP_LIBS `pkg-config --libs openssl`" +else + CFLAGS="$RPM_OPT_FLAGS" + AP_LIBS="-lssl -lcrypto" +fi +export CFLAGS +export AP_LIBS + +function mpmbuild() +{ +mpm=$1; shift +mkdir $mpm; pushd $mpm +cat > config.cache < prefork.mods +./worker/httpd -l | grep -v worker > worker.mods +if ! diff -u prefork.mods worker.mods; then + : Different modules built into httpd binaries, will not proceed + exit 1 +fi + +%install +rm -rf $RPM_BUILD_ROOT + +pushd prefork +make DESTDIR=$RPM_BUILD_ROOT install +popd +# install worker binary +install -m 755 worker/httpd $RPM_BUILD_ROOT%{_sbindir}/httpd.worker + +# mod_ssl bits +for suffix in crl crt csr key prm; do + mkdir $RPM_BUILD_ROOT%{_sysconfdir}/httpd/conf/ssl.${suffix} +done + +# Makefiles for certificate management +#for ext in crt crl; do +# install -m 644 ./build/rpm/mod_ssl-Makefile.${ext} \ +# $RPM_BUILD_ROOT%{_sysconfdir}/httpd/conf/ssl.${ext}/Makefile.${ext} +#done +#ln -s ../../../usr/share/ssl/certs/Makefile $RPM_BUILD_ROOT/etc/httpd/conf + +# 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} + +# move the build directory to within the library directory +mv $RPM_BUILD_ROOT%{contentdir}/build $RPM_BUILD_ROOT%{_libdir}/httpd/build + +# fix up config_vars file: relocate the build directory into libdir; +# reference correct libtool from apr; remove references to RPM build root. +sed -e "s|%{contentdir}/build|%{_libdir}/httpd/build|g" \ + -e "/AP_LIBS/d" -e "/abs_srcdir/d" \ + -e "/^LIBTOOL/s|/[^ ]*/libtool|`apr-config --apr-libtool`|" \ + -e "/^EXTRA_INCLUDES/s|-I$RPM_BUILD_DIR[^ ]* ||g" \ + < prefork/build/config_vars.mk \ + > $RPM_BUILD_ROOT%{_libdir}/httpd/build/config_vars.mk + +# Make the MMN accessible to module packages +echo %{mmn} > $RPM_BUILD_ROOT%{_includedir}/httpd/.mmn + +# docroot +mkdir $RPM_BUILD_ROOT%{contentdir}/html +rm -r $RPM_BUILD_ROOT%{contentdir}/manual/style + +# logs +rmdir $RPM_BUILD_ROOT%{_sysconfdir}/httpd/logs +mkdir -p $RPM_BUILD_ROOT%{_localstatedir}/log/httpd + +# 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 +ln -s ../..%{_libdir}/httpd/build $RPM_BUILD_ROOT/etc/httpd/build + +# 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 +%{__perl} -pi -e "s:\@docdir\@:%{_docdir}/%{name}-%{version}:g" \ + $RPM_BUILD_ROOT/etc/rc.d/init.d/httpd + +# 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}/htdocs/* \ + $RPM_BUILD_ROOT%{contentdir}/cgi-bin/* + +%pre +# Add the "apache" user +/usr/sbin/useradd -c "Apache" -u 48 \ + -s /sbin/nologin -r -d %{contentdir} apache 2> /dev/null || : + +%triggerpostun -- apache < 2.0 +/sbin/chkconfig --add httpd + +%post +# Register the httpd service +/sbin/chkconfig --add httpd + +%preun +if [ $1 = 0 ]; then + /sbin/service httpd stop > /dev/null 2>&1 + /sbin/chkconfig --del httpd +fi + +%post -n mod_ssl +/sbin/ldconfig ### is this needed? +umask 077 + +if [ ! -f %{_sysconfdir}/httpd/conf/ssl.key/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/ssl.key/server.key 2> /dev/null +fi + +FQDN=`hostname` +if [ "x${FQDN}" = "x" ]; then + FQDN=localhost.localdomain +fi + +if [ ! -f %{_sysconfdir}/httpd/conf/ssl.crt/server.crt ] ; then +cat << EOF | %{_bindir}/openssl req -new -key %{_sysconfdir}/httpd/conf/ssl.key/server.key -x509 -days 365 -out %{_sysconfdir}/httpd/conf/ssl.crt/server.crt 2>/dev/null +-- +SomeState +SomeCity +SomeOrganization +SomeOrganizationalUnit +${FQDN} +root@${FQDN} +EOF +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 +%config(noreplace) %{_sysconfdir}/httpd/conf/*.conf +%config(noreplace) %{_sysconfdir}/httpd/conf/magic +%config(noreplace) %{_sysconfdir}/httpd/conf/mime.types + +%config %{_sysconfdir}/logrotate.d/httpd +%config %{_sysconfdir}/rc.d/init.d/httpd + +#%dir %{_sysconfdir}/httpd/conf + +%{_sbindir}/ab +%{_sbindir}/htdbm +%{_sbindir}/htdigest +%{_sbindir}/htpasswd +%{_sbindir}/httxt2dbm +%{_sbindir}/logresolve +%{_sbindir}/httpd +%{_sbindir}/httpd.worker +%{_sbindir}/apachectl +%{_sbindir}/rotatelogs +%attr(4510,root,%{suexec_caller}) %{_sbindir}/suexec + +%dir %{_libdir}/httpd +%dir %{_libdir}/httpd/modules +# everything but mod_ssl.so: +%{_libdir}/httpd/modules/mod_[a-r]*.so +%{_libdir}/httpd/modules/mod_s[petu]*.so +%{_libdir}/httpd/modules/mod_[t-z]*.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 +%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 + +%{_mandir}/man1/* +%{_mandir}/man8/ab* +%{_mandir}/man8/apachectl* +%{_mandir}/man8/httpd* +%{_mandir}/man8/logresolve* +%{_mandir}/man8/rotatelogs* +%{_mandir}/man8/suexec* + +%files manual +%defattr(-,root,root) +%{contentdir}/manual + +%files -n mod_ssl +%defattr(-,root,root) +%{_libdir}/httpd/modules/mod_ssl.so +%config(noreplace) %{_sysconfdir}/httpd/conf/ssl.conf +%attr(0700,root,root) %dir %{_sysconfdir}/httpd/conf/ssl.* +#%config %{_sysconfdir}/httpd/conf/Makefile +#%dir %{_sysconfdir}/httpd/conf/ssl.* +%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 +%{_sysconfdir}/httpd/build +%{_sbindir}/apxs +%{_sbindir}/checkgid +%{_sbindir}/dbmmanage +%{_sbindir}/envvars* +%{_mandir}/man8/apxs.8* +%dir %{_libdir}/httpd/build +%{_libdir}/httpd/build/*.mk +%{_libdir}/httpd/build/config.nice +%{_libdir}/httpd/build/instdso.sh + +%changelog +* Mon Mar 27 2006 Graham Leggett 2.0.56-dev +- Add the missing file-cache module to the cache family of modules in + the RPM. + +* Tue Oct 11 2005 Graham Leggett 2.0.56-dev +- Updated the apr and apr-util dependencies to require at least v0.9.7 +- Stop trying to remove *.xml doc files, the httpd build does that already. + +* Thu Dec 16 2004 Graham Leggett 2.0.53-dev +- Changed build to use external apr and apr-util + +* Sat Apr 5 2003 Graham Leggett 2.0.46-dev +- Moved mime.types back to the default location. +- Added mod_ldap and friends, mod_cache and friends. +- Added openldap dependancy. + +* Sun Mar 30 2003 Graham Leggett 2.0.45-1 +- Created generic Apache rpm spec file from that donated by Redhat. +- Removed Redhat specific patches and boilerplate files. +- Removed SSL related Makefiles. + +* Mon Feb 24 2003 Joe Orton 2.0.40-21 +- add security fix for CAN-2003-0020; replace non-printable characters + with '!' when printing to error log. +- disable debuginfo on IA64. + +* Tue Feb 11 2003 Joe Orton 2.0.40-20 +- disable POSIX semaphores to support 2.4.18 kernel (#83324) + +* Wed Jan 29 2003 Joe Orton 2.0.40-19 +- require xmlto 0.0.11 or later +- fix apr_strerror on glibc2.3 + +* Wed Jan 22 2003 Tim Powers 2.0.40-18 +- rebuilt + +* Thu Jan 16 2003 Joe Orton 2.0.40-17 +- add mod_cgid and httpd binary built with worker MPM (#75496) +- allow choice of httpd binary in init script +- pick appropriate CGI module based on loaded MPM in httpd.conf +- source /etc/sysconfig/httpd in apachectl to get httpd choice +- make "apachectl status" fail gracefully when links isn't found (#78159) + +* Mon Jan 13 2003 Joe Orton 2.0.40-16 +- rebuild for OpenSSL 0.9.7 + +* Fri Jan 3 2003 Joe Orton 2.0.40-15 +- fix possible infinite recursion in config dir processing (#77206) +- fix memory leaks in request body processing (#79282) + +* Thu Dec 12 2002 Joe Orton 2.0.40-14 +- remove unstable shmht session cache from mod_ssl +- get SSL libs from pkg-config if available (Nalin Dahyabhai) +- stop "apxs -a -i" from inserting AddModule into httpd.conf (#78676) + +* Wed Nov 6 2002 Joe Orton 2.0.40-13 +- fix location of installbuilddir in apxs when libdir!=/usr/lib + +* Wed Nov 6 2002 Joe Orton 2.0.40-12 +- pass libdir to configure; clean up config_vars.mk +- package instdso.sh, fixing apxs -i (#73428) +- prevent build if upstream MMN differs from mmn macro +- remove installed but unpackaged files + +* Wed Oct 9 2002 Joe Orton 2.0.40-11 +- correct SERVER_NAME encoding in i18n error pages (thanks to Andre Malo) + +* Wed Oct 9 2002 Joe Orton 2.0.40-10 +- fix patch for CAN-2002-0840 to also cover i18n error pages + +* Wed Oct 2 2002 Joe Orton 2.0.40-9 +- security fixes for CAN-2002-0840 and CAN-2002-0843 +- fix for possible mod_dav segfault for certain requests + +* Tue Sep 24 2002 Gary Benson +- updates to the migration guide + +* Wed Sep 4 2002 Nalin Dahyabhai 2.0.40-8 +- link httpd with libssl to avoid library loading/unloading weirdness + +* Tue Sep 3 2002 Joe Orton 2.0.40-7 +- add LoadModule lines for proxy modules in httpd.conf (#73349) +- fix permissions of conf/ssl.*/ directories; add Makefiles for + certificate management (#73352) + +* Mon Sep 2 2002 Joe Orton 2.0.40-6 +- provide "httpd-mmn" to manage module ABI compatibility + +* Sun Sep 1 2002 Joe Orton 2.0.40-5 +- fix SSL session cache (#69699) +- revert addition of LDAP support to apr-util + +* Mon Aug 26 2002 Joe Orton 2.0.40-4 +- set SIGXFSZ disposition to "ignored" (#69520) +- make dummy connections to the first listener in config (#72692) + +* Mon Aug 26 2002 Joe Orton 2.0.40-3 +- allow "apachectl configtest" on a 1.3 httpd.conf +- add mod_deflate +- enable LDAP support in apr-util +- don't package everything in /var/www/error as config(noreplace) + +* Wed Aug 21 2002 Bill Nottingham 2.0.40-2 +- add trigger (#68657) + +* Mon Aug 12 2002 Joe Orton 2.0.40-1 +- update to 2.0.40 + +* Wed Jul 24 2002 Joe Orton 2.0.36-8 +- improve comment on use of UserDir in default config (#66886) + +* Wed Jul 10 2002 Joe Orton 2.0.36-7 +- use /sbin/nologin as shell for apache user (#68371) +- add patch from CVS to fix possible infinite loop when processing + internal redirects + +* Wed Jun 26 2002 Gary Benson 2.0.36-6 +- modify init script to detect 1.3.x httpd.conf's and direct users + to the migration guide + +* Tue Jun 25 2002 Gary Benson 2.0.36-5 +- patch apachectl to detect 1.3.x httpd.conf's and direct users + to the migration guide +- ship the migration guide + +* Fri Jun 21 2002 Joe Orton +- move /etc/httpd2 back to /etc/httpd +- add noindex.html page and poweredby logo; tweak default config + to load noindex.html if no default "/" page is present. +- add patch to prevent mutex errors on graceful restart + +* Fri Jun 21 2002 Tim Powers 2.0.36-4 +- automated rebuild + +* Wed Jun 12 2002 Joe Orton 2.0.36-3 +- add patch to fix SSL mutex handling + +* Wed Jun 12 2002 Joe Orton 2.0.36-2 +- improved config directory patch + +* Mon May 20 2002 Joe Orton +- initial build; based heavily on apache.spec and mod_ssl.spec +- fixes: #65214, #58490, #57376, #61265, #65518, #58177, #57245 diff --git a/rubbos/app/httpd-2.0.64/build/rules.mk b/rubbos/app/httpd-2.0.64/build/rules.mk new file mode 100644 index 00000000..06afb83b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/build/rules.mk @@ -0,0 +1,226 @@ +# 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. + +include $(top_builddir)/build/config_vars.mk + +# 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. +# +ALL_CFLAGS = $(EXTRA_CFLAGS) $(NOTEST_CFLAGS) $(CFLAGS) +ALL_CPPFLAGS = $(DEFS) $(EXTRA_CPPFLAGS) $(NOTEST_CPPFLAGS) $(CPPFLAGS) +ALL_CXXFLAGS = $(EXTRA_CXXFLAGS) $(NOTEST_CXXFLAGS) $(CXXFLAGS) +ALL_LDFLAGS = $(EXTRA_LDFLAGS) $(NOTEST_LDFLAGS) $(LDFLAGS) +ALL_LIBS = $(EXTRA_LIBS) $(NOTEST_LIBS) $(LIBS) +ALL_INCLUDES = $(INCLUDES) $(EXTRA_INCLUDES) + +# Compile commands + +COMPILE = $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(ALL_INCLUDES) +CXX_COMPILE = $(CXX) $(ALL_CXXFLAGS) $(ALL_CPPFLAGS) $(ALL_INCLUDES) + +SH_COMPILE = $(LIBTOOL) --mode=compile $(COMPILE) -prefer-pic -c $< && touch $@ +SH_CXX_COMPILE = $(LIBTOOL) --mode=compile $(CXX_COMPILE) -prefer-pic -c $< && touch $@ + +LT_COMPILE = $(LIBTOOL) --mode=compile $(COMPILE) -prefer-non-pic -static -c $< && touch $@ +LT_CXX_COMPILE = $(LIBTOOL) --mode=compile $(CXX_COMPILE) -prefer-non-pic -static -c $< && touch $@ + +# Link-related commands + +LINK = $(LIBTOOL) --mode=link $(COMPILE) $(LT_LDFLAGS) $(ALL_LDFLAGS) -o $@ +SH_LINK = $(SH_LIBTOOL) --mode=link $(COMPILE) $(LT_LDFLAGS) $(ALL_LDFLAGS) $(SH_LDFLAGS) $(CORE_IMPLIB) $(SH_LIBS) -o $@ +MOD_LINK = $(LIBTOOL) --mode=link $(COMPILE) -module $(LT_LDFLAGS) $(ALL_LDFLAGS) -o $@ + +# Cross compile commands + +# Helper programs + +MKINSTALLDIRS = $(abs_srcdir)/build/mkdir.sh +INSTALL = $(LIBTOOL) --mode=install $(abs_srcdir)/build/install.sh -c +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 \ + $(CC) -MM $(ALL_CPPFLAGS) $(ALL_INCLUDES) $(srcdir)/*.c | sed 's/\.o:/.lo:/' > $(builddir)/.deps || true; \ + 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 + +local-install: $(TARGETS) $(SHARED_TARGETS) $(INSTALL_TARGETS) + @if test -n '$(PROGRAMS)'; then \ + test -d $(DESTDIR)$(sbindir) || $(MKINSTALLDIRS) $(DESTDIR)$(sbindir); \ + list='$(PROGRAMS)'; for i in $$list; do \ + $(INSTALL_PROGRAM) $$i $(DESTDIR)$(sbindir); \ + done; \ + fi + +# 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 +# +include $(builddir)/.deps + +.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 $(INSTALL_TARGETS) + diff --git a/rubbos/app/httpd-2.0.64/build/rules.mk.in b/rubbos/app/httpd-2.0.64/build/rules.mk.in new file mode 100644 index 00000000..7f1949f6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/build/rules.mk.in @@ -0,0 +1,226 @@ +# 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. +# +ALL_CFLAGS = $(EXTRA_CFLAGS) $(NOTEST_CFLAGS) $(CFLAGS) +ALL_CPPFLAGS = $(DEFS) $(EXTRA_CPPFLAGS) $(NOTEST_CPPFLAGS) $(CPPFLAGS) +ALL_CXXFLAGS = $(EXTRA_CXXFLAGS) $(NOTEST_CXXFLAGS) $(CXXFLAGS) +ALL_LDFLAGS = $(EXTRA_LDFLAGS) $(NOTEST_LDFLAGS) $(LDFLAGS) +ALL_LIBS = $(EXTRA_LIBS) $(NOTEST_LIBS) $(LIBS) +ALL_INCLUDES = $(INCLUDES) $(EXTRA_INCLUDES) + +# Compile commands + +COMPILE = $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(ALL_INCLUDES) +CXX_COMPILE = $(CXX) $(ALL_CXXFLAGS) $(ALL_CPPFLAGS) $(ALL_INCLUDES) + +SH_COMPILE = $(LIBTOOL) --mode=compile $(COMPILE) @SHLTCFLAGS@ -c $< && touch $@ +SH_CXX_COMPILE = $(LIBTOOL) --mode=compile $(CXX_COMPILE) @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 $(COMPILE) $(LT_LDFLAGS) $(ALL_LDFLAGS) -o $@ +SH_LINK = $(SH_LIBTOOL) --mode=link $(COMPILE) $(LT_LDFLAGS) $(ALL_LDFLAGS) $(SH_LDFLAGS) $(CORE_IMPLIB) $(SH_LIBS) -o $@ +MOD_LINK = $(LIBTOOL) --mode=link $(COMPILE) -module $(LT_LDFLAGS) $(ALL_LDFLAGS) -o $@ + +# Cross compile commands + +# Helper programs + +MKINSTALLDIRS = $(abs_srcdir)/build/mkdir.sh +INSTALL = $(LIBTOOL) --mode=install $(abs_srcdir)/build/install.sh -c +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 \ + $(CC) -MM $(ALL_CPPFLAGS) $(ALL_INCLUDES) $(srcdir)/*.c | sed 's/\.o:/.lo:/' > $(builddir)/.deps || true; \ + 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 + +local-install: $(TARGETS) $(SHARED_TARGETS) $(INSTALL_TARGETS) + @if test -n '$(PROGRAMS)'; then \ + test -d $(DESTDIR)$(sbindir) || $(MKINSTALLDIRS) $(DESTDIR)$(sbindir); \ + list='$(PROGRAMS)'; for i in $$list; do \ + $(INSTALL_PROGRAM) $$i $(DESTDIR)$(sbindir); \ + done; \ + fi + +# 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 $(INSTALL_TARGETS) + diff --git a/rubbos/app/httpd-2.0.64/build/special.mk b/rubbos/app/httpd-2.0.64/build/special.mk new file mode 100644 index 00000000..d7d474d6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/build/special.mk @@ -0,0 +1,38 @@ +# 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-modules: + @test -d $(DESTDIR)$(libexecdir) || $(MKINSTALLDIRS) $(DESTDIR)$(libexecdir); + @builtin='$(BUILTIN_LIBS)'; \ + has_mod_so=`echo $$builtin|sed 's/^.*mod_so.*$$/has_mod_so/'`; \ + if [ "x$$has_mod_so" = "xhas_mod_so" ]; then \ + list='$(shared)'; \ + for i in $$list; do \ + $(top_srcdir)/build/instdso.sh SH_LIBTOOL='$(SH_LIBTOOL)' $$i $(DESTDIR)$(libexecdir); \ + done; \ + fi + +include $(top_builddir)/build/rules.mk + diff --git a/rubbos/app/httpd-2.0.64/build/sysv_makefile b/rubbos/app/httpd-2.0.64/build/sysv_makefile new file mode 100755 index 00000000..ea1d4388 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/build/win32/apache.ico b/rubbos/app/httpd-2.0.64/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 0) { + if (match ($0, /^.*\* Copyright /)) { + copyright = substr($0, RLENGTH + 1); + } + 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_ADD_STRING +"[^"]*"/)) { + ver_build = substr($3, 2, length($3) - 2); + } + } + + ver = ver_major "." ver_minor "." ver_patch ver_build; + verc = ver_major "," ver_minor "," ver_patch; + if (match (ver_build, /-dev/)) { + ff = ff + 2; + verc = verc "," 0; + } else if (!ver_build) { + verc = verc "," 200; + } else { + verc = verc "," 100; + } + + if (length(vendor)) { + ff = ff + 8; + } + + if (length(icon)) { + print "1 ICON DISCARDABLE \"" icon "\""; + } + print "1 VERSIONINFO"; + print " FILEVERSION " verc ""; + print " PRODUCTVERSION " verc ""; + print " FILEFLAGSMASK 0x3fL"; + print "#if defined(_DEBUG)" + print " FILEFLAGS 0x" sprintf("%02x", ff + 1) "L"; + print "#else" + print " FILEFLAGS 0x" sprintf("%02x", ff) "L"; + print "#endif" + print " FILEOS 0x40004L"; + print " FILETYPE 0x1L"; + print " FILESUBTYPE 0x0L"; + print "BEGIN"; + print " BLOCK \"StringFileInfo\""; + print " BEGIN"; + print " BLOCK \"040904b0\""; + print " BEGIN"; + print " VALUE \"Comments\", "\ + "\"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\\r\\n\\r\\n"\ + "http://www.apache.org/licenses/LICENSE-2.0\\r\\n\\r\\n"\ + "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.\\0\""; + print " VALUE \"CompanyName\", \"Apache Software Foundation\\0\""; + print " VALUE \"FileDescription\", \"" desc "\\0\""; + print " VALUE \"FileVersion\", \"" ver "\\0\""; + print " VALUE \"InternalName\", \"" file "\\0\""; + print " VALUE \"LegalCopyright\", \"Copyright " copyright "\\0\""; + print " VALUE \"OriginalFilename\", \"" file "\\0\""; + if (vendor) { + print " VALUE \"PrivateBuild\", \"" vendor "\\0\""; + } + if (special) { + print " VALUE \"SpecialBuild\", \"" vendor "\\0\""; + } + print " VALUE \"ProductName\", \"Apache HTTP Server\\0\""; + print " VALUE \"ProductVersion\", \"" ver "\\0\""; + print " END"; + print " END"; + print " BLOCK \"VarFileInfo\""; + print " BEGIN"; + print " VALUE \"Translation\", 0x409, 1200"; + print " END"; + print "END"; +} diff --git a/rubbos/app/httpd-2.0.64/buildconf b/rubbos/app/httpd-2.0.64/buildconf new file mode 100755 index 00000000..504c885e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/buildconf @@ -0,0 +1,189 @@ +#!/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. +# +# +# buildconf: Build the support scripts needed to compile from a +# checked-out version of the source code. + +# 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 +apu_src_dir=srclib/apr-util + +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 + ;; + esac + + case "$1" in + --with-apr-util=*) + apu_src_dir=$optarg + ;; + esac + + shift +done + +# +# Check to be sure that we have the srclib dependencies checked-out +# + +should_exit=0 + +if [ ! -f "$apr_src_dir/build/apr_common.m4" ]; then + echo "" + echo "You don't have a copy of the apr source in $apr_src_dir. " + 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 " cd srclib" + echo " svn co https://svn.apache.org/repos/asf/apr/apr/branches/0.9.x apr" + echo "" + should_exit=1 +fi + +if [ ! -f "$apu_src_dir/Makefile.in" ]; then + echo "" + echo "You don't have a copy of the apr-util source in $apu_src_dir. " + 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 " cd srclib" + echo " svn co https://svn.apache.org/repos/asf/apr/apr-util/branches/0.9.x apr-util" + echo "" + should_exit=1 +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's cache directory +rm -rf autom4te*.cache + +case "`uname`" in +*BSD/OS*) + ./build/bsd_makefile;; +esac +# +# end temporary stuff + +apr_configure="$apr_src_dir/configure" +aprutil_configure="$apu_src_dir/configure" +pcre_configure="srclib/pcre/configure" +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 [ "$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` + +echo copying build files +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 $apu_src_dir/build/find_apu.m4 build + +# 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) + +# 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 + +# ensure that the mod_ssl expression parser sources are never regenerated +# when running make +echo fixing timestamps for mod_ssl sources +cd modules/ssl +touch ssl_expr_parse.y +sleep 1 +touch ssl_expr_parse.c ssl_expr_parse.h ssl_expr_scan.l +sleep 1 +touch ssl_expr_scan.c +cd ../.. + +echo rebuilding $pcre_configure +(cd srclib/pcre && ${AUTOCONF:-autoconf}) + +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's cache directory +rm -rf autom4te*.cache + +echo rebuilding rpm spec file +( 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=1 + fi + cat ./build/rpm/httpd.spec.in | \ + sed -e "s/APACHE_VERSION/$VERSION/" \ + -e "s/APACHE_RELEASE/$RELEASE/" \ + -e "s/APACHE_MMN/$VMMN/" \ + > httpd.spec ) + +exit 0 diff --git a/rubbos/app/httpd-2.0.64/config.layout b/rubbos/app/httpd-2.0.64/config.layout new file mode 100644 index 00000000..03cb8f59 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/config.layout @@ -0,0 +1,324 @@ +## +## 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 + + +# 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 + + +# BeOS layout... + + prefix: /boot/home/apache + exec_prefix: ${prefix} + bindir: ${exec_prefix}/bin + sbindir: ${exec_prefix}/bin + libdir: ${exec_prefix}/lib + libexecdir: ${exec_prefix}/libexec + 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 + + +# 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/run + runtimedir: ${prefix}/var/run + logfiledir: ${prefix}/var/log/apache2 + proxycachedir: ${prefix}/var/cache/apache2/proxy + infodir: ${exec_prefix}/share/info + installbuilddir: ${prefix}/etc/apache2/build + errordir: ${datadir}/error + diff --git a/rubbos/app/httpd-2.0.64/config.log b/rubbos/app/httpd-2.0.64/config.log new file mode 100644 index 00000000..e82ef4ca --- /dev/null +++ b/rubbos/app/httpd-2.0.64/config.log @@ -0,0 +1,1534 @@ +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by configure, which was +generated by GNU Autoconf 2.63. Invocation command line was + + $ ./configure --prefix=/bottlenecks/rubbos/app/apache2 --enable-module=so --enable-so --with-mpm=worker + +## --------- ## +## Platform. ## +## --------- ## + +hostname = ubuntu +uname -m = x86_64 +uname -r = 3.16.0-30-generic +uname -s = Linux +uname -v = #40~14.04.1-Ubuntu SMP Thu Jan 15 17:43:14 UTC 2015 + +/usr/bin/uname -p = unknown +/bin/uname -X = unknown + +/bin/arch = unknown +/usr/bin/arch -k = unknown +/usr/convex/getsysinfo = unknown +/usr/bin/hostinfo = unknown +/bin/machine = unknown +/usr/bin/oslevel = unknown +/bin/universe = unknown + +PATH: /bottlenecks/rubbos/app/jdk1.6.0_27/bin +PATH: /bin/unix +PATH: /bottlenecks/rubbos/app/apache-ant-1.6.5/bin +PATH: /bottlenecks/rubbos/app/apache-tomcat-5.5.17/bin +PATH: /usr/local/sbin +PATH: /usr/local/bin +PATH: /usr/sbin +PATH: /usr/bin +PATH: /sbin +PATH: /bin +PATH: /usr/games +PATH: /usr/local/games + + +## ----------- ## +## Core tests. ## +## ----------- ## + +configure:2401: checking for chosen layout +configure:2403: result: Apache +configure:3205: checking for working mkdir -p +configure:3221: result: yes +configure:3238: checking build system type +configure:3256: result: x86_64-unknown-linux-gnu +configure:3278: checking host system type +configure:3293: result: x86_64-unknown-linux-gnu +configure:3315: checking target system type +configure:3330: result: x86_64-unknown-linux-gnu +configure:3373: checking for APR +configure:3433: result: reconfig +configure:3697: checking for APR-util +configure:3758: result: reconfig +configure:4024: checking for gcc +configure:4051: result: gcc +configure:4283: checking for C compiler version +configure:4291: gcc --version >&5 +gcc (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4 +Copyright (C) 2013 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. + +configure:4295: $? = 0 +configure:4302: gcc -v >&5 +Using built-in specs. +COLLECT_GCC=gcc +COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper +Target: x86_64-linux-gnu +Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.8.4-2ubuntu1~14.04' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.8 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu +Thread model: posix +gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04) +configure:4306: $? = 0 +configure:4313: gcc -V >&5 +gcc: error: unrecognized command line option '-V' +gcc: fatal error: no input files +compilation terminated. +configure:4317: $? = 4 +configure:4340: checking for C compiler default output file name +configure:4362: gcc -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib conftest.c >&5 +configure:4366: $? = 0 +configure:4404: result: a.out +configure:4423: checking whether the C compiler works +configure:4433: ./a.out +configure:4437: $? = 0 +configure:4456: result: yes +configure:4463: checking whether we are cross compiling +configure:4465: result: no +configure:4468: checking for suffix of executables +configure:4475: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib conftest.c >&5 +configure:4479: $? = 0 +configure:4505: result: +configure:4511: checking for suffix of object files +configure:4537: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:4541: $? = 0 +configure:4566: result: o +configure:4570: checking whether we are using the GNU C compiler +configure:4599: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:4606: $? = 0 +configure:4623: result: yes +configure:4632: checking whether gcc accepts -g +configure:4662: gcc -c -g -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:4669: $? = 0 +configure:4770: result: yes +configure:4787: checking for gcc option to accept ISO C89 +configure:4861: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:4868: $? = 0 +configure:4891: result: none needed +configure:4914: checking how to run the C preprocessor +configure:5032: result: gcc -E +configure:5061: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +configure:5068: $? = 0 +configure:5099: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +conftest.c:8:28: fatal error: ac_nonexistent.h: No such file or directory + #include + ^ +compilation terminated. +configure:5106: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| /* end confdefs.h. */ +| #include +configure:5506: checking for rm +configure:5524: found /bin/rm +configure:5536: result: /bin/rm +configure:5548: checking for gawk +configure:5564: found /usr/bin/gawk +configure:5575: result: gawk +configure:5600: checking for a BSD-compatible install +configure:5668: result: /usr/bin/install -c +configure:5679: checking whether ln -s works +configure:5683: result: yes +configure:5733: checking for ranlib +configure:5749: found /usr/bin/ranlib +configure:5760: result: ranlib +configure:5786: checking for grep that handles long lines and -e +configure:5846: result: /bin/grep +configure:5851: checking for egrep +configure:5915: result: /bin/grep -E +configure:5920: checking for ANSI C header files +configure:5950: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:5957: $? = 0 +configure:6056: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib conftest.c >&5 +configure:6060: $? = 0 +configure:6066: ./conftest +configure:6070: $? = 0 +configure:6088: result: yes +configure:6112: checking for sys/types.h +configure:6133: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:6140: $? = 0 +configure:6157: result: yes +configure:6112: checking for sys/stat.h +configure:6133: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:6140: $? = 0 +configure:6157: result: yes +configure:6112: checking for stdlib.h +configure:6133: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:6140: $? = 0 +configure:6157: result: yes +configure:6112: checking for string.h +configure:6133: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:6140: $? = 0 +configure:6157: result: yes +configure:6112: checking for memory.h +configure:6133: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:6140: $? = 0 +configure:6157: result: yes +configure:6112: checking for strings.h +configure:6133: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:6140: $? = 0 +configure:6157: result: yes +configure:6112: checking for inttypes.h +configure:6133: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:6140: $? = 0 +configure:6157: result: yes +configure:6112: checking for stdint.h +configure:6133: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:6140: $? = 0 +configure:6157: result: yes +configure:6112: checking for unistd.h +configure:6133: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:6140: $? = 0 +configure:6157: result: yes +configure:6182: checking minix/config.h usability +configure:6199: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +conftest.c:51:26: fatal error: minix/config.h: No such file or directory + #include + ^ +compilation terminated. +configure:6206: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| /* end confdefs.h. */ +| #include +| #ifdef HAVE_SYS_TYPES_H +| # include +| #endif +| #ifdef HAVE_SYS_STAT_H +| # include +| #endif +| #ifdef STDC_HEADERS +| # include +| # include +| #else +| # ifdef HAVE_STDLIB_H +| # include +| # endif +| #endif +| #ifdef HAVE_STRING_H +| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H +| # include +| # endif +| # include +| #endif +| #ifdef HAVE_STRINGS_H +| # include +| #endif +| #ifdef HAVE_INTTYPES_H +| # include +| #endif +| #ifdef HAVE_STDINT_H +| # include +| #endif +| #ifdef HAVE_UNISTD_H +| # include +| #endif +| #include +configure:6220: result: no +configure:6224: checking minix/config.h presence +configure:6239: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +conftest.c:18:26: fatal error: minix/config.h: No such file or directory + #include + ^ +compilation terminated. +configure:6246: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| /* end confdefs.h. */ +| #include +configure:6260: result: no +configure:6288: checking for minix/config.h +configure:6295: result: no +configure:6326: checking whether it is safe to define __EXTENSIONS__ +configure:6354: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:6361: $? = 0 +configure:6376: result: yes +configure:6402: checking for library containing strerror +configure:6443: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib conftest.c >&5 +configure:6450: $? = 0 +configure:6481: result: none required +configure:6494: checking for ANSI C header files +configure:6662: result: yes +configure:6697: checking for string.h +configure:6704: result: yes +configure:6708: checking limits.h usability +configure:6725: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:6732: $? = 0 +configure:6746: result: yes +configure:6750: checking limits.h presence +configure:6765: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +configure:6772: $? = 0 +configure:6786: result: yes +configure:6814: checking for limits.h +configure:6823: result: yes +configure:6697: checking for unistd.h +configure:6704: result: yes +configure:6708: checking sys/socket.h usability +configure:6725: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:6732: $? = 0 +configure:6746: result: yes +configure:6750: checking sys/socket.h presence +configure:6765: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +configure:6772: $? = 0 +configure:6786: result: yes +configure:6814: checking for sys/socket.h +configure:6823: result: yes +configure:6708: checking pwd.h usability +configure:6725: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:6732: $? = 0 +configure:6746: result: yes +configure:6750: checking pwd.h presence +configure:6765: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +configure:6772: $? = 0 +configure:6786: result: yes +configure:6814: checking for pwd.h +configure:6823: result: yes +configure:6708: checking grp.h usability +configure:6725: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:6732: $? = 0 +configure:6746: result: yes +configure:6750: checking grp.h presence +configure:6765: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +configure:6772: $? = 0 +configure:6786: result: yes +configure:6814: checking for grp.h +configure:6823: result: yes +configure:6697: checking for strings.h +configure:6704: result: yes +configure:6708: checking sys/prctl.h usability +configure:6725: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:6732: $? = 0 +configure:6746: result: yes +configure:6750: checking sys/prctl.h presence +configure:6765: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +configure:6772: $? = 0 +configure:6786: result: yes +configure:6814: checking for sys/prctl.h +configure:6823: result: yes +configure:6708: checking sys/processor.h usability +configure:6725: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +conftest.c:65:27: fatal error: sys/processor.h: No such file or directory + #include + ^ +compilation terminated. +configure:6732: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define STDC_HEADERS 1 +| #define HAVE_STRING_H 1 +| #define HAVE_LIMITS_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_SYS_SOCKET_H 1 +| #define HAVE_PWD_H 1 +| #define HAVE_GRP_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_SYS_PRCTL_H 1 +| /* end confdefs.h. */ +| #include +| #ifdef HAVE_SYS_TYPES_H +| # include +| #endif +| #ifdef HAVE_SYS_STAT_H +| # include +| #endif +| #ifdef STDC_HEADERS +| # include +| # include +| #else +| # ifdef HAVE_STDLIB_H +| # include +| # endif +| #endif +| #ifdef HAVE_STRING_H +| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H +| # include +| # endif +| # include +| #endif +| #ifdef HAVE_STRINGS_H +| # include +| #endif +| #ifdef HAVE_INTTYPES_H +| # include +| #endif +| #ifdef HAVE_STDINT_H +| # include +| #endif +| #ifdef HAVE_UNISTD_H +| # include +| #endif +| #include +configure:6746: result: no +configure:6750: checking sys/processor.h presence +configure:6765: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +conftest.c:32:27: fatal error: sys/processor.h: No such file or directory + #include + ^ +compilation terminated. +configure:6772: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define STDC_HEADERS 1 +| #define HAVE_STRING_H 1 +| #define HAVE_LIMITS_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_SYS_SOCKET_H 1 +| #define HAVE_PWD_H 1 +| #define HAVE_GRP_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_SYS_PRCTL_H 1 +| /* end confdefs.h. */ +| #include +configure:6786: result: no +configure:6814: checking for sys/processor.h +configure:6823: result: no +configure:6708: checking sys/sem.h usability +configure:6725: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:6732: $? = 0 +configure:6746: result: yes +configure:6750: checking sys/sem.h presence +configure:6765: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +configure:6772: $? = 0 +configure:6786: result: yes +configure:6814: checking for sys/sem.h +configure:6823: result: yes +configure:6838: checking for sys/wait.h that is POSIX.1 compatible +configure:6874: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:6881: $? = 0 +configure:6896: result: yes +configure:6908: checking for an ANSI C-conforming const +configure:6983: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:6990: $? = 0 +configure:7005: result: yes +configure:7057: checking for getpwnam +configure:7113: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib conftest.c >&5 +configure:7120: $? = 0 +configure:7142: result: yes +configure:7057: checking for getgrnam +configure:7113: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib conftest.c >&5 +configure:7120: $? = 0 +configure:7142: result: yes +configure:7057: checking for initgroups +configure:7113: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib conftest.c >&5 +configure:7120: $? = 0 +configure:7142: result: yes +configure:7057: checking for bindprocessor +configure:7113: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib conftest.c >&5 +/tmp/ccXQRJbg.o: In function `main': +/bottlenecks/rubbos/app/httpd-2.0.64/conftest.c:71: undefined reference to `bindprocessor' +collect2: error: ld returned 1 exit status +configure:7120: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define STDC_HEADERS 1 +| #define HAVE_STRING_H 1 +| #define HAVE_LIMITS_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_SYS_SOCKET_H 1 +| #define HAVE_PWD_H 1 +| #define HAVE_GRP_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_SYS_PRCTL_H 1 +| #define HAVE_SYS_SEM_H 1 +| #define HAVE_SYS_WAIT_H 1 +| #define HAVE_GETPWNAM 1 +| #define HAVE_GETGRNAM 1 +| #define HAVE_INITGROUPS 1 +| /* end confdefs.h. */ +| /* Define bindprocessor to an innocuous variant, in case declares bindprocessor. +| For example, HP-UX 11i declares gettimeofday. */ +| #define bindprocessor innocuous_bindprocessor +| +| /* System header to define __stub macros and hopefully few prototypes, +| which can conflict with char bindprocessor (); below. +| Prefer to if __STDC__ is defined, since +| exists even on freestanding compilers. */ +| +| #ifdef __STDC__ +| # include +| #else +| # include +| #endif +| +| #undef bindprocessor +| +| /* 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 bindprocessor (); +| /* 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_bindprocessor || defined __stub___bindprocessor +| choke me +| #endif +| +| int +| main () +| { +| return bindprocessor (); +| ; +| return 0; +| } +configure:7142: result: no +configure:7057: checking for prctl +configure:7113: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib conftest.c >&5 +configure:7120: $? = 0 +configure:7142: result: yes +configure:7057: checking for timegm +configure:7113: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib conftest.c >&5 +configure:7120: $? = 0 +configure:7142: result: yes +configure:7155: checking for tm_gmtoff in struct tm +configure:7182: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:7189: $? = 0 +configure:7204: result: yes +configure:7393: checking whether to enable mod_access +configure:7431: result: yes (default) +configure:7485: checking whether to enable mod_auth +configure:7523: result: yes (default) +configure:7577: checking whether to enable mod_auth_anon +configure:7615: result: no +configure:7669: checking whether to enable mod_auth_dbm +configure:7707: result: no +configure:7762: checking whether to enable mod_auth_digest +configure:7845: result: no +configure:7947: checking whether to enable mod_isapi +configure:7985: result: no +configure:8087: checking whether to enable mod_file_cache +configure:8125: result: no +configure:8227: checking whether to enable mod_echo +configure:8265: result: no +configure:8462: checking whether to enable mod_charset_lite +configure:8500: result: no +configure:8558: checking whether to enable mod_cache +configure:8596: result: no +configure:8650: checking whether to enable mod_disk_cache +configure:8688: result: no +configure:8742: checking whether to enable mod_mem_cache +configure:8780: result: no +configure:8834: checking whether to enable mod_example +configure:8872: result: no +configure:8926: checking whether to enable mod_case_filter +configure:8964: result: no +configure:9018: checking whether to enable mod_case_filter_in +configure:9056: result: no +configure:9110: checking whether to enable mod_dumpio +configure:9148: result: no +configure:9204: checking whether to enable mod_ldap +configure:9242: result: no +configure:9298: checking whether to enable mod_auth_ldap +configure:9336: result: no +configure:9416: checking whether to enable mod_ext_filter +configure:9454: result: no +configure:9508: checking whether to enable mod_include +configure:9546: result: yes (default) +configure:9623: checking whether to enable mod_deflate +configure:10008: result: no +configure:10088: checking whether to enable mod_log_config +configure:10126: result: yes (default) +configure:10181: checking whether to enable mod_log_forensic +configure:10219: result: no +configure:10299: checking whether to enable mod_logio +configure:10337: result: no +configure:10417: checking whether to enable mod_env +configure:10455: result: yes (default) +configure:10509: checking whether to enable mod_mime_magic +configure:10547: result: no +configure:10601: checking whether to enable mod_cern_meta +configure:10639: result: no +configure:10693: checking whether to enable mod_expires +configure:10731: result: no +configure:10785: checking whether to enable mod_headers +configure:10823: result: no +configure:10878: checking whether to enable mod_usertrack +configure:11177: result: no +configure:11232: checking whether to enable mod_unique_id +configure:11270: result: no +configure:11324: checking whether to enable mod_setenvif +configure:11362: result: yes (default) +configure:11416: checking whether to enable mod_version +configure:11454: result: no +configure:11564: checking whether to enable mod_proxy +configure:11602: result: no +configure:11671: checking whether to enable mod_proxy_connect +configure:11709: result: no +configure:11763: checking whether to enable mod_proxy_ftp +configure:11801: result: no +configure:11855: checking whether to enable mod_proxy_http +configure:11893: result: no +configure:11973: checking whether to enable mod_ssl +configure:12478: result: no +configure:12558: checking whether to enable mod_optional_hook_export +configure:12596: result: no +configure:12650: checking whether to enable mod_optional_hook_import +configure:12688: result: no +configure:12742: checking whether to enable mod_optional_fn_import +configure:12780: result: no +configure:12834: checking whether to enable mod_optional_fn_export +configure:12872: result: no +configure:12926: checking whether to enable mod_bucketeer +configure:12964: result: no +configure:13056: checking for target platform +configure:13081: result: unix +configure:13113: checking for rlim_t +configure:13144: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:13151: $? = 0 +configure:13170: result: yes +configure:13200: checking sys/time.h usability +configure:13217: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:13224: $? = 0 +configure:13238: result: yes +configure:13242: checking sys/time.h presence +configure:13257: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +configure:13264: $? = 0 +configure:13278: result: yes +configure:13306: checking for sys/time.h +configure:13315: result: yes +configure:13200: checking sys/resource.h usability +configure:13217: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:13224: $? = 0 +configure:13238: result: yes +configure:13242: checking sys/resource.h presence +configure:13257: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +configure:13264: $? = 0 +configure:13278: result: yes +configure:13306: checking for sys/resource.h +configure:13315: result: yes +configure:13189: checking for sys/sem.h +configure:13196: result: yes +configure:13200: checking sys/ipc.h usability +configure:13217: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:13224: $? = 0 +configure:13238: result: yes +configure:13242: checking sys/ipc.h presence +configure:13257: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +configure:13264: $? = 0 +configure:13278: result: yes +configure:13306: checking for sys/ipc.h +configure:13315: result: yes +configure:13336: checking for setsid +configure:13392: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib conftest.c >&5 +configure:13399: $? = 0 +configure:13421: result: yes +configure:13336: checking for killpg +configure:13392: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib conftest.c >&5 +configure:13399: $? = 0 +configure:13421: result: yes +configure:13454: checking bstring.h usability +configure:13471: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +conftest.c:80:21: fatal error: bstring.h: No such file or directory + #include + ^ +compilation terminated. +configure:13478: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define STDC_HEADERS 1 +| #define HAVE_STRING_H 1 +| #define HAVE_LIMITS_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_SYS_SOCKET_H 1 +| #define HAVE_PWD_H 1 +| #define HAVE_GRP_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_SYS_PRCTL_H 1 +| #define HAVE_SYS_SEM_H 1 +| #define HAVE_SYS_WAIT_H 1 +| #define HAVE_GETPWNAM 1 +| #define HAVE_GETGRNAM 1 +| #define HAVE_INITGROUPS 1 +| #define HAVE_PRCTL 1 +| #define HAVE_TIMEGM 1 +| #define HAVE_GMTOFF 1 +| #define AP_ENABLE_V4_MAPPED 1 +| #define HAVE_SYS_TIME_H 1 +| #define HAVE_SYS_RESOURCE_H 1 +| #define HAVE_SYS_SEM_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SETSID 1 +| #define HAVE_KILLPG 1 +| /* end confdefs.h. */ +| #include +| #ifdef HAVE_SYS_TYPES_H +| # include +| #endif +| #ifdef HAVE_SYS_STAT_H +| # include +| #endif +| #ifdef STDC_HEADERS +| # include +| # include +| #else +| # ifdef HAVE_STDLIB_H +| # include +| # endif +| #endif +| #ifdef HAVE_STRING_H +| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H +| # include +| # endif +| # include +| #endif +| #ifdef HAVE_STRINGS_H +| # include +| #endif +| #ifdef HAVE_INTTYPES_H +| # include +| #endif +| #ifdef HAVE_STDINT_H +| # include +| #endif +| #ifdef HAVE_UNISTD_H +| # include +| #endif +| #include +configure:13492: result: no +configure:13496: checking bstring.h presence +configure:13511: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +conftest.c:47:21: fatal error: bstring.h: No such file or directory + #include + ^ +compilation terminated. +configure:13518: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define STDC_HEADERS 1 +| #define HAVE_STRING_H 1 +| #define HAVE_LIMITS_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_SYS_SOCKET_H 1 +| #define HAVE_PWD_H 1 +| #define HAVE_GRP_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_SYS_PRCTL_H 1 +| #define HAVE_SYS_SEM_H 1 +| #define HAVE_SYS_WAIT_H 1 +| #define HAVE_GETPWNAM 1 +| #define HAVE_GETGRNAM 1 +| #define HAVE_INITGROUPS 1 +| #define HAVE_PRCTL 1 +| #define HAVE_TIMEGM 1 +| #define HAVE_GMTOFF 1 +| #define AP_ENABLE_V4_MAPPED 1 +| #define HAVE_SYS_TIME_H 1 +| #define HAVE_SYS_RESOURCE_H 1 +| #define HAVE_SYS_SEM_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SETSID 1 +| #define HAVE_KILLPG 1 +| /* end confdefs.h. */ +| #include +configure:13532: result: no +configure:13560: checking for bstring.h +configure:13569: result: no +configure:13443: checking for unistd.h +configure:13450: result: yes +configure:13591: checking for syslog +configure:13647: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib conftest.c >&5 +configure:13654: $? = 0 +configure:13676: result: yes +configure:13705: checking sys/times.h usability +configure:13722: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:13729: $? = 0 +configure:13743: result: yes +configure:13747: checking sys/times.h presence +configure:13762: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +configure:13769: $? = 0 +configure:13783: result: yes +configure:13811: checking for sys/times.h +configure:13820: result: yes +configure:13839: checking for times +configure:13895: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib conftest.c >&5 +configure:13902: $? = 0 +configure:13924: result: yes +configure:13937: checking which MPM to use +configure:13953: result: worker +configure:14630: checking whether to enable mod_http +configure:14668: result: yes +configure:14722: checking whether to enable mod_mime +configure:14760: result: yes (default) +configure:14828: checking for extra modules +configure:14887: result: none +configure:14912: checking whether to enable mod_dav +configure:14950: result: no +configure:15057: checking whether to enable mod_status +configure:15095: result: yes (default) +configure:15149: checking whether to enable mod_autoindex +configure:15187: result: yes (default) +configure:15241: checking whether to enable mod_asis +configure:15279: result: yes (default) +configure:15333: checking whether to enable mod_info +configure:15371: result: no +configure:15425: checking whether to enable mod_suexec +configure:15477: result: no +configure:15557: checking whether to enable mod_cgid +configure:15593: result: checking dependencies +configure:15641: checking whether to enable mod_cgid +configure:15653: result: yes (default) +configure:15707: checking whether to enable mod_cgi +configure:15745: result: no +configure:16442: checking for pthread_kill +configure:16498: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib conftest.c >&5 +configure:16505: $? = 0 +configure:16527: result: yes +configure:16571: checking whether to enable mod_dav_fs +configure:16609: result: no +configure:16689: checking whether to enable mod_vhost_alias +configure:16727: result: no +configure:16781: checking whether to enable mod_negotiation +configure:16819: result: yes (default) +configure:16873: checking whether to enable mod_dir +configure:16911: result: yes (default) +configure:16965: checking whether to enable mod_imap +configure:17003: result: yes (default) +configure:17057: checking whether to enable mod_actions +configure:17095: result: yes (default) +configure:17149: checking whether to enable mod_speling +configure:17187: result: no +configure:17241: checking whether to enable mod_userdir +configure:17279: result: yes (default) +configure:17333: checking whether to enable mod_alias +configure:17371: result: yes (default) +configure:17426: checking whether to enable mod_rewrite +configure:17464: result: no +configure:17583: checking whether to enable mod_so +configure:17621: result: yes +configure:18020: checking whether byte ordering is bigendian +configure:18045: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +conftest.c:58:9: error: unknown type name 'not' + not a universal capable compiler + ^ +conftest.c:58:15: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'universal' + not a universal capable compiler + ^ +conftest.c:58:15: error: unknown type name 'universal' +configure:18052: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define STDC_HEADERS 1 +| #define HAVE_STRING_H 1 +| #define HAVE_LIMITS_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_SYS_SOCKET_H 1 +| #define HAVE_PWD_H 1 +| #define HAVE_GRP_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_SYS_PRCTL_H 1 +| #define HAVE_SYS_SEM_H 1 +| #define HAVE_SYS_WAIT_H 1 +| #define HAVE_GETPWNAM 1 +| #define HAVE_GETGRNAM 1 +| #define HAVE_INITGROUPS 1 +| #define HAVE_PRCTL 1 +| #define HAVE_TIMEGM 1 +| #define HAVE_GMTOFF 1 +| #define AP_ENABLE_V4_MAPPED 1 +| #define HAVE_SYS_TIME_H 1 +| #define HAVE_SYS_RESOURCE_H 1 +| #define HAVE_SYS_SEM_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SETSID 1 +| #define HAVE_KILLPG 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_SYSLOG 1 +| #define HAVE_SYS_TIMES_H 1 +| #define HAVE_TIMES 1 +| #define HAVE_PTHREAD_KILL 1 +| #define AP_USING_AUTOCONF 1 +| #define AP_NONBLOCK_WHEN_MULTI_LISTEN 1 +| #define AP_SIG_GRACEFUL SIGUSR1 +| #define AP_SIG_GRACEFUL_STRING "SIGUSR1" +| #define AP_SIG_GRACEFUL_SHORT USR1 +| /* end confdefs.h. */ +| #ifndef __APPLE_CC__ +| not a universal capable compiler +| #endif +| typedef int dummy; +| +configure:18102: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:18109: $? = 0 +configure:18141: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +conftest.c: In function 'main': +conftest.c:64:4: error: unknown type name 'not' + not big endian + ^ +conftest.c:64:12: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'endian' + not big endian + ^ +configure:18148: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define STDC_HEADERS 1 +| #define HAVE_STRING_H 1 +| #define HAVE_LIMITS_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_SYS_SOCKET_H 1 +| #define HAVE_PWD_H 1 +| #define HAVE_GRP_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_SYS_PRCTL_H 1 +| #define HAVE_SYS_SEM_H 1 +| #define HAVE_SYS_WAIT_H 1 +| #define HAVE_GETPWNAM 1 +| #define HAVE_GETGRNAM 1 +| #define HAVE_INITGROUPS 1 +| #define HAVE_PRCTL 1 +| #define HAVE_TIMEGM 1 +| #define HAVE_GMTOFF 1 +| #define AP_ENABLE_V4_MAPPED 1 +| #define HAVE_SYS_TIME_H 1 +| #define HAVE_SYS_RESOURCE_H 1 +| #define HAVE_SYS_SEM_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SETSID 1 +| #define HAVE_KILLPG 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_SYSLOG 1 +| #define HAVE_SYS_TIMES_H 1 +| #define HAVE_TIMES 1 +| #define HAVE_PTHREAD_KILL 1 +| #define AP_USING_AUTOCONF 1 +| #define AP_NONBLOCK_WHEN_MULTI_LISTEN 1 +| #define AP_SIG_GRACEFUL SIGUSR1 +| #define AP_SIG_GRACEFUL_STRING "SIGUSR1" +| #define AP_SIG_GRACEFUL_SHORT USR1 +| /* end confdefs.h. */ +| #include +| #include +| +| int +| main () +| { +| #if BYTE_ORDER != BIG_ENDIAN +| not big endian +| #endif +| +| ; +| return 0; +| } +configure:18400: result: no +configure:19008: creating ./config.status + +## ---------------------- ## +## Running config.status. ## +## ---------------------- ## + +This file was extended by config.status, which was +generated by GNU Autoconf 2.63. Invocation command line was + + CONFIG_FILES = + CONFIG_HEADERS = + CONFIG_LINKS = + CONFIG_COMMANDS = + $ ./config.status + +on ubuntu + +config.status:1003: creating docs/conf/httpd-std.conf +config.status:1003: creating docs/conf/ssl-std.conf +config.status:1003: creating include/ap_config_layout.h +config.status:1003: creating support/apxs +config.status:1003: creating support/apachectl +config.status:1003: creating support/dbmmanage +config.status:1003: creating support/envvars-std +config.status:1003: creating support/log_server_status +config.status:1003: creating support/logresolve.pl +config.status:1003: creating support/phf_abuse_log.cgi +config.status:1003: creating support/split-logfile +config.status:1003: creating build/rules.mk +config.status:1003: creating build/pkg/pkginfo +config.status:1003: creating include/ap_config_auto.h +config.status:1219: include/ap_config_auto.h is unchanged +config.status:1237: executing default commands +configure:20182: WARNING: unrecognized options: --enable-module + +## ---------------- ## +## Cache variables. ## +## ---------------- ## + +ac_cv_build=x86_64-unknown-linux-gnu +ac_cv_c_bigendian=no +ac_cv_c_compiler_gnu=yes +ac_cv_c_const=yes +ac_cv_define_APR_HAS_DSO=yes +ac_cv_define_APR_HAS_THREADS=yes +ac_cv_define_APR_HAVE_IPV6=yes +ac_cv_env_CC_set= +ac_cv_env_CC_value= +ac_cv_env_CFLAGS_set= +ac_cv_env_CFLAGS_value= +ac_cv_env_CPPFLAGS_set= +ac_cv_env_CPPFLAGS_value= +ac_cv_env_CPP_set= +ac_cv_env_CPP_value= +ac_cv_env_LDFLAGS_set= +ac_cv_env_LDFLAGS_value= +ac_cv_env_LIBS_set= +ac_cv_env_LIBS_value= +ac_cv_env_build_alias_set= +ac_cv_env_build_alias_value= +ac_cv_env_host_alias_set= +ac_cv_env_host_alias_value= +ac_cv_env_target_alias_set= +ac_cv_env_target_alias_value= +ac_cv_func_bindprocessor=no +ac_cv_func_getgrnam=yes +ac_cv_func_getpwnam=yes +ac_cv_func_initgroups=yes +ac_cv_func_killpg=yes +ac_cv_func_prctl=yes +ac_cv_func_pthread_kill=yes +ac_cv_func_setsid=yes +ac_cv_func_syslog=yes +ac_cv_func_timegm=yes +ac_cv_func_times=yes +ac_cv_header_bstring_h=no +ac_cv_header_grp_h=yes +ac_cv_header_inttypes_h=yes +ac_cv_header_limits_h=yes +ac_cv_header_memory_h=yes +ac_cv_header_minix_config_h=no +ac_cv_header_pwd_h=yes +ac_cv_header_stdc=yes +ac_cv_header_stdint_h=yes +ac_cv_header_stdlib_h=yes +ac_cv_header_string_h=yes +ac_cv_header_strings_h=yes +ac_cv_header_sys_ipc_h=yes +ac_cv_header_sys_prctl_h=yes +ac_cv_header_sys_processor_h=no +ac_cv_header_sys_resource_h=yes +ac_cv_header_sys_sem_h=yes +ac_cv_header_sys_socket_h=yes +ac_cv_header_sys_stat_h=yes +ac_cv_header_sys_time_h=yes +ac_cv_header_sys_times_h=yes +ac_cv_header_sys_types_h=yes +ac_cv_header_sys_wait_h=yes +ac_cv_header_unistd_h=yes +ac_cv_host=x86_64-unknown-linux-gnu +ac_cv_mkdir_p=yes +ac_cv_objext=o +ac_cv_path_EGREP='/bin/grep -E' +ac_cv_path_GREP=/bin/grep +ac_cv_path_RM=/bin/rm +ac_cv_path_install='/usr/bin/install -c' +ac_cv_prog_AWK=gawk +ac_cv_prog_CPP='gcc -E' +ac_cv_prog_ac_ct_CC=gcc +ac_cv_prog_ac_ct_RANLIB=ranlib +ac_cv_prog_cc_c89= +ac_cv_prog_cc_g=yes +ac_cv_safe_to_define___extensions__=yes +ac_cv_search_strerror='none required' +ac_cv_struct_tm_gmtoff=yes +ac_cv_target=x86_64-unknown-linux-gnu +ac_cv_type_rlim_t=yes +apache_cv_mpm=worker + +## ----------------- ## +## Output variables. ## +## ----------------- ## + +APACHECTL_ULIMIT='ulimit -S -n `ulimit -H -n`' +APR_BINDIR='/bottlenecks/rubbos/app/apache2/bin' +APR_INCLUDEDIR='/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include' +APU_BINDIR='/bottlenecks/rubbos/app/apache2/bin' +APU_INCLUDEDIR='/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include' +AP_BUILD_SRCLIB_DIRS='apr apr-util' +AP_CLEAN_SRCLIB_DIRS='apr-util apr' +AP_LIBS='/bottlenecks/rubbos/app/httpd-2.0.64/srclib/pcre/libpcre.la /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/libaprutil-0.la /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/libexpat.la /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/libapr-0.la -lrt -lm -lcrypt -lnsl -lpthread -ldl' +AP_SIG_GRACEFUL='SIGUSR1' +AP_SIG_GRACEFUL_SHORT='USR1' +AP_SIG_GRACEFUL_STRING='' +AWK='gawk' +BUILTIN_LIBS=' modules/aaa/mod_access.la modules/aaa/mod_auth.la modules/filters/mod_include.la modules/loggers/mod_log_config.la modules/metadata/mod_env.la modules/metadata/mod_setenvif.la modules/http/mod_http.la modules/http/mod_mime.la modules/generators/mod_status.la modules/generators/mod_autoindex.la modules/generators/mod_asis.la modules/generators/mod_cgid.la modules/mappers/mod_negotiation.la modules/mappers/mod_dir.la modules/mappers/mod_imap.la modules/mappers/mod_actions.la modules/mappers/mod_userdir.la modules/mappers/mod_alias.la modules/mappers/mod_so.la' +CC='gcc' +CFLAGS='' +CORE_IMPLIB='' +CORE_IMPLIB_FILE='' +CPP='gcc -E' +CPPFLAGS='' +CXX='' +CXXFLAGS='' +DEFS='-DHAVE_CONFIG_H' +DSO_MODULES='' +ECHO_C='' +ECHO_N='-n' +ECHO_T='' +EGREP='/bin/grep -E' +EXEEXT='' +EXTRA_CFLAGS=' -g -O2 -pthread' +EXTRA_CPPFLAGS=' -D_REENTRANT -D_GNU_SOURCE' +EXTRA_CXXFLAGS='' +EXTRA_INCLUDES=' -I/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include -I/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include -I/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib -I. -I$(top_srcdir)/os/$(OS_DIR) -I$(top_srcdir)/server/mpm/$(MPM_SUBDIR_NAME) -I$(top_srcdir)/modules/http -I$(top_srcdir)/modules/filters -I$(top_srcdir)/modules/proxy -I$(top_srcdir)/include -I$(top_srcdir)/modules/generators -I$(top_srcdir)/modules/dav/main' +EXTRA_LDFLAGS=' -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib' +EXTRA_LIBS='' +GREP='/bin/grep' +HTTPD_LDFLAGS='' +HTTPD_VERSION='2.0.64' +INCLUDES='' +INSTALL_DATA='${INSTALL} -m 644' +INSTALL_PROGRAM='${INSTALL}' +INSTALL_PROG_FLAGS='' +INSTALL_SCRIPT='${INSTALL}' +LDFLAGS='' +LIBOBJS='' +LIBS='' +LIBTOOL='/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/libtool $(LTFLAGS)' +LN_S='ln -s' +LTCFLAGS='-prefer-non-pic -static' +LTFLAGS='--silent' +LTLIBOBJS='' +LT_LDFLAGS='-export-dynamic' +MK_IMPLIB='' +MODULE_CLEANDIRS=' arch/win32 cache echo experimental proxy ssl test dav/main dav/fs' +MODULE_DIRS=' aaa filters loggers metadata http generators mappers' +MOD_ACCESS_LDADD='' +MOD_ACTIONS_LDADD='' +MOD_ALIAS_LDADD='' +MOD_ASIS_LDADD='' +MOD_AUTH_ANON_LDADD='' +MOD_AUTH_DBM_LDADD='' +MOD_AUTH_DIGEST_LDADD='' +MOD_AUTH_LDADD='' +MOD_AUTH_LDAP_LDADD='' +MOD_AUTOINDEX_LDADD='' +MOD_BUCKETEER_LDADD='' +MOD_CACHE_LDADD='' +MOD_CASE_FILTER_IN_LDADD='' +MOD_CASE_FILTER_LDADD='' +MOD_CERN_META_LDADD='' +MOD_CGID_LDADD='' +MOD_CGI_LDADD='' +MOD_CHARSET_LITE_LDADD='' +MOD_DAV_FS_LDADD='' +MOD_DAV_LDADD='' +MOD_DEFLATE_LDADD='' +MOD_DIR_LDADD='' +MOD_DISK_CACHE_LDADD='' +MOD_DUMPIO_LDADD='' +MOD_ECHO_LDADD='' +MOD_ENV_LDADD='' +MOD_EXAMPLE_LDADD='' +MOD_EXPIRES_LDADD='' +MOD_EXT_FILTER_LDADD='' +MOD_FILE_CACHE_LDADD='' +MOD_HEADERS_LDADD='' +MOD_HTTP_LDADD='' +MOD_IMAP_LDADD='' +MOD_INCLUDE_LDADD='' +MOD_INFO_LDADD='' +MOD_ISAPI_LDADD='' +MOD_LDAP_LDADD='' +MOD_LOGIO_LDADD='' +MOD_LOG_CONFIG_LDADD='' +MOD_LOG_FORENSIC_LDADD='' +MOD_MEM_CACHE_LDADD='' +MOD_MIME_LDADD='' +MOD_MIME_MAGIC_LDADD='' +MOD_NEGOTIATION_LDADD='' +MOD_OPTIONAL_FN_EXPORT_LDADD='' +MOD_OPTIONAL_FN_IMPORT_LDADD='' +MOD_OPTIONAL_HOOK_EXPORT_LDADD='' +MOD_OPTIONAL_HOOK_IMPORT_LDADD='' +MOD_PROXY_CONNECT_LDADD='' +MOD_PROXY_FTP_LDADD='' +MOD_PROXY_HTTP_LDADD='' +MOD_PROXY_LDADD='' +MOD_REWRITE_LDADD='' +MOD_SETENVIF_LDADD='' +MOD_SO_LDADD='' +MOD_SPELING_LDADD='' +MOD_SSL_LDADD='' +MOD_STATUS_LDADD='' +MOD_SUEXEC_LDADD='' +MOD_UNIQUE_ID_LDADD='' +MOD_USERDIR_LDADD='' +MOD_USERTRACK_LDADD='' +MOD_VERSION_LDADD='' +MOD_VHOST_ALIAS_LDADD='' +MPM_LIB='server/mpm/worker/libworker.la' +MPM_NAME='worker' +MPM_SUBDIR_NAME='worker' +NOTEST_CFLAGS='' +NOTEST_CPPFLAGS='-DAP_HAVE_DESIGNATED_INITIALIZER' +NOTEST_CXXFLAGS='' +NOTEST_LDFLAGS='' +NOTEST_LIBS='' +OBJEXT='o' +OS='unix' +OS_DIR='unix' +OS_SPECIFIC_VARS='' +PACKAGE_BUGREPORT='' +PACKAGE_NAME='' +PACKAGE_STRING='' +PACKAGE_TARNAME='' +PACKAGE_VERSION='' +PATH_SEPARATOR=':' +PORT='80' +POST_SHARED_CMDS='echo ""' +PRE_SHARED_CMDS='echo ""' +RANLIB='ranlib' +RM='/bin/rm' +SHELL='/bin/bash' +SHLIBPATH_VAR='LD_LIBRARY_PATH' +SHLTCFLAGS='-prefer-pic' +SH_LDFLAGS='' +SH_LIBS='' +SH_LIBTOOL='$(LIBTOOL)' +SSL_LIBS='' +UTIL_LDFLAGS='' +ab_LTFLAGS='' +abs_srcdir='/bottlenecks/rubbos/app/httpd-2.0.64' +ac_ct_CC='gcc' +ap_make_delimiter=' ' +ap_make_include='include' +bindir='${exec_prefix}/bin' +build='x86_64-unknown-linux-gnu' +build_alias='' +build_cpu='x86_64' +build_os='linux-gnu' +build_vendor='unknown' +cgidir='${datadir}/cgi-bin' +checkgid_LTFLAGS='' +datadir='${prefix}' +datarootdir='${prefix}/share' +docdir='${datarootdir}/doc/${PACKAGE}' +dvidir='${docdir}' +errordir='${datadir}/error' +exec_prefix='${prefix}' +exp_bindir='/bottlenecks/rubbos/app/apache2/bin' +exp_cgidir='/bottlenecks/rubbos/app/apache2/cgi-bin' +exp_datadir='/bottlenecks/rubbos/app/apache2' +exp_errordir='/bottlenecks/rubbos/app/apache2/error' +exp_exec_prefix='/bottlenecks/rubbos/app/apache2' +exp_htdocsdir='/bottlenecks/rubbos/app/apache2/htdocs' +exp_iconsdir='/bottlenecks/rubbos/app/apache2/icons' +exp_includedir='/bottlenecks/rubbos/app/apache2/include' +exp_installbuilddir='/bottlenecks/rubbos/app/apache2/build' +exp_libdir='/bottlenecks/rubbos/app/apache2/lib' +exp_libexecdir='/bottlenecks/rubbos/app/apache2/modules' +exp_localstatedir='/bottlenecks/rubbos/app/apache2' +exp_logfiledir='/bottlenecks/rubbos/app/apache2/logs' +exp_mandir='/bottlenecks/rubbos/app/apache2/man' +exp_manualdir='/bottlenecks/rubbos/app/apache2/manual' +exp_proxycachedir='/bottlenecks/rubbos/app/apache2/proxy' +exp_runtimedir='/bottlenecks/rubbos/app/apache2/logs' +exp_sbindir='/bottlenecks/rubbos/app/apache2/bin' +exp_sysconfdir='/bottlenecks/rubbos/app/apache2/conf' +host='x86_64-unknown-linux-gnu' +host_alias='' +host_cpu='x86_64' +host_os='linux-gnu' +host_vendor='unknown' +htdbm_LTFLAGS='' +htdigest_LTFLAGS='' +htdocsdir='${datadir}/htdocs' +htmldir='${docdir}' +htpasswd_LTFLAGS='' +iconsdir='${datadir}/icons' +includedir='${prefix}/include' +infodir='${datarootdir}/info' +installbuilddir='${datadir}/build' +libdir='${exec_prefix}/lib' +libexecdir='${exec_prefix}/modules' +localedir='${datarootdir}/locale' +localstatedir='${prefix}' +logfiledir='${localstatedir}/logs' +logresolve_LTFLAGS='' +mandir='${prefix}/man' +manualdir='${datadir}/manual' +nonssl_listen_stmt_1='' +nonssl_listen_stmt_2='Listen @@Port@@' +oldincludedir='/usr/include' +other_targets='' +pdfdir='${docdir}' +perlbin='/usr/bin/perl' +prefix='/bottlenecks/rubbos/app/apache2' +progname='httpd' +program_transform_name='s,x,x,' +proxycachedir='${localstatedir}/proxy' +psdir='${docdir}' +rel_bindir='bin' +rel_cgidir='cgi-bin' +rel_datadir='' +rel_errordir='error' +rel_exec_prefix='' +rel_htdocsdir='htdocs' +rel_iconsdir='icons' +rel_includedir='include' +rel_installbuilddir='build' +rel_libdir='lib' +rel_libexecdir='modules' +rel_localstatedir='' +rel_logfiledir='logs' +rel_mandir='man' +rel_manualdir='manual' +rel_proxycachedir='proxy' +rel_runtimedir='logs' +rel_sbindir='bin' +rel_sysconfdir='conf' +rotatelogs_LTFLAGS='' +runtimedir='${localstatedir}/logs' +sbindir='${exec_prefix}/bin' +shared_build='' +sharedstatedir='${prefix}/com' +sysconfdir='${prefix}/conf' +target='x86_64-unknown-linux-gnu' +target_alias='' +target_cpu='x86_64' +target_os='linux-gnu' +target_vendor='unknown' + +## ----------- ## +## confdefs.h. ## +## ----------- ## + +#define PACKAGE_NAME "" +#define PACKAGE_TARNAME "" +#define PACKAGE_VERSION "" +#define PACKAGE_STRING "" +#define PACKAGE_BUGREPORT "" +#define STDC_HEADERS 1 +#define HAVE_SYS_TYPES_H 1 +#define HAVE_SYS_STAT_H 1 +#define HAVE_STDLIB_H 1 +#define HAVE_STRING_H 1 +#define HAVE_MEMORY_H 1 +#define HAVE_STRINGS_H 1 +#define HAVE_INTTYPES_H 1 +#define HAVE_STDINT_H 1 +#define HAVE_UNISTD_H 1 +#define __EXTENSIONS__ 1 +#define _ALL_SOURCE 1 +#define _GNU_SOURCE 1 +#define _POSIX_PTHREAD_SEMANTICS 1 +#define _TANDEM_SOURCE 1 +#define STDC_HEADERS 1 +#define HAVE_STRING_H 1 +#define HAVE_LIMITS_H 1 +#define HAVE_UNISTD_H 1 +#define HAVE_SYS_SOCKET_H 1 +#define HAVE_PWD_H 1 +#define HAVE_GRP_H 1 +#define HAVE_STRINGS_H 1 +#define HAVE_SYS_PRCTL_H 1 +#define HAVE_SYS_SEM_H 1 +#define HAVE_SYS_WAIT_H 1 +#define HAVE_GETPWNAM 1 +#define HAVE_GETGRNAM 1 +#define HAVE_INITGROUPS 1 +#define HAVE_PRCTL 1 +#define HAVE_TIMEGM 1 +#define HAVE_GMTOFF 1 +#define AP_ENABLE_V4_MAPPED 1 +#define HAVE_SYS_TIME_H 1 +#define HAVE_SYS_RESOURCE_H 1 +#define HAVE_SYS_SEM_H 1 +#define HAVE_SYS_IPC_H 1 +#define HAVE_SETSID 1 +#define HAVE_KILLPG 1 +#define HAVE_UNISTD_H 1 +#define HAVE_SYSLOG 1 +#define HAVE_SYS_TIMES_H 1 +#define HAVE_TIMES 1 +#define HAVE_PTHREAD_KILL 1 +#define AP_USING_AUTOCONF 1 +#define AP_NONBLOCK_WHEN_MULTI_LISTEN 1 +#define AP_SIG_GRACEFUL SIGUSR1 +#define AP_SIG_GRACEFUL_STRING "SIGUSR1" +#define AP_SIG_GRACEFUL_SHORT USR1 +#define HTTPD_ROOT "/bottlenecks/rubbos/app/apache2" +#define SERVER_CONFIG_FILE "conf/httpd.conf" +#define AP_TYPES_CONFIG_FILE "conf/mime.types" +#define APACHE_MPM_DIR "server/mpm/worker" + +configure: exit 0 diff --git a/rubbos/app/httpd-2.0.64/config.nice b/rubbos/app/httpd-2.0.64/config.nice new file mode 100755 index 00000000..b02ccd1e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/config.nice @@ -0,0 +1,10 @@ +#! /bin/sh +# +# Created by configure + +"./configure" \ +"--prefix=/bottlenecks/rubbos/app/apache2" \ +"--enable-module=so" \ +"--enable-so" \ +"--with-mpm=worker" \ +"$@" diff --git a/rubbos/app/httpd-2.0.64/config.status b/rubbos/app/httpd-2.0.64/config.status new file mode 100755 index 00000000..eaac88cf --- /dev/null +++ b/rubbos/app/httpd-2.0.64/config.status @@ -0,0 +1,1250 @@ +#! /bin/bash +# Generated by configure. +# 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-/bin/bash} +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be more Bourne compatible +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 + + + + +# PATH needs CR +# 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_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +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 + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + 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 + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + { (exit 1); exit 1; } +fi + +# Work around bugs in pre-3.0 UWIN ksh. +for as_var in ENV MAIL MAILPATH +do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# Required to use basename. +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 + + +# Name of the executable. +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# CDPATH. +$as_unset CDPATH + + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line after each line using $LINENO; the second 'sed' + # does the real work. The second script uses 'N' to pair each + # line-number line with the line containing $LINENO, and appends + # trailing '-' during substitution so that $LINENO is not a special + # case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # scripts with optimization help from Paolo Bonzini. Blame Lee + # E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + 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" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); exit 1; }; } + + # 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 +} + + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in +-n*) + case `echo 'x\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + *) ECHO_C='\c';; + esac;; +*) + ECHO_N='-n';; +esac +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +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 -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +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=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&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.63. 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` +" + +# Files that config.status was made for. +config_files=" docs/conf/httpd-std.conf docs/conf/ssl-std.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" +config_headers=" include/ap_config_auto.h" +config_commands=" default" + +ac_cs_usage="\ +\`$as_me' instantiates files from templates according to the +current configuration. + +Usage: $0 [OPTION]... [FILE]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, 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 ." + +ac_cs_version="\ +config.status +configured by ./configure, generated by GNU Autoconf 2.63, + with options \"'--prefix=/bottlenecks/rubbos/app/apache2' '--enable-module=so' '--enable-so' '--with-mpm=worker'\" + +Copyright (C) 2008 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='/bottlenecks/rubbos/app/httpd-2.0.64' +srcdir='.' +INSTALL='/usr/bin/install -c' +AWK='gawk' +test -n "$AWK" || AWK=awk +# 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=$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 ) + $as_echo "$ac_cs_version"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + CONFIG_FILES="$CONFIG_FILES '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + CONFIG_HEADERS="$CONFIG_HEADERS '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + { $as_echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; };; + --help | --hel | -h ) + $as_echo "$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_echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } ;; + + *) ac_config_targets="$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 + +if $ac_cs_recheck; then + set X '/bin/bash' './configure' '--prefix=/bottlenecks/rubbos/app/apache2' '--enable-module=so' '--enable-so' '--with-mpm=worker' $ac_configure_extra_args --no-create --no-recursion + shift + $as_echo "running CONFIG_SHELL=/bin/bash $*" >&6 + CONFIG_SHELL='/bin/bash' + export CONFIG_SHELL + exec "$@" +fi + +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +# +# INIT-COMMANDS +# + + + /bin/bash ./build/fastgen.sh . yes no modules/aaa/Makefile modules/arch/win32/Makefile modules/cache/Makefile modules/echo/Makefile modules/experimental/Makefile modules/filters/Makefile modules/loggers/Makefile modules/metadata/Makefile modules/proxy/Makefile modules/ssl/Makefile modules/test/Makefile os/unix/Makefile server/mpm/Makefile modules/http/Makefile modules/dav/main/Makefile modules/generators/Makefile server/mpm/worker/Makefile modules/dav/fs/Makefile modules/mappers/Makefile Makefile modules/Makefile srclib/Makefile os/beos/Makefile os/os2/Makefile os/Makefile os/unix/Makefile server/Makefile support/Makefile srclib/pcre/Makefile test/Makefile + + + + +# 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" ;; + "$APACHE_OUTPUT_FILES") CONFIG_FILES="$CONFIG_FILES $APACHE_OUTPUT_FILES" ;; + "docs/conf/httpd-std.conf") CONFIG_FILES="$CONFIG_FILES docs/conf/httpd-std.conf" ;; + "docs/conf/ssl-std.conf") CONFIG_FILES="$CONFIG_FILES docs/conf/ssl-std.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" ;; + "default") CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;; + + *) { { $as_echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 +$as_echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; + 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+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || 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= + trap 'exit_status=$? + { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status +' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || +{ + $as_echo "$as_me: cannot create a temporary directory in ." >&2 + { (exit 1); exit 1; } +} + +# 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=' ' +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 {' >"$tmp/subs1.awk" && +cat >>"$tmp/subs1.awk" <<\_ACAWK && +S["LTLIBOBJS"]="" +S["LIBOBJS"]="" +S["HTTPD_VERSION"]="2.0.64" +S["ap_make_delimiter"]=" " +S["ap_make_include"]="include" +S["perlbin"]="/usr/bin/perl" +S["APU_INCLUDEDIR"]="/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include" +S["APU_BINDIR"]="/bottlenecks/rubbos/app/apache2/bin" +S["APR_INCLUDEDIR"]="/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include" +S["APR_BINDIR"]="/bottlenecks/rubbos/app/apache2/bin" +S["DSO_MODULES"]="" +S["INSTALL_PROG_FLAGS"]="" +S["MK_IMPLIB"]="" +S["SH_LIBTOOL"]="$(LIBTOOL)" +S["SH_LIBS"]="" +S["CORE_IMPLIB"]="" +S["CORE_IMPLIB_FILE"]="" +S["nonssl_listen_stmt_2"]="Listen @@Port@@" +S["nonssl_listen_stmt_1"]="" +S["PORT"]="80" +S["MODULE_CLEANDIRS"]=" arch/win32 cache echo experimental proxy ssl test dav/main dav/fs" +S["MODULE_DIRS"]=" aaa filters loggers metadata http generators mappers" +S["LIBTOOL"]="/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/libtool $(LTFLAGS)" +S["NOTEST_LIBS"]="" +S["NOTEST_LDFLAGS"]="" +S["NOTEST_CXXFLAGS"]="" +S["NOTEST_CFLAGS"]="" +S["NOTEST_CPPFLAGS"]="-DAP_HAVE_DESIGNATED_INITIALIZER" +S["INCLUDES"]="" +S["UTIL_LDFLAGS"]="" +S["HTTPD_LDFLAGS"]="" +S["SH_LDFLAGS"]="" +S["LT_LDFLAGS"]="-export-dynamic" +S["LTFLAGS"]="--silent" +S["CXXFLAGS"]="" +S["CXX"]="" +S["other_targets"]="" +S["proxycachedir"]="${localstatedir}/proxy" +S["runtimedir"]="${localstatedir}/logs" +S["installbuilddir"]="${datadir}/build" +S["iconsdir"]="${datadir}/icons" +S["errordir"]="${datadir}/error" +S["manualdir"]="${datadir}/manual" +S["htdocsdir"]="${datadir}/htdocs" +S["logfiledir"]="${localstatedir}/logs" +S["cgidir"]="${datadir}/cgi-bin" +S["abs_srcdir"]="/bottlenecks/rubbos/app/httpd-2.0.64" +S["EXTRA_INCLUDES"]=" -I/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include -I/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include -I/bottlenecks/rubbos/app"\ +"/httpd-2.0.64/srclib/apr-util/xml/expat/lib -I. -I$(top_srcdir)/os/$(OS_DIR) -I$(top_srcdir)/server/mpm/$(MPM_SUBDIR_NAME) -I$(top_srcdir)/modules/h"\ +"ttp -I$(top_srcdir)/modules/filters -I$(top_srcdir)/modules/proxy -I$(top_srcdir)/include -I$(top_srcdir)/modules/generators -I$(top_srcdir)/modules"\ +"/dav/main" +S["EXTRA_LIBS"]="" +S["EXTRA_LDFLAGS"]=" -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib" +S["EXTRA_CXXFLAGS"]="" +S["EXTRA_CFLAGS"]=" -g -O2 -pthread" +S["EXTRA_CPPFLAGS"]=" -D_REENTRANT -D_GNU_SOURCE" +S["AP_SIG_GRACEFUL_SHORT"]="USR1" +S["AP_SIG_GRACEFUL_STRING"]="" +S["AP_SIG_GRACEFUL"]="SIGUSR1" +S["AP_CLEAN_SRCLIB_DIRS"]="apr-util apr" +S["AP_BUILD_SRCLIB_DIRS"]="apr apr-util" +S["AP_LIBS"]="/bottlenecks/rubbos/app/httpd-2.0.64/srclib/pcre/libpcre.la /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/libaprutil-0.la /bottlenecks/rubb"\ +"os/app/httpd-2.0.64/srclib/apr-util/xml/expat/libexpat.la /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/libapr-0.la -lrt -lm -lcrypt -lnsl -lpth"\ +"read -ldl" +S["shared_build"]="" +S["POST_SHARED_CMDS"]="echo \"\"" +S["PRE_SHARED_CMDS"]="echo \"\"" +S["OS_SPECIFIC_VARS"]="" +S["SHLIBPATH_VAR"]="LD_LIBRARY_PATH" +S["BUILTIN_LIBS"]=" modules/aaa/mod_access.la modules/aaa/mod_auth.la modules/filters/mod_include.la modules/loggers/mod_log_config.la modules/metadata/mod_env.la modu"\ +"les/metadata/mod_setenvif.la modules/http/mod_http.la modules/http/mod_mime.la modules/generators/mod_status.la modules/generators/mod_autoindex.la "\ +"modules/generators/mod_asis.la modules/generators/mod_cgid.la modules/mappers/mod_negotiation.la modules/mappers/mod_dir.la modules/mappers/mod_imap"\ +".la modules/mappers/mod_actions.la modules/mappers/mod_userdir.la modules/mappers/mod_alias.la modules/mappers/mod_so.la" +S["OS_DIR"]="unix" +S["OS"]="unix" +S["MPM_LIB"]="server/mpm/worker/libworker.la" +S["progname"]="httpd" +S["MOD_SO_LDADD"]="" +S["MOD_REWRITE_LDADD"]="" +S["MOD_ALIAS_LDADD"]="" +S["MOD_USERDIR_LDADD"]="" +S["MOD_SPELING_LDADD"]="" +S["MOD_ACTIONS_LDADD"]="" +S["MOD_IMAP_LDADD"]="" +S["MOD_DIR_LDADD"]="" +S["MOD_NEGOTIATION_LDADD"]="" +S["MOD_VHOST_ALIAS_LDADD"]="" +S["MOD_DAV_FS_LDADD"]="" +S["MOD_CGI_LDADD"]="" +S["MOD_CGID_LDADD"]="" +S["MOD_SUEXEC_LDADD"]="" +S["MOD_INFO_LDADD"]="" +S["MOD_ASIS_LDADD"]="" +S["MOD_AUTOINDEX_LDADD"]="" +S["MOD_STATUS_LDADD"]="" +S["MOD_DAV_LDADD"]="" +S["MOD_MIME_LDADD"]="" +S["MOD_HTTP_LDADD"]="" +S["APACHECTL_ULIMIT"]="ulimit -S -n `ulimit -H -n`" +S["checkgid_LTFLAGS"]="" +S["ab_LTFLAGS"]="" +S["htdbm_LTFLAGS"]="" +S["logresolve_LTFLAGS"]="" +S["rotatelogs_LTFLAGS"]="" +S["htdigest_LTFLAGS"]="" +S["htpasswd_LTFLAGS"]="" +S["MPM_SUBDIR_NAME"]="worker" +S["MPM_NAME"]="worker" +S["MOD_BUCKETEER_LDADD"]="" +S["MOD_OPTIONAL_FN_EXPORT_LDADD"]="" +S["MOD_OPTIONAL_FN_IMPORT_LDADD"]="" +S["MOD_OPTIONAL_HOOK_IMPORT_LDADD"]="" +S["MOD_OPTIONAL_HOOK_EXPORT_LDADD"]="" +S["MOD_SSL_LDADD"]="" +S["SSL_LIBS"]="" +S["MOD_PROXY_HTTP_LDADD"]="" +S["MOD_PROXY_FTP_LDADD"]="" +S["MOD_PROXY_CONNECT_LDADD"]="" +S["MOD_PROXY_LDADD"]="" +S["MOD_VERSION_LDADD"]="" +S["MOD_SETENVIF_LDADD"]="" +S["MOD_UNIQUE_ID_LDADD"]="" +S["MOD_USERTRACK_LDADD"]="" +S["MOD_HEADERS_LDADD"]="" +S["MOD_EXPIRES_LDADD"]="" +S["MOD_CERN_META_LDADD"]="" +S["MOD_MIME_MAGIC_LDADD"]="" +S["MOD_ENV_LDADD"]="" +S["MOD_LOGIO_LDADD"]="" +S["MOD_LOG_FORENSIC_LDADD"]="" +S["MOD_LOG_CONFIG_LDADD"]="" +S["MOD_DEFLATE_LDADD"]="" +S["MOD_INCLUDE_LDADD"]="" +S["MOD_EXT_FILTER_LDADD"]="" +S["MOD_AUTH_LDAP_LDADD"]="" +S["MOD_LDAP_LDADD"]="" +S["MOD_DUMPIO_LDADD"]="" +S["MOD_CASE_FILTER_IN_LDADD"]="" +S["MOD_CASE_FILTER_LDADD"]="" +S["MOD_EXAMPLE_LDADD"]="" +S["MOD_MEM_CACHE_LDADD"]="" +S["MOD_DISK_CACHE_LDADD"]="" +S["MOD_CACHE_LDADD"]="" +S["MOD_CHARSET_LITE_LDADD"]="" +S["MOD_ECHO_LDADD"]="" +S["MOD_FILE_CACHE_LDADD"]="" +S["MOD_ISAPI_LDADD"]="" +S["MOD_AUTH_DIGEST_LDADD"]="" +S["MOD_AUTH_DBM_LDADD"]="" +S["MOD_AUTH_ANON_LDADD"]="" +S["MOD_AUTH_LDADD"]="" +S["MOD_ACCESS_LDADD"]="" +S["EGREP"]="/bin/grep -E" +S["GREP"]="/bin/grep" +S["RANLIB"]="ranlib" +S["LN_S"]="ln -s" +S["INSTALL_DATA"]="${INSTALL} -m 644" +S["INSTALL_SCRIPT"]="${INSTALL}" +S["INSTALL_PROGRAM"]="${INSTALL}" +S["AWK"]="gawk" +S["RM"]="/bin/rm" +S["LTCFLAGS"]="-prefer-non-pic -static" +S["SHLTCFLAGS"]="-prefer-pic" +S["CPP"]="gcc -E" +S["OBJEXT"]="o" +S["EXEEXT"]="" +S["ac_ct_CC"]="gcc" +S["CPPFLAGS"]="" +S["LDFLAGS"]="" +S["CFLAGS"]="" +S["CC"]="gcc" +S["target_os"]="linux-gnu" +S["target_vendor"]="unknown" +S["target_cpu"]="x86_64" +S["target"]="x86_64-unknown-linux-gnu" +S["host_os"]="linux-gnu" +S["host_vendor"]="unknown" +S["host_cpu"]="x86_64" +S["host"]="x86_64-unknown-linux-gnu" +S["build_os"]="linux-gnu" +S["build_vendor"]="unknown" +S["build_cpu"]="x86_64" +S["build"]="x86_64-unknown-linux-gnu" +S["rel_proxycachedir"]="proxy" +S["exp_proxycachedir"]="/bottlenecks/rubbos/app/apache2/proxy" +S["rel_logfiledir"]="logs" +S["exp_logfiledir"]="/bottlenecks/rubbos/app/apache2/logs" +S["rel_runtimedir"]="logs" +S["exp_runtimedir"]="/bottlenecks/rubbos/app/apache2/logs" +S["rel_localstatedir"]="" +S["exp_localstatedir"]="/bottlenecks/rubbos/app/apache2" +S["rel_includedir"]="include" +S["exp_includedir"]="/bottlenecks/rubbos/app/apache2/include" +S["rel_cgidir"]="cgi-bin" +S["exp_cgidir"]="/bottlenecks/rubbos/app/apache2/cgi-bin" +S["rel_manualdir"]="manual" +S["exp_manualdir"]="/bottlenecks/rubbos/app/apache2/manual" +S["rel_htdocsdir"]="htdocs" +S["exp_htdocsdir"]="/bottlenecks/rubbos/app/apache2/htdocs" +S["rel_iconsdir"]="icons" +S["exp_iconsdir"]="/bottlenecks/rubbos/app/apache2/icons" +S["rel_errordir"]="error" +S["exp_errordir"]="/bottlenecks/rubbos/app/apache2/error" +S["rel_installbuilddir"]="build" +S["exp_installbuilddir"]="/bottlenecks/rubbos/app/apache2/build" +S["rel_datadir"]="" +S["exp_datadir"]="/bottlenecks/rubbos/app/apache2" +S["rel_sysconfdir"]="conf" +S["exp_sysconfdir"]="/bottlenecks/rubbos/app/apache2/conf" +S["rel_mandir"]="man" +S["exp_mandir"]="/bottlenecks/rubbos/app/apache2/man" +S["rel_libexecdir"]="modules" +S["exp_libexecdir"]="/bottlenecks/rubbos/app/apache2/modules" +S["rel_libdir"]="lib" +S["exp_libdir"]="/bottlenecks/rubbos/app/apache2/lib" +S["rel_sbindir"]="bin" +S["exp_sbindir"]="/bottlenecks/rubbos/app/apache2/bin" +S["rel_bindir"]="bin" +S["exp_bindir"]="/bottlenecks/rubbos/app/apache2/bin" +S["rel_exec_prefix"]="" +S["exp_exec_prefix"]="/bottlenecks/rubbos/app/apache2" +S["target_alias"]="" +S["host_alias"]="" +S["build_alias"]="" +S["LIBS"]="" +S["ECHO_T"]="" +S["ECHO_N"]="-n" +S["ECHO_C"]="" +S["DEFS"]="-DHAVE_CONFIG_H" +S["mandir"]="${prefix}/man" +S["localedir"]="${datarootdir}/locale" +S["libdir"]="${exec_prefix}/lib" +S["psdir"]="${docdir}" +S["pdfdir"]="${docdir}" +S["dvidir"]="${docdir}" +S["htmldir"]="${docdir}" +S["infodir"]="${datarootdir}/info" +S["docdir"]="${datarootdir}/doc/${PACKAGE}" +S["oldincludedir"]="/usr/include" +S["includedir"]="${prefix}/include" +S["localstatedir"]="${prefix}" +S["sharedstatedir"]="${prefix}/com" +S["sysconfdir"]="${prefix}/conf" +S["datadir"]="${prefix}" +S["datarootdir"]="${prefix}/share" +S["libexecdir"]="${exec_prefix}/modules" +S["sbindir"]="${exec_prefix}/bin" +S["bindir"]="${exec_prefix}/bin" +S["program_transform_name"]="s,x,x," +S["prefix"]="/bottlenecks/rubbos/app/apache2" +S["exec_prefix"]="${prefix}" +S["PACKAGE_BUGREPORT"]="" +S["PACKAGE_STRING"]="" +S["PACKAGE_VERSION"]="" +S["PACKAGE_TARNAME"]="" +S["PACKAGE_NAME"]="" +S["PATH_SEPARATOR"]=":" +S["SHELL"]="/bin/bash" +_ACAWK +cat >>"$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 +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 < "$tmp/subs1.awk" > "$tmp/subs.awk" \ + || { { $as_echo "$as_me:$LINENO: error: could not setup config files machinery" >&5 +$as_echo "$as_me: error: could not setup config files machinery" >&2;} + { (exit 1); exit 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 >"$tmp/defines.awk" <<\_ACAWK || +BEGIN { +D["PACKAGE_NAME"]=" \"\"" +D["PACKAGE_TARNAME"]=" \"\"" +D["PACKAGE_VERSION"]=" \"\"" +D["PACKAGE_STRING"]=" \"\"" +D["PACKAGE_BUGREPORT"]=" \"\"" +D["STDC_HEADERS"]=" 1" +D["HAVE_SYS_TYPES_H"]=" 1" +D["HAVE_SYS_STAT_H"]=" 1" +D["HAVE_STDLIB_H"]=" 1" +D["HAVE_STRING_H"]=" 1" +D["HAVE_MEMORY_H"]=" 1" +D["HAVE_STRINGS_H"]=" 1" +D["HAVE_INTTYPES_H"]=" 1" +D["HAVE_STDINT_H"]=" 1" +D["HAVE_UNISTD_H"]=" 1" +D["__EXTENSIONS__"]=" 1" +D["_ALL_SOURCE"]=" 1" +D["_GNU_SOURCE"]=" 1" +D["_POSIX_PTHREAD_SEMANTICS"]=" 1" +D["_TANDEM_SOURCE"]=" 1" +D["STDC_HEADERS"]=" 1" +D["HAVE_STRING_H"]=" 1" +D["HAVE_LIMITS_H"]=" 1" +D["HAVE_UNISTD_H"]=" 1" +D["HAVE_SYS_SOCKET_H"]=" 1" +D["HAVE_PWD_H"]=" 1" +D["HAVE_GRP_H"]=" 1" +D["HAVE_STRINGS_H"]=" 1" +D["HAVE_SYS_PRCTL_H"]=" 1" +D["HAVE_SYS_SEM_H"]=" 1" +D["HAVE_SYS_WAIT_H"]=" 1" +D["HAVE_GETPWNAM"]=" 1" +D["HAVE_GETGRNAM"]=" 1" +D["HAVE_INITGROUPS"]=" 1" +D["HAVE_PRCTL"]=" 1" +D["HAVE_TIMEGM"]=" 1" +D["HAVE_GMTOFF"]=" 1" +D["AP_ENABLE_V4_MAPPED"]=" 1" +D["HAVE_SYS_TIME_H"]=" 1" +D["HAVE_SYS_RESOURCE_H"]=" 1" +D["HAVE_SYS_SEM_H"]=" 1" +D["HAVE_SYS_IPC_H"]=" 1" +D["HAVE_SETSID"]=" 1" +D["HAVE_KILLPG"]=" 1" +D["HAVE_UNISTD_H"]=" 1" +D["HAVE_SYSLOG"]=" 1" +D["HAVE_SYS_TIMES_H"]=" 1" +D["HAVE_TIMES"]=" 1" +D["HAVE_PTHREAD_KILL"]=" 1" +D["AP_USING_AUTOCONF"]=" 1" +D["AP_NONBLOCK_WHEN_MULTI_LISTEN"]=" 1" +D["AP_SIG_GRACEFUL"]=" SIGUSR1" +D["AP_SIG_GRACEFUL_STRING"]=" \"SIGUSR1\"" +D["AP_SIG_GRACEFUL_SHORT"]=" USR1" +D["HTTPD_ROOT"]=" \"/bottlenecks/rubbos/app/apache2\"" +D["SERVER_CONFIG_FILE"]=" \"conf/httpd.conf\"" +D["AP_TYPES_CONFIG_FILE"]=" \"conf/mime.types\"" +D["APACHE_MPM_DIR"]=" \"server/mpm/worker\"" + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+[_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ][_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789]*([\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 + { { $as_echo "$as_me:$LINENO: error: could not setup config headers machinery" >&5 +$as_echo "$as_me: error: could not setup config headers machinery" >&2;} + { (exit 1); exit 1; }; } +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_echo "$as_me:$LINENO: error: invalid tag $ac_tag" >&5 +$as_echo "$as_me: error: invalid tag $ac_tag" >&2;} + { (exit 1); exit 1; }; };; + :[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="$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_echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 +$as_echo "$as_me: error: cannot find input file: $ac_f" >&2;} + { (exit 1); exit 1; }; };; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + ac_file_inputs="$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 '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:$LINENO: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$tmp/stdin" \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } ;; + 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 || +$as_echo 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" + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$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 || +$as_echo 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_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 +$as_echo "$as_me: error: cannot create directory $as_dir" >&2;} + { (exit 1); exit 1; }; }; } + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$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 + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac +# 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@*) + { $as_echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} + ac_datarootdir_hack=' + s&@datadir@&${prefix}&g + s&@docdir@&${datarootdir}/doc/${PACKAGE}&g + s&@infodir@&${datarootdir}/info&g + s&@localedir@&${datarootdir}/locale&g + s&@mandir@&${prefix}/man&g + s&\${datarootdir}&${prefix}/share&g' ;; +esac +ac_sed_extra="/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/ +s/:*\${srcdir}:*/:/ +s/:*@srcdir@:*/:/ +s/^\([^=]*=[ ]*\):*/\1/ +s/:*$// +s/^[^=]*=[ ]*$// +} + +: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 +s&@INSTALL@&$ac_INSTALL&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&5 +$as_echo "$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 "$tmp/stdin" + case $ac_file in + -) cat "$tmp/out" && rm -f "$tmp/out";; + *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; + esac \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" + } >"$tmp/config.h" \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:$LINENO: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$tmp/config.h" "$ac_file" \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ + || { { $as_echo "$as_me:$LINENO: error: could not create -" >&5 +$as_echo "$as_me: error: could not create -" >&2;} + { (exit 1); exit 1; }; } + fi + ;; + + :C) { $as_echo "$as_me:$LINENO: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "default":C) true ;; + + esac +done # for ac_tag + + +{ (exit 0); exit 0; } diff --git a/rubbos/app/httpd-2.0.64/configure b/rubbos/app/httpd-2.0.64/configure new file mode 100755 index 00000000..8e27feb5 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/configure @@ -0,0 +1,20186 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.63. +# +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +# 2002, 2003, 2004, 2005, 2006, 2007, 2008 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 -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 + + + + +# PATH needs CR +# 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_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +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 + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + 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 + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + { (exit 1); exit 1; } +fi + +# Work around bugs in pre-3.0 UWIN ksh. +for as_var in ENV MAIL MAILPATH +do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# Required to use basename. +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 + + +# Name of the executable. +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# CDPATH. +$as_unset CDPATH + + +if test "x$CONFIG_SHELL" = x; then + if (eval ":") 2>/dev/null; then + as_have_required=yes +else + as_have_required=no +fi + + if test $as_have_required = yes && (eval ": +(as_func_return () { + (exit \$1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = \"\$1\" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test \$exitcode = 0) || { (exit 1); exit 1; } + +( + as_lineno_1=\$LINENO + as_lineno_2=\$LINENO + test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && + test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } +") 2> /dev/null; then + : +else + as_candidate_shells= + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + case $as_dir in + /*) + for as_base in sh bash ksh sh5; do + as_candidate_shells="$as_candidate_shells $as_dir/$as_base" + done;; + esac +done +IFS=$as_save_IFS + + + for as_shell in $as_candidate_shells $SHELL; do + # Try only shells that exist, to save several forks. + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { ("$as_shell") 2> /dev/null <<\_ASEOF +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 + + +: +_ASEOF +}; then + CONFIG_SHELL=$as_shell + as_have_required=yes + if { "$as_shell" 2> /dev/null <<\_ASEOF +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 + + +: +(as_func_return () { + (exit $1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = "$1" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test $exitcode = 0) || { (exit 1); exit 1; } + +( + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } + +_ASEOF +}; then + break +fi + +fi + + done + + if test "x$CONFIG_SHELL" != x; then + for as_var in BASH_ENV ENV + do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var + done + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} +fi + + + if test $as_have_required = no; then + echo This script requires a shell more modern than all the + echo shells that I found on your system. Please install a + echo modern shell, or manually run the script under such a + echo shell if you do have one. + { (exit 1); exit 1; } +fi + + +fi + +fi + + + +(eval "as_func_return () { + (exit \$1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = \"\$1\" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test \$exitcode = 0") || { + echo No shell found that supports shell functions. + echo Please tell bug-autoconf@gnu.org about your system, + echo including any error possibly output before this message. + echo This can help us improve future autoconf versions. + echo Configuration will now proceed without shell functions. +} + + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line after each line using $LINENO; the second 'sed' + # does the real work. The second script uses 'N' to pair each + # line-number line with the line containing $LINENO, and appends + # trailing '-' during substitution so that $LINENO is not a special + # case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # scripts with optimization help from Paolo Bonzini. Blame Lee + # E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + 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" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); exit 1; }; } + + # 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 +} + + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in +-n*) + case `echo 'x\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + *) ECHO_C='\c';; + esac;; +*) + ECHO_N='-n';; +esac +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +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 -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +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=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + + +exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, 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= +SHELL=${CONFIG_SHELL-/bin/sh} + +# Identity of this package. +PACKAGE_NAME= +PACKAGE_TARNAME= +PACKAGE_VERSION= +PACKAGE_STRING= +PACKAGE_BUGREPORT= + +ac_unique_file="ABOUT_APACHE" +ac_default_prefix=/usr/local/apache2 +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='LTLIBOBJS +LIBOBJS +HTTPD_VERSION +ap_make_delimiter +ap_make_include +perlbin +APU_INCLUDEDIR +APU_BINDIR +APR_INCLUDEDIR +APR_BINDIR +DSO_MODULES +INSTALL_PROG_FLAGS +MK_IMPLIB +SH_LIBTOOL +SH_LIBS +CORE_IMPLIB +CORE_IMPLIB_FILE +nonssl_listen_stmt_2 +nonssl_listen_stmt_1 +PORT +MODULE_CLEANDIRS +MODULE_DIRS +LIBTOOL +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 +EXTRA_INCLUDES +EXTRA_LIBS +EXTRA_LDFLAGS +EXTRA_CXXFLAGS +EXTRA_CFLAGS +EXTRA_CPPFLAGS +AP_SIG_GRACEFUL_SHORT +AP_SIG_GRACEFUL_STRING +AP_SIG_GRACEFUL +AP_CLEAN_SRCLIB_DIRS +AP_BUILD_SRCLIB_DIRS +AP_LIBS +shared_build +POST_SHARED_CMDS +PRE_SHARED_CMDS +OS_SPECIFIC_VARS +SHLIBPATH_VAR +BUILTIN_LIBS +OS_DIR +OS +MPM_LIB +progname +MOD_SO_LDADD +MOD_REWRITE_LDADD +MOD_ALIAS_LDADD +MOD_USERDIR_LDADD +MOD_SPELING_LDADD +MOD_ACTIONS_LDADD +MOD_IMAP_LDADD +MOD_DIR_LDADD +MOD_NEGOTIATION_LDADD +MOD_VHOST_ALIAS_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_MIME_LDADD +MOD_HTTP_LDADD +APACHECTL_ULIMIT +checkgid_LTFLAGS +ab_LTFLAGS +htdbm_LTFLAGS +logresolve_LTFLAGS +rotatelogs_LTFLAGS +htdigest_LTFLAGS +htpasswd_LTFLAGS +MPM_SUBDIR_NAME +MPM_NAME +MOD_BUCKETEER_LDADD +MOD_OPTIONAL_FN_EXPORT_LDADD +MOD_OPTIONAL_FN_IMPORT_LDADD +MOD_OPTIONAL_HOOK_IMPORT_LDADD +MOD_OPTIONAL_HOOK_EXPORT_LDADD +MOD_SSL_LDADD +SSL_LIBS +MOD_PROXY_HTTP_LDADD +MOD_PROXY_FTP_LDADD +MOD_PROXY_CONNECT_LDADD +MOD_PROXY_LDADD +MOD_VERSION_LDADD +MOD_SETENVIF_LDADD +MOD_UNIQUE_ID_LDADD +MOD_USERTRACK_LDADD +MOD_HEADERS_LDADD +MOD_EXPIRES_LDADD +MOD_CERN_META_LDADD +MOD_MIME_MAGIC_LDADD +MOD_ENV_LDADD +MOD_LOGIO_LDADD +MOD_LOG_FORENSIC_LDADD +MOD_LOG_CONFIG_LDADD +MOD_DEFLATE_LDADD +MOD_INCLUDE_LDADD +MOD_EXT_FILTER_LDADD +MOD_AUTH_LDAP_LDADD +MOD_LDAP_LDADD +MOD_DUMPIO_LDADD +MOD_CASE_FILTER_IN_LDADD +MOD_CASE_FILTER_LDADD +MOD_EXAMPLE_LDADD +MOD_MEM_CACHE_LDADD +MOD_DISK_CACHE_LDADD +MOD_CACHE_LDADD +MOD_CHARSET_LITE_LDADD +MOD_ECHO_LDADD +MOD_FILE_CACHE_LDADD +MOD_ISAPI_LDADD +MOD_AUTH_DIGEST_LDADD +MOD_AUTH_DBM_LDADD +MOD_AUTH_ANON_LDADD +MOD_AUTH_LDADD +MOD_ACCESS_LDADD +EGREP +GREP +RANLIB +LN_S +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +AWK +RM +LTCFLAGS +SHLTCFLAGS +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 +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 +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +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_apr +with_apr_util +with_port +enable_v4_mapped +enable_exception_hook +enable_maintainer_mode +enable_modules +enable_mods_shared +enable_access +enable_auth +enable_auth_anon +enable_auth_dbm +enable_auth_digest +enable_isapi +enable_file_cache +enable_echo +enable_charset_lite +enable_cache +enable_disk_cache +enable_mem_cache +enable_example +enable_case_filter +enable_case_filter_in +enable_dumpio +enable_ldap +enable_auth_ldap +enable_ext_filter +enable_include +enable_deflate +with_z +enable_log_config +enable_log_forensic +enable_logio +enable_env +enable_mime_magic +enable_cern_meta +enable_expires +enable_headers +enable_usertrack +enable_unique_id +enable_setenvif +enable_version +enable_proxy +enable_proxy_connect +enable_proxy_ftp +enable_proxy_http +enable_ssl +with_ssl +enable_optional_hook_export +enable_optional_hook_import +enable_optional_fn_import +enable_optional_fn_export +enable_bucketeer +with_mpm +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_http +enable_mime +with_module +enable_dav +enable_status +enable_autoindex +enable_asis +enable_info +enable_suexec +enable_cgid +enable_cgi +enable_dav_fs +enable_vhost_alias +enable_negotiation +enable_dir +enable_imap +enable_actions +enable_speling +enable_userdir +enable_alias +enable_rewrite +enable_so +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_safepath +with_suexec_umask +' + 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' +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=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + 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_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 + { (exit 1); exit 1; }; } + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$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_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 + { (exit 1); exit 1; }; } + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$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 ;; + + -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_echo "$as_me: error: invalid package name: $ac_useropt" >&2 + { (exit 1); exit 1; }; } + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$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_echo "$as_me: error: invalid package name: $ac_useropt" >&2 + { (exit 1); exit 1; }; } + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$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_echo "$as_me: error: unrecognized option: $ac_option +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && + { $as_echo "$as_me: error: invalid variable name: $ac_envvar" >&2 + { (exit 1); exit 1; }; } + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$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_echo "$as_me: error: missing argument to $ac_option" >&2 + { (exit 1); exit 1; }; } +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) { $as_echo "$as_me: error: unrecognized options: $ac_unrecognized_opts" >&2 + { (exit 1); exit 1; }; } ;; + *) $as_echo "$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 +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_echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; } +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 + $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used." >&2 + 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_echo "$as_me: error: working directory cannot be determined" >&2 + { (exit 1); exit 1; }; } +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + { $as_echo "$as_me: error: pwd does not report name of working directory" >&2 + { (exit 1); exit 1; }; } + + +# 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 || +$as_echo 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_echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 + { (exit 1); exit 1; }; } +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || { $as_echo "$as_me: error: $ac_msg" >&2 + { (exit 1); exit 1; }; } + 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] + --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-v4-mapped Allow IPv6 sockets to handle IPv4 connections + --enable-exception-hook Enable fatal exception hook + --enable-maintainer-mode + Turn on debugging and compile time warnings + --enable-modules=MODULE-LIST + Modules to enable + --enable-mods-shared=MODULE-LIST + Shared modules to enable + --disable-access host-based access control + --disable-auth user-based access control + --enable-auth-anon anonymous user access + --enable-auth-dbm DBM-based access databases + --enable-auth-digest RFC2617 Digest authentication + --enable-isapi isapi extension support + --enable-file-cache File cache + --enable-echo ECHO server + --disable-charset-lite character set translation + --enable-charset-lite character set translation + --enable-cache dynamic file caching + --enable-disk-cache disk caching module + --enable-mem-cache memory caching module + --enable-example example and demo module + --enable-case-filter example uppercase conversion filter + --enable-case-filter-in example uppercase conversion input filter + --enable-dumpio I/O dump filter + --enable-ldap LDAP caching and connection pooling services + --enable-auth-ldap LDAP based authentication + --enable-ext-filter external filter module + --disable-include Server Side Includes + --enable-deflate Deflate transfer encoding support + --disable-log-config logging configuration + --enable-log-forensic forensic logging + --enable-logio input and output logging + --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 + --enable-headers HTTP header control + --enable-usertrack user-session tracking + --enable-unique-id per-request unique ids + --disable-setenvif basing ENV vars on headers + --enable-version determining httpd version in config files + --enable-proxy Apache proxy module + --enable-proxy-connect Apache proxy CONNECT module + --enable-proxy-ftp Apache proxy FTP module + --enable-proxy-http Apache proxy HTTP module + --enable-ssl SSL/TLS support (mod_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-bucketeer buckets manipulation filter + --enable-static-support Build a statically linked version 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-http HTTP protocol handling + --disable-mime mapping of file-extension to MIME + --enable-dav WebDAV protocol handling + --disable-status process/thread monitoring + --disable-autoindex directory listing + --disable-asis as-is filetypes + --enable-info server information + --enable-suexec set uid and gid for spawned processes + --disable-cgid CGI scripts + --enable-cgi CGI scripts + --disable-cgi CGI scripts + --enable-cgid CGI scripts + --enable-dav-fs DAV provider for the filesystem + --enable-vhost-alias mass virtual hosting module + --disable-negotiation content negotiation + --disable-dir directory request handling + --disable-imap server-side imagemaps + --disable-actions Action triggering on requests + --enable-speling correct common URL misspellings + --disable-userdir mapping of requests to user-specific directories + --disable-alias mapping of requests to different filesystem parts + --enable-rewrite rule based URL manipulation + --enable-so DSO capability + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-apr=DIR|FILE prefix for installed APR, path to APR build tree, + or the full path to apr-config + --with-apr-util=DIR prefix for installed APU, or path to APU build tree + --with-port=PORT Port on which to listen (default is 80) + --with-z=DIR use a specific zlib library + --with-ssl=DIR SSL/TLS toolkit (OpenSSL) + --with-mpm=MPM Choose the process model for Apache to use. + MPM={beos|worker|prefork|mpmt_os2|perchild|leader|threadpool} + --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-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 C/C++/Objective 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. + +_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=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$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 guested configure. + 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 + $as_echo "$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.63 + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006, 2007, 2008 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 +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.63. Invocation command line was + + $ $0 $@ + +_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 + test -z "$as_dir" && as_dir=. + $as_echo "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=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; + 2) + ac_configure_args1="$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 + ac_configure_args="$ac_configure_args '$ac_arg'" + ;; + esac + done +done +$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } +$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export 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=$? + # Save into config.log some information that might help in debugging. + { + echo + + cat <<\_ASBOX +## ---------------- ## +## Cache variables. ## +## ---------------- ## +_ASBOX + 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_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$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= ;; #( + *) $as_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 + + cat <<\_ASBOX +## ----------------- ## +## Output variables. ## +## ----------------- ## +_ASBOX + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + cat <<\_ASBOX +## ------------------- ## +## File substitutions. ## +## ------------------- ## +_ASBOX + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + cat <<\_ASBOX +## ----------- ## +## confdefs.h. ## +## ----------- ## +_ASBOX + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$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'; { (exit 1); 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 + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + ac_site_file1=$CONFIG_SITE +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test -r "$ac_site_file"; then + { $as_echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" + 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. + if test -f "$cache_file"; then + { $as_echo "$as_me:$LINENO: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:$LINENO: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +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,) + { $as_echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$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 + { $as_echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:$LINENO: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:$LINENO: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:$LINENO: current value: \`$ac_new_val'" >&5 +$as_echo "$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=`$as_echo "$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. + *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + { { $as_echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 +$as_echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} + { (exit 1); exit 1; }; } +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_config_headers="$ac_config_headers include/ap_config_auto.h" + +ac_aux_dir= +for ac_dir in build "$srcdir"/build; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + { { $as_echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in build \"$srcdir\"/build" >&5 +$as_echo "$as_me: error: cannot find install-sh or install.sh in build \"$srcdir\"/build" >&2;} + { (exit 1); exit 1; }; } +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. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# Check whether --enable-layout was given. +if test "${enable_layout+set}" = set; 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 + pldconf=./config.pld + + sed -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 + . $pldconf + rm $pldconf + for var in prefix exec_prefix bindir sbindir libexecdir mandir \ + sysconfdir datadir errordir iconsdir htdocsdir cgidir \ + includedir localstatedir runtimedir logfiledir libdir \ + manualdir proxycachedir installbuilddir; 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 + + + +{ $as_echo "$as_me:$LINENO: checking for chosen layout" >&5 +$as_echo_n "checking for chosen layout... " >&6; } +{ $as_echo "$as_me:$LINENO: result: $layout_name" >&5 +$as_echo "$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_echo "$as_me:$LINENO: error: expected an absolute path for --$ac_var: $ac_val" >&5 +$as_echo "$as_me: error: expected an absolute path for --$ac_var: $ac_val" >&2;} + { (exit 1); exit 1; }; };; + 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 "$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=' +' + + { $as_echo "$as_me:$LINENO: checking for working mkdir -p" >&5 +$as_echo_n "checking for working mkdir -p... " >&6; } +if test "${ac_cv_mkdir_p+set}" = set; then + $as_echo_n "(cached) " >&6 +else + + 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 + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_mkdir_p" >&5 +$as_echo "$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 + + + + +# Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + { { $as_echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5 +$as_echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;} + { (exit 1); exit 1; }; } + +{ $as_echo "$as_me:$LINENO: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } +if test "${ac_cv_build+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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_echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 +$as_echo "$as_me: error: cannot guess build type; you must specify one" >&2;} + { (exit 1); exit 1; }; } +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + { { $as_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5 +$as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;} + { (exit 1); exit 1; }; } + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical build" >&5 +$as_echo "$as_me: error: invalid value of canonical build" >&2;} + { (exit 1); exit 1; }; };; +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 + + +{ $as_echo "$as_me:$LINENO: checking host system type" >&5 +$as_echo_n "checking host system type... " >&6; } +if test "${ac_cv_host+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5 +$as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;} + { (exit 1); exit 1; }; } +fi + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical host" >&5 +$as_echo "$as_me: error: invalid value of canonical host" >&2;} + { (exit 1); exit 1; }; };; +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 + + +{ $as_echo "$as_me:$LINENO: checking target system type" >&5 +$as_echo_n "checking target system type... " >&6; } +if test "${ac_cv_target+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $target_alias failed" >&5 +$as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $target_alias failed" >&2;} + { (exit 1); exit 1; }; } +fi + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_target" >&5 +$as_echo "$ac_cv_target" >&6; } +case $ac_cv_target in +*-*-*) ;; +*) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical target" >&5 +$as_echo "$as_me: error: invalid value of canonical target" >&2;} + { (exit 1); exit 1; }; };; +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" + +echo $ac_n "${nl}Configuring Apache Portable Runtime library ...${nl}" + + + apr_found="no" + + if test "$ac_cv_emxos2" = "yes"; then + # Scripts don't pass test -x on OS/2 + TEST_X="test -f" + else + TEST_X="test -x" + fi + + { $as_echo "$as_me:$LINENO: checking for APR" >&5 +$as_echo_n "checking for APR... " >&6; } + +# Check whether --with-apr was given. +if test "${with_apr+set}" = set; then + withval=$with_apr; + if test "$withval" = "no" || test "$withval" = "yes"; then + { { $as_echo "$as_me:$LINENO: error: --with-apr requires a directory to be provided" >&5 +$as_echo "$as_me: error: --with-apr requires a directory to be provided" >&2;} + { (exit 1); exit 1; }; } + fi + + if $TEST_X "$withval/bin/apr-config"; then + apr_found="yes" + apr_config="$withval/bin/apr-config" + elif $TEST_X "$withval/apr-config"; then + apr_found="yes" + apr_config="$withval/apr-config" + elif $TEST_X "$withval" && $withval --help > /dev/null 2>&1 ; then + apr_found="yes" + apr_config="$withval" + fi + + if test "$apr_found" != "yes"; then + { { $as_echo "$as_me:$LINENO: error: the --with-apr parameter is incorrect. It must specify an install prefix, a +build directory, or an apr-config file." >&5 +$as_echo "$as_me: error: the --with-apr parameter is incorrect. It must specify an install prefix, a +build directory, or an apr-config file." >&2;} + { (exit 1); exit 1; }; } + fi + +else + + if test -d ""$srcdir/srclib/apr""; then + apr_temp_abs_srcdir="`cd "$srcdir/srclib/apr" && pwd`" + apr_found="reconfig" + if test -n ""./srclib/apr""; then + apr_config=""./srclib/apr"/apr-config" + else + apr_config=""$srcdir/srclib/apr"/apr-config" + fi + fi + if test "$apr_found" = "no" && test -n "1" && test "1" = "1"; then + if apr-config --help > /dev/null 2>&1 ; then + apr_found="yes" + apr_config="apr-config" + else + for lookdir in /usr /usr/local /opt/apr /usr/local/apache2 ; do + if $TEST_X "$lookdir/bin/apr-config"; then + apr_found="yes" + apr_config="$lookdir/bin/apr-config" + break + fi + done + fi + fi + +fi + + + { $as_echo "$as_me:$LINENO: result: $apr_found" >&5 +$as_echo "$apr_found" >&6; } + + +if test "$apr_found" = "no"; then + { { $as_echo "$as_me:$LINENO: error: APR not found. Please read the documentation." >&5 +$as_echo "$as_me: error: APR not found. Please read the documentation." >&2;} + { (exit 1); exit 1; }; } +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_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$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= ;; #( + *) $as_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+set}" = set || &/ + 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 + test "x$cache_file" != "x/dev/null" && + { $as_echo "$as_me:$LINENO: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + cat confcache >$cache_file + else + { $as_echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 +$as_echo "$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. + if test -f "$cache_file"; then + { $as_echo "$as_me:$LINENO: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:$LINENO: creating cache $cache_file" >&5 +$as_echo "$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" +fi + + + if test -z "$CC"; then + echo " setting CC to \"`$apr_config --cc`\"" + CC="`$apr_config --cc`" + fi + + + if test -z "$CPP"; then + echo " setting CPP to \"`$apr_config --cpp`\"" + CPP="`$apr_config --cpp`" + fi + + + if test "x$CFLAGS" = "x"; then + 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 + echo " adding \"$i\" to CFLAGS" + CFLAGS="$CFLAGS $i" + fi + done + fi + + + if test "x$CPPFLAGS" = "x"; then + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + + if test "x$LDFLAGS" = "x"; then + 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 + echo " adding \"$i\" to LDFLAGS" + LDFLAGS="$LDFLAGS $i" + fi + done + fi + + + if test "x$INCLUDES" = "x"; then + echo " setting INCLUDES to \"`$apr_config --includes`\"" + INCLUDES="`$apr_config --includes`" + else + apr_addto_bugger="`$apr_config --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 + echo " adding \"$i\" to INCLUDES" + INCLUDES="$INCLUDES $i" + fi + done + fi + +SHLIBPATH_VAR=`$apr_config --shlib-path-var` +APR_BINDIR=`$apr_config --bindir` +APR_INCLUDEDIR=`$apr_config --includedir` + +echo $ac_n "${nl}Configuring Apache Portable Runtime Utility library...${nl}" + + + apu_found="no" + + { $as_echo "$as_me:$LINENO: checking for APR-util" >&5 +$as_echo_n "checking for APR-util... " >&6; } + +# Check whether --with-apr-util was given. +if test "${with_apr_util+set}" = set; then + withval=$with_apr_util; + if test "$withval" = "no" || test "$withval" = "yes"; then + { { $as_echo "$as_me:$LINENO: error: --with-apr-util requires a directory to be provided" >&5 +$as_echo "$as_me: error: --with-apr-util requires a directory to be provided" >&2;} + { (exit 1); exit 1; }; } + fi + + if test -x "$withval/bin/apu-config"; then + apu_found="yes" + apu_config="$withval/bin/apu-config" + elif test -x "$withval/apu-config"; then + apu_found="yes" + apu_config="$withval/apu-config" + elif test -x "$withval" && $withval --help > /dev/null 2>&1 ; then + apu_found="yes" + apu_config="$withval" + fi + + if test "$apu_found" != "yes"; then + { { $as_echo "$as_me:$LINENO: error: +The directory given to --with-apr-util does not specify a prefix for an +installed APU, nor an APR-util build directory." >&5 +$as_echo "$as_me: error: +The directory given to --with-apr-util does not specify a prefix for an +installed APU, nor an APR-util build directory." >&2;} + { (exit 1); exit 1; }; } + fi + +else + + if test -d ""$srcdir/srclib/apr-util""; then + apu_found="reconfig" + if test -n ""./srclib/apr-util""; then + apu_config=""./srclib/apr-util"/apu-config" + else + apu_config=""$srcdir/srclib/apr-util"/apu-config" + fi + fi + if test "$apu_found" = "no" && test -n "1" && test "1" = "1"; then + if apu-config --help > /dev/null 2>&1 ; then + apu_found="yes" + apu_config="apu-config" + else + for lookdir in /usr /usr/local /opt/apr /usr/local/apache2 ; do + if test -x "$lookdir/bin/apu-config"; then + apu_found="yes" + apu_config="$lookdir/bin/apu-config" + break + fi + done + fi + fi + +fi + + + { $as_echo "$as_me:$LINENO: result: $apu_found" >&5 +$as_echo "$apu_found" >&6; } + + +if test "$apu_found" = "no"; then + { { $as_echo "$as_me:$LINENO: error: APR-util not found. Please read the documentation." >&5 +$as_echo "$as_me: error: APR-util not found. Please read the documentation." >&2;} + { (exit 1); exit 1; }; } +fi + +# Catch some misconfigurations: +case ${apr_found}.${apu_found} in +reconfig.yes) + { { $as_echo "$as_me:$LINENO: error: Cannot use an external APR-util with the bundled APR" >&5 +$as_echo "$as_me: error: Cannot use an external APR-util with the bundled APR" >&2;} + { (exit 1); exit 1; }; } + ;; +yes.reconfig) + { { $as_echo "$as_me:$LINENO: error: Cannot use an external APR with the bundled APR-util" >&5 +$as_echo "$as_me: error: Cannot use an external APR with the bundled APR-util" >&2;} + { (exit 1); exit 1; }; } + ;; +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_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$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= ;; #( + *) $as_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+set}" = set || &/ + 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 + test "x$cache_file" != "x/dev/null" && + { $as_echo "$as_me:$LINENO: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + cat confcache >$cache_file + else + { $as_echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 +$as_echo "$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. + if test -f "$cache_file"; then + { $as_echo "$as_me:$LINENO: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:$LINENO: creating cache $cache_file" >&5 +$as_echo "$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" +fi + + + if test "x$LDFLAGS" = "x"; then + 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 + echo " adding \"$i\" to LDFLAGS" + LDFLAGS="$LDFLAGS $i" + fi + done + fi + + + if test "x$INCLUDES" = "x"; then + echo " setting INCLUDES to \"`$apu_config --includes`\"" + INCLUDES="`$apu_config --includes`" + else + apr_addto_bugger="`$apu_config --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 + echo " adding \"$i\" to INCLUDES" + INCLUDES="$INCLUDES $i" + fi + done + fi + +APU_BINDIR=`$apu_config --bindir` +APU_INCLUDEDIR=`$apu_config --includedir` + +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 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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 + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:$LINENO: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "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 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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 + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$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 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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 + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:$LINENO: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "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 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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 + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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" + $as_echo "$as_me:$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 +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:$LINENO: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "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 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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 + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:$LINENO: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "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 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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 + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "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:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } + +# Provide some information about the compiler. +$as_echo "$as_me:$LINENO: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +{ (ac_try="$ac_compiler --version >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler --version >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -v >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -v >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -V >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -V >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + 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. +{ $as_echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +ac_link_default=`$as_echo "$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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; 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+set}" = set && 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 + ac_file='' +fi + +{ $as_echo "$as_me:$LINENO: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +if test -z "$ac_file"; then + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: C compiler cannot create executables +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: C compiler cannot create executables +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } +fi + +ac_exeext=$ac_cv_exeext + +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:$LINENO: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 +# If not cross compiling, check that we can run a simple program. +if test "$cross_compiling" != yes; then + if { ac_try='./$ac_file' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } + fi + fi +fi +{ $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +{ $as_echo "$as_me:$LINENO: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +{ $as_echo "$as_me:$LINENO: checking for suffix of executables" >&5 +$as_echo_n "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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; 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 + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } +fi + +rm -f conftest$ac_cv_exeext +{ $as_echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +{ $as_echo "$as_me:$LINENO: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if test "${ac_cv_objext+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; 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 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } +fi + +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if test "${ac_cv_c_compiler_gnu+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_compiler_gnu=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_compiler_gnu=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if test "${ac_cv_prog_cc_g+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_g=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + CFLAGS="" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_g=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if test "${ac_cv_prog_cc_c89+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + 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; +} + +/* 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 don't provoke an error unfortunately, instead are silently treated + as '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's necessary to write '\x00'==0 to get something + that's 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 **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_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" + rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_c89=$ac_arg +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:$LINENO: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:$LINENO: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac + + +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 +{ $as_echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 +$as_echo_n "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+set}" = set; then + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-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. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # 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 >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi + +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + # Broken: success on invalid input. +continue +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi + +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:$LINENO: result: $CPP" >&5 +$as_echo "$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. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # 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 >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi + +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + # Broken: success on invalid input. +continue +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi + +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + : +else + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } +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 + + +echo $ac_n "${nl}Configuring PCRE regular expression library ...${nl}" + + + # 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_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$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= ;; #( + *) $as_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+set}" = set || &/ + 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 + test "x$cache_file" != "x/dev/null" && + { $as_echo "$as_me:$LINENO: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + cat confcache >$cache_file + else + { $as_echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + + echo "configuring package in srclib/pcre now" + ac_popdir=`pwd` + apr_config_subdirs="srclib/pcre" + test -d srclib/pcre || $mkdir_p srclib/pcre + ac_abs_srcdir=`(cd $srcdir/srclib/pcre && pwd)` + cd srclib/pcre + + # 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=$ac_configure_args + + 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 --prefix=$prefix --exec-prefix=$exec_prefix --libdir=$libdir --includedir=$includedir --bindir=$bindir + then : + echo "srclib/pcre configured properly" + else + echo "configure failed for srclib/pcre" + 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. + if test -f "$cache_file"; then + { $as_echo "$as_me:$LINENO: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:$LINENO: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + + + +echo $ac_n "${nl}Configuring Apache httpd ...${nl}" + +abs_srcdir=`(cd $srcdir && pwd)` +abs_builddir=`pwd` + + + + if test "x$INCLUDES" = "x"; then + 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 + echo " adding \"$i\" to INCLUDES" + INCLUDES="$INCLUDES $i" + fi + done + fi + + +if test "$abs_builddir" != "$abs_srcdir"; then + USE_VPATH=1 + + if test "x$INCLUDES" = "x"; then + echo " setting INCLUDES to \"-I\$(srcdir) -I\$(top_builddir)/server/mpm/\$(MPM_SUBDIR_NAME) -I\$(top_builddir)/include\"" + INCLUDES="-I\$(srcdir) -I\$(top_builddir)/server/mpm/\$(MPM_SUBDIR_NAME) -I\$(top_builddir)/include" + else + apr_addto_bugger="-I\$(srcdir) -I\$(top_builddir)/server/mpm/\$(MPM_SUBDIR_NAME) -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 + echo " adding \"$i\" to INCLUDES" + INCLUDES="$INCLUDES $i" + fi + done + fi + +fi + + + if test "x$INCLUDES" = "x"; then + echo " setting INCLUDES to \"-I\$(top_srcdir)/os/\$(OS_DIR) -I\$(top_srcdir)/server/mpm/\$(MPM_SUBDIR_NAME) -I\$(top_srcdir)/modules/http -I\$(top_srcdir)/modules/filters -I\$(top_srcdir)/modules/proxy -I\$(top_srcdir)/include -I\$(top_srcdir)/modules/generators\"" + INCLUDES="-I\$(top_srcdir)/os/\$(OS_DIR) -I\$(top_srcdir)/server/mpm/\$(MPM_SUBDIR_NAME) -I\$(top_srcdir)/modules/http -I\$(top_srcdir)/modules/filters -I\$(top_srcdir)/modules/proxy -I\$(top_srcdir)/include -I\$(top_srcdir)/modules/generators" + else + apr_addto_bugger="-I\$(top_srcdir)/os/\$(OS_DIR) -I\$(top_srcdir)/server/mpm/\$(MPM_SUBDIR_NAME) -I\$(top_srcdir)/modules/http -I\$(top_srcdir)/modules/filters -I\$(top_srcdir)/modules/proxy -I\$(top_srcdir)/include -I\$(top_srcdir)/modules/generators" + 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 + echo " adding \"$i\" to INCLUDES" + INCLUDES="$INCLUDES $i" + fi + done + fi + + +echo $ac_n "${nl}Applying OS-specific hints for httpd ...${nl}" + +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]*) + 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" + + + +AP_SIG_GRACEFUL=USR1 + +case $host in + *-apple-aux3*) + + echo " forcing APACHE_MPM to \"prefork\"" + APACHE_MPM="prefork" + + + echo " forcing SINGLE_LISTEN_UNSERIALIZED_ACCEPT to \"1\"" + SINGLE_LISTEN_UNSERIALIZED_ACCEPT="1" + + ;; + *-beos*) + + echo " forcing APACHE_MPM to \"beos\"" + APACHE_MPM="beos" + + + echo " forcing SINGLE_LISTEN_UNSERIALIZED_ACCEPT to \"1\"" + SINGLE_LISTEN_UNSERIALIZED_ACCEPT="1" + + ;; + *os2_emx*) + + echo " forcing APACHE_MPM to \"mpmt_os2\"" + APACHE_MPM="mpmt_os2" + + + echo " forcing SINGLE_LISTEN_UNSERIALIZED_ACCEPT to \"1\"" + SINGLE_LISTEN_UNSERIALIZED_ACCEPT="1" + + ;; + *-linux-*) + case `uname -r` in + 2.0* ) + AP_SIG_GRACEFUL=WINCH + ;; + 2.[2-9]* ) + + echo " forcing SINGLE_LISTEN_UNSERIALIZED_ACCEPT to \"1\"" + SINGLE_LISTEN_UNSERIALIZED_ACCEPT="1" + + ;; + * ) + ;; + esac + ;; + *486-*-bsdi* | *-netbsd* | *-freebsd* | *-apple-darwin* | *-dec-osf* | *-qnx) + + 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*) + ;; + * ) + + echo " forcing SINGLE_LISTEN_UNSERIALIZED_ACCEPT to \"1\"" + SINGLE_LISTEN_UNSERIALIZED_ACCEPT="1" + + ;; + esac + ;; + *cygwin*) + + echo " forcing APACHE_MPM to \"prefork\"" + APACHE_MPM="prefork" + + + echo " forcing SINGLE_LISTEN_UNSERIALIZED_ACCEPT to \"1\"" + SINGLE_LISTEN_UNSERIALIZED_ACCEPT="1" + + ;; + *aix*) + aixver=`echo $host | sed 's/^[^0-9]*//' | sed 's/\.//g'` + if test $aixver -ge 4320; then + + echo " forcing SINGLE_LISTEN_UNSERIALIZED_ACCEPT to \"1\"" + SINGLE_LISTEN_UNSERIALIZED_ACCEPT="1" + + fi + ;; + *os390*) + + echo " forcing SINGLE_LISTEN_UNSERIALIZED_ACCEPT to \"1\"" + SINGLE_LISTEN_UNSERIALIZED_ACCEPT="1" + + ;; +esac + + + 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 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_RM+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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 + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_RM="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + + ;; +esac +fi +RM=$ac_cv_path_RM +if test -n "$RM"; then + { $as_echo "$as_me:$LINENO: result: $RM" >&5 +$as_echo "$RM" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "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 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_AWK+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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 + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { $as_echo "$as_me:$LINENO: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if test "${ac_cv_path_install+set}" = set; then + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in + ./ | .// | /cC/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + +done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:$LINENO: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ $as_echo "$as_me:$LINENO: checking whether ln -s works" >&5 +$as_echo_n "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no, using $LN_S" >&5 +$as_echo "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 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_RANLIB+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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 + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { $as_echo "$as_me:$LINENO: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "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 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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 + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB="true" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$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 + + + + + +{ $as_echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if test "${ac_cv_path_GREP+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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 + test -z "$as_dir" && as_dir=. + 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" + { test -f "$ac_path_GREP" && $as_test_x "$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 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo '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 + ac_count=`expr $ac_count + 1` + 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_echo "$as_me:$LINENO: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 +$as_echo "$as_me: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} + { (exit 1); exit 1; }; } + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:$LINENO: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if test "${ac_cv_path_EGREP+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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 + test -z "$as_dir" && as_dir=. + 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" + { test -f "$ac_path_EGREP" && $as_test_x "$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 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo '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 + ac_count=`expr $ac_count + 1` + 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_echo "$as_me:$LINENO: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 +$as_echo "$as_me: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} + { (exit 1); exit 1; }; } + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ $as_echo "$as_me:$LINENO: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if test "${ac_cv_header_stdc+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_header_stdc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_header_stdc=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then + : +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_header_stdc=no +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +cat >>confdefs.h <<\_ACEOF +#define STDC_HEADERS 1 +_ACEOF + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. + + + + + + + + + +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + eval "$as_ac_Header=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_Header=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + + if test "${ac_cv_header_minix_config_h+set}" = set; then + { $as_echo "$as_me:$LINENO: checking for minix/config.h" >&5 +$as_echo_n "checking for minix/config.h... " >&6; } +if test "${ac_cv_header_minix_config_h+set}" = set; then + $as_echo_n "(cached) " >&6 +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_minix_config_h" >&5 +$as_echo "$ac_cv_header_minix_config_h" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:$LINENO: checking minix/config.h usability" >&5 +$as_echo_n "checking minix/config.h usability... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:$LINENO: checking minix/config.h presence" >&5 +$as_echo_n "checking minix/config.h presence... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: minix/config.h: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: minix/config.h: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: minix/config.h: present but cannot be compiled" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: minix/config.h: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: minix/config.h: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: minix/config.h: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: proceeding with the preprocessor's result" >&5 +$as_echo "$as_me: WARNING: minix/config.h: proceeding with the preprocessor's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: in the future, the compiler will take precedence" >&5 +$as_echo "$as_me: WARNING: minix/config.h: in the future, the compiler will take precedence" >&2;} + + ;; +esac +{ $as_echo "$as_me:$LINENO: checking for minix/config.h" >&5 +$as_echo_n "checking for minix/config.h... " >&6; } +if test "${ac_cv_header_minix_config_h+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_header_minix_config_h=$ac_header_preproc +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_minix_config_h" >&5 +$as_echo "$ac_cv_header_minix_config_h" >&6; } + +fi +if test "x$ac_cv_header_minix_config_h" = x""yes; then + MINIX=yes +else + MINIX= +fi + + + if test "$MINIX" = yes; then + +cat >>confdefs.h <<\_ACEOF +#define _POSIX_SOURCE 1 +_ACEOF + + +cat >>confdefs.h <<\_ACEOF +#define _POSIX_1_SOURCE 2 +_ACEOF + + +cat >>confdefs.h <<\_ACEOF +#define _MINIX 1 +_ACEOF + + fi + + + + { $as_echo "$as_me:$LINENO: checking whether it is safe to define __EXTENSIONS__" >&5 +$as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; } +if test "${ac_cv_safe_to_define___extensions__+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +# define __EXTENSIONS__ 1 + $ac_includes_default +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_safe_to_define___extensions__=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_safe_to_define___extensions__=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_safe_to_define___extensions__" >&5 +$as_echo "$ac_cv_safe_to_define___extensions__" >&6; } + test $ac_cv_safe_to_define___extensions__ = yes && + cat >>confdefs.h <<\_ACEOF +#define __EXTENSIONS__ 1 +_ACEOF + + cat >>confdefs.h <<\_ACEOF +#define _ALL_SOURCE 1 +_ACEOF + + cat >>confdefs.h <<\_ACEOF +#define _GNU_SOURCE 1 +_ACEOF + + cat >>confdefs.h <<\_ACEOF +#define _POSIX_PTHREAD_SEMANTICS 1 +_ACEOF + + cat >>confdefs.h <<\_ACEOF +#define _TANDEM_SOURCE 1 +_ACEOF + + + + +{ $as_echo "$as_me:$LINENO: checking for library containing strerror" >&5 +$as_echo_n "checking for library containing strerror... " >&6; } +if test "${ac_cv_search_strerror+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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. */ +#ifdef __cplusplus +extern "C" +#endif +char strerror (); +int +main () +{ +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 + rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_search_strerror=$ac_res +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext + if test "${ac_cv_search_strerror+set}" = set; then + break +fi +done +if test "${ac_cv_search_strerror+set}" = set; then + : +else + ac_cv_search_strerror=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_search_strerror" >&5 +$as_echo "$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 + + + + + + +{ $as_echo "$as_me:$LINENO: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if test "${ac_cv_header_stdc+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_header_stdc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_header_stdc=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then + : +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_header_stdc=no +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +cat >>confdefs.h <<\_ACEOF +#define STDC_HEADERS 1 +_ACEOF + +fi + + + + + + + + + + + +for ac_header in \ +string.h \ +limits.h \ +unistd.h \ +sys/socket.h \ +pwd.h \ +grp.h \ +strings.h \ +sys/prctl.h \ +sys/processor.h \ +sys/sem.h + +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 +$as_echo_n "checking $ac_header usability... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 +$as_echo_n "checking $ac_header presence... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + + ;; +esac +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + +fi +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + +{ $as_echo "$as_me:$LINENO: checking for sys/wait.h that is POSIX.1 compatible" >&5 +$as_echo_n "checking for sys/wait.h that is POSIX.1 compatible... " >&6; } +if test "${ac_cv_header_sys_wait_h+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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 () +{ + int s; + wait (&s); + s = WIFEXITED (s) ? WEXITSTATUS (s) : 1; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_header_sys_wait_h=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_header_sys_wait_h=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_sys_wait_h" >&5 +$as_echo "$ac_cv_header_sys_wait_h" >&6; } +if test $ac_cv_header_sys_wait_h = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_SYS_WAIT_H 1 +_ACEOF + +fi + + + +{ $as_echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5 +$as_echo_n "checking for an ANSI C-conforming const... " >&6; } +if test "${ac_cv_c_const+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +/* FIXME: Include the comments suggested by Paul. */ +#ifndef __cplusplus + /* Ultrix mips cc rejects this. */ + typedef int charset[2]; + const charset cs; + /* 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}; + /* AIX XL C 1.02.0.0 rejects this. + It does not let you subtract one const X* pointer from another in + an arm of an if-expression whose if-part is not a constant + expression */ + const char *g = "string"; + 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. */ + char *t; + 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; + } + { /* AIX XL C 1.02.0.0 rejects this saying + "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ + struct s { int j; const int *ap[3]; }; + struct s *b; b->j = 5; + } + { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ + const int foo = 10; + if (!foo) return 0; + } + return !cs[0] && !zero.x; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_c_const=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_c_const=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5 +$as_echo "$ac_cv_c_const" >&6; } +if test $ac_cv_c_const = no; then + +cat >>confdefs.h <<\_ACEOF +#define const /**/ +_ACEOF + +fi + +if test "$ac_cv_c_compiler_gnu" = "yes"; then + + if test "x$NOTEST_CPPFLAGS" = "x"; then + echo " setting NOTEST_CPPFLAGS to \"-DAP_HAVE_DESIGNATED_INITIALIZER\"" + NOTEST_CPPFLAGS="-DAP_HAVE_DESIGNATED_INITIALIZER" + else + apr_addto_bugger="-DAP_HAVE_DESIGNATED_INITIALIZER" + 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 + echo " adding \"$i\" to NOTEST_CPPFLAGS" + NOTEST_CPPFLAGS="$NOTEST_CPPFLAGS $i" + fi + done + fi + +fi + + + + + + + + + +for ac_func in \ +getpwnam \ +getgrnam \ +initgroups \ +bindprocessor \ +prctl \ +timegm \ + +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* 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 $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + +{ $as_echo "$as_me:$LINENO: checking for tm_gmtoff in struct tm" >&5 +$as_echo_n "checking for tm_gmtoff in struct tm... " >&6; } +if test "${ac_cv_struct_tm_gmtoff+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +int +main () +{ +struct tm tm; tm.tm_gmtoff; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_struct_tm_gmtoff=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_struct_tm_gmtoff=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_struct_tm_gmtoff" >&5 +$as_echo "$ac_cv_struct_tm_gmtoff" >&6; } +if test "$ac_cv_struct_tm_gmtoff" = "yes"; then + cat >>confdefs.h <<\_ACEOF +#define HAVE_GMTOFF 1 +_ACEOF + +fi + + +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+set}" = set; then + withval=$with_port; if test "$withval" = "yes"; then { { $as_echo "$as_me:$LINENO: error: 'option --with-port requires a value (the TCP port number)'" >&5 +$as_echo "$as_me: error: 'option --with-port requires a value (the TCP port number)'" >&2;} + { (exit 1); exit 1; }; }; else PORT="$withval"; fi +else + PORT=80 +fi + + + +apr_old_cppflags=$CPPFLAGS +CPPFLAGS="$CPPFLAGS $INCLUDES" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#if APR_HAVE_IPV6 +YES_IS_DEFINED +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "YES_IS_DEFINED" >/dev/null 2>&1; then + ac_cv_define_APR_HAVE_IPV6=yes +else + ac_cv_define_APR_HAVE_IPV6=no +fi +rm -f conftest* + +CPPFLAGS=$apr_old_cppflags + + +# Check whether --enable-v4-mapped was given. +if test "${enable_v4_mapped+set}" = set; then + enableval=$enable_v4_mapped; + v4mapped=$enableval + +else + + case $host in + *freebsd5*|*netbsd*|*openbsd*) + v4mapped=no + ;; + *) + v4mapped=yes + ;; +esac + +fi + + +if test $v4mapped = "yes" -o $ac_cv_define_APR_HAVE_IPV6 = "no"; then + nonssl_listen_stmt_1="" + nonssl_listen_stmt_2="Listen @@Port@@" + if test $ac_cv_define_APR_HAVE_IPV6 = "yes"; then + +cat >>confdefs.h <<\_ACEOF +#define AP_ENABLE_V4_MAPPED 1 +_ACEOF + + fi +else + nonssl_listen_stmt_1="Listen 0.0.0.0:@@Port@@" + nonssl_listen_stmt_2="Listen [::]:@@Port@@" +fi + +# Check whether --enable-exception-hook was given. +if test "${enable_exception_hook+set}" = set; then + enableval=$enable_exception_hook; + +cat >>confdefs.h <<\_ACEOF +#define AP_ENABLE_EXCEPTION_HOOK 1 +_ACEOF + + +fi + +# Check whether --enable-maintainer-mode was given. +if test "${enable_maintainer_mode+set}" = set; then + enableval=$enable_maintainer_mode; + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DAP_DEBUG\"" + CPPFLAGS="-DAP_DEBUG" + else + apr_addto_bugger="-DAP_DEBUG" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + +fi + +prefix="$orig_prefix" + + module_selection=default + module_default=yes + + # Check whether --enable-modules was given. +if test "${enable_modules+set}" = set; then + enableval=$enable_modules; + for i in $enableval; do + if test "$i" = "all" -o "$i" = "most"; then + module_selection=$i + else + eval "enable_$i=yes" + fi + done + +fi + + + # Check whether --enable-mods-shared was given. +if test "${enable_mods_shared+set}" = set; then + enableval=$enable_mods_shared; + for i in $enableval; do + if test "$i" = "all" -o "$i" = "most"; then + module_selection=$i + module_default=shared + else + i=`echo $i | sed 's/-/_/g'` + eval "enable_$i=shared" + fi + done + +fi + + + + + + + current_dir=aaa + modpath_current=modules/aaa + modpath_static= + modpath_shared= + test -d aaa || $srcdir/build/mkdir.sh $modpath_current + > $modpath_current/modules.mk + + + + { $as_echo "$as_me:$LINENO: checking whether to enable mod_access" >&5 +$as_echo_n "checking whether to enable mod_access... " >&6; } + # Check whether --enable-access was given. +if test "${enable_access+set}" = set; then + enableval=$enable_access; +else + enable_access=yes +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_access" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_access" = "static"; then + enable_access=yes + elif test "$enable_access" = "yes"; then + enable_access=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_access" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_access=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_access" != "yes"; then + enable_access=no + fi + elif test "$enable_access" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_access=$module_default + _apmod_extra_msg=" (all)" + else + enable_access=no + fi + fi + if test "$enable_access" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_access$_apmod_extra_msg" >&5 +$as_echo "$enable_access$_apmod_extra_msg" >&6; } + if test "$enable_access" != "no"; then + case "$enable_access" in + shared*) + enable_access=`echo $ac_n $enable_access$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES access" + ;; + *) + MODLIST="$MODLIST access" + if test "access" = "so"; then + sharedobjs=yes + fi + shared="";; + esac + + + if test -z ""; then + objects="mod_access.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + libname="mod_access.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +$as_echo_n "checking whether to enable mod_auth... " >&6; } + # Check whether --enable-auth was given. +if test "${enable_auth+set}" = set; then + enableval=$enable_auth; +else + enable_auth=yes +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_auth" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_auth" = "static"; then + enable_auth=yes + elif test "$enable_auth" = "yes"; then + enable_auth=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_auth" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_auth=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_auth" != "yes"; then + enable_auth=no + fi + elif test "$enable_auth" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_auth=$module_default + _apmod_extra_msg=" (all)" + else + enable_auth=no + fi + fi + if test "$enable_auth" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_auth$_apmod_extra_msg" >&5 +$as_echo "$enable_auth$_apmod_extra_msg" >&6; } + if test "$enable_auth" != "no"; then + case "$enable_auth" in + shared*) + enable_auth=`echo $ac_n $enable_auth$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES auth" + ;; + *) + MODLIST="$MODLIST auth" + if test "auth" = "so"; then + sharedobjs=yes + fi + shared="";; + esac + + + if test -z ""; then + objects="mod_auth.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + libname="mod_auth.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +$as_echo_n "checking whether to enable mod_auth_anon... " >&6; } + # Check whether --enable-auth-anon was given. +if test "${enable_auth_anon+set}" = set; then + enableval=$enable_auth_anon; +else + enable_auth_anon=most +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_auth_anon" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_auth_anon" = "static"; then + enable_auth_anon=yes + elif test "$enable_auth_anon" = "yes"; then + enable_auth_anon=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_auth_anon" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_auth_anon=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_auth_anon" != "yes"; then + enable_auth_anon=no + fi + elif test "$enable_auth_anon" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_auth_anon=$module_default + _apmod_extra_msg=" (all)" + else + enable_auth_anon=no + fi + fi + if test "$enable_auth_anon" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_auth_anon$_apmod_extra_msg" >&5 +$as_echo "$enable_auth_anon$_apmod_extra_msg" >&6; } + if test "$enable_auth_anon" != "no"; then + case "$enable_auth_anon" in + shared*) + enable_auth_anon=`echo $ac_n $enable_auth_anon$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES auth_anon" + ;; + *) + MODLIST="$MODLIST auth_anon" + if test "auth_anon" = "so"; then + sharedobjs=yes + fi + shared="";; + esac + + + if test -z ""; then + objects="mod_auth_anon.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + libname="mod_auth_anon.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +$as_echo_n "checking whether to enable mod_auth_dbm... " >&6; } + # Check whether --enable-auth-dbm was given. +if test "${enable_auth_dbm+set}" = set; then + enableval=$enable_auth_dbm; +else + enable_auth_dbm=most +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_auth_dbm" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_auth_dbm" = "static"; then + enable_auth_dbm=yes + elif test "$enable_auth_dbm" = "yes"; then + enable_auth_dbm=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_auth_dbm" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_auth_dbm=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_auth_dbm" != "yes"; then + enable_auth_dbm=no + fi + elif test "$enable_auth_dbm" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_auth_dbm=$module_default + _apmod_extra_msg=" (all)" + else + enable_auth_dbm=no + fi + fi + if test "$enable_auth_dbm" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_auth_dbm$_apmod_extra_msg" >&5 +$as_echo "$enable_auth_dbm$_apmod_extra_msg" >&6; } + if test "$enable_auth_dbm" != "no"; then + case "$enable_auth_dbm" in + shared*) + enable_auth_dbm=`echo $ac_n $enable_auth_dbm$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES auth_dbm" + ;; + *) + MODLIST="$MODLIST auth_dbm" + if test "auth_dbm" = "so"; then + sharedobjs=yes + fi + shared="";; + esac + + + if test -z ""; then + objects="mod_auth_dbm.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + libname="mod_auth_dbm.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +$as_echo_n "checking whether to enable mod_auth_digest... " >&6; } + # Check whether --enable-auth-digest was given. +if test "${enable_auth_digest+set}" = set; then + enableval=$enable_auth_digest; +else + enable_auth_digest=most +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_auth_digest" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_auth_digest" = "static"; then + enable_auth_digest=yes + elif test "$enable_auth_digest" = "yes"; then + enable_auth_digest=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_auth_digest" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_auth_digest=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_auth_digest" != "yes"; then + enable_auth_digest=no + fi + elif test "$enable_auth_digest" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_auth_digest=$module_default + _apmod_extra_msg=" (all)" + else + enable_auth_digest=no + fi + fi + if test "$enable_auth_digest" != "no"; then + { $as_echo "$as_me:$LINENO: result: checking dependencies" >&5 +$as_echo "checking dependencies" >&6; } + + +apr_old_cppflags=$CPPFLAGS +CPPFLAGS="$CPPFLAGS $INCLUDES" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#if APR_HAS_RANDOM +YES_IS_DEFINED +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "YES_IS_DEFINED" >/dev/null 2>&1; then + ac_cv_define_APR_HAS_RANDOM=yes +else + ac_cv_define_APR_HAS_RANDOM=no +fi +rm -f 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 + + { $as_echo "$as_me:$LINENO: checking whether to enable mod_auth_digest" >&5 +$as_echo_n "checking whether to enable mod_auth_digest... " >&6; } + if test "$enable_auth_digest" = "no"; then + if test "$_apmod_error_fatal" = "no"; then + _apmod_extra_msg=" (disabled)" + else + { { $as_echo "$as_me:$LINENO: error: mod_auth_digest has been requested but can not be built due to prerequisite failures" >&5 +$as_echo "$as_me: error: mod_auth_digest has been requested but can not be built due to prerequisite failures" >&2;} + { (exit 1); exit 1; }; } + fi + fi + fi + { $as_echo "$as_me:$LINENO: result: $enable_auth_digest$_apmod_extra_msg" >&5 +$as_echo "$enable_auth_digest$_apmod_extra_msg" >&6; } + if test "$enable_auth_digest" != "no"; then + case "$enable_auth_digest" in + shared*) + enable_auth_digest=`echo $ac_n $enable_auth_digest$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES auth_digest" + ;; + *) + MODLIST="$MODLIST auth_digest" + if test "auth_digest" = "so"; then + sharedobjs=yes + fi + shared="";; + esac + + + if test -z ""; then + objects="mod_auth_digest.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + libname="mod_auth_digest.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 + 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= + test -d arch/win32 || $srcdir/build/mkdir.sh $modpath_current + > $modpath_current/modules.mk + + + + { $as_echo "$as_me:$LINENO: checking whether to enable mod_isapi" >&5 +$as_echo_n "checking whether to enable mod_isapi... " >&6; } + # Check whether --enable-isapi was given. +if test "${enable_isapi+set}" = set; then + enableval=$enable_isapi; +else + enable_isapi=no +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_isapi" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_isapi" = "static"; then + enable_isapi=yes + elif test "$enable_isapi" = "yes"; then + enable_isapi=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_isapi" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_isapi=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_isapi" != "yes"; then + enable_isapi=no + fi + elif test "$enable_isapi" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_isapi=$module_default + _apmod_extra_msg=" (all)" + else + enable_isapi=no + fi + fi + if test "$enable_isapi" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_isapi$_apmod_extra_msg" >&5 +$as_echo "$enable_isapi$_apmod_extra_msg" >&6; } + if test "$enable_isapi" != "no"; then + case "$enable_isapi" in + shared*) + enable_isapi=`echo $ac_n $enable_isapi$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES isapi" + ;; + *) + MODLIST="$MODLIST isapi" + if test "isapi" = "so"; then + sharedobjs=yes + fi + shared="";; + esac + + + if test -z ""; then + objects="mod_isapi.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + libname="mod_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 + 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= + test -d cache || $srcdir/build/mkdir.sh $modpath_current + > $modpath_current/modules.mk + + + + { $as_echo "$as_me:$LINENO: checking whether to enable mod_file_cache" >&5 +$as_echo_n "checking whether to enable mod_file_cache... " >&6; } + # Check whether --enable-file-cache was given. +if test "${enable_file_cache+set}" = set; then + enableval=$enable_file_cache; +else + enable_file_cache=no +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_file_cache" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_file_cache" = "static"; then + enable_file_cache=yes + elif test "$enable_file_cache" = "yes"; then + enable_file_cache=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_file_cache" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_file_cache=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_file_cache" != "yes"; then + enable_file_cache=no + fi + elif test "$enable_file_cache" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_file_cache=$module_default + _apmod_extra_msg=" (all)" + else + enable_file_cache=no + fi + fi + if test "$enable_file_cache" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_file_cache$_apmod_extra_msg" >&5 +$as_echo "$enable_file_cache$_apmod_extra_msg" >&6; } + if test "$enable_file_cache" != "no"; then + case "$enable_file_cache" in + shared*) + enable_file_cache=`echo $ac_n $enable_file_cache$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES file_cache" + ;; + *) + MODLIST="$MODLIST file_cache" + if test "file_cache" = "so"; then + sharedobjs=yes + fi + shared="";; + esac + + + if test -z ""; then + objects="mod_file_cache.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + libname="mod_file_cache.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 + 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= + test -d echo || $srcdir/build/mkdir.sh $modpath_current + > $modpath_current/modules.mk + + + + { $as_echo "$as_me:$LINENO: checking whether to enable mod_echo" >&5 +$as_echo_n "checking whether to enable mod_echo... " >&6; } + # Check whether --enable-echo was given. +if test "${enable_echo+set}" = set; then + enableval=$enable_echo; +else + enable_echo=no +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_echo" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_echo" = "static"; then + enable_echo=yes + elif test "$enable_echo" = "yes"; then + enable_echo=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_echo" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_echo=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_echo" != "yes"; then + enable_echo=no + fi + elif test "$enable_echo" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_echo=$module_default + _apmod_extra_msg=" (all)" + else + enable_echo=no + fi + fi + if test "$enable_echo" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_echo$_apmod_extra_msg" >&5 +$as_echo "$enable_echo$_apmod_extra_msg" >&6; } + if test "$enable_echo" != "no"; then + case "$enable_echo" in + shared*) + enable_echo=`echo $ac_n $enable_echo$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES echo" + ;; + *) + MODLIST="$MODLIST echo" + if test "echo" = "so"; then + sharedobjs=yes + fi + shared="";; + esac + + + if test -z ""; then + objects="mod_echo.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + libname="mod_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 + 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= + test -d experimental || $srcdir/build/mkdir.sh $modpath_current + > $modpath_current/modules.mk + + +if test "$ac_cv_ebcdic" = "yes"; then +# mod_charset_lite can be very useful on an ebcdic system, +# so include it by default + + { $as_echo "$as_me:$LINENO: checking whether to enable mod_charset_lite" >&5 +$as_echo_n "checking whether to enable mod_charset_lite... " >&6; } + # Check whether --enable-charset-lite was given. +if test "${enable_charset_lite+set}" = set; then + enableval=$enable_charset_lite; +else + enable_charset_lite=yes +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_charset_lite" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_charset_lite" = "static"; then + enable_charset_lite=yes + elif test "$enable_charset_lite" = "yes"; then + enable_charset_lite=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_charset_lite" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_charset_lite=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_charset_lite" != "yes"; then + enable_charset_lite=no + fi + elif test "$enable_charset_lite" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_charset_lite=$module_default + _apmod_extra_msg=" (all)" + else + enable_charset_lite=no + fi + fi + if test "$enable_charset_lite" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_charset_lite$_apmod_extra_msg" >&5 +$as_echo "$enable_charset_lite$_apmod_extra_msg" >&6; } + if test "$enable_charset_lite" != "no"; then + case "$enable_charset_lite" in + shared*) + enable_charset_lite=`echo $ac_n $enable_charset_lite$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES charset_lite" + ;; + *) + MODLIST="$MODLIST charset_lite" + if test "charset_lite" = "so"; then + sharedobjs=yes + fi + shared="";; + esac + + + if test -z ""; then + objects="mod_charset_lite.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + libname="mod_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 +$as_echo_n "checking whether to enable mod_charset_lite... " >&6; } + # Check whether --enable-charset-lite was given. +if test "${enable_charset_lite+set}" = set; then + enableval=$enable_charset_lite; +else + enable_charset_lite=no +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_charset_lite" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_charset_lite" = "static"; then + enable_charset_lite=yes + elif test "$enable_charset_lite" = "yes"; then + enable_charset_lite=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_charset_lite" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_charset_lite=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_charset_lite" != "yes"; then + enable_charset_lite=no + fi + elif test "$enable_charset_lite" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_charset_lite=$module_default + _apmod_extra_msg=" (all)" + else + enable_charset_lite=no + fi + fi + if test "$enable_charset_lite" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_charset_lite$_apmod_extra_msg" >&5 +$as_echo "$enable_charset_lite$_apmod_extra_msg" >&6; } + if test "$enable_charset_lite" != "no"; then + case "$enable_charset_lite" in + shared*) + enable_charset_lite=`echo $ac_n $enable_charset_lite$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES charset_lite" + ;; + *) + MODLIST="$MODLIST charset_lite" + if test "charset_lite" = "so"; then + sharedobjs=yes + fi + shared="";; + esac + + + if test -z ""; then + objects="mod_charset_lite.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + libname="mod_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 +$as_echo_n "checking whether to enable mod_cache... " >&6; } + # Check whether --enable-cache was given. +if test "${enable_cache+set}" = set; then + enableval=$enable_cache; +else + enable_cache=no +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_cache" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_cache" = "static"; then + enable_cache=yes + elif test "$enable_cache" = "yes"; then + enable_cache=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_cache" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_cache=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_cache" != "yes"; then + enable_cache=no + fi + elif test "$enable_cache" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_cache=$module_default + _apmod_extra_msg=" (all)" + else + enable_cache=no + fi + fi + if test "$enable_cache" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_cache$_apmod_extra_msg" >&5 +$as_echo "$enable_cache$_apmod_extra_msg" >&6; } + if test "$enable_cache" != "no"; then + case "$enable_cache" in + shared*) + enable_cache=`echo $ac_n $enable_cache$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES cache" + ;; + *) + MODLIST="$MODLIST cache" + if test "cache" = "so"; then + sharedobjs=yes + fi + shared="";; + 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 + libname="mod_cache.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +$as_echo_n "checking whether to enable mod_disk_cache... " >&6; } + # Check whether --enable-disk-cache was given. +if test "${enable_disk_cache+set}" = set; then + enableval=$enable_disk_cache; +else + enable_disk_cache=no +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_disk_cache" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_disk_cache" = "static"; then + enable_disk_cache=yes + elif test "$enable_disk_cache" = "yes"; then + enable_disk_cache=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_disk_cache" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_disk_cache=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_disk_cache" != "yes"; then + enable_disk_cache=no + fi + elif test "$enable_disk_cache" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_disk_cache=$module_default + _apmod_extra_msg=" (all)" + else + enable_disk_cache=no + fi + fi + if test "$enable_disk_cache" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_disk_cache$_apmod_extra_msg" >&5 +$as_echo "$enable_disk_cache$_apmod_extra_msg" >&6; } + if test "$enable_disk_cache" != "no"; then + case "$enable_disk_cache" in + shared*) + enable_disk_cache=`echo $ac_n $enable_disk_cache$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES disk_cache" + ;; + *) + MODLIST="$MODLIST disk_cache" + if test "disk_cache" = "so"; then + sharedobjs=yes + fi + shared="";; + esac + + + if test -z ""; then + objects="mod_disk_cache.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + libname="mod_disk_cache.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +$as_echo_n "checking whether to enable mod_mem_cache... " >&6; } + # Check whether --enable-mem-cache was given. +if test "${enable_mem_cache+set}" = set; then + enableval=$enable_mem_cache; +else + enable_mem_cache=no +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_mem_cache" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_mem_cache" = "static"; then + enable_mem_cache=yes + elif test "$enable_mem_cache" = "yes"; then + enable_mem_cache=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_mem_cache" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_mem_cache=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_mem_cache" != "yes"; then + enable_mem_cache=no + fi + elif test "$enable_mem_cache" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_mem_cache=$module_default + _apmod_extra_msg=" (all)" + else + enable_mem_cache=no + fi + fi + if test "$enable_mem_cache" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_mem_cache$_apmod_extra_msg" >&5 +$as_echo "$enable_mem_cache$_apmod_extra_msg" >&6; } + if test "$enable_mem_cache" != "no"; then + case "$enable_mem_cache" in + shared*) + enable_mem_cache=`echo $ac_n $enable_mem_cache$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES mem_cache" + ;; + *) + MODLIST="$MODLIST mem_cache" + if test "mem_cache" = "so"; then + sharedobjs=yes + fi + shared="";; + esac + + + if test -z "$mem_cache_objs"; then + objects="mod_mem_cache.lo" + else + objects="$mem_cache_objs" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + libname="mod_mem_cache.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +$as_echo_n "checking whether to enable mod_example... " >&6; } + # Check whether --enable-example was given. +if test "${enable_example+set}" = set; then + enableval=$enable_example; +else + enable_example=no +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_example" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_example" = "static"; then + enable_example=yes + elif test "$enable_example" = "yes"; then + enable_example=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_example" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_example=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_example" != "yes"; then + enable_example=no + fi + elif test "$enable_example" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_example=$module_default + _apmod_extra_msg=" (all)" + else + enable_example=no + fi + fi + if test "$enable_example" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_example$_apmod_extra_msg" >&5 +$as_echo "$enable_example$_apmod_extra_msg" >&6; } + if test "$enable_example" != "no"; then + case "$enable_example" in + shared*) + enable_example=`echo $ac_n $enable_example$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES example" + ;; + *) + MODLIST="$MODLIST example" + if test "example" = "so"; then + sharedobjs=yes + fi + shared="";; + esac + + + if test -z ""; then + objects="mod_example.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + libname="mod_example.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +$as_echo_n "checking whether to enable mod_case_filter... " >&6; } + # Check whether --enable-case-filter was given. +if test "${enable_case_filter+set}" = set; then + enableval=$enable_case_filter; +else + enable_case_filter=no +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_case_filter" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_case_filter" = "static"; then + enable_case_filter=yes + elif test "$enable_case_filter" = "yes"; then + enable_case_filter=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_case_filter" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_case_filter=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_case_filter" != "yes"; then + enable_case_filter=no + fi + elif test "$enable_case_filter" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_case_filter=$module_default + _apmod_extra_msg=" (all)" + else + enable_case_filter=no + fi + fi + if test "$enable_case_filter" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_case_filter$_apmod_extra_msg" >&5 +$as_echo "$enable_case_filter$_apmod_extra_msg" >&6; } + if test "$enable_case_filter" != "no"; then + case "$enable_case_filter" in + shared*) + enable_case_filter=`echo $ac_n $enable_case_filter$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES case_filter" + ;; + *) + MODLIST="$MODLIST case_filter" + if test "case_filter" = "so"; then + sharedobjs=yes + fi + shared="";; + esac + + + if test -z ""; then + objects="mod_case_filter.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + libname="mod_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 +$as_echo_n "checking whether to enable mod_case_filter_in... " >&6; } + # Check whether --enable-case-filter-in was given. +if test "${enable_case_filter_in+set}" = set; then + enableval=$enable_case_filter_in; +else + enable_case_filter_in=no +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_case_filter_in" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_case_filter_in" = "static"; then + enable_case_filter_in=yes + elif test "$enable_case_filter_in" = "yes"; then + enable_case_filter_in=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_case_filter_in" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_case_filter_in=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_case_filter_in" != "yes"; then + enable_case_filter_in=no + fi + elif test "$enable_case_filter_in" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_case_filter_in=$module_default + _apmod_extra_msg=" (all)" + else + enable_case_filter_in=no + fi + fi + if test "$enable_case_filter_in" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_case_filter_in$_apmod_extra_msg" >&5 +$as_echo "$enable_case_filter_in$_apmod_extra_msg" >&6; } + if test "$enable_case_filter_in" != "no"; then + case "$enable_case_filter_in" in + shared*) + enable_case_filter_in=`echo $ac_n $enable_case_filter_in$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES case_filter_in" + ;; + *) + MODLIST="$MODLIST case_filter_in" + if test "case_filter_in" = "so"; then + sharedobjs=yes + fi + shared="";; + 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 + libname="mod_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 +$as_echo_n "checking whether to enable mod_dumpio... " >&6; } + # Check whether --enable-dumpio was given. +if test "${enable_dumpio+set}" = set; then + enableval=$enable_dumpio; +else + enable_dumpio=no +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_dumpio" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_dumpio" = "static"; then + enable_dumpio=yes + elif test "$enable_dumpio" = "yes"; then + enable_dumpio=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_dumpio" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_dumpio=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_dumpio" != "yes"; then + enable_dumpio=no + fi + elif test "$enable_dumpio" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_dumpio=$module_default + _apmod_extra_msg=" (all)" + else + enable_dumpio=no + fi + fi + if test "$enable_dumpio" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_dumpio$_apmod_extra_msg" >&5 +$as_echo "$enable_dumpio$_apmod_extra_msg" >&6; } + if test "$enable_dumpio" != "no"; then + case "$enable_dumpio" in + shared*) + enable_dumpio=`echo $ac_n $enable_dumpio$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES dumpio" + ;; + *) + MODLIST="$MODLIST dumpio" + if test "dumpio" = "so"; then + sharedobjs=yes + fi + shared="";; + esac + + + if test -z ""; then + objects="mod_dumpio.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + libname="mod_dumpio.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +$as_echo_n "checking whether to enable mod_ldap... " >&6; } + # Check whether --enable-ldap was given. +if test "${enable_ldap+set}" = set; then + enableval=$enable_ldap; +else + enable_ldap=no +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_ldap" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_ldap" = "static"; then + enable_ldap=yes + elif test "$enable_ldap" = "yes"; then + enable_ldap=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_ldap" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_ldap=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_ldap" != "yes"; then + enable_ldap=no + fi + elif test "$enable_ldap" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_ldap=$module_default + _apmod_extra_msg=" (all)" + else + enable_ldap=no + fi + fi + if test "$enable_ldap" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_ldap$_apmod_extra_msg" >&5 +$as_echo "$enable_ldap$_apmod_extra_msg" >&6; } + if test "$enable_ldap" != "no"; then + case "$enable_ldap" in + shared*) + enable_ldap=`echo $ac_n $enable_ldap$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES ldap" + ;; + *) + MODLIST="$MODLIST ldap" + if test "ldap" = "so"; then + sharedobjs=yes + fi + shared="";; + 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 + libname="mod_ldap.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +$as_echo_n "checking whether to enable mod_auth_ldap... " >&6; } + # Check whether --enable-auth-ldap was given. +if test "${enable_auth_ldap+set}" = set; then + enableval=$enable_auth_ldap; +else + enable_auth_ldap=no +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_auth_ldap" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_auth_ldap" = "static"; then + enable_auth_ldap=yes + elif test "$enable_auth_ldap" = "yes"; then + enable_auth_ldap=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_auth_ldap" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_auth_ldap=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_auth_ldap" != "yes"; then + enable_auth_ldap=no + fi + elif test "$enable_auth_ldap" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_auth_ldap=$module_default + _apmod_extra_msg=" (all)" + else + enable_auth_ldap=no + fi + fi + if test "$enable_auth_ldap" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_auth_ldap$_apmod_extra_msg" >&5 +$as_echo "$enable_auth_ldap$_apmod_extra_msg" >&6; } + if test "$enable_auth_ldap" != "no"; then + case "$enable_auth_ldap" in + shared*) + enable_auth_ldap=`echo $ac_n $enable_auth_ldap$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES auth_ldap" + ;; + *) + MODLIST="$MODLIST auth_ldap" + if test "auth_ldap" = "so"; then + sharedobjs=yes + fi + shared="";; + esac + + + if test -z "$auth_ldap_objects"; then + objects="mod_auth_ldap.lo" + else + objects="$auth_ldap_objects" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + libname="mod_auth_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 + 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= + test -d filters || $srcdir/build/mkdir.sh $modpath_current + > $modpath_current/modules.mk + + + + { $as_echo "$as_me:$LINENO: checking whether to enable mod_ext_filter" >&5 +$as_echo_n "checking whether to enable mod_ext_filter... " >&6; } + # Check whether --enable-ext-filter was given. +if test "${enable_ext_filter+set}" = set; then + enableval=$enable_ext_filter; +else + enable_ext_filter=most +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_ext_filter" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_ext_filter" = "static"; then + enable_ext_filter=yes + elif test "$enable_ext_filter" = "yes"; then + enable_ext_filter=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_ext_filter" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_ext_filter=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_ext_filter" != "yes"; then + enable_ext_filter=no + fi + elif test "$enable_ext_filter" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_ext_filter=$module_default + _apmod_extra_msg=" (all)" + else + enable_ext_filter=no + fi + fi + if test "$enable_ext_filter" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_ext_filter$_apmod_extra_msg" >&5 +$as_echo "$enable_ext_filter$_apmod_extra_msg" >&6; } + if test "$enable_ext_filter" != "no"; then + case "$enable_ext_filter" in + shared*) + enable_ext_filter=`echo $ac_n $enable_ext_filter$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES ext_filter" + ;; + *) + MODLIST="$MODLIST ext_filter" + if test "ext_filter" = "so"; then + sharedobjs=yes + fi + shared="";; + esac + + + if test -z ""; then + objects="mod_ext_filter.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + libname="mod_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 +$as_echo_n "checking whether to enable mod_include... " >&6; } + # Check whether --enable-include was given. +if test "${enable_include+set}" = set; then + enableval=$enable_include; +else + enable_include=yes +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_include" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_include" = "static"; then + enable_include=yes + elif test "$enable_include" = "yes"; then + enable_include=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_include" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_include=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_include" != "yes"; then + enable_include=no + fi + elif test "$enable_include" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_include=$module_default + _apmod_extra_msg=" (all)" + else + enable_include=no + fi + fi + if test "$enable_include" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_include$_apmod_extra_msg" >&5 +$as_echo "$enable_include$_apmod_extra_msg" >&6; } + if test "$enable_include" != "no"; then + case "$enable_include" in + shared*) + enable_include=`echo $ac_n $enable_include$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES include" + ;; + *) + MODLIST="$MODLIST include" + if test "include" = "so"; then + sharedobjs=yes + fi + shared="";; + esac + + + if test -z ""; then + objects="mod_include.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + libname="mod_include.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +$as_echo_n "checking whether to enable mod_deflate... " >&6; } + # Check whether --enable-deflate was given. +if test "${enable_deflate+set}" = set; then + enableval=$enable_deflate; +else + enable_deflate=no +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_deflate" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_deflate" = "static"; then + enable_deflate=yes + elif test "$enable_deflate" = "yes"; then + enable_deflate=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_deflate" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_deflate=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_deflate" != "yes"; then + enable_deflate=no + fi + elif test "$enable_deflate" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_deflate=$module_default + _apmod_extra_msg=" (all)" + else + enable_deflate=no + fi + fi + if test "$enable_deflate" != "no"; then + { $as_echo "$as_me:$LINENO: result: checking dependencies" >&5 +$as_echo "checking dependencies" >&6; } + + +# Check whether --with-z was given. +if test "${with_z+set}" = set; then + withval=$with_z; + if test "x$withval" != "xyes" && test "x$withval" != "x"; then + ap_zlib_base="$withval" + fi + +fi + + if test "x$ap_zlib_base" = "x"; then + { $as_echo "$as_me:$LINENO: checking for zlib location" >&5 +$as_echo_n "checking for zlib location... " >&6; } + if test "${ap_cv_zlib+set}" = set; then + $as_echo_n "(cached) " >&6 +else + + 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 + +fi + + ap_zlib_base=$ap_cv_zlib + if test "x$ap_zlib_base" = "x"; then + enable_deflate=no + { $as_echo "$as_me:$LINENO: result: not found" >&5 +$as_echo "not found" >&6; } + else + { $as_echo "$as_me:$LINENO: result: $ap_zlib_base" >&5 +$as_echo "$ap_zlib_base" >&6; } + fi + fi + if test "$enable_deflate" != "no"; then + ap_save_includes=$INCLUDE + ap_save_ldflags=$LDFLAGS + ap_save_libs=$LIBS + ap_save_cppflags=$CPPFLAGS + if test "$ap_zlib_base" != "/usr"; then + + if test "x$INCLUDES" = "x"; then + 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 + echo " adding \"$i\" to INCLUDES" + INCLUDES="$INCLUDES $i" + fi + done + fi + + CPPFLAGS="$CPPFLAGS $INCLUDES" + + if test "x$LDFLAGS" = "x"; then + 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 + echo " adding \"$i\" to LDFLAGS" + LDFLAGS="$LDFLAGS $i" + fi + done + fi + + if test "x$ap_platform_runtime_link_flag" != "x"; then + + if test "x$LDFLAGS" = "x"; then + 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 + echo " adding \"$i\" to LDFLAGS" + LDFLAGS="$LDFLAGS $i" + fi + done + fi + + fi + fi + + if test "x$LIBS" = "x"; then + 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 + echo " adding \"$i\" to LIBS" + LIBS="$LIBS $i" + fi + done + fi + + { $as_echo "$as_me:$LINENO: checking for zlib library" >&5 +$as_echo_n "checking for zlib library... " >&6; } + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +int i = Z_OK; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + { $as_echo "$as_me:$LINENO: result: found" >&5 +$as_echo "found" >&6; } + +for ac_header in zutil.h +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 +$as_echo_n "checking $ac_header usability... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 +$as_echo_n "checking $ac_header presence... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + + ;; +esac +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + +fi +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + { $as_echo "$as_me:$LINENO: result: not found" >&5 +$as_echo "not found" >&6; } + enable_deflate=no + INCLUDES=$ap_save_includes + LDFLAGS=$ap_save_ldflags + LIBS=$ap_save_libs +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext + CPPFLAGS=$ap_save_cppflags + fi + + { $as_echo "$as_me:$LINENO: checking whether to enable mod_deflate" >&5 +$as_echo_n "checking whether to enable mod_deflate... " >&6; } + if test "$enable_deflate" = "no"; then + if test "$_apmod_error_fatal" = "no"; then + _apmod_extra_msg=" (disabled)" + else + { { $as_echo "$as_me:$LINENO: error: mod_deflate has been requested but can not be built due to prerequisite failures" >&5 +$as_echo "$as_me: error: mod_deflate has been requested but can not be built due to prerequisite failures" >&2;} + { (exit 1); exit 1; }; } + fi + fi + fi + { $as_echo "$as_me:$LINENO: result: $enable_deflate$_apmod_extra_msg" >&5 +$as_echo "$enable_deflate$_apmod_extra_msg" >&6; } + if test "$enable_deflate" != "no"; then + case "$enable_deflate" in + shared*) + enable_deflate=`echo $ac_n $enable_deflate$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES deflate" + ;; + *) + MODLIST="$MODLIST deflate" + if test "deflate" = "so"; then + sharedobjs=yes + fi + shared="";; + esac + + + if test -z ""; then + objects="mod_deflate.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + libname="mod_deflate.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 + 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= + test -d loggers || $srcdir/build/mkdir.sh $modpath_current + > $modpath_current/modules.mk + + + + { $as_echo "$as_me:$LINENO: checking whether to enable mod_log_config" >&5 +$as_echo_n "checking whether to enable mod_log_config... " >&6; } + # Check whether --enable-log-config was given. +if test "${enable_log_config+set}" = set; then + enableval=$enable_log_config; +else + enable_log_config=yes +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_log_config" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_log_config" = "static"; then + enable_log_config=yes + elif test "$enable_log_config" = "yes"; then + enable_log_config=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_log_config" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_log_config=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_log_config" != "yes"; then + enable_log_config=no + fi + elif test "$enable_log_config" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_log_config=$module_default + _apmod_extra_msg=" (all)" + else + enable_log_config=no + fi + fi + if test "$enable_log_config" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_log_config$_apmod_extra_msg" >&5 +$as_echo "$enable_log_config$_apmod_extra_msg" >&6; } + if test "$enable_log_config" != "no"; then + case "$enable_log_config" in + shared*) + enable_log_config=`echo $ac_n $enable_log_config$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES log_config" + ;; + *) + MODLIST="$MODLIST log_config" + if test "log_config" = "so"; then + sharedobjs=yes + fi + shared="";; + esac + + + if test -z ""; then + objects="mod_log_config.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + libname="mod_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 +$as_echo_n "checking whether to enable mod_log_forensic... " >&6; } + # Check whether --enable-log-forensic was given. +if test "${enable_log_forensic+set}" = set; then + enableval=$enable_log_forensic; +else + enable_log_forensic=maybe-all +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_log_forensic" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_log_forensic" = "static"; then + enable_log_forensic=yes + elif test "$enable_log_forensic" = "yes"; then + enable_log_forensic=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_log_forensic" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_log_forensic=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_log_forensic" != "yes"; then + enable_log_forensic=no + fi + elif test "$enable_log_forensic" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_log_forensic=$module_default + _apmod_extra_msg=" (all)" + else + enable_log_forensic=no + fi + fi + if test "$enable_log_forensic" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_log_forensic$_apmod_extra_msg" >&5 +$as_echo "$enable_log_forensic$_apmod_extra_msg" >&6; } + if test "$enable_log_forensic" != "no"; then + case "$enable_log_forensic" in + shared*) + enable_log_forensic=`echo $ac_n $enable_log_forensic$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES log_forensic" + ;; + *) + MODLIST="$MODLIST log_forensic" + if test "log_forensic" = "so"; then + sharedobjs=yes + fi + shared="";; + esac + + + if test -z ""; then + objects="mod_log_forensic.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + libname="mod_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 +$as_echo_n "checking whether to enable mod_logio... " >&6; } + # Check whether --enable-logio was given. +if test "${enable_logio+set}" = set; then + enableval=$enable_logio; +else + enable_logio=no +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_logio" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_logio" = "static"; then + enable_logio=yes + elif test "$enable_logio" = "yes"; then + enable_logio=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_logio" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_logio=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_logio" != "yes"; then + enable_logio=no + fi + elif test "$enable_logio" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_logio=$module_default + _apmod_extra_msg=" (all)" + else + enable_logio=no + fi + fi + if test "$enable_logio" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_logio$_apmod_extra_msg" >&5 +$as_echo "$enable_logio$_apmod_extra_msg" >&6; } + if test "$enable_logio" != "no"; then + case "$enable_logio" in + shared*) + enable_logio=`echo $ac_n $enable_logio$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES logio" + ;; + *) + MODLIST="$MODLIST logio" + if test "logio" = "so"; then + sharedobjs=yes + fi + shared="";; + esac + + + if test -z ""; then + objects="mod_logio.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + libname="mod_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 + 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= + test -d metadata || $srcdir/build/mkdir.sh $modpath_current + > $modpath_current/modules.mk + + + + { $as_echo "$as_me:$LINENO: checking whether to enable mod_env" >&5 +$as_echo_n "checking whether to enable mod_env... " >&6; } + # Check whether --enable-env was given. +if test "${enable_env+set}" = set; then + enableval=$enable_env; +else + enable_env=yes +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_env" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_env" = "static"; then + enable_env=yes + elif test "$enable_env" = "yes"; then + enable_env=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_env" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_env=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_env" != "yes"; then + enable_env=no + fi + elif test "$enable_env" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_env=$module_default + _apmod_extra_msg=" (all)" + else + enable_env=no + fi + fi + if test "$enable_env" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_env$_apmod_extra_msg" >&5 +$as_echo "$enable_env$_apmod_extra_msg" >&6; } + if test "$enable_env" != "no"; then + case "$enable_env" in + shared*) + enable_env=`echo $ac_n $enable_env$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES env" + ;; + *) + MODLIST="$MODLIST env" + if test "env" = "so"; then + sharedobjs=yes + fi + shared="";; + esac + + + if test -z ""; then + objects="mod_env.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + libname="mod_env.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +$as_echo_n "checking whether to enable mod_mime_magic... " >&6; } + # Check whether --enable-mime-magic was given. +if test "${enable_mime_magic+set}" = set; then + enableval=$enable_mime_magic; +else + enable_mime_magic=maybe-all +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_mime_magic" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_mime_magic" = "static"; then + enable_mime_magic=yes + elif test "$enable_mime_magic" = "yes"; then + enable_mime_magic=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_mime_magic" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_mime_magic=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_mime_magic" != "yes"; then + enable_mime_magic=no + fi + elif test "$enable_mime_magic" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_mime_magic=$module_default + _apmod_extra_msg=" (all)" + else + enable_mime_magic=no + fi + fi + if test "$enable_mime_magic" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_mime_magic$_apmod_extra_msg" >&5 +$as_echo "$enable_mime_magic$_apmod_extra_msg" >&6; } + if test "$enable_mime_magic" != "no"; then + case "$enable_mime_magic" in + shared*) + enable_mime_magic=`echo $ac_n $enable_mime_magic$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES mime_magic" + ;; + *) + MODLIST="$MODLIST mime_magic" + if test "mime_magic" = "so"; then + sharedobjs=yes + fi + shared="";; + esac + + + if test -z ""; then + objects="mod_mime_magic.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + libname="mod_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 +$as_echo_n "checking whether to enable mod_cern_meta... " >&6; } + # Check whether --enable-cern-meta was given. +if test "${enable_cern_meta+set}" = set; then + enableval=$enable_cern_meta; +else + enable_cern_meta=maybe-all +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_cern_meta" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_cern_meta" = "static"; then + enable_cern_meta=yes + elif test "$enable_cern_meta" = "yes"; then + enable_cern_meta=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_cern_meta" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_cern_meta=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_cern_meta" != "yes"; then + enable_cern_meta=no + fi + elif test "$enable_cern_meta" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_cern_meta=$module_default + _apmod_extra_msg=" (all)" + else + enable_cern_meta=no + fi + fi + if test "$enable_cern_meta" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_cern_meta$_apmod_extra_msg" >&5 +$as_echo "$enable_cern_meta$_apmod_extra_msg" >&6; } + if test "$enable_cern_meta" != "no"; then + case "$enable_cern_meta" in + shared*) + enable_cern_meta=`echo $ac_n $enable_cern_meta$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES cern_meta" + ;; + *) + MODLIST="$MODLIST cern_meta" + if test "cern_meta" = "so"; then + sharedobjs=yes + fi + shared="";; + esac + + + if test -z ""; then + objects="mod_cern_meta.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + libname="mod_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 +$as_echo_n "checking whether to enable mod_expires... " >&6; } + # Check whether --enable-expires was given. +if test "${enable_expires+set}" = set; then + enableval=$enable_expires; +else + enable_expires=most +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_expires" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_expires" = "static"; then + enable_expires=yes + elif test "$enable_expires" = "yes"; then + enable_expires=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_expires" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_expires=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_expires" != "yes"; then + enable_expires=no + fi + elif test "$enable_expires" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_expires=$module_default + _apmod_extra_msg=" (all)" + else + enable_expires=no + fi + fi + if test "$enable_expires" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_expires$_apmod_extra_msg" >&5 +$as_echo "$enable_expires$_apmod_extra_msg" >&6; } + if test "$enable_expires" != "no"; then + case "$enable_expires" in + shared*) + enable_expires=`echo $ac_n $enable_expires$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES expires" + ;; + *) + MODLIST="$MODLIST expires" + if test "expires" = "so"; then + sharedobjs=yes + fi + shared="";; + esac + + + if test -z ""; then + objects="mod_expires.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + libname="mod_expires.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +$as_echo_n "checking whether to enable mod_headers... " >&6; } + # Check whether --enable-headers was given. +if test "${enable_headers+set}" = set; then + enableval=$enable_headers; +else + enable_headers=most +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_headers" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_headers" = "static"; then + enable_headers=yes + elif test "$enable_headers" = "yes"; then + enable_headers=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_headers" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_headers=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_headers" != "yes"; then + enable_headers=no + fi + elif test "$enable_headers" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_headers=$module_default + _apmod_extra_msg=" (all)" + else + enable_headers=no + fi + fi + if test "$enable_headers" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_headers$_apmod_extra_msg" >&5 +$as_echo "$enable_headers$_apmod_extra_msg" >&6; } + if test "$enable_headers" != "no"; then + case "$enable_headers" in + shared*) + enable_headers=`echo $ac_n $enable_headers$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES headers" + ;; + *) + MODLIST="$MODLIST headers" + if test "headers" = "so"; then + sharedobjs=yes + fi + shared="";; + esac + + + if test -z ""; then + objects="mod_headers.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + libname="mod_headers.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +$as_echo_n "checking whether to enable mod_usertrack... " >&6; } + # Check whether --enable-usertrack was given. +if test "${enable_usertrack+set}" = set; then + enableval=$enable_usertrack; +else + enable_usertrack=maybe-all +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_usertrack" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_usertrack" = "static"; then + enable_usertrack=yes + elif test "$enable_usertrack" = "yes"; then + enable_usertrack=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_usertrack" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_usertrack=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_usertrack" != "yes"; then + enable_usertrack=no + fi + elif test "$enable_usertrack" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_usertrack=$module_default + _apmod_extra_msg=" (all)" + else + enable_usertrack=no + fi + fi + if test "$enable_usertrack" != "no"; then + { $as_echo "$as_me:$LINENO: result: checking dependencies" >&5 +$as_echo "checking dependencies" >&6; } + + +for ac_header in sys/times.h +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 +$as_echo_n "checking $ac_header usability... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 +$as_echo_n "checking $ac_header presence... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + + ;; +esac +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + +fi +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +for ac_func in times +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* 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 $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + + { $as_echo "$as_me:$LINENO: checking whether to enable mod_usertrack" >&5 +$as_echo_n "checking whether to enable mod_usertrack... " >&6; } + if test "$enable_usertrack" = "no"; then + if test "$_apmod_error_fatal" = "no"; then + _apmod_extra_msg=" (disabled)" + else + { { $as_echo "$as_me:$LINENO: error: mod_usertrack has been requested but can not be built due to prerequisite failures" >&5 +$as_echo "$as_me: error: mod_usertrack has been requested but can not be built due to prerequisite failures" >&2;} + { (exit 1); exit 1; }; } + fi + fi + fi + { $as_echo "$as_me:$LINENO: result: $enable_usertrack$_apmod_extra_msg" >&5 +$as_echo "$enable_usertrack$_apmod_extra_msg" >&6; } + if test "$enable_usertrack" != "no"; then + case "$enable_usertrack" in + shared*) + enable_usertrack=`echo $ac_n $enable_usertrack$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES usertrack" + ;; + *) + MODLIST="$MODLIST usertrack" + if test "usertrack" = "so"; then + sharedobjs=yes + fi + shared="";; + esac + + + if test -z ""; then + objects="mod_usertrack.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + libname="mod_usertrack.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +$as_echo_n "checking whether to enable mod_unique_id... " >&6; } + # Check whether --enable-unique-id was given. +if test "${enable_unique_id+set}" = set; then + enableval=$enable_unique_id; +else + enable_unique_id=maybe-all +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_unique_id" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_unique_id" = "static"; then + enable_unique_id=yes + elif test "$enable_unique_id" = "yes"; then + enable_unique_id=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_unique_id" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_unique_id=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_unique_id" != "yes"; then + enable_unique_id=no + fi + elif test "$enable_unique_id" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_unique_id=$module_default + _apmod_extra_msg=" (all)" + else + enable_unique_id=no + fi + fi + if test "$enable_unique_id" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_unique_id$_apmod_extra_msg" >&5 +$as_echo "$enable_unique_id$_apmod_extra_msg" >&6; } + if test "$enable_unique_id" != "no"; then + case "$enable_unique_id" in + shared*) + enable_unique_id=`echo $ac_n $enable_unique_id$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES unique_id" + ;; + *) + MODLIST="$MODLIST unique_id" + if test "unique_id" = "so"; then + sharedobjs=yes + fi + shared="";; + esac + + + if test -z ""; then + objects="mod_unique_id.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + libname="mod_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 +$as_echo_n "checking whether to enable mod_setenvif... " >&6; } + # Check whether --enable-setenvif was given. +if test "${enable_setenvif+set}" = set; then + enableval=$enable_setenvif; +else + enable_setenvif=yes +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_setenvif" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_setenvif" = "static"; then + enable_setenvif=yes + elif test "$enable_setenvif" = "yes"; then + enable_setenvif=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_setenvif" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_setenvif=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_setenvif" != "yes"; then + enable_setenvif=no + fi + elif test "$enable_setenvif" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_setenvif=$module_default + _apmod_extra_msg=" (all)" + else + enable_setenvif=no + fi + fi + if test "$enable_setenvif" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_setenvif$_apmod_extra_msg" >&5 +$as_echo "$enable_setenvif$_apmod_extra_msg" >&6; } + if test "$enable_setenvif" != "no"; then + case "$enable_setenvif" in + shared*) + enable_setenvif=`echo $ac_n $enable_setenvif$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES setenvif" + ;; + *) + MODLIST="$MODLIST setenvif" + if test "setenvif" = "so"; then + sharedobjs=yes + fi + shared="";; + esac + + + if test -z ""; then + objects="mod_setenvif.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + libname="mod_setenvif.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +$as_echo_n "checking whether to enable mod_version... " >&6; } + # Check whether --enable-version was given. +if test "${enable_version+set}" = set; then + enableval=$enable_version; +else + enable_version=maybe-all +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_version" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_version" = "static"; then + enable_version=yes + elif test "$enable_version" = "yes"; then + enable_version=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_version" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_version=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_version" != "yes"; then + enable_version=no + fi + elif test "$enable_version" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_version=$module_default + _apmod_extra_msg=" (all)" + else + enable_version=no + fi + fi + if test "$enable_version" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_version$_apmod_extra_msg" >&5 +$as_echo "$enable_version$_apmod_extra_msg" >&6; } + if test "$enable_version" != "no"; then + case "$enable_version" in + shared*) + enable_version=`echo $ac_n $enable_version$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES version" + ;; + *) + MODLIST="$MODLIST version" + if test "version" = "so"; then + sharedobjs=yes + fi + shared="";; + esac + + + if test -z ""; then + objects="mod_version.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + libname="mod_version.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 + 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= + test -d proxy || $srcdir/build/mkdir.sh $modpath_current + > $modpath_current/modules.mk + + +if test "$enable_proxy" = "shared"; then + proxy_mods_enable=shared +elif test "$enable_proxy" = "yes"; then + proxy_mods_enable=yes +else + proxy_mods_enable=no +fi + +proxy_objs="mod_proxy.lo proxy_util.lo" + + { $as_echo "$as_me:$LINENO: checking whether to enable mod_proxy" >&5 +$as_echo_n "checking whether to enable mod_proxy... " >&6; } + # Check whether --enable-proxy was given. +if test "${enable_proxy+set}" = set; then + enableval=$enable_proxy; +else + enable_proxy=$proxy_mods_enable +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_proxy" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_proxy" = "static"; then + enable_proxy=yes + elif test "$enable_proxy" = "yes"; then + enable_proxy=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_proxy" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_proxy=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_proxy" != "yes"; then + enable_proxy=no + fi + elif test "$enable_proxy" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_proxy=$module_default + _apmod_extra_msg=" (all)" + else + enable_proxy=no + fi + fi + if test "$enable_proxy" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_proxy$_apmod_extra_msg" >&5 +$as_echo "$enable_proxy$_apmod_extra_msg" >&6; } + if test "$enable_proxy" != "no"; then + case "$enable_proxy" in + shared*) + enable_proxy=`echo $ac_n $enable_proxy$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES proxy" + ;; + *) + MODLIST="$MODLIST proxy" + if test "proxy" = "so"; then + sharedobjs=yes + fi + shared="";; + 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 + libname="mod_proxy.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +$as_echo_n "checking whether to enable mod_proxy_connect... " >&6; } + # Check whether --enable-proxy-connect was given. +if test "${enable_proxy_connect+set}" = set; then + enableval=$enable_proxy_connect; +else + enable_proxy_connect=$proxy_mods_enable +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_proxy_connect" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_proxy_connect" = "static"; then + enable_proxy_connect=yes + elif test "$enable_proxy_connect" = "yes"; then + enable_proxy_connect=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_proxy_connect" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_proxy_connect=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_proxy_connect" != "yes"; then + enable_proxy_connect=no + fi + elif test "$enable_proxy_connect" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_proxy_connect=$module_default + _apmod_extra_msg=" (all)" + else + enable_proxy_connect=no + fi + fi + if test "$enable_proxy_connect" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_proxy_connect$_apmod_extra_msg" >&5 +$as_echo "$enable_proxy_connect$_apmod_extra_msg" >&6; } + if test "$enable_proxy_connect" != "no"; then + case "$enable_proxy_connect" in + shared*) + enable_proxy_connect=`echo $ac_n $enable_proxy_connect$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES proxy_connect" + ;; + *) + MODLIST="$MODLIST proxy_connect" + if test "proxy_connect" = "so"; then + sharedobjs=yes + fi + shared="";; + 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 + libname="mod_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 +$as_echo_n "checking whether to enable mod_proxy_ftp... " >&6; } + # Check whether --enable-proxy-ftp was given. +if test "${enable_proxy_ftp+set}" = set; then + enableval=$enable_proxy_ftp; +else + enable_proxy_ftp=$proxy_mods_enable +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_proxy_ftp" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_proxy_ftp" = "static"; then + enable_proxy_ftp=yes + elif test "$enable_proxy_ftp" = "yes"; then + enable_proxy_ftp=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_proxy_ftp" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_proxy_ftp=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_proxy_ftp" != "yes"; then + enable_proxy_ftp=no + fi + elif test "$enable_proxy_ftp" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_proxy_ftp=$module_default + _apmod_extra_msg=" (all)" + else + enable_proxy_ftp=no + fi + fi + if test "$enable_proxy_ftp" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_proxy_ftp$_apmod_extra_msg" >&5 +$as_echo "$enable_proxy_ftp$_apmod_extra_msg" >&6; } + if test "$enable_proxy_ftp" != "no"; then + case "$enable_proxy_ftp" in + shared*) + enable_proxy_ftp=`echo $ac_n $enable_proxy_ftp$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES proxy_ftp" + ;; + *) + MODLIST="$MODLIST proxy_ftp" + if test "proxy_ftp" = "so"; then + sharedobjs=yes + fi + shared="";; + 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 + libname="mod_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 +$as_echo_n "checking whether to enable mod_proxy_http... " >&6; } + # Check whether --enable-proxy-http was given. +if test "${enable_proxy_http+set}" = set; then + enableval=$enable_proxy_http; +else + enable_proxy_http=$proxy_mods_enable +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_proxy_http" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_proxy_http" = "static"; then + enable_proxy_http=yes + elif test "$enable_proxy_http" = "yes"; then + enable_proxy_http=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_proxy_http" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_proxy_http=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_proxy_http" != "yes"; then + enable_proxy_http=no + fi + elif test "$enable_proxy_http" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_proxy_http=$module_default + _apmod_extra_msg=" (all)" + else + enable_proxy_http=no + fi + fi + if test "$enable_proxy_http" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_proxy_http$_apmod_extra_msg" >&5 +$as_echo "$enable_proxy_http$_apmod_extra_msg" >&6; } + if test "$enable_proxy_http" != "no"; then + case "$enable_proxy_http" in + shared*) + enable_proxy_http=`echo $ac_n $enable_proxy_http$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES proxy_http" + ;; + *) + MODLIST="$MODLIST proxy_http" + if test "proxy_http" = "so"; then + sharedobjs=yes + fi + shared="";; + 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 + libname="mod_proxy_http.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 + 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= + test -d ssl || $srcdir/build/mkdir.sh $modpath_current + > $modpath_current/modules.mk + + +ssl_objs="mod_ssl.lo ssl_engine_config.lo ssl_engine_dh.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_expr.lo ssl_expr_eval.lo ssl_expr_parse.lo ssl_expr_scan.lo ssl_scache.lo ssl_scache_dbm.lo ssl_scache_shmcb.lo ssl_scache_shmht.lo ssl_util.lo ssl_util_ssl.lo ssl_util_table.lo " + + { $as_echo "$as_me:$LINENO: checking whether to enable mod_ssl" >&5 +$as_echo_n "checking whether to enable mod_ssl... " >&6; } + # Check whether --enable-ssl was given. +if test "${enable_ssl+set}" = set; then + enableval=$enable_ssl; +else + enable_ssl=no +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_ssl" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_ssl" = "static"; then + enable_ssl=yes + elif test "$enable_ssl" = "yes"; then + enable_ssl=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_ssl" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_ssl=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_ssl" != "yes"; then + enable_ssl=no + fi + elif test "$enable_ssl" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_ssl=$module_default + _apmod_extra_msg=" (all)" + else + enable_ssl=no + fi + fi + if test "$enable_ssl" != "no"; then + { $as_echo "$as_me:$LINENO: result: checking dependencies" >&5 +$as_echo "checking dependencies" >&6; } + + +if test "x$ap_ssltk_base" = "x"; then + { $as_echo "$as_me:$LINENO: checking for SSL/TLS toolkit base" >&5 +$as_echo_n "checking for SSL/TLS toolkit base... " >&6; } + ap_ssltk_base="" + +# Check whether --with-ssl was given. +if test "${with_ssl+set}" = set; then + withval=$with_ssl; + if test "x$withval" != "xyes" -a "x$withval" != "x"; then + ap_ssltk_base="$withval" + if test -f "$ap_ssltk_base/bin/openssl"; then + ap_ssltk_version="`$ap_ssltk_base/bin/openssl version`" + else + ap_ssltk_version="unknown" + fi + fi + +fi + + if test "x$ap_ssltk_base" = "x"; then + if test "${ap_cv_ssltk+set}" = set; then + $as_echo_n "(cached) " >&6 +else + + # + # shotgun approach: find all occurrences of the openssl program + # + # The IFS=... trick eliminates the colons from $PATH, without using an external program + for p in `IFS=":$IFS"; echo $PATH` /usr/local/openssl/bin /usr/local/ssl/bin; do + if test -f "$p/openssl"; then + ap_ssltk_version="`$p/openssl version`" + if test "x$ap_ssltk_version" != "x"; then + ap_cv_ssltk="`(cd $p/.. && pwd)`" + break + fi + fi + done + if test "x$ap_cv_ssltk" = "x"; then + { { $as_echo "$as_me:$LINENO: error: requires OpenSSL 0.9.6e or higher" >&5 +$as_echo "$as_me: error: requires OpenSSL 0.9.6e or higher" >&2;} + { (exit 1); exit 1; }; } + fi + +fi + + ap_ssltk_base="$ap_cv_ssltk" + fi + if test ! -d $ap_ssltk_base; then + { { $as_echo "$as_me:$LINENO: error: invalid SSL/TLS toolkit base directory $ap_ssltk_base" >&5 +$as_echo "$as_me: error: invalid SSL/TLS toolkit base directory $ap_ssltk_base" >&2;} + { (exit 1); exit 1; }; } + fi + { $as_echo "$as_me:$LINENO: result: $ap_ssltk_base" >&5 +$as_echo "$ap_ssltk_base" >&6; } + + { $as_echo "$as_me:$LINENO: checking for SSL/TLS toolkit version" >&5 +$as_echo_n "checking for SSL/TLS toolkit version... " >&6; } + { $as_echo "$as_me:$LINENO: result: $ap_ssltk_version" >&5 +$as_echo "$ap_ssltk_version" >&6; } + case "$ap_ssltk_version" in + "OpenSSL "[1-9]* | \ + "OpenSSL "0.9.6[e-z]* | \ + "OpenSSL "0.9.[7-9]* | \ + "OpenSSL "0.[1-9][0-9]* ) + # okay versions that do not have known security holes + ;; + "OpenSSL"*) + { $as_echo "$as_me:$LINENO: WARNING: OpenSSL versions prior to 0.9.6e have known security holes" >&5 +$as_echo "$as_me: WARNING: OpenSSL versions prior to 0.9.6e have known security holes" >&2;} + ;; + *) + # unknown version -- assume the user knows what they are doing + ;; + esac + + { $as_echo "$as_me:$LINENO: checking for SSL/TLS toolkit includes" >&5 +$as_echo_n "checking for SSL/TLS toolkit includes... " >&6; } + ap_ssltk_incdir="" + for p in $ap_ssltk_base/include /usr/local/openssl/include \ + /usr/local/ssl/include /usr/local/include /usr/include; do + if test -f "$p/openssl/ssl.h"; then + ap_ssltk_incdir="$p" + break + elif test -f "$p/ssl.h"; then + ap_ssltk_incdir="$p" + break + fi + done + if test "x$ap_ssltk_incdir" = "x"; then + { { $as_echo "$as_me:$LINENO: error: OpenSSL headers not found" >&5 +$as_echo "$as_me: error: OpenSSL headers not found" >&2;} + { (exit 1); exit 1; }; } + fi + { $as_echo "$as_me:$LINENO: result: $ap_ssltk_incdir" >&5 +$as_echo "$ap_ssltk_incdir" >&6; } + + { $as_echo "$as_me:$LINENO: checking for SSL/TLS toolkit libraries" >&5 +$as_echo_n "checking for SSL/TLS toolkit libraries... " >&6; } + ap_ssltk_libdir="" + for p in $ap_ssltk_base/lib /usr/local/openssl/lib \ + /usr/local/ssl/lib /usr/local/lib /usr/lib /lib /usr/lib64; do + if test -f "$p/libssl.a" -o -f "$p/libssl.so" -o -f "$p/libssl.dylib"; then + ap_ssltk_libdir="$p" + break + fi + done + if test ".$ap_ssltk_libdir" = .; then + { { $as_echo "$as_me:$LINENO: error: OpenSSL libraries not found" >&5 +$as_echo "$as_me: error: OpenSSL libraries not found" >&2;} + { (exit 1); exit 1; }; } + fi + { $as_echo "$as_me:$LINENO: result: $ap_ssltk_libdir" >&5 +$as_echo "$ap_ssltk_libdir" >&6; } + + + if test "x$INCLUDES" = "x"; then + echo " setting INCLUDES to \"-I$ap_ssltk_incdir/openssl\"" + INCLUDES="-I$ap_ssltk_incdir/openssl" + else + apr_addto_bugger="-I$ap_ssltk_incdir/openssl" + 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 + echo " adding \"$i\" to INCLUDES" + INCLUDES="$INCLUDES $i" + fi + done + fi + + if test "x$ap_ssltk_incdir" != "x/usr/include"; then + + if test "x$INCLUDES" = "x"; then + echo " setting INCLUDES to \"-I$ap_ssltk_incdir\"" + INCLUDES="-I$ap_ssltk_incdir" + else + apr_addto_bugger="-I$ap_ssltk_incdir" + 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 + echo " adding \"$i\" to INCLUDES" + INCLUDES="$INCLUDES $i" + fi + done + fi + + fi + if test "x$ap_ssltk_libdir" != "x/usr/lib"; then + + if test "x$LDFLAGS" = "x"; then + echo " setting LDFLAGS to \"-L$ap_ssltk_libdir\"" + LDFLAGS="-L$ap_ssltk_libdir" + else + apr_addto_bugger="-L$ap_ssltk_libdir" + 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 + echo " adding \"$i\" to LDFLAGS" + LDFLAGS="$LDFLAGS $i" + fi + done + fi + + if test "x$ap_platform_runtime_link_flag" != "x"; then + + if test "x$LDFLAGS" = "x"; then + echo " setting LDFLAGS to \"$ap_platform_runtime_link_flag$ap_ssltk_libdir\"" + LDFLAGS="$ap_platform_runtime_link_flag$ap_ssltk_libdir" + else + apr_addto_bugger="$ap_platform_runtime_link_flag$ap_ssltk_libdir" + 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 + echo " adding \"$i\" to LDFLAGS" + LDFLAGS="$LDFLAGS $i" + fi + done + fi + + fi + fi + # Put SSL libraries in SSL_LIBS. + + echo " forcing SSL_LIBS to \"-lssl -lcrypto\"" + SSL_LIBS="-lssl -lcrypto" + + pkg-config openssl 2> /dev/null + if test $? -eq 0; then + ap_ssltk_incdep=`pkg-config --cflags-only-I openssl` + + if test "x$INCLUDES" = "x"; then + echo " setting INCLUDES to \"$ap_ssltk_incdep\"" + INCLUDES="$ap_ssltk_incdep" + else + apr_addto_bugger="$ap_ssltk_incdep" + 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 + echo " adding \"$i\" to INCLUDES" + INCLUDES="$INCLUDES $i" + fi + done + fi + + ap_ssltk_libdep=`pkg-config --libs openssl` + + echo " forcing SSL_LIBS to \"$ap_ssltk_libdep\"" + SSL_LIBS="$ap_ssltk_libdep" + + fi + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST SSL_LIBS" + + + ap_cv_ssltk="$ap_ssltk_base" +fi + + + echo " forcing MOD_SSL_LDADD to \"\$(SSL_LIBS)\"" + MOD_SSL_LDADD="\$(SSL_LIBS)" + + +for ac_func in SSL_set_state +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* 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 $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + +for ac_func in SSL_set_cert_store +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* 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 $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + + { $as_echo "$as_me:$LINENO: checking whether to enable mod_ssl" >&5 +$as_echo_n "checking whether to enable mod_ssl... " >&6; } + if test "$enable_ssl" = "no"; then + if test "$_apmod_error_fatal" = "no"; then + _apmod_extra_msg=" (disabled)" + else + { { $as_echo "$as_me:$LINENO: error: mod_ssl has been requested but can not be built due to prerequisite failures" >&5 +$as_echo "$as_me: error: mod_ssl has been requested but can not be built due to prerequisite failures" >&2;} + { (exit 1); exit 1; }; } + fi + fi + fi + { $as_echo "$as_me:$LINENO: result: $enable_ssl$_apmod_extra_msg" >&5 +$as_echo "$enable_ssl$_apmod_extra_msg" >&6; } + if test "$enable_ssl" != "no"; then + case "$enable_ssl" in + shared*) + enable_ssl=`echo $ac_n $enable_ssl$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES ssl" + ;; + *) + MODLIST="$MODLIST ssl" + if test "ssl" = "so"; then + sharedobjs=yes + fi + shared="";; + 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 + libname="mod_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 + 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= + test -d test || $srcdir/build/mkdir.sh $modpath_current + > $modpath_current/modules.mk + + + + { $as_echo "$as_me:$LINENO: checking whether to enable mod_optional_hook_export" >&5 +$as_echo_n "checking whether to enable mod_optional_hook_export... " >&6; } + # Check whether --enable-optional-hook-export was given. +if test "${enable_optional_hook_export+set}" = set; then + enableval=$enable_optional_hook_export; +else + enable_optional_hook_export=no +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_optional_hook_export" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_optional_hook_export" = "static"; then + enable_optional_hook_export=yes + elif test "$enable_optional_hook_export" = "yes"; then + enable_optional_hook_export=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_optional_hook_export" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_optional_hook_export=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_optional_hook_export" != "yes"; then + enable_optional_hook_export=no + fi + elif test "$enable_optional_hook_export" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_optional_hook_export=$module_default + _apmod_extra_msg=" (all)" + else + enable_optional_hook_export=no + fi + fi + if test "$enable_optional_hook_export" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_optional_hook_export$_apmod_extra_msg" >&5 +$as_echo "$enable_optional_hook_export$_apmod_extra_msg" >&6; } + if test "$enable_optional_hook_export" != "no"; then + case "$enable_optional_hook_export" in + shared*) + enable_optional_hook_export=`echo $ac_n $enable_optional_hook_export$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES optional_hook_export" + ;; + *) + MODLIST="$MODLIST optional_hook_export" + if test "optional_hook_export" = "so"; then + sharedobjs=yes + fi + shared="";; + 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 + libname="mod_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 +$as_echo_n "checking whether to enable mod_optional_hook_import... " >&6; } + # Check whether --enable-optional-hook-import was given. +if test "${enable_optional_hook_import+set}" = set; then + enableval=$enable_optional_hook_import; +else + enable_optional_hook_import=no +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_optional_hook_import" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_optional_hook_import" = "static"; then + enable_optional_hook_import=yes + elif test "$enable_optional_hook_import" = "yes"; then + enable_optional_hook_import=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_optional_hook_import" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_optional_hook_import=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_optional_hook_import" != "yes"; then + enable_optional_hook_import=no + fi + elif test "$enable_optional_hook_import" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_optional_hook_import=$module_default + _apmod_extra_msg=" (all)" + else + enable_optional_hook_import=no + fi + fi + if test "$enable_optional_hook_import" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_optional_hook_import$_apmod_extra_msg" >&5 +$as_echo "$enable_optional_hook_import$_apmod_extra_msg" >&6; } + if test "$enable_optional_hook_import" != "no"; then + case "$enable_optional_hook_import" in + shared*) + enable_optional_hook_import=`echo $ac_n $enable_optional_hook_import$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES optional_hook_import" + ;; + *) + MODLIST="$MODLIST optional_hook_import" + if test "optional_hook_import" = "so"; then + sharedobjs=yes + fi + shared="";; + 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 + libname="mod_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 +$as_echo_n "checking whether to enable mod_optional_fn_import... " >&6; } + # Check whether --enable-optional-fn-import was given. +if test "${enable_optional_fn_import+set}" = set; then + enableval=$enable_optional_fn_import; +else + enable_optional_fn_import=no +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_optional_fn_import" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_optional_fn_import" = "static"; then + enable_optional_fn_import=yes + elif test "$enable_optional_fn_import" = "yes"; then + enable_optional_fn_import=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_optional_fn_import" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_optional_fn_import=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_optional_fn_import" != "yes"; then + enable_optional_fn_import=no + fi + elif test "$enable_optional_fn_import" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_optional_fn_import=$module_default + _apmod_extra_msg=" (all)" + else + enable_optional_fn_import=no + fi + fi + if test "$enable_optional_fn_import" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_optional_fn_import$_apmod_extra_msg" >&5 +$as_echo "$enable_optional_fn_import$_apmod_extra_msg" >&6; } + if test "$enable_optional_fn_import" != "no"; then + case "$enable_optional_fn_import" in + shared*) + enable_optional_fn_import=`echo $ac_n $enable_optional_fn_import$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES optional_fn_import" + ;; + *) + MODLIST="$MODLIST optional_fn_import" + if test "optional_fn_import" = "so"; then + sharedobjs=yes + fi + shared="";; + 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 + libname="mod_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 +$as_echo_n "checking whether to enable mod_optional_fn_export... " >&6; } + # Check whether --enable-optional-fn-export was given. +if test "${enable_optional_fn_export+set}" = set; then + enableval=$enable_optional_fn_export; +else + enable_optional_fn_export=no +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_optional_fn_export" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_optional_fn_export" = "static"; then + enable_optional_fn_export=yes + elif test "$enable_optional_fn_export" = "yes"; then + enable_optional_fn_export=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_optional_fn_export" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_optional_fn_export=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_optional_fn_export" != "yes"; then + enable_optional_fn_export=no + fi + elif test "$enable_optional_fn_export" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_optional_fn_export=$module_default + _apmod_extra_msg=" (all)" + else + enable_optional_fn_export=no + fi + fi + if test "$enable_optional_fn_export" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_optional_fn_export$_apmod_extra_msg" >&5 +$as_echo "$enable_optional_fn_export$_apmod_extra_msg" >&6; } + if test "$enable_optional_fn_export" != "no"; then + case "$enable_optional_fn_export" in + shared*) + enable_optional_fn_export=`echo $ac_n $enable_optional_fn_export$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES optional_fn_export" + ;; + *) + MODLIST="$MODLIST optional_fn_export" + if test "optional_fn_export" = "so"; then + sharedobjs=yes + fi + shared="";; + 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 + libname="mod_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 +$as_echo_n "checking whether to enable mod_bucketeer... " >&6; } + # Check whether --enable-bucketeer was given. +if test "${enable_bucketeer+set}" = set; then + enableval=$enable_bucketeer; +else + enable_bucketeer=no +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_bucketeer" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_bucketeer" = "static"; then + enable_bucketeer=yes + elif test "$enable_bucketeer" = "yes"; then + enable_bucketeer=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_bucketeer" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_bucketeer=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_bucketeer" != "yes"; then + enable_bucketeer=no + fi + elif test "$enable_bucketeer" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_bucketeer=$module_default + _apmod_extra_msg=" (all)" + else + enable_bucketeer=no + fi + fi + if test "$enable_bucketeer" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_bucketeer$_apmod_extra_msg" >&5 +$as_echo "$enable_bucketeer$_apmod_extra_msg" >&6; } + if test "$enable_bucketeer" != "no"; then + case "$enable_bucketeer" in + shared*) + enable_bucketeer=`echo $ac_n $enable_bucketeer$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES bucketeer" + ;; + *) + MODLIST="$MODLIST bucketeer" + if test "bucketeer" = "so"; then + sharedobjs=yes + fi + shared="";; + esac + + + if test -z ""; then + objects="mod_bucketeer.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + libname="mod_bucketeer.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 + 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 "$OS" = "beos" ; then + + if test "x$CFLAGS" = "x"; then + echo " setting CFLAGS to \"-DBEOS\"" + CFLAGS="-DBEOS" + else + apr_addto_bugger="-DBEOS" + 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 + echo " adding \"$i\" to CFLAGS" + CFLAGS="$CFLAGS $i" + fi + done + fi + +fi + +{ $as_echo "$as_me:$LINENO: checking for target platform" >&5 +$as_echo_n "checking for target platform... " >&6; } + +case $host in +*beos*) + OS="beos" + OS_DIR=$OS + ;; +*pc-os2_emx*) + OS="os2" + OS_DIR=$OS + ;; +bs2000*) + OS="unix" + OS_DIR=bs2000 # only the OS_DIR is platform specific. + ;; +*cygwin*) + OS="cygwin" + OS_DIR="unix" + ;; +*) + OS="unix" + OS_DIR=$OS;; +esac + +{ $as_echo "$as_me:$LINENO: result: $OS" >&5 +$as_echo "$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 + 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 + echo " adding \"$i\" to CFLAGS" + CFLAGS="$CFLAGS $i" + fi + done + fi + +fi + +if test "$OS" = "unix" ; then + + { $as_echo "$as_me:$LINENO: checking for rlim_t" >&5 +$as_echo_n "checking for rlim_t... " >&6; } +if test "${ac_cv_type_rlim_t+set}" = set; then + $as_echo_n "(cached) " >&6 +else + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#include +#include + +int +main () +{ +rlim_t spoon; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + + ac_cv_type_rlim_t=yes + +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_type_rlim_t=no + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_rlim_t" >&5 +$as_echo "$ac_cv_type_rlim_t" >&6; } + if test "$ac_cv_type_rlim_t" = "no" ; then + +cat >>confdefs.h <<\_ACEOF +#define rlim_t int +_ACEOF + + fi + + + + + + +for ac_header in sys/time.h sys/resource.h sys/sem.h sys/ipc.h +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 +$as_echo_n "checking $ac_header usability... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 +$as_echo_n "checking $ac_header presence... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + + ;; +esac +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + +fi +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + + +for ac_func in setsid killpg +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* 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 $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + +fi + + + + + +for ac_header in bstring.h unistd.h +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 +$as_echo_n "checking $ac_header usability... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 +$as_echo_n "checking $ac_header presence... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + + ;; +esac +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + +fi +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + + + +for ac_func in syslog +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* 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 $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + + +for ac_header in sys/times.h +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 +$as_echo_n "checking $ac_header usability... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 +$as_echo_n "checking $ac_header presence... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + + ;; +esac +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + +fi +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +for ac_func in times +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* 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 $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + +{ $as_echo "$as_me:$LINENO: checking which MPM to use" >&5 +$as_echo_n "checking which MPM to use... " >&6; } + +# Check whether --with-mpm was given. +if test "${with_mpm+set}" = set; then + withval=$with_mpm; + APACHE_MPM=$withval + +else + + if test "x$APACHE_MPM" = "x"; then + APACHE_MPM=prefork + fi + +fi + +{ $as_echo "$as_me:$LINENO: result: $APACHE_MPM" >&5 +$as_echo "$APACHE_MPM" >&6; } + +apache_cv_mpm=$APACHE_MPM + +if test "$apache_cv_mpm" = "worker" -o "$apache_cv_mpm" = "perchild" -o "$apache_cv_mpm" = "leader" -o "$apache_cv_mpm" = "threadpool" ; then + +apr_old_cppflags=$CPPFLAGS +CPPFLAGS="$CPPFLAGS $INCLUDES" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#if APR_HAS_THREADS +YES_IS_DEFINED +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "YES_IS_DEFINED" >/dev/null 2>&1; then + ac_cv_define_APR_HAS_THREADS=yes +else + ac_cv_define_APR_HAS_THREADS=no +fi +rm -f conftest* + +CPPFLAGS=$apr_old_cppflags + + + if test "x$ac_cv_define_APR_HAS_THREADS" = "xno"; then + { $as_echo "$as_me:$LINENO: result: The currently selected MPM requires threads which your system seems to lack" >&5 +$as_echo "The currently selected MPM requires threads which your system seems to lack" >&6; } + { $as_echo "$as_me:$LINENO: checking checking for replacement" >&5 +$as_echo_n "checking checking for replacement... " >&6; } + { $as_echo "$as_me:$LINENO: result: prefork selected" >&5 +$as_echo "prefork selected" >&6; } + apache_cv_mpm=prefork + fi +fi + + + APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES server/mpm/Makefile" + + +MPM_NAME=$apache_cv_mpm +if test "$MPM_NAME" = "leader" -o "$MPM_NAME" = "threadpool" -o "$MPM_NAME" = "perchild"; then + { $as_echo "$as_me:$LINENO: WARNING: You have selected an EXPERIMENTAL MPM. Be warned!" >&5 +$as_echo "$as_me: WARNING: You have selected an EXPERIMENTAL MPM. Be warned!" >&2;} + MPM_SUBDIR_NAME=experimental/$MPM_NAME +else + MPM_SUBDIR_NAME=$MPM_NAME +fi +MPM_DIR=server/mpm/$MPM_SUBDIR_NAME +MPM_LIB=$MPM_DIR/lib${MPM_NAME}.la + +if test ! -f "$abs_srcdir/$MPM_DIR/mpm.h"; then + { { $as_echo "$as_me:$LINENO: error: the selected mpm -- $apache_cv_mpm -- is not supported" >&5 +$as_echo "$as_me: error: the selected mpm -- $apache_cv_mpm -- is not supported" >&2;} + { (exit 1); exit 1; }; } +fi + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST MPM_NAME" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST MPM_SUBDIR_NAME" + + +MODLIST="$MODLIST mpm_${MPM_NAME}" + + +if test "$MPM_NAME" = "prefork" ; then + + APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES server/mpm/$MPM_NAME/Makefile" + +fi + +htpasswd_LTFLAGS="" +htdigest_LTFLAGS="" +rotatelogs_LTFLAGS="" +logresolve_LTFLAGS="" +htdbm_LTFLAGS="" +ab_LTFLAGS="" +checkgid_LTFLAGS="" + +# Check whether --enable-static-support was given. +if test "${enable_static_support+set}" = set; then + enableval=$enable_static_support; +if test "$enableval" = "yes" ; then + + if test "x$htpasswd_LTFLAGS" = "x"; then + 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 + echo " adding \"$i\" to htpasswd_LTFLAGS" + htpasswd_LTFLAGS="$htpasswd_LTFLAGS $i" + fi + done + fi + + + if test "x$htdigest_LTFLAGS" = "x"; then + 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 + echo " adding \"$i\" to htdigest_LTFLAGS" + htdigest_LTFLAGS="$htdigest_LTFLAGS $i" + fi + done + fi + + + if test "x$rotatelogs_LTFLAGS" = "x"; then + 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 + echo " adding \"$i\" to rotatelogs_LTFLAGS" + rotatelogs_LTFLAGS="$rotatelogs_LTFLAGS $i" + fi + done + fi + + + if test "x$logresolve_LTFLAGS" = "x"; then + 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 + echo " adding \"$i\" to logresolve_LTFLAGS" + logresolve_LTFLAGS="$logresolve_LTFLAGS $i" + fi + done + fi + + + if test "x$htdbm_LTFLAGS" = "x"; then + 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 + echo " adding \"$i\" to htdbm_LTFLAGS" + htdbm_LTFLAGS="$htdbm_LTFLAGS $i" + fi + done + fi + + + if test "x$ab_LTFLAGS" = "x"; then + 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 + echo " adding \"$i\" to ab_LTFLAGS" + ab_LTFLAGS="$ab_LTFLAGS $i" + fi + done + fi + + + if test "x$checkgid_LTFLAGS" = "x"; then + 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 + echo " adding \"$i\" to checkgid_LTFLAGS" + checkgid_LTFLAGS="$checkgid_LTFLAGS $i" + fi + done + fi + +fi + +fi + + +# Check whether --enable-static-htpasswd was given. +if test "${enable_static_htpasswd+set}" = set; then + enableval=$enable_static_htpasswd; +if test "$enableval" = "yes" ; then + + if test "x$htpasswd_LTFLAGS" = "x"; then + 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 + echo " adding \"$i\" to htpasswd_LTFLAGS" + htpasswd_LTFLAGS="$htpasswd_LTFLAGS $i" + fi + done + fi + +else + + if test "x$htpasswd_LTFLAGS" = "x-static"; then + 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 + 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+set}" = set; then + enableval=$enable_static_htdigest; +if test "$enableval" = "yes" ; then + + if test "x$htdigest_LTFLAGS" = "x"; then + 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 + echo " adding \"$i\" to htdigest_LTFLAGS" + htdigest_LTFLAGS="$htdigest_LTFLAGS $i" + fi + done + fi + +else + + if test "x$htdigest_LTFLAGS" = "x-static"; then + 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 + 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+set}" = set; then + enableval=$enable_static_rotatelogs; +if test "$enableval" = "yes" ; then + + if test "x$rotatelogs_LTFLAGS" = "x"; then + 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 + echo " adding \"$i\" to rotatelogs_LTFLAGS" + rotatelogs_LTFLAGS="$rotatelogs_LTFLAGS $i" + fi + done + fi + +else + + if test "x$rotatelogs_LTFLAGS" = "x-static"; then + 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 + 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+set}" = set; then + enableval=$enable_static_logresolve; +if test "$enableval" = "yes" ; then + + if test "x$logresolve_LTFLAGS" = "x"; then + 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 + echo " adding \"$i\" to logresolve_LTFLAGS" + logresolve_LTFLAGS="$logresolve_LTFLAGS $i" + fi + done + fi + +else + + if test "x$logresolve_LTFLAGS" = "x-static"; then + 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 + 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+set}" = set; then + enableval=$enable_static_htdbm; +if test "$enableval" = "yes" ; then + + if test "x$htdbm_LTFLAGS" = "x"; then + 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 + echo " adding \"$i\" to htdbm_LTFLAGS" + htdbm_LTFLAGS="$htdbm_LTFLAGS $i" + fi + done + fi + +else + + if test "x$htdbm_LTFLAGS" = "x-static"; then + 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 + 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+set}" = set; then + enableval=$enable_static_ab; +if test "$enableval" = "yes" ; then + + if test "x$ab_LTFLAGS" = "x"; then + 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 + echo " adding \"$i\" to ab_LTFLAGS" + ab_LTFLAGS="$ab_LTFLAGS $i" + fi + done + fi + +else + + if test "x$ab_LTFLAGS" = "x-static"; then + 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 + 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+set}" = set; then + enableval=$enable_static_checkgid; +if test "$enableval" = "yes" ; then + + if test "x$checkgid_LTFLAGS" = "x"; then + 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 + echo " adding \"$i\" to checkgid_LTFLAGS" + checkgid_LTFLAGS="$checkgid_LTFLAGS $i" + fi + done + fi + +else + + if test "x$checkgid_LTFLAGS" = "x-static"; then + 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 + echo " removed \"-static\" from checkgid_LTFLAGS" + checkgid_LTFLAGS=$apr_new_bugger + fi + fi + +fi + +fi + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST checkgid_LTFLAGS" + + + +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 ; then + APACHECTL_ULIMIT="ulimit -S -n \`ulimit -H -n\`" + else + APACHECTL_ULIMIT="" + fi + ;; +esac + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST APACHECTL_ULIMIT" + + + + + + current_dir=http + modpath_current=modules/http + modpath_static= + modpath_shared= + test -d http || $srcdir/build/mkdir.sh $modpath_current + > $modpath_current/modules.mk + + +http_objects="http_core.lo http_protocol.lo http_request.lo" + +if test "$enable_http" = "yes"; then + enable_http="static" +elif test "$enable_http" = "shared"; then + { { $as_echo "$as_me:$LINENO: error: mod_http can not be built as a shared DSO" >&5 +$as_echo "$as_me: error: mod_http can not be built as a shared DSO" >&2;} + { (exit 1); exit 1; }; } +fi + + + { $as_echo "$as_me:$LINENO: checking whether to enable mod_http" >&5 +$as_echo_n "checking whether to enable mod_http... " >&6; } + # Check whether --enable-http was given. +if test "${enable_http+set}" = set; then + enableval=$enable_http; +else + enable_http=static +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_http" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_http" = "static"; then + enable_http=yes + elif test "$enable_http" = "yes"; then + enable_http=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_http" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_http=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_http" != "yes"; then + enable_http=no + fi + elif test "$enable_http" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_http=$module_default + _apmod_extra_msg=" (all)" + else + enable_http=no + fi + fi + if test "$enable_http" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_http$_apmod_extra_msg" >&5 +$as_echo "$enable_http$_apmod_extra_msg" >&6; } + if test "$enable_http" != "no"; then + case "$enable_http" in + shared*) + enable_http=`echo $ac_n $enable_http$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES http" + ;; + *) + MODLIST="$MODLIST http" + if test "http" = "so"; then + sharedobjs=yes + fi + shared="";; + 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 + libname="mod_http.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +$as_echo_n "checking whether to enable mod_mime... " >&6; } + # Check whether --enable-mime was given. +if test "${enable_mime+set}" = set; then + enableval=$enable_mime; +else + enable_mime=yes +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_mime" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_mime" = "static"; then + enable_mime=yes + elif test "$enable_mime" = "yes"; then + enable_mime=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_mime" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_mime=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_mime" != "yes"; then + enable_mime=no + fi + elif test "$enable_mime" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_mime=$module_default + _apmod_extra_msg=" (all)" + else + enable_mime=no + fi + fi + if test "$enable_mime" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_mime$_apmod_extra_msg" >&5 +$as_echo "$enable_mime$_apmod_extra_msg" >&6; } + if test "$enable_mime" != "no"; then + case "$enable_mime" in + shared*) + enable_mime=`echo $ac_n $enable_mime$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES mime" + ;; + *) + MODLIST="$MODLIST mime" + if test "mime" = "so"; then + sharedobjs=yes + fi + shared="";; + esac + + + if test -z ""; then + objects="mod_mime.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + libname="mod_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 + 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" + + + +{ $as_echo "$as_me:$LINENO: checking for extra modules" >&5 +$as_echo_n "checking for extra modules... " >&6; } + +# Check whether --with-module was given. +if test "${with_module+set}" = set; then + withval=$with_module; + as_save_IFS="$IFS"; IFS="," + 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" + libname="mod_$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 + { $as_echo "$as_me:$LINENO: result: added:$EXTRA_MODLIST" >&5 +$as_echo "added:$EXTRA_MODLIST" >&6; } + fi + IFS="$as_save_IFS" + +else + { $as_echo "$as_me:$LINENO: result: none" >&5 +$as_echo "none" >&6; } + +fi + + + + + current_dir=dav/main + modpath_current=modules/dav/main + modpath_static= + modpath_shared= + 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 + + + { $as_echo "$as_me:$LINENO: checking whether to enable mod_dav" >&5 +$as_echo_n "checking whether to enable mod_dav... " >&6; } + # Check whether --enable-dav was given. +if test "${enable_dav+set}" = set; then + enableval=$enable_dav; +else + enable_dav=$dav_enable +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_dav" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_dav" = "static"; then + enable_dav=yes + elif test "$enable_dav" = "yes"; then + enable_dav=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_dav" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_dav=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_dav" != "yes"; then + enable_dav=no + fi + elif test "$enable_dav" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_dav=$module_default + _apmod_extra_msg=" (all)" + else + enable_dav=no + fi + fi + if test "$enable_dav" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_dav$_apmod_extra_msg" >&5 +$as_echo "$enable_dav$_apmod_extra_msg" >&6; } + if test "$enable_dav" != "no"; then + case "$enable_dav" in + shared*) + enable_dav=`echo $ac_n $enable_dav$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES dav" + ;; + *) + MODLIST="$MODLIST dav" + if test "dav" = "so"; then + sharedobjs=yes + fi + shared="";; + 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 + libname="mod_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 + 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= + test -d generators || $srcdir/build/mkdir.sh $modpath_current + > $modpath_current/modules.mk + + + + { $as_echo "$as_me:$LINENO: checking whether to enable mod_status" >&5 +$as_echo_n "checking whether to enable mod_status... " >&6; } + # Check whether --enable-status was given. +if test "${enable_status+set}" = set; then + enableval=$enable_status; +else + enable_status=yes +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_status" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_status" = "static"; then + enable_status=yes + elif test "$enable_status" = "yes"; then + enable_status=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_status" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_status=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_status" != "yes"; then + enable_status=no + fi + elif test "$enable_status" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_status=$module_default + _apmod_extra_msg=" (all)" + else + enable_status=no + fi + fi + if test "$enable_status" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_status$_apmod_extra_msg" >&5 +$as_echo "$enable_status$_apmod_extra_msg" >&6; } + if test "$enable_status" != "no"; then + case "$enable_status" in + shared*) + enable_status=`echo $ac_n $enable_status$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES status" + ;; + *) + MODLIST="$MODLIST status" + if test "status" = "so"; then + sharedobjs=yes + fi + shared="";; + esac + + + if test -z ""; then + objects="mod_status.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + libname="mod_status.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +$as_echo_n "checking whether to enable mod_autoindex... " >&6; } + # Check whether --enable-autoindex was given. +if test "${enable_autoindex+set}" = set; then + enableval=$enable_autoindex; +else + enable_autoindex=yes +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_autoindex" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_autoindex" = "static"; then + enable_autoindex=yes + elif test "$enable_autoindex" = "yes"; then + enable_autoindex=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_autoindex" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_autoindex=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_autoindex" != "yes"; then + enable_autoindex=no + fi + elif test "$enable_autoindex" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_autoindex=$module_default + _apmod_extra_msg=" (all)" + else + enable_autoindex=no + fi + fi + if test "$enable_autoindex" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_autoindex$_apmod_extra_msg" >&5 +$as_echo "$enable_autoindex$_apmod_extra_msg" >&6; } + if test "$enable_autoindex" != "no"; then + case "$enable_autoindex" in + shared*) + enable_autoindex=`echo $ac_n $enable_autoindex$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES autoindex" + ;; + *) + MODLIST="$MODLIST autoindex" + if test "autoindex" = "so"; then + sharedobjs=yes + fi + shared="";; + esac + + + if test -z ""; then + objects="mod_autoindex.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + libname="mod_autoindex.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +$as_echo_n "checking whether to enable mod_asis... " >&6; } + # Check whether --enable-asis was given. +if test "${enable_asis+set}" = set; then + enableval=$enable_asis; +else + enable_asis=yes +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_asis" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_asis" = "static"; then + enable_asis=yes + elif test "$enable_asis" = "yes"; then + enable_asis=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_asis" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_asis=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_asis" != "yes"; then + enable_asis=no + fi + elif test "$enable_asis" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_asis=$module_default + _apmod_extra_msg=" (all)" + else + enable_asis=no + fi + fi + if test "$enable_asis" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_asis$_apmod_extra_msg" >&5 +$as_echo "$enable_asis$_apmod_extra_msg" >&6; } + if test "$enable_asis" != "no"; then + case "$enable_asis" in + shared*) + enable_asis=`echo $ac_n $enable_asis$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES asis" + ;; + *) + MODLIST="$MODLIST asis" + if test "asis" = "so"; then + sharedobjs=yes + fi + shared="";; + esac + + + if test -z ""; then + objects="mod_asis.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + libname="mod_asis.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +$as_echo_n "checking whether to enable mod_info... " >&6; } + # Check whether --enable-info was given. +if test "${enable_info+set}" = set; then + enableval=$enable_info; +else + enable_info=most +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_info" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_info" = "static"; then + enable_info=yes + elif test "$enable_info" = "yes"; then + enable_info=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_info" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_info=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_info" != "yes"; then + enable_info=no + fi + elif test "$enable_info" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_info=$module_default + _apmod_extra_msg=" (all)" + else + enable_info=no + fi + fi + if test "$enable_info" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_info$_apmod_extra_msg" >&5 +$as_echo "$enable_info$_apmod_extra_msg" >&6; } + if test "$enable_info" != "no"; then + case "$enable_info" in + shared*) + enable_info=`echo $ac_n $enable_info$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES info" + ;; + *) + MODLIST="$MODLIST info" + if test "info" = "so"; then + sharedobjs=yes + fi + shared="";; + esac + + + if test -z ""; then + objects="mod_info.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + libname="mod_info.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +$as_echo_n "checking whether to enable mod_suexec... " >&6; } + # Check whether --enable-suexec was given. +if test "${enable_suexec+set}" = set; then + enableval=$enable_suexec; +else + enable_suexec=no +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_suexec" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_suexec" = "static"; then + enable_suexec=yes + elif test "$enable_suexec" = "yes"; then + enable_suexec=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_suexec" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_suexec=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_suexec" != "yes"; then + enable_suexec=no + fi + elif test "$enable_suexec" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_suexec=$module_default + _apmod_extra_msg=" (all)" + else + enable_suexec=no + fi + fi + if test "$enable_suexec" != "no"; then + { $as_echo "$as_me:$LINENO: result: checking dependencies" >&5 +$as_echo "checking dependencies" >&6; } + + other_targets=suexec + { $as_echo "$as_me:$LINENO: checking whether to enable mod_suexec" >&5 +$as_echo_n "checking whether to enable mod_suexec... " >&6; } + if test "$enable_suexec" = "no"; then + if test "$_apmod_error_fatal" = "no"; then + _apmod_extra_msg=" (disabled)" + else + { { $as_echo "$as_me:$LINENO: error: mod_suexec has been requested but can not be built due to prerequisite failures" >&5 +$as_echo "$as_me: error: mod_suexec has been requested but can not be built due to prerequisite failures" >&2;} + { (exit 1); exit 1; }; } + fi + fi + fi + { $as_echo "$as_me:$LINENO: result: $enable_suexec$_apmod_extra_msg" >&5 +$as_echo "$enable_suexec$_apmod_extra_msg" >&6; } + if test "$enable_suexec" != "no"; then + case "$enable_suexec" in + shared*) + enable_suexec=`echo $ac_n $enable_suexec$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES suexec" + ;; + *) + MODLIST="$MODLIST suexec" + if test "suexec" = "so"; then + sharedobjs=yes + fi + shared="";; + esac + + + if test -z ""; then + objects="mod_suexec.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + libname="mod_suexec.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +$as_echo_n "checking whether to enable mod_cgid... " >&6; } + # Check whether --enable-cgid was given. +if test "${enable_cgid+set}" = set; then + enableval=$enable_cgid; +else + enable_cgid=yes +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_cgid" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_cgid" = "static"; then + enable_cgid=yes + elif test "$enable_cgid" = "yes"; then + enable_cgid=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_cgid" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_cgid=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_cgid" != "yes"; then + enable_cgid=no + fi + elif test "$enable_cgid" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_cgid=$module_default + _apmod_extra_msg=" (all)" + else + enable_cgid=no + fi + fi + if test "$enable_cgid" != "no"; then + { $as_echo "$as_me:$LINENO: result: checking dependencies" >&5 +$as_echo "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" + ;; + *) + { $as_echo "$as_me:$LINENO: WARNING: Unknown platform" >&5 +$as_echo "$as_me: WARNING: Unknown platform" >&2;} + patch_id="120664" + ;; + esac + { $as_echo "$as_me:$LINENO: checking for Solaris patch $patch_id" >&5 +$as_echo_n "checking for Solaris patch $patch_id... " >&6; } + showrev -p | grep "$patch_id" >/dev/null 2>&1 + if test $? -eq 1; then + { { $as_echo "$as_me:$LINENO: 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: " >&5 +$as_echo "$as_me: 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: " >&2;} + { (exit 1); exit 1; }; } + else + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + fi + ;; + esac + ;; + esac + + { $as_echo "$as_me:$LINENO: checking whether to enable mod_cgid" >&5 +$as_echo_n "checking whether to enable mod_cgid... " >&6; } + if test "$enable_cgid" = "no"; then + if test "$_apmod_error_fatal" = "no"; then + _apmod_extra_msg=" (disabled)" + else + { { $as_echo "$as_me:$LINENO: error: mod_cgid has been requested but can not be built due to prerequisite failures" >&5 +$as_echo "$as_me: error: mod_cgid has been requested but can not be built due to prerequisite failures" >&2;} + { (exit 1); exit 1; }; } + fi + fi + fi + { $as_echo "$as_me:$LINENO: result: $enable_cgid$_apmod_extra_msg" >&5 +$as_echo "$enable_cgid$_apmod_extra_msg" >&6; } + if test "$enable_cgid" != "no"; then + case "$enable_cgid" in + shared*) + enable_cgid=`echo $ac_n $enable_cgid$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES cgid" + ;; + *) + MODLIST="$MODLIST cgid" + if test "cgid" = "so"; then + sharedobjs=yes + fi + shared="";; + esac + + + if test -z ""; then + objects="mod_cgid.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + libname="mod_cgid.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +$as_echo_n "checking whether to enable mod_cgi... " >&6; } + # Check whether --enable-cgi was given. +if test "${enable_cgi+set}" = set; then + enableval=$enable_cgi; +else + enable_cgi=no +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_cgi" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_cgi" = "static"; then + enable_cgi=yes + elif test "$enable_cgi" = "yes"; then + enable_cgi=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_cgi" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_cgi=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_cgi" != "yes"; then + enable_cgi=no + fi + elif test "$enable_cgi" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_cgi=$module_default + _apmod_extra_msg=" (all)" + else + enable_cgi=no + fi + fi + if test "$enable_cgi" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_cgi$_apmod_extra_msg" >&5 +$as_echo "$enable_cgi$_apmod_extra_msg" >&6; } + if test "$enable_cgi" != "no"; then + case "$enable_cgi" in + shared*) + enable_cgi=`echo $ac_n $enable_cgi$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES cgi" + ;; + *) + MODLIST="$MODLIST cgi" + if test "cgi" = "so"; then + sharedobjs=yes + fi + shared="";; + esac + + + if test -z ""; then + objects="mod_cgi.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + libname="mod_cgi.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +$as_echo_n "checking whether to enable mod_cgi... " >&6; } + # Check whether --enable-cgi was given. +if test "${enable_cgi+set}" = set; then + enableval=$enable_cgi; +else + enable_cgi=yes +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_cgi" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_cgi" = "static"; then + enable_cgi=yes + elif test "$enable_cgi" = "yes"; then + enable_cgi=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_cgi" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_cgi=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_cgi" != "yes"; then + enable_cgi=no + fi + elif test "$enable_cgi" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_cgi=$module_default + _apmod_extra_msg=" (all)" + else + enable_cgi=no + fi + fi + if test "$enable_cgi" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_cgi$_apmod_extra_msg" >&5 +$as_echo "$enable_cgi$_apmod_extra_msg" >&6; } + if test "$enable_cgi" != "no"; then + case "$enable_cgi" in + shared*) + enable_cgi=`echo $ac_n $enable_cgi$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES cgi" + ;; + *) + MODLIST="$MODLIST cgi" + if test "cgi" = "so"; then + sharedobjs=yes + fi + shared="";; + esac + + + if test -z ""; then + objects="mod_cgi.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + libname="mod_cgi.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +$as_echo_n "checking whether to enable mod_cgid... " >&6; } + # Check whether --enable-cgid was given. +if test "${enable_cgid+set}" = set; then + enableval=$enable_cgid; +else + enable_cgid=no +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_cgid" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_cgid" = "static"; then + enable_cgid=yes + elif test "$enable_cgid" = "yes"; then + enable_cgid=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_cgid" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_cgid=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_cgid" != "yes"; then + enable_cgid=no + fi + elif test "$enable_cgid" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_cgid=$module_default + _apmod_extra_msg=" (all)" + else + enable_cgid=no + fi + fi + if test "$enable_cgid" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_cgid$_apmod_extra_msg" >&5 +$as_echo "$enable_cgid$_apmod_extra_msg" >&6; } + if test "$enable_cgid" != "no"; then + case "$enable_cgid" in + shared*) + enable_cgid=`echo $ac_n $enable_cgid$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES cgid" + ;; + *) + MODLIST="$MODLIST cgid" + if test "cgid" = "so"; then + sharedobjs=yes + fi + shared="";; + esac + + + if test -z ""; then + objects="mod_cgid.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + libname="mod_cgid.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 + 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 "$MPM_NAME" = "beos" ; then + apache_apr_flags="--enable-threads" + + + APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES server/mpm/$MPM_NAME/Makefile" + +fi + + +if test "$MPM_NAME" = "leader" ; then + +for ac_func in pthread_kill +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* 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 $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + + APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES server/mpm/$MPM_SUBDIR_NAME/Makefile" + +fi + + +if test "$MPM_NAME" = "perchild" ; then + +for ac_func in pthread_kill +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* 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 $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + + APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES server/mpm/$MPM_SUBDIR_NAME/Makefile" + +fi + + +if test "$MPM_NAME" = "threadpool" ; then + +for ac_func in pthread_kill +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* 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 $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + + APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES server/mpm/$MPM_SUBDIR_NAME/Makefile" + +fi + +if test "$MPM_NAME" = "mpmt_os2" ; then + 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_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$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= ;; #( + *) $as_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+set}" = set || &/ + 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 + test "x$cache_file" != "x/dev/null" && + { $as_echo "$as_me:$LINENO: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + cat confcache >$cache_file + else + { $as_echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + + APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES server/mpm/$MPM_NAME/Makefile" + + + if test "x$CFLAGS" = "x"; then + echo " setting CFLAGS to \"-Zmt\"" + CFLAGS="-Zmt" + else + apr_addto_bugger="-Zmt" + 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 + echo " adding \"$i\" to CFLAGS" + CFLAGS="$CFLAGS $i" + fi + done + fi + +fi + + +if test "$MPM_NAME" = "worker" ; then + +for ac_func in pthread_kill +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* 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 $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + + APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES server/mpm/$MPM_NAME/Makefile" + +fi + + + + current_dir=dav/fs + modpath_current=modules/dav/fs + modpath_static= + modpath_shared= + test -d dav/fs || $srcdir/build/mkdir.sh $modpath_current + > $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 + + + { $as_echo "$as_me:$LINENO: checking whether to enable mod_dav_fs" >&5 +$as_echo_n "checking whether to enable mod_dav_fs... " >&6; } + # Check whether --enable-dav-fs was given. +if test "${enable_dav_fs+set}" = set; then + enableval=$enable_dav_fs; +else + enable_dav_fs=$dav_fs_enable +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_dav_fs" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_dav_fs" = "static"; then + enable_dav_fs=yes + elif test "$enable_dav_fs" = "yes"; then + enable_dav_fs=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_dav_fs" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_dav_fs=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_dav_fs" != "yes"; then + enable_dav_fs=no + fi + elif test "$enable_dav_fs" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_dav_fs=$module_default + _apmod_extra_msg=" (all)" + else + enable_dav_fs=no + fi + fi + if test "$enable_dav_fs" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_dav_fs$_apmod_extra_msg" >&5 +$as_echo "$enable_dav_fs$_apmod_extra_msg" >&6; } + if test "$enable_dav_fs" != "no"; then + case "$enable_dav_fs" in + shared*) + enable_dav_fs=`echo $ac_n $enable_dav_fs$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES dav_fs" + ;; + *) + MODLIST="$MODLIST dav_fs" + if test "dav_fs" = "so"; then + sharedobjs=yes + fi + shared="";; + 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 + libname="mod_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 + 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=mappers + modpath_current=modules/mappers + modpath_static= + modpath_shared= + test -d mappers || $srcdir/build/mkdir.sh $modpath_current + > $modpath_current/modules.mk + + + + { $as_echo "$as_me:$LINENO: checking whether to enable mod_vhost_alias" >&5 +$as_echo_n "checking whether to enable mod_vhost_alias... " >&6; } + # Check whether --enable-vhost-alias was given. +if test "${enable_vhost_alias+set}" = set; then + enableval=$enable_vhost_alias; +else + enable_vhost_alias=most +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_vhost_alias" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_vhost_alias" = "static"; then + enable_vhost_alias=yes + elif test "$enable_vhost_alias" = "yes"; then + enable_vhost_alias=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_vhost_alias" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_vhost_alias=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_vhost_alias" != "yes"; then + enable_vhost_alias=no + fi + elif test "$enable_vhost_alias" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_vhost_alias=$module_default + _apmod_extra_msg=" (all)" + else + enable_vhost_alias=no + fi + fi + if test "$enable_vhost_alias" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_vhost_alias$_apmod_extra_msg" >&5 +$as_echo "$enable_vhost_alias$_apmod_extra_msg" >&6; } + if test "$enable_vhost_alias" != "no"; then + case "$enable_vhost_alias" in + shared*) + enable_vhost_alias=`echo $ac_n $enable_vhost_alias$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES vhost_alias" + ;; + *) + MODLIST="$MODLIST vhost_alias" + if test "vhost_alias" = "so"; then + sharedobjs=yes + fi + shared="";; + esac + + + if test -z ""; then + objects="mod_vhost_alias.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + libname="mod_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 +$as_echo_n "checking whether to enable mod_negotiation... " >&6; } + # Check whether --enable-negotiation was given. +if test "${enable_negotiation+set}" = set; then + enableval=$enable_negotiation; +else + enable_negotiation=yes +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_negotiation" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_negotiation" = "static"; then + enable_negotiation=yes + elif test "$enable_negotiation" = "yes"; then + enable_negotiation=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_negotiation" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_negotiation=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_negotiation" != "yes"; then + enable_negotiation=no + fi + elif test "$enable_negotiation" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_negotiation=$module_default + _apmod_extra_msg=" (all)" + else + enable_negotiation=no + fi + fi + if test "$enable_negotiation" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_negotiation$_apmod_extra_msg" >&5 +$as_echo "$enable_negotiation$_apmod_extra_msg" >&6; } + if test "$enable_negotiation" != "no"; then + case "$enable_negotiation" in + shared*) + enable_negotiation=`echo $ac_n $enable_negotiation$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES negotiation" + ;; + *) + MODLIST="$MODLIST negotiation" + if test "negotiation" = "so"; then + sharedobjs=yes + fi + shared="";; + esac + + + if test -z ""; then + objects="mod_negotiation.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + libname="mod_negotiation.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +$as_echo_n "checking whether to enable mod_dir... " >&6; } + # Check whether --enable-dir was given. +if test "${enable_dir+set}" = set; then + enableval=$enable_dir; +else + enable_dir=yes +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_dir" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_dir" = "static"; then + enable_dir=yes + elif test "$enable_dir" = "yes"; then + enable_dir=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_dir" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_dir=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_dir" != "yes"; then + enable_dir=no + fi + elif test "$enable_dir" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_dir=$module_default + _apmod_extra_msg=" (all)" + else + enable_dir=no + fi + fi + if test "$enable_dir" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_dir$_apmod_extra_msg" >&5 +$as_echo "$enable_dir$_apmod_extra_msg" >&6; } + if test "$enable_dir" != "no"; then + case "$enable_dir" in + shared*) + enable_dir=`echo $ac_n $enable_dir$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES dir" + ;; + *) + MODLIST="$MODLIST dir" + if test "dir" = "so"; then + sharedobjs=yes + fi + shared="";; + esac + + + if test -z ""; then + objects="mod_dir.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + libname="mod_dir.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +$as_echo_n "checking whether to enable mod_imap... " >&6; } + # Check whether --enable-imap was given. +if test "${enable_imap+set}" = set; then + enableval=$enable_imap; +else + enable_imap=yes +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_imap" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_imap" = "static"; then + enable_imap=yes + elif test "$enable_imap" = "yes"; then + enable_imap=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_imap" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_imap=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_imap" != "yes"; then + enable_imap=no + fi + elif test "$enable_imap" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_imap=$module_default + _apmod_extra_msg=" (all)" + else + enable_imap=no + fi + fi + if test "$enable_imap" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_imap$_apmod_extra_msg" >&5 +$as_echo "$enable_imap$_apmod_extra_msg" >&6; } + if test "$enable_imap" != "no"; then + case "$enable_imap" in + shared*) + enable_imap=`echo $ac_n $enable_imap$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES imap" + ;; + *) + MODLIST="$MODLIST imap" + if test "imap" = "so"; then + sharedobjs=yes + fi + shared="";; + esac + + + if test -z ""; then + objects="mod_imap.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + libname="mod_imap.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +$as_echo_n "checking whether to enable mod_actions... " >&6; } + # Check whether --enable-actions was given. +if test "${enable_actions+set}" = set; then + enableval=$enable_actions; +else + enable_actions=yes +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_actions" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_actions" = "static"; then + enable_actions=yes + elif test "$enable_actions" = "yes"; then + enable_actions=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_actions" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_actions=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_actions" != "yes"; then + enable_actions=no + fi + elif test "$enable_actions" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_actions=$module_default + _apmod_extra_msg=" (all)" + else + enable_actions=no + fi + fi + if test "$enable_actions" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_actions$_apmod_extra_msg" >&5 +$as_echo "$enable_actions$_apmod_extra_msg" >&6; } + if test "$enable_actions" != "no"; then + case "$enable_actions" in + shared*) + enable_actions=`echo $ac_n $enable_actions$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES actions" + ;; + *) + MODLIST="$MODLIST actions" + if test "actions" = "so"; then + sharedobjs=yes + fi + shared="";; + esac + + + if test -z ""; then + objects="mod_actions.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + libname="mod_actions.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +$as_echo_n "checking whether to enable mod_speling... " >&6; } + # Check whether --enable-speling was given. +if test "${enable_speling+set}" = set; then + enableval=$enable_speling; +else + enable_speling=most +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_speling" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_speling" = "static"; then + enable_speling=yes + elif test "$enable_speling" = "yes"; then + enable_speling=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_speling" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_speling=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_speling" != "yes"; then + enable_speling=no + fi + elif test "$enable_speling" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_speling=$module_default + _apmod_extra_msg=" (all)" + else + enable_speling=no + fi + fi + if test "$enable_speling" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_speling$_apmod_extra_msg" >&5 +$as_echo "$enable_speling$_apmod_extra_msg" >&6; } + if test "$enable_speling" != "no"; then + case "$enable_speling" in + shared*) + enable_speling=`echo $ac_n $enable_speling$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES speling" + ;; + *) + MODLIST="$MODLIST speling" + if test "speling" = "so"; then + sharedobjs=yes + fi + shared="";; + esac + + + if test -z ""; then + objects="mod_speling.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + libname="mod_speling.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +$as_echo_n "checking whether to enable mod_userdir... " >&6; } + # Check whether --enable-userdir was given. +if test "${enable_userdir+set}" = set; then + enableval=$enable_userdir; +else + enable_userdir=yes +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_userdir" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_userdir" = "static"; then + enable_userdir=yes + elif test "$enable_userdir" = "yes"; then + enable_userdir=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_userdir" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_userdir=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_userdir" != "yes"; then + enable_userdir=no + fi + elif test "$enable_userdir" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_userdir=$module_default + _apmod_extra_msg=" (all)" + else + enable_userdir=no + fi + fi + if test "$enable_userdir" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_userdir$_apmod_extra_msg" >&5 +$as_echo "$enable_userdir$_apmod_extra_msg" >&6; } + if test "$enable_userdir" != "no"; then + case "$enable_userdir" in + shared*) + enable_userdir=`echo $ac_n $enable_userdir$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES userdir" + ;; + *) + MODLIST="$MODLIST userdir" + if test "userdir" = "so"; then + sharedobjs=yes + fi + shared="";; + esac + + + if test -z ""; then + objects="mod_userdir.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + libname="mod_userdir.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +$as_echo_n "checking whether to enable mod_alias... " >&6; } + # Check whether --enable-alias was given. +if test "${enable_alias+set}" = set; then + enableval=$enable_alias; +else + enable_alias=yes +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_alias" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_alias" = "static"; then + enable_alias=yes + elif test "$enable_alias" = "yes"; then + enable_alias=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_alias" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_alias=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_alias" != "yes"; then + enable_alias=no + fi + elif test "$enable_alias" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_alias=$module_default + _apmod_extra_msg=" (all)" + else + enable_alias=no + fi + fi + if test "$enable_alias" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_alias$_apmod_extra_msg" >&5 +$as_echo "$enable_alias$_apmod_extra_msg" >&6; } + if test "$enable_alias" != "no"; then + case "$enable_alias" in + shared*) + enable_alias=`echo $ac_n $enable_alias$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES alias" + ;; + *) + MODLIST="$MODLIST alias" + if test "alias" = "so"; then + sharedobjs=yes + fi + shared="";; + esac + + + if test -z ""; then + objects="mod_alias.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + libname="mod_alias.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<&5 +$as_echo_n "checking whether to enable mod_rewrite... " >&6; } + # Check whether --enable-rewrite was given. +if test "${enable_rewrite+set}" = set; then + enableval=$enable_rewrite; +else + enable_rewrite=most +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_rewrite" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_rewrite" = "static"; then + enable_rewrite=yes + elif test "$enable_rewrite" = "yes"; then + enable_rewrite=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_rewrite" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_rewrite=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_rewrite" != "yes"; then + enable_rewrite=no + fi + elif test "$enable_rewrite" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_rewrite=$module_default + _apmod_extra_msg=" (all)" + else + enable_rewrite=no + fi + fi + if test "$enable_rewrite" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_rewrite$_apmod_extra_msg" >&5 +$as_echo "$enable_rewrite$_apmod_extra_msg" >&6; } + if test "$enable_rewrite" != "no"; then + case "$enable_rewrite" in + shared*) + enable_rewrite=`echo $ac_n $enable_rewrite$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES rewrite" + ;; + *) + MODLIST="$MODLIST rewrite" + if test "rewrite" = "so"; then + sharedobjs=yes + fi + shared="";; + esac + + + if test -z ""; then + objects="mod_rewrite.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + libname="mod_rewrite.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 <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#if APR_HAS_DSO +YES_IS_DEFINED +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "YES_IS_DEFINED" >/dev/null 2>&1; then + ac_cv_define_APR_HAS_DSO=yes +else + ac_cv_define_APR_HAS_DSO=no +fi +rm -f conftest* + +CPPFLAGS=$apr_old_cppflags + + +case "x$enable_so" in + "xyes") + if test $ac_cv_define_APR_HAS_DSO = "no"; then + { { $as_echo "$as_me:$LINENO: error: mod_so has been requested but cannot be built on your system" >&5 +$as_echo "$as_me: error: mod_so has been requested but cannot be built on your system" >&2;} + { (exit 1); exit 1; }; } + fi + ;; + "xshared") + { { $as_echo "$as_me:$LINENO: error: mod_so can not be built as a shared DSO" >&5 +$as_echo "$as_me: error: mod_so can not be built as a shared DSO" >&2;} + { (exit 1); exit 1; }; } + ;; + "xno") + ;; + "x") + enable_so=$ac_cv_define_APR_HAS_DSO + ;; +esac + +if test "x$enable_so" = "xyes"; then + enable_so="static" +fi + +if test "$sharedobjs" = "yes"; then + if test $ac_cv_define_APR_HAS_DSO = "no"; then + { { $as_echo "$as_me:$LINENO: error: shared objects have been requested but cannot be built since mod_so cannot be built" >&5 +$as_echo "$as_me: error: shared objects have been requested but cannot be built since mod_so cannot be built" >&2;} + { (exit 1); exit 1; }; } + elif test $enable_so = "no"; then + { { $as_echo "$as_me:$LINENO: error: shared objects have been requested but cannot be built since mod_so was disabled" >&5 +$as_echo "$as_me: error: shared objects have been requested but cannot be built since mod_so was disabled" >&2;} + { (exit 1); exit 1; }; } + fi +fi + + + { $as_echo "$as_me:$LINENO: checking whether to enable mod_so" >&5 +$as_echo_n "checking whether to enable mod_so... " >&6; } + # Check whether --enable-so was given. +if test "${enable_so+set}" = set; then + enableval=$enable_so; +else + enable_so=$enable_so +fi + + _apmod_extra_msg="" + if test "$module_selection" = "most" -a "$enable_so" = "most"; then + _apmod_error_fatal="no" + else + _apmod_error_fatal="yes" + fi + if test "$enable_so" = "static"; then + enable_so=yes + elif test "$enable_so" = "yes"; then + enable_so=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_so" = "most"; then + if test "$module_selection" = "most" -o "$module_selection" = "all"; then + enable_so=$module_default + _apmod_extra_msg=" ($module_selection)" + elif test "$enable_so" != "yes"; then + enable_so=no + fi + elif test "$enable_so" = "maybe-all"; then + if test "$module_selection" = "all"; then + enable_so=$module_default + _apmod_extra_msg=" (all)" + else + enable_so=no + fi + fi + if test "$enable_so" != "no"; then + : + fi + { $as_echo "$as_me:$LINENO: result: $enable_so$_apmod_extra_msg" >&5 +$as_echo "$enable_so$_apmod_extra_msg" >&6; } + if test "$enable_so" != "no"; then + case "$enable_so" in + shared*) + enable_so=`echo $ac_n $enable_so$ac_c|sed 's/shared,*//'` + sharedobjs=yes + shared=yes + DSO_MODULES="$DSO_MODULES so" + ;; + *) + MODLIST="$MODLIST so" + if test "so" = "so"; then + sharedobjs=yes + fi + shared="";; + esac + + + if test -z ""; then + objects="mod_so.lo" + else + objects="" + fi + + if test -z "$module_standalone"; then + if test -z "$shared"; then + libname="mod_so.la" + BUILTIN_LIBS="$BUILTIN_LIBS $modpath_current/$libname" + modpath_static="$modpath_static $libname" + cat >>$modpath_current/modules.mk<>$modpath_current/modules.mk<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_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$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= ;; #( + *) $as_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+set}" = set || &/ + 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 + test "x$cache_file" != "x/dev/null" && + { $as_echo "$as_me:$LINENO: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + cat confcache >$cache_file + else + { $as_echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + + + 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 + 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 MPM_LIB" + + + + 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"; then + case $host in + *-ibm-aix*) + HTTPD_LDFLAGS="$HTTPD_LDFLAGS -Wl,-uXML_Parse -Wl,-bE:$abs_builddir/server/httpd.exp" + SH_LDFLAGS="$SH_LDFLAGS \$(EXTRA_LDFLAGS) \$(EXTRA_LIBS)" + UTIL_LDFLAGS="$UTIL_LDFLAGS -Wl,-uXML_Parse" + ;; + *beos) + SH_LDFLAGS='$(top_builddir)/_APP_' + PRE_SHARED_CMDS='ln -s $(top_builddir)/httpd $(top_builddir)/_APP_' + POST_SHARED_CMDS='rm $(top_builddir)/_APP_' + ;; + *os390) + HTTPD_LDFLAGS="$HTTPD_LDFLAGS --main=$abs_srcdir/server/main.o --core-dll=$abs_srcdir/apachecore.dll" + SH_LDFLAGS="$SH_LDFLAGS --core-dll=$abs_srcdir/apachecore.dll" + esac +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+set}" = set; then + withval=$with_program_name; + progname="$withval" +else + + progname="httpd" +fi + + +# SuExec parameters + +# Check whether --with-suexec-bin was given. +if test "${with_suexec_bin+set}" = set; then + withval=$with_suexec_bin; + +cat >>confdefs.h <<_ACEOF +#define SUEXEC_BIN "$withval" +_ACEOF + + +fi + + + +# Check whether --with-suexec-caller was given. +if test "${with_suexec_caller+set}" = set; then + withval=$with_suexec_caller; + +cat >>confdefs.h <<_ACEOF +#define AP_HTTPD_USER "$withval" +_ACEOF + +fi + + + +# Check whether --with-suexec-userdir was given. +if test "${with_suexec_userdir+set}" = set; then + withval=$with_suexec_userdir; + +cat >>confdefs.h <<_ACEOF +#define AP_USERDIR_SUFFIX "$withval" +_ACEOF + +fi + + + +# Check whether --with-suexec-docroot was given. +if test "${with_suexec_docroot+set}" = set; then + withval=$with_suexec_docroot; + +cat >>confdefs.h <<_ACEOF +#define AP_DOC_ROOT "$withval" +_ACEOF + +fi + + + +# Check whether --with-suexec-uidmin was given. +if test "${with_suexec_uidmin+set}" = set; then + withval=$with_suexec_uidmin; + +cat >>confdefs.h <<_ACEOF +#define AP_UID_MIN $withval +_ACEOF + +fi + + + +# Check whether --with-suexec-gidmin was given. +if test "${with_suexec_gidmin+set}" = set; then + withval=$with_suexec_gidmin; + +cat >>confdefs.h <<_ACEOF +#define AP_GID_MIN $withval +_ACEOF + +fi + + + +# Check whether --with-suexec-logfile was given. +if test "${with_suexec_logfile+set}" = set; then + withval=$with_suexec_logfile; + +cat >>confdefs.h <<_ACEOF +#define AP_LOG_EXEC "$withval" +_ACEOF + +fi + + + +# Check whether --with-suexec-safepath was given. +if test "${with_suexec_safepath+set}" = set; then + withval=$with_suexec_safepath; + +cat >>confdefs.h <<_ACEOF +#define AP_SAFE_PATH "$withval" +_ACEOF + +fi + + + +# Check whether --with-suexec-umask was given. +if test "${with_suexec_umask+set}" = set; then + withval=$with_suexec_umask; + +cat >>confdefs.h <<_ACEOF +#define AP_SUEXEC_UMASK 0$withval +_ACEOF + +fi + + +AP_LIBS="$abs_builddir/srclib/pcre/libpcre.la $AP_LIBS" + +AP_LIBS="$AP_LIBS `$apu_config --link-libtool --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" + + + + +cat >>confdefs.h <<\_ACEOF +#define AP_USING_AUTOCONF 1 +_ACEOF + + +if test "$SINGLE_LISTEN_UNSERIALIZED_ACCEPT" = "1"; then + +cat >>confdefs.h <<\_ACEOF +#define SINGLE_LISTEN_UNSERIALIZED_ACCEPT 1 +_ACEOF + +fi + +if test "$AP_NONBLOCK_WHEN_MULTI_LISTEN" = "1"; then + +cat >>confdefs.h <<\_ACEOF +#define AP_NONBLOCK_WHEN_MULTI_LISTEN 1 +_ACEOF + +fi + + +cat >>confdefs.h <<_ACEOF +#define AP_SIG_GRACEFUL SIG$AP_SIG_GRACEFUL +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define AP_SIG_GRACEFUL_STRING "SIG$AP_SIG_GRACEFUL" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define AP_SIG_GRACEFUL_SHORT $AP_SIG_GRACEFUL +_ACEOF + +AP_SIG_GRACEFUL_SHORT=$AP_SIG_GRACEFUL +AP_SIG_GRACEFUL=SIG$AP_SIG_GRACEFUL_SHORT + + + + +if test "$cross_compiling" = "no"; then + + { $as_echo "$as_me:$LINENO: checking whether byte ordering is bigendian" >&5 +$as_echo_n "checking whether byte ordering is bigendian... " >&6; } +if test "${ac_cv_c_bigendian+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_c_bigendian=unknown + # See if we're dealing with a universal compiler. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifndef __APPLE_CC__ + not a universal capable compiler + #endif + typedef int dummy; + +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + + # Check for potential -arch flags. It is not universal unless + # there are some -arch flags. Note that *ppc* also matches + # ppc64. This check is also rather less than ideal. + case "${CC} ${CFLAGS} ${CPPFLAGS} ${LDFLAGS}" in #( + *-arch*ppc*|*-arch*i386*|*-arch*x86_64*) ac_cv_c_bigendian=universal;; + esac +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + if test $ac_cv_c_bigendian = unknown; then + # See if sys/param.h defines the BYTE_ORDER macro. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + #include + +int +main () +{ +#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ + && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ + && LITTLE_ENDIAN) + bogus endian macros + #endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + # It does; now see whether it defined to BIG_ENDIAN or not. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + #include + +int +main () +{ +#if BYTE_ORDER != BIG_ENDIAN + not big endian + #endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_c_bigendian=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_c_bigendian=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + fi + if test $ac_cv_c_bigendian = unknown; then + # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +int +main () +{ +#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) + bogus endian macros + #endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + # It does; now see whether it defined to _BIG_ENDIAN or not. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +int +main () +{ +#ifndef _BIG_ENDIAN + not big endian + #endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_c_bigendian=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_c_bigendian=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + fi + if test $ac_cv_c_bigendian = unknown; then + # Compile a test program. + if test "$cross_compiling" = yes; then + # Try to guess by grepping values from an object file. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +short int ascii_mm[] = + { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; + short int ascii_ii[] = + { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; + int use_ascii (int i) { + return ascii_mm[i] + ascii_ii[i]; + } + short int ebcdic_ii[] = + { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; + short int ebcdic_mm[] = + { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; + int use_ebcdic (int i) { + return ebcdic_mm[i] + ebcdic_ii[i]; + } + extern int foo; + +int +main () +{ +return use_ascii (foo) == use_ebcdic (foo); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then + ac_cv_c_bigendian=yes + fi + if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then + if test "$ac_cv_c_bigendian" = unknown; then + ac_cv_c_bigendian=no + else + # finding both strings is unlikely to happen, but who knows? + ac_cv_c_bigendian=unknown + fi + fi +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ + + /* Are we little or big endian? From Harbison&Steele. */ + union + { + long int l; + char c[sizeof (long int)]; + } u; + u.l = 1; + return u.c[sizeof (long int) - 1] == 1; + + ; + return 0; +} +_ACEOF +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_c_bigendian=no +else + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_c_bigendian=yes +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + + fi +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_bigendian" >&5 +$as_echo "$ac_cv_c_bigendian" >&6; } + case $ac_cv_c_bigendian in #( + yes) + cat >>confdefs.h <<\_ACEOF +#define WORDS_BIGENDIAN 1 +_ACEOF +;; #( + no) + ;; #( + universal) + +cat >>confdefs.h <<\_ACEOF +#define AC_APPLE_UNIVERSAL_BUILD 1 +_ACEOF + + ;; #( + *) + { { $as_echo "$as_me:$LINENO: error: unknown endianness + presetting ac_cv_c_bigendian=no (or yes) will help" >&5 +$as_echo "$as_me: error: unknown endianness + presetting ac_cv_c_bigendian=no (or yes) will help" >&2;} + { (exit 1); exit 1; }; } ;; + esac + +else + +cat >>confdefs.h <<\_ACEOF +#define AP_UNKNOWN_BYTE_ORDER 1 +_ACEOF + +fi + + + APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES Makefile modules/Makefile srclib/Makefile" + + + APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES os/beos/Makefile os/os2/Makefile os/Makefile" + + + APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES os/unix/Makefile server/Makefile" + + + APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES support/Makefile srclib/pcre/Makefile" + + +if test -d ./test; then + + APACHE_FAST_OUTPUT_FILES="$APACHE_FAST_OUTPUT_FILES test/Makefile" + +fi + +echo $ac_n "${nl}Restore user-defined environment settings...${nl}" + + +if test "x$apr_ste_save_CPPFLAGS" = "x"; 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 +echo " restoring CPPFLAGS to \"$CPPFLAGS\"" +echo " setting EXTRA_CPPFLAGS to \"$EXTRA_CPPFLAGS\"" + + + +if test "x$apr_ste_save_CFLAGS" = "x"; 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 +echo " restoring CFLAGS to \"$CFLAGS\"" +echo " setting EXTRA_CFLAGS to \"$EXTRA_CFLAGS\"" + + + +if test "x$apr_ste_save_CXXFLAGS" = "x"; 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 +echo " restoring CXXFLAGS to \"$CXXFLAGS\"" +echo " setting EXTRA_CXXFLAGS to \"$EXTRA_CXXFLAGS\"" + + + +if test "x$apr_ste_save_LDFLAGS" = "x"; 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 +echo " restoring LDFLAGS to \"$LDFLAGS\"" +echo " setting EXTRA_LDFLAGS to \"$EXTRA_LDFLAGS\"" + + + +if test "x$apr_ste_save_LIBS" = "x"; 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 +echo " restoring LIBS to \"$LIBS\"" +echo " setting EXTRA_LIBS to \"$EXTRA_LIBS\"" + + + +if test "x$apr_ste_save_INCLUDES" = "x"; 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 +echo " restoring INCLUDES to \"$INCLUDES\"" +echo " setting EXTRA_INCLUDES to \"$EXTRA_INCLUDES\"" + + + +echo $ac_n "${nl}Construct makefiles and header files...${nl}" + + + + 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 LIBTOOL" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST SHELL" + + + + 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 nonssl_listen_stmt_1" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST nonssl_listen_stmt_2" + + + + 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 INSTALL_PROG_FLAGS" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST DSO_MODULES" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST APR_BINDIR" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST APR_INCLUDEDIR" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST APU_BINDIR" + + + + APACHE_VAR_SUBST="$APACHE_VAR_SUBST APU_INCLUDEDIR" + + + + abs_srcdir="`(cd $srcdir && pwd)`" + + echo 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 + + +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}" + + +cat >>confdefs.h <<_ACEOF +#define HTTPD_ROOT "${ap_prefix}" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define SERVER_CONFIG_FILE "${rel_sysconfdir}/${progname}.conf" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define AP_TYPES_CONFIG_FILE "${rel_sysconfdir}/mime.types" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define APACHE_MPM_DIR "$MPM_DIR" +_ACEOF + + +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 + +HTTPD_VERSION=`$srcdir/build/get-version.sh all $srcdir/include/ap_release.h AP_SERVER` + + +ac_config_files="$ac_config_files $APACHE_OUTPUT_FILES docs/conf/httpd-std.conf docs/conf/ssl-std.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" + +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_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$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= ;; #( + *) $as_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+set}" = set || &/ + 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 + test "x$cache_file" != "x/dev/null" && + { $as_echo "$as_me:$LINENO: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + cat confcache >$cache_file + else + { $as_echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 +$as_echo "$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= +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=`$as_echo "$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. + ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" + ac_ltlibobjs="$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" +{ $as_echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +cat >$CONFIG_STATUS <<_ACEOF || ac_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} +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be more Bourne compatible +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 + + + + +# PATH needs CR +# 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_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +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 + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + 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 + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + { (exit 1); exit 1; } +fi + +# Work around bugs in pre-3.0 UWIN ksh. +for as_var in ENV MAIL MAILPATH +do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# Required to use basename. +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 + + +# Name of the executable. +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# CDPATH. +$as_unset CDPATH + + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line after each line using $LINENO; the second 'sed' + # does the real work. The second script uses 'N' to pair each + # line-number line with the line containing $LINENO, and appends + # trailing '-' during substitution so that $LINENO is not a special + # case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # scripts with optimization help from Paolo Bonzini. Blame Lee + # E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + 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" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); exit 1; }; } + + # 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 +} + + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in +-n*) + case `echo 'x\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + *) ECHO_C='\c';; + esac;; +*) + ECHO_N='-n';; +esac +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +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 -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +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=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&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.63. 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 from templates according to the +current configuration. + +Usage: $0 [OPTION]... [FILE]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, 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 ." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_version="\\ +config.status +configured by $0, generated by GNU Autoconf 2.63, + with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" + +Copyright (C) 2008 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' +INSTALL='$INSTALL' +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=$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 ) + $as_echo "$ac_cs_version"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + CONFIG_FILES="$CONFIG_FILES '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + CONFIG_HEADERS="$CONFIG_HEADERS '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + { $as_echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; };; + --help | --hel | -h ) + $as_echo "$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_echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } ;; + + *) ac_config_targets="$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 + \$as_echo "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 + $as_echo "$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" ;; + "$APACHE_OUTPUT_FILES") CONFIG_FILES="$CONFIG_FILES $APACHE_OUTPUT_FILES" ;; + "docs/conf/httpd-std.conf") CONFIG_FILES="$CONFIG_FILES docs/conf/httpd-std.conf" ;; + "docs/conf/ssl-std.conf") CONFIG_FILES="$CONFIG_FILES docs/conf/ssl-std.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" ;; + "default") CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;; + + *) { { $as_echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 +$as_echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; + 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+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || 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= + trap 'exit_status=$? + { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status +' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || +{ + $as_echo "$as_me: cannot create a temporary directory in ." >&2 + { (exit 1); exit 1; } +} + +# 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=' ' +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 {' >"$tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } +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_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } + + 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_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } + 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 >>"\$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 >>"\$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 < "$tmp/subs1.awk" > "$tmp/subs.awk" \ + || { { $as_echo "$as_me:$LINENO: error: could not setup config files machinery" >&5 +$as_echo "$as_me: error: could not setup config files machinery" >&2;} + { (exit 1); exit 1; }; } +_ACEOF + +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ 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[ ]*=/{ +s/:*\$(srcdir):*/:/ +s/:*\${srcdir}:*/:/ +s/:*@srcdir@:*/:/ +s/^\([^=]*=[ ]*\):*/\1/ +s/:*$// +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 >"$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_t=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_t"; then + break + elif $ac_last_try; then + { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_HEADERS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_HEADERS" >&2;} + { (exit 1); exit 1; }; } + 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_echo "$as_me:$LINENO: error: could not setup config headers machinery" >&5 +$as_echo "$as_me: error: could not setup config headers machinery" >&2;} + { (exit 1); exit 1; }; } +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_echo "$as_me:$LINENO: error: invalid tag $ac_tag" >&5 +$as_echo "$as_me: error: invalid tag $ac_tag" >&2;} + { (exit 1); exit 1; }; };; + :[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="$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_echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 +$as_echo "$as_me: error: cannot find input file: $ac_f" >&2;} + { (exit 1); exit 1; }; };; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + ac_file_inputs="$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 '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:$LINENO: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$tmp/stdin" \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } ;; + 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 || +$as_echo 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" + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$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 || +$as_echo 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_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 +$as_echo "$as_me: error: cannot create directory $as_dir" >&2;} + { (exit 1); exit 1; }; }; } + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$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 + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac +_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@*) + { $as_echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$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 +s&@INSTALL@&$ac_INSTALL&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&5 +$as_echo "$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 "$tmp/stdin" + case $ac_file in + -) cat "$tmp/out" && rm -f "$tmp/out";; + *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; + esac \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" + } >"$tmp/config.h" \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:$LINENO: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$tmp/config.h" "$ac_file" \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ + || { { $as_echo "$as_me:$LINENO: error: could not create -" >&5 +$as_echo "$as_me: error: could not create -" >&2;} + { (exit 1); exit 1; }; } + fi + ;; + + :C) { $as_echo "$as_me:$LINENO: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "default":C) true ;; + + esac +done # for ac_tag + + +{ (exit 0); exit 0; } +_ACEOF +chmod +x $CONFIG_STATUS +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + { { $as_echo "$as_me:$LINENO: error: write failure creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: write failure creating $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } + + +# 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 || { (exit 1); exit 1; } +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:$LINENO: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + + diff --git a/rubbos/app/httpd-2.0.64/configure.in b/rubbos/app/httpd-2.0.64/configure.in new file mode 100644 index 00000000..1a950761 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/configure.in @@ -0,0 +1,604 @@ +dnl +dnl Autoconf configuration for Apache httpd +dnl +dnl Use ./buildconf to produce a configure script +dnl + +AC_PREREQ(2.13) +AC_INIT(ABOUT_APACHE) + +AC_CONFIG_HEADER(include/ap_config_auto.h) +AC_CONFIG_AUX_DIR(build) + +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 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 +APACHE_ENABLE_LAYOUT + +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 ## 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" + +echo $ac_n "${nl}Configuring Apache Portable Runtime library ...${nl}" + +APR_FIND_APR("$srcdir/srclib/apr", "./srclib/apr", 1) + +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" +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`) +APR_ADDTO(LDFLAGS, `$apr_config --ldflags`) +APR_ADDTO(INCLUDES, `$apr_config --includes`) +SHLIBPATH_VAR=`$apr_config --shlib-path-var` +APR_BINDIR=`$apr_config --bindir` +APR_INCLUDEDIR=`$apr_config --includedir` + +echo $ac_n "${nl}Configuring Apache Portable Runtime Utility library...${nl}" + +APR_FIND_APU("$srcdir/srclib/apr-util", "./srclib/apr-util", 1) + +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" +fi + +APR_ADDTO(LDFLAGS, `$apu_config --ldflags`) +APR_ADDTO(INCLUDES, `$apu_config --includes`) +APU_BINDIR=`$apu_config --bindir` +APU_INCLUDEDIR=`$apu_config --includedir` + +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 + +echo $ac_n "${nl}Configuring PCRE regular expression library ...${nl}" + +APR_SUBDIR_CONFIG(srclib/pcre, + [--prefix=$prefix --exec-prefix=$exec_prefix --libdir=$libdir --includedir=$includedir --bindir=$bindir]) + +echo $ac_n "${nl}Configuring Apache httpd ...${nl}" + +dnl Absolute source/build directory +abs_srcdir=`(cd $srcdir && pwd)` +abs_builddir=`pwd` + +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 + USE_VPATH=1 + APR_ADDTO(INCLUDES, [-I\$(srcdir) -I\$(top_builddir)/server/mpm/\$(MPM_SUBDIR_NAME) -I\$(top_builddir)/include]) +fi + +APR_ADDTO(INCLUDES, [-I\$(top_srcdir)/os/\$(OS_DIR) -I\$(top_srcdir)/server/mpm/\$(MPM_SUBDIR_NAME) -I\$(top_srcdir)/modules/http -I\$(top_srcdir)/modules/filters -I\$(top_srcdir)/modules/proxy -I\$(top_srcdir)/include -I\$(top_srcdir)/modules/generators]) + +echo $ac_n "${nl}Applying OS-specific hints for httpd ...${nl}" + +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]]*) + 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) + +AP_SIG_GRACEFUL=USR1 + +case $host in + *-apple-aux3*) + APR_SETVAR(APACHE_MPM, [prefork]) + APR_SETVAR(SINGLE_LISTEN_UNSERIALIZED_ACCEPT, [1]) + ;; + *-beos*) + APR_SETVAR(APACHE_MPM, [beos]) + APR_SETVAR(SINGLE_LISTEN_UNSERIALIZED_ACCEPT, [1]) + ;; + *os2_emx*) + APR_SETVAR(APACHE_MPM, [mpmt_os2]) + APR_SETVAR(SINGLE_LISTEN_UNSERIALIZED_ACCEPT, [1]) + ;; + *-linux-*) + case `uname -r` in + 2.0* ) + AP_SIG_GRACEFUL=WINCH + ;; + 2.[[2-9]]* ) + 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(APACHE_MPM, [prefork]) + APR_SETVAR(SINGLE_LISTEN_UNSERIALIZED_ACCEPT, [1]) + ;; + *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_PROG_AWK +AC_PROG_INSTALL +AC_PROG_LN_S +AC_CHECK_TOOL(RANLIB, ranlib, true) +dnl AC_PATH_PROG(PERL_PATH, perl) + +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 + +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 +) +AC_HEADER_SYS_WAIT + +dnl ## Check for typedefs, structures, and compiler characteristics. + +AC_C_CONST +if test "$ac_cv_prog_gcc" = "yes"; then + APR_ADDTO(NOTEST_CPPFLAGS,-DAP_HAVE_DESIGNATED_INITIALIZER) +fi + +dnl ## Check for library functions + +dnl See Comment #Spoon + +AC_CHECK_FUNCS( \ +getpwnam \ +getgrnam \ +initgroups \ +bindprocessor \ +prctl \ +timegm \ +) + +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) +fi + +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]) + +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 + *freebsd5*|*netbsd*|*openbsd*) + v4mapped=no + ;; + *) + v4mapped=yes + ;; +esac +]) + +if test $v4mapped = "yes" -o $ac_cv_define_APR_HAVE_IPV6 = "no"; then + nonssl_listen_stmt_1="" + nonssl_listen_stmt_2="Listen @@Port@@" + if test $ac_cv_define_APR_HAVE_IPV6 = "yes"; then + AC_DEFINE(AP_ENABLE_V4_MAPPED, 1, + [Allow IPv4 connections on IPv6 listening sockets]) + fi +else + nonssl_listen_stmt_1="Listen 0.0.0.0:@@Port@@" + nonssl_listen_stmt_2="Listen [[::]]:@@Port@@" +fi + +AC_ARG_ENABLE(exception-hook,APACHE_HELP_STRING(--enable-exception-hook,Enable fatal exception hook), +[ + AC_DEFINE(AP_ENABLE_EXCEPTION_HOOK, 1, + [Allow modules to run hook after a fatal exception]) +])dnl + +AC_ARG_ENABLE(maintainer-mode,APACHE_HELP_STRING(--enable-maintainer-mode,Turn on debugging and compile time warnings), +[ + APR_ADDTO(CPPFLAGS, -DAP_DEBUG) +])dnl + +prefix="$orig_prefix" +APACHE_ENABLE_MODULES + +dnl reading config stubs +esyscmd(./build/config-stubs .) + +APACHE_SUBST(progname) +APACHE_SUBST(MPM_LIB) +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"; then + case $host in + *-ibm-aix*) + HTTPD_LDFLAGS="$HTTPD_LDFLAGS -Wl,-uXML_Parse -Wl,-bE:$abs_builddir/server/httpd.exp" + SH_LDFLAGS="$SH_LDFLAGS \$(EXTRA_LDFLAGS) \$(EXTRA_LIBS)" + UTIL_LDFLAGS="$UTIL_LDFLAGS -Wl,-uXML_Parse" + ;; + *beos) + SH_LDFLAGS='$(top_builddir)/_APP_' + PRE_SHARED_CMDS='ln -s $(top_builddir)/httpd $(top_builddir)/_APP_' + POST_SHARED_CMDS='rm $(top_builddir)/_APP_' + ;; + *os390) + HTTPD_LDFLAGS="$HTTPD_LDFLAGS --main=$abs_srcdir/server/main.o --core-dll=$abs_srcdir/apachecore.dll" + SH_LDFLAGS="$SH_LDFLAGS --core-dll=$abs_srcdir/apachecore.dll" + esac +fi + +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),[ + AC_DEFINE_UNQUOTED(AP_LOG_EXEC, "$withval", [SuExec log file] ) ] ) + +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] ) ] ) + +dnl AP_LIBS specifies the actual libraries. note we have some required libs. +AP_LIBS="$abs_builddir/srclib/pcre/libpcre.la $AP_LIBS" + +dnl APR should go after the other libs, so the right symbols can be picked up +AP_LIBS="$AP_LIBS `$apu_config --link-libtool --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 + +AC_DEFINE_UNQUOTED(AP_SIG_GRACEFUL, SIG$AP_SIG_GRACEFUL, [Signal used to gracefully restart]) +AC_DEFINE_UNQUOTED(AP_SIG_GRACEFUL_STRING, "SIG$AP_SIG_GRACEFUL", [Signal used to gracefully restart (as a quoted string)]) +AC_DEFINE_UNQUOTED(AP_SIG_GRACEFUL_SHORT, $AP_SIG_GRACEFUL, [Signal used to gracefully restart (without SIG prefix)]) +AP_SIG_GRACEFUL_SHORT=$AP_SIG_GRACEFUL +AP_SIG_GRACEFUL=SIG$AP_SIG_GRACEFUL_SHORT +AC_SUBST(AP_SIG_GRACEFUL) +AC_SUBST(AP_SIG_GRACEFUL_STRING) +AC_SUBST(AP_SIG_GRACEFUL_SHORT) + +dnl check for endianness +if test "$cross_compiling" = "no"; then + AC_C_BIGENDIAN +else + AC_DEFINE(AP_UNKNOWN_BYTE_ORDER,1, + [byte order is unknown due to cross-compilation]) +fi + +APACHE_FAST_OUTPUT(Makefile modules/Makefile srclib/Makefile) +APACHE_FAST_OUTPUT(os/beos/Makefile os/os2/Makefile os/Makefile) +APACHE_FAST_OUTPUT(os/unix/Makefile server/Makefile) +APACHE_FAST_OUTPUT(support/Makefile srclib/pcre/Makefile) + +if test -d ./test; then + APACHE_FAST_OUTPUT(test/Makefile) +fi + +dnl ## Finalize the variables +echo $ac_n "${nl}Restore user-defined environment settings...${nl}" + +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_) + +echo $ac_n "${nl}Construct makefiles and header files...${nl}" + +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]) +AC_DEFINE_UNQUOTED(APACHE_MPM_DIR, "$MPM_DIR", + [Location of the source for the current MPM]) + +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 + +dnl Ensure that the httpd version is included +HTTPD_VERSION=`$srcdir/build/get-version.sh all $srcdir/include/ap_release.h AP_SERVER` +AC_SUBST(HTTPD_VERSION) + +AC_OUTPUT($APACHE_OUTPUT_FILES docs/conf/httpd-std.conf docs/conf/ssl-std.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,[true],[ + APACHE_GEN_MAKEFILES +]) + diff --git a/rubbos/app/httpd-2.0.64/docs/cgi-examples/printenv b/rubbos/app/httpd-2.0.64/docs/cgi-examples/printenv new file mode 100644 index 00000000..e4c2140b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/cgi-examples/printenv @@ -0,0 +1,13 @@ +#!/usr/local/bin/perl +## +## printenv -- demo CGI program which just prints its environment +## + +print "Content-type: text/plain; charset=iso-8859-1\n\n"; +foreach $var (sort(keys(%ENV))) { + $val = $ENV{$var}; + $val =~ s|\n|\\n|g; + $val =~ s|"|\\"|g; + print "${var}=\"${val}\"\n"; +} + diff --git a/rubbos/app/httpd-2.0.64/docs/cgi-examples/test-cgi b/rubbos/app/httpd-2.0.64/docs/cgi-examples/test-cgi new file mode 100644 index 00000000..e27f8575 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/cgi-examples/test-cgi @@ -0,0 +1,31 @@ +#!/bin/sh + +# 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/rubbos/app/httpd-2.0.64/docs/conf/highperformance-std.conf b/rubbos/app/httpd-2.0.64/docs/conf/highperformance-std.conf new file mode 100644 index 00000000..a8e033c2 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/conf/highperformance-std.conf @@ -0,0 +1,70 @@ +# Ha, you're reading this config file looking for the easy way out! +# "how do I make my apache server go really really fast??" +# Well you could start by reading the /manual/misc/perf-tuning.html +# page. But, we'll give you a head start. +# +# This config file is small, it is probably not what you'd expect on a +# full featured internet webserver with multiple users. But it's +# probably a good starting point for any folks interested in testing +# performance. +# +# To run this config you'll need to use something like: +# httpd -f @@ServerRoot@@/conf/highperformance.conf + +Listen 80 +ServerRoot @@ServerRoot@@ +DocumentRoot @@ServerRoot@@/htdocs + +User nobody +# If you're not on Linux, you'll probably need to change Group +Group nobody + + +MaxClients 150 +StartServers 5 +MinSpareServers 5 +MaxSpareServers 10 + + + +StartServers 2 +MaxClients 150 +MinSpareThreads 25 +MaxSpareThreads 75 +ThreadsPerChild 25 +MaxRequestsPerChild 0 + + +# Assume no memory leaks at all +MaxRequestsPerChild 0 + +# it's always nice to know the server has started +ErrorLog logs/error_log + +# Some benchmarks require logging, which is a good requirement. Uncomment +# this if you need logging. +#TransferLog logs/access_log + + + # The server can be made to avoid following symbolic links, + # to make security simpler. However, this takes extra CPU time, + # so we will just let it follow symlinks. + Options FollowSymLinks + + # Don't check for .htaccess files in each directory - they slow + # things down + AllowOverride None + + # If this was a real internet server you'd probably want to + # uncomment these: + #order deny,allow + #deny from all + + +# If this was a real internet server you'd probably want to uncomment this: +# +# order allow,deny +# allow from all +# + +# OK that's enough hints. Read the documentation if you want more. diff --git a/rubbos/app/httpd-2.0.64/docs/conf/httpd-std.conf b/rubbos/app/httpd-2.0.64/docs/conf/httpd-std.conf new file mode 100644 index 00000000..1b432586 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/conf/httpd-std.conf @@ -0,0 +1,1042 @@ +# +# Based upon the NCSA server configuration files originally by Rob McCool. +# +# This is the main Apache server configuration file. It contains the +# configuration directives that give the server its instructions. +# See for detailed information about +# the directives. +# +# 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. +# +# The configuration directives are grouped into three basic sections: +# 1. Directives that control the operation of the Apache server process as a +# whole (the 'global environment'). +# 2. Directives that define the parameters of the 'main' or 'default' server, +# which responds to requests that aren't handled by a virtual host. +# These directives also provide default values for the settings +# of all virtual hosts. +# 3. Settings for virtual hosts, which allow Web requests to be sent to +# different IP addresses or hostnames and have them handled by the +# same Apache server process. +# +# 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/foo.log" +# with ServerRoot set to "@@ServerRoot@@" will be interpreted by the +# server as "@@ServerRoot@@/logs/foo.log". +# + +### Section 1: Global Environment +# +# The directives in this section affect the overall operation of Apache, +# such as the number of concurrent requests it can handle or where it +# can find its configuration files. +# + +# +# ServerRoot: The top of the directory tree under which the server's +# configuration, error, and log files are kept. +# +# NOTE! If you intend to place this on an NFS (or otherwise network) +# mounted filesystem then please read the LockFile documentation (available +# at ); +# you will save yourself a lot of trouble. +# +# Do NOT add a slash at the end of the directory path. +# +ServerRoot "@@ServerRoot@@" + +# +# The accept serialization lock file MUST BE STORED ON A LOCAL DISK. +# + + +#LockFile logs/accept.lock + + + +# +# ScoreBoardFile: File used to store internal server process information. +# If unspecified (the default), the scoreboard will be stored in an +# anonymous shared memory segment, and will be unavailable to third-party +# applications. +# If specified, ensure that no two invocations of Apache share the same +# scoreboard file. The scoreboard file MUST BE STORED ON A LOCAL DISK. +# + + +#ScoreBoardFile logs/apache_runtime_status + + + + +# +# PidFile: The file in which the server should record its process +# identification number when it starts. +# + +PidFile logs/httpd.pid + + +# +# Timeout: The number of seconds before receives and sends time out. +# +Timeout 300 + +# +# 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 15 + +## +## Server-Pool Size Regulation (MPM specific) +## + +# 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 +# MaxClients: maximum number of server processes allowed to start +# MaxRequestsPerChild: maximum number of requests a server process serves + +StartServers 5 +MinSpareServers 5 +MaxSpareServers 10 +MaxClients 150 +MaxRequestsPerChild 0 + + +# worker MPM +# StartServers: initial number of server processes to start +# MaxClients: maximum number of simultaneous client connections +# 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 +# MaxRequestsPerChild: maximum number of requests a server process serves + +StartServers 2 +MaxClients 150 +MinSpareThreads 25 +MaxSpareThreads 75 +ThreadsPerChild 25 +MaxRequestsPerChild 0 + + +# perchild MPM +# NumServers: constant number of server processes +# StartThreads: initial number of worker threads in each server process +# MinSpareThreads: minimum number of worker threads which are kept spare +# MaxSpareThreads: maximum number of worker threads which are kept spare +# MaxThreadsPerChild: maximum number of worker threads in each server process +# MaxRequestsPerChild: maximum number of connections per server process + +NumServers 5 +StartThreads 5 +MinSpareThreads 5 +MaxSpareThreads 10 +MaxThreadsPerChild 20 +MaxRequestsPerChild 0 + + +# WinNT MPM +# ThreadsPerChild: constant number of worker threads in the server process +# MaxRequestsPerChild: maximum number of requests a server process serves + +ThreadsPerChild 250 +MaxRequestsPerChild 0 + + +# BeOS MPM +# StartThreads: how many threads do we initially spawn? +# MaxClients: max number of threads we can have (1 thread == 1 client) +# MaxRequestsPerThread: maximum number of requests each thread will process + +StartThreads 10 +MaxClients 50 +MaxRequestsPerThread 10000 + + +# 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 +# MaxRequestsPerChild: Maximum number of requests 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 +MaxRequestsPerChild 0 +MaxMemFree 100 + + +# 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 +# MaxRequestsPerChild: Maximum number of connections per server process + +StartServers 2 +MinSpareThreads 5 +MaxSpareThreads 10 +MaxRequestsPerChild 0 + + +# +# 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 (0.0.0.0) +# +#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@@ + +# +# 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 + +### Section 2: '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. +# + + + +# +# 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. +# . On SCO (ODT 3) use "User nouser" and "Group nogroup". +# . On HPUX you may not be able to use shared memory as nobody, and the +# suggested workaround is to create a user www and use that user. +# NOTE that some kernels refuse to setgid(Group) or semctl(IPC_SET) +# when the value of (unsigned)Group is above 60000; +# don't use Group #-1 on these systems! +# +User nobody +Group #-1 + + + +# +# 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 this is not set to valid DNS name for your host, server-generated +# redirections will not work. See also the UseCanonicalName directive. +# +# If your host doesn't have a registered DNS name, enter its IP address here. +# You will have to access it by its address anyway, and this will make +# redirections work in a sensible way. +# +#ServerName www.example.com:80 + +# +# 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 + +# +# 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 "/bottlenecks/rubbos/app/apache2/htdocs" + +# +# Each directory to which Apache has access can be configured with respect +# to which services and features are allowed and/or disabled in that +# directory (and its subdirectories). +# +# First, we configure the "default" to be a very restrictive set of +# features. +# + + Options FollowSymLinks + AllowOverride None + + +# +# 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. +# + +# +# This should be changed to whatever you set DocumentRoot to. +# + + +# +# 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.0/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: +# Options FileInfo AuthConfig Limit Indexes +# + AllowOverride None + +# +# Controls who can get stuff from this server. +# + Order allow,deny + Allow from all + + + +# +# UserDir: The name of the directory that is appended onto a user's home +# directory if a ~user request is received. +# +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 +# +# Order allow,deny +# Allow from all +# +# +# Order deny,allow +# Deny from all +# +# + +# +# DirectoryIndex: sets the file that Apache will serve if a directory +# is requested. +# +# The index.html.var file (a type-map) is used to deliver content- +# negotiated documents. The MultiViews Option can be used for the +# same purpose, but it is much slower. +# +DirectoryIndex index.html index.html.var + +# +# AccessFileName: The name of the file to look for in each directory +# for additional configuration directives. See also the AllowOverride +# directive. +# +AccessFileName .htaccess + +# +# The following lines prevent .htaccess and .htpasswd files from being +# viewed by Web clients. +# + + Order allow,deny + Deny from all + + +# +# TypesConfig describes where the mime.types file (or equivalent) is +# to be found. +# +TypesConfig conf/mime.types + +# +# DefaultType is the default MIME type the server will use for a document +# if it cannot otherwise determine one, such as from filename extensions. +# If your server contains mostly text or HTML documents, "text/plain" is +# a good value. If most of your content is binary, such as applications +# or images, you may want to use "application/octet-stream" instead to +# keep browsers from trying to display binary files as though they are +# text. +# +DefaultType text/plain + +# +# 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 conf/magic + + +# +# 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 + +# +# EnableMMAP: Control whether memory-mapping is used to deliver +# files (assuming that the underlying OS supports it). +# The default is on; turn this off if you serve from NFS-mounted +# filesystems. On some systems, turning it off (regardless of +# filesystem) can improve performance; for details, please see +# http://httpd.apache.org/docs/2.0/mod/core.html#enablemmap +# +#EnableMMAP off + +# +# EnableSendfile: Control whether the sendfile kernel support is +# used to deliver files (assuming that the OS supports it). +# The default is on; turn this off if you serve from NFS-mounted +# filesystems. Please see +# http://httpd.apache.org/docs/2.0/mod/core.html#enablesendfile +# +#EnableSendfile off + +# +# 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 logs/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 +LogFormat "%{Referer}i -> %U" referer +LogFormat "%{User-agent}i" agent + +# 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 logs/access_log common + +# +# If you would like to have agent and referer logfiles, uncomment the +# following directives. +# +#CustomLog logs/referer_log referer +#CustomLog logs/agent_log agent + +# +# If you prefer a single logfile with access, agent, and referer information +# (Combined Logfile Format) you can use the following directive. +# +#CustomLog logs/access_log combined + +# +# 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 On + +# +# Aliases: Add here as many aliases as you need (with no limit). The format is +# Alias fakename realname +# +# Note that if you include a trailing / on fakename then the server will +# require it to be present in the URL. So "/icons" isn't aliased in this +# example, only "/icons/". If the fakename is slash-terminated, then the +# realname must also be slash terminated, and if the fakename omits the +# trailing slash, the realname must also omit it. +# +# We include the /icons/ alias for FancyIndexed directory listings. If you +# do not use FancyIndexing, you may comment this out. +# +Alias /icons/ "/bottlenecks/rubbos/app/apache2/icons/" + + + Options Indexes MultiViews + AllowOverride None + Order allow,deny + Allow from all + + +# +# This should be changed to the ServerRoot/manual/. The alias provides +# the manual, even if you choose to move your DocumentRoot. You may comment +# this out if you do not care for the documentation. +# +AliasMatch ^/manual(?:/(?:de|en|es|fr|ja|ko|ru|tr))?(/.*)?$ "/bottlenecks/rubbos/app/apache2/manual$1" + + + Options Indexes + AllowOverride None + Order allow,deny + Allow from all + + + SetHandler type-map + + # .tr is text/troff in mime.types! + + ForceType text/html + + + SetEnvIf Request_URI ^/manual/(de|en|es|fr|ja|ko|ru|tr)/ prefer-language=$1 + RedirectMatch 301 ^/manual(?:/(de|en|es|fr|ja|ko|ru|tr)){2,}(/.*)?$ /manual/$1$2 + + +# +# ScriptAlias: This controls which directories contain server scripts. +# ScriptAliases are essentially the same as Aliases, except that +# documents in the realname 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/ "/bottlenecks/rubbos/app/apache2/cgi-bin/" + + +# +# Additional to mod_cgid.c settings, mod_cgid has Scriptsock +# for setting UNIX socket for communicating with cgid. +# +#Scriptsock logs/cgisock + + +# +# "/bottlenecks/rubbos/app/apache2/cgi-bin" should be changed to whatever your ScriptAliased +# CGI directory exists, if you have that configured. +# + + AllowOverride None + Options None + Order allow,deny + Allow from all + + +# +# Redirect allows you to tell clients about documents which used to exist in +# your server's namespace, but do not anymore. This allows you to tell the +# clients where to look for the relocated document. +# Example: +# Redirect permanent /foo http://www.example.com/bar + +# +# Directives controlling the display of server-generated directory listings. +# + +# +# IndexOptions: Controls the appearance of server-generated directory +# listings. +# +IndexOptions FancyIndexing VersionSort + +# +# 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 + +# +# 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 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 .latin5 .cyr .iso-ru +AddCharset ISO-8859-6 .iso8859-6 .latin6 .arb +AddCharset ISO-8859-7 .iso8859-7 .latin7 .grk +AddCharset ISO-8859-8 .iso8859-8 .latin8 .heb +AddCharset ISO-8859-9 .iso8859-9 .latin9 .trk +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 +# For russian, more than one charset is used (depends on client, mostly): +AddCharset WINDOWS-1251 .cp-1251 .win-1251 +AddCharset CP866 .cp866 +AddCharset KOI8-r .koi8-r .koi8-ru +AddCharset KOI8-ru .koi8-uk .ua +AddCharset ISO-10646-UCS-2 .ucs2 +AddCharset ISO-10646-UCS-4 .ucs4 +AddCharset UTF-8 .utf8 + +# The set below does not map to a specific (iso) standard +# but works on a fairly wide range of browsers. Note that +# capitalization actually matters (it should not, but it +# does for some browsers). +# +# See http://www.iana.org/assignments/character-sets +# for a list of sorts. But browsers support few. +# +AddCharset GB2312 .gb2312 .gb +AddCharset utf-7 .utf7 +AddCharset utf-8 .utf8 +AddCharset big5 .big5 .b5 +AddCharset EUC-TW .euc-tw +AddCharset EUC-JP .euc-jp +AddCharset EUC-KR .euc-kr +AddCharset shift_jis .sjis + +# +# AddType allows you to add to or override the MIME configuration +# file mime.types for specific file types. +# +#AddType application/x-tar .tgz +# +# AddEncoding allows you to have certain browsers uncompress +# information on the fly. Note: Not all browsers support this. +# Despite the name similarity, the following Add* directives have nothing +# to do with the FancyIndexing customization directives above. +# +#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 files that include their own HTTP headers: +# +#AddHandler send-as-is asis + +# +# For server-parsed imagemap files: +# +#AddHandler imap-file map + +# +# For type maps (negotiated resources): +# (This is enabled by default to allow the Apache "It Worked" page +# to be distributed in multiple languages.) +# +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 + +# +# Action lets you define media types that will execute a script whenever +# a matching file is called. This eliminates the need for repeated URL +# pathnames for oft-used CGI file processors. +# Format: Action media/type /cgi-script/location +# Format: Action handler-name /cgi-script/location +# + +# +# 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 +# + +# +# Putting this all together, we can internationalize error responses. +# +# 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 +# /bottlenecks/rubbos/app/apache2/error/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. +# +# The internationalized error documents require mod_alias, mod_include +# and mod_negotiation. To activate them, uncomment the following 30 lines. + +# Alias /error/ "/bottlenecks/rubbos/app/apache2/error/" +# +# +# AllowOverride None +# Options IncludesNoExec +# AddOutputFilter Includes html +# AddHandler type-map var +# Order allow,deny +# Allow from all +# 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 + + +# +# The following directives modify normal HTTP response behavior to +# handle known problems with browser implementations. +# +BrowserMatch "Mozilla/2" nokeepalive +BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0 +BrowserMatch "RealPlayer 4\.0" force-response-1.0 +BrowserMatch "Java/1\.0" force-response-1.0 +BrowserMatch "JDK/1\.0" force-response-1.0 + +# +# The following directive disables redirects on non-GET requests for +# a directory that does not include the trailing slash. This fixes a +# problem with Microsoft WebFolders which does not appropriately handle +# redirects for folders with DAV methods. +# Same deal with Apple's DAV filesystem and Gnome VFS support for DAV. +# +BrowserMatch "Microsoft Data Access Internet Publishing Provider" redirect-carefully +BrowserMatch "MS FrontPage" redirect-carefully +BrowserMatch "^WebDrive" redirect-carefully +BrowserMatch "^WebDAVFS/1.[0123]" redirect-carefully +BrowserMatch "^gnome-vfs" redirect-carefully +BrowserMatch "^XML Spy" redirect-carefully +BrowserMatch "^Dreamweaver-WebDAV-SCM1" redirect-carefully + +# +# 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 +# Order deny,allow +# Deny from all +# Allow from .example.com +# + +# +# 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 +# Order deny,allow +# Deny from all +# Allow from .example.com +# + + +# +# Bring in additional module-specific configurations +# + + Include conf/ssl.conf + + + +### Section 3: Virtual Hosts +# +# VirtualHost: 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. + +# +# Use name-based virtual hosting. +# +#NameVirtualHost *:80 + +# +# VirtualHost example: +# Almost any Apache directive may go into a VirtualHost container. +# The first VirtualHost section is used for requests without a known +# server name. +# +# +# ServerAdmin webmaster@dummy-host.example.com +# DocumentRoot /www/docs/dummy-host.example.com +# ServerName dummy-host.example.com +# ErrorLog logs/dummy-host.example.com-error_log +# CustomLog logs/dummy-host.example.com-access_log common +# diff --git a/rubbos/app/httpd-2.0.64/docs/conf/httpd-std.conf.in b/rubbos/app/httpd-2.0.64/docs/conf/httpd-std.conf.in new file mode 100644 index 00000000..d0b6e348 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/conf/httpd-std.conf.in @@ -0,0 +1,1042 @@ +# +# Based upon the NCSA server configuration files originally by Rob McCool. +# +# This is the main Apache server configuration file. It contains the +# configuration directives that give the server its instructions. +# See for detailed information about +# the directives. +# +# 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. +# +# The configuration directives are grouped into three basic sections: +# 1. Directives that control the operation of the Apache server process as a +# whole (the 'global environment'). +# 2. Directives that define the parameters of the 'main' or 'default' server, +# which responds to requests that aren't handled by a virtual host. +# These directives also provide default values for the settings +# of all virtual hosts. +# 3. Settings for virtual hosts, which allow Web requests to be sent to +# different IP addresses or hostnames and have them handled by the +# same Apache server process. +# +# 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 "@rel_logfiledir@/foo.log" +# with ServerRoot set to "@@ServerRoot@@" will be interpreted by the +# server as "@@ServerRoot@@/@rel_logfiledir@/foo.log". +# + +### Section 1: Global Environment +# +# The directives in this section affect the overall operation of Apache, +# such as the number of concurrent requests it can handle or where it +# can find its configuration files. +# + +# +# ServerRoot: The top of the directory tree under which the server's +# configuration, error, and log files are kept. +# +# NOTE! If you intend to place this on an NFS (or otherwise network) +# mounted filesystem then please read the LockFile documentation (available +# at ); +# you will save yourself a lot of trouble. +# +# Do NOT add a slash at the end of the directory path. +# +ServerRoot "@@ServerRoot@@" + +# +# The accept serialization lock file MUST BE STORED ON A LOCAL DISK. +# + + +#LockFile @rel_logfiledir@/accept.lock + + + +# +# ScoreBoardFile: File used to store internal server process information. +# If unspecified (the default), the scoreboard will be stored in an +# anonymous shared memory segment, and will be unavailable to third-party +# applications. +# If specified, ensure that no two invocations of Apache share the same +# scoreboard file. The scoreboard file MUST BE STORED ON A LOCAL DISK. +# + + +#ScoreBoardFile @rel_logfiledir@/apache_runtime_status + + + + +# +# PidFile: The file in which the server should record its process +# identification number when it starts. +# + +PidFile @rel_runtimedir@/httpd.pid + + +# +# Timeout: The number of seconds before receives and sends time out. +# +Timeout 300 + +# +# 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 15 + +## +## Server-Pool Size Regulation (MPM specific) +## + +# 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 +# MaxClients: maximum number of server processes allowed to start +# MaxRequestsPerChild: maximum number of requests a server process serves + +StartServers 5 +MinSpareServers 5 +MaxSpareServers 10 +MaxClients 150 +MaxRequestsPerChild 0 + + +# worker MPM +# StartServers: initial number of server processes to start +# MaxClients: maximum number of simultaneous client connections +# 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 +# MaxRequestsPerChild: maximum number of requests a server process serves + +StartServers 2 +MaxClients 150 +MinSpareThreads 25 +MaxSpareThreads 75 +ThreadsPerChild 25 +MaxRequestsPerChild 0 + + +# perchild MPM +# NumServers: constant number of server processes +# StartThreads: initial number of worker threads in each server process +# MinSpareThreads: minimum number of worker threads which are kept spare +# MaxSpareThreads: maximum number of worker threads which are kept spare +# MaxThreadsPerChild: maximum number of worker threads in each server process +# MaxRequestsPerChild: maximum number of connections per server process + +NumServers 5 +StartThreads 5 +MinSpareThreads 5 +MaxSpareThreads 10 +MaxThreadsPerChild 20 +MaxRequestsPerChild 0 + + +# WinNT MPM +# ThreadsPerChild: constant number of worker threads in the server process +# MaxRequestsPerChild: maximum number of requests a server process serves + +ThreadsPerChild 250 +MaxRequestsPerChild 0 + + +# BeOS MPM +# StartThreads: how many threads do we initially spawn? +# MaxClients: max number of threads we can have (1 thread == 1 client) +# MaxRequestsPerThread: maximum number of requests each thread will process + +StartThreads 10 +MaxClients 50 +MaxRequestsPerThread 10000 + + +# 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 +# MaxRequestsPerChild: Maximum number of requests 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 +MaxRequestsPerChild 0 +MaxMemFree 100 + + +# 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 +# MaxRequestsPerChild: Maximum number of connections per server process + +StartServers 2 +MinSpareThreads 5 +MaxSpareThreads 10 +MaxRequestsPerChild 0 + + +# +# 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 (0.0.0.0) +# +#Listen 12.34.56.78:80 +@nonssl_listen_stmt_1@ +@nonssl_listen_stmt_2@ + +# +# 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@@ + +# +# 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 + +### Section 2: '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. +# + + + +# +# 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. +# . On SCO (ODT 3) use "User nouser" and "Group nogroup". +# . On HPUX you may not be able to use shared memory as nobody, and the +# suggested workaround is to create a user www and use that user. +# NOTE that some kernels refuse to setgid(Group) or semctl(IPC_SET) +# when the value of (unsigned)Group is above 60000; +# don't use Group #-1 on these systems! +# +User nobody +Group #-1 + + + +# +# 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 this is not set to valid DNS name for your host, server-generated +# redirections will not work. See also the UseCanonicalName directive. +# +# If your host doesn't have a registered DNS name, enter its IP address here. +# You will have to access it by its address anyway, and this will make +# redirections work in a sensible way. +# +#ServerName www.example.com:80 + +# +# 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 + +# +# 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@" + +# +# Each directory to which Apache has access can be configured with respect +# to which services and features are allowed and/or disabled in that +# directory (and its subdirectories). +# +# First, we configure the "default" to be a very restrictive set of +# features. +# + + Options FollowSymLinks + AllowOverride None + + +# +# 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. +# + +# +# This should be changed to whatever you set DocumentRoot to. +# + + +# +# 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.0/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: +# Options FileInfo AuthConfig Limit Indexes +# + AllowOverride None + +# +# Controls who can get stuff from this server. +# + Order allow,deny + Allow from all + + + +# +# UserDir: The name of the directory that is appended onto a user's home +# directory if a ~user request is received. +# +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 +# +# Order allow,deny +# Allow from all +# +# +# Order deny,allow +# Deny from all +# +# + +# +# DirectoryIndex: sets the file that Apache will serve if a directory +# is requested. +# +# The index.html.var file (a type-map) is used to deliver content- +# negotiated documents. The MultiViews Option can be used for the +# same purpose, but it is much slower. +# +DirectoryIndex index.html index.html.var + +# +# AccessFileName: The name of the file to look for in each directory +# for additional configuration directives. See also the AllowOverride +# directive. +# +AccessFileName .htaccess + +# +# The following lines prevent .htaccess and .htpasswd files from being +# viewed by Web clients. +# + + Order allow,deny + Deny from all + + +# +# TypesConfig describes where the mime.types file (or equivalent) is +# to be found. +# +TypesConfig @rel_sysconfdir@/mime.types + +# +# DefaultType is the default MIME type the server will use for a document +# if it cannot otherwise determine one, such as from filename extensions. +# If your server contains mostly text or HTML documents, "text/plain" is +# a good value. If most of your content is binary, such as applications +# or images, you may want to use "application/octet-stream" instead to +# keep browsers from trying to display binary files as though they are +# text. +# +DefaultType text/plain + +# +# 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 + + +# +# 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 + +# +# EnableMMAP: Control whether memory-mapping is used to deliver +# files (assuming that the underlying OS supports it). +# The default is on; turn this off if you serve from NFS-mounted +# filesystems. On some systems, turning it off (regardless of +# filesystem) can improve performance; for details, please see +# http://httpd.apache.org/docs/2.0/mod/core.html#enablemmap +# +#EnableMMAP off + +# +# EnableSendfile: Control whether the sendfile kernel support is +# used to deliver files (assuming that the OS supports it). +# The default is on; turn this off if you serve from NFS-mounted +# filesystems. Please see +# http://httpd.apache.org/docs/2.0/mod/core.html#enablesendfile +# +#EnableSendfile off + +# +# 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 +LogFormat "%{Referer}i -> %U" referer +LogFormat "%{User-agent}i" agent + +# 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 would like to have agent and referer logfiles, uncomment the +# following directives. +# +#CustomLog @rel_logfiledir@/referer_log referer +#CustomLog @rel_logfiledir@/agent_log agent + +# +# If you prefer a single logfile with access, agent, and referer information +# (Combined Logfile Format) you can use the following directive. +# +#CustomLog @rel_logfiledir@/access_log combined + +# +# 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 On + +# +# Aliases: Add here as many aliases as you need (with no limit). The format is +# Alias fakename realname +# +# Note that if you include a trailing / on fakename then the server will +# require it to be present in the URL. So "/icons" isn't aliased in this +# example, only "/icons/". If the fakename is slash-terminated, then the +# realname must also be slash terminated, and if the fakename omits the +# trailing slash, the realname must also omit it. +# +# 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 + Order allow,deny + Allow from all + + +# +# This should be changed to the ServerRoot/manual/. The alias provides +# the manual, even if you choose to move your DocumentRoot. You may comment +# this out if you do not care for the documentation. +# +AliasMatch ^/manual(?:/(?:de|en|es|fr|ja|ko|ru|tr))?(/.*)?$ "@exp_manualdir@$1" + + + Options Indexes + AllowOverride None + Order allow,deny + Allow from all + + + SetHandler type-map + + # .tr is text/troff in mime.types! + + ForceType text/html + + + SetEnvIf Request_URI ^/manual/(de|en|es|fr|ja|ko|ru|tr)/ prefer-language=$1 + RedirectMatch 301 ^/manual(?:/(de|en|es|fr|ja|ko|ru|tr)){2,}(/.*)?$ /manual/$1$2 + + +# +# ScriptAlias: This controls which directories contain server scripts. +# ScriptAliases are essentially the same as Aliases, except that +# documents in the realname 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@/" + + +# +# Additional to mod_cgid.c settings, mod_cgid has Scriptsock +# for setting UNIX socket for communicating with cgid. +# +#Scriptsock @rel_runtimedir@/cgisock + + +# +# "@exp_cgidir@" should be changed to whatever your ScriptAliased +# CGI directory exists, if you have that configured. +# + + AllowOverride None + Options None + Order allow,deny + Allow from all + + +# +# Redirect allows you to tell clients about documents which used to exist in +# your server's namespace, but do not anymore. This allows you to tell the +# clients where to look for the relocated document. +# Example: +# Redirect permanent /foo http://www.example.com/bar + +# +# Directives controlling the display of server-generated directory listings. +# + +# +# IndexOptions: Controls the appearance of server-generated directory +# listings. +# +IndexOptions FancyIndexing VersionSort + +# +# 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 + +# +# 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 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 .latin5 .cyr .iso-ru +AddCharset ISO-8859-6 .iso8859-6 .latin6 .arb +AddCharset ISO-8859-7 .iso8859-7 .latin7 .grk +AddCharset ISO-8859-8 .iso8859-8 .latin8 .heb +AddCharset ISO-8859-9 .iso8859-9 .latin9 .trk +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 +# For russian, more than one charset is used (depends on client, mostly): +AddCharset WINDOWS-1251 .cp-1251 .win-1251 +AddCharset CP866 .cp866 +AddCharset KOI8-r .koi8-r .koi8-ru +AddCharset KOI8-ru .koi8-uk .ua +AddCharset ISO-10646-UCS-2 .ucs2 +AddCharset ISO-10646-UCS-4 .ucs4 +AddCharset UTF-8 .utf8 + +# The set below does not map to a specific (iso) standard +# but works on a fairly wide range of browsers. Note that +# capitalization actually matters (it should not, but it +# does for some browsers). +# +# See http://www.iana.org/assignments/character-sets +# for a list of sorts. But browsers support few. +# +AddCharset GB2312 .gb2312 .gb +AddCharset utf-7 .utf7 +AddCharset utf-8 .utf8 +AddCharset big5 .big5 .b5 +AddCharset EUC-TW .euc-tw +AddCharset EUC-JP .euc-jp +AddCharset EUC-KR .euc-kr +AddCharset shift_jis .sjis + +# +# AddType allows you to add to or override the MIME configuration +# file mime.types for specific file types. +# +#AddType application/x-tar .tgz +# +# AddEncoding allows you to have certain browsers uncompress +# information on the fly. Note: Not all browsers support this. +# Despite the name similarity, the following Add* directives have nothing +# to do with the FancyIndexing customization directives above. +# +#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 files that include their own HTTP headers: +# +#AddHandler send-as-is asis + +# +# For server-parsed imagemap files: +# +#AddHandler imap-file map + +# +# For type maps (negotiated resources): +# (This is enabled by default to allow the Apache "It Worked" page +# to be distributed in multiple languages.) +# +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 + +# +# Action lets you define media types that will execute a script whenever +# a matching file is called. This eliminates the need for repeated URL +# pathnames for oft-used CGI file processors. +# Format: Action media/type /cgi-script/location +# Format: Action handler-name /cgi-script/location +# + +# +# 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 +# + +# +# Putting this all together, we can internationalize error responses. +# +# 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. +# +# The internationalized error documents require mod_alias, mod_include +# and mod_negotiation. To activate them, uncomment the following 30 lines. + +# Alias /error/ "@exp_errordir@/" +# +# +# AllowOverride None +# Options IncludesNoExec +# AddOutputFilter Includes html +# AddHandler type-map var +# Order allow,deny +# Allow from all +# 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 + + +# +# The following directives modify normal HTTP response behavior to +# handle known problems with browser implementations. +# +BrowserMatch "Mozilla/2" nokeepalive +BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0 +BrowserMatch "RealPlayer 4\.0" force-response-1.0 +BrowserMatch "Java/1\.0" force-response-1.0 +BrowserMatch "JDK/1\.0" force-response-1.0 + +# +# The following directive disables redirects on non-GET requests for +# a directory that does not include the trailing slash. This fixes a +# problem with Microsoft WebFolders which does not appropriately handle +# redirects for folders with DAV methods. +# Same deal with Apple's DAV filesystem and Gnome VFS support for DAV. +# +BrowserMatch "Microsoft Data Access Internet Publishing Provider" redirect-carefully +BrowserMatch "MS FrontPage" redirect-carefully +BrowserMatch "^WebDrive" redirect-carefully +BrowserMatch "^WebDAVFS/1.[0123]" redirect-carefully +BrowserMatch "^gnome-vfs" redirect-carefully +BrowserMatch "^XML Spy" redirect-carefully +BrowserMatch "^Dreamweaver-WebDAV-SCM1" redirect-carefully + +# +# 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 +# Order deny,allow +# Deny from all +# Allow from .example.com +# + +# +# 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 +# Order deny,allow +# Deny from all +# Allow from .example.com +# + + +# +# Bring in additional module-specific configurations +# + + Include @rel_sysconfdir@/ssl.conf + + + +### Section 3: Virtual Hosts +# +# VirtualHost: 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. + +# +# Use name-based virtual hosting. +# +#NameVirtualHost *:80 + +# +# VirtualHost example: +# Almost any Apache directive may go into a VirtualHost container. +# The first VirtualHost section is used for requests without a known +# server name. +# +# +# ServerAdmin webmaster@dummy-host.example.com +# DocumentRoot /www/docs/dummy-host.example.com +# ServerName dummy-host.example.com +# ErrorLog @rel_logfiledir@/dummy-host.example.com-error_log +# CustomLog @rel_logfiledir@/dummy-host.example.com-access_log common +# diff --git a/rubbos/app/httpd-2.0.64/docs/conf/httpd-win.conf b/rubbos/app/httpd-2.0.64/docs/conf/httpd-win.conf new file mode 100644 index 00000000..6fa2a4eb --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/conf/httpd-win.conf @@ -0,0 +1,961 @@ +# +# Based upon the NCSA server configuration files originally by Rob McCool. +# +# This is the main Apache server configuration file. It contains the +# configuration directives that give the server its instructions. +# See for detailed information about +# the directives. +# +# 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. +# +# The configuration directives are grouped into three basic sections: +# 1. Directives that control the operation of the Apache server process as a +# whole (the 'global environment'). +# 2. Directives that define the parameters of the 'main' or 'default' server, +# which responds to requests that aren't handled by a virtual host. +# These directives also provide default values for the settings +# of all virtual hosts. +# 3. Settings for virtual hosts, which allow Web requests to be sent to +# different IP addresses or hostnames and have them handled by the +# same Apache server process. +# +# 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/foo.log" +# with ServerRoot set to "@@ServerRoot@@" will be interpreted by the +# server as "@@ServerRoot@@/logs/foo.log". +# +# NOTE: Where filenames are specified, you must use forward slashes +# instead of backslashes (e.g., "c:/apache" instead of "c:\apache"). +# If a drive letter is omitted, the drive on which Apache.exe is located +# will be used by default. It is recommended that you always supply +# an explicit drive letter in absolute paths, however, to avoid +# confusion. +# + +### Section 1: Global Environment +# +# The directives in this section affect the overall operation of Apache, +# such as the number of concurrent requests it can handle or where it +# can find its configuration files. +# + +# +# ServerRoot: The top of the directory tree under which the server's +# configuration, error, and log files are kept. +# +# NOTE! If you intend to place this on an NFS (or otherwise network) +# mounted filesystem then please read the LockFile documentation (available +# at ); +# you will save yourself a lot of trouble. +# +# Do NOT add a slash at the end of the directory path. +# +ServerRoot "@@ServerRoot@@" + +# +# ScoreBoardFile: File used to store internal server process information. +# If unspecified (the default), the scoreboard will be stored in an +# anonymous shared memory segment, and will be unavailable to third-party +# applications. +# If specified, ensure that no two invocations of Apache share the same +# scoreboard file. The scoreboard file MUST BE STORED ON A LOCAL DISK. +# +#ScoreBoardFile logs/apache_runtime_status + +# +# PidFile: The file in which the server should record its process +# identification number when it starts. +# +PidFile logs/httpd.pid + +# +# Timeout: The number of seconds before receives and sends time out. +# +Timeout 300 + +# +# 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 15 + +## +## Server-Pool Size Regulation (MPM specific) +## + +# WinNT MPM +# ThreadsPerChild: constant number of worker threads in the server process +# MaxRequestsPerChild: maximum number of requests a server process serves + +ThreadsPerChild 250 +MaxRequestsPerChild 0 + + +# +# 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 (0.0.0.0) +# +#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 access_module modules/mod_access.so +LoadModule actions_module modules/mod_actions.so +LoadModule alias_module modules/mod_alias.so +LoadModule asis_module modules/mod_asis.so +LoadModule auth_module modules/mod_auth.so +#LoadModule auth_anon_module modules/mod_auth_anon.so +#LoadModule auth_dbm_module modules/mod_auth_dbm.so +#LoadModule auth_digest_module modules/mod_auth_digest.so +LoadModule autoindex_module modules/mod_autoindex.so +#LoadModule cern_meta_module modules/mod_cern_meta.so +LoadModule cgi_module modules/mod_cgi.so +#LoadModule dav_module modules/mod_dav.so +#LoadModule dav_fs_module modules/mod_dav_fs.so +LoadModule dir_module modules/mod_dir.so +LoadModule env_module modules/mod_env.so +#LoadModule expires_module modules/mod_expires.so +#LoadModule file_cache_module modules/mod_file_cache.so +#LoadModule headers_module modules/mod_headers.so +LoadModule imap_module modules/mod_imap.so +LoadModule include_module modules/mod_include.so +#LoadModule info_module modules/mod_info.so +LoadModule isapi_module modules/mod_isapi.so +LoadModule log_config_module modules/mod_log_config.so +LoadModule mime_module modules/mod_mime.so +#LoadModule mime_magic_module modules/mod_mime_magic.so +#LoadModule proxy_module modules/mod_proxy.so +#LoadModule proxy_connect_module modules/mod_proxy_connect.so +#LoadModule proxy_http_module modules/mod_proxy_http.so +#LoadModule proxy_ftp_module modules/mod_proxy_ftp.so +LoadModule negotiation_module modules/mod_negotiation.so +#LoadModule rewrite_module modules/mod_rewrite.so +LoadModule setenvif_module modules/mod_setenvif.so +#LoadModule speling_module modules/mod_speling.so +#LoadModule status_module modules/mod_status.so +#LoadModule unique_id_module modules/mod_unique_id.so +LoadModule userdir_module modules/mod_userdir.so +#LoadModule usertrack_module modules/mod_usertrack.so +#LoadModule vhost_alias_module modules/mod_vhost_alias.so +#LoadModule ssl_module modules/mod_ssl.so + +# +# 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 + +### Section 2: '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 @@ServerAdmin@@ + +# +# 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 this is not set to valid DNS name for your host, server-generated +# redirections will not work. See also the UseCanonicalName directive. +# +# If your host doesn't have a registered DNS name, enter its IP address here. +# You will have to access it by its address anyway, and this will make +# redirections work in a sensible way. +# +ServerName @@ServerName@@:@@Port@@ + +# +# 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 + +# +# 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 "@@ServerRoot@@/htdocs" + +# +# Each directory to which Apache has access can be configured with respect +# to which services and features are allowed and/or disabled in that +# directory (and its subdirectories). +# +# First, we configure the "default" to be a very restrictive set of +# features. +# + + Options FollowSymLinks + AllowOverride None + + +# +# 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. +# + +# +# This should be changed to whatever you set DocumentRoot to. +# + + +# +# 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.0/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: +# Options FileInfo AuthConfig Limit +# + AllowOverride None + +# +# Controls who can get stuff from this server. +# + Order allow,deny + Allow from all + + + +# +# UserDir: The name of the directory that is appended onto a user's home +# directory if a ~user request is received. Be especially careful to use +# proper, forward slashes here. On Windows NT, "Personal/My Website" +# is a more appropriate choice. +# +UserDir "My Documents/My Website" + +# +# Control access to UserDir directories. The following is an example +# for a site where these directories are restricted to read-only. +# +# You must correct the path for the root to match your system's configured +# user directory location, e.g. "C:/WinNT/profiles/*/My Documents/My Website" +# or whichever, as appropriate. +# +# +# AllowOverride FileInfo AuthConfig Limit +# Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec +# +# Order allow,deny +# Allow from all +# +# +# Order deny,allow +# Deny from all +# +# + +# +# DirectoryIndex: sets the file that Apache will serve if a directory +# is requested. +# +# The index.html.var file (a type-map) is used to deliver content- +# negotiated documents. The MultiViews Option can be used for the +# same purpose, but it is much slower. +# +DirectoryIndex index.html index.html.var + +# +# AccessFileName: The name of the file to look for in each directory +# for additional configuration directives. See also the AllowOverride +# directive. +# +AccessFileName .htaccess + +# +# The following lines prevent .htaccess and .htpasswd files from being +# viewed by Web clients. +# + + Order allow,deny + Deny from all + + +# +# TypesConfig describes where the mime.types file (or equivalent) is +# to be found. +# +TypesConfig conf/mime.types + +# +# DefaultType is the default MIME type the server will use for a document +# if it cannot otherwise determine one, such as from filename extensions. +# If your server contains mostly text or HTML documents, "text/plain" is +# a good value. If most of your content is binary, such as applications +# or images, you may want to use "application/octet-stream" instead to +# keep browsers from trying to display binary files as though they are +# text. +# +DefaultType text/plain + +# +# 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 conf/magic + + +# +# 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 + +# +# EnableMMAP: Control whether memory-mapping is used to deliver +# files (assuming that the underlying OS supports it). +# The default is on; turn this off if you serve from NFS-mounted +# filesystems. On some systems, turning it off (regardless of +# filesystem) can improve performance; for details, please see +# http://httpd.apache.org/docs/2.0/mod/core.html#enablemmap +# +#EnableMMAP off + +# +# EnableSendfile: Control whether the sendfile kernel support is +# used to deliver files (assuming that the OS supports it). +# The default is on; turn this off if you serve from NFS-mounted +# filesystems. Please see +# http://httpd.apache.org/docs/2.0/mod/core.html#enablesendfile +# +#EnableSendfile off + +# +# 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 logs/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 +LogFormat "%{Referer}i -> %U" referer +LogFormat "%{User-agent}i" agent + +# 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 logs/access.log common + +# +# If you would like to have agent and referer logfiles, uncomment the +# following directives. +# +#CustomLog logs/referer.log referer +#CustomLog logs/agent.log agent + +# +# If you prefer a single logfile with access, agent, and referer information +# (Combined Logfile Format) you can use the following directive. +# +#CustomLog logs/access.log combined + +# +# 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 On + +# +# Aliases: Add here as many aliases as you need (with no limit). The format is +# Alias fakename realname +# +# Note that if you include a trailing / on fakename then the server will +# require it to be present in the URL. So "/icons" isn't aliased in this +# example, only "/icons/". If the fakename is slash-terminated, then the +# realname must also be slash terminated, and if the fakename omits the +# trailing slash, the realname must also omit it. +# +# We include the /icons/ alias for FancyIndexed directory listings. If you +# do not use FancyIndexing, you may comment this out. +# +Alias /icons/ "@@ServerRoot@@/icons/" + + + Options Indexes MultiViews + AllowOverride None + Order allow,deny + Allow from all + + +# +# This should be changed to the ServerRoot/manual/. The alias provides +# the manual, even if you choose to move your DocumentRoot. You may comment +# this out if you do not care for the documentation. +# +AliasMatch ^/manual(?:/(?:de|en|es|fr|ja|ko|ru|tr))?(/.*)?$ "@@ServerRoot@@/manual$1" + + + Options Indexes + AllowOverride None + Order allow,deny + Allow from all + + + SetHandler type-map + + # .tr is text/troff in mime.types! + + ForceType text/html + + + SetEnvIf Request_URI ^/manual/(de|en|es|fr|ja|ko|ru|tr)/ prefer-language=$1 + RedirectMatch 301 ^/manual(?:/(de|en|es|fr|ja|ko|ru|tr)){2,}(/.*)?$ /manual/$1$2 + + +# +# ScriptAlias: This controls which directories contain server scripts. +# ScriptAliases are essentially the same as Aliases, except that +# documents in the realname 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/ "@@ServerRoot@@/cgi-bin/" + +# +# "@@ServerRoot@@/cgi-bin" should be changed to whatever your ScriptAliased +# CGI directory exists, if you have that configured. +# + + AllowOverride None + Options None + Order allow,deny + Allow from all + + +# +# Redirect allows you to tell clients about documents which used to exist in +# your server's namespace, but do not anymore. This allows you to tell the +# clients where to look for the relocated document. +# Example: +# Redirect permanent /foo http://www.example.com/bar + +# +# Directives controlling the display of server-generated directory listings. +# + +# +# IndexOptions: Controls the appearance of server-generated directory +# listings. +# +IndexOptions FancyIndexing VersionSort + +# +# 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 + +# +# 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 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 .latin5 .cyr .iso-ru +AddCharset ISO-8859-6 .iso8859-6 .latin6 .arb +AddCharset ISO-8859-7 .iso8859-7 .latin7 .grk +AddCharset ISO-8859-8 .iso8859-8 .latin8 .heb +AddCharset ISO-8859-9 .iso8859-9 .latin9 .trk +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 +# For russian, more than one charset is used (depends on client, mostly): +AddCharset WINDOWS-1251 .cp-1251 .win-1251 +AddCharset CP866 .cp866 +AddCharset KOI8-r .koi8-r .koi8-ru +AddCharset KOI8-ru .koi8-uk .ua +AddCharset ISO-10646-UCS-2 .ucs2 +AddCharset ISO-10646-UCS-4 .ucs4 +AddCharset UTF-8 .utf8 + +# The set below does not map to a specific (iso) standard +# but works on a fairly wide range of browsers. Note that +# capitalization actually matters (it should not, but it +# does for some browsers). +# +# See http://www.iana.org/assignments/character-sets +# for a list of sorts. But browsers support few. +# +AddCharset GB2312 .gb2312 .gb +AddCharset utf-7 .utf7 +AddCharset utf-8 .utf8 +AddCharset big5 .big5 .b5 +AddCharset EUC-TW .euc-tw +AddCharset EUC-JP .euc-jp +AddCharset EUC-KR .euc-kr +AddCharset shift_jis .sjis + +# +# AddType allows you to add to or override the MIME configuration +# file mime.types for specific file types. +# +#AddType application/x-tar .tgz +# +# AddEncoding allows you to have certain browsers (Mosaic/X 2.1+) uncompress +# information on the fly. Note: Not all browsers support this. +# Despite the name similarity, the following Add* directives have nothing +# to do with the FancyIndexing customization directives above. +# +#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 files that include their own HTTP headers: +# +#AddHandler send-as-is asis + +# +# For server-parsed imagemap files: +# +#AddHandler imap-file map + +# +# For type maps (negotiated resources): +# (This is enabled by default to allow the Apache "It Worked" page +# to be distributed in multiple languages.) +# +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 + +# +# Action lets you define media types that will execute a script whenever +# a matching file is called. This eliminates the need for repeated URL +# pathnames for oft-used CGI file processors. +# Format: Action media/type /cgi-script/location +# Format: Action handler-name /cgi-script/location +# + +# +# 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 +# + +# +# Putting this all together, we can internationalize error responses. +# +# 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. +# +# The internationalized error documents require mod_alias, mod_include +# and mod_negotiation. To activate them, uncomment the following 30 lines. + +# Alias /error/ "@exp_errordir@/" +# +# +# AllowOverride None +# Options IncludesNoExec +# AddOutputFilter Includes html +# AddHandler type-map var +# Order allow,deny +# Allow from all +# 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 + + + +# +# The following directives modify normal HTTP response behavior to +# handle known problems with browser implementations. +# +BrowserMatch "Mozilla/2" nokeepalive +BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0 +BrowserMatch "RealPlayer 4\.0" force-response-1.0 +BrowserMatch "Java/1\.0" force-response-1.0 +BrowserMatch "JDK/1\.0" force-response-1.0 + +# +# The following directive disables redirects on non-GET requests for +# a directory that does not include the trailing slash. This fixes a +# problem with Microsoft WebFolders which does not appropriately handle +# redirects for folders with DAV methods. +# Same deal with Apple's DAV filesystem and Gnome VFS support for DAV. +# +BrowserMatch "Microsoft Data Access Internet Publishing Provider" redirect-carefully +BrowserMatch "MS FrontPage" redirect-carefully +BrowserMatch "^WebDrive" redirect-carefully +BrowserMatch "^WebDAVFS/1.[0123]" redirect-carefully +BrowserMatch "^gnome-vfs" redirect-carefully +BrowserMatch "^XML Spy" redirect-carefully +BrowserMatch "^Dreamweaver-WebDAV-SCM1" redirect-carefully + +# +# Allow server status reports generated by mod_status, +# with the URL of http://servername/server-status +# Change the ".@@DomainName@@" to match your domain to enable. +# +# +# SetHandler server-status +# Order deny,allow +# Deny from all +# Allow from .@@DomainName@@ +# + +# +# Allow remote server configuration reports, with the URL of +# http://servername/server-info (requires that mod_info.c be loaded). +# Change the ".@@DomainName@@" to match your domain to enable. +# +# +# SetHandler server-info +# Order deny,allow +# Deny from all +# Allow from .@@DomainName@@ +# + + +# +# Bring in additional module-specific configurations +# + + Include conf/ssl.conf + + + +### Section 3: Virtual Hosts +# +# VirtualHost: 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. + +# +# Use name-based virtual hosting. +# +#NameVirtualHost *:80 + +# +# VirtualHost example: +# Almost any Apache directive may go into a VirtualHost container. +# The first VirtualHost section is used for requests without a known +# server name. +# +# +# ServerAdmin webmaster@dummy-host.example.com +# DocumentRoot /www/docs/dummy-host.example.com +# ServerName dummy-host.example.com +# ErrorLog logs/dummy-host.example.com-error_log +# CustomLog logs/dummy-host.example.com-access_log common +# diff --git a/rubbos/app/httpd-2.0.64/docs/conf/magic b/rubbos/app/httpd-2.0.64/docs/conf/magic new file mode 100644 index 00000000..0de73361 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/conf/magic @@ -0,0 +1,382 @@ +# 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 audio/unknown +# - 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 + + +#------------------------------------------------------------------------------ +# 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/rubbos/app/httpd-2.0.64/docs/conf/mime.types b/rubbos/app/httpd-2.0.64/docs/conf/mime.types new file mode 100644 index 00000000..1ae00972 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/conf/mime.types @@ -0,0 +1,1351 @@ +# 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 redisribution. +# +# 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 Extensions +# application/3gpp-ims+xml +# application/activemessage +application/andrew-inset ez +# application/applefile +application/applixware aw +application/atom+xml atom +application/atomcat+xml atomcat +# application/atomicmail +application/atomsvc+xml atomsvc +# application/auth-policy+xml +# application/batch-smtp +# application/beep+xml +# application/cals-1840 +application/ccxml+xml ccxml +# application/cea-2018+xml +# application/cellml+xml +# application/cnrp+xml +# application/commonground +# application/conference-info+xml +# application/cpl+xml +# application/csta+xml +# application/cstadata+xml +application/cu-seeme cu +# application/cybercash +application/davmount+xml davmount +# application/dca-rft +# application/dec-dx +# application/dialog-info+xml +# application/dicom +# application/dns +application/dssc+der dssc +application/dssc+xml xdssc +# application/dvcs +application/ecmascript ecma +# application/edi-consent +# application/edi-x12 +# application/edifact +application/emma+xml emma +# application/epp+xml +application/epub+zip epub +# application/eshop +# application/example +# application/fastinfoset +# application/fastsoap +# application/fits +application/font-tdpfr pfr +# 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/iotp +application/ipfix ipfix +# application/ipp +# application/isup +application/java-archive jar +application/java-serialized-object ser +application/java-vm class +application/javascript js +application/json json +# application/kpml-request+xml +# application/kpml-response+xml +application/lost+xml lostxml +application/mac-binhex40 hqx +application/mac-compactpro cpt +# application/macwriteii +application/marc mrc +application/mathematica ma nb mb +application/mathml+xml mathml +# 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-user-service-description+xml +application/mbox mbox +# application/media_control+xml +application/mediaservercontrol+xml mscml +# application/mikey +# application/moss-keys +# application/moss-signature +# application/mosskey-data +# application/mosskey-request +application/mp4 mp4s +# application/mpeg4-generic +# application/mpeg4-iod +# application/mpeg4-iod-xmt +application/msword doc dot +application/mxf mxf +# application/nasdata +# application/news-checkgroups +# application/news-groupinfo +# application/news-transmission +# application/nss +# application/ocsp-request +# application/ocsp-response +application/octet-stream bin dms lha lrf lzh so iso dmg dist distz pkg bpk dump elc deploy +application/oda oda +application/oebps-package+xml opf +application/ogg ogx +application/onenote onetoc onetoc2 onetmp onepkg +# application/parityfec +application/patch-ops-error+xml xer +application/pdf pdf +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/pkcs7-mime p7m p7c +application/pkcs7-signature p7s +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/prs.alvestrand.titrax-sheet +application/prs.cww cww +# application/prs.nprend +# application/prs.plucker +# application/qsig +application/rdf+xml rdf +application/reginfo+xml rif +application/relax-ng-compact-syntax rnc +# application/remote-printing +application/resource-lists+xml rl +application/resource-lists-diff+xml rld +# application/riscos +# application/rlmi+xml +application/rls-services+xml rs +application/rsd+xml rsd +application/rss+xml rss +application/rtf rtf +# application/rtx +# application/samlassertion+xml +# application/samlmetadata+xml +application/sbml+xml sbml +application/scvp-cv-request scq +application/scvp-cv-response scs +application/scvp-vp-request spq +application/scvp-vp-response spp +application/sdp sdp +# 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/soap+fastinfoset +# application/soap+xml +application/sparql-query rq +application/sparql-results+xml srx +# application/spirits-event+xml +application/srgs gram +application/srgs+xml grxml +application/ssml+xml ssml +# application/timestamp-query +# application/timestamp-reply +# application/tve-trigger +# application/ulpfec +# application/vemmi +# application/vividence.scriptfile +# application/vnd.3gpp.bsf+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.3gpp2.bcmcsinfo+xml +# application/vnd.3gpp2.sms +application/vnd.3gpp2.tcap tcap +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.partial-upload +application/vnd.adobe.xdp+xml xdp +application/vnd.adobe.xfdf xfdf +# application/vnd.aether.imp +application/vnd.airzip.filesecure.azf azf +application/vnd.airzip.filesecure.azs azs +application/vnd.amazon.ebook azw +application/vnd.americandynamics.acc acc +application/vnd.amiga.ami ami +application/vnd.android.package-archive apk +application/vnd.anser-web-certificate-issue-initiation cii +application/vnd.anser-web-funds-transfer-initiation fti +application/vnd.antix.game-component atx +application/vnd.apple.installer+xml mpkg +application/vnd.apple.mpegurl m3u8 +# application/vnd.arastra.swi +application/vnd.aristanetworks.swi swi +application/vnd.audiograph aep +# application/vnd.autopackage +# application/vnd.avistar+xml +application/vnd.blueice.multipass mpm +# application/vnd.bluetooth.ep.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.chemdraw+xml cdxml +application/vnd.chipnuts.karaoke-mmd mmd +application/vnd.cinderella cdy +# application/vnd.cirpack.isdn-ext +application/vnd.claymore cla +application/vnd.cloanto.rp9 rp9 +application/vnd.clonk.c4group c4g c4d c4f c4p c4u +# application/vnd.commerce-battelle +application/vnd.commonspace csp +application/vnd.contact.cmsg cdbcmsg +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.car car +application/vnd.curl.pcurl pcurl +# application/vnd.cybank +application/vnd.data-vision.rdz rdz +application/vnd.denovo.fcselayout-link fe_launch +# application/vnd.dir-bi.plate-dl-nosuffix +application/vnd.dna dna +application/vnd.dolby.mlp mlp +# application/vnd.dolby.mobile.1 +# application/vnd.dolby.mobile.2 +application/vnd.dpgraph dpg +application/vnd.dreamfactory dfac +# application/vnd.dvb.esgcontainer +# application/vnd.dvb.ipdcdftnotifaccess +# application/vnd.dvb.ipdcesgaccess +# 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.dxr +application/vnd.dynageo geo +# 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.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.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.iptvueprofile+xml +# application/vnd.etsi.mcid+xml +# application/vnd.etsi.sci+xml +# application/vnd.etsi.simservs+xml +# 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.fdf fdf +application/vnd.fdsn.mseed mseed +application/vnd.fdsn.seed seed dataless +# application/vnd.ffsns +# application/vnd.fints +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.hbpl +application/vnd.fujixerox.ddd ddd +application/vnd.fujixerox.docuworks xdw +application/vnd.fujixerox.docuworks.binder xbd +# application/vnd.fut-misnet +application/vnd.fuzzysheet fzs +application/vnd.genomatix.tuxedo txd +# application/vnd.geocube+xml +application/vnd.geogebra.file ggb +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.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.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.handheld-entertainment+xml zmm +application/vnd.hbci hbci +# application/vnd.hcl-bireports +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.hzn-3d-crossword x3d +# 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.igloader igl +application/vnd.immervision-ivp ivp +application/vnd.immervision-ivu ivu +# application/vnd.informedcontrol.rms+xml +# application/vnd.informix-visionary +application/vnd.intercon.formnet xpw xpx +# application/vnd.intertrust.digibox +# application/vnd.intertrust.nncp +application/vnd.intu.qbo qbo +application/vnd.intu.qfx qfx +# application/vnd.iptc.g2.conceptitem+xml +# application/vnd.iptc.g2.knowledgeitem+xml +# application/vnd.iptc.g2.newsitem+xml +# application/vnd.iptc.g2.packageitem+xml +application/vnd.ipunplugged.rcprofile rcprofile +application/vnd.irepository.package+xml irp +application/vnd.is-xpr xpr +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.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.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.marlin.drm.actiontoken+xml +# application/vnd.marlin.drm.conftoken+xml +# application/vnd.marlin.drm.license+xml +# application/vnd.marlin.drm.mdcf +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.micrografx.flo flo +application/vnd.micrografx.igx igx +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-artgalry cil +# application/vnd.ms-asf +application/vnd.ms-cab-compressed cab +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-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-project mpp mpt +# application/vnd.ms-tnef +# 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.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.ncd.control +# application/vnd.ncd.reference +# application/vnd.nervana +# application/vnd.netfpx +application/vnd.neurolanguage.nlu nlu +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.isds-radio-presets +# application/vnd.nokia.iptv.config+xml +# 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.file-transfer +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 otm +application/vnd.oasis.opendocument.text-template ott +application/vnd.oasis.opendocument.text-web oth +# application/vnd.obn +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.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.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.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.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.osa.netdeploy +# application/vnd.osgi.bundle +application/vnd.osgi.dp dp +# application/vnd.otps.ct-kip+xml +application/vnd.palm pdb pqa oprc +# application/vnd.paos.xml +application/vnd.pawaafile paw +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.quark.quarkxpress qxd qxt qwd qwt qxl qxb +# 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.rapid +application/vnd.realvnc.bed bed +application/vnd.recordare.musicxml mxl +application/vnd.recordare.musicxml+xml musicxml +# application/vnd.renlearn.rlprint +application/vnd.rim.cod cod +application/vnd.rn-realmedia rm +application/vnd.route66.link66+xml link66 +# 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.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 +application/vnd.stardivision.writer vor +application/vnd.stardivision.writer-global sgl +# application/vnd.street-stream +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.sun.wadl+xml +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.ds.notification +application/vnd.tao.intent-module-archive tao +application/vnd.tmobile-livetv tmo +application/vnd.trid.tpt tpt +application/vnd.triscape.mxs mxs +application/vnd.trueapp tra +# application/vnd.truedoc +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.vcx vcx +# application/vnd.vd-study +# application/vnd.vectorworks +# 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.wsc +# 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.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.smaf-audio saf +application/vnd.yamaha.smaf-phrase spf +application/vnd.yellowriver-custom-menu cmp +application/vnd.zul zir zirz +application/vnd.zzazz.deck+xml zaz +application/voicexml+xml vxml +# application/watcherinfo+xml +# application/whoispp-query +# application/whoispp-response +application/winhlp hlp +# application/wita +# application/wordperfect5.1 +application/wsdl+xml wsdl +application/wspolicy+xml wspolicy +application/x-abiword abw +application/x-ace-compressed ace +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-bzip bz +application/x-bzip2 bz2 boz +application/x-cdlink vcd +application/x-chat chat +application/x-chess-pgn pgn +# application/x-compress +application/x-cpio cpio +application/x-csh csh +application/x-debian-package deb udeb +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-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-otf otf +application/x-font-pcf pcf +application/x-font-snf snf +# application/x-font-speedo +# application/x-font-sunos-news +application/x-font-ttf ttf ttc +application/x-font-type1 pfa pfb pfm afm +# application/x-font-vfont +application/x-futuresplash spl +application/x-gnumeric gnumeric +application/x-gtar gtar +# application/x-gzip +application/x-hdf hdf +application/x-java-jnlp-file jnlp +application/x-latex latex +application/x-mobipocket-ebook prc mobi +application/x-ms-application application +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 +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-pkcs12 p12 pfx +application/x-pkcs7-certificates p7b spc +application/x-pkcs7-certreqresp p7r +application/x-rar-compressed rar +application/x-sh sh +application/x-shar shar +application/x-shockwave-flash swf +application/x-silverlight-app xap +application/x-stuffit sit +application/x-stuffitx sitx +application/x-sv4cpio sv4cpio +application/x-sv4crc sv4crc +application/x-tar tar +application/x-tcl tcl +application/x-tex tex +application/x-tex-tfm tfm +application/x-texinfo texinfo texi +application/x-ustar ustar +application/x-wais-source src +application/x-x509-ca-cert der crt +application/x-xfig fig +application/x-xpinstall xpi +# application/x400-bp +# application/xcap-att+xml +# application/xcap-caps+xml +# application/xcap-el+xml +# application/xcap-error+xml +# application/xcap-ns+xml +# application/xcon-conference-info-diff+xml +# application/xcon-conference-info+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/xmpp+xml +application/xop+xml xop +application/xslt+xml xslt +application/xspf+xml xspf +application/xv+xml mxml xhvml xvml xvm +application/zip zip +# audio/32kadpcm +# audio/3gpp +# audio/3gpp2 +# audio/ac3 +audio/adpcm adp +# audio/amr +# audio/amr-wb +# audio/amr-wb+ +# 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/dvi4 +# audio/eac3 +# audio/evrc +# audio/evrc-qcp +# audio/evrc0 +# audio/evrc1 +# audio/evrcb +# audio/evrcb0 +# audio/evrcb1 +# audio/evrcwb +# audio/evrcwb0 +# audio/evrcwb1 +# audio/example +# 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/ilbc +# audio/l16 +# audio/l20 +# audio/l24 +# audio/l8 +# audio/lpc +audio/midi mid midi kar rmi +# audio/mobile-xmf +audio/mp4 mp4a +# audio/mp4a-latm +# audio/mpa +# audio/mpa-robust +audio/mpeg mpga mp2 mp2a mp3 m2a m3a +# audio/mpeg4-generic +audio/ogg oga ogg spx +# audio/parityfec +# audio/pcma +# audio/pcma-wb +# audio/pcmu-wb +# audio/pcmu +# audio/prs.sid +# audio/qcelp +# audio/red +# audio/rtp-enc-aescm128 +# audio/rtp-midi +# audio/rtx +# audio/smv +# audio/smv0 +# audio/smv-qcp +# 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.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.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.sealedmedia.softseal.mpeg +# audio/vnd.vmx.cvsd +# audio/vorbis +# audio/vorbis-config +audio/x-aac aac +audio/x-aiff aif aiff aifc +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-wav wav +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 +image/bmp bmp +image/cgm cgm +# image/example +# image/fits +image/g3fax g3 +image/gif gif +image/ief ief +# image/jp2 +image/jpeg jpeg jpg jpe +# image/jpm +# image/jpx +# image/naplps +image/png png +image/prs.btif btif +# image/prs.pti +image/svg+xml svg svgz +# image/t38 +image/tiff tiff tif +# image/tiff-fx +image/vnd.adobe.photoshop psd +# image/vnd.cns.inf2 +image/vnd.djvu djvu djv +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.ms-modi mdi +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.wap.wbmp wbmp +image/vnd.xiff xif +image/x-cmu-raster ras +image/x-cmx cmx +image/x-freehand fh fhc fh4 fh5 fh7 +image/x-icon ico +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-xbitmap xbm +image/x-xpixmap xpm +image/x-xwindowdump xwd +# message/cpim +# message/delivery-status +# message/disposition-notification +# message/example +# message/external-body +# 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 +# model/example +model/iges igs iges +model/mesh msh mesh silo +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 mts +# model/vnd.parasolid.transmit.binary +# model/vnd.parasolid.transmit.text +model/vnd.vtu vtu +model/vrml wrl 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 +text/calendar ics ifb +text/css css +text/csv csv +# text/directory +# text/dns +# text/ecmascript +# text/enriched +# text/example +text/html html htm +# text/javascript +# text/parityfec +text/plain txt text conf def list log in +# text/prs.fallenstein.rst +text/prs.lines.tag dsc +# text/vnd.radisys.msml-basic-layout +# text/red +# text/rfc822-headers +text/richtext rtx +# text/rtf +# text/rtp-enc-aescm128 +# text/rtx +text/sgml sgml sgm +# text/t140 +text/tab-separated-values tsv +text/troff t tr roff man me ms +# text/ulpfec +text/uri-list uri uris urls +# text/vnd.abc +text/vnd.curl curl +text/vnd.curl.dcurl dcurl +text/vnd.curl.scurl scurl +text/vnd.curl.mcurl mcurl +# text/vnd.dmclientscript +# 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.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-pascal p pas +text/x-java-source java +text/x-setext etx +text/x-uuencode uu +text/x-vcalendar vcs +text/x-vcard vcf +# text/xml +# text/xml-external-parsed-entity +video/3gpp 3gp +# video/3gpp-tt +video/3gpp2 3g2 +# video/bmpeg +# video/bt656 +# video/celb +# video/dv +# video/example +video/h261 h261 +video/h263 h263 +# video/h263-1998 +# video/h263-2000 +video/h264 h264 +video/jpeg jpgv +# video/jpeg2000 +video/jpm jpm jpgm +video/mj2 mj2 mjp2 +# video/mp1s +# video/mp2p +# video/mp2t +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/raw +# video/rtp-enc-aescm128 +# video/rtx +# video/smpte292m +# video/ulpfec +# video/vc1 +# video/vnd.cctv +# video/vnd.dlna.mpeg-tts +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.sealed.mpeg1 +# video/vnd.sealed.mpeg4 +# video/vnd.sealed.swf +# video/vnd.sealedmedia.softseal.mov +video/vnd.vivo viv +video/x-f4v f4v +video/x-fli fli +video/x-flv flv +video/x-m4v m4v +video/x-ms-asf asf asx +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 +x-conference/x-cooltalk ice diff --git a/rubbos/app/httpd-2.0.64/docs/conf/ssl-std.conf b/rubbos/app/httpd-2.0.64/docs/conf/ssl-std.conf new file mode 100644 index 00000000..691b6ed5 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/conf/ssl-std.conf @@ -0,0 +1,246 @@ +# +# 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 detailing 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. +# + +# +# 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. +# +# Note: This must come before the container 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 +#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 +# +# Note: Configurations that use IPv6 but not IPv4-mapped addresses need two +# Listen directives: "Listen [::]:443" and "Listen 0.0.0.0:443" +# +Listen 443 + +## +## SSL Global Context +## +## All SSL configuration in this context applies both to +## the main server and all SSL-enabled virtual hosts. +## + +# +# Some MIME-types for downloading Certificates and CRLs +# +AddType application/x-x509-ca-cert .crt +AddType application/x-pkcs7-crl .crl + +# Pass Phrase Dialog: +# Configure the pass phrase gathering process. +# The filtering dialog program (`builtin' is a 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 none +#SSLSessionCache shmht:/bottlenecks/rubbos/app/apache2/logs/ssl_scache(512000) +#SSLSessionCache shmcb:/bottlenecks/rubbos/app/apache2/logs/ssl_scache(512000) +SSLSessionCache dbm:/bottlenecks/rubbos/app/apache2/logs/ssl_scache +SSLSessionCacheTimeout 300 + +# Semaphore: +# Configure the path to the mutual exclusion semaphore the +# SSL engine uses internally for inter-process synchronization. +SSLMutex file:/bottlenecks/rubbos/app/apache2/logs/ssl_mutex + +## +## SSL Virtual Host Context +## + + + +# General setup for the virtual host +DocumentRoot "/bottlenecks/rubbos/app/apache2/htdocs" +ServerName www.example.com:443 +ServerAdmin you@example.com +ErrorLog /bottlenecks/rubbos/app/apache2/logs/error_log +TransferLog /bottlenecks/rubbos/app/apache2/logs/access_log + +# SSL Engine Switch: +# Enable/Disable SSL for this virtual host. +SSLEngine on + +# SSL Cipher Suite: +# List the ciphers that the client is permitted to negotiate. +# See the mod_ssl documentation for a complete list. +SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL + +# 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.) +SSLCertificateFile /bottlenecks/rubbos/app/apache2/conf/ssl.crt/server.crt +#SSLCertificateFile /bottlenecks/rubbos/app/apache2/conf/ssl.crt/server-dsa.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.) +SSLCertificateKeyFile /bottlenecks/rubbos/app/apache2/conf/ssl.key/server.key +#SSLCertificateKeyFile /bottlenecks/rubbos/app/apache2/conf/ssl.key/server-dsa.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 convinience. +#SSLCertificateChainFile /bottlenecks/rubbos/app/apache2/conf/ssl.crt/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 /bottlenecks/rubbos/app/apache2/conf/ssl.crt +#SSLCACertificateFile /bottlenecks/rubbos/app/apache2/conf/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) +# 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 /bottlenecks/rubbos/app/apache2/conf/ssl.crl +#SSLCARevocationFile /bottlenecks/rubbos/app/apache2/conf/ssl.crl/ca-bundle.crl + +# 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 + +# 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 CompatEnvVars: +# This exports obsolete environment variables for backward compatibility +# to Apache-SSL 1.x, mod_ssl 2.0.x, Sioux 1.0 and Stronghold 2.x. Use this +# to provide compatibility to existing CGI scripts. +# 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 +CompatEnvVars +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 send or allowed to 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. +SetEnvIf User-Agent ".*MSIE.*" \ + 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 /bottlenecks/rubbos/app/apache2/logs/ssl_request_log \ + "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b" + + + + diff --git a/rubbos/app/httpd-2.0.64/docs/conf/ssl-std.conf.in b/rubbos/app/httpd-2.0.64/docs/conf/ssl-std.conf.in new file mode 100644 index 00000000..978d2bd4 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/conf/ssl-std.conf.in @@ -0,0 +1,246 @@ +# +# 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 detailing 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. +# + +# +# 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. +# +# Note: This must come before the container 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 +#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 +# +# Note: Configurations that use IPv6 but not IPv4-mapped addresses need two +# Listen directives: "Listen [::]:443" and "Listen 0.0.0.0:443" +# +Listen 443 + +## +## SSL Global Context +## +## All SSL configuration in this context applies both to +## the main server and all SSL-enabled virtual hosts. +## + +# +# Some MIME-types for downloading Certificates and CRLs +# +AddType application/x-x509-ca-cert .crt +AddType application/x-pkcs7-crl .crl + +# Pass Phrase Dialog: +# Configure the pass phrase gathering process. +# The filtering dialog program (`builtin' is a 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 none +#SSLSessionCache shmht:@exp_runtimedir@/ssl_scache(512000) +#SSLSessionCache shmcb:@exp_runtimedir@/ssl_scache(512000) +SSLSessionCache dbm:@exp_runtimedir@/ssl_scache +SSLSessionCacheTimeout 300 + +# Semaphore: +# Configure the path to the mutual exclusion semaphore the +# SSL engine uses internally for inter-process synchronization. +SSLMutex file:@exp_runtimedir@/ssl_mutex + +## +## SSL Virtual Host Context +## + + + +# General setup for the virtual host +DocumentRoot "@exp_htdocsdir@" +ServerName www.example.com:443 +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 + +# SSL Cipher Suite: +# List the ciphers that the client is permitted to negotiate. +# See the mod_ssl documentation for a complete list. +SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL + +# 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.) +SSLCertificateFile @exp_sysconfdir@/ssl.crt/server.crt +#SSLCertificateFile @exp_sysconfdir@/ssl.crt/server-dsa.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.) +SSLCertificateKeyFile @exp_sysconfdir@/ssl.key/server.key +#SSLCertificateKeyFile @exp_sysconfdir@/ssl.key/server-dsa.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 convinience. +#SSLCertificateChainFile @exp_sysconfdir@/ssl.crt/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) +# 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 + +# 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 + +# 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 CompatEnvVars: +# This exports obsolete environment variables for backward compatibility +# to Apache-SSL 1.x, mod_ssl 2.0.x, Sioux 1.0 and Stronghold 2.x. Use this +# to provide compatibility to existing CGI scripts. +# 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 +CompatEnvVars +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 send or allowed to 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. +SetEnvIf User-Agent ".*MSIE.*" \ + 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/rubbos/app/httpd-2.0.64/docs/docroot/apache_pb.gif b/rubbos/app/httpd-2.0.64/docs/docroot/apache_pb.gif new file mode 100644 index 0000000000000000000000000000000000000000..3a1c139fc4247ec7e770fdaab961fb3692c953fb GIT binary patch literal 2326 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 XqiYh{4~%{)S#O;4Fm;B(z`p+hpbw|G literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/docroot/apache_pb2.png b/rubbos/app/httpd-2.0.64/docs/docroot/apache_pb2.png new file mode 100644 index 0000000000000000000000000000000000000000..28baa70fb8ce678b9e4a5eecb6697d43315f413a GIT binary patch literal 1463 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 + + +Pàgina de prova de la instal·lació d'Apache + + + +

    Si veieu això, la instal·lació del progamari +del servidor +web d'Apache al sistema ha tingut èxit. Ja podeu afegir +contingut al directori i substituir aquesta pàgina.

    + +
    +

    Veieu aquest text en comptes de la pàgina web que +cercàveu?

    + +

    Aquesta pàgina és aquí perquè l'administrador +del lloc ha canviat la configuració d'aquest servidor web. +Poseu-vos en contacte amb la persona responsable del manteniment +d'aquest servidor. +La Apache Software Foundation, que va escriure el programari del servidor web +que fa servir l'administrador d'aquest lloc, no té res a veure amb el +seu manteniment i no pot ajudar-vos a resoldre els problemes de configuració.

    + +
    +

    Aquesta distribució inclou la documentació +d'Apache.

    + +

    Podeu fer servir lliurement la imatge que surt a sota en un servidor web +que funcioni amb Apache. Gràcies per fer servir Apache!

    + +
    + + + diff --git a/rubbos/app/httpd-2.0.64/docs/docroot/index.html.cz.iso8859-2 b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.cz.iso8859-2 new file mode 100644 index 00000000..e0cd2ba6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.cz.iso8859-2 @@ -0,0 +1,51 @@ + + + + + Testovací stránka instalace web serveru Apache + + + +

    + Funguje to! Na tomto serveru bì¾í Apache! +

    +

    + Pokud vidíte tuto zprávu, správce tohoto poèítaèe právì úspì¹nì + nainstaloval Apache web server. + Teï je¹tì musí doplnit obsah a nahradit tuto standardní uvítací + stránku, nebo pøesmìrovat server na skuteènou domovskou stránku. +

    +
    +
    + Pokud vidíte tuto zprávu místo oèekávané domovské stránky, + kontaktujte, prosím, správce pøíslu¹ného web + serveru. (Zkuste poslat e-mail na adresu + <Webmaster@domain>.) + Pøesto¾e tento server pou¾ívá program Apache, témìø jistì nemá nic + spoleèného s Apache Group, proto prosím neposílejte e-maily o tomto + serveru nebo jeho obsahu autorùm Apache. Pokud to udìláte, budeme + va¹e zprávy ignorovat. +
    +
    +

    + Zde najdete + dokumentaci + Apache (anglicky) obsa¾enou v této distribuci. +

    +

    + Následující logo mù¾e být pou¾ito bez omezení na web serveru s + programem Apache. Dìkujeme za pou¾ití Apache! +

    +
    + +
    + + diff --git a/rubbos/app/httpd-2.0.64/docs/docroot/index.html.de b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.de new file mode 100644 index 00000000..cad034c0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.de @@ -0,0 +1,61 @@ + + + + Testseite fuer die Apache-Installation auf dieser Website + + + + +

    + Es klappt! Der Apache-Webserver ist auf dieser Website installiert! +

    +

    + Wenn Sie diese Seite sehen, dann bedeutet das, dass die + Eigentümer dieser Domäne soeben einen neuen + Apache-Webserver + erfolgreich installiert haben. Jetzt muss noch der + richtige Webinhalt zugefügt und diese Platzhalterseite + ersetzt werden (oder der Webserver für den Zugriff auf den + richtigen Inhalt umkonfiguriert werden). +

    +
    +
    + Wenn Sie diese Seite an Stelle einer anderen erwarteten Website + sehen sollten, dann nehmen Sie bitte Kontakt mit dem + Eigentümer dieser Site auf (Versuchen Sie, eine E-Mail + an <Webmaster@domänenname> + zu senden)!
    +

    + Obwohl der Eigentümer dieser Domäne die Apache-Webserver-Software + verwendet, hat diese Website ziemlich sicher + keinerlei Verbindung mit der Apache Software Foundation + (die diese Software kostenlos vertreibt). Es besteht also + keinerlei Veranlassung, eine E-Mail an + die Entwickler der Software zu senden. Sollten Sie das dennoch + tun, wird Ihre E-Mail stillschweigend + ignoriert. +

    +
    +

    + Die englische Online-Dokumentation für die + Apache-Webserver-Software ist Bestandteil dieser + Software-Distribution. +

    +

    + Dem Webmaster dieser Website steht es frei, das + untenstehende "Powered by Apache"-Logo auf einem Apache-basierten + Webserver zu verwenden.
    + Vielen Dank, dass Sie Apache gewählt haben! +

    +
    + Powered by Apache! +
    + + diff --git a/rubbos/app/httpd-2.0.64/docs/docroot/index.html.dk b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.dk new file mode 100644 index 00000000..cbe8aade --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.dk @@ -0,0 +1,47 @@ + + + + Prøveside for Apache installationen + + + +

    + Det virkede! Apache Webserveren er installeret på denne maskine! +

    +

    + Hvis du kan se denne side, så har dem som ejer dette domæne lige + installeret Apache Webserveren. + Du må nu placere web sider i dette directory og fjerne denne side, eller + konfigurere serveren til at anvende et andet directory. +

    +
    +
    + Hvis du ser denne side istedet for en anden forventet side, kontakt + venligst administratoren for den server du prøver at kontakte. + (Prøv at sende mail til <Webmaster@domain>.) + Apachegruppen har ikke noget at gøre med denne site, så det vil ikke + hjælpe at sende mail to Apache udviklerne angående denne site. +
    +
    +

    + Apache- + documentationen + er inkluderet med denne distribution. +

    +

    + Webmasteren af denne site må gerne bruge den følgende grafik + på en Apache-drevet webserver. Mange tak for at bruge Apache! +

    +
    + +
    + + diff --git a/rubbos/app/httpd-2.0.64/docs/docroot/index.html.ee b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.ee new file mode 100644 index 00000000..7d8bc9c8 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.ee @@ -0,0 +1,53 @@ + + + + Apache veebiserveri installatsiooni testlehekülg + + + + +

    + Kujuta pilti, käima läks! Apache veebiserver on installeeritud! +

    +

    + Kui Sa näed seda lehekülge, siis selle domeeni omanikud on + edukalt hakkama saanud Apache veebiserveri + installeerimisega. Järgmiseks peaks nad selle lehekülje asendama + misiganes materjaliga, mida nad oma veebisaidis näidata tahavad, + või siis juhatama veebiserverile kätte tegeliku materjali + asukoha. +

    +
    +
    + Kui Sa ootasid siin leheküljel näha hoopis midagi muud, + siis palun võta ühendust selle veebisaidi + administraatoriga. (Võid näiteks kirjutada aadressil + <Webmaster@domain>.) Kuigi see veebisait + kasutab Apache tarkvara, pole ta peaaegu kindlasti mitte Apache Group'iga + mingil muul moel seotud. Seega, palun ära kirjuta selle saidi + asjus Apache autoritele. Kui sa seda teed, siis sinu kirja + ignoreeritakse. +
    +
    +

    + Ka Apache + dokumentatsioon + on selles distributsioonis olemas. +

    +

    + Kohalik veebmeister võib vabalt kasutada allpool olevat + pilti oma Apache veebiserveril. Aitäh Apachet kasutamast! +

    +
    + +
    + + diff --git a/rubbos/app/httpd-2.0.64/docs/docroot/index.html.el b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.el new file mode 100644 index 00000000..75c8737e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.el @@ -0,0 +1,37 @@ + + + + ÄïêéìáóôéêÞ Óåëßäá ãéá ôçí ÅãêáôÜóôáóç ôïõ Apache + + + + + +

    +ÅÜí ìðïñåßôå íá äåßôå áõôÞ ôç óåëßäá, ôüôå ç åãêáôÜóôáóç ôïõ ëïãéóìéêïý ôïõ ÅîõðçñåôçôÞ WWW Apache óå áõôü ôï óýóôçìá Þôáí åðéôõ÷Þò. Ìðïñåßôå ôþñá íá ðñïóèÝóåôå ðåñéå÷üìåíï óå áõôü ôïí êáôÜëïãï êáé íá áíôéêáôáóôÞóåôå áõôÞ ôç óåëßäá. + +


    + +

    ÂëÝðåôå áõôÞ ôç óåëßäá áíôß ãéá ôï äéêôõáêü ôüðï ðïõ ðåñéìÝíáôå;

    + +

    +ÁõôÞ ç óåëßäá âñßóêåôáé åäþ ãéáôß ï äéá÷åéñéóôÞò áõôïý ôïõ äéêôõáêïý ôüðïõ ôñïðïðïßçóå ôéò ñõèìßóåéò óôïí åîõðçñåôçôÞ Apache. Ðáñáêáëþ åðéêïéíùíÞóôå ìå ôïí õðåýèõíï ãéá ôç äéá÷åßñéóç ôïõ ðáñüíôïò åîõðçñåôçôÞ. Ôï ºäñõìá Ëïãéóìéêïý Apache (The Apache Software Foundation) Ýãñáøå ôï ëïãéóìéêü ôïõ åîõðçñåôçôÞ WWW ôï ïðïßï ÷ñçóéìïðïéåß ï äéá÷åéñéóôÞò áõôïý ôïõ äéêôõáêïý ôüðïõ. Ôï ºäñõìá üìùò äåí Ý÷åé êáìéÜ áñìïäéüôçôá ó÷åôéêÞ ìå ôç äéá÷åßñéóç áõôïý ôïõ äéêôõáêïý ôüðïõ êáé äåí ìðïñåß íá âïçèÞóåé óôçí åðßëõóç èåìÜôùí ðïõ Ý÷ïõí ó÷Ýóç ìå ôéò ñõèìßóåéò ôïõ. + +


    + + +

    ôåêìçñßùóç ôïõ Apache Ý÷åé óõìðåñéëçöèåß óå áõôÞ ôç äéáíïìÞ. + +

    +Åßóôå åëåýèåñïò/ç íá ÷ñçóéìïðïéÞóåôå ôçí ðáñáêÜôù åéêüíá óå Ýíáí åîõðçñåôçôÞ ôïõ WWW ðïõ âáóßæåôáé óå Apache. Åõ÷áñéóôïýìå ðïõ ÷ñçóéìïðïéåßôå ôïí Apache! + +

    + + diff --git a/rubbos/app/httpd-2.0.64/docs/docroot/index.html.en b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.en new file mode 100644 index 00000000..dc4c5182 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.en @@ -0,0 +1,38 @@ + + + +Test Page for Apache Installation + + + +

    If you can see this, it means that the installation of the Apache web +server software on this system was successful. You may now add +content to this directory and replace this page.

    + +
    +

    Seeing this instead of the website you +expected?

    + +

    This page is here because the site administrator has changed the +configuration of this web server. Please contact the person +responsible for maintaining this server with questions. +The Apache Software Foundation, which wrote the web server software +this site administrator is using, has nothing to do with +maintaining this site and cannot help resolve configuration +issues.

    + +
    +

    The Apache documentation has been included +with this distribution.

    + +

    You are free to use the image below on an Apache-powered web +server. Thanks for using Apache!

    + +
    + + + diff --git a/rubbos/app/httpd-2.0.64/docs/docroot/index.html.es b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.es new file mode 100644 index 00000000..5cbaffc4 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.es @@ -0,0 +1,51 @@ + + + + Página para probar la instalación de Apache + + + +

    + ¡Funcionó! ¡El Servidor de Red Apache ha sido instalado en ese sitio! +

    +

    + Si usted puede ver esta página, entonces los dueños de esta + máquina han instalado el Servidor de + Red Apache con éxito. Ahora deben añadir contenido a este directorio + y reemplazar esta página, ó apuntar este servidor al contenido real. +

    +
    +
    + Si usted esta leyendo esta página y no es lo que esperaba, por favor + contacte el administrador de este sitio. + (Trate de enviar correo electrónico a <Webmaster@domain>.) + Aunque este sitio esta utilizando el programa Apache es casi seguro + que no tiene ninguna conexión con el Apache Group, por eso favor de + no enviar correo sobre este sitio o su contenido a los autores de + Apache. Si lo hace, su mensaje sera + ignorado. +
    +
    +

    + La + documentación + de Apache ha sido incluida en esta distribución. +

    +

    + El administrador del sitio esta invitado a usar la siguiente + imagen para indicar que su sitio es servido por Apache. + ¡Gracias por usar Apache! +

    +
    + +
    + + diff --git a/rubbos/app/httpd-2.0.64/docs/docroot/index.html.et b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.et new file mode 100644 index 00000000..99f2ce6b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.et @@ -0,0 +1,53 @@ + + + + Apache veebiserveri installatsiooni testlehekülg + + + + +

    + Kujuta pilti, käima läks! Apache veebiserver on installeeritud! +

    +

    + Kui Sa näed seda lehekülge, siis selle domeeni omanikud on + edukalt hakkama saanud Apache veebiserveri + installeerimisega. Järgmiseks peaks nad selle lehekülje asendama + misiganes materjaliga, mida nad oma veebisaidis näidata tahavad, + või siis juhatama veebiserverile kätte tegeliku materjali + asukoha. +

    +
    +
    + Kui Sa ootasid siin leheküljel näha hoopis midagi muud, + siis palun võta ühendust selle veebisaidi + administraatoriga. (Võid näiteks kirjutada aadressil + <Webmaster@domain>.) Kuigi see veebisait + kasutab Apache tarkvara, pole ta peaaegu kindlasti mitte Apache Group'iga + mingil muul moel seotud. Seega, palun ära kirjuta selle saidi + asjus Apache autoritele. Kui sa seda teed, siis sinu kirja + ignoreeritakse. +
    +
    +

    + Ka Apache + dokumentatsioon + on selles distributsioonis olemas. +

    +

    + Kohalik veebmeister võib vabalt kasutada allpool olevat + pilti oma Apache veebiserveril. Aitäh Apachet kasutamast! +

    +
    + +
    + + diff --git a/rubbos/app/httpd-2.0.64/docs/docroot/index.html.fr b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.fr new file mode 100644 index 00000000..98154f1e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.fr @@ -0,0 +1,47 @@ + + + + + Page de test de l'installation d'Apache + + + + + +

    Si vous lisez cette page, c'est que les propriétaires de ce +domaine viennent d'installer le +serveur web Apache +avec succès. Ils doivent maintenant ajouter du contenu à ce +répertoire et remplacer cette page, ou bien faire pointer le serveur +vers l'endroit où se trouve le contenu réel du site.

    + +
    + +

    Vous voyez cette page au lieu du site attendu ?

    + +

    Vous voyez cette page parce que l'administrateur du site a modifié +la configuration de ce serveur Web. Veuillez contacter +l'administrateur du site concerné. La Fondation +Apache (Apache Software Foundation), qui produit le logiciel Apache +utilisé par ce site, n'a rien à voir avec la maintenance de ce +site et ne peut intervenir sur sa configuration.

    + +
    + +

    La documentation Apache est incluse dans cette +distribution.

    + +

    Le webmaster de ce site peut librement utiliser l'image ci-dessous sur un +site web utilisant le logiciel Apache. Merci d'avoir choisi Apache !

    + +
    + + + diff --git a/rubbos/app/httpd-2.0.64/docs/docroot/index.html.he.iso8859-8 b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.he.iso8859-8 new file mode 100644 index 00000000..7006856e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.he.iso8859-8 @@ -0,0 +1,54 @@ + + + + + Apache-ä úøù úð÷úäì ïåéñð óã + + + + +
    +

    + +
    äæä ãåîòä úà äàåø äúà íà +
    Apache èðøèðéàä úøù ìù äð÷úääù øîåà äæ +
    !!!äçìöäá äøáò +
    êìù íéöá÷ä úà óéñåäì ìåëé äúà åéùëò +
    .äæä óãä úà óéìçäìå úàæä äöéçîì + + +


    + +

    ?úéôéöù øúàä íå÷îá úàæ äàåø

    +

    +
    äæä øúàä ìò éàøçàä éë ,ïàë àöîð äæä ãåîòä +
    .äæä èðøèðéàä úøù ìù äéöøåâéôðå÷ä úà äðéù +
    .úåìàù íò úøùä éàøçà íò øù÷ øåöéì àð +
    úà äøöé øùà Apache Software Foundation +
    úøùä ú÷åæçú ìò úéàøçà äðéà ,äæä úøùä úðëåú +
    äéöøåâéôðå÷ úåéòá ïåøúôá òééñì äìåëé äðéàå + .ïäùìë + +


    + +

    +
    êåúá íéòöîð äéöèðîå÷åãä éëîñî + .úøùä úðëåú úìéáç + + +

    +
    ãåîòä úéúçúá àöîðä ìîñá ùîúùäì éàùø äúà +
    .Apache é''ò ìòôåîù úøùä ìò ÷ø + + !!!Apache-á ùåîéùä ìò äãåú + +

    +
    + + diff --git a/rubbos/app/httpd-2.0.64/docs/docroot/index.html.hr.iso8859-2 b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.hr.iso8859-2 new file mode 100644 index 00000000..b4103516 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.hr.iso8859-2 @@ -0,0 +1,35 @@ + + + + +Testna Stranica Apache Instalacije + + + +

    Èestitamo! Apache web poslu¾itelj funkcionira!

    +

    Ukoliko vidite ovu stranicu, to znaèi da je instalacija Apache web poslu¾itelja uspje¹no izvr¹ena na ovom raèunalu. +Sada mo¾ete dodati sadr¾aj u ovaj direktorij te promijeniti ovu stranicu.

    + +
    +

    Oèekivali ste neku drugu stranicu?

    + +

    Ovu stranica vidite stoga ¹to je administrator ovog poslu¾itelja promijenio +konfiguraciju. Apache Softver Fondacija napisala je softver koji koristi +administrator ovog web poslu¾itelja i nije odgovorna za njegovo odr¾avanje! Zbog toga vas molimo da se za +sva pitanja obratite administratoru ili osobi odgovornoj za odr¾avanje ovog poslu¾itelja.

    + +
    +

    Ovdje se nalazi Dokumentacija o Apache web poslu¾itelju +(engleski).

    + +

    Donju slièicu mo¾ete slobodno koristiti na stranicama ovog veb poslu¾itelja. +Hvala vam ¹to koristite Apache!

    + +
    Apache Web Poslu¾itelj
    + + + diff --git a/rubbos/app/httpd-2.0.64/docs/docroot/index.html.it b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.it new file mode 100644 index 00000000..e9ef9ed0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.it @@ -0,0 +1,39 @@ + + + + + Pagina di prova dell'installazione di un sito Web con Apache + + + + +
    +

    +Funziona! Il Server Web Apache è stato installato su questo sito Web!

    +Se riuscite a vedere questa pagina, allora vuol dire che coloro che gestiscono +questo dominio hanno appena installato il software +Web Server +Apache correttamente. Ora è necessario aggiungere il vostro materiale +in questa directory e sostituire questa pagina di prova, oppure configurare +il server per far riferimento al vostro materiale se collocato altrove. +

    +


    +
    Se state vedendo questa pagina invece del sito che pensavate, +vi preghiamo di contattare l'amministratore del sito in questione. +(Provate ad inviare un email a <Webmaster@domain>.)  +Nonostante questo sito stia utilizzando il software Apache, questo non +vi garantisce nessun tipo di contatto diretto al Gruppo Apache, quindi +vi preghiamo di non inviare email riguardanti questo sito o il materiale +in esso contenuto agli autori di Apache. Ogni messaggio del genere verrà +ignorato.
    + +
    +
    La documentazione relativa di Apache +è inclusa nella distribuzione. +

    Il Webmaster di questo sito è libero di utilizzare l'immagine qui sotto +su qualsiasi Web server potenziato con Apache. Grazie per aver scelto Apache! +

    +

    + + + diff --git a/rubbos/app/httpd-2.0.64/docs/docroot/index.html.ja.iso2022-jp b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.ja.iso2022-jp new file mode 100644 index 00000000..ba3e736b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.ja.iso2022-jp @@ -0,0 +1,42 @@ + + + + + Apache $B%$%s%9%H!<%k;~$N%F%9%H%Z!<%8(B + + + + + +

    +$B$b$7$3$N%Z!<%8$,FI$a$?$N$G$"$l$P!"(BApache $B%&%'%V%5!<%P(B$B$N%$%s%9%H!<%k$,$3$N7W;;5!$GL5;v$K=*N;$7$?$3$H$r0UL#$7$^$9!#$"$J$?$O!"$3$N%G%#%l%/%H%j$KJ8=q$r2C$($?$j!"$3$N%Z!<%8$rCV$-$+$($k$3$H$,$G$-$^$9!#(B +

    +
    + +

    $B$"$J$?$NM=A[$KH?$7$F!"$3$N%Z!<%8$,8+$($F$$$k$G$7$g$&$+(B?

    + +

    +$B$3$N%Z!<%8$O!"%5%$%H4IM}$B$3$N%5!<%P$r4IM}$9$k@UG$$r;}$C$F$$$kJ}$KO"Mm$r$H$C$F(B$B$/$@$5$$!#$3$N%5%$%H4IM} +


    + + +

    +Apache $B$K4X$9$k(B$BJ8=q(B $B$O!"$3$N(B web $B%5!<%PG[I[J*$NCf$K4^$^$l$F$$$^$9!#(B +

    +

    +$B0J2<$N2hA|$O!"(BApache $B$rMxMQ$7$F$$$k(B web $B%5!<%P$G<+M3$K;H$&$3$H$,$G$-$^$9!#(BApache $B$r$4MxMQ$$$?$@$-!"$"$j$,$H$&$4$6$$$^$9(B! +

    +
    + +
    + + diff --git a/rubbos/app/httpd-2.0.64/docs/docroot/index.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.ko.euc-kr new file mode 100644 index 00000000..65e90d2e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.ko.euc-kr @@ -0,0 +1,37 @@ + + + + +¾ÆÆÄÄ¡ ¼³Ä¡ °Ë»ç¿ë ÆäÀÌÁö + + + + + +

    ÀÌ ÆäÀÌÁö°¡ º¸ÀÎ´Ù¸é ½Ã½ºÅÛ¿¡ +Apache À¥¼­¹ö +¼ÒÇÁÆ®¿þ¾î°¡ ¼º°øÀûÀ¸·Î ¼³Ä¡µÇ¾úÀ½À» ÀǹÌÇÕ´Ï´Ù. ÀÌÁ¦ ÀÌ µð·ºÅ丮¿¡ +³»¿ëÀ» Ãß°¡ÇÏ°í ÀÌ ÆäÀÌÁö¸¦ ¹Ù²Ü ¼ö ÀÖ½À´Ï´Ù.

    + +
    +

    ¿¹»óÇÑ À¥»çÀÌÆ® ´ë½Å ÀÌ ÆäÀÌÁö°¡ º¸ÀԴϱî?

    + +

    »çÀÌÆ® °ü¸®ÀÚ°¡ À¥¼­¹ö ¼³Á¤À» º¯°æÇ߱⠶§¹®¿¡ ÀÌ ÆäÀÌÁö°¡ +º¸ÀÌ´Â °Í ÀÔ´Ï´Ù. Áú¹®»çÇ×Àº ÀÌ ¼­¹öÀÇ °ü¸®ÀÚ¿¡°Ô ¹®ÀÇÇϽñæ +¹Ù¶ø´Ï´Ù. Apache Software FoundationÀº ÀÌ »çÀÌÆ® °ü¸®ÀÚ°¡ +»ç¿ëÇÏ´Â À¥¼­¹ö¸¦ ¸¸µç ´ÜüÀÏ »Ó, »çÀÌÆ® °ü¸®¿Í ¾Æ¹«·± °ü°è°¡ ¾ø°í +¼³Á¤¹®Á¦¿¡ °üÇÑ µµ¿òÀ» µå¸± ¼ö ¾ø½À´Ï´Ù.

    + +
    +

    ¾ÆÆÄÄ¡ ¹®¼­´Â ÀÌ ¹èÆ÷ÆÇ¿¡ Æ÷ÇԵǾî ÀÖ½À´Ï´Ù.

    + +

    ¾ÆÆÄÄ¡¸¦ »ç¿ëÇÏ´Â À¥¼­¹ö¿¡¼­ ¾Æ·¡ À̹ÌÁö¸¦ »ç¿ëÇÏ´Â°Ç ¿©·¯ºÐÀÇ +ÀÚÀ¯ÀÔ´Ï´Ù. ¾ÆÆÄÄ¡¸¦ »ç¿ëÇØ Áּż­ °¨»çÇÕ´Ï´Ù!

    + +
    + + + diff --git a/rubbos/app/httpd-2.0.64/docs/docroot/index.html.lb.utf8 b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.lb.utf8 new file mode 100644 index 00000000..f98c8557 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.lb.utf8 @@ -0,0 +1,37 @@ + + + + + + Test Page for Apache Installation on Web Site + + + + +
    +

    +Et huet geklappt! Den Apache Web Server as op dëser 'Web Site' installeiert!

    +Wann Dir die heiten Sait gesit, dann hun d'Proprietairen vun dëser 'domain' +elo just d'Apache Web server software +mat succés installeiert. Sie mussen allerdengs nach des Decksait +remplaceieren oder awer de Server op eng aner Sait mat dem richtigen contenu +em-dirigeieren. +
    +
    +
    Wann Dir die heiten Sait anstell vun der site die Dir erwârt +hut gesitt, da contacteiert wannechglift den administrator vun dem betraffener +site. (Versicht én email no <Webmaster@domain> ze +schecken.) Obwuel den heiten site Apache software benotzt, as et +ball secher datt keng Verbindung mat der Apache Group existeiert, also scheckt +wannechglift keng email iwert desen site oder sein contenu zu den Apache +Autoren. Falls Dir dëst awer macht, get ären message  ignoreiert.
    + +
    +

    D'Apache documentation ass dëser Ausgab +beigefücht. +

    Dem Webmaster vun dem heitenen site steht et zou dest Bild ob engem +Apache-powered Web server ze presenteieren. Merci dat Dir Apache benotzt! +

    + + + diff --git a/rubbos/app/httpd-2.0.64/docs/docroot/index.html.nl b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.nl new file mode 100644 index 00000000..fdd7ff93 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.nl @@ -0,0 +1,54 @@ + + + + Test Pagina voor de Apache Installatie op deze Web Site + + + + +

    + Alles Werkt! De Apache Web Server is geinstalleerd op deze Web Site +

    +

    + Mocht u deze pagina zien, dan betekent dat, dat de eigenaren van dit + domein zojuist een nieuwe Apache Web + Server hebben geinstalleerd. Nu moet men nog de echte inhoud gaan + toevoegen, en moet men deze pagina gaan vervangen door de echte web + site. +

    +
    +
    + Mocht u deze pagina zien, in plaats van de pagina of web site die u + verwachtte, neem dan contact op met de beheerder van + deze site. Bijvoorbeeld door een berichtje te sturen naar + <Webmaster@dit-domain>. +

    + Alhoewel deze web site gebruik maakt van de Apache Software is er + verder geen enkele relatie tussen de beheerders van deze web site en + de Apache Groep (die de web software geschreven heeft). Het heeft dus + absoluut + geen zin de web software auteurs een emailtje te sturen. Mocht u dat + toch doen, dan wordt uw bericht gewoon genegeerd. +

    +
    +

    + De + handleiding voor de apache web + server software maakt deel uit van deze distributie. +

    +

    + Als beheerder of webmaster is het u toegestaan het onderstaande + plaatje vrijelijk te gebruiken op uw 'Apache Powered' web site. Bedankt + voor het kiezen voor, en gebruiken van, Apache! +

    +
    + Klein 'Powered by Apache' Logotje +
    + + diff --git a/rubbos/app/httpd-2.0.64/docs/docroot/index.html.nn b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.nn new file mode 100644 index 00000000..67db9570 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.nn @@ -0,0 +1,48 @@ + + + + Testside Apache-installasjon + + + +

    + Det gjekk bra! Apache er no installert på denne maskina! +

    +

    + Dersom du kan sjå denne sida, har den eller dei som driv denne nettstaden + installert Apache vevtenar. + No må denne testsida erstattast med verkeleg innhald. +

    +
    +
    + Dersom du hadde venta å sjå ei anna side enn denne, bør du + ta kontakt med den som er ansvarleg for denne nettstaden + (Prøv å sende e-post til <webmaster@domene>.) + Sjølv om denne nettstaden vert kjørt på Apache, har den ingen annan + tilknytning til Apache-gruppa, som har utvikla programvaren. + Ver snill og ikkje send e-post om denne nettstaden eller + innhaldet du finn her til utviklarane i Apache-gruppa. + I så tilfelle vil førespurnaden ignorerast. +
    +
    +

    + Dokumentasjon + for Apache er inkludert i denne pakka. +

    +

    + Logoen under kan brukast på kva som helst av maskiner som køyrer Apache. + Takk for at du nyttar Apache! +

    +
    + +
    + + diff --git a/rubbos/app/httpd-2.0.64/docs/docroot/index.html.no b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.no new file mode 100644 index 00000000..d7553bce --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.no @@ -0,0 +1,48 @@ + + + + Testside Apache-installasjon + + + +

    + Det gikk bra! Apache er nå installert på denne maskinen! +

    +

    + Hvis du kan se denne siden har den eller de som driver dette nettstedet + installert Apache Web server. + Nå må denne testsiden erstattes med virkelig innhold. +

    +
    +
    + Hvis du hadde ventet å se en annen side enn denne bør du + ta kontakt med den som har ansvaret for nettstedet. + (Prøv å sende e-post til <webmaster@domene>.) + Selv om dette nettstedet kjøres på Apache, har det ingen annen + tilknytning til Apache-gruppen som har utviklet programvaren. + Vennligst ikke send post angående dette nettstedet eller dets + innhold til Apache-gruppens programmerere. I så fall vil din henvendelse + bli ignorert. +
    +
    +

    + Dokumentasjon + for Apache er inkludert i denne pakken. +

    +

    + Logoen under kan benyttes på en hvilken som helst maskin som kjører Apache. + Takk for at du benytter Apache! +

    +
    + +
    + + diff --git a/rubbos/app/httpd-2.0.64/docs/docroot/index.html.po.iso8859-2 b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.po.iso8859-2 new file mode 100644 index 00000000..8b030bd6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.po.iso8859-2 @@ -0,0 +1,40 @@ + + + + Strona testowa instalacji serwera Apache + + + + + + + +

    +Je¿eli strona ta jest widoczna, oznacza to poprawn± instalacjê serwera Apache. Mo¿na ju¿ zamieniæ zawarto¶æ tej witryny. + +


    + +

    Czy zamiast spodziewanej witryny WWW widoczna jest ta?

    + +

    +Strona ta jest widoczna, poniewa¿ administrator serwera WWW zmieni³ jego konfiguracjê. +Proszê skontaktowaæ siê z osob± odpowiedzialn± za zarz±dzanie tym serwerem. Apache Software Foundation, producent oprogramowania serwerowego Apache, nie administruje t± witryn± i nie jest w stanie pomóc w sprawach zwi±zanych z jej konfiguracj±. + +


    + + +

    +Do niniejszej dystrybucji serwera Apache do³±czono anglojêzyczn± dokumentacjê. + +

    +Poni¿sze logo, "Powered by Apache", mo¿na stosowaæ bez ograniczeñ. Dziêkujemy za wybranie Apache'a! + +

    + + diff --git a/rubbos/app/httpd-2.0.64/docs/docroot/index.html.pt b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.pt new file mode 100644 index 00000000..dbeb5ed0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.pt @@ -0,0 +1,42 @@ + + + + Página de teste da instalação do Apache Web Server + + + + + + +

    Se está a ver esta página significa que a instalação + do Apache Web Server foi efectuada + com sucesso. Pode agora adicionar conteúdo a esta directoria e substituir + esta página. +


    + +

    Está a ver esta página em vez do website que + esperava?

    + +

    Esta página está neste momento activa porque o administrador + deste site alterou a configuração do web server. Por favor contacte + a pessoa responsável pela manutenção deste servidor. + A Fundação Apache Software (Apache Software Foundation), apesar + de ter produzido o web server que o administrador deste site está a usar, + não tem qualquer tipo de responsabilidade pela manutenção + deste nem pode ajudar a resolver problemas de configuração. +


    + + +

    A documentação foi incluída + juntamente com esta distribuição. +

    A imagem abaixo pode ser usada livremente em qualquer site presente num servidor + com o Apache Web Server instalado. Obrigado por usar o Apache Web Server! +

    + + diff --git a/rubbos/app/httpd-2.0.64/docs/docroot/index.html.pt-br b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.pt-br new file mode 100644 index 00000000..ece2a8a8 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.pt-br @@ -0,0 +1,47 @@ + + + + + + Página teste para a instalação do Apache no +Web Site + + + + + +
    +

    +Funcionou! O Apache Web Server foi instalado corretamente neste Web Site!

    +Se você está vendo esta página, isso quer dizer que o software +Apache +Web server foi instalado com sucesso. Agora, basta adicionar o conteúdo +ao diretório raiz e substituir esta página temporária, ou configurar o servidor +para o seu conteúdo real. +
    +
    +
    +
    +

    +Está vendo esta página em vez do site que esperava?

    +Esta página foi carregada, pois provavelmente, o administrador modificou as +configurações +deste servidor. Por favor, contate o administrador do site para esclarecimentos. +(Tente enviar um e-mail para <Webmaster@dominio>.) A Apache +Server Foundation, que desenvolveu o software (web server) utilizado pelo +administrador, não tem nenhuma responsabilidade sobre a manutenção desta +página e não poderá ajudar na resolução de problemas de +configuração.
    + +
    +

    A documentação do Apache foi incluída +com esta distribuição. +

    O Webmaster deste site é livre para utilizar a imagem abaixo num web +server utilizando o Apache. +

    Obrigado por utilizar o Apache! +

    + + + diff --git a/rubbos/app/httpd-2.0.64/docs/docroot/index.html.ru.cp-1251 b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.ru.cp-1251 new file mode 100644 index 00000000..e9c51afb --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.ru.cp-1251 @@ -0,0 +1,34 @@ + + + + + + Òåñòîâàÿ ñòðàíèöà óñòàíîâêè Apache + + + +Åñëè Âû ýòî âèäèòå, ýòî çíà÷èò, ÷òî óñòàíîâêà +ÏÎ âåá-ñåðâåðà Apache íà ýòîé +ñèñòåìå çàâåðøèëàñü óñïåøíî. Âû ìîæåòå òåïåðü äîáàâëÿòü ñîäåðæèìîå â ýòó +äèðåêòîðèþ è çàìåíèòü ýòó ñòðàíèöó. +

    +


    +
    +

    +Âû âèäèòå ýòî âìåñòî îæèäàåìîé ñòðàíèöû?

    +Ýòà ñòðàíèöà íàõîäèòñÿ çäåñü ïîòîìó, ÷òî àäìèíèñòðàòîð ñèñòåìû èçìåíèë +êîíôèãóðàöèþ ýòîãî âåá-ñåðâåðà. Ïîæàëóéñòà, ñâÿæèòåñü ñ ëèöîì, îòâåòñâåííûì +çà ïîääåðæêó ýòîãî ñåðâåðà äëÿ âûÿñíåíèÿ âàøèõ âîïðîñîâ. Apache Software +Foundation, àâòîð ÏÎ âåá-ñåðâåðà, êîòîðûì ïîëüçóåòñÿ àäìèíèñòðàòîð ýòîé +ñèñòåìû, íå ñâÿçàí ñ ïîääåðæêîé ýòîé ñèñòåìû è íå ìîæåò ïîìî÷ü Âàì +ðàçðåøèòü ïðîáëåìû êîíôèãóðàöèè. +

    +


    +

    Äîêóìåíòàöèÿ ïî âåá-ñåðâåðó Apache ïðèëàãàåòñÿ +ê êîìïëåêòó ÏÎ. +

    Âû ìîæåòå ñâîáîäíî èñïîëüçîâàòü ïèêòîãðàììó, íàõîäÿùóþñÿ íèæå, íà âåá-ñåðâåðå, +èñïîëüçóþùèì ÏÎ Apache. Ñïàñèáî çà èñïîëüçîâàíèå Apache! +

    + + + diff --git a/rubbos/app/httpd-2.0.64/docs/docroot/index.html.ru.cp866 b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.ru.cp866 new file mode 100644 index 00000000..05fa119b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.ru.cp866 @@ -0,0 +1,34 @@ + + + + + + ’¥á⮢ ï áâà ­¨æ  ãáâ ­®¢ª¨ Apache + + + +…᫨ ‚ë íâ® ¢¨¤¨â¥, íâ® §­ ç¨â, çâ® ãáâ ­®¢ª  +Ž ¢¥¡-á¥à¢¥à  Apache ­  í⮩ +á¨á⥬¥ § ¢¥à訫 áì ãᯥ譮. ‚ë ¬®¦¥â¥ ⥯¥àì ¤®¡ ¢«ïâì ᮤ¥à¦¨¬®¥ ¢ íâã +¤¨à¥ªâ®à¨î ¨ § ¬¥­¨âì íâã áâà ­¨æã. +

    +


    +
    +

    +‚ë ¢¨¤¨â¥ íâ® ¢¬¥áâ® ®¦¨¤ ¥¬®© áâà ­¨æë?

    +â  áâà ­¨æ  ­ å®¤¨âáï §¤¥áì ¯®â®¬ã, çâ®  ¤¬¨­¨áâà â®à á¨áâ¥¬ë ¨§¬¥­¨« +ª®­ä¨£ãà æ¨î í⮣® ¢¥¡-á¥à¢¥à . ®¦ «ã©áâ , á¢ï¦¨â¥áì á «¨æ®¬, ®â¢¥âᢥ­­ë¬ +§  ¯®¤¤¥à¦ªã í⮣® á¥à¢¥à  ¤«ï ¢ëïá­¥­¨ï ¢ è¨å ¢®¯à®á®¢. Apache Software +Foundation,  ¢â®à Ž ¢¥¡-á¥à¢¥à , ª®â®àë¬ ¯®«ì§ã¥âáï  ¤¬¨­¨áâà â®à í⮩ +á¨á⥬ë, ­¥ á¢ï§ ­ á ¯®¤¤¥à¦ª®© í⮩ á¨áâ¥¬ë ¨ ­¥ ¬®¦¥â ¯®¬®ç젂 ¬ +à §à¥è¨âì ¯à®¡«¥¬ë ª®­ä¨£ãà æ¨¨. +

    +


    +

    „®ªã¬¥­â æ¨ï ¯® ¢¥¡-á¥à¢¥àã Apache ¯à¨« £ ¥âáï +ª ª®¬¯«¥ªâ㠏Ž. +

    ‚ë ¬®¦¥â¥ ᢮¡®¤­® ¨á¯®«ì§®¢ âì ¯¨ªâ®£à ¬¬ã, ­ å®¤ïéãîáï ­¨¦¥, ­  ¢¥¡-á¥à¢¥à¥, +¨á¯®«ì§ãî騬 Ž Apache. ‘¯ á¨¡® §  ¨á¯®«ì§®¢ ­¨¥ Apache! +

    + + + diff --git a/rubbos/app/httpd-2.0.64/docs/docroot/index.html.ru.iso-ru b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.ru.iso-ru new file mode 100644 index 00000000..ef25c801 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.ru.iso-ru @@ -0,0 +1,34 @@ + + + + + + ÂÕáâÞÒÐï áâàÐÝØæÐ ãáâÐÝÞÒÚØ Apache + + + +µáÛØ ²ë íâÞ ÒØÔØâÕ, íâÞ ×ÝÐçØâ, çâÞ ãáâÐÝÞÒÚÐ +¿¾ ÒÕÑ-áÕàÒÕàÐ Apache ÝÐ íâÞÙ +áØáâÕÜÕ ×ÐÒÕàèØÛÐáì ãáßÕèÝÞ. ²ë ÜÞÖÕâÕ âÕßÕàì ÔÞÑÐÒÛïâì áÞÔÕàÖØÜÞÕ Ò íâã +ÔØàÕÚâÞàØî Ø ×ÐÜÕÝØâì íâã áâàÐÝØæã. +

    +


    +
    +

    +²ë ÒØÔØâÕ íâÞ ÒÜÕáâÞ ÞÖØÔÐÕÜÞÙ áâàÐÝØæë?

    +ÍâÐ áâàÐÝØæÐ ÝÐåÞÔØâáï ×ÔÕáì ßÞâÞÜã, çâÞ ÐÔÜØÝØáâàÐâÞà áØáâÕÜë Ø×ÜÕÝØÛ +ÚÞÝäØÓãàÐæØî íâÞÓÞ ÒÕÑ-áÕàÒÕàÐ. ¿ÞÖÐÛãÙáâÐ, áÒïÖØâÕáì á ÛØæÞÜ, ÞâÒÕâáÒÕÝÝëÜ +×Ð ßÞÔÔÕàÖÚã íâÞÓÞ áÕàÒÕàÐ ÔÛï ÒëïáÝÕÝØï ÒÐèØå ÒÞßàÞáÞÒ. Apache Software +Foundation, ÐÒâÞà ¿¾ ÒÕÑ-áÕàÒÕàÐ, ÚÞâÞàëÜ ßÞÛì×ãÕâáï ÐÔÜØÝØáâàÐâÞà íâÞÙ +áØáâÕÜë, ÝÕ áÒï×ÐÝ á ßÞÔÔÕàÖÚÞÙ íâÞÙ áØáâÕÜë Ø ÝÕ ÜÞÖÕâ ßÞÜÞçì ²ÐÜ +àÐ×àÕèØâì ßàÞÑÛÕÜë ÚÞÝäØÓãàÐæØØ. +

    +


    +

    ´ÞÚãÜÕÝâÐæØï ßÞ ÒÕÑ-áÕàÒÕàã Apache ßàØÛÐÓÐÕâáï +Ú ÚÞÜßÛÕÚâã ¿¾. +

    ²ë ÜÞÖÕâÕ áÒÞÑÞÔÝÞ ØáßÞÛì×ÞÒÐâì ßØÚâÞÓàÐÜÜã, ÝÐåÞÔïéãîáï ÝØÖÕ, ÝÐ ÒÕÑ-áÕàÒÕàÕ, +ØáßÞÛì×ãîéØÜ ¿¾ Apache. ÁßÐáØÑÞ ×Ð ØáßÞÛì×ÞÒÐÝØÕ Apache! +

    + + + diff --git a/rubbos/app/httpd-2.0.64/docs/docroot/index.html.ru.koi8-r b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.ru.koi8-r new file mode 100644 index 00000000..db6ee830 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.ru.koi8-r @@ -0,0 +1,34 @@ + + + + + + ôÅÓÔÏ×ÁÑ ÓÔÒÁÎÉÃÁ ÕÓÔÁÎÏ×ËÉ Apache + + + +åÓÌÉ ÷Ù ÜÔÏ ×ÉÄÉÔÅ, ÜÔÏ ÚÎÁÞÉÔ, ÞÔÏ ÕÓÔÁÎÏ×ËÁ +ðï ×ÅÂ-ÓÅÒ×ÅÒÁ Apache ÎÁ ÜÔÏÊ +ÓÉÓÔÅÍÅ ÚÁ×ÅÒÛÉÌÁÓØ ÕÓÐÅÛÎÏ. ÷Ù ÍÏÖÅÔÅ ÔÅÐÅÒØ ÄÏÂÁ×ÌÑÔØ ÓÏÄÅÒÖÉÍÏÅ × ÜÔÕ +ÄÉÒÅËÔÏÒÉÀ É ÚÁÍÅÎÉÔØ ÜÔÕ ÓÔÒÁÎÉÃÕ. +

    +


    +
    +

    +÷Ù ×ÉÄÉÔÅ ÜÔÏ ×ÍÅÓÔÏ ÏÖÉÄÁÅÍÏÊ ÓÔÒÁÎÉÃÙ?

    +üÔÁ ÓÔÒÁÎÉÃÁ ÎÁÈÏÄÉÔÓÑ ÚÄÅÓØ ÐÏÔÏÍÕ, ÞÔÏ ÁÄÍÉÎÉÓÔÒÁÔÏÒ ÓÉÓÔÅÍÙ ÉÚÍÅÎÉÌ +ËÏÎÆÉÇÕÒÁÃÉÀ ÜÔÏÇÏ ×ÅÂ-ÓÅÒ×ÅÒÁ. ðÏÖÁÌÕÊÓÔÁ, Ó×ÑÖÉÔÅÓØ Ó ÌÉÃÏÍ, ÏÔ×ÅÔÓ×ÅÎÎÙÍ +ÚÁ ÐÏÄÄÅÒÖËÕ ÜÔÏÇÏ ÓÅÒ×ÅÒÁ ÄÌÑ ×ÙÑÓÎÅÎÉÑ ×ÁÛÉÈ ×ÏÐÒÏÓÏ×. Apache Software +Foundation, Á×ÔÏÒ ðï ×ÅÂ-ÓÅÒ×ÅÒÁ, ËÏÔÏÒÙÍ ÐÏÌØÚÕÅÔÓÑ ÁÄÍÉÎÉÓÔÒÁÔÏÒ ÜÔÏÊ +ÓÉÓÔÅÍÙ, ÎÅ Ó×ÑÚÁÎ Ó ÐÏÄÄÅÒÖËÏÊ ÜÔÏÊ ÓÉÓÔÅÍÙ É ÎÅ ÍÏÖÅÔ ÐÏÍÏÞØ ÷ÁÍ +ÒÁÚÒÅÛÉÔØ ÐÒÏÂÌÅÍÙ ËÏÎÆÉÇÕÒÁÃÉÉ. +

    +


    +

    äÏËÕÍÅÎÔÁÃÉÑ ÐÏ ×ÅÂ-ÓÅÒ×ÅÒÕ Apache ÐÒÉÌÁÇÁÅÔÓÑ +Ë ËÏÍÐÌÅËÔÕ ðï. +

    ÷Ù ÍÏÖÅÔÅ Ó×ÏÂÏÄÎÏ ÉÓÐÏÌØÚÏ×ÁÔØ ÐÉËÔÏÇÒÁÍÍÕ, ÎÁÈÏÄÑÝÕÀÓÑ ÎÉÖÅ, ÎÁ ×ÅÂ-ÓÅÒ×ÅÒÅ, +ÉÓÐÏÌØÚÕÀÝÉÍ ðï Apache. óÐÁÓÉÂÏ ÚÁ ÉÓÐÏÌØÚÏ×ÁÎÉÅ Apache! +

    + + + diff --git a/rubbos/app/httpd-2.0.64/docs/docroot/index.html.ru.utf8 b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.ru.utf8 new file mode 100644 index 00000000..fc6694f6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.ru.utf8 @@ -0,0 +1,34 @@ + + + + + + Тестовая страница установки Apache + + + +Если Вы это видите, это значит, что установка +ПО веб-сервера Apache на этой +системе завершилась успешно. Вы можете теперь добавлять содержимое в эту +директорию и заменить эту страницу. +

    +


    +
    +

    +Вы видите это вместо ожидаемой страницы?

    +Эта страница находится здесь потому, что администратор системы изменил +конфигурацию этого веб-сервера. Пожалуйста, свяжитесь с лицом, ответсвенным +за поддержку этого сервера для выяснения ваших вопросов. Apache Software +Foundation, автор ПО веб-сервера, которым пользуется администратор этой +системы, не связан с поддержкой этой системы и не может помочь Ð’ам +разрешить проблемы конфигурации. +

    +


    +

    Документация по веб-серверу Apache прилагается +к комплекту ПО. +

    Вы можете свободно использовать пиктограмму, находящуюся ниже, на веб-сервере, +использующим ПО Apache. Спасибо за использование Apache! +

    + + + diff --git a/rubbos/app/httpd-2.0.64/docs/docroot/index.html.sv b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.sv new file mode 100644 index 00000000..377307f5 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.sv @@ -0,0 +1,43 @@ + + + + Testsida för Apache-installationen + + + +

    + Det fungerade! Apache är installerad på denna maskin! +

    +

    + Om du kan se denna sida så har ägaren till denna maskin installerat + webbserverprogramvaran Apache.
    + Denne måste nu placera webbsidor i detta bibliotek och ändra på denna sida, eller + peka servern mot ett annat bibliotek. +

    +
    +
    + Om du förväntat dig att se något helt annat här än denna sida, kontakta + vänligen administratören för den webbserver du försöker komma i kontakt med. + (Försök att skicka ett brev till <webmaster@domain>.) + Apache Software Foundation har inget med denna webbplats att göra, så det är ingen idé + att skicka mail till författarna av Apache rörande denna webbplats. +
    +
    +

    + Apache-dokumentationen är inkluderad i denna distribution. +

    +

    + Administratören av denna webbplats får gärna använda följande bild till en webbplats som använder Apache.
    + Tack för att ni använder Apache! +

    +
    + +
    + + diff --git a/rubbos/app/httpd-2.0.64/docs/docroot/index.html.var b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.var new file mode 100644 index 00000000..0b20007f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.var @@ -0,0 +1,123 @@ +URI: index.html.ca +Content-language: ca +Content-type: text/html + +URI: index.html.cz.iso8859-2 +Content-language: cs +Content-type: text/html;charset=ISO-8859-2 + +URI: index.html.de +Content-language: de +Content-type: text/html + +URI: index.html.dk +Content-language: da +Content-type: text/html + +URI: index.html.ee +Content-language: ee +Content-type: text/html + +URI: index.html.el +Content-language: el +Content-type: text/html + +URI: index.html.en +Content-language: en +Content-type: text/html + +URI: index.html.es +Content-language: es +Content-type: text/html + +URI: index.html.et +Content-language: et +Content-type: text/html + +URI: index.html.fr +Content-language: fr +Content-type: text/html + +URI: index.html.he.iso8859-8 +Content-language: he +Content-type: text/html;charset=ISO-8859-8 + +URI: index.html.hr.iso8859-2 +Content-language: hr +Content-type: text/html;charset=ISO-8859-2 + +URI: index.html.it +Content-language: it +Content-type: text/html + +URI: index.html.ja.iso2022-jp +Content-language: ja +Content-type: text/html;charset=ISO-2022-JP + +URI: index.html.ko.euc-kr +Content-language: ko +Content-type: text/html;charset=EUC-KR + +URI: index.html.ltz.utf8 +Content-language: ltz +Content-type: text/html;charset=UTF-8 + +URI: index.html.lu.utf8 +Content-language: lu +Content-type: text/html;charset=UTF-8 + +URI: index.html.nl +Content-language: nl +Content-type: text/html + +URI: index.html.nn +Content-language: nn +Content-Type: text/html + +URI: index.html.no +Content-language: no +Content-type: text/html + +URI: index.html.po.iso8859-2 +Content-language: pl +Content-type: text/html;charset=ISO-8859-2 + +URI: index.html.pt +Content-language: pt +Content-type: text/html + +URI: index.html.pt-br +Content-language: pt-br +Content-type: text/html + +URI: index.html.ru.cp-1251 +Content-language: ru +Content-type: text/html;charset=WINDOWS-1251 + +URI: index.html.ru.cp866 +Content-language: ru +Content-type: text/html;charset=CP866 + +URI: index.html.ru.iso-ru +Content-language: ru +Content-type: text/html;charset=ISO-8859-5 + +URI: index.html.ru.koi8-r +Content-language: ru +Content-type: text/html;charset=KOI8-r + +URI: index.html.ru.utf8 +Content-language: ru +Content-type: text/html;charset=UTF-8 + +URI: index.html.sv +Content-language: sv +Content-type: text/html + +URI: index.html.zh-cn.gb2312 +Content-language: zh-CN +Content-type: text/html;charset=GB2312 + +URI: index.html.zh-tw.big5 +Content-language: tw, zh-TW +Content-type: text/html;charset=Big5 diff --git a/rubbos/app/httpd-2.0.64/docs/docroot/index.html.zh-cn.gb2312 b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.zh-cn.gb2312 new file mode 100644 index 00000000..b31d07da --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.zh-cn.gb2312 @@ -0,0 +1,29 @@ + + + +°²×°ApacheµÄ²âÊÔÒ³Ãæ + + + +

    ÄúÄÜ¿´¼ûÕâ¸öÒ³Ã棬˵Ã÷Apache web +server ÒѾ­°²×°³É¹¦¡£Äú¿ÉÒÔÔÚÕâ¸öĿ¼ÖÐÔö¼ÓÄÚÈÝ£¬»òÕß°ÑÕâ¸öÒ³ÃæÌæ»»µô¡£

    + +
    +

    Õâ²»ÊÇÄãÏë¿´¼ûµÄÒ³Ãæ°É?

    + +

    Ö®ËùÒԻῴ¼ûÕâ¸öÒ³Ã棬ÊÇÒòΪÍøÕ¾¹ÜÀíÔ±¸Ä±äÁËÕâ¸öÕ¾µãµÄÉèÖᣠ+Èç¹ûÓÐÒÉÎÊ£¬Çë×Éѯά»¤´ËÕ¾µãµÄÈËÔ±¡£ +ApacheÈí¼þ»ù½ð»á, ¼´´ËÕ¾µãËùʹÓõÄÍøÕ¾·þÎñÆ÷Èí¼þµÄ¿ª·¢Õߣ¬ +²»¸ºÔð´ËÕ¾µãµÄά»¤¹¤×÷£¬Ò²ÎÞ·¨ÎªÄú½â¾öÉèÖÃÉϵÄÎÊÌâ¡£

    + +
    +

    Apache ÎĵµÒѾ­°üº¬ÔÚ´Ë·¢ÐаæÖС£

    + +

    Äú¿ÉÒÔÔÚʹÓÃApacheµÄÍøÕ¾·þÎñÆ÷ÉÏ£¬×ÔÓɵØʹÓÃÏÂÃæµÄͼƬ¡£¸ÐлʹÓÃApache£¡

    + +
    + + diff --git a/rubbos/app/httpd-2.0.64/docs/docroot/index.html.zh-tw.big5 b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.zh-tw.big5 new file mode 100644 index 00000000..1ca02124 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/docroot/index.html.zh-tw.big5 @@ -0,0 +1,46 @@ + + + + ¦w¸Ë Apache ªº´ú¸Õºô­¶ + + + + + +

    +¦pªG§A¥i¥H¬Ý¨£¦¹­¶¡A³oªí¥Ü§Aªº +Apache Web Server +¤w¸g¦w¸Ë¦¨¥\¡C +§A¥i¥H¼W¥[¤º®e¨ì³o­Ó¥Ø¿ý¡A©Î§â³o­Óºô­¶´«±¼¡C

    + +


    + +

    ¨S¦³¬Ý¨ì§A·Q¬Ýªººô¯¸¶Ü ?

    + +

    +³o­Óºô­¶¤§©Ò¥H·|¦b³oùØ¡A¨º¬O¦]¬°ºô¯¸ºÞ²zªÌ¤w¸g§ó§ï³o­Óºô¯¸ªº³]©w¡C +­Y¦³°ÝÃD, ½Ð»P ºûÅ@³o­Ó¦øªA¾¹ªº¤H­ûÁpµ¸¡C +Apache ³nÅé°òª÷·|¡A¤]´N¬O¶}µo³o®M³nÅ骺³æ¦ì¡A»P¦¹ºô¯¸¨ÃµL¥ô¦óÃö«Y¡A +¦Ó¥B¤]µLªkÀ°§A¸Ñ¨M³]©w¤Wªº°ÝÃD¡C + +


    + +

    +Apache ªº +¤å¥ó +¤w¸g¥]§t¦b¸Óª©¥»¤¤¡C + +

    +§A¥i¥H¦b¨Ï¥Î Apache ªººô¯¸¦øªA¾¹¤W¡A¦Û¥Ñªº¨Ï¥Î¤U­±¤§¹Ï¥Ü¡A +·PÁ±z¨Ï¥Î Apache¡I +

    +

    + + + diff --git a/rubbos/app/httpd-2.0.64/docs/doxygen.conf b/rubbos/app/httpd-2.0.64/docs/doxygen.conf new file mode 100644 index 00000000..9ff8250b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/doxygen.conf @@ -0,0 +1,52 @@ +PROJECT_NAME=Apache + +#INPUT=srclib/apr +INPUT=. +RECURSIVE=YES +FILE_PATTERNS=*.h + +OUTPUT_DIRECTORY=docs/dox + +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;" \ + "AP_DECLARE(x)=x" \ + "AP_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" + +OPTIMIZE_OUTPUT_FOR_C=YES + +FULL_PATH_NAMES=YES +# some autoconf guru needs to make configure set this correctly... +STRIP_FROM_PATH=/var/www/lxr/source diff --git a/rubbos/app/httpd-2.0.64/docs/error/HTTP_BAD_GATEWAY.html.var b/rubbos/app/httpd-2.0.64/docs/error/HTTP_BAD_GATEWAY.html.var new file mode 100644 index 00000000..c0a70af6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/error/HTTP_BAD_GATEWAY.html.var @@ -0,0 +1,290 @@ +Content-language: cs +Content-type: text/html; charset=ISO-8859-2 +Body:----------cs-- + + + Proxy server obdr¾el od nadøazeného + serveru chybnou odpovìï. + + + + + + + +----------cs-- + +Content-language: de +Content-type: text/html; charset=ISO-8859-1 +Body:----------de-- + + + Der Proxy-Server erhielt eine fehlerhafte Antwort + eines übergeordneten Servers oder Proxies. + + + + + + + +----------de-- + +Content-language: en +Content-type: text/html; charset=ISO-8859-1 +Body:----------en-- + + + The proxy server received an invalid + response from an upstream server. + + + + + + + +----------en-- + +Content-language: es +Content-type: text/html; charset=ISO-8859-1 +Body:----------es-- + + + El servidor origen recibió información + inválida por parte del servidor destino. + + + + + + + +----------es-- + +Content-language: fr +Content-type: text/html; charset=ISO-8859-1 +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=ISO-8859-1 +Body:----------ga-- + + + Fuair an seachfhreastalaí freagairt neamhbhailí + ó freastalaí thuasthrutha. + + + + + + + +----------ga-- + +Content-language: it +Content-type: text/html; charset=ISO-8859-1 +Body:----------it-- + + + Il server proxy ha ricevuto una risposta + non valida dal server precedente. + + + + + + + +----------it-- + +Content-language: ja +Content-type: text/html; charset=ISO-2022-JP +Body:----------ja-- + + + $B%W%m%/%7%5!<%P$O>eN.%5!<%P$+$iIT@5$J1~Ez$r + + + + + +----------ja-- + +Content-language: ko +Content-type: text/html; charset=EUC-KR +Body:----------ko-- + + + ÇÁ·Ï½Ã ¼­¹ö°¡ ´õ À­ÂÊÀÇ ¼­¹ö·ÎºÎÅÍ À߸øµÈ ÀÀ´äÀ» ¹Þ¾Ò½À´Ï´Ù. + + + + + + + +----------ko-- + +Content-language: nl +Content-type: text/html; charset=ISO-8859-1 +Body:----------nl-- + + + De proxy server heeft een ongeldig + antwoord ontvangen van een gecontacteerde server. + + + + + + + +----------nl-- + +Content-language: pl +Content-type: text/html; charset=ISO-8859-2 +Body:----------pl-- + + + Serwer otrzyma³ nieprawid³ow± odpowied¼ + od kolejnego serwera. + + + + + + + +----------pl-- + +Content-language: pt-br +Content-type: text/html; charset=ISO-8859-1 +Body:-------pt-br-- + + + O servidor proxy recebeu uma resposta + inválida do servidor destino. + + + + + + + +-------pt-br-- + +Content-language: ro +Content-type: text/html; charset=ISO-8859-1 +Body:----------ro-- + + + Serverul proxy a primit un raspuns invalid + de la serverul precedent. + + + + + + + +----------ro-- + +Content-language: sr +Content-type: text/html; charset=ISO-8859-5 +Body:----------sr-- + + + ¿ÞáàÕÔÝØçÚØ áÕàÒÕà øÕ ßàØÜØÞ ÝÕØáßàÐÒÐÝ + ÞÔÓÞÒÞà ÞÔ áÛÕÔÕûÕÓ áÕàÒÕàÐ ã ÝØ×ã. + + + + + + + +----------sr-- + +Content-language: sv +Content-type: text/html; charset=ISO-8859-1 +Body:----------sv-- + + + Proxyservern mottog ett felaktigt svar från + en tidigare server. + + + + + + + +----------sv-- + +Content-language: tr +Content-type: text/html; charset=ISO-8859-9 +Body:----------tr-- + + + Vekil (proxy) sunucu üstbirim (upstream) sunucusundan + anlamsız bir cevap aldı. + + + + + + + +----------tr-- diff --git a/rubbos/app/httpd-2.0.64/docs/error/HTTP_BAD_REQUEST.html.var b/rubbos/app/httpd-2.0.64/docs/error/HTTP_BAD_REQUEST.html.var new file mode 100644 index 00000000..d282482b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/error/HTTP_BAD_REQUEST.html.var @@ -0,0 +1,213 @@ +Content-language: cs +Content-type: text/html; charset=ISO-8859-2 +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=ISO-8859-1 +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=ISO-8859-1 +Body:----------en-- + + + Your browser (or proxy) sent a request that + this server could not understand. + + +----------en-- + +Content-language: es +Content-type: text/html; charset=ISO-8859-1 +Body:----------es-- + + + El navegador ha solicitado una operación + que no puede ser procesada por el servidor. + + +----------es-- + +Content-language: fr +Content-type: text/html; charset=ISO-8859-1 +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=ISO-8859-1 +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=ISO-8859-1 +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=ISO-2022-JP +Body:----------ja-- + + + $B$*;H$$$N%V%i%&%6(B ($B$^$?$O%W%m%/%7(B) + $B$,!"%5!<%P$NM}2r$G$-$J$$%j%/%(%9%H$rAw?.$7$^$7$?!#(B + + +----------ja-- + +Content-language: ko +Content-type: text/html; charset=EUC-KR +Body:----------ko-- + + + ºê¶ó¿ìÀú ¶Ç´Â ÇÁ·Ï½Ã°¡ + ÀÌ ¼­¹ö°¡ ó¸®ÇÒ ¼ö ¾ø´Â À߸øµÈ ¿äûÀ» º¸³Â½À´Ï´Ù. + + +----------ko-- + +Content-language: nl +Content-type: text/html; charset=ISO-8859-1 +Body:----------nl-- + + + Uw browser (of proxy) stuurde een vraag die + deze server niet kon begrijpen. + + +----------nl-- + +Content-language: pl +Content-type: text/html; charset=ISO-8859-2 +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=ISO-8859-1 +Body:-------pt-br-- + + + Seu "browser" (ou o servidor proxy) enviou uma + requisição inválida ao servidor. + + +-------pt-br-- + +Content-language: ro +Content-type: text/html; charset=ISO-8859-1 +Body:----------ro-- + + + Browserul (sau proxy-ul) dumneavoastra a trimis + serverului o cerere ce nu poate fi procesata. + + +----------ro-- + +Content-language: sr +Content-type: text/html; charset=ISO-8859-5 +Body:----------sr-- + + + ²Ðè çØâÐç (ØÛØ ßÞáàÕÔÝØçÚØ áÕàÒÕà) ßÞáÛÐÞ øÕ ×ÐåâÕÒ ÚÞøØ + ÞÒÐø áÕàÒÕà ÝØøÕ ÜÞÓÐÞ ÔÐ àÐ×ãÜÕ. + + +----------sr-- + +Content-language: sv +Content-type: text/html; charset=ISO-8859-1 +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=ISO-8859-9 +Body:----------tr-- + + + Gezgininiz (veya vekil sunucunuz) bu sunucunun + tanımadığı + bir istemde bulundu. + + +----------tr-- diff --git a/rubbos/app/httpd-2.0.64/docs/error/HTTP_FORBIDDEN.html.var b/rubbos/app/httpd-2.0.64/docs/error/HTTP_FORBIDDEN.html.var new file mode 100644 index 00000000..4958148e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/error/HTTP_FORBIDDEN.html.var @@ -0,0 +1,372 @@ +Content-language: cs +Content-type: text/html; charset=ISO-8859-2 +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=ISO-8859-1 +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=ISO-8859-1 +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; charset=ISO-8859-1 +Body:----------es-- + + + + + Usted no tiene permiso para accesar a la dirección + solicitada. Existe la posibilidad de que el directorio + este protegido contra lectura o que no exista la + documentación requerida. + + + + Usted no tiene permiso de accesar al objeto solicitado. + Existe la posibilidad de que este protegido contra + lectura o que no haya podido ser leido por el servidor. + + + + +----------es-- + +Content-language: fr +Content-type: text/html; charset=ISO-8859-1 +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=ISO-8859-1 +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=ISO-8859-1 +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=ISO-2022-JP +Body:----------ja-- + + + + + $BMW5a$5$l$?%G%#%l%/%H%j$X$N%"%/%;%98"8B$,$"$j$^$;$s!#(B + $B%$%s%G%C%/%9%I%-%e%a%s%H$,B8:_$7$J$$$+!"(B + $B%G%#%l%/%H%j$NFI$_9~$_$,5v2D$5$l$F$$$^$;$s!#(B + + + + $BMW5a$5$l$?%*%V%8%'%/%H$X$N%"%/%;%98"$,$"$j$^$;$s!#(B + $BFI$_9~$_$,5v2D$5$l$F$$$J$$$+!"(B + $B%5!<%P$,FI$_9~$_$K<:GT$7$?$+$G$7$g$&!#(B + + + + +----------ja-- + +Content-language: ko +Content-type: text/html; charset=EUC-KR +Body:----------ko-- + + + + + ¿äûÇÑ µð·ºÅ丮¿¡ Á¢±ÙÇÒ ¼ö ÀÖ´Â ±ÇÇÑÀÌ ¾ø½À´Ï´Ù. + µð·ºÅ丮¿¡ ù ÆäÀÌÁö°¡ ¾ø°Å³ª ¾Æ´Ï¸é Àб⠺¸È£°¡ µÇ¾î ÀÖ½À´Ï´Ù. + + + + ¿äûÇÑ °´Ã¼¿¡ Á¢±ÙÇÒ ¼ö ÀÖ´Â ±ÇÇÑÀÌ ¾ø½À´Ï´Ù. + Àб⠺¸È£°¡ µÇ¾î Àְųª À¥¼­¹ö°¡ ÀÐÀ» ¼ö ¾øµµ·Ï µÇ¾î ÀÖ½À´Ï´Ù. + + + + +----------ko-- + +Content-language: nl +Content-type: text/html; charset=ISO-8859-1 +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: pl +Content-type: text/html; charset=ISO-8859-2 +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=ISO-8859-1 +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 premissão para acessar o + objeto requisitado. Ele pode estar protegido contra leitura ou + não ser legível pelo servidor. + + + + +-------pt-br-- + +Content-language: ro +Content-type: text/html; charset=ISO-8859-1 +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: sr +Content-type: text/html; charset=ISO-8859-5 +Body:----------sr-- + + + + + ½ÕÜÐâÕ ÔÞ×ÒÞÛã ÔÐ ßàØáâãßØâÕ ×ÐåâÕÒÐÝÞÜ ÔØàÕÚâÞàØøãÜã. + ¼ÞÓãûÕ øÕ ÔÐ ÝÕÜÐ ØÝÔÕÚáÝÞÓ ÔÞÚãÜÕÝâÐ, ØÛØ ÔÐ øÕ ÔØàÕÚâÞàØøãÜ ×ÐèâØûÕÝ ÞÔ çØâÐúÐ. + + + + ½ÕÜÐâÕ ÔÞ×ÒÞÛã ÔÐ ßàØáâãßØâÕ ×ÐåâÕÒÐÝÞÜ ÞÑøÕÚâã. + ¼ÞÓãûÕ øÕ ÔÐ øÕ ×ÐèâØûÕÝ ÞÔ çØâÐúÐ, ØÛØ ÔÐ ÓÐ áÕàÒÕà ÝÕ ÜÞÖÕ ßàÞçØâÐâØ. + + + + +----------sr-- + +Content-language: sv +Content-type: text/html; charset=ISO-8859-1 +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=ISO-8859-9 +Body:----------tr-- + + + + + Talep ettiğiniz dizine erişim izniniz yok. + Ya belirteç doküman 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-- diff --git a/rubbos/app/httpd-2.0.64/docs/error/HTTP_GONE.html.var b/rubbos/app/httpd-2.0.64/docs/error/HTTP_GONE.html.var new file mode 100644 index 00000000..65aa644e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/error/HTTP_GONE.html.var @@ -0,0 +1,422 @@ +Content-language: cs +Content-type: text/html; charset=ISO-8859-2 +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=ISO-8859-1 +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=ISO-8859-1 +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; charset=ISO-8859-1 +Body:----------es-- + + + Los recursos solicitados ya no están disponibles en + este servidor y no existe una dirección alternativa. + + + + Le solicitamos que comunique al autor de la + ">página referente que el enlace está obsoleto. + + + + Si usted siguió el enlace desde una página externa, + por favor contacte con el autor de esa página. + + + + +----------es-- + +Content-language: fr +Content-type: text/html; charset=ISO-8859-1 +Body:----------fr-- + + + L'URL demandée n'est plus accessible sur ce serveur et il + n'y a pas d'adresse de suite. + + + + Nous vous prions d'informer l'auteur de + ">la + page en question que la référence n'est plus actuelle. + + + + 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=ISO-8859-1 +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=ISO-8859-1 +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=ISO-2022-JP +Body:----------ja-- + + + $BMW5a$5$l$?(B URL $B$O4{$KK\%5!<%P$G$OMxMQ$G$-$^$;$s$7!"(B + $B0\F0@h$b$o$+$j$^$;$s!#(B + + + + " + >$B;2>H85%Z!<%8(B$B$NCx + + $BB>$N%Z!<%8$+$i$N%j%s%/$rC)$C$F$-$?>l9g$O!"(B + $B$=$N%Z!<%8$NCx + + +----------ja-- + +Content-language: ko +Content-type: text/html; charset=EUC-KR +Body:----------ko-- + + + ¿äûÇÑ URLÀº ´õ ÀÌ»ó ÀÌ ¼­¹ö¿¡ ³²¾ÆÀÖÁö ¾ÊÀ¸¸ç, + ±× °´Ã¼°¡ ¿Å°ÜÁø ´Ù¸¥ URL ¿ª½Ã ³²¾ÆÀÖÁö ¾Ê½À´Ï´Ù. + + + + ">ÀÌÀü + ÆäÀÌÁöÀÇ ¸¸µçÀÌ¿¡°Ô ÁÖ¼Ò°¡ À߸øµÇ¾ú´Ù°í ¾Ë·ÁÁֽñ⠹ٶø´Ï´Ù. + + + + ´Ù¸¥ ÆäÀÌÁöÀÇ ¸µÅ©¸¦ µû¶ó¿À¼Ì´Ù¸é, ±× ÆäÀÌÁöÀÇ ¸¸µçÀÌ¿¡°Ô ¿¬¶ôÀ» ÇϽñâ + ¹Ù¶ø´Ï´Ù. + + + + +----------ko-- + +Content-language: nl +Content-type: text/html; charset=ISO-8859-1 +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: pl +Content-type: text/html; charset=ISO-8859-2 +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=ISO-8859-1 +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: ro +Content-type: text/html; charset=ISO-8859-1 +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: sr +Content-type: text/html; charset=ISO-8859-5 +Body:----------sr-- + + + ·ÐåâÕÒÐÝØ ÃÀ» ÝØøÕ ÒØèÕ ÔÞáâãßÐÝ ÝÐ ÞÒÞÜ áÕàÒÕàã Ø ÝÕÜÐ + ÐÔàÕáÕ ÝÐ ÚÞøã ÑØáâÕ ÜÞÓÛØ ÑØâØ ßàÞáÛÕòÕÝØ. + + + + ¼ÞÛØÜÞ ÞÑÐÒÕáâØâÕ ÐãâÞàÐ + ">ØáåÞÔØèÝÕ + áâàÐÝØæÕ ÔÐ øÕ ÒÕ×Ð ×ÐáâÐàÕÛÐ. + + + + °ÚÞ áâÕ ßàÐâØÛØ ÒÕ×ã áÐ áßÞùÝÕ áâàÐÝØæÕ, ÜÞÛØÜÞ ÞÑÐÒÕáâØâÕ + ÐãâÞàÐ âÕ áâàÐÝØæÕ. + + + + +----------sr-- + +Content-language: sv +Content-type: text/html; charset=ISO-8859-1 +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=ISO-8859-9 +Body:----------tr-- + + + Talep ettiğiniz URL bu sunucu üzerinde barındırılmıyor + ve herhangi bir yöneltme de mevcut değil. + + + + Lütfen + ">referans sayfanın + yazarına, bu bağlantının güncel + olmadığını bildirin. + + + + Yabancı bir sayfadan bu bağlantıyı izlediyseniz, + lütfen sözkonusu sayfanın yazarı ile iletişime geçin. + + + + +----------tr-- diff --git a/rubbos/app/httpd-2.0.64/docs/error/HTTP_INTERNAL_SERVER_ERROR.html.var b/rubbos/app/httpd-2.0.64/docs/error/HTTP_INTERNAL_SERVER_ERROR.html.var new file mode 100644 index 00000000..5459f93b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/error/HTTP_INTERNAL_SERVER_ERROR.html.var @@ -0,0 +1,453 @@ +Content-language: cs +Content-type: text/html; charset=ISO-8859-2 +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=ISO-8859-1 +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=ISO-8859-1 +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; charset=ISO-8859-1 +Body:----------es-- + + + + + El servidor encontro un error interno y fue + imposible completar su solicitud. + + + + Mensaje de error: +
    + + + + El servidor encontro un error interno y fue + imposible completar su solicitud. + Existe tambien la posibilidad de que el servidor + este sobrecargado o de algún error en un + programa de CGI. + + + + +----------es-- + +Content-language: fr +Content-type: text/html; charset=ISO-8859-1 +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=ISO-8859-1 +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=ISO-8859-1 +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=ISO-2022-JP +Body:----------ja-- + + + + + $B%5!<%PFbIt$G>c32$,H/@8$7!"(B + $B%j%/%(%9%H$K1~$($k$3$H$,$G$-$^$;$s$G$7$?!#(B + + + + Error message: +
    + + + + $B%5!<%PFbIt$G>c32$,H/@8$7!"(B + $B%j%/%(%9%H$K1~$($k$3$H$,$G$-$^$;$s$G$7$?!#(B + $B%5!<%P$,2aIi2Y$G$"$k$+!"(B + CGI $B%9%/%j%W%H$K%(%i!<$,$"$j$^$9!#(B + + + + +----------ja-- + +Content-language: ko +Content-type: text/html; charset=EUC-KR +Body:----------ko-- + + + + + ¼­¹ö¿¡ ³»ºÎ ¿À·ù°¡ ¹ß»ýÇÏ¿© ¿äûÀ» ³¡±îÁö ó¸®ÇÏÁö ¸øÇß½À´Ï´Ù. + + + + ¿À·ù ³»¿ë: +
    + + + + ¼­¹ö¿¡ ³»ºÎ ¿À·ù°¡ »ý°Ü ¿äûÀ» ³¡±îÁö ó¸®ÇÏÁö ¸øÇß½À´Ï´Ù. + ¼­¹ö¿¡ °úºÎÇÏ°¡ °É·È°Å³ª ¾Æ´Ï¸é CGI ÇÁ·Î±×·¥¿¡ ¿À·ù°¡ ÀÖ¾ú½À´Ï´Ù. + + + + +----------ko-- + +Content-language: nl +Content-type: text/html; charset=ISO-8859-1 +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: pl +Content-type: text/html; charset=ISO-8859-2 +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=ISO-8859-1 +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: ro +Content-type: text/html; charset=ISO-8859-1 +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: sr +Content-type: text/html; charset=ISO-8859-5 +Body:----------sr-- + + + + + ÁÕàÒÕà øÕ ØÜÐÞ ãÝãâàÐèúã ÓàÕèÚã Ø ÝØøÕ ÑØÞ + ã ÜÞÓãûÝÞáâØ ÔÐ ØáßãÝØ ÒÐè ×ÐåâÕÒ. + + + + ¿ÞàãÚÐ Þ ÓàÕèæØ: +
    + + + + ÁÕàÒÕà øÕ ØÜÐÞ ãÝãâàÐèúã ÓàÕèÚã Ø ÝØøÕ ÑØÞ + ã ÜÞÓãûÝÞáâØ ÔÐ ØáßãÝØ ÒÐè ×ÐåâÕÒ. ¼ÞÓãûÕ øÕ ÔÐ øÕ áÕàÒÕà + ßàÕÞßâÕàÕûÕÝ, ØÛØ ÔÐ áÕ ÔÕáØÛÐ ÓàÕèÚÐ ã CGI áÚàØßâØ. + + + + +----------sr-- + +Content-language: sv +Content-type: text/html; charset=ISO-8859-1 +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=ISO-8859-9 +Body:----------tr-- + + + + + Sunucu içine bir hata oluştu ve sunucu talebinize hizmet vermekte başarılı olamadı. + + + + Hata mesajı: +
    + + + + Sunucu içine bir hata oluştu ve sunucu talebinize hizmet vermekte başarılı olamadı. + Ya sunucuya çok yüklenildi, ya da CGI betiklerinde hata belirdi. + + + + +----------tr-- diff --git a/rubbos/app/httpd-2.0.64/docs/error/HTTP_LENGTH_REQUIRED.html.var b/rubbos/app/httpd-2.0.64/docs/error/HTTP_LENGTH_REQUIRED.html.var new file mode 100644 index 00000000..4d083fed --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/error/HTTP_LENGTH_REQUIRED.html.var @@ -0,0 +1,222 @@ +Content-language: cs +Content-type: text/html; charset=ISO-8859-2 +Body:----------cs-- + + + Po¾adavek metodou + vy¾aduje korektní hlavièku Content-Length. + + +----------cs-- + +Content-language: de +Content-type: text/html; charset=ISO-8859-1 +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=ISO-8859-1 +Body:----------en-- + + + A request with the + method requires a valid Content-Length header. + + +----------en-- + +Content-language: es +Content-type: text/html; charset=ISO-8859-1 +Body:----------es-- + + + Una solicitud con el método + necesita una cabecera Content-Length válida. + + +----------es-- + +Content-language: fr +Content-type: text/html; charset=ISO-8859-1 +Body:----------fr-- + + + Une requête utilisant la méthode nécessite un header valable + Content-Length (indiquant la longueur). + + +----------fr-- + +Content-language: ga +Content-type: text/html; charset=ISO-8859-1 +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=ISO-8859-1 +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=ISO-2022-JP +Body:----------ja-- + + + + $B%a%=%C%I$N%j%/%(%9%H$G$O!"(B + $B@5$7$$(B Content-Length $B%X%C%@$,I,MW$K$J$j$^$9!#(B + + +----------ja-- + +Content-language: ko +Content-type: text/html; charset=EUC-KR +Body:----------ko-- + + + ¹æ½ÄÀ» ¾²´Â + ¿äûÀº ¿Ã¹Ù¸¥ Content-Length Çì´õµµ ÇÔ²² º¸³»¾ß¸¸ ÇÕ´Ï´Ù. + + +----------ko-- + +Content-language: nl +Content-type: text/html; charset=ISO-8859-1 +Body:----------nl-- + + + Een vraag met het + type methode heeft een correcte Content-Length lijn nodig. + + +----------nl-- + +Content-language: pl +Content-type: text/html; charset=ISO-8859-2 +Body:----------pl-- + + + ¯±danie + wymaga poprawnego nag³ówka Content-Length. + + +----------pl-- + +Content-language: pt-br +Content-type: text/html; charset=ISO-8859-1 +Body:-------pt-br-- + + + Uma requisição + do método + requer um cabeçalho Content-Length válido. + + +-------pt-br-- + +Content-language: ro +Content-type: text/html; charset=ISO-8859-1 +Body:----------ro-- + + + O cerere cu metoda + necesita un header Content-Length valid. + + +----------ro-- + +Content-language: sr +Content-type: text/html; charset=ISO-8859-5 +Body:----------sr-- + + + ·ÐåâÕÒ áÐ + ÜÕâÞÔÞÜ ÜÞàÐ ØÜÐâØ ØáßàÐÒÝÞ Content-Length + (ÔãÖØÝÐ áÐÔàÖÐøÐ) ×ÐÓÛÐÒùÕ. + + +----------sr-- + +Content-language: sv +Content-type: text/html; charset=ISO-8859-1 +Body:----------sv-- + + + En förfrågan med + metoden kräver ett korrekt Content-Length huvud. + + +----------sv-- + +Content-language: tr +Content-type: text/html; charset=ISO-8859-9 +Body:----------tr-- + + + metodunu kullanan bir talep + geçerli bir Content-Length (içerik uzunluğu) başlığı gerektirir. + + +----------tr-- diff --git a/rubbos/app/httpd-2.0.64/docs/error/HTTP_METHOD_NOT_ALLOWED.html.var b/rubbos/app/httpd-2.0.64/docs/error/HTTP_METHOD_NOT_ALLOWED.html.var new file mode 100644 index 00000000..f2e1aa65 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/error/HTTP_METHOD_NOT_ALLOWED.html.var @@ -0,0 +1,213 @@ +Content-language: cs +Content-type: text/html; charset=ISO-8859-2 +Body:----------cs-- + + + Metoda + není pro po¾adované URL povolena. + + +----------cs-- + +Content-language: de +Content-type: text/html; charset=ISO-8859-1 +Body:----------de-- + + + Die -Methode + ist für den angeforderten URL nicht erlaubt. + + +----------de-- + +Content-language: en +Content-type: text/html; charset=ISO-8859-1 +Body:----------en-- + + + The + method is not allowed for the requested URL. + + +----------en-- + +Content-language: es +Content-type: text/html; charset=ISO-8859-1 +Body:----------es-- + + + El + método utilizado por su solicitud no está + permitido por el enlace. + + +----------es-- + +Content-language: fr +Content-type: text/html; charset=ISO-8859-1 +Body:----------fr-- + + + La méthode + n'est pas utilisable pour l'URL requise. + + +----------fr-- + +Content-language: ga +Content-type: text/html; charset=ISO-8859-1 +Body:----------ga-- + + + Níl cead an modh + + a úasáid leis an URL iarraithe. + + +----------ga-- + +Content-language: it +Content-type: text/html; charset=ISO-8859-1 +Body:----------it-- + + + Il metodo + non è consentito per l'URL richiesto. + + +----------it-- + +Content-language: ja +Content-type: text/html; charset=ISO-2022-JP +Body:----------ja-- + + + + $B%a%=%C%I$O!"MW5a$5$l$?(B URL $B$KBP$7$F$O5v2D$5$l$F$$$^$;$s!#(B + + +----------ja-- + +Content-language: ko +Content-type: text/html; charset=EUC-KR +Body:----------ko-- + + + ¹æ½ÄÀº + ¿äûÇÑ URL¿¡ »ç¿ëÇÒ ¼ö ¾ø½À´Ï´Ù. + + +----------ko-- + +Content-language: nl +Content-type: text/html; charset=ISO-8859-1 +Body:----------nl-- + + + Het + type methode is niet toegelaten voor de gevraagde URL. + + +----------nl-- + +Content-language: pl +Content-type: text/html; charset=ISO-8859-2 +Body:----------pl-- + + + Metoda + jest niedozwolona dla podanego URLa. + + +----------pl-- + +Content-language: pt-br +Content-type: text/html; charset=ISO-8859-1 +Body:-------pt-br-- + + + O método + não é permitido para a URL requisitada. + + +-------pt-br-- + +Content-language: ro +Content-type: text/html; charset=ISO-8859-1 +Body:----------ro-- + + + Metoda + nu este permisa pentru URL-ul cerut. + + +----------ro-- + +Content-language: sr +Content-type: text/html; charset=ISO-8859-5 +Body:----------sr-- + + + + ÜÕâÞÔ ÝØøÕ ÔÞ×ÒÞùÕÝ ×Ð ×ÐåâÕÒÐÝØ ÃÀ». + + +----------sr-- + +Content-language: sv +Content-type: text/html; charset=ISO-8859-1 +Body:----------sv-- + + + + metoden är inte tillåten för den förfrågade + adressen. + + +----------sv-- + +Content-language: tr +Content-type: text/html; charset=ISO-8859-9 +Body:----------tr-- + + + yöntemi talep ettiğiniz URL için kullanılamaz. + + +----------tr-- diff --git a/rubbos/app/httpd-2.0.64/docs/error/HTTP_NOT_FOUND.html.var b/rubbos/app/httpd-2.0.64/docs/error/HTTP_NOT_FOUND.html.var new file mode 100644 index 00000000..58149171 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/error/HTTP_NOT_FOUND.html.var @@ -0,0 +1,435 @@ +Content-language: cs +Content-type: text/html; charset=ISO-8859-2 +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=ISO-8859-1 +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=ISO-8859-1 +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; charset=ISO-8859-1 +Body:----------es-- + + + El enlace requerido no ha sido localizado en + este servidor. + + + + El enlace en la + ">página + referente parece tener algun error o ha expirado. Por favor + comunique al autor de + ">la + página el error. + + + + Si usted proporcionó el enlace de manera manual le solicitamos + que por favor revise los datos e intentelo de nuevo. + + + + +----------es-- + +Content-language: fr +Content-type: text/html; charset=ISO-8859-1 +Body:----------fr-- + + + L'URL requise n'a pu etre 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=ISO-8859-1 +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=ISO-8859-1 +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=ISO-2022-JP +Body:----------ja-- + + + $BMW5a$5$l$?(B URL $B$OK\%5!<%P$G$O8+$D$+$j$^$;$s$G$7$?!#(B + + + + "> + $B;2>H85%Z!<%8(B$B$N%j%s%/$,4V0c$C$F$$$k$+!"8E$/$J$C$F$7$^$C$F$$$k$h$&$G$9!#(B + " + >$B%Z!<%8(B$B$NCx + + $B$b$7l9g$O!"DV$j$r3NG'$7$F:FEY$*;n$72<$5$$!#(B + + + + +----------ja-- + +Content-language: ko +Content-type: text/html; charset=EUC-KR +Body:----------ko-- + + + ¿äûÇÑ URLÀ» ÀÌ ¼­¹ö¿¡¼­ ãÀ» ¼ö ¾ø½À´Ï´Ù. + + + + ">ÀÌÀü + ÆäÀÌÁö¿¡ ÀÖ´Â ¸µÅ©°¡ À߸øµÇ¾ú°Å³ª ¿À·¡µÇ¾î ¾ø¾îÁø °Í °°½À´Ï´Ù. + ">±× ÆäÀÌÁö¸¦ + ¸¸µçÀÌ¿¡°Ô ÀÌ »ç½ÇÀ» ¾Ë·ÁÁֽñ⠹ٶø´Ï´Ù. + + + + URLÀ» Á÷Á¢ ÀÔ·ÂÇÏ¼Ì´Ù¸é ¹Ù¸£°Ô ÀÔ·ÂÇϼ̴ÂÁö È®ÀÎÇÏ½Ã°í ´Ù½Ã ½ÃµµÇϽñâ + ¹Ù¶ø´Ï´Ù. + + + + +----------ko-- + +Content-language: nl +Content-type: text/html; charset=ISO-8859-1 +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: pl +Content-type: text/html; charset=ISO-8859-2 +Body:----------pl-- + + + Nie znaleziono ¿±danego URLa 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¶ URLa rêcznie, sprawd¼, czy nie siê nie pomyli³e¶. + + + + +----------pl-- + +Content-language: pt-br +Content-type: text/html; charset=ISO-8859-1 +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: ro +Content-type: text/html; charset=ISO-8859-1 +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: sr +Content-type: text/html; charset=ISO-8859-5 +Body:----------sr-- + + + ·ÐåâÕÒÐÝØ ÃÀ» ÝØøÕ ßàÞÝÐòÕÝ ÝÐ ÞÒÞÜ áÕàÒÕàã. + + + + ¸×ÓÛÕÔÐ ÔÐ øÕ ÒÕ×Ð ÝÐ + ">ØáåÞÔØèÝÞø + áâàÐÝØæØ ßÞÓàÕèÝÐ ØÛØ ×ÐáâÐàÕÛÐ. ¼ÞÛØÜÞ ÞÑÐÒÕáâØâÕ ÐãâÞàÐ + ">âÕ áâàÐÝØæÕ + Þ ÓàÕèæØ. + + + + ÃÚÞÛØÚÞ áâÕ ÃÀ» ãÝÕÛØ àãçÝÞ, ÜÞÛØÜÞ ßàÞÒÕàØâÕ ÜÞÓãûÕ + ÓàÕèÚÕ Ø ßàÞÑÐøâÕ ßÞÝÞÒÞ. + + + + +----------sr-- + +Content-language: sv +Content-type: text/html; charset=ISO-8859-1 +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=ISO-8859-9 +Body:----------tr-- + + + Talep ettiğiniz URL, sunucu üzerinde bulunmuyor. + + + + ">Referans sayfa + üzerindeki bağlantı güncel değil. + Lütfen ">referans sayfa'nın + yazarını konuyla ilgili bilgilendirin. + + + + URL'i kendiniz elle girdiyseniz, yazımınızı denetleyip tekrar deneyin. + + + + +----------tr-- diff --git a/rubbos/app/httpd-2.0.64/docs/error/HTTP_NOT_IMPLEMENTED.html.var b/rubbos/app/httpd-2.0.64/docs/error/HTTP_NOT_IMPLEMENTED.html.var new file mode 100644 index 00000000..8081d8e9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/error/HTTP_NOT_IMPLEMENTED.html.var @@ -0,0 +1,201 @@ +Content-language: cs +Content-type: text/html; charset=ISO-8859-2 +Body:----------cs-- + + + Server nepodporuje akci po¾adovanou prohlí¾eèem. + + +----------cs-- + +Content-language: de +Content-type: text/html; charset=ISO-8859-1 +Body:----------de-- + + + Die vom Browser angeforderte Aktion wird vom Server + nicht unterstützt. + + +----------de-- + +Content-language: en +Content-type: text/html; charset=ISO-8859-1 +Body:----------en-- + + + The server does not support the action requested by the browser. + + +----------en-- + +Content-language: es +Content-type: text/html; charset=ISO-8859-1 +Body:----------es-- + + + El navegador está solicitando una acción + que no puede ser procesada. + + +----------es-- + +Content-language: fr +Content-type: text/html; charset=ISO-8859-1 +Body:----------fr-- + + + Le serveur n'est pas en mesure d'effectuer l'action + requise par le navigateur. + + +----------fr-- + +Content-language: ga +Content-type: text/html; charset=ISO-8859-1 +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=ISO-8859-1 +Body:----------it-- + + + Il server non supporta il tipo di azione richiesta dal browser. + + +----------it-- + +Content-language: ja +Content-type: text/html; charset=ISO-2022-JP +Body:----------ja-- + + + $B%V%i%&%6$NMW5a$7$?%"%/%7%g%s$O!"%5%]!<%H$7$F$$$^$;$s!#(B + + +----------ja-- + +Content-language: ko +Content-type: text/html; charset=EUC-KR +Body:----------ko-- + + + ºê¶ó¿ìÀú°¡ º¸³½ ¿äûÀ» ÀÌ ¼­¹ö°¡ Áö¿øÇÏÁö ¾Ê½À´Ï´Ù. + + +----------ko-- + +Content-language: nl +Content-type: text/html; charset=ISO-8859-1 +Body:----------nl-- + + + De server ondersteunt de actie, gevraagd door de browser, niet. + + +----------nl-- + +Content-language: pl +Content-type: text/html; charset=ISO-8859-2 +Body:----------pl-- + + + Ten serwer nie obs³uguje ¿±dania przes³anego przez przegl±darkê. + + +----------pl-- + +Content-language: pt-br +Content-type: text/html; charset=ISO-8859-1 +Body:-------pt-br-- + + + O servidor não suporta a ação requisitada pelo + seu "browser". + + +-------pt-br-- + +Content-language: ro +Content-type: text/html; charset=ISO-8859-1 +Body:----------ro-- + + + Serverul nu suporta actiunea ceruta de browser. + + +----------ro-- + +Content-language: sr +Content-type: text/html; charset=ISO-8859-5 +Body:----------sr-- + + + ÁÕàÒÕà ÝÕ ßÞÔàÖÐÒÐ ÐÚæØøã ÚÞøã øÕ çØâÐç ×ÐåâÕÒÐÞ. + + +----------sr-- + +Content-language: sv +Content-type: text/html; charset=ISO-8859-1 +Body:----------sv-- + + + Servern stödjer inte den handling som önskades + av webbläsaren. + + +----------sv-- + +Content-language: tr +Content-type: text/html; charset=ISO-8859-9 +Body:----------tr-- + + + Sunucu, gezgin tarafından talep edilen yöntemi desteklemiyor. + + +----------tr-- diff --git a/rubbos/app/httpd-2.0.64/docs/error/HTTP_PRECONDITION_FAILED.html.var b/rubbos/app/httpd-2.0.64/docs/error/HTTP_PRECONDITION_FAILED.html.var new file mode 100644 index 00000000..330b4431 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/error/HTTP_PRECONDITION_FAILED.html.var @@ -0,0 +1,205 @@ +Content-language: cs +Content-type: text/html; charset=ISO-8859-2 +Body:----------cs-- + + + Vstupní podmínka pro po¾adavek o zadané URL nesplnila pozitivní + vyhodnocení. + + +----------cs-- + +Content-language: de +Content-type: text/html; charset=ISO-8859-1 +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=ISO-8859-1 +Body:----------en-- + + + The precondition on the request for the URL failed positive evaluation. + + +----------en-- + +Content-language: es +Content-type: text/html; charset=ISO-8859-1 +Body:----------es-- + + + La precondición para que exista una + conexión a la dirección solicitada es falsa. + + +----------es-- + +Content-language: fr +Content-type: text/html; charset=ISO-8859-1 +Body:----------fr-- + + + La précondition pour l'URL requise a été + évaluée négativement. + + +----------fr-- + +Content-language: ga +Content-type: text/html; charset=ISO-8859-1 +Body:----------ga-- + + + Theip meastóireacht an réamhchoinníoll + don iarratais den URL. + + +----------ga-- + +Content-language: it +Content-type: text/html; charset=ISO-8859-1 +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=ISO-2022-JP +Body:----------ja-- + + + $B;XDj$5$l$?(B URL $B$X$N%j%/%(%9%H$K$*$1$k;vA0>r7o$,K~$?$5$l$^$;$s$G$7$?!#(B + + +----------ja-- + +Content-language: ko +Content-type: text/html; charset=EUC-KR +Body:----------ko-- + + + ¹Ì¸® ÁÖ¾îÁø Á¶°ÇÀÌ ¸¸Á·µÇÁö ¾Ê¾Æ¼­ URL ¿äûÀ» ó¸®ÇÒ ¼ö ¾ø½À´Ï´Ù. + + +----------ko-- + +Content-language: nl +Content-type: text/html; charset=ISO-8859-1 +Body:----------nl-- + + + Een startvoorwaarde werd niet voldaan bij verwerking van de vraag naar de URL. + + +----------nl-- + +Content-language: pl +Content-type: text/html; charset=ISO-8859-2 +Body:----------pl-- + + + Warunek wstêpny dla URLa nie zosta³ spe³niony. + + +----------pl-- + +Content-language: pt-br +Content-type: text/html; charset=ISO-8859-1 +Body:-------pt-br-- + + + A condição necessária para a + requisição da URL foi avaliada como falsa. + + +-------pt-br-- + +Content-language: ro +Content-type: text/html; charset=ISO-8859-1 +Body:----------ro-- + + + Preconditionarea pentru cererea URL-ului nu a fost evaluata pozitiv. + + +----------ro-- + +Content-language: sr +Content-type: text/html; charset=ISO-8859-5 +Body:----------sr-- + + + ¿àÕÔãáÛÞÒ ×Ð ×ÐåâÕÒ ÃÀ»-Ð ÝØøÕ ØáßãúÕÝ. + + +----------sr-- + +Content-language: sv +Content-type: text/html; charset=ISO-8859-1 +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=ISO-8859-9 +Body:----------tr-- + + + URL talebinin önşartı, olumlu süreci + başarısızlıkla sonlandırdı. + + +----------tr-- diff --git a/rubbos/app/httpd-2.0.64/docs/error/HTTP_REQUEST_ENTITY_TOO_LARGE.html.var b/rubbos/app/httpd-2.0.64/docs/error/HTTP_REQUEST_ENTITY_TOO_LARGE.html.var new file mode 100644 index 00000000..0175cf56 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/error/HTTP_REQUEST_ENTITY_TOO_LARGE.html.var @@ -0,0 +1,226 @@ +Content-language: cs +Content-type: text/html; charset=ISO-8859-2 +Body:----------cs-- + + + Metoda + nedovoluje pøenos dat nebo objem dat + pøesahuje kapacitní limit. + + +----------cs-- + +Content-language: de +Content-type: text/html; charset=ISO-8859-1 +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=ISO-8859-1 +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; charset=ISO-8859-1 +Body:----------es-- + + + Los recursos establecidos no permiten peticiones con + el método + suministrado por su solicitud, o, la cantidad de datos + provistos exceden los límites de capacidad. + + +----------es-- + +Content-language: fr +Content-type: text/html; charset=ISO-8859-1 +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=ISO-8859-1 +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=ISO-8859-1 +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=ISO-2022-JP +Body:----------ja-- + + + + $B%a%=%C%I$,%G!<%?$NAw?.$r5v2D$7$F$$$J$$$+!"(B + $B%G!<%?NL$,5vMFNL$rD6$($F$$$^$9!#(B + + +----------ja-- + +Content-language: ko +Content-type: text/html; charset=EUC-KR +Body:----------ko-- + + + ¹æ½ÄÀÇ + ¿äûÀ¸·Î´Â ³»¿ëÀ» º¸³¾ ¼ö ¾ø°Å³ª, ¶Ç´Â º¸³»¿Â ³»¿ëÀÌ ±× ¹æ½Ä¿¡¼­ Çã¿ëÇÏ´Â + ÃÖ´ë ±æÀ̸¦ ³Ñ¾ú½À´Ï´Ù. + + +----------ko-- + +Content-language: nl +Content-type: text/html; charset=ISO-8859-1 +Body:----------nl-- + + + Het type methode laat niet toe + data te versturen of het datavolume is groter dan maximaal toegelaten. + + +----------nl-- + +Content-language: pl +Content-type: text/html; charset=ISO-8859-2 +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=ISO-8859-1 +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: ro +Content-type: text/html; charset=ISO-8859-1 +Body:----------ro-- + + + Metoda + nu permite transmiterea datelor, sau volumul de date + depaseste limita capacitatii. + + +----------ro-- + +Content-language: sr +Content-type: text/html; charset=ISO-8859-5 +Body:----------sr-- + + + + ÜÕâÞÔ ÝÕ ÔÞ×ÒÞùÐÒÐ ßàÕÝÞá ÞÒØå ßÞÔÐâÐÚÐ, ØÛØ ÚÞÛØçØÝÐ ßÞÔÐâÐÚÐ + ßàÕÜÐèãøÕ ÞÓàÐÝØçÕúÐ ÜÞÓãûÝÞáâØ. + + +----------sr-- + +Content-language: sv +Content-type: text/html; charset=ISO-8859-1 +Body:----------sv-- + + + metoden tillåter + inte den skickade datan eller så överskrider datavolymen + kapacitetsnivån. + + +----------sv-- + +Content-language: tr +Content-type: text/html; charset=ISO-8859-9 +Body:----------tr-- + + + yöntemi iletilen + veri tipini desteklemez, ya da veri hacmi kapasite limitlerini aşıyor. + + +----------tr-- diff --git a/rubbos/app/httpd-2.0.64/docs/error/HTTP_REQUEST_TIME_OUT.html.var b/rubbos/app/httpd-2.0.64/docs/error/HTTP_REQUEST_TIME_OUT.html.var new file mode 100644 index 00000000..7582a0e7 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/error/HTTP_REQUEST_TIME_OUT.html.var @@ -0,0 +1,217 @@ +Content-language: cs +Content-type: text/html; charset=ISO-8859-2 +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=ISO-8859-1 +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=ISO-8859-1 +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; charset=ISO-8859-1 +Body:----------es-- + + + El servidor ha cerrado la conexión de red + debido a que el navegador no terminó la solicitud + dentro del tiempo especificado. + + +----------es-- + +Content-language: fr +Content-type: text/html; charset=ISO-8859-1 +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=ISO-8859-1 +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=ISO-8859-1 +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=ISO-2022-JP +Body:----------ja-- + + + $B%V%i%&%6$,;XDj;~4V0JFb$K%j%/%(%9%H$r40N;$7$J$+$C$?$N$G!"(B + $B%5!<%P$O@\B3$r@Z$j$^$7$?!#(B + + +----------ja-- + +Content-language: ko +Content-type: text/html; charset=EUC-KR +Body:----------ko-- + + + ºê¶ó¿ìÀú°¡ ³Ê¹« ¿À·§µ¿¾È ¿äûÀ» ³¡³»Áö ¾Ê¾Æ¼­ ¼­¹ö°¡ ³×Æ®¿öÅ© ¿¬°áÀ» + °­Á¦·Î ²÷¾ú½À´Ï´Ù. + + +----------ko-- + +Content-language: nl +Content-type: text/html; charset=ISO-8859-1 +Body:----------nl-- + + + De server heeft de netwerkverbinding gesloten omdat de browser + de vraag niet heeft beëindigd binnen een gestelde tijd. + + +----------nl-- + +Content-language: pl +Content-type: text/html; charset=ISO-8859-2 +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=ISO-8859-1 +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: ro +Content-type: text/html; charset=ISO-8859-1 +Body:----------ro-- + + + Serverul a terminat conexiunea cu browserul pentru ca acesta + nu a terminat cererea in limita timpului specificat. + + +----------ro-- + +Content-language: sr +Content-type: text/html; charset=ISO-8859-5 +Body:----------sr-- + + + ÁÕàÒÕà øÕ ßàÕÚØÝãÞ ÒÕ×ã áÐ ÜàÕÖÞÜ øÕà çØâÐç + ÝØøÕ ×ÐÒàèØÞ ×ÐåâÕÒ ×Ð ÔÞ×ÒÞùÕÝÞ ÒàÕÜÕ. + + +----------sr-- + +Content-language: sv +Content-type: text/html; charset=ISO-8859-1 +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=ISO-8859-9 +Body:----------tr-- + + + Sunucu ağ bağlantısını kapattı çünkü gezgin + talebini belirlenmiş süre içinde tamamlayamadı. + + +----------tr-- diff --git a/rubbos/app/httpd-2.0.64/docs/error/HTTP_REQUEST_URI_TOO_LARGE.html.var b/rubbos/app/httpd-2.0.64/docs/error/HTTP_REQUEST_URI_TOO_LARGE.html.var new file mode 100644 index 00000000..be73725d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/error/HTTP_REQUEST_URI_TOO_LARGE.html.var @@ -0,0 +1,217 @@ +Content-language: cs +Content-type: text/html; charset=ISO-8859-2 +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=ISO-8859-1 +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=ISO-8859-1 +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; charset=ISO-8859-1 +Body:----------es-- + + + Su solicitud no puede procesarse debido a que la + longitud del enlace excede la capacidad límite del + servidor. + + +----------es-- + +Content-language: fr +Content-type: text/html; charset=ISO-8859-1 +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=ISO-8859-1 +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=ISO-8859-1 +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=ISO-2022-JP +Body:----------ja-- + + + $B%j%/%(%9%H$N(B URL $B$ND9$5$,!"07$($kD9$5$rD6$($F$$$^$9!#(B + $B%j%/%(%9%H$N=hM}$rB3$1$i$l$^$;$s!#(B + + +----------ja-- + +Content-language: ko +Content-type: text/html; charset=EUC-KR +Body:----------ko-- + + + ¿äûÇÑ URLÀÌ ³Ê¹« ±æ¾î¼­ ÀÌ ¼­¹ö°¡ ó¸®ÇÒ ¼ö ¾ø½À´Ï´Ù. + + +----------ko-- + +Content-language: nl +Content-type: text/html; charset=ISO-8859-1 +Body:----------nl-- + + + De lengte van de aangeboden URL overschreidt het maximum + voor deze server. De vraag kan niet verwerkt worden. + + +----------nl-- + +Content-language: pl +Content-type: text/html; charset=ISO-8859-2 +Body:----------pl-- + + + D³ugo¶æ ¿±danego URLa przekracza limit ustanowiony dla tego + serwera. ¯±danie nie mo¿e zostaæ zrealizowane. + + +----------pl-- + +Content-language: pt-br +Content-type: text/html; charset=ISO-8859-1 +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: ro +Content-type: text/html; charset=ISO-8859-1 +Body:----------ro-- + + + Lungimea URL-ului cerut depaseste limita capacitatii pentru + acest server. Cererea nu poate fi procesata. + + +----------ro-- + +Content-language: sr +Content-type: text/html; charset=ISO-8859-5 +Body:----------sr-- + + + ´ãÖØÝÐ ×ÐåâÕÒÐÝÞÓ ÃÀ»-Ð ßàÕÜÐèãøÕ ÞÓàÐÝØçÕúÐ ÜÞÓãûÝÞáâØ + ÞÒÞÓ áÕàÒÕàÐ. ·ÐåâÕÒ ÝÕ ÜÞÖÕ ÑØâØ ÞÑàÐòÕÝ. + + +----------sr-- + +Content-language: sv +Content-type: text/html; charset=ISO-8859-1 +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=ISO-8859-9 +Body:----------tr-- + + + Talep edilen URL'nin uzunluğu, sunucunun kapasite limitlerini aşıyor. + Talep işlenemiyor. + + +----------tr-- diff --git a/rubbos/app/httpd-2.0.64/docs/error/HTTP_SERVICE_UNAVAILABLE.html.var b/rubbos/app/httpd-2.0.64/docs/error/HTTP_SERVICE_UNAVAILABLE.html.var new file mode 100644 index 00000000..ebfb3685 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/error/HTTP_SERVICE_UNAVAILABLE.html.var @@ -0,0 +1,233 @@ +Content-language: cs +Content-type: text/html; charset=ISO-8859-2 +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=ISO-8859-1 +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=ISO-8859-1 +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; charset=ISO-8859-1 +Body:----------es-- + + + El servidor no puede atender su solicitud por + el momento debido a problemas de mantenimiento + o de capacidad. + + Le solicitamos que por favor repita la operación + más tarde. + + +----------es-- + +Content-language: fr +Content-type: text/html; charset=ISO-8859-1 +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=ISO-8859-1 +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=ISO-8859-1 +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=ISO-2022-JP +Body:----------ja-- + + + $B%a%s%F%J%s%9$GDd;_Cf$+!"%5!<%P$N=hM}G=NO$NLdBj$N$?$a!"(B + $B8=:_%j%/%(%9%H$K1~$8$k$3$H$,$G$-$^$;$s!#(B + $B8e$[$I:FEY$*;n$72<$5$$!#(B + + +----------ja-- + +Content-language: ko +Content-type: text/html; charset=EUC-KR +Body:----------ko-- + + + °ü¸® ÀÛ¾÷À̳ª ¿ë·® ¹®Á¦·Î ¼­¹ö°¡ Àá½Ãµ¿¾È ¿äûÀ» ó¸®ÇÒ ¼ö ¾ø½À´Ï´Ù. + ³ªÁß¿¡ ´Ù½Ã ½ÃµµÇØÁֽñ⠹ٶø´Ï´Ù. + + +----------ko-- + +Content-language: nl +Content-type: text/html; charset=ISO-8859-1 +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: pl +Content-type: text/html; charset=ISO-8859-2 +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=ISO-8859-1 +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: ro +Content-type: text/html; charset=ISO-8859-1 +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: sr +Content-type: text/html; charset=ISO-8859-5 +Body:----------sr-- + + + ÁÕàÒÕà âàÕÝãâÝÞ ÝØøÕ ã ÜÞÓãûÝÞáâØ ÔÐ ãáÛãÖØ ÒÐè + ×ÐåâÕÒ ßÞèâÞ øÕ ×ÐâÒÞàÕÝ ×ÑÞÓ ÞÔàÖÐÒÐúÐ ØÛØ ØÜÐ ÝÕÔÞÒÞùÐÝ + ÚÐßÐæØâÕâ. ¼ÞÛØÜÞ ßÞÚãèÐøâÕ ßÞÝÞÒÞ ÚÐáÝØøÕ. + + +----------sr-- + +Content-language: sv +Content-type: text/html; charset=ISO-8859-1 +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=ISO-8859-9 +Body:----------tr-- + + + Sunucu, kendi içindeki çeşitli sorunlardan ötürü, + bir süreliğine taleplerinize cevap veremeyecek. + Lütfen daha sonra tekrar deneyin. + + +----------tr-- diff --git a/rubbos/app/httpd-2.0.64/docs/error/HTTP_UNAUTHORIZED.html.var b/rubbos/app/httpd-2.0.64/docs/error/HTTP_UNAUTHORIZED.html.var new file mode 100644 index 00000000..99576534 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/error/HTTP_UNAUTHORIZED.html.var @@ -0,0 +1,337 @@ +Content-language: cs +Content-type: text/html; charset=ISO-8859-2 +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=ISO-8859-1 +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=ISO-8859-1 +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; charset=ISO-8859-1 +Body:----------es-- + + + El servidor no puede certificar que usted este autorizado + para acceder al enlace "". + Usted pudo suministrar información errónea accidentalmente + (ejem. una contraseña inválida) o, el navegador no sabe + como suministrar la información requerida. + + + + En caso de que a usted le este permitido el uso del + documento requerido, le solicitamos de la manera más atenta + que por favor vuelva a intentar la operación suministrando + nuevamente su identificador y su contraseña. + + +----------es-- + +Content-language: fr +Content-type: text/html; charset=ISO-8859-1 +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 êtez 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=ISO-8859-1 +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=ISO-8859-1 +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=ISO-2022-JP +Body:----------ja-- + + + URL "" + $B$X$N%"%/%;%98"8B$,$"$k$3$H$r3NG'$G$-$^$;$s$G$7$?!#(B + $B4V0c$C$?;q3J>pJs(B ($BNc$($P!"8m$C$?%Q%9%o!<%I(B) $B$rF~NO$7$?$+!"(B + $B%V%i%&%6$,I,MW$J;q3J>pJs$rAw?.$9$kJ}K!$rM}2r$7$F$$$J$$$+$G$9!#(B + + + + $B%I%-%e%a%s%H$rMW5a$G$-$kH&$G$"$k>l9g$O!"(B + $B%f!<%6(B ID $B$H%Q%9%o!<%I$r:F3NG'$7$F2<$5$$!#(B + + +----------ja-- + +Content-language: ko +Content-type: text/html; charset=EUC-KR +Body:----------ko-- + + + ÀÌ ¼­¹ö°¡ "" URLÀ» + Á¢±ÙÇÒ ¼ö ÀÖ´Â ±ÇÇÑÀÌ ÀÖ´ÂÁö È®ÀÎÇÏÁö ¸øÇß½À´Ï´Ù. + À߸øµÈ ÀÎÁõ Á¤º¸(°¡·É, À߸øµÈ ¾ÏÈ£)¸¦ º¸³Â°Å³ª ¾Æ´Ï¸é + »ç¿ëÇϽô ºê¶ó¿ìÀú°¡ ÇÊ¿äÇÑ ÀÎÁõ Á¤º¸¸¦ ¾î¶»°Ô º¸³»´ÂÁö ¸ð¸£´Â °ÍÀÔ´Ï´Ù. + + + + ÀÌ ¹®¼­¸¦ »ç¿ëÇÒ ¼ö ÀÖµµ·Ï Çã°¡¸¦ ¹Þ¾Ò´Âµ¥µµ ÀÌ·±´Ù¸é, + »ç¿ëÀÚ ID¿Í ¾ÏÈ£¸¦ È®ÀÎÇÏ½Ã°í ´Ù½Ã ½ÃµµÇϽñ⠹ٶø´Ï´Ù. + + +----------ko-- + +Content-language: nl +Content-type: text/html; charset=ISO-8859-1 +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: pl +Content-type: text/html; charset=ISO-8859-2 +Body:----------pl-- + + + Serwer nie mo¿e zweryfikowaæ, ¿e masz uprawnienia dostêpu do + URLa "". + 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, sprad¼ + podan± nazwê u¿ytkownika i has³o. + + +----------pl-- + +Content-language: pt-br +Content-type: text/html; charset=ISO-8859-1 +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: ro +Content-type: text/html; charset=ISO-8859-1 +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: sr +Content-type: text/html; charset=ISO-8859-5 +Body:----------sr-- + + + ¾ÒÐø áÕàÒÕà ÝØøÕ ÜÞÓÐÞ ÔÐ ßÞâÒàÔØ ÔÐ áâÕ ÞÒÛÐèûÕÝØ ÔÐ ßàØáâãßØâÕ + ÃÀ»-ã "". + ¼ÞÓãûÕ øÕ ØÛØ ÔÐ áâÕ ÝÐÒÕÛØ ßÞÓàÕèÝÕ ÛØçÝÕ ßÞÔÐâÚÕ (Ýßà. ÝÕâÐçÝã ÛÞ×ØÝÚã), ØÛØ ÔÐ + ÒÐè çØâÐç ÝÕ àÐ×ãÜÕ ÚÐÚÞ ÔÐ ßÞèÐùÕ ×ÐåâÕÒÐÝÕ ÛØçÝÕ ßÞÔÐâÚÕ. + + + + ÃÚÞÛØÚÞ ÒÐÜ øÕ ÔÞ×ÒÞùÕÝÞ ÔÐ ßàÕã×ØÜÐâÕ ÔÞÚãÜÕÝâ, ÜÞÛØÜÞ ÔÐ + ßàÞÒÕàØâÕ áÒÞøÕ ÚÞàØáÝØçÚÞ ØÜÕ Ø ÛÞ×ØÝÚã Ø ßàÞÑÐâÕ ßÞÝÞÒÞ. + + +----------sr-- + +Content-language: sv +Content-type: text/html; charset=ISO-8859-1 +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=ISO-8859-9 +Body:----------tr-- + + + Sunucu bu dokümana erişim izninizi doğrulayamadı. + Ya kimliğiniz doğrulanamadı (örneğin hatalı parola girdiniz), + ya da gezgininiz bu işlemi yerine getiremiyor. + + + + Eğer bu dokümana erişme izniniz varsa, lütfen kimliğinizi + ve parolanızı kontrol edip, tekrar deneyin. + + +----------tr-- diff --git a/rubbos/app/httpd-2.0.64/docs/error/HTTP_UNSUPPORTED_MEDIA_TYPE.html.var b/rubbos/app/httpd-2.0.64/docs/error/HTTP_UNSUPPORTED_MEDIA_TYPE.html.var new file mode 100644 index 00000000..675852c1 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/error/HTTP_UNSUPPORTED_MEDIA_TYPE.html.var @@ -0,0 +1,201 @@ +Content-language: cs +Content-type: text/html; charset=ISO-8859-2 +Body:----------cs-- + + + Server nepodporuje typ prostøedku (media) pøeneseného v po¾adavku. + + +----------cs-- + +Content-language: de +Content-type: text/html; charset=ISO-8859-1 +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=ISO-8859-1 +Body:----------en-- + + + The server does not support the media type transmitted in the request. + + +----------en-- + +Content-language: es +Content-type: text/html; charset=ISO-8859-1 +Body:----------es-- + + + Los datos de su solicitud no se encuentran en + un formato aceptado por este recurso. + + +----------es-- + +Content-language: fr +Content-type: text/html; charset=ISO-8859-1 +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=ISO-8859-1 +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=ISO-8859-1 +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=ISO-2022-JP +Body:----------ja-- + + + $B%j%/%(%9%H$G;XDj$5$l$?%a%G%#%"%?%$%W$O%5%]!<%H$5$l$F$$$^$;$s!#(B + + +----------ja-- + +Content-language: ko +Content-type: text/html; charset=EUC-KR +Body:----------ko-- + + + ¿äûÀ¸·Î º¸³»¿Â ¹Ìµð¾î Çü½ÄÀ» ÀÌ ¼­¹ö°¡ Áö¿øÇÏÁö ¾Ê½À´Ï´Ù. + + +----------ko-- + +Content-language: nl +Content-type: text/html; charset=ISO-8859-1 +Body:----------nl-- + + + De server ondersteunt het gevraagde formaat ( media type ) niet. + + +----------nl-- + +Content-language: pl +Content-type: text/html; charset=ISO-8859-2 +Body:----------pl-- + + + Serwer nie zna typu danych przes³anych w ¿±daniu. + + +----------pl-- + +Content-language: pt-br +Content-type: text/html; charset=ISO-8859-1 +Body:-------pt-br-- + + + O servidor não suporta o tipo de mídia + transmitida nesta requisição. + + +-------pt-br-- + +Content-language: ro +Content-type: text/html; charset=ISO-8859-1 +Body:----------ro-- + + + Serverul nu suporta tipul de date trimise in cerere. + + +----------ro-- + +Content-language: sr +Content-type: text/html; charset=ISO-8859-5 +Body:----------sr-- + + + ÁÕàÒÕà ÝÕ ßÞÔàÖÐÒÐ Òàáâã ÜÕÔØøÐ ßàÕÝÕáÕÝã ã ×ÐåâÕÒã. + + +----------sr-- + +Content-language: sv +Content-type: text/html; charset=ISO-8859-1 +Body:----------sv-- + + + Servern stödjer inte den mediatyp som skickats i förfrågan. + + +----------sv-- + +Content-language: tr +Content-type: text/html; charset=ISO-8859-9 +Body:----------tr-- + + + Sunucu, talep içinde iletilen ortam türünü desteklemiyor. + + +----------tr-- diff --git a/rubbos/app/httpd-2.0.64/docs/error/HTTP_VARIANT_ALSO_VARIES.html.var b/rubbos/app/httpd-2.0.64/docs/error/HTTP_VARIANT_ALSO_VARIES.html.var new file mode 100644 index 00000000..ad2e5bd9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/error/HTTP_VARIANT_ALSO_VARIES.html.var @@ -0,0 +1,223 @@ +Content-language: cs +Content-type: text/html; charset=ISO-8859-2 +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=ISO-8859-1 +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=ISO-8859-1 +Body:----------en-- + + + A variant for the requested entity + is itself a negotiable resource. + Access not possible. + + +----------en-- + +Content-language: es +Content-type: text/html; charset=ISO-8859-1 +Body:----------es-- + + + No es posible tener acceso debido a que + una variante de la solicitud es por si + misma un recurso negociable. + + +----------es-- + +Content-language: fr +Content-type: text/html; charset=ISO-8859-1 +Body:----------fr-- + + + Une variante pour l'entité requise + est elle-même une ressource négociable. + L'accès est impossible. + + +----------fr-- + +Content-language: ga +Content-type: text/html; charset=ISO-8859-1 +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=ISO-8859-1 +Body:----------it-- + + + Non è possibile accedere all'entità + richiesta perché ` essa stessa + una risorsa negoziabile. + + +----------it-- + +Content-language: ja +Content-type: text/html; charset=ISO-2022-JP +Body:----------ja-- + + + $B%j%/%(%9%H$5$l$?$b$N$N(B variant + $B$O$=$l<+BN$b$^$?!"%M%4%7%(!<%7%g%s2DG=$J%j%=!<%9$G$9!#(B + $B%"%/%;%9$G$-$^$;$s$G$7$?!#(B + + +----------ja-- + +Content-language: ko +Content-type: text/html; charset=EUC-KR +Body:----------ko-- + + + ¿äûÇÑ °´Ã¼ÀÇ ÇüÅ ¶ÇÇÑ ¿©·¯ ÇüŸ¦ °¡Áö°í À־ + Á¢±ÙÀÌ ºÒ°¡´ÉÇÕ´Ï´Ù. + + +----------ko-- + +Content-language: nl +Content-type: text/html; charset=ISO-8859-1 +Body:----------nl-- + + + Een variant van het gevraagde object + is op zich ook een te onderhandelen variant. + Toegang is niet mogelijk. + + +----------nl-- + +Content-language: pl +Content-type: text/html; charset=ISO-8859-2 +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=ISO-8859-1 +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: ro +Content-type: text/html; charset=ISO-8859-1 +Body:----------ro-- + + + O varianta pentru entitatea ceruta + este ea insasi o resursa negociabila. + Accesul nu este posibil. + + +----------ro-- + +Content-language: sr +Content-type: text/html; charset=ISO-8859-5 +Body:----------sr-- + + + ²ÐàØøÐÝâÐ ×ÐåâÕÒÐÝÞÓ ÕÝâØâÕâÐ + øÕ Ø áÐÜÐ àÕáãàá ÚÞøØ ßÞáâÞøØ ã ÒØèÕ ÒÐàØøÐÝâØ. + ¿àØáâãß ÝØøÕ ÜÞÓãû. + + +----------sr-- + +Content-language: sv +Content-type: text/html; charset=ISO-8859-1 +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=ISO-8859-9 +Body:----------tr-- + + + Talep edilen elemanın bir değişkeninin kendisi zaten paylaşılır bir kaynak. + Erişim mümkün değil. + + +----------tr-- diff --git a/rubbos/app/httpd-2.0.64/docs/error/README b/rubbos/app/httpd-2.0.64/docs/error/README new file mode 100644 index 00000000..5a589449 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/error/README @@ -0,0 +1,36 @@ + + 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 | + | 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 | + | Korean (ko) | Jaeho Shin | + | Polish (pl) | Tomasz Kepczynski | + | Romanian (ro) | Andrei Besleaga | + | Serbian (sr) | Nikola Smolenski | + | Spanish (es) | Karla Quintero | + | Swedish (sv) | Thomas Sjögren | + | Turkish (tr) | Emre Sokullu | + | Irish (ga) | Noirin Plunkett | + +-----------------------+------------------------------------------+ + (Please see http://httpd.apache.org/docs-project/ if you would + like to contribute the pages in an additional language.) + diff --git a/rubbos/app/httpd-2.0.64/docs/error/contact.html.var b/rubbos/app/httpd-2.0.64/docs/error/contact.html.var new file mode 100644 index 00000000..8dc5581a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/error/contact.html.var @@ -0,0 +1,120 @@ +Content-language: cs +Content-type: text/html; charset=ISO-8859-2 +Body:----------cs-- +Pokud si myslíte, ¾e toto je chyba serveru, kontaktujte, prosím, +">webmastera. +----------cs-- + +Content-language: de +Content-type: text/html; charset=ISO-8859-1 +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=ISO-8859-1 +Body:----------en-- +If you think this is a server error, please contact +the ">webmaster. +----------en-- + +Content-language: es +Content-type: text/html; charset=ISO-8859-1 +Body:----------es-- +Por favor contacte con el +">webmaster +en caso de que usted crea que existe un error en el servidor. +----------es-- + +Content-language: fr +Content-type: text/html; charset=ISO-8859-1 +Body:----------fr-- +Si vous pensez qu'il s'agit d'une erreur du serveur, veuillez contacter le +">gestionnaire du site. +----------fr-- + +Content-language: ga +Content-type: text/html; charset=ISO-8859-1 +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=ISO-8859-1 +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=ISO-2022-JP +Body:----------ja-- +$B%5!<%P!<$N>c32$H;W$o$l$k>l9g$O!"(B" +>$B%&%'%V4IM}$B$^$G$4O"Mm$/$@$5$$!#(B +----------ja-- + +Content-language: ko +Content-type: text/html; charset=EUC-KR +Body:----------ko-- +¸¸¾à ÀÌ°ÍÀÌ ¼­¹ö ¿À·ù¶ó°í »ý°¢µÇ¸é, +">À¥ °ü¸®ÀÚ¿¡°Ô ¿¬¶ôÇϽñ⠹ٶø´Ï´Ù. +----------ko-- + +Content-language: nl +Content-type: text/html; charset=ISO-8859-1 +Body:----------nl-- +Indien u van oordeel bent dat deze server in fout is, gelieve +de ">webmaster te contacteren. +----------nl-- + +Content-language: pl +Content-type: text/html; charset=ISO-8859-2 +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=ISO-8859-1 +Body:-------pt-br-- +Se você acredita ter encontrado um problema no servidor, +por favor entre em contato com o +">webmaster. +-------pt-br-- + +Content-language: ro +Content-type: text/html; charset=ISO-8859-1 +Body:----------ro-- +Va rugam sa il contactati pe +">webmaster +in cazul in care credeti ca aceasta este o eroare a serverului. +----------ro-- + +Content-language: sr +Content-type: text/html; charset=ISO-8859-5 +Body:----------sr-- +°ÚÞ ÜØáÛØâÕ ÔÐ øÕ ÞÒÞ ÓàÕèÚÐ áÕàÒÕàÐ, ÜÞÛØÜÞ ÞÑÐÒÕáâØâÕ +">ÒÕÑÜÐáâÕàÐ. +----------sr-- + +Content-language: sv +Content-type: text/html; charset=ISO-8859-1 +Body:----------sv-- +Om du tror att detta beror på ett serverfel, vänligen kontakta +">webbansvarig. +----------sv-- + +Content-language: tr +Content-type: text/html; charset=ISO-8859-9 +Body:----------tr-- +Bunun bir sunucu hatası olduğunu düşünüyorsanız, lütfen +">site +yöneticisi ile iletişime geçin. +----------tr-- diff --git a/rubbos/app/httpd-2.0.64/docs/error/include/bottom.html b/rubbos/app/httpd-2.0.64/docs/error/include/bottom.html new file mode 100644 index 00000000..e8522b6e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/error/include/bottom.html @@ -0,0 +1,14 @@ +

    +

    + +

    + +

    Error

    +
    +
    + +
    +
    +
    + + diff --git a/rubbos/app/httpd-2.0.64/docs/error/include/spacer.html b/rubbos/app/httpd-2.0.64/docs/error/include/spacer.html new file mode 100644 index 00000000..7d5e5953 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/error/include/spacer.html @@ -0,0 +1,2 @@ +

    +

    diff --git a/rubbos/app/httpd-2.0.64/docs/error/include/top.html b/rubbos/app/httpd-2.0.64/docs/error/include/top.html new file mode 100644 index 00000000..04b73b51 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/error/include/top.html @@ -0,0 +1,24 @@ +"?> + +" xml:lang=""> + +<!--#echo encoding="none" var="TITLE" --> +" /> + + + + +

    +

    diff --git a/rubbos/app/httpd-2.0.64/docs/icons/README b/rubbos/app/httpd-2.0.64/docs/icons/README new file mode 100644 index 00000000..48250d59 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/README.html b/rubbos/app/httpd-2.0.64/docs/icons/README.html new file mode 100644 index 00000000..a8b82b99 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/a.gif b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/a.png b/rubbos/app/httpd-2.0.64/docs/icons/a.png new file mode 100644 index 0000000000000000000000000000000000000000..8cd63a95872ca46d01f5f073f0451f887a825de7 GIT binary patch literal 317 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DTx4|5ZC|z|DXB)f9A}Y#>U1# zF*w-HF-s80VJZpo3;xgWbi08UkjI$h?e4_j7XnDYZz! 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# zF*w-HF-s80VJZpo3;xgWbi08UkjI$h?e4qYm+ zOp%Hf4U3qkeEK$j<-vZfEnogwwFop_I<=~c#Xm)G=VXx+i~6md*OpFtqHyNXlZ_mE zB-Xb-{FC(h{h?#I<(neT&kyPQ!p87k)F%Ddw?iNsN?apKlJj$OQ}ap~LNYRo6%va| z6o6D_ozopr0J|M+7XSbN literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/icons/alert.red.gif b/rubbos/app/httpd-2.0.64/docs/icons/alert.red.gif new file mode 100644 index 0000000000000000000000000000000000000000..a4238940433deedd024eb0cada54be82e8f47db0 GIT binary patch literal 247 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 XqiYh{4~%{)S#O;4Fm;B(z`p+hpbw|G literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/icons/apache_pb2.png b/rubbos/app/httpd-2.0.64/docs/icons/apache_pb2.png new file mode 100644 index 0000000000000000000000000000000000000000..1237499fe8fe75f387a43e6c4a18e556ec927055 GIT binary patch literal 2175 zcmeHI`!m!F6#rr^vDnnDmB$hjlI(iz&7;;@AzLJ^tViGRC=qHs3YXZ2w}cepN@iUY z;d(@L?UHEG$~$aITJnCkO5dv=?|*QA=*(x%oX?z@GiN?C=W`Mr&REMx9gqS5K*rXF z=m-EJVmq~}P$*si426y1$) z-S3l{@%n-;t4hB<&N{Q`)n`Y=MCn;GxA9NHlvs{Ub`f^w`R?h`a$IXfZ?1rL_F&kR zt-ky#0fOcn>_mT4LEyx`+>?iBM-OG|${P|TQONE|a|D8*Icd{`vU_U43s%|Umw3#^ z?k0SwJa=mJq;W-}(!0TnByZJa8d}u4@$d)AZF<~|!#5?kt3**!;AFTu{aQ6*wOj5G zvrZ3NNsgrnn@6Vxf2-(m@9V&`>)rpN$I~8V1g9E#h#qMt%U4?&V1}RO7)zT2x}x9P zG1+E~Ws&w+kO00!esUpuSNJBiHw4#^+r$mc#k?|}J>wjX&c1XsVdCk8X?t^y0gnVb z#1v|~yE!ujsI^k*p|^%QU@bS#lA@}@yR~2v1RKiWe+ie~&(4M!h(;7KhK#D@7*(|5HbC|^N=lGDDk(9t{l!R*tA`3b0-Jjs2|tUdHKM+Z z@hkcVhgd5%jvI9yN>Z%74pwF+j+NF3039hfOv{kTRm;>}``|2C_o+(7aN7*(aflV` zdWp>0t!0%f&%(7=^Fv+k6?++WIMFP-eLEcVV$^mKW}=2dpO%-o1W|r)n)Npl;K?>Y z)(EUpbeAKT6G#h;o*(t0L!&Z7p9jPx zV>d3=O?jvwD(#3HmNMFK06Q6T6Hf#+xVi7xRJheBeD5X}q}I-9*O9Z5TaLAm?~kC< z1We_4?WtWG*b|##rcGhf!XSTiJrrapb^lVw^8=xU@c59ANE`1b3Zdk-N?(oEN5^pd zG0T`^cJXC8$Rq`Z{r;=5EVH2bVY%MPzBmh0%#z~s)|LbIQY|g6E!6#_l#t@OLTdZR zoB^ZwWcNM+)2~9D2)nORhbZghj9wp>F^)&(tIV&qZGKB<3q|N@tnsL5&}76BN>qbK zxosRtPkt+ga&aO(bSR`Xl7(EKL^kHyoQUS7OWk0Wk{CS$O&MvGB7m3&E1jEDdnM+h z;Cja`8??}?dA1hm-o$>l^(VtDoqhOT*PJaSMG`-g&t@%PZVl%Qupk)z&;qtpXn156{D;)uXzu zo3X*iu(Se}f;a*ZUwJk#qEsp5ps!U4dYB-R2unwye~)-?sY=6=J|oK>gcef$P5Iz8 zv-~&?Qh}JCFvI8f)3^QK?2*}9y&BM!+;WipLrd}{Qt>pnTk%VBTnL`zd;CtxmI=q* zIVQb$AjKjyz+kFwBRroyCOkgF^#4;`W=_rXf~v^{rEt|O<@FdPPkk8d{I0*h zpCj*KxFS3c-py3jl$86zQHS59U7qEfmLId%(R0!?0g#smN`hMpBrTV~ek=Da$X3?v zyASiSnbHDgI8f>lA@0Rw);7EIcsJ9}k+hL(Q^+iT1RXt#CJcQcIt*WhLr<*&6 tU2oX_qv}M(@Hf+Yo13H{co1Ci8@kXwe_E$Y&SA$Z0b8px#0mmP`xnAUXRH7K literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/icons/apache_pb2_ani.gif b/rubbos/app/httpd-2.0.64/docs/icons/apache_pb2_ani.gif new file mode 100644 index 0000000000000000000000000000000000000000..fc41c03610c1f56d4e2ce3c9750cbe27e5d96886 GIT binary patch literal 2160 zcmY*ac~lek8vSLPNl4fs38BD95LA|eQiRezLqIAX)EpmFz$Zaj$|mvz5f@^>D61Hw z0tOUBfk1+S-~x&SL~C3SM3!QOXpu#$q^Jl_P2Pa#lysIef84qE`|kbbeDjl^ue--q z90ma$VD4B%r@H`6NJvOH(8R^XB_$;Z1cDNvsi>%E*=W$xa;LNNPG3dm(7vIeTEW=b z$uU96B+yK*&70g9K3T%n0J;W*Ye0zxRbkUL0-)(cFSJI6A0+jVXo3#O+Zj1 zNPa}jndq7e@vm z%UKo4E?(^-jvl||cBj)>DrrnGhyny+R!-SPJmufdn#`T0c?8|79Wgxx)B3-yi2rW& z>p}&k{9s#O(5If<;%ARm>6wvjl?Ov5X{)hNHU`(K-v~u>knQMx7DKT>oO7E3a3_?S`)65Tg-T4pZ( z3DN<;pLH?02Mdi9=CInI2=TI8TcEnM%==JQjGA-C(6{OF&_NeI#&@sGE0CM~c-I5w#?rjvV$Cn)}x4_9-eO^a7ghYm?CQv)A7BAVS`Z-{#R)Sz61^o1`wj^qI<=nfK#iyh*|qVvEGBOsiO)ZY|7`j)ulDklXZ)e=@-Y1>4<(x$U0Gcz)^n9- z;0!uQZDfj%f!EKekB!ocZCzPyr6xbf+i_EOnG%wzP0e_Dp3~m(op2X+o2P5eNNE5) z;b-yT4`)-Vxw2Yjk>|S6a$Hr?&8E>B=~Q+*eoM+ktd8zTjQtOW?}MWu6H0R&WEYUA ztm~kD8sBN|vuq-;_6x!2NYVP>JC%Xzx3@PHxUzFu7_0V!0~lJK*{ztH(qy}Ai` z^Pg9WD^D%yST-rMi-;U+nelbT5LC__HttYJ*J~ZYTgIPt`Zh9EJLO&72$(XNd49C> zN?++Nw>ur~bY=+Lzk16Z8J7;=sZJ@@k44D)=2 z!OHDk>D0Ov_s^emds@-3C}vOnnlxSKrl74J8TZGmT{%wu)SI%86OxAN=0B9JmY$CG zKB}=Z&2Pm!@D$pAl1c5B1H5*1%_Y{QtN0Rk$2vo||N2eE!i7Ohx|0PziTHUCQa`6R z9lIaG=@wpo|M>f+7Dq@*E`{vEu-7a2+(!Cfci!~Bj5_pbey6%Hu8Dl^E_g$r+0c2P z0G8pGi(u;~2G&#M0Sl$;bcrv9GUz_A4+ogKJ|l32UKDUFi$mFl-*(%}Xdo`_=L3Ya1-npB~|tkM=t|3B1_0%uEQ21F|4W1Sol|gPS1I#-HQ96|C=h5Q!1S^{rq1F(0%;(a#jEW zfB_C&&SXTm-v$wlXY>4s3-|+o2hcpO6E=0kDopfpcJZPGxEqBD0E^NgrCpAkC|H1c zQE2W21QMb;GEyiUgSF6sc_M_O`iRhmHJfIWSZ-g_yp4ffPMdZJ_ZUJleOyfNHx#z(&2@S$Iz7E`4{xi`G#AItUyU@aig}AF;wB}7)a8 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/rubbos/app/httpd-2.0.64/docs/icons/back.png b/rubbos/app/httpd-2.0.64/docs/icons/back.png new file mode 100644 index 0000000000000000000000000000000000000000..27d4dc7a2ae582c9c161af73e0e3e4d26a1bb53a GIT binary patch literal 316 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DTx4|5ZC|z|DXB)f9A}YX=!Q3 z#>PNl2zc{A@CA^?R1)MD{GZ|Jb^|XUk1@&H-G!lpRn`N@N%C}Y4B@!$+kcw#fB}#5 z-X?Cj1s7P2oVs>9bbgCp8faHmYS7=#w<*J=qKiH5ovBV`^!F`sm#d!lN`jBehsZ vAsfWYa7fK8(E}QxqY#{0P?DOPlv<=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/rubbos/app/httpd-2.0.64/docs/icons/ball.gray.png b/rubbos/app/httpd-2.0.64/docs/icons/ball.gray.png new file mode 100644 index 0000000000000000000000000000000000000000..cac2ce0bc769b4d2914a2c3e55e0c01910e1a887 GIT binary patch literal 317 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DT4r?5ZC|z|DOS(GiP@1-aT{X z%#MzZw6wI)&`@JzW1tdD5OyR*5-7@4666>BpW*3t11}(tG0EHAg`tC0)&t1#_H=O! z;kceG(8A0XG}Ac!(2PlXdBO|NX!;~h6%o~% zeKQ4?J?QB>=Qm^LTx0d5TW;&B6&V;FILc=bP0l+XkK*P&^V literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/icons/ball.red.gif b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/ball.red.png b/rubbos/app/httpd-2.0.64/docs/icons/ball.red.png new file mode 100644 index 0000000000000000000000000000000000000000..9c19b94176016840998837f5cb33eb66fa6cf7e9 GIT binary patch literal 295 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DTx4|5ZC`eFmvXAW8*Xb|EB>3 zVSw`*CnJ!}QWE4B3{=A4ptbS~kk6Rp?e4{W(%6RaG}An zl?wt4rbwPx@q{aJ7MBs%N*3oCU0qsw0m~*#n4~>r<&q~%=~g>ioMs$T)LXaCpg7jK z*)Ui6`d$GBhCe|%rxZ&bcmjEJ%$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/rubbos/app/httpd-2.0.64/docs/icons/binary.png b/rubbos/app/httpd-2.0.64/docs/icons/binary.png new file mode 100644 index 0000000000000000000000000000000000000000..ed0c6608253e5d0377c75d9945749dc38062b11b GIT binary patch literal 316 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DTx4|5ZC|z|DOS(GiPSboM~)q z3>1cdz8zO;fh?wyAiv=M3{STkcma8gN#5=*3>~bp9zaf#r;B3<$MxDiN3I3~9u{$5 z`3dqBA6b`{bH9yk`TIY-Cv!nuiQnN(kxkD+LXR>!ADPOn?^x=q&T4e^(ZZGA-9$j$c-TRx->E(J`Y&NJ*ZM?UxMzQRC&EEMy+rmm*BTAC< zb8}PkN*F>iGK&=wi%JxLRA!z+Nk*zdL1|J>X0k#`er{rBo}PktY8g<%qclAuwOB_X u8^p_SNX;zK0~(>D5S&_2lA4>8TBKlTX=z&a?fo2}4Gf;HelF{r5}E*))^imA literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/icons/binhex.gif b/rubbos/app/httpd-2.0.64/docs/icons/binhex.gif new file mode 100644 index 0000000000000000000000000000000000000000..62d0363108d2585b7574f1eafa0749ae48e15f5b GIT binary patch literal 246 zcmZ?wbhEHb6k!l!IK;s4|Ns9p|NqaNIWsLS&DhwO0R|NR`GsU;7Aqtcl_&tI%shpX zj8uh!(xjZsWQCOc+{Da0Jq7R7GN6P8 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/rubbos/app/httpd-2.0.64/docs/icons/binhex.png b/rubbos/app/httpd-2.0.64/docs/icons/binhex.png new file mode 100644 index 0000000000000000000000000000000000000000..df267fb1992f00f606ac637996a61e8b28bd0519 GIT binary patch literal 325 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DTx4|5ZC|z|DXB)f9A}YX=!Q3 z#>PNl2zc{A@CA^?R1)MD{GZ|Jb^|XUk1@&H-G!lpRn`N@$@X+{4B@z*+INxjfC7(8 zzYzNgHrIldf7&nhi){L@<-6#r6F*b`@j{lX!80T!rIg$+3Y>ELnLP{co`0-Xz$Dz$zw-23{>5{)-0I$ZZ_jW3Hcv(dYXE)}F?;|3 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/icons/blank.png b/rubbos/app/httpd-2.0.64/docs/icons/blank.png new file mode 100644 index 0000000000000000000000000000000000000000..33e6477046d06b58cd58e7dbd853a6284c3f6fdb GIT binary patch literal 220 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0#0(_&>W54PQak}ZA+G=b|3CBpKad9mLQMOP z11YAGAiv=M3{STkcma8gN#5=*3>~bp9zYJCr;B3<$Ms|mR>n3)RmSY;D(#yu&H4+J z2`h1pC`r!G%}vcKVF<~{ELKP?Dp3GZnRyB&8L0{drAaxN$qFg?xrv#1dJ5jDWk3m! z()5hfVjYES5HG_aHM2wyXoQYJaB4wGYHm_$k%FP6rD@r>_j73>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}&TLIXOUtBwPOm`j5Eg8%<#xPFS)5y)js@^*J&=wOxg0CFaK zx;Tb#Tz5UUk@t{+0P6*PMU^+Fc)2T@u7vbBBr8TJC{JM3a1y=rQ%gC8HP7qZH`hO} zUcRnLKQilPbw8(2^1mZ7FD41ky0z<)SMSTOJ{w#@ZrLWx+<7K#=8d-OOkULmh0{B& zLvEe^`zNf<@9*N(E_UCNgW43err-9^Za;C#S>;mtZ2i|pE3XUd9+HT9GI^fqKlTbs zM+2Q}7PUaNWsw3(zNW``#C@x7(8A5 KT-G@yGywqB$&x4l literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/icons/box1.gif b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/box2.gif b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/box2.png b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/broken.gif b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/broken.png b/rubbos/app/httpd-2.0.64/docs/icons/broken.png new file mode 100644 index 0000000000000000000000000000000000000000..44ab15d709bf5fa3f5341b57fda3d499fbbb3f98 GIT binary patch literal 329 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DTx4|5ZC|z|DXB)f9A}Y#>U1# zF*w-HF-s80VJZpo3;xgWbi08UkjI$h?e4*6H|MKXqB;}U=--3bfV^jhcEZNeTZJhgR&y2f&pGrJd?ECy(NIt1( zXUEp_SFapRJlefGQ|HEF_kd)c#f4@%-pkaa7P$udr|sSP`)AVTdD^$0RvfaQ5g;;c z-TAfCfL4ct@0IAG8g_4X^g@V$goXli}l>FSp%sf2> z@6XnDYZz!(9+Vh?A!Y}KpPl5UHx3v IIVCg!0QdlSqyPW_ literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/icons/burst.gif b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/burst.png b/rubbos/app/httpd-2.0.64/docs/icons/burst.png new file mode 100644 index 0000000000000000000000000000000000000000..fd504ee331cd9cf0a886255f33b29011b389a5f4 GIT binary patch literal 344 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DTx4|5ZC`eaK`w||Nk@77}C6lL6aP_=9~n|@l~ zSr4UiD*A4uC5uo9hUYM`8!!i_aF4Xx5#~) zMqJd@=X<*j*UP`^-od!YT%{@`wOs?~kgyWhh?3;|+}zZ>5{8hB%wmPaq7nrlm6@kd zl98%VP@0sJnXHhKpPQJOr>EeZS_YKxC{52uE!I)U2Jtc+QZq~RfJW#j1g931q~<22 a7AY87TAG%9dp`$g1B0ilpUXO@geCwuj(dy% literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/icons/c.gif b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/c.png b/rubbos/app/httpd-2.0.64/docs/icons/c.png new file mode 100644 index 0000000000000000000000000000000000000000..a1fef3e3b41052a1646558216a4ee5818d914aa9 GIT binary patch literal 308 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DTx4|5ZC|z|DXB)f9A}Y#>U1# zF*w-HF-s80VJZpo3;xgWbi08UkjI$h?e44m9jEKEtCvC1{ew?3kpTk)DBDcXYgZr|+5f>fXhw zEeG0PY!tYXceSMd`X`3}TTkAc_hRy~j@Vfz#bZuR4hQgf41ixdnkEltb5y`KZLfx*+&&t;ucLK6TtZE%CMz{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/rubbos/app/httpd-2.0.64/docs/icons/comp.blue.png b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/comp.gray.gif b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/comp.gray.png b/rubbos/app/httpd-2.0.64/docs/icons/comp.gray.png new file mode 100644 index 0000000000000000000000000000000000000000..8f620bddc2087d00b58793a89f8728221347129f GIT binary patch literal 324 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DTx4|5ZC|z|DXB)f9A}YX=nZ$ z8yf?KA>gsa)f^y;sU*lR_&>wb?FL>z9%GWXy9+}HtE>l*ljZ5+7{YPA^lTtkg91;( z!^BDk$NS1(SjrlDVjV92j$fJ^C3xlk7sF$0&-nh`*m0)hK<2_{EB%~03Z>`B9rIVZ zdb3|p_f&V+k*&{-Bl`FLnbjsxF*BnpCg5yCG+!RSx=^^_HF>nQKM z3A8n=#5JNMIX^cyHLrvrBqOs}A+e}L0Z3)$DU@WSDio9^FVdQ&MBb@ E09xjB*#H0l literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/icons/compressed.gif b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/compressed.png b/rubbos/app/httpd-2.0.64/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)G1T8PNl2zc{A@CA^?R1)MD{GZ|Jb^|XUk1@&H-G!lpRn`N@3GsAs4B@!G_S{C^1_J@- zKyB%WQ(s>Ms5wX~2=NrSZ~CvbBdKXe<$jYN{L)1e#Y7DF(-u1{x*6!C(0$2SVejnu ziXUP&@2lmwV*0~}>x0_s1qaSemVYiO?l7nR_YR=>VI{5+CCT}@xv6<23?Uhr#R`c< zB?>?)Gf$x;BUPcGG$|)DSs^7qH!(9$Pr*C23@G7Inx2tbtfP<(;$=9bW|rsyjnGjD hPAw=&%}q)zQZTf%G%fq~eh$zE22WQ%mvv4FO#rYIXIlUO literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/icons/dir.gif b/rubbos/app/httpd-2.0.64/docs/icons/dir.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/rubbos/app/httpd-2.0.64/docs/icons/dir.png b/rubbos/app/httpd-2.0.64/docs/icons/dir.png new file mode 100644 index 0000000000000000000000000000000000000000..971ac3f4b491e9b463b7e97e843548375093f295 GIT binary patch literal 301 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DTx4|5ZC`eaAxM2|Nm#E83O@O z7y|T+mOlfsm`j5Eg8%<#xPFS)5y)js@^*J&=wOxg0CIvnT^vI=t|tdHF|!>y6QIyw z5X#!9z;T9$#n9E+xp|62lcSHb0>4HU4~xUR0s$9B0g2s*W*%A>A|~3#6wVf!%wbTN z8o*W9*dV~BdNqKffQg}wLE)(0KRFek>0u?V5hcm_xw)x%B@7`MnZ*i;MI{PADl<=^ zBqLR!pfo8bGg%=eKQ}QmPfx)+wG1fXQJS8STCAgx4dP`uq-K`r0gcd62u>|1NzF}4 aEmAPFv@|XI_I?h~1_n=8KbLh*2~7Y;lv+^$ literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/icons/diskimg.gif b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/diskimg.png b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/down.gif b/rubbos/app/httpd-2.0.64/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+W54PQak}ZA+G=b|3CBpKad9mLQMOP z11YAGAiv=M3{STkcma8gN#5=*3>~bp9zc$Tr;B3<$Ms|mRz|j@6Kg_OhpkQNV4CDD zd8pw@NLzpc=ajQiTZKH_)<$uu91inkT^Y}MZK~&-lMH1x+AqzW*6#$G5mw?FQIedW zo12?S*(y)RH6W+GV>HlGEx-^N|SOjlND0(a}zW3^c1{P%YYIdrRf=|#X1Vv uAYO(;YG#QZ&XnDYZz! 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/rubbos/app/httpd-2.0.64/docs/icons/dvi.png b/rubbos/app/httpd-2.0.64/docs/icons/dvi.png new file mode 100644 index 0000000000000000000000000000000000000000..e77b282100ba3fa52140d88b271727264e7609d5 GIT binary patch literal 314 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DTx4|5ZC|z|DXB)f9A}Y#>U1# zF*w-HF-s80VJZpo3;xgWbi08UkjI$h?e4m%Z0^- zjcXM67QA3sn(}{UmD;6gK`&};`-5G+n}oWuDnBxDyO7rI=MwBGy=jNv7 zl`w>4WELwV7L_Ofsmwful8jV^g3_d%%w&a>{M^LMJUs>P)H0xiM`?OSYO#(&Hi(zu rkeXSd2Q)%QAvm?5BsDiFwMfCx($ci-+xs~{8yGxY{an^LB{Ts5T6t== literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/icons/f.gif b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/f.png b/rubbos/app/httpd-2.0.64/docs/icons/f.png new file mode 100644 index 0000000000000000000000000000000000000000..876e1c9c64072999de61734ea029af72d837dd51 GIT binary patch literal 305 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DTx4|5ZC|z|DXB)f9A}Y#>U1# zF*w-HF-s80VJZpo3;xgWbi08UkjI$h?e4=IEHXsUwUpM?*RoKmIL8u znBo`>9RzqL9Qu8JiaFa(kD2THrl1;VI{5+CCT}@xv6<23?Uhr#R`c< zB?>?)Gf$x;BUPcGG$|)DSs^7qH!(9$Pr*C23@G7Inx2tbtfP<(;$=9bW|rsyjnGjD hPAw=&%}q)zQZTf%G%fq~eh$zE22WQ%mvv4FO#o2!Wc&aC literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/icons/folder.gif b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/folder.open.gif b/rubbos/app/httpd-2.0.64/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;}&^0Kw1W8{Ppa=8_=4;Q#*_uAky{1acXZyxmp64?ja}#B<8N_j^S4bY6<*OLKeEw&(NG zm>Duvj8iKYFJ=7UeWO8&LE{jQRQ;)kW|3CKQ$Kyunz<}x)})SQPdfR0ull#`_A2O; z4_w4-ck8Xi;$Jr{8-ezRmAFQfBy6QIyw z5X#!9z;T9$#n9E+xp|62lcSHb0>4HU4~xUR0s$9B0g2s*W*%A>A|~3#6wVf!%wbTN z8o*W9*dV~BdNqKffQg}wLE)(0KRFek>0u?V5hcm_xw)x%B@7`MnZ*i;MI{PADl<=^ zBqLR!pfo8bGg%=eKQ}QmPfx)+wG1fXQJS8STCAgx4dP`uq-K`r0gcd62u>|1NzF}4 aEmAPFv@|XI_I?h~1_n=8KbLh*2~7Y;lv+^$ literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/icons/folder.sec.gif b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/forward.gif b/rubbos/app/httpd-2.0.64/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 ILPNl2zc{A@CA^?R1)MD{GZ|Jb^|XUk1@&H-G!lpRn`N@N$_-W4B@!$+Ix|=!GOah z^5Gip884LD_#7U+-QOjkvA6%(*Fr`|_eU24D^~66^gC@el{YeM`_^2^r*}@jw|dQT zG9zjc|A9jtj?a=#T#h>C#Px350mIeOrynPG$}PHRR#le}sBW?S-JjV&yTVFbBTAC< zb8}PkN*F>iGK&=wi%JxLRA!z+Nk*zdL1|J>X0k#`er{rBo}PktY8g<%qclAuwOB_X u8^p_SNX;zK0~(>D5S&_2lA4>8TBKlTX=z&a?fo2}4Gf;HelF{r5}E)EfpWV5 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/icons/generic.gif b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/generic.png b/rubbos/app/httpd-2.0.64/docs/icons/generic.png new file mode 100644 index 0000000000000000000000000000000000000000..2c75bde9a166aebf0dde88a64658194fb1ac8ecf GIT binary patch literal 284 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DTx4|5ZC|z|DXB)f9A}Y#>U1# zF*w-HF-s80VJZpo3;xgWbi08UkjI$h?e4EIff%WAGPNs%Fk&;FxM}|~R zzL1?;ANl}I3oCJrC`r!G%}vcKVF<~{ELKP?Dp3GZnRyB&8L0{drAaxN$qFg?xrv#1 zdJ5jDWk3m!()5hfVjYES5HG_aHM2wyXoQYJaB4wGYHm_$k%FP6rD@r>_j7vky)&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/rubbos/app/httpd-2.0.64/docs/icons/generic.red.png b/rubbos/app/httpd-2.0.64/docs/icons/generic.red.png new file mode 100644 index 0000000000000000000000000000000000000000..2fcb057c7bd15e07e04e8e7b7febf3fabb8a82d5 GIT binary patch literal 286 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DTx4|5ZC`eFmvYrw6rt-|EDo9 z7#kY{Wq_bTO40^~C$dAqwXbg;^L069*cE{-7_*OLnvnbVV# zliAc&6#@hu4Or(2`UtWJYw#ql+PQP*!5NvEnE}ftb#eQIcye~GbSYoPEz%-sEV10N z(U4*GBu(i_8QWI^O$#e=jVMXZ&&^HED`5!9$ShV!EGkg|Qki)QB^jv-1*J(jnaK(% z`MHUid3p-osbxS3kJ9vv)M6clY!ENQAvLo^4`_srLU3w9NosCVYLSAWrKM@vxA${^ PHZXX)`njxgN@xNA`n_22 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/icons/generic.sec.gif b/rubbos/app/httpd-2.0.64/docs/icons/generic.sec.gif new file mode 100644 index 0000000000000000000000000000000000000000..88d5240c3c3ee7aba7e51be6e49516277cd2c024 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(3b0VTHIq;y*eT9 pbHuxO``>OATea-a%QUllYxjTS@>KR}wi0z>>0oj07UpEI1^}8@T=4(^ literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/icons/generic.sec.png b/rubbos/app/httpd-2.0.64/docs/icons/generic.sec.png new file mode 100644 index 0000000000000000000000000000000000000000..229ddbfe1ed56f42cbc6f50a6434503a4a704e22 GIT binary patch literal 298 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DTx4|5ZC`eU~GKm|NogYXQnYQ z7#kY{Wq`oQW;;kTb4ie2@c;h|*H7^}0=bMy-tI089jvk*K#sqsi(?4K^<)lSQIQf} z-k_kMB#s0Dk&=W|R|Cl=0iQ4yVGW+dO|7l12WMnvW(KG+Z{8@`bF$$`$^vWSD-i(~ zZr->d@xo*277_97CKHqyPhXYYwb#{65omN+iEBhja(-@ZYF-ILNJeI{LSj*g0+7ng zQz*$uRVXM;%E?StNXgGl%*@kM@J=lQN_do}XQUSEC}e|p84jtLC3-+3bQFS93rbRR clTwQm3@t59%f7vz1GIs`)78&qol`;+0I+voH2?qr literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/icons/hand.right.gif b/rubbos/app/httpd-2.0.64/docs/icons/hand.right.gif new file mode 100644 index 0000000000000000000000000000000000000000..5cdbc7206da8856227e36b9d8f1fe5668e162607 GIT binary patch literal 217 zcmZ?wbhEHb6k!l!IK;s49|+FOJoEqm%rs*LB%t`uFC-(gSRt{fL;*-;<|&k9q$(7Y zCgo%%E2QM-CT8a8DR`%r0VO<2(=$?wbriBeybOob%o4ri{9GM{;M9VW)ZC=hA_YTB zOH&5LpDc_F3``6 z1P@2d%A8Z(d*Iop;+0_slQ(LVa73?qy!_*&UOA1|IbCl>b_(7P3tlzje1;bjgEav1 C5>Ye& literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/icons/hand.right.png b/rubbos/app/httpd-2.0.64/docs/icons/hand.right.png new file mode 100644 index 0000000000000000000000000000000000000000..88efd6f8880a14bb2a189ec808200f5bad054b9d GIT binary patch literal 322 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DTx4|5ZC`eaAxM2|Nm#E83V=O zp#EgI36R5F666>B|3Aa^Q@oBqE@P6ny9+}HtE>l*lkVx_7{YPAxBs-@0R;}1%tUsr zf=dm}ycsX{FVlHad{Xh_fjt+GH(i>iY;T~XcZXrkp%I*1zk#mZ&PQ z@Tx|d^#xnOdydM7dumrHPjp;?)Gf$x;BUPcGG$|)DSs^7qH!(9$Pr*C23@G7Inx2tb xtfP<(;$=9bW|rsyjnGjDPAw=&%}q)zQZTf%G%fq~eh$zE22WQ%mvv4FO#raza>oDw literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/icons/hand.up.gif b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/icon.sheet.png b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/image1.gif b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/image1.png b/rubbos/app/httpd-2.0.64/docs/icons/image1.png new file mode 100644 index 0000000000000000000000000000000000000000..c56991b4dbc00f1c9640c9bcf8edc6bfce24f4fa GIT binary patch literal 347 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DT4r?5ZC`eaK`w5TG|;Pedf$e zAV^~{HZ}&zV+FIMp6&rku#^P(1p~D*IB2c>0^~C$dAqwXbg;^L06FQNE{-7_*K5xy z@--Onv_4edI3rc6b^Xkz0^Bl;or((P5}y6O&XI+GUU^?OVa==&3R(ENw|!$p^0!iR zo^v;h_UgRViCH}5uc?rj$D2zbCk>YM2dH`8e6aFU{i!0+GM}BUxzo@8=*?r9WT|1NzF}4EmAPFv@|XI_I?h~1_n=8KbLh* G2~7YNT6o(4 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/icons/image2.gif b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/image2.png b/rubbos/app/httpd-2.0.64/docs/icons/image2.png new file mode 100644 index 0000000000000000000000000000000000000000..532432c9f45dc31b04807a505f63ec88c69ee6c5 GIT binary patch literal 383 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DT4r?5ZC`eU~GKm|Nk>*&di)S zGYtqB7>tdL8D^egm}$&l4CJ8z&!2T`fdb4WL4Lvi|1(@a#p?*~PNLcK zx$cwp|FXE+=v{iIM{Jg%_Qka(6R+Jm%4j4Pj!W&1uJWXdQYrBzht{jo6nqBdtnouJvvJ~wX=O*&YCmtNx&of2a#6Z{FU3H zf$j<`ag8WR&d<$F%`0ID$;d2LNGvK*08*KG3MCn-3I(M}Ihn}{DfzjHnR$8&-l=6k z36IkBjMQQsg=`Qn!yz@ZL=R|$jzVy1K}l+EQfiTcp{1p1*|+y|fHp9Ay85}Sb4q9e E08#vlg8%>k literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/icons/image3.gif b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/image3.png b/rubbos/app/httpd-2.0.64/docs/icons/image3.png new file mode 100644 index 0000000000000000000000000000000000000000..903732455cdf5740564ee14f034be0909c50ca85 GIT binary patch literal 356 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DT4r?5ZC`eU~GKm|NogYXQnYQ z7#kZi%sj&|)0n{+$io62H9da`6lN|7@(cd|pW*r`UPmC8G0EHAg`tC0)&s~X^mK6y z;kcf9&XBJ`fyd#Zo=n5Vt>FnpCXf6)IueVM%92x!;u>#9d4~%9|8i+brecAd;6cWv zSKL3yi(Zb}&CuI9`I>Xj$HcW$JN^ZyM_7Ltm1b&xHV^Po1q>m)juWZxUa|5 z`?pRfM14^SR4hQgf41ixdnk WEltb5y`KZLfx*+&&t;ucLK6UpQhM9~ literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/icons/index.gif b/rubbos/app/httpd-2.0.64/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-g4rU9gsa)f^y;sU*lR_&>wb?FL>z9%GWXy9+}HtE>l*Q{n027{YNq^xQ?>76Xok z#79>dZ#-x!Ykb7;YAUN<>i|1nMJie!A zYSlN-EA>B^?H%QfJb6_<0o@Q*;u=wsoS&PUnpeUQl95@gkXTfr0HiYW6iPBu6$(m| zax#+@Qu1>XGxPKmyi?175+0@L8L7oO3fUlDhC^y*i5}1h9fjc3f|AtSq|_n>LrY83 UvTyI_0BvCKboFyt=akR{02;)6r2qf` literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/icons/layout.gif b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/layout.png b/rubbos/app/httpd-2.0.64/docs/icons/layout.png new file mode 100644 index 0000000000000000000000000000000000000000..8f3bbd25c5eb9c5027a768af71cbaecb0408da2e GIT binary patch literal 344 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DT4r?5ZC`eaK`w*vGJMz|7QY0 znsM40AkP>mj}=Uwa8C^=!BP_B7Yx+O;Gnhg3y{y4JDV#4EjHg_Woqa%dDp;{%uueQKiMYt=RTl) zVI{5+CCT}@xv6<23?Uhr#R`c?)Gf$x;BUPcGG$|)DSs^7qH!(9$Pr*C23@G7I znx2tbtfP<(;$=9bW|rsyjnGjDPAw=&%}q)zQZTf%G%fq~eh$zE22WQ%mvv4FO#r7# BZbAS6 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/icons/left.gif b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/left.png b/rubbos/app/httpd-2.0.64/docs/icons/left.png new file mode 100644 index 0000000000000000000000000000000000000000..fa19fd66f065175f76e7e7b2466623e0bb68f5c1 GIT binary patch literal 260 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0#0(_&>W54PQak}ZA+G=b|3CBpKad9mLQMOP z11YAGAiv=M3{STkcma8gN#5=*3>~bp9zc$nr;B3<$Ms|mRz^09nOthqn@$)QNV2MJ zKJY|KK$1;u@qrXEA<0%1?m*6~qOB=XM^aYk8dNj380+kQ{{QP!pb23mt`Q~4`MJ5N zc_j=X8JWcjiA5y}Kq@m&p(G@q literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/icons/link.gif b/rubbos/app/httpd-2.0.64/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~oHDDMmIS(lC zv_0gHstzk?TBGnKXCbqQqkF-BL89s~?`{sP!B__UCuDe?|jZe95(yN|2g%{GN=FLcZ2ed7$#5JNM zIX^cyHLrvrBqOs}A+e}L0Z3)$DU@WSDio9^FVdQ&MBb@05+UzQUCw| literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/icons/movie.gif b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/movie.png b/rubbos/app/httpd-2.0.64/docs/icons/movie.png new file mode 100644 index 0000000000000000000000000000000000000000..bb9c9e4d59f1f4396c1e629556e1c1ba28bfdc32 GIT binary patch literal 275 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DTx4|5ZC|z|DOS(GiPSboSBxE zW^8N>lmUXD2QT>oDW;Mjzu^B2Pq!O*0eOr`-tI089jvk*K#rxSi(?4K^<3c1XTSjlmH^f-Tba&@@U}8JGNjHlc`5Sf ziY3sHuoBmZlH~l{+|;}hhLDWRVui$_5(OZYnWs>ak*ZKonv|27tdNqQo0yrWr{JAh z29)q9P0vUz)=|g?@iH7zGfVVnwEWgKL=<7gQu&X%Q~lo FCIEG3SL^@) literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/icons/p.gif b/rubbos/app/httpd-2.0.64/docs/icons/p.gif new file mode 100644 index 0000000000000000000000000000000000000000..7b917b4e91e8004d40241f2c031016f3cb414caa GIT binary patch literal 237 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|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/rubbos/app/httpd-2.0.64/docs/icons/p.png b/rubbos/app/httpd-2.0.64/docs/icons/p.png new file mode 100644 index 0000000000000000000000000000000000000000..99bca2c851a34635d8afcd47ab4aaec47c96b110 GIT binary patch literal 307 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DTx4|5ZC|z|DXB)f9A}Y#>U1# zF*w-HF-s80VJZpo3;xgWbi08UkjI$h?e4vky)&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/rubbos/app/httpd-2.0.64/docs/icons/patch.png b/rubbos/app/httpd-2.0.64/docs/icons/patch.png new file mode 100644 index 0000000000000000000000000000000000000000..a1a7abd8fe554947b696d429578f99f5e2d46a45 GIT binary patch literal 313 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DTx4|5ZC`ekd}7l|NogYXQnYQ z7#kY{Wq@FfhuJEal|aee8zjl2y8 zJT4cVExvfnJfQ8eXjuY-h^FMh-~9(v`M7NNR~02nFP$DLY97Hc`NZVJNy*Q{vTHNb znj)KGF*?!soGXI&f@V)Ng}zWVR1%gWxLek{4=A@8dtz4KPGfF#hSuoBmZlH~l{ z+|;}hhLDWRVui$_5(OZYnWs>ak*ZKonv|27tdNqQo0yrWr{JAh29)q9P0vUz)=|g? t@iH7zGfVVnwEWgKL=<7gQu&X%Q~loCID6zYN!AJ literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/icons/pdf.gif b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/pdf.png b/rubbos/app/httpd-2.0.64/docs/icons/pdf.png new file mode 100644 index 0000000000000000000000000000000000000000..dd478cc52e45b5476b215c245dcda6d2062fe393 GIT binary patch literal 313 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DTx4|5ZC|z|DXB)f9A}Y#>U1# zF*w-HF-s80VJZpo3;xgWbi08UkjI$h?e4qYm{ z#x)9j0T&s&_WVuH>RG6{^!saxo{l_I!GoN-s>)ki#C*yc171~3Jd@mW^wi9+FZ3U1 zT)o~Pp2#A1Y|Es}op;N1J8J$KUTfO>=F4O!|GYESQXVmTrLBQhg_XEQlqBcp=BDPA zFoa}e7Aqtcl_&tI%shpXj8uh!(xjZsWQCOc+{Da0Jq7R7GN6PNWsw3(zNW``#C@x7(8A5T-G@yGywqC3~iVI literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/icons/pie0.gif b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/pie0.png b/rubbos/app/httpd-2.0.64/docs/icons/pie0.png new file mode 100644 index 0000000000000000000000000000000000000000..0418fd5eef1527cef14e757220b522a000f9249f GIT binary patch literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0#0(_&>W54PQak}ZA+G=b|3CBpKad9mLQMOP z11YAGAiv=M3{STkcma8gN#5=*3>~bp9zc$Tr;B3<$Ms|mRz|itDL1qPW**!i;$db` z&}P(PXkgH4pGwBJm`?D?Sr`GI)qe9yhqZZVu3luoBmZlH~l{ z+|;}hhLDWRVui$_5(OZYnWs>ak*ZKonv|27tdNqQo0yrWr{JAh29)q9P0vUz)=|g? s@iH7zGfVVnwEWg53+&5)78&qol`;+07I2fCIA2c literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/icons/pie1.gif b/rubbos/app/httpd-2.0.64/docs/icons/pie1.gif new file mode 100644 index 0000000000000000000000000000000000000000..03aa6be71eb2efded05e937f1ad79549ca2d56bd 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`4OaPFr@>FpEKG8&zNm_A7^cehR7 q{3odT-{ZSYE(_O7ykRZyxV`aZjoH-0n$0tdUlfJ#w+AvXSOWl+b4fP< literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/icons/pie1.png b/rubbos/app/httpd-2.0.64/docs/icons/pie1.png new file mode 100644 index 0000000000000000000000000000000000000000..9ec6d610e12cc60f3c2e3061e447775ccd2b7681 GIT binary patch literal 282 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0#0(_&>W54PQak}ZA+G=b|3CBpKad9mLQMOP z11YAGAiv=M3{STkcma8gN#5=*3>~bp9zc$dr;B3<$Ms|mRz|itDL1qPW-i<+;$fDt zmM4`X`9hS)DS?9vt{RBC82O}nBwR=cV4cL3Fp06Zhhb9i!W0Q+X5kYuY}AMC$n&g#HDJWxnU))5hcm_xw)x%B@7`MnZ*i;MI{PADl<=^BqLR!pfo8bGg%=e zKQ}QmPfx)+wG1fXQJS8STCAgx4dP`uq-K`r0gcd62u>|1NzF}4EmAPFv@|XI_I?h~ O1_n=8KbLh*2~7YfKUY@( literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/icons/pie2.gif b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/pie2.png b/rubbos/app/httpd-2.0.64/docs/icons/pie2.png new file mode 100644 index 0000000000000000000000000000000000000000..b74fc71958260d3d73181ccb3121f26e18a8584c GIT binary patch literal 275 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0#0(_&>W54PQak}ZA+G=b|3CBpKad9mLQMOP z11YAGAiv=M3{STkcma8gN#5=*3>~bp9zc$(r;B3<$Ms|mRz|itDL1qPW-i<+;$fDt zmM4`X`9hTFDFH^6vw+Q8uH>gTe~ HDWM4f*CACg literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/icons/pie3.gif b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/pie3.png b/rubbos/app/httpd-2.0.64/docs/icons/pie3.png new file mode 100644 index 0000000000000000000000000000000000000000..cad281a228053840f63b0c283064be9c44eb85ba GIT binary patch literal 279 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0#0(_&>W54PQak}ZA+G=b|3CBpKad9mLQMOP z11YAGAiv=M3{STkcma8gN#5=*3>~bp9zc$#r;B3<$Ms|mRz|itDL1qPW-i<+;$fDt zmM4`X`9hTFDFH^6-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/rubbos/app/httpd-2.0.64/docs/icons/pie4.png b/rubbos/app/httpd-2.0.64/docs/icons/pie4.png new file mode 100644 index 0000000000000000000000000000000000000000..e6d01d2d01bdf41abe184915a573a6c275785bf7 GIT binary patch literal 261 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0#0(_&>W54PQak}ZA+G=b|3CBpKad9mLQMOP z11YAGAiv=M3{STkcma8gN#5=*3>~bp9zc${r;B3<$Ms|mRz|itDL1qPW-i<+;$fDt zmM4`X`9hTFDFH^6GaR^l2_lANEL zo0?a`5R#EutdLk#q5z~a^At)lQWXkHlX5bX6;kqZ6EpMl6ueW*fD#_1=^3fTIttk! tUWP+zW{Doq2pxss)Pj=K+@#bZ1w%_q)3R^x=KyVB@O1TaS?83{1OSu$Q1$=- literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/icons/pie5.gif b/rubbos/app/httpd-2.0.64/docs/icons/pie5.gif new file mode 100644 index 0000000000000000000000000000000000000000..57aee93f0707a6fea58637c351c4ac1dae6459cf GIT binary patch literal 189 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+}_Yzw-23{>3JXu0=3z*v`4OaPFtZ*%}klI+l54ZqwVk=`G`N gqqzCzdnff4?UOy9X2YesW54PQak}ZA+G=b|3CBpKad9mLQMOP z11YAGAiv=M3{STkcma8gN#5=*3>~bp9zc$lr;B3<$Mw=P8+jWXc$g1#ObXo8zgS;W zFn9xt@{$9=`*dqtTe?^0u+RCiHRF6v<@4?p9!hOB)7szkZ<#G?eb*;?$u@nLP{co`0-Xz+~Cezw-23{>3JXu0=3z*v`4OaPFtZ*%}klI+l54ZqwVk=`G`N dBfa+_^}iWi*Dq8}v{CBqS-80Up#c|zH2^QW54PQak}ZA+G=b|3CBpKad9mLQMOP z11YAGAiv=M3{STkcma8gN#5=*3>~bp9zc$pr;B3<$Ms|mRz|itDL1qPW-i<+;$fDt zmM4`X`9hTFDFH^6b#r4pxiY|r$Ajr?zl>|EmIi!g{2!%1 z@qK}fJr>mdK II;Vst02x_Vd;kCd literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/icons/pie7.gif b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/pie7.png b/rubbos/app/httpd-2.0.64/docs/icons/pie7.png new file mode 100644 index 0000000000000000000000000000000000000000..242957ea6823db7e14ce8103eb6682a36e2b9e0b GIT binary patch literal 278 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0#0(_&>W54PQak}ZA+G=b|3CBpKad9mLQMOP z11YAGAiv=M3{STkcma8gN#5=*3>~bp9zc$Vr;B3<$Mw=P8+i{H@Gv``JzTrQNtk8c zA@3dj$_fvsEM%B|PCR^HW%_=$+uW+^aocAsh`#q=Q_U^M4J!T1Vs20PHR0Efgt!0M zf5sZSzHN;&2bvjH;u=wsoS&PUnpeUQl95@gkXTfr0HiYW6iPBu6$(m|ax#+@Qu1>X zGxPKmyi?175+0@L8L7oO3fUlDhC^y*i5}1h9fjc3f|AtSq|_n>LrY83vTyI_0BvCK MboFyt=akR{0NW{H4*&oF literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/icons/pie8.gif b/rubbos/app/httpd-2.0.64/docs/icons/pie8.gif new file mode 100644 index 0000000000000000000000000000000000000000..59ddb34ce0f42f40fc010aa2bcf059d891fccadf GIT binary patch literal 173 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@*dDzw-23{>3JXu4R1A-L;ud>%okkhl!IyUaie(+qXfR+ave> Q)*p2%lMkH{VP&ue01>A?od5s; literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/icons/pie8.png b/rubbos/app/httpd-2.0.64/docs/icons/pie8.png new file mode 100644 index 0000000000000000000000000000000000000000..c5f2d0d58b26475b86aea4c3f13cfe778ae0e310 GIT binary patch literal 262 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0#0(_&>W54PQak}ZA+G=b|3CBpKad9mLQMOP z11YAGAiv=M3{STkcma8gN#5=*3>~bp9zc$Tr;B3<$Ms|mRz|itDL1qPW^T>WoDj1$ zD^5{8hB%wmPaq7nrlm6@kdl98%VP@0sJnXHhKpPQJOr>EeZS_YKxC{52uE!I)U u2Jtc+QZq~RfJW#j1g931q~<227AY87TAG%9dp`$g1B0ilpUXO@geCwmHB*oP literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/icons/portal.gif b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/ps.gif b/rubbos/app/httpd-2.0.64/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# zF*w-HF-s80VJZpo3;xgWbi08UkjI$h?e46TGNoH(jrZ0oE4pl1vr0?PWvPm!=#_p|@s5NZbvky)&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{}oXN25SJW54PQak}ZA+G=b|3CBpKad9mLQMOP z11YAGAiv=M3{STkcma8gN#5=*3>~bp9zc$NWsw3(zNW``#C@x7(8A5T-G@yGywp`=uVFS literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/icons/screw1.gif b/rubbos/app/httpd-2.0.64/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_lC21cdz8zO;fh?wyAiv=M3{STkcma8gN#5=*3>~bp9zafsr;B3<$Mw*2hFnJ!1X>@q zpO!nI^w%g(;lq~c8NX6a-ubU3D9ikFb^ZfU=Kn3`q3Ys0E?0CcIe66bf#nZ=pJQ|P zSaIuLEpzSf$zOZCePyueo{?ItqmT{aWjLf}mgoVE&`}6ZEhtINO-e0NFtoHZE&KL<4$uY$ MPgg&ebxsLQ05A7?c>n+a literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/icons/screw2.gif b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/screw2.png b/rubbos/app/httpd-2.0.64/docs/icons/screw2.png new file mode 100644 index 0000000000000000000000000000000000000000..3f4c5a28527ff1a5ae5c6c23e26e415d503508bf GIT binary patch literal 339 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DTx4|5ZC|z|DOS(GiPSboM~)q z3>1cdz8zO;fh?wyAiv=M3{STkcma8gN#5=*3>~bp9zaf|r;B3<$930phJ1$=cv=&+ zo0tolPvw@WOy4{4Odr$xf8i^Ig+Kbwzn^kxxAIaK`%O*}OOg$BZsqi3Y`j*r@uD1~ z#N%V{^@4hOBfErkn4Z4~T4fw|W2*k80O^-%1}fI<^{sPa?JGZtEIldv{BUnPzwP3# zbbqxom*iJ9D6(z2IC%-s5n&~+5hcm_xw)x%B@7`MnZ*i;MI{PADl<=^BqLR!pfo8b zGg%=eKQ}QmPfx)+wG1fXQJS8STCAgx4dP`uq-K`r0gcd62u>|1NzF}4EmAPFv@|XI S_I?h~1_n=8KbLh*2~7YVFnWdn literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/icons/script.gif b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/script.png b/rubbos/app/httpd-2.0.64/docs/icons/script.png new file mode 100644 index 0000000000000000000000000000000000000000..8064d073d0edccac77dff8d3b7ced395aa02a1aa GIT binary patch literal 299 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DTx4|5ZC|z|DXB)f9A}Y#>U1# zF*w-HF-s80VJZpo3;xgWbi08UkjI$h?e4-Z z9K{$$&W#N6-{LP<1`52JTiMIZog^=2oP0=8>!{Y!#jDoMGu$n?t0U#>!Kno$skuq1 aMGA(NmZoLj-p>Krz~JfX=d#Wzp$P!oo?)c` literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/icons/small/back.gif b/rubbos/app/httpd-2.0.64/docs/icons/small/back.gif new file mode 100644 index 0000000000000000000000000000000000000000..e331454726bbc19cdcdd3867ffcae217a0fde8f6 GIT binary patch literal 129 zcmZ?wbhEHb6krfwSoEJkQBl#*&@d`0s->l+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/rubbos/app/httpd-2.0.64/docs/icons/small/back.png b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/small/binary.gif b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/small/binary.png b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/small/binhex.gif b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/small/blank.gif b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/small/broken.gif b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/small/broken.png b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/small/burst.png b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/small/comp1.gif b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/small/comp1.png b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/small/comp2.gif b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/small/comp2.png b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/small/compressed.gif b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/small/compressed.png b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/small/continued.png b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/small/dir.gif b/rubbos/app/httpd-2.0.64/docs/icons/small/dir.gif new file mode 100644 index 0000000000000000000000000000000000000000..7b37b099177d12b3f6ee7056c03d992b09e7fee1 GIT binary patch literal 132 zcmZ?wbhEHb6krfwSoELa|Gl;U@2op;;J}Urwc*~@+N!b)V4(Pug^_`Qi9rX%1F2&GNR2Uen0VOOkQ~&?~ literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/icons/small/dir.png b/rubbos/app/httpd-2.0.64/docs/icons/small/dir.png new file mode 100644 index 0000000000000000000000000000000000000000..9bd6256bdbb781ad96d26b02870c8dabb1622f5f GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPE^4e$wZJ#gT_|2ymc-&?z5L2bCV zwYI7(P$v7ROxnB?v5!j_n}qZY{V@N{tuskoJUY@=v{0SD`W_*6!7548*XJ9zi% zGyU#Q;FuCu+Mq0HYu{RTEKU4Vh0?||QA_tvUAX_^>Py$klAL*~Lv|O7nuyn2n47&`btTS3j3^P6t>yewCRwrrVbz0%P@q&p!pQbR!HK;_&hjwjs0n_k|_ba-tRk+K#r}ai(^Q|t>gp+CIe|{=?xYPl4^Q-=h_Z2^6;EG zc1*3$Xu1{p00i_>zopr E0QN;PK>z>% literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/icons/small/doc.gif b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/small/doc.png b/rubbos/app/httpd-2.0.64/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*aVex7zyD%`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/rubbos/app/httpd-2.0.64/docs/icons/small/generic.gif b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/small/generic2.gif b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/small/generic3.png b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/small/image.gif b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/small/image.png b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/small/key.png b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/small/movie.gif b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/small/movie.png b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/small/patch.gif b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/small/ps.gif b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/small/ps.png b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/small/rainbow.gif b/rubbos/app/httpd-2.0.64/docs/icons/small/rainbow.gif new file mode 100644 index 0000000000000000000000000000000000000000..8216b89bade87b795a7345329da487735f3e07eb GIT binary patch literal 3811 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 YQf)BD<7dvMP-NGBf&PAQ3ILe=54mLULI3~& literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/icons/small/rainbow.png b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/small/sound.png b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/small/sound2.gif b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/small/sound2.png b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/small/tar.gif b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/small/tar.png b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/small/transfer.gif b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/small/uu.gif b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/sound1.gif b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/sound1.png b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/sound2.gif b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/sound2.png b/rubbos/app/httpd-2.0.64/docs/icons/sound2.png new file mode 100644 index 0000000000000000000000000000000000000000..0b11d761706477c3cc2a3ffadedb0059e758f02d GIT binary patch literal 319 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DTx4|5ZC|z|DOS(GiPSboSBxE zW^8N>lmUXD2QT>oDW;Mjzu^B2Pq!O*0eOr`-tI089jvk*Ku)Tsi(?4K_0aQ%d<_O1 ztQXX58JlI6vKt(m%lO>t%l-cxm$+OaD-`VoxKc&m?`S?yz_eW0V$QO=%)ySAMHw@K zTIXtsi2O1z=lDKtP4+2+eT-M8h9>79JNs>FrS~81V;qxS{Wo9Den4Gwe~EJMN}z>d zC9V-A$@#gtsd*&~AsLy)3W-G}3P36|PoX3uRiU6XDJL^oAtgUIF*8q3!8^4KDB)3> zo{?ItqmT{aWjLf}mgoVE&`}6ZEhtINO-e0NFtoHZE&KL<4$uY$Pgg&ebxsLQ0Ic+H AasU7T literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/icons/sphere1.gif b/rubbos/app/httpd-2.0.64/docs/icons/sphere1.gif new file mode 100644 index 0000000000000000000000000000000000000000..7067070da2786b9842212ff1ce2307fb404407ce GIT binary patch literal 285 zcmZ?wbhEHb6k!l!c+9}?9|&g7{BLZ0=KudQXU@!=IWvuc!PwZC0S8e0=NFQZS*(y) zRH6W+GV>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/rubbos/app/httpd-2.0.64/docs/icons/sphere1.png b/rubbos/app/httpd-2.0.64/docs/icons/sphere1.png new file mode 100644 index 0000000000000000000000000000000000000000..5dddd042f0d7353e473885c6ba79485385dfef61 GIT binary patch literal 368 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DT4r?5ZC`eFmvXAW8*Xb|DQQ? zX6DS9X$%a;#>PN-tYCS$YCcecr6kBN7^s!OL2Km~AfGYG+uensgH_f8$f@ykaSY+O zUV6@utHFTB;Ub4@%v;_!4_J3uSY46c^5RW^(XNg@ufU=l?_gH;|6e#bS-wdBne-wt z`s9R45w4lJp(oS~Uhn$Yd0J!Xq078d&w@1jt$R8rtEVGrYPK@aQWzrMg4Co zves;^bdo{?ItqmT{aWjLf}mgoVE&`}6Z gEhtINO-e0NFtoHZE&KL<4$uY$Pgg&ebxsLQ05^4kZU6uP literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/icons/sphere2.gif b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/sphere2.png b/rubbos/app/httpd-2.0.64/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`1Ve{U7WG~8yuhh5Zb<@7 z`xV^^pIq^?J6sl`b?E$;oi=gneQc#~{w%G2Eo$=bQcK8x IUrq*V0QdG)RsaA1 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/icons/tar.png b/rubbos/app/httpd-2.0.64/docs/icons/tar.png new file mode 100644 index 0000000000000000000000000000000000000000..533fd6f0996aa2f31b4566e448d8d4c01fc70fc2 GIT binary patch literal 270 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DTx4|5ZC|z|L@ z=H@_Q2$-~-Eg8s)^mK6y;kcgLbCCCd0?!e@M%GP^tq~2Pm)_V1uUFw%c}2h2$ZYH;6HOFo#tW9U|d0Maat!vk<0G6*D)1I~FC*(bEjSuzz z!uW8#SXSV-f{d`es+N|N()b5rw57(y~Kixo1H^Yauybe=*XnDYZz! 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/rubbos/app/httpd-2.0.64/docs/icons/tex.png b/rubbos/app/httpd-2.0.64/docs/icons/tex.png new file mode 100644 index 0000000000000000000000000000000000000000..ca8e789327931161a1dadef7768291e26132e396 GIT binary patch literal 319 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DTx4|5ZC|z|DXB)f9A}Y#>U1# zF*w-HF-s80VJZpo3;xgWbi08UkjI$h?e4NF;Wp9j|CK7s)@ZhJRTqtQqVAVZ&a z@bLvnE7vz@-)Pf|S=-S%iQ`grZuIuD>WAUCw?0t6D))tLS%U=MnNH)oKnuf4Tq8=7 z^K)}k^GX;(GBS%55{pU{fK+ClLP!lN`jBehsZ vAsfWYa7fK8(E}QxqY#{0P?DOPlv<=XnDYZz! 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/rubbos/app/httpd-2.0.64/docs/icons/text.png b/rubbos/app/httpd-2.0.64/docs/icons/text.png new file mode 100644 index 0000000000000000000000000000000000000000..ad068b901da8c1424ff1157cdf3769788b50f2ad GIT binary patch literal 298 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DTx4|5ZC|z|DXB)f9A}Y#>U1# zF*w-HF-s80VJZpo3;xgWbi08UkjI$h?e4f$>K*Qi7~KWOaBQpJFLVtq9i##H#aq}gdrp&vsfXqs6+usW#%cA zWTYw-lqTh5CM%@m=O$+6=_z=pmH{O^O4Bn^i**#TLA(ry)XWk+pb!Kno$skuq1 aMGA(NmZoLj-p>Krz~JfX=d#Wzp$Pz}ykg@3 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/icons/transfer.gif b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/transfer.png b/rubbos/app/httpd-2.0.64/docs/icons/transfer.png new file mode 100644 index 0000000000000000000000000000000000000000..bd4f325f401d7a7bfdd3905cc8efd3427833dc60 GIT binary patch literal 337 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0!VDyh@)w!{DTx4|5ZC`eU~GKm|NogYXQnYQ z7#kY{Wq`oQW;;kTb4ie2@c;h|*H7^}0=bMy-tI089jvk*Ku(#bi(?4K_0)4`IU5Xk zSRb$ly`QL;P|)1)-HT0Nq3pun{Ry+8sy@uM6Z*vbY>s>$<7e4JD)UYnynK3W>lCAi z?7tnZ=gx6>6uom>vUcK}lshZalP_>YuU0qW>smGI#iorXGxPKmyi?175+0@L8L7oO3fUlDhC^y*i5}1h9fjc3f|AtSq|_n>LrY83 UvTyI_0BvCKboFyt=akR{0B+!YjsO4v literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/icons/unknown.gif b/rubbos/app/httpd-2.0.64/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# zF*w-HF-s80VJZpo3;xgWbi08UkjI$h?e4Y;+RL=hu*&4sPawMR^6$%b-JRV zXXXC~Vz*`HcG|FS<>_YZp0TCoR{g#*b?-M9m0OjIm_uhu>SYD^@BwWLD{+k|NzTvB zP0cG|2+7DSR!A%=Q2-Xz@*&Mzw-23{>5{AIi%LijXHkMRw1HyNzyFOS#mnvM?d*oFAHE` Gum%9J?KeFD literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/icons/up.png b/rubbos/app/httpd-2.0.64/docs/icons/up.png new file mode 100644 index 0000000000000000000000000000000000000000..b8d32f58bbf779841d34c194abd34c585e9798b0 GIT binary patch literal 261 zcmeAS@N?(olHy`uVBq!ia0vp^B0wz0#0(_&>W54PQak}ZA+G=b|3CBpKad9mLQMOP z11YAGAiv=M3{STkcma8gN#5=*3>~bp9zc${r;B3<$MxPbhKvjb9Lxu2EMeyBl2XnDYZz! 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# zF*w-HF-s80VJZpo3;xgWbi08UkjI$h?e4=IEHXsUwW>QlR=S(`M`(L z#&rs^4i^P?{r8Dap3nDz@gc{;j-x)IM;%;ROv=U2IIFkXFuT;=-uC@mZufNY4<)C? z6y~-(ZSB7rC20EN?A827lV3^JG9K3vyE8F!n<~(XuoBmZlH~l{+|;}hhLDWRVui$_ z5(OZYnWs>ak*ZKonv|27tdNqQo0yrWr{JAh29)q9P0vUz)=|g?@iH7zGfVVnwEWgKL=<7gQu&X%Q~loCIGg{XVd@y literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/icons/uuencoded.gif b/rubbos/app/httpd-2.0.64/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# zF*w-HF-s80VJZpo3;xgWbi08UkjI$h?e4=IEHXsUwW>QlR=S(`M`(L z#&rs^4i^P?{r8Dap3nDz@gc{;j-x)IM;%;ROv=U2IIFkXFuT;=-uC@mZufNY4<)C? z6y~-(ZSB7rC20EN?A827lV3^JG9K3vyE8F!n<~(XuoBmZlH~l{+|;}hhLDWRVui$_ z5(OZYnWs>ak*ZKonv|27tdNqQo0yrWr{JAh29)q9P0vUz)=|g?@iH7zGfVVnwEWgKL=<7gQu&X%Q~loCIGg{XVd@y literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/icons/world1.gif b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/icons/world1.png b/rubbos/app/httpd-2.0.64/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}J44o^Chr0`eG>yxmBhx5d?9$7It{-{#a{#Eb8rq%twkbmz+qE1iw4WUUu_l1?X zMwBGy=jNv7l`w>4WELwV7L_Ofsmwful8jV^g3_d%%w&a>{M^LMJUs>P)H0xiM`?OS zYO#(&Hi(zukeXSd2Q)%QAvm?5BsDiFwMfCx($ci-+xs~{8yGxY{an^LB{Ts5X{(KK literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/man/ab.8 b/rubbos/app/httpd-2.0.64/docs/man/ab.8 new file mode 100644 index 00000000..aa1c7ab2 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/man/ab.8 @@ -0,0 +1,125 @@ +.\" 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" 8 "2004-11-14" "Apache HTTP Server" "ab" + +.SH NAME +ab \- Apache HTTP server benchmarking tool + +.SH "SYNOPSIS" + +.PP +\fBab\fR [ -\fBA\fR \fIauth-username\fR:\fIpassword\fR ] [ -\fBc\fR \fIconcurrency\fR ] [ -\fBC\fR \fIcookie-name\fR=\fIvalue\fR ] [ -\fBd\fR ] [ -\fBe\fR \fIcsv-file\fR ] [ -\fBg\fR \fIgnuplot-file\fR ] [ -\fBh\fR ] [ -\fBH\fR \fIcustom-header\fR ] [ -\fBi\fR ] [ -\fBk\fR ] [ -\fBn\fR \fIrequests\fR ] [ -\fBp\fR \fIPOST-file\fR ] [ -\fBP\fR \fIproxy-auth-username\fR:\fIpassword\fR ] [ -\fBq\fR ] [ -\fBs\fR ] [ -\fBS\fR ] [ -\fBt\fR \fItimelimit\fR ] [ -\fBT\fR \fIcontent-type\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 ] [http://]\fIhostname\fR[:\fIport\fR]/\fIpath\fR + + +.SH "SUMMARY" + +.PP +ab 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 +-A \fIauth-username\fR:\fIpassword\fR +Supply BASIC Authentication credentials to the server\&. The username and password are separated by a single : 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 +-c \fIconcurrency\fR +Number of multiple requests to perform at a time\&. Default is one request at a time\&. +.TP +-C \fIcookie-name\fR=\fIvalue\fR +Add a Cookie: line to the request\&. The argument is typically in the form of a \fIname\fR=\fIvalue\fR pair\&. This field is repeatable\&. +.TP +-d +Do not display the "percentage served within XX [ms] table"\&. (legacy support)\&. +.TP +-e \fIcsv-file\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 +-g \fIgnuplot-file\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 +-h +Display usage information\&. +.TP +-H \fIcustom-header\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, "Accept-Encoding: zip/zop;8bit")\&. +.TP +-i +Do HEAD requests instead of GET\&. +.TP +-k +Enable the HTTP KeepAlive feature, \fIi\&.e\&.\fR, perform multiple requests within one HTTP session\&. Default is no KeepAlive\&. +.TP +-n \fIrequests\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 +-p \fIPOST-file\fR +File containing data to POST\&. +.TP +-P \fIproxy-auth-username\fR:\fIpassword\fR +Supply BASIC Authentication credentials to a proxy en-route\&. The username and password are separated by a single : 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 +-q +When processing more than 150 requests, ab outputs a progress count on stderr every 10% or 100 requests or so\&. The -q flag will suppress these messages\&. +.TP +-s +When compiled in (ab -h will show you) use the SSL protected https rather than the http protocol\&. This feature is experimental and \fIvery\fR rudimentary\&. You probably do not want to use it\&. +.TP +-S +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 +-t \fItimelimit\fR +Maximum number of seconds to spend for benchmarking\&. This implies a -n 50000 internally\&. Use this to benchmark the server within a fixed total amount of time\&. Per default there is no timelimit\&. +.TP +-T \fIcontent-type\fR +Content-type header to use for POST data\&. +.TP +-v \fIverbosity\fR +Set verbosity level - 4 and above prints information on headers, 3 and above prints response codes (404, 200, etc\&.), 2 and above prints warnings and info\&. +.TP +-V +Display version number and exit\&. +.TP +-w +Print out results in HTML tables\&. Default table is two columns wide, with a white background\&. +.TP +-x \fI-attributes\fR +String to use as attributes for
    \&. Attributes are inserted
    \&. +.TP +-X \fIproxy\fR[:\fIport\fR] +Use a proxy server for the requests\&. +.TP +-y \fI-attributes\fR +String to use as attributes for \&. +.TP +-z \fI
    -attributes\fR +String to use as attributes for \&. + +.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 strstr(3) shows up top in profile, which might indicate a performance problem; \fIi\&.e\&.\fR, you would measure the ab performance rather than the server's\&. + diff --git a/rubbos/app/httpd-2.0.64/docs/man/apachectl.8 b/rubbos/app/httpd-2.0.64/docs/man/apachectl.8 new file mode 100644 index 00000000..3b727381 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/man/apachectl.8 @@ -0,0 +1,92 @@ +.\" 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 "2004-01-06" "Apache HTTP Server" "apachectl" + +.SH NAME +apachectl \- Apache HTTP Server Control Interface + +.SH "SYNOPSIS" + +.PP +When acting in pass-through mode, apachectl can take all the arguments available for the httpd binary\&. + +.PP +\fBapachectl\fR [ \fIhttpd-argument\fR ] + +.PP +When acting in SysV init mode, apachectl takes simple, one-word commands, defined below\&. + +.PP +\fBapachectl\fR \fIcommand\fR + + +.SH "SUMMARY" + +.PP +apachectl 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 apachectl 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, apachectl can act as a SysV init script, taking simple one-word arguments like start, restart, and stop, and translating them into appropriate signals to httpd\&. + +.PP +If your Apache installation uses non-standard paths, you will need to edit the apachectl 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 apachectl 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 +start +Start the Apache httpd daemon\&. Gives an error if it is already running\&. This is equivalent to apachectl -k start\&. +.TP +stop +Stops the Apache httpd daemon\&. This is equivalent to apachectl -k stop\&. +.TP +restart +Restarts the Apache httpd daemon\&. If the daemon is not running, it is started\&. This command automatically checks the configuration files as in configtest before initiating the restart to make sure the daemon doesn't die\&. This is equivalent to apachectl -k restart\&. +.TP +fullstatus +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 lynx available on your system\&. The URL used to access the status report can be set by editing the STATUSURL variable in the script\&. +.TP +status +Displays a brief status report\&. Similar to the fullstatus option, except that the list of requests currently being served is omitted\&. +.TP +graceful +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 configtest before initiating the restart to make sure Apache doesn't die\&. This is equivalent to apachectl -k graceful\&. +.TP +configtest +Run a configuration file syntax test\&. It parses the configuration files and either reports Syntax Ok or detailed information about the particular syntax error\&. This is equivalent to apachectl -t\&. + +.PP +The following additional option is available, but deprecated\&. + + +.TP +startssl +This is equivalent to apachectl -k start -DSSL\&. We recommend that you use that command explicitly, or you adjust your httpd\&.conf to remove the section so that SSL will always be available\&. + diff --git a/rubbos/app/httpd-2.0.64/docs/man/apxs.8 b/rubbos/app/httpd-2.0.64/docs/man/apxs.8 new file mode 100644 index 00000000..759a0459 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/man/apxs.8 @@ -0,0 +1,255 @@ +.\" 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" 8 "2004-11-20" "Apache HTTP Server" "apxs" + +.SH NAME +apxs \- APache eXtenSion tool + +.SH "SYNOPSIS" + +.PP +\fBapxs\fR -\fBg\fR [ -\fBS\fR \fIname\fR=\fIvalue\fR ] -\fBn\fR \fImodname\fR + +.PP +\fBapxs\fR -\fBq\fR [ -\fBS\fR \fIname\fR=\fIvalue\fR ] \fIquery\fR \&.\&.\&. + +.PP +\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 \&.\&.\&. + +.PP +\fBapxs\fR -\fBi\fR [ -\fBS\fR \fIname\fR=\fIvalue\fR ] [ -\fBn\fR \fImodname\fR ] [ -\fBa\fR ] [ -\fBA\fR ] \fIdso-file\fR \&.\&.\&. + +.PP +\fBapxs\fR -\fBe\fR [ -\fBS\fR \fIname\fR=\fIvalue\fR ] [ -\fBn\fR \fImodname\fR ] [ -\fBa\fR ] [ -\fBA\fR ] \fIdso-file\fR \&.\&.\&. + + +.SH "SUMMARY" + +.PP +apxs 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 apxs 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 apxs 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 apxs 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 -fpic\&. For other C compilers consult its manual page or at watch for the flags apxs 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 src/modules/standard/mod_so\&.c source file\&. + + +.SH "OPTIONS" + +.SS "Common Options" + + +.TP +-n \fImodname\fR +This explicitly sets the module name for the -i (install) and -g (template generation) option\&. Use this to explicitly specify the module name\&. For option -g this is required, for option -i the apxs 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 +-q +Performs a query for apxs's knowledge about certain settings\&. The \fIquery\fR parameters can be one or more of the following strings: CC, CFLAGS, CFLAGS_SHLIB, INCLUDEDIR, LD_SHLIB, LDFLAGS_SHLIB, LIBEXECDIR, LIBS_SHLIB, SBINDIR, SYSCONFDIR, TARGET\&. .PP Use this for manually determining settings\&. 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 +-S \fIname\fR=\fIvalue\fR +This option changes the apxs settings described above\&. + +.SS "Template Generation Options" + + +.TP +-g +This generates a subdirectory \fIname\fR (see option -n) and there two files: A sample module source file named mod_\fIname\fR\&.c 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 Makefile for even easier build and installing of this module\&. + +.SS "DSO Compilation Options" + + +.TP +-c +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 -o option is specified the output file is guessed from the first filename in \fIfiles\fR and thus usually defaults to mod_\fIname\fR\&.so\&. +.TP +-o \fIdsofile\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 mod_unknown\&.so is used\&. +.TP +-D \fIname\fR=\fIvalue\fR +This option is directly passed through to the compilation command(s)\&. Use this to add your own defines to the build process\&. +.TP +-I \fIincdir\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 +-L \fIlibdir\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 +-l \fIlibname\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 +-Wc,\fIcompiler-flags\fR +This option passes \fIcompiler-flags\fR as additional flags to the compiler command\&. Use this to add local compiler-specific options\&. +.TP +-Wl,\fIlinker-flags\fR +This option passes \fIlinker-flags\fR as additional flags to the linker command\&. Use this to add local linker-specific options\&. + +.SS "DSO Installation and Configuration Options" + + +.TP +-i +This indicates the installation operation and installs one or more dynamically shared objects into the server's \fImodules\fR directory\&. +.TP +-a +This activates the module by automatically adding a corresponding LoadModule line to Apache's httpd\&.conf configuration file, or by enabling it if it already exists\&. +.TP +-A +Same as option -a but the created LoadModule directive is prefixed with a hash sign (#), \fIi\&.e\&.\fR, the module is just prepared for later activation but initially disabled\&. +.TP +-e +This indicates the editing operation, which can be used with the -a and -A options similarly to the -i operation to edit Apache's httpd\&.conf configuration file without attempting to install the module\&. + +.SH "EXAMPLES" + +.PP +Assume you have an Apache module named mod_foo\&.c 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 + gcc -fpic -DSHARED_MODULE -I/path/to/apache/include -c mod_foo\&.c + ld -Bshareable -o mod_foo\&.so mod_foo\&.o + $ _ + +.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 apxs provides an automatic way to install the shared object in its "modules" directory and updating the httpd\&.conf file accordingly\&. This can be achieved by running: + +.nf + + $ apxs -i -a mod_foo\&.c + 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] + $ _ + +.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 -A 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/mod_foo\&.c + $ _ + +.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 + gcc -fpic -DSHARED_MODULE -I/path/to/apache/include -c mod_foo\&.c + ld -Bshareable -o mod_foo\&.so mod_foo\&.o + apxs -i -a -n "foo" mod_foo\&.so + 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 +You can even use apxs to compile complex modules outside the Apache source tree, like PHP3: + +.nf + + $ cd php3 + $ \&./configure --with-shared-apache=\&.\&./apache-1\&.3 + $ apxs -c -o libphp3\&.so mod_php3\&.c libmodphp3-so\&.a + gcc -fpic -DSHARED_MODULE -I/tmp/apache/include -c mod_php3\&.c + ld -Bshareable -o libphp3\&.so mod_php3\&.o libmodphp3-so\&.a + $ _ + +.fi + +.PP +because apxs automatically recognized C source files and object files\&. Only C source files are compiled while remaining object files are used for the linking phase\&. + diff --git a/rubbos/app/httpd-2.0.64/docs/man/dbmmanage.1 b/rubbos/app/httpd-2.0.64/docs/man/dbmmanage.1 new file mode 100644 index 00000000..a297070d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/man/dbmmanage.1 @@ -0,0 +1,118 @@ +.\" 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 "2004-11-20" "Apache HTTP Server" "dbmmanage" + +.SH NAME +dbmmanage \- Manage user authentication files in DBM format + +.SH "SYNOPSIS" + +.PP +\fBdbmmanage\fR [ \fIencoding\fR ] \fIfilename\fR add|adduser|check|delete|update \fIusername\fR [ \fIencpasswd\fR [ \fIgroup\fR[,\fIgroup\fR\&.\&.\&.] [ \fIcomment\fR ] ] ] + +.PP +\fBdbmmanage\fR \fIfilename\fR view [ \fIusername\fR ] + +.PP +\fBdbmmanage\fR \fIfilename\fR import + + +.SH "SUMMARY" + +.PP +dbmmanage is used to create and update the DBM format files used to store usernames and password for basic authentication of HTTP users via mod_auth_dbm\&. Resources available from the Apache HTTP server can be restricted to just the users listed in the files created by dbmmanage\&. This program can only be used when the usernames are stored in a DBM file\&. To use a flat-file database see htpasswd\&. + +.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 +\fIfilename\fR +The filename of the DBM format file\&. Usually without the extension \&.db, \&.pag, or \&.dir\&. +.TP +\fIusername\fR +The user for which the operations are performed\&. The \fIusername\fR may not contain a colon (:)\&. +.TP +\fIencpasswd\fR +This is the already encrypted password to use for the update and add commands\&. You may use a hyphen (-) if you want to get prompted for the password, but fill in the fields afterwards\&. Additionally when using the update command, a period (\&.) keeps the original password untouched\&. +.TP +\fIgroup\fR +A group, which the user is member of\&. A groupname may not contain a colon (:)\&. You may use a hyphen (-) if you don't want to assign the user to a group, but fill in the comment field\&. Additionally when using the update command, a period (\&.) keeps the original groups untouched\&. +.TP +\fIcomment\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 +-d +crypt encryption (default, except on Win32, Netware) +.TP +-m +MD5 encryption (default on Win32, Netware) +.TP +-s +SHA1 encryption +.TP +-p +plaintext (\fInot recommended\fR) + +.SS "Commands" + + +.TP +add +Adds an entry for \fIusername\fR to \fIfilename\fR using the encrypted password \fIencpasswd\fR\&. dbmmanage passwords\&.dat add rbowen foKntnEF3KSXA +.TP +adduser +Asks for a password and then adds an entry for \fIusername\fR to \fIfilename\fR\&. dbmmanage passwords\&.dat adduser krietz +.TP +check +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 +delete +Deletes the \fIusername\fR entry from \fIfilename\fR\&. dbmmanage passwords\&.dat delete rbowen +.TP +import +Reads \fIusername\fR:\fIpassword\fR entries (one per line) from STDIN and adds them to \fIfilename\fR\&. The passwords already have to be crypted\&. +.TP +update +Same as the adduser command, except that it makes sure \fIusername\fR already exists in \fIfilename\fR\&. dbmmanage passwords\&.dat update rbowen +.TP +view +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 dbmmanage expects to see\&. dbmmanage 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 +dbmmanage has a list of DBM format preferences, defined by the @AnyDBM::ISA array near the beginning of the program\&. Since we prefer the Berkeley DB 2 file format, the order in which dbmmanage will look for system libraries is Berkeley DB 2, then NDBM, then GDBM and then SDBM\&. The first library found will be the library dbmmanage will attempt to use for all DBM file transactions\&. This ordering is slightly different than the standard @AnyDBM::ISA ordering in Perl, as well as the ordering used by the simple dbmopen() 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 file program supplied with most Unix systems to see what format a DBM file is in\&. + diff --git a/rubbos/app/httpd-2.0.64/docs/man/htdbm.1 b/rubbos/app/httpd-2.0.64/docs/man/htdbm.1 new file mode 100644 index 00000000..2b7b95f9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/man/htdbm.1 @@ -0,0 +1,169 @@ +.\" 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 "2005-04-07" "Apache HTTP Server" "htdbm" + +.SH NAME +htdbm \- Manipulate DBM password databases + +.SH "SYNOPSIS" + +.PP +\fBhtdbm\fR [ -\fBT\fR\fIDBTYPE\fR ] [ -\fBc\fR ] [ -\fBm\fR | -\fBd\fR | -\fBp\fR | -\fBs\fR ] [ -\fBt\fR ] [ -\fBv\fR ] [ -\fBx\fR ] \fIfilename\fR \fIusername\fR + +.PP +\fBhtdbm\fR -\fBb\fR [ -\fBT\fR\fIDBTYPE\fR ] [ -\fBc\fR ] [ -\fBm\fR | -\fBd\fR | -\fBp\fR | -\fBs\fR ] [ -\fBt\fR ] [ -\fBv\fR ] \fIfilename\fR \fIusername\fR \fIpassword\fR + +.PP +\fBhtdbm\fR -\fBn\fR [ -\fBc\fR ] [ -\fBm\fR | -\fBd\fR | -\fBp\fR | -\fBs\fR ] [ -\fBt\fR ] [ -\fBv\fR ] \fIusername\fR + +.PP +\fBhtdbm\fR -\fBnb\fR [ -\fBc\fR ] [ -\fBm\fR | -\fBd\fR | -\fBp\fR | -\fBs\fR ] [ -\fBt\fR ] [ -\fBv\fR ] \fIusername\fR \fIpassword\fR + +.PP +\fBhtdbm\fR -\fBv\fR [ -\fBT\fR\fIDBTYPE\fR ] [ -\fBc\fR ] [ -\fBm\fR | -\fBd\fR | -\fBp\fR | -\fBs\fR ] [ -\fBt\fR ] [ -\fBv\fR ] \fIfilename\fR \fIusername\fR + +.PP +\fBhtdbm\fR -\fBvb\fR [ -\fBT\fR\fIDBTYPE\fR ] [ -\fBc\fR ] [ -\fBm\fR | -\fBd\fR | -\fBp\fR | -\fBs\fR ] [ -\fBt\fR ] [ -\fBv\fR ] \fIfilename\fR \fIusername\fR \fIpassword\fR + +.PP +\fBhtdbm\fR -\fBx\fR [ -\fBT\fR\fIDBTYPE\fR ] [ -\fBm\fR | -\fBd\fR | -\fBp\fR | -\fBs\fR ] \fIfilename\fR \fIusername\fR + +.PP +\fBhtdbm\fR -\fBl\fR [ -\fBT\fR\fIDBTYPE\fR ] + + +.SH "SUMMARY" + +.PP +htdbm is used to manipulate the DBM format files used to store usernames and password for basic authentication of HTTP users via mod_auth_dbm\&. See the dbmmanage documentation for more information about these DBM files\&. + + +.SH "OPTIONS" + + +.TP +-b +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\&. +.TP +-c +Create the \fIpasswdfile\fR\&. If \fIpasswdfile\fR already exists, it is rewritten and truncated\&. This option cannot be combined with the -n option\&. +.TP +-n +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 -c option\&. +.TP +-m +Use MD5 encryption for passwords\&. On Windows, Netware and TPF, this is the default\&. +.TP +-d +Use crypt() encryption for passwords\&. The default on all platforms but Windows, Netware and TPF\&. Though possibly supported by htdbm on all platforms, it is not supported by the httpd server on Windows, Netware and TPF\&. +.TP +-s +Use SHA encryption for passwords\&. Facilitates migration from/to Netscape servers using the LDAP Directory Interchange Format (ldif)\&. +.TP +-p +Use plaintext passwords\&. Though htdbm will support creation on all platforms, the httpd daemon will only accept plain text passwords on Windows, Netware and TPF\&. +.TP +-l +Print each of the usernames and comments from the database on stdout\&. +.TP +-t +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 +-v +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 +-x +Delete user\&. If the username exists in the specified DBM file, it will be deleted\&. +.TP +\fIfilename\fR +The filename of the DBM format file\&. Usually without the extension \&.db, \&.pag, or \&.dir\&. If -c is given, the DBM file is created if it does not already exist, or updated if it does exist\&. +.TP +\fIusername\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 +\fIpassword\fR +The plaintext password to be encrypted and stored in the DBM file\&. Used only with the -b flag\&. +.TP +-T\fIDBTYPE\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 htdbm expects to see\&. htdbm 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 file program supplied with most Unix systems to see what format a DBM file is in\&. + +.SH "EXIT STATUS" + +.PP +htdbm returns a zero status ("true") if the username and password have been successfully added or updated in the DBM File\&. htdbm returns 1 if it encounters some problem accessing files, 2 if there was a syntax problem with the command line, 3 if the password was entered interactively and the verification entry didn't match, 4 if its operation was interrupted, 5 if a value is too long (username, filename, password, or final computed record), 6 if the username contains illegal characters (see the Restrictions section), and 7 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 jsmith\&. The user is prompted for the password\&. If executed on a Windows system, the password will be encrypted using the modified Apache MD5 algorithm; otherwise, the system's crypt() routine will be used\&. If the file does not exist, htdbm 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 jane\&. The user is prompted for the password\&. If the file exists and cannot be read, or cannot be written, it is not altered and htdbm 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 (Pwd4Steve) using the MD5 algorithm, and stores it in the specified file\&. + +.SH "SECURITY CONSIDERATIONS" + +.PP +Web password files such as those managed by htdbm 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 -b option is discouraged, since when it is used the unencrypted password appears on the command line\&. + +.SH "RESTRICTIONS" + +.PP +On the Windows and MPE platforms, passwords encrypted with htdbm are limited to no more than 255 characters in length\&. Longer passwords will be truncated to 255 characters\&. + +.PP +The MD5 algorithm used by htdbm is specific to the Apache software; passwords encrypted using it will not be usable with other Web servers\&. + +.PP +Usernames are limited to 255 bytes and may not include the character :\&. + diff --git a/rubbos/app/httpd-2.0.64/docs/man/htdigest.1 b/rubbos/app/httpd-2.0.64/docs/man/htdigest.1 new file mode 100644 index 00000000..9c8c0dfd --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/man/htdigest.1 @@ -0,0 +1,57 @@ +.\" 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 "2004-01-06" "Apache HTTP Server" "htdigest" + +.SH NAME +htdigest \- manage user files for digest authentication + +.SH "SYNOPSIS" + +.PP +\fBhtdigest\fR [ -\fBc\fR ] \fIpasswdfile\fR \fIrealm\fR \fIusername\fR + + +.SH "SUMMARY" + +.PP +htdigest 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 htdigest\&. + +.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 +-c +Create the \fIpasswdfile\fR\&. If \fIpasswdfile\fR already exists, it is deleted first\&. +.TP +\fIpasswdfile\fR +Name of the file to contain the username, realm and password\&. If -c is given, this file is created if it does not already exist, or deleted and recreated if it does exist\&. +.TP +\fIrealm\fR +The realm name to which the user name belongs\&. +.TP +\fIusername\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\&. + diff --git a/rubbos/app/httpd-2.0.64/docs/man/htpasswd.1 b/rubbos/app/httpd-2.0.64/docs/man/htpasswd.1 new file mode 100644 index 00000000..4ed581f6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/man/htpasswd.1 @@ -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 "HTPASSWD" 1 "2004-01-06" "Apache HTTP Server" "htpasswd" + +.SH NAME +htpasswd \- Manage user files for basic authentication + +.SH "SYNOPSIS" + +.PP +\fBhtpasswd\fR [ -\fBc\fR ] [ -\fBm\fR ] [ -\fBD\fR ] \fIpasswdfile\fR \fIusername\fR + +.PP +\fBhtpasswd\fR -\fBb\fR [ -\fBc\fR ] [ -\fBm\fR | -\fBd\fR | -\fBp\fR | -\fBs\fR ] [ -\fBD\fR ] \fIpasswdfile\fR \fIusername\fR \fIpassword\fR + +.PP +\fBhtpasswd\fR -\fBn\fR [ -\fBm\fR | -\fBd\fR | -\fBs\fR | -\fBp\fR ] \fIusername\fR + +.PP +\fBhtpasswd\fR -\fBnb\fR [ -\fBm\fR | -\fBd\fR | -\fBs\fR | -\fBp\fR ] \fIusername\fR \fIpassword\fR + + +.SH "SUMMARY" + +.PP +htpasswd is used to create and update the flat-files used to store usernames and password for basic authentication of HTTP users\&. If htpasswd 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 htpasswd\&. This program can only manage usernames and passwords stored in a flat-file\&. It can encrypt and display password information for use in other types of data stores, though\&. To use a DBM database see dbmmanage\&. + +.PP +htpasswd encrypts passwords using either a version of MD5 modified for Apache, or the system's crypt() routine\&. Files managed by htpasswd may contain both types of passwords; some user records may have MD5-encrypted passwords while others in the same file may have passwords encrypted with crypt()\&. + +.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 +-b +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\&. +.TP +-c +Create the \fIpasswdfile\fR\&. If \fIpasswdfile\fR already exists, it is rewritten and truncated\&. This option cannot be combined with the -n option\&. +.TP +-n +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 -c option\&. +.TP +-m +Use MD5 encryption for passwords\&. On Windows, Netware and TPF, this is the default\&. +.TP +-d +Use crypt() encryption for passwords\&. The default on all platforms but Windows, Netware and TPF\&. Though possibly supported by htpasswd on all platforms, it is not supported by the httpd server on Windows, Netware and TPF\&. +.TP +-s +Use SHA encryption for passwords\&. Facilitates migration from/to Netscape servers using the LDAP Directory Interchange Format (ldif)\&. +.TP +-p +Use plaintext passwords\&. Though htpasswd will support creation on all platforms, the httpd daemon will only accept plain text passwords on Windows, Netware and TPF\&. +.TP +-D +Delete user\&. If the username exists in the specified htpasswd file, it will be deleted\&. +.TP +\fIpasswdfile\fR +Name of the file to contain the user name and password\&. If -c is given, this file is created if it does not already exist, or rewritten and truncated if it does exist\&. +.TP +\fIusername\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 +\fIpassword\fR +The plaintext password to be encrypted and stored in the file\&. Only used with the -b flag\&. + +.SH "EXIT STATUS" + +.PP +htpasswd returns a zero status ("true") if the username and password have been successfully added or updated in the \fIpasswdfile\fR\&. htpasswd returns 1 if it encounters some problem accessing files, 2 if there was a syntax problem with the command line, 3 if the password was entered interactively and the verification entry didn't match, 4 if its operation was interrupted, 5 if a value is too long (username, filename, password, or final computed record), 6 if the username contains illegal characters (see the Restrictions section), and 7 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 jsmith\&. The user is prompted for the password\&. If executed on a Windows system, the password will be encrypted using the modified Apache MD5 algorithm; otherwise, the system's crypt() routine will be used\&. If the file does not exist, htpasswd 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 jane\&. The user is prompted for the password\&. If the file exists and cannot be read, or cannot be written, it is not altered and htpasswd will display a message and return an error status\&. + +.nf + + htpasswd -mb /usr/web/\&.htpasswd-all jones Pwd4Steve + +.fi + +.PP +Encrypts the password from the command line (Pwd4Steve) using the MD5 algorithm, and stores it in the specified file\&. + +.SH "SECURITY CONSIDERATIONS" + +.PP +Web password files such as those managed by htpasswd 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 -b option is discouraged, since when it is used the unencrypted password appears on the command line\&. + +.SH "RESTRICTIONS" + +.PP +On the Windows and MPE platforms, passwords encrypted with htpasswd are limited to no more than 255 characters in length\&. Longer passwords will be truncated to 255 characters\&. + +.PP +The MD5 algorithm used by htpasswd is specific to the Apache software; passwords encrypted using it will not be usable with other Web servers\&. + +.PP +Usernames are limited to 255 bytes and may not include the character :\&. + diff --git a/rubbos/app/httpd-2.0.64/docs/man/httpd.8 b/rubbos/app/httpd-2.0.64/docs/man/httpd.8 new file mode 100644 index 00000000..9553a2a1 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/man/httpd.8 @@ -0,0 +1,116 @@ +.\" 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 "2004-01-06" "Apache HTTP Server" "httpd" + +.SH NAME +httpd \- Apache Hypertext Transfer Protocol Server + +.SH "SYNOPSIS" + +.PP +\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 ] [ -\fBR\fR \fIdirectory\fR ] [ -\fBh\fR ] [ -\fBl\fR ] [ -\fBL\fR ] [ -\fBS\fR ] [ -\fBt\fR ] [ -\fBv\fR ] [ -\fBV\fR ] [ -\fBX\fR ] + +.PP +On Windows systems, the following additional arguments are available: + +.PP +\fBhttpd\fR [ -\fBk\fR install|config|uninstall ] [ -\fBn\fR \fIname\fR ] [ -\fBw\fR ] + + +.SH "SUMMARY" + +.PP +httpd 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, httpd 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 +-d \fIserverroot\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 /usr/local/apache2\&. +.TP +-f \fIconfig\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 conf/httpd\&.conf\&. +.TP +-k start|restart|graceful|stop +Signals httpd to start, restart, or stop\&. See Stopping Apache for more information\&. +.TP +-C \fIdirective\fR +Process the configuration \fIdirective\fR before reading config files\&. +.TP +-c \fIdirective\fR +Process the configuration \fIdirective\fR after reading config files\&. +.TP +-D \fIparameter\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\&. +.TP +-e \fIlevel\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 +-E \fIfile\fR +Send error messages during server startup to \fIfile\fR\&. +.TP +-R \fIdirectory\fR +When the server is compiled using the SHARED_CORE rule, this specifies the \fIdirectory\fR for the shared object files\&. +.TP +-h +Output a short summary of available command line options\&. +.TP +-l +Output a list of modules compiled into the server\&. This will \fBnot\fR list dynamically loaded modules included using the LoadModule directive\&. +.TP +-L +Output a list of directives together with expected arguments and places where the directive is valid\&. +.TP +-S +Show the settings as parsed from the config file (currently only shows the virtualhost settings)\&. +.TP +-t +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\&. +.TP +-v +Print the version of httpd, and then exit\&. +.TP +-V +Print the version and build parameters of httpd, and then exit\&. +.TP +-X +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 +-k install|config|uninstall +Install Apache as a Windows NT service; change startup options for the Apache service; and uninstall the Apache service\&. +.TP +-n \fIname\fR +The \fIname\fR of the Apache service to signal\&. +.TP +-w +Keep the console window open on error so that the error message can be read\&. + diff --git a/rubbos/app/httpd-2.0.64/docs/man/logresolve.8 b/rubbos/app/httpd-2.0.64/docs/man/logresolve.8 new file mode 100644 index 00000000..6ddc7a4f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/man/logresolve.8 @@ -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" 8 "2004-01-06" "Apache HTTP Server" "logresolve" + +.SH NAME +logresolve \- Resolve IP-addresses to hostnames in Apache log files + +.SH "SYNOPSIS" + +.PP +\fBlogresolve\fR [ -\fBs\fR \fIfilename\fR ] [ -\fBc\fR ] < \fIaccess_log\fR > \fIaccess_log\&.new\fR + + +.SH "SUMMARY" + +.PP +logresolve 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 seperated from the remainder of the line by a space\&. + + +.SH "OPTIONS" + + +.TP +-s \fIfilename\fR +Specifies a filename to record statistics\&. +.TP +-c +This causes logresolve 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/rubbos/app/httpd-2.0.64/docs/man/rotatelogs.8 b/rubbos/app/httpd-2.0.64/docs/man/rotatelogs.8 new file mode 100644 index 00000000..91fee917 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/man/rotatelogs.8 @@ -0,0 +1,133 @@ +.\" 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 "2004-09-04" "Apache HTTP Server" "rotatelogs" + +.SH NAME +rotatelogs \- Piped logging program to rotate Apache logs + +.SH "SYNOPSIS" + +.PP +\fBrotatelogs\fR [ -\fBl\fR ] \fIlogfile\fR [ \fIrotationtime\fR [ \fIoffset\fR ]] | [ \fIfilesize\fRM ] + + +.SH "SUMMARY" + +.PP +rotatelogs is a simple program for use in conjunction with Apache's piped logfile feature\&. For example: + +.nf + + CustomLog "|bin/rotatelogs /var/logs/logfile 86400" common + +.fi + +.PP +This creates the files /var/logs/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 /var/logs/logfile 5M" common + +.fi + +.PP +This configuration will rotate the logfile whenever it reaches a size of 5 megabytes\&. + +.nf + + ErrorLog "|bin/rotatelogs /var/logs/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 errorlog\&.YYYY-mm-dd-HH_MM_SS\&. + + +.SH "OPTIONS" + + +.TP +-l (\fI2\&.0\&.51 and later\fR) +Causes the use of local time rather than GMT as the base for the interval\&. Note that using -l in an environment which changes the GMT offset (such as for BST or DST) can lead to unpredictable results! +.TP +\fIlogfile\fR +The path plus basename of the logfile\&. If \fIlogfile\fR includes any '%' characters, it is treated as a format string for strftime(3)\&. Otherwise, the suffix \fI\&.nnnnnnnnnn\fR is automatically added and is the time in seconds\&. Both formats compute the start time from the beginning of the current period\&. +.TP +\fIrotationtime\fR +The time between log file rotations in seconds\&. +.TP +\fIoffset\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 -300 for this argument\&. +.TP +\fIfilesize\fRM +The maximum file size in megabytes followed by the letter M to specify size rather than time\&. Use this parameter in place of both rotationtime and offset\&. + +.SH "PORTABILITY" + +.PP +The following logfile format string substitutions should be supported by all strftime(3) implementations, see the strftime(3) man page for library-specific extensions\&. + +.Ip "\(bu \s-1%A\s0 \- full weekday name (localized) + +.Ip "\(bu \s-1%a\s0 \- 3-character weekday name (localized) + +.Ip "\(bu \s-1%B\s0 \- full month name (localized) + +.Ip "\(bu \s-1%b\s0 \- 3-character month name (localized) + +.Ip "\(bu \s-1%c\s0 \- date and time (localized) + +.Ip "\(bu \s-1%d\s0 \- 2-digit day of month + +.Ip "\(bu \s-1%H\s0 \- 2-digit hour (24 hour clock) + +.Ip "\(bu \s-1%I\s0 \- 2-digit hour (12 hour clock) + +.Ip "\(bu \s-1%j\s0 \- 3-digit day of year + +.Ip "\(bu \s-1%M\s0 \- 2-digit minute + +.Ip "\(bu \s-1%m\s0 \- 2-digit month + +.Ip "\(bu \s-1%p\s0 \- am/pm of 12 hour clock (localized) + +.Ip "\(bu \s-1%S\s0 \- 2-digit second + +.Ip "\(bu \s-1%U\s0 \- 2-digit week of year (Sunday first day of week) + +.Ip "\(bu \s-1%W\s0 \- 2-digit week of year (Monday first day of week) + +.Ip "\(bu \s-1%w\s0 \- 1-digit weekday (Sunday first day of week) + +.Ip "\(bu \s-1%X\s0 \- time (localized) + +.Ip "\(bu \s-1%x\s0 \- date (localized) + +.Ip "\(bu \s-1%Y\s0 \- 4-digit year + +.Ip "\(bu \s-1%y\s0 \- 2-digit year + +.Ip "\(bu \s-1%Z\s0 \- time zone name + +.Ip "\(bu \s-1%%\s0 \- literal `%' + diff --git a/rubbos/app/httpd-2.0.64/docs/man/suexec.8 b/rubbos/app/httpd-2.0.64/docs/man/suexec.8 new file mode 100644 index 00000000..e42bf3c9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/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 "2005-11-13" "Apache HTTP Server" "suexec" + +.SH NAME +suexec \- Switch user before executing external programs + +.SH "SYNOPSIS" + +.PP +\fBsuexec\fR -\fBV\fR + + +.SH "SUMMARY" + +.PP +suexec 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 root\&. Since the HTTP daemon normally doesn't run as root, the suexec executable needs the setuid bit set and must be owned by root\&. It should never be writable for any other person than root\&. + +.PP +For further information about the concepts and and the security model of suexec please refer to the suexec documentation (http://httpd\&.apache\&.org/docs/2\&.0/suexec\&.html)\&. + + +.SH "OPTIONS" + + +.TP +-V +If you are root, this option displays the compile options of suexec\&. For security reasons all configuration options are changeable only at compile time\&. + diff --git a/rubbos/app/httpd-2.0.64/docs/man/tr/ab.8 b/rubbos/app/httpd-2.0.64/docs/man/tr/ab.8 new file mode 100644 index 00000000..152e0254 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/man/tr/ab.8 @@ -0,0 +1,125 @@ +.\" 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" 8 "2009-02-16" "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 ] [ -\fBc\fR \fIbağlantı-sayısı\fR ] [ -\fBC\fR \fIçerez-ismi=değer\fR ] [ -\fBd\fR ] [ -\fBe\fR \fIcsv-dosyası\fR ] [ -\fBg\fR \fIgnuplot-dosyası\fR ] [ -\fBh\fR ] [ -\fBH\fR \fIözel-başlık\fR ] [ -\fBi\fR ] [ -\fBk\fR ] [ -\fBn\fR \fIistek-sayısı\fR ] [ -\fBp\fR \fIPOST-dosyası\fR ] [ -\fBP\fR \fIvekil-yetkilisi:parola\fR ] [ -\fBq\fR ] [ -\fBs\fR ] [ -\fBS\fR ] [ -\fBt\fR \fIsaniye\fR ] [ -\fBT\fR \fIiçerik-türü\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&SxThdOQ7I>PI+k?V9emZC?uH%b%PF~hx9Pp)s5W7Lz44+f8iB_{u$wGsp3wW263A;p+3UaQF35UPkw`hm+-%S5coqhxTj|wjyeBNY! z3fvrCgkt&GNBueEhy~-}it$i|=lwbTkJPsi4*zZR?<5?kcq_Ps@kL%D{2%@k=s(oy zt5QE%IQ)0h|9;^>4XIy5UV{D$=)ctI+flz>IQ;j~f2(kyuGAkPFG2s0>3_`W`%_kzWeSJ?A^P7S94LqJOmzNrCWMutK_vh z{|D*+f^Z93sc`t)_*o+y z{+ZP8a{fgohLxdw?(_qwKPFuL3-SEb@;Qe3bIC3Ljp$#?>F=Pvm2maHTsY#NN&Nul ze?9#NJNCkcoDZ07%d;Xr4!42w_}Isbpqf2q?asb4P~{v+wXRXETE)E{#G-_t+e z>041>gy-cpKa8b+S#spLYWTM@{6ncCdPwt_hnAwpyjpb<)ZzXvPQQ-&E~3Z&cMJEw z*E;PHAi9)4t;6NLlqrGA$9Bc3*lXSUNHr+%q$_!r}G=}PfI9?F&ti%>R*9`&YQ zlER6dPT#*$@2nQ`Sl z(f1bpA*VlhPF#6X^wUIdH-fgj6+vf)Qj*t)(42cyBrYnDn|?6{dnnaKe_uqYWgVwK zoB3=e`WHms*6Hne-2ENz$9#@+d_D7dyW?Gxv64p}|M2X{Uv~T@Zolt1-k$mY((%{0 z-JNiJH1l7E*Q+dVotcM*j&COK=J-veVw}Srf0KE*-SLkx*@Uvt@e|zcmO5U#TGYSe z_)i?qdmKN&`Su6L$71pbr6jKpS$n544>cSwM}2F@`=&>qp^j&t5%~ni=ab*zIp?d# z9WO=y*B$?Y$RG0uaIujM#7gVz--{>AjK6|wnbUcfE-MBw}5YIB!d)RTi z-cp>`AuN95wNJx)2uJ*OUFCMi?Rv-)r{OD3!@m@c`0cvKuczTv#{adwrf+&0KEQFi z?s324cD>?F$L%`9*N)ryU6~1gjmOUGTRU#&cR1nT}`h^^K03?gPj7GVpI5x6dz{aJ#g4_HzE|?6^Ib z*6!zLdV9|77N<{Qu!QoJ;8~$L;xITO7CNh?V5_XZ6~1!TLCE&z~CM zxIJgeK0h}fdp=Z2jtk@V9HOM-_Pn8Pj@$EtW;<@rms#w%Jr~A4N40wGIWOCsKArou zS{#q2x93)LaNM2;k>j{MA7QcMcHe%xZejj*Km6~U-j08Y6^rBA^mf1ZCXU;E&O1Av ztQ_Az$?;tB<&Gz+ME$ppXOY`>X7Sklmfzs^XWZ_ena1tLxZS_8o8xwWx#t~ERA)Sn z+kKf@@I1i$?Y<2o9Jk-s=Q?h`e_!snJ)g+7SM#^uFCTMy`@L{69m7T@NhA^K7fvu8;j6IshgT literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/server/.libs/connection.o b/rubbos/app/httpd-2.0.64/server/.libs/connection.o new file mode 100644 index 0000000000000000000000000000000000000000..358e13a046c961e65dc6f79f1268a096cb82b632 GIT binary patch literal 43584 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/server/.libs/core.o b/rubbos/app/httpd-2.0.64/server/.libs/core.o new file mode 100644 index 0000000000000000000000000000000000000000..df7ffe5549e8841f2b2264b119955f8e98a82add GIT binary patch literal 281240 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 z

    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

    Ti5x$g4j6`U8&)%AmQ^@H8k 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/server/.libs/eoc_bucket.o b/rubbos/app/httpd-2.0.64/server/.libs/eoc_bucket.o new file mode 100644 index 0000000000000000000000000000000000000000..9bdedb941cd44f09c46e3f79c39a5a9e46080272 GIT binary patch literal 9616 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/server/.libs/error_bucket.o b/rubbos/app/httpd-2.0.64/server/.libs/error_bucket.o new file mode 100644 index 0000000000000000000000000000000000000000..03198e0037255fc072a178e7baa9fa1dc247da63 GIT binary patch literal 12560 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/server/.libs/exports.o b/rubbos/app/httpd-2.0.64/server/.libs/exports.o new file mode 100644 index 0000000000000000000000000000000000000000..a93c0eed31b3d6218eda4f3f24674a3bf0be5151 GIT binary patch literal 222032 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 F`G0rGHX#52 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/server/.libs/gen_test_char.o b/rubbos/app/httpd-2.0.64/server/.libs/gen_test_char.o new file mode 100644 index 0000000000000000000000000000000000000000..7fb0cbe2f8ff9472bdea345e5b3d4c42e1ae3177 GIT binary patch literal 12160 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/server/.libs/libmain.a b/rubbos/app/httpd-2.0.64/server/.libs/libmain.a new file mode 100644 index 0000000000000000000000000000000000000000..5ac351d1b1dea42dfab4652d4645b6685d38dd94 GIT binary patch literal 1779304 zcmeFa3!L0Vu`fQqePt2?n~(>a5MjU#1Pmby0Rtpq*Ca3t8wezUAdk&vAK8_Cu``nd zdBwB4>YOo>C@M-+d~oF)JYMwg@jz4z&wy|7g>qC>RF;6EA_6M;f4^1T{d>+5{onil z+XGMCOi7LR z-^BM;r9%IGHJzIH%UeVLO*(#lO8$HMW2s4h$A1SktWA~u@BVG6gZ_W~Z}Q`NQse!1 z@X_;A2fr`-|M|Z|@}Ez=_TOtVcufah(}CA?;58k1O$T1nf!B24H63_O2VT>G*L2`D z9e7O#d>xqjSYvAHZ%6)@|99wJ3sdgDv1?O@{$KFl^v}GQ`oH17x|hD5`ak`@*+080 z#s3aZ?Xv&14Yqa<3|!gT-PzXBIn+AXHk9ieO4-s)o%uLqsL&rT6e5E|ovrNy{arnq zLKMQqtR61Wx&ygJe5hu) zm{r3iQn$OUzoR!QF29Vmq9|7tdfFjvA4v#N&M^q9#|lkn^F0IoZN05s{jEct`JtZ9 z&7C3c2L_W7R0PSezRsadovnjVf{vacGZG@r{J>yq-#|y9SK4SF>TJt*qS>noouLsk z0E|Cm<&?mbhRKrGp8m}PS9S&^(bt*p9>7rKT6=r?dh(qeL>ubd)RW7DDRx}gY3t|+ zumf$~3~1ZXrp*f#zi(i3X8?idy#rA0V69MrP#x-&dLaPm9;gn``h|NI#L!wB@yyK42#Y(!E7Js>w_vp^AL{dfiwgjj6_>EcedvThNN_3fr<-B zTOg@yY3sc*Abp2prX(rlpfCNKT64VvqVX*10gYfjfCAZVQ4J?zS8rRmW=AJP(+-7@ zKA6E68W_l9;CkEgJ*t<1axy8DdU`wkHV4|SZ0&?J*_*bWer<4YXrR3_mjk8TKw+po zXj%+Gnh~g@)N?%)eHf&Ph=43TRnFG@P^S!;n7r2Rd|NwPBY!jot($v>@&!z>Zcx(k z*$PDnmI`j9jT}Uaj_GtU15p@~b~yKjI=2i#v#G8+vfTq)INdO+5S3q~^#l3AKJq}$ zE!#!}rZXL#&?hB8BN#DOV)b%)82BODNRmQwKr$z3xsdN2$iV{i3_?*2nwT4hOC)En zLZ$3nr~nML6?*fe(+lg=%c@8#5;H@cgS~AS)G%8i`z*2@>=D&s-L@P$ErTIwAw~&@ zkwK?yOM!|*Awaw4`k-j3TmjY?v#o8AYhNz6WnieIb#q&9PX~0`L7P@zNUEwAREWS7 zQ}x*_rI_bBH>u&A@F9I635-%tt0L>jv9PZ#-`?FxMOT|DZ~_X0WW(Th4Gr{}bypNa zsX&{Ch_ea$BX+kxR#8DcgW7&4j7I+exNZ}b>dv?3d(?Je*0=W=Zivf#Tdp%yHjtxz z9&F2Zx3+D}4fGZuC7_~AJF!(-!MxlA)8^7$W~v#A_{Y%i83bxq&sJtpr*ms(yG`1m zB&}RwBa5+0g741$y!5|+;G|q{TdtdszBVi+m`9*YTWu(YN~I!k+Xo6TcSJTcIp%?6 zYrpV-#zYymbVI~JuoOg)`U}0iL2|895JBRA2MIB6P-x);=e!q)uS zfm0Wml8&BD@H3eaFUp9obL(I)k}w+W6k0EZZS7bDwy95Q8%!*;YVAyZsH=VPNhh_6 zxknqwHY{p5na!D`n8$&F(2%t+;OBDL9+2tbR>edpSI0zvR15ee{RtG4!6casF*L

    -m(f%@E0z|w~4Efsn;ar5LG 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

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

    5*0E;fK$Sz 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

    `oHqiLgo%*8b`!xCl_tFdT;G7|)kp5*>y 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

    N1gJjevZAIiI1*fYbi%( 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

    hC~K!cM^&sIaTywZs%-6^H1A)sR9yKO83!0KIY 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 z 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 R4-9Dyk0Gw}8r5q#{~y;o+(ZBX literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/server/.libs/libmain.la b/rubbos/app/httpd-2.0.64/server/.libs/libmain.la new file mode 100644 index 00000000..88fb990a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/.libs/libmain.la @@ -0,0 +1,35 @@ +# libmain.la - a libtool library file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='' + +# Names of this library. +library_names='' + +# The name of the static archive. +old_library='libmain.a' + +# Libraries that this one depends upon. +dependency_libs=' -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib' + +# Version information for libmain. +current= +age= +revision= + +# Is this an already installed library? +installed=no + +# Should we warn about portability when linking against -modules? +shouldnotlink=no + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='' diff --git a/rubbos/app/httpd-2.0.64/server/.libs/listen.o b/rubbos/app/httpd-2.0.64/server/.libs/listen.o new file mode 100644 index 0000000000000000000000000000000000000000..3e769684a00e92027b1bc7175aab15dfcfd55633 GIT binary patch literal 37360 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 KK1*U$%I7mYG%U22T%cZ zinOFJX^XNtmv`fw?OrOp^9&j~*?KnjYF-PgRg zCY<6SU|fYc<98C96Ha`358aQ`2iJ!_J6_KX?>;HK=koku_@VOrAeDu8 z7fH*dqzpK`@a{M`b}OC3JMPb2bsyw~cVBRXYOu(%y0XNt%W5kVAJ>HwzejK0g>=-J z!!jY~Vl8z95vmfQaH2jpoM_1_PqYB84(?`q?K;*o0u2OLttneww&p%de-OioKZX;p zsv^HL%6__~BL$FtlpMv)F&BF%oM8D{3D)ZPB_~dtF!oXH-zRw4in8VCQ*B)h`cV>A zrQyWo`FV+Wekf6!pP#78F9`2CRt4L1Rqeh!e{;OPYIk+s?$W`#j%{63{QRQC{fiR6 zPOQ#9r}&Mk#FIJWw?ivuH)>WvOmI=+cvWJ0{-VT-yCDcdLSYEW+wp*VVpw=LTPeKb zzJl{E8NBULSfoUCyX@k!2y`rU%2p&E-|^x}N=Y;YJ-_gJOR3{PEx2rd{z1Uu-Ph*d zOtd)Et)&)j&p*ucujL=2JM||_9Z8hu4{r+Z9z2ok7fxK8UytJAM-WM2R4fWZLP^ff zt39}G_p0EcUC%GdDSvj+u9xB$F52CeU%DIB7wvi@XJ-#Mc6>A-USBq=JU_g3X?XWe z7S$A1y?fBv8fREcVm32dj2ZhAIwAJquE`{XQtq4~24e)&(GB zPg{O<*%2q?I2FYoR3_fsae4mmlX?b+anEydcKsM(08QhQDt9j|s7gFll{mriT6|1J z!9G>D(tU98p3Bd57EO8wp2*$xNY2i0qTw%Go}WAAyg^RRmwt=32;27YAO~vZvXDL3 zJpSPOC$^5Jg7G^BJA1C#?!B+%ZymrKszu#cRpUphHTXDpk^5m);)yC4wsi5H_#CHd z(m$#aAFxtYi4WBsae~6>C8Ap8j(-Glt}aBE!YC>VL)DV-p1bm^(R*$QM6O8@2{>oh z5#mMnE5f_)dsWkB*Cm<5D7W~kR%{EyIy2N!n+s3 z5|v;0^waT@FG`0v59mz=_i9!K^pcyID^gsIOcXSFQhZ7G` z6o)N;?5TE<6vH{?weT5S9#*CTSKjeLR$k3V7ze|{iR0W7=WE^8@kewVB;Gtq0a{TE zolhM94yv*dBtIkDeFP159*fV(nN*(Nl{4wu{Ous*O!`{>UcMs*^8LH{hxmR={xQDa zp8q)C@5+A>_wb&b`82VIDel92%JWOBID?w$@S%)+utASUhy`N~5skuvA`o#uhwfC8 z_e$$OPMknuBem|^iQqWIVyC5zG61RzI$hYw#I)i_Lrx>~7|IBsek!Dx4mev(ol@d|VInRitO^|Xai zo~P$yU+G;7G28OMXWH@EJo(z|q~kN}`8dJd!<2vgQ}}+bnStB#gXM|;_LU5gk}rso zlusmT(YNx%i%QqMG*MP2K4G_Dd9vemq|ivo_F0$b>^vD3Kaxpe@CU>FNh{6n_%6|B zT6FT_%J7~Rm$~nxDz9ZX@5Nk=X?Gf27OzD%)FOIb*HJf zDTwmjLpi%z(A&!0SI}M~XXo2upvv7nrQ{eHJVxo;z+vqw25?0I$W@iQ z+k@dO9h+~EL8m~VtE8%TVRpNi7(VgGtMpp&H=l!AQ zk7SK^XsrF+%GtStdY|~DGVwd*3aGtv8`0E6r&AAvf=ed4 zp5;eJGeHIwjov-jhCEn$igV-?#Vdn#&Q>Joo(Qe#3r>lT;#P8ghCPz=L3y{-b9 z>Tn@uF-m4S--i=p)6Rdh&`ICOuRSdJ6IuQG*Y2UD6XI2^BmxTKyfVxx+-~u)*S@Xh zJ=*X7UiQ0~=XbnbAKtS%KZH$`+UU@*4U2~pf0E9d0bl%xiiWkKQ1P*Y}bP^g@nOE zi5_pFUKbtN40b*D>6BBEXKNcm`OzyyTPqXsE)#{=5 z&kVUVn)SE%&Hd5lNGV$Kg0w|1i>?bwMf|Q6sNz-tmKo&CLJ+WL&*XY7LOu+L( zs6a+weoXlJJY(=wqGr*`#0y+TRg6`}`0rSq&miTbKt_+ack zLr|u>g7X9*NJ3)+@t=fu&&xx`EPg}{5T4kN-j~J~)Xk+l+2!oqLV*pjAvM(cxOQIZ zQ2S*XamUYv47EPny*0#B=INkV=Y`q@#|JZGDTY8A(RZg4{hUOClK=mAe?`X(ICD(1 zw}M&IZ?6Wu0rTnYl|LV;5a>H4T?t1aXq6v#9mBZI*?GHoQk^d$?VX|*M8}Wtur$*> z*6%WPm19?MWF%@@i-BD?kaU_A!i`Vz_?9G3G;ULGUA}PtL9puis4DSi3>-fnU{PL~ zxEGT^26&E+5Qk`4$0=5nANrZcGLve+GNv_IahN%Myw6;f$XAn!UQzN~NE460c!g5n zcaENhPbqLat{xBW_{&K<{+Y3Lgbp&bghNu= z&duz;I~Q_%2Vx)C^LxtbRh078T9M}**^;OV;lwZeIe2%8pTL_HEK6USb;@wh+E90zfDf7D60%Hu%t%aJ7b}u%@d1CHcxVvMVq7D(QfCQ zP`83+q9&v{l^q)!+FF}JlPf~pRtRl{np@kVR1UbX(P`+3w>YsaG14LyZvtDStFyDs z+2l-Vif)|J(bLxEG3EZM{}ps6kXQ?J~Z3a-MSI1ogGe7L$n>Y=6IL0AqxJsu5PEj zp|#EFh;E8GJu&pHr>C(CDmON?6{%aXx=mHLY3epz-Og3F8S3^qiZ!|>#%6~6zI1j) zJ5tS32)>?8vG3Hag_XPKHp!`R&`~$^0sd3oKWlfj?V7Zj`h?_q*015 z9S-M&+FCo{*`{+s4KWxz-rCs_nlLdoA=C^`abCi;WG$azc0)M^irsP`V!p{C>`D06>W@1o7%Pzx7{xUT}M3H(a_NtwR?wFsl!QXqMar& zU#N3qw0jf69<@W0Cx_}f8rz}`9idoDPrRuURXdx}+33dB&YoDPtgE51B^v7P>9~N~ z?;DqF7f43<$xvmk{y&ha`doCzXkRq**cas<`{ISNMWAy#`#Q-+08{=-BK1K-eK5zV zPQt@UIPZEbTD=9Q1B;S~wAQe%5*q8Bd^I)D|GvIQ!0s;0`AVb}P>gKXb0|EB5moWfQ?gWC2 zaRV8b&xIrfUNOsnTYYfH#fG}m2Y0OiHJ}<95X=nzj8N5>5_Y$dFkp66Bn&9K%z)Kh z23&rX0oUypF!Oh$nQp>X`J~hC7M|eP=>WN>xdY$W05h>E2EKVZSxmuiW#JxB@Z0Zz zH$%biC2$X_%3}w9{Bu+JQ>*d`t~?OJoPmz}Yw%+oWoiSnQ<}j!9X>>rvrFqFpke5RCfn}Yywny_M|WM;m;|!0eH@B z_@KYs?-QpoVP3BD8c1y0T!%Vq!^-Bl&TT~2JOt;ec5>Ez6?Iv~lM6o}D^vZGOAI)4 z@*hE9>d+Za3OKBAGBTXsonggufO9y6hE2Z;FgG=927wwbq24JKhRq~+u;Q6baIS*S zr*WDGyVO9dlQV{&|0~oV3Yz|O84mEL$DbMeIeZ$*wStclT(96`VZdt@ z{0o9x6ny_v=t`IJQD%_(#oZlI^fK<;-DgI=zaB}7*++iBv8UjFk{48WM}ADO>f*>x z*gJ~nQ-W2uMxG$JfJfv=$0ejlAub~&3JEY$s*nsu!U`F{NVP&T8L3xD&^-VR*D7R? zdlQfrg$(9_+oh0PM&b$?>QYkMtdNmB*0(EUlv|0CD;1LG{wJjEP{>&KP9WDPWTM*( zw!I1|bZNBgQ^*uX4l1OGk((7#%*Y{yOy%TpSRvC{w_^&K;oggO?stYkrZe(e?1sFN z2dR_Ftp7ovhHs?qYBzk32MGp72WXi=@?j1o7gAd%gUld#lc~QI>M-T>QJ0bb)$q)_ zG!MXVETo*g%ikkChPQS&d0UAZ9NyUzck;FqoI4!rW+(4Tf@wsOOpc(uZ@gf@8>gdm zL?u45X}DxhMf_z`5Ng(2YEi^#;^d6HyS4-2!Kpse3}#*J7c0Sea>glBUX~i$)tKL| zhWqv)i`ky5ZXtC$ro?XFt^{w_b?jzT^`L5I;HfmNpap06(Rcq5)!7T9fAJ#}vZD2)AG`qJ#nnbX?5C~Kzoen40%-KF z2v*~G^kXDfrKi!4QyLmOJl5chewL(!l$hs7!-=yM{0EA?QU$+AaJhp2LL(!r;QzT8 zb*r6`V@E$hP+kl%HTrk-o)24R^wYFNKoor!>?dc8Id2P?>`+jh8Z)~Ibnf4nOo)i-nl4SZ%$WVeq9&9v-=#LRPKO3le-!_*GXQIy9xVl|b$W6w z;3BfO|?68ddY!N*o-imp}21sN{9 z(V~ztM!FO-kELx^NChL8DX%CUSXtu zG}Z%SU-M`Ov{n`T%_F~PgTL+l3}MoxO5XJXXh|FVeMYvAj;(8P#(u~>)HeRRR|K}b z+Fm~htc8ijL%wq`F!pHR9waLz?wB3wzX;sm$K(A0vYs~BLxCRx$y0S6VMH73*NkX` zJsBYDiNScRl&Ct-F)~{rFEFA__eZXyP4yy|XzTo$hg7|)^Va~ayR~^<;Sz10SGkTh z&)Zz0&GRmoY*zvXdX#3gd9pk!1c!Ks(7AnzE!U$d=%7M|GIFy*hI^#JA%&d6K0U0E zF&+)wV+t9^bsknoh>^z?GJ%n26mkX&cu^q*jJ%|fvpBY1QOJ4h`?nM_i;<5)q_M?}6=)tts+=0I>xObSS>onMFyfOLn)nH1W zGZ5wdQ^R|~&ui#Yo2V-ay!wwU^Cf)px{WN5%^#1#fN1k!Q!6nLZ**h^bMVQmQvvv_ z*`y9H8M7%%Y4Km0!*%9S9h!NTNgXF2m=ip8Zx1M=2tKvWeA9WU1u{1oY-!{B-9 znF{<<|C?G>fq&{tRFxuu#AOB#^Cty2`+0n>dlt&onr-|@_Yxr3nvBm=Ta(evO)+Qu zXeKK!j~~xR8hN8>&prM$_fnRgLyIE&4YlFU3?2g^OAU=j38e9%wXAT*!{8id;}vWWvW?cW!llKeibk;cD@!2cR5HnS zNERg@2RtU%ow*FM*}Cp5vXX}RTu*Pc-8seJ!S3yXZo_*4O@G>5x$bq>nSy-;Y9Zew zE74M%>ammEZxJ|=ss^fPOnc7(Kf}j0xB?Un@{^M@iNpPiM+S5~oZ=T~0?C-v)#kW= z^@vQ4K)+N2&D0;S2xKLSaSd`%okc>tabB&kc;igN-Z)}8+c}4L+}k|&=cd)$IAJRd zZsRqRz*L*HImFt~DS+etn6*~$Pq=E~q;);bj{As5GWDs?LjXCLHaV)ZIqWreHG*JD zm*eJefU1UaT+&U!xy&IjE70BOxFcOMm1=a9yADDWoW}vI;8R@kj|~?pVlHqyYP-v zM!5U3tLdf+90_T2q1wx?=r)geU*WI`^tO~s9g==ExM#a{Ap1J+AWc;R#XS6}Lawgm z?*A(_Kt3wY;IWH>QeEhLhZSZWXS+*%y+z&(Bk!=0_rzF|hk-RCgAyiPDkNrPP&WKm z_zG3*RL~vuNfcei{Let2`HJQ^ZveR#9O$pFnX+gtw1r`pI>tD`^Bw00%v|dhqcjjK z@Z;r76edgYMbdbih@M08Q3?-epB+^INt)C@K7QakskMl%iyL6 zn2|wq7F}}@n=>+K@}etDAHXS)1HA^NrUJdeWLuVW5U;dbNpzXfy=?TGH``6JFv+KY^7T;unpB0kPP=N6Tctnz;O4knjpP> zOXn~j7cErp-{MqDf)xHXCr`qu_iwwV_eiYoxFnaZg|NlDF4@BL{asGd==;Lv_Be72 zw;SlqRfc-cZAR5VZ=M=QAGmEmGkOo5*s2I03E`e?C2dhy>mM#3%b_i0%VhkYJQ7J4 zRsON*r@}um{i+(sGYzq-%l*$l8MgC_=neX5r%2&qD!dK!66B{fyb~shiRF0+*S#pF zfxZo&*1(+Y!dV}Ex)pw`&+OfKV(Zs3{4j4)VJ-}{f#4M6W15-e3TeRoabO7GX&36U zX|pvjOE|YFS(&}>eTp_H+0v-;2MrVnYy@*3rKdt>8m0R(Eig!2nz_vx>vJC=`)Da!EfpRI{Vqj^zwg<`vA!3z*=qX$_%hxH@AJ%C>vzg8 z9({r1eA-78Mhl7ZS!RM|>}jgQ8=+|}hK*lZhtlb~)TV!c9Q8#-H-6HNL}xR5x06eu zuQ7v+$rz8x0ln8yfAp|4d2<6=GoIK8(eQ$USoP+Kc1p|91P_LLuX9SN0w37 z1go=TkKq_c;@w(p;1sJ+Ba0N{fQ`;pXM*K~zRj`(KlSfL3rNHbsGFsBu(t*DqU{RM zmV6(@C-7w@(#<`LB6S_mcX$8H(Th)MKyYy6?#7ZT;%?FYCDV?Y9^^LGfN4% zcfJu`%VO~%^ZESg1}QyTY)rOX{NX; z+9BDOyTmO9-?V?oRPi?f{w%;V8mOas(=)N zjB7NbnmcH8BDnpgegl>`vn+LseDeDs?@lGt@ce-m*juXgGLEN8Bpy3TW26ztq%Wu% zH|9B*IxyO;Rp;=bc_8M+Xym9{-AQK08BUHyg^IhBBY2=>R_|f zy$*7}!OiJR=C?pSo8c?=b8y~na|VJl{ZbkOztw8b;&u=Fg_JJe)K$eTekrBP2^eeS z{40)8FWJe-ShOA1#n!jh8+2*Eo#x3Msn>Wfz16ynfPNAy&89y>+gWt@vO%^B4&%<2 z^O-03btOIsaTRRb^D;D`ShyUO%;*|07pWDsDFsmusHO2^t$%#ZGr+mVaQgJwpl?@n zm1;12lZId$SPn3YJ>HBCw4k_4OQyckIPFvTCtb*)&I&?TpJfNcXCX4shd#mUBfjN- z0A6E}^a1W>fV=-y6Plh0zPa?)mFt->QNfsDCeMGPNG2;X4aUUk z3?~U`rg(=B7xbt(yU$_RATw%y3N2}roUI;aLuIAN+5D`IdZ6%gJmRElC4IPs-krcl ztHtCLPc7)e9QsA3DK$ijji?en%bd!O*GP)0t?)o^wL+(Pw3Ef^(72g0+Pw%{io^67 z?KNG>QzUKj%<|7pWHc=Xp|z3YF7N~8b~yiRF4P&(t%Mk;;m60bU@=NjeC$-h{8&PK zdV^+poRa^|YSCVoz6!zL*NUkXZf`Y>@R@$wlogN*-@|7X*$3klUbslF)g0&ZgyVAe z{|NhK<+F>7;nU;lNh;M+mS5vhU9b1xHj|9{?8yd#Z5}wtezy8#ivLjbBvY&++3 z-cKkJS99r4`CxPg!`&t(30(>U(&g^oJB`90=Zf9t>{r<$?$JTG*L!TM3gRB`(vhl? z!Z#X$CgCDV`T8AJC~G*- z$W!*^9`L?Lb$+Mm(;n489dWJr12B{CXp~Z($IYM2#C}Cn#kM!5x9wYK=KsOA-~D&C z6$PAD=v4_V&qE)OJA(R`8oU`H3f7<-^knFpCcpsvNB1CA67WoeN4akb*OQnVO13IP$x(B2N%g>G7mot8^A{_dhuUW3NFMO=}lm ziw36e(!h$n09NeB$6^w4Tc2veZR)GBOLeDHJ-U`tU9b1`t+fjG_xdkD(d9qj(zp6% z!~H1XJowgU%!9xD%wzRo*z!FV-*>`#4)meu9Ng~C;kIA5#w$%{b*j{N9B~c0@87g+ z;)wcoMdjW9MywSb^w97D7EBKg(KU7P5W?ufSh-KnZH{w;E_C-_hxuPE z0q#pWRlG0hR52O9-#=BvEPKCtfe&)$@~PqjM%vl1C>npLzf(mu^z=uW!*TtIGcwcn_NT zj#bn7$4sR@@DlbD(`{A!scFQxm=>kWORUsEjy4W?4~-dCg7zp@HQUoZi!y8}tuQxQ zoU}VXDxA+?JP7A}UecD+6O%p_&VuOUT*1n?5FLy;>L}b-sn0AiAN5W<&(hvE2qieI zzl`>jJXR=Hn+d~V1jVg8UDhLg6r)K0PTE?TD%$@qmd7OP<+QTKvj*4&rCnOuy&xGy z2q6slq+XmRGWduqji4Zz!wlgD7>4o&))^{TA2Y%FITNg%U{~S!n28+0S5TDUN{|1> zL>@gq{Y^lgpQ-`(xRG|YismQufV;-esdS7#5bcv6X)~b@^x+*^X!8)vrTD{vexHXu z^f0M_>sg`Xhd~Vep0A2k^ipLL?_WVF3e|Nho5+@;O+}9!)b%}mclQ_07E`=tI;TwY zT2gLG#$WeMg(KwG1M;v{nd%KAO`Gb?{&Lewor?a&GmmAYu6x0nQFi9Yp);u(sLy+n z;f`Xuumu!9#IoiAWzH*vGpISQ`buBUcA!eeS7?X@*5&P@nX_*#Le`5 zG6nv?2Y+b5&=Vw|8A8vmKn(@{g&xvGNP;_$s7Yc^n@HtrseIH?dS*j&Q8p>%G!QZG zG4=;7gR^O`q`u_JMWeF#n1h~TWYbGZ{5G4aHR>rYqIWo0mipkQM_hHt=`8g=Dkmy` z&n25s?1mq~jo(~+hKg?^E!NVh8#hCZd&E7WUt^o~b1zv!`+iiUL( z8@*tm+MwPm^;OL`=9roUp=IJ{{U*4407y@*v+2oIHf_$ik+T)U=_m0^f%GU^wN1hu zmh0uwZqRz?j|_aa>cZgZB#j;ttMA$w*;?wC`7Dnf7PC~X%n(+FMskue+4MSrHqP_Z zOb%w6Z2lk&JsJT*)&y9XyEV3H0Cj{O4=YK;#eGxdqwZw4(UGR=l^+MA?&TsnIZ)Bj z2>H&*b^J;_f%##I9$K;}(Ny3xQ3*FaaWucAPg9}w*5g_#AN4b;Nl%7U7_n0Hy|!%n zuC5hTr;p^^LFeR3J?`W>l5xgQX+P$>Liu?u6-{`8#21=khBy@QMjIkpG4b2di;0Qj zktMU@L&E&sP}(4>BC?=1*EqHb?d6gOK;Eew;QvKMJZ!jACP1_47((?d3TaN>9|E*L zQw=cxc7FtZn_GF4%K3wwqI`gtr~$K@c|Tw-+R-I*sq$_vFQRh(&=w#?6vGwFK)X4m z9ecohXr{k26YU6nCSCL@7xkJVf)Ig|M8nfZv-jv3i0{4Z6JT}Q1&EUkr}Jr=9U^1~>FfSVty^3=i&o9}K{H~c`yG(!&sQv)P*i>)13%b8jh#95 z8CODSD_f7wB2})WRHw2|CX`qFr!091<(a`b0UfmkKff4dbbzN?p>Vb$|Kw+>Gj!5s z4axPW;S_iQ6?fYLOR1Pcjv;QBBTNU#3Y3qa^8l66xSW$6TQP4B>rGqgv|%^O;c-CQ zUo}Mhi9*?LaDcXRNp4cM&HHkIwsh7EFzGt#5Us+MGGsodg*tRrJg^_PwFD3UJ#pn@ zxsuHvJoGq_b(d)Cz}k;m&LK(5W@U9^)v0>I4=EIBUFbXaY^7Mi_yDb&EK5%~NX)cc z@|jg~=61%`44`saLHXrQD@e|;ceClMS$>pYo<7-~m_01Z%N~<`vODyo+)+3;&v&x2 z&Ibv59u49_P{v5d%buAvE2|O`2IPPR(Lp!DPa5WW*;!ds>;erAF}x*U8>rC%mBR=f zq$L5xd~t?Dx52|uV>Z&mkP+^gr&JCjDcSg$dfakcSK+y*0iOZ^Cug{RTSE&_bLPJ+H6&|r7PUQ|WetEbEGy*mlnlWB$r258f-Z$keF>-Q-g5o?QGEqk_j7))sB($lFG9~7r<l4@%}G`%7p2Hw6;>Ho=UXjM z@r8wsjso_vX$7y$S|)+eN>vfBvHC_d+$3qCr4#t8$Y#sjx=~`YMdTSA?PY;R{7ZO9 zB66!uH&gw+R4bwFvrKnJyT8Ul(YIRV6%t-Yt>A=&g8O;de)OI23-h8l~( zcaa~1DrQ&d{-JF=;_+L?69FJPcFFt~`(+oLLU}1-6NqE2QGj zRHR1ZFfDx0qV7HeJQqly37{0HUunE!Jqr-1cf{pJAyJkX8_MxlXNs*DFdt zRz9dpX>z9v9Tf0SiULxNfG=uN`aVnP|Cow(0={WTwF18NFJ(#T5LzGMf?fj7Go;l5 z&etTRmtYtBi~?TLhfy&4jcwJ41c<`%DS8YwEVTlb8d8mb(lY5$dq6Pryu+yxu+`M9 z6;PB>bp`WPO9_Ki)s~8CWk&pR0Yw=SztpI<+Gi9{^l_b~0*W%Ku3+W}+*vB1ukCVU zK@Fs8yG*pLFiNZu(AIXD(RQuRD4-}qsx3Pp*e=7kOh8{XNfk!JQJUKvlcxN5p>s^L zoQ%~qT?j`3S8I~z;2R*S)c;JaSDU8Zq0dlnX_|Vse};O?($qWr8S2$by+x+Ws|A!U zlhNxB_`Ow7YM)o8%3707*2)xFe^0SHzhGfEnamP!iVjG7vyAS`1*DxPU7oXX+W|pD z8P`dP+qIhiB<#58g69P+(xeQBzBD3O+-DSUKGrgHDMrE887fVGf;DTZ>ns!ScEd>R z2==I9tP^lmrrnNU{DWR7faU@Y!vd8qrI28JRK`?NNU%A5cmbU&C1aeG0!m+9 zXH{x%R;8-GN>u;Ak5hcBNVIR!LFqax1(aT(g;ecVC95j-8=s*{T<2l|!-fQUe4BC{w zOOd#I5T-1BrHD)BP2YvJy0H&TqjdtF&?HJ?savtsinZw~rfz0ZD=tk}acN42QY$V? zS8>^As92w_V(O|zT71$NXQhB504uz`TLrN#mbz|HKOTXXdGyQfm?j0>Vn{UtUZF|K z`hp$u83nw(52Ijz^ce;Gb00>*zBo_?5O#C|eo2$kJ3h4=wbG4MrqSgBisB@z_JCkN z_8A2%u^O#CAlPoB-EskK?NX!bb6WCp(?Yd?q7u!by0pRP67W((S}wNylTQ-xT|=rC zQ2jy)Evc3ZINoSqEueG^Tmr7}xdhx}NUH^uZX-F#keB-~txU16lociW z%d}M|;PgR?2}xVP&uNm13BjU1qkt`a7zI1*GYWWTA4b6*FpPBq-i^oCbU_;h_@B~; zJ4_#H1r&iQ@C2h@oTLk9Ap(A2NUH^;AEBg6)fMcInu_=luvx377zOhcPFZ4!!nYfR zmkRi2Ls~ANn3=>cJs{X3qwsP8#mtIPupj%30*W0JqhP-=j7tUd`;fBxc~&bbS|TC^ zJktnTF4|TZQuP-!c)%wKc*u}yUe;zl-MGC*z%vc0T0pTm(wFj?|9Mc$yxqvI7TJS* zK?065Bz}X%7vnh6yT9p<+q16F{GO-i@vv_Hclyrj9^J|3^_^$}i;}Rb^iI5yZpkF# zC3q2@0!rkn@Dxmf*NS6lQZXjC3P#%;1WTh*G1Ga6S(2*?y}$Zm6VHjc2SmYr+9-;c zR8?A*K*f=ifT9d?YqB0`Ht~;Zcf93?hk*2(uykR+EjrOp%PLa!Fbz)hNoQz~p2KOb z^E9}~Cta_>n|#te8hpwpC5Hj|T)IO)%c|uc(BRK~k}C5*TeZ-3U$}t2sV)}T5@Xm= z_#zY}4v|_O-q$obNj)b1yP9@qq++_DmKOK>stYJeV8o}Yo-+83Y4gyp&eDZNmw*TH z*qJU0`qcHURD8@-tQGJiT@jWNaF8Xd_JCm0LK>5b_=k-6r2<2UMVwbFP?AH^^v|~;Phy*UpL}Yri5EH_fJi&H3B|oNHrp8ml2fW zuF0DF3Vjba#Rml5V`xRDCnA#gl;Zwpt>$mjcjQws#~DV0Y5~tOq?G(G4*7*)sT1%q zO-dg_Qt@t6u~xu`4QZKxwye~Jt;jlTDlQdJ1O%K-j=;9C)UDLxTF8e+Se<|ya+C$( zcmcO+lIo;j&-skL%@vd?zE;Fnm|8Ugia-)ydqA+8eMSMLMaB5<8(k`mN=Gn}2`J5w ztfi(=X(7#wH%9Aow$ZD4fd<$3BvJKeJ}FtxkF?E4`z)f&O+G2PmKdwjXAw}kgoG%~ z`~656VJ~U{gL73ANQeS1HKdgJKDAbDYOR#CkXmbLYORzMv{tLJ(Wp}=;EE#0E zYLW_0!G1i{FeY0vp~b$Y?=<~LwWqW&qHWhAZqfI2)6`eAjGK(A)dK#|kZJ_H%aE!C z%rG6Q5%5$)suu8cL#h#QnjuvSSYk*u0xmS9Y5}VZsYbwBL#ket$lZ(hK0rXQ=tOwwGML?hh7`Y%{cGlJ`qqx_gIdeUbRuyB|e8v;((BsGWx zi};NFiKpLmrVION0smr1s|9@7kZJ`K+39onbGm|XW9k-gvQergRnHowjsLk;bMG~^ z>I9^pHm6JVS+M`|83kN5+-4N4NmG$O1-!ElqpIY8rm9jas{F__S|gz7qwFJ?w2&r{ zQ^hY8@lu;)Ej=LEJ*Ls60!rT$qhK3NPnQZPdMHM}j|$qVB}@AV4gsZm=zxHt&u8wb zR1p8b0|JW5B&+VgPObRQ{-s|;oEQNcN&#(gOVf%=U0R7asf(T_>ygHLztJZ9vvEpw zj@J52WBzIpbgfTHw*4_(R5wDEz&HY4tVzl^|Gr{vx{9d_)6^E1rmL80snm+g(p5}7 z&zFj`O&{w86ahGvzh`9<0kBWI4jo6qhU) zFk6$9O9b2EGYWWlA4b7m@EMccnW{&v=kIC2)5aXuMtpMRD(6SQ4#lZ z(?Yd?(qqKFbW@rEDYZj2$+Dl)GT-oJORarI&uRe=8q%_4L0{4W_W6PY^p#wls^n_X zcY~2#E#PH_v|5xBOQo5@Mnfp zBcQEB>aZ1A(lQRo1hgxr4qK^MXpPq#p#1mM^iE5ySeve5s?$;{E=^Z4)kCQjm!+$i>LICk zhv{RzfFb~IYzSy~J2kC}tecFil>&+YPOF00(o)mvIT#k|dB1+3rG`nLe|)P+eEX|@ zf8cNW{+_=7UEgh9g6S&~bjeE{FY0IUA^qf6mHMB@^a-&X*2eNX0B|I-j(SkVjf zgC8a`YubcWd1M0&H-m9-ez#!e`XKCr%P}7;m@7Y6YHMRihrZs(-fVu zxnxFU#`MYf7v(*hC$I15nX;}m9&`RR3;wCS;%IAKH)VZeW2%tpg(cELUs)Z|IQ|)W zybsZtvaT~8$M0B28#lzJboZ=V*BP7A(A71iB_8i;nmo0zsBp&gDY5QGYObNn=>C6O zZ*ot(war)Svoxx$kDFh;osXgMVmo} zBVwJ68=`St6L3RQQ@6reJ8;K90yqADG++!KbQAza4S)!KEv}=}N4q*Z+o&yF+R)b4 z+1L>8)Dc?_=?Xb#2@UEtvjGdZe|Z zSvO7U5eV(z3IR!|Vze}jw{%Avnj-WM>y`LMvX81u6%YfPI=eSSScqPe;QC`rzEuEbkEGZHC*Ymz4GB)7)nG#SERkGU9tCcw4zAS@jW{IZWUgMz0q}t-R2$5tPfq# z`;{B<;q~0m>kZlK{c=nEw2eD@XRdzPo#R~}czD;QyAR^qtIL#2eV`O$-)Z9GEoX&gXXg zW$KRqoEBX4?F)iEJ680110N2YGn!fJGlLi5|BOv>GXmZ(E(_!w|FxG z6J77jcc`9M0U80p^%m_16ZUn?KcSx#iBlgyCLxFyw6r#=TANcoU(Mcku#m z!ffw8CmziAhCUp;GkE&KVDFtTpLdZr{z`8>s}bDA%8b0y>j=hgoi(S;%L=|zImi3v zw%|~2MsRlUwkB`k4Z%x-Q@ldhdBuW9-u=Ryi(rKxZmoyDPr1RTW}g3e@T)uC^?vCr z@akrJ`FjJWk7#_>>!}aE-xzH5ezvVXIBaEbWpJVQv=hA2%PI6eU+?AATc1~Y1M7o3 z{wH|PufX-iJ6C#x>b;F{Y<#6RFjSDUHOe*?~+INS8cms<)tJf^U6%GJ=pAx zsrMRh@p8y1gPMaAmRGI(PO!M{{dWV?Pw@r^XFq>Ma2m7Ul8NAody@hexZYB@E?DIa z30@hzD7XsV8TREl6d7B{4EJQd1o+-9g$%zFoHb|F*~Qap7hm-IUhi9%-r&75V6V6D z(giDf7Iu5D54h61Bv9@KmwV%b_12w&t`=2Xr&{0#l@(YNX zb8h&fw`KNqUt0;6u8dBZg4npy%L+_zgL4k7_u8L&d(JHH^FUF%!1XpB2}~RwC?4V6 zy6vf8J)&<%ZE5sC@XPR7R{f4y!KbGryi0=%(DUnIk*BDo9V>!Q2hJK12x9J~6xK+& z#fkKEAm=tsb;_!jMV3`u=y2}r=yZ@O zPE$t=n#DTXHb$GcaheXgqTTH=R3c?mW{>bZMfyNB(ivqDO4gC}(KtQi8Vx;8`@jjwm@uCXAhJaFS!FGC7ad(3saw2o@sbsbo#u`PSdbflBKmv4)LNRfpTHS~71T zVyLVf;n3OK4B?n@U`GxqTQyb-#>P^l0Tv`Hx4}wn4qRx*8wwgXaKAa~;tlJauGX$- z6IC!V*bFyCH%A*etfGkOPDCM`%qE7km{o_S-gva5p`$VC#2ULB;*Bj%M`xt50fFkY zbRv{Hlz(FJhIkK!3&Ntiv4sMheq)T}Hbpmr-W~mXPc#;fs2Q2UwzZ=*-rCUCdZ`t3 z5mGnO2&=}UY=Ff}=2uo#kcnqFJR~$TuXG}@XdEHbvyOtF0xa6G(YU&%x?)~kRatH2 z@(QQBp<{j2Y3<^{)Gnw(gK*wBHE4UsmC)(DxAI)bio zkTcTI-QBPyqJ|Q>*W4YAk~bnWWSs_170_yZcSE~4wF@G<@Q*DUVzG4%jT<&KbmKqJ zp+VLM;@M>#ozTMX5jUk{3U;SuB9cj`HHa~W5E$LjuC|6o)Ku}qqp&N|&=YToP}s7V z#+KH$CK{&A9qbP*?21)ry3_o&RLhb9|Bk7x2Nr_GM&CS_-xLLuNTOP1 zxHR>2O+^l)L>`G?_thvt!z?DtY($5eFa+AkyKoNMp|Pzq7LBNkj=`W>)yX;1+0h2= zD{I!ZHFRu1pJT1-JEBdY#+C-ky4?|#&nueF9CQrg&!l4HfZ+R7!1ovtu)H3vJT z3B&*bhlXQhBl`{n%5B}PuxJ<2ovsGN4{aZuc*MBQZ%>UKl%pOXYEWrwq)awE)#Y=q65L!*l(FG{D_ zqrkLm2#inogRIuj*45HL-BZ(XJA#C}tE?5-(Aw7a88@HNZkPnIxtL}Znvt-3MAY~Z z$gR=TT)V7naSb$Yjv`CQn5Tj0XBQgj2sZ6=&TloC0@%(RLX|bKE(~J_gN1rU!>W^} zX*;*f}w@7R% zuR(wzNYsv%6ONuB{0V-lc5@7FbvQjo+c0aGK|#qL$wf!D8Z8*8@Boapxv6zMS|&Ak z2|+?oLPMnl_qNvd);PrhrlV+E6F0GLOFSAwRKxI1m_oWcw~%Y2vBn0>6`YZ2dPDkd zci;#Wi4>)3$$@Mv$yLoOnEaGw8#~)D*OP-e9@S{*h)@Pn3CLe)(aK5>FiP??!pN;W zpRa4cVnwDm3T#^6z@6xgP!Fs)5RT#*l8osLH6)7aj{-G)`CO@$&ldBHsE5S$nfJy>Yz zsTiGUh|!?u*69R+{h-sF8Sbn$Y=A=^?muNkdb(gCnwqgpQHwboHeeZLGTO3=nk9A1=3!BQ<*e>2qSqMR z_>V#osgH83?lu%tH`m z5wc+umNA`JLDLxOnZb*P5*kw*{1HRSv+&BrShAvTP#trZV%ENGic-MRnAU-!;=~^i zJWRU~46Cknb&b;KeAGZ|FOQ8!ax>)~u1U1(FlZ4bAXy zb2IgWmZ>~k)*Di^Q|A--l@>6F!VTDmw6?J}+*O{PVdzVvdI1%o7_}EzY6TwaYC}5H z>n@J!2)0X@6KNtwfMO}k8=;Vy!)XG6nK(T!tf;6itD+^UJ;77V@_b9X1Z-^75;)$V z`mC*juEUfaOS-XRAWLDDjwwp5!?_z~}jIGGKgs~(usLoQe{tvzu$!@>;=^V8+(Nq2hrTBg?z7CtR_Kieylk3 z7-LsRJLJ~r<}MnN9qS{-MMX}8W_C*EYDJ|NSll&#)@9`-4K%f5!5qP!1ij~VH1&o@ zP*ZeW57JRjH!W9L5jYBtfUP(s>v*F>QB2L`nR(%5FlNX45P8%er)uJI^pd)7G+^wK zVpvOWfY(R}kI=HJ6=f@H$Q^oCYl*k3SR^OPeuz|6%ULjnmn>Q6Cm3xmorBkPx30$) zpAri#6^wJNSq%9C+W;CKh*QoaGz0TofnADPGjry|l)JH&c7O5iI8ru7Jnv>Hjj&uj zf2%o~f<>7mIoj1Cp4Uk8uo1_m7~9tf5(jJ%+n^SOdOm`X7`CM3dde)^irO!GuotG3Y-4aZj>ECTqhorO%brKlr6q?xnW5c08wCH_ ztQBLs6)Pn28AUILlJB+owH3=EwUvu1mekd9P|-%$3>r#qn`q0WR#~i;3^(2-5+@IB z-6AT(EqYI>j%Vi9&7Y4pYAP?PV0|~nI&==EU@#-RwUb>5A5q$D!!jRdP5Q6^+RL<5 zJOd%8CZdY^a2d`}DDxosVO`C^SYEjd+h1B{lNGyrI{XMD0;ZRkny}fzwBIE!q02Sc z=ytWxNZh;yiyqdMcYm^AgVvqcVY4x5!BPyZaGR!X)79-lt_2RJC5x;i*R$`rg%vV;F3^ut33DK`#e%XLuxYc2?UPSgZrnSVuIX z7fPJ`)bz&FGG`)xv5iGVBXn7>t<>0w6&h$UbK*tVMxKB;Ijd=kPTR;uw1w?*)^~T} zQ|(qU0O&wPZP}Z7&QexKbn>DRZK+wOsUhA#EjKGm$4pS@<(NLW;8GJZsv~OusLoGl zQx50RLQa!uS*`{)c~(!!5^H^uyBRPWDc^FBDCkHrsVZh}RN7;QtP;zm6`Q+|clzvV zD4aJ+Kh!dp&jlUIG@Q}(5fd+i8XGz~J6dTTqqf+%oQe6PPwr8~V^F9C{-C8Q({+QQOo(d5b-UUHbZ-hV_Ut zjAeBMgbpF2s@as%2bLMIkD5s%>RA*mJN$e>yF(S&dS%yVVnUd1ayIgL6rU#0<3fZy zpD17;VD%s2_%2=^ImP!3WD~AxdXn`V@7lv2wJdu@jja zTWYNM=rnd6!md&872qVIxA1^8CpgU=PCM_u5P~{AiiJo)I3Mw^wxrgv^bGy5(2-5f zX4&P?^Hv^JY*o$=%{@3xK&Ytm9MdV;bMgG9=O~I}4%YT9w1^;0u+^kKAWt@Sw|4Pf zo6``pF#|n6P(!kh$M_JVql)(KoUqY#35A{$kL(4I%{bPu{aJ87RC5P`9q9Bi^G97bj2cVXSy-@$|x?>5~){54iP95srK5GRNJV>y8i;s2-3 zaxUyEr`*W7F#F&a+`uh^(uv|1bja@aYkB##74QJzKU{Oml1R%A5-ohRspS%Dj}L*;_vl?KQ!)sN{XIfuX7jR~0@NHYid0Bz=HeQxh0vW5d4E_N-wh26ctp^!;JXU5O3v2B z(1ZH@R{FVBYDe-W#Ti{^;E(7!H6h?(QA$^zI z5&-G!zx_?caZn2;bI=Q;(!SWg0kothxMIZQKb*J{} zH!70bZwD<|Ce?Uf*ZT(}@3#R{F%RMpJ-TS2FKqC`+gRi*<@~t*%S@ z55`}z{(C`7mPu8neuF;!b&=0HP(2-=MC4D9Jd|f2sdx07)!d zbd9!Oy)}O6yBShn>`FFG&V3}{@ZI$3IB%<)`ApV7o$kck^?<5!P`~X>>FhN8CAUvw zI$is@zg6`gO`2Ge+gDtvpTw8pynQ0IgxX6l#Y?LR@uymt!a88dk-ZFsn``k)e`%f~ zewqJtdgp)0MRbW@-s6Cmz9d9)q`urihCWG24K(^;6XF-Y3O`NsB!8`r1Kt~e7H58c zaP9>zmzOe|JI*!~l6=u$Mp!}lr^PszyzibbAJX3)o>GF66Ng@LEgpOZA=7Q9Ax6&Htk26P``|@L#L>-_ra#O*=RA!+&c(blTfW zTUr#~p6`eLW_4X;Id%Qe8~dTh`k`;@hkjK*^xl5x-|UBeYd`dR`=S4_ANoK0q30qX z)7g1!KlC&Eq0jDzUeymh+7EquKlE>dPJWl)n0irWBUq=v4f_}PbkdjO9?>?gO@BWn9~o}}j{)>{Eo-+s{K ztD_zc`got$=;fu=!t;thH`RZZq+U4UCqDGf2S47ya~Cwy=b5`aleD@+b<9IPdCLcU z=3$S#uxS|iwPkQ5Ke95E1x4I_wPo zCWXP&S62u%?{`8%pV!yWsQ%`J{dAZf*!F!vjY2~CmYzEHeN~#n8`QK<>x?oK(o|P- zsdppMym@sLFu%CwzhFsK&@P+Aymq3$r$KTJO}~oLho%D2dUe#UV2vOsq#kspyfn_@ zpcTE}&9HiEN?@PJr&q+JY5TP)esY@jyA^%k`A2=Dgz1veP#0M*1#nyT7rZ*u!(bT1 zrkZyp48QfQ2t)HIqAecWKBw^b#m1H1qw5bgyi4wv;E$Nl&c%K0}90dc6xl zLD6Miu*6Ff{PbLXUxwA{YcRa-AWkEDrGG;NQaOv7gvdTpqs02YkLk5!ADshLboCK! zy;%t1{`Wn!{`wtj!SJYEzfn(3&>Ikz0_v4kZd+bI;dkS8W$PoXB_k@J-1C;iW~=r3zJ$)U0$jStl8YNC;R zIhhz{(a#25Cix7?yryYxrb zb($`AlX$(s;y)LBBIku9e)1VzA12YMZMr^9qR&=jCrc|pdfM`*S@anwlXhoW^v_xJ z9*bUL(Z8zc(yuVe=#uBW)b4rs6Zy2Sql@S>@h9|uSoB#IJ%D`zUBpj)68>{6`ZSBa zLeoVbSwqu4imqfkJZ#bDpj_lXXVK5M=pQG^r*`NXjP*BNblh&A5)RY!blVO$ zX}ait21|9Eqe=8?O@G*uWBd1Ai+%xkrC$a5+(qQmxiwwWHJ$V<#h>ugze}f!=wS&Yjh39bpo#puEPgs=F3|jsS#**wa-Qr*&TAH(^rSz!-m>U+Jb!4>?S6UmfCd-Y z*_IQu=x3r#^dD={PqXM}TXd46n{(zR(Zw${7Ja@Yr$N)n2KFg@%%a=&*=otL?flau z{siRFb+^TTA#mx}?=5=RqW>jH&Q217>lKSmdbDTfLD5{tgnqJPt(FSF=( zT6B6=Cvu*&=(QI8Rf}%>>qAYae%bMyp$7ud=}+uATGNy5ImzNDIh*lESE)s}?jeX-lL zBsu$8I)0rliGG8o&#~mJwd5?c=rqTQ{2EIRfyeMiSJa~0`nOqf>^Q$UiJxpl*U==p zjK>H1k@KEKFGqdRb5stC;~2N|ZGlC%^Ur*X-e}3W$f7q{^s6*o{P>D$&bi*A+jh9o zl4IN9ev2Np+?(-eSrB zqD5b5(QmZqtrqX<$wo4NjnQ&{gvPF z9<1rq-%Bj{r&@Ho-H8^R@|dwtKlDnAZu_xb(@7s1nwzyB+blYj$++HR$+7*o$D-Tw z*LN(sJwM)R(aS9TAGhdse_yibwqN8`5wcsGC1;?1g+%PE!_Uc1q8FhKU1K$!)BlfSh=(gWi_CvqRqIXzw9<}J57X7%Ui@#pc{`$zG+y3(OK@;`M_E)|| zx8q@&ri=VMs)*}Ci*CzbX34ST$1M5;)EE1F$&y3yCjXE9MvHFCztxgs%m2AWx8rB$ z2+~&N5_^96x<&6sx#;t4i%v&1LciUj$1M627TunwUe;wSksKSnLOEvL$1FLvp3hkHjo=r*Jfq*M7eC%h z%H#TjrjuCv-0W?OPJ0WH^NB^@V$lcZ0l}3l|71-k`Iq8Po*B9=y^W zmi+~Q^CJCAcr3ot4`ZG4CH*M8rNp1Wdb0S>SWgkZfb}8bnOI*WJ|63<#IImIO+2?% zI9SrdZ&~fY`|`)cdEUi(aeHq-o@j#Lcj#r{{5^U(cr3otD`7oed@}0MQoJhGlg0TS zxfJobSRW$Z2fcw4M567PuhRpQ;So+i%cQ`5!!Vm&Xm+x83W3Q^(ppLx09 z>nA(e2^O4QMfW4~CHN&wpIOd7-dra7TVa3MzQM)z9a}8_P0^pif8y~o%Y7CVOcdw! zSab1JsE-{ZY+;_7sCb8vv%IfOTEWsa{Fde4Ax|IiGDSn^Cmx6Mq@m*L@`Uh=`0Z%0 ziQ*|}q#5ErqMq}`&!9fb#ra1C*Ne|WJ8Tl?bMZUH3t~RqFP?_=Z^d_EyH1IZ$rl3W z752-&IdCu@>G$Lh;|qx|K|JRJ#wVekoDb-=?1x~vS@QJ4dL41@Urof1VEiYEr=fql zit{?;0r7I^-vQz$P=8(ru>OOwz2ham9(F9w8;qZX?VT_2Q?WxY7f-`@SSQZ=+S|lA zkL(sdj&b;{cs=aDr^We~f-j5L!}&ojv=g_B*Q-Uuf5Udgh%ZN;s^ZNst`fw{;q}69 z;!k28cpw{pNPJK@+#=(}o8vy$)NI_IZ?=Wo8;5p#U;J0p^AmC2N82I(0m}VS{Ccc^ zE8ZIGXT;yRF09{W@e{lrK)qQ1UvOWhkoW|QlN-gSV0+`lf53RIosB1m7sh_tJR5H( zo(toohxi-tzT%5fpF!e$9dwj9{}}yD@h7nUx;QQ;BX5ZF@4GD%FNXHC=c;XC`*%hA zuMrRa;6rp-FMcoLH;Z>izi$_R633%2#Lr_q@O{~=&*`w($Z?5pg!Oacsi@B%*?1oG zGxM__i;1_uxGE=p0OPotcx}wL4aDydmBe^?z5K$BFggjZyA)@nJZQ>=VBk_5Vh^Ec~Q+ zcbrG@ugI`{;?Z9bv@88y?5Fnpx-Ik?$aACkC5&5pe%;4^fbkYD-W21%skpr_!InG4 zub~}!h_^z1K6k--mard!Wr)N#$99bt?}YY$QJjATW|sI7w8NX?F=4Th)#4*CPBw}E zf%^PcJPrHHSK=42zx*JcfaCo|@nz`WYvQ@lZhW4E?bZPkWf|<>^w-gzRm8g@K0*8* zcuVm<@Q&iMP@j9mQEVhtobMMMEZ!dTz|-QR@%rmT@yV#qE8^?n`^2;MJMpRL_X;>4 zXS>m>i>G1#Y$v`7`%(97ysvm^oUf*e_dq)g66byS;o^KAZj?A*#~mkL6z7Mpil?HT zUl-57e7IPACDz{&&%pk&N<0bk+sESlFrRD|&kNrnULO6sM|=eO^?*2^OUMxCXYqU| zUKZt^6z`3B<5%$v^w%}!@d{z?Y_SO;SeOEqz#r*UZ68{I$AVp3B7#;JCb5d^q}LyZB+W!(faT`)?aR9RE*?pT>N$P<$uG!%A`H zSuf5!hsBp+Jp7Q2Ulgy8`dkywh54Zb=0$E-Gi+}y@t+WXt9TvMCrO;!)m{7`@;oNK z8vXucHa=dQ^Xhc*3&_7fycFuWLc9@top=V0BcF*MMm_gsK7UC3 zK=fB$%zupk5%nn{z6IksR=g$h)Dq`$gnylq`G;bBBuV^y9Cx~jPei-*5#NFB86>{j z3JR8|#rd4UB=K4phcm_bxjc)-H{-bYzIcD^cN@gNLOpkiKZy1`DBc_SkBc9IUl4DE z^OL{DN3p*--v@1C^U0$aSEa=(;dobBygkNM-E6$MIQJJmhsJ*Y6yvI=#NUMDvVRWE z>Y0k`yT>KICdSFL;l=Q-lHWB*+$J^|+yABjJU`fn3|7~|(lan8TT#HS+9 zS@B(1&x`u9-BNJI_ZdLr7nvN)e#sVDvp#z_lxv_l8+H019kz6A4CKk?tOe+?5afqon- zeiq|@iuh=>&s=fd_gg0382LXG=l$O;;`y;(>=qx7e&=-|+xboO?@5X0{lQG};b^y< zD2I7Cj*E!Tz__|e{EO&li$to4r()ht6rYFr=XP=K?_I_F@%Sjd9X?om4ElGp_>Gu9 zUlN}PpCiuu&&$NupdHqV7sPgL6CaQGz2Yxne4Z8ObD>wnr(xd9k9K8$UBdobTD&^i zhtE$kp3kc#NIc(9)k?e(+OxAb-oPTXMVN zFb-Es{2rV)q>1On`NMy+@k8Q|AU|IhV!1pYIxq1YKUc(eU>?Ya{grt*f0ht0jQOX6 zIM1(Yh^L_66UD1xytNiDiT>&=&hy)Q#k(NBzjz0fJ5rp_P4Rvzx0mH^lz2XOxKo__ z?RVllo)$;>%s&_HcBA-ejGyx2$vEy*7C(V`K2dxg_RrSYc(OR_dB6B^jKluo1F+vc zDgHF(fjQ#GF|HPh^ZBH=#H(SySRuXw{kvLxC&n?KM`b(n{Y9H3el3nuJH^?*`^D2y z|7+r{QEmdZo8_)V`*WV4_p~2^Vcy-MGBgC0!viS3;=Tz|(VX+ZDf6Mxe z#D2%;Z|TiZ|2HJhYRu=$#A7fX-V;BBal2l8GW^qQJYAgkosNjdpdU|)kHGl(O?(da zFTM$x+spA^0qsp+i1-@Wc(OQOCmtt073Vj5#ecy1QSqaw_i1t7Xa8NC?~BWWeqjAy zLj8-2^Lng`IO}t(I6tzotvK(GbQO<7x&6fJVm=urUI+8ov*PTRm&7MwJTDMuo_EC0 zqTKc3yK(*SsrWLi?-9R%am&|v*v|I(g0`HIc;447fa?Rse-?&E%8Ii-mBsl6yt?9i z?zx$GTg)eSh}XmX*fcv<0Oo-~;@qxL;=DeZF5VICJYW1XjN{M6dte?rF3$If zofkih_Pip#8U0lp_o3PTixFR5{4nOj>f)tvTyH3T5bfDooaeWl#oHqPqvEA8Uk!uX z=>fVVTGP4Wm`);VT^{@xjo*}wZ<9QBug8{j@hTxlj=DS++a2TkXNiwTeE0`a{(s%g zadLgxFu>a1ezgPQ%Vy(oaJEAd;#)}kY@e-Uhq-ktk26XzqL;; zjFVR-J_UK!xOi)az3?<~e(vEO@zywR+%Ne@BF{+|Z}rK6@qbR@ry;%&9{gax@O=x# z;cWl;h>vq_Qw*m0NCTHAS}x}ErY_#b^CINA&&69ie1Prh4Jx|905vOE|YY z<18Rp$~(7u?n8W>bBq6|s6_|wJ#lXF12JDEIFHs7d!~r@hd<#Qn;K+`M5Z{mO??6J%f;uxKXLB!eD2(;h~W@947XU@F4pse zi??$5y5wbvzlihys}j%anv#|@SeXAcR4UfFwcBB|TV?0=<2TsB;+j^-`cswv%fkyxA-ZDzfb%#cz^Nbn4h0z!MC7o7K&a&Ga-7`GMR9B)5h|E=ocG35up6?`_AbIX%~JhwTwcpgW( zIk$M;59tMGxsPCf9PZq<4by*Qx^vqlE@RxT5s$@n^d30drvuJQzY>26{*B~mggk#c zw_Lr0FIx)7M!!W^|HT+5)ts|zi%f8C^)G^UZZDn)A1U4fK3$y8eQgwCSMi_mc{y*3^Eu;}#CIWnw)j!_D)G|j-|fz={`O_dG3U7S ziuxJn*3Mm#r(~t*e`js)E_hStmOD8Ni*#~sd3s_zjDcIM?Oy{i{wGL$3gYKUJdc~p zoZEh}0ON3_bIZ?p_+#f5e+cm#oLfBS;T_H`z9^2TyPR7*=ix)nE&fi#{~-PxJX8D= z_!Z}tpY!eYaluNkwQ~R?qyn9)HximCNV+hdHM@8q>relIHTiS~E2|04NbIZf$Lk2kad8RtIF24nN<~X-Jzo9-$ z#S7wiy+%A1o+kbre6Mp~pG@Z%g3%h~s~lF0<7yjDl#9dJFMKYuo{P7BoQ-}=bZ-4V zH%uG3&AG+jhx6xT@j|$c?(W==&lKmDXD{Lhi;u*4!f-h2e-!QWs>E+a{2YnTZ4DAE ztHmq8x4S%c98a;}VA<{5>c0`~dDywtKL_sjelPjckpGm6xBQEOFI)a}Zh825{<*3| z|2ykE=K%5-6fcQ`KuPh=@UqT*xpB^|+}Vgva&GZyVKpN6Ik)&xINy61&VCt&^SyBr zzYXy(iu3awUJ-AAcAg{oJ0br@@!s$Q;)CG7iqD4^uNrP3>%SS^MEnrEw>Y1Jd_sH* zj*tHmUkG0=&gU98iKk=yd?U{1Nv?`lK|M=ig5q}Z`H(8&oX_itUqQL8of~mp?d#m; zpPpeeMg}^!`EU#N(@D-P&t$~Ua&GZ_ZgZ`8N7QGZ_|xzU;)~#M)xv_<4&~AQjhtI3 zx9e`_eqK#=ZuRVgJR_a^JPVy$o~OcUMApJB*5;E-*ss%EyyZ_r{zDSa=VrfmZu{dH z>@OF@KZa*Iw{rQpijnHUO0ZacEKe!>Cs^`0xA@bT=ZiYGP~IOe>D=O*}L2Vb^)?L4}FA^&-}<*@eYV!^?3 zMg05gLeEzt{Lby=^R+jLpTsz9DjxoJaDF9z0r9=XbD*B%#EZgTb8g!(4FxQ6ZrfW4 z@f*c|f*%uag?7$#Zuu7=f6kiW57rLm^WX)YTe+Q)r;PXzcy;HNhy8e`a|=xizHI3R zw^-}1l{h}$>*B3k&d-laJn!?2c5dT&E5`E_@hk8d&aK=&m>=dlw>(L<(*(<6c-A<< z_O5a6xA!aY-eH=^X_w#1&4cTUOD^8FHy!y))e3*na$9{~MSWtNTOPJg73UWJE8=T7 zxAt67Zu=vj zKiuWq;twD`L%e>aupN%U*>3yMZdb)m!pqeUe~kWzehYlQcn|n{ z&i#C~&$-Q4{CwkYoZEbrhJMKu-vckv&}#Mn*GKZ9+*_RcayvM;a{0N-+ei`D6JGXegURKVz#UDd_CFd5;^QBtOExruyt2Pn83*KIQ z5xk3Y%g^(fK5&lP9wmeS43^mvpN{dfP~v(2e6x$UdY(hMpE|d4Isfl*Zt){4Z)W!r<~jV^%vqVi^rCV zhDVAw4!>LdZ9nDbcvo_6dHA_oiO#LuF~OHDJ)K+p5ab`|+{eG-JUahGvqU0qI=4Lh zyutO(eV#+&ZzIo1=ay$5>hrgApC|U#@E6$*e7{>==a%OP^4t!$95zn)`dSBxKZf`R zC7$!rAm?R*JjHQ;d6;v{&v|K#bBk|}_~)HlJm;mCom>2P#J}R);yEuZaBlJGh+iq5 zzk2YW!LmU-6~5KE<>$P#56=B%V(Dm_NP#Bdclvkm3eK&qw}fGlYR;`+G7+C7p5w;w z7rKd;gg@-u=N|$$v-&4uKYG%|Te-2w^RmRVf9E*2_S}K?S>W9Avwz=lZt)S^Z+*|X z#j}6cJGc18h~MPg;@Q7Dom>3lh(9F00{)ZuW%ya=mY@CmH=O;r3GGv-X%G}FY|m-9 zE@%R`c)KNs@JKg_{|)geF5Y&nMZuRXV9=Z2PHn%CZS+?)5TkTcpm<) z#Mj0Bne`G6j%=0q%c#$8iH{Z<{Bua+cVm0M7hi$;`sQxc&qEf5^^;Qzq9>Q zQJ=!%Ul$4E%82uGdn?1Ozv_pf(SK`8{KqJ_vG~uZe<$(nsQ;tl1yP^z;zja?g}*7D zj`{Ymc!xY;{5kPqh|k|V{C~C&ulH{e-;aK2BfbvjpAU;y$4SaqasGXadEz;2&;`pU z;!AP8xmSEV{F3+=s839bFdw&z&#N>MKW39zu=EfgZ5P(gu(KpI6uE;y7*V< z_t(U)VTWHWz7GBJwfIbot4#3}c+r;8YGutc4Kc17h%bV77Vm-j^cNqFaX3Nz2}}?l zil?9-)5U+!ABirP#J|J%EY&LffA&{C)H6|h2KxOz@k{I%@lB}bZ1J}dzfQa+=EF_m zd|%~3@p#N9C&h0?x#z_9p`G*I_RsB23|Avn#p|Jcnu+u8fDROYH)oh=y!gGyvs|2i zZ*{GBVbt?$@u@i9I4zzN^Fx8w|J*KYR^(>!bj%Mm#jj%j9Vk8v^WGHk6y$kV{5jNr zr+7t-=M3=`XrD~+!8owxX!FnQ;`?c9h+i!j#wCf*#dh@---rCe#rxpA>lJZ+Ud(&q zQ*wpn^6xh02v%)~_YOI70Ogz86tf8K-#2Yt`$c8^2j(Hm;T_!&&5fZD{RN&cSpJ+y zVc({sUh1)ku~;8pUz~Z9#pAI)Ks*KOlf)j$6E%!Dv(NgxPOQ3hlQ2q6K)h%5;ZnP^yK6Wqp-OqP<(nF))vhzpj8 zD70FwwTi7)tF}ek$EuH2s&((;TD59x)mG73saxGD-}AoroSB=G85Mue^T+S?dag2a z@B5znzUQ8M?($jY=B%okV*@Dqj_jM%AN7rA> zS3^TXN&fKjj8x@{>aNc!msc)ZzO?N5$l3o0hdr-8vNdOPF=a=(&Kp%kK-uod*7-$| zZ7rh;YPN>o?4Li}dtlxnUN~~@eSS^XYn5Fu8s5lJ_r+hUD%)N5aM|uT56qiT;8os% zO70{I@9u+1?R$`{=^8c4$g`*`G+cxtT@$hjjsG%2C0|CURD`nWbJQ0J%;+Jo+qS3d zVcYE4TA*8Y+3ve5wE)cL+GO4r39SAif!G%bG=7ml^A`!M=_%m0p-r;OcBf6vme_3# z)gdBAz~&hbvDpd9W`-UDYn8y=>jluF%uu~`*4-rHz5eW{`}WCrxEmg7+;k6O+ap_h z;rqVjiQ2~4^zi6J_@s&R!fmy!u~R5kAFgkX$Lf;p@eN2egd3V$VyB=$*ajm%H$2jc zHLs10gj`)W0OH-`*Mt+v+IaHJc+7q`#%t?h4V^7#CX($PhP}J|T5ztwM-x6;@KJ-0 zBtDk1KCCt?hOg=2`dCAATP$2_8We75kB2)Gv2b%+ct&-@Je!B6&f;d0{t2Tk>USG& zNvDSs9kIIRh7IA`ws37rG8S*EO@gjD*<9NaUK)$9jm4L=wew=^e`;o7ye%`LU7sRWg5t!=9hx4@~|JCamuB3ztoYEFbZX!xLwq^Dyc z%Si1557%1{|7&fp?`(myk$laUs29G`8Lvf+>CT7dR6ZFd*Ppk1!Q$wO$fBjomXbY9 zzjV~b6S4YKGsDGoo$+|AE!nam+}=hXYn$3hE3pE15b-VTsZVVecOuNwpmv^skmmO!iJ1 zouENp7jLGqUOc*f9L-Q>mTI6rp~jJy$nYcDWNdwMLO8ab#$#J!U*idOaE(ob7Z{6& z7t}U3*M%1vS0SR#>7zT1pp_#>tgVmLPY;JH7cZfzCg6MG@@3UElrVC0t@G5=L_&2; z&nkyLp|a6P<%+6k_2L!N!o}5#*G`?-N{u7EYwPQ2_DjSPVWTDWqmj4bOR8$BE9cZy zMHg2uu9_FESu}sC$&V~sws>B2$)ZKeW{&&4IMG2we6`| zvZ8892I;0`vZKBP1xI?VwaslMb>1R7N~e3Z9r0*KdwWZ?j^@f_tazM3s5heQK+R_W zG_|IAJf3mA4rJid%m4{5)*6d9dbKUFc+!J+deka!U2VM0Yimz7*TuZ%wuW}EKDN5E z(VJH_XZd`OJ&b27IB{RWR(CeHB+2OvR$6jYN!d|eWxTGbIZ118XPnk$%4(^fxVkx+ zDwCQ`)-@-aN+@^l zmsTyD2a9(D7c8h;?8VwJ>(!4-58RQ3#izV>dKnx6Vv68yLee-Nmb>% z47sRk(Xt5oEmB=G&vPa$Z|?NE>GP)7Pp_IDo8B;e?TVI~bK60ai}YwhqB z$72)G1?g$f&H&z0JH0GAj`}m2Xl`t)ZHZb-c*~9cm?PRdVr^Jt65iZy9LJbh#9Qsv z%6O?fq3nsu73PBBSHPCiHN)lf-F4=u36ZYksBmN(V%sRz?J{Bu$?(2w^X{(uk_*f( z55lKKx*o8Jt@Eh()|sGZ;1#sx%wBN>0AYwUR(Oc6TxHaWXk-Wn|m>P^9ZVP)E8-8UK37 zFqjnSJfUlDLB#0ZHMc0TwVb66k8C|Iga$@Xc5XP*WpkfwvW zkvl`u;Iv2@W1cU}>iSDJNxt?YrHZyLEr4E&BU_WBA}OB5usJn&*{CULeKzmz9Fl+A zyirrmeSP+fBiB8Xf7|YTqwa^vXKozmd->-*8^C3vy{@dh3mx+2txS0|cSa3Wv+~U= zVItcTk*)_LUGqj28M)27^EV$yBo7+vfO${bzJ2>@&~JO{DaIaQNgsrOx2J}10~k#s zUH2MSaD5|F#vOT7_Ri}!miZ>PN0~_1{kE2_Jw(|<#$3y$(MZ=LT;ZJ+#GB4w)cBg= zvkpu$o?B%)KOOrVlC;qOUM#Xz`mCGL(SOD<)4dkix@=TYq${xJ-v6X}$aa6Xe!7-& zE#NR4wxbPP-F5$-O=*TVFXnpRJl|v+b9~v}b(KGJRFNrbST^rYj)D5!p#05mP=8pb zBk%L}d_)(4HVG%*^9Cj1v5U7xMjaI?%D-?Z)TB{UZs&r3aLazSAepd91{&F;O69?cNMAVUez8(>AQ=m z9mY4<0g2yU-%_TT2aE0uLJmo0>dd!I2EOOtpPFT4#wci1+-| zNGuISw$@Msy55d#J%V6cXU$f+iA2+1P1oDjKIy1QS8aYZx!~@}(iFFmVd6+PjVG5L z9ou=j)g+gs_lzP<(!(V}o-jDoM^pDbhPmeok^_lM+i9Ecac!Qga8)t(on9 z&9z4U<~<*aH}!@dS5ngL&hFG>dQe9|T}sr{`%|eOt*J=M3KL5u3(Oj9l5ghOmYsWl zh_k=pMK+&qt z7Z0H&D4x}JoikCon^iDg2qPzZ!{|)vo%g8eC7Ile(e`}(-~0CUFnk<_|0Rw69yu+@ z`F^IHTI8HdIWX$~h5vtB;HC+lhiT69LRbep^MQyC0Y3yN5WoQU0y*|8WWRjOK9pzn zG{Kx+&23395Hcx49z6F%%D2(;5DnOZy+XO6^O3X!R^V4hifqnPv(mCIU#}6{L?(Aw zDMgJM1-;+OA^nY>z2ClzV2Ecx3&z!>hOyNFY z>+SgsB$HzkzW*9gg=`{Va*AvlL#4QTVp4+TD^ zNIoJqzyG*iG@8@$1Bwrzbio+<$lpjp`Pjh?w6X&ZFC*AkIx?X2_Y^l)955MCj!%6G zu*Ii=pkPpQTfH}+990$#qI+cCfa!=2vobRf58L=G#7Eh9#h-|$*v98Thf*7#2bppk zKL+s`HXcE|f*Se=$>xUoQt8|f${DNVm26K%%Tv+(QlIt#rajLVyni-H8m@v5z{T-T zHX&;9PZ2M$@&6!RWaFP9Zrf0>5AkB-5(S=*M5#^qCQ)t^0h6e(i5!!N*hDXrSZouy zCb7~cLjE13;b}I}*T07nO*YZrI8KL66qrQPCIFlT8fut0?Cjn<(<{ zC$@8KVwnFlCAQeaXupNTw%bIBj}E=uCMKE0PMat-i5qO9%p`W%#AM^Vx7);2quXwq znC3rE_58*wBu=m33eycm1v}A5Yu0NJ<@gWKT<(S+p?eCbd$$ml8$urrhW|tD1J+Rl zD0jPYIT4+Cdy zqH2qrfi&prAfw8N{ZLFArhz%VhhsJ|<$I4fm7*fkc@oJCDd_#=F9{rKiani{LDLeBG)Q(+S&InX*{6H`p0#wMoaj3qr6+eEoZth9-lIS@I` zCT8cnNfU9CO;nmhhfT~iZ0l{J$|TOTiHK>>CYw0cd)V0=oMI-zXM6lB4jPl{* zr`g09e*)z+c|$@)$DKjyo7tvl!6m8aqMxUtOVZJ0&!o^3y#7+`#Nib6^3V?#QGUMp zKo3zz!1%c#RAKT#mCiT2G0MI|vO%x1Mdl8XLA{w|MDRrsgjS9q#y-`ROQ`Y7qLa{X zHhRa=gc=tuF1m9&#f>`^-IaFHqPs@}w)k!|&bnyPz2LPjT6BLuxSExD2xY^}|F7=} ze`(P>dsF=HBFc5WmrotS{2u^k{(qw`=Ks)eTK*Q%H{cI0cY@c8brY z&oS#1vTXWXl|C<(o@&Z(HtU?f)JmUk_TK5z-!vQZbb3oFZA*8Vba2P(8*TamPVeRP zR!)DoaUAX~`WO0WXK=@+v&P5Qdj2*a_Cy#@Z`gVMMgCl~HhZ3>yVxij+_B{>tKN2h z5$7L)eszO?i9hf_+8#79KJpZfOoP;s2~L%7qzDL)>|*4|OE_|r&@JFdNfGVcb{hHZ zXHCb>N5TY-_OJ&;G_~d7)k^{!kt1wdXg^k!>?0Ag6j;EW9DWM4@^mP&1 zLMko8mV-ph4kRsiGRa+Gp1s9}kTnk7 zXo6qfwqKM>j2m{d6Sd1yP5<3~QFV8Arzg8xaEQ=X6pobd8~Ym+K_(xG&NX8&43drWJE#yTqdWeu9ml+9P~ zw*o2Ulh1$kvgZvwWPcl;s(1U+uU__&i@$o=U5|eCvcKp}m)85&(W&Q=f(KXhx;u2kt1j5a-!wN2f`KKo*^4q_Wmi$1N(JuQSi%apV=A-m%9WT&QO zq2)KS$#xgJHmg`_tpQs`4SCzrf23?|%gqC);Eq=}&hj{XX8D0p|I@9djk)QbgyW>u z!Di}6;xhZf4YjIqr zq->ROm%B;VmgWb~O~SJ`)kUybrv36G*_lR=MP9bqfp0jydNeFWW0!grmj<*&-st2u zQ0_rC*ZM}vuDH#0l+AJWB&lq;&SH~I7su)LoKFHxTpL}1q{OeM*!hfq1E$BuFqL~Z z#je%4l(yk1%1wzvt@o^GS}o!W_MIF+GYz|Nf$XRNqd zgy>T31S@OIhHDPDK@%x|UC;bfle*ndUP8jD_I*IHo1BvAoD)gxev`w)I8_Et^iNwR zxWhORc|bN78Zbt=e!2#@%HbwEo2$&_T-U+S4Bd~xi&D9v zY7);49Z646azk}}Ja0B6{mUuO2AVod@UOg*Br7=OT~0MoE#15~o$x$+L+84{Uvs4d zKm4Mkf90b@Rf!D$dMhypiToSzs*H{PI32w)6&+%pBO8GsV{wbgMknA2tBp=dM<=JE z2d-L5>_%W{B_6X5Mx*D^7@TXhDEedIC`!2+&4WVy#`w6KV4wI@0U7ptlX1}S0G?sk zm(h+v#=#exw}mjU?Ze6WKo7hgH#!VpWbFs;>*Sj!>Gp|E1fqfEP!hK|^6^y2O4|Ht z_d9ovdhPZ&F*&xvKJ%UeBj<){-2=D z3c|<%0MMHwgxL1q?BfQ8eGUd)Jlm>T+{v(3F^%sRG0*>S6T-?~30b4-Aw+*aW zY+Fx2TXFU2HuG4*?6Wk_m?Bl?IAjdI#N6+)@oP-H8u;*&P=SetV~ExOE&4QIyJd*k zOkjU!d%?8AC^2vYEg>E@a{2HStL}*CCW>MQ=rr0g{+k&OGK|;&q#5%sr&5+-U_02b z&RYgF#kA6zv}kVtYrTC?X^dQSKoG0EMT}+xV(6xS12i9|n+%V+*_j)fIhHFMupW|F zH1mO3g*Kr^yn|>JIAD?a+l&W{5Z0=ULZ+t=>+9Q&85YFknvcoCR%Eh^-U}M- zMlFFwFb_IZrezDzveB2q>}eOFxo)68IDI1c#iZUaa->7JAh+ny5)y+p zV-E})0}St#G63y}OZ?dfN`7@=xZhOMju9n(S>Zr`Q16PO%jOtlWG}C*FhD(Un2At3 zM|GX!djm<1x{jjMS%{9gfY3nEjyWVTmaFbH_P}mj#jF8o2*zQsbQ@7r+g7Nm>Xg46^Zd~aD# zXsL#D+V__Cgih6vP6xcwt2O4E^|u=u^b-D;k?U575*d^Vc%53x3wk?Vz-s)tA%j^0 zUb06K;(F{0xiUBVWKHIKJ)nSBmcbAi#4_2nhnTLgFPVZvhFW^`=6;F`wS0em@u-N& z_kM~?G5OAH^HU^SzI}Q}S_R+BAoUfYOj@Yw$ZIpGu%f5bSBAbK{r{i_Uq+>{c_$&j{Q)N z&Hlfo_5bl&OaD*VVFuCRGB8y`UT3pDUNfzY>G~sYQjbo zByEt$q31*$$fVA|;Zt-#R9kyGiL11t7OM6`{9kiH+8e?=EBAA!}XKdM&QIw)o z1sSdxthTmj5+^n}v^cLZY6O^sdI*O@r7(NcRTF+E2qmdPI%2N2g&2F&Jv};4D{2nX zG6Jw$w638s8IM5`Dq;leu}ls?2QAqY=}G!goU}_M<8)w}jiaVUI`b`VDq_v7Bqe5; z8-ggEk(JJBtv|wM z(5)alYf-hqCw)I$wrW*ya;W5%ammo6yS+e8U=@A%7YF;j6Wow&4gEIQFEH86Zjw z-k1zt<*z)4fb9faMc<*4RTC!#`<3Jbg70h$h3U4>xBS2ae^oGk)%%B+1@jt$+x)AJ zj>Uo>Y@D&`y1$(`e|BWns%JWP1TXf_nHlVJZ16SW+~FUa2=-Zd_1{7>U+G-+O6Q5w z*Pi%IG$?dp= zpBWkve8dYKdspyspsB&lM>fjY; zg|>$pgKv<`)xkt)dvMU5*Q`2m#fj+6N%%McAIG7}6M}uVKmC()|NgJeRS(Ymy`j81 zv?X-yH7ABH3%-2jRl#k+tAb|`MQ3Px;2`QiI$)8GQ}pOJsnenjE$!>fk#A8tdoi9| z-Pz!^lb6Pu>th~{ilfu<%<*hdJ6h;uxCTMuI59L@y@-y)t6LLI8V9#yA9F^up^Y%| zZ#pCqlMBw7gG1NGzZ5Yqc~hO;Wg7wT*%+R!(FK4IiD~8cm(uoA9F1h7Qvk(YmHJR^diEx|BT3%%9$}%HyiaCQl)`&S_CttlV4Q z(%eejR8P{>v7|^xZL-O9JR0S7if>uV(ixHQ&N}Pk&S{KfFZgzQryU3hvbSmXnpmuZ zyo%1{C0}k|)7cTFaZ}sbLc5giMl(x>QK6$Yk)Rc>9@cNJr;{G3Bpr-vKDxOP9}-AB z4bAI`nZ27@njm`meQ1=eZW~WE$75^^@^de(8g=k`9^+(6>0X!vy9MeQ9-j7iOiJLu zN%9?Yl&{g*j^)<18){pdDT*0lHTf*5y1F(2AG8&iu|;-kZ)l*i zT#1~Hxr`^dPCJj#L5g(3vd4W(V+Q`xPQ6G2v&>7-DVA+sJa&3CHDj464Kzl9Gh*>} z*qc^OxV<&AIZBg8M%+snPcRlEccKz!#HjW}Eh|p(=vuQc5f#&?XmZoglnyg_m{uCs zHf?m~O!x==ZVnzu{%7U@6oY@2O+$TfYS_Z4$Ma{>?I!G>jE8l!!+mJFT1_oPCsT2F ztpUwRrft*?8Vjw2W7vC%HO(~maA-Bj$SAChH?A%9jFn>6BZ;!xd7{KY{vNAs<+C}B zel&9Hyt*bb+?U%Nn`OhpG)GgAIepYHL}@@-C*Zcis~qjjs$#|_iJuS^XgjK$?uM-shpqgCNrti zWar_?Ve)-*v@%(Uk5;AuSnCWxJAK1gG>&OfBBi2yY_sVQv!-=)CeRg_T}fa~tR77@ zrzJ;eLZp*Y;o_adkzUYD5(C%Ff*2`w?J!Qn%MYA9Nkgp6d`>o>Q^@UmPH?7mW)3pt z;Q@vhgVA<3Ez7A{)2z2xl4v-k=gzd{8=7M+WLol;1kEipK6vr9POm2`YEx^Xk+^t* zoiZ7grSWVuAgkDA2qTy}lKhU&JUt@@Q#3dOGYMy*8O)mBv2r|S4FhdFP$ul&0CRE5 zy?Bn6iJfO|Td^G@u{fb||INB(cRXg-LQu-+)OKp09me$=s3FaD-F7Q5E?vvm%@Z}&te$4cCMS_8I>qLZ zC<&Ri@$>}(v-s085;b!I4K5n+W(?U0hX$tUlsaV7O5MQAqy3tKJzHBH&D3>td@bo7 zkC|DRW(4fvOpEGinvb_{h|-zjcE{i@3Q{R4(m`VNogHbfD4Qk&)acCKV5UHxQqxP1 zS@|&VFg~pR+9Qx*O)&-OX9lp0G|~_T!E8&*y>ktQ35~AfyoTmD4B14xJkvPZ4R!M^ zbe3JJ(Nen$g?>igMaL|pnX>z7z0{*-L||QEyBGi)4_ZiR1Yp&rL$hg(L*vY{M+-tH z{&0b9oAEq%oZvzg+S%!irW;Z@DHr@uz}=EVUm7X22gDKKG_TW$knJ3%Y-+glCRTFZ zDw31b)8=JKn7E~=9X3&;N@|IMli?17of^AsOQP+xZ|1e!w2|tKV(!AM zX3lBGz&4XK`U0CNZeD9`!qiOmwtIc3Av;F&y}M;(7wBez^eRQ88yg8@P!@p+Qi_`8 zE1JMn4i-+Mp0nG5>tdzlK{RbDSzSgcPFSZahqij!M$?T3GM8zYotChgIGsfclwBaq z>`CrVc40p;gANU(K5LGei+%BBzEm(e+D&#!Zwv!HGh_P1Jq|j!n=YzoS~O0dUg0pW z(GpwNB<4x2GiV;~wPjeCeZSr4p%8VDF#_+%*re118ab%a^ryXqne4@D*I5OqRqz_( z#+8YY?!-uK>1?G-z_jmAqxsf7@7mbM7(3e8Mt|r6b1Pp&n1#%&xn_KL^XJZ;9xh(K znoe%-w3kg2CwH1u*~YS|C8blxS=3AYxb2K3p1+<>Txw>bu3PF}%9fvUWsZNWKt;R|yr^NP>!Rhd_MZf{5#+b!%*iXh5c22e9+OvoZtwYdkNI>M7`;PeO3>>!{0$v$=6JWKYbA*d zt+e~}N~kaFcay|ue^Fb4zZu|_n1!-rbt2)F#M_a8cv(q#_hcC*r3?wsc914z3)xbf zFvq^r%s?l=m)Lmi>ecbs+HTqKd|Q@9;VDk(>lP|FrEl@0uiQYtV8h+O9%0v+7CMcI z;ajLj`jTFzF<}gS0#{EGye%5A;zpLE<_rD_PA&dr%j3t_sNcM+OWzWt{Nu_nqCd(Y zRM5Xn`KiwwGtI{Ll*({(~FC#^3wlF!c-N6(BB86 z_pcCsh7NXumTjlJOzq!wg)OvqhW$qU^paSQ`Zp1#ISKNH&%-CZrl-iY?6*lqV<=Z1 z!KdeaAB}c`mc5AbR24>g=QFktPQyTe{`7`q5B+~gnC2wNd-`~MTK}{$`>AEGA~;k1 zH@soxxf!N@_@4N`^xrQD)0`-I0KXRniHgc`Ti^AWh%cG z1Czpd`<42Xa`Fu`NjxP)k)2%L#SquB`xw*XU&`-BAty-t1^SpGnd}$-r7Ec793N2COr?xf{)FD&(4A`%z{U=;PEW@1zGT` zv*5R6!GD(pf0pn;wCjOi@C1uFMfO-ANt z1C)iE^y*GBUKYZuP;^JdJmQixn%eEIHJMy)(Nb2A`_E{*ZIwJ?B3@~@JT&k26o*(G z5qZd*dLc>f`hi&82sBTmOuvv)xOXqQrXD)r;e}Lg9@bGZ!!rUxVL!Q*?cT#hf$nc1 zP+jgLhfMdNsZgfp-3HcoQlWqM`|m*HPOkfQh-qp1kuYnPe)B+7b)LSY$kl^&67BiW z2<5v!sY_L1UszL5e^Sq?KmTc)QM<V5PJlKCB2+wII<$2HXH*lBdWyUqn+m1ZiwVl)0mmz4L-n8#P&^&_~7kR1sFooOF zbiI;==Lkn0`t0Tc^Bi2bkyV|AXN4mVo&rwC9NgvkS{9y8M;<(jIgNcHg0$DBJa20j zo=Y5g@NDPw^$zapb8{A+I~;lNJj>~a9NgvkT^1hvQXT>NgC~p*rLf1rU7mkt;rYao z2Tv38;4i-*X#3g~f*ta4`yB_0ojf1;9$1{#ESD#ZI zdFX@v9zv^wyFB;yE0}*M?;kw?7~ zxV~u$FJXMH!?T#=Wqv-|!52C>-^NebXC&nz;64EYXz>h1c#Z`~0XXiN34Q`V3cztM zOYk~?6o4N}{{&A0q#$;x28R2qJ%^O?toMZ?tO!{S*FY9DJmM|J}h4b8uOYz!P?GS&yXNMU;oo-W;*z22d{DPu!Fnn3;b<4{X@Xt|3T30ZFlf7lrQyecJQ$deu0C#@;e>8 z*pa`^!Cm>EIrun79tS!gK+o~?PxLW=N|*7&9sCJL9*=TF{_l*7{bk*H(~+O($m7qP zA>a-p%19_;9AEf{F@rGL!Evun>Ye1^hzef8xaboF355lY{3J??{7DXuz1WAmZ|rn% z*KTJxIG#BQ&)JNlUGN9omqXa<$WNxU$Zuy{^xR>j=}#Ou@>3l7YaM*5ga26Z$o}$n zN8aUm(2>t2o@aUdKAA-xe`gs1Uq{eC(f=g}pXT8BLqiB?7x?8C_P-r@SD#NEdD!g^ zl%aq>Cx#$AbTEYp1&pJZ%X5$;51!pdnhw3lB7eA&e~#tlJ_h(Phe>;nQ1b7v{B(uq zu-_k(rQYL|Jnm;AEOzAGdY3Et$t-_j7J1wsLJ+$xX1lF%d%vGW{s&5aC(B=-MgC?b|18Vn zJ{f}cliQShkr@P@_upCMcPshDEPsC%`A3xedY1n~7Wt=?{0%JsTo(CP92{*E|9`{5 z-F4?}2Y2VgAkQn{D0g^Yv=kqqk^?d#fN8TNG=Qy}KpMO*FTt{^ye8-V@d3HLu+uj=$Pt4MIKXc^W zb?{e8ehtgtn??RH2Y1)azhuGt^0>llp~Hju_7AM5%tK-a z$}-`4hsV8c`h|nL{eGX~?_i#X9C=)`NPC}faJL`dP&{%S^0p)I@_gjrE>C}+Z=_ut zSf7E6LwDB?@dqOjfV(_LIymev`p9r=00Eq247mqdUrRrF8r zcO3i}2mh3Du|p6ADI5eRrXcucoAib=4l!4M{7ps#;I94)9DF|Ii9RPVF8o8e-gS;V zAdx@Y!SSAm;O9Gd#KE^a{MCd@xYUt%?Q@-jA4|f*f1iWHKjk{&4-Ou7O+aasGI`Rco@#W|H$K7>eo1)Ss-XUY|u0w<#oDP z;VT%&*hCPXO2)BwLJ(Z^sW50yJdy=poCRN*1wSnd-lXu!tY?S9MbGtF@J(6pEm`pG zS@6rV;5!vQnDx9t;iBiREcopTzkvN@x59c`5fX1g8vd1m=v&fAP8Q;#MsLr0MDm?1+2$tfE0iin3(;* zJyHbW`4=mKYc~YJe>lLVv34T}F84_)Eu6yVGEYR|mod*Gh0kJtI7Q(N@6fXB=exmSV-rwA+@GH4pzf$-i z%rEny*m(o@`%_B3j{WK-h41Bh|Do_f7{nB0eiQyznWq=~i{PDX&w&cx&ic!JL6QFx z^NdsStd2KL;oG>qaz9Ua7P8#&O8yq^uag!2KDVn;;iGu|+@Nr||0d5hq~80jdAuD; z9)IW?;rj}Ioa_Cu!Vh6P;QdMj;Xj=5M-_gd6-(`#L|*XcmHb_7H}|~6}Hc93YYr`_bR*(^Z!-hC$j$kQ1}ZhFV7LAU2}LG1=t@2Z{v9> zPvPgWp6>GkwCfZ0e|cUYJTJ0;PF6h2xF2UJTz;o;timJAvqIrA-s%+oLvELQe;#_C z%69pNl9%gAyzhx1`pbRE%M>op6|Pk{{*VTO+}{?SqgkK3mHh28?i4$g`dOo)p&(Z;|0vUe+xgaierC`LiXrRXVm zRLPgIoxi5=KeK(-D!ezR&sDhC{W}W(n8(pI3O}9oyjkHVv3*`wcp2;Sp2C00{Bj>v z+B=5ZHH_^f_(ty6v03mb3YUJIt?-Mvzm8M*XYA*4e^u)3#d38@Ui$S6g+Iu8p0Duh zx!!Lnyq4{AmBNd8p1)Dy>llAT;ic@idldd7#^29^2Uss@?-tf4U*Rj*pAS>`O75=` zg}==8PS1kRSGe@oGKIg&ep9P(S@+u%F6;i+72e4H*`@Hmb9?1}sn|jAA1L|RZ2zAr zT>9lMh3{hfJgo2;oc^Q2A7_1DQTSfAzwF;dPw~(HDETR@XJ2l&$Zuk~p$fmoPCwo# zg}=pknZo5yea}*OE3b3MDO}#;T&eH_xm_`ZU(5X-SNMOJ|15>CX8b~h|CV{atMFc2 z?~fEN_fLPWaJin5e6i;bcwGHX$=}BOe^U4`PVZCr;mp&I=ON)2yh!2VZ=)5ymB-y= zh5rnM6lN=2-lJWm@b7WDUg1YD|3wOK=k#~8;MXa9H>Yn=_!_p`uM{rreOTe2a=V^Z zxNWWH{Z-*If4!yfE?$p5Quu1tr$5&t{gTIiRiyBKJbn*V_>(;DMk)Lm<{z){Z*aO) z;V-bCOjGy=jL%T`9gNRW_&`oa6rSXEEmZi+oL;8zci3)n-GglGf5a}eO8yDfr$yoG z*lrsXel+*T`3fJ-9sF&D|AoiZPKE!P>-~wsd-1$+r^4lZ@dp(ye*2WdW&QfA!XIFL z{;6=e4*5jkGG86Q;|$rbXK&^isql~3ukh!f5JdhD>{oLYzKGYOg$lowc~&X>cE;-! zemCRo3U6UMkKz6leO_QY%YIOBc@8~8$;)%8h{7-B`j#pDYwU-oDf}w7TZ_Vf$NRMP z3ZKaG=P7&{<2w{C>(iB4@Ea8V2KUP^6h55$Ww*ljvORyR@F0(iXB95?c~#-pv;O5= zzu5mt-Y3jc_(bln;}w1;%b%)nx&I>bxA1?){k2}ni=LYmK9SSkQn<|jS1bG(=D%6t zvVPy8@H?Owg$EQa*Wphp{4TcROA0TxG~QbZ-^l&)vBH1D}w%?jVe{(P6hN3#DssPI4YJpU(!&*%PqL*XL-3F8oBRg5Ku;GqHqG>4mR(qkDH zd3Hl@s=}pArNRdr7WzZk4nO9@&D`&&DETnUCzZU|^DGBPop|>b;bw)mSlGKo@eBU2 z!mnicKRY;gxycFe!xh+pyTssy4i0<%+Mx9NG6#2gY8)Iqr7VAngM;VqjK>|^<@t_- zgXc7szuv*Y(+>($xXZy^o|haPJll=5=l#pU!83t*a?yDdkaT&*D_ruXIyiV1Fi*9E zi!69s9US`X21sF@gM+7yc`kHtmuHuQgGZj1-Ra=qxtMwW;NULLyABSX#Vr3H2M3Ql zFB~+85)>fj@=SAZ@N8$E3I_+zQSK zynbD(@cwN7YZTs__X)pI_y9J>Zx#LsFR0Hj4*T%dgktp9-Ictw_ag@f#iK^r^FDKM zOkHA!KKPLy1zGop@_aJP!6Cnl?L5}O!C%Mn6C51!uW`GMba2SabIlnJ4taT}aK3{> zzM1V=C3gxLtQDyqxua)xp945%<@73YYudA2~SceT3`n zGn5h(WPF{&`^CWy4t{yQe+c8^pRA@g+L7limEk?Y!NIeO^`E8iJ&ezFaF?gX!NDW@ zTo&gR#zp^XqowCvr0|m%|FPmZiT(WNO8%QH|FDB&o|Jxn-N9k{g)INR z!lmB4A}b(zUdZwXEBrf*Pg3|?#+NDlM~t7T@W&b7;oxZMe8#`$;L!hh#&1yg8;tK( zc!1}PR~0V%w2vGd^)6zbAioGDc97>RgBXY3!cR7_{1^v^pL`Q!6ecMid5`fpg#yo43{0~|FYzK$v4pS@b`y3p0yMg6zQv3t?LTi_jzl-G`aB%Qn$NWz_IQT_= zui~G{{O>DynLqm-WC>ws`0cYipA7eG4t|fvd&0rN zFY*^D{!5wv+e&^g&)YwCaPZ6TH*a%r*zFGbhj3pO{0Rq#KEnSN(=vp(-A`SGkz z=wMS#>bhXJO?rnoIQT{WD1}dDo?{&x`aj1!s~j9WBA;Yj^n8o;+@R#;eUXbD9Q^Wo z(km7I4%d5=gQH&Ic~IfYSpR1o9Q^WJ<~0WgkH`my*@|SmpUOOg9UMIJyVS!R96TaF zi*d2TfyksVSIM_C|0)NE|H$uHn;aYzB7dI3H!#no4h}u#eYk5K96TbwTjA$2&*Kgb z9{JttOAZbmk^fZT+n8s-AtXcr_5_c-=Q+&5!6WkJ3YYhIsvR6W@}BNW2M3SHCl!7T z>$BOxVP|=N?-BB%v=-}Xyb+Z>g=n=cgdN)YnFYvlBT;a05lqtNG*P{iD%ebyW zgkt~0*!sYin z3573Y`ArI!{@tc<>6a@Mel7FdqVS(H{(A?9-D30);n}eHO4;oJmVe*DA-~3odHWn3 z{V31-hK;ZS@N>v_*ra#3gG2sZo|hsH4*4X@pWxt-KLCS_Lejw@zrmoMx6#2Ne>Ka0 z&%q(TiRG_zaLCK^^t&A#@|#)yVa74Ou&;iJ@h2P{*N=sKo%piD1ODH!KKm3d@AnKC zX$gJ$g1p>cEmwFH0u&ZFIP_d@P`VG`;NVHHd_v(DF@CYaXk6v!NGGo%O9`s z3ih{Vh0D76O@*Jt^4BT+G{$dLxV#tmpo6=5zNzrn*>3MUIP~An{QXDU7K(lDVtj;y zgJ16FAMW7b`3uXJD_q_uS*h^jS=sdp-^}=Cg+X{b~ z<#WcQ?EpypEziNx-p^Qmg2D^=x@Mljr!ao9!sjx6hQb#ze!0SzGJc)HPhtF4h0A*d zk12c`%kNeA_Za_=!gn&>cWl}|u*0p4k5~9_7+=9S=55T+(-=R+kq;0q=M5zlK08R6 z6gE3}Z%WJgb>C9>1dvhqKI2laTwmYd$V0S(`R`Hk9~u@~R~6pY%Vs>IaGX<(@Up_= z7WUp!`1{QBp~AnNYYPO6?YHRP&h5%m_%;2l+<^+eo1Y7eQur{&Cn@|2#;X*5a&OCj zyu!skrzm_e^Rz4c{gCBZtMCx>Z&COfEACyT@JqP84=el$w$C1gKhAc3PvP<&N!~bH zk=Qw(?LSfBavtI-3f~d3<&z3OxsSy+E4-TZ*{N{(ea?R=T+S(YOyQ@q-TtU>nJ4!s zJi_*QU*Yom8Gn3tJM4i$DD+pj{E3U93V)R4hb#P_><`lwF6Uewmh! zhqL?+g;(WR{dXz+;64_=SK%Sn^C^X&%l`10!mnojk%wEpzVwCp?QldW%uu+T)7Pl* zk9l4Gros_Qus^Uk8y=RZmaXoQ21M{&vzBRgXdc=X7+VVZ6F?&DV&Fk$B)N*;C$OJ zh4W+L)O$VXCh&(1yFD`mQNd;ZU(NX%KVIST9Jxi|OF1pqVVY-?l9zh7DEt&oe>)5Q zJ%!hD`UZtJa(b7-MgK<~oL#{nPb!?Z6W*V*;D1;698SyqUDyHqf`6>!g2k3WBrSd*idyf-BBg1@BX z#h&uqUgX7|a;}WvVz)fD6L8D{N3#8gIyn4Fpdom{6d9G zd*!_YX_vJ3bR{qPpXuOOy4Lgjx!J+p_HI+SwD7QsHtvF4sN6b1Tcsb1lIK^TM`7@yPGxPEok@Z%pCRkMh2W@UQ1~$vLHh zpUwCsibwD(6)tv=b1a0XnA`O;B`2-w< zVqES|i~fRtqU6QSx$Ji$FLusTxcI-kza#R~5us3~`~E`|HB9h~@85@`B6n zYeioA>nSBK{q=&vrN89;CgG9$t3Hnp!9Qeu`YXH-&qsq5F6Sc+SNK0zkFg5>7vu6? zmDKw^_VZ(v{I!fP&w`(#aJio*zY`aJ!Q)C^#*w_ACGv7#@lqxKTb>8xJuH!z`Ct50 z@Huu^cyi9C#vfJu(qHmEm&gnMzm&Z2f0_l)VSR;1_~rdC!9QR<$18as0u+wOg3naA z_-91n;-8BZF8auOXQI!1TdkK+@(UQ>m<5;n&B7z^ckNK}f`3=x*D?RKS@4?`ek05O zG7El>!XIOK`8~VnDY*PzP;lv&7Zs1#`ELprJDW`;)g?UQKXM;S@M_klkjEKtL`O0{ z%)zmr5&2OH7kf_1f*+}H>GwGfj%WebEAI)4o+mM0=g31JsaJj%4|$kG=4*L>O?c!v zubhh@xV+DHh2jtJd?mk&7kODPf1>0C|1X8h^~=2qAH)2QC|s^z&jbfYyX5^VdA~#CPr5%xcZbUT;!S@+|}nw R2M3Ql50(BBetBN`{{TstYlr{< literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/server/.libs/mpm_common.o b/rubbos/app/httpd-2.0.64/server/.libs/mpm_common.o new file mode 100644 index 0000000000000000000000000000000000000000..cd06b1d57757a9dc68951b14ad4cb8f3c7b68ab0 GIT binary patch literal 69152 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 W)Q^eB2uH5Y?>2DuJ8$4TFaH6fSUJ7` literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/server/.libs/request.o b/rubbos/app/httpd-2.0.64/server/.libs/request.o new file mode 100644 index 0000000000000000000000000000000000000000..136bd10ad8a7350b83a442a44ead6f46b4dd7f8a GIT binary patch literal 124336 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/server/.libs/rfc1413.o b/rubbos/app/httpd-2.0.64/server/.libs/rfc1413.o new file mode 100644 index 0000000000000000000000000000000000000000..04b1ff54e4053f5e1630f43a97659263624d800b GIT binary patch literal 23664 zcmc&+eRx#W(LZTmVS%7QAtWKjh=2qV*^~$o5(Ph4HpwR0lI+I)2%x@* zC~8D1Xj^G(g<7@N`awV5ma3&et)I2E*0x&PYAq;=R;jhNMdh8DGjsRmkUUSHr+>WX zd2;W}@64GqXJ*d1UuSbwUBkH^%TiJ-HD6^pL6s^h&(aHsT%d~7399D8nhWat{!!Ch z(^TL0N%M;GS3_67Tb-j+Xlrj#Xxo*=V?%vS#lFzC`-{swO0|WydZ(2@`%vGt#U&tC z-hT+S)o<+$qVyQz3Vzg3Jf^nbN43Rc%ljY3`h9QP*yeqzZfHGp-j??={==Vd-yX6r zDK2U_>u_py!?r6=Rt{^k z&S?wH9!cIR*m6I@S3iNCz4+3aOKL8ySzQx;9L5g=9o4X{wiw*kP+U~rzYhc*gZdsL zeb@Zk&U^=*I;#CF@N8xm(nUy*&D@G^5AMr{R@!r5i~S@3f;V z(AGuOhtDpUREs^XDCyg;6Rf`P(7x5s8Ko8G&X{7#Hfk4oYEda)&z`!r~%CPMYJ&ddz>%O9bV?XBgN<+Dp$RVKbRo>&)G>yoi_bWV^f z<^-e3WFi?%MdNL;ctPf^?QQcQ?Mi6=n&IvZJs9RoN z8=N!kw2N2IxpdC7Gs-JcAVS6IFw&C@rxLAeBW-QTa4g=Q2zNx&CDT&VgYA)6SG3KP z*9Nvi*J`QJ4qJk)zDI?4dBz>G%FdgfTCNd+NDX7l@ZB@>MN>Df){!}3My``WKS6`L;KI&%rgGazVkH(MO3A9(!e?JQb z>eG!Uc2}9w}AU9+2^B#RTTm62UhbVOMi`) zB0sX)A@fV;50J_)UkW@qFPL9>8_?vK{3;}wuEy?s8lOX!YI-ix0Zq@p7U&`{Dqqx- z&X@fkO#u@~#{UnLXZk40Yn}d2kk)$qpOPLe{~6LjO&>$Lggot67BXd;v52YGjE9&7 zn(-17(#$Yo8a0zc%u3Dptc$!#tCsGpn6zd_Sy8ZHy=KNzBsXbh zoK+7sn>ABpwS%^6G&8~K1?C3LOtX4GY`bPktq_Y72~_|(mH(?0h9duN9He&TH;`odP8=?W;T{Sngm5}wIlem~kbxUP z63s5W0<{5((IoUHK}YKxE4bq8&;US~c@uGtP{-cfNjQ0^^E8RcM2w!Mqds9sRB4P5hP0rQ~;Y}4e_}ufL-EjB;Jfv2+*B=GFDpi_G>@N=YfG6#OK z3dD=3`@joNfyN1AQV|t+1+@e<{OVzV=W6`qhUT=)6n@jQ9B917 zR3(LbJl_C@QmOEJ9vY-(en5;*Ge7iDvS?ZH(#!?K+{^C$mS-e*lp?pY z@TWG0L5uCTU6Fg-cDeUw_Ga)wK#M(NV-gi<<~d@5n)!u|zGnBnNKBco`3*7EI#uDvG(z_AzwAvQwjENx3eNeMT5vA`PRsFO zp6B>x1Hv=nJdhagE!<0Epj!+SgnKJGdf4ZW+ABdW$5#x^_58{4-U0|kAy}A8`J!zc zPBe!k&x^kH>6&~>SdKygB`jV%uOrRpl3}<;<@nwOBp)q35iRjFVDRjzuoj$@<(Wih zGl{niY62dt?H}WUz~y8ZEEenbcfje{;oviGEdF=c%Tmmw^{)*fYj8M6zE)^i)0WAEr+r`erHiQSW$j3U-o zr0Eo7o4|upKd-EN5Vd#Q%R=9haTcQxmN(%FSOLP*tY*(uN}Zxnr9J^1u`A)&1U1vF z^HGgbr2Z$YzJH+l{l}@F5YX3bP&FK$?729-EQV^QmtnmsrKUI?oqB|wDy^)CKY(sa z#?cxN#7H45CX_R(4$wOs+ylDp9rvULR!otKyId7FK#Qfi!qbamwnw~egDozr9qr!+ z*|lz2YfiR@r=ap~cV$)s4eids8 znoSqCdlvorjz$QJ zRR%%9!%C|x>v9xZC1NWdPO9Jn#$F5G5HdxbeMH+<`!TaYjBSIUh8n@ zN|VR88WmPRmz0vLvb6&nkJEECTa8oJx8gr*TxB-Sn*4xiI_em*BWLia$u(kJ znjautO`a4);d~h1z;4xSY%uEHHD1N!w~@rBL1mqbi+Fal^tx*F&2+Di%T^U$zZ9W? z_bf~%^l%lX7*$nGheTFq!k-%ZEnI;#ib|{KfK9626!B_S)#5=MR~D`6T9hYMx~pGO z{bsDE15Ov1Be>d=z!-}jKya2$2xF=1?l3jsZmQoTAGYqV+Ckr&D#2vu~zrd4>WU4_Sqa?ce+fSt3m8qOJySy1T)&@pE?YKNhR=aOryhEeXE>C}Pubxk!iQD2O!CqS&% zIpwqTM5k4wwAzt{e#PX$EaYflLM(rdc}rdTXC^<*LQFX)8QYDHNaOuXW)(F$;!ISt z8Fg86jxdQYWU*NA#>OaOjs(rC;HKOOmNe9;(NvjjDK18r6a=H8+0IfIh9DI9#MNGET|Bv-zheQSzLm?$H|4ooY{bn96EFz&@ z!hFFAQ?robXOhz%${uT3{(PrhV>gqRXQ7*!d@u_=#N^Mi(34F5Aq)MH$-ieI3E=73 z*a}(gK+7db);dt5kn0_2`4vpw?m&$~?slN%4>0+22Wk}Z1qWLGTPBBlwRZ+tCuTs6 z9*BM+C2kZC3oqwQOl;w^tYxx*iJY7TKg7Vte3oSrKXhY}b?TqSI-_f|N73^UL!w76 z2w6!@6?2qM=d)zmLFNPOBAM5X%nvpGe?vQuIth-Jb=02^N7}{$R$H?&spPC!ytOOS z7M-=ex++{%IkPJk&#a%>5zowOiKSDDM7m-vvpQN^j~A&dt(Nv$Qk2D`@Oc-${JMKk zvsx1AbXPPUZC#t1mCUrXBvP{?Jw3BJ)9IeJnH8mFrB#))Qpr~A4n99;HUB5=xM$}} zb7?EOGnG!l*XY@$o#^fKhMs6jlc{uDTeKZ$aEty(%{YJY)?6$OXK*h_!#7}{AuGW! zAm9!ZKaj&m?|351_9PNr*a6q#_iPszY3ZWwp%z9M!**Ivql2kW5E@?rD`0F=LS|AQ|OEz2JD zH#=Tx4^P|cw%hqD?bK#_xUY28E1oGu_K59v@5)ur-gnWeCH9HFJN91Z_1IsyYCAl4 z9aK-B0n8V#YKL7a9smxjxp4O6_<}h*=HEVl&PA)P-}QNW>`J@GbGqewt9jKUkNM`! z_l>bzerr$i9oS+Y+W0wprV7d8N)x)QK!f)1H@D%KH? zwgqwDK`c%df)#6{(Vj?GtQXWI6Rpuy3dYl_XxjxwmeLp|7f3>i;5LeQbiE!`rUL!EfQqqsauJ&Twce zMz}Kp+fpc@;|Ya>4yU5Y-YEE70)XzSX$&t~wsdK@dFhg+%Pw51qFw1QI$L3LbfdNl zO$vuII!LoC6vl;oj@v5MFzFw78x+OC(>3<;ZTmt!W4{D zB-|e9j&*GSHL(1|!?4&!!|_aa3pfb1rE!gbN_19tB)Jw~irMno^Uy~r3B5|`yiG>C z6X__%Njojp9ZSRLE+fSd9|Eoe4@cXU|Jt#7EKu|WDn!!!kGDOEkF3=$NFq%*jk1^^?0 znbVzU%YYkDCf31Wu25lsqbdf@g$+qKi*;f_m)$Uz$xVwImesASTZG|eM`veE%9+Nr zhlu7jE`WL@Gqt13fs8CKdC!%U zP#knjW0Hg|1J1HgUIkZEN&EI#w5ttAgQ74Bo$WB-#Y>xmi-K^wQd$|D*`3bBqw_l8 zMkE<)1vUaHJ`ZkxW>!IEM{wq{ir~z4STtML&V;2lO({>l?*W&#WqMS&S5H)4K4A5s zi3XuSM`A-*``1DW#=6{I=#H$1`0^zOmS~*o$tWz2aB0XoOY+)T3Mrk)4;X*&bgz>L zG#6xZo}y*jbOx@fI=WyZc)|$*I$39PS7IIN&|2d?aL1I!OPl0?6FtZ0)e45(PHPrj z6vNK7DU8YE+BnGToSxjc%+eC-%v_ksm^pGefcd+^wP4_6LT$9PqNY?DBJZ9-Ffv#V zU~RzDY<;TKr!&CS?gbAOWhZPV4v7s7(GoJQJKBx2oGuT%@W?=LR?u?J-mZcr6)&j& z;r*<>{L%VUyLdTVj8JbRnT%`*cft)x6jxJDc8s*UCt4nG9#cN!+@&?A8d~5g-2#aQ zOAM{6E@NA}5|B`FNL;vHz#Rw8g=9x7UrK5&|RlK zKHoJ&k{!L&w_fh3YqE?=&!^#SXok-5I@ zaA(^9IDPhqGreb9=nvfNS?DkNf?ekiZu2hmm)tb0)?apAPL03%n%sK-2P5r^tP%d| z8h=@hzht352(r*-q2ISC4|L$uXBYfop--PR{=jvfCH|so?8W{@dmJ<^0;tCCt3`2m z_ng|$4XXv5(@A~q6e=0*ij=1DF0GU<6QwPwlqyXokU{bC((-|9HL%#GE!vXlpiQ~Z zlITcF3#=rT5VTt(VT?n)KPVv+L#rp@*} z+<%1#Vk0Oreu0|+6Pg70a3?&8V(EwPcJ5-zE`!R!hPwV7-D(pL0R4|UoTY#9{~Ewd zodBs8_zZ((q2X9lHV!f-hVAa6-9fPB#Yiku7T<827`DH0G9FWKZ!3z#|G24F)DhIQ_gg^gCoX~#w z411jY_XCDHWt>1#**lHT@MYayq<=a82r36_-!n_MI?dgfWf7A0{Vp1DDPQIG!pm9O z3I7`)5HsAQc60lkBFJZnpTI8wF_`}ru>Zs_=s);=d7S@ndKoDW2z>14hOZHqJ(%_n zW;;q3ovGWbVdXfTM!}!hFLA~24A%d8+G~KHxV0WR8mz#_ol(xKjvPC#0sz~I-oRRW zP)ksLFb^Zni_}0hfE$w@>T&LQT>Z*7H*9L_-(Da&pzxmQ0T?p2-akDEt}pp!g{@!% z!XU-g+boZ(fel^9VF=h1!Q-oJz0>))3R@YAH%P#z>p`_+x)0Xt+#&EqL*NZV;H!qf z*9?KjhQNDydG@44-SF%16~LbkRloRYXAn*^Ue_XheO~v zQ3liFdis~wkox_F-0;&wiSzP_P$#4jkaO`OL_myr7f3&QkX4+(q@!#A)lS^Zdpd4~nViR;-X@MAhG z=OYNk#9K8?GuFLYU>;#Xd0dx8&#eeTK^&hc1iu$SD2Sf`e}d!n3(E-jbFVtTAXMYn zFVafs{Lg0*gaITB|^DaGZ{cpH% zyk!#kV}||`sKYWI6+^)j-g}Gu0vC?ELIjTufp2x;6J7FOb>Wj-_;*}*(1kzd!Y8}% zS6uiM7yhXWpX$PkcxsD3*FznaX)fFy$1@m5b?!LMV;rvpC@;^YavzKO-S|qEe#{@~ zH|oOO{bq*fce6_#^}GOoSibDS-Fm)0gr0A?@Tt&V;`jrX9@H=M;YkgtzdfJeW%ZzV?pj|FkOFU@5^x#9`_IP1kZi$(BD_(lll2o^Mh zQ-k>Fbky?ht9O|T$9}(ngNAaZJ~{d&uJrW{>ZIR7`kALvb%wm;A6`GPh-@n8ThxE z|E_@t+5R6I_&dz+H}F&056>I;zgds0w_^Vd9QRiY`H`Gla=$I|`#C8N8uANR{;+|+ z#eO?t;IfhHV*|&3kAOvPl%-#MF2j<`;}Cos+cV0*zsKW}jbbAI5$iwAkk>zMhCR6k zF8ezc8h8`)%M3ik{a$R~^8Td5z;oFClz~s={MlsS6SN!DHUnS6asQfuzrgm~W8jx? zT)u1IU*b4EYT(0J&(j7TWcim2{9GQ_>jplP@plcpnsM1ZBJrYy2*&K^dcpH}ymI|D z@rj1~DeSlD20nxBuQc%cn3p|LqF->?q9pjO?4MFg*@aI^*!@wm@DFc@sL{}L& z{?iI9a{nOqJj-%-81i@Vc)w}j8+cyG4l2>}D(ip5kZ1GNQwHA0^1n9ltF)QwH3M&A zdk!0T1>5tnfk!!Sy<9JLcCns91DE@`i3TqB2eQjc^t{Xit2X4nFV`sphuz^+mK(TS zU&98TVgGa)_+!jV9K;^U@9PZtzp|cN4ZNAJN4pIi-)mx#ZD*qYL6&>ike|kWf6Bm< zjK5^yud#prY~XJ){#OHkkMW}h{&&WG9A~lfS(ZD&z{hgDrW*L&%%5i9KV4E%b= z7aI5-oL5T?Jk9oOGjN$-I}N;_ysy+Z4SWyt4;lFH*q%oXd;{C_O9O9Uzy038U*`Ng zXyE%feFAaPmC z{4@i{AMInAYv7AHKNlPLOIlp57y@5o;Ns_Q1DEHh%MCo2^YeNGU&i6 ze%NWq-^=*j1}@K0-!t%IJYRll;C0;Z&kekT{q~B1zsGTu>yOxZgzfpzkUzls^)LCe z&vyaVlh1aE9>GsEaG5Ws8uRZ4DfWMjfuF!}Uuxh#W;-u7@Y@;hH1K{~0SgFSc;r!ar-HB7VM{^F;qoo2>jt?9XCD zK9BX3GLG(L6G>B@A-{num$`5zNxsR2E*$NV_5Ec7U%-BT%fQ<>AC9<$dB>7w+yi zKp5cwJ}6OTXJ)IF6x{@0WHNxI91K<-&2ivW`9C!cosMUJsvOT)7hid;DA`3C37Oc(CfbEXSN`R}lNt%3iF@l`I|t!JGJM|Md|pKA@5=R zpBngTZgX-#6JpOCUVlOc{yaJZN~eKe!sG2T@EL69eFlDn{kF%z7qFdA8+bj-A24yY z=Q9KEVcg~qcrvcvGG1-q&$IqZ4ZMQ!^#=YT`{z~zFW2r-4;uI(zV37PG=CVP7Hqz= c4zLIz%vpSK_qimiv+!|_C1v-AN2y}cE==dej@ou2) zUuhpRZrdiWD>i|fJrPS){z>9QI%j{N?J@78 zDH(ZIpyNrMGmu~+m^l;eEFITJ_L1Iep>#DeCVSiAHhJ!JAsamRS}uwFv_Y;$tcAB zQ%id@0eJ`qikc&?hmb4KLA_=ri1+XrM~)mZ><6~!YES4}WmSc;>e95WdHvh>Z=3@? z&F}ao=hIKpxP6k}_P8Brdo*)KUH^@v3Ohb4>G3R-{MBK!{olgvg?S1BbkUw*9_9%AJqEIgR^^&CvKl56~k?(AH6C zk%!SrC877`Z=3o-nj>^uRocRizX!Gj(uxoK-6K*uGK=jO+uy=*3UmZ~8w&y<^5bo1 z9VzMf3p&S>cF8u+&nP!=;6v{x{Q_GD5V5rwMtLw8WxqFI|GQ+y{`d!=;&;XNmjU-g z^8kX6Vgv6qWTzVekP8#A6>CiInK}+D~;Osr)=4Q-Eby48K`8dKfhzeIB))w zh2#1|v9d6QpyH0galXBXVLv`6F`t|l*mm}~w4A4MUds8F5RluBQ$`|N`?o1uFm6hX z05*IsF+jyY#}gm@{f8q*5WE4vJzoRs;T)KVBy4MLpyN@cFEsAm>h3a3BY~fWslzjl zBchV==`Tl)bR2N_)u3JvP3VLA$;CVv4&VK`rIw|b?-b@hLiXY1pc=;(rC0m@;*Q5s zwiFOf{)*O7!4sxCF&*9o$^^ESKz~)d&v}Wopu!W+8)#ecaq4tE2dB?9?@}V31rgv> zZ*=Jsj)>l;!+U^pJNg6704wDRm=@b%wtvGRi^IgQKq%-@KJ}hA;2!xxVB1+sRiC!D z-wZ+nZ3SsCQ42Ed+O~o`J75?1;eR&#&sCudB9s%4VWR!`FggqbDqmn*Y+Qd51%2+n z2TXIM{i%)FZ0oI40$a-=*v*(6ANWanO2%fW1=Sw$&6phP-?rbLaWMWR)qz%g%W+B< zT2_8#e#bLaw37T7==km-FVs=WcDOq-3p-Y-@Zik<_9H3h?*`wB+Z0tB}H%F97Y8DQJK&A<&aX|Es73fmgb z4&cngITdJoFb%g3DO>&w$E`)VAi)Z3yUzl!WNSQ7l=JCc50td;-vdXhB&F~p5z-oX z(lZXh0PIDe7R~;J9bYc&_(--N+xG2-^1XS)^aNKd0vFhK2ys8+Tbnag0SqW~N3C*X zNs9&={1f3Ff@-&@ytw$7nV!1h3>cl-XrM& zz`&!gFM{|Z9BG|8iw1ks z@$KKXX3nDZZj%%5LomO~eSy#uwD7t;Kd|4znneE6ex!9I*B{JE1wu~(vnSx5>wOgF ztFhkm{%x!EC|Ja@;!V}78p8fq#2;!2SI5HsXeiPWUKOcssqr5*K6;ctv#GiXH_sWIFbX<6^Dt*&o~w}g)&Ie>(N(O9IVdUe=;;)(vu5bz#*jH(eNq5k7E z;lXJAhA`BeR~@Tv@P}JkA}upTzNSJf67feHs~Z~pwUHKosII=DW(>90sa}^(tZs;` z0;17hy^|!&)T6j*ZFNI^jlUvci{@&mJw9qx{TF*>RyReO z);C7tQRzunOJ$C)Ic9uxrax5O)D(&Np=Xg$XR}+0?q`LpW-x1GbEDM|Ssk5J-CP~2 z3kO@`O|kk$Ga`mQ@N1eRt zWGAUI3g~W6ullB#>WZRbj>QarU+UH?mFK?3f z0G6nBRmp>nFwboC6GA=tXF1vOW+%HCmwm;sYNup-&ALOfNv}Bi_MVMd)`9!f8yhbM zn|W`7Ooo!=9dl5s_Zc}AvVGvc2-`jbt1H4qC22~%e%ZLGr9St|LG@I23R*46 zi*}|>R{#Ds7OH%*oxlg$XnBPXwueBIDnHcz+QEm}XcUDHw;dA>I3C3$d1Efi8gKxz z)O7OnEkGv&$@I3%fll)N4vr~U;SZ4UVMdjw9CL3ceqYuEph=W3*U1i?h*6i&fz#iS z?4YbKI@KMNW4U>N{DYXp1OCax8`9IzO z{Fy3$FUrhT`9IBpe6Gsx!F-;|@4X-L0hNCM^W`f45aySv{Qf4$uT=R*Fkh$gk6j5} zX;%J_VB4;UEE_M2b|_*J5xW(U zO~lQL$RXk`MNFnSyhjmJNw@uqm~O9!b{?}*L8dkMcQg!XgLh*mm07RFEa$Jo?(#6) zNHYUw!_j~xd3V7WQlvz+DN-Veqe*CopsC8Shn(dMx_{_~7oc=-bA639^lX?KkgspD zhHgaEJ2(=LSwlBt-ZvQb0oKrSFptv^WkRc#HS{-^OSbQ5jE~d{Pu~m-oYafHWBv{t z%-%Qt74Qu4^?i9Jl;btE)%Vpz_VxJ=`o^h{wR&S%Mv%IdV)e%ASVDAft2Z`Dk@zOy zcB|HXeP6`bu3CT72U!q=LHV*oMN)p)gDEgCRQ8cSKp`o=bl4L!U?;D zGpivO_6+9LOc?eY%2l&^*b6v&M-GlwTf_c}Qv6EHTMGc5t@3}v(aTf$LzpjA`S;Mb z0xJLEQm9*Q4H-G?CCm+r!l(>;B?z4*n+l(+>)@=cH{#aq;5&y;* zr%X2DYwSU$;{OS|l&$i=U|YGY^jSfWpIF*PY>WU+ZRd_?d)sOIJdA(b_JwG2HHss4 zB8!UIBd#a2sW$E!183H0KW@%gr>CnR&pN#vhkQ0#^tWGvlui~+2|;@)Q0}9{5X`0H z0c{V%h9-rv0j4A`c0b9BBB&O&rfQM3le`lEpb~6bm0%U9lP@I^rv!6Qf~_Wbm%}mL zH{u^V;f%PYvU=VNY&cv=-kX7AKn-Y-HA zxoGGVafPc1GCoE8)`j6dO%^q*pXA*D#{m=IpfviuYb)fbjm-4BTyFva|G+|jbS3;c z{azxJU#I_x8ss+ixNe3qPE&REl3someS_;m5q(#Bs%Hk=_f%{{Ji9QsD`J@Eeh|Q- zM|iMfEPAA87I3lXF&+#pepP2I5t)h@@4-Nmt%zf(Bv%o~doVEPDI&{*W(p``3K1oW znC?NFl`A5bh^2}+(Q_pzx>6ByJdc5Hb&AL*qFE6IB&}5uMMRvfhye9xvm)kG$@z*{ z=)u9?u81-sb|_*IvF%nwB@x#vVlfdnvw3fF6@f)*CTuGkK^wUK+&t(o_6 z_x)f4pJIE;jWIM$5l<80SHyE}v^AUeB_gs_$*V-e_F`UM9k0R3DICb|cVieUms0cq1FDT+DBHmEM(InuIA~K11 zUlGTWZ+)bQ88r4^C}I{7|MBBErk_NFW&44!(({P&GBuYdA5+DoUK&#ii1IU4N>nCO z0i#&X+%{rRik{|9use=x6*5gTFGT~MAb31hNxzy z8i{IUDnis|rp|QV1(!$XGZl5CKU*$89IW(TQR_>YYNv^`lBx65v|{RFH?9%QOkJub z7E_n2nZ?u&qRwaPDx$VCbq%$*!=?5gBg@|fU0}I{tFDn%SA$>S3Tcg8f)j)D%P_C@ z8zYxvUhR8Eo`!j~#~2yJykFI=#=P2Nj0|C3?R!RsF`uh=R%1R-<Eyi zML3W3r0=143VBF$Ah*~Qgfyc~G7CuZCV-Q?ufZCch^0od(7zE1EQ;5gmk*ipxj|p;7`C$ z+wD;`*f*6u&jU6{^7e%zZRE%#bU1{@OY(l^)asZ-tkZ;bDP(*Os}I$oJ){rA7K^_q zM0M)14lYHlQpXwxl;s_@{VG7{x?$8M--85|y>uL)EaEb(1O46gGMuS*ed#!uj-%Ft4W9=uFJ>B}vA7w97zGM%h&$ zgL)tyM#^U_Iu~%2J^gOT9u4epn>J(RCa@K?lTnQ#tidr@yfZ?Z(61C8#tTc;W=8E? z$g7TItWI3YWYi&^src&=S5rFU49u%3ov~&r@Z>3;23&dqD&L6ta+Qyq1iCF%`7;r3 zRr!_~(AUi>A4QdSt9%UcL+UQT#Q@Vq^BgNZEo0p)PRClQW2(Y>%&YsO85_`6+{v@h z_Ubw*<5$?QkFB*4#VW)7`eVqF1Nbt|nJ|p+DrB_LT?Hk63yNX!?V9*=vDyBp*Tt1k zQ891FEaxvd74odhr7I!t1K+?dBzfPZV=Z7w-WyRoRI)NILj_d!igO@KdU@?RH$k4n z+j&cnQRVY7?_vIZe*_+yNKZfpo)p3Xb!F$y*q4$fYEhO|+=q_ND(=H81@;Nbvrp{9 zcF?&|4W->aY$V-lpD<0N+9%*<#j+;g!7jrqNxKXRGi%_Ck<~heN<#KofF7&zh#yB; zS|*OKx9nPM%tG(9TqRiUzFqhgO;ueb$i`W`*=%LOf6Ly4?Mhn38GC03#N0_p*_&wV z4LL<_rg;uzcFS7JZj;(M$cw3RJj@KJJlU>tMd4WKS_=<8RheZqL1}?1?F05!X|jC^ zu`WW^DS}=KtRO^Zt8{s{0<%4NvW>ix?WK11WP6#$;#y~cD9ge*X4&tHc1R(N$=*3| zgk?LQi{6WymA)W^!L3JuZ!kU4#Y+QmV?cuY% z^FOFVb1jsimtj)oorNCNGf6`Y#WRt`o`q5{Ir_X0jXJG;55ymV!?dFNE4vcR2&YpL zBQqF6;q$~?Y3JaGcrz1YF$D@uDG96Nj2r^Jn2oB~vy@k39_EQUfzj#tsy$0OfOuj= z)~8$6NzG8V7@WdhF$YWSSvVQ()AAI7U9~Inn*c`{_Tqf>Kb0@%@m{7&FTr|{?49p| zbjJhBpeqjn0Nt^tfqQD*a9j_0uzYIga%(P5Pf5>k#@>0$Nbr;8TvSjinKL<4C^cY- zqqGV5i;&;*m0h)Ko>_b{N;ny7I||kRSNqdw!PH5(0ov24+|Ip$QLRim+nO?NEQnUa z@w`4kHnAf1&M!eh9FFH{II2#H)-?iws9mAP=6M=}Q()k~12oBdIt;XmV>?i!jjt}L zh_wS{9FJpl6_%*jwR0b|rLtFJIgj6W`uJVUamn6!%ov<2mi-;E0=Jqf-%+pzawhz@ z?C+&=HpIjqgrJsx!j=OVMfGI6?Ds*<6Ru_agx^SJD`y-N?j{pfQfTQarU_wj_@KBJ(RKZc4DVYcv*Ck7xUcCcK z=4Vi^00x&tMNYxPA~1`?mJHssjM>1ooj&5y<}hI&uTxBYwABQbiR-zWU3%E5?g!o0 zy;Dr&?wecMjgcG?xR~|vQ&;rnp)&~;u^(BAhgPg^<4t#C zs(ruz|Kf*LuCu|pU;s4x9s~M1K7_6Y-Undaow6=!*>h~% zCSr2bxj?Doj=lkCl6M`HFG2>pw37~}A_mFcIrJzHjgQNKIkwfT`=r)b?W4 z`!%X$#ZokT1DV~fSk??gqm5g6iVDj@mc5N`1&GnF@1#x&Dgepec`>L1!&_(B*E{2@ zdYq_%<9&lO-ZEg;Wney-FlukJi1s$ta*}$hWBA0D;B{zd2{m*pH6;DMmHSQoxt;sN zp7NmMRVa2A9w6B}2aN++t(N_us#~>Wy_2uxs!xzHR0X&Z!WnyKK39E$tMa^f&ZbKu zX6xs$=V8vCf=g~;Uohxi#bo zT*5Kn`cMR2tf`W;LM*`u>cb6+4?Cjq1hMu}H{oVnq1YI`1LMPbzFSkdV5L=!tYhD^ zaZj(Fs#4Qw3y~2w);=`6YIV?hymr71wvV>E)XbP)a1*VXp$kLW%af2n5oE({w7Sl8 zw6IjoPm7(Jn1i{C{8V+^Z?S#c0V=io0Ht(IKQjsU2&zFc3yQT?;bH76v~=Uf#fMjW zbg)8Lgqq{Nf%>Rq-h_A!9wtmi`6Oce)$~pVF4)AS)JeV{)p0?z@zDXj!Pfzh&x>&_ z$%{ae7hg3ZDMyc>2LZUQsIH@;JalVNm6Nap4^XQRP6Kc+NxJx|@D2nGOY$#v+>!8M zU#LMO9-!J;aH1P-80EF08=Z~!hIS!{2jIl}Dq+Z3$pNyDQi&e3TJ}JDd~#|(cXE32 zKzmSc-!SOrIICa3lK_H?YR-ako}rdId1k*^{ffbPdZhphh{hAry=}WV)rO3Bj8&XE z35xop+V13j{jdV!eFr$TbD^{!lf8;lk?ha1fdo?=4I)6-RH!j~IP`IdJz=<#?(0QG z13h*^@}NxM8wq!FQ$<0zHv{6mN>>y=WSGW3G@%K+d5~a)3wUe@l^yQr-V4bQ%*4v3 zr)tthP9u#*fxB3vSu*hT>o=fZ|9;qZ2FdCL%8)F7f+x3^WsT8919=pef=v?=#&U0| z{jD?cP6$IXr{f$O95IJnXz~T;*p@5plDQDu zr$_-@EOl68azUPj4Z%$cU0x??GZWp$Io?+o0a)rbX0AV4tTjxSU2VxCTUXEV8SHfjP*Diu(b9RpxWE;IY`#1&G7@@+2Gt zE!6Bt6-%A2_d=I)tOmP1r|VGS;MhhvcbwZeg}cV&BE6m_5o=ax+JQEeY%;D{)m=?C z_F|0{YA(@K0CK6O0+7oRB)oj34K`ee>TRfAaSJP0H<+n&hGUdEO$S^c_H?H%O~2VR z4T3tTpq0RDRXaGCPvNU{s5n)DAqArGr!rrSGbY>)#Co$T#(qxD^@dd?*`ZuyTa}WX z>_CepOY0iI9t-c^aCw&#L_A6$OR_5+s6w*3tjaF3q(#~TLuK14m+VqU)*{K$N=aOc zB`e~gBJ(?^X3n+o*|w@A`x-;4gF?NRVC0;0x{Gtd>aw!C^yLfY830Q%CTLHx1rD@A zvhx^HDhMUlP`0%~vS)N+6zb-LMAcg2D0&QXSSlr(=Rg&bm6lPD%3VS&PcTZh-hnD5 zE6S+4LM2qINGPRpT~#|pRLgh7FP5w*gW^wdR9lf?l&t7uTc=1?lu>nsI@_sxiewYo zF8-gjT_oBTIf71;tgh`MN86PNM#+jYsM?}kLbW@LizJ&+jjkhf^@cI`2~MqYy%_V` zVQY!$Dn5fdO7j{ow@XTw^sJf)`fsWUPX&wd>8kmX)>=nNi8M5*3r8+qWp_&3 zS=w$#x$+$LC)n>&>Slp^hl{>Wut?VB_&?ok&>QI{6zS@%U1rT;uBCpVMGLjm zx+KxOWUp|bMWV@YN2Br)oSl<^iZ~liK$5L@AiAH~U03>WbLdNwAML16E{g8Z*d)Iz z!6usiw^{Z+vx}YkBnDSk4D-S&V!Ly6;Sq5#$dZ+6uoEyPZ)S_!lLoCHsm4Etaeh0aUX1+X+nFtNtC!7|vX1 zP03Gngmqa2^SG$YVX2aA$bl*(yPBcyRS;Q~PQ^;eE_I+P$?CGYT2EvNH|$&_TjR)D zELoA|g5|(WT_r6NNwtoo6_V8?@q|vuTS>2$z>iS)49lrx@wW(=x;KnetaB<>O18;? zPLZrGtE*u|Rya{nvLe8?7D-l@bxM~F`SGB!+HZ7TGw_EA-KAb^lHPnC%;z*d%jzae zttsOq=F8)=EIG2gn*5uX?^-@fM3#7E@|%%c_#@1)t6Kt^v6&s~+|@w*6!B065yXU4{Slq z>%`Sf@ky)dV^QnBvqaZ-=1}Yn^{XbW4u!f(oSKy@&2<*s6pq!ye{0gJNG#S6ZVHFi zL?^YxSFMWRFQJ z=ZE6(lWj=RSWA7=>M2?9Fv+rF>zl*T&RKAM`~^3FFapt7O-;BK^5ARDu{!t}evMWo z8VRil$5eI9SJ%|ED5|~*&M=NpAAX??d5{JDhYUCyWP>oKcz2&z)8an-M2b4w(YPyt4FU8H4AkZN+P z@V-Zap*hkL!*&zMsyLbh^?(RU9spTze(W#24X$t;NmL<59e`5o7}f#1YePj9(R!NV zb&<##O?nW1cdr@%KIkLlsfYNRe8F+36^{A@Ly@N1dafiRK$n8_@PsC!d$Vny@7_>b zeyVr%#7UD}Hr?XIzdlH3`tiS~jI{uzyX>n>|O)q8EpNdfnU`RnG)Iku$a z&vTH^`#K)m@G$eCeev+J6RX^BTHe^;1@4qAcl4S_**mMRo#c)!^?v=p5_g~5+(Tz~ zJTT|DWgeINrHwIcR$xy6l}ZyZn>t~(7)YLHuUX(e z0?&%<)TicL=DqBSGnXw}wqU^m@7U7H(%t3m4NDh1ImuhRVcA35S3fmr!P~=rzG!Q%$%=J{b{RrKEDW z3C65ov<~Lls(7sxSqolUUlX>P=f#^sReb&;|fXu zMyMZzhVW|@4dJ!n22ktFIA|7Z35Tqv2nwohfEm)f-cp|%3F6m9=;I>l8zJ=J5vx8L zTwC7~i&r;Lze~$X=axXfu8q8^Sdf3}^Lf(qUm)VNtMXX&}FO(+Qw}k3WghhPfbSPZypIA28Kd}}(CA4ND_cqdEHN_i)WG!4a0a?3@SD9D+?Bt%!4W|plzZ*5Q(8bunLkLEgTf`CD3P0n3`w- zU%^NoT-8#)8l0({R>kh9Xe1PAfN#}A>sL3y2WaqvBg9@ znN0fBqVt0mFdl0Oh(v?D3ZW|pVGh()H`Tx@raZeQycTlcpWvicxV0HQp=ot6Cp$YK zI%hi8#5ICUBtwnem$jLs1>r~So&2!2y0N}teL_&KMU#Lk!q{VHP<50FbEdi`xGGY! z-l}gV5cWP+Eqqv~F%12VH#Jwcz{hxSwX?wAnovm?a0~RW50M=cOB~GVMhFzqRWRV| z;FCUJC0gLf9yD)x8ireO8-YK?*DK>EdTN?*fL1eHImZGZ_G zq>tuQ!#98|m=R5y13^4!TJ5Jpr!fqM;w=yj8sd#jq!GIW20Sz)1ve;%&)tCK&;^y|81*R6_xjG3Zicu7zv|^>7>7%31VA8r%UYa-5Q-ve;?2Pt`2G;YRL7#g4-0rx z(DC(PnEYOKG}u_(N=BGhTv9|TuaziQd=7Z zhoTN)1corzvfi1z73D<*RVDB(O$Z{;?ULeBU91Z67=$c}f+1c68mhr~ur&l{2-ZMo zhp|8(3B|Zi+4NfNF3jh}LV-31LYt4OW#d zC@ou3YQYue8jGDi*cgu0MIcx;t`Bw!0!`s{5Vq?`g*aIpoCnAy%Z=j)~xHTg?r~uU*kJiz?Bo}nykBhBZ z4;E8Xtj2=q2LTgyGO#94Z+V{t+dUZ2MZvjM1q+HQgN5)>MWRc~C{C*F0}K?b;i0;C z(;5gK;3Q3}!Lcw7P<)}~8f^oEPWu;_$FLDYlc-%31vl73hVUC`$k-A#ml*)#&0vc# z#~KdDwJniGaORqDD-1pcL*C>iRwdj}@XS;Fg54K5VKvzmRiH(WG@wNeW*&|>#x9CN z+(TMBEgT290)>%QTMBXY1w}>W`6U=_X|GLNUsMOS=CB-9H?5At9u~KFi(sRBGWM`K z4)dM1|1gXye&OsxPl9C*nt|AkpTwhu2Id(Cd#nzViVPp3kL+O;SP6g`4Gpu3bW z*aNkRfw6~Ob{%*+#dh{~Fa}S3hzMW|4hGf2@5FzMK{UG>G4QT#iNu>N#e!~9UR&dseOS0Wz)OJXR%T|{C-2=}&7 zOEd)F>ROI2Xkh<@3mYvoynn%ICVMc|4V+_IkXTq$nNNWNMv~g0*{GQKnyqqCerZJk zT<)kHjM@mYB`NB|1qQkuj{)sL!KP~G6l|4M1otVpwWkQLCMNiub6HqgR8U!5R!Ut{ zOFQ%=z6wJ!UL1y-)^b-NoMQL2Z9|wo23bQLcN{z16pFwNxz)JNtIM9m!cbcuZh&2Xf4fBwdqn@DKY_GuHxRWB?6Z;xG$tI zu0kPh8b|~5YpUK<)&e&Rs0RgsMPN+07U<;DIB>98g>LYM73)KnT4>L&e?k;To9r)F zUUGjyLR#y3Kw!Q?1Y)mftd7FQ0(K+LE!xD*0*qJc3KbZ-SvjyCUm!VGi-~o;5r%-= zoJI~Wa;e|wqp^@IH+U0J;k9 zvFjk-kjKK+8f?TN7$&Yw&^$Qc&Pyeu2YbJ=(mpM2ZczrDRg!{9KFF2DNN(VHeOHR<-LkFyt_q%akt5U>})W2 zSVES-3vZ%zR}Wiw7vI9WX)024R8u<@byI1wx;<{eItbdM$>r*jq7C>Kh=uRfMw;sJ z?j4RBDeGJ!CvHm>mljuYgb7BP;D(15uJG20(+Sd8X)6=VnV-D%RJ&*zQ}WVaya_LY zCexM>Z#44NuCrUvJb^a6q$H0nU0Ko)%QS)aatjJ(`ZKFm!R>{(x_>rta-67~jX6`Z zvZo%SP`YJ5n2zvxY{MeUZuQye{d;@2!)^U>fXh20tB@x@*>|q1FgdNwy)Zf3wIDgI zAla9n>_whJEQb`uLwT}qP2Xg1QNM69KD!IR{~E+0?ZLy`WZyPdQF7Xa?!sjMxt_x0 z%(h-9Cugtko1B@S?9We51BSWD-Ua;%0XbPi%KQ1C`dugk63WJekKZ4o9JgPJ^5>#_ z5O=O8ALSQ<#`)O5qag1IXyO@Yevp?&k2Wlee%@4=>~o!*?8S$> z*^EDfZGx&7xWBX;nST@Ht)YdCdDB%AB9|&Cinjz+a zM_-u6suQ)7#+bZjY-L5)H^Mdw&M|y;2j@D;;mw(>7~cHOq6@36Rd825t0jU2vgc&w zb|!Ox#5(FG4c++QeD$hTcw1L5hIOkGT}@Xi(15BflqQfa)43R$x3WT!M!LtEh4%@v z;Kuqy*jK^sMl}zn0AF**bTs_O_IdaaqI6adFJSOg5H<_vILb8ZZ|3^B4yVdU`vT(+nNg;^ zWiGhXzszV*>IrrdI@*;Ne^=X`{STe1>U}Xs zozedIu8-(1_FoBDckTC{3I&ip;uk*@)s+|5knZY#K10>;^7!{uzX=Mu)BlAhRE_Oi z5%tF*HT7=;th@HVo2M#ftCMpyc{f5yckQoyvU7cGABV(j|5CtAnOJke$#{hI&L}iU z>jvO4F|4;PfJgXg|NmhB-N4hG{@Yo98E4cVW3Z|J-GE{Hrk#eD0tl%Zek`ab(N)e5 zKw)?FH-uEJWA)0+i;&cRT+1Ua>3Xg&w49}$&~HKpF%cxjnsz`Tw1%U zxE}f!e$-jUL+mq?aq(-xOBm1O`hw$|sVK+KxM;kR@o@%@q?;lt7icH`GPj1PtXq9O zs~enyy;0(JJ_pgcz)dr`GlrDgLT~Jv-0Gw2T?*Xf(OqDWGpGxQ?&#}+TGp?6z%T3p zzY_34VCiO-Mb{vZzZ3os1p7-HGA@q-E*Mv#)4?9_HvmWZUoi6?K7Z5$|93s$$>8GM zwL88C96vtS9e-&L_-Q@hF~Cv(yWosT>~KEg`xzIz{g!dr*Q0-9x)bp3^m%~!<)=T- zD0b`l9{6AD0e_$6tmNQB*GnMl`yTlFLV)g0pW%RGe-E)7`QlMl5B#%wz~}aWFYN(u z=>cyC9Q{!2F6S$I;J>>E{E;5;r+dH;0Z#KGNezfxC;rIzX2$7S5m-{dUftPq2;gK- z=9h1SOkiBz1)sp|Qssre` z^u$B;3L5w?Z#P08^%okjb5VFSX}(^gSwmiPQ(biI-Ob|;xV@o0ClemV~T zItAawraR1Nu2A!O=%sq63tt7~ch-~!P!g)f;p^#%3k_J}iGaMN(8H@htb#TkToqeD z<+Kuhc#2^p6%UXg%+vnvI_egkp5=OgkjfIKF|@!qoFmmmnq62NBuLYHvIJ;O^)8L9U6|lB=UD@ zxXyo15BQ@!;9vEC7h#7Wp&d}ZAO2%1V;oP%z<<%F(%>J5%#cp+fj_L_C?9%Re++*V7IA5=>aE^N-hX;8X^hGSOz@InpO{r_qWKNk3SUf@H!>Gph>`OzPyz<)_kX}GMFSoX3e ze=5+@?gtt^O~b#|@aY=fix*4O=L8L(tl_yDK3l`_*0;1<%((b-Gsnl%G+g)R)tVgL zpVw>rn3ek)>d)w^xT?#!v+&DfL|5?bm_=7y34r(}Ov01BDlcU=?uHiV3e&qeqg$6EmzFEUh1b)H4 z(r|tK?akNyXit5fR%v*iCg*Yu*ZJ?!@VOfQUo{-ZMdH;zHM~IM|5C$sIkp#=AfcXm z+*qvPg-|B_JwwBbH2g-!aa_;Ec`Swb(Hz5Yj+(a_|nW zB=JD_H*vO4r_htjj^`P|Y zFw42c;6K3q#pef@gnueuXg#K22S1C)>nQ`zXZ>F>@W(K)LwZ-8968HapN|c^jqz^` zJjDGa2Z1ut^A3({{n(!c-_8y@)WF-Be~f{LxxFj{e-;vFjK@5B8S|8|4_BeuiU2L1%=`3D2PhwXo#fsbPS z4;c7t)vWcLfzRi7{g#1W&-7sfSAU$yvgBPY>DO%5=ZL|7h-n`O3*pb@c1Ifc?M!DH zc#!>es)2vN{-0;y@?J@af&ZSz3!j%@5`A9fxKv}{cQgM61HVyKx9~X%CXplf1qOa5 z_xBb9&*bsFuLpduf!DE}A2;wX*bXlk_(+ZeZyERu_O}lW{7jB}U-p21Yv7lu?prp; zX|aRg0}T8^)^oUlC-c0J`v4+m9%dlPeE`8**dIaHxM}~Eax19pUrQbZ{WESHw?U*`+Jpv4`cot z4ZM-*yA53I_&^W%K?9d@e8s?bus!8Dr}S6u1OCh4zl80E&#QDh2Y6n1IIfGF3bv=u zz^~zU<-9i&wC8qj~#*Zn1SEOc6-6V5A(Y7wt@HN zarwx=x3Kz2*>3O<7OOUVX)w^GweH}DI%UHI}hC6Oc7z0(X_>^RrJUt#-{ z8TiW_&sP}u!#rN~242H{vev-A;5g7`;P11&wj1~kw)52n9$`D&V&FHk{68Cb0qgmg zfe&Cme9^$YEJr@HDE7=?{!a}4qh($j_(aBgar+|YHjZP1416GuyWhai=l)JG@UK~p z+{Y04lX<-4LyLl^vmY)nk0!u%+2c=-^1g+&cJ`o_L2J`(yp8PwaehYjoZDY z2mDV4F6+x92L4ZM2-0%~Uc_UigCsF8gn}pCkGRzS-cH=O33DcqPZ}D-FCi@6UIeINRY?1DCHB z|EUN3IRpQM?ems_r?WnX4g5Zi4`26yTkP**htHX>zk%bQaK@Bo;Aw2<@IreflI&6FmSp5yV<}$<#sRZ0l(6~B|hJ1;Lq~BxW~YM$9}Tkz~5y4 zXAS&qrr$E~_t~ER>;eDUz%StVX7her>@W6_>rTN>WP7F?{3XZ$Dbv8OWPPR?_-h>B z<{G%HM`Z@Sk@Z|*;5Tx+^#=Z+QpZ|r;6E|mX5e#p{%$w$Kkz)g+Q4HRH*PWTh3qGP zHt=OUj*l6*Jhyw%z^~)@_Ktyfu$)f}9KOX!=|2Wu$#gIFFB!)u$BjV-{zr~4vTqgs zIFHxy2LIDM-)9=Q>=)1NyIR?Iz>5~lnB-W?Iz<^AV*dA{6X;Bw#c0Rxx)$6pM5D93>}4E!aIGankbe1P4>^F#XeBKw=q zz%S{=INsJ6IR5!ROf3ffGt-+5T=usY z8Mwslodzy({uTpY$^Nj%z;EFB_=JJK$oB>0xsccy|4JpMLk7R#|1$7<*x&wR;P3Lh z@NoMgU;M{s;P~zirjZ6N@iWuFGkAQb8o2DQ@(jF^^(is%6!!C_2L2rPtH!`(f7@)} z^0L4t1OJBQTx8&Kzxx^kmv&z=@RQlE-ZAhZ_QP)tT-MVG+`icVUFM%?;2*I6$n$*R z{|nFGnFjwl)~Ce45AZx)+5;XoaM82Hz^8Fs*ks@mk1jOug&YSSHt-sj^SFWgu!E4E zHt?(2|6erlQ`vuBH}Ij%|2G4_o%MO&zz?#WKR0k0-yaNoAIGclEKkN|D(`QX8TdFJ zm-PnzCXb7}7a(#T;d!*(;D3huwbQ^w&YcE+DeH5efy`4PZ zjrDxi!27bjUNLYry70b-fxpV@@5eph-x|2wcXIJ{v)B#3u}&%3z)xmcp63XEJNx0$ z2EX|K0t4U6^KOZOPey@|LI%Ew?GrI@xxaR{fydboFE;RY#;-8&(L63Y4Lq0ab(4W_ z<^KM$2mE0J|Bn6Pbpw}u?|TOBVn6@fz|Uj*{Al1F_W#~PmHlK~K4ZJVpBbhk_>H`t zWf=GX=0DEBuVK5LVBm6nTVUV~Y_~E4-@$Qaxq)wFd#*O{UF^?M17FVl-C^LD@;Y(7 zfuG6#c9(&lrp#hJVB*~FK?9$}{I44L?JWP0fiGq|e9{B%9@cqW;BP=vN-=QJGu^H@v3>S1j>{r1rBw2~ z!7uku{;J{ZYQ+DJhNG*=dlVmOIPwRH+p@kj@LL)Gk#W(7ht(R+FT4t##r#Gt0k6gZ~TW&(-*`U+Y-U6Ez&i z{eF(yCu=zJ%ln8W8jk#bU_W21;mH3xcE;rzj{Guz!y1nK0p5R}q2b8Ci}i_VIP$;8 z{OcJP`wZiLoonFoH*v4haP%Jz+txiAj;f!_a$Yd-os9oo!*w~IX*l|GCj7@FKhTx& z+QItw!I#$|iT?5(kCBWE{~x*CqYeK3j0X&US*NNDT&MPOdRW7ebrti!s^Q2#4w)gnui?ll-y1o?INAZnJqas8q7PHTS@1=S59A*d z2!0jgLm3x4i@#0l0WUXj`D4b_8jf)$fXYB>(r`U4ZPsw?*G{&>HUs}NmFz$78~pp(p?@*(2iXqEqexw{8_q9z&N$YD6gC>T??HI z{z2pCkP6ZuE^0W+m-{@A82HsZ_)i=70mffoT-qJO`X4rM`NNN2YI0DYJot~v9<9#e z=by9uz6LJe14}jV6+GY57#Dry{mbJuer#9P$7vdl_8;q0dgN(1+UJifzsQiko%_4O zz^`Sz-oU5xc&#JgC1}=ZtbG3p0hV6W|hU<2|Qp1r|_CLSZaJ0{pEN72~>vG=KaAcL= znSQ9@C`bMP^p6^jE|m@cG4=J+$ysOfxRLQ1ju3ATtw|b=^3P!YJPp_NJWazzZudz8mp}CSwt@e`>&syS z-@x0|~ zA2V>#=OqK*%=Z76fgj83;GnUf1SDib)B90jNMkh|^=#sC$zojkCGRzsYy4=36Zkr- zO2bi(=(AG8k-wSwn+*H`#-of&yYgqRw`=?;e>v;_TZ3Qj_da0oi#~4{xQEB*-9?iJuNeoal*Wj1ml`S;*vw6H$8vMB)CBH%AM@ZI-xWT`K`G0Nj zXDTt)1qQ#||NM=?&!n}>;FtTNw;KF@mVd9o-|A5X`wf1+{bD_3@XNm96$3w$<-BX) zm*C(-`q;qb{fuu6{B#~)`QVg{<3jfH{^ONA97n#SBOsk|;XlCq6Eyzmswy3`4gUFD zHe2JLtML~Z{NJ)aR2lf+cwZMW@cxWnX5iJV=R*cA`>_`cdoecL<^B6A1OJNqwbj7oImnF${zPx3$Lb_?M*l<=*}bh- zG+g&v7uOShzp8FUG+gJuqzAl-?I&_%{&KSv?&Ka7Ho

    >|?oEOMWkja@h1#Y#z|M+G2_J!$BoPLWWnV=PmRGZ_c!o6wwQ!p?kC`P zX?0xohc6ho>;wN};Ibb}W4%Pa?28HwT=oz58n~?22Mt`-$FB`s);llzH5L;K$AOUs IF6-C-1Eo2o6951J literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/server/.libs/util.o b/rubbos/app/httpd-2.0.64/server/.libs/util.o new file mode 100644 index 0000000000000000000000000000000000000000..c297bbc1ca588b2182d07d1e359db8f52a41826c GIT binary patch literal 133536 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/server/.libs/util_charset.o b/rubbos/app/httpd-2.0.64/server/.libs/util_charset.o new file mode 100644 index 0000000000000000000000000000000000000000..fbf7c13419d070b97b0a654a4a58868f0c721783 GIT binary patch literal 2472 zcmbVO&2G~`5FW=V1VY9g=iHif*wEx4oKW8JJ}{t6DP7aRf`bi z#1&qEC*X#-@*W&}<$}Zwi37~+?j+7OTsn$(=KJPn$GdAgM~|L9&N&XSIIsyL#4NyZ zZe&-LS%nfzLyUG_;etvV%gs3ja^-SomC9>X(8@WZeN&{|{8T%ZkSi#Z8xJu^`@orV zZp_RV-I>Li(nT!31jXVeLM&oTn)C`@x@FY@%`qmI5#?YWN5}ayGmWEK1Z*FFgE(zB zW6|)ar%o?!dSlGi_DiqkRf6@P;`v=Uh{Z-z#3E_e5r#>G{uAJ%2Zq zVSUf+-wlqRSPq;^KYSpPVi~-S1{MENpn?cKuNS3j&|%l^yue%7@~}l zd92=<1bqBd96xQBO!x+ByC%8582?S9S=q7A(P48G``sjXMzgYGpP*w>{~yok4DOTq zr}vWG{|<6?P0IXD1IkschNB(3haTdVhY{LXFoCmH0z=mO|H)r6@8i2xUCv{DWb&;r z*f#k#&w0$xp<$mr@^StL4m8@%Cp>AYWAi|HCSexiF5qRaKW)>b`8lwJ{;b&ZXMI_l z;_~q8Zj6U z3&oS9_4(n>s50A>M0-O*Jau!801BNC66U)a!h+Gve>0fAyClT(UK93cK;igL8Unrl zNSObrAp}Mw-hla3gH1qEb=5=D8 O|AO(F6R-XYnfQN|{li)S literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/server/.libs/util_debug.o b/rubbos/app/httpd-2.0.64/server/.libs/util_debug.o new file mode 100644 index 0000000000000000000000000000000000000000..feea30b4d4a7290d8fe4ed36788c3edcf3ea610b GIT binary patch literal 17968 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/server/.libs/util_ebcdic.o b/rubbos/app/httpd-2.0.64/server/.libs/util_ebcdic.o new file mode 100644 index 0000000000000000000000000000000000000000..0b072231f39601629a3e81042fb25627c5d74adb GIT binary patch literal 2472 zcmbVOOK;Oa5FW=V1VTfrssdCHM!XSm+A35PqE(~_df-7T~Zn zj$0yZ!3<18h;doqiYP18maGb;N~M#+m8GjlXPuC_DROpssvmMFRRk&(B?`$LShLpk z+FaGHE!1Yt;pEq#T3ttolceQFrMR%pyNLakfV#uwSO`F|vHZ^Rt+xMMYn|>PdRNi)d zITdK>?NZZSY~GeEfSc?Ox#y$jvGhG1akj_7?ReY+*H02~V>a;I4)fFQRzKX1FehTq z_hYtONPDptb{UpP#h@QD9pmia2GMZHa1Y!N_t(XzQy2SPc;3ea3v@#85{ET6Nh=rU z!@~K;#1*`Vv-2X1TL#w9tiOo~I>E=SU&2~*PFkx)16nLyHk#VIn33;yCK17mdad56 z0(||1PQPvEm3$4oIVYvQsQeA(wKKIZFky0}{jLfe<+U@lk1;W+|Bt6+h3=F3r|**4 z{}yuQoK*Rn2DD4kWuvLx!3=SWnL-BhN?0=rG}M0gKlNAD_xO%6uddVnK-C*Ec&h46 zUe{@U76bF_QBK!?&_dII#e%|qYBQV?hIb${?lWcw7wQnUEa*~^SOLXx-$Iw zo9A?FPkiFk$D}(Ueqx8nPC9v{H@_xwWm}v;-No43pbqPp5|It34Msv+?Bvmu4b`J$ z@uw*3jAqVvNzaCic-vWSaLRgn8vP|4m`~-6bPlKWoAc4QN{bNkX9SADQNV zN(ip LlV1EUq;&rPb63JH literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/server/.libs/util_filter.o b/rubbos/app/httpd-2.0.64/server/.libs/util_filter.o new file mode 100644 index 0000000000000000000000000000000000000000..80950d798f4aa1de262b46d793228b0b69504550 GIT binary patch literal 57136 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 z z&~Uhv3l~qu%R=UoaTdAUCRa6B=xQV#(nvQ~yz5b9r7@}DA6B!t@h#jeF86YaEV{@d zXRl+j+uP^^=~bPJAM_8F={|52kfM9Zu5T7XfJFaYhujz|Nq?6N*Bz4n{%43moTPue z25^^bJka&~7OU|eO5-QPT5(W&Nf;DnS(GciK(uG1Wbk$@`WT_cdh z0T4zL&P3(C;`$8V0JzALl@57|lP8xvCCigXo;pc%r73x8BRSb#Hg`!gy@uQi>JuM_ z7yO@e4;ZCUaUW+K0Z2srI0HkV(sCq@Gaf*gWROlKy_M*;=t<(}UU0@rBl)C^fsuUH znZUz{7=|ZlR0wFHE@?E9L}ynbDe?U53C2; zE$OZOAmAQJKlE?Fhe-Ni)R`&iNB<3UwxqWqog?WdE&_S4q@O~%NYdMpE|+xYnV^56 zq@P8)UeeEh4_#@I;~Ve7eu+N5-}k4bFkyvE-y=9oME{1vB>UL+ccf*%`u`Or~T^!DLIuA($M=#0kbLnQnq9l1#i{$|d76{{|i|luS?a5n$>i z(@V_k7Re+FCMcOcCKkCi$@CY+V5MYI%>uY`nPlANlb~&tWCofq19PQhPBGVm*jmYC zm^fu_mdtR$Y?4f-U^Yu8OE6m{GeT6CZIT%!eCw3VX!8xQ^Ssd;bQ*nc6~o}}y9qlf zLwP%rMBjnkrD3=mhbI|k&T_!wT|dJZCSoB%x2Yn;yKpoG`U#^cGTr-Kgo6%=0{TwG zGAj(nxlY3RD-62^eGP3`CiED{^htKTl@HfbM6-8n^1U((eZK}ZC1Q0)P_2KcT$4DFoFB@2}yY#sKKVF6A!ukHsJ`5LyXnFq~ zdEmKlzWkve{Ug>Fk1J5k?Jx<|3nI<_BQW?^~oif6!Xu( z(9)Q?>`iDOqLY)lcO*yv3mQIMgbSLaKfexW8Ijblz6bYYL{fjiQX|8V`XhF6h?M_* z52(qM^dD#|n>@W}B3wvD{nGR0Gl3Vjvr|_+Y1zI4%MjVV8p9|@CUrfE$kLg57uq17 zw)V#UNPC@U08KuBUj#meq4GtVbP`q@5rfCWI zf`b7v7~^;sdKvG+c*MIt;Z|r~wi4lwcclU#^r18I3O0c@S$xHBT|o-2pw)QSbYPB8 zPW|+1ILponQl(uWhT|9Sx*3ELrigYph$0=5VccH^9C#Q}Nk=d)V<0Mre{g+(`4JHD zu211rID7<%H1R^A2@6YDC*obM1j9H%G<0V>`T-*?y2m&s03$5A$2o9uCT4=TfDR9W z!I$akzSgk@q*JRKS`GI)hZuI*^iK{k?vlB|aTQ12i=4Q#12(e9)@d@TG$;=kaW(w~; zjtYpV7`dC>PdnEnazvkTDkJxtQwi@2PE5~ascn}Ni>g~PFAK&anb({cYYOk1g2|Lu z-VsdpiE!C)zwgBHi8D{ikrzL5mO-@gsSXNItla}n;h=#j_+WTAk}rMss60vbvqxQcVP4=U^^XqfT4ix5{ySGcvUbIu(uo- zJr0)K9|htBDeNSW{ep7?<6x$Fh@N&j_!$q zF-#9IhC4@aF5)H&E}6Ij;hvkg>4NhRH&bv!h$|9d$t12+W;}7T1(!oyx!}CS%@h6? z5jS6OKH{onj+=u*tqq2|R&WdHTD{=viCZMN7UC8Qu8p{6!L20j0;dZ$omUbUaAH0i z4iCH-?n{LAa^lvAiL{WoE9A5y?pi0V5iP`BCnpwh*UOnj+|7c!lDOLhx0bjK!X7-d zb)xySqTj$5u~{ikD|;NLlYr0NiYH0WL0WEB(&iy8Hz;ZIk(L{jG(XZFDPMuK+@PdY zAuTseX*Eb^OPM;Pb0mHKb};Le^kQ5ficW@$Mp}!kSxLkOB%4TVNV3Nj@tTRw$GcvF z*95tT!Bs5Yh0A2T3rlXitB0U_L(fHzhYa`{i<7WC;Jcaqz-Zs9V4E@EFxFn#;{iuT z^@SeyZ8Zk`E^10@l`+6HvG906<2P^~9OvF9>Z!W@610Qr*;CFjU?<*%8%4R6$HxT# zq5VR4v3AKh(?igPWD?@A?z<#&oLD@QC6go;Pkeq*Cp6zCdbShj1nh9HxB(-60Vdib zfkZqckclwB`wGa5oET7zy^`b=1EBZuE)Tql-4g~QO}yY13a-QfAVtIZLUcNdHbsc0 zp*v!ynT7?6+FY|tv{`{|a1pwO+ZgG<8Lk0q9|Qzi!u54Y7J1!RAW6launqKg;{iB} z-t`o(eZ}jE;&q649U)%FQ@h8X0(t5Ai^qVZjCj)vX&^J=ZLxEc^tWyBurnVbUy zK0&K;4h;Aln_^O+x_H-*@GA71!~JkU=y#iA*Ry_eoX9w#-yHu6!jhhVk&yb$iAeW_ z4YQf`BuMnFGRzSONf*tL2;%P32WM$)6dH(kJp-?&pr9iYli3*uxpu0}6X}3lA@WDO zcpAQ#9eAU_M;a04`jMbw2+j|)167)3B!0c<2Z`NkiGKv*Ly@nw?$||5=I1- zjudddK;XqmUYP4A!&?ZWS`0H^><8hJ3{^gkFCLPe%Iqk}gQ-?`8w}HHG3P7HS+X(Q z$rEu#Q_WJtoQ}zc$LKeSkSz3W)<|&V?4tyq{S6bJ5|Pc4lZOChaem~CG5BJ}+nomX zb*qb?Kqkqc#haWlV?{c}izi0dcxh1@BmA zjDu+Ql1~eu@i-XQ<1EMI=p#6as}E}G?M3KEo)BJ) zSpHO)$jx#h%R>AD&l41?aNsNGT;B-yZL%P|z#}Eu9k@#2A=#a{P}%H@xK`QhE>weu zte!8kEy;@Kg?JU~^Q&w|UVDwpkQj}I6Sx;2AU+xsNj=OD`h&#TiwQovl8HG)h@qOc zggBw|p92kJ+GT`T69;G4qi_XM-?0Q|jOn$8b8U|S17N+ zG75`1bXHC`siiZvmOm^l;vFGW@Sn8En*cIHvju!v504_GFW<2*lKoz6L_uD%KSWNr z!#v@p!s_!A&dnTBZD3uX9$@7^Z2BN}a4Lp`g;NPseso&H-+TM-xu>Id6z55+^ z%y>xe{vGMvAMD)>@Xj#*U)-CCM$FX_E6XIr;4s%e%|_vCuxKCEejN*AuHe z;03IuSk+9}tw`-VEbU`RgSmb=Y2OiBd(Ho%UFP!Jrh4lI4v52Ce*)YN%LI7avN5)@ z(lFmK#eF!4$;;Gc8 z_hqDe`z-gYWlV$-T8^tR%&$y*PY90^c`}UaKot*#?jp#@Fl9Q_FeOr3bA4~vrHim+ zIyfw{&}2CtAR)XF80o-!F+8ln#sEvRP>8V}m$9vG5w_;i@SE$0z-|u9OE*iIjCi~Q zuiyb6{V==R9P9$S%cs|H4SV0i!Mz{Xy2LPhT8732B6+bT`UUz{8ZgWO;)$_iT}~-% z%#L^9yKatkUZ1cCFYkdEbVO``e2$CZ&1k-2qf0@e7#fND48yS6rhwzN6tvCZwxeJL z!7G5l+KsW51Ced{jFNW2dYXchZ3RaROSUyE;~+L;t^SJ+-T-anhJAu{!M=l<1s=p0 ztujhmb|^Q(p+A%V=K2}1p~lh5jdWWjm7YDGc7 ziG~|K@y>G^K440_2W95rOQKh-9C-hlhC0*4o5ttir4#SL-E$i5VA3jqmoGTa)1HBn zCN9i2=A&qz(ybs0pZ^oDPr+*fI==v~ogkh>;|5k55IZ9AjK@799`~i*dsYl`ZkZ0kXfTzs2Dk$E-*yA z>Os1ZkT4M-$mITpGjVLfxP$_TVI1Ku!|0X-B47zmc&U4e=}b&WKuHr=__Q83%LcI? z#C9u4LAEC;1r|bos)46oai-n;xFOJdAUtkOG|hq(RG2gfq=rM=WcVCT;&|A|^=8jt zJX4jnDYj{N-U*CLx{rqY*(^Lfw_NUq7EB7m&5FNaoR$GiFbF7tW1Qo@X|fO-0%8;%ha0x}b}I*@!RZNR z8Jx}-WeWj&Ca{zdC^U?ecRMXDLUjhIhFGBL;iMW_XqBn3a1}m%%7H`S5ef^!BW?d9 zOpGEE5G>SrRsy7QpYHGk;RG`)r38F0PnaXJ@$7C!mJrDfUuGJ;;VL|9wEfnCGFI^% z)Q+R>ljq|xD3})$q&Xxff?BYhB{Fr=Rba#6UN;#!lEW9^50|9r8z!fr^~rXZaL`c6 z6uUR@Jj4z%Jl9EpHF_$!A!ggOQPd$Xb`^WgT`j<_4urHjNAwwdm>!uS5fLnu{*hBN z?4H5`WHp14)gm-Yy%wRcNKuHLDz=ZW=W1T!iv9xK(_X7Y{8~UOe!ro0BH_;g^-b&f}BQZ#YSe>05qk`)`_*}TdI7~t*p%;H{(u-6%#;*k-3p++s`hWjU_$ZjbQTi zaajX5GGMnY=RQ7aIabcr`8n>rPeC{M-C!Jy3nZ!TI#RC&2dfYq3HN$w7&Zbeqq}s3~Dq&b^zul0@?<}auBFPC* z&+k0-vY;X+*&;}h3hU${>4{dWGA8#BBxeM3M{GeR2gB9|k1nQ8lm#DKxYg2C%H(>* zsBa^4Y{4{2r78P0x&y_m{x(bfY$jPDx>{_h=f0W7Y$myHrcunK?Zj-`yriO?C}Ag9 zAzCci$QabyWIBhHVYjg9KK@ z8d$_(1YCTL&zYp%df&w;V=@kIUGOlC1x$7)NTxM&=i7oz1}vzI$zv8IZegTu`N~d= zwW8r;GTv(CXOhjL6TXei+3NkOYNT0xjitVr$ww@xl*!Ktau_Xcrr8LZEVfMMTfUVt zIgcQ0%rwVDHfCdJcbkVqn#*cCmyraF}dA>%9ylW<)zvh`DjNV^r7 zB97HtHl!y3o7P`;k8^UVbZo2Rk_?G z&8=a{(K|wa#c4bjC$E6lOztGeVJtP6{(vx9xtQw?ce8jvVtIZQreLFG)U9heiN1Ld(gFsDnS zy=e4c10s8(ybg)#Q5pB>PRlVrJM_5?F^PYog@@Bvv0@`LzuI#0s{P6aXIdh2xfS=y zlusw^Ht>-IlCGpPPF<#LKci|FH=9V!x*HeDI~xY&5Ikw{{xqwyt1ifu*XLNp@4n z$*$S2(fUhb=-(DYe@P7e+g8|`B^9l|ob_L7#io==?gfUvd?Rz*ff#p02jCe#9w%De zE@g6v1r=ozImw2YWE(MbhseKWmY+pT-fuyECI^siT$`9?7a;PRRxraBQBXfP4y@EP zEd39XNo>aSbJTkfWAdK_iQ2==X;#1ex);#2D<>K)?WHY5USvTFm}DCeKqgPI%q@sE z7j=)oopD>bOPCyHLG#(%S_>+mh4+qi;?hCpAye*=1Z}j7V=W;!kD-{}vgK?sVm3$=a`V zG$gC6p($e0o?TIE#U_&etJSKE$t?uQB550v)Kj602eKCTcHr4kaEvM1Cieu?2j-f01MkT6` zC9!ms#LyM>XflU%;UCQ40r6rI|E3%d887Deb1@*uh_1SHi$S8uc%GI>)(L+0e)@rsmS^4VOIJw@T~Tu{T32~2UF9)! zMZH0}n?m`W9a1L0kBB{UgYiQ`aKMCTGMykf;h8(#7L+aQ*Jz`@SVnytqmBAv8TD<9 zHX1dWA5eGXUwmT+idg;cR_CLhPGnLqM%%q%a)JdFF*%VS840_?l44zBtcE@&Sph_q zNmW;L?P4cb0la6+BrEuzb>)yh;`>g(RcOfM3iwC|9_nEOXf~5<7M&=L;lylq zVx85tm`U4-sQbrgCra3fk(Q$Km{gr8iQ&X~(N2^^I}vqzcRmexre(2|EwREFH_U6O z)m>Kl7Tr%|rwy^9JWF?xkH~5pVzSnP<}-PL1r;%AI~Db|5XUn>9^k`Jrf;&mn!ldN z7i@?fWxJ;FKf1u)@F>T6TX_?8;xVf;WlVl*L9?0s(t^sE+(%ICO2X=&v>N)D{KSGv znPi<%BbZdxM;Di;NC!*Dczp34iL~^R6AVfLldCPLn8^-;V)ur1&9fT%m}CXu0h6k( zXxG=0j=L;fWlX|{9K`{T)S2Y32950(>-yc&@T{O#GHeF^d~d)D$}B)47_? z4RpSa&i_r{Z~Pe!def0V7?DIgsj*J{UM9au$?q{Pr1u;xK_d8V7k)2cFTKsc?+qo> zBe@hhpFn4RTT9o+@2s%C{iKiI%hBa?==xMT7tnbTom=Ri#$RO;n_Lb;+Sxa~_>5=*)|V z?mw5WPLkU}=a1;D%R9hthw&+7mudc%cpSWnADDqGG>3-*t-~9dsv1MpHN)GoNBc*Q z8rIm*6lxn**AyCF*$@mE|5+rkj3gQxDu>rqRYfZqm66RBB6T&@1RLOg1ZWJeYz_t+ zYnp1R76pd4hAJzY1H&s?T87sLgDus=Mr34Wj2<;S&{~D&Dq1Yx|F7+a;ddb zbF1VUn&1qR0;J&!nSq9chfV?kBM5}QrnR-HS+XEg(OL&IXdGV|f-kQg*3dK&haLr6 znwuNZ3u+gvsB9EoG2gJb#=aT~)R2uT^d2rqyZ9Z{HU5UCS~3YSZ$L8QDqTaPFqli5 zTNn9-5Lv1WVQ0}5cmga25lATOC=cJ{BylyO*46sv=0(&F z_yw8raCVqx%KZ=AkzzRF%=xcuoG>+O_> zpF7*N5#-<-V&P?t)9varVfysxtC5SpEPh?#n)yh+ACJB|UR)dR>~WbhVZ69p8~-7m zo%5u5=YSssyf)r7c)GK>_Q5&Mq%GLW`HvNN#j(cObHgIXkiO1k!NRfi&Sg&^{k(CR zYr?oMu;s}3C*pI~4WBw`_^xpi?sT?|pK}-p4BI)*0p*TU`Z@hBiX3(uBe&{q2xOkK zZG&_7a#x0Hvh%`oK04nuXx#L91-qO#u5k5ner3D}#ARPjD44#_RpuJ(TlmtpiO!zo zV?wJ|Io~zjbydUV&z(tYo&PjkTbwtqxXiiVI0xNbg)jHw%M5(^$p7tFyNw z!%Ug86{J(<3N0{L{Wc)wT=WB=w?nr4$vON9v%y)q!Bu>RbLlzG9^+kuUUl}|;=JG- zXTlS&I9o1rrtv5`=Js_qyMnF>IOJ{RdCtZR*9zxQ*AM?VJiW#>w`Py)UB}t|pU*va z&bf1H4$phY^*OMszIVMh&jDXuZepo{!s-ti(`J@=rg)$(XN>X;TO15E)l8^^ird;y z1#CrYRs95535Jb^i*=r1vqpG^)dqqURf~quJ)`q%@ z>KcDlYfVM4#_$)E*0ol&)PteLU>Rq5Q^n#M1M3y&YVy}sEN*CAW?L)w=9ZQE3TEdU zjm=dRjec}f2nqsAj;Lrs&^*f@s8~|t$8RTTsR-5!^H6g~jsQ0+Dw|t_HPuFKpsJ$D zsIFN8*ph};_%(n4H1*dtR0GgdRo~E9-CEOx21ZL$i-S;Ch4Q7X4d8HPMW6<}EAi(Q zltgr}wlNf_H|UoKz=^76DEM`T@DEIY_lu;wsGfd`3qXEoQ|n(MMgg3tZVLEYYXZ%U zOTb+b*(w;~I_M8XI2a1}VJ)vQDuq6)&%!J5>jnC-LD;J+mj!DAXsMwIM|5#Bj7QLD z2>3Aqp^8RhNh1upe@R7SLv;n_g1@T10=`w)3WvWc)Cz7kh88y&O`*m9+E7!KQPUXo z9WIRJ6h}F#@SeT#-OKMsnR5i^3e*k`qLG<0u*T&|iIuHIr0gj-IJ_faP)|BZ6 ztccC6m>C9+jvR(XH8m}M@DIj!aYdVGRg0?_^rJ$IP)kj#AHD@v1hb*eXlia<4B{6; z9*g|KNWnZ<1X&iWNAJY1KNyR#o0u$ONi>?EPXQRi7LkBceRGQP{U!OOv&u@QR*UFBVnZbS*cIUk%p^;6@Rcf)Pe&F zNiL^i0LBCYP>oZyDO3fi3ex~)E-I7T5vyXLqRDf7`K5@+NMjK4r}zqH&7|oFnTef* zItRH4MJrSZbEm2%5P*5R1S?_0SYU{;AQ<&9m!L^=6BH=f(N-Kg$RV8Rwl99n4u}v& z9OtPR8Z2I-+9)N`kiJ7=V^2{54rSJ8Xn;v3@&$`x3uKrPsH(4lQp9z*v?zZ{St0zW z50pks7tVY%ij&^o5^ObUTl~$nwW5!ZhC&}&!F`y&uCciie8O#|46?8Sd;p?s&s4E- zwX9Cd_Z1e*4=6?a!HPN= zpVpcx1Ivi0BLCyfg_ygd3}Fd_&fuy8qaz%qvW&GC(gUn~)|xmL_M z(M_==Qmqb^8=~9(P!sG*s=*i~B#7WYb0gGCIUfOlTG(2*#As*{NhN)# zGOKhpA+Bi+D*{K#daE%Lmr6}zX zq^hQ1Yopv~ph|421Qu(V+;-unZi(0q@FItm1X|!citvnQ0}KXlJ77S-cAZrVtHi?0 zi6*mA1esR>EESkUBAY5hwQ|>oT_)$mUN0i2;Uc(U31D?<5G4@MTH4acIFZxp{9&K{ zP|d2dAWCo=Ax|UaX_P#j1znaqUYf=J0JtYWuqMa8R_;XA84G)tj%zB*IX9|KBM>oPP8>m#gHVrRy; zC=_eCc9Cwr26ol>%3TNLq6iP)kD#~Kf{ZJ6X+>j8eFb!vcXDF8O~pa1->?&EsKTWU zw!Ze9iAaWO_+_!y=4CK7>3#BG8yCOH0=wxMM1r%mK z786h{mT=zeLBW_g>)e^LE3jF|eL8LaaoJR6m&jL4RM;>!$qg*8!C)fLQUSfB+9yV} zqP4YR8Lb3h6{iCgU2Ahon_ZkgA`c)8)li~j<%D%Sut@B-v0z0^T3E1Qs^caR_OGIH z`^C1JlbeQ4COvFWWI8moh!RL5vrH*Mkq5PGh> zxKWZ>3+0oR3MhJVYb>r{VuLc_BUA${M%a59OIb?=Cxqpg!1Wf`_geRPqD1oc07kDa zR8a@}6tU-mThivH225~JDR+G^0CJ5|H?h9_nLdAMzR#!?Ho*i|KQ8mUpo>|!xS<;N z;eJ1cnq8%P6%Ve#V$3nO{g5M-uozl~X6F0OomDa&1}YGMXMfd(nB1-4GSmgU)qz1Z zmcos)NEy7#DDhA6mcVTVYmpSAr%M2)uC=oA{`?Ae0sr z6y@_eE4C!!epKvh!KDz~WI{Y^;bsp#ppBN;WKp__k|ov*5oHLMash@DhlF=n90hR? z4Eega3hn{zF@}W3@rUg>J}0PYYr*2!ROipi%oJH6b{sM-_=ZH@pzxsJj0nihg}v87 zg>q%i8ZB<(M&hH2Cb9bf+hSL5?O6S|WrJ-pMwo8lgg(gBD%z6aY?mq2jJ|UUM^qWy ziQ^`(LEar3ftE(tq~L>-V6)MJ0X1q-BfLQR6qL$M3}}Nj1fNyI(*ZFv;U^F277w!t zZW3TV)BPgeUD+$QxD9Eos9TJyu^(*H0~sj1K*P2f(w^oQPC~%M#I-^*as;NPxR0Hl zpI?+)h&MctR22bSsCW+Yj+Isem^)&5f|lZ;Rl&>xpS}4HzybqRLOym7wR!@vWvOhFk2e;op1d4%yFLJR?(KOiN( zXdpK+`Eo~IqI;EdT4JVSanD3IAi0UI+yui5va6}R_^#;5iOJVG&PjA%72#jco&Py@1;Cw~KPyI=Gfk zZLvRv)HVy-!hzUA!o~+%45p>Ij%qhCW29hr0(wR}!yjT>& z4183P0Z;CS!M!d#9hPcq>ixB?_(=T!`S5@S96EU0F5<``PXFu$=8$?E4@{g25d9*3 zC}JyJ#N0wVnAdneSn}PkE2P#bA{D#J3jlUJzwW@A8Pp6P)6jL+cAn?-x(|ZZS*0R z%zP<{@yEZ#VgEV)3jx!00%Ytu8((4m!<)Y9q02VGMIA%=!4qVwPfn3%e${1{!v!5f z*|;j%B2%8MS6y})%34=#V)I9m=Jwcs{FsE^{|>-(o!D{|+4pFPrOR&WqP?#cwZOd6 zCYIhF>s2iO-zWchoX~$v3EhAE>=NqaegY|uxsCF?627lXJ=i{Zw2gL!ZXPP zfAtWWqo0jMGU9N`pN)#ZkZ~IHK``x#Q&cDo6!NhbL#L<+vE-AZL7}Hl7r0g=NXjXH z3^=0AsSBm6Mo{5NmY2zNo9LqGRw z^67+UVxfV9?*+yY-a_~odD$o>d@JEtH}R+>d^h2IU(gD8toUC}^8B|UybrpOaQ=Kd zf92WTUFgAY-WBo3#TyRp?{i(q?;&~q?6tU8fOh-3kpG?J`7_bt{sH9itA=9rOM9=0 z9xd>DNBlGe9xZE+E|n|l^W0eP@zFc^$~*nqdu_4b*^5N+QL^}u4n2VsPaWxPQ2WW1 z{k#SrZbZG~D;{{l?Fc@eg{M0}S#OJJZ_>ngPhK>}H=ForX;Y}NQM#d`>?a!N@_ib* zrbdpRgu^9P0e58fo0+K3x)3oKctwA%9t%?}pmW{WThB8mSj|05;Sd*;-+C+Y+3Y)O7rBHjD!+y6;7}eirMiulhKk_<$;)V9R zyj_856|rmJ`Oo;#WAeayh6m!fKl+{U?g+qvC%ngG9P1Dsx_pof>v#v@xZ+|7!F>oG zw<|c;Zp61Jdhq!S+kHoor&5IC#sLLa_59d{p1;z*g8gX`S`6c91y}VvPdN5V^~X>9 z5X4V_|LkX-g5zF{@g)j=l7g>Ra8=LE3hq(l|Dxckd_TI+(c?d(3w)u1t9m*VT+Ijk zZhJgX{~-9!{rW(`RXsltj&VL2{`2v(f}<`z@QbeTKx{DlXZ=|UuKF`s!Bx96yTIou zxTV}Dr|NaITl=Y98JBCx+G&w3u!aMtxHt^1h!ned;F zYiKf{o{{jM^=wn{vlRSXN^bO%_aZ=jA>-pH?rDT$nM0rW7)k`nb6bQs zwyftC8UT76Bm6*rme5vSeDWW7mS0Z&%tvK#F#Z?vvrxho{u|Y)QVq|d%}=?8KS*{P zHT((c+yxqr`#?M{mM6<@GX?t!4WCBq!F3vbjK=%V8t%p$Q8@0CCrke-;vd)W8meF0 zHN2b>VV8zylRs~3_(Zy8`j>`ZL;d|q!{4NY`bon%E)KH8<8>+Zw}*z$Kmj-sHC&?b z^9mZiiS(pv_#+ete*c8+zD|n9Yx19yyjR1IlDtpDZ>M-xXgH7SVh!&`elFAS0@AZa z!&4~!*J=11;x}qIf0g0=8s44e*ES9Ri2Qj@!(XAieNDq(qxgKN;U^ORrH11VR^#!5 zhTlr_^bZYRM|sZQkj&$?h4QUGof&sgzGZ7Te}Cq54ey}5D$(!{$?hBtFQ)h`)bNGW zuR0CCmDZ0Y4WC0B!zCKNnCjAU4Sz_6&EUGi{XIhdT&>AJP5rt~!xN}J->l&S$)AlH z{sZL+*EzP!-;B3IlOINP_)QHTMEU%&hEJsN`bxvMP``fG@OjiP{tjdICxP(eD1JKL zN5c=&xSY@hezJz2Pw^Sn1wKZ@yOTWs?JE0o3H7H~ljrBX^ELbcjaP$)pF;XC*6?b| z+bcBuNy^XbG#r032ai8%I6h~G7w z{LLE9-wAS;hIb?X`F&HiTSfWvlqP=-#ofS&NUqf+&pH317>q((;fgdG`z#AwIIU0T|&Fex9-%D|r zqv8Cw*8F|8Y`2->6VT*&^S)BUU#9xgq2c`N9k*)umlTJ4G`yVV%flL;Lj8J1!@sBb z$omfV|8EqxJ(_$y>EEy6w@}^qNyGP0zwmF!@nHS<92<`$4gZen^FR&XP4j4|hQCMn zXbu0E@F^Pp1>r>+{x#wAHT+7-!}B$KKEysF_>Qr>=`;b%}BztHe!DW2bJ_ygpp zi{=@}xf{i;uZF)sdF9dYNra!N<778m!^cqE$~F9a%Fk8}e}?LCn}$C|{0a?cKX^Uo zer=_BeS;>?`28Bbh~o2vhI5_buYhFzCi(xCCeQf4G`yVRc2L7VAwPfC@OLPGoYao( zUM;*LZ zKFaeI8h$gyr(MJOyGQs-4%z=-C=PdO@>2-sb%y0JURBmEC*@~mgOhO?eGG<+rHRZm(^SpP86-@gldu!e7@`je^QsiX%# z_lXDVmmgAuUtrPjBAQ=|H2fioTbqV+e=pZ?etxlD!;6UD+y(xKhI74rR>O-ZA70n+ z`)IuRyJ@(;orE9IYD4tG=2kT)xS;Ma&{U>NR$LDknpGNx6*6?w(FUr&K z3u%58YxrH{{{ju?^@ZyP`+qO>vrUtKm-cCEG<*p0*J=0!lHaJ|zmWf1G(3sci^ny* zP^P7^L&GPKpKodSE~>wKHJqPce52uyQ2zg_;rzU^JJlzS&%-n>@QbtJV0T(DS{g5}hJQi)Yz^n{{jcl-Z`N?0FMR*U{;#3=8`k8%MFBW&)bMX4 zY}~2gg_P%8HT-1SSNuc68;E~N!=EJm?`b%GP6m&C8qV*B{ixyBQy%i?Ub(*+RJVK6 zcryMA@h58deY8(FTf<#6@A5RfFU7N1!%w9AT%h4k5#Ofayl=T&!|$McyRHj-lZNxS z->=~xP`*8(;iG9j?$mIuS8r=LuV0^NcrNMxR>RLC{5K81hwQp2UwB-$)BNnG;mtHI zoL?-@-{v}8lkY+6!gvkm{ds|gA4l_dwuXO8d03_4AJO=>X!xg;50_|o9*yHw8eU0p zxk!@GXY4}B?XOo8W`$i9F_*U}&DGm2heS1m6Uy^0gcwfV_FyL@}so^aYhaWY3AK?y) zE00$e;U{W1Ki@f1!*`PZV>Ns#uXh^$B<1sL4R58oU9I8Ql6@}H1D^%}mJ_@IXK@9nJAaNgfu zt>L4HzfHq`ru?~2!})LIp3rc%`>lpwKW4c|-od7Fk0CjFZ=oPS>U9S!I2g59Ix z{G9X?4R4fX%-E;lKT@85qv0Qt{9z3rMEtKBK8*U+jXo&NapUn#*6?<^9~r0NuVF(t znl=1%8sBR*d@IeD+cbP4$=|KvH5t{Uo?CW$#=|E z?xZ?!h;S6c@$H2Fc=W+PFoT2h;ZD+Xf`X&nEJ})#6&zLaeNm={FQj#FoPwjC^GQ#R zf}@@#l!r4ld<6M3N5N4K@4IRg9QB+_`?N)bbALUg=PE@W_3-Cfu2pc_iHcp>yReTpW8mF$@6!~ z^B+>(+3-j~JxkZ1+^c+0O(T_fZ=DGxvoHRqyNXq|CJiPn(Dwc8vYsK>oxpt^5=F1M?Xi9{w)fQcF&+Zd{Dtr z{xq7`PboOczf1DZC^*Wm#fxx!px_Ac`#t+K{7*EGzE*J5a~I|F&kBxu4w3xt3Xb`( z7yjeXjXsFX_2Dww|0gRr>Ny1k;OI{{kGqHJ&l!rmh#QUjXaz?-H;|t3nx0z9AD@Qv zZ^TzkjwX+i{|_s;s^>igrw|KGpAyb-n@xH0jUq3) zMDslkKim%o%k#RKq~I8zZ4{rAG(3Zh57Y3qgpbqk9|+G;a2yx@JH6=&j&^<2=^_Oe z<4FCQr{E~RiR2e5ILdSWFH&%n??=ytTNE7SIsaEEIObdU)Nx zUBOZQK9av%!Ns~v`v0cjsOM_aQg|-)i{Z2>*$2REv4Vzs=#qKZ1gTasIqlUjUY9M|ob?;_#2S;K2B! z{1+tOL%~sg0M)A$1xNW@x{vT^_``&sqTr~9=gV*fM?GWk1&&b)F4ham=LrgqdU#({ zNH~x0da4^fMIQC=`d+2rXp)~VHEMVq&^`d zj`DYt{H=s@ztU*`@R)`VBm83xFDCqV4PQriD*lle9IT&ziu+8$c|NY7aUZSV=;ur1 z=QvFd|CDxthVyUWG--GV?SF3W0>7Vd&d=j8cyK(V$@@vq>l(hA@Pit@i1NgVf0PIZ z$KgW4kJoU{t05ZRpY(e*TxvCp5)D6# z@1*{E2vihabqY>fG-w5%^H=ns{t0yP9z`BY#$M91U6bedyr|&l&n@Kts|v2h z=RE~S`8P@aBL!FE^QD5Ld;(sC&-+RLw;Im()xT@_1$^H%2pYq|_46&llL%)&tI5xK8qS~B zT(0Or|F58RB&^Bv_ke8Dq=sKg_%029mGJj8JdO6L9}#YXZp?@0 zs9#4EdG!AhnqTJ0z`()s{Cy>Z2{z3cXt2FtoWcPMWo}b%qQE>Ftl+4J_cyy09OZw-0fl3af}{KmwEx(v;3z-XfznVv6&&S1A^GnJ=RDz` z(>^g>G_&sOZ=?7OC7k8?z92`F=lD!laI`y&*6Fz#eh1-xP5(O-|7DtdD%Jhvnmqp$ z^q(}Ge^~l%MGwZOiJm7ssLAv9_`IpeqyM~4f2!fPkU!sP_!or#r0M6+5%oDGGS2-e z|4$&C#rr@|$+DiGkopA0i|7PU-8qU8#{Hunqq4@MYRrZ7RTu0+OoNyGw`1GOs z_pzG%CX%14$Yb1A(>!U=@XrWes^ODqyf0R8?C*Ef-!%%3{`^Ag$XW$QyR7F%!nt2h zk)L;JIR7AUr=kb-UqtbFS(E>c^c+;=(QXa-|Eq@cJTXoKAvidmPtrU+fpGSdKi7Mf zf@jI5;&rB`=Ms7@G)Ixgkn#6bEmP#t&wrDjS88|x<;Tq$egokf6ddEj{y#}L`#+fW zQLiYt>i^f8o)Xb3*qy%{WbYf@$$+b4X-BrObriX zkl;95!@r<7PtkCG-*%yf8{MUzi!{7}^xv)FyQve;YWRAx`;mt8zT#UA=f86}rs3z% zdUV!M=@-XyqhyUD4L_aYT&v;y_f+dN{FqBBqOgiQr=?n4V4CxU%o>Mie(Si01n@G6 z2xOFodx-aHcqj4aX}AXs!EvQL3EillpGUo|;hbEfs2%&m&n;JK_$C_n>ouJ3-#2S` zC&_neINw*|_x$0(c6nm_sNp#j|GpF~mgoIH_mAcWM-TXlDLY< zC?=vU(c12|XmDG$bU#kj)5g_y-JllKR*zP5HS-^@R6hCS`R zbMk-p{_gMHci(*<|BuOSm#@FVVOc^KORNxCO`}4*JSQtRNwG;(h?%0ft$FyhcHi(9 zt-j%tzS}=~glxWhZ>ehP^zALEo)2yKj;cdc*N?xCcG9?J_#NNy$E+u-nta2@rBXj$ zHa4SR_?7fKW#bE8Xa&raXMIWmY;sqgk@5!>}QG;e!Ga=OaSTO$O8{;hBLD~kRzU-~1L zYMp-8pM$ zfSax+quamnyRHmelVY zPrl*1x2?)m|D}d_+CNeJz4u7x6ltlN>|&a1M5BYPt6#9NVNv6yi!Tdw1Uo}r7%`XT zRjb!re#Kf}%epJqUv>3{jhn7%ZEN3r?Ut?ADQb65_>Z>t_C=zxo8pONYDfRT;LTZg ze^4tfo-71)Ma3oeP0r>y=-{rXa#%7i4#y;5jsjJ=RAm)O&{2rWSx^{`B!$BzHQ9kP z{fA^w;vEnjs$rq4$aObVN0F8h-m7L{2`$)e;L*8Yq<%No&*CtY$a ziAAmt=_)&s-d&BqC7lKi(A+%;qeRq87#v~x(AN}zD8-%VHNf08~etFwp^v54&; zrsHBQ!s^rINfxaAb7*VMh>`g;Lo+&3U8Dj>nTd==Mv9_$&fRG(B+JjsU@{m>mJVZCOuZTnTHD%YyT6(L#8+BOsmvx(wWW- za*TT2Ph=IE$UL)Pwvmy~tac3NGpkL{ZQ9FK70XmCk1ca5I*kc+vikgc%e?Y2Z zr0E<$)*iURtlXt%rGjD}(jA=pqs**>P7UtfOwG@Gh2YBbj=<>oM@`9$=wE3>Nup(= zr}HLb#Z29&tZJrcPIKk}YfGkojF>Y0Q#sxHb!-UdATCs_{r^R`1f+Za#KG^^%T^8k zA+=`r_0N*aeiW@}q4b|GogBao3Pq70#-ZRG+10Pq@4qP3q5jNBux_s<4;bgjzW(eG zv2Odb2DKV(_TyyVuk3m?p6JJF?5DIM0F+5|`i$F2Rvl5CBSSVvSY&T82RnmSJ;gC` zLCZ9rBGOzOkH_iY!FlPX5M*APc(l7NAY`(hOW{I`3lPVYLpXkw__q+NfR=81gRU58 zwOn5ci~z(0OR#ztxvNGNxy=B~_rNSKvSE?jYO=X|5Oa%NSdCe%eis+n{6dn{-YWYO zc~8L-lXiu=eDbz~ysDY5&qNHR6L9{?vq^=8Q38#BW$J3Ua#TbeEK%twngrl#HXrO%;E>N)l%f(WM6BpwZ6Ewu3sWA#1Im z%|a@V+CgfC%}V6T;oTM`uwF)a_T9TJ;iwo{MZDQ$5HJWaM{yolRSE5!tUn>nJ%Vbf8&d>6p&Xt*=VhpcNT8x(EyzN?WU)lM7XKy#wQ5n{bPEKX;G=BMsp>Kf+qC#t2HLDeJUXDj zSKFx8bPtx;tjxJr?b8yQwD|YTvcxtmYKL&YDUbVYrsJy_*vNH(7#ZI=se_|%+H4L*=H-lkfTk+Do=cJ2^$IbB;~quHTT#H<`&F|}?3!&Y(W>2C z%T1jkZjEZCHw)f6s+Ex}xN}r1V_ERFQLVhlpe3%+;wyHZR(_EMcaCc1t1NhH&g4|G zaVgidB(?Zq25Qx!c10|nlWavdB$OFk(=2OoGy`qc;sJ)##B1$fmZ+TBu54<^P};Qk zPzGw%qIL-PZKGPtx^J~PmSP?ISjjckg2}mr0A;4TsI6$XHb{y(wRN1wgmx748lBCBQ8QdIQN2*^87N(MW~5 zvbR&gu}`Har}XH=%ZVPq7Fo^`*D_~n3sv52pV22O$8lV`aaoGXa$FL)jN;OQ%k8~K zuG{Lkc;=N$(_34*Yn=6;Zgk$fWy{ysEh%s~*DWisoQqvuB>JSdZsY|tT7iq}C%8JQ zr`xI+s6fN| z;qk}?10RC+N_P@5lbcXzyT89D6vwE0qmgcpydV{R3Shg!WM<@|7MuZpFctR)qrIuV zhzLd_$2>t}#36b(ETGn4Kdz4|ITS^=`Yiyv7Q;|ftI}+;j z1bYIMFQQX3e@7q@5ld5e($>^g6BwNVzs|nhX40OOc_K!l6q6hSg|yw@6$tmrsIZy4Xmj@Bo%Idgx`vAsinDzNE>x_WuMyTjxi!0Vl4~Cw^L2#j&rI?iVwJo6 z9>*GY#UAGxw|YNMY_=D{f$_BhtME7H!jZcmH5 zVy(NpnLaAaC({7zROF{A$s>E3d^b5hEtW2c*<2!U+y86H)g90JO0>C z2G5%q?4#sTos6rxM@#WgZ@??JwwF$qfbe!C62cpgLIJ(rTd!5BLGBE7q`LidjztB_ zfsT%NXouEtrrDW+cpyS&l{Rb5=8K*iLfTAS3U4sl*B7EC<&Dr1_0j^bk<-m?Lp}bk zc%U!D8TkDx4>hG}#ocs5X=2TMj4GeNQXk*w#+*|IE>uuC-)m=)ihlG%8okBK0vd39 zQ?Zx#GWTdZsi|A~-}d#?7X2@vKYP*r%Wvp51Gp%H*)-XpCEpu)SSPAgu$m7=g-i9$_m4|?qAoB z5GP;zlV{83;$l^0uDYGBpWyZx0t?ld56KfPx}8Q}A_16@CNZDezpRN|>+x&&c@m5v zN>dN#??xsf9avJjz0NE4w|RD;$=BTf>riaPj6YxOpuap1Mqd}@FKuT3*xvd2 z|7o>q|8rGku4exkgCT%dApZNb0ZY}Hvx*hVnKu%|moLM>jm=GNaBNt%yGgThEw4@+ zZiC4WPNv-AR6nBT7@X?I)I2zLcy4j3pNew~^m9fI2Ea)_66Y&U^;>C<$*F!`%7dGC z5A`GIG+X}lci0Q4b-rHf&Va8x1CIMiK0nu;0pCtI;u)tJMLwTVjdL}hpFzUGKS4E$ z{t0m}$@%zyMz|a=?*p7yD1SwN`S_2X0k^-hWS-6^zK!C=2hYFqZB;9o7e-}M&&Duj zUQzQrN6Y7IdJ4mfN$%^1Y^~l~mC^Pdntk~MEBg*8YA|RjNCVEHZ}1y5mE{1b0LLvu z+{Sl8JyCja&sgiFF`Xm7#cnkN3oTF$w$vEZ? z1!-bP>KDnY;`5`SMCxof{Eu^fFE#LY*x3pLcQSstfluQ2*BkiT?7!8(n^+GRxc>Ct zW#EJC|0V<1-{^N5xZXea8u$T@U+)*4PyCY&%7d!P=JYnFoxZjg!z>C$+dw5*62L2f9%MAPp*7doi`yFR|v%x>gdeFe}|Ar_r1Amdnb*q6l zvA);97jmBOGjRRALjPu^p#Pf_i<4>1a2CnZH!)2_DZ@1y_qwm?fZ8-RMG5;>cp&}3U^oMf5z?&5;{>8wrX8c0~ z$8$VN84ptX*Y7Vr#t{qRe4NL7jlmx$8_G>KKH9v>@$azV@YBioE*lR10-oeM4gar^ z4dp=tKdxZ$q|Fcf>;3tx!PocEU)%WT7ymkp^1cm+pPd}%r#2k?7nuK*4F|uE@j`wO z1Q+;T_ETZQVblA++Q37cXD{Pu4%hl;?nWD5KU8U`nHXac=|b>_iQ-)9Hl>$Pi#2&|IYl+Z8-RPUZ(L&2)MxY zzMf;lVOzxWbiNG-KhAlsGw|&^u9b{KMgAA@{BAMuR>lVmT;Jy&H1HkFKWyM>#@{w@ z{k^`7KQ!s_>hpRw|-2@R!)n`v!hK&zFl|x^#XHG0w|J-YdAN^iEs~>$e!VK7S4wxOVoxUZ2Xx literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/server/.libs/util_script.o b/rubbos/app/httpd-2.0.64/server/.libs/util_script.o new file mode 100644 index 0000000000000000000000000000000000000000..3e7d092eea2f6fbe3e02d7c331c4a39b6335f849 GIT binary patch literal 66232 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�xqxOeOxU6Gtcpdv#)jO6=2#QOdSH(uql`??2ax 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/server/.libs/util_time.o b/rubbos/app/httpd-2.0.64/server/.libs/util_time.o new file mode 100644 index 0000000000000000000000000000000000000000..b3ca86f48bbb8b09d83b5ccba393305a4b132fd2 GIT binary patch literal 18000 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 JhK6%J{~zNvv(o?o literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/server/.libs/util_xml.o b/rubbos/app/httpd-2.0.64/server/.libs/util_xml.o new file mode 100644 index 0000000000000000000000000000000000000000..295b9bc4b293db8c9440f6adcb8f5a16e35354cc GIT binary patch literal 29408 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

    _b4FR=jIuy! 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 N=Q?Bt?I7oQ?GU?4iZ%cM literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/server/Makefile b/rubbos/app/httpd-2.0.64/server/Makefile new file mode 100644 index 00000000..3c3ad912 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/Makefile @@ -0,0 +1,91 @@ +top_srcdir = /bottlenecks/rubbos/app/httpd-2.0.64 +top_builddir = /bottlenecks/rubbos/app/httpd-2.0.64 +srcdir = /bottlenecks/rubbos/app/httpd-2.0.64/server +builddir = /bottlenecks/rubbos/app/httpd-2.0.64/server +VPATH = /bottlenecks/rubbos/app/httpd-2.0.64/server + +CLEAN_TARGETS = gen_test_char test_char.h \ + ApacheCoreOS2.def +DISTCLEAN_TARGETS = httpd.exp +EXTRACLEAN_TARGETS = export_files exports.c export_vars.h + +SUBDIRS = mpm + +LTLIBRARY_NAME = libmain.la +LTLIBRARY_SOURCES = \ + test_char.h \ + config.c log.c main.c vhost.c util.c \ + util_script.c util_md5.c util_cfgtree.c util_ebcdic.c util_time.c \ + rfc1413.c connection.c listen.c \ + mpm_common.c util_charset.c util_debug.c util_xml.c \ + util_filter.c exports.c buildmark.c \ + scoreboard.c error_bucket.c protocol.c core.c request.c provider.c \ + eoc_bucket.c + +TARGETS = delete-exports $(LTLIBRARY_NAME) $(CORE_IMPLIB_FILE) export_vars.h httpd.exp + +include $(top_builddir)/build/rules.mk +include $(top_srcdir)/build/library.mk + +gen_test_char_OBJECTS = gen_test_char.lo util_debug.lo +gen_test_char: $(gen_test_char_OBJECTS) + $(LINK) $(EXTRA_LDFLAGS) $(gen_test_char_OBJECTS) $(EXTRA_LIBS) + +test_char.h: gen_test_char + ./gen_test_char > test_char.h + +util.lo: test_char.h + +EXPORT_DIRS = $(top_srcdir)/include $(top_srcdir)/os/$(OS_DIR) $(top_srcdir)/modules/http +EXPORT_DIRS_APR = $(APR_INCLUDEDIR) $(APU_INCLUDEDIR) + +# If export_files is a dependency here, but we remove it during this stage, +# when exports.c is generated, make will not detect that export_files is no +# longer here and deadlock. So, export_files can't be a dependency of +# delete-exports. +delete-exports: + @if test -f exports.c; then \ + if test -f export_files; then \ + files=`cat export_files`; \ + headers="`find $$files -newer exports.c`"; \ + if test -n "$$headers"; then \ + echo Found newer headers. Will rebuild exports.c.; \ + echo rm -f exports.c export_files; \ + rm -f exports.c export_files; \ + fi; \ + else \ + rm -f exports.c; \ + fi; \ + fi + +export_files: + tmp=export_files_unsorted.txt; \ + rm -f $$tmp && touch $$tmp; \ + for dir in $(EXPORT_DIRS); do \ + ls $$dir/*.h >> $$tmp; \ + done; \ + for dir in $(EXPORT_DIRS_APR); do \ + (ls $$dir/ap[ru].h $$dir/ap[ru]_*.h >> $$tmp 2>/dev/null); \ + done; \ + sort -u $$tmp > $@; \ + rm -f $$tmp + +exports.c: export_files + $(AWK) -f $(top_srcdir)/build/make_exports.awk `cat $?` > $@ + +export_vars.h: export_files + $(AWK) -f $(top_srcdir)/build/make_var_export.awk `cat $?` > $@ + +# Rule to make def file for OS/2 core dll +ApacheCoreOS2.def: exports.c export_vars.h $(top_srcdir)/os/$(OS_DIR)/core_header.def + cat $(top_srcdir)/os/$(OS_DIR)/core_header.def > $@ + $(CPP) $< $(ALL_CPPFLAGS) $(ALL_INCLUDES) | grep "ap_hack_" | sed -e 's/^.*[)]\(.*\);$$/ "\1"/' >> $@ + $(CPP) $(ALL_CPPFLAGS) $(ALL_INCLUDES) export_vars.h | grep "^[a-z]" | sed -e 's/^\(.*\)$$/ "\1"/' >> $@ + +# Rule to make exp file for AIX DSOs +httpd.exp: exports.c export_vars.h + @echo "#! ." > $@ + @echo "* This file was AUTOGENERATED at build time." >> $@ + @echo "* Please do not edit by hand." >> $@ + $(CPP) $(ALL_CPPFLAGS) $(ALL_INCLUDES) exports.c | grep "ap_hack_" | grep -v apr_ | sed -e 's/^.*[)]\(.*\);$$/\1/' >> $@ + $(CPP) $(ALL_CPPFLAGS) $(ALL_INCLUDES) export_vars.h | grep -v apr_ | sed -e 's/^\#[^!]*//' | sed -e '/^$$/d' >> $@ diff --git a/rubbos/app/httpd-2.0.64/server/Makefile.in b/rubbos/app/httpd-2.0.64/server/Makefile.in new file mode 100644 index 00000000..12dc7d87 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/Makefile.in @@ -0,0 +1,86 @@ + +CLEAN_TARGETS = gen_test_char test_char.h \ + ApacheCoreOS2.def +DISTCLEAN_TARGETS = httpd.exp +EXTRACLEAN_TARGETS = export_files exports.c export_vars.h + +SUBDIRS = mpm + +LTLIBRARY_NAME = libmain.la +LTLIBRARY_SOURCES = \ + test_char.h \ + config.c log.c main.c vhost.c util.c \ + util_script.c util_md5.c util_cfgtree.c util_ebcdic.c util_time.c \ + rfc1413.c connection.c listen.c \ + mpm_common.c util_charset.c util_debug.c util_xml.c \ + util_filter.c exports.c buildmark.c \ + scoreboard.c error_bucket.c protocol.c core.c request.c provider.c \ + eoc_bucket.c + +TARGETS = delete-exports $(LTLIBRARY_NAME) $(CORE_IMPLIB_FILE) export_vars.h httpd.exp + +include $(top_builddir)/build/rules.mk +include $(top_srcdir)/build/library.mk + +gen_test_char_OBJECTS = gen_test_char.lo util_debug.lo +gen_test_char: $(gen_test_char_OBJECTS) + $(LINK) $(EXTRA_LDFLAGS) $(gen_test_char_OBJECTS) $(EXTRA_LIBS) + +test_char.h: gen_test_char + ./gen_test_char > test_char.h + +util.lo: test_char.h + +EXPORT_DIRS = $(top_srcdir)/include $(top_srcdir)/os/$(OS_DIR) $(top_srcdir)/modules/http +EXPORT_DIRS_APR = $(APR_INCLUDEDIR) $(APU_INCLUDEDIR) + +# If export_files is a dependency here, but we remove it during this stage, +# when exports.c is generated, make will not detect that export_files is no +# longer here and deadlock. So, export_files can't be a dependency of +# delete-exports. +delete-exports: + @if test -f exports.c; then \ + if test -f export_files; then \ + files=`cat export_files`; \ + headers="`find $$files -newer exports.c`"; \ + if test -n "$$headers"; then \ + echo Found newer headers. Will rebuild exports.c.; \ + echo rm -f exports.c export_files; \ + rm -f exports.c export_files; \ + fi; \ + else \ + rm -f exports.c; \ + fi; \ + fi + +export_files: + tmp=export_files_unsorted.txt; \ + rm -f $$tmp && touch $$tmp; \ + for dir in $(EXPORT_DIRS); do \ + ls $$dir/*.h >> $$tmp; \ + done; \ + for dir in $(EXPORT_DIRS_APR); do \ + (ls $$dir/ap[ru].h $$dir/ap[ru]_*.h >> $$tmp 2>/dev/null); \ + done; \ + sort -u $$tmp > $@; \ + rm -f $$tmp + +exports.c: export_files + $(AWK) -f $(top_srcdir)/build/make_exports.awk `cat $?` > $@ + +export_vars.h: export_files + $(AWK) -f $(top_srcdir)/build/make_var_export.awk `cat $?` > $@ + +# Rule to make def file for OS/2 core dll +ApacheCoreOS2.def: exports.c export_vars.h $(top_srcdir)/os/$(OS_DIR)/core_header.def + cat $(top_srcdir)/os/$(OS_DIR)/core_header.def > $@ + $(CPP) $< $(ALL_CPPFLAGS) $(ALL_INCLUDES) | grep "ap_hack_" | sed -e 's/^.*[)]\(.*\);$$/ "\1"/' >> $@ + $(CPP) $(ALL_CPPFLAGS) $(ALL_INCLUDES) export_vars.h | grep "^[a-z]" | sed -e 's/^\(.*\)$$/ "\1"/' >> $@ + +# Rule to make exp file for AIX DSOs +httpd.exp: exports.c export_vars.h + @echo "#! ." > $@ + @echo "* This file was AUTOGENERATED at build time." >> $@ + @echo "* Please do not edit by hand." >> $@ + $(CPP) $(ALL_CPPFLAGS) $(ALL_INCLUDES) exports.c | grep "ap_hack_" | grep -v apr_ | sed -e 's/^.*[)]\(.*\);$$/\1/' >> $@ + $(CPP) $(ALL_CPPFLAGS) $(ALL_INCLUDES) export_vars.h | grep -v apr_ | sed -e 's/^\#[^!]*//' | sed -e '/^$$/d' >> $@ diff --git a/rubbos/app/httpd-2.0.64/server/NWGNUmakefile b/rubbos/app/httpd-2.0.64/server/NWGNUmakefile new file mode 100644 index 00000000..f2f6da75 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/NWGNUmakefile @@ -0,0 +1,251 @@ +# +# Declare the sub-directories to be built here +# + +SUBDIRS = \ + ../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 + +# +# These directories will be at the beginning of the include list, followed by +# INCDIRS +# +XINCDIRS += \ + $(NWOS) \ + $(APR)/include \ + $(AP_WORK)/include \ + $(APRUTIL)/include \ + $(EOLIST) + +# +# These flags will come after CFLAGS +# +XCFLAGS += \ + $(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 = genchars + +# +# This is used by the link '-desc ' directive. +# If left blank, NLM_NAME will be used. +# +NLM_DESCRIPTION = Generate Test Characters + +# +# This is used by the '-threadname' directive. If left blank, +# NLM_NAME Thread will be used. +# +NLM_THREAD_NAME = genchars + +# +# If this is specified, it will override VERSION value in +# $(AP_WORK)\NWGNUNetWare.rul +# +NLM_VERSION = 1,0,0 + +# +# If this is specified, it will override the default of 64K +# +NLM_STACK_SIZE = 8192 + +# +# If this is specified it will be used by the link '-entry' directive +# +NLM_ENTRY_SYM =_LibCPrelude + +# +# If this is specified it will be used by the link '-exit' directive +# +NLM_EXIT_SYM =_LibCPostlude + +# +# If this is specified it will be used by the link '-check' directive +# +NLM_CHECK_SYM = + +# +# If this is 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 = + +# +# Declare all target files (you must add your files here) +# + +# +# If there is an NLM target, put it here +# +TARGET_nlm = \ +$(OBJDIR)/genchars.nlm \ + $(EOLIST) + +# +# If there is an LIB target, put it here +# +TARGET_lib = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the NLM target above. +# Paths must all use the '/' character +# +FILES_nlm_objs = \ + $(OBJDIR)/gen_test_char.o \ + $(EOLIST) + +# +# 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 = \ + libcpre.o \ + $(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 = \ + 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 = \ + @libc.imp \ + $(EOLIST) + +# +# Any symbols exported to here +# +FILES_nlm_exports = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the LIB target above. +# Paths must all use the '/' character +# +FILES_lib_objs = \ + $(EOLIST) + +# +# 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. +# +install :: nlms FORCE + +# +# Any specialized rules here +# + +# +# Include the 'tail' makefile that has targets that depend on variables defined +# in this makefile +# + +include $(AP_WORK)\build\NWGNUtail.inc + diff --git a/rubbos/app/httpd-2.0.64/server/buildmark.c b/rubbos/app/httpd-2.0.64/server/buildmark.c new file mode 100644 index 00000000..a9cd6844 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/buildmark.c @@ -0,0 +1,29 @@ +/* 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. + */ + +#include "ap_config.h" +#include "httpd.h" + +#if defined(__DATE__) && defined(__TIME__) +static const char server_built[] = __DATE__ " " __TIME__; +#else +static const char server_built[] = "unknown"; +#endif + +AP_DECLARE(const char *) ap_get_server_built() +{ + return server_built; +} diff --git a/rubbos/app/httpd-2.0.64/server/buildmark.lo b/rubbos/app/httpd-2.0.64/server/buildmark.lo new file mode 100644 index 00000000..5982051d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/buildmark.lo @@ -0,0 +1,12 @@ +# buildmark.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/buildmark.o' + +# Name of the non-PIC object. +non_pic_object='buildmark.o' + diff --git a/rubbos/app/httpd-2.0.64/server/buildmark.o b/rubbos/app/httpd-2.0.64/server/buildmark.o new file mode 100644 index 0000000000000000000000000000000000000000..8dca29136befa9c73224a7f855111d27f10f3eec GIT binary patch literal 5640 zcmbtYU5s1B6`rxZyH1>SHrYTnSsqNqPbm0$y*SIVC1I5)Nw-a#2oyDafXlu1wbzP$ zuem?l4OIa_9sp4lsH*-U5&94X)Q5-)$O96HR_Y7%q2eJRc<4)Md4i}#LgDY6GiU6( zWAoA;$#>58%{gbzoS8cw`=LWe4`-wlTBO)721v6){3}1umq}d~SBdT7BIcUdBx-@sI_$(ttj=J*{duV|1K>(4FG*l)tfn+A9n!IWxS!Ob0*q6d=no*8p`SJV{2vq{d3f(l>PctCa%!JGn;z@h>f0?P{I2z*z8 zF#^XG7$71$y%;hq9h1Y!lYOAmV16}Vc~06eU~PPqc$5d~)C zX^8fy0@ujL0X(L_^|A+MPbpx@M*#drfeL}M3d|8WuRxW+1qJ5i)8KPafg0uZh5`%n z7ckCWL;?Cm?sv2dGr6-kNma_{QDyxPI9*xUo<+6lYxI#DR>2MYEut1!*n)goJ5DtxD~G7WLIf(ayy4dRI#1UC6; znJpFyXe9w|n(VtQg7s#GV=L1L3pyZ7S<01Z^q9OB;#8osXo)*_sqt>ywK9#VEzkV= zz%C)S*7`v+GccC{ymQwb&@XO*56%qIp{IW6qG_yKJRUOQ1$at%r8o&sI&k0=kd-6~ zD{a5tNg7^deR08FsFgcyKUpug{G{Tx<4BN6r|ni+_4=?$&05s{%94W#;U?`)qw9pH ztU4wVpYC~)wTg#Z6gL`P6Lgpa1a1eQ!cqdQRj90*AUI}s%N?00I$dcwi`4c2Mn@MgD_6dZh5gCdEuHD+BkKvsjoV1UvvV$RiejG+{jtu z4EtT+6K*KouxGRygmJ0wfk|TNd`gu<(mWyWPEbFEbHr8f!bsS?AQDG@c%pQ$1nXwi zO66{x_};#j=X+th4$ukftNUOdloz10RVp8wFO{27?9@+{dtnfJ^*Des1)T=YoC<+s z(8y{Km~|4`^`Mh>3-p7heAs%5UKpk#(y;#Ni1M8yr_7&7+ir=m)j zxNZ(6H}lpU^xvu6=}gi6aLOE|vD2a1%dHRLRTp38CtP z)tWU|yGgM^?7(*fL_Tnrkn2-&cFRQmDR@_qzlM6?FyfXPD>~hUstGHKL)EToE%Z8$ z6=Pwoh7&u&a-&FCVW0r@Has_J*=@fWfDP%6>xSMMn4vRMq2sqabRBSTIC$Cx#uHXO z=ypBWf|d{4!-CCKrtQK`-m2XUoi2Xc{eMydcf7W2r~%+*_@J0PeFLa2dd|W#m%>`T zMBgWHWnco1Xc|YKteU@p`Tkc9+aKoEY%tff;F*mv|5yJi_+rfdu?RZKan- z-w)kpPUxXm<_jaRX?r`^j;i0sT)&HS2NVM9hihTh?|Z{t|<1w%v<^KWQ>xK9>$J34W(=FZ>wXSWjozR6!lc1Zn z=a@6n6nXYH=VgX{9{fku@8c2mn*v+yuj{%EIP={DN-VPB1q3NE^G9svj^=yl@+!o` z?11Mrz7pp6xTi*qf1ckT3;NSyj-T#J>u8q~pL~_(w4NPW1=W)snF;1MT;WM@k%BiF z=;?DNo8tAD*k*@LW7V7OS0!zY_VmMIBS~@aO&FG}z^sNPt9~2|b!64=fe}0}UaDs| z=-X3u!?TPeeVyI#RX^(LH`xE1!MPtJr6aHR2*%%n4-n*W)<<{);J!uC{6`A**Fp0w z-kkXR00rIC`}HPbRUGuuqTf3m=Y8(Dja$vDKMn-^JE27LZN`TT{!_+B4gQy$)ZGTZ zhk3`~k2Bvi_#ZIFa~VbF^NfPxL2fnwZ?5Oh4gMwOwV$@f`vS^ys_Dmnl`)=YDBAuC z$9YB3eg0dF-!%9GJg>hQ{0YYI8NA-9|1@}p;x{26 z_$7{0HF!Or{RThJ@xO2I*D^k7@V7Je3|^npp~1h(_#uOTi}8~N|2X5{8vHrNy4Cf0 zkNH0t_ES8sHw^w)jNdl+Gh8410_DeFpz~=Jh;uoOhT%Vc7qXv19ND*#4}+Kg)T($UK^{NpFunc = pf; + pHook->aszPredecessors = aszPre; + pHook->aszSuccessors = aszSucc; + pHook->nOrder = nOrder; + pHook->szName = apr_hook_debug_current; + + if (apr_hook_debug_enabled) + apr_hook_debug_show("post_config", aszPre, aszSucc); +} + +AP_DECLARE(apr_array_header_t *) ap_hook_get_post_config(void) { + return _hooks.link_post_config; +} + +AP_DECLARE(int) ap_run_post_config(apr_pool_t *pconf, + apr_pool_t *plog, + apr_pool_t *ptemp, + server_rec *s) +{ + ap_LINK_post_config_t *pHook; + int n; + + if(!_hooks.link_post_config) + return; + + pHook = (ap_LINK_post_config_t *)_hooks.link_post_config->elts; + for (n = 0; n < _hooks.link_post_config->nelts; ++n) + pHook[n].pFunc (pconf, plog, ptemp, s); +} + */ + +AP_IMPLEMENT_HOOK_RUN_ALL(int, open_logs, + (apr_pool_t *pconf, apr_pool_t *plog, + apr_pool_t *ptemp, server_rec *s), + (pconf, plog, ptemp, s), OK, DECLINED) + +AP_IMPLEMENT_HOOK_VOID(child_init, + (apr_pool_t *pchild, server_rec *s), + (pchild, s)) + +AP_IMPLEMENT_HOOK_RUN_FIRST(int, handler, (request_rec *r), + (r), DECLINED) + +AP_IMPLEMENT_HOOK_RUN_FIRST(int, quick_handler, (request_rec *r, int lookup), + (r, lookup), DECLINED) + +AP_IMPLEMENT_HOOK_VOID(optional_fn_retrieve, (void), ()) + +/**************************************************************** + * + * We begin with the functions which deal with the linked list + * of modules which control just about all of the server operation. + */ + +/* total_modules is the number of modules that have been linked + * into the server. + */ +static int total_modules = 0; + +/* dynamic_modules is the number of modules that have been added + * after the pre-loaded ones have been set up. It shouldn't be larger + * than DYNAMIC_MODULE_LIMIT. + */ +static int dynamic_modules = 0; + +AP_DECLARE_DATA module *ap_top_module = NULL; +AP_DECLARE_DATA module **ap_loaded_modules=NULL; + +typedef int (*handler_func)(request_rec *); +typedef void *(*dir_maker_func)(apr_pool_t *, char *); +typedef void *(*merger_func)(apr_pool_t *, void *, void *); + +/* maximum nesting level for config directories */ +#ifndef AP_MAX_INCLUDE_DIR_DEPTH +#define AP_MAX_INCLUDE_DIR_DEPTH (128) +#endif + +/* Dealing with config vectors. These are associated with per-directory, + * per-server, and per-request configuration, and have a void* pointer for + * each modules. The nature of the structure pointed to is private to the + * module in question... the core doesn't (and can't) know. However, there + * are defined interfaces which allow it to create instances of its private + * per-directory and per-server structures, and to merge the per-directory + * structures of a directory and its subdirectory (producing a new one in + * which the defaults applying to the base directory have been properly + * overridden). + */ + +static ap_conf_vector_t *create_empty_config(apr_pool_t *p) +{ + void *conf_vector = apr_pcalloc(p, sizeof(void *) * + (total_modules + DYNAMIC_MODULE_LIMIT)); + return conf_vector; +} + +static ap_conf_vector_t *create_default_per_dir_config(apr_pool_t *p) +{ + void **conf_vector = apr_pcalloc(p, sizeof(void *) * + (total_modules + DYNAMIC_MODULE_LIMIT)); + module *modp; + + for (modp = ap_top_module; modp; modp = modp->next) { + dir_maker_func df = modp->create_dir_config; + + if (df) + conf_vector[modp->module_index] = (*df)(p, NULL); + } + + return (ap_conf_vector_t *)conf_vector; +} + +AP_CORE_DECLARE(ap_conf_vector_t *) ap_merge_per_dir_configs(apr_pool_t *p, + ap_conf_vector_t *base, + ap_conf_vector_t *new_conf) +{ + void **conf_vector = apr_palloc(p, sizeof(void *) * total_modules); + void **base_vector = (void **)base; + void **new_vector = (void **)new_conf; + module *modp; + + for (modp = ap_top_module; modp; modp = modp->next) { + int i = modp->module_index; + + if (!new_vector[i]) { + conf_vector[i] = base_vector[i]; + } + else { + merger_func df = modp->merge_dir_config; + if (df && base_vector[i]) { + conf_vector[i] = (*df)(p, base_vector[i], new_vector[i]); + } + else + conf_vector[i] = new_vector[i]; + } + } + + return (ap_conf_vector_t *)conf_vector; +} + +static ap_conf_vector_t *create_server_config(apr_pool_t *p, server_rec *s) +{ + void **conf_vector = apr_pcalloc(p, sizeof(void *) * + (total_modules + DYNAMIC_MODULE_LIMIT)); + module *modp; + + for (modp = ap_top_module; modp; modp = modp->next) { + if (modp->create_server_config) + conf_vector[modp->module_index] = (*modp->create_server_config)(p, s); + } + + return (ap_conf_vector_t *)conf_vector; +} + +static void merge_server_configs(apr_pool_t *p, ap_conf_vector_t *base, + ap_conf_vector_t *virt) +{ + /* Can reuse the 'virt' vector for the spine of it, since we don't + * have to deal with the moral equivalent of .htaccess files here... + */ + + void **base_vector = (void **)base; + void **virt_vector = (void **)virt; + module *modp; + + for (modp = ap_top_module; modp; modp = modp->next) { + merger_func df = modp->merge_server_config; + int i = modp->module_index; + + if (!virt_vector[i]) + virt_vector[i] = base_vector[i]; + else if (df) + virt_vector[i] = (*df)(p, base_vector[i], virt_vector[i]); + } +} + +AP_CORE_DECLARE(ap_conf_vector_t *) ap_create_request_config(apr_pool_t *p) +{ + return create_empty_config(p); +} + +AP_CORE_DECLARE(ap_conf_vector_t *) ap_create_conn_config(apr_pool_t *p) +{ + return create_empty_config(p); +} + +AP_CORE_DECLARE(ap_conf_vector_t *) ap_create_per_dir_config(apr_pool_t *p) +{ + return create_empty_config(p); +} + +static int ap_invoke_filter_init(ap_filter_t *filters) +{ + while (filters) { + if (filters->frec->filter_init_func) { + int result = filters->frec->filter_init_func(filters); + if (result != OK) { + return result; + } + } + filters = filters->next; + } + return OK; +} + +AP_CORE_DECLARE(int) ap_invoke_handler(request_rec *r) +{ + const char *handler; + const char *p; + int result; + const char *old_handler = r->handler; + + /* + * The new insert_filter stage makes the most sense here. We only use + * it when we are going to run the request, so we must insert filters + * if any are available. Since the goal of this phase is to allow all + * modules to insert a filter if they want to, this filter returns + * void. I just can't see any way that this filter can reasonably + * fail, either your modules inserts something or it doesn't. rbb + */ + ap_run_insert_filter(r); + + /* Before continuing, allow each filter that is in the two chains to + * run their init function to let them do any magic before we could + * start generating data. + */ + result = ap_invoke_filter_init(r->input_filters); + if (result != OK) { + return result; + } + result = ap_invoke_filter_init(r->output_filters); + if (result != OK) { + return result; + } + + if (!r->handler) { + handler = r->content_type ? r->content_type : ap_default_type(r); + if ((p=ap_strchr_c(handler, ';')) != NULL) { + char *new_handler = (char *)apr_pmemdup(r->pool, handler, + p - handler + 1); + char *p2 = new_handler + (p - handler); + handler = new_handler; + + /* MIME type arguments */ + while (p2 > handler && p2[-1] == ' ') + --p2; /* strip trailing spaces */ + + *p2='\0'; + } + + r->handler = handler; + } + + result = ap_run_handler(r); + + r->handler = old_handler; + + if (result == DECLINED && r->handler && r->filename) { + ap_log_rerror(APLOG_MARK, APLOG_WARNING, 0, r, + "handler \"%s\" not found for: %s", r->handler, r->filename); + } + + return result == DECLINED ? HTTP_INTERNAL_SERVER_ERROR : result; +} + +AP_DECLARE(int) ap_method_is_limited(cmd_parms *cmd, const char *method) +{ + int methnum; + + methnum = ap_method_number_of(method); + + /* + * A method number either hardcoded into apache or + * added by a module and registered. + */ + if (methnum != M_INVALID) { + return (cmd->limited & (AP_METHOD_BIT << methnum)) ? 1 : 0; + } + + return 0; /* not found */ +} + +AP_DECLARE(void) ap_register_hooks(module *m, apr_pool_t *p) +{ + if (m->register_hooks) { + if (getenv("SHOW_HOOKS")) { + printf("Registering hooks for %s\n", m->name); + apr_hook_debug_enabled = 1; + } + + apr_hook_debug_current = m->name; + m->register_hooks(p); + } +} + +/* One-time setup for precompiled modules --- NOT to be done on restart */ + +AP_DECLARE(void) ap_add_module(module *m, apr_pool_t *p) +{ + /* This could be called from an AddModule httpd.conf command, + * after the file has been linked and the module structure within it + * teased out... + */ + + if (m->version != MODULE_MAGIC_NUMBER_MAJOR) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "%s: module \"%s\" is not compatible with this " + "version of Apache (found %d, need %d).", + ap_server_argv0, m->name, m->version, + MODULE_MAGIC_NUMBER_MAJOR); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "Please contact the vendor for the correct version."); + exit(1); + } + + if (m->next == NULL) { + m->next = ap_top_module; + ap_top_module = m; + } + + if (m->module_index == -1) { + m->module_index = total_modules++; + dynamic_modules++; + + if (dynamic_modules > DYNAMIC_MODULE_LIMIT) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "%s: module \"%s\" could not be loaded, because" + " the dynamic", ap_server_argv0, m->name); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "module limit was reached. Please increase " + "DYNAMIC_MODULE_LIMIT and recompile."); + exit(1); + } + } + + /* Some C compilers put a complete path into __FILE__, but we want + * only the filename (e.g. mod_includes.c). So check for path + * components (Unix and DOS), and remove them. + */ + + if (ap_strrchr_c(m->name, '/')) + m->name = 1 + ap_strrchr_c(m->name, '/'); + + if (ap_strrchr_c(m->name, '\\')) + m->name = 1 + ap_strrchr_c(m->name, '\\'); + +#ifdef _OSD_POSIX + /* __FILE__ = + * "*POSIX(/home/martin/apache/src/modules/standard/mod_info.c)" + */ + + /* We cannot fix the string in-place, because it's const */ + if (m->name[strlen(m->name)-1] == ')') { + char *tmp = strdup(m->name); /* FIXME: memory leak, albeit a small one */ + tmp[strlen(tmp)-1] = '\0'; + m->name = tmp; + } +#endif /*_OSD_POSIX*/ + + /* FIXME: is this the right place to call this? + * It doesn't appear to be + */ + ap_register_hooks(m, p); +} + +/* + * remove_module undoes what add_module did. There are some caveats: + * when the module is removed, its slot is lost so all the current + * per-dir and per-server configurations are invalid. So we should + * only ever call this function when you are invalidating almost + * all our current data. I.e. when doing a restart. + */ + +AP_DECLARE(void) ap_remove_module(module *m) +{ + module *modp; + + modp = ap_top_module; + if (modp == m) { + /* We are the top module, special case */ + ap_top_module = modp->next; + m->next = NULL; + } + else { + /* Not the top module, find use. When found modp will + * point to the module _before_ us in the list + */ + + while (modp && modp->next != m) { + modp = modp->next; + } + + if (!modp) { + /* Uh-oh, this module doesn't exist */ + ap_log_error(APLOG_MARK, APLOG_ERR, 0, NULL, + "Cannot remove module %s: not found in module list", + m->name); + return; + } + + /* Eliminate us from the module list */ + modp->next = modp->next->next; + } + + m->module_index = -1; /* simulate being unloaded, should + * be unnecessary */ + dynamic_modules--; + total_modules--; +} + +AP_DECLARE(void) ap_add_loaded_module(module *mod, apr_pool_t *p) +{ + module **m; + + /* + * Add module pointer to top of chained module list + */ + ap_add_module(mod, p); + + /* + * And module pointer to list of loaded modules + * + * Notes: 1. ap_add_module() would already complain if no more space + * exists for adding a dynamically loaded module + * 2. ap_add_module() accepts double inclusion, so we have + * to accept this, too. + */ + for (m = ap_loaded_modules; *m != NULL; m++) + ; + *m++ = mod; + *m = NULL; +} + +AP_DECLARE(void) ap_remove_loaded_module(module *mod) +{ + module **m; + module **m2; + int done; + + /* + * Remove module pointer from chained module list + */ + ap_remove_module(mod); + + /* + * Remove module pointer from list of loaded modules + * + * Note: 1. We cannot determine if the module was successfully + * removed by ap_remove_module(). + * 2. We have not to complain explicity when the module + * is not found because ap_remove_module() did it + * for us already. + */ + for (m = m2 = ap_loaded_modules, done = 0; *m2 != NULL; m2++) { + if (*m2 == mod && done == 0) + done = 1; + else + *m++ = *m2; + } + + *m = NULL; +} + +AP_DECLARE(void) ap_setup_prelinked_modules(process_rec *process) +{ + module **m; + module **m2; + + apr_hook_global_pool=process->pconf; + + /* + * Initialise total_modules variable and module indices + */ + total_modules = 0; + for (m = ap_preloaded_modules; *m != NULL; m++) + (*m)->module_index = total_modules++; + + /* + * Initialise list of loaded modules + */ + ap_loaded_modules = (module **)apr_palloc(process->pool, + sizeof(module *) * (total_modules + DYNAMIC_MODULE_LIMIT + 1)); + + if (ap_loaded_modules == NULL) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "Ouch! Out of memory in ap_setup_prelinked_modules()!"); + } + + for (m = ap_preloaded_modules, m2 = ap_loaded_modules; *m != NULL; ) + *m2++ = *m++; + + *m2 = NULL; + + /* + * Initialize chain of linked (=activate) modules + */ + for (m = ap_prelinked_modules; *m != NULL; m++) + ap_add_module(*m, process->pconf); + + apr_hook_sort_all(); +} + +AP_DECLARE(const char *) ap_find_module_name(module *m) +{ + return m->name; +} + +AP_DECLARE(module *) ap_find_linked_module(const char *name) +{ + module *modp; + + for (modp = ap_top_module; modp; modp = modp->next) { + if (strcmp(modp->name, name) == 0) + return modp; + } + + return NULL; +} + +/* Add a named module. Returns 1 if module found, 0 otherwise. */ +AP_DECLARE(int) ap_add_named_module(const char *name, apr_pool_t *p) +{ + module *modp; + int i = 0; + + for (modp = ap_loaded_modules[i]; modp; modp = ap_loaded_modules[++i]) { + if (strcmp(modp->name, name) == 0) { + /* Only add modules that are not already enabled. */ + if (modp->next == NULL) { + ap_add_module(modp, p); + } + + return 1; + } + } + + return 0; +} + +/***************************************************************** + * + * Resource, access, and .htaccess config files now parsed by a common + * command loop. + * + * Let's begin with the basics; parsing the line and + * invoking the function... + */ + +static const char *invoke_cmd(const command_rec *cmd, cmd_parms *parms, + void *mconfig, const char *args) +{ + char *w, *w2, *w3; + const char *errmsg = NULL; + + if ((parms->override & cmd->req_override) == 0) + return apr_pstrcat(parms->pool, cmd->name, " not allowed here", NULL); + + parms->info = cmd->cmd_data; + parms->cmd = cmd; + + switch (cmd->args_how) { + case RAW_ARGS: +#ifdef RESOLVE_ENV_PER_TOKEN + args = ap_resolve_env(parms->pool,args); +#endif + return cmd->AP_RAW_ARGS(parms, mconfig, args); + + case NO_ARGS: + if (*args != 0) + return apr_pstrcat(parms->pool, cmd->name, " takes no arguments", + NULL); + + return cmd->AP_NO_ARGS(parms, mconfig); + + case TAKE1: + w = ap_getword_conf(parms->pool, &args); + + if (*w == '\0' || *args != 0) + return apr_pstrcat(parms->pool, cmd->name, " takes one argument", + cmd->errmsg ? ", " : NULL, cmd->errmsg, NULL); + + return cmd->AP_TAKE1(parms, mconfig, w); + + case TAKE2: + w = ap_getword_conf(parms->pool, &args); + w2 = ap_getword_conf(parms->pool, &args); + + if (*w == '\0' || *w2 == '\0' || *args != 0) + return apr_pstrcat(parms->pool, cmd->name, " takes two arguments", + cmd->errmsg ? ", " : NULL, cmd->errmsg, NULL); + + return cmd->AP_TAKE2(parms, mconfig, w, w2); + + case TAKE12: + w = ap_getword_conf(parms->pool, &args); + w2 = ap_getword_conf(parms->pool, &args); + + if (*w == '\0' || *args != 0) + return apr_pstrcat(parms->pool, cmd->name, " takes 1-2 arguments", + cmd->errmsg ? ", " : NULL, cmd->errmsg, NULL); + + return cmd->AP_TAKE2(parms, mconfig, w, *w2 ? w2 : NULL); + + case TAKE3: + w = ap_getword_conf(parms->pool, &args); + w2 = ap_getword_conf(parms->pool, &args); + w3 = ap_getword_conf(parms->pool, &args); + + if (*w == '\0' || *w2 == '\0' || *w3 == '\0' || *args != 0) + return apr_pstrcat(parms->pool, cmd->name, " takes three arguments", + cmd->errmsg ? ", " : NULL, cmd->errmsg, NULL); + + return cmd->AP_TAKE3(parms, mconfig, w, w2, w3); + + case TAKE23: + w = ap_getword_conf(parms->pool, &args); + w2 = ap_getword_conf(parms->pool, &args); + w3 = *args ? ap_getword_conf(parms->pool, &args) : NULL; + + if (*w == '\0' || *w2 == '\0' || *args != 0) + return apr_pstrcat(parms->pool, cmd->name, + " takes two or three arguments", + cmd->errmsg ? ", " : NULL, cmd->errmsg, NULL); + + return cmd->AP_TAKE3(parms, mconfig, w, w2, w3); + + case TAKE123: + w = ap_getword_conf(parms->pool, &args); + w2 = *args ? ap_getword_conf(parms->pool, &args) : NULL; + w3 = *args ? ap_getword_conf(parms->pool, &args) : NULL; + + if (*w == '\0' || *args != 0) + return apr_pstrcat(parms->pool, cmd->name, + " takes one, two or three arguments", + cmd->errmsg ? ", " : NULL, cmd->errmsg, NULL); + + return cmd->AP_TAKE3(parms, mconfig, w, w2, w3); + + case TAKE13: + w = ap_getword_conf(parms->pool, &args); + w2 = *args ? ap_getword_conf(parms->pool, &args) : NULL; + w3 = *args ? ap_getword_conf(parms->pool, &args) : NULL; + + if (*w == '\0' || (w2 && *w2 && !w3) || *args != 0) + return apr_pstrcat(parms->pool, cmd->name, + " takes one or three arguments", + cmd->errmsg ? ", " : NULL, cmd->errmsg, NULL); + + return cmd->AP_TAKE3(parms, mconfig, w, w2, w3); + + case ITERATE: + while (*(w = ap_getword_conf(parms->pool, &args)) != '\0') { + + errmsg = cmd->AP_TAKE1(parms, mconfig, w); + + if (errmsg && strcmp(errmsg, DECLINE_CMD) != 0) + return errmsg; + } + + return errmsg; + + case ITERATE2: + w = ap_getword_conf(parms->pool, &args); + + if (*w == '\0' || *args == 0) + return apr_pstrcat(parms->pool, cmd->name, + " requires at least two arguments", + cmd->errmsg ? ", " : NULL, cmd->errmsg, NULL); + + while (*(w2 = ap_getword_conf(parms->pool, &args)) != '\0') { + + errmsg = cmd->AP_TAKE2(parms, mconfig, w, w2); + + if (errmsg && strcmp(errmsg, DECLINE_CMD) != 0) + return errmsg; + } + + return errmsg; + + case FLAG: + w = ap_getword_conf(parms->pool, &args); + + if (*w == '\0' || (strcasecmp(w, "on") && strcasecmp(w, "off"))) + return apr_pstrcat(parms->pool, cmd->name, " must be On or Off", + NULL); + + return cmd->AP_FLAG(parms, mconfig, strcasecmp(w, "off") != 0); + + default: + return apr_pstrcat(parms->pool, cmd->name, + " is improperly configured internally (server bug)", + NULL); + } +} + +AP_CORE_DECLARE(const command_rec *) ap_find_command(const char *name, + const command_rec *cmds) +{ + while (cmds->name) { + if (!strcasecmp(name, cmds->name)) + return cmds; + + ++cmds; + } + + return NULL; +} + +AP_CORE_DECLARE(const command_rec *) ap_find_command_in_modules( + const char *cmd_name, module **mod) +{ + const command_rec *cmdp; + module *modp; + + for (modp = *mod; modp; modp = modp->next) { + if (modp->cmds && (cmdp = ap_find_command(cmd_name, modp->cmds))) { + *mod = modp; + return cmdp; + } + } + + return NULL; +} + +AP_CORE_DECLARE(void *) ap_set_config_vectors(server_rec *server, + ap_conf_vector_t *section_vector, + const char *section, + module *mod, apr_pool_t *pconf) +{ + void *section_config = ap_get_module_config(section_vector, mod); + void *server_config = ap_get_module_config(server->module_config, mod); + + if (!section_config && mod->create_dir_config) { + /* ### need to fix the create_dir_config functions' prototype... */ + section_config = (*mod->create_dir_config)(pconf, (char *)section); + ap_set_module_config(section_vector, mod, section_config); + } + + if (!server_config && mod->create_server_config) { + server_config = (*mod->create_server_config)(pconf, server); + ap_set_module_config(server->module_config, mod, server_config); + } + + return section_config; +} + +static const char *execute_now(char *cmd_line, const char *args, + cmd_parms *parms, + apr_pool_t *p, apr_pool_t *ptemp, + ap_directive_t **sub_tree, + ap_directive_t *parent); + +static const char *ap_build_config_sub(apr_pool_t *p, apr_pool_t *temp_pool, + const char *l, cmd_parms *parms, + ap_directive_t **current, + ap_directive_t **curr_parent, + ap_directive_t **conftree) +{ + const char *retval = NULL; + const char *args; + char *cmd_name; + ap_directive_t *newdir; + module *mod = ap_top_module; + const command_rec *cmd; + + if (*l == '#' || *l == '\0') + return NULL; + +#if RESOLVE_ENV_PER_TOKEN + args = l; +#else + args = ap_resolve_env(temp_pool, l); +#endif + + cmd_name = ap_getword_conf(p, &args); + if (*cmd_name == '\0') { + /* Note: this branch should not occur. An empty line should have + * triggered the exit further above. + */ + return NULL; + } + + if (cmd_name[1] != '/') { + char *lastc = cmd_name + strlen(cmd_name) - 1; + if (*lastc == '>') { + *lastc = '\0' ; + } + if (cmd_name[0] == '<' && *args == '\0') { + args = ">"; + } + } + + newdir = apr_pcalloc(p, sizeof(ap_directive_t)); + newdir->filename = parms->config_file->name; + newdir->line_num = parms->config_file->line_number; + newdir->directive = cmd_name; + newdir->args = apr_pstrdup(p, args); + + if ((cmd = ap_find_command_in_modules(cmd_name, &mod)) != NULL) { + if (cmd->req_override & EXEC_ON_READ) { + ap_directive_t *sub_tree = NULL; + + parms->err_directive = newdir; + retval = execute_now(cmd_name, args, parms, p, temp_pool, + &sub_tree, *curr_parent); + if (*current) { + (*current)->next = sub_tree; + } + else { + *current = sub_tree; + if (*curr_parent) { + (*curr_parent)->first_child = (*current); + } + if (*current) { + (*current)->parent = (*curr_parent); + } + } + if (*current) { + if (!*conftree) { + /* Before walking *current to the end of the list, + * set the head to *current. + */ + *conftree = *current; + } + while ((*current)->next != NULL) { + (*current) = (*current)->next; + (*current)->parent = (*curr_parent); + } + } + return retval; + } + } + + if (cmd_name[0] == '<') { + if (cmd_name[1] != '/') { + (*current) = ap_add_node(curr_parent, *current, newdir, 1); + } + else if (*curr_parent == NULL) { + parms->err_directive = newdir; + return apr_pstrcat(p, cmd_name, + " without matching <", cmd_name + 2, + " section", NULL); + } + else { + char *bracket = cmd_name + strlen(cmd_name) - 1; + + if (*bracket != '>') { + parms->err_directive = newdir; + return apr_pstrcat(p, cmd_name, + "> directive missing closing '>'", NULL); + } + + *bracket = '\0'; + + if (strcasecmp(cmd_name + 2, + (*curr_parent)->directive + 1) != 0) { + parms->err_directive = newdir; + return apr_pstrcat(p, "Expected directive + 1, "> but saw ", + cmd_name, ">", NULL); + } + + *bracket = '>'; + + /* done with this section; move up a level */ + *current = *curr_parent; + *curr_parent = (*current)->parent; + } + } + else { + *current = ap_add_node(curr_parent, *current, newdir, 0); + } + + return retval; +} + +AP_DECLARE(const char *) ap_build_cont_config(apr_pool_t *p, + apr_pool_t *temp_pool, + cmd_parms *parms, + ap_directive_t **current, + ap_directive_t **curr_parent, + char *orig_directive) +{ + char *l; + char *bracket; + const char *retval; + ap_directive_t *sub_tree = NULL; + + /* Since this function can be called recursively, allocate + * the temporary 8k string buffer from the temp_pool rather + * than the stack to avoid over-running a fixed length stack. + */ + l = apr_palloc(temp_pool, MAX_STRING_LEN); + + bracket = apr_pstrcat(p, orig_directive + 1, ">", NULL); + while (!(ap_cfg_getline(l, MAX_STRING_LEN, parms->config_file))) { + if (!memcmp(l, "directive, &mod))) { + parms->err_directive = current; + return apr_pstrcat(parms->pool, "Invalid command '", + current->directive, + "', perhaps mis-spelled or defined by a module " + "not included in the server configuration", + NULL); + } + else { + void *dir_config = ap_set_config_vectors(parms->server, + section_vector, + parms->path, + mod, + parms->pool); + const char *retval; + + /* Once was enough? */ + if (cmd->req_override & EXEC_ON_READ) { + return NULL; + } + + retval = invoke_cmd(cmd, parms, dir_config, current->args); + if (retval == NULL) { + return NULL; + } + + if (strcmp(retval, DECLINE_CMD) != 0) { + /* If the directive in error has already been set, don't + * replace it. Otherwise, an error inside a container + * will be reported as occuring on the first line of the + * container. + */ + if (!parms->err_directive) { + parms->err_directive = current; + } + + return retval; + } + + mod = mod->next; /* Next time around, skip this one */ + } + } + /* NOTREACHED */ +} + +AP_DECLARE(const char *) ap_walk_config(ap_directive_t *current, + cmd_parms *parms, + ap_conf_vector_t *section_vector) +{ + ap_conf_vector_t *oldconfig = parms->context; + + parms->context = section_vector; + + /* scan through all directives, executing each one */ + for (; current != NULL; current = current->next) { + const char *errmsg; + + parms->directive = current; + + /* actually parse the command and execute the correct function */ + errmsg = ap_walk_config_sub(current, parms, section_vector); + if (errmsg != NULL) { + /* restore the context (just in case) */ + parms->context = oldconfig; + return errmsg; + } + } + + parms->context = oldconfig; + return NULL; +} + +AP_DECLARE(const char *) ap_build_config(cmd_parms *parms, + apr_pool_t *p, apr_pool_t *temp_pool, + ap_directive_t **conftree) +{ + ap_directive_t *current = *conftree; + ap_directive_t *curr_parent = NULL; + char *l = apr_palloc (temp_pool, MAX_STRING_LEN); + const char *errmsg; + + if (current != NULL) { + while (current->next) { + current = current->next; + } + } + + while (!(ap_cfg_getline(l, MAX_STRING_LEN, parms->config_file))) { + errmsg = ap_build_config_sub(p, temp_pool, l, parms, + ¤t, &curr_parent, conftree); + if (errmsg != NULL) + return errmsg; + + if (*conftree == NULL && curr_parent != NULL) { + *conftree = curr_parent; + } + + if (*conftree == NULL && current != NULL) { + *conftree = current; + } + } + + if (curr_parent != NULL) { + errmsg = ""; + + while (curr_parent != NULL) { + errmsg = apr_psprintf(p, "%s%s%s:%u: %s> was not closed.", + errmsg, + *errmsg == '\0' ? "" : APR_EOL_STR, + curr_parent->filename, + curr_parent->line_num, + curr_parent->directive); + + parms->err_directive = curr_parent; + curr_parent = curr_parent->parent; + } + + return errmsg; + } + + return NULL; +} + +/* + * Generic command functions... + */ + +AP_DECLARE_NONSTD(const char *) ap_set_string_slot(cmd_parms *cmd, + void *struct_ptr, + const char *arg) +{ + int offset = (int)(long)cmd->info; + + *(const char **)((char *)struct_ptr + offset) = arg; + + return NULL; +} + +AP_DECLARE_NONSTD(const char *) ap_set_int_slot(cmd_parms *cmd, + void *struct_ptr, + const char *arg) +{ + char *endptr; + char *error_str = NULL; + int offset = (int)(long)cmd->info; + + *(int *)((char*)struct_ptr + offset) = strtol(arg, &endptr, 10); + + if ((*arg == '\0') || (*endptr != '\0')) { + error_str = apr_psprintf(cmd->pool, + "Invalid value for directive %s, expected integer", + cmd->directive->directive); + } + + return error_str; +} + +AP_DECLARE_NONSTD(const char *) ap_set_string_slot_lower(cmd_parms *cmd, + void *struct_ptr, + const char *arg_) +{ + char *arg = apr_pstrdup(cmd->pool,arg_); + int offset = (int)(long)cmd->info; + + ap_str_tolower(arg); + *(char **)((char *)struct_ptr + offset) = arg; + + return NULL; +} + +AP_DECLARE_NONSTD(const char *) ap_set_flag_slot(cmd_parms *cmd, + void *struct_ptr_v, int arg) +{ + int offset = (int)(long)cmd->info; + char *struct_ptr = (char *)struct_ptr_v; + + *(int *)(struct_ptr + offset) = arg ? 1 : 0; + + return NULL; +} + +AP_DECLARE_NONSTD(const char *) ap_set_file_slot(cmd_parms *cmd, void *struct_ptr, + const char *arg) +{ + /* Prepend server_root to relative arg. + * This allows most args to be independent of server_root, + * so the server can be moved or mirrored with less pain. + */ + const char *path; + int offset = (int)(long)cmd->info; + + path = ap_server_root_relative(cmd->pool, arg); + + if (!path) { + return apr_pstrcat(cmd->pool, "Invalid file path ", + arg, NULL); + } + + *(const char **) ((char*)struct_ptr + offset) = path; + + return NULL; +} + +AP_DECLARE_NONSTD(const char *) ap_set_deprecated(cmd_parms *cmd, + void *struct_ptr, + const char *arg) +{ + return cmd->cmd->errmsg; +} + +/***************************************************************** + * + * Reading whole config files... + */ + +static cmd_parms default_parms = +{NULL, 0, -1, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; + +AP_DECLARE(char *) ap_server_root_relative(apr_pool_t *p, const char *file) +{ + char *newpath = NULL; + apr_status_t rv; + rv = apr_filepath_merge(&newpath, ap_server_root, file, + APR_FILEPATH_TRUENAME, p); + if (newpath && (rv == APR_SUCCESS || APR_STATUS_IS_EPATHWILD(rv) + || APR_STATUS_IS_ENOENT(rv) + || APR_STATUS_IS_ENOTDIR(rv))) { + return newpath; + } + else { + return NULL; + } +} + +AP_DECLARE(const char *) ap_soak_end_container(cmd_parms *cmd, char *directive) +{ + char l[MAX_STRING_LEN]; + const char *args; + char *cmd_name; + + while(!(ap_cfg_getline(l, MAX_STRING_LEN, cmd->config_file))) { +#if RESOLVE_ENV_PER_TOKEN + args = l; +#else + args = ap_resolve_env(cmd->temp_pool, l); +#endif + + cmd_name = ap_getword_conf(cmd->pool, &args); + if (cmd_name[0] == '<') { + if (cmd_name[1] == '/') { + cmd_name[strlen(cmd_name) - 1] = '\0'; + + if (strcasecmp(cmd_name + 2, directive + 1) != 0) { + return apr_pstrcat(cmd->pool, "Expected but saw ", + cmd_name, ">", NULL); + } + + return NULL; /* found end of container */ + } + else { + const char *msg; + + if (*args == '\0' && cmd_name[strlen(cmd_name) - 1] == '>') { + cmd_name[strlen(cmd_name) - 1] = '\0'; + } + + if ((msg = ap_soak_end_container(cmd, cmd_name)) != NULL) { + return msg; + } + } + } + } + + return apr_pstrcat(cmd->pool, "Expected before end of configuration", + NULL); +} + +static const char *execute_now(char *cmd_line, const char *args, + cmd_parms *parms, + apr_pool_t *p, apr_pool_t *ptemp, + ap_directive_t **sub_tree, + ap_directive_t *parent) +{ + module *mod = ap_top_module; + const command_rec *cmd; + + if (!(cmd = ap_find_command_in_modules(cmd_line, &mod))) { + return apr_pstrcat(parms->pool, "Invalid command '", + cmd_line, + "', perhaps mis-spelled or defined by a module " + "not included in the server configuration", + NULL); + } + else { + return invoke_cmd(cmd, parms, sub_tree, args); + } +} + +/* This structure and the following functions are needed for the + * table-based config file reading. They are passed to the + * cfg_open_custom() routine. + */ + +/* Structure to be passed to cfg_open_custom(): it contains an + * index which is incremented from 0 to nelts on each call to + * cfg_getline() (which in turn calls arr_elts_getstr()) + * and an apr_array_header_t pointer for the string array. + */ +typedef struct { + apr_array_header_t *array; + int curr_idx; +} arr_elts_param_t; + + +/* arr_elts_getstr() returns the next line from the string array. */ +static void *arr_elts_getstr(void *buf, size_t bufsiz, void *param) +{ + arr_elts_param_t *arr_param = (arr_elts_param_t *)param; + + /* End of array reached? */ + if (++arr_param->curr_idx > arr_param->array->nelts) + return NULL; + + /* return the line */ + apr_cpystrn(buf, + ((char **)arr_param->array->elts)[arr_param->curr_idx - 1], + bufsiz); + + return buf; +} + + +/* arr_elts_close(): dummy close routine (makes sure no more lines can be read) */ +static int arr_elts_close(void *param) +{ + arr_elts_param_t *arr_param = (arr_elts_param_t *)param; + + arr_param->curr_idx = arr_param->array->nelts; + + return 0; +} + +static void process_command_config(server_rec *s, apr_array_header_t *arr, + ap_directive_t **conftree, apr_pool_t *p, + apr_pool_t *ptemp) +{ + const char *errmsg; + cmd_parms parms; + arr_elts_param_t arr_parms; + + arr_parms.curr_idx = 0; + arr_parms.array = arr; + + parms = default_parms; + parms.pool = p; + parms.temp_pool = ptemp; + parms.server = s; + parms.override = (RSRC_CONF | OR_ALL) & ~(OR_AUTHCFG | OR_LIMIT); + + parms.config_file = ap_pcfg_open_custom(p, "-c/-C directives", + &arr_parms, NULL, + arr_elts_getstr, arr_elts_close); + + errmsg = ap_build_config(&parms, p, ptemp, conftree); + if (errmsg) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "Syntax error in -C/-c directive:"); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "%s", errmsg); + exit(1); + } + + ap_cfg_closefile(parms.config_file); +} + +typedef struct { + char *fname; +} fnames; + +static int fname_alphasort(const void *fn1, const void *fn2) +{ + const fnames *f1 = fn1; + const fnames *f2 = fn2; + + return strcmp(f1->fname,f2->fname); +} + +static void process_resource_config_nofnmatch(server_rec *s, const char *fname, + ap_directive_t **conftree, + apr_pool_t *p, + apr_pool_t *ptemp, + unsigned depth) +{ + cmd_parms parms; + ap_configfile_t *cfp; + const char *errmsg; + + if (ap_is_directory(p, fname)) { + apr_dir_t *dirp; + apr_finfo_t dirent; + int current; + apr_array_header_t *candidates = NULL; + fnames *fnew; + apr_status_t rv; + char errmsg[120], *path = apr_pstrdup(p, fname); + + if (++depth > AP_MAX_INCLUDE_DIR_DEPTH) { + fprintf(stderr, "%s: Directory %s exceeds the maximum include " + "directory nesting level of %u. You have probably a " + "recursion somewhere.\n", ap_server_argv0, path, + AP_MAX_INCLUDE_DIR_DEPTH); + exit(1); + } + + /* + * first course of business is to grok all the directory + * entries here and store 'em away. Recall we need full pathnames + * for this. + */ + rv = apr_dir_open(&dirp, path, p); + if (rv != APR_SUCCESS) { + fprintf(stderr, "%s: could not open config directory %s: %s\n", + ap_server_argv0, path, + apr_strerror(rv, errmsg, sizeof errmsg)); + exit(1); + } + + candidates = apr_array_make(p, 1, sizeof(fnames)); + while (apr_dir_read(&dirent, APR_FINFO_DIRENT, dirp) == APR_SUCCESS) { + /* strip out '.' and '..' */ + if (strcmp(dirent.name, ".") + && strcmp(dirent.name, "..")) { + fnew = (fnames *) apr_array_push(candidates); + fnew->fname = ap_make_full_path(p, path, dirent.name); + } + } + + apr_dir_close(dirp); + if (candidates->nelts != 0) { + qsort((void *) candidates->elts, candidates->nelts, + sizeof(fnames), fname_alphasort); + + /* + * Now recurse these... we handle errors and subdirectories + * via the recursion, which is nice + */ + for (current = 0; current < candidates->nelts; ++current) { + fnew = &((fnames *) candidates->elts)[current]; + process_resource_config_nofnmatch(s, fnew->fname, conftree, p, + ptemp, depth); + } + } + + return; + } + + /* GCC's initialization extensions are soooo nice here... */ + parms = default_parms; + parms.pool = p; + parms.temp_pool = ptemp; + parms.server = s; + parms.override = (RSRC_CONF | OR_ALL) & ~(OR_AUTHCFG | OR_LIMIT); + + if (ap_pcfg_openfile(&cfp, p, fname) != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "%s: could not open document config file %s", + ap_server_argv0, fname); + exit(1); + } + + parms.config_file = cfp; + + errmsg = ap_build_config(&parms, p, ptemp, conftree); + + if (errmsg != NULL) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "Syntax error on line %d of %s:", + parms.err_directive->line_num, + parms.err_directive->filename); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "%s", errmsg); + exit(1); + } + + ap_cfg_closefile(cfp); + + return; +} + +AP_DECLARE(void) ap_process_resource_config(server_rec *s, const char *fname, + ap_directive_t **conftree, + apr_pool_t *p, + apr_pool_t *ptemp) +{ + /* XXX: lstat() won't work on the wildcard pattern... + */ + + /* don't require conf/httpd.conf if we have a -C or -c switch */ + if ((ap_server_pre_read_config->nelts + || ap_server_post_read_config->nelts) + && !(strcmp(fname, ap_server_root_relative(p, SERVER_CONFIG_FILE)))) { + apr_finfo_t finfo; + + if (apr_lstat(&finfo, fname, APR_FINFO_TYPE, p) != APR_SUCCESS) + return; + } + + if (!apr_fnmatch_test(fname)) { + process_resource_config_nofnmatch(s, fname, conftree, p, ptemp, 0); + } + else { + apr_dir_t *dirp; + apr_finfo_t dirent; + int current; + apr_array_header_t *candidates = NULL; + fnames *fnew; + apr_status_t rv; + char errmsg[120], *path = apr_pstrdup(p, fname), *pattern = NULL; + + pattern = ap_strrchr(path, '/'); + + AP_DEBUG_ASSERT(pattern != NULL); /* path must be absolute. */ + + *pattern++ = '\0'; + + if (apr_fnmatch_test(path)) { + fprintf(stderr, "%s: wildcard patterns not allowed in Include " + "%s\n", ap_server_argv0, fname); + exit(1); + } + + if (!ap_is_directory(p, path)){ + fprintf(stderr, "%s: Include directory '%s' not found", + ap_server_argv0, path); + exit(1); + } + + if (!apr_fnmatch_test(pattern)) { + fprintf(stderr, "%s: must include a wildcard pattern " + "for Include %s\n", ap_server_argv0, fname); + exit(1); + } + + /* + * first course of business is to grok all the directory + * entries here and store 'em away. Recall we need full pathnames + * for this. + */ + rv = apr_dir_open(&dirp, path, p); + if (rv != APR_SUCCESS) { + fprintf(stderr, "%s: could not open config directory %s: %s\n", + ap_server_argv0, path, + apr_strerror(rv, errmsg, sizeof errmsg)); + exit(1); + } + + candidates = apr_array_make(p, 1, sizeof(fnames)); + while (apr_dir_read(&dirent, APR_FINFO_DIRENT, dirp) == APR_SUCCESS) { + /* strip out '.' and '..' */ + if (strcmp(dirent.name, ".") + && strcmp(dirent.name, "..") + && (apr_fnmatch(pattern, dirent.name, + FNM_PERIOD) == APR_SUCCESS)) { + fnew = (fnames *) apr_array_push(candidates); + fnew->fname = ap_make_full_path(p, path, dirent.name); + } + } + + apr_dir_close(dirp); + if (candidates->nelts != 0) { + qsort((void *) candidates->elts, candidates->nelts, + sizeof(fnames), fname_alphasort); + + /* + * Now recurse these... we handle errors and subdirectories + * via the recursion, which is nice + */ + for (current = 0; current < candidates->nelts; ++current) { + fnew = &((fnames *) candidates->elts)[current]; + process_resource_config_nofnmatch(s, fnew->fname, conftree, p, + ptemp, 0); + } + } + } + + return; +} + +AP_DECLARE(void) ap_process_config_tree(server_rec *s, + ap_directive_t *conftree, + apr_pool_t *p, apr_pool_t *ptemp) +{ + const char *errmsg; + cmd_parms parms; + + parms = default_parms; + parms.pool = p; + parms.temp_pool = ptemp; + parms.server = s; + parms.override = (RSRC_CONF | OR_ALL) & ~(OR_AUTHCFG | OR_LIMIT); + parms.limited = -1; + + errmsg = ap_walk_config(conftree, &parms, s->lookup_defaults); + if (errmsg) { + ap_log_perror(APLOG_MARK, APLOG_STARTUP, 0, p, + "Syntax error on line %d of %s:", + parms.err_directive->line_num, + parms.err_directive->filename); + ap_log_perror(APLOG_MARK, APLOG_STARTUP, 0, p, + "%s", errmsg); + exit(1); + } +} + +AP_CORE_DECLARE(int) ap_parse_htaccess(ap_conf_vector_t **result, + request_rec *r, int override, + const char *d, const char *access_name) +{ + ap_configfile_t *f = NULL; + cmd_parms parms; + char *filename = NULL; + const struct htaccess_result *cache; + struct htaccess_result *new; + ap_conf_vector_t *dc = NULL; + apr_status_t status; + + /* firstly, search cache */ + for (cache = r->htaccess; cache != NULL; cache = cache->next) { + if (cache->override == override && strcmp(cache->dir, d) == 0) { + *result = cache->htaccess; + return OK; + } + } + + parms = default_parms; + parms.override = override; + parms.pool = r->pool; + parms.temp_pool = r->pool; + parms.server = r->server; + parms.path = apr_pstrdup(r->pool, d); + + /* loop through the access names and find the first one */ + while (access_name[0]) { + /* AFAICT; there is no use of the actual 'filename' against + * any canonicalization, so we will simply take the given + * name, ignoring case sensitivity and aliases + */ + filename = ap_make_full_path(r->pool, d, + ap_getword_conf(r->pool, &access_name)); + status = ap_pcfg_openfile(&f, r->pool, filename); + + if (status == APR_SUCCESS) { + const char *errmsg; + ap_directive_t *temptree = NULL; + + dc = ap_create_per_dir_config(r->pool); + + parms.config_file = f; + errmsg = ap_build_config(&parms, r->pool, r->pool, &temptree); + if (errmsg == NULL) + errmsg = ap_walk_config(temptree, &parms, dc); + + ap_cfg_closefile(f); + + if (errmsg) { + ap_log_rerror(APLOG_MARK, APLOG_ALERT, 0, r, + "%s: %s", filename, errmsg); + return HTTP_INTERNAL_SERVER_ERROR; + } + + *result = dc; + break; + } + else { + if (!APR_STATUS_IS_ENOENT(status) + && !APR_STATUS_IS_ENOTDIR(status)) { + ap_log_rerror(APLOG_MARK, APLOG_CRIT, status, r, + "%s pcfg_openfile: unable to check htaccess file, " + "ensure it is readable", + filename); + apr_table_setn(r->notes, "error-notes", + "Server unable to read htaccess file, denying " + "access to be safe"); + return HTTP_FORBIDDEN; + } + } + } + + /* cache it */ + new = apr_palloc(r->pool, sizeof(struct htaccess_result)); + new->dir = parms.path; + new->override = override; + new->htaccess = dc; + + /* add to head of list */ + new->next = r->htaccess; + r->htaccess = new; + + return OK; +} + +AP_CORE_DECLARE(const char *) ap_init_virtual_host(apr_pool_t *p, + const char *hostname, + server_rec *main_server, + server_rec **ps) +{ + server_rec *s = (server_rec *) apr_pcalloc(p, sizeof(server_rec)); + + /* TODO: this crap belongs in http_core */ + s->process = main_server->process; + s->server_admin = NULL; + s->server_hostname = NULL; + s->error_fname = NULL; + s->timeout = 0; + s->keep_alive_timeout = 0; + s->keep_alive = -1; + s->keep_alive_max = -1; + s->error_log = main_server->error_log; + s->loglevel = main_server->loglevel; + /* useful default, otherwise we get a port of 0 on redirects */ + s->port = main_server->port; + s->next = NULL; + + s->is_virtual = 1; + s->names = apr_array_make(p, 4, sizeof(char **)); + s->wild_names = apr_array_make(p, 4, sizeof(char **)); + + s->module_config = create_empty_config(p); + s->lookup_defaults = ap_create_per_dir_config(p); + + s->limit_req_line = main_server->limit_req_line; + s->limit_req_fieldsize = main_server->limit_req_fieldsize; + s->limit_req_fields = main_server->limit_req_fields; + + *ps = s; + + return ap_parse_vhost_addrs(p, hostname, s); +} + + +AP_DECLARE(void) ap_fixup_virtual_hosts(apr_pool_t *p, server_rec *main_server) +{ + server_rec *virt; + + for (virt = main_server->next; virt; virt = virt->next) { + merge_server_configs(p, main_server->module_config, + virt->module_config); + + virt->lookup_defaults = + ap_merge_per_dir_configs(p, main_server->lookup_defaults, + virt->lookup_defaults); + + if (virt->server_admin == NULL) + virt->server_admin = main_server->server_admin; + + if (virt->timeout == 0) + virt->timeout = main_server->timeout; + + if (virt->keep_alive_timeout == 0) + virt->keep_alive_timeout = main_server->keep_alive_timeout; + + if (virt->keep_alive == -1) + virt->keep_alive = main_server->keep_alive; + + if (virt->keep_alive_max == -1) + virt->keep_alive_max = main_server->keep_alive_max; + + /* XXX: this is really something that should be dealt with by a + * post-config api phase + */ + ap_core_reorder_directories(p, virt); + } + + ap_core_reorder_directories(p, main_server); +} + +/***************************************************************** + * + * Getting *everything* configured... + */ + +static void init_config_globals(apr_pool_t *p) +{ + /* Global virtual host hash bucket pointers. Init to null. */ + ap_init_vhost_config(p); +} + +static server_rec *init_server_config(process_rec *process, apr_pool_t *p) +{ + apr_status_t rv; + server_rec *s = (server_rec *) apr_pcalloc(p, sizeof(server_rec)); + + apr_file_open_stderr(&s->error_log, p); + s->process = process; + s->port = 0; + s->server_admin = DEFAULT_ADMIN; + s->server_hostname = NULL; + s->error_fname = DEFAULT_ERRORLOG; + s->loglevel = DEFAULT_LOGLEVEL; + s->limit_req_line = DEFAULT_LIMIT_REQUEST_LINE; + s->limit_req_fieldsize = DEFAULT_LIMIT_REQUEST_FIELDSIZE; + s->limit_req_fields = DEFAULT_LIMIT_REQUEST_FIELDS; + s->timeout = apr_time_from_sec(DEFAULT_TIMEOUT); + s->keep_alive_timeout = apr_time_from_sec(DEFAULT_KEEPALIVE_TIMEOUT); + s->keep_alive_max = DEFAULT_KEEPALIVE; + s->keep_alive = 1; + s->next = NULL; + s->addrs = apr_pcalloc(p, sizeof(server_addr_rec)); + + /* NOT virtual host; don't match any real network interface */ + rv = apr_sockaddr_info_get(&s->addrs->host_addr, + NULL, APR_INET, 0, 0, p); + ap_assert(rv == APR_SUCCESS); /* otherwise: bug or no storage */ + + s->addrs->host_port = 0; /* matches any port */ + s->addrs->virthost = ""; /* must be non-NULL */ + s->names = s->wild_names = NULL; + + s->module_config = create_server_config(p, s); + s->lookup_defaults = create_default_per_dir_config(p); + + return s; +} + + +AP_DECLARE(server_rec*) ap_read_config(process_rec *process, apr_pool_t *ptemp, + const char *filename, + ap_directive_t **conftree) +{ + const char *confname; + apr_pool_t *p = process->pconf; + server_rec *s = init_server_config(process, p); + + init_config_globals(p); + + /* All server-wide config files now have the SAME syntax... */ + process_command_config(s, ap_server_pre_read_config, conftree, + p, ptemp); + + /* process_command_config may change the ServerRoot so + * compute this config file name afterwards. + */ + confname = ap_server_root_relative(p, filename); + + if (!confname) { + ap_log_error(APLOG_MARK, APLOG_STARTUP|APLOG_CRIT, + APR_EBADPATH, NULL, "Invalid config file path %s", + filename); + exit(1); + } + + ap_process_resource_config(s, confname, conftree, p, ptemp); + + process_command_config(s, ap_server_post_read_config, conftree, + p, ptemp); + + return s; +} + +AP_DECLARE(void) ap_single_module_configure(apr_pool_t *p, server_rec *s, + module *m) +{ + if (m->create_server_config) + ap_set_module_config(s->module_config, m, + (*m->create_server_config)(p, s)); + + if (m->create_dir_config) + ap_set_module_config(s->lookup_defaults, m, + (*m->create_dir_config)(p, NULL)); +} + +AP_DECLARE(void) ap_run_rewrite_args(process_rec *process) +{ + module *m; + + for (m = ap_top_module; m; m = m->next) { + if (m->rewrite_args) { + (*m->rewrite_args)(process); + } + } +} + +/******************************************************************** + * Configuration directives are restricted in terms of where they may + * appear in the main configuration files and/or .htaccess files according + * to the bitmask req_override in the command_rec structure. + * If any of the overrides set in req_override are also allowed in the + * context in which the command is read, then the command is allowed. + * The context is determined as follows: + * + * inside *.conf --> override = (RSRC_CONF|OR_ALL)&~(OR_AUTHCFG|OR_LIMIT); + * within or --> override = OR_ALL|ACCESS_CONF; + * within .htaccess --> override = AllowOverride for current directory; + * + * the result is, well, a rather confusing set of possibilities for when + * a particular directive is allowed to be used. This procedure prints + * in English where the given (pc) directive can be used. + */ +static void show_overrides(const command_rec *pc, module *pm) +{ + int n = 0; + + printf("\tAllowed in *.conf "); + if ((pc->req_override & (OR_OPTIONS | OR_FILEINFO | OR_INDEXES)) + || ((pc->req_override & RSRC_CONF) + && ((pc->req_override & (ACCESS_CONF | OR_AUTHCFG | OR_LIMIT))))) { + printf("anywhere"); + } + else if (pc->req_override & RSRC_CONF) { + printf("only outside , or "); + } + else { + printf("only inside , or "); + } + + /* Warn if the directive is allowed inside or .htaccess + * but module doesn't support per-dir configuration + */ + if ((pc->req_override & (OR_ALL | ACCESS_CONF)) && !pm->create_dir_config) + printf(" [no per-dir config]"); + + if (pc->req_override & OR_ALL) { + printf(" and in .htaccess\n\twhen AllowOverride"); + + if ((pc->req_override & OR_ALL) == OR_ALL) { + printf(" isn't None"); + } + else { + printf(" includes "); + + if (pc->req_override & OR_AUTHCFG) { + if (n++) + printf(" or "); + + printf("AuthConfig"); + } + + if (pc->req_override & OR_LIMIT) { + if (n++) + printf(" or "); + + printf("Limit"); + } + + if (pc->req_override & OR_OPTIONS) { + if (n++) + printf(" or "); + + printf("Options"); + } + + if (pc->req_override & OR_FILEINFO) { + if (n++) + printf(" or "); + + printf("FileInfo"); + } + + if (pc->req_override & OR_INDEXES) { + if (n++) + printf(" or "); + + printf("Indexes"); + } + } + } + + printf("\n"); +} + +/* Show the preloaded configuration directives, the help string explaining + * the directive arguments, in what module they are handled, and in + * what parts of the configuration they are allowed. Used for httpd -L. + */ +AP_DECLARE(void) ap_show_directives(void) +{ + const command_rec *pc; + int n; + + for (n = 0; ap_loaded_modules[n]; ++n) { + for (pc = ap_loaded_modules[n]->cmds; pc && pc->name; ++pc) { + printf("%s (%s)\n", pc->name, ap_loaded_modules[n]->name); + + if (pc->errmsg) + printf("\t%s\n", pc->errmsg); + + show_overrides(pc, ap_loaded_modules[n]); + } + } +} + +/* Show the preloaded module names. Used for httpd -l. */ +AP_DECLARE(void) ap_show_modules(void) +{ + int n; + + printf("Compiled in modules:\n"); + for (n = 0; ap_loaded_modules[n]; ++n) + printf(" %s\n", ap_loaded_modules[n]->name); +} + +AP_DECLARE(const char *) ap_show_mpm(void) +{ + return MPM_NAME; +} diff --git a/rubbos/app/httpd-2.0.64/server/config.lo b/rubbos/app/httpd-2.0.64/server/config.lo new file mode 100644 index 00000000..75dddb8b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/config.lo @@ -0,0 +1,12 @@ +# config.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/config.o' + +# Name of the non-PIC object. +non_pic_object='config.o' + diff --git a/rubbos/app/httpd-2.0.64/server/config.m4 b/rubbos/app/httpd-2.0.64/server/config.m4 new file mode 100644 index 00000000..85fa4d17 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/config.m4 @@ -0,0 +1,15 @@ +dnl ## Check for libraries + +dnl ## Check for header files + +AC_CHECK_HEADERS(bstring.h unistd.h) + +dnl ## Check for typedefs, structures, and compiler characteristics. + +dnl ## Check for library functions + +AC_CHECK_FUNCS(syslog) + +dnl Obsolete scoreboard code uses this. + AC_CHECK_HEADERS(sys/times.h) + AC_CHECK_FUNCS(times) diff --git a/rubbos/app/httpd-2.0.64/server/config.o b/rubbos/app/httpd-2.0.64/server/config.o new file mode 100644 index 0000000000000000000000000000000000000000..c5e795abb278dfe7e32cf3bd70c14216408366f7 GIT binary patch literal 171936 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

    bW8Z?S(5(RK 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%0D%dfa#K_0xP`I1M;ApagY6 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 z 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/server/connection.c b/rubbos/app/httpd-2.0.64/server/connection.c new file mode 100644 index 00000000..52b8908f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/connection.c @@ -0,0 +1,179 @@ +/* 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. + */ + +#include "apr.h" +#include "apr_strings.h" + +#define CORE_PRIVATE +#include "ap_config.h" +#include "httpd.h" +#include "http_connection.h" +#include "http_request.h" +#include "http_protocol.h" +#include "ap_mpm.h" +#include "mpm_default.h" +#include "http_config.h" +#include "http_core.h" +#include "http_vhost.h" +#include "scoreboard.h" +#include "http_log.h" +#include "util_filter.h" + +APR_HOOK_STRUCT( + APR_HOOK_LINK(create_connection) + APR_HOOK_LINK(process_connection) + APR_HOOK_LINK(pre_connection) +) +AP_IMPLEMENT_HOOK_RUN_FIRST(conn_rec *,create_connection, + (apr_pool_t *p, server_rec *server, apr_socket_t *csd, long conn_id, void *sbh, apr_bucket_alloc_t *alloc), + (p, server, csd, conn_id, sbh, alloc), NULL) +AP_IMPLEMENT_HOOK_RUN_FIRST(int,process_connection,(conn_rec *c),(c),DECLINED) +AP_IMPLEMENT_HOOK_RUN_ALL(int,pre_connection,(conn_rec *c, void *csd),(c, csd),OK,DECLINED) +/* + * More machine-dependent networking gooo... on some systems, + * you've got to be *really* sure that all the packets are acknowledged + * before closing the connection, since the client will not be able + * to see the last response if their TCP buffer is flushed by a RST + * packet from us, which is what the server's TCP stack will send + * if it receives any request data after closing the connection. + * + * In an ideal world, this function would be accomplished by simply + * setting the socket option SO_LINGER and handling it within the + * server's TCP stack while the process continues on to the next request. + * Unfortunately, it seems that most (if not all) operating systems + * block the server process on close() when SO_LINGER is used. + * For those that don't, see USE_SO_LINGER below. For the rest, + * we have created a home-brew lingering_close. + * + * Many operating systems tend to block, puke, or otherwise mishandle + * calls to shutdown only half of the connection. You should define + * NO_LINGCLOSE in ap_config.h if such is the case for your system. + */ +#ifndef MAX_SECS_TO_LINGER +#define MAX_SECS_TO_LINGER 30 +#endif + +AP_CORE_DECLARE(void) ap_flush_conn(conn_rec *c) +{ + apr_bucket_brigade *bb; + apr_bucket *b; + + bb = apr_brigade_create(c->pool, c->bucket_alloc); + + /* FLUSH bucket */ + b = apr_bucket_flush_create(c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, b); + + /* End Of Connection bucket */ + b = ap_bucket_eoc_create(c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, b); + + ap_pass_brigade(c->output_filters, bb); +} + +/* we now proceed to read from the client until we get EOF, or until + * MAX_SECS_TO_LINGER has passed. the reasons for doing this are + * documented in a draft: + * + * http://www.ics.uci.edu/pub/ietf/http/draft-ietf-http-connection-00.txt + * + * in a nutshell -- if we don't make this effort we risk causing + * TCP RST packets to be sent which can tear down a connection before + * all the response data has been sent to the client. + */ +#define SECONDS_TO_LINGER 2 +AP_DECLARE(void) ap_lingering_close(conn_rec *c) +{ + char dummybuf[512]; + apr_size_t nbytes = sizeof(dummybuf); + apr_status_t rc; + apr_int32_t timeout; + apr_int32_t total_linger_time = 0; + apr_socket_t *csd = ap_get_module_config(c->conn_config, &core_module); + + if (!csd) { + return; + } + + ap_update_child_status(c->sbh, SERVER_CLOSING, NULL); + +#ifdef NO_LINGCLOSE + ap_flush_conn(c); /* just close it */ + apr_socket_close(csd); + return; +#endif + + /* Close the connection, being careful to send out whatever is still + * in our buffers. If possible, try to avoid a hard close until the + * client has ACKed our FIN and/or has stopped sending us data. + */ + + /* Send any leftover data to the client, but never try to again */ + ap_flush_conn(c); + + if (c->aborted) { + apr_socket_close(csd); + return; + } + + /* Shut down the socket for write, which will send a FIN + * to the peer. + */ + if (apr_shutdown(csd, APR_SHUTDOWN_WRITE) != APR_SUCCESS + || c->aborted) { + apr_socket_close(csd); + return; + } + + /* Read all data from the peer until we reach "end-of-file" (FIN + * from peer) or we've exceeded our overall timeout. If the client does + * not send us bytes within 2 seconds (a value pulled from Apache 1.3 + * which seems to work well), close the connection. + */ + timeout = apr_time_from_sec(SECONDS_TO_LINGER); + apr_socket_timeout_set(csd, timeout); + apr_socket_opt_set(csd, APR_INCOMPLETE_READ, 1); + while (1) { + nbytes = sizeof(dummybuf); + rc = apr_recv(csd, dummybuf, &nbytes); + if (rc != APR_SUCCESS || nbytes == 0) + break; + + total_linger_time += SECONDS_TO_LINGER; + if (total_linger_time >= MAX_SECS_TO_LINGER) { + break; + } + } + + apr_socket_close(csd); + return; +} + +AP_CORE_DECLARE(void) ap_process_connection(conn_rec *c, void *csd) +{ + int rc; + ap_update_vhost_given_ip(c); + + rc = ap_run_pre_connection(c, csd); + if (rc != OK && rc != DONE) { + c->aborted = 1; + } + + if (!c->aborted) { + ap_run_process_connection(c); + } +} + diff --git a/rubbos/app/httpd-2.0.64/server/connection.lo b/rubbos/app/httpd-2.0.64/server/connection.lo new file mode 100644 index 00000000..78ca4b35 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/connection.lo @@ -0,0 +1,12 @@ +# connection.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/connection.o' + +# Name of the non-PIC object. +non_pic_object='connection.o' + diff --git a/rubbos/app/httpd-2.0.64/server/connection.o b/rubbos/app/httpd-2.0.64/server/connection.o new file mode 100644 index 0000000000000000000000000000000000000000..358e13a046c961e65dc6f79f1268a096cb82b632 GIT binary patch literal 43584 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/server/core.c b/rubbos/app/httpd-2.0.64/server/core.c new file mode 100644 index 00000000..a6b1b4e6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/core.c @@ -0,0 +1,4619 @@ +/* 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. + */ + +#include "apr.h" +#include "apr_strings.h" +#include "apr_lib.h" +#include "apr_fnmatch.h" +#include "apr_hash.h" +#include "apr_thread_proc.h" /* for RLIMIT stuff */ +#include "apr_hooks.h" + +#define APR_WANT_IOVEC +#define APR_WANT_STRFUNC +#define APR_WANT_MEMFUNC +#include "apr_want.h" + +#define CORE_PRIVATE +#include "ap_config.h" +#include "httpd.h" +#include "http_config.h" +#include "http_core.h" +#include "http_protocol.h" /* For index_of_response(). Grump. */ +#include "http_request.h" +#include "http_vhost.h" +#include "http_main.h" /* For the default_handler below... */ +#include "http_log.h" +#include "rfc1413.h" +#include "util_md5.h" +#include "http_connection.h" +#include "apr_buckets.h" +#include "util_filter.h" +#include "util_ebcdic.h" +#include "mpm.h" +#include "mpm_common.h" +#include "scoreboard.h" +#include "mod_core.h" +#include "mod_proxy.h" +#include "ap_listen.h" + +/* LimitRequestBody handling */ +#define AP_LIMIT_REQ_BODY_UNSET ((apr_off_t) -1) +#define AP_DEFAULT_LIMIT_REQ_BODY ((apr_off_t) 0) + +/* LimitXMLRequestBody handling */ +#define AP_LIMIT_UNSET ((long) -1) +#define AP_DEFAULT_LIMIT_XML_BODY ((size_t)1000000) + +#define AP_MIN_SENDFILE_BYTES (256) + +/* maximum include nesting level */ +#ifndef AP_MAX_INCLUDE_DEPTH +#define AP_MAX_INCLUDE_DEPTH (128) +#endif + +APR_HOOK_STRUCT( + APR_HOOK_LINK(get_mgmt_items) +) + +AP_IMPLEMENT_HOOK_RUN_ALL(int, get_mgmt_items, + (apr_pool_t *p, const char *val, apr_hash_t *ht), + (p, val, ht), OK, DECLINED) + +/* Server core module... This module provides support for really basic + * server operations, including options and commands which control the + * operation of other modules. Consider this the bureaucracy module. + * + * The core module also defines handlers, etc., do handle just enough + * to allow a server with the core module ONLY to actually serve documents + * (though it slaps DefaultType on all of 'em); this was useful in testing, + * but may not be worth preserving. + * + * This file could almost be mod_core.c, except for the stuff which affects + * the http_conf_globals. + */ + +/* Handles for core filters */ +AP_DECLARE_DATA ap_filter_rec_t *ap_subreq_core_filter_handle; +AP_DECLARE_DATA ap_filter_rec_t *ap_core_output_filter_handle; +AP_DECLARE_DATA ap_filter_rec_t *ap_content_length_filter_handle; +AP_DECLARE_DATA ap_filter_rec_t *ap_net_time_filter_handle; +AP_DECLARE_DATA ap_filter_rec_t *ap_core_input_filter_handle; + +/* magic pointer for ErrorDocument xxx "default" */ +static char errordocument_default; + +static void *create_core_dir_config(apr_pool_t *a, char *dir) +{ + core_dir_config *conf; + int i; + + conf = (core_dir_config *)apr_pcalloc(a, sizeof(core_dir_config)); + + /* conf->r and conf->d[_*] are initialized by dirsection() or left NULL */ + + conf->opts = dir ? OPT_UNSET : OPT_UNSET|OPT_ALL; + conf->opts_add = conf->opts_remove = OPT_NONE; + conf->override = dir ? OR_UNSET : OR_UNSET|OR_ALL; + + conf->content_md5 = 2; + conf->accept_path_info = 3; + + conf->use_canonical_name = USE_CANONICAL_NAME_UNSET; + + conf->hostname_lookups = HOSTNAME_LOOKUP_UNSET; + conf->do_rfc1413 = DEFAULT_RFC1413 | 2; /* set bit 1 to indicate default */ + conf->satisfy = apr_palloc(a, sizeof(*conf->satisfy) * METHODS); + for (i = 0; i < METHODS; ++i) { + conf->satisfy[i] = SATISFY_NOSPEC; + } + +#ifdef RLIMIT_CPU + conf->limit_cpu = NULL; +#endif +#if defined(RLIMIT_DATA) || defined(RLIMIT_VMEM) || defined(RLIMIT_AS) + conf->limit_mem = NULL; +#endif +#ifdef RLIMIT_NPROC + conf->limit_nproc = NULL; +#endif + + conf->limit_req_body = AP_LIMIT_REQ_BODY_UNSET; + conf->limit_xml_body = AP_LIMIT_UNSET; + conf->sec_file = apr_array_make(a, 2, sizeof(ap_conf_vector_t *)); + + conf->server_signature = srv_sig_unset; + + conf->add_default_charset = ADD_DEFAULT_CHARSET_UNSET; + conf->add_default_charset_name = DEFAULT_ADD_DEFAULT_CHARSET_NAME; + + /* Overriding all negotiation + */ + conf->mime_type = NULL; + conf->handler = NULL; + conf->output_filters = NULL; + conf->input_filters = NULL; + + /* + * Flag for use of inodes in ETags. + */ + conf->etag_bits = ETAG_UNSET; + conf->etag_add = ETAG_UNSET; + conf->etag_remove = ETAG_UNSET; + + conf->enable_mmap = ENABLE_MMAP_UNSET; + conf->enable_sendfile = ENABLE_SENDFILE_UNSET; + conf->allow_encoded_slashes = 0; + + return (void *)conf; +} + +/* + * Overlay one hash table of ct_output_filters onto another + */ +static void *merge_ct_filters(apr_pool_t *p, + const void *key, + apr_ssize_t klen, + const void *overlay_val, + const void *base_val, + const void *data) +{ + ap_filter_rec_t *cur; + const ap_filter_rec_t *overlay_info = (const ap_filter_rec_t *)overlay_val; + const ap_filter_rec_t *base_info = (const ap_filter_rec_t *)base_val; + + cur = NULL; + + while (overlay_info) { + ap_filter_rec_t *new; + + new = apr_pcalloc(p, sizeof(ap_filter_rec_t)); + new->name = apr_pstrdup(p, overlay_info->name); + new->next = cur; + cur = new; + overlay_info = overlay_info->next; + } + + while (base_info) { + ap_filter_rec_t *f; + int found = 0; + + /* We can't have dups. */ + f = cur; + while (f) { + if (!strcasecmp(base_info->name, f->name)) { + found = 1; + break; + } + + f = f->next; + } + + if (!found) { + f = apr_pcalloc(p, sizeof(ap_filter_rec_t)); + f->name = apr_pstrdup(p, base_info->name); + f->next = cur; + cur = f; + } + + base_info = base_info->next; + } + + return cur; +} + +static void *merge_core_dir_configs(apr_pool_t *a, void *basev, void *newv) +{ + core_dir_config *base = (core_dir_config *)basev; + core_dir_config *new = (core_dir_config *)newv; + core_dir_config *conf; + int i; + + /* Create this conf by duplicating the base, replacing elements + * (or creating copies for merging) where new-> values exist. + */ + conf = (core_dir_config *)apr_palloc(a, sizeof(core_dir_config)); + memcpy(conf, base, sizeof(core_dir_config)); + + conf->d = new->d; + conf->d_is_fnmatch = new->d_is_fnmatch; + conf->d_components = new->d_components; + conf->r = new->r; + + if (new->opts & OPT_UNSET) { + /* there was no explicit setting of new->opts, so we merge + * preserve the invariant (opts_add & opts_remove) == 0 + */ + conf->opts_add = (conf->opts_add & ~new->opts_remove) | new->opts_add; + conf->opts_remove = (conf->opts_remove & ~new->opts_add) + | new->opts_remove; + conf->opts = (conf->opts & ~conf->opts_remove) | conf->opts_add; + if ((base->opts & OPT_INCNOEXEC) && (new->opts & OPT_INCLUDES)) { + conf->opts = (conf->opts & ~OPT_INCNOEXEC) | OPT_INCLUDES; + } + } + else { + /* otherwise we just copy, because an explicit opts setting + * overrides all earlier +/- modifiers + */ + conf->opts = new->opts; + conf->opts_add = new->opts_add; + conf->opts_remove = new->opts_remove; + } + + if (!(new->override & OR_UNSET)) { + conf->override = new->override; + } + + if (new->ap_default_type) { + conf->ap_default_type = new->ap_default_type; + } + + if (new->ap_auth_type) { + conf->ap_auth_type = new->ap_auth_type; + } + + if (new->ap_auth_name) { + conf->ap_auth_name = new->ap_auth_name; + } + + if (new->ap_requires) { + conf->ap_requires = new->ap_requires; + } + + if (conf->response_code_strings == NULL) { + conf->response_code_strings = new->response_code_strings; + } + else if (new->response_code_strings != NULL) { + /* If we merge, the merge-result must have it's own array + */ + conf->response_code_strings = apr_palloc(a, + sizeof(*conf->response_code_strings) * RESPONSE_CODES); + memcpy(conf->response_code_strings, base->response_code_strings, + sizeof(*conf->response_code_strings) * RESPONSE_CODES); + + for (i = 0; i < RESPONSE_CODES; ++i) { + if (new->response_code_strings[i] != NULL) { + conf->response_code_strings[i] = new->response_code_strings[i]; + } + } + } + /* Otherwise we simply use the base->response_code_strings array + */ + + if (new->hostname_lookups != HOSTNAME_LOOKUP_UNSET) { + conf->hostname_lookups = new->hostname_lookups; + } + + if ((new->do_rfc1413 & 2) == 0) { + conf->do_rfc1413 = new->do_rfc1413; + } + + if ((new->content_md5 & 2) == 0) { + conf->content_md5 = new->content_md5; + } + + if (new->accept_path_info != 3) { + conf->accept_path_info = new->accept_path_info; + } + + if (new->use_canonical_name != USE_CANONICAL_NAME_UNSET) { + conf->use_canonical_name = new->use_canonical_name; + } + +#ifdef RLIMIT_CPU + if (new->limit_cpu) { + conf->limit_cpu = new->limit_cpu; + } +#endif + +#if defined(RLIMIT_DATA) || defined(RLIMIT_VMEM) || defined(RLIMIT_AS) + if (new->limit_mem) { + conf->limit_mem = new->limit_mem; + } +#endif + +#ifdef RLIMIT_NPROC + if (new->limit_nproc) { + conf->limit_nproc = new->limit_nproc; + } +#endif + + if (new->limit_req_body != AP_LIMIT_REQ_BODY_UNSET) { + conf->limit_req_body = new->limit_req_body; + } + + if (new->limit_xml_body != AP_LIMIT_UNSET) + conf->limit_xml_body = new->limit_xml_body; + else + conf->limit_xml_body = base->limit_xml_body; + + if (!conf->sec_file) { + conf->sec_file = new->sec_file; + } + else if (new->sec_file) { + /* If we merge, the merge-result must have it's own array + */ + conf->sec_file = apr_array_append(a, base->sec_file, new->sec_file); + } + /* Otherwise we simply use the base->sec_file array + */ + + /* use a separate ->satisfy[] array either way */ + conf->satisfy = apr_palloc(a, sizeof(*conf->satisfy) * METHODS); + for (i = 0; i < METHODS; ++i) { + if (new->satisfy[i] != SATISFY_NOSPEC) { + conf->satisfy[i] = new->satisfy[i]; + } else { + conf->satisfy[i] = base->satisfy[i]; + } + } + + if (new->server_signature != srv_sig_unset) { + conf->server_signature = new->server_signature; + } + + if (new->add_default_charset != ADD_DEFAULT_CHARSET_UNSET) { + conf->add_default_charset = new->add_default_charset; + conf->add_default_charset_name = new->add_default_charset_name; + } + + /* Overriding all negotiation + */ + if (new->mime_type) { + conf->mime_type = new->mime_type; + } + + if (new->handler) { + conf->handler = new->handler; + } + + if (new->output_filters) { + conf->output_filters = new->output_filters; + } + + if (new->input_filters) { + conf->input_filters = new->input_filters; + } + + if (conf->ct_output_filters && new->ct_output_filters) { + conf->ct_output_filters = apr_hash_merge(a, + new->ct_output_filters, + conf->ct_output_filters, + merge_ct_filters, + NULL); + } + else if (new->ct_output_filters) { + conf->ct_output_filters = apr_hash_copy(a, new->ct_output_filters); + } + else if (conf->ct_output_filters) { + /* That memcpy above isn't enough. */ + conf->ct_output_filters = apr_hash_copy(a, base->ct_output_filters); + } + + /* + * Now merge the setting of the FileETag directive. + */ + if (new->etag_bits == ETAG_UNSET) { + conf->etag_add = + (conf->etag_add & (~ new->etag_remove)) | new->etag_add; + conf->etag_remove = + (conf->opts_remove & (~ new->etag_add)) | new->etag_remove; + conf->etag_bits = + (conf->etag_bits & (~ conf->etag_remove)) | conf->etag_add; + } + else { + conf->etag_bits = new->etag_bits; + conf->etag_add = new->etag_add; + conf->etag_remove = new->etag_remove; + } + + if (conf->etag_bits != ETAG_NONE) { + conf->etag_bits &= (~ ETAG_NONE); + } + + if (new->enable_mmap != ENABLE_MMAP_UNSET) { + conf->enable_mmap = new->enable_mmap; + } + + if (new->enable_sendfile != ENABLE_SENDFILE_UNSET) { + conf->enable_sendfile = new->enable_sendfile; + } + + conf->allow_encoded_slashes = new->allow_encoded_slashes; + + return (void*)conf; +} + +static void *create_core_server_config(apr_pool_t *a, server_rec *s) +{ + core_server_config *conf; + int is_virtual = s->is_virtual; + + conf = (core_server_config *)apr_pcalloc(a, sizeof(core_server_config)); + +#ifdef GPROF + conf->gprof_dir = NULL; +#endif + + conf->access_name = is_virtual ? NULL : DEFAULT_ACCESS_FNAME; + conf->ap_document_root = is_virtual ? NULL : DOCUMENT_LOCATION; + conf->sec_dir = apr_array_make(a, 40, sizeof(ap_conf_vector_t *)); + conf->sec_url = apr_array_make(a, 40, sizeof(ap_conf_vector_t *)); + + /* recursion stopper */ + conf->redirect_limit = 0; /* 0 == unset */ + conf->subreq_limit = 0; + + conf->trace_enable = AP_TRACE_UNSET; + + return (void *)conf; +} + +static void *merge_core_server_configs(apr_pool_t *p, void *basev, void *virtv) +{ + core_server_config *base = (core_server_config *)basev; + core_server_config *virt = (core_server_config *)virtv; + core_server_config *conf; + + conf = (core_server_config *)apr_palloc(p, sizeof(core_server_config)); + memcpy(conf, virt, sizeof(core_server_config)); + + if (!conf->access_name) { + conf->access_name = base->access_name; + } + + if (!conf->ap_document_root) { + conf->ap_document_root = base->ap_document_root; + } + + conf->sec_dir = apr_array_append(p, base->sec_dir, virt->sec_dir); + conf->sec_url = apr_array_append(p, base->sec_url, virt->sec_url); + + conf->redirect_limit = virt->redirect_limit + ? virt->redirect_limit + : base->redirect_limit; + + conf->subreq_limit = virt->subreq_limit + ? virt->subreq_limit + : base->subreq_limit; + + conf->trace_enable = (virt->trace_enable != AP_TRACE_UNSET) + ? virt->trace_enable + : base->trace_enable; + + return conf; +} + +/* Add per-directory configuration entry (for section); + * these are part of the core server config. + */ + +AP_CORE_DECLARE(void) ap_add_per_dir_conf(server_rec *s, void *dir_config) +{ + core_server_config *sconf = ap_get_module_config(s->module_config, + &core_module); + void **new_space = (void **)apr_array_push(sconf->sec_dir); + + *new_space = dir_config; +} + +AP_CORE_DECLARE(void) ap_add_per_url_conf(server_rec *s, void *url_config) +{ + core_server_config *sconf = ap_get_module_config(s->module_config, + &core_module); + void **new_space = (void **)apr_array_push(sconf->sec_url); + + *new_space = url_config; +} + +AP_CORE_DECLARE(void) ap_add_file_conf(core_dir_config *conf, void *url_config) +{ + void **new_space = (void **)apr_array_push(conf->sec_file); + + *new_space = url_config; +} + +/* We need to do a stable sort, qsort isn't stable. So to make it stable + * we'll be maintaining the original index into the list, and using it + * as the minor key during sorting. The major key is the number of + * components (where the root component is zero). + */ +struct reorder_sort_rec { + ap_conf_vector_t *elt; + int orig_index; +}; + +static int reorder_sorter(const void *va, const void *vb) +{ + const struct reorder_sort_rec *a = va; + const struct reorder_sort_rec *b = vb; + core_dir_config *core_a; + core_dir_config *core_b; + + core_a = ap_get_module_config(a->elt, &core_module); + core_b = ap_get_module_config(b->elt, &core_module); + + /* a regex always sorts after a non-regex + */ + if (!core_a->r && core_b->r) { + return -1; + } + else if (core_a->r && !core_b->r) { + return 1; + } + + /* we always sort next by the number of components + */ + if (core_a->d_components < core_b->d_components) { + return -1; + } + else if (core_a->d_components > core_b->d_components) { + return 1; + } + + /* They have the same number of components, we now have to compare + * the minor key to maintain the original order (from the config.) + */ + return a->orig_index - b->orig_index; +} + +void ap_core_reorder_directories(apr_pool_t *p, server_rec *s) +{ + core_server_config *sconf; + apr_array_header_t *sec_dir; + struct reorder_sort_rec *sortbin; + int nelts; + ap_conf_vector_t **elts; + int i; + apr_pool_t *tmp; + + sconf = ap_get_module_config(s->module_config, &core_module); + sec_dir = sconf->sec_dir; + nelts = sec_dir->nelts; + elts = (ap_conf_vector_t **)sec_dir->elts; + + if (!nelts) { + /* simple case of already being sorted... */ + /* We're not checking this condition to be fast... we're checking + * it to avoid trying to palloc zero bytes, which can trigger some + * memory debuggers to barf + */ + return; + } + + /* we have to allocate tmp space to do a stable sort */ + apr_pool_create(&tmp, p); + sortbin = apr_palloc(tmp, sec_dir->nelts * sizeof(*sortbin)); + for (i = 0; i < nelts; ++i) { + sortbin[i].orig_index = i; + sortbin[i].elt = elts[i]; + } + + qsort(sortbin, nelts, sizeof(*sortbin), reorder_sorter); + + /* and now copy back to the original array */ + for (i = 0; i < nelts; ++i) { + elts[i] = sortbin[i].elt; + } + + apr_pool_destroy(tmp); +} + +/***************************************************************** + * + * There are some elements of the core config structures in which + * other modules have a legitimate interest (this is ugly, but necessary + * to preserve NCSA back-compatibility). So, we have a bunch of accessors + * here... + */ + +AP_DECLARE(int) ap_allow_options(request_rec *r) +{ + core_dir_config *conf = + (core_dir_config *)ap_get_module_config(r->per_dir_config, &core_module); + + return conf->opts; +} + +AP_DECLARE(int) ap_allow_overrides(request_rec *r) +{ + core_dir_config *conf; + conf = (core_dir_config *)ap_get_module_config(r->per_dir_config, + &core_module); + + return conf->override; +} + +AP_DECLARE(const char *) ap_auth_type(request_rec *r) +{ + core_dir_config *conf; + + conf = (core_dir_config *)ap_get_module_config(r->per_dir_config, + &core_module); + + return conf->ap_auth_type; +} + +AP_DECLARE(const char *) ap_auth_name(request_rec *r) +{ + core_dir_config *conf; + + conf = (core_dir_config *)ap_get_module_config(r->per_dir_config, + &core_module); + + return conf->ap_auth_name; +} + +AP_DECLARE(const char *) ap_default_type(request_rec *r) +{ + core_dir_config *conf; + + conf = (core_dir_config *)ap_get_module_config(r->per_dir_config, + &core_module); + + return conf->ap_default_type + ? conf->ap_default_type + : DEFAULT_CONTENT_TYPE; +} + +AP_DECLARE(const char *) ap_document_root(request_rec *r) /* Don't use this! */ +{ + core_server_config *conf; + + conf = (core_server_config *)ap_get_module_config(r->server->module_config, + &core_module); + + return conf->ap_document_root; +} + +AP_DECLARE(const apr_array_header_t *) ap_requires(request_rec *r) +{ + core_dir_config *conf; + + conf = (core_dir_config *)ap_get_module_config(r->per_dir_config, + &core_module); + + return conf->ap_requires; +} + +AP_DECLARE(int) ap_satisfies(request_rec *r) +{ + core_dir_config *conf; + + conf = (core_dir_config *)ap_get_module_config(r->per_dir_config, + &core_module); + + return conf->satisfy[r->method_number]; +} + +/* Should probably just get rid of this... the only code that cares is + * part of the core anyway (and in fact, it isn't publicised to other + * modules). + */ + +char *ap_response_code_string(request_rec *r, int error_index) +{ + core_dir_config *dirconf; + core_request_config *reqconf; + + /* check for string registered via ap_custom_response() first */ + reqconf = (core_request_config *)ap_get_module_config(r->request_config, + &core_module); + if (reqconf->response_code_strings != NULL && + reqconf->response_code_strings[error_index] != NULL) { + return reqconf->response_code_strings[error_index]; + } + + /* check for string specified via ErrorDocument */ + dirconf = (core_dir_config *)ap_get_module_config(r->per_dir_config, + &core_module); + + if (dirconf->response_code_strings == NULL) { + return NULL; + } + + if (dirconf->response_code_strings[error_index] == &errordocument_default) { + return NULL; + } + + return dirconf->response_code_strings[error_index]; +} + + +/* Code from Harald Hanche-Olsen */ +static APR_INLINE void do_double_reverse (conn_rec *conn) +{ + apr_sockaddr_t *sa; + apr_status_t rv; + + if (conn->double_reverse) { + /* already done */ + return; + } + + if (conn->remote_host == NULL || conn->remote_host[0] == '\0') { + /* single reverse failed, so don't bother */ + conn->double_reverse = -1; + return; + } + + rv = apr_sockaddr_info_get(&sa, conn->remote_host, APR_UNSPEC, 0, 0, conn->pool); + if (rv == APR_SUCCESS) { + while (sa) { + if (apr_sockaddr_equal(sa, conn->remote_addr)) { + conn->double_reverse = 1; + return; + } + + sa = sa->next; + } + } + + conn->double_reverse = -1; +} + +AP_DECLARE(const char *) ap_get_remote_host(conn_rec *conn, void *dir_config, + int type, int *str_is_ip) +{ + int hostname_lookups; + + if (str_is_ip) { /* if caller wants to know */ + *str_is_ip = 0; + } + + /* If we haven't checked the host name, and we want to */ + if (dir_config) { + hostname_lookups = + ((core_dir_config *)ap_get_module_config(dir_config, &core_module)) + ->hostname_lookups; + + if (hostname_lookups == HOSTNAME_LOOKUP_UNSET) { + hostname_lookups = HOSTNAME_LOOKUP_OFF; + } + } + else { + /* the default */ + hostname_lookups = HOSTNAME_LOOKUP_OFF; + } + + if (type != REMOTE_NOLOOKUP + && conn->remote_host == NULL + && (type == REMOTE_DOUBLE_REV + || hostname_lookups != HOSTNAME_LOOKUP_OFF)) { + + if (apr_getnameinfo(&conn->remote_host, conn->remote_addr, 0) + == APR_SUCCESS) { + ap_str_tolower(conn->remote_host); + + if (hostname_lookups == HOSTNAME_LOOKUP_DOUBLE) { + do_double_reverse(conn); + if (conn->double_reverse != 1) { + conn->remote_host = NULL; + } + } + } + + /* if failed, set it to the NULL string to indicate error */ + if (conn->remote_host == NULL) { + conn->remote_host = ""; + } + } + + if (type == REMOTE_DOUBLE_REV) { + do_double_reverse(conn); + if (conn->double_reverse == -1) { + return NULL; + } + } + + /* + * Return the desired information; either the remote DNS name, if found, + * or either NULL (if the hostname was requested) or the IP address + * (if any identifier was requested). + */ + if (conn->remote_host != NULL && conn->remote_host[0] != '\0') { + return conn->remote_host; + } + else { + if (type == REMOTE_HOST || type == REMOTE_DOUBLE_REV) { + return NULL; + } + else { + if (str_is_ip) { /* if caller wants to know */ + *str_is_ip = 1; + } + + return conn->remote_ip; + } + } +} + +AP_DECLARE(const char *) ap_get_remote_logname(request_rec *r) +{ + core_dir_config *dir_conf; + + if (r->connection->remote_logname != NULL) { + return r->connection->remote_logname; + } + + /* If we haven't checked the identity, and we want to */ + dir_conf = (core_dir_config *)ap_get_module_config(r->per_dir_config, + &core_module); + + if (dir_conf->do_rfc1413 & 1) { + return ap_rfc1413(r->connection, r->server); + } + else { + return NULL; + } +} + +/* There are two options regarding what the "name" of a server is. The + * "canonical" name as defined by ServerName and Port, or the "client's + * name" as supplied by a possible Host: header or full URI. We never + * trust the port passed in the client's headers, we always use the + * port of the actual socket. + * + * The DNS option to UseCanonicalName causes this routine to do a + * reverse lookup on the local IP address of the connection and use + * that for the ServerName. This makes its value more reliable while + * at the same time allowing Demon's magic virtual hosting to work. + * The assumption is that DNS lookups are sufficiently quick... + * -- fanf 1998-10-03 + */ +AP_DECLARE(const char *) ap_get_server_name(request_rec *r) +{ + conn_rec *conn = r->connection; + core_dir_config *d; + + d = (core_dir_config *)ap_get_module_config(r->per_dir_config, + &core_module); + + if (d->use_canonical_name == USE_CANONICAL_NAME_OFF) { + return r->hostname ? r->hostname : r->server->server_hostname; + } + + if (d->use_canonical_name == USE_CANONICAL_NAME_DNS) { + if (conn->local_host == NULL) { + if (apr_getnameinfo(&conn->local_host, + conn->local_addr, 0) != APR_SUCCESS) + conn->local_host = apr_pstrdup(conn->pool, + r->server->server_hostname); + else { + ap_str_tolower(conn->local_host); + } + } + + return conn->local_host; + } + + /* default */ + return r->server->server_hostname; +} + +/* + * Get the current server name from the request for the purposes + * of using in a URL. If the server name is an IPv6 literal + * address, it will be returned in URL format (e.g., "[fe80::1]"). + */ +static const char *get_server_name_for_url(request_rec *r) +{ + const char *plain_server_name = ap_get_server_name(r); + +#if APR_HAVE_IPV6 + if (ap_strchr_c(plain_server_name, ':')) { /* IPv6 literal? */ + return apr_psprintf(r->pool, "[%s]", plain_server_name); + } +#endif + return plain_server_name; +} + +AP_DECLARE(apr_port_t) ap_get_server_port(const request_rec *r) +{ + apr_port_t port; + core_dir_config *d = + (core_dir_config *)ap_get_module_config(r->per_dir_config, &core_module); + + if (d->use_canonical_name == USE_CANONICAL_NAME_OFF + || d->use_canonical_name == USE_CANONICAL_NAME_DNS) { + + /* With UseCanonicalName off Apache will form self-referential + * URLs using the hostname and port supplied by the client if + * any are supplied (otherwise it will use the canonical name). + */ + port = r->parsed_uri.port_str ? r->parsed_uri.port : + r->server->port ? r->server->port : + ap_default_port(r); + } + else { /* d->use_canonical_name == USE_CANONICAL_NAME_ON */ + + /* With UseCanonicalName on (and in all versions prior to 1.3) + * Apache will use the hostname and port specified in the + * ServerName directive to construct a canonical name for the + * server. (If no port was specified in the ServerName + * directive, Apache uses the port supplied by the client if + * any is supplied, and finally the default port for the protocol + * used. + */ + port = r->server->port ? r->server->port : + r->connection->local_addr->port ? r->connection->local_addr->port : + ap_default_port(r); + } + + /* default */ + return port; +} + +AP_DECLARE(char *) ap_construct_url(apr_pool_t *p, const char *uri, + request_rec *r) +{ + unsigned port = ap_get_server_port(r); + const char *host = get_server_name_for_url(r); + + if (ap_is_default_port(port, r)) { + return apr_pstrcat(p, ap_http_method(r), "://", host, uri, NULL); + } + + return apr_psprintf(p, "%s://%s:%u%s", ap_http_method(r), host, port, uri); +} + +AP_DECLARE(apr_off_t) ap_get_limit_req_body(const request_rec *r) +{ + core_dir_config *d = + (core_dir_config *)ap_get_module_config(r->per_dir_config, &core_module); + + if (d->limit_req_body == AP_LIMIT_REQ_BODY_UNSET) { + return AP_DEFAULT_LIMIT_REQ_BODY; + } + + return d->limit_req_body; +} + + +/***************************************************************** + * + * Commands... this module handles almost all of the NCSA httpd.conf + * commands, but most of the old srm.conf is in the the modules. + */ + + +/* returns a parent if it matches the given directive */ +static const ap_directive_t * find_parent(const ap_directive_t *dirp, + const char *what) +{ + while (dirp->parent != NULL) { + dirp = dirp->parent; + + /* ### it would be nice to have atom-ized directives */ + if (strcasecmp(dirp->directive, what) == 0) + return dirp; + } + + return NULL; +} + +AP_DECLARE(const char *) ap_check_cmd_context(cmd_parms *cmd, + unsigned forbidden) +{ + const char *gt = (cmd->cmd->name[0] == '<' + && cmd->cmd->name[strlen(cmd->cmd->name)-1] != '>') + ? ">" : ""; + const ap_directive_t *found; + + if ((forbidden & NOT_IN_VIRTUALHOST) && cmd->server->is_virtual) { + return apr_pstrcat(cmd->pool, cmd->cmd->name, gt, + " cannot occur within section", NULL); + } + + if ((forbidden & NOT_IN_LIMIT) && cmd->limited != -1) { + return apr_pstrcat(cmd->pool, cmd->cmd->name, gt, + " cannot occur within section", NULL); + } + + if ((forbidden & NOT_IN_DIR_LOC_FILE) == NOT_IN_DIR_LOC_FILE) { + if (cmd->path != NULL) { + return apr_pstrcat(cmd->pool, cmd->cmd->name, gt, + " cannot occur within " + "section", NULL); + } + if (cmd->cmd->req_override & EXEC_ON_READ) { + /* EXEC_ON_READ must be NOT_IN_DIR_LOC_FILE, if not, it will + * (deliberately) segfault below in the individual tests... + */ + return NULL; + } + } + + if (((forbidden & NOT_IN_DIRECTORY) + && ((found = find_parent(cmd->directive, "directive, "directive, "directive, "directive, "directive, "pool, cmd->cmd->name, gt, + " cannot occur within ", found->directive, + "> section", NULL); + } + + return NULL; +} + +static const char *set_access_name(cmd_parms *cmd, void *dummy, + const char *arg) +{ + void *sconf = cmd->server->module_config; + core_server_config *conf = ap_get_module_config(sconf, &core_module); + + const char *err = ap_check_cmd_context(cmd, + NOT_IN_DIR_LOC_FILE|NOT_IN_LIMIT); + if (err != NULL) { + return err; + } + + conf->access_name = apr_pstrdup(cmd->pool, arg); + return NULL; +} + +#ifdef GPROF +static const char *set_gprof_dir(cmd_parms *cmd, void *dummy, const char *arg) +{ + void *sconf = cmd->server->module_config; + core_server_config *conf = ap_get_module_config(sconf, &core_module); + + const char *err = ap_check_cmd_context(cmd, + NOT_IN_DIR_LOC_FILE|NOT_IN_LIMIT); + if (err != NULL) { + return err; + } + + conf->gprof_dir = apr_pstrdup(cmd->pool, arg); + return NULL; +} +#endif /*GPROF*/ + +static const char *set_add_default_charset(cmd_parms *cmd, + void *d_, const char *arg) +{ + core_dir_config *d = d_; + + const char *err = ap_check_cmd_context(cmd, NOT_IN_LIMIT); + if (err != NULL) { + return err; + } + + if (!strcasecmp(arg, "Off")) { + d->add_default_charset = ADD_DEFAULT_CHARSET_OFF; + } + else if (!strcasecmp(arg, "On")) { + d->add_default_charset = ADD_DEFAULT_CHARSET_ON; + d->add_default_charset_name = DEFAULT_ADD_DEFAULT_CHARSET_NAME; + } + else { + d->add_default_charset = ADD_DEFAULT_CHARSET_ON; + d->add_default_charset_name = arg; + } + + return NULL; +} + +static const char *set_document_root(cmd_parms *cmd, void *dummy, + const char *arg) +{ + void *sconf = cmd->server->module_config; + core_server_config *conf = ap_get_module_config(sconf, &core_module); + + const char *err = ap_check_cmd_context(cmd, + NOT_IN_DIR_LOC_FILE|NOT_IN_LIMIT); + if (err != NULL) { + return err; + } + + /* TODO: ap_configtestonly && ap_docrootcheck && */ + /* XXX Shouldn't this be relative to ServerRoot ??? */ + if (apr_filepath_merge((char**)&conf->ap_document_root, NULL, arg, + APR_FILEPATH_TRUENAME, cmd->pool) != APR_SUCCESS + || !ap_is_directory(cmd->pool, arg)) { + if (cmd->server->is_virtual) { + ap_log_perror(APLOG_MARK, APLOG_STARTUP, 0, + cmd->pool, + "Warning: DocumentRoot [%s] does not exist", + arg); + conf->ap_document_root = arg; + } + else { + return "DocumentRoot must be a directory"; + } + } + return NULL; +} + +AP_DECLARE(void) ap_custom_response(request_rec *r, int status, + const char *string) +{ + core_request_config *conf = + ap_get_module_config(r->request_config, &core_module); + int idx; + + if (conf->response_code_strings == NULL) { + conf->response_code_strings = + apr_pcalloc(r->pool, + sizeof(*conf->response_code_strings) * RESPONSE_CODES); + } + + idx = ap_index_of_response(status); + + conf->response_code_strings[idx] = + ((ap_is_url(string) || (*string == '/')) && (*string != '"')) ? + apr_pstrdup(r->pool, string) : apr_pstrcat(r->pool, "\"", string, NULL); +} + +static const char *set_error_document(cmd_parms *cmd, void *conf_, + const char *errno_str, const char *msg) +{ + core_dir_config *conf = conf_; + int error_number, index_number, idx500; + enum { MSG, LOCAL_PATH, REMOTE_PATH } what = MSG; + + const char *err = ap_check_cmd_context(cmd, NOT_IN_LIMIT); + if (err != NULL) { + return err; + } + + /* 1st parameter should be a 3 digit number, which we recognize; + * convert it into an array index + */ + error_number = atoi(errno_str); + idx500 = ap_index_of_response(HTTP_INTERNAL_SERVER_ERROR); + + if (error_number == HTTP_INTERNAL_SERVER_ERROR) { + index_number = idx500; + } + else if ((index_number = ap_index_of_response(error_number)) == idx500) { + return apr_pstrcat(cmd->pool, "Unsupported HTTP response code ", + errno_str, NULL); + } + + /* Heuristic to determine second argument. */ + if (ap_strchr_c(msg,' ')) + what = MSG; + else if (msg[0] == '/') + what = LOCAL_PATH; + else if (ap_is_url(msg)) + what = REMOTE_PATH; + else + what = MSG; + + /* The entry should be ignored if it is a full URL for a 401 error */ + + if (error_number == 401 && what == REMOTE_PATH) { + ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, cmd->server, + "cannot use a full URL in a 401 ErrorDocument " + "directive --- ignoring!"); + } + else { /* Store it... */ + if (conf->response_code_strings == NULL) { + conf->response_code_strings = + apr_pcalloc(cmd->pool, + sizeof(*conf->response_code_strings) * + RESPONSE_CODES); + } + + if (strcmp(msg, "default") == 0) { + /* special case: ErrorDocument 404 default restores the + * canned server error response + */ + conf->response_code_strings[index_number] = &errordocument_default; + } + else { + /* hack. Prefix a " if it is a msg; as that is what + * http_protocol.c relies on to distinguish between + * a msg and a (local) path. + */ + conf->response_code_strings[index_number] = (what == MSG) ? + apr_pstrcat(cmd->pool, "\"",msg,NULL) : + apr_pstrdup(cmd->pool, msg); + } + } + + return NULL; +} + +static const char *set_override(cmd_parms *cmd, void *d_, const char *l) +{ + core_dir_config *d = d_; + char *w; + + const char *err = ap_check_cmd_context(cmd, NOT_IN_LIMIT); + if (err != NULL) { + return err; + } + + d->override = OR_NONE; + while (l[0]) { + w = ap_getword_conf(cmd->pool, &l); + if (!strcasecmp(w, "Limit")) { + d->override |= OR_LIMIT; + } + else if (!strcasecmp(w, "Options")) { + d->override |= OR_OPTIONS; + } + else if (!strcasecmp(w, "FileInfo")) { + d->override |= OR_FILEINFO; + } + else if (!strcasecmp(w, "AuthConfig")) { + d->override |= OR_AUTHCFG; + } + else if (!strcasecmp(w, "Indexes")) { + d->override |= OR_INDEXES; + } + else if (!strcasecmp(w, "None")) { + d->override = OR_NONE; + } + else if (!strcasecmp(w, "All")) { + d->override = OR_ALL; + } + else { + return apr_pstrcat(cmd->pool, "Illegal override option ", w, NULL); + } + + d->override &= ~OR_UNSET; + } + + return NULL; +} + +static const char *set_options(cmd_parms *cmd, void *d_, const char *l) +{ + core_dir_config *d = d_; + allow_options_t opt; + int first = 1; + char action; + + while (l[0]) { + char *w = ap_getword_conf(cmd->pool, &l); + action = '\0'; + + if (*w == '+' || *w == '-') { + action = *(w++); + } + else if (first) { + d->opts = OPT_NONE; + first = 0; + } + + if (!strcasecmp(w, "Indexes")) { + opt = OPT_INDEXES; + } + else if (!strcasecmp(w, "Includes")) { + opt = OPT_INCLUDES; + } + else if (!strcasecmp(w, "IncludesNOEXEC")) { + opt = (OPT_INCLUDES | OPT_INCNOEXEC); + } + else if (!strcasecmp(w, "FollowSymLinks")) { + opt = OPT_SYM_LINKS; + } + else if (!strcasecmp(w, "SymLinksIfOwnerMatch")) { + opt = OPT_SYM_OWNER; + } + else if (!strcasecmp(w, "execCGI")) { + opt = OPT_EXECCGI; + } + else if (!strcasecmp(w, "MultiViews")) { + opt = OPT_MULTI; + } + else if (!strcasecmp(w, "RunScripts")) { /* AI backcompat. Yuck */ + opt = OPT_MULTI|OPT_EXECCGI; + } + else if (!strcasecmp(w, "None")) { + opt = OPT_NONE; + } + else if (!strcasecmp(w, "All")) { + opt = OPT_ALL; + } + else { + return apr_pstrcat(cmd->pool, "Illegal option ", w, NULL); + } + + /* we ensure the invariant (d->opts_add & d->opts_remove) == 0 */ + if (action == '-') { + d->opts_remove |= opt; + d->opts_add &= ~opt; + d->opts &= ~opt; + } + else if (action == '+') { + d->opts_add |= opt; + d->opts_remove &= ~opt; + d->opts |= opt; + } + else { + d->opts |= opt; + } + } + + return NULL; +} + +/* + * Note what data should be used when forming file ETag values. + * It would be nicer to do this as an ITERATE, but then we couldn't + * remember the +/- state properly. + */ +static const char *set_etag_bits(cmd_parms *cmd, void *mconfig, + const char *args_p) +{ + core_dir_config *cfg; + etag_components_t bit; + char action; + char *token; + const char *args; + int valid; + int first; + int explicit; + + cfg = (core_dir_config *)mconfig; + + args = args_p; + first = 1; + explicit = 0; + while (args[0] != '\0') { + action = '*'; + bit = ETAG_UNSET; + valid = 1; + token = ap_getword_conf(cmd->pool, &args); + if ((*token == '+') || (*token == '-')) { + action = *token; + token++; + } + else { + /* + * The occurrence of an absolute setting wipes + * out any previous relative ones. The first such + * occurrence forgets any inherited ones, too. + */ + if (first) { + cfg->etag_bits = ETAG_UNSET; + cfg->etag_add = ETAG_UNSET; + cfg->etag_remove = ETAG_UNSET; + first = 0; + } + } + + if (strcasecmp(token, "None") == 0) { + if (action != '*') { + valid = 0; + } + else { + cfg->etag_bits = bit = ETAG_NONE; + explicit = 1; + } + } + else if (strcasecmp(token, "All") == 0) { + if (action != '*') { + valid = 0; + } + else { + explicit = 1; + cfg->etag_bits = bit = ETAG_ALL; + } + } + else if (strcasecmp(token, "Size") == 0) { + bit = ETAG_SIZE; + } + else if ((strcasecmp(token, "LMTime") == 0) + || (strcasecmp(token, "MTime") == 0) + || (strcasecmp(token, "LastModified") == 0)) { + bit = ETAG_MTIME; + } + else if (strcasecmp(token, "INode") == 0) { + bit = ETAG_INODE; + } + else { + return apr_pstrcat(cmd->pool, "Unknown keyword '", + token, "' for ", cmd->cmd->name, + " directive", NULL); + } + + if (! valid) { + return apr_pstrcat(cmd->pool, cmd->cmd->name, " keyword '", + token, "' cannot be used with '+' or '-'", + NULL); + } + + if (action == '+') { + /* + * Make sure it's in the 'add' list and absent from the + * 'subtract' list. + */ + cfg->etag_add |= bit; + cfg->etag_remove &= (~ bit); + } + else if (action == '-') { + cfg->etag_remove |= bit; + cfg->etag_add &= (~ bit); + } + else { + /* + * Non-relative values wipe out any + or - values + * accumulated so far. + */ + cfg->etag_bits |= bit; + cfg->etag_add = ETAG_UNSET; + cfg->etag_remove = ETAG_UNSET; + explicit = 1; + } + } + + /* + * Any setting at all will clear the 'None' and 'Unset' bits. + */ + + if (cfg->etag_add != ETAG_UNSET) { + cfg->etag_add &= (~ ETAG_UNSET); + } + + if (cfg->etag_remove != ETAG_UNSET) { + cfg->etag_remove &= (~ ETAG_UNSET); + } + + if (explicit) { + cfg->etag_bits &= (~ ETAG_UNSET); + + if ((cfg->etag_bits & ETAG_NONE) != ETAG_NONE) { + cfg->etag_bits &= (~ ETAG_NONE); + } + } + + return NULL; +} + +static const char *set_enable_mmap(cmd_parms *cmd, void *d_, + const char *arg) +{ + core_dir_config *d = d_; + const char *err = ap_check_cmd_context(cmd, NOT_IN_LIMIT); + + if (err != NULL) { + return err; + } + + if (strcasecmp(arg, "on") == 0) { + d->enable_mmap = ENABLE_MMAP_ON; + } + else if (strcasecmp(arg, "off") == 0) { + d->enable_mmap = ENABLE_MMAP_OFF; + } + else { + return "parameter must be 'on' or 'off'"; + } + + return NULL; +} + +static const char *set_enable_sendfile(cmd_parms *cmd, void *d_, + const char *arg) +{ + core_dir_config *d = d_; + const char *err = ap_check_cmd_context(cmd, NOT_IN_LIMIT); + + if (err != NULL) { + return err; + } + + if (strcasecmp(arg, "on") == 0) { + d->enable_sendfile = ENABLE_SENDFILE_ON; + } + else if (strcasecmp(arg, "off") == 0) { + d->enable_sendfile = ENABLE_SENDFILE_OFF; + } + else { + return "parameter must be 'on' or 'off'"; + } + + return NULL; +} + +static const char *satisfy(cmd_parms *cmd, void *c_, const char *arg) +{ + core_dir_config *c = c_; + int satisfy = SATISFY_NOSPEC; + int i; + + if (!strcasecmp(arg, "all")) { + satisfy = SATISFY_ALL; + } + else if (!strcasecmp(arg, "any")) { + satisfy = SATISFY_ANY; + } + else { + return "Satisfy either 'any' or 'all'."; + } + + for (i = 0; i < METHODS; ++i) { + if (cmd->limited & (AP_METHOD_BIT << i)) { + c->satisfy[i] = satisfy; + } + } + + return NULL; +} + +static const char *require(cmd_parms *cmd, void *c_, const char *arg) +{ + require_line *r; + core_dir_config *c = c_; + + if (!c->ap_requires) { + c->ap_requires = apr_array_make(cmd->pool, 2, sizeof(require_line)); + } + + r = (require_line *)apr_array_push(c->ap_requires); + r->requirement = apr_pstrdup(cmd->pool, arg); + r->method_mask = cmd->limited; + + return NULL; +} + +AP_CORE_DECLARE_NONSTD(const char *) ap_limit_section(cmd_parms *cmd, + void *dummy, + const char *arg) +{ + const char *limited_methods = ap_getword(cmd->pool, &arg, '>'); + void *tog = cmd->cmd->cmd_data; + apr_int64_t limited = 0; + const char *errmsg; + + const char *err = ap_check_cmd_context(cmd, NOT_IN_LIMIT); + if (err != NULL) { + return err; + } + + while (limited_methods[0]) { + char *method = ap_getword_conf(cmd->pool, &limited_methods); + int methnum; + + /* check for builtin or module registered method number */ + methnum = ap_method_number_of(method); + + if (methnum == M_TRACE && !tog) { + return "TRACE cannot be controlled by , see TraceEnable"; + } + else if (methnum == M_INVALID) { + /* method has not been registered yet, but resorce restriction + * is always checked before method handling, so register it. + */ + methnum = ap_method_register(cmd->pool, method); + } + + limited |= (AP_METHOD_BIT << methnum); + } + + /* Killing two features with one function, + * if (tog == NULL) , else + */ + cmd->limited = tog ? ~limited : limited; + + errmsg = ap_walk_config(cmd->directive->first_child, cmd, cmd->context); + + cmd->limited = -1; + + return errmsg; +} + +/* XXX: Bogus - need to do this differently (at least OS2/Netware suffer + * the same problem!!! + * We use this in and , to ensure that + * people don't get bitten by wrong-cased regex matches + */ + +#ifdef WIN32 +#define USE_ICASE REG_ICASE +#else +#define USE_ICASE 0 +#endif + +/* + * Report a missing-'>' syntax error. + */ +static char *unclosed_directive(cmd_parms *cmd) +{ + return apr_pstrcat(cmd->pool, cmd->cmd->name, + "> directive missing closing '>'", NULL); +} + +static const char *dirsection(cmd_parms *cmd, void *mconfig, const char *arg) +{ + const char *errmsg; + const char *endp = ap_strrchr_c(arg, '>'); + int old_overrides = cmd->override; + char *old_path = cmd->path; + core_dir_config *conf; + ap_conf_vector_t *new_dir_conf = ap_create_per_dir_config(cmd->pool); + regex_t *r = NULL; + const command_rec *thiscmd = cmd->cmd; + + const char *err = ap_check_cmd_context(cmd, + NOT_IN_DIR_LOC_FILE|NOT_IN_LIMIT); + if (err != NULL) { + return err; + } + + if (endp == NULL) { + return unclosed_directive(cmd); + } + + arg = apr_pstrndup(cmd->pool, arg, endp - arg); + + if (!arg) { + if (thiscmd->cmd_data) + return " block must specify a path"; + else + return " block must specify a path"; + } + + cmd->path = ap_getword_conf(cmd->pool, &arg); + cmd->override = OR_ALL|ACCESS_CONF; + + if (!strcmp(cmd->path, "~")) { + cmd->path = ap_getword_conf(cmd->pool, &arg); + if (!cmd->path) + return " block must specify a path"; + r = ap_pregcomp(cmd->pool, cmd->path, REG_EXTENDED|USE_ICASE); + if (!r) { + return "Regex could not be compiled"; + } + } + else if (thiscmd->cmd_data) { /* */ + r = ap_pregcomp(cmd->pool, cmd->path, REG_EXTENDED|USE_ICASE); + if (!r) { + return "Regex could not be compiled"; + } + } + else if (!strcmp(cmd->path, "/") == 0) + { + char *newpath; + + /* + * Ensure that the pathname is canonical, and append the trailing / + */ + apr_status_t rv = apr_filepath_merge(&newpath, NULL, cmd->path, + APR_FILEPATH_TRUENAME, cmd->pool); + if (rv != APR_SUCCESS && rv != APR_EPATHWILD) { + return apr_pstrcat(cmd->pool, "path, + "\"> path is invalid.", NULL); + } + + cmd->path = newpath; + if (cmd->path[strlen(cmd->path) - 1] != '/') + cmd->path = apr_pstrcat(cmd->pool, cmd->path, "/", NULL); + } + + /* initialize our config and fetch it */ + conf = ap_set_config_vectors(cmd->server, new_dir_conf, cmd->path, + &core_module, cmd->pool); + + errmsg = ap_walk_config(cmd->directive->first_child, cmd, new_dir_conf); + if (errmsg != NULL) + return errmsg; + + conf->r = r; + conf->d = cmd->path; + conf->d_is_fnmatch = (apr_fnmatch_test(conf->d) != 0); + + /* Make this explicit - the "/" root has 0 elements, that is, we + * will always merge it, and it will always sort and merge first. + * All others are sorted and tested by the number of slashes. + */ + if (strcmp(conf->d, "/") == 0) + conf->d_components = 0; + else + conf->d_components = ap_count_dirs(conf->d); + + ap_add_per_dir_conf(cmd->server, new_dir_conf); + + if (*arg != '\0') { + return apr_pstrcat(cmd->pool, "Multiple ", thiscmd->name, + "> arguments not (yet) supported.", NULL); + } + + cmd->path = old_path; + cmd->override = old_overrides; + + return NULL; +} + +static const char *urlsection(cmd_parms *cmd, void *mconfig, const char *arg) +{ + const char *errmsg; + const char *endp = ap_strrchr_c(arg, '>'); + int old_overrides = cmd->override; + char *old_path = cmd->path; + core_dir_config *conf; + regex_t *r = NULL; + const command_rec *thiscmd = cmd->cmd; + ap_conf_vector_t *new_url_conf = ap_create_per_dir_config(cmd->pool); + const char *err = ap_check_cmd_context(cmd, + NOT_IN_DIR_LOC_FILE|NOT_IN_LIMIT); + if (err != NULL) { + return err; + } + + if (endp == NULL) { + return unclosed_directive(cmd); + } + + arg = apr_pstrndup(cmd->pool, arg, endp - arg); + + cmd->path = ap_getword_conf(cmd->pool, &arg); + cmd->override = OR_ALL|ACCESS_CONF; + + if (thiscmd->cmd_data) { /* */ + r = ap_pregcomp(cmd->pool, cmd->path, REG_EXTENDED); + if (!r) { + return "Regex could not be compiled"; + } + } + else if (!strcmp(cmd->path, "~")) { + cmd->path = ap_getword_conf(cmd->pool, &arg); + r = ap_pregcomp(cmd->pool, cmd->path, REG_EXTENDED); + if (!r) { + return "Regex could not be compiled"; + } + } + + /* initialize our config and fetch it */ + conf = ap_set_config_vectors(cmd->server, new_url_conf, cmd->path, + &core_module, cmd->pool); + + errmsg = ap_walk_config(cmd->directive->first_child, cmd, new_url_conf); + if (errmsg != NULL) + return errmsg; + + conf->d = apr_pstrdup(cmd->pool, cmd->path); /* No mangling, please */ + conf->d_is_fnmatch = apr_fnmatch_test(conf->d) != 0; + conf->r = r; + + ap_add_per_url_conf(cmd->server, new_url_conf); + + if (*arg != '\0') { + return apr_pstrcat(cmd->pool, "Multiple ", thiscmd->name, + "> arguments not (yet) supported.", NULL); + } + + cmd->path = old_path; + cmd->override = old_overrides; + + return NULL; +} + +static const char *filesection(cmd_parms *cmd, void *mconfig, const char *arg) +{ + const char *errmsg; + const char *endp = ap_strrchr_c(arg, '>'); + int old_overrides = cmd->override; + char *old_path = cmd->path; + core_dir_config *conf; + regex_t *r = NULL; + const command_rec *thiscmd = cmd->cmd; + core_dir_config *c = mconfig; + ap_conf_vector_t *new_file_conf = ap_create_per_dir_config(cmd->pool); + const char *err = ap_check_cmd_context(cmd, NOT_IN_LIMIT|NOT_IN_LOCATION); + + if (err != NULL) { + return err; + } + + if (endp == NULL) { + return unclosed_directive(cmd); + } + + arg = apr_pstrndup(cmd->pool, arg, endp - arg); + + cmd->path = ap_getword_conf(cmd->pool, &arg); + /* Only if not an .htaccess file */ + if (!old_path) { + cmd->override = OR_ALL|ACCESS_CONF; + } + + if (thiscmd->cmd_data) { /* */ + r = ap_pregcomp(cmd->pool, cmd->path, REG_EXTENDED|USE_ICASE); + if (!r) { + return "Regex could not be compiled"; + } + } + else if (!strcmp(cmd->path, "~")) { + cmd->path = ap_getword_conf(cmd->pool, &arg); + r = ap_pregcomp(cmd->pool, cmd->path, REG_EXTENDED|USE_ICASE); + if (!r) { + return "Regex could not be compiled"; + } + } + else { + char *newpath; + /* Ensure that the pathname is canonical, but we + * can't test the case/aliases without a fixed path */ + if (apr_filepath_merge(&newpath, "", cmd->path, + 0, cmd->pool) != APR_SUCCESS) + return apr_pstrcat(cmd->pool, "path, + "\"> is invalid.", NULL); + cmd->path = newpath; + } + + /* initialize our config and fetch it */ + conf = ap_set_config_vectors(cmd->server, new_file_conf, cmd->path, + &core_module, cmd->pool); + + errmsg = ap_walk_config(cmd->directive->first_child, cmd, new_file_conf); + if (errmsg != NULL) + return errmsg; + + conf->d = cmd->path; + conf->d_is_fnmatch = apr_fnmatch_test(conf->d) != 0; + conf->r = r; + + ap_add_file_conf(c, new_file_conf); + + if (*arg != '\0') { + return apr_pstrcat(cmd->pool, "Multiple ", thiscmd->name, + "> arguments not (yet) supported.", NULL); + } + + cmd->path = old_path; + cmd->override = old_overrides; + + return NULL; +} + +static const char *start_ifmod(cmd_parms *cmd, void *mconfig, const char *arg) +{ + const char *endp = ap_strrchr_c(arg, '>'); + int not = (arg[0] == '!'); + module *found; + + if (endp == NULL) { + return unclosed_directive(cmd); + } + + arg = apr_pstrndup(cmd->pool, arg, endp - arg); + + if (not) { + arg++; + } + + found = ap_find_linked_module(arg); + + if ((!not && found) || (not && !found)) { + ap_directive_t *parent = NULL; + ap_directive_t *current = NULL; + const char *retval; + + retval = ap_build_cont_config(cmd->pool, cmd->temp_pool, cmd, + ¤t, &parent, "elts; + for (i = 0; i < ap_server_config_defines->nelts; i++) { + if (strcmp(defines[i], name) == 0) { + return 1; + } + } + + return 0; +} + +static const char *start_ifdefine(cmd_parms *cmd, void *dummy, const char *arg) +{ + const char *endp; + int defined; + int not = 0; + + endp = ap_strrchr_c(arg, '>'); + if (endp == NULL) { + return unclosed_directive(cmd); + } + + arg = apr_pstrndup(cmd->pool, arg, endp - arg); + + if (arg[0] == '!') { + not = 1; + arg++; + } + + defined = ap_exists_config_define(arg); + if ((!not && defined) || (not && !defined)) { + ap_directive_t *parent = NULL; + ap_directive_t *current = NULL; + const char *retval; + + retval = ap_build_cont_config(cmd->pool, cmd->temp_pool, cmd, + ¤t, &parent, " business */ + +static const char *virtualhost_section(cmd_parms *cmd, void *dummy, + const char *arg) +{ + server_rec *main_server = cmd->server, *s; + const char *errmsg; + const char *endp = ap_strrchr_c(arg, '>'); + apr_pool_t *p = cmd->pool; + + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + if (endp == NULL) { + return unclosed_directive(cmd); + } + + arg = apr_pstrndup(cmd->pool, arg, endp - arg); + + /* FIXME: There's another feature waiting to happen here -- since you + can now put multiple addresses/names on a single + you might want to use it to group common definitions and then + define other "subhosts" with their individual differences. But + personally I'd rather just do it with a macro preprocessor. -djg */ + if (main_server->is_virtual) { + return " doesn't nest!"; + } + + errmsg = ap_init_virtual_host(p, arg, main_server, &s); + if (errmsg) { + return errmsg; + } + + s->next = main_server->next; + main_server->next = s; + + s->defn_name = cmd->directive->filename; + s->defn_line_number = cmd->directive->line_num; + + cmd->server = s; + + errmsg = ap_walk_config(cmd->directive->first_child, cmd, + s->lookup_defaults); + + cmd->server = main_server; + + return errmsg; +} + +static const char *set_server_alias(cmd_parms *cmd, void *dummy, + const char *arg) +{ + if (!cmd->server->names) { + return "ServerAlias only used in "; + } + + while (*arg) { + char **item, *name = ap_getword_conf(cmd->pool, &arg); + + if (ap_is_matchexp(name)) { + item = (char **)apr_array_push(cmd->server->wild_names); + } + else { + item = (char **)apr_array_push(cmd->server->names); + } + + *item = name; + } + + return NULL; +} + +static const char *set_server_string_slot(cmd_parms *cmd, void *dummy, + const char *arg) +{ + /* This one's pretty generic... */ + + int offset = (int)(long)cmd->info; + char *struct_ptr = (char *)cmd->server; + + const char *err = ap_check_cmd_context(cmd, + NOT_IN_DIR_LOC_FILE|NOT_IN_LIMIT); + if (err != NULL) { + return err; + } + + *(const char **)(struct_ptr + offset) = arg; + return NULL; +} + +static const char *server_hostname_port(cmd_parms *cmd, void *dummy, const char *arg) +{ + const char *err = ap_check_cmd_context(cmd, NOT_IN_DIR_LOC_FILE|NOT_IN_LIMIT); + const char *portstr; + int port; + + if (err != NULL) { + return err; + } + + portstr = ap_strchr_c(arg, ':'); + if (portstr) { + cmd->server->server_hostname = apr_pstrndup(cmd->pool, arg, + portstr - arg); + portstr++; + port = atoi(portstr); + if (port <= 0 || port >= 65536) { /* 65536 == 1<<16 */ + return apr_pstrcat(cmd->temp_pool, "The port number \"", arg, + "\" is outside the appropriate range " + "(i.e., 1..65535).", NULL); + } + } + else { + cmd->server->server_hostname = apr_pstrdup(cmd->pool, arg); + port = 0; + } + + cmd->server->port = port; + return NULL; +} + +static const char *set_signature_flag(cmd_parms *cmd, void *d_, + const char *arg) +{ + core_dir_config *d = d_; + const char *err = ap_check_cmd_context(cmd, NOT_IN_LIMIT); + + if (err != NULL) { + return err; + } + + if (strcasecmp(arg, "On") == 0) { + d->server_signature = srv_sig_on; + } + else if (strcasecmp(arg, "Off") == 0) { + d->server_signature = srv_sig_off; + } + else if (strcasecmp(arg, "EMail") == 0) { + d->server_signature = srv_sig_withmail; + } + else { + return "ServerSignature: use one of: off | on | email"; + } + + return NULL; +} + +static const char *set_server_root(cmd_parms *cmd, void *dummy, + const char *arg) +{ + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + + if (err != NULL) { + return err; + } + + if ((apr_filepath_merge((char**)&ap_server_root, NULL, arg, + APR_FILEPATH_TRUENAME, cmd->pool) != APR_SUCCESS) + || !ap_is_directory(cmd->pool, ap_server_root)) { + return "ServerRoot must be a valid directory"; + } + + return NULL; +} + +static const char *set_timeout(cmd_parms *cmd, void *dummy, const char *arg) +{ + const char *err = ap_check_cmd_context(cmd, NOT_IN_DIR_LOC_FILE|NOT_IN_LIMIT); + + if (err != NULL) { + return err; + } + + cmd->server->timeout = apr_time_from_sec(atoi(arg)); + return NULL; +} + +static const char *set_idcheck(cmd_parms *cmd, void *d_, int arg) +{ + core_dir_config *d = d_; + const char *err = ap_check_cmd_context(cmd, NOT_IN_LIMIT); + + if (err != NULL) { + return err; + } + + d->do_rfc1413 = arg != 0; + return NULL; +} + +static const char *set_allow2f(cmd_parms *cmd, void *d_, int arg) +{ + core_dir_config *d = d_; + const char *err = ap_check_cmd_context(cmd, NOT_IN_LIMIT); + + if (err != NULL) { + return err; + } + + d->allow_encoded_slashes = arg != 0; + return NULL; +} + +static const char *set_hostname_lookups(cmd_parms *cmd, void *d_, + const char *arg) +{ + core_dir_config *d = d_; + const char *err = ap_check_cmd_context(cmd, NOT_IN_LIMIT); + + if (err != NULL) { + return err; + } + + if (!strcasecmp(arg, "on")) { + d->hostname_lookups = HOSTNAME_LOOKUP_ON; + } + else if (!strcasecmp(arg, "off")) { + d->hostname_lookups = HOSTNAME_LOOKUP_OFF; + } + else if (!strcasecmp(arg, "double")) { + d->hostname_lookups = HOSTNAME_LOOKUP_DOUBLE; + } + else { + return "parameter must be 'on', 'off', or 'double'"; + } + + return NULL; +} + +static const char *set_serverpath(cmd_parms *cmd, void *dummy, + const char *arg) +{ + const char *err = ap_check_cmd_context(cmd, NOT_IN_DIR_LOC_FILE|NOT_IN_LIMIT); + + if (err != NULL) { + return err; + } + + cmd->server->path = arg; + cmd->server->pathlen = strlen(arg); + return NULL; +} + +static const char *set_content_md5(cmd_parms *cmd, void *d_, int arg) +{ + core_dir_config *d = d_; + const char *err = ap_check_cmd_context(cmd, NOT_IN_LIMIT); + + if (err != NULL) { + return err; + } + + d->content_md5 = arg != 0; + return NULL; +} + +static const char *set_accept_path_info(cmd_parms *cmd, void *d_, const char *arg) +{ + core_dir_config *d = d_; + + if (strcasecmp(arg, "on") == 0) { + d->accept_path_info = AP_REQ_ACCEPT_PATH_INFO; + } + else if (strcasecmp(arg, "off") == 0) { + d->accept_path_info = AP_REQ_REJECT_PATH_INFO; + } + else if (strcasecmp(arg, "default") == 0) { + d->accept_path_info = AP_REQ_DEFAULT_PATH_INFO; + } + else { + return "AcceptPathInfo must be set to on, off or default"; + } + + return NULL; +} + +static const char *set_use_canonical_name(cmd_parms *cmd, void *d_, + const char *arg) +{ + core_dir_config *d = d_; + const char *err = ap_check_cmd_context(cmd, NOT_IN_LIMIT); + + if (err != NULL) { + return err; + } + + if (strcasecmp(arg, "on") == 0) { + d->use_canonical_name = USE_CANONICAL_NAME_ON; + } + else if (strcasecmp(arg, "off") == 0) { + d->use_canonical_name = USE_CANONICAL_NAME_OFF; + } + else if (strcasecmp(arg, "dns") == 0) { + d->use_canonical_name = USE_CANONICAL_NAME_DNS; + } + else { + return "parameter must be 'on', 'off', or 'dns'"; + } + + return NULL; +} + + +static const char *include_config (cmd_parms *cmd, void *dummy, + const char *name) +{ + ap_directive_t *conftree = NULL; + const char* conffile; + unsigned *recursion; + void *data; + + apr_pool_userdata_get(&data, "ap_include_sentinel", cmd->pool); + if (data) { + recursion = data; + } + else { + data = recursion = apr_palloc(cmd->pool, sizeof(*recursion)); + *recursion = 0; + apr_pool_userdata_setn(data, "ap_include_sentinel", NULL, cmd->pool); + } + + if (++*recursion > AP_MAX_INCLUDE_DEPTH) { + *recursion = 0; + return apr_psprintf(cmd->pool, "Exceeded maximum include depth of %u. " + "You have probably a recursion somewhere.", + AP_MAX_INCLUDE_DEPTH); + } + + conffile = ap_server_root_relative(cmd->pool, name); + if (!conffile) { + *recursion = 0; + return apr_pstrcat(cmd->pool, "Invalid Include path ", + name, NULL); + } + + ap_process_resource_config(cmd->server, conffile, + &conftree, cmd->pool, cmd->temp_pool); + *(ap_directive_t **)dummy = conftree; + + /* recursion level done */ + if (*recursion) { + --*recursion; + } + + return NULL; +} + +static const char *set_loglevel(cmd_parms *cmd, void *dummy, const char *arg) +{ + char *str; + + const char *err = ap_check_cmd_context(cmd, + NOT_IN_DIR_LOC_FILE|NOT_IN_LIMIT); + if (err != NULL) { + return err; + } + + if ((str = ap_getword_conf(cmd->pool, &arg))) { + if (!strcasecmp(str, "emerg")) { + cmd->server->loglevel = APLOG_EMERG; + } + else if (!strcasecmp(str, "alert")) { + cmd->server->loglevel = APLOG_ALERT; + } + else if (!strcasecmp(str, "crit")) { + cmd->server->loglevel = APLOG_CRIT; + } + else if (!strcasecmp(str, "error")) { + cmd->server->loglevel = APLOG_ERR; + } + else if (!strcasecmp(str, "warn")) { + cmd->server->loglevel = APLOG_WARNING; + } + else if (!strcasecmp(str, "notice")) { + cmd->server->loglevel = APLOG_NOTICE; + } + else if (!strcasecmp(str, "info")) { + cmd->server->loglevel = APLOG_INFO; + } + else if (!strcasecmp(str, "debug")) { + cmd->server->loglevel = APLOG_DEBUG; + } + else { + return "LogLevel requires level keyword: one of " + "emerg/alert/crit/error/warn/notice/info/debug"; + } + } + else { + return "LogLevel requires level keyword"; + } + + return NULL; +} + +AP_DECLARE(const char *) ap_psignature(const char *prefix, request_rec *r) +{ + char sport[20]; + core_dir_config *conf; + + conf = (core_dir_config *)ap_get_module_config(r->per_dir_config, + &core_module); + if ((conf->server_signature == srv_sig_off) + || (conf->server_signature == srv_sig_unset)) { + return ""; + } + + apr_snprintf(sport, sizeof sport, "%u", (unsigned) ap_get_server_port(r)); + + if (conf->server_signature == srv_sig_withmail) { + return apr_pstrcat(r->pool, prefix, "\n", NULL); + } + + return apr_pstrcat(r->pool, prefix, "
    ", ap_get_server_version(), + " Server at ", + ap_escape_html(r->pool, ap_get_server_name(r)), + " Port ", sport, + "
    \n", NULL); +} + +/* + * Load an authorisation realm into our location configuration, applying the + * usual rules that apply to realms. + */ +static const char *set_authname(cmd_parms *cmd, void *mconfig, + const char *word1) +{ + core_dir_config *aconfig = (core_dir_config *)mconfig; + + aconfig->ap_auth_name = ap_escape_quotes(cmd->pool, word1); + return NULL; +} + +#ifdef _OSD_POSIX /* BS2000 Logon Passwd file */ +static const char *set_bs2000_account(cmd_parms *cmd, void *dummy, char *name) +{ + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + return os_set_account(cmd->pool, name); +} +#endif /*_OSD_POSIX*/ + +/* + * Handle a request to include the server's OS platform in the Server + * response header field (the ServerTokens directive). Unfortunately + * this requires a new global in order to communicate the setting back to + * http_main so it can insert the information in the right place in the + * string. + */ + +static char *server_version = NULL; +static int version_locked = 0; + +enum server_token_type { + SrvTk_MAJOR, /* eg: Apache/2 */ + SrvTk_MINOR, /* eg. Apache/2.0 */ + SrvTk_MINIMAL, /* eg: Apache/2.0.41 */ + SrvTk_OS, /* eg: Apache/2.0.41 (UNIX) */ + SrvTk_FULL, /* eg: Apache/2.0.41 (UNIX) PHP/4.2.2 FooBar/1.2b */ + SrvTk_PRODUCT_ONLY /* eg: Apache */ +}; +static enum server_token_type ap_server_tokens = SrvTk_FULL; + +static apr_status_t reset_version(void *dummy) +{ + version_locked = 0; + ap_server_tokens = SrvTk_FULL; + server_version = NULL; + return APR_SUCCESS; +} + +AP_DECLARE(void) ap_get_server_revision(ap_version_t *version) +{ + version->major = AP_SERVER_MAJORVERSION_NUMBER; + version->minor = AP_SERVER_MINORVERSION_NUMBER; + version->patch = AP_SERVER_PATCHLEVEL_NUMBER; + version->add_string = AP_SERVER_ADD_STRING; +} + +AP_DECLARE(const char *) ap_get_server_version(void) +{ + return (server_version ? server_version : AP_SERVER_BASEVERSION); +} + +AP_DECLARE(void) ap_add_version_component(apr_pool_t *pconf, const char *component) +{ + if (! version_locked) { + /* + * If the version string is null, register our cleanup to reset the + * pointer on pool destruction. We also know that, if NULL, + * we are adding the original SERVER_BASEVERSION string. + */ + if (server_version == NULL) { + apr_pool_cleanup_register(pconf, NULL, reset_version, + apr_pool_cleanup_null); + server_version = apr_pstrdup(pconf, component); + } + else { + /* + * Tack the given component identifier to the end of + * the existing string. + */ + server_version = apr_pstrcat(pconf, server_version, " ", + component, NULL); + } + } +} + +/* + * This routine adds the real server base identity to the version string, + * and then locks out changes until the next reconfig. + */ +static void ap_set_version(apr_pool_t *pconf) +{ + if (ap_server_tokens == SrvTk_PRODUCT_ONLY) { + ap_add_version_component(pconf, AP_SERVER_BASEPRODUCT); + } + else if (ap_server_tokens == SrvTk_MINIMAL) { + ap_add_version_component(pconf, AP_SERVER_BASEVERSION); + } + else if (ap_server_tokens == SrvTk_MINOR) { + ap_add_version_component(pconf, AP_SERVER_BASEPRODUCT "/" AP_SERVER_MINORREVISION); + } + else if (ap_server_tokens == SrvTk_MAJOR) { + ap_add_version_component(pconf, AP_SERVER_BASEPRODUCT "/" AP_SERVER_MAJORVERSION); + } + else { + ap_add_version_component(pconf, AP_SERVER_BASEVERSION " (" PLATFORM ")"); + } + + /* + * Lock the server_version string if we're not displaying + * the full set of tokens + */ + if (ap_server_tokens != SrvTk_FULL) { + version_locked++; + } +} + +static const char *set_serv_tokens(cmd_parms *cmd, void *dummy, + const char *arg) +{ + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + + if (err != NULL) { + return err; + } + + if (!strcasecmp(arg, "OS")) { + ap_server_tokens = SrvTk_OS; + } + else if (!strcasecmp(arg, "Min") || !strcasecmp(arg, "Minimal")) { + ap_server_tokens = SrvTk_MINIMAL; + } + else if (!strcasecmp(arg, "Major")) { + ap_server_tokens = SrvTk_MAJOR; + } + else if (!strcasecmp(arg, "Minor") ) { + ap_server_tokens = SrvTk_MINOR; + } + else if (!strcasecmp(arg, "Prod") || !strcasecmp(arg, "ProductOnly")) { + ap_server_tokens = SrvTk_PRODUCT_ONLY; + } + else { + ap_server_tokens = SrvTk_FULL; + } + + return NULL; +} + +static const char *set_limit_req_line(cmd_parms *cmd, void *dummy, + const char *arg) +{ + const char *err = ap_check_cmd_context(cmd, + NOT_IN_DIR_LOC_FILE|NOT_IN_LIMIT); + int lim; + + if (err != NULL) { + return err; + } + + lim = atoi(arg); + if (lim < 0) { + return apr_pstrcat(cmd->temp_pool, "LimitRequestLine \"", arg, + "\" must be a non-negative integer", NULL); + } + + cmd->server->limit_req_line = lim; + return NULL; +} + +static const char *set_limit_req_fieldsize(cmd_parms *cmd, void *dummy, + const char *arg) +{ + const char *err = ap_check_cmd_context(cmd, + NOT_IN_DIR_LOC_FILE|NOT_IN_LIMIT); + int lim; + + if (err != NULL) { + return err; + } + + lim = atoi(arg); + if (lim < 0) { + return apr_pstrcat(cmd->temp_pool, "LimitRequestFieldsize \"", arg, + "\" must be a non-negative integer", + NULL); + } + + cmd->server->limit_req_fieldsize = lim; + return NULL; +} + +static const char *set_limit_req_fields(cmd_parms *cmd, void *dummy, + const char *arg) +{ + const char *err = ap_check_cmd_context(cmd, + NOT_IN_DIR_LOC_FILE|NOT_IN_LIMIT); + int lim; + + if (err != NULL) { + return err; + } + + lim = atoi(arg); + if (lim < 0) { + return apr_pstrcat(cmd->temp_pool, "LimitRequestFields \"", arg, + "\" must be a non-negative integer (0 = no limit)", + NULL); + } + + cmd->server->limit_req_fields = lim; + return NULL; +} + +static const char *set_limit_req_body(cmd_parms *cmd, void *conf_, + const char *arg) +{ + core_dir_config *conf = conf_; + const char *err = ap_check_cmd_context(cmd, NOT_IN_LIMIT); + char *errp; + + if (err != NULL) { + return err; + } + + /* WTF: If strtoul is not portable, then write a replacement. + * Instead we have an idiotic define in httpd.h that prevents + * it from being used even when it is available. Sheesh. + */ + conf->limit_req_body = (apr_off_t)strtol(arg, &errp, 10); + if (*errp != '\0') { + return "LimitRequestBody requires a non-negative integer."; + } + + return NULL; +} + +static const char *set_limit_xml_req_body(cmd_parms *cmd, void *conf_, + const char *arg) +{ + core_dir_config *conf = conf_; + const char *err = ap_check_cmd_context(cmd, NOT_IN_LIMIT); + + if (err != NULL) { + return err; + } + + conf->limit_xml_body = atol(arg); + if (conf->limit_xml_body < 0) + return "LimitXMLRequestBody requires a non-negative integer."; + + return NULL; +} + +AP_DECLARE(size_t) ap_get_limit_xml_body(const request_rec *r) +{ + core_dir_config *conf; + + conf = ap_get_module_config(r->per_dir_config, &core_module); + if (conf->limit_xml_body == AP_LIMIT_UNSET) + return AP_DEFAULT_LIMIT_XML_BODY; + + return (size_t)conf->limit_xml_body; +} + +#if !defined (RLIMIT_CPU) || !(defined (RLIMIT_DATA) || defined (RLIMIT_VMEM) || defined(RLIMIT_AS)) || !defined (RLIMIT_NPROC) +static const char *no_set_limit(cmd_parms *cmd, void *conf_, + const char *arg, const char *arg2) +{ + ap_log_error(APLOG_MARK, APLOG_ERR, 0, cmd->server, + "%s not supported on this platform", cmd->cmd->name); + + return NULL; +} +#endif + +#ifdef RLIMIT_CPU +static const char *set_limit_cpu(cmd_parms *cmd, void *conf_, + const char *arg, const char *arg2) +{ + core_dir_config *conf = conf_; + + unixd_set_rlimit(cmd, &conf->limit_cpu, arg, arg2, RLIMIT_CPU); + return NULL; +} +#endif + +#if defined (RLIMIT_DATA) || defined (RLIMIT_VMEM) || defined(RLIMIT_AS) +static const char *set_limit_mem(cmd_parms *cmd, void *conf_, + const char *arg, const char * arg2) +{ + core_dir_config *conf = conf_; + +#if defined(RLIMIT_AS) + unixd_set_rlimit(cmd, &conf->limit_mem, arg, arg2 ,RLIMIT_AS); +#elif defined(RLIMIT_DATA) + unixd_set_rlimit(cmd, &conf->limit_mem, arg, arg2, RLIMIT_DATA); +#elif defined(RLIMIT_VMEM) + unixd_set_rlimit(cmd, &conf->limit_mem, arg, arg2, RLIMIT_VMEM); +#endif + + return NULL; +} +#endif + +#ifdef RLIMIT_NPROC +static const char *set_limit_nproc(cmd_parms *cmd, void *conf_, + const char *arg, const char * arg2) +{ + core_dir_config *conf = conf_; + + unixd_set_rlimit(cmd, &conf->limit_nproc, arg, arg2, RLIMIT_NPROC); + return NULL; +} +#endif + +static const char *set_recursion_limit(cmd_parms *cmd, void *dummy, + const char *arg1, const char *arg2) +{ + core_server_config *conf = ap_get_module_config(cmd->server->module_config, + &core_module); + int limit = atoi(arg1); + + if (limit <= 0) { + return "The recursion limit must be greater than zero."; + } + if (limit < 4) { + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, cmd->server, + "Limiting internal redirects to very low numbers may " + "cause normal requests to fail."); + } + + conf->redirect_limit = limit; + + if (arg2) { + limit = atoi(arg2); + + if (limit <= 0) { + return "The recursion limit must be greater than zero."; + } + if (limit < 4) { + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, cmd->server, + "Limiting the subrequest depth to a very low level may" + " cause normal requests to fail."); + } + } + + conf->subreq_limit = limit; + + return NULL; +} + +static void log_backtrace(const request_rec *r) +{ + const request_rec *top = r; + + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, + "r->uri = %s", r->uri ? r->uri : "(unexpectedly NULL)"); + + while (top && (top->prev || top->main)) { + if (top->prev) { + top = top->prev; + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, + "redirected from r->uri = %s", + top->uri ? top->uri : "(unexpectedly NULL)"); + } + + if (!top->prev && top->main) { + top = top->main; + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, + "subrequested from r->uri = %s", + top->uri ? top->uri : "(unexpectedly NULL)"); + } + } +} + +/* + * check whether redirect limit is reached + */ +AP_DECLARE(int) ap_is_recursion_limit_exceeded(const request_rec *r) +{ + core_server_config *conf = ap_get_module_config(r->server->module_config, + &core_module); + const request_rec *top = r; + int redirects = 0, subreqs = 0; + int rlimit = conf->redirect_limit + ? conf->redirect_limit + : AP_DEFAULT_MAX_INTERNAL_REDIRECTS; + int slimit = conf->subreq_limit + ? conf->subreq_limit + : AP_DEFAULT_MAX_SUBREQ_DEPTH; + + + while (top->prev || top->main) { + if (top->prev) { + if (++redirects >= rlimit) { + /* uuh, too much. */ + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Request exceeded the limit of %d internal " + "redirects due to probable configuration error. " + "Use 'LimitInternalRecursion' to increase the " + "limit if necessary. Use 'LogLevel debug' to get " + "a backtrace.", rlimit); + + /* post backtrace */ + log_backtrace(r); + + /* return failure */ + return 1; + } + + top = top->prev; + } + + if (!top->prev && top->main) { + if (++subreqs >= slimit) { + /* uuh, too much. */ + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Request exceeded the limit of %d subrequest " + "nesting levels due to probable confguration " + "error. Use 'LimitInternalRecursion' to increase " + "the limit if necessary. Use 'LogLevel debug' to " + "get a backtrace.", slimit); + + /* post backtrace */ + log_backtrace(r); + + /* return failure */ + return 1; + } + + top = top->main; + } + } + + /* recursion state: ok */ + return 0; +} + +static const char *add_ct_output_filters(cmd_parms *cmd, void *conf_, + const char *arg, const char *arg2) +{ + core_dir_config *conf = conf_; + ap_filter_rec_t *old, *new = NULL; + const char *filter_name; + + if (!conf->ct_output_filters) { + conf->ct_output_filters = apr_hash_make(cmd->pool); + old = NULL; + } + else { + old = (ap_filter_rec_t*) apr_hash_get(conf->ct_output_filters, arg2, + APR_HASH_KEY_STRING); + } + + while (*arg && + (filter_name = ap_getword(cmd->pool, &arg, ';')) && + strcmp(filter_name, "")) { + new = apr_pcalloc(cmd->pool, sizeof(ap_filter_rec_t)); + new->name = filter_name; + + /* We found something, so let's append it. */ + if (old) { + new->next = old; + } + old = new; + } + + if (!new) { + return "invalid filter name"; + } + + apr_hash_set(conf->ct_output_filters, arg2, APR_HASH_KEY_STRING, new); + + return NULL; +} +/* + * Insert filters requested by the AddOutputFilterByType + * configuration directive. We cannot add filters based + * on content-type until after the handler has started + * to run. Only then do we reliably know the content-type. + */ +void ap_add_output_filters_by_type(request_rec *r) +{ + core_dir_config *conf; + const char *ctype, *ctypes; + + conf = (core_dir_config *)ap_get_module_config(r->per_dir_config, + &core_module); + + /* We can't do anything with proxy requests, no content-types or if + * we don't have a filter configured. + */ + if (r->proxyreq != PROXYREQ_NONE || !r->content_type || + !conf->ct_output_filters) { + return; + } + + ctypes = r->content_type; + + /* We must be able to handle decorated content-types. */ + while (*ctypes && (ctype = ap_getword(r->pool, &ctypes, ';'))) { + ap_filter_rec_t *ct_filter; + ct_filter = apr_hash_get(conf->ct_output_filters, ctype, + APR_HASH_KEY_STRING); + while (ct_filter) { + ap_add_output_filter(ct_filter->name, NULL, r, r->connection); + ct_filter = ct_filter->next; + } + } + + return; +} + +static apr_status_t writev_it_all(apr_socket_t *s, + struct iovec *vec, int nvec, + apr_size_t len, apr_size_t *nbytes) +{ + apr_size_t bytes_written = 0; + apr_status_t rv; + apr_size_t n = len; + int i = 0; + + *nbytes = 0; + + /* XXX handle checking for non-blocking socket */ + while (bytes_written != len) { + rv = apr_sendv(s, vec + i, nvec - i, &n); + bytes_written += n; + if (rv != APR_SUCCESS) + return rv; + + *nbytes += n; + + /* If the write did not complete, adjust the iovecs and issue + * apr_sendv again + */ + if (bytes_written < len) { + /* Skip over the vectors that have already been written */ + apr_size_t cnt = vec[i].iov_len; + while (n >= cnt && i + 1 < nvec) { + i++; + cnt += vec[i].iov_len; + } + + if (n < cnt) { + /* Handle partial write of vec i */ + vec[i].iov_base = (char *) vec[i].iov_base + + (vec[i].iov_len - (cnt - n)); + vec[i].iov_len = cnt -n; + } + } + + n = len - bytes_written; + } + + return APR_SUCCESS; +} + +/* sendfile_it_all() + * send the entire file using sendfile() + * handle partial writes + * return only when all bytes have been sent or an error is encountered. + */ + +#if APR_HAS_SENDFILE +static apr_status_t sendfile_it_all(core_net_rec *c, + apr_file_t *fd, + apr_hdtr_t *hdtr, + apr_off_t file_offset, + apr_size_t file_bytes_left, + apr_size_t total_bytes_left, + apr_size_t *bytes_sent, + apr_int32_t flags) +{ + apr_status_t rv; +#ifdef AP_DEBUG + apr_interval_time_t timeout = 0; +#endif + + AP_DEBUG_ASSERT((apr_socket_timeout_get(c->client_socket, &timeout) + == APR_SUCCESS) + && timeout > 0); /* socket must be in timeout mode */ + + /* Reset the bytes_sent field */ + *bytes_sent = 0; + + do { + apr_size_t tmplen = file_bytes_left; + + rv = apr_sendfile(c->client_socket, fd, hdtr, &file_offset, &tmplen, + flags); + *bytes_sent += tmplen; + total_bytes_left -= tmplen; + if (!total_bytes_left || rv != APR_SUCCESS) { + return rv; /* normal case & error exit */ + } + + AP_DEBUG_ASSERT(total_bytes_left > 0 && tmplen > 0); + + /* partial write, oooh noooo... + * Skip over any header data which was written + */ + while (tmplen && hdtr->numheaders) { + if (tmplen >= hdtr->headers[0].iov_len) { + tmplen -= hdtr->headers[0].iov_len; + --hdtr->numheaders; + ++hdtr->headers; + } + else { + char *iov_base = (char *)hdtr->headers[0].iov_base; + + hdtr->headers[0].iov_len -= tmplen; + iov_base += tmplen; + hdtr->headers[0].iov_base = iov_base; + tmplen = 0; + } + } + + /* Skip over any file data which was written */ + + if (tmplen <= file_bytes_left) { + file_offset += tmplen; + file_bytes_left -= tmplen; + continue; + } + + tmplen -= file_bytes_left; + file_bytes_left = 0; + file_offset = 0; + + /* Skip over any trailer data which was written */ + + while (tmplen && hdtr->numtrailers) { + if (tmplen >= hdtr->trailers[0].iov_len) { + tmplen -= hdtr->trailers[0].iov_len; + --hdtr->numtrailers; + ++hdtr->trailers; + } + else { + char *iov_base = (char *)hdtr->trailers[0].iov_base; + + hdtr->trailers[0].iov_len -= tmplen; + iov_base += tmplen; + hdtr->trailers[0].iov_base = iov_base; + tmplen = 0; + } + } + } while (1); +} +#endif + +/* + * emulate_sendfile() + * Sends the contents of file fd along with header/trailer bytes, if any, + * to the network. emulate_sendfile will return only when all the bytes have been + * sent (i.e., it handles partial writes) or on a network error condition. + */ +static apr_status_t emulate_sendfile(core_net_rec *c, apr_file_t *fd, + apr_hdtr_t *hdtr, apr_off_t offset, + apr_size_t length, apr_size_t *nbytes) +{ + apr_status_t rv = APR_SUCCESS; + apr_int32_t togo; /* Remaining number of bytes in the file to send */ + apr_size_t sendlen = 0; + apr_size_t bytes_sent; + apr_int32_t i; + apr_off_t o; /* Track the file offset for partial writes */ + char buffer[8192]; + + *nbytes = 0; + + /* Send the headers + * writev_it_all handles partial writes. + * XXX: optimization... if headers are less than MIN_WRITE_SIZE, copy + * them into buffer + */ + if (hdtr && hdtr->numheaders > 0 ) { + for (i = 0; i < hdtr->numheaders; i++) { + sendlen += hdtr->headers[i].iov_len; + } + + rv = writev_it_all(c->client_socket, hdtr->headers, hdtr->numheaders, + sendlen, &bytes_sent); + if (rv == APR_SUCCESS) + *nbytes += bytes_sent; /* track total bytes sent */ + } + + /* Seek the file to 'offset' */ + if (offset >= 0 && rv == APR_SUCCESS) { + rv = apr_file_seek(fd, APR_SET, &offset); + } + + /* Send the file, making sure to handle partial writes */ + togo = length; + while (rv == APR_SUCCESS && togo) { + sendlen = togo > sizeof(buffer) ? sizeof(buffer) : togo; + o = 0; + rv = apr_file_read(fd, buffer, &sendlen); + while (rv == APR_SUCCESS && sendlen) { + bytes_sent = sendlen; + rv = apr_send(c->client_socket, &buffer[o], &bytes_sent); + if (rv == APR_SUCCESS) { + sendlen -= bytes_sent; /* sendlen != bytes_sent ==> partial write */ + o += bytes_sent; /* o is where we are in the buffer */ + *nbytes += bytes_sent; + togo -= bytes_sent; /* track how much of the file we've sent */ + } + } + } + + /* Send the trailers + * XXX: optimization... if it will fit, send this on the last send in the + * loop above + */ + sendlen = 0; + if ( rv == APR_SUCCESS && hdtr && hdtr->numtrailers > 0 ) { + for (i = 0; i < hdtr->numtrailers; i++) { + sendlen += hdtr->trailers[i].iov_len; + } + rv = writev_it_all(c->client_socket, hdtr->trailers, hdtr->numtrailers, + sendlen, &bytes_sent); + if (rv == APR_SUCCESS) + *nbytes += bytes_sent; + } + + return rv; +} + +static const char *set_trace_enable(cmd_parms *cmd, void *dummy, + const char *arg1) +{ + core_server_config *conf = ap_get_module_config(cmd->server->module_config, + &core_module); + + if (strcasecmp(arg1, "on") == 0) { + conf->trace_enable = AP_TRACE_ENABLE; + } + else if (strcasecmp(arg1, "off") == 0) { + conf->trace_enable = AP_TRACE_DISABLE; + } + else if (strcasecmp(arg1, "extended") == 0) { + conf->trace_enable = AP_TRACE_EXTENDED; + } + else { + return "TraceEnable must be one of 'on', 'off', or 'extended'"; + } + + return NULL; +} + +/* Note --- ErrorDocument will now work from .htaccess files. + * The AllowOverride of Fileinfo allows webmasters to turn it off + */ + +static const command_rec core_cmds[] = { + +/* Old access config file commands */ + +AP_INIT_RAW_ARGS("server->module_config; + core_server_config *conf = ap_get_module_config(sconf, &core_module); + + /* XXX this seems too specific, this should probably become + * some general-case test + */ + if (r->proxyreq) { + return HTTP_FORBIDDEN; + } + if (!r->uri || ((r->uri[0] != '/') && strcmp(r->uri, "*"))) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Invalid URI in request %s", r->the_request); + return HTTP_BAD_REQUEST; + } + + if (r->server->path + && !strncmp(r->uri, r->server->path, r->server->pathlen) + && (r->server->path[r->server->pathlen - 1] == '/' + || r->uri[r->server->pathlen] == '/' + || r->uri[r->server->pathlen] == '\0')) + { + /* skip all leading /'s (e.g. http://localhost///foo) + * so we are looking at only the relative path. + */ + char *path = r->uri + r->server->pathlen; + while (*path == '/') { + ++path; + } + if (apr_filepath_merge(&r->filename, conf->ap_document_root, path, + APR_FILEPATH_TRUENAME + | APR_FILEPATH_SECUREROOT, r->pool) + != APR_SUCCESS) { + return HTTP_FORBIDDEN; + } + r->canonical_filename = r->filename; + } + else { + /* + * Make sure that we do not mess up the translation by adding two + * /'s in a row. This happens under windows when the document + * root ends with a / + */ + /* skip all leading /'s (e.g. http://localhost///foo) + * so we are looking at only the relative path. + */ + char *path = r->uri; + while (*path == '/') { + ++path; + } + if (apr_filepath_merge(&r->filename, conf->ap_document_root, path, + APR_FILEPATH_TRUENAME + | APR_FILEPATH_SECUREROOT, r->pool) + != APR_SUCCESS) { + return HTTP_FORBIDDEN; + } + r->canonical_filename = r->filename; + } + + return OK; +} + +/***************************************************************** + * + * Test the filesystem name through directory_walk and file_walk + */ +static int core_map_to_storage(request_rec *r) +{ + int access_status; + + if ((access_status = ap_directory_walk(r))) { + return access_status; + } + + if ((access_status = ap_file_walk(r))) { + return access_status; + } + + return OK; +} + + +static int do_nothing(request_rec *r) { return OK; } + + +static int core_override_type(request_rec *r) +{ + core_dir_config *conf = + (core_dir_config *)ap_get_module_config(r->per_dir_config, + &core_module); + + /* Check for overrides with ForceType / SetHandler + */ + if (conf->mime_type && strcmp(conf->mime_type, "none")) + ap_set_content_type(r, (char*) conf->mime_type); + + if (conf->handler && strcmp(conf->handler, "none")) + r->handler = conf->handler; + + /* Deal with the poor soul who is trying to force path_info to be + * accepted within the core_handler, where they will let the subreq + * address its contents. This is toggled by the user in the very + * beginning of the fixup phase, so modules should override the user's + * discretion in their own module fixup phase. It is tristate, if + * the user doesn't specify, the result is 2 (which the module may + * interpret to its own customary behavior.) It won't be touched + * if the value is no longer undefined (2), so any module changing + * the value prior to the fixup phase OVERRIDES the user's choice. + */ + if ((r->used_path_info == AP_REQ_DEFAULT_PATH_INFO) + && (conf->accept_path_info != 3)) { + r->used_path_info = conf->accept_path_info; + } + + return OK; +} + + + +static int default_handler(request_rec *r) +{ + conn_rec *c = r->connection; + apr_bucket_brigade *bb; + apr_bucket *e; + core_dir_config *d; + int errstatus; + apr_file_t *fd = NULL; + apr_status_t status; + /* XXX if/when somebody writes a content-md5 filter we either need to + * remove this support or coordinate when to use the filter vs. + * when to use this code + * The current choice of when to compute the md5 here matches the 1.3 + * support fairly closely (unlike 1.3, we don't handle computing md5 + * when the charset is translated). + */ + int bld_content_md5; + + d = (core_dir_config *)ap_get_module_config(r->per_dir_config, + &core_module); + bld_content_md5 = (d->content_md5 & 1) + && r->output_filters->frec->ftype != AP_FTYPE_RESOURCE; + + ap_allow_standard_methods(r, MERGE_ALLOW, M_GET, M_OPTIONS, M_POST, -1); + + /* If filters intend to consume the request body, they must + * register an InputFilter to slurp the contents of the POST + * data from the POST input stream. It no longer exists when + * the output filters are invoked by the default handler. + */ + if ((errstatus = ap_discard_request_body(r)) != OK) { + return errstatus; + } + + if (r->method_number == M_GET || r->method_number == M_POST) { + if (r->finfo.filetype == 0) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "File does not exist: %s", r->filename); + return HTTP_NOT_FOUND; + } + + /* Don't try to serve a dir. Some OSs do weird things with + * raw I/O on a dir. + */ + if (r->finfo.filetype == APR_DIR) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Attempt to serve directory: %s", r->filename); + return HTTP_NOT_FOUND; + } + + if ((r->used_path_info != AP_REQ_ACCEPT_PATH_INFO) && + r->path_info && *r->path_info) + { + /* default to reject */ + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "File does not exist: %s", + apr_pstrcat(r->pool, r->filename, r->path_info, NULL)); + return HTTP_NOT_FOUND; + } + + /* We understood the (non-GET) method, but it might not be legal for + this particular resource. Check to see if the 'deliver_script' + flag is set. If so, then we go ahead and deliver the file since + it isn't really content (only GET normally returns content). + + Note: based on logic further above, the only possible non-GET + method at this point is POST. In the future, we should enable + script delivery for all methods. */ + if (r->method_number != M_GET) { + core_request_config *req_cfg; + + req_cfg = ap_get_module_config(r->request_config, &core_module); + if (!req_cfg->deliver_script) { + /* The flag hasn't been set for this request. Punt. */ + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "This resource does not accept the %s method.", + r->method); + return HTTP_METHOD_NOT_ALLOWED; + } + } + + + if ((status = apr_file_open(&fd, r->filename, APR_READ | APR_BINARY +#if APR_HAS_SENDFILE + | ((d->enable_sendfile == ENABLE_SENDFILE_OFF) + ? 0 : APR_SENDFILE_ENABLED) +#endif + , 0, r->pool)) != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, status, r, + "file permissions deny server access: %s", r->filename); + return HTTP_FORBIDDEN; + } + + ap_update_mtime(r, r->finfo.mtime); + ap_set_last_modified(r); + ap_set_etag(r); + apr_table_setn(r->headers_out, "Accept-Ranges", "bytes"); + ap_set_content_length(r, r->finfo.size); + if ((errstatus = ap_meets_conditions(r)) != OK) { + apr_file_close(fd); + return errstatus; + } + + if (bld_content_md5) { + apr_table_setn(r->headers_out, "Content-MD5", + ap_md5digest(r->pool, fd)); + } + + bb = apr_brigade_create(r->pool, c->bucket_alloc); + + /* For platforms where the size of the file may be larger than + * that which can be stored in a single bucket (whether the + * length field is an apr_size_t), split it into several + * buckets */ + if (sizeof(apr_off_t) > sizeof(apr_size_t) + && r->finfo.size > AP_MAX_SENDFILE) { + apr_off_t fsize = r->finfo.size; + e = apr_bucket_file_create(fd, 0, AP_MAX_SENDFILE, r->pool, + c->bucket_alloc); + while (fsize > AP_MAX_SENDFILE) { + apr_bucket *ce; + apr_bucket_copy(e, &ce); + APR_BRIGADE_INSERT_TAIL(bb, ce); + e->start += AP_MAX_SENDFILE; + fsize -= AP_MAX_SENDFILE; + } + e->length = (apr_size_t)fsize; /* Resize just the last bucket */ + } + else + e = apr_bucket_file_create(fd, 0, (apr_size_t)r->finfo.size, + r->pool, c->bucket_alloc); + +#if APR_HAS_MMAP + if (d->enable_mmap == ENABLE_MMAP_OFF) { + (void)apr_bucket_file_enable_mmap(e, 0); + } +#endif + APR_BRIGADE_INSERT_TAIL(bb, e); + e = apr_bucket_eos_create(c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, e); + + status = ap_pass_brigade(r->output_filters, bb); + if (status == APR_SUCCESS + || r->status != HTTP_OK + || c->aborted) { + return OK; /* r->status will be respected */ + } + else { + /* no way to know what type of error occurred */ + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, status, r, + "default_handler: ap_pass_brigade returned %i", + status); + return HTTP_INTERNAL_SERVER_ERROR; + } + } + else { /* unusual method (not GET or POST) */ + if (r->method_number == M_INVALID) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Invalid method in request %s", r->the_request); + return HTTP_NOT_IMPLEMENTED; + } + + if (r->method_number == M_OPTIONS) { + return ap_send_http_options(r); + } + return HTTP_METHOD_NOT_ALLOWED; + } +} + +typedef struct net_time_filter_ctx { + apr_socket_t *csd; + int first_line; +} net_time_filter_ctx_t; +static int net_time_filter(ap_filter_t *f, apr_bucket_brigade *b, + ap_input_mode_t mode, apr_read_type_e block, + apr_off_t readbytes) +{ + net_time_filter_ctx_t *ctx = f->ctx; + int keptalive = f->c->keepalive == AP_CONN_KEEPALIVE; + + if (!ctx) { + f->ctx = ctx = apr_palloc(f->r->pool, sizeof(*ctx)); + ctx->first_line = 1; + ctx->csd = ap_get_module_config(f->c->conn_config, &core_module); + } + + if (mode != AP_MODE_INIT && mode != AP_MODE_EATCRLF) { + if (keptalive && ctx->first_line) { + apr_socket_timeout_set(ctx->csd, + f->c->base_server->keep_alive_timeout); + ctx->first_line = 0; + } + else { + if (keptalive) { + apr_socket_timeout_set(ctx->csd, f->c->base_server->timeout); + } + } + } + return ap_get_brigade(f->next, b, mode, block, readbytes); +} + +/** + * Remove all zero length buckets from the brigade. + */ +#define BRIGADE_NORMALIZE(b) \ +do { \ + apr_bucket *e = APR_BRIGADE_FIRST(b); \ + do { \ + if (e->length == 0 && !APR_BUCKET_IS_METADATA(e)) { \ + apr_bucket *d; \ + d = APR_BUCKET_NEXT(e); \ + apr_bucket_delete(e); \ + e = d; \ + } \ + e = APR_BUCKET_NEXT(e); \ + } while (!APR_BRIGADE_EMPTY(b) && (e != APR_BRIGADE_SENTINEL(b))); \ +} while (0) + + +/** + * Split the contents of a brigade after bucket 'e' to an existing brigade + * + * XXXX: Should this function be added to APR-Util? + */ +static void brigade_move(apr_bucket_brigade *b, apr_bucket_brigade *a, + apr_bucket *e) +{ + apr_bucket *f; + + if (e != APR_BRIGADE_SENTINEL(b)) { + f = APR_RING_LAST(&b->list); + APR_RING_UNSPLICE(e, f, link); + APR_RING_SPLICE_HEAD(&a->list, e, f, apr_bucket, link); + } + + APR_BRIGADE_CHECK_CONSISTENCY(a); + APR_BRIGADE_CHECK_CONSISTENCY(b); +} + + +static int core_input_filter(ap_filter_t *f, apr_bucket_brigade *b, + ap_input_mode_t mode, apr_read_type_e block, + apr_off_t readbytes) +{ + apr_bucket *e; + apr_status_t rv; + core_net_rec *net = f->ctx; + core_ctx_t *ctx = net->in_ctx; + const char *str; + apr_size_t len; + + if (mode == AP_MODE_INIT) { + /* + * this mode is for filters that might need to 'initialize' + * a connection before reading request data from a client. + * NNTP over SSL for example needs to handshake before the + * server sends the welcome message. + * such filters would have changed the mode before this point + * is reached. however, protocol modules such as NNTP should + * not need to know anything about SSL. given the example, if + * SSL is not in the filter chain, AP_MODE_INIT is a noop. + */ + return APR_SUCCESS; + } + + if (!ctx) + { + ctx = apr_pcalloc(f->c->pool, sizeof(*ctx)); + ctx->b = apr_brigade_create(f->c->pool, f->c->bucket_alloc); + ctx->tmpbb = apr_brigade_create(ctx->b->p, ctx->b->bucket_alloc); + + /* seed the brigade with the client socket. */ + e = apr_bucket_socket_create(net->client_socket, f->c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(ctx->b, e); + net->in_ctx = ctx; + } + else if (APR_BRIGADE_EMPTY(ctx->b)) { + return APR_EOF; + } + + /* ### This is bad. */ + BRIGADE_NORMALIZE(ctx->b); + + /* check for empty brigade again *AFTER* BRIGADE_NORMALIZE() + * If we have lost our socket bucket (see above), we are EOF. + * + * Ideally, this should be returning SUCCESS with EOS bucket, but + * some higher-up APIs (spec. read_request_line via ap_rgetline) + * want an error code. */ + if (APR_BRIGADE_EMPTY(ctx->b)) { + return APR_EOF; + } + + if (mode == AP_MODE_GETLINE) { + /* we are reading a single LF line, e.g. the HTTP headers */ + rv = apr_brigade_split_line(b, ctx->b, block, HUGE_STRING_LEN); + /* We should treat EAGAIN here the same as we do for EOF (brigade is + * empty). We do this by returning whatever we have read. This may + * or may not be bogus, but is consistent (for now) with EOF logic. + */ + if (APR_STATUS_IS_EAGAIN(rv)) { + rv = APR_SUCCESS; + } + return rv; + } + + /* ### AP_MODE_PEEK is a horrific name for this mode because we also + * eat any CRLFs that we see. That's not the obvious intention of + * this mode. Determine whether anyone actually uses this or not. */ + if (mode == AP_MODE_EATCRLF) { + apr_bucket *e; + const char *c; + + /* The purpose of this loop is to ignore any CRLF (or LF) at the end + * of a request. Many browsers send extra lines at the end of POST + * requests. We use the PEEK method to determine if there is more + * data on the socket, so that we know if we should delay sending the + * end of one request until we have served the second request in a + * pipelined situation. We don't want to actually delay sending a + * response if the server finds a CRLF (or LF), becuause that doesn't + * mean that there is another request, just a blank line. + */ + while (1) { + if (APR_BRIGADE_EMPTY(ctx->b)) + return APR_EOF; + + e = APR_BRIGADE_FIRST(ctx->b); + + rv = apr_bucket_read(e, &str, &len, APR_NONBLOCK_READ); + + if (rv != APR_SUCCESS) + return rv; + + c = str; + while (c < str + len) { + if (*c == APR_ASCII_LF) + c++; + else if (*c == APR_ASCII_CR && *(c + 1) == APR_ASCII_LF) + c += 2; + else + return APR_SUCCESS; + } + + /* If we reach here, we were a bucket just full of CRLFs, so + * just toss the bucket. */ + /* FIXME: Is this the right thing to do in the core? */ + apr_bucket_delete(e); + } + return APR_SUCCESS; + } + + /* If mode is EXHAUSTIVE, we want to just read everything until the end + * of the brigade, which in this case means the end of the socket. + * To do this, we attach the brigade that has currently been setaside to + * the brigade that was passed down, and send that brigade back. + * + * NOTE: This is VERY dangerous to use, and should only be done with + * extreme caution. However, the Perchild MPM needs this feature + * if it is ever going to work correctly again. With this, the Perchild + * MPM can easily request the socket and all data that has been read, + * which means that it can pass it to the correct child process. + */ + if (mode == AP_MODE_EXHAUSTIVE) { + apr_bucket *e; + + /* Tack on any buckets that were set aside. */ + APR_BRIGADE_CONCAT(b, ctx->b); + + /* Since we've just added all potential buckets (which will most + * likely simply be the socket bucket) we know this is the end, + * so tack on an EOS too. */ + /* We have read until the brigade was empty, so we know that we + * must be EOS. */ + e = apr_bucket_eos_create(f->c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(b, e); + return APR_SUCCESS; + } + + /* read up to the amount they specified. */ + if (mode == AP_MODE_READBYTES || mode == AP_MODE_SPECULATIVE) { + apr_bucket *e; + + AP_DEBUG_ASSERT(readbytes > 0); + + e = APR_BRIGADE_FIRST(ctx->b); + rv = apr_bucket_read(e, &str, &len, block); + + if (APR_STATUS_IS_EAGAIN(rv)) { + return APR_SUCCESS; + } + else if (rv != APR_SUCCESS) { + return rv; + } + else if (block == APR_BLOCK_READ && len == 0) { + /* We wanted to read some bytes in blocking mode. We read + * 0 bytes. Hence, we now assume we are EOS. + * + * When we are in normal mode, return an EOS bucket to the + * caller. + * When we are in speculative mode, leave ctx->b empty, so + * that the next call returns an EOS bucket. + */ + apr_bucket_delete(e); + + if (mode == AP_MODE_READBYTES) { + e = apr_bucket_eos_create(f->c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(b, e); + } + return APR_SUCCESS; + } + + /* We can only return at most what we read. */ + if (len < readbytes) { + readbytes = len; + } + + rv = apr_brigade_partition(ctx->b, readbytes, &e); + if (rv != APR_SUCCESS) { + return rv; + } + + /* Must do move before CONCAT */ + brigade_move(ctx->b, ctx->tmpbb, e); + + if (mode == AP_MODE_READBYTES) { + APR_BRIGADE_CONCAT(b, ctx->b); + } + else if (mode == AP_MODE_SPECULATIVE) { + apr_bucket *copy_bucket; + APR_BRIGADE_FOREACH(e, ctx->b) { + rv = apr_bucket_copy(e, ©_bucket); + if (rv != APR_SUCCESS) { + return rv; + } + APR_BRIGADE_INSERT_TAIL(b, copy_bucket); + } + } + + /* Take what was originally there and place it back on ctx->b */ + APR_BRIGADE_CONCAT(ctx->b, ctx->tmpbb); + } + return APR_SUCCESS; +} + +/* Default filter. This filter should almost always be used. Its only job + * is to send the headers if they haven't already been sent, and then send + * the actual data. + */ +#define MAX_IOVEC_TO_WRITE 16 + +/* Optional function coming from mod_logio, used for logging of output + * traffic + */ +static APR_OPTIONAL_FN_TYPE(ap_logio_add_bytes_out) *logio_add_bytes_out; + +static apr_status_t core_output_filter(ap_filter_t *f, apr_bucket_brigade *b) +{ + apr_status_t rv; + apr_bucket_brigade *more; + conn_rec *c = f->c; + core_net_rec *net = f->ctx; + core_output_filter_ctx_t *ctx = net->out_ctx; + apr_read_type_e eblock = APR_NONBLOCK_READ; + apr_pool_t *input_pool = b->p; + + /* Fail quickly if the connection has already been aborted. */ + if (c->aborted) { + apr_brigade_cleanup(b); + return APR_ECONNABORTED; + } + + if (ctx == NULL) { + ctx = apr_pcalloc(c->pool, sizeof(*ctx)); + net->out_ctx = ctx; + } + + /* If we have a saved brigade, concatenate the new brigade to it */ + if (ctx->b) { + APR_BRIGADE_CONCAT(ctx->b, b); + b = ctx->b; + ctx->b = NULL; + } + + /* Perform multiple passes over the brigade, sending batches of output + to the connection. */ + while (b && !APR_BRIGADE_EMPTY(b)) { + apr_size_t nbytes = 0; + apr_bucket *last_e = NULL; /* initialized for debugging */ + apr_bucket *e; + + /* one group of iovecs per pass over the brigade */ + apr_size_t nvec = 0; + apr_size_t nvec_trailers = 0; + struct iovec vec[MAX_IOVEC_TO_WRITE]; + struct iovec vec_trailers[MAX_IOVEC_TO_WRITE]; + + /* one file per pass over the brigade */ + apr_file_t *fd = NULL; + apr_size_t flen = 0; + apr_off_t foffset = 0; + + /* keep track of buckets that we've concatenated + * to avoid small writes + */ + apr_bucket *last_merged_bucket = NULL; + + /* tail of brigade if we need another pass */ + more = NULL; + + /* Iterate over the brigade: collect iovecs and/or a file */ + APR_BRIGADE_FOREACH(e, b) { + /* keep track of the last bucket processed */ + last_e = e; + if (APR_BUCKET_IS_EOS(e) || AP_BUCKET_IS_EOC(e)) { + break; + } + else if (APR_BUCKET_IS_FLUSH(e)) { + if (e != APR_BRIGADE_LAST(b)) { + more = apr_brigade_split(b, APR_BUCKET_NEXT(e)); + } + break; + } + + /* It doesn't make any sense to use sendfile for a file bucket + * that represents 10 bytes. + */ + else if (APR_BUCKET_IS_FILE(e) + && (e->length >= AP_MIN_SENDFILE_BYTES)) { + apr_bucket_file *a = e->data; + + /* We can't handle more than one file bucket at a time + * so we split here and send the file we have already + * found. + */ + if (fd) { + more = apr_brigade_split(b, e); + break; + } + + fd = a->fd; + flen = e->length; + foffset = e->start; + } + else { + const char *str; + apr_size_t n; + + rv = apr_bucket_read(e, &str, &n, eblock); + if (APR_STATUS_IS_EAGAIN(rv)) { + /* send what we have so far since we shouldn't expect more + * output for a while... next time we read, block + */ + more = apr_brigade_split(b, e); + eblock = APR_BLOCK_READ; + break; + } + eblock = APR_NONBLOCK_READ; + if (n) { + if (!fd) { + if (nvec == MAX_IOVEC_TO_WRITE) { + /* woah! too many. buffer them up, for use later. */ + apr_bucket *temp, *next; + apr_bucket_brigade *temp_brig; + + if (nbytes >= AP_MIN_BYTES_TO_WRITE) { + /* We have enough data in the iovec + * to justify doing a writev + */ + more = apr_brigade_split(b, e); + break; + } + + /* Create a temporary brigade as a means + * of concatenating a bunch of buckets together + */ + if (last_merged_bucket) { + /* If we've concatenated together small + * buckets already in a previous pass, + * the initial buckets in this brigade + * are heap buckets that may have extra + * space left in them (because they + * were created by apr_brigade_write()). + * We can take advantage of this by + * building the new temp brigade out of + * these buckets, so that the content + * in them doesn't have to be copied again. + */ + apr_bucket_brigade *bb; + bb = apr_brigade_split(b, + APR_BUCKET_NEXT(last_merged_bucket)); + temp_brig = b; + b = bb; + } + else { + temp_brig = apr_brigade_create(f->c->pool, + f->c->bucket_alloc); + } + + temp = APR_BRIGADE_FIRST(b); + while (temp != e) { + apr_bucket *d; + rv = apr_bucket_read(temp, &str, &n, APR_BLOCK_READ); + apr_brigade_write(temp_brig, NULL, NULL, str, n); + d = temp; + temp = APR_BUCKET_NEXT(temp); + apr_bucket_delete(d); + } + + nvec = 0; + nbytes = 0; + temp = APR_BRIGADE_FIRST(temp_brig); + APR_BUCKET_REMOVE(temp); + APR_BRIGADE_INSERT_HEAD(b, temp); + apr_bucket_read(temp, &str, &n, APR_BLOCK_READ); + vec[nvec].iov_base = (char*) str; + vec[nvec].iov_len = n; + nvec++; + + /* Just in case the temporary brigade has + * multiple buckets, recover the rest of + * them and put them in the brigade that + * we're sending. + */ + for (next = APR_BRIGADE_FIRST(temp_brig); + next != APR_BRIGADE_SENTINEL(temp_brig); + next = APR_BRIGADE_FIRST(temp_brig)) { + APR_BUCKET_REMOVE(next); + APR_BUCKET_INSERT_AFTER(temp, next); + temp = next; + apr_bucket_read(next, &str, &n, + APR_BLOCK_READ); + vec[nvec].iov_base = (char*) str; + vec[nvec].iov_len = n; + nvec++; + } + + apr_brigade_destroy(temp_brig); + + last_merged_bucket = temp; + e = temp; + last_e = e; + } + else { + vec[nvec].iov_base = (char*) str; + vec[nvec].iov_len = n; + nvec++; + } + } + else { + /* The bucket is a trailer to a file bucket */ + + if (nvec_trailers == MAX_IOVEC_TO_WRITE) { + /* woah! too many. stop now. */ + more = apr_brigade_split(b, e); + break; + } + + vec_trailers[nvec_trailers].iov_base = (char*) str; + vec_trailers[nvec_trailers].iov_len = n; + nvec_trailers++; + } + + nbytes += n; + } + } + } + + + /* Completed iterating over the brigade, now determine if we want + * to buffer the brigade or send the brigade out on the network. + * + * Save if we haven't accumulated enough bytes to send, the connection + * is not about to be closed, and: + * + * 1) we didn't see a file, we don't have more passes over the + * brigade to perform, AND we didn't stop at a FLUSH bucket. + * (IOW, we will save plain old bytes such as HTTP headers) + * or + * 2) we hit the EOS and have a keep-alive connection + * (IOW, this response is a bit more complex, but we save it + * with the hope of concatenating with another response) + */ + if (nbytes + flen < AP_MIN_BYTES_TO_WRITE + && !AP_BUCKET_IS_EOC(last_e) + && ((!fd && !more && !APR_BUCKET_IS_FLUSH(last_e)) + || (APR_BUCKET_IS_EOS(last_e) + && c->keepalive == AP_CONN_KEEPALIVE))) { + + /* NEVER save an EOS in here. If we are saving a brigade with + * an EOS bucket, then we are doing keepalive connections, and + * we want to process to second request fully. + */ + if (APR_BUCKET_IS_EOS(last_e)) { + apr_bucket *bucket; + int file_bucket_saved = 0; + apr_bucket_delete(last_e); + for (bucket = APR_BRIGADE_FIRST(b); + bucket != APR_BRIGADE_SENTINEL(b); + bucket = APR_BUCKET_NEXT(bucket)) { + + /* Do a read on each bucket to pull in the + * data from pipe and socket buckets, so + * that we don't leave their file descriptors + * open indefinitely. Do the same for file + * buckets, with one exception: allow the + * first file bucket in the brigade to remain + * a file bucket, so that we don't end up + * doing an mmap+memcpy every time a client + * requests a <8KB file over a keepalive + * connection. + */ + if (APR_BUCKET_IS_FILE(bucket) && !file_bucket_saved) { + file_bucket_saved = 1; + } + else { + const char *buf; + apr_size_t len = 0; + rv = apr_bucket_read(bucket, &buf, &len, + APR_BLOCK_READ); + if (rv != APR_SUCCESS) { + ap_log_cerror(APLOG_MARK, APLOG_ERR, rv, + c, "core_output_filter:" + " Error reading from bucket."); + return HTTP_INTERNAL_SERVER_ERROR; + } + } + } + } + if (!ctx->deferred_write_pool) { + apr_pool_create(&ctx->deferred_write_pool, c->pool); + apr_pool_tag(ctx->deferred_write_pool, "deferred_write"); + } + ap_save_brigade(f, &ctx->b, &b, ctx->deferred_write_pool); + + return APR_SUCCESS; + } + + if (fd) { + apr_hdtr_t hdtr; + apr_size_t bytes_sent; + +#if APR_HAS_SENDFILE + apr_int32_t flags = 0; +#endif + + memset(&hdtr, '\0', sizeof(hdtr)); + if (nvec) { + hdtr.numheaders = nvec; + hdtr.headers = vec; + } + + if (nvec_trailers) { + hdtr.numtrailers = nvec_trailers; + hdtr.trailers = vec_trailers; + } + +#if APR_HAS_SENDFILE + if (apr_file_flags_get(fd) & APR_SENDFILE_ENABLED) { + + if (c->keepalive == AP_CONN_CLOSE && APR_BUCKET_IS_EOS(last_e)) { + /* Prepare the socket to be reused */ + flags |= APR_SENDFILE_DISCONNECT_SOCKET; + } + + rv = sendfile_it_all(net, /* the network information */ + fd, /* the file to send */ + &hdtr, /* header and trailer iovecs */ + foffset, /* offset in the file to begin + sending from */ + flen, /* length of file */ + nbytes + flen, /* total length including + headers */ + &bytes_sent, /* how many bytes were + sent */ + flags); /* apr_sendfile flags */ + + if (logio_add_bytes_out && bytes_sent > 0) + logio_add_bytes_out(c, bytes_sent); + } + else +#endif + { + rv = emulate_sendfile(net, fd, &hdtr, foffset, flen, + &bytes_sent); + + if (logio_add_bytes_out && bytes_sent > 0) + logio_add_bytes_out(c, bytes_sent); + } + + fd = NULL; + } + else { + apr_size_t bytes_sent; + + rv = writev_it_all(net->client_socket, + vec, nvec, + nbytes, &bytes_sent); + + if (logio_add_bytes_out && bytes_sent > 0) + logio_add_bytes_out(c, bytes_sent); + } + + apr_brigade_destroy(b); + + /* drive cleanups for resources which were set aside + * this may occur before or after termination of the request which + * created the resource + */ + if (ctx->deferred_write_pool) { + if (more && more->p == ctx->deferred_write_pool) { + /* "more" belongs to the deferred_write_pool, + * which is about to be cleared. + */ + if (APR_BRIGADE_EMPTY(more)) { + more = NULL; + } + else { + /* uh oh... change more's lifetime + * to the input brigade's lifetime + */ + apr_bucket_brigade *tmp_more = more; + more = NULL; + ap_save_brigade(f, &more, &tmp_more, input_pool); + } + } + apr_pool_clear(ctx->deferred_write_pool); + } + + if (rv != APR_SUCCESS) { + ap_log_cerror(APLOG_MARK, APLOG_INFO, rv, c, + "core_output_filter: writing data to the network"); + + if (more) + apr_brigade_destroy(more); + + /* No need to check for SUCCESS, we did that above. */ + if (!APR_STATUS_IS_EAGAIN(rv)) { + c->aborted = 1; + return APR_ECONNABORTED; + } + + return APR_SUCCESS; + } + + b = more; + more = NULL; + } /* end while () */ + + return APR_SUCCESS; +} + +static int core_post_config(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s) +{ + logio_add_bytes_out = APR_RETRIEVE_OPTIONAL_FN(ap_logio_add_bytes_out); + + ap_set_version(pconf); + ap_setup_make_content_type(pconf); + return OK; +} + +static void core_insert_filter(request_rec *r) +{ + core_dir_config *conf = (core_dir_config *) + ap_get_module_config(r->per_dir_config, + &core_module); + const char *filter, *filters = conf->output_filters; + + if (filters) { + while (*filters && (filter = ap_getword(r->pool, &filters, ';'))) { + ap_add_output_filter(filter, NULL, r, r->connection); + } + } + + filters = conf->input_filters; + if (filters) { + while (*filters && (filter = ap_getword(r->pool, &filters, ';'))) { + ap_add_input_filter(filter, NULL, r, r->connection); + } + } +} + +static apr_size_t num_request_notes = AP_NUM_STD_NOTES; + +static apr_status_t reset_request_notes(void *dummy) +{ + num_request_notes = AP_NUM_STD_NOTES; + return APR_SUCCESS; +} + +AP_DECLARE(apr_size_t) ap_register_request_note(void) +{ + apr_pool_cleanup_register(apr_hook_global_pool, NULL, reset_request_notes, + apr_pool_cleanup_null); + return num_request_notes++; +} + +AP_DECLARE(void **) ap_get_request_note(request_rec *r, apr_size_t note_num) +{ + core_request_config *req_cfg; + + if (note_num >= num_request_notes) { + return NULL; + } + + req_cfg = (core_request_config *) + ap_get_module_config(r->request_config, &core_module); + + if (!req_cfg) { + return NULL; + } + + return &(req_cfg->notes[note_num]); +} + +static int core_create_req(request_rec *r) +{ + /* Alloc the config struct and the array of request notes in + * a single block for efficiency + */ + core_request_config *req_cfg; + + req_cfg = apr_pcalloc(r->pool, sizeof(core_request_config) + + sizeof(void *) * num_request_notes); + req_cfg->notes = (void **)((char *)req_cfg + sizeof(core_request_config)); + + /* ### temporarily enable script delivery as the default */ + req_cfg->deliver_script = 1; + + if (r->main) { + core_request_config *main_req_cfg = (core_request_config *) + ap_get_module_config(r->main->request_config, &core_module); + req_cfg->bb = main_req_cfg->bb; + } + else { + req_cfg->bb = apr_brigade_create(r->pool, r->connection->bucket_alloc); + if (!r->prev) { + ap_add_input_filter_handle(ap_net_time_filter_handle, + NULL, r, r->connection); + } + } + + ap_set_module_config(r->request_config, &core_module, req_cfg); + + /* Begin by presuming any module can make its own path_info assumptions, + * until some module interjects and changes the value. + */ + r->used_path_info = AP_REQ_DEFAULT_PATH_INFO; + + return OK; +} + +static int core_create_proxy_req(request_rec *r, request_rec *pr) +{ + return core_create_req(pr); +} + +static conn_rec *core_create_conn(apr_pool_t *ptrans, server_rec *server, + apr_socket_t *csd, long id, void *sbh, + apr_bucket_alloc_t *alloc) +{ + apr_status_t rv; + conn_rec *c = (conn_rec *) apr_pcalloc(ptrans, sizeof(conn_rec)); + + c->sbh = sbh; + (void)ap_update_child_status(c->sbh, SERVER_BUSY_READ, (request_rec *)NULL); + + /* Got a connection structure, so initialize what fields we can + * (the rest are zeroed out by pcalloc). + */ + c->conn_config = ap_create_conn_config(ptrans); + c->notes = apr_table_make(ptrans, 5); + + c->pool = ptrans; + if ((rv = apr_socket_addr_get(&c->local_addr, APR_LOCAL, csd)) + != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_INFO, rv, server, + "apr_socket_addr_get(APR_LOCAL)"); + apr_socket_close(csd); + return NULL; + } + + apr_sockaddr_ip_get(&c->local_ip, c->local_addr); + if ((rv = apr_socket_addr_get(&c->remote_addr, APR_REMOTE, csd)) + != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_INFO, rv, server, + "apr_socket_addr_get(APR_REMOTE)"); + apr_socket_close(csd); + return NULL; + } + + apr_sockaddr_ip_get(&c->remote_ip, c->remote_addr); + c->base_server = server; + + c->id = id; + c->bucket_alloc = alloc; + + return c; +} + +static int core_pre_connection(conn_rec *c, void *csd) +{ + core_net_rec *net = apr_palloc(c->pool, sizeof(*net)); + apr_status_t rv; + +#ifdef AP_MPM_DISABLE_NAGLE_ACCEPTED_SOCK + /* BillS says perhaps this should be moved to the MPMs. Some OSes + * allow listening socket attributes to be inherited by the + * accept sockets which means this call only needs to be made + * once on the listener + */ + /* The Nagle algorithm says that we should delay sending partial + * packets in hopes of getting more data. We don't want to do + * this; we are not telnet. There are bad interactions between + * persistent connections and Nagle's algorithm that have very severe + * performance penalties. (Failing to disable Nagle is not much of a + * problem with simple HTTP.) + */ + rv = apr_socket_opt_set(csd, APR_TCP_NODELAY, 1); + if (rv != APR_SUCCESS && rv != APR_ENOTIMPL) { + /* expected cause is that the client disconnected already, + * hence the debug level + */ + ap_log_cerror(APLOG_MARK, APLOG_DEBUG, rv, c, + "apr_socket_opt_set(APR_TCP_NODELAY)"); + } +#endif + + /* The core filter requires the timeout mode to be set, which + * incidentally sets the socket to be nonblocking. If this + * is not initialized correctly, Linux - for example - will + * be initially blocking, while Solaris will be non blocking + * and any initial read will fail. + */ + rv = apr_socket_timeout_set(csd, c->base_server->timeout); + if (rv != APR_SUCCESS) { + /* expected cause is that the client disconnected already */ + ap_log_cerror(APLOG_MARK, APLOG_DEBUG, rv, c, + "apr_socket_timeout_set"); + } + + net->c = c; + net->in_ctx = NULL; + net->out_ctx = NULL; + net->client_socket = csd; + + ap_set_module_config(net->c->conn_config, &core_module, csd); + ap_add_input_filter_handle(ap_core_input_filter_handle, net, NULL, net->c); + ap_add_output_filter_handle(ap_core_output_filter_handle, net, NULL, net->c); + return DONE; +} + +static void register_hooks(apr_pool_t *p) +{ + /* create_connection and install_transport_filters are + * hooks that should always be APR_HOOK_REALLY_LAST to give other + * modules the opportunity to install alternate network transports + * and stop other functions from being run. + */ + ap_hook_create_connection(core_create_conn, NULL, NULL, + APR_HOOK_REALLY_LAST); + ap_hook_pre_connection(core_pre_connection, NULL, NULL, + APR_HOOK_REALLY_LAST); + + ap_hook_post_config(core_post_config,NULL,NULL,APR_HOOK_REALLY_FIRST); + ap_hook_translate_name(ap_core_translate,NULL,NULL,APR_HOOK_REALLY_LAST); + ap_hook_map_to_storage(core_map_to_storage,NULL,NULL,APR_HOOK_REALLY_LAST); + ap_hook_open_logs(ap_open_logs,NULL,NULL,APR_HOOK_REALLY_FIRST); + ap_hook_child_init(ap_logs_child_init,NULL,NULL,APR_HOOK_MIDDLE); + ap_hook_handler(default_handler,NULL,NULL,APR_HOOK_REALLY_LAST); + /* FIXME: I suspect we can eliminate the need for these do_nothings - Ben */ + ap_hook_type_checker(do_nothing,NULL,NULL,APR_HOOK_REALLY_LAST); + ap_hook_fixups(core_override_type,NULL,NULL,APR_HOOK_REALLY_FIRST); + ap_hook_access_checker(do_nothing,NULL,NULL,APR_HOOK_REALLY_LAST); + ap_hook_create_request(core_create_req, NULL, NULL, APR_HOOK_MIDDLE); + APR_OPTIONAL_HOOK(proxy, create_req, core_create_proxy_req, NULL, NULL, + APR_HOOK_MIDDLE); + ap_hook_pre_mpm(ap_create_scoreboard, NULL, NULL, APR_HOOK_MIDDLE); + + /* register the core's insert_filter hook and register core-provided + * filters + */ + ap_hook_insert_filter(core_insert_filter, NULL, NULL, APR_HOOK_MIDDLE); + + ap_core_input_filter_handle = + ap_register_input_filter("CORE_IN", core_input_filter, + NULL, AP_FTYPE_NETWORK); + ap_net_time_filter_handle = + ap_register_input_filter("NET_TIME", net_time_filter, + NULL, AP_FTYPE_PROTOCOL); + ap_content_length_filter_handle = + ap_register_output_filter("CONTENT_LENGTH", ap_content_length_filter, + NULL, AP_FTYPE_PROTOCOL); + ap_core_output_filter_handle = + ap_register_output_filter("CORE", core_output_filter, + NULL, AP_FTYPE_NETWORK); + ap_subreq_core_filter_handle = + ap_register_output_filter("SUBREQ_CORE", ap_sub_req_output_filter, + NULL, AP_FTYPE_CONTENT_SET); + ap_old_write_func = + ap_register_output_filter("OLD_WRITE", ap_old_write_filter, + NULL, AP_FTYPE_RESOURCE - 10); +} + +AP_DECLARE_DATA module core_module = { + STANDARD20_MODULE_STUFF, + create_core_dir_config, /* create per-directory config structure */ + merge_core_dir_configs, /* merge per-directory config structures */ + create_core_server_config, /* create per-server config structure */ + merge_core_server_configs, /* merge per-server config structures */ + core_cmds, /* command apr_table_t */ + register_hooks /* register hooks */ +}; + diff --git a/rubbos/app/httpd-2.0.64/server/core.lo b/rubbos/app/httpd-2.0.64/server/core.lo new file mode 100644 index 00000000..0a5a94eb --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/core.lo @@ -0,0 +1,12 @@ +# core.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/core.o' + +# Name of the non-PIC object. +non_pic_object='core.o' + diff --git a/rubbos/app/httpd-2.0.64/server/core.o b/rubbos/app/httpd-2.0.64/server/core.o new file mode 100644 index 0000000000000000000000000000000000000000..df7ffe5549e8841f2b2264b119955f8e98a82add GIT binary patch literal 281240 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 z

    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

    Ti5x$g4j6`U8&)%AmQ^@H8k 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/server/eoc_bucket.c b/rubbos/app/httpd-2.0.64/server/eoc_bucket.c new file mode 100644 index 00000000..0c6ce7a5 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/eoc_bucket.c @@ -0,0 +1,55 @@ +/* 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. + */ + +#include "httpd.h" +#include "http_connection.h" + +static apr_status_t eoc_bucket_read(apr_bucket *b, const char **str, + apr_size_t *len, apr_read_type_e block) +{ + *str = NULL; + *len = 0; + return APR_SUCCESS; +} + +AP_DECLARE(apr_bucket *) ap_bucket_eoc_make(apr_bucket *b) +{ + b->length = 0; + b->start = 0; + b->data = NULL; + b->type = &ap_bucket_type_eoc; + + return b; +} + +AP_DECLARE(apr_bucket *) ap_bucket_eoc_create(apr_bucket_alloc_t *list) +{ + apr_bucket *b = apr_bucket_alloc(sizeof(*b), list); + + APR_BUCKET_INIT(b); + b->free = apr_bucket_free; + b->list = list; + return ap_bucket_eoc_make(b); +} + +AP_DECLARE_DATA const apr_bucket_type_t ap_bucket_type_eoc = { + "EOC", 5, APR_BUCKET_METADATA, + apr_bucket_destroy_noop, + eoc_bucket_read, + apr_bucket_setaside_noop, + apr_bucket_split_notimpl, + apr_bucket_simple_copy +}; diff --git a/rubbos/app/httpd-2.0.64/server/eoc_bucket.lo b/rubbos/app/httpd-2.0.64/server/eoc_bucket.lo new file mode 100644 index 00000000..628d3cb7 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/eoc_bucket.lo @@ -0,0 +1,12 @@ +# eoc_bucket.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/eoc_bucket.o' + +# Name of the non-PIC object. +non_pic_object='eoc_bucket.o' + diff --git a/rubbos/app/httpd-2.0.64/server/eoc_bucket.o b/rubbos/app/httpd-2.0.64/server/eoc_bucket.o new file mode 100644 index 0000000000000000000000000000000000000000..9bdedb941cd44f09c46e3f79c39a5a9e46080272 GIT binary patch literal 9616 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/server/error_bucket.c b/rubbos/app/httpd-2.0.64/server/error_bucket.c new file mode 100644 index 00000000..d113c171 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/error_bucket.c @@ -0,0 +1,74 @@ +/* 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. + */ + +#include "http_protocol.h" +#include "apr_buckets.h" +#include "apr_strings.h" +#if APR_HAVE_STRINGS_H +#include +#endif + +static apr_status_t error_bucket_read(apr_bucket *b, const char **str, + apr_size_t *len, apr_read_type_e block) +{ + *str = NULL; + *len = 0; + return APR_SUCCESS; +} + +static void error_bucket_destroy(void *data) +{ + ap_bucket_error *h = data; + + if (apr_bucket_shared_destroy(h)) { + apr_bucket_free(h); + } +} + +AP_DECLARE(apr_bucket *) ap_bucket_error_make(apr_bucket *b, int error, + const char *buf, apr_pool_t *p) +{ + ap_bucket_error *h; + + h = apr_bucket_alloc(sizeof(*h), b->list); + h->status = error; + h->data = (buf) ? apr_pstrdup(p, buf) : NULL; + + b = apr_bucket_shared_make(b, h, 0, 0); + b->type = &ap_bucket_type_error; + return b; +} + +AP_DECLARE(apr_bucket *) ap_bucket_error_create(int error, const char *buf, + apr_pool_t *p, + apr_bucket_alloc_t *list) +{ + apr_bucket *b = apr_bucket_alloc(sizeof(*b), list); + + APR_BUCKET_INIT(b); + b->free = apr_bucket_free; + b->list = list; + return ap_bucket_error_make(b, error, buf, p); +} + +AP_DECLARE_DATA const apr_bucket_type_t ap_bucket_type_error = { + "ERROR", 5, APR_BUCKET_METADATA, + error_bucket_destroy, + error_bucket_read, + apr_bucket_setaside_notimpl, + apr_bucket_split_notimpl, + apr_bucket_shared_copy +}; diff --git a/rubbos/app/httpd-2.0.64/server/error_bucket.lo b/rubbos/app/httpd-2.0.64/server/error_bucket.lo new file mode 100644 index 00000000..f7649cae --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/error_bucket.lo @@ -0,0 +1,12 @@ +# error_bucket.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/error_bucket.o' + +# Name of the non-PIC object. +non_pic_object='error_bucket.o' + diff --git a/rubbos/app/httpd-2.0.64/server/error_bucket.o b/rubbos/app/httpd-2.0.64/server/error_bucket.o new file mode 100644 index 0000000000000000000000000000000000000000..03198e0037255fc072a178e7baa9fa1dc247da63 GIT binary patch literal 12560 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/server/export_files b/rubbos/app/httpd-2.0.64/server/export_files new file mode 100644 index 00000000..f61331e5 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/export_files @@ -0,0 +1,97 @@ +/bottlenecks/rubbos/app/httpd-2.0.64/include/ap_compat.h +/bottlenecks/rubbos/app/httpd-2.0.64/include/ap_config_auto.h +/bottlenecks/rubbos/app/httpd-2.0.64/include/ap_config.h +/bottlenecks/rubbos/app/httpd-2.0.64/include/ap_config_layout.h +/bottlenecks/rubbos/app/httpd-2.0.64/include/ap_listen.h +/bottlenecks/rubbos/app/httpd-2.0.64/include/ap_mmn.h +/bottlenecks/rubbos/app/httpd-2.0.64/include/ap_mpm.h +/bottlenecks/rubbos/app/httpd-2.0.64/include/ap_provider.h +/bottlenecks/rubbos/app/httpd-2.0.64/include/ap_regkey.h +/bottlenecks/rubbos/app/httpd-2.0.64/include/ap_release.h +/bottlenecks/rubbos/app/httpd-2.0.64/include/http_config.h +/bottlenecks/rubbos/app/httpd-2.0.64/include/http_connection.h +/bottlenecks/rubbos/app/httpd-2.0.64/include/http_core.h +/bottlenecks/rubbos/app/httpd-2.0.64/include/httpd.h +/bottlenecks/rubbos/app/httpd-2.0.64/include/http_log.h +/bottlenecks/rubbos/app/httpd-2.0.64/include/http_main.h +/bottlenecks/rubbos/app/httpd-2.0.64/include/http_protocol.h +/bottlenecks/rubbos/app/httpd-2.0.64/include/http_request.h +/bottlenecks/rubbos/app/httpd-2.0.64/include/http_vhost.h +/bottlenecks/rubbos/app/httpd-2.0.64/include/mpm_common.h +/bottlenecks/rubbos/app/httpd-2.0.64/include/pcreposix.h +/bottlenecks/rubbos/app/httpd-2.0.64/include/rfc1413.h +/bottlenecks/rubbos/app/httpd-2.0.64/include/scoreboard.h +/bottlenecks/rubbos/app/httpd-2.0.64/include/util_cfgtree.h +/bottlenecks/rubbos/app/httpd-2.0.64/include/util_charset.h +/bottlenecks/rubbos/app/httpd-2.0.64/include/util_ebcdic.h +/bottlenecks/rubbos/app/httpd-2.0.64/include/util_filter.h +/bottlenecks/rubbos/app/httpd-2.0.64/include/util_ldap.h +/bottlenecks/rubbos/app/httpd-2.0.64/include/util_md5.h +/bottlenecks/rubbos/app/httpd-2.0.64/include/util_script.h +/bottlenecks/rubbos/app/httpd-2.0.64/include/util_time.h +/bottlenecks/rubbos/app/httpd-2.0.64/include/util_xml.h +/bottlenecks/rubbos/app/httpd-2.0.64/modules/http/mod_core.h +/bottlenecks/rubbos/app/httpd-2.0.64/os/unix/os.h +/bottlenecks/rubbos/app/httpd-2.0.64/os/unix/unixd.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_allocator.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_atomic.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_compat.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_dso.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_env.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_errno.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_file_info.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_file_io.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_fnmatch.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_general.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_getopt.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_global_mutex.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_hash.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_inherit.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_lib.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_mmap.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_network_io.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_poll.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_pools.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_portable.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_proc_mutex.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_ring.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_shm.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_signal.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_strings.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_support.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_tables.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_thread_cond.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_thread_mutex.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_thread_proc.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_thread_rwlock.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_time.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_user.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_version.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_want.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_anylock.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_base64.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_buckets.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_date.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_dbm.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_hooks.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_ldap.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_ldap_url.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_md4.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_md5.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_optional.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_optional_hooks.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_queue.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_reslist.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_rmm.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_sdbm.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_sha1.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_strmatch.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_uri.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_uuid.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_xlate.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_xml.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include/apu_compat.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include/apu.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include/apu_version.h +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include/apu_want.h diff --git a/rubbos/app/httpd-2.0.64/server/export_vars.h b/rubbos/app/httpd-2.0.64/server/export_vars.h new file mode 100644 index 00000000..daa98faa --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/export_vars.h @@ -0,0 +1,51 @@ +ap_listeners +ap_top_module +ap_prelinked_modules +ap_preloaded_modules +ap_loaded_modules +ap_bucket_type_eoc +core_module +ap_subreq_core_filter_handle +ap_core_output_filter_handle +ap_content_length_filter_handle +ap_net_time_filter_handle +ap_core_input_filter_handle +ap_server_argv0 +ap_server_root +ap_server_pre_read_config +ap_server_post_read_config +ap_server_config_defines +ap_old_write_func +ap_bucket_type_error +ap_scoreboard_image +ap_scoreboard_fname +ap_extended_status +ap_my_generation +ap_conftree +ap_http_input_filter_handle +ap_http_header_filter_handle +ap_chunk_filter_handle +ap_byterange_filter_handle +unixd_config +apr_month_snames +apr_day_snames +apr_bucket_type_flush +apr_bucket_type_eos +apr_bucket_type_file +apr_bucket_type_heap +#ifdef APR_HAS_MMAP + apr_bucket_type_mmap +#endif /* APR_HAS_MMAP */ +apr_bucket_type_pool +apr_bucket_type_pipe +apr_bucket_type_immortal +apr_bucket_type_transient +apr_bucket_type_socket +#ifdef APR_HAS_MMAP +#endif /* APR_HAS_MMAP */ +apr_hook_global_pool +apr_global_hook_pool +apr_hook_debug_enabled +apr_debug_module_hooks +apr_hook_debug_current +apr_current_hooking_module diff --git a/rubbos/app/httpd-2.0.64/server/exports.c b/rubbos/app/httpd-2.0.64/server/exports.c new file mode 100644 index 00000000..806a8756 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/exports.c @@ -0,0 +1,1520 @@ +/* + * THIS FILE WAS AUTOGENERATED BY make_exports.awk + * + * This is an ugly hack that needs to be here, so + * that libtool will link all of the APR functions + * into server regardless of whether the base server + * uses them. + */ + +#define CORE_PRIVATE + +#include "ap_compat.h" +#include "ap_config_auto.h" +#include "ap_config.h" +#include "ap_config_layout.h" +#include "ap_listen.h" +#include "ap_mmn.h" +#include "ap_mpm.h" +#include "ap_provider.h" +#include "ap_regkey.h" +#include "ap_release.h" +#include "http_config.h" +#include "http_connection.h" +#include "http_core.h" +#include "httpd.h" +#include "http_log.h" +#include "http_main.h" +#include "http_protocol.h" +#include "http_request.h" +#include "http_vhost.h" +#include "mpm_common.h" +#include "pcreposix.h" +#include "rfc1413.h" +#include "scoreboard.h" +#include "util_cfgtree.h" +#include "util_charset.h" +#include "util_ebcdic.h" +#include "util_filter.h" +#include "util_ldap.h" +#include "util_md5.h" +#include "util_script.h" +#include "util_time.h" +#include "util_xml.h" +#include "mod_core.h" +#include "os.h" +#include "unixd.h" +#include "apr_allocator.h" +#include "apr_atomic.h" +#include "apr_compat.h" +#include "apr_dso.h" +#include "apr_env.h" +#include "apr_errno.h" +#include "apr_file_info.h" +#include "apr_file_io.h" +#include "apr_fnmatch.h" +#include "apr_general.h" +#include "apr_getopt.h" +#include "apr_global_mutex.h" +#include "apr.h" +#include "apr_hash.h" +#include "apr_inherit.h" +#include "apr_lib.h" +#include "apr_mmap.h" +#include "apr_network_io.h" +#include "apr_poll.h" +#include "apr_pools.h" +#include "apr_portable.h" +#include "apr_proc_mutex.h" +#include "apr_ring.h" +#include "apr_shm.h" +#include "apr_signal.h" +#include "apr_strings.h" +#include "apr_support.h" +#include "apr_tables.h" +#include "apr_thread_cond.h" +#include "apr_thread_mutex.h" +#include "apr_thread_proc.h" +#include "apr_thread_rwlock.h" +#include "apr_time.h" +#include "apr_user.h" +#include "apr_version.h" +#include "apr_want.h" +#include "apr_anylock.h" +#include "apr_base64.h" +#include "apr_buckets.h" +#include "apr_date.h" +#include "apr_dbm.h" +#include "apr_hooks.h" +#include "apr_ldap.h" +#include "apr_ldap_url.h" +#include "apr_md4.h" +#include "apr_md5.h" +#include "apr_optional.h" +#include "apr_optional_hooks.h" +#include "apr_queue.h" +#include "apr_reslist.h" +#include "apr_rmm.h" +#include "apr_sdbm.h" +#include "apr_sha1.h" +#include "apr_strmatch.h" +#include "apr_uri.h" +#include "apr_uuid.h" +#include "apr_xlate.h" +#include "apr_xml.h" +#include "apu_compat.h" +#include "apu.h" +#include "apu_version.h" +#include "apu_want.h" + +const void *ap_ugly_hack = NULL; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/include/ap_listen.h + */ +const void *ap_hack_ap_set_receive_buffer_size = (const void *)ap_set_receive_buffer_size; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/include/ap_mpm.h + */ +const void *ap_hack_ap_mpm_run = (const void *)ap_mpm_run; +const void *ap_hack_ap_graceful_stop_signalled = (const void *)ap_graceful_stop_signalled; +const void *ap_hack_ap_os_create_privileged_process = (const void *)ap_os_create_privileged_process; +const void *ap_hack_ap_mpm_query = (const void *)ap_mpm_query; +#if AP_ENABLE_EXCEPTION_HOOK +const void *ap_hack_ap_hook_fatal_exception = (const void *)ap_hook_fatal_exception; +const void *ap_hack_ap_hook_get_fatal_exception = (const void *)ap_hook_get_fatal_exception; +const void *ap_hack_ap_run_fatal_exception = (const void *)ap_run_fatal_exception; +#endif /*AP_ENABLE_EXCEPTION_HOOK*/ + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/include/ap_provider.h + */ +const void *ap_hack_ap_register_provider = (const void *)ap_register_provider; +const void *ap_hack_ap_lookup_provider = (const void *)ap_lookup_provider; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/include/ap_regkey.h + */ +#if defined(WIN32) || defined(DOXYGEN) +const void *ap_hack_ap_regkey_const = (const void *)ap_regkey_const; +const void *ap_hack_ap_regkey_open = (const void *)ap_regkey_open; +const void *ap_hack_ap_regkey_close = (const void *)ap_regkey_close; +const void *ap_hack_ap_regkey_remove = (const void *)ap_regkey_remove; +const void *ap_hack_ap_regkey_value_get = (const void *)ap_regkey_value_get; +const void *ap_hack_ap_regkey_value_set = (const void *)ap_regkey_value_set; +const void *ap_hack_ap_regkey_value_raw_get = (const void *)ap_regkey_value_raw_get; +const void *ap_hack_ap_regkey_value_raw_set = (const void *)ap_regkey_value_raw_set; +const void *ap_hack_ap_regkey_value_array_get = (const void *)ap_regkey_value_array_get; +const void *ap_hack_ap_regkey_value_array_set = (const void *)ap_regkey_value_array_set; +const void *ap_hack_ap_regkey_value_remove = (const void *)ap_regkey_value_remove; +#endif /* def WIN32 || def DOXYGEN */ + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/include/http_config.h + */ +const void *ap_hack_ap_get_module_config = (const void *)ap_get_module_config; +const void *ap_hack_ap_set_module_config = (const void *)ap_set_module_config; +const void *ap_hack_ap_set_string_slot = (const void *)ap_set_string_slot; +const void *ap_hack_ap_set_int_slot = (const void *)ap_set_int_slot; +const void *ap_hack_ap_method_is_limited = (const void *)ap_method_is_limited; +const void *ap_hack_ap_set_string_slot_lower = (const void *)ap_set_string_slot_lower; +const void *ap_hack_ap_set_flag_slot = (const void *)ap_set_flag_slot; +const void *ap_hack_ap_set_file_slot = (const void *)ap_set_file_slot; +const void *ap_hack_ap_set_deprecated = (const void *)ap_set_deprecated; +const void *ap_hack_ap_server_root_relative = (const void *)ap_server_root_relative; +const void *ap_hack_ap_add_module = (const void *)ap_add_module; +const void *ap_hack_ap_remove_module = (const void *)ap_remove_module; +const void *ap_hack_ap_add_loaded_module = (const void *)ap_add_loaded_module; +const void *ap_hack_ap_remove_loaded_module = (const void *)ap_remove_loaded_module; +const void *ap_hack_ap_add_named_module = (const void *)ap_add_named_module; +const void *ap_hack_ap_find_module_name = (const void *)ap_find_module_name; +const void *ap_hack_ap_find_linked_module = (const void *)ap_find_linked_module; +const void *ap_hack_ap_pcfg_openfile = (const void *)ap_pcfg_openfile; +const void *ap_hack_ap_pcfg_open_custom = (const void *)ap_pcfg_open_custom; +const void *ap_hack_ap_cfg_getline = (const void *)ap_cfg_getline; +const void *ap_hack_ap_cfg_getc = (const void *)ap_cfg_getc; +const void *ap_hack_ap_cfg_closefile = (const void *)ap_cfg_closefile; +const void *ap_hack_ap_soak_end_container = (const void *)ap_soak_end_container; +const void *ap_hack_ap_build_cont_config = (const void *)ap_build_cont_config; +const void *ap_hack_ap_build_config = (const void *)ap_build_config; +const void *ap_hack_ap_walk_config = (const void *)ap_walk_config; +const void *ap_hack_ap_check_cmd_context = (const void *)ap_check_cmd_context; +#ifdef CORE_PRIVATE +const void *ap_hack_ap_single_module_configure = (const void *)ap_single_module_configure; +const void *ap_hack_ap_setup_prelinked_modules = (const void *)ap_setup_prelinked_modules; +const void *ap_hack_ap_show_directives = (const void *)ap_show_directives; +const void *ap_hack_ap_show_modules = (const void *)ap_show_modules; +const void *ap_hack_ap_show_mpm = (const void *)ap_show_mpm; +const void *ap_hack_ap_read_config = (const void *)ap_read_config; +const void *ap_hack_ap_run_rewrite_args = (const void *)ap_run_rewrite_args; +const void *ap_hack_ap_register_hooks = (const void *)ap_register_hooks; +const void *ap_hack_ap_fixup_virtual_hosts = (const void *)ap_fixup_virtual_hosts; +const void *ap_hack_ap_create_request_config = (const void *)ap_create_request_config; +const void *ap_hack_ap_create_per_dir_config = (const void *)ap_create_per_dir_config; +const void *ap_hack_ap_merge_per_dir_configs = (const void *)ap_merge_per_dir_configs; +const void *ap_hack_ap_create_conn_config = (const void *)ap_create_conn_config; +const void *ap_hack_ap_parse_htaccess = (const void *)ap_parse_htaccess; +const void *ap_hack_ap_init_virtual_host = (const void *)ap_init_virtual_host; +const void *ap_hack_ap_process_resource_config = (const void *)ap_process_resource_config; +const void *ap_hack_ap_process_config_tree = (const void *)ap_process_config_tree; +const void *ap_hack_ap_invoke_handler = (const void *)ap_invoke_handler; +const void *ap_hack_ap_find_command = (const void *)ap_find_command; +const void *ap_hack_ap_find_command_in_modules = (const void *)ap_find_command_in_modules; +const void *ap_hack_ap_set_config_vectors = (const void *)ap_set_config_vectors; +#endif +const void *ap_hack_ap_hook_header_parser = (const void *)ap_hook_header_parser; +const void *ap_hack_ap_hook_get_header_parser = (const void *)ap_hook_get_header_parser; +const void *ap_hack_ap_run_header_parser = (const void *)ap_run_header_parser; +const void *ap_hack_ap_hook_pre_config = (const void *)ap_hook_pre_config; +const void *ap_hack_ap_hook_get_pre_config = (const void *)ap_hook_get_pre_config; +const void *ap_hack_ap_run_pre_config = (const void *)ap_run_pre_config; +const void *ap_hack_ap_hook_post_config = (const void *)ap_hook_post_config; +const void *ap_hack_ap_hook_get_post_config = (const void *)ap_hook_get_post_config; +const void *ap_hack_ap_run_post_config = (const void *)ap_run_post_config; +const void *ap_hack_ap_hook_open_logs = (const void *)ap_hook_open_logs; +const void *ap_hack_ap_hook_get_open_logs = (const void *)ap_hook_get_open_logs; +const void *ap_hack_ap_run_open_logs = (const void *)ap_run_open_logs; +const void *ap_hack_ap_hook_child_init = (const void *)ap_hook_child_init; +const void *ap_hack_ap_hook_get_child_init = (const void *)ap_hook_get_child_init; +const void *ap_hack_ap_run_child_init = (const void *)ap_run_child_init; +const void *ap_hack_ap_hook_handler = (const void *)ap_hook_handler; +const void *ap_hack_ap_hook_get_handler = (const void *)ap_hook_get_handler; +const void *ap_hack_ap_run_handler = (const void *)ap_run_handler; +const void *ap_hack_ap_hook_quick_handler = (const void *)ap_hook_quick_handler; +const void *ap_hack_ap_hook_get_quick_handler = (const void *)ap_hook_get_quick_handler; +const void *ap_hack_ap_run_quick_handler = (const void *)ap_run_quick_handler; +const void *ap_hack_ap_hook_optional_fn_retrieve = (const void *)ap_hook_optional_fn_retrieve; +const void *ap_hack_ap_hook_get_optional_fn_retrieve = (const void *)ap_hook_get_optional_fn_retrieve; +const void *ap_hack_ap_run_optional_fn_retrieve = (const void *)ap_run_optional_fn_retrieve; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/include/http_connection.h + */ +#ifdef CORE_PRIVATE +const void *ap_hack_ap_process_connection = (const void *)ap_process_connection; +const void *ap_hack_ap_flush_conn = (const void *)ap_flush_conn; +const void *ap_hack_ap_lingering_close = (const void *)ap_lingering_close; +#endif +const void *ap_hack_ap_hook_create_connection = (const void *)ap_hook_create_connection; +const void *ap_hack_ap_hook_get_create_connection = (const void *)ap_hook_get_create_connection; +const void *ap_hack_ap_run_create_connection = (const void *)ap_run_create_connection; +const void *ap_hack_ap_hook_pre_connection = (const void *)ap_hook_pre_connection; +const void *ap_hack_ap_hook_get_pre_connection = (const void *)ap_hook_get_pre_connection; +const void *ap_hack_ap_run_pre_connection = (const void *)ap_run_pre_connection; +const void *ap_hack_ap_hook_process_connection = (const void *)ap_hook_process_connection; +const void *ap_hack_ap_hook_get_process_connection = (const void *)ap_hook_get_process_connection; +const void *ap_hack_ap_run_process_connection = (const void *)ap_run_process_connection; +const void *ap_hack_ap_bucket_eoc_make = (const void *)ap_bucket_eoc_make; +const void *ap_hack_ap_bucket_eoc_create = (const void *)ap_bucket_eoc_create; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/include/http_core.h + */ +const void *ap_hack_ap_allow_options = (const void *)ap_allow_options; +const void *ap_hack_ap_allow_overrides = (const void *)ap_allow_overrides; +const void *ap_hack_ap_default_type = (const void *)ap_default_type; +const void *ap_hack_ap_document_root = (const void *)ap_document_root; +const void *ap_hack_ap_get_remote_host = (const void *)ap_get_remote_host; +const void *ap_hack_ap_get_remote_logname = (const void *)ap_get_remote_logname; +const void *ap_hack_ap_construct_url = (const void *)ap_construct_url; +const void *ap_hack_ap_get_server_name = (const void *)ap_get_server_name; +const void *ap_hack_ap_get_server_port = (const void *)ap_get_server_port; +const void *ap_hack_ap_get_limit_req_body = (const void *)ap_get_limit_req_body; +const void *ap_hack_ap_get_limit_xml_body = (const void *)ap_get_limit_xml_body; +const void *ap_hack_ap_custom_response = (const void *)ap_custom_response; +const void *ap_hack_ap_is_recursion_limit_exceeded = (const void *)ap_is_recursion_limit_exceeded; +const void *ap_hack_ap_exists_config_define = (const void *)ap_exists_config_define; +const void *ap_hack_ap_core_translate = (const void *)ap_core_translate; +const void *ap_hack_ap_auth_type = (const void *)ap_auth_type; +const void *ap_hack_ap_auth_name = (const void *)ap_auth_name; +const void *ap_hack_ap_satisfies = (const void *)ap_satisfies; +const void *ap_hack_ap_requires = (const void *)ap_requires; +#ifdef CORE_PRIVATE +const void *ap_hack_ap_register_request_note = (const void *)ap_register_request_note; +const void *ap_hack_ap_get_request_note = (const void *)ap_get_request_note; +const void *ap_hack_ap_add_per_dir_conf = (const void *)ap_add_per_dir_conf; +const void *ap_hack_ap_add_per_url_conf = (const void *)ap_add_per_url_conf; +const void *ap_hack_ap_add_file_conf = (const void *)ap_add_file_conf; +const void *ap_hack_ap_limit_section = (const void *)ap_limit_section; +#endif +const void *ap_hack_ap_hook_get_mgmt_items = (const void *)ap_hook_get_mgmt_items; +const void *ap_hack_ap_hook_get_get_mgmt_items = (const void *)ap_hook_get_get_mgmt_items; +const void *ap_hack_ap_run_get_mgmt_items = (const void *)ap_run_get_mgmt_items; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/include/httpd.h + */ +const void *ap_hack_ap_get_server_revision = (const void *)ap_get_server_revision; +const void *ap_hack_ap_get_server_version = (const void *)ap_get_server_version; +const void *ap_hack_ap_add_version_component = (const void *)ap_add_version_component; +const void *ap_hack_ap_get_server_built = (const void *)ap_get_server_built; +const void *ap_hack_ap_field_noparam = (const void *)ap_field_noparam; +const void *ap_hack_ap_ht_time = (const void *)ap_ht_time; +const void *ap_hack_ap_getword = (const void *)ap_getword; +const void *ap_hack_ap_getword_nc = (const void *)ap_getword_nc; +const void *ap_hack_ap_getword_white = (const void *)ap_getword_white; +const void *ap_hack_ap_getword_white_nc = (const void *)ap_getword_white_nc; +const void *ap_hack_ap_getword_nulls = (const void *)ap_getword_nulls; +const void *ap_hack_ap_getword_nulls_nc = (const void *)ap_getword_nulls_nc; +const void *ap_hack_ap_getword_conf = (const void *)ap_getword_conf; +const void *ap_hack_ap_getword_conf_nc = (const void *)ap_getword_conf_nc; +const void *ap_hack_ap_resolve_env = (const void *)ap_resolve_env; +const void *ap_hack_ap_size_list_item = (const void *)ap_size_list_item; +const void *ap_hack_ap_get_list_item = (const void *)ap_get_list_item; +const void *ap_hack_ap_find_list_item = (const void *)ap_find_list_item; +const void *ap_hack_ap_get_token = (const void *)ap_get_token; +const void *ap_hack_ap_find_token = (const void *)ap_find_token; +const void *ap_hack_ap_find_last_token = (const void *)ap_find_last_token; +const void *ap_hack_ap_is_url = (const void *)ap_is_url; +const void *ap_hack_ap_unescape_url = (const void *)ap_unescape_url; +const void *ap_hack_ap_unescape_url_keep2f = (const void *)ap_unescape_url_keep2f; +const void *ap_hack_ap_no2slash = (const void *)ap_no2slash; +const void *ap_hack_ap_getparents = (const void *)ap_getparents; +const void *ap_hack_ap_escape_path_segment = (const void *)ap_escape_path_segment; +const void *ap_hack_ap_os_escape_path = (const void *)ap_os_escape_path; +const void *ap_hack_ap_escape_html = (const void *)ap_escape_html; +const void *ap_hack_ap_escape_logitem = (const void *)ap_escape_logitem; +const void *ap_hack_ap_escape_errorlog_item = (const void *)ap_escape_errorlog_item; +const void *ap_hack_ap_construct_server = (const void *)ap_construct_server; +const void *ap_hack_ap_escape_shell_cmd = (const void *)ap_escape_shell_cmd; +const void *ap_hack_ap_count_dirs = (const void *)ap_count_dirs; +const void *ap_hack_ap_make_dirstr_prefix = (const void *)ap_make_dirstr_prefix; +const void *ap_hack_ap_make_dirstr_parent = (const void *)ap_make_dirstr_parent; +const void *ap_hack_ap_make_full_path = (const void *)ap_make_full_path; +const void *ap_hack_ap_os_is_path_absolute = (const void *)ap_os_is_path_absolute; +const void *ap_hack_ap_is_matchexp = (const void *)ap_is_matchexp; +const void *ap_hack_ap_strcmp_match = (const void *)ap_strcmp_match; +const void *ap_hack_ap_strcasecmp_match = (const void *)ap_strcasecmp_match; +const void *ap_hack_ap_strcasestr = (const void *)ap_strcasestr; +const void *ap_hack_ap_stripprefix = (const void *)ap_stripprefix; +const void *ap_hack_ap_pbase64decode = (const void *)ap_pbase64decode; +const void *ap_hack_ap_pbase64encode = (const void *)ap_pbase64encode; +const void *ap_hack_ap_pregcomp = (const void *)ap_pregcomp; +const void *ap_hack_ap_pregfree = (const void *)ap_pregfree; +const void *ap_hack_ap_regexec = (const void *)ap_regexec; +const void *ap_hack_ap_regerror = (const void *)ap_regerror; +const void *ap_hack_ap_pregsub = (const void *)ap_pregsub; +const void *ap_hack_ap_content_type_tolower = (const void *)ap_content_type_tolower; +const void *ap_hack_ap_str_tolower = (const void *)ap_str_tolower; +const void *ap_hack_ap_ind = (const void *)ap_ind; +const void *ap_hack_ap_rind = (const void *)ap_rind; +const void *ap_hack_ap_escape_quotes = (const void *)ap_escape_quotes; +const void *ap_hack_ap_is_rdirectory = (const void *)ap_is_rdirectory; +const void *ap_hack_ap_is_directory = (const void *)ap_is_directory; +const void *ap_hack_ap_log_assert = (const void *)ap_log_assert; +const void *ap_hack_ap_psignature = (const void *)ap_psignature; +const void *ap_hack_ap_strchr = (const void *)ap_strchr; +const void *ap_hack_ap_strchr_c = (const void *)ap_strchr_c; +const void *ap_hack_ap_strrchr = (const void *)ap_strrchr; +const void *ap_hack_ap_strrchr_c = (const void *)ap_strrchr_c; +const void *ap_hack_ap_strstr = (const void *)ap_strstr; +const void *ap_hack_ap_strstr_c = (const void *)ap_strstr_c; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/include/http_log.h + */ +const void *ap_hack_ap_open_stderr_log = (const void *)ap_open_stderr_log; +const void *ap_hack_ap_replace_stderr_log = (const void *)ap_replace_stderr_log; +const void *ap_hack_ap_log_error = (const void *)ap_log_error; +const void *ap_hack_ap_log_perror = (const void *)ap_log_perror; +const void *ap_hack_ap_log_rerror = (const void *)ap_log_rerror; +const void *ap_hack_ap_log_cerror = (const void *)ap_log_cerror; +const void *ap_hack_ap_error_log2stderr = (const void *)ap_error_log2stderr; +const void *ap_hack_ap_log_pid = (const void *)ap_log_pid; +const void *ap_hack_ap_read_pid = (const void *)ap_read_pid; +const void *ap_hack_ap_open_piped_log = (const void *)ap_open_piped_log; +const void *ap_hack_ap_close_piped_log = (const void *)ap_close_piped_log; +const void *ap_hack_ap_hook_error_log = (const void *)ap_hook_error_log; +const void *ap_hack_ap_hook_get_error_log = (const void *)ap_hook_get_error_log; +const void *ap_hack_ap_run_error_log = (const void *)ap_run_error_log; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/include/http_protocol.h + */ +const void *ap_hack_ap_hook_insert_error_filter = (const void *)ap_hook_insert_error_filter; +const void *ap_hack_ap_hook_get_insert_error_filter = (const void *)ap_hook_get_insert_error_filter; +const void *ap_hack_ap_run_insert_error_filter = (const void *)ap_run_insert_error_filter; +const void *ap_hack_ap_get_mime_headers = (const void *)ap_get_mime_headers; +const void *ap_hack_ap_get_mime_headers_core = (const void *)ap_get_mime_headers_core; +const void *ap_hack_ap_finalize_request_protocol = (const void *)ap_finalize_request_protocol; +const void *ap_hack_ap_send_error_response = (const void *)ap_send_error_response; +const void *ap_hack_ap_set_content_length = (const void *)ap_set_content_length; +const void *ap_hack_ap_set_keepalive = (const void *)ap_set_keepalive; +const void *ap_hack_ap_rationalize_mtime = (const void *)ap_rationalize_mtime; +const void *ap_hack_ap_make_content_type = (const void *)ap_make_content_type; +#ifdef CORE_PRIVATE +const void *ap_hack_ap_setup_make_content_type = (const void *)ap_setup_make_content_type; +#endif /* CORE_PRIVATE */ +const void *ap_hack_ap_make_etag = (const void *)ap_make_etag; +const void *ap_hack_ap_set_etag = (const void *)ap_set_etag; +const void *ap_hack_ap_set_last_modified = (const void *)ap_set_last_modified; +const void *ap_hack_ap_meets_conditions = (const void *)ap_meets_conditions; +const void *ap_hack_ap_send_fd = (const void *)ap_send_fd; +#if APR_HAS_MMAP +const void *ap_hack_ap_send_mmap = (const void *)ap_send_mmap; +#endif +const void *ap_hack_ap_method_register = (const void *)ap_method_register; +const void *ap_hack_ap_method_registry_init = (const void *)ap_method_registry_init; +const void *ap_hack_ap_make_method_list = (const void *)ap_make_method_list; +const void *ap_hack_ap_copy_method_list = (const void *)ap_copy_method_list; +const void *ap_hack_ap_method_list_do = (const void *)ap_method_list_do; +const void *ap_hack_ap_method_list_vdo = (const void *)ap_method_list_vdo; +const void *ap_hack_ap_method_in_list = (const void *)ap_method_in_list; +const void *ap_hack_ap_method_list_add = (const void *)ap_method_list_add; +const void *ap_hack_ap_method_list_remove = (const void *)ap_method_list_remove; +const void *ap_hack_ap_clear_method_list = (const void *)ap_clear_method_list; +const void *ap_hack_ap_set_content_type = (const void *)ap_set_content_type; +const void *ap_hack_ap_rputc = (const void *)ap_rputc; +const void *ap_hack_ap_rputs = (const void *)ap_rputs; +const void *ap_hack_ap_rwrite = (const void *)ap_rwrite; +const void *ap_hack_ap_rvputs = (const void *)ap_rvputs; +const void *ap_hack_ap_vrprintf = (const void *)ap_vrprintf; +const void *ap_hack_ap_rprintf = (const void *)ap_rprintf; +const void *ap_hack_ap_rflush = (const void *)ap_rflush; +const void *ap_hack_ap_index_of_response = (const void *)ap_index_of_response; +const void *ap_hack_ap_get_status_line = (const void *)ap_get_status_line; +const void *ap_hack_ap_setup_client_block = (const void *)ap_setup_client_block; +const void *ap_hack_ap_should_client_block = (const void *)ap_should_client_block; +const void *ap_hack_ap_get_client_block = (const void *)ap_get_client_block; +const void *ap_hack_ap_discard_request_body = (const void *)ap_discard_request_body; +const void *ap_hack_ap_note_auth_failure = (const void *)ap_note_auth_failure; +const void *ap_hack_ap_note_basic_auth_failure = (const void *)ap_note_basic_auth_failure; +const void *ap_hack_ap_note_digest_auth_failure = (const void *)ap_note_digest_auth_failure; +const void *ap_hack_ap_get_basic_auth_pw = (const void *)ap_get_basic_auth_pw; +const void *ap_hack_ap_parse_uri = (const void *)ap_parse_uri; +const void *ap_hack_ap_getline = (const void *)ap_getline; +#if APR_CHARSET_EBCDIC +const void *ap_hack_ap_rgetline = (const void *)ap_rgetline; +#else /* ASCII box */ +#endif +const void *ap_hack_ap_rgetline_core = (const void *)ap_rgetline_core; +const void *ap_hack_ap_method_number_of = (const void *)ap_method_number_of; +const void *ap_hack_ap_method_name_of = (const void *)ap_method_name_of; +const void *ap_hack_ap_hook_post_read_request = (const void *)ap_hook_post_read_request; +const void *ap_hack_ap_hook_get_post_read_request = (const void *)ap_hook_get_post_read_request; +const void *ap_hack_ap_run_post_read_request = (const void *)ap_run_post_read_request; +const void *ap_hack_ap_hook_log_transaction = (const void *)ap_hook_log_transaction; +const void *ap_hack_ap_hook_get_log_transaction = (const void *)ap_hook_get_log_transaction; +const void *ap_hack_ap_run_log_transaction = (const void *)ap_run_log_transaction; +const void *ap_hack_ap_hook_http_method = (const void *)ap_hook_http_method; +const void *ap_hack_ap_hook_get_http_method = (const void *)ap_hook_get_http_method; +const void *ap_hack_ap_run_http_method = (const void *)ap_run_http_method; +const void *ap_hack_ap_hook_default_port = (const void *)ap_hook_default_port; +const void *ap_hack_ap_hook_get_default_port = (const void *)ap_hook_get_default_port; +const void *ap_hack_ap_run_default_port = (const void *)ap_run_default_port; +const void *ap_hack_ap_bucket_error_make = (const void *)ap_bucket_error_make; +const void *ap_hack_ap_bucket_error_create = (const void *)ap_bucket_error_create; +const void *ap_hack_ap_byterange_filter = (const void *)ap_byterange_filter; +const void *ap_hack_ap_http_header_filter = (const void *)ap_http_header_filter; +const void *ap_hack_ap_content_length_filter = (const void *)ap_content_length_filter; +const void *ap_hack_ap_old_write_filter = (const void *)ap_old_write_filter; +const void *ap_hack_ap_set_sub_req_protocol = (const void *)ap_set_sub_req_protocol; +const void *ap_hack_ap_finalize_sub_req_protocol = (const void *)ap_finalize_sub_req_protocol; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/include/http_request.h + */ +const void *ap_hack_ap_process_request_internal = (const void *)ap_process_request_internal; +const void *ap_hack_ap_sub_req_lookup_uri = (const void *)ap_sub_req_lookup_uri; +const void *ap_hack_ap_sub_req_lookup_file = (const void *)ap_sub_req_lookup_file; +const void *ap_hack_ap_sub_req_lookup_dirent = (const void *)ap_sub_req_lookup_dirent; +const void *ap_hack_ap_sub_req_method_uri = (const void *)ap_sub_req_method_uri; +const void *ap_hack_ap_sub_req_output_filter = (const void *)ap_sub_req_output_filter; +const void *ap_hack_ap_run_sub_req = (const void *)ap_run_sub_req; +const void *ap_hack_ap_destroy_sub_req = (const void *)ap_destroy_sub_req; +const void *ap_hack_ap_internal_redirect = (const void *)ap_internal_redirect; +const void *ap_hack_ap_internal_redirect_handler = (const void *)ap_internal_redirect_handler; +const void *ap_hack_ap_internal_fast_redirect = (const void *)ap_internal_fast_redirect; +const void *ap_hack_ap_some_auth_required = (const void *)ap_some_auth_required; +const void *ap_hack_ap_is_initial_req = (const void *)ap_is_initial_req; +const void *ap_hack_ap_update_mtime = (const void *)ap_update_mtime; +const void *ap_hack_ap_allow_methods = (const void *)ap_allow_methods; +const void *ap_hack_ap_allow_standard_methods = (const void *)ap_allow_standard_methods; +#ifdef CORE_PRIVATE +const void *ap_hack_ap_die = (const void *)ap_die; +#endif +const void *ap_hack_ap_hook_create_request = (const void *)ap_hook_create_request; +const void *ap_hack_ap_hook_get_create_request = (const void *)ap_hook_get_create_request; +const void *ap_hack_ap_run_create_request = (const void *)ap_run_create_request; +const void *ap_hack_ap_hook_translate_name = (const void *)ap_hook_translate_name; +const void *ap_hack_ap_hook_get_translate_name = (const void *)ap_hook_get_translate_name; +const void *ap_hack_ap_run_translate_name = (const void *)ap_run_translate_name; +const void *ap_hack_ap_hook_map_to_storage = (const void *)ap_hook_map_to_storage; +const void *ap_hack_ap_hook_get_map_to_storage = (const void *)ap_hook_get_map_to_storage; +const void *ap_hack_ap_run_map_to_storage = (const void *)ap_run_map_to_storage; +const void *ap_hack_ap_hook_check_user_id = (const void *)ap_hook_check_user_id; +const void *ap_hack_ap_hook_get_check_user_id = (const void *)ap_hook_get_check_user_id; +const void *ap_hack_ap_run_check_user_id = (const void *)ap_run_check_user_id; +const void *ap_hack_ap_hook_fixups = (const void *)ap_hook_fixups; +const void *ap_hack_ap_hook_get_fixups = (const void *)ap_hook_get_fixups; +const void *ap_hack_ap_run_fixups = (const void *)ap_run_fixups; +const void *ap_hack_ap_hook_type_checker = (const void *)ap_hook_type_checker; +const void *ap_hack_ap_hook_get_type_checker = (const void *)ap_hook_get_type_checker; +const void *ap_hack_ap_run_type_checker = (const void *)ap_run_type_checker; +const void *ap_hack_ap_hook_access_checker = (const void *)ap_hook_access_checker; +const void *ap_hack_ap_hook_get_access_checker = (const void *)ap_hook_get_access_checker; +const void *ap_hack_ap_run_access_checker = (const void *)ap_run_access_checker; +const void *ap_hack_ap_hook_auth_checker = (const void *)ap_hook_auth_checker; +const void *ap_hack_ap_hook_get_auth_checker = (const void *)ap_hook_get_auth_checker; +const void *ap_hack_ap_run_auth_checker = (const void *)ap_run_auth_checker; +const void *ap_hack_ap_hook_insert_filter = (const void *)ap_hook_insert_filter; +const void *ap_hack_ap_hook_get_insert_filter = (const void *)ap_hook_get_insert_filter; +const void *ap_hack_ap_run_insert_filter = (const void *)ap_run_insert_filter; +const void *ap_hack_ap_location_walk = (const void *)ap_location_walk; +const void *ap_hack_ap_directory_walk = (const void *)ap_directory_walk; +const void *ap_hack_ap_file_walk = (const void *)ap_file_walk; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/include/http_vhost.h + */ +const void *ap_hack_ap_init_vhost_config = (const void *)ap_init_vhost_config; +const void *ap_hack_ap_fini_vhost_config = (const void *)ap_fini_vhost_config; +const void *ap_hack_ap_vhost_iterate_given_conn = (const void *)ap_vhost_iterate_given_conn; +const void *ap_hack_ap_update_vhost_given_ip = (const void *)ap_update_vhost_given_ip; +const void *ap_hack_ap_update_vhost_from_headers = (const void *)ap_update_vhost_from_headers; +const void *ap_hack_ap_matches_request_vhost = (const void *)ap_matches_request_vhost; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/include/mpm_common.h + */ +#ifdef HAVE_GETPWNAM +const void *ap_hack_ap_uname2id = (const void *)ap_uname2id; +#endif +#ifdef HAVE_GETGRNAM +const void *ap_hack_ap_gname2id = (const void *)ap_gname2id; +#endif +#ifdef AP_MPM_USES_POD +const void *ap_hack_ap_mpm_pod_open = (const void *)ap_mpm_pod_open; +const void *ap_hack_ap_mpm_pod_check = (const void *)ap_mpm_pod_check; +const void *ap_hack_ap_mpm_pod_close = (const void *)ap_mpm_pod_close; +const void *ap_hack_ap_mpm_pod_signal = (const void *)ap_mpm_pod_signal; +const void *ap_hack_ap_mpm_pod_killpg = (const void *)ap_mpm_pod_killpg; +#endif + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/include/scoreboard.h + */ +const void *ap_hack_ap_exists_scoreboard_image = (const void *)ap_exists_scoreboard_image; +const void *ap_hack_ap_increment_counts = (const void *)ap_increment_counts; +const void *ap_hack_ap_calc_scoreboard_size = (const void *)ap_calc_scoreboard_size; +const void *ap_hack_ap_create_sb_handle = (const void *)ap_create_sb_handle; +const void *ap_hack_find_child_by_pid = (const void *)find_child_by_pid; +const void *ap_hack_ap_update_child_status = (const void *)ap_update_child_status; +const void *ap_hack_ap_update_child_status_from_indexes = (const void *)ap_update_child_status_from_indexes; +const void *ap_hack_ap_get_scoreboard_worker = (const void *)ap_get_scoreboard_worker; +const void *ap_hack_ap_get_scoreboard_process = (const void *)ap_get_scoreboard_process; +const void *ap_hack_ap_get_scoreboard_global = (const void *)ap_get_scoreboard_global; +const void *ap_hack_ap_hook_pre_mpm = (const void *)ap_hook_pre_mpm; +const void *ap_hack_ap_hook_get_pre_mpm = (const void *)ap_hook_get_pre_mpm; +const void *ap_hack_ap_run_pre_mpm = (const void *)ap_run_pre_mpm; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/include/util_filter.h + */ +const void *ap_hack_ap_get_brigade = (const void *)ap_get_brigade; +const void *ap_hack_ap_pass_brigade = (const void *)ap_pass_brigade; +const void *ap_hack_ap_register_input_filter = (const void *)ap_register_input_filter; +const void *ap_hack_ap_register_output_filter = (const void *)ap_register_output_filter; +const void *ap_hack_ap_add_input_filter = (const void *)ap_add_input_filter; +const void *ap_hack_ap_add_input_filter_handle = (const void *)ap_add_input_filter_handle; +const void *ap_hack_ap_get_input_filter_handle = (const void *)ap_get_input_filter_handle; +const void *ap_hack_ap_add_output_filter = (const void *)ap_add_output_filter; +const void *ap_hack_ap_add_output_filter_handle = (const void *)ap_add_output_filter_handle; +const void *ap_hack_ap_get_output_filter_handle = (const void *)ap_get_output_filter_handle; +const void *ap_hack_ap_remove_input_filter = (const void *)ap_remove_input_filter; +const void *ap_hack_ap_remove_output_filter = (const void *)ap_remove_output_filter; +const void *ap_hack_ap_save_brigade = (const void *)ap_save_brigade; +const void *ap_hack_ap_filter_flush = (const void *)ap_filter_flush; +const void *ap_hack_ap_fflush = (const void *)ap_fflush; +const void *ap_hack_ap_fputstrs = (const void *)ap_fputstrs; +const void *ap_hack_ap_fprintf = (const void *)ap_fprintf; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/include/util_md5.h + */ +const void *ap_hack_ap_md5 = (const void *)ap_md5; +const void *ap_hack_ap_md5_binary = (const void *)ap_md5_binary; +const void *ap_hack_ap_md5contextTo64 = (const void *)ap_md5contextTo64; +const void *ap_hack_ap_md5digest = (const void *)ap_md5digest; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/include/util_script.h + */ +const void *ap_hack_ap_create_environment = (const void *)ap_create_environment; +const void *ap_hack_ap_find_path_info = (const void *)ap_find_path_info; +const void *ap_hack_ap_add_cgi_vars = (const void *)ap_add_cgi_vars; +const void *ap_hack_ap_add_common_vars = (const void *)ap_add_common_vars; +const void *ap_hack_ap_scan_script_header_err = (const void *)ap_scan_script_header_err; +const void *ap_hack_ap_scan_script_header_err_brigade = (const void *)ap_scan_script_header_err_brigade; +const void *ap_hack_ap_scan_script_header_err_strs = (const void *)ap_scan_script_header_err_strs; +const void *ap_hack_ap_scan_script_header_err_core = (const void *)ap_scan_script_header_err_core; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/include/util_time.h + */ +const void *ap_hack_ap_explode_recent_localtime = (const void *)ap_explode_recent_localtime; +const void *ap_hack_ap_explode_recent_gmt = (const void *)ap_explode_recent_gmt; +const void *ap_hack_ap_recent_ctime = (const void *)ap_recent_ctime; +const void *ap_hack_ap_recent_rfc822_date = (const void *)ap_recent_rfc822_date; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/include/util_xml.h + */ +const void *ap_hack_ap_xml_parse_input = (const void *)ap_xml_parse_input; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/modules/http/mod_core.h + */ +const void *ap_hack_ap_basic_http_header = (const void *)ap_basic_http_header; +const void *ap_hack_ap_send_http_trace = (const void *)ap_send_http_trace; +const void *ap_hack_ap_send_http_options = (const void *)ap_send_http_options; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/os/unix/unixd.h + */ +const void *ap_hack_ap_hook_get_suexec_identity = (const void *)ap_hook_get_suexec_identity; +const void *ap_hack_ap_hook_get_get_suexec_identity = (const void *)ap_hook_get_get_suexec_identity; +const void *ap_hack_ap_run_get_suexec_identity = (const void *)ap_run_get_suexec_identity; +const void *ap_hack_unixd_setup_child = (const void *)unixd_setup_child; +const void *ap_hack_unixd_pre_config = (const void *)unixd_pre_config; +const void *ap_hack_unixd_set_user = (const void *)unixd_set_user; +const void *ap_hack_unixd_set_group = (const void *)unixd_set_group; +#if defined(RLIMIT_CPU) || defined(RLIMIT_DATA) || defined(RLIMIT_VMEM) || defined(RLIMIT_NPROC) || defined(RLIMIT_AS) +const void *ap_hack_unixd_set_rlimit = (const void *)unixd_set_rlimit; +#endif +const void *ap_hack_unixd_set_proc_mutex_perms = (const void *)unixd_set_proc_mutex_perms; +const void *ap_hack_unixd_set_global_mutex_perms = (const void *)unixd_set_global_mutex_perms; +const void *ap_hack_unixd_accept = (const void *)unixd_accept; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_allocator.h + */ +const void *ap_hack_apr_allocator_create = (const void *)apr_allocator_create; +const void *ap_hack_apr_allocator_destroy = (const void *)apr_allocator_destroy; +const void *ap_hack_apr_allocator_alloc = (const void *)apr_allocator_alloc; +const void *ap_hack_apr_allocator_free = (const void *)apr_allocator_free; +const void *ap_hack_apr_allocator_owner_set = (const void *)apr_allocator_owner_set; +const void *ap_hack_apr_allocator_set_owner = (const void *)apr_allocator_set_owner; +const void *ap_hack_apr_allocator_owner_get = (const void *)apr_allocator_owner_get; +const void *ap_hack_apr_allocator_get_owner = (const void *)apr_allocator_get_owner; +const void *ap_hack_apr_allocator_max_free_set = (const void *)apr_allocator_max_free_set; +const void *ap_hack_apr_allocator_set_max_free = (const void *)apr_allocator_set_max_free; +#if APR_HAS_THREADS +const void *ap_hack_apr_allocator_mutex_set = (const void *)apr_allocator_mutex_set; +const void *ap_hack_apr_allocator_set_mutex = (const void *)apr_allocator_set_mutex; +const void *ap_hack_apr_allocator_mutex_get = (const void *)apr_allocator_mutex_get; +const void *ap_hack_apr_allocator_get_mutex = (const void *)apr_allocator_get_mutex; +#endif /* APR_HAS_THREADS */ + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_dso.h + */ +#if APR_HAS_DSO || defined(DOXYGEN) +const void *ap_hack_apr_dso_load = (const void *)apr_dso_load; +const void *ap_hack_apr_dso_unload = (const void *)apr_dso_unload; +const void *ap_hack_apr_dso_sym = (const void *)apr_dso_sym; +const void *ap_hack_apr_dso_error = (const void *)apr_dso_error; +#endif /* APR_HAS_DSO */ + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_env.h + */ +const void *ap_hack_apr_env_get = (const void *)apr_env_get; +const void *ap_hack_apr_env_set = (const void *)apr_env_set; +const void *ap_hack_apr_env_delete = (const void *)apr_env_delete; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_errno.h + */ +const void *ap_hack_apr_strerror = (const void *)apr_strerror; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_file_info.h + */ +const void *ap_hack_apr_stat = (const void *)apr_stat; +const void *ap_hack_apr_lstat = (const void *)apr_lstat; +const void *ap_hack_apr_dir_open = (const void *)apr_dir_open; +const void *ap_hack_apr_dir_close = (const void *)apr_dir_close; +const void *ap_hack_apr_dir_read = (const void *)apr_dir_read; +const void *ap_hack_apr_dir_rewind = (const void *)apr_dir_rewind; +const void *ap_hack_apr_filepath_root = (const void *)apr_filepath_root; +const void *ap_hack_apr_filepath_merge = (const void *)apr_filepath_merge; +const void *ap_hack_apr_filepath_list_split = (const void *)apr_filepath_list_split; +const void *ap_hack_apr_filepath_list_merge = (const void *)apr_filepath_list_merge; +const void *ap_hack_apr_filepath_get = (const void *)apr_filepath_get; +const void *ap_hack_apr_filepath_set = (const void *)apr_filepath_set; +const void *ap_hack_apr_filepath_encoding = (const void *)apr_filepath_encoding; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_file_io.h + */ +const void *ap_hack_apr_file_open = (const void *)apr_file_open; +const void *ap_hack_apr_file_close = (const void *)apr_file_close; +const void *ap_hack_apr_file_remove = (const void *)apr_file_remove; +const void *ap_hack_apr_file_rename = (const void *)apr_file_rename; +const void *ap_hack_apr_file_copy = (const void *)apr_file_copy; +const void *ap_hack_apr_file_append = (const void *)apr_file_append; +const void *ap_hack_apr_file_eof = (const void *)apr_file_eof; +const void *ap_hack_apr_file_open_stderr = (const void *)apr_file_open_stderr; +const void *ap_hack_apr_file_open_stdout = (const void *)apr_file_open_stdout; +const void *ap_hack_apr_file_open_stdin = (const void *)apr_file_open_stdin; +const void *ap_hack_apr_file_read = (const void *)apr_file_read; +const void *ap_hack_apr_file_write = (const void *)apr_file_write; +const void *ap_hack_apr_file_writev = (const void *)apr_file_writev; +const void *ap_hack_apr_file_read_full = (const void *)apr_file_read_full; +const void *ap_hack_apr_file_write_full = (const void *)apr_file_write_full; +const void *ap_hack_apr_file_putc = (const void *)apr_file_putc; +const void *ap_hack_apr_file_getc = (const void *)apr_file_getc; +const void *ap_hack_apr_file_ungetc = (const void *)apr_file_ungetc; +const void *ap_hack_apr_file_gets = (const void *)apr_file_gets; +const void *ap_hack_apr_file_puts = (const void *)apr_file_puts; +const void *ap_hack_apr_file_flush = (const void *)apr_file_flush; +const void *ap_hack_apr_file_dup = (const void *)apr_file_dup; +const void *ap_hack_apr_file_dup2 = (const void *)apr_file_dup2; +const void *ap_hack_apr_file_setaside = (const void *)apr_file_setaside; +const void *ap_hack_apr_file_seek = (const void *)apr_file_seek; +const void *ap_hack_apr_file_pipe_create = (const void *)apr_file_pipe_create; +const void *ap_hack_apr_file_namedpipe_create = (const void *)apr_file_namedpipe_create; +const void *ap_hack_apr_file_pipe_timeout_get = (const void *)apr_file_pipe_timeout_get; +const void *ap_hack_apr_file_pipe_timeout_set = (const void *)apr_file_pipe_timeout_set; +const void *ap_hack_apr_file_lock = (const void *)apr_file_lock; +const void *ap_hack_apr_file_unlock = (const void *)apr_file_unlock; +const void *ap_hack_apr_file_name_get = (const void *)apr_file_name_get; +const void *ap_hack_apr_file_data_get = (const void *)apr_file_data_get; +const void *ap_hack_apr_file_data_set = (const void *)apr_file_data_set; +const void *ap_hack_apr_file_printf = (const void *)apr_file_printf; +const void *ap_hack_apr_file_perms_set = (const void *)apr_file_perms_set; +const void *ap_hack_apr_file_attrs_set = (const void *)apr_file_attrs_set; +const void *ap_hack_apr_file_mtime_set = (const void *)apr_file_mtime_set; +const void *ap_hack_apr_dir_make = (const void *)apr_dir_make; +const void *ap_hack_apr_dir_make_recursive = (const void *)apr_dir_make_recursive; +const void *ap_hack_apr_dir_remove = (const void *)apr_dir_remove; +const void *ap_hack_apr_file_info_get = (const void *)apr_file_info_get; +const void *ap_hack_apr_file_trunc = (const void *)apr_file_trunc; +const void *ap_hack_apr_file_flags_get = (const void *)apr_file_flags_get; +const void *ap_hack_apr_file_pool_get = (const void *)apr_file_pool_get; +const void *ap_hack_apr_file_inherit_set = (const void *)apr_file_inherit_set; +const void *ap_hack_apr_file_set_inherit = (const void *)apr_file_set_inherit; +const void *ap_hack_apr_file_inherit_unset = (const void *)apr_file_inherit_unset; +const void *ap_hack_apr_file_unset_inherit = (const void *)apr_file_unset_inherit; +const void *ap_hack_apr_file_mktemp = (const void *)apr_file_mktemp; +const void *ap_hack_apr_temp_dir_get = (const void *)apr_temp_dir_get; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_fnmatch.h + */ +const void *ap_hack_apr_fnmatch = (const void *)apr_fnmatch; +const void *ap_hack_apr_fnmatch_test = (const void *)apr_fnmatch_test; +const void *ap_hack_apr_is_fnmatch = (const void *)apr_is_fnmatch; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_general.h + */ +const void *ap_hack_apr_initialize = (const void *)apr_initialize; +const void *ap_hack_apr_app_initialize = (const void *)apr_app_initialize; +const void *ap_hack_apr_terminate = (const void *)apr_terminate; +const void *ap_hack_apr_terminate2 = (const void *)apr_terminate2; +#if APR_HAS_RANDOM || defined(DOXYGEN) +#ifdef APR_ENABLE_FOR_1_0 +const void *ap_hack_apr_generate_random_bytes = (const void *)apr_generate_random_bytes; +#else +const void *ap_hack_apr_generate_random_bytes = (const void *)apr_generate_random_bytes; +#endif +#endif + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_getopt.h + */ +const void *ap_hack_apr_getopt_init = (const void *)apr_getopt_init; +const void *ap_hack_apr_getopt = (const void *)apr_getopt; +const void *ap_hack_apr_getopt_long = (const void *)apr_getopt_long; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_global_mutex.h + */ +#if !APR_PROC_MUTEX_IS_GLOBAL || defined(DOXYGEN) +const void *ap_hack_apr_global_mutex_create = (const void *)apr_global_mutex_create; +const void *ap_hack_apr_global_mutex_child_init = (const void *)apr_global_mutex_child_init; +const void *ap_hack_apr_global_mutex_lock = (const void *)apr_global_mutex_lock; +const void *ap_hack_apr_global_mutex_trylock = (const void *)apr_global_mutex_trylock; +const void *ap_hack_apr_global_mutex_unlock = (const void *)apr_global_mutex_unlock; +const void *ap_hack_apr_global_mutex_destroy = (const void *)apr_global_mutex_destroy; +const void *ap_hack_apr_global_mutex_pool_get = (const void *)apr_global_mutex_pool_get; +#else /* APR_PROC_MUTEX_IS_GLOBAL */ +#endif + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_hash.h + */ +const void *ap_hack_apr_hash_make = (const void *)apr_hash_make; +const void *ap_hack_apr_hash_copy = (const void *)apr_hash_copy; +const void *ap_hack_apr_hash_set = (const void *)apr_hash_set; +const void *ap_hack_apr_hash_get = (const void *)apr_hash_get; +const void *ap_hack_apr_hash_first = (const void *)apr_hash_first; +const void *ap_hack_apr_hash_next = (const void *)apr_hash_next; +const void *ap_hack_apr_hash_this = (const void *)apr_hash_this; +const void *ap_hack_apr_hash_count = (const void *)apr_hash_count; +const void *ap_hack_apr_hash_overlay = (const void *)apr_hash_overlay; +const void *ap_hack_apr_hash_merge = (const void *)apr_hash_merge; +const void *ap_hack_apr_hash_pool_get = (const void *)apr_hash_pool_get; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_lib.h + */ +const void *ap_hack_apr_filepath_name_get = (const void *)apr_filepath_name_get; +const void *ap_hack_apr_filename_of_pathname = (const void *)apr_filename_of_pathname; +const void *ap_hack_apr_vformatter = (const void *)apr_vformatter; +const void *ap_hack_apr_password_get = (const void *)apr_password_get; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_mmap.h + */ +#if APR_HAS_MMAP || defined(DOXYGEN) +const void *ap_hack_apr_mmap_create = (const void *)apr_mmap_create; +const void *ap_hack_apr_mmap_dup = (const void *)apr_mmap_dup; +#if defined(DOXYGEN) +const void *ap_hack_apr_mmap_setaside = (const void *)apr_mmap_setaside; +#else +#endif /* DOXYGEN */ +const void *ap_hack_apr_mmap_delete = (const void *)apr_mmap_delete; +const void *ap_hack_apr_mmap_offset = (const void *)apr_mmap_offset; +#endif /* APR_HAS_MMAP */ + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_network_io.h + */ +const void *ap_hack_apr_socket_create = (const void *)apr_socket_create; +const void *ap_hack_apr_socket_create_ex = (const void *)apr_socket_create_ex; +const void *ap_hack_apr_socket_shutdown = (const void *)apr_socket_shutdown; +const void *ap_hack_apr_shutdown = (const void *)apr_shutdown; +const void *ap_hack_apr_socket_close = (const void *)apr_socket_close; +const void *ap_hack_apr_socket_bind = (const void *)apr_socket_bind; +const void *ap_hack_apr_bind = (const void *)apr_bind; +const void *ap_hack_apr_socket_listen = (const void *)apr_socket_listen; +const void *ap_hack_apr_listen = (const void *)apr_listen; +const void *ap_hack_apr_socket_accept = (const void *)apr_socket_accept; +const void *ap_hack_apr_accept = (const void *)apr_accept; +const void *ap_hack_apr_socket_connect = (const void *)apr_socket_connect; +const void *ap_hack_apr_connect = (const void *)apr_connect; +const void *ap_hack_apr_sockaddr_info_get = (const void *)apr_sockaddr_info_get; +const void *ap_hack_apr_getnameinfo = (const void *)apr_getnameinfo; +const void *ap_hack_apr_parse_addr_port = (const void *)apr_parse_addr_port; +const void *ap_hack_apr_gethostname = (const void *)apr_gethostname; +const void *ap_hack_apr_socket_data_get = (const void *)apr_socket_data_get; +const void *ap_hack_apr_socket_data_set = (const void *)apr_socket_data_set; +const void *ap_hack_apr_socket_send = (const void *)apr_socket_send; +const void *ap_hack_apr_send = (const void *)apr_send; +const void *ap_hack_apr_socket_sendv = (const void *)apr_socket_sendv; +const void *ap_hack_apr_sendv = (const void *)apr_sendv; +const void *ap_hack_apr_socket_sendto = (const void *)apr_socket_sendto; +const void *ap_hack_apr_sendto = (const void *)apr_sendto; +const void *ap_hack_apr_socket_recvfrom = (const void *)apr_socket_recvfrom; +const void *ap_hack_apr_recvfrom = (const void *)apr_recvfrom; +#if APR_HAS_SENDFILE || defined(DOXYGEN) +const void *ap_hack_apr_socket_sendfile = (const void *)apr_socket_sendfile; +const void *ap_hack_apr_sendfile = (const void *)apr_sendfile; +#endif /* APR_HAS_SENDFILE */ +const void *ap_hack_apr_socket_recv = (const void *)apr_socket_recv; +const void *ap_hack_apr_recv = (const void *)apr_recv; +const void *ap_hack_apr_socket_opt_set = (const void *)apr_socket_opt_set; +const void *ap_hack_apr_setsocketopt = (const void *)apr_setsocketopt; +const void *ap_hack_apr_socket_timeout_set = (const void *)apr_socket_timeout_set; +const void *ap_hack_apr_socket_opt_get = (const void *)apr_socket_opt_get; +const void *ap_hack_apr_getsocketopt = (const void *)apr_getsocketopt; +const void *ap_hack_apr_socket_timeout_get = (const void *)apr_socket_timeout_get; +const void *ap_hack_apr_socket_atmark = (const void *)apr_socket_atmark; +const void *ap_hack_apr_socket_addr_get = (const void *)apr_socket_addr_get; +const void *ap_hack_apr_sockaddr_port_set = (const void *)apr_sockaddr_port_set; +const void *ap_hack_apr_sockaddr_port_get = (const void *)apr_sockaddr_port_get; +const void *ap_hack_apr_sockaddr_ip_set = (const void *)apr_sockaddr_ip_set; +const void *ap_hack_apr_sockaddr_ip_get = (const void *)apr_sockaddr_ip_get; +const void *ap_hack_apr_sockaddr_equal = (const void *)apr_sockaddr_equal; +#if APR_FILES_AS_SOCKETS || defined(DOXYGEN) +const void *ap_hack_apr_socket_from_file = (const void *)apr_socket_from_file; +#endif /* APR_FILES_AS_SOCKETS */ +const void *ap_hack_apr_getservbyname = (const void *)apr_getservbyname; +const void *ap_hack_apr_ipsubnet_create = (const void *)apr_ipsubnet_create; +const void *ap_hack_apr_ipsubnet_test = (const void *)apr_ipsubnet_test; +const void *ap_hack_apr_socket_protocol_get = (const void *)apr_socket_protocol_get; +const void *ap_hack_apr_socket_inherit_set = (const void *)apr_socket_inherit_set; +const void *ap_hack_apr_socket_set_inherit = (const void *)apr_socket_set_inherit; +const void *ap_hack_apr_socket_inherit_unset = (const void *)apr_socket_inherit_unset; +const void *ap_hack_apr_socket_unset_inherit = (const void *)apr_socket_unset_inherit; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_poll.h + */ +const void *ap_hack_apr_poll_setup = (const void *)apr_poll_setup; +const void *ap_hack_apr_poll = (const void *)apr_poll; +const void *ap_hack_apr_poll_socket_add = (const void *)apr_poll_socket_add; +const void *ap_hack_apr_poll_socket_mask = (const void *)apr_poll_socket_mask; +const void *ap_hack_apr_poll_socket_remove = (const void *)apr_poll_socket_remove; +const void *ap_hack_apr_poll_socket_clear = (const void *)apr_poll_socket_clear; +const void *ap_hack_apr_poll_revents_get = (const void *)apr_poll_revents_get; +const void *ap_hack_apr_pollset_create = (const void *)apr_pollset_create; +const void *ap_hack_apr_pollset_destroy = (const void *)apr_pollset_destroy; +const void *ap_hack_apr_pollset_add = (const void *)apr_pollset_add; +const void *ap_hack_apr_pollset_remove = (const void *)apr_pollset_remove; +const void *ap_hack_apr_pollset_poll = (const void *)apr_pollset_poll; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_pools.h + */ +const void *ap_hack_apr_pool_initialize = (const void *)apr_pool_initialize; +const void *ap_hack_apr_pool_terminate = (const void *)apr_pool_terminate; +const void *ap_hack_apr_pool_create_ex = (const void *)apr_pool_create_ex; +const void *ap_hack_apr_pool_create_ex_debug = (const void *)apr_pool_create_ex_debug; +#if defined(DOXYGEN) +const void *ap_hack_apr_pool_create = (const void *)apr_pool_create; +#else +#endif +const void *ap_hack_apr_pool_allocator_get = (const void *)apr_pool_allocator_get; +const void *ap_hack_apr_pool_clear = (const void *)apr_pool_clear; +const void *ap_hack_apr_pool_clear_debug = (const void *)apr_pool_clear_debug; +const void *ap_hack_apr_pool_destroy = (const void *)apr_pool_destroy; +const void *ap_hack_apr_pool_destroy_debug = (const void *)apr_pool_destroy_debug; +const void *ap_hack_apr_palloc = (const void *)apr_palloc; +const void *ap_hack_apr_palloc_debug = (const void *)apr_palloc_debug; +#if defined(DOXYGEN) +const void *ap_hack_apr_pcalloc = (const void *)apr_pcalloc; +#elif !APR_POOL_DEBUG +#endif +const void *ap_hack_apr_pcalloc_debug = (const void *)apr_pcalloc_debug; +const void *ap_hack_apr_pool_abort_set = (const void *)apr_pool_abort_set; +const void *ap_hack_apr_pool_set_abort = (const void *)apr_pool_set_abort; +const void *ap_hack_apr_pool_abort_get = (const void *)apr_pool_abort_get; +const void *ap_hack_apr_pool_get_abort = (const void *)apr_pool_get_abort; +const void *ap_hack_apr_pool_parent_get = (const void *)apr_pool_parent_get; +const void *ap_hack_apr_pool_get_parent = (const void *)apr_pool_get_parent; +const void *ap_hack_apr_pool_is_ancestor = (const void *)apr_pool_is_ancestor; +const void *ap_hack_apr_pool_tag = (const void *)apr_pool_tag; +const void *ap_hack_apr_pool_userdata_set = (const void *)apr_pool_userdata_set; +const void *ap_hack_apr_pool_userdata_setn = (const void *)apr_pool_userdata_setn; +const void *ap_hack_apr_pool_userdata_get = (const void *)apr_pool_userdata_get; +const void *ap_hack_apr_pool_cleanup_register = (const void *)apr_pool_cleanup_register; +const void *ap_hack_apr_pool_cleanup_kill = (const void *)apr_pool_cleanup_kill; +const void *ap_hack_apr_pool_child_cleanup_set = (const void *)apr_pool_child_cleanup_set; +const void *ap_hack_apr_pool_cleanup_run = (const void *)apr_pool_cleanup_run; +const void *ap_hack_apr_pool_cleanup_null = (const void *)apr_pool_cleanup_null; +const void *ap_hack_apr_pool_cleanup_for_exec = (const void *)apr_pool_cleanup_for_exec; +#if APR_POOL_DEBUG || defined(DOXYGEN) +const void *ap_hack_apr_pool_join = (const void *)apr_pool_join; +const void *ap_hack_apr_pool_find = (const void *)apr_pool_find; +const void *ap_hack_apr_pool_num_bytes = (const void *)apr_pool_num_bytes; +const void *ap_hack_apr_pool_lock = (const void *)apr_pool_lock; +#else /* APR_POOL_DEBUG or DOXYGEN */ +#endif /* APR_POOL_DEBUG or DOXYGEN */ + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_portable.h + */ +#if APR_PROC_MUTEX_IS_GLOBAL || defined(DOXYGEN) +#else +const void *ap_hack_apr_os_global_mutex_get = (const void *)apr_os_global_mutex_get; +#endif +const void *ap_hack_apr_os_file_get = (const void *)apr_os_file_get; +const void *ap_hack_apr_os_dir_get = (const void *)apr_os_dir_get; +const void *ap_hack_apr_os_sock_get = (const void *)apr_os_sock_get; +const void *ap_hack_apr_os_proc_mutex_get = (const void *)apr_os_proc_mutex_get; +const void *ap_hack_apr_os_exp_time_get = (const void *)apr_os_exp_time_get; +const void *ap_hack_apr_os_imp_time_get = (const void *)apr_os_imp_time_get; +const void *ap_hack_apr_os_shm_get = (const void *)apr_os_shm_get; +#if APR_HAS_THREADS || defined(DOXYGEN) +const void *ap_hack_apr_os_thread_get = (const void *)apr_os_thread_get; +const void *ap_hack_apr_os_threadkey_get = (const void *)apr_os_threadkey_get; +const void *ap_hack_apr_os_thread_put = (const void *)apr_os_thread_put; +const void *ap_hack_apr_os_threadkey_put = (const void *)apr_os_threadkey_put; +const void *ap_hack_apr_os_thread_current = (const void *)apr_os_thread_current; +const void *ap_hack_apr_os_thread_equal = (const void *)apr_os_thread_equal; +#endif /* APR_HAS_THREADS */ +const void *ap_hack_apr_os_file_put = (const void *)apr_os_file_put; +const void *ap_hack_apr_os_pipe_put = (const void *)apr_os_pipe_put; +const void *ap_hack_apr_os_pipe_put_ex = (const void *)apr_os_pipe_put_ex; +const void *ap_hack_apr_os_dir_put = (const void *)apr_os_dir_put; +const void *ap_hack_apr_os_sock_put = (const void *)apr_os_sock_put; +const void *ap_hack_apr_os_sock_make = (const void *)apr_os_sock_make; +const void *ap_hack_apr_os_proc_mutex_put = (const void *)apr_os_proc_mutex_put; +const void *ap_hack_apr_os_imp_time_put = (const void *)apr_os_imp_time_put; +const void *ap_hack_apr_os_exp_time_put = (const void *)apr_os_exp_time_put; +const void *ap_hack_apr_os_shm_put = (const void *)apr_os_shm_put; +#if APR_HAS_DSO || defined(DOXYGEN) +const void *ap_hack_apr_os_dso_handle_put = (const void *)apr_os_dso_handle_put; +const void *ap_hack_apr_os_dso_handle_get = (const void *)apr_os_dso_handle_get; +#if APR_HAS_OS_UUID +const void *ap_hack_apr_os_uuid_get = (const void *)apr_os_uuid_get; +#endif +#endif /* APR_HAS_DSO */ +const void *ap_hack_apr_os_default_encoding = (const void *)apr_os_default_encoding; +const void *ap_hack_apr_os_locale_encoding = (const void *)apr_os_locale_encoding; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_proc_mutex.h + */ +const void *ap_hack_apr_proc_mutex_create = (const void *)apr_proc_mutex_create; +const void *ap_hack_apr_proc_mutex_child_init = (const void *)apr_proc_mutex_child_init; +const void *ap_hack_apr_proc_mutex_lock = (const void *)apr_proc_mutex_lock; +const void *ap_hack_apr_proc_mutex_trylock = (const void *)apr_proc_mutex_trylock; +const void *ap_hack_apr_proc_mutex_unlock = (const void *)apr_proc_mutex_unlock; +const void *ap_hack_apr_proc_mutex_destroy = (const void *)apr_proc_mutex_destroy; +const void *ap_hack_apr_proc_mutex_cleanup = (const void *)apr_proc_mutex_cleanup; +const void *ap_hack_apr_proc_mutex_lockfile = (const void *)apr_proc_mutex_lockfile; +const void *ap_hack_apr_proc_mutex_name = (const void *)apr_proc_mutex_name; +const void *ap_hack_apr_proc_mutex_defname = (const void *)apr_proc_mutex_defname; +const void *ap_hack_apr_proc_mutex_pool_get = (const void *)apr_proc_mutex_pool_get; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_shm.h + */ +const void *ap_hack_apr_shm_create = (const void *)apr_shm_create; +const void *ap_hack_apr_shm_destroy = (const void *)apr_shm_destroy; +const void *ap_hack_apr_shm_attach = (const void *)apr_shm_attach; +const void *ap_hack_apr_shm_detach = (const void *)apr_shm_detach; +const void *ap_hack_apr_shm_baseaddr_get = (const void *)apr_shm_baseaddr_get; +const void *ap_hack_apr_shm_size_get = (const void *)apr_shm_size_get; +const void *ap_hack_apr_shm_pool_get = (const void *)apr_shm_pool_get; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_signal.h + */ +#if APR_HAVE_SIGACTION || defined(DOXYGEN) +const void *ap_hack_apr_signal = (const void *)apr_signal; +#else /* !APR_HAVE_SIGACTION */ +#endif +const void *ap_hack_apr_signal_description_get = (const void *)apr_signal_description_get; +const void *ap_hack_apr_signal_get_description = (const void *)apr_signal_get_description; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_strings.h + */ +const void *ap_hack_apr_strnatcmp = (const void *)apr_strnatcmp; +const void *ap_hack_apr_strnatcasecmp = (const void *)apr_strnatcasecmp; +const void *ap_hack_apr_pstrdup = (const void *)apr_pstrdup; +const void *ap_hack_apr_pstrmemdup = (const void *)apr_pstrmemdup; +const void *ap_hack_apr_pstrndup = (const void *)apr_pstrndup; +const void *ap_hack_apr_pmemdup = (const void *)apr_pmemdup; +const void *ap_hack_apr_pstrcat = (const void *)apr_pstrcat; +const void *ap_hack_apr_pstrcatv = (const void *)apr_pstrcatv; +const void *ap_hack_apr_pvsprintf = (const void *)apr_pvsprintf; +const void *ap_hack_apr_psprintf = (const void *)apr_psprintf; +const void *ap_hack_apr_cpystrn = (const void *)apr_cpystrn; +const void *ap_hack_apr_collapse_spaces = (const void *)apr_collapse_spaces; +const void *ap_hack_apr_tokenize_to_argv = (const void *)apr_tokenize_to_argv; +const void *ap_hack_apr_strtok = (const void *)apr_strtok; +const void *ap_hack_apr_snprintf = (const void *)apr_snprintf; +const void *ap_hack_apr_vsnprintf = (const void *)apr_vsnprintf; +const void *ap_hack_apr_itoa = (const void *)apr_itoa; +const void *ap_hack_apr_ltoa = (const void *)apr_ltoa; +const void *ap_hack_apr_off_t_toa = (const void *)apr_off_t_toa; +const void *ap_hack_apr_strtoi64 = (const void *)apr_strtoi64; +const void *ap_hack_apr_atoi64 = (const void *)apr_atoi64; +const void *ap_hack_apr_strfsize = (const void *)apr_strfsize; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_tables.h + */ +const void *ap_hack_apr_table_elts = (const void *)apr_table_elts; +const void *ap_hack_apr_is_empty_table = (const void *)apr_is_empty_table; +const void *ap_hack_apr_is_empty_array = (const void *)apr_is_empty_array; +const void *ap_hack_apr_array_make = (const void *)apr_array_make; +const void *ap_hack_apr_array_push = (const void *)apr_array_push; +const void *ap_hack_apr_array_pop = (const void *)apr_array_pop; +const void *ap_hack_apr_array_cat = (const void *)apr_array_cat; +const void *ap_hack_apr_array_copy = (const void *)apr_array_copy; +const void *ap_hack_apr_array_copy_hdr = (const void *)apr_array_copy_hdr; +const void *ap_hack_apr_array_append = (const void *)apr_array_append; +const void *ap_hack_apr_array_pstrcat = (const void *)apr_array_pstrcat; +const void *ap_hack_apr_table_make = (const void *)apr_table_make; +const void *ap_hack_apr_table_copy = (const void *)apr_table_copy; +const void *ap_hack_apr_table_clear = (const void *)apr_table_clear; +const void *ap_hack_apr_table_get = (const void *)apr_table_get; +const void *ap_hack_apr_table_set = (const void *)apr_table_set; +const void *ap_hack_apr_table_setn = (const void *)apr_table_setn; +const void *ap_hack_apr_table_unset = (const void *)apr_table_unset; +const void *ap_hack_apr_table_merge = (const void *)apr_table_merge; +const void *ap_hack_apr_table_mergen = (const void *)apr_table_mergen; +const void *ap_hack_apr_table_add = (const void *)apr_table_add; +const void *ap_hack_apr_table_addn = (const void *)apr_table_addn; +const void *ap_hack_apr_table_overlay = (const void *)apr_table_overlay; +const void *ap_hack_apr_table_do = (const void *)apr_table_do; +const void *ap_hack_apr_table_vdo = (const void *)apr_table_vdo; +const void *ap_hack_apr_table_overlap = (const void *)apr_table_overlap; +const void *ap_hack_apr_table_compress = (const void *)apr_table_compress; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_thread_cond.h + */ +#if APR_HAS_THREADS || defined(DOXYGEN) +const void *ap_hack_apr_thread_cond_create = (const void *)apr_thread_cond_create; +const void *ap_hack_apr_thread_cond_wait = (const void *)apr_thread_cond_wait; +const void *ap_hack_apr_thread_cond_timedwait = (const void *)apr_thread_cond_timedwait; +const void *ap_hack_apr_thread_cond_signal = (const void *)apr_thread_cond_signal; +const void *ap_hack_apr_thread_cond_broadcast = (const void *)apr_thread_cond_broadcast; +const void *ap_hack_apr_thread_cond_destroy = (const void *)apr_thread_cond_destroy; +const void *ap_hack_apr_thread_cond_pool_get = (const void *)apr_thread_cond_pool_get; +#endif /* APR_HAS_THREADS */ + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_thread_mutex.h + */ +#if APR_HAS_THREADS || defined(DOXYGEN) +const void *ap_hack_apr_thread_mutex_create = (const void *)apr_thread_mutex_create; +const void *ap_hack_apr_thread_mutex_lock = (const void *)apr_thread_mutex_lock; +const void *ap_hack_apr_thread_mutex_trylock = (const void *)apr_thread_mutex_trylock; +const void *ap_hack_apr_thread_mutex_unlock = (const void *)apr_thread_mutex_unlock; +const void *ap_hack_apr_thread_mutex_destroy = (const void *)apr_thread_mutex_destroy; +const void *ap_hack_apr_thread_mutex_pool_get = (const void *)apr_thread_mutex_pool_get; +#endif /* APR_HAS_THREADS */ + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_thread_proc.h + */ +#if APR_HAS_THREADS +const void *ap_hack_apr_threadattr_create = (const void *)apr_threadattr_create; +const void *ap_hack_apr_threadattr_detach_set = (const void *)apr_threadattr_detach_set; +const void *ap_hack_apr_threadattr_detach_get = (const void *)apr_threadattr_detach_get; +const void *ap_hack_apr_threadattr_stacksize_set = (const void *)apr_threadattr_stacksize_set; +const void *ap_hack_apr_thread_create = (const void *)apr_thread_create; +const void *ap_hack_apr_thread_exit = (const void *)apr_thread_exit; +const void *ap_hack_apr_thread_join = (const void *)apr_thread_join; +const void *ap_hack_apr_thread_yield = (const void *)apr_thread_yield; +const void *ap_hack_apr_thread_once_init = (const void *)apr_thread_once_init; +const void *ap_hack_apr_thread_once = (const void *)apr_thread_once; +const void *ap_hack_apr_thread_detach = (const void *)apr_thread_detach; +const void *ap_hack_apr_thread_data_get = (const void *)apr_thread_data_get; +const void *ap_hack_apr_thread_data_set = (const void *)apr_thread_data_set; +const void *ap_hack_apr_threadkey_private_create = (const void *)apr_threadkey_private_create; +const void *ap_hack_apr_threadkey_private_get = (const void *)apr_threadkey_private_get; +const void *ap_hack_apr_threadkey_private_set = (const void *)apr_threadkey_private_set; +const void *ap_hack_apr_threadkey_private_delete = (const void *)apr_threadkey_private_delete; +const void *ap_hack_apr_threadkey_data_get = (const void *)apr_threadkey_data_get; +const void *ap_hack_apr_threadkey_data_set = (const void *)apr_threadkey_data_set; +#endif +const void *ap_hack_apr_procattr_create = (const void *)apr_procattr_create; +const void *ap_hack_apr_procattr_io_set = (const void *)apr_procattr_io_set; +const void *ap_hack_apr_procattr_child_in_set = (const void *)apr_procattr_child_in_set; +const void *ap_hack_apr_procattr_child_out_set = (const void *)apr_procattr_child_out_set; +const void *ap_hack_apr_procattr_child_err_set = (const void *)apr_procattr_child_err_set; +const void *ap_hack_apr_procattr_dir_set = (const void *)apr_procattr_dir_set; +const void *ap_hack_apr_procattr_cmdtype_set = (const void *)apr_procattr_cmdtype_set; +const void *ap_hack_apr_procattr_detach_set = (const void *)apr_procattr_detach_set; +#if APR_HAVE_STRUCT_RLIMIT +const void *ap_hack_apr_procattr_limit_set = (const void *)apr_procattr_limit_set; +#endif +const void *ap_hack_apr_procattr_child_errfn_set = (const void *)apr_procattr_child_errfn_set; +const void *ap_hack_apr_procattr_error_check_set = (const void *)apr_procattr_error_check_set; +const void *ap_hack_apr_procattr_addrspace_set = (const void *)apr_procattr_addrspace_set; +#if APR_HAS_FORK +const void *ap_hack_apr_proc_fork = (const void *)apr_proc_fork; +#endif +const void *ap_hack_apr_proc_create = (const void *)apr_proc_create; +const void *ap_hack_apr_proc_wait = (const void *)apr_proc_wait; +const void *ap_hack_apr_proc_wait_all_procs = (const void *)apr_proc_wait_all_procs; +const void *ap_hack_apr_proc_detach = (const void *)apr_proc_detach; +const void *ap_hack_apr_proc_other_child_register = (const void *)apr_proc_other_child_register; +const void *ap_hack_apr_proc_other_child_unregister = (const void *)apr_proc_other_child_unregister; +const void *ap_hack_apr_proc_other_child_alert = (const void *)apr_proc_other_child_alert; +const void *ap_hack_apr_proc_other_child_refresh = (const void *)apr_proc_other_child_refresh; +const void *ap_hack_apr_proc_other_child_refresh_all = (const void *)apr_proc_other_child_refresh_all; +const void *ap_hack_apr_proc_other_child_check = (const void *)apr_proc_other_child_check; +const void *ap_hack_apr_proc_other_child_read = (const void *)apr_proc_other_child_read; +const void *ap_hack_apr_proc_kill = (const void *)apr_proc_kill; +const void *ap_hack_apr_pool_note_subprocess = (const void *)apr_pool_note_subprocess; +#if APR_HAS_THREADS +#if (APR_HAVE_SIGWAIT || APR_HAVE_SIGSUSPEND) && !defined(OS2) +const void *ap_hack_apr_setup_signal_thread = (const void *)apr_setup_signal_thread; +const void *ap_hack_apr_signal_thread = (const void *)apr_signal_thread; +#endif /* (APR_HAVE_SIGWAIT || APR_HAVE_SIGSUSPEND) && !defined(OS2) */ +const void *ap_hack_apr_thread_pool_get = (const void *)apr_thread_pool_get; +#endif /* APR_HAS_THREADS */ + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_thread_rwlock.h + */ +#if APR_HAS_THREADS +const void *ap_hack_apr_thread_rwlock_create = (const void *)apr_thread_rwlock_create; +const void *ap_hack_apr_thread_rwlock_rdlock = (const void *)apr_thread_rwlock_rdlock; +const void *ap_hack_apr_thread_rwlock_tryrdlock = (const void *)apr_thread_rwlock_tryrdlock; +const void *ap_hack_apr_thread_rwlock_wrlock = (const void *)apr_thread_rwlock_wrlock; +const void *ap_hack_apr_thread_rwlock_trywrlock = (const void *)apr_thread_rwlock_trywrlock; +const void *ap_hack_apr_thread_rwlock_unlock = (const void *)apr_thread_rwlock_unlock; +const void *ap_hack_apr_thread_rwlock_destroy = (const void *)apr_thread_rwlock_destroy; +const void *ap_hack_apr_thread_rwlock_pool_get = (const void *)apr_thread_rwlock_pool_get; +#endif /* APR_HAS_THREADS */ + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_time.h + */ +const void *ap_hack_apr_time_now = (const void *)apr_time_now; +const void *ap_hack_apr_time_ansi_put = (const void *)apr_time_ansi_put; +const void *ap_hack_apr_time_exp_tz = (const void *)apr_time_exp_tz; +const void *ap_hack_apr_explode_time = (const void *)apr_explode_time; +const void *ap_hack_apr_time_exp_gmt = (const void *)apr_time_exp_gmt; +const void *ap_hack_apr_time_exp_lt = (const void *)apr_time_exp_lt; +const void *ap_hack_apr_explode_localtime = (const void *)apr_explode_localtime; +const void *ap_hack_apr_time_exp_get = (const void *)apr_time_exp_get; +const void *ap_hack_apr_time_exp_gmt_get = (const void *)apr_time_exp_gmt_get; +const void *ap_hack_apr_implode_gmt = (const void *)apr_implode_gmt; +const void *ap_hack_apr_sleep = (const void *)apr_sleep; +const void *ap_hack_apr_rfc822_date = (const void *)apr_rfc822_date; +const void *ap_hack_apr_ctime = (const void *)apr_ctime; +const void *ap_hack_apr_strftime = (const void *)apr_strftime; +const void *ap_hack_apr_time_clock_hires = (const void *)apr_time_clock_hires; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_user.h + */ +#if APR_HAS_USER +const void *ap_hack_apr_uid_current = (const void *)apr_uid_current; +const void *ap_hack_apr_current_userid = (const void *)apr_current_userid; +const void *ap_hack_apr_uid_name_get = (const void *)apr_uid_name_get; +const void *ap_hack_apr_get_username = (const void *)apr_get_username; +const void *ap_hack_apr_uid_get = (const void *)apr_uid_get; +const void *ap_hack_apr_get_userid = (const void *)apr_get_userid; +const void *ap_hack_apr_uid_homepath_get = (const void *)apr_uid_homepath_get; +const void *ap_hack_apr_get_home_directory = (const void *)apr_get_home_directory; +#if defined(WIN32) +const void *ap_hack_apr_uid_compare = (const void *)apr_uid_compare; +const void *ap_hack_apr_compare_users = (const void *)apr_compare_users; +#else +#endif +const void *ap_hack_apr_gid_name_get = (const void *)apr_gid_name_get; +const void *ap_hack_apr_group_name_get = (const void *)apr_group_name_get; +const void *ap_hack_apr_get_groupname = (const void *)apr_get_groupname; +const void *ap_hack_apr_gid_get = (const void *)apr_gid_get; +const void *ap_hack_apr_get_groupid = (const void *)apr_get_groupid; +#if defined(WIN32) +const void *ap_hack_apr_gid_compare = (const void *)apr_gid_compare; +const void *ap_hack_apr_compare_groups = (const void *)apr_compare_groups; +#else +#endif +#endif /* ! APR_HAS_USER */ + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_version.h + */ +const void *ap_hack_apr_version = (const void *)apr_version; +const void *ap_hack_apr_version_string = (const void *)apr_version_string; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_base64.h + */ +const void *ap_hack_apr_base64_encode_len = (const void *)apr_base64_encode_len; +const void *ap_hack_apr_base64_encode = (const void *)apr_base64_encode; +const void *ap_hack_apr_base64_encode_binary = (const void *)apr_base64_encode_binary; +const void *ap_hack_apr_base64_decode_len = (const void *)apr_base64_decode_len; +const void *ap_hack_apr_base64_decode = (const void *)apr_base64_decode; +const void *ap_hack_apr_base64_decode_binary = (const void *)apr_base64_decode_binary; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_buckets.h + */ +const void *ap_hack_apr_brigade_create = (const void *)apr_brigade_create; +const void *ap_hack_apr_brigade_destroy = (const void *)apr_brigade_destroy; +const void *ap_hack_apr_brigade_cleanup = (const void *)apr_brigade_cleanup; +const void *ap_hack_apr_brigade_split = (const void *)apr_brigade_split; +const void *ap_hack_apr_brigade_partition = (const void *)apr_brigade_partition; +#if APR_NOT_DONE_YET +const void *ap_hack_apr_brigade_consume = (const void *)apr_brigade_consume; +#endif +const void *ap_hack_apr_brigade_length = (const void *)apr_brigade_length; +const void *ap_hack_apr_brigade_flatten = (const void *)apr_brigade_flatten; +const void *ap_hack_apr_brigade_pflatten = (const void *)apr_brigade_pflatten; +const void *ap_hack_apr_brigade_split_line = (const void *)apr_brigade_split_line; +const void *ap_hack_apr_brigade_to_iovec = (const void *)apr_brigade_to_iovec; +const void *ap_hack_apr_brigade_vputstrs = (const void *)apr_brigade_vputstrs; +const void *ap_hack_apr_brigade_write = (const void *)apr_brigade_write; +const void *ap_hack_apr_brigade_writev = (const void *)apr_brigade_writev; +const void *ap_hack_apr_brigade_puts = (const void *)apr_brigade_puts; +const void *ap_hack_apr_brigade_putc = (const void *)apr_brigade_putc; +const void *ap_hack_apr_brigade_putstrs = (const void *)apr_brigade_putstrs; +const void *ap_hack_apr_brigade_printf = (const void *)apr_brigade_printf; +const void *ap_hack_apr_brigade_vprintf = (const void *)apr_brigade_vprintf; +const void *ap_hack_apr_bucket_alloc_create = (const void *)apr_bucket_alloc_create; +const void *ap_hack_apr_bucket_alloc_create_ex = (const void *)apr_bucket_alloc_create_ex; +const void *ap_hack_apr_bucket_alloc_destroy = (const void *)apr_bucket_alloc_destroy; +const void *ap_hack_apr_bucket_alloc = (const void *)apr_bucket_alloc; +const void *ap_hack_apr_bucket_free = (const void *)apr_bucket_free; +const void *ap_hack_apr_bucket_setaside_noop = (const void *)apr_bucket_setaside_noop; +const void *ap_hack_apr_bucket_setaside_notimpl = (const void *)apr_bucket_setaside_notimpl; +const void *ap_hack_apr_bucket_split_notimpl = (const void *)apr_bucket_split_notimpl; +const void *ap_hack_apr_bucket_copy_notimpl = (const void *)apr_bucket_copy_notimpl; +const void *ap_hack_apr_bucket_destroy_noop = (const void *)apr_bucket_destroy_noop; +const void *ap_hack_apr_bucket_simple_split = (const void *)apr_bucket_simple_split; +const void *ap_hack_apr_bucket_simple_copy = (const void *)apr_bucket_simple_copy; +const void *ap_hack_apr_bucket_shared_make = (const void *)apr_bucket_shared_make; +const void *ap_hack_apr_bucket_shared_destroy = (const void *)apr_bucket_shared_destroy; +const void *ap_hack_apr_bucket_shared_split = (const void *)apr_bucket_shared_split; +const void *ap_hack_apr_bucket_shared_copy = (const void *)apr_bucket_shared_copy; +const void *ap_hack_apr_bucket_eos_create = (const void *)apr_bucket_eos_create; +const void *ap_hack_apr_bucket_eos_make = (const void *)apr_bucket_eos_make; +const void *ap_hack_apr_bucket_flush_create = (const void *)apr_bucket_flush_create; +const void *ap_hack_apr_bucket_flush_make = (const void *)apr_bucket_flush_make; +const void *ap_hack_apr_bucket_immortal_create = (const void *)apr_bucket_immortal_create; +const void *ap_hack_apr_bucket_immortal_make = (const void *)apr_bucket_immortal_make; +const void *ap_hack_apr_bucket_transient_create = (const void *)apr_bucket_transient_create; +const void *ap_hack_apr_bucket_transient_make = (const void *)apr_bucket_transient_make; +const void *ap_hack_apr_bucket_heap_create = (const void *)apr_bucket_heap_create; +const void *ap_hack_apr_bucket_heap_make = (const void *)apr_bucket_heap_make; +const void *ap_hack_apr_bucket_pool_create = (const void *)apr_bucket_pool_create; +const void *ap_hack_apr_bucket_pool_make = (const void *)apr_bucket_pool_make; +#if APR_HAS_MMAP +const void *ap_hack_apr_bucket_mmap_create = (const void *)apr_bucket_mmap_create; +const void *ap_hack_apr_bucket_mmap_make = (const void *)apr_bucket_mmap_make; +#endif +const void *ap_hack_apr_bucket_socket_create = (const void *)apr_bucket_socket_create; +const void *ap_hack_apr_bucket_socket_make = (const void *)apr_bucket_socket_make; +const void *ap_hack_apr_bucket_pipe_create = (const void *)apr_bucket_pipe_create; +const void *ap_hack_apr_bucket_pipe_make = (const void *)apr_bucket_pipe_make; +const void *ap_hack_apr_bucket_file_create = (const void *)apr_bucket_file_create; +const void *ap_hack_apr_bucket_file_make = (const void *)apr_bucket_file_make; +const void *ap_hack_apr_bucket_file_enable_mmap = (const void *)apr_bucket_file_enable_mmap; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_date.h + */ +const void *ap_hack_apr_date_checkmask = (const void *)apr_date_checkmask; +const void *ap_hack_apr_date_parse_http = (const void *)apr_date_parse_http; +const void *ap_hack_apr_date_parse_rfc = (const void *)apr_date_parse_rfc; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_dbm.h + */ +const void *ap_hack_apr_dbm_open_ex = (const void *)apr_dbm_open_ex; +const void *ap_hack_apr_dbm_open = (const void *)apr_dbm_open; +const void *ap_hack_apr_dbm_close = (const void *)apr_dbm_close; +const void *ap_hack_apr_dbm_fetch = (const void *)apr_dbm_fetch; +const void *ap_hack_apr_dbm_store = (const void *)apr_dbm_store; +const void *ap_hack_apr_dbm_delete = (const void *)apr_dbm_delete; +const void *ap_hack_apr_dbm_exists = (const void *)apr_dbm_exists; +const void *ap_hack_apr_dbm_firstkey = (const void *)apr_dbm_firstkey; +const void *ap_hack_apr_dbm_nextkey = (const void *)apr_dbm_nextkey; +const void *ap_hack_apr_dbm_freedatum = (const void *)apr_dbm_freedatum; +const void *ap_hack_apr_dbm_geterror = (const void *)apr_dbm_geterror; +const void *ap_hack_apr_dbm_get_usednames_ex = (const void *)apr_dbm_get_usednames_ex; +const void *ap_hack_apr_dbm_get_usednames = (const void *)apr_dbm_get_usednames; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_hooks.h + */ +const void *ap_hack_apr_hook_sort_register = (const void *)apr_hook_sort_register; +const void *ap_hack_apr_hook_sort_all = (const void *)apr_hook_sort_all; +const void *ap_hack_apr_sort_hooks = (const void *)apr_sort_hooks; +const void *ap_hack_apr_hook_debug_show = (const void *)apr_hook_debug_show; +const void *ap_hack_apr_show_hook = (const void *)apr_show_hook; +const void *ap_hack_apr_hook_deregister_all = (const void *)apr_hook_deregister_all; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_ldap_url.h + */ +#if APR_HAS_LDAP +#if APR_HAS_LDAP_URL_PARSE +#else /* ! APR_HAS_LDAP_URL_PARSE */ +const void *ap_hack_apr_ldap_is_ldap_url = (const void *)apr_ldap_is_ldap_url; +const void *ap_hack_apr_ldap_is_ldaps_url = (const void *)apr_ldap_is_ldaps_url; +const void *ap_hack_apr_ldap_is_ldapi_url = (const void *)apr_ldap_is_ldapi_url; +const void *ap_hack_apr_ldap_url_parse = (const void *)apr_ldap_url_parse; +const void *ap_hack_apr_ldap_free_urldesc = (const void *)apr_ldap_free_urldesc; +#endif /* ! APR_HAS_LDAP_URL_PARSE */ +#endif /* APR_HAS_LDAP */ + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_md4.h + */ +const void *ap_hack_apr_md4_init = (const void *)apr_md4_init; +#if APR_HAS_XLATE +const void *ap_hack_apr_md4_set_xlate = (const void *)apr_md4_set_xlate; +#else +#endif +const void *ap_hack_apr_md4_update = (const void *)apr_md4_update; +const void *ap_hack_apr_md4_final = (const void *)apr_md4_final; +const void *ap_hack_apr_md4 = (const void *)apr_md4; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_md5.h + */ +const void *ap_hack_apr_md5_init = (const void *)apr_md5_init; +const void *ap_hack_apr_md5_set_xlate = (const void *)apr_md5_set_xlate; +const void *ap_hack_apr_md5_update = (const void *)apr_md5_update; +const void *ap_hack_apr_md5_final = (const void *)apr_md5_final; +const void *ap_hack_apr_md5 = (const void *)apr_md5; +const void *ap_hack_apr_md5_encode = (const void *)apr_md5_encode; +const void *ap_hack_apr_password_validate = (const void *)apr_password_validate; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_optional.h + */ +const void *ap_hack_apr_dynamic_fn_register = (const void *)apr_dynamic_fn_register; +const void *ap_hack_apr_register_optional_fn = (const void *)apr_register_optional_fn; +const void *ap_hack_apr_dynamic_fn_retrieve = (const void *)apr_dynamic_fn_retrieve; +const void *ap_hack_apr_retrieve_optional_fn = (const void *)apr_retrieve_optional_fn; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_optional_hooks.h + */ +const void *ap_hack_apr_optional_hook_add = (const void *)apr_optional_hook_add; +const void *ap_hack_apr_optional_hook_get = (const void *)apr_optional_hook_get; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_queue.h + */ +#if APR_HAS_THREADS +const void *ap_hack_apr_queue_create = (const void *)apr_queue_create; +const void *ap_hack_apr_queue_push = (const void *)apr_queue_push; +const void *ap_hack_apr_queue_pop = (const void *)apr_queue_pop; +const void *ap_hack_apr_queue_trypush = (const void *)apr_queue_trypush; +const void *ap_hack_apr_queue_trypop = (const void *)apr_queue_trypop; +const void *ap_hack_apr_queue_size = (const void *)apr_queue_size; +const void *ap_hack_apr_queue_interrupt_all = (const void *)apr_queue_interrupt_all; +const void *ap_hack_apr_queue_term = (const void *)apr_queue_term; +#endif /* APR_HAS_THREADS */ + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_reslist.h + */ +#if APR_HAS_THREADS +const void *ap_hack_apr_reslist_create = (const void *)apr_reslist_create; +const void *ap_hack_apr_reslist_destroy = (const void *)apr_reslist_destroy; +const void *ap_hack_apr_reslist_acquire = (const void *)apr_reslist_acquire; +const void *ap_hack_apr_reslist_release = (const void *)apr_reslist_release; +const void *ap_hack_apr_reslist_timeout_set = (const void *)apr_reslist_timeout_set; +const void *ap_hack_apr_reslist_invalidate = (const void *)apr_reslist_invalidate; +#endif /* APR_HAS_THREADS */ + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_rmm.h + */ +const void *ap_hack_apr_rmm_init = (const void *)apr_rmm_init; +const void *ap_hack_apr_rmm_destroy = (const void *)apr_rmm_destroy; +const void *ap_hack_apr_rmm_attach = (const void *)apr_rmm_attach; +const void *ap_hack_apr_rmm_detach = (const void *)apr_rmm_detach; +const void *ap_hack_apr_rmm_malloc = (const void *)apr_rmm_malloc; +const void *ap_hack_apr_rmm_realloc = (const void *)apr_rmm_realloc; +const void *ap_hack_apr_rmm_calloc = (const void *)apr_rmm_calloc; +const void *ap_hack_apr_rmm_free = (const void *)apr_rmm_free; +const void *ap_hack_apr_rmm_addr_get = (const void *)apr_rmm_addr_get; +const void *ap_hack_apr_rmm_offset_get = (const void *)apr_rmm_offset_get; +const void *ap_hack_apr_rmm_overhead_get = (const void *)apr_rmm_overhead_get; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_sdbm.h + */ +const void *ap_hack_apr_sdbm_open = (const void *)apr_sdbm_open; +const void *ap_hack_apr_sdbm_close = (const void *)apr_sdbm_close; +const void *ap_hack_apr_sdbm_lock = (const void *)apr_sdbm_lock; +const void *ap_hack_apr_sdbm_unlock = (const void *)apr_sdbm_unlock; +const void *ap_hack_apr_sdbm_fetch = (const void *)apr_sdbm_fetch; +const void *ap_hack_apr_sdbm_store = (const void *)apr_sdbm_store; +const void *ap_hack_apr_sdbm_delete = (const void *)apr_sdbm_delete; +const void *ap_hack_apr_sdbm_firstkey = (const void *)apr_sdbm_firstkey; +const void *ap_hack_apr_sdbm_nextkey = (const void *)apr_sdbm_nextkey; +const void *ap_hack_apr_sdbm_rdonly = (const void *)apr_sdbm_rdonly; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_sha1.h + */ +const void *ap_hack_apr_sha1_base64 = (const void *)apr_sha1_base64; +const void *ap_hack_apr_sha1_init = (const void *)apr_sha1_init; +const void *ap_hack_apr_sha1_update = (const void *)apr_sha1_update; +const void *ap_hack_apr_sha1_update_binary = (const void *)apr_sha1_update_binary; +const void *ap_hack_apr_sha1_final = (const void *)apr_sha1_final; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_strmatch.h + */ +#if defined(DOXYGEN) +const void *ap_hack_apr_strmatch = (const void *)apr_strmatch; +#else +#endif +const void *ap_hack_apr_strmatch_precompile = (const void *)apr_strmatch_precompile; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_uri.h + */ +const void *ap_hack_apr_uri_port_of_scheme = (const void *)apr_uri_port_of_scheme; +const void *ap_hack_apr_uri_default_port_for_scheme = (const void *)apr_uri_default_port_for_scheme; +const void *ap_hack_apr_uri_unparse = (const void *)apr_uri_unparse; +const void *ap_hack_apr_uri_parse = (const void *)apr_uri_parse; +const void *ap_hack_apr_uri_parse_hostinfo = (const void *)apr_uri_parse_hostinfo; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_uuid.h + */ +const void *ap_hack_apr_uuid_get = (const void *)apr_uuid_get; +const void *ap_hack_apr_uuid_format = (const void *)apr_uuid_format; +const void *ap_hack_apr_uuid_parse = (const void *)apr_uuid_parse; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_xlate.h + */ +const void *ap_hack_apr_xlate_open = (const void *)apr_xlate_open; +const void *ap_hack_apr_xlate_sb_get = (const void *)apr_xlate_sb_get; +const void *ap_hack_apr_xlate_get_sb = (const void *)apr_xlate_get_sb; +const void *ap_hack_apr_xlate_conv_buffer = (const void *)apr_xlate_conv_buffer; +#ifdef APR_NOT_DONE_YET +const void *ap_hack_apr_xlate_conv_char = (const void *)apr_xlate_conv_char; +#endif +const void *ap_hack_apr_xlate_conv_byte = (const void *)apr_xlate_conv_byte; +const void *ap_hack_apr_xlate_close = (const void *)apr_xlate_close; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include/apr_xml.h + */ +const void *ap_hack_apr_text_append = (const void *)apr_text_append; +const void *ap_hack_apr_xml_parser_create = (const void *)apr_xml_parser_create; +const void *ap_hack_apr_xml_parse_file = (const void *)apr_xml_parse_file; +const void *ap_hack_apr_xml_parser_feed = (const void *)apr_xml_parser_feed; +const void *ap_hack_apr_xml_parser_done = (const void *)apr_xml_parser_done; +const void *ap_hack_apr_xml_parser_geterror = (const void *)apr_xml_parser_geterror; +const void *ap_hack_apr_xml_to_text = (const void *)apr_xml_to_text; +const void *ap_hack_apr_xml_empty_elem = (const void *)apr_xml_empty_elem; +const void *ap_hack_apr_xml_quote_string = (const void *)apr_xml_quote_string; +const void *ap_hack_apr_xml_quote_elem = (const void *)apr_xml_quote_elem; +const void *ap_hack_apr_xml_insert_uri = (const void *)apr_xml_insert_uri; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include/apu_version.h + */ +const void *ap_hack_apu_version = (const void *)apu_version; +const void *ap_hack_apu_version_string = (const void *)apu_version_string; + diff --git a/rubbos/app/httpd-2.0.64/server/exports.lo b/rubbos/app/httpd-2.0.64/server/exports.lo new file mode 100644 index 00000000..26e7ae67 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/exports.lo @@ -0,0 +1,12 @@ +# exports.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/exports.o' + +# Name of the non-PIC object. +non_pic_object='exports.o' + diff --git a/rubbos/app/httpd-2.0.64/server/exports.o b/rubbos/app/httpd-2.0.64/server/exports.o new file mode 100644 index 0000000000000000000000000000000000000000..a93c0eed31b3d6218eda4f3f24674a3bf0be5151 GIT binary patch literal 222032 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 F`G0rGHX#52 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/server/gen_test_char b/rubbos/app/httpd-2.0.64/server/gen_test_char new file mode 100755 index 0000000000000000000000000000000000000000..11e1050ca212c14d35831556608afe47bcba821f GIT binary patch literal 25322 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 B5yb!i literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/server/gen_test_char.c b/rubbos/app/httpd-2.0.64/server/gen_test_char.c new file mode 100644 index 00000000..ef53f9c9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/gen_test_char.c @@ -0,0 +1,143 @@ +/* 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. + */ + +#ifdef CROSS_COMPILE + +#define apr_isalnum(c) (isalnum(((unsigned char)(c)))) +#define apr_isalpha(c) (isalpha(((unsigned char)(c)))) +#define apr_iscntrl(c) (iscntrl(((unsigned char)(c)))) +#define apr_isprint(c) (isprint(((unsigned char)(c)))) +#include +#define APR_HAVE_STDIO_H 1 +#define APR_HAVE_STRING_H 1 + +#else + +#include "apr.h" +#include "apr_lib.h" + +#if defined(WIN32) || defined(OS2) +#define NEED_ENHANCED_ESCAPES +#endif + +#endif + +#if APR_HAVE_STDIO_H +#include +#endif +#if APR_HAVE_STRING_H +#include +#endif + +/* A bunch of functions in util.c scan strings looking for certain characters. + * To make that more efficient we encode a lookup table. + */ +#define T_ESCAPE_SHELL_CMD (0x01) +#define T_ESCAPE_PATH_SEGMENT (0x02) +#define T_OS_ESCAPE_PATH (0x04) +#define T_HTTP_TOKEN_STOP (0x08) +#define T_ESCAPE_LOGITEM (0x10) +#define T_ESCAPE_FORENSIC (0x20) + +int main(int argc, char *argv[]) +{ + unsigned c; + unsigned char flags; + + printf("/* this file is automatically generated by gen_test_char, " + "do not edit */\n" + "#define T_ESCAPE_SHELL_CMD (%u)\n" + "#define T_ESCAPE_PATH_SEGMENT (%u)\n" + "#define T_OS_ESCAPE_PATH (%u)\n" + "#define T_HTTP_TOKEN_STOP (%u)\n" + "#define T_ESCAPE_LOGITEM (%u)\n" + "#define T_ESCAPE_FORENSIC (%u)\n" + "\n" + "static const unsigned char test_char_table[256] = {\n" + " 0,", + T_ESCAPE_SHELL_CMD, + T_ESCAPE_PATH_SEGMENT, + T_OS_ESCAPE_PATH, + T_HTTP_TOKEN_STOP, + T_ESCAPE_LOGITEM, + T_ESCAPE_FORENSIC); + + /* we explicitly dealt with NUL above + * in case some strchr() do bogosity with it */ + + for (c = 1; c < 256; ++c) { + flags = 0; + if (c % 20 == 0) + printf("\n "); + + /* escape_shell_cmd */ +#ifdef NEED_ENHANCED_ESCAPES + /* Win32/OS2 have many of the same vulnerable characters + * as Unix sh, plus the carriage return and percent char. + * The proper escaping of these characters varies from unix + * since Win32/OS2 use carets or doubled-double quotes, + * and neither lf nor cr can be escaped. We escape unix + * specific as well, to assure that cross-compiled unix + * applications behave similiarly when invoked on win32/os2. + * + * Rem please keep in-sync with apr's list in win32/filesys.c + */ + if (strchr("&;`'\"|*?~<>^()[]{}$\\\n\r%", c)) { + flags |= T_ESCAPE_SHELL_CMD; + } +#else + if (strchr("&;`'\"|*?~<>^()[]{}$\\\n", c)) { + flags |= T_ESCAPE_SHELL_CMD; + } +#endif + + if (!apr_isalnum(c) && !strchr("$-_.+!*'(),:@&=~", c)) { + flags |= T_ESCAPE_PATH_SEGMENT; + } + + if (!apr_isalnum(c) && !strchr("$-_.+!*'(),:@&=/~", c)) { + flags |= T_OS_ESCAPE_PATH; + } + + /* these are the "tspecials" from RFC2068 */ + if (apr_iscntrl(c) || strchr(" \t()<>@,;:\\/[]?={}", c)) { + flags |= T_HTTP_TOKEN_STOP; + } + + /* For logging, escape all control characters, + * double quotes (because they delimit the request in the log file) + * backslashes (because we use backslash for escaping) + * and 8-bit chars with the high bit set + */ + if (!apr_isprint(c) || c == '"' || c == '\\' || apr_iscntrl(c)) { + flags |= T_ESCAPE_LOGITEM; + } + + /* For forensic logging, escape all control characters, top bit set, + * :, | (used as delimiters) and % (used for escaping). + */ + if (!apr_isprint(c) || c == ':' || c == '|' || c == '%' + || apr_iscntrl(c) || !c) { + flags |= T_ESCAPE_FORENSIC; + } + + printf("%u%c", flags, (c < 255) ? ',' : ' '); + } + + printf("\n};\n"); + + return 0; +} diff --git a/rubbos/app/httpd-2.0.64/server/gen_test_char.dsp b/rubbos/app/httpd-2.0.64/server/gen_test_char.dsp new file mode 100644 index 00000000..cc0b943c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/gen_test_char.dsp @@ -0,0 +1,94 @@ +# Microsoft Developer Studio Project File - Name="gen_test_char" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=gen_test_char - 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 "gen_test_char.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 "gen_test_char.mak" CFG="gen_test_char - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "gen_test_char - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "gen_test_char - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "gen_test_char - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c +# ADD CPP /nologo /MD /W3 /O2 /I "..\include" /I "..\srclib\apr\include" /I "..\srclib\apr-util\include" /I "..\os\win32" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Fd"Release\gen_test_char" /FD /c +# ADD BASE RSC /l 0x809 /d "NDEBUG" +# ADD RSC /l 0x809 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:console /pdb:"Release\gen_test_char.pdb" +# SUBTRACT BASE LINK32 /pdb:none +# ADD LINK32 kernel32.lib /nologo /subsystem:console /pdb:"Release\gen_test_char.pdb" /opt:ref +# SUBTRACT LINK32 /pdb:none + +!ELSEIF "$(CFG)" == "gen_test_char - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "..\include" /I "..\srclib\apr\include" /I "..\srclib\apr-util\include" /I "..\os\win32" /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Fd"Debug\gen_test_char" /FD /c +# ADD BASE RSC /l 0x809 /d "_DEBUG" +# ADD RSC /l 0x809 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:console /incremental:no /pdb:"Debug\gen_test_char.pdb" /debug /pdbtype:sept +# SUBTRACT BASE LINK32 /pdb:none +# ADD LINK32 kernel32.lib /nologo /subsystem:console /incremental:no /pdb:"Debug\gen_test_char.pdb" /debug +# SUBTRACT LINK32 /pdb:none + +!ENDIF + +# Begin Target + +# Name "gen_test_char - Win32 Release" +# Name "gen_test_char - Win32 Debug" +# Begin Source File + +SOURCE=.\gen_test_char.c +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/server/gen_test_char.lo b/rubbos/app/httpd-2.0.64/server/gen_test_char.lo new file mode 100644 index 00000000..b45b02c3 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/gen_test_char.lo @@ -0,0 +1,12 @@ +# gen_test_char.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/gen_test_char.o' + +# Name of the non-PIC object. +non_pic_object='gen_test_char.o' + diff --git a/rubbos/app/httpd-2.0.64/server/gen_test_char.o b/rubbos/app/httpd-2.0.64/server/gen_test_char.o new file mode 100644 index 0000000000000000000000000000000000000000..7fb0cbe2f8ff9472bdea345e5b3d4c42e1ae3177 GIT binary patch literal 12160 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/server/httpd.exp b/rubbos/app/httpd-2.0.64/server/httpd.exp new file mode 100644 index 00000000..09ac042a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/httpd.exp @@ -0,0 +1,421 @@ +#! . +* This file was AUTOGENERATED at build time. +* Please do not edit by hand. +ap_set_receive_buffer_size +ap_mpm_run +ap_graceful_stop_signalled +ap_os_create_privileged_process +ap_mpm_query +ap_register_provider +ap_lookup_provider +ap_get_module_config +ap_set_module_config +ap_set_string_slot +ap_set_int_slot +ap_method_is_limited +ap_set_string_slot_lower +ap_set_flag_slot +ap_set_file_slot +ap_set_deprecated +ap_server_root_relative +ap_add_module +ap_remove_module +ap_add_loaded_module +ap_remove_loaded_module +ap_add_named_module +ap_find_module_name +ap_find_linked_module +ap_pcfg_openfile +ap_pcfg_open_custom +ap_cfg_getline +ap_cfg_getc +ap_cfg_closefile +ap_soak_end_container +ap_build_cont_config +ap_build_config +ap_walk_config +ap_check_cmd_context +ap_single_module_configure +ap_setup_prelinked_modules +ap_show_directives +ap_show_modules +ap_show_mpm +ap_read_config +ap_run_rewrite_args +ap_register_hooks +ap_fixup_virtual_hosts +ap_create_request_config +ap_create_per_dir_config +ap_merge_per_dir_configs +ap_create_conn_config +ap_parse_htaccess +ap_init_virtual_host +ap_process_resource_config +ap_process_config_tree +ap_invoke_handler +ap_find_command +ap_find_command_in_modules +ap_set_config_vectors +ap_hook_header_parser +ap_hook_get_header_parser +ap_run_header_parser +ap_hook_pre_config +ap_hook_get_pre_config +ap_run_pre_config +ap_hook_post_config +ap_hook_get_post_config +ap_run_post_config +ap_hook_open_logs +ap_hook_get_open_logs +ap_run_open_logs +ap_hook_child_init +ap_hook_get_child_init +ap_run_child_init +ap_hook_handler +ap_hook_get_handler +ap_run_handler +ap_hook_quick_handler +ap_hook_get_quick_handler +ap_run_quick_handler +ap_hook_optional_fn_retrieve +ap_hook_get_optional_fn_retrieve +ap_run_optional_fn_retrieve +ap_process_connection +ap_flush_conn +ap_lingering_close +ap_hook_create_connection +ap_hook_get_create_connection +ap_run_create_connection +ap_hook_pre_connection +ap_hook_get_pre_connection +ap_run_pre_connection +ap_hook_process_connection +ap_hook_get_process_connection +ap_run_process_connection +ap_bucket_eoc_make +ap_bucket_eoc_create +ap_allow_options +ap_allow_overrides +ap_default_type +ap_document_root +ap_get_remote_host +ap_get_remote_logname +ap_construct_url +ap_get_server_name +ap_get_server_port +ap_get_limit_req_body +ap_get_limit_xml_body +ap_custom_response +ap_is_recursion_limit_exceeded +ap_exists_config_define +ap_core_translate +ap_auth_type +ap_auth_name +ap_satisfies +ap_requires +ap_register_request_note +ap_get_request_note +ap_add_per_dir_conf +ap_add_per_url_conf +ap_add_file_conf +ap_limit_section +ap_hook_get_mgmt_items +ap_hook_get_get_mgmt_items +ap_run_get_mgmt_items +ap_get_server_revision +ap_get_server_version +ap_add_version_component +ap_get_server_built +ap_field_noparam +ap_ht_time +ap_getword +ap_getword_nc +ap_getword_white +ap_getword_white_nc +ap_getword_nulls +ap_getword_nulls_nc +ap_getword_conf +ap_getword_conf_nc +ap_resolve_env +ap_size_list_item +ap_get_list_item +ap_find_list_item +ap_get_token +ap_find_token +ap_find_last_token +ap_is_url +ap_unescape_url +ap_unescape_url_keep2f +ap_no2slash +ap_getparents +ap_escape_path_segment +ap_os_escape_path +ap_escape_html +ap_escape_logitem +ap_escape_errorlog_item +ap_construct_server +ap_escape_shell_cmd +ap_count_dirs +ap_make_dirstr_prefix +ap_make_dirstr_parent +ap_make_full_path +ap_os_is_path_absolute +ap_is_matchexp +ap_strcmp_match +ap_strcasecmp_match +ap_strcasestr +ap_stripprefix +ap_pbase64decode +ap_pbase64encode +ap_pregcomp +ap_pregfree +ap_regexec +ap_regerror +ap_pregsub +ap_content_type_tolower +ap_str_tolower +ap_ind +ap_rind +ap_escape_quotes +ap_is_rdirectory +ap_is_directory +ap_log_assert +ap_psignature +ap_strchr +ap_strchr_c +ap_strrchr +ap_strrchr_c +ap_strstr +ap_strstr_c +ap_open_stderr_log +ap_replace_stderr_log +ap_log_error +ap_log_perror +ap_log_rerror +ap_log_cerror +ap_error_log2stderr +ap_log_pid +ap_read_pid +ap_open_piped_log +ap_close_piped_log +ap_hook_error_log +ap_hook_get_error_log +ap_run_error_log +ap_hook_insert_error_filter +ap_hook_get_insert_error_filter +ap_run_insert_error_filter +ap_get_mime_headers +ap_get_mime_headers_core +ap_finalize_request_protocol +ap_send_error_response +ap_set_content_length +ap_set_keepalive +ap_rationalize_mtime +ap_make_content_type +ap_setup_make_content_type +ap_make_etag +ap_set_etag +ap_set_last_modified +ap_meets_conditions +ap_send_fd +ap_send_mmap +ap_method_register +ap_method_registry_init +ap_make_method_list +ap_copy_method_list +ap_method_list_do +ap_method_list_vdo +ap_method_in_list +ap_method_list_add +ap_method_list_remove +ap_clear_method_list +ap_set_content_type +ap_rputc +ap_rputs +ap_rwrite +ap_rvputs +ap_vrprintf +ap_rprintf +ap_rflush +ap_index_of_response +ap_get_status_line +ap_setup_client_block +ap_should_client_block +ap_get_client_block +ap_discard_request_body +ap_note_auth_failure +ap_note_basic_auth_failure +ap_note_digest_auth_failure +ap_get_basic_auth_pw +ap_parse_uri +ap_getline +ap_rgetline_core +ap_method_number_of +ap_method_name_of +ap_hook_post_read_request +ap_hook_get_post_read_request +ap_run_post_read_request +ap_hook_log_transaction +ap_hook_get_log_transaction +ap_run_log_transaction +ap_hook_http_method +ap_hook_get_http_method +ap_run_http_method +ap_hook_default_port +ap_hook_get_default_port +ap_run_default_port +ap_bucket_error_make +ap_bucket_error_create +ap_byterange_filter +ap_http_header_filter +ap_content_length_filter +ap_old_write_filter +ap_set_sub_req_protocol +ap_finalize_sub_req_protocol +ap_process_request_internal +ap_sub_req_lookup_uri +ap_sub_req_lookup_file +ap_sub_req_lookup_dirent +ap_sub_req_method_uri +ap_sub_req_output_filter +ap_run_sub_req +ap_destroy_sub_req +ap_internal_redirect +ap_internal_redirect_handler +ap_internal_fast_redirect +ap_some_auth_required +ap_is_initial_req +ap_update_mtime +ap_allow_methods +ap_allow_standard_methods +ap_die +ap_hook_create_request +ap_hook_get_create_request +ap_run_create_request +ap_hook_translate_name +ap_hook_get_translate_name +ap_run_translate_name +ap_hook_map_to_storage +ap_hook_get_map_to_storage +ap_run_map_to_storage +ap_hook_check_user_id +ap_hook_get_check_user_id +ap_run_check_user_id +ap_hook_fixups +ap_hook_get_fixups +ap_run_fixups +ap_hook_type_checker +ap_hook_get_type_checker +ap_run_type_checker +ap_hook_access_checker +ap_hook_get_access_checker +ap_run_access_checker +ap_hook_auth_checker +ap_hook_get_auth_checker +ap_run_auth_checker +ap_hook_insert_filter +ap_hook_get_insert_filter +ap_run_insert_filter +ap_location_walk +ap_directory_walk +ap_file_walk +ap_init_vhost_config +ap_fini_vhost_config +ap_vhost_iterate_given_conn +ap_update_vhost_given_ip +ap_update_vhost_from_headers +ap_matches_request_vhost +ap_uname2id +ap_gname2id +ap_exists_scoreboard_image +ap_increment_counts +ap_calc_scoreboard_size +ap_create_sb_handle +find_child_by_pid +ap_update_child_status +ap_update_child_status_from_indexes +ap_get_scoreboard_worker +ap_get_scoreboard_process +ap_get_scoreboard_global +ap_hook_pre_mpm +ap_hook_get_pre_mpm +ap_run_pre_mpm +ap_get_brigade +ap_pass_brigade +ap_register_input_filter +ap_register_output_filter +ap_add_input_filter +ap_add_input_filter_handle +ap_get_input_filter_handle +ap_add_output_filter +ap_add_output_filter_handle +ap_get_output_filter_handle +ap_remove_input_filter +ap_remove_output_filter +ap_save_brigade +ap_filter_flush +ap_fflush +ap_fputstrs +ap_fprintf +ap_md5 +ap_md5_binary +ap_md5contextTo64 +ap_md5digest +ap_create_environment +ap_find_path_info +ap_add_cgi_vars +ap_add_common_vars +ap_scan_script_header_err +ap_scan_script_header_err_brigade +ap_scan_script_header_err_strs +ap_scan_script_header_err_core +ap_explode_recent_localtime +ap_explode_recent_gmt +ap_recent_ctime +ap_recent_rfc822_date +ap_xml_parse_input +ap_basic_http_header +ap_send_http_trace +ap_send_http_options +ap_hook_get_suexec_identity +ap_hook_get_get_suexec_identity +ap_run_get_suexec_identity +unixd_setup_child +unixd_pre_config +unixd_set_user +unixd_set_group +unixd_set_rlimit +unixd_set_proc_mutex_perms +unixd_set_global_mutex_perms +unixd_accept +apu_version +apu_version_string +ap_listeners +ap_top_module +ap_prelinked_modules +ap_preloaded_modules +ap_loaded_modules +ap_bucket_type_eoc +core_module +ap_subreq_core_filter_handle +ap_core_output_filter_handle +ap_content_length_filter_handle +ap_net_time_filter_handle +ap_core_input_filter_handle +ap_server_argv0 +ap_server_root +ap_server_pre_read_config +ap_server_post_read_config +ap_server_config_defines +ap_old_write_func +ap_bucket_type_error +ap_scoreboard_image +ap_scoreboard_fname +ap_extended_status +ap_my_generation +ap_conftree +ap_http_input_filter_handle +ap_http_header_filter_handle +ap_chunk_filter_handle +ap_byterange_filter_handle +unixd_config diff --git a/rubbos/app/httpd-2.0.64/server/libmain.la b/rubbos/app/httpd-2.0.64/server/libmain.la new file mode 100644 index 00000000..88fb990a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/libmain.la @@ -0,0 +1,35 @@ +# libmain.la - a libtool library file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='' + +# Names of this library. +library_names='' + +# The name of the static archive. +old_library='libmain.a' + +# Libraries that this one depends upon. +dependency_libs=' -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib' + +# Version information for libmain. +current= +age= +revision= + +# Is this an already installed library? +installed=no + +# Should we warn about portability when linking against -modules? +shouldnotlink=no + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='' diff --git a/rubbos/app/httpd-2.0.64/server/listen.c b/rubbos/app/httpd-2.0.64/server/listen.c new file mode 100644 index 00000000..32bc72a5 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/listen.c @@ -0,0 +1,494 @@ +/* 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. + */ + +#include "apr_network_io.h" +#include "apr_strings.h" + +#define APR_WANT_STRFUNC +#include "apr_want.h" + +#define CORE_PRIVATE +#include "ap_config.h" +#include "httpd.h" +#include "http_config.h" +#include "ap_listen.h" +#include "http_log.h" +#include "mpm.h" +#include "mpm_common.h" + +ap_listen_rec *ap_listeners = NULL; + +#if APR_HAVE_IPV6 +static int default_family = APR_UNSPEC; +#else +static int default_family = APR_INET; +#endif + +static ap_listen_rec *old_listeners; +static int ap_listenbacklog; +static int send_buffer_size; +static int receive_buffer_size; + +/* TODO: make_sock is just begging and screaming for APR abstraction */ +static apr_status_t make_sock(apr_pool_t *p, ap_listen_rec *server) +{ + apr_socket_t *s = server->sd; + int one = 1; +#if APR_HAVE_IPV6 +#ifdef AP_ENABLE_V4_MAPPED + int v6only_setting = 0; +#else + int v6only_setting = 1; +#endif +#endif + apr_status_t stat; + +#ifndef WIN32 + stat = apr_socket_opt_set(s, APR_SO_REUSEADDR, one); + if (stat != APR_SUCCESS && stat != APR_ENOTIMPL) { + ap_log_perror(APLOG_MARK, APLOG_CRIT, stat, p, + "make_sock: for address %pI, apr_socket_opt_set: (SO_REUSEADDR)", + server->bind_addr); + apr_socket_close(s); + return stat; + } +#endif + + stat = apr_socket_opt_set(s, APR_SO_KEEPALIVE, one); + if (stat != APR_SUCCESS && stat != APR_ENOTIMPL) { + ap_log_perror(APLOG_MARK, APLOG_CRIT, stat, p, + "make_sock: for address %pI, apr_socket_opt_set: (SO_KEEPALIVE)", + server->bind_addr); + apr_socket_close(s); + return stat; + } + +#if APR_HAVE_IPV6 + if (server->bind_addr->family == APR_INET6) { + stat = apr_socket_opt_set(s, APR_IPV6_V6ONLY, v6only_setting); + if (stat != APR_SUCCESS && stat != APR_ENOTIMPL) { + ap_log_perror(APLOG_MARK, APLOG_CRIT, stat, p, + "make_sock: for address %pI, apr_socket_opt_set: " + "(IPV6_V6ONLY)", + server->bind_addr); + apr_socket_close(s); + return stat; + } + } +#endif + + /* + * To send data over high bandwidth-delay connections at full + * speed we must force the TCP window to open wide enough to keep the + * pipe full. The default window size on many systems + * is only 4kB. Cross-country WAN connections of 100ms + * at 1Mb/s are not impossible for well connected sites. + * If we assume 100ms cross-country latency, + * a 4kB buffer limits throughput to 40kB/s. + * + * To avoid this problem I've added the SendBufferSize directive + * to allow the web master to configure send buffer size. + * + * The trade-off of larger buffers is that more kernel memory + * is consumed. YMMV, know your customers and your network! + * + * -John Heidemann 25-Oct-96 + * + * If no size is specified, use the kernel default. + */ + if (send_buffer_size) { + stat = apr_socket_opt_set(s, APR_SO_SNDBUF, send_buffer_size); + if (stat != APR_SUCCESS && stat != APR_ENOTIMPL) { + ap_log_perror(APLOG_MARK, APLOG_WARNING, stat, p, + "make_sock: failed to set SendBufferSize for " + "address %pI, using default", + server->bind_addr); + /* not a fatal error */ + } + } + if (receive_buffer_size) { + stat = apr_socket_opt_set(s, APR_SO_RCVBUF, receive_buffer_size); + if (stat != APR_SUCCESS && stat != APR_ENOTIMPL) { + ap_log_perror(APLOG_MARK, APLOG_WARNING, stat, p, + "make_sock: failed to set ReceiveBufferSize for " + "address %pI, using default", + server->bind_addr); + /* not a fatal error */ + } + } + +#if APR_TCP_NODELAY_INHERITED + ap_sock_disable_nagle(s); +#endif + + if ((stat = apr_bind(s, server->bind_addr)) != APR_SUCCESS) { + ap_log_perror(APLOG_MARK, APLOG_STARTUP|APLOG_CRIT, stat, p, + "make_sock: could not bind to address %pI", + server->bind_addr); + apr_socket_close(s); + return stat; + } + + if ((stat = apr_listen(s, ap_listenbacklog)) != APR_SUCCESS) { + ap_log_perror(APLOG_MARK, APLOG_STARTUP|APLOG_ERR, stat, p, + "make_sock: unable to listen for connections " + "on address %pI", + server->bind_addr); + apr_socket_close(s); + return stat; + } + +#ifdef WIN32 + /* I seriously doubt that this would work on Unix; I have doubts that + * it entirely solves the problem on Win32. However, since setting + * reuseaddr on the listener -prior- to binding the socket has allowed + * us to attach to the same port as an already running instance of + * Apache, or even another web server, we cannot identify that this + * port was exclusively granted to this instance of Apache. + * + * So set reuseaddr, but do not attempt to do so until we have the + * parent listeners successfully bound. + */ + stat = apr_socket_opt_set(s, APR_SO_REUSEADDR, one); + if (stat != APR_SUCCESS && stat != APR_ENOTIMPL) { + ap_log_perror(APLOG_MARK, APLOG_CRIT, stat, p, + "make_sock: for address %pI, apr_socket_opt_set: (SO_REUSEADDR)", + server->bind_addr); + apr_socket_close(s); + return stat; + } +#endif + +#if APR_HAS_SO_ACCEPTFILTER +#ifndef ACCEPT_FILTER_NAME +#define ACCEPT_FILTER_NAME "httpready" +#ifdef __FreeBSD_version +#if __FreeBSD_version < 411000 /* httpready was broken before 4.1.1 */ +#undef ACCEPT_FILTER_NAME +#define ACCEPT_FILTER_NAME "dataready" +#endif +#endif +#endif + apr_socket_accept_filter(s, ACCEPT_FILTER_NAME, ""); +#endif + + server->sd = s; + server->active = 1; + +#ifdef MPM_ACCEPT_FUNC + server->accept_func = MPM_ACCEPT_FUNC; +#else + server->accept_func = NULL; +#endif + + return APR_SUCCESS; +} + +static apr_status_t close_listeners_on_exec(void *v) +{ + ap_listen_rec *lr; + + for (lr = ap_listeners; lr; lr = lr->next) { + apr_socket_close(lr->sd); + lr->active = 0; + } + + return APR_SUCCESS; +} + + +static void find_default_family(apr_pool_t *p) +{ +#if APR_HAVE_IPV6 + /* We know the platform supports IPv6, but this particular + * system may not have IPv6 enabled. See if we can get an + * AF_INET6 socket and bind to an ephemeral port. (On most + * systems, getting an AF_INET6 socket is a sufficient test. + * On certain levels of OpenUNIX, getting the socket is + * successful but bind always returns ENETUNREACH.) + */ + if (default_family == APR_UNSPEC) { + apr_status_t sock_rv; + apr_socket_t *tmp_sock; + apr_sockaddr_t *sa; + + if ((sock_rv = apr_socket_create(&tmp_sock, APR_INET6, SOCK_STREAM, p)) + == APR_SUCCESS && + apr_sockaddr_info_get(&sa, NULL, APR_INET6, 0, 0, p) == APR_SUCCESS && + apr_bind(tmp_sock, sa) == APR_SUCCESS) { + default_family = APR_INET6; + } + else { + default_family = APR_INET; + } + if (sock_rv == APR_SUCCESS) { + apr_socket_close(tmp_sock); + } + } +#endif +} + + +static const char *alloc_listener(process_rec *process, char *addr, apr_port_t port) +{ + ap_listen_rec **walk; + ap_listen_rec *new; + apr_status_t status; + apr_port_t oldport; + apr_sockaddr_t *sa; + + if (!addr) { /* don't bind to specific interface */ + find_default_family(process->pool); + switch(default_family) { + case APR_INET: + addr = "0.0.0.0"; + break; + +#if APR_HAVE_IPV6 + case APR_INET6: + addr = "::"; + break; +#endif + + default: + ap_assert(1 != 1); /* should not occur */ + } + } + + /* see if we've got an old listener for this address:port */ + for (walk = &old_listeners; *walk; walk = &(*walk)->next) { + sa = (*walk)->bind_addr; + /* Some listeners are not real so they will not have a bind_addr. */ + if (sa) { + apr_sockaddr_port_get(&oldport, sa); + if (!strcmp(sa->hostname, addr) && port == oldport) { + /* re-use existing record */ + new = *walk; + *walk = new->next; + new->next = ap_listeners; + ap_listeners = new; + return NULL; + } + } + } + + /* this has to survive restarts */ + new = apr_palloc(process->pool, sizeof(ap_listen_rec)); + new->active = 0; + if ((status = apr_sockaddr_info_get(&new->bind_addr, addr, APR_UNSPEC, + port, 0, process->pool)) + != APR_SUCCESS) { + ap_log_perror(APLOG_MARK, APLOG_CRIT, status, process->pool, + "alloc_listener: failed to set up sockaddr for %s", + addr); + return "Listen setup failed"; + } + if ((status = apr_socket_create(&new->sd, + new->bind_addr->family, + SOCK_STREAM, process->pool)) + != APR_SUCCESS) { + ap_log_perror(APLOG_MARK, APLOG_CRIT, status, process->pool, + "alloc_listener: failed to get a socket for %s", addr); + return "Listen setup failed"; + } + + new->next = ap_listeners; + ap_listeners = new; + return NULL; +} + +static int ap_listen_open(apr_pool_t *pool, apr_port_t port) +{ + ap_listen_rec *lr; + ap_listen_rec *next; + int num_open; + const char *userdata_key = "ap_listen_open"; + void *data; + + /* Don't allocate a default listener. If we need to listen to a + * port, then the user needs to have a Listen directive in their + * config file. + */ + num_open = 0; + for (lr = ap_listeners; lr; lr = lr->next) { + if (lr->active) { + ++num_open; + } + else { + if (make_sock(pool, lr) == APR_SUCCESS) { + ++num_open; + lr->active = 1; + } + else { + /* fatal error */ + return -1; + } + } + } + + /* close the old listeners */ + for (lr = old_listeners; lr; lr = next) { + apr_socket_close(lr->sd); + lr->active = 0; + next = lr->next; + } + old_listeners = NULL; + +#if AP_NONBLOCK_WHEN_MULTI_LISTEN + /* if multiple listening sockets, make them non-blocking so that + * if select()/poll() reports readability for a reset connection that + * is already forgotten about by the time we call accept, we won't + * be hung until another connection arrives on that port + */ + if (ap_listeners && ap_listeners->next) { + for (lr = ap_listeners; lr; lr = lr->next) { + apr_status_t status; + + status = apr_socket_opt_set(lr->sd, APR_SO_NONBLOCK, 1); + if (status != APR_SUCCESS) { + ap_log_perror(APLOG_MARK, APLOG_STARTUP|APLOG_ERR, status, pool, + "ap_listen_open: unable to make socket non-blocking"); + return -1; + } + } + } +#endif /* AP_NONBLOCK_WHEN_MULTI_LISTEN */ + + /* we come through here on both passes of the open logs phase + * only register the cleanup once... otherwise we try to close + * listening sockets twice when cleaning up prior to exec + */ + apr_pool_userdata_get(&data, userdata_key, pool); + if (!data) { + apr_pool_userdata_set((const void *)1, userdata_key, + apr_pool_cleanup_null, pool); + apr_pool_cleanup_register(pool, NULL, apr_pool_cleanup_null, + close_listeners_on_exec); + } + + return num_open ? 0 : -1; +} + +int ap_setup_listeners(server_rec *s) +{ + ap_listen_rec *lr; + int num_listeners = 0; + + if (ap_listen_open(s->process->pool, s->port)) { + return 0; + } + + for (lr = ap_listeners; lr; lr = lr->next) { + num_listeners++; + } + + return num_listeners; +} + +void ap_listen_pre_config(void) +{ + old_listeners = ap_listeners; + ap_listeners = NULL; + ap_listenbacklog = DEFAULT_LISTENBACKLOG; +} + + +const char *ap_set_listener(cmd_parms *cmd, void *dummy, const char *ips) +{ + char *host, *scope_id; + apr_port_t port; + apr_status_t rv; + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + + if (err != NULL) { + return err; + } + + rv = apr_parse_addr_port(&host, &scope_id, &port, ips, cmd->pool); + if (rv != APR_SUCCESS) { + return "Invalid address or port"; + } + + if (host && !strcmp(host, "*")) { + host = NULL; + } + + if (scope_id) { + /* XXX scope id support is useful with link-local IPv6 addresses */ + return "Scope id is not supported"; + } + + if (!port) { + return "Port must be specified"; + } + + return alloc_listener(cmd->server->process, host, port); +} + +const char *ap_set_listenbacklog(cmd_parms *cmd, void *dummy, const char *arg) +{ + int b; + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + + if (err != NULL) { + return err; + } + + b = atoi(arg); + if (b < 1) { + return "ListenBacklog must be > 0"; + } + + ap_listenbacklog = b; + return NULL; +} + +const char *ap_set_send_buffer_size(cmd_parms *cmd, void *dummy, + const char *arg) +{ + int s = atoi(arg); + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + + if (err != NULL) { + return err; + } + + if (s < 512 && s != 0) { + return "SendBufferSize must be >= 512 bytes, or 0 for system default."; + } + + send_buffer_size = s; + return NULL; +} + +AP_DECLARE_NONSTD(const char *) ap_set_receive_buffer_size(cmd_parms *cmd, + void *dummy, + const char *arg) +{ + int s = atoi(arg); + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + + if (err != NULL) { + return err; + } + + if (s < 512 && s != 0) { + return "ReceiveBufferSize must be >= 512 bytes, or 0 for system default."; + } + + receive_buffer_size = s; + return NULL; +} diff --git a/rubbos/app/httpd-2.0.64/server/listen.lo b/rubbos/app/httpd-2.0.64/server/listen.lo new file mode 100644 index 00000000..a87ac3b7 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/listen.lo @@ -0,0 +1,12 @@ +# listen.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/listen.o' + +# Name of the non-PIC object. +non_pic_object='listen.o' + diff --git a/rubbos/app/httpd-2.0.64/server/listen.o b/rubbos/app/httpd-2.0.64/server/listen.o new file mode 100644 index 0000000000000000000000000000000000000000..3e769684a00e92027b1bc7175aab15dfcfd55633 GIT binary patch literal 37360 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 KK1* +#endif +#if APR_HAVE_UNISTD_H +#include +#endif + +#define CORE_PRIVATE + +#include "ap_config.h" +#include "httpd.h" +#include "http_config.h" +#include "http_core.h" +#include "http_log.h" +#include "http_main.h" +#include "util_time.h" +#include "ap_mpm.h" + +#ifndef APR_LARGEFILE +#define APR_LARGEFILE 0 +#endif + +typedef struct { + char *t_name; + int t_val; +} TRANS; + +APR_HOOK_STRUCT( + APR_HOOK_LINK(error_log) +) + +int AP_DECLARE_DATA ap_default_loglevel = DEFAULT_LOGLEVEL; + +#ifdef HAVE_SYSLOG + +static const TRANS facilities[] = { + {"auth", LOG_AUTH}, +#ifdef LOG_AUTHPRIV + {"authpriv",LOG_AUTHPRIV}, +#endif +#ifdef LOG_CRON + {"cron", LOG_CRON}, +#endif +#ifdef LOG_DAEMON + {"daemon", LOG_DAEMON}, +#endif +#ifdef LOG_FTP + {"ftp", LOG_FTP}, +#endif +#ifdef LOG_KERN + {"kern", LOG_KERN}, +#endif +#ifdef LOG_LPR + {"lpr", LOG_LPR}, +#endif +#ifdef LOG_MAIL + {"mail", LOG_MAIL}, +#endif +#ifdef LOG_NEWS + {"news", LOG_NEWS}, +#endif +#ifdef LOG_SYSLOG + {"syslog", LOG_SYSLOG}, +#endif +#ifdef LOG_USER + {"user", LOG_USER}, +#endif +#ifdef LOG_UUCP + {"uucp", LOG_UUCP}, +#endif +#ifdef LOG_LOCAL0 + {"local0", LOG_LOCAL0}, +#endif +#ifdef LOG_LOCAL1 + {"local1", LOG_LOCAL1}, +#endif +#ifdef LOG_LOCAL2 + {"local2", LOG_LOCAL2}, +#endif +#ifdef LOG_LOCAL3 + {"local3", LOG_LOCAL3}, +#endif +#ifdef LOG_LOCAL4 + {"local4", LOG_LOCAL4}, +#endif +#ifdef LOG_LOCAL5 + {"local5", LOG_LOCAL5}, +#endif +#ifdef LOG_LOCAL6 + {"local6", LOG_LOCAL6}, +#endif +#ifdef LOG_LOCAL7 + {"local7", LOG_LOCAL7}, +#endif + {NULL, -1}, +}; +#endif + +static const TRANS priorities[] = { + {"emerg", APLOG_EMERG}, + {"alert", APLOG_ALERT}, + {"crit", APLOG_CRIT}, + {"error", APLOG_ERR}, + {"warn", APLOG_WARNING}, + {"notice", APLOG_NOTICE}, + {"info", APLOG_INFO}, + {"debug", APLOG_DEBUG}, + {NULL, -1}, +}; + +static apr_pool_t *stderr_pool = NULL; + +static apr_file_t *stderr_log = NULL; + +/* track pipe handles to close in child process */ +typedef struct read_handle_t { + struct read_handle_t *next; + apr_file_t *handle; +} read_handle_t; + +static read_handle_t *read_handles; + +/* clear_handle_list() is called when plog is cleared; at that + * point we need to forget about our old list of pipe read + * handles. We let the plog cleanups close the actual pipes. + */ +static apr_status_t clear_handle_list(void *v) +{ + read_handles = NULL; + return APR_SUCCESS; +} + +/* remember to close this handle in the child process + * + * On Win32 this makes zero sense, because we don't + * take the parent process's child procs. + * If the win32 parent instead passed each and every + * logger write handle from itself down to the child, + * and the parent manages all aspects of keeping the + * reliable pipe log children alive, this would still + * make no sense :) Cripple it on Win32. + */ +static void close_handle_in_child(apr_pool_t *p, apr_file_t *f) +{ +#ifndef WIN32 + read_handle_t *new_handle; + + new_handle = apr_pcalloc(p, sizeof(read_handle_t)); + new_handle->next = read_handles; + new_handle->handle = f; + read_handles = new_handle; +#endif +} + +void ap_logs_child_init(apr_pool_t *p, server_rec *s) +{ + read_handle_t *cur = read_handles; + + while (cur) { + apr_file_close(cur->handle); + cur = cur->next; + } +} + +AP_DECLARE(void) ap_open_stderr_log(apr_pool_t *p) +{ + apr_file_open_stderr(&stderr_log, p); +} + +AP_DECLARE(apr_status_t) ap_replace_stderr_log(apr_pool_t *p, + const char *fname) +{ + apr_file_t *stderr_file; + apr_status_t rc; + char *filename = ap_server_root_relative(p, fname); + if (!filename) { + ap_log_error(APLOG_MARK, APLOG_STARTUP|APLOG_CRIT, + APR_EBADPATH, NULL, "Invalid -E error log file %s", + fname); + return APR_EBADPATH; + } + if ((rc = apr_file_open(&stderr_file, filename, + APR_APPEND | APR_WRITE | APR_CREATE | APR_LARGEFILE, + APR_OS_DEFAULT, p)) != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, rc, NULL, + "%s: could not open error log file %s.", + ap_server_argv0, fname); + return rc; + } + if (!stderr_pool) { + /* This is safe provided we revert it when we are finished. + * We don't manager the callers pool! + */ + stderr_pool = p; + } + if ((rc = apr_file_open_stderr(&stderr_log, stderr_pool)) + == APR_SUCCESS) { + apr_file_flush(stderr_log); + if ((rc = apr_file_dup2(stderr_log, stderr_file, stderr_pool)) + == APR_SUCCESS) { + apr_file_close(stderr_file); + /* + * You might ponder why stderr_pool should survive? + * The trouble is, stderr_pool may have s_main->error_log, + * so we aren't in a position to destory stderr_pool until + * the next recycle. There's also an apparent bug which + * is not; if some folk decided to call this function before + * the core open error logs hook, this pool won't survive. + * Neither does the stderr logger, so this isn't a problem. + */ + } + } + /* Revert, see above */ + if (stderr_pool == p) + stderr_pool = NULL; + + if (rc != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_CRIT, rc, NULL, + "unable to replace stderr with error log file"); + } + return rc; +} + +static void log_child_errfn(apr_pool_t *pool, apr_status_t err, + const char *description) +{ + ap_log_error(APLOG_MARK, APLOG_ERR, err, NULL, + "%s", description); +} + +/* Create a child process running PROGNAME with a pipe connected to + * the childs stdin. The write-end of the pipe will be placed in + * *FPIN on successful return. If dummy_stderr is non-zero, the + * stderr for the child will be the same as the stdout of the parent. + * Otherwise the child will inherit the stderr from the parent. */ +static int log_child(apr_pool_t *p, const char *progname, + apr_file_t **fpin, int dummy_stderr) +{ + /* Child process code for 'ErrorLog "|..."'; + * may want a common framework for this, since I expect it will + * be common for other foo-loggers to want this sort of thing... + */ + apr_status_t rc; + apr_procattr_t *procattr; + apr_proc_t *procnew; + apr_file_t *outfile, *errfile; + + if (((rc = apr_procattr_create(&procattr, p)) == APR_SUCCESS) + && ((rc = apr_procattr_io_set(procattr, + APR_FULL_BLOCK, + APR_NO_PIPE, + APR_NO_PIPE)) == APR_SUCCESS) + && ((rc = apr_procattr_error_check_set(procattr, 1)) == APR_SUCCESS) + && ((rc = apr_procattr_child_errfn_set(procattr, log_child_errfn)) + == APR_SUCCESS)) { + char **args; + const char *pname; + + apr_tokenize_to_argv(progname, &args, p); + pname = apr_pstrdup(p, args[0]); + procnew = (apr_proc_t *)apr_pcalloc(p, sizeof(*procnew)); + + if ((rc = apr_file_open_stdout(&outfile, p)) == APR_SUCCESS) { + rc = apr_procattr_child_out_set(procattr, outfile, NULL); + if (dummy_stderr) + rc = apr_procattr_child_err_set(procattr, outfile, NULL); + else if ((rc = apr_file_open_stderr(&errfile, p)) == APR_SUCCESS) + rc = apr_procattr_child_err_set(procattr, errfile, NULL); + } + + rc = apr_proc_create(procnew, pname, (const char * const *)args, + NULL, procattr, p); + + if (rc == APR_SUCCESS) { + apr_pool_note_subprocess(p, procnew, APR_KILL_AFTER_TIMEOUT); + (*fpin) = procnew->in; + /* read handle to pipe not kept open, so no need to call + * close_handle_in_child() + */ + } + } + + return rc; +} + +/* Open the error log for the given server_rec. If IS_MAIN is + * non-zero, s is the main server. */ +static int open_error_log(server_rec *s, int is_main, apr_pool_t *p) +{ + const char *fname; + int rc; + + if (*s->error_fname == '|') { + apr_file_t *dummy = NULL; + + /* Spawn a new child logger. If this is the main server_rec, + * the new child must use a dummy stderr since the current + * stderr might be a pipe to the old logger. Otherwise, the + * child inherits the parents stderr. */ + rc = log_child(p, s->error_fname + 1, &dummy, is_main); + if (rc != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, rc, NULL, + "Couldn't start ErrorLog process"); + return DONE; + } + + s->error_log = dummy; + } + +#ifdef HAVE_SYSLOG + else if (!strncasecmp(s->error_fname, "syslog", 6)) { + if ((fname = strchr(s->error_fname, ':'))) { + const TRANS *fac; + + fname++; + for (fac = facilities; fac->t_name; fac++) { + if (!strcasecmp(fname, fac->t_name)) { + openlog(ap_server_argv0, LOG_NDELAY|LOG_CONS|LOG_PID, + fac->t_val); + s->error_log = NULL; + return OK; + } + } + } + else { + openlog(ap_server_argv0, LOG_NDELAY|LOG_CONS|LOG_PID, LOG_LOCAL7); + } + + s->error_log = NULL; + } +#endif + else { + fname = ap_server_root_relative(p, s->error_fname); + if (!fname) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, APR_EBADPATH, NULL, + "%s: Invalid error log path %s.", + ap_server_argv0, s->error_fname); + return DONE; + } + if ((rc = apr_file_open(&s->error_log, fname, + APR_APPEND | APR_WRITE | APR_CREATE | APR_LARGEFILE, + APR_OS_DEFAULT, p)) != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, rc, NULL, + "%s: could not open error log file %s.", + ap_server_argv0, fname); + return DONE; + } + } + + return OK; +} + +int ap_open_logs(apr_pool_t *pconf, apr_pool_t *p /* plog */, + apr_pool_t *ptemp, server_rec *s_main) +{ + apr_pool_t *stderr_p; + server_rec *virt, *q; + int replace_stderr; + + + /* Register to throw away the read_handles list when we + * cleanup plog. Upon fork() for the apache children, + * this read_handles list is closed so only the parent + * can relaunch a lost log child. These read handles + * are always closed on exec. + * We won't care what happens to our stderr log child + * between log phases, so we don't mind losing stderr's + * read_handle a little bit early. + */ + apr_pool_cleanup_register(p, NULL, clear_handle_list, + apr_pool_cleanup_null); + + /* HERE we need a stdout log that outlives plog. + * We *presume* the parent of plog is a process + * or global pool which spans server restarts. + * Create our stderr_pool as a child of the plog's + * parent pool. + */ + apr_pool_create(&stderr_p, apr_pool_parent_get(p)); + apr_pool_tag(stderr_p, "stderr_pool"); + + if (open_error_log(s_main, 1, stderr_p) != OK) { + return DONE; + } + + replace_stderr = 1; + if (s_main->error_log) { + apr_status_t rv; + + /* Replace existing stderr with new log. */ + apr_file_flush(s_main->error_log); + rv = apr_file_dup2(stderr_log, s_main->error_log, stderr_p); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_CRIT, rv, s_main, + "unable to replace stderr with error_log"); + } + else { + /* We are done with stderr_pool, close it, killing + * the previous generation's stderr logger + */ + if (stderr_pool) + apr_pool_destroy(stderr_pool); + stderr_pool = stderr_p; + replace_stderr = 0; + /* + * Now that we have dup'ed s_main->error_log to stderr_log + * close it and set s_main->error_log to stderr_log. This avoids + * this fd being inherited by the next piped logger who would + * keep open the writing end of the pipe that this one uses + * as stdin. This in turn would prevent the piped logger from + * exiting. + */ + apr_file_close(s_main->error_log); + s_main->error_log = stderr_log; + } + } + /* note that stderr may still need to be replaced with something + * because it points to the old error log, or back to the tty + * of the submitter. + * XXX: This is BS - /dev/null is non-portable + */ + if (replace_stderr && freopen("/dev/null", "w", stderr) == NULL) { + ap_log_error(APLOG_MARK, APLOG_CRIT, errno, s_main, + "unable to replace stderr with /dev/null"); + } + + for (virt = s_main->next; virt; virt = virt->next) { + if (virt->error_fname) { + for (q=s_main; q != virt; q = q->next) { + if (q->error_fname != NULL + && strcmp(q->error_fname, virt->error_fname) == 0) { + break; + } + } + + if (q == virt) { + if (open_error_log(virt, 0, p) != OK) { + return DONE; + } + } + else { + virt->error_log = q->error_log; + } + } + else { + virt->error_log = s_main->error_log; + } + } + return OK; +} + +AP_DECLARE(void) ap_error_log2stderr(server_rec *s) { + apr_file_t *errfile = NULL; + + apr_file_open_stderr(&errfile, s->process->pool); + if (s->error_log != NULL) { + apr_file_dup2(s->error_log, errfile, s->process->pool); + } +} + +static void log_error_core(const char *file, int line, int level, + apr_status_t status, const server_rec *s, + const conn_rec *c, + const request_rec *r, apr_pool_t *pool, + const char *fmt, va_list args) +{ + char errstr[MAX_STRING_LEN]; +#ifndef AP_UNSAFE_ERROR_LOG_UNESCAPED + char scratch[MAX_STRING_LEN]; +#endif + apr_size_t len, errstrlen; + apr_file_t *logf = NULL; + const char *referer; + int level_and_mask = level & APLOG_LEVELMASK; + + if (r && r->connection) { + c = r->connection; + } + + if (s == NULL) { + /* + * If we are doing stderr logging (startup), don't log messages that are + * above the default server log level unless it is a startup/shutdown + * notice + */ + if ((level_and_mask != APLOG_NOTICE) + && (level_and_mask > ap_default_loglevel)) { + return; + } + + logf = stderr_log; + } + else if (s->error_log) { + /* + * If we are doing normal logging, don't log messages that are + * above the server log level unless it is a startup/shutdown notice + */ + if ((level_and_mask != APLOG_NOTICE) + && (level_and_mask > s->loglevel)) { + return; + } + + logf = s->error_log; + } +#ifdef TPF + else if (tpf_child) { + /* + * If we are doing normal logging, don't log messages that are + * above the server log level unless it is a startup/shutdown notice + */ + if ((level_and_mask != APLOG_NOTICE) + && (level_and_mask > s->loglevel)) { + return; + } + + logf = stderr; + } +#endif /* TPF */ + else { + /* + * If we are doing syslog logging, don't log messages that are + * above the server log level (including a startup/shutdown notice) + */ + if (level_and_mask > s->loglevel) { + return; + } + } + + if (logf && ((level & APLOG_STARTUP) != APLOG_STARTUP)) { + errstr[0] = '['; + ap_recent_ctime(errstr + 1, apr_time_now()); + errstr[1 + APR_CTIME_LEN - 1] = ']'; + errstr[1 + APR_CTIME_LEN ] = ' '; + len = 1 + APR_CTIME_LEN + 1; + } else { + len = 0; + } + + if ((level & APLOG_STARTUP) != APLOG_STARTUP) { + len += apr_snprintf(errstr + len, MAX_STRING_LEN - len, + "[%s] ", priorities[level_and_mask].t_name); + } + +#ifndef TPF + if (file && level_and_mask == APLOG_DEBUG) { +#if defined(_OSD_POSIX) || defined(WIN32) || defined(__MVS__) + char tmp[256]; + char *e = strrchr(file, '/'); +#ifdef WIN32 + if (!e) { + e = strrchr(file, '\\'); + } +#endif + + /* In OSD/POSIX, the compiler returns for __FILE__ + * a string like: __FILE__="*POSIX(/usr/include/stdio.h)" + * (it even returns an absolute path for sources in + * the current directory). Here we try to strip this + * down to the basename. + */ + if (e != NULL && e[1] != '\0') { + apr_snprintf(tmp, sizeof(tmp), "%s", &e[1]); + e = &tmp[strlen(tmp)-1]; + if (*e == ')') { + *e = '\0'; + } + file = tmp; + } +#else /* _OSD_POSIX || WIN32 */ + const char *p; + /* On Unix, __FILE__ may be an absolute path in a + * VPATH build. */ + if (file[0] == '/' && (p = ap_strrchr_c(file, '/')) != NULL) { + file = p + 1; + } +#endif /*_OSD_POSIX || WIN32 */ + len += apr_snprintf(errstr + len, MAX_STRING_LEN - len, + "%s(%d): ", file, line); + } +#endif /* TPF */ + + if (c) { + /* XXX: TODO: add a method of selecting whether logged client + * addresses are in dotted quad or resolved form... dotted + * quad is the most secure, which is why I'm implementing it + * first. -djg + */ + len += apr_snprintf(errstr + len, MAX_STRING_LEN - len, + "[client %s] ", c->remote_ip); + } + if (status != 0) { + if (status < APR_OS_START_EAIERR) { + len += apr_snprintf(errstr + len, MAX_STRING_LEN - len, + "(%d)", status); + } + else if (status < APR_OS_START_SYSERR) { + len += apr_snprintf(errstr + len, MAX_STRING_LEN - len, + "(EAI %d)", status - APR_OS_START_EAIERR); + } + else if (status < 100000 + APR_OS_START_SYSERR) { + len += apr_snprintf(errstr + len, MAX_STRING_LEN - len, + "(OS %d)", status - APR_OS_START_SYSERR); + } + else { + len += apr_snprintf(errstr + len, MAX_STRING_LEN - len, + "(os 0x%08x)", status - APR_OS_START_SYSERR); + } + apr_strerror(status, errstr + len, MAX_STRING_LEN - len); + len += strlen(errstr + len); + if (MAX_STRING_LEN - len > 2) { + errstr[len++] = ':'; + errstr[len++] = ' '; + errstr[len] = '\0'; + } + } + + errstrlen = len; +#ifndef AP_UNSAFE_ERROR_LOG_UNESCAPED + if (apr_vsnprintf(scratch, MAX_STRING_LEN - len, fmt, args)) { + len += ap_escape_errorlog_item(errstr + len, scratch, + MAX_STRING_LEN - len); + } +#else + len += apr_vsnprintf(errstr + len, MAX_STRING_LEN - len, fmt, args); +#endif + + if ( r && (referer = apr_table_get(r->headers_in, "Referer")) +#ifndef AP_UNSAFE_ERROR_LOG_UNESCAPED + && ap_escape_errorlog_item(scratch, referer, MAX_STRING_LEN - len) +#endif + ) { + len += apr_snprintf(errstr + len, MAX_STRING_LEN - len, + ", referer: %s", +#ifndef AP_UNSAFE_ERROR_LOG_UNESCAPED + scratch +#else + referer +#endif + ); + } + + /* NULL if we are logging to syslog */ + if (logf) { + /* Truncate for the terminator (as apr_snprintf does) */ + if (len > MAX_STRING_LEN - sizeof(APR_EOL_STR)) { + len = MAX_STRING_LEN - sizeof(APR_EOL_STR); + } + strcpy(errstr + len, APR_EOL_STR); + apr_file_puts(errstr, logf); + apr_file_flush(logf); + } +#ifdef HAVE_SYSLOG + else { + syslog(level_and_mask, "%s", errstr); + } +#endif + + ap_run_error_log(file, line, level, status, s, r, pool, errstr + errstrlen); +} + +AP_DECLARE(void) ap_log_error(const char *file, int line, int level, + apr_status_t status, const server_rec *s, + const char *fmt, ...) +{ + va_list args; + + va_start(args, fmt); + log_error_core(file, line, level, status, s, NULL, NULL, NULL, fmt, args); + va_end(args); +} + +AP_DECLARE(void) ap_log_perror(const char *file, int line, int level, + apr_status_t status, apr_pool_t *p, + const char *fmt, ...) +{ + va_list args; + + va_start(args, fmt); + log_error_core(file, line, level, status, NULL, NULL, NULL, p, fmt, args); + va_end(args); +} + +AP_DECLARE(void) ap_log_rerror(const char *file, int line, int level, + apr_status_t status, const request_rec *r, + const char *fmt, ...) +{ + va_list args; + + va_start(args, fmt); + log_error_core(file, line, level, status, r->server, NULL, r, NULL, fmt, + args); + + /* + * IF APLOG_TOCLIENT is set, + * AND the error level is 'warning' or more severe, + * AND there isn't already error text associated with this request, + * THEN make the message text available to ErrorDocument and + * other error processors. + */ + va_end(args); + va_start(args,fmt); + if ((level & APLOG_TOCLIENT) + && ((level & APLOG_LEVELMASK) <= APLOG_WARNING) + && (apr_table_get(r->notes, "error-notes") == NULL)) { + apr_table_setn(r->notes, "error-notes", + ap_escape_html(r->pool, apr_pvsprintf(r->pool, fmt, + args))); + } + va_end(args); +} + +AP_DECLARE(void) ap_log_cerror(const char *file, int line, int level, + apr_status_t status, const conn_rec *c, + const char *fmt, ...) +{ + va_list args; + + va_start(args, fmt); + log_error_core(file, line, level, status, c->base_server, c, NULL, NULL, + fmt, args); + va_end(args); +} + +AP_DECLARE(void) ap_log_pid(apr_pool_t *p, const char *filename) +{ + apr_file_t *pid_file = NULL; + apr_finfo_t finfo; + static pid_t saved_pid = -1; + pid_t mypid; + apr_status_t rv; + const char *fname; + + if (!filename) { + return; + } + + fname = ap_server_root_relative(p, filename); + if (!fname) { + ap_log_error(APLOG_MARK, APLOG_STARTUP|APLOG_CRIT, APR_EBADPATH, + NULL, "Invalid PID file path %s, ignoring.", filename); + return; + } + + mypid = getpid(); + if (mypid != saved_pid + && apr_stat(&finfo, fname, APR_FINFO_MTIME, p) == APR_SUCCESS) { + /* AP_SIG_GRACEFUL and HUP call this on each restart. + * Only warn on first time through for this pid. + * + * XXX: Could just write first time through too, although + * that may screw up scripts written to do something + * based on the last modification time of the pid file. + */ + ap_log_perror(APLOG_MARK, APLOG_WARNING, 0, p, + apr_psprintf(p, "pid file %s overwritten -- Unclean " + "shutdown of previous Apache run?", + fname)); + } + + if ((rv = apr_file_open(&pid_file, fname, + APR_WRITE | APR_CREATE | APR_TRUNCATE, + APR_UREAD | APR_UWRITE | APR_GREAD | APR_WREAD, p)) + != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, NULL, + "could not create %s", fname); + ap_log_error(APLOG_MARK, APLOG_ERR, 0, NULL, + "%s: could not log pid to file %s", + ap_server_argv0, fname); + exit(1); + } + apr_file_printf(pid_file, "%ld" APR_EOL_STR, (long)mypid); + apr_file_close(pid_file); + saved_pid = mypid; +} + +AP_DECLARE(apr_status_t) ap_read_pid(apr_pool_t *p, const char *filename, + pid_t *mypid) +{ + const apr_size_t BUFFER_SIZE = sizeof(long) * 3 + 2; /* see apr_ltoa */ + apr_file_t *pid_file = NULL; + apr_status_t rv; + const char *fname; + char *buf, *endptr; + apr_size_t bytes_read; + + if (!filename) { + return APR_EGENERAL; + } + + fname = ap_server_root_relative(p, filename); + if (!fname) { + ap_log_error(APLOG_MARK, APLOG_STARTUP|APLOG_CRIT, APR_EBADPATH, + NULL, "Invalid PID file path %s, ignoring.", filename); + return APR_EGENERAL; + } + + rv = apr_file_open(&pid_file, fname, APR_READ, APR_OS_DEFAULT, p); + if (rv != APR_SUCCESS) { + return rv; + } + + /* Ensure null-termination, so that strtol doesn't go crazy. */ + buf = apr_palloc(p, BUFFER_SIZE); + buf[BUFFER_SIZE - 1] = '\0'; + + rv = apr_file_read_full(pid_file, buf, BUFFER_SIZE - 1, &bytes_read); + if (rv != APR_SUCCESS && rv != APR_EOF) { + return rv; + } + + /* If we fill the buffer, we're probably reading a corrupt pid file. + * To be nice, let's also ensure the first char is a digit. */ + if (bytes_read == BUFFER_SIZE - 1 || !apr_isdigit(*buf)) { + return APR_EGENERAL; + } + + *mypid = strtol(buf, &endptr, 10); + + apr_file_close(pid_file); + return APR_SUCCESS; +} + +AP_DECLARE(void) ap_log_assert(const char *szExp, const char *szFile, + int nLine) +{ + char time_str[APR_CTIME_LEN]; + + apr_ctime(time_str, apr_time_now()); + ap_log_error(APLOG_MARK, APLOG_CRIT, 0, NULL, + "[%s] file %s, line %d, assertion \"%s\" failed", + time_str, szFile, nLine, szExp); +#if defined(WIN32) + DebugBreak(); +#else + /* unix assert does an abort leading to a core dump */ + abort(); +#endif +} + +/* piped log support */ + +#ifdef AP_HAVE_RELIABLE_PIPED_LOGS +/* forward declaration */ +static void piped_log_maintenance(int reason, void *data, apr_wait_t status); + +/* Spawn the piped logger process pl->program. */ +static apr_status_t piped_log_spawn(piped_log *pl) +{ + apr_procattr_t *procattr; + apr_proc_t *procnew = NULL; + apr_status_t status; + + if (((status = apr_procattr_create(&procattr, pl->p)) != APR_SUCCESS) || + ((status = apr_procattr_child_in_set(procattr, + ap_piped_log_read_fd(pl), + ap_piped_log_write_fd(pl))) + != APR_SUCCESS) || + ((status = apr_procattr_child_errfn_set(procattr, log_child_errfn)) + != APR_SUCCESS) || + ((status = apr_procattr_error_check_set(procattr, 1)) != APR_SUCCESS)) { + char buf[120]; + /* Something bad happened, give up and go away. */ + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "piped_log_spawn: unable to setup child process '%s': %s", + pl->program, apr_strerror(status, buf, sizeof(buf))); + } + else { + char **args; + const char *pname; + apr_file_t *outfile, *errfile; + + if ((status = apr_file_open_stdout(&outfile, pl->p)) == APR_SUCCESS) + status = apr_procattr_child_out_set(procattr, outfile, NULL); + if ((status = apr_file_open_stderr(&errfile, pl->p)) == APR_SUCCESS) + status = apr_procattr_child_err_set(procattr, errfile, NULL); + + apr_tokenize_to_argv(pl->program, &args, pl->p); + pname = apr_pstrdup(pl->p, args[0]); + procnew = apr_pcalloc(pl->p, sizeof(apr_proc_t)); + status = apr_proc_create(procnew, pname, (const char * const *) args, + NULL, procattr, pl->p); + + if (status == APR_SUCCESS) { + pl->pid = procnew; + /* procnew->in was dup2'd from ap_piped_log_write_fd(pl); + * since the original fd is still valid, close the copy to + * avoid a leak. */ + apr_file_close(procnew->in); + procnew->in = NULL; + apr_proc_other_child_register(procnew, piped_log_maintenance, pl, + ap_piped_log_write_fd(pl), pl->p); + close_handle_in_child(pl->p, ap_piped_log_read_fd(pl)); + } + else { + char buf[120]; + /* Something bad happened, give up and go away. */ + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "unable to start piped log program '%s': %s", + pl->program, apr_strerror(status, buf, sizeof(buf))); + } + } + + return status; +} + + +static void piped_log_maintenance(int reason, void *data, apr_wait_t status) +{ + piped_log *pl = data; + apr_status_t stats; + int mpm_state; + + switch (reason) { + case APR_OC_REASON_DEATH: + case APR_OC_REASON_LOST: + pl->pid = NULL; /* in case we don't get it going again, this + * tells other logic not to try to kill it + */ + apr_proc_other_child_unregister(pl); + stats = ap_mpm_query(AP_MPMQ_MPM_STATE, &mpm_state); + if (stats != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "can't query MPM state; not restarting " + "piped log program '%s'", + pl->program); + } + else if (mpm_state != AP_MPMQ_STOPPING) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "piped log program '%s' failed unexpectedly", + pl->program); + if ((stats = piped_log_spawn(pl)) != APR_SUCCESS) { + /* what can we do? This could be the error log we're having + * problems opening up... */ + char buf[120]; + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "piped_log_maintenance: unable to respawn '%s': %s", + pl->program, apr_strerror(stats, buf, sizeof(buf))); + } + } + break; + + case APR_OC_REASON_UNWRITABLE: + /* We should not kill off the pipe here, since it may only be full. + * If it really is locked, we should kill it off manually. */ + break; + + case APR_OC_REASON_RESTART: + if (pl->pid != NULL) { + apr_proc_kill(pl->pid, SIGTERM); + pl->pid = NULL; + } + break; + + case APR_OC_REASON_UNREGISTER: + break; + } +} + + +static apr_status_t piped_log_cleanup_for_exec(void *data) +{ + piped_log *pl = data; + + apr_file_close(ap_piped_log_read_fd(pl)); + apr_file_close(ap_piped_log_write_fd(pl)); + return APR_SUCCESS; +} + + +static apr_status_t piped_log_cleanup(void *data) +{ + piped_log *pl = data; + + if (pl->pid != NULL) { + apr_proc_kill(pl->pid, SIGTERM); + } + return piped_log_cleanup_for_exec(data); +} + + +AP_DECLARE(piped_log *) ap_open_piped_log(apr_pool_t *p, const char *program) +{ + piped_log *pl; + + pl = apr_palloc(p, sizeof (*pl)); + pl->p = p; + pl->program = apr_pstrdup(p, program); + pl->pid = NULL; + if (apr_file_pipe_create(&ap_piped_log_read_fd(pl), + &ap_piped_log_write_fd(pl), p) != APR_SUCCESS) { + return NULL; + } + apr_pool_cleanup_register(p, pl, piped_log_cleanup, + piped_log_cleanup_for_exec); + if (piped_log_spawn(pl) != APR_SUCCESS) { + apr_pool_cleanup_kill(p, pl, piped_log_cleanup); + apr_file_close(ap_piped_log_read_fd(pl)); + apr_file_close(ap_piped_log_write_fd(pl)); + return NULL; + } + return pl; +} + +#else /* !AP_HAVE_RELIABLE_PIPED_LOGS */ + +static apr_status_t piped_log_cleanup(void *data) +{ + piped_log *pl = data; + + apr_file_close(ap_piped_log_write_fd(pl)); + return APR_SUCCESS; +} + +AP_DECLARE(piped_log *) ap_open_piped_log(apr_pool_t *p, const char *program) +{ + piped_log *pl; + apr_file_t *dummy = NULL; + int rc; + + rc = log_child(p, program, &dummy, 0); + if (rc != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, rc, NULL, + "Couldn't start piped log process"); + return NULL; + } + + pl = apr_palloc(p, sizeof (*pl)); + pl->p = p; + ap_piped_log_read_fd(pl) = NULL; + ap_piped_log_write_fd(pl) = dummy; + apr_pool_cleanup_register(p, pl, piped_log_cleanup, piped_log_cleanup); + + return pl; +} + +#endif + +AP_DECLARE(void) ap_close_piped_log(piped_log *pl) +{ + apr_pool_cleanup_run(pl->p, pl, piped_log_cleanup); +} + +AP_IMPLEMENT_HOOK_VOID(error_log, + (const char *file, int line, int level, + apr_status_t status, const server_rec *s, + const request_rec *r, apr_pool_t *pool, + const char *errstr), (file, line, level, + status, s, r, pool, errstr)) + diff --git a/rubbos/app/httpd-2.0.64/server/log.lo b/rubbos/app/httpd-2.0.64/server/log.lo new file mode 100644 index 00000000..efbcc123 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/log.lo @@ -0,0 +1,12 @@ +# log.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/log.o' + +# Name of the non-PIC object. +non_pic_object='log.o' + diff --git a/rubbos/app/httpd-2.0.64/server/log.o b/rubbos/app/httpd-2.0.64/server/log.o new file mode 100644 index 0000000000000000000000000000000000000000..d5f2ee135112dea8726c9c2749fc51e25ea8ef01 GIT binary patch literal 88288 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 /* and destroy all descendent pools */ + apr_terminate(); + exit(process_exit_value); +} + +static process_rec *init_process(int *argc, const char * const * *argv) +{ + process_rec *process; + apr_pool_t *cntx; + apr_status_t stat; + const char *failed = "apr_app_initialize()"; + + stat = apr_app_initialize(argc, argv, NULL); + if (stat == APR_SUCCESS) { + failed = "apr_pool_create()"; + stat = apr_pool_create(&cntx, NULL); + } + + if (stat != APR_SUCCESS) { + /* For all intents and purposes, this is impossibly unlikely, + * but APR doesn't exist yet, we can't use it for reporting + * these earliest two failures; + */ + char ctimebuff[APR_CTIME_LEN]; + apr_ctime(ctimebuff, apr_time_now()); + fprintf(stderr, "[%s] [crit] (%d) %s: %s failed " + "to initial context, exiting\n", + ctimebuff, stat, (*argv)[0], failed); + apr_terminate(); + exit(1); + } + + apr_pool_tag(cntx, "process"); + ap_open_stderr_log(cntx); + + /* Now we have initialized apr and our logger, no more + * exceptional error reporting required for the lifetime + * of this server process. + */ + + process = apr_palloc(cntx, sizeof(process_rec)); + process->pool = cntx; + + apr_pool_create(&process->pconf, process->pool); + apr_pool_tag(process->pconf, "pconf"); + process->argc = *argc; + process->argv = *argv; + process->short_name = apr_filepath_name_get((*argv)[0]); + return process; +} + +static void usage(process_rec *process) +{ + const char *bin = process->argv[0]; + char pad[MAX_STRING_LEN]; + unsigned i; + + for (i = 0; i < strlen(bin); i++) { + pad[i] = ' '; + } + + pad[i] = '\0'; + +#ifdef SHARED_CORE + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL , + "Usage: %s [-R directory] [-D name] [-d directory] [-f file]", + bin); +#else + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "Usage: %s [-D name] [-d directory] [-f file]", bin); +#endif + + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " %s [-C \"directive\"] [-c \"directive\"]", pad); + +#ifdef WIN32 + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " %s [-w] [-k start|restart|stop|shutdown]", pad); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " %s [-k install|config|uninstall] [-n service_name]", + pad); +#endif +#ifdef AP_MPM_WANT_SIGNAL_SERVER + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " %s [-k start|restart|graceful|stop]", + pad); +#endif + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " %s [-v] [-V] [-h] [-l] [-L] [-t] [-S]", pad); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "Options:"); + +#ifdef SHARED_CORE + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " -R directory : specify an alternate location for " + "shared object files"); +#endif + + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " -D name : define a name for use in " + " directives"); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " -d directory : specify an alternate initial " + "ServerRoot"); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " -f file : specify an alternate ServerConfigFile"); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " -C \"directive\" : process directive before reading " + "config files"); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " -c \"directive\" : process directive after reading " + "config files"); + +#ifdef NETWARE + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " -n name : set screen name"); +#endif +#ifdef WIN32 + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " -n name : set service name and use its " + "ServerConfigFile"); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " -k start : tell Apache to start"); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " -k restart : tell running Apache to do a graceful " + "restart"); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " -k stop|shutdown : tell running Apache to shutdown"); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " -k install : install an Apache service"); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " -k config : change startup Options of an Apache " + "service"); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " -k uninstall : uninstall an Apache service"); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " -w : hold open the console window on error"); +#endif + + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " -e level : show startup errors of level " + "(see LogLevel)"); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " -E file : log startup errors to file"); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " -v : show version number"); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " -V : show compile settings"); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " -h : list available command line options " + "(this page)"); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " -l : list compiled in modules"); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " -L : list available configuration " + "directives"); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " -t -D DUMP_VHOSTS : show parsed settings (currently only " + "vhost settings)"); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " -S : a synonym for -t -D DUMP_VHOSTS"); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " -t : run syntax check for config files"); + + destroy_and_exit_process(process, 1); +} + +int main(int argc, const char * const argv[]) +{ + char c; + int configtestonly = 0; + const char *confname = SERVER_CONFIG_FILE; + const char *def_server_root = HTTPD_ROOT; + const char *temp_error_log = NULL; + process_rec *process; + server_rec *server_conf; + apr_pool_t *pglobal; + apr_pool_t *pconf; + apr_pool_t *plog; /* Pool of log streams, reset _after_ each read of conf */ + apr_pool_t *ptemp; /* Pool for temporary config stuff, reset often */ + apr_pool_t *pcommands; /* Pool for -D, -C and -c switches */ + apr_getopt_t *opt; + apr_status_t rv; + module **mod; + const char *optarg; + APR_OPTIONAL_FN_TYPE(ap_signal_server) *signal_server; + + AP_MONCONTROL(0); /* turn off profiling of startup */ + + process = init_process(&argc, &argv); + pglobal = process->pool; + pconf = process->pconf; + ap_server_argv0 = process->short_name; + +#if APR_CHARSET_EBCDIC + if (ap_init_ebcdic(pglobal) != APR_SUCCESS) { + destroy_and_exit_process(process, 1); + } +#endif + + apr_pool_create(&pcommands, pglobal); + apr_pool_tag(pcommands, "pcommands"); + ap_server_pre_read_config = apr_array_make(pcommands, 1, sizeof(char *)); + ap_server_post_read_config = apr_array_make(pcommands, 1, sizeof(char *)); + ap_server_config_defines = apr_array_make(pcommands, 1, sizeof(char *)); + + ap_setup_prelinked_modules(process); + + ap_run_rewrite_args(process); + + /* Maintain AP_SERVER_BASEARGS list in http_main.h to allow the MPM + * to safely pass on our args from its rewrite_args() handler. + */ + apr_getopt_init(&opt, pcommands, process->argc, process->argv); + + while ((rv = apr_getopt(opt, AP_SERVER_BASEARGS, &c, &optarg)) + == APR_SUCCESS) { + char **new; + + switch (c) { + case 'c': + new = (char **)apr_array_push(ap_server_post_read_config); + *new = apr_pstrdup(pcommands, optarg); + break; + + case 'C': + new = (char **)apr_array_push(ap_server_pre_read_config); + *new = apr_pstrdup(pcommands, optarg); + break; + + case 'd': + def_server_root = optarg; + break; + + case 'D': + new = (char **)apr_array_push(ap_server_config_defines); + *new = apr_pstrdup(pcommands, optarg); + break; + + case 'e': + if (strcasecmp(optarg, "emerg") == 0) { + ap_default_loglevel = APLOG_EMERG; + } + else if (strcasecmp(optarg, "alert") == 0) { + ap_default_loglevel = APLOG_ALERT; + } + else if (strcasecmp(optarg, "crit") == 0) { + ap_default_loglevel = APLOG_CRIT; + } + else if (strncasecmp(optarg, "err", 3) == 0) { + ap_default_loglevel = APLOG_ERR; + } + else if (strncasecmp(optarg, "warn", 4) == 0) { + ap_default_loglevel = APLOG_WARNING; + } + else if (strcasecmp(optarg, "notice") == 0) { + ap_default_loglevel = APLOG_NOTICE; + } + else if (strcasecmp(optarg, "info") == 0) { + ap_default_loglevel = APLOG_INFO; + } + else if (strcasecmp(optarg, "debug") == 0) { + ap_default_loglevel = APLOG_DEBUG; + } + else { + usage(process); + } + break; + + case 'E': + temp_error_log = apr_pstrdup(process->pool, optarg); + break; + + case 'X': + new = (char **)apr_array_push(ap_server_config_defines); + *new = "DEBUG"; + break; + + case 'f': + confname = optarg; + break; + + case 'v': + printf("Server version: %s\n", ap_get_server_version()); + printf("Server built: %s\n", ap_get_server_built()); + destroy_and_exit_process(process, 0); + + case 'V': + show_compile_settings(); + destroy_and_exit_process(process, 0); + + case 'l': + ap_show_modules(); + destroy_and_exit_process(process, 0); + + case 'L': + ap_show_directives(); + destroy_and_exit_process(process, 0); + + case 't': + configtestonly = 1; + break; + + case 'S': + configtestonly = 1; + new = (char **)apr_array_push(ap_server_config_defines); + *new = "DUMP_VHOSTS"; + break; + + case 'h': + case '?': + usage(process); + } + } + + /* bad cmdline option? then we die */ + if (rv != APR_EOF || opt->ind < opt->argc) { + usage(process); + } + + apr_pool_create(&plog, pglobal); + apr_pool_tag(plog, "plog"); + apr_pool_create(&ptemp, pconf); + apr_pool_tag(ptemp, "ptemp"); + + /* Note that we preflight the config file once + * before reading it _again_ in the main loop. + * This allows things, log files configuration + * for example, to settle down. + */ + + ap_server_root = def_server_root; + if (temp_error_log) { + ap_replace_stderr_log(process->pool, temp_error_log); + } + server_conf = ap_read_config(process, ptemp, confname, &ap_conftree); + if (ap_run_pre_config(pconf, plog, ptemp) != OK) { + ap_log_error(APLOG_MARK, APLOG_STARTUP |APLOG_ERR, 0, + NULL, "Pre-configuration failed"); + destroy_and_exit_process(process, 1); + } + + ap_process_config_tree(server_conf, ap_conftree, process->pconf, ptemp); + ap_fixup_virtual_hosts(pconf, server_conf); + ap_fini_vhost_config(pconf, server_conf); + apr_hook_sort_all(); + if (configtestonly) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, "Syntax OK"); + destroy_and_exit_process(process, 0); + } + + signal_server = APR_RETRIEVE_OPTIONAL_FN(ap_signal_server); + if (signal_server) { + int exit_status; + + if (signal_server(&exit_status, pconf) != 0) { + destroy_and_exit_process(process, exit_status); + } + } + + apr_pool_clear(plog); + + if ( ap_run_open_logs(pconf, plog, ptemp, server_conf) != OK) { + ap_log_error(APLOG_MARK, APLOG_STARTUP |APLOG_ERR, + 0, NULL, "Unable to open logs"); + destroy_and_exit_process(process, 1); + } + + if ( ap_run_post_config(pconf, plog, ptemp, server_conf) != OK) { + ap_log_error(APLOG_MARK, APLOG_STARTUP |APLOG_ERR, 0, + NULL, "Configuration Failed"); + destroy_and_exit_process(process, 1); + } + + apr_pool_destroy(ptemp); + + for (;;) { + apr_hook_deregister_all(); + apr_pool_clear(pconf); + + for (mod = ap_prelinked_modules; *mod != NULL; mod++) { + ap_register_hooks(*mod, pconf); + } + + /* This is a hack until we finish the code so that it only reads + * the config file once and just operates on the tree already in + * memory. rbb + */ + ap_conftree = NULL; + apr_pool_create(&ptemp, pconf); + apr_pool_tag(ptemp, "ptemp"); + ap_server_root = def_server_root; + server_conf = ap_read_config(process, ptemp, confname, &ap_conftree); + if (ap_run_pre_config(pconf, plog, ptemp) != OK) { + ap_log_error(APLOG_MARK, APLOG_STARTUP |APLOG_ERR, + 0, NULL, "Pre-configuration failed"); + destroy_and_exit_process(process, 1); + } + + ap_process_config_tree(server_conf, ap_conftree, process->pconf, ptemp); + ap_fixup_virtual_hosts(pconf, server_conf); + ap_fini_vhost_config(pconf, server_conf); + apr_hook_sort_all(); + apr_pool_clear(plog); + if (ap_run_open_logs(pconf, plog, ptemp, server_conf) != OK) { + ap_log_error(APLOG_MARK, APLOG_STARTUP |APLOG_ERR, + 0, NULL, "Unable to open logs"); + destroy_and_exit_process(process, 1); + } + + if (ap_run_post_config(pconf, plog, ptemp, server_conf) != OK) { + ap_log_error(APLOG_MARK, APLOG_STARTUP |APLOG_ERR, + 0, NULL, "Configuration Failed"); + destroy_and_exit_process(process, 1); + } + + apr_pool_destroy(ptemp); + apr_pool_lock(pconf, 1); + + ap_run_optional_fn_retrieve(); + + if (ap_mpm_run(pconf, plog, server_conf)) + break; + + apr_pool_lock(pconf, 0); + } + + apr_pool_lock(pconf, 0); + destroy_and_exit_process(process, 0); + + return 0; /* Termination 'ok' */ +} + +/* force Expat to be linked into the server executable */ +#if defined(USE_EXPAT) && !defined(SHARED_CORE_BOOTSTRAP) +#include "xmlparse.h" +const XML_LChar *suck_in_expat(void); +const XML_LChar *suck_in_expat(void) +{ + return XML_ErrorString(XML_ERROR_NONE); +} +#endif /* USE_EXPAT */ + +#ifndef SHARED_CORE_BOOTSTRAP +/* + * Force apr_password_validate() into the image so that modules like + * mod_auth can use it even if they're dynamically loaded. + */ +void suck_in_apr_password_validate(void); +void suck_in_apr_password_validate(void) +{ + apr_password_validate("a", "b"); +} +#endif + +#ifdef AP_USING_AUTOCONF +/* This ugly little hack pulls any function referenced in exports.c into + * the web server. exports.c is generated during the build, and it + * has all of the APR functions specified by the apr/apr.exports and + * apr-util/aprutil.exports files. + */ +const void *suck_in_APR(void); +const void *suck_in_APR(void) +{ + extern const void *ap_ugly_hack; + + return ap_ugly_hack; +} +#endif diff --git a/rubbos/app/httpd-2.0.64/server/main.lo b/rubbos/app/httpd-2.0.64/server/main.lo new file mode 100644 index 00000000..e79679ce --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/main.lo @@ -0,0 +1,12 @@ +# main.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/main.o' + +# Name of the non-PIC object. +non_pic_object='main.o' + diff --git a/rubbos/app/httpd-2.0.64/server/main.o b/rubbos/app/httpd-2.0.64/server/main.o new file mode 100644 index 0000000000000000000000000000000000000000..0602d80ae9e4a76ea73017724526340e37307c27 GIT binary patch literal 61080 zcmeIbd3@B>)j$6E%!Dv(NgxPOQ3hlQ2q6K)h%5;ZnP^yK6Wqp-OqP<(nF))vhzpj8 zD70FwwTi7)tF}ek$EuH2s&((;TD59x)mG73saxGD-}AoroSB=G85Mue^T+S?dag2a z@B5znzUQ8M?($jY=B%okV*@Dqj_jM%AN7rA> zS3^TXN&fKjj8x@{>aNc!msc)ZzO?N5$l3o0hdr-8vNdOPF=a=(&Kp%kK-uod*7-$| zZ7rh;YPN>o?4Li}dtlxnUN~~@eSS^XYn5Fu8s5lJ_r+hUD%)N5aM|uT56qiT;8os% zO70{I@9u+1?R$`{=^8c4$g`*`G+cxtT@$hjjsG%2C0|CURD`nWbJQ0J%;+Jo+qS3d zVcYE4TA*8Y+3ve5wE)cL+GO4r39SAif!G%bG=7ml^A`!M=_%m0p-r;OcBf6vme_3# z)gdBAz~&hbvDpd9W`-UDYn8y=>jluF%uu~`*4-rHz5eW{`}WCrxEmg7+;k6O+ap_h z;rqVjiQ2~4^zi6J_@s&R!fmy!u~R5kAFgkX$Lf;p@eN2egd3V$VyB=$*ajm%H$2jc zHLs10gj`)W0OH-`*Mt+v+IaHJc+7q`#%t?h4V^7#CX($PhP}J|T5ztwM-x6;@KJ-0 zBtDk1KCCt?hOg=2`dCAATP$2_8We75kB2)Gv2b%+ct&-@Je!B6&f;d0{t2Tk>USG& zNvDSs9kIIRh7IA`ws37rG8S*EO@gjD*<9NaUK)$9jm4L=wew=^e`;o7ye%`LU7sRWg5t!=9hx4@~|JCamuB3ztoYEFbZX!xLwq^Dyc z%Si1557%1{|7&fp?`(myk$laUs29G`8Lvf+>CT7dR6ZFd*Ppk1!Q$wO$fBjomXbY9 zzjV~b6S4YKGsDGoo$+|AE!nam+}=hXYn$3hE3pE15b-VTsZVVecOuNwpmv^skmmO!iJ1 zouENp7jLGqUOc*f9L-Q>mTI6rp~jJy$nYcDWNdwMLO8ab#$#J!U*idOaE(ob7Z{6& z7t}U3*M%1vS0SR#>7zT1pp_#>tgVmLPY;JH7cZfzCg6MG@@3UElrVC0t@G5=L_&2; z&nkyLp|a6P<%+6k_2L!N!o}5#*G`?-N{u7EYwPQ2_DjSPVWTDWqmj4bOR8$BE9cZy zMHg2uu9_FESu}sC$&V~sws>B2$)ZKeW{&&4IMG2we6`| zvZ8892I;0`vZKBP1xI?VwaslMb>1R7N~e3Z9r0*KdwWZ?j^@f_tazM3s5heQK+R_W zG_|IAJf3mA4rJid%m4{5)*6d9dbKUFc+!J+deka!U2VM0Yimz7*TuZ%wuW}EKDN5E z(VJH_XZd`OJ&b27IB{RWR(CeHB+2OvR$6jYN!d|eWxTGbIZ118XPnk$%4(^fxVkx+ zDwCQ`)-@-aN+@^l zmsTyD2a9(D7c8h;?8VwJ>(!4-58RQ3#izV>dKnx6Vv68yLee-Nmb>% z47sRk(Xt5oEmB=G&vPa$Z|?NE>GP)7Pp_IDo8B;e?TVI~bK60ai}YwhqB z$72)G1?g$f&H&z0JH0GAj`}m2Xl`t)ZHZb-c*~9cm?PRdVr^Jt65iZy9LJbh#9Qsv z%6O?fq3nsu73PBBSHPCiHN)lf-F4=u36ZYksBmN(V%sRz?J{Bu$?(2w^X{(uk_*f( z55lKKx*o8Jt@Eh()|sGZ;1#sx%wBN>0AYwUR(Oc6TxHaWXk-Wn|m>P^9ZVP)E8-8UK37 zFqjnSJfUlDLB#0ZHMc0TwVb66k8C|Iga$@Xc5XP*WpkfwvW zkvl`u;Iv2@W1cU}>iSDJNxt?YrHZyLEr4E&BU_WBA}OB5usJn&*{CULeKzmz9Fl+A zyirrmeSP+fBiB8Xf7|YTqwa^vXKozmd->-*8^C3vy{@dh3mx+2txS0|cSa3Wv+~U= zVItcTk*)_LUGqj28M)27^EV$yBo7+vfO${bzJ2>@&~JO{DaIaQNgsrOx2J}10~k#s zUH2MSaD5|F#vOT7_Ri}!miZ>PN0~_1{kE2_Jw(|<#$3y$(MZ=LT;ZJ+#GB4w)cBg= zvkpu$o?B%)KOOrVlC;qOUM#Xz`mCGL(SOD<)4dkix@=TYq${xJ-v6X}$aa6Xe!7-& zE#NR4wxbPP-F5$-O=*TVFXnpRJl|v+b9~v}b(KGJRFNrbST^rYj)D5!p#05mP=8pb zBk%L}d_)(4HVG%*^9Cj1v5U7xMjaI?%D-?Z)TB{UZs&r3aLazSAepd91{&F;O69?cNMAVUez8(>AQ=m z9mY4<0g2yU-%_TT2aE0uLJmo0>dd!I2EOOtpPFT4#wci1+-| zNGuISw$@Msy55d#J%V6cXU$f+iA2+1P1oDjKIy1QS8aYZx!~@}(iFFmVd6+PjVG5L z9ou=j)g+gs_lzP<(!(V}o-jDoM^pDbhPmeok^_lM+i9Ecac!Qga8)t(on9 z&9z4U<~<*aH}!@dS5ngL&hFG>dQe9|T}sr{`%|eOt*J=M3KL5u3(Oj9l5ghOmYsWl zh_k=pMK+&qt z7Z0H&D4x}JoikCon^iDg2qPzZ!{|)vo%g8eC7Ile(e`}(-~0CUFnk<_|0Rw69yu+@ z`F^IHTI8HdIWX$~h5vtB;HC+lhiT69LRbep^MQyC0Y3yN5WoQU0y*|8WWRjOK9pzn zG{Kx+&23395Hcx49z6F%%D2(;5DnOZy+XO6^O3X!R^V4hifqnPv(mCIU#}6{L?(Aw zDMgJM1-;+OA^nY>z2ClzV2Ecx3&z!>hOyNFY z>+SgsB$HzkzW*9gg=`{Va*AvlL#4QTVp4+TD^ zNIoJqzyG*iG@8@$1Bwrzbio+<$lpjp`Pjh?w6X&ZFC*AkIx?X2_Y^l)955MCj!%6G zu*Ii=pkPpQTfH}+990$#qI+cCfa!=2vobRf58L=G#7Eh9#h-|$*v98Thf*7#2bppk zKL+s`HXcE|f*Se=$>xUoQt8|f${DNVm26K%%Tv+(QlIt#rajLVyni-H8m@v5z{T-T zHX&;9PZ2M$@&6!RWaFP9Zrf0>5AkB-5(S=*M5#^qCQ)t^0h6e(i5!!N*hDXrSZouy zCb7~cLjE13;b}I}*T07nO*YZrI8KL66qrQPCIFlT8fut0?Cjn<(<{ zC$@8KVwnFlCAQeaXupNTw%bIBj}E=uCMKE0PMat-i5qO9%p`W%#AM^Vx7);2quXwq znC3rE_58*wBu=m33eycm1v}A5Yu0NJ<@gWKT<(S+p?eCbd$$ml8$urrhW|tD1J+Rl zD0jPYIT4+Cdy zqH2qrfi&prAfw8N{ZLFArhz%VhhsJ|<$I4fm7*fkc@oJCDd_#=F9{rKiani{LDLeBG)Q(+S&InX*{6H`p0#wMoaj3qr6+eEoZth9-lIS@I` zCT8cnNfU9CO;nmhhfT~iZ0l{J$|TOTiHK>>CYw0cd)V0=oMI-zXM6lB4jPl{* zr`g09e*)z+c|$@)$DKjyo7tvl!6m8aqMxUtOVZJ0&!o^3y#7+`#Nib6^3V?#QGUMp zKo3zz!1%c#RAKT#mCiT2G0MI|vO%x1Mdl8XLA{w|MDRrsgjS9q#y-`ROQ`Y7qLa{X zHhRa=gc=tuF1m9&#f>`^-IaFHqPs@}w)k!|&bnyPz2LPjT6BLuxSExD2xY^}|F7=} ze`(P>dsF=HBFc5WmrotS{2u^k{(qw`=Ks)eTK*Q%H{cI0cY@c8brY z&oS#1vTXWXl|C<(o@&Z(HtU?f)JmUk_TK5z-!vQZbb3oFZA*8Vba2P(8*TamPVeRP zR!)DoaUAX~`WO0WXK=@+v&P5Qdj2*a_Cy#@Z`gVMMgCl~HhZ3>yVxij+_B{>tKN2h z5$7L)eszO?i9hf_+8#79KJpZfOoP;s2~L%7qzDL)>|*4|OE_|r&@JFdNfGVcb{hHZ zXHCb>N5TY-_OJ&;G_~d7)k^{!kt1wdXg^k!>?0Ag6j;EW9DWM4@^mP&1 zLMko8mV-ph4kRsiGRa+Gp1s9}kTnk7 zXo6qfwqKM>j2m{d6Sd1yP5<3~QFV8Arzg8xaEQ=X6pobd8~Ym+K_(xG&NX8&43drWJE#yTqdWeu9ml+9P~ zw*o2Ulh1$kvgZvwWPcl;s(1U+uU__&i@$o=U5|eCvcKp}m)85&(W&Q=f(KXhx;u2kt1j5a-!wN2f`KKo*^4q_Wmi$1N(JuQSi%apV=A-m%9WT&QO zq2)KS$#xgJHmg`_tpQs`4SCzrf23?|%gqC);Eq=}&hj{XX8D0p|I@9djk)QbgyW>u z!Di}6;xhZf4YjIqr zq->ROm%B;VmgWb~O~SJ`)kUybrv36G*_lR=MP9bqfp0jydNeFWW0!grmj<*&-st2u zQ0_rC*ZM}vuDH#0l+AJWB&lq;&SH~I7su)LoKFHxTpL}1q{OeM*!hfq1E$BuFqL~Z z#je%4l(yk1%1wzvt@o^GS}o!W_MIF+GYz|Nf$XRNqd zgy>T31S@OIhHDPDK@%x|UC;bfle*ndUP8jD_I*IHo1BvAoD)gxev`w)I8_Et^iNwR zxWhORc|bN78Zbt=e!2#@%HbwEo2$&_T-U+S4Bd~xi&D9v zY7);49Z646azk}}Ja0B6{mUuO2AVod@UOg*Br7=OT~0MoE#15~o$x$+L+84{Uvs4d zKm4Mkf90b@Rf!D$dMhypiToSzs*H{PI32w)6&+%pBO8GsV{wbgMknA2tBp=dM<=JE z2d-L5>_%W{B_6X5Mx*D^7@TXhDEedIC`!2+&4WVy#`w6KV4wI@0U7ptlX1}S0G?sk zm(h+v#=#exw}mjU?Ze6WKo7hgH#!VpWbFs;>*Sj!>Gp|E1fqfEP!hK|^6^y2O4|Ht z_d9ovdhPZ&F*&xvKJ%UeBj<){-2=D z3c|<%0MMHwgxL1q?BfQ8eGUd)Jlm>T+{v(3F^%sRG0*>S6T-?~30b4-Aw+*aW zY+Fx2TXFU2HuG4*?6Wk_m?Bl?IAjdI#N6+)@oP-H8u;*&P=SetV~ExOE&4QIyJd*k zOkjU!d%?8AC^2vYEg>E@a{2HStL}*CCW>MQ=rr0g{+k&OGK|;&q#5%sr&5+-U_02b z&RYgF#kA6zv}kVtYrTC?X^dQSKoG0EMT}+xV(6xS12i9|n+%V+*_j)fIhHFMupW|F zH1mO3g*Kr^yn|>JIAD?a+l&W{5Z0=ULZ+t=>+9Q&85YFknvcoCR%Eh^-U}M- zMlFFwFb_IZrezDzveB2q>}eOFxo)68IDI1c#iZUaa->7JAh+ny5)y+p zV-E})0}St#G63y}OZ?dfN`7@=xZhOMju9n(S>Zr`Q16PO%jOtlWG}C*FhD(Un2At3 zM|GX!djm<1x{jjMS%{9gfY3nEjyWVTmaFbH_P}mj#jF8o2*zQsbQ@7r+g7Nm>Xg46^Zd~aD# zXsL#D+V__Cgih6vP6xcwt2O4E^|u=u^b-D;k?U575*d^Vc%53x3wk?Vz-s)tA%j^0 zUb06K;(F{0xiUBVWKHIKJ)nSBmcbAi#4_2nhnTLgFPVZvhFW^`=6;F`wS0em@u-N& z_kM~?G5OAH^HU^SzI}Q}S_R+BAoUfYOj@Yw$ZIpGu%f5bSBAbK{r{i_Uq+>{c_$&j{Q)N z&Hlfo_5bl&OaD*VVFuCRGB8y`UT3pDUNfzY>G~sYQjbo zByEt$q31*$$fVA|;Zt-#R9kyGiL11t7OM6`{9kiH+8e?=EBAA!}XKdM&QIw)o z1sSdxthTmj5+^n}v^cLZY6O^sdI*O@r7(NcRTF+E2qmdPI%2N2g&2F&Jv};4D{2nX zG6Jw$w638s8IM5`Dq;leu}ls?2QAqY=}G!goU}_M<8)w}jiaVUI`b`VDq_v7Bqe5; z8-ggEk(JJBtv|wM z(5)alYf-hqCw)I$wrW*ya;W5%ammo6yS+e8U=@A%7YF;j6Wow&4gEIQFEH86Zjw z-k1zt<*z)4fb9faMc<*4RTC!#`<3Jbg70h$h3U4>xBS2ae^oGk)%%B+1@jt$+x)AJ zj>Uo>Y@D&`y1$(`e|BWns%JWP1TXf_nHlVJZ16SW+~FUa2=-Zd_1{7>U+G-+O6Q5w z*Pi%IG$?dp= zpBWkve8dYKdspyspsB&lM>fjY; zg|>$pgKv<`)xkt)dvMU5*Q`2m#fj+6N%%McAIG7}6M}uVKmC()|NgJeRS(Ymy`j81 zv?X-yH7ABH3%-2jRl#k+tAb|`MQ3Px;2`QiI$)8GQ}pOJsnenjE$!>fk#A8tdoi9| z-Pz!^lb6Pu>th~{ilfu<%<*hdJ6h;uxCTMuI59L@y@-y)t6LLI8V9#yA9F^up^Y%| zZ#pCqlMBw7gG1NGzZ5Yqc~hO;Wg7wT*%+R!(FK4IiD~8cm(uoA9F1h7Qvk(YmHJR^diEx|BT3%%9$}%HyiaCQl)`&S_CttlV4Q z(%eejR8P{>v7|^xZL-O9JR0S7if>uV(ixHQ&N}Pk&S{KfFZgzQryU3hvbSmXnpmuZ zyo%1{C0}k|)7cTFaZ}sbLc5giMl(x>QK6$Yk)Rc>9@cNJr;{G3Bpr-vKDxOP9}-AB z4bAI`nZ27@njm`meQ1=eZW~WE$75^^@^de(8g=k`9^+(6>0X!vy9MeQ9-j7iOiJLu zN%9?Yl&{g*j^)<18){pdDT*0lHTf*5y1F(2AG8&iu|;-kZ)l*i zT#1~Hxr`^dPCJj#L5g(3vd4W(V+Q`xPQ6G2v&>7-DVA+sJa&3CHDj464Kzl9Gh*>} z*qc^OxV<&AIZBg8M%+snPcRlEccKz!#HjW}Eh|p(=vuQc5f#&?XmZoglnyg_m{uCs zHf?m~O!x==ZVnzu{%7U@6oY@2O+$TfYS_Z4$Ma{>?I!G>jE8l!!+mJFT1_oPCsT2F ztpUwRrft*?8Vjw2W7vC%HO(~maA-Bj$SAChH?A%9jFn>6BZ;!xd7{KY{vNAs<+C}B zel&9Hyt*bb+?U%Nn`OhpG)GgAIepYHL}@@-C*Zcis~qjjs$#|_iJuS^XgjK$?uM-shpqgCNrti zWar_?Ve)-*v@%(Uk5;AuSnCWxJAK1gG>&OfBBi2yY_sVQv!-=)CeRg_T}fa~tR77@ zrzJ;eLZp*Y;o_adkzUYD5(C%Ff*2`w?J!Qn%MYA9Nkgp6d`>o>Q^@UmPH?7mW)3pt z;Q@vhgVA<3Ez7A{)2z2xl4v-k=gzd{8=7M+WLol;1kEipK6vr9POm2`YEx^Xk+^t* zoiZ7grSWVuAgkDA2qTy}lKhU&JUt@@Q#3dOGYMy*8O)mBv2r|S4FhdFP$ul&0CRE5 zy?Bn6iJfO|Td^G@u{fb||INB(cRXg-LQu-+)OKp09me$=s3FaD-F7Q5E?vvm%@Z}&te$4cCMS_8I>qLZ zC<&Ri@$>}(v-s085;b!I4K5n+W(?U0hX$tUlsaV7O5MQAqy3tKJzHBH&D3>td@bo7 zkC|DRW(4fvOpEGinvb_{h|-zjcE{i@3Q{R4(m`VNogHbfD4Qk&)acCKV5UHxQqxP1 zS@|&VFg~pR+9Qx*O)&-OX9lp0G|~_T!E8&*y>ktQ35~AfyoTmD4B14xJkvPZ4R!M^ zbe3JJ(Nen$g?>igMaL|pnX>z7z0{*-L||QEyBGi)4_ZiR1Yp&rL$hg(L*vY{M+-tH z{&0b9oAEq%oZvzg+S%!irW;Z@DHr@uz}=EVUm7X22gDKKG_TW$knJ3%Y-+glCRTFZ zDw31b)8=JKn7E~=9X3&;N@|IMli?17of^AsOQP+xZ|1e!w2|tKV(!AM zX3lBGz&4XK`U0CNZeD9`!qiOmwtIc3Av;F&y}M;(7wBez^eRQ88yg8@P!@p+Qi_`8 zE1JMn4i-+Mp0nG5>tdzlK{RbDSzSgcPFSZahqij!M$?T3GM8zYotChgIGsfclwBaq z>`CrVc40p;gANU(K5LGei+%BBzEm(e+D&#!Zwv!HGh_P1Jq|j!n=YzoS~O0dUg0pW z(GpwNB<4x2GiV;~wPjeCeZSr4p%8VDF#_+%*re118ab%a^ryXqne4@D*I5OqRqz_( z#+8YY?!-uK>1?G-z_jmAqxsf7@7mbM7(3e8Mt|r6b1Pp&n1#%&xn_KL^XJZ;9xh(K znoe%-w3kg2CwH1u*~YS|C8blxS=3AYxb2K3p1+<>Txw>bu3PF}%9fvUWsZNWKt;R|yr^NP>!Rhd_MZf{5#+b!%*iXh5c22e9+OvoZtwYdkNI>M7`;PeO3>>!{0$v$=6JWKYbA*d zt+e~}N~kaFcay|ue^Fb4zZu|_n1!-rbt2)F#M_a8cv(q#_hcC*r3?wsc914z3)xbf zFvq^r%s?l=m)Lmi>ecbs+HTqKd|Q@9;VDk(>lP|FrEl@0uiQYtV8h+O9%0v+7CMcI z;ajLj`jTFzF<}gS0#{EGye%5A;zpLE<_rD_PA&dr%j3t_sNcM+OWzWt{Nu_nqCd(Y zRM5Xn`KiwwGtI{Ll*({(~FC#^3wlF!c-N6(BB86 z_pcCsh7NXumTjlJOzq!wg)OvqhW$qU^paSQ`Zp1#ISKNH&%-CZrl-iY?6*lqV<=Z1 z!KdeaAB}c`mc5AbR24>g=QFktPQyTe{`7`q5B+~gnC2wNd-`~MTK}{$`>AEGA~;k1 zH@soxxf!N@_@4N`^xrQD)0`-I0KXRniHgc`Ti^AWh%cG z1Czpd`<42Xa`Fu`NjxP)k)2%L#SquB`xw*XU&`-BAty-t1^SpGnd}$-r7Ec793N2COr?xf{)FD&(4A`%z{U=;PEW@1zGT` zv*5R6!GD(pf0pn;wCjOi@C1uFMfO-ANt z1C)iE^y*GBUKYZuP;^JdJmQixn%eEIHJMy)(Nb2A`_E{*ZIwJ?B3@~@JT&k26o*(G z5qZd*dLc>f`hi&82sBTmOuvv)xOXqQrXD)r;e}Lg9@bGZ!!rUxVL!Q*?cT#hf$nc1 zP+jgLhfMdNsZgfp-3HcoQlWqM`|m*HPOkfQh-qp1kuYnPe)B+7b)LSY$kl^&67BiW z2<5v!sY_L1UszL5e^Sq?KmTc)QM<V5PJlKCB2+wII<$2HXH*lBdWyUqn+m1ZiwVl)0mmz4L-n8#P&^&_~7kR1sFooOF zbiI;==Lkn0`t0Tc^Bi2bkyV|AXN4mVo&rwC9NgvkS{9y8M;<(jIgNcHg0$DBJa20j zo=Y5g@NDPw^$zapb8{A+I~;lNJj>~a9NgvkT^1hvQXT>NgC~p*rLf1rU7mkt;rYao z2Tv38;4i-*X#3g~f*ta4`yB_0ojf1;9$1{#ESD#ZI zdFX@v9zv^wyFB;yE0}*M?;kw?7~ zxV~u$FJXMH!?T#=Wqv-|!52C>-^NebXC&nz;64EYXz>h1c#Z`~0XXiN34Q`V3cztM zOYk~?6o4N}{{&A0q#$;x28R2qJ%^O?toMZ?tO!{S*FY9DJmM|J}h4b8uOYz!P?GS&yXNMU;oo-W;*z22d{DPu!Fnn3;b<4{X@Xt|3T30ZFlf7lrQyecJQ$deu0C#@;e>8 z*pa`^!Cm>EIrun79tS!gK+o~?PxLW=N|*7&9sCJL9*=TF{_l*7{bk*H(~+O($m7qP zA>a-p%19_;9AEf{F@rGL!Evun>Ye1^hzef8xaboF355lY{3J??{7DXuz1WAmZ|rn% z*KTJxIG#BQ&)JNlUGN9omqXa<$WNxU$Zuy{^xR>j=}#Ou@>3l7YaM*5ga26Z$o}$n zN8aUm(2>t2o@aUdKAA-xe`gs1Uq{eC(f=g}pXT8BLqiB?7x?8C_P-r@SD#NEdD!g^ zl%aq>Cx#$AbTEYp1&pJZ%X5$;51!pdnhw3lB7eA&e~#tlJ_h(Phe>;nQ1b7v{B(uq zu-_k(rQYL|Jnm;AEOzAGdY3Et$t-_j7J1wsLJ+$xX1lF%d%vGW{s&5aC(B=-MgC?b|18Vn zJ{f}cliQShkr@P@_upCMcPshDEPsC%`A3xedY1n~7Wt=?{0%JsTo(CP92{*E|9`{5 z-F4?}2Y2VgAkQn{D0g^Yv=kqqk^?d#fN8TNG=Qy}KpMO*FTt{^ye8-V@d3HLu+uj=$Pt4MIKXc^W zb?{e8ehtgtn??RH2Y1)azhuGt^0>llp~Hju_7AM5%tK-a z$}-`4hsV8c`h|nL{eGX~?_i#X9C=)`NPC}faJL`dP&{%S^0p)I@_gjrE>C}+Z=_ut zSf7E6LwDB?@dqOjfV(_LIymev`p9r=00Eq247mqdUrRrF8r zcO3i}2mh3Du|p6ADI5eRrXcucoAib=4l!4M{7ps#;I94)9DF|Ii9RPVF8o8e-gS;V zAdx@Y!SSAm;O9Gd#KE^a{MCd@xYUt%?Q@-jA4|f*f1iWHKjk{&4-Ou7O+aasGI`Rco@#W|H$K7>eo1)Ss-XUY|u0w<#oDP z;VT%&*hCPXO2)BwLJ(Z^sW50yJdy=poCRN*1wSnd-lXu!tY?S9MbGtF@J(6pEm`pG zS@6rV;5!vQnDx9t;iBiREcopTzkvN@x59c`5fX1g8vd1m=v&fAP8Q;#MsLr0MDm?1+2$tfE0iin3(;* zJyHbW`4=mKYc~YJe>lLVv34T}F84_)Eu6yVGEYR|mod*Gh0kJtI7Q(N@6fXB=exmSV-rwA+@GH4pzf$-i z%rEny*m(o@`%_B3j{WK-h41Bh|Do_f7{nB0eiQyznWq=~i{PDX&w&cx&ic!JL6QFx z^NdsStd2KL;oG>qaz9Ua7P8#&O8yq^uag!2KDVn;;iGu|+@Nr||0d5hq~80jdAuD; z9)IW?;rj}Ioa_Cu!Vh6P;QdMj;Xj=5M-_gd6-(`#L|*XcmHb_7H}|~6}Hc93YYr`_bR*(^Z!-hC$j$kQ1}ZhFV7LAU2}LG1=t@2Z{v9> zPvPgWp6>GkwCfZ0e|cUYJTJ0;PF6h2xF2UJTz;o;timJAvqIrA-s%+oLvELQe;#_C z%69pNl9%gAyzhx1`pbRE%M>op6|Pk{{*VTO+}{?SqgkK3mHh28?i4$g`dOo)p&(Z;|0vUe+xgaierC`LiXrRXVm zRLPgIoxi5=KeK(-D!ezR&sDhC{W}W(n8(pI3O}9oyjkHVv3*`wcp2;Sp2C00{Bj>v z+B=5ZHH_^f_(ty6v03mb3YUJIt?-Mvzm8M*XYA*4e^u)3#d38@Ui$S6g+Iu8p0Duh zx!!Lnyq4{AmBNd8p1)Dy>llAT;ic@idldd7#^29^2Uss@?-tf4U*Rj*pAS>`O75=` zg}==8PS1kRSGe@oGKIg&ep9P(S@+u%F6;i+72e4H*`@Hmb9?1}sn|jAA1L|RZ2zAr zT>9lMh3{hfJgo2;oc^Q2A7_1DQTSfAzwF;dPw~(HDETR@XJ2l&$Zuk~p$fmoPCwo# zg}=pknZo5yea}*OE3b3MDO}#;T&eH_xm_`ZU(5X-SNMOJ|15>CX8b~h|CV{atMFc2 z?~fEN_fLPWaJin5e6i;bcwGHX$=}BOe^U4`PVZCr;mp&I=ON)2yh!2VZ=)5ymB-y= zh5rnM6lN=2-lJWm@b7WDUg1YD|3wOK=k#~8;MXa9H>Yn=_!_p`uM{rreOTe2a=V^Z zxNWWH{Z-*If4!yfE?$p5Quu1tr$5&t{gTIiRiyBKJbn*V_>(;DMk)Lm<{z){Z*aO) z;V-bCOjGy=jL%T`9gNRW_&`oa6rSXEEmZi+oL;8zci3)n-GglGf5a}eO8yDfr$yoG z*lrsXel+*T`3fJ-9sF&D|AoiZPKE!P>-~wsd-1$+r^4lZ@dp(ye*2WdW&QfA!XIFL z{;6=e4*5jkGG86Q;|$rbXK&^isql~3ukh!f5JdhD>{oLYzKGYOg$lowc~&X>cE;-! zemCRo3U6UMkKz6leO_QY%YIOBc@8~8$;)%8h{7-B`j#pDYwU-oDf}w7TZ_Vf$NRMP z3ZKaG=P7&{<2w{C>(iB4@Ea8V2KUP^6h55$Ww*ljvORyR@F0(iXB95?c~#-pv;O5= zzu5mt-Y3jc_(bln;}w1;%b%)nx&I>bxA1?){k2}ni=LYmK9SSkQn<|jS1bG(=D%6t zvVPy8@H?Owg$EQa*Wphp{4TcROA0TxG~QbZ-^l&)vBH1D}w%?jVe{(P6hN3#DssPI4YJpU(!&*%PqL*XL-3F8oBRg5Ku;GqHqG>4mR(qkDH zd3Hl@s=}pArNRdr7WzZk4nO9@&D`&&DETnUCzZU|^DGBPop|>b;bw)mSlGKo@eBU2 z!mnicKRY;gxycFe!xh+pyTssy4i0<%+Mx9NG6#2gY8)Iqr7VAngM;VqjK>|^<@t_- zgXc7szuv*Y(+>($xXZy^o|haPJll=5=l#pU!83t*a?yDdkaT&*D_ruXIyiV1Fi*9E zi!69s9US`X21sF@gM+7yc`kHtmuHuQgGZj1-Ra=qxtMwW;NULLyABSX#Vr3H2M3Ql zFB~+85)>fj@=SAZ@N8$E3I_+zQSK zynbD(@cwN7YZTs__X)pI_y9J>Zx#LsFR0Hj4*T%dgktp9-Ictw_ag@f#iK^r^FDKM zOkHA!KKPLy1zGop@_aJP!6Cnl?L5}O!C%Mn6C51!uW`GMba2SabIlnJ4taT}aK3{> zzM1V=C3gxLtQDyqxua)xp945%<@73YYudA2~SceT3`n zGn5h(WPF{&`^CWy4t{yQe+c8^pRA@g+L7limEk?Y!NIeO^`E8iJ&ezFaF?gX!NDW@ zTo&gR#zp^XqowCvr0|m%|FPmZiT(WNO8%QH|FDB&o|Jxn-N9k{g)INR z!lmB4A}b(zUdZwXEBrf*Pg3|?#+NDlM~t7T@W&b7;oxZMe8#`$;L!hh#&1yg8;tK( zc!1}PR~0V%w2vGd^)6zbAioGDc97>RgBXY3!cR7_{1^v^pL`Q!6ecMid5`fpg#yo43{0~|FYzK$v4pS@b`y3p0yMg6zQv3t?LTi_jzl-G`aB%Qn$NWz_IQT_= zui~G{{O>DynLqm-WC>ws`0cYipA7eG4t|fvd&0rN zFY*^D{!5wv+e&^g&)YwCaPZ6TH*a%r*zFGbhj3pO{0Rq#KEnSN(=vp(-A`SGkz z=wMS#>bhXJO?rnoIQT{WD1}dDo?{&x`aj1!s~j9WBA;Yj^n8o;+@R#;eUXbD9Q^Wo z(km7I4%d5=gQH&Ic~IfYSpR1o9Q^WJ<~0WgkH`my*@|SmpUOOg9UMIJyVS!R96TaF zi*d2TfyksVSIM_C|0)NE|H$uHn;aYzB7dI3H!#no4h}u#eYk5K96TbwTjA$2&*Kgb z9{JttOAZbmk^fZT+n8s-AtXcr_5_c-=Q+&5!6WkJ3YYhIsvR6W@}BNW2M3SHCl!7T z>$BOxVP|=N?-BB%v=-}Xyb+Z>g=n=cgdN)YnFYvlBT;a05lqtNG*P{iD%ebyW zgkt~0*!sYin z3573Y`ArI!{@tc<>6a@Mel7FdqVS(H{(A?9-D30);n}eHO4;oJmVe*DA-~3odHWn3 z{V31-hK;ZS@N>v_*ra#3gG2sZo|hsH4*4X@pWxt-KLCS_Lejw@zrmoMx6#2Ne>Ka0 z&%q(TiRG_zaLCK^^t&A#@|#)yVa74Ou&;iJ@h2P{*N=sKo%piD1ODH!KKm3d@AnKC zX$gJ$g1p>cEmwFH0u&ZFIP_d@P`VG`;NVHHd_v(DF@CYaXk6v!NGGo%O9`s z3ih{Vh0D76O@*Jt^4BT+G{$dLxV#tmpo6=5zNzrn*>3MUIP~An{QXDU7K(lDVtj;y zgJ16FAMW7b`3uXJD_q_uS*h^jS=sdp-^}=Cg+X{b~ z<#WcQ?EpypEziNx-p^Qmg2D^=x@Mljr!ao9!sjx6hQb#ze!0SzGJc)HPhtF4h0A*d zk12c`%kNeA_Za_=!gn&>cWl}|u*0p4k5~9_7+=9S=55T+(-=R+kq;0q=M5zlK08R6 z6gE3}Z%WJgb>C9>1dvhqKI2laTwmYd$V0S(`R`Hk9~u@~R~6pY%Vs>IaGX<(@Up_= z7WUp!`1{QBp~AnNYYPO6?YHRP&h5%m_%;2l+<^+eo1Y7eQur{&Cn@|2#;X*5a&OCj zyu!skrzm_e^Rz4c{gCBZtMCx>Z&COfEACyT@JqP84=el$w$C1gKhAc3PvP<&N!~bH zk=Qw(?LSfBavtI-3f~d3<&z3OxsSy+E4-TZ*{N{(ea?R=T+S(YOyQ@q-TtU>nJ4!s zJi_*QU*Yom8Gn3tJM4i$DD+pj{E3U93V)R4hb#P_><`lwF6Uewmh! zhqL?+g;(WR{dXz+;64_=SK%Sn^C^X&%l`10!mnojk%wEpzVwCp?QldW%uu+T)7Pl* zk9l4Gros_Qus^Uk8y=RZmaXoQ21M{&vzBRgXdc=X7+VVZ6F?&DV&Fk$B)N*;C$OJ zh4W+L)O$VXCh&(1yFD`mQNd;ZU(NX%KVIST9Jxi|OF1pqVVY-?l9zh7DEt&oe>)5Q zJ%!hD`UZtJa(b7-MgK<~oL#{nPb!?Z6W*V*;D1;698SyqUDyHqf`6>!g2k3WBrSd*idyf-BBg1@BX z#h&uqUgX7|a;}WvVz)fD6L8D{N3#8gIyn4Fpdom{6d9G zd*!_YX_vJ3bR{qPpXuOOy4Lgjx!J+p_HI+SwD7QsHtvF4sN6b1Tcsb1lIK^TM`7@yPGxPEok@Z%pCRkMh2W@UQ1~$vLHh zpUwCsibwD(6)tv=b1a0XnA`O;B`2-w< zVqES|i~fRtqU6QSx$Ji$FLusTxcI-kza#R~5us3~`~E`|HB9h~@85@`B6n zYeioA>nSBK{q=&vrN89;CgG9$t3Hnp!9Qeu`YXH-&qsq5F6Sc+SNK0zkFg5>7vu6? zmDKw^_VZ(v{I!fP&w`(#aJio*zY`aJ!Q)C^#*w_ACGv7#@lqxKTb>8xJuH!z`Ct50 z@Huu^cyi9C#vfJu(qHmEm&gnMzm&Z2f0_l)VSR;1_~rdC!9QR<$18as0u+wOg3naA z_-91n;-8BZF8auOXQI!1TdkK+@(UQ>m<5;n&B7z^ckNK}f`3=x*D?RKS@4?`ek05O zG7El>!XIOK`8~VnDY*PzP;lv&7Zs1#`ELprJDW`;)g?UQKXM;S@M_klkjEKtL`O0{ z%)zmr5&2OH7kf_1f*+}H>GwGfj%WebEAI)4o+mM0=g31JsaJj%4|$kG=4*L>O?c!v zubhh@xV+DHh2jtJd?mk&7kODPf1>0C|1X8h^~=2qAH)2QC|s^z&jbfYyX5^VdA~#CPr5%xcZbUT;!S@+|}nw R2M3Ql50(BBetBN`{{TstYlr{< literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/server/mpm/.deps b/rubbos/app/httpd-2.0.64/server/mpm/.deps new file mode 100644 index 00000000..e69de29b diff --git a/rubbos/app/httpd-2.0.64/server/mpm/MPM.NAMING b/rubbos/app/httpd-2.0.64/server/mpm/MPM.NAMING new file mode 100644 index 00000000..83c0694d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/MPM.NAMING @@ -0,0 +1,15 @@ + +The following MPMs currently exist: + + prefork ....... Multi Process Model with Preforking (Apache 1.3) + perchild ...... Multi Process Model with Threading. + Constant number of processes, variable number of threads + each child process can have a different uid/gid. + mpmt_os2 ...... Multi Process Model with Threading on OS/2 + Constant number of processes, variable number of threads. + One acceptor thread per process, multiple workers threads. + winnt ......... Single Process Model with Threading on Windows NT + worker ........ Multi Process model with threads. One acceptor thread, + multiple worker threads. + netware ....... Multi-threaded MPM for Netware + beos .......... Single Process Model with Threading on BeOS diff --git a/rubbos/app/httpd-2.0.64/server/mpm/Makefile b/rubbos/app/httpd-2.0.64/server/mpm/Makefile new file mode 100644 index 00000000..b1f2ed46 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/Makefile @@ -0,0 +1,9 @@ +top_srcdir = /bottlenecks/rubbos/app/httpd-2.0.64 +top_builddir = /bottlenecks/rubbos/app/httpd-2.0.64 +srcdir = /bottlenecks/rubbos/app/httpd-2.0.64/server/mpm +builddir = /bottlenecks/rubbos/app/httpd-2.0.64/server/mpm +VPATH = /bottlenecks/rubbos/app/httpd-2.0.64/server/mpm + +SUBDIRS = $(MPM_SUBDIR_NAME) + +include $(top_builddir)/build/rules.mk diff --git a/rubbos/app/httpd-2.0.64/server/mpm/Makefile.in b/rubbos/app/httpd-2.0.64/server/mpm/Makefile.in new file mode 100644 index 00000000..2decbde6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/Makefile.in @@ -0,0 +1,4 @@ + +SUBDIRS = $(MPM_SUBDIR_NAME) + +include $(top_builddir)/build/rules.mk diff --git a/rubbos/app/httpd-2.0.64/server/mpm/beos/Makefile.in b/rubbos/app/httpd-2.0.64/server/mpm/beos/Makefile.in new file mode 100644 index 00000000..3f88b041 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/beos/Makefile.in @@ -0,0 +1,5 @@ + +LTLIBRARY_NAME = libbeos.la +LTLIBRARY_SOURCES = beos.c + +include $(top_srcdir)/build/ltlib.mk diff --git a/rubbos/app/httpd-2.0.64/server/mpm/beos/beos.c b/rubbos/app/httpd-2.0.64/server/mpm/beos/beos.c new file mode 100644 index 00000000..51a17c3e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/beos/beos.c @@ -0,0 +1,1159 @@ +/* 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 new BeOS MPM! + * + * This one basically is a single process multi threaded model, but + * I couldn't be bothered adding the spmt_ to the front of the name! + * Anyway, this is still under development so it isn't yet the default + * choice. + */ + +#define CORE_PRIVATE + +#include +#include +#include +#include + +#include "apr_strings.h" +#include "apr_portable.h" +#include "httpd.h" +#include "http_main.h" +#include "http_log.h" +#include "http_config.h" /* for read_config */ +#include "http_core.h" /* for get_remote_host */ +#include "http_connection.h" +#include "ap_mpm.h" +#include "beosd.h" +#include "ap_listen.h" +#include "scoreboard.h" +#include "mpm_common.h" +#include "mpm.h" +#include "mpm_default.h" +#include "apr_thread_mutex.h" +#include "apr_poll.h" + +extern int _kset_fd_limit_(int num); + +/* Limit on the total --- clients will be locked out if more servers than + * this are needed. It is intended solely to keep the server from crashing + * when things get out of hand. + * + * We keep a hard maximum number of servers, for two reasons: + * 1) in case something goes seriously wrong, we want to stop the server starting + * threads ad infinitum and crashing the server (remember that BeOS has a 192 + * thread per team limit). + * 2) it keeps the size of the scoreboard file small + * enough that we can read the whole thing without worrying too much about + * the overhead. + */ + +/* we only ever have 1 main process running... */ +#define HARD_SERVER_LIMIT 1 + +/* Limit on the threads per process. Clients will be locked out if more than + * this * HARD_SERVER_LIMIT are needed. + * + * We keep this for one reason it keeps the size of the scoreboard file small + * enough that we can read the whole thing without worrying too much about + * the overhead. + */ +#ifdef NO_THREADS +#define HARD_THREAD_LIMIT 1 +#endif +#ifndef HARD_THREAD_LIMIT +#define HARD_THREAD_LIMIT 50 +#endif + +/* + * Actual definitions of config globals + */ + +static int ap_threads_to_start=0; +static int ap_max_requests_per_thread = 0; +static int min_spare_threads=0; +static int max_spare_threads=0; +static int ap_thread_limit=0; +static int num_listening_sockets = 0; +static apr_socket_t ** listening_sockets; +apr_thread_mutex_t *accept_mutex = NULL; + +static apr_pool_t *pconf; /* Pool for config stuff */ +static apr_pool_t *pchild; /* Pool for httpd child stuff */ + +static int server_pid; +static int mpm_state = AP_MPMQ_STARTING; + +/* Keep track of the number of worker threads currently active */ +static int worker_thread_count; +apr_thread_mutex_t *worker_thread_count_mutex; + +/* The structure used to pass unique initialization info to each thread */ +typedef struct { + int slot; + apr_pool_t *tpool; +} proc_info; + +static void check_restart(void *data); + +/* + * The max child slot ever assigned, preserved across restarts. Necessary + * to deal with MaxClients changes across AP_SIG_GRACEFUL restarts. We use + * this value to optimize routines that have to scan the entire scoreboard. + */ +int ap_max_child_assigned = -1; +int ap_max_threads_limit = -1; + +static apr_socket_t *udp_sock; +static apr_sockaddr_t *udp_sa; + +/* shared http_main globals... */ + +server_rec *ap_server_conf; + +/* one_process */ +static int one_process = 0; + +#ifdef DEBUG_SIGSTOP +int raise_sigstop_flags; +#endif + +/* a clean exit from a child with proper cleanup + static void clean_child_exit(int code) __attribute__ ((noreturn)); */ +static void clean_child_exit(int code) +{ + if (pchild) + apr_pool_destroy(pchild); + exit(code); +} + +/* handle all varieties of core dumping signals */ +static void sig_coredump(int sig) +{ + chdir(ap_coredump_dir); + signal(sig, SIG_DFL); + kill(server_pid, sig); + /* At this point we've got sig blocked, because we're still inside + * the signal handler. When we leave the signal handler it will + * be unblocked, and we'll take the signal... and coredump or whatever + * is appropriate for this particular Unix. In addition the parent + * will see the real signal we received -- whereas if we called + * abort() here, the parent would only see SIGABRT. + */ +} + +/***************************************************************** + * Connection structures and accounting... + */ + +/* volatile just in case */ +static int volatile shutdown_pending; +static int volatile restart_pending; +static int volatile is_graceful; +static int volatile child_fatal; +ap_generation_t volatile ap_my_generation = 0; + +/* + * ap_start_shutdown() and ap_start_restart(), below, are a first stab at + * functions to initiate shutdown or restart without relying on signals. + * Previously this was initiated in sig_term() and restart() signal handlers, + * but we want to be able to start a shutdown/restart from other sources -- + * e.g. on Win32, from the service manager. Now the service manager can + * call ap_start_shutdown() or ap_start_restart() as appropiate. Note that + * these functions can also be called by the child processes, since global + * variables are no longer used to pass on the required action to the parent. + * + * These should only be called from the parent process itself, since the + * parent process will use the shutdown_pending and restart_pending variables + * to determine whether to shutdown or restart. The child process should + * call signal_parent() directly to tell the parent to die -- this will + * cause neither of those variable to be set, which the parent will + * assume means something serious is wrong (which it will be, for the + * child to force an exit) and so do an exit anyway. + */ + +static void ap_start_shutdown(void) +{ + mpm_state = AP_MPMQ_STOPPING; + + if (shutdown_pending == 1) { + /* Um, is this _probably_ not an error, if the user has + * tried to do a shutdown twice quickly, so we won't + * worry about reporting it. + */ + return; + } + shutdown_pending = 1; +} + +/* do a graceful restart if graceful == 1 */ +static void ap_start_restart(int graceful) +{ + mpm_state = AP_MPMQ_STOPPING; + + if (restart_pending == 1) { + /* Probably not an error - don't bother reporting it */ + return; + } + restart_pending = 1; + is_graceful = graceful; +} + +static void sig_term(int sig) +{ + ap_start_shutdown(); +} + +static void restart(int sig) +{ + ap_start_restart(sig == AP_SIG_GRACEFUL); +} + +static void tell_workers_to_exit(void) +{ + apr_size_t len; + int i = 0; + + mpm_state = AP_MPMQ_STOPPING; + + for (i = 0 ; i < ap_max_child_assigned; i++){ + len = 4; + if (apr_sendto(udp_sock, udp_sa, 0, "die!", &len) != APR_SUCCESS) + break; + } +} + +static void set_signals(void) +{ + struct sigaction sa; + + sigemptyset(&sa.sa_mask); + sa.sa_flags = 0; + + if (!one_process) { + sa.sa_handler = sig_coredump; + + if (sigaction(SIGSEGV, &sa, NULL) < 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, "sigaction(SIGSEGV)"); + if (sigaction(SIGBUS, &sa, NULL) < 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, "sigaction(SIGBUS)"); + if (sigaction(SIGABRT, &sa, NULL) < 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, "sigaction(SIGABRT)"); + if (sigaction(SIGILL, &sa, NULL) < 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, "sigaction(SIGILL)"); + sa.sa_flags = 0; + } + sa.sa_handler = sig_term; + if (sigaction(SIGTERM, &sa, NULL) < 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, "sigaction(SIGTERM)"); + if (sigaction(SIGINT, &sa, NULL) < 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, "sigaction(SIGINT)"); + + sa.sa_handler = SIG_IGN; + if (sigaction(SIGPIPE, &sa, NULL) < 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, "sigaction(SIGPIPE)"); + + /* we want to ignore HUPs and AP_SIG_GRACEFUL while we're busy + * processing one */ + sigaddset(&sa.sa_mask, SIGHUP); + sigaddset(&sa.sa_mask, AP_SIG_GRACEFUL); + sa.sa_handler = restart; + if (sigaction(SIGHUP, &sa, NULL) < 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, "sigaction(SIGHUP)"); + if (sigaction(AP_SIG_GRACEFUL, &sa, NULL) < 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, "sigaction(" AP_SIG_GRACEFUL_STRING ")"); +} + +/***************************************************************** + * Here follows a long bunch of generic server bookkeeping stuff... + */ + +int ap_graceful_stop_signalled(void) +{ + /* XXX - Does this really work? - Manoj */ + return is_graceful; +} + +/***************************************************************** + * Child process main loop. + */ + +static void process_socket(apr_pool_t *p, apr_socket_t *sock, + int my_child_num, apr_bucket_alloc_t *bucket_alloc) +{ + conn_rec *current_conn; + long conn_id = my_child_num; + int csd; + ap_sb_handle_t *sbh; + + (void)apr_os_sock_get(&csd, sock); + + if (csd >= FD_SETSIZE) { + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, NULL, + "filedescriptor (%u) larger than FD_SETSIZE (%u) " + "found, you probably need to rebuild Apache with a " + "larger FD_SETSIZE", csd, FD_SETSIZE); + apr_socket_close(sock); + return; + } + + ap_create_sb_handle(&sbh, p, 0, my_child_num); + current_conn = ap_run_create_connection(p, ap_server_conf, + sock, conn_id, sbh, + bucket_alloc); + + if (current_conn) { + ap_process_connection(current_conn, sock); + ap_lingering_close(current_conn); + } +} + +static int32 worker_thread(void * dummy) +{ + proc_info * ti = dummy; + int child_slot = ti->slot; + apr_pool_t *tpool = ti->tpool; + apr_allocator_t *allocator; + apr_socket_t *csd = NULL; + apr_pool_t *ptrans; /* Pool for per-transaction stuff */ + apr_bucket_alloc_t *bucket_alloc; + apr_socket_t *sd = NULL; + apr_status_t rv = APR_EINIT; + int srv , n; + int curr_pollfd = 0, last_pollfd = 0; + sigset_t sig_mask; + int requests_this_child = ap_max_requests_per_thread; + apr_pollfd_t *pollset; + /* each worker thread is in control of its own destiny...*/ + int this_worker_should_exit = 0; + free(ti); + + mpm_state = AP_MPMQ_STARTING; + + on_exit_thread(check_restart, (void*)child_slot); + + /* block the signals for this thread */ + sigfillset(&sig_mask); + sigprocmask(SIG_BLOCK, &sig_mask, NULL); + + apr_allocator_create(&allocator); + apr_allocator_max_free_set(allocator, ap_max_mem_free); + apr_pool_create_ex(&ptrans, tpool, NULL, allocator); + apr_allocator_owner_set(allocator, ptrans); + + apr_pool_tag(ptrans, "transaction"); + + bucket_alloc = apr_bucket_alloc_create_ex(allocator); + + apr_thread_mutex_lock(worker_thread_count_mutex); + worker_thread_count++; + apr_thread_mutex_unlock(worker_thread_count_mutex); + + (void) ap_update_child_status_from_indexes(0, child_slot, SERVER_STARTING, + (request_rec*)NULL); + + apr_poll_setup(&pollset, num_listening_sockets + 1, tpool); + for(n=0 ; n <= num_listening_sockets ; n++) + apr_poll_socket_add(pollset, listening_sockets[n], APR_POLLIN); + + mpm_state = AP_MPMQ_RUNNING; + + while (1) { + /* If we're here, then chances are (unless we're the first thread created) + * we're going to be held up in the accept mutex, so doing this here + * shouldn't hurt performance. + */ + + this_worker_should_exit |= (ap_max_requests_per_thread != 0) && (requests_this_child <= 0); + + if (this_worker_should_exit) break; + + (void) ap_update_child_status_from_indexes(0, child_slot, SERVER_READY, + (request_rec*)NULL); + + apr_thread_mutex_lock(accept_mutex); + + while (!this_worker_should_exit) { + apr_int16_t event; + apr_status_t ret; + + ret = apr_poll(pollset, num_listening_sockets + 1, &srv, -1); + + if (ret != APR_SUCCESS) { + if (APR_STATUS_IS_EINTR(ret)) { + continue; + } + /* poll() will only return errors in catastrophic + * circumstances. Let's try exiting gracefully, for now. */ + ap_log_error(APLOG_MARK, APLOG_ERR, ret, (const server_rec *) + ap_server_conf, "apr_poll: (listen)"); + this_worker_should_exit = 1; + } else { + /* if we've bailed in apr_poll what's the point of trying to use the data? */ + apr_poll_revents_get(&event, listening_sockets[0], pollset); + + if (event & APR_POLLIN){ + apr_sockaddr_t *rec_sa; + apr_size_t len = 5; + char *tmpbuf = apr_palloc(ptrans, sizeof(char) * 5); + apr_sockaddr_info_get(&rec_sa, "127.0.0.1", APR_UNSPEC, 7772, 0, ptrans); + + if ((ret = apr_recvfrom(rec_sa, listening_sockets[0], 0, tmpbuf, &len)) + != APR_SUCCESS){ + ap_log_error(APLOG_MARK, APLOG_ERR, ret, NULL, + "error getting data from UDP!!"); + }else { + /* add checking??? */ + } + this_worker_should_exit = 1; + } + } + + if (this_worker_should_exit) break; + + if (num_listening_sockets == 1) { + sd = ap_listeners->sd; + goto got_fd; + } + else { + /* find a listener */ + curr_pollfd = last_pollfd; + do { + curr_pollfd++; + + if (curr_pollfd > num_listening_sockets) + curr_pollfd = 1; + + /* Get the revent... */ + apr_poll_revents_get(&event, listening_sockets[curr_pollfd], pollset); + + if (event & APR_POLLIN) { + last_pollfd = curr_pollfd; + sd = listening_sockets[curr_pollfd]; + goto got_fd; + } + } while (curr_pollfd != last_pollfd); + } + } + got_fd: + + if (!this_worker_should_exit) { + rv = apr_accept(&csd, sd, ptrans); + + apr_thread_mutex_unlock(accept_mutex); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, ap_server_conf, + "apr_accept"); + } else { + process_socket(ptrans, csd, child_slot, bucket_alloc); + requests_this_child--; + } + } + else { + apr_thread_mutex_unlock(accept_mutex); + break; + } + apr_pool_clear(ptrans); + } + + ap_update_child_status_from_indexes(0, child_slot, SERVER_DEAD, (request_rec*)NULL); + + apr_bucket_alloc_destroy(bucket_alloc); + + ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, NULL, + "worker_thread %ld exiting", find_thread(NULL)); + + apr_thread_mutex_lock(worker_thread_count_mutex); + worker_thread_count--; + apr_thread_mutex_unlock(worker_thread_count_mutex); + + return (0); +} + +static int make_worker(int slot) +{ + thread_id tid; + proc_info *my_info = (proc_info *)malloc(sizeof(proc_info)); /* freed by thread... */ + + if (my_info == NULL) { + ap_log_error(APLOG_MARK, APLOG_ALERT, errno, ap_server_conf, + "malloc: out of memory"); + clean_child_exit(APEXIT_CHILDFATAL); + } + + my_info->slot = slot; + apr_pool_create(&my_info->tpool, pchild); + + if (slot + 1 > ap_max_child_assigned) + ap_max_child_assigned = slot + 1; + + if (one_process) { + set_signals(); + ap_scoreboard_image->parent[0].pid = getpid(); + return 0; + } + + (void) ap_update_child_status_from_indexes(0, slot, SERVER_STARTING, (request_rec*)NULL); + tid = spawn_thread(worker_thread, "apache_worker", B_NORMAL_PRIORITY, + my_info); + if (tid < B_NO_ERROR) { + ap_log_error(APLOG_MARK, APLOG_ERR, errno, NULL, + "spawn_thread: Unable to start a new thread"); + /* In case system resources are maxxed out, we don't want + * Apache running away with the CPU trying to fork over and + * over and over again. + */ + (void) ap_update_child_status_from_indexes(0, slot, SERVER_DEAD, + (request_rec*)NULL); + + sleep(10); + free(my_info); + + return -1; + } + resume_thread(tid); + + ap_scoreboard_image->servers[0][slot].tid = tid; + return 0; +} + +static void check_restart(void *data) +{ + if (!restart_pending && !shutdown_pending) { + int slot = (int)data; + make_worker(slot); + ap_log_error(APLOG_MARK, APLOG_INFO, 0, NULL, + "spawning a new worker thread in slot %d", slot); + } +} + +/* start up a bunch of children */ +static void startup_threads(int number_to_start) +{ + int i; + + for (i = 0; number_to_start && i < ap_thread_limit; ++i) { + if (ap_scoreboard_image->servers[0][i].tid) { + continue; + } + if (make_worker(i) < 0) { + break; + } + --number_to_start; + } +} + + +/* + * spawn_rate is the number of children that will be spawned on the + * next maintenance cycle if there aren't enough idle servers. It is + * doubled up to MAX_SPAWN_RATE, and reset only when a cycle goes by + * without the need to spawn. + */ +static int spawn_rate = 1; +#ifndef MAX_SPAWN_RATE +#define MAX_SPAWN_RATE (32) +#endif +static int hold_off_on_exponential_spawning; + +static void perform_idle_server_maintenance(void) +{ + int i; + int free_length; + int free_slots[MAX_SPAWN_RATE]; + int last_non_dead = -1; + + /* initialize the free_list */ + free_length = 0; + + for (i = 0; i < ap_thread_limit; ++i) { + if (ap_scoreboard_image->servers[0][i].tid == 0) { + if (free_length < spawn_rate) { + free_slots[free_length] = i; + ++free_length; + } + } + else { + last_non_dead = i; + } + + if (i >= ap_max_child_assigned && free_length >= spawn_rate) { + break; + } + } + ap_max_child_assigned = last_non_dead + 1; + + if (free_length > 0) { + for (i = 0; i < free_length; ++i) { + make_worker(free_slots[i]); + } + /* the next time around we want to spawn twice as many if this + * wasn't good enough, but not if we've just done a graceful + */ + if (hold_off_on_exponential_spawning) { + --hold_off_on_exponential_spawning; + } else if (spawn_rate < MAX_SPAWN_RATE) { + spawn_rate *= 2; + } + } else { + spawn_rate = 1; + } +} + +static void server_main_loop(int remaining_threads_to_start) +{ + int child_slot; + apr_exit_why_e exitwhy; + int status; + apr_proc_t pid; + int i; + + while (!restart_pending && !shutdown_pending) { + + ap_wait_or_timeout(&exitwhy, &status, &pid, pconf); + + if (pid.pid >= 0) { + if (ap_process_child_status(&pid, exitwhy, status) == APEXIT_CHILDFATAL) { + shutdown_pending = 1; + child_fatal = 1; + return; + } + /* non-fatal death... note that it's gone in the scoreboard. */ + child_slot = -1; + for (i = 0; i < ap_max_child_assigned; ++i) { + if (ap_scoreboard_image->servers[0][i].tid == pid.pid) { + child_slot = i; + break; + } + } + if (child_slot >= 0) { + ap_scoreboard_image->servers[0][child_slot].tid = 0; + (void) ap_update_child_status_from_indexes(0, child_slot, + SERVER_DEAD, + (request_rec*)NULL); + + if (remaining_threads_to_start + && child_slot < ap_thread_limit) { + /* we're still doing a 1-for-1 replacement of dead + * children with new children + */ + make_worker(child_slot); + --remaining_threads_to_start; + } +#if APR_HAS_OTHER_CHILD + } + else if (apr_proc_other_child_read(&pid, status) == 0) { + /* handled */ +#endif + } + else if (is_graceful) { + /* Great, we've probably just lost a slot in the + * scoreboard. Somehow we don't know about this + * child. + */ + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, ap_server_conf, + "long lost child came home! (pid %ld)", pid.pid); + } + + /* Don't perform idle maintenance when a child dies, + * only do it when there's a timeout. Remember only a + * finite number of children can die, and it's pretty + * pathological for a lot to die suddenly. + */ + continue; + } + else if (remaining_threads_to_start) { + /* we hit a 1 second timeout in which none of the previous + * generation of children needed to be reaped... so assume + * they're all done, and pick up the slack if any is left. + */ + startup_threads(remaining_threads_to_start); + remaining_threads_to_start = 0; + /* In any event we really shouldn't do the code below because + * few of the servers we just started are in the IDLE state + * yet, so we'd mistakenly create an extra server. + */ + continue; + } + perform_idle_server_maintenance(); + } +} + +AP_DECLARE(apr_status_t) ap_mpm_query(int query_code, int *result) +{ + switch(query_code){ + case AP_MPMQ_MAX_DAEMON_USED: + *result = ap_max_child_assigned; + return APR_SUCCESS; + case AP_MPMQ_IS_THREADED: + *result = AP_MPMQ_DYNAMIC; + return APR_SUCCESS; + case AP_MPMQ_IS_FORKED: + *result = AP_MPMQ_NOT_SUPPORTED; + return APR_SUCCESS; + case AP_MPMQ_HARD_LIMIT_DAEMONS: + *result = HARD_SERVER_LIMIT; + return APR_SUCCESS; + case AP_MPMQ_HARD_LIMIT_THREADS: + *result = HARD_THREAD_LIMIT; + return APR_SUCCESS; + case AP_MPMQ_MAX_THREADS: + *result = HARD_THREAD_LIMIT; + return APR_SUCCESS; + case AP_MPMQ_MIN_SPARE_DAEMONS: + *result = 0; + return APR_SUCCESS; + case AP_MPMQ_MIN_SPARE_THREADS: + *result = max_spare_threads; + return APR_SUCCESS; + case AP_MPMQ_MAX_SPARE_DAEMONS: + *result = 0; + return APR_SUCCESS; + case AP_MPMQ_MAX_SPARE_THREADS: + *result = min_spare_threads; + return APR_SUCCESS; + case AP_MPMQ_MAX_REQUESTS_DAEMON: + *result = ap_max_requests_per_thread; + return APR_SUCCESS; + case AP_MPMQ_MAX_DAEMONS: + *result = HARD_SERVER_LIMIT; + return APR_SUCCESS; + case AP_MPMQ_MPM_STATE: + *result = mpm_state; + return APR_SUCCESS; + } + return APR_ENOTIMPL; +} + +int ap_mpm_run(apr_pool_t *_pconf, apr_pool_t *plog, server_rec *s) +{ + int remaining_threads_to_start, i,j; + apr_status_t rv; + ap_listen_rec *lr; + pconf = _pconf; + ap_server_conf = s; + + /* Increase the available pool of fd's. This code from + * Joe Kloss + */ + if( FD_SETSIZE > 128 && (i = _kset_fd_limit_( 128 )) < 0 ){ + ap_log_error(APLOG_MARK, APLOG_ERR, i, s, + "could not set FD_SETSIZE (_kset_fd_limit_ failed)"); + } + + /* BeOS R5 doesn't support pipes on select() calls, so we use a + UDP socket as these are supported in both R5 and BONE. If we only cared + about BONE we'd use a pipe, but there it is. + As we have UDP support in APR, now use the APR functions and check all the + return values... + */ + if (apr_sockaddr_info_get(&udp_sa, "127.0.0.1", APR_UNSPEC, 7772, 0, _pconf) + != APR_SUCCESS){ + ap_log_error(APLOG_MARK, APLOG_ALERT, errno, s, + "couldn't create control socket information, shutting down"); + return 1; + } + if (apr_socket_create(&udp_sock, udp_sa->family, SOCK_DGRAM, + _pconf) != APR_SUCCESS){ + ap_log_error(APLOG_MARK, APLOG_ALERT, errno, s, + "couldn't create control socket, shutting down"); + return 1; + } + if (apr_bind(udp_sock, udp_sa) != APR_SUCCESS){ + ap_log_error(APLOG_MARK, APLOG_ALERT, errno, s, + "couldn't bind UDP socket!"); + return 1; + } + + if ((num_listening_sockets = ap_setup_listeners(ap_server_conf)) < 1) { + ap_log_error(APLOG_MARK, APLOG_ALERT, 0, s, + "no listening sockets available, shutting down"); + return 1; + } + + ap_log_pid(pconf, ap_pid_fname); + + /* + * Create our locks... + */ + + /* accept_mutex + * used to lock around select so we only have one thread + * in select at a time + */ + rv = apr_thread_mutex_create(&accept_mutex, 0, pconf); + if (rv != APR_SUCCESS) { + /* tsch tsch, can't have more than one thread in the accept loop + at a time so we need to fall on our sword... */ + ap_log_error(APLOG_MARK, APLOG_EMERG, rv, s, + "Couldn't create accept lock"); + return 1; + } + + /* worker_thread_count_mutex + * locks the worker_thread_count so we have ana ccurate count... + */ + rv = apr_thread_mutex_create(&worker_thread_count_mutex, 0, pconf); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_EMERG, rv, s, + "Couldn't create worker thread count lock"); + return 1; + } + + /* + * Startup/shutdown... + */ + + if (!is_graceful) { + /* setup the scoreboard shared memory */ + if (ap_run_pre_mpm(s->process->pool, SB_SHARED) != OK) { + return 1; + } + + for (i = 0; i < HARD_SERVER_LIMIT; i++) { + ap_scoreboard_image->parent[i].pid = 0; + for (j = 0;j < HARD_THREAD_LIMIT; j++) + ap_scoreboard_image->servers[i][j].tid = 0; + } + } + + if (HARD_SERVER_LIMIT == 1) + ap_scoreboard_image->parent[0].pid = getpid(); + + set_signals(); + + /* Sanity checks to avoid thrashing... */ + if (max_spare_threads < min_spare_threads ) + max_spare_threads = min_spare_threads; + + /* If we're doing a graceful_restart then we're going to see a lot + * of threads exiting immediately when we get into the main loop + * below (because we just sent them AP_SIG_GRACEFUL). This happens + * pretty rapidly... and for each one that exits we'll start a new one + * until we reach at least threads_min_free. But we may be permitted to + * start more than that, so we'll just keep track of how many we're + * supposed to start up without the 1 second penalty between each fork. + */ + remaining_threads_to_start = ap_threads_to_start; + /* sanity check on the number to start... */ + if (remaining_threads_to_start > ap_thread_limit) { + remaining_threads_to_start = ap_thread_limit; + } + + /* setup the child pool to use for the workers. Each worker creates + * a seperate pool of its own to use. + */ + apr_pool_create(&pchild, pconf); + + /* Now that we have the child pool (pchild) we can allocate + * the listenfds and creat the pollset... + */ + listening_sockets = apr_palloc(pchild, + sizeof(*listening_sockets) * (num_listening_sockets + 1)); + + listening_sockets[0] = udp_sock; + for (lr = ap_listeners, i = 1; i <= num_listening_sockets; lr = lr->next, ++i) + listening_sockets[i]=lr->sd; + + /* we assume all goes OK...hmm might want to check that! */ + /* if we're in one_process mode we don't want to start threads + * do we?? + */ + if (!is_graceful && !one_process) { + startup_threads(remaining_threads_to_start); + remaining_threads_to_start = 0; + } + else { + /* give the system some time to recover before kicking into + * exponential mode */ + hold_off_on_exponential_spawning = 10; + } + + /* + * record that we've entered the world ! + */ + ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, ap_server_conf, + "%s configured -- resuming normal operations", + ap_get_server_version()); + + ap_log_error(APLOG_MARK, APLOG_INFO, 0, ap_server_conf, + "Server built: %s", ap_get_server_built()); + + restart_pending = shutdown_pending = 0; + + /* + * main_loop until it's all over + */ + if (!one_process) { + server_main_loop(remaining_threads_to_start); + + tell_workers_to_exit(); /* if we get here we're exiting... */ + sleep(1); /* give them a brief chance to exit */ + } else { + proc_info *my_info = (proc_info *)malloc(sizeof(proc_info)); + my_info->slot = 0; + apr_pool_create(&my_info->tpool, pchild); + worker_thread(my_info); + } + + /* close the UDP socket we've been using... */ + apr_socket_close(listening_sockets[0]); + + if ((one_process || shutdown_pending) && !child_fatal) { + const char *pidfile = NULL; + pidfile = ap_server_root_relative (pconf, ap_pid_fname); + if ( pidfile != NULL && unlink(pidfile) == 0) + ap_log_error(APLOG_MARK, APLOG_INFO, 0, ap_server_conf, + "removed PID file %s (pid=%ld)", pidfile, + (long)getpid()); + } + + if (one_process) { + return 1; + } + + /* + * If we get here we're shutting down... + */ + if (shutdown_pending) { + /* Time to gracefully shut down: + * Kill child processes, tell them to call child_exit, etc... + */ + if (beosd_killpg(getpgrp(), SIGTERM) < 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, + "killpg SIGTERM"); + + /* use ap_reclaim_child_processes starting with SIGTERM */ + ap_reclaim_child_processes(1); + + if (!child_fatal) { /* already recorded */ + /* record the shutdown in the log */ + ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, ap_server_conf, + "caught SIGTERM, shutting down"); + } + + return 1; + } + + /* we've been told to restart */ + signal(SIGHUP, SIG_IGN); + + if (is_graceful) { + ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, ap_server_conf, + AP_SIG_GRACEFUL_STRING " received. Doing graceful restart"); + } + else { + /* Kill 'em all. Since the child acts the same on the parents SIGTERM + * and a SIGHUP, we may as well use the same signal, because some user + * pthreads are stealing signals from us left and right. + */ + + ap_reclaim_child_processes(1); /* Start with SIGTERM */ + ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, ap_server_conf, + "SIGHUP received. Attempting to restart"); + } + + /* just before we go, tidy up the locks we've created to prevent a + * potential leak of semaphores... */ + apr_thread_mutex_destroy(worker_thread_count_mutex); + apr_thread_mutex_destroy(accept_mutex); + + return 0; +} + +static int beos_pre_config(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp) +{ + static int restart_num = 0; + int no_detach, debug, foreground; + apr_status_t rv; + + mpm_state = AP_MPMQ_STARTING; + + debug = ap_exists_config_define("DEBUG"); + + if (debug) { + foreground = one_process = 1; + no_detach = 0; + } + else + { + one_process = ap_exists_config_define("ONE_PROCESS"); + no_detach = ap_exists_config_define("NO_DETACH"); + foreground = ap_exists_config_define("FOREGROUND"); + } + + /* sigh, want this only the second time around */ + if (restart_num++ == 1) { + is_graceful = 0; + + if (!one_process && !foreground) { + rv = apr_proc_detach(no_detach ? APR_PROC_DETACH_FOREGROUND + : APR_PROC_DETACH_DAEMONIZE); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_CRIT, rv, NULL, + "apr_proc_detach failed"); + return HTTP_INTERNAL_SERVER_ERROR; + } + } + + server_pid = getpid(); + } + + beosd_pre_config(); + ap_listen_pre_config(); + ap_threads_to_start = DEFAULT_START_THREADS; + min_spare_threads = DEFAULT_MIN_FREE_THREADS; + max_spare_threads = DEFAULT_MAX_FREE_THREADS; + ap_thread_limit = HARD_THREAD_LIMIT; + ap_pid_fname = DEFAULT_PIDLOG; + ap_max_requests_per_thread = DEFAULT_MAX_REQUESTS_PER_THREAD; +#ifdef AP_MPM_WANT_SET_MAX_MEM_FREE + ap_max_mem_free = APR_ALLOCATOR_MAX_FREE_UNLIMITED; +#endif + + apr_cpystrn(ap_coredump_dir, ap_server_root, sizeof(ap_coredump_dir)); + + return OK; +} + +static void beos_hooks(apr_pool_t *p) +{ + one_process = 0; + + ap_hook_pre_config(beos_pre_config, NULL, NULL, APR_HOOK_REALLY_FIRST); +} + +static const char *set_threads_to_start(cmd_parms *cmd, void *dummy, const char *arg) +{ + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + ap_threads_to_start = atoi(arg); + if (ap_threads_to_start < 0) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "StartThreads set to a value less than 0, reset to 1"); + ap_threads_to_start = 1; + } + return NULL; +} + +static const char *set_min_spare_threads(cmd_parms *cmd, void *dummy, const char *arg) +{ + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + min_spare_threads = atoi(arg); + if (min_spare_threads <= 0) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: detected MinSpareThreads set to non-positive."); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "Resetting to 1 to avoid almost certain Apache failure."); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "Please read the documentation."); + min_spare_threads = 1; + } + + return NULL; +} + +static const char *set_max_spare_threads(cmd_parms *cmd, void *dummy, const char *arg) +{ + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + max_spare_threads = atoi(arg); + return NULL; +} + +static const char *set_threads_limit (cmd_parms *cmd, void *dummy, const char *arg) +{ + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + ap_thread_limit = atoi(arg); + if (ap_thread_limit > HARD_THREAD_LIMIT) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: MaxClients of %d exceeds compile time limit " + "of %d servers,", ap_thread_limit, HARD_THREAD_LIMIT); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " lowering MaxClients to %d. To increase, please " + "see the", HARD_THREAD_LIMIT); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " HARD_THREAD_LIMIT define in server/mpm/beos/mpm_default.h."); + ap_thread_limit = HARD_THREAD_LIMIT; + } + else if (ap_thread_limit < 1) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: Require MaxClients > 0, setting to %d", HARD_THREAD_LIMIT); + ap_thread_limit = HARD_THREAD_LIMIT; + } + return NULL; +} + +static const char *set_max_requests_per_thread (cmd_parms *cmd, void *dummy, const char *arg) +{ + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + ap_max_requests_per_thread = atoi(arg); + if (ap_max_requests_per_thread < 0) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: MaxRequestsPerThread was set below 0" + "reset to 0, but this may not be what you want."); + ap_max_requests_per_thread = 0; + } + + return NULL; +} + +static const command_rec beos_cmds[] = { +BEOS_DAEMON_COMMANDS, +LISTEN_COMMANDS, +AP_INIT_TAKE1( "StartThreads", set_threads_to_start, NULL, RSRC_CONF, + "Number of threads to launch at server startup"), +AP_INIT_TAKE1( "MinSpareThreads", set_min_spare_threads, NULL, RSRC_CONF, + "Minimum number of idle children, to handle request spikes"), +AP_INIT_TAKE1( "MaxSpareThreads", set_max_spare_threads, NULL, RSRC_CONF, + "Maximum number of idle children" ), +AP_INIT_TAKE1( "MaxClients", set_threads_limit, NULL, RSRC_CONF, + "Maximum number of children alive at the same time (max threads)" ), +AP_INIT_TAKE1( "MaxRequestsPerThread", set_max_requests_per_thread, NULL, RSRC_CONF, + "Maximum number of requests served by a thread" ), +{ NULL } +}; + +module AP_MODULE_DECLARE_DATA mpm_beos_module = { + MPM20_MODULE_STUFF, + NULL, /* hook to run before apache parses args */ + NULL, /* create per-directory config structure */ + NULL, /* merge per-directory config structures */ + NULL, /* create per-server config structure */ + NULL, /* merge per-server config structures */ + beos_cmds, /* command apr_table_t */ + beos_hooks /* register_hooks */ +}; + diff --git a/rubbos/app/httpd-2.0.64/server/mpm/beos/beos.h b/rubbos/app/httpd-2.0.64/server/mpm/beos/beos.h new file mode 100644 index 00000000..eb8a5509 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/beos/beos.h @@ -0,0 +1,26 @@ +/* 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. + */ + +#ifndef APACHE_MPM_BEOS_H +#define APACHE_MPM_BEOS_H + +extern int ap_threads_per_child; +extern int ap_pipe_of_death[2]; +extern int ap_extended_status; +extern void clean_child_exit(int); +extern int max_daemons_limit; + +#endif /* APACHE_MPM_BEOS_H */ diff --git a/rubbos/app/httpd-2.0.64/server/mpm/beos/config5.m4 b/rubbos/app/httpd-2.0.64/server/mpm/beos/config5.m4 new file mode 100644 index 00000000..4f201408 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/beos/config5.m4 @@ -0,0 +1,7 @@ +dnl ## XXX - Need a more thorough check of the proper flags to use + +if test "$MPM_NAME" = "beos" ; then + apache_apr_flags="--enable-threads" + + APACHE_FAST_OUTPUT(server/mpm/$MPM_NAME/Makefile) +fi diff --git a/rubbos/app/httpd-2.0.64/server/mpm/beos/mpm.h b/rubbos/app/httpd-2.0.64/server/mpm/beos/mpm.h new file mode 100644 index 00000000..57221b1c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/beos/mpm.h @@ -0,0 +1,40 @@ +/* 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. + */ + +#ifndef APACHE_MPM_BEOS_H +#define APACHE_MPM_BEOS_H + +#define BEOS_MPM +#include "scoreboard.h" + +#define MPM_NAME "Beos" +#define MPM_CHILD_PID(i) (ap_scoreboard_image->servers[0][i].tid) +#define MPM_NOTE_CHILD_KILLED(i) (MPM_CHILD_PID(i) = 0) + +#define AP_MPM_WANT_RECLAIM_CHILD_PROCESSES +#define AP_MPM_WANT_WAIT_OR_TIMEOUT +#define AP_MPM_WANT_PROCESS_CHILD_STATUS +#define AP_MPM_WANT_SET_PIDFILE +#define AP_MPM_WANT_SET_SCOREBOARD +#define AP_MPM_WANT_SET_MAX_REQUESTS +#define AP_MPM_WANT_SET_COREDUMPDIR +#define AP_MPM_WANT_SET_MAX_MEM_FREE + +extern int ap_max_child_assigned; +extern server_rec *ap_server_conf; +extern int ap_threads_per_child; + +#endif /* APACHE_MPM_BEOS_H */ diff --git a/rubbos/app/httpd-2.0.64/server/mpm/beos/mpm_default.h b/rubbos/app/httpd-2.0.64/server/mpm/beos/mpm_default.h new file mode 100644 index 00000000..7bd0ce48 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/beos/mpm_default.h @@ -0,0 +1,76 @@ +/* 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. + */ + +#ifndef APACHE_MPM_DEFAULT_H +#define APACHE_MPM_DEFAULT_H + +/* we use the child (c) as zero in our code... */ +#define AP_ID_FROM_CHILD_THREAD(c, t) t +/* as the child is always zero, just return the id... */ +#define AP_CHILD_THREAD_FROM_ID(i) 0 , i + +/* Number of threads to spawn off by default --- also, if fewer than + * this free when the caretaker checks, it will spawn more. + */ +#ifndef DEFAULT_START_THREADS +#define DEFAULT_START_THREADS 10 +#endif + +#ifdef NO_THREADS +#define DEFAULT_THREADS 1 +#endif +#ifndef DEFAULT_THREADS +#define DEFAULT_THREADS 10 +#endif + +/* The following 2 settings are used to control the number of threads + * we have available. Normally the DEFAULT_MAX_FREE_THREADS is set + * to the same as the HARD_THREAD_LIMIT to avoid churning of starting + * new threads to replace threads killed off... + */ + +/* Maximum number of *free* threads --- more than this, and + * they will die off. + */ +#ifndef DEFAULT_MAX_FREE_THREADS +#define DEFAULT_MAX_FREE_THREADS HARD_THREAD_LIMIT +#endif + +/* Minimum --- fewer than this, and more will be created */ +#ifndef DEFAULT_MIN_FREE_THREADS +#define DEFAULT_MIN_FREE_THREADS 1 +#endif + +/* Where the main/parent process's pid is logged */ +#ifndef DEFAULT_PIDLOG +#define DEFAULT_PIDLOG DEFAULT_REL_RUNTIMEDIR "/httpd.pid" +#endif + +/* + * Interval, in microseconds, between scoreboard maintenance. + */ +#ifndef SCOREBOARD_MAINTENANCE_INTERVAL +#define SCOREBOARD_MAINTENANCE_INTERVAL 1000000 +#endif + +/* Number of requests to try to handle in a single process. If == 0, + * the children don't die off. + */ +#ifndef DEFAULT_MAX_REQUESTS_PER_THREAD +#define DEFAULT_MAX_REQUESTS_PER_THREAD 0 +#endif + +#endif /* AP_MPM_DEFAULT_H */ diff --git a/rubbos/app/httpd-2.0.64/server/mpm/config.m4 b/rubbos/app/httpd-2.0.64/server/mpm/config.m4 new file mode 100644 index 00000000..c86a624e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/config.m4 @@ -0,0 +1,45 @@ +AC_MSG_CHECKING(which MPM to use) +AC_ARG_WITH(mpm, +APACHE_HELP_STRING(--with-mpm=MPM,Choose the process model for Apache to use. + MPM={beos|worker|prefork|mpmt_os2|perchild|leader|threadpool}),[ + APACHE_MPM=$withval +],[ + if test "x$APACHE_MPM" = "x"; then + APACHE_MPM=prefork + fi +]) +AC_MSG_RESULT($APACHE_MPM) + +apache_cv_mpm=$APACHE_MPM + +if test "$apache_cv_mpm" = "worker" -o "$apache_cv_mpm" = "perchild" -o "$apache_cv_mpm" = "leader" -o "$apache_cv_mpm" = "threadpool" ; then + APR_CHECK_APR_DEFINE(APR_HAS_THREADS) + + if test "x$ac_cv_define_APR_HAS_THREADS" = "xno"; then + AC_MSG_RESULT(The currently selected MPM requires threads which your system seems to lack) + AC_MSG_CHECKING(checking for replacement) + AC_MSG_RESULT(prefork selected) + apache_cv_mpm=prefork + fi +fi + +APACHE_FAST_OUTPUT(server/mpm/Makefile) + +MPM_NAME=$apache_cv_mpm +if test "$MPM_NAME" = "leader" -o "$MPM_NAME" = "threadpool" -o "$MPM_NAME" = "perchild"; then + AC_MSG_WARN(You have selected an EXPERIMENTAL MPM. Be warned!) + MPM_SUBDIR_NAME=experimental/$MPM_NAME +else + MPM_SUBDIR_NAME=$MPM_NAME +fi +MPM_DIR=server/mpm/$MPM_SUBDIR_NAME +MPM_LIB=$MPM_DIR/lib${MPM_NAME}.la + +if test ! -f "$abs_srcdir/$MPM_DIR/mpm.h"; then + AC_MSG_ERROR(the selected mpm -- $apache_cv_mpm -- is not supported) +fi + +APACHE_SUBST(MPM_NAME) +APACHE_SUBST(MPM_SUBDIR_NAME) +MODLIST="$MODLIST mpm_${MPM_NAME}" + diff --git a/rubbos/app/httpd-2.0.64/server/mpm/experimental/leader/Makefile.in b/rubbos/app/httpd-2.0.64/server/mpm/experimental/leader/Makefile.in new file mode 100644 index 00000000..03f1765e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/experimental/leader/Makefile.in @@ -0,0 +1,5 @@ + +LTLIBRARY_NAME = libleader.la +LTLIBRARY_SOURCES = leader.c + +include $(top_srcdir)/build/ltlib.mk diff --git a/rubbos/app/httpd-2.0.64/server/mpm/experimental/leader/README b/rubbos/app/httpd-2.0.64/server/mpm/experimental/leader/README new file mode 100644 index 00000000..1981a5be --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/experimental/leader/README @@ -0,0 +1,15 @@ +Leader MPM: +This is an experimental variant of the standard worker MPM. +It uses a Leader/Followers design pattern to coordinate work among threads: +http://deuce.doc.wustl.edu/doc/pspdfs/lf.pdf + +To use the leader MPM, add "--with-mpm=leader" to the configure +script's arguments when building the httpd. + +This MPM depends on APR's atomic compare-and-swap operations for +thread synchronization. If you are compiling for an x86 target +and you don't need to support 386s, or you're compiling for a +SPARC and you don't need to run on pre-UltraSPARC chips, add +"--enable-nonportable-atomics=yes" to the configure script's +arguments. This will cause APR to implement atomic operations +using efficient opcodes not available in older CPUs. diff --git a/rubbos/app/httpd-2.0.64/server/mpm/experimental/leader/config5.m4 b/rubbos/app/httpd-2.0.64/server/mpm/experimental/leader/config5.m4 new file mode 100644 index 00000000..9a915abf --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/experimental/leader/config5.m4 @@ -0,0 +1,6 @@ +dnl ## XXX - Need a more thorough check of the proper flags to use + +if test "$MPM_NAME" = "leader" ; then + AC_CHECK_FUNCS(pthread_kill) + APACHE_FAST_OUTPUT(server/mpm/$MPM_SUBDIR_NAME/Makefile) +fi diff --git a/rubbos/app/httpd-2.0.64/server/mpm/experimental/leader/leader.c b/rubbos/app/httpd-2.0.64/server/mpm/experimental/leader/leader.c new file mode 100644 index 00000000..322c2286 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/experimental/leader/leader.c @@ -0,0 +1,1976 @@ +/* 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. + */ + +#include "apr.h" +#include "apr_portable.h" +#include "apr_strings.h" +#include "apr_file_io.h" +#include "apr_thread_proc.h" +#include "apr_signal.h" +#include "apr_thread_cond.h" +#include "apr_thread_mutex.h" +#include "apr_proc_mutex.h" +#define APR_WANT_STRFUNC +#include "apr_want.h" + +#if APR_HAVE_UNISTD_H +#include +#endif +#if APR_HAVE_SYS_SOCKET_H +#include +#endif +#if APR_HAVE_SYS_WAIT_H +#include +#endif +#ifdef HAVE_SYS_PROCESSOR_H +#include /* for bindprocessor() */ +#endif + +#if !APR_HAS_THREADS +#error The Leader/Follower MPM requires APR threads, but they are unavailable. +#endif + +#define CORE_PRIVATE + +#include "ap_config.h" +#include "httpd.h" +#include "http_main.h" +#include "http_log.h" +#include "http_config.h" /* for read_config */ +#include "http_core.h" /* for get_remote_host */ +#include "http_connection.h" +#include "ap_mpm.h" +#include "mpm_common.h" +#include "ap_listen.h" +#include "scoreboard.h" +#include "mpm_default.h" +#include "apr_poll.h" + +#include +#include /* for INT_MAX */ + +#include "apr_atomic.h" + +/* Limit on the total --- clients will be locked out if more servers than + * this are needed. It is intended solely to keep the server from crashing + * when things get out of hand. + * + * We keep a hard maximum number of servers, for two reasons --- first off, + * in case something goes seriously wrong, we want to stop the fork bomb + * short of actually crashing the machine we're running on by filling some + * kernel table. Secondly, it keeps the size of the scoreboard file small + * enough that we can read the whole thing without worrying too much about + * the overhead. + */ +#ifndef DEFAULT_SERVER_LIMIT +#define DEFAULT_SERVER_LIMIT 16 +#endif + +/* Admin can't tune ServerLimit beyond MAX_SERVER_LIMIT. We want + * some sort of compile-time limit to help catch typos. + */ +#ifndef MAX_SERVER_LIMIT +#define MAX_SERVER_LIMIT 20000 +#endif + +/* Limit on the threads per process. Clients will be locked out if more than + * this * server_limit are needed. + * + * We keep this for one reason it keeps the size of the scoreboard file small + * enough that we can read the whole thing without worrying too much about + * the overhead. + */ +#ifndef DEFAULT_THREAD_LIMIT +#define DEFAULT_THREAD_LIMIT 64 +#endif + +/* Admin can't tune ThreadLimit beyond MAX_THREAD_LIMIT. We want + * some sort of compile-time limit to help catch typos. + */ +#ifndef MAX_THREAD_LIMIT +#define MAX_THREAD_LIMIT 20000 +#endif + +/* + * Actual definitions of config globals + */ + +int ap_threads_per_child = 0; /* Worker threads per child */ +static int ap_daemons_to_start = 0; +static int min_spare_threads = 0; +static int max_spare_threads = 0; +static int ap_daemons_limit = 0; +static int server_limit = DEFAULT_SERVER_LIMIT; +static int first_server_limit; +static int thread_limit = DEFAULT_THREAD_LIMIT; +static int first_thread_limit; +static int changed_limit_at_restart; +static int dying = 0; +static int workers_may_exit = 0; +static int start_thread_may_exit = 0; +static int requests_this_child; +static int num_listensocks = 0; +static int resource_shortage = 0; +static int mpm_state = AP_MPMQ_STARTING; + +typedef struct worker_wakeup_info worker_wakeup_info; + +/* The structure used to pass unique initialization info to each thread */ +typedef struct { + int pid; + int tid; + int sd; +} proc_info; + + +/* Structure used to pass information to the thread responsible for + * creating the rest of the threads. + */ +typedef struct { + apr_thread_t **threads; + int child_num_arg; + apr_threadattr_t *threadattr; +} thread_starter; + +#define ID_FROM_CHILD_THREAD(c, t) ((c * thread_limit) + t) + +/* + * The max child slot ever assigned, preserved across restarts. Necessary + * to deal with MaxClients changes across AP_SIG_GRACEFUL restarts. We + * use this value to optimize routines that have to scan the entire + * scoreboard. + */ +int ap_max_daemons_limit = -1; + +static ap_pod_t *pod; + +/* *Non*-shared http_main globals... */ + +server_rec *ap_server_conf; + +/* This MPM respects a couple of runtime flags that can aid in debugging. + * Setting the -DNO_DETACH flag will prevent the root process from + * detaching from its controlling terminal. Additionally, setting + * the -DONE_PROCESS flag (which implies -DNO_DETACH) will get you the + * child_main loop running in the process which originally started up. + * This gives you a pretty nice debugging environment. (You'll get a SIGHUP + * early in standalone_main; just continue through. This is the server + * trying to kill off any child processes which it might have lying + * around --- Apache doesn't keep track of their pids, it just sends + * SIGHUP to the process group, ignoring it in the root process. + * Continue through and you'll be fine.). + */ + +static int one_process = 0; + +#ifdef DEBUG_SIGSTOP +int raise_sigstop_flags; +#endif + +static apr_pool_t *pconf; /* Pool for config stuff */ +static apr_pool_t *pchild; /* Pool for httpd child stuff */ + +static pid_t ap_my_pid; /* Linux getpid() doesn't work except in main + thread. Use this instead */ +static pid_t parent_pid; + +/* Locks for accept serialization */ +static apr_proc_mutex_t *accept_mutex; + +#ifdef SINGLE_LISTEN_UNSERIALIZED_ACCEPT +#define SAFE_ACCEPT(stmt) (ap_listeners->next ? (stmt) : APR_SUCCESS) +#else +#define SAFE_ACCEPT(stmt) (stmt) +#endif + + +/* Structure used to wake up an idle worker thread + */ +struct worker_wakeup_info { + apr_uint32_t next; /* index into worker_wakeups array, + * used to build a linked list + */ + apr_thread_cond_t *cond; + apr_thread_mutex_t *mutex; +}; + +static worker_wakeup_info *worker_wakeup_create(apr_pool_t *pool) +{ + apr_status_t rv; + worker_wakeup_info *wakeup; + + wakeup = (worker_wakeup_info *)apr_palloc(pool, sizeof(*wakeup)); + if ((rv = apr_thread_cond_create(&wakeup->cond, pool)) != APR_SUCCESS) { + return NULL; + } + if ((rv = apr_thread_mutex_create(&wakeup->mutex, APR_THREAD_MUTEX_DEFAULT, + pool)) != APR_SUCCESS) { + return NULL; + } + /* The wakeup's mutex will be unlocked automatically when + * the worker blocks on the condition variable + */ + apr_thread_mutex_lock(wakeup->mutex); + return wakeup; +} + + +/* Structure used to hold a stack of idle worker threads + */ +typedef struct { + /* 'state' consists of several fields concatenated into a + * single 32-bit int for use with the apr_atomic_cas() API: + * state & STACK_FIRST is the thread ID of the first thread + * in a linked list of idle threads + * state & STACK_TERMINATED indicates whether the proc is shutting down + * state & STACK_NO_LISTENER indicates whether the process has + * no current listener thread + */ + apr_uint32_t state; +} worker_stack; + +#define STACK_FIRST 0xffff +#define STACK_LIST_END 0xffff +#define STACK_TERMINATED 0x10000 +#define STACK_NO_LISTENER 0x20000 + +static worker_wakeup_info **worker_wakeups = NULL; + +static worker_stack* worker_stack_create(apr_pool_t *pool, apr_size_t max) +{ + worker_stack *stack = (worker_stack *)apr_palloc(pool, sizeof(*stack)); + stack->state = STACK_NO_LISTENER | STACK_LIST_END; + return stack; +} + +static apr_status_t worker_stack_wait(worker_stack *stack, + apr_uint32_t worker_id) +{ + worker_wakeup_info *wakeup = worker_wakeups[worker_id]; + + while (1) { + apr_uint32_t state = stack->state; + if (state & (STACK_TERMINATED | STACK_NO_LISTENER)) { + if (state & STACK_TERMINATED) { + return APR_EINVAL; + } + if (apr_atomic_cas(&(stack->state), STACK_LIST_END, state) != + state) { + continue; + } + else { + return APR_SUCCESS; + } + } + wakeup->next = state; + if (apr_atomic_cas(&(stack->state), worker_id, state) != state) { + continue; + } + else { + return apr_thread_cond_wait(wakeup->cond, wakeup->mutex); + } + } +} + +static apr_status_t worker_stack_awaken_next(worker_stack *stack) +{ + + while (1) { + apr_uint32_t state = stack->state; + apr_uint32_t first = state & STACK_FIRST; + if (first == STACK_LIST_END) { + if (apr_atomic_cas(&(stack->state), state | STACK_NO_LISTENER, + state) != state) { + continue; + } + else { + return APR_SUCCESS; + } + } + else { + worker_wakeup_info *wakeup = worker_wakeups[first]; + if (apr_atomic_cas(&(stack->state), (state ^ first) | wakeup->next, + state) != state) { + continue; + } + else { + /* Acquire and release the idle worker's mutex to ensure + * that it's actually waiting on its condition variable + */ + apr_status_t rv; + if ((rv = apr_thread_mutex_lock(wakeup->mutex)) != + APR_SUCCESS) { + return rv; + } + if ((rv = apr_thread_mutex_unlock(wakeup->mutex)) != + APR_SUCCESS) { + return rv; + } + return apr_thread_cond_signal(wakeup->cond); + } + } + } +} + +static apr_status_t worker_stack_term(worker_stack *stack) +{ + int i; + apr_status_t rv; + + while (1) { + apr_uint32_t state = stack->state; + if (apr_atomic_cas(&(stack->state), state | STACK_TERMINATED, + state) == state) { + break; + } + } + for (i = 0; i < ap_threads_per_child; i++) { + if ((rv = worker_stack_awaken_next(stack)) != APR_SUCCESS) { + return rv; + } + } + return APR_SUCCESS; +} + +static worker_stack *idle_worker_stack; + +#define ST_INIT 0 +#define ST_GRACEFUL 1 +#define ST_UNGRACEFUL 2 + +static int terminate_mode = ST_INIT; + +static void signal_threads(int mode) +{ + if (terminate_mode == mode) { + return; + } + terminate_mode = mode; + mpm_state = AP_MPMQ_STOPPING; + workers_may_exit = 1; + + worker_stack_term(idle_worker_stack); +} + +AP_DECLARE(apr_status_t) ap_mpm_query(int query_code, int *result) +{ + switch(query_code){ + case AP_MPMQ_MAX_DAEMON_USED: + *result = ap_max_daemons_limit; + return APR_SUCCESS; + case AP_MPMQ_IS_THREADED: + *result = AP_MPMQ_STATIC; + return APR_SUCCESS; + case AP_MPMQ_IS_FORKED: + *result = AP_MPMQ_DYNAMIC; + return APR_SUCCESS; + case AP_MPMQ_HARD_LIMIT_DAEMONS: + *result = server_limit; + return APR_SUCCESS; + case AP_MPMQ_HARD_LIMIT_THREADS: + *result = thread_limit; + return APR_SUCCESS; + case AP_MPMQ_MAX_THREADS: + *result = ap_threads_per_child; + return APR_SUCCESS; + case AP_MPMQ_MIN_SPARE_DAEMONS: + *result = 0; + return APR_SUCCESS; + case AP_MPMQ_MIN_SPARE_THREADS: + *result = min_spare_threads; + return APR_SUCCESS; + case AP_MPMQ_MAX_SPARE_DAEMONS: + *result = 0; + return APR_SUCCESS; + case AP_MPMQ_MAX_SPARE_THREADS: + *result = max_spare_threads; + return APR_SUCCESS; + case AP_MPMQ_MAX_REQUESTS_DAEMON: + *result = ap_max_requests_per_child; + return APR_SUCCESS; + case AP_MPMQ_MAX_DAEMONS: + *result = ap_daemons_limit; + return APR_SUCCESS; + case AP_MPMQ_MPM_STATE: + *result = mpm_state; + return APR_SUCCESS; + } + return APR_ENOTIMPL; +} + +/* a clean exit from a child with proper cleanup */ +static void clean_child_exit(int code) __attribute__ ((noreturn)); +static void clean_child_exit(int code) +{ + mpm_state = AP_MPMQ_STOPPING; + if (pchild) { + apr_pool_destroy(pchild); + } + ap_mpm_pod_close(pod); + exit(code); +} + +static void just_die(int sig) +{ + clean_child_exit(0); +} + +/***************************************************************** + * Connection structures and accounting... + */ + +/* volatile just in case */ +static int volatile shutdown_pending; +static int volatile restart_pending; +static int volatile is_graceful; +static volatile int child_fatal; +ap_generation_t volatile ap_my_generation; + +/* + * ap_start_shutdown() and ap_start_restart(), below, are a first stab at + * functions to initiate shutdown or restart without relying on signals. + * Previously this was initiated in sig_term() and restart() signal handlers, + * but we want to be able to start a shutdown/restart from other sources -- + * e.g. on Win32, from the service manager. Now the service manager can + * call ap_start_shutdown() or ap_start_restart() as appropiate. Note that + * these functions can also be called by the child processes, since global + * variables are no longer used to pass on the required action to the parent. + * + * These should only be called from the parent process itself, since the + * parent process will use the shutdown_pending and restart_pending variables + * to determine whether to shutdown or restart. The child process should + * call signal_parent() directly to tell the parent to die -- this will + * cause neither of those variable to be set, which the parent will + * assume means something serious is wrong (which it will be, for the + * child to force an exit) and so do an exit anyway. + */ + +static void ap_start_shutdown(void) +{ + mpm_state = AP_MPMQ_STOPPING; + if (shutdown_pending == 1) { + /* Um, is this _probably_ not an error, if the user has + * tried to do a shutdown twice quickly, so we won't + * worry about reporting it. + */ + return; + } + shutdown_pending = 1; +} + +/* do a graceful restart if graceful == 1 */ +static void ap_start_restart(int graceful) +{ + mpm_state = AP_MPMQ_STOPPING; + if (restart_pending == 1) { + /* Probably not an error - don't bother reporting it */ + return; + } + restart_pending = 1; + is_graceful = graceful; +} + +static void sig_term(int sig) +{ + if (ap_my_pid == parent_pid) { + ap_start_shutdown(); + } + else { + signal_threads(ST_GRACEFUL); + } +} + +static void restart(int sig) +{ + ap_start_restart(sig == AP_SIG_GRACEFUL); +} + +static void set_signals(void) +{ +#ifndef NO_USE_SIGACTION + struct sigaction sa; +#endif + + if (!one_process) { + ap_fatal_signal_setup(ap_server_conf, pconf); + } + +#ifndef NO_USE_SIGACTION + sigemptyset(&sa.sa_mask); + sa.sa_flags = 0; + + sa.sa_handler = sig_term; + if (sigaction(SIGTERM, &sa, NULL) < 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, + "sigaction(SIGTERM)"); +#ifdef SIGINT + if (sigaction(SIGINT, &sa, NULL) < 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, + "sigaction(SIGINT)"); +#endif +#ifdef SIGXCPU + sa.sa_handler = SIG_DFL; + if (sigaction(SIGXCPU, &sa, NULL) < 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, + "sigaction(SIGXCPU)"); +#endif +#ifdef SIGXFSZ + sa.sa_handler = SIG_DFL; + if (sigaction(SIGXFSZ, &sa, NULL) < 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, + "sigaction(SIGXFSZ)"); +#endif +#ifdef SIGPIPE + sa.sa_handler = SIG_IGN; + if (sigaction(SIGPIPE, &sa, NULL) < 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, + "sigaction(SIGPIPE)"); +#endif + + /* we want to ignore HUPs and AP_SIG_GRACEFUL while we're busy + * processing one */ + sigaddset(&sa.sa_mask, SIGHUP); + sigaddset(&sa.sa_mask, AP_SIG_GRACEFUL); + sa.sa_handler = restart; + if (sigaction(SIGHUP, &sa, NULL) < 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, + "sigaction(SIGHUP)"); + if (sigaction(AP_SIG_GRACEFUL, &sa, NULL) < 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, + "sigaction(" AP_SIG_GRACEFUL_STRING ")"); +#else + if (!one_process) { +#ifdef SIGXCPU + apr_signal(SIGXCPU, SIG_DFL); +#endif /* SIGXCPU */ +#ifdef SIGXFSZ + apr_signal(SIGXFSZ, SIG_DFL); +#endif /* SIGXFSZ */ + } + + apr_signal(SIGTERM, sig_term); +#ifdef SIGHUP + apr_signal(SIGHUP, restart); +#endif /* SIGHUP */ +#ifdef AP_SIG_GRACEFUL + apr_signal(AP_SIG_GRACEFUL, restart); +#endif /* AP_SIG_GRACEFUL */ +#ifdef SIGPIPE + apr_signal(SIGPIPE, SIG_IGN); +#endif /* SIGPIPE */ + +#endif +} + +/***************************************************************** + * Here follows a long bunch of generic server bookkeeping stuff... + */ + +int ap_graceful_stop_signalled(void) + /* XXX this is really a bad confusing obsolete name + * maybe it should be ap_mpm_process_exiting? + */ +{ + return workers_may_exit; +} + +/***************************************************************** + * Child process main loop. + */ + +static void process_socket(apr_pool_t *p, apr_socket_t *sock, int my_child_num, + int my_thread_num, apr_bucket_alloc_t *bucket_alloc) +{ + conn_rec *current_conn; + long conn_id = ID_FROM_CHILD_THREAD(my_child_num, my_thread_num); + int csd; + ap_sb_handle_t *sbh; + + ap_create_sb_handle(&sbh, p, my_child_num, my_thread_num); + apr_os_sock_get(&csd, sock); + + current_conn = ap_run_create_connection(p, ap_server_conf, sock, + conn_id, sbh, bucket_alloc); + if (current_conn) { + ap_process_connection(current_conn, sock); + ap_lingering_close(current_conn); + } +} + +/* requests_this_child has gone to zero or below. See if the admin coded + "MaxRequestsPerChild 0", and keep going in that case. Doing it this way + simplifies the hot path in worker_thread */ +static void check_infinite_requests(void) +{ + if (ap_max_requests_per_child) { + signal_threads(ST_GRACEFUL); + } + else { + /* wow! if you're executing this code, you may have set a record. + * either this child process has served over 2 billion requests, or + * you're running a threaded 2.0 on a 16 bit machine. + * + * I'll buy pizza and beers at Apachecon for the first person to do + * the former without cheating (dorking with INT_MAX, or running with + * uncommitted performance patches, for example). + * + * for the latter case, you probably deserve a beer too. Greg Ames + */ + + requests_this_child = INT_MAX; /* keep going */ + } +} + +static void unblock_signal(int sig) +{ + sigset_t sig_mask; + + sigemptyset(&sig_mask); + sigaddset(&sig_mask, sig); +#if defined(SIGPROCMASK_SETS_THREAD_MASK) + sigprocmask(SIG_UNBLOCK, &sig_mask, NULL); +#else + pthread_sigmask(SIG_UNBLOCK, &sig_mask, NULL); +#endif +} + +static void *worker_thread(apr_thread_t *thd, void * dummy) +{ + proc_info * ti = dummy; + int process_slot = ti->pid; + int thread_slot = ti->tid; + apr_uint32_t my_worker_num = (apr_uint32_t)(ti->tid); + apr_pool_t *tpool = apr_thread_pool_get(thd); + void *csd = NULL; + apr_allocator_t *allocator; + apr_pool_t *ptrans; /* Pool for per-transaction stuff */ + apr_bucket_alloc_t *bucket_alloc; + int n; + apr_pollfd_t *pollset; + apr_status_t rv; + ap_listen_rec *lr, *last_lr = ap_listeners; + int is_listener; + + ap_update_child_status_from_indexes(process_slot, thread_slot, SERVER_STARTING, NULL); + + free(ti); + + apr_allocator_create(&allocator); + apr_allocator_max_free_set(allocator, ap_max_mem_free); + /* XXX: why is ptrans's parent not tpool? --jcw 08/2003 */ + apr_pool_create_ex(&ptrans, NULL, NULL, allocator); + apr_allocator_owner_set(allocator, ptrans); + bucket_alloc = apr_bucket_alloc_create_ex(allocator); + + apr_poll_setup(&pollset, num_listensocks, tpool); + for(lr = ap_listeners ; lr != NULL ; lr = lr->next) + apr_poll_socket_add(pollset, lr->sd, APR_POLLIN); + + /* TODO: Switch to a system where threads reuse the results from earlier + poll calls - manoj */ + is_listener = 0; + while (!workers_may_exit) { + + ap_update_child_status_from_indexes(process_slot, thread_slot, + SERVER_READY, NULL); + if (!is_listener) { + /* Wait until it's our turn to become the listener */ + if ((rv = worker_stack_wait(idle_worker_stack, my_worker_num)) != + APR_SUCCESS) { + if (rv != APR_EINVAL) { + ap_log_error(APLOG_MARK, APLOG_EMERG, rv, ap_server_conf, + "worker_stack_wait failed. Shutting down"); + } + break; + } + if (workers_may_exit) { + break; + } + is_listener = 1; + } + + /* TODO: requests_this_child should be synchronized - aaron */ + if (requests_this_child <= 0) { + check_infinite_requests(); + } + if (workers_may_exit) break; + + if ((rv = SAFE_ACCEPT(apr_proc_mutex_lock(accept_mutex))) + != APR_SUCCESS) { + int level = APLOG_EMERG; + + if (workers_may_exit) { + break; + } + if (ap_scoreboard_image->parent[process_slot].generation != + ap_scoreboard_image->global->running_generation) { + level = APLOG_DEBUG; /* common to get these at restart time */ + } + ap_log_error(APLOG_MARK, level, rv, ap_server_conf, + "apr_proc_mutex_lock failed. Attempting to shutdown " + "process gracefully."); + signal_threads(ST_GRACEFUL); + break; /* skip the lock release */ + } + + if (!ap_listeners->next) { + /* Only one listener, so skip the poll */ + lr = ap_listeners; + } + else { + while (!workers_may_exit) { + apr_status_t ret; + apr_int16_t event; + + ret = apr_poll(pollset, num_listensocks, &n, -1); + if (ret != APR_SUCCESS) { + if (APR_STATUS_IS_EINTR(ret)) { + continue; + } + + /* apr_poll() will only return errors in catastrophic + * circumstances. Let's try exiting gracefully, for now. */ + ap_log_error(APLOG_MARK, APLOG_ERR, ret, (const server_rec *) + ap_server_conf, "apr_poll: (listen)"); + signal_threads(ST_GRACEFUL); + } + + if (workers_may_exit) break; + + /* find a listener */ + lr = last_lr; + do { + lr = lr->next; + if (lr == NULL) { + lr = ap_listeners; + } + /* XXX: Should we check for POLLERR? */ + apr_poll_revents_get(&event, lr->sd, pollset); + if (event & APR_POLLIN) { + last_lr = lr; + goto got_fd; + } + } while (lr != last_lr); + } + } + got_fd: + if (!workers_may_exit) { + rv = lr->accept_func(&csd, lr, ptrans); + /* later we trash rv and rely on csd to indicate success/failure */ + AP_DEBUG_ASSERT(rv == APR_SUCCESS || !csd); + + if (rv == APR_EGENERAL) { + /* E[NM]FILE, ENOMEM, etc */ + resource_shortage = 1; + signal_threads(ST_GRACEFUL); + } + if ((rv = SAFE_ACCEPT(apr_proc_mutex_unlock(accept_mutex))) + != APR_SUCCESS) { + int level = APLOG_EMERG; + + if (workers_may_exit) { + break; + } + if (ap_scoreboard_image->parent[process_slot].generation != + ap_scoreboard_image->global->running_generation) { + level = APLOG_DEBUG; /* common to get these at restart time */ + } + ap_log_error(APLOG_MARK, level, rv, ap_server_conf, + "apr_proc_mutex_unlock failed. Attempting to " + "shutdown process gracefully."); + signal_threads(ST_GRACEFUL); + } + if (csd != NULL) { + is_listener = 0; + worker_stack_awaken_next(idle_worker_stack); + process_socket(ptrans, csd, process_slot, + thread_slot, bucket_alloc); + apr_pool_clear(ptrans); + requests_this_child--; + } + if ((ap_mpm_pod_check(pod) == APR_SUCCESS) || + (ap_my_generation != + ap_scoreboard_image->global->running_generation)) { + signal_threads(ST_GRACEFUL); + break; + } + } + else { + if ((rv = SAFE_ACCEPT(apr_proc_mutex_unlock(accept_mutex))) + != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_EMERG, rv, ap_server_conf, + "apr_proc_mutex_unlock failed. Attempting to " + "shutdown process gracefully."); + signal_threads(ST_GRACEFUL); + } + break; + } + } + + dying = 1; + ap_scoreboard_image->parent[process_slot].quiescing = 1; + + worker_stack_term(idle_worker_stack); + + ap_update_child_status_from_indexes(process_slot, thread_slot, + (dying) ? SERVER_DEAD : SERVER_GRACEFUL, (request_rec *) NULL); + + apr_bucket_alloc_destroy(bucket_alloc); + + apr_thread_exit(thd, APR_SUCCESS); + return NULL; +} + +static int check_signal(int signum) +{ + switch (signum) { + case SIGTERM: + case SIGINT: + return 1; + } + return 0; +} + +/* XXX under some circumstances not understood, children can get stuck + * in start_threads forever trying to take over slots which will + * never be cleaned up; for now there is an APLOG_DEBUG message issued + * every so often when this condition occurs + */ +static void * APR_THREAD_FUNC start_threads(apr_thread_t *thd, void *dummy) +{ + thread_starter *ts = dummy; + apr_thread_t **threads = ts->threads; + apr_threadattr_t *thread_attr = ts->threadattr; + int child_num_arg = ts->child_num_arg; + int my_child_num = child_num_arg; + proc_info *my_info; + apr_status_t rv; + int i; + int threads_created = 0; + int loops; + int prev_threads_created; + + idle_worker_stack = worker_stack_create(pchild, ap_threads_per_child); + if (idle_worker_stack == NULL) { + ap_log_error(APLOG_MARK, APLOG_ALERT, 0, ap_server_conf, + "worker_stack_create() failed"); + clean_child_exit(APEXIT_CHILDFATAL); + } + + worker_wakeups = (worker_wakeup_info **) + apr_palloc(pchild, sizeof(worker_wakeup_info *) * + ap_threads_per_child); + + loops = prev_threads_created = 0; + while (1) { + for (i = 0; i < ap_threads_per_child; i++) { + int status = ap_scoreboard_image->servers[child_num_arg][i].status; + worker_wakeup_info *wakeup; + + if (status != SERVER_GRACEFUL && status != SERVER_DEAD) { + continue; + } + + wakeup = worker_wakeup_create(pchild); + if (wakeup == NULL) { + ap_log_error(APLOG_MARK, APLOG_ALERT|APLOG_NOERRNO, 0, + ap_server_conf, "worker_wakeup_create failed"); + clean_child_exit(APEXIT_CHILDFATAL); + } + worker_wakeups[threads_created] = wakeup; + my_info = (proc_info *)malloc(sizeof(proc_info)); + if (my_info == NULL) { + ap_log_error(APLOG_MARK, APLOG_ALERT, errno, ap_server_conf, + "malloc: out of memory"); + clean_child_exit(APEXIT_CHILDFATAL); + } + my_info->pid = my_child_num; + my_info->tid = i; + my_info->sd = 0; + + /* We are creating threads right now */ + ap_update_child_status_from_indexes(my_child_num, i, + SERVER_STARTING, NULL); + /* We let each thread update its own scoreboard entry. This is + * done because it lets us deal with tid better. + */ + rv = apr_thread_create(&threads[i], thread_attr, + worker_thread, my_info, pchild); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ALERT, rv, ap_server_conf, + "apr_thread_create: unable to create worker thread"); + /* In case system resources are maxxed out, we don't want + Apache running away with the CPU trying to fork over and + over and over again if we exit. */ + apr_sleep(10 * APR_USEC_PER_SEC); + clean_child_exit(APEXIT_CHILDFATAL); + } + threads_created++; + } + if (start_thread_may_exit || threads_created == ap_threads_per_child) { + break; + } + /* wait for previous generation to clean up an entry */ + apr_sleep(1 * APR_USEC_PER_SEC); + ++loops; + if (loops % 120 == 0) { /* every couple of minutes */ + if (prev_threads_created == threads_created) { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, ap_server_conf, + "child %" APR_PID_T_FMT " isn't taking over " + "slots very quickly (%d of %d)", + ap_my_pid, threads_created, ap_threads_per_child); + } + prev_threads_created = threads_created; + } + } + + /* What state should this child_main process be listed as in the + * scoreboard...? + * ap_update_child_status_from_indexes(my_child_num, i, SERVER_STARTING, + * (request_rec *) NULL); + * + * This state should be listed separately in the scoreboard, in some kind + * of process_status, not mixed in with the worker threads' status. + * "life_status" is almost right, but it's in the worker's structure, and + * the name could be clearer. gla + */ + apr_thread_exit(thd, APR_SUCCESS); + return NULL; +} + +static void join_workers(apr_thread_t **threads) +{ + int i; + apr_status_t rv, thread_rv; + + for (i = 0; i < ap_threads_per_child; i++) { + if (threads[i]) { /* if we ever created this thread */ + rv = apr_thread_join(&thread_rv, threads[i]); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_CRIT, rv, ap_server_conf, + "apr_thread_join: unable to join worker " + "thread %d", + i); + } + } + } +} + +static void join_start_thread(apr_thread_t *start_thread_id) +{ + apr_status_t rv, thread_rv; + + start_thread_may_exit = 1; /* tell it to give up in case it is still + * trying to take over slots from a + * previous generation + */ + rv = apr_thread_join(&thread_rv, start_thread_id); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_CRIT, rv, ap_server_conf, + "apr_thread_join: unable to join the start " + "thread"); + } +} + +static void child_main(int child_num_arg) +{ + apr_thread_t **threads; + apr_status_t rv; + thread_starter *ts; + apr_threadattr_t *thread_attr; + apr_thread_t *start_thread_id; + + mpm_state = AP_MPMQ_STARTING; /* for benefit of any hooks that run as this + * child initializes + */ + + ap_my_pid = getpid(); + ap_fatal_signal_child_setup(ap_server_conf); + apr_pool_create(&pchild, pconf); + + /*stuff to do before we switch id's, so we have permissions.*/ + ap_reopen_scoreboard(pchild, NULL, 0); + + rv = SAFE_ACCEPT(apr_proc_mutex_child_init(&accept_mutex, ap_lock_fname, + pchild)); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_EMERG, rv, ap_server_conf, + "Couldn't initialize cross-process lock in child"); + clean_child_exit(APEXIT_CHILDFATAL); + } + + if (unixd_setup_child()) { + clean_child_exit(APEXIT_CHILDFATAL); + } + + ap_run_child_init(pchild, ap_server_conf); + + /* done with init critical section */ + + /* Just use the standard apr_setup_signal_thread to block all signals + * from being received. The child processes no longer use signals for + * any communication with the parent process. + */ + rv = apr_setup_signal_thread(); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_EMERG, rv, ap_server_conf, + "Couldn't initialize signal thread"); + clean_child_exit(APEXIT_CHILDFATAL); + } + + if (ap_max_requests_per_child) { + requests_this_child = ap_max_requests_per_child; + } + else { + /* coding a value of zero means infinity */ + requests_this_child = INT_MAX; + } + + /* Setup worker threads */ + + /* clear the storage; we may not create all our threads immediately, + * and we want a 0 entry to indicate a thread which was not created + */ + threads = (apr_thread_t **)calloc(1, + sizeof(apr_thread_t *) * ap_threads_per_child); + if (threads == NULL) { + ap_log_error(APLOG_MARK, APLOG_ALERT, errno, ap_server_conf, + "malloc: out of memory"); + clean_child_exit(APEXIT_CHILDFATAL); + } + + ts = (thread_starter *)apr_palloc(pchild, sizeof(*ts)); + + apr_threadattr_create(&thread_attr, pchild); + /* 0 means PTHREAD_CREATE_JOINABLE */ + apr_threadattr_detach_set(thread_attr, 0); + + ts->threads = threads; + ts->child_num_arg = child_num_arg; + ts->threadattr = thread_attr; + + rv = apr_thread_create(&start_thread_id, thread_attr, start_threads, + ts, pchild); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ALERT, rv, ap_server_conf, + "apr_thread_create: unable to create worker thread"); + /* In case system resources are maxxed out, we don't want + Apache running away with the CPU trying to fork over and + over and over again if we exit. */ + apr_sleep(10 * APR_USEC_PER_SEC); + clean_child_exit(APEXIT_CHILDFATAL); + } + + mpm_state = AP_MPMQ_RUNNING; + + /* If we are only running in one_process mode, we will want to + * still handle signals. */ + if (one_process) { + /* Block until we get a terminating signal. */ + apr_signal_thread(check_signal); + /* make sure the start thread has finished; signal_threads() + * and join_workers() depend on that + */ + /* XXX join_start_thread() won't be awakened if one of our + * threads encounters a critical error and attempts to + * shutdown this child + */ + join_start_thread(start_thread_id); + signal_threads(ST_UNGRACEFUL); /* helps us terminate a little more + * quickly than the dispatch of the signal thread + * beats the Pipe of Death and the browsers + */ + /* A terminating signal was received. Now join each of the + * workers to clean them up. + * If the worker already exited, then the join frees + * their resources and returns. + * If the worker hasn't exited, then this blocks until + * they have (then cleans up). + */ + join_workers(threads); + } + else { /* !one_process */ + /* remove SIGTERM from the set of blocked signals... if one of + * the other threads in the process needs to take us down + * (e.g., for MaxRequestsPerChild) it will send us SIGTERM + */ + unblock_signal(SIGTERM); + join_start_thread(start_thread_id); + join_workers(threads); + } + + free(threads); + + clean_child_exit(resource_shortage ? APEXIT_CHILDSICK : 0); +} + +static int make_child(server_rec *s, int slot) +{ + int pid; + + if (slot + 1 > ap_max_daemons_limit) { + ap_max_daemons_limit = slot + 1; + } + + if (one_process) { + set_signals(); + ap_scoreboard_image->parent[slot].pid = getpid(); + child_main(slot); + } + + if ((pid = fork()) == -1) { + ap_log_error(APLOG_MARK, APLOG_ERR, errno, s, + "fork: Unable to fork new process"); + + /* fork didn't succeed. Fix the scoreboard or else + * it will say SERVER_STARTING forever and ever + */ + ap_update_child_status_from_indexes(slot, 0, SERVER_DEAD, NULL); + + /* In case system resources are maxxed out, we don't want + Apache running away with the CPU trying to fork over and + over and over again. */ + apr_sleep(10 * APR_USEC_PER_SEC); + + return -1; + } + + if (!pid) { +#ifdef HAVE_BINDPROCESSOR + /* By default, AIX binds to a single processor. This bit unbinds + * children which will then bind to another CPU. + */ + int status = bindprocessor(BINDPROCESS, (int)getpid(), + PROCESSOR_CLASS_ANY); + if (status != OK) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, + ap_server_conf, + "processor unbind failed %d", status); +#endif + RAISE_SIGSTOP(MAKE_CHILD); + + apr_signal(SIGTERM, just_die); + child_main(slot); + + clean_child_exit(0); + } + /* else */ + ap_scoreboard_image->parent[slot].quiescing = 0; + ap_scoreboard_image->parent[slot].pid = pid; + return 0; +} + +/* start up a bunch of children */ +static void startup_children(int number_to_start) +{ + int i; + + for (i = 0; number_to_start && i < ap_daemons_limit; ++i) { + if (ap_scoreboard_image->parent[i].pid != 0) { + continue; + } + if (make_child(ap_server_conf, i) < 0) { + break; + } + --number_to_start; + } +} + + +/* + * idle_spawn_rate is the number of children that will be spawned on the + * next maintenance cycle if there aren't enough idle servers. It is + * doubled up to MAX_SPAWN_RATE, and reset only when a cycle goes by + * without the need to spawn. + */ +static int idle_spawn_rate = 1; +#ifndef MAX_SPAWN_RATE +#define MAX_SPAWN_RATE (32) +#endif +static int hold_off_on_exponential_spawning; + +static void perform_idle_server_maintenance(void) +{ + int i, j; + int idle_thread_count; + worker_score *ws; + process_score *ps; + int free_length; + int totally_free_length = 0; + int free_slots[MAX_SPAWN_RATE]; + int last_non_dead; + int total_non_dead; + + /* initialize the free_list */ + free_length = 0; + + idle_thread_count = 0; + last_non_dead = -1; + total_non_dead = 0; + + for (i = 0; i < ap_daemons_limit; ++i) { + /* Initialization to satisfy the compiler. It doesn't know + * that ap_threads_per_child is always > 0 */ + int status = SERVER_DEAD; + int any_dying_threads = 0; + int any_dead_threads = 0; + int all_dead_threads = 1; + + if (i >= ap_max_daemons_limit && totally_free_length == idle_spawn_rate) + break; + ps = &ap_scoreboard_image->parent[i]; + for (j = 0; j < ap_threads_per_child; j++) { + ws = &ap_scoreboard_image->servers[i][j]; + status = ws->status; + + /* XXX any_dying_threads is probably no longer needed GLA */ + any_dying_threads = any_dying_threads || + (status == SERVER_GRACEFUL); + any_dead_threads = any_dead_threads || (status == SERVER_DEAD); + all_dead_threads = all_dead_threads && + (status == SERVER_DEAD || + status == SERVER_GRACEFUL); + + /* We consider a starting server as idle because we started it + * at least a cycle ago, and if it still hasn't finished starting + * then we're just going to swamp things worse by forking more. + * So we hopefully won't need to fork more if we count it. + * This depends on the ordering of SERVER_READY and SERVER_STARTING. + */ + if (status <= SERVER_READY && status != SERVER_DEAD && + !ps->quiescing && + ps->generation == ap_my_generation && + /* XXX the following shouldn't be necessary if we clean up + * properly after seg faults, but we're not yet GLA + */ + ps->pid != 0) { + ++idle_thread_count; + } + } + if (any_dead_threads && totally_free_length < idle_spawn_rate + && (!ps->pid /* no process in the slot */ + || ps->quiescing)) { /* or at least one is going away */ + if (all_dead_threads) { + /* great! we prefer these, because the new process can + * start more threads sooner. So prioritize this slot + * by putting it ahead of any slots with active threads. + * + * first, make room by moving a slot that's potentially still + * in use to the end of the array + */ + free_slots[free_length] = free_slots[totally_free_length]; + free_slots[totally_free_length++] = i; + } + else { + /* slot is still in use - back of the bus + */ + free_slots[free_length] = i; + } + ++free_length; + } + /* XXX if (!ps->quiescing) is probably more reliable GLA */ + if (!any_dying_threads) { + last_non_dead = i; + ++total_non_dead; + } + } + ap_max_daemons_limit = last_non_dead + 1; + + if (idle_thread_count > max_spare_threads) { + /* Kill off one child */ + ap_mpm_pod_signal(pod); + idle_spawn_rate = 1; + } + else if (idle_thread_count < min_spare_threads) { + /* terminate the free list */ + if (free_length == 0) { + /* only report this condition once */ + static int reported = 0; + + if (!reported) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, + ap_server_conf, + "server reached MaxClients setting, consider" + " raising the MaxClients setting"); + reported = 1; + } + idle_spawn_rate = 1; + } + else { + if (free_length > idle_spawn_rate) { + free_length = idle_spawn_rate; + } + if (idle_spawn_rate >= 8) { + ap_log_error(APLOG_MARK, APLOG_INFO, 0, + ap_server_conf, + "server seems busy, (you may need " + "to increase StartServers, ThreadsPerChild " + "or Min/MaxSpareThreads), " + "spawning %d children, there are around %d idle " + "threads, and %d total children", free_length, + idle_thread_count, total_non_dead); + } + for (i = 0; i < free_length; ++i) { + make_child(ap_server_conf, free_slots[i]); + } + /* the next time around we want to spawn twice as many if this + * wasn't good enough, but not if we've just done a graceful + */ + if (hold_off_on_exponential_spawning) { + --hold_off_on_exponential_spawning; + } + else if (idle_spawn_rate < MAX_SPAWN_RATE) { + idle_spawn_rate *= 2; + } + } + } + else { + idle_spawn_rate = 1; + } +} + +static void server_main_loop(int remaining_children_to_start) +{ + int child_slot; + apr_exit_why_e exitwhy; + int status, processed_status; + apr_proc_t pid; + int i; + + while (!restart_pending && !shutdown_pending) { + ap_wait_or_timeout(&exitwhy, &status, &pid, pconf); + + if (pid.pid != -1) { + processed_status = ap_process_child_status(&pid, exitwhy, status); + if (processed_status == APEXIT_CHILDFATAL) { + shutdown_pending = 1; + child_fatal = 1; + return; + } + /* non-fatal death... note that it's gone in the scoreboard. */ + child_slot = find_child_by_pid(&pid); + if (child_slot >= 0) { + for (i = 0; i < ap_threads_per_child; i++) + ap_update_child_status_from_indexes(child_slot, i, SERVER_DEAD, + (request_rec *) NULL); + + ap_scoreboard_image->parent[child_slot].pid = 0; + ap_scoreboard_image->parent[child_slot].quiescing = 0; + if (processed_status == APEXIT_CHILDSICK) { + /* resource shortage, minimize the fork rate */ + idle_spawn_rate = 1; + } + else if (remaining_children_to_start + && child_slot < ap_daemons_limit) { + /* we're still doing a 1-for-1 replacement of dead + * children with new children + */ + make_child(ap_server_conf, child_slot); + --remaining_children_to_start; + } +#if APR_HAS_OTHER_CHILD + } + else if (apr_proc_other_child_read(&pid, status) == 0) { + /* handled */ +#endif + } + else if (is_graceful) { + /* Great, we've probably just lost a slot in the + * scoreboard. Somehow we don't know about this child. + */ + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, + ap_server_conf, + "long lost child came home! (pid %ld)", + (long)pid.pid); + } + /* Don't perform idle maintenance when a child dies, + * only do it when there's a timeout. Remember only a + * finite number of children can die, and it's pretty + * pathological for a lot to die suddenly. + */ + continue; + } + else if (remaining_children_to_start) { + /* we hit a 1 second timeout in which none of the previous + * generation of children needed to be reaped... so assume + * they're all done, and pick up the slack if any is left. + */ + startup_children(remaining_children_to_start); + remaining_children_to_start = 0; + /* In any event we really shouldn't do the code below because + * few of the servers we just started are in the IDLE state + * yet, so we'd mistakenly create an extra server. + */ + continue; + } + + perform_idle_server_maintenance(); + } +} + +int ap_mpm_run(apr_pool_t *_pconf, apr_pool_t *plog, server_rec *s) +{ + int remaining_children_to_start; + apr_status_t rv; + + ap_log_pid(pconf, ap_pid_fname); + + first_server_limit = server_limit; + first_thread_limit = thread_limit; + if (changed_limit_at_restart) { + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s, + "WARNING: Attempt to change ServerLimit or ThreadLimit " + "ignored during restart"); + changed_limit_at_restart = 0; + } + + /* Initialize cross-process accept lock */ + ap_lock_fname = apr_psprintf(_pconf, "%s.%" APR_PID_T_FMT, + ap_server_root_relative(_pconf, ap_lock_fname), + ap_my_pid); + + rv = apr_proc_mutex_create(&accept_mutex, ap_lock_fname, + ap_accept_lock_mech, _pconf); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_EMERG, rv, s, + "Couldn't create accept lock"); + mpm_state = AP_MPMQ_STOPPING; + return 1; + } + +#if APR_USE_SYSVSEM_SERIALIZE + if (ap_accept_lock_mech == APR_LOCK_DEFAULT || + ap_accept_lock_mech == APR_LOCK_SYSVSEM) { +#else + if (ap_accept_lock_mech == APR_LOCK_SYSVSEM) { +#endif + rv = unixd_set_proc_mutex_perms(accept_mutex); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_EMERG, rv, s, + "Couldn't set permissions on cross-process lock; " + "check User and Group directives"); + mpm_state = AP_MPMQ_STOPPING; + return 1; + } + } + + if (!is_graceful) { + if (ap_run_pre_mpm(s->process->pool, SB_SHARED) != OK) { + mpm_state = AP_MPMQ_STOPPING; + return 1; + } + /* fix the generation number in the global score; we just got a new, + * cleared scoreboard + */ + ap_scoreboard_image->global->running_generation = ap_my_generation; + } + + set_signals(); + /* Don't thrash... */ + if (max_spare_threads < min_spare_threads + ap_threads_per_child) + max_spare_threads = min_spare_threads + ap_threads_per_child; + + /* If we're doing a graceful_restart then we're going to see a lot + * of children exiting immediately when we get into the main loop + * below (because we just sent them AP_SIG_GRACEFUL). This happens pretty + * rapidly... and for each one that exits we'll start a new one until + * we reach at least daemons_min_free. But we may be permitted to + * start more than that, so we'll just keep track of how many we're + * supposed to start up without the 1 second penalty between each fork. + */ + remaining_children_to_start = ap_daemons_to_start; + if (remaining_children_to_start > ap_daemons_limit) { + remaining_children_to_start = ap_daemons_limit; + } + if (!is_graceful) { + startup_children(remaining_children_to_start); + remaining_children_to_start = 0; + } + else { + /* give the system some time to recover before kicking into + * exponential mode */ + hold_off_on_exponential_spawning = 10; + } + + ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, ap_server_conf, + "%s configured -- resuming normal operations", + ap_get_server_version()); + ap_log_error(APLOG_MARK, APLOG_INFO, 0, ap_server_conf, + "Server built: %s", ap_get_server_built()); +#ifdef AP_MPM_WANT_SET_ACCEPT_LOCK_MECH + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, ap_server_conf, + "AcceptMutex: %s (default: %s)", + apr_proc_mutex_name(accept_mutex), + apr_proc_mutex_defname()); +#endif + restart_pending = shutdown_pending = 0; + mpm_state = AP_MPMQ_RUNNING; + + server_main_loop(remaining_children_to_start); + mpm_state = AP_MPMQ_STOPPING; + + if (shutdown_pending) { + /* Time to gracefully shut down: + * Kill child processes, tell them to call child_exit, etc... + * (By "gracefully" we don't mean graceful in the same sense as + * "apachectl graceful" where we allow old connections to finish.) + */ + if (unixd_killpg(getpgrp(), SIGTERM) < 0) { + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, "killpg SIGTERM"); + } + ap_reclaim_child_processes(1); /* Start with SIGTERM */ + + if (!child_fatal) { + /* cleanup pid file on normal shutdown */ + const char *pidfile = NULL; + pidfile = ap_server_root_relative (pconf, ap_pid_fname); + if ( pidfile != NULL && unlink(pidfile) == 0) + ap_log_error(APLOG_MARK, APLOG_INFO, 0, + ap_server_conf, + "removed PID file %s (pid=%ld)", + pidfile, (long)getpid()); + + ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, + ap_server_conf, "caught SIGTERM, shutting down"); + } + return 1; + } + + /* we've been told to restart */ + apr_signal(SIGHUP, SIG_IGN); + + if (one_process) { + /* not worth thinking about */ + return 1; + } + + /* advance to the next generation */ + /* XXX: we really need to make sure this new generation number isn't in + * use by any of the children. + */ + ++ap_my_generation; + ap_scoreboard_image->global->running_generation = ap_my_generation; + + if (is_graceful) { + ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, ap_server_conf, + AP_SIG_GRACEFUL_STRING " received. Doing graceful restart"); + /* wake up the children...time to die. But we'll have more soon */ + ap_mpm_pod_killpg(pod, ap_daemons_limit); + + + /* This is mostly for debugging... so that we know what is still + * gracefully dealing with existing request. + */ + + } + else { + /* Kill 'em all. Since the child acts the same on the parents SIGTERM + * and a SIGHUP, we may as well use the same signal, because some user + * pthreads are stealing signals from us left and right. + */ + ap_mpm_pod_killpg(pod, ap_daemons_limit); + + ap_reclaim_child_processes(1); /* Start with SIGTERM */ + ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, ap_server_conf, + "SIGHUP received. Attempting to restart"); + } + + return 0; +} + +/* This really should be a post_config hook, but the error log is already + * redirected by that point, so we need to do this in the open_logs phase. + */ +static int leader_open_logs(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s) +{ + apr_status_t rv; + + pconf = p; + ap_server_conf = s; + + if ((num_listensocks = ap_setup_listeners(ap_server_conf)) < 1) { + ap_log_error(APLOG_MARK, APLOG_ALERT|APLOG_STARTUP, 0, + NULL, "no listening sockets available, shutting down"); + return DONE; + } + + if (!one_process) { + if ((rv = ap_mpm_pod_open(pconf, &pod))) { + ap_log_error(APLOG_MARK, APLOG_CRIT|APLOG_STARTUP, rv, NULL, + "Could not open pipe-of-death."); + return DONE; + } + } + return OK; +} + +static int leader_pre_config(apr_pool_t *pconf, apr_pool_t *plog, + apr_pool_t *ptemp) +{ + static int restart_num = 0; + int no_detach, debug, foreground; + ap_directive_t *pdir; + ap_directive_t *max_clients = NULL; + apr_status_t rv; + + mpm_state = AP_MPMQ_STARTING; + + /* make sure that "ThreadsPerChild" gets set before "MaxClients" */ + for (pdir = ap_conftree; pdir != NULL; pdir = pdir->next) { + if (strncasecmp(pdir->directive, "ThreadsPerChild", 15) == 0) { + if (!max_clients) { + break; /* we're in the clear, got ThreadsPerChild first */ + } + else { + /* now to swap the data */ + ap_directive_t temp; + + temp.directive = pdir->directive; + temp.args = pdir->args; + /* Make sure you don't change 'next', or you may get loops! */ + /* XXX: first_child, parent, and data can never be set + * for these directives, right? -aaron */ + temp.filename = pdir->filename; + temp.line_num = pdir->line_num; + + pdir->directive = max_clients->directive; + pdir->args = max_clients->args; + pdir->filename = max_clients->filename; + pdir->line_num = max_clients->line_num; + + max_clients->directive = temp.directive; + max_clients->args = temp.args; + max_clients->filename = temp.filename; + max_clients->line_num = temp.line_num; + break; + } + } + else if (!max_clients + && strncasecmp(pdir->directive, "MaxClients", 10) == 0) { + max_clients = pdir; + } + } + + debug = ap_exists_config_define("DEBUG"); + + if (debug) { + foreground = one_process = 1; + no_detach = 0; + } + else { + one_process = ap_exists_config_define("ONE_PROCESS"); + no_detach = ap_exists_config_define("NO_DETACH"); + foreground = ap_exists_config_define("FOREGROUND"); + } + + /* sigh, want this only the second time around */ + if (restart_num++ == 1) { + is_graceful = 0; + + if (!one_process && !foreground) { + rv = apr_proc_detach(no_detach ? APR_PROC_DETACH_FOREGROUND + : APR_PROC_DETACH_DAEMONIZE); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_CRIT, rv, NULL, + "apr_proc_detach failed"); + return HTTP_INTERNAL_SERVER_ERROR; + } + } + parent_pid = ap_my_pid = getpid(); + } + + unixd_pre_config(ptemp); + ap_listen_pre_config(); + ap_daemons_to_start = DEFAULT_START_DAEMON; + min_spare_threads = DEFAULT_MIN_FREE_DAEMON * DEFAULT_THREADS_PER_CHILD; + max_spare_threads = DEFAULT_MAX_FREE_DAEMON * DEFAULT_THREADS_PER_CHILD; + ap_daemons_limit = server_limit; + ap_threads_per_child = DEFAULT_THREADS_PER_CHILD; + ap_pid_fname = DEFAULT_PIDLOG; + ap_lock_fname = DEFAULT_LOCKFILE; + ap_max_requests_per_child = DEFAULT_MAX_REQUESTS_PER_CHILD; + ap_extended_status = 0; +#ifdef AP_MPM_WANT_SET_MAX_MEM_FREE + ap_max_mem_free = APR_ALLOCATOR_MAX_FREE_UNLIMITED; +#endif + + apr_cpystrn(ap_coredump_dir, ap_server_root, sizeof(ap_coredump_dir)); + + return OK; +} + +static void leader_hooks(apr_pool_t *p) +{ + /* The leader open_logs phase must run before the core's, or stderr + * will be redirected to a file, and the messages won't print to the + * console. + */ + static const char *const aszSucc[] = {"core.c", NULL}; + one_process = 0; + + ap_hook_open_logs(leader_open_logs, NULL, aszSucc, APR_HOOK_MIDDLE); + /* we need to set the MPM state before other pre-config hooks use MPM query + * to retrieve it, so register as REALLY_FIRST + */ + ap_hook_pre_config(leader_pre_config, NULL, NULL, APR_HOOK_REALLY_FIRST); +} + +static const char *set_daemons_to_start(cmd_parms *cmd, void *dummy, + const char *arg) +{ + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + ap_daemons_to_start = atoi(arg); + return NULL; +} + +static const char *set_min_spare_threads(cmd_parms *cmd, void *dummy, + const char *arg) +{ + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + min_spare_threads = atoi(arg); + if (min_spare_threads <= 0) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: detected MinSpareThreads set to non-positive."); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "Resetting to 1 to avoid almost certain Apache failure."); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "Please read the documentation."); + min_spare_threads = 1; + } + + return NULL; +} + +static const char *set_max_spare_threads(cmd_parms *cmd, void *dummy, + const char *arg) +{ + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + max_spare_threads = atoi(arg); + return NULL; +} + +static const char *set_max_clients (cmd_parms *cmd, void *dummy, + const char *arg) +{ + int max_clients; + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + /* It is ok to use ap_threads_per_child here because we are + * sure that it gets set before MaxClients in the pre_config stage. */ + max_clients = atoi(arg); + if (max_clients < ap_threads_per_child) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: MaxClients (%d) must be at least as large", + max_clients); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " large as ThreadsPerChild (%d). Automatically", + ap_threads_per_child); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " increasing MaxClients to %d.", + ap_threads_per_child); + max_clients = ap_threads_per_child; + } + ap_daemons_limit = max_clients / ap_threads_per_child; + if ((max_clients > 0) && (max_clients % ap_threads_per_child)) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: MaxClients (%d) is not an integer multiple", + max_clients); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " of ThreadsPerChild (%d), lowering MaxClients to %d", + ap_threads_per_child, + ap_daemons_limit * ap_threads_per_child); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " for a maximum of %d child processes,", + ap_daemons_limit); + max_clients = ap_daemons_limit * ap_threads_per_child; + } + if (ap_daemons_limit > server_limit) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: MaxClients of %d would require %d servers,", + max_clients, ap_daemons_limit); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " and would exceed the ServerLimit value of %d.", + server_limit); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " Automatically lowering MaxClients to %d. To increase,", + server_limit * ap_threads_per_child); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " please see the ServerLimit directive."); + ap_daemons_limit = server_limit; + } + else if (ap_daemons_limit < 1) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: Require MaxClients > 0, setting to 1"); + ap_daemons_limit = 1; + } + return NULL; +} + +static const char *set_threads_per_child (cmd_parms *cmd, void *dummy, + const char *arg) +{ + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + ap_threads_per_child = atoi(arg); + if (ap_threads_per_child > thread_limit) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: ThreadsPerChild of %d exceeds ThreadLimit " + "value of %d", ap_threads_per_child, + thread_limit); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "threads, lowering ThreadsPerChild to %d. To increase, please" + " see the", thread_limit); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " ThreadLimit directive."); + ap_threads_per_child = thread_limit; + } + else if (ap_threads_per_child < 1) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: Require ThreadsPerChild > 0, setting to 1"); + ap_threads_per_child = 1; + } + return NULL; +} + +static const char *set_server_limit (cmd_parms *cmd, void *dummy, const char *arg) +{ + int tmp_server_limit; + + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + tmp_server_limit = atoi(arg); + /* you cannot change ServerLimit across a restart; ignore + * any such attempts + */ + if (first_server_limit && + tmp_server_limit != server_limit) { + /* how do we log a message? the error log is a bit bucket at this + * point; we'll just have to set a flag so that ap_mpm_run() + * logs a warning later + */ + changed_limit_at_restart = 1; + return NULL; + } + server_limit = tmp_server_limit; + + if (server_limit > MAX_SERVER_LIMIT) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: ServerLimit of %d exceeds compile time limit " + "of %d servers,", server_limit, MAX_SERVER_LIMIT); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " lowering ServerLimit to %d.", MAX_SERVER_LIMIT); + server_limit = MAX_SERVER_LIMIT; + } + else if (server_limit < 1) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: Require ServerLimit > 0, setting to 1"); + server_limit = 1; + } + return NULL; +} + +static const char *set_thread_limit (cmd_parms *cmd, void *dummy, const char *arg) +{ + int tmp_thread_limit; + + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + tmp_thread_limit = atoi(arg); + /* you cannot change ThreadLimit across a restart; ignore + * any such attempts + */ + if (first_thread_limit && + tmp_thread_limit != thread_limit) { + /* how do we log a message? the error log is a bit bucket at this + * point; we'll just have to set a flag so that ap_mpm_run() + * logs a warning later + */ + changed_limit_at_restart = 1; + return NULL; + } + thread_limit = tmp_thread_limit; + + if (thread_limit > MAX_THREAD_LIMIT) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: ThreadLimit of %d exceeds compile time limit " + "of %d servers,", thread_limit, MAX_THREAD_LIMIT); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " lowering ThreadLimit to %d.", MAX_THREAD_LIMIT); + thread_limit = MAX_THREAD_LIMIT; + } + else if (thread_limit < 1) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: Require ThreadLimit > 0, setting to 1"); + thread_limit = 1; + } + return NULL; +} + +static const command_rec leader_cmds[] = { +UNIX_DAEMON_COMMANDS, +LISTEN_COMMANDS, +AP_INIT_TAKE1("StartServers", set_daemons_to_start, NULL, RSRC_CONF, + "Number of child processes launched at server startup"), +AP_INIT_TAKE1("MinSpareThreads", set_min_spare_threads, NULL, RSRC_CONF, + "Minimum number of idle children, to handle request spikes"), +AP_INIT_TAKE1("MaxSpareThreads", set_max_spare_threads, NULL, RSRC_CONF, + "Maximum number of idle children"), +AP_INIT_TAKE1("MaxClients", set_max_clients, NULL, RSRC_CONF, + "Maximum number of children alive at the same time"), +AP_INIT_TAKE1("ThreadsPerChild", set_threads_per_child, NULL, RSRC_CONF, + "Number of threads each child creates"), +AP_INIT_TAKE1("ServerLimit", set_server_limit, NULL, RSRC_CONF, + "Maximum value of MaxClients for this run of Apache"), +AP_INIT_TAKE1("ThreadLimit", set_thread_limit, NULL, RSRC_CONF, + "Maximum worker threads in a server for this run of Apache"), +{ NULL } +}; + +module AP_MODULE_DECLARE_DATA mpm_leader_module = { + MPM20_MODULE_STUFF, + ap_mpm_rewrite_args, /* hook to run before apache parses args */ + NULL, /* create per-directory config structure */ + NULL, /* merge per-directory config structures */ + NULL, /* create per-server config structure */ + NULL, /* merge per-server config structures */ + leader_cmds, /* command apr_table_t */ + leader_hooks /* register_hooks */ +}; + diff --git a/rubbos/app/httpd-2.0.64/server/mpm/experimental/leader/mpm.h b/rubbos/app/httpd-2.0.64/server/mpm/experimental/leader/mpm.h new file mode 100644 index 00000000..1db1d1d0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/experimental/leader/mpm.h @@ -0,0 +1,51 @@ +/* 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. + */ + +#include "scoreboard.h" +#include "unixd.h" + +#ifndef APACHE_MPM_LEADER_H +#define APACHE_MPM_LEADER_H + +#define LEADER_MPM + +#define MPM_NAME "Leader-Follower" + +#define AP_MPM_WANT_RECLAIM_CHILD_PROCESSES +#define AP_MPM_WANT_WAIT_OR_TIMEOUT +#define AP_MPM_WANT_PROCESS_CHILD_STATUS +#define AP_MPM_WANT_SET_PIDFILE +#define AP_MPM_WANT_SET_SCOREBOARD +#define AP_MPM_WANT_SET_LOCKFILE +#define AP_MPM_WANT_SET_MAX_REQUESTS +#define AP_MPM_WANT_SET_COREDUMPDIR +#define AP_MPM_WANT_SET_ACCEPT_LOCK_MECH +#define AP_MPM_WANT_SIGNAL_SERVER +#define AP_MPM_WANT_SET_MAX_MEM_FREE +#define AP_MPM_WANT_FATAL_SIGNAL_HANDLER +#define AP_MPM_DISABLE_NAGLE_ACCEPTED_SOCK + +#define AP_MPM_USES_POD 1 +#define MPM_CHILD_PID(i) (ap_scoreboard_image->parent[i].pid) +#define MPM_NOTE_CHILD_KILLED(i) (MPM_CHILD_PID(i) = 0) +#define MPM_ACCEPT_FUNC unixd_accept + +extern int ap_threads_per_child; +extern int ap_max_daemons_limit; +extern server_rec *ap_server_conf; +extern char ap_coredump_dir[MAX_STRING_LEN]; + +#endif /* APACHE_MPM_LEADER_H */ diff --git a/rubbos/app/httpd-2.0.64/server/mpm/experimental/leader/mpm_default.h b/rubbos/app/httpd-2.0.64/server/mpm/experimental/leader/mpm_default.h new file mode 100644 index 00000000..d5a33989 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/experimental/leader/mpm_default.h @@ -0,0 +1,69 @@ +/* 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. + */ + +#ifndef APACHE_MPM_DEFAULT_H +#define APACHE_MPM_DEFAULT_H + +/* Number of servers to spawn off by default --- also, if fewer than + * this free when the caretaker checks, it will spawn more. + */ +#ifndef DEFAULT_START_DAEMON +#define DEFAULT_START_DAEMON 3 +#endif + +/* Maximum number of *free* server processes --- more than this, and + * they will die off. + */ + +#ifndef DEFAULT_MAX_FREE_DAEMON +#define DEFAULT_MAX_FREE_DAEMON 10 +#endif + +/* Minimum --- fewer than this, and more will be created */ + +#ifndef DEFAULT_MIN_FREE_DAEMON +#define DEFAULT_MIN_FREE_DAEMON 3 +#endif + +#ifndef DEFAULT_THREADS_PER_CHILD +#define DEFAULT_THREADS_PER_CHILD 25 +#endif + +/* File used for accept locking, when we use a file */ +#ifndef DEFAULT_LOCKFILE +#define DEFAULT_LOCKFILE DEFAULT_REL_RUNTIMEDIR "/accept.lock" +#endif + +/* Where the main/parent process's pid is logged */ +#ifndef DEFAULT_PIDLOG +#define DEFAULT_PIDLOG DEFAULT_REL_RUNTIMEDIR "/httpd.pid" +#endif + +/* + * Interval, in microseconds, between scoreboard maintenance. + */ +#ifndef SCOREBOARD_MAINTENANCE_INTERVAL +#define SCOREBOARD_MAINTENANCE_INTERVAL 1000000 +#endif + +/* Number of requests to try to handle in a single process. If <= 0, + * the children don't die off. + */ +#ifndef DEFAULT_MAX_REQUESTS_PER_CHILD +#define DEFAULT_MAX_REQUESTS_PER_CHILD 10000 +#endif + +#endif /* AP_MPM_DEFAULT_H */ diff --git a/rubbos/app/httpd-2.0.64/server/mpm/experimental/perchild/Makefile.in b/rubbos/app/httpd-2.0.64/server/mpm/experimental/perchild/Makefile.in new file mode 100644 index 00000000..374f1306 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/experimental/perchild/Makefile.in @@ -0,0 +1,5 @@ + +LTLIBRARY_NAME = libperchild.la +LTLIBRARY_SOURCES = perchild.c + +include $(top_srcdir)/build/ltlib.mk diff --git a/rubbos/app/httpd-2.0.64/server/mpm/experimental/perchild/config5.m4 b/rubbos/app/httpd-2.0.64/server/mpm/experimental/perchild/config5.m4 new file mode 100644 index 00000000..368052f5 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/experimental/perchild/config5.m4 @@ -0,0 +1,6 @@ +dnl ## XXX - Need a more thorough check of the proper flags to use + +if test "$MPM_NAME" = "perchild" ; then + AC_CHECK_FUNCS(pthread_kill) + APACHE_FAST_OUTPUT(server/mpm/$MPM_SUBDIR_NAME/Makefile) +fi diff --git a/rubbos/app/httpd-2.0.64/server/mpm/experimental/perchild/mpm.h b/rubbos/app/httpd-2.0.64/server/mpm/experimental/perchild/mpm.h new file mode 100644 index 00000000..84e808db --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/experimental/perchild/mpm.h @@ -0,0 +1,59 @@ +/* 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. + */ + +#include "httpd.h" +#include "mpm_default.h" +#include "unixd.h" + +#ifndef APACHE_MPM_PERCHILD_H +#define APACHE_MPM_PERCHILD_H + +#define PERCHILD_MPM + +#define MPM_NAME "Perchild" + +#define AP_MPM_WANT_RECLAIM_CHILD_PROCESSES +#define AP_MPM_WANT_WAIT_OR_TIMEOUT +#define AP_MPM_WANT_PROCESS_CHILD_STATUS +#define AP_MPM_WANT_SET_PIDFILE +#define AP_MPM_WANT_SET_SCOREBOARD +#define AP_MPM_WANT_SET_LOCKFILE +#define AP_MPM_WANT_SET_MAX_REQUESTS +#define AP_MPM_WANT_SET_COREDUMPDIR +#define AP_MPM_WANT_SET_ACCEPT_LOCK_MECH +#define AP_MPM_WANT_SIGNAL_SERVER +#define AP_MPM_WANT_FATAL_SIGNAL_HANDLER +#define AP_MPM_USES_POD + +#define MPM_CHILD_PID(i) (ap_scoreboard_image->parent[i].pid) +#define MPM_NOTE_CHILD_KILLED(i) (MPM_CHILD_PID(i) = 0) +#define MPM_ACCEPT_FUNC unixd_accept + +/* Table of child status */ +#define SERVER_DEAD 0 +#define SERVER_DYING 1 +#define SERVER_ALIVE 2 + +typedef struct ap_ctable{ + pid_t pid; + unsigned char status; +} ap_ctable; + +extern int ap_threads_per_child; +extern int ap_max_daemons_limit; +extern server_rec *ap_server_conf; + +#endif /* APACHE_MPM_PERCHILD_H */ diff --git a/rubbos/app/httpd-2.0.64/server/mpm/experimental/perchild/mpm_default.h b/rubbos/app/httpd-2.0.64/server/mpm/experimental/perchild/mpm_default.h new file mode 100644 index 00000000..ece876b5 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/experimental/perchild/mpm_default.h @@ -0,0 +1,71 @@ +/* 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. + */ + +#ifndef APACHE_MPM_DEFAULT_H +#define APACHE_MPM_DEFAULT_H + +/* Number of threads to spawn off by default --- also, if fewer than + * this free when the caretaker checks, it will spawn more. + */ +#ifndef DEFAULT_START_THREAD +#define DEFAULT_START_THREAD 5 +#endif + +/* Maximum number of *free* server threads --- more than this, and + * they will die off. + */ + +#ifndef DEFAULT_MAX_SPARE_THREAD +#define DEFAULT_MAX_SPARE_THREAD 10 +#endif + +/* Minimum --- fewer than this, and more will be created */ + +#ifndef DEFAULT_MIN_SPARE_THREAD +#define DEFAULT_MIN_SPARE_THREAD 5 +#endif + +/* Number of servers to spawn off by default + */ +#ifndef DEFAULT_NUM_DAEMON +#define DEFAULT_NUM_DAEMON 2 +#endif + +/* File used for accept locking, when we use a file */ +#ifndef DEFAULT_LOCKFILE +#define DEFAULT_LOCKFILE DEFAULT_REL_RUNTIMEDIR "/accept.lock" +#endif + +/* Where the main/parent process's pid is logged */ +#ifndef DEFAULT_PIDLOG +#define DEFAULT_PIDLOG DEFAULT_REL_RUNTIMEDIR "/httpd.pid" +#endif + +/* + * Interval, in microseconds, between scoreboard maintenance. + */ +#ifndef SCOREBOARD_MAINTENANCE_INTERVAL +#define SCOREBOARD_MAINTENANCE_INTERVAL 1000000 +#endif + +/* Number of requests to try to handle in a single process. If <= 0, + * the children don't die off. + */ +#ifndef DEFAULT_MAX_REQUESTS_PER_CHILD +#define DEFAULT_MAX_REQUESTS_PER_CHILD 10000 +#endif + +#endif /* AP_MPM_DEFAULT_H */ diff --git a/rubbos/app/httpd-2.0.64/server/mpm/experimental/perchild/perchild.c b/rubbos/app/httpd-2.0.64/server/mpm/experimental/perchild/perchild.c new file mode 100644 index 00000000..8b205beb --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/experimental/perchild/perchild.c @@ -0,0 +1,2045 @@ +/* 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. + */ + +#include "apr_hash.h" +#include "apr_strings.h" +#include "apr_pools.h" +#include "apr_portable.h" +#include "apr_file_io.h" +#include "apr_signal.h" + +#define APR_WANT_IOVEC +#include "apr_want.h" + +#if APR_HAVE_UNISTD_H +#include +#endif +#if APR_HAVE_SYS_SOCKET_H +#include +#endif + +#if !APR_HAS_THREADS +#error The perchild MPM requires APR threads, but they are unavailable. +#endif + +#define CORE_PRIVATE + +#include "ap_config.h" +#include "httpd.h" +#include "http_main.h" +#include "http_log.h" +#include "http_config.h" /* for read_config */ +#include "http_core.h" /* for get_remote_host */ +#include "http_protocol.h" +#include "http_connection.h" +#include "ap_mpm.h" +#include "unixd.h" +#include "mpm_common.h" +#include "ap_listen.h" +#include "mpm_default.h" +#include "mpm.h" +#include "scoreboard.h" +#include "util_filter.h" +#include "apr_poll.h" + +#ifdef HAVE_POLL_H +#include +#endif +#ifdef HAVE_SYS_POLL_H +#include +#endif + +/* ### should be APR-ized */ +#include +#include +#include +#include +#include +#ifdef HAVE_SYS_PROCESSOR_H +#include /* for bindprocessor() */ +#endif + +/* + * Define some magic numbers that we use for the state of the incomming + * request. These must be < 0 so they don't collide with a file descriptor. + */ +#define AP_PERCHILD_THISCHILD -1 +#define AP_PERCHILD_OTHERCHILD -2 + +/* Limit on the threads per process. Clients will be locked out if more than + * this * server_limit are needed. + * + * We keep this for one reason it keeps the size of the scoreboard file small + * enough that we can read the whole thing without worrying too much about + * the overhead. + */ +#ifndef DEFAULT_THREAD_LIMIT +#define DEFAULT_THREAD_LIMIT 64 +#endif + +/* Admin can't tune ThreadLimit beyond MAX_THREAD_LIMIT. We want + * some sort of compile-time limit to help catch typos. + */ +#ifndef MAX_THREAD_LIMIT +#define MAX_THREAD_LIMIT 20000 +#endif + +/* Limit on the total --- clients will be locked out if more servers than + * this are needed. It is intended solely to keep the server from crashing + * when things get out of hand. + * + * We keep a hard maximum number of servers, for two reasons --- first off, + * in case something goes seriously wrong, we want to stop the fork bomb + * short of actually crashing the machine we're running on by filling some + * kernel table. Secondly, it keeps the size of the scoreboard file small + * enough that we can read the whole thing without worrying too much about + * the overhead. + */ +#ifndef DEFAULT_SERVER_LIMIT +#define DEFAULT_SERVER_LIMIT 8 +#endif + +/* Admin can't tune ServerLimit beyond MAX_SERVER_LIMIT. We want + * some sort of compile-time limit to help catch typos. + */ +#ifndef MAX_SERVER_LIMIT +#define MAX_SERVER_LIMIT 20000 +#endif + +/* + * Actual definitions of config globals + */ + +static int threads_to_start = 0; /* Worker threads per child */ +static int min_spare_threads = 0; +static int max_spare_threads = 0; +static int max_threads = 0; +static int server_limit = DEFAULT_SERVER_LIMIT; +static int first_server_limit; +static int thread_limit = DEFAULT_THREAD_LIMIT; +static int first_thread_limit; +static int changed_limit_at_restart; +static int num_daemons = 0; +static int curr_child_num = 0; +static int workers_may_exit = 0; +static int requests_this_child; +static int num_listensocks = 0; +static ap_pod_t *pod; +static jmp_buf jmpbuffer; + +struct child_info_t { + uid_t uid; + gid_t gid; + int input; /* The socket descriptor */ + int output; /* The socket descriptor */ +}; + +typedef struct { + const char *sockname; /* The base name for the socket */ + const char *fullsockname; /* socket base name + extension */ + int input; /* The socket descriptor */ + int output; /* The socket descriptor */ +} perchild_server_conf; + +typedef struct child_info_t child_info_t; + +/* Tables used to determine the user and group each child process should + * run as. The hash table is used to correlate a server name with a child + * process. + */ +static child_info_t *child_info_table; +static int *thread_socket_table; +struct ap_ctable *ap_child_table; + +/* + * The max child slot ever assigned, preserved across restarts. Necessary + * to deal with NumServers changes across AP_SIG_GRACEFUL restarts. We + * use this value to optimize routines that have to scan the entire child + * table. + * + * XXX - It might not be worth keeping this code in. There aren't very + * many child processes in this MPM. + */ +int ap_max_daemons_limit = -1; +int ap_threads_per_child; /* XXX not part of API! axe it! */ + +module AP_MODULE_DECLARE_DATA mpm_perchild_module; + +static apr_file_t *pipe_of_death_in = NULL; +static apr_file_t *pipe_of_death_out = NULL; +static apr_thread_mutex_t *pipe_of_death_mutex; + +/* *Non*-shared http_main globals... */ + +server_rec *ap_server_conf; + +/* one_process --- debugging mode variable; can be set from the command line + * with the -X flag. If set, this gets you the child_main loop running + * in the process which originally started up (no detach, no make_child), + * which is a pretty nice debugging environment. (You'll get a SIGHUP + * early in standalone_main; just continue through. This is the server + * trying to kill off any child processes which it might have lying + * around --- Apache doesn't keep track of their pids, it just sends + * SIGHUP to the process group, ignoring it in the root process. + * Continue through and you'll be fine.). + */ + +static int one_process = 0; + +#ifdef DEBUG_SIGSTOP +int raise_sigstop_flags; +#endif + +static apr_pool_t *pconf; /* Pool for config stuff */ +static apr_pool_t *pchild; /* Pool for httpd child stuff */ +static apr_pool_t *thread_pool_parent; /* Parent of per-thread pools */ +static apr_thread_mutex_t *thread_pool_parent_mutex; + +static int child_num; +static unsigned int my_pid; /* Linux getpid() doesn't work except in + main thread. Use this instead */ +/* Keep track of the number of worker threads currently active */ +static int worker_thread_count; +static apr_thread_mutex_t *worker_thread_count_mutex; +static int *worker_thread_free_ids; +static apr_threadattr_t *worker_thread_attr; + +/* Keep track of the number of idle worker threads */ +static int idle_thread_count; +static apr_thread_mutex_t *idle_thread_count_mutex; + +/* Locks for accept serialization */ +#ifdef NO_SERIALIZED_ACCEPT +#define SAFE_ACCEPT(stmt) APR_SUCCESS +#else +#define SAFE_ACCEPT(stmt) (stmt) +static apr_proc_mutex_t *process_accept_mutex; +#endif /* NO_SERIALIZED_ACCEPT */ +static apr_thread_mutex_t *thread_accept_mutex; + +AP_DECLARE(apr_status_t) ap_mpm_query(int query_code, int *result) +{ + switch(query_code){ + case AP_MPMQ_MAX_DAEMON_USED: + *result = ap_max_daemons_limit; + return APR_SUCCESS; + case AP_MPMQ_IS_THREADED: + *result = AP_MPMQ_DYNAMIC; + return APR_SUCCESS; + case AP_MPMQ_IS_FORKED: + *result = AP_MPMQ_STATIC; + return APR_SUCCESS; + case AP_MPMQ_HARD_LIMIT_DAEMONS: + *result = server_limit; + return APR_SUCCESS; + case AP_MPMQ_HARD_LIMIT_THREADS: + *result = thread_limit; + return APR_SUCCESS; + case AP_MPMQ_MAX_THREADS: + *result = max_threads; + return APR_SUCCESS; + case AP_MPMQ_MIN_SPARE_DAEMONS: + *result = 0; + return APR_SUCCESS; + case AP_MPMQ_MIN_SPARE_THREADS: + *result = min_spare_threads; + return APR_SUCCESS; + case AP_MPMQ_MAX_SPARE_DAEMONS: + *result = 0; + return APR_SUCCESS; + case AP_MPMQ_MAX_SPARE_THREADS: + *result = max_spare_threads; + return APR_SUCCESS; + case AP_MPMQ_MAX_REQUESTS_DAEMON: + *result = ap_max_requests_per_child; + return APR_SUCCESS; + case AP_MPMQ_MAX_DAEMONS: + *result = num_daemons; + return APR_SUCCESS; + } + return APR_ENOTIMPL; +} + +/* a clean exit from a child with proper cleanup */ +static void clean_child_exit(int code) +{ + if (pchild) { + apr_pool_destroy(pchild); + } + exit(code); +} + +static void just_die(int sig) +{ + clean_child_exit(0); +} + +/***************************************************************** + * Connection structures and accounting... + */ + +/* volatile just in case */ +static int volatile shutdown_pending; +static int volatile restart_pending; +static int volatile is_graceful; +static int volatile child_fatal; +/* we don't currently track ap_my_generation, but mod_status + * references it so it must be defined */ +ap_generation_t volatile ap_my_generation=0; + +/* + * ap_start_shutdown() and ap_start_restart(), below, are a first stab at + * functions to initiate shutdown or restart without relying on signals. + * Previously this was initiated in sig_term() and restart() signal handlers, + * but we want to be able to start a shutdown/restart from other sources -- + * e.g. on Win32, from the service manager. Now the service manager can + * call ap_start_shutdown() or ap_start_restart() as appropiate. Note that + * these functions can also be called by the child processes, since global + * variables are no longer used to pass on the required action to the parent. + * + * These should only be called from the parent process itself, since the + * parent process will use the shutdown_pending and restart_pending variables + * to determine whether to shutdown or restart. The child process should + * call signal_parent() directly to tell the parent to die -- this will + * cause neither of those variable to be set, which the parent will + * assume means something serious is wrong (which it will be, for the + * child to force an exit) and so do an exit anyway. + */ + +static void ap_start_shutdown(void) +{ + if (shutdown_pending == 1) { + /* Um, is this _probably_ not an error, if the user has + * tried to do a shutdown twice quickly, so we won't + * worry about reporting it. + */ + return; + } + shutdown_pending = 1; +} + +/* do a graceful restart if graceful == 1 */ +static void ap_start_restart(int graceful) +{ + + if (restart_pending == 1) { + /* Probably not an error - don't bother reporting it */ + return; + } + restart_pending = 1; + is_graceful = graceful; +} + +static void sig_term(int sig) +{ + ap_start_shutdown(); +} + +static void restart(int sig) +{ +#ifndef WIN32 + ap_start_restart(sig == AP_SIG_GRACEFUL); +#else + ap_start_restart(1); +#endif +} + +static void set_signals(void) +{ +#ifndef NO_USE_SIGACTION + struct sigaction sa; +#endif + + if (!one_process) { + ap_fatal_signal_setup(ap_server_conf, pconf); + } + +#ifndef NO_USE_SIGACTION + sigemptyset(&sa.sa_mask); + sa.sa_flags = 0; + + sa.sa_handler = sig_term; + if (sigaction(SIGTERM, &sa, NULL) < 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, + "sigaction(SIGTERM)"); +#ifdef SIGINT + if (sigaction(SIGINT, &sa, NULL) < 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, + "sigaction(SIGINT)"); +#endif +#ifdef SIGXCPU + sa.sa_handler = SIG_DFL; + if (sigaction(SIGXCPU, &sa, NULL) < 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, + "sigaction(SIGXCPU)"); +#endif +#ifdef SIGXFSZ + sa.sa_handler = SIG_DFL; + if (sigaction(SIGXFSZ, &sa, NULL) < 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, + "sigaction(SIGXFSZ)"); +#endif +#ifdef SIGPIPE + sa.sa_handler = SIG_IGN; + if (sigaction(SIGPIPE, &sa, NULL) < 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, + "sigaction(SIGPIPE)"); +#endif + + /* we want to ignore HUPs and AP_SIG_GRACEFUL while we're busy + * processing one */ + sigaddset(&sa.sa_mask, SIGHUP); + sigaddset(&sa.sa_mask, AP_SIG_GRACEFUL); + sa.sa_handler = restart; + if (sigaction(SIGHUP, &sa, NULL) < 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, + "sigaction(SIGHUP)"); + if (sigaction(AP_SIG_GRACEFUL, &sa, NULL) < 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, + "sigaction(" AP_SIG_GRACEFUL_STRING ")"); +#else + if (!one_process) { +#ifdef SIGXCPU + apr_signal(SIGXCPU, SIG_DFL); +#endif /* SIGXCPU */ +#ifdef SIGXFSZ + apr_signal(SIGXFSZ, SIG_DFL); +#endif /* SIGXFSZ */ + } + + apr_signal(SIGTERM, sig_term); +#ifdef SIGHUP + apr_signal(SIGHUP, restart); +#endif /* SIGHUP */ +#ifdef AP_SIG_GRACEFUL + apr_signal(AP_SIG_GRACEFUL, restart); +#endif /* AP_SIG_GRACEFUL */ +#ifdef SIGPIPE + apr_signal(SIGPIPE, SIG_IGN); +#endif /* SIGPIPE */ + +#endif +} + +/***************************************************************** + * Here follows a long bunch of generic server bookkeeping stuff... + */ + +int ap_graceful_stop_signalled(void) +{ + /* XXX - Does this really work? - Manoj */ + return is_graceful; +} + +/***************************************************************** + * Child process main loop. + */ + +static void process_socket(apr_pool_t *p, apr_socket_t *sock, long conn_id, + apr_bucket_alloc_t *bucket_alloc) +{ + conn_rec *current_conn; + int csd; + apr_status_t rv; + int thread_num = conn_id % thread_limit; + ap_sb_handle_t *sbh; + + if ((rv = apr_os_sock_get(&csd, sock)) != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, NULL, "apr_os_sock_get"); + } + + if (thread_socket_table[thread_num] < 0) { + ap_sock_disable_nagle(sock); + } + + ap_create_sb_handle(&sbh, p, conn_id / thread_limit, thread_num); + current_conn = ap_run_create_connection(p, ap_server_conf, sock, conn_id, + sbh, bucket_alloc); + if (current_conn) { + ap_process_connection(current_conn, sock); + ap_lingering_close(current_conn); + } +} + +static int perchild_process_connection(conn_rec *c) +{ + ap_filter_t *f; + apr_bucket_brigade *bb; + core_net_rec *net; + + apr_pool_userdata_get((void **)&bb, "PERCHILD_SOCKETS", c->pool); + if (bb != NULL) { + for (f = c->output_filters; f != NULL; f = f->next) { + if (!strcmp(f->frec->name, "core")) { + break; + } + } + if (f != NULL) { + net = f->ctx; + net->in_ctx = apr_palloc(c->pool, sizeof(*net->in_ctx)); + net->in_ctx->b = bb; + } + } + return DECLINED; +} + + +static void *worker_thread(apr_thread_t *, void *); + +/* Starts a thread as long as we're below max_threads */ +static int start_thread(void) +{ + apr_thread_t *thread; + int rc; + + apr_thread_mutex_lock(worker_thread_count_mutex); + if (worker_thread_count < max_threads - 1) { + rc = apr_thread_create(&thread, worker_thread_attr, worker_thread, + &worker_thread_free_ids[worker_thread_count], pchild); + if (rc != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ALERT, rc, ap_server_conf, + "apr_thread_create: unable to create worker thread"); + /* In case system resources are maxxed out, we don't want + Apache running away with the CPU trying to fork over and + over and over again if we exit. */ + sleep(10); + workers_may_exit = 1; + apr_thread_mutex_unlock(worker_thread_count_mutex); + return 0; + } + else { + worker_thread_count++; + } + } + else { + static int reported = 0; + + if (!reported) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, + ap_server_conf, + "server reached MaxThreadsPerChild setting, " + "consider raising the MaxThreadsPerChild or " + "NumServers settings"); + reported = 1; + } + apr_thread_mutex_unlock(worker_thread_count_mutex); + return 0; + } + apr_thread_mutex_unlock(worker_thread_count_mutex); + return 1; + +} + +/* Sets workers_may_exit if we received a character on the pipe_of_death */ +static apr_status_t check_pipe_of_death(void **csd, ap_listen_rec *lr, + apr_pool_t *ptrans) +{ + apr_thread_mutex_lock(pipe_of_death_mutex); + if (!workers_may_exit) { + int ret; + char pipe_read_char; + apr_size_t n = 1; + + ret = apr_recv(lr->sd, &pipe_read_char, &n); + if (APR_STATUS_IS_EAGAIN(ret)) { + /* It lost the lottery. It must continue to suffer + * through a life of servitude. */ + } + else { + /* It won the lottery (or something else is very + * wrong). Embrace death with open arms. */ + workers_may_exit = 1; + } + } + apr_thread_mutex_unlock(pipe_of_death_mutex); + return APR_SUCCESS; +} + +static apr_status_t receive_from_other_child(void **csd, ap_listen_rec *lr, + apr_pool_t *ptrans) +{ + struct msghdr msg; + struct cmsghdr *cmsg; + char buffer[HUGE_STRING_LEN * 2], *headers, *body; + int headerslen, bodylen; + struct iovec iov; + int ret, dp; + apr_os_sock_t sd; + apr_bucket_alloc_t *alloc = apr_bucket_alloc_create(ptrans); + apr_bucket_brigade *bb = apr_brigade_create(ptrans, alloc); + apr_bucket *bucket; + + apr_os_sock_get(&sd, lr->sd); + + iov.iov_base = buffer; + iov.iov_len = sizeof(buffer); + + msg.msg_name = NULL; + msg.msg_namelen = 0; + msg.msg_iov = &iov; + msg.msg_iovlen = 1; + + cmsg = apr_palloc(ptrans, sizeof(*cmsg) + sizeof(sd)); + cmsg->cmsg_len = sizeof(*cmsg) + sizeof(sd); + msg.msg_control = cmsg; + msg.msg_controllen = cmsg->cmsg_len; + + ret = recvmsg(sd, &msg, 0); + + memcpy(&dp, CMSG_DATA(cmsg), sizeof(dp)); + + *csd = NULL; /* tell apr_os_sock_put() to allocate new apr_socket_t */ + apr_os_sock_put((apr_socket_t **)csd, &dp, ptrans); + + bucket = apr_bucket_eos_create(alloc); + APR_BRIGADE_INSERT_HEAD(bb, bucket); + bucket = apr_bucket_socket_create(*csd, alloc); + APR_BRIGADE_INSERT_HEAD(bb, bucket); + + body = strchr(iov.iov_base, 0); + if (!body) { + return 1; + } + + body++; + bodylen = strlen(body); + + headers = iov.iov_base; + headerslen = body - headers; + + bucket = apr_bucket_heap_create(body, bodylen, NULL, alloc); + APR_BRIGADE_INSERT_HEAD(bb, bucket); + bucket = apr_bucket_heap_create(headers, headerslen, NULL, alloc); + APR_BRIGADE_INSERT_HEAD(bb, bucket); + + apr_pool_userdata_set(bb, "PERCHILD_SOCKETS", NULL, ptrans); + + return 0; +} + +/* idle_thread_count should be incremented before starting a worker_thread */ + +static void *worker_thread(apr_thread_t *thd, void *arg) +{ + void *csd; + apr_pool_t *tpool; /* Pool for this thread */ + apr_pool_t *ptrans; /* Pool for per-transaction stuff */ + volatile int thread_just_started = 1; + int srv; + int thread_num = *((int *) arg); + long conn_id = child_num * thread_limit + thread_num; + apr_pollfd_t *pollset; + apr_status_t rv; + ap_listen_rec *lr, *last_lr = ap_listeners; + int n; + apr_bucket_alloc_t *bucket_alloc; + + apr_thread_mutex_lock(thread_pool_parent_mutex); + apr_pool_create(&tpool, thread_pool_parent); + apr_thread_mutex_unlock(thread_pool_parent_mutex); + apr_pool_create(&ptrans, tpool); + + (void) ap_update_child_status_from_indexes(child_num, thread_num, + SERVER_STARTING, + (request_rec *) NULL); + + bucket_alloc = apr_bucket_alloc_create(apr_thread_pool_get(thd)); + + apr_poll_setup(&pollset, num_listensocks, tpool); + for(lr = ap_listeners; lr != NULL; lr = lr->next) { + int fd; + apr_poll_socket_add(pollset, lr->sd, APR_POLLIN); + + apr_os_sock_get(&fd, lr->sd); + } + + while (!workers_may_exit) { + workers_may_exit |= ((ap_max_requests_per_child != 0) + && (requests_this_child <= 0)); + if (workers_may_exit) break; + if (!thread_just_started) { + apr_thread_mutex_lock(idle_thread_count_mutex); + if (idle_thread_count < max_spare_threads) { + idle_thread_count++; + apr_thread_mutex_unlock(idle_thread_count_mutex); + } + else { + apr_thread_mutex_unlock(idle_thread_count_mutex); + break; + } + } + else { + thread_just_started = 0; + } + + (void) ap_update_child_status_from_indexes(child_num, thread_num, + SERVER_READY, + (request_rec *) NULL); + + apr_thread_mutex_lock(thread_accept_mutex); + if (workers_may_exit) { + apr_thread_mutex_unlock(thread_accept_mutex); + break; + } + if ((rv = SAFE_ACCEPT(apr_proc_mutex_lock(process_accept_mutex))) + != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_EMERG, rv, ap_server_conf, + "apr_proc_mutex_lock failed. Attempting to shutdown " + "process gracefully."); + workers_may_exit = 1; + } + + while (!workers_may_exit) { + apr_int16_t event; + srv = apr_poll(pollset, num_listensocks, &n, -1); + + if (srv != APR_SUCCESS) { + if (APR_STATUS_IS_EINTR(srv)) { + continue; + } + + /* apr_poll() will only return errors in catastrophic + * circumstances. Let's try exiting gracefully, for now. */ + ap_log_error(APLOG_MARK, APLOG_ERR, srv, (const server_rec *) + ap_server_conf, "apr_poll: (listen)"); + workers_may_exit = 1; + } + if (workers_may_exit) break; + + /* find a listener */ + lr = last_lr; + do { + lr = lr->next; + if (lr == NULL) { + lr = ap_listeners; + } + /* XXX: Should we check for POLLERR? */ + apr_poll_revents_get(&event, lr->sd, pollset); + if (event & (APR_POLLIN)) { + last_lr = lr; + goto got_fd; + } + } while (lr != last_lr); + } + got_fd: + if (!workers_may_exit) { + rv = lr->accept_func(&csd, lr, ptrans); + if (rv == APR_EGENERAL) { + /* E[NM]FILE, ENOMEM, etc */ + workers_may_exit = 1; + } + if ((rv = SAFE_ACCEPT(apr_proc_mutex_unlock(process_accept_mutex))) + != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_EMERG, rv, ap_server_conf, + "apr_proc_mutex_unlock failed. Attempting to shutdown " + "process gracefully."); + workers_may_exit = 1; + } + apr_thread_mutex_unlock(thread_accept_mutex); + apr_thread_mutex_lock(idle_thread_count_mutex); + if (idle_thread_count > min_spare_threads) { + idle_thread_count--; + } + else { + if (!start_thread()) { + idle_thread_count--; + } + } + apr_thread_mutex_unlock(idle_thread_count_mutex); + if (setjmp(jmpbuffer) != 1) { + process_socket(ptrans, csd, conn_id, bucket_alloc); + } + else { + thread_socket_table[thread_num] = AP_PERCHILD_THISCHILD; + } + requests_this_child--; + } + else { + if ((rv = SAFE_ACCEPT(apr_proc_mutex_unlock(process_accept_mutex))) + != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_EMERG, rv, ap_server_conf, + "apr_proc_mutex_unlock failed. Attempting to shutdown " + "process gracefully."); + workers_may_exit = 1; + } + apr_thread_mutex_unlock(thread_accept_mutex); + apr_thread_mutex_lock(idle_thread_count_mutex); + idle_thread_count--; + apr_thread_mutex_unlock(idle_thread_count_mutex); + break; + } + apr_pool_clear(ptrans); + } + + apr_thread_mutex_lock(thread_pool_parent_mutex); + ap_update_child_status_from_indexes(child_num, thread_num, SERVER_DEAD, + (request_rec *) NULL); + apr_pool_destroy(tpool); + apr_thread_mutex_unlock(thread_pool_parent_mutex); + apr_thread_mutex_lock(worker_thread_count_mutex); + worker_thread_count--; + worker_thread_free_ids[worker_thread_count] = thread_num; + if (worker_thread_count == 0) { + /* All the threads have exited, now finish the shutdown process + * by signalling the sigwait thread */ + kill(my_pid, SIGTERM); + } + apr_thread_mutex_unlock(worker_thread_count_mutex); + + apr_bucket_alloc_destroy(bucket_alloc); + + return NULL; +} + + + +/* Set group privileges. + * + * Note that we use the username as set in the config files, rather than + * the lookup of to uid --- the same uid may have multiple passwd entries, + * with different sets of groups for each. + */ + +static int set_group_privs(uid_t uid, gid_t gid) +{ + if (!geteuid()) { + const char *name; + + /* Get username if passed as a uid */ + + struct passwd *ent; + + if ((ent = getpwuid(uid)) == NULL) { + ap_log_error(APLOG_MARK, APLOG_ALERT, errno, NULL, + "getpwuid: couldn't determine user name from uid %u, " + "you probably need to modify the User directive", + (unsigned)uid); + return -1; + } + + name = ent->pw_name; + + /* + * Set the GID before initgroups(), since on some platforms + * setgid() is known to zap the group list. + */ + if (setgid(gid) == -1) { + ap_log_error(APLOG_MARK, APLOG_ALERT, errno, NULL, + "setgid: unable to set group id to Group %u", + (unsigned)gid); + return -1; + } + + /* Reset `groups' attributes. */ + + if (initgroups(name, gid) == -1) { + ap_log_error(APLOG_MARK, APLOG_ALERT, errno, NULL, + "initgroups: unable to set groups for User %s " + "and Group %u", name, (unsigned)gid); + return -1; + } + } + return 0; +} + + +static int perchild_setup_child(int childnum) +{ + child_info_t *ug = &child_info_table[childnum]; + + if (ug->uid == -1 && ug->gid == -1) { + return unixd_setup_child(); + } + if (set_group_privs(ug->uid, ug->gid)) { + return -1; + } + /* Only try to switch if we're running as root */ + if (!geteuid() + && ( +#ifdef _OSD_POSIX + os_init_job_environment(server_conf, unixd_config.user_name, + one_process) != 0 || +#endif + setuid(ug->uid) == -1)) { + ap_log_error(APLOG_MARK, APLOG_ALERT, errno, NULL, + "setuid: unable to change to uid: %ld", + (long) ug->uid); + return -1; + } + return 0; +} + +static int check_signal(int signum) +{ + switch (signum) { + case SIGTERM: + case SIGINT: + just_die(signum); + return 1; + } + return 0; +} + +typedef struct perchild_header { + char *headers; + apr_pool_t *p; +} perchild_header; + +/* Send a single HTTP header field to the client. Note that this function + * is used in calls to table_do(), so their interfaces are co-dependent. + * In other words, don't change this one without checking table_do in alloc.c. + * It returns true unless there was a write error of some kind. + */ +static int perchild_header_field(perchild_header *h, + const char *fieldname, const char *fieldval) +{ + apr_pstrcat(h->p, h->headers, fieldname, ": ", fieldval, CRLF, NULL); + return 1; +} + + +static void child_main(int child_num_arg) +{ + int i; + apr_status_t rv; + apr_socket_t *sock = NULL; + ap_listen_rec *lr; + + my_pid = getpid(); + ap_fatal_signal_child_setup(ap_server_conf); + child_num = child_num_arg; + apr_pool_create(&pchild, pconf); + + for (lr = ap_listeners ; lr->next != NULL; lr = lr->next) { + continue; + } + + apr_os_sock_put(&sock, &child_info_table[child_num].input, pconf); + lr->next = apr_palloc(pconf, sizeof(*lr)); + lr->next->sd = sock; + lr->next->active = 1; + lr->next->accept_func = receive_from_other_child; + lr->next->next = NULL; + lr = lr->next; + num_listensocks++; + + /*stuff to do before we switch id's, so we have permissions.*/ + + rv = SAFE_ACCEPT(apr_proc_mutex_child_init(&process_accept_mutex, + ap_lock_fname, pchild)); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_EMERG, rv, ap_server_conf, + "Couldn't initialize cross-process lock in child"); + clean_child_exit(APEXIT_CHILDFATAL); + } + + if (perchild_setup_child(child_num)) { + clean_child_exit(APEXIT_CHILDFATAL); + } + + ap_run_child_init(pchild, ap_server_conf); + + /*done with init critical section */ + + apr_setup_signal_thread(); + + requests_this_child = ap_max_requests_per_child; + + + /* Setup worker threads */ + + if (threads_to_start > max_threads) { + threads_to_start = max_threads; + } + idle_thread_count = threads_to_start; + worker_thread_count = 0; + worker_thread_free_ids = (int *)apr_pcalloc(pchild, thread_limit * sizeof(int)); + for (i = 0; i < max_threads; i++) { + worker_thread_free_ids[i] = i; + } + apr_pool_create(&thread_pool_parent, pchild); + apr_thread_mutex_create(&thread_pool_parent_mutex, + APR_THREAD_MUTEX_DEFAULT, pchild); + apr_thread_mutex_create(&idle_thread_count_mutex, + APR_THREAD_MUTEX_DEFAULT, pchild); + apr_thread_mutex_create(&worker_thread_count_mutex, + APR_THREAD_MUTEX_DEFAULT, pchild); + apr_thread_mutex_create(&pipe_of_death_mutex, + APR_THREAD_MUTEX_DEFAULT, pchild); + apr_thread_mutex_create(&thread_accept_mutex, + APR_THREAD_MUTEX_DEFAULT, pchild); + + apr_threadattr_create(&worker_thread_attr, pchild); + apr_threadattr_detach_set(worker_thread_attr, 1); + + /* We are creating worker threads right now */ + for (i=0; i < threads_to_start; i++) { + /* start_thread shouldn't fail here */ + if (!start_thread()) { + break; + } + } + + apr_signal_thread(check_signal); +} + +static int make_child(server_rec *s, int slot) +{ + int pid; + + if (slot + 1 > ap_max_daemons_limit) { + ap_max_daemons_limit = slot + 1; + } + + if (one_process) { + set_signals(); + ap_child_table[slot].pid = getpid(); + ap_child_table[slot].status = SERVER_ALIVE; + child_main(slot); + } + (void) ap_update_child_status_from_indexes(slot, 0, SERVER_STARTING, + (request_rec *) NULL); + + if ((pid = fork()) == -1) { + ap_log_error(APLOG_MARK, APLOG_ERR, errno, s, + "fork: Unable to fork new process"); + /* In case system resources are maxxed out, we don't want + * Apache running away with the CPU trying to fork over and + * over and over again. */ + sleep(10); + + return -1; + } + + if (!pid) { +#ifdef HAVE_BINDPROCESSOR + /* By default, AIX binds to a single processor. This bit unbinds + * children which will then bind to another CPU. + */ + int status = bindprocessor(BINDPROCESS, (int)getpid(), + PROCESSOR_CLASS_ANY); + if (status != OK) { + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, + ap_server_conf, "processor unbind failed %d", status); + } +#endif + + RAISE_SIGSTOP(MAKE_CHILD); + + /* XXX - For an unthreaded server, a signal handler will be necessary + * apr_signal(SIGTERM, just_die); + */ + child_main(slot); + clean_child_exit(0); + } + /* else */ + ap_child_table[slot].pid = pid; + ap_child_table[slot].status = SERVER_ALIVE; + + return 0; +} + +/* start up a bunch of children */ +static int startup_children(int number_to_start) +{ + int i; + + for (i = 0; number_to_start && i < num_daemons; ++i) { + if (ap_child_table[i].pid) { + continue; + } + if (make_child(ap_server_conf, i) < 0) { + break; + } + --number_to_start; + } + return number_to_start; +} + + +/* + * spawn_rate is the number of children that will be spawned on the + * next maintenance cycle if there aren't enough servers. It is + * doubled up to MAX_SPAWN_RATE, and reset only when a cycle goes by + * without the need to spawn. + */ +static int spawn_rate = 1; +#ifndef MAX_SPAWN_RATE +#define MAX_SPAWN_RATE (32) +#endif +static int hold_off_on_exponential_spawning; + +static void perform_child_maintenance(void) +{ + int i; + int free_length; + int free_slots[MAX_SPAWN_RATE]; + int last_non_dead = -1; + + /* initialize the free_list */ + free_length = 0; + + for (i = 0; i < num_daemons; ++i) { + if (ap_child_table[i].pid == 0) { + if (free_length < spawn_rate) { + free_slots[free_length] = i; + ++free_length; + } + } + else { + last_non_dead = i; + } + + if (i >= ap_max_daemons_limit && free_length >= spawn_rate) { + break; + } + } + ap_max_daemons_limit = last_non_dead + 1; + + if (free_length > 0) { + for (i = 0; i < free_length; ++i) { + make_child(ap_server_conf, free_slots[i]); + } + /* the next time around we want to spawn twice as many if this + * wasn't good enough, but not if we've just done a graceful + */ + if (hold_off_on_exponential_spawning) { + --hold_off_on_exponential_spawning; + } + else if (spawn_rate < MAX_SPAWN_RATE) { + spawn_rate *= 2; + } + } + else { + spawn_rate = 1; + } +} + +static void server_main_loop(int remaining_children_to_start) +{ + int child_slot; + apr_exit_why_e exitwhy; + int status; + apr_proc_t pid; + int i; + + while (!restart_pending && !shutdown_pending) { + ap_wait_or_timeout(&exitwhy, &status, &pid, pconf); + + if (pid.pid != -1) { + if (ap_process_child_status(&pid, exitwhy, status) + == APEXIT_CHILDFATAL) { + shutdown_pending = 1; + child_fatal = 1; + return; + } + /* non-fatal death... note that it's gone in the child table and + * clean out the status table. */ + child_slot = -1; + for (i = 0; i < ap_max_daemons_limit; ++i) { + if (ap_child_table[i].pid == pid.pid) { + child_slot = i; + break; + } + } + if (child_slot >= 0) { + ap_child_table[child_slot].pid = 0; + ap_update_child_status_from_indexes(child_slot, i, SERVER_DEAD, + (request_rec *) NULL); + + + if (remaining_children_to_start + && child_slot < num_daemons) { + /* we're still doing a 1-for-1 replacement of dead + * children with new children + */ + make_child(ap_server_conf, child_slot); + --remaining_children_to_start; + } +#if APR_HAS_OTHER_CHILD + } + else if (apr_proc_other_child_read(&pid, status) == 0) { + /* handled */ +#endif + } + else if (is_graceful) { + /* Great, we've probably just lost a slot in the + * child table. Somehow we don't know about this + * child. + */ + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, + ap_server_conf, + "long lost child came home! (pid %ld)", + (long)pid.pid); + } + /* Don't perform idle maintenance when a child dies, + * only do it when there's a timeout. Remember only a + * finite number of children can die, and it's pretty + * pathological for a lot to die suddenly. + */ + continue; + } + else if (remaining_children_to_start) { + /* we hit a 1 second timeout in which none of the previous + * generation of children needed to be reaped... so assume + * they're all done, and pick up the slack if any is left. + */ + remaining_children_to_start = \ + startup_children(remaining_children_to_start); + /* In any event we really shouldn't do the code below because + * few of the servers we just started are in the IDLE state + * yet, so we'd mistakenly create an extra server. + */ + continue; + } + + perform_child_maintenance(); + } +} + +int ap_mpm_run(apr_pool_t *_pconf, apr_pool_t *plog, server_rec *s) +{ + int remaining_children_to_start; + int i; + apr_status_t rv; + apr_size_t one = 1; + ap_listen_rec *lr; + apr_socket_t *sock = NULL; + int fd; + + ap_log_pid(pconf, ap_pid_fname); + + first_server_limit = server_limit; + first_thread_limit = thread_limit; + if (changed_limit_at_restart) { + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s, + "WARNING: Attempt to change ServerLimit or ThreadLimit " + "ignored during restart"); + changed_limit_at_restart = 0; + } + + ap_server_conf = s; + + if ((ap_accept_lock_mech == APR_LOCK_SYSVSEM) || + (ap_accept_lock_mech == APR_LOCK_POSIXSEM)) { + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s, + "Server configured for an accept lock mechanism that " + "cannot be used with perchild. Falling back to FCNTL."); + ap_accept_lock_mech = APR_LOCK_FCNTL; + } + + /* Initialize cross-process accept lock */ + ap_lock_fname = apr_psprintf(_pconf, "%s.%u", + ap_server_root_relative(_pconf, ap_lock_fname), + my_pid); + rv = SAFE_ACCEPT(apr_proc_mutex_create(&process_accept_mutex, + ap_lock_fname, ap_accept_lock_mech, + _pconf)); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_EMERG, rv, s, + "Couldn't create cross-process lock"); + return 1; + } + + if (!is_graceful) { + if (ap_run_pre_mpm(s->process->pool, SB_SHARED) != OK) { + return 1; + } + } + /* Initialize the child table */ + if (!is_graceful) { + for (i = 0; i < server_limit; i++) { + ap_child_table[i].pid = 0; + } + } + + /* We need to put the new listeners at the end of the ap_listeners + * list. If we don't, then the pool will be cleared before the + * open_logs phase is called for the second time, and ap_listeners + * will have only invalid data. If that happens, then the sockets + * that we opened using make_sock() will be lost, and the server + * won't start. + */ + for (lr = ap_listeners ; lr->next != NULL; lr = lr->next) { + continue; + } + + apr_os_file_get(&fd, pipe_of_death_in); + apr_os_sock_put(&sock, &fd, pconf); + lr->next = apr_palloc(pconf, sizeof(*lr)); + lr->next->sd = sock; + lr->next->active = 1; + lr->next->accept_func = check_pipe_of_death; + lr->next->next = NULL; + lr = lr->next; + num_listensocks++; + + set_signals(); + + /* If we're doing a graceful_restart then we're going to see a lot + * of children exiting immediately when we get into the main loop + * below (because we just sent them AP_SIG_GRACEFUL). This happens + * pretty rapidly... and for each one that exits we'll start a new one + * until we reach at least daemons_min_free. But we may be permitted to + * start more than that, so we'll just keep track of how many we're + * supposed to start up without the 1 second penalty between each fork. + */ + remaining_children_to_start = num_daemons; + if (!is_graceful) { + remaining_children_to_start = \ + startup_children(remaining_children_to_start); + } + else { + /* give the system some time to recover before kicking into + * exponential mode */ + hold_off_on_exponential_spawning = 10; + } + + ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, ap_server_conf, + "%s configured -- resuming normal operations", + ap_get_server_version()); + ap_log_error(APLOG_MARK, APLOG_INFO, 0, ap_server_conf, + "Server built: %s", ap_get_server_built()); +#ifdef AP_MPM_WANT_SET_ACCEPT_LOCK_MECH + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, ap_server_conf, + "AcceptMutex: %s (default: %s)", + apr_proc_mutex_name(process_accept_mutex), + apr_proc_mutex_defname()); +#endif + restart_pending = shutdown_pending = 0; + + server_main_loop(remaining_children_to_start); + + if (shutdown_pending) { + /* Time to gracefully shut down: + * Kill child processes, tell them to call child_exit, etc... + */ + if (unixd_killpg(getpgrp(), SIGTERM) < 0) { + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, + "killpg SIGTERM"); + } + ap_reclaim_child_processes(1); /* Start with SIGTERM */ + + if (!child_fatal) { + /* cleanup pid file on normal shutdown */ + const char *pidfile = NULL; + pidfile = ap_server_root_relative (pconf, ap_pid_fname); + if (pidfile != NULL && unlink(pidfile) == 0) { + ap_log_error(APLOG_MARK, APLOG_INFO, 0, + ap_server_conf, + "removed PID file %s (pid=%ld)", + pidfile, (long)getpid()); + } + + ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, + ap_server_conf, "caught SIGTERM, shutting down"); + } + return 1; + } + + /* we've been told to restart */ + apr_signal(SIGHUP, SIG_IGN); + + if (one_process) { + /* not worth thinking about */ + return 1; + } + + if (is_graceful) { + char char_of_death = '!'; + + ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, + ap_server_conf, AP_SIG_GRACEFUL_STRING " received. " + "Doing graceful restart"); + + /* This is mostly for debugging... so that we know what is still + * gracefully dealing with existing request. + */ + + for (i = 0; i < num_daemons; ++i) { + if (ap_child_table[i].pid) { + ap_child_table[i].status = SERVER_DYING; + } + } + /* give the children the signal to die */ + for (i = 0; i < num_daemons;) { + if ((rv = apr_file_write(pipe_of_death_out, &char_of_death, + &one)) != APR_SUCCESS) { + if (APR_STATUS_IS_EINTR(rv)) continue; + ap_log_error(APLOG_MARK, APLOG_WARNING, rv, ap_server_conf, + "write pipe_of_death"); + } + i++; + } + } + else { + /* Kill 'em all. Since the child acts the same on the parents SIGTERM + * and a SIGHUP, we may as well use the same signal, because some user + * pthreads are stealing signals from us left and right. + */ + if (unixd_killpg(getpgrp(), SIGTERM) < 0) { + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, + "killpg SIGTERM"); + } + ap_reclaim_child_processes(1); /* Start with SIGTERM */ + ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, + ap_server_conf, "SIGHUP received. Attempting to restart"); + } + return 0; +} + +/* This really should be a post_config hook, but the error log is already + * redirected by that point, so we need to do this in the open_logs phase. + */ +static int perchild_open_logs(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s) +{ + apr_status_t rv; + + pconf = p; + ap_server_conf = s; + + if ((num_listensocks = ap_setup_listeners(ap_server_conf)) < 1) { + ap_log_error(APLOG_MARK, APLOG_ALERT|APLOG_STARTUP, 0, + NULL, "no listening sockets available, shutting down"); + return DONE; + } + + ap_log_pid(pconf, ap_pid_fname); + + if ((rv = ap_mpm_pod_open(pconf, &pod))) { + ap_log_error(APLOG_MARK, APLOG_CRIT|APLOG_STARTUP, rv, NULL, + "Could not open pipe-of-death."); + return DONE; + } + + if ((rv = apr_file_pipe_create(&pipe_of_death_in, &pipe_of_death_out, + pconf)) != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, + (const server_rec*) ap_server_conf, + "apr_file_pipe_create (pipe_of_death)"); + exit(1); + } + if ((rv = apr_file_pipe_timeout_set(pipe_of_death_in, 0)) != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, + (const server_rec*) ap_server_conf, + "apr_file_pipe_timeout_set (pipe_of_death)"); + exit(1); + } + + return OK; +} + +static int perchild_pre_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp) +{ + static int restart_num = 0; + int no_detach, debug, foreground; + ap_directive_t *pdir; + int i; + int tmp_server_limit = DEFAULT_SERVER_LIMIT; + int tmp_thread_limit = DEFAULT_THREAD_LIMIT; + apr_status_t rv; + + debug = ap_exists_config_define("DEBUG"); + + if (debug) { + foreground = one_process = 1; + no_detach = 0; + } + else { + one_process = ap_exists_config_define("ONE_PROCESS"); + no_detach = ap_exists_config_define("NO_DETACH"); + foreground = ap_exists_config_define("FOREGROUND"); + } + + /* sigh, want this only the second time around */ + if (restart_num++ == 1) { + is_graceful = 0; + + if (!one_process && !foreground) { + rv = apr_proc_detach(no_detach ? APR_PROC_DETACH_FOREGROUND + : APR_PROC_DETACH_DAEMONIZE); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_CRIT, rv, NULL, + "apr_proc_detach failed"); + return HTTP_INTERNAL_SERVER_ERROR; + } + } + + my_pid = getpid(); + } + + unixd_pre_config(ptemp); + ap_listen_pre_config(); + num_daemons = DEFAULT_NUM_DAEMON; + threads_to_start = DEFAULT_START_THREAD; + min_spare_threads = DEFAULT_MIN_SPARE_THREAD; + max_spare_threads = DEFAULT_MAX_SPARE_THREAD; + max_threads = thread_limit; + ap_pid_fname = DEFAULT_PIDLOG; + ap_lock_fname = DEFAULT_LOCKFILE; + ap_max_requests_per_child = DEFAULT_MAX_REQUESTS_PER_CHILD; + curr_child_num = 0; +#ifdef AP_MPM_WANT_SET_MAX_MEM_FREE + ap_max_mem_free = APR_ALLOCATOR_MAX_FREE_UNLIMITED; +#endif + + apr_cpystrn(ap_coredump_dir, ap_server_root, sizeof(ap_coredump_dir)); + + /* we need to know ServerLimit and ThreadLimit before we start processing + * the tree because we need to already have allocated child_info_table + */ + for (pdir = ap_conftree; pdir != NULL; pdir = pdir->next) { + if (!strcasecmp(pdir->directive, "ServerLimit")) { + if (atoi(pdir->args) > tmp_server_limit) { + tmp_server_limit = atoi(pdir->args); + if (tmp_server_limit > MAX_SERVER_LIMIT) { + tmp_server_limit = MAX_SERVER_LIMIT; + } + } + } + else if (!strcasecmp(pdir->directive, "ThreadLimit")) { + if (atoi(pdir->args) > tmp_thread_limit) { + tmp_thread_limit = atoi(pdir->args); + if (tmp_thread_limit > MAX_THREAD_LIMIT) { + tmp_thread_limit = MAX_THREAD_LIMIT; + } + } + } + } + + child_info_table = (child_info_t *)apr_pcalloc(p, tmp_server_limit * sizeof(child_info_t)); + for (i = 0; i < tmp_server_limit; i++) { + child_info_table[i].uid = -1; + child_info_table[i].gid = -1; + child_info_table[i].input = -1; + child_info_table[i].output = -1; + } + + return OK; +} + +static int pass_request(request_rec *r) +{ + int rv; + apr_socket_t *thesock = ap_get_module_config(r->connection->conn_config, &core_module); + struct msghdr msg; + struct cmsghdr *cmsg; + int sfd; + struct iovec iov[2]; + conn_rec *c = r->connection; + apr_bucket_brigade *bb = apr_brigade_create(r->pool, c->bucket_alloc); + apr_bucket_brigade *sockbb; + char request_body[HUGE_STRING_LEN] = "\0"; + apr_size_t l = sizeof(request_body); + perchild_header h; + apr_bucket *sockbuck; + perchild_server_conf *sconf = (perchild_server_conf *) + ap_get_module_config(r->server->module_config, + &mpm_perchild_module); + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, ap_server_conf, + "passing request to another child. Vhost: %s, child %d %d", + apr_table_get(r->headers_in, "Host"), child_num, sconf->output); + ap_get_brigade(r->connection->input_filters, bb, AP_MODE_EXHAUSTIVE, APR_NONBLOCK_READ, + 0); + + for (sockbuck = APR_BRIGADE_FIRST(bb); sockbuck != APR_BRIGADE_SENTINEL(bb); + sockbuck = APR_BUCKET_NEXT(sockbuck)) { + if (APR_BUCKET_IS_SOCKET(sockbuck)) { + break; + } + } + + if (!sockbuck) { + } + sockbb = apr_brigade_split(bb, sockbuck); + + if (apr_brigade_flatten(bb, request_body, &l) != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, ap_server_conf, + "Unable to flatten brigade, declining request"); + return DECLINED; + } + + apr_os_sock_get(&sfd, thesock); + + h.p = r->pool; + h.headers = apr_pstrcat(h.p, r->the_request, CRLF, "Host: ", r->hostname, + CRLF, NULL); + apr_table_do((int (*) (void *, const char *, const char *)) + perchild_header_field, (void *) &h, r->headers_in, NULL); + h.headers = apr_pstrcat(h.p, h.headers, CRLF, NULL); + + iov[0].iov_base = h.headers; + iov[0].iov_len = strlen(h.headers) + 1; + iov[1].iov_base = request_body; + iov[1].iov_len = l + 1; + + msg.msg_name = NULL; + msg.msg_namelen = 0; + msg.msg_iov = iov; + msg.msg_iovlen = 2; + + cmsg = apr_palloc(r->pool, sizeof(*cmsg) + sizeof(sfd)); + cmsg->cmsg_len = sizeof(*cmsg) + sizeof(sfd); + cmsg->cmsg_level = SOL_SOCKET; + cmsg->cmsg_type = SCM_RIGHTS; + + memcpy(CMSG_DATA(cmsg), &sfd, sizeof(sfd)); + + msg.msg_control = cmsg; + msg.msg_controllen = cmsg->cmsg_len; + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, ap_server_conf, + "Writing message to %d, passing sd: %d", sconf->output, sfd); + + if ((rv = sendmsg(sconf->output, &msg, 0)) == -1) { + apr_pool_destroy(r->pool); + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, ap_server_conf, + "Writing message failed %d %d", rv, errno); + return -1; + } + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, ap_server_conf, + "Writing message succeeded %d", rv); + + apr_pool_destroy(r->pool); + return 1; +} + +static char *make_perchild_socket(const char *fullsockname, int sd[2]) +{ + socketpair(PF_UNIX, SOCK_STREAM, 0, sd); + return NULL; +} + +static int perchild_post_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s) +{ + int i; + server_rec *sr; + perchild_server_conf *sconf; + int def_sd[2]; + + def_sd[0] = -1; + def_sd[1] = -1; + + for (sr = s; sr; sr = sr->next) { + sconf = (perchild_server_conf *)ap_get_module_config(sr->module_config, + &mpm_perchild_module); + + if (sconf->input == -1) { + sconf->fullsockname = apr_pstrcat(sr->process->pool, + sconf->sockname, ".DEFAULT", NULL); + if (def_sd[0] == -1) { + if (!make_perchild_socket(sconf->fullsockname, def_sd)) { + /* log error */ + } + } + sconf->input = def_sd[0]; + sconf->output = def_sd[1]; + } + } + + for (i = 0; i < num_daemons; i++) { + if (child_info_table[i].uid == -1) { + child_info_table[i].input = def_sd[0]; + child_info_table[i].output = def_sd[1]; + } + } + + thread_socket_table = (int *)apr_pcalloc(p, thread_limit * sizeof(int)); + for (i = 0; i < thread_limit; i++) { + thread_socket_table[i] = AP_PERCHILD_THISCHILD; + } + ap_child_table = (ap_ctable *)apr_pcalloc(p, server_limit * sizeof(ap_ctable)); + + return OK; +} + +static int perchild_post_read(request_rec *r) +{ + int thread_num = r->connection->id % thread_limit; + perchild_server_conf *sconf = (perchild_server_conf *) + ap_get_module_config(r->server->module_config, + &mpm_perchild_module); + + if (thread_socket_table[thread_num] != AP_PERCHILD_THISCHILD) { + apr_socket_t *csd = NULL; + + apr_os_sock_put(&csd, &thread_socket_table[thread_num], + r->connection->pool); + ap_sock_disable_nagle(csd); + ap_set_module_config(r->connection->conn_config, &core_module, csd); + return OK; + } + else { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, ap_server_conf, + "Determining if request should be passed. " + "Child Num: %d, SD: %d, sd from table: %d, hostname from server: %s", child_num, + sconf->input, child_info_table[child_num].input, + r->server->server_hostname); + /* sconf is the server config for this vhost, so if our socket + * is not the same that was set in the config, then the request + * needs to be passed to another child. */ + if (sconf->input != child_info_table[child_num].input) { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, ap_server_conf, + "Passing request."); + if (pass_request(r) == -1) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, + ap_server_conf, "Could not pass request to proper " + "child, request will not be honored."); + } + longjmp(jmpbuffer, 1); + } + return OK; + } + return OK; +} + +static void perchild_hooks(apr_pool_t *p) +{ + /* The perchild open_logs phase must run before the core's, or stderr + * will be redirected to a file, and the messages won't print to the + * console. + */ + static const char *const aszSucc[] = {"core.c", NULL}; + one_process = 0; + + ap_hook_open_logs(perchild_open_logs, NULL, aszSucc, APR_HOOK_MIDDLE); + ap_hook_pre_config(perchild_pre_config, NULL, NULL, APR_HOOK_MIDDLE); + ap_hook_post_config(perchild_post_config, NULL, NULL, APR_HOOK_MIDDLE); + + /* Both of these must be run absolutely first. If this request isn't for + * this server then we need to forward it to the proper child. No sense + * tying up this server running more post_read request hooks if it is + * just going to be forwarded along. The process_connection hook allows + * perchild to receive the passed request correctly, by automatically + * filling in the core_input_filter's ctx pointer. + */ + ap_hook_post_read_request(perchild_post_read, NULL, NULL, + APR_HOOK_REALLY_FIRST); + ap_hook_process_connection(perchild_process_connection, NULL, NULL, + APR_HOOK_REALLY_FIRST); +} + +static const char *set_num_daemons(cmd_parms *cmd, void *dummy, + const char *arg) +{ + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + num_daemons = atoi(arg); + if (num_daemons > server_limit) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: NumServers of %d exceeds ServerLimit value " + "of %d servers,", num_daemons, server_limit); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " lowering NumServers to %d. To increase, please " + "see the", server_limit); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " ServerLimit directive."); + num_daemons = server_limit; + } + else if (num_daemons < 1) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: Require NumServers > 0, setting to 1"); + num_daemons = 1; + } + return NULL; +} + +static const char *set_threads_to_start(cmd_parms *cmd, void *dummy, + const char *arg) +{ + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + threads_to_start = atoi(arg); + if (threads_to_start > thread_limit) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: StartThreads of %d exceeds ThreadLimit value" + " of %d threads,", threads_to_start, + thread_limit); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " lowering StartThreads to %d. To increase, please" + " see the", thread_limit); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " ThreadLimit directive."); + } + else if (threads_to_start < 1) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: Require StartThreads > 0, setting to 1"); + threads_to_start = 1; + } + return NULL; +} + +static const char *set_min_spare_threads(cmd_parms *cmd, void *dummy, + const char *arg) +{ + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + min_spare_threads = atoi(arg); + if (min_spare_threads <= 0) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: detected MinSpareThreads set to non-positive."); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "Resetting to 1 to avoid almost certain Apache failure."); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "Please read the documentation."); + min_spare_threads = 1; + } + + return NULL; +} + +static const char *set_max_spare_threads(cmd_parms *cmd, void *dummy, + const char *arg) +{ + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + max_spare_threads = atoi(arg); + if (max_spare_threads >= thread_limit) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: detected MinSpareThreads set higher than"); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "ThreadLimit. Resetting to %d", thread_limit); + max_spare_threads = thread_limit; + } + return NULL; +} + +static const char *set_max_threads(cmd_parms *cmd, void *dummy, const char *arg) +{ + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + max_threads = atoi(arg); + if (max_threads > thread_limit) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: detected MaxThreadsPerChild set higher than"); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "ThreadLimit. Resetting to %d", thread_limit); + max_threads = thread_limit; + } + return NULL; +} + +static const char *set_child_per_uid(cmd_parms *cmd, void *dummy, const char *u, + const char *g, const char *num) +{ + int i; + int max_this_time = atoi(num) + curr_child_num; + + + for (i = curr_child_num; i < max_this_time; i++, curr_child_num++) { + if (i > num_daemons) { + return "Trying to use more child ID's than NumServers. Increase " + "NumServers in your config file."; + } + + child_info_table[i].uid = ap_uname2id(u); + child_info_table[i].gid = ap_gname2id(g); + +#ifndef BIG_SECURITY_HOLE + if (child_info_table[i].uid == 0 || child_info_table[i].gid == 0) { + return "Assigning root user/group to a child."; + } +#endif + } + return NULL; +} + +static const char *assign_childuid(cmd_parms *cmd, void *dummy, const char *uid, + const char *gid) +{ + int i; + int matching = 0; + int u = ap_uname2id(uid); + int g = ap_gname2id(gid); + const char *errstr; + int socks[2]; + perchild_server_conf *sconf = (perchild_server_conf *) + ap_get_module_config(cmd->server->module_config, + &mpm_perchild_module); + + sconf->fullsockname = apr_pstrcat(cmd->pool, sconf->sockname, ".", uid, + ":", gid, NULL); + + if ((errstr = make_perchild_socket(sconf->fullsockname, socks))) { + return errstr; + } + + sconf->input = socks[0]; + sconf->output = socks[1]; + + for (i = 0; i < num_daemons; i++) { + if (u == child_info_table[i].uid && g == child_info_table[i].gid) { + child_info_table[i].input = sconf->input; + child_info_table[i].output = sconf->output; + matching++; + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, cmd->server, + "filling out child_info_table; UID: %d, GID: %d, " + "SD: %d %d, OUTPUT: %d %d, Child Num: %d", + child_info_table[i].uid, child_info_table[i].gid, + sconf->input, child_info_table[i].input, sconf->output, + child_info_table[i].output, i); + } + } + + if (!matching) { + return "Unable to find process with matching uid/gid."; + } + return NULL; +} + +static const char *set_server_limit (cmd_parms *cmd, void *dummy, const char *arg) +{ + int tmp_server_limit; + + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + tmp_server_limit = atoi(arg); + /* you cannot change ServerLimit across a restart; ignore + * any such attempts + */ + if (first_server_limit && + tmp_server_limit != server_limit) { + /* how do we log a message? the error log is a bit bucket at this + * point; we'll just have to set a flag so that ap_mpm_run() + * logs a warning later + */ + changed_limit_at_restart = 1; + return NULL; + } + server_limit = tmp_server_limit; + + if (server_limit > MAX_SERVER_LIMIT) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: ServerLimit of %d exceeds compile time limit " + "of %d servers,", server_limit, MAX_SERVER_LIMIT); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " lowering ServerLimit to %d.", MAX_SERVER_LIMIT); + server_limit = MAX_SERVER_LIMIT; + } + else if (server_limit < 1) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: Require ServerLimit > 0, setting to 1"); + server_limit = 1; + } + return NULL; +} + +static const char *set_thread_limit (cmd_parms *cmd, void *dummy, const char *arg) +{ + int tmp_thread_limit; + + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + tmp_thread_limit = atoi(arg); + /* you cannot change ThreadLimit across a restart; ignore + * any such attempts + */ + if (first_thread_limit && + tmp_thread_limit != thread_limit) { + /* how do we log a message? the error log is a bit bucket at this + * point; we'll just have to set a flag so that ap_mpm_run() + * logs a warning later + */ + changed_limit_at_restart = 1; + return NULL; + } + thread_limit = tmp_thread_limit; + + if (thread_limit > MAX_THREAD_LIMIT) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: ThreadLimit of %d exceeds compile time limit " + "of %d servers,", thread_limit, MAX_THREAD_LIMIT); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " lowering ThreadLimit to %d.", MAX_THREAD_LIMIT); + thread_limit = MAX_THREAD_LIMIT; + } + else if (thread_limit < 1) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: Require ThreadLimit > 0, setting to 1"); + thread_limit = 1; + } + return NULL; +} + +static const command_rec perchild_cmds[] = { +UNIX_DAEMON_COMMANDS, +LISTEN_COMMANDS, +AP_INIT_TAKE1("NumServers", set_num_daemons, NULL, RSRC_CONF, + "Number of children alive at the same time"), +AP_INIT_TAKE1("StartThreads", set_threads_to_start, NULL, RSRC_CONF, + "Number of threads each child creates"), +AP_INIT_TAKE1("MinSpareThreads", set_min_spare_threads, NULL, RSRC_CONF, + "Minimum number of idle threads per child, to handle " + "request spikes"), +AP_INIT_TAKE1("MaxSpareThreads", set_max_spare_threads, NULL, RSRC_CONF, + "Maximum number of idle threads per child"), +AP_INIT_TAKE1("MaxThreadsPerChild", set_max_threads, NULL, RSRC_CONF, + "Maximum number of threads per child"), +AP_INIT_TAKE3("ChildperUserID", set_child_per_uid, NULL, RSRC_CONF, + "Specify a User and Group for a specific child process."), +AP_INIT_TAKE2("AssignUserID", assign_childuid, NULL, RSRC_CONF, + "Tie a virtual host to a specific child process."), +AP_INIT_TAKE1("ServerLimit", set_server_limit, NULL, RSRC_CONF, + "Maximum value of NumServers for this run of Apache"), +AP_INIT_TAKE1("ThreadLimit", set_thread_limit, NULL, RSRC_CONF, + "Maximum worker threads in a server for this run of Apache"), +{ NULL } +}; + +static void *perchild_create_config(apr_pool_t *p, server_rec *s) +{ + perchild_server_conf *c = (perchild_server_conf *) + apr_pcalloc(p, sizeof(perchild_server_conf)); + + c->input = -1; + c->output = -1; + return c; +} + +module AP_MODULE_DECLARE_DATA mpm_perchild_module = { + MPM20_MODULE_STUFF, + ap_mpm_rewrite_args, /* hook to run before apache parses args */ + NULL, /* create per-directory config structure */ + NULL, /* merge per-directory config structures */ + perchild_create_config, /* create per-server config structure */ + NULL, /* merge per-server config structures */ + perchild_cmds, /* command apr_table_t */ + perchild_hooks /* register_hooks */ +}; + diff --git a/rubbos/app/httpd-2.0.64/server/mpm/experimental/threadpool/Makefile.in b/rubbos/app/httpd-2.0.64/server/mpm/experimental/threadpool/Makefile.in new file mode 100644 index 00000000..ea0acb69 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/experimental/threadpool/Makefile.in @@ -0,0 +1,5 @@ + +LTLIBRARY_NAME = libthreadpool.la +LTLIBRARY_SOURCES = threadpool.c pod.c + +include $(top_srcdir)/build/ltlib.mk diff --git a/rubbos/app/httpd-2.0.64/server/mpm/experimental/threadpool/README b/rubbos/app/httpd-2.0.64/server/mpm/experimental/threadpool/README new file mode 100644 index 00000000..86e8524c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/experimental/threadpool/README @@ -0,0 +1,12 @@ +Threadpool MPM: +This is an experimental variant of the standard worker MPM. +Rather than queuing connections like the worker MPM, the threadpool +MPM queues idle worker threads and hands each accepted connection +to the next available worker. + +The threadpool MPM can't match the performance of the worker MPM +in benchmark testing. As of 2.0.39, some of the key load-throtting +concepts from the threadpool MPM have been incorporated into the +worker MPM. The threadpool code is useful primarily as a research +platform; for general-purpose use, and for any production environments, +use worker instead. diff --git a/rubbos/app/httpd-2.0.64/server/mpm/experimental/threadpool/config5.m4 b/rubbos/app/httpd-2.0.64/server/mpm/experimental/threadpool/config5.m4 new file mode 100644 index 00000000..667b534a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/experimental/threadpool/config5.m4 @@ -0,0 +1,6 @@ +dnl ## XXX - Need a more thorough check of the proper flags to use + +if test "$MPM_NAME" = "threadpool" ; then + AC_CHECK_FUNCS(pthread_kill) + APACHE_FAST_OUTPUT(server/mpm/$MPM_SUBDIR_NAME/Makefile) +fi diff --git a/rubbos/app/httpd-2.0.64/server/mpm/experimental/threadpool/mpm.h b/rubbos/app/httpd-2.0.64/server/mpm/experimental/threadpool/mpm.h new file mode 100644 index 00000000..222040bd --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/experimental/threadpool/mpm.h @@ -0,0 +1,50 @@ +/* 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. + */ + +#include "scoreboard.h" +#include "unixd.h" + +#ifndef APACHE_MPM_THREADPOOL_H +#define APACHE_MPM_THREADPOOL_H + +#define THREADPOOL_MPM + +#define MPM_NAME "ThreadPool" + +#define AP_MPM_WANT_RECLAIM_CHILD_PROCESSES +#define AP_MPM_WANT_WAIT_OR_TIMEOUT +#define AP_MPM_WANT_PROCESS_CHILD_STATUS +#define AP_MPM_WANT_SET_PIDFILE +#define AP_MPM_WANT_SET_SCOREBOARD +#define AP_MPM_WANT_SET_LOCKFILE +#define AP_MPM_WANT_SET_MAX_REQUESTS +#define AP_MPM_WANT_SET_COREDUMPDIR +#define AP_MPM_WANT_SET_ACCEPT_LOCK_MECH +#define AP_MPM_WANT_SIGNAL_SERVER +#define AP_MPM_WANT_SET_MAX_MEM_FREE +#define AP_MPM_WANT_FATAL_SIGNAL_HANDLER +#define AP_MPM_DISABLE_NAGLE_ACCEPTED_SOCK + +#define MPM_CHILD_PID(i) (ap_scoreboard_image->parent[i].pid) +#define MPM_NOTE_CHILD_KILLED(i) (MPM_CHILD_PID(i) = 0) +#define MPM_ACCEPT_FUNC unixd_accept + +extern int ap_threads_per_child; +extern int ap_max_daemons_limit; +extern server_rec *ap_server_conf; +extern char ap_coredump_dir[MAX_STRING_LEN]; + +#endif /* APACHE_MPM_THREADPOOL_H */ diff --git a/rubbos/app/httpd-2.0.64/server/mpm/experimental/threadpool/mpm_default.h b/rubbos/app/httpd-2.0.64/server/mpm/experimental/threadpool/mpm_default.h new file mode 100644 index 00000000..d5a33989 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/experimental/threadpool/mpm_default.h @@ -0,0 +1,69 @@ +/* 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. + */ + +#ifndef APACHE_MPM_DEFAULT_H +#define APACHE_MPM_DEFAULT_H + +/* Number of servers to spawn off by default --- also, if fewer than + * this free when the caretaker checks, it will spawn more. + */ +#ifndef DEFAULT_START_DAEMON +#define DEFAULT_START_DAEMON 3 +#endif + +/* Maximum number of *free* server processes --- more than this, and + * they will die off. + */ + +#ifndef DEFAULT_MAX_FREE_DAEMON +#define DEFAULT_MAX_FREE_DAEMON 10 +#endif + +/* Minimum --- fewer than this, and more will be created */ + +#ifndef DEFAULT_MIN_FREE_DAEMON +#define DEFAULT_MIN_FREE_DAEMON 3 +#endif + +#ifndef DEFAULT_THREADS_PER_CHILD +#define DEFAULT_THREADS_PER_CHILD 25 +#endif + +/* File used for accept locking, when we use a file */ +#ifndef DEFAULT_LOCKFILE +#define DEFAULT_LOCKFILE DEFAULT_REL_RUNTIMEDIR "/accept.lock" +#endif + +/* Where the main/parent process's pid is logged */ +#ifndef DEFAULT_PIDLOG +#define DEFAULT_PIDLOG DEFAULT_REL_RUNTIMEDIR "/httpd.pid" +#endif + +/* + * Interval, in microseconds, between scoreboard maintenance. + */ +#ifndef SCOREBOARD_MAINTENANCE_INTERVAL +#define SCOREBOARD_MAINTENANCE_INTERVAL 1000000 +#endif + +/* Number of requests to try to handle in a single process. If <= 0, + * the children don't die off. + */ +#ifndef DEFAULT_MAX_REQUESTS_PER_CHILD +#define DEFAULT_MAX_REQUESTS_PER_CHILD 10000 +#endif + +#endif /* AP_MPM_DEFAULT_H */ diff --git a/rubbos/app/httpd-2.0.64/server/mpm/experimental/threadpool/pod.c b/rubbos/app/httpd-2.0.64/server/mpm/experimental/threadpool/pod.c new file mode 100644 index 00000000..2f26130c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/experimental/threadpool/pod.c @@ -0,0 +1,108 @@ +/* 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. + */ + +#include "pod.h" + +#if APR_HAVE_UNISTD_H +#include +#endif + +AP_DECLARE(apr_status_t) ap_mpm_pod_open(apr_pool_t *p, ap_pod_t **pod) +{ + apr_status_t rv; + + *pod = apr_palloc(p, sizeof(**pod)); + rv = apr_file_pipe_create(&((*pod)->pod_in), &((*pod)->pod_out), p); + if (rv != APR_SUCCESS) { + return rv; + } +/* + apr_file_pipe_timeout_set((*pod)->pod_in, 0); +*/ + (*pod)->p = p; + + return APR_SUCCESS; +} + +AP_DECLARE(int) ap_mpm_pod_check(ap_pod_t *pod) +{ + char c; + apr_os_file_t fd; + int rc; + + /* we need to surface EINTR so we'll have to grab the + * native file descriptor and do the OS read() ourselves + */ + apr_os_file_get(&fd, pod->pod_in); + rc = read(fd, &c, 1); + if (rc == 1) { + switch(c) { + case RESTART_CHAR: + return AP_RESTART; + case GRACEFUL_CHAR: + return AP_GRACEFUL; + } + } + return AP_NORESTART; +} + +AP_DECLARE(apr_status_t) ap_mpm_pod_close(ap_pod_t *pod) +{ + apr_status_t rv; + + rv = apr_file_close(pod->pod_out); + if (rv != APR_SUCCESS) { + return rv; + } + + rv = apr_file_close(pod->pod_in); + if (rv != APR_SUCCESS) { + return rv; + } + return rv; +} + +static apr_status_t pod_signal_internal(ap_pod_t *pod, int graceful) +{ + apr_status_t rv; + char char_of_death = graceful ? GRACEFUL_CHAR : RESTART_CHAR; + apr_size_t one = 1; + + do { + rv = apr_file_write(pod->pod_out, &char_of_death, &one); + } while (APR_STATUS_IS_EINTR(rv)); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_WARNING, rv, ap_server_conf, + "write pipe_of_death"); + } + return rv; +} + +AP_DECLARE(apr_status_t) ap_mpm_pod_signal(ap_pod_t *pod, int graceful) +{ + return pod_signal_internal(pod, graceful); +} + +AP_DECLARE(void) ap_mpm_pod_killpg(ap_pod_t *pod, int num, int graceful) +{ + int i; + apr_status_t rv = APR_SUCCESS; + + for (i = 0; i < num && rv == APR_SUCCESS; i++) { + rv = pod_signal_internal(pod, graceful); + } +} + diff --git a/rubbos/app/httpd-2.0.64/server/mpm/experimental/threadpool/pod.h b/rubbos/app/httpd-2.0.64/server/mpm/experimental/threadpool/pod.h new file mode 100644 index 00000000..21651e6f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/experimental/threadpool/pod.h @@ -0,0 +1,50 @@ +/* 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. + */ + +#include "apr.h" +#include "apr_strings.h" +#define APR_WANT_STRFUNC +#include "apr_want.h" + +#include "httpd.h" +#include "http_config.h" +#include "http_log.h" +#include "http_main.h" +#include "mpm.h" +#include "mpm_common.h" +#include "ap_mpm.h" +#include "ap_listen.h" +#include "mpm_default.h" + +#define RESTART_CHAR '$' +#define GRACEFUL_CHAR '!' + +#define AP_RESTART 0 +#define AP_GRACEFUL 1 + +typedef struct ap_pod_t ap_pod_t; + +struct ap_pod_t { + apr_file_t *pod_in; + apr_file_t *pod_out; + apr_pool_t *p; +}; + +AP_DECLARE(apr_status_t) ap_mpm_pod_open(apr_pool_t *p, ap_pod_t **pod); +AP_DECLARE(int) ap_mpm_pod_check(ap_pod_t *pod); +AP_DECLARE(apr_status_t) ap_mpm_pod_close(ap_pod_t *pod); +AP_DECLARE(apr_status_t) ap_mpm_pod_signal(ap_pod_t *pod, int graceful); +AP_DECLARE(void) ap_mpm_pod_killpg(ap_pod_t *pod, int num, int graceful); diff --git a/rubbos/app/httpd-2.0.64/server/mpm/experimental/threadpool/threadpool.c b/rubbos/app/httpd-2.0.64/server/mpm/experimental/threadpool/threadpool.c new file mode 100644 index 00000000..50de500e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/experimental/threadpool/threadpool.c @@ -0,0 +1,2229 @@ +/* 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 purpose of this MPM is to fix the design flaws in the threaded + * model. Because of the way that pthreads and mutex locks interact, + * it is basically impossible to cleanly gracefully shutdown a child + * process if multiple threads are all blocked in accept. This model + * fixes those problems. + */ + +#include "apr.h" +#include "apr_portable.h" +#include "apr_strings.h" +#include "apr_file_io.h" +#include "apr_thread_proc.h" +#include "apr_signal.h" +#include "apr_poll.h" +#include "apr_thread_mutex.h" +#include "apr_thread_cond.h" +#include "apr_proc_mutex.h" +#define APR_WANT_STRFUNC +#include "apr_want.h" + +#if APR_HAVE_UNISTD_H +#include +#endif +#if APR_HAVE_SYS_SOCKET_H +#include +#endif +#if APR_HAVE_SYS_WAIT_H +#include +#endif +#ifdef HAVE_SYS_PROCESSOR_H +#include /* for bindprocessor() */ +#endif + +#if !APR_HAS_THREADS +#error The Worker MPM requires APR threads, but they are unavailable. +#endif + +#define CORE_PRIVATE + +#include "ap_config.h" +#include "httpd.h" +#include "http_main.h" +#include "http_log.h" +#include "http_config.h" /* for read_config */ +#include "http_core.h" /* for get_remote_host */ +#include "http_connection.h" +#include "ap_mpm.h" +#include "pod.h" +#include "mpm_common.h" +#include "ap_listen.h" +#include "scoreboard.h" +#include "mpm_default.h" + +#include +#include /* for INT_MAX */ + +/* Limit on the total --- clients will be locked out if more servers than + * this are needed. It is intended solely to keep the server from crashing + * when things get out of hand. + * + * We keep a hard maximum number of servers, for two reasons --- first off, + * in case something goes seriously wrong, we want to stop the fork bomb + * short of actually crashing the machine we're running on by filling some + * kernel table. Secondly, it keeps the size of the scoreboard file small + * enough that we can read the whole thing without worrying too much about + * the overhead. + */ +#ifndef DEFAULT_SERVER_LIMIT +#define DEFAULT_SERVER_LIMIT 16 +#endif + +/* Admin can't tune ServerLimit beyond MAX_SERVER_LIMIT. We want + * some sort of compile-time limit to help catch typos. + */ +#ifndef MAX_SERVER_LIMIT +#define MAX_SERVER_LIMIT 20000 +#endif + +/* Limit on the threads per process. Clients will be locked out if more than + * this * server_limit are needed. + * + * We keep this for one reason it keeps the size of the scoreboard file small + * enough that we can read the whole thing without worrying too much about + * the overhead. + */ +#ifndef DEFAULT_THREAD_LIMIT +#define DEFAULT_THREAD_LIMIT 64 +#endif + +/* Admin can't tune ThreadLimit beyond MAX_THREAD_LIMIT. We want + * some sort of compile-time limit to help catch typos. + */ +#ifndef MAX_THREAD_LIMIT +#define MAX_THREAD_LIMIT 20000 +#endif + +/* + * Actual definitions of config globals + */ + +int ap_threads_per_child = 0; /* Worker threads per child */ +static int ap_daemons_to_start = 0; +static int min_spare_threads = 0; +static int max_spare_threads = 0; +static int ap_daemons_limit = 0; +static int server_limit = DEFAULT_SERVER_LIMIT; +static int first_server_limit; +static int thread_limit = DEFAULT_THREAD_LIMIT; +static int first_thread_limit; +static int changed_limit_at_restart; +static int dying = 0; +static int workers_may_exit = 0; +static int start_thread_may_exit = 0; +static int listener_may_exit = 0; +static int requests_this_child; +static int num_listensocks = 0; +static int resource_shortage = 0; +static int mpm_state = AP_MPMQ_STARTING; + +/* The structure used to pass unique initialization info to each thread */ +typedef struct { + int pid; + int tid; + int sd; +} proc_info; + +/* Structure used to pass information to the thread responsible for + * creating the rest of the threads. + */ +typedef struct { + apr_thread_t **threads; + apr_thread_t *listener; + int child_num_arg; + apr_threadattr_t *threadattr; +} thread_starter; + +#define ID_FROM_CHILD_THREAD(c, t) ((c * thread_limit) + t) + +/* + * The max child slot ever assigned, preserved across restarts. Necessary + * to deal with MaxClients changes across AP_SIG_GRACEFUL restarts. We + * use this value to optimize routines that have to scan the entire + * scoreboard. + */ +int ap_max_daemons_limit = -1; + +static ap_pod_t *pod; + +/* *Non*-shared http_main globals... */ + +server_rec *ap_server_conf; + +/* The worker MPM respects a couple of runtime flags that can aid + * in debugging. Setting the -DNO_DETACH flag will prevent the root process + * from detaching from its controlling terminal. Additionally, setting + * the -DONE_PROCESS flag (which implies -DNO_DETACH) will get you the + * child_main loop running in the process which originally started up. + * This gives you a pretty nice debugging environment. (You'll get a SIGHUP + * early in standalone_main; just continue through. This is the server + * trying to kill off any child processes which it might have lying + * around --- Apache doesn't keep track of their pids, it just sends + * SIGHUP to the process group, ignoring it in the root process. + * Continue through and you'll be fine.). + */ + +static int one_process = 0; + +#ifdef DEBUG_SIGSTOP +int raise_sigstop_flags; +#endif + +static apr_pool_t *pconf; /* Pool for config stuff */ +static apr_pool_t *pchild; /* Pool for httpd child stuff */ + +static pid_t ap_my_pid; /* Linux getpid() doesn't work except in main + thread. Use this instead */ +static pid_t parent_pid; +static apr_os_thread_t *listener_os_thread; + +/* Locks for accept serialization */ +static apr_proc_mutex_t *accept_mutex; + +#if APR_O_NONBLOCK_INHERITED +#undef SINGLE_LISTEN_UNSERIALIZED_ACCEPT +#endif /* APR_O_NONBLOCK_INHERITED */ + +#ifdef SINGLE_LISTEN_UNSERIALIZED_ACCEPT +#define SAFE_ACCEPT(stmt) (ap_listeners->next ? (stmt) : APR_SUCCESS) +#else +#define SAFE_ACCEPT(stmt) (stmt) +#endif + +/* The LISTENER_SIGNAL signal will be sent from the main thread to the + * listener thread to wake it up for graceful termination (what a child + * process from an old generation does when the admin does "apachectl + * graceful"). This signal will be blocked in all threads of a child + * process except for the listener thread. + */ +#define LISTENER_SIGNAL SIGHUP + + +/* Possible states of a worker thread. */ +typedef enum { + WORKER_IDLE, + WORKER_BUSY, + WORKER_TERMINATED +} worker_state_e; + +/* Structure used to wake up an idle worker thread + */ +typedef struct { + apr_pool_t *pool; + apr_socket_t *csd; + worker_state_e state; + apr_thread_cond_t *cond; + apr_thread_mutex_t *mutex; +} worker_wakeup_info; + +/* Structure used to hold a stack of idle worker threads + */ +typedef struct { + apr_thread_mutex_t *mutex; + apr_thread_cond_t *cond; + worker_wakeup_info **stack; + apr_size_t nelts; + apr_size_t nalloc; + int terminated; +} worker_stack; + +static worker_stack* worker_stack_create(apr_pool_t *pool, apr_size_t max) +{ + apr_status_t rv; + worker_stack *stack = (worker_stack *)apr_palloc(pool, sizeof(*stack)); + + if ((rv = apr_thread_mutex_create(&stack->mutex, APR_THREAD_MUTEX_DEFAULT, + pool)) != APR_SUCCESS) { + return NULL; + } + if ((rv = apr_thread_cond_create(&stack->cond, pool)) != APR_SUCCESS) { + return NULL; + } + stack->nelts = 0; + stack->nalloc = max; + stack->stack = + (worker_wakeup_info **)apr_palloc(pool, stack->nalloc * + sizeof(worker_wakeup_info *)); + stack->terminated = 0; + return stack; +} + +static apr_status_t worker_stack_wait(worker_stack *stack, + worker_wakeup_info *wakeup) +{ + apr_status_t rv; + + wakeup->state = WORKER_IDLE; + + if ((rv = apr_thread_mutex_lock(stack->mutex)) != APR_SUCCESS) { + return rv; + } + if (stack->terminated) { + if ((rv = apr_thread_mutex_unlock(stack->mutex)) != APR_SUCCESS) { + return rv; + } + return APR_EOF; + } + if (stack->nelts == stack->nalloc) { + if ((rv = apr_thread_mutex_unlock(stack->mutex)) != APR_SUCCESS) { + return rv; + } + return APR_ENOSPC; + } + stack->stack[stack->nelts] = wakeup; + /* Signal a blocking listener thread only if we just made the + * stack non-empty. */ + if (stack->nelts++ == 0) { + (void)apr_thread_cond_signal(stack->cond); + } + if ((rv = apr_thread_mutex_unlock(stack->mutex)) != APR_SUCCESS) { + return rv; + } + + /* At this point we've already added this worker to the stack, now + * we just wait until the listener has accept()ed a connection + * for us. */ + if ((rv = apr_thread_mutex_lock(wakeup->mutex)) != APR_SUCCESS) { + return rv; + } + while (wakeup->state == WORKER_IDLE) { + if ((rv = apr_thread_cond_wait(wakeup->cond, wakeup->mutex)) != + APR_SUCCESS) { + return rv; + } + } + if ((rv = apr_thread_mutex_unlock(wakeup->mutex)) != APR_SUCCESS) { + return rv; + } + return APR_SUCCESS; +} + +static apr_status_t worker_stack_pop(worker_stack *stack, + worker_wakeup_info **worker) +{ + apr_status_t rv; + if ((rv = apr_thread_mutex_lock(stack->mutex)) != APR_SUCCESS) { + return rv; + } + AP_DEBUG_ASSERT(stack->nelts >= 0); + while ((stack->nelts == 0) && (!stack->terminated)) { + rv = apr_thread_cond_wait(stack->cond, stack->mutex); + if (rv != APR_SUCCESS) { + apr_status_t rv2; + rv2 = apr_thread_mutex_unlock(stack->mutex); + if (rv2 != APR_SUCCESS) { + return rv2; + } + return rv; + } + } + if (stack->terminated) { + if ((rv = apr_thread_mutex_unlock(stack->mutex)) != APR_SUCCESS) { + return rv; + } + return APR_EOF; + } + *worker = stack->stack[--stack->nelts]; + if ((rv = apr_thread_mutex_unlock(stack->mutex)) != APR_SUCCESS) { + return rv; + } + return APR_SUCCESS; +} + +static apr_status_t worker_stack_terminate(worker_stack *stack) +{ + apr_status_t rv; + worker_wakeup_info *worker; + + if ((rv = apr_thread_mutex_lock(stack->mutex)) != APR_SUCCESS) { + return rv; + } + stack->terminated = 1; + /* Wake up the listener thread. Although there will never be + * more than one thread blocking on this condition, broadcast + * just in case. */ + apr_thread_cond_broadcast(stack->cond); + while (stack->nelts) { + worker = stack->stack[--stack->nelts]; + apr_thread_mutex_lock(worker->mutex); + worker->csd = 0; + worker->state = WORKER_TERMINATED; + apr_thread_cond_signal(worker->cond); + apr_thread_mutex_unlock(worker->mutex); + } + if ((rv = apr_thread_mutex_unlock(stack->mutex)) != APR_SUCCESS) { + return rv; + } + return APR_SUCCESS; +} + +static worker_stack *idle_worker_stack; + +static void wakeup_listener(void) +{ + apr_status_t rv; + + listener_may_exit = 1; + if (!idle_worker_stack) { + return; + } + if ((rv = apr_thread_mutex_lock(idle_worker_stack->mutex)) != APR_SUCCESS) { + return; + } + if ((rv = apr_thread_cond_signal(idle_worker_stack->cond)) != + APR_SUCCESS) { + return; + } + if ((rv = apr_thread_mutex_unlock(idle_worker_stack->mutex)) != APR_SUCCESS) { + return; + } + if (!listener_os_thread) { + /* XXX there is an obscure path that this doesn't handle perfectly: + * right after listener thread is created but before + * listener_os_thread is set, the first worker thread hits an + * error and starts graceful termination + */ + return; + } + /* + * we should just be able to "kill(ap_my_pid, LISTENER_SIGNAL)" on all + * platforms and wake up the listener thread since it is the only thread + * with SIGHUP unblocked, but that doesn't work on Linux + */ +#ifdef HAVE_PTHREAD_KILL + pthread_kill(*listener_os_thread, LISTENER_SIGNAL); +#else + kill(ap_my_pid, LISTENER_SIGNAL); +#endif +} + +#define ST_INIT 0 +#define ST_GRACEFUL 1 +#define ST_UNGRACEFUL 2 + +static int terminate_mode = ST_INIT; + +static void signal_threads(int mode) +{ + if (terminate_mode == mode) { + return; + } + terminate_mode = mode; + mpm_state = AP_MPMQ_STOPPING; + + /* in case we weren't called from the listener thread, wake up the + * listener thread + */ + wakeup_listener(); + + /* for ungraceful termination, let the workers exit now; + * for graceful termination, the listener thread will notify the + * workers to exit once it has stopped accepting new connections + */ + if (mode == ST_UNGRACEFUL) { + workers_may_exit = 1; + worker_stack_terminate(idle_worker_stack); + } +} + +AP_DECLARE(apr_status_t) ap_mpm_query(int query_code, int *result) +{ + switch(query_code){ + case AP_MPMQ_MAX_DAEMON_USED: + *result = ap_max_daemons_limit; + return APR_SUCCESS; + case AP_MPMQ_IS_THREADED: + *result = AP_MPMQ_STATIC; + return APR_SUCCESS; + case AP_MPMQ_IS_FORKED: + *result = AP_MPMQ_DYNAMIC; + return APR_SUCCESS; + case AP_MPMQ_HARD_LIMIT_DAEMONS: + *result = server_limit; + return APR_SUCCESS; + case AP_MPMQ_HARD_LIMIT_THREADS: + *result = thread_limit; + return APR_SUCCESS; + case AP_MPMQ_MAX_THREADS: + *result = ap_threads_per_child; + return APR_SUCCESS; + case AP_MPMQ_MIN_SPARE_DAEMONS: + *result = 0; + return APR_SUCCESS; + case AP_MPMQ_MIN_SPARE_THREADS: + *result = min_spare_threads; + return APR_SUCCESS; + case AP_MPMQ_MAX_SPARE_DAEMONS: + *result = 0; + return APR_SUCCESS; + case AP_MPMQ_MAX_SPARE_THREADS: + *result = max_spare_threads; + return APR_SUCCESS; + case AP_MPMQ_MAX_REQUESTS_DAEMON: + *result = ap_max_requests_per_child; + return APR_SUCCESS; + case AP_MPMQ_MAX_DAEMONS: + *result = ap_daemons_limit; + return APR_SUCCESS; + case AP_MPMQ_MPM_STATE: + *result = mpm_state; + return APR_SUCCESS; + } + return APR_ENOTIMPL; +} + +/* a clean exit from a child with proper cleanup */ +static void clean_child_exit(int code) __attribute__ ((noreturn)); +static void clean_child_exit(int code) +{ + mpm_state = AP_MPMQ_STOPPING; + if (pchild) { + apr_pool_destroy(pchild); + } + exit(code); +} + +static void just_die(int sig) +{ + clean_child_exit(0); +} + +/***************************************************************** + * Connection structures and accounting... + */ + +/* volatile just in case */ +static int volatile shutdown_pending; +static int volatile restart_pending; +static int volatile is_graceful; +static volatile int child_fatal; +ap_generation_t volatile ap_my_generation; + +/* + * ap_start_shutdown() and ap_start_restart(), below, are a first stab at + * functions to initiate shutdown or restart without relying on signals. + * Previously this was initiated in sig_term() and restart() signal handlers, + * but we want to be able to start a shutdown/restart from other sources -- + * e.g. on Win32, from the service manager. Now the service manager can + * call ap_start_shutdown() or ap_start_restart() as appropiate. Note that + * these functions can also be called by the child processes, since global + * variables are no longer used to pass on the required action to the parent. + * + * These should only be called from the parent process itself, since the + * parent process will use the shutdown_pending and restart_pending variables + * to determine whether to shutdown or restart. The child process should + * call signal_parent() directly to tell the parent to die -- this will + * cause neither of those variable to be set, which the parent will + * assume means something serious is wrong (which it will be, for the + * child to force an exit) and so do an exit anyway. + */ + +static void ap_start_shutdown(void) +{ + mpm_state = AP_MPMQ_STOPPING; + if (shutdown_pending == 1) { + /* Um, is this _probably_ not an error, if the user has + * tried to do a shutdown twice quickly, so we won't + * worry about reporting it. + */ + return; + } + shutdown_pending = 1; +} + +/* do a graceful restart if graceful == 1 */ +static void ap_start_restart(int graceful) +{ + mpm_state = AP_MPMQ_STOPPING; + if (restart_pending == 1) { + /* Probably not an error - don't bother reporting it */ + return; + } + restart_pending = 1; + is_graceful = graceful; +} + +static void sig_term(int sig) +{ + ap_start_shutdown(); +} + +static void restart(int sig) +{ + ap_start_restart(sig == AP_SIG_GRACEFUL); +} + +static void set_signals(void) +{ +#ifndef NO_USE_SIGACTION + struct sigaction sa; +#endif + + if (!one_process) { + ap_fatal_signal_setup(ap_server_conf, pconf); + } + +#ifndef NO_USE_SIGACTION + sigemptyset(&sa.sa_mask); + sa.sa_flags = 0; + + sa.sa_handler = sig_term; + if (sigaction(SIGTERM, &sa, NULL) < 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, + "sigaction(SIGTERM)"); +#ifdef SIGINT + if (sigaction(SIGINT, &sa, NULL) < 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, + "sigaction(SIGINT)"); +#endif +#ifdef SIGXCPU + sa.sa_handler = SIG_DFL; + if (sigaction(SIGXCPU, &sa, NULL) < 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, + "sigaction(SIGXCPU)"); +#endif +#ifdef SIGXFSZ + sa.sa_handler = SIG_DFL; + if (sigaction(SIGXFSZ, &sa, NULL) < 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, + "sigaction(SIGXFSZ)"); +#endif +#ifdef SIGPIPE + sa.sa_handler = SIG_IGN; + if (sigaction(SIGPIPE, &sa, NULL) < 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, + "sigaction(SIGPIPE)"); +#endif + + /* we want to ignore HUPs and AP_SIG_GRACEFUL while we're busy + * processing one */ + sigaddset(&sa.sa_mask, SIGHUP); + sigaddset(&sa.sa_mask, AP_SIG_GRACEFUL); + sa.sa_handler = restart; + if (sigaction(SIGHUP, &sa, NULL) < 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, + "sigaction(SIGHUP)"); + if (sigaction(AP_SIG_GRACEFUL, &sa, NULL) < 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, + "sigaction(" AP_SIG_GRACEFUL_STRING ")"); +#else + if (!one_process) { +#ifdef SIGXCPU + apr_signal(SIGXCPU, SIG_DFL); +#endif /* SIGXCPU */ +#ifdef SIGXFSZ + apr_signal(SIGXFSZ, SIG_DFL); +#endif /* SIGXFSZ */ + } + + apr_signal(SIGTERM, sig_term); +#ifdef SIGHUP + apr_signal(SIGHUP, restart); +#endif /* SIGHUP */ +#ifdef AP_SIG_GRACEFUL + apr_signal(AP_SIG_GRACEFUL, restart); +#endif /* AP_SIG_GRACEFUL */ +#ifdef SIGPIPE + apr_signal(SIGPIPE, SIG_IGN); +#endif /* SIGPIPE */ + +#endif +} + +/***************************************************************** + * Here follows a long bunch of generic server bookkeeping stuff... + */ + +int ap_graceful_stop_signalled(void) + /* XXX this is really a bad confusing obsolete name + * maybe it should be ap_mpm_process_exiting? + */ +{ + /* note: for a graceful termination, listener_may_exit will be set before + * workers_may_exit, so check listener_may_exit + */ + return listener_may_exit; +} + +/***************************************************************** + * Child process main loop. + */ + +static void process_socket(apr_pool_t *p, apr_socket_t *sock, int my_child_num, + int my_thread_num, apr_bucket_alloc_t *bucket_alloc) +{ + conn_rec *current_conn; + long conn_id = ID_FROM_CHILD_THREAD(my_child_num, my_thread_num); + int csd; + ap_sb_handle_t *sbh; + + ap_create_sb_handle(&sbh, p, my_child_num, my_thread_num); + apr_os_sock_get(&csd, sock); + + current_conn = ap_run_create_connection(p, ap_server_conf, sock, + conn_id, sbh, bucket_alloc); + if (current_conn) { + ap_process_connection(current_conn, sock); + ap_lingering_close(current_conn); + } +} + +/* requests_this_child has gone to zero or below. See if the admin coded + "MaxRequestsPerChild 0", and keep going in that case. Doing it this way + simplifies the hot path in worker_thread */ +static void check_infinite_requests(void) +{ + if (ap_max_requests_per_child) { + signal_threads(ST_GRACEFUL); + } + else { + /* wow! if you're executing this code, you may have set a record. + * either this child process has served over 2 billion requests, or + * you're running a threaded 2.0 on a 16 bit machine. + * + * I'll buy pizza and beers at Apachecon for the first person to do + * the former without cheating (dorking with INT_MAX, or running with + * uncommitted performance patches, for example). + * + * for the latter case, you probably deserve a beer too. Greg Ames + */ + + requests_this_child = INT_MAX; /* keep going */ + } +} + +static void unblock_signal(int sig) +{ + sigset_t sig_mask; + + sigemptyset(&sig_mask); + sigaddset(&sig_mask, sig); +#if defined(SIGPROCMASK_SETS_THREAD_MASK) + sigprocmask(SIG_UNBLOCK, &sig_mask, NULL); +#else + pthread_sigmask(SIG_UNBLOCK, &sig_mask, NULL); +#endif +} + +static void dummy_signal_handler(int sig) +{ + /* XXX If specifying SIG_IGN is guaranteed to unblock a syscall, + * then we don't need this goofy function. + */ +} + +static void *listener_thread(apr_thread_t *thd, void * dummy) +{ + proc_info * ti = dummy; + int process_slot = ti->pid; + apr_pool_t *tpool = apr_thread_pool_get(thd); + void *csd = NULL; + apr_pool_t *ptrans; /* Pool for per-transaction stuff */ + int n; + apr_pollfd_t *pollset; + apr_status_t rv; + ap_listen_rec *lr, *last_lr = ap_listeners; + worker_wakeup_info *worker = NULL; + + free(ti); + + apr_poll_setup(&pollset, num_listensocks, tpool); + for(lr = ap_listeners ; lr != NULL ; lr = lr->next) + apr_poll_socket_add(pollset, lr->sd, APR_POLLIN); + + /* Unblock the signal used to wake this thread up, and set a handler for + * it. + */ + unblock_signal(LISTENER_SIGNAL); + apr_signal(LISTENER_SIGNAL, dummy_signal_handler); + + /* TODO: Switch to a system where threads reuse the results from earlier + poll calls - manoj */ + while (1) { + /* TODO: requests_this_child should be synchronized - aaron */ + if (requests_this_child <= 0) { + check_infinite_requests(); + } + if (listener_may_exit) break; + + if (worker == NULL) { + rv = worker_stack_pop(idle_worker_stack, &worker); + if (APR_STATUS_IS_EOF(rv)) { + break; + } + else if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_CRIT, rv, ap_server_conf, + "worker_stack_pop failed"); + break; + } + ptrans = worker->pool; + } + AP_DEBUG_ASSERT(worker->state == WORKER_IDLE); + + if ((rv = SAFE_ACCEPT(apr_proc_mutex_lock(accept_mutex))) + != APR_SUCCESS) { + int level = APLOG_EMERG; + + if (listener_may_exit) { + break; + } + if (ap_scoreboard_image->parent[process_slot].generation != + ap_scoreboard_image->global->running_generation) { + level = APLOG_DEBUG; /* common to get these at restart time */ + } + ap_log_error(APLOG_MARK, level, rv, ap_server_conf, + "apr_proc_mutex_lock failed. Attempting to shutdown " + "process gracefully."); + signal_threads(ST_GRACEFUL); + break; /* skip the lock release */ + } + + if (!APR_O_NONBLOCK_INHERITED && !ap_listeners->next) { + /* Only one listener, so skip the poll */ + lr = ap_listeners; + } + else { + while (!listener_may_exit) { + apr_status_t ret; + apr_int16_t event; + + ret = apr_poll(pollset, num_listensocks, &n, -1); + if (ret != APR_SUCCESS) { + if (APR_STATUS_IS_EINTR(ret)) { + continue; + } + + /* apr_poll() will only return errors in catastrophic + * circumstances. Let's try exiting gracefully, for now. */ + ap_log_error(APLOG_MARK, APLOG_ERR, ret, (const server_rec *) + ap_server_conf, "apr_poll: (listen)"); + signal_threads(ST_GRACEFUL); + } + + if (listener_may_exit) break; + + /* find a listener */ + lr = last_lr; + do { + lr = lr->next; + if (lr == NULL) { + lr = ap_listeners; + } + /* XXX: Should we check for POLLERR? */ + apr_poll_revents_get(&event, lr->sd, pollset); + if (event & APR_POLLIN) { + last_lr = lr; + goto got_fd; + } + } while (lr != last_lr); + } + } + got_fd: + if (!listener_may_exit) { + rv = lr->accept_func(&csd, lr, ptrans); + /* later we trash rv and rely on csd to indicate success/failure */ + AP_DEBUG_ASSERT(rv == APR_SUCCESS || !csd); + + if (rv == APR_EGENERAL) { + /* E[NM]FILE, ENOMEM, etc */ + resource_shortage = 1; + signal_threads(ST_GRACEFUL); + } + if ((rv = SAFE_ACCEPT(apr_proc_mutex_unlock(accept_mutex))) + != APR_SUCCESS) { + int level = APLOG_EMERG; + + if (listener_may_exit) { + break; + } + if (ap_scoreboard_image->parent[process_slot].generation != + ap_scoreboard_image->global->running_generation) { + level = APLOG_DEBUG; /* common to get these at restart time */ + } + ap_log_error(APLOG_MARK, level, rv, ap_server_conf, + "apr_proc_mutex_unlock failed. Attempting to " + "shutdown process gracefully."); + signal_threads(ST_GRACEFUL); + } + if (csd != NULL) { + /* Wake up the sleeping worker. */ + apr_thread_mutex_lock(worker->mutex); + worker->csd = (apr_socket_t *)csd; + worker->state = WORKER_BUSY; + /* Posix allows us to signal this condition without + * owning the associated mutex, but in that case it can + * not guarantee predictable scheduling. See + * _UNIX Network Programming: Interprocess Communication_ + * by W. Richard Stevens, Vol 2, 2nd Ed, pp. 170-171. */ + apr_thread_cond_signal(worker->cond); + apr_thread_mutex_unlock(worker->mutex); + worker = NULL; + } + } + else { + if ((rv = SAFE_ACCEPT(apr_proc_mutex_unlock(accept_mutex))) + != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_EMERG, rv, ap_server_conf, + "apr_proc_mutex_unlock failed. Attempting to " + "shutdown process gracefully."); + signal_threads(ST_GRACEFUL); + } + break; + } + } + + workers_may_exit = 1; + if (worker) { + apr_thread_mutex_lock(worker->mutex); + worker->state = WORKER_TERMINATED; + /* Posix allows us to signal this condition without + * owning the associated mutex, but in that case it can + * not guarantee predictable scheduling. See + * _UNIX Network Programming: Interprocess Communication_ + * by W. Richard Stevens, Vol 2, 2nd Ed, pp. 170-171. */ + apr_thread_cond_signal(worker->cond); + apr_thread_mutex_unlock(worker->mutex); + } + worker_stack_terminate(idle_worker_stack); + dying = 1; + ap_scoreboard_image->parent[process_slot].quiescing = 1; + + /* wake up the main thread */ + kill(ap_my_pid, SIGTERM); + + apr_thread_exit(thd, APR_SUCCESS); + return NULL; +} + +/* XXX For ungraceful termination/restart, we definitely don't want to + * wait for active connections to finish but we may want to wait + * for idle workers to get out of the queue code and release mutexes, + * since those mutexes are cleaned up pretty soon and some systems + * may not react favorably (i.e., segfault) if operations are attempted + * on cleaned-up mutexes. + */ +static void * APR_THREAD_FUNC worker_thread(apr_thread_t *thd, void * dummy) +{ + proc_info * ti = dummy; + int process_slot = ti->pid; + int thread_slot = ti->tid; + apr_bucket_alloc_t *bucket_alloc; + apr_pool_t *tpool = apr_thread_pool_get(thd); + apr_pool_t *ptrans; /* Pool for per-transaction stuff */ + apr_allocator_t *allocator; + apr_status_t rv; + worker_wakeup_info *wakeup; + + free(ti); + + ap_update_child_status_from_indexes(process_slot, thread_slot, SERVER_STARTING, NULL); + + apr_allocator_create(&allocator); + apr_allocator_max_free_set(allocator, ap_max_mem_free); + /* XXX: why is ptrans's parent not tpool? --jcw 08/2003 */ + apr_pool_create_ex(&ptrans, NULL, NULL, allocator); + apr_allocator_owner_set(allocator, ptrans); + bucket_alloc = apr_bucket_alloc_create_ex(allocator); + + wakeup = (worker_wakeup_info *)apr_palloc(tpool, sizeof(*wakeup)); + wakeup->pool = ptrans; + if ((rv = apr_thread_cond_create(&wakeup->cond, tpool)) != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_EMERG, rv, ap_server_conf, + "apr_thread_cond_create failed. Attempting to shutdown " + "process gracefully."); + signal_threads(ST_GRACEFUL); + apr_thread_exit(thd, rv); + } + if ((rv = apr_thread_mutex_create(&wakeup->mutex, APR_THREAD_MUTEX_DEFAULT, + tpool)) != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_EMERG, rv, ap_server_conf, + "apr_thread_mutex_create failed. Attempting to shutdown " + "process gracefully."); + signal_threads(ST_GRACEFUL); + apr_thread_exit(thd, rv); + } + + while (!workers_may_exit) { + ap_update_child_status_from_indexes(process_slot, thread_slot, SERVER_READY, NULL); + rv = worker_stack_wait(idle_worker_stack, wakeup); + if (APR_STATUS_IS_EOF(rv)) { + break; /* The queue has been terminated. */ + } + else if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_CRIT, rv, ap_server_conf, + "worker_stack_wait failed"); + break; /* Treat all other errors as fatal. */ + } + else if (wakeup->state == WORKER_TERMINATED) { + break; /* They told us to quit. */ + } + AP_DEBUG_ASSERT(wakeup->state != WORKER_IDLE); + process_socket(ptrans, wakeup->csd, + process_slot, thread_slot, bucket_alloc); + requests_this_child--; /* FIXME: should be synchronized - aaron */ + apr_pool_clear(ptrans); + } + + ap_update_child_status_from_indexes(process_slot, thread_slot, + (dying) ? SERVER_DEAD : SERVER_GRACEFUL, (request_rec *) NULL); + + apr_bucket_alloc_destroy(bucket_alloc); + + apr_thread_exit(thd, APR_SUCCESS); + return NULL; +} + +static int check_signal(int signum) +{ + switch (signum) { + case SIGTERM: + case SIGINT: + return 1; + } + return 0; +} + +static void create_listener_thread(thread_starter *ts) +{ + int my_child_num = ts->child_num_arg; + apr_threadattr_t *thread_attr = ts->threadattr; + proc_info *my_info; + apr_status_t rv; + + my_info = (proc_info *)malloc(sizeof(proc_info)); + my_info->pid = my_child_num; + my_info->tid = -1; /* listener thread doesn't have a thread slot */ + my_info->sd = 0; + rv = apr_thread_create(&ts->listener, thread_attr, listener_thread, + my_info, pchild); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ALERT, rv, ap_server_conf, + "apr_thread_create: unable to create listener thread"); + /* In case system resources are maxxed out, we don't want + * Apache running away with the CPU trying to fork over and + * over and over again if we exit. + * XXX Jeff doesn't see how Apache is going to try to fork again since + * the exit code is APEXIT_CHILDFATAL + */ + apr_sleep(10 * APR_USEC_PER_SEC); + clean_child_exit(APEXIT_CHILDFATAL); + } + apr_os_thread_get(&listener_os_thread, ts->listener); +} + +/* XXX under some circumstances not understood, children can get stuck + * in start_threads forever trying to take over slots which will + * never be cleaned up; for now there is an APLOG_DEBUG message issued + * every so often when this condition occurs + */ +static void * APR_THREAD_FUNC start_threads(apr_thread_t *thd, void *dummy) +{ + thread_starter *ts = dummy; + apr_thread_t **threads = ts->threads; + apr_threadattr_t *thread_attr = ts->threadattr; + int child_num_arg = ts->child_num_arg; + int my_child_num = child_num_arg; + proc_info *my_info; + apr_status_t rv; + int i; + int threads_created = 0; + int loops; + int prev_threads_created; + + idle_worker_stack = worker_stack_create(pchild, ap_threads_per_child); + if (idle_worker_stack == NULL) { + ap_log_error(APLOG_MARK, APLOG_ALERT, 0, ap_server_conf, + "worker_stack_create() failed"); + clean_child_exit(APEXIT_CHILDFATAL); + } + + loops = prev_threads_created = 0; + while (1) { + /* ap_threads_per_child does not include the listener thread */ + for (i = 0; i < ap_threads_per_child; i++) { + int status = ap_scoreboard_image->servers[child_num_arg][i].status; + + if (status != SERVER_GRACEFUL && status != SERVER_DEAD) { + continue; + } + + my_info = (proc_info *)malloc(sizeof(proc_info)); + if (my_info == NULL) { + ap_log_error(APLOG_MARK, APLOG_ALERT, errno, ap_server_conf, + "malloc: out of memory"); + clean_child_exit(APEXIT_CHILDFATAL); + } + my_info->pid = my_child_num; + my_info->tid = i; + my_info->sd = 0; + + /* We are creating threads right now */ + ap_update_child_status_from_indexes(my_child_num, i, + SERVER_STARTING, NULL); + /* We let each thread update its own scoreboard entry. This is + * done because it lets us deal with tid better. + */ + rv = apr_thread_create(&threads[i], thread_attr, + worker_thread, my_info, pchild); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ALERT, rv, ap_server_conf, + "apr_thread_create: unable to create worker thread"); + /* In case system resources are maxxed out, we don't want + Apache running away with the CPU trying to fork over and + over and over again if we exit. */ + apr_sleep(10 * APR_USEC_PER_SEC); + clean_child_exit(APEXIT_CHILDFATAL); + } + threads_created++; + if (threads_created == 1) { + /* now that we have a worker thread, it makes sense to create + * a listener thread (we don't want a listener without a worker!) + */ + create_listener_thread(ts); + } + } + if (start_thread_may_exit || threads_created == ap_threads_per_child) { + break; + } + /* wait for previous generation to clean up an entry */ + apr_sleep(1 * APR_USEC_PER_SEC); + ++loops; + if (loops % 120 == 0) { /* every couple of minutes */ + if (prev_threads_created == threads_created) { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, ap_server_conf, + "child %" APR_PID_T_FMT " isn't taking over " + "slots very quickly (%d of %d)", + ap_my_pid, threads_created, ap_threads_per_child); + } + prev_threads_created = threads_created; + } + } + + /* What state should this child_main process be listed as in the + * scoreboard...? + * ap_update_child_status_from_indexes(my_child_num, i, SERVER_STARTING, + * (request_rec *) NULL); + * + * This state should be listed separately in the scoreboard, in some kind + * of process_status, not mixed in with the worker threads' status. + * "life_status" is almost right, but it's in the worker's structure, and + * the name could be clearer. gla + */ + apr_thread_exit(thd, APR_SUCCESS); + return NULL; +} + +static void join_workers(apr_thread_t *listener, apr_thread_t **threads) +{ + int i; + apr_status_t rv, thread_rv; + + if (listener) { + int iter; + + /* deal with a rare timing window which affects waking up the + * listener thread... if the signal sent to the listener thread + * is delivered between the time it verifies that the + * listener_may_exit flag is clear and the time it enters a + * blocking syscall, the signal didn't do any good... work around + * that by sleeping briefly and sending it again + */ + + iter = 0; + while (iter < 10 && +#ifdef HAVE_PTHREAD_KILL + pthread_kill(*listener_os_thread, 0) +#else + kill(ap_my_pid, 0) +#endif + == 0) { + /* listener not dead yet */ + apr_sleep(APR_USEC_PER_SEC / 2); + wakeup_listener(); + ++iter; + } + if (iter >= 10) { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, ap_server_conf, + "the listener thread didn't exit"); + } + else { + rv = apr_thread_join(&thread_rv, listener); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_CRIT, rv, ap_server_conf, + "apr_thread_join: unable to join listener thread"); + } + } + } + + for (i = 0; i < ap_threads_per_child; i++) { + if (threads[i]) { /* if we ever created this thread */ + rv = apr_thread_join(&thread_rv, threads[i]); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_CRIT, rv, ap_server_conf, + "apr_thread_join: unable to join worker " + "thread %d", + i); + } + } + } +} + +static void join_start_thread(apr_thread_t *start_thread_id) +{ + apr_status_t rv, thread_rv; + + start_thread_may_exit = 1; /* tell it to give up in case it is still + * trying to take over slots from a + * previous generation + */ + rv = apr_thread_join(&thread_rv, start_thread_id); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_CRIT, rv, ap_server_conf, + "apr_thread_join: unable to join the start " + "thread"); + } +} + +static void child_main(int child_num_arg) +{ + apr_thread_t **threads; + apr_status_t rv; + thread_starter *ts; + apr_threadattr_t *thread_attr; + apr_thread_t *start_thread_id; + + mpm_state = AP_MPMQ_STARTING; /* for benefit of any hooks that run as this + * child initializes + */ + ap_my_pid = getpid(); + ap_fatal_signal_child_setup(ap_server_conf); + apr_pool_create(&pchild, pconf); + + /*stuff to do before we switch id's, so we have permissions.*/ + ap_reopen_scoreboard(pchild, NULL, 0); + + rv = SAFE_ACCEPT(apr_proc_mutex_child_init(&accept_mutex, ap_lock_fname, + pchild)); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_EMERG, rv, ap_server_conf, + "Couldn't initialize cross-process lock in child"); + clean_child_exit(APEXIT_CHILDFATAL); + } + + if (unixd_setup_child()) { + clean_child_exit(APEXIT_CHILDFATAL); + } + + ap_run_child_init(pchild, ap_server_conf); + + /* done with init critical section */ + + /* Just use the standard apr_setup_signal_thread to block all signals + * from being received. The child processes no longer use signals for + * any communication with the parent process. + */ + rv = apr_setup_signal_thread(); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_EMERG, rv, ap_server_conf, + "Couldn't initialize signal thread"); + clean_child_exit(APEXIT_CHILDFATAL); + } + + if (ap_max_requests_per_child) { + requests_this_child = ap_max_requests_per_child; + } + else { + /* coding a value of zero means infinity */ + requests_this_child = INT_MAX; + } + + /* Setup worker threads */ + + /* clear the storage; we may not create all our threads immediately, + * and we want a 0 entry to indicate a thread which was not created + */ + threads = (apr_thread_t **)calloc(1, + sizeof(apr_thread_t *) * ap_threads_per_child); + if (threads == NULL) { + ap_log_error(APLOG_MARK, APLOG_ALERT, errno, ap_server_conf, + "malloc: out of memory"); + clean_child_exit(APEXIT_CHILDFATAL); + } + + ts = (thread_starter *)apr_palloc(pchild, sizeof(*ts)); + + apr_threadattr_create(&thread_attr, pchild); + /* 0 means PTHREAD_CREATE_JOINABLE */ + apr_threadattr_detach_set(thread_attr, 0); + + ts->threads = threads; + ts->listener = NULL; + ts->child_num_arg = child_num_arg; + ts->threadattr = thread_attr; + + rv = apr_thread_create(&start_thread_id, thread_attr, start_threads, + ts, pchild); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ALERT, rv, ap_server_conf, + "apr_thread_create: unable to create worker thread"); + /* In case system resources are maxxed out, we don't want + Apache running away with the CPU trying to fork over and + over and over again if we exit. */ + apr_sleep(10 * APR_USEC_PER_SEC); + clean_child_exit(APEXIT_CHILDFATAL); + } + + mpm_state = AP_MPMQ_RUNNING; + + /* If we are only running in one_process mode, we will want to + * still handle signals. */ + if (one_process) { + /* Block until we get a terminating signal. */ + apr_signal_thread(check_signal); + /* make sure the start thread has finished; signal_threads() + * and join_workers() depend on that + */ + /* XXX join_start_thread() won't be awakened if one of our + * threads encounters a critical error and attempts to + * shutdown this child + */ + join_start_thread(start_thread_id); + signal_threads(ST_UNGRACEFUL); /* helps us terminate a little more + * quickly than the dispatch of the signal thread + * beats the Pipe of Death and the browsers + */ + /* A terminating signal was received. Now join each of the + * workers to clean them up. + * If the worker already exited, then the join frees + * their resources and returns. + * If the worker hasn't exited, then this blocks until + * they have (then cleans up). + */ + join_workers(ts->listener, threads); + } + else { /* !one_process */ + /* remove SIGTERM from the set of blocked signals... if one of + * the other threads in the process needs to take us down + * (e.g., for MaxRequestsPerChild) it will send us SIGTERM + */ + unblock_signal(SIGTERM); + apr_signal(SIGTERM, dummy_signal_handler); + /* Watch for any messages from the parent over the POD */ + while (1) { + rv = ap_mpm_pod_check(pod); + if (rv == AP_NORESTART) { + /* see if termination was triggered while we slept */ + switch(terminate_mode) { + case ST_GRACEFUL: + rv = AP_GRACEFUL; + break; + case ST_UNGRACEFUL: + rv = AP_RESTART; + break; + } + } + if (rv == AP_GRACEFUL || rv == AP_RESTART) { + /* make sure the start thread has finished; + * signal_threads() and join_workers depend on that + */ + join_start_thread(start_thread_id); + signal_threads(rv == AP_GRACEFUL ? ST_GRACEFUL : ST_UNGRACEFUL); + break; + } + } + + if (rv == AP_GRACEFUL) { + /* A terminating signal was received. Now join each of the + * workers to clean them up. + * If the worker already exited, then the join frees + * their resources and returns. + * If the worker hasn't exited, then this blocks until + * they have (then cleans up). + */ + join_workers(ts->listener, threads); + } + } + + free(threads); + + clean_child_exit(resource_shortage ? APEXIT_CHILDSICK : 0); +} + +static int make_child(server_rec *s, int slot) +{ + int pid; + + if (slot + 1 > ap_max_daemons_limit) { + ap_max_daemons_limit = slot + 1; + } + + if (one_process) { + set_signals(); + ap_scoreboard_image->parent[slot].pid = getpid(); + child_main(slot); + } + + if ((pid = fork()) == -1) { + ap_log_error(APLOG_MARK, APLOG_ERR, errno, s, + "fork: Unable to fork new process"); + + /* fork didn't succeed. Fix the scoreboard or else + * it will say SERVER_STARTING forever and ever + */ + ap_update_child_status_from_indexes(slot, 0, SERVER_DEAD, NULL); + + /* In case system resources are maxxed out, we don't want + Apache running away with the CPU trying to fork over and + over and over again. */ + apr_sleep(10 * APR_USEC_PER_SEC); + + return -1; + } + + if (!pid) { +#ifdef HAVE_BINDPROCESSOR + /* By default, AIX binds to a single processor. This bit unbinds + * children which will then bind to another CPU. + */ + int status = bindprocessor(BINDPROCESS, (int)getpid(), + PROCESSOR_CLASS_ANY); + if (status != OK) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, + ap_server_conf, + "processor unbind failed %d", status); +#endif + RAISE_SIGSTOP(MAKE_CHILD); + + apr_signal(SIGTERM, just_die); + child_main(slot); + + clean_child_exit(0); + } + /* else */ + ap_scoreboard_image->parent[slot].quiescing = 0; + ap_scoreboard_image->parent[slot].pid = pid; + return 0; +} + +/* start up a bunch of children */ +static void startup_children(int number_to_start) +{ + int i; + + for (i = 0; number_to_start && i < ap_daemons_limit; ++i) { + if (ap_scoreboard_image->parent[i].pid != 0) { + continue; + } + if (make_child(ap_server_conf, i) < 0) { + break; + } + --number_to_start; + } +} + + +/* + * idle_spawn_rate is the number of children that will be spawned on the + * next maintenance cycle if there aren't enough idle servers. It is + * doubled up to MAX_SPAWN_RATE, and reset only when a cycle goes by + * without the need to spawn. + */ +static int idle_spawn_rate = 1; +#ifndef MAX_SPAWN_RATE +#define MAX_SPAWN_RATE (32) +#endif +static int hold_off_on_exponential_spawning; + +static void perform_idle_server_maintenance(void) +{ + int i, j; + int idle_thread_count; + worker_score *ws; + process_score *ps; + int free_length; + int totally_free_length = 0; + int free_slots[MAX_SPAWN_RATE]; + int last_non_dead; + int total_non_dead; + + /* initialize the free_list */ + free_length = 0; + + idle_thread_count = 0; + last_non_dead = -1; + total_non_dead = 0; + + for (i = 0; i < ap_daemons_limit; ++i) { + /* Initialization to satisfy the compiler. It doesn't know + * that ap_threads_per_child is always > 0 */ + int status = SERVER_DEAD; + int any_dying_threads = 0; + int any_dead_threads = 0; + int all_dead_threads = 1; + + if (i >= ap_max_daemons_limit && totally_free_length == idle_spawn_rate) + break; + ps = &ap_scoreboard_image->parent[i]; + for (j = 0; j < ap_threads_per_child; j++) { + ws = &ap_scoreboard_image->servers[i][j]; + status = ws->status; + + /* XXX any_dying_threads is probably no longer needed GLA */ + any_dying_threads = any_dying_threads || + (status == SERVER_GRACEFUL); + any_dead_threads = any_dead_threads || (status == SERVER_DEAD); + all_dead_threads = all_dead_threads && + (status == SERVER_DEAD || + status == SERVER_GRACEFUL); + + /* We consider a starting server as idle because we started it + * at least a cycle ago, and if it still hasn't finished starting + * then we're just going to swamp things worse by forking more. + * So we hopefully won't need to fork more if we count it. + * This depends on the ordering of SERVER_READY and SERVER_STARTING. + */ + if (status <= SERVER_READY && status != SERVER_DEAD && + !ps->quiescing && + ps->generation == ap_my_generation && + /* XXX the following shouldn't be necessary if we clean up + * properly after seg faults, but we're not yet GLA + */ + ps->pid != 0) { + ++idle_thread_count; + } + } + if (any_dead_threads && totally_free_length < idle_spawn_rate + && (!ps->pid /* no process in the slot */ + || ps->quiescing)) { /* or at least one is going away */ + if (all_dead_threads) { + /* great! we prefer these, because the new process can + * start more threads sooner. So prioritize this slot + * by putting it ahead of any slots with active threads. + * + * first, make room by moving a slot that's potentially still + * in use to the end of the array + */ + free_slots[free_length] = free_slots[totally_free_length]; + free_slots[totally_free_length++] = i; + } + else { + /* slot is still in use - back of the bus + */ + free_slots[free_length] = i; + } + ++free_length; + } + /* XXX if (!ps->quiescing) is probably more reliable GLA */ + if (!any_dying_threads) { + last_non_dead = i; + ++total_non_dead; + } + } + ap_max_daemons_limit = last_non_dead + 1; + + if (idle_thread_count > max_spare_threads) { + /* Kill off one child */ + ap_mpm_pod_signal(pod, TRUE); + idle_spawn_rate = 1; + } + else if (idle_thread_count < min_spare_threads) { + /* terminate the free list */ + if (free_length == 0) { + /* only report this condition once */ + static int reported = 0; + + if (!reported) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, + ap_server_conf, + "server reached MaxClients setting, consider" + " raising the MaxClients setting"); + reported = 1; + } + idle_spawn_rate = 1; + } + else { + if (free_length > idle_spawn_rate) { + free_length = idle_spawn_rate; + } + if (idle_spawn_rate >= 8) { + ap_log_error(APLOG_MARK, APLOG_INFO, 0, + ap_server_conf, + "server seems busy, (you may need " + "to increase StartServers, ThreadsPerChild " + "or Min/MaxSpareThreads), " + "spawning %d children, there are around %d idle " + "threads, and %d total children", free_length, + idle_thread_count, total_non_dead); + } + for (i = 0; i < free_length; ++i) { + make_child(ap_server_conf, free_slots[i]); + } + /* the next time around we want to spawn twice as many if this + * wasn't good enough, but not if we've just done a graceful + */ + if (hold_off_on_exponential_spawning) { + --hold_off_on_exponential_spawning; + } + else if (idle_spawn_rate < MAX_SPAWN_RATE) { + idle_spawn_rate *= 2; + } + } + } + else { + idle_spawn_rate = 1; + } +} + +static void server_main_loop(int remaining_children_to_start) +{ + int child_slot; + apr_exit_why_e exitwhy; + int status, processed_status; + apr_proc_t pid; + int i; + + while (!restart_pending && !shutdown_pending) { + ap_wait_or_timeout(&exitwhy, &status, &pid, pconf); + + if (pid.pid != -1) { + processed_status = ap_process_child_status(&pid, exitwhy, status); + if (processed_status == APEXIT_CHILDFATAL) { + shutdown_pending = 1; + child_fatal = 1; + return; + } + /* non-fatal death... note that it's gone in the scoreboard. */ + child_slot = find_child_by_pid(&pid); + if (child_slot >= 0) { + for (i = 0; i < ap_threads_per_child; i++) + ap_update_child_status_from_indexes(child_slot, i, SERVER_DEAD, + (request_rec *) NULL); + + ap_scoreboard_image->parent[child_slot].pid = 0; + ap_scoreboard_image->parent[child_slot].quiescing = 0; + if (processed_status == APEXIT_CHILDSICK) { + /* resource shortage, minimize the fork rate */ + idle_spawn_rate = 1; + } + else if (remaining_children_to_start + && child_slot < ap_daemons_limit) { + /* we're still doing a 1-for-1 replacement of dead + * children with new children + */ + make_child(ap_server_conf, child_slot); + --remaining_children_to_start; + } +#if APR_HAS_OTHER_CHILD + } + else if (apr_proc_other_child_read(&pid, status) == 0) { + /* handled */ +#endif + } + else if (is_graceful) { + /* Great, we've probably just lost a slot in the + * scoreboard. Somehow we don't know about this child. + */ + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, + ap_server_conf, + "long lost child came home! (pid %ld)", + (long)pid.pid); + } + /* Don't perform idle maintenance when a child dies, + * only do it when there's a timeout. Remember only a + * finite number of children can die, and it's pretty + * pathological for a lot to die suddenly. + */ + continue; + } + else if (remaining_children_to_start) { + /* we hit a 1 second timeout in which none of the previous + * generation of children needed to be reaped... so assume + * they're all done, and pick up the slack if any is left. + */ + startup_children(remaining_children_to_start); + remaining_children_to_start = 0; + /* In any event we really shouldn't do the code below because + * few of the servers we just started are in the IDLE state + * yet, so we'd mistakenly create an extra server. + */ + continue; + } + + perform_idle_server_maintenance(); + } +} + +int ap_mpm_run(apr_pool_t *_pconf, apr_pool_t *plog, server_rec *s) +{ + int remaining_children_to_start; + apr_status_t rv; + + ap_log_pid(pconf, ap_pid_fname); + + first_server_limit = server_limit; + first_thread_limit = thread_limit; + if (changed_limit_at_restart) { + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s, + "WARNING: Attempt to change ServerLimit or ThreadLimit " + "ignored during restart"); + changed_limit_at_restart = 0; + } + + /* Initialize cross-process accept lock */ + ap_lock_fname = apr_psprintf(_pconf, "%s.%" APR_PID_T_FMT, + ap_server_root_relative(_pconf, ap_lock_fname), + ap_my_pid); + + rv = apr_proc_mutex_create(&accept_mutex, ap_lock_fname, + ap_accept_lock_mech, _pconf); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_EMERG, rv, s, + "Couldn't create accept lock"); + mpm_state = AP_MPMQ_STOPPING; + return 1; + } + +#if APR_USE_SYSVSEM_SERIALIZE + if (ap_accept_lock_mech == APR_LOCK_DEFAULT || + ap_accept_lock_mech == APR_LOCK_SYSVSEM) { +#else + if (ap_accept_lock_mech == APR_LOCK_SYSVSEM) { +#endif + rv = unixd_set_proc_mutex_perms(accept_mutex); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_EMERG, rv, s, + "Couldn't set permissions on cross-process lock; " + "check User and Group directives"); + mpm_state = AP_MPMQ_STOPPING; + return 1; + } + } + + if (!is_graceful) { + if (ap_run_pre_mpm(s->process->pool, SB_SHARED) != OK) { + mpm_state = AP_MPMQ_STOPPING; + return 1; + } + /* fix the generation number in the global score; we just got a new, + * cleared scoreboard + */ + ap_scoreboard_image->global->running_generation = ap_my_generation; + } + + set_signals(); + /* Don't thrash... */ + if (max_spare_threads < min_spare_threads + ap_threads_per_child) + max_spare_threads = min_spare_threads + ap_threads_per_child; + + /* If we're doing a graceful_restart then we're going to see a lot + * of children exiting immediately when we get into the main loop + * below (because we just sent them AP_SIG_GRACEFUL). This happens pretty + * rapidly... and for each one that exits we'll start a new one until + * we reach at least daemons_min_free. But we may be permitted to + * start more than that, so we'll just keep track of how many we're + * supposed to start up without the 1 second penalty between each fork. + */ + remaining_children_to_start = ap_daemons_to_start; + if (remaining_children_to_start > ap_daemons_limit) { + remaining_children_to_start = ap_daemons_limit; + } + if (!is_graceful) { + startup_children(remaining_children_to_start); + remaining_children_to_start = 0; + } + else { + /* give the system some time to recover before kicking into + * exponential mode */ + hold_off_on_exponential_spawning = 10; + } + + ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, ap_server_conf, + "%s configured -- resuming normal operations", + ap_get_server_version()); + ap_log_error(APLOG_MARK, APLOG_INFO, 0, ap_server_conf, + "Server built: %s", ap_get_server_built()); +#ifdef AP_MPM_WANT_SET_ACCEPT_LOCK_MECH + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, ap_server_conf, + "AcceptMutex: %s (default: %s)", + apr_proc_mutex_name(accept_mutex), + apr_proc_mutex_defname()); +#endif + restart_pending = shutdown_pending = 0; + mpm_state = AP_MPMQ_RUNNING; + + server_main_loop(remaining_children_to_start); + mpm_state = AP_MPMQ_STOPPING; + + if (shutdown_pending) { + /* Time to gracefully shut down: + * Kill child processes, tell them to call child_exit, etc... + * (By "gracefully" we don't mean graceful in the same sense as + * "apachectl graceful" where we allow old connections to finish.) + */ + ap_mpm_pod_killpg(pod, ap_daemons_limit, FALSE); + ap_reclaim_child_processes(1); /* Start with SIGTERM */ + + if (!child_fatal) { + /* cleanup pid file on normal shutdown */ + const char *pidfile = NULL; + pidfile = ap_server_root_relative (pconf, ap_pid_fname); + if ( pidfile != NULL && unlink(pidfile) == 0) + ap_log_error(APLOG_MARK, APLOG_INFO, 0, + ap_server_conf, + "removed PID file %s (pid=%ld)", + pidfile, (long)getpid()); + + ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, + ap_server_conf, "caught SIGTERM, shutting down"); + } + return 1; + } + + /* we've been told to restart */ + apr_signal(SIGHUP, SIG_IGN); + + if (one_process) { + /* not worth thinking about */ + return 1; + } + + /* advance to the next generation */ + /* XXX: we really need to make sure this new generation number isn't in + * use by any of the children. + */ + ++ap_my_generation; + ap_scoreboard_image->global->running_generation = ap_my_generation; + + if (is_graceful) { + ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, ap_server_conf, + AP_SIG_GRACEFUL_STRING " received. Doing graceful restart"); + /* wake up the children...time to die. But we'll have more soon */ + ap_mpm_pod_killpg(pod, ap_daemons_limit, TRUE); + + + /* This is mostly for debugging... so that we know what is still + * gracefully dealing with existing request. + */ + + } + else { + /* Kill 'em all. Since the child acts the same on the parents SIGTERM + * and a SIGHUP, we may as well use the same signal, because some user + * pthreads are stealing signals from us left and right. + */ + ap_mpm_pod_killpg(pod, ap_daemons_limit, FALSE); + + ap_reclaim_child_processes(1); /* Start with SIGTERM */ + ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, ap_server_conf, + "SIGHUP received. Attempting to restart"); + } + + return 0; +} + +/* This really should be a post_config hook, but the error log is already + * redirected by that point, so we need to do this in the open_logs phase. + */ +static int worker_open_logs(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s) +{ + apr_status_t rv; + ap_listen_rec *lr; + + pconf = p; + ap_server_conf = s; + + if ((num_listensocks = ap_setup_listeners(ap_server_conf)) < 1) { + ap_log_error(APLOG_MARK, APLOG_ALERT|APLOG_STARTUP, 0, + NULL, "no listening sockets available, shutting down"); + return DONE; + } + +#if APR_O_NONBLOCK_INHERITED + for(lr = ap_listeners ; lr != NULL ; lr = lr->next) { + apr_socket_opt_set(lr->sd, APR_SO_NONBLOCK, 1); + } +#endif /* APR_O_NONBLOCK_INHERITED */ + + if (!one_process) { + if ((rv = ap_mpm_pod_open(pconf, &pod))) { + ap_log_error(APLOG_MARK, APLOG_CRIT|APLOG_STARTUP, rv, NULL, + "Could not open pipe-of-death."); + return DONE; + } + } + return OK; +} + +static int worker_pre_config(apr_pool_t *pconf, apr_pool_t *plog, + apr_pool_t *ptemp) +{ + static int restart_num = 0; + int no_detach, debug, foreground; + ap_directive_t *pdir; + ap_directive_t *max_clients = NULL; + apr_status_t rv; + + mpm_state = AP_MPMQ_STARTING; + + /* make sure that "ThreadsPerChild" gets set before "MaxClients" */ + for (pdir = ap_conftree; pdir != NULL; pdir = pdir->next) { + if (strncasecmp(pdir->directive, "ThreadsPerChild", 15) == 0) { + if (!max_clients) { + break; /* we're in the clear, got ThreadsPerChild first */ + } + else { + /* now to swap the data */ + ap_directive_t temp; + + temp.directive = pdir->directive; + temp.args = pdir->args; + /* Make sure you don't change 'next', or you may get loops! */ + /* XXX: first_child, parent, and data can never be set + * for these directives, right? -aaron */ + temp.filename = pdir->filename; + temp.line_num = pdir->line_num; + + pdir->directive = max_clients->directive; + pdir->args = max_clients->args; + pdir->filename = max_clients->filename; + pdir->line_num = max_clients->line_num; + + max_clients->directive = temp.directive; + max_clients->args = temp.args; + max_clients->filename = temp.filename; + max_clients->line_num = temp.line_num; + break; + } + } + else if (!max_clients + && strncasecmp(pdir->directive, "MaxClients", 10) == 0) { + max_clients = pdir; + } + } + + debug = ap_exists_config_define("DEBUG"); + + if (debug) { + foreground = one_process = 1; + no_detach = 0; + } + else { + one_process = ap_exists_config_define("ONE_PROCESS"); + no_detach = ap_exists_config_define("NO_DETACH"); + foreground = ap_exists_config_define("FOREGROUND"); + } + + /* sigh, want this only the second time around */ + if (restart_num++ == 1) { + is_graceful = 0; + + if (!one_process && !foreground) { + rv = apr_proc_detach(no_detach ? APR_PROC_DETACH_FOREGROUND + : APR_PROC_DETACH_DAEMONIZE); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_CRIT, rv, NULL, + "apr_proc_detach failed"); + return HTTP_INTERNAL_SERVER_ERROR; + } + } + parent_pid = ap_my_pid = getpid(); + } + + unixd_pre_config(ptemp); + ap_listen_pre_config(); + ap_daemons_to_start = DEFAULT_START_DAEMON; + min_spare_threads = DEFAULT_MIN_FREE_DAEMON * DEFAULT_THREADS_PER_CHILD; + max_spare_threads = DEFAULT_MAX_FREE_DAEMON * DEFAULT_THREADS_PER_CHILD; + ap_daemons_limit = server_limit; + ap_threads_per_child = DEFAULT_THREADS_PER_CHILD; + ap_pid_fname = DEFAULT_PIDLOG; + ap_lock_fname = DEFAULT_LOCKFILE; + ap_max_requests_per_child = DEFAULT_MAX_REQUESTS_PER_CHILD; + ap_extended_status = 0; +#ifdef AP_MPM_WANT_SET_MAX_MEM_FREE + ap_max_mem_free = APR_ALLOCATOR_MAX_FREE_UNLIMITED; +#endif + + apr_cpystrn(ap_coredump_dir, ap_server_root, sizeof(ap_coredump_dir)); + + return OK; +} + +static void threadpool_hooks(apr_pool_t *p) +{ + /* The worker open_logs phase must run before the core's, or stderr + * will be redirected to a file, and the messages won't print to the + * console. + */ + static const char *const aszSucc[] = {"core.c", NULL}; + one_process = 0; + + ap_hook_open_logs(worker_open_logs, NULL, aszSucc, APR_HOOK_MIDDLE); + /* we need to set the MPM state before other pre-config hooks use MPM query + * to retrieve it, so register as REALLY_FIRST + */ + ap_hook_pre_config(worker_pre_config, NULL, NULL, APR_HOOK_REALLY_FIRST); +} + +static const char *set_daemons_to_start(cmd_parms *cmd, void *dummy, + const char *arg) +{ + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + ap_daemons_to_start = atoi(arg); + return NULL; +} + +static const char *set_min_spare_threads(cmd_parms *cmd, void *dummy, + const char *arg) +{ + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + min_spare_threads = atoi(arg); + if (min_spare_threads <= 0) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: detected MinSpareThreads set to non-positive."); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "Resetting to 1 to avoid almost certain Apache failure."); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "Please read the documentation."); + min_spare_threads = 1; + } + + return NULL; +} + +static const char *set_max_spare_threads(cmd_parms *cmd, void *dummy, + const char *arg) +{ + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + max_spare_threads = atoi(arg); + return NULL; +} + +static const char *set_max_clients (cmd_parms *cmd, void *dummy, + const char *arg) +{ + int max_clients; + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + /* It is ok to use ap_threads_per_child here because we are + * sure that it gets set before MaxClients in the pre_config stage. */ + max_clients = atoi(arg); + if (max_clients < ap_threads_per_child) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: MaxClients (%d) must be at least as large", + max_clients); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " large as ThreadsPerChild (%d). Automatically", + ap_threads_per_child); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " increasing MaxClients to %d.", + ap_threads_per_child); + max_clients = ap_threads_per_child; + } + ap_daemons_limit = max_clients / ap_threads_per_child; + if ((max_clients > 0) && (max_clients % ap_threads_per_child)) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: MaxClients (%d) is not an integer multiple", + max_clients); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " of ThreadsPerChild (%d), lowering MaxClients to %d", + ap_threads_per_child, + ap_daemons_limit * ap_threads_per_child); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " for a maximum of %d child processes,", + ap_daemons_limit); + max_clients = ap_daemons_limit * ap_threads_per_child; + } + if (ap_daemons_limit > server_limit) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: MaxClients of %d would require %d servers,", + max_clients, ap_daemons_limit); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " and would exceed the ServerLimit value of %d.", + server_limit); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " Automatically lowering MaxClients to %d. To increase,", + server_limit * ap_threads_per_child); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " please see the ServerLimit directive."); + ap_daemons_limit = server_limit; + } + else if (ap_daemons_limit < 1) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: Require MaxClients > 0, setting to 1"); + ap_daemons_limit = 1; + } + return NULL; +} + +static const char *set_threads_per_child (cmd_parms *cmd, void *dummy, + const char *arg) +{ + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + ap_threads_per_child = atoi(arg); + if (ap_threads_per_child > thread_limit) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: ThreadsPerChild of %d exceeds ThreadLimit " + "value of %d", ap_threads_per_child, + thread_limit); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "threads, lowering ThreadsPerChild to %d. To increase, please" + " see the", thread_limit); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " ThreadLimit directive."); + ap_threads_per_child = thread_limit; + } + else if (ap_threads_per_child < 1) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: Require ThreadsPerChild > 0, setting to 1"); + ap_threads_per_child = 1; + } + return NULL; +} + +static const char *set_server_limit (cmd_parms *cmd, void *dummy, const char *arg) +{ + int tmp_server_limit; + + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + tmp_server_limit = atoi(arg); + /* you cannot change ServerLimit across a restart; ignore + * any such attempts + */ + if (first_server_limit && + tmp_server_limit != server_limit) { + /* how do we log a message? the error log is a bit bucket at this + * point; we'll just have to set a flag so that ap_mpm_run() + * logs a warning later + */ + changed_limit_at_restart = 1; + return NULL; + } + server_limit = tmp_server_limit; + + if (server_limit > MAX_SERVER_LIMIT) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: ServerLimit of %d exceeds compile time limit " + "of %d servers,", server_limit, MAX_SERVER_LIMIT); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " lowering ServerLimit to %d.", MAX_SERVER_LIMIT); + server_limit = MAX_SERVER_LIMIT; + } + else if (server_limit < 1) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: Require ServerLimit > 0, setting to 1"); + server_limit = 1; + } + return NULL; +} + +static const char *set_thread_limit (cmd_parms *cmd, void *dummy, const char *arg) +{ + int tmp_thread_limit; + + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + tmp_thread_limit = atoi(arg); + /* you cannot change ThreadLimit across a restart; ignore + * any such attempts + */ + if (first_thread_limit && + tmp_thread_limit != thread_limit) { + /* how do we log a message? the error log is a bit bucket at this + * point; we'll just have to set a flag so that ap_mpm_run() + * logs a warning later + */ + changed_limit_at_restart = 1; + return NULL; + } + thread_limit = tmp_thread_limit; + + if (thread_limit > MAX_THREAD_LIMIT) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: ThreadLimit of %d exceeds compile time limit " + "of %d servers,", thread_limit, MAX_THREAD_LIMIT); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " lowering ThreadLimit to %d.", MAX_THREAD_LIMIT); + thread_limit = MAX_THREAD_LIMIT; + } + else if (thread_limit < 1) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: Require ThreadLimit > 0, setting to 1"); + thread_limit = 1; + } + return NULL; +} + +static const command_rec threadpool_cmds[] = { +UNIX_DAEMON_COMMANDS, +LISTEN_COMMANDS, +AP_INIT_TAKE1("StartServers", set_daemons_to_start, NULL, RSRC_CONF, + "Number of child processes launched at server startup"), +AP_INIT_TAKE1("MinSpareThreads", set_min_spare_threads, NULL, RSRC_CONF, + "Minimum number of idle children, to handle request spikes"), +AP_INIT_TAKE1("MaxSpareThreads", set_max_spare_threads, NULL, RSRC_CONF, + "Maximum number of idle children"), +AP_INIT_TAKE1("MaxClients", set_max_clients, NULL, RSRC_CONF, + "Maximum number of children alive at the same time"), +AP_INIT_TAKE1("ThreadsPerChild", set_threads_per_child, NULL, RSRC_CONF, + "Number of threads each child creates"), +AP_INIT_TAKE1("ServerLimit", set_server_limit, NULL, RSRC_CONF, + "Maximum value of MaxClients for this run of Apache"), +AP_INIT_TAKE1("ThreadLimit", set_thread_limit, NULL, RSRC_CONF, + "Maximum worker threads in a server for this run of Apache"), +{ NULL } +}; + +module AP_MODULE_DECLARE_DATA mpm_threadpool_module = { + MPM20_MODULE_STUFF, + ap_mpm_rewrite_args, /* hook to run before apache parses args */ + NULL, /* create per-directory config structure */ + NULL, /* merge per-directory config structures */ + NULL, /* create per-server config structure */ + NULL, /* merge per-server config structures */ + threadpool_cmds, /* command apr_table_t */ + threadpool_hooks /* register_hooks */ +}; + diff --git a/rubbos/app/httpd-2.0.64/server/mpm/monitoring-services.txt b/rubbos/app/httpd-2.0.64/server/mpm/monitoring-services.txt new file mode 100644 index 00000000..24665890 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/monitoring-services.txt @@ -0,0 +1,94 @@ +From: William A. Rowe, Jr. +Date: June 7th '00 +Subject: service monitoring in Apache 1.3.13 + +The concept for a taskbar monitor has been thrown around +for a very long while. 1.3.13 introduced Win9x services, +and that added fuel to the mix. Here are some sideband +observations I've made for other developers... + +About Apache as a console, don't start Apache hidden without +any command line arguments if you want to launch it yourself +in a hidden window (it will do the classic test for +AllocConsole/FreeConsole)... drop in some arguments such as +the -f or -r option and it will fly without thinking it is a +service under 9x and NT. + +Rule two, don't use --ntservice as an argument, ever. Only +the Windows NT Service Control Manager is allowed to pass that +flag, and only that flag, when it runs Apache.exe. Do use +--ntservice as the sole argument to the executable name if +you are installing an Apache NT service yourself. + +Rule three, use -k start and -n name when maintaining the +HKLM/Software/Microsoft/Windows/CurrentVersion/RunServices +list, since there is no other way for Apache to know what +the service is named :) And look at any 9x installed service's +RunServices entry in the registry for the start service semantic. + +Rule four, use the WinNT Service Control Manager exclusively +for starting, stopping and restarting Apache as an NT service. +The restart signal is the value 128, as documented in service.h +and service.c - this will continue to work in Apache 2.0. If +it fails, you are handling an older version (pre 1.3.13) of +Apache, and need to stop and then start the service instead. + +Rule five, use the legacy pid-named events to signal Win9x +service Apache to restart and stop the service. But don't +bother looking for httpd.pid files... you can get the pid +right from the hidden service control window. Apache 1.3.13 +and 2.x create a hidden window named for the name of the +service (without the spaces), with a window class of +"ApacheWin95ServiceMonitor", so can use FindWindow to track +down running Win9x services. See the service.c code for how +I accomplished this pretty simply in the -k stop/-k restart +handler. + +Taskbar Monitor App +------------------- + +Basic requirements: a C code application using strictly the +Win32 API, and not MFC or other Win32 frameworks. Could use +the service.c module to share some basic functions. That +module could be extended in Apache 2.0 to make this all easier. + +I think we are looking for an external app that simply acts +as a monitor or allows a stopped service to be started. If +the user logs off, we loose the monitor app, but installed as +a shortcut in the Start group or in the registry key +HKLM/Software/Microsoft/Windows/CurrentVersion/Run +we will be just fine. I'd like to see the monitor run only +one instance to monitor all running services, for memory +and resource conservation. + +I was thinking that the hover/iconbar title would tell them +"Test service is running", or "Test service is stopped". +If they left click, they could stop or restart, or simply +start if it is stopped. There could be a preference that +each service doesn't get it's own individual task icon unless +it is running, if it is a manual start service (or missing +from the RunServices list, which is the equivilant under 9x). + +If a specific service is set to Auto start or is in the +RunServices Win9x registry key, we must show them the stopped +icon, of course. We might also keep the icon for any running +service that stops abruptly. But there could be a 'single +icon' option for the taskbar icon monitor that says show only +a single status icon, for simplicity if the administrator runs +many Apache services. + +But I was hoping that any right click would provide a menu +of all Apache services with their status. e.g. + Test service is stopped + Apache_2 service is running + MyWeb service is running +and each would do the logical submenu, same as if that +specific taskbar icon were left clicked, offering to start or +offering to stop or restart the server, as appropriate. + +Finally, to identify all installed Apache services, just query +the registry key HKLM\SYSTEM\CurrentControlSet\Services for any +key that has the ImagePath value of "...\Apache.exe"... (quotes +are significant here, if the leading quote is ommitted the +entire string ends with the text \Apache.exe - based on Apache's +own service installer in every released version.) diff --git a/rubbos/app/httpd-2.0.64/server/mpm/mpmt_os2/Makefile.in b/rubbos/app/httpd-2.0.64/server/mpm/mpmt_os2/Makefile.in new file mode 100644 index 00000000..38e598ed --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/mpmt_os2/Makefile.in @@ -0,0 +1,5 @@ + +LTLIBRARY_NAME = libmpmt_os2.la +LTLIBRARY_SOURCES = mpmt_os2.c mpmt_os2_child.c + +include $(top_srcdir)/build/ltlib.mk diff --git a/rubbos/app/httpd-2.0.64/server/mpm/mpmt_os2/config5.m4 b/rubbos/app/httpd-2.0.64/server/mpm/mpmt_os2/config5.m4 new file mode 100644 index 00000000..b27c296d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/mpmt_os2/config5.m4 @@ -0,0 +1,5 @@ +if test "$MPM_NAME" = "mpmt_os2" ; then + AC_CACHE_SAVE + APACHE_FAST_OUTPUT(server/mpm/$MPM_NAME/Makefile) + APR_ADDTO(CFLAGS,-Zmt) +fi diff --git a/rubbos/app/httpd-2.0.64/server/mpm/mpmt_os2/mpm.h b/rubbos/app/httpd-2.0.64/server/mpm/mpmt_os2/mpm.h new file mode 100644 index 00000000..15f341dd --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/mpmt_os2/mpm.h @@ -0,0 +1,34 @@ +/* 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. + */ + +#ifndef APACHE_MPM_MPMT_OS2_H +#define APACHE_MPM_MPMT_OS2_H + +#define MPMT_OS2_MPM + +#include "httpd.h" +#include "mpm_default.h" +#include "scoreboard.h" + +#define MPM_NAME "MPMT_OS2" + +extern server_rec *ap_server_conf; +#define AP_MPM_WANT_SET_PIDFILE +#define AP_MPM_WANT_SET_MAX_REQUESTS +#define AP_MPM_DISABLE_NAGLE_ACCEPTED_SOCK +#define AP_MPM_WANT_SET_MAX_MEM_FREE + +#endif /* APACHE_MPM_MPMT_OS2_H */ diff --git a/rubbos/app/httpd-2.0.64/server/mpm/mpmt_os2/mpm_default.h b/rubbos/app/httpd-2.0.64/server/mpm/mpmt_os2/mpm_default.h new file mode 100644 index 00000000..d45b2ce2 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/mpmt_os2/mpm_default.h @@ -0,0 +1,59 @@ +/* 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. + */ + +#ifndef APACHE_MPM_DEFAULT_H +#define APACHE_MPM_DEFAULT_H + +/* Number of servers processes to spawn off by default + */ +#ifndef DEFAULT_START_DAEMON +#define DEFAULT_START_DAEMON 2 +#endif + +/* Maximum number of *free* server threads --- more than this, and + * they will die off. + */ + +#ifndef DEFAULT_MAX_SPARE_THREAD +#define DEFAULT_MAX_SPARE_THREAD 10 +#endif + +/* Minimum --- fewer than this, and more will be created */ + +#ifndef DEFAULT_MIN_SPARE_THREAD +#define DEFAULT_MIN_SPARE_THREAD 5 +#endif + +/* Where the main/parent process's pid is logged */ +#ifndef DEFAULT_PIDLOG +#define DEFAULT_PIDLOG DEFAULT_REL_RUNTIMEDIR "/httpd.pid" +#endif + +/* + * Interval, in microseconds, between scoreboard maintenance. + */ +#ifndef SCOREBOARD_MAINTENANCE_INTERVAL +#define SCOREBOARD_MAINTENANCE_INTERVAL 1000000 +#endif + +/* Number of requests to try to handle in a single process. If <= 0, + * the children don't die off. + */ +#ifndef DEFAULT_MAX_REQUESTS_PER_CHILD +#define DEFAULT_MAX_REQUESTS_PER_CHILD 10000 +#endif + +#endif /* AP_MPM_DEFAULT_H */ diff --git a/rubbos/app/httpd-2.0.64/server/mpm/mpmt_os2/mpmt_os2.c b/rubbos/app/httpd-2.0.64/server/mpm/mpmt_os2/mpmt_os2.c new file mode 100644 index 00000000..2c7f57bf --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/mpmt_os2/mpmt_os2.c @@ -0,0 +1,577 @@ +/* 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. + */ + +/* Multi-process, multi-threaded MPM for OS/2 + * + * Server consists of + * - a main, parent process + * - a small, static number of child processes + * + * The parent process's job is to manage the child processes. This involves + * spawning children as required to ensure there are always ap_daemons_to_start + * processes accepting connections. + * + * Each child process consists of a a pool of worker threads and a + * main thread that accepts connections & passes them to the workers via + * a work queue. The worker thread pool is dynamic, managed by a maintanence + * thread so that the number of idle threads is kept between + * min_spare_threads & max_spare_threads. + * + */ + +/* + Todo list + - Enforce MaxClients somehow +*/ +#define CORE_PRIVATE +#define INCL_NOPMAPI +#define INCL_DOS +#define INCL_DOSERRORS + +#include "ap_config.h" +#include "httpd.h" +#include "mpm_default.h" +#include "http_main.h" +#include "http_log.h" +#include "http_config.h" +#include "http_core.h" /* for get_remote_host */ +#include "http_connection.h" +#include "mpm.h" +#include "ap_mpm.h" +#include "ap_listen.h" +#include "apr_portable.h" +#include "mpm_common.h" +#include "apr_strings.h" +#include +#include + +/* We don't need many processes, + * they're only for redundancy in the event of a crash + */ +#define HARD_SERVER_LIMIT 10 + +/* Limit on the total number of threads per process + */ +#ifndef HARD_THREAD_LIMIT +#define HARD_THREAD_LIMIT 256 +#endif + +server_rec *ap_server_conf; +static apr_pool_t *pconf = NULL; /* Pool for config stuff */ +static const char *ap_pid_fname=NULL; + +/* Config globals */ +static int one_process = 0; +static int ap_daemons_to_start = 0; +static int ap_thread_limit = 0; +static int ap_max_requests_per_child = 0; +int ap_min_spare_threads = 0; +int ap_max_spare_threads = 0; + +/* Keep track of a few interesting statistics */ +int ap_max_daemons_limit = -1; + +/* volatile just in case */ +static int volatile shutdown_pending; +static int volatile restart_pending; +static int volatile is_graceful = 0; +ap_generation_t volatile ap_my_generation=0; /* Used by the scoreboard */ +static int is_parent_process=TRUE; +HMTX ap_mpm_accept_mutex = 0; + +/* An array of these is stored in a shared memory area for passing + * sockets from the parent to child processes + */ +typedef struct { + struct sockaddr_in name; + apr_os_sock_t listen_fd; +} listen_socket_t; + +typedef struct { + HMTX accept_mutex; + listen_socket_t listeners[1]; +} parent_info_t; + +static char master_main(); +static void spawn_child(int slot); +void ap_mpm_child_main(apr_pool_t *pconf); +static void set_signals(); + + +int ap_mpm_run(apr_pool_t *_pconf, apr_pool_t *plog, server_rec *s ) +{ + char *listener_shm_name; + parent_info_t *parent_info; + ULONG rc; + pconf = _pconf; + ap_server_conf = s; + restart_pending = 0; + + DosSetMaxFH(ap_thread_limit * 2); + listener_shm_name = apr_psprintf(pconf, "/sharemem/httpd/parent_info.%d", getppid()); + rc = DosGetNamedSharedMem((PPVOID)&parent_info, listener_shm_name, PAG_READ); + is_parent_process = rc != 0; + ap_scoreboard_fname = apr_psprintf(pconf, "/sharemem/httpd/scoreboard.%d", is_parent_process ? getpid() : getppid()); + + if (rc == 0) { + /* Child process */ + ap_listen_rec *lr; + int num_listeners = 0; + + ap_mpm_accept_mutex = parent_info->accept_mutex; + + /* Set up a default listener if necessary */ + if (ap_listeners == NULL) { + ap_listen_rec *lr = apr_pcalloc(s->process->pool, sizeof(ap_listen_rec)); + ap_listeners = lr; + apr_sockaddr_info_get(&lr->bind_addr, "0.0.0.0", APR_UNSPEC, + DEFAULT_HTTP_PORT, 0, s->process->pool); + apr_socket_create(&lr->sd, lr->bind_addr->family, + SOCK_STREAM, s->process->pool); + } + + for (lr = ap_listeners; lr; lr = lr->next) { + apr_sockaddr_t *sa; + apr_os_sock_put(&lr->sd, &parent_info->listeners[num_listeners].listen_fd, pconf); + apr_socket_addr_get(&sa, APR_LOCAL, lr->sd); + num_listeners++; + } + + DosFreeMem(parent_info); + + /* Do the work */ + ap_mpm_child_main(pconf); + + /* Outta here */ + return 1; + } + else { + /* Parent process */ + char restart; + is_parent_process = TRUE; + + if (ap_setup_listeners(ap_server_conf) < 1) { + ap_log_error(APLOG_MARK, APLOG_ALERT, 0, s, + "no listening sockets available, shutting down"); + return 1; + } + + ap_log_pid(pconf, ap_pid_fname); + + restart = master_main(); + ++ap_my_generation; + ap_scoreboard_image->global->running_generation = ap_my_generation; + + if (!restart) { + const char *pidfile = ap_server_root_relative(pconf, ap_pid_fname); + + if (pidfile != NULL && remove(pidfile) == 0) { + ap_log_error(APLOG_MARK, APLOG_INFO, APR_SUCCESS, + ap_server_conf, "removed PID file %s (pid=%d)", + pidfile, getpid()); + } + + ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, ap_server_conf, + "caught SIGTERM, shutting down"); + return 1; + } + } /* Parent process */ + + return 0; /* Restart */ +} + + + +/* Main processing of the parent process + * returns TRUE if restarting + */ +static char master_main() +{ + server_rec *s = ap_server_conf; + ap_listen_rec *lr; + parent_info_t *parent_info; + char *listener_shm_name; + int listener_num, num_listeners, slot; + ULONG rc; + + printf("%s \n", ap_get_server_version()); + set_signals(); + + if (ap_setup_listeners(ap_server_conf) < 1) { + ap_log_error(APLOG_MARK, APLOG_ALERT, 0, s, + "no listening sockets available, shutting down"); + return FALSE; + } + + /* Allocate a shared memory block for the array of listeners */ + for (num_listeners = 0, lr = ap_listeners; lr; lr = lr->next) { + num_listeners++; + } + + listener_shm_name = apr_psprintf(pconf, "/sharemem/httpd/parent_info.%d", getpid()); + rc = DosAllocSharedMem((PPVOID)&parent_info, listener_shm_name, + sizeof(parent_info_t) + num_listeners * sizeof(listen_socket_t), + PAG_READ|PAG_WRITE|PAG_COMMIT); + + if (rc) { + ap_log_error(APLOG_MARK, APLOG_ALERT, APR_FROM_OS_ERROR(rc), s, + "failure allocating shared memory, shutting down"); + return FALSE; + } + + /* Store the listener sockets in the shared memory area for our children to see */ + for (listener_num = 0, lr = ap_listeners; lr; lr = lr->next, listener_num++) { + apr_os_sock_get(&parent_info->listeners[listener_num].listen_fd, lr->sd); + } + + /* Create mutex to prevent multiple child processes from detecting + * a connection with apr_poll() + */ + + rc = DosCreateMutexSem(NULL, &ap_mpm_accept_mutex, DC_SEM_SHARED, FALSE); + + if (rc) { + ap_log_error(APLOG_MARK, APLOG_ALERT, APR_FROM_OS_ERROR(rc), s, + "failure creating accept mutex, shutting down"); + return FALSE; + } + + parent_info->accept_mutex = ap_mpm_accept_mutex; + + /* Allocate shared memory for scoreboard */ + if (ap_scoreboard_image == NULL) { + void *sb_mem; + rc = DosAllocSharedMem(&sb_mem, ap_scoreboard_fname, + ap_calc_scoreboard_size(), + PAG_COMMIT|PAG_READ|PAG_WRITE); + + if (rc) { + ap_log_error(APLOG_MARK, APLOG_ERR, APR_FROM_OS_ERROR(rc), ap_server_conf, + "unable to allocate shared memory for scoreboard , exiting"); + return FALSE; + } + + ap_init_scoreboard(sb_mem); + } + + ap_scoreboard_image->global->restart_time = apr_time_now(); + ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, ap_server_conf, + "%s configured -- resuming normal operations", + ap_get_server_version()); + ap_log_error(APLOG_MARK, APLOG_INFO, 0, ap_server_conf, + "Server built: %s", ap_get_server_built()); +#ifdef AP_MPM_WANT_SET_ACCEPT_LOCK_MECH + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, ap_server_conf, + "AcceptMutex: %s (default: %s)", + apr_proc_mutex_name(accept_mutex), + apr_proc_mutex_defname()); +#endif + if (one_process) { + ap_scoreboard_image->parent[0].pid = getpid(); + ap_mpm_child_main(pconf); + return FALSE; + } + + while (!restart_pending && !shutdown_pending) { + RESULTCODES proc_rc; + PID child_pid; + int active_children = 0; + + /* Count number of active children */ + for (slot=0; slot < HARD_SERVER_LIMIT; slot++) { + active_children += ap_scoreboard_image->parent[slot].pid != 0 && + !ap_scoreboard_image->parent[slot].quiescing; + } + + /* Spawn children if needed */ + for (slot=0; slot < HARD_SERVER_LIMIT && active_children < ap_daemons_to_start; slot++) { + if (ap_scoreboard_image->parent[slot].pid == 0) { + spawn_child(slot); + active_children++; + } + } + + rc = DosWaitChild(DCWA_PROCESSTREE, DCWW_NOWAIT, &proc_rc, &child_pid, 0); + + if (rc == 0) { + /* A child has terminated, remove its scoreboard entry & terminate if necessary */ + for (slot=0; ap_scoreboard_image->parent[slot].pid != child_pid && slot < HARD_SERVER_LIMIT; slot++); + + if (slot < HARD_SERVER_LIMIT) { + ap_scoreboard_image->parent[slot].pid = 0; + ap_scoreboard_image->parent[slot].quiescing = 0; + + if (proc_rc.codeTerminate == TC_EXIT) { + /* Child terminated normally, check its exit code and + * terminate server if child indicates a fatal error + */ + if (proc_rc.codeResult == APEXIT_CHILDFATAL) + break; + } + } + } else if (rc == ERROR_CHILD_NOT_COMPLETE) { + /* No child exited, lets sleep for a while.... */ + apr_sleep(SCOREBOARD_MAINTENANCE_INTERVAL); + } + } + + /* Signal children to shut down, either gracefully or immediately */ + for (slot=0; slotparent[slot].pid, is_graceful ? SIGHUP : SIGTERM); + } + + DosFreeMem(parent_info); + return restart_pending; +} + + + +static void spawn_child(int slot) +{ + PPIB ppib; + PTIB ptib; + char fail_module[100]; + char progname[CCHMAXPATH]; + RESULTCODES proc_rc; + ULONG rc; + + ap_scoreboard_image->parent[slot].generation = ap_my_generation; + DosGetInfoBlocks(&ptib, &ppib); + DosQueryModuleName(ppib->pib_hmte, sizeof(progname), progname); + rc = DosExecPgm(fail_module, sizeof(fail_module), EXEC_ASYNCRESULT, + ppib->pib_pchcmd, NULL, &proc_rc, progname); + + if (rc) { + ap_log_error(APLOG_MARK, APLOG_ERR, APR_FROM_OS_ERROR(rc), ap_server_conf, + "error spawning child, slot %d", slot); + } + + if (ap_max_daemons_limit < slot) { + ap_max_daemons_limit = slot; + } + + ap_scoreboard_image->parent[slot].pid = proc_rc.codeTerminate; +} + + + +/* Signal handling routines */ + +static void sig_term(int sig) +{ + shutdown_pending = 1; + signal(SIGTERM, SIG_DFL); +} + + + +static void sig_restart(int sig) +{ + if (sig == SIGUSR1) { + is_graceful = 1; + } + + restart_pending = 1; +} + + + +static void set_signals() +{ + struct sigaction sa; + + sigemptyset(&sa.sa_mask); + sa.sa_flags = 0; + sa.sa_handler = sig_term; + + if (sigaction(SIGTERM, &sa, NULL) < 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, "sigaction(SIGTERM)"); + + if (sigaction(SIGINT, &sa, NULL) < 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, "sigaction(SIGINT)"); + + sa.sa_handler = sig_restart; + + if (sigaction(SIGHUP, &sa, NULL) < 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, "sigaction(SIGHUP)"); + if (sigaction(SIGUSR1, &sa, NULL) < 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, "sigaction(SIGUSR1)"); +} + + + +/* Enquiry functions used get MPM status info */ + +AP_DECLARE(apr_status_t) ap_mpm_query(int query_code, int *result) +{ + switch (query_code) { + case AP_MPMQ_MAX_DAEMON_USED: + *result = ap_max_daemons_limit; + return APR_SUCCESS; + case AP_MPMQ_IS_THREADED: + *result = AP_MPMQ_DYNAMIC; + return APR_SUCCESS; + case AP_MPMQ_IS_FORKED: + *result = AP_MPMQ_NOT_SUPPORTED; + return APR_SUCCESS; + case AP_MPMQ_HARD_LIMIT_DAEMONS: + *result = HARD_SERVER_LIMIT; + return APR_SUCCESS; + case AP_MPMQ_HARD_LIMIT_THREADS: + *result = HARD_THREAD_LIMIT; + return APR_SUCCESS; + case AP_MPMQ_MIN_SPARE_DAEMONS: + *result = 0; + return APR_SUCCESS; + case AP_MPMQ_MAX_SPARE_DAEMONS: + *result = 0; + return APR_SUCCESS; + case AP_MPMQ_MAX_REQUESTS_DAEMON: + *result = ap_max_requests_per_child; + return APR_SUCCESS; + } + return APR_ENOTIMPL; +} + + + +int ap_graceful_stop_signalled(void) +{ + return is_graceful; +} + + + +/* Configuration handling stuff */ + +static int mpmt_os2_pre_config(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp) +{ + one_process = ap_exists_config_define("ONE_PROCESS") || + ap_exists_config_define("DEBUG"); + is_graceful = 0; + ap_listen_pre_config(); + ap_daemons_to_start = DEFAULT_START_DAEMON; + ap_thread_limit = HARD_THREAD_LIMIT; + ap_pid_fname = DEFAULT_PIDLOG; + ap_max_requests_per_child = DEFAULT_MAX_REQUESTS_PER_CHILD; + ap_extended_status = 0; + ap_min_spare_threads = DEFAULT_MIN_SPARE_THREAD; + ap_max_spare_threads = DEFAULT_MAX_SPARE_THREAD; +#ifdef AP_MPM_WANT_SET_MAX_MEM_FREE + ap_max_mem_free = APR_ALLOCATOR_MAX_FREE_UNLIMITED; +#endif + + return OK; +} + + + +static void mpmt_os2_hooks(apr_pool_t *p) +{ + ap_hook_pre_config(mpmt_os2_pre_config, NULL, NULL, APR_HOOK_MIDDLE); +} + + + +static const char *set_daemons_to_start(cmd_parms *cmd, void *dummy, const char *arg) +{ + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + + if (err != NULL) { + return err; + } + + ap_daemons_to_start = atoi(arg); + return NULL; +} + + + +static const char *set_min_spare_threads(cmd_parms *cmd, void *dummy, + const char *arg) +{ + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + + if (err != NULL) { + return err; + } + + ap_min_spare_threads = atoi(arg); + + if (ap_min_spare_threads <= 0) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: detected MinSpareThreads set to non-positive."); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "Resetting to 1 to avoid almost certain Apache failure."); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "Please read the documentation."); + ap_min_spare_threads = 1; + } + + return NULL; +} + + + +static const char *set_max_spare_threads(cmd_parms *cmd, void *dummy, + const char *arg) +{ + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + + if (err != NULL) { + return err; + } + + ap_max_spare_threads = atoi(arg); + return NULL; +} + + + +static const char *ignore_cmd(cmd_parms *cmd, void *dummy, const char *arg) +{ + return NULL; +} + + + +static const command_rec mpmt_os2_cmds[] = { +LISTEN_COMMANDS, +AP_INIT_TAKE1( "StartServers", set_daemons_to_start, NULL, RSRC_CONF, + "Number of child processes launched at server startup" ), +AP_INIT_TAKE1("MinSpareThreads", set_min_spare_threads, NULL, RSRC_CONF, + "Minimum number of idle children, to handle request spikes"), +AP_INIT_TAKE1("MaxSpareThreads", set_max_spare_threads, NULL, RSRC_CONF, + "Maximum number of idle children"), +AP_INIT_TAKE1("User", ignore_cmd, NULL, RSRC_CONF, + "Not applicable on this platform"), +AP_INIT_TAKE1("Group", ignore_cmd, NULL, RSRC_CONF, + "Not applicable on this platform"), +AP_INIT_TAKE1("ScoreBoardFile", ignore_cmd, NULL, RSRC_CONF, \ + "Not applicable on this platform"), +{ NULL } +}; + +module AP_MODULE_DECLARE_DATA mpm_mpmt_os2_module = { + MPM20_MODULE_STUFF, + NULL, /* hook to run before apache parses args */ + NULL, /* create per-directory config structure */ + NULL, /* merge per-directory config structures */ + NULL, /* create per-server config structure */ + NULL, /* merge per-server config structures */ + mpmt_os2_cmds, /* command apr_table_t */ + mpmt_os2_hooks, /* register_hooks */ +}; diff --git a/rubbos/app/httpd-2.0.64/server/mpm/mpmt_os2/mpmt_os2_child.c b/rubbos/app/httpd-2.0.64/server/mpm/mpmt_os2/mpmt_os2_child.c new file mode 100644 index 00000000..1b47cae0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/mpmt_os2/mpmt_os2_child.c @@ -0,0 +1,497 @@ +/* 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. + */ + +#define CORE_PRIVATE +#define INCL_NOPMAPI +#define INCL_DOS +#define INCL_DOSERRORS + +#include "ap_config.h" +#include "httpd.h" +#include "mpm_default.h" +#include "http_main.h" +#include "http_log.h" +#include "http_config.h" +#include "http_core.h" /* for get_remote_host */ +#include "http_connection.h" +#include "mpm.h" +#include "ap_mpm.h" +#include "ap_listen.h" +#include "apr_portable.h" +#include "apr_poll.h" +#include "mpm_common.h" +#include "apr_strings.h" +#include +#include + +/* XXXXXX move these to header file private to this MPM */ + +/* We don't need many processes, + * they're only for redundancy in the event of a crash + */ +#define HARD_SERVER_LIMIT 10 + +/* Limit on the total number of threads per process + */ +#ifndef HARD_THREAD_LIMIT +#define HARD_THREAD_LIMIT 256 +#endif + +#define ID_FROM_CHILD_THREAD(c, t) ((c * HARD_THREAD_LIMIT) + t) + +typedef struct { + apr_pool_t *pconn; + apr_socket_t *conn_sd; +} worker_args_t; + +#define WORKTYPE_CONN 0 +#define WORKTYPE_EXIT 1 + +static apr_pool_t *pchild = NULL; +static int child_slot; +static int shutdown_pending = 0; +extern int ap_my_generation; +static int volatile is_graceful = 1; +HEV shutdown_event; /* signaled when this child is shutting down */ + +/* grab some MPM globals */ +extern int ap_min_spare_threads; +extern int ap_max_spare_threads; +extern HMTX ap_mpm_accept_mutex; + +static void worker_main(void *vpArg); +static void clean_child_exit(int code); +static void set_signals(); +static void server_maintenance(void *vpArg); + + +static void clean_child_exit(int code) +{ + if (pchild) { + apr_pool_destroy(pchild); + } + + exit(code); +} + + + +void ap_mpm_child_main(apr_pool_t *pconf) +{ + ap_listen_rec *lr = NULL; + ap_listen_rec *first_lr = NULL; + int requests_this_child = 0; + apr_socket_t *sd = ap_listeners->sd; + int nsds, rv = 0; + unsigned long ulTimes; + int my_pid = getpid(); + ULONG rc, c; + HQUEUE workq; + apr_pollfd_t *pollset; + int num_listeners; + TID server_maint_tid; + void *sb_mem; + + /* Stop Ctrl-C/Ctrl-Break signals going to child processes */ + DosSetSignalExceptionFocus(0, &ulTimes); + set_signals(); + + /* Create pool for child */ + apr_pool_create(&pchild, pconf); + + ap_run_child_init(pchild, ap_server_conf); + + /* Create an event semaphore used to trigger other threads to shutdown */ + rc = DosCreateEventSem(NULL, &shutdown_event, 0, FALSE); + + if (rc) { + ap_log_error(APLOG_MARK, APLOG_ERR, APR_FROM_OS_ERROR(rc), ap_server_conf, + "unable to create shutdown semaphore, exiting"); + clean_child_exit(APEXIT_CHILDFATAL); + } + + /* Gain access to the scoreboard. */ + rc = DosGetNamedSharedMem(&sb_mem, ap_scoreboard_fname, + PAG_READ|PAG_WRITE); + + if (rc) { + ap_log_error(APLOG_MARK, APLOG_ERR, APR_FROM_OS_ERROR(rc), ap_server_conf, + "scoreboard not readable in child, exiting"); + clean_child_exit(APEXIT_CHILDFATAL); + } + + ap_calc_scoreboard_size(); + ap_init_scoreboard(sb_mem); + + /* Gain access to the accpet mutex */ + rc = DosOpenMutexSem(NULL, &ap_mpm_accept_mutex); + + if (rc) { + ap_log_error(APLOG_MARK, APLOG_ERR, APR_FROM_OS_ERROR(rc), ap_server_conf, + "accept mutex couldn't be accessed in child, exiting"); + clean_child_exit(APEXIT_CHILDFATAL); + } + + /* Find our pid in the scoreboard so we know what slot our parent allocated us */ + for (child_slot = 0; ap_scoreboard_image->parent[child_slot].pid != my_pid && child_slot < HARD_SERVER_LIMIT; child_slot++); + + if (child_slot == HARD_SERVER_LIMIT) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, ap_server_conf, + "child pid not found in scoreboard, exiting"); + clean_child_exit(APEXIT_CHILDFATAL); + } + + ap_my_generation = ap_scoreboard_image->parent[child_slot].generation; + memset(ap_scoreboard_image->servers[child_slot], 0, sizeof(worker_score) * HARD_THREAD_LIMIT); + + /* Set up an OS/2 queue for passing connections & termination requests + * to worker threads + */ + rc = DosCreateQueue(&workq, QUE_FIFO, apr_psprintf(pchild, "/queues/httpd/work.%d", my_pid)); + + if (rc) { + ap_log_error(APLOG_MARK, APLOG_ERR, APR_FROM_OS_ERROR(rc), ap_server_conf, + "unable to create work queue, exiting"); + clean_child_exit(APEXIT_CHILDFATAL); + } + + /* Create initial pool of worker threads */ + for (c = 0; c < ap_min_spare_threads; c++) { +// ap_scoreboard_image->servers[child_slot][c].tid = _beginthread(worker_main, NULL, 128*1024, (void *)c); + } + + /* Start maintenance thread */ + server_maint_tid = _beginthread(server_maintenance, NULL, 32768, NULL); + + /* Set up poll */ + for (num_listeners = 0, lr = ap_listeners; lr; lr = lr->next) { + num_listeners++; + } + + apr_poll_setup(&pollset, num_listeners, pchild); + + for (lr = ap_listeners; lr; lr = lr->next) { + apr_poll_socket_add(pollset, lr->sd, APR_POLLIN); + } + + /* Main connection accept loop */ + do { + apr_pool_t *pconn; + worker_args_t *worker_args; + + apr_pool_create(&pconn, pchild); + worker_args = apr_palloc(pconn, sizeof(worker_args_t)); + worker_args->pconn = pconn; + + if (num_listeners == 1) { + rv = apr_accept(&worker_args->conn_sd, ap_listeners->sd, pconn); + } else { + rc = DosRequestMutexSem(ap_mpm_accept_mutex, SEM_INDEFINITE_WAIT); + + if (shutdown_pending) { + DosReleaseMutexSem(ap_mpm_accept_mutex); + break; + } + + rv = APR_FROM_OS_ERROR(rc); + + if (rv == APR_SUCCESS) { + rv = apr_poll(pollset, num_listeners, &nsds, -1); + DosReleaseMutexSem(ap_mpm_accept_mutex); + } + + if (rv == APR_SUCCESS) { + if (first_lr == NULL) { + first_lr = ap_listeners; + } + + lr = first_lr; + + do { + apr_int16_t event; + + apr_poll_revents_get(&event, lr->sd, pollset); + + if (event == APR_POLLIN) { + apr_sockaddr_t *sa; + apr_port_t port; + apr_socket_addr_get(&sa, APR_LOCAL, lr->sd); + apr_sockaddr_port_get(&port, sa); + first_lr = lr->next; + break; + } + lr = lr->next; + + if (!lr) { + lr = ap_listeners; + } + } while (lr != first_lr); + + if (lr == first_lr) { + continue; + } + + sd = lr->sd; + rv = apr_accept(&worker_args->conn_sd, sd, pconn); + } + } + + if (rv != APR_SUCCESS) { + if (!APR_STATUS_IS_EINTR(rv)) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, ap_server_conf, + "apr_accept"); + clean_child_exit(APEXIT_CHILDFATAL); + } + } else { + DosWriteQueue(workq, WORKTYPE_CONN, sizeof(worker_args_t), worker_args, 0); + requests_this_child++; + } + + if (ap_max_requests_per_child != 0 && requests_this_child >= ap_max_requests_per_child) + break; + } while (!shutdown_pending && ap_my_generation == ap_scoreboard_image->global->running_generation); + + ap_scoreboard_image->parent[child_slot].quiescing = 1; + DosPostEventSem(shutdown_event); + DosWaitThread(&server_maint_tid, DCWW_WAIT); + + if (is_graceful) { + char someleft; + + /* tell our worker threads to exit */ + for (c=0; cservers[child_slot][c].status != SERVER_DEAD) { + DosWriteQueue(workq, WORKTYPE_EXIT, 0, NULL, 0); + } + } + + do { + someleft = 0; + + for (c=0; cservers[child_slot][c].status != SERVER_DEAD) { + someleft = 1; + DosSleep(1000); + break; + } + } + } while (someleft); + } else { + DosPurgeQueue(workq); + + for (c=0; cservers[child_slot][c].status != SERVER_DEAD) { + DosKillThread(ap_scoreboard_image->servers[child_slot][c].tid); + } + } + } + + apr_pool_destroy(pchild); +} + + + +void add_worker() +{ + int thread_slot; + + /* Find a free thread slot */ + for (thread_slot=0; thread_slot < HARD_THREAD_LIMIT; thread_slot++) { + if (ap_scoreboard_image->servers[child_slot][thread_slot].status == SERVER_DEAD) { + ap_scoreboard_image->servers[child_slot][thread_slot].status = SERVER_STARTING; + ap_scoreboard_image->servers[child_slot][thread_slot].tid = + _beginthread(worker_main, NULL, 128*1024, (void *)thread_slot); + break; + } + } +} + + + +ULONG APIENTRY thread_exception_handler(EXCEPTIONREPORTRECORD *pReportRec, + EXCEPTIONREGISTRATIONRECORD *pRegRec, + CONTEXTRECORD *pContext, + PVOID p) +{ + int c; + + if (pReportRec->fHandlerFlags & EH_NESTED_CALL) { + return XCPT_CONTINUE_SEARCH; + } + + if (pReportRec->ExceptionNum == XCPT_ACCESS_VIOLATION || + pReportRec->ExceptionNum == XCPT_INTEGER_DIVIDE_BY_ZERO) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, ap_server_conf, + "caught exception in worker thread, initiating child shutdown pid=%d", getpid()); + for (c=0; cservers[child_slot][c].tid == _gettid()) { + ap_scoreboard_image->servers[child_slot][c].status = SERVER_DEAD; + break; + } + } + + /* Shut down process ASAP, it could be quite unhealthy & leaking resources */ + shutdown_pending = 1; + ap_scoreboard_image->parent[child_slot].quiescing = 1; + kill(getpid(), SIGHUP); + DosUnwindException(UNWIND_ALL, 0, 0); + } + + return XCPT_CONTINUE_SEARCH; +} + + + +static void worker_main(void *vpArg) +{ + long conn_id; + conn_rec *current_conn; + apr_pool_t *pconn; + apr_allocator_t *allocator; + apr_bucket_alloc_t *bucket_alloc; + worker_args_t *worker_args; + HQUEUE workq; + PID owner; + int rc; + REQUESTDATA rd; + ULONG len; + BYTE priority; + int thread_slot = (int)vpArg; + EXCEPTIONREGISTRATIONRECORD reg_rec = { NULL, thread_exception_handler }; + ap_sb_handle_t *sbh; + + /* Trap exceptions in this thread so we don't take down the whole process */ + DosSetExceptionHandler( ®_rec ); + + rc = DosOpenQueue(&owner, &workq, + apr_psprintf(pchild, "/queues/httpd/work.%d", getpid())); + + if (rc) { + ap_log_error(APLOG_MARK, APLOG_ERR, APR_FROM_OS_ERROR(rc), ap_server_conf, + "unable to open work queue, exiting"); + ap_scoreboard_image->servers[child_slot][thread_slot].tid = 0; + } + + conn_id = ID_FROM_CHILD_THREAD(child_slot, thread_slot); + ap_update_child_status_from_indexes(child_slot, thread_slot, SERVER_READY, + NULL); + + apr_allocator_create(&allocator); + apr_allocator_max_free_set(allocator, ap_max_mem_free); + bucket_alloc = apr_bucket_alloc_create_ex(allocator); + + while (rc = DosReadQueue(workq, &rd, &len, (PPVOID)&worker_args, 0, DCWW_WAIT, &priority, NULLHANDLE), + rc == 0 && rd.ulData != WORKTYPE_EXIT) { + pconn = worker_args->pconn; + ap_create_sb_handle(&sbh, pconn, child_slot, thread_slot); + current_conn = ap_run_create_connection(pconn, ap_server_conf, + worker_args->conn_sd, conn_id, + sbh, bucket_alloc); + + if (current_conn) { + ap_process_connection(current_conn, worker_args->conn_sd); + ap_lingering_close(current_conn); + } + + apr_pool_destroy(pconn); + ap_update_child_status_from_indexes(child_slot, thread_slot, + SERVER_READY, NULL); + } + + ap_update_child_status_from_indexes(child_slot, thread_slot, SERVER_DEAD, + NULL); + + apr_bucket_alloc_destroy(bucket_alloc); + apr_allocator_destroy(allocator); +} + + + +static void server_maintenance(void *vpArg) +{ + int num_idle, num_needed; + ULONG num_pending = 0; + int threadnum; + HQUEUE workq; + ULONG rc; + PID owner; + + rc = DosOpenQueue(&owner, &workq, + apr_psprintf(pchild, "/queues/httpd/work.%d", getpid())); + + if (rc) { + ap_log_error(APLOG_MARK, APLOG_ERR, APR_FROM_OS_ERROR(rc), ap_server_conf, + "unable to open work queue in maintenance thread"); + return; + } + + do { + for (num_idle=0, threadnum=0; threadnum < HARD_THREAD_LIMIT; threadnum++) { + num_idle += ap_scoreboard_image->servers[child_slot][threadnum].status == SERVER_READY; + } + + DosQueryQueue(workq, &num_pending); + num_needed = ap_min_spare_threads - num_idle + num_pending; + + if (num_needed > 0) { + for (threadnum=0; threadnum < num_needed; threadnum++) { + add_worker(); + } + } + + if (num_idle - num_pending > ap_max_spare_threads) { + DosWriteQueue(workq, WORKTYPE_EXIT, 0, NULL, 0); + } + } while (DosWaitEventSem(shutdown_event, 500) == ERROR_TIMEOUT); +} + + + +/* Signal handling routines */ + +static void sig_term(int sig) +{ + shutdown_pending = 1; + is_graceful = 0; + signal(SIGTERM, SIG_DFL); +} + + + +static void sig_hup(int sig) +{ + shutdown_pending = 1; + is_graceful = 1; +} + + + +static void set_signals() +{ + struct sigaction sa; + + sigemptyset(&sa.sa_mask); + sa.sa_flags = 0; + sa.sa_handler = sig_term; + + if (sigaction(SIGTERM, &sa, NULL) < 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, "sigaction(SIGTERM)"); + + sa.sa_handler = sig_hup; + + if (sigaction(SIGHUP, &sa, NULL) < 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, "sigaction(SIGHUP)"); +} diff --git a/rubbos/app/httpd-2.0.64/server/mpm/netware/mpm.h b/rubbos/app/httpd-2.0.64/server/mpm/netware/mpm.h new file mode 100644 index 00000000..4b9a8392 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/netware/mpm.h @@ -0,0 +1,48 @@ +/* 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. + */ + +#include "scoreboard.h" + +#ifndef APACHE_MPM_THREADED_H +#define APACHE_MPM_THREADED_H + +#define THREADED_MPM + +#define MPM_NAME "NetWare_Threaded" + +/*#define AP_MPM_WANT_RECLAIM_CHILD_PROCESSES + #define AP_MPM_WANT_WAIT_OR_TIMEOUT + #define AP_MPM_WANT_PROCESS_CHILD_STATUS + #define AP_MPM_WANT_SET_PIDFILE + #define AP_MPM_WANT_SET_SCOREBOARD + #define AP_MPM_WANT_SET_LOCKFILE +*/ +#define AP_MPM_WANT_SET_MAX_REQUESTS +#define AP_MPM_WANT_SET_MAX_MEM_FREE +#define AP_MPM_DISABLE_NAGLE_ACCEPTED_SOCK +/*#define AP_MPM_WANT_SET_COREDUMPDIR + #define AP_MPM_WANT_SET_ACCEPT_LOCK_MECH +*/ + +#define MPM_CHILD_PID(i) (ap_scoreboard_image->parent[i].pid) +#define MPM_NOTE_CHILD_KILLED(i) (MPM_CHILD_PID(i) = 0) + +extern int ap_threads_per_child; +extern int ap_thread_stack_size; +extern int ap_max_workers_limit; +extern server_rec *ap_server_conf; + +#endif /* APACHE_MPM_THREADED_H */ diff --git a/rubbos/app/httpd-2.0.64/server/mpm/netware/mpm_default.h b/rubbos/app/httpd-2.0.64/server/mpm/netware/mpm_default.h new file mode 100644 index 00000000..397f5511 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/netware/mpm_default.h @@ -0,0 +1,108 @@ +/* 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. + */ + +#ifndef APACHE_MPM_DEFAULT_H +#define APACHE_MPM_DEFAULT_H + +/* Number of servers to spawn off by default --- also, if fewer than + * this free when the caretaker checks, it will spawn more. + */ +#ifndef DEFAULT_START_DAEMON +#define DEFAULT_START_DAEMON 1 +#endif + +/* Maximum number of *free* server processes --- more than this, and + * they will die off. + */ + +#ifndef DEFAULT_MAX_FREE_DAEMON +#define DEFAULT_MAX_FREE_DAEMON 1 +#endif + +/* Minimum --- fewer than this, and more will be created */ + +#ifndef DEFAULT_MIN_FREE_DAEMON +#define DEFAULT_MIN_FREE_DAEMON 1 +#endif + +/* Limit on the threads per process. Clients will be locked out if more than + * this * HARD_SERVER_LIMIT are needed. + * + * We keep this for one reason it keeps the size of the scoreboard file small + * enough that we can read the whole thing without worrying too much about + * the overhead. + */ +#ifndef HARD_THREAD_LIMIT +#define HARD_THREAD_LIMIT 2048 +#endif + +#ifndef DEFAULT_THREADS_PER_CHILD +#define DEFAULT_THREADS_PER_CHILD 50 +#endif + +/* Number of threads to spawn off by default --- also, if fewer than + * this free when the caretaker checks, it will spawn more. + */ +#ifndef DEFAULT_START_THREADS +#define DEFAULT_START_THREADS DEFAULT_THREADS_PER_CHILD +#endif + +/* Maximum number of *free* threads --- more than this, and + * they will die off. + */ + +#ifndef DEFAULT_MAX_FREE_THREADS +#define DEFAULT_MAX_FREE_THREADS 100 +#endif + +/* Minimum --- fewer than this, and more will be created */ + +#ifndef DEFAULT_MIN_FREE_THREADS +#define DEFAULT_MIN_FREE_THREADS 10 +#endif + +/* Check for definition of DEFAULT_REL_RUNTIMEDIR */ +#ifndef DEFAULT_REL_RUNTIMEDIR +#define DEFAULT_REL_RUNTIMEDIR "logs" +#endif + +/* File used for accept locking, when we use a file */ +/*#ifndef DEFAULT_LOCKFILE + #define DEFAULT_LOCKFILE DEFAULT_REL_RUNTIMEDIR "/accept.lock" + #endif +*/ + +/* Where the main/parent process's pid is logged */ +/*#ifndef DEFAULT_PIDLOG + #define DEFAULT_PIDLOG DEFAULT_REL_RUNTIMEDIR "/httpd.pid" + #endif +*/ + +/* + * Interval, in microseconds, between scoreboard maintenance. + */ +#ifndef SCOREBOARD_MAINTENANCE_INTERVAL +#define SCOREBOARD_MAINTENANCE_INTERVAL 1000000 +#endif + +/* Number of requests to try to handle in a single process. If <= 0, + * the children don't die off. + */ +#ifndef DEFAULT_MAX_REQUESTS_PER_CHILD +#define DEFAULT_MAX_REQUESTS_PER_CHILD 0 +#endif + +#endif /* AP_MPM_DEFAULT_H */ diff --git a/rubbos/app/httpd-2.0.64/server/mpm/netware/mpm_netware.c b/rubbos/app/httpd-2.0.64/server/mpm/netware/mpm_netware.c new file mode 100644 index 00000000..f3eb227c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/netware/mpm_netware.c @@ -0,0 +1,1295 @@ +/* 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.c: simple http daemon for answering WWW file requests + * + * + * 03-21-93 Rob McCool wrote original code (up to NCSA HTTPd 1.3) + * + * 03-06-95 blong + * changed server number for child-alone processes to 0 and changed name + * of processes + * + * 03-10-95 blong + * Added numerous speed hacks proposed by Robert S. Thau (rst@ai.mit.edu) + * including set group before fork, and call gettime before to fork + * to set up libraries. + * + * 04-14-95 rst / rh + * Brandon's code snarfed from NCSA 1.4, but tinkered to work with the + * Apache server, and also to have child processes do accept() directly. + * + * April-July '95 rst + * Extensive rework for Apache. + */ + +#include "apr.h" +#include "apr_portable.h" +#include "apr_strings.h" +#include "apr_thread_proc.h" +#include "apr_signal.h" +#include "apr_tables.h" +#include "apr_getopt.h" +#include "apr_thread_mutex.h" + +#define APR_WANT_STDIO +#define APR_WANT_STRFUNC +#include "apr_want.h" + +#if APR_HAVE_UNISTD_H +#include +#endif +#if APR_HAVE_SYS_TYPES_H +#include +#endif + +#define CORE_PRIVATE + +#include "ap_config.h" +#include "httpd.h" +#include "mpm_default.h" +#include "http_main.h" +#include "http_log.h" +#include "http_config.h" +#include "http_core.h" /* for get_remote_host */ +#include "http_connection.h" +#include "scoreboard.h" +#include "ap_mpm.h" +#include "mpm_common.h" +#include "ap_listen.h" +#include "ap_mmn.h" + +#ifdef HAVE_TIME_H +#include +#endif + +#include + +#include +#include +#include +#include + +/* Limit on the total --- clients will be locked out if more servers than + * this are needed. It is intended solely to keep the server from crashing + * when things get out of hand. + * + * We keep a hard maximum number of servers, for two reasons --- first off, + * in case something goes seriously wrong, we want to stop the fork bomb + * short of actually crashing the machine we're running on by filling some + * kernel table. Secondly, it keeps the size of the scoreboard file small + * enough that we can read the whole thing without worrying too much about + * the overhead. + */ +#ifndef HARD_SERVER_LIMIT +#define HARD_SERVER_LIMIT 1 +#endif + +#define WORKER_DEAD SERVER_DEAD +#define WORKER_STARTING SERVER_STARTING +#define WORKER_READY SERVER_READY +#define WORKER_IDLE_KILL SERVER_IDLE_KILL + +/* config globals */ + +int ap_threads_per_child=0; /* Worker threads per child */ +int ap_thread_stack_size=65536; +static int ap_threads_to_start=0; +static int ap_threads_min_free=0; +static int ap_threads_max_free=0; +static int ap_threads_limit=0; +static int mpm_state = AP_MPMQ_STARTING; + +/* + * The max child slot ever assigned, preserved across restarts. Necessary + * to deal with MaxClients changes across SIGWINCH restarts. We use this + * value to optimize routines that have to scan the entire scoreboard. + */ +int ap_max_workers_limit = -1; +server_rec *ap_server_conf; + +/* *Non*-shared http_main globals... */ + +int hold_screen_on_exit = 0; /* Indicates whether the screen should be held open */ + +static fd_set listenfds; +static int listenmaxfd; + +static apr_pool_t *pconf; /* Pool for config stuff */ +static apr_pool_t *pmain; /* Pool for httpd child stuff */ + +static pid_t ap_my_pid; /* it seems silly to call getpid all the time */ +static char *ap_my_addrspace = NULL; + +static int die_now = 0; + +/* Keep track of the number of worker threads currently active */ +static unsigned long worker_thread_count; +static int request_count; + +/* Structure used to register/deregister a console handler with the OS */ +static int InstallConsoleHandler(void); +static void RemoveConsoleHandler(void); +static int CommandLineInterpreter(scr_t screenID, const char *commandLine); +static CommandParser_t ConsoleHandler = {0, NULL, 0}; +#define HANDLEDCOMMAND 0 +#define NOTMYCOMMAND 1 + +static int show_settings = 0; + +//#define DBINFO_ON +//#define DBPRINT_ON +#ifdef DBPRINT_ON +#define DBPRINT0(s) printf(s) +#define DBPRINT1(s,v1) printf(s,v1) +#define DBPRINT2(s,v1,v2) printf(s,v1,v2) +#else +#define DBPRINT0(s) +#define DBPRINT1(s,v1) +#define DBPRINT2(s,v1,v2) +#endif + +/* volatile just in case */ +static int volatile shutdown_pending; +static int volatile restart_pending; +static int volatile is_graceful; +static int volatile wait_to_finish=1; +ap_generation_t volatile ap_my_generation=0; + +/* a clean exit from a child with proper cleanup */ +static void clean_child_exit(int code, int worker_num, apr_pool_t *ptrans, + apr_bucket_alloc_t *bucket_alloc) __attribute__ ((noreturn)); +static void clean_child_exit(int code, int worker_num, apr_pool_t *ptrans, + apr_bucket_alloc_t *bucket_alloc) +{ + apr_bucket_alloc_destroy(bucket_alloc); + if (!shutdown_pending) { + apr_pool_destroy(ptrans); + } + + atomic_dec (&worker_thread_count); + if (worker_num >=0) + ap_update_child_status_from_indexes(0, worker_num, WORKER_DEAD, + (request_rec *) NULL); + NXThreadExit((void*)&code); +} + +AP_DECLARE(apr_status_t) ap_mpm_query(int query_code, int *result) +{ + switch(query_code){ + case AP_MPMQ_MAX_DAEMON_USED: + *result = 1; + return APR_SUCCESS; + case AP_MPMQ_IS_THREADED: + *result = AP_MPMQ_DYNAMIC; + return APR_SUCCESS; + case AP_MPMQ_IS_FORKED: + *result = AP_MPMQ_NOT_SUPPORTED; + return APR_SUCCESS; + case AP_MPMQ_HARD_LIMIT_DAEMONS: + *result = HARD_SERVER_LIMIT; + return APR_SUCCESS; + case AP_MPMQ_HARD_LIMIT_THREADS: + *result = HARD_THREAD_LIMIT; + return APR_SUCCESS; + case AP_MPMQ_MAX_THREADS: + *result = ap_threads_limit; + return APR_SUCCESS; + case AP_MPMQ_MIN_SPARE_DAEMONS: + *result = 0; + return APR_SUCCESS; + case AP_MPMQ_MIN_SPARE_THREADS: + *result = ap_threads_min_free; + return APR_SUCCESS; + case AP_MPMQ_MAX_SPARE_DAEMONS: + *result = 0; + return APR_SUCCESS; + case AP_MPMQ_MAX_SPARE_THREADS: + *result = ap_threads_max_free; + return APR_SUCCESS; + case AP_MPMQ_MAX_REQUESTS_DAEMON: + *result = ap_max_requests_per_child; + return APR_SUCCESS; + case AP_MPMQ_MAX_DAEMONS: + *result = 1; + return APR_SUCCESS; + case AP_MPMQ_MPM_STATE: + *result = mpm_state; + return APR_SUCCESS; + } + return APR_ENOTIMPL; +} + + +/***************************************************************** + * Connection structures and accounting... + */ + +static void mpm_term(void) +{ + RemoveConsoleHandler(); + wait_to_finish = 0; + NXThreadYield(); +} + +static void sig_term(int sig) +{ + if (shutdown_pending == 1) { + /* Um, is this _probably_ not an error, if the user has + * tried to do a shutdown twice quickly, so we won't + * worry about reporting it. + */ + return; + } + shutdown_pending = 1; + + DBPRINT0 ("waiting for threads\n"); + while (wait_to_finish) { + apr_thread_yield(); + } + DBPRINT0 ("goodbye\n"); +} + +/* restart() is the signal handler for SIGHUP and SIGWINCH + * in the parent process, unless running in ONE_PROCESS mode + */ +static void restart(void) +{ + if (restart_pending == 1) { + /* Probably not an error - don't bother reporting it */ + return; + } + restart_pending = 1; + is_graceful = 1; +} + +static void set_signals(void) +{ + apr_signal(SIGTERM, sig_term); + apr_signal(SIGABRT, sig_term); +} + +int nlmUnloadSignaled(int wait) +{ + shutdown_pending = 1; + + if (wait) { + while (wait_to_finish) { + NXThreadYield(); + } + } + + return 0; +} + +/***************************************************************** + * Child process main loop. + * The following vars are static to avoid getting clobbered by longjmp(); + * they are really private to child_main. + */ + + +int ap_graceful_stop_signalled(void) +{ + /* not ever called anymore... */ + return 0; +} + +#define MAX_WB_RETRIES 3 +#ifdef DBINFO_ON +static int would_block = 0; +static int retry_success = 0; +static int retry_fail = 0; +static int avg_retries = 0; +#endif + +/*static */ +void worker_main(void *arg) +{ + ap_listen_rec *lr, *first_lr, *last_lr = NULL; + apr_pool_t *ptrans; + apr_pool_t *pbucket; + apr_allocator_t *allocator; + apr_bucket_alloc_t *bucket_alloc; + conn_rec *current_conn; + apr_status_t stat = APR_EINIT; + ap_sb_handle_t *sbh; + + int my_worker_num = (int)arg; + apr_socket_t *csd = NULL; + int requests_this_child = 0; + apr_socket_t *sd = NULL; + fd_set main_fds; + + int sockdes; + int srv; + struct timeval tv; + int wouldblock_retry; + + tv.tv_sec = 1; + tv.tv_usec = 0; + + apr_allocator_create(&allocator); + apr_allocator_max_free_set(allocator, ap_max_mem_free); + + apr_pool_create_ex(&ptrans, pmain, NULL, allocator); + apr_allocator_owner_set(allocator, ptrans); + apr_pool_tag(ptrans, "transaction"); + + bucket_alloc = apr_bucket_alloc_create_ex(allocator); + + atomic_inc (&worker_thread_count); + + while (!die_now) { + /* + * (Re)initialize this child to a pre-connection state. + */ + current_conn = NULL; + apr_pool_clear(ptrans); + + if ((ap_max_requests_per_child > 0 + && requests_this_child++ >= ap_max_requests_per_child)) { + DBPRINT1 ("\n**Thread slot %d is shutting down", my_worker_num); + clean_child_exit(0, my_worker_num, ptrans, bucket_alloc); + } + + ap_update_child_status_from_indexes(0, my_worker_num, WORKER_READY, + (request_rec *) NULL); + + /* + * Wait for an acceptable connection to arrive. + */ + + for (;;) { + if (shutdown_pending || restart_pending || (ap_scoreboard_image->servers[0][my_worker_num].status == WORKER_IDLE_KILL)) { + DBPRINT1 ("\nThread slot %d is shutting down\n", my_worker_num); + clean_child_exit(0, my_worker_num, ptrans, bucket_alloc); + } + + /* Check the listen queue on all sockets for requests */ + memcpy(&main_fds, &listenfds, sizeof(fd_set)); + srv = select(listenmaxfd + 1, &main_fds, NULL, NULL, &tv); + + if (srv <= 0) { + if (srv < 0) { + ap_log_error(APLOG_MARK, APLOG_NOTICE, WSAGetLastError(), ap_server_conf, + "select() failed on listen socket"); + apr_thread_yield(); + } + continue; + } + + /* remember the last_lr we searched last time around so that + we don't end up starving any particular listening socket */ + if (last_lr == NULL) { + lr = ap_listeners; + } + else { + lr = last_lr->next; + if (!lr) + lr = ap_listeners; + } + first_lr = lr; + do { + apr_os_sock_get(&sockdes, lr->sd); + if (FD_ISSET(sockdes, &main_fds)) + goto got_listener; + lr = lr->next; + if (!lr) + lr = ap_listeners; + } while (lr != first_lr); + /* if we get here, something unexpected happened. Go back + into the select state and try again. + */ + continue; + got_listener: + last_lr = lr; + sd = lr->sd; + + wouldblock_retry = MAX_WB_RETRIES; + + while (wouldblock_retry) { + if ((stat = apr_accept(&csd, sd, ptrans)) == APR_SUCCESS) { + break; + } + else { + /* if the error is a wouldblock then maybe we were too + quick try to pull the next request from the listen + queue. Try a few more times then return to our idle + listen state. */ + if (!APR_STATUS_IS_EAGAIN(stat)) { + break; + } + + if (wouldblock_retry--) { + apr_thread_yield(); + } + } + } + + /* If we got a new socket, set it to non-blocking mode and process + it. Otherwise handle the error. */ + if (stat == APR_SUCCESS) { + apr_socket_opt_set(csd, APR_SO_NONBLOCK, 0); +#ifdef DBINFO_ON + if (wouldblock_retry < MAX_WB_RETRIES) { + retry_success++; + avg_retries += (MAX_WB_RETRIES-wouldblock_retry); + } +#endif + break; /* We have a socket ready for reading */ + } + else { +#ifdef DBINFO_ON + if (APR_STATUS_IS_EAGAIN(stat)) { + would_block++; + retry_fail++; + } + else +#else + if (APR_STATUS_IS_EAGAIN(stat) || +#endif + APR_STATUS_IS_ECONNRESET(stat) || + APR_STATUS_IS_ETIMEDOUT(stat) || + APR_STATUS_IS_EHOSTUNREACH(stat) || + APR_STATUS_IS_ENETUNREACH(stat)) { + ; + } + else if (APR_STATUS_IS_ENETDOWN(stat)) { + /* + * When the network layer has been shut down, there + * is not much use in simply exiting: the parent + * would simply re-create us (and we'd fail again). + * Use the CHILDFATAL code to tear the server down. + * @@@ Martin's idea for possible improvement: + * A different approach would be to define + * a new APEXIT_NETDOWN exit code, the reception + * of which would make the parent shutdown all + * children, then idle-loop until it detected that + * the network is up again, and restart the children. + * Ben Hyde noted that temporary ENETDOWN situations + * occur in mobile IP. + */ + ap_log_error(APLOG_MARK, APLOG_EMERG, stat, ap_server_conf, + "apr_accept: giving up."); + clean_child_exit(APEXIT_CHILDFATAL, my_worker_num, ptrans, + bucket_alloc); + } + else { + ap_log_error(APLOG_MARK, APLOG_ERR, stat, ap_server_conf, + "apr_accept: (client socket)"); + clean_child_exit(1, my_worker_num, ptrans, bucket_alloc); + } + } + } + + ap_create_sb_handle(&sbh, ptrans, 0, my_worker_num); + /* + * We now have a connection, so set it up with the appropriate + * socket options, file descriptors, and read/write buffers. + */ + current_conn = ap_run_create_connection(ptrans, ap_server_conf, csd, + my_worker_num, sbh, + bucket_alloc); + if (current_conn) { + ap_process_connection(current_conn, csd); + ap_lingering_close(current_conn); + } + request_count++; + } + clean_child_exit(0, my_worker_num, ptrans, bucket_alloc); +} + + +static int make_child(server_rec *s, int slot) +{ + int tid; + int err=0; + NXContext_t ctx; + + if (slot + 1 > ap_max_workers_limit) { + ap_max_workers_limit = slot + 1; + } + + ap_update_child_status_from_indexes(0, slot, WORKER_STARTING, + (request_rec *) NULL); + + if (ctx = NXContextAlloc((void (*)(void *)) worker_main, (void*)slot, NX_PRIO_MED, ap_thread_stack_size, NX_CTX_NORMAL, &err)) { + char threadName[32]; + + sprintf (threadName, "Apache_Worker %d", slot); + NXContextSetName(ctx, threadName); + err = NXThreadCreate(ctx, NX_THR_BIND_CONTEXT, &tid); + if (err) { + NXContextFree (ctx); + } + } + + if (err) { + /* create thread didn't succeed. Fix the scoreboard or else + * it will say SERVER_STARTING forever and ever + */ + ap_update_child_status_from_indexes(0, slot, WORKER_DEAD, + (request_rec *) NULL); + + /* In case system resources are maxxed out, we don't want + Apache running away with the CPU trying to fork over and + over and over again. */ + apr_thread_yield(); + + return -1; + } + + ap_scoreboard_image->servers[0][slot].tid = tid; + + return 0; +} + + +/* start up a bunch of worker threads */ +static void startup_workers(int number_to_start) +{ + int i; + + for (i = 0; number_to_start && i < ap_threads_limit; ++i) { + if (ap_scoreboard_image->servers[0][i].status != WORKER_DEAD) { + continue; + } + if (make_child(ap_server_conf, i) < 0) { + break; + } + --number_to_start; + } +} + + +/* + * idle_spawn_rate is the number of children that will be spawned on the + * next maintenance cycle if there aren't enough idle servers. It is + * doubled up to MAX_SPAWN_RATE, and reset only when a cycle goes by + * without the need to spawn. + */ +static int idle_spawn_rate = 1; +#ifndef MAX_SPAWN_RATE +#define MAX_SPAWN_RATE (64) +#endif +static int hold_off_on_exponential_spawning; + +static void perform_idle_server_maintenance(apr_pool_t *p) +{ + int i; + int to_kill; + int idle_count; + worker_score *ws; + int free_length; + int free_slots[MAX_SPAWN_RATE]; + int last_non_dead; + int total_non_dead; + + /* initialize the free_list */ + free_length = 0; + + to_kill = -1; + idle_count = 0; + last_non_dead = -1; + total_non_dead = 0; + + for (i = 0; i < ap_threads_limit; ++i) { + int status; + + if (i >= ap_max_workers_limit && free_length == idle_spawn_rate) + break; + ws = &ap_scoreboard_image->servers[0][i]; + status = ws->status; + if (status == WORKER_DEAD) { + /* try to keep children numbers as low as possible */ + if (free_length < idle_spawn_rate) { + free_slots[free_length] = i; + ++free_length; + } + } + else if (status == WORKER_IDLE_KILL) { + /* If it is already marked to die, skip it */ + continue; + } + else { + /* We consider a starting server as idle because we started it + * at least a cycle ago, and if it still hasn't finished starting + * then we're just going to swamp things worse by forking more. + * So we hopefully won't need to fork more if we count it. + * This depends on the ordering of SERVER_READY and SERVER_STARTING. + */ + if (status <= WORKER_READY) { + ++ idle_count; + /* always kill the highest numbered child if we have to... + * no really well thought out reason ... other than observing + * the server behaviour under linux where lower numbered children + * tend to service more hits (and hence are more likely to have + * their data in cpu caches). + */ + to_kill = i; + } + + ++total_non_dead; + last_non_dead = i; + } + } + DBPRINT2("Total: %d Idle Count: %d \r", total_non_dead, idle_count); + ap_max_workers_limit = last_non_dead + 1; + if (idle_count > ap_threads_max_free) { + /* kill off one child... we use the pod because that'll cause it to + * shut down gracefully, in case it happened to pick up a request + * while we were counting + */ + idle_spawn_rate = 1; + ap_update_child_status_from_indexes(0, last_non_dead, WORKER_IDLE_KILL, + (request_rec *) NULL); + DBPRINT1("\nKilling idle thread: %d\n", last_non_dead); + } + else if (idle_count < ap_threads_min_free) { + /* terminate the free list */ + if (free_length == 0) { + /* only report this condition once */ + static int reported = 0; + + if (!reported) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, ap_server_conf, + "server reached MaxClients setting, consider" + " raising the MaxClients setting"); + reported = 1; + } + idle_spawn_rate = 1; + } + else { + if (idle_spawn_rate >= 8) { + ap_log_error(APLOG_MARK, APLOG_INFO, 0, ap_server_conf, + "server seems busy, (you may need " + "to increase StartServers, or Min/MaxSpareServers), " + "spawning %d children, there are %d idle, and " + "%d total children", idle_spawn_rate, + idle_count, total_non_dead); + } + DBPRINT0("\n"); + for (i = 0; i < free_length; ++i) { + DBPRINT1("Spawning additional thread slot: %d\n", free_slots[i]); + make_child(ap_server_conf, free_slots[i]); + } + /* the next time around we want to spawn twice as many if this + * wasn't good enough, but not if we've just done a graceful + */ + if (hold_off_on_exponential_spawning) { + --hold_off_on_exponential_spawning; + } + else if (idle_spawn_rate < MAX_SPAWN_RATE) { + idle_spawn_rate *= 2; + } + } + } + else { + idle_spawn_rate = 1; + } +} + +static void display_settings () +{ + int status_array[SERVER_NUM_STATUS]; + int i, status, total=0; + int reqs = request_count; +#ifdef DBINFO_ON + int wblock = would_block; + + would_block = 0; +#endif + + request_count = 0; + + ClearScreen (getscreenhandle()); + printf("%s \n", ap_get_server_version()); + + for (i=0;iservers[0][i]).status; + status_array[status]++; + } + + for (i=0;ibind_addr->port); + lr = lr->next; + } while(lr && lr != ap_listeners); + + /* Display dynamic modules loaded */ + printf("\n"); + for (m = ap_loaded_modules; *m != NULL; m++) { + if (((module*)*m)->dynamic_load_handle) { + printf(" Loaded dynamic module %s\n", ((module*)*m)->name); + } + } +} + + +static int setup_listeners(server_rec *s) +{ + ap_listen_rec *lr; + int sockdes; + + if (ap_setup_listeners(s) < 1 ) { + ap_log_error(APLOG_MARK, APLOG_ALERT, 0, s, + "no listening sockets available, shutting down"); + return -1; + } + + listenmaxfd = -1; + FD_ZERO(&listenfds); + for (lr = ap_listeners; lr; lr = lr->next) { + apr_os_sock_get(&sockdes, lr->sd); + FD_SET(sockdes, &listenfds); + if (sockdes > listenmaxfd) { + listenmaxfd = sockdes; + } + } + return 0; +} + +static int shutdown_listeners() +{ + ap_listen_rec *lr; + + for (lr = ap_listeners; lr; lr = lr->next) { + apr_socket_close(lr->sd); + } + ap_listeners = NULL; + return 0; +} + +/***************************************************************** + * Executive routines. + */ + +int ap_mpm_run(apr_pool_t *_pconf, apr_pool_t *plog, server_rec *s) +{ + apr_status_t status=0; + + pconf = _pconf; + ap_server_conf = s; + + if (setup_listeners(s)) { + ap_log_error(APLOG_MARK, APLOG_ALERT, status, s, + "no listening sockets available, shutting down"); + return -1; + } + + restart_pending = shutdown_pending = 0; + worker_thread_count = 0; + + if (!is_graceful) { + if (ap_run_pre_mpm(s->process->pool, SB_NOT_SHARED) != OK) { + return 1; + } + } + + /* Only set slot 0 since that is all NetWare will ever have. */ + ap_scoreboard_image->parent[0].pid = getpid(); + + set_signals(); + + apr_pool_create(&pmain, pconf); + ap_run_child_init(pmain, ap_server_conf); + + if (ap_threads_max_free < ap_threads_min_free + 1) /* Don't thrash... */ + ap_threads_max_free = ap_threads_min_free + 1; + request_count = 0; + + startup_workers(ap_threads_to_start); + + /* Allow the Apache screen to be closed normally on exit() only if it + has not been explicitly forced to close on exit(). (ie. the -E flag + was specified at startup) */ + if (hold_screen_on_exit > 0) { + hold_screen_on_exit = 0; + } + + ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, ap_server_conf, + "%s configured -- resuming normal operations", + ap_get_server_version()); + ap_log_error(APLOG_MARK, APLOG_INFO, 0, ap_server_conf, + "Server built: %s", ap_get_server_built()); +#ifdef AP_MPM_WANT_SET_ACCEPT_LOCK_MECH + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, ap_server_conf, + "AcceptMutex: %s (default: %s)", + apr_proc_mutex_name(accept_mutex), + apr_proc_mutex_defname()); +#endif + show_server_data(); + + mpm_state = AP_MPMQ_RUNNING; + while (!restart_pending && !shutdown_pending) { + perform_idle_server_maintenance(pconf); + if (show_settings) + display_settings(); + apr_thread_yield(); + apr_sleep(SCOREBOARD_MAINTENANCE_INTERVAL); + } + mpm_state = AP_MPMQ_STOPPING; + + + /* Shutdown the listen sockets so that we don't get stuck in a blocking call. + shutdown_listeners();*/ + + if (shutdown_pending) { /* Got an unload from the console */ + ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, ap_server_conf, + "caught SIGTERM, shutting down"); + + while (worker_thread_count > 0) { + printf ("\rShutdown pending. Waiting for %d thread(s) to terminate...", + worker_thread_count); + apr_thread_yield(); + } + + return 1; + } + else { /* the only other way out is a restart */ + /* advance to the next generation */ + /* XXX: we really need to make sure this new generation number isn't in + * use by any of the children. + */ + ++ap_my_generation; + ap_scoreboard_image->global->running_generation = ap_my_generation; + + ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, ap_server_conf, + "Graceful restart requested, doing restart"); + + /* Wait for all of the threads to terminate before initiating the restart */ + while (worker_thread_count > 0) { + printf ("\rRestart pending. Waiting for %d thread(s) to terminate...", + worker_thread_count); + apr_thread_yield(); + } + printf ("\nRestarting...\n"); + } + + return 0; +} + +static int netware_pre_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp) +{ + int debug; + char *addrname = NULL; + + mpm_state = AP_MPMQ_STARTING; + + debug = ap_exists_config_define("DEBUG"); + + is_graceful = 0; + ap_my_pid = getpid(); + addrname = getaddressspacename (NULL, NULL); + if (addrname) { + ap_my_addrspace = apr_pstrdup (p, addrname); + free (addrname); + } + + ap_listen_pre_config(); + ap_threads_to_start = DEFAULT_START_THREADS; + ap_threads_min_free = DEFAULT_MIN_FREE_THREADS; + ap_threads_max_free = DEFAULT_MAX_FREE_THREADS; + ap_threads_limit = HARD_THREAD_LIMIT; + ap_max_requests_per_child = DEFAULT_MAX_REQUESTS_PER_CHILD; + ap_extended_status = 0; +#ifdef AP_MPM_WANT_SET_MAX_MEM_FREE + ap_max_mem_free = APR_ALLOCATOR_MAX_FREE_UNLIMITED; +#endif + + return OK; +} + +static void netware_mpm_hooks(apr_pool_t *p) +{ + ap_hook_pre_config(netware_pre_config, NULL, NULL, APR_HOOK_MIDDLE); +} + +void netware_rewrite_args(process_rec *process) +{ + char *def_server_root; + char optbuf[3]; + const char *opt_arg; + apr_getopt_t *opt; + apr_array_header_t *mpm_new_argv; + + + atexit (mpm_term); + InstallConsoleHandler(); + + /* Make sure to hold the Apache screen open if exit() is called */ + hold_screen_on_exit = 1; + + /* Rewrite process->argv[]; + * + * add default -d serverroot from the path of this executable + * + * The end result will look like: + * The -d serverroot default from the running executable + */ + if (process->argc > 0) { + char *s = apr_pstrdup (process->pconf, process->argv[0]); + if (s) { + int i, len = strlen(s); + + for (i=len; i; i--) { + if (s[i] == '\\' || s[i] == '/') { + s[i] = '\0'; + apr_filepath_merge(&def_server_root, NULL, s, + APR_FILEPATH_TRUENAME, process->pool); + break; + } + } + /* Use process->pool so that the rewritten argv + * lasts for the lifetime of the server process, + * because pconf will be destroyed after the + * initial pre-flight of the config parser. + */ + mpm_new_argv = apr_array_make(process->pool, process->argc + 2, + sizeof(const char *)); + *(const char **)apr_array_push(mpm_new_argv) = process->argv[0]; + *(const char **)apr_array_push(mpm_new_argv) = "-d"; + *(const char **)apr_array_push(mpm_new_argv) = def_server_root; + + optbuf[0] = '-'; + optbuf[2] = '\0'; + apr_getopt_init(&opt, process->pool, process->argc, (char**) process->argv); + while (apr_getopt(opt, AP_SERVER_BASEARGS"n:", optbuf + 1, &opt_arg) == APR_SUCCESS) { + switch (optbuf[1]) { + case 'n': + if (opt_arg) { + renamescreen(opt_arg); + } + break; + case 'E': + /* Don't need to hold the screen open if the output is going to a file */ + hold_screen_on_exit = -1; + default: + *(const char **)apr_array_push(mpm_new_argv) = + apr_pstrdup(process->pool, optbuf); + + if (opt_arg) { + *(const char **)apr_array_push(mpm_new_argv) = opt_arg; + } + break; + } + } + process->argc = mpm_new_argv->nelts; + process->argv = (const char * const *) mpm_new_argv->elts; + } + } +} + +static int CommandLineInterpreter(scr_t screenID, const char *commandLine) +{ + char *szCommand = "APACHE2 "; + int iCommandLen = 8; + char szcommandLine[256]; + char *pID; + screenID = screenID; + + + if (commandLine == NULL) + return NOTMYCOMMAND; + if (strlen(commandLine) <= strlen(szCommand)) + return NOTMYCOMMAND; + + strncpy (szcommandLine, commandLine, sizeof(szcommandLine)-1); + + /* All added commands begin with "APACHE2 " */ + + if (!strnicmp(szCommand, szcommandLine, iCommandLen)) { + ActivateScreen (getscreenhandle()); + + /* If an instance id was not given but the nlm is loaded in + protected space, then the the command belongs to the + OS address space instance to pass it on. */ + pID = strstr (szcommandLine, "-p"); + if ((pID == NULL) && nlmisloadedprotected()) + return NOTMYCOMMAND; + + /* If we got an instance id but it doesn't match this + instance of the nlm, pass it on. */ + if (pID) { + pID = &pID[2]; + while (*pID && (*pID == ' ')) + pID++; + } + if (pID && ap_my_addrspace && strnicmp(pID, ap_my_addrspace, strlen(ap_my_addrspace))) + return NOTMYCOMMAND; + + /* If we have determined that this command belongs to this + instance of the nlm, then handle it. */ + if (!strnicmp("RESTART",&szcommandLine[iCommandLen],3)) { + printf("Restart Requested...\n"); + restart(); + } + else if (!strnicmp("VERSION",&szcommandLine[iCommandLen],3)) { + printf("Server version: %s\n", ap_get_server_version()); + printf("Server built: %s\n", ap_get_server_built()); + } + else if (!strnicmp("MODULES",&szcommandLine[iCommandLen],3)) { + ap_show_modules(); + } + else if (!strnicmp("DIRECTIVES",&szcommandLine[iCommandLen],3)) { + ap_show_directives(); + } + else if (!strnicmp("SHUTDOWN",&szcommandLine[iCommandLen],3)) { + printf("Shutdown Requested...\n"); + shutdown_pending = 1; + } + else if (!strnicmp("SETTINGS",&szcommandLine[iCommandLen],3)) { + if (show_settings) { + show_settings = 0; + ClearScreen (getscreenhandle()); + show_server_data(); + } + else { + show_settings = 1; + display_settings(); + } + } + else { + show_settings = 0; + if (strnicmp("HELP",&szcommandLine[iCommandLen],3)) + printf("Unknown APACHE2 command %s\n", &szcommandLine[iCommandLen]); + printf("Usage: APACHE2 [command] [-p ]\n"); + printf("Commands:\n"); + printf("\tDIRECTIVES - Show directives\n"); + printf("\tHELP - Display this help information\n"); + printf("\tMODULES - Show a list of the loaded modules\n"); + printf("\tRESTART - Reread the configuration file and restart Apache\n"); + printf("\tSETTINGS - Show current thread status\n"); + printf("\tSHUTDOWN - Shutdown Apache\n"); + printf("\tVERSION - Display the server version information\n"); + } + + /* Tell NetWare we handled the command */ + return HANDLEDCOMMAND; + } + + /* Tell NetWare that the command isn't mine */ + return NOTMYCOMMAND; +} + +static int InstallConsoleHandler(void) +{ + /* Our command line handler interfaces the system operator + with this NLM */ + + NX_WRAP_INTERFACE(CommandLineInterpreter, 2, (void*)&(ConsoleHandler.parser)); + + ConsoleHandler.rTag = AllocateResourceTag(getnlmhandle(), "Command Line Processor", + ConsoleCommandSignature); + if (!ConsoleHandler.rTag) + { + printf("Error on allocate resource tag\n"); + return 1; + } + + RegisterConsoleCommand(&ConsoleHandler); + + /* The Remove procedure unregisters the console handler */ + + return 0; +} + +static void RemoveConsoleHandler(void) +{ + UnRegisterConsoleCommand(&ConsoleHandler); + NX_UNWRAP_INTERFACE(ConsoleHandler.parser); +} + +static const char *set_threads_to_start(cmd_parms *cmd, void *dummy, const char *arg) +{ + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + ap_threads_to_start = atoi(arg); + return NULL; +} + +static const char *set_min_free_threads(cmd_parms *cmd, void *dummy, const char *arg) +{ + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + ap_threads_min_free = atoi(arg); + if (ap_threads_min_free <= 0) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: detected MinSpareServers set to non-positive."); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "Resetting to 1 to avoid almost certain Apache failure."); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "Please read the documentation."); + ap_threads_min_free = 1; + } + + return NULL; +} + +static const char *set_max_free_threads(cmd_parms *cmd, void *dummy, const char *arg) +{ + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + ap_threads_max_free = atoi(arg); + return NULL; +} + +static const char *set_thread_limit (cmd_parms *cmd, void *dummy, const char *arg) +{ + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + ap_threads_limit = atoi(arg); + if (ap_threads_limit > HARD_THREAD_LIMIT) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: MaxThreads of %d exceeds compile time limit " + "of %d threads,", ap_threads_limit, HARD_THREAD_LIMIT); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " lowering MaxThreads to %d. To increase, please " + "see the", HARD_THREAD_LIMIT); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " HARD_THREAD_LIMIT define in %s.", + AP_MPM_HARD_LIMITS_FILE); + ap_threads_limit = HARD_THREAD_LIMIT; + } + else if (ap_threads_limit < 1) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: Require MaxThreads > 0, setting to 1"); + ap_threads_limit = 1; + } + return NULL; +} + +static const char *set_thread_stacksize(cmd_parms *cmd, void *dummy, + const char *arg) +{ + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + ap_thread_stack_size = atoi(arg); + return NULL; +} + +static const command_rec netware_mpm_cmds[] = { +AP_INIT_TAKE1("ThreadStackSize", set_thread_stacksize, NULL, RSRC_CONF, + "Stack size each created thread will use."), +LISTEN_COMMANDS, +AP_INIT_TAKE1("StartThreads", set_threads_to_start, NULL, RSRC_CONF, + "Number of worker threads launched at server startup"), +AP_INIT_TAKE1("MinSpareThreads", set_min_free_threads, NULL, RSRC_CONF, + "Minimum number of idle threads, to handle request spikes"), +AP_INIT_TAKE1("MaxSpareThreads", set_max_free_threads, NULL, RSRC_CONF, + "Maximum number of idle threads"), +AP_INIT_TAKE1("MaxThreads", set_thread_limit, NULL, RSRC_CONF, + "Maximum number of worker threads alive at the same time"), +{ NULL } +}; + +module AP_MODULE_DECLARE_DATA mpm_netware_module = { + MPM20_MODULE_STUFF, + netware_rewrite_args, /* hook to run before apache parses args */ + NULL, /* create per-directory config structure */ + NULL, /* merge per-directory config structures */ + NULL, /* create per-server config structure */ + NULL, /* merge per-server config structures */ + netware_mpm_cmds, /* command apr_table_t */ + netware_mpm_hooks, /* register hooks */ +}; diff --git a/rubbos/app/httpd-2.0.64/server/mpm/prefork/Makefile.in b/rubbos/app/httpd-2.0.64/server/mpm/prefork/Makefile.in new file mode 100644 index 00000000..034bf5ce --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/prefork/Makefile.in @@ -0,0 +1,5 @@ + +LTLIBRARY_NAME = libprefork.la +LTLIBRARY_SOURCES = prefork.c + +include $(top_srcdir)/build/ltlib.mk diff --git a/rubbos/app/httpd-2.0.64/server/mpm/prefork/config.m4 b/rubbos/app/httpd-2.0.64/server/mpm/prefork/config.m4 new file mode 100644 index 00000000..9c189a86 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/prefork/config.m4 @@ -0,0 +1,3 @@ +if test "$MPM_NAME" = "prefork" ; then + APACHE_FAST_OUTPUT(server/mpm/$MPM_NAME/Makefile) +fi diff --git a/rubbos/app/httpd-2.0.64/server/mpm/prefork/mpm.h b/rubbos/app/httpd-2.0.64/server/mpm/prefork/mpm.h new file mode 100644 index 00000000..51f810b3 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/prefork/mpm.h @@ -0,0 +1,51 @@ +/* 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. + */ + +#include "httpd.h" +#include "mpm_default.h" +#include "scoreboard.h" +#include "unixd.h" + +#ifndef APACHE_MPM_PREFORK_H +#define APACHE_MPM_PREFORK_H + +#define PREFORK_MPM + +#define MPM_NAME "Prefork" + +#define AP_MPM_WANT_RECLAIM_CHILD_PROCESSES +#define AP_MPM_WANT_WAIT_OR_TIMEOUT +#define AP_MPM_WANT_PROCESS_CHILD_STATUS +#define AP_MPM_WANT_SET_PIDFILE +#define AP_MPM_WANT_SET_SCOREBOARD +#define AP_MPM_WANT_SET_LOCKFILE +#define AP_MPM_WANT_SET_MAX_REQUESTS +#define AP_MPM_WANT_SET_COREDUMPDIR +#define AP_MPM_WANT_SET_ACCEPT_LOCK_MECH +#define AP_MPM_WANT_SIGNAL_SERVER +#define AP_MPM_WANT_SET_MAX_MEM_FREE +#define AP_MPM_WANT_FATAL_SIGNAL_HANDLER +#define AP_MPM_DISABLE_NAGLE_ACCEPTED_SOCK + +#define AP_MPM_USES_POD 1 +#define MPM_CHILD_PID(i) (ap_scoreboard_image->parent[i].pid) +#define MPM_NOTE_CHILD_KILLED(i) (MPM_CHILD_PID(i) = 0) +#define MPM_ACCEPT_FUNC unixd_accept + +extern int ap_threads_per_child; +extern int ap_max_daemons_limit; +extern server_rec *ap_server_conf; +#endif /* APACHE_MPM_PREFORK_H */ diff --git a/rubbos/app/httpd-2.0.64/server/mpm/prefork/mpm_default.h b/rubbos/app/httpd-2.0.64/server/mpm/prefork/mpm_default.h new file mode 100644 index 00000000..8ddf38f0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/prefork/mpm_default.h @@ -0,0 +1,65 @@ +/* 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. + */ + +#ifndef APACHE_MPM_DEFAULT_H +#define APACHE_MPM_DEFAULT_H + +/* Number of servers to spawn off by default --- also, if fewer than + * this free when the caretaker checks, it will spawn more. + */ +#ifndef DEFAULT_START_DAEMON +#define DEFAULT_START_DAEMON 5 +#endif + +/* Maximum number of *free* server processes --- more than this, and + * they will die off. + */ + +#ifndef DEFAULT_MAX_FREE_DAEMON +#define DEFAULT_MAX_FREE_DAEMON 10 +#endif + +/* Minimum --- fewer than this, and more will be created */ + +#ifndef DEFAULT_MIN_FREE_DAEMON +#define DEFAULT_MIN_FREE_DAEMON 5 +#endif + +/* File used for accept locking, when we use a file */ +#ifndef DEFAULT_LOCKFILE +#define DEFAULT_LOCKFILE DEFAULT_REL_RUNTIMEDIR "/accept.lock" +#endif + +/* Where the main/parent process's pid is logged */ +#ifndef DEFAULT_PIDLOG +#define DEFAULT_PIDLOG DEFAULT_REL_RUNTIMEDIR "/httpd.pid" +#endif + +/* + * Interval, in microseconds, between scoreboard maintenance. + */ +#ifndef SCOREBOARD_MAINTENANCE_INTERVAL +#define SCOREBOARD_MAINTENANCE_INTERVAL 1000000 +#endif + +/* Number of requests to try to handle in a single process. If <= 0, + * the children don't die off. + */ +#ifndef DEFAULT_MAX_REQUESTS_PER_CHILD +#define DEFAULT_MAX_REQUESTS_PER_CHILD 10000 +#endif + +#endif /* AP_MPM_DEFAULT_H */ diff --git a/rubbos/app/httpd-2.0.64/server/mpm/prefork/prefork.c b/rubbos/app/httpd-2.0.64/server/mpm/prefork/prefork.c new file mode 100644 index 00000000..8667b4ab --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/prefork/prefork.c @@ -0,0 +1,1355 @@ +/* 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. + */ + +#include "apr.h" +#include "apr_portable.h" +#include "apr_strings.h" +#include "apr_thread_proc.h" +#include "apr_signal.h" + +#define APR_WANT_STDIO +#define APR_WANT_STRFUNC +#include "apr_want.h" + +#if APR_HAVE_UNISTD_H +#include +#endif +#if APR_HAVE_SYS_TYPES_H +#include +#endif + +#define CORE_PRIVATE + +#include "ap_config.h" +#include "httpd.h" +#include "mpm_default.h" +#include "http_main.h" +#include "http_log.h" +#include "http_config.h" +#include "http_core.h" /* for get_remote_host */ +#include "http_connection.h" +#include "scoreboard.h" +#include "ap_mpm.h" +#include "unixd.h" +#include "mpm_common.h" +#include "ap_listen.h" +#include "ap_mmn.h" +#include "apr_poll.h" + +#ifdef HAVE_BSTRING_H +#include /* for IRIX, FD_SET calls bzero() */ +#endif +#ifdef HAVE_TIME_H +#include +#endif +#ifdef HAVE_SYS_PROCESSOR_H +#include /* for bindprocessor() */ +#endif + +#include +#include + +/* Limit on the total --- clients will be locked out if more servers than + * this are needed. It is intended solely to keep the server from crashing + * when things get out of hand. + * + * We keep a hard maximum number of servers, for two reasons --- first off, + * in case something goes seriously wrong, we want to stop the fork bomb + * short of actually crashing the machine we're running on by filling some + * kernel table. Secondly, it keeps the size of the scoreboard file small + * enough that we can read the whole thing without worrying too much about + * the overhead. + */ +#ifndef DEFAULT_SERVER_LIMIT +#define DEFAULT_SERVER_LIMIT 256 +#endif + +/* Admin can't tune ServerLimit beyond MAX_SERVER_LIMIT. We want + * some sort of compile-time limit to help catch typos. + */ +#ifndef MAX_SERVER_LIMIT +#define MAX_SERVER_LIMIT 20000 +#endif + +#ifndef HARD_THREAD_LIMIT +#define HARD_THREAD_LIMIT 1 +#endif + +/* config globals */ + +int ap_threads_per_child=0; /* Worker threads per child */ +static apr_proc_mutex_t *accept_mutex; +static int ap_daemons_to_start=0; +static int ap_daemons_min_free=0; +static int ap_daemons_max_free=0; +static int ap_daemons_limit=0; /* MaxClients */ +static int server_limit = DEFAULT_SERVER_LIMIT; +static int first_server_limit; +static int changed_limit_at_restart; +static int mpm_state = AP_MPMQ_STARTING; +static ap_pod_t *pod; + +/* + * The max child slot ever assigned, preserved across restarts. Necessary + * to deal with MaxClients changes across AP_SIG_GRACEFUL restarts. We + * use this value to optimize routines that have to scan the entire scoreboard. + */ +int ap_max_daemons_limit = -1; +server_rec *ap_server_conf; + +/* one_process --- debugging mode variable; can be set from the command line + * with the -X flag. If set, this gets you the child_main loop running + * in the process which originally started up (no detach, no make_child), + * which is a pretty nice debugging environment. (You'll get a SIGHUP + * early in standalone_main; just continue through. This is the server + * trying to kill off any child processes which it might have lying + * around --- Apache doesn't keep track of their pids, it just sends + * SIGHUP to the process group, ignoring it in the root process. + * Continue through and you'll be fine.). + */ + +static int one_process = 0; + +static apr_pool_t *pconf; /* Pool for config stuff */ +static apr_pool_t *pchild; /* Pool for httpd child stuff */ + +static pid_t ap_my_pid; /* it seems silly to call getpid all the time */ +static pid_t parent_pid; +#ifndef MULTITHREAD +static int my_child_num; +#endif +ap_generation_t volatile ap_my_generation=0; + +#ifdef TPF +int tpf_child = 0; +char tpf_server_name[INETD_SERVNAME_LENGTH+1]; +#endif /* TPF */ + +static int die_now = 0; + +#ifdef GPROF +/* + * change directory for gprof to plop the gmon.out file + * configure in httpd.conf: + * GprofDir $RuntimeDir/ -> $ServerRoot/$RuntimeDir/gmon.out + * GprofDir $RuntimeDir/% -> $ServerRoot/$RuntimeDir/gprof.$pid/gmon.out + */ +static void chdir_for_gprof(void) +{ + core_server_config *sconf = + ap_get_module_config(ap_server_conf->module_config, &core_module); + char *dir = sconf->gprof_dir; + const char *use_dir; + + if(dir) { + apr_status_t res; + char buf[512]; + int len = strlen(sconf->gprof_dir) - 1; + if(*(dir + len) == '%') { + dir[len] = '\0'; + apr_snprintf(buf, sizeof(buf), "%sgprof.%d", dir, (int)getpid()); + } + use_dir = ap_server_root_relative(pconf, buf[0] ? buf : dir); + res = apr_dir_make(use_dir, 0755, pconf); + if(res != APR_SUCCESS && !APR_STATUS_IS_EEXIST(res)) { + ap_log_error(APLOG_MARK, APLOG_ERR, errno, ap_server_conf, + "gprof: error creating directory %s", dir); + } + } + else { + use_dir = ap_server_root_relative(pconf, DEFAULT_REL_RUNTIMEDIR); + } + + chdir(use_dir); +} +#else +#define chdir_for_gprof() +#endif + +/* XXX - I don't know if TPF will ever use this module or not, so leave + * the ap_check_signals calls in but disable them - manoj */ +#define ap_check_signals() + +/* a clean exit from a child with proper cleanup */ +static void clean_child_exit(int code) __attribute__ ((noreturn)); +static void clean_child_exit(int code) +{ + mpm_state = AP_MPMQ_STOPPING; + + if (pchild) { + apr_pool_destroy(pchild); + } + ap_mpm_pod_close(pod); + chdir_for_gprof(); + exit(code); +} + +static void accept_mutex_on(void) +{ + apr_status_t rv = apr_proc_mutex_lock(accept_mutex); + if (rv != APR_SUCCESS) { + const char *msg = "couldn't grab the accept mutex"; + + if (ap_my_generation != + ap_scoreboard_image->global->running_generation) { + ap_log_error(APLOG_MARK, APLOG_DEBUG, rv, NULL, msg); + clean_child_exit(0); + } + else { + ap_log_error(APLOG_MARK, APLOG_EMERG, rv, NULL, msg); + exit(APEXIT_CHILDFATAL); + } + } +} + +static void accept_mutex_off(void) +{ + apr_status_t rv = apr_proc_mutex_unlock(accept_mutex); + if (rv != APR_SUCCESS) { + const char *msg = "couldn't release the accept mutex"; + + if (ap_my_generation != + ap_scoreboard_image->global->running_generation) { + ap_log_error(APLOG_MARK, APLOG_DEBUG, rv, NULL, msg); + /* don't exit here... we have a connection to + * process, after which point we'll see that the + * generation changed and we'll exit cleanly + */ + } + else { + ap_log_error(APLOG_MARK, APLOG_EMERG, rv, NULL, msg); + exit(APEXIT_CHILDFATAL); + } + } +} + +/* On some architectures it's safe to do unserialized accept()s in the single + * Listen case. But it's never safe to do it in the case where there's + * multiple Listen statements. Define SINGLE_LISTEN_UNSERIALIZED_ACCEPT + * when it's safe in the single Listen case. + */ +#ifdef SINGLE_LISTEN_UNSERIALIZED_ACCEPT +#define SAFE_ACCEPT(stmt) do {if (ap_listeners->next) {stmt;}} while(0) +#else +#define SAFE_ACCEPT(stmt) do {stmt;} while(0) +#endif + +AP_DECLARE(apr_status_t) ap_mpm_query(int query_code, int *result) +{ + switch(query_code){ + case AP_MPMQ_MAX_DAEMON_USED: + *result = ap_daemons_limit; + return APR_SUCCESS; + case AP_MPMQ_IS_THREADED: + *result = AP_MPMQ_NOT_SUPPORTED; + return APR_SUCCESS; + case AP_MPMQ_IS_FORKED: + *result = AP_MPMQ_DYNAMIC; + return APR_SUCCESS; + case AP_MPMQ_HARD_LIMIT_DAEMONS: + *result = server_limit; + return APR_SUCCESS; + case AP_MPMQ_HARD_LIMIT_THREADS: + *result = HARD_THREAD_LIMIT; + return APR_SUCCESS; + case AP_MPMQ_MAX_THREADS: + *result = 0; + return APR_SUCCESS; + case AP_MPMQ_MIN_SPARE_DAEMONS: + *result = ap_daemons_min_free; + return APR_SUCCESS; + case AP_MPMQ_MIN_SPARE_THREADS: + *result = 0; + return APR_SUCCESS; + case AP_MPMQ_MAX_SPARE_DAEMONS: + *result = ap_daemons_max_free; + return APR_SUCCESS; + case AP_MPMQ_MAX_SPARE_THREADS: + *result = 0; + return APR_SUCCESS; + case AP_MPMQ_MAX_REQUESTS_DAEMON: + *result = ap_max_requests_per_child; + return APR_SUCCESS; + case AP_MPMQ_MAX_DAEMONS: + *result = server_limit; + return APR_SUCCESS; + case AP_MPMQ_MPM_STATE: + *result = mpm_state; + return APR_SUCCESS; + } + return APR_ENOTIMPL; +} + +#if defined(NEED_WAITPID) +/* + Systems without a real waitpid sometimes lose a child's exit while waiting + for another. Search through the scoreboard for missing children. + */ +int reap_children(int *exitcode, apr_exit_why_e *status) +{ + int n, pid; + + for (n = 0; n < ap_max_daemons_limit; ++n) { + if (ap_scoreboard_image->servers[n][0].status != SERVER_DEAD && + kill((pid = ap_scoreboard_image->parent[n].pid), 0) == -1) { + ap_update_child_status_from_indexes(n, 0, SERVER_DEAD, NULL); + /* just mark it as having a successful exit status */ + *status = APR_PROC_EXIT; + *exitcode = 0; + return(pid); + } + } + return 0; +} +#endif + +/***************************************************************** + * Connection structures and accounting... + */ + +static void just_die(int sig) +{ + clean_child_exit(0); +} + +/* volatile just in case */ +static int volatile shutdown_pending; +static int volatile restart_pending; +static int volatile is_graceful; + +static void sig_term(int sig) +{ + if (shutdown_pending == 1) { + /* Um, is this _probably_ not an error, if the user has + * tried to do a shutdown twice quickly, so we won't + * worry about reporting it. + */ + return; + } + shutdown_pending = 1; +} + +/* restart() is the signal handler for SIGHUP and AP_SIG_GRACEFUL + * in the parent process, unless running in ONE_PROCESS mode + */ +static void restart(int sig) +{ + if (restart_pending == 1) { + /* Probably not an error - don't bother reporting it */ + return; + } + restart_pending = 1; + is_graceful = (sig == AP_SIG_GRACEFUL); +} + +static void set_signals(void) +{ +#ifndef NO_USE_SIGACTION + struct sigaction sa; +#endif + + if (!one_process) { + ap_fatal_signal_setup(ap_server_conf, pconf); + } + +#ifndef NO_USE_SIGACTION + sigemptyset(&sa.sa_mask); + sa.sa_flags = 0; + + sa.sa_handler = sig_term; + if (sigaction(SIGTERM, &sa, NULL) < 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, "sigaction(SIGTERM)"); +#ifdef SIGINT + if (sigaction(SIGINT, &sa, NULL) < 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, "sigaction(SIGINT)"); +#endif +#ifdef SIGXCPU + sa.sa_handler = SIG_DFL; + if (sigaction(SIGXCPU, &sa, NULL) < 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, "sigaction(SIGXCPU)"); +#endif +#ifdef SIGXFSZ + sa.sa_handler = SIG_DFL; + if (sigaction(SIGXFSZ, &sa, NULL) < 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, "sigaction(SIGXFSZ)"); +#endif +#ifdef SIGPIPE + sa.sa_handler = SIG_IGN; + if (sigaction(SIGPIPE, &sa, NULL) < 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, "sigaction(SIGPIPE)"); +#endif + + /* we want to ignore HUPs and AP_SIG_GRACEFUL while we're busy + * processing one */ + sigaddset(&sa.sa_mask, SIGHUP); + sigaddset(&sa.sa_mask, AP_SIG_GRACEFUL); + sa.sa_handler = restart; + if (sigaction(SIGHUP, &sa, NULL) < 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, "sigaction(SIGHUP)"); + if (sigaction(AP_SIG_GRACEFUL, &sa, NULL) < 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, "sigaction(" AP_SIG_GRACEFUL_STRING ")"); +#else + if (!one_process) { +#ifdef SIGXCPU + apr_signal(SIGXCPU, SIG_DFL); +#endif /* SIGXCPU */ +#ifdef SIGXFSZ + apr_signal(SIGXFSZ, SIG_DFL); +#endif /* SIGXFSZ */ + } + + apr_signal(SIGTERM, sig_term); +#ifdef SIGHUP + apr_signal(SIGHUP, restart); +#endif /* SIGHUP */ +#ifdef AP_SIG_GRACEFUL + apr_signal(AP_SIG_GRACEFUL, restart); +#endif /* AP_SIG_GRACEFUL */ +#ifdef SIGPIPE + apr_signal(SIGPIPE, SIG_IGN); +#endif /* SIGPIPE */ + +#endif +} + +/***************************************************************** + * Child process main loop. + * The following vars are static to avoid getting clobbered by longjmp(); + * they are really private to child_main. + */ + +static int requests_this_child; +static int num_listensocks = 0; +static ap_listen_rec *listensocks; + +int ap_graceful_stop_signalled(void) +{ + /* not ever called anymore... */ + return 0; +} + + +static void child_main(int child_num_arg) +{ + apr_pool_t *ptrans; + apr_allocator_t *allocator; + conn_rec *current_conn; + apr_status_t status = APR_EINIT; + int i; + ap_listen_rec *lr; + int curr_pollfd, last_pollfd = 0; + apr_pollfd_t *pollset; + int offset; + void *csd; + ap_sb_handle_t *sbh; + apr_status_t rv; + apr_bucket_alloc_t *bucket_alloc; + + mpm_state = AP_MPMQ_STARTING; /* for benefit of any hooks that run as this + * child initializes + */ + + my_child_num = child_num_arg; + ap_my_pid = getpid(); + csd = NULL; + requests_this_child = 0; + + ap_fatal_signal_child_setup(ap_server_conf); + + /* Get a sub context for global allocations in this child, so that + * we can have cleanups occur when the child exits. + */ + apr_allocator_create(&allocator); + apr_allocator_max_free_set(allocator, ap_max_mem_free); + apr_pool_create_ex(&pchild, pconf, NULL, allocator); + apr_allocator_owner_set(allocator, pchild); + + apr_pool_create(&ptrans, pchild); + apr_pool_tag(ptrans, "transaction"); + + /* needs to be done before we switch UIDs so we have permissions */ + ap_reopen_scoreboard(pchild, NULL, 0); + rv = apr_proc_mutex_child_init(&accept_mutex, ap_lock_fname, pchild); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_EMERG, rv, ap_server_conf, + "Couldn't initialize cross-process lock in child"); + clean_child_exit(APEXIT_CHILDFATAL); + } + + if (unixd_setup_child()) { + clean_child_exit(APEXIT_CHILDFATAL); + } + + ap_run_child_init(pchild, ap_server_conf); + + ap_create_sb_handle(&sbh, pchild, my_child_num, 0); + + (void) ap_update_child_status(sbh, SERVER_READY, (request_rec *) NULL); + + /* Set up the pollfd array */ + listensocks = apr_pcalloc(pchild, + sizeof(*listensocks) * (num_listensocks)); + for (lr = ap_listeners, i = 0; i < num_listensocks; lr = lr->next, i++) { + listensocks[i].accept_func = lr->accept_func; + listensocks[i].sd = lr->sd; + } + + pollset = apr_palloc(pchild, sizeof(*pollset) * num_listensocks); + pollset[0].p = pchild; + for (i = 0; i < num_listensocks; i++) { + pollset[i].desc.s = listensocks[i].sd; + pollset[i].desc_type = APR_POLL_SOCKET; + pollset[i].reqevents = APR_POLLIN; + } + + mpm_state = AP_MPMQ_RUNNING; + + bucket_alloc = apr_bucket_alloc_create(pchild); + + while (!die_now) { + /* + * (Re)initialize this child to a pre-connection state. + */ + + current_conn = NULL; + + apr_pool_clear(ptrans); + + if ((ap_max_requests_per_child > 0 + && requests_this_child++ >= ap_max_requests_per_child)) { + clean_child_exit(0); + } + + (void) ap_update_child_status(sbh, SERVER_READY, (request_rec *) NULL); + + /* + * Wait for an acceptable connection to arrive. + */ + + /* Lock around "accept", if necessary */ + SAFE_ACCEPT(accept_mutex_on()); + + if (num_listensocks == 1) { + offset = 0; + } + else { + /* multiple listening sockets - need to poll */ + for (;;) { + apr_status_t ret; + apr_int32_t n; + + ret = apr_poll(pollset, num_listensocks, &n, -1); + if (ret != APR_SUCCESS) { + if (APR_STATUS_IS_EINTR(ret)) { + continue; + } + /* Single Unix documents select as returning errnos + * EBADF, EINTR, and EINVAL... and in none of those + * cases does it make sense to continue. In fact + * on Linux 2.0.x we seem to end up with EFAULT + * occasionally, and we'd loop forever due to it. + */ + ap_log_error(APLOG_MARK, APLOG_ERR, ret, ap_server_conf, + "apr_poll: (listen)"); + clean_child_exit(1); + } + /* find a listener */ + curr_pollfd = last_pollfd; + do { + curr_pollfd++; + if (curr_pollfd >= num_listensocks) { + curr_pollfd = 0; + } + /* XXX: Should we check for POLLERR? */ + if (pollset[curr_pollfd].rtnevents & APR_POLLIN) { + last_pollfd = curr_pollfd; + offset = curr_pollfd; + goto got_fd; + } + } while (curr_pollfd != last_pollfd); + + continue; + } + } + got_fd: + /* if we accept() something we don't want to die, so we have to + * defer the exit + */ + status = listensocks[offset].accept_func(&csd, + &listensocks[offset], ptrans); + SAFE_ACCEPT(accept_mutex_off()); /* unlock after "accept" */ + + if (status == APR_EGENERAL) { + /* resource shortage or should-not-occur occured */ + clean_child_exit(1); + } + else if (status != APR_SUCCESS) { + continue; + } + + /* + * We now have a connection, so set it up with the appropriate + * socket options, file descriptors, and read/write buffers. + */ + + current_conn = ap_run_create_connection(ptrans, ap_server_conf, csd, my_child_num, sbh, bucket_alloc); + if (current_conn) { + ap_process_connection(current_conn, csd); + ap_lingering_close(current_conn); + } + + /* Check the pod and the generation number after processing a + * connection so that we'll go away if a graceful restart occurred + * while we were processing the connection or we are the lucky + * idle server process that gets to die. + */ + if (ap_mpm_pod_check(pod) == APR_SUCCESS) { /* selected as idle? */ + die_now = 1; + } + else if (ap_my_generation != + ap_scoreboard_image->global->running_generation) { /* restart? */ + /* yeah, this could be non-graceful restart, in which case the + * parent will kill us soon enough, but why bother checking? + */ + die_now = 1; + } + } + clean_child_exit(0); +} + + +static int make_child(server_rec *s, int slot) +{ + int pid; + + if (slot + 1 > ap_max_daemons_limit) { + ap_max_daemons_limit = slot + 1; + } + + if (one_process) { + apr_signal(SIGHUP, just_die); + /* Don't catch AP_SIG_GRACEFUL in ONE_PROCESS mode :) */ + apr_signal(SIGINT, just_die); +#ifdef SIGQUIT + apr_signal(SIGQUIT, SIG_DFL); +#endif + apr_signal(SIGTERM, just_die); + child_main(slot); + } + + (void) ap_update_child_status_from_indexes(slot, 0, SERVER_STARTING, + (request_rec *) NULL); + + +#ifdef _OSD_POSIX + /* BS2000 requires a "special" version of fork() before a setuid() call */ + if ((pid = os_fork(unixd_config.user_name)) == -1) { +#elif defined(TPF) + if ((pid = os_fork(s, slot)) == -1) { +#else + if ((pid = fork()) == -1) { +#endif + ap_log_error(APLOG_MARK, APLOG_ERR, errno, s, "fork: Unable to fork new process"); + + /* fork didn't succeed. Fix the scoreboard or else + * it will say SERVER_STARTING forever and ever + */ + (void) ap_update_child_status_from_indexes(slot, 0, SERVER_DEAD, + (request_rec *) NULL); + + /* In case system resources are maxxed out, we don't want + Apache running away with the CPU trying to fork over and + over and over again. */ + sleep(10); + + return -1; + } + + if (!pid) { +#ifdef HAVE_BINDPROCESSOR + /* by default AIX binds to a single processor + * this bit unbinds children which will then bind to another cpu + */ + int status = bindprocessor(BINDPROCESS, (int)getpid(), + PROCESSOR_CLASS_ANY); + if (status != OK) { + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, + ap_server_conf, "processor unbind failed %d", status); + } +#endif + RAISE_SIGSTOP(MAKE_CHILD); + AP_MONCONTROL(1); + /* Disable the parent's signal handlers and set up proper handling in + * the child. + */ + apr_signal(SIGHUP, just_die); + apr_signal(SIGTERM, just_die); + /* The child process doesn't do anything for AP_SIG_GRACEFUL. + * Instead, the pod is used for signalling graceful restart. + */ + apr_signal(AP_SIG_GRACEFUL, SIG_IGN); + child_main(slot); + } + + ap_scoreboard_image->parent[slot].pid = pid; + + return 0; +} + + +/* start up a bunch of children */ +static void startup_children(int number_to_start) +{ + int i; + + for (i = 0; number_to_start && i < ap_daemons_limit; ++i) { + if (ap_scoreboard_image->servers[i][0].status != SERVER_DEAD) { + continue; + } + if (make_child(ap_server_conf, i) < 0) { + break; + } + --number_to_start; + } +} + + +/* + * idle_spawn_rate is the number of children that will be spawned on the + * next maintenance cycle if there aren't enough idle servers. It is + * doubled up to MAX_SPAWN_RATE, and reset only when a cycle goes by + * without the need to spawn. + */ +static int idle_spawn_rate = 1; +#ifndef MAX_SPAWN_RATE +#define MAX_SPAWN_RATE (32) +#endif +static int hold_off_on_exponential_spawning; + +static void perform_idle_server_maintenance(apr_pool_t *p) +{ + int i; + int to_kill; + int idle_count; + worker_score *ws; + int free_length; + int free_slots[MAX_SPAWN_RATE]; + int last_non_dead; + int total_non_dead; + + /* initialize the free_list */ + free_length = 0; + + to_kill = -1; + idle_count = 0; + last_non_dead = -1; + total_non_dead = 0; + + for (i = 0; i < ap_daemons_limit; ++i) { + int status; + + if (i >= ap_max_daemons_limit && free_length == idle_spawn_rate) + break; + ws = &ap_scoreboard_image->servers[i][0]; + status = ws->status; + if (status == SERVER_DEAD) { + /* try to keep children numbers as low as possible */ + if (free_length < idle_spawn_rate) { + free_slots[free_length] = i; + ++free_length; + } + } + else { + /* We consider a starting server as idle because we started it + * at least a cycle ago, and if it still hasn't finished starting + * then we're just going to swamp things worse by forking more. + * So we hopefully won't need to fork more if we count it. + * This depends on the ordering of SERVER_READY and SERVER_STARTING. + */ + if (status <= SERVER_READY) { + ++ idle_count; + /* always kill the highest numbered child if we have to... + * no really well thought out reason ... other than observing + * the server behaviour under linux where lower numbered children + * tend to service more hits (and hence are more likely to have + * their data in cpu caches). + */ + to_kill = i; + } + + ++total_non_dead; + last_non_dead = i; + } + } + ap_max_daemons_limit = last_non_dead + 1; + if (idle_count > ap_daemons_max_free) { + /* kill off one child... we use the pod because that'll cause it to + * shut down gracefully, in case it happened to pick up a request + * while we were counting + */ + ap_mpm_pod_signal(pod); + idle_spawn_rate = 1; + } + else if (idle_count < ap_daemons_min_free) { + /* terminate the free list */ + if (free_length == 0) { + /* only report this condition once */ + static int reported = 0; + + if (!reported) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, ap_server_conf, + "server reached MaxClients setting, consider" + " raising the MaxClients setting"); + reported = 1; + } + idle_spawn_rate = 1; + } + else { + if (idle_spawn_rate >= 8) { + ap_log_error(APLOG_MARK, APLOG_INFO, 0, ap_server_conf, + "server seems busy, (you may need " + "to increase StartServers, or Min/MaxSpareServers), " + "spawning %d children, there are %d idle, and " + "%d total children", idle_spawn_rate, + idle_count, total_non_dead); + } + for (i = 0; i < free_length; ++i) { +#ifdef TPF + if (make_child(ap_server_conf, free_slots[i]) == -1) { + if(free_length == 1) { + shutdown_pending = 1; + ap_log_error(APLOG_MARK, APLOG_EMERG, 0, ap_server_conf, + "No active child processes: shutting down"); + } + } +#else + make_child(ap_server_conf, free_slots[i]); +#endif /* TPF */ + } + /* the next time around we want to spawn twice as many if this + * wasn't good enough, but not if we've just done a graceful + */ + if (hold_off_on_exponential_spawning) { + --hold_off_on_exponential_spawning; + } + else if (idle_spawn_rate < MAX_SPAWN_RATE) { + idle_spawn_rate *= 2; + } + } + } + else { + idle_spawn_rate = 1; + } +} + +/***************************************************************** + * Executive routines. + */ + +int ap_mpm_run(apr_pool_t *_pconf, apr_pool_t *plog, server_rec *s) +{ + int index; + int remaining_children_to_start; + apr_status_t rv; + + ap_log_pid(pconf, ap_pid_fname); + + first_server_limit = server_limit; + if (changed_limit_at_restart) { + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s, + "WARNING: Attempt to change ServerLimit " + "ignored during restart"); + changed_limit_at_restart = 0; + } + + /* Initialize cross-process accept lock */ + ap_lock_fname = apr_psprintf(_pconf, "%s.%" APR_PID_T_FMT, + ap_server_root_relative(_pconf, ap_lock_fname), + ap_my_pid); + + rv = apr_proc_mutex_create(&accept_mutex, ap_lock_fname, + ap_accept_lock_mech, _pconf); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_EMERG, rv, s, + "Couldn't create accept lock"); + mpm_state = AP_MPMQ_STOPPING; + return 1; + } + +#if APR_USE_SYSVSEM_SERIALIZE + if (ap_accept_lock_mech == APR_LOCK_DEFAULT || + ap_accept_lock_mech == APR_LOCK_SYSVSEM) { +#else + if (ap_accept_lock_mech == APR_LOCK_SYSVSEM) { +#endif + rv = unixd_set_proc_mutex_perms(accept_mutex); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_EMERG, rv, s, + "Couldn't set permissions on cross-process lock; " + "check User and Group directives"); + mpm_state = AP_MPMQ_STOPPING; + return 1; + } + } + + if (!is_graceful) { + if (ap_run_pre_mpm(s->process->pool, SB_SHARED) != OK) { + mpm_state = AP_MPMQ_STOPPING; + return 1; + } + /* fix the generation number in the global score; we just got a new, + * cleared scoreboard + */ + ap_scoreboard_image->global->running_generation = ap_my_generation; + } + + set_signals(); + + if (one_process) { + AP_MONCONTROL(1); + } + + if (ap_daemons_max_free < ap_daemons_min_free + 1) /* Don't thrash... */ + ap_daemons_max_free = ap_daemons_min_free + 1; + + /* If we're doing a graceful_restart then we're going to see a lot + * of children exiting immediately when we get into the main loop + * below (because we just sent them AP_SIG_GRACEFUL). This happens pretty + * rapidly... and for each one that exits we'll start a new one until + * we reach at least daemons_min_free. But we may be permitted to + * start more than that, so we'll just keep track of how many we're + * supposed to start up without the 1 second penalty between each fork. + */ + remaining_children_to_start = ap_daemons_to_start; + if (remaining_children_to_start > ap_daemons_limit) { + remaining_children_to_start = ap_daemons_limit; + } + if (!is_graceful) { + startup_children(remaining_children_to_start); + remaining_children_to_start = 0; + } + else { + /* give the system some time to recover before kicking into + * exponential mode */ + hold_off_on_exponential_spawning = 10; + } + + ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, ap_server_conf, + "%s configured -- resuming normal operations", + ap_get_server_version()); + ap_log_error(APLOG_MARK, APLOG_INFO, 0, ap_server_conf, + "Server built: %s", ap_get_server_built()); +#ifdef AP_MPM_WANT_SET_ACCEPT_LOCK_MECH + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, ap_server_conf, + "AcceptMutex: %s (default: %s)", + apr_proc_mutex_name(accept_mutex), + apr_proc_mutex_defname()); +#endif + restart_pending = shutdown_pending = 0; + + mpm_state = AP_MPMQ_RUNNING; + + while (!restart_pending && !shutdown_pending) { + int child_slot; + apr_exit_why_e exitwhy; + int status, processed_status; + /* this is a memory leak, but I'll fix it later. */ + apr_proc_t pid; + + ap_wait_or_timeout(&exitwhy, &status, &pid, pconf); + + /* XXX: if it takes longer than 1 second for all our children + * to start up and get into IDLE state then we may spawn an + * extra child + */ + if (pid.pid != -1) { + processed_status = ap_process_child_status(&pid, exitwhy, status); + if (processed_status == APEXIT_CHILDFATAL) { + mpm_state = AP_MPMQ_STOPPING; + return 1; + } + + /* non-fatal death... note that it's gone in the scoreboard. */ + child_slot = find_child_by_pid(&pid); + if (child_slot >= 0) { + (void) ap_update_child_status_from_indexes(child_slot, 0, SERVER_DEAD, + (request_rec *) NULL); + if (processed_status == APEXIT_CHILDSICK) { + /* child detected a resource shortage (E[NM]FILE, ENOBUFS, etc) + * cut the fork rate to the minimum + */ + idle_spawn_rate = 1; + } + else if (remaining_children_to_start + && child_slot < ap_daemons_limit) { + /* we're still doing a 1-for-1 replacement of dead + * children with new children + */ + make_child(ap_server_conf, child_slot); + --remaining_children_to_start; + } +#if APR_HAS_OTHER_CHILD + } + else if (apr_proc_other_child_read(&pid, status) == 0) { + /* handled */ +#endif + } + else if (is_graceful) { + /* Great, we've probably just lost a slot in the + * scoreboard. Somehow we don't know about this + * child. + */ + ap_log_error(APLOG_MARK, APLOG_WARNING, + 0, ap_server_conf, + "long lost child came home! (pid %ld)", (long)pid.pid); + } + /* Don't perform idle maintenance when a child dies, + * only do it when there's a timeout. Remember only a + * finite number of children can die, and it's pretty + * pathological for a lot to die suddenly. + */ + continue; + } + else if (remaining_children_to_start) { + /* we hit a 1 second timeout in which none of the previous + * generation of children needed to be reaped... so assume + * they're all done, and pick up the slack if any is left. + */ + startup_children(remaining_children_to_start); + remaining_children_to_start = 0; + /* In any event we really shouldn't do the code below because + * few of the servers we just started are in the IDLE state + * yet, so we'd mistakenly create an extra server. + */ + continue; + } + + perform_idle_server_maintenance(pconf); +#ifdef TPF + shutdown_pending = os_check_server(tpf_server_name); + ap_check_signals(); + sleep(1); +#endif /*TPF */ + } + + mpm_state = AP_MPMQ_STOPPING; + + if (shutdown_pending) { + /* Time to gracefully shut down: + * Kill child processes, tell them to call child_exit, etc... + */ + if (unixd_killpg(getpgrp(), SIGTERM) < 0) { + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, "killpg SIGTERM"); + } + ap_reclaim_child_processes(1); /* Start with SIGTERM */ + + /* cleanup pid file on normal shutdown */ + { + const char *pidfile = NULL; + pidfile = ap_server_root_relative (pconf, ap_pid_fname); + if ( pidfile != NULL && unlink(pidfile) == 0) + ap_log_error(APLOG_MARK, APLOG_INFO, + 0, ap_server_conf, + "removed PID file %s (pid=%ld)", + pidfile, (long)getpid()); + } + + ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, ap_server_conf, + "caught SIGTERM, shutting down"); + return 1; + } + + /* we've been told to restart */ + apr_signal(SIGHUP, SIG_IGN); + if (one_process) { + /* not worth thinking about */ + return 1; + } + + /* advance to the next generation */ + /* XXX: we really need to make sure this new generation number isn't in + * use by any of the children. + */ + ++ap_my_generation; + ap_scoreboard_image->global->running_generation = ap_my_generation; + + if (is_graceful) { + ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, ap_server_conf, + "Graceful restart requested, doing restart"); + + /* kill off the idle ones */ + ap_mpm_pod_killpg(pod, ap_max_daemons_limit); + + /* This is mostly for debugging... so that we know what is still + * gracefully dealing with existing request. This will break + * in a very nasty way if we ever have the scoreboard totally + * file-based (no shared memory) + */ + for (index = 0; index < ap_daemons_limit; ++index) { + if (ap_scoreboard_image->servers[index][0].status != SERVER_DEAD) { + ap_scoreboard_image->servers[index][0].status = SERVER_GRACEFUL; + } + } + } + else { + /* Kill 'em off */ + if (unixd_killpg(getpgrp(), SIGHUP) < 0) { + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, "killpg SIGHUP"); + } + ap_reclaim_child_processes(0); /* Not when just starting up */ + ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, ap_server_conf, + "SIGHUP received. Attempting to restart"); + } + + return 0; +} + +/* This really should be a post_config hook, but the error log is already + * redirected by that point, so we need to do this in the open_logs phase. + */ +static int prefork_open_logs(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s) +{ + apr_status_t rv; + + pconf = p; + ap_server_conf = s; + + if ((num_listensocks = ap_setup_listeners(ap_server_conf)) < 1) { + ap_log_error(APLOG_MARK, APLOG_ALERT|APLOG_STARTUP, 0, + NULL, "no listening sockets available, shutting down"); + return DONE; + } + + if ((rv = ap_mpm_pod_open(pconf, &pod))) { + ap_log_error(APLOG_MARK, APLOG_CRIT|APLOG_STARTUP, rv, NULL, + "Could not open pipe-of-death."); + return DONE; + } + return OK; +} + +static int prefork_pre_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp) +{ + static int restart_num = 0; + int no_detach, debug, foreground; + apr_status_t rv; + + mpm_state = AP_MPMQ_STARTING; + + debug = ap_exists_config_define("DEBUG"); + + if (debug) { + foreground = one_process = 1; + no_detach = 0; + } + else + { + no_detach = ap_exists_config_define("NO_DETACH"); + one_process = ap_exists_config_define("ONE_PROCESS"); + foreground = ap_exists_config_define("FOREGROUND"); + } + + /* sigh, want this only the second time around */ + if (restart_num++ == 1) { + is_graceful = 0; + + if (!one_process && !foreground) { + rv = apr_proc_detach(no_detach ? APR_PROC_DETACH_FOREGROUND + : APR_PROC_DETACH_DAEMONIZE); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_CRIT, rv, NULL, + "apr_proc_detach failed"); + return HTTP_INTERNAL_SERVER_ERROR; + } + } + + parent_pid = ap_my_pid = getpid(); + } + + unixd_pre_config(ptemp); + ap_listen_pre_config(); + ap_daemons_to_start = DEFAULT_START_DAEMON; + ap_daemons_min_free = DEFAULT_MIN_FREE_DAEMON; + ap_daemons_max_free = DEFAULT_MAX_FREE_DAEMON; + ap_daemons_limit = server_limit; + ap_pid_fname = DEFAULT_PIDLOG; + ap_lock_fname = DEFAULT_LOCKFILE; + ap_max_requests_per_child = DEFAULT_MAX_REQUESTS_PER_CHILD; + ap_extended_status = 0; +#ifdef AP_MPM_WANT_SET_MAX_MEM_FREE + ap_max_mem_free = APR_ALLOCATOR_MAX_FREE_UNLIMITED; +#endif + + apr_cpystrn(ap_coredump_dir, ap_server_root, sizeof(ap_coredump_dir)); + + return OK; +} + +static void prefork_hooks(apr_pool_t *p) +{ + /* The prefork open_logs phase must run before the core's, or stderr + * will be redirected to a file, and the messages won't print to the + * console. + */ + static const char *const aszSucc[] = {"core.c", NULL}; + +#ifdef AUX3 + (void) set42sig(); +#endif + + ap_hook_open_logs(prefork_open_logs, NULL, aszSucc, APR_HOOK_MIDDLE); + /* we need to set the MPM state before other pre-config hooks use MPM query + * to retrieve it, so register as REALLY_FIRST + */ + ap_hook_pre_config(prefork_pre_config, NULL, NULL, APR_HOOK_REALLY_FIRST); +} + +static const char *set_daemons_to_start(cmd_parms *cmd, void *dummy, const char *arg) +{ + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + ap_daemons_to_start = atoi(arg); + return NULL; +} + +static const char *set_min_free_servers(cmd_parms *cmd, void *dummy, const char *arg) +{ + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + ap_daemons_min_free = atoi(arg); + if (ap_daemons_min_free <= 0) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: detected MinSpareServers set to non-positive."); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "Resetting to 1 to avoid almost certain Apache failure."); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "Please read the documentation."); + ap_daemons_min_free = 1; + } + + return NULL; +} + +static const char *set_max_free_servers(cmd_parms *cmd, void *dummy, const char *arg) +{ + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + ap_daemons_max_free = atoi(arg); + return NULL; +} + +static const char *set_max_clients (cmd_parms *cmd, void *dummy, const char *arg) +{ + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + ap_daemons_limit = atoi(arg); + if (ap_daemons_limit > server_limit) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: MaxClients of %d exceeds ServerLimit value " + "of %d servers,", ap_daemons_limit, server_limit); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " lowering MaxClients to %d. To increase, please " + "see the ServerLimit", server_limit); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " directive."); + ap_daemons_limit = server_limit; + } + else if (ap_daemons_limit < 1) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: Require MaxClients > 0, setting to 1"); + ap_daemons_limit = 1; + } + return NULL; +} + +static const char *set_server_limit (cmd_parms *cmd, void *dummy, const char *arg) +{ + int tmp_server_limit; + + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + tmp_server_limit = atoi(arg); + /* you cannot change ServerLimit across a restart; ignore + * any such attempts + */ + if (first_server_limit && + tmp_server_limit != server_limit) { + /* how do we log a message? the error log is a bit bucket at this + * point; we'll just have to set a flag so that ap_mpm_run() + * logs a warning later + */ + changed_limit_at_restart = 1; + return NULL; + } + server_limit = tmp_server_limit; + + if (server_limit > MAX_SERVER_LIMIT) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: ServerLimit of %d exceeds compile time limit " + "of %d servers,", server_limit, MAX_SERVER_LIMIT); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " lowering ServerLimit to %d.", MAX_SERVER_LIMIT); + server_limit = MAX_SERVER_LIMIT; + } + else if (server_limit < 1) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: Require ServerLimit > 0, setting to 1"); + server_limit = 1; + } + return NULL; +} + +static const command_rec prefork_cmds[] = { +UNIX_DAEMON_COMMANDS, +LISTEN_COMMANDS, +AP_INIT_TAKE1("StartServers", set_daemons_to_start, NULL, RSRC_CONF, + "Number of child processes launched at server startup"), +AP_INIT_TAKE1("MinSpareServers", set_min_free_servers, NULL, RSRC_CONF, + "Minimum number of idle children, to handle request spikes"), +AP_INIT_TAKE1("MaxSpareServers", set_max_free_servers, NULL, RSRC_CONF, + "Maximum number of idle children"), +AP_INIT_TAKE1("MaxClients", set_max_clients, NULL, RSRC_CONF, + "Maximum number of children alive at the same time"), +AP_INIT_TAKE1("ServerLimit", set_server_limit, NULL, RSRC_CONF, + "Maximum value of MaxClients for this run of Apache"), +{ NULL } +}; + +module AP_MODULE_DECLARE_DATA mpm_prefork_module = { + MPM20_MODULE_STUFF, + ap_mpm_rewrite_args, /* hook to run before apache parses args */ + NULL, /* create per-directory config structure */ + NULL, /* merge per-directory config structures */ + NULL, /* create per-server config structure */ + NULL, /* merge per-server config structures */ + prefork_cmds, /* command apr_table_t */ + prefork_hooks, /* register hooks */ +}; diff --git a/rubbos/app/httpd-2.0.64/server/mpm/winnt/Win9xConHook.c b/rubbos/app/httpd-2.0.64/server/mpm/winnt/Win9xConHook.c new file mode 100644 index 00000000..a352dd1b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/winnt/Win9xConHook.c @@ -0,0 +1,697 @@ +/* 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. + */ + +#ifdef WIN32 + +/* + * Win9xConHook.dll - a hook proc to clean up Win95/98 console behavior. + * + * It is well(?) documented by Microsoft that the Win9x HandlerRoutine + * hooked by the SetConsoleCtrlHandler never receives the CTRL_CLOSE_EVENT, + * CTRL_LOGOFF_EVENT or CTRL_SHUTDOWN_EVENT signals. + * + * It is possible to have a second window to monitor the WM_ENDSESSION + * message, but the close button still fails.. + * + * There is a 16bit polling method for the close window option, but this + * is CPU intensive and requires thunking. + * + * Attempts to subclass the 'tty' console fail, since that message thread + * is actually owned by the 16 bit winoldap.mod process, although the + * window reports it is owned by the process/thread of the console app. + * + * Win9xConHook is thunks the WM_CLOSE and WM_ENDSESSION messages, + * first through a window hook procedure in the winoldap context, into + * a subclass WndProc, and on to a second hidden monitor window in the + * console application's context that dispatches them to the console app's + * registered HandlerRoutine. + */ + +/* This debugging define turns on output to COM1, although you better init + * the port first (even using hyperterm). It's the only way to catch the + * goings on within system logoff/shutdown. + * #define DBG 1 + */ + +#include + +/* Variables used within any process context: + * hookwndmsg is a shared message to send Win9xConHook signals + * origwndprop is a wndprop atom to store the orig wndproc of the tty + * hookwndprop is a wndprop atom to store the hwnd of the hidden child + * is_service reminds us to unmark this process on the way out + */ +static UINT hookwndmsg = 0; +static LPCTSTR origwndprop; +static LPCTSTR hookwndprop; +static BOOL is_service = 0; +//static HMODULE hmodThis = NULL; + +/* Variables used within the tty processes' context: + * is_tty flags this process; -1 == unknown, 1 == if tty, 0 == if not + * hw_tty is the handle of the top level tty in this process context + * is_subclassed is toggled to assure DllMain removes the subclass on unload + * hmodLock is there to try and prevent this dll from being unloaded if the + * hook is removed while we are subclassed + */ +static int is_tty = -1; +static HWND hwtty = NULL; +static BOOL is_subclassed = 0; + +// This simply causes a gpfault the moment it tries to FreeLibrary within +// the subclass procedure ... not good. +//static HMODULE hmodLock = NULL; + +/* Variables used within the service or console app's context: + * hmodHook is the instance handle of this module for registering the hooks + * hhkGetMessage is the hook handle for catching Posted messages + * hhkGetMessage is the hook handle for catching Sent messages + * monitor_hwnd is the invisible window that handles our tty messages + * the tty_info strucure is used to pass args into the hidden window's thread + */ +static HMODULE hmodHook = NULL; +static HHOOK hhkGetMessage; +//static HHOOK hhkCallWndProc; +static HWND monitor_hwnd = NULL; + +typedef struct { + PHANDLER_ROUTINE phandler; + HINSTANCE instance; + HWND parent; + INT type; + LPCSTR name; +} tty_info; + +/* These are the GetWindowLong offsets for the hidden window's internal info + * gwltty_phandler is the address of the app's HandlerRoutine + * gwltty_ttywnd is the tty this hidden window will handle messages from + */ +#define gwltty_phandler 0 +#define gwltty_ttywnd 4 + +/* Forward declaration prototypes for internal functions + */ +static BOOL CALLBACK EnumttyWindow(HWND wnd, LPARAM retwnd); +static LRESULT WINAPI RegisterWindows9xService(BOOL set_service); +static LRESULT CALLBACK ttyConsoleCtrlWndProc(HWND hwnd, UINT msg, + WPARAM wParam, LPARAM lParam); +static DWORD WINAPI ttyConsoleCtrlThread(LPVOID tty); +static LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, + WPARAM wParam, LPARAM lParam); +static int HookProc(int hc, HWND *hwnd, UINT *msg, + WPARAM *wParam, LPARAM *lParam); +#ifdef DBG +static VOID DbgPrintf(LPTSTR fmt, ...); +#endif + + +/* DllMain is invoked by every process in the entire system that is hooked + * by our window hooks, notably the tty processes' context, and by the user + * who wants tty messages (the app). Keep it light and simple. + */ +BOOL __declspec(dllexport) APIENTRY DllMain(HINSTANCE hModule, ULONG ulReason, + LPVOID pctx) +{ + if (ulReason == DLL_PROCESS_ATTACH) + { + //hmodThis = hModule; + if (!hookwndmsg) { + origwndprop = MAKEINTATOM(GlobalAddAtom("Win9xConHookOrigProc")); + hookwndprop = MAKEINTATOM(GlobalAddAtom("Win9xConHookThunkWnd")); + hookwndmsg = RegisterWindowMessage("Win9xConHookMsg"); + } +#ifdef DBG +// DbgPrintf("H ProcessAttach:%8.8x\r\n", +// GetCurrentProcessId()); +#endif + } + else if ( ulReason == DLL_PROCESS_DETACH ) + { +#ifdef DBG +// DbgPrintf("H ProcessDetach:%8.8x\r\n", GetCurrentProcessId()); +#endif + if (monitor_hwnd) + SendMessage(monitor_hwnd, WM_DESTROY, 0, 0); + if (is_subclassed) + SendMessage(hwtty, hookwndmsg, 0, (LPARAM)hwtty); + if (hmodHook) + { + if (hhkGetMessage) { + UnhookWindowsHookEx(hhkGetMessage); + hhkGetMessage = NULL; + } + //if (hhkCallWndProc) { + // UnhookWindowsHookEx(hhkCallWndProc); + // hhkCallWndProc = NULL; + //} + FreeLibrary(hmodHook); + hmodHook = NULL; + } + if (is_service) + RegisterWindows9xService(FALSE); + if (hookwndmsg) { + GlobalDeleteAtom((ATOM)origwndprop); + GlobalDeleteAtom((ATOM)hookwndprop); + hookwndmsg = 0; + } + } + return TRUE; +} + + +/* This group of functions are provided for the service/console app + * to register itself a HandlerRoutine to accept tty or service messages + */ + + +/* Exported function that creates a Win9x 'service' via a hidden window, + * that notifies the process via the HandlerRoutine messages. + */ +BOOL __declspec(dllexport) WINAPI Windows9xServiceCtrlHandler( + PHANDLER_ROUTINE phandler, + LPCSTR name) +{ + /* If we have not yet done so */ + FreeConsole(); + + if (name) + { + DWORD tid; + HANDLE hThread; + /* NOTE: this is static so the module can continue to + * access these args while we go on to other things + */ + static tty_info tty; + tty.instance = GetModuleHandle(NULL); + tty.phandler = phandler; + tty.parent = NULL; + tty.name = name; + tty.type = 2; + RegisterWindows9xService(TRUE); + hThread = CreateThread(NULL, 0, ttyConsoleCtrlThread, + (LPVOID)&tty, 0, &tid); + if (hThread) + { + CloseHandle(hThread); + return TRUE; + } + } + else /* remove */ + { + if (monitor_hwnd) + SendMessage(monitor_hwnd, WM_DESTROY, 0, 0); + RegisterWindows9xService(FALSE); + return TRUE; + } + return FALSE; +} + + +/* Exported function that registers a HandlerRoutine to accept missing + * Win9x CTRL_EVENTs from the tty window, as NT does without a hassle. + * If add is 1 or 2, register the handler, if 2 also mark it as a service. + * If add is 0 deregister the handler, and unmark if a service + */ +BOOL __declspec(dllexport) WINAPI FixConsoleCtrlHandler( + PHANDLER_ROUTINE phandler, + INT add) +{ + HWND parent; + + if (add) + { + HANDLE hThread; + DWORD tid; + /* NOTE: this is static so the module can continue to + * access these args while we go on to other things + */ + static tty_info tty; + EnumWindows(EnumttyWindow, (LPARAM)&parent); + if (!parent) { +#ifdef DBG + DbgPrintf("A EnumttyWindow failed (%d)\r\n", GetLastError()); +#endif + return FALSE; + } + tty.instance = GetModuleHandle(NULL); + tty.phandler = phandler; + tty.parent = parent; + tty.type = add; + if (add == 2) { + tty.name = "ttyService"; + RegisterWindows9xService(TRUE); + } + else + tty.name = "ttyMonitor"; + hThread = CreateThread(NULL, 0, ttyConsoleCtrlThread, + (LPVOID)&tty, 0, &tid); + if (!hThread) + return FALSE; + CloseHandle(hThread); + hmodHook = LoadLibrary("Win9xConHook.dll"); + if (hmodHook) + { + hhkGetMessage = SetWindowsHookEx(WH_GETMESSAGE, + (HOOKPROC)GetProcAddress(hmodHook, "GetMsgProc"), hmodHook, 0); + //hhkCallWndProc = SetWindowsHookEx(WH_CALLWNDPROC, + // (HOOKPROC)GetProcAddress(hmodHook, "CallWndProc"), hmodHook, 0); + } + return TRUE; + } + else /* remove */ + { + if (monitor_hwnd) { + SendMessage(monitor_hwnd, WM_DESTROY, 0, 0); + } + if (hmodHook) + { + if (hhkGetMessage) { + UnhookWindowsHookEx(hhkGetMessage); + hhkGetMessage = NULL; + } + //if (hhkCallWndProc) { + // UnhookWindowsHookEx(hhkCallWndProc); + // hhkCallWndProc = NULL; + //} + FreeLibrary(hmodHook); + hmodHook = NULL; + } + if (is_service) + RegisterWindows9xService(FALSE); + return TRUE; + } + return FALSE; +} + + +/* The following internal helpers are only used within the app's context + */ + +/* ttyConsoleCreateThread is the process that runs within the user app's + * context. It creates and pumps the messages of a hidden monitor window, + * watching for messages from the system, or the associated subclassed tty + * window. Things can happen in our context that can't be done from the + * tty's context, and visa versa, so the subclass procedure and this hidden + * window work together to make it all happen. + */ +static DWORD WINAPI ttyConsoleCtrlThread(LPVOID tty) +{ + WNDCLASS wc; + MSG msg; + wc.style = CS_GLOBALCLASS; + wc.lpfnWndProc = ttyConsoleCtrlWndProc; + wc.cbClsExtra = 0; + wc.cbWndExtra = 8; + wc.hInstance = NULL; + wc.hIcon = NULL; + wc.hCursor = NULL; + wc.hbrBackground = NULL; + wc.lpszMenuName = NULL; + if (((tty_info*)tty)->parent) + wc.lpszClassName = "ttyConHookChild"; + else + wc.lpszClassName = "ApacheWin95ServiceMonitor"; + + if (!RegisterClass(&wc)) { +#ifdef DBG + DbgPrintf("A proc %8.8x Error creating class %s (%d)\r\n", + GetCurrentProcessId(), wc.lpszClassName, GetLastError()); +#endif + return 0; + } + + /* Create an invisible window */ + monitor_hwnd = CreateWindow(wc.lpszClassName, ((tty_info*)tty)->name, + WS_OVERLAPPED & ~WS_VISIBLE, + CW_USEDEFAULT, CW_USEDEFAULT, + CW_USEDEFAULT, CW_USEDEFAULT, + NULL, NULL, + ((tty_info*)tty)->instance, tty); + + if (!monitor_hwnd) { +#ifdef DBG + DbgPrintf("A proc %8.8x Error creating window %s %s (%d)\r\n", + GetCurrentProcessId(), wc.lpszClassName, + ((tty_info*)tty)->name, GetLastError()); +#endif + return 0; + } + + while (GetMessage(&msg, NULL, 0, 0)) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + + /* Tag again as deleted, just in case we missed WM_DESTROY */ + monitor_hwnd = NULL; + return 0; +} + + +/* This is the WndProc procedure for our invisible window. + * When our subclasssed tty window receives the WM_CLOSE, WM_ENDSESSION, + * or WM_QUERYENDSESSION messages, the message is dispatched to our hidden + * window (this message process), and we call the installed HandlerRoutine + * that was registered by the app. + */ +static LRESULT CALLBACK ttyConsoleCtrlWndProc(HWND hwnd, UINT msg, + WPARAM wParam, LPARAM lParam) +{ + if (msg == WM_CREATE) + { + tty_info *tty = (tty_info*)(((LPCREATESTRUCT)lParam)->lpCreateParams); + SetWindowLong(hwnd, gwltty_phandler, (LONG)tty->phandler); + SetWindowLong(hwnd, gwltty_ttywnd, (LONG)tty->parent); +#ifdef DBG + DbgPrintf("A proc %8.8x created %8.8x %s for tty wnd %8.8x\r\n", + GetCurrentProcessId(), hwnd, + tty->name, tty->parent); +#endif + if (tty->parent) { + SetProp(tty->parent, hookwndprop, hwnd); + PostMessage(tty->parent, hookwndmsg, + tty->type, (LPARAM)tty->parent); + } + return 0; + } + else if (msg == WM_DESTROY) + { + HWND parent = (HWND)GetWindowLong(hwnd, gwltty_ttywnd); +#ifdef DBG + DbgPrintf("A proc %8.8x destroyed %8.8x ttyConHookChild\r\n", + GetCurrentProcessId(), hwnd); +#endif + if (parent) { + RemoveProp(parent, hookwndprop); + SendMessage(parent, hookwndmsg, 0, (LPARAM)parent); + } + monitor_hwnd = NULL; + } + else if (msg == WM_CLOSE) + { + PHANDLER_ROUTINE phandler = + (PHANDLER_ROUTINE)GetWindowLong(hwnd, gwltty_phandler); + LRESULT rv = phandler(CTRL_CLOSE_EVENT); +#ifdef DBG + DbgPrintf("A proc %8.8x invoked CTRL_CLOSE_EVENT " + "returning %d\r\n", + GetCurrentProcessId(), rv); +#endif + if (rv) + return !rv; + } + else if ((msg == WM_QUERYENDSESSION) || (msg == WM_ENDSESSION)) + { + if (lParam & ENDSESSION_LOGOFF) + { + PHANDLER_ROUTINE phandler = + (PHANDLER_ROUTINE)GetWindowLong(hwnd, gwltty_phandler); + LRESULT rv = phandler(CTRL_LOGOFF_EVENT); +#ifdef DBG + DbgPrintf("A proc %8.8x invoked CTRL_LOGOFF_EVENT " + "returning %d\r\n", + GetCurrentProcessId(), rv); +#endif + if (rv) + return ((msg == WM_QUERYENDSESSION) ? rv : !rv); + } + else + { + PHANDLER_ROUTINE phandler = + (PHANDLER_ROUTINE)GetWindowLong(hwnd, gwltty_phandler); + LRESULT rv = phandler(CTRL_SHUTDOWN_EVENT); +#ifdef DBG + DbgPrintf("A proc %8.8x invoked CTRL_SHUTDOWN_EVENT " + "returning %d\r\n", GetCurrentProcessId(), rv); +#endif + if (rv) + return ((msg == WM_QUERYENDSESSION) ? rv : !rv); + } + } + return (DefWindowProc(hwnd, msg, wParam, lParam)); +} + + +/* The following internal helpers are invoked by the hooked tty and our app + */ + + +/* Register or deregister the current process as a Windows9x style service. + * Experience shows this call is ignored across processes, so the second + * arg to RegisterServiceProcess (process group id) is effectively useless. + */ +static LRESULT WINAPI RegisterWindows9xService(BOOL set_service) +{ + static HINSTANCE hkernel; + static DWORD (WINAPI *register_service_process)(DWORD, DWORD) = NULL; + BOOL rv; + + if (set_service == is_service) + return 1; + +#ifdef DBG + DbgPrintf("R %s proc %8.8x as a service\r\n", + set_service ? "installing" : "removing", + GetCurrentProcessId()); +#endif + + if (!register_service_process) + { + /* Obtain a handle to the kernel library */ + hkernel = LoadLibrary("KERNEL32.DLL"); + if (!hkernel) + return 0; + + /* Find the RegisterServiceProcess function */ + register_service_process = (DWORD (WINAPI *)(DWORD, DWORD)) + GetProcAddress(hkernel, "RegisterServiceProcess"); + if (register_service_process == NULL) { + FreeLibrary(hkernel); + return 0; + } + } + + /* Register this process as a service */ + rv = register_service_process(0, set_service != FALSE); + if (rv) + is_service = set_service; + + if (!is_service) + { + /* Unload the kernel library */ + FreeLibrary(hkernel); + register_service_process = NULL; + } + return rv; +} + + +/* + * This function only works when this process is the active process + * (e.g. once it is running a child process, it can no longer determine + * which console window is its own.) + */ +static BOOL CALLBACK EnumttyWindow(HWND wnd, LPARAM retwnd) +{ + char tmp[8]; + if (GetClassName(wnd, tmp, sizeof(tmp)) && !strcmp(tmp, "tty")) + { + DWORD wndproc, thisproc = GetCurrentProcessId(); + GetWindowThreadProcessId(wnd, &wndproc); + if (wndproc == thisproc) { + *((HWND*)retwnd) = wnd; + return FALSE; + } + } + return TRUE; +} + + +/* The remaining code all executes --in the tty's own process context-- + * + * That means special attention must be paid to what it's doing... + */ + +/* Subclass message process for the tty window + * + * This code -handles- WM_CLOSE, WM_ENDSESSION and WM_QUERYENDSESSION + * by dispatching them to the window identified by the hookwndprop + * property atom set against our window. Messages are then dispatched + * to origwndprop property atom we set against the window when we + * injected this subclass. This trick did not work with simply a hook. + */ +static LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, + WPARAM wParam, LPARAM lParam) +{ + WNDPROC origproc = (WNDPROC) GetProp(hwnd, origwndprop); + if (!origproc) + return 0; + + if (msg == WM_NCDESTROY + || (msg == hookwndmsg && !LOWORD(wParam) && (HWND)lParam == hwnd)) + { + if (is_subclassed) { +#ifdef DBG + DbgPrintf("W proc %08x hwnd:%08x Subclass removed\r\n", + GetCurrentProcessId(), hwnd); +#endif + if (is_service) + RegisterWindows9xService(FALSE); + SetWindowLong(hwnd, GWL_WNDPROC, (LONG)origproc); + RemoveProp(hwnd, origwndprop); + RemoveProp(hwnd, hookwndprop); + is_subclassed = FALSE; + //if (hmodLock) + // FreeLibrary(hmodLock); + //hmodLock = NULL; + } + } + else if (msg == WM_CLOSE || msg == WM_ENDSESSION + || msg == WM_QUERYENDSESSION) + { + HWND child = (HWND)GetProp(hwnd, hookwndprop); + if (child) { +#ifdef DBG + DbgPrintf("W proc %08x hwnd:%08x forwarded msg:%d\r\n", + GetCurrentProcessId(), hwnd, msg); +#endif + return SendMessage(child, msg, wParam, lParam); + } + } + return CallWindowProc(origproc, hwnd, msg, wParam, lParam); +} + + +/* HookProc, once installed, is responsible for subclassing the system + * tty windows. It generally does nothing special itself, since + * research indicates that it cannot deal well with the messages we are + * interested in, that is, WM_CLOSE, WM_QUERYSHUTDOWN and WM_SHUTDOWN + * of the tty process. + * + * Respond and subclass only when a WM_NULL is received by the window. + */ +int HookProc(int hc, HWND *hwnd, UINT *msg, WPARAM *wParam, LPARAM *lParam) +{ + if (is_tty == -1 && *hwnd) + { + char ttybuf[8]; + HWND htty; + hwtty = *hwnd; + while (htty = GetParent(hwtty)) + hwtty = htty; + is_tty = (GetClassName(hwtty, ttybuf, sizeof(ttybuf)) + && !strcmp(ttybuf, "tty")); +#ifdef DBG + if (is_tty) + DbgPrintf("H proc %08x tracking hwnd %08x\r\n", + GetCurrentProcessId(), hwtty); +#endif + } + + if (*msg == hookwndmsg && *wParam && *lParam == (LPARAM)hwtty && is_tty) + { + WNDPROC origproc = (WNDPROC)GetWindowLong(hwtty, GWL_WNDPROC); + //char myname[MAX_PATH]; + //if (GetModuleFileName(hmodThis, myname, sizeof(myname))) + // hmodLock = LoadLibrary(myname); + SetProp(hwtty, origwndprop, origproc); + SetWindowLong(hwtty, GWL_WNDPROC, (LONG)WndProc); + is_subclassed = TRUE; +#ifdef DBG + DbgPrintf("H proc %08x hwnd:%08x Subclassed\r\n", + GetCurrentProcessId(), hwtty); +#endif + if (LOWORD(*wParam) == 2) + RegisterWindows9xService(TRUE); + } + + return -1; +} + + +/* + * PostMessage Hook: + */ +LRESULT __declspec(dllexport) CALLBACK GetMsgProc(INT hc, WPARAM wParam, + LPARAM lParam) +{ + PMSG pmsg; + + pmsg = (PMSG)lParam; + + if (pmsg) { + int rv = HookProc(hc, &pmsg->hwnd, &pmsg->message, + &pmsg->wParam, &pmsg->lParam); + if (rv != -1) + return rv; + } + /* + * CallNextHookEx apparently ignores the hhook argument, so pass NULL + */ + return CallNextHookEx(NULL, hc, wParam, lParam); +} + + +/* + * SendMessage Hook: + */ +LRESULT __declspec(dllexport) CALLBACK CallWndProc(INT hc, WPARAM wParam, + LPARAM lParam) +{ + PCWPSTRUCT pcwps = (PCWPSTRUCT)lParam; + + if (pcwps) { + int rv = HookProc(hc, &pcwps->hwnd, &pcwps->message, + &pcwps->wParam, &pcwps->lParam); + if (rv != -1) + return rv; + } + /* + * CallNextHookEx apparently ignores the hhook argument, so pass NULL + */ + return CallNextHookEx(NULL, hc, wParam, lParam); +} + + +#ifdef DBG +VOID DbgPrintf( + LPTSTR fmt, + ... + ) +{ + static HANDLE mutex; + va_list marker; + TCHAR szBuf[256]; + DWORD t; + HANDLE gDbgOut; + + va_start(marker, fmt); + wvsprintf(szBuf, fmt, marker); + va_end(marker); + + if (!mutex) + mutex = CreateMutex(NULL, FALSE, "Win9xConHookDbgOut"); + WaitForSingleObject(mutex, INFINITE); + gDbgOut = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, + NULL, OPEN_EXISTING, FILE_FLAG_WRITE_THROUGH, NULL); + WriteFile(gDbgOut, szBuf, strlen(szBuf), &t, NULL); + CloseHandle(gDbgOut); + ReleaseMutex(mutex); +} +#endif + +#endif /* WIN32 */ diff --git a/rubbos/app/httpd-2.0.64/server/mpm/winnt/Win9xConHook.def b/rubbos/app/httpd-2.0.64/server/mpm/winnt/Win9xConHook.def new file mode 100644 index 00000000..85ec1664 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/winnt/Win9xConHook.def @@ -0,0 +1,10 @@ +LIBRARY Win9xConHook + +EXETYPE WINDOWS + +EXPORTS + DllMain + GetMsgProc + CallWndProc + FixConsoleCtrlHandler + Windows9xServiceCtrlHandler diff --git a/rubbos/app/httpd-2.0.64/server/mpm/winnt/Win9xConHook.dsp b/rubbos/app/httpd-2.0.64/server/mpm/winnt/Win9xConHook.dsp new file mode 100644 index 00000000..77cbacfc --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/winnt/Win9xConHook.dsp @@ -0,0 +1,103 @@ +# Microsoft Developer Studio Project File - Name="Win9xConHook" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=Win9xConHook - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "Win9xConHook.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 "Win9xConHook.mak" CFG="Win9xConHook - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "Win9xConHook - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "Win9xConHook - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "Win9xConHook - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir ".\Release" +# PROP BASE Intermediate_Dir ".\Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MD /W3 /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "SHARED_MODULE" /Fd"Release\Win9xConHook" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x809 /d "NDEBUG" +# ADD RSC /l 0x809 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib /nologo /subsystem:windows /dll /incremental:no /base:"0x1c0f0000" +# ADD LINK32 kernel32.lib user32.lib gdi32.lib /nologo /subsystem:windows /dll /incremental:no /base:"0x1c0f0000" /opt:ref + +!ELSEIF "$(CFG)" == "Win9xConHook - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "SHARED_MODULE" /Fd"Debug\Win9xConHook" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x809 /d "_DEBUG" +# ADD RSC /l 0x809 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib /nologo /subsystem:windows /dll /incremental:no /debug /base:"0x1c0f0000" +# ADD LINK32 kernel32.lib user32.lib gdi32.lib /nologo /subsystem:windows /dll /incremental:no /debug /base:"0x1c0f0000" + +!ENDIF + +# Begin Target + +# Name "Win9xConHook - Win32 Release" +# Name "Win9xConHook - Win32 Debug" +# Begin Source File + +SOURCE=.\Win9xConHook.c +# End Source File +# Begin Source File + +SOURCE=.\Win9xConHook.def +# End Source File +# Begin Source File + +SOURCE=.\Win9xConHook.h +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/server/mpm/winnt/Win9xConHook.h b/rubbos/app/httpd-2.0.64/server/mpm/winnt/Win9xConHook.h new file mode 100644 index 00000000..e3471034 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/winnt/Win9xConHook.h @@ -0,0 +1,57 @@ +/* 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. + */ + +#ifndef AP_WIN9XCONHOOK_H +#define AP_WIN9XCONHOOK_H + +#ifdef WIN32 + +/* Windows9xServiceCtrlHandler registers a handler routine, frees the + * console window, and registers this process as a service in Win9x. + * It creats a hidden window of class "ApacheWin95ServiceMonitor" + * and titled by the name passed, which passes the WM_SHUTDOWN message + * through the given HandlerRoutine's CTRL_SHUTDOWN event. + * Call with name of NULL to remove the Service handler. + */ +BOOL WINAPI Windows9xServiceCtrlHandler(PHANDLER_ROUTINE phandler, LPCSTR name); + + +/* FixConsoleControlHandler registers a handler routine with the + * Win9xConHook.dll, creating a hidden window and forwarding the + * WM_ENDSESSION and WM_CLOSE messages to the given HandlerRoutine + * as CTRL_SHUTDOWN_EVENT, CTRL_LOGOFF_EVENT and CTRL_CLOSE_EVENT. + * The application should still use SetConsoleCtrlHandler to grab + * the CTRL_BREAK_EVENT and CTRL_C_EVENT, if desired. + */ +BOOL WINAPI FixConsoleCtrlHandler(PHANDLER_ROUTINE phandler, BOOL add); + + +/* + * Exported PostMessage Hook, never use this directly: + * + * LRESULT CALLBACK GetMsgProc(INT hc, WPARAM wParam, LPARAM lParam); + */ + + +/* + * Exported SendMessage Hook, never use this directly: + * + * LRESULT CALLBACK CallWndProc(INT hc, WPARAM wParam, LPARAM lParam); + */ + +#endif /* WIN32 */ + +#endif AP_WIN9XCONHOOK_H diff --git a/rubbos/app/httpd-2.0.64/server/mpm/winnt/child.c b/rubbos/app/httpd-2.0.64/server/mpm/winnt/child.c new file mode 100644 index 00000000..266d0b3c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/winnt/child.c @@ -0,0 +1,1167 @@ +/* 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. + */ + +#ifdef WIN32 + +#define CORE_PRIVATE +#include "httpd.h" +#include "http_main.h" +#include "http_log.h" +#include "http_config.h" /* for read_config */ +#include "http_core.h" /* for get_remote_host */ +#include "http_connection.h" +#include "apr_portable.h" +#include "apr_thread_proc.h" +#include "apr_getopt.h" +#include "apr_strings.h" +#include "apr_lib.h" +#include "apr_shm.h" +#include "apr_thread_mutex.h" +#include "ap_mpm.h" +#include "ap_config.h" +#include "ap_listen.h" +#include "mpm_default.h" +#include "mpm_winnt.h" +#include "mpm_common.h" +#include +#include "apr_atomic.h" + +/* shared with mpm_winnt.c */ +extern DWORD my_pid; + +/* used by parent to signal the child to start and exit */ +/* shared with mpm_winnt.c, but should be private to child.c */ +apr_proc_mutex_t *start_mutex; +HANDLE exit_event; + +/* child_main() should never need to modify is_graceful!?! */ +extern int volatile is_graceful; + +/* Queue for managing the passing of COMP_CONTEXTs between + * the accept and worker threads. + */ +static apr_pool_t *pchild; +static int shutdown_in_progress = 0; +static int workers_may_exit = 0; +static unsigned int g_blocked_threads = 0; +static HANDLE max_requests_per_child_event; + +static apr_thread_mutex_t *child_lock; +static apr_thread_mutex_t *qlock; +static PCOMP_CONTEXT qhead = NULL; +static PCOMP_CONTEXT qtail = NULL; +static int num_completion_contexts = 0; +static int max_num_completion_contexts = 0; +static HANDLE ThreadDispatchIOCP = NULL; +static HANDLE qwait_event = NULL; + + +AP_DECLARE(void) mpm_recycle_completion_context(PCOMP_CONTEXT context) +{ + /* Recycle the completion context. + * - clear the ptrans pool + * - put the context on the queue to be consumed by the accept thread + * Note: + * context->accept_socket may be in a disconnected but reusable + * state so -don't- close it. + */ + if (context) { + apr_pool_clear(context->ptrans); + context->ba = apr_bucket_alloc_create(context->ptrans); + context->next = NULL; + ResetEvent(context->Overlapped.hEvent); + apr_thread_mutex_lock(qlock); + if (qtail) { + qtail->next = context; + } else { + qhead = context; + SetEvent(qwait_event); + } + qtail = context; + apr_thread_mutex_unlock(qlock); + } +} + +AP_DECLARE(PCOMP_CONTEXT) mpm_get_completion_context(void) +{ + apr_status_t rv; + PCOMP_CONTEXT context = NULL; + + while (1) { + /* Grab a context off the queue */ + apr_thread_mutex_lock(qlock); + if (qhead) { + context = qhead; + qhead = qhead->next; + if (!qhead) + qtail = NULL; + } else { + ResetEvent(qwait_event); + } + apr_thread_mutex_unlock(qlock); + + if (!context) { + /* We failed to grab a context off the queue, consider allocating + * a new one out of the child pool. There may be up to + * (ap_threads_per_child + num_listeners) contexts in the system + * at once. + */ + if (num_completion_contexts >= max_num_completion_contexts) { + /* All workers are busy, need to wait for one */ + static int reported = 0; + if (!reported) { + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, ap_server_conf, + "Server ran out of threads to serve requests. Consider " + "raising the ThreadsPerChild setting"); + reported = 1; + } + + /* Wait for a worker to free a context. Once per second, give + * the caller a chance to check for shutdown. If the wait + * succeeds, get the context off the queue. It must be available, + * since there's only one consumer. + */ + rv = WaitForSingleObject(qwait_event, 1000); + if (rv == WAIT_OBJECT_0) + continue; + else /* Hopefully, WAIT_TIMEOUT */ + return NULL; + } else { + /* Allocate another context. + * Note: + * Multiple failures in the next two steps will cause the pchild pool + * to 'leak' storage. I don't think this is worth fixing... + */ + apr_allocator_t *allocator; + + apr_thread_mutex_lock(child_lock); + context = (PCOMP_CONTEXT) apr_pcalloc(pchild, sizeof(COMP_CONTEXT)); + + context->Overlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); + if (context->Overlapped.hEvent == NULL) { + /* Hopefully this is a temporary condition ... */ + ap_log_error(APLOG_MARK,APLOG_WARNING, apr_get_os_error(), ap_server_conf, + "mpm_get_completion_context: CreateEvent failed."); + + apr_thread_mutex_unlock(child_lock); + return NULL; + } + + /* Create the tranaction pool */ + apr_allocator_create(&allocator); + apr_allocator_max_free_set(allocator, ap_max_mem_free); + rv = apr_pool_create_ex(&context->ptrans, pchild, NULL, allocator); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK,APLOG_WARNING, rv, ap_server_conf, + "mpm_get_completion_context: Failed to create the transaction pool."); + CloseHandle(context->Overlapped.hEvent); + + apr_thread_mutex_unlock(child_lock); + return NULL; + } + apr_allocator_owner_set(allocator, context->ptrans); + apr_pool_tag(context->ptrans, "transaction"); + context->accept_socket = INVALID_SOCKET; + context->ba = apr_bucket_alloc_create(context->ptrans); + apr_atomic_inc(&num_completion_contexts); + + apr_thread_mutex_unlock(child_lock); + break; + } + } else { + /* Got a context from the queue */ + break; + } + } + + return context; +} + +AP_DECLARE(apr_status_t) mpm_post_completion_context(PCOMP_CONTEXT context, + io_state_e state) +{ + LPOVERLAPPED pOverlapped; + if (context) + pOverlapped = &context->Overlapped; + else + pOverlapped = NULL; + + PostQueuedCompletionStatus(ThreadDispatchIOCP, 0, state, pOverlapped); + return APR_SUCCESS; +} + + +/* + * find_ready_listener() + * Only used by Win9* and should go away when the win9*_accept() function is + * reimplemented using apr_poll(). + */ +static ap_listen_rec *head_listener; + +static APR_INLINE ap_listen_rec *find_ready_listener(fd_set * main_fds) +{ + ap_listen_rec *lr; + SOCKET nsd; + + lr = head_listener; + do { + apr_os_sock_get(&nsd, lr->sd); + if (FD_ISSET(nsd, main_fds)) { + head_listener = lr->next; + if (!head_listener) { + head_listener = ap_listeners; + } + return lr; + } + lr = lr->next; + if (!lr) { + lr = ap_listeners; + } + } while (lr != head_listener); + return NULL; +} + + +/* Windows 9x specific code... + * Accept processing for on Windows 95/98 uses a producer/consumer queue + * model. A single thread accepts connections and queues the accepted socket + * to the accept queue for consumption by a pool of worker threads. + * + * win9x_accept() + * The accept threads runs this function, which accepts connections off + * the network and calls add_job() to queue jobs to the accept_queue. + * add_job()/remove_job() + * Add or remove an accepted socket from the list of sockets + * connected to clients. allowed_globals.jobmutex protects + * against multiple concurrent access to the linked list of jobs. + * win9x_get_connection() + * Calls remove_job() to pull a job from the accept queue. All the worker + * threads block on remove_job. + */ + +typedef struct joblist_s { + struct joblist_s *next; + int sock; +} joblist; + +typedef struct globals_s { + HANDLE jobsemaphore; + joblist *jobhead; + joblist *jobtail; + apr_thread_mutex_t *jobmutex; + int jobcount; +} globals; + +globals allowed_globals = {NULL, NULL, NULL, NULL, 0}; + +#define MAX_SELECT_ERRORS 100 + + +static void add_job(int sock) +{ + joblist *new_job; + + new_job = (joblist *) malloc(sizeof(joblist)); + if (new_job == NULL) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "Ouch! Out of memory in add_job()!"); + return; + } + new_job->next = NULL; + new_job->sock = sock; + + apr_thread_mutex_lock(allowed_globals.jobmutex); + + if (allowed_globals.jobtail != NULL) + allowed_globals.jobtail->next = new_job; + allowed_globals.jobtail = new_job; + if (!allowed_globals.jobhead) + allowed_globals.jobhead = new_job; + allowed_globals.jobcount++; + ReleaseSemaphore(allowed_globals.jobsemaphore, 1, NULL); + + apr_thread_mutex_unlock(allowed_globals.jobmutex); +} + + +static int remove_job(void) +{ + joblist *job; + int sock; + + WaitForSingleObject(allowed_globals.jobsemaphore, INFINITE); + apr_thread_mutex_lock(allowed_globals.jobmutex); + + if (shutdown_in_progress && !allowed_globals.jobhead) { + apr_thread_mutex_unlock(allowed_globals.jobmutex); + return (INVALID_SOCKET); + } + job = allowed_globals.jobhead; + ap_assert(job); + allowed_globals.jobhead = job->next; + if (allowed_globals.jobhead == NULL) + allowed_globals.jobtail = NULL; + apr_thread_mutex_unlock(allowed_globals.jobmutex); + sock = job->sock; + free(job); + + return (sock); +} + + +static unsigned int __stdcall win9x_accept(void * dummy) +{ + struct timeval tv; + fd_set main_fds; + int wait_time = 1; + int csd; + SOCKET nsd = INVALID_SOCKET; + struct sockaddr_in sa_client; + int count_select_errors = 0; + int rc; + int clen; + ap_listen_rec *lr; + struct fd_set listenfds; + SOCKET listenmaxfd = INVALID_SOCKET; + + /* Setup the listeners + * ToDo: Use apr_poll() + */ + FD_ZERO(&listenfds); + for (lr = ap_listeners; lr; lr = lr->next) { + if (lr->sd != NULL) { + apr_os_sock_get(&nsd, lr->sd); + FD_SET(nsd, &listenfds); + if (listenmaxfd == INVALID_SOCKET || nsd > listenmaxfd) { + listenmaxfd = nsd; + } + ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, ap_server_conf, + "Child %d: Listening on port %d.", my_pid, lr->bind_addr->port); + } + } + + head_listener = ap_listeners; + + while (!shutdown_in_progress) { + tv.tv_sec = wait_time; + tv.tv_usec = 0; + memcpy(&main_fds, &listenfds, sizeof(fd_set)); + + rc = select(listenmaxfd + 1, &main_fds, NULL, NULL, &tv); + + if (rc == 0 || (rc == SOCKET_ERROR && APR_STATUS_IS_EINTR(apr_get_netos_error()))) { + count_select_errors = 0; /* reset count of errors */ + continue; + } + else if (rc == SOCKET_ERROR) { + /* A "real" error occurred, log it and increment the count of + * select errors. This count is used to ensure we don't go into + * a busy loop of continuous errors. + */ + ap_log_error(APLOG_MARK, APLOG_INFO, apr_get_netos_error(), ap_server_conf, + "select failed with error %d", apr_get_netos_error()); + count_select_errors++; + if (count_select_errors > MAX_SELECT_ERRORS) { + shutdown_in_progress = 1; + ap_log_error(APLOG_MARK, APLOG_ERR, apr_get_netos_error(), ap_server_conf, + "Too many errors in select loop. Child process exiting."); + break; + } + } else { + ap_listen_rec *lr; + + lr = find_ready_listener(&main_fds); + if (lr != NULL) { + /* fetch the native socket descriptor */ + apr_os_sock_get(&nsd, lr->sd); + } + } + + do { + clen = sizeof(sa_client); + csd = accept(nsd, (struct sockaddr *) &sa_client, &clen); + } while (csd < 0 && APR_STATUS_IS_EINTR(apr_get_netos_error())); + + if (csd < 0) { + if (APR_STATUS_IS_ECONNABORTED(apr_get_netos_error())) { + ap_log_error(APLOG_MARK, APLOG_ERR, apr_get_netos_error(), ap_server_conf, + "accept: (client socket)"); + } + } + else { + add_job(csd); + } + } + SetEvent(exit_event); + return 0; +} + + +static PCOMP_CONTEXT win9x_get_connection(PCOMP_CONTEXT context) +{ + apr_os_sock_info_t sockinfo; + int len; + + if (context == NULL) { + /* allocate the completion context and the transaction pool */ + apr_allocator_t *allocator; + apr_thread_mutex_lock(child_lock); + context = apr_pcalloc(pchild, sizeof(COMP_CONTEXT)); + apr_allocator_create(&allocator); + apr_allocator_max_free_set(allocator, ap_max_mem_free); + apr_pool_create_ex(&context->ptrans, pchild, NULL, allocator); + apr_allocator_owner_set(allocator, context->ptrans); + apr_pool_tag(context->ptrans, "transaction"); + apr_thread_mutex_unlock(child_lock); + } + + while (1) { + apr_pool_clear(context->ptrans); + context->ba = apr_bucket_alloc_create(context->ptrans); + context->accept_socket = remove_job(); + if (context->accept_socket == INVALID_SOCKET) { + return NULL; + } + len = sizeof(struct sockaddr); + context->sa_server = apr_palloc(context->ptrans, len); + if (getsockname(context->accept_socket, + context->sa_server, &len)== SOCKET_ERROR) { + ap_log_error(APLOG_MARK, APLOG_WARNING, apr_get_netos_error(), ap_server_conf, + "getsockname failed"); + continue; + } + len = sizeof(struct sockaddr); + context->sa_client = apr_palloc(context->ptrans, len); + if ((getpeername(context->accept_socket, + context->sa_client, &len)) == SOCKET_ERROR) { + ap_log_error(APLOG_MARK, APLOG_WARNING, apr_get_netos_error(), ap_server_conf, + "getpeername failed"); + memset(&context->sa_client, '\0', sizeof(context->sa_client)); + } + sockinfo.os_sock = &context->accept_socket; + sockinfo.local = context->sa_server; + sockinfo.remote = context->sa_client; + sockinfo.family = APR_INET; + sockinfo.type = SOCK_STREAM; + apr_os_sock_make(&context->sock, &sockinfo, context->ptrans); + + return context; + } +} + + +/* Windows NT/2000 specific code... + * Accept processing for on Windows NT uses a producer/consumer queue + * model. An accept thread accepts connections off the network then issues + * PostQueuedCompletionStatus() to awake a thread blocked on the ThreadDispatch + * IOCompletionPort. + * + * winnt_accept() + * One or more accept threads run in this function, each of which accepts + * connections off the network and calls PostQueuedCompletionStatus() to + * queue an io completion packet to the ThreadDispatch IOCompletionPort. + * winnt_get_connection() + * Worker threads block on the ThreadDispatch IOCompletionPort awaiting + * connections to service. + */ +#define MAX_ACCEPTEX_ERR_COUNT 250 +static unsigned int __stdcall winnt_accept(void *lr_) +{ + ap_listen_rec *lr = (ap_listen_rec *)lr_; + apr_os_sock_info_t sockinfo; + PCOMP_CONTEXT context = NULL; + DWORD BytesRead; + SOCKET nlsd; + int rv, err_count = 0; + + apr_os_sock_get(&nlsd, lr->sd); + + while (!shutdown_in_progress) { + if (!context) { + context = mpm_get_completion_context(); + if (!context) { + /* Temporary resource constraint? */ + Sleep(0); + continue; + } + } + + /* Create and initialize the accept socket */ + if (context->accept_socket == INVALID_SOCKET) { + context->accept_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); + if (context->accept_socket == INVALID_SOCKET) { + /* Another temporary condition? */ + ap_log_error(APLOG_MARK,APLOG_WARNING, apr_get_netos_error(), ap_server_conf, + "winnt_accept: Failed to allocate an accept socket. " + "Temporary resource constraint? Try again."); + Sleep(100); + continue; + } + } + + /* AcceptEx on the completion context. The completion context will be + * signaled when a connection is accepted. + */ + if (!AcceptEx(nlsd, context->accept_socket, + context->buff, + 0, + PADDED_ADDR_SIZE, + PADDED_ADDR_SIZE, + &BytesRead, + &context->Overlapped)) { + rv = apr_get_netos_error(); + if ((rv == APR_FROM_OS_ERROR(WSAEINVAL)) || + (rv == APR_FROM_OS_ERROR(WSAENOTSOCK))) { + /* We can get here when: + * 1) the client disconnects early + * 2) TransmitFile does not properly recycle the accept socket (typically + * because the client disconnected) + * 3) there is VPN or Firewall software installed with buggy AcceptEx implementation + * 4) the webserver is using a dynamic address that has changed + */ + ++err_count; + closesocket(context->accept_socket); + context->accept_socket = INVALID_SOCKET; + if (err_count > MAX_ACCEPTEX_ERR_COUNT) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, ap_server_conf, + "Child %d: Encountered too many errors accepting client connections. " + "Possible causes: dynamic address renewal, or incompatible VPN or firewall software. " + "Try using the Win32DisableAcceptEx directive.", my_pid); + err_count = 0; + } + continue; + } + else if ((rv != APR_FROM_OS_ERROR(ERROR_IO_PENDING)) && + (rv != APR_FROM_OS_ERROR(WSA_IO_PENDING))) { + ++err_count; + closesocket(context->accept_socket); + context->accept_socket = INVALID_SOCKET; + if (err_count > MAX_ACCEPTEX_ERR_COUNT) { + ap_log_error(APLOG_MARK,APLOG_ERR, rv, ap_server_conf, + "Child %d: Encountered too many errors accepting client connections. " + "Possible causes: Unknown. " + "Try using the Win32DisableAcceptEx directive.", my_pid); + err_count = 0; + } + continue; + } + + /* Wait for pending i/o. + * Wake up once per second to check for shutdown . + * XXX: We should be waiting on exit_event instead of polling + */ + while (1) { + rv = WaitForSingleObject(context->Overlapped.hEvent, 1000); + if (rv == WAIT_OBJECT_0) { + if (context->accept_socket == INVALID_SOCKET) { + /* socket already closed */ + break; + } + if (!GetOverlappedResult((HANDLE)context->accept_socket, + &context->Overlapped, + &BytesRead, FALSE)) { + ap_log_error(APLOG_MARK, APLOG_WARNING, + apr_get_os_error(), ap_server_conf, + "winnt_accept: Asynchronous AcceptEx failed."); + closesocket(context->accept_socket); + context->accept_socket = INVALID_SOCKET; + } + break; + } + /* WAIT_TIMEOUT */ + if (shutdown_in_progress) { + closesocket(context->accept_socket); + context->accept_socket = INVALID_SOCKET; + break; + } + } + if (context->accept_socket == INVALID_SOCKET) { + continue; + } + } + + err_count = 0; + /* Inherit the listen socket settings. Required for + * shutdown() to work + */ + if (setsockopt(context->accept_socket, SOL_SOCKET, + SO_UPDATE_ACCEPT_CONTEXT, (char *)&nlsd, + sizeof(nlsd))) { + ap_log_error(APLOG_MARK, APLOG_WARNING, apr_get_netos_error(), ap_server_conf, + "setsockopt(SO_UPDATE_ACCEPT_CONTEXT) failed."); + /* Not a failure condition. Keep running. */ + } + + /* Get the local & remote address */ + GetAcceptExSockaddrs(context->buff, + 0, + PADDED_ADDR_SIZE, + PADDED_ADDR_SIZE, + &context->sa_server, + &context->sa_server_len, + &context->sa_client, + &context->sa_client_len); + + sockinfo.os_sock = &context->accept_socket; + sockinfo.local = context->sa_server; + sockinfo.remote = context->sa_client; + sockinfo.family = APR_INET; + sockinfo.type = SOCK_STREAM; + apr_os_sock_make(&context->sock, &sockinfo, context->ptrans); + + /* When a connection is received, send an io completion notification to + * the ThreadDispatchIOCP. This function could be replaced by + * mpm_post_completion_context(), but why do an extra function call... + */ + PostQueuedCompletionStatus(ThreadDispatchIOCP, 0, IOCP_CONNECTION_ACCEPTED, + &context->Overlapped); + context = NULL; + } + if (!shutdown_in_progress) { + /* Yow, hit an irrecoverable error! Tell the child to die. */ + SetEvent(exit_event); + } + ap_log_error(APLOG_MARK, APLOG_INFO, APR_SUCCESS, ap_server_conf, + "Child %d: Accept thread exiting.", my_pid); + return 0; +} + + +static PCOMP_CONTEXT winnt_get_connection(PCOMP_CONTEXT context) +{ + int rc; + DWORD BytesRead; + DWORD CompKey; + LPOVERLAPPED pol; + + mpm_recycle_completion_context(context); + + apr_atomic_inc(&g_blocked_threads); + while (1) { + if (workers_may_exit) { + apr_atomic_dec(&g_blocked_threads); + return NULL; + } + rc = GetQueuedCompletionStatus(ThreadDispatchIOCP, &BytesRead, &CompKey, + &pol, INFINITE); + if (!rc) { + rc = apr_get_os_error(); + ap_log_error(APLOG_MARK,APLOG_DEBUG, rc, ap_server_conf, + "Child %d: GetQueuedComplationStatus returned %d", my_pid, rc); + continue; + } + + switch (CompKey) { + case IOCP_CONNECTION_ACCEPTED: + context = CONTAINING_RECORD(pol, COMP_CONTEXT, Overlapped); + break; + case IOCP_SHUTDOWN: + apr_atomic_dec(&g_blocked_threads); + return NULL; + default: + apr_atomic_dec(&g_blocked_threads); + return NULL; + } + break; + } + apr_atomic_dec(&g_blocked_threads); + + return context; +} + + +/* + * worker_main() + * Main entry point for the worker threads. Worker threads block in + * win*_get_connection() awaiting a connection to service. + */ +static unsigned int __stdcall worker_main(void *thread_num_val) +{ + static int requests_this_child = 0; + PCOMP_CONTEXT context = NULL; + int thread_num = (int)thread_num_val; + ap_sb_handle_t *sbh; + + ap_log_error(APLOG_MARK, APLOG_DEBUG, APR_SUCCESS, ap_server_conf, + "Child %d: Worker thread %ld starting.", my_pid, thread_num); + while (1) { + conn_rec *c; + apr_int32_t disconnected; + + ap_update_child_status_from_indexes(0, thread_num, SERVER_READY, NULL); + + /* Grab a connection off the network */ + if (use_acceptex) { + context = winnt_get_connection(context); + } + else { + context = win9x_get_connection(context); + } + if (!context) { + /* Time for the thread to exit */ + break; + } + + /* Have we hit MaxRequestPerChild connections? */ + if (ap_max_requests_per_child) { + requests_this_child++; + if (requests_this_child > ap_max_requests_per_child) { + SetEvent(max_requests_per_child_event); + } + } + + ap_create_sb_handle(&sbh, context->ptrans, 0, thread_num); + c = ap_run_create_connection(context->ptrans, ap_server_conf, + context->sock, thread_num, sbh, + context->ba); + + if (c) { + ap_process_connection(c, context->sock); + apr_socket_opt_get(context->sock, APR_SO_DISCONNECTED, + &disconnected); + if (!disconnected) { + context->accept_socket = INVALID_SOCKET; + ap_lingering_close(c); + } + else if (!use_acceptex) { + /* If the socket is disconnected but we are not using acceptex, + * we cannot reuse the socket. Disconnected sockets are removed + * from the apr_socket_t struct by apr_sendfile() to prevent the + * socket descriptor from being inadvertently closed by a call + * to apr_socket_close(), so close it directly. + */ + closesocket(context->accept_socket); + context->accept_socket = INVALID_SOCKET; + } + } + else { + /* ap_run_create_connection closes the socket on failure */ + context->accept_socket = INVALID_SOCKET; + } + } + + ap_update_child_status_from_indexes(0, thread_num, SERVER_DEAD, + (request_rec *) NULL); + + ap_log_error(APLOG_MARK, APLOG_DEBUG, APR_SUCCESS, ap_server_conf, + "Child %d: Worker thread %ld exiting.", my_pid, thread_num); + return 0; +} + + +static void cleanup_thread(HANDLE *handles, int *thread_cnt, int thread_to_clean) +{ + int i; + + CloseHandle(handles[thread_to_clean]); + for (i = thread_to_clean; i < ((*thread_cnt) - 1); i++) + handles[i] = handles[i + 1]; + (*thread_cnt)--; +} + + +/* + * child_main() + * Entry point for the main control thread for the child process. + * This thread creates the accept thread, worker threads and + * monitors the child process for maintenance and shutdown + * events. + */ +static void create_listener_thread() +{ + int tid; + int num_listeners = 0; + if (!use_acceptex) { + _beginthreadex(NULL, 0, win9x_accept, + NULL, 0, &tid); + } else { + /* Start an accept thread per listener + * XXX: Why would we have a NULL sd in our listeners? + */ + ap_listen_rec *lr; + + /* Number of completion_contexts allowed in the system is + * (ap_threads_per_child + num_listeners). We need the additional + * completion contexts to prevent server hangs when ThreadsPerChild + * is configured to something less than or equal to the number + * of listeners. This is not a usual case, but people have + * encountered it. + * */ + for (lr = ap_listeners; lr ; lr = lr->next) { + num_listeners++; + } + max_num_completion_contexts = ap_threads_per_child + num_listeners; + + /* Now start a thread per listener */ + for (lr = ap_listeners; lr; lr = lr->next) { + if (lr->sd != NULL) { + _beginthreadex(NULL, 1000, winnt_accept, + (void *) lr, 0, &tid); + } + } + } +} + + +void child_main(apr_pool_t *pconf) +{ + apr_status_t status; + apr_hash_t *ht; + ap_listen_rec *lr; + HANDLE child_events[2]; + HANDLE *child_handles; + int listener_started = 0; + int threads_created = 0; + int watch_thread; + int time_remains; + int cld; + int tid; + int rv; + int i; + + apr_pool_create(&pchild, pconf); + apr_pool_tag(pchild, "pchild"); + + ap_run_child_init(pchild, ap_server_conf); + ht = apr_hash_make(pchild); + + /* Initialize the child_events */ + max_requests_per_child_event = CreateEvent(NULL, TRUE, FALSE, NULL); + if (!max_requests_per_child_event) { + ap_log_error(APLOG_MARK, APLOG_CRIT, apr_get_os_error(), ap_server_conf, + "Child %d: Failed to create a max_requests event.", my_pid); + exit(APEXIT_CHILDINIT); + } + child_events[0] = exit_event; + child_events[1] = max_requests_per_child_event; + + allowed_globals.jobsemaphore = CreateSemaphore(NULL, 0, 1000000, NULL); + apr_thread_mutex_create(&allowed_globals.jobmutex, + APR_THREAD_MUTEX_DEFAULT, pchild); + + /* + * Wait until we have permission to start accepting connections. + * start_mutex is used to ensure that only one child ever + * goes into the listen/accept loop at once. + */ + status = apr_proc_mutex_lock(start_mutex); + if (status != APR_SUCCESS) { + ap_log_error(APLOG_MARK,APLOG_ERR, status, ap_server_conf, + "Child %d: Failed to acquire the start_mutex. Process will exit.", my_pid); + exit(APEXIT_CHILDINIT); + } + ap_log_error(APLOG_MARK,APLOG_NOTICE, APR_SUCCESS, ap_server_conf, + "Child %d: Acquired the start mutex.", my_pid); + + /* + * Create the worker thread dispatch IOCompletionPort + * on Windows NT/2000 + */ + if (use_acceptex) { + /* Create the worker thread dispatch IOCP */ + ThreadDispatchIOCP = CreateIoCompletionPort(INVALID_HANDLE_VALUE, + NULL, + 0, + 0); /* CONCURRENT ACTIVE THREADS */ + apr_thread_mutex_create(&qlock, APR_THREAD_MUTEX_DEFAULT, pchild); + qwait_event = CreateEvent(NULL, TRUE, FALSE, NULL); + if (!qwait_event) { + ap_log_error(APLOG_MARK, APLOG_CRIT, apr_get_os_error(), ap_server_conf, + "Child %d: Failed to create a qwait event.", my_pid); + exit(APEXIT_CHILDINIT); + } + } + + /* + * Create the pool of worker threads + */ + ap_log_error(APLOG_MARK,APLOG_NOTICE, APR_SUCCESS, ap_server_conf, + "Child %d: Starting %d worker threads.", my_pid, ap_threads_per_child); + child_handles = (HANDLE) apr_pcalloc(pchild, ap_threads_per_child * sizeof(int)); + apr_thread_mutex_create(&child_lock, APR_THREAD_MUTEX_DEFAULT, pchild); + + while (1) { + for (i = 0; i < ap_threads_per_child; i++) { + int *score_idx; + int status = ap_scoreboard_image->servers[0][i].status; + if (status != SERVER_GRACEFUL && status != SERVER_DEAD) { + continue; + } + ap_update_child_status_from_indexes(0, i, SERVER_STARTING, NULL); + child_handles[i] = (HANDLE) _beginthreadex(NULL, 0, worker_main, + (void *) i, 0, &tid); + if (child_handles[i] == 0) { + ap_log_error(APLOG_MARK, APLOG_CRIT, apr_get_os_error(), ap_server_conf, + "Child %d: _beginthreadex failed. Unable to create all worker threads. " + "Created %d of the %d threads requested with the ThreadsPerChild configuration directive.", + my_pid, threads_created, ap_threads_per_child); + ap_signal_parent(SIGNAL_PARENT_SHUTDOWN); + goto shutdown; + } + threads_created++; + /* Save the score board index in ht keyed to the thread handle. We need this + * when cleaning up threads down below... + */ + apr_thread_mutex_lock(child_lock); + score_idx = apr_pcalloc(pchild, sizeof(int)); + *score_idx = i; + apr_hash_set(ht, &child_handles[i], sizeof(HANDLE), score_idx); + apr_thread_mutex_unlock(child_lock); + } + /* Start the listener only when workers are available */ + if (!listener_started && threads_created) { + create_listener_thread(); + listener_started = 1; + winnt_mpm_state = AP_MPMQ_RUNNING; + } + if (threads_created == ap_threads_per_child) { + break; + } + /* Check to see if the child has been told to exit */ + if (WaitForSingleObject(exit_event, 0) != WAIT_TIMEOUT) { + break; + } + /* wait for previous generation to clean up an entry in the scoreboard */ + apr_sleep(1 * APR_USEC_PER_SEC); + } + + /* Wait for one of three events: + * exit_event: + * The exit_event is signaled by the parent process to notify + * the child that it is time to exit. + * + * max_requests_per_child_event: + * This event is signaled by the worker threads to indicate that + * the process has handled MaxRequestsPerChild connections. + * + * TIMEOUT: + * To do periodic maintenance on the server (check for thread exits, + * number of completion contexts, etc.) + * + * XXX: thread exits *aren't* being checked. + * + * XXX: other_child - we need the process handles to the other children + * in order to map them to apr_proc_other_child_read (which is not + * named well, it's more like a_p_o_c_died.) + * + * XXX: however - if we get a_p_o_c handle inheritance working, and + * the parent process creates other children and passes the pipes + * to our worker processes, then we have no business doing such + * things in the child_main loop, but should happen in master_main. + */ + while (1) { +#if !APR_HAS_OTHER_CHILD + rv = WaitForMultipleObjects(2, (HANDLE *) child_events, FALSE, INFINITE); + cld = rv - WAIT_OBJECT_0; +#else + rv = WaitForMultipleObjects(2, (HANDLE *) child_events, FALSE, 1000); + cld = rv - WAIT_OBJECT_0; + if (rv == WAIT_TIMEOUT) { + apr_proc_other_child_check(); + } + else +#endif + if (rv == WAIT_FAILED) { + /* Something serious is wrong */ + ap_log_error(APLOG_MARK, APLOG_CRIT, apr_get_os_error(), ap_server_conf, + "Child %d: WAIT_FAILED -- shutting down server", my_pid); + break; + } + else if (cld == 0) { + /* Exit event was signaled */ + ap_log_error(APLOG_MARK, APLOG_NOTICE, APR_SUCCESS, ap_server_conf, + "Child %d: Exit event signaled. Child process is ending.", my_pid); + break; + } + else { + /* MaxRequestsPerChild event set by the worker threads. + * Signal the parent to restart + */ + ap_log_error(APLOG_MARK, APLOG_NOTICE, APR_SUCCESS, ap_server_conf, + "Child %d: Process exiting because it reached " + "MaxRequestsPerChild. Signaling the parent to " + "restart a new child process.", my_pid); + ap_signal_parent(SIGNAL_PARENT_RESTART); + break; + } + } + + /* + * Time to shutdown the child process + */ + + shutdown: + + winnt_mpm_state = AP_MPMQ_STOPPING; + /* Setting is_graceful will cause threads handling keep-alive connections + * to close the connection after handling the current request. + */ + is_graceful = 1; + + /* Close the listening sockets. Note, we must close the listeners + * before closing any accept sockets pending in AcceptEx to prevent + * memory leaks in the kernel. + */ + for (lr = ap_listeners; lr ; lr = lr->next) { + apr_socket_close(lr->sd); + } + + /* Shutdown listener threads and pending AcceptEx socksts + * but allow the worker threads to continue consuming from + * the queue of accepted connections. + */ + shutdown_in_progress = 1; + + Sleep(1000); + + /* Tell the worker threads to exit */ + workers_may_exit = 1; + + /* Release the start_mutex to let the new process (in the restart + * scenario) a chance to begin accepting and servicing requests + */ + rv = apr_proc_mutex_unlock(start_mutex); + if (rv == APR_SUCCESS) { + ap_log_error(APLOG_MARK,APLOG_NOTICE, rv, ap_server_conf, + "Child %d: Released the start mutex", my_pid); + } + else { + ap_log_error(APLOG_MARK,APLOG_ERR, rv, ap_server_conf, + "Child %d: Failure releasing the start mutex", my_pid); + } + + /* Shutdown the worker threads */ + if (!use_acceptex) { + for (i = 0; i < threads_created; i++) { + add_job(INVALID_SOCKET); + } + } + else { /* Windows NT/2000 */ + /* Post worker threads blocked on the ThreadDispatch IOCompletion port */ + while (g_blocked_threads > 0) { + ap_log_error(APLOG_MARK,APLOG_INFO, APR_SUCCESS, ap_server_conf, + "Child %d: %d threads blocked on the completion port", my_pid, g_blocked_threads); + for (i=g_blocked_threads; i > 0; i--) { + PostQueuedCompletionStatus(ThreadDispatchIOCP, 0, IOCP_SHUTDOWN, NULL); + } + Sleep(1000); + } + /* Empty the accept queue of completion contexts */ + apr_thread_mutex_lock(qlock); + while (qhead) { + CloseHandle(qhead->Overlapped.hEvent); + closesocket(qhead->accept_socket); + qhead = qhead->next; + } + apr_thread_mutex_unlock(qlock); + } + + /* Give busy threads a chance to service their connections, + * (no more than the global server timeout period which + * we track in msec remaining). + */ + watch_thread = 0; + time_remains = (int)(ap_server_conf->timeout / APR_TIME_C(1000)); + + while (threads_created) + { + int nFailsafe = MAXIMUM_WAIT_OBJECTS; + DWORD dwRet; + + /* Every time we roll over to wait on the first group + * of MAXIMUM_WAIT_OBJECTS threads, take a breather, + * and infrequently update the error log. + */ + if (watch_thread >= threads_created) { + if ((time_remains -= 100) < 0) + break; + + /* Every 30 seconds give an update */ + if ((time_remains % 30000) == 0) { + ap_log_error(APLOG_MARK, APLOG_NOTICE, APR_SUCCESS, + ap_server_conf, + "Child %d: Waiting %d more seconds " + "for %d worker threads to finish.", + my_pid, time_remains / 1000, threads_created); + } + /* We'll poll from the top, 10 times per second */ + Sleep(100); + watch_thread = 0; + } + + /* Fairness, on each iteration we will pick up with the thread + * after the one we just removed, even if it's a single thread. + * We don't block here. + */ + dwRet = WaitForMultipleObjects(min(threads_created - watch_thread, + MAXIMUM_WAIT_OBJECTS), + child_handles + watch_thread, 0, 0); + + if (dwRet == WAIT_FAILED) { + break; + } + if (dwRet == WAIT_TIMEOUT) { + /* none ready */ + watch_thread += MAXIMUM_WAIT_OBJECTS; + continue; + } + else if (dwRet >= WAIT_ABANDONED_0) { + /* We just got the ownership of the object, which + * should happen at most MAXIMUM_WAIT_OBJECTS times. + * It does NOT mean that the object is signaled. + */ + if ((nFailsafe--) < 1) + break; + } + else { + watch_thread += (dwRet - WAIT_OBJECT_0); + if (watch_thread >= threads_created) + break; + cleanup_thread(child_handles, &threads_created, watch_thread); + } + } + + /* Kill remaining threads off the hard way */ + if (threads_created) { + ap_log_error(APLOG_MARK,APLOG_NOTICE, APR_SUCCESS, ap_server_conf, + "Child %d: Terminating %d threads that failed to exit.", + my_pid, threads_created); + } + for (i = 0; i < threads_created; i++) { + int *score_idx; + TerminateThread(child_handles[i], 1); + CloseHandle(child_handles[i]); + /* Reset the scoreboard entry for the thread we just whacked */ + score_idx = apr_hash_get(ht, &child_handles[i], sizeof(HANDLE)); + ap_update_child_status_from_indexes(0, *score_idx, SERVER_DEAD, NULL); + } + ap_log_error(APLOG_MARK,APLOG_NOTICE, APR_SUCCESS, ap_server_conf, + "Child %d: All worker threads have exited.", my_pid); + + CloseHandle(allowed_globals.jobsemaphore); + apr_thread_mutex_destroy(allowed_globals.jobmutex); + apr_thread_mutex_destroy(child_lock); + + if (use_acceptex) { + apr_thread_mutex_destroy(qlock); + CloseHandle(qwait_event); + } + + apr_pool_destroy(pchild); + CloseHandle(exit_event); +} + +#endif /* def WIN32 */ diff --git a/rubbos/app/httpd-2.0.64/server/mpm/winnt/mpm.h b/rubbos/app/httpd-2.0.64/server/mpm/winnt/mpm.h new file mode 100644 index 00000000..2cae7a8e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/winnt/mpm.h @@ -0,0 +1,39 @@ +/* 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. + */ + +#ifndef APACHE_MPM_H +#define APACHE_MPM_H + +/* mpm.h is the place to make declarations that are MPM specific but that must be + * shared with non-mpm specific code in the server. Hummm, perhaps we can + * move most of this stuff to mpm_common.h? + */ + +#include "scoreboard.h" + +#define MPM_NAME "WinNT" + +#define AP_MPM_WANT_SET_PIDFILE +#define AP_MPM_WANT_SET_MAX_REQUESTS +#define AP_MPM_WANT_SET_COREDUMPDIR +#define AP_MPM_WANT_SET_SCOREBOARD +#define AP_MPM_WANT_SET_MAX_MEM_FREE + +extern int ap_threads_per_child; +extern int ap_thread_limit; +extern server_rec *ap_server_conf; + +#endif /* APACHE_MPM_H */ diff --git a/rubbos/app/httpd-2.0.64/server/mpm/winnt/mpm_default.h b/rubbos/app/httpd-2.0.64/server/mpm/winnt/mpm_default.h new file mode 100644 index 00000000..847bd732 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/winnt/mpm_default.h @@ -0,0 +1,80 @@ +/* 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. + */ + +#ifndef APACHE_MPM_DEFAULT_H +#define APACHE_MPM_DEFAULT_H + +/* Default limit on the maximum setting of the ThreadsPerChild configuration + * directive. This limit can be overridden with the ThreadLimit directive. + * This limit directly influences the amount of shared storage that is allocated + * for the scoreboard. DEFAULT_THREAD_LIMIT represents a good compromise + * between scoreboard size and the ability of the server to handle the most + * common installation requirements. + */ +#ifndef DEFAULT_THREAD_LIMIT +#define DEFAULT_THREAD_LIMIT 1920 +#endif + +/* The ThreadLimit directive can be used to override the DEFAULT_THREAD_LIMIT. + * ThreadLimit cannot be tuned larger than MAX_THREAD_LIMIT. + * This is a sort of compile-time limit to help catch typos. + */ +#ifndef MAX_THREAD_LIMIT +#define MAX_THREAD_LIMIT 15000 +#endif + +/* Number of threads started in the child process in the absence + * of a ThreadsPerChild configuration directive + */ +#ifndef DEFAULT_THREADS_PER_CHILD +#define DEFAULT_THREADS_PER_CHILD 64 +#endif + +/* Max number of child processes allowed. + */ +#define HARD_SERVER_LIMIT 1 + +/* Number of servers to spawn off by default + */ +#ifndef DEFAULT_NUM_DAEMON +#define DEFAULT_NUM_DAEMON 1 +#endif + +/* Check for definition of DEFAULT_REL_RUNTIMEDIR */ +#ifndef DEFAULT_REL_RUNTIMEDIR +#define DEFAULT_REL_RUNTIMEDIR "logs" +#endif + +/* Where the main/parent process's pid is logged */ +#ifndef DEFAULT_PIDLOG +#define DEFAULT_PIDLOG DEFAULT_REL_RUNTIMEDIR "/httpd.pid" +#endif + +/* + * Interval, in microseconds, between scoreboard maintenance. + */ +#ifndef SCOREBOARD_MAINTENANCE_INTERVAL +#define SCOREBOARD_MAINTENANCE_INTERVAL 1000000 +#endif + +/* Number of requests to try to handle in a single process. If <= 0, + * the children don't die off. + */ +#ifndef DEFAULT_MAX_REQUESTS_PER_CHILD +#define DEFAULT_MAX_REQUESTS_PER_CHILD 0 +#endif + +#endif /* AP_MPM_DEFAULT_H */ diff --git a/rubbos/app/httpd-2.0.64/server/mpm/winnt/mpm_winnt.c b/rubbos/app/httpd-2.0.64/server/mpm/winnt/mpm_winnt.c new file mode 100644 index 00000000..6fc0ae60 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/winnt/mpm_winnt.c @@ -0,0 +1,1728 @@ +/* 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. + */ + +#ifdef WIN32 + +#define CORE_PRIVATE +#include "httpd.h" +#include "http_main.h" +#include "http_log.h" +#include "http_config.h" /* for read_config */ +#include "http_core.h" /* for get_remote_host */ +#include "http_connection.h" +#include "apr_portable.h" +#include "apr_thread_proc.h" +#include "apr_getopt.h" +#include "apr_strings.h" +#include "apr_lib.h" +#include "apr_shm.h" +#include "apr_thread_mutex.h" +#include "ap_mpm.h" +#include "ap_config.h" +#include "ap_listen.h" +#include "mpm_default.h" +#include "mpm_winnt.h" +#include "mpm_common.h" +#include +#include "apr_atomic.h" + + +/* scoreboard.c does the heavy lifting; all we do is create the child + * score by moving a handle down the pipe into the child's stdin. + */ +extern apr_shm_t *ap_scoreboard_shm; +server_rec *ap_server_conf; + +/* Definitions of WINNT MPM specific config globals */ +static HANDLE shutdown_event; /* used to signal the parent to shutdown */ +static HANDLE restart_event; /* used to signal the parent to restart */ + +static char ap_coredump_dir[MAX_STRING_LEN]; + +static int one_process = 0; +static char const* signal_arg = NULL; + +OSVERSIONINFO osver; /* VER_PLATFORM_WIN32_NT */ + +static DWORD parent_pid; +DWORD my_pid; + +int ap_threads_per_child = 0; +int use_acceptex = 1; +static int thread_limit = DEFAULT_THREAD_LIMIT; +static int first_thread_limit = 0; +static int changed_limit_at_restart; +int winnt_mpm_state = AP_MPMQ_STARTING; +/* ap_my_generation are used by the scoreboard code */ +ap_generation_t volatile ap_my_generation=0; + + +/* shared by service.c as global, although + * perhaps it should be private. + */ +apr_pool_t *pconf; + + +/* definitions from child.c */ +void child_main(apr_pool_t *pconf); + +/* used by parent to signal the child to start and exit + * NOTE: these are not sophisticated enough for multiple children + * so they ultimately should not be shared with child.c + */ +extern apr_proc_mutex_t *start_mutex; +extern HANDLE exit_event; + +/* Only one of these, the pipe from our parent, ment only for + * one child worker's consumption (not to be inherited!) + * XXX: decorate this name for the trunk branch, was left simplified + * only to make the 2.2 patch trivial to read. + */ +static HANDLE pipe; + +/* Stub functions until this MPM supports the connection status API */ + +AP_DECLARE(void) ap_update_connection_status(long conn_id, const char *key, \ + const char *value) +{ + /* NOP */ +} + +AP_DECLARE(void) ap_reset_connection_status(long conn_id) +{ + /* NOP */ +} + +AP_DECLARE(apr_array_header_t *) ap_get_status_table(apr_pool_t *p) +{ + /* NOP */ + return NULL; +} + +/* + * Command processors + */ + +static const char *set_threads_per_child (cmd_parms *cmd, void *dummy, char *arg) +{ + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + ap_threads_per_child = atoi(arg); + if (ap_threads_per_child > thread_limit) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: ThreadsPerChild of %d exceeds ThreadLimit " + "value of %d threads,", ap_threads_per_child, + thread_limit); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " lowering ThreadsPerChild to %d. To increase, please" + " see the", thread_limit); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " ThreadLimit directive."); + ap_threads_per_child = thread_limit; + } + else if (ap_threads_per_child < 1) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: Require ThreadsPerChild > 0, setting to 1"); + ap_threads_per_child = 1; + } + return NULL; +} +static const char *set_thread_limit (cmd_parms *cmd, void *dummy, const char *arg) +{ + int tmp_thread_limit; + + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + tmp_thread_limit = atoi(arg); + /* you cannot change ThreadLimit across a restart; ignore + * any such attempts + */ + if (first_thread_limit && + tmp_thread_limit != thread_limit) { + /* how do we log a message? the error log is a bit bucket at this + * point; we'll just have to set a flag so that ap_mpm_run() + * logs a warning later + */ + changed_limit_at_restart = 1; + return NULL; + } + thread_limit = tmp_thread_limit; + + if (thread_limit > MAX_THREAD_LIMIT) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: ThreadLimit of %d exceeds compile time limit " + "of %d threads,", thread_limit, MAX_THREAD_LIMIT); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " lowering ThreadLimit to %d.", MAX_THREAD_LIMIT); + thread_limit = MAX_THREAD_LIMIT; + } + else if (thread_limit < 1) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: Require ThreadLimit > 0, setting to 1"); + thread_limit = 1; + } + return NULL; +} +static const char *set_disable_acceptex(cmd_parms *cmd, void *dummy, char *arg) +{ + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + if (use_acceptex) { + use_acceptex = 0; + ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, NULL, + "Disabled use of AcceptEx() WinSock2 API"); + } + return NULL; +} + +static const command_rec winnt_cmds[] = { +LISTEN_COMMANDS, +AP_INIT_TAKE1("ThreadsPerChild", set_threads_per_child, NULL, RSRC_CONF, + "Number of threads each child creates" ), +AP_INIT_TAKE1("ThreadLimit", set_thread_limit, NULL, RSRC_CONF, + "Maximum worker threads in a server for this run of Apache"), +AP_INIT_NO_ARGS("Win32DisableAcceptEx", set_disable_acceptex, NULL, RSRC_CONF, + "Disable use of the high performance AcceptEx WinSock2 API to work around buggy VPN or Firewall software"), +{ NULL } +}; + + +/* + * Signalling Apache on NT. + * + * Under Unix, Apache can be told to shutdown or restart by sending various + * signals (HUP, USR, TERM). On NT we don't have easy access to signals, so + * we use "events" instead. The parent apache process goes into a loop + * where it waits forever for a set of events. Two of those events are + * called + * + * apPID_shutdown + * apPID_restart + * + * (where PID is the PID of the apache parent process). When one of these + * is signalled, the Apache parent performs the appropriate action. The events + * can become signalled through internal Apache methods (e.g. if the child + * finds a fatal error and needs to kill its parent), via the service + * control manager (the control thread will signal the shutdown event when + * requested to stop the Apache service), from the -k Apache command line, + * or from any external program which finds the Apache PID from the + * httpd.pid file. + * + * The signal_parent() function, below, is used to signal one of these events. + * It can be called by any child or parent process, since it does not + * rely on global variables. + * + * On entry, type gives the event to signal. 0 means shutdown, 1 means + * graceful restart. + */ +/* + * Initialise the signal names, in the global variables signal_name_prefix, + * signal_restart_name and signal_shutdown_name. + */ +#define MAX_SIGNAL_NAME 30 /* Long enough for apPID_shutdown, where PID is an int */ +char signal_name_prefix[MAX_SIGNAL_NAME]; +char signal_restart_name[MAX_SIGNAL_NAME]; +char signal_shutdown_name[MAX_SIGNAL_NAME]; +void setup_signal_names(char *prefix) +{ + apr_snprintf(signal_name_prefix, sizeof(signal_name_prefix), prefix); + apr_snprintf(signal_shutdown_name, sizeof(signal_shutdown_name), + "%s_shutdown", signal_name_prefix); + apr_snprintf(signal_restart_name, sizeof(signal_restart_name), + "%s_restart", signal_name_prefix); +} + +int volatile is_graceful = 0; + +AP_DECLARE(int) ap_graceful_stop_signalled(void) +{ + return is_graceful; +} + +AP_DECLARE(void) ap_signal_parent(ap_signal_parent_e type) +{ + HANDLE e; + char *signal_name; + + if (parent_pid == my_pid) { + switch(type) { + case SIGNAL_PARENT_SHUTDOWN: + { + SetEvent(shutdown_event); + break; + } + /* This MPM supports only graceful restarts right now */ + case SIGNAL_PARENT_RESTART: + case SIGNAL_PARENT_RESTART_GRACEFUL: + { + is_graceful = 1; + SetEvent(restart_event); + break; + } + } + return; + } + + switch(type) { + case SIGNAL_PARENT_SHUTDOWN: + { + signal_name = signal_shutdown_name; + break; + } + /* This MPM supports only graceful restarts right now */ + case SIGNAL_PARENT_RESTART: + case SIGNAL_PARENT_RESTART_GRACEFUL: + { + signal_name = signal_restart_name; + is_graceful = 1; + break; + } + default: + return; + } + + e = OpenEvent(EVENT_MODIFY_STATE, FALSE, signal_name); + if (!e) { + /* Um, problem, can't signal the parent, which means we can't + * signal ourselves to die. Ignore for now... + */ + ap_log_error(APLOG_MARK, APLOG_EMERG, apr_get_os_error(), ap_server_conf, + "OpenEvent on %s event", signal_name); + return; + } + if (SetEvent(e) == 0) { + /* Same problem as above */ + ap_log_error(APLOG_MARK, APLOG_EMERG, apr_get_os_error(), ap_server_conf, + "SetEvent on %s event", signal_name); + CloseHandle(e); + return; + } + CloseHandle(e); +} + + +/* + * Passed the following handles [in sync with send_handles_to_child()] + * + * ready event [signal the parent immediately, then close] + * exit event [save to poll later] + * start mutex [signal from the parent to begin accept()] + * scoreboard shm handle [to recreate the ap_scoreboard] + */ +void get_handles_from_parent(server_rec *s, HANDLE *child_exit_event, + apr_proc_mutex_t **child_start_mutex, + apr_shm_t **scoreboard_shm) +{ + HANDLE hScore; + HANDLE ready_event; + HANDLE os_start; + DWORD BytesRead; + void *sb_shared; + apr_status_t rv; + + /* *** We now do this was back in winnt_rewrite_args + * pipe = GetStdHandle(STD_INPUT_HANDLE); + */ + if (!ReadFile(pipe, &ready_event, sizeof(HANDLE), + &BytesRead, (LPOVERLAPPED) NULL) + || (BytesRead != sizeof(HANDLE))) { + ap_log_error(APLOG_MARK, APLOG_CRIT, apr_get_os_error(), ap_server_conf, + "Child %d: Unable to retrieve the ready event from the parent", my_pid); + exit(APEXIT_CHILDINIT); + } + + SetEvent(ready_event); + CloseHandle(ready_event); + + if (!ReadFile(pipe, child_exit_event, sizeof(HANDLE), + &BytesRead, (LPOVERLAPPED) NULL) + || (BytesRead != sizeof(HANDLE))) { + ap_log_error(APLOG_MARK, APLOG_CRIT, apr_get_os_error(), ap_server_conf, + "Child %d: Unable to retrieve the exit event from the parent", my_pid); + exit(APEXIT_CHILDINIT); + } + + if (!ReadFile(pipe, &os_start, sizeof(os_start), + &BytesRead, (LPOVERLAPPED) NULL) + || (BytesRead != sizeof(os_start))) { + ap_log_error(APLOG_MARK, APLOG_CRIT, apr_get_os_error(), ap_server_conf, + "Child %d: Unable to retrieve the start_mutex from the parent", my_pid); + exit(APEXIT_CHILDINIT); + } + *child_start_mutex = NULL; + if ((rv = apr_os_proc_mutex_put(child_start_mutex, &os_start, s->process->pool)) + != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_CRIT, rv, ap_server_conf, + "Child %d: Unable to access the start_mutex from the parent", my_pid); + exit(APEXIT_CHILDINIT); + } + + if (!ReadFile(pipe, &hScore, sizeof(hScore), + &BytesRead, (LPOVERLAPPED) NULL) + || (BytesRead != sizeof(hScore))) { + ap_log_error(APLOG_MARK, APLOG_CRIT, apr_get_os_error(), ap_server_conf, + "Child %d: Unable to retrieve the scoreboard from the parent", my_pid); + exit(APEXIT_CHILDINIT); + } + *scoreboard_shm = NULL; + if ((rv = apr_os_shm_put(scoreboard_shm, &hScore, s->process->pool)) + != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_CRIT, rv, ap_server_conf, + "Child %d: Unable to access the scoreboard from the parent", my_pid); + exit(APEXIT_CHILDINIT); + } + + rv = ap_reopen_scoreboard(s->process->pool, scoreboard_shm, 1); + if (rv || !(sb_shared = apr_shm_baseaddr_get(*scoreboard_shm))) { + ap_log_error(APLOG_MARK, APLOG_CRIT, rv, NULL, + "Child %d: Unable to reopen the scoreboard from the parent", my_pid); + exit(APEXIT_CHILDINIT); + } + /* We must 'initialize' the scoreboard to relink all the + * process-local pointer arrays into the shared memory block. + */ + ap_init_scoreboard(sb_shared); + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, ap_server_conf, + "Child %d: Retrieved our scoreboard from the parent.", my_pid); +} + + +static int send_handles_to_child(apr_pool_t *p, + HANDLE child_ready_event, + HANDLE child_exit_event, + apr_proc_mutex_t *child_start_mutex, + apr_shm_t *scoreboard_shm, + HANDLE hProcess, + apr_file_t *child_in) +{ + apr_status_t rv; + HANDLE hCurrentProcess = GetCurrentProcess(); + HANDLE hDup; + HANDLE os_start; + HANDLE hScore; + DWORD BytesWritten; + + if (!DuplicateHandle(hCurrentProcess, child_ready_event, hProcess, &hDup, + EVENT_MODIFY_STATE | SYNCHRONIZE, FALSE, 0)) { + ap_log_error(APLOG_MARK, APLOG_CRIT, apr_get_os_error(), ap_server_conf, + "Parent: Unable to duplicate the ready event handle for the child"); + return -1; + } + if ((rv = apr_file_write_full(child_in, &hDup, sizeof(hDup), &BytesWritten)) + != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_CRIT, rv, ap_server_conf, + "Parent: Unable to send the exit event handle to the child"); + return -1; + } + if (!DuplicateHandle(hCurrentProcess, child_exit_event, hProcess, &hDup, + EVENT_MODIFY_STATE | SYNCHRONIZE, FALSE, 0)) { + ap_log_error(APLOG_MARK, APLOG_CRIT, apr_get_os_error(), ap_server_conf, + "Parent: Unable to duplicate the exit event handle for the child"); + return -1; + } + if ((rv = apr_file_write_full(child_in, &hDup, sizeof(hDup), &BytesWritten)) + != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_CRIT, rv, ap_server_conf, + "Parent: Unable to send the exit event handle to the child"); + return -1; + } + if ((rv = apr_os_proc_mutex_get(&os_start, child_start_mutex)) != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_CRIT, rv, ap_server_conf, + "Parent: Unable to retrieve the start mutex for the child"); + return -1; + } + if (!DuplicateHandle(hCurrentProcess, os_start, hProcess, &hDup, + SYNCHRONIZE, FALSE, 0)) { + ap_log_error(APLOG_MARK, APLOG_CRIT, apr_get_os_error(), ap_server_conf, + "Parent: Unable to duplicate the start mutex to the child"); + return -1; + } + if ((rv = apr_file_write_full(child_in, &hDup, sizeof(hDup), &BytesWritten)) + != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_CRIT, rv, ap_server_conf, + "Parent: Unable to send the start mutex to the child"); + return -1; + } + if ((rv = apr_os_shm_get(&hScore, scoreboard_shm)) != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_CRIT, rv, ap_server_conf, + "Parent: Unable to retrieve the scoreboard handle for the child"); + return -1; + } + if (!DuplicateHandle(hCurrentProcess, hScore, hProcess, &hDup, + FILE_MAP_READ | FILE_MAP_WRITE, FALSE, 0)) { + ap_log_error(APLOG_MARK, APLOG_CRIT, apr_get_os_error(), ap_server_conf, + "Parent: Unable to duplicate the scoreboard handle to the child"); + return -1; + } + if ((rv = apr_file_write_full(child_in, &hDup, sizeof(hDup), &BytesWritten)) + != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_CRIT, rv, ap_server_conf, + "Parent: Unable to send the scoreboard handle to the child"); + return -1; + } + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, ap_server_conf, + "Parent: Sent the scoreboard to the child"); + return 0; +} + + +/* + * get_listeners_from_parent() + * The listen sockets are opened in the parent. This function, which runs + * exclusively in the child process, receives them from the parent and + * makes them availeble in the child. + */ +void get_listeners_from_parent(server_rec *s) +{ + WSAPROTOCOL_INFO WSAProtocolInfo; + ap_listen_rec *lr; + DWORD BytesRead; + int lcnt = 0; + SOCKET nsd; + + /* Set up a default listener if necessary */ + if (ap_listeners == NULL) { + ap_listen_rec *lr; + lr = apr_palloc(s->process->pool, sizeof(ap_listen_rec)); + lr->sd = NULL; + lr->next = ap_listeners; + ap_listeners = lr; + } + + /* Open the pipe to the parent process to receive the inherited socket + * data. The sockets have been set to listening in the parent process. + * + * *** We now do this was back in winnt_rewrite_args + * pipe = GetStdHandle(STD_INPUT_HANDLE); + */ + for (lr = ap_listeners; lr; lr = lr->next, ++lcnt) { + if (!ReadFile(pipe, &WSAProtocolInfo, sizeof(WSAPROTOCOL_INFO), + &BytesRead, (LPOVERLAPPED) NULL)) { + ap_log_error(APLOG_MARK, APLOG_CRIT, apr_get_os_error(), ap_server_conf, + "setup_inherited_listeners: Unable to read socket data from parent"); + exit(APEXIT_CHILDINIT); + } + nsd = WSASocket(FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO, FROM_PROTOCOL_INFO, + &WSAProtocolInfo, 0, 0); + if (nsd == INVALID_SOCKET) { + ap_log_error(APLOG_MARK, APLOG_CRIT, apr_get_netos_error(), ap_server_conf, + "Child %d: setup_inherited_listeners(), WSASocket failed to open the inherited socket.", my_pid); + exit(APEXIT_CHILDINIT); + } + + if (osver.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) { + HANDLE hProcess = GetCurrentProcess(); + HANDLE dup; + if (DuplicateHandle(hProcess, (HANDLE) nsd, hProcess, &dup, + 0, FALSE, DUPLICATE_SAME_ACCESS)) { + closesocket(nsd); + nsd = (SOCKET) dup; + } + } + else { + /* A different approach. Many users report errors such as + * (32538)An operation was attempted on something that is not + * a socket. : Parent: WSADuplicateSocket failed... + * + * This appears that the duplicated handle is no longer recognized + * as a socket handle. SetHandleInformation should overcome that + * problem by not altering the handle identifier. But this won't + * work on 9x - it's unsupported. + */ + if (!SetHandleInformation((HANDLE)nsd, HANDLE_FLAG_INHERIT, 0)) { + ap_log_error(APLOG_MARK, APLOG_ERR, apr_get_os_error(), ap_server_conf, + "set_listeners_noninheritable: SetHandleInformation failed."); + } + } + apr_os_sock_put(&lr->sd, &nsd, s->process->pool); + } + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, ap_server_conf, + "Child %d: retrieved %d listeners from parent", my_pid, lcnt); +} + + +static int send_listeners_to_child(apr_pool_t *p, DWORD dwProcessId, + apr_file_t *child_in) +{ + apr_status_t rv; + int lcnt = 0; + ap_listen_rec *lr; + LPWSAPROTOCOL_INFO lpWSAProtocolInfo; + DWORD BytesWritten; + + /* Run the chain of open sockets. For each socket, duplicate it + * for the target process then send the WSAPROTOCOL_INFO + * (returned by dup socket) to the child. + */ + for (lr = ap_listeners; lr; lr = lr->next, ++lcnt) { + int nsd; + lpWSAProtocolInfo = apr_pcalloc(p, sizeof(WSAPROTOCOL_INFO)); + apr_os_sock_get(&nsd,lr->sd); + ap_log_error(APLOG_MARK, APLOG_INFO, APR_SUCCESS, ap_server_conf, + "Parent: Duplicating socket %d and sending it to child process %d", + nsd, dwProcessId); + if (WSADuplicateSocket(nsd, dwProcessId, + lpWSAProtocolInfo) == SOCKET_ERROR) { + ap_log_error(APLOG_MARK, APLOG_CRIT, apr_get_netos_error(), ap_server_conf, + "Parent: WSADuplicateSocket failed for socket %d. Check the FAQ.", lr->sd ); + return -1; + } + + if ((rv = apr_file_write_full(child_in, lpWSAProtocolInfo, + sizeof(WSAPROTOCOL_INFO), &BytesWritten)) + != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_CRIT, rv, ap_server_conf, + "Parent: Unable to write duplicated socket %d to the child.", lr->sd ); + return -1; + } + } + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, ap_server_conf, + "Parent: Sent %d listeners to child %d", lcnt, dwProcessId); + return 0; +} + +enum waitlist_e { + waitlist_ready = 0, + waitlist_term = 1 +}; + +static int create_process(apr_pool_t *p, HANDLE *child_proc, HANDLE *child_exit_event, + DWORD *child_pid) +{ + /* These NEVER change for the lifetime of this parent + */ + static char **args = NULL; + static char pidbuf[28]; + + apr_status_t rv; + apr_pool_t *ptemp; + apr_procattr_t *attr; + apr_proc_t new_child; + apr_file_t *child_out, *child_err; + HANDLE hExitEvent; + HANDLE waitlist[2]; /* see waitlist_e */ + char *cmd; + char *cwd; + char **env; + int envc; + + apr_pool_sub_make(&ptemp, p, NULL); + + /* Build the command line. Should look something like this: + * C:/apache/bin/apache.exe -f ap_server_confname + * First, get the path to the executable... + */ + apr_procattr_create(&attr, ptemp); + apr_procattr_cmdtype_set(attr, APR_PROGRAM); + apr_procattr_detach_set(attr, 1); + if (((rv = apr_filepath_get(&cwd, 0, ptemp)) != APR_SUCCESS) + || ((rv = apr_procattr_dir_set(attr, cwd)) != APR_SUCCESS)) { + ap_log_error(APLOG_MARK, APLOG_CRIT, rv, ap_server_conf, + "Parent: Failed to get the current path"); + } + + if (!args) { + /* Build the args array, only once since it won't change + * for the lifetime of this parent process. + */ + if ((rv = ap_os_proc_filepath(&cmd, ptemp)) + != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_CRIT, ERROR_BAD_PATHNAME, ap_server_conf, + "Parent: Failed to get full path of %s", + ap_server_conf->process->argv[0]); + apr_pool_destroy(ptemp); + return -1; + } + + args = malloc((ap_server_conf->process->argc + 1) * sizeof (char*)); + memcpy(args + 1, ap_server_conf->process->argv + 1, + (ap_server_conf->process->argc - 1) * sizeof (char*)); + args[0] = malloc(strlen(cmd) + 1); + strcpy(args[0], cmd); + args[ap_server_conf->process->argc] = NULL; + } + else { + cmd = args[0]; + } + + /* Create a pipe to send handles to the child */ + if ((rv = apr_procattr_io_set(attr, APR_FULL_BLOCK, + APR_NO_PIPE, APR_NO_PIPE)) != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_CRIT, rv, ap_server_conf, + "Parent: Unable to create child stdin pipe."); + apr_pool_destroy(ptemp); + return -1; + } + + /* httpd-2.0/2.2 specific to work around apr_proc_create bugs */ + /* set "NUL" as sysout for the child */ + if (((rv = apr_file_open(&child_out, "NUL", APR_WRITE | APR_READ, APR_OS_DEFAULT,p)) + != APR_SUCCESS) || + ((rv = apr_procattr_child_out_set(attr, child_out, NULL)) + != APR_SUCCESS)) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, ap_server_conf, + "Parent: Could not set child process stdout"); + } + if (((rv = apr_file_open_stderr(&child_err, p)) + != APR_SUCCESS) || + ((rv = apr_procattr_child_err_set(attr, child_err, NULL)) + != APR_SUCCESS)) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, ap_server_conf, + "Parent: Could not set child process stderr"); + } + + /* Create the child_ready_event */ + waitlist[waitlist_ready] = CreateEvent(NULL, TRUE, FALSE, NULL); + if (!waitlist[waitlist_ready]) { + ap_log_error(APLOG_MARK, APLOG_CRIT, apr_get_os_error(), ap_server_conf, + "Parent: Could not create ready event for child process"); + apr_pool_destroy (ptemp); + return -1; + } + + /* Create the child_exit_event */ + hExitEvent = CreateEvent(NULL, TRUE, FALSE, NULL); + if (!hExitEvent) { + ap_log_error(APLOG_MARK, APLOG_CRIT, apr_get_os_error(), ap_server_conf, + "Parent: Could not create exit event for child process"); + apr_pool_destroy(ptemp); + CloseHandle(waitlist[waitlist_ready]); + return -1; + } + + /* Build the env array */ + for (envc = 0; _environ[envc]; ++envc) { + ; + } + env = apr_palloc(ptemp, (envc + 2) * sizeof (char*)); + memcpy(env, _environ, envc * sizeof (char*)); + apr_snprintf(pidbuf, sizeof(pidbuf), "AP_PARENT_PID=%i", parent_pid); + env[envc] = pidbuf; + env[envc + 1] = NULL; + + rv = apr_proc_create(&new_child, cmd, args, env, attr, ptemp); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_CRIT, rv, ap_server_conf, + "Parent: Failed to create the child process."); + apr_pool_destroy(ptemp); + CloseHandle(hExitEvent); + CloseHandle(waitlist[waitlist_ready]); + CloseHandle(new_child.hproc); + return -1; + } + apr_file_close(child_out); + ap_log_error(APLOG_MARK, APLOG_NOTICE, APR_SUCCESS, ap_server_conf, + "Parent: Created child process %d", new_child.pid); + + if (send_handles_to_child(ptemp, waitlist[waitlist_ready], hExitEvent, + start_mutex, ap_scoreboard_shm, + new_child.hproc, new_child.in)) { + /* + * This error is fatal, mop up the child and move on + * We toggle the child's exit event to cause this child + * to quit even as it is attempting to start. + */ + SetEvent(hExitEvent); + apr_pool_destroy(ptemp); + CloseHandle(hExitEvent); + CloseHandle(waitlist[waitlist_ready]); + CloseHandle(new_child.hproc); + return -1; + } + + /* Important: + * Give the child process a chance to run before dup'ing the sockets. + * We have already set the listening sockets noninheritable, but if + * WSADuplicateSocket runs before the child process initializes + * the listeners will be inherited anyway. + */ + waitlist[waitlist_term] = new_child.hproc; + rv = WaitForMultipleObjects(2, waitlist, FALSE, INFINITE); + CloseHandle(waitlist[waitlist_ready]); + if (rv != WAIT_OBJECT_0) { + /* + * Outch... that isn't a ready signal. It's dead, Jim! + */ + SetEvent(hExitEvent); + apr_pool_destroy(ptemp); + CloseHandle(hExitEvent); + CloseHandle(new_child.hproc); + return -1; + } + + if (send_listeners_to_child(ptemp, new_child.pid, new_child.in)) { + /* + * This error is fatal, mop up the child and move on + * We toggle the child's exit event to cause this child + * to quit even as it is attempting to start. + */ + SetEvent(hExitEvent); + apr_pool_destroy(ptemp); + CloseHandle(hExitEvent); + CloseHandle(new_child.hproc); + return -1; + } + + apr_file_close(new_child.in); + + *child_exit_event = hExitEvent; + *child_proc = new_child.hproc; + *child_pid = new_child.pid; + + return 0; +} + +/*********************************************************************** + * master_main() + * master_main() runs in the parent process. It creates the child + * process which handles HTTP requests then waits on one of three + * events: + * + * restart_event + * ------------- + * The restart event causes master_main to start a new child process and + * tells the old child process to exit (by setting the child_exit_event). + * The restart event is set as a result of one of the following: + * 1. An apache -k restart command on the command line + * 2. A command received from Windows service manager which gets + * translated into an ap_signal_parent(SIGNAL_PARENT_RESTART) + * call by code in service.c. + * 3. The child process calling ap_signal_parent(SIGNAL_PARENT_RESTART) + * as a result of hitting MaxRequestsPerChild. + * + * shutdown_event + * -------------- + * The shutdown event causes master_main to tell the child process to + * exit and that the server is shutting down. The shutdown event is + * set as a result of one of the following: + * 1. An apache -k shutdown command on the command line + * 2. A command received from Windows service manager which gets + * translated into an ap_signal_parent(SIGNAL_PARENT_SHUTDOWN) + * call by code in service.c. + * + * child process handle + * -------------------- + * The child process handle will be signaled if the child process + * exits for any reason. In a normal running server, the signaling + * of this event means that the child process has exited prematurely + * due to a seg fault or other irrecoverable error. For server + * robustness, master_main will restart the child process under this + * condtion. + * + * master_main uses the child_exit_event to signal the child process + * to exit. + **********************************************************************/ +#define NUM_WAIT_HANDLES 3 +#define CHILD_HANDLE 0 +#define SHUTDOWN_HANDLE 1 +#define RESTART_HANDLE 2 +static int master_main(server_rec *s, HANDLE shutdown_event, HANDLE restart_event) +{ + int rv, cld; + int restart_pending; + int shutdown_pending; + HANDLE child_exit_event; + HANDLE event_handles[NUM_WAIT_HANDLES]; + DWORD child_pid; + + restart_pending = shutdown_pending = 0; + + event_handles[SHUTDOWN_HANDLE] = shutdown_event; + event_handles[RESTART_HANDLE] = restart_event; + + /* Create a single child process */ + rv = create_process(pconf, &event_handles[CHILD_HANDLE], + &child_exit_event, &child_pid); + if (rv < 0) + { + ap_log_error(APLOG_MARK, APLOG_CRIT, apr_get_os_error(), ap_server_conf, + "master_main: create child process failed. Exiting."); + shutdown_pending = 1; + goto die_now; + } + if (!strcasecmp(signal_arg, "runservice")) { + mpm_service_started(); + } + + /* Update the scoreboard. Note that there is only a single active + * child at once. + */ + ap_scoreboard_image->parent[0].quiescing = 0; + ap_scoreboard_image->parent[0].pid = child_pid; + + /* Wait for shutdown or restart events or for child death */ + winnt_mpm_state = AP_MPMQ_RUNNING; + rv = WaitForMultipleObjects(NUM_WAIT_HANDLES, (HANDLE *) event_handles, FALSE, INFINITE); + cld = rv - WAIT_OBJECT_0; + if (rv == WAIT_FAILED) { + /* Something serious is wrong */ + ap_log_error(APLOG_MARK,APLOG_CRIT, apr_get_os_error(), ap_server_conf, + "master_main: WaitForMultipeObjects WAIT_FAILED -- doing server shutdown"); + shutdown_pending = 1; + } + else if (rv == WAIT_TIMEOUT) { + /* Hey, this cannot happen */ + ap_log_error(APLOG_MARK, APLOG_ERR, apr_get_os_error(), s, + "master_main: WaitForMultipeObjects with INFINITE wait exited with WAIT_TIMEOUT"); + shutdown_pending = 1; + } + else if (cld == SHUTDOWN_HANDLE) { + /* shutdown_event signalled */ + shutdown_pending = 1; + ap_log_error(APLOG_MARK, APLOG_NOTICE, APR_SUCCESS, s, + "Parent: Received shutdown signal -- Shutting down the server."); + if (ResetEvent(shutdown_event) == 0) { + ap_log_error(APLOG_MARK, APLOG_ERR, apr_get_os_error(), s, + "ResetEvent(shutdown_event)"); + } + } + else if (cld == RESTART_HANDLE) { + /* Received a restart event. Prepare the restart_event to be reused + * then signal the child process to exit. + */ + restart_pending = 1; + ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, s, + "Parent: Received restart signal -- Restarting the server."); + if (ResetEvent(restart_event) == 0) { + ap_log_error(APLOG_MARK, APLOG_ERR, apr_get_os_error(), s, + "Parent: ResetEvent(restart_event) failed."); + } + if (SetEvent(child_exit_event) == 0) { + ap_log_error(APLOG_MARK, APLOG_ERR, apr_get_os_error(), s, + "Parent: SetEvent for child process %d failed.", + event_handles[CHILD_HANDLE]); + } + /* Don't wait to verify that the child process really exits, + * just move on with the restart. + */ + CloseHandle(event_handles[CHILD_HANDLE]); + event_handles[CHILD_HANDLE] = NULL; + } + else { + /* The child process exited prematurely due to a fatal error. */ + DWORD exitcode; + if (!GetExitCodeProcess(event_handles[CHILD_HANDLE], &exitcode)) { + /* HUH? We did exit, didn't we? */ + exitcode = APEXIT_CHILDFATAL; + } + if ( exitcode == APEXIT_CHILDFATAL + || exitcode == APEXIT_CHILDINIT + || exitcode == APEXIT_INIT) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, ap_server_conf, + "Parent: child process exited with status %u -- Aborting.", exitcode); + } + else { + int i; + restart_pending = 1; + ap_log_error(APLOG_MARK, APLOG_NOTICE, APR_SUCCESS, ap_server_conf, + "Parent: child process exited with status %u -- Restarting.", exitcode); + for (i = 0; i < ap_threads_per_child; i++) { + ap_update_child_status_from_indexes(0, i, SERVER_DEAD, NULL); + } + } + CloseHandle(event_handles[CHILD_HANDLE]); + event_handles[CHILD_HANDLE] = NULL; + } + if (restart_pending) { + ++ap_my_generation; + ap_scoreboard_image->global->running_generation = ap_my_generation; + } +die_now: + if (shutdown_pending) + { + int timeout = 30000; /* Timeout is milliseconds */ + winnt_mpm_state = AP_MPMQ_STOPPING; + + /* This shutdown is only marginally graceful. We will give the + * child a bit of time to exit gracefully. If the time expires, + * the child will be wacked. + */ + if (!strcasecmp(signal_arg, "runservice")) { + mpm_service_stopping(); + } + /* Signal the child processes to exit */ + if (SetEvent(child_exit_event) == 0) { + ap_log_error(APLOG_MARK,APLOG_ERR, apr_get_os_error(), ap_server_conf, + "Parent: SetEvent for child process %d failed", event_handles[CHILD_HANDLE]); + } + if (event_handles[CHILD_HANDLE]) { + rv = WaitForSingleObject(event_handles[CHILD_HANDLE], timeout); + if (rv == WAIT_OBJECT_0) { + ap_log_error(APLOG_MARK,APLOG_NOTICE, APR_SUCCESS, ap_server_conf, + "Parent: Child process exited successfully."); + CloseHandle(event_handles[CHILD_HANDLE]); + event_handles[CHILD_HANDLE] = NULL; + } + else { + ap_log_error(APLOG_MARK,APLOG_NOTICE, APR_SUCCESS, ap_server_conf, + "Parent: Forcing termination of child process %d ", event_handles[CHILD_HANDLE]); + TerminateProcess(event_handles[CHILD_HANDLE], 1); + CloseHandle(event_handles[CHILD_HANDLE]); + event_handles[CHILD_HANDLE] = NULL; + } + } + CloseHandle(child_exit_event); + return 0; /* Tell the caller we do not want to restart */ + } + winnt_mpm_state = AP_MPMQ_STARTING; + CloseHandle(child_exit_event); + return 1; /* Tell the caller we want a restart */ +} + +/* service_nt_main_fn needs to append the StartService() args + * outside of our call stack and thread as the service starts... + */ +apr_array_header_t *mpm_new_argv; + +/* Remember service_to_start failures to log and fail in pre_config. + * Remember inst_argc and inst_argv for installing or starting the + * service after we preflight the config. + */ + +AP_DECLARE(apr_status_t) ap_mpm_query(int query_code, int *result) +{ + switch(query_code){ + case AP_MPMQ_MAX_DAEMON_USED: + *result = MAXIMUM_WAIT_OBJECTS; + return APR_SUCCESS; + case AP_MPMQ_IS_THREADED: + *result = AP_MPMQ_STATIC; + return APR_SUCCESS; + case AP_MPMQ_IS_FORKED: + *result = AP_MPMQ_NOT_SUPPORTED; + return APR_SUCCESS; + case AP_MPMQ_HARD_LIMIT_DAEMONS: + *result = HARD_SERVER_LIMIT; + return APR_SUCCESS; + case AP_MPMQ_HARD_LIMIT_THREADS: + *result = thread_limit; + return APR_SUCCESS; + case AP_MPMQ_MAX_THREADS: + *result = ap_threads_per_child; + return APR_SUCCESS; + case AP_MPMQ_MIN_SPARE_DAEMONS: + *result = 0; + return APR_SUCCESS; + case AP_MPMQ_MIN_SPARE_THREADS: + *result = 0; + return APR_SUCCESS; + case AP_MPMQ_MAX_SPARE_DAEMONS: + *result = 0; + return APR_SUCCESS; + case AP_MPMQ_MAX_SPARE_THREADS: + *result = 0; + return APR_SUCCESS; + case AP_MPMQ_MAX_REQUESTS_DAEMON: + *result = ap_max_requests_per_child; + return APR_SUCCESS; + case AP_MPMQ_MAX_DAEMONS: + *result = 0; + return APR_SUCCESS; + case AP_MPMQ_MPM_STATE: + *result = winnt_mpm_state; + return APR_SUCCESS; + } + return APR_ENOTIMPL; +} + +#define SERVICE_UNSET (-1) +static apr_status_t service_set = SERVICE_UNSET; +static apr_status_t service_to_start_success; +static int inst_argc; +static const char * const *inst_argv; +static char *service_name = NULL; + +void winnt_rewrite_args(process_rec *process) +{ + /* Handle the following SCM aspects in this phase: + * + * -k runservice [transition for WinNT, nothing for Win9x] + * -k (!)install [error out if name is not installed] + * -k uninstall + * -k stop + * -k shutdown (same as -k stop). Maintained for backward compatability. + * + * We can't leave this phase until we know our identity + * and modify the command arguments appropriately. + * + * We do not care if the .conf file exists or is parsable when + * attempting to stop or uninstall a service. + */ + apr_status_t rv; + char *def_server_root; + char *binpath; + char optbuf[3]; + const char *optarg; + int fixed_args; + char *pid; + apr_getopt_t *opt; + int running_as_service = 1; + int errout = 0; + + pconf = process->pconf; + + osver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&osver); + + /* AP_PARENT_PID is only valid in the child */ + pid = getenv("AP_PARENT_PID"); + if (pid) + { + HANDLE filehand; + HANDLE hproc = GetCurrentProcess(); + + /* This is the child */ + my_pid = GetCurrentProcessId(); + parent_pid = (DWORD) atol(pid); + + /* Prevent holding open the (nonexistant) console */ + real_exit_code = 0; + + /* The parent gave us stdin, we need to remember this + * handle, and no longer inherit it at our children + * (we can't slurp it up now, we just aren't ready yet). + * The original handle is closed below, at apr_file_dup2() + */ + pipe = GetStdHandle(STD_INPUT_HANDLE); + if (DuplicateHandle(hproc, pipe, + hproc, &filehand, 0, FALSE, + DUPLICATE_SAME_ACCESS)) { + pipe = filehand; + } + + /* The parent gave us stdout of the NUL device, + * and expects us to suck up stdin of all of our + * shared handles and data from the parent. + * Don't infect child processes with our stdin + * handle, use another handle to NUL! + */ + { + apr_file_t *infile, *outfile; + if ((apr_file_open_stdout(&outfile, process->pool) == APR_SUCCESS) + && (apr_file_open_stdin(&infile, process->pool) == APR_SUCCESS)) + apr_file_dup2(infile, outfile, process->pool); + } + + /* This child needs the existing stderr opened for logging, + * already + */ + + /* The parent is responsible for providing the + * COMPLETE ARGUMENTS REQUIRED to the child. + * + * No further argument parsing is needed, but + * for good measure we will provide a simple + * signal string for later testing. + */ + signal_arg = "runchild"; + return; + } + + /* This is the parent, we have a long way to go :-) */ + parent_pid = my_pid = GetCurrentProcessId(); + + /* This behavior is voided by setting real_exit_code to 0 */ + atexit(hold_console_open_on_error); + + /* Rewrite process->argv[]; + * + * strip out -k signal into signal_arg + * strip out -n servicename and set the names + * add default -d serverroot from the path of this executable + * + * The end result will look like: + * + * The invocation command (%0) + * The -d serverroot default from the running executable + * The requested service's (-n) registry ConfigArgs + * The WinNT SCM's StartService() args + */ + if ((rv = ap_os_proc_filepath(&binpath, process->pconf)) + != APR_SUCCESS) { + ap_log_error(APLOG_MARK,APLOG_CRIT, rv, NULL, + "Failed to get the full path of %s", process->argv[0]); + exit(APEXIT_INIT); + } + /* WARNING: There is an implict assumption here that the + * executable resides in ServerRoot or ServerRoot\bin + */ + def_server_root = (char *) apr_filename_of_pathname(binpath); + if (def_server_root > binpath) { + *(def_server_root - 1) = '\0'; + def_server_root = (char *) apr_filename_of_pathname(binpath); + if (!strcasecmp(def_server_root, "bin")) + *(def_server_root - 1) = '\0'; + } + apr_filepath_merge(&def_server_root, NULL, binpath, + APR_FILEPATH_TRUENAME, process->pool); + + /* Use process->pool so that the rewritten argv + * lasts for the lifetime of the server process, + * because pconf will be destroyed after the + * initial pre-flight of the config parser. + */ + mpm_new_argv = apr_array_make(process->pool, process->argc + 2, + sizeof(const char *)); + *(const char **)apr_array_push(mpm_new_argv) = process->argv[0]; + *(const char **)apr_array_push(mpm_new_argv) = "-d"; + *(const char **)apr_array_push(mpm_new_argv) = def_server_root; + + fixed_args = mpm_new_argv->nelts; + + optbuf[0] = '-'; + optbuf[2] = '\0'; + apr_getopt_init(&opt, process->pool, process->argc, (char**) process->argv); + opt->errfn = NULL; + while ((rv = apr_getopt(opt, "wn:k:" AP_SERVER_BASEARGS, + optbuf + 1, &optarg)) == APR_SUCCESS) { + switch (optbuf[1]) { + + /* Shortcuts; include the -w option to hold the window open on error. + * This must not be toggled once we reset real_exit_code to 0! + */ + case 'w': + if (real_exit_code) + real_exit_code = 2; + break; + + case 'n': + service_set = mpm_service_set_name(process->pool, &service_name, + optarg); + break; + + case 'k': + signal_arg = optarg; + break; + + case 'E': + errout = 1; + /* Fall through so the Apache main() handles the 'E' arg */ + default: + *(const char **)apr_array_push(mpm_new_argv) = + apr_pstrdup(process->pool, optbuf); + + if (optarg) { + *(const char **)apr_array_push(mpm_new_argv) = optarg; + } + break; + } + } + + /* back up to capture the bad argument */ + if (rv == APR_BADCH || rv == APR_BADARG) { + opt->ind--; + } + + while (opt->ind < opt->argc) { + *(const char **)apr_array_push(mpm_new_argv) = + apr_pstrdup(process->pool, opt->argv[opt->ind++]); + } + + /* Track the number of args actually entered by the user */ + inst_argc = mpm_new_argv->nelts - fixed_args; + + /* Provide a default 'run' -k arg to simplify signal_arg tests */ + if (!signal_arg) + { + signal_arg = "run"; + running_as_service = 0; + } + + if (!strcasecmp(signal_arg, "runservice")) + { + /* Start the NT Service _NOW_ because the WinNT SCM is + * expecting us to rapidly assume control of our own + * process, the SCM will tell us our service name, and + * may have extra StartService() command arguments to + * add for us. + * + * The SCM will generally invoke the executable with + * the c:\win\system32 default directory. This is very + * lethal if folks use ServerRoot /foopath on windows + * without a drive letter. Change to the default root + * (path to apache root, above /bin) for safety. + */ + apr_filepath_set(def_server_root, process->pool); + + /* Any other process has a console, so we don't to begin + * a Win9x service until the configuration is parsed and + * any command line errors are reported. + * + * We hold the return value so that we can die in pre_config + * after logging begins, and the failure can land in the log. + */ + if (osver.dwPlatformId == VER_PLATFORM_WIN32_NT) + { + apr_file_t *nullfile; + + if (!errout) { + mpm_nt_eventlog_stderr_open(service_name, process->pool); + } + service_to_start_success = mpm_service_to_start(&service_name, + process->pool); + if (service_to_start_success == APR_SUCCESS) { + service_set = APR_SUCCESS; + } + + /* Open a null handle to soak stdout in this process. + * Windows service processes are missing any file handle + * usable for stdin/out/err. This was the cause of later + * trouble with invocations of apr_file_open_stdout() + */ + if ((rv = apr_file_open(&nullfile, "NUL", + APR_READ | APR_WRITE, APR_OS_DEFAULT, + process->pool)) == APR_SUCCESS) { + apr_file_t *nullstdout; + if (apr_file_open_stdout(&nullstdout, process->pool) + == APR_SUCCESS) + apr_file_dup2(nullstdout, nullfile, process->pool); + apr_file_close(nullfile); + } + } + } + + /* Get the default for any -k option, except run */ + if (service_set == SERVICE_UNSET && strcasecmp(signal_arg, "run")) { + service_set = mpm_service_set_name(process->pool, &service_name, + AP_DEFAULT_SERVICE_NAME); + } + + if (!strcasecmp(signal_arg, "install")) /* -k install */ + { + if (service_set == APR_SUCCESS) + { + ap_log_error(APLOG_MARK,APLOG_ERR, 0, NULL, + "%s: Service is already installed.", service_name); + exit(APEXIT_INIT); + } + } + else if (running_as_service) + { + if (service_set == APR_SUCCESS) + { + /* Attempt to Uninstall, or stop, before + * we can read the arguments or .conf files + */ + if (!strcasecmp(signal_arg, "uninstall")) { + rv = mpm_service_uninstall(); + exit(rv); + } + + if ((!strcasecmp(signal_arg, "stop")) || + (!strcasecmp(signal_arg, "shutdown"))) { + mpm_signal_service(process->pool, 0); + exit(0); + } + + rv = mpm_merge_service_args(process->pool, mpm_new_argv, + fixed_args); + if (rv == APR_SUCCESS) { + ap_log_error(APLOG_MARK,APLOG_INFO, 0, NULL, + "Using ConfigArgs of the installed service " + "\"%s\".", service_name); + } + else { + ap_log_error(APLOG_MARK,APLOG_WARNING, rv, NULL, + "No installed ConfigArgs for the service " + "\"%s\", using Apache defaults.", service_name); + } + } + else + { + ap_log_error(APLOG_MARK,APLOG_ERR, service_set, NULL, + "No installed service named \"%s\".", service_name); + exit(APEXIT_INIT); + } + } + if (strcasecmp(signal_arg, "install") && service_set && service_set != SERVICE_UNSET) + { + ap_log_error(APLOG_MARK,APLOG_ERR, service_set, NULL, + "No installed service named \"%s\".", service_name); + exit(APEXIT_INIT); + } + + /* Track the args actually entered by the user. + * These will be used for the -k install parameters, as well as + * for the -k start service override arguments. + */ + inst_argv = (const char * const *)mpm_new_argv->elts + + mpm_new_argv->nelts - inst_argc; + + process->argc = mpm_new_argv->nelts; + process->argv = (const char * const *) mpm_new_argv->elts; +} + + +static int winnt_pre_config(apr_pool_t *pconf_, apr_pool_t *plog, apr_pool_t *ptemp) +{ + /* Handle the following SCM aspects in this phase: + * + * -k runservice [WinNT errors logged from rewrite_args] + */ + + /* Initialize shared static objects. + */ + pconf = pconf_; + + if (ap_exists_config_define("ONE_PROCESS") || + ap_exists_config_define("DEBUG")) + one_process = -1; + + if (!strcasecmp(signal_arg, "runservice") + && (osver.dwPlatformId == VER_PLATFORM_WIN32_NT) + && (service_to_start_success != APR_SUCCESS)) { + ap_log_error(APLOG_MARK,APLOG_CRIT, service_to_start_success, NULL, + "%s: Unable to start the service manager.", + service_name); + exit(APEXIT_INIT); + } + + /* Win9x: disable AcceptEx */ + if (osver.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) { + use_acceptex = 0; + } + + ap_listen_pre_config(); + ap_threads_per_child = DEFAULT_THREADS_PER_CHILD; + ap_pid_fname = DEFAULT_PIDLOG; + ap_max_requests_per_child = DEFAULT_MAX_REQUESTS_PER_CHILD; +#ifdef AP_MPM_WANT_SET_MAX_MEM_FREE + ap_max_mem_free = APR_ALLOCATOR_MAX_FREE_UNLIMITED; +#endif + + apr_cpystrn(ap_coredump_dir, ap_server_root, sizeof(ap_coredump_dir)); + + return OK; +} + +static int winnt_post_config(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp, server_rec* s) +{ + static int restart_num = 0; + apr_status_t rv = 0; + + /* Handle the following SCM aspects in this phase: + * + * -k install + * -k config + * -k start + * -k restart + * -k runservice [Win95, only once - after we parsed the config] + * + * because all of these signals are useful _only_ if there + * is a valid conf\httpd.conf environment to start. + * + * We reached this phase by avoiding errors that would cause + * these options to fail unexpectedly in another process. + */ + + if (!strcasecmp(signal_arg, "install")) { + rv = mpm_service_install(ptemp, inst_argc, inst_argv, 0); + apr_pool_destroy(s->process->pool); + apr_terminate(); + exit(rv); + } + if (!strcasecmp(signal_arg, "config")) { + rv = mpm_service_install(ptemp, inst_argc, inst_argv, 1); + apr_pool_destroy(s->process->pool); + apr_terminate(); + exit(rv); + } + + if (!strcasecmp(signal_arg, "start")) { + ap_listen_rec *lr; + + /* Close the listening sockets. */ + for (lr = ap_listeners; lr; lr = lr->next) { + apr_socket_close(lr->sd); + lr->active = 0; + } + rv = mpm_service_start(ptemp, inst_argc, inst_argv); + apr_pool_destroy(s->process->pool); + apr_terminate(); + exit(rv); + } + + if (!strcasecmp(signal_arg, "restart")) { + mpm_signal_service(ptemp, 1); + apr_pool_destroy(s->process->pool); + apr_terminate(); + exit(rv); + } + + if (parent_pid == my_pid) + { + if (restart_num++ == 1) + { + /* This code should be run once in the parent and not run + * across a restart + */ + PSECURITY_ATTRIBUTES sa = GetNullACL(); /* returns NULL if invalid (Win95?) */ + setup_signal_names(apr_psprintf(pconf,"ap%d", parent_pid)); + + ap_log_pid(pconf, ap_pid_fname); + + /* Create shutdown event, apPID_shutdown, where PID is the parent + * Apache process ID. Shutdown is signaled by 'apache -k shutdown'. + */ + shutdown_event = CreateEvent(sa, FALSE, FALSE, signal_shutdown_name); + if (!shutdown_event) { + ap_log_error(APLOG_MARK, APLOG_CRIT, apr_get_os_error(), ap_server_conf, + "Parent: Cannot create shutdown event %s", signal_shutdown_name); + CleanNullACL((void *)sa); + return HTTP_INTERNAL_SERVER_ERROR; + } + + /* Create restart event, apPID_restart, where PID is the parent + * Apache process ID. Restart is signaled by 'apache -k restart'. + */ + restart_event = CreateEvent(sa, FALSE, FALSE, signal_restart_name); + if (!restart_event) { + CloseHandle(shutdown_event); + ap_log_error(APLOG_MARK, APLOG_CRIT, apr_get_os_error(), ap_server_conf, + "Parent: Cannot create restart event %s", signal_restart_name); + CleanNullACL((void *)sa); + return HTTP_INTERNAL_SERVER_ERROR; + } + CleanNullACL((void *)sa); + + /* Now that we are flying at 15000 feet... + * wipe out the Win95 service console, + * signal the SCM the WinNT service started, or + * if not a service, setup console handlers instead. + */ + if (!strcasecmp(signal_arg, "runservice")) + { + if (osver.dwPlatformId != VER_PLATFORM_WIN32_NT) + { + rv = mpm_service_to_start(&service_name, + s->process->pool); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK,APLOG_ERR, rv, ap_server_conf, + "%s: Unable to start the service manager.", + service_name); + return HTTP_INTERNAL_SERVER_ERROR; + } + } + } + + /* Create the start mutex, as an unnamed object for security. + * Ths start mutex is used during a restart to prevent more than + * one child process from entering the accept loop at once. + */ + rv = apr_proc_mutex_create(&start_mutex, NULL, + APR_LOCK_DEFAULT, + ap_server_conf->process->pool); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK,APLOG_ERR, rv, ap_server_conf, + "%s: Unable to create the start_mutex.", + service_name); + return HTTP_INTERNAL_SERVER_ERROR; + } + } + /* Always reset our console handler to be the first, even on a restart + * because some modules (e.g. mod_perl) might have set a console + * handler to terminate the process. + */ + if (strcasecmp(signal_arg, "runservice")) + mpm_start_console_handler(); + } + else /* parent_pid != my_pid */ + { + mpm_start_child_console_handler(); + } + return OK; +} + +/* This really should be a post_config hook, but the error log is already + * redirected by that point, so we need to do this in the open_logs phase. + */ +static int winnt_open_logs(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s) +{ + /* Initialize shared static objects. + */ + ap_server_conf = s; + + if (parent_pid != my_pid) { + return OK; + } + + /* We cannot initialize our listeners if we are restarting + * (the parent process already has glomed on to them) + * nor should we do so for service reconfiguration + * (since the service may already be running.) + */ + if (!strcasecmp(signal_arg, "restart") + || !strcasecmp(signal_arg, "config")) { + return OK; + } + + if (ap_setup_listeners(s) < 1) { + ap_log_error(APLOG_MARK, APLOG_ALERT|APLOG_STARTUP, 0, + NULL, "no listening sockets available, shutting down"); + return DONE; + } + + return OK; +} + +static void winnt_child_init(apr_pool_t *pchild, struct server_rec *s) +{ + apr_status_t rv; + + setup_signal_names(apr_psprintf(pchild,"ap%d", parent_pid)); + + /* This is a child process, not in single process mode */ + if (!one_process) { + /* Set up events and the scoreboard */ + get_handles_from_parent(s, &exit_event, &start_mutex, + &ap_scoreboard_shm); + + /* Set up the listeners */ + get_listeners_from_parent(s); + + /* Done reading from the parent, close that channel */ + CloseHandle(pipe); + + ap_my_generation = ap_scoreboard_image->global->running_generation; + } + else { + /* Single process mode - this lock doesn't even need to exist */ + rv = apr_proc_mutex_create(&start_mutex, signal_name_prefix, + APR_LOCK_DEFAULT, s->process->pool); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK,APLOG_ERR, rv, ap_server_conf, + "%s child %d: Unable to init the start_mutex.", + service_name, my_pid); + exit(APEXIT_CHILDINIT); + } + + /* Borrow the shutdown_even as our _child_ loop exit event */ + exit_event = shutdown_event; + } +} + + +AP_DECLARE(int) ap_mpm_run(apr_pool_t *_pconf, apr_pool_t *plog, server_rec *s ) +{ + static int restart = 0; /* Default is "not a restart" */ + + if (!restart) { + first_thread_limit = thread_limit; + } + + if (changed_limit_at_restart) { + ap_log_error(APLOG_MARK, APLOG_WARNING, APR_SUCCESS, ap_server_conf, + "WARNING: Attempt to change ThreadLimit ignored " + "during restart"); + changed_limit_at_restart = 0; + } + + /* ### If non-graceful restarts are ever introduced - we need to rerun + * the pre_mpm hook on subsequent non-graceful restarts. But Win32 + * has only graceful style restarts - and we need this hook to act + * the same on Win32 as on Unix. + */ + if (!restart && ((parent_pid == my_pid) || one_process)) { + /* Set up the scoreboard. */ + if (ap_run_pre_mpm(s->process->pool, SB_SHARED) != OK) { + return 1; + } + } + + if ((parent_pid != my_pid) || one_process) + { + /* The child process or in one_process (debug) mode + */ + ap_log_error(APLOG_MARK, APLOG_NOTICE, APR_SUCCESS, ap_server_conf, + "Child %d: Child process is running", my_pid); + + child_main(pconf); + + ap_log_error(APLOG_MARK, APLOG_NOTICE, APR_SUCCESS, ap_server_conf, + "Child %d: Child process is exiting", my_pid); + return 1; + } + else + { + /* A real-honest to goodness parent */ + ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, ap_server_conf, + "%s configured -- resuming normal operations", + ap_get_server_version()); + ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, ap_server_conf, + "Server built: %s", ap_get_server_built()); + + restart = master_main(ap_server_conf, shutdown_event, restart_event); + + if (!restart) + { + /* Shutting down. Clean up... */ + const char *pidfile = ap_server_root_relative (pconf, ap_pid_fname); + + if (pidfile != NULL && unlink(pidfile) == 0) { + ap_log_error(APLOG_MARK, APLOG_INFO, APR_SUCCESS, + ap_server_conf, "removed PID file %s (pid=%ld)", + pidfile, GetCurrentProcessId()); + } + apr_proc_mutex_destroy(start_mutex); + + CloseHandle(restart_event); + CloseHandle(shutdown_event); + + return 1; + } + } + + return 0; /* Restart */ +} + +static void winnt_hooks(apr_pool_t *p) +{ + /* The prefork open_logs phase must run before the core's, or stderr + * will be redirected to a file, and the messages won't print to the + * console. + */ + static const char *const aszSucc[] = {"core.c", NULL}; + + ap_hook_pre_config(winnt_pre_config, NULL, NULL, APR_HOOK_MIDDLE); + ap_hook_post_config(winnt_post_config, NULL, NULL, 0); + ap_hook_child_init(winnt_child_init, NULL, NULL, APR_HOOK_MIDDLE); + ap_hook_open_logs(winnt_open_logs, NULL, aszSucc, APR_HOOK_MIDDLE); +} + +AP_MODULE_DECLARE_DATA module mpm_winnt_module = { + MPM20_MODULE_STUFF, + winnt_rewrite_args, /* hook to run before apache parses args */ + NULL, /* create per-directory config structure */ + NULL, /* merge per-directory config structures */ + NULL, /* create per-server config structure */ + NULL, /* merge per-server config structures */ + winnt_cmds, /* command apr_table_t */ + winnt_hooks /* register_hooks */ +}; + +#endif /* def WIN32 */ diff --git a/rubbos/app/httpd-2.0.64/server/mpm/winnt/mpm_winnt.h b/rubbos/app/httpd-2.0.64/server/mpm/winnt/mpm_winnt.h new file mode 100644 index 00000000..8eb04303 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/winnt/mpm_winnt.h @@ -0,0 +1,114 @@ +/* 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. + */ + +#ifndef APACHE_MPM_WINNT_H +#define APACHE_MPM_WINNT_H + +#include "ap_listen.h" + +/* From service.c: */ + +#define SERVICE_APACHE_RESTART 128 + +#ifndef AP_DEFAULT_SERVICE_NAME +#define AP_DEFAULT_SERVICE_NAME "Apache2" +#endif + +#define SERVICECONFIG9X "Software\\Microsoft\\Windows\\CurrentVersion\\RunServices" +#define SERVICECONFIG "System\\CurrentControlSet\\Services\\%s" +#define SERVICEPARAMS "System\\CurrentControlSet\\Services\\%s\\Parameters" + +apr_status_t mpm_service_set_name(apr_pool_t *p, const char **display_name, + const char *set_name); +apr_status_t mpm_merge_service_args(apr_pool_t *p, apr_array_header_t *args, + int fixed_args); + +apr_status_t mpm_service_to_start(const char **display_name, apr_pool_t *p); +apr_status_t mpm_service_started(void); +apr_status_t mpm_service_install(apr_pool_t *ptemp, int argc, + char const* const* argv, int reconfig); +apr_status_t mpm_service_uninstall(void); + +apr_status_t mpm_service_start(apr_pool_t *ptemp, int argc, + char const* const* argv); + +void mpm_signal_service(apr_pool_t *ptemp, int signal); + +void mpm_service_stopping(void); + +void mpm_start_console_handler(void); +void mpm_start_child_console_handler(void); + +/* From nt_eventlog.c: */ + +void mpm_nt_eventlog_stderr_open(char *display_name, apr_pool_t *p); +void mpm_nt_eventlog_stderr_flush(void); + +/* From winnt.c: */ +extern int use_acceptex; +extern int winnt_mpm_state; +extern OSVERSIONINFO osver; +extern void clean_child_exit(int); + +void setup_signal_names(char *prefix); + +typedef enum { + SIGNAL_PARENT_SHUTDOWN, + SIGNAL_PARENT_RESTART, + SIGNAL_PARENT_RESTART_GRACEFUL +} ap_signal_parent_e; +AP_DECLARE(void) ap_signal_parent(ap_signal_parent_e type); + +/* + * The Windoes MPM uses a queue of completion contexts that it passes + * between the accept threads and the worker threads. Declare the + * functions to access the queue and the structures passed on the + * queue in the header file to enable modules to access them + * if necessary. The queue resides in the MPM. + */ +#ifdef CONTAINING_RECORD +#undef CONTAINING_RECORD +#endif +#define CONTAINING_RECORD(address, type, field) ((type *)( \ + (PCHAR)(address) - \ + (PCHAR)(&((type *)0)->field))) +#define PADDED_ADDR_SIZE sizeof(SOCKADDR_IN)+16 +typedef struct CompContext { + struct CompContext *next; + OVERLAPPED Overlapped; + apr_socket_t *sock; + SOCKET accept_socket; + char buff[2*PADDED_ADDR_SIZE]; + struct sockaddr *sa_server; + int sa_server_len; + struct sockaddr *sa_client; + int sa_client_len; + apr_pool_t *ptrans; + apr_bucket_alloc_t *ba; +} COMP_CONTEXT, *PCOMP_CONTEXT; + +typedef enum { + IOCP_CONNECTION_ACCEPTED = 1, + IOCP_WAIT_FOR_RECEIVE = 2, + IOCP_WAIT_FOR_TRANSMITFILE = 3, + IOCP_SHUTDOWN = 4 +} io_state_e; + +AP_DECLARE(PCOMP_CONTEXT) mpm_get_completion_context(void); +AP_DECLARE(void) mpm_recycle_completion_context(PCOMP_CONTEXT pCompContext); +AP_DECLARE(apr_status_t) mpm_post_completion_context(PCOMP_CONTEXT pCompContext, io_state_e state); +void hold_console_open_on_error(void); +#endif /* APACHE_MPM_WINNT_H */ diff --git a/rubbos/app/httpd-2.0.64/server/mpm/winnt/nt_eventlog.c b/rubbos/app/httpd-2.0.64/server/mpm/winnt/nt_eventlog.c new file mode 100644 index 00000000..37a349e8 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/winnt/nt_eventlog.c @@ -0,0 +1,175 @@ +/* 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. + */ + +#define CORE_PRIVATE + +#include "httpd.h" +#include "http_log.h" +#include "mpm_winnt.h" +#include "apr_strings.h" +#include "apr_lib.h" +#include "apr_portable.h" +#include "ap_regkey.h" + +static char *display_name = NULL; +static HANDLE stderr_thread = NULL; +static HANDLE stderr_ready; + +static DWORD WINAPI service_stderr_thread(LPVOID hPipe) +{ + HANDLE hPipeRead = (HANDLE) hPipe; + HANDLE hEventSource; + char errbuf[256]; + char *errmsg = errbuf; + const char *errarg[9]; + DWORD errres; + ap_regkey_t *regkey; + apr_status_t rv; + apr_pool_t *p; + + apr_pool_sub_make(&p, NULL, NULL); + + errarg[0] = "The Apache service named"; + errarg[1] = display_name; + errarg[2] = "reported the following error:\r\n>>>"; + errarg[3] = errbuf; + errarg[4] = NULL; + errarg[5] = NULL; + errarg[6] = NULL; + errarg[7] = NULL; + errarg[8] = NULL; + + /* What are we going to do in here, bail on the user? not. */ + if ((rv = ap_regkey_open(®key, AP_REGKEY_LOCAL_MACHINE, + "SYSTEM\\CurrentControlSet\\Services\\" + "EventLog\\Application\\Apache Service", + APR_READ | APR_WRITE | APR_CREATE, p)) + == APR_SUCCESS) + { + DWORD dwData = EVENTLOG_ERROR_TYPE | EVENTLOG_WARNING_TYPE | + EVENTLOG_INFORMATION_TYPE; + + /* The stock message file */ + ap_regkey_value_set(regkey, "EventMessageFile", + "%SystemRoot%\\System32\\netmsg.dll", + AP_REGKEY_EXPAND, p); + + ap_regkey_value_raw_set(regkey, "TypesSupported", &dwData, + sizeof(dwData), REG_DWORD, p); + ap_regkey_close(regkey); + } + + hEventSource = RegisterEventSourceW(NULL, L"Apache Service"); + + SetEvent(stderr_ready); + + while (ReadFile(hPipeRead, errmsg, 1, &errres, NULL) && (errres == 1)) + { + if ((errmsg > errbuf) || !apr_isspace(*errmsg)) + { + ++errmsg; + if ((*(errmsg - 1) == '\n') + || (errmsg >= errbuf + sizeof(errbuf) - 1)) + { + while ((errmsg > errbuf) && apr_isspace(*(errmsg - 1))) { + --errmsg; + } + *errmsg = '\0'; + + /* Generic message: '%1 %2 %3 %4 %5 %6 %7 %8 %9' + * The event code in netmsg.dll is 3299 + */ + ReportEvent(hEventSource, EVENTLOG_ERROR_TYPE, 0, + 3299, NULL, 9, 0, errarg, NULL); + errmsg = errbuf; + } + } + } + + if ((errres = GetLastError()) != ERROR_BROKEN_PIPE) { + apr_snprintf(errbuf, sizeof(errbuf), + "Win32 error %d reading stderr pipe stream\r\n", + GetLastError()); + + ReportEvent(hEventSource, EVENTLOG_ERROR_TYPE, 0, + 3299, NULL, 9, 0, errarg, NULL); + } + + CloseHandle(hPipeRead); + DeregisterEventSource(hEventSource); + CloseHandle(stderr_thread); + stderr_thread = NULL; + apr_pool_destroy(p); + return 0; +} + + +void mpm_nt_eventlog_stderr_flush(void) +{ + HANDLE cleanup_thread = stderr_thread; + + if (cleanup_thread) { + HANDLE hErr = GetStdHandle(STD_ERROR_HANDLE); + fclose(stderr); + CloseHandle(hErr); + WaitForSingleObject(cleanup_thread, 30000); + CloseHandle(cleanup_thread); + } +} + + +void mpm_nt_eventlog_stderr_open(char *argv0, apr_pool_t *p) +{ + SECURITY_ATTRIBUTES sa; + HANDLE hProc = GetCurrentProcess(); + HANDLE hPipeRead = NULL; + HANDLE hPipeWrite = NULL; + HANDLE hDup = NULL; + DWORD threadid; + apr_file_t *eventlog_file; + apr_file_t *stderr_file; + + display_name = argv0; + + /* Create a pipe to send stderr messages to the system error log. + * + * _dup2() duplicates the write handle inheritable for us. + */ + sa.nLength = sizeof(sa); + sa.lpSecurityDescriptor = NULL; + sa.bInheritHandle = FALSE; + CreatePipe(&hPipeRead, &hPipeWrite, NULL, 0); + ap_assert(hPipeRead && hPipeWrite); + + stderr_ready = CreateEvent(NULL, FALSE, FALSE, NULL); + stderr_thread = CreateThread(NULL, 0, service_stderr_thread, + (LPVOID) hPipeRead, 0, &threadid); + ap_assert(stderr_ready && stderr_thread); + + WaitForSingleObject(stderr_ready, INFINITE); + + if ((apr_file_open_stderr(&stderr_file, p) + == APR_SUCCESS) + && (apr_os_file_put(&eventlog_file, &hPipeWrite, APR_WRITE, p) + == APR_SUCCESS)) + apr_file_dup2(stderr_file, eventlog_file, p); + + /* The code above _will_ corrupt the StdHandle... + * and we must do so anyways. We set this up only + * after we initialized the posix stderr API. + */ + ap_open_stderr_log(p); +} diff --git a/rubbos/app/httpd-2.0.64/server/mpm/winnt/service.c b/rubbos/app/httpd-2.0.64/server/mpm/winnt/service.c new file mode 100644 index 00000000..8739dc08 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/winnt/service.c @@ -0,0 +1,1346 @@ +/* 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. + */ + +/* This module ALONE requires the window message API from user.h + * and the default APR include of windows.h will omit it, so + * preload the API symbols now... + */ + +#define CORE_PRIVATE +#define _WINUSER_ + +#include "httpd.h" +#include "http_log.h" +#include "mpm_winnt.h" +#include "apr_strings.h" +#include "apr_lib.h" +#include "ap_regkey.h" + +#ifdef NOUSER +#undef NOUSER +#endif +#undef _WINUSER_ +#include + +static char *mpm_service_name = NULL; +static char *mpm_display_name = NULL; + +static struct +{ + HANDLE mpm_thread; /* primary thread handle of the apache server */ + HANDLE service_thread; /* thread service/monitor handle */ + DWORD service_thread_id;/* thread service/monitor ID */ + HANDLE service_init; /* controller thread init mutex */ + HANDLE service_term; /* NT service thread kill signal */ + SERVICE_STATUS ssStatus; + SERVICE_STATUS_HANDLE hServiceStatus; +} globdat; + +static int ReportStatusToSCMgr(int currentState, int exitCode, int waitHint); + + +#define PRODREGKEY "SOFTWARE\\" AP_SERVER_BASEVENDOR "\\" \ + AP_SERVER_BASEPRODUCT "\\" AP_SERVER_BASEREVISION + +/* + * Get the server root from the registry into 'dir' which is + * size bytes long. Returns 0 if the server root was found + * or if the serverroot key does not exist (in which case + * dir will contain an empty string), or -1 if there was + * an error getting the key. + */ +apr_status_t ap_registry_get_server_root(apr_pool_t *p, char **buf) +{ + apr_status_t rv; + ap_regkey_t *key; + + if ((rv = ap_regkey_open(&key, AP_REGKEY_LOCAL_MACHINE, PRODREGKEY, + APR_READ, p)) == APR_SUCCESS) { + rv = ap_regkey_value_get(buf, key, "ServerRoot", p); + ap_regkey_close(key); + if (rv == APR_SUCCESS) + return rv; + } + + if ((rv = ap_regkey_open(&key, AP_REGKEY_CURRENT_USER, PRODREGKEY, + APR_READ, p)) == APR_SUCCESS) { + rv = ap_regkey_value_get(buf, key, "ServerRoot", p); + ap_regkey_close(key); + if (rv == APR_SUCCESS) + return rv; + } + + *buf = NULL; + return rv; +} + + +/* The service configuration's is stored under the following trees: + * + * HKLM\System\CurrentControlSet\Services\[service name] + * + * \DisplayName + * \ImagePath + * \Parameters\ConfigArgs + * + * For Win9x, the launch service command is stored under: + * + * HKLM\Software\Microsoft\Windows\CurrentVersion\RunServices\[service name] + */ + + +/* exit() for Win32 is macro mapped (horrible, we agree) that allows us + * to catch the non-zero conditions and inform the console process that + * the application died, and hang on to the console a bit longer. + * + * The macro only maps for http_main.c and other sources that include + * the service.h header, so we best assume it's an error to exit from + * _any_ other module. + * + * If real_exit_code is reset to 0, it will not be set or trigger this + * behavior on exit. All service and child processes are expected to + * reset this flag to zero to avoid undesireable side effects. + */ +AP_DECLARE_DATA int real_exit_code = 1; + +void hold_console_open_on_error(void) +{ + HANDLE hConIn; + HANDLE hConErr; + DWORD result; + time_t start; + time_t remains; + char *msg = "Note the errors or messages above, " + "and press the key to exit. "; + CONSOLE_SCREEN_BUFFER_INFO coninfo; + INPUT_RECORD in; + char count[16]; + + if (!real_exit_code) + return; + hConIn = GetStdHandle(STD_INPUT_HANDLE); + hConErr = GetStdHandle(STD_ERROR_HANDLE); + if ((hConIn == INVALID_HANDLE_VALUE) || (hConErr == INVALID_HANDLE_VALUE)) + return; + if (!WriteConsole(hConErr, msg, strlen(msg), &result, NULL) || !result) + return; + if (!GetConsoleScreenBufferInfo(hConErr, &coninfo)) + return; + if (!SetConsoleMode(hConIn, ENABLE_MOUSE_INPUT | 0x80)) + return; + + start = time(NULL); + do + { + while (PeekConsoleInput(hConIn, &in, 1, &result) && result) + { + if (!ReadConsoleInput(hConIn, &in, 1, &result) || !result) + return; + if ((in.EventType == KEY_EVENT) && in.Event.KeyEvent.bKeyDown + && (in.Event.KeyEvent.uChar.AsciiChar == 27)) + return; + if (in.EventType == MOUSE_EVENT + && (in.Event.MouseEvent.dwEventFlags == DOUBLE_CLICK)) + return; + } + remains = ((start + 30) - time(NULL)); + sprintf (count, "%d...", remains); + if (!SetConsoleCursorPosition(hConErr, coninfo.dwCursorPosition)) + return; + if (!WriteConsole(hConErr, count, strlen(count), &result, NULL) + || !result) + return; + } + while ((remains > 0) && WaitForSingleObject(hConIn, 1000) != WAIT_FAILED); +} + +static BOOL die_on_logoff = FALSE; + +static LRESULT CALLBACK monitor_service_9x_proc(HWND hWnd, UINT msg, + WPARAM wParam, LPARAM lParam) +{ +/* This is the WndProc procedure for our invisible window. + * When the user shuts down the system, this window is sent + * a signal WM_ENDSESSION. We clean up by signaling Apache + * to shut down, and idle until Apache's primary thread quits. + */ + if ((msg == WM_ENDSESSION) + && (die_on_logoff || (lParam != ENDSESSION_LOGOFF))) + { + ap_signal_parent(SIGNAL_PARENT_SHUTDOWN); + if (wParam) + /* Don't leave this message until we are dead! */ + WaitForSingleObject(globdat.mpm_thread, 30000); + return 0; + } + return (DefWindowProc(hWnd, msg, wParam, lParam)); +} + +static DWORD WINAPI monitor_service_9x_thread(void *service_name) +{ + /* When running as a service under Windows 9x, there is no console + * window present, and no ConsoleCtrlHandler to call when the system + * is shutdown. If the WatchWindow thread is created with a NULL + * service_name argument, then the ...SystemMonitor window class is + * used to create the "Apache" window to watch for logoff and shutdown. + * If the service_name is provided, the ...ServiceMonitor window class + * is used to create the window named by the service_name argument, + * and the logoff message is ignored. + */ + WNDCLASS wc; + HWND hwndMain; + MSG msg; + + wc.style = CS_GLOBALCLASS; + wc.lpfnWndProc = monitor_service_9x_proc; + wc.cbClsExtra = 0; + wc.cbWndExtra = 0; + wc.hInstance = NULL; + wc.hIcon = NULL; + wc.hCursor = NULL; + wc.hbrBackground = NULL; + wc.lpszMenuName = NULL; + if (service_name) + wc.lpszClassName = "ApacheWin95ServiceMonitor"; + else + wc.lpszClassName = "ApacheWin95SystemMonitor"; + + die_on_logoff = service_name ? FALSE : TRUE; + + if (!RegisterClass(&wc)) + { + ap_log_error(APLOG_MARK, APLOG_ERR | APLOG_STARTUP, apr_get_os_error(), + NULL, "Could not register window class for WatchWindow"); + globdat.service_thread_id = 0; + return 0; + } + + /* Create an invisible window */ + hwndMain = CreateWindow(wc.lpszClassName, + service_name ? (char *) service_name : "Apache", + WS_OVERLAPPEDWINDOW & ~WS_VISIBLE, + CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, + CW_USEDEFAULT, NULL, NULL, NULL, NULL); + + if (!hwndMain) + { + ap_log_error(APLOG_MARK, APLOG_ERR | APLOG_STARTUP, apr_get_os_error(), + NULL, "Could not create WatchWindow"); + globdat.service_thread_id = 0; + return 0; + } + + /* If we succeed, eliminate the console window. + * Signal the parent we are all set up, and + * watch the message queue while the window lives. + */ + FreeConsole(); + SetEvent(globdat.service_init); + + while (GetMessage(&msg, NULL, 0, 0)) + { + if (msg.message == WM_CLOSE) + DestroyWindow(hwndMain); + else { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + globdat.service_thread_id = 0; + return 0; +} + + +static BOOL CALLBACK console_control_handler(DWORD ctrl_type) +{ + switch (ctrl_type) + { + case CTRL_BREAK_EVENT: + fprintf(stderr, "Apache server restarting...\n"); + ap_signal_parent(SIGNAL_PARENT_RESTART); + return TRUE; + case CTRL_C_EVENT: + fprintf(stderr, "Apache server interrupted...\n"); + /* for Interrupt signals, shut down the server. + * Tell the system we have dealt with the signal + * without waiting for Apache to terminate. + */ + ap_signal_parent(SIGNAL_PARENT_SHUTDOWN); + return TRUE; + + case CTRL_CLOSE_EVENT: + case CTRL_LOGOFF_EVENT: + case CTRL_SHUTDOWN_EVENT: + /* for Terminate signals, shut down the server. + * Wait for Apache to terminate, but respond + * after a reasonable time to tell the system + * that we did attempt to shut ourself down. + * THESE EVENTS WILL NOT OCCUR UNDER WIN9x! + */ + fprintf(stderr, "Apache server shutdown initiated...\n"); + ap_signal_parent(SIGNAL_PARENT_SHUTDOWN); + Sleep(30000); + return TRUE; + } + + /* We should never get here, but this is (mostly) harmless */ + return FALSE; +} + + +static void stop_console_handler(void) +{ + SetConsoleCtrlHandler(console_control_handler, FALSE); +} + + +void mpm_start_console_handler(void) +{ + SetConsoleCtrlHandler(console_control_handler, TRUE); + atexit(stop_console_handler); +} + + +/* Special situation - children of services need to mind their + * P's & Q's and wait quietly, ignoring the mean OS signaling + * shutdown and other horrors, to kill them gracefully... + */ + +static BOOL CALLBACK child_control_handler(DWORD ctrl_type) +{ + switch (ctrl_type) + { + case CTRL_C_EVENT: + case CTRL_BREAK_EVENT: + /* for Interrupt signals, ignore them. + * The system will also signal the parent process, + * which will terminate Apache. + */ + return TRUE; + + case CTRL_CLOSE_EVENT: + case CTRL_LOGOFF_EVENT: + case CTRL_SHUTDOWN_EVENT: + /* for Shutdown signals, ignore them, but... . + * The system will also signal the parent process, + * which will terminate Apache, so we need to wait. + */ + Sleep(30000); + return TRUE; + } + + /* We should never get here, but this is (mostly) harmless */ + return FALSE; +} + + +static void stop_child_console_handler(void) +{ + SetConsoleCtrlHandler(child_control_handler, FALSE); +} + + +void mpm_start_child_console_handler(void) +{ + if (osver.dwPlatformId == VER_PLATFORM_WIN32_NT) { + FreeConsole(); + } + else + { + SetConsoleCtrlHandler(child_control_handler, TRUE); + atexit(stop_child_console_handler); + } +} + + +/********************************** + WinNT service control management + **********************************/ + +static int ReportStatusToSCMgr(int currentState, int exitCode, int waitHint) +{ + static int checkPoint = 1; + int rv = APR_SUCCESS; + + if (globdat.hServiceStatus) + { + if (currentState == SERVICE_RUNNING) { + globdat.ssStatus.dwWaitHint = 0; + globdat.ssStatus.dwCheckPoint = 0; + globdat.ssStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP; + } + else if (currentState == SERVICE_STOPPED) { + globdat.ssStatus.dwWaitHint = 0; + globdat.ssStatus.dwCheckPoint = 0; + if (!exitCode && globdat.ssStatus.dwCurrentState + != SERVICE_STOP_PENDING) { + /* An unexpected exit? Better to error! */ + exitCode = 1; + } + if (exitCode) { + globdat.ssStatus.dwWin32ExitCode =ERROR_SERVICE_SPECIFIC_ERROR; + globdat.ssStatus.dwServiceSpecificExitCode = exitCode; + } + } + else { + globdat.ssStatus.dwCheckPoint = ++checkPoint; + globdat.ssStatus.dwControlsAccepted = 0; + if(waitHint) + globdat.ssStatus.dwWaitHint = waitHint; + } + + globdat.ssStatus.dwCurrentState = currentState; + + rv = SetServiceStatus(globdat.hServiceStatus, &globdat.ssStatus); + } + return(rv); +} + +/* Set the service description regardless of platform. + * We revert to set_service_description on NT/9x, the + * very long way so any Apache management program can grab the + * description. This would be bad on Win2000, since it wouldn't + * notify the service control manager of the name change. + */ + +/* borrowed from mpm_winnt.c */ +extern apr_pool_t *pconf; + +/* Windows 2000 alone supports ChangeServiceConfig2 in order to + * register our server_version string... so we need some fixups + * to avoid binding to that function if we are on WinNT/9x. + */ +static void set_service_description(void) +{ + const char *full_description; + SC_HANDLE schSCManager; + BOOL ret = 0; + + /* Nothing to do if we are a console + */ + if (!mpm_service_name) + return; + + /* Time to fix up the description, upon each successful restart + */ + full_description = ap_get_server_version(); + + if ((osver.dwPlatformId == VER_PLATFORM_WIN32_NT) + && (osver.dwMajorVersion > 4) + && (ChangeServiceConfig2) + && (schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT))) + { + SC_HANDLE schService = OpenService(schSCManager, mpm_service_name, + SERVICE_CHANGE_CONFIG); + if (schService) { + /* Cast is necessary, ChangeServiceConfig2 handles multiple + * object types, some volatile, some not. + */ + /* ###: utf-ize */ + if (ChangeServiceConfig2(schService, + 1 /* SERVICE_CONFIG_DESCRIPTION */, + (LPVOID) &full_description)) { + full_description = NULL; + } + CloseServiceHandle(schService); + } + CloseServiceHandle(schSCManager); + } + + if (full_description) + { + char szPath[MAX_PATH]; + ap_regkey_t *svckey; + apr_status_t rv; + + /* Find the Service key that Monitor Applications iterate */ + apr_snprintf(szPath, sizeof(szPath), + "SYSTEM\\CurrentControlSet\\Services\\%s", + mpm_service_name); + rv = ap_regkey_open(&svckey, AP_REGKEY_LOCAL_MACHINE, szPath, + APR_READ | APR_WRITE, pconf); + if (rv != APR_SUCCESS) { + return; + } + /* Attempt to set the Description value for our service */ + ap_regkey_value_set(svckey, "Description", full_description, 0, pconf); + ap_regkey_close(svckey); + } +} + +/* handle the SCM's ControlService() callbacks to our service */ + +static VOID WINAPI service_nt_ctrl(DWORD dwCtrlCode) +{ + if (dwCtrlCode == SERVICE_CONTROL_STOP) + { + ap_signal_parent(SIGNAL_PARENT_SHUTDOWN); + ReportStatusToSCMgr(SERVICE_STOP_PENDING, NO_ERROR, 30000); + return; + } + if (dwCtrlCode == SERVICE_APACHE_RESTART) + { + ap_signal_parent(SIGNAL_PARENT_RESTART); + ReportStatusToSCMgr(SERVICE_START_PENDING, NO_ERROR, 30000); + return; + } + + ReportStatusToSCMgr(globdat.ssStatus.dwCurrentState, NO_ERROR, 0); +} + + +/* service_nt_main_fn is outside of the call stack and outside of the + * primary server thread... so now we _really_ need a placeholder! + * The winnt_rewrite_args has created and shared mpm_new_argv with us. + */ +extern apr_array_header_t *mpm_new_argv; + +/* ###: utf-ize */ +static void __stdcall service_nt_main_fn(DWORD argc, LPTSTR *argv) +{ + const char *ignored; + + /* args and service names live in the same pool */ + mpm_service_set_name(mpm_new_argv->pool, &ignored, argv[0]); + + memset(&globdat.ssStatus, 0, sizeof(globdat.ssStatus)); + globdat.ssStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS; + globdat.ssStatus.dwCurrentState = SERVICE_START_PENDING; + globdat.ssStatus.dwCheckPoint = 1; + + /* ###: utf-ize */ + if (!(globdat.hServiceStatus = RegisterServiceCtrlHandler(argv[0], service_nt_ctrl))) + { + ap_log_error(APLOG_MARK, APLOG_ERR | APLOG_STARTUP, apr_get_os_error(), + NULL, "Failure registering service handler"); + return; + } + + /* Report status, no errors, and buy 3 more seconds */ + ReportStatusToSCMgr(SERVICE_START_PENDING, NO_ERROR, 30000); + + /* We need to append all the command arguments passed via StartService() + * to our running service... which just got here via the SCM... + * but we hvae no interest in argv[0] for the mpm_new_argv list. + */ + if (argc > 1) + { + char **cmb_data; + + mpm_new_argv->nalloc = mpm_new_argv->nelts + argc - 1; + cmb_data = malloc(mpm_new_argv->nalloc * sizeof(const char *)); + + /* mpm_new_argv remains first (of lower significance) */ + memcpy (cmb_data, mpm_new_argv->elts, + mpm_new_argv->elt_size * mpm_new_argv->nelts); + + /* Service args follow from StartService() invocation */ + memcpy (cmb_data + mpm_new_argv->nelts, argv + 1, + mpm_new_argv->elt_size * (argc - 1)); + + /* The replacement arg list is complete */ + mpm_new_argv->elts = (char *)cmb_data; + mpm_new_argv->nelts = mpm_new_argv->nalloc; + } + + /* Let the main thread continue now... but hang on to the + * signal_monitor event so we can take further action + */ + SetEvent(globdat.service_init); + + WaitForSingleObject(globdat.service_term, INFINITE); +} + + +DWORD WINAPI service_nt_dispatch_thread(LPVOID nada) +{ + apr_status_t rv = APR_SUCCESS; + + SERVICE_TABLE_ENTRY dispatchTable[] = + { + { "", service_nt_main_fn }, + { NULL, NULL } + }; + + /* ###: utf-ize */ + if (!StartServiceCtrlDispatcher(dispatchTable)) + { + /* This is a genuine failure of the SCM. */ + rv = apr_get_os_error(); + ap_log_error(APLOG_MARK, APLOG_ERR | APLOG_STARTUP, rv, NULL, + "Error starting service control dispatcher"); + } + + return (rv); +} + + +apr_status_t mpm_service_set_name(apr_pool_t *p, const char **display_name, + const char *set_name) +{ + char key_name[MAX_PATH]; + ap_regkey_t *key; + apr_status_t rv; + + /* ### Needs improvement, on Win2K the user can _easily_ + * change the display name to a string that doesn't reflect + * the internal service name + whitespace! + */ + mpm_service_name = apr_palloc(p, strlen(set_name) + 1); + apr_collapse_spaces((char*) mpm_service_name, set_name); + apr_snprintf(key_name, sizeof(key_name), SERVICECONFIG, mpm_service_name); + rv = ap_regkey_open(&key, AP_REGKEY_LOCAL_MACHINE, key_name, APR_READ, pconf); + if (rv == APR_SUCCESS) { + rv = ap_regkey_value_get(&mpm_display_name, key, "DisplayName", pconf); + ap_regkey_close(key); + } + if (rv != APR_SUCCESS) { + /* Take the given literal name if there is no service entry */ + mpm_display_name = apr_pstrdup(p, set_name); + } + *display_name = mpm_display_name; + return rv; +} + + +apr_status_t mpm_merge_service_args(apr_pool_t *p, + apr_array_header_t *args, + int fixed_args) +{ + apr_array_header_t *svc_args = NULL; + char conf_key[MAX_PATH]; + char **cmb_data; + apr_status_t rv; + ap_regkey_t *key; + + apr_snprintf(conf_key, sizeof(conf_key), SERVICEPARAMS, mpm_service_name); + rv = ap_regkey_open(&key, AP_REGKEY_LOCAL_MACHINE, conf_key, APR_READ, p); + if (rv == APR_SUCCESS) { + rv = ap_regkey_value_array_get(&svc_args, key, "ConfigArgs", p); + ap_regkey_close(key); + } + if (rv != APR_SUCCESS) { + if (rv == ERROR_FILE_NOT_FOUND) { + ap_log_error(APLOG_MARK, APLOG_INFO, 0, NULL, + "No ConfigArgs registered for %s, perhaps " + "this service is not installed?", + mpm_service_name); + return APR_SUCCESS; + } + else + return (rv); + } + + if (!svc_args || svc_args->nelts == 0) { + return (APR_SUCCESS); + } + + /* Now we have the mpm_service_name arg, and the mpm_runservice_nt() + * call appended the arguments passed by StartService(), so it's + * time to _prepend_ the default arguments for the server from + * the service's default arguments (all others override them)... + */ + args->nalloc = args->nelts + svc_args->nelts; + cmb_data = malloc(args->nalloc * sizeof(const char *)); + + /* First three args (argv[0], -f, path) remain first */ + memcpy(cmb_data, args->elts, args->elt_size * fixed_args); + + /* Service args follow from service registry array */ + memcpy(cmb_data + fixed_args, svc_args->elts, + svc_args->elt_size * svc_args->nelts); + + /* Remaining new args follow */ + memcpy(cmb_data + fixed_args + svc_args->nelts, + (const char **)args->elts + fixed_args, + args->elt_size * (args->nelts - fixed_args)); + + args->elts = (char *)cmb_data; + args->nelts = args->nalloc; + + return APR_SUCCESS; +} + + +void service_stopped(void) +{ + /* Still have a thread & window to clean up, so signal now */ + if (globdat.service_thread) + { + if (osver.dwPlatformId == VER_PLATFORM_WIN32_NT) + { + /* Stop logging to the event log */ + mpm_nt_eventlog_stderr_flush(); + + /* Cause the service_nt_main_fn to complete */ + ReleaseMutex(globdat.service_term); + + ReportStatusToSCMgr(SERVICE_STOPPED, // service state + NO_ERROR, // exit code + 0); // wait hint + } + else /* osver.dwPlatformId != VER_PLATFORM_WIN32_NT */ + { + RegisterServiceProcess(0, 0); + PostThreadMessage(globdat.service_thread_id, WM_CLOSE, 0, 0); + } + + WaitForSingleObject(globdat.service_thread, 5000); + CloseHandle(globdat.service_thread); + } +} + + +apr_status_t mpm_service_to_start(const char **display_name, apr_pool_t *p) +{ + HANDLE hProc = GetCurrentProcess(); + HANDLE hThread = GetCurrentThread(); + HANDLE waitfor[2]; + + /* Prevent holding open the (hidden) console */ + real_exit_code = 0; + + /* GetCurrentThread returns a psuedo-handle, we need + * a real handle for another thread to wait upon. + */ + if (!DuplicateHandle(hProc, hThread, hProc, &(globdat.mpm_thread), + 0, FALSE, DUPLICATE_SAME_ACCESS)) { + return APR_ENOTHREAD; + } + + if (osver.dwPlatformId == VER_PLATFORM_WIN32_NT) + { + globdat.service_init = CreateEvent(NULL, FALSE, FALSE, NULL); + globdat.service_term = CreateMutex(NULL, TRUE, NULL); + if (!globdat.service_init || !globdat.service_term) { + return APR_EGENERAL; + } + + globdat.service_thread = CreateThread(NULL, 0, service_nt_dispatch_thread, + NULL, 0, &globdat.service_thread_id); + } + else /* osver.dwPlatformId != VER_PLATFORM_WIN32_NT */ + { + if (!RegisterServiceProcess(0, 1)) + return GetLastError(); + + globdat.service_init = CreateEvent(NULL, FALSE, FALSE, NULL); + if (!globdat.service_init) { + return APR_EGENERAL; + } + + globdat.service_thread = CreateThread(NULL, 0, monitor_service_9x_thread, + (LPVOID) mpm_service_name, 0, + &globdat.service_thread_id); + } + + if (!globdat.service_thread) { + return APR_ENOTHREAD; + } + + waitfor[0] = globdat.service_init; + waitfor[1] = globdat.service_thread; + + /* Wait for controlling thread init or termination */ + if (WaitForMultipleObjects(2, waitfor, FALSE, 10000) != WAIT_OBJECT_0) { + return APR_ENOTHREAD; + } + + atexit(service_stopped); + *display_name = mpm_display_name; + return APR_SUCCESS; +} + + +apr_status_t mpm_service_started(void) +{ + set_service_description(); + if (osver.dwPlatformId == VER_PLATFORM_WIN32_NT) + { + ReportStatusToSCMgr(SERVICE_RUNNING, // service state + NO_ERROR, // exit code + 0); // wait hint + } + return APR_SUCCESS; +} + + +void mpm_service_stopping(void) +{ + if (osver.dwPlatformId == VER_PLATFORM_WIN32_NT) + ReportStatusToSCMgr(SERVICE_STOP_PENDING, // service state + NO_ERROR, // exit code + 30000); // wait hint +} + + +apr_status_t mpm_service_install(apr_pool_t *ptemp, int argc, + const char * const * argv, int reconfig) +{ + char key_name[MAX_PATH]; + char exe_path[MAX_PATH]; + char *launch_cmd; + ap_regkey_t *key; + apr_status_t rv; + + fprintf(stderr,reconfig ? "Reconfiguring the %s service\n" + : "Installing the %s service\n", mpm_display_name); + + /* ###: utf-ize */ + if (GetModuleFileName(NULL, exe_path, sizeof(exe_path)) == 0) + { + apr_status_t rv = apr_get_os_error(); + ap_log_error(APLOG_MARK, APLOG_ERR | APLOG_STARTUP, rv, NULL, + "GetModuleFileName failed"); + return rv; + } + + if (osver.dwPlatformId == VER_PLATFORM_WIN32_NT) + { + SC_HANDLE schService; + SC_HANDLE schSCManager; + + schSCManager = OpenSCManager(NULL, NULL, /* local, default database */ + SC_MANAGER_CREATE_SERVICE); + if (!schSCManager) { + rv = apr_get_os_error(); + ap_log_error(APLOG_MARK, APLOG_ERR | APLOG_STARTUP, rv, NULL, + "Failed to open the WinNT service manager"); + return (rv); + } + + launch_cmd = apr_psprintf(ptemp, "\"%s\" -k runservice", exe_path); + + if (reconfig) { + /* ###: utf-ize */ + schService = OpenService(schSCManager, mpm_service_name, + SERVICE_CHANGE_CONFIG); + if (!schService) { + ap_log_error(APLOG_MARK, APLOG_ERR|APLOG_ERR, + apr_get_os_error(), NULL, + "OpenService failed"); + } + /* ###: utf-ize */ + else if (!ChangeServiceConfig(schService, + SERVICE_WIN32_OWN_PROCESS, + SERVICE_AUTO_START, + SERVICE_ERROR_NORMAL, + launch_cmd, NULL, NULL, + "Tcpip\0Afd\0", NULL, NULL, + mpm_display_name)) { + ap_log_error(APLOG_MARK, APLOG_ERR|APLOG_ERR, + apr_get_os_error(), NULL, + "ChangeServiceConfig failed"); + /* !schService aborts configuration below */ + CloseServiceHandle(schService); + schService = NULL; + } + } + else { + /* RPCSS is the Remote Procedure Call (RPC) Locator required + * for DCOM communication pipes. I am far from convinced we + * should add this to the default service dependencies, but + * be warned that future apache modules or ISAPI dll's may + * depend on it. + */ + /* ###: utf-ize */ + schService = CreateService(schSCManager, // SCManager database + mpm_service_name, // name of service + mpm_display_name, // name to display + SERVICE_ALL_ACCESS, // access required + SERVICE_WIN32_OWN_PROCESS, // service type + SERVICE_AUTO_START, // start type + SERVICE_ERROR_NORMAL, // error control type + launch_cmd, // service's binary + NULL, // no load svc group + NULL, // no tag identifier + "Tcpip\0Afd\0", // dependencies + NULL, // use SYSTEM account + NULL); // no password + + if (!schService) + { + rv = apr_get_os_error(); + ap_log_error(APLOG_MARK, APLOG_ERR | APLOG_STARTUP, rv, NULL, + "Failed to create WinNT Service Profile"); + CloseServiceHandle(schSCManager); + return (rv); + } + } + + CloseServiceHandle(schService); + CloseServiceHandle(schSCManager); + } + else /* osver.dwPlatformId != VER_PLATFORM_WIN32_NT */ + { + /* Store the launch command in the registry */ + launch_cmd = apr_psprintf(ptemp, "\"%s\" -n %s -k runservice", + exe_path, mpm_service_name); + rv = ap_regkey_open(&key, AP_REGKEY_LOCAL_MACHINE, SERVICECONFIG9X, + APR_READ | APR_WRITE | APR_CREATE, pconf); + if (rv == APR_SUCCESS) { + rv = ap_regkey_value_set(key, mpm_service_name, + launch_cmd, 0, pconf); + ap_regkey_close(key); + } + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR | APLOG_STARTUP, rv, NULL, + "%s: Failed to add the RunServices registry entry.", + mpm_display_name); + return (rv); + } + + apr_snprintf(key_name, sizeof(key_name), SERVICECONFIG, mpm_service_name); + rv = ap_regkey_open(&key, AP_REGKEY_LOCAL_MACHINE, key_name, + APR_READ | APR_WRITE | APR_CREATE, pconf); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR | APLOG_STARTUP, rv, NULL, + "%s: Failed to create the registry service key.", + mpm_display_name); + return (rv); + } + rv = ap_regkey_value_set(key, "ImagePath", launch_cmd, 0, pconf); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR | APLOG_STARTUP, rv, NULL, + "%s: Failed to store ImagePath in the registry.", + mpm_display_name); + ap_regkey_close(key); + return (rv); + } + rv = ap_regkey_value_set(key, "DisplayName", + mpm_display_name, 0, pconf); + ap_regkey_close(key); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR | APLOG_STARTUP, rv, NULL, + "%s: Failed to store DisplayName in the registry.", + mpm_display_name); + return (rv); + } + } + + set_service_description(); + + /* For both WinNT & Win9x store the service ConfigArgs in the registry... + */ + apr_snprintf(key_name, sizeof(key_name), SERVICEPARAMS, mpm_service_name); + rv = ap_regkey_open(&key, AP_REGKEY_LOCAL_MACHINE, key_name, + APR_READ | APR_WRITE | APR_CREATE, pconf); + if (rv == APR_SUCCESS) { + rv = ap_regkey_value_array_set(key, "ConfigArgs", argc, argv, pconf); + ap_regkey_close(key); + } + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR | APLOG_STARTUP, rv, NULL, + "%s: Failed to store the ConfigArgs in the registry.", + mpm_display_name); + return (rv); + } + fprintf(stderr,"The %s service is successfully installed.\n", mpm_display_name); + return APR_SUCCESS; +} + + +apr_status_t mpm_service_uninstall(void) +{ + char key_name[MAX_PATH]; + apr_status_t rv; + + if (osver.dwPlatformId == VER_PLATFORM_WIN32_NT) + { + SC_HANDLE schService; + SC_HANDLE schSCManager; + + fprintf(stderr,"Removing the %s service\n", mpm_display_name); + + schSCManager = OpenSCManager(NULL, NULL, /* local, default database */ + SC_MANAGER_CONNECT); + if (!schSCManager) { + rv = apr_get_os_error(); + ap_log_error(APLOG_MARK, APLOG_ERR | APLOG_STARTUP, rv, NULL, + "Failed to open the WinNT service manager."); + return (rv); + } + + /* ###: utf-ize */ + schService = OpenService(schSCManager, mpm_service_name, DELETE); + + if (!schService) { + rv = apr_get_os_error(); + ap_log_error(APLOG_MARK, APLOG_ERR | APLOG_STARTUP, rv, NULL, + "%s: OpenService failed", mpm_display_name); + return (rv); + } + + /* assure the service is stopped before continuing + * + * This may be out of order... we might not be able to be + * granted all access if the service is running anyway. + * + * And do we want to make it *this easy* for them + * to uninstall their service unintentionally? + */ + // ap_stop_service(schService); + + if (DeleteService(schService) == 0) { + rv = apr_get_os_error(); + ap_log_error(APLOG_MARK, APLOG_ERR | APLOG_STARTUP, rv, NULL, + "%s: Failed to delete the service.", mpm_display_name); + return (rv); + } + + CloseServiceHandle(schService); + CloseServiceHandle(schSCManager); + } + else /* osver.dwPlatformId != VER_PLATFORM_WIN32_NT */ + { + apr_status_t rv2, rv3; + ap_regkey_t *key; + fprintf(stderr,"Removing the %s service\n", mpm_display_name); + + /* TODO: assure the service is stopped before continuing */ + + rv = ap_regkey_open(&key, AP_REGKEY_LOCAL_MACHINE, SERVICECONFIG9X, + APR_READ | APR_WRITE | APR_CREATE, pconf); + if (rv == APR_SUCCESS) { + rv = ap_regkey_value_remove(key, mpm_service_name, pconf); + ap_regkey_close(key); + } + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR | APLOG_STARTUP, rv, NULL, + "%s: Failed to remove the RunServices registry " + "entry.", mpm_display_name); + } + + /* we blast Services/us, not just the Services/us/Parameters branch */ + apr_snprintf(key_name, sizeof(key_name), SERVICEPARAMS, mpm_service_name); + rv2 = ap_regkey_remove(AP_REGKEY_LOCAL_MACHINE, key_name, pconf); + apr_snprintf(key_name, sizeof(key_name), SERVICECONFIG, mpm_service_name); + rv3 = ap_regkey_remove(AP_REGKEY_LOCAL_MACHINE, key_name, pconf); + rv2 = (rv2 != APR_SUCCESS) ? rv2 : rv3; + if (rv2 != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR | APLOG_STARTUP, rv2, NULL, + "%s: Failed to remove the service config from the " + "registry.", mpm_display_name); + } + rv = (rv != APR_SUCCESS) ? rv : rv2; + if (rv != APR_SUCCESS) + return rv; + } + fprintf(stderr,"The %s service has been removed successfully.\n", mpm_display_name); + return APR_SUCCESS; +} + + +/* signal_service_transition is a simple thunk to signal the service + * and monitor its successful transition. If the signal passed is 0, + * then the caller is assumed to already have performed some service + * operation to be monitored (such as StartService), and no actual + * ControlService signal is sent. + */ + +static int signal_service_transition(SC_HANDLE schService, DWORD signal, DWORD pending, DWORD complete) +{ + if (signal && !ControlService(schService, signal, &globdat.ssStatus)) + return FALSE; + + do { + Sleep(1000); + if (!QueryServiceStatus(schService, &globdat.ssStatus)) + return FALSE; + } while (globdat.ssStatus.dwCurrentState == pending); + + return (globdat.ssStatus.dwCurrentState == complete); +} + + +apr_status_t mpm_service_start(apr_pool_t *ptemp, int argc, + const char * const * argv) +{ + apr_status_t rv; + + fprintf(stderr,"Starting the %s service\n", mpm_display_name); + + if (osver.dwPlatformId == VER_PLATFORM_WIN32_NT) + { + char **start_argv; + SC_HANDLE schService; + SC_HANDLE schSCManager; + + schSCManager = OpenSCManager(NULL, NULL, /* local, default database */ + SC_MANAGER_CONNECT); + if (!schSCManager) { + rv = apr_get_os_error(); + ap_log_error(APLOG_MARK, APLOG_ERR | APLOG_STARTUP, rv, NULL, + "Failed to open the WinNT service manager"); + return (rv); + } + + /* ###: utf-ize */ + schService = OpenService(schSCManager, mpm_service_name, + SERVICE_START | SERVICE_QUERY_STATUS); + if (!schService) { + rv = apr_get_os_error(); + ap_log_error(APLOG_MARK, APLOG_ERR | APLOG_STARTUP, rv, NULL, + "%s: Failed to open the service.", mpm_display_name); + CloseServiceHandle(schSCManager); + return (rv); + } + + if (QueryServiceStatus(schService, &globdat.ssStatus) + && (globdat.ssStatus.dwCurrentState == SERVICE_RUNNING)) { + ap_log_error(APLOG_MARK, APLOG_ERR | APLOG_STARTUP, 0, NULL, + "Service %s is already started!", mpm_display_name); + CloseServiceHandle(schService); + CloseServiceHandle(schSCManager); + return 0; + } + + start_argv = malloc((argc + 1) * sizeof(const char **)); + memcpy(start_argv, argv, argc * sizeof(const char **)); + start_argv[argc] = NULL; + + rv = APR_EINIT; + /* ###: utf-ize */ + if (StartService(schService, argc, start_argv) + && signal_service_transition(schService, 0, /* test only */ + SERVICE_START_PENDING, + SERVICE_RUNNING)) + rv = APR_SUCCESS; + + if (rv != APR_SUCCESS) + rv = apr_get_os_error(); + + CloseServiceHandle(schService); + CloseServiceHandle(schSCManager); + } + else /* osver.dwPlatformId != VER_PLATFORM_WIN32_NT */ + { + STARTUPINFO si; /* Filled in prior to call to CreateProcess */ + PROCESS_INFORMATION pi; /* filled in on call to CreateProcess */ + char exe_path[MAX_PATH]; + char exe_cmd[MAX_PATH * 4]; + char *next_arg; + int i; + + /* Locate the active top level window named service_name + * provided the class is ApacheWin95ServiceMonitor + */ + if (FindWindow("ApacheWin95ServiceMonitor", mpm_service_name)) { + ap_log_error(APLOG_MARK, APLOG_ERR | APLOG_STARTUP, 0, NULL, + "Service %s is already started!", mpm_display_name); + return 0; + } + + /* This may not appear intuitive, but Win9x will not allow a process + * to detach from the console without releasing the entire console. + * Ergo, we must spawn a new process for the service to get back our + * console window. + * The config is pre-flighted, so there should be no danger of failure. + */ + + if (GetModuleFileName(NULL, exe_path, sizeof(exe_path)) == 0) + { + apr_status_t rv = apr_get_os_error(); + ap_log_error(APLOG_MARK, APLOG_ERR | APLOG_STARTUP, rv, NULL, + "GetModuleFileName failed"); + return rv; + } + + apr_snprintf(exe_cmd, sizeof(exe_cmd), + "\"%s\" -n %s -k runservice", + exe_path, mpm_service_name); + next_arg = strchr(exe_cmd, '\0'); + for (i = 0; i < argc; ++i) { + apr_snprintf(next_arg, sizeof(exe_cmd) - (next_arg - exe_cmd), + " \"%s\"", argv[i]); + next_arg = strchr(exe_cmd, '\0'); + } + + memset(&si, 0, sizeof(si)); + memset(&pi, 0, sizeof(pi)); + si.cb = sizeof(si); + si.dwFlags = STARTF_USESHOWWINDOW; + si.wShowWindow = SW_HIDE; /* This might be redundant */ + + rv = APR_EINIT; + if (CreateProcess(NULL, exe_cmd, NULL, NULL, FALSE, + DETACHED_PROCESS, /* Creation flags */ + NULL, NULL, &si, &pi)) + { + DWORD code; + while (GetExitCodeProcess(pi.hProcess, &code) == STILL_ACTIVE) { + if (FindWindow("ApacheWin95ServiceMonitor", mpm_service_name)) { + rv = APR_SUCCESS; + break; + } + Sleep (1000); + } + } + + if (rv != APR_SUCCESS) + rv = apr_get_os_error(); + + CloseHandle(pi.hProcess); + CloseHandle(pi.hThread); + } + + if (rv == APR_SUCCESS) + fprintf(stderr,"The %s service is running.\n", mpm_display_name); + else + ap_log_error(APLOG_MARK, APLOG_CRIT, rv, NULL, + "%s: Failed to start the service process.", + mpm_display_name); + + return rv; +} + + +/* signal is zero to stop, non-zero for restart */ + +void mpm_signal_service(apr_pool_t *ptemp, int signal) +{ + int success = FALSE; + + if (osver.dwPlatformId == VER_PLATFORM_WIN32_NT) + { + SC_HANDLE schService; + SC_HANDLE schSCManager; + + schSCManager = OpenSCManager(NULL, NULL, // default machine & database + SC_MANAGER_CONNECT); + + if (!schSCManager) { + ap_log_error(APLOG_MARK, APLOG_ERR | APLOG_STARTUP, apr_get_os_error(), NULL, + "Failed to open the NT Service Manager"); + return; + } + + /* ###: utf-ize */ + schService = OpenService(schSCManager, mpm_service_name, + SERVICE_INTERROGATE | SERVICE_QUERY_STATUS | + SERVICE_USER_DEFINED_CONTROL | + SERVICE_START | SERVICE_STOP); + + if (schService == NULL) { + /* Could not open the service */ + ap_log_error(APLOG_MARK, APLOG_ERR | APLOG_STARTUP, apr_get_os_error(), NULL, + "Failed to open the %s Service", mpm_display_name); + CloseServiceHandle(schSCManager); + return; + } + + if (!QueryServiceStatus(schService, &globdat.ssStatus)) { + ap_log_error(APLOG_MARK, APLOG_ERR | APLOG_STARTUP, apr_get_os_error(), NULL, + "Query of Service %s failed", mpm_display_name); + CloseServiceHandle(schService); + CloseServiceHandle(schSCManager); + return; + } + + if (!signal && (globdat.ssStatus.dwCurrentState == SERVICE_STOPPED)) { + fprintf(stderr,"The %s service is not started.\n", mpm_display_name); + CloseServiceHandle(schService); + CloseServiceHandle(schSCManager); + return; + } + + fprintf(stderr,"The %s service is %s.\n", mpm_display_name, + signal ? "restarting" : "stopping"); + + if (!signal) + success = signal_service_transition(schService, + SERVICE_CONTROL_STOP, + SERVICE_STOP_PENDING, + SERVICE_STOPPED); + else if (globdat.ssStatus.dwCurrentState == SERVICE_STOPPED) { + mpm_service_start(ptemp, 0, NULL); + CloseServiceHandle(schService); + CloseServiceHandle(schSCManager); + return; + } + else + success = signal_service_transition(schService, + SERVICE_APACHE_RESTART, + SERVICE_START_PENDING, + SERVICE_RUNNING); + + CloseServiceHandle(schService); + CloseServiceHandle(schSCManager); + } + else /* !isWindowsNT() */ + { + DWORD service_pid; + HANDLE hwnd; + char prefix[20]; + /* Locate the active top level window named service_name + * provided the class is ApacheWin95ServiceMonitor + */ + hwnd = FindWindow("ApacheWin95ServiceMonitor", mpm_service_name); + if (hwnd && GetWindowThreadProcessId(hwnd, &service_pid)) + globdat.ssStatus.dwCurrentState = SERVICE_RUNNING; + else + { + globdat.ssStatus.dwCurrentState = SERVICE_STOPPED; + if (!signal) { + fprintf(stderr,"The %s service is not started.\n", mpm_display_name); + return; + } + } + + fprintf(stderr,"The %s service is %s.\n", mpm_display_name, + signal ? "restarting" : "stopping"); + + apr_snprintf(prefix, sizeof(prefix), "ap%ld", (long)service_pid); + setup_signal_names(prefix); + + if (!signal) + { + int ticks = 60; + ap_signal_parent(SIGNAL_PARENT_SHUTDOWN); + while (--ticks) + { + if (!IsWindow(hwnd)) { + success = TRUE; + break; + } + Sleep(1000); + } + } + else /* !stop */ + { + /* TODO: Aught to add a little test to the restart logic, and + * store the restart counter in the window's user dword. + * Then we can hang on and report a successful restart. But + * that's a project for another day. + */ + if (globdat.ssStatus.dwCurrentState == SERVICE_STOPPED) { + mpm_service_start(ptemp, 0, NULL); + return; + } + else { + success = TRUE; + ap_signal_parent(SIGNAL_PARENT_RESTART); + } + } + } + + if (success) + fprintf(stderr,"The %s service has %s.\n", mpm_display_name, + signal ? "restarted" : "stopped"); + else + fprintf(stderr,"Failed to %s the %s service.\n", + signal ? "restart" : "stop", mpm_display_name); +} diff --git a/rubbos/app/httpd-2.0.64/server/mpm/worker/.deps b/rubbos/app/httpd-2.0.64/server/mpm/worker/.deps new file mode 100644 index 00000000..e69de29b diff --git a/rubbos/app/httpd-2.0.64/server/mpm/worker/.libs/fdqueue.o b/rubbos/app/httpd-2.0.64/server/mpm/worker/.libs/fdqueue.o new file mode 100644 index 0000000000000000000000000000000000000000..fb4a5ad1e5e120199ed066f73e6b0b10d38278dc GIT binary patch literal 21328 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/server/mpm/worker/.libs/libworker.la b/rubbos/app/httpd-2.0.64/server/mpm/worker/.libs/libworker.la new file mode 100644 index 00000000..464032f9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/worker/.libs/libworker.la @@ -0,0 +1,35 @@ +# libworker.la - a libtool library file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='' + +# Names of this library. +library_names='' + +# The name of the static archive. +old_library='libworker.a' + +# Libraries that this one depends upon. +dependency_libs=' -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib' + +# Version information for libworker. +current= +age= +revision= + +# Is this an already installed library? +installed=no + +# Should we warn about portability when linking against -modules? +shouldnotlink=no + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='' diff --git a/rubbos/app/httpd-2.0.64/server/mpm/worker/.libs/pod.o b/rubbos/app/httpd-2.0.64/server/mpm/worker/.libs/pod.o new file mode 100644 index 0000000000000000000000000000000000000000..42e8937199b81bc97cae147f4dc87a12883fa7d1 GIT binary patch literal 17496 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ⅇW^lvW@GeQhrpxXx(4og{5KCrfUj%cyC#zV%oKU% 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 + apr_thread_mutex_destroy(qi->idlers_mutex); + for (i = 0; i < qi->num_recycled; i++) { + apr_pool_destroy(qi->recycled_pools[i]); + } + return APR_SUCCESS; +} + +apr_status_t ap_queue_info_create(fd_queue_info_t **queue_info, + apr_pool_t *pool, int max_idlers) +{ + apr_status_t rv; + fd_queue_info_t *qi; + + qi = apr_palloc(pool, sizeof(*qi)); + memset(qi, 0, sizeof(*qi)); + + rv = apr_thread_mutex_create(&qi->idlers_mutex, APR_THREAD_MUTEX_DEFAULT, + pool); + if (rv != APR_SUCCESS) { + return rv; + } + rv = apr_thread_cond_create(&qi->wait_for_idler, pool); + if (rv != APR_SUCCESS) { + return rv; + } + qi->recycled_pools = (apr_pool_t **)apr_palloc(pool, max_idlers * + sizeof(apr_pool_t *)); + qi->num_recycled = 0; + qi->max_idlers = max_idlers; + apr_pool_cleanup_register(pool, qi, queue_info_cleanup, + apr_pool_cleanup_null); + + *queue_info = qi; + + return APR_SUCCESS; +} + +apr_status_t ap_queue_info_set_idle(fd_queue_info_t *queue_info, + apr_pool_t *pool_to_recycle) +{ + apr_status_t rv; + rv = apr_thread_mutex_lock(queue_info->idlers_mutex); + if (rv != APR_SUCCESS) { + return rv; + } + AP_DEBUG_ASSERT(queue_info->idlers >= 0); + AP_DEBUG_ASSERT(queue_info->num_recycled < queue_info->max_idlers); + if (pool_to_recycle) { + queue_info->recycled_pools[queue_info->num_recycled++] = + pool_to_recycle; + } + if (queue_info->idlers++ == 0) { + /* Only signal if we had no idlers before. */ + apr_thread_cond_signal(queue_info->wait_for_idler); + } + rv = apr_thread_mutex_unlock(queue_info->idlers_mutex); + if (rv != APR_SUCCESS) { + return rv; + } + return APR_SUCCESS; +} + +apr_status_t ap_queue_info_wait_for_idler(fd_queue_info_t *queue_info, + apr_pool_t **recycled_pool) +{ + apr_status_t rv; + *recycled_pool = NULL; + rv = apr_thread_mutex_lock(queue_info->idlers_mutex); + if (rv != APR_SUCCESS) { + return rv; + } + AP_DEBUG_ASSERT(queue_info->idlers >= 0); + while ((queue_info->idlers == 0) && (!queue_info->terminated)) { + rv = apr_thread_cond_wait(queue_info->wait_for_idler, + queue_info->idlers_mutex); + if (rv != APR_SUCCESS) { + apr_status_t rv2; + rv2 = apr_thread_mutex_unlock(queue_info->idlers_mutex); + if (rv2 != APR_SUCCESS) { + return rv2; + } + return rv; + } + } + queue_info->idlers--; /* Oh, and idler? Let's take 'em! */ + if (queue_info->num_recycled) { + *recycled_pool = + queue_info->recycled_pools[--queue_info->num_recycled]; + } + rv = apr_thread_mutex_unlock(queue_info->idlers_mutex); + if (rv != APR_SUCCESS) { + return rv; + } + else if (queue_info->terminated) { + return APR_EOF; + } + else { + return APR_SUCCESS; + } +} + +apr_status_t ap_queue_info_term(fd_queue_info_t *queue_info) +{ + apr_status_t rv; + rv = apr_thread_mutex_lock(queue_info->idlers_mutex); + if (rv != APR_SUCCESS) { + return rv; + } + queue_info->terminated = 1; + apr_thread_cond_broadcast(queue_info->wait_for_idler); + rv = apr_thread_mutex_unlock(queue_info->idlers_mutex); + if (rv != APR_SUCCESS) { + return rv; + } + return APR_SUCCESS; +} + +/** + * Detects when the fd_queue_t is full. This utility function is expected + * to be called from within critical sections, and is not threadsafe. + */ +#define ap_queue_full(queue) ((queue)->nelts == (queue)->bounds) + +/** + * Detects when the fd_queue_t is empty. This utility function is expected + * to be called from within critical sections, and is not threadsafe. + */ +#define ap_queue_empty(queue) ((queue)->nelts == 0) + +/** + * Callback routine that is called to destroy this + * fd_queue_t when its pool is destroyed. + */ +static apr_status_t ap_queue_destroy(void *data) +{ + fd_queue_t *queue = data; + + /* Ignore errors here, we can't do anything about them anyway. + * XXX: We should at least try to signal an error here, it is + * indicative of a programmer error. -aaron */ + apr_thread_cond_destroy(queue->not_empty); + apr_thread_mutex_destroy(queue->one_big_mutex); + + return APR_SUCCESS; +} + +/** + * Initialize the fd_queue_t. + */ +apr_status_t ap_queue_init(fd_queue_t *queue, int queue_capacity, apr_pool_t *a) +{ + int i; + apr_status_t rv; + + if ((rv = apr_thread_mutex_create(&queue->one_big_mutex, + APR_THREAD_MUTEX_DEFAULT, a)) != APR_SUCCESS) { + return rv; + } + if ((rv = apr_thread_cond_create(&queue->not_empty, a)) != APR_SUCCESS) { + return rv; + } + + queue->data = apr_palloc(a, queue_capacity * sizeof(fd_queue_elem_t)); + queue->bounds = queue_capacity; + queue->nelts = 0; + + /* Set all the sockets in the queue to NULL */ + for (i = 0; i < queue_capacity; ++i) + queue->data[i].sd = NULL; + + apr_pool_cleanup_register(a, queue, ap_queue_destroy, apr_pool_cleanup_null); + + return APR_SUCCESS; +} + +/** + * Push a new socket onto the queue. Blocks if the queue is full. Once + * the push operation has completed, it signals other threads waiting + * in ap_queue_pop() that they may continue consuming sockets. + */ +apr_status_t ap_queue_push(fd_queue_t *queue, apr_socket_t *sd, apr_pool_t *p) +{ + fd_queue_elem_t *elem; + apr_status_t rv; + + if ((rv = apr_thread_mutex_lock(queue->one_big_mutex)) != APR_SUCCESS) { + return rv; + } + + AP_DEBUG_ASSERT(!queue->terminated); + AP_DEBUG_ASSERT(!ap_queue_full(queue)); + + elem = &queue->data[queue->nelts]; + elem->sd = sd; + elem->p = p; + queue->nelts++; + + apr_thread_cond_signal(queue->not_empty); + + if ((rv = apr_thread_mutex_unlock(queue->one_big_mutex)) != APR_SUCCESS) { + return rv; + } + + return APR_SUCCESS; +} + +/** + * Retrieves the next available socket from the queue. If there are no + * sockets available, it will block until one becomes available. + * Once retrieved, the socket is placed into the address specified by + * 'sd'. + */ +apr_status_t ap_queue_pop(fd_queue_t *queue, apr_socket_t **sd, apr_pool_t **p) +{ + fd_queue_elem_t *elem; + apr_status_t rv; + + if ((rv = apr_thread_mutex_lock(queue->one_big_mutex)) != APR_SUCCESS) { + return rv; + } + + /* Keep waiting until we wake up and find that the queue is not empty. */ + if (ap_queue_empty(queue)) { + if (!queue->terminated) { + apr_thread_cond_wait(queue->not_empty, queue->one_big_mutex); + } + /* If we wake up and it's still empty, then we were interrupted */ + if (ap_queue_empty(queue)) { + rv = apr_thread_mutex_unlock(queue->one_big_mutex); + if (rv != APR_SUCCESS) { + return rv; + } + if (queue->terminated) { + return APR_EOF; /* no more elements ever again */ + } + else { + return APR_EINTR; + } + } + } + + elem = &queue->data[--queue->nelts]; + *sd = elem->sd; + *p = elem->p; +#ifdef AP_DEBUG + elem->sd = NULL; + elem->p = NULL; +#endif /* AP_DEBUG */ + + rv = apr_thread_mutex_unlock(queue->one_big_mutex); + return rv; +} + +apr_status_t ap_queue_interrupt_all(fd_queue_t *queue) +{ + apr_status_t rv; + + if ((rv = apr_thread_mutex_lock(queue->one_big_mutex)) != APR_SUCCESS) { + return rv; + } + apr_thread_cond_broadcast(queue->not_empty); + if ((rv = apr_thread_mutex_unlock(queue->one_big_mutex)) != APR_SUCCESS) { + return rv; + } + return APR_SUCCESS; +} + +apr_status_t ap_queue_term(fd_queue_t *queue) +{ + apr_status_t rv; + + if ((rv = apr_thread_mutex_lock(queue->one_big_mutex)) != APR_SUCCESS) { + return rv; + } + /* we must hold one_big_mutex when setting this... otherwise, + * we could end up setting it and waking everybody up just after a + * would-be popper checks it but right before they block + */ + queue->terminated = 1; + if ((rv = apr_thread_mutex_unlock(queue->one_big_mutex)) != APR_SUCCESS) { + return rv; + } + return ap_queue_interrupt_all(queue); +} diff --git a/rubbos/app/httpd-2.0.64/server/mpm/worker/fdqueue.h b/rubbos/app/httpd-2.0.64/server/mpm/worker/fdqueue.h new file mode 100644 index 00000000..6dd55e03 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/worker/fdqueue.h @@ -0,0 +1,64 @@ +/* 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. + */ + +#ifndef FDQUEUE_H +#define FDQUEUE_H +#include "httpd.h" +#include +#if APR_HAVE_UNISTD_H +#include +#endif +#include +#include +#include +#if APR_HAVE_SYS_SOCKET_H +#include +#endif +#include + +typedef struct fd_queue_info_t fd_queue_info_t; + +apr_status_t ap_queue_info_create(fd_queue_info_t **queue_info, + apr_pool_t *pool, int max_idlers); +apr_status_t ap_queue_info_set_idle(fd_queue_info_t *queue_info, + apr_pool_t *pool_to_recycle); +apr_status_t ap_queue_info_wait_for_idler(fd_queue_info_t *queue_info, + apr_pool_t **recycled_pool); +apr_status_t ap_queue_info_term(fd_queue_info_t *queue_info); + +struct fd_queue_elem_t { + apr_socket_t *sd; + apr_pool_t *p; +}; +typedef struct fd_queue_elem_t fd_queue_elem_t; + +struct fd_queue_t { + fd_queue_elem_t *data; + int nelts; + int bounds; + apr_thread_mutex_t *one_big_mutex; + apr_thread_cond_t *not_empty; + int terminated; +}; +typedef struct fd_queue_t fd_queue_t; + +apr_status_t ap_queue_init(fd_queue_t *queue, int queue_capacity, apr_pool_t *a); +apr_status_t ap_queue_push(fd_queue_t *queue, apr_socket_t *sd, apr_pool_t *p); +apr_status_t ap_queue_pop(fd_queue_t *queue, apr_socket_t **sd, apr_pool_t **p); +apr_status_t ap_queue_interrupt_all(fd_queue_t *queue); +apr_status_t ap_queue_term(fd_queue_t *queue); + +#endif /* FDQUEUE_H */ diff --git a/rubbos/app/httpd-2.0.64/server/mpm/worker/fdqueue.lo b/rubbos/app/httpd-2.0.64/server/mpm/worker/fdqueue.lo new file mode 100644 index 00000000..88d30c88 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/worker/fdqueue.lo @@ -0,0 +1,12 @@ +# fdqueue.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/fdqueue.o' + +# Name of the non-PIC object. +non_pic_object='fdqueue.o' + diff --git a/rubbos/app/httpd-2.0.64/server/mpm/worker/fdqueue.o b/rubbos/app/httpd-2.0.64/server/mpm/worker/fdqueue.o new file mode 100644 index 0000000000000000000000000000000000000000..fb4a5ad1e5e120199ed066f73e6b0b10d38278dc GIT binary patch literal 21328 zcmb_k3wTu3wLWJign@)45FSB61`Qe>c|pWS0TU8nqA0;6809feCKD1#X5!2l1W}*_ z&@ob>{j9b(m0oQ{ukHP+x2@0H25H4st&ggut+slv7JRf)A5`muyVl-o?Xzdkq_^Mw z?*6`O-A{(;6(RuB9>cS!?y5n?b0k`uC!?ap1aApP=dn8cNG{4Q-tP z!aIf5MnL@ihwQ+>g0evW&q?gOHKk?S-dMf1dZ=#Ap-w0jEMK>(uC+1sd0k6g>c!ST z>Z6}jp&zODnuY#*>_F;JAa%IzVT22J{R*zNCk}fGcfBI1oWfmi1J#iFMfK3Zx4d;H z4(5CixX&4VcqE`!p#N|VKptmw^$^gW&eXCm>iS=|9q$t(t-ziwzUmW!)Z4<+uA#cr z6VBMxYwOn3t!+phuUmIW^dF>(0;#{aGRapO!ykf!frEeY3bY{=o)Spa`va*z9Ih`D zW>fDyjQ2zj`C&o~WY5%)E7&00ET|>!p0=xd~j0=S8%K`(<{yhOZ zbx~O$HRtgG@17=m*HEh1nE|8k3-tfYw|ebc=(rqz31BkF@l`2eNOL{r%ZIJafy23| zLnaqH;Y@kwih=qP@aFQsKmy#OYypy0vyaV-+RL*$x6nXIZ_P{{S zst7Tl$+GFB=SbYM*{*q9&XPcZs;D5gGsBqeL5s5upO58k3 zzM+yRN2p)2>y1Fl3#pWUxZa2IThFZ9(^7geaPYr!0()ADia5T3!&nQMJyaAp@44i0 z$T~Uqk`jv z!lL)X=}T4&)cas$>j&!n(09l(HMq&*{w;nOry0Bd^2Ny!I8=qxVi5}^nk5N-(- z&dW{MJdHI%=BjWB8Yiq^=J7a{X6&H^!2GHXXOOPi=-hA?Ai)rEU2zhVLi0-Ikd3=Hs z2E6_2K#3%GBI%J0NBDAmHz6w(2!Wgz7rO$aL|7Ry-rmPra_3yeZA1@%NmXJs1w+j=udY7>67?pNEb=^bEHco{RPr~NuNZzEDtWA z*hZ#GGPYpOm5fI)wUWsZOh7Ut1k)s$T*0(S#%J#b53iKWX#2asbV(-PMu+<(QzRHi zGUMzB)NGQ>M7sufHv+RmG9~tXpsimrQ|w29xluAR>^>0NE13#=2QarwrcyB9 zmQ0mk?vYHjV16K(xnfWrl1z>8ZAdcn?So+FXBK1`#Oj-37)nNc8#^gO`L9S4edl+9 zreU}nds}4X`l5j4`i=rO<|eqH+XY*IKomz)pwBZ}EE8<>1Frx=<9`&$!dxH95SWXqh4QB$SaEVwWI2MYf$h3RKH% zu}?v~Or~H_{;Zp^b)v({pM4D6u!{Pu{5h`!;gjCwSD*(XP-Xd5?*c6}=2s(0^jy>^ zy~&@4biS0SK`*6e`Dde-(zE>eDC38Kp>2o+aJjy}a6IzQy-mRA#8~*VJj-{$)msN$ z80YdtqADVBCc-`oihbb6c%yO(-R;4D0Tttsvk#z3EEDiz--|U^CdwOJAz>6V0kbF9 z_XYSR^-tCHH&YvXa6Bw8QvX!eKk4dj%btc6SSA7EN0+fE^%=HQ%`7quu_?hO_DtPy zy^R>4gX>_ilZIy^iAA!rFp5}+W!sbD8!dYdD-%wZvy+nxDHyUP=&!mT{6FPvfU8cK zg_WmHW05H=v;bUv7R097t)7i=ZSnZ3ELD3M)V@!(2_MwjRa5PiAn1x*2O>q_JSs>O zp#r@Y)z7C|p?>srmd{`6^Pf4d)H;ow7z8QTfdtSiaWZkq^5Nec}H;6ZMN+6VCh#U6YW7D^d_2YFf&%h@|UWZ4g@@qjt?FxLoo9$~#{ z>321#Rk@Wt{cd5Al5FYsBdSeLznXtO{bX!kX78}KO?ZJ~5B9>&xtgDPGAKV z^ydVpr1aw8`Uf;eabl;U#$vhuFN8YyboW9=CQ z#d+R>Qwzr0<3<)ug1tkjm6x{&AlN_<39~q7qU9|(KkrLEWNtGjz z@fCyQg2}K0Dz?1^d3o5#27L4wrQuv?oJTCQK{lWD!wB1UV==ZUm~J%|S3+eW4tEhW z@JSD_!PpA>g2~dQvnDqd`}1lhW1Dd!loi-{RDcKA1SPP4wI#PL7Gkg#b9X$@=Lt1w z?8MX#+ZtiRffY~5zQwS}oyHX~r={^*7f(j}{yb2K9h(jwYmS_*92t?(xihG95Lz@^N?jm! zhBQU`&vbi!!DJk@vy@^HwFM$vWg}oDAe~hm7?m}%bf~ddg0m;s=oGp=N7a)$OhGD; zR-)KeE0f>=LCs9^UNpyoMPNVGtDB!F{(=a)n2b}EZLMK4K~Q#Gi>P)P-91*-ex}=$ zvSubD1bMB*w*AcXxN=0P+jgREr#raHjyKS{F37dW!BK!eo(B)XYvrU5H7}1&?*T#WdUV;=EzT4FhkZloQX9+Sio&Rwl>8Lko*- zH8Xh%K^W!M{mjj91(`f6O^~_8t{{_vG(l<5y|Q<2DDPUBoS<~AVv_xlxyam^t{{`_ zj}&CC-W6n0_pT*l6?&7rdS7|h#70?XmSJxqGZAI3mC2_R)Xe0w1j&dq_qHp@H#W zM3Kqk3d&en-lD4alt@OlTeu;F;-fo0gNPibpk^kE36imAuG|%5a&DTSG~r&yQ0-Z& zVTNC|RMo6RTA5s{pk^jR1WCV`d)XCa@|83}*CR=>(PgS(3zJtWXbqEWM&<-_zjpAr-sBLu z+l9Ve&c!tznYQ$U$Q65m%5& z-Du_@Wg1<{Mz2-6Rx!zD6t85P%D%CBc5z4^|;s1$^InOu&IPdR*+@?fu9596Ov!Qq(-*o>X+0V z1bmzBchUXtbl*<9AKqjVtZuK-nNXFQB^U&rZN!^qq0z+vMVi+6L2J<|h1(sfI=dKKUH5ZU5qZ zU-Q1Z^^OfQ&saX^^8J=4$K#uh*URv-5HE)}`D#yWEzR+GXSC(m-qjUIEdXkr=Q8`q zoJHQT72ddS+@s|StB)?b+LLUkzJx%sw`&L};JL3l{Lic+&zyH-0A@8Us zH^wj6hpMki{&G&$Y;XSF%8iMIk&E|T@{IQ?Uz>O0Uhf9KcS4(Qf`8FI@8}D?*E)^K z%U7K0E%Q~ZnblV7Eq>B_^&=04Yg%>Tl zV#N|~LE9a*&m=eRyTm)rSK*E9c*P8g6CrUE}8OO{{`OsC;J+cUt2g0 zrm$@XV?7T0tikj7P$o!#xqG42oO`c1Js7!D~X@POvi; z4|aF-MB;j7w_^o6yCL&pItop~Fx(F6i3jzeXFS-rBA5tmj07Xm4!31T1hOu+*-CW9 z;*KAGyiasr8v*z5hB=t25A0Kag28Z?s26>KPK2V#KIqW;?t}wQqs43D-A*Lf=K$B) z6I!1TV0*GN*d9tmtZ1^A`;R`wgMFc%o>q+)T zt&Wfr3R-|CERkeZFad)g24iXC@+DR>n&@61jdb|KT_Mail|sUO4oWZxX{XnUwMDwC zw|9G`^kVnY7)%a1%HRtoANpe&Mx`O>iAp4qHNj*wnTT}EP4BOkESPSlDvYB_KFlU} zvRTw=eg45Xh^c2qV@@#A+vjWsjU>>QOvtp?hZvMY_I6au+gy2@CvP?KcD4me?k2~= z6zPt_T(NnDTB zkV72f$v!6t>yJ=?QxJM&W>I@Q7U~Fx5{_jptFJ%bU)I{5j5GHWr!BuaquBoW1 znJH1)m&hOafU&Q=)Ur1f*{9}@^zDTQeFM_>>;2|(4qGBcw{4U_;}SNL-9~_eFR!dVdgYlutkn= zH8@~Zgk!zE5m?VFU~P<4z*18#77tPz=?ZqnL%k8~^8ZKigAxoQ92iL}wZxe(9z|(V z@H-mt^rn+m^D#}Vioa9 zpAT(Kov57cFU&{IEv9TWRAuY`F`VE~N+!rV_8+@s_J1*8rcP{er#LibSxNO8fM}*H z&b4gqC!s+oH;$2azM8UELWPN;?EdL^g`-mPrmm*!YN*N9f9q1&gxjM#c>d1pe+)2F zC$@Z+?Drv~6;pNx)R`EHUvRo?wD*6B-}NAt&HpO$pYs&`$5b%={|aDepZf`7h zoBfY*VSw_9VbEZuP?jsoIwRn8DTiW0AuFr;h*I3xrex)42yjY z(O$6v5u@F_)<}(WNv|3$7emS`PtvA?0!Obhi&vgh&ZzKOaG)hi@xmG9Y{e^2(q>e7 zt-=hf5|C_K@bEx3{K{eQs{tPe@!Sq~EMo5m_ucT9P0zkz@Oy{Bhlasl9tJ-SIQqjs zzHR~@%ScFtZ2n9g20wck9QS^xzlrAkT~fW(J&gQTlIPT&OY-}Mk-v}RYiZIAlKjJj zzeacy;fD$5kLO~K2z4(KK15SP>;VCPhj9K3EcSk=%YDaD?4|G0tTLO*{8iYDP*Dg#wthg2uUJDGal&akRJyA1a^ zMt=*Z4+iPFjZY|=1>wK=GLYUP>qi{--A@ySj|z&T?*jal0KUtpD){`Ny*uk-f zg6ljMOly1&e1`w-3(7bIp&*Vl<5dVkG3C#faE5$H!;67tJ>S%Dd+Gu4vHy!k%sGf+6W&FviwX1(pszGXv2>nly*%I9_M1auWLB&=@~y88$-d{RQO}O zQ^R%n?HWE!lmC&1<1>o&yg3Zc2i~z-*I!EO1LD&)JuMop$Fonv^?3GcxE{~Lgq!hv zTEod@ux?q;YkKr};!#vArvLm;4iMMlxtP{5Q+}<6>v2nIxE|+UXt*A?S2bLZ+b0^X z%k#;2^hdWl5dkPB-Y^Vap~XShGe@(l3kH6W_*aL) zj~V#4$j=WAd=%M*EtV+k=LU*TzJc?)FaBjQv|#yjDL+dM`3BNcW#FHZ9}5hePZ2a4 zcoFfd415pi4;y%#{OL3B5rkiF;3@LwCIiQPDVEy|{0NQXcMQBmid**^_$;#f69Xr4 z>nQ`jmd5Ldfj5yJK2FH-KZD}H#|s&sM|w^gdR`>M`BcyHZtTGNfuBe1PdD)2(RlOoj`i?(oNve% zQ+$>h_}>Y?)WFve&xh|=Kfd2#;q`-YKElQG)x>W%^cPdVc%5eX)5xD681iQj{+NMt zem`m8?~?qB20lbQzxT0Sjt}Rx!pYAf(#QB5!uyRP8oBVl3!_gn!XZ(H`{Fs5?PWt~$ILEDqaL#wedEYaV{AD~s^6>9= zMB#B+L--6semmg{4Eb+RzVZH!bMMDbmAn-~(U#H2wNlx9@2<+GRZt45Q~c1LyCx9~e0QW;m8M*6hz> zio-bu-br|if&0NHED^$a9Pg$6#teD>&b8Z+=W*Pt;n?4=lb%~O9LI(C>-#kvDa=yekd-eZp%r9P_Of{;(|5aMTkbzn2rvapMDq zR~R_|Glca9zLWfP44nT#!VbbYZYyaVZ#LvD%7?oQd5+unH5~olN&Y`-;GYmaWa#IA zKk$r!myzAy894uIgkze19G9i=hvj`kzLxZiqL*0iFF!AeH5~n)LhVa59QE_MdAf$9 z{63PeH1J&F7Z~^!;x9Dt{lu@JJCA!C`5!lMKEA)#z;7V=9~<~fg#X&Wp$nq?fpCt` zFG>EGAHVq?xiy_bP`G$rgc`f;Qz`)-l{D%hKK@Y2k zHC&I+Aq_|JwnKR0kbRX>*cfj9JXkk&)_ zU(&e0o$~Jx^9*^8+ae7|Q*-IX=3)asK=`GEbH8{W7BukJ$^RY$=X3NtK3I+ZA4P>w zb{X>gd&wZ-EYJQQ&~Wtsm*nS<4g69x0_9P{*?&F`|D=KQnfR9socD9@X!=q01d9I& z1HYAUoALsyQT~UN=MxQl55-}&f!|H|LIa;gc$f%7`~v4QivEparent[i].pid) +#define MPM_NOTE_CHILD_KILLED(i) (MPM_CHILD_PID(i) = 0) +#define MPM_ACCEPT_FUNC unixd_accept + +extern int ap_threads_per_child; +extern int ap_max_daemons_limit; +extern server_rec *ap_server_conf; +extern char ap_coredump_dir[MAX_STRING_LEN]; + +#endif /* APACHE_MPM_WORKER_H */ diff --git a/rubbos/app/httpd-2.0.64/server/mpm/worker/mpm_default.h b/rubbos/app/httpd-2.0.64/server/mpm/worker/mpm_default.h new file mode 100644 index 00000000..d5a33989 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/worker/mpm_default.h @@ -0,0 +1,69 @@ +/* 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. + */ + +#ifndef APACHE_MPM_DEFAULT_H +#define APACHE_MPM_DEFAULT_H + +/* Number of servers to spawn off by default --- also, if fewer than + * this free when the caretaker checks, it will spawn more. + */ +#ifndef DEFAULT_START_DAEMON +#define DEFAULT_START_DAEMON 3 +#endif + +/* Maximum number of *free* server processes --- more than this, and + * they will die off. + */ + +#ifndef DEFAULT_MAX_FREE_DAEMON +#define DEFAULT_MAX_FREE_DAEMON 10 +#endif + +/* Minimum --- fewer than this, and more will be created */ + +#ifndef DEFAULT_MIN_FREE_DAEMON +#define DEFAULT_MIN_FREE_DAEMON 3 +#endif + +#ifndef DEFAULT_THREADS_PER_CHILD +#define DEFAULT_THREADS_PER_CHILD 25 +#endif + +/* File used for accept locking, when we use a file */ +#ifndef DEFAULT_LOCKFILE +#define DEFAULT_LOCKFILE DEFAULT_REL_RUNTIMEDIR "/accept.lock" +#endif + +/* Where the main/parent process's pid is logged */ +#ifndef DEFAULT_PIDLOG +#define DEFAULT_PIDLOG DEFAULT_REL_RUNTIMEDIR "/httpd.pid" +#endif + +/* + * Interval, in microseconds, between scoreboard maintenance. + */ +#ifndef SCOREBOARD_MAINTENANCE_INTERVAL +#define SCOREBOARD_MAINTENANCE_INTERVAL 1000000 +#endif + +/* Number of requests to try to handle in a single process. If <= 0, + * the children don't die off. + */ +#ifndef DEFAULT_MAX_REQUESTS_PER_CHILD +#define DEFAULT_MAX_REQUESTS_PER_CHILD 10000 +#endif + +#endif /* AP_MPM_DEFAULT_H */ diff --git a/rubbos/app/httpd-2.0.64/server/mpm/worker/pod.c b/rubbos/app/httpd-2.0.64/server/mpm/worker/pod.c new file mode 100644 index 00000000..3a9a266e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/worker/pod.c @@ -0,0 +1,112 @@ +/* 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. + */ + +#include "pod.h" + +#if APR_HAVE_UNISTD_H +#include +#endif + +AP_DECLARE(apr_status_t) ap_mpm_pod_open(apr_pool_t *p, ap_pod_t **pod) +{ + apr_status_t rv; + + *pod = apr_palloc(p, sizeof(**pod)); + rv = apr_file_pipe_create(&((*pod)->pod_in), &((*pod)->pod_out), p); + if (rv != APR_SUCCESS) { + return rv; + } +/* + apr_file_pipe_timeout_set((*pod)->pod_in, 0); +*/ + (*pod)->p = p; + + /* close these before exec. */ + apr_file_unset_inherit((*pod)->pod_in); + apr_file_unset_inherit((*pod)->pod_out); + + return APR_SUCCESS; +} + +AP_DECLARE(int) ap_mpm_pod_check(ap_pod_t *pod) +{ + char c; + apr_os_file_t fd; + int rc; + + /* we need to surface EINTR so we'll have to grab the + * native file descriptor and do the OS read() ourselves + */ + apr_os_file_get(&fd, pod->pod_in); + rc = read(fd, &c, 1); + if (rc == 1) { + switch(c) { + case RESTART_CHAR: + return AP_RESTART; + case GRACEFUL_CHAR: + return AP_GRACEFUL; + } + } + return AP_NORESTART; +} + +AP_DECLARE(apr_status_t) ap_mpm_pod_close(ap_pod_t *pod) +{ + apr_status_t rv; + + rv = apr_file_close(pod->pod_out); + if (rv != APR_SUCCESS) { + return rv; + } + + rv = apr_file_close(pod->pod_in); + if (rv != APR_SUCCESS) { + return rv; + } + return rv; +} + +static apr_status_t pod_signal_internal(ap_pod_t *pod, int graceful) +{ + apr_status_t rv; + char char_of_death = graceful ? GRACEFUL_CHAR : RESTART_CHAR; + apr_size_t one = 1; + + do { + rv = apr_file_write(pod->pod_out, &char_of_death, &one); + } while (APR_STATUS_IS_EINTR(rv)); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_WARNING, rv, ap_server_conf, + "write pipe_of_death"); + } + return rv; +} + +AP_DECLARE(apr_status_t) ap_mpm_pod_signal(ap_pod_t *pod, int graceful) +{ + return pod_signal_internal(pod, graceful); +} + +AP_DECLARE(void) ap_mpm_pod_killpg(ap_pod_t *pod, int num, int graceful) +{ + int i; + apr_status_t rv = APR_SUCCESS; + + for (i = 0; i < num && rv == APR_SUCCESS; i++) { + rv = pod_signal_internal(pod, graceful); + } +} + diff --git a/rubbos/app/httpd-2.0.64/server/mpm/worker/pod.h b/rubbos/app/httpd-2.0.64/server/mpm/worker/pod.h new file mode 100644 index 00000000..21651e6f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/worker/pod.h @@ -0,0 +1,50 @@ +/* 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. + */ + +#include "apr.h" +#include "apr_strings.h" +#define APR_WANT_STRFUNC +#include "apr_want.h" + +#include "httpd.h" +#include "http_config.h" +#include "http_log.h" +#include "http_main.h" +#include "mpm.h" +#include "mpm_common.h" +#include "ap_mpm.h" +#include "ap_listen.h" +#include "mpm_default.h" + +#define RESTART_CHAR '$' +#define GRACEFUL_CHAR '!' + +#define AP_RESTART 0 +#define AP_GRACEFUL 1 + +typedef struct ap_pod_t ap_pod_t; + +struct ap_pod_t { + apr_file_t *pod_in; + apr_file_t *pod_out; + apr_pool_t *p; +}; + +AP_DECLARE(apr_status_t) ap_mpm_pod_open(apr_pool_t *p, ap_pod_t **pod); +AP_DECLARE(int) ap_mpm_pod_check(ap_pod_t *pod); +AP_DECLARE(apr_status_t) ap_mpm_pod_close(ap_pod_t *pod); +AP_DECLARE(apr_status_t) ap_mpm_pod_signal(ap_pod_t *pod, int graceful); +AP_DECLARE(void) ap_mpm_pod_killpg(ap_pod_t *pod, int num, int graceful); diff --git a/rubbos/app/httpd-2.0.64/server/mpm/worker/pod.lo b/rubbos/app/httpd-2.0.64/server/mpm/worker/pod.lo new file mode 100644 index 00000000..b284c939 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/worker/pod.lo @@ -0,0 +1,12 @@ +# pod.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/pod.o' + +# Name of the non-PIC object. +non_pic_object='pod.o' + diff --git a/rubbos/app/httpd-2.0.64/server/mpm/worker/pod.o b/rubbos/app/httpd-2.0.64/server/mpm/worker/pod.o new file mode 100644 index 0000000000000000000000000000000000000000..42e8937199b81bc97cae147f4dc87a12883fa7d1 GIT binary patch literal 17496 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 iV0byigoFe>%zRqlN14A-;ATA@5V% +#endif +#if APR_HAVE_SYS_SOCKET_H +#include +#endif +#if APR_HAVE_SYS_WAIT_H +#include +#endif +#ifdef HAVE_SYS_PROCESSOR_H +#include /* for bindprocessor() */ +#endif + +#if !APR_HAS_THREADS +#error The Worker MPM requires APR threads, but they are unavailable. +#endif + +#define CORE_PRIVATE + +#include "ap_config.h" +#include "httpd.h" +#include "http_main.h" +#include "http_log.h" +#include "http_config.h" /* for read_config */ +#include "http_core.h" /* for get_remote_host */ +#include "http_connection.h" +#include "ap_mpm.h" +#include "pod.h" +#include "mpm_common.h" +#include "ap_listen.h" +#include "scoreboard.h" +#include "fdqueue.h" +#include "mpm_default.h" + +#include +#include /* for INT_MAX */ + +/* Limit on the total --- clients will be locked out if more servers than + * this are needed. It is intended solely to keep the server from crashing + * when things get out of hand. + * + * We keep a hard maximum number of servers, for two reasons --- first off, + * in case something goes seriously wrong, we want to stop the fork bomb + * short of actually crashing the machine we're running on by filling some + * kernel table. Secondly, it keeps the size of the scoreboard file small + * enough that we can read the whole thing without worrying too much about + * the overhead. + */ +#ifndef DEFAULT_SERVER_LIMIT +#define DEFAULT_SERVER_LIMIT 16 +#endif + +/* Admin can't tune ServerLimit beyond MAX_SERVER_LIMIT. We want + * some sort of compile-time limit to help catch typos. + */ +#ifndef MAX_SERVER_LIMIT +#define MAX_SERVER_LIMIT 20000 +#endif + +/* Limit on the threads per process. Clients will be locked out if more than + * this * server_limit are needed. + * + * We keep this for one reason it keeps the size of the scoreboard file small + * enough that we can read the whole thing without worrying too much about + * the overhead. + */ +#ifndef DEFAULT_THREAD_LIMIT +#define DEFAULT_THREAD_LIMIT 64 +#endif + +/* Admin can't tune ThreadLimit beyond MAX_THREAD_LIMIT. We want + * some sort of compile-time limit to help catch typos. + */ +#ifndef MAX_THREAD_LIMIT +#define MAX_THREAD_LIMIT 20000 +#endif + +/* + * Actual definitions of config globals + */ + +int ap_threads_per_child = 0; /* Worker threads per child */ +static int ap_daemons_to_start = 0; +static int min_spare_threads = 0; +static int max_spare_threads = 0; +static int ap_daemons_limit = 0; +static int server_limit = DEFAULT_SERVER_LIMIT; +static int first_server_limit; +static int thread_limit = DEFAULT_THREAD_LIMIT; +static int first_thread_limit; +static int changed_limit_at_restart; +static int dying = 0; +static int workers_may_exit = 0; +static int start_thread_may_exit = 0; +static int listener_may_exit = 0; +static int requests_this_child; +static int num_listensocks = 0; +static int resource_shortage = 0; +static fd_queue_t *worker_queue; +static fd_queue_info_t *worker_queue_info; +static int mpm_state = AP_MPMQ_STARTING; +static int sick_child_detected; + +/* The structure used to pass unique initialization info to each thread */ +typedef struct { + int pid; + int tid; + int sd; +} proc_info; + +/* Structure used to pass information to the thread responsible for + * creating the rest of the threads. + */ +typedef struct { + apr_thread_t **threads; + apr_thread_t *listener; + int child_num_arg; + apr_threadattr_t *threadattr; +} thread_starter; + +#define ID_FROM_CHILD_THREAD(c, t) ((c * thread_limit) + t) + +/* + * The max child slot ever assigned, preserved across restarts. Necessary + * to deal with MaxClients changes across AP_SIG_GRACEFUL restarts. We + * use this value to optimize routines that have to scan the entire + * scoreboard. + */ +int ap_max_daemons_limit = -1; + +static ap_pod_t *pod; + +/* *Non*-shared http_main globals... */ + +server_rec *ap_server_conf; + +/* The worker MPM respects a couple of runtime flags that can aid + * in debugging. Setting the -DNO_DETACH flag will prevent the root process + * from detaching from its controlling terminal. Additionally, setting + * the -DONE_PROCESS flag (which implies -DNO_DETACH) will get you the + * child_main loop running in the process which originally started up. + * This gives you a pretty nice debugging environment. (You'll get a SIGHUP + * early in standalone_main; just continue through. This is the server + * trying to kill off any child processes which it might have lying + * around --- Apache doesn't keep track of their pids, it just sends + * SIGHUP to the process group, ignoring it in the root process. + * Continue through and you'll be fine.). + */ + +static int one_process = 0; + +#ifdef DEBUG_SIGSTOP +int raise_sigstop_flags; +#endif + +static apr_pool_t *pconf; /* Pool for config stuff */ +static apr_pool_t *pchild; /* Pool for httpd child stuff */ + +static pid_t ap_my_pid; /* Linux getpid() doesn't work except in main + thread. Use this instead */ +static pid_t parent_pid; +static apr_os_thread_t *listener_os_thread; + +/* Locks for accept serialization */ +static apr_proc_mutex_t *accept_mutex; + +#ifdef SINGLE_LISTEN_UNSERIALIZED_ACCEPT +#define SAFE_ACCEPT(stmt) (ap_listeners->next ? (stmt) : APR_SUCCESS) +#else +#define SAFE_ACCEPT(stmt) (stmt) +#endif + +/* The LISTENER_SIGNAL signal will be sent from the main thread to the + * listener thread to wake it up for graceful termination (what a child + * process from an old generation does when the admin does "apachectl + * graceful"). This signal will be blocked in all threads of a child + * process except for the listener thread. + */ +#define LISTENER_SIGNAL SIGHUP + +/* An array of socket descriptors in use by each thread used to + * perform a non-graceful (forced) shutdown of the server. */ +static apr_socket_t **worker_sockets; + +static void close_worker_sockets(void) +{ + int i; + for (i = 0; i < ap_threads_per_child; i++) { + if (worker_sockets[i]) { + apr_socket_close(worker_sockets[i]); + worker_sockets[i] = NULL; + } + } +} + +static void wakeup_listener(void) +{ + listener_may_exit = 1; + if (!listener_os_thread) { + /* XXX there is an obscure path that this doesn't handle perfectly: + * right after listener thread is created but before + * listener_os_thread is set, the first worker thread hits an + * error and starts graceful termination + */ + return; + } + /* + * we should just be able to "kill(ap_my_pid, LISTENER_SIGNAL)" on all + * platforms and wake up the listener thread since it is the only thread + * with SIGHUP unblocked, but that doesn't work on Linux + */ +#ifdef HAVE_PTHREAD_KILL + pthread_kill(*listener_os_thread, LISTENER_SIGNAL); +#else + kill(ap_my_pid, LISTENER_SIGNAL); +#endif +} + +#define ST_INIT 0 +#define ST_GRACEFUL 1 +#define ST_UNGRACEFUL 2 + +static int terminate_mode = ST_INIT; + +static void signal_threads(int mode) +{ + if (terminate_mode == mode) { + return; + } + terminate_mode = mode; + mpm_state = AP_MPMQ_STOPPING; + + /* in case we weren't called from the listener thread, wake up the + * listener thread + */ + wakeup_listener(); + + /* for ungraceful termination, let the workers exit now; + * for graceful termination, the listener thread will notify the + * workers to exit once it has stopped accepting new connections + */ + if (mode == ST_UNGRACEFUL) { + workers_may_exit = 1; + ap_queue_interrupt_all(worker_queue); + ap_queue_info_term(worker_queue_info); + close_worker_sockets(); /* forcefully kill all current connections */ + } +} + +AP_DECLARE(apr_status_t) ap_mpm_query(int query_code, int *result) +{ + switch(query_code){ + case AP_MPMQ_MAX_DAEMON_USED: + *result = ap_max_daemons_limit; + return APR_SUCCESS; + case AP_MPMQ_IS_THREADED: + *result = AP_MPMQ_STATIC; + return APR_SUCCESS; + case AP_MPMQ_IS_FORKED: + *result = AP_MPMQ_DYNAMIC; + return APR_SUCCESS; + case AP_MPMQ_HARD_LIMIT_DAEMONS: + *result = server_limit; + return APR_SUCCESS; + case AP_MPMQ_HARD_LIMIT_THREADS: + *result = thread_limit; + return APR_SUCCESS; + case AP_MPMQ_MAX_THREADS: + *result = ap_threads_per_child; + return APR_SUCCESS; + case AP_MPMQ_MIN_SPARE_DAEMONS: + *result = 0; + return APR_SUCCESS; + case AP_MPMQ_MIN_SPARE_THREADS: + *result = min_spare_threads; + return APR_SUCCESS; + case AP_MPMQ_MAX_SPARE_DAEMONS: + *result = 0; + return APR_SUCCESS; + case AP_MPMQ_MAX_SPARE_THREADS: + *result = max_spare_threads; + return APR_SUCCESS; + case AP_MPMQ_MAX_REQUESTS_DAEMON: + *result = ap_max_requests_per_child; + return APR_SUCCESS; + case AP_MPMQ_MAX_DAEMONS: + *result = ap_daemons_limit; + return APR_SUCCESS; + case AP_MPMQ_MPM_STATE: + *result = mpm_state; + return APR_SUCCESS; + } + return APR_ENOTIMPL; +} + +/* a clean exit from a child with proper cleanup */ +static void clean_child_exit(int code) __attribute__ ((noreturn)); +static void clean_child_exit(int code) +{ + mpm_state = AP_MPMQ_STOPPING; + if (pchild) { + apr_pool_destroy(pchild); + } + exit(code); +} + +static void just_die(int sig) +{ + clean_child_exit(0); +} + +/***************************************************************** + * Connection structures and accounting... + */ + +/* volatile just in case */ +static int volatile shutdown_pending; +static int volatile restart_pending; +static int volatile is_graceful; +static volatile int child_fatal; +ap_generation_t volatile ap_my_generation; + +/* + * ap_start_shutdown() and ap_start_restart(), below, are a first stab at + * functions to initiate shutdown or restart without relying on signals. + * Previously this was initiated in sig_term() and restart() signal handlers, + * but we want to be able to start a shutdown/restart from other sources -- + * e.g. on Win32, from the service manager. Now the service manager can + * call ap_start_shutdown() or ap_start_restart() as appropiate. Note that + * these functions can also be called by the child processes, since global + * variables are no longer used to pass on the required action to the parent. + * + * These should only be called from the parent process itself, since the + * parent process will use the shutdown_pending and restart_pending variables + * to determine whether to shutdown or restart. The child process should + * call signal_parent() directly to tell the parent to die -- this will + * cause neither of those variable to be set, which the parent will + * assume means something serious is wrong (which it will be, for the + * child to force an exit) and so do an exit anyway. + */ + +static void ap_start_shutdown(void) +{ + mpm_state = AP_MPMQ_STOPPING; + if (shutdown_pending == 1) { + /* Um, is this _probably_ not an error, if the user has + * tried to do a shutdown twice quickly, so we won't + * worry about reporting it. + */ + return; + } + shutdown_pending = 1; +} + +/* do a graceful restart if graceful == 1 */ +static void ap_start_restart(int graceful) +{ + mpm_state = AP_MPMQ_STOPPING; + if (restart_pending == 1) { + /* Probably not an error - don't bother reporting it */ + return; + } + restart_pending = 1; + is_graceful = graceful; +} + +static void sig_term(int sig) +{ + ap_start_shutdown(); +} + +static void restart(int sig) +{ + ap_start_restart(sig == AP_SIG_GRACEFUL); +} + +static void set_signals(void) +{ +#ifndef NO_USE_SIGACTION + struct sigaction sa; +#endif + + if (!one_process) { + ap_fatal_signal_setup(ap_server_conf, pconf); + } + +#ifndef NO_USE_SIGACTION + sigemptyset(&sa.sa_mask); + sa.sa_flags = 0; + + sa.sa_handler = sig_term; + if (sigaction(SIGTERM, &sa, NULL) < 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, + "sigaction(SIGTERM)"); +#ifdef SIGINT + if (sigaction(SIGINT, &sa, NULL) < 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, + "sigaction(SIGINT)"); +#endif +#ifdef SIGXCPU + sa.sa_handler = SIG_DFL; + if (sigaction(SIGXCPU, &sa, NULL) < 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, + "sigaction(SIGXCPU)"); +#endif +#ifdef SIGXFSZ + sa.sa_handler = SIG_DFL; + if (sigaction(SIGXFSZ, &sa, NULL) < 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, + "sigaction(SIGXFSZ)"); +#endif +#ifdef SIGPIPE + sa.sa_handler = SIG_IGN; + if (sigaction(SIGPIPE, &sa, NULL) < 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, + "sigaction(SIGPIPE)"); +#endif + + /* we want to ignore HUPs and AP_SIG_GRACEFUL while we're busy + * processing one */ + sigaddset(&sa.sa_mask, SIGHUP); + sigaddset(&sa.sa_mask, AP_SIG_GRACEFUL); + sa.sa_handler = restart; + if (sigaction(SIGHUP, &sa, NULL) < 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, + "sigaction(SIGHUP)"); + if (sigaction(AP_SIG_GRACEFUL, &sa, NULL) < 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, ap_server_conf, + "sigaction(" AP_SIG_GRACEFUL_STRING ")"); +#else + if (!one_process) { +#ifdef SIGXCPU + apr_signal(SIGXCPU, SIG_DFL); +#endif /* SIGXCPU */ +#ifdef SIGXFSZ + apr_signal(SIGXFSZ, SIG_DFL); +#endif /* SIGXFSZ */ + } + + apr_signal(SIGTERM, sig_term); +#ifdef SIGHUP + apr_signal(SIGHUP, restart); +#endif /* SIGHUP */ +#ifdef AP_SIG_GRACEFUL + apr_signal(AP_SIG_GRACEFUL, restart); +#endif /* AP_SIG_GRACEFUL */ +#ifdef SIGPIPE + apr_signal(SIGPIPE, SIG_IGN); +#endif /* SIGPIPE */ + +#endif +} + +/***************************************************************** + * Here follows a long bunch of generic server bookkeeping stuff... + */ + +int ap_graceful_stop_signalled(void) + /* XXX this is really a bad confusing obsolete name + * maybe it should be ap_mpm_process_exiting? + */ +{ + /* note: for a graceful termination, listener_may_exit will be set before + * workers_may_exit, so check listener_may_exit + */ + return listener_may_exit; +} + +/***************************************************************** + * Child process main loop. + */ + +static void process_socket(apr_pool_t *p, apr_socket_t *sock, int my_child_num, + int my_thread_num, apr_bucket_alloc_t *bucket_alloc) +{ + conn_rec *current_conn; + long conn_id = ID_FROM_CHILD_THREAD(my_child_num, my_thread_num); + int csd; + ap_sb_handle_t *sbh; + + ap_create_sb_handle(&sbh, p, my_child_num, my_thread_num); + apr_os_sock_get(&csd, sock); + + current_conn = ap_run_create_connection(p, ap_server_conf, sock, + conn_id, sbh, bucket_alloc); + if (current_conn) { + ap_process_connection(current_conn, sock); + ap_lingering_close(current_conn); + } +} + +/* requests_this_child has gone to zero or below. See if the admin coded + "MaxRequestsPerChild 0", and keep going in that case. Doing it this way + simplifies the hot path in worker_thread */ +static void check_infinite_requests(void) +{ + if (ap_max_requests_per_child) { + signal_threads(ST_GRACEFUL); + } + else { + /* wow! if you're executing this code, you may have set a record. + * either this child process has served over 2 billion requests, or + * you're running a threaded 2.0 on a 16 bit machine. + * + * I'll buy pizza and beers at Apachecon for the first person to do + * the former without cheating (dorking with INT_MAX, or running with + * uncommitted performance patches, for example). + * + * for the latter case, you probably deserve a beer too. Greg Ames + */ + + requests_this_child = INT_MAX; /* keep going */ + } +} + +static void unblock_signal(int sig) +{ + sigset_t sig_mask; + + sigemptyset(&sig_mask); + sigaddset(&sig_mask, sig); +#if defined(SIGPROCMASK_SETS_THREAD_MASK) + sigprocmask(SIG_UNBLOCK, &sig_mask, NULL); +#else + pthread_sigmask(SIG_UNBLOCK, &sig_mask, NULL); +#endif +} + +static void dummy_signal_handler(int sig) +{ + /* XXX If specifying SIG_IGN is guaranteed to unblock a syscall, + * then we don't need this goofy function. + */ +} + +static void *listener_thread(apr_thread_t *thd, void * dummy) +{ + proc_info * ti = dummy; + int process_slot = ti->pid; + apr_pool_t *tpool = apr_thread_pool_get(thd); + void *csd = NULL; + apr_pool_t *ptrans = NULL; /* Pool for per-transaction stuff */ + int n; + apr_pollfd_t *pollset; + apr_status_t rv; + ap_listen_rec *lr, *last_lr = ap_listeners; + int have_idle_worker = 0; + + free(ti); + + apr_poll_setup(&pollset, num_listensocks, tpool); + for(lr = ap_listeners ; lr != NULL ; lr = lr->next) + apr_poll_socket_add(pollset, lr->sd, APR_POLLIN); + + /* Unblock the signal used to wake this thread up, and set a handler for + * it. + */ + unblock_signal(LISTENER_SIGNAL); + apr_signal(LISTENER_SIGNAL, dummy_signal_handler); + + /* TODO: Switch to a system where threads reuse the results from earlier + poll calls - manoj */ + while (1) { + /* TODO: requests_this_child should be synchronized - aaron */ + if (requests_this_child <= 0) { + check_infinite_requests(); + } + if (listener_may_exit) break; + + if (!have_idle_worker) { + /* the following pops a recycled ptrans pool off a stack + * if there is one, in addition to reserving a worker thread + */ + rv = ap_queue_info_wait_for_idler(worker_queue_info, + &ptrans); + if (APR_STATUS_IS_EOF(rv)) { + break; /* we've been signaled to die now */ + } + else if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_EMERG, rv, ap_server_conf, + "apr_queue_info_wait failed. Attempting to " + " shutdown process gracefully."); + signal_threads(ST_GRACEFUL); + break; + } + have_idle_worker = 1; + } + + /* We've already decremented the idle worker count inside + * ap_queue_info_wait_for_idler. */ + + if ((rv = SAFE_ACCEPT(apr_proc_mutex_lock(accept_mutex))) + != APR_SUCCESS) { + int level = APLOG_EMERG; + + if (listener_may_exit) { + break; + } + if (ap_scoreboard_image->parent[process_slot].generation != + ap_scoreboard_image->global->running_generation) { + level = APLOG_DEBUG; /* common to get these at restart time */ + } + ap_log_error(APLOG_MARK, level, rv, ap_server_conf, + "apr_proc_mutex_lock failed. Attempting to shutdown " + "process gracefully."); + signal_threads(ST_GRACEFUL); + break; /* skip the lock release */ + } + + if (!ap_listeners->next) { + /* Only one listener, so skip the poll */ + lr = ap_listeners; + } + else { + while (!listener_may_exit) { + apr_status_t ret; + apr_int16_t event; + + ret = apr_poll(pollset, num_listensocks, &n, -1); + if (ret != APR_SUCCESS) { + if (APR_STATUS_IS_EINTR(ret)) { + continue; + } + + /* apr_pollset_poll() will only return errors in catastrophic + * circumstances. Let's try exiting gracefully, for now. */ + ap_log_error(APLOG_MARK, APLOG_ERR, ret, (const server_rec *) + ap_server_conf, "apr_poll: (listen)"); + signal_threads(ST_GRACEFUL); + } + + if (listener_may_exit) break; + + /* find a listener */ + lr = last_lr; + do { + lr = lr->next; + if (lr == NULL) { + lr = ap_listeners; + } + /* XXX: Should we check for POLLERR? */ + apr_poll_revents_get(&event, lr->sd, pollset); + if (event & APR_POLLIN) { + last_lr = lr; + goto got_fd; + } + } while (lr != last_lr); + } + } + got_fd: + if (!listener_may_exit) { + if (ptrans == NULL) { + /* we can't use a recycled transaction pool this time. + * create a new transaction pool */ + apr_allocator_t *allocator; + + apr_allocator_create(&allocator); + apr_allocator_max_free_set(allocator, ap_max_mem_free); + apr_pool_create_ex(&ptrans, NULL, NULL, allocator); + apr_allocator_owner_set(allocator, ptrans); + } + apr_pool_tag(ptrans, "transaction"); + rv = lr->accept_func(&csd, lr, ptrans); + /* later we trash rv and rely on csd to indicate success/failure */ + AP_DEBUG_ASSERT(rv == APR_SUCCESS || !csd); + + if (rv == APR_EGENERAL) { + /* E[NM]FILE, ENOMEM, etc */ + resource_shortage = 1; + signal_threads(ST_GRACEFUL); + } + if ((rv = SAFE_ACCEPT(apr_proc_mutex_unlock(accept_mutex))) + != APR_SUCCESS) { + int level = APLOG_EMERG; + + if (listener_may_exit) { + break; + } + if (ap_scoreboard_image->parent[process_slot].generation != + ap_scoreboard_image->global->running_generation) { + level = APLOG_DEBUG; /* common to get these at restart time */ + } + ap_log_error(APLOG_MARK, level, rv, ap_server_conf, + "apr_proc_mutex_unlock failed. Attempting to " + "shutdown process gracefully."); + signal_threads(ST_GRACEFUL); + } + if (csd != NULL) { + rv = ap_queue_push(worker_queue, csd, ptrans); + if (rv) { + /* trash the connection; we couldn't queue the connected + * socket to a worker + */ + apr_socket_close(csd); + ap_log_error(APLOG_MARK, APLOG_CRIT, rv, ap_server_conf, + "ap_queue_push failed"); + } + else { + have_idle_worker = 0; + } + } + } + else { + if ((rv = SAFE_ACCEPT(apr_proc_mutex_unlock(accept_mutex))) + != APR_SUCCESS) { + int level = APLOG_EMERG; + + if (ap_scoreboard_image->parent[process_slot].generation != + ap_scoreboard_image->global->running_generation) { + level = APLOG_DEBUG; /* common to get these at restart time */ + } + ap_log_error(APLOG_MARK, level, rv, ap_server_conf, + "apr_proc_mutex_unlock failed. Attempting to " + "shutdown process gracefully."); + signal_threads(ST_GRACEFUL); + } + break; + } + } + + ap_queue_term(worker_queue); + dying = 1; + ap_scoreboard_image->parent[process_slot].quiescing = 1; + + /* wake up the main thread */ + kill(ap_my_pid, SIGTERM); + + apr_thread_exit(thd, APR_SUCCESS); + return NULL; +} + +/* XXX For ungraceful termination/restart, we definitely don't want to + * wait for active connections to finish but we may want to wait + * for idle workers to get out of the queue code and release mutexes, + * since those mutexes are cleaned up pretty soon and some systems + * may not react favorably (i.e., segfault) if operations are attempted + * on cleaned-up mutexes. + */ +static void * APR_THREAD_FUNC worker_thread(apr_thread_t *thd, void * dummy) +{ + proc_info * ti = dummy; + int process_slot = ti->pid; + int thread_slot = ti->tid; + apr_socket_t *csd = NULL; + apr_bucket_alloc_t *bucket_alloc; + apr_pool_t *last_ptrans = NULL; + apr_pool_t *ptrans; /* Pool for per-transaction stuff */ + apr_status_t rv; + int is_idle = 0; + + free(ti); + + ap_update_child_status_from_indexes(process_slot, thread_slot, SERVER_STARTING, NULL); + + while (!workers_may_exit) { + if (!is_idle) { + rv = ap_queue_info_set_idle(worker_queue_info, last_ptrans); + last_ptrans = NULL; + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_EMERG, rv, ap_server_conf, + "ap_queue_info_set_idle failed. Attempting to " + "shutdown process gracefully."); + signal_threads(ST_GRACEFUL); + break; + } + is_idle = 1; + } + + ap_update_child_status_from_indexes(process_slot, thread_slot, SERVER_READY, NULL); +worker_pop: + if (workers_may_exit) { + break; + } + rv = ap_queue_pop(worker_queue, &csd, &ptrans); + + if (rv != APR_SUCCESS) { + /* We get APR_EOF during a graceful shutdown once all the connections + * accepted by this server process have been handled. + */ + if (APR_STATUS_IS_EOF(rv)) { + break; + } + /* We get APR_EINTR whenever ap_queue_pop() has been interrupted + * from an explicit call to ap_queue_interrupt_all(). This allows + * us to unblock threads stuck in ap_queue_pop() when a shutdown + * is pending. + * + * If workers_may_exit is set and this is ungraceful termination/ + * restart, we are bound to get an error on some systems (e.g., + * AIX, which sanity-checks mutex operations) since the queue + * may have already been cleaned up. Don't log the "error" if + * workers_may_exit is set. + */ + else if (APR_STATUS_IS_EINTR(rv)) { + goto worker_pop; + } + /* We got some other error. */ + else if (!workers_may_exit) { + ap_log_error(APLOG_MARK, APLOG_CRIT, rv, ap_server_conf, + "ap_queue_pop failed"); + } + continue; + } + is_idle = 0; + worker_sockets[thread_slot] = csd; + bucket_alloc = apr_bucket_alloc_create(ptrans); + process_socket(ptrans, csd, process_slot, thread_slot, bucket_alloc); + worker_sockets[thread_slot] = NULL; + requests_this_child--; /* FIXME: should be synchronized - aaron */ + apr_pool_clear(ptrans); + last_ptrans = ptrans; + } + + ap_update_child_status_from_indexes(process_slot, thread_slot, + (dying) ? SERVER_DEAD : SERVER_GRACEFUL, (request_rec *) NULL); + + apr_thread_exit(thd, APR_SUCCESS); + return NULL; +} + +static int check_signal(int signum) +{ + switch (signum) { + case SIGTERM: + case SIGINT: + return 1; + } + return 0; +} + +static void create_listener_thread(thread_starter *ts) +{ + int my_child_num = ts->child_num_arg; + apr_threadattr_t *thread_attr = ts->threadattr; + proc_info *my_info; + apr_status_t rv; + + my_info = (proc_info *)malloc(sizeof(proc_info)); + my_info->pid = my_child_num; + my_info->tid = -1; /* listener thread doesn't have a thread slot */ + my_info->sd = 0; + rv = apr_thread_create(&ts->listener, thread_attr, listener_thread, + my_info, pchild); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ALERT, rv, ap_server_conf, + "apr_thread_create: unable to create listener thread"); + /* let the parent decide how bad this really is */ + clean_child_exit(APEXIT_CHILDSICK); + } + apr_os_thread_get(&listener_os_thread, ts->listener); +} + +/* XXX under some circumstances not understood, children can get stuck + * in start_threads forever trying to take over slots which will + * never be cleaned up; for now there is an APLOG_DEBUG message issued + * every so often when this condition occurs + */ +static void * APR_THREAD_FUNC start_threads(apr_thread_t *thd, void *dummy) +{ + thread_starter *ts = dummy; + apr_thread_t **threads = ts->threads; + apr_threadattr_t *thread_attr = ts->threadattr; + int child_num_arg = ts->child_num_arg; + int my_child_num = child_num_arg; + proc_info *my_info; + apr_status_t rv; + int i; + int threads_created = 0; + int listener_started = 0; + int loops; + int prev_threads_created; + + /* We must create the fd queues before we start up the listener + * and worker threads. */ + worker_queue = apr_pcalloc(pchild, sizeof(*worker_queue)); + rv = ap_queue_init(worker_queue, ap_threads_per_child, pchild); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ALERT, rv, ap_server_conf, + "ap_queue_init() failed"); + clean_child_exit(APEXIT_CHILDFATAL); + } + + rv = ap_queue_info_create(&worker_queue_info, pchild, + ap_threads_per_child); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ALERT, rv, ap_server_conf, + "ap_queue_info_create() failed"); + clean_child_exit(APEXIT_CHILDFATAL); + } + + worker_sockets = apr_pcalloc(pchild, ap_threads_per_child + * sizeof(apr_socket_t *)); + + loops = prev_threads_created = 0; + while (1) { + /* ap_threads_per_child does not include the listener thread */ + for (i = 0; i < ap_threads_per_child; i++) { + int status = ap_scoreboard_image->servers[child_num_arg][i].status; + + if (status != SERVER_GRACEFUL && status != SERVER_DEAD) { + continue; + } + + my_info = (proc_info *)malloc(sizeof(proc_info)); + if (my_info == NULL) { + ap_log_error(APLOG_MARK, APLOG_ALERT, errno, ap_server_conf, + "malloc: out of memory"); + clean_child_exit(APEXIT_CHILDFATAL); + } + my_info->pid = my_child_num; + my_info->tid = i; + my_info->sd = 0; + + /* We are creating threads right now */ + ap_update_child_status_from_indexes(my_child_num, i, + SERVER_STARTING, NULL); + /* We let each thread update its own scoreboard entry. This is + * done because it lets us deal with tid better. + */ + rv = apr_thread_create(&threads[i], thread_attr, + worker_thread, my_info, pchild); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ALERT, rv, ap_server_conf, + "apr_thread_create: unable to create worker thread"); + /* let the parent decide how bad this really is */ + clean_child_exit(APEXIT_CHILDSICK); + } + threads_created++; + } + /* Start the listener only when there are workers available */ + if (!listener_started && threads_created) { + create_listener_thread(ts); + listener_started = 1; + } + if (start_thread_may_exit || threads_created == ap_threads_per_child) { + break; + } + /* wait for previous generation to clean up an entry */ + apr_sleep(apr_time_from_sec(1)); + ++loops; + if (loops % 120 == 0) { /* every couple of minutes */ + if (prev_threads_created == threads_created) { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, ap_server_conf, + "child %" APR_PID_T_FMT " isn't taking over " + "slots very quickly (%d of %d)", + ap_my_pid, threads_created, ap_threads_per_child); + } + prev_threads_created = threads_created; + } + } + + /* What state should this child_main process be listed as in the + * scoreboard...? + * ap_update_child_status_from_indexes(my_child_num, i, SERVER_STARTING, + * (request_rec *) NULL); + * + * This state should be listed separately in the scoreboard, in some kind + * of process_status, not mixed in with the worker threads' status. + * "life_status" is almost right, but it's in the worker's structure, and + * the name could be clearer. gla + */ + apr_thread_exit(thd, APR_SUCCESS); + return NULL; +} + +static void join_workers(apr_thread_t *listener, apr_thread_t **threads) +{ + int i; + apr_status_t rv, thread_rv; + + if (listener) { + int iter; + + /* deal with a rare timing window which affects waking up the + * listener thread... if the signal sent to the listener thread + * is delivered between the time it verifies that the + * listener_may_exit flag is clear and the time it enters a + * blocking syscall, the signal didn't do any good... work around + * that by sleeping briefly and sending it again + */ + + iter = 0; + while (iter < 10 && +#ifdef HAVE_PTHREAD_KILL + pthread_kill(*listener_os_thread, 0) +#else + kill(ap_my_pid, 0) +#endif + == 0) { + /* listener not dead yet */ + apr_sleep(apr_time_make(0, 500000)); + wakeup_listener(); + ++iter; + } + if (iter >= 10) { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, ap_server_conf, + "the listener thread didn't exit"); + } + else { + rv = apr_thread_join(&thread_rv, listener); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_CRIT, rv, ap_server_conf, + "apr_thread_join: unable to join listener thread"); + } + } + } + + for (i = 0; i < ap_threads_per_child; i++) { + if (threads[i]) { /* if we ever created this thread */ + rv = apr_thread_join(&thread_rv, threads[i]); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_CRIT, rv, ap_server_conf, + "apr_thread_join: unable to join worker " + "thread %d", + i); + } + } + } +} + +static void join_start_thread(apr_thread_t *start_thread_id) +{ + apr_status_t rv, thread_rv; + + start_thread_may_exit = 1; /* tell it to give up in case it is still + * trying to take over slots from a + * previous generation + */ + rv = apr_thread_join(&thread_rv, start_thread_id); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_CRIT, rv, ap_server_conf, + "apr_thread_join: unable to join the start " + "thread"); + } +} + +static void child_main(int child_num_arg) +{ + apr_thread_t **threads; + apr_status_t rv; + thread_starter *ts; + apr_threadattr_t *thread_attr; + apr_thread_t *start_thread_id; + + mpm_state = AP_MPMQ_STARTING; /* for benefit of any hooks that run as this + * child initializes + */ + ap_my_pid = getpid(); + ap_fatal_signal_child_setup(ap_server_conf); + apr_pool_create(&pchild, pconf); + + /*stuff to do before we switch id's, so we have permissions.*/ + ap_reopen_scoreboard(pchild, NULL, 0); + + rv = SAFE_ACCEPT(apr_proc_mutex_child_init(&accept_mutex, ap_lock_fname, + pchild)); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_EMERG, rv, ap_server_conf, + "Couldn't initialize cross-process lock in child"); + clean_child_exit(APEXIT_CHILDFATAL); + } + + if (unixd_setup_child()) { + clean_child_exit(APEXIT_CHILDFATAL); + } + + ap_run_child_init(pchild, ap_server_conf); + + /* done with init critical section */ + + /* Just use the standard apr_setup_signal_thread to block all signals + * from being received. The child processes no longer use signals for + * any communication with the parent process. + */ + rv = apr_setup_signal_thread(); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_EMERG, rv, ap_server_conf, + "Couldn't initialize signal thread"); + clean_child_exit(APEXIT_CHILDFATAL); + } + + if (ap_max_requests_per_child) { + requests_this_child = ap_max_requests_per_child; + } + else { + /* coding a value of zero means infinity */ + requests_this_child = INT_MAX; + } + + /* Setup worker threads */ + + /* clear the storage; we may not create all our threads immediately, + * and we want a 0 entry to indicate a thread which was not created + */ + threads = (apr_thread_t **)calloc(1, + sizeof(apr_thread_t *) * ap_threads_per_child); + if (threads == NULL) { + ap_log_error(APLOG_MARK, APLOG_ALERT, errno, ap_server_conf, + "malloc: out of memory"); + clean_child_exit(APEXIT_CHILDFATAL); + } + + ts = (thread_starter *)apr_palloc(pchild, sizeof(*ts)); + + apr_threadattr_create(&thread_attr, pchild); + /* 0 means PTHREAD_CREATE_JOINABLE */ + apr_threadattr_detach_set(thread_attr, 0); + + ts->threads = threads; + ts->listener = NULL; + ts->child_num_arg = child_num_arg; + ts->threadattr = thread_attr; + + rv = apr_thread_create(&start_thread_id, thread_attr, start_threads, + ts, pchild); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ALERT, rv, ap_server_conf, + "apr_thread_create: unable to create worker thread"); + /* let the parent decide how bad this really is */ + clean_child_exit(APEXIT_CHILDSICK); + } + + mpm_state = AP_MPMQ_RUNNING; + + /* If we are only running in one_process mode, we will want to + * still handle signals. */ + if (one_process) { + /* Block until we get a terminating signal. */ + apr_signal_thread(check_signal); + /* make sure the start thread has finished; signal_threads() + * and join_workers() depend on that + */ + /* XXX join_start_thread() won't be awakened if one of our + * threads encounters a critical error and attempts to + * shutdown this child + */ + join_start_thread(start_thread_id); + signal_threads(ST_UNGRACEFUL); /* helps us terminate a little more + * quickly than the dispatch of the signal thread + * beats the Pipe of Death and the browsers + */ + /* A terminating signal was received. Now join each of the + * workers to clean them up. + * If the worker already exited, then the join frees + * their resources and returns. + * If the worker hasn't exited, then this blocks until + * they have (then cleans up). + */ + join_workers(ts->listener, threads); + } + else { /* !one_process */ + /* remove SIGTERM from the set of blocked signals... if one of + * the other threads in the process needs to take us down + * (e.g., for MaxRequestsPerChild) it will send us SIGTERM + */ + unblock_signal(SIGTERM); + apr_signal(SIGTERM, dummy_signal_handler); + /* Watch for any messages from the parent over the POD */ + while (1) { + rv = ap_mpm_pod_check(pod); + if (rv == AP_NORESTART) { + /* see if termination was triggered while we slept */ + switch(terminate_mode) { + case ST_GRACEFUL: + rv = AP_GRACEFUL; + break; + case ST_UNGRACEFUL: + rv = AP_RESTART; + break; + } + } + if (rv == AP_GRACEFUL || rv == AP_RESTART) { + /* make sure the start thread has finished; + * signal_threads() and join_workers depend on that + */ + join_start_thread(start_thread_id); + signal_threads(rv == AP_GRACEFUL ? ST_GRACEFUL : ST_UNGRACEFUL); + break; + } + } + + /* A terminating signal was received. Now join each of the + * workers to clean them up. + * If the worker already exited, then the join frees + * their resources and returns. + * If the worker hasn't exited, then this blocks until + * they have (then cleans up). + */ + join_workers(ts->listener, threads); + } + + free(threads); + + clean_child_exit(resource_shortage ? APEXIT_CHILDSICK : 0); +} + +static int make_child(server_rec *s, int slot) +{ + int pid; + + if (slot + 1 > ap_max_daemons_limit) { + ap_max_daemons_limit = slot + 1; + } + + if (one_process) { + set_signals(); + ap_scoreboard_image->parent[slot].pid = getpid(); + child_main(slot); + } + + if ((pid = fork()) == -1) { + ap_log_error(APLOG_MARK, APLOG_ERR, errno, s, + "fork: Unable to fork new process"); + + /* fork didn't succeed. Fix the scoreboard or else + * it will say SERVER_STARTING forever and ever + */ + ap_update_child_status_from_indexes(slot, 0, SERVER_DEAD, NULL); + + /* In case system resources are maxxed out, we don't want + Apache running away with the CPU trying to fork over and + over and over again. */ + apr_sleep(apr_time_from_sec(10)); + + return -1; + } + + if (!pid) { +#ifdef HAVE_BINDPROCESSOR + /* By default, AIX binds to a single processor. This bit unbinds + * children which will then bind to another CPU. + */ + int status = bindprocessor(BINDPROCESS, (int)getpid(), + PROCESSOR_CLASS_ANY); + if (status != OK) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, + ap_server_conf, + "processor unbind failed %d", status); +#endif + RAISE_SIGSTOP(MAKE_CHILD); + + apr_signal(SIGTERM, just_die); + child_main(slot); + + clean_child_exit(0); + } + /* else */ + if (ap_scoreboard_image->parent[slot].pid != 0) { + /* This new child process is squatting on the scoreboard + * entry owned by an exiting child process, which cannot + * exit until all active requests complete. + * Don't forget about this exiting child process, or we + * won't be able to kill it if it doesn't exit by the + * time the server is shut down. + */ + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, ap_server_conf, + "taking over scoreboard slot from %" APR_PID_T_FMT "%s", + ap_scoreboard_image->parent[slot].pid, + ap_scoreboard_image->parent[slot].quiescing ? + " (quiescing)" : ""); + ap_register_extra_mpm_process(ap_scoreboard_image->parent[slot].pid); + } + ap_scoreboard_image->parent[slot].quiescing = 0; + ap_scoreboard_image->parent[slot].pid = pid; + return 0; +} + +/* start up a bunch of children */ +static void startup_children(int number_to_start) +{ + int i; + + for (i = 0; number_to_start && i < ap_daemons_limit; ++i) { + if (ap_scoreboard_image->parent[i].pid != 0) { + continue; + } + if (make_child(ap_server_conf, i) < 0) { + break; + } + --number_to_start; + } +} + + +/* + * idle_spawn_rate is the number of children that will be spawned on the + * next maintenance cycle if there aren't enough idle servers. It is + * doubled up to MAX_SPAWN_RATE, and reset only when a cycle goes by + * without the need to spawn. + */ +static int idle_spawn_rate = 1; +#ifndef MAX_SPAWN_RATE +#define MAX_SPAWN_RATE (32) +#endif +static int hold_off_on_exponential_spawning; + +static void perform_idle_server_maintenance(void) +{ + int i, j; + int idle_thread_count; + worker_score *ws; + process_score *ps; + int free_length; + int totally_free_length = 0; + int free_slots[MAX_SPAWN_RATE]; + int last_non_dead; + int total_non_dead; + int active_thread_count = 0; + + /* initialize the free_list */ + free_length = 0; + + idle_thread_count = 0; + last_non_dead = -1; + total_non_dead = 0; + + for (i = 0; i < ap_daemons_limit; ++i) { + /* Initialization to satisfy the compiler. It doesn't know + * that ap_threads_per_child is always > 0 */ + int status = SERVER_DEAD; + int any_dying_threads = 0; + int any_dead_threads = 0; + int all_dead_threads = 1; + + if (i >= ap_max_daemons_limit && totally_free_length == idle_spawn_rate) + break; + ps = &ap_scoreboard_image->parent[i]; + for (j = 0; j < ap_threads_per_child; j++) { + ws = &ap_scoreboard_image->servers[i][j]; + status = ws->status; + + /* XXX any_dying_threads is probably no longer needed GLA */ + any_dying_threads = any_dying_threads || + (status == SERVER_GRACEFUL); + any_dead_threads = any_dead_threads || (status == SERVER_DEAD); + all_dead_threads = all_dead_threads && + (status == SERVER_DEAD || + status == SERVER_GRACEFUL); + + /* We consider a starting server as idle because we started it + * at least a cycle ago, and if it still hasn't finished starting + * then we're just going to swamp things worse by forking more. + * So we hopefully won't need to fork more if we count it. + * This depends on the ordering of SERVER_READY and SERVER_STARTING. + */ + if (ps->pid != 0) { /* XXX just set all_dead_threads in outer for + loop if no pid? not much else matters */ + if (status <= SERVER_READY && status != SERVER_DEAD && + !ps->quiescing && + ps->generation == ap_my_generation) { + ++idle_thread_count; + } + if (status >= SERVER_READY && status < SERVER_GRACEFUL) { + ++active_thread_count; + } + } + } + if (any_dead_threads && totally_free_length < idle_spawn_rate + && free_length < MAX_SPAWN_RATE + && (!ps->pid /* no process in the slot */ + || ps->quiescing)) { /* or at least one is going away */ + if (all_dead_threads) { + /* great! we prefer these, because the new process can + * start more threads sooner. So prioritize this slot + * by putting it ahead of any slots with active threads. + * + * first, make room by moving a slot that's potentially still + * in use to the end of the array + */ + free_slots[free_length] = free_slots[totally_free_length]; + free_slots[totally_free_length++] = i; + } + else { + /* slot is still in use - back of the bus + */ + free_slots[free_length] = i; + } + ++free_length; + } + /* XXX if (!ps->quiescing) is probably more reliable GLA */ + if (!any_dying_threads) { + last_non_dead = i; + ++total_non_dead; + } + } + + if (sick_child_detected) { + if (active_thread_count > 0) { + /* some child processes appear to be working. don't kill the + * whole server. + */ + sick_child_detected = 0; + } + else { + /* looks like a basket case. give up. + */ + shutdown_pending = 1; + child_fatal = 1; + ap_log_error(APLOG_MARK, APLOG_ALERT, 0, + ap_server_conf, + "No active workers found..." + " Apache is exiting!"); + /* the child already logged the failure details */ + return; + } + } + + ap_max_daemons_limit = last_non_dead + 1; + + if (idle_thread_count > max_spare_threads) { + /* Kill off one child */ + ap_mpm_pod_signal(pod, TRUE); + idle_spawn_rate = 1; + } + else if (idle_thread_count < min_spare_threads) { + /* terminate the free list */ + if (free_length == 0) { + /* only report this condition once */ + static int reported = 0; + + if (!reported) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, + ap_server_conf, + "server reached MaxClients setting, consider" + " raising the MaxClients setting"); + reported = 1; + } + idle_spawn_rate = 1; + } + else { + if (free_length > idle_spawn_rate) { + free_length = idle_spawn_rate; + } + if (idle_spawn_rate >= 8) { + ap_log_error(APLOG_MARK, APLOG_INFO, 0, + ap_server_conf, + "server seems busy, (you may need " + "to increase StartServers, ThreadsPerChild " + "or Min/MaxSpareThreads), " + "spawning %d children, there are around %d idle " + "threads, and %d total children", free_length, + idle_thread_count, total_non_dead); + } + for (i = 0; i < free_length; ++i) { + make_child(ap_server_conf, free_slots[i]); + } + /* the next time around we want to spawn twice as many if this + * wasn't good enough, but not if we've just done a graceful + */ + if (hold_off_on_exponential_spawning) { + --hold_off_on_exponential_spawning; + } + else if (idle_spawn_rate < MAX_SPAWN_RATE) { + idle_spawn_rate *= 2; + } + } + } + else { + idle_spawn_rate = 1; + } +} + +static void server_main_loop(int remaining_children_to_start) +{ + int child_slot; + apr_exit_why_e exitwhy; + int status, processed_status; + apr_proc_t pid; + int i; + + while (!restart_pending && !shutdown_pending) { + ap_wait_or_timeout(&exitwhy, &status, &pid, pconf); + + if (pid.pid != -1) { + processed_status = ap_process_child_status(&pid, exitwhy, status); + if (processed_status == APEXIT_CHILDFATAL) { + shutdown_pending = 1; + child_fatal = 1; + return; + } + else if (processed_status == APEXIT_CHILDSICK) { + /* tell perform_idle_server_maintenance to check into this + * on the next timer pop + */ + sick_child_detected = 1; + } + /* non-fatal death... note that it's gone in the scoreboard. */ + child_slot = find_child_by_pid(&pid); + if (child_slot >= 0) { + for (i = 0; i < ap_threads_per_child; i++) + ap_update_child_status_from_indexes(child_slot, i, SERVER_DEAD, + (request_rec *) NULL); + + ap_scoreboard_image->parent[child_slot].pid = 0; + ap_scoreboard_image->parent[child_slot].quiescing = 0; + if (processed_status == APEXIT_CHILDSICK) { + /* resource shortage, minimize the fork rate */ + idle_spawn_rate = 1; + } + else if (remaining_children_to_start + && child_slot < ap_daemons_limit) { + /* we're still doing a 1-for-1 replacement of dead + * children with new children + */ + make_child(ap_server_conf, child_slot); + --remaining_children_to_start; + } + } + else if (ap_unregister_extra_mpm_process(pid.pid) == 1) { + /* handled */ +#if APR_HAS_OTHER_CHILD + } + else if (apr_proc_other_child_read(&pid, status) == 0) { + /* handled */ +#endif + } + else if (is_graceful) { + /* Great, we've probably just lost a slot in the + * scoreboard. Somehow we don't know about this child. + */ + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, + ap_server_conf, + "long lost child came home! (pid %ld)", + (long)pid.pid); + } + /* Don't perform idle maintenance when a child dies, + * only do it when there's a timeout. Remember only a + * finite number of children can die, and it's pretty + * pathological for a lot to die suddenly. + */ + continue; + } + else if (remaining_children_to_start) { + /* we hit a 1 second timeout in which none of the previous + * generation of children needed to be reaped... so assume + * they're all done, and pick up the slack if any is left. + */ + startup_children(remaining_children_to_start); + remaining_children_to_start = 0; + /* In any event we really shouldn't do the code below because + * few of the servers we just started are in the IDLE state + * yet, so we'd mistakenly create an extra server. + */ + continue; + } + + perform_idle_server_maintenance(); + } +} + +int ap_mpm_run(apr_pool_t *_pconf, apr_pool_t *plog, server_rec *s) +{ + int remaining_children_to_start; + apr_status_t rv; + + ap_log_pid(pconf, ap_pid_fname); + + first_server_limit = server_limit; + first_thread_limit = thread_limit; + if (changed_limit_at_restart) { + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s, + "WARNING: Attempt to change ServerLimit or ThreadLimit " + "ignored during restart"); + changed_limit_at_restart = 0; + } + + /* Initialize cross-process accept lock */ + ap_lock_fname = apr_psprintf(_pconf, "%s.%" APR_PID_T_FMT, + ap_server_root_relative(_pconf, ap_lock_fname), + ap_my_pid); + + rv = apr_proc_mutex_create(&accept_mutex, ap_lock_fname, + ap_accept_lock_mech, _pconf); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_EMERG, rv, s, + "Couldn't create accept lock"); + mpm_state = AP_MPMQ_STOPPING; + return 1; + } + +#if APR_USE_SYSVSEM_SERIALIZE + if (ap_accept_lock_mech == APR_LOCK_DEFAULT || + ap_accept_lock_mech == APR_LOCK_SYSVSEM) { +#else + if (ap_accept_lock_mech == APR_LOCK_SYSVSEM) { +#endif + rv = unixd_set_proc_mutex_perms(accept_mutex); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_EMERG, rv, s, + "Couldn't set permissions on cross-process lock; " + "check User and Group directives"); + mpm_state = AP_MPMQ_STOPPING; + return 1; + } + } + + if (!is_graceful) { + if (ap_run_pre_mpm(s->process->pool, SB_SHARED) != OK) { + mpm_state = AP_MPMQ_STOPPING; + return 1; + } + /* fix the generation number in the global score; we just got a new, + * cleared scoreboard + */ + ap_scoreboard_image->global->running_generation = ap_my_generation; + } + + set_signals(); + /* Don't thrash... */ + if (max_spare_threads < min_spare_threads + ap_threads_per_child) + max_spare_threads = min_spare_threads + ap_threads_per_child; + + /* If we're doing a graceful_restart then we're going to see a lot + * of children exiting immediately when we get into the main loop + * below (because we just sent them AP_SIG_GRACEFUL). This happens pretty + * rapidly... and for each one that exits we'll start a new one until + * we reach at least daemons_min_free. But we may be permitted to + * start more than that, so we'll just keep track of how many we're + * supposed to start up without the 1 second penalty between each fork. + */ + remaining_children_to_start = ap_daemons_to_start; + if (remaining_children_to_start > ap_daemons_limit) { + remaining_children_to_start = ap_daemons_limit; + } + if (!is_graceful) { + startup_children(remaining_children_to_start); + remaining_children_to_start = 0; + } + else { + /* give the system some time to recover before kicking into + * exponential mode */ + hold_off_on_exponential_spawning = 10; + } + + ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, ap_server_conf, + "%s configured -- resuming normal operations", + ap_get_server_version()); + ap_log_error(APLOG_MARK, APLOG_INFO, 0, ap_server_conf, + "Server built: %s", ap_get_server_built()); +#ifdef AP_MPM_WANT_SET_ACCEPT_LOCK_MECH + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, ap_server_conf, + "AcceptMutex: %s (default: %s)", + apr_proc_mutex_name(accept_mutex), + apr_proc_mutex_defname()); +#endif + restart_pending = shutdown_pending = 0; + mpm_state = AP_MPMQ_RUNNING; + + server_main_loop(remaining_children_to_start); + mpm_state = AP_MPMQ_STOPPING; + + if (shutdown_pending) { + /* Time to gracefully shut down: + * Kill child processes, tell them to call child_exit, etc... + * (By "gracefully" we don't mean graceful in the same sense as + * "apachectl graceful" where we allow old connections to finish.) + */ + ap_mpm_pod_killpg(pod, ap_daemons_limit, FALSE); + ap_reclaim_child_processes(1); /* Start with SIGTERM */ + + if (!child_fatal) { + /* cleanup pid file on normal shutdown */ + const char *pidfile = NULL; + pidfile = ap_server_root_relative (pconf, ap_pid_fname); + if ( pidfile != NULL && unlink(pidfile) == 0) + ap_log_error(APLOG_MARK, APLOG_INFO, 0, + ap_server_conf, + "removed PID file %s (pid=%ld)", + pidfile, (long)getpid()); + + ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, + ap_server_conf, "caught SIGTERM, shutting down"); + } + return 1; + } + + /* we've been told to restart */ + apr_signal(SIGHUP, SIG_IGN); + + if (one_process) { + /* not worth thinking about */ + return 1; + } + + /* advance to the next generation */ + /* XXX: we really need to make sure this new generation number isn't in + * use by any of the children. + */ + ++ap_my_generation; + ap_scoreboard_image->global->running_generation = ap_my_generation; + + if (is_graceful) { + ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, ap_server_conf, + AP_SIG_GRACEFUL_STRING " received. Doing graceful restart"); + /* wake up the children...time to die. But we'll have more soon */ + ap_mpm_pod_killpg(pod, ap_daemons_limit, TRUE); + + + /* This is mostly for debugging... so that we know what is still + * gracefully dealing with existing request. + */ + + } + else { + /* Kill 'em all. Since the child acts the same on the parents SIGTERM + * and a SIGHUP, we may as well use the same signal, because some user + * pthreads are stealing signals from us left and right. + */ + ap_mpm_pod_killpg(pod, ap_daemons_limit, FALSE); + + ap_reclaim_child_processes(1); /* Start with SIGTERM */ + ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, ap_server_conf, + "SIGHUP received. Attempting to restart"); + } + + return 0; +} + +/* This really should be a post_config hook, but the error log is already + * redirected by that point, so we need to do this in the open_logs phase. + */ +static int worker_open_logs(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s) +{ + apr_status_t rv; + + pconf = p; + ap_server_conf = s; + + if ((num_listensocks = ap_setup_listeners(ap_server_conf)) < 1) { + ap_log_error(APLOG_MARK, APLOG_ALERT|APLOG_STARTUP, 0, + NULL, "no listening sockets available, shutting down"); + return DONE; + } + + if (!one_process) { + if ((rv = ap_mpm_pod_open(pconf, &pod))) { + ap_log_error(APLOG_MARK, APLOG_CRIT|APLOG_STARTUP, rv, NULL, + "Could not open pipe-of-death."); + return DONE; + } + } + return OK; +} + +static int worker_pre_config(apr_pool_t *pconf, apr_pool_t *plog, + apr_pool_t *ptemp) +{ + static int restart_num = 0; + int no_detach, debug, foreground; + ap_directive_t *pdir; + ap_directive_t *max_clients = NULL; + apr_status_t rv; + + mpm_state = AP_MPMQ_STARTING; + + /* make sure that "ThreadsPerChild" gets set before "MaxClients" */ + for (pdir = ap_conftree; pdir != NULL; pdir = pdir->next) { + if (strncasecmp(pdir->directive, "ThreadsPerChild", 15) == 0) { + if (!max_clients) { + break; /* we're in the clear, got ThreadsPerChild first */ + } + else { + /* now to swap the data */ + ap_directive_t temp; + + temp.directive = pdir->directive; + temp.args = pdir->args; + /* Make sure you don't change 'next', or you may get loops! */ + /* XXX: first_child, parent, and data can never be set + * for these directives, right? -aaron */ + temp.filename = pdir->filename; + temp.line_num = pdir->line_num; + + pdir->directive = max_clients->directive; + pdir->args = max_clients->args; + pdir->filename = max_clients->filename; + pdir->line_num = max_clients->line_num; + + max_clients->directive = temp.directive; + max_clients->args = temp.args; + max_clients->filename = temp.filename; + max_clients->line_num = temp.line_num; + break; + } + } + else if (!max_clients + && strncasecmp(pdir->directive, "MaxClients", 10) == 0) { + max_clients = pdir; + } + } + + debug = ap_exists_config_define("DEBUG"); + + if (debug) { + foreground = one_process = 1; + no_detach = 0; + } + else { + one_process = ap_exists_config_define("ONE_PROCESS"); + no_detach = ap_exists_config_define("NO_DETACH"); + foreground = ap_exists_config_define("FOREGROUND"); + } + + /* sigh, want this only the second time around */ + if (restart_num++ == 1) { + is_graceful = 0; + + if (!one_process && !foreground) { + rv = apr_proc_detach(no_detach ? APR_PROC_DETACH_FOREGROUND + : APR_PROC_DETACH_DAEMONIZE); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_CRIT, rv, NULL, + "apr_proc_detach failed"); + return HTTP_INTERNAL_SERVER_ERROR; + } + } + parent_pid = ap_my_pid = getpid(); + } + + unixd_pre_config(ptemp); + ap_listen_pre_config(); + ap_daemons_to_start = DEFAULT_START_DAEMON; + min_spare_threads = DEFAULT_MIN_FREE_DAEMON * DEFAULT_THREADS_PER_CHILD; + max_spare_threads = DEFAULT_MAX_FREE_DAEMON * DEFAULT_THREADS_PER_CHILD; + ap_daemons_limit = server_limit; + ap_threads_per_child = DEFAULT_THREADS_PER_CHILD; + ap_pid_fname = DEFAULT_PIDLOG; + ap_lock_fname = DEFAULT_LOCKFILE; + ap_max_requests_per_child = DEFAULT_MAX_REQUESTS_PER_CHILD; + ap_extended_status = 0; +#ifdef AP_MPM_WANT_SET_MAX_MEM_FREE + ap_max_mem_free = APR_ALLOCATOR_MAX_FREE_UNLIMITED; +#endif + + apr_cpystrn(ap_coredump_dir, ap_server_root, sizeof(ap_coredump_dir)); + + return OK; +} + +static void worker_hooks(apr_pool_t *p) +{ + /* The worker open_logs phase must run before the core's, or stderr + * will be redirected to a file, and the messages won't print to the + * console. + */ + static const char *const aszSucc[] = {"core.c", NULL}; + one_process = 0; + + ap_hook_open_logs(worker_open_logs, NULL, aszSucc, APR_HOOK_MIDDLE); + /* we need to set the MPM state before other pre-config hooks use MPM query + * to retrieve it, so register as REALLY_FIRST + */ + ap_hook_pre_config(worker_pre_config, NULL, NULL, APR_HOOK_REALLY_FIRST); +} + +static const char *set_daemons_to_start(cmd_parms *cmd, void *dummy, + const char *arg) +{ + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + ap_daemons_to_start = atoi(arg); + return NULL; +} + +static const char *set_min_spare_threads(cmd_parms *cmd, void *dummy, + const char *arg) +{ + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + min_spare_threads = atoi(arg); + if (min_spare_threads <= 0) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: detected MinSpareThreads set to non-positive."); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "Resetting to 1 to avoid almost certain Apache failure."); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "Please read the documentation."); + min_spare_threads = 1; + } + + return NULL; +} + +static const char *set_max_spare_threads(cmd_parms *cmd, void *dummy, + const char *arg) +{ + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + max_spare_threads = atoi(arg); + return NULL; +} + +static const char *set_max_clients (cmd_parms *cmd, void *dummy, + const char *arg) +{ + int max_clients; + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + /* It is ok to use ap_threads_per_child here because we are + * sure that it gets set before MaxClients in the pre_config stage. */ + max_clients = atoi(arg); + if (max_clients < ap_threads_per_child) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: MaxClients (%d) must be at least as large", + max_clients); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " as ThreadsPerChild (%d). Automatically", + ap_threads_per_child); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " increasing MaxClients to %d.", + ap_threads_per_child); + max_clients = ap_threads_per_child; + } + ap_daemons_limit = max_clients / ap_threads_per_child; + if ((max_clients > 0) && (max_clients % ap_threads_per_child)) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: MaxClients (%d) is not an integer multiple", + max_clients); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " of ThreadsPerChild (%d), lowering MaxClients to %d", + ap_threads_per_child, + ap_daemons_limit * ap_threads_per_child); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " for a maximum of %d child processes,", + ap_daemons_limit); + max_clients = ap_daemons_limit * ap_threads_per_child; + } + if (ap_daemons_limit > server_limit) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: MaxClients of %d would require %d servers,", + max_clients, ap_daemons_limit); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " and would exceed the ServerLimit value of %d.", + server_limit); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " Automatically lowering MaxClients to %d. To increase,", + server_limit * ap_threads_per_child); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " please see the ServerLimit directive."); + ap_daemons_limit = server_limit; + } + else if (ap_daemons_limit < 1) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: Require MaxClients > 0, setting to 1"); + ap_daemons_limit = 1; + } + return NULL; +} + +static const char *set_threads_per_child (cmd_parms *cmd, void *dummy, + const char *arg) +{ + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + ap_threads_per_child = atoi(arg); + if (ap_threads_per_child > thread_limit) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: ThreadsPerChild of %d exceeds ThreadLimit " + "value of %d", ap_threads_per_child, + thread_limit); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "threads, lowering ThreadsPerChild to %d. To increase, please" + " see the", thread_limit); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " ThreadLimit directive."); + ap_threads_per_child = thread_limit; + } + else if (ap_threads_per_child < 1) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: Require ThreadsPerChild > 0, setting to 1"); + ap_threads_per_child = 1; + } + return NULL; +} + +static const char *set_server_limit (cmd_parms *cmd, void *dummy, const char *arg) +{ + int tmp_server_limit; + + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + tmp_server_limit = atoi(arg); + /* you cannot change ServerLimit across a restart; ignore + * any such attempts + */ + if (first_server_limit && + tmp_server_limit != server_limit) { + /* how do we log a message? the error log is a bit bucket at this + * point; we'll just have to set a flag so that ap_mpm_run() + * logs a warning later + */ + changed_limit_at_restart = 1; + return NULL; + } + server_limit = tmp_server_limit; + + if (server_limit > MAX_SERVER_LIMIT) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: ServerLimit of %d exceeds compile time limit " + "of %d servers,", server_limit, MAX_SERVER_LIMIT); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " lowering ServerLimit to %d.", MAX_SERVER_LIMIT); + server_limit = MAX_SERVER_LIMIT; + } + else if (server_limit < 1) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: Require ServerLimit > 0, setting to 1"); + server_limit = 1; + } + return NULL; +} + +static const char *set_thread_limit (cmd_parms *cmd, void *dummy, const char *arg) +{ + int tmp_thread_limit; + + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + tmp_thread_limit = atoi(arg); + /* you cannot change ThreadLimit across a restart; ignore + * any such attempts + */ + if (first_thread_limit && + tmp_thread_limit != thread_limit) { + /* how do we log a message? the error log is a bit bucket at this + * point; we'll just have to set a flag so that ap_mpm_run() + * logs a warning later + */ + changed_limit_at_restart = 1; + return NULL; + } + thread_limit = tmp_thread_limit; + + if (thread_limit > MAX_THREAD_LIMIT) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: ThreadLimit of %d exceeds compile time limit " + "of %d servers,", thread_limit, MAX_THREAD_LIMIT); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " lowering ThreadLimit to %d.", MAX_THREAD_LIMIT); + thread_limit = MAX_THREAD_LIMIT; + } + else if (thread_limit < 1) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "WARNING: Require ThreadLimit > 0, setting to 1"); + thread_limit = 1; + } + return NULL; +} + +static const command_rec worker_cmds[] = { +UNIX_DAEMON_COMMANDS, +LISTEN_COMMANDS, +AP_INIT_TAKE1("StartServers", set_daemons_to_start, NULL, RSRC_CONF, + "Number of child processes launched at server startup"), +AP_INIT_TAKE1("MinSpareThreads", set_min_spare_threads, NULL, RSRC_CONF, + "Minimum number of idle threads, to handle request spikes"), +AP_INIT_TAKE1("MaxSpareThreads", set_max_spare_threads, NULL, RSRC_CONF, + "Maximum number of idle threads"), +AP_INIT_TAKE1("MaxClients", set_max_clients, NULL, RSRC_CONF, + "Maximum number of threads alive at the same time"), +AP_INIT_TAKE1("ThreadsPerChild", set_threads_per_child, NULL, RSRC_CONF, + "Number of threads each child creates"), +AP_INIT_TAKE1("ServerLimit", set_server_limit, NULL, RSRC_CONF, + "Maximum number of child processes for this run of Apache"), +AP_INIT_TAKE1("ThreadLimit", set_thread_limit, NULL, RSRC_CONF, + "Maximum number of worker threads per child process for this run of Apache - Upper limit for ThreadsPerChild"), +{ NULL } +}; + +module AP_MODULE_DECLARE_DATA mpm_worker_module = { + MPM20_MODULE_STUFF, + ap_mpm_rewrite_args, /* hook to run before apache parses args */ + NULL, /* create per-directory config structure */ + NULL, /* merge per-directory config structures */ + NULL, /* create per-server config structure */ + NULL, /* merge per-server config structures */ + worker_cmds, /* command apr_table_t */ + worker_hooks /* register_hooks */ +}; + diff --git a/rubbos/app/httpd-2.0.64/server/mpm/worker/worker.lo b/rubbos/app/httpd-2.0.64/server/mpm/worker/worker.lo new file mode 100644 index 00000000..83f3b7ff --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm/worker/worker.lo @@ -0,0 +1,12 @@ +# worker.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/worker.o' + +# Name of the non-PIC object. +non_pic_object='worker.o' + diff --git a/rubbos/app/httpd-2.0.64/server/mpm/worker/worker.o b/rubbos/app/httpd-2.0.64/server/mpm/worker/worker.o new file mode 100644 index 0000000000000000000000000000000000000000..dc560c2bff6f3b23955fc51d5aaeb161a374bf42 GIT binary patch literal 166368 zcmeFa31C#!^*{dJybvC10znAKGDreJAR&mzZUTu+AS^=AfJ+>b$)ZUn&caevTMDSv`fY7(?YCCZBCe?2EUo+cZCyarT5VnG!vAy5xo?@7horW@?|<27AL+5) zf)c~~57zUmFl$r?5i0uPgY8FqXI=Y1GGDgCmpFll-+yqs5@7SUAN9rhv>(liWft#$ zFl&@{7ioF0-tJ!!`087G&?I(s?$7Gz4T``Om*$y=(5w|73?yE^FALCtj=XKuf>+=` zMjm}K1$eei1CLPBnC#}W?dDuBt~R@Ss8@Hw?(V0$(clQb5m?}gbMwr7)Er2>%xd@b zb|GRCcc)ss6Rpxs49ep5#euIrvhzDWJG#u$ zy9wEwfwzjpGy8rACHGNF@qXsCr91u)bbSH;Z7KYRuZQOPtWjlT&=>IiB$aPn_xSEi zI^m0*N=+2jK_BZAgf0BI31!pb>I*-PBh&oBadRKhg-!hAj z9(wpFr3~U$dUokqr7KITR<3{r)q$@5WnJ~zfyAYG0VOt&h~-TVBr5X?0$odT_Z5&y zz;Y#l4v;|zK2P^R;(*G|10^Q6A1KLIpEThxPfPs#nc#ZEA~0P$GYw355g`INN$qYQ zx&yVGU&^TBw*&Y8*$5a>7*8)dFpdEo6)}C z3?$0(N>GPHZ|4VDSKfiH%C1;mL3#1fBO}^B>J^(&dc^|0qWuxGqWyqAgT-fE*#$Bc ztg^)Cfv#oQm5Gl6_rGEWjErGfca~&#?vFokUtdtcfqpTqbALtRVTkr;bzF_u7C)9~ z%h*dnE=#;omhdaDF>R&fK>*abm5IZ9L8MhCKIA@f85N`UhxNlj4rGbe`F6ZkT-bRq ztMeeJXH6oWtd2+UeqYJFEXlKW_&~oav2EM7uFAZ;4-Y3Ez5k<8`s4TiBXj%%cdaLe z+n<>6`>f8lkij#W^QLEY+=Rvipu^9i2~4v)AB$hd?&Z;yb*;~?>}r&Ju&ur{uOyJT zzbrBRKuHEHJj(W~@l__?v4`Y&(1pB^&$RExq#5x;!F&&?#&?hqTR4qLGkIzVh zM-?LzsCxd$5~DbH6*_dur$>(_X-(YEA>Fqxm7HujR0(piPBB^JZ6H7LJI}5i)Ya+P z^(}NAZr~i~fOxnN^ZRaELfGTQAMm)PG*CDD?(Pr3P<&8zqCA;ST`65zk$6&-15>%f zVGndZA3LwS_|+o=ob~3MY-(K)=$f#XmgRki?9&95>* zgu!V_>>?ZbhYiuM z1yjCX-I6x2palbe?vHAZl>-ZSMq}RmN{b%NsA3j@Tb_rd$mtKI(oGI z6JM-92|DLIcy9|)CM|N1uKeuU21&#__iuVcmF42+i{Hk2Iy;xv!$A@kl@DgEYXo;*yd=^N2SXzbb=e2TrS7F!r83EKN7RBOu;-jj+ zl=w?!?fcv$$y#y$>xQh?RGn{y`Q@EQ?SgZMuXw*iao;>l1t)gG zLFM*5E-A>{c8-ruh73Je{8;;+da*vtHK!0yw^E%8v9%wp%F9)OSeO_znQFIRSi4|( znFNmZ^#zq(b$PjoXA^JIT5MJ(o~ld?$}7vd{WB&fl0ooLsV;k&%C13ql~{(%#kHur zWwb5fIbNCgxH9pl%EZ&cMN930SPpgtmUk-?N2N=0pq-aT9noEQAY(FIhZJ*6tjqI@ zGY&68?%SSIxqooqiI(52wSZG{6qb;~kAuOLKfJrDNPLQ9G4jRRkC|7#h= z&mW5a{pe9Hz0QtP;#4NXEJx6!z%d$F7qJGd_0cR*0 zHh|hriijD95*&TfNbs?IB-9*PJ)C@?^H_S-`K9_EEWIn zg=}r#Hy|R(`!{@o{Rzv&Hm>tbbO#bgj`UIaIO9lcOQ7q-0A(Mi9efnXDiaIgM7I0` z4s~*D*0|A790D1DoGfV$M5IR?wFau`cn3 zQ)DJPMMmxQ4%5{j=d);KzMUUq3U0AF4qZWL0a-znhNU`bCwKtGq=33}X-lNc1Tk;D zZ8Z0ACi~7A3ysf@k*bRyD15IoQ9 zf~Vt8su_%n+y%&l&i(6i+TYf}jZ3}#5N7T7d6(qE--0(dO9P4D1!RBBp6T2#A>MSR z3%H^<3DjI46y3?1G7lf2nG38CHhR;If$+y%pq9=XS=AJ`IN<1(7)Uh|;426|TR z8-?yb;z{z7ieo1t{a~ygQUQCOA^CSevAm9f~77g447XI`mk1 zVTZapAmYPApv1ku{9pA)AICD6T~s&!8Gjg#ly3PW)1m)A><>wY8Bc63Mmju^7MMR< z7b>b0II%x+6RxdHui!tO!XtAhP4x2?8Dv<6M(wd(ne>uH#oiZDV)Nlq$O~FmyPFTi zAMgyZ=Lhe568Fz|_tNtckACaJ&pRJev)!aCj^850>fq|@=OErZUv5tu#Uqw|=?>be z=8Kn)cBQZ#!$&t*WR8!7viPxm-$S2m&R##v+7Zx4@TM`?+^Y5{S%_lK4O zWxhz4Dr^gfvL9P?IO}2!6ns|dic9fhHVb#{yTjsg8O0S`*37KiA3gjnlta3P@iOi% zi#^FWTLJC33|EdzBe>*v1RGNb zoOyq^QOdD%z4ot;zx`;xtjm9gNG6UR&HD_WnymW=upZL&ioGA=5GLd<7_PHbG3Yja zAd||rBkw>ac6cuQpOtq!`nxX2!2<422p!#gkbJT3A5DebDnMtNhA=+T$b|tjJE^Xh}EjdgbxS}JEA}sa-P!MIE(?%yY0p9mo z{>?sfDRGPrK_!KR?~iI-UYa-J_}-T(RwbfWvi+40_prHt2FUY zR>wkkrTwFxSsj})Ak6MY&3HI#+cvbRi_zleaXGqa1lvQ~d^)tkKAUCD;wzm?581o; zCjBo82dmVqZcocU~1nDGp#F6-kld8WV@X67~5wZ%P?L(>&E?AnoO>{97;E{lGsyG zx+R*p;NdI1YJ~CdM;L(A9UNSg(Z%FTuAE2ECT3l^0ED8mQVc6EejBG@*wRhM7>*Xd z4Tx`(;j@I?12(@JT3Oz3)siPI=qqSHr1Sl+9`pbLWyWOG`7+!@@|WTMQSRpc@aXUv zWqEm79b+lpxW%?O@m9tCuVySZ>P@=!_A;6)y3WWBbe)TnZa&c}?;4(0Ui=tV`Gs8> zhXT4)KeO%(WM|#^`}TkI!rApBrM=$mJV=Mw=m4$bDjL?gdBX#>Re2?RWK{cL*Vj9?kn_HNEq~lA z*fZ_>b$DnvZpW4Av~F^yy$r$%97>bZCT3l=AKMB0IG|$zgm=E3)o~_e5`yH+LdYtU z^K?~5zkVuc%Vu$&WnJ+{NQJXY=y>QVg1K^aHRqMgcsOh6A(~lNJ%EJie0$R@I_L^q zu@c869eGKV$9(` z;aJXDUtxJJ20fcbKmBkP%@%bi7%xgKZxEyH`zfsD>aME33>)Kf6{N$P=;#lberV&n zM=68L(5)SAL~EcH9!5-Z6FWP$P~+FgsnDI~v@3pv9yKt&+0K*9QFnMKiKFV{w5fTB zI+R#1CRmkA&+0gg(>eH^tDQ8HbN)cB909@}rV~7vctPse5oB%OAgd(17J|c9gT?V@ z^5kD=F(f&QY7p0x!#{+Pj`a?7xB?wKXjeT_m)u#MZ8S7CnX;AvkG0VrROeut27E!H z+?iJE)M%}3sQv|OB|wnZvy+S|!-E_q?jOQ+Z23Nz zCKpz?>!93sI3x8AHmGTS?fbSxUA*5(6$fHt4;!SHa{~Ums~EQhX#yrK9EZ-(FE_5SFfCC97ZYMVS|S*ZnonNJ!J=_tV`-EWCDH3Vy8P2tvp6%`Ar%9k%5udNG5 zE(%2oYm@sbmQ;;TZmFKXY-MWG87o$&G%c%GR-V!nSh*~vW#x+H#pAVLTg}DsP&`!A z)Y=p)81JtSHZ_Op+|Bjjn%YPx7z;VQEy3pIaP3TgI3Dwd>-{aEmT+W)R@Dfyy6Cb{ zWPW2)bDg$0xPE?fQ>Zl-)ym4}tz4ijT~c1NZ28jpNJJZkIl7hD`~3Po$1S{ue|+Wc_5xz67j#t_>= zt^T&Aw$P+-{iHg$qOnl(H;31SBB1okuq&HdnqvM~*q>kL?pzUytPMqyJKYR*O_2~% zVQmOZO|9hTD9LnOXNk;@7UtK9O|9c%eu;=*yZ~F^1ySW+6K`sc&GhF-wNiG`;&?2y zo^XFbU8p`7m(KB81VLLHs`D?aDD&4N=1c+i&dG1C8?V&{;|+~5zsk>v{%B)779-2* z!s}YK+HfRts z_OICx3q`f%q1q69;G$J6-sCG{!AMMo8`Ty!wXSFjMnWq4DC?4NR|Hgsax^dvIo)EM zv^5uon_6f3-W7x78LVU&vPc=R&)6*Uq_wBQK^ z=ueU5uWPEK_=nav#oTsCKDbAqG9*d166~_)n0zUEnX{IrHSF^@MahO(@FL0xWD(-o z9F9f(fHwFshmZvu`~@IHamYtD*?R3-gQ5}*#cG=B;BF~7h5pi5EY#A*S%wHu#!<5Q zsUU=+QGY`uSR1O3H#cu6wB<$I0@npG1HFZPu{5p~RCZcuuGG+MI)mm5Cy^9*fOP|4KXA3HP^# z)>*Dr?$we4OmlusI2ftpSo`ZE;TFU;KMLa3uu4-(hbX)kLM{Z?VkM#Jlv+GA?d;O! zODdKun3+^MIaQF?wV_a5)L$EJX``YPYigl6K($o}P;!uE(TQZEEoXTMNf!wv$(!q+ z49y{_TF9qj7rm<{D6#*VUbnn2(p#0hLZ;}JURf*F2Aks{>8Cot3+u$xHOF3R)gs}q z3R{Z^yx!J~#RLT`1TQv*zQA9O7!TW%_*}~pX7_l1OFSC$uL=2sF+VAb`GZk^b1>4t z+BA*O)FBferg}UUZVASkYO#^n;KVUiep8g!-(V|-6$>?>&a`0tYQo6KERFo*CEw*J zmqg@%Dy@Dbyg%q~39fHyiMOaINO4mWE5r$A=a);0WZ^pA8$?vvq0qV0660>I^9zaO z6$QZWP7+smQOuIv;Y8V`mW?m;Cq-CG32~AJ*T%x}uQg9xg1tg+j~m-C>`t&rNLgfQ zUQy1qhFd4Kg`+4=w1L4g?w)T%5L_E>s`Ce%Tf#_=+E64GM6oJu!`@EHejNJx;SssA|YPNDR1n$ zO2cRiMOvDoQD}<#!>FWb^>r3>g|H&fZigewJ02{=YUdW!u(zrWx7If`U^sRDNt680 z6>p(p2n(=RrVV6-2Se3T)0)HRYG#-4idq{)k!uXMghu-dumkh+4h(cl;6UCSBAMv& zAd19|x7HOFVgiW|F+pf209B(wFG&dP1rW2Bt zwmejjmMC^&(G3&*1slR~Oq>l^E}#K%P@7gn!nG-zm^LjD8{|+CG`Tlt<58j8g6mqz zRrz(YibX=L6DbQ&&atb*KN>Ri@?OC%g*3&`7z@YXU!J>Q6tgw#TIu2jj^J%&9p+6L z_HzyP7J>pq<~sDaJaUsKZ$&KXa%^2C9&ySAM2ZSYtPxQV*DHArT?1{7k4Xq`Z~#tbm57yOTAXu2;xuBa;TcQ~1#gW!FAVkGH-paXz3a_$@9fuu1UWh2$Zz-%# zi4oERvy`@YR4L(dM7!ytkW2#NSL65Q_v%;SM@2!!p=F007NzM!8wKTl*LW;?nh|Pn zvg2hN()Fh-0#1A*@m30nOgl?YI)Bn`J4&@B*`>!2=%3_Y*+#^&)1j=AN@g$3^lUvI zQ2E?B0in~tzI+UVr)Bch$&2;Sj66wqGLEd=$Cvbw%Y*U|Rv_{B75C7cAjtL8GsD*nf$a~_=7@I9QKDcXvkm-`-BS8O3YU9lJGDZ$t@ zGJLpYI3B?5fnGe?jpHsk=@Q$Aq(}=KeelTb%xXPTi(&7yx!tV&Qdkd1aQ1?+`}vtL z`hEd@FX}D7_>#1q zrA8m0>v1xu`eGB4oGiCjQU)ep0-*t@`-HV@?_C(~WBeSz`^0(k!0Jt%rQ`Jwn2 z_t#Ct&MuRW-stNlEoA1k)`7I&agm&?B7*py*2BslKt8$ZU z3?vRG&dZkP>=JQ#{0dI8PTmvuv+qbm#aBV(-&U>i79*R%^Zt z`7q@}r@IB{<8{Hv=z&W=&1W*k!ZR+Ni+%w&o@Rra9I$=0-P+-RohwMJC=u?mqja4OE^D^Iv$opcn(HkvbJhg*U|CZN>NSJwezfbc}Q>Ei`7xPhO z<{PQ~G<_y$G6d1}KEy7Fk9%^(rv8&@&&uZYFDCN@JcYd8AOAEn%ijn=^pL)mbrKCz zz%f6k7N*Y1D<@TiXU!yM_cXH>?zSwSLSu9GA3nSsMEx>pVs5&kD}P9b;*%brILOh(n~s6q@=dWYZHzu)cxdT+(<^ zjV+{wM=AuZmBdH{ku5esjFMMrjI(4S*g#(t6|PHM5-xSA<~h?>%Wlgm?+^EhV;4B! z5`LJUglC;a{v1$)3#F{{$#X*6NPZD8OrsWXE!i&MCbClNMLI`911I;1m;qUH&ju>i zl~AvOO9@u)pYO7CGYuwN#dr&e!vAPlN!yc5Gm7_t^jJ;~%gQzf4F4`Lwqd}iH8wc< zE`Zv=J1oi^hS)oqCRvne5?^1Eef@ykPXM!x1ICbW1y7)vD8U<0Ncy%3P4TCo*{%)B zG>I?Mq^=Y2PaD`rr?3g!SEno&xWDeuWa*Uh(mp_^hzdMN#}jV~9<0A>w-3>2rVGtb z-L8W<6G>#I*@-GSnCb!9tqq!X9q=Ip3Vy}Sz%$Js;ysrb=!q}!9rvFw{^2D0!Q-Dy z!iN-22hOBJrrTidq}MD3xznDrz@dc$P{tkILyJcPXBYd2PQ4H?yKm?;0u?-+Y!Vj_ zok?(Cp_xsv%$1>Ye*ribgZLUu8JaO{?oYr!3~lONXV}N@2ES+Udk=ok1R1Drg$3&c8O+mhiy%Yva`bE!Bv(>I= zCP==11<1AwQmFqN$n}C0F|tRH$&B18NHHTn5o8L_>AM7(%C_wnWSahM=y^yx5i+$C zzs+IDJ#h~WQrvn2feOBnhO5GG3(pM9h6QNLH1{Khyd5C3x$06YMUz{9V72DR^uHT; z4vjHbaJnZy;?hq@(D0^KZNw&O zHHYKj0Byt;g0qK*A`xxGR)T5nl471(Bfjyb4c;;jy+dqkM*P?EWPI-$;F)G4$snUI z1(3sUJcLa1G&Hc(ej{lU!X{?)8+8ks*^B)~Zv|-4#EU?ao!##b&!dr-jDAl#;L}I! z)@ME;u3ohFp+>b+>qYF;!+1}v7pbJ}4&#Ps&+hko*+4-+zvq5Ra?szH zyyJAVID;Sg%R!i@JeZLWtVS0Prh4QfZvy7QjC|CoJ|iEe$t5W<^4A2*%pCdKGLTD^ z8TkZNli|aoL2cx-B*iaco_|N3vfWWW!f+@=o(UAuU8h|ro zZR8)ngGGsbIPz)QU?NOQp<-ypsEM;d#Ho~?P)X%k20QAMEYS0~M@?G}&~b@>!Ws)7 z7y%@Sn`t&!45PP`$;>5x~ zvduB2@8NSmy*6eZI>?*O8<=6M?)M=RT2lK094?8e!eygx0c01N!; z2Ebxj-kW8xSaK}yJzAM0vGV>#78eNprxdWs0)I}rrYlP?nFjezjPo{~0i1PD&ujmg zt^0CXwUq9!Qeafa^O$4lL`a>n)$>h;*J__n2 zkLJdp?{&21@Y`Diy+?24d&HbvnrV_znI;WC(Rgj!ORQc0=kD*1_^Jn<}YO&|f^3je@*z@Ob2WcOS{feYo{#Cvi*+@0q7t`{0 z_&8*&IsY0T$4rpxd~-pSEyy>0Wk7Nz1u{+I&omd}eej1+EEe75I|mJ{qagn$z8?S) z<~w{&Lg)WCBa+bhcd|mI<1XKNWLU27>}9+BO7zXXJ1x;a$XLVg{9y5y0!dg42n;NKB`1IUod*X zTV>Muib3wq@QqX+|1;yt3GMWxG0DJ)%ea3?5CyY zed7%v%He-!WXs6tnno@ELmr{>@yEsqFlf8-*MIrS;UYieYkPe8`+VOUY&mSdJJlcX zwL`WkiXQTj_msm9_^tw?9QGI^%3;4@q(FH7;QIwsSPtX4GF^I}V`R1kf zIt=c5>B%-|so5jQKt^sAWRO7?{6vtU9Mii5Inki0yI+tI%=4%qeny@Ur>L}As81r&A;+rLa<=P_2LusX?c{Ukgrq2<>zc7f_^WUNtP z7cthRuolMFD=f^|7KL4G{2r^rHibnE%4f|dp4iCRs}9WaBY*+3m1}HyYJrSGFLpc!3>zHcbo#uOe7B z8e`8PST+}9&m&ki7h`J(_6u*2VA))ZttD7CJYz!yPZyd7f=dLxFfzp2RgZ0<1!CD4 zbZTSUPQ!bKo~6*Jp#2pZ7qs6pYt1C%GtEtSA1oUZTE#L=S|+ieqMqP%8+AO>%tS1B z#0BHtqT<9>jC;45s^Re3*m`Z;`&4^n#N$4gI}#%v9?`~q$~9$Vtu{{AsqpwA>jr%0 zW#r$*_0+v}V%VqZ*}cZwpvyFAlP7C=X2v+wJGEcv$!nL)nO+QQg7nFtx^D{7j~CBu zL9%%9q)W&XAqQ6(Jj#h!L$QZJ%U~KdZ-NVk?Euc>Eh!lDIba@dK|b$G1TG+0##=Cf zNF>4qg#=543yKMr2p3Ex|44)jrW3D3xPZ^9ro#kMnGYH*WBkNb_$9Y=&u~l9g%7v5 z&!tRm>BaB8`Mr+}Y5e>;$YkfWjo0-8^s!gQ8+^*3kRE)nAkG`#Q>SVw&KuuLr)ruj zJbiSkrhY;C>;3VSx&lG6^+7-;3zEYZ4bue~%t(nKxjHR80YOH|QO(HOmO5?xXnhz2 zR7+2uPD|tkf{fMk(bEV&k6#pp`7lS*#xK6Y2AAGugUcPT>Iu8`?2m15buJy3&!M;pc=uG$%9I?xHvyQ_a{Rq)pTPS@QnSGOX>gLF;~yZolA_}u&cJAg3(cd% z>sRvsdaWgY^7!`-+w$KhQ0e-ciGV2iA5goJ{~_s8@;_pkBLCyl&|ZK6(OD87!;k>J z7SEv*YwN1~FA$Y!(wH*M%P=c4O+V-ckLQL71XAk>5T=bU)MulC^SW_-kxr1L%PE}7 z3Yo@;+*ukw-JRsKbTUvS`5c}LD#>wV4`F_hR?f%eD#;h=1JI+Ae7QaWh)VL+`a&Qj z!V}c%fT$#I;+|#F)9Oz0wR#+67hse$l7S>Thc6&dbpf-VNJS29dvkt4qs}ykSUsdq zddTUP2aBz4vOv0N!hvxa8U~U=Zbid|fW?)2jmrV^+5R4jKzP;F=p|P7L+RZ)EMElu z-naz>nI@49%@{Yuz-oZJ#f#tF=YmPqOfqj=;3@ENl8>vSwL-wl^B^VDJQ?qN-AhYM z4!`|^DnX{%9}Pm9Sjwa;EztJQ(lp_wmUil?ptF;gS4K^H+0 z=7}@zkItkX_Y~P7lWyGeG%}fV@j(S+J|TC-XIgb>BXNv%i@;Gbd5^#` zYJWuz#P2~fpVywQ^~{~HP8)3vY&{Q57&Z_rHzy~2g?yz3c?tPm4xc7$B*p4R<%CTn zRvh=$!4S#GkUe4R3c!3;KB4^+h}1-U2Z>SQJ6+;0Bei|WuB*1#c5Nq6G48mGnnlRf zUk99x+@K+3ntk~FYJNXR;z`|vYsdfrulq4TswRR@9KH{@B<;j8nI|a~6UR*ks11+S zX%i>Vai?gTSVY@13Gc*Hh+4us@ia2ouSAX*fDTkS>Zao~5|wj4jLBh0)uW$TCQTY! z3IaAEcTzzcU>@0|@pM3<;FAe9ag;h~0u=jV8L})3^FW_If#`jeRGf^0JWZSE;0h#33ZzYfHi;~KlAnhC|8YhCtS z=a$wf(mu1Lb-JW=x};skgksM&w}h}rIDM?;pRh|p*d?LOB_ZOLP%9F?YD=hfNvL&6 zsB=lE7YS21cvn-7@e9?3U;55RAnp`=7f#c!=4{bdPW=fo+Irc9*Xo)G`KB$TND=8f zv#r{3)nLUj7K^l6WvO+OQR1a6q>Q~a6*=sRcIf~NA}m%dUvjft!In8IS9 z^AdXLJ6pgook5`hgGi@8-65~Xm3V#Ud&un>xY4KY*7s##e(ZQ+(@cx%mJ2lPXAm|^ zUuo=kW|L-j+>eeYr9(e`mR{vs2bwc+pFD};Lq##=m=r@%7a&{@9Ft;}qNq3~#d(Ti zjwi)?u=FcJ;fq37m0s)^NuA$J>YV9x(irbnvWq=s6UFn2Vy2s7wx(WvgScO6A>)A9 z{+R;g6x2(MzL#N9K!(x#cRIOp>MXsQ4PNDRe}Sk?o}zC1GNK;y6!nuYBWe(GD}8`> zei>0Uo}%vkGNOLqDe8f4ikf2uiz1jlxL+SzjGBbw)YL=GQ=;^pomdvXts0v3aENl8M339lKOp=Alnje$DN!(X^&Fj zPIzq|sny@0cX}am{L*)x1@q=BO#3m9ji$C5&|!N@Y49Gs^qrq#g)d?7uwf0z!g+Iq zzS1U5KVnx^9`0L4@^A(B?KroLWZep(Z3mOomWDh%&fC)dA0~j35Y;&G!#APTw~}@fuRsTLIRjTq!ilgIJg3b4B93OTyMMp z8s20!NSfLP2Xi)0FD50&?~@91Xz4_C_m$DsPe5vK+p71 zPMkrZcfa%lMk&G;_>O8{NS%vrQP`q8EMT7nJgxwH1`J!HY4^h*%9+{DM4gQ0cceLE z$4@qA(rnvEb~w}4AzlUIelP^86vtW`+V2$UCL+z)v5f}k8X7n-T4$2dHpdaL3j+Sm z0;+swfkSmS+HE_Z0WuoX;TS$488f(>mo%G=3Tc(F_2^4~H_DOt8Casym9gV44vBkM zRZ{Yo#_)u-)T;>s`cOaf}Gk*=uJ<>|8Doo@IGXT&hR9M zKeF|75C1rmZa>jW=>K8kT-rX73x9O;T)BLzMc1<@-BI9|?blWC&`&`DFL4#Aa*U&t zINb?5Q9gfcO4l{S22lP(C>?2zpexZm@KjOho!rc zf*O|4;ga>bNdfxKUx6s_it1Ww_17ujm*`zUy}k;{OzSmI0s2t=Ml>%=ZC^A<5!)kr zqn2oF^fRC~GLW>{812~9=HXLapO5K6$5Ws3%}?H~0;bbY3#P#d{2A{@ESMg2M45yq zj`EFjfi>T1G!@m-37^ha21WE-knZ!5CTufq8f{I{%%p9`G<%BfLn6sGBQs^2;c%43 z;CIvB7RX%cWv?fK_qOpFY)>D9#$})+N`GI2#y~H@`^j@#z-7kwXWYO7$#XNy-gXFi zwk`fllA-4t^g*vPDCq8&zR;LIgEj$NoB;eo5d_|`fInHlGYVKp0u~Ka9E(OOVEM@a zj2++GynGr1cWt)k-8jVgK^&u?9vE0cXmwbp(bC7&VYx5rnxl(B`zMR`dqnHI)YaX9 z?kreLqLd6;cbEG%<9$`ej_WsPI@9_(5Kj_f?oZyi{}8=Yp*GWaY+LU|>$yt7`+Akr zK}&t75=L7iT0m(g(mJ1H;%_10yG)pDIth5#Ljb07(njGB_+Jx#N(tzoNIQm5S;&RG zu-z$ERG}f1(|J6(n`yGwIZP%7hPxBQ?p;lHBZL?u_co+KM=MQ zV@~AdKjoszu5DD4FaWyF7uP_HX81kiW>8YwT6Zk8|kTGQd+NjJww7ZCK4 zSuoeW{1^Omd6p0TGU-ZKA-Ps2RVnvVe$Hss^m)u}?6^(!&i9caz8xhz8we3ZDS93xpMH0KH*!ed9Q2HI%4>JebN!p#GY-M-GToXV!f2h|0t` zjh?0uxp7;rWA0yI%TQ3zm@ahAN6 zF?+#j2l97rg!Un}0?NpGk>V)e68aoZ4Jyg-L~?T4a^G>=YBXrt*H~1Qdt*!G^!uU# zfsk@)tEcSVC!KJhEtibPM#R81d#1U!hjpnlS=B;KyGGRweP_S<*44pee)OB%B3Usd z!#dL7N_C2T#K;FAQ#0r!hF(yQ+&nddPGEdHmI*qI&nJC5s%@KSLuw-)9#b`Y992g_Zm2@qF|>kt)Pd*p6;n`;~6wW+1jH6wbk=DW*8xbn!Sz zy4@lADMXa1W>*xF?k&*uaud_wn%nP){55#LD!g!>)BYCPuNQjvFzMR=L5sW^)5-0z zIuyCM8bRjy~4xY79BKFxf`YHg7BjNY!8N(9uCg z+JvOTo>C#}(U<-ho--^8UP!w5Zlo(`Y%R~AR&2DjIHRI_rM9z@E@X*AY_e)vE~=Zn z)~Qc@=Vy>vLYSW0!wv?nriR%VR!n(O`Gd3R!a-X?&pueM?PWZ<65?r9_fP}S~fBm>ZyyQh&5K+AXA7s3U~fGQGe z+e=}E0~~L1ro6_NK;~$!mtNQNPF$8CW8Q;3wCq8j(@~3#0T^oXL_3b+w?y$tUOJat z1;edZhAxo4GbaFd?onNV+brNN1ynr*V9^r_vt9Xu67o4W6&K^pdSxj47-K#56&Dr&XWk zP5SNPBq2ZY6f(gPLb_8=XXwz==#4)IXq)Su6orl$Z(Hcj4-0bT*NrlAx;cnM(Bc0j z^xTd0a>Do=?n(yUQC)$5SU_gJkX8)@uxO;h(!zKjxTg`fgpt@KjKuF1MiN&=;=IH7 ze$Q8tR$n5F<6%g882cR0b;-F9^Aut@LjIL7W;$a2r7+S1PuA;G1>mWgMF`_;)fEU> zK$QX(U7!Fvf`3%3KLq16Vw4CHr$mrgT@keCt4NY}@Sf~>15SdzMDSh(TYB*ROvjos z2fh5B9J+BBM!JZn{}~Y%dWv}dI3kWSd0#pX`xj4HdK}Gqt@jC}@B9{m7}%t`0$;O$ zZz!PZMgWU`tS~#^%M|}6v`iyz2{^G!z=_`#aEpEsiKAB)i9EwyeW_L7+4Gx~Un=S^ zfGs^_k2ntVo+in0AGO#^$Sz07@l$7wr-&Q=84)*oium3?BjS*!h#&qlA|@>H^2Lw; z84<0XBJTKSMEulK#9jZ4hz~qP+~bJoPG-zPo~NhRzT*lx&V;`IxB|X-O4IY9*2~%( z>pM4K!xQ+m>Iyt#0k0}x(Yp$;XY&vx<9skqBSx9c#3{3xSY5N(qOT%JE8UaW>d~+0 z*}c;J#p9zVR;}016rk@sX*tH%f2`nvVHPk}0gI+6zZ(Jl8|NAChqF zfwt%PsuZ^`0KedZU+h7@;w0@ax!MIT;=_fPd(c;Bi*RlGid@@@{HZ>eapXy&-u=epq28Lr-H6E1Rf zR=VKDE_eyU+A0zKW5MJn2ycKOe*R&UCgGW4KaxOR8xI%IOW(QhTq`_N>_;0)xXZ!m z%w`II4}m($xp%59kB>S}wI5M9BZx4$U;4F~t8uF$(5l+81I4E4D+*hF831F)^_!Mo z&A`r0i*{LEKj4-%>^V*wvqKn5H{uSMAk zSUwzpv19+HMFm#ZR0}9kKpAligF_dcX?2}v0ZkSVSAcU{0{0X7wH}G{1L}tfMeBf^D9@q2vpMk8| zB6D{PZ^HdxuMRqe`;l~5H(Ti@E-f2LcU;M74>KJ-Yv=fnjwoLd{vJCzHo2dYBAp+* zbXt{MD@KPMfHQ!MLb~(FVDfRiHHc1w=qdU106Y0}naZD{Ro3jgF>^CYC%tSdf^I7= z1@b+y0vkAoh)xD=QzF;c zy}|sFC-ZD(w&vd#9Pd+M_*g`w76y_&?c5X}uxa~`X_`HO$O}{gu!h6cSdrJRz`K)c z(zwp6k-xB;O3B~cO>N}GHns5*FPZ$C$*GhZy(l+%HE#B5+~U>vRj|mY%Sl$(HZM_$N_!nj#=OV;_x@~7EC?oOtcP~Jz+ z$EJFCzgOb}pLk@#Ltc#!Uz1`3eJ@?qJ$fy`RCUiim_kpFz{y=`pPp>Av|gaM>25L7 z8uV;keZR>wS%J0+#H7yX1rv_|b{`zcFjnh7*Hyn}0jVj802+)6(eE8u_G zVDUIwGr6^(l%BU`aKeus23w|i{b;Ml3dqAB-Zx}UwDGNI$bQv7?|3NeVICc(0Zvh3> z8~7MZ->S?s>0M;;52w->16h{*qBe_~B3FWRYn6XpLw>QN7LxGvJ6-YB5jgex^i3}Q zB^gmjrsdEjWX>hIsv{(-P8mskml8P>F?2al*s~QMgG+S+>75N2q4A~Yt?0_(H-2<2 z(v#L++#R=H$>%3Tjxo@YB^}b^3yijDcH>Q9k;ThA=e{ z4Lv(I44UN^Vc0~9rx;@#GrjrfR&=y`tmX=1{}d*gp^&;$E9PmI7D{UW8j zk$H+>ud#{<_=j6k2%uEcP94S%TG2z`k}H(?E=Nw|D?54sU4E2^qj*|?o;(*X;tB%a zM48WqPT&6vAoR>P{~nD9WM8nZ5zYM6AMKH4jMyw!L1Slqrivn13`N_EO%D_z`M)R8?4ICiT+knMs$hF<}z6iW=$p&Ky6m z97cKm;pdakz-q_bO_ZC6lHbVp%mcOb=I2#=U|>1)23>vdF_?ahTMS-JwiHo6 zzwywRKhvbK3ejdFqAjwFpGQT*k?xa9TG2)SWL6RcMSC!IW-l5`>{n7hWtfD4dqy=< z4?W12L#w~4WVh+`jGH75%_5O9Y8}zi(|STHqGwU#JJiTwX3N-o>7Gm728y36;j?+~ zM^CBc(0q}s=6skkl4lJ)iY7m|#6l)~hlDJrMs_?yTp2RWYP907R9GV&RYRm3iIm^C z1}JaR05Ki$=+OdVhRHbHde)#v)I=`-z!T5p5r=qwvrWbyxg^q~Wbzwc19UL5VIzJ+ z+Fqv~ep8C5L`(mZ)KAZLN!g~@su900gu0j ze}0tChvb*qP;D#&i%Bva$*_UKB$mZKq*i{Tl{+U+OS5ta9ksINDZIg_;}Pkn4iUoL z6K>-1TiuGMks9f+M8?fFj(CLqM~49-$z}d9-!H&G=NdA6&S2)6Iny9II!}-_fOBAK zrcQ?kE@C!j`VUA9ofSAeYMU`?DY=182wYi4yDJ&6jO89uMJEKpPQP6w0nNXbe}4ts z_!{sH40BqJx}Gd$=26!WNEduE)!4<8rqE@!<9N6CE9p{O8UP^0&mjwiS;HSz$nT%i z$LN1z|CK`q=-H_9zC8RI|6DX-aw^coy@A1+(SK&2S$!&U@Q0tW_y_wl>4Wf|Irw`; z)Tsk8``MJ!`(XE|>lHcF-g~rGkyC`0KBoe}uLkAlMt_H`pJMA#kwa|#ha~l8IYP0` z9O6z%E-tO_7HlI(vhlH4PlhB8EBtA{rdFnLo9w~=>db8Wwb*>zc+c3 zO9Id_suxanB;+Y0nLj@x$xUM+-E@39&Q`{eDJYc4^cXkP4^!~-fgDms$^MgjsD5(O zghKuFp%QX(kH61Ub}TLqoIIH1NFWN5QHXvD2fMmxstcKH3xq<8yciUeR!ly{5jQ{| z*s~<}oAX%bDUM7ZO2^a@S~1G)z@F88R>4W9j?jy9mg_5r2s*6?dWq~bM_L7w+w$OP zODPe~aI7SBW@4+3X;I8cJL_v(bqL@g6g)6VRz+)1n7a+ZvduaGei zWfisI=AqjdO*<<&ACeq!cA=({k8{QD!xx%;B5+H(wsR5FkK znTLbC^S;}JsY<>5o3<#XvU%E?R-uk%YZ_s?_%A(e(@ghRywlaCEhQcfP3KC>9xMRI z-+X$zJT0ZWN#?Qt^l0)D){XIaOlyywgeO&+Z#)=NE%36^W4ZLMNi|O=3yiel0 zvxax0(0Jr2-3|J}m#1?*1a+?|ZNc#rpJtRN)xS?;sslWt@THs5Wv9&)PuU(+-Dyfy z=UryfmH_WE^Y0| zZprT6#Py&`i@T>$9*k*CUJ2rzp=qq$8e-a1P3QWzE-jw9lorEuBfk6s~WX8L3nj?p-#lUhC5%h~3?8 zq!m+QOg|s6G+Cb>J5FL;o_67FF<74-9`cZ7QCpuL^WuNsGal*e?JN&MYarIAryIJL zVQEQc$+SNI<1EJ$|8W+4@uka|w?kY%fmBR_pW2(s1M8jb8RxCRm?_*6V0m_@MVA52G;?EH>-&7?d6|Ee`9`%Q#5;)JsJ- z8@)tY>a0&M8jo;yugOc8rO5j9qS3Xq^D9HU*q0UuQ)|nn=%(etrL zd~3+{Y8vZ809GWUveqm|*%R{rllvrkYR3)KTg2=P~uqoJ4(M?=k_T7p5{7Hf=z zf^`-@X$aR|WK#kT*40IXuc;NE_>L3gHnkEzY=GRR*7~pz0BH?2+a1B$SW}pIAQesr zfNwDXs0l?Pt;C|xws5$a#-Y$)b91;h7z?`?#K@YKcr3KuAygw(Z1E@@W($c0*EF+p zRBwG#bErmHiYEB5i7dbf$RO!;nWPl9MZ&d?Oe7k`rG`0`T%t&|E85uNFtvpvY>U%k zd&v?JZYG~8Y)zcpPwwccX`H?Qu^^I}@ko=jQyP-dF&;8{xuLecAr=Wy@Xueq@C$K~53~X=!VL`j!?>0N@z4hyo+>fvKCr$~H-H^dKI}@Q4}*%?HxlOUw~U zl`U2tK_19pOOk|ER0EZO(2wsEL%6(*s}0>~(nGszj1$aVMnpHV>W#LoyU*Qi+@fzc zzUO-{=cb|s#{Ns+yZreZzw_hvUz^R}ZT~I*|2uQ^ALZPhWB;tH@k@$&3Mhc*A>u_hy=}##e1K8@Cxv zPZ>iB(Q)U7z36y6^HF1I%$T~@Xn4;EZ8c8YYp(n39`oKMPtTfT^xk!H$;P?s&NF|! z?Uze5UxuFfROY_jt9;{fj5tQIYxCCgRxDa_?*GhLdv?5IoAIP(7S?qbCvLshxCrAr z$5*Z!&E|Xe8e?`DcWgGd{_;DVJ&cuNrR|=4{fqZnn`UX2fStHNG;tv1raWR~u7r zGb(4}om^ln+10-4^{*OzX8-L5bM<9L|Jb?j8&$pn-I(>L*|f)qnDy`PM$D?$8;|&^ zjlCPIjfZ^;je9m$w=G$X~zkeq`+TZH9-r54^nPmh2S5Gb+4bh|MHr3I>s4c2wb5(#HG9k=qxW88 zZQ-g(b1uBc_c{Q-VjEi~TDFn2xMe$5NUfcK0+TPc|Fq9SAM zd%lt(#!}xH-8VM(H+zf$vDb`qVyn!CNpp<3yEobW5ZT+k@+`cUCj8g&o@CIv$As)l67=phGD#N@uLXQ<^5kZ`k4N+8mBdY zuFWib(>L)1-FXCjk7}W^>_5XLYPHPTdO9-!N%szgGc&5~+up&VGepS~aP`=(o%0zn6?V z3v)m31hC`(4+uJqWu5LTIKh0&SYLR9ub3p4nOnt*sSuWk?t-vq``VUelV#UMX(X@o zeRWbpk@+|J&!{(VbGUv;T;}(3Fc)GCd)hnjpK<=y_Kt=<7B*;WJ8D_GF<|Q|<5qq4 z5aXBTd*+4aoo@-}u3wu3!B%3gT`vVHU48Q6cIZ-gxl_U*QS#|H2`=zia${ zlR4Y`k-6tb_zN|2F8b!~Nkt82(O2i3eVKVupdo(Y)BB9`pEAbO8|PIUKi9X`?b&9| z*<O3)uW{?9y=FmU-29&#HZL~+U|#dXMW1|kmeI=`xIQ|!u5!+- zMMaa0-V0ZogBqThW7O|8MpnNTU$y)C9TjHI$JZDoj~b6?w?WmwMy3{$BHLRYHO}?T)XhKb-fhHo;pZ=~L3XV&drW=d z={N3PL?+(5x%$Q`s=huf0rc_t*LKq^?zfOs7!AIB{8|8j{K9*7?_OlYu%bM+$QS^P zM$Yz|Z&(#=SYXsPP(SHrH-}`*mT9HQ8pYk_3_qPEwnb&8pEPqL)*ie=I9!&Cfd=B-c_}RHEfY$VeGxy;xQ#6ss(FnLv1nHIFV@HQq;7C+qBx|a5PjS``;Sb zi-Me#VCk>H79YEp#!w4>GzFWJ;2P|%$ex;*Qqvl5;U3Un zNmb2?@+z&NsSfn<*0x{-2GgzzKX%j9Tvroq4#%9Ww`=zkTHh4Y8nI6fMWQv~cuZ>v zMH)gibxjeq#nM{IN6Km*j8?ayHQ3TrThkm4*3~oyTkD!bT3u_jCK8Hrq1s&WJ)oP-R=tLW~ zQsn0->x?%;oZ8MK7+N$~QxE%^H$YfjIF8*iEL)55h2V@}YXcn9+|<$(s|m))~Q)T~^xXvxyEm(U2}t&vaz?H#eJUmuGEYiQp`&WBnn%A7Fu@J2|ZYYk42WlJk7 zYtE>sEO!kKmNzxDVK+=+TfDTaykYN-1l*jjnINF1uXV8isfI!UryHt@%nQ64vm^PK_aP zn}ZFo-r4=~g$MD6TCt0zan}c9!Dg}-7d$n%vWg>fIW}5NFoK^>VnZvJ&R>M7P+F$d z)P(EnA)p@D55z9{-qeb;at(=xgY-(8DYg~C7$yL$!_^UFSQklJxHV)uoTi#=dbQSY zO>Gb}MI%?xT*Vbtlj8t2dKx2Q8;eu6scS(%k>ENE13ussKq{sY;=#JmTC{fW`aBdt0u~{Iiex6aLr{yhs zRE^;JnkXhOBFZt0BCX(1=#}dottpBmXo@ujo14CZiH0c2rKsEUm~temiKeB<22T1d zArzM-OF2cOjqzArcpVZ1vkceb)<`lyX*UXb!IlHd}*oWd>cC*TjMiY-2DI z32vy7B8Z6A<4RLQuF7(N=wo)*(1akb#xy4!m7g`^ZTvPKGsZS>e&4^^%23(?| zblI6=6>)g6=AtGH9q2}q#WiXj@;=^*v%!ntk+p~kr7NuwYOQPu*Tpdd;dpAqERJk|a4dQdjnyy8-p0UC zI1y`}X);S`BA~7XTWdpF3zSA`Xz@Y~q7o(PfFe&T9%q^8fxJi@%LE07l0^%)Zm6l- zfGKS!Nb1g`xfy;!28iE8uv&|0HPK?BmNqr#sMF3LuACJ5a6D3r`ao-P5VIDBz&%*s zn_4NM8O0g`Z(>tHHI|QJEQdtmv{KWqCq@&7<76*}a3?kg5#%cb;Vgw$SX6zOOqBtl zs1IAU&0hJ`^j7mY+}gYWCpv09l00x_6pjyBs8qA0tcthN;uos(W49nhOtw|36w~^O zGOP-qsyu2xN7hNzR1#~$apbg}WwggApI=q6bO~25m1xMJP>pQwxI`n~G$)WJDz;n+ zv@p^j(gYv3(PDrtNQ|;LNl{x6^ZoxK?LEM)Dw43>4F?p_IieU442PhiB7z`d2FZ#N zMGQz5P?7`*j*6m)f{Gc(go=tehcRLfm~$Q+a}F~qBZgbm{eAlsAFThs_qqK%`<%Vr zU8}mfI`>+uS8`73tj1fv2aOg5N~a!W;fJeEBC znK*Uw=u#MjA89#=Hg(vH!Tz?K;a*ux-aFdr3`m0zJ8xXd92<68uUy?(_<%TfdfwFZ z+jnrk?j8Gf>CEoU=NR6#_p`B?MLuP;S1!v>kIv0sWt@%Fxx6)fod$Oq*rUI7Si`1{ z!gNChYshYt^JJ&Ds-+`S?_vc!4WB#p?A5PJY-5>;sVDIYXM^}$d{e{e(Wjwg*G>oa z?`e(KOlwAL3}ja`tS?AT$O9jrI+)ANVV2>c2Oc>#NnxGa+N=pacn#%#lI6QiL9API zjn;;l&EAja@okDB)xz8w_%AVjHz-HT(qiqb^*QSf>9HfzkiNa0 zWqxQe&H`3DYLof8HHsKmN*{2jS zr8ZQxR)zh#U5>DbJ=1c_G}(r+Hp)#y(=@mlK6>i-qf@J3ZBlNFCrufjX84o6t88aY z(u8TL!JITQSFJQT@WG@k>ucJNjsguU|eehr#qwZ{p&aHvB-s4kY#00_eZ2WL@ z)^O`XJqgyOx7pc@MH8CNvM~iZMmv3&9bwU-y4%Y0=TaKZp)bhw!4o}nvUdjVX&Y1I z^6N3BYcdv7>cjhXJa}-&zP5p{7Zw|_n3wZx$4ju;9NPqrP6wxU(-m{}z>;7i_3TfN zC$C`mXvvC%371RN>a%5^wfJnrbIL{sGR4WGCv#BA`Zw$La#E()=&Nw_>f*!qaycy*^YY}%tBN-c zxuNtH#=jw_(5a<4TI|l;1!<%YCyktLY9>#%;$hRF>Vcf~tJW-=d(wm=UDwLB+>A^M z0X~V|_mKWw`dM`^SCp&I+^yz*c z{*AXj*&>)S!;MJGGS*(^Hrcw5QDbuZ=nW8N0;ylj9gY9BYB$cSw|h7bJ5oQ`qj#57 zYkbmQ?L4dEzQW|q+GHQerCjUMv45w&_A>S~hIBR6jd5r#edWqaaGMlUYLPGv!3@`X zXbiP{TAxdXXW6vTHh8tsQfYYVF6;te9tsV{@?z?<#*MV)n2F}1a`TtV;)vv`)T)j2 znSy!HdR-d^nu{zuJmqO-;46}8rsE0luddKagh!dW^|9uC>p3QlwK7y5X6L4BL>c&c zOlmZbnritoVoYibEDe(_+fagRu0(4`DYI=Deyz5SmSanW+4|DdzWT&D4KMPXBo>e~I>;HG zR;GP+U{?yEMkWb<$J=naEtOX2uDSM%<8%qU-DEw8nteA0FxugvuC+ws7Doovk<)yz({RRzzW zGQdJ6`SZ1lSca5j}<|$OTIdtmp5Qq9wL}lw&kJu z@vdr`*PlE|v;NllmXriGsHyULl&QIe(H4cbkz9L3CzUH(9F1Fsqkh?V=xCcTTbD4@ zx>d7)BbnCitk$A;9oW6&LH*L&aIzV7Dz$@Nbo|Ohj-zCC&)1DTlRNk5TRn2N8^L^T zkX$(aNWXa~<++_}3r99*OOtFanpqn&eTL0nOdNwcPRi0SzqJ`@-DjKpuWkOfi;XnW z+E#fyX>Gb+n#$eBn2FUXYvc0-TWBj+j$ERw*-UMS`C#IN$=0~qGDgYs(rTeE*QZ3K zI@_~jzy566(FdS}`3NizTdjGVIKyWhp3Y%ja4qfGW7XN6`rDMn>DRP=%r#tJ5wnt! zm!f<&lCK1!?4VXyS+wCXvH%0R>Uo1-WVD|{TO0McbIVt!(umIc;@lOdLTO9?em@|m z6q81!O2qM_BRbPb0cd5 z{nUM@POa3Vf0w=;`*+DX?*qo%cG$wM4=~KVc?^`+4ZM|H_3DfzHn+y!uUHz&bKZQ> zHMcNnDQ@hf66gGBor+hauu^ZuZt_G+{FEb0HiGabA2YR7SFIq^*XTV{S8dk$?AZnu zxdXIpN!?*$0 zT0ZLCzk9kGm?yH;ml%8=kfuqVA}h0FhmNtE=aP5eD=YJ91 z;l(RjHa)MkTOCT*I!(l{pbj2um))kCYwePsUEA@yAX1_AyB_H6G|)X}>KI!L_L(-y zVd#Bx>GSSj++-W|df#N1c&tpN?#YLpt6hK^Jb1jXWV&o>ApO8E`VRBqgWnNbUSHwm zNgLy)<&50Orm;_X#WJL4dzi1%CY`pD zW9QjoWKv-Mx2D^B6Thai>LnAj)q^KZu(r<%NLr+~OB>cQ;0}en?BuPOm#vZXT=nQO zM-mID4eRqlhYw2NX)em71bG&jJ(e_#%yVyVneR*Iae=hlJoy~WiVQAy9oVJ+!M*zW zxZm`RwS_;rArB}03T3#K;DhM$NZL>FO9GR|Omz39i%n^2p1$QZ{+-KB?a1-Aa^nTY z%7u-eeM004QkBn5ZECsgs@v#1{7U1Z>g$?5PO@TMo`hMd$E8-DIpYR<)>JP9q}f>Y zg{TpEK{Wl{IsI)DZx?B212@a;)Z<#UxBEiMYh~qI1N;VTkHIUKmw3xe^Vcysv-2XH z-y~vl1e>?p1lmN?g_Y{sku6M9XS-mQueqC;k2c1RwX0N?s(gtoH6F0Wy_&pZ`qB)< zuL)UGpGR4CZXSSGQA>@dmA)zFt<;a>G}rGJy8U9ofxYY=p?tw0U1~44@}0YM?RZen z{%*Am`{)W@b2RGx9#(hbn6505@5DhlPsy-m%d4Hu+I{Yo8nrZXNNrZ?F!EqLxuAMX zkg_q@Fl?%|b-2)F!zpjir?SVkRYAY-m?N;!eCqo=4b>Hk>*AITc2B~wd0`Y2W)p;$ zz2;i-#@dB`TfDbb?=(8_Njk3NPPQ=wE)}IY5{7Y}d%O#r|0a(Kotu& zUUSndVq&V9z7%FTKQ#5b>GE8<;+0&^<}w#bn|+S-v5XDuxagefLF(mF)l1ht?5?M1 zWT{)HPP~E@8q@35Xtdti zbr#qS==F?mj^7&Nzq3~OzEfbG@trrMyBweY+XTP0u>WK6{W%xxSXpm&&2E*q**%Ok z>Q>h4SXrmXx;6XfZ~L#C;=UB}E&YFz?^?N_#>gb>c0Y*U(-U-^E30aDuB_v6zYe}V z{(IbC;Je?fU)r~_-h2~oFsH)Knq8|$WrvzyR91DYY+#Y>TUp0-H*h%%Tl=3BclJpu zaC?}jRO(z=uc!Y5d&ZtcaNTFu+_$p9Srz+MR-IXE-^%9mYj><{HD|4kmF;J*-Psag zHwf3QY~QJ}RmaNaCS$U8jz!zib$Z4S*O(9zTO1h$NgvLoLRF=WrO(@ z9V@Hm)G}SOYj>_}Rk4?Ovw5eKnyj|#x;4M8Y~D2x&%+hab+vu>^v$Vh$)8#;FkRE3>r8u?$J26_ z`|M2j+5B3aE1S=8pUqyYTjh|7_7!z2TXm{zZpjR;s8>4FS?HX}e|s2ll~A?HQK{r&Yl^?>gdG16$b0-AhsNI;Oyh6AZ9eh7{IC3% z=M%KEFCNp*1o+SMPZh=4s(g-%cCpWz&R>eo@TT>k5dRoI_4uRp{$2BL?5_C)wkbG0 z$@07Z?{A+q`EM5dR}T@o|NJZCXa0>d=JBK1wr@EMNu6P-besH8MFIRDZU5I4|AIL= zh4t)#PY)iyHy;}ROk?zgeJzK2d*`pyk1C_|MP;WNT~qvv=4Hv-F3RV7{GJsW{~Tkg z)6bZ@#Q&B`@4^0jw7TrY_QRUaAAU)S`| zzuwrI;(z!3eBO}!ul!eK7uzpuioex~Ieyk(kADOEX#5WuQ=NuNyMN$+ZTwnLfAX)T zlGo2Q#lHmcSD_>F`0Lw88E8%$%J5Ryfz=-`GAH zzq{FWQqI1naL70L|4Oujz-3!$$LIFLn$GWEKTDt);pwZL{{zl13*gHMIA1yAC9iG3 znN;)AES@jrpXulMe)5|9w*vnA0*c*#4ei78+5UK$k|L5+&%%UYeKA-L*J!&d=-oI= zF7!fUVN3fQY#)u^o(o=M{9m-q=P#D_TjRIW*BD%`R_VvT*7RdVITu&`wPKByxP6id zcAB@PHG`hUQ02+3Ve*^fn0eC-e5`P9o?H*hFXx%LU#wm3=c%VF^!U8V1G(?W=6Z%W zw7~K-Dt)g}nwY4)1R4MRU&U&@o^3y1-1RJgT$;Pu_gVJwbPWV&yz{|(gEN26wc}(D z3Ri4~EBx8`HH38SqkO8Z(f@HF=|=3{ZUhj!AQXOq0yk9b*s-+_F4`|p8vdNbjA zJRKgW=TH0Y@iIOWO2J=0>*-nw{aa^T+T6J7>5gOSZwmPzAkXHo1vn#2b7?zwcj%ce zdb)u#AF2Nk@a7^v8v3gcVVc95%(37@?ETgr(tOnZ`*6YS@0@70AAD`Z)B7^A48xMr zWl6qnxm?x5c{frX_5L#O2f;ZWN^^Sq?Zu?0Hr-JEzdZ4Z^7}NIFW*A`F0r$Q6?nJ* zHsSTbZxX&W_!8mnC)d+Kct_*zhlyVCEnJ=dm3l+I3dgi_Fu0E|JdjTWUzl;3ADehZ z*`Ji34f(kue-Zd8!mk5w1e&bK zi!(0E_l5idGEQLeleDmB{#QB+yf?VFJ02EO-Y0MtDDU4ZQt#m3 zs>44`-qX7t5YziEIO`AjXNgyoMvMF}kXK&UPIUduZ|d1B@w%m1(9_EDgQ22q4N3lA zQL0=O;HV;vfLH&iB8^Pf#8DXJr;0R^6KIDOC1i^HR8iVYNItAcBbwEJswnrG)xT|R zexQ%5X{pq@fbUVjyBOb~^wVGTGynH5kUy$`A6LNV7Vw1yd`SVnyMRApd;=>d40f2p z>jm>@N*0J;sSne0e`%Jzf{0K zFW@T*_}^?HV@-bEynweT;JX#@ZUua30iRO9PbuIF3izS|eq8~7xPZS>!2eyqKQG{a z7Vvd#oU|tYH!a}17VvHbd`JO5wt$~rz!w(qn+o_p3-~hy{QUy{c>%9w4e6Tv)}Vkl zF5vA7c&7q>NC6*Jz^4}QnFajp0)9gQf2e@JQNVvJ;A`2$dQJYUD&RX8@XiJN@B%)( zfX^u4=N0g43iv(7H?WbySoB-g-K4OrK>pY`0a16b=IK0G_V(*e^p0^dDWoXBY4V1$=P{o2^XJWUgKT4 z`JoiQ4ae@5Pxm;buaj5ZR>kk@)td}gzj-Cz$x?lPx^9rb`;4pa@-06kRDIGaH`c7S z*#z#2DL+aSBc9A#;nE#Gs~qG@r@T|n?$@)Y*eQVfZ_38;ejK~6DL?3k)9^5CejcM` z>(;H>x2KBgyKPs$?UDIncfR^bySC+n0JxXT@2Qo2H&%a~Z}mHi?fxX5mlcI)6my>9 zE?#>Af7LA)vWej_g8Zx(ZZOTt%6D^xtqd#y>1N}R6E`_r7dWBD*Sk5|2gJ5jsW zYjsNhm-kEgzdnANeUhI*$~$_*y>nK7P>7Ffc)@A23rkymGAcZlV)>1ymHbxkn3z8?knY7SZ;E6}%THP(o4k^ie=pyno^KR29a$>+I^X_g zw;J-niS*oQqWLC8JBv5w`5l(kN48rL9@Hs6l)3sH-+0u*PWykgTMkkIy|_^i(4QoA zf zBZm3mJ--7{^4P0cdIr3FzHe9IQO8HnSrkkNH?fy@AxN^k-!f-n!OiY=a``!o>RaHA z+MO_~K4FsX*|b9I-B5na4y7X9HH%2tapXrW(o@N~b|t_0L&`|I)y!mMZk{Fm@&sYo z=lLFJ&(?IVt1o}CyHcy4e$KJ^&AiyPD%?Vir&X$5>)Vf%kGy}#TL`$0R2}`s_iA59 z=%pmxKx%1(A?~33M1kFqzp9G39mA>(P;Lt8C`*YxTq+*O^68<*HSVh-Px1QMNjYxs zM|I{-b^deC%D9z_P}w9ZXB!on_xRvZzMtHI`G%cB`KDaYH%ngePJydGg%xzWS6o3J ztoeg!>5&ZEanbKQ%MV(*9aiOR`zRCSt;qH;!7BTZK&QFMrM!_x9S*Ha^0wH<*mnpp6crTf8HUIDO~N@Wo#Pec40V)$D+ms$cs6Nckwb?0F4bZRn^EUYbivaVJ3oc~)0N8eKQ;$5-o*u%(ElJKE%NprB zNyVRhO2x||{@>@a4IEmqWt9}jN8p%OD9CYHt9<{O@(wtUoO*f*=N!=QNAo~=@_%Gp z=KXPeQ{V^N_uv1@;aPB-c9zrV=tXeXKhQpu|FnSfI-AP-b!`vI_buRu2kvQPykiRZ zap1JSRf?@tnib@u{TCJRI|KLp?Fl{i2YzU<=aInu)-T%mTHsOs?Z6KY^2@<(`J?2Q z+Gp6u!%xC_h3tPp&mfayyng-Kga3>1HV8b%TLsQ|)5-Q{XW@)@x1cA+yMN#@UccV$ z!T-g02ZA$REMt|963%#!33_6@e!bg+|BLa?4LruX0G#piK9j42Gv4cio*3@~fya24 z1|H*mM)Y?~R+mce3TM0@1wAp|{{$Z6T@iSUmrFuSFWZ3)u~bCPcsB!gbur!@0*~?X zenFRy@wONJqmbVHgfregL4S<*=)hxpH8t?qKJZxqx914^uwI-O_=LH`1oEx}*?d(b{Tmhhrq|!@6b4+1);QyRF>u#2-##AR4?L#po4|*f9QEvH*B?E2oYDS1 zfk!(>gVRpl|1~YhM>|gs@~)@7M`q#NAn*6C)1HNa$8_Bl`1l~dEby4#R|Ajj(%ax} z|AzMAb7@}&?)@y=pOrz6+ta~59%|!)i~B9MOB)0pI@KFrt(%y%{m-2Fp&zuxV^^-Q-9<(q-~{KCsQ+mjuFypP!_ zzmv%CgYo(W+|C!({hb$+49o&PbE0&YTMV|HjnF9G2 zM4t1#*MhwJljF>{1CQ~3AbKj{pHB+pe+oS6Um<)wPo#x)-2oOny(id*{@Ez-69aD; zxa;p=9}iW+_sqD|7To`NdDsm0cNdOksdPZl6WiOFfqT50L;uMIe6H{jkiStl$9uO6 zXZ!5e>pi%CX4!}Sc{FghXRLiZJQes!c1-!_10NRnTY_zdG=v1HV4-sNb*qdvN=m zGhZGL{8Z!A|3TnU&v${x{`5C+cb}KT-YAE)P!Y&k4%Y#9dty0UKkyiD6XECCc^=vX zezYCa{=EW^h(T{}FhscZ&jd`)Aq5!_9%8ZO2USU4cjaF9q&(l=9zz zdwSh>L+s<>mmq(R9aFxdGW}exccnF34pU(>R)D8TCz&8y%>e&UHc20vmy9fCTgPy|!kNzJT_(ehf=)hyVGXozJCxX@o=*61sRtX2L2CY)PGgr;{(4p@R+Wrh5MYr!*_vSV#n0~-@tu5PyT1%mj=E8 zo}2Rgy)5vmz%LKHb>MC%+og7a$9mBv@aWH;fyZ*y7u?HLEa%e#_a>R;>V%*tmaFpu zkN&(W@MzDHpx@)I;|{TKYmkq2z9sTYQT{(HkWYy*eXjNf`!HYD^~fwJ-ym?ezkial z=avJ%(HQl#4?L!8eBjak$>6NN3t|7?1NX00J~*;4C-CV1GlgFRJ&VCTT`^y73_RL- zZ{RoCIZW5Xfk*l013x^-zYfmw!|N8G1s?7HHt30V{uX!~f7U|5^K=aj@oo(6@%nFk zzP4eIKPSjH4&1+Xf!}rvJf?TAz~j8KTi{X85rKR8S!^E<#~1K9fya0+4?LEiw*q(l zJ(KoQ>7&4-{AYpRY_iPX?*ex{v!Le};Vl2_Zj=Sw$1&b|;O>9tL+s;W;~;;F9W&m> zLEg*5webHg!eK^f_n;@1lO93di%fUamqCHY@;0nM&xwKG8tl9}@Y@2vK5$R3x9J}4 z4BSl_o2aeV7VsCrSzngI{(lD^?f)|9iGKJ#a91%J@z%uivCOaY!8ZbDy#BnahvtFD zcy|qYV!WM2{t4vcK;g{Cp#^$I1s?4`JMfqHZwhG+iU6fBR?Gp5OzBI@6)E*Zs8xoSsoS#JyHJ+fk*uh1wC&6T-g6g;L-lKgPy4W!@#5dPXdqS z;j5tE<6Vk){}*_Scm2&g)p@KJiJKBp8o|N?f)zAm|t5p^xV(oC$?`L0*~!m*T7xR zl61CRe-AwBnH_l4GcR!0<8v(!=Yg|)Ho$f3>jIB{xFzU`{=6&5yFYtF&ohBXJuemL zc_YZDe21Pd1CM%sDA4mu;LⅇW^lvW@GeQhrpxXx(4og{5KCrfUj%cyC#zV%oKU% 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 +#endif +#ifdef HAVE_GRP_H +#include +#endif +#if APR_HAVE_UNISTD_H +#include +#endif + +#ifdef AP_MPM_WANT_RECLAIM_CHILD_PROCESSES + +typedef enum {DO_NOTHING, SEND_SIGTERM, SEND_SIGKILL, GIVEUP} action_t; + +typedef struct extra_process_t { + struct extra_process_t *next; + pid_t pid; +} extra_process_t; + +static extra_process_t *extras; + +void ap_register_extra_mpm_process(pid_t pid) +{ + extra_process_t *p = (extra_process_t *)malloc(sizeof(extra_process_t)); + + p->next = extras; + p->pid = pid; + extras = p; +} + +int ap_unregister_extra_mpm_process(pid_t pid) +{ + extra_process_t *cur = extras; + extra_process_t *prev = NULL; + + while (cur && cur->pid != pid) { + prev = cur; + cur = cur->next; + } + + if (cur) { + if (prev) { + prev->next = cur->next; + } + else { + extras = cur->next; + } + free(cur); + return 1; /* found */ + } + else { + /* we don't know about any such process */ + return 0; + } +} + +static int reclaim_one_pid(pid_t pid, action_t action) +{ + apr_proc_t proc; + apr_status_t waitret; + + /* Ensure pid sanity. */ + if (pid < 1) { + return 1; + } + + proc.pid = pid; + waitret = apr_proc_wait(&proc, NULL, NULL, APR_NOWAIT); + if (waitret != APR_CHILD_NOTDONE) { + return 1; + } + + switch(action) { + case DO_NOTHING: + break; + + case SEND_SIGTERM: + /* ok, now it's being annoying */ + ap_log_error(APLOG_MARK, APLOG_WARNING, + 0, ap_server_conf, + "child process %" APR_PID_T_FMT + " still did not exit, " + "sending a SIGTERM", + pid); + kill(pid, SIGTERM); + break; + + case SEND_SIGKILL: + ap_log_error(APLOG_MARK, APLOG_ERR, + 0, ap_server_conf, + "child process %" APR_PID_T_FMT + " still did not exit, " + "sending a SIGKILL", + pid); +#ifndef BEOS + kill(pid, SIGKILL); +#else + /* sending a SIGKILL kills the entire team on BeOS, and as + * httpd thread is part of that team it removes any chance + * of ever doing a restart. To counter this I'm changing to + * use a kinder, gentler way of killing a specific thread + * that is just as effective. + */ + kill_thread(pid); +#endif + break; + + case GIVEUP: + /* gave it our best shot, but alas... If this really + * is a child we are trying to kill and it really hasn't + * exited, we will likely fail to bind to the port + * after the restart. + */ + ap_log_error(APLOG_MARK, APLOG_ERR, + 0, ap_server_conf, + "could not make child process %" APR_PID_T_FMT + " exit, " + "attempting to continue anyway", + pid); + break; + } + + return 0; +} + +void ap_reclaim_child_processes(int terminate) +{ + apr_time_t waittime = 1024 * 16; + int i; + extra_process_t *cur_extra; + int not_dead_yet; + int max_daemons; + apr_time_t starttime = apr_time_now(); + /* this table of actions and elapsed times tells what action is taken + * at which elapsed time from starting the reclaim + */ + struct { + action_t action; + apr_time_t action_time; + } action_table[] = { + {DO_NOTHING, 0}, /* dummy entry for iterations where we reap + * children but take no action against + * stragglers + */ + {SEND_SIGTERM, apr_time_from_sec(3)}, + {SEND_SIGTERM, apr_time_from_sec(5)}, + {SEND_SIGTERM, apr_time_from_sec(7)}, + {SEND_SIGKILL, apr_time_from_sec(9)}, + {GIVEUP, apr_time_from_sec(10)} + }; + int cur_action; /* index of action we decided to take this + * iteration + */ + int next_action = 1; /* index of first real action */ + + ap_mpm_query(AP_MPMQ_MAX_DAEMON_USED, &max_daemons); + + do { + apr_sleep(waittime); + /* don't let waittime get longer than 1 second; otherwise, we don't + * react quickly to the last child exiting, and taking action can + * be delayed + */ + waittime = waittime * 4; + if (waittime > apr_time_from_sec(1)) { + waittime = apr_time_from_sec(1); + } + + /* see what action to take, if any */ + if (action_table[next_action].action_time <= apr_time_now() - starttime) { + cur_action = next_action; + ++next_action; + } + else { + cur_action = 0; /* nothing to do */ + } + + /* now see who is done */ + not_dead_yet = 0; + for (i = 0; i < max_daemons; ++i) { + pid_t pid = MPM_CHILD_PID(i); + + if (pid == 0) { + continue; /* not every scoreboard entry is in use */ + } + + if (reclaim_one_pid(pid, action_table[cur_action].action)) { + MPM_NOTE_CHILD_KILLED(i); + } + else { + ++not_dead_yet; + } + } + + cur_extra = extras; + while (cur_extra) { + extra_process_t *next = cur_extra->next; + + if (reclaim_one_pid(cur_extra->pid, action_table[cur_action].action)) { + AP_DEBUG_ASSERT(1 == ap_unregister_extra_mpm_process(cur_extra->pid)); + } + else { + ++not_dead_yet; + } + cur_extra = next; + } + +#if APR_HAS_OTHER_CHILD + apr_proc_other_child_check(); +#endif + + } while (not_dead_yet > 0 && + action_table[cur_action].action != GIVEUP); +} +#endif /* AP_MPM_WANT_RECLAIM_CHILD_PROCESSES */ + +#ifdef AP_MPM_WANT_WAIT_OR_TIMEOUT + +/* number of calls to wait_or_timeout between writable probes */ +#ifndef INTERVAL_OF_WRITABLE_PROBES +#define INTERVAL_OF_WRITABLE_PROBES 10 +#endif +static int wait_or_timeout_counter; + +void ap_wait_or_timeout(apr_exit_why_e *status, int *exitcode, apr_proc_t *ret, + apr_pool_t *p) +{ + apr_status_t rv; + + ++wait_or_timeout_counter; + if (wait_or_timeout_counter == INTERVAL_OF_WRITABLE_PROBES) { + wait_or_timeout_counter = 0; + } + + rv = apr_proc_wait_all_procs(ret, exitcode, status, APR_NOWAIT, p); + if (APR_STATUS_IS_EINTR(rv)) { + ret->pid = -1; + return; + } + + if (APR_STATUS_IS_CHILD_DONE(rv)) { + return; + } + +#ifdef NEED_WAITPID + if ((ret = reap_children(exitcode, status)) > 0) { + return; + } +#endif + + apr_sleep(SCOREBOARD_MAINTENANCE_INTERVAL); + ret->pid = -1; + return; +} +#endif /* AP_MPM_WANT_WAIT_OR_TIMEOUT */ + +#ifdef AP_MPM_WANT_PROCESS_CHILD_STATUS +int ap_process_child_status(apr_proc_t *pid, apr_exit_why_e why, int status) +{ + int signum = status; + const char *sigdesc = apr_signal_description_get(signum); + + /* Child died... if it died due to a fatal error, + * we should simply bail out. The caller needs to + * check for bad rc from us and exit, running any + * appropriate cleanups. + * + * If the child died due to a resource shortage, + * the parent should limit the rate of forking + */ + if (APR_PROC_CHECK_EXIT(why)) { + if (status == APEXIT_CHILDSICK) { + return status; + } + + if (status == APEXIT_CHILDFATAL) { + ap_log_error(APLOG_MARK, APLOG_ALERT, + 0, ap_server_conf, + "Child %" APR_PID_T_FMT + " returned a Fatal error... Apache is exiting!", + pid->pid); + return APEXIT_CHILDFATAL; + } + + return 0; + } + + if (APR_PROC_CHECK_SIGNALED(why)) { + switch (signum) { + case SIGTERM: + case SIGHUP: + case AP_SIG_GRACEFUL: + case SIGKILL: + break; + + default: + if (APR_PROC_CHECK_CORE_DUMP(why)) { + ap_log_error(APLOG_MARK, APLOG_NOTICE, + 0, ap_server_conf, + "child pid %ld exit signal %s (%d), " + "possible coredump in %s", + (long)pid->pid, sigdesc, signum, + ap_coredump_dir); + } + else { + ap_log_error(APLOG_MARK, APLOG_NOTICE, + 0, ap_server_conf, + "child pid %ld exit signal %s (%d)", + (long)pid->pid, sigdesc, signum); + } + } + } + return 0; +} +#endif /* AP_MPM_WANT_PROCESS_CHILD_STATUS */ + +#if defined(TCP_NODELAY) && !defined(MPE) && !defined(TPF) +void ap_sock_disable_nagle(apr_socket_t *s) +{ + /* The Nagle algorithm says that we should delay sending partial + * packets in hopes of getting more data. We don't want to do + * this; we are not telnet. There are bad interactions between + * persistent connections and Nagle's algorithm that have very severe + * performance penalties. (Failing to disable Nagle is not much of a + * problem with simple HTTP.) + * + * In spite of these problems, failure here is not a shooting offense. + */ + apr_status_t status = apr_socket_opt_set(s, APR_TCP_NODELAY, 1); + + if (status != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_WARNING, status, ap_server_conf, + "apr_socket_opt_set: (TCP_NODELAY)"); + } +} +#endif + +#ifdef HAVE_GETPWNAM +AP_DECLARE(uid_t) ap_uname2id(const char *name) +{ + struct passwd *ent; + + if (name[0] == '#') + return (atoi(&name[1])); + + if (!(ent = getpwnam(name))) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "%s: bad user name %s", ap_server_argv0, name); + exit(1); + } + + return (ent->pw_uid); +} +#endif + +#ifdef HAVE_GETGRNAM +AP_DECLARE(gid_t) ap_gname2id(const char *name) +{ + struct group *ent; + + if (name[0] == '#') + return (atoi(&name[1])); + + if (!(ent = getgrnam(name))) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "%s: bad group name %s", ap_server_argv0, name); + exit(1); + } + + return (ent->gr_gid); +} +#endif + +#ifndef HAVE_INITGROUPS +int initgroups(const char *name, gid_t basegid) +{ +#if defined(QNX) || defined(MPE) || defined(BEOS) || defined(_OSD_POSIX) || defined(TPF) || defined(__TANDEM) || defined(OS2) || defined(WIN32) || defined(NETWARE) +/* QNX, MPE and BeOS do not appear to support supplementary groups. */ + return 0; +#else /* ndef QNX */ + gid_t groups[NGROUPS_MAX]; + struct group *g; + int index = 0; + + setgrent(); + + groups[index++] = basegid; + + while (index < NGROUPS_MAX && ((g = getgrent()) != NULL)) { + if (g->gr_gid != basegid) { + char **names; + + for (names = g->gr_mem; *names != NULL; ++names) { + if (!strcmp(*names, name)) + groups[index++] = g->gr_gid; + } + } + } + + endgrent(); + + return setgroups(index, groups); +#endif /* def QNX */ +} +#endif /* def NEED_INITGROUPS */ + +#ifdef AP_MPM_USES_POD + +AP_DECLARE(apr_status_t) ap_mpm_pod_open(apr_pool_t *p, ap_pod_t **pod) +{ + apr_status_t rv; + + *pod = apr_palloc(p, sizeof(**pod)); + rv = apr_file_pipe_create(&((*pod)->pod_in), &((*pod)->pod_out), p); + if (rv != APR_SUCCESS) { + return rv; + } + + apr_file_pipe_timeout_set((*pod)->pod_in, 0); + (*pod)->p = p; + + /* close these before exec. */ + apr_file_unset_inherit((*pod)->pod_in); + apr_file_unset_inherit((*pod)->pod_out); + + return APR_SUCCESS; +} + +AP_DECLARE(apr_status_t) ap_mpm_pod_check(ap_pod_t *pod) +{ + char c; + apr_size_t len = 1; + apr_status_t rv; + + rv = apr_file_read(pod->pod_in, &c, &len); + + if ((rv == APR_SUCCESS) && (len == 1)) { + return APR_SUCCESS; + } + + if (rv != APR_SUCCESS) { + return rv; + } + + return AP_NORESTART; +} + +AP_DECLARE(apr_status_t) ap_mpm_pod_close(ap_pod_t *pod) +{ + apr_status_t rv; + + rv = apr_file_close(pod->pod_out); + if (rv != APR_SUCCESS) { + return rv; + } + + rv = apr_file_close(pod->pod_in); + if (rv != APR_SUCCESS) { + return rv; + } + + return APR_SUCCESS; +} + +static apr_status_t pod_signal_internal(ap_pod_t *pod) +{ + apr_status_t rv; + char char_of_death = '!'; + apr_size_t one = 1; + + rv = apr_file_write(pod->pod_out, &char_of_death, &one); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_WARNING, rv, ap_server_conf, + "write pipe_of_death"); + } + + return rv; +} + +/* This function connects to the server, then immediately closes the connection. + * This permits the MPM to skip the poll when there is only one listening + * socket, because it provides a alternate way to unblock an accept() when + * the pod is used. + */ +static apr_status_t dummy_connection(ap_pod_t *pod) +{ + apr_status_t rv; + apr_socket_t *sock; + apr_pool_t *p; + + /* create a temporary pool for the socket. pconf stays around too long */ + rv = apr_pool_create(&p, pod->p); + if (rv != APR_SUCCESS) { + return rv; + } + + rv = apr_socket_create(&sock, ap_listeners->bind_addr->family, SOCK_STREAM, p); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_WARNING, rv, ap_server_conf, + "get socket to connect to listener"); + return rv; + } + + /* on some platforms (e.g., FreeBSD), the kernel won't accept many + * queued connections before it starts blocking local connects... + * we need to keep from blocking too long and instead return an error, + * because the MPM won't want to hold up a graceful restart for a + * long time + */ + rv = apr_socket_timeout_set(sock, apr_time_from_sec(3)); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_WARNING, rv, ap_server_conf, + "set timeout on socket to connect to listener"); + apr_socket_close(sock); + return rv; + } + + rv = apr_connect(sock, ap_listeners->bind_addr); + if (rv != APR_SUCCESS) { + int log_level = APLOG_WARNING; + + if (APR_STATUS_IS_TIMEUP(rv)) { + /* probably some server processes bailed out already and there + * is nobody around to call accept and clear out the kernel + * connection queue; usually this is not worth logging + */ + log_level = APLOG_DEBUG; + } + + ap_log_error(APLOG_MARK, log_level, rv, ap_server_conf, + "connect to listener on %pI", ap_listeners->bind_addr); + } + + apr_socket_close(sock); + apr_pool_destroy(p); + + return rv; +} + +AP_DECLARE(apr_status_t) ap_mpm_pod_signal(ap_pod_t *pod) +{ + apr_status_t rv; + + rv = pod_signal_internal(pod); + if (rv != APR_SUCCESS) { + return rv; + } + + return dummy_connection(pod); +} + +void ap_mpm_pod_killpg(ap_pod_t *pod, int num) +{ + int i; + apr_status_t rv = APR_SUCCESS; + + /* we don't write anything to the pod here... we assume + * that the would-be reader of the pod has another way to + * see that it is time to die once we wake it up + * + * writing lots of things to the pod at once is very + * problematic... we can fill the kernel pipe buffer and + * be blocked until somebody consumes some bytes or + * we hit a timeout... if we hit a timeout we can't just + * keep trying because maybe we'll never successfully + * write again... but then maybe we'll leave would-be + * readers stranded (a number of them could be tied up for + * a while serving time-consuming requests) + */ + for (i = 0; i < num && rv == APR_SUCCESS; i++) { + rv = dummy_connection(pod); + } +} +#endif /* #ifdef AP_MPM_USES_POD */ + +/* standard mpm configuration handling */ +#ifdef AP_MPM_WANT_SET_PIDFILE +const char *ap_pid_fname = NULL; + +const char *ap_mpm_set_pidfile(cmd_parms *cmd, void *dummy, + const char *arg) +{ + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + if (cmd->server->is_virtual) { + return "PidFile directive not allowed in "; + } + + ap_pid_fname = arg; + return NULL; +} +#endif + +#ifdef AP_MPM_WANT_SET_SCOREBOARD +const char * ap_mpm_set_scoreboard(cmd_parms *cmd, void *dummy, + const char *arg) +{ + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + ap_scoreboard_fname = arg; + return NULL; +} +#endif + +#ifdef AP_MPM_WANT_SET_LOCKFILE +const char *ap_lock_fname = NULL; + +const char *ap_mpm_set_lockfile(cmd_parms *cmd, void *dummy, + const char *arg) +{ + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + ap_lock_fname = arg; + return NULL; +} +#endif + +#ifdef AP_MPM_WANT_SET_MAX_REQUESTS +int ap_max_requests_per_child = 0; + +const char *ap_mpm_set_max_requests(cmd_parms *cmd, void *dummy, + const char *arg) +{ + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + ap_max_requests_per_child = atoi(arg); + + return NULL; +} +#endif + +#ifdef AP_MPM_WANT_SET_COREDUMPDIR +char ap_coredump_dir[MAX_STRING_LEN]; +int ap_coredumpdir_configured; + +const char *ap_mpm_set_coredumpdir(cmd_parms *cmd, void *dummy, + const char *arg) +{ + apr_status_t rv; + apr_finfo_t finfo; + const char *fname; + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + fname = ap_server_root_relative(cmd->pool, arg); + if (!fname) { + return apr_pstrcat(cmd->pool, "Invalid CoreDumpDirectory path ", + arg, NULL); + } + if ((rv = apr_stat(&finfo, fname, APR_FINFO_TYPE, cmd->pool)) != APR_SUCCESS) { + return apr_pstrcat(cmd->pool, "CoreDumpDirectory ", fname, + " does not exist", NULL); + } + if (finfo.filetype != APR_DIR) { + return apr_pstrcat(cmd->pool, "CoreDumpDirectory ", fname, + " is not a directory", NULL); + } + apr_cpystrn(ap_coredump_dir, fname, sizeof(ap_coredump_dir)); + ap_coredumpdir_configured = 1; + return NULL; +} +#endif + +#ifdef AP_MPM_WANT_SET_ACCEPT_LOCK_MECH +apr_lockmech_e ap_accept_lock_mech = APR_LOCK_DEFAULT; + +const char ap_valid_accept_mutex_string[] = + "Valid accept mutexes for this platform and MPM are: default" +#if APR_HAS_FLOCK_SERIALIZE + ", flock" +#endif +#if APR_HAS_FCNTL_SERIALIZE + ", fcntl" +#endif +#if APR_HAS_SYSVSEM_SERIALIZE && !defined(PERCHILD_MPM) + ", sysvsem" +#endif +#if APR_HAS_POSIXSEM_SERIALIZE + ", posixsem" +#endif +#if APR_HAS_PROC_PTHREAD_SERIALIZE + ", pthread" +#endif + "."; + +AP_DECLARE(const char *) ap_mpm_set_accept_lock_mech(cmd_parms *cmd, + void *dummy, + const char *arg) +{ + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + if (!strcasecmp(arg, "default")) { + ap_accept_lock_mech = APR_LOCK_DEFAULT; + } +#if APR_HAS_FLOCK_SERIALIZE + else if (!strcasecmp(arg, "flock")) { + ap_accept_lock_mech = APR_LOCK_FLOCK; + } +#endif +#if APR_HAS_FCNTL_SERIALIZE + else if (!strcasecmp(arg, "fcntl")) { + ap_accept_lock_mech = APR_LOCK_FCNTL; + } +#endif + + /* perchild can't use SysV sems because the permissions on the accept + * mutex can't be set to allow all processes to use the mutex and + * at the same time keep all users from being able to dink with the + * mutex + */ +#if APR_HAS_SYSVSEM_SERIALIZE && !defined(PERCHILD_MPM) + else if (!strcasecmp(arg, "sysvsem")) { + ap_accept_lock_mech = APR_LOCK_SYSVSEM; + } +#endif +#if APR_HAS_POSIXSEM_SERIALIZE + else if (!strcasecmp(arg, "posixsem")) { + ap_accept_lock_mech = APR_LOCK_POSIXSEM; + } +#endif +#if APR_HAS_PROC_PTHREAD_SERIALIZE + else if (!strcasecmp(arg, "pthread")) { + ap_accept_lock_mech = APR_LOCK_PROC_PTHREAD; + } +#endif + else { + return apr_pstrcat(cmd->pool, arg, " is an invalid mutex mechanism; ", + ap_valid_accept_mutex_string, NULL); + } + return NULL; +} + +#endif + +#ifdef AP_MPM_WANT_SIGNAL_SERVER + +static const char *dash_k_arg; + +static int send_signal(pid_t pid, int sig) +{ + if (kill(pid, sig) < 0) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, errno, NULL, + "sending signal to server"); + return 1; + } + return 0; +} + +int ap_signal_server(int *exit_status, apr_pool_t *pconf) +{ + apr_status_t rv; + pid_t otherpid; + int running = 0; + int have_pid_file = 0; + const char *status; + + *exit_status = 0; + + rv = ap_read_pid(pconf, ap_pid_fname, &otherpid); + if (rv != APR_SUCCESS) { + if (rv != APR_ENOENT) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, rv, NULL, + "Error retrieving pid file %s", ap_pid_fname); + *exit_status = 1; + return 1; + } + status = "httpd (no pid file) not running"; + } + else { + have_pid_file = 1; + if (kill(otherpid, 0) == 0) { + running = 1; + status = apr_psprintf(pconf, + "httpd (pid %" APR_PID_T_FMT ") already " + "running", otherpid); + } + else { + status = apr_psprintf(pconf, + "httpd (pid %" APR_PID_T_FMT "?) not running", + otherpid); + } + } + + if (!strcmp(dash_k_arg, "start")) { + if (running) { + printf("%s\n", status); + return 1; + } + } + + if (!strcmp(dash_k_arg, "stop")) { + if (!running) { + printf("%s\n", status); + } + else { + send_signal(otherpid, SIGTERM); + } + return 1; + } + + if (!strcmp(dash_k_arg, "restart")) { + if (!running) { + printf("httpd not running, trying to start\n"); + } + else { + *exit_status = send_signal(otherpid, SIGHUP); + return 1; + } + } + + if (!strcmp(dash_k_arg, "graceful")) { + if (!running) { + printf("httpd not running, trying to start\n"); + } + else { + *exit_status = send_signal(otherpid, SIGUSR1); + return 1; + } + } + + return 0; +} + +void ap_mpm_rewrite_args(process_rec *process) +{ + apr_array_header_t *mpm_new_argv; + apr_status_t rv; + apr_getopt_t *opt; + char optbuf[3]; + const char *optarg; + int fixed_args; + + mpm_new_argv = apr_array_make(process->pool, process->argc, + sizeof(const char **)); + *(const char **)apr_array_push(mpm_new_argv) = process->argv[0]; + fixed_args = mpm_new_argv->nelts; + apr_getopt_init(&opt, process->pool, process->argc, process->argv); + opt->errfn = NULL; + optbuf[0] = '-'; + /* option char returned by apr_getopt() will be stored in optbuf[1] */ + optbuf[2] = '\0'; + while ((rv = apr_getopt(opt, "k:" AP_SERVER_BASEARGS, + optbuf + 1, &optarg)) == APR_SUCCESS) { + switch(optbuf[1]) { + case 'k': + if (!dash_k_arg) { + if (!strcmp(optarg, "start") || !strcmp(optarg, "stop") || + !strcmp(optarg, "restart") || !strcmp(optarg, "graceful")) { + dash_k_arg = optarg; + break; + } + } + default: + *(const char **)apr_array_push(mpm_new_argv) = + apr_pstrdup(process->pool, optbuf); + if (optarg) { + *(const char **)apr_array_push(mpm_new_argv) = optarg; + } + } + } + + /* back up to capture the bad argument */ + if (rv == APR_BADCH || rv == APR_BADARG) { + opt->ind--; + } + + while (opt->ind < opt->argc) { + *(const char **)apr_array_push(mpm_new_argv) = + apr_pstrdup(process->pool, opt->argv[opt->ind++]); + } + + process->argc = mpm_new_argv->nelts; + process->argv = (const char * const *)mpm_new_argv->elts; + + if (dash_k_arg) { + APR_REGISTER_OPTIONAL_FN(ap_signal_server); + } +} + +#endif /* AP_MPM_WANT_SIGNAL_SERVER */ + +#ifdef AP_MPM_WANT_SET_MAX_MEM_FREE +apr_uint32_t ap_max_mem_free = APR_ALLOCATOR_MAX_FREE_UNLIMITED; + +const char *ap_mpm_set_max_mem_free(cmd_parms *cmd, void *dummy, + const char *arg) +{ + long value; + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + value = strtol(arg, NULL, 0); + if (value < 0 || errno == ERANGE) + return apr_pstrcat(cmd->pool, "Invalid MaxMemFree value: ", + arg, NULL); + + ap_max_mem_free = (apr_uint32_t)value * 1024; + + return NULL; +} + +#endif /* AP_MPM_WANT_SET_MAX_MEM_FREE */ + +#ifdef AP_MPM_WANT_FATAL_SIGNAL_HANDLER + +static pid_t parent_pid, my_pid; +apr_pool_t *pconf; + +#if AP_ENABLE_EXCEPTION_HOOK + +static int exception_hook_enabled; + +const char *ap_mpm_set_exception_hook(cmd_parms *cmd, void *dummy, + const char *arg) +{ + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + if (cmd->server->is_virtual) { + return "EnableExceptionHook directive not allowed in "; + } + + if (strcasecmp(arg, "on") == 0) { + exception_hook_enabled = 1; + } + else if (strcasecmp(arg, "off") == 0) { + exception_hook_enabled = 0; + } + else { + return "parameter must be 'on' or 'off'"; + } + + return NULL; +} + +APR_HOOK_STRUCT( + APR_HOOK_LINK(fatal_exception) +) + +AP_IMPLEMENT_HOOK_RUN_ALL(int, fatal_exception, + (ap_exception_info_t *ei), (ei), OK, DECLINED) + +static void run_fatal_exception_hook(int sig) +{ + ap_exception_info_t ei = {0}; + + if (exception_hook_enabled && + geteuid() != 0 && + my_pid != parent_pid) { + ei.sig = sig; + ei.pid = my_pid; + ap_run_fatal_exception(&ei); + } +} +#endif /* AP_ENABLE_EXCEPTION_HOOK */ + +/* handle all varieties of core dumping signals */ +static void sig_coredump(int sig) +{ + apr_filepath_set(ap_coredump_dir, pconf); + apr_signal(sig, SIG_DFL); +#if AP_ENABLE_EXCEPTION_HOOK + run_fatal_exception_hook(sig); +#endif + /* linuxthreads issue calling getpid() here: + * This comparison won't match if the crashing thread is + * some module's thread that runs in the parent process. + * The fallout, which is limited to linuxthreads: + * The special log message won't be written when such a + * thread in the parent causes the parent to crash. + */ + if (getpid() == parent_pid) { + ap_log_error(APLOG_MARK, APLOG_NOTICE, + 0, ap_server_conf, + "seg fault or similar nasty error detected " + "in the parent process"); + /* XXX we can probably add some rudimentary cleanup code here, + * like getting rid of the pid file. If any additional bad stuff + * happens, we are protected from recursive errors taking down the + * system since this function is no longer the signal handler GLA + */ + } + kill(getpid(), sig); + /* At this point we've got sig blocked, because we're still inside + * the signal handler. When we leave the signal handler it will + * be unblocked, and we'll take the signal... and coredump or whatever + * is appropriate for this particular Unix. In addition the parent + * will see the real signal we received -- whereas if we called + * abort() here, the parent would only see SIGABRT. + */ +} + +apr_status_t ap_fatal_signal_child_setup(server_rec *s) +{ + my_pid = getpid(); + return APR_SUCCESS; +} + +apr_status_t ap_fatal_signal_setup(server_rec *s, apr_pool_t *in_pconf) +{ +#ifndef NO_USE_SIGACTION + struct sigaction sa; + + sigemptyset(&sa.sa_mask); + +#if defined(SA_ONESHOT) + sa.sa_flags = SA_ONESHOT; +#elif defined(SA_RESETHAND) + sa.sa_flags = SA_RESETHAND; +#else + sa.sa_flags = 0; +#endif + + sa.sa_handler = sig_coredump; + if (sigaction(SIGSEGV, &sa, NULL) < 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, s, "sigaction(SIGSEGV)"); +#ifdef SIGBUS + if (sigaction(SIGBUS, &sa, NULL) < 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, s, "sigaction(SIGBUS)"); +#endif +#ifdef SIGABORT + if (sigaction(SIGABORT, &sa, NULL) < 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, s, "sigaction(SIGABORT)"); +#endif +#ifdef SIGABRT + if (sigaction(SIGABRT, &sa, NULL) < 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, s, "sigaction(SIGABRT)"); +#endif +#ifdef SIGILL + if (sigaction(SIGILL, &sa, NULL) < 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, errno, s, "sigaction(SIGILL)"); +#endif + +#else /* NO_USE_SIGACTION */ + + apr_signal(SIGSEGV, sig_coredump); +#ifdef SIGBUS + apr_signal(SIGBUS, sig_coredump); +#endif /* SIGBUS */ +#ifdef SIGABORT + apr_signal(SIGABORT, sig_coredump); +#endif /* SIGABORT */ +#ifdef SIGABRT + apr_signal(SIGABRT, sig_coredump); +#endif /* SIGABRT */ +#ifdef SIGILL + apr_signal(SIGILL, sig_coredump); +#endif /* SIGILL */ + +#endif /* NO_USE_SIGACTION */ + + pconf = in_pconf; + parent_pid = my_pid = getpid(); + + return APR_SUCCESS; +} + +#endif /* AP_MPM_WANT_FATAL_SIGNAL_HANDLER */ diff --git a/rubbos/app/httpd-2.0.64/server/mpm_common.lo b/rubbos/app/httpd-2.0.64/server/mpm_common.lo new file mode 100644 index 00000000..ba20abe1 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/mpm_common.lo @@ -0,0 +1,12 @@ +# mpm_common.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/mpm_common.o' + +# Name of the non-PIC object. +non_pic_object='mpm_common.o' + diff --git a/rubbos/app/httpd-2.0.64/server/mpm_common.o b/rubbos/app/httpd-2.0.64/server/mpm_common.o new file mode 100644 index 0000000000000000000000000000000000000000..cd06b1d57757a9dc68951b14ad4cb8f3c7b68ab0 GIT binary patch literal 69152 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 +#endif +#if APR_HAVE_UNISTD_H +#include +#endif + + +APR_HOOK_STRUCT( + APR_HOOK_LINK(post_read_request) + APR_HOOK_LINK(log_transaction) + APR_HOOK_LINK(http_method) + APR_HOOK_LINK(default_port) +) + +AP_DECLARE_DATA ap_filter_rec_t *ap_old_write_func = NULL; + + +/* Patterns to match in ap_make_content_type() */ +static const char *needcset[] = { + "text/plain", + "text/html", + NULL +}; +static const apr_strmatch_pattern **needcset_patterns; +static const apr_strmatch_pattern *charset_pattern; + +AP_DECLARE(void) ap_setup_make_content_type(apr_pool_t *pool) +{ + int i; + for (i = 0; needcset[i]; i++) { + continue; + } + needcset_patterns = (const apr_strmatch_pattern **) + apr_palloc(pool, (i + 1) * sizeof(apr_strmatch_pattern *)); + for (i = 0; needcset[i]; i++) { + needcset_patterns[i] = apr_strmatch_precompile(pool, needcset[i], 0); + } + needcset_patterns[i] = NULL; + charset_pattern = apr_strmatch_precompile(pool, "charset=", 0); +} + +/* + * Builds the content-type that should be sent to the client from the + * content-type specified. The following rules are followed: + * - if type is NULL, type is set to ap_default_type(r) + * - if charset adding is disabled, stop processing and return type. + * - then, if there are no parameters on type, add the default charset + * - return type + */ +AP_DECLARE(const char *)ap_make_content_type(request_rec *r, const char *type) +{ + const apr_strmatch_pattern **pcset; + core_dir_config *conf = + (core_dir_config *)ap_get_module_config(r->per_dir_config, + &core_module); + core_request_config *request_conf; + apr_size_t type_len; + + if (!type) { + type = ap_default_type(r); + } + + if (conf->add_default_charset != ADD_DEFAULT_CHARSET_ON) { + return type; + } + + request_conf = + ap_get_module_config(r->request_config, &core_module); + if (request_conf->suppress_charset) { + return type; + } + + type_len = strlen(type); + + if (apr_strmatch(charset_pattern, type, type_len) != NULL) { + /* already has parameter, do nothing */ + /* XXX we don't check the validity */ + ; + } + else { + /* see if it makes sense to add the charset. At present, + * we only add it if the Content-type is one of needcset[] + */ + for (pcset = needcset_patterns; *pcset ; pcset++) { + if (apr_strmatch(*pcset, type, type_len) != NULL) { + struct iovec concat[3]; + concat[0].iov_base = (void *)type; + concat[0].iov_len = type_len; + concat[1].iov_base = (void *)"; charset="; + concat[1].iov_len = sizeof("; charset=") - 1; + concat[2].iov_base = (void *)(conf->add_default_charset_name); + concat[2].iov_len = strlen(conf->add_default_charset_name); + type = apr_pstrcatv(r->pool, concat, 3, NULL); + break; + } + } + } + + return type; +} + +AP_DECLARE(void) ap_set_content_length(request_rec *r, apr_off_t clength) +{ + r->clength = clength; + apr_table_setn(r->headers_out, "Content-Length", + apr_off_t_toa(r->pool, clength)); +} + +/* + * Return the latest rational time from a request/mtime (modification time) + * pair. We return the mtime unless it's in the future, in which case we + * return the current time. We use the request time as a reference in order + * to limit the number of calls to time(). We don't check for futurosity + * unless the mtime is at least as new as the reference. + */ +AP_DECLARE(apr_time_t) ap_rationalize_mtime(request_rec *r, apr_time_t mtime) +{ + apr_time_t now; + + /* For all static responses, it's almost certain that the file was + * last modified before the beginning of the request. So there's + * no reason to call time(NULL) again. But if the response has been + * created on demand, then it might be newer than the time the request + * started. In this event we really have to call time(NULL) again + * so that we can give the clients the most accurate Last-Modified. If we + * were given a time in the future, we return the current time - the + * Last-Modified can't be in the future. + */ + now = (mtime < r->request_time) ? r->request_time : apr_time_now(); + return (mtime > now) ? now : mtime; +} + +/* Min # of bytes to allocate when reading a request line */ +#define MIN_LINE_ALLOC 80 + +/* Get a line of protocol input, including any continuation lines + * caused by MIME folding (or broken clients) if fold != 0, and place it + * in the buffer s, of size n bytes, without the ending newline. + * + * If s is NULL, ap_rgetline_core will allocate necessary memory from r->pool. + * + * Returns APR_SUCCESS if there are no problems and sets *read to be + * the full length of s. + * + * APR_ENOSPC is returned if there is not enough buffer space. + * Other errors may be returned on other errors. + * + * The LF is *not* returned in the buffer. Therefore, a *read of 0 + * indicates that an empty line was read. + * + * Notes: Because the buffer uses 1 char for NUL, the most we can return is + * (n - 1) actual characters. + * + * If no LF is detected on the last line due to a dropped connection + * or a full buffer, that's considered an error. + */ +AP_DECLARE(apr_status_t) ap_rgetline_core(char **s, apr_size_t n, + apr_size_t *read, request_rec *r, + int fold, apr_bucket_brigade *bb) +{ + apr_status_t rv; + apr_bucket *e; + apr_size_t bytes_handled = 0, current_alloc = 0; + char *pos, *last_char = *s; + int do_alloc = (*s == NULL), saw_eos = 0; + + /* + * Initialize last_char as otherwise a random value will be compared + * against APR_ASCII_LF at the end of the loop if bb only contains + * zero-length buckets. + */ + if (last_char) + *last_char = '\0'; + + for (;;) { + apr_brigade_cleanup(bb); + rv = ap_get_brigade(r->input_filters, bb, AP_MODE_GETLINE, + APR_BLOCK_READ, 0); + + if (rv != APR_SUCCESS) { + return rv; + } + + /* Something horribly wrong happened. Someone didn't block! */ + if (APR_BRIGADE_EMPTY(bb)) { + return APR_EGENERAL; + } + + APR_BRIGADE_FOREACH(e, bb) { + const char *str; + apr_size_t len; + + /* If we see an EOS, don't bother doing anything more. */ + if (APR_BUCKET_IS_EOS(e)) { + saw_eos = 1; + break; + } + + rv = apr_bucket_read(e, &str, &len, APR_BLOCK_READ); + + if (rv != APR_SUCCESS) { + return rv; + } + + if (len == 0) { + /* no use attempting a zero-byte alloc (hurts when + * using --with-efence --enable-pool-debug) or + * doing any of the other logic either + */ + continue; + } + + /* Would this overrun our buffer? If so, we'll die. */ + if (n < bytes_handled + len) { + *read = bytes_handled; + if (*s) { + /* ensure this string is NUL terminated */ + if (bytes_handled > 0) { + (*s)[bytes_handled-1] = '\0'; + } + else { + (*s)[0] = '\0'; + } + } + return APR_ENOSPC; + } + + /* Do we have to handle the allocation ourselves? */ + if (do_alloc) { + /* We'll assume the common case where one bucket is enough. */ + if (!*s) { + current_alloc = len; + if (current_alloc < MIN_LINE_ALLOC) { + current_alloc = MIN_LINE_ALLOC; + } + *s = apr_palloc(r->pool, current_alloc); + } + else if (bytes_handled + len > current_alloc) { + /* Increase the buffer size */ + apr_size_t new_size = current_alloc * 2; + char *new_buffer; + + if (bytes_handled + len > new_size) { + new_size = (bytes_handled + len) * 2; + } + + new_buffer = apr_palloc(r->pool, new_size); + + /* Copy what we already had. */ + memcpy(new_buffer, *s, bytes_handled); + current_alloc = new_size; + *s = new_buffer; + } + } + + /* Just copy the rest of the data to the end of the old buffer. */ + pos = *s + bytes_handled; + memcpy(pos, str, len); + last_char = pos + len - 1; + + /* We've now processed that new data - update accordingly. */ + bytes_handled += len; + } + + /* If we got a full line of input, stop reading */ + if (last_char && (*last_char == APR_ASCII_LF)) { + break; + } + } + + /* Now NUL-terminate the string at the end of the line; + * if the last-but-one character is a CR, terminate there */ + if (last_char > *s && last_char[-1] == APR_ASCII_CR) { + last_char--; + } + *last_char = '\0'; + bytes_handled = last_char - *s; + + /* If we're folding, we have more work to do. + * + * Note that if an EOS was seen, we know we can't have another line. + */ + if (fold && bytes_handled && !saw_eos) { + for (;;) { + const char *str; + apr_size_t len; + char c; + + /* Clear the temp brigade for this filter read. */ + apr_brigade_cleanup(bb); + + /* We only care about the first byte. */ + rv = ap_get_brigade(r->input_filters, bb, AP_MODE_SPECULATIVE, + APR_BLOCK_READ, 1); + + if (rv != APR_SUCCESS) { + return rv; + } + + if (APR_BRIGADE_EMPTY(bb)) { + break; + } + + e = APR_BRIGADE_FIRST(bb); + + /* If we see an EOS, don't bother doing anything more. */ + if (APR_BUCKET_IS_EOS(e)) { + break; + } + + rv = apr_bucket_read(e, &str, &len, APR_BLOCK_READ); + + if (rv != APR_SUCCESS) { + apr_brigade_cleanup(bb); + return rv; + } + + /* Found one, so call ourselves again to get the next line. + * + * FIXME: If the folding line is completely blank, should we + * stop folding? Does that require also looking at the next + * char? + */ + /* When we call destroy, the buckets are deleted, so save that + * one character we need. This simplifies our execution paths + * at the cost of one character read. + */ + c = *str; + if (c == APR_ASCII_BLANK || c == APR_ASCII_TAB) { + /* Do we have enough space? We may be full now. */ + if (bytes_handled >= n) { + *read = n; + /* ensure this string is terminated */ + (*s)[n-1] = '\0'; + return APR_ENOSPC; + } + else { + apr_size_t next_size, next_len; + char *tmp; + + /* If we're doing the allocations for them, we have to + * give ourselves a NULL and copy it on return. + */ + if (do_alloc) { + tmp = NULL; + } else { + /* We're null terminated. */ + tmp = last_char; + } + + next_size = n - bytes_handled; + + rv = ap_rgetline_core(&tmp, next_size, + &next_len, r, 0, bb); + + if (rv != APR_SUCCESS) { + return rv; + } + + if (do_alloc && next_len > 0) { + char *new_buffer; + apr_size_t new_size = bytes_handled + next_len + 1; + + /* we need to alloc an extra byte for a null */ + new_buffer = apr_palloc(r->pool, new_size); + + /* Copy what we already had. */ + memcpy(new_buffer, *s, bytes_handled); + + /* copy the new line, including the trailing null */ + memcpy(new_buffer + bytes_handled, tmp, next_len + 1); + *s = new_buffer; + } + + bytes_handled += next_len; + } + } + else { /* next character is not tab or space */ + break; + } + } + } + + *read = bytes_handled; + return APR_SUCCESS; +} + +#if APR_CHARSET_EBCDIC +AP_DECLARE(apr_status_t) ap_rgetline(char **s, apr_size_t n, + apr_size_t *read, request_rec *r, + int fold, apr_bucket_brigade *bb) +{ + /* on ASCII boxes, ap_rgetline is a macro which simply invokes + * ap_rgetline_core with the same parms + * + * on EBCDIC boxes, each complete http protocol input line needs to be + * translated into the code page used by the compiler. Since + * ap_rgetline_core uses recursion, we do the translation in a wrapper + * function to insure that each input character gets translated only once. + */ + apr_status_t rv; + + rv = ap_rgetline_core(s, n, read, r, fold, bb); + if (rv == APR_SUCCESS) { + ap_xlate_proto_from_ascii(*s, *read); + } + return rv; +} +#endif + +AP_DECLARE(int) ap_getline(char *s, int n, request_rec *r, int fold) +{ + char *tmp_s = s; + apr_status_t rv; + apr_size_t len; + apr_bucket_brigade *tmp_bb; + + tmp_bb = apr_brigade_create(r->pool, r->connection->bucket_alloc); + rv = ap_rgetline(&tmp_s, n, &len, r, fold, tmp_bb); + apr_brigade_destroy(tmp_bb); + + /* Map the out-of-space condition to the old API. */ + if (rv == APR_ENOSPC) { + return n; + } + + /* Anything else is just bad. */ + if (rv != APR_SUCCESS) { + return -1; + } + + return (int)len; +} + +/* parse_uri: break apart the uri + * Side Effects: + * - sets r->args to rest after '?' (or NULL if no '?') + * - sets r->uri to request uri (without r->args part) + * - sets r->hostname (if not set already) from request (scheme://host:port) + */ +AP_CORE_DECLARE(void) ap_parse_uri(request_rec *r, const char *uri) +{ + int status = HTTP_OK; + + r->unparsed_uri = apr_pstrdup(r->pool, uri); + + if (r->method_number == M_CONNECT) { + status = apr_uri_parse_hostinfo(r->pool, uri, &r->parsed_uri); + } + else { + /* Simple syntax Errors in URLs are trapped by + * parse_uri_components(). + */ + status = apr_uri_parse(r->pool, uri, &r->parsed_uri); + } + + if (status == APR_SUCCESS) { + /* if it has a scheme we may need to do absoluteURI vhost stuff */ + if (r->parsed_uri.scheme + && !strcasecmp(r->parsed_uri.scheme, ap_http_method(r))) { + r->hostname = r->parsed_uri.hostname; + } + else if (r->method_number == M_CONNECT) { + r->hostname = r->parsed_uri.hostname; + } + + r->args = r->parsed_uri.query; + r->uri = r->parsed_uri.path ? r->parsed_uri.path + : apr_pstrdup(r->pool, "/"); + +#if defined(OS2) || defined(WIN32) + /* Handle path translations for OS/2 and plug security hole. + * This will prevent "http://www.wherever.com/..\..\/" from + * returning a directory for the root drive. + */ + { + char *x; + + for (x = r->uri; (x = strchr(x, '\\')) != NULL; ) + *x = '/'; + } +#endif /* OS2 || WIN32 */ + } + else { + r->args = NULL; + r->hostname = NULL; + r->status = HTTP_BAD_REQUEST; /* set error status */ + r->uri = apr_pstrdup(r->pool, uri); + } +} + +static int read_request_line(request_rec *r, apr_bucket_brigade *bb) +{ + const char *ll; + const char *uri; + const char *pro; + +#if 0 + conn_rec *conn = r->connection; +#endif + int major = 1, minor = 0; /* Assume HTTP/1.0 if non-"HTTP" protocol */ + char http[5]; + apr_size_t len; + int num_blank_lines = 0; + int max_blank_lines = r->server->limit_req_fields; + + if (max_blank_lines <= 0) { + max_blank_lines = DEFAULT_LIMIT_REQUEST_FIELDS; + } + + /* Read past empty lines until we get a real request line, + * a read error, the connection closes (EOF), or we timeout. + * + * We skip empty lines because browsers have to tack a CRLF on to the end + * of POSTs to support old CERN webservers. But note that we may not + * have flushed any previous response completely to the client yet. + * We delay the flush as long as possible so that we can improve + * performance for clients that are pipelining requests. If a request + * is pipelined then we won't block during the (implicit) read() below. + * If the requests aren't pipelined, then the client is still waiting + * for the final buffer flush from us, and we will block in the implicit + * read(). B_SAFEREAD ensures that the BUFF layer flushes if it will + * have to block during a read. + */ + + do { + apr_status_t rv; + + /* insure ap_rgetline allocates memory each time thru the loop + * if there are empty lines + */ + r->the_request = NULL; + rv = ap_rgetline(&(r->the_request), (apr_size_t)(r->server->limit_req_line + 2), + &len, r, 0, bb); + + if (rv != APR_SUCCESS) { + r->request_time = apr_time_now(); + + /* ap_rgetline returns APR_ENOSPC if it fills up the + * buffer before finding the end-of-line. This is only going to + * happen if it exceeds the configured limit for a request-line. + */ + if (rv == APR_ENOSPC) { + r->status = HTTP_REQUEST_URI_TOO_LARGE; + r->proto_num = HTTP_VERSION(1,0); + r->protocol = apr_pstrdup(r->pool, "HTTP/1.0"); + } + + return 0; + } + } while ((len <= 0) && (++num_blank_lines < max_blank_lines)); + + /* we've probably got something to do, ignore graceful restart requests */ + + r->request_time = apr_time_now(); + ll = r->the_request; + r->method = ap_getword_white(r->pool, &ll); + +#if 0 +/* XXX If we want to keep track of the Method, the protocol module should do + * it. That support isn't in the scoreboard yet. Hopefully next week + * sometime. rbb */ + ap_update_connection_status(AP_CHILD_THREAD_FROM_ID(conn->id), "Method", + r->method); +#endif + + uri = ap_getword_white(r->pool, &ll); + + /* Provide quick information about the request method as soon as known */ + + r->method_number = ap_method_number_of(r->method); + if (r->method_number == M_GET && r->method[0] == 'H') { + r->header_only = 1; + } + + ap_parse_uri(r, uri); + + if (ll[0]) { + r->assbackwards = 0; + pro = ll; + len = strlen(ll); + } else { + r->assbackwards = 1; + pro = "HTTP/0.9"; + len = 8; + } + r->protocol = apr_pstrmemdup(r->pool, pro, len); + + /* XXX ap_update_connection_status(conn->id, "Protocol", r->protocol); */ + + /* Avoid sscanf in the common case */ + if (len == 8 + && pro[0] == 'H' && pro[1] == 'T' && pro[2] == 'T' && pro[3] == 'P' + && pro[4] == '/' && apr_isdigit(pro[5]) && pro[6] == '.' + && apr_isdigit(pro[7])) { + r->proto_num = HTTP_VERSION(pro[5] - '0', pro[7] - '0'); + } + else if (3 == sscanf(r->protocol, "%4s/%u.%u", http, &major, &minor) + && (strcasecmp("http", http) == 0) + && (minor < HTTP_VERSION(1, 0)) ) /* don't allow HTTP/0.1000 */ + r->proto_num = HTTP_VERSION(major, minor); + else + r->proto_num = HTTP_VERSION(1, 0); + + return 1; +} + +AP_DECLARE(void) ap_get_mime_headers_core(request_rec *r, apr_bucket_brigade *bb) +{ + char *last_field = NULL; + apr_size_t last_len = 0; + apr_size_t alloc_len = 0; + char *field; + char *value; + apr_size_t len; + int fields_read = 0; + char *tmp_field; + + /* + * Read header lines until we get the empty separator line, a read error, + * the connection closes (EOF), reach the server limit, or we timeout. + */ + while(1) { + apr_status_t rv; + int folded = 0; + + field = NULL; + rv = ap_rgetline(&field, r->server->limit_req_fieldsize + 2, + &len, r, 0, bb); + + /* ap_rgetline returns APR_ENOSPC if it fills up the buffer before + * finding the end-of-line. This is only going to happen if it + * exceeds the configured limit for a field size. + */ + if (rv == APR_ENOSPC && field) { + r->status = HTTP_BAD_REQUEST; + /* insure ap_escape_html will terminate correctly */ + field[len - 1] = '\0'; + apr_table_setn(r->notes, "error-notes", + apr_pstrcat(r->pool, + "Size of a request header field " + "exceeds server limit.
    \n" + "

    \n",
    +                                       ap_escape_html(r->pool, field),
    +                                       "
    \n", NULL)); + return; + } + + if (rv != APR_SUCCESS) { + r->status = HTTP_BAD_REQUEST; + return; + } + + if (last_field != NULL) { + if ((len > 0) && ((*field == '\t') || *field == ' ')) { + /* This line is a continuation of the preceding line(s), + * so append it to the line that we've set aside. + * Note: this uses a power-of-two allocator to avoid + * doing O(n) allocs and using O(n^2) space for + * continuations that span many many lines. + */ + apr_size_t fold_len = last_len + len + 1; /* trailing null */ + + if ((fold_len - 1) > r->server->limit_req_fieldsize) { + r->status = HTTP_BAD_REQUEST; + /* report what we have accumulated so far before the + * overflow (last_field) as the field with the problem + */ + apr_table_setn(r->notes, "error-notes", + apr_pstrcat(r->pool, + "Size of a request header field " + "after folding " + "exceeds server limit.
    \n" + "
    \n",
    +                                               ap_escape_html(r->pool, last_field),
    +                                               "
    \n", NULL)); + return; + } + + if (fold_len > alloc_len) { + char *fold_buf; + alloc_len += alloc_len; + if (fold_len > alloc_len) { + alloc_len = fold_len; + } + fold_buf = (char *)apr_palloc(r->pool, alloc_len); + memcpy(fold_buf, last_field, last_len); + last_field = fold_buf; + } + memcpy(last_field + last_len, field, len +1); /* +1 for nul */ + last_len += len; + folded = 1; + } + else /* not a continuation line */ { + + if (r->server->limit_req_fields + && (++fields_read > r->server->limit_req_fields)) { + r->status = HTTP_BAD_REQUEST; + apr_table_setn(r->notes, "error-notes", + "The number of request header fields " + "exceeds this server's limit."); + return; + } + + if (!(value = strchr(last_field, ':'))) { /* Find ':' or */ + r->status = HTTP_BAD_REQUEST; /* abort bad request */ + apr_table_setn(r->notes, "error-notes", + apr_pstrcat(r->pool, + "Request header field is " + "missing ':' separator.
    \n" + "
    \n",
    +                                               ap_escape_html(r->pool,
    +                                                              last_field),
    +                                               "
    \n", NULL)); + return; + } + + tmp_field = value - 1; /* last character of field-name */ + + *value++ = '\0'; /* NUL-terminate at colon */ + + while (*value == ' ' || *value == '\t') { + ++value; /* Skip to start of value */ + } + + /* Strip LWS after field-name: */ + while (tmp_field > last_field + && (*tmp_field == ' ' || *tmp_field == '\t')) { + *tmp_field-- = '\0'; + } + + /* Strip LWS after field-value: */ + tmp_field = last_field + last_len - 1; + while (tmp_field > value + && (*tmp_field == ' ' || *tmp_field == '\t')) { + *tmp_field-- = '\0'; + } + + apr_table_addn(r->headers_in, last_field, value); + + /* reset the alloc_len so that we'll allocate a new + * buffer if we have to do any more folding: we can't + * use the previous buffer because its contents are + * now part of r->headers_in + */ + alloc_len = 0; + + } /* end if current line is not a continuation starting with tab */ + } + + /* Found a blank line, stop. */ + if (len == 0) { + break; + } + + /* Keep track of this line so that we can parse it on + * the next loop iteration. (In the folded case, last_field + * has been updated already.) + */ + if (!folded) { + last_field = field; + last_len = len; + } + } + + apr_table_compress(r->headers_in, APR_OVERLAP_TABLES_MERGE); +} + +AP_DECLARE(void) ap_get_mime_headers(request_rec *r) +{ + apr_bucket_brigade *tmp_bb; + tmp_bb = apr_brigade_create(r->pool, r->connection->bucket_alloc); + ap_get_mime_headers_core(r, tmp_bb); + apr_brigade_destroy(tmp_bb); +} + +request_rec *ap_read_request(conn_rec *conn) +{ + request_rec *r; + apr_pool_t *p; + const char *expect; + int access_status; + apr_bucket_brigade *tmp_bb; + + apr_pool_create(&p, conn->pool); + apr_pool_tag(p, "request"); + r = apr_pcalloc(p, sizeof(request_rec)); + r->pool = p; + r->connection = conn; + r->server = conn->base_server; + + r->user = NULL; + r->ap_auth_type = NULL; + + r->allowed_methods = ap_make_method_list(p, 2); + + r->headers_in = apr_table_make(r->pool, 25); + r->subprocess_env = apr_table_make(r->pool, 25); + r->headers_out = apr_table_make(r->pool, 12); + r->err_headers_out = apr_table_make(r->pool, 5); + r->notes = apr_table_make(r->pool, 5); + + r->request_config = ap_create_request_config(r->pool); + /* Must be set before we run create request hook */ + + r->proto_output_filters = conn->output_filters; + r->output_filters = r->proto_output_filters; + r->proto_input_filters = conn->input_filters; + r->input_filters = r->proto_input_filters; + ap_run_create_request(r); + r->per_dir_config = r->server->lookup_defaults; + + r->sent_bodyct = 0; /* bytect isn't for body */ + + r->read_length = 0; + r->read_body = REQUEST_NO_BODY; + + r->status = HTTP_REQUEST_TIME_OUT; /* Until we get a request */ + r->the_request = NULL; + + tmp_bb = apr_brigade_create(r->pool, r->connection->bucket_alloc); + + /* Get the request... */ + if (!read_request_line(r, tmp_bb)) { + if (r->status == HTTP_REQUEST_URI_TOO_LARGE) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "request failed: URI too long (longer than %d)", r->server->limit_req_line); + ap_send_error_response(r, 0); + ap_update_child_status(conn->sbh, SERVER_BUSY_LOG, r); + ap_run_log_transaction(r); + apr_brigade_destroy(tmp_bb); + return r; + } + + apr_brigade_destroy(tmp_bb); + return NULL; + } + + if (!r->assbackwards) { + ap_get_mime_headers_core(r, tmp_bb); + if (r->status != HTTP_REQUEST_TIME_OUT) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "request failed: error reading the headers"); + ap_send_error_response(r, 0); + ap_update_child_status(conn->sbh, SERVER_BUSY_LOG, r); + ap_run_log_transaction(r); + apr_brigade_destroy(tmp_bb); + return r; + } + + if (apr_table_get(r->headers_in, "Transfer-Encoding") + && apr_table_get(r->headers_in, "Content-Length")) { + /* 2616 section 4.4, point 3: "if both Transfer-Encoding + * and Content-Length are received, the latter MUST be + * ignored"; so unset it here to prevent any confusion + * later. */ + apr_table_unset(r->headers_in, "Content-Length"); + } + } + else { + if (r->header_only) { + /* + * Client asked for headers only with HTTP/0.9, which doesn't send + * headers! Have to dink things just to make sure the error message + * comes through... + */ + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "client sent invalid HTTP/0.9 request: HEAD %s", + r->uri); + r->header_only = 0; + r->status = HTTP_BAD_REQUEST; + ap_send_error_response(r, 0); + ap_update_child_status(conn->sbh, SERVER_BUSY_LOG, r); + ap_run_log_transaction(r); + apr_brigade_destroy(tmp_bb); + return r; + } + } + + apr_brigade_destroy(tmp_bb); + + r->status = HTTP_OK; /* Until further notice. */ + + /* update what we think the virtual host is based on the headers we've + * now read. may update status. + */ + ap_update_vhost_from_headers(r); + + /* we may have switched to another server */ + r->per_dir_config = r->server->lookup_defaults; + + if ((!r->hostname && (r->proto_num >= HTTP_VERSION(1, 1))) + || ((r->proto_num == HTTP_VERSION(1, 1)) + && !apr_table_get(r->headers_in, "Host"))) { + /* + * Client sent us an HTTP/1.1 or later request without telling us the + * hostname, either with a full URL or a Host: header. We therefore + * need to (as per the 1.1 spec) send an error. As a special case, + * HTTP/1.1 mentions twice (S9, S14.23) that a request MUST contain + * a Host: header, and the server MUST respond with 400 if it doesn't. + */ + r->status = HTTP_BAD_REQUEST; + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "client sent HTTP/1.1 request without hostname " + "(see RFC2616 section 14.23): %s", r->uri); + } + + if (r->status != HTTP_OK) { + ap_send_error_response(r, 0); + ap_update_child_status(conn->sbh, SERVER_BUSY_LOG, r); + ap_run_log_transaction(r); + return r; + } + + if (((expect = apr_table_get(r->headers_in, "Expect")) != NULL) + && (expect[0] != '\0')) { + /* + * The Expect header field was added to HTTP/1.1 after RFC 2068 + * as a means to signal when a 100 response is desired and, + * unfortunately, to signal a poor man's mandatory extension that + * the server must understand or return 417 Expectation Failed. + */ + if (strcasecmp(expect, "100-continue") == 0) { + r->expecting_100 = 1; + } + else { + r->status = HTTP_EXPECTATION_FAILED; + ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r, + "client sent an unrecognized expectation value of " + "Expect: %s", expect); + ap_send_error_response(r, 0); + ap_update_child_status(conn->sbh, SERVER_BUSY_LOG, r); + ap_run_log_transaction(r); + return r; + } + } + + ap_add_input_filter_handle(ap_http_input_filter_handle, + NULL, r, r->connection); + + if ((access_status = ap_run_post_read_request(r))) { + ap_die(access_status, r); + ap_update_child_status(conn->sbh, SERVER_BUSY_LOG, r); + ap_run_log_transaction(r); + return NULL; + } + + return r; +} + +/* + * A couple of other functions which initialize some of the fields of + * a request structure, as appropriate for adjuncts of one kind or another + * to a request in progress. Best here, rather than elsewhere, since + * *someone* has to set the protocol-specific fields... + */ + +AP_DECLARE(void) ap_set_sub_req_protocol(request_rec *rnew, + const request_rec *r) +{ + rnew->the_request = r->the_request; /* Keep original request-line */ + + rnew->assbackwards = 1; /* Don't send headers from this. */ + rnew->no_local_copy = 1; /* Don't try to send HTTP_NOT_MODIFIED for a + * fragment. */ + rnew->method = "GET"; + rnew->method_number = M_GET; + rnew->protocol = "INCLUDED"; + + rnew->status = HTTP_OK; + + rnew->headers_in = apr_table_copy(rnew->pool, r->headers_in); + rnew->subprocess_env = apr_table_copy(rnew->pool, r->subprocess_env); + rnew->headers_out = apr_table_make(rnew->pool, 5); + rnew->err_headers_out = apr_table_make(rnew->pool, 5); + rnew->notes = apr_table_make(rnew->pool, 5); + + rnew->expecting_100 = r->expecting_100; + rnew->read_length = r->read_length; + rnew->read_body = REQUEST_NO_BODY; + + rnew->main = (request_rec *) r; +} + +static void end_output_stream(request_rec *r) +{ + conn_rec *c = r->connection; + apr_bucket_brigade *bb; + apr_bucket *b; + + bb = apr_brigade_create(r->pool, c->bucket_alloc); + b = apr_bucket_eos_create(c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, b); + ap_pass_brigade(r->output_filters, bb); +} + +AP_DECLARE(void) ap_finalize_sub_req_protocol(request_rec *sub) +{ + /* tell the filter chain there is no more content coming */ + if (!sub->eos_sent) { + end_output_stream(sub); + } +} + +/* finalize_request_protocol is called at completion of sending the + * response. Its sole purpose is to send the terminating protocol + * information for any wrappers around the response message body + * (i.e., transfer encodings). It should have been named finalize_response. + */ +AP_DECLARE(void) ap_finalize_request_protocol(request_rec *r) +{ + (void) ap_discard_request_body(r); + + /* tell the filter chain there is no more content coming */ + if (!r->eos_sent) { + end_output_stream(r); + } +} + +/* + * Support for the Basic authentication protocol, and a bit for Digest. + */ +AP_DECLARE(void) ap_note_auth_failure(request_rec *r) +{ + const char *type = ap_auth_type(r); + if (type) { + if (!strcasecmp(type, "Basic")) + ap_note_basic_auth_failure(r); + else if (!strcasecmp(type, "Digest")) + ap_note_digest_auth_failure(r); + } + else { + ap_log_rerror(APLOG_MARK, APLOG_ERR, + 0, r, "need AuthType to note auth failure: %s", r->uri); + } +} + +AP_DECLARE(void) ap_note_basic_auth_failure(request_rec *r) +{ + const char *type = ap_auth_type(r); + + /* if there is no AuthType configure or it is something other than + * Basic, let ap_note_auth_failure() deal with it + */ + if (!type || strcasecmp(type, "Basic")) + ap_note_auth_failure(r); + else + apr_table_setn(r->err_headers_out, + (PROXYREQ_PROXY == r->proxyreq) ? "Proxy-Authenticate" + : "WWW-Authenticate", + apr_pstrcat(r->pool, "Basic realm=\"", ap_auth_name(r), + "\"", NULL)); +} + +AP_DECLARE(void) ap_note_digest_auth_failure(request_rec *r) +{ + apr_table_setn(r->err_headers_out, + (PROXYREQ_PROXY == r->proxyreq) ? "Proxy-Authenticate" + : "WWW-Authenticate", + /* need APR_TIME_T_FMT_HEX */ + apr_psprintf(r->pool, "Digest realm=\"%s\", nonce=\"%llx\"", + ap_auth_name(r), r->request_time)); +} + +AP_DECLARE(int) ap_get_basic_auth_pw(request_rec *r, const char **pw) +{ + const char *auth_line = apr_table_get(r->headers_in, + (PROXYREQ_PROXY == r->proxyreq) + ? "Proxy-Authorization" + : "Authorization"); + const char *t; + + if (!(t = ap_auth_type(r)) || strcasecmp(t, "Basic")) + return DECLINED; + + if (!ap_auth_name(r)) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, + 0, r, "need AuthName: %s", r->uri); + return HTTP_INTERNAL_SERVER_ERROR; + } + + if (!auth_line) { + ap_note_basic_auth_failure(r); + return HTTP_UNAUTHORIZED; + } + + if (strcasecmp(ap_getword(r->pool, &auth_line, ' '), "Basic")) { + /* Client tried to authenticate using wrong auth scheme */ + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "client used wrong authentication scheme: %s", r->uri); + ap_note_basic_auth_failure(r); + return HTTP_UNAUTHORIZED; + } + + while (*auth_line == ' ' || *auth_line == '\t') { + auth_line++; + } + + t = ap_pbase64decode(r->pool, auth_line); + r->user = ap_getword_nulls (r->pool, &t, ':'); + r->ap_auth_type = "Basic"; + + *pw = t; + + return OK; +} + +struct content_length_ctx { + int data_sent; /* true if the C-L filter has already sent at + * least one bucket on to the next output filter + * for this request + */ +}; + +/* This filter computes the content length, but it also computes the number + * of bytes sent to the client. This means that this filter will always run + * through all of the buckets in all brigades + */ +AP_CORE_DECLARE_NONSTD(apr_status_t) ap_content_length_filter( + ap_filter_t *f, + apr_bucket_brigade *b) +{ + request_rec *r = f->r; + struct content_length_ctx *ctx; + apr_bucket *e; + int eos = 0; + apr_read_type_e eblock = APR_NONBLOCK_READ; + + ctx = f->ctx; + if (!ctx) { + f->ctx = ctx = apr_palloc(r->pool, sizeof(*ctx)); + ctx->data_sent = 0; + } + + /* Loop through this set of buckets to compute their length + */ + e = APR_BRIGADE_FIRST(b); + while (e != APR_BRIGADE_SENTINEL(b)) { + if (APR_BUCKET_IS_EOS(e)) { + eos = 1; + break; + } + if (e->length == (apr_size_t)-1) { + apr_size_t len; + const char *ignored; + apr_status_t rv; + + /* This is probably a pipe bucket. Send everything + * prior to this, and then read the data for this bucket. + */ + rv = apr_bucket_read(e, &ignored, &len, eblock); + if (rv == APR_SUCCESS) { + /* Attempt a nonblocking read next time through */ + eblock = APR_NONBLOCK_READ; + r->bytes_sent += len; + } + else if (APR_STATUS_IS_EAGAIN(rv)) { + /* Output everything prior to this bucket, and then + * do a blocking read on the next batch. + */ + if (e != APR_BRIGADE_FIRST(b)) { + apr_bucket_brigade *split = apr_brigade_split(b, e); + apr_bucket *flush = apr_bucket_flush_create(r->connection->bucket_alloc); + + APR_BRIGADE_INSERT_TAIL(b, flush); + rv = ap_pass_brigade(f->next, b); + if (rv != APR_SUCCESS || f->c->aborted) { + apr_brigade_destroy(split); + return rv; + } + b = split; + e = APR_BRIGADE_FIRST(b); + + ctx->data_sent = 1; + } + eblock = APR_BLOCK_READ; + continue; + } + else { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + "ap_content_length_filter: " + "apr_bucket_read() failed"); + return rv; + } + } + else { + r->bytes_sent += e->length; + } + e = APR_BUCKET_NEXT(e); + } + + /* If we've now seen the entire response and it's otherwise + * okay to set the C-L in the response header, then do so now. + * + * We can only set a C-L in the response header if we haven't already + * sent any buckets on to the next output filter for this request. + */ + if (ctx->data_sent == 0 && eos && + /* don't whack the C-L if it has already been set for a HEAD + * by something like proxy. the brigade only has an EOS bucket + * in this case, making r->bytes_sent zero. + * + * if r->bytes_sent > 0 we have a (temporary) body whose length may + * have been changed by a filter. the C-L header might not have been + * updated so we do it here. long term it would be cleaner to have + * such filters update or remove the C-L header, and just use it + * if present. + */ + !(r->header_only && r->bytes_sent == 0 && + apr_table_get(r->headers_out, "Content-Length"))) { + ap_set_content_length(r, r->bytes_sent); + } + + ctx->data_sent = 1; + return ap_pass_brigade(f->next, b); +} + +/* + * Send the body of a response to the client. + */ +AP_DECLARE(apr_status_t) ap_send_fd(apr_file_t *fd, request_rec *r, + apr_off_t offset, apr_size_t len, + apr_size_t *nbytes) +{ + conn_rec *c = r->connection; + apr_bucket_brigade *bb = NULL; + apr_bucket *b; + apr_status_t rv; + + bb = apr_brigade_create(r->pool, c->bucket_alloc); + b = apr_bucket_file_create(fd, offset, len, r->pool, c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, b); + + rv = ap_pass_brigade(r->output_filters, bb); + if (rv != APR_SUCCESS) { + *nbytes = 0; /* no way to tell how many were actually sent */ + } + else { + *nbytes = len; + } + + return rv; +} + +#if APR_HAS_MMAP +/* send data from an in-memory buffer */ +AP_DECLARE(size_t) ap_send_mmap(apr_mmap_t *mm, request_rec *r, size_t offset, + size_t length) +{ + conn_rec *c = r->connection; + apr_bucket_brigade *bb = NULL; + apr_bucket *b; + + bb = apr_brigade_create(r->pool, c->bucket_alloc); + b = apr_bucket_mmap_create(mm, offset, length, c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, b); + ap_pass_brigade(r->output_filters, bb); + + return mm->size; /* XXX - change API to report apr_status_t? */ +} +#endif /* APR_HAS_MMAP */ + +typedef struct { + apr_bucket_brigade *bb; +} old_write_filter_ctx; + +AP_CORE_DECLARE_NONSTD(apr_status_t) ap_old_write_filter( + ap_filter_t *f, apr_bucket_brigade *bb) +{ + old_write_filter_ctx *ctx = f->ctx; + + AP_DEBUG_ASSERT(ctx); + + if (ctx->bb != 0) { + /* whatever is coming down the pipe (we don't care), we + * can simply insert our buffered data at the front and + * pass the whole bundle down the chain. + */ + APR_BRIGADE_CONCAT(ctx->bb, bb); + bb = ctx->bb; + ctx->bb = NULL; + } + + return ap_pass_brigade(f->next, bb); +} + +static apr_status_t buffer_output(request_rec *r, + const char *str, apr_size_t len) +{ + conn_rec *c = r->connection; + ap_filter_t *f; + old_write_filter_ctx *ctx; + + if (len == 0) + return APR_SUCCESS; + + /* future optimization: record some flags in the request_rec to + * say whether we've added our filter, and whether it is first. + */ + + /* this will typically exit on the first test */ + for (f = r->output_filters; f != NULL; f = f->next) { + if (ap_old_write_func == f->frec) + break; + } + + if (f == NULL) { + /* our filter hasn't been added yet */ + ctx = apr_pcalloc(r->pool, sizeof(*ctx)); + ap_add_output_filter("OLD_WRITE", ctx, r, r->connection); + f = r->output_filters; + } + + /* if the first filter is not our buffering filter, then we have to + * deliver the content through the normal filter chain + */ + if (f != r->output_filters) { + apr_bucket_brigade *bb = apr_brigade_create(r->pool, c->bucket_alloc); + apr_bucket *b = apr_bucket_transient_create(str, len, c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, b); + + return ap_pass_brigade(r->output_filters, bb); + } + + /* grab the context from our filter */ + ctx = r->output_filters->ctx; + + if (ctx->bb == NULL) { + ctx->bb = apr_brigade_create(r->pool, c->bucket_alloc); + } + + return ap_fwrite(f->next, ctx->bb, str, len); +} + +AP_DECLARE(int) ap_rputc(int c, request_rec *r) +{ + char c2 = (char)c; + + if (r->connection->aborted) { + return -1; + } + + if (buffer_output(r, &c2, 1) != APR_SUCCESS) + return -1; + + return c; +} + +AP_DECLARE(int) ap_rputs(const char *str, request_rec *r) +{ + apr_size_t len; + + if (r->connection->aborted) + return -1; + + if (buffer_output(r, str, len = strlen(str)) != APR_SUCCESS) + return -1; + + return len; +} + +AP_DECLARE(int) ap_rwrite(const void *buf, int nbyte, request_rec *r) +{ + if (r->connection->aborted) + return -1; + + if (buffer_output(r, buf, nbyte) != APR_SUCCESS) + return -1; + + return nbyte; +} + +struct ap_vrprintf_data { + apr_vformatter_buff_t vbuff; + request_rec *r; + char *buff; +}; + +static apr_status_t r_flush(apr_vformatter_buff_t *buff) +{ + /* callback function passed to ap_vformatter to be called when + * vformatter needs to write into buff and buff.curpos > buff.endpos */ + + /* ap_vrprintf_data passed as a apr_vformatter_buff_t, which is then + * "downcast" to an ap_vrprintf_data */ + struct ap_vrprintf_data *vd = (struct ap_vrprintf_data*)buff; + + if (vd->r->connection->aborted) + return -1; + + /* r_flush is called when vbuff is completely full */ + if (buffer_output(vd->r, vd->buff, AP_IOBUFSIZE)) { + return -1; + } + + /* reset the buffer position */ + vd->vbuff.curpos = vd->buff; + vd->vbuff.endpos = vd->buff + AP_IOBUFSIZE; + + return APR_SUCCESS; +} + +AP_DECLARE(int) ap_vrprintf(request_rec *r, const char *fmt, va_list va) +{ + apr_size_t written; + struct ap_vrprintf_data vd; + char vrprintf_buf[AP_IOBUFSIZE]; + + vd.vbuff.curpos = vrprintf_buf; + vd.vbuff.endpos = vrprintf_buf + AP_IOBUFSIZE; + vd.r = r; + vd.buff = vrprintf_buf; + + if (r->connection->aborted) + return -1; + + written = apr_vformatter(r_flush, &vd.vbuff, fmt, va); + + /* tack on null terminator on remaining string */ + *(vd.vbuff.curpos) = '\0'; + + if (written != -1) { + int n = vd.vbuff.curpos - vrprintf_buf; + + /* last call to buffer_output, to finish clearing the buffer */ + if (buffer_output(r, vrprintf_buf,n) != APR_SUCCESS) + return -1; + + written += n; + } + + return written; +} + +AP_DECLARE_NONSTD(int) ap_rprintf(request_rec *r, const char *fmt, ...) +{ + va_list va; + int n; + + if (r->connection->aborted) + return -1; + + va_start(va, fmt); + n = ap_vrprintf(r, fmt, va); + va_end(va); + + return n; +} + +AP_DECLARE_NONSTD(int) ap_rvputs(request_rec *r, ...) +{ + va_list va; + const char *s; + apr_size_t len; + apr_size_t written = 0; + + if (r->connection->aborted) + return -1; + + /* ### TODO: if the total output is large, put all the strings + * ### into a single brigade, rather than flushing each time we + * ### fill the buffer + */ + va_start(va, r); + while (1) { + s = va_arg(va, const char *); + if (s == NULL) + break; + + len = strlen(s); + if (buffer_output(r, s, len) != APR_SUCCESS) { + return -1; + } + + written += len; + } + va_end(va); + + return written; +} + +AP_DECLARE(int) ap_rflush(request_rec *r) +{ + conn_rec *c = r->connection; + apr_bucket_brigade *bb; + apr_bucket *b; + + bb = apr_brigade_create(r->pool, c->bucket_alloc); + b = apr_bucket_flush_create(c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, b); + if (ap_pass_brigade(r->output_filters, bb) != APR_SUCCESS) + return -1; + + return 0; +} + +/* + * This function sets the Last-Modified output header field to the value + * of the mtime field in the request structure - rationalized to keep it from + * being in the future. + */ +AP_DECLARE(void) ap_set_last_modified(request_rec *r) +{ + if (!r->assbackwards) { + apr_time_t mod_time = ap_rationalize_mtime(r, r->mtime); + char *datestr = apr_palloc(r->pool, APR_RFC822_DATE_LEN); + + apr_rfc822_date(datestr, mod_time); + apr_table_setn(r->headers_out, "Last-Modified", datestr); + } +} + +AP_IMPLEMENT_HOOK_RUN_ALL(int,post_read_request, + (request_rec *r), (r), OK, DECLINED) +AP_IMPLEMENT_HOOK_RUN_ALL(int,log_transaction, + (request_rec *r), (r), OK, DECLINED) +AP_IMPLEMENT_HOOK_RUN_FIRST(const char *,http_method, + (const request_rec *r), (r), NULL) +AP_IMPLEMENT_HOOK_RUN_FIRST(unsigned short,default_port, + (const request_rec *r), (r), 0) diff --git a/rubbos/app/httpd-2.0.64/server/protocol.lo b/rubbos/app/httpd-2.0.64/server/protocol.lo new file mode 100644 index 00000000..21aa3dda --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/protocol.lo @@ -0,0 +1,12 @@ +# protocol.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/protocol.o' + +# Name of the non-PIC object. +non_pic_object='protocol.o' + diff --git a/rubbos/app/httpd-2.0.64/server/protocol.o b/rubbos/app/httpd-2.0.64/server/protocol.o new file mode 100644 index 0000000000000000000000000000000000000000..dfe97714e4e65ee8a298bed258b2e6e0a27ffc8d GIT binary patch literal 116032 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
    Un5oy@MeJ?==RO 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 W)Q^eB2uH5Y?>2DuJ8$4TFaH6fSUJ7` literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/server/request.c b/rubbos/app/httpd-2.0.64/server/request.c new file mode 100644 index 00000000..ef3a3042 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/request.c @@ -0,0 +1,1888 @@ +/* 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. + */ + +/* + * http_request.c: functions to get and process requests + * + * Rob McCool 3/21/93 + * + * Thoroughly revamped by rst for Apache. NB this file reads + * best from the bottom up. + * + */ + +#include "apr_strings.h" +#include "apr_file_io.h" +#include "apr_fnmatch.h" + +#define APR_WANT_STRFUNC +#include "apr_want.h" + +#define CORE_PRIVATE +#include "ap_config.h" +#include "httpd.h" +#include "http_config.h" +#include "http_request.h" +#include "http_core.h" +#include "http_protocol.h" +#include "http_log.h" +#include "http_main.h" +#include "util_filter.h" +#include "util_charset.h" +#include "util_script.h" + +#include "mod_core.h" + +#if APR_HAVE_STDARG_H +#include +#endif + +APR_HOOK_STRUCT( + APR_HOOK_LINK(translate_name) + APR_HOOK_LINK(map_to_storage) + APR_HOOK_LINK(check_user_id) + APR_HOOK_LINK(fixups) + APR_HOOK_LINK(type_checker) + APR_HOOK_LINK(access_checker) + APR_HOOK_LINK(auth_checker) + APR_HOOK_LINK(insert_filter) + APR_HOOK_LINK(create_request) +) + +AP_IMPLEMENT_HOOK_RUN_FIRST(int,translate_name, + (request_rec *r), (r), DECLINED) +AP_IMPLEMENT_HOOK_RUN_FIRST(int,map_to_storage, + (request_rec *r), (r), DECLINED) +AP_IMPLEMENT_HOOK_RUN_FIRST(int,check_user_id, + (request_rec *r), (r), DECLINED) +AP_IMPLEMENT_HOOK_RUN_ALL(int,fixups, + (request_rec *r), (r), OK, DECLINED) +AP_IMPLEMENT_HOOK_RUN_FIRST(int,type_checker, + (request_rec *r), (r), DECLINED) +AP_IMPLEMENT_HOOK_RUN_ALL(int,access_checker, + (request_rec *r), (r), OK, DECLINED) +AP_IMPLEMENT_HOOK_RUN_FIRST(int,auth_checker, + (request_rec *r), (r), DECLINED) +AP_IMPLEMENT_HOOK_VOID(insert_filter, (request_rec *r), (r)) +AP_IMPLEMENT_HOOK_RUN_ALL(int, create_request, + (request_rec *r), (r), OK, DECLINED) + + +static int decl_die(int status, char *phase, request_rec *r) +{ + if (status == DECLINED) { + ap_log_rerror(APLOG_MARK, APLOG_CRIT, 0, r, + "configuration error: couldn't %s: %s", phase, r->uri); + return HTTP_INTERNAL_SERVER_ERROR; + } + else { + return status; + } +} + +/* This is the master logic for processing requests. Do NOT duplicate + * this logic elsewhere, or the security model will be broken by future + * API changes. Each phase must be individually optimized to pick up + * redundant/duplicate calls by subrequests, and redirects. + */ +AP_DECLARE(int) ap_process_request_internal(request_rec *r) +{ + int file_req = (r->main && r->filename); + int access_status; + + /* Ignore embedded %2F's in path for proxy requests */ + if (!r->proxyreq && r->parsed_uri.path) { + core_dir_config *d; + d = ap_get_module_config(r->per_dir_config, &core_module); + if (d->allow_encoded_slashes) { + access_status = ap_unescape_url_keep2f(r->parsed_uri.path); + } + else { + access_status = ap_unescape_url(r->parsed_uri.path); + } + if (access_status) { + if (access_status == HTTP_NOT_FOUND) { + if (! d->allow_encoded_slashes) { + ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r, + "found %%2f (encoded '/') in URI " + "(decoded='%s'), returning 404", + r->parsed_uri.path); + } + } + return access_status; + } + } + + ap_getparents(r->uri); /* OK --- shrinking transformations... */ + + /* All file subrequests are a huge pain... they cannot bubble through the + * next several steps. Only file subrequests are allowed an empty uri, + * otherwise let translate_name kill the request. + */ + if (!file_req) { + if ((access_status = ap_location_walk(r))) { + return access_status; + } + + if ((access_status = ap_run_translate_name(r))) { + return decl_die(access_status, "translate", r); + } + } + + /* Reset to the server default config prior to running map_to_storage + */ + r->per_dir_config = r->server->lookup_defaults; + + if ((access_status = ap_run_map_to_storage(r))) { + /* This request wasn't in storage (e.g. TRACE) */ + return access_status; + } + + /* Excluding file-specific requests with no 'true' URI... + */ + if (!file_req) { + /* Rerun the location walk, which overrides any map_to_storage config. + */ + if ((access_status = ap_location_walk(r))) { + return access_status; + } + } + + /* Only on the main request! */ + if (r->main == NULL) { + if ((access_status = ap_run_header_parser(r))) { + return access_status; + } + } + + /* Skip authn/authz if the parent or prior request passed the authn/authz, + * and that configuration didn't change (this requires optimized _walk() + * functions in map_to_storage that use the same merge results given + * identical input.) If the config changes, we must re-auth. + */ + if (r->main && (r->main->per_dir_config == r->per_dir_config)) { + r->user = r->main->user; + r->ap_auth_type = r->main->ap_auth_type; + } + else if (r->prev && (r->prev->per_dir_config == r->per_dir_config)) { + r->user = r->prev->user; + r->ap_auth_type = r->prev->ap_auth_type; + } + else { + switch (ap_satisfies(r)) { + case SATISFY_ALL: + case SATISFY_NOSPEC: + if ((access_status = ap_run_access_checker(r)) != 0) { + return decl_die(access_status, "check access", r); + } + + if (ap_some_auth_required(r)) { + if (((access_status = ap_run_check_user_id(r)) != 0) + || !ap_auth_type(r)) { + return decl_die(access_status, ap_auth_type(r) + ? "check user. No user file?" + : "perform authentication. AuthType not set!", + r); + } + + if (((access_status = ap_run_auth_checker(r)) != 0) + || !ap_auth_type(r)) { + return decl_die(access_status, ap_auth_type(r) + ? "check access. No groups file?" + : "perform authentication. AuthType not set!", + r); + } + } + break; + + case SATISFY_ANY: + if (((access_status = ap_run_access_checker(r)) != 0)) { + if (!ap_some_auth_required(r)) { + return decl_die(access_status, "check access", r); + } + + if (((access_status = ap_run_check_user_id(r)) != 0) + || !ap_auth_type(r)) { + return decl_die(access_status, ap_auth_type(r) + ? "check user. No user file?" + : "perform authentication. AuthType not set!", + r); + } + + if (((access_status = ap_run_auth_checker(r)) != 0) + || !ap_auth_type(r)) { + return decl_die(access_status, ap_auth_type(r) + ? "check access. No groups file?" + : "perform authentication. AuthType not set!", + r); + } + } + break; + } + } + /* XXX Must make certain the ap_run_type_checker short circuits mime + * in mod-proxy for r->proxyreq && r->parsed_uri.scheme + * && !strcmp(r->parsed_uri.scheme, "http") + */ + if ((access_status = ap_run_type_checker(r)) != 0) { + return decl_die(access_status, "find types", r); + } + + if ((access_status = ap_run_fixups(r)) != 0) { + return access_status; + } + + return OK; +} + + +/* Useful caching structures to repeat _walk/merge sequences as required + * when a subrequest or redirect reuses substantially the same config. + * + * Directive order in the httpd.conf file and its Includes significantly + * impact this optimization. Grouping common blocks at the front of the + * config that are less likely to change between a request and + * its subrequests, or between a request and its redirects reduced + * the work of these functions significantly. + */ + +typedef struct walk_walked_t { + ap_conf_vector_t *matched; /* A dir_conf sections we matched */ + ap_conf_vector_t *merged; /* The dir_conf merged result */ +} walk_walked_t; + +typedef struct walk_cache_t { + const char *cached; /* The identifier we matched */ + ap_conf_vector_t **dir_conf_tested; /* The sections we matched against */ + ap_conf_vector_t *dir_conf_merged; /* Base per_dir_config */ + ap_conf_vector_t *per_dir_result; /* per_dir_config += walked result */ + apr_array_header_t *walked; /* The list of walk_walked_t results */ +} walk_cache_t; + +static walk_cache_t *prep_walk_cache(apr_size_t t, request_rec *r) +{ + walk_cache_t *cache; + void **note; + + /* Find the most relevant, recent entry to work from. That would be + * this request (on the second call), or the parent request of a + * subrequest, or the prior request of an internal redirect. Provide + * this _walk()er with a copy it is allowed to munge. If there is no + * parent or prior cached request, then create a new walk cache. + */ + note = ap_get_request_note(r, t); + if (!note) { + return NULL; + } + + if (!(cache = *note)) { + void **inherit_note; + + if ((r->main + && ((inherit_note = ap_get_request_note(r->main, t))) + && *inherit_note) + || (r->prev + && ((inherit_note = ap_get_request_note(r->prev, t))) + && *inherit_note)) { + cache = apr_pmemdup(r->pool, *inherit_note, + sizeof(*cache)); + cache->walked = apr_array_copy(r->pool, cache->walked); + } + else { + cache = apr_pcalloc(r->pool, sizeof(*cache)); + cache->walked = apr_array_make(r->pool, 4, sizeof(walk_walked_t)); + } + + *note = cache; + } + return cache; +} + +/***************************************************************** + * + * Getting and checking directory configuration. Also checks the + * FollowSymlinks and FollowSymOwner stuff, since this is really the + * only place that can happen (barring a new mid_dir_walk callout). + * + * We can't do it as an access_checker module function which gets + * called with the final per_dir_config, since we could have a directory + * with FollowSymLinks disabled, which contains a symlink to another + * with a .htaccess file which turns FollowSymLinks back on --- and + * access in such a case must be denied. So, whatever it is that + * checks FollowSymLinks needs to know the state of the options as + * they change, all the way down. + */ + + +/* + * resolve_symlink must _always_ be called on an APR_LNK file type! + * It will resolve the actual target file type, modification date, etc, + * and provide any processing required for symlink evaluation. + * Path must already be cleaned, no trailing slash, no multi-slashes, + * and don't call this on the root! + * + * Simply, the number of times we deref a symlink are minimal compared + * to the number of times we had an extra lstat() since we 'weren't sure'. + * + * To optimize, we stat() anything when given (opts & OPT_SYM_LINKS), otherwise + * we start off with an lstat(). Every lstat() must be dereferenced in case + * it points at a 'nasty' - we must always rerun check_safe_file (or similar.) + */ +static int resolve_symlink(char *d, apr_finfo_t *lfi, int opts, apr_pool_t *p) +{ + apr_finfo_t fi; + int res; + const char *savename; + + if (!(opts & (OPT_SYM_OWNER | OPT_SYM_LINKS))) { + return HTTP_FORBIDDEN; + } + + /* Save the name from the valid bits. */ + savename = (lfi->valid & APR_FINFO_NAME) ? lfi->name : NULL; + + if (opts & OPT_SYM_LINKS) { + if ((res = apr_stat(&fi, d, lfi->valid & ~(APR_FINFO_NAME + | APR_FINFO_LINK), p)) + != APR_SUCCESS) { + return HTTP_FORBIDDEN; + } + + /* Give back the target */ + memcpy(lfi, &fi, sizeof(fi)); + if (savename) { + lfi->name = savename; + lfi->valid |= APR_FINFO_NAME; + } + + return OK; + } + + /* OPT_SYM_OWNER only works if we can get the owner of + * both the file and symlink. First fill in a missing + * owner of the symlink, then get the info of the target. + */ + if (!(lfi->valid & APR_FINFO_OWNER)) { + if ((res = apr_lstat(&fi, d, lfi->valid | APR_FINFO_OWNER, p)) + != APR_SUCCESS) { + return HTTP_FORBIDDEN; + } + } + + if ((res = apr_stat(&fi, d, lfi->valid & ~(APR_FINFO_NAME), p)) + != APR_SUCCESS) { + return HTTP_FORBIDDEN; + } + + if (apr_compare_users(fi.user, lfi->user) != APR_SUCCESS) { + return HTTP_FORBIDDEN; + } + + /* Give back the target */ + memcpy(lfi, &fi, sizeof(fi)); + if (savename) { + lfi->name = savename; + lfi->valid |= APR_FINFO_NAME; + } + + return OK; +} + + +/* + * As we walk the directory configuration, the merged config won't + * be 'rooted' to a specific vhost until the very end of the merge. + * + * We need a very fast mini-merge to a real, vhost-rooted merge + * of core.opts and core.override, the only options tested within + * directory_walk itself. + * + * See core.c::merge_core_dir_configs() for explanation. + */ + +typedef struct core_opts_t { + allow_options_t opts; + allow_options_t add; + allow_options_t remove; + overrides_t override; +} core_opts_t; + +static void core_opts_merge(const ap_conf_vector_t *sec, core_opts_t *opts) +{ + core_dir_config *this_dir = ap_get_module_config(sec, &core_module); + + if (!this_dir) { + return; + } + + if (this_dir->opts & OPT_UNSET) { + opts->add = (opts->add & ~this_dir->opts_remove) + | this_dir->opts_add; + opts->remove = (opts->remove & ~this_dir->opts_add) + | this_dir->opts_remove; + opts->opts = (opts->opts & ~opts->remove) | opts->add; + } + else { + opts->opts = this_dir->opts; + opts->add = this_dir->opts_add; + opts->remove = this_dir->opts_remove; + } + + if (!(this_dir->override & OR_UNSET)) { + opts->override = this_dir->override; + } +} + + +/***************************************************************** + * + * Getting and checking directory configuration. Also checks the + * FollowSymlinks and FollowSymOwner stuff, since this is really the + * only place that can happen (barring a new mid_dir_walk callout). + * + * We can't do it as an access_checker module function which gets + * called with the final per_dir_config, since we could have a directory + * with FollowSymLinks disabled, which contains a symlink to another + * with a .htaccess file which turns FollowSymLinks back on --- and + * access in such a case must be denied. So, whatever it is that + * checks FollowSymLinks needs to know the state of the options as + * they change, all the way down. + */ + +AP_DECLARE(int) ap_directory_walk(request_rec *r) +{ + ap_conf_vector_t *now_merged = NULL; + core_server_config *sconf = ap_get_module_config(r->server->module_config, + &core_module); + ap_conf_vector_t **sec_ent = (ap_conf_vector_t **) sconf->sec_dir->elts; + int num_sec = sconf->sec_dir->nelts; + walk_cache_t *cache; + char *entry_dir; + apr_status_t rv; + + /* XXX: Better (faster) tests needed!!! + * + * "OK" as a response to a real problem is not _OK_, but to allow broken + * modules to proceed, we will permit the not-a-path filename to pass the + * following two tests. This behavior may be revoked in future versions + * of Apache. We still must catch it later if it's heading for the core + * handler. Leave INFO notes here for module debugging. + */ + if (r->filename == NULL) { + ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r, + "Module bug? Request filename is missing for URI %s", + r->uri); + return OK; + } + + /* Canonicalize the file path without resolving filename case or aliases + * so we can begin by checking the cache for a recent directory walk. + * This call will ensure we have an absolute path in the same pass. + */ + if ((rv = apr_filepath_merge(&entry_dir, NULL, r->filename, + APR_FILEPATH_NOTRELATIVE, r->pool)) + != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r, + "Module bug? Request filename path %s is invalid or " + "or not absolute for uri %s", + r->filename, r->uri); + return OK; + } + + /* XXX Notice that this forces path_info to be canonical. That might + * not be desired by all apps. However, some of those same apps likely + * have significant security holes. + */ + r->filename = entry_dir; + + cache = prep_walk_cache(AP_NOTE_DIRECTORY_WALK, r); + + /* If this is not a dirent subrequest with a preconstructed + * r->finfo value, then we can simply stat the filename to + * save burning mega-cycles with unneeded stats - if this is + * an exact file match. We don't care about failure... we + * will stat by component failing this meager attempt. + * + * It would be nice to distinguish APR_ENOENT from other + * types of failure, such as APR_ENOTDIR. We can do something + * with APR_ENOENT, knowing that the path is good. + */ + if (!r->finfo.filetype || r->finfo.filetype == APR_LNK) { + rv = apr_stat(&r->finfo, r->filename, APR_FINFO_MIN, r->pool); + + /* some OSs will return APR_SUCCESS/APR_REG if we stat + * a regular file but we have '/' at the end of the name; + * + * other OSs will return APR_ENOTDIR for that situation; + * + * handle it the same everywhere by simulating a failure + * if it looks like a directory but really isn't + * + * Also reset if the stat failed, just for safety. + */ + if ((rv != APR_SUCCESS) || + (r->finfo.filetype && + (r->finfo.filetype != APR_DIR) && + (r->filename[strlen(r->filename) - 1] == '/'))) { + r->finfo.filetype = 0; /* forget what we learned */ + } + } + + if (r->finfo.filetype == APR_REG) { + entry_dir = ap_make_dirstr_parent(r->pool, entry_dir); + } + else if (r->filename[strlen(r->filename) - 1] != '/') { + entry_dir = apr_pstrcat(r->pool, r->filename, "/", NULL); + } + + /* If we have a file already matches the path of r->filename, + * and the vhost's list of directory sections hasn't changed, + * we can skip rewalking the directory_walk entries. + */ + if (cache->cached + && ((r->finfo.filetype == APR_REG) + || ((r->finfo.filetype == APR_DIR) + && (!r->path_info || !*r->path_info))) + && (cache->dir_conf_tested == sec_ent) + && (strcmp(entry_dir, cache->cached) == 0)) { + /* Well this looks really familiar! If our end-result (per_dir_result) + * didn't change, we have absolutely nothing to do :) + * Otherwise (as is the case with most dir_merged/file_merged requests) + * we must merge our dir_conf_merged onto this new r->per_dir_config. + */ + if (r->per_dir_config == cache->per_dir_result) { + return OK; + } + + if (r->per_dir_config == cache->dir_conf_merged) { + r->per_dir_config = cache->per_dir_result; + return OK; + } + + if (cache->walked->nelts) { + now_merged = ((walk_walked_t*)cache->walked->elts) + [cache->walked->nelts - 1].merged; + } + } + else { + /* We start now_merged from NULL since we want to build + * a locations list that can be merged to any vhost. + */ + int sec_idx; + int matches = cache->walked->nelts; + walk_walked_t *last_walk = (walk_walked_t*)cache->walked->elts; + core_dir_config *this_dir; + core_opts_t opts; + apr_finfo_t thisinfo; + char *save_path_info; + apr_size_t buflen; + char *buf; + unsigned int seg, startseg; + + /* Invariant: from the first time filename_len is set until + * it goes out of scope, filename_len==strlen(r->filename) + */ + apr_size_t filename_len; +#ifdef CASE_BLIND_FILESYSTEM + apr_size_t canonical_len; +#endif + + /* + * We must play our own mini-merge game here, for the few + * running dir_config values we care about within dir_walk. + * We didn't start the merge from r->per_dir_config, so we + * accumulate opts and override as we merge, from the globals. + */ + this_dir = ap_get_module_config(r->per_dir_config, &core_module); + opts.opts = this_dir->opts; + opts.add = this_dir->opts_add; + opts.remove = this_dir->opts_remove; + opts.override = this_dir->override; + + /* Set aside path_info to merge back onto path_info later. + * If r->filename is a directory, we must remerge the path_info, + * before we continue! [Directories cannot, by defintion, have + * path info. Either the next segment is not-found, or a file.] + * + * r->path_info tracks the unconsumed source path. + * r->filename tracks the path as we process it + */ + if ((r->finfo.filetype == APR_DIR) && r->path_info && *r->path_info) + { + if ((rv = apr_filepath_merge(&r->path_info, r->filename, + r->path_info, + APR_FILEPATH_NOTABOVEROOT, r->pool)) + != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + "dir_walk error, path_info %s is not relative " + "to the filename path %s for uri %s", + r->path_info, r->filename, r->uri); + return HTTP_INTERNAL_SERVER_ERROR; + } + + save_path_info = NULL; + } + else { + save_path_info = r->path_info; + r->path_info = r->filename; + } + +#ifdef CASE_BLIND_FILESYSTEM + + canonical_len = 0; + while (r->canonical_filename && r->canonical_filename[canonical_len] + && (r->canonical_filename[canonical_len] + == r->path_info[canonical_len])) { + ++canonical_len; + } + + while (canonical_len + && ((r->canonical_filename[canonical_len - 1] != '/' + && r->canonical_filename[canonical_len - 1]) + || (r->path_info[canonical_len - 1] != '/' + && r->path_info[canonical_len - 1]))) { + --canonical_len; + } + + /* + * Now build r->filename component by component, starting + * with the root (on Unix, simply "/"). We will make a huge + * assumption here for efficiency, that any canonical path + * already given included a canonical root. + */ + rv = apr_filepath_root((const char **)&r->filename, + (const char **)&r->path_info, + canonical_len ? 0 : APR_FILEPATH_TRUENAME, + r->pool); + filename_len = strlen(r->filename); + + /* + * Bad assumption above? If the root's length is longer + * than the canonical length, then it cannot be trusted as + * a truename. So try again, this time more seriously. + */ + if ((rv == APR_SUCCESS) && canonical_len + && (filename_len > canonical_len)) { + rv = apr_filepath_root((const char **)&r->filename, + (const char **)&r->path_info, + APR_FILEPATH_TRUENAME, r->pool); + filename_len = strlen(r->filename); + canonical_len = 0; + } + +#else /* ndef CASE_BLIND_FILESYSTEM, really this simple for Unix today; */ + + rv = apr_filepath_root((const char **)&r->filename, + (const char **)&r->path_info, + 0, r->pool); + filename_len = strlen(r->filename); + +#endif + + if (rv != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + "dir_walk error, could not determine the root " + "path of filename %s%s for uri %s", + r->filename, r->path_info, r->uri); + return HTTP_INTERNAL_SERVER_ERROR; + } + + /* Working space for terminating null and an extra / is required. + */ + buflen = filename_len + strlen(r->path_info) + 2; + buf = apr_palloc(r->pool, buflen); + memcpy(buf, r->filename, filename_len + 1); + r->filename = buf; + thisinfo.valid = APR_FINFO_TYPE; + thisinfo.filetype = APR_DIR; /* It's the root, of course it's a dir */ + + /* + * seg keeps track of which segment we've copied. + * sec_idx keeps track of which section we're on, since sections are + * ordered by number of segments. See core_reorder_directories + * startseg tells us how many segments describe the root path + * e.g. the complete path "//host/foo/" to a UNC share (4) + */ + startseg = seg = ap_count_dirs(r->filename); + sec_idx = 0; + + /* + * Go down the directory hierarchy. Where we have to check for + * symlinks, do so. Where a .htaccess file has permission to + * override anything, try to find one. + */ + do { + int res; + char *seg_name; + char *delim; + int temp_slash=0; + + /* We have no trailing slash, but we sure would appreciate one. + * However, we don't want to append a / our first time through. + */ + if ((seg > startseg) && r->filename[filename_len-1] != '/') { + r->filename[filename_len++] = '/'; + r->filename[filename_len] = 0; + temp_slash=1; + } + + /* Begin *this* level by looking for matching sections + * from the server config. + */ + for (; sec_idx < num_sec; ++sec_idx) { + + ap_conf_vector_t *entry_config = sec_ent[sec_idx]; + core_dir_config *entry_core; + entry_core = ap_get_module_config(entry_config, &core_module); + + /* No more possible matches for this many segments? + * We are done when we find relative/regex/longer components. + */ + if (entry_core->r || entry_core->d_components > seg) { + break; + } + + /* We will never skip '0' element components, e.g. plain old + * , and are classified as zero + * so that Win32/Netware/OS2 etc all pick them up. + * Otherwise, skip over the mismatches. + */ + if (entry_core->d_components + && ((entry_core->d_components < seg) + || (entry_core->d_is_fnmatch + ? (apr_fnmatch(entry_core->d, r->filename, + FNM_PATHNAME) != APR_SUCCESS) + : (strcmp(r->filename, entry_core->d) != 0)))) { + continue; + } + + /* If we haven't continue'd above, we have a match. + * + * Calculate our full-context core opts & override. + */ + core_opts_merge(sec_ent[sec_idx], &opts); + + /* If we merged this same section last time, reuse it + */ + if (matches) { + if (last_walk->matched == sec_ent[sec_idx]) { + now_merged = last_walk->merged; + ++last_walk; + --matches; + continue; + } + + /* We fell out of sync. This is our own copy of walked, + * so truncate the remaining matches and reset remaining. + */ + cache->walked->nelts -= matches; + matches = 0; + } + + if (now_merged) { + now_merged = ap_merge_per_dir_configs(r->pool, + now_merged, + sec_ent[sec_idx]); + } + else { + now_merged = sec_ent[sec_idx]; + } + + last_walk = (walk_walked_t*)apr_array_push(cache->walked); + last_walk->matched = sec_ent[sec_idx]; + last_walk->merged = now_merged; + } + + /* If .htaccess files are enabled, check for one, provided we + * have reached a real path. + */ + do { /* Not really a loop, just a break'able code block */ + + ap_conf_vector_t *htaccess_conf = NULL; + + /* No htaccess in an incomplete root path, + * nor if it's disabled + */ + if (seg < startseg || !opts.override) { + break; + } + + res = ap_parse_htaccess(&htaccess_conf, r, opts.override, + apr_pstrdup(r->pool, r->filename), + sconf->access_name); + if (res) { + return res; + } + + if (!htaccess_conf) { + break; + } + + /* If we are still here, we found our htaccess. + * + * Calculate our full-context core opts & override. + */ + core_opts_merge(htaccess_conf, &opts); + + /* If we merged this same htaccess last time, reuse it... + * this wouldn't work except that we cache the htaccess + * sections for the lifetime of the request, so we match + * the same conf. Good planning (no, pure luck ;) + */ + if (matches) { + if (last_walk->matched == htaccess_conf) { + now_merged = last_walk->merged; + ++last_walk; + --matches; + break; + } + + /* We fell out of sync. This is our own copy of walked, + * so truncate the remaining matches and reset + * remaining. + */ + cache->walked->nelts -= matches; + matches = 0; + } + + if (now_merged) { + now_merged = ap_merge_per_dir_configs(r->pool, + now_merged, + htaccess_conf); + } + else { + now_merged = htaccess_conf; + } + + last_walk = (walk_walked_t*)apr_array_push(cache->walked); + last_walk->matched = htaccess_conf; + last_walk->merged = now_merged; + + } while (0); /* Only one htaccess, not a real loop */ + + /* That temporary trailing slash was useful, now drop it. + */ + if (temp_slash) { + r->filename[--filename_len] = '\0'; + } + + /* Time for all good things to come to an end? + */ + if (!r->path_info || !*r->path_info) { + break; + } + + /* Now it's time for the next segment... + * We will assume the next element is an end node, and fix it up + * below as necessary... + */ + + seg_name = r->filename + filename_len; + delim = strchr(r->path_info + (*r->path_info == '/' ? 1 : 0), '/'); + if (delim) { + size_t path_info_len = delim - r->path_info; + *delim = '\0'; + memcpy(seg_name, r->path_info, path_info_len + 1); + filename_len += path_info_len; + r->path_info = delim; + *delim = '/'; + } + else { + size_t path_info_len = strlen(r->path_info); + memcpy(seg_name, r->path_info, path_info_len + 1); + filename_len += path_info_len; + r->path_info += path_info_len; + } + if (*seg_name == '/') + ++seg_name; + + /* If nothing remained but a '/' string, we are finished + */ + if (!*seg_name) { + break; + } + + /* First optimization; + * If...we knew r->filename was a file, and + * if...we have strict (case-sensitive) filenames, or + * we know the canonical_filename matches to _this_ name, and + * if...we have allowed symlinks + * skip the lstat and dummy up an APR_DIR value for thisinfo. + */ + if (r->finfo.filetype +#ifdef CASE_BLIND_FILESYSTEM + && (filename_len <= canonical_len) +#endif + && ((opts.opts & (OPT_SYM_OWNER | OPT_SYM_LINKS)) == OPT_SYM_LINKS)) + { + + thisinfo.filetype = APR_DIR; + ++seg; + continue; + } + + /* We choose apr_lstat here, rather that apr_stat, so that we + * capture this path object rather than its target. We will + * replace the info with our target's info below. We especially + * want the name of this 'link' object, not the name of its + * target, if we are fixing the filename case/resolving aliases. + */ + rv = apr_lstat(&thisinfo, r->filename, + APR_FINFO_MIN | APR_FINFO_NAME, r->pool); + + if (APR_STATUS_IS_ENOENT(rv)) { + /* Nothing? That could be nice. But our directory + * walk is done. + */ + thisinfo.filetype = APR_NOFILE; + break; + } + else if (APR_STATUS_IS_EACCES(rv)) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + "access to %s denied", r->uri); + return r->status = HTTP_FORBIDDEN; + } + else if ((rv != APR_SUCCESS && rv != APR_INCOMPLETE) + || !(thisinfo.valid & APR_FINFO_TYPE)) { + /* If we hit ENOTDIR, we must have over-optimized, deny + * rather than assume not found. + */ + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + "access to %s failed", r->uri); + return r->status = HTTP_FORBIDDEN; + } + + /* Fix up the path now if we have a name, and they don't agree + */ + if ((thisinfo.valid & APR_FINFO_NAME) + && strcmp(seg_name, thisinfo.name)) { + /* TODO: provide users an option that an internal/external + * redirect is required here? We need to walk the URI and + * filename in tandem to properly correlate these. + */ + strcpy(seg_name, thisinfo.name); + filename_len = strlen(r->filename); + } + + if (thisinfo.filetype == APR_LNK) { + /* Is this a possibly acceptable symlink? + */ + if ((res = resolve_symlink(r->filename, &thisinfo, + opts.opts, r->pool)) != OK) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Symbolic link not allowed: %s", + r->filename); + return r->status = res; + } + } + + /* Ok, we are done with the link's info, test the real target + */ + if (thisinfo.filetype == APR_REG || + thisinfo.filetype == APR_NOFILE) { + /* That was fun, nothing left for us here + */ + break; + } + else if (thisinfo.filetype != APR_DIR) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Forbidden: %s doesn't point to " + "a file or directory", + r->filename); + return r->status = HTTP_FORBIDDEN; + } + + ++seg; + } while (thisinfo.filetype == APR_DIR); + + /* If we have _not_ optimized, this is the time to recover + * the final stat result. + */ + if (!r->finfo.filetype || r->finfo.filetype == APR_LNK) { + r->finfo = thisinfo; + } + + /* Now splice the saved path_info back onto any new path_info + */ + if (save_path_info) { + if (r->path_info && *r->path_info) { + r->path_info = ap_make_full_path(r->pool, r->path_info, + save_path_info); + } + else { + r->path_info = save_path_info; + } + } + + /* + * Now we'll deal with the regexes, note we pick up sec_idx + * where we left off (we gave up after we hit entry_core->r) + */ + for (; sec_idx < num_sec; ++sec_idx) { + + core_dir_config *entry_core; + entry_core = ap_get_module_config(sec_ent[sec_idx], &core_module); + + if (!entry_core->r) { + continue; + } + + if (ap_regexec(entry_core->r, r->filename, 0, NULL, REG_NOTEOL)) { + continue; + } + + /* If we haven't already continue'd above, we have a match. + * + * Calculate our full-context core opts & override. + */ + core_opts_merge(sec_ent[sec_idx], &opts); + + /* If we merged this same section last time, reuse it + */ + if (matches) { + if (last_walk->matched == sec_ent[sec_idx]) { + now_merged = last_walk->merged; + ++last_walk; + --matches; + continue; + } + + /* We fell out of sync. This is our own copy of walked, + * so truncate the remaining matches and reset remaining. + */ + cache->walked->nelts -= matches; + matches = 0; + } + + if (now_merged) { + now_merged = ap_merge_per_dir_configs(r->pool, + now_merged, + sec_ent[sec_idx]); + } + else { + now_merged = sec_ent[sec_idx]; + } + + last_walk = (walk_walked_t*)apr_array_push(cache->walked); + last_walk->matched = sec_ent[sec_idx]; + last_walk->merged = now_merged; + } + + /* Whoops - everything matched in sequence, but the original walk + * found some additional matches. Truncate them. + */ + if (matches) { + cache->walked->nelts -= matches; + } + } + +/* It seems this shouldn't be needed anymore. We translated the + x symlink above into a real resource, and should have died up there. + x Even if we keep this, it needs more thought (maybe an r->file_is_symlink) + x perhaps it should actually happen in file_walk, so we catch more + x obscure cases in autoindex subrequests, etc. + x + x * Symlink permissions are determined by the parent. If the request is + x * for a directory then applying the symlink test here would use the + x * permissions of the directory as opposed to its parent. Consider a + x * symlink pointing to a dir with a .htaccess disallowing symlinks. If + x * you access /symlink (or /symlink/) you would get a 403 without this + x * APR_DIR test. But if you accessed /symlink/index.html, for example, + x * you would *not* get the 403. + x + x if (r->finfo.filetype != APR_DIR + x && (res = resolve_symlink(r->filename, r->info, ap_allow_options(r), + x r->pool))) { + x ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + x "Symbolic link not allowed: %s", r->filename); + x return res; + x } + */ + + /* Save future sub-requestors much angst in processing + * this subrequest. If dir_walk couldn't canonicalize + * the file path, nothing can. + */ + r->canonical_filename = r->filename; + + if (r->finfo.filetype == APR_DIR) { + cache->cached = r->filename; + } + else { + cache->cached = ap_make_dirstr_parent(r->pool, r->filename); + } + + cache->dir_conf_tested = sec_ent; + cache->dir_conf_merged = r->per_dir_config; + + /* Merge our cache->dir_conf_merged construct with the r->per_dir_configs, + * and note the end result to (potentially) skip this step next time. + */ + if (now_merged) { + r->per_dir_config = ap_merge_per_dir_configs(r->pool, + r->per_dir_config, + now_merged); + } + cache->per_dir_result = r->per_dir_config; + + return OK; +} + + +AP_DECLARE(int) ap_location_walk(request_rec *r) +{ + ap_conf_vector_t *now_merged = NULL; + core_server_config *sconf = ap_get_module_config(r->server->module_config, + &core_module); + ap_conf_vector_t **sec_ent = (ap_conf_vector_t **)sconf->sec_url->elts; + int num_sec = sconf->sec_url->nelts; + walk_cache_t *cache; + const char *entry_uri; + + /* No tricks here, there are no to parse in this vhost. + * We won't destroy the cache, just in case _this_ redirect is later + * redirected again to a vhost with blocks to optimize. + */ + if (!num_sec) { + return OK; + } + + cache = prep_walk_cache(AP_NOTE_LOCATION_WALK, r); + + /* Location and LocationMatch differ on their behaviour w.r.t. multiple + * slashes. Location matches multiple slashes with a single slash, + * LocationMatch doesn't. An exception, for backwards brokenness is + * absoluteURIs... in which case neither match multiple slashes. + */ + if (r->uri[0] != '/') { + entry_uri = r->uri; + } + else { + char *uri = apr_pstrdup(r->pool, r->uri); + ap_no2slash(uri); + entry_uri = uri; + } + + /* If we have an cache->cached location that matches r->uri, + * and the vhost's list of locations hasn't changed, we can skip + * rewalking the location_walk entries. + */ + if (cache->cached + && (cache->dir_conf_tested == sec_ent) + && (strcmp(entry_uri, cache->cached) == 0)) { + /* Well this looks really familiar! If our end-result (per_dir_result) + * didn't change, we have absolutely nothing to do :) + * Otherwise (as is the case with most dir_merged/file_merged requests) + * we must merge our dir_conf_merged onto this new r->per_dir_config. + */ + if (r->per_dir_config == cache->per_dir_result) { + return OK; + } + + if (r->per_dir_config == cache->dir_conf_merged) { + r->per_dir_config = cache->per_dir_result; + return OK; + } + + if (cache->walked->nelts) { + now_merged = ((walk_walked_t*)cache->walked->elts) + [cache->walked->nelts - 1].merged; + } + } + else { + /* We start now_merged from NULL since we want to build + * a locations list that can be merged to any vhost. + */ + int len, sec_idx; + int matches = cache->walked->nelts; + walk_walked_t *last_walk = (walk_walked_t*)cache->walked->elts; + cache->cached = entry_uri; + + /* Go through the location entries, and check for matches. + * We apply the directive sections in given order, we should + * really try them with the most general first. + */ + for (sec_idx = 0; sec_idx < num_sec; ++sec_idx) { + + core_dir_config *entry_core; + entry_core = ap_get_module_config(sec_ent[sec_idx], &core_module); + + /* ### const strlen can be optimized in location config parsing */ + len = strlen(entry_core->d); + + /* Test the regex, fnmatch or string as appropriate. + * If it's a strcmp, and the pattern was + * not slash terminated, then this uri must be slash + * terminated (or at the end of the string) to match. + */ + if (entry_core->r + ? ap_regexec(entry_core->r, r->uri, 0, NULL, 0) + : (entry_core->d_is_fnmatch + ? apr_fnmatch(entry_core->d, cache->cached, FNM_PATHNAME) + : (strncmp(entry_core->d, cache->cached, len) + || (entry_core->d[len - 1] != '/' + && cache->cached[len] != '/' + && cache->cached[len] != '\0')))) { + continue; + } + + /* If we merged this same section last time, reuse it + */ + if (matches) { + if (last_walk->matched == sec_ent[sec_idx]) { + now_merged = last_walk->merged; + ++last_walk; + --matches; + continue; + } + + /* We fell out of sync. This is our own copy of walked, + * so truncate the remaining matches and reset remaining. + */ + cache->walked->nelts -= matches; + matches = 0; + } + + if (now_merged) { + now_merged = ap_merge_per_dir_configs(r->pool, + now_merged, + sec_ent[sec_idx]); + } + else { + now_merged = sec_ent[sec_idx]; + } + + last_walk = (walk_walked_t*)apr_array_push(cache->walked); + last_walk->matched = sec_ent[sec_idx]; + last_walk->merged = now_merged; + } + + /* Whoops - everything matched in sequence, but the original walk + * found some additional matches. Truncate them. + */ + if (matches) { + cache->walked->nelts -= matches; + } + } + + cache->dir_conf_tested = sec_ent; + cache->dir_conf_merged = r->per_dir_config; + + /* Merge our cache->dir_conf_merged construct with the r->per_dir_configs, + * and note the end result to (potentially) skip this step next time. + */ + if (now_merged) { + r->per_dir_config = ap_merge_per_dir_configs(r->pool, + r->per_dir_config, + now_merged); + } + cache->per_dir_result = r->per_dir_config; + + return OK; +} + +AP_DECLARE(int) ap_file_walk(request_rec *r) +{ + ap_conf_vector_t *now_merged = NULL; + core_dir_config *dconf = ap_get_module_config(r->per_dir_config, + &core_module); + ap_conf_vector_t **sec_ent = (ap_conf_vector_t **)dconf->sec_file->elts; + int num_sec = dconf->sec_file->nelts; + walk_cache_t *cache; + const char *test_file; + + /* To allow broken modules to proceed, we allow missing filenames to pass. + * We will catch it later if it's heading for the core handler. + * directory_walk already posted an INFO note for module debugging. + */ + if (r->filename == NULL) { + return OK; + } + + cache = prep_walk_cache(AP_NOTE_FILE_WALK, r); + + /* No tricks here, there are just no to parse in this context. + * We won't destroy the cache, just in case _this_ redirect is later + * redirected again to a context containing the same or similar . + */ + if (!num_sec) { + return OK; + } + + /* Get the basename .. and copy for the cache just + * in case r->filename is munged by another module + */ + test_file = strrchr(r->filename, '/'); + if (test_file == NULL) { + test_file = apr_pstrdup(r->pool, r->filename); + } + else { + test_file = apr_pstrdup(r->pool, ++test_file); + } + + /* If we have an cache->cached file name that matches test_file, + * and the directory's list of file sections hasn't changed, we + * can skip rewalking the file_walk entries. + */ + if (cache->cached + && (cache->dir_conf_tested == sec_ent) + && (strcmp(test_file, cache->cached) == 0)) { + /* Well this looks really familiar! If our end-result (per_dir_result) + * didn't change, we have absolutely nothing to do :) + * Otherwise (as is the case with most dir_merged requests) + * we must merge our dir_conf_merged onto this new r->per_dir_config. + */ + if (r->per_dir_config == cache->per_dir_result) { + return OK; + } + + if (r->per_dir_config == cache->dir_conf_merged) { + r->per_dir_config = cache->per_dir_result; + return OK; + } + + if (cache->walked->nelts) { + now_merged = ((walk_walked_t*)cache->walked->elts) + [cache->walked->nelts - 1].merged; + } + } + else { + /* We start now_merged from NULL since we want to build + * a file section list that can be merged to any dir_walk. + */ + int sec_idx; + int matches = cache->walked->nelts; + walk_walked_t *last_walk = (walk_walked_t*)cache->walked->elts; + cache->cached = test_file; + + /* Go through the location entries, and check for matches. + * We apply the directive sections in given order, we should + * really try them with the most general first. + */ + for (sec_idx = 0; sec_idx < num_sec; ++sec_idx) { + + core_dir_config *entry_core; + entry_core = ap_get_module_config(sec_ent[sec_idx], &core_module); + + if (entry_core->r + ? ap_regexec(entry_core->r, cache->cached , 0, NULL, 0) + : (entry_core->d_is_fnmatch + ? apr_fnmatch(entry_core->d, cache->cached, FNM_PATHNAME) + : strcmp(entry_core->d, cache->cached))) { + continue; + } + + /* If we merged this same section last time, reuse it + */ + if (matches) { + if (last_walk->matched == sec_ent[sec_idx]) { + now_merged = last_walk->merged; + ++last_walk; + --matches; + continue; + } + + /* We fell out of sync. This is our own copy of walked, + * so truncate the remaining matches and reset remaining. + */ + cache->walked->nelts -= matches; + matches = 0; + } + + if (now_merged) { + now_merged = ap_merge_per_dir_configs(r->pool, + now_merged, + sec_ent[sec_idx]); + } + else { + now_merged = sec_ent[sec_idx]; + } + + last_walk = (walk_walked_t*)apr_array_push(cache->walked); + last_walk->matched = sec_ent[sec_idx]; + last_walk->merged = now_merged; + } + + /* Whoops - everything matched in sequence, but the original walk + * found some additional matches. Truncate them. + */ + if (matches) { + cache->walked->nelts -= matches; + } + } + + cache->dir_conf_tested = sec_ent; + cache->dir_conf_merged = r->per_dir_config; + + /* Merge our cache->dir_conf_merged construct with the r->per_dir_configs, + * and note the end result to (potentially) skip this step next time. + */ + if (now_merged) { + r->per_dir_config = ap_merge_per_dir_configs(r->pool, + r->per_dir_config, + now_merged); + } + cache->per_dir_result = r->per_dir_config; + + return OK; +} + +/***************************************************************** + * + * The sub_request mechanism. + * + * Fns to look up a relative URI from, e.g., a map file or SSI document. + * These do all access checks, etc., but don't actually run the transaction + * ... use run_sub_req below for that. Also, be sure to use destroy_sub_req + * as appropriate if you're likely to be creating more than a few of these. + * (An early Apache version didn't destroy the sub_reqs used in directory + * indexing. The result, when indexing a directory with 800-odd files in + * it, was massively excessive storage allocation). + * + * Note more manipulation of protocol-specific vars in the request + * structure... + */ + +static request_rec *make_sub_request(const request_rec *r, + ap_filter_t *next_filter) +{ + apr_pool_t *rrp; + request_rec *rnew; + + apr_pool_create(&rrp, r->pool); + apr_pool_tag(rrp, "subrequest"); + rnew = apr_pcalloc(rrp, sizeof(request_rec)); + rnew->pool = rrp; + + rnew->hostname = r->hostname; + rnew->request_time = r->request_time; + rnew->connection = r->connection; + rnew->server = r->server; + + rnew->request_config = ap_create_request_config(rnew->pool); + + /* Start a clean config from this subrequest's vhost. Optimization in + * Location/File/Dir walks from the parent request assure that if the + * config blocks of the subrequest match the parent request, no merges + * will actually occur (and generally a minimal number of merges are + * required, even if the parent and subrequest aren't quite identical.) + */ + rnew->per_dir_config = r->server->lookup_defaults; + + rnew->htaccess = r->htaccess; + rnew->allowed_methods = ap_make_method_list(rnew->pool, 2); + + /* make a copy of the allowed-methods list */ + ap_copy_method_list(rnew->allowed_methods, r->allowed_methods); + + /* start with the same set of output filters */ + if (next_filter) { + /* while there are no input filters for a subrequest, we will + * try to insert some, so if we don't have valid data, the code + * will seg fault. + */ + rnew->input_filters = r->input_filters; + rnew->proto_input_filters = r->proto_input_filters; + rnew->output_filters = next_filter; + rnew->proto_output_filters = r->proto_output_filters; + ap_add_output_filter_handle(ap_subreq_core_filter_handle, + NULL, rnew, rnew->connection); + } + else { + /* If NULL - we are expecting to be internal_fast_redirect'ed + * to this subrequest - or this request will never be invoked. + * Ignore the original request filter stack entirely, and + * drill the input and output stacks back to the connection. + */ + rnew->proto_input_filters = r->proto_input_filters; + rnew->proto_output_filters = r->proto_output_filters; + + rnew->input_filters = r->proto_input_filters; + rnew->output_filters = r->proto_output_filters; + } + + /* no input filters for a subrequest */ + + ap_set_sub_req_protocol(rnew, r); + + /* We have to run this after we fill in sub req vars, + * or the r->main pointer won't be setup + */ + ap_run_create_request(rnew); + + return rnew; +} + +AP_CORE_DECLARE_NONSTD(apr_status_t) ap_sub_req_output_filter(ap_filter_t *f, + apr_bucket_brigade *bb) +{ + apr_bucket *e = APR_BRIGADE_LAST(bb); + + if (APR_BUCKET_IS_EOS(e)) { + apr_bucket_delete(e); + } + + if (!APR_BRIGADE_EMPTY(bb)) { + return ap_pass_brigade(f->next, bb); + } + + return APR_SUCCESS; +} + + +AP_DECLARE(int) ap_some_auth_required(request_rec *r) +{ + /* Is there a require line configured for the type of *this* req? */ + + const apr_array_header_t *reqs_arr = ap_requires(r); + require_line *reqs; + int i; + + if (!reqs_arr) { + return 0; + } + + reqs = (require_line *) reqs_arr->elts; + + for (i = 0; i < reqs_arr->nelts; ++i) { + if (reqs[i].method_mask & (AP_METHOD_BIT << r->method_number)) { + return 1; + } + } + + return 0; +} + + +AP_DECLARE(request_rec *) ap_sub_req_method_uri(const char *method, + const char *new_uri, + const request_rec *r, + ap_filter_t *next_filter) +{ + request_rec *rnew; + int res; + char *udir; + + rnew = make_sub_request(r, next_filter); + + /* would be nicer to pass "method" to ap_set_sub_req_protocol */ + rnew->method = method; + rnew->method_number = ap_method_number_of(method); + + if (new_uri[0] == '/') { + ap_parse_uri(rnew, new_uri); + } + else { + udir = ap_make_dirstr_parent(rnew->pool, r->uri); + udir = ap_escape_uri(rnew->pool, udir); /* re-escape it */ + ap_parse_uri(rnew, ap_make_full_path(rnew->pool, udir, new_uri)); + } + + /* We cannot return NULL without violating the API. So just turn this + * subrequest into a 500 to indicate the failure. */ + if (ap_is_recursion_limit_exceeded(r)) { + rnew->status = HTTP_INTERNAL_SERVER_ERROR; + return rnew; + } + + /* lookup_uri + * If the content can be served by the quick_handler, we can + * safely bypass request_internal processing. + */ + res = ap_run_quick_handler(rnew, 1); + + if (res != OK) { + if ((res = ap_process_request_internal(rnew))) { + rnew->status = res; + } + } + + return rnew; +} + +AP_DECLARE(request_rec *) ap_sub_req_lookup_uri(const char *new_uri, + const request_rec *r, + ap_filter_t *next_filter) +{ + return ap_sub_req_method_uri("GET", new_uri, r, next_filter); +} + +AP_DECLARE(request_rec *) ap_sub_req_lookup_dirent(const apr_finfo_t *dirent, + const request_rec *r, + int subtype, + ap_filter_t *next_filter) +{ + request_rec *rnew; + int res; + char *fdir; + char *udir; + + rnew = make_sub_request(r, next_filter); + + /* Special case: we are looking at a relative lookup in the same directory. + * This is 100% safe, since dirent->name just came from the filesystem. + */ + if (r->path_info && *r->path_info) { + /* strip path_info off the end of the uri to keep it in sync + * with r->filename, which has already been stripped by directory_walk, + * merge the dirent->name, and then, if the caller wants us to remerge + * the original path info, do so. Note we never fix the path_info back + * to r->filename, since dir_walk would do so (but we don't expect it + * to happen in the usual cases) + */ + udir = apr_pstrdup(rnew->pool, r->uri); + udir[ap_find_path_info(udir, r->path_info)] = '\0'; + udir = ap_make_dirstr_parent(rnew->pool, udir); + + rnew->uri = ap_make_full_path(rnew->pool, udir, dirent->name); + if (subtype == AP_SUBREQ_MERGE_ARGS) { + rnew->uri = ap_make_full_path(rnew->pool, rnew->uri, r->path_info + 1); + rnew->path_info = apr_pstrdup(rnew->pool, r->path_info); + } + rnew->uri = ap_escape_uri(rnew->pool, rnew->uri); + } + else { + udir = ap_make_dirstr_parent(rnew->pool, r->uri); + rnew->uri = ap_escape_uri(rnew->pool, ap_make_full_path(rnew->pool, + udir, + dirent->name)); + } + + fdir = ap_make_dirstr_parent(rnew->pool, r->filename); + rnew->filename = ap_make_full_path(rnew->pool, fdir, dirent->name); + if (r->canonical_filename == r->filename) { + rnew->canonical_filename = rnew->filename; + } + + /* XXX This is now less relevant; we will do a full location walk + * these days for this case. Preserve the apr_stat results, and + * perhaps we also tag that symlinks were tested and/or found for + * r->filename. + */ + rnew->per_dir_config = r->server->lookup_defaults; + + if ((dirent->valid & APR_FINFO_MIN) != APR_FINFO_MIN) { + /* + * apr_dir_read isn't very complete on this platform, so + * we need another apr_lstat (or simply apr_stat if we allow + * all symlinks here.) If this is an APR_LNK that resolves + * to an APR_DIR, then we will rerun everything anyways... + * this should be safe. + */ + apr_status_t rv; + if (ap_allow_options(rnew) & OPT_SYM_LINKS) { + if (((rv = apr_stat(&rnew->finfo, rnew->filename, + APR_FINFO_MIN, rnew->pool)) != APR_SUCCESS) + && (rv != APR_INCOMPLETE)) { + rnew->finfo.filetype = 0; + } + } + else { + if (((rv = apr_lstat(&rnew->finfo, rnew->filename, + APR_FINFO_MIN, rnew->pool)) != APR_SUCCESS) + && (rv != APR_INCOMPLETE)) { + rnew->finfo.filetype = 0; + } + } + } + else { + memcpy(&rnew->finfo, dirent, sizeof(apr_finfo_t)); + } + + if (rnew->finfo.filetype == APR_LNK) { + /* + * Resolve this symlink. We should tie this back to dir_walk's cache + */ + if ((res = resolve_symlink(rnew->filename, &rnew->finfo, + ap_allow_options(rnew), rnew->pool)) + != OK) { + rnew->status = res; + return rnew; + } + } + + if (rnew->finfo.filetype == APR_DIR) { + /* ap_make_full_path overallocated the buffers + * by one character to help us out here. + */ + strcpy(rnew->filename + strlen(rnew->filename), "/"); + if (!rnew->path_info || !*rnew->path_info) { + strcpy(rnew->uri + strlen(rnew->uri ), "/"); + } + } + + /* fill in parsed_uri values + */ + if (r->args && *r->args && (subtype == AP_SUBREQ_MERGE_ARGS)) { + ap_parse_uri(rnew, apr_pstrcat(r->pool, rnew->uri, "?", + r->args, NULL)); + } + else { + ap_parse_uri(rnew, rnew->uri); + } + + /* We cannot return NULL without violating the API. So just turn this + * subrequest into a 500. */ + if (ap_is_recursion_limit_exceeded(r)) { + rnew->status = HTTP_INTERNAL_SERVER_ERROR; + return rnew; + } + + if ((res = ap_process_request_internal(rnew))) { + rnew->status = res; + } + + return rnew; +} + +AP_DECLARE(request_rec *) ap_sub_req_lookup_file(const char *new_file, + const request_rec *r, + ap_filter_t *next_filter) +{ + request_rec *rnew; + int res; + char *fdir; + apr_size_t fdirlen; + + rnew = make_sub_request(r, next_filter); + + fdir = ap_make_dirstr_parent(rnew->pool, r->filename); + fdirlen = strlen(fdir); + + /* Translate r->filename, if it was canonical, it stays canonical + */ + if (r->canonical_filename == r->filename) { + rnew->canonical_filename = (char*)(1); + } + + if (apr_filepath_merge(&rnew->filename, fdir, new_file, + APR_FILEPATH_TRUENAME, rnew->pool) != APR_SUCCESS) { + rnew->status = HTTP_FORBIDDEN; + return rnew; + } + + if (rnew->canonical_filename) { + rnew->canonical_filename = rnew->filename; + } + + /* + * Check for a special case... if there are no '/' characters in new_file + * at all, and the path was the same, then we are looking at a relative + * lookup in the same directory. Fixup the URI to match. + */ + + if (strncmp(rnew->filename, fdir, fdirlen) == 0 + && rnew->filename[fdirlen] + && ap_strchr_c(rnew->filename + fdirlen, '/') == NULL) { + apr_status_t rv; + if (ap_allow_options(rnew) & OPT_SYM_LINKS) { + if (((rv = apr_stat(&rnew->finfo, rnew->filename, + APR_FINFO_MIN, rnew->pool)) != APR_SUCCESS) + && (rv != APR_INCOMPLETE)) { + rnew->finfo.filetype = 0; + } + } + else { + if (((rv = apr_lstat(&rnew->finfo, rnew->filename, + APR_FINFO_MIN, rnew->pool)) != APR_SUCCESS) + && (rv != APR_INCOMPLETE)) { + rnew->finfo.filetype = 0; + } + } + + if (r->uri && *r->uri) { + char *udir = ap_make_dirstr_parent(rnew->pool, r->uri); + rnew->uri = ap_make_full_path(rnew->pool, udir, + rnew->filename + fdirlen); + ap_parse_uri(rnew, rnew->uri); /* fill in parsed_uri values */ + } + else { + ap_parse_uri(rnew, new_file); /* fill in parsed_uri values */ + rnew->uri = apr_pstrdup(rnew->pool, ""); + } + } + else { + /* XXX: @@@: What should be done with the parsed_uri values? + * We would be better off stripping down to the 'common' elements + * of the path, then reassembling the URI as best as we can. + */ + ap_parse_uri(rnew, new_file); /* fill in parsed_uri values */ + /* + * XXX: this should be set properly like it is in the same-dir case + * but it's actually sometimes to impossible to do it... because the + * file may not have a uri associated with it -djg + */ + rnew->uri = apr_pstrdup(rnew->pool, ""); + } + + /* We cannot return NULL without violating the API. So just turn this + * subrequest into a 500. */ + if (ap_is_recursion_limit_exceeded(r)) { + rnew->status = HTTP_INTERNAL_SERVER_ERROR; + return rnew; + } + + if ((res = ap_process_request_internal(rnew))) { + rnew->status = res; + } + + return rnew; +} + +AP_DECLARE(int) ap_run_sub_req(request_rec *r) +{ + int retval = DECLINED; + /* Run the quick handler if the subrequest is not a dirent or file + * subrequest + */ + if (!(r->filename && r->finfo.filetype)) { + retval = ap_run_quick_handler(r, 0); + } + if (retval != OK) { + retval = ap_invoke_handler(r); + if (retval == DONE) { + retval = OK; + } + } + ap_finalize_sub_req_protocol(r); + return retval; +} + +AP_DECLARE(void) ap_destroy_sub_req(request_rec *r) +{ + /* Reclaim the space */ + apr_pool_destroy(r->pool); +} + +/* + * Function to set the r->mtime field to the specified value if it's later + * than what's already there. + */ +AP_DECLARE(void) ap_update_mtime(request_rec *r, apr_time_t dependency_mtime) +{ + if (r->mtime < dependency_mtime) { + r->mtime = dependency_mtime; + } +} + +/* + * Is it the initial main request, which we only get *once* per HTTP request? + */ +AP_DECLARE(int) ap_is_initial_req(request_rec *r) +{ + return (r->main == NULL) /* otherwise, this is a sub-request */ + && (r->prev == NULL); /* otherwise, this is an internal redirect */ +} diff --git a/rubbos/app/httpd-2.0.64/server/request.lo b/rubbos/app/httpd-2.0.64/server/request.lo new file mode 100644 index 00000000..e7751975 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/request.lo @@ -0,0 +1,12 @@ +# request.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/request.o' + +# Name of the non-PIC object. +non_pic_object='request.o' + diff --git a/rubbos/app/httpd-2.0.64/server/request.o b/rubbos/app/httpd-2.0.64/server/request.o new file mode 100644 index 0000000000000000000000000000000000000000..136bd10ad8a7350b83a442a44ead6f46b4dd7f8a GIT binary patch literal 124336 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/server/rfc1413.c b/rubbos/app/httpd-2.0.64/server/rfc1413.c new file mode 100644 index 00000000..755bd917 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/rfc1413.c @@ -0,0 +1,243 @@ +/* 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. + */ + +/* TODO - put timeouts back in */ +/* + * rfc1413() speaks a common subset of the RFC 1413, AUTH, TAP and IDENT + * protocols. The code queries an RFC 1413 etc. compatible daemon on a remote + * host to look up the owner of a connection. The information should not be + * used for authentication purposes. This routine intercepts alarm signals. + * + * Diagnostics are reported through syslog(3). + * + * Author: Wietse Venema, Eindhoven University of Technology, + * The Netherlands. + */ + +/* Some small additions for Apache --- ditch the "sccsid" var if + * compiling with gcc (it *has* changed), include ap_config.h for the + * prototypes it defines on at least one system (SunlOSs) which has + * them missing from the standard header files, and one minor change + * below (extra parens around assign "if (foo = bar) ..." to shut up + * gcc -Wall). + */ + +/* Rewritten by David Robinson */ + +#include "apr.h" +#include "apr_network_io.h" +#include "apr_strings.h" +#include "apr_lib.h" +#include "apr_inherit.h" + +#define APR_WANT_STDIO +#define APR_WANT_STRFUNC +#include "apr_want.h" + +#include "ap_config.h" +#include "httpd.h" /* for server_rec, conn_rec, etc. */ +#include "http_log.h" /* for aplog_error */ +#include "rfc1413.h" +#include "http_main.h" /* set_callback_and_alarm */ +#include "util_ebcdic.h" + +/* Local stuff. */ +/* Semi-well-known port */ +#define RFC1413_PORT 113 +/* maximum allowed length of userid */ +#define RFC1413_USERLEN 512 +/* rough limit on the amount of data we accept. */ +#define RFC1413_MAXDATA 1000 + +#ifndef RFC1413_TIMEOUT +#define RFC1413_TIMEOUT 30 +#endif +#define FROM_UNKNOWN "unknown" + +int ap_rfc1413_timeout = RFC1413_TIMEOUT; /* Global so it can be changed */ + +static apr_status_t rfc1413_connect(apr_socket_t **newsock, conn_rec *conn, + server_rec *srv) +{ + apr_status_t rv; + apr_sockaddr_t *localsa, *destsa; + + if ((rv = apr_sockaddr_info_get(&localsa, conn->local_ip, APR_UNSPEC, + 0, /* ephemeral port */ + 0, conn->pool)) != APR_SUCCESS) { + /* This should not fail since we have a numeric address string + * as the host. */ + ap_log_error(APLOG_MARK, APLOG_CRIT, rv, srv, + "rfc1413: apr_sockaddr_info_get(%s) failed", + conn->local_ip); + return rv; + } + + if ((rv = apr_sockaddr_info_get(&destsa, conn->remote_ip, + localsa->family, /* has to match */ + RFC1413_PORT, 0, conn->pool)) != APR_SUCCESS) { + /* This should not fail since we have a numeric address string + * as the host. */ + ap_log_error(APLOG_MARK, APLOG_CRIT, rv, srv, + "rfc1413: apr_sockaddr_info_get(%s) failed", + conn->remote_ip); + return rv; + } + + if ((rv = apr_socket_create(newsock, + localsa->family, /* has to match */ + SOCK_STREAM, conn->pool)) != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_CRIT, rv, srv, + "rfc1413: error creating query socket"); + return rv; + } + + if ((rv = apr_socket_timeout_set(*newsock, apr_time_from_sec(ap_rfc1413_timeout))) + != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_CRIT, rv, srv, + "rfc1413: error setting query socket timeout"); + apr_socket_close(*newsock); + return rv; + } + +/* + * Bind the local and remote ends of the query socket to the same + * IP addresses as the connection under investigation. We go + * through all this trouble because the local or remote system + * might have more than one network address. The RFC1413 etc. + * client sends only port numbers; the server takes the IP + * addresses from the query socket. + */ + + if ((rv = apr_bind(*newsock, localsa)) != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_CRIT, rv, srv, + "rfc1413: Error binding query socket to local port"); + apr_socket_close(*newsock); + return rv; + } + +/* + * errors from connect usually imply the remote machine doesn't support + * the service; don't log such an error + */ + if ((rv = apr_connect(*newsock, destsa)) != APR_SUCCESS) { + apr_socket_close(*newsock); + return rv; + } + + return APR_SUCCESS; +} + +static apr_status_t rfc1413_query(apr_socket_t *sock, conn_rec *conn, + server_rec *srv) +{ + apr_port_t rmt_port, our_port; + apr_port_t sav_rmt_port, sav_our_port; + apr_size_t i; + char *cp; + char buffer[RFC1413_MAXDATA + 1]; + char user[RFC1413_USERLEN + 1]; /* XXX */ + apr_size_t buflen; + + apr_sockaddr_port_get(&sav_our_port, conn->local_addr); + apr_sockaddr_port_get(&sav_rmt_port, conn->remote_addr); + + /* send the data */ + buflen = apr_snprintf(buffer, sizeof(buffer), "%hu,%hu\r\n", sav_rmt_port, + sav_our_port); + ap_xlate_proto_to_ascii(buffer, buflen); + + /* send query to server. Handle short write. */ + i = 0; + while (i < buflen) { + apr_size_t j = strlen(buffer + i); + apr_status_t status; + status = apr_send(sock, buffer+i, &j); + if (status != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_CRIT, status, srv, + "write: rfc1413: error sending request"); + return status; + } + else if (j > 0) { + i+=j; + } + } + + /* + * Read response from server. - the response should be newline + * terminated according to rfc - make sure it doesn't stomp its + * way out of the buffer. + */ + + i = 0; + memset(buffer, '\0', sizeof(buffer)); + /* + * Note that the strchr function below checks for \012 instead of '\n' + * this allows it to work on both ASCII and EBCDIC machines. + */ + while((cp = strchr(buffer, '\012')) == NULL && i < sizeof(buffer) - 1) { + apr_size_t j = sizeof(buffer) - 1 - i; + apr_status_t status; + status = apr_recv(sock, buffer+i, &j); + if (status != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_CRIT, status, srv, + "read: rfc1413: error reading response"); + return status; + } + else if (j > 0) { + i+=j; + } + else if (status == APR_SUCCESS && j == 0) { + /* Oops... we ran out of data before finding newline */ + return APR_EINVAL; + } + } + +/* RFC1413_USERLEN = 512 */ + ap_xlate_proto_from_ascii(buffer, i); + if (sscanf(buffer, "%hu , %hu : USERID :%*[^:]:%512s", &rmt_port, &our_port, + user) != 3 || sav_rmt_port != rmt_port + || sav_our_port != our_port) + return APR_EINVAL; + + /* + * Strip trailing carriage return. It is part of the + * protocol, not part of the data. + */ + + if ((cp = strchr(user, '\r'))) + *cp = '\0'; + + conn->remote_logname = apr_pstrdup(conn->pool, user); + + return APR_SUCCESS; +} + +char *ap_rfc1413(conn_rec *conn, server_rec *srv) +{ + apr_socket_t *sock; + apr_status_t rv; + + rv = rfc1413_connect(&sock, conn, srv); + if (rv == APR_SUCCESS) { + rv = rfc1413_query(sock, conn, srv); + apr_socket_close(sock); + } + if (rv != APR_SUCCESS) { + conn->remote_logname = FROM_UNKNOWN; + } + return conn->remote_logname; +} diff --git a/rubbos/app/httpd-2.0.64/server/rfc1413.lo b/rubbos/app/httpd-2.0.64/server/rfc1413.lo new file mode 100644 index 00000000..e25fa9a1 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/rfc1413.lo @@ -0,0 +1,12 @@ +# rfc1413.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/rfc1413.o' + +# Name of the non-PIC object. +non_pic_object='rfc1413.o' + diff --git a/rubbos/app/httpd-2.0.64/server/rfc1413.o b/rubbos/app/httpd-2.0.64/server/rfc1413.o new file mode 100644 index 0000000000000000000000000000000000000000..04b1ff54e4053f5e1630f43a97659263624d800b GIT binary patch literal 23664 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 c4zL +#endif + +#include "ap_config.h" +#include "httpd.h" +#include "http_log.h" +#include "http_main.h" +#include "http_core.h" +#include "http_config.h" +#include "ap_mpm.h" + +#include "mpm.h" +#include "scoreboard.h" + +AP_DECLARE_DATA scoreboard *ap_scoreboard_image = NULL; +AP_DECLARE_DATA const char *ap_scoreboard_fname = NULL; +AP_DECLARE_DATA int ap_extended_status = 0; + +#if APR_HAS_SHARED_MEMORY + +#include "apr_shm.h" + +#ifndef WIN32 +static /* but must be exported to mpm_winnt */ +#endif + apr_shm_t *ap_scoreboard_shm = NULL; + +#endif + +APR_HOOK_STRUCT( + APR_HOOK_LINK(pre_mpm) +) + +AP_IMPLEMENT_HOOK_RUN_ALL(int,pre_mpm, + (apr_pool_t *p, ap_scoreboard_e sb_type), + (p, sb_type),OK,DECLINED) + +struct ap_sb_handle_t { + int child_num; + int thread_num; +}; + +static int server_limit, thread_limit; +static apr_size_t scoreboard_size; + +/* + * ToDo: + * This function should be renamed to cleanup_shared + * and it should handle cleaning up a scoreboard shared + * between processes using any form of IPC (file, shared memory + * segment, etc.). Leave it as is now because it is being used + * by various MPMs. + */ +static apr_status_t ap_cleanup_shared_mem(void *d) +{ +#if APR_HAS_SHARED_MEMORY + free(ap_scoreboard_image); + ap_scoreboard_image = NULL; + apr_shm_destroy(ap_scoreboard_shm); +#endif + return APR_SUCCESS; +} + +AP_DECLARE(int) ap_calc_scoreboard_size(void) +{ + ap_mpm_query(AP_MPMQ_HARD_LIMIT_THREADS, &thread_limit); + ap_mpm_query(AP_MPMQ_HARD_LIMIT_DAEMONS, &server_limit); + scoreboard_size = sizeof(global_score); + scoreboard_size += sizeof(process_score) * server_limit; + scoreboard_size += sizeof(worker_score) * server_limit * thread_limit; + return scoreboard_size; +} + +void ap_init_scoreboard(void *shared_score) +{ + char *more_storage; + int i; + + ap_calc_scoreboard_size(); + ap_scoreboard_image = + calloc(1, sizeof(scoreboard) + server_limit * sizeof(worker_score *)); + more_storage = shared_score; + ap_scoreboard_image->global = (global_score *)more_storage; + more_storage += sizeof(global_score); + ap_scoreboard_image->parent = (process_score *)more_storage; + more_storage += sizeof(process_score) * server_limit; + ap_scoreboard_image->servers = + (worker_score **)((char*)ap_scoreboard_image + sizeof(scoreboard)); + for (i = 0; i < server_limit; i++) { + ap_scoreboard_image->servers[i] = (worker_score *)more_storage; + more_storage += thread_limit * sizeof(worker_score); + } + ap_assert(more_storage == (char*)shared_score + scoreboard_size); + ap_scoreboard_image->global->server_limit = server_limit; + ap_scoreboard_image->global->thread_limit = thread_limit; +} + +/** + * Create a name-based scoreboard in the given pool using the + * given filename. + */ +static apr_status_t create_namebased_scoreboard(apr_pool_t *pool, + const char *fname) +{ +#if APR_HAS_SHARED_MEMORY + apr_status_t rv; + + /* The shared memory file must not exist before we create the + * segment. */ + apr_file_remove(fname, pool); /* ignore errors */ + + rv = apr_shm_create(&ap_scoreboard_shm, scoreboard_size, fname, pool); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_CRIT, rv, NULL, + "unable to create scoreboard \"%s\" " + "(name-based shared memory failure)", fname); + return rv; + } +#endif /* APR_HAS_SHARED_MEMORY */ + return APR_SUCCESS; +} + +/* ToDo: This function should be made to handle setting up + * a scoreboard shared between processes using any IPC technique, + * not just a shared memory segment + */ +static apr_status_t open_scoreboard(apr_pool_t *pconf) +{ +#if APR_HAS_SHARED_MEMORY + apr_status_t rv; + char *fname = NULL; + apr_pool_t *global_pool; + + /* We don't want to have to recreate the scoreboard after + * restarts, so we'll create a global pool and never clean it. + */ + rv = apr_pool_create(&global_pool, NULL); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_CRIT, rv, NULL, + "Fatal error: unable to create global pool " + "for use with by the scoreboard"); + return rv; + } + + /* The config says to create a name-based shmem */ + if (ap_scoreboard_fname) { + /* make sure it's an absolute pathname */ + fname = ap_server_root_relative(pconf, ap_scoreboard_fname); + if (!fname) { + ap_log_error(APLOG_MARK, APLOG_CRIT, APR_EBADPATH, NULL, + "Fatal error: Invalid Scoreboard path %s", + ap_scoreboard_fname); + return APR_EBADPATH; + } + return create_namebased_scoreboard(global_pool, fname); + } + else { /* config didn't specify, we get to choose shmem type */ + rv = apr_shm_create(&ap_scoreboard_shm, scoreboard_size, NULL, + global_pool); /* anonymous shared memory */ + if ((rv != APR_SUCCESS) && (rv != APR_ENOTIMPL)) { + ap_log_error(APLOG_MARK, APLOG_CRIT, rv, NULL, + "Unable to create scoreboard " + "(anonymous shared memory failure)"); + return rv; + } + /* Make up a filename and do name-based shmem */ + else if (rv == APR_ENOTIMPL) { + /* Make sure it's an absolute pathname */ + ap_scoreboard_fname = DEFAULT_SCOREBOARD; + fname = ap_server_root_relative(pconf, ap_scoreboard_fname); + + return create_namebased_scoreboard(global_pool, fname); + } + } +#endif /* APR_HAS_SHARED_MEMORY */ + return APR_SUCCESS; +} + +/* If detach is non-zero, this is a seperate child process, + * if zero, it is a forked child. + */ +apr_status_t ap_reopen_scoreboard(apr_pool_t *p, apr_shm_t **shm, int detached) +{ +#if APR_HAS_SHARED_MEMORY + if (!detached) { + return APR_SUCCESS; + } + if (apr_shm_size_get(ap_scoreboard_shm) < scoreboard_size) { + ap_log_error(APLOG_MARK, APLOG_CRIT, 0, NULL, + "Fatal error: shared scoreboard too small for child!"); + apr_shm_detach(ap_scoreboard_shm); + ap_scoreboard_shm = NULL; + return APR_EINVAL; + } + /* everything will be cleared shortly */ + if (*shm) { + *shm = ap_scoreboard_shm; + } +#endif + return APR_SUCCESS; +} + +apr_status_t ap_cleanup_scoreboard(void *d) +{ + if (ap_scoreboard_image == NULL) { + return APR_SUCCESS; + } + if (ap_scoreboard_image->global->sb_type == SB_SHARED) { + ap_cleanup_shared_mem(NULL); + } + else { + free(ap_scoreboard_image->global); + free(ap_scoreboard_image); + ap_scoreboard_image = NULL; + } + return APR_SUCCESS; +} + +/* Create or reinit an existing scoreboard. The MPM can control whether + * the scoreboard is shared across multiple processes or not + */ +int ap_create_scoreboard(apr_pool_t *p, ap_scoreboard_e sb_type) +{ + int running_gen = 0; + int i; +#if APR_HAS_SHARED_MEMORY + apr_status_t rv; +#endif + + if (ap_scoreboard_image) { + running_gen = ap_scoreboard_image->global->running_generation; + ap_scoreboard_image->global->restart_time = apr_time_now(); + memset(ap_scoreboard_image->parent, 0, + sizeof(process_score) * server_limit); + for (i = 0; i < server_limit; i++) { + memset(ap_scoreboard_image->servers[i], 0, + sizeof(worker_score) * thread_limit); + } + return OK; + } + + ap_calc_scoreboard_size(); +#if APR_HAS_SHARED_MEMORY + if (sb_type == SB_SHARED) { + void *sb_shared; + rv = open_scoreboard(p); + if (rv || !(sb_shared = apr_shm_baseaddr_get(ap_scoreboard_shm))) { + return HTTP_INTERNAL_SERVER_ERROR; + } + memset(sb_shared, 0, scoreboard_size); + ap_init_scoreboard(sb_shared); + } + else +#endif + { + /* A simple malloc will suffice */ + void *sb_mem = calloc(1, scoreboard_size); + if (sb_mem == NULL) { + ap_log_error(APLOG_MARK, APLOG_CRIT, 0, NULL, + "(%d)%s: cannot allocate scoreboard", + errno, strerror(errno)); + return HTTP_INTERNAL_SERVER_ERROR; + } + ap_init_scoreboard(sb_mem); + } + + ap_scoreboard_image->global->sb_type = sb_type; + ap_scoreboard_image->global->running_generation = running_gen; + ap_scoreboard_image->global->restart_time = apr_time_now(); + + apr_pool_cleanup_register(p, NULL, ap_cleanup_scoreboard, apr_pool_cleanup_null); + + return OK; +} + +/* Routines called to deal with the scoreboard image + * --- note that we do *not* need write locks, since update_child_status + * only updates a *single* record in place, and only one process writes to + * a given scoreboard slot at a time (either the child process owning that + * slot, or the parent, noting that the child has died). + * + * As a final note --- setting the score entry to getpid() is always safe, + * since when the parent is writing an entry, it's only noting SERVER_DEAD + * anyway. + */ + +AP_DECLARE(int) ap_exists_scoreboard_image(void) +{ + return (ap_scoreboard_image ? 1 : 0); +} + +AP_DECLARE(void) ap_increment_counts(ap_sb_handle_t *sb, request_rec *r) +{ + worker_score *ws; + + ws = &ap_scoreboard_image->servers[sb->child_num][sb->thread_num]; + +#ifdef HAVE_TIMES + times(&ws->times); +#endif + ws->access_count++; + ws->my_access_count++; + ws->conn_count++; + ws->bytes_served += r->bytes_sent; + ws->my_bytes_served += r->bytes_sent; + ws->conn_bytes += r->bytes_sent; +} + +AP_DECLARE(int) find_child_by_pid(apr_proc_t *pid) +{ + int i; + int max_daemons_limit; + + ap_mpm_query(AP_MPMQ_MAX_DAEMONS, &max_daemons_limit); + + for (i = 0; i < max_daemons_limit; ++i) { + if (ap_scoreboard_image->parent[i].pid == pid->pid) { + return i; + } + } + + return -1; +} + +AP_DECLARE(void) ap_create_sb_handle(ap_sb_handle_t **new_sbh, apr_pool_t *p, + int child_num, int thread_num) +{ + *new_sbh = (ap_sb_handle_t *)apr_palloc(p, sizeof(ap_sb_handle_t)); + (*new_sbh)->child_num = child_num; + (*new_sbh)->thread_num = thread_num; +} + +AP_DECLARE(int) ap_update_child_status_from_indexes(int child_num, + int thread_num, + int status, + request_rec *r) +{ + int old_status; + worker_score *ws; + process_score *ps; + + if (child_num < 0) { + return -1; + } + + ws = &ap_scoreboard_image->servers[child_num][thread_num]; + old_status = ws->status; + ws->status = status; + + ps = &ap_scoreboard_image->parent[child_num]; + + if (status == SERVER_READY + && old_status == SERVER_STARTING) { + ws->thread_num = child_num * thread_limit + thread_num; + ps->generation = ap_my_generation; + } + + if (ap_extended_status) { + ws->last_used = apr_time_now(); + if (status == SERVER_READY || status == SERVER_DEAD) { + /* + * Reset individual counters + */ + if (status == SERVER_DEAD) { + ws->my_access_count = 0L; + ws->my_bytes_served = 0L; + } + ws->conn_count = 0; + ws->conn_bytes = 0; + } + if (r) { + conn_rec *c = r->connection; + apr_cpystrn(ws->client, ap_get_remote_host(c, r->per_dir_config, + REMOTE_NOLOOKUP, NULL), sizeof(ws->client)); + if (r->the_request == NULL) { + apr_cpystrn(ws->request, "NULL", sizeof(ws->request)); + } else if (r->parsed_uri.password == NULL) { + apr_cpystrn(ws->request, r->the_request, sizeof(ws->request)); + } else { + /* Don't reveal the password in the server-status view */ + apr_cpystrn(ws->request, apr_pstrcat(r->pool, r->method, " ", + apr_uri_unparse(r->pool, &r->parsed_uri, + APR_URI_UNP_OMITPASSWORD), + r->assbackwards ? NULL : " ", r->protocol, NULL), + sizeof(ws->request)); + } + apr_cpystrn(ws->vhost, r->server->server_hostname, + sizeof(ws->vhost)); + } + } + + return old_status; +} + +AP_DECLARE(int) ap_update_child_status(ap_sb_handle_t *sbh, int status, + request_rec *r) +{ + return ap_update_child_status_from_indexes(sbh->child_num, sbh->thread_num, + status, r); +} + +void ap_time_process_request(ap_sb_handle_t *sbh, int status) +{ + worker_score *ws; + + if (sbh->child_num < 0) { + return; + } + + ws = &ap_scoreboard_image->servers[sbh->child_num][sbh->thread_num]; + + if (status == START_PREQUEST) { + ws->start_time = apr_time_now(); + } + else if (status == STOP_PREQUEST) { + ws->stop_time = apr_time_now(); + } +} + +AP_DECLARE(worker_score *) ap_get_scoreboard_worker(int x, int y) +{ + if (((x < 0) || (server_limit < x)) || + ((y < 0) || (thread_limit < y))) { + return(NULL); /* Out of range */ + } + return &ap_scoreboard_image->servers[x][y]; +} + +AP_DECLARE(process_score *) ap_get_scoreboard_process(int x) +{ + if ((x < 0) || (server_limit < x)) { + return(NULL); /* Out of range */ + } + return &ap_scoreboard_image->parent[x]; +} + +AP_DECLARE(global_score *) ap_get_scoreboard_global() +{ + return ap_scoreboard_image->global; +} diff --git a/rubbos/app/httpd-2.0.64/server/scoreboard.lo b/rubbos/app/httpd-2.0.64/server/scoreboard.lo new file mode 100644 index 00000000..3a2d5065 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/scoreboard.lo @@ -0,0 +1,12 @@ +# scoreboard.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/scoreboard.o' + +# Name of the non-PIC object. +non_pic_object='scoreboard.o' + diff --git a/rubbos/app/httpd-2.0.64/server/scoreboard.o b/rubbos/app/httpd-2.0.64/server/scoreboard.o new file mode 100644 index 0000000000000000000000000000000000000000..58be9313eb4bee151f24e4fb5cd80d421a6e939e GIT binary patch literal 51568 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 IF6-C-1Eo2o6951J literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/server/test_char.h b/rubbos/app/httpd-2.0.64/server/test_char.h new file mode 100644 index 00000000..fe168495 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/test_char.h @@ -0,0 +1,23 @@ +/* this file is automatically generated by gen_test_char, do not edit */ +#define T_ESCAPE_SHELL_CMD (1) +#define T_ESCAPE_PATH_SEGMENT (2) +#define T_OS_ESCAPE_PATH (4) +#define T_HTTP_TOKEN_STOP (8) +#define T_ESCAPE_LOGITEM (16) +#define T_ESCAPE_FORENSIC (32) + +static const unsigned char test_char_table[256] = { + 0,62,62,62,62,62,62,62,62,62,63,62,62,62,62,62,62,62,62,62, + 62,62,62,62,62,62,62,62,62,62,62,62,14,0,23,6,1,38,1,1, + 9,9,1,0,8,0,0,10,0,0,0,0,0,0,0,0,0,0,40,15, + 15,8,15,15,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,15,31,15,7,0,7,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,15,39,15,1,62,54,54,54,54,54,54,54,54,54,54,54,54, + 54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54, + 54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54, + 54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54, + 54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54, + 54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54, + 54,54,54,54,54,54,54,54,54,54,54,54,54,54,54,54 +}; diff --git a/rubbos/app/httpd-2.0.64/server/util.c b/rubbos/app/httpd-2.0.64/server/util.c new file mode 100644 index 00000000..a64f3bf9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/util.c @@ -0,0 +1,2170 @@ +/* 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. + */ + +/* + * util.c: string utility things + * + * 3/21/93 Rob McCool + * 1995-96 Many changes by the Apache Software Foundation + * + */ + +/* Debugging aid: + * #define DEBUG to trace all cfg_open*()/cfg_closefile() calls + * #define DEBUG_CFG_LINES to trace every line read from the config files + */ + +#include "apr.h" +#include "apr_strings.h" +#include "apr_lib.h" + +#define APR_WANT_STDIO +#define APR_WANT_STRFUNC +#include "apr_want.h" + +#if APR_HAVE_UNISTD_H +#include +#endif +#if APR_HAVE_NETDB_H +#include /* for gethostbyname() */ +#endif + +#define CORE_PRIVATE + +#include "ap_config.h" +#include "apr_base64.h" +#include "httpd.h" +#include "http_main.h" +#include "http_log.h" +#include "http_protocol.h" +#include "http_config.h" +#include "util_ebcdic.h" + +#ifdef HAVE_PWD_H +#include +#endif +#ifdef HAVE_GRP_H +#include +#endif + +/* A bunch of functions in util.c scan strings looking for certain characters. + * To make that more efficient we encode a lookup table. The test_char_table + * is generated automatically by gen_test_char.c. + */ +#include "test_char.h" + +/* we assume the folks using this ensure 0 <= c < 256... which means + * you need a cast to (unsigned char) first, you can't just plug a + * char in here and get it to work, because if char is signed then it + * will first be sign extended. + */ +#define TEST_CHAR(c, f) (test_char_table[(unsigned)(c)] & (f)) + +/* Win32/NetWare/OS2 need to check for both forward and back slashes + * in ap_getparents() and ap_escape_url. + */ +#ifdef CASE_BLIND_FILESYSTEM +#define IS_SLASH(s) ((s == '/') || (s == '\\')) +#else +#define IS_SLASH(s) (s == '/') +#endif + + +/* + * Examine a field value (such as a media-/content-type) string and return + * it sans any parameters; e.g., strip off any ';charset=foo' and the like. + */ +AP_DECLARE(char *) ap_field_noparam(apr_pool_t *p, const char *intype) +{ + const char *semi; + + if (intype == NULL) return NULL; + + semi = ap_strchr_c(intype, ';'); + if (semi == NULL) { + return apr_pstrdup(p, intype); + } + else { + while ((semi > intype) && apr_isspace(semi[-1])) { + semi--; + } + return apr_pstrndup(p, intype, semi - intype); + } +} + +AP_DECLARE(char *) ap_ht_time(apr_pool_t *p, apr_time_t t, const char *fmt, + int gmt) +{ + apr_size_t retcode; + char ts[MAX_STRING_LEN]; + char tf[MAX_STRING_LEN]; + apr_time_exp_t xt; + + if (gmt) { + const char *f; + char *strp; + + apr_time_exp_gmt(&xt, t); + /* Convert %Z to "GMT" and %z to "+0000"; + * on hosts that do not have a time zone string in struct tm, + * strftime must assume its argument is local time. + */ + for(strp = tf, f = fmt; strp < tf + sizeof(tf) - 6 && (*strp = *f) + ; f++, strp++) { + if (*f != '%') continue; + switch (f[1]) { + case '%': + *++strp = *++f; + break; + case 'Z': + *strp++ = 'G'; + *strp++ = 'M'; + *strp = 'T'; + f++; + break; + case 'z': /* common extension */ + *strp++ = '+'; + *strp++ = '0'; + *strp++ = '0'; + *strp++ = '0'; + *strp = '0'; + f++; + break; + } + } + *strp = '\0'; + fmt = tf; + } + else { + apr_time_exp_lt(&xt, t); + } + + /* check return code? */ + apr_strftime(ts, &retcode, MAX_STRING_LEN, fmt, &xt); + ts[MAX_STRING_LEN - 1] = '\0'; + return apr_pstrdup(p, ts); +} + +/* Roy owes Rob beer. */ +/* Rob owes Roy dinner. */ + +/* These legacy comments would make a lot more sense if Roy hadn't + * replaced the old later_than() routine with util_date.c. + * + * Well, okay, they still wouldn't make any sense. + */ + +/* Match = 0, NoMatch = 1, Abort = -1 + * Based loosely on sections of wildmat.c by Rich Salz + * Hmmm... shouldn't this really go component by component? + */ +AP_DECLARE(int) ap_strcmp_match(const char *str, const char *expected) +{ + int x, y; + + for (x = 0, y = 0; expected[y]; ++y, ++x) { + if ((!str[x]) && (expected[y] != '*')) + return -1; + if (expected[y] == '*') { + while (expected[++y] == '*'); + if (!expected[y]) + return 0; + while (str[x]) { + int ret; + if ((ret = ap_strcmp_match(&str[x++], &expected[y])) != 1) + return ret; + } + return -1; + } + else if ((expected[y] != '?') && (str[x] != expected[y])) + return 1; + } + return (str[x] != '\0'); +} + +AP_DECLARE(int) ap_strcasecmp_match(const char *str, const char *expected) +{ + int x, y; + + for (x = 0, y = 0; expected[y]; ++y, ++x) { + if (!str[x] && expected[y] != '*') + return -1; + if (expected[y] == '*') { + while (expected[++y] == '*'); + if (!expected[y]) + return 0; + while (str[x]) { + int ret; + if ((ret = ap_strcasecmp_match(&str[x++], &expected[y])) != 1) + return ret; + } + return -1; + } + else if (expected[y] != '?' + && apr_tolower(str[x]) != apr_tolower(expected[y])) + return 1; + } + return (str[x] != '\0'); +} + +/* We actually compare the canonical root to this root, (but we don't + * waste time checking the case), since every use of this function in + * httpd-2.0 tests if the path is 'proper', meaning we've already passed + * it through apr_filepath_merge, or we haven't. + */ +AP_DECLARE(int) ap_os_is_path_absolute(apr_pool_t *p, const char *dir) +{ + const char *newpath; + const char *ourdir = dir; + if (apr_filepath_root(&newpath, &dir, 0, p) != APR_SUCCESS + || strncmp(newpath, ourdir, strlen(newpath)) != 0) { + return 0; + } + return 1; +} + +AP_DECLARE(int) ap_is_matchexp(const char *str) +{ + register int x; + + for (x = 0; str[x]; x++) + if ((str[x] == '*') || (str[x] == '?')) + return 1; + return 0; +} + +/* + * Here's a pool-based interface to POSIX regex's regcomp(). + * Note that we return regex_t instead of being passed one. + * The reason is that if you use an already-used regex_t structure, + * the memory that you've already allocated gets forgotten, and + * regfree() doesn't clear it. So we don't allow it. + */ + +static apr_status_t regex_cleanup(void *preg) +{ + regfree((regex_t *) preg); + return APR_SUCCESS; +} + +AP_DECLARE(regex_t *) ap_pregcomp(apr_pool_t *p, const char *pattern, + int cflags) +{ + regex_t *preg = apr_palloc(p, sizeof(regex_t)); + + if (regcomp(preg, pattern, cflags)) { + return NULL; + } + + apr_pool_cleanup_register(p, (void *) preg, regex_cleanup, + apr_pool_cleanup_null); + + return preg; +} + +AP_DECLARE(void) ap_pregfree(apr_pool_t *p, regex_t * reg) +{ + regfree(reg); + apr_pool_cleanup_kill(p, (void *) reg, regex_cleanup); +} + +/* + * Similar to standard strstr() but we ignore case in this version. + * Based on the strstr() implementation further below. + */ +AP_DECLARE(char *) ap_strcasestr(const char *s1, const char *s2) +{ + char *p1, *p2; + if (*s2 == '\0') { + /* an empty s2 */ + return((char *)s1); + } + while(1) { + for ( ; (*s1 != '\0') && (apr_tolower(*s1) != apr_tolower(*s2)); s1++); + if (*s1 == '\0') { + return(NULL); + } + /* found first character of s2, see if the rest matches */ + p1 = (char *)s1; + p2 = (char *)s2; + for (++p1, ++p2; apr_tolower(*p1) == apr_tolower(*p2); ++p1, ++p2) { + if (*p1 == '\0') { + /* both strings ended together */ + return((char *)s1); + } + } + if (*p2 == '\0') { + /* second string ended, a match */ + break; + } + /* didn't find a match here, try starting at next character in s1 */ + s1++; + } + return((char *)s1); +} + +/* + * Returns an offsetted pointer in bigstring immediately after + * prefix. Returns bigstring if bigstring doesn't start with + * prefix or if prefix is longer than bigstring while still matching. + * NOTE: pointer returned is relative to bigstring, so we + * can use standard pointer comparisons in the calling function + * (eg: test if ap_stripprefix(a,b) == a) + */ +AP_DECLARE(const char *) ap_stripprefix(const char *bigstring, + const char *prefix) +{ + const char *p1; + + if (*prefix == '\0') + return bigstring; + + p1 = bigstring; + while (*p1 && *prefix) { + if (*p1++ != *prefix++) + return bigstring; + } + if (*prefix == '\0') + return p1; + + /* hit the end of bigstring! */ + return bigstring; +} + +/* + * Apache stub function for the regex libraries regexec() to make sure the + * whole regex(3) API is available through the Apache (exported) namespace. + * This is especially important for the DSO situations of modules. + * DO NOT MAKE A MACRO OUT OF THIS FUNCTION! + */ +AP_DECLARE(int) ap_regexec(regex_t *preg, const char *string, + size_t nmatch, regmatch_t pmatch[], int eflags) +{ + return regexec(preg, string, nmatch, pmatch, eflags); +} + +AP_DECLARE(size_t) ap_regerror(int errcode, const regex_t *preg, char *errbuf, + size_t errbuf_size) +{ + return regerror(errcode, preg, errbuf, errbuf_size); +} + + +/* This function substitutes for $0-$9, filling in regular expression + * submatches. Pass it the same nmatch and pmatch arguments that you + * passed ap_regexec(). pmatch should not be greater than the maximum number + * of subexpressions - i.e. one more than the re_nsub member of regex_t. + * + * input should be the string with the $-expressions, source should be the + * string that was matched against. + * + * It returns the substituted string, or NULL on error. + * + * Parts of this code are based on Henry Spencer's regsub(), from his + * AT&T V8 regexp package. + */ + +AP_DECLARE(char *) ap_pregsub(apr_pool_t *p, const char *input, + const char *source, size_t nmatch, + regmatch_t pmatch[]) +{ + const char *src = input; + char *dest, *dst; + char c; + size_t no; + int len; + + if (!source) + return NULL; + if (!nmatch) + return apr_pstrdup(p, src); + + /* First pass, find the size */ + + len = 0; + + while ((c = *src++) != '\0') { + if (c == '&') + no = 0; + else if (c == '$' && apr_isdigit(*src)) + no = *src++ - '0'; + else + no = 10; + + if (no > 9) { /* Ordinary character. */ + if (c == '\\' && (*src == '$' || *src == '&')) + c = *src++; + len++; + } + else if (no < nmatch && pmatch[no].rm_so < pmatch[no].rm_eo) { + len += pmatch[no].rm_eo - pmatch[no].rm_so; + } + + } + + dest = dst = apr_pcalloc(p, len + 1); + + /* Now actually fill in the string */ + + src = input; + + while ((c = *src++) != '\0') { + if (c == '&') + no = 0; + else if (c == '$' && apr_isdigit(*src)) + no = *src++ - '0'; + else + no = 10; + + if (no > 9) { /* Ordinary character. */ + if (c == '\\' && (*src == '$' || *src == '&')) + c = *src++; + *dst++ = c; + } + else if (no < nmatch && pmatch[no].rm_so < pmatch[no].rm_eo) { + len = pmatch[no].rm_eo - pmatch[no].rm_so; + memcpy(dst, source + pmatch[no].rm_so, len); + dst += len; + } + + } + *dst = '\0'; + + return dest; +} + +/* + * Parse .. so we don't compromise security + */ +AP_DECLARE(void) ap_getparents(char *name) +{ + char *next; + int l, w, first_dot; + + /* Four paseses, as per RFC 1808 */ + /* a) remove ./ path segments */ + for (next = name; *next && (*next != '.'); next++) { + } + + l = w = first_dot = next - name; + while (name[l] != '\0') { + if (name[l] == '.' && IS_SLASH(name[l + 1]) + && (l == 0 || IS_SLASH(name[l - 1]))) + l += 2; + else + name[w++] = name[l++]; + } + + /* b) remove trailing . path, segment */ + if (w == 1 && name[0] == '.') + w--; + else if (w > 1 && name[w - 1] == '.' && IS_SLASH(name[w - 2])) + w--; + name[w] = '\0'; + + /* c) remove all xx/../ segments. (including leading ../ and /../) */ + l = first_dot; + + while (name[l] != '\0') { + if (name[l] == '.' && name[l + 1] == '.' && IS_SLASH(name[l + 2]) + && (l == 0 || IS_SLASH(name[l - 1]))) { + register int m = l + 3, n; + + l = l - 2; + if (l >= 0) { + while (l >= 0 && !IS_SLASH(name[l])) + l--; + l++; + } + else + l = 0; + n = l; + while ((name[n] = name[m])) + (++n, ++m); + } + else + ++l; + } + + /* d) remove trailing xx/.. segment. */ + if (l == 2 && name[0] == '.' && name[1] == '.') + name[0] = '\0'; + else if (l > 2 && name[l - 1] == '.' && name[l - 2] == '.' + && IS_SLASH(name[l - 3])) { + l = l - 4; + if (l >= 0) { + while (l >= 0 && !IS_SLASH(name[l])) + l--; + l++; + } + else + l = 0; + name[l] = '\0'; + } +} + +AP_DECLARE(void) ap_no2slash(char *name) +{ + char *d, *s; + + s = d = name; + +#ifdef HAVE_UNC_PATHS + /* Check for UNC names. Leave leading two slashes. */ + if (s[0] == '/' && s[1] == '/') + *d++ = *s++; +#endif + + while (*s) { + if ((*d++ = *s) == '/') { + do { + ++s; + } while (*s == '/'); + } + else { + ++s; + } + } + *d = '\0'; +} + + +/* + * copy at most n leading directories of s into d + * d should be at least as large as s plus 1 extra byte + * assumes n > 0 + * the return value is the ever useful pointer to the trailing \0 of d + * + * MODIFIED FOR HAVE_DRIVE_LETTERS and NETWARE environments, + * so that if n == 0, "/" is returned in d with n == 1 + * and s == "e:/test.html", "e:/" is returned in d + * *** See also directory_walk in modules/http/http_request.c + + * examples: + * /a/b, 0 ==> / (true for all platforms) + * /a/b, 1 ==> / + * /a/b, 2 ==> /a/ + * /a/b, 3 ==> /a/b/ + * /a/b, 4 ==> /a/b/ + * + * c:/a/b 0 ==> / + * c:/a/b 1 ==> c:/ + * c:/a/b 2 ==> c:/a/ + * c:/a/b 3 ==> c:/a/b + * c:/a/b 4 ==> c:/a/b + */ +AP_DECLARE(char *) ap_make_dirstr_prefix(char *d, const char *s, int n) +{ + if (n < 1) { + *d = '/'; + *++d = '\0'; + return (d); + } + + for (;;) { + if (*s == '\0' || (*s == '/' && (--n) == 0)) { + *d = '/'; + break; + } + *d++ = *s++; + } + *++d = 0; + return (d); +} + + +/* + * return the parent directory name including trailing / of the file s + */ +AP_DECLARE(char *) ap_make_dirstr_parent(apr_pool_t *p, const char *s) +{ + const char *last_slash = ap_strrchr_c(s, '/'); + char *d; + int l; + + if (last_slash == NULL) { + return apr_pstrdup(p, ""); + } + l = (last_slash - s) + 1; + d = apr_palloc(p, l + 1); + memcpy(d, s, l); + d[l] = 0; + return (d); +} + + +AP_DECLARE(int) ap_count_dirs(const char *path) +{ + register int x, n; + + for (x = 0, n = 0; path[x]; x++) + if (path[x] == '/') + n++; + return n; +} + +AP_DECLARE(char *) ap_getword_nc(apr_pool_t *atrans, char **line, char stop) +{ + return ap_getword(atrans, (const char **) line, stop); +} + +AP_DECLARE(char *) ap_getword(apr_pool_t *atrans, const char **line, char stop) +{ + const char *pos = *line; + int len; + char *res; + + while ((*pos != stop) && *pos) { + ++pos; + } + + len = pos - *line; + res = (char *)apr_palloc(atrans, len + 1); + memcpy(res, *line, len); + res[len] = 0; + + if (stop) { + while (*pos == stop) { + ++pos; + } + } + *line = pos; + + return res; +} + +AP_DECLARE(char *) ap_getword_white_nc(apr_pool_t *atrans, char **line) +{ + return ap_getword_white(atrans, (const char **) line); +} + +AP_DECLARE(char *) ap_getword_white(apr_pool_t *atrans, const char **line) +{ + const char *pos = *line; + int len; + char *res; + + while (!apr_isspace(*pos) && *pos) { + ++pos; + } + + len = pos - *line; + res = (char *)apr_palloc(atrans, len + 1); + memcpy(res, *line, len); + res[len] = 0; + + while (apr_isspace(*pos)) { + ++pos; + } + + *line = pos; + + return res; +} + +AP_DECLARE(char *) ap_getword_nulls_nc(apr_pool_t *atrans, char **line, + char stop) +{ + return ap_getword_nulls(atrans, (const char **) line, stop); +} + +AP_DECLARE(char *) ap_getword_nulls(apr_pool_t *atrans, const char **line, + char stop) +{ + const char *pos = ap_strchr_c(*line, stop); + char *res; + + if (!pos) { + res = apr_pstrdup(atrans, *line); + *line += strlen(*line); + return res; + } + + res = apr_pstrndup(atrans, *line, pos - *line); + + ++pos; + + *line = pos; + + return res; +} + +/* Get a word, (new) config-file style --- quoted strings and backslashes + * all honored + */ + +static char *substring_conf(apr_pool_t *p, const char *start, int len, + char quote) +{ + char *result = apr_palloc(p, len + 2); + char *resp = result; + int i; + + for (i = 0; i < len; ++i) { + if (start[i] == '\\' && (start[i + 1] == '\\' + || (quote && start[i + 1] == quote))) + *resp++ = start[++i]; + else + *resp++ = start[i]; + } + + *resp++ = '\0'; +#if RESOLVE_ENV_PER_TOKEN + return (char *)ap_resolve_env(p,result); +#else + return result; +#endif +} + +AP_DECLARE(char *) ap_getword_conf_nc(apr_pool_t *p, char **line) +{ + return ap_getword_conf(p, (const char **) line); +} + +AP_DECLARE(char *) ap_getword_conf(apr_pool_t *p, const char **line) +{ + const char *str = *line, *strend; + char *res; + char quote; + + while (*str && apr_isspace(*str)) + ++str; + + if (!*str) { + *line = str; + return ""; + } + + if ((quote = *str) == '"' || quote == '\'') { + strend = str + 1; + while (*strend && *strend != quote) { + if (*strend == '\\' && strend[1] && strend[1] == quote) + strend += 2; + else + ++strend; + } + res = substring_conf(p, str + 1, strend - str - 1, quote); + + if (*strend == quote) + ++strend; + } + else { + strend = str; + while (*strend && !apr_isspace(*strend)) + ++strend; + + res = substring_conf(p, str, strend - str, 0); + } + + while (*strend && apr_isspace(*strend)) + ++strend; + *line = strend; + return res; +} + +/* Check a string for any ${ENV} environment variable + * construct and replace each them by the value of + * that environment variable, if it exists. If the + * environment value does not exist, leave the ${ENV} + * construct alone; it means something else. + */ +AP_DECLARE(const char *) ap_resolve_env(apr_pool_t *p, const char * word) +{ +# define SMALL_EXPANSION 5 + struct sll { + struct sll *next; + const char *string; + apr_size_t len; + } *result, *current, sresult[SMALL_EXPANSION]; + char *res_buf, *cp; + const char *s, *e, *ep; + unsigned spc; + apr_size_t outlen; + + s = ap_strchr_c(word, '$'); + if (!s) { + return word; + } + + /* well, actually something to do */ + ep = word + strlen(word); + spc = 0; + result = current = &(sresult[spc++]); + current->next = NULL; + current->string = word; + current->len = s - word; + outlen = current->len; + + do { + /* prepare next entry */ + if (current->len) { + current->next = (spc < SMALL_EXPANSION) + ? &(sresult[spc++]) + : (struct sll *)apr_palloc(p, + sizeof(*current->next)); + current = current->next; + current->next = NULL; + current->len = 0; + } + + if (*s == '$') { + if (s[1] == '{' && (e = ap_strchr_c(s, '}'))) { + word = getenv(apr_pstrndup(p, s+2, e-s-2)); + if (word) { + current->string = word; + current->len = strlen(word); + outlen += current->len; + } + else { + current->string = s; + current->len = e - s + 1; + outlen += current->len; + } + s = e + 1; + } + else { + current->string = s++; + current->len = 1; + ++outlen; + } + } + else { + word = s; + s = ap_strchr_c(s, '$'); + current->string = word; + current->len = s ? s - word : ep - word; + outlen += current->len; + } + } while (s && *s); + + /* assemble result */ + res_buf = cp = apr_palloc(p, outlen + 1); + do { + if (result->len) { + memcpy(cp, result->string, result->len); + cp += result->len; + } + result = result->next; + } while (result); + res_buf[outlen] = '\0'; + + return res_buf; +} + +AP_DECLARE(int) ap_cfg_closefile(ap_configfile_t *cfp) +{ +#ifdef DEBUG + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, NULL, + "Done with config file %s", cfp->name); +#endif + return (cfp->close == NULL) ? 0 : cfp->close(cfp->param); +} + +static apr_status_t cfg_close(void *param) +{ + apr_file_t *cfp = (apr_file_t *) param; + return (apr_file_close(cfp)); +} + +static int cfg_getch(void *param) +{ + char ch; + apr_file_t *cfp = (apr_file_t *) param; + if (apr_file_getc(&ch, cfp) == APR_SUCCESS) + return ch; + return (int)EOF; +} + +static void *cfg_getstr(void *buf, size_t bufsiz, void *param) +{ + apr_file_t *cfp = (apr_file_t *) param; + apr_status_t rv; + rv = apr_file_gets(buf, bufsiz, cfp); + if (rv == APR_SUCCESS || (APR_STATUS_IS_EOF(rv) && strcmp(buf, ""))) + return buf; + return NULL; +} + +/* Open a ap_configfile_t as FILE, return open ap_configfile_t struct pointer */ +AP_DECLARE(apr_status_t) ap_pcfg_openfile(ap_configfile_t **ret_cfg, + apr_pool_t *p, const char *name) +{ + ap_configfile_t *new_cfg; + apr_file_t *file = NULL; + apr_finfo_t finfo; + apr_status_t status; +#ifdef DEBUG + char buf[120]; +#endif + + if (name == NULL) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, NULL, + "Internal error: pcfg_openfile() called with NULL filename"); + return APR_EBADF; + } + + status = apr_file_open(&file, name, APR_READ | APR_BUFFERED, + APR_OS_DEFAULT, p); +#ifdef DEBUG + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, NULL, + "Opening config file %s (%s)", + name, (status != APR_SUCCESS) ? + apr_strerror(status, buf, sizeof(buf)) : "successful"); +#endif + if (status != APR_SUCCESS) + return status; + + status = apr_file_info_get(&finfo, APR_FINFO_TYPE, file); + if (status != APR_SUCCESS) + return status; + + if (finfo.filetype != APR_REG && +#if defined(WIN32) || defined(OS2) || defined(NETWARE) + strcasecmp(apr_filename_of_pathname(name), "nul") != 0) { +#else + strcmp(name, "/dev/null") != 0) { +#endif /* WIN32 || OS2 */ + ap_log_error(APLOG_MARK, APLOG_ERR, 0, NULL, + "Access to file %s denied by server: not a regular file", + name); + apr_file_close(file); + return APR_EBADF; + } + +#ifdef WIN32 + /* Some twisted character [no pun intended] at MS decided that a + * zero width joiner as the lead wide character would be ideal for + * describing Unicode text files. This was further convoluted to + * another MSism that the same character mapped into utf-8, EF BB BF + * would signify utf-8 text files. + * + * Since MS configuration files are all protecting utf-8 encoded + * Unicode path, file and resource names, we already have the correct + * WinNT encoding. But at least eat the stupid three bytes up front. + */ + { + unsigned char buf[4]; + apr_size_t len = 3; + status = apr_file_read(file, buf, &len); + if ((status != APR_SUCCESS) || (len < 3) + || memcmp(buf, "\xEF\xBB\xBF", 3) != 0) { + apr_off_t zero = 0; + apr_file_seek(file, APR_SET, &zero); + } + } +#endif + + new_cfg = apr_palloc(p, sizeof(*new_cfg)); + new_cfg->param = file; + new_cfg->name = apr_pstrdup(p, name); + new_cfg->getch = (int (*)(void *)) cfg_getch; + new_cfg->getstr = (void *(*)(void *, size_t, void *)) cfg_getstr; + new_cfg->close = (int (*)(void *)) cfg_close; + new_cfg->line_number = 0; + *ret_cfg = new_cfg; + return APR_SUCCESS; +} + + +/* Allocate a ap_configfile_t handle with user defined functions and params */ +AP_DECLARE(ap_configfile_t *) ap_pcfg_open_custom(apr_pool_t *p, + const char *descr, + void *param, + int(*getch)(void *param), + void *(*getstr) (void *buf, size_t bufsiz, void *param), + int(*close_func)(void *param)) +{ + ap_configfile_t *new_cfg = apr_palloc(p, sizeof(*new_cfg)); +#ifdef DEBUG + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, NULL, + "Opening config handler %s", descr); +#endif + new_cfg->param = param; + new_cfg->name = descr; + new_cfg->getch = getch; + new_cfg->getstr = getstr; + new_cfg->close = close_func; + new_cfg->line_number = 0; + return new_cfg; +} + +/* Read one character from a configfile_t */ +AP_DECLARE(int) ap_cfg_getc(ap_configfile_t *cfp) +{ + register int ch = cfp->getch(cfp->param); + if (ch == LF) + ++cfp->line_number; + return ch; +} + +/* Read one line from open ap_configfile_t, strip LF, increase line number */ +/* If custom handler does not define a getstr() function, read char by char */ +AP_DECLARE(int) ap_cfg_getline(char *buf, size_t bufsize, ap_configfile_t *cfp) +{ + /* If a "get string" function is defined, use it */ + if (cfp->getstr != NULL) { + char *src, *dst; + char *cp; + char *cbuf = buf; + size_t cbufsize = bufsize; + + while (1) { + ++cfp->line_number; + if (cfp->getstr(cbuf, cbufsize, cfp->param) == NULL) + return 1; + + /* + * check for line continuation, + * i.e. match [^\\]\\[\r]\n only + */ + cp = cbuf; + while (cp < cbuf+cbufsize && *cp != '\0') + cp++; + if (cp > cbuf && cp[-1] == LF) { + cp--; + if (cp > cbuf && cp[-1] == CR) + cp--; + if (cp > cbuf && cp[-1] == '\\') { + cp--; + if (!(cp > cbuf && cp[-1] == '\\')) { + /* + * line continuation requested - + * then remove backslash and continue + */ + cbufsize -= (cp-cbuf); + cbuf = cp; + continue; + } + else { + /* + * no real continuation because escaped - + * then just remove escape character + */ + for ( ; cp < cbuf+cbufsize && *cp != '\0'; cp++) + cp[0] = cp[1]; + } + } + } + break; + } + + /* + * Leading and trailing white space is eliminated completely + */ + src = buf; + while (apr_isspace(*src)) + ++src; + /* blast trailing whitespace */ + dst = &src[strlen(src)]; + while (--dst >= src && apr_isspace(*dst)) + *dst = '\0'; + /* Zap leading whitespace by shifting */ + if (src != buf) + for (dst = buf; (*dst++ = *src++) != '\0'; ) + ; + +#ifdef DEBUG_CFG_LINES + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, NULL, "Read config: %s", buf); +#endif + return 0; + } else { + /* No "get string" function defined; read character by character */ + register int c; + register size_t i = 0; + + buf[0] = '\0'; + /* skip leading whitespace */ + do { + c = cfp->getch(cfp->param); + } while (c == '\t' || c == ' '); + + if (c == EOF) + return 1; + + if(bufsize < 2) { + /* too small, assume caller is crazy */ + return 1; + } + + while (1) { + if ((c == '\t') || (c == ' ')) { + buf[i++] = ' '; + while ((c == '\t') || (c == ' ')) + c = cfp->getch(cfp->param); + } + if (c == CR) { + /* silently ignore CR (_assume_ that a LF follows) */ + c = cfp->getch(cfp->param); + } + if (c == LF) { + /* increase line number and return on LF */ + ++cfp->line_number; + } + if (c == EOF || c == 0x4 || c == LF || i >= (bufsize - 2)) { + /* + * check for line continuation + */ + if (i > 0 && buf[i-1] == '\\') { + i--; + if (!(i > 0 && buf[i-1] == '\\')) { + /* line is continued */ + c = cfp->getch(cfp->param); + continue; + } + /* else nothing needs be done because + * then the backslash is escaped and + * we just strip to a single one + */ + } + /* blast trailing whitespace */ + while (i > 0 && apr_isspace(buf[i - 1])) + --i; + buf[i] = '\0'; +#ifdef DEBUG_CFG_LINES + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, NULL, + "Read config: %s", buf); +#endif + return 0; + } + buf[i] = c; + ++i; + c = cfp->getch(cfp->param); + } + } +} + +/* Size an HTTP header field list item, as separated by a comma. + * The return value is a pointer to the beginning of the non-empty list item + * within the original string (or NULL if there is none) and the address + * of field is shifted to the next non-comma, non-whitespace character. + * len is the length of the item excluding any beginning whitespace. + */ +AP_DECLARE(const char *) ap_size_list_item(const char **field, int *len) +{ + const unsigned char *ptr = (const unsigned char *)*field; + const unsigned char *token; + int in_qpair, in_qstr, in_com; + + /* Find first non-comma, non-whitespace byte */ + + while (*ptr == ',' || apr_isspace(*ptr)) + ++ptr; + + token = ptr; + + /* Find the end of this item, skipping over dead bits */ + + for (in_qpair = in_qstr = in_com = 0; + *ptr && (in_qpair || in_qstr || in_com || *ptr != ','); + ++ptr) { + + if (in_qpair) { + in_qpair = 0; + } + else { + switch (*ptr) { + case '\\': in_qpair = 1; /* quoted-pair */ + break; + case '"' : if (!in_com) /* quoted string delim */ + in_qstr = !in_qstr; + break; + case '(' : if (!in_qstr) /* comment (may nest) */ + ++in_com; + break; + case ')' : if (in_com) /* end comment */ + --in_com; + break; + default : break; + } + } + } + + if ((*len = (ptr - token)) == 0) { + *field = (const char *)ptr; + return NULL; + } + + /* Advance field pointer to the next non-comma, non-white byte */ + + while (*ptr == ',' || apr_isspace(*ptr)) + ++ptr; + + *field = (const char *)ptr; + return (const char *)token; +} + +/* Retrieve an HTTP header field list item, as separated by a comma, + * while stripping insignificant whitespace and lowercasing anything not in + * a quoted string or comment. The return value is a new string containing + * the converted list item (or NULL if none) and the address pointed to by + * field is shifted to the next non-comma, non-whitespace. + */ +AP_DECLARE(char *) ap_get_list_item(apr_pool_t *p, const char **field) +{ + const char *tok_start; + const unsigned char *ptr; + unsigned char *pos; + char *token; + int addspace = 0, in_qpair = 0, in_qstr = 0, in_com = 0, tok_len = 0; + + /* Find the beginning and maximum length of the list item so that + * we can allocate a buffer for the new string and reset the field. + */ + if ((tok_start = ap_size_list_item(field, &tok_len)) == NULL) { + return NULL; + } + token = apr_palloc(p, tok_len + 1); + + /* Scan the token again, but this time copy only the good bytes. + * We skip extra whitespace and any whitespace around a '=', '/', + * or ';' and lowercase normal characters not within a comment, + * quoted-string or quoted-pair. + */ + for (ptr = (const unsigned char *)tok_start, pos = (unsigned char *)token; + *ptr && (in_qpair || in_qstr || in_com || *ptr != ','); + ++ptr) { + + if (in_qpair) { + in_qpair = 0; + *pos++ = *ptr; + } + else { + switch (*ptr) { + case '\\': in_qpair = 1; + if (addspace == 1) + *pos++ = ' '; + *pos++ = *ptr; + addspace = 0; + break; + case '"' : if (!in_com) + in_qstr = !in_qstr; + if (addspace == 1) + *pos++ = ' '; + *pos++ = *ptr; + addspace = 0; + break; + case '(' : if (!in_qstr) + ++in_com; + if (addspace == 1) + *pos++ = ' '; + *pos++ = *ptr; + addspace = 0; + break; + case ')' : if (in_com) + --in_com; + *pos++ = *ptr; + addspace = 0; + break; + case ' ' : + case '\t': if (addspace) + break; + if (in_com || in_qstr) + *pos++ = *ptr; + else + addspace = 1; + break; + case '=' : + case '/' : + case ';' : if (!(in_com || in_qstr)) + addspace = -1; + *pos++ = *ptr; + break; + default : if (addspace == 1) + *pos++ = ' '; + *pos++ = (in_com || in_qstr) ? *ptr + : apr_tolower(*ptr); + addspace = 0; + break; + } + } + } + *pos = '\0'; + + return token; +} + +/* Find an item in canonical form (lowercase, no extra spaces) within + * an HTTP field value list. Returns 1 if found, 0 if not found. + * This would be much more efficient if we stored header fields as + * an array of list items as they are received instead of a plain string. + */ +AP_DECLARE(int) ap_find_list_item(apr_pool_t *p, const char *line, + const char *tok) +{ + const unsigned char *pos; + const unsigned char *ptr = (const unsigned char *)line; + int good = 0, addspace = 0, in_qpair = 0, in_qstr = 0, in_com = 0; + + if (!line || !tok) + return 0; + + do { /* loop for each item in line's list */ + + /* Find first non-comma, non-whitespace byte */ + + while (*ptr == ',' || apr_isspace(*ptr)) + ++ptr; + + if (*ptr) + good = 1; /* until proven otherwise for this item */ + else + break; /* no items left and nothing good found */ + + /* We skip extra whitespace and any whitespace around a '=', '/', + * or ';' and lowercase normal characters not within a comment, + * quoted-string or quoted-pair. + */ + for (pos = (const unsigned char *)tok; + *ptr && (in_qpair || in_qstr || in_com || *ptr != ','); + ++ptr) { + + if (in_qpair) { + in_qpair = 0; + if (good) + good = (*pos++ == *ptr); + } + else { + switch (*ptr) { + case '\\': in_qpair = 1; + if (addspace == 1) + good = good && (*pos++ == ' '); + good = good && (*pos++ == *ptr); + addspace = 0; + break; + case '"' : if (!in_com) + in_qstr = !in_qstr; + if (addspace == 1) + good = good && (*pos++ == ' '); + good = good && (*pos++ == *ptr); + addspace = 0; + break; + case '(' : if (!in_qstr) + ++in_com; + if (addspace == 1) + good = good && (*pos++ == ' '); + good = good && (*pos++ == *ptr); + addspace = 0; + break; + case ')' : if (in_com) + --in_com; + good = good && (*pos++ == *ptr); + addspace = 0; + break; + case ' ' : + case '\t': if (addspace || !good) + break; + if (in_com || in_qstr) + good = (*pos++ == *ptr); + else + addspace = 1; + break; + case '=' : + case '/' : + case ';' : if (!(in_com || in_qstr)) + addspace = -1; + good = good && (*pos++ == *ptr); + break; + default : if (!good) + break; + if (addspace == 1) + good = (*pos++ == ' '); + if (in_com || in_qstr) + good = good && (*pos++ == *ptr); + else + good = good && (*pos++ == apr_tolower(*ptr)); + addspace = 0; + break; + } + } + } + if (good && *pos) + good = 0; /* not good if only a prefix was matched */ + + } while (*ptr && !good); + + return good; +} + + +/* Retrieve a token, spacing over it and returning a pointer to + * the first non-white byte afterwards. Note that these tokens + * are delimited by semis and commas; and can also be delimited + * by whitespace at the caller's option. + */ + +AP_DECLARE(char *) ap_get_token(apr_pool_t *p, const char **accept_line, + int accept_white) +{ + const char *ptr = *accept_line; + const char *tok_start; + char *token; + int tok_len; + + /* Find first non-white byte */ + + while (*ptr && apr_isspace(*ptr)) + ++ptr; + + tok_start = ptr; + + /* find token end, skipping over quoted strings. + * (comments are already gone). + */ + + while (*ptr && (accept_white || !apr_isspace(*ptr)) + && *ptr != ';' && *ptr != ',') { + if (*ptr++ == '"') + while (*ptr) + if (*ptr++ == '"') + break; + } + + tok_len = ptr - tok_start; + token = apr_pstrndup(p, tok_start, tok_len); + + /* Advance accept_line pointer to the next non-white byte */ + + while (*ptr && apr_isspace(*ptr)) + ++ptr; + + *accept_line = ptr; + return token; +} + + +/* find http tokens, see the definition of token from RFC2068 */ +AP_DECLARE(int) ap_find_token(apr_pool_t *p, const char *line, const char *tok) +{ + const unsigned char *start_token; + const unsigned char *s; + + if (!line) + return 0; + + s = (const unsigned char *)line; + for (;;) { + /* find start of token, skip all stop characters, note NUL + * isn't a token stop, so we don't need to test for it + */ + while (TEST_CHAR(*s, T_HTTP_TOKEN_STOP)) { + ++s; + } + if (!*s) { + return 0; + } + start_token = s; + /* find end of the token */ + while (*s && !TEST_CHAR(*s, T_HTTP_TOKEN_STOP)) { + ++s; + } + if (!strncasecmp((const char *)start_token, (const char *)tok, + s - start_token)) { + return 1; + } + if (!*s) { + return 0; + } + } +} + + +AP_DECLARE(int) ap_find_last_token(apr_pool_t *p, const char *line, + const char *tok) +{ + int llen, tlen, lidx; + + if (!line) + return 0; + + llen = strlen(line); + tlen = strlen(tok); + lidx = llen - tlen; + + if (lidx < 0 || + (lidx > 0 && !(apr_isspace(line[lidx - 1]) || line[lidx - 1] == ','))) + return 0; + + return (strncasecmp(&line[lidx], tok, tlen) == 0); +} + +AP_DECLARE(char *) ap_escape_shell_cmd(apr_pool_t *p, const char *str) +{ + char *cmd; + unsigned char *d; + const unsigned char *s; + + cmd = apr_palloc(p, 2 * strlen(str) + 1); /* Be safe */ + d = (unsigned char *)cmd; + s = (const unsigned char *)str; + for (; *s; ++s) { + +#if defined(OS2) || defined(WIN32) + /* + * Newlines to Win32/OS2 CreateProcess() are ill advised. + * Convert them to spaces since they are effectively white + * space to most applications + */ + if (*s == '\r' || *s == '\n') { + *d++ = ' '; + continue; + } +#endif + + if (TEST_CHAR(*s, T_ESCAPE_SHELL_CMD)) { + *d++ = '\\'; + } + *d++ = *s; + } + *d = '\0'; + + return cmd; +} + +static char x2c(const char *what) +{ + register char digit; + +#if !APR_CHARSET_EBCDIC + digit = ((what[0] >= 'A') ? ((what[0] & 0xdf) - 'A') + 10 + : (what[0] - '0')); + digit *= 16; + digit += (what[1] >= 'A' ? ((what[1] & 0xdf) - 'A') + 10 + : (what[1] - '0')); +#else /*APR_CHARSET_EBCDIC*/ + char xstr[5]; + xstr[0]='0'; + xstr[1]='x'; + xstr[2]=what[0]; + xstr[3]=what[1]; + xstr[4]='\0'; + digit = apr_xlate_conv_byte(ap_hdrs_from_ascii, + 0xFF & strtol(xstr, NULL, 16)); +#endif /*APR_CHARSET_EBCDIC*/ + return (digit); +} + +/* + * Unescapes a URL. + * Returns 0 on success, non-zero on error + * Failure is due to + * bad % escape returns HTTP_BAD_REQUEST + * + * decoding %00 -> \0 (the null character) + * decoding %2f -> / (a special character) + * returns HTTP_NOT_FOUND + */ +AP_DECLARE(int) ap_unescape_url(char *url) +{ + register int badesc, badpath; + char *x, *y; + + badesc = 0; + badpath = 0; + /* Initial scan for first '%'. Don't bother writing values before + * seeing a '%' */ + y = strchr(url, '%'); + if (y == NULL) { + return OK; + } + for (x = y; *y; ++x, ++y) { + if (*y != '%') + *x = *y; + else { + if (!apr_isxdigit(*(y + 1)) || !apr_isxdigit(*(y + 2))) { + badesc = 1; + *x = '%'; + } + else { + *x = x2c(y + 1); + y += 2; + if (IS_SLASH(*x) || *x == '\0') + badpath = 1; + } + } + } + *x = '\0'; + if (badesc) + return HTTP_BAD_REQUEST; + else if (badpath) + return HTTP_NOT_FOUND; + else + return OK; +} + +AP_DECLARE(int) ap_unescape_url_keep2f(char *url) +{ + register int badesc, badpath; + char *x, *y; + + badesc = 0; + badpath = 0; + /* Initial scan for first '%'. Don't bother writing values before + * seeing a '%' */ + y = strchr(url, '%'); + if (y == NULL) { + return OK; + } + for (x = y; *y; ++x, ++y) { + if (*y != '%') { + *x = *y; + } + else { + if (!apr_isxdigit(*(y + 1)) || !apr_isxdigit(*(y + 2))) { + badesc = 1; + *x = '%'; + } + else { + char decoded; + decoded = x2c(y + 1); + if (decoded == '\0') { + badpath = 1; + } + else { + *x = decoded; + y += 2; + } + } + } + } + *x = '\0'; + if (badesc) { + return HTTP_BAD_REQUEST; + } + else if (badpath) { + return HTTP_NOT_FOUND; + } + else { + return OK; + } +} + +AP_DECLARE(char *) ap_construct_server(apr_pool_t *p, const char *hostname, + apr_port_t port, const request_rec *r) +{ + if (ap_is_default_port(port, r)) { + return apr_pstrdup(p, hostname); + } + else { + return apr_psprintf(p, "%s:%u", hostname, port); + } +} + +/* c2x takes an unsigned, and expects the caller has guaranteed that + * 0 <= what < 256... which usually means that you have to cast to + * unsigned char first, because (unsigned)(char)(x) first goes through + * signed extension to an int before the unsigned cast. + * + * The reason for this assumption is to assist gcc code generation -- + * the unsigned char -> unsigned extension is already done earlier in + * both uses of this code, so there's no need to waste time doing it + * again. + */ +static const char c2x_table[] = "0123456789abcdef"; + +static APR_INLINE unsigned char *c2x(unsigned what, unsigned char *where) +{ +#if APR_CHARSET_EBCDIC + what = apr_xlate_conv_byte(ap_hdrs_to_ascii, (unsigned char)what); +#endif /*APR_CHARSET_EBCDIC*/ + *where++ = '%'; + *where++ = c2x_table[what >> 4]; + *where++ = c2x_table[what & 0xf]; + return where; +} + +/* + * escape_path_segment() escapes a path segment, as defined in RFC 1808. This + * routine is (should be) OS independent. + * + * os_escape_path() converts an OS path to a URL, in an OS dependent way. In all + * cases if a ':' occurs before the first '/' in the URL, the URL should be + * prefixed with "./" (or the ':' escaped). In the case of Unix, this means + * leaving '/' alone, but otherwise doing what escape_path_segment() does. For + * efficiency reasons, we don't use escape_path_segment(), which is provided for + * reference. Again, RFC 1808 is where this stuff is defined. + * + * If partial is set, os_escape_path() assumes that the path will be appended to + * something with a '/' in it (and thus does not prefix "./"). + */ + +AP_DECLARE(char *) ap_escape_path_segment(apr_pool_t *p, const char *segment) +{ + char *copy = apr_palloc(p, 3 * strlen(segment) + 1); + const unsigned char *s = (const unsigned char *)segment; + unsigned char *d = (unsigned char *)copy; + unsigned c; + + while ((c = *s)) { + if (TEST_CHAR(c, T_ESCAPE_PATH_SEGMENT)) { + d = c2x(c, d); + } + else { + *d++ = c; + } + ++s; + } + *d = '\0'; + return copy; +} + +AP_DECLARE(char *) ap_os_escape_path(apr_pool_t *p, const char *path, int partial) +{ + char *copy = apr_palloc(p, 3 * strlen(path) + 3); + const unsigned char *s = (const unsigned char *)path; + unsigned char *d = (unsigned char *)copy; + unsigned c; + + if (!partial) { + const char *colon = ap_strchr_c(path, ':'); + const char *slash = ap_strchr_c(path, '/'); + + if (colon && (!slash || colon < slash)) { + *d++ = '.'; + *d++ = '/'; + } + } + while ((c = *s)) { + if (TEST_CHAR(c, T_OS_ESCAPE_PATH)) { + d = c2x(c, d); + } + else { + *d++ = c; + } + ++s; + } + *d = '\0'; + return copy; +} + +/* ap_escape_uri is now a macro for os_escape_path */ + +AP_DECLARE(char *) ap_escape_html(apr_pool_t *p, const char *s) +{ + int i, j; + char *x; + + /* first, count the number of extra characters */ + for (i = 0, j = 0; s[i] != '\0'; i++) + if (s[i] == '<' || s[i] == '>') + j += 3; + else if (s[i] == '&') + j += 4; + else if (s[i] == '"') + j += 5; + + if (j == 0) + return apr_pstrmemdup(p, s, i); + + x = apr_palloc(p, i + j + 1); + for (i = 0, j = 0; s[i] != '\0'; i++, j++) + if (s[i] == '<') { + memcpy(&x[j], "<", 4); + j += 3; + } + else if (s[i] == '>') { + memcpy(&x[j], ">", 4); + j += 3; + } + else if (s[i] == '&') { + memcpy(&x[j], "&", 5); + j += 4; + } + else if (s[i] == '"') { + memcpy(&x[j], """, 6); + j += 5; + } + else + x[j] = s[i]; + + x[j] = '\0'; + return x; +} + +AP_DECLARE(char *) ap_escape_logitem(apr_pool_t *p, const char *str) +{ + char *ret; + unsigned char *d; + const unsigned char *s; + + if (!str) { + return NULL; + } + + ret = apr_palloc(p, 4 * strlen(str) + 1); /* Be safe */ + d = (unsigned char *)ret; + s = (const unsigned char *)str; + for (; *s; ++s) { + + if (TEST_CHAR(*s, T_ESCAPE_LOGITEM)) { + *d++ = '\\'; + switch(*s) { + case '\b': + *d++ = 'b'; + break; + case '\n': + *d++ = 'n'; + break; + case '\r': + *d++ = 'r'; + break; + case '\t': + *d++ = 't'; + break; + case '\v': + *d++ = 'v'; + break; + case '\\': + case '"': + *d++ = *s; + break; + default: + c2x(*s, d); + *d = 'x'; + d += 3; + } + } + else { + *d++ = *s; + } + } + *d = '\0'; + + return ret; +} + +AP_DECLARE(apr_size_t) ap_escape_errorlog_item(char *dest, const char *source, + apr_size_t buflen) +{ + unsigned char *d, *ep; + const unsigned char *s; + + if (!source || !buflen) { /* be safe */ + return 0; + } + + d = (unsigned char *)dest; + s = (const unsigned char *)source; + ep = d + buflen - 1; + + for (; d < ep && *s; ++s) { + + if (TEST_CHAR(*s, T_ESCAPE_LOGITEM)) { + *d++ = '\\'; + if (d >= ep) { + --d; + break; + } + + switch(*s) { + case '\b': + *d++ = 'b'; + break; + case '\n': + *d++ = 'n'; + break; + case '\r': + *d++ = 'r'; + break; + case '\t': + *d++ = 't'; + break; + case '\v': + *d++ = 'v'; + break; + case '\\': + *d++ = *s; + break; + case '"': /* no need for this in error log */ + d[-1] = *s; + break; + default: + if (d >= ep - 2) { + ep = --d; /* break the for loop as well */ + break; + } + c2x(*s, d); + *d = 'x'; + d += 3; + } + } + else { + *d++ = *s; + } + } + *d = '\0'; + + return (d - (unsigned char *)dest); +} + +AP_DECLARE(int) ap_is_directory(apr_pool_t *p, const char *path) +{ + apr_finfo_t finfo; + + if (apr_stat(&finfo, path, APR_FINFO_TYPE, p) != APR_SUCCESS) + return 0; /* in error condition, just return no */ + + return (finfo.filetype == APR_DIR); +} + +AP_DECLARE(int) ap_is_rdirectory(apr_pool_t *p, const char *path) +{ + apr_finfo_t finfo; + + if (apr_lstat(&finfo, path, APR_FINFO_TYPE, p) != APR_SUCCESS) + return 0; /* in error condition, just return no */ + + return (finfo.filetype == APR_DIR); +} + +AP_DECLARE(char *) ap_make_full_path(apr_pool_t *a, const char *src1, + const char *src2) +{ + apr_size_t len1, len2; + char *path; + + len1 = strlen(src1); + len2 = strlen(src2); + /* allocate +3 for '/' delimiter, trailing NULL and overallocate + * one extra byte to allow the caller to add a trailing '/' + */ + path = (char *)apr_palloc(a, len1 + len2 + 3); + if (len1 == 0) { + *path = '/'; + memcpy(path + 1, src2, len2 + 1); + } + else { + char *next; + memcpy(path, src1, len1); + next = path + len1; + if (next[-1] != '/') { + *next++ = '/'; + } + memcpy(next, src2, len2 + 1); + } + return path; +} + +/* + * Check for an absoluteURI syntax (see section 3.2 in RFC2068). + */ +AP_DECLARE(int) ap_is_url(const char *u) +{ + register int x; + + for (x = 0; u[x] != ':'; x++) { + if ((!u[x]) || + ((!apr_isalpha(u[x])) && (!apr_isdigit(u[x])) && + (u[x] != '+') && (u[x] != '-') && (u[x] != '.'))) { + return 0; + } + } + + return (x ? 1 : 0); /* If the first character is ':', it's broken, too */ +} + +AP_DECLARE(int) ap_ind(const char *s, char c) +{ + const char *p = ap_strchr_c(s, c); + + if (p == NULL) + return -1; + return p - s; +} + +AP_DECLARE(int) ap_rind(const char *s, char c) +{ + const char *p = ap_strrchr_c(s, c); + + if (p == NULL) + return -1; + return p - s; +} + +AP_DECLARE(void) ap_str_tolower(char *str) +{ + while (*str) { + *str = apr_tolower(*str); + ++str; + } +} + +static char *find_fqdn(apr_pool_t *a, struct hostent *p) +{ + int x; + + if (!strchr(p->h_name, '.')) { + if (p->h_aliases) { + for (x = 0; p->h_aliases[x]; ++x) { + if (strchr(p->h_aliases[x], '.') && + (!strncasecmp(p->h_aliases[x], p->h_name, + strlen(p->h_name)))) + return apr_pstrdup(a, p->h_aliases[x]); + } + } + return NULL; + } + return apr_pstrdup(a, (void *) p->h_name); +} + +char *ap_get_local_host(apr_pool_t *a) +{ +#ifndef MAXHOSTNAMELEN +#define MAXHOSTNAMELEN 256 +#endif + char str[MAXHOSTNAMELEN + 1]; + char *server_hostname = NULL; + struct hostent *p; + +#ifdef BEOS_R5 + if (gethostname(str, sizeof(str) - 1) == 0) +#else + if (gethostname(str, sizeof(str) - 1) != 0) +#endif + { + ap_log_perror(APLOG_MARK, APLOG_STARTUP | APLOG_WARNING, 0, a, + "%s: gethostname() failed to determine ServerName", + ap_server_argv0); + } + else + { + str[sizeof(str) - 1] = '\0'; + /* TODO: Screaming for APR-ization */ + if ((!(p = gethostbyname(str))) + || (!(server_hostname = find_fqdn(a, p)))) { + /* Recovery - return the default servername by IP: */ + if (p && p->h_addr_list[0]) { + apr_snprintf(str, sizeof(str), "%pA", p->h_addr_list[0]); + server_hostname = apr_pstrdup(a, str); + /* We will drop through to report the IP-named server */ + } + } + else { + /* Since we found a fdqn, return it with no logged message. */ + return server_hostname; + } + } + + if (!server_hostname) + server_hostname = apr_pstrdup(a, "127.0.0.1"); + + ap_log_perror(APLOG_MARK, APLOG_ALERT|APLOG_STARTUP, 0, a, + "%s: Could not determine the server's fully qualified " + "domain name, using %s for ServerName", + ap_server_argv0, server_hostname); + + return server_hostname; +} + +/* simple 'pool' alloc()ing glue to apr_base64.c + */ +AP_DECLARE(char *) ap_pbase64decode(apr_pool_t *p, const char *bufcoded) +{ + char *decoded; + int l; + + decoded = (char *) apr_palloc(p, 1 + apr_base64_decode_len(bufcoded)); + l = apr_base64_decode(decoded, bufcoded); + decoded[l] = '\0'; /* make binary sequence into string */ + + return decoded; +} + +AP_DECLARE(char *) ap_pbase64encode(apr_pool_t *p, char *string) +{ + char *encoded; + int l = strlen(string); + + encoded = (char *) apr_palloc(p, 1 + apr_base64_encode_len(l)); + l = apr_base64_encode(encoded, string, l); + encoded[l] = '\0'; /* make binary sequence into string */ + + return encoded; +} + +/* we want to downcase the type/subtype for comparison purposes + * but nothing else because ;parameter=foo values are case sensitive. + * XXX: in truth we want to downcase parameter names... but really, + * apache has never handled parameters and such correctly. You + * also need to compress spaces and such to be able to compare + * properly. -djg + */ +AP_DECLARE(void) ap_content_type_tolower(char *str) +{ + char *semi; + + semi = strchr(str, ';'); + if (semi) { + *semi = '\0'; + } + while (*str) { + *str = apr_tolower(*str); + ++str; + } + if (semi) { + *semi = ';'; + } +} + +/* + * Given a string, replace any bare " with \" . + */ +AP_DECLARE(char *) ap_escape_quotes(apr_pool_t *p, const char *instring) +{ + int newlen = 0; + const char *inchr = instring; + char *outchr, *outstring; + + /* + * Look through the input string, jogging the length of the output + * string up by an extra byte each time we find an unescaped ". + */ + while (*inchr != '\0') { + newlen++; + if (*inchr == '"') { + newlen++; + } + /* + * If we find a slosh, and it's not the last byte in the string, + * it's escaping something - advance past both bytes. + */ + if ((*inchr == '\\') && (inchr[1] != '\0')) { + inchr++; + newlen++; + } + inchr++; + } + outstring = apr_palloc(p, newlen + 1); + inchr = instring; + outchr = outstring; + /* + * Now copy the input string to the output string, inserting a slosh + * in front of every " that doesn't already have one. + */ + while (*inchr != '\0') { + if ((*inchr == '\\') && (inchr[1] != '\0')) { + *outchr++ = *inchr++; + *outchr++ = *inchr++; + } + if (*inchr == '"') { + *outchr++ = '\\'; + } + if (*inchr != '\0') { + *outchr++ = *inchr++; + } + } + *outchr = '\0'; + return outstring; +} diff --git a/rubbos/app/httpd-2.0.64/server/util.lo b/rubbos/app/httpd-2.0.64/server/util.lo new file mode 100644 index 00000000..e41a8081 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/util.lo @@ -0,0 +1,12 @@ +# util.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/util.o' + +# Name of the non-PIC object. +non_pic_object='util.o' + diff --git a/rubbos/app/httpd-2.0.64/server/util.o b/rubbos/app/httpd-2.0.64/server/util.o new file mode 100644 index 0000000000000000000000000000000000000000..c297bbc1ca588b2182d07d1e359db8f52a41826c GIT binary patch literal 133536 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 + +ap_directive_t *ap_add_node(ap_directive_t **parent, ap_directive_t *current, + ap_directive_t *toadd, int child) +{ + if (current == NULL) { + /* we just started a new parent */ + if (*parent != NULL) { + (*parent)->first_child = toadd; + toadd->parent = *parent; + } + if (child) { + /* First item in config file or container is a container */ + *parent = toadd; + return NULL; + } + return toadd; + } + current->next = toadd; + toadd->parent = *parent; + if (child) { + /* switch parents, navigate into child */ + *parent = toadd; + return NULL; + } + return toadd; +} + + diff --git a/rubbos/app/httpd-2.0.64/server/util_cfgtree.lo b/rubbos/app/httpd-2.0.64/server/util_cfgtree.lo new file mode 100644 index 00000000..60941280 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/util_cfgtree.lo @@ -0,0 +1,12 @@ +# util_cfgtree.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/util_cfgtree.o' + +# Name of the non-PIC object. +non_pic_object='util_cfgtree.o' + diff --git a/rubbos/app/httpd-2.0.64/server/util_cfgtree.o b/rubbos/app/httpd-2.0.64/server/util_cfgtree.o new file mode 100644 index 0000000000000000000000000000000000000000..55b3915f0a92e65aa05229c287a3b478e2d3f504 GIT binary patch literal 3960 zcmb_e&2Jk;6rc6RjZ-&{6O*r|5=Ky(LcRG=6rxlKp;22`sUQRb+{}8twpVf1W<3r` zK=jb2QbYwgfGQ9-q;lto5UP|@D-JzzLqhxkNF1mT9N@i~H_m#pNC@$y-Fff#KIhHO z%-*)B4`zh_2z`#XiQW&Z;Tc&n{$^ka}f1xpm0&QU8 z7!5^SB3|E%>5vVwPr-x!CJG_C9pb|*+J@;I2zcoJSN|#S)nj6OmA|ejHBp>F@+LyB z5S^0z2o=^3BHD=y0!BQ)kQU(4Vd_s^mzUP=%e!IDZlCy=EuuV&))zH=cMWcR?sT-{e5l1 zN>t-}U>)WEJr(sF#Z!awQ{yf2S9&!*j+#`2E#BZ5t9@5cfZxeqpO>0HnKA5dRI0Zl z`UiLQvHoFS^}U0!$HgxYV_%{WA~kOXMb(bF1MyqJ*eW>;0M-kSs$Z=uu4z>MpTzIT z(b)=Sg7o|f*GIJLV!!^S<0!+u8wCTduYxo)BP+x>QJqIzKMhqJ@uzq!w<&)QBXDYh zrZGh)H4sFT;R+uolhI)mQl)_(2=$?TPHWd^_>TnL)y!~t6_2>efH9i*}Xuc!pAA^qK2O)`Lc$8O7e9L-z8b) zQStK>-`4CigjY4(C;S}^PZ7SY;a`z_L&HgAA8WX(=)pJq9ZIab`s`$!o jU9-PU^{Bmo_H=X#4em1}bPLy`)?LT5Xbgn5Vf()UdeLCA literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/server/util_charset.c b/rubbos/app/httpd-2.0.64/server/util_charset.c new file mode 100644 index 00000000..c21cf103 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/util_charset.c @@ -0,0 +1,57 @@ +/* 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. + */ + +#include "ap_config.h" + +#ifdef APACHE_XLATE + +#include "httpd.h" +#include "http_log.h" +#include "http_core.h" +#include "util_charset.h" + +/* ap_hdrs_to_ascii, ap_hdrs_from_ascii + * + * These are the translation handles used to translate between the network + * format of protocol headers and the local machine format. + * + * For an EBCDIC machine, these are valid handles which are set up at + * initialization to translate between ISO-8859-1 and the code page of + * the source code. + * + * For an ASCII machine, these remain NULL so that when they are stored + * in the BUFF via ap_bsetop(BO_RXLATE) it ensures that no translation is + * performed. + */ + +apr_xlate_t *ap_hdrs_to_ascii, *ap_hdrs_from_ascii; + +/* ap_locale_to_ascii, ap_locale_from_ascii + * + * These handles are used for the translation of content, unless a + * configuration module overrides them. + * + * For an EBCDIC machine, these are valid handles which are set up at + * initialization to translate between ISO-8859-1 and the code page of + * the httpd process's locale. + * + * For an ASCII machine, these remain NULL so that no translation is + * performed (unless a configuration module does something, of course). + */ + +apr_xlate_t *ap_locale_to_ascii, *ap_locale_from_ascii; + +#endif /*APACHE_XLATE*/ diff --git a/rubbos/app/httpd-2.0.64/server/util_charset.lo b/rubbos/app/httpd-2.0.64/server/util_charset.lo new file mode 100644 index 00000000..5b1fe5c5 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/util_charset.lo @@ -0,0 +1,12 @@ +# util_charset.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/util_charset.o' + +# Name of the non-PIC object. +non_pic_object='util_charset.o' + diff --git a/rubbos/app/httpd-2.0.64/server/util_charset.o b/rubbos/app/httpd-2.0.64/server/util_charset.o new file mode 100644 index 0000000000000000000000000000000000000000..fbf7c13419d070b97b0a654a4a58868f0c721783 GIT binary patch literal 2472 zcmbVO&2G~`5FW=V1VY9g=iHif*wEx4oKW8JJ}{t6DP7aRf`bi z#1&qEC*X#-@*W&}<$}Zwi37~+?j+7OTsn$(=KJPn$GdAgM~|L9&N&XSIIsyL#4NyZ zZe&-LS%nfzLyUG_;etvV%gs3ja^-SomC9>X(8@WZeN&{|{8T%ZkSi#Z8xJu^`@orV zZp_RV-I>Li(nT!31jXVeLM&oTn)C`@x@FY@%`qmI5#?YWN5}ayGmWEK1Z*FFgE(zB zW6|)ar%o?!dSlGi_DiqkRf6@P;`v=Uh{Z-z#3E_e5r#>G{uAJ%2Zq zVSUf+-wlqRSPq;^KYSpPVi~-S1{MENpn?cKuNS3j&|%l^yue%7@~}l zd92=<1bqBd96xQBO!x+ByC%8582?S9S=q7A(P48G``sjXMzgYGpP*w>{~yok4DOTq zr}vWG{|<6?P0IXD1IkschNB(3haTdVhY{LXFoCmH0z=mO|H)r6@8i2xUCv{DWb&;r z*f#k#&w0$xp<$mr@^StL4m8@%Cp>AYWAi|HCSexiF5qRaKW)>b`8lwJ{;b&ZXMI_l z;_~q8Zj6U z3&oS9_4(n>s50A>M0-O*Jau!801BNC66U)a!h+Gve>0fAyClT(UK93cK;igL8Unrl zNSObrAp}Mw-hla3gH1qEb=5=D8 O|AO(F6R-XYnfQN|{li)S literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/server/util_debug.c b/rubbos/app/httpd-2.0.64/server/util_debug.c new file mode 100644 index 00000000..0fefc5c8 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/util_debug.c @@ -0,0 +1,128 @@ +/* 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. + */ + +#define APR_WANT_STRFUNC +#include "apr_want.h" + +#include "httpd.h" +#include "http_config.h" + +/* Possibly get rid of the macros we defined in httpd.h */ +#if defined(strchr) +#undef strchr +#endif + +#if defined (strrchr) +#undef strrchr +#endif + +#if defined (strstr) +#undef strstr +#endif + + +#if defined(ap_strchr) +#undef ap_strchr +AP_DECLARE(char *) ap_strchr(char *s, int c); +#endif + +AP_DECLARE(char *) ap_strchr(char *s, int c) +{ + return strchr(s,c); +} + +#if defined(ap_strchr_c) +#undef ap_strchr_c +AP_DECLARE(const char *) ap_strchr_c(const char *s, int c); +#endif + +AP_DECLARE(const char *) ap_strchr_c(const char *s, int c) +{ + return strchr(s,c); +} + +#if defined(ap_strrchr) +#undef ap_strrchr +AP_DECLARE(char *) ap_strrchr(char *s, int c); +#endif + +AP_DECLARE(char *) ap_strrchr(char *s, int c) +{ + return strrchr(s,c); +} + +#if defined(ap_strrchr_c) +#undef ap_strrchr_c +AP_DECLARE(const char *) ap_strrchr_c(const char *s, int c); +#endif + +AP_DECLARE(const char *) ap_strrchr_c(const char *s, int c) +{ + return strrchr(s,c); +} + +#if defined(ap_strstr) +#undef ap_strstr +AP_DECLARE(char *) ap_strstr(char *s, const char *c); +#endif + +AP_DECLARE(char *) ap_strstr(char *s, const char *c) +{ + return strstr(s,c); +} + +#if defined(ap_strstr_c) +#undef ap_strstr_c +AP_DECLARE(const char *) ap_strstr_c(const char *s, const char *c); +#endif + +AP_DECLARE(const char *) ap_strstr_c(const char *s, const char *c) +{ + return strstr(s,c); +} + +#if defined(ap_get_module_config) +#undef ap_get_module_config +AP_DECLARE(void *) ap_get_module_config(const ap_conf_vector_t *cv, + const module *m); +#endif + +AP_DECLARE(void *) ap_get_module_config(const ap_conf_vector_t *cv, + const module *m) +{ + return ((void **)cv)[m->module_index]; +} + +/** + * Generic accessors for other modules to set at their own module-specific + * data + * @param conf_vector The vector in which the modules configuration is stored. + * usually r->per_dir_config or s->module_config + * @param m The module to set the data for. + * @param val The module-specific data to set + * @deffunc void ap_set_module_config(ap_conf_vector_t *cv, const module *m, void *val) + */ +#if defined(ap_set_module_config) +#undef ap_set_module_config +AP_DECLARE(void) ap_set_module_config(ap_conf_vector_t *cv, const module *m, + void *val); +#endif + +AP_DECLARE(void) ap_set_module_config(ap_conf_vector_t *cv, const module *m, + void *val) +{ + ((void **)cv)[m->module_index] = val; +} diff --git a/rubbos/app/httpd-2.0.64/server/util_debug.lo b/rubbos/app/httpd-2.0.64/server/util_debug.lo new file mode 100644 index 00000000..c03cc150 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/util_debug.lo @@ -0,0 +1,12 @@ +# util_debug.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/util_debug.o' + +# Name of the non-PIC object. +non_pic_object='util_debug.o' + diff --git a/rubbos/app/httpd-2.0.64/server/util_debug.o b/rubbos/app/httpd-2.0.64/server/util_debug.o new file mode 100644 index 0000000000000000000000000000000000000000..feea30b4d4a7290d8fe4ed36788c3edcf3ea610b GIT binary patch literal 17968 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/server/util_ebcdic.c b/rubbos/app/httpd-2.0.64/server/util_ebcdic.c new file mode 100644 index 00000000..458ca8f9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/util_ebcdic.c @@ -0,0 +1,126 @@ +/* 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. + */ + +#include "ap_config.h" + +#if APR_CHARSET_EBCDIC + +#include "apr_strings.h" +#include "httpd.h" +#include "http_log.h" +#include "http_core.h" +#include "util_ebcdic.h" + +apr_status_t ap_init_ebcdic(apr_pool_t *pool) +{ + apr_status_t rv; + char buf[80]; + + rv = apr_xlate_open(&ap_hdrs_to_ascii, "ISO8859-1", APR_DEFAULT_CHARSET, pool); + if (rv) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, NULL, + "apr_xlate_open() failed"); + return rv; + } + + rv = apr_xlate_open(&ap_hdrs_from_ascii, APR_DEFAULT_CHARSET, "ISO8859-1", pool); + if (rv) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, NULL, + "apr_xlate_open() failed"); + return rv; + } + + rv = apr_xlate_open(&ap_locale_to_ascii, "ISO8859-1", APR_LOCALE_CHARSET, pool); + if (rv) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, NULL, + "apr_xlate_open() failed"); + return rv; + } + + rv = apr_xlate_open(&ap_locale_from_ascii, APR_LOCALE_CHARSET, "ISO8859-1", pool); + if (rv) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, NULL, + "apr_xlate_open() failed"); + return rv; + } + + rv = apr_MD5InitEBCDIC(ap_hdrs_to_ascii); + if (rv) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, NULL, + "apr_MD5InitEBCDIC() failed"); + return rv; + } + + rv = apr_base64init_ebcdic(ap_hdrs_to_ascii, ap_hdrs_from_ascii); + if (rv) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, NULL, + "apr_base64init_ebcdic() failed"); + return rv; + } + + rv = apr_SHA1InitEBCDIC(ap_hdrs_to_ascii); + if (rv) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, NULL, + "apr_SHA1InitEBCDIC() failed"); + return rv; + } + + return APR_SUCCESS; +} + +void ap_xlate_proto_to_ascii(char *buffer, apr_size_t len) +{ + apr_size_t inbytes_left, outbytes_left; + + inbytes_left = outbytes_left = len; + apr_xlate_conv_buffer(ap_hdrs_to_ascii, buffer, &inbytes_left, + buffer, &outbytes_left); +} + +void ap_xlate_proto_from_ascii(char *buffer, apr_size_t len) +{ + apr_size_t inbytes_left, outbytes_left; + + inbytes_left = outbytes_left = len; + apr_xlate_conv_buffer(ap_hdrs_from_ascii, buffer, &inbytes_left, + buffer, &outbytes_left); +} + +int ap_rvputs_proto_in_ascii(request_rec *r, ...) +{ + va_list va; + const char *s; + char *ascii_s; + apr_size_t len; + apr_size_t written = 0; + + va_start(va, r); + while (1) { + s = va_arg(va, const char *); + if (s == NULL) + break; + len = strlen(s); + ascii_s = apr_pstrndup(r->pool, s, len); + ap_xlate_proto_to_ascii(ascii_s, len); + if (ap_rputs(ascii_s, r) < 0) + return -1; + written += len; + } + va_end(va); + + return written; +} +#endif /* APR_CHARSET_EBCDIC */ diff --git a/rubbos/app/httpd-2.0.64/server/util_ebcdic.lo b/rubbos/app/httpd-2.0.64/server/util_ebcdic.lo new file mode 100644 index 00000000..dc0f4e12 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/util_ebcdic.lo @@ -0,0 +1,12 @@ +# util_ebcdic.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/util_ebcdic.o' + +# Name of the non-PIC object. +non_pic_object='util_ebcdic.o' + diff --git a/rubbos/app/httpd-2.0.64/server/util_ebcdic.o b/rubbos/app/httpd-2.0.64/server/util_ebcdic.o new file mode 100644 index 0000000000000000000000000000000000000000..0b072231f39601629a3e81042fb25627c5d74adb GIT binary patch literal 2472 zcmbVOOK;Oa5FW=V1VTfrssdCHM!XSm+A35PqE(~_df-7T~Zn zj$0yZ!3<18h;doqiYP18maGb;N~M#+m8GjlXPuC_DROpssvmMFRRk&(B?`$LShLpk z+FaGHE!1Yt;pEq#T3ttolceQFrMR%pyNLakfV#uwSO`F|vHZ^Rt+xMMYn|>PdRNi)d zITdK>?NZZSY~GeEfSc?Ox#y$jvGhG1akj_7?ReY+*H02~V>a;I4)fFQRzKX1FehTq z_hYtONPDptb{UpP#h@QD9pmia2GMZHa1Y!N_t(XzQy2SPc;3ea3v@#85{ET6Nh=rU z!@~K;#1*`Vv-2X1TL#w9tiOo~I>E=SU&2~*PFkx)16nLyHk#VIn33;yCK17mdad56 z0(||1PQPvEm3$4oIVYvQsQeA(wKKIZFky0}{jLfe<+U@lk1;W+|Bt6+h3=F3r|**4 z{}yuQoK*Rn2DD4kWuvLx!3=SWnL-BhN?0=rG}M0gKlNAD_xO%6uddVnK-C*Ec&h46 zUe{@U76bF_QBK!?&_dII#e%|qYBQV?hIb${?lWcw7wQnUEa*~^SOLXx-$Iw zo9A?FPkiFk$D}(Ueqx8nPC9v{H@_xwWm}v;-No43pbqPp5|It34Msv+?Bvmu4b`J$ z@uw*3jAqVvNzaCic-vWSaLRgn8vP|4m`~-6bPlKWoAc4QN{bNkX9SADQNV zN(ip LlV1EUq;&rPb63JH literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/server/util_filter.c b/rubbos/app/httpd-2.0.64/server/util_filter.c new file mode 100644 index 00000000..d25ec6c5 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/util_filter.c @@ -0,0 +1,601 @@ +/* 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. + */ + +#define APR_WANT_STRFUNC +#include "apr_want.h" +#include "apr_lib.h" +#include "apr_hash.h" +#include "apr_strings.h" + +#include "httpd.h" +#include "http_log.h" +#include "util_filter.h" + +/* NOTE: Apache's current design doesn't allow a pool to be passed thru, + so we depend on a global to hold the correct pool +*/ +#define FILTER_POOL apr_hook_global_pool +#include "apr_hooks.h" /* for apr_hook_global_pool */ + +/* +** This macro returns true/false if a given filter should be inserted BEFORE +** another filter. This will happen when one of: 1) there isn't another +** filter; 2) that filter has a higher filter type (class); 3) that filter +** corresponds to a different request. +*/ +#define INSERT_BEFORE(f, before_this) ((before_this) == NULL \ + || (before_this)->frec->ftype > (f)->frec->ftype \ + || (before_this)->r != (f)->r) + +/* Trie structure to hold the mapping from registered + * filter names to filters + */ + +typedef struct filter_trie_node filter_trie_node; + +typedef struct { + int c; + filter_trie_node *child; +} filter_trie_child_ptr; + +/* Each trie node has an array of pointers to its children. + * The array is kept in sorted order so that add_any_filter() + * can do a binary search + */ +struct filter_trie_node { + ap_filter_rec_t *frec; + filter_trie_child_ptr *children; + int nchildren; + int size; +}; + +#define TRIE_INITIAL_SIZE 4 + +/* Link a trie node to its parent + */ +static void trie_node_link(apr_pool_t *p, filter_trie_node *parent, + filter_trie_node *child, int c) +{ + int i, j; + + if (parent->nchildren == parent->size) { + filter_trie_child_ptr *new; + parent->size *= 2; + new = (filter_trie_child_ptr *)apr_palloc(p, parent->size * + sizeof(filter_trie_child_ptr)); + memcpy(new, parent->children, parent->nchildren * + sizeof(filter_trie_child_ptr)); + parent->children = new; + } + + for (i = 0; i < parent->nchildren; i++) { + if (c == parent->children[i].c) { + return; + } + else if (c < parent->children[i].c) { + break; + } + } + for (j = parent->nchildren; j > i; j--) { + parent->children[j].c = parent->children[j - 1].c; + parent->children[j].child = parent->children[j - 1].child; + } + parent->children[i].c = c; + parent->children[i].child = child; + + parent->nchildren++; +} + +/* Allocate a new node for a trie. + * If parent is non-NULL, link the new node under the parent node with + * key 'c' (or, if an existing child node matches, return that one) + */ +static filter_trie_node *trie_node_alloc(apr_pool_t *p, + filter_trie_node *parent, char c) +{ + filter_trie_node *new_node; + if (parent) { + int i; + for (i = 0; i < parent->nchildren; i++) { + if (c == parent->children[i].c) { + return parent->children[i].child; + } + else if (c < parent->children[i].c) { + break; + } + } + new_node = + (filter_trie_node *)apr_palloc(p, sizeof(filter_trie_node)); + trie_node_link(p, parent, new_node, c); + } + else { /* No parent node */ + new_node = (filter_trie_node *)apr_palloc(p, + sizeof(filter_trie_node)); + } + + new_node->frec = NULL; + new_node->nchildren = 0; + new_node->size = TRIE_INITIAL_SIZE; + new_node->children = (filter_trie_child_ptr *)apr_palloc(p, + new_node->size * sizeof(filter_trie_child_ptr)); + return new_node; +} + +static filter_trie_node *registered_output_filters = NULL; +static filter_trie_node *registered_input_filters = NULL; + + +static apr_status_t filter_cleanup(void *ctx) +{ + registered_output_filters = NULL; + registered_input_filters = NULL; + return APR_SUCCESS; +} + +static ap_filter_rec_t *get_filter_handle(const char *name, + const filter_trie_node *filter_set) +{ + if (filter_set) { + const char *n; + const filter_trie_node *node; + + node = filter_set; + for (n = name; *n; n++) { + int start, end; + start = 0; + end = node->nchildren - 1; + while (end >= start) { + int middle = (end + start) / 2; + char ch = node->children[middle].c; + if (*n == ch) { + node = node->children[middle].child; + break; + } + else if (*n < ch) { + end = middle - 1; + } + else { + start = middle + 1; + } + } + if (end < start) { + node = NULL; + break; + } + } + + if (node && node->frec) { + return node->frec; + } + } + return NULL; +} + +AP_DECLARE(ap_filter_rec_t *)ap_get_output_filter_handle(const char *name) +{ + return get_filter_handle(name, registered_output_filters); +} + +AP_DECLARE(ap_filter_rec_t *)ap_get_input_filter_handle(const char *name) +{ + return get_filter_handle(name, registered_input_filters); +} + +static ap_filter_rec_t *register_filter(const char *name, + ap_filter_func filter_func, + ap_init_filter_func filter_init, + ap_filter_type ftype, + filter_trie_node **reg_filter_set) +{ + ap_filter_rec_t *frec; + char *normalized_name; + const char *n; + filter_trie_node *node; + + if (!*reg_filter_set) { + *reg_filter_set = trie_node_alloc(FILTER_POOL, NULL, 0); + } + + normalized_name = apr_pstrdup(FILTER_POOL, name); + ap_str_tolower(normalized_name); + + node = *reg_filter_set; + for (n = normalized_name; *n; n++) { + filter_trie_node *child = trie_node_alloc(FILTER_POOL, node, *n); + if (apr_isalpha(*n)) { + trie_node_link(FILTER_POOL, node, child, apr_toupper(*n)); + } + node = child; + } + if (node->frec) { + frec = node->frec; + } + else { + frec = apr_palloc(FILTER_POOL, sizeof(*frec)); + node->frec = frec; + frec->name = normalized_name; + } + frec->filter_func = filter_func; + frec->filter_init_func = filter_init; + frec->ftype = ftype; + + apr_pool_cleanup_register(FILTER_POOL, NULL, filter_cleanup, + apr_pool_cleanup_null); + return frec; +} + +AP_DECLARE(ap_filter_rec_t *) ap_register_input_filter(const char *name, + ap_in_filter_func filter_func, + ap_init_filter_func filter_init, + ap_filter_type ftype) +{ + ap_filter_func f; + f.in_func = filter_func; + return register_filter(name, f, filter_init, ftype, + ®istered_input_filters); +} + +AP_DECLARE(ap_filter_rec_t *) ap_register_output_filter(const char *name, + ap_out_filter_func filter_func, + ap_init_filter_func filter_init, + ap_filter_type ftype) +{ + ap_filter_func f; + f.out_func = filter_func; + return register_filter(name, f, filter_init, ftype, + ®istered_output_filters); +} + +static ap_filter_t *add_any_filter_handle(ap_filter_rec_t *frec, void *ctx, + request_rec *r, conn_rec *c, + ap_filter_t **r_filters, + ap_filter_t **p_filters, + ap_filter_t **c_filters) +{ + apr_pool_t* p = r ? r->pool : c->pool; + ap_filter_t *f = apr_palloc(p, sizeof(*f)); + ap_filter_t **outf; + + if (frec->ftype < AP_FTYPE_PROTOCOL) { + if (r) { + outf = r_filters; + } + else { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, NULL, + "a content filter was added without a request: %s", frec->name); + return NULL; + } + } + else if (frec->ftype < AP_FTYPE_CONNECTION) { + if (r) { + outf = p_filters; + } + else { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, NULL, + "a protocol filter was added without a request: %s", frec->name); + return NULL; + } + } + else { + outf = c_filters; + } + + f->frec = frec; + f->ctx = ctx; + f->r = r; + f->c = c; + f->next = NULL; + + if (INSERT_BEFORE(f, *outf)) { + f->next = *outf; + + if (*outf) { + ap_filter_t *first = NULL; + + if (r) { + /* If we are adding our first non-connection filter, + * Then don't try to find the right location, it is + * automatically first. + */ + if (*r_filters != *c_filters) { + first = *r_filters; + while (first && (first->next != (*outf))) { + first = first->next; + } + } + } + if (first && first != (*outf)) { + first->next = f; + } + } + *outf = f; + } + else { + ap_filter_t *fscan = *outf; + while (!INSERT_BEFORE(f, fscan->next)) + fscan = fscan->next; + + f->next = fscan->next; + fscan->next = f; + } + + if (frec->ftype < AP_FTYPE_CONNECTION && (*r_filters == *c_filters)) { + *r_filters = *p_filters; + } + return f; +} + +static ap_filter_t *add_any_filter(const char *name, void *ctx, + request_rec *r, conn_rec *c, + const filter_trie_node *reg_filter_set, + ap_filter_t **r_filters, + ap_filter_t **p_filters, + ap_filter_t **c_filters) +{ + if (reg_filter_set) { + const char *n; + const filter_trie_node *node; + + node = reg_filter_set; + for (n = name; *n; n++) { + int start, end; + start = 0; + end = node->nchildren - 1; + while (end >= start) { + int middle = (end + start) / 2; + char ch = node->children[middle].c; + if (*n == ch) { + node = node->children[middle].child; + break; + } + else if (*n < ch) { + end = middle - 1; + } + else { + start = middle + 1; + } + } + if (end < start) { + node = NULL; + break; + } + } + + if (node && node->frec) { + return add_any_filter_handle(node->frec, ctx, r, c, r_filters, + p_filters, c_filters); + } + } + + ap_log_error(APLOG_MARK, APLOG_ERR, 0, NULL, + "an unknown filter was not added: %s", name); + return NULL; +} + +AP_DECLARE(ap_filter_t *) ap_add_input_filter(const char *name, void *ctx, + request_rec *r, conn_rec *c) +{ + return add_any_filter(name, ctx, r, c, registered_input_filters, + r ? &r->input_filters : NULL, + r ? &r->proto_input_filters : NULL, &c->input_filters); +} + +AP_DECLARE(ap_filter_t *) ap_add_input_filter_handle(ap_filter_rec_t *f, + void *ctx, + request_rec *r, + conn_rec *c) +{ + return add_any_filter_handle(f, ctx, r, c, r ? &r->input_filters : NULL, + r ? &r->proto_input_filters : NULL, + &c->input_filters); +} + +AP_DECLARE(ap_filter_t *) ap_add_output_filter(const char *name, void *ctx, + request_rec *r, conn_rec *c) +{ + return add_any_filter(name, ctx, r, c, registered_output_filters, + r ? &r->output_filters : NULL, + r ? &r->proto_output_filters : NULL, &c->output_filters); +} + +AP_DECLARE(ap_filter_t *) ap_add_output_filter_handle(ap_filter_rec_t *f, + void *ctx, + request_rec *r, + conn_rec *c) +{ + return add_any_filter_handle(f, ctx, r, c, r ? &r->output_filters : NULL, + r ? &r->proto_output_filters : NULL, + &c->output_filters); +} + +static void remove_any_filter(ap_filter_t *f, ap_filter_t **r_filt, ap_filter_t **p_filt, + ap_filter_t **c_filt) +{ + ap_filter_t **curr = r_filt ? r_filt : c_filt; + ap_filter_t *fscan = *curr; + + if (p_filt && *p_filt == f) + *p_filt = (*p_filt)->next; + + if (*curr == f) { + *curr = (*curr)->next; + return; + } + + while (fscan->next != f) { + if (!(fscan = fscan->next)) { + return; + } + } + + fscan->next = f->next; +} + +AP_DECLARE(void) ap_remove_input_filter(ap_filter_t *f) +{ + remove_any_filter(f, f->r ? &f->r->input_filters : NULL, + f->r ? &f->r->proto_input_filters : NULL, + &f->c->input_filters); +} + +AP_DECLARE(void) ap_remove_output_filter(ap_filter_t *f) +{ + remove_any_filter(f, f->r ? &f->r->output_filters : NULL, + f->r ? &f->r->proto_output_filters : NULL, + &f->c->output_filters); +} + +/* + * Read data from the next filter in the filter stack. Data should be + * modified in the bucket brigade that is passed in. The core allocates the + * bucket brigade, modules that wish to replace large chunks of data or to + * save data off to the side should probably create their own temporary + * brigade especially for that use. + */ +AP_DECLARE(apr_status_t) ap_get_brigade(ap_filter_t *next, + apr_bucket_brigade *bb, + ap_input_mode_t mode, + apr_read_type_e block, + apr_off_t readbytes) +{ + if (next) { + return next->frec->filter_func.in_func(next, bb, mode, block, + readbytes); + } + return AP_NOBODY_READ; +} + +/* Pass the buckets to the next filter in the filter stack. If the + * current filter is a handler, we should get NULL passed in instead of + * the current filter. At that point, we can just call the first filter in + * the stack, or r->output_filters. + */ +AP_DECLARE(apr_status_t) ap_pass_brigade(ap_filter_t *next, + apr_bucket_brigade *bb) +{ + if (next) { + apr_bucket *e; + if ((e = APR_BRIGADE_LAST(bb)) && APR_BUCKET_IS_EOS(e) && next->r) { + /* This is only safe because HTTP_HEADER filter is always in + * the filter stack. This ensures that there is ALWAYS a + * request-based filter that we can attach this to. If the + * HTTP_FILTER is removed, and another filter is not put in its + * place, then handlers like mod_cgi, which attach their own + * EOS bucket to the brigade will be broken, because we will + * get two EOS buckets on the same request. + */ + next->r->eos_sent = 1; + + /* remember the eos for internal redirects, too */ + if (next->r->prev) { + request_rec *prev = next->r->prev; + + while (prev) { + prev->eos_sent = 1; + prev = prev->prev; + } + } + } + return next->frec->filter_func.out_func(next, bb); + } + return AP_NOBODY_WROTE; +} + +AP_DECLARE(apr_status_t) ap_save_brigade(ap_filter_t *f, + apr_bucket_brigade **saveto, + apr_bucket_brigade **b, apr_pool_t *p) +{ + apr_bucket *e; + apr_status_t rv, srv = APR_SUCCESS; + + /* If have never stored any data in the filter, then we had better + * create an empty bucket brigade so that we can concat. + */ + if (!(*saveto)) { + *saveto = apr_brigade_create(p, f->c->bucket_alloc); + } + + APR_RING_FOREACH(e, &(*b)->list, apr_bucket, link) { + rv = apr_bucket_setaside(e, p); + + /* If the bucket type does not implement setaside, then + * (hopefully) morph it into a bucket type which does, and set + * *that* aside... */ + if (rv == APR_ENOTIMPL) { + const char *s; + apr_size_t n; + + rv = apr_bucket_read(e, &s, &n, APR_BLOCK_READ); + if (rv == APR_SUCCESS) { + rv = apr_bucket_setaside(e, p); + } + } + + if (rv != APR_SUCCESS) { + srv = rv; + /* Return an error but still save the brigade if + * ->setaside() is really not implemented. */ + if (rv != APR_ENOTIMPL) { + return rv; + } + } + } + APR_BRIGADE_CONCAT(*saveto, *b); + return srv; +} + +AP_DECLARE_NONSTD(apr_status_t) ap_filter_flush(apr_bucket_brigade *bb, + void *ctx) +{ + ap_filter_t *f = ctx; + + return ap_pass_brigade(f, bb); +} + +AP_DECLARE(apr_status_t) ap_fflush(ap_filter_t *f, apr_bucket_brigade *bb) +{ + apr_bucket *b; + + b = apr_bucket_flush_create(f->c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, b); + return ap_pass_brigade(f, bb); +} + +AP_DECLARE_NONSTD(apr_status_t) ap_fputstrs(ap_filter_t *f, + apr_bucket_brigade *bb, ...) +{ + va_list args; + apr_status_t rv; + + va_start(args, bb); + rv = apr_brigade_vputstrs(bb, ap_filter_flush, f, args); + va_end(args); + return rv; +} + +AP_DECLARE_NONSTD(apr_status_t) ap_fprintf(ap_filter_t *f, + apr_bucket_brigade *bb, + const char *fmt, + ...) +{ + va_list args; + apr_status_t rv; + + va_start(args, fmt); + rv = apr_brigade_vprintf(bb, ap_filter_flush, f, fmt, args); + va_end(args); + return rv; +} diff --git a/rubbos/app/httpd-2.0.64/server/util_filter.lo b/rubbos/app/httpd-2.0.64/server/util_filter.lo new file mode 100644 index 00000000..236b514d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/util_filter.lo @@ -0,0 +1,12 @@ +# util_filter.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/util_filter.o' + +# Name of the non-PIC object. +non_pic_object='util_filter.o' + diff --git a/rubbos/app/httpd-2.0.64/server/util_filter.o b/rubbos/app/httpd-2.0.64/server/util_filter.o new file mode 100644 index 0000000000000000000000000000000000000000..80950d798f4aa1de262b46d793228b0b69504550 GIT binary patch literal 57136 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 z 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 4]; + *r++ = hex[hash[i] & 0xF]; + } + *r = '\0'; + + return apr_pstrndup(p, result, MD5_DIGESTSIZE*2); +} + +AP_DECLARE(char *) ap_md5(apr_pool_t *p, const unsigned char *string) +{ + return ap_md5_binary(p, string, (int) strlen((char *)string)); +} + +/* 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. + */ + +static char basis_64[] = +"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + +AP_DECLARE(char *) ap_md5contextTo64(apr_pool_t *a, apr_md5_ctx_t *context) +{ + unsigned char digest[18]; + char *encodedDigest; + int i; + char *p; + + encodedDigest = (char *) apr_pcalloc(a, 25 * sizeof(char)); + + apr_md5_final(digest, context); + digest[sizeof(digest) - 1] = digest[sizeof(digest) - 2] = 0; + + p = encodedDigest; + for (i = 0; i < sizeof(digest); i += 3) { + *p++ = basis_64[digest[i] >> 2]; + *p++ = basis_64[((digest[i] & 0x3) << 4) | ((int) (digest[i + 1] & 0xF0) >> 4)]; + *p++ = basis_64[((digest[i + 1] & 0xF) << 2) | ((int) (digest[i + 2] & 0xC0) >> 6)]; + *p++ = basis_64[digest[i + 2] & 0x3F]; + } + *p-- = '\0'; + *p-- = '='; + *p-- = '='; + return encodedDigest; +} + +AP_DECLARE(char *) ap_md5digest(apr_pool_t *p, apr_file_t *infile) +{ + apr_md5_ctx_t context; + unsigned char buf[1000]; + long length = 0; + apr_size_t nbytes; + apr_off_t offset = 0L; + + apr_md5_init(&context); + nbytes = sizeof(buf); + while (apr_file_read(infile, buf, &nbytes) == APR_SUCCESS) { + length += nbytes; + apr_md5_update(&context, buf, nbytes); + } + apr_file_seek(infile, APR_SET, &offset); + return ap_md5contextTo64(p, &context); +} + diff --git a/rubbos/app/httpd-2.0.64/server/util_md5.lo b/rubbos/app/httpd-2.0.64/server/util_md5.lo new file mode 100644 index 00000000..246935a9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/util_md5.lo @@ -0,0 +1,12 @@ +# util_md5.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/util_md5.o' + +# Name of the non-PIC object. +non_pic_object='util_md5.o' + diff --git a/rubbos/app/httpd-2.0.64/server/util_md5.o b/rubbos/app/httpd-2.0.64/server/util_md5.o new file mode 100644 index 0000000000000000000000000000000000000000..172bfbf485eee8e6dd2c7f86f1a1d34377cf0649 GIT binary patch literal 14024 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/server/util_script.c b/rubbos/app/httpd-2.0.64/server/util_script.c new file mode 100644 index 00000000..ad8d5745 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/util_script.c @@ -0,0 +1,717 @@ +/* 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. + */ + +#include "apr.h" +#include "apr_lib.h" +#include "apr_strings.h" + +#define APR_WANT_STRFUNC +#include "apr_want.h" + +#if APR_HAVE_STDLIB_H +#include +#endif + +#define CORE_PRIVATE +#include "ap_config.h" +#include "httpd.h" +#include "http_config.h" +#include "http_main.h" +#include "http_log.h" +#include "http_core.h" +#include "http_protocol.h" +#include "http_request.h" /* for sub_req_lookup_uri() */ +#include "util_script.h" +#include "apr_date.h" /* For apr_date_parse_http() */ +#include "util_ebcdic.h" + +#ifdef OS2 +#define INCL_DOS +#include +#endif + +/* + * Various utility functions which are common to a whole lot of + * script-type extensions mechanisms, and might as well be gathered + * in one place (if only to avoid creating inter-module dependancies + * where there don't have to be). + */ + +#define MALFORMED_MESSAGE "malformed header from script. Bad header=" +#define MALFORMED_HEADER_LENGTH_TO_SHOW 30 + +static char *http2env(apr_pool_t *a, const char *w) +{ + char *res = (char *)apr_palloc(a, sizeof("HTTP_") + strlen(w)); + char *cp = res; + char c; + + *cp++ = 'H'; + *cp++ = 'T'; + *cp++ = 'T'; + *cp++ = 'P'; + *cp++ = '_'; + + while ((c = *w++) != 0) { + if (!apr_isalnum(c)) { + *cp++ = '_'; + } + else { + *cp++ = apr_toupper(c); + } + } + *cp = 0; + + return res; +} + +AP_DECLARE(char **) ap_create_environment(apr_pool_t *p, apr_table_t *t) +{ + const apr_array_header_t *env_arr = apr_table_elts(t); + const apr_table_entry_t *elts = (const apr_table_entry_t *) env_arr->elts; + char **env = (char **) apr_palloc(p, (env_arr->nelts + 2) * sizeof(char *)); + int i, j; + char *tz; + char *whack; + + j = 0; + if (!apr_table_get(t, "TZ")) { + tz = getenv("TZ"); + if (tz != NULL) { + env[j++] = apr_pstrcat(p, "TZ=", tz, NULL); + } + } + for (i = 0; i < env_arr->nelts; ++i) { + if (!elts[i].key) { + continue; + } + env[j] = apr_pstrcat(p, elts[i].key, "=", elts[i].val, NULL); + whack = env[j]; + if (apr_isdigit(*whack)) { + *whack++ = '_'; + } + while (*whack != '=') { + if (!apr_isalnum(*whack) && *whack != '_') { + *whack = '_'; + } + ++whack; + } + ++j; + } + + env[j] = NULL; + return env; +} + +AP_DECLARE(void) ap_add_common_vars(request_rec *r) +{ + apr_table_t *e; + server_rec *s = r->server; + conn_rec *c = r->connection; + const char *rem_logname; + char *env_path; +#if defined(WIN32) || defined(OS2) || defined(BEOS) + char *env_temp; +#endif + const char *host; + const apr_array_header_t *hdrs_arr = apr_table_elts(r->headers_in); + const apr_table_entry_t *hdrs = (const apr_table_entry_t *) hdrs_arr->elts; + int i; + apr_port_t rport; + + /* use a temporary apr_table_t which we'll overlap onto + * r->subprocess_env later + * (exception: if r->subprocess_env is empty at the start, + * write directly into it) + */ + if (apr_is_empty_table(r->subprocess_env)) { + e = r->subprocess_env; + } + else { + e = apr_table_make(r->pool, 25 + hdrs_arr->nelts); + } + + /* First, add environment vars from headers... this is as per + * CGI specs, though other sorts of scripting interfaces see + * the same vars... + */ + + for (i = 0; i < hdrs_arr->nelts; ++i) { + if (!hdrs[i].key) { + continue; + } + + /* A few headers are special cased --- Authorization to prevent + * rogue scripts from capturing passwords; content-type and -length + * for no particular reason. + */ + + if (!strcasecmp(hdrs[i].key, "Content-type")) { + apr_table_addn(e, "CONTENT_TYPE", hdrs[i].val); + } + else if (!strcasecmp(hdrs[i].key, "Content-length")) { + apr_table_addn(e, "CONTENT_LENGTH", hdrs[i].val); + } + /* + * You really don't want to disable this check, since it leaves you + * wide open to CGIs stealing passwords and people viewing them + * in the environment with "ps -e". But, if you must... + */ +#ifndef SECURITY_HOLE_PASS_AUTHORIZATION + else if (!strcasecmp(hdrs[i].key, "Authorization") + || !strcasecmp(hdrs[i].key, "Proxy-Authorization")) { + continue; + } +#endif + else { + apr_table_addn(e, http2env(r->pool, hdrs[i].key), hdrs[i].val); + } + } + + if (!(env_path = getenv("PATH"))) { + env_path = DEFAULT_PATH; + } + apr_table_addn(e, "PATH", apr_pstrdup(r->pool, env_path)); + +#ifdef WIN32 + if (env_temp = getenv("SystemRoot")) { + apr_table_addn(e, "SystemRoot", env_temp); + } + if (env_temp = getenv("COMSPEC")) { + apr_table_addn(e, "COMSPEC", env_temp); + } + if (env_temp = getenv("PATHEXT")) { + apr_table_addn(e, "PATHEXT", env_temp); + } + if (env_temp = getenv("WINDIR")) { + apr_table_addn(e, "WINDIR", env_temp); + } +#endif + +#ifdef OS2 + if ((env_temp = getenv("COMSPEC")) != NULL) { + apr_table_addn(e, "COMSPEC", env_temp); + } + if ((env_temp = getenv("ETC")) != NULL) { + apr_table_addn(e, "ETC", env_temp); + } + if ((env_temp = getenv("DPATH")) != NULL) { + apr_table_addn(e, "DPATH", env_temp); + } + if ((env_temp = getenv("PERLLIB_PREFIX")) != NULL) { + apr_table_addn(e, "PERLLIB_PREFIX", env_temp); + } +#endif + +#ifdef BEOS + if ((env_temp = getenv("LIBRARY_PATH")) != NULL) { + apr_table_addn(e, "LIBRARY_PATH", env_temp); + } +#endif + + apr_table_addn(e, "SERVER_SIGNATURE", ap_psignature("", r)); + apr_table_addn(e, "SERVER_SOFTWARE", ap_get_server_version()); + apr_table_addn(e, "SERVER_NAME", + ap_escape_html(r->pool, ap_get_server_name(r))); + apr_table_addn(e, "SERVER_ADDR", r->connection->local_ip); /* Apache */ + apr_table_addn(e, "SERVER_PORT", + apr_psprintf(r->pool, "%u", ap_get_server_port(r))); + host = ap_get_remote_host(c, r->per_dir_config, REMOTE_HOST, NULL); + if (host) { + apr_table_addn(e, "REMOTE_HOST", host); + } + apr_table_addn(e, "REMOTE_ADDR", c->remote_ip); + apr_table_addn(e, "DOCUMENT_ROOT", ap_document_root(r)); /* Apache */ + apr_table_addn(e, "SERVER_ADMIN", s->server_admin); /* Apache */ + apr_table_addn(e, "SCRIPT_FILENAME", r->filename); /* Apache */ + + apr_sockaddr_port_get(&rport, c->remote_addr); + apr_table_addn(e, "REMOTE_PORT", apr_itoa(r->pool, rport)); + + if (r->user) { + apr_table_addn(e, "REMOTE_USER", r->user); + } + else if (r->prev) { + request_rec *back = r->prev; + + while (back) { + if (back->user) { + apr_table_addn(e, "REDIRECT_REMOTE_USER", back->user); + break; + } + back = back->prev; + } + } + if (r->ap_auth_type) { + apr_table_addn(e, "AUTH_TYPE", r->ap_auth_type); + } + rem_logname = ap_get_remote_logname(r); + if (rem_logname) { + apr_table_addn(e, "REMOTE_IDENT", apr_pstrdup(r->pool, rem_logname)); + } + + /* Apache custom error responses. If we have redirected set two new vars */ + + if (r->prev) { + if (r->prev->args) { + apr_table_addn(e, "REDIRECT_QUERY_STRING", r->prev->args); + } + if (r->prev->uri) { + apr_table_addn(e, "REDIRECT_URL", r->prev->uri); + } + } + + if (e != r->subprocess_env) { + apr_table_overlap(r->subprocess_env, e, APR_OVERLAP_TABLES_SET); + } +} + +/* This "cute" little function comes about because the path info on + * filenames and URLs aren't always the same. So we take the two, + * and find as much of the two that match as possible. + */ + +AP_DECLARE(int) ap_find_path_info(const char *uri, const char *path_info) +{ + int lu = strlen(uri); + int lp = strlen(path_info); + + while (lu-- && lp-- && uri[lu] == path_info[lp]); + + if (lu == -1) { + lu = 0; + } + + while (uri[lu] != '\0' && uri[lu] != '/') { + lu++; + } + return lu; +} + +/* Obtain the Request-URI from the original request-line, returning + * a new string from the request pool containing the URI or "". + */ +static char *original_uri(request_rec *r) +{ + char *first, *last; + + if (r->the_request == NULL) { + return (char *) apr_pcalloc(r->pool, 1); + } + + first = r->the_request; /* use the request-line */ + + while (*first && !apr_isspace(*first)) { + ++first; /* skip over the method */ + } + while (apr_isspace(*first)) { + ++first; /* and the space(s) */ + } + + last = first; + while (*last && !apr_isspace(*last)) { + ++last; /* end at next whitespace */ + } + + return apr_pstrmemdup(r->pool, first, last - first); +} + +AP_DECLARE(void) ap_add_cgi_vars(request_rec *r) +{ + apr_table_t *e = r->subprocess_env; + + apr_table_setn(e, "GATEWAY_INTERFACE", "CGI/1.1"); + apr_table_setn(e, "SERVER_PROTOCOL", r->protocol); + apr_table_setn(e, "REQUEST_METHOD", r->method); + apr_table_setn(e, "QUERY_STRING", r->args ? r->args : ""); + apr_table_setn(e, "REQUEST_URI", original_uri(r)); + + /* Note that the code below special-cases scripts run from includes, + * because it "knows" that the sub_request has been hacked to have the + * args and path_info of the original request, and not any that may have + * come with the script URI in the include command. Ugh. + */ + + if (!strcmp(r->protocol, "INCLUDED")) { + apr_table_setn(e, "SCRIPT_NAME", r->uri); + if (r->path_info && *r->path_info) { + apr_table_setn(e, "PATH_INFO", r->path_info); + } + } + else if (!r->path_info || !*r->path_info) { + apr_table_setn(e, "SCRIPT_NAME", r->uri); + } + else { + int path_info_start = ap_find_path_info(r->uri, r->path_info); + + apr_table_setn(e, "SCRIPT_NAME", + apr_pstrndup(r->pool, r->uri, path_info_start)); + + apr_table_setn(e, "PATH_INFO", r->path_info); + } + + if (r->path_info && r->path_info[0]) { + /* + * To get PATH_TRANSLATED, treat PATH_INFO as a URI path. + * Need to re-escape it for this, since the entire URI was + * un-escaped before we determined where the PATH_INFO began. + */ + request_rec *pa_req; + + pa_req = ap_sub_req_lookup_uri(ap_escape_uri(r->pool, r->path_info), r, + NULL); + + if (pa_req->filename) { + char *pt = apr_pstrcat(r->pool, pa_req->filename, pa_req->path_info, + NULL); +#ifdef WIN32 + /* We need to make this a real Windows path name */ + apr_filepath_merge(&pt, "", pt, APR_FILEPATH_NATIVE, r->pool); +#endif + apr_table_setn(e, "PATH_TRANSLATED", pt); + } + ap_destroy_sub_req(pa_req); + } +} + + +static int set_cookie_doo_doo(void *v, const char *key, const char *val) +{ + apr_table_addn(v, key, val); + return 1; +} + +#define HTTP_UNSET (-HTTP_OK) + +AP_DECLARE(int) ap_scan_script_header_err_core(request_rec *r, char *buffer, + int (*getsfunc) (char *, int, void *), + void *getsfunc_data) +{ + char x[MAX_STRING_LEN]; + char *w, *l; + int p; + int cgi_status = HTTP_UNSET; + apr_table_t *merge; + apr_table_t *cookie_table; + + if (buffer) { + *buffer = '\0'; + } + w = buffer ? buffer : x; + + /* temporary place to hold headers to merge in later */ + merge = apr_table_make(r->pool, 10); + + /* The HTTP specification says that it is legal to merge duplicate + * headers into one. Some browsers that support Cookies don't like + * merged headers and prefer that each Set-Cookie header is sent + * separately. Lets humour those browsers by not merging. + * Oh what a pain it is. + */ + cookie_table = apr_table_make(r->pool, 2); + apr_table_do(set_cookie_doo_doo, cookie_table, r->err_headers_out, "Set-Cookie", NULL); + + while (1) { + + if ((*getsfunc) (w, MAX_STRING_LEN - 1, getsfunc_data) == 0) { + ap_log_rerror(APLOG_MARK, APLOG_ERR|APLOG_TOCLIENT, 0, r, + "Premature end of script headers: %s", + apr_filename_of_pathname(r->filename)); + return HTTP_INTERNAL_SERVER_ERROR; + } + + /* Delete terminal (CR?)LF */ + + p = strlen(w); + /* Indeed, the host's '\n': + '\012' for UNIX; '\015' for MacOS; '\025' for OS/390 + -- whatever the script generates. + */ + if (p > 0 && w[p - 1] == '\n') { + if (p > 1 && w[p - 2] == CR) { + w[p - 2] = '\0'; + } + else { + w[p - 1] = '\0'; + } + } + + /* + * If we've finished reading the headers, check to make sure any + * HTTP/1.1 conditions are met. If so, we're done; normal processing + * will handle the script's output. If not, just return the error. + * The appropriate thing to do would be to send the script process a + * SIGPIPE to let it know we're ignoring it, close the channel to the + * script process, and *then* return the failed-to-meet-condition + * error. Otherwise we'd be waiting for the script to finish + * blithering before telling the client the output was no good. + * However, we don't have the information to do that, so we have to + * leave it to an upper layer. + */ + if (w[0] == '\0') { + int cond_status = OK; + + /* PR#38070: This fails because it gets confused when a + * CGI Status header overrides ap_meets_conditions. + * + * We can fix that by dropping ap_meets_conditions when + * Status has been set. Since this is the only place + * cgi_status gets used, let's test it explicitly. + * + * The alternative would be to ignore CGI Status when + * ap_meets_conditions returns anything interesting. + * That would be safer wrt HTTP, but would break CGI. + */ + if ((cgi_status == HTTP_UNSET) && (r->method_number == M_GET)) { + cond_status = ap_meets_conditions(r); + } + apr_table_overlap(r->err_headers_out, merge, + APR_OVERLAP_TABLES_MERGE); + if (!apr_is_empty_table(cookie_table)) { + /* the cookies have already been copied to the cookie_table */ + apr_table_unset(r->err_headers_out, "Set-Cookie"); + r->err_headers_out = apr_table_overlay(r->pool, + r->err_headers_out, cookie_table); + } + return cond_status; + } + + /* if we see a bogus header don't ignore it. Shout and scream */ + +#if APR_CHARSET_EBCDIC + /* Chances are that we received an ASCII header text instead of + * the expected EBCDIC header lines. Try to auto-detect: + */ + if (!(l = strchr(w, ':'))) { + int maybeASCII = 0, maybeEBCDIC = 0; + unsigned char *cp, native; + apr_size_t inbytes_left, outbytes_left; + + for (cp = w; *cp != '\0'; ++cp) { + native = apr_xlate_conv_byte(ap_hdrs_from_ascii, *cp); + if (apr_isprint(*cp) && !apr_isprint(native)) + ++maybeEBCDIC; + if (!apr_isprint(*cp) && apr_isprint(native)) + ++maybeASCII; + } + if (maybeASCII > maybeEBCDIC) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server, + "CGI Interface Error: Script headers apparently ASCII: (CGI = %s)", + r->filename); + inbytes_left = outbytes_left = cp - w; + apr_xlate_conv_buffer(ap_hdrs_from_ascii, + w, &inbytes_left, w, &outbytes_left); + } + } +#endif /*APR_CHARSET_EBCDIC*/ + if (!(l = strchr(w, ':'))) { + char malformed[(sizeof MALFORMED_MESSAGE) + 1 + + MALFORMED_HEADER_LENGTH_TO_SHOW]; + + strcpy(malformed, MALFORMED_MESSAGE); + strncat(malformed, w, MALFORMED_HEADER_LENGTH_TO_SHOW); + + if (!buffer) { + /* Soak up all the script output - may save an outright kill */ + while ((*getsfunc) (w, MAX_STRING_LEN - 1, getsfunc_data)) { + continue; + } + } + + ap_log_rerror(APLOG_MARK, APLOG_ERR|APLOG_TOCLIENT, 0, r, + "%s: %s", malformed, + apr_filename_of_pathname(r->filename)); + return HTTP_INTERNAL_SERVER_ERROR; + } + + *l++ = '\0'; + while (*l && apr_isspace(*l)) { + ++l; + } + + if (!strcasecmp(w, "Content-type")) { + char *tmp; + + /* Nuke trailing whitespace */ + + char *endp = l + strlen(l) - 1; + while (endp > l && apr_isspace(*endp)) { + *endp-- = '\0'; + } + + tmp = apr_pstrdup(r->pool, l); + ap_content_type_tolower(tmp); + ap_set_content_type(r, tmp); + } + /* + * If the script returned a specific status, that's what + * we'll use - otherwise we assume 200 OK. + */ + else if (!strcasecmp(w, "Status")) { + r->status = cgi_status = atoi(l); + r->status_line = apr_pstrdup(r->pool, l); + } + else if (!strcasecmp(w, "Location")) { + apr_table_set(r->headers_out, w, l); + } + else if (!strcasecmp(w, "Content-Length")) { + apr_table_set(r->headers_out, w, l); + } + else if (!strcasecmp(w, "Content-Range")) { + apr_table_set(r->headers_out, w, l); + } + else if (!strcasecmp(w, "Transfer-Encoding")) { + apr_table_set(r->headers_out, w, l); + } + /* + * If the script gave us a Last-Modified header, we can't just + * pass it on blindly because of restrictions on future values. + */ + else if (!strcasecmp(w, "Last-Modified")) { + ap_update_mtime(r, apr_date_parse_http(l)); + ap_set_last_modified(r); + } + else if (!strcasecmp(w, "Set-Cookie")) { + apr_table_add(cookie_table, w, l); + } + else { + apr_table_add(merge, w, l); + } + } + + return OK; +} + +static int getsfunc_FILE(char *buf, int len, void *f) +{ + return apr_file_gets(buf, len, (apr_file_t *) f) == APR_SUCCESS; +} + +AP_DECLARE(int) ap_scan_script_header_err(request_rec *r, apr_file_t *f, + char *buffer) +{ + return ap_scan_script_header_err_core(r, buffer, getsfunc_FILE, f); +} + +static int getsfunc_BRIGADE(char *buf, int len, void *arg) +{ + apr_bucket_brigade *bb = (apr_bucket_brigade *)arg; + const char *dst_end = buf + len - 1; /* leave room for terminating null */ + char *dst = buf; + apr_bucket *e = APR_BRIGADE_FIRST(bb); + apr_status_t rv; + int done = 0; + + while ((dst < dst_end) && !done && !APR_BUCKET_IS_EOS(e)) { + const char *bucket_data; + apr_size_t bucket_data_len; + const char *src; + const char *src_end; + apr_bucket * next; + + rv = apr_bucket_read(e, &bucket_data, &bucket_data_len, + APR_BLOCK_READ); + if (!APR_STATUS_IS_SUCCESS(rv) || (bucket_data_len == 0)) { + return 0; + } + src = bucket_data; + src_end = bucket_data + bucket_data_len; + while ((src < src_end) && (dst < dst_end) && !done) { + if (*src == '\n') { + done = 1; + } + else if (*src != '\r') { + *dst++ = *src; + } + src++; + } + + if (src < src_end) { + apr_bucket_split(e, src - bucket_data); + } + next = APR_BUCKET_NEXT(e); + APR_BUCKET_REMOVE(e); + apr_bucket_destroy(e); + e = next; + } + *dst = 0; + return 1; +} + +AP_DECLARE(int) ap_scan_script_header_err_brigade(request_rec *r, + apr_bucket_brigade *bb, + char *buffer) +{ + return ap_scan_script_header_err_core(r, buffer, getsfunc_BRIGADE, bb); +} + +struct vastrs { + va_list args; + int arg; + const char *curpos; +}; + +static int getsfunc_STRING(char *w, int len, void *pvastrs) +{ + struct vastrs *strs = (struct vastrs*) pvastrs; + const char *p; + int t; + + if (!strs->curpos || !*strs->curpos) + return 0; + p = ap_strchr_c(strs->curpos, '\n'); + if (p) + ++p; + else + p = ap_strchr_c(strs->curpos, '\0'); + t = p - strs->curpos; + if (t > len) + t = len; + strncpy (w, strs->curpos, t); + w[t] = '\0'; + if (!strs->curpos[t]) { + ++strs->arg; + strs->curpos = va_arg(strs->args, const char *); + } + else + strs->curpos += t; + return t; +} + +/* ap_scan_script_header_err_strs() accepts additional const char* args... + * each is treated as one or more header lines, and the first non-header + * character is returned to **arg, **data. (The first optional arg is + * counted as 0.) + */ +AP_DECLARE_NONSTD(int) ap_scan_script_header_err_strs(request_rec *r, + char *buffer, + const char **termch, + int *termarg, ...) +{ + struct vastrs strs; + int res; + + va_start(strs.args, termarg); + strs.arg = 0; + strs.curpos = va_arg(strs.args, char*); + res = ap_scan_script_header_err_core(r, buffer, getsfunc_STRING, (void *) &strs); + if (termch) + *termch = strs.curpos; + if (termarg) + *termarg = strs.arg; + va_end(strs.args); + return res; +} diff --git a/rubbos/app/httpd-2.0.64/server/util_script.lo b/rubbos/app/httpd-2.0.64/server/util_script.lo new file mode 100644 index 00000000..8a9ff660 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/util_script.lo @@ -0,0 +1,12 @@ +# util_script.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/util_script.o' + +# Name of the non-PIC object. +non_pic_object='util_script.o' + diff --git a/rubbos/app/httpd-2.0.64/server/util_script.o b/rubbos/app/httpd-2.0.64/server/util_script.o new file mode 100644 index 0000000000000000000000000000000000000000..3e7d092eea2f6fbe3e02d7c331c4a39b6335f849 GIT binary patch literal 66232 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�xqxOeOxU6Gtcpdv#)jO6=2#QOdSH(uql`??2ax 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/server/util_time.c b/rubbos/app/httpd-2.0.64/server/util_time.c new file mode 100644 index 00000000..e5a488ef --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/util_time.c @@ -0,0 +1,240 @@ +/* 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. + */ + +#include "util_time.h" + +/* Cache for exploded values of recent timestamps + */ + +struct exploded_time_cache_element { + apr_int64_t t; + apr_time_exp_t xt; + apr_int64_t t_validate; /* please see comments in cached_explode() */ +}; + +/* the "+ 1" is for the current second: */ +#define TIME_CACHE_SIZE (AP_TIME_RECENT_THRESHOLD + 1) + +/* Note that AP_TIME_RECENT_THRESHOLD is defined to + * be a power of two minus one in util_time.h, so that + * we can replace a modulo operation with a bitwise AND + * when hashing items into a cache of size + * AP_TIME_RECENT_THRESHOLD+1 + */ +#define TIME_CACHE_MASK (AP_TIME_RECENT_THRESHOLD) + +static struct exploded_time_cache_element exploded_cache_localtime[TIME_CACHE_SIZE]; +static struct exploded_time_cache_element exploded_cache_gmt[TIME_CACHE_SIZE]; + + +static apr_status_t cached_explode(apr_time_exp_t *xt, apr_time_t t, + struct exploded_time_cache_element *cache, + int use_gmt) +{ + apr_int64_t seconds = apr_time_sec(t); + struct exploded_time_cache_element *cache_element = + &(cache[seconds & TIME_CACHE_MASK]); + struct exploded_time_cache_element cache_element_snapshot; + + /* The cache is implemented as a ring buffer. Each second, + * it uses a different element in the buffer. The timestamp + * in the element indicates whether the element contains the + * exploded time for the current second (vs the time + * 'now - AP_TIME_RECENT_THRESHOLD' seconds ago). If the + * cached value is for the current time, we use it. Otherwise, + * we compute the apr_time_exp_t and store it in this + * cache element. Note that the timestamp in the cache + * element is updated only after the exploded time. Thus + * if two threads hit this cache element simultaneously + * at the start of a new second, they'll both explode the + * time and store it. I.e., the writers will collide, but + * they'll be writing the same value. + */ + if (cache_element->t >= seconds) { + /* There is an intentional race condition in this design: + * in a multithreaded app, one thread might be reading + * from this cache_element to resolve a timestamp from + * TIME_CACHE_SIZE seconds ago at the same time that + * another thread is copying the exploded form of the + * current time into the same cache_element. (I.e., the + * first thread might hit this element of the ring buffer + * just as the element is being recycled.) This can + * also happen at the start of a new second, if a + * reader accesses the cache_element after a writer + * has updated cache_element.t but before the writer + * has finished updating the whole cache_element. + * + * Rather than trying to prevent this race condition + * with locks, we allow it to happen and then detect + * and correct it. The detection works like this: + * Step 1: Take a "snapshot" of the cache element by + * copying it into a temporary buffer. + * Step 2: Check whether the snapshot contains consistent + * data: the timestamps at the start and end of + * the cache_element should both match the 'seconds' + * value that we computed from the input time. + * If these three don't match, then the snapshot + * shows the cache_element in the middle of an + * update, and its contents are invalid. + * Step 3: If the snapshot is valid, use it. Otherwise, + * just give up on the cache and explode the + * input time. + */ + memcpy(&cache_element_snapshot, cache_element, + sizeof(struct exploded_time_cache_element)); + if ((seconds != cache_element_snapshot.t) || + (seconds != cache_element_snapshot.t_validate)) { + /* Invalid snapshot */ + if (use_gmt) { + return apr_time_exp_gmt(xt, t); + } + else { + return apr_time_exp_lt(xt, t); + } + } + else { + /* Valid snapshot */ + memcpy(xt, &(cache_element_snapshot.xt), + sizeof(apr_time_exp_t)); + } + } + else { + apr_status_t r; + if (use_gmt) { + r = apr_time_exp_gmt(xt, t); + } + else { + r = apr_time_exp_lt(xt, t); + } + if (!APR_STATUS_IS_SUCCESS(r)) { + return r; + } + cache_element->t = seconds; + memcpy(&(cache_element->xt), xt, sizeof(apr_time_exp_t)); + cache_element->t_validate = seconds; + } + xt->tm_usec = (int)apr_time_usec(t); + return APR_SUCCESS; +} + + +AP_DECLARE(apr_status_t) ap_explode_recent_localtime(apr_time_exp_t * tm, + apr_time_t t) +{ + return cached_explode(tm, t, exploded_cache_localtime, 0); +} + +AP_DECLARE(apr_status_t) ap_explode_recent_gmt(apr_time_exp_t * tm, + apr_time_t t) +{ + return cached_explode(tm, t, exploded_cache_gmt, 1); +} + +AP_DECLARE(apr_status_t) ap_recent_ctime(char *date_str, apr_time_t t) +{ + /* ### This code is a clone of apr_ctime(), except that it + * uses ap_explode_recent_localtime() instead of apr_time_exp_lt(). + */ + apr_time_exp_t xt; + const char *s; + int real_year; + + /* example: "Wed Jun 30 21:49:08 1993" */ + /* 123456789012345678901234 */ + + ap_explode_recent_localtime(&xt, t); + s = &apr_day_snames[xt.tm_wday][0]; + *date_str++ = *s++; + *date_str++ = *s++; + *date_str++ = *s++; + *date_str++ = ' '; + s = &apr_month_snames[xt.tm_mon][0]; + *date_str++ = *s++; + *date_str++ = *s++; + *date_str++ = *s++; + *date_str++ = ' '; + *date_str++ = xt.tm_mday / 10 + '0'; + *date_str++ = xt.tm_mday % 10 + '0'; + *date_str++ = ' '; + *date_str++ = xt.tm_hour / 10 + '0'; + *date_str++ = xt.tm_hour % 10 + '0'; + *date_str++ = ':'; + *date_str++ = xt.tm_min / 10 + '0'; + *date_str++ = xt.tm_min % 10 + '0'; + *date_str++ = ':'; + *date_str++ = xt.tm_sec / 10 + '0'; + *date_str++ = xt.tm_sec % 10 + '0'; + *date_str++ = ' '; + real_year = 1900 + xt.tm_year; + *date_str++ = real_year / 1000 + '0'; + *date_str++ = real_year % 1000 / 100 + '0'; + *date_str++ = real_year % 100 / 10 + '0'; + *date_str++ = real_year % 10 + '0'; + *date_str++ = 0; + + return APR_SUCCESS; +} + +AP_DECLARE(apr_status_t) ap_recent_rfc822_date(char *date_str, apr_time_t t) +{ + /* ### This code is a clone of apr_rfc822_date(), except that it + * uses ap_explode_recent_gmt() instead of apr_time_exp_gmt(). + */ + apr_time_exp_t xt; + const char *s; + int real_year; + + ap_explode_recent_gmt(&xt, t); + + /* example: "Sat, 08 Jan 2000 18:31:41 GMT" */ + /* 12345678901234567890123456789 */ + + s = &apr_day_snames[xt.tm_wday][0]; + *date_str++ = *s++; + *date_str++ = *s++; + *date_str++ = *s++; + *date_str++ = ','; + *date_str++ = ' '; + *date_str++ = xt.tm_mday / 10 + '0'; + *date_str++ = xt.tm_mday % 10 + '0'; + *date_str++ = ' '; + s = &apr_month_snames[xt.tm_mon][0]; + *date_str++ = *s++; + *date_str++ = *s++; + *date_str++ = *s++; + *date_str++ = ' '; + real_year = 1900 + xt.tm_year; + /* This routine isn't y10k ready. */ + *date_str++ = real_year / 1000 + '0'; + *date_str++ = real_year % 1000 / 100 + '0'; + *date_str++ = real_year % 100 / 10 + '0'; + *date_str++ = real_year % 10 + '0'; + *date_str++ = ' '; + *date_str++ = xt.tm_hour / 10 + '0'; + *date_str++ = xt.tm_hour % 10 + '0'; + *date_str++ = ':'; + *date_str++ = xt.tm_min / 10 + '0'; + *date_str++ = xt.tm_min % 10 + '0'; + *date_str++ = ':'; + *date_str++ = xt.tm_sec / 10 + '0'; + *date_str++ = xt.tm_sec % 10 + '0'; + *date_str++ = ' '; + *date_str++ = 'G'; + *date_str++ = 'M'; + *date_str++ = 'T'; + *date_str++ = 0; + return APR_SUCCESS; +} diff --git a/rubbos/app/httpd-2.0.64/server/util_time.lo b/rubbos/app/httpd-2.0.64/server/util_time.lo new file mode 100644 index 00000000..138d3cb3 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/util_time.lo @@ -0,0 +1,12 @@ +# util_time.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/util_time.o' + +# Name of the non-PIC object. +non_pic_object='util_time.o' + diff --git a/rubbos/app/httpd-2.0.64/server/util_time.o b/rubbos/app/httpd-2.0.64/server/util_time.o new file mode 100644 index 0000000000000000000000000000000000000000..b3ca86f48bbb8b09d83b5ccba393305a4b132fd2 GIT binary patch literal 18000 zcmeHOdw5jUwclq>9s_~NKp-SMM+r!POddvx^2!5b!b=_rP?bAQCX+`^CUG7-d=v^| znIc}G^{ZO-(0*+{dwcz=-dpr)ZHXv_wzsv`Dxdai?c=N1`dQnmX|a{N*4}HKbFydB z!qa&D{r1{xt-aRTd(N3T>|U|vT907}ZiZMY9F9>Ty5~D|gCrY7sVEVRZK2G& zEt$VJwzg#61Nx_%LeIQjfBeJwuw-t%?rI3dO!4j=*yrlgFXO#0QxzN2ixX={K8CI&6>;`p{E@Oe}_Ce zICvgBd#?6GsOP1Iree`j`SOZPOt@Sqp0NiV2%)K~VF`H^p-gLq7kDt)THyx*Y_?XE z0Rcu^D*`}()z*qRK-3^n1H?ik7N!>NKeHzD+clX#q)HtdZ=nIUV=rE!oxJ|g)vu*b zh7N+|gUdl-W)jl=%u2Ad1)M?qnJwT9+RtnOXV89TOW-Z@!i5XPGeqr~r_st=%RfT4 zLHrLUTS2t|9o|%XCY1S50+2K?@aDO4z(dj2im3IMX z#UPZILuecbJ^hol?S8Zg(JqsA#~(V-TPQ^4bmm8mnKMJb8$4eycwt86dGN63rE{hb z2bw3GYAzFvl|NpdIo&w;*BOmN=U^e{^OskCZ{Kq@2R2Ov;HeG>T%&|5&li8=#m34P zmuF5i!gA%R&wG|vJ|~4shu*;eoF|8CPe>;wLDAIQa1!#lNhVNFS?Av_F=dpk`KOxm zAQ6R_wHy)22QOrDF(P_arDFvLHhEQUN1;j?zEjObpwkb3CD$Bi9*vRIV|W3wTrez# zV@8hO*h`6@Z+QHqlbG;arGp8#>udZ7r8B`TG!aYZRC6g5Z8@xO^2$@qQ`TlqpK6}k zda8Mv$g1E;!_!!%(ukXAr1q#+h&(yymB(_{*}Od8ndXPd7eMSsM6g|$c zH5SZAxWM}wT%|UtrZD&{@QU2}K9Hl}Ps}e2-vz53jdWq;aqJWwMLJK>F{HhU?m~Ku zqI;0`EBa=nCn&lP=`uz4BRy5ow;&x*bQ0+bMW>OTqZ~TxeZK(qw;b?(fD0k|!-GI7 zC%k_{S{e5K9cg9E`w`O0fcFB@bBf?1yuv`HMlptD7AnRgnFht=NhYM2e95d=Oo3#! zD#mLp1rKjh%xGgdFx`q7BNH;97{6pviWzV8f(JVlQ);vTvqv$Lj4iTWPrI(G1ZberkEPZJffId$vmc*I^#Z=^OR!hrEez`v%t6s z>^v{Vz_{=}AnT&cdkhz;((pwjiT)BUm(uW6OphNbZ7g5~UM!@sM*u>%eS3jG6tgMO z0Y*yz-40B#wA5gfegznRN*I%{LWO@PkY&FEN|`ar5nd?9;h?7mS8l!vGsZhSk!XQP zTr1o-K{M_;gVzsXY(lCJSValr)4#ys0xw!pl6OnVS+GZ>sbabq6JaC?*v z3gf{i@`Wfx$LHZBY^BJ^iNH)k#F&p#*c4kOs~gxd#EfdWdYi3b;c_`zw*&N=M-K0v zjO=BgXi7pDN%m$c#?al2PreW9nD%{wr=4Kpn=Ck;#rMF`RRRiU7;TXw)&ekz>LdKeM1i2m%H6rNUDtZojhm$O!O!3$bGx5ndp$wCMw(pzpUIb|7^5@ zKhU*`Sv-#JLfSAMv#}1i$?^rpcyIz7yVKsJp=p04;tCeT1jAZg%4ZlGM%kKX7#ocm z&~1Piw_+lU2M191I2xKZg@{YhU5jTOG~*~I4>_ll=E8xl3gqZP9D#?8#7R-C#p*)$2h1ynEpwCY3 z6*y-&C{M3?s5&{bNM21LAJq!yECbv-9WLtRW2u5+QgdS{wHz*T)~HAD5LM*YkgUQr z7CwYg#qAcvGbAXZRxL;F#Ss@OjB&;+UrCYao8lX1j4$*;Fus1ROOWl z(|1kLqM{Z!;_{0@1ojSg$QROJJ~H0f0=rQqhUqIR!YKx@qsQ9w7sAvcVqpfdV^}*Z z-!NKAaE9+P&{GYA#k0X_KTPl{`#51-&{$Tk9J->sr6f>PUygIe=i64`DAHw6Vgg8z z9w8l*Sc6nH<&L=q*@=t8l|?GdPB4^$(z~`+nDSmsXPG(yv1C~nakuk8`{R? zTf^ou*T9F6Xk)U;hPE-e-iF$k+(3|Wg}F{gkjbuLg3Q^+wrC^2vO11~AzGP?+RM6; zNe%+~(V8P9tsD}(tH)-D8=2%FsJYB7vDeVbB*y{fGRbiO@0jEuD0R$n96*ps4uTS7 z&Iw7Y@-+K8gCIj}V6xGMHZ#eJQ2hogTZ=+CriR$aq&t=ybHs8Z$C5*Z7B*VUaU4J+ zlNu;TX_R$xI4mA%| zP4_koRm~czZ<>9(@GhG@)nZ{@`z)-Zk!Qi6oW|n6cFZ%$;kZamEWXk%yG=}T6laRm zKUhdgErf+R$QNmz#kV=;ndIDDlzA5B)Lo=`7I!kei6UxuT-Fgg)SH>)e3Maok~&Q+bIRd0NO$!Dc2osq-$P0&EX?5~ubO-Qj8f=D5Qo zC;5`x;Ypn8OLT{)ITgakm0clQh~m^3VttyR$LuVvx5bILLlZHDcYfAssSCk}@jutI z-J7N7|8wj3>ac+9t$yU`J3lFcYV=A6RfI2m#ODtyo;(!w@W+s|;=q6gs)H`6Q#Z1Hj zCt1wkV>mX5e3`|}?G9LOF>?oj1z4Ih%d={XGyYpUy{%00RIKXkQZZ>+oOe?U@Rt$bY zYv+Z--8qvyId=?r;%&CoEll!6Qygi?GPsB2@3rT(G5LTEZDNwYb(GtTneUPufF6sP z*BsEan0dzm3oK^*^qm__FSM8`alla)Gm{-~w8c!F0~T4#EOx*#7Be4rz_AuHDF^gf z%zV)Si!Elp>41KVng4ab@fI_$Ibey!%%2=^qQ%Sw2Q0OiDa=>J1Ob_3F;ne;Wfn6_ z9kASDrr80fTg>neUTW`6AF&MXw{zagBu~vzZ!z)5fi|gVSMNt3s?D04)WFM zWTLt!9_>wc#Hx2LTo7JRU)9?aPw%Yiil?jFds0auMS6SMtGlAnY?1olLY^qy*XK(NVm85C#xd^1J&KB)Idj7U9cv&puReph@!H{fNfV5zt}BDx@Xe1%?HY(B6`4$Rbi_J=hQ)z0ARrn*gkyX zfctOB{ZK6So~b$u{A0Vl0T`}c1@wl+NO_hSwbe0mdeDqMY)*UH?0i^w0N?crN^Aw{ zr^2(yC>bjGz}y}%M+eRAi_Otn&F!nqNqfyvTTS0#v!~O0+0M4rEz7*s>D6nYnaNd4 zy-U95O{;&)+SY`+yH+nc6Khy`rs^5*t5wguHun>sHLnYpwOh^W7R&1@bJ^Z)X3=4D z0JNo7uU@-inRm&uwzYrgS(0AYwqdQAUbXZX>R3W5yi1k-mbI%_Uwh?h^VU_~%WgAw z1^YY&P(0!O-i~m8XJ;~&65;KsNPBOL*^Wpm7KV(;L}28@v7H0quD+B=g||m~dvF}a z!iiWk7Egr}ozaDLbzwpiKsK$CEu>@mPl-w>!d0Pj7!T(u)xlVIXhDAZiP9Bd_P{GG@G_IE_?yzuYZ=@?(=M2g68oni< z@H?QKL8VNa%%)w5%9cC<@Y;L|LFsH3O9Z#iI zh^p$+lB@k>ZGEt&zEYw1*)jny(2QF*3S+0=m@=l&dl)`u@P=Wk9HAemn|%I5o{+EX zZgaUWa97@P-<*B@@Hx(vjJotvt{IP zFuAJ_4sa2KGh6lDOeJEykzfi7Hwfo*LF1qW7VKa5E_(%znkZD$Tr zF-$U&h{U_#OebOHT)N9}tLcLeX3MRF&?r>)UJ|<|1|8f@q z4Ul$GplNC#Ucb@AytvyGVCYWT4U2}W6uSqNL&JJQl5b<-w@KM%!xeG5pHm=Q@1z@L z8z6$z*)ZN9qfUMPF`mx`X-0s0?iK){>%=jh|F||^m&NxCa;^UaDu(tV{5X#d*N-l- zI$nPhV7g9##0Hvo#J)pAG+TCk4h-dfMTv^Zcc>6iO}BLuz&eJKD=)_@yg{cr`>M<0 zgGR3PA6}uR@O)hVDEQOY-w&9s6KC!q`+jXuW5wPP=6`x7Y7yePe-b}@0Ltb63G$!w zg#P2%r2BslVCWOC6G+)!nWg%NH0A6+_xFQXuKCHiYCd&}Az5U2{+C=d;@lq6C(;1V zW4R}RKuimhIL7m}3A}!u{{#@)66MfYir-EW#Q0$;@_ddfV*1|2DaYpFRfs{=*;mb- zoW7&*Ioz1g254dUDj&WmsN2Vy%w>OTJq$qmrRwafZr>iz2$ahcf4rcCCM|dnu^|3?uTJmH#Yt)9k(y;TlkL`vfYA% z&=7~Wm~8yNC=a6nlci1deM-k+9NVipPVyHB$BLaKCDo;n&Ji7-cZV|=KDeP6VFI)T>psUF5OFh;5m+s z@ne#M7x$=V`~`}OeC-m(&^$p>veG4wXB;>Fd}TeYu%P$@cSo z!q;f>^8I(fxDHu=8##NuCO?<(h=wPK@6+%RPs3lJc)p?GH&R{xUc+A^`42|G zJv7dKUQhAyX?U9SPuB2{k^F28UqO7GhVP(wF4b_}KdUr+0m*OH@E_88+BN(Gl83N6N#ru!tA1D1D>KX4Me~LAn|L?_A4UdujN(~=JesJDc|If(JW=;Nfvb$cx zD+u4F;bc~PLc`^MCxk(+FSg6)>7AN9zaqfTe=NV7{C`-JzmE)mUBf>j{wWR5r}grA z%=*U={*oqNLijH<{L93@t>Gbx&tEnC9^wm0AKN`j@;(i3C;7=5UQ7IJ4dookA z6t|rkKA-IJ&v@()eSIOms>y#yapoU2S^hsr|DYz%FC6?p!%JvgXEl63>G6KO>y~m7mo5*kpBB!ILgDT^|C$e!cm^<=1~{Udk!aj+l8Z^74V-! zuzif!s6pSy6>a~tV-Q^SuD{;r0fB>V%y+3pr}1{(Zt2-z4|4pis$yASe z9_JB`y3zjz_``OUOCICN&&z8xd5-617mm8#B7dS9{w_Vx-=X1^ezXdCaN+KF-tEFs z|C1ztFX0?dezD;pmpsPvMN|&$5f_en-XlGaYj_nscpcaDKS1^NvI}?D=ld=_=zk~0 zU;U?c^<3uON2BR0AC5o&f5=k8?R=s0(5}+t%P~37ZqV?}3KlnOco8|fUBeF&{wWQ= ziv0hAhF6e&DmQuNk%%0jux34nUdHhNDRN!P2jo>@Zk(UX5W_z{-yYHA`TY5ohVwb_ JhK6%J{~zNvv(o?o literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/server/util_xml.c b/rubbos/app/httpd-2.0.64/server/util_xml.c new file mode 100644 index 00000000..f5c67edb --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/util_xml.c @@ -0,0 +1,128 @@ +/* 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. + */ + +#include "apr_xml.h" + +#include "httpd.h" +#include "http_protocol.h" +#include "http_log.h" +#include "http_core.h" + +#include "util_xml.h" + + +/* used for reading input blocks */ +#define READ_BLOCKSIZE 2048 + + +AP_DECLARE(int) ap_xml_parse_input(request_rec * r, apr_xml_doc **pdoc) +{ + apr_xml_parser *parser; + apr_bucket_brigade *brigade; + int seen_eos; + apr_status_t status; + char errbuf[200]; + apr_size_t total_read = 0; + apr_size_t limit_xml_body = ap_get_limit_xml_body(r); + int result = HTTP_BAD_REQUEST; + + parser = apr_xml_parser_create(r->pool); + brigade = apr_brigade_create(r->pool, r->connection->bucket_alloc); + + seen_eos = 0; + total_read = 0; + + do { + apr_bucket *bucket; + + /* read the body, stuffing it into the parser */ + status = ap_get_brigade(r->input_filters, brigade, + AP_MODE_READBYTES, APR_BLOCK_READ, + READ_BLOCKSIZE); + + if (status != APR_SUCCESS) { + goto read_error; + } + + APR_BRIGADE_FOREACH(bucket, brigade) { + const char *data; + apr_size_t len; + + if (APR_BUCKET_IS_EOS(bucket)) { + seen_eos = 1; + break; + } + + if (APR_BUCKET_IS_METADATA(bucket)) { + continue; + } + + status = apr_bucket_read(bucket, &data, &len, APR_BLOCK_READ); + if (status != APR_SUCCESS) { + goto read_error; + } + + total_read += len; + if (limit_xml_body && total_read > limit_xml_body) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "XML request body is larger than the configured " + "limit of %lu", (unsigned long)limit_xml_body); + result = HTTP_REQUEST_ENTITY_TOO_LARGE; + goto read_error; + } + + status = apr_xml_parser_feed(parser, data, len); + if (status) { + goto parser_error; + } + } + + apr_brigade_cleanup(brigade); + } while (!seen_eos); + + apr_brigade_destroy(brigade); + + /* tell the parser that we're done */ + status = apr_xml_parser_done(parser, pdoc); + if (status) { + /* Some parsers are stupid and return an error on blank documents. */ + if (!total_read) { + *pdoc = NULL; + return OK; + } + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "XML parser error (at end). status=%d", status); + return HTTP_BAD_REQUEST; + } + + return OK; + + parser_error: + (void) apr_xml_parser_geterror(parser, errbuf, sizeof(errbuf)); + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "%s", errbuf); + + /* FALLTHRU */ + + read_error: + /* make sure the parser is terminated */ + (void) apr_xml_parser_done(parser, NULL); + + apr_brigade_destroy(brigade); + + /* Apache will supply a default error, plus the error log above. */ + return result; +} diff --git a/rubbos/app/httpd-2.0.64/server/util_xml.lo b/rubbos/app/httpd-2.0.64/server/util_xml.lo new file mode 100644 index 00000000..551eb0d4 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/util_xml.lo @@ -0,0 +1,12 @@ +# util_xml.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/util_xml.o' + +# Name of the non-PIC object. +non_pic_object='util_xml.o' + diff --git a/rubbos/app/httpd-2.0.64/server/util_xml.o b/rubbos/app/httpd-2.0.64/server/util_xml.o new file mode 100644 index 0000000000000000000000000000000000000000..295b9bc4b293db8c9440f6adcb8f5a16e35354cc GIT binary patch literal 29408 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 +#endif + +/* + * After all the definitions there's an explanation of how it's all put + * together. + */ + +/* meta-list of name-vhosts. Each server_rec can be in possibly multiple + * lists of name-vhosts. + */ +typedef struct name_chain name_chain; +struct name_chain { + name_chain *next; + server_addr_rec *sar; /* the record causing it to be in + * this chain (needed for port comparisons) */ + server_rec *server; /* the server to use on a match */ +}; + +/* meta-list of ip addresses. Each server_rec can be in possibly multiple + * hash chains since it can have multiple ips. + */ +typedef struct ipaddr_chain ipaddr_chain; +struct ipaddr_chain { + ipaddr_chain *next; + server_addr_rec *sar; /* the record causing it to be in + * this chain (need for both ip addr and port + * comparisons) */ + server_rec *server; /* the server to use if this matches */ + name_chain *names; /* if non-NULL then a list of name-vhosts + * sharing this address */ +}; + +/* This defines the size of the hash apr_table_t used for hashing ip addresses + * of virtual hosts. It must be a power of two. + */ +#ifndef IPHASH_TABLE_SIZE +#define IPHASH_TABLE_SIZE 256 +#endif + +/* A (n) bucket hash table, each entry has a pointer to a server rec and + * a pointer to the other entries in that bucket. Each individual address, + * even for virtualhosts with multiple addresses, has an entry in this hash + * table. There are extra buckets for _default_, and name-vhost entries. + * + * Note that after config time this is constant, so it is thread-safe. + */ +static ipaddr_chain *iphash_table[IPHASH_TABLE_SIZE]; + +/* dump out statistics about the hash function */ +/* #define IPHASH_STATISTICS */ + +/* list of the _default_ servers */ +static ipaddr_chain *default_list; + +/* list of the NameVirtualHost addresses */ +static server_addr_rec *name_vhost_list; +static server_addr_rec **name_vhost_list_tail; + +/* + * How it's used: + * + * The ip address determines which chain in iphash_table is interesting, then + * a comparison is done down that chain to find the first ipaddr_chain whose + * sar matches the address:port pair. + * + * If that ipaddr_chain has names == NULL then you're done, it's an ip-vhost. + * + * Otherwise it's a name-vhost list, and the default is the server in the + * ipaddr_chain record. We tuck away the ipaddr_chain record in the + * conn_rec field vhost_lookup_data. Later on after the headers we get a + * second chance, and we use the name_chain to figure out what name-vhost + * matches the headers. + * + * If there was no ip address match in the iphash_table then do a lookup + * in the default_list. + * + * How it's put together ... well you should be able to figure that out + * from how it's used. Or something like that. + */ + + +/* called at the beginning of the config */ +AP_DECLARE(void) ap_init_vhost_config(apr_pool_t *p) +{ + memset(iphash_table, 0, sizeof(iphash_table)); + default_list = NULL; + name_vhost_list = NULL; + name_vhost_list_tail = &name_vhost_list; +} + + +/* + * Parses a host of the form

    [:port] + * paddr is used to create a list in the order of input + * **paddr is the ->next pointer of the last entry (or s->addrs) + * *paddr is the variable used to keep track of **paddr between calls + * port is the default port to assume + */ +static const char *get_addresses(apr_pool_t *p, const char *w_, + server_addr_rec ***paddr, + apr_port_t default_port) +{ + apr_sockaddr_t *my_addr; + server_addr_rec *sar; + char *w, *host, *scope_id; + int wild_port; + apr_size_t wlen; + apr_port_t port; + apr_status_t rv; + + if (*w_ == '\0') + return NULL; + + w = apr_pstrdup(p, w_); + /* apr_parse_addr_port() doesn't understand ":*" so handle that first. */ + wlen = strlen(w); /* wlen must be > 0 at this point */ + wild_port = 0; + if (w[wlen - 1] == '*') { + if (wlen < 2) { + wild_port = 1; + } + else if (w[wlen - 2] == ':') { + w[wlen - 2] = '\0'; + wild_port = 1; + } + } + rv = apr_parse_addr_port(&host, &scope_id, &port, w, p); + /* If the string is "80", apr_parse_addr_port() will be happy and set + * host to NULL and port to 80, so watch out for that. + */ + if (rv != APR_SUCCESS) { + return "The address or port is invalid"; + } + if (!host) { + return "Missing address for VirtualHost"; + } + if (scope_id) { + return "Scope ids are not supported"; + } + if (!port && !wild_port) { + port = default_port; + } + + if (strcmp(host, "*") == 0) { + rv = apr_sockaddr_info_get(&my_addr, "0.0.0.0", APR_INET, port, 0, p); + ap_assert(rv == APR_SUCCESS); /* must be bug or out of storage */ + } + else if (strcasecmp(host, "_default_") == 0 + || strcmp(host, "255.255.255.255") == 0) { + rv = apr_sockaddr_info_get(&my_addr, "255.255.255.255", APR_INET, port, 0, p); + ap_assert(rv == APR_SUCCESS); /* must be bug or out of storage */ + } + else { + rv = apr_sockaddr_info_get(&my_addr, host, APR_UNSPEC, port, 0, p); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, NULL, + "Cannot resolve host name %s --- ignoring!", host); + return NULL; + } + } + + /* Remember all addresses for the host */ + + do { + sar = apr_pcalloc(p, sizeof(server_addr_rec)); + **paddr = sar; + *paddr = &sar->next; + sar->host_addr = my_addr; + sar->host_port = port; + sar->virthost = host; + my_addr = my_addr->next; + } while (my_addr); + + return NULL; +} + + +/* parse the addresses */ +const char *ap_parse_vhost_addrs(apr_pool_t *p, + const char *hostname, + server_rec *s) +{ + server_addr_rec **addrs; + const char *err; + + /* start the list of addreses */ + addrs = &s->addrs; + while (hostname[0]) { + err = get_addresses(p, ap_getword_conf(p, &hostname), &addrs, s->port); + if (err) { + *addrs = NULL; + return err; + } + } + /* terminate the list */ + *addrs = NULL; + if (s->addrs) { + if (s->addrs->host_port) { + /* override the default port which is inherited from main_server */ + s->port = s->addrs->host_port; + } + } + return NULL; +} + + +const char *ap_set_name_virtual_host(cmd_parms *cmd, void *dummy, + const char *arg) +{ + /* use whatever port the main server has at this point */ + return get_addresses(cmd->pool, arg, &name_vhost_list_tail, + cmd->server->port); +} + + +/* hash apr_table_t statistics, keep this in here for the beta period so + * we can find out if the hash function is ok + */ +#ifdef IPHASH_STATISTICS +static int iphash_compare(const void *a, const void *b) +{ + return (*(const int *) b - *(const int *) a); +} + + +static void dump_iphash_statistics(server_rec *main_s) +{ + unsigned count[IPHASH_TABLE_SIZE]; + int i; + ipaddr_chain *src; + unsigned total; + char buf[HUGE_STRING_LEN]; + char *p; + + total = 0; + for (i = 0; i < IPHASH_TABLE_SIZE; ++i) { + count[i] = 0; + for (src = iphash_table[i]; src; src = src->next) { + ++count[i]; + if (i < IPHASH_TABLE_SIZE) { + /* don't count the slop buckets in the total */ + ++total; + } + } + } + qsort(count, IPHASH_TABLE_SIZE, sizeof(count[0]), iphash_compare); + p = buf + apr_snprintf(buf, sizeof(buf), + "iphash: total hashed = %u, avg chain = %u, " + "chain lengths (count x len):", + total, total / IPHASH_TABLE_SIZE); + total = 1; + for (i = 1; i < IPHASH_TABLE_SIZE; ++i) { + if (count[i - 1] != count[i]) { + p += apr_snprintf(p, sizeof(buf) - (p - buf), " %ux%u", + total, count[i - 1]); + total = 1; + } + else { + ++total; + } + } + p += apr_snprintf(p, sizeof(buf) - (p - buf), " %ux%u", + total, count[IPHASH_TABLE_SIZE - 1]); + ap_log_error(APLOG_MARK, APLOG_DEBUG, main_s, buf); +} +#endif + + +/* This hashing function is designed to get good distribution in the cases + * where the server is handling entire "networks" of servers. i.e. a + * whack of /24s. This is probably the most common configuration for + * ISPs with large virtual servers. + * + * NOTE: This function is symmetric (i.e. collapses all 4 octets + * into one), so machine byte order (big/little endianness) does not matter. + * + * Hash function provided by David Hankins. + */ +static APR_INLINE unsigned hash_inaddr(unsigned key) +{ + key ^= (key >> 16); + return ((key >> 8) ^ key) % IPHASH_TABLE_SIZE; +} + +static APR_INLINE unsigned hash_addr(struct apr_sockaddr_t *sa) +{ + unsigned key; + + /* The key is the last four bytes of the IP address. + * For IPv4, this is the entire address, as always. + * For IPv6, this is usually part of the MAC address. + */ + key = *(unsigned *)((char *)sa->ipaddr_ptr + sa->ipaddr_len - 4); + return hash_inaddr(key); +} + +static ipaddr_chain *new_ipaddr_chain(apr_pool_t *p, + server_rec *s, server_addr_rec *sar) +{ + ipaddr_chain *new; + + new = apr_palloc(p, sizeof(*new)); + new->names = NULL; + new->server = s; + new->sar = sar; + new->next = NULL; + return new; +} + + +static name_chain *new_name_chain(apr_pool_t *p, + server_rec *s, server_addr_rec *sar) +{ + name_chain *new; + + new = apr_palloc(p, sizeof(*new)); + new->server = s; + new->sar = sar; + new->next = NULL; + return new; +} + + +static APR_INLINE ipaddr_chain *find_ipaddr(apr_sockaddr_t *sa) +{ + unsigned bucket; + ipaddr_chain *trav; + + /* scan the hash apr_table_t for an exact match first */ + bucket = hash_addr(sa); + for (trav = iphash_table[bucket]; trav; trav = trav->next) { + server_addr_rec *sar = trav->sar; + apr_sockaddr_t *cur = sar->host_addr; + + if (cur->port == 0 || sa->port == 0 || cur->port == sa->port) { + if (apr_sockaddr_equal(cur, sa)) { + return trav; + } + } + } + return NULL; +} + +static ipaddr_chain *find_default_server(apr_port_t port) +{ + server_addr_rec *sar; + ipaddr_chain *trav; + + for (trav = default_list; trav; trav = trav->next) { + sar = trav->sar; + if (sar->host_port == 0 || sar->host_port == port) { + /* match! */ + return trav; + } + } + return NULL; +} + +static void dump_a_vhost(apr_file_t *f, ipaddr_chain *ic) +{ + name_chain *nc; + int len; + char buf[MAX_STRING_LEN]; + apr_sockaddr_t *ha = ic->sar->host_addr; + + if (ha->family == APR_INET && + ha->sa.sin.sin_addr.s_addr == DEFAULT_VHOST_ADDR) { + len = apr_snprintf(buf, sizeof(buf), "_default_:%u", + ic->sar->host_port); + } + else if (ha->family == APR_INET && + ha->sa.sin.sin_addr.s_addr == INADDR_ANY) { + len = apr_snprintf(buf, sizeof(buf), "*:%u", + ic->sar->host_port); + } + else { + len = apr_snprintf(buf, sizeof(buf), "%pI", ha); + } + if (ic->sar->host_port == 0) { + buf[len-1] = '*'; + } + if (ic->names == NULL) { + apr_file_printf(f, "%-22s %s (%s:%u)\n", buf, + ic->server->server_hostname, + ic->server->defn_name, ic->server->defn_line_number); + return; + } + apr_file_printf(f, "%-22s is a NameVirtualHost\n" + "%8s default server %s (%s:%u)\n", + buf, "", ic->server->server_hostname, + ic->server->defn_name, ic->server->defn_line_number); + for (nc = ic->names; nc; nc = nc->next) { + if (nc->sar->host_port) { + apr_file_printf(f, "%8s port %u ", "", nc->sar->host_port); + } + else { + apr_file_printf(f, "%8s port * ", ""); + } + apr_file_printf(f, "namevhost %s (%s:%u)\n", + nc->server->server_hostname, + nc->server->defn_name, nc->server->defn_line_number); + } +} + +static void dump_vhost_config(apr_file_t *f) +{ + ipaddr_chain *ic; + int i; + + apr_file_printf(f, "VirtualHost configuration:\n"); + for (i = 0; i < IPHASH_TABLE_SIZE; ++i) { + for (ic = iphash_table[i]; ic; ic = ic->next) { + dump_a_vhost(f, ic); + } + } + if (default_list) { + apr_file_printf(f, "wildcard NameVirtualHosts and _default_ servers:\n"); + for (ic = default_list; ic; ic = ic->next) { + dump_a_vhost(f, ic); + } + } +} + +/* + * Two helper functions for ap_fini_vhost_config() + */ +static int add_name_vhost_config(apr_pool_t *p, server_rec *main_s, + server_rec *s, server_addr_rec *sar, + ipaddr_chain *ic) +{ + /* the first time we encounter a NameVirtualHost address + * ic->server will be NULL, on subsequent encounters + * ic->names will be non-NULL. + */ + if (ic->names || ic->server == NULL) { + name_chain *nc = new_name_chain(p, s, sar); + nc->next = ic->names; + ic->names = nc; + ic->server = s; + if (sar->host_port != ic->sar->host_port) { + /* one of the two is a * port, the other isn't */ + ap_log_error(APLOG_MARK, APLOG_ERR, 0, main_s, + "VirtualHost %s:%u -- mixing * " + "ports and non-* ports with " + "a NameVirtualHost address is not supported," + " proceeding with undefined results", + sar->virthost, sar->host_port); + } + return 1; + } + else { + /* IP-based vhosts are handled by the caller */ + return 0; + } +} + +static void remove_unused_name_vhosts(server_rec *main_s, ipaddr_chain **pic) +{ + while (*pic) { + ipaddr_chain *ic = *pic; + + if (ic->server == NULL) { + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, main_s, + "NameVirtualHost %s:%u has no VirtualHosts", + ic->sar->virthost, ic->sar->host_port); + *pic = ic->next; + } + else if (ic->names == NULL) { + /* if server != NULL and names == NULL then we're done + * looking at NameVirtualHosts + */ + break; + } + else { + pic = &ic->next; + } + } +} + +/* compile the tables and such we need to do the run-time vhost lookups */ +AP_DECLARE(void) ap_fini_vhost_config(apr_pool_t *p, server_rec *main_s) +{ + server_addr_rec *sar; + int has_default_vhost_addr; + server_rec *s; + int i; + ipaddr_chain **iphash_table_tail[IPHASH_TABLE_SIZE]; + + /* terminate the name_vhost list */ + *name_vhost_list_tail = NULL; + + /* Main host first */ + s = main_s; + + if (!s->server_hostname) { + s->server_hostname = ap_get_local_host(p); + } + + /* initialize the tails */ + for (i = 0; i < IPHASH_TABLE_SIZE; ++i) { + iphash_table_tail[i] = &iphash_table[i]; + } + + /* The first things to go into the hash apr_table_t are the NameVirtualHosts + * Since name_vhost_list is in the same order that the directives + * occured in the config file, we'll copy it in that order. + */ + for (sar = name_vhost_list; sar; sar = sar->next) { + char inaddr_any[16] = {0}; /* big enough to handle IPv4 or IPv6 */ + unsigned bucket = hash_addr(sar->host_addr); + ipaddr_chain *ic = new_ipaddr_chain(p, NULL, sar); + + if (memcmp(sar->host_addr->ipaddr_ptr, inaddr_any, + sar->host_addr->ipaddr_len)) { /* not IN[6]ADDR_ANY */ + *iphash_table_tail[bucket] = ic; + iphash_table_tail[bucket] = &ic->next; + } + else { + /* A wildcard NameVirtualHost goes on the default_list so + * that it can catch incoming requests on any address. + */ + ic->next = default_list; + default_list = ic; + } + /* Notice that what we've done is insert an ipaddr_chain with + * both server and names NULL. This fact is used to spot name- + * based vhosts in add_name_vhost_config(). + */ + } + + /* The next things to go into the hash apr_table_t are the virtual hosts + * themselves. They're listed off of main_s->next in the reverse + * order they occured in the config file, so we insert them at + * the iphash_table_tail but don't advance the tail. + */ + + for (s = main_s->next; s; s = s->next) { + has_default_vhost_addr = 0; + for (sar = s->addrs; sar; sar = sar->next) { + ipaddr_chain *ic; + char inaddr_any[16] = {0}; /* big enough to handle IPv4 or IPv6 */ + + if ((sar->host_addr->family == AF_INET && + sar->host_addr->sa.sin.sin_addr.s_addr == DEFAULT_VHOST_ADDR) + || !memcmp(sar->host_addr->ipaddr_ptr, inaddr_any, sar->host_addr->ipaddr_len)) { + ic = find_default_server(sar->host_port); + if (!ic || !add_name_vhost_config(p, main_s, s, sar, ic)) { + if (ic && ic->sar->host_port != 0) { + ap_log_error(APLOG_MARK, APLOG_WARNING, + 0, main_s, "_default_ VirtualHost " + "overlap on port %u, the first has " + "precedence", sar->host_port); + } + ic = new_ipaddr_chain(p, s, sar); + ic->next = default_list; + default_list = ic; + } + has_default_vhost_addr = 1; + } + else { + /* see if it matches something we've already got */ + ic = find_ipaddr(sar->host_addr); + + if (!ic) { + unsigned bucket = hash_addr(sar->host_addr); + + ic = new_ipaddr_chain(p, s, sar); + ic->next = *iphash_table_tail[bucket]; + *iphash_table_tail[bucket] = ic; + } + else if (!add_name_vhost_config(p, main_s, s, sar, ic)) { + ap_log_error(APLOG_MARK, APLOG_WARNING, + 0, main_s, "VirtualHost %s:%u overlaps " + "with VirtualHost %s:%u, the first has " + "precedence, perhaps you need a " + "NameVirtualHost directive", + sar->virthost, sar->host_port, + ic->sar->virthost, ic->sar->host_port); + ic->sar = sar; + ic->server = s; + } + } + } + + /* Ok now we want to set up a server_hostname if the user was + * silly enough to forget one. + * XXX: This is silly we should just crash and burn. + */ + if (!s->server_hostname) { + if (has_default_vhost_addr) { + s->server_hostname = main_s->server_hostname; + } + else if (!s->addrs) { + /* what else can we do? at this point this vhost has + no configured name, probably because they used + DNS in the VirtualHost statement. It's disabled + anyhow by the host matching code. -djg */ + s->server_hostname = + apr_pstrdup(p, "bogus_host_without_forward_dns"); + } + else { + apr_status_t rv; + char *hostname; + + rv = apr_getnameinfo(&hostname, s->addrs->host_addr, 0); + if (rv == APR_SUCCESS) { + s->server_hostname = apr_pstrdup(p, hostname); + } + else { + /* again, what can we do? They didn't specify a + ServerName, and their DNS isn't working. -djg */ + char *ipaddr_str; + + apr_sockaddr_ip_get(&ipaddr_str, s->addrs->host_addr); + ap_log_error(APLOG_MARK, APLOG_ERR, rv, main_s, + "Failed to resolve server name " + "for %s (check DNS) -- or specify an explicit " + "ServerName", + ipaddr_str); + s->server_hostname = + apr_pstrdup(p, "bogus_host_without_reverse_dns"); + } + } + } + } + + /* now go through and delete any NameVirtualHosts that didn't have any + * hosts associated with them. Lamers. + */ + for (i = 0; i < IPHASH_TABLE_SIZE; ++i) { + remove_unused_name_vhosts(main_s, &iphash_table[i]); + } + remove_unused_name_vhosts(main_s, &default_list); + +#ifdef IPHASH_STATISTICS + dump_iphash_statistics(main_s); +#endif + if (ap_exists_config_define("DUMP_VHOSTS")) { + apr_file_t *thefile = NULL; + apr_file_open_stderr(&thefile, p); + dump_vhost_config(thefile); + } +} + + +/***************************************************************************** + * run-time vhost matching functions + */ + +/* Lowercase and remove any trailing dot and/or :port from the hostname, + * and check that it is sane. + * + * In most configurations the exact syntax of the hostname isn't + * important so strict sanity checking isn't necessary. However, in + * mass hosting setups (using mod_vhost_alias or mod_rewrite) where + * the hostname is interpolated into the filename, we need to be sure + * that the interpolation doesn't expose parts of the filesystem. + * We don't do strict RFC 952 / RFC 1123 syntax checking in order + * to support iDNS and people who erroneously use underscores. + * Instead we just check for filesystem metacharacters: directory + * separators / and \ and sequences of more than one dot. + */ +static void fix_hostname(request_rec *r) +{ + char *host, *scope_id; + char *dst; + apr_port_t port; + apr_status_t rv; + + /* According to RFC 2616, Host header field CAN be blank. */ + if (!*r->hostname) { + return; + } + + rv = apr_parse_addr_port(&host, &scope_id, &port, r->hostname, r->pool); + if (rv != APR_SUCCESS || scope_id) { + goto bad; + } + + if (!host && port) { + /* silly looking host ("Host: 123") but that isn't our job + * here to judge; apr_parse_addr_port() would think we had a port + * but no address + */ + host = apr_itoa(r->pool, (int)port); + } + else if (port) { + /* Don't throw the Host: header's port number away: + save it in parsed_uri -- ap_get_server_port() needs it! */ + /* @@@ XXX there should be a better way to pass the port. + * Like r->hostname, there should be a r->portno + */ + r->parsed_uri.port = port; + r->parsed_uri.port_str = apr_itoa(r->pool, (int)port); + } + + /* if the hostname is an IPv6 numeric address string, it was validated + * already; otherwise, further validation is needed + */ + if (r->hostname[0] != '[') { + for (dst = host; *dst; dst++) { + if (apr_islower(*dst)) { + /* leave char unchanged */ + } + else if (*dst == '.') { + if (*(dst + 1) == '.') { + goto bad; + } + } + else if (apr_isupper(*dst)) { + *dst = apr_tolower(*dst); + } + else if (*dst == '/' || *dst == '\\') { + goto bad; + } + } + /* strip trailing gubbins */ + if (dst > host && dst[-1] == '.') { + dst[-1] = '\0'; + } + } + r->hostname = host; + return; + +bad: + r->status = HTTP_BAD_REQUEST; + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Client sent malformed Host header"); + return; +} + + +/* return 1 if host matches ServerName or ServerAliases */ +static int matches_aliases(server_rec *s, const char *host) +{ + int i; + apr_array_header_t *names; + + /* match ServerName */ + if (!strcasecmp(host, s->server_hostname)) { + return 1; + } + + /* search all the aliases from ServerAlias directive */ + names = s->names; + if (names) { + char **name = (char **) names->elts; + for (i = 0; i < names->nelts; ++i) { + if(!name[i]) continue; + if (!strcasecmp(host, name[i])) + return 1; + } + } + names = s->wild_names; + if (names) { + char **name = (char **) names->elts; + for (i = 0; i < names->nelts; ++i) { + if(!name[i]) continue; + if (!ap_strcasecmp_match(host, name[i])) + return 1; + } + } + return 0; +} + + +/* Suppose a request came in on the same socket as this r, and included + * a header "Host: host:port", would it map to r->server? It's more + * than just that though. When we do the normal matches for each request + * we don't even bother considering Host: etc on non-namevirtualhosts, + * we just call it a match. But here we require the host:port to match + * the ServerName and/or ServerAliases. + */ +AP_DECLARE(int) ap_matches_request_vhost(request_rec *r, const char *host, + apr_port_t port) +{ + server_rec *s; + server_addr_rec *sar; + + s = r->server; + + /* search all the values */ + /* XXX: If this is a NameVirtualHost then we may not be doing the Right Thing + * consider: + * + * NameVirtualHost 10.1.1.1 + * + * ServerName v1 + * + * + * ServerName v2 + * + * + * Suppose r->server is v2, and we're asked to match "10.1.1.1". We'll say + * "yup it's v2", when really it isn't... if a request came in for 10.1.1.1 + * it would really go to v1. + */ + for (sar = s->addrs; sar; sar = sar->next) { + if ((sar->host_port == 0 || port == sar->host_port) + && !strcasecmp(host, sar->virthost)) { + return 1; + } + } + + /* the Port has to match now, because the rest don't have ports associated + * with them. */ + if (port != s->port) { + return 0; + } + + return matches_aliases(s, host); +} + + +static void check_hostalias(request_rec *r) +{ + /* + * Even if the request has a Host: header containing a port we ignore + * that port. We always use the physical port of the socket. There + * are a few reasons for this: + * + * - the default of 80 or 443 for SSL is easier to handle this way + * - there is less of a possibility of a security problem + * - it simplifies the data structure + * - the client may have no idea that a proxy somewhere along the way + * translated the request to another ip:port + * - except for the addresses from the VirtualHost line, none of the other + * names we'll match have ports associated with them + */ + const char *host = r->hostname; + apr_port_t port; + server_rec *s; + server_rec *last_s; + name_chain *src; + + last_s = NULL; + + apr_sockaddr_port_get(&port, r->connection->local_addr); + + /* Recall that the name_chain is a list of server_addr_recs, some of + * whose ports may not match. Also each server may appear more than + * once in the chain -- specifically, it will appear once for each + * address from its VirtualHost line which matched. We only want to + * do the full ServerName/ServerAlias comparisons once for each + * server, fortunately we know that all the VirtualHost addresses for + * a single server are adjacent to each other. + */ + + for (src = r->connection->vhost_lookup_data; src; src = src->next) { + server_addr_rec *sar; + + /* We only consider addresses on the name_chain which have a matching + * port + */ + sar = src->sar; + if (sar->host_port != 0 && port != sar->host_port) { + continue; + } + + s = src->server; + + /* does it match the virthost from the sar? */ + if (!strcasecmp(host, sar->virthost)) { + goto found; + } + + if (s == last_s) { + /* we've already done ServerName and ServerAlias checks for this + * vhost + */ + continue; + } + last_s = s; + + if (matches_aliases(s, host)) { + goto found; + } + } + return; + +found: + /* s is the first matching server, we're done */ + r->server = s; +} + + +static void check_serverpath(request_rec *r) +{ + server_rec *s; + server_rec *last_s; + name_chain *src; + apr_port_t port; + + apr_sockaddr_port_get(&port, r->connection->local_addr); + + /* + * This is in conjunction with the ServerPath code in http_core, so we + * get the right host attached to a non- Host-sending request. + * + * See the comment in check_hostalias about how each vhost can be + * listed multiple times. + */ + + last_s = NULL; + for (src = r->connection->vhost_lookup_data; src; src = src->next) { + /* We only consider addresses on the name_chain which have a matching + * port + */ + if (src->sar->host_port != 0 && port != src->sar->host_port) { + continue; + } + + s = src->server; + if (s == last_s) { + continue; + } + last_s = s; + + if (s->path && !strncmp(r->uri, s->path, s->pathlen) && + (s->path[s->pathlen - 1] == '/' || + r->uri[s->pathlen] == '/' || + r->uri[s->pathlen] == '\0')) { + r->server = s; + return; + } + } +} + + +AP_DECLARE(void) ap_update_vhost_from_headers(request_rec *r) +{ + /* must set this for HTTP/1.1 support */ + if (r->hostname || (r->hostname = apr_table_get(r->headers_in, "Host"))) { + fix_hostname(r); + if (r->status != HTTP_OK) + return; + } + /* check if we tucked away a name_chain */ + if (r->connection->vhost_lookup_data) { + if (r->hostname) + check_hostalias(r); + else + check_serverpath(r); + } +} + + +/** + * For every virtual host on this connection, call func_cb. + */ +AP_DECLARE(int) ap_vhost_iterate_given_conn(conn_rec *conn, + ap_vhost_iterate_conn_cb func_cb, + void* baton) +{ + server_rec *s; + server_rec *last_s; + name_chain *src; + apr_port_t port; + int rv = 0; + + if (conn->vhost_lookup_data) { + last_s = NULL; + port = conn->local_addr->port; + + for (src = conn->vhost_lookup_data; src; src = src->next) { + server_addr_rec *sar; + + /* We only consider addresses on the name_chain which have a + * matching port. + */ + sar = src->sar; + if (sar->host_port != 0 && port != sar->host_port) { + continue; + } + + s = src->server; + + if (s == last_s) { + /* we've already done a callback for this vhost. */ + continue; + } + + last_s = s; + + rv = func_cb(baton, conn, s); + + if (rv != 0) { + break; + } + } + } + else { + rv = func_cb(baton, conn, conn->base_server); + } + + return rv; +} + +/* Called for a new connection which has a known local_addr. Note that the + * new connection is assumed to have conn->server == main server. + */ +AP_DECLARE(void) ap_update_vhost_given_ip(conn_rec *conn) +{ + ipaddr_chain *trav; + apr_port_t port; + + /* scan the hash apr_table_t for an exact match first */ + trav = find_ipaddr(conn->local_addr); + + if (trav) { + /* save the name_chain for later in case this is a name-vhost */ + conn->vhost_lookup_data = trav->names; + conn->base_server = trav->server; + return; + } + + /* maybe there's a default server or wildcard name-based vhost + * matching this port + */ + apr_sockaddr_port_get(&port, conn->local_addr); + + trav = find_default_server(port); + if (trav) { + conn->vhost_lookup_data = trav->names; + conn->base_server = trav->server; + return; + } + + /* otherwise we're stuck with just the main server + * and no name-based vhosts + */ + conn->vhost_lookup_data = NULL; +} diff --git a/rubbos/app/httpd-2.0.64/server/vhost.lo b/rubbos/app/httpd-2.0.64/server/vhost.lo new file mode 100644 index 00000000..506c9cc6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/vhost.lo @@ -0,0 +1,12 @@ +# vhost.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/vhost.o' + +# Name of the non-PIC object. +non_pic_object='vhost.o' + diff --git a/rubbos/app/httpd-2.0.64/server/vhost.o b/rubbos/app/httpd-2.0.64/server/vhost.o new file mode 100644 index 0000000000000000000000000000000000000000..7e23e87a0fc1733355d047fcd33b6fff51c43798 GIT binary patch literal 65800 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

    _b4FR=jIuy! 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 N=Q?Bt?I7oQ?GU?4iZ%cM literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/.deps b/rubbos/app/httpd-2.0.64/srclib/.deps new file mode 100644 index 00000000..e69de29b diff --git a/rubbos/app/httpd-2.0.64/srclib/Makefile b/rubbos/app/httpd-2.0.64/srclib/Makefile new file mode 100644 index 00000000..2278001d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/Makefile @@ -0,0 +1,11 @@ +top_srcdir = /bottlenecks/rubbos/app/httpd-2.0.64 +top_builddir = /bottlenecks/rubbos/app/httpd-2.0.64 +srcdir = /bottlenecks/rubbos/app/httpd-2.0.64/srclib +builddir = /bottlenecks/rubbos/app/httpd-2.0.64/srclib +VPATH = /bottlenecks/rubbos/app/httpd-2.0.64/srclib + +SUBDIRS = pcre +BUILD_SUBDIRS = $(AP_BUILD_SRCLIB_DIRS) +CLEAN_SUBDIRS = $(AP_CLEAN_SRCLIB_DIRS) + +include $(top_builddir)/build/rules.mk diff --git a/rubbos/app/httpd-2.0.64/srclib/Makefile.in b/rubbos/app/httpd-2.0.64/srclib/Makefile.in new file mode 100644 index 00000000..1fb910ad --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/Makefile.in @@ -0,0 +1,6 @@ + +SUBDIRS = pcre +BUILD_SUBDIRS = $(AP_BUILD_SRCLIB_DIRS) +CLEAN_SUBDIRS = $(AP_CLEAN_SRCLIB_DIRS) + +include $(top_builddir)/build/rules.mk diff --git a/rubbos/app/httpd-2.0.64/srclib/apr-util/.libs/libaprutil-0.a b/rubbos/app/httpd-2.0.64/srclib/apr-util/.libs/libaprutil-0.a new file mode 100644 index 0000000000000000000000000000000000000000..f0d0c5f6e609f1a0f8ae1695b469531766b8f506 GIT binary patch literal 709894 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 K6XTN%Ik21D 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 z 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

    ^=E&X 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr-util/.libs/libaprutil-0.la b/rubbos/app/httpd-2.0.64/srclib/apr-util/.libs/libaprutil-0.la new file mode 100644 index 00000000..d5a041dc --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr-util/.libs/libaprutil-0.la @@ -0,0 +1,35 @@ +# libaprutil-0.la - a libtool library file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='libaprutil-0.so.0' + +# Names of this library. +library_names='libaprutil-0.so.0.9.19 libaprutil-0.so.0 libaprutil-0.so' + +# The name of the static archive. +old_library='libaprutil-0.a' + +# Libraries that this one depends upon. +dependency_libs='' + +# Version information for libaprutil-0. +current=9 +age=9 +revision=19 + +# Is this an already installed library? +installed=no + +# Should we warn about portability when linking against -modules? +shouldnotlink=no + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='/bottlenecks/rubbos/app/apache2/lib' diff --git a/rubbos/app/httpd-2.0.64/srclib/apr-util/.libs/libaprutil-0.lai b/rubbos/app/httpd-2.0.64/srclib/apr-util/.libs/libaprutil-0.lai new file mode 100644 index 00000000..8b817d00 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr-util/.libs/libaprutil-0.lai @@ -0,0 +1,35 @@ +# libaprutil-0.la - a libtool library file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='libaprutil-0.so.0' + +# Names of this library. +library_names='libaprutil-0.so.0.9.19 libaprutil-0.so.0 libaprutil-0.so' + +# The name of the static archive. +old_library='libaprutil-0.a' + +# Libraries that this one depends upon. +dependency_libs='' + +# Version information for libaprutil-0. +current=9 +age=9 +revision=19 + +# Is this an already installed library? +installed=yes + +# Should we warn about portability when linking against -modules? +shouldnotlink=no + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='/bottlenecks/rubbos/app/apache2/lib' diff --git a/rubbos/app/httpd-2.0.64/srclib/apr-util/.libs/libaprutil-0.so b/rubbos/app/httpd-2.0.64/srclib/apr-util/.libs/libaprutil-0.so new file mode 100755 index 0000000000000000000000000000000000000000..7e6097b0f1095ee03c2df0a495e7274a0699da3a GIT binary patch literal 415764 zcmeFa3wTsT)-Jp|36OB><{kyLgV70iOLNi08)@i<-P&Lj5L7S;A%Q3)G3f|`mq3DM z+q7mJok7PL-AOVG(cU9HyRNA!T_x3ijk{K3%s%5IEJG4955x8u2Xi*cUc z`qv@~?-1>UvrC0Aws9BgFx~p2j!1kaOq!~kye)RciXY$Dxwz=UUfoB&p6Y*S!sXP& zCVUFlAM-T5CsYIKUVkO0TVRV!d8J(awQljqbQ?j(e6mv&Z zl@c4TL=81rQY#SE5C9$f^TC7->E6MRw>`JU< zLyW1izrEb*i-;($=sycpM_QCyqD>ZMNtY3qf2>%?cb^5HT7rh*Q%bx&A*EO`SrvuU ziBL=_O0;AA*ttr%MX@XS5r6C+tyDz3tSFjWS*k3t_Kh={A}l7wG*szH#^_(H{7vak z=Io;?DP2vblv2gEw10|XQic?#SR$0NC5pw;KfQmrqA_XSaj`v>@ZDCmEQJKa7K-#@|qQ+z(d zXDvSK@G&kwzHGo}BR=Fa#6lE{I z@5AS73HwI+zF+!&0N)P^`a9eY;q!x_b#bTL5qui)IZ6bsCVo?z#r-GTPvUb5pVRoX z;By8a<2s8k=ZG-jKYZwlz&#S5D15r%Lmo<3jJWp@_g=X7#-|TH{qY%qk8ur@z7rNJ z=nHVa5TC(P`4H**#p1hF!s5jDOL4yppFapX0rz3}49DjRe6GUh8hjG*p=$*0qwpCm z=xfD2N!+i;{RZ)!_^*5Jx%aR9)3y(Xx^G|iMf9S|`Un27bN-??M$NKV?tlHye~P{G z)pr-1d3D$5m##nlSwzV*=JInBzPsV+j3;(ajBHx)V(y{u4on*~<81YZcYWu4Jjpp^ z_}Hud{@kofK0JT(zufxbPnJ$=Kz$$kPV^oYWsSZdu)AdM-)@X~@UNwpPU!pe;y7*e zU42KqJz?+=b@=9&{?PNAJEjEA48FSg+7s4jumAA#p2dMju8ey0+d&)lY@MuA1O_xt@yt&)-#C>|?M{$3A`})=A z>rXkpnAW_)a`g+_o^8I{dEwJjd*1fsH}{>hJ-XqWVJGK~d7yd4)9gT0>mt8YrgS4;OrChwd6eA}{T?%MR_hY~4_Iu`s z8!jGGx9f-JBh6dy`s9O`jz4lBqMK`r>(fUZA4S@tPmFc$I(k9;D~G(wf^z_MKym)J@@kQi(i^kbSnMQq0c^cXz;hk`+oM} z!>?a`^o4nU|H^yR^JMD}!{0s`8~won>yWV@6(=n-{qT=T_5P+6W4w;mrW;;&tS-$T zIrxu&f)0xXj%%=OkZs(q8vLTg%~ZhkUZ`pKtGZVET|7 z+OnVd^l;pR`|jR++b7>W^YD?OW8eQ~=eO=FCk(o=*FOt>JiPm-bywm0brX8$#GLK( z<)*Dmrrox2#MGhB<$X4xWcDw!p1Sy(=ij{Q#`ojCvmRN|rN?K*{Ty^Hm$XkzmalH3Ge!6NTjg{ZJB9$1WY-UG} z_xdRcO-`ZLs2D}*8w!HHazN+&?_+(`Sv>&DLTKZcQiVwisU4sv#;@98l1 zOo39JwfhX#iJjs0F!INQsed$t>8zf*F#a$uOg$-)o$GaDn11{m^FwFtei){n>0#Ra zA`Jc&`n@wduM8v4ePQhO8szCr&On%cyda`;{`=rRoyoHxO#fzv8NUe-rZah-4%3f+ z3R8bn82;PC@VAEPFFi~>=fl`1K1~097DnI0*i>|8w_C&5VP#b3_Bj?tueZ8%&R-Bl z9$MCP7Jse|<5x$*)PF9Fe=ddpbf)joFylQtOq^*$9PZ3d_JxUK`@-1ml`wXm6h`0f zVeDKN#tyBJzcYO=3gcIAhp9g@%(y!frrnA#apP;ucb(ZSHOzeB4HG8^hZ*mG2{T_j z6UNRzhVlPRVdT#UW1oA%`0by<_|Mre{kt)YpKK3fpTS}D8UVdIvvXz`yDbVM=jCC> z>Gm-GGa`%~UPV2f$@5egJ1+=R|A%4ttHO+5H{=e!+16;3C0LC?e%_BXOss}lJ5x*&m(21;F+JNKwC%-8-v2|$=C1n=}P%XQ*;a}n} zp3iBRmt8&B{Dt~OqG5!QE4onhw5!k3* zODPAS4!fcRf5kCQFBST(74qbZ#KyPq54zR~d8}e{{*~b034f#dD}0=948JM2vUt)% zN&Pnmg!z)zsY zo-pV{!Qb!{$8G$k>=gZyzncSa19nviyVY&w^v9yz>x3OrgdMU4f2rZ0B0=<_z(275 zTSdQQ2|NXHp72DZVCnk1sNXH*tbC3$4#0d**UP;{J%>1L35gFKNa#@M6ynFk8+x=$9gE0C7jXl=XXTEREqJEBt4;TGdQOkjs1wI)9_fh&O*2P?Yqkaq8CA@eM#|?k}0`>G!dMW9Yn8O7(U{{%t zvs}n@a3VM-O}6K<&7CHT`r_(ur4H68BAztixya~yx0-;@@CSDfd7;m-}Cp7bLe zA1ONKOJO&b{6^6$qMnB#80nk-a7R0A6#iU(5!ZK=;O{MPt4Nf7!Hbm|5r69HIb)je zpKFA^i6Q!4C;Te?JI+t*C%QDlZtrvYX;J?TLe7Se{wfvySP_CZ184qU%Ih)W1DT8P zy7?Uc1HUPoATRTW5Ic+z@v34uXEgeExbWxvHje*Q$az4Fud03=fZ5q~K#VVz+y#Pe zVpqPfL)G`3HvHs6F)l2H9A7NzH;Mi&4)K${!u~0rbN*}iP5Ha1C%u3JuM7O40m43% ze8xq2aJqU4KPmTc`X2(P*J)%o%TpZp^PBRN7++O&9OxqW?-BZ1M0^usDF@IIWaowu zJFge~<*)I241Ws<`=khclSRATgudnbI51tbdz)cT;a4XG{|kr@6tCurc!lQJ^{9~F zx|P%K3p`H56ZY~0*d$T^>%t#WeVoxD_~!~g&kynQMS|aW!IUWY=b)p>p6S9rhYI`& zVTZcsIq+A3my3R>6ajCgz`F|hi)%T6>4RN245Sz}NU;cg1+0A7U--Xxd11^`O~P;M zgx}Kp5xVXX{!^UK>3{H>GCzvfqddj|Lw>igTfXR*3j}|%;4goa1I9e{14yz%`FxH; zY<3M3cF2E@)5g5{zR)*cIMjWD{}D6q-_(%)eOTDdD(v>8;GZt=#04A}4VtcD!Vbl~ zxB;%`uo7#GmrFSQw%~sgB*~wc%NZvL{&L};i90!PkHCiry%L39qXd3~z^x;B{YD(P zT-2|K`VIdn68*?tN}&$p9oQDwf#k_2!{R!C{-f(rF)r%9=d^?0l-mq{5c>tVF}r#T z|4b?6v=Kjlu<-hu#C-Is;O`>rV-YXH#4<&>RrE_rNWTmc@v}k9UnQcR1!5c(@8ST= z$gWw!ubRY5NW(rap_Gjy;XkOBU0ubvYw&W~ScjOz{F3-4$LYNrT_3?d6d$IC$a%Gh zR}~@gs*muKeBmdCJgLHN=}URNQ}|7}QrOuNvM*aF>{<6SXUq}uJYd9uzi`};^Up?q z4d#p(R_r=$;9|ZWE%57w-BQJPG~&bS#`t=HGfoig&J^RT?%y0Y)sTV z0Br0UDdLrq$7y5z_D9h#<-(thc(TFphqavF(D$z}EF0G%z8U;fE#WD`-{1!9Y7_p@ zASTkAg*{gYf367e=huaO8bm)H6ZMQ`aT|v`gdYl6=>weFRYZI+`tf2RXNricW5olP z3w`UBaG+e^lSKVxA@z4bJ!~BqvW{9W^s1wm<+yGUdOarkQ4#ahTv7i87%wEJ@!ic zoAOW2D8iYtL+EQ2^Wbx$o?KB+;sYGmB=CDhyA2ySFiPM~!JjVtP)r-jP@$Jq_ydL~ zyIO@jsa2dd;d#2~JQdk3^*c_ZTiG=e{lM^2P78MBa}if@l7J6aQ8MLDrm{LQht~l!@c! z<>h8g$(S`Si+43hp1uPyo|!atU@ItzaVW^QRe+wp0vWb z83kFh(+czF<#;;aIrH=9Wp#pc{>;4mhdN>Z70kJ3XBB!1@;W}iOXg?XpC#9ml~oj*#%i07=$2cxp{f{GGAeqC!;WDcGj;8$Sy!V zWDfpBLC%~EaAwZS%E&DewFpesGe0kHp23uMf6ly+r`u)EZ^ zdQV7_4?oKBURqAxgIU7L z0$fm#)3GC1m(9(}=wM_|K}K$2PFAib?bkg=yd7XsGt(?>UQTWnlW=Z92jL&gFY>^% z3KjeV-8z(^s1qR{4CN7CWvDFblQn)YzaS^qlg%D{FgvecJ{hb4BNl@-^ZvBVx%a1K zXXJG3Ug;4r&X|Iso}Dv)eqMnmV_xSjZo-fGCzp=j9dhcIMBA z@8@M_8^w&Coi#73Kn~8{<#|I0q&WKdpd<+ZKi9Ky}8I#cn zi|v{sB+Mxc_A6t`&6uCn5y{IJV^LI+b-!#+=8aUsz)(p<_pm2Jm1UqLwalB9OVeUn z&=f}5yrROno%eG#70H4zK<;T4m@{C$^6-)(y$`n!-fd-Oxi+(Zf->Ojrt(1a2B^JSc>vzcP!7$%Y6{jes(sZ7X>(~ zhb2|X?WLGp;JRsPnXD^kr5Tg%{Mn;rDMxoIW#O!#vk<=| zC6Tf`qlH|f)3S0i^JY_vi1WFb8JIvI4x>v6Z zChm~uvU5E789ChbSmVJkkx!kGA*Kovt35XI=*^c}X$3{RbJ^3`S)NQ9zLHoStIy6U zDD)VDvPW{W7Ip**X6NP36TL$127|6qDS(cZQdE_VfmMcJ2tHDjAA-`B>F1jv?R3|L2F6cx400WZiZC=gQ&u~76WD$JTq(?OvT6Mt2}M9whS#V%H@+JjcKuIVYRWD({OhL z0`hq9c!X00c_3P$hXOixC9vcY>-354v{b62V7#%jT{s_3$shy(_)Cz5eVdTwandjy zXACom9l?()Bw@i}P1Ud`C!>dQ=P)q}bESQa2f;KgBOkGg`vFz*Kv5nhM+j>?(GFrc z%Yz3&*hJFftWu)0=I47JN(-{&i&aOkJSUfp8CWL>36;faFsO9FIKI*+U~-mcDxPy> zcrutRKszA?JXFPmJrAoO!8H!Kh>T3cGhz)XbMTHfP}X%cuqoVS%%UMp5GlbV!UBdl zT2b1ASp|iB{~i1;TgEe&&9?K4V2Jivy#p#Q07U_oaI@iiu&~Ic$arDS91LJ4PltMf zvwi`_Tj4xJetD7GfmK>u%QZ`|QG+amfn{VqP?W=_$AUEZaau#oUXUS{uX0HcG^!|o z6ClhpB@E2iSQ*j8z;kkgi#zIrg8B2?SD&Jhf(5hyYG3zYnkmT3OzYh0g1KOJaM9GU zmIVdD0;v|+x{#oQT|gsQkipg|T)^4b>q_K&wg=$af;qDz8QgV{YKXT5!B9*9-!XQ8 z;8MX17-NAGBJnUg$n-!_R#At|EC+%!9Vb0lBO7xcM+zyENJbX?B74@(-T^?m1Z#sL zth0^DNbd7l1$h~>GcyYL$PrawEx_uhr8-vkS(*3G&nV<8T?X;NHP_?eOLn#@&svxt zR7_$j$mV&UcAoh>6Jcyv5Nz`nWEBLrEf`J6>157@Z(zYOKc7Z$4sDkBzhX7Y5Vlss zlnnK9^QeN1V2+LN!GddAx^_8flL`~Uy%|8o|gpTC-vIQC9Y zQLN~#q6>5I#wAM00!Eh!-enWzMEA?d!7Hb3$^!y>_K$zY8@sN`VnO$3M_pM8TC&S{HsIw z^Tm7eh7kN-!QT{u7cb%Rw1(h{z^&rEh0$)Ns3$Q5Z&=FfNeaQM1a6#bH0qga=o`Xc zC*GqP=R6Gl`GUVPgum)>-tOuUJYV2dA$YNPAKnmx7Z~;l!JEp2eL`@H#&JcwXEo%^ z7yQ-`e1WJxDFm-v&g-#0&fl{d^%!(j2wriWi9Jvkg1;{Ch7kO1fj5QV?+aXcqGP+O z1a1kzKM}Y!1g{c!VhFxj;3*;azXhHef`2aX^bq_Df#-+ddjwt_f`23M@(}!xz$-%V z9|c|+f}a+6RS14o;B_JRd4V^C;E_qZznVhu?glR63~>n;Vf~vZ#$za+9|o@sgXass z4Xr0p_+conNcD(N!sICqgDX<~GJi@qTxwV5kCy8H6Kj$GQxgU+lj@iGRjGa%w@CH8 zB-Ni91}_hTr%Lt9^{5j6Q&Rn9Vel#mUnlVwOM1z8oy6ZF@s~^dG9E4A;^-H9N)3b8 zgu$aFedT&A690Kgp42dST^QUV)i2kR^jI9L6^kOAPHDeVB-}W&L#3*O``g)-R0%i! z4hR)bm+*Hb{&Wd9&T>-mTnVSYZ(>~e5^kJPqOye&E{^E1M~WrF=Q!*J=s>hXLYVCE=?iyhg&4rF!Zle73~D zN5b!u@CFJ0Ou}^uUn}9U#c_C1q*IWrV&W2N2zJwcV2*MXi_!k6-t60LZkqBO8 z5{{#1!K+-tar!ZMt&ngWkqcfG5{{$C!Rsvvr+tiZRZ6&Vc9_amOZW!{GwxLqZk)lS z;u;ATQ!;z1PQv>!g#WWg!f_Ndcr{3PQxH`YUBU-Qc$0*SEg36qmGD6lzp|v=Z(}7q zTEgk?5*e38!i_VSR2D1Y7aGjCTP1w3geOS&M-rYW;o^ugD@~Gc`EN3%NVsvfkseSb z{ESq8s)UOrJ}aFr;oBwtbP1Q|*|`#ak;I=b;TKEzLJ99C*|S)}S4;e55`KwZ0zu1ok|B)mz&Pf2*IgfEeBWhvK^V%y~s9xdT3B-|q5-$;0@g#SUptrGsUgeORN zf`lhZ_%I1ilJMaYo+9B_NVqEDS4w!QgkL4$(K3Br+5}q&NV{sal1 zB;kn?ew&0RNx1Rb5h_lR@M99cD&gBCJXON`Npen?@KlLEUBas+e6EDwF5&qSeusoF zl<>(CUM%5LB)m+*r%HIagx@LQDmzm@O?36GchOPBDwCH^J}zemDbC0vo}QI^FqF7p2(i9cGxXGpk3 z!XK3ISP7pg;Z_MhF5w9hey@ZlO88R}o+ROE5}qRA2PIsU@N@}JmGBG+pDy9EBs^Wh zGbMbkgm04YdN%$NIFPCsl!dFQ6A_=dM@VOHHmW01A;gu5p zq=c`Q@Ei%RlJNT^yhg&`knlPQzhA=lNccPnZ;lu7o#9c%Fo}N_d-uE8=|w z`G3BIM@#qv5^j<30tr`3jz+8AEfPVl#lzGG;d(stPt z{A<1>1>cBfJrihX!*$s$MAHZj)G>N2(Gf&fG5UILrlK=w_mO5^ZJl z5u$q$ZDI65qI(mqFnTZ1W}=(U1GsDl(H5c`7+p(rAEN6Ry`Jd4L{~9-4bhZ32~;xr z1ETvAUBT#gh#o+6Iip`8dLYrojDCUWK}6>>`Wd2QiB4zqlSET$Baq7Ir9@LoBap)A zMMMuKI+4)@L{sV^U}f}uL|;U-h0(K!zL;o*(RUL~TlzrLInw_QqOC+XF!~mvDJTc( z7(JHgp+r|P`g)=-CAyN)BZ#K0bfALK!->9(=yFC6CHiuriy3_((SIO1pV57ZP9Qp+ z(cOt2MszBpBZwYObPA)-T0zrRGmyyWW}<0}8L%??2+_2)3|JU_km#$4Rv5jP=xc~> z`i1pB(X=HDG%&iBXxa(}>KMJA=n+I$F?tQrwDk*AGWr9eM-g4Y=y!-7O>{Y2D3HqNr9{(KCy>JEMMTpUCy>bK0-|ZF60kD* zKB8&M5wI|N7ST5otuXp-qG^i}X!@D;KhY^fH!%7ZqU}W2F?uY~V~MU}^z}rKBf65& zBZ#K0K%j!r!-;khUC!vCM2{!Bn9&y!J%Q+aM)xIJB|4qa-HCP)oyzD4qHiHOh0$j( z0ZmKmKq8}?iKeAwltY$r)&1bS=@eqzu$C zdOgv!lnhicdJWOEgbY+N`U9eA=@_VB^gBe;k}*)u=vRooljvebzd$rC5d-;*euijT z(go5P{Up(M5uM8Dr9{&bE0DtIMMTrmDv-$N0-|Y&6tFV-KB8#}6tFOQ7SXiC2`G%d zn`m0X1e(sU{wF$}=mtjLLNqN+0(FcYOEfJ>0#%H@p6E=XD;Yh4=-EV9FnT!AwDbs+ zGkPe|*+dsJ`a+`T5S`EHzC_am6i8=uccOEMPGxii(f1LZ!sxRXgT9~WL`F9gO;dKj z%IG6R(^MU>F!~_TG(`s#M(-t>rshCXE9-xvY3dC$FuIm#nsNhmj9yPPO|^k4Mz0~d zkmyQAe?T-Xr2`d=eurpU$_C0A{R+{vR1Fj}`URpF5S`EHXNX=%bULG-B>EwuQyIOK zXj)PQQW(96=*2`QGP;21hl#c_`aYr`A=<*|Swufdw8H4SiGGaerWV%!L>Cj?!020u zUP5#oqsJ1xl;|o(Ur%%i(UpuIL3An66^tHE^fIE$89kKf$B8ax^o2w}L3BQ&`x0G7 zbULHE6Ri=Q%IFB9pCmek(Pu9L?Ik*q(al6JC)&#BBSia%wlMl2(N7VrFnTZ1PZQmA zn)N@? z{UOnnjQ)V=l|)xC`W>SGMRYl%Umfh)!g50nwilZDsU*M1MxKh0(K!UQ4vX=(~wtM|9IqZEf~x_B-9a1s3~M z`xKY<%T!f6HCgqgO;?v3ogSqqvsG`@WeH$bwbFPMfUQc^_PBlX;#0K#@g)tWYDauj zcUJC*Pf&f1_#{a0x;nzs zr9_X&eqHn1cK8DkZ$-r|OCRyW#-ov6LYs&i{~>*$X) zQhRM^H+x+)Y`dG0t09z9R{uqVJ-T!hHA7akx|3@j>!Eg0ib)pGTozOu?ec%u({|de z&4^FZOX1tB^`aq+!I0FpWeqjQ$|0L`SzA$#cT_wqs+$lFmsJ(rO|2xT%s#5GCu`P{uDNQgxAmkX*V=3rVHVR>XMCQ-Fs%*XV_=j@3p6G$TnZ%fL(lDss>{Z>$~X# z+@`9-T2<|kTGHBkLBz}r*x+vL%Qv{qGus+y{|bJM^DmY7{jHJcE!BTyjB2V=>syQ1 z!vikqM-T7tG|yDE&20zi`Qn>gcupz$gIaP^Hx#2u?U1LZ>b+^~1#yag6_(8UT!e|4 zo4Z)SX!>bGHeFYnFDZqVkhkQfxxMh1=W+=57a`n*Qz8EyfKgXl-ORu=RA9cOnD_&? z;(Pn!<&#x!T7v!tR%WnbWJ#py9@apxeqMgKxvdRlwklpKwQs8`xyEFEwrYc@U)2_% zFQ-{m4TifdwwmRdH?%jXR(B;aFpR5dlqg&ssoXo@zxt5it!njzSmMClD((~rP&Ca# zoyGN^tZL^~?dNqVDACPWV5r^!(^&;ztX8!Y44dhQ38{(qu=&M4#qFCD4I`g}W)q^_ z$qk;7tRKBIk-r#+Pe0YW7%Eukn>Lm}OIxZ14%;?4QT00Mk)ry0X4t|0uC~f~efedh#Q7X3$b1OgzrEi4Xym-eN(lqOHOQ8ZcBo&24-lx7#V&w~h|9csLkkE@c_Hcy+PvDPi6+we>7TXrL*39F1TWTyt&_|@l-sTLOB!D; z7xPy%GtXr7LIPPrMQnyCelnMm6}3}NTN}+;v2Ne&cuQk%^Ce^em#G>oo{>y>n5U?5 z*^i!^4Q-FOwZqH|(6;CT#$!BEv`t0GjCN~D7)B)<6C^oR#Co)DBDjNokf3o3+9i4I zQ{BG2X!69JQ<=za?}F%w$;Zs4w5+B{6jRD6+dejv5{WK}if_D@jT6nU4*QC^DrOZ- zqpH_K<;Q7`Go8~vg@d|o7!qGNexmnU)akj|p)+2C|n++fCie0!Ofmy~9-v z6~cu*i_vcjTv`k3;>Jt3zoUmR7zevbsx2;ULM!o&Ecwyoxtcnd{q=0OhCW8{f~%vC zJ=;RMlFvsIwO02Pw4m|pQBJLEC;eL0_=9YZX)diEvXIo4t9bJe4=D2K zo<5i}B6}k8Bs(qUQd;x6mi&@(3H}=I<6ncI{+_rDs|5IzXFLK)EPRqyF@HEpR-J5d zYY7ma))(-(RCF&v+i7?qR<#?^ey>|=wWra93BSKJ*0w{`lg4^S)We?_4+s07YU$v} z#<=!6t!ktbCZ3w$(yH8%6shm9sKeH~lMkAgIuSZ2!l;n=pj*QlrCJ|~o_CwFVjJJ% z@xCy29jU7CrT7e~FmYVcBTiXMAe%a1b^S96rP?M^6y4^gVW(n%r6d&aFF`51W^5picBou(-UBC1BceYi;(n zX^A9wlH0UFyVwGt$B)4~7 zeBxSKaI<)PT%YkH41~cm2h4b25GGFc?^yP-sfhdaEl*R_E z=|nq8ZtW3^dHHPcvH`D3VXb|A;POthxQFQwOZDZO+U`jBRlBOsiNW1j_K0uD~6}cXH7+c&|9cOXm zV((O?y8 zdT&cmz0<7r)yzM=kD-ea^+~+N3*nCmsurns;m$iQ8qM(fSHqlbShX4R8;@s*44BQ` z+9nYdRE!lC&S>I7C}0~1ZN06^Y5Ng-ji`2eOpKh@6>Eeli<(?l)a+Vvj#_;10op7@ zW6r-n+FVMNOvJP?4oG_qYaa4gX(XHf@l+cp03e_*Q(gwSlab>c`tT(A8dvHkxH(T&4>eg zU8eo|hDL;!mScnuk5*^fL1xxAC2UCCR_OWP<8`0jS)-ZOUfQE*j%r)&4yZu^*jcov3{? zQQO)$kjv@TbXUnHjQN=~#VxSHD-mqTCM5B&ul0A2U_qc&xlDUp$;XQ7s9#aVNeU!z zXsVyZ73^&xHihqD;N8T#-_-2VreWMvnM<$5&Q2^f_P5m$5)UM>hG0y;$z*WshJRvS zhjp>rTL_bnRI$$|*DKiorJD7NA&jc|-KG=h;G%uhPuWQGu=nCC*nMR@Wv9%;K8>%!UGqG=w)y=Nj7qor7V5>&!YnRk5!?lQ(^bEh}q;n#XveY=<_RCQqazs31YlM}N?^V=$Qry@DwXAsg`; z6Q*m}9^FFT;9VY1?IA_blcflXdO~0li7dH6cYjaa-#-44m*V#P-)KrV*FZL<^;f3c z06~JL3~tZMF+C)x809L~hHR#YuvKAC9b^dEA119!LCyMMos5SCFzs=fzqUsb>~#^S zLBj(lqux}E>B$HMsTi)<0b?hPJ1m@<1b?H6W~SU81_H(%asZJO3#P@|w&-tvhsH`; zO&8E+CAy@cr_4WYB=G%^4np=*hs}*u zO>-gRbaX5hfS3XC923cy?~pB^mEC0~+F!S_?1Yg|pgaQKk0Sv_&d6+o8Sx8!Gn=6X znAuZ!5F1h>k$~8iiV$~@+#|3Ss)giZczd5I|E>1!%fB zZ9ylsdOboGx)+Kg5yKNK!DnPWf1=LP_Z}wO4!AU2+tg|I%nXdgV50RB+dmrNZx^h^ z_F5%pOxQ#wm`kH*P0MpUa09p-jo|7Cy6O4Ul6C~UE^H!P+D1JM=0lp!zNGC@Y`4wJ zUV?98K~FidqHEpS4|*=Sj&Jlvqzn);Z9DXd%n?$s)&ls3=$ z)d#3WM=#N3xob(E{h4me)uso zuKny8ttY~Zu@&fv|STfBw;5p`z-|9bpi`pm|_AGja_g9xC=d8*-=psv7Lw32? zw=xH#`~*+b!I6^Cn0_@0sBLg-b1~QFBOp03r5)foGAxv|af$jTj0FpbE`HR@n)mj4 zkiPl`n7I^)d@x2A8$h>)>AHGcG^v8eWA)|xv0PR)U1Wwf(AHoV+s>)lc6sppn+=}7 zk%M{%9R7t&jQ@gxf^ExKtf28D;)Q)?z>Npmt%LYR@!N~w5*owBK9~AO{}R3d!$#h- z0sM=j+bBH4hN*C0ve#)6avKRr?@ur$Y2aDOUgyzy6PNu6lX)IOgP3HUL3$#-h7ws7gwU6T&?5>%skW5GP&mdCc z%QW;pgduHJ<&E!mjF11po_u@{_%jpcciHosj`n1;pEUoirW~T=kN=5Aem&^BBEH_m zglQF-?f-UsT|_a+J7B}vP#0ll!)(gq>!tfdd}YZSk!}5TeEo$SHB5Z9uxKa6*QYVs z?Aj*#l5@X~uj46z^`_zI8$BCI1#*e~wtafz*CcLAf_Ml!X>;ih)F|Q{Pds;gU*hc* zI76E4N66LJLW$1e?H^dUwNPm%;nudV@nvJacG9Lq#8-#bsLw{5i2OZR!?BT z0e;2vJCwgiW`|9Ch$1w4^P~A923eWQG5%KpL>1>?H~9fxEUWrCwIzG!SEAzT$h1PoGr^;abF;%I%{9s)4(??fkYdBqEvpw9;5 zCl6Zf@e?oM6#W>P%6lW^=#|-uUh@qY!rDMYO-FFpto!zoxsaDU!Go$k4=TWW&$Un= zOVPpTFaBbHBG2Sc=tTi-gxuadY+>d@l^;EQRqrEsOK>`IpPm8fq1*sczTJ~VoM8qN zY0+lHQN16OURI@TD5`TK^6Wwfv0V}Ej}ZHRU|pzBf^;mxwCn%d@%l&B`vb0J>inMg zaugP8_dd)|!IvQD{Imp>_C4fz*!LmI|Db=mi@FHYK(+qBmrUPYq%W;W+4~~&BSPsh zeF`fqief25au!5S8bO~jd!tecveJ`=y_vsMgUOf=$Q>r2*Tj6m^E=3Bu{n!R2PH?7 zn5^(ixA(DFde=g`W2AaO-)iBhpICEgKGtroC2jaog<{vXnV%pU`CnCQF)urb@A_kK zyVDyZ5K=rhPzNBViFf3>3US;l*Wrmza9{xgG`9HgIjsFJg1zZ&4JyUpbWkc}Tr}FC zB@bI0y3FIz09>RxDxU0!6xDyKznqO0sT;72!35tJ_1l79I zwq>GrCB0Ng>aa>IMvJJSCGZ-Y+vs0rQJxUQqBlj+7w=>iEd7F*N$)@r*fID^>2W$t zP-Kx+Qd@v)ffu9Vf_w4+cVEweaPT=ymwKL?_N50@) zN{JD20<5ghP)5H+uVT@Ezdjx9&|4n|tue@}QHUgRhyi%~B0d}rNr6Bu_I30HFa8?e z47P8-bE396n4jGmT;CvU@+Hn-_&#f8F2-LzRySAa7j| zteET<5-;7_W(t{nC+OBT=%2FKJD>}D95u)bJY=)Q93EWXA&ql{VskJa(F~#GV^34Wdj5dj{<{IrACXy}({Om5ttCa>Lt zp-Gd{E7Y5a*H@`t^qub(EBrZDytP-gyQ9_Wu{5WESH-ZX6ZvM^8p!z)W2%hSKiEwj zRjm(aLiYOZ1hn)Gm`7fup#pjnhc_*H5BNJtgf%!40BnAwm+8yeJZ7-p#Mr;pUx(xf zVo+mo^gV$E_3iNw@!6MWRhOKrfNY4CKe@fxv6PFr(?Ult#vrYR*2W`+G}g*vGMm>` z@1tn)nEoEQ3$%WKX-#TsNW*Ev8$UPvbqa;0C#iPV4amwBUPQ)lYqPL0j9@6zYq5kCjsjzY2P*LLP_ax8uK(DwDV8Q)A0|n(bPx!>5|; z{v*-j%lez~9r3*uq{SbI6-Z=BRaEkN;$E+Dd6{wy3kbTuenHDulZYcfX5M6 z8&hld^&Do}?caWZ)@;{)YT03r+u(>>?}*v!KouKJ_5LjbpqBRe1mCDwDs72dAL)p% zam1W;n40~yz3h0&t9@y2*=>*e+#Yv2(i6Yc8FSuYYC=nPgdn6TsO(F7+;${m>sZ-o zG-t>53!#h3@Lx6Ni=C|O1RAvC6|D9-D{HaGZAN>0SXt-oef=BlHFVZqHJU_w--m0D zw}n>qPW3zb8|^jyMtdiv_C6;STVRya(A^o+;xL_c`aX?%{-LFJYc*&!rYWw@5!2+r zJW=B?wZg(Mr_;CcTE?+EW_#Rb*xM0v9`<#ZP7~iA7}>vlFqnEXCVxzQ+zCg_8Ccn2 zIzb#d+VXE11df4>qd8`MTrD~hwnkq%d@Cc3_WQ*&QBOkzY8stMk8eebzmlSZ2w(q4 z5sspL(m1RLU4B!9y8kFb!+#V3n*D|qAen51IJDT(!3sMK5nhXWx$&!9@JoHt!5ZKH zM^R4xS`@7&uGZE>qYG=62I>~-T7PXnTb;wy;PkzAEwxHujkX)TVcYI|uM0u8%?{IH zl=n8ubQK;a?-d@uIn_1e~JH8vQ;v==4cGeI4uJq}S9u${sRcGD)Zz_%!36{6@Q zlhmPIW2?8DnqdZQT2F`RD{zR)nJH|wcGDJzX|F@OEgJRPO?3`!LX@=N;J*QVe(O?M7E?AI@HYR#rPck(W6T>rxPSQAWl z+IHOHb6<*ghgjO*O?fHZGKHSni$B-6l)EH}oeoXGb%VTPXHGy~ek(lGL_rQvQ{=wR`f4qJx z+H!l53h-eYMp+YlrNs{|#@}ykYg_#o^dbhwum&87Ge6GG$3bS)iq$`zAj4#j<5(^+ z|M!n)YSBRpKnpHK7mQx8g>WA zu(2U?zyi;MgA@#$0hiubLu;P)^~97lw4Y`P1uWiF--B4*9K{Ok2b^W?;2wDOq+i^E z9nUz+nuSc`am-!)dSpq%m|^QnTCZEsZA}tNhOI}AtKTszma6;pcQ>`Qu_oABe!u=# zqG>QtQUS@9f8$3Ar#G0ux+WcH(Yi0Wr;_TZ z)9WKV-DxRZ9g(d~IA3zm=ycjb*s6n} zFpl)gHj@+J#V7VJKj?36WaG7mN?WtzdJ-xkIoqATs7JfwZ_rhg8~$!yYxddeN?H>i zz07y}+c+9xUc12Ln^aeFCh@Urw7Qs@k~5aaM*I}qPiX7GQ_^aA^h?Hg`xcO#{n2{g z__t%~#JpAgwc>g5=k?IJ4Z~zEihJXpj(acMr{mre z_f*__;I87{9rqO6V{lKxJsS5!+`HkPfO}Wmt+;o=Jr?&U+%33A;vS8A1UpfPQ3li9 z@;R)7FaVX{&mu94)5CC1dVSWoos5@gtK#w1ysCesc~$Lc$0U=bsDJUFhLxZ*lK3 zXBT}q$1P>fuKLCNd%rSgH@z?aKA;STm`XMb)gwT!p~Kr{&KNqv%J+*7?I0qw!*^c{ zBvVToBlNx4{ZGvN(PjG44$SQdlTuVe zyNlIWg;Z+mu@}+&wA$Dh=a0j-1M8i!zLgg*eC@t3V`?$HK4sez-|`-JepIcSHq$=k z1noqyf5ASb)>Mz_v&z4vzv+b2x7@NX-x^OFmRe$ICXOBBea|Kx+x{7A11p|df34XB zj(WVHYN?OgW{*2zj|n(U_29etee=VoNS3X3|Ca7{Q@umm?$EZi?2g+Nw>{>V!?YVr z$-_54F@c!su#a(=wreM}Q!Vw5xNULuF#!jw=lXu*6W=11ubE(4E$Y}2cZzmgM;xXd z4v4&yi80RiULVtQJ*4?yAJ7(98whIGefXDWy z2UeVeG^S(P2_}p^?kE$+ft40Iw24W9ROxu%Yu%q3_s|<`GqekvAtXWLjyPi2qW2`$ zrc9LazLlfnqF1^|o;Y;bP6tj_t;D|5p&i1m5>|~l6*(_{B}w%ut;c6wcJXN;9hnHd z#x_V;${)oB$#l$#m2Ap~DODQV6>&Q`eY1NhknMZB_M^RJm)*Y=`;=35(@Ed*KDXa} z@8uY;B-s%>d&N7|s{-07Q+>-W|CYXvxIib5c0ztF0P#uGlMoedKmsy-26hR2_qKmaPf`N)R+$21 zJ@_H*ZdzYG{tKZx#3Fra2e+Fq?ij2GNr!(Gkv9h~ZcQh7N5LsfaEikuv9=3hGJSeK z=^pO$Z)Y8Z3b$f=M5c?OUCY3+$!FWNW{Bjl9b`g49@7b1t!WoVCR7laC8r;F zLaVhk+m4_Glzb1r7+^OY^{pH+G~;jcwIjA#RA6eh`&P#EOgePVp&jtoT5Jdc2W|DH z?G(KH+ha_-eeVr(99jFCR`0MKz&3~MRYQ%yUa!Ty{rR`IYA3M&!DG~?ebaCKvn#Hy8T;X(6Z?OY(;JB{_R6d*nJh>Fym{%f@1g-TWU7zZZrhDr9jYDv zm$u>K?Ai|h_6zMTJG5HUc0{n4X1lG{iOm~k6GZIVf!OFF;M>r%5M_CfJ?dwcE|Xf{1EHw(Etn!uJo2_j z-^#=E5^VjXp)Lu~qv7zCNbZP+srI^%*87h$y(+i*{1?CZne|Eas&9N()$Bxu$jFKSvQ)pT56z)<}D6Tg-_uIF$b`&#lU{hkh-6IngTxgFPM(J+8e*Mk9X^zbW> zN8_@~T_tVE!=b8UF7u=>A(E@)xJ4g`$8ZYZu>+I@Lgp+HHM0~NrH>T71^vmY*jzNI zF_GDcGFs5*n-B4-yZ*dqu>JIA(;9SwQglcJgY~?q=nx%bSE&CmU*XUQPIP`u`KoG; z#^e8UZF6Zn`<*moBrC_Rw#8FEsx4b9ji&>(`kl}Pru?dm!7Sb7T6gDEe(5zIkn!*b z436Xc*8QI%KCD3fJRd<8NMg>33?RDYxIP?m;U~nd7W}GskLqt7gCAX}zNkCYe`ZCuu@${eC(rED1pXF>UU8@eOW89Rgq~D_5Ee1GDa$K)v(oh#5ZD7*(A@-|F ze%2%L6M|CuGbrG3A?k^Bo;ha2+WhvLS+8~Fz+ zpWdPT7J59JJ?@Z=PO@E1WkXOF%s)`4#CoxzUmxXL(sus*dF-TXE-S|631Gzd7Dbp> zdEyiO0n6LP#ZbZF$6z{(H_@3-K$j}K-i*IiE!iLGKa3pZ8NB0+*-Y4tF`HH2geW!h zw8$^Ga8{tiZ&Lloy4sPRRFnPV&8wm!9A);lqVJG)h`)~7vAKN{qEVIqKy=Ir0&a>q zp=NHu(NmT+@&~$>93JCNMzfd2|##dcE6sTYtIL(Vae8yy&Mg$p})Mu68@CX*0)u%p-a5Y@M88WiI%#{ z%8(SKU#3u-?JC_0l}Id7$;cn0UaDs*tbpG;)5-cDbR9J{zRkx!3pFU=A`t6v#KT6f zUWg~~K1RHGu@v9*)gCJi(eEIi{`mW-&ey+KU9F@n>9^ye4@{s^ac24-V8U;j#5w=S zF3$;i>9eF(b(bYn2`(hQwE@Lch`)cKtuGrFi9d!BT{by_|5*%6*<@tc=?`SYmi6Ob ztYwqC@NWralW{B#g?bVg5=$D)Ws|#k2aH8+B{i0^ab2~#vdJ<2R{WG?Oi4{~*|=zL zmy1xSjq7gysLLRH%htyAM!L~L=cOszig2ZMIr61dk>Y~(!`cW4s$YRw9&`0HI9NP6 zrHRIH9Xz5I{A+2p)w)#Us~!Qy;$9!(YjI#7a-rP5u*n|*v1YU`kK=0~MvgD~4gdVL zDWg*9Y>xl9)mE)v0jJO(MBV0(sv661{vAI!z~MbM>(`)l`blV6`}+~^lx{<`{zxEK zApzN%QgmGP-9AcP;vWT9r+DcddvqlJy21LWkz?ydj;-<6TtYu-NUkk9?C_@HXvQ?k ze|o#&N8lKDWeyGR3+tWQS9FfzE9?Lx;`UN@WNS<<4vEBV^lusLz|o6xhp&{qjK?#} z@n%t5?=M+NGRK&2L5X^k_kfwH5t z{RKNRcn+kSkcNBBNeQg=cC7}wp#IXXy#6|k^r4D3JK_!^59f%S9sd>=bO5h&6Ov>m zWc7piw-VN9*Zly~eHT+} zE3?uu(jTg>bW$>|mdq1k2kl7E1WbP@znaV0uDc$p`$1CY)8C`}5z?LYPk*L}hE$xN zsZC~NDkG}~OIE>|PLTTKPUIMN-|}9rLsCbfC!BGcsCm)v2U+)Qqgs93u2l4HaghU1R))^!)%bC zCt%dkR2!1q$O+m_O*Tr2oFwO`7Pmw&)p?6{pRrNO`wc^lf&^Yb;dKie z9C6JQAE3yUGy+(d>i_kpgP+Ezr|?DZ3rIg`?2KV5CX(j%I8xJz#G?kcU*3y75qDbj zUko|sD5nX5jz$KiAScdl;Y=Q$B&|6&Qkd}77;@Akr>OxU0i%T6&=GT*IGs3+29M>; zIL`;CMV9h#Og-i8(TP$ILL+o8dU^)Bmbwlxomvd` zYC1)E-k+WICDUy-^cU(;w{i`c+?{JV_xEebx)FUS9F>U{bXF(@jhGK%*v`XiKG}Ek zh2t`>#j?imSj0O>Nlxq3bab1CX^1%v9*Y@^xhiT!ewpSGbf}+34!n8GV7M(i;JMHd zhsk{#btZbUCp|)mf6Vwcux^DpAEsG=q{X-$>wC8QZvQNL-GZJ*_;BE@4{Ec~%!y1m zl{q5$Rs}DHF}L9yU1Vu|DHfabme__Vcq@eRA z!SPlRL-2wF(T|jr6r|w6ID#`=qFYc)Di5ApLhm4G5p~J z97WW0w{P(f98biu6^H#Y$IYN$>y)E9etMBgSw7G{Y_lWzl*@NxH-~xrDW`S{Kf%)r zUZ>pq3>;d)^Q!#w z=2Z*Z%GC2^sck7`3x7e%=p3>~MSGFDbPPM?HqFDK!zWK5?{IF6`Elxh%FRYk^yQ`C zI0Vacy1d9&9ZkVsb4fv4>uY#h_*E!=xKl%ayb1R@-0>5r@q2K`U!ED?fV&lU9e4Z? zaC{T)iMY4op2WmVft=AeU6UdNO@*NOZH}^(^JOX|&Htq=6@uzT_(OC1^#K0ljlJZT zG3F=eCr3VKRmq_-ND1+bSVLD8fBFP}7XotAZ;jgY>tDk$vHNF)7z@99^G!1a=%5t+ z!XkLyFyMW;fxM`x&+JMM*x1t*g+sY=NFB^wmDEy`DR`kNpMf;pu_7uC8JDtS32Vx;b;qBiQCwH!~1j&#|GJy$10}{nYFgyhzk{LjGMJGX~!(gu37OQP(Yg^h{ z#VbXm3JGtmkNBukwHhClGX@o37*LttckOfL6=Lu0{rrA^{N@8$=d8W=+Iz3P_S$Q& z{Wz}NWojiRREj_AP;41Sa~;$t|6C;DZCOOAa|Jl&dPpDqJ3-;wen)?dDyxMOwYKo7 z{@8=!Ia-;vU3P4fOmBSv#D;yYv^1Q9WP@ig)wr{UGp2`|V%kpsDfyUwXXljA)e&_( zd1{U9SlrX(KW<&Z{%j-uZZs7;x{vO%`}+IeOZ8^?PuRTg`CID9lj~l)URUSDo}gs- z$e!hH4wiuq?GSyVe@^jQ+SvT(s}!$nAuY4NtQx+vRPr+CFu6A@#U$kZ`k?Il_OWp0*jwqoKdRpJKe2{g=a^ZQ*yM z<0yTi;;Y)m%G)AB5!F8&A5-z5BPUT?-kb~a=FDcP+Gm+f&j}=!4Z^zUU9KF@5_)` zP7RI-mX`1uYOn?xOY~0Z?y~Zjnp?^Kf4lci(O%Ip+}KYn@7pe!6tz`$t9Rtpv|V<~ z)^0iV`qhY|QCGbz?{e=QfAmaMLhqUC05taph|gP{Gmo)UF3!dIuNEtteyR%j4;9<@ zvf_sd{dB}peK({ey?IhS+FnlX6XlW-?xiyi;Z7a#vFtMEH1BGMMO!Zy(Yr%;)hV99 zw5}OO`&I>hFC9I)eAup!bX#}d@qR=Dm(M-Nx>MV6-#L=Z-`Q9D&925L{$o5K=L~W*~Q{gYgSkysY0>8CaAzA(+}$dG1~@Q%1B^ z6)mdvIx4w?9x|*Ie*}g8Pa2K>w!T0S@ycOlE~tuKJw&COMV_eeJ9^K`h&D_sCujdT_rS%+zBH$Qa*oyc^&TmqH$&cR&O1Jcu&(Cx zKX-0rhz4MZJ#dgS;5e=IL39OfbJ**htlEatyk}MVS7%wgr-;e+wd5pi20l%{21yjw z8*dYNlQ^aK!Bo8`+gp|4M|NB!8qMnuYG4ZN_1)*>em~OsKeT@Rwtt^Z{}dWh3aw=c zGT=nj*u19-@g)?%2)JH^BRHV!FAl_d&_e2CFiLNv^Hc?{K-n!LN|kOmA5DkW-o zA=Oj|cw_y~ImH}&jmd(lR6jY0oZ9lt>Qkk|867q*KgMmwve^R`a$IJ#DzuveGwLjf z?{9L$?(6#FVjV~W?$c|(mC`d3$0B*NL=HE?ItJ3N`_Ze|JhfbN#?5>BlcJW??Z;E? zU9a~zZ>+A3P^TZTeK`gG)V)I6s}3iiu`oPPlcC1i5ihGQpSU0Kebh;r3m zgEXqWQ!Non#r|@SAjHnG`(6|_eyU%J%n&3E@H%BO8-NJj0g_?}B!v0D;!;#N|H*9U zQKXqZp*58)#1*R@aGC!Sd5JSnqgmbq^WS5m&Z`UlZs=Ot($ zliwcMrQ?z#=t_e03{?|#0iy3fMW{HH%hryt7h~yPV|Dw-f2qno%Fbh{*R`~vQ7^f6 znOdydxfU$mwZ<*YT!M8oNS*QPaxq=iGJ)R&<^*65j#qn2DoX|nXp z9~*4+$Oa&=zI>PZGzR%4#M0rcuv6t}M!Z1HOyMIcU8W(g(jajT9@QVB2_yxa{{ubM z6*!_6X^p}diK3-&?l?sWqS|X?*U#)(roV>AixN=PNKUD4R1nKxA1o7w7=;U;N_><5 ze6Rw8Qy4PM|A~zg$uE7vypS)4fZ;>eDjN%jZs*D9L^0bouDLs@l#{ zkh@d;du?(_e4$(0d6~BJwfqiOQMd0sC5RrYI=yw==pXD5;esYTNg`ad23TWAH?M6n zF35`MC+ME8?cCMUw(2ZxXU4S96pJlzz`rjwzoTfM_6s(enD-v3-rm*8`m~gv%f{qR z@u#I)HQEz>(G;^=+C19MBdgNJYdeQ6<#=WN%kKK`+}w=&2NYN(gL-BCtH}E7z_3zR z{=Yn-kxZCXc!2QP;{yvWv(5IW*rF9M?L=*7U(p0|4@KZ5ci?k++x^B6e3pBI`bvnl zGqpzBIi===w)247dNBW4xrqWjHR%3F9dfUnjeEi4_glCqEoZgLsPMU!fzRN(op~$; z_n;ZaDazU}#Y*ECSR3;V@~39rywH@(BSpJbJD5F5%|fZCuF8dBeaX4+37FWP|19$a zxu0#&x#Szomh>5YjbS_%C&~X{_>;KRSUDREH3c6pq)3P5DlGBu85RFT-}s%`FSO?S zL5IpBP8umByRe)hcg?@#sjB{y3EEE2e7c=Z;Yw|^M{2#>iYo>2@_%d-$B(x2I6jK{ zm$|r@vBdrLJC&i4e5&L{{dzis>gf|gQ|6~~hAZ#_=V<5mapj*d?7F~_*(tKWfb)st zkITM-PvGbfTtqgflIGd2zz~r+SCS~k^}D+2S_zX8U(NCo=iAe``sB$bsS=WA?t_pI z|H#4D0=WT}p^Y6wOt?p?xvx90CAW}pvD?`Sg9hNno-f?LRge1>>ly#Gmeuq%!+Y{0 z;|cG{{X8XkPfkA4c~p*L&JHY%9qClJ7%8%wm^tvVo!K$Mx5fys`kx6SW65VlwVmuc zMAo$R@^LA@Zmr_Hug$4c$4h!;$kp6O)M}p54#-De{x7vvYC9*}5Wo&+ep~*Ls?f-6 z_jb}-P)S^O|E~L7)_Yj3;tKn(-Tn3&gThjJoV$f1kj6zyGM`lO-I@#jvQFVXmy072 z7f(NK2IKlAU0vwBKUKdz6p55+J1b6j#&GkK*5VUQ8EjT95OYUpE#l+E2P^Fs?ay3{ z=?*Qk?qg%(cH;v|TJsY68`qNvC*;H{&RcclRcoF@K(g~@Dwvbf-wiU!gChrKwdOld zN-bYH)$drxd{cYkbh`f?$1S#{rAqI4e<<0j2JK3l-O7@Q_JpSG{H*A;)kC!>mfBp} z&VA0Jj@4(+F8XZ68GQ1I=&3Djt6x)+EC*eignhC5;igq_%TBiXNvw&Hx(vu&uDk{8{Pj$^ox9O<3qN>Fl*xE zx4J=+H1X)%rD@K0)8GAH4 zy|>6b_7!g$NBiZ<;-wtXKk7Y0c!C1nLH(IBGOLf;Z@h6lT2y+ouocBh}RsrHpCR z^+v1&{Y3mThz|>^6+Z*rf#d!|ecQWjFC9O>jc)IMudrW7zwW49^!#3v5(uUXYp)lX z!P;fErVQ=hv`W?A5odvzlw0U%?f?_zGTM5-?t?M=T`AvQ(lBF=6fVXOv6oF#nVF=_ zx<1tH>q#3FIwY>gUg5#Mzmz$!?+qQl29)N#gG6SROi|9FabrN29M`{}%BEo@B149EJe3Uul}x?7cI zudixH9(b8{O_OdG98~=~2YWV4>|g~tOsM39cSA}7Dcn=#4yG8l-bvG|XLUEBF~-B2 z63h0!r0)7rD?3<~7e{MeE<*$J+ow+>#GDk)Zr#q@!xFxcFjGH;23(^U)NQ`2^9R+D zrs7k^E&1G?-yNz>^S9YF_b$3v$W_ABF3Eo4dVn)j`XjxkKjNI?3YDa>owQQ0`UQdKy*UHK8TP&5<8Z|sZLYNy-x1|I;$?7lV*CjnQmvd8PbC5yUJej}g%yRL z5HSNg`;_-j?dK_aoxq6i{;%J3heke97P{_%Zz-8|)s5=rgF#nJr#ZJ4L$#d$WO~R( zo?K?+|HkHAYxBz81_WfVNxhu^sWvht&wdA_dd{`ut-jNYkV&la5Zc+Ne`Tc?JgVfrpO7^w>tg1;iaq$wWkP+WJ7#~ zRF4I~Z;9X(R$h4mG{GOGI{6+)nYQ)ivVI*^^=;9J62~d5z7mg9r$)p+M6{h8QQ|ly z&Nye$o6*z}ZQWvI&{g!ts(DrQudqG6@fy0(N7hLk33O^(`?ZB_{&&X_&P#@Ut=)U| zgpl_%s|0CVPxHT!nV{r?n`rj*v(h(wE2Mo4_ucoBY@h=>_gRT=(7u-kV7+UU#>s$0? z>~0D^B6$6u=;C+~a`aL)wC1V1&XuJ=i=n?5&qn;(VNvHVl;4G`XZ8I}w0|JYA&CR~ zyAXj`hQ#j&+W4@~`k!Lp#a6_{Ej(A&wrbp$}|o%QeMBPNSvq5DYX{)%pi%V$vXDvRFn zVL1y~#w9*;!g*I5Je+r8#@HlN69y*NE?Pku-!AU+2`i!95xU$O+5N6mr_87$?oO7{S6=1@8FfumgBgz+WT zz9*ErR~51SP}+!Ry86v-H3*I^Ide+}M(>zu@!pm|jKHU|pwU^P%&D9i;o9vqn_nz z=Jt2V5bqOLLGm3YO>4GCbGn+GvOBs?kK51wHn#t}$?pTa2lCM-Ge37AL*-|eYir3w zNn&^>kt7Ep9L=Tcg{qckV2{Xnz=@lxB!}ji7@RU7YeFc)W{$gKY+k;cxJ#Wi_`K5J z?x-v}=6l2G-(__ceXcdj2Z<{K?P0ljrqsV+fSu17wL8q~L?!B@U9SYwTb>bFN}Ka@ zhh=Af5lu9}v!aYBUJBTm^CQ98lP-Rf>(?lPrM%9o!e;S6yj29szNZea~h zasVB{6sDDbCjW|r{A-}lg~x0_rK;_y_iGeS`b(w%CY4^iO5`m(R6wG>A9coW(f8#U zc+7^Xb$5ns&au6lYK|XQOLcAZe)%TY0kcJY9HUHo>mdh($!34rGx5i*=A$wGsPzVl zdLPAMJ|uHPci^~Un!fQ)Vc7@n;Kf%z;IMd6{#DWkeMH@!23<8?>1U#uDrMH-JEiMF z`isx9a~Og8JygWF>)eNe++)|l>wisiX{Y54H~_v)iuU1bG$ptvK~e;^2ZLiAXc^w(z&a!lH_er{VcTNqC0? z_y!QD2Y!PXO-gB_N!#_47{7<`D*QfM_}xdy!`Wy}V0`#`dHX7w0B1nO>dn9pSw^&~Z^urIJ z4&&k@^JDBi5gEqe@$TTLKmAhjJnFsN9XjimJj?%KQQ`y_Q?%kM6?Jdb%2ExnLQUhLrNXUl6h( zt+`b~LA$re95?aJRB2=yNEI>ZkYZ7|kENpdLPr z4Nd($5jr6?po~|o`F1Ite`OvXBJGK()w9{e)RL*{LI)3}l}PUNKPmq$g2tGWQk_m> z5iS;>QGSf0*o^J?7bh<;sZ zq2|NHk?hbX(N7rbhKaM-Fj0Mfd=8qW)5>yl28P78?1` zDsRI{I&*j_u_UD=A@$#c!L)akR9YzkR>EPla#NsUsshL4v!aU6H_&z9bNJp^`SF0j zKEGQbTll&0#M;6idHNsL7TUz~oOoTNvuV;*oV2~Tf|4;4EVC33_YP}X!C2=BbotIx z?ZugTwP*7{(~1G~fKMxn{^_+BkJg&EQz(^)xJO-SmUX_N%HCA*6~g

    ", + ap_get_server_version(), + " Server at server->server_admin) ? "" : "mailto:", + ap_escape_html(r->pool, r->server->server_admin), + "\">", + ap_escape_html(r->pool, ap_get_server_name(r)), + " Port ", sport, + "
    #q=-kf7Y2oIunV*`1i@4sRDnM z_>}^Gl=ys~%sQKhkIzRiFwXYja~BMZpGWO&)Nm4im(ooFpG*7}iBr8BB~Iy^1-^*v z|E|ElN%}hlzKr<)F7TI#|B%4%qcq;9W8n7k{JU4fNqj%0e=czT@EY%zF|ZELORs7; zi9bl`-wAvG`R8qcb3eT=@W&~gOXaxUQo>IXcs}971-_2(5`m8;e@+$nSCpPBaGp08 z3A``qTq2DMG9@4o(;L8c;^OgO^&;51@{=ZPY`vlG( z|NlzhMWp}V0uK{zu1|2D;dS1h1>a5SY-%6dc`D%r0{obagvUq$J8 z0$)h_O9cLPO8W)Q>yog*ucI{n4M_~#uB*sDn*=_T(zgoy1LFUSzz>m~cMCi~XIpZCbv{)9`NB7v_Yok~N;)IZ0-QGX2Cu_S}eD#5>u_|1YJ zpn9(oINv|tZ0MNw++pBo&lb}EVFsPY1^;2Ovi~LnN1ZpR!0iT({3Wzdy^C;cFY2F2{QC_) z`fVlQj|u*0!hd1lyavXs*9;u>ng5xAW0d>eLxtI%ub~KplMUSDk27%8pRd@KHJfm3 zEB;*X)fv@-e<|^O29El?o(UT`>emo|wV{u;ZzcR%gO57N`#S?ioz=v@*T7Bwg9eWL z3DmzoH*k~xih(2lO45IWaP$G%`8wgB2tHrObFnZ4_Wv}hccj2?(=@AyaMtJNP16LQ z*VFS29PQ`lEteQLMw#Ct@E=jV?FNob;pcVR4IHD)|1se_9(K`q*d_RTNdFfGj&}0+ ze9gcy`U3Hf63+U3^Y^9TzeW54svrG~`aIr-8#oqyhxp?OXFv0L=?nwMydt{koGx^} zBAw+1ZjPTC1IK!O)bDEz+~jXEaO7uWLm+G=obB8}_zuAzNI3TcCQ&Cy_5M=uhZ6rc zLjQHb4+%cJsj0$e29EagcFM}6-1y9j6fM=5=e;QL9x!@yCW$J>7zIO+$8{}SQck9?o?mVsm5 z+mt>mbk>qi7Lp)f66@vXD)|PE^7!XF_V4`|O0x{g01_%9Iu6$8ii^7wqmz_Gp05dUMs z@qqdVN#CX|OT_W#T;gRDj>S=DF!2W)IM&PK?KA^NKHE80=(mvmIf9={`hEk)^M#+2 zZ!>VzuOR-n41Hw_t@m~sI9B-ss`q}Ob3Wq|xX!ybKD+9-R`9AZvhCbF?#_LQ2 z$0`p}z3&U1)l{#C9Eg6#dignOfq`Sa%r7AvW%1_=(w`{!*OGpEK^~#BhVCm(O4QcPhL1S#%!#dj|gF29AE%N%~J2 z_F$CnD_<0R^=E-0|9yeyQ@y?Dp(l^?-;(}t!r9Nw)ZQ_If0+1Z894fR82n&3*TB*K zFNxnE^mmbdNbvK>|LYAL^@~s(!fghQ`ooF;BccC$(tlX+CldcT14n&cf4*wqs9!<+ zKMDQ5@p$f6NvB@~Y7J4e{?VaIBZl-}?<5>)k;714931YS(jue+%*7FmSV9 zjv6@XGk*YGpm{vwUpB%p%D{16<^7;Z297#>9xWi8{og@$E)o2vNdGbeM>~t)2g5o8 zM}59e+$8WaIxlV|9P7m;- ze8zE43IpTi)Gj`s7@tgdiKZv{KOy{#40xr$lkLrb^S%$)%kLjW1fQS3tr0kvUoY@W zD1Dv4xja8#=Xx2xOYmDMy(GuWB*TEwK=jX`q^_vQ8KjVD_ z{%aane4oU8#>WW$>%`~#73MQOQ}FpY=Td=xN;>@h2J4(gvWC;5@EA5qK-Do8E}5C#yV`z8o_6KmcuevQV@yM_+p*AR|>%^m~u8SfPMjhbfl!9_3x z<}*G(;J0a-W$qJUy?Y3Uzu>3>>*Qes!h{U?RDtvJ(s>#11p?=Fz(oS*=Z!T2pHKG4 z{U*j&3w}HCug-wC3!I<7-I@WvL*V?L#N7ht=U4wB@F_HYyF;5;wgDR7>DekgE$uKSY=_@e^<3C&mfzaj1FU&jAa@Ol1uRp77Cy!3m4|B>(y zGT?s_IL~AHKZ5GAhv%_A#=aXCEvETrUCec3&l5P$lS>57 z^W-H0zn1hHGT;$`^SsLM9q{=$U!9$nb+h2}dkA+LI9@vPi7)p_d0)H3;G>_}|IZpY z>d<39>(>U3eD>$70_XYv4+d`P@cuTp>jkpYEA|23BD}!B&35sAHS6#^ImzIg?V4fW zsKd{{stnw0*Fu4FyDm0xQ-}9y*&cpA@^yo6+H7TIzXa7tza8rl(IoTe59=pWgoBic8aMa=Rg7-67hxa{O4Zf+f*}(Bq%=??X zKgl{g|KDfuQHS3beb~U!p3(4wf%h9(hxsoXeAMCn#5W8ab$I`R_Z3-(`5xLwVw|r> z`38?Lj_2=V498KPINs=jS$sl+S#A z-dHB^U1StLUuQl)=d2KXex6e$@Uhg7D-9g|b|R%417xSY z`&Kp3AP@Ty{m=F4|BAK?=k=b0LV0)MZ@`uyJG4#DU9@tp$CrSt;= z=lgD6A7M7y$@kqIg3t9H5ICCHY z;q~o8f%l{Ia)A$^bhE%WlRYg0zn$<_f&Vw9HwpYOrMC*4|Fq3^f%AKG4+xyc%`So8 zPxf>OoSzFF5codg9~3y(`?A1!9sZ%fS5x|^z}Hcl+sFOIc6jOhW}Mf1{2epmWFo}i x{X~P0_|Hhc%)s&d<-p&Gvp%1X{Jo>p??eCs^L5Iy9ExC_raio$iI`dM{{m|1U2p&Z literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/.libs/get.o b/rubbos/app/httpd-2.0.64/srclib/pcre/.libs/get.o new file mode 100644 index 0000000000000000000000000000000000000000..ba278d440bcb98a77dc647658c8337fb0c5188bd GIT binary patch literal 11200 zcmbta4Rlo1oxgY9BpC=y0)Y@dY=#eOsAiI27C}Tafxrw#gg_vy!elae3A0RQ;(Q=r z!IlVh#H4!aR@P-pb?r*)$M$pAb?YG&7j$Lq+V;45+_l})ZdXM1D7Jo7y4nB#-v9sQ z%vK9`4NRmIN#qOAH0C>TCcgxv`9P~RliHy+v| zUxeC*+FJ*&8VYTW6fU*57XD!qmN<0fb}@K|497>D)N-pL@w{k_zaK7~flyoJuT`|o zr@i$eTxfy1-?ClD@kmTpcswPl^Xks0 zI|-I>OeJo4ixR1v@c0y`99RQ8U|f@TA?eYIMZRL+J;-VU#l8oDDM3WZdVkgor1JY( z(QmKt2r&tGQS`x9>@@w!T|oLYeF^DuP5&P0Doy`4(g976AYC&VE}}?CWa>2|6|+n; z9>p|i#;cgHW{MQEK{LgQ>ClW%Mj^sZ%}kayFgrCfMPk7HnkiRIPBYV`4I_IrQz;vP z`GRI<$p|n9HB%*bfwck6%#(KjbGK$Lm;E4ipJsycATUQYQ>U1(Yo=Z?Cp6Qbm~U%l zi97~6Piv-8#Wt*&rSgm5=Xp^I<+Jh`!g!uhB0DemaG%Y>YB}< z9=2HtA#*%dg^0|LWp|HdZ~qc&_6xZObHp|qFSC+%O2|VjKgXRPj?2SyF*j@~zqvX; zA?9gNh)>{daGBibIiP@I-xtAGu@4g~_MxlKATGa#S8Qs9K`)QJ1cExVub~dMYTcp1 zcI$oF&XawTXyNpkDC_++v#iCX(|H0{SxOFHq}Ujg)MC z9e`rrNw_Y28^=&cYn62TR*n4}u8R=GAvL}L_s#;nGvzdSxxb>+^3U~8lhaGeXTi2x zBuY!K2MG2ak#IBcRtn31ZRv{A2vnn}3`D>&cF31}R$%9=ke0u+6s07vlcqW<%RqWE zu|<&zWJ}o~+!&;cRG`Mx`Cz9G2K}FfV9SE?hS}Qb6|*B1fzrm=C{$kLn1z)vRt9ru zs`_fP5}ZCN=z$GU(dg(QJL59hP=WFtrQ5*c%p%bM#w%SqP>Wfh?RT51DQTbhfOP|Wk*#1^`LW*`K>*y&j#TF))5#$xHyN)xr z(h+QDGU7m6$gtCO5~UU=&{Aw>@)}1g$|Ui zFCAzHlWvb2C-As&yvH46#pybUIzqh^ZA`xAK%1C!du*G)W7~L-o5+gO;nN-)m(nBZ zkN>lV1ZRdA`(l%bk(kqU5;baT*>R>Hr!gry#+zC;&J>6Bs-w1@$u|hH#D00484k5b z91snQjx)=yieVLO1f2QNN#9P^obD7+Y(k0+OnPbc6pPP`tXOcI`6-0^G``SxoRMln zgR8gJS%({#91ZDKCl(@jJ}gJ8t&GS@2in2pVh3t74ZTCa2h>j$cVZ$7y$^VEV%~9v zM`#$Z-w@v1T9A0<2AqW($hzxyfn9|YVZ zo&hsbe&U}BS9N9wRMzFQnYu(Op3HaKb$gaAjV^7hO(s(LJ+-~5d|g)}mlaARndqwP zjmO7}GzOQkzLq3oLiF0XU>rlw<}!&?@72Mba3dDEz5RApli6H%x7`CY)E4X~(m+}$ z-pyoxJYxf>+9W*#KwD>poUv|bQT^6ywm-Se>#?Faue26Cabume_X%s^#b?+4+b6=~ z_4umr`pZMTD^^~;eB~c2Xt&pcz4g?c_d#`$`iZy>`#KtU^3EO__!+#Vz`y`ruE9$) zUaWlwtw|jNbyo6Mk680xt+3`_oVjlB>N;!Rb&b}(b&n4GJw|ly0EYCS>{0Y}Kp&MI z+aSQ(eL+xv%&NRt;h6*z(VfnBCGBWDoriNPrW@_a*mg9V@6uHh(a6owHIdd9s-hM| zFdN%#N9|O%$nH#MasfQ|YL#Rn3uI!SjinaRbWcy#Cfo6J|6Z4E@bV{iJg0ozo=N2F zXn!svqCLr2Z&vi#eewRiYOE{Y6YYv+ZIRv$;^~YI6y|r-R#bUa35>x-v@e#~WoNR= zP{xjRtC*EwUo4qS$6@NTIrQsfFOun0Z$Mozt0)NV(wJhS-8Li`jps8^wq(99C8GUl zu)jMO!%|Yd(R8w#>3k}i=uO$(f%wi?hN`48jb<}(5smi8x*MTlqavdLII8Hnt}C6( z!EwZn@5cBv>C@+E@oBakF4HVvIIUnl6TjsyTzQYUfK_ zGob1m&8PBNyL$=kA=Ff*(?LVHf8@*yt^k!*G-dCBvS2a|YWkzZT|HV^bG}BG8N||K zLv7Sr8WZ;3gq`fxvjUFWn_H#i@K>7lM81ZrBH0LtWq~o+=Sj+el+soDeXW&TBuo?!cv3 zyK2?7ftvO%*rIuzaP5-3;u;P#GzRM%7i$#Wu$^{)2U94=bzuOBGhcgkM_K?R!6g2{gZn=ku)x8T6xqI&vix2D3Q{rs#Kl$k?x$U8UIAF zqi`oZ%xWkxOb3^Q=^xkRME>tqA0_|r`UCX|8^+}o@9~jyjEptmjA0xTMS}Q56-FHI zDC3(Y)DKVN1}rE0u|t;gghNWPO6B!5u5HFQs+ieIc@f%5prt)2+BV^iGM82FdT*!2efCds!L_z9A4HSl{# zp1*an-&G_RGvxV$S&xC&(5>Y*1D{Oz0R!(Ke$c>MD9*ny@U4WOF!1@rf8W5rLj16S zUru(;8u;79zh>YGivL#zUP5->HSj~k^9L-h=OvP#MD=F;VUp($l8p2F;X*@xKgCmT z;Pr&_Zv$)x-#@XfGvxnW!(yv}&m%kC20nxE+YEd?;Rg(yze64|@a4oGHE@pa8wUOX z@%&+r^WwUkG~{EH*I5JKK=ps!zt+Q4^^Jl{9i?*PfM9^*?$ek%2h$EiMZ47`$f zet%&3qam=l7GR# z_Y?k81HYZ({JDYS^AFoO!cm<_g~P*LHLe@JXJeac;7@5-%rWrK5q^b%Zy~7XJnsXJ=Mj>R(m2Q8NPY(lJAXs?pdsH$_@jnA=lhfkcfXZ=&xPaji|g>L3rG13 z*?-Q3qdeE=tP4kZz7M|Q!cm@ot$4$Qqx=?{_qPoE1;Q`5aJ0kq{LqD?of%ZmOD-Jc zxfRnZEY=_8)qlr8U+Th9{wDatHq(Wp{Oe?Yfq^H<-xV(0dFKMXr7j%p{D9B6xNQwh%)cKH3hV90a*zv9BN{spSbQNzy1 z6wkL@^60mT=h49LC;Z0-{vpMA-oQ)A{v`wF`#--k+K^0=lcH-0tyKv literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/.libs/libpcre.a b/rubbos/app/httpd-2.0.64/srclib/pcre/.libs/libpcre.a new file mode 100644 index 0000000000000000000000000000000000000000..a2d04116329fe08922c941eeee34ffc6f3395289 GIT binary patch literal 213630 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

    xw2+(bvZF0J9z}oq>q1xJd@Th494J8rG152x` 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/.libs/libpcre.la b/rubbos/app/httpd-2.0.64/srclib/pcre/.libs/libpcre.la new file mode 100644 index 00000000..f8f17785 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/.libs/libpcre.la @@ -0,0 +1,35 @@ +# libpcre.la - a libtool library file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='' + +# Names of this library. +library_names='' + +# The name of the static archive. +old_library='libpcre.a' + +# Libraries that this one depends upon. +dependency_libs=' -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib' + +# Version information for libpcre. +current= +age= +revision= + +# Is this an already installed library? +installed=no + +# Should we warn about portability when linking against -modules? +shouldnotlink=no + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='' diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/.libs/maketables.o b/rubbos/app/httpd-2.0.64/srclib/pcre/.libs/maketables.o new file mode 100644 index 0000000000000000000000000000000000000000..9477e1c68e18457b992ff440fb2304c0f1803bd6 GIT binary patch literal 11272 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 Y-=^Vwzvkcnkc*!|;ypk)<2*nA2jr+8&;S4c literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/.libs/study.o b/rubbos/app/httpd-2.0.64/srclib/pcre/.libs/study.o new file mode 100644 index 0000000000000000000000000000000000000000..2c38086a6dcbf01092a7bb164c12144b9e3be1c5 GIT binary patch literal 20776 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 O@oMJn<5Kvt{{I^xDpckG literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/AUTHORS b/rubbos/app/httpd-2.0.64/srclib/pcre/AUTHORS new file mode 100644 index 00000000..832dddca --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/AUTHORS @@ -0,0 +1,6 @@ +Written by: Philip Hazel + +University of Cambridge Computing Service, +Cambridge, England. Phone: +44 1223 334714. + +Copyright (c) 1997-2001 University of Cambridge diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/COPYING b/rubbos/app/httpd-2.0.64/srclib/pcre/COPYING new file mode 100644 index 00000000..8effa664 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/COPYING @@ -0,0 +1,50 @@ +PCRE LICENCE +------------ + +PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + +Written by: Philip Hazel + +University of Cambridge Computing Service, +Cambridge, England. Phone: +44 1223 334714. + +Copyright (c) 1997-2001 University of Cambridge + +Permission is granted to anyone to use this software for any purpose on any +computer system, and to redistribute it freely, subject to the following +restrictions: + +1. This software is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +2. The origin of this software must not be misrepresented, either by + explicit claim or by omission. In practice, this means that if you use + PCRE in software which you distribute to others, commercially or + otherwise, you must put a sentence like this + + Regular expression support is provided by the PCRE library package, + which is open source software, written by Philip Hazel, and copyright + by the University of Cambridge, England. + + somewhere reasonably visible in your documentation and in any relevant + files or online help data or similar. A reference to the ftp site for + the source, that is, to + + ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/ + + should also be given in the documentation. + +3. Altered versions must be plainly marked as such, and must not be + misrepresented as being the original software. + +4. If PCRE is embedded in any software that is released under the GNU + General Purpose Licence (GPL), or Lesser General Purpose Licence (LGPL), + then the terms of that licence shall supersede any condition above with + which it is incompatible. + +The documentation for PCRE, supplied in the "doc" directory, is distributed +under the same terms as the software itself. + +End diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/ChangeLog b/rubbos/app/httpd-2.0.64/srclib/pcre/ChangeLog new file mode 100644 index 00000000..a93f347f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/ChangeLog @@ -0,0 +1,790 @@ +ChangeLog for PCRE +------------------ + +Version 3.0 02-Jan-02 +--------------------- + +1. A bit of extraneous text had somehow crept into the pcregrep documentation. + +2. If --disable-static was given, the building process failed when trying to +build pcretest and pcregrep. (For some reason it was using libtool to compile +them, which is not right, as they aren't part of the library.) + + +Version 3.8 18-Dec-01 +--------------------- + +1. The experimental UTF-8 code was completely screwed up. It was packing the +bytes in the wrong order. How dumb can you get? + + +Version 3.7 29-Oct-01 +--------------------- + +1. In updating pcretest to check change 1 of version 3.6, I screwed up. +This caused pcretest, when used on the test data, to segfault. Unfortunately, +this didn't happen under Solaris 8, where I normally test things. + +2. The Makefile had to be changed to make it work on BSD systems, where 'make' +doesn't seem to recognize that ./xxx and xxx are the same file. (This entry +isn't in ChangeLog distributed with 3.7 because I forgot when I hastily made +this fix an hour or so after the initial 3.7 release.) + + +Version 3.6 23-Oct-01 +--------------------- + +1. Crashed with /(sens|respons)e and \1ibility/ and "sense and sensibility" if +offsets passed as NULL with zero offset count. + +2. The config.guess and config.sub files had not been updated when I moved to +the latest autoconf. + + +Version 3.5 15-Aug-01 +--------------------- + +1. Added some missing #if !defined NOPOSIX conditionals in pcretest.c that +had been forgotten. + +2. By using declared but undefined structures, we can avoid using "void" +definitions in pcre.h while keeping the internal definitions of the structures +private. + +3. The distribution is now built using autoconf 2.50 and libtool 1.4. From a +user point of view, this means that both static and shared libraries are built +by default, but this can be individually controlled. More of the work of +handling this static/shared cases is now inside libtool instead of PCRE's make +file. + +4. The pcretest utility is now installed along with pcregrep because it is +useful for users (to test regexs) and by doing this, it automatically gets +relinked by libtool. The documentation has been turned into a man page, so +there are now .1, .txt, and .html versions in /doc. + +5. Upgrades to pcregrep: + (i) Added long-form option names like gnu grep. + (ii) Added --help to list all options with an explanatory phrase. + (iii) Added -r, --recursive to recurse into sub-directories. + (iv) Added -f, --file to read patterns from a file. + +6. pcre_exec() was referring to its "code" argument before testing that +argument for NULL (and giving an error if it was NULL). + +7. Upgraded Makefile.in to allow for compiling in a different directory from +the source directory. + +8. Tiny buglet in pcretest: when pcre_fullinfo() was called to retrieve the +options bits, the pointer it was passed was to an int instead of to an unsigned +long int. This mattered only on 64-bit systems. + +9. Fixed typo (3.4/1) in pcre.h again. Sigh. I had changed pcre.h (which is +generated) instead of pcre.in, which it its source. Also made the same change +in several of the .c files. + +10. A new release of gcc defines printf() as a macro, which broke pcretest +because it had an ifdef in the middle of a string argument for printf(). Fixed +by using separate calls to printf(). + +11. Added --enable-newline-is-cr and --enable-newline-is-lf to the configure +script, to force use of CR or LF instead of \n in the source. On non-Unix +systems, the value can be set in config.h. + +12. The limit of 200 on non-capturing parentheses is a _nesting_ limit, not an +absolute limit. Changed the text of the error message to make this clear, and +likewise updated the man page. + +13. The limit of 99 on the number of capturing subpatterns has been removed. +The new limit is 65535, which I hope will not be a "real" limit. + + +Version 3.4 22-Aug-00 +--------------------- + +1. Fixed typo in pcre.h: unsigned const char * changed to const unsigned char *. + +2. Diagnose condition (?(0) as an error instead of crashing on matching. + + +Version 3.3 01-Aug-00 +--------------------- + +1. If an octal character was given, but the value was greater than \377, it +was not getting masked to the least significant bits, as documented. This could +lead to crashes in some systems. + +2. Perl 5.6 (if not earlier versions) accepts classes like [a-\d] and treats +the hyphen as a literal. PCRE used to give an error; it now behaves like Perl. + +3. Added the functions pcre_free_substring() and pcre_free_substring_list(). +These just pass their arguments on to (pcre_free)(), but they are provided +because some uses of PCRE bind it to non-C systems that can call its functions, +but cannot call free() or pcre_free() directly. + +4. Add "make test" as a synonym for "make check". Corrected some comments in +the Makefile. + +5. Add $(DESTDIR)/ in front of all the paths in the "install" target in the +Makefile. + +6. Changed the name of pgrep to pcregrep, because Solaris has introduced a +command called pgrep for grepping around the active processes. + +7. Added the beginnings of support for UTF-8 character strings. + +8. Arranged for the Makefile to pass over the settings of CC, CFLAGS, and +RANLIB to ./ltconfig so that they are used by libtool. I think these are all +the relevant ones. (AR is not passed because ./ltconfig does its own figuring +out for the ar command.) + + +Version 3.2 12-May-00 +--------------------- + +This is purely a bug fixing release. + +1. If the pattern /((Z)+|A)*/ was matched agained ZABCDEFG it matched Z instead +of ZA. This was just one example of several cases that could provoke this bug, +which was introduced by change 9 of version 2.00. The code for breaking +infinite loops after an iteration that matches an empty string was't working +correctly. + +2. The pcretest program was not imitating Perl correctly for the pattern /a*/g +when matched against abbab (for example). After matching an empty string, it +wasn't forcing anchoring when setting PCRE_NOTEMPTY for the next attempt; this +caused it to match further down the string than it should. + +3. The code contained an inclusion of sys/types.h. It isn't clear why this +was there because it doesn't seem to be needed, and it causes trouble on some +systems, as it is not a Standard C header. It has been removed. + +4. Made 4 silly changes to the source to avoid stupid compiler warnings that +were reported on the Macintosh. The changes were from + + while ((c = *(++ptr)) != 0 && c != '\n'); +to + while ((c = *(++ptr)) != 0 && c != '\n') ; + +Totally extraordinary, but if that's what it takes... + +5. PCRE is being used in one environment where neither memmove() nor bcopy() is +available. Added HAVE_BCOPY and an autoconf test for it; if neither +HAVE_MEMMOVE nor HAVE_BCOPY is set, use a built-in emulation function which +assumes the way PCRE uses memmove() (always moving upwards). + +6. PCRE is being used in one environment where strchr() is not available. There +was only one use in pcre.c, and writing it out to avoid strchr() probably gives +faster code anyway. + + +Version 3.2 12-May-00 +--------------------- + +This is purely a bug fixing release. + +1. If the pattern /((Z)+|A)*/ was matched agained ZABCDEFG it matched Z instead +of ZA. This was just one example of several cases that could provoke this bug, +which was introduced by change 9 of version 2.00. The code for breaking +infinite loops after an iteration that matches an empty string was't working +correctly. + +2. The pcretest program was not imitating Perl correctly for the pattern /a*/g +when matched against abbab (for example). After matching an empty string, it +wasn't forcing anchoring when setting PCRE_NOTEMPTY for the next attempt; this +caused it to match further down the string than it should. + +3. The code contained an inclusion of sys/types.h. It isn't clear why this +was there because it doesn't seem to be needed, and it causes trouble on some +systems, as it is not a Standard C header. It has been removed. + +4. Made 4 silly changes to the source to avoid stupid compiler warnings that +were reported on the Macintosh. The changes were from + + while ((c = *(++ptr)) != 0 && c != '\n'); +to + while ((c = *(++ptr)) != 0 && c != '\n') ; + +Totally extraordinary, but if that's what it takes... + +5. PCRE is being used in one environment where neither memmove() nor bcopy() is +available. Added HAVE_BCOPY and an autoconf test for it; if neither +HAVE_MEMMOVE nor HAVE_BCOPY is set, use a built-in emulation function which +assumes the way PCRE uses memmove() (always moving upwards). + +6. PCRE is being used in one environment where strchr() is not available. There +was only one use in pcre.c, and writing it out to avoid strchr() probably gives +faster code anyway. + + +Version 3.1 09-Feb-00 +--------------------- + +The only change in this release is the fixing of some bugs in Makefile.in for +the "install" target: + +(1) It was failing to install pcreposix.h. + +(2) It was overwriting the pcre.3 man page with the pcreposix.3 man page. + + +Version 3.0 01-Feb-00 +--------------------- + +1. Add support for the /+ modifier to perltest (to output $` like it does in +pcretest). + +2. Add support for the /g modifier to perltest. + +3. Fix pcretest so that it behaves even more like Perl for /g when the pattern +matches null strings. + +4. Fix perltest so that it doesn't do unwanted things when fed an empty +pattern. Perl treats empty patterns specially - it reuses the most recent +pattern, which is not what we want. Replace // by /(?#)/ in order to avoid this +effect. + +5. The POSIX interface was broken in that it was just handing over the POSIX +captured string vector to pcre_exec(), but (since release 2.00) PCRE has +required a bigger vector, with some working space on the end. This means that +the POSIX wrapper now has to get and free some memory, and copy the results. + +6. Added some simple autoconf support, placing the test data and the +documentation in separate directories, re-organizing some of the +information files, and making it build pcre-config (a GNU standard). Also added +libtool support for building PCRE as a shared library, which is now the +default. + +7. Got rid of the leading zero in the definition of PCRE_MINOR because 08 and +09 are not valid octal constants. Single digits will be used for minor values +less than 10. + +8. Defined REG_EXTENDED and REG_NOSUB as zero in the POSIX header, so that +existing programs that set these in the POSIX interface can use PCRE without +modification. + +9. Added a new function, pcre_fullinfo() with an extensible interface. It can +return all that pcre_info() returns, plus additional data. The pcre_info() +function is retained for compatibility, but is considered to be obsolete. + +10. Added experimental recursion feature (?R) to handle one common case that +Perl 5.6 will be able to do with (?p{...}). + +11. Added support for POSIX character classes like [:alpha:], which Perl is +adopting. + + +Version 2.08 31-Aug-99 +---------------------- + +1. When startoffset was not zero and the pattern began with ".*", PCRE was not +trying to match at the startoffset position, but instead was moving forward to +the next newline as if a previous match had failed. + +2. pcretest was not making use of PCRE_NOTEMPTY when repeating for /g and /G, +and could get into a loop if a null string was matched other than at the start +of the subject. + +3. Added definitions of PCRE_MAJOR and PCRE_MINOR to pcre.h so the version can +be distinguished at compile time, and for completeness also added PCRE_DATE. + +5. Added Paul Sokolovsky's minor changes to make it easy to compile a Win32 DLL +in GnuWin32 environments. + + +Version 2.07 29-Jul-99 +---------------------- + +1. The documentation is now supplied in plain text form and HTML as well as in +the form of man page sources. + +2. C++ compilers don't like assigning (void *) values to other pointer types. +In particular this affects malloc(). Although there is no problem in Standard +C, I've put in casts to keep C++ compilers happy. + +3. Typo on pcretest.c; a cast of (unsigned char *) in the POSIX regexec() call +should be (const char *). + +4. If NOPOSIX is defined, pcretest.c compiles without POSIX support. This may +be useful for non-Unix systems who don't want to bother with the POSIX stuff. +However, I haven't made this a standard facility. The documentation doesn't +mention it, and the Makefile doesn't support it. + +5. The Makefile now contains an "install" target, with editable destinations at +the top of the file. The pcretest program is not installed. + +6. pgrep -V now gives the PCRE version number and date. + +7. Fixed bug: a zero repetition after a literal string (e.g. /abcde{0}/) was +causing the entire string to be ignored, instead of just the last character. + +8. If a pattern like /"([^\\"]+|\\.)*"/ is applied in the normal way to a +non-matching string, it can take a very, very long time, even for strings of +quite modest length, because of the nested recursion. PCRE now does better in +some of these cases. It does this by remembering the last required literal +character in the pattern, and pre-searching the subject to ensure it is present +before running the real match. In other words, it applies a heuristic to detect +some types of certain failure quickly, and in the above example, if presented +with a string that has no trailing " it gives "no match" very quickly. + +9. A new runtime option PCRE_NOTEMPTY causes null string matches to be ignored; +other alternatives are tried instead. + + +Version 2.06 09-Jun-99 +---------------------- + +1. Change pcretest's output for amount of store used to show just the code +space, because the remainder (the data block) varies in size between 32-bit and +64-bit systems. + +2. Added an extra argument to pcre_exec() to supply an offset in the subject to +start matching at. This allows lookbehinds to work when searching for multiple +occurrences in a string. + +3. Added additional options to pcretest for testing multiple occurrences: + + /+ outputs the rest of the string that follows a match + /g loops for multiple occurrences, using the new startoffset argument + /G loops for multiple occurrences by passing an incremented pointer + +4. PCRE wasn't doing the "first character" optimization for patterns starting +with \b or \B, though it was doing it for other lookbehind assertions. That is, +it wasn't noticing that a match for a pattern such as /\bxyz/ has to start with +the letter 'x'. On long subject strings, this gives a significant speed-up. + + +Version 2.05 21-Apr-99 +---------------------- + +1. Changed the type of magic_number from int to long int so that it works +properly on 16-bit systems. + +2. Fixed a bug which caused patterns starting with .* not to work correctly +when the subject string contained newline characters. PCRE was assuming +anchoring for such patterns in all cases, which is not correct because .* will +not pass a newline unless PCRE_DOTALL is set. It now assumes anchoring only if +DOTALL is set at top level; otherwise it knows that patterns starting with .* +must be retried after every newline in the subject. + + +Version 2.04 18-Feb-99 +---------------------- + +1. For parenthesized subpatterns with repeats whose minimum was zero, the +computation of the store needed to hold the pattern was incorrect (too large). +If such patterns were nested a few deep, this could multiply and become a real +problem. + +2. Added /M option to pcretest to show the memory requirement of a specific +pattern. Made -m a synonym of -s (which does this globally) for compatibility. + +3. Subpatterns of the form (regex){n,m} (i.e. limited maximum) were being +compiled in such a way that the backtracking after subsequent failure was +pessimal. Something like (a){0,3} was compiled as (a)?(a)?(a)? instead of +((a)((a)(a)?)?)? with disastrous performance if the maximum was of any size. + + +Version 2.03 02-Feb-99 +---------------------- + +1. Fixed typo and small mistake in man page. + +2. Added 4th condition (GPL supersedes if conflict) and created separate +LICENCE file containing the conditions. + +3. Updated pcretest so that patterns such as /abc\/def/ work like they do in +Perl, that is the internal \ allows the delimiter to be included in the +pattern. Locked out the use of \ as a delimiter. If \ immediately follows +the final delimiter, add \ to the end of the pattern (to test the error). + +4. Added the convenience functions for extracting substrings after a successful +match. Updated pcretest to make it able to test these functions. + + +Version 2.02 14-Jan-99 +---------------------- + +1. Initialized the working variables associated with each extraction so that +their saving and restoring doesn't refer to uninitialized store. + +2. Put dummy code into study.c in order to trick the optimizer of the IBM C +compiler for OS/2 into generating correct code. Apparently IBM isn't going to +fix the problem. + +3. Pcretest: the timing code wasn't using LOOPREPEAT for timing execution +calls, and wasn't printing the correct value for compiling calls. Increased the +default value of LOOPREPEAT, and the number of significant figures in the +times. + +4. Changed "/bin/rm" in the Makefile to "-rm" so it works on Windows NT. + +5. Renamed "deftables" as "dftables" to get it down to 8 characters, to avoid +a building problem on Windows NT with a FAT file system. + + +Version 2.01 21-Oct-98 +---------------------- + +1. Changed the API for pcre_compile() to allow for the provision of a pointer +to character tables built by pcre_maketables() in the current locale. If NULL +is passed, the default tables are used. + + +Version 2.00 24-Sep-98 +---------------------- + +1. Since the (>?) facility is in Perl 5.005, don't require PCRE_EXTRA to enable +it any more. + +2. Allow quantification of (?>) groups, and make it work correctly. + +3. The first character computation wasn't working for (?>) groups. + +4. Correct the implementation of \Z (it is permitted to match on the \n at the +end of the subject) and add 5.005's \z, which really does match only at the +very end of the subject. + +5. Remove the \X "cut" facility; Perl doesn't have it, and (?> is neater. + +6. Remove the ability to specify CASELESS, MULTILINE, DOTALL, and +DOLLAR_END_ONLY at runtime, to make it possible to implement the Perl 5.005 +localized options. All options to pcre_study() were also removed. + +7. Add other new features from 5.005: + + $(?<= positive lookbehind + $(?a*))*/ (a PCRE_EXTRA facility). + + +Version 1.00 18-Nov-97 +---------------------- + +1. Added compile-time macros to support systems such as SunOS4 which don't have +memmove() or strerror() but have other things that can be used instead. + +2. Arranged that "make clean" removes the executables. + + +Version 0.99 27-Oct-97 +---------------------- + +1. Fixed bug in code for optimizing classes with only one character. It was +initializing a 32-byte map regardless, which could cause it to run off the end +of the memory it had got. + +2. Added, conditional on PCRE_EXTRA, the proposed (?>REGEX) construction. + + +Version 0.98 22-Oct-97 +---------------------- + +1. Fixed bug in code for handling temporary memory usage when there are more +back references than supplied space in the ovector. This could cause segfaults. + + +Version 0.97 21-Oct-97 +---------------------- + +1. Added the \X "cut" facility, conditional on PCRE_EXTRA. + +2. Optimized negated single characters not to use a bit map. + +3. Brought error texts together as macro definitions; clarified some of them; +fixed one that was wrong - it said "range out of order" when it meant "invalid +escape sequence". + +4. Changed some char * arguments to const char *. + +5. Added PCRE_NOTBOL and PCRE_NOTEOL (from POSIX). + +6. Added the POSIX-style API wrapper in pcreposix.a and testing facilities in +pcretest. + + +Version 0.96 16-Oct-97 +---------------------- + +1. Added a simple "pgrep" utility to the distribution. + +2. Fixed an incompatibility with Perl: "{" is now treated as a normal character +unless it appears in one of the precise forms "{ddd}", "{ddd,}", or "{ddd,ddd}" +where "ddd" means "one or more decimal digits". + +3. Fixed serious bug. If a pattern had a back reference, but the call to +pcre_exec() didn't supply a large enough ovector to record the related +identifying subpattern, the match always failed. PCRE now remembers the number +of the largest back reference, and gets some temporary memory in which to save +the offsets during matching if necessary, in order to ensure that +backreferences always work. + +4. Increased the compatibility with Perl in a number of ways: + + (a) . no longer matches \n by default; an option PCRE_DOTALL is provided + to request this handling. The option can be set at compile or exec time. + + (b) $ matches before a terminating newline by default; an option + PCRE_DOLLAR_ENDONLY is provided to override this (but not in multiline + mode). The option can be set at compile or exec time. + + (c) The handling of \ followed by a digit other than 0 is now supposed to be + the same as Perl's. If the decimal number it represents is less than 10 + or there aren't that many previous left capturing parentheses, an octal + escape is read. Inside a character class, it's always an octal escape, + even if it is a single digit. + + (d) An escaped but undefined alphabetic character is taken as a literal, + unless PCRE_EXTRA is set. Currently this just reserves the remaining + escapes. + + (e) {0} is now permitted. (The previous item is removed from the compiled + pattern). + +5. Changed all the names of code files so that the basic parts are no longer +than 10 characters, and abolished the teeny "globals.c" file. + +6. Changed the handling of character classes; they are now done with a 32-byte +bit map always. + +7. Added the -d and /D options to pcretest to make it possible to look at the +internals of compilation without having to recompile pcre. + + +Version 0.95 23-Sep-97 +---------------------- + +1. Fixed bug in pre-pass concerning escaped "normal" characters such as \x5c or +\x20 at the start of a run of normal characters. These were being treated as +real characters, instead of the source characters being re-checked. + + +Version 0.94 18-Sep-97 +---------------------- + +1. The functions are now thread-safe, with the caveat that the global variables +containing pointers to malloc() and free() or alternative functions are the +same for all threads. + +2. Get pcre_study() to generate a bitmap of initial characters for non- +anchored patterns when this is possible, and use it if passed to pcre_exec(). + + +Version 0.93 15-Sep-97 +---------------------- + +1. /(b)|(:+)/ was computing an incorrect first character. + +2. Add pcre_study() to the API and the passing of pcre_extra to pcre_exec(), +but not actually doing anything yet. + +3. Treat "-" characters in classes that cannot be part of ranges as literals, +as Perl does (e.g. [-az] or [az-]). + +4. Set the anchored flag if a branch starts with .* or .*? because that tests +all possible positions. + +5. Split up into different modules to avoid including unneeded functions in a +compiled binary. However, compile and exec are still in one module. The "study" +function is split off. + +6. The character tables are now in a separate module whose source is generated +by an auxiliary program - but can then be edited by hand if required. There are +now no calls to isalnum(), isspace(), isdigit(), isxdigit(), tolower() or +toupper() in the code. + +7. Turn the malloc/free funtions variables into pcre_malloc and pcre_free and +make them global. Abolish the function for setting them, as the caller can now +set them directly. + + +Version 0.92 11-Sep-97 +---------------------- + +1. A repeat with a fixed maximum and a minimum of 1 for an ordinary character +(e.g. /a{1,3}/) was broken (I mis-optimized it). + +2. Caseless matching was not working in character classes if the characters in +the pattern were in upper case. + +3. Make ranges like [W-c] work in the same way as Perl for caseless matching. + +4. Make PCRE_ANCHORED public and accept as a compile option. + +5. Add an options word to pcre_exec() and accept PCRE_ANCHORED and +PCRE_CASELESS at run time. Add escapes \A and \I to pcretest to cause it to +pass them. + +6. Give an error if bad option bits passed at compile or run time. + +7. Add PCRE_MULTILINE at compile and exec time, and (?m) as well. Add \M to +pcretest to cause it to pass that flag. + +8. Add pcre_info(), to get the number of identifying subpatterns, the stored +options, and the first character, if set. + +9. Recognize C+ or C{n,m} where n >= 1 as providing a fixed starting character. + + +Version 0.91 10-Sep-97 +---------------------- + +1. PCRE was failing to diagnose unlimited repeats of subpatterns that could +match the empty string as in /(a*)*/. It was looping and ultimately crashing. + +2. PCRE was looping on encountering an indefinitely repeated back reference to +a subpattern that had matched an empty string, e.g. /(a|)\1*/. It now does what +Perl does - treats the match as successful. + +**** diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/INSTALL b/rubbos/app/httpd-2.0.64/srclib/pcre/INSTALL new file mode 100644 index 00000000..08802812 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/INSTALL @@ -0,0 +1,185 @@ +Basic Installation +================== + + These are generic installation instructions that apply to systems that +can run the `configure' shell script - Unix systems and any that imitate +it. They are not specific to PCRE. There are PCRE-specific instructions +for non-Unix systems in the file NON-UNIX-USE. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, a file +`config.cache' that saves the results of its tests to speed up +reconfiguring, and a file `config.log' containing compiler output +(useful mainly for debugging `configure'). + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If at some point `config.cache' +contains results you don't want to keep, you may remove or edit it. + + The file `configure.in' is used to create `configure' by a program +called `autoconf'. You only need `configure.in' if you want to change +it or regenerate `configure' using a newer version of `autoconf'. + +The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. If you're + using `csh' on an old version of System V, you might need to type + `sh ./configure' instead to prevent `csh' from trying to execute + `configure' itself. + + Running `configure' takes awhile. While running, it prints some + messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package. + + 4. Type `make install' to install the programs and any data files and + documentation. + + 5. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + +Compilers and Options +===================== + + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. You can give `configure' +initial values for variables by setting them in the environment. Using +a Bourne-compatible shell, you can do that on the command line like +this: + CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure + +Or on systems that have the `env' program, you can do it like this: + env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure + +Compiling For Multiple Architectures +==================================== + + You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you must use a version of `make' that +supports the `VPATH' variable, such as GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. + + If you have to use a `make' that does not supports the `VPATH' +variable, you have to compile the package for one architecture at a time +in the source code directory. After you have installed the package for +one architecture, use `make distclean' before reconfiguring for another +architecture. + +Installation Names +================== + + By default, `make install' will install the package's files in +`/usr/local/bin', `/usr/local/man', etc. You can specify an +installation prefix other than `/usr/local' by giving `configure' the +option `--prefix=PATH'. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +give `configure' the option `--exec-prefix=PATH', the package will use +PATH as the prefix for installing programs and libraries. +Documentation and other data files will still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=PATH' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + +Optional Features +================= + + Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + +Specifying the System Type +========================== + + There may be some features `configure' can not figure out +automatically, but needs to determine by the type of host the package +will run on. Usually `configure' can figure that out, but if it prints +a message saying it can not guess the host type, give it the +`--host=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name with three fields: + CPU-COMPANY-SYSTEM + +See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the host type. + + If you are building compiler tools for cross-compiling, you can also +use the `--target=TYPE' option to select the type of system they will +produce code for and the `--build=TYPE' option to select the type of +system on which you are compiling the package. + +Sharing Defaults +================ + + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Operation Controls +================== + + `configure' recognizes the following options to control how it +operates. + +`--cache-file=FILE' + Use and save the results of the tests in FILE instead of + `./config.cache'. Set FILE to `/dev/null' to disable caching, for + debugging `configure'. + +`--help' + Print a summary of the options to `configure', and exit. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`--version' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`configure' also accepts some other, not widely useful, options. diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/LICENCE b/rubbos/app/httpd-2.0.64/srclib/pcre/LICENCE new file mode 100644 index 00000000..8effa664 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/LICENCE @@ -0,0 +1,50 @@ +PCRE LICENCE +------------ + +PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + +Written by: Philip Hazel + +University of Cambridge Computing Service, +Cambridge, England. Phone: +44 1223 334714. + +Copyright (c) 1997-2001 University of Cambridge + +Permission is granted to anyone to use this software for any purpose on any +computer system, and to redistribute it freely, subject to the following +restrictions: + +1. This software is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +2. The origin of this software must not be misrepresented, either by + explicit claim or by omission. In practice, this means that if you use + PCRE in software which you distribute to others, commercially or + otherwise, you must put a sentence like this + + Regular expression support is provided by the PCRE library package, + which is open source software, written by Philip Hazel, and copyright + by the University of Cambridge, England. + + somewhere reasonably visible in your documentation and in any relevant + files or online help data or similar. A reference to the ftp site for + the source, that is, to + + ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/ + + should also be given in the documentation. + +3. Altered versions must be plainly marked as such, and must not be + misrepresented as being the original software. + +4. If PCRE is embedded in any software that is released under the GNU + General Purpose Licence (GPL), or Lesser General Purpose Licence (LGPL), + then the terms of that licence shall supersede any condition above with + which it is incompatible. + +The documentation for PCRE, supplied in the "doc" directory, is distributed +under the same terms as the software itself. + +End diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/Makefile b/rubbos/app/httpd-2.0.64/srclib/pcre/Makefile new file mode 100644 index 00000000..218b9ccd --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/Makefile @@ -0,0 +1,25 @@ +top_srcdir = /bottlenecks/rubbos/app/httpd-2.0.64 +top_builddir = /bottlenecks/rubbos/app/httpd-2.0.64 +srcdir = /bottlenecks/rubbos/app/httpd-2.0.64/srclib/pcre +builddir = /bottlenecks/rubbos/app/httpd-2.0.64/srclib/pcre +VPATH = /bottlenecks/rubbos/app/httpd-2.0.64/srclib/pcre +LTLIBRARY_NAME = libpcre.la +LTLIBRARY_SOURCES = maketables.c get.c study.c pcre.c pcreposix.c + +CLEAN_TARGETS = dftables chartables.c +DISTCLEAN_TARGETS = pcre.h pcre-config config.h config.log config.status $(CLEAN_TARGETS) + +include $(top_srcdir)/build/ltlib.mk + +config.h: + touch $@ + +$(LTLIBRARY_OBJECTS) dftables.lo: config.h + +dftables: dftables.lo + $(LINK) $(EXTRA_LDFLAGS) dftables.lo $(EXTRA_LIBS) + +$(srcdir)/chartables.c: dftables + ./dftables > $@ + +pcre.lo: $(srcdir)/chartables.c diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/Makefile.in b/rubbos/app/httpd-2.0.64/srclib/pcre/Makefile.in new file mode 100644 index 00000000..357ce6e2 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/Makefile.in @@ -0,0 +1,20 @@ +LTLIBRARY_NAME = libpcre.la +LTLIBRARY_SOURCES = maketables.c get.c study.c pcre.c pcreposix.c + +CLEAN_TARGETS = dftables chartables.c +DISTCLEAN_TARGETS = pcre.h pcre-config config.h config.log config.status $(CLEAN_TARGETS) + +include $(top_srcdir)/build/ltlib.mk + +config.h: + touch $@ + +$(LTLIBRARY_OBJECTS) dftables.lo: config.h + +dftables: dftables.lo + $(LINK) $(EXTRA_LDFLAGS) dftables.lo $(EXTRA_LIBS) + +$(srcdir)/chartables.c: dftables + ./dftables > $@ + +pcre.lo: $(srcdir)/chartables.c diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/NEWS b/rubbos/app/httpd-2.0.64/srclib/pcre/NEWS new file mode 100644 index 00000000..27866b68 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/NEWS @@ -0,0 +1,85 @@ +News about PCRE releases +------------------------ + +Release 3.5 15-Aug-01 +--------------------- + +1. The configuring system has been upgraded to use later versions of autoconf +and libtool. By default it builds both a shared and a static library if the OS +supports it. You can use --disable-shared or --disable-static on the configure +command if you want only one of them. + +2. The pcretest utility is now installed along with pcregrep because it is +useful for users (to test regexs) and by doing this, it automatically gets +relinked by libtool. The documentation has been turned into a man page, so +there are now .1, .txt, and .html versions in /doc. + +3. Upgrades to pcregrep: + (i) Added long-form option names like gnu grep. + (ii) Added --help to list all options with an explanatory phrase. + (iii) Added -r, --recursive to recurse into sub-directories. + (iv) Added -f, --file to read patterns from a file. + +4. Added --enable-newline-is-cr and --enable-newline-is-lf to the configure +script, to force use of CR or LF instead of \n in the source. On non-Unix +systems, the value can be set in config.h. + +5. The limit of 200 on non-capturing parentheses is a _nesting_ limit, not an +absolute limit. Changed the text of the error message to make this clear, and +likewise updated the man page. + +6. The limit of 99 on the number of capturing subpatterns has been removed. +The new limit is 65535, which I hope will not be a "real" limit. + + +Release 3.3 01-Aug-00 +--------------------- + +There is some support for UTF-8 character strings. This is incomplete and +experimental. The documentation describes what is and what is not implemented. +Otherwise, this is just a bug-fixing release. + + +Release 3.0 01-Feb-00 +--------------------- + +1. A "configure" script is now used to configure PCRE for Unix systems. It +builds a Makefile, a config.h file, and the pcre-config script. + +2. PCRE is built as a shared library by default. + +3. There is support for POSIX classes such as [:alpha:]. + +5. There is an experimental recursion feature. + +---------------------------------------------------------------------------- + IMPORTANT FOR THOSE UPGRADING FROM VERSIONS BEFORE 2.00 + +Please note that there has been a change in the API such that a larger +ovector is required at matching time, to provide some additional workspace. +The new man page has details. This change was necessary in order to support +some of the new functionality in Perl 5.005. + + IMPORTANT FOR THOSE UPGRADING FROM VERSION 2.00 + +Another (I hope this is the last!) change has been made to the API for the +pcre_compile() function. An additional argument has been added to make it +possible to pass over a pointer to character tables built in the current +locale by pcre_maketables(). To use the default tables, this new arguement +should be passed as NULL. + + IMPORTANT FOR THOSE UPGRADING FROM VERSION 2.05 + +Yet another (and again I hope this really is the last) change has been made +to the API for the pcre_exec() function. An additional argument has been +added to make it possible to start the match other than at the start of the +subject string. This is important if there are lookbehinds. The new man +page has the details, but you just want to convert existing programs, all +you need to do is to stick in a new fifth argument to pcre_exec(), with a +value of zero. For example, change + + pcre_exec(pattern, extra, subject, length, options, ovec, ovecsize) +to + pcre_exec(pattern, extra, subject, length, 0, options, ovec, ovecsize) + +**** diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/NON-UNIX-USE b/rubbos/app/httpd-2.0.64/srclib/pcre/NON-UNIX-USE new file mode 100644 index 00000000..14b1cc0d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/NON-UNIX-USE @@ -0,0 +1,53 @@ +Compiling PCRE on non-Unix systems +---------------------------------- + +If you want to compile PCRE for a non-Unix system, note that it consists +entirely of code written in Standard C, and so should compile successfully +on any machine with a Standard C compiler and library, using normal compiling +commands to do the following: + +(1) Copy or rename the file config.in as config.h, and change the macros that +define HAVE_STRERROR and HAVE_MEMMOVE to define them as 1 rather than 0. +Unfortunately, because of the way Unix autoconf works, the default setting has +to be 0. You may also want to make changes to other macros in config.h. In +particular, if you want to force a specific value for newline, you can define +the NEWLINE macro. The default is to use '\n', thereby using whatever value +your compiler gives to '\n'. + +(2) Copy or rename the file pcre.in as pcre.h, and change the macro definitions +for PCRE_MAJOR, PCRE_MINOR, and PCRE_DATE near its start to the values set in +configure.in. + +(3) Compile dftables.c as a stand-alone program, and then run it with +the standard output sent to chartables.c. This generates a set of standard +character tables. + +(4) Compile maketables.c, get.c, study.c and pcre.c and link them all +together into an object library in whichever form your system keeps such +libraries. This is the pcre library (chartables.c gets included by means of an +#include directive). + +(5) Similarly, compile pcreposix.c and link it as the pcreposix library. + +(6) Compile the test program pcretest.c. This needs the functions in the +pcre and pcreposix libraries when linking. + +(7) Run pcretest on the testinput files in the testdata directory, and check +that the output matches the corresponding testoutput files. You must use the +-i option when checking testinput2. + +If you have a system without "configure" but where you can use a Makefile, edit +Makefile.in to create Makefile, substituting suitable values for the variables +at the head of the file. + +Some help in building a Win32 DLL of PCRE in GnuWin32 environments was +contributed by Paul.Sokolovsky@technologist.com. These environments are +Mingw32 (http://www.xraylith.wisc.edu/~khan/software/gnu-win32/) and +CygWin (http://sourceware.cygnus.com/cygwin/). Paul comments: + + For CygWin, set CFLAGS=-mno-cygwin, and do 'make dll'. You'll get + pcre.dll (containing pcreposix also), libpcre.dll.a, and dynamically + linked pgrep and pcretest. If you have /bin/sh, run RunTest (three + main test go ok, locale not supported). + +**** diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/NWGNUmakefile b/rubbos/app/httpd-2.0.64/srclib/pcre/NWGNUmakefile new file mode 100644 index 00000000..e87a5eff --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/NWGNUmakefile @@ -0,0 +1,267 @@ +# +# NWGNUmakefile for DfTables.nlm (Apache2) +# Declare the sub-directories to be built here +# + +SUBDIRS = \ + $(EOLIST) + +# +# Get the 'head' of the build environment. This includes default targets and +# paths to tools +# + +include $(APR_WORK)\build\NWGNUhead.inc + +PCRE = $(AP_WORK)/srclib/pcre + +# +# build this level's files + +FILES_prebuild_headers = \ + $(PCRE)/config.h \ + $(PCRE)/pcre.h \ + $(EOLIST) + +$(PCRE)/%.h: $(subst /,\,$(PCRE))\%.hw + @echo Creating $(subst /,\,$@) + copy $< $(subst /,\,$(PCRE))\$(@F) + +# +# Make sure all needed macro's are defined +# + +# +# These directories will be at the beginning of the include list, followed by +# INCDIRS +# +XINCDIRS += \ + $(AP_WORK)/os/netware \ + $(APR_WORK)/include/arch/netware \ + $(EOLIST) + +# +# These flags will come after CFLAGS +# +XCFLAGS += \ + $(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 = dftables + +# +# This is used by the link '-desc ' directive. +# If left blank, NLM_NAME will be used. +# +NLM_DESCRIPTION = Generate character tables + +#$(FILES_prebuild_headers) +# This is used by the '-threadname' directive. If left blank, +# NLM_NAME Thread will be used. +# +NLM_THREAD_NAME = dftables + +# +# If this is specified, it will override VERSION value in +# $(APR_WORK)\build\NWGNUenvironment.inc +# +NLM_VERSION = 1,0,0 + +# +# If this is specified, it will override the default of 64K +# +NLM_STACK_SIZE = 8192 + +# +# If this is specified it will be used by the link '-entry' directive +# +NLM_ENTRY_SYM =_LibCPrelude + +# +# If this is specified it will be used by the link '-exit' directive +# +NLM_EXIT_SYM =_LibCPostlude + +# +# If this is specified it will be used by the link '-check' directive +# +NLM_CHECK_SYM = + +# +# If this is 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 $(APR)/misc/netware/apr.xdc. XDCData can +# be disabled by setting APACHE_UNIPROC in the environment +# +XDCDATA = + +# +# Declare all target files (you must add your files here) +# + +# +# If there is an NLM target, put it here +# +TARGET_nlm = \ +$(OBJDIR)/dftables.nlm \ + $(EOLIST) + +# +# If there is an LIB target, put it here +# +TARGET_lib = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the NLM target above. +# Paths must all use the '/' character +# +FILES_nlm_objs = \ + $(FILES_prebuild_headers) \ + $(OBJDIR)/dftables.o \ + $(EOLIST) + +# +# 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 = \ + libcpre.o \ + $(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 = \ + 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 = \ + @libc.imp \ + $(EOLIST) + +# +# Any symbols exported to here +# +FILES_nlm_exports = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the LIB target above. +# Paths must all use the '/' character +# +FILES_lib_objs = \ + $(EOLIST) + +# +# 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 $(APR_WORK)\build\NWGNUhead.inc for examples) +# +install :: nlms FORCE + +# +# Any specialized rules here +# + + +# +# Include the 'tail' makefile that has targets that depend on variables defined +# in this makefile +# + +include $(APR_WORK)\build\NWGNUtail.inc + +# End of NWGNUmakefile for DfTables.nlm (Apache2) diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/README b/rubbos/app/httpd-2.0.64/srclib/pcre/README new file mode 100644 index 00000000..75573747 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/README @@ -0,0 +1,307 @@ +README file for PCRE (Perl-compatible regular expression library) +----------------------------------------------------------------- + +The latest release of PCRE is always available from + + ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-xxx.tar.gz + +Please read the NEWS file if you are upgrading from a previous release. + +PCRE has its own native API, but a set of "wrapper" functions that are based on +the POSIX API are also supplied in the library libpcreposix. Note that this +just provides a POSIX calling interface to PCRE: the regular expressions +themselves still follow Perl syntax and semantics. The header file +for the POSIX-style functions is called pcreposix.h. The official POSIX name is +regex.h, but I didn't want to risk possible problems with existing files of +that name by distributing it that way. To use it with an existing program that +uses the POSIX API, it will have to be renamed or pointed at by a link. + + +Contributions by users of PCRE +------------------------------ + +You can find contributions from PCRE users in the directory + + ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/Contrib + +where there is also a README file giving brief descriptions of what they are. +Several of them provide support for compiling PCRE on various flavours of +Windows systems (I myself do not use Windows). Some are complete in themselves; +others are pointers to URLs containing relevant files. + + +Building PCRE on a Unix system +------------------------------ + +To build PCRE on a Unix system, first run the "configure" command from the PCRE +distribution directory, with your current directory set to the directory where +you want the files to be created. This command is a standard GNU "autoconf" +configuration script, for which generic instructions are supplied in INSTALL. + +Most commonly, people build PCRE within its own distribution directory, and in +this case, on many systems, just running "./configure" is sufficient, but the +usual methods of changing standard defaults are available. For example, + +CFLAGS='-O2 -Wall' ./configure --prefix=/opt/local + +specifies that the C compiler should be run with the flags '-O2 -Wall' instead +of the default, and that "make install" should install PCRE under /opt/local +instead of the default /usr/local. + +If you want to build in a different directory, just run "configure" with that +directory as current. For example, suppose you have unpacked the PCRE source +into /source/pcre/pcre-xxx, but you want to build it in /build/pcre/pcre-xxx: + +cd /build/pcre/pcre-xxx +/source/pcre/pcre-xxx/configure + +If you want to make use of the experimential, incomplete support for UTF-8 +character strings in PCRE, you must add --enable-utf8 to the "configure" +command. Without it, the code for handling UTF-8 is not included in the +library. (Even when included, it still has to be enabled by an option at run +time.) + +The "configure" script builds five files: + +. libtool is a script that builds shared and/or static libraries +. Makefile is built by copying Makefile.in and making substitutions. +. config.h is built by copying config.in and making substitutions. +. pcre-config is built by copying pcre-config.in and making substitutions. +. RunTest is a script for running tests + +Once "configure" has run, you can run "make". It builds two libraries called +libpcre and libpcreposix, a test program called pcretest, and the pcregrep +command. You can use "make install" to copy these, the public header files +pcre.h and pcreposix.h, and the man pages to appropriate live directories on +your system, in the normal way. + +Running "make install" also installs the command pcre-config, which can be used +to recall information about the PCRE configuration and installation. For +example, + + pcre-config --version + +prints the version number, and + + pcre-config --libs + +outputs information about where the library is installed. This command can be +included in makefiles for programs that use PCRE, saving the programmer from +having to remember too many details. + +There is one esoteric feature that is controlled by "configure". It concerns +the character value used for "newline", and is something that you probably do +not want to change on a Unix system. The default is to use whatever value your +compiler gives to '\n'. By using --enable-newline-is-cr or +--enable-newline-is-lf you can force the value to be CR (13) or LF (10) if you +really want to. + + +Shared libraries on Unix systems +-------------------------------- + +The default distribution builds PCRE as two shared libraries and two static +libraries, as long as the operating system supports shared libraries. Shared +library support relies on the "libtool" script which is built as part of the +"configure" process. + +The libtool script is used to compile and link both shared and static +libraries. They are placed in a subdirectory called .libs when they are newly +built. The programs pcretest and pcregrep are built to use these uninstalled +libraries (by means of wrapper scripts in the case of shared libraries). When +you use "make install" to install shared libraries, pcregrep and pcretest are +automatically re-built to use the newly installed shared libraries before being +installed themselves. However, the versions left in the source directory still +use the uninstalled libraries. + +To build PCRE using static libraries only you must use --disable-shared when +configuring it. For example + +./configure --prefix=/usr/gnu --disable-shared + +Then run "make" in the usual way. Similarly, you can use --disable-static to +build only shared libraries. + + +Building on non-Unix systems +---------------------------- + +For a non-Unix system, read the comments in the file NON-UNIX-USE. PCRE has +been compiled on Windows systems and on Macintoshes, but I don't know the +details because I don't use those systems. It should be straightforward to +build PCRE on any system that has a Standard C compiler, because it uses only +Standard C functions. + + +Testing PCRE +------------ + +To test PCRE on a Unix system, run the RunTest script that is created by the +configuring process. (This can also be run by "make runtest", "make check", or +"make test".) For other systems, see the instruction in NON-UNIX-USE. + +The script runs the pcretest test program (which is documented in the doc +directory) on each of the testinput files (in the testdata directory) in turn, +and compares the output with the contents of the corresponding testoutput file. +A file called testtry is used to hold the output from pcretest. To run pcretest +on just one of the test files, give its number as an argument to RunTest, for +example: + + RunTest 3 + +The first and third test files can also be fed directly into the perltest +script to check that Perl gives the same results. The third file requires the +additional features of release 5.005, which is why it is kept separate from the +main test input, which needs only Perl 5.004. In the long run, when 5.005 (or +higher) is widespread, these two test files may get amalgamated. + +The second set of tests check pcre_fullinfo(), pcre_info(), pcre_study(), +pcre_copy_substring(), pcre_get_substring(), pcre_get_substring_list(), error +detection, and run-time flags that are specific to PCRE, as well as the POSIX +wrapper API. It also uses the debugging flag to check some of the internals of +pcre_compile(). + +If you build PCRE with a locale setting that is not the standard C locale, the +character tables may be different (see next paragraph). In some cases, this may +cause failures in the second set of tests. For example, in a locale where the +isprint() function yields TRUE for characters in the range 128-255, the use of +[:isascii:] inside a character class defines a different set of characters, and +this shows up in this test as a difference in the compiled code, which is being +listed for checking. Where the comparison test output contains [\x00-\x7f] the +test will contain [\x00-\xff], and similarly in some other cases. This is not a +bug in PCRE. + +The fourth set of tests checks pcre_maketables(), the facility for building a +set of character tables for a specific locale and using them instead of the +default tables. The tests make use of the "fr" (French) locale. Before running +the test, the script checks for the presence of this locale by running the +"locale" command. If that command fails, or if it doesn't include "fr" in the +list of available locales, the fourth test cannot be run, and a comment is +output to say why. If running this test produces instances of the error + + ** Failed to set locale "fr" + +in the comparison output, it means that locale is not available on your system, +despite being listed by "locale". This does not mean that PCRE is broken. + +The fifth test checks the experimental, incomplete UTF-8 support. It is not run +automatically unless PCRE is built with UTF-8 support. This file can be fed +directly to the perltest8 script, which requires Perl 5.6 or higher. The sixth +file tests internal UTF-8 features of PCRE that are not relevant to Perl. + + +Character tables +---------------- + +PCRE uses four tables for manipulating and identifying characters. The final +argument of the pcre_compile() function is a pointer to a block of memory +containing the concatenated tables. A call to pcre_maketables() can be used to +generate a set of tables in the current locale. If the final argument for +pcre_compile() is passed as NULL, a set of default tables that is built into +the binary is used. + +The source file called chartables.c contains the default set of tables. This is +not supplied in the distribution, but is built by the program dftables +(compiled from dftables.c), which uses the ANSI C character handling functions +such as isalnum(), isalpha(), isupper(), islower(), etc. to build the table +sources. This means that the default C locale which is set for your system will +control the contents of these default tables. You can change the default tables +by editing chartables.c and then re-building PCRE. If you do this, you should +probably also edit Makefile to ensure that the file doesn't ever get +re-generated. + +The first two 256-byte tables provide lower casing and case flipping functions, +respectively. The next table consists of three 32-byte bit maps which identify +digits, "word" characters, and white space, respectively. These are used when +building 32-byte bit maps that represent character classes. + +The final 256-byte table has bits indicating various character types, as +follows: + + 1 white space character + 2 letter + 4 decimal digit + 8 hexadecimal digit + 16 alphanumeric or '_' + 128 regular expression metacharacter or binary zero + +You should not alter the set of characters that contain the 128 bit, as that +will cause PCRE to malfunction. + + +Manifest +-------- + +The distribution should contain the following files: + +(A) The actual source files of the PCRE library functions and their + headers: + + dftables.c auxiliary program for building chartables.c + get.c ) + maketables.c ) + study.c ) source of + pcre.c ) the functions + pcreposix.c ) + pcre.in "source" for the header for the external API; pcre.h + is built from this by "configure" + pcreposix.h header for the external POSIX wrapper API + internal.h header for internal use + config.in template for config.h, which is built by configure + +(B) Auxiliary files: + + AUTHORS information about the author of PCRE + ChangeLog log of changes to the code + INSTALL generic installation instructions + LICENCE conditions for the use of PCRE + COPYING the same, using GNU's standard name + Makefile.in template for Unix Makefile, which is built by configure + NEWS important changes in this release + NON-UNIX-USE notes on building PCRE on non-Unix systems + README this file + RunTest.in template for a Unix shell script for running tests + config.guess ) files used by libtool, + config.sub ) used only when building a shared library + configure a configuring shell script (built by autoconf) + configure.in the autoconf input used to build configure + doc/Tech.Notes notes on the encoding + doc/pcre.3 man page source for the PCRE functions + doc/pcre.html HTML version + doc/pcre.txt plain text version + doc/pcreposix.3 man page source for the POSIX wrapper API + doc/pcreposix.html HTML version + doc/pcreposix.txt plain text version + doc/pcretest.txt documentation of test program + doc/perltest.txt documentation of Perl test program + doc/pcregrep.1 man page source for the pcregrep utility + doc/pcregrep.html HTML version + doc/pcregrep.txt plain text version + install-sh a shell script for installing files + ltmain.sh file used to build a libtool script + pcretest.c comprehensive test program + pcredemo.c simple demonstration of coding calls to PCRE + perltest Perl test program + perltest8 Perl test program for UTF-8 tests + pcregrep.c source of a grep utility that uses PCRE + pcre-config.in source of script which retains PCRE information + testdata/testinput1 test data, compatible with Perl 5.004 and 5.005 + testdata/testinput2 test data for error messages and non-Perl things + testdata/testinput3 test data, compatible with Perl 5.005 + testdata/testinput4 test data for locale-specific tests + testdata/testinput5 test data for UTF-8 tests compatible with Perl 5.6 + testdata/testinput6 test data for other UTF-8 tests + testdata/testoutput1 test results corresponding to testinput1 + testdata/testoutput2 test results corresponding to testinput2 + testdata/testoutput3 test results corresponding to testinput3 + testdata/testoutput4 test results corresponding to testinput4 + testdata/testoutput5 test results corresponding to testinput5 + testdata/testoutput6 test results corresponding to testinput6 + +(C) Auxiliary files for Win32 DLL + + dll.mk + pcre.def + +Philip Hazel +August 2001 diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/RunTest b/rubbos/app/httpd-2.0.64/srclib/pcre/RunTest new file mode 100755 index 00000000..85eeb624 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/RunTest @@ -0,0 +1,94 @@ +#! /bin/sh + +# Run PCRE tests + +cf=diff + +# Select which tests to run; if no selection, run all + +do1=no +do2=no +do3=no +do4=no + +while [ $# -gt 0 ] ; do + case $1 in + 1) do1=yes;; + 2) do2=yes;; + 3) do3=yes;; + 4) do4=yes;; + *) echo "Unknown test number $1"; exit 1;; + esac + shift +done + +if [ $do1 = no -a $do2 = no -a $do3 = no -a $do4 = no ] ; then + do1=yes + do2=yes + do3=yes + do4=yes +fi + +# Primary test, Perl-compatible + +if [ $do1 = yes ] ; then + echo "Testing main functionality (Perl compatible)" + ./pcretest testdata/testinput1 testtry + if [ $? = 0 ] ; then + $cf testtry testdata/testoutput1 + if [ $? != 0 ] ; then exit 1; fi + else exit 1 + fi +fi + +# PCRE tests that are not Perl-compatible - API & error tests, mostly + +if [ $do2 = yes ] ; then + echo "Testing API and error handling (not Perl compatible)" + ./pcretest -i testdata/testinput2 testtry + if [ $? = 0 ] ; then + $cf testtry testdata/testoutput2 + if [ $? != 0 ] ; then exit 1; fi + else exit 1 + fi +fi + +# Additional Perl-compatible tests for Perl 5.005's new features + +if [ $do3 = yes ] ; then + echo "Testing Perl 5.005 features (Perl 5.005 compatible)" + ./pcretest testdata/testinput3 testtry + if [ $? = 0 ] ; then + $cf testtry testdata/testoutput3 + if [ $? != 0 ] ; then exit 1; fi + else exit 1 + fi +fi + +if [ $do1 = yes -a $do2 = yes -a $do3 = yes ] ; then + echo "The three main tests all ran OK" + echo " " +fi + +# Locale-specific tests, provided the "fr" locale is available + +if [ $do4 = yes ] ; then + locale -a | grep '^fr$' >/dev/null + if [ $? -eq 0 ] ; then + echo "Testing locale-specific features (using 'fr' locale)" + ./pcretest testdata/testinput4 testtry + if [ $? = 0 ] ; then + $cf testtry testdata/testoutput4 + if [ $? != 0 ] ; then exit 1; fi + echo "Locale test ran OK" + echo " " + else exit 1 + fi + else + echo "Cannot test locale-specific features - 'fr' locale not found," + echo "or the \"locale\" command is not available to check for it." + echo " " + fi +fi + +# End diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/RunTest.in b/rubbos/app/httpd-2.0.64/srclib/pcre/RunTest.in new file mode 100755 index 00000000..63c4b26b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/RunTest.in @@ -0,0 +1,149 @@ +#! /bin/sh + +# This file is generated by configure from RunTest.in. Make any changes +# to that file. + +# Run PCRE tests + +cf=diff +testdata=@top_srcdir@/testdata + +# Select which tests to run; if no selection, run all + +do1=no +do2=no +do3=no +do4=no +do5=no +do6=no + +while [ $# -gt 0 ] ; do + case $1 in + 1) do1=yes;; + 2) do2=yes;; + 3) do3=yes;; + 4) do4=yes;; + 5) do5=yes;; + 6) do6=yes;; + *) echo "Unknown test number $1"; exit 1;; + esac + shift +done + +if [ "@UTF8@" = "" ] ; then + if [ $do5 = yes ] ; then + echo "Can't run test 5 because UFT8 support is not configured" + exit 1 + fi + if [ $do6 = yes ] ; then + echo "Can't run test 6 because UFT8 support is not configured" + exit 1 + fi +fi + +if [ $do1 = no -a $do2 = no -a $do3 = no -a $do4 = no -a\ + $do5 = no -a $do6 = no ] ; then + do1=yes + do2=yes + do3=yes + do4=yes + if [ "@UTF8@" != "" ] ; then do5=yes; fi + if [ "@UTF8@" != "" ] ; then do6=yes; fi +fi + +# Primary test, Perl-compatible + +if [ $do1 = yes ] ; then + echo "Testing main functionality (Perl compatible)" + ./pcretest $testdata/testinput1 testtry + if [ $? = 0 ] ; then + $cf testtry $testdata/testoutput1 + if [ $? != 0 ] ; then exit 1; fi + else exit 1 + fi +fi + +# PCRE tests that are not Perl-compatible - API & error tests, mostly + +if [ $do2 = yes ] ; then + echo "Testing API and error handling (not Perl compatible)" + ./pcretest -i $testdata/testinput2 testtry + if [ $? = 0 ] ; then + $cf testtry $testdata/testoutput2 + if [ $? != 0 ] ; then exit 1; fi + else exit 1 + fi +fi + +# Additional Perl-compatible tests for Perl 5.005's new features + +if [ $do3 = yes ] ; then + echo "Testing Perl 5.005 features (Perl 5.005 compatible)" + ./pcretest $testdata/testinput3 testtry + if [ $? = 0 ] ; then + $cf testtry $testdata/testoutput3 + if [ $? != 0 ] ; then exit 1; fi + else exit 1 + fi +fi + +if [ $do1 = yes -a $do2 = yes -a $do3 = yes ] ; then + echo " " + echo "The three main tests all ran OK" + echo " " +fi + +# Locale-specific tests, provided the "fr" locale is available + +if [ $do4 = yes ] ; then + locale -a | grep '^fr$' >/dev/null + if [ $? -eq 0 ] ; then + echo "Testing locale-specific features (using 'fr' locale)" + ./pcretest $testdata/testinput4 testtry + if [ $? = 0 ] ; then + $cf testtry $testdata/testoutput4 + if [ $? != 0 ] ; then + echo " " + echo "Locale test did not run entirely successfully." + echo "This usually means that there is a problem with the locale" + echo "settings rather than a bug in PCRE." + else + echo "Locale test ran OK" + fi + echo " " + else exit 1 + fi + else + echo "Cannot test locale-specific features - 'fr' locale not found," + echo "or the \"locale\" command is not available to check for it." + echo " " + fi +fi + +# Additional tests for UTF8 support + +if [ $do5 = yes ] ; then + echo "Testing experimental, incomplete UTF8 support (Perl compatible)" + ./pcretest $testdata/testinput5 testtry + if [ $? = 0 ] ; then + $cf testtry $testdata/testoutput5 + if [ $? != 0 ] ; then exit 1; fi + else exit 1 + fi + echo "UTF8 test ran OK" + echo " " +fi + +if [ $do6 = yes ] ; then + echo "Testing API and internals for UTF8 support (not Perl compatible)" + ./pcretest $testdata/testinput6 testtry + if [ $? = 0 ] ; then + $cf testtry $testdata/testoutput6 + if [ $? != 0 ] ; then exit 1; fi + else exit 1 + fi + echo "UTF8 internals test ran OK" + echo " " +fi + +# End diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/chartables.c b/rubbos/app/httpd-2.0.64/srclib/pcre/chartables.c new file mode 100644 index 00000000..9055da2d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/chartables.c @@ -0,0 +1,183 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* This file is automatically written by the dftables auxiliary +program. If you edit it by hand, you might like to edit the Makefile to +prevent its ever being regenerated. + +This file is #included in the compilation of pcre.c to build the default +character tables which are used when no tables are passed to the compile +function. */ + +static unsigned char pcre_default_tables[] = { + +/* This table is a lower casing table. */ + + 0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, + 64, 97, 98, 99,100,101,102,103, + 104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119, + 120,121,122, 91, 92, 93, 94, 95, + 96, 97, 98, 99,100,101,102,103, + 104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119, + 120,121,122,123,124,125,126,127, + 128,129,130,131,132,133,134,135, + 136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151, + 152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167, + 168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183, + 184,185,186,187,188,189,190,191, + 192,193,194,195,196,197,198,199, + 200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,215, + 216,217,218,219,220,221,222,223, + 224,225,226,227,228,229,230,231, + 232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,247, + 248,249,250,251,252,253,254,255, + +/* This table is a case flipping table. */ + + 0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, + 64, 97, 98, 99,100,101,102,103, + 104,105,106,107,108,109,110,111, + 112,113,114,115,116,117,118,119, + 120,121,122, 91, 92, 93, 94, 95, + 96, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90,123,124,125,126,127, + 128,129,130,131,132,133,134,135, + 136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151, + 152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167, + 168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183, + 184,185,186,187,188,189,190,191, + 192,193,194,195,196,197,198,199, + 200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,215, + 216,217,218,219,220,221,222,223, + 224,225,226,227,228,229,230,231, + 232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,247, + 248,249,250,251,252,253,254,255, + +/* This table contains bit maps for various character classes. +Each map is 32 bytes long and the bits run from the least +significant end of each byte. The classes that have their own +maps are: space, xdigit, digit, upper, lower, word, graph +print, punct, and cntrl. Other classes are built from combinations. */ + + 0x00,0x3e,0x00,0x00,0x01,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + + 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03, + 0x7e,0x00,0x00,0x00,0x7e,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + + 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0xfe,0xff,0xff,0x07,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0x07, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + + 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x03, + 0xfe,0xff,0xff,0x87,0xfe,0xff,0xff,0x07, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + + 0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + + 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff, + 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + + 0x00,0x00,0x00,0x00,0xfe,0xff,0x00,0xfc, + 0x01,0x00,0x00,0xf8,0x01,0x00,0x00,0x78, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + + 0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + +/* This table identifies various classes of character by individual bits: + 0x01 white space character + 0x02 letter + 0x04 decimal digit + 0x08 hexadecimal digit + 0x10 alphanumeric or '_' + 0x80 regular expression metacharacter or binary zero +*/ + + 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 0- 7 */ + 0x00,0x01,0x01,0x01,0x01,0x01,0x00,0x00, /* 8- 15 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 16- 23 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 24- 31 */ + 0x01,0x00,0x00,0x00,0x80,0x00,0x00,0x00, /* - ' */ + 0x80,0x80,0x80,0x80,0x00,0x00,0x80,0x00, /* ( - / */ + 0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c, /* 0 - 7 */ + 0x1c,0x1c,0x00,0x00,0x00,0x00,0x00,0x80, /* 8 - ? */ + 0x00,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /* @ - G */ + 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* H - O */ + 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* P - W */ + 0x12,0x12,0x12,0x80,0x00,0x00,0x80,0x10, /* X - _ */ + 0x00,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x12, /* ` - g */ + 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* h - o */ + 0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12, /* p - w */ + 0x12,0x12,0x12,0x80,0x80,0x00,0x00,0x00, /* x -127 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 128-135 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 136-143 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 144-151 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 152-159 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 160-167 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 168-175 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 176-183 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 184-191 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 192-199 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 200-207 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 208-215 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 216-223 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 224-231 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 232-239 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* 240-247 */ + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};/* 248-255 */ + +/* End of chartables.c */ diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/config.guess b/rubbos/app/httpd-2.0.64/srclib/pcre/config.guess new file mode 100644 index 00000000..6cfac28c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/config.guess @@ -0,0 +1,1344 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002 Free Software Foundation, Inc. + +timestamp='2002-03-20' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +##################################################################### +# This file contains changes for Apache, clearly marked below. +# These changes are hereby donated to the public domain. +##################################################################### + +# Originally written by Per Bothner . +# Please send patches to . Submit a context +# diff and a properly formatted ChangeLog entry. +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# The plan is that this can be called by configure scripts if you +# don't specify an explicit build system type. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 +Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit 0 ;; + --version | -v ) + echo "$version" ; exit 0 ;; + --help | --h* | -h ) + echo "$usage"; exit 0 ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + + +dummy=dummy-$$ +trap 'rm -f $dummy.c $dummy.o $dummy.rel $dummy; exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +set_cc_for_build='case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int dummy(){}" > $dummy.c ; + for c in cc gcc c89 c99 ; do + ($c $dummy.c -c -o $dummy.o) >/dev/null 2>&1 ; + if test $? = 0 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + rm -f $dummy.c $dummy.o $dummy.rel ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE_ARCH}" in + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep __ELF__ >/dev/null + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # The OS release + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit 0 ;; + amiga:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + arc:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + hp300:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mac68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + macppc:OpenBSD:*:*) + echo powerpc-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvme68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvme88k:OpenBSD:*:*) + echo m88k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvmeppc:OpenBSD:*:*) + echo powerpc-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + pmax:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + sgi:OpenBSD:*:*) + echo mipseb-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + sun3:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + wgrisc:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + *:OpenBSD:*:*) + echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + alpha:OSF1:*:*) + if test $UNAME_RELEASE = "V4.0"; then + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + fi + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + cat <$dummy.s + .data +\$Lformat: + .byte 37,100,45,37,120,10,0 # "%d-%x\n" + + .text + .globl main + .align 4 + .ent main +main: + .frame \$30,16,\$26,0 + ldgp \$29,0(\$27) + .prologue 1 + .long 0x47e03d80 # implver \$0 + lda \$2,-1 + .long 0x47e20c21 # amask \$2,\$1 + lda \$16,\$Lformat + mov \$0,\$17 + not \$1,\$18 + jsr \$26,printf + ldgp \$29,0(\$26) + mov 0,\$16 + jsr \$26,exit + .end main +EOF + eval $set_cc_for_build + $CC_FOR_BUILD $dummy.s -o $dummy 2>/dev/null + if test "$?" = 0 ; then + case `./$dummy` in + 0-0) + UNAME_MACHINE="alpha" + ;; + 1-0) + UNAME_MACHINE="alphaev5" + ;; + 1-1) + UNAME_MACHINE="alphaev56" + ;; + 1-101) + UNAME_MACHINE="alphapca56" + ;; + 2-303) + UNAME_MACHINE="alphaev6" + ;; + 2-307) + UNAME_MACHINE="alphaev67" + ;; + 2-1307) + UNAME_MACHINE="alphaev68" + ;; + esac + fi + rm -f $dummy.s $dummy + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + exit 0 ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit 0 ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit 0 ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit 0;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit 0 ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit 0 ;; +######################### +# Apache changes +# +# *:OS/390:*:*) +# echo i370-ibm-openedition +# exit 0 ;; + *:OS390:*:* | *:OS/390:*:*) + echo s390-ibm-os390 + exit 0 ;; + *:OS400:*:* | *:OS/400:*:*) + echo as400-ibm-os400 + exit 0 ;; + *:OS/2:*:*) + echo "i386-pc-os2_emx" + exit 0;; +# +# end Apache changes +######################### + *:OS/390:*:*) + echo i370-ibm-openedition + exit 0 ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit 0;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit 0;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit 0 ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit 0 ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + i86pc:SunOS:5.*:*) + echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit 0 ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit 0 ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit 0 ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit 0 ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit 0 ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit 0 ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit 0 ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit 0 ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit 0 ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit 0 ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit 0 ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit 0 ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $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 $dummy.c -o $dummy \ + && ./$dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ + && rm -f $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + echo mips-mips-riscos${UNAME_RELEASE} + exit 0 ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit 0 ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit 0 ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit 0 ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit 0 ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit 0 ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit 0 ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit 0 ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit 0 ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit 0 ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit 0 ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit 0 ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit 0 ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit 0 ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $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 + $CC_FOR_BUILD $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + echo rs6000-ibm-aix3.2.5 + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit 0 ;; + *:AIX:*:[45]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit 0 ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit 0 ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit 0 ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit 0 ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit 0 ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit 0 ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit 0 ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit 0 ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS= $CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null) && HP_ARCH=`./$dummy` + if test -z "$HP_ARCH"; then HP_ARCH=hppa; fi + rm -f $dummy.c $dummy + fi ;; + esac + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit 0 ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit 0 ;; + 3050*:HI-UX:*:*) + eval $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 $dummy.c -o $dummy && ./$dummy && rm -f $dummy.c $dummy && exit 0 + rm -f $dummy.c $dummy + echo unknown-hitachi-hiuxwe2 + exit 0 ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit 0 ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit 0 ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit 0 ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit 0 ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit 0 ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit 0 ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit 0 ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit 0 ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit 0 ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit 0 ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit 0 ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*T3D:*:*:*) + echo alpha-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit 0 ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit 0 ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit 0 ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit 0 ;; + *:FreeBSD:*:*) + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit 0 ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit 0 ;; + i*:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit 0 ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit 0 ;; + x86:Interix*:3*) + echo i386-pc-interix3 + exit 0 ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i386-pc-interix + exit 0 ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit 0 ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit 0 ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + *:GNU:*:*) + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit 0 ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit 0 ;; + arm*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + mips:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips + #undef mipsel + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mipsel + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` + rm -f $dummy.c + test x"${CPU}" != x && echo "${CPU}-pc-linux-gnu" && exit 0 + ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-gnu + exit 0 ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-gnu + exit 0 ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null + if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + exit 0 ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-gnu ;; + PA8*) echo hppa2.0-unknown-linux-gnu ;; + *) echo hppa-unknown-linux-gnu ;; + esac + exit 0 ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-gnu + exit 0 ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit 0 ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + x86_64:Linux:*:*) + echo x86_64-unknown-linux-gnu + exit 0 ;; + i*86:Linux:*:*) + # The BFD linker knows what the default object file format is, so + # first see if it will tell us. cd to the root directory to prevent + # problems with other programs or directories called `ld' in the path. + # Set LC_ALL=C to ensure ld outputs messages in English. + ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ + | sed -ne '/supported targets:/!d + s/[ ][ ]*/ /g + s/.*supported targets: *// + s/ .*// + p'` + case "$ld_supported_targets" in + elf32-i386) + TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" + ;; + a.out-i386-linux) + echo "${UNAME_MACHINE}-pc-linux-gnuaout" + exit 0 ;; + coff-i386) + echo "${UNAME_MACHINE}-pc-linux-gnucoff" + exit 0 ;; + "") + # Either a pre-BFD a.out linker (linux-gnuoldld) or + # one that does not give us useful --help. + echo "${UNAME_MACHINE}-pc-linux-gnuoldld" + exit 0 ;; + esac + # Determine whether the default compiler is a.out or elf + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + #ifdef __ELF__ + # ifdef __GLIBC__ + # if __GLIBC__ >= 2 + LIBC=gnu + # else + LIBC=gnulibc1 + # endif + # else + LIBC=gnulibc1 + # endif + #else + #ifdef __INTEL_COMPILER + LIBC=gnu + #else + LIBC=gnuaout + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` + rm -f $dummy.c + test x"${LIBC}" != x && echo "${UNAME_MACHINE}-pc-linux-${LIBC}" && exit 0 + test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0 + ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit 0 ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit 0 ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit 0 ;; + i*86:*:5:[78]*) + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit 0 ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')` + (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|egrep '^Machine.*Pent ?II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|egrep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit 0 ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit 0 ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i386. + echo i386-pc-msdosdjgpp + exit 0 ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit 0 ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit 0 ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit 0 ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit 0 ;; + M68*:*:R3V[567]*:*) + test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; + 3[34]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && echo i486-ncr-sysv4.3${OS_REL} && exit 0 + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && echo i486-ncr-sysv4 && exit 0 ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit 0 ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit 0 ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit 0 ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit 0 ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit 0 ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit 0 ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit 0 ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit 0 ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit 0 ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit 0 ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit 0 ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit 0 ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit 0 ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit 0 ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit 0 ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit 0 ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit 0 ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit 0 ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit 0 ;; + *:Darwin:*:*) + echo `uname -p`-apple-darwin${UNAME_RELEASE} + exit 0 ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = "x86"; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit 0 ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit 0 ;; + NSR-[GKLNPTVW]:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit 0 ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit 0 ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit 0 ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit 0 ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit 0 ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit 0 ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit 0 ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit 0 ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit 0 ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit 0 ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit 0 ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit 0 ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit 0 ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit 0 ;; +esac + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +eval $set_cc_for_build +cat >$dummy.c < +# include +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +# if !defined (ultrix) +# 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 + printf ("vax-dec-ultrix\n"); exit (0); +# endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD $dummy.c -o $dummy 2>/dev/null && ./$dummy && rm -f $dummy.c $dummy && exit 0 +rm -f $dummy.c $dummy + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit 0 ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + c34*) + echo c34-convex-bsd + exit 0 ;; + c38*) + echo c38-convex-bsd + exit 0 ;; + c4*) + echo c4-convex-bsd + exit 0 ;; + esac +fi + +cat >&2 < in order to provide the needed +information to handle your system. + +config.guess timestamp = $timestamp + +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/config.h b/rubbos/app/httpd-2.0.64/srclib/pcre/config.h new file mode 100644 index 00000000..556eaddd --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/config.h @@ -0,0 +1,48 @@ +/* config.h. Generated from config.in by configure. */ + +/* On Unix systems config.in is converted by configure into config.h. PCRE is +written in Standard C, but there are a few non-standard things it can cope +with, allowing it to run on SunOS4 and other "close to standard" systems. + +On a non-Unix system you should just copy this file into config.h, and set up +the macros the way you need them. You should normally change the definitions of +HAVE_STRERROR and HAVE_MEMMOVE to 1. Unfortunately, because of the way autoconf +works, these cannot be made the defaults. If your system has bcopy() and not +memmove(), change the definition of HAVE_BCOPY instead of HAVE_MEMMOVE. If your +system has neither bcopy() nor memmove(), leave them both as 0; an emulation +function will be used. */ + +/* Define to empty if the keyword does not work. */ + +/* #undef const */ + +/* Define to `unsigned' if doesn't define size_t. */ + +/* #undef size_t */ + +/* The following two definitions are mainly for the benefit of SunOS4, which +doesn't have the strerror() or memmove() functions that should be present in +all Standard C libraries. The macros HAVE_STRERROR and HAVE_MEMMOVE should +normally be defined with the value 1 for other systems, but unfortunately we +can't make this the default because "configure" files generated by autoconf +will only change 0 to 1; they won't change 1 to 0 if the functions are not +found. */ + +#define HAVE_STRERROR 1 +#define HAVE_MEMMOVE 1 + +/* There are some non-Unix systems that don't even have bcopy(). If this macro +is false, an emulation is used. If HAVE_MEMMOVE is set to 1, the value of +HAVE_BCOPY is not relevant. */ + +#define HAVE_BCOPY 1 + +/* The value of NEWLINE determines the newline character. The default is to +leave it up to the compiler, but some sites want to force a particular value. +On Unix systems, "configure" can be used to override this default. */ + +#ifndef NEWLINE +#define NEWLINE '\n' +#endif + +/* End */ diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/config.hw b/rubbos/app/httpd-2.0.64/srclib/pcre/config.hw new file mode 100644 index 00000000..e192e8bc --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/config.hw @@ -0,0 +1,46 @@ + +/* On Unix systems config.in is converted by configure into config.h. PCRE is +written in Standard C, but there are a few non-standard things it can cope +with, allowing it to run on SunOS4 and other "close to standard" systems. + +On a non-Unix system you should just copy this file into config.h, and set up +the macros the way you need them. You should normally change the definitions of +HAVE_STRERROR and HAVE_MEMMOVE to 1. Unfortunately, because of the way autoconf +works, these cannot be made the defaults. If your system has bcopy() and not +memmove(), change the definition of HAVE_BCOPY instead of HAVE_MEMMOVE. If your +system has neither bcopy() nor memmove(), leave them both as 0; an emulation +function will be used. */ + +/* Define to empty if the keyword does not work. */ + +#undef const + +/* Define to `unsigned' if doesn't define size_t. */ + +#undef size_t + +/* The following two definitions are mainly for the benefit of SunOS4, which +doesn't have the strerror() or memmove() functions that should be present in +all Standard C libraries. The macros should normally be defined with the value +1 for other systems, but unfortunately we can't make this the default because +"configure" files generated by autoconf will only change 0 to 1; they won't +change 1 to 0 if the functions are not found. */ + +#define HAVE_STRERROR 1 +#define HAVE_MEMMOVE 1 + +/* There are some non-Unix systems that don't even have bcopy(). If this macro +is false, an emulation is used. If HAVE_MEMMOVE is set to 1, the value of +HAVE_BCOPY is not relevant. */ + +#define HAVE_BCOPY 0 + +/* The value of NEWLINE determines the newline character. The default is to +leave it up to the compiler, but some sites want to force a particular value. +On Unix systems, "configure" can be used to override this default. */ + +#ifndef NEWLINE +#define NEWLINE '\n' +#endif + +/* End */ diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/config.in b/rubbos/app/httpd-2.0.64/srclib/pcre/config.in new file mode 100644 index 00000000..767cbd05 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/config.in @@ -0,0 +1,47 @@ + +/* On Unix systems config.in is converted by configure into config.h. PCRE is +written in Standard C, but there are a few non-standard things it can cope +with, allowing it to run on SunOS4 and other "close to standard" systems. + +On a non-Unix system you should just copy this file into config.h, and set up +the macros the way you need them. You should normally change the definitions of +HAVE_STRERROR and HAVE_MEMMOVE to 1. Unfortunately, because of the way autoconf +works, these cannot be made the defaults. If your system has bcopy() and not +memmove(), change the definition of HAVE_BCOPY instead of HAVE_MEMMOVE. If your +system has neither bcopy() nor memmove(), leave them both as 0; an emulation +function will be used. */ + +/* Define to empty if the keyword does not work. */ + +#undef const + +/* Define to `unsigned' if doesn't define size_t. */ + +#undef size_t + +/* The following two definitions are mainly for the benefit of SunOS4, which +doesn't have the strerror() or memmove() functions that should be present in +all Standard C libraries. The macros HAVE_STRERROR and HAVE_MEMMOVE should +normally be defined with the value 1 for other systems, but unfortunately we +can't make this the default because "configure" files generated by autoconf +will only change 0 to 1; they won't change 1 to 0 if the functions are not +found. */ + +#define HAVE_STRERROR 0 +#define HAVE_MEMMOVE 0 + +/* There are some non-Unix systems that don't even have bcopy(). If this macro +is false, an emulation is used. If HAVE_MEMMOVE is set to 1, the value of +HAVE_BCOPY is not relevant. */ + +#define HAVE_BCOPY 0 + +/* The value of NEWLINE determines the newline character. The default is to +leave it up to the compiler, but some sites want to force a particular value. +On Unix systems, "configure" can be used to override this default. */ + +#ifndef NEWLINE +#define NEWLINE '\n' +#endif + +/* End */ diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/config.log b/rubbos/app/httpd-2.0.64/srclib/pcre/config.log new file mode 100644 index 00000000..7f015a2e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/config.log @@ -0,0 +1,455 @@ +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by configure, which was +generated by GNU Autoconf 2.63. Invocation command line was + + $ /bottlenecks/rubbos/app/httpd-2.0.64/srclib/pcre/configure --disable-option-checking --prefix=/bottlenecks/rubbos/app/apache2 --enable-module=so --enable-so --with-mpm=worker --cache-file=/dev/null --srcdir=/bottlenecks/rubbos/app/httpd-2.0.64/srclib/pcre --prefix=/bottlenecks/rubbos/app/apache2 --exec-prefix=/bottlenecks/rubbos/app/apache2 --libdir=${prefix}/lib --includedir=/bottlenecks/rubbos/app/apache2/include --bindir=${prefix}/bin + +## --------- ## +## Platform. ## +## --------- ## + +hostname = ubuntu +uname -m = x86_64 +uname -r = 3.16.0-30-generic +uname -s = Linux +uname -v = #40~14.04.1-Ubuntu SMP Thu Jan 15 17:43:14 UTC 2015 + +/usr/bin/uname -p = unknown +/bin/uname -X = unknown + +/bin/arch = unknown +/usr/bin/arch -k = unknown +/usr/convex/getsysinfo = unknown +/usr/bin/hostinfo = unknown +/bin/machine = unknown +/usr/bin/oslevel = unknown +/bin/universe = unknown + +PATH: /bottlenecks/rubbos/app/jdk1.6.0_27/bin +PATH: /bin/unix +PATH: /bottlenecks/rubbos/app/apache-ant-1.6.5/bin +PATH: /bottlenecks/rubbos/app/apache-tomcat-5.5.17/bin +PATH: /usr/local/sbin +PATH: /usr/local/bin +PATH: /usr/sbin +PATH: /usr/bin +PATH: /sbin +PATH: /bin +PATH: /usr/games +PATH: /usr/local/games + + +## ----------- ## +## Core tests. ## +## ----------- ## + +configure:1853: checking for gcc +configure:1869: found /usr/bin/gcc +configure:1880: result: gcc +configure:2112: checking for C compiler version +configure:2120: gcc --version >&5 +gcc (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4 +Copyright (C) 2013 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. + +configure:2124: $? = 0 +configure:2131: gcc -v >&5 +Using built-in specs. +COLLECT_GCC=gcc +COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper +Target: x86_64-linux-gnu +Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.8.4-2ubuntu1~14.04' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.8 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu +Thread model: posix +gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04) +configure:2135: $? = 0 +configure:2142: gcc -V >&5 +gcc: error: unrecognized command line option '-V' +gcc: fatal error: no input files +compilation terminated. +configure:2146: $? = 4 +configure:2169: checking for C compiler default output file name +configure:2191: gcc conftest.c >&5 +configure:2195: $? = 0 +configure:2233: result: a.out +configure:2252: checking whether the C compiler works +configure:2262: ./a.out +configure:2266: $? = 0 +configure:2285: result: yes +configure:2292: checking whether we are cross compiling +configure:2294: result: no +configure:2297: checking for suffix of executables +configure:2304: gcc -o conftest conftest.c >&5 +configure:2308: $? = 0 +configure:2334: result: +configure:2340: checking for suffix of object files +configure:2366: gcc -c conftest.c >&5 +configure:2370: $? = 0 +configure:2395: result: o +configure:2399: checking whether we are using the GNU C compiler +configure:2428: gcc -c conftest.c >&5 +configure:2435: $? = 0 +configure:2452: result: yes +configure:2461: checking whether gcc accepts -g +configure:2491: gcc -c -g conftest.c >&5 +configure:2498: $? = 0 +configure:2599: result: yes +configure:2616: checking for gcc option to accept ISO C89 +configure:2690: gcc -c -g -O2 conftest.c >&5 +configure:2697: $? = 0 +configure:2720: result: none needed +configure:2781: checking for ranlib +configure:2797: found /usr/bin/ranlib +configure:2808: result: ranlib +configure:2838: checking how to run the C preprocessor +configure:2878: gcc -E conftest.c +configure:2885: $? = 0 +configure:2916: gcc -E conftest.c +conftest.c:8:28: fatal error: ac_nonexistent.h: No such file or directory + #include + ^ +compilation terminated. +configure:2923: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| /* end confdefs.h. */ +| #include +configure:2956: result: gcc -E +configure:2985: gcc -E conftest.c +configure:2992: $? = 0 +configure:3023: gcc -E conftest.c +conftest.c:8:28: fatal error: ac_nonexistent.h: No such file or directory + #include + ^ +compilation terminated. +configure:3030: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| /* end confdefs.h. */ +| #include +configure:3070: checking for grep that handles long lines and -e +configure:3130: result: /bin/grep +configure:3135: checking for egrep +configure:3199: result: /bin/grep -E +configure:3204: checking for ANSI C header files +configure:3234: gcc -c -g -O2 conftest.c >&5 +configure:3241: $? = 0 +configure:3340: gcc -o conftest -g -O2 conftest.c >&5 +configure:3344: $? = 0 +configure:3350: ./conftest +configure:3354: $? = 0 +configure:3372: result: yes +configure:3396: checking for sys/types.h +configure:3417: gcc -c -g -O2 conftest.c >&5 +configure:3424: $? = 0 +configure:3441: result: yes +configure:3396: checking for sys/stat.h +configure:3417: gcc -c -g -O2 conftest.c >&5 +configure:3424: $? = 0 +configure:3441: result: yes +configure:3396: checking for stdlib.h +configure:3417: gcc -c -g -O2 conftest.c >&5 +configure:3424: $? = 0 +configure:3441: result: yes +configure:3396: checking for string.h +configure:3417: gcc -c -g -O2 conftest.c >&5 +configure:3424: $? = 0 +configure:3441: result: yes +configure:3396: checking for memory.h +configure:3417: gcc -c -g -O2 conftest.c >&5 +configure:3424: $? = 0 +configure:3441: result: yes +configure:3396: checking for strings.h +configure:3417: gcc -c -g -O2 conftest.c >&5 +configure:3424: $? = 0 +configure:3441: result: yes +configure:3396: checking for inttypes.h +configure:3417: gcc -c -g -O2 conftest.c >&5 +configure:3424: $? = 0 +configure:3441: result: yes +configure:3396: checking for stdint.h +configure:3417: gcc -c -g -O2 conftest.c >&5 +configure:3424: $? = 0 +configure:3441: result: yes +configure:3396: checking for unistd.h +configure:3417: gcc -c -g -O2 conftest.c >&5 +configure:3424: $? = 0 +configure:3441: result: yes +configure:3471: checking limits.h usability +configure:3488: gcc -c -g -O2 conftest.c >&5 +configure:3495: $? = 0 +configure:3509: result: yes +configure:3513: checking limits.h presence +configure:3528: gcc -E conftest.c +configure:3535: $? = 0 +configure:3549: result: yes +configure:3577: checking for limits.h +configure:3586: result: yes +configure:3603: checking for an ANSI C-conforming const +configure:3678: gcc -c -g -O2 conftest.c >&5 +configure:3685: $? = 0 +configure:3700: result: yes +configure:3710: checking for size_t +configure:3738: gcc -c -g -O2 conftest.c >&5 +configure:3745: $? = 0 +configure:3772: gcc -c -g -O2 conftest.c >&5 +conftest.c: In function 'main': +conftest.c:55:21: error: expected expression before ')' token + if (sizeof ((size_t))) + ^ +configure:3779: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_LIMITS_H 1 +| /* end confdefs.h. */ +| #include +| #ifdef HAVE_SYS_TYPES_H +| # include +| #endif +| #ifdef HAVE_SYS_STAT_H +| # include +| #endif +| #ifdef STDC_HEADERS +| # include +| # include +| #else +| # ifdef HAVE_STDLIB_H +| # include +| # endif +| #endif +| #ifdef HAVE_STRING_H +| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H +| # include +| # endif +| # include +| #endif +| #ifdef HAVE_STRINGS_H +| # include +| #endif +| #ifdef HAVE_INTTYPES_H +| # include +| #endif +| #ifdef HAVE_STDINT_H +| # include +| #endif +| #ifdef HAVE_UNISTD_H +| # include +| #endif +| int +| main () +| { +| if (sizeof ((size_t))) +| return 0; +| ; +| return 0; +| } +configure:3802: result: yes +configure:3822: checking for bcopy +configure:3878: gcc -o conftest -g -O2 conftest.c >&5 +conftest.c:42:6: warning: conflicting types for built-in function 'bcopy' [enabled by default] + char bcopy (); + ^ +configure:3885: $? = 0 +configure:3907: result: yes +configure:3822: checking for memmove +configure:3878: gcc -o conftest -g -O2 conftest.c >&5 +conftest.c:43:6: warning: conflicting types for built-in function 'memmove' [enabled by default] + char memmove (); + ^ +configure:3885: $? = 0 +configure:3907: result: yes +configure:3822: checking for strerror +configure:3878: gcc -o conftest -g -O2 conftest.c >&5 +configure:3885: $? = 0 +configure:3907: result: yes +configure:4083: creating ./config.status + +## ---------------------- ## +## Running config.status. ## +## ---------------------- ## + +This file was extended by config.status, which was +generated by GNU Autoconf 2.63. Invocation command line was + + CONFIG_FILES = + CONFIG_HEADERS = + CONFIG_LINKS = + CONFIG_COMMANDS = + $ ./config.status + +on ubuntu + +config.status:746: creating Makefile +config.status:746: creating pcre.h +config.status:746: creating pcre-config +config.status:746: creating config.h +config.status:957: config.h is unchanged +config.status:975: executing default commands + +## ---------------- ## +## Cache variables. ## +## ---------------- ## + +ac_cv_c_compiler_gnu=yes +ac_cv_c_const=yes +ac_cv_env_CC_set= +ac_cv_env_CC_value= +ac_cv_env_CFLAGS_set= +ac_cv_env_CFLAGS_value= +ac_cv_env_CPPFLAGS_set= +ac_cv_env_CPPFLAGS_value= +ac_cv_env_CPP_set= +ac_cv_env_CPP_value= +ac_cv_env_LDFLAGS_set= +ac_cv_env_LDFLAGS_value= +ac_cv_env_LIBS_set= +ac_cv_env_LIBS_value= +ac_cv_env_build_alias_set= +ac_cv_env_build_alias_value= +ac_cv_env_host_alias_set= +ac_cv_env_host_alias_value= +ac_cv_env_target_alias_set= +ac_cv_env_target_alias_value= +ac_cv_func_bcopy=yes +ac_cv_func_memmove=yes +ac_cv_func_strerror=yes +ac_cv_header_inttypes_h=yes +ac_cv_header_limits_h=yes +ac_cv_header_memory_h=yes +ac_cv_header_stdc=yes +ac_cv_header_stdint_h=yes +ac_cv_header_stdlib_h=yes +ac_cv_header_string_h=yes +ac_cv_header_strings_h=yes +ac_cv_header_sys_stat_h=yes +ac_cv_header_sys_types_h=yes +ac_cv_header_unistd_h=yes +ac_cv_objext=o +ac_cv_path_EGREP='/bin/grep -E' +ac_cv_path_GREP=/bin/grep +ac_cv_prog_CPP='gcc -E' +ac_cv_prog_ac_ct_CC=gcc +ac_cv_prog_ac_ct_RANLIB=ranlib +ac_cv_prog_cc_c89= +ac_cv_prog_cc_g=yes +ac_cv_type_size_t=yes + +## ----------------- ## +## Output variables. ## +## ----------------- ## + +CC='gcc' +CFLAGS='-g -O2' +CPP='gcc -E' +CPPFLAGS='' +DEFS='-DHAVE_CONFIG_H' +ECHO_C='' +ECHO_N='-n' +ECHO_T='' +EGREP='/bin/grep -E' +EXEEXT='' +GREP='/bin/grep' +HAVE_MEMMOVE='' +HAVE_STRERROR='' +LDFLAGS='' +LIBOBJS='' +LIBS='' +LIBSUFFIX='la' +LIBTOOL='./libtool' +LTLIBOBJS='' +NEWLINE='' +OBJEXT='o' +PACKAGE_BUGREPORT='' +PACKAGE_NAME='' +PACKAGE_STRING='' +PACKAGE_TARNAME='' +PACKAGE_VERSION='' +PATH_SEPARATOR=':' +PCRE_DATE='02-Jan-2002' +PCRE_LIB_VERSION='0:1:0' +PCRE_MAJOR='3' +PCRE_MINOR='9' +PCRE_POSIXLIB_VERSION='0:0:0' +PCRE_VERSION='3.9' +RANLIB='ranlib' +SHELL='/bin/bash' +UTF8='' +ac_ct_CC='gcc' +bindir='${prefix}/bin' +build_alias='' +datadir='${datarootdir}' +datarootdir='${prefix}/share' +docdir='${datarootdir}/doc/${PACKAGE}' +dvidir='${docdir}' +exec_prefix='/bottlenecks/rubbos/app/apache2' +host_alias='' +htmldir='${docdir}' +includedir='/bottlenecks/rubbos/app/apache2/include' +infodir='${datarootdir}/info' +libdir='${prefix}/lib' +libexecdir='${exec_prefix}/libexec' +localedir='${datarootdir}/locale' +localstatedir='${prefix}/var' +mandir='${datarootdir}/man' +oldincludedir='/usr/include' +pdfdir='${docdir}' +prefix='/bottlenecks/rubbos/app/apache2' +program_transform_name='s,x,x,' +psdir='${docdir}' +sbindir='${exec_prefix}/sbin' +sharedstatedir='${prefix}/com' +sysconfdir='${prefix}/etc' +target_alias='' + +## ----------- ## +## confdefs.h. ## +## ----------- ## + +#define PACKAGE_NAME "" +#define PACKAGE_TARNAME "" +#define PACKAGE_VERSION "" +#define PACKAGE_STRING "" +#define PACKAGE_BUGREPORT "" +#define STDC_HEADERS 1 +#define HAVE_SYS_TYPES_H 1 +#define HAVE_SYS_STAT_H 1 +#define HAVE_STDLIB_H 1 +#define HAVE_STRING_H 1 +#define HAVE_MEMORY_H 1 +#define HAVE_STRINGS_H 1 +#define HAVE_INTTYPES_H 1 +#define HAVE_STDINT_H 1 +#define HAVE_UNISTD_H 1 +#define HAVE_LIMITS_H 1 +#define HAVE_BCOPY 1 +#define HAVE_MEMMOVE 1 +#define HAVE_STRERROR 1 + +configure: exit 0 diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/config.status b/rubbos/app/httpd-2.0.64/srclib/pcre/config.status new file mode 100755 index 00000000..f41467dc --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/config.status @@ -0,0 +1,988 @@ +#! /bin/bash +# Generated by configure. +# 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-/bin/bash} +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be more Bourne compatible +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 + + + + +# PATH needs CR +# 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_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +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 + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + 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 + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + { (exit 1); exit 1; } +fi + +# Work around bugs in pre-3.0 UWIN ksh. +for as_var in ENV MAIL MAILPATH +do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# Required to use basename. +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 + + +# Name of the executable. +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# CDPATH. +$as_unset CDPATH + + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line after each line using $LINENO; the second 'sed' + # does the real work. The second script uses 'N' to pair each + # line-number line with the line containing $LINENO, and appends + # trailing '-' during substitution so that $LINENO is not a special + # case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # scripts with optimization help from Paolo Bonzini. Blame Lee + # E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + 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" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); exit 1; }; } + + # 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 +} + + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in +-n*) + case `echo 'x\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + *) ECHO_C='\c';; + esac;; +*) + ECHO_N='-n';; +esac +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +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 -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +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=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&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.63. 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` +" + +# Files that config.status was made for. +config_files=" Makefile pcre.h:pcre.in pcre-config" +config_headers=" config.h:config.in" +config_commands=" default" + +ac_cs_usage="\ +\`$as_me' instantiates files from templates according to the +current configuration. + +Usage: $0 [OPTION]... [FILE]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, 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 ." + +ac_cs_version="\ +config.status +configured by /bottlenecks/rubbos/app/httpd-2.0.64/srclib/pcre/configure, generated by GNU Autoconf 2.63, + with options \"'--disable-option-checking' '--enable-module=so' '--enable-so' '--with-mpm=worker' '--cache-file=/dev/null' '--srcdir=/bottlenecks/rubbos/app/httpd-2.0.64/srclib/pcre' '--prefix=/bottlenecks/rubbos/app/apache2' '--exec-prefix=/bottlenecks/rubbos/app/apache2' '--libdir=\${prefix}/lib' '--includedir=/bottlenecks/rubbos/app/apache2/include' '--bindir=\${prefix}/bin'\" + +Copyright (C) 2008 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='/bottlenecks/rubbos/app/httpd-2.0.64/srclib/pcre' +srcdir='.' +test -n "$AWK" || AWK=awk +# 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=$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 ) + $as_echo "$ac_cs_version"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + CONFIG_FILES="$CONFIG_FILES '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + CONFIG_HEADERS="$CONFIG_HEADERS '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + { $as_echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; };; + --help | --hel | -h ) + $as_echo "$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_echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } ;; + + *) ac_config_targets="$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 + +if $ac_cs_recheck; then + set X '/bin/bash' '/bottlenecks/rubbos/app/httpd-2.0.64/srclib/pcre/configure' '--disable-option-checking' '--enable-module=so' '--enable-so' '--with-mpm=worker' '--cache-file=/dev/null' '--srcdir=/bottlenecks/rubbos/app/httpd-2.0.64/srclib/pcre' '--prefix=/bottlenecks/rubbos/app/apache2' '--exec-prefix=/bottlenecks/rubbos/app/apache2' '--libdir=${prefix}/lib' '--includedir=/bottlenecks/rubbos/app/apache2/include' '--bindir=${prefix}/bin' $ac_configure_extra_args --no-create --no-recursion + shift + $as_echo "running CONFIG_SHELL=/bin/bash $*" >&6 + CONFIG_SHELL='/bin/bash' + export CONFIG_SHELL + exec "$@" +fi + +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h:config.in" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "pcre.h") CONFIG_FILES="$CONFIG_FILES pcre.h:pcre.in" ;; + "pcre-config") CONFIG_FILES="$CONFIG_FILES pcre-config" ;; + "default") CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;; + + *) { { $as_echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 +$as_echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; + 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+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || 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= + trap 'exit_status=$? + { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status +' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || +{ + $as_echo "$as_me: cannot create a temporary directory in ." >&2 + { (exit 1); exit 1; } +} + +# 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=' ' +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 {' >"$tmp/subs1.awk" && +cat >>"$tmp/subs1.awk" <<\_ACAWK && +S["LTLIBOBJS"]="" +S["LIBOBJS"]="" +S["PCRE_POSIXLIB_VERSION"]="0:0:0" +S["PCRE_LIB_VERSION"]="0:1:0" +S["PCRE_VERSION"]="3.9" +S["PCRE_DATE"]="02-Jan-2002" +S["PCRE_MINOR"]="9" +S["PCRE_MAJOR"]="3" +S["UTF8"]="" +S["NEWLINE"]="" +S["LIBSUFFIX"]="la" +S["LIBTOOL"]="./libtool" +S["HAVE_STRERROR"]="" +S["HAVE_MEMMOVE"]="" +S["EGREP"]="/bin/grep -E" +S["GREP"]="/bin/grep" +S["CPP"]="gcc -E" +S["RANLIB"]="ranlib" +S["OBJEXT"]="o" +S["EXEEXT"]="" +S["ac_ct_CC"]="gcc" +S["CPPFLAGS"]="" +S["LDFLAGS"]="" +S["CFLAGS"]="-g -O2" +S["CC"]="gcc" +S["target_alias"]="" +S["host_alias"]="" +S["build_alias"]="" +S["LIBS"]="" +S["ECHO_T"]="" +S["ECHO_N"]="-n" +S["ECHO_C"]="" +S["DEFS"]="-DHAVE_CONFIG_H" +S["mandir"]="${datarootdir}/man" +S["localedir"]="${datarootdir}/locale" +S["libdir"]="${prefix}/lib" +S["psdir"]="${docdir}" +S["pdfdir"]="${docdir}" +S["dvidir"]="${docdir}" +S["htmldir"]="${docdir}" +S["infodir"]="${datarootdir}/info" +S["docdir"]="${datarootdir}/doc/${PACKAGE}" +S["oldincludedir"]="/usr/include" +S["includedir"]="/bottlenecks/rubbos/app/apache2/include" +S["localstatedir"]="${prefix}/var" +S["sharedstatedir"]="${prefix}/com" +S["sysconfdir"]="${prefix}/etc" +S["datadir"]="${datarootdir}" +S["datarootdir"]="${prefix}/share" +S["libexecdir"]="${exec_prefix}/libexec" +S["sbindir"]="${exec_prefix}/sbin" +S["bindir"]="${prefix}/bin" +S["program_transform_name"]="s,x,x," +S["prefix"]="/bottlenecks/rubbos/app/apache2" +S["exec_prefix"]="/bottlenecks/rubbos/app/apache2" +S["PACKAGE_BUGREPORT"]="" +S["PACKAGE_STRING"]="" +S["PACKAGE_VERSION"]="" +S["PACKAGE_TARNAME"]="" +S["PACKAGE_NAME"]="" +S["PATH_SEPARATOR"]=":" +S["SHELL"]="/bin/bash" +_ACAWK +cat >>"$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 +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 < "$tmp/subs1.awk" > "$tmp/subs.awk" \ + || { { $as_echo "$as_me:$LINENO: error: could not setup config files machinery" >&5 +$as_echo "$as_me: error: could not setup config files machinery" >&2;} + { (exit 1); exit 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 >"$tmp/defines.awk" <<\_ACAWK || +BEGIN { +D["PACKAGE_NAME"]=" \"\"" +D["PACKAGE_TARNAME"]=" \"\"" +D["PACKAGE_VERSION"]=" \"\"" +D["PACKAGE_STRING"]=" \"\"" +D["PACKAGE_BUGREPORT"]=" \"\"" +D["STDC_HEADERS"]=" 1" +D["HAVE_SYS_TYPES_H"]=" 1" +D["HAVE_SYS_STAT_H"]=" 1" +D["HAVE_STDLIB_H"]=" 1" +D["HAVE_STRING_H"]=" 1" +D["HAVE_MEMORY_H"]=" 1" +D["HAVE_STRINGS_H"]=" 1" +D["HAVE_INTTYPES_H"]=" 1" +D["HAVE_STDINT_H"]=" 1" +D["HAVE_UNISTD_H"]=" 1" +D["HAVE_LIMITS_H"]=" 1" +D["HAVE_BCOPY"]=" 1" +D["HAVE_MEMMOVE"]=" 1" +D["HAVE_STRERROR"]=" 1" + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+[_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ][_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789]*([\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 + { { $as_echo "$as_me:$LINENO: error: could not setup config headers machinery" >&5 +$as_echo "$as_me: error: could not setup config headers machinery" >&2;} + { (exit 1); exit 1; }; } +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_echo "$as_me:$LINENO: error: invalid tag $ac_tag" >&5 +$as_echo "$as_me: error: invalid tag $ac_tag" >&2;} + { (exit 1); exit 1; }; };; + :[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="$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_echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 +$as_echo "$as_me: error: cannot find input file: $ac_f" >&2;} + { (exit 1); exit 1; }; };; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + ac_file_inputs="$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 '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:$LINENO: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$tmp/stdin" \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } ;; + 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 || +$as_echo 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" + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$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 || +$as_echo 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_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 +$as_echo "$as_me: error: cannot create directory $as_dir" >&2;} + { (exit 1); exit 1; }; }; } + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$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 + # + +# 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@*) + { $as_echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} + ac_datarootdir_hack=' + s&@datadir@&${datarootdir}&g + s&@docdir@&${datarootdir}/doc/${PACKAGE}&g + s&@infodir@&${datarootdir}/info&g + s&@localedir@&${datarootdir}/locale&g + s&@mandir@&${datarootdir}/man&g + s&\${datarootdir}&${prefix}/share&g' ;; +esac +ac_sed_extra="/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/ +s/:*\${srcdir}:*/:/ +s/:*@srcdir@:*/:/ +s/^\([^=]*=[ ]*\):*/\1/ +s/:*$// +s/^[^=]*=[ ]*$// +} + +: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 "$tmp/subs.awk" >$tmp/out \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&5 +$as_echo "$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 "$tmp/stdin" + case $ac_file in + -) cat "$tmp/out" && rm -f "$tmp/out";; + *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; + esac \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" + } >"$tmp/config.h" \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:$LINENO: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$tmp/config.h" "$ac_file" \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ + || { { $as_echo "$as_me:$LINENO: error: could not create -" >&5 +$as_echo "$as_me: error: could not create -" >&2;} + { (exit 1); exit 1; }; } + fi + ;; + + :C) { $as_echo "$as_me:$LINENO: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "default":C) chmod a+x pcre-config ;; + + esac +done # for ac_tag + + +{ (exit 0); exit 0; } diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/config.sub b/rubbos/app/httpd-2.0.64/srclib/pcre/config.sub new file mode 100644 index 00000000..043d45b3 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/config.sub @@ -0,0 +1,1507 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002 Free Software Foundation, Inc. + +timestamp='2002-03-07' + +# This file is (in principle) common to ALL GNU software. +# The presence of a machine in this file suggests that SOME GNU software +# can handle that machine. It does not imply ALL GNU software can. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +##################################################################### +# This file contains changes for Apache, clearly marked below. +# These changes are hereby donated to the public domain. +##################################################################### + +# Please send patches to . Submit a context +# diff and a properly formatted ChangeLog entry. +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 +Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit 0 ;; + --version | -v ) + echo "$version" ; exit 0 ;; + --help | --h* | -h ) + echo "$usage"; exit 0 ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit 0;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | storm-chaos* | os2-emx* | windows32-* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; +######################## +# changes for Apache +# + tpf | os390 | vmcms) + os=-$maybe_os + basic_machine=s390; + ;; + os400) + os=-$maybe_os + basic_machine=as400; + ;; + mvs) + os=-mvs + basic_machine=i370; + ;; +# +# end Apache changes +######################## + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis) + os= + basic_machine=$1 + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ + | c4x | clipper \ + | d10v | d30v | dsp16xx \ + | fr30 \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | i370 | i860 | i960 | ia64 \ + | m32r | m68000 | m68k | m88k | mcore \ + | mips | mips16 | mips64 | mips64el | mips64orion | mips64orionel \ + | mips64vr4100 | mips64vr4100el | mips64vr4300 \ + | mips64vr4300el | mips64vr5000 | mips64vr5000el \ + | mipsbe | mipseb | mipsel | mipsle | mipstx39 | mipstx39el \ + | mipsisa32 | mipsisa64 \ + | mn10200 | mn10300 \ + | ns16k | ns32k \ + | openrisc | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ + | pyramid \ + | sh | sh[34] | sh[34]eb | shbe | shle | sh64 \ + | sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv9 | sparcv9b \ + | strongarm \ + | tahoe | thumb | tic80 | tron \ + | v850 | v850e \ + | we32k \ + | x86 | xscale | xstormy16 | xtensa \ + | z8k) + basic_machine=$basic_machine-unknown + ;; + m6811 | m68hc11 | m6812 | m68hc12) + # Motorola 68HC11/12. + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | arm-* | armbe-* | armle-* | armv*-* \ + | avr-* \ + | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c54x-* \ + | clipper-* | cydra-* \ + | d10v-* | d30v-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fr30-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | m32r-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | mcore-* \ + | mips-* | mips16-* | mips64-* | mips64el-* | mips64orion-* \ + | mips64orionel-* | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* | mipsbe-* | mipseb-* \ + | mipsle-* | mipsel-* | mipstx39-* | mipstx39el-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ + | pyramid-* \ + | romp-* | rs6000-* \ + | sh-* | sh[34]-* | sh[34]eb-* | shbe-* | shle-* | sh64-* \ + | sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \ + | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ + | tahoe-* | thumb-* | tic30-* | tic54x-* | tic80-* | tron-* \ + | v850-* | v850e-* | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \ + | xtensa-* \ + | ymp-* \ + | z8k-*) + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + crds | unos) + basic_machine=m68k-crds + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; +# I'm not sure what "Sysv32" means. Should this be sysv3.2? + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + mingw32) + basic_machine=i386-pc + os=-mingw32 + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + mmix*) + basic_machine=mmix-knuth + os=-mmixware + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + or32 | or32-*) + basic_machine=or32-unknown + os=-coff + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon) + basic_machine=i686-pc + ;; + pentiumii | pentium2) + basic_machine=i686-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc) basic_machine=powerpc-unknown + ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; +######################## +# changes for Apache +# + as400*) + basic_machine=as400-ibm + ;; +# +# end Apache changes +######################## + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3d) + basic_machine=alpha-cray + os=-unicos + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + tic54x | c54x*) + basic_machine=tic54x-unknown + os=-coff + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + windows32) + basic_machine=i386-pc + os=-windows32-msvcrt + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh3 | sh4 | sh3eb | sh4eb) + basic_machine=sh-unknown + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparc | sparcv9 | sparcv9b) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + c4x*) + basic_machine=c4x-none + os=-coff + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; +######################## +# changes for Apache +# + -os2_emx | -tpf* | -os390* | -vmcms* | -os400* ) + ;; +# +# end Apache changes +######################## + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \ + | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto*) + os=-nto-qnx + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + # This also exists in the configure program, but was not the + # default. + # os=-sunos4 + ;; + m68*-cisco) + os=-aout + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; +######################## +# changes for Apache +# +# *-ibm) +# os=-aix +# ;; +# + *-ibm) + case $basic_machine in + s390*) + os=-os390; + ;; + i370*) + os=-mvs; + ;; + as400*) + os=-os400; + ;; + *) + os=-aix + ;; + esac + ;; +# +# end Apache changes +######################## + + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -vxsim* | -vxworks*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit 0 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/configure b/rubbos/app/httpd-2.0.64/srclib/pcre/configure new file mode 100755 index 00000000..187f3527 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/configure @@ -0,0 +1,5233 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.63. +# +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +# 2002, 2003, 2004, 2005, 2006, 2007, 2008 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 -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 + + + + +# PATH needs CR +# 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_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +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 + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + 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 + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + { (exit 1); exit 1; } +fi + +# Work around bugs in pre-3.0 UWIN ksh. +for as_var in ENV MAIL MAILPATH +do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# Required to use basename. +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 + + +# Name of the executable. +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# CDPATH. +$as_unset CDPATH + + +if test "x$CONFIG_SHELL" = x; then + if (eval ":") 2>/dev/null; then + as_have_required=yes +else + as_have_required=no +fi + + if test $as_have_required = yes && (eval ": +(as_func_return () { + (exit \$1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = \"\$1\" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test \$exitcode = 0) || { (exit 1); exit 1; } + +( + as_lineno_1=\$LINENO + as_lineno_2=\$LINENO + test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && + test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } +") 2> /dev/null; then + : +else + as_candidate_shells= + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + case $as_dir in + /*) + for as_base in sh bash ksh sh5; do + as_candidate_shells="$as_candidate_shells $as_dir/$as_base" + done;; + esac +done +IFS=$as_save_IFS + + + for as_shell in $as_candidate_shells $SHELL; do + # Try only shells that exist, to save several forks. + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { ("$as_shell") 2> /dev/null <<\_ASEOF +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 + + +: +_ASEOF +}; then + CONFIG_SHELL=$as_shell + as_have_required=yes + if { "$as_shell" 2> /dev/null <<\_ASEOF +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 + + +: +(as_func_return () { + (exit $1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = "$1" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test $exitcode = 0) || { (exit 1); exit 1; } + +( + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } + +_ASEOF +}; then + break +fi + +fi + + done + + if test "x$CONFIG_SHELL" != x; then + for as_var in BASH_ENV ENV + do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var + done + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} +fi + + + if test $as_have_required = no; then + echo This script requires a shell more modern than all the + echo shells that I found on your system. Please install a + echo modern shell, or manually run the script under such a + echo shell if you do have one. + { (exit 1); exit 1; } +fi + + +fi + +fi + + + +(eval "as_func_return () { + (exit \$1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = \"\$1\" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test \$exitcode = 0") || { + echo No shell found that supports shell functions. + echo Please tell bug-autoconf@gnu.org about your system, + echo including any error possibly output before this message. + echo This can help us improve future autoconf versions. + echo Configuration will now proceed without shell functions. +} + + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line after each line using $LINENO; the second 'sed' + # does the real work. The second script uses 'N' to pair each + # line-number line with the line containing $LINENO, and appends + # trailing '-' during substitution so that $LINENO is not a special + # case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # scripts with optimization help from Paolo Bonzini. Blame Lee + # E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + 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" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); exit 1; }; } + + # 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 +} + + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in +-n*) + case `echo 'x\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + *) ECHO_C='\c';; + esac;; +*) + ECHO_N='-n';; +esac +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +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 -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +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=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + + +exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, 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= +SHELL=${CONFIG_SHELL-/bin/sh} + +# Identity of this package. +PACKAGE_NAME= +PACKAGE_TARNAME= +PACKAGE_VERSION= +PACKAGE_STRING= +PACKAGE_BUGREPORT= + +ac_unique_file="dftables.c" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='LTLIBOBJS +LIBOBJS +PCRE_POSIXLIB_VERSION +PCRE_LIB_VERSION +PCRE_VERSION +PCRE_DATE +PCRE_MINOR +PCRE_MAJOR +UTF8 +NEWLINE +LIBSUFFIX +LIBTOOL +HAVE_STRERROR +HAVE_MEMMOVE +EGREP +GREP +CPP +RANLIB +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +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 +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_shared +enable_utf8 +enable_newline_is_cr +enable_newline_is_lf +' + 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' +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=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + 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_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 + { (exit 1); exit 1; }; } + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$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_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 + { (exit 1); exit 1; }; } + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$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 ;; + + -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_echo "$as_me: error: invalid package name: $ac_useropt" >&2 + { (exit 1); exit 1; }; } + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$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_echo "$as_me: error: invalid package name: $ac_useropt" >&2 + { (exit 1); exit 1; }; } + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$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_echo "$as_me: error: unrecognized option: $ac_option +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && + { $as_echo "$as_me: error: invalid variable name: $ac_envvar" >&2 + { (exit 1); exit 1; }; } + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$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_echo "$as_me: error: missing argument to $ac_option" >&2 + { (exit 1); exit 1; }; } +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) { $as_echo "$as_me: error: unrecognized options: $ac_unrecognized_opts" >&2 + { (exit 1); exit 1; }; } ;; + *) $as_echo "$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 +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_echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; } +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 + $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used." >&2 + 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_echo "$as_me: error: working directory cannot be determined" >&2 + { (exit 1); exit 1; }; } +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + { $as_echo "$as_me: error: pwd does not report name of working directory" >&2 + { (exit 1); exit 1; }; } + + +# 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 || +$as_echo 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_echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 + { (exit 1); exit 1; }; } +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || { $as_echo "$as_me: error: $ac_msg" >&2 + { (exit 1); exit 1; }; } + 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] + --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 +_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] + --disable-shared build PCRE as a static library + --enable-utf8 enable UTF8 support (incomplete) + --enable-newline-is-cr use CR as the newline character + --enable-newline-is-lf use LF as the newline character + +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 C/C++/Objective 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. + +_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=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$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 guested configure. + 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 + $as_echo "$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.63 + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006, 2007, 2008 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 +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.63. Invocation command line was + + $ $0 $@ + +_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 + test -z "$as_dir" && as_dir=. + $as_echo "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=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; + 2) + ac_configure_args1="$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 + ac_configure_args="$ac_configure_args '$ac_arg'" + ;; + esac + done +done +$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } +$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export 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=$? + # Save into config.log some information that might help in debugging. + { + echo + + cat <<\_ASBOX +## ---------------- ## +## Cache variables. ## +## ---------------- ## +_ASBOX + 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_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$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= ;; #( + *) $as_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 + + cat <<\_ASBOX +## ----------------- ## +## Output variables. ## +## ----------------- ## +_ASBOX + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + cat <<\_ASBOX +## ------------------- ## +## File substitutions. ## +## ------------------- ## +_ASBOX + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + cat <<\_ASBOX +## ----------- ## +## confdefs.h. ## +## ----------- ## +_ASBOX + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$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'; { (exit 1); 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 + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + ac_site_file1=$CONFIG_SITE +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test -r "$ac_site_file"; then + { $as_echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" + 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. + if test -f "$cache_file"; then + { $as_echo "$as_me:$LINENO: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:$LINENO: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +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,) + { $as_echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$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 + { $as_echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:$LINENO: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:$LINENO: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:$LINENO: current value: \`$ac_new_val'" >&5 +$as_echo "$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=`$as_echo "$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. + *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + { { $as_echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 +$as_echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} + { (exit 1); exit 1; }; } +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_config_headers="$ac_config_headers config.h:config.in" + + + +PCRE_MAJOR=3 +PCRE_MINOR=9 +PCRE_DATE=02-Jan-2002 +PCRE_VERSION=${PCRE_MAJOR}.${PCRE_MINOR} + + +PCRE_LIB_VERSION=0:1:0 +PCRE_POSIXLIB_VERSION=0:0:0 + + +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 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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 + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:$LINENO: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "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 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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 + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$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 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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 + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:$LINENO: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "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 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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 + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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" + $as_echo "$as_me:$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 +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:$LINENO: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "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 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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 + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:$LINENO: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "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 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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 + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "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:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } + +# Provide some information about the compiler. +$as_echo "$as_me:$LINENO: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +{ (ac_try="$ac_compiler --version >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler --version >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -v >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -v >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -V >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -V >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + 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. +{ $as_echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +ac_link_default=`$as_echo "$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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; 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+set}" = set && 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 + ac_file='' +fi + +{ $as_echo "$as_me:$LINENO: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +if test -z "$ac_file"; then + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: C compiler cannot create executables +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: C compiler cannot create executables +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } +fi + +ac_exeext=$ac_cv_exeext + +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:$LINENO: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 +# If not cross compiling, check that we can run a simple program. +if test "$cross_compiling" != yes; then + if { ac_try='./$ac_file' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } + fi + fi +fi +{ $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +{ $as_echo "$as_me:$LINENO: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +{ $as_echo "$as_me:$LINENO: checking for suffix of executables" >&5 +$as_echo_n "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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; 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 + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } +fi + +rm -f conftest$ac_cv_exeext +{ $as_echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +{ $as_echo "$as_me:$LINENO: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if test "${ac_cv_objext+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; 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 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } +fi + +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if test "${ac_cv_c_compiler_gnu+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_compiler_gnu=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_compiler_gnu=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if test "${ac_cv_prog_cc_g+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_g=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + CFLAGS="" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_g=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if test "${ac_cv_prog_cc_c89+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + 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; +} + +/* 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 don't provoke an error unfortunately, instead are silently treated + as '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's necessary to write '\x00'==0 to get something + that's 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 **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_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" + rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_c89=$ac_arg +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:$LINENO: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:$LINENO: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac + + +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}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_RANLIB+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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 + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { $as_echo "$as_me:$LINENO: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "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 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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 + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$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 + + + + +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 +{ $as_echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 +$as_echo_n "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+set}" = set; then + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-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. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # 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 >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi + +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + # Broken: success on invalid input. +continue +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi + +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:$LINENO: result: $CPP" >&5 +$as_echo "$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. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # 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 >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi + +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + # Broken: success on invalid input. +continue +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi + +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + : +else + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } +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 + + +{ $as_echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if test "${ac_cv_path_GREP+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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 + test -z "$as_dir" && as_dir=. + 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" + { test -f "$ac_path_GREP" && $as_test_x "$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 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo '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 + ac_count=`expr $ac_count + 1` + 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_echo "$as_me:$LINENO: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 +$as_echo "$as_me: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} + { (exit 1); exit 1; }; } + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:$LINENO: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if test "${ac_cv_path_EGREP+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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 + test -z "$as_dir" && as_dir=. + 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" + { test -f "$ac_path_EGREP" && $as_test_x "$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 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo '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 + ac_count=`expr $ac_count + 1` + 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_echo "$as_me:$LINENO: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 +$as_echo "$as_me: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} + { (exit 1); exit 1; }; } + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ $as_echo "$as_me:$LINENO: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if test "${ac_cv_header_stdc+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_header_stdc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_header_stdc=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then + : +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_header_stdc=no +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +cat >>confdefs.h <<\_ACEOF +#define STDC_HEADERS 1 +_ACEOF + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. + + + + + + + + + +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + eval "$as_ac_Header=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_Header=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + +for ac_header in limits.h +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 +$as_echo_n "checking $ac_header usability... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 +$as_echo_n "checking $ac_header presence... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + + ;; +esac +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + +fi +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + +{ $as_echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5 +$as_echo_n "checking for an ANSI C-conforming const... " >&6; } +if test "${ac_cv_c_const+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +/* FIXME: Include the comments suggested by Paul. */ +#ifndef __cplusplus + /* Ultrix mips cc rejects this. */ + typedef int charset[2]; + const charset cs; + /* 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}; + /* AIX XL C 1.02.0.0 rejects this. + It does not let you subtract one const X* pointer from another in + an arm of an if-expression whose if-part is not a constant + expression */ + const char *g = "string"; + 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. */ + char *t; + 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; + } + { /* AIX XL C 1.02.0.0 rejects this saying + "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ + struct s { int j; const int *ap[3]; }; + struct s *b; b->j = 5; + } + { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ + const int foo = 10; + if (!foo) return 0; + } + return !cs[0] && !zero.x; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_c_const=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_c_const=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5 +$as_echo "$ac_cv_c_const" >&6; } +if test $ac_cv_c_const = no; then + +cat >>confdefs.h <<\_ACEOF +#define const /**/ +_ACEOF + +fi + +{ $as_echo "$as_me:$LINENO: checking for size_t" >&5 +$as_echo_n "checking for size_t... " >&6; } +if test "${ac_cv_type_size_t+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_type_size_t=no +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if (sizeof (size_t)) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if (sizeof ((size_t))) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_type_size_t=yes +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5 +$as_echo "$ac_cv_type_size_t" >&6; } +if test "x$ac_cv_type_size_t" = x""yes; then + : +else + +cat >>confdefs.h <<_ACEOF +#define size_t unsigned int +_ACEOF + +fi + + + + + + +for ac_func in bcopy memmove strerror +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* 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 $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + + +LIBTOOL=./libtool +LIBSUFFIX=la +# Check whether --enable-shared was given. +if test "${enable_shared+set}" = set; then + enableval=$enable_shared; if test "$enableval" = "no"; then + LIBTOOL= + LIBSUFFIX=a +fi + +fi + + + +# Check whether --enable-utf8 was given. +if test "${enable_utf8+set}" = set; then + enableval=$enable_utf8; if test "$enableval" = "yes"; then + UTF8=-DSUPPORT_UTF8 +fi + +fi + + + +# Check whether --enable-newline-is-cr was given. +if test "${enable_newline_is_cr+set}" = set; then + enableval=$enable_newline_is_cr; if test "$enableval" = "yes"; then + NEWLINE=-DNEWLINE=13 +fi + +fi + + + +# Check whether --enable-newline-is-lf was given. +if test "${enable_newline_is_lf+set}" = set; then + enableval=$enable_newline_is_lf; if test "$enableval" = "yes"; then + NEWLINE=-DNEWLINE=10 +fi + +fi + + + + + + + + + + + + + + + + +ac_config_files="$ac_config_files Makefile pcre.h:pcre.in pcre-config" + +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_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$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= ;; #( + *) $as_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+set}" = set || &/ + 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 + test "x$cache_file" != "x/dev/null" && + { $as_echo "$as_me:$LINENO: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + cat confcache >$cache_file + else + { $as_echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 +$as_echo "$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= +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=`$as_echo "$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. + ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" + ac_ltlibobjs="$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" +{ $as_echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +cat >$CONFIG_STATUS <<_ACEOF || ac_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} +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be more Bourne compatible +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 + + + + +# PATH needs CR +# 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_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +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 + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + 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 + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + { (exit 1); exit 1; } +fi + +# Work around bugs in pre-3.0 UWIN ksh. +for as_var in ENV MAIL MAILPATH +do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# Required to use basename. +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 + + +# Name of the executable. +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# CDPATH. +$as_unset CDPATH + + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line after each line using $LINENO; the second 'sed' + # does the real work. The second script uses 'N' to pair each + # line-number line with the line containing $LINENO, and appends + # trailing '-' during substitution so that $LINENO is not a special + # case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # scripts with optimization help from Paolo Bonzini. Blame Lee + # E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + 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" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); exit 1; }; } + + # 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 +} + + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in +-n*) + case `echo 'x\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + *) ECHO_C='\c';; + esac;; +*) + ECHO_N='-n';; +esac +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +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 -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +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=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&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.63. 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 from templates according to the +current configuration. + +Usage: $0 [OPTION]... [FILE]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, 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 ." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_version="\\ +config.status +configured by $0, generated by GNU Autoconf 2.63, + with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" + +Copyright (C) 2008 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' +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=$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 ) + $as_echo "$ac_cs_version"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + CONFIG_FILES="$CONFIG_FILES '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + CONFIG_HEADERS="$CONFIG_HEADERS '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + { $as_echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; };; + --help | --hel | -h ) + $as_echo "$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_echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } ;; + + *) ac_config_targets="$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 + \$as_echo "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 + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_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 + "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h:config.in" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "pcre.h") CONFIG_FILES="$CONFIG_FILES pcre.h:pcre.in" ;; + "pcre-config") CONFIG_FILES="$CONFIG_FILES pcre-config" ;; + "default") CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;; + + *) { { $as_echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 +$as_echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; + 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+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || 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= + trap 'exit_status=$? + { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status +' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || +{ + $as_echo "$as_me: cannot create a temporary directory in ." >&2 + { (exit 1); exit 1; } +} + +# 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=' ' +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 {' >"$tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } +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_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } + + 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_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } + 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 >>"\$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 >>"\$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 < "$tmp/subs1.awk" > "$tmp/subs.awk" \ + || { { $as_echo "$as_me:$LINENO: error: could not setup config files machinery" >&5 +$as_echo "$as_me: error: could not setup config files machinery" >&2;} + { (exit 1); exit 1; }; } +_ACEOF + +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ 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[ ]*=/{ +s/:*\$(srcdir):*/:/ +s/:*\${srcdir}:*/:/ +s/:*@srcdir@:*/:/ +s/^\([^=]*=[ ]*\):*/\1/ +s/:*$// +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 >"$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_t=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_t"; then + break + elif $ac_last_try; then + { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_HEADERS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_HEADERS" >&2;} + { (exit 1); exit 1; }; } + 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_echo "$as_me:$LINENO: error: could not setup config headers machinery" >&5 +$as_echo "$as_me: error: could not setup config headers machinery" >&2;} + { (exit 1); exit 1; }; } +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_echo "$as_me:$LINENO: error: invalid tag $ac_tag" >&5 +$as_echo "$as_me: error: invalid tag $ac_tag" >&2;} + { (exit 1); exit 1; }; };; + :[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="$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_echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 +$as_echo "$as_me: error: cannot find input file: $ac_f" >&2;} + { (exit 1); exit 1; }; };; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + ac_file_inputs="$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 '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:$LINENO: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$tmp/stdin" \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } ;; + 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 || +$as_echo 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" + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$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 || +$as_echo 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_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 +$as_echo "$as_me: error: cannot create directory $as_dir" >&2;} + { (exit 1); exit 1; }; }; } + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$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@*) + { $as_echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$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 "$tmp/subs.awk" >$tmp/out \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&5 +$as_echo "$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 "$tmp/stdin" + case $ac_file in + -) cat "$tmp/out" && rm -f "$tmp/out";; + *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; + esac \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" + } >"$tmp/config.h" \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:$LINENO: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$tmp/config.h" "$ac_file" \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ + || { { $as_echo "$as_me:$LINENO: error: could not create -" >&5 +$as_echo "$as_me: error: could not create -" >&2;} + { (exit 1); exit 1; }; } + fi + ;; + + :C) { $as_echo "$as_me:$LINENO: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "default":C) chmod a+x pcre-config ;; + + esac +done # for ac_tag + + +{ (exit 0); exit 0; } +_ACEOF +chmod +x $CONFIG_STATUS +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + { { $as_echo "$as_me:$LINENO: error: write failure creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: write failure creating $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } + + +# 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 || { (exit 1); exit 1; } +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:$LINENO: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/configure.in b/rubbos/app/httpd-2.0.64/srclib/pcre/configure.in new file mode 100644 index 00000000..061cfb68 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/configure.in @@ -0,0 +1,104 @@ +dnl Process this file with autoconf to produce a configure script. + +dnl This is required at the start; the name is the name of a file +dnl it should be seeing, to verify it is in the same directory. + +AC_INIT(dftables.c) + +dnl Arrange to build config.h from config.in. Note that pcre.h is +dnl built differently, as it is just a "substitution" file. +dnl Manual says this macro should come right after AC_INIT. +AC_CONFIG_HEADER(config.h:config.in) + +dnl Provide the current PCRE version information. Do not use numbers +dnl with leading zeros for the minor version, as they end up in a C +dnl macro, and may be treated as octal constants. Stick to single +dnl digits for minor numbers less than 10. There are unlikely to be +dnl that many releases anyway. + +PCRE_MAJOR=3 +PCRE_MINOR=9 +PCRE_DATE=02-Jan-2002 +PCRE_VERSION=${PCRE_MAJOR}.${PCRE_MINOR} + +dnl Provide versioning information for libtool shared libraries that +dnl are built by default on Unix systems. + +PCRE_LIB_VERSION=0:1:0 +PCRE_POSIXLIB_VERSION=0:0:0 + +dnl Checks for programs. + +AC_PROG_CC +AC_PROG_RANLIB + +dnl Checks for header files. + +AC_HEADER_STDC +AC_CHECK_HEADERS(limits.h) + +dnl Checks for typedefs, structures, and compiler characteristics. + +AC_C_CONST +AC_TYPE_SIZE_T + +dnl Checks for library functions. + +AC_CHECK_FUNCS(bcopy memmove strerror) + +dnl Handle --enable-shared-libraries + +LIBTOOL=./libtool +LIBSUFFIX=la +AC_ARG_ENABLE(shared, +[ --disable-shared build PCRE as a static library], +if test "$enableval" = "no"; then + LIBTOOL= + LIBSUFFIX=a +fi +) + +dnl Handle --enable-utf8 + +AC_ARG_ENABLE(utf8, +[ --enable-utf8 enable UTF8 support (incomplete)], +if test "$enableval" = "yes"; then + UTF8=-DSUPPORT_UTF8 +fi +) + +dnl Handle --enable-newline-is-cr + +AC_ARG_ENABLE(newline-is-cr, +[ --enable-newline-is-cr use CR as the newline character], +if test "$enableval" = "yes"; then + NEWLINE=-DNEWLINE=13 +fi +) + +dnl Handle --enable-newline-is-lf + +AC_ARG_ENABLE(newline-is-lf, +[ --enable-newline-is-lf use LF as the newline character], +if test "$enableval" = "yes"; then + NEWLINE=-DNEWLINE=10 +fi +) + +dnl "Export" these variables + +AC_SUBST(HAVE_MEMMOVE) +AC_SUBST(HAVE_STRERROR) +AC_SUBST(LIBTOOL) +AC_SUBST(LIBSUFFIX) +AC_SUBST(NEWLINE) +AC_SUBST(UTF8) +AC_SUBST(PCRE_MAJOR) +AC_SUBST(PCRE_MINOR) +AC_SUBST(PCRE_DATE) +AC_SUBST(PCRE_VERSION) +AC_SUBST(PCRE_LIB_VERSION) +AC_SUBST(PCRE_POSIXLIB_VERSION) + +dnl This must be last; it determines what files are written as well as config.h +AC_OUTPUT(Makefile pcre.h:pcre.in pcre-config,[chmod a+x pcre-config]) diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/dftables b/rubbos/app/httpd-2.0.64/srclib/pcre/dftables new file mode 100755 index 0000000000000000000000000000000000000000..70542dda0d4f44a54e3fd210332451664d4d31f2 GIT binary patch literal 24992 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 RvkuO-8MWB*0B$?u{{d>qC(-}_ literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/dftables.c b/rubbos/app/httpd-2.0.64/srclib/pcre/dftables.c new file mode 100644 index 00000000..fe4ffcdb --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/dftables.c @@ -0,0 +1,148 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* +PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + +Written by: Philip Hazel + + Copyright (c) 1997-2001 University of Cambridge + +----------------------------------------------------------------------------- +Permission is granted to anyone to use this software for any purpose on any +computer system, and to redistribute it freely, subject to the following +restrictions: + +1. This software is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +2. The origin of this software must not be misrepresented, either by + explicit claim or by omission. + +3. Altered versions must be plainly marked as such, and must not be + misrepresented as being the original software. + +4. If PCRE is embedded in any software that is released under the GNU + General Purpose Licence (GPL), then the terms of that licence shall + supersede any condition above with which it is incompatible. +----------------------------------------------------------------------------- + +See the file Tech.Notes for some information on the internals. +*/ + + +/* This is a support program to generate the file chartables.c, containing +character tables of various kinds. They are built according to the default C +locale and used as the default tables by PCRE. Now that pcre_maketables is +a function visible to the outside world, we make use of its code from here in +order to be consistent. */ + +#include +#include +#include + +#include "internal.h" + +#define DFTABLES /* maketables.c notices this */ +#include "maketables.c" + + +int main(void) +{ +int i; +const unsigned char *tables = pcre_maketables(); + +printf( + "/*************************************************\n" + "* Perl-Compatible Regular Expressions *\n" + "*************************************************/\n\n" + "/* This file is automatically written by the dftables auxiliary \n" + "program. If you edit it by hand, you might like to edit the Makefile to \n" + "prevent its ever being regenerated.\n\n" + "This file is #included in the compilation of pcre.c to build the default\n" + "character tables which are used when no tables are passed to the compile\n" + "function. */\n\n" + "static unsigned char pcre_default_tables[] = {\n\n" + "/* This table is a lower casing table. */\n\n"); + +printf(" "); +for (i = 0; i < 256; i++) + { + if ((i & 7) == 0 && i != 0) printf("\n "); + printf("%3d", *tables++); + if (i != 255) printf(","); + } +printf(",\n\n"); + +printf("/* This table is a case flipping table. */\n\n"); + +printf(" "); +for (i = 0; i < 256; i++) + { + if ((i & 7) == 0 && i != 0) printf("\n "); + printf("%3d", *tables++); + if (i != 255) printf(","); + } +printf(",\n\n"); + +printf( + "/* This table contains bit maps for various character classes.\n" + "Each map is 32 bytes long and the bits run from the least\n" + "significant end of each byte. The classes that have their own\n" + "maps are: space, xdigit, digit, upper, lower, word, graph\n" + "print, punct, and cntrl. Other classes are built from combinations. */\n\n"); + +printf(" "); +for (i = 0; i < cbit_length; i++) + { + if ((i & 7) == 0 && i != 0) + { + if ((i & 31) == 0) printf("\n"); + printf("\n "); + } + printf("0x%02x", *tables++); + if (i != cbit_length - 1) printf(","); + } +printf(",\n\n"); + +printf( + "/* This table identifies various classes of character by individual bits:\n" + " 0x%02x white space character\n" + " 0x%02x letter\n" + " 0x%02x decimal digit\n" + " 0x%02x hexadecimal digit\n" + " 0x%02x alphanumeric or '_'\n" + " 0x%02x regular expression metacharacter or binary zero\n*/\n\n", + ctype_space, ctype_letter, ctype_digit, ctype_xdigit, ctype_word, + ctype_meta); + +printf(" "); +for (i = 0; i < 256; i++) + { + if ((i & 7) == 0 && i != 0) + { + printf(" /* "); + if (isprint(i-8)) printf(" %c -", i-8); + else printf("%3d-", i-8); + if (isprint(i-1)) printf(" %c ", i-1); + else printf("%3d", i-1); + printf(" */\n "); + } + printf("0x%02x", *tables++); + if (i != 255) printf(","); + } + +printf("};/* "); +if (isprint(i-8)) printf(" %c -", i-8); + else printf("%3d-", i-8); +if (isprint(i-1)) printf(" %c ", i-1); + else printf("%3d", i-1); +printf(" */\n\n/* End of chartables.c */\n"); + +return 0; +} + +/* End of dftables.c */ diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/dftables.dsp b/rubbos/app/httpd-2.0.64/srclib/pcre/dftables.dsp new file mode 100644 index 00000000..8f5c89f1 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/dftables.dsp @@ -0,0 +1,165 @@ +# Microsoft Developer Studio Project File - Name="dftables" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=dftables - 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 "dftables.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "dftables.mak" CFG="dftables - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "dftables - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "dftables - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "dftables - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "_WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Fd"Release\dftables" /FD /c +# ADD CPP /nologo /MD /W3 /O2 /D "_WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Fd"Release\dftables" /FD /c +# ADD BASE RSC /l 0x809 /d "NDEBUG" +# ADD RSC /l 0x809 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:console /pdb:"Release\dftables.pdb" +# SUBTRACT BASE LINK32 /pdb:none +# ADD LINK32 kernel32.lib /nologo /subsystem:console /pdb:"Release\dftables.pdb" /opt:ref +# SUBTRACT LINK32 /pdb:none + +!ELSEIF "$(CFG)" == "dftables - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "_WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Fd"Debug\dftables" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "_WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /Fd"Debug\dftables" /FD /c +# ADD BASE RSC /l 0x809 /d "_DEBUG" +# ADD RSC /l 0x809 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:console /incremental:no /pdb:"Debug\dftables.pdb" /debug /pdbtype:sept +# SUBTRACT BASE LINK32 /pdb:none +# ADD LINK32 kernel32.lib /nologo /subsystem:console /incremental:no /pdb:"Debug\dftables.pdb" /debug +# SUBTRACT LINK32 /pdb:none + +!ENDIF + +# Begin Target + +# Name "dftables - Win32 Release" +# Name "dftables - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\dftables.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hw" +# Begin Source File + +SOURCE=.\config.hw + +!IF "$(CFG)" == "dftables - Win32 Release" + +# Begin Custom Build - Creating pcre config.h from config.hw +InputPath=.\config.hw + +".\config.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + type .\config.hw > .\config.h + +# End Custom Build + +!ELSEIF "$(CFG)" == "dftables - Win32 Debug" + +# Begin Custom Build - Creating pcre config.h from config.hw +InputPath=.\config.hw + +".\config.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + type .\config.hw > .\config.h + +# End Custom Build + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\internal.h +# End Source File +# Begin Source File + +SOURCE=.\maketables.c +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File + +SOURCE=.\pcre.hw + +!IF "$(CFG)" == "dftables - Win32 Release" + +# Begin Custom Build - Creating pcre.h from pcre.hw +InputPath=.\pcre.hw + +".\pcre.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + type .\pcre.hw > .\pcre.h + +# End Custom Build + +!ELSEIF "$(CFG)" == "dftables - Win32 Debug" + +# Begin Custom Build - Creating pcre.h from pcre.hw +InputPath=.\pcre.hw + +".\pcre.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + type .\pcre.hw > .\pcre.h + +# End Custom Build + +!ENDIF + +# End Source File +# End Group +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/dftables.lo b/rubbos/app/httpd-2.0.64/srclib/pcre/dftables.lo new file mode 100644 index 00000000..fb76e7a3 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/dftables.lo @@ -0,0 +1,12 @@ +# dftables.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/dftables.o' + +# Name of the non-PIC object. +non_pic_object='dftables.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/dftables.o b/rubbos/app/httpd-2.0.64/srclib/pcre/dftables.o new file mode 100644 index 0000000000000000000000000000000000000000..1ad1a47d44a48e5a86cb388c72903bd2f7efb0a8 GIT binary patch literal 35784 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
    #q=-kf7Y2oIunV*`1i@4sRDnM z_>}^Gl=ys~%sQKhkIzRiFwXYja~BMZpGWO&)Nm4im(ooFpG*7}iBr8BB~Iy^1-^*v z|E|ElN%}hlzKr<)F7TI#|B%4%qcq;9W8n7k{JU4fNqj%0e=czT@EY%zF|ZELORs7; zi9bl`-wAvG`R8qcb3eT=@W&~gOXaxUQo>IXcs}971-_2(5`m8;e@+$nSCpPBaGp08 z3A``qTq2DMG9@4o(;L8c;^OgO^&;51@{=ZPY`vlG( z|NlzhMWp}V0uK{zu1|2D;dS1h1>a5SY-%6dc`D%r0{obagvUq$J8 z0$)h_O9cLPO8W)Q>yog*ucI{n4M_~#uB*sDn*=_T(zgoy1LFUSzz>m~cMCi~XIpZCbv{)9`NB7v_Yok~N;)IZ0-QGX2Cu_S}eD#5>u_|1YJ zpn9(oINv|tZ0MNw++pBo&lb}EVFsPY1^;2Ovi~LnN1ZpR!0iT({3Wzdy^C;cFY2F2{QC_) z`fVlQj|u*0!hd1lyavXs*9;u>ng5xAW0d>eLxtI%ub~KplMUSDk27%8pRd@KHJfm3 zEB;*X)fv@-e<|^O29El?o(UT`>emo|wV{u;ZzcR%gO57N`#S?ioz=v@*T7Bwg9eWL z3DmzoH*k~xih(2lO45IWaP$G%`8wgB2tHrObFnZ4_Wv}hccj2?(=@AyaMtJNP16LQ z*VFS29PQ`lEteQLMw#Ct@E=jV?FNob;pcVR4IHD)|1se_9(K`q*d_RTNdFfGj&}0+ ze9gcy`U3Hf63+U3^Y^9TzeW54svrG~`aIr-8#oqyhxp?OXFv0L=?nwMydt{koGx^} zBAw+1ZjPTC1IK!O)bDEz+~jXEaO7uWLm+G=obB8}_zuAzNI3TcCQ&Cy_5M=uhZ6rc zLjQHb4+%cJsj0$e29EagcFM}6-1y9j6fM=5=e;QL9x!@yCW$J>7zIO+$8{}SQck9?o?mVsm5 z+mt>mbk>qi7Lp)f66@vXD)|PE^7!XF_V4`|O0x{g01_%9Iu6$8ii^7wqmz_Gp05dUMs z@qqdVN#CX|OT_W#T;gRDj>S=DF!2W)IM&PK?KA^NKHE80=(mvmIf9={`hEk)^M#+2 zZ!>VzuOR-n41Hw_t@m~sI9B-ss`q}Ob3Wq|xX!ybKD+9-R`9AZvhCbF?#_LQ2 z$0`p}z3&U1)l{#C9Eg6#dignOfq`Sa%r7AvW%1_=(w`{!*OGpEK^~#BhVCm(O4QcPhL1S#%!#dj|gF29AE%N%~J2 z_F$CnD_<0R^=E-0|9yeyQ@y?Dp(l^?-;(}t!r9Nw)ZQ_If0+1Z894fR82n&3*TB*K zFNxnE^mmbdNbvK>|LYAL^@~s(!fghQ`ooF;BccC$(tlX+CldcT14n&cf4*wqs9!<+ zKMDQ5@p$f6NvB@~Y7J4e{?VaIBZl-}?<5>)k;714931YS(jue+%*7FmSV9 zjv6@XGk*YGpm{vwUpB%p%D{16<^7;Z297#>9xWi8{og@$E)o2vNdGbeM>~t)2g5o8 zM}59e+$8WaIxlV|9P7m;- ze8zE43IpTi)Gj`s7@tgdiKZv{KOy{#40xr$lkLrb^S%$)%kLjW1fQS3tr0kvUoY@W zD1Dv4xja8#=Xx2xOYmDMy(GuWB*TEwK=jX`q^_vQ8KjVD_ z{%aane4oU8#>WW$>%`~#73MQOQ}FpY=Td=xN;>@h2J4(gvWC;5@EA5qK-Do8E}5C#yV`z8o_6KmcuevQV@yM_+p*AR|>%^m~u8SfPMjhbfl!9_3x z<}*G(;J0a-W$qJUy?Y3Uzu>3>>*Qes!h{U?RDtvJ(s>#11p?=Fz(oS*=Z!T2pHKG4 z{U*j&3w}HCug-wC3!I<7-I@WvL*V?L#N7ht=U4wB@F_HYyF;5;wgDR7>DekgE$uKSY=_@e^<3C&mfzaj1FU&jAa@Ol1uRp77Cy!3m4|B>(y zGT?s_IL~AHKZ5GAhv%_A#=aXCEvETrUCec3&l5P$lS>57 z^W-H0zn1hHGT;$`^SsLM9q{=$U!9$nb+h2}dkA+LI9@vPi7)p_d0)H3;G>_}|IZpY z>d<39>(>U3eD>$70_XYv4+d`P@cuTp>jkpYEA|23BD}!B&35sAHS6#^ImzIg?V4fW zsKd{{stnw0*Fu4FyDm0xQ-}9y*&cpA@^yo6+H7TIzXa7tza8rl(IoTe59=pWgoBic8aMa=Rg7-67hxa{O4Zf+f*}(Bq%=??X zKgl{g|KDfuQHS3beb~U!p3(4wf%h9(hxsoXeAMCn#5W8ab$I`R_Z3-(`5xLwVw|r> z`38?Lj_2=V498KPINs=jS$sl+S#A z-dHB^U1StLUuQl)=d2KXex6e$@Uhg7D-9g|b|R%417xSY z`&Kp3AP@Ty{m=F4|BAK?=k=b0LV0)MZ@`uyJG4#DU9@tp$CrSt;= z=lgD6A7M7y$@kqIg3t9H5ICCHY z;q~o8f%l{Ia)A$^bhE%WlRYg0zn$<_f&Vw9HwpYOrMC*4|Fq3^f%AKG4+xyc%`So8 zPxf>OoSzFF5codg9~3y(`?A1!9sZ%fS5x|^z}Hcl+sFOIc6jOhW}Mf1{2epmWFo}i x{X~P0_|Hhc%)s&d<-p&Gvp%1X{Jo>p??eCs^L5Iy9ExC_raio$iI`dM{{m|1U2p&Z literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/dll.mk b/rubbos/app/httpd-2.0.64/srclib/pcre/dll.mk new file mode 100644 index 00000000..d8b728e5 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/dll.mk @@ -0,0 +1,60 @@ +# dll.mk - auxilary Makefile to easy build dll's for mingw32 target +# ver. 0.6 of 1999-03-25 +# +# Homepage of this makefile - http://www.is.lg.ua/~paul/devel/ +# Homepage of original mingw32 project - +# http://www.fu.is.saga-u.ac.jp/~colin/gcc.html +# +# How to use: +# This makefile can: +# 1. Create automatical .def file from list of objects +# 2. Create .dll from objects and .def file, either automatical, or your +# hand-written (maybe) file, which must have same basename as dll +# WARNING! There MUST be object, which name match dll's name. Make sux. +# 3. Create import library from .def (as for .dll, only its name required, +# not dll itself) +# By convention implibs for dll have .dll.a suffix, e.g. libstuff.dll.a +# Why not just libstuff.a? 'Cos that's name for static lib, ok? +# Process divided into 3 phases because: +# 1. Pre-existent .def possible +# 2. Generating implib is enough time-consuming +# +# Variables: +# DLL_LDLIBS - libs for linking dll +# DLL_LDFLAGS - flags for linking dll +# +# By using $(DLL_SUFFIX) instead of 'dll', e.g. stuff.$(DLL_SUFFIX) +# you may help porting makefiles to other platforms +# +# Put this file in your make's include path (e.g. main include dir, for +# more information see include section in make doc). Put in the beginning +# of your own Makefile line "include dll.mk". Specify dependences, e.g.: +# +# Do all stuff in one step +# libstuff.dll.a: $(OBJECTS) stuff.def +# stuff.def: $(OBJECTS) +# +# Steps separated, pre-provided .def, link with user32 +# +# DLL_LDLIBS=-luser32 +# stuff.dll: $(OBJECTS) +# libstuff.dll.a: $(OBJECTS) + + +DLLWRAP=dllwrap +DLLTOOL=dlltool + +DLL_SUFFIX=dll + +.SUFFIXES: .o .$(DLL_SUFFIX) + +_%.def: %.o + $(DLLTOOL) --export-all --output-def $@ $^ + +%.$(DLL_SUFFIX): %.o + $(DLLWRAP) --dllname $(notdir $@) --driver-name $(CC) --def $*.def -o $@ $(filter %.o,$^) $(DLL_LDFLAGS) $(DLL_LDLIBS) + +lib%.$(DLL_SUFFIX).a:%.def + $(DLLTOOL) --dllname $(notdir $*.dll) --def $< --output-lib $@ + +# End diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/doc/Tech.Notes b/rubbos/app/httpd-2.0.64/srclib/pcre/doc/Tech.Notes new file mode 100644 index 00000000..f5ca2801 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/doc/Tech.Notes @@ -0,0 +1,253 @@ +Technical Notes about PCRE +-------------------------- + +Many years ago I implemented some regular expression functions to an algorithm +suggested by Martin Richards. These were not Unix-like in form, and were quite +restricted in what they could do by comparison with Perl. The interesting part +about the algorithm was that the amount of space required to hold the compiled +form of an expression was known in advance. The code to apply an expression did +not operate by backtracking, as the Henry Spencer and Perl code does, but +instead checked all possibilities simultaneously by keeping a list of current +states and checking all of them as it advanced through the subject string. (In +the terminology of Jeffrey Friedl's book, it was a "DFA algorithm".) When the +pattern was all used up, all remaining states were possible matches, and the +one matching the longest subset of the subject string was chosen. This did not +necessarily maximize the individual wild portions of the pattern, as is +expected in Unix and Perl-style regular expressions. + +By contrast, the code originally written by Henry Spencer and subsequently +heavily modified for Perl actually compiles the expression twice: once in a +dummy mode in order to find out how much store will be needed, and then for +real. The execution function operates by backtracking and maximizing (or, +optionally, minimizing in Perl) the amount of the subject that matches +individual wild portions of the pattern. This is an "NFA algorithm" in Friedl's +terminology. + +For the set of functions that forms PCRE (which are unrelated to those +mentioned above), I tried at first to invent an algorithm that used an amount +of store bounded by a multiple of the number of characters in the pattern, to +save on compiling time. However, because of the greater complexity in Perl +regular expressions, I couldn't do this. In any case, a first pass through the +pattern is needed, in order to find internal flag settings like (?i) at top +level. So PCRE works by running a very degenerate first pass to calculate a +maximum store size, and then a second pass to do the real compile - which may +use a bit less than the predicted amount of store. The idea is that this is +going to turn out faster because the first pass is degenerate and the second +pass can just store stuff straight into the vector. It does make the compiling +functions bigger, of course, but they have got quite big anyway to handle all +the Perl stuff. + +The compiled form of a pattern is a vector of bytes, containing items of +variable length. The first byte in an item is an opcode, and the length of the +item is either implicit in the opcode or contained in the data bytes which +follow it. A list of all the opcodes follows: + +Opcodes with no following data +------------------------------ + +These items are all just one byte long + + OP_END end of pattern + OP_ANY match any character + OP_SOD match start of data: \A + OP_CIRC ^ (start of data, or after \n in multiline) + OP_NOT_WORD_BOUNDARY \W + OP_WORD_BOUNDARY \w + OP_NOT_DIGIT \D + OP_DIGIT \d + OP_NOT_WHITESPACE \S + OP_WHITESPACE \s + OP_NOT_WORDCHAR \W + OP_WORDCHAR \w + OP_EODN match end of data or \n at end: \Z + OP_EOD match end of data: \z + OP_DOLL $ (end of data, or before \n in multiline) + OP_RECURSE match the pattern recursively + + +Repeating single characters +--------------------------- + +The common repeats (*, +, ?) when applied to a single character appear as +two-byte items using the following opcodes: + + OP_STAR + OP_MINSTAR + OP_PLUS + OP_MINPLUS + OP_QUERY + OP_MINQUERY + +Those with "MIN" in their name are the minimizing versions. Each is followed by +the character that is to be repeated. Other repeats make use of + + OP_UPTO + OP_MINUPTO + OP_EXACT + +which are followed by a two-byte count (most significant first) and the +repeated character. OP_UPTO matches from 0 to the given number. A repeat with a +non-zero minimum and a fixed maximum is coded as an OP_EXACT followed by an +OP_UPTO (or OP_MINUPTO). + + +Repeating character types +------------------------- + +Repeats of things like \d are done exactly as for single characters, except +that instead of a character, the opcode for the type is stored in the data +byte. The opcodes are: + + OP_TYPESTAR + OP_TYPEMINSTAR + OP_TYPEPLUS + OP_TYPEMINPLUS + OP_TYPEQUERY + OP_TYPEMINQUERY + OP_TYPEUPTO + OP_TYPEMINUPTO + OP_TYPEEXACT + + +Matching a character string +--------------------------- + +The OP_CHARS opcode is followed by a one-byte count and then that number of +characters. If there are more than 255 characters in sequence, successive +instances of OP_CHARS are used. + + +Character classes +----------------- + +OP_CLASS is used for a character class, provided there are at least two +characters in the class. If there is only one character, OP_CHARS is used for a +positive class, and OP_NOT for a negative one (that is, for something like +[^a]). Another set of repeating opcodes (OP_NOTSTAR etc.) are used for a +repeated, negated, single-character class. The normal ones (OP_STAR etc.) are +used for a repeated positive single-character class. + +OP_CLASS is followed by a 32-byte bit map containing a 1 bit for every +character that is acceptable. The bits are counted from the least significant +end of each byte. + + +Back references +--------------- + +OP_REF is followed by two bytes containing the reference number. + + +Repeating character classes and back references +----------------------------------------------- + +Single-character classes are handled specially (see above). This applies to +OP_CLASS and OP_REF. In both cases, the repeat information follows the base +item. The matching code looks at the following opcode to see if it is one of + + OP_CRSTAR + OP_CRMINSTAR + OP_CRPLUS + OP_CRMINPLUS + OP_CRQUERY + OP_CRMINQUERY + OP_CRRANGE + OP_CRMINRANGE + +All but the last two are just single-byte items. The others are followed by +four bytes of data, comprising the minimum and maximum repeat counts. + + +Brackets and alternation +------------------------ + +A pair of non-capturing (round) brackets is wrapped round each expression at +compile time, so alternation always happens in the context of brackets. + +Non-capturing brackets use the opcode OP_BRA, while capturing brackets use +OP_BRA+1, OP_BRA+2, etc. [Note for North Americans: "bracket" to some English +speakers, including myself, can be round, square, curly, or pointy. Hence this +usage.] + +Originally PCRE was limited to 99 capturing brackets (so as not to use up all +the opcodes). From release 3.5, there is no limit. What happens is that the +first ones, up to EXTRACT_BASIC_MAX are handled with separate opcodes, as +above. If there are more, the opcode is set to EXTRACT_BASIC_MAX+1, and the +first operation in the bracket is OP_BRANUMBER, followed by a 2-byte bracket +number. This opcode is ignored while matching, but is fished out when handling +the bracket itself. (They could have all been done like this, but I was making +minimal changes.) + +A bracket opcode is followed by two bytes which give the offset to the next +alternative OP_ALT or, if there aren't any branches, to the matching KET +opcode. Each OP_ALT is followed by two bytes giving the offset to the next one, +or to the KET opcode. + +OP_KET is used for subpatterns that do not repeat indefinitely, while +OP_KETRMIN and OP_KETRMAX are used for indefinite repetitions, minimally or +maximally respectively. All three are followed by two bytes giving (as a +positive number) the offset back to the matching BRA opcode. + +If a subpattern is quantified such that it is permitted to match zero times, it +is preceded by one of OP_BRAZERO or OP_BRAMINZERO. These are single-byte +opcodes which tell the matcher that skipping this subpattern entirely is a +valid branch. + +A subpattern with an indefinite maximum repetition is replicated in the +compiled data its minimum number of times (or once with a BRAZERO if the +minimum is zero), with the final copy terminating with a KETRMIN or KETRMAX as +appropriate. + +A subpattern with a bounded maximum repetition is replicated in a nested +fashion up to the maximum number of times, with BRAZERO or BRAMINZERO before +each replication after the minimum, so that, for example, (abc){2,5} is +compiled as (abc)(abc)((abc)((abc)(abc)?)?)?. The 99 and 200 bracket limits do +not apply to these internally generated brackets. + + +Assertions +---------- + +Forward assertions are just like other subpatterns, but starting with one of +the opcodes OP_ASSERT or OP_ASSERT_NOT. Backward assertions use the opcodes +OP_ASSERTBACK and OP_ASSERTBACK_NOT, and the first opcode inside the assertion +is OP_REVERSE, followed by a two byte count of the number of characters to move +back the pointer in the subject string. When operating in UTF-8 mode, the count +is a character count rather than a byte count. A separate count is present in +each alternative of a lookbehind assertion, allowing them to have different +fixed lengths. + + +Once-only subpatterns +--------------------- + +These are also just like other subpatterns, but they start with the opcode +OP_ONCE. + + +Conditional subpatterns +----------------------- + +These are like other subpatterns, but they start with the opcode OP_COND. If +the condition is a back reference, this is stored at the start of the +subpattern using the opcode OP_CREF followed by two bytes containing the +reference number. Otherwise, a conditional subpattern will always start with +one of the assertions. + + +Changing options +---------------- + +If any of the /i, /m, or /s options are changed within a parenthesized group, +an OP_OPT opcode is compiled, followed by one byte containing the new settings +of these flags. If there are several alternatives in a group, there is an +occurrence of OP_OPT at the start of all those following the first options +change, to set appropriate options for the start of the alternative. +Immediately after the end of the group there is another such item to reset the +flags to their previous values. Other changes of flag within the pattern can be +handled entirely at compile time, and so do not cause anything to be put into +the compiled data. + + +Philip Hazel +August 2001 diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/doc/pcre.3 b/rubbos/app/httpd-2.0.64/srclib/pcre/doc/pcre.3 new file mode 100644 index 00000000..738f76b4 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/doc/pcre.3 @@ -0,0 +1,1991 @@ +.TH PCRE 3 +.SH NAME +pcre - Perl-compatible regular expressions. +.SH SYNOPSIS +.B #include +.PP +.SM +.br +.B pcre *pcre_compile(const char *\fIpattern\fR, int \fIoptions\fR, +.ti +5n +.B const char **\fIerrptr\fR, int *\fIerroffset\fR, +.ti +5n +.B const unsigned char *\fItableptr\fR); +.PP +.br +.B pcre_extra *pcre_study(const pcre *\fIcode\fR, int \fIoptions\fR, +.ti +5n +.B const char **\fIerrptr\fR); +.PP +.br +.B int pcre_exec(const pcre *\fIcode\fR, "const pcre_extra *\fIextra\fR," +.ti +5n +.B "const char *\fIsubject\fR," int \fIlength\fR, int \fIstartoffset\fR, +.ti +5n +.B int \fIoptions\fR, int *\fIovector\fR, int \fIovecsize\fR); +.PP +.br +.B int pcre_copy_substring(const char *\fIsubject\fR, int *\fIovector\fR, +.ti +5n +.B int \fIstringcount\fR, int \fIstringnumber\fR, char *\fIbuffer\fR, +.ti +5n +.B int \fIbuffersize\fR); +.PP +.br +.B int pcre_get_substring(const char *\fIsubject\fR, int *\fIovector\fR, +.ti +5n +.B int \fIstringcount\fR, int \fIstringnumber\fR, +.ti +5n +.B const char **\fIstringptr\fR); +.PP +.br +.B int pcre_get_substring_list(const char *\fIsubject\fR, +.ti +5n +.B int *\fIovector\fR, int \fIstringcount\fR, "const char ***\fIlistptr\fR);" +.PP +.br +.B void pcre_free_substring(const char *\fIstringptr\fR); +.PP +.br +.B void pcre_free_substring_list(const char **\fIstringptr\fR); +.PP +.br +.B const unsigned char *pcre_maketables(void); +.PP +.br +.B int pcre_fullinfo(const pcre *\fIcode\fR, "const pcre_extra *\fIextra\fR," +.ti +5n +.B int \fIwhat\fR, void *\fIwhere\fR); +.PP +.br +.B int pcre_info(const pcre *\fIcode\fR, int *\fIoptptr\fR, int +.B *\fIfirstcharptr\fR); +.PP +.br +.B char *pcre_version(void); +.PP +.br +.B void *(*pcre_malloc)(size_t); +.PP +.br +.B void (*pcre_free)(void *); + + + +.SH DESCRIPTION +The PCRE library is a set of functions that implement regular expression +pattern matching using the same syntax and semantics as Perl 5, with just a few +differences (see below). The current implementation corresponds to Perl 5.005, +with some additional features from later versions. This includes some +experimental, incomplete support for UTF-8 encoded strings. Details of exactly +what is and what is not supported are given below. + +PCRE has its own native API, which is described in this document. There is also +a set of wrapper functions that correspond to the POSIX regular expression API. +These are described in the \fBpcreposix\fR documentation. + +The native API function prototypes are defined in the header file \fBpcre.h\fR, +and on Unix systems the library itself is called \fBlibpcre.a\fR, so can be +accessed by adding \fB-lpcre\fR to the command for linking an application which +calls it. The header file defines the macros PCRE_MAJOR and PCRE_MINOR to +contain the major and minor release numbers for the library. Applications can +use these to include support for different releases. + +The functions \fBpcre_compile()\fR, \fBpcre_study()\fR, and \fBpcre_exec()\fR +are used for compiling and matching regular expressions. A sample program that +demonstrates the simplest way of using them is given in the file +\fIpcredemo.c\fR. The last section of this man page describes how to run it. + +The functions \fBpcre_copy_substring()\fR, \fBpcre_get_substring()\fR, and +\fBpcre_get_substring_list()\fR are convenience functions for extracting +captured substrings from a matched subject string; \fBpcre_free_substring()\fR +and \fBpcre_free_substring_list()\fR are also provided, to free the memory used +for extracted strings. + +The function \fBpcre_maketables()\fR is used (optionally) to build a set of +character tables in the current locale for passing to \fBpcre_compile()\fR. + +The function \fBpcre_fullinfo()\fR is used to find out information about a +compiled pattern; \fBpcre_info()\fR is an obsolete version which returns only +some of the available information, but is retained for backwards compatibility. +The function \fBpcre_version()\fR returns a pointer to a string containing the +version of PCRE and its date of release. + +The global variables \fBpcre_malloc\fR and \fBpcre_free\fR initially contain +the entry points of the standard \fBmalloc()\fR and \fBfree()\fR functions +respectively. PCRE calls the memory management functions via these variables, +so a calling program can replace them if it wishes to intercept the calls. This +should be done before calling any PCRE functions. + + +.SH MULTI-THREADING +The PCRE functions can be used in multi-threading applications, with the +proviso that the memory management functions pointed to by \fBpcre_malloc\fR +and \fBpcre_free\fR are shared by all threads. + +The compiled form of a regular expression is not altered during matching, so +the same compiled pattern can safely be used by several threads at once. + + +.SH COMPILING A PATTERN +The function \fBpcre_compile()\fR is called to compile a pattern into an +internal form. The pattern is a C string terminated by a binary zero, and +is passed in the argument \fIpattern\fR. A pointer to a single block of memory +that is obtained via \fBpcre_malloc\fR is returned. This contains the compiled +code and related data. The \fBpcre\fR type is defined for the returned block; +this is a typedef for a structure whose contents are not externally defined. It +is up to the caller to free the memory when it is no longer required. + +Although the compiled code of a PCRE regex is relocatable, that is, it does not +depend on memory location, the complete \fBpcre\fR data block is not +fully relocatable, because it contains a copy of the \fItableptr\fR argument, +which is an address (see below). + +The size of a compiled pattern is roughly proportional to the length of the +pattern string, except that each character class (other than those containing +just a single character, negated or not) requires 33 bytes, and repeat +quantifiers with a minimum greater than one or a bounded maximum cause the +relevant portions of the compiled pattern to be replicated. + +The \fIoptions\fR argument contains independent bits that affect the +compilation. It should be zero if no options are required. Some of the options, +in particular, those that are compatible with Perl, can also be set and unset +from within the pattern (see the detailed description of regular expressions +below). For these options, the contents of the \fIoptions\fR argument specifies +their initial settings at the start of compilation and execution. The +PCRE_ANCHORED option can be set at the time of matching as well as at compile +time. + +If \fIerrptr\fR is NULL, \fBpcre_compile()\fR returns NULL immediately. +Otherwise, if compilation of a pattern fails, \fBpcre_compile()\fR returns +NULL, and sets the variable pointed to by \fIerrptr\fR to point to a textual +error message. The offset from the start of the pattern to the character where +the error was discovered is placed in the variable pointed to by +\fIerroffset\fR, which must not be NULL. If it is, an immediate error is given. + +If the final argument, \fItableptr\fR, is NULL, PCRE uses a default set of +character tables which are built when it is compiled, using the default C +locale. Otherwise, \fItableptr\fR must be the result of a call to +\fBpcre_maketables()\fR. See the section on locale support below. + +This code fragment shows a typical straightforward call to \fBpcre_compile()\fR: + + pcre *re; + const char *error; + int erroffset; + re = pcre_compile( + "^A.*Z", /* the pattern */ + 0, /* default options */ + &error, /* for error message */ + &erroffset, /* for error offset */ + NULL); /* use default character tables */ + +The following option bits are defined in the header file: + + PCRE_ANCHORED + +If this bit is set, the pattern is forced to be "anchored", that is, it is +constrained to match only at the start of the string which is being searched +(the "subject string"). This effect can also be achieved by appropriate +constructs in the pattern itself, which is the only way to do it in Perl. + + PCRE_CASELESS + +If this bit is set, letters in the pattern match both upper and lower case +letters. It is equivalent to Perl's /i option. + + PCRE_DOLLAR_ENDONLY + +If this bit is set, a dollar metacharacter in the pattern matches only at the +end of the subject string. Without this option, a dollar also matches +immediately before the final character if it is a newline (but not before any +other newlines). The PCRE_DOLLAR_ENDONLY option is ignored if PCRE_MULTILINE is +set. There is no equivalent to this option in Perl. + + PCRE_DOTALL + +If this bit is set, a dot metacharater in the pattern matches all characters, +including newlines. Without it, newlines are excluded. This option is +equivalent to Perl's /s option. A negative class such as [^a] always matches a +newline character, independent of the setting of this option. + + PCRE_EXTENDED + +If this bit is set, whitespace data characters in the pattern are totally +ignored except when escaped or inside a character class, and characters between +an unescaped # outside a character class and the next newline character, +inclusive, are also ignored. This is equivalent to Perl's /x option, and makes +it possible to include comments inside complicated patterns. Note, however, +that this applies only to data characters. Whitespace characters may never +appear within special character sequences in a pattern, for example within the +sequence (?( which introduces a conditional subpattern. + + PCRE_EXTRA + +This option was invented in order to turn on additional functionality of PCRE +that is incompatible with Perl, but it is currently of very little use. When +set, any backslash in a pattern that is followed by a letter that has no +special meaning causes an error, thus reserving these combinations for future +expansion. By default, as in Perl, a backslash followed by a letter with no +special meaning is treated as a literal. There are at present no other features +controlled by this option. It can also be set by a (?X) option setting within a +pattern. + + PCRE_MULTILINE + +By default, PCRE treats the subject string as consisting of a single "line" of +characters (even if it actually contains several newlines). The "start of line" +metacharacter (^) matches only at the start of the string, while the "end of +line" metacharacter ($) matches only at the end of the string, or before a +terminating newline (unless PCRE_DOLLAR_ENDONLY is set). This is the same as +Perl. + +When PCRE_MULTILINE it is set, the "start of line" and "end of line" constructs +match immediately following or immediately before any newline in the subject +string, respectively, as well as at the very start and end. This is equivalent +to Perl's /m option. If there are no "\\n" characters in a subject string, or +no occurrences of ^ or $ in a pattern, setting PCRE_MULTILINE has no +effect. + + PCRE_UNGREEDY + +This option inverts the "greediness" of the quantifiers so that they are not +greedy by default, but become greedy if followed by "?". It is not compatible +with Perl. It can also be set by a (?U) option setting within the pattern. + + PCRE_UTF8 + +This option causes PCRE to regard both the pattern and the subject as strings +of UTF-8 characters instead of just byte strings. However, it is available only +if PCRE has been built to include UTF-8 support. If not, the use of this option +provokes an error. Support for UTF-8 is new, experimental, and incomplete. +Details of exactly what it entails are given below. + + +.SH STUDYING A PATTERN +When a pattern is going to be used several times, it is worth spending more +time analyzing it in order to speed up the time taken for matching. The +function \fBpcre_study()\fR takes a pointer to a compiled pattern as its first +argument, and returns a pointer to a \fBpcre_extra\fR block (another typedef +for a structure with hidden contents) containing additional information about +the pattern; this can be passed to \fBpcre_exec()\fR. If no additional +information is available, NULL is returned. + +The second argument contains option bits. At present, no options are defined +for \fBpcre_study()\fR, and this argument should always be zero. + +The third argument for \fBpcre_study()\fR is a pointer to an error message. If +studying succeeds (even if no data is returned), the variable it points to is +set to NULL. Otherwise it points to a textual error message. + +This is a typical call to \fBpcre_study\fR(): + + pcre_extra *pe; + pe = pcre_study( + re, /* result of pcre_compile() */ + 0, /* no options exist */ + &error); /* set to NULL or points to a message */ + +At present, studying a pattern is useful only for non-anchored patterns that do +not have a single fixed starting character. A bitmap of possible starting +characters is created. + + +.SH LOCALE SUPPORT +PCRE handles caseless matching, and determines whether characters are letters, +digits, or whatever, by reference to a set of tables. The library contains a +default set of tables which is created in the default C locale when PCRE is +compiled. This is used when the final argument of \fBpcre_compile()\fR is NULL, +and is sufficient for many applications. + +An alternative set of tables can, however, be supplied. Such tables are built +by calling the \fBpcre_maketables()\fR function, which has no arguments, in the +relevant locale. The result can then be passed to \fBpcre_compile()\fR as often +as necessary. For example, to build and use tables that are appropriate for the +French locale (where accented characters with codes greater than 128 are +treated as letters), the following code could be used: + + setlocale(LC_CTYPE, "fr"); + tables = pcre_maketables(); + re = pcre_compile(..., tables); + +The tables are built in memory that is obtained via \fBpcre_malloc\fR. The +pointer that is passed to \fBpcre_compile\fR is saved with the compiled +pattern, and the same tables are used via this pointer by \fBpcre_study()\fR +and \fBpcre_exec()\fR. Thus for any single pattern, compilation, studying and +matching all happen in the same locale, but different patterns can be compiled +in different locales. It is the caller's responsibility to ensure that the +memory containing the tables remains available for as long as it is needed. + + +.SH INFORMATION ABOUT A PATTERN +The \fBpcre_fullinfo()\fR function returns information about a compiled +pattern. It replaces the obsolete \fBpcre_info()\fR function, which is +nevertheless retained for backwards compability (and is documented below). + +The first argument for \fBpcre_fullinfo()\fR is a pointer to the compiled +pattern. The second argument is the result of \fBpcre_study()\fR, or NULL if +the pattern was not studied. The third argument specifies which piece of +information is required, while the fourth argument is a pointer to a variable +to receive the data. The yield of the function is zero for success, or one of +the following negative numbers: + + PCRE_ERROR_NULL the argument \fIcode\fR was NULL + the argument \fIwhere\fR was NULL + PCRE_ERROR_BADMAGIC the "magic number" was not found + PCRE_ERROR_BADOPTION the value of \fIwhat\fR was invalid + +Here is a typical call of \fBpcre_fullinfo()\fR, to obtain the length of the +compiled pattern: + + int rc; + unsigned long int length; + rc = pcre_fullinfo( + re, /* result of pcre_compile() */ + pe, /* result of pcre_study(), or NULL */ + PCRE_INFO_SIZE, /* what is required */ + &length); /* where to put the data */ + +The possible values for the third argument are defined in \fBpcre.h\fR, and are +as follows: + + PCRE_INFO_OPTIONS + +Return a copy of the options with which the pattern was compiled. The fourth +argument should point to an \fBunsigned long int\fR variable. These option bits +are those specified in the call to \fBpcre_compile()\fR, modified by any +top-level option settings within the pattern itself, and with the PCRE_ANCHORED +bit forcibly set if the form of the pattern implies that it can match only at +the start of a subject string. + + PCRE_INFO_SIZE + +Return the size of the compiled pattern, that is, the value that was passed as +the argument to \fBpcre_malloc()\fR when PCRE was getting memory in which to +place the compiled data. The fourth argument should point to a \fBsize_t\fR +variable. + + PCRE_INFO_CAPTURECOUNT + +Return the number of capturing subpatterns in the pattern. The fourth argument +should point to an \fbint\fR variable. + + PCRE_INFO_BACKREFMAX + +Return the number of the highest back reference in the pattern. The fourth +argument should point to an \fBint\fR variable. Zero is returned if there are +no back references. + + PCRE_INFO_FIRSTCHAR + +Return information about the first character of any matched string, for a +non-anchored pattern. If there is a fixed first character, e.g. from a pattern +such as (cat|cow|coyote), it is returned in the integer pointed to by +\fIwhere\fR. Otherwise, if either + +(a) the pattern was compiled with the PCRE_MULTILINE option, and every branch +starts with "^", or + +(b) every branch of the pattern starts with ".*" and PCRE_DOTALL is not set +(if it were set, the pattern would be anchored), + +-1 is returned, indicating that the pattern matches only at the start of a +subject string or after any "\\n" within the string. Otherwise -2 is returned. +For anchored patterns, -2 is returned. + + PCRE_INFO_FIRSTTABLE + +If the pattern was studied, and this resulted in the construction of a 256-bit +table indicating a fixed set of characters for the first character in any +matching string, a pointer to the table is returned. Otherwise NULL is +returned. The fourth argument should point to an \fBunsigned char *\fR +variable. + + PCRE_INFO_LASTLITERAL + +For a non-anchored pattern, return the value of the rightmost literal character +which must exist in any matched string, other than at its start. The fourth +argument should point to an \fBint\fR variable. If there is no such character, +or if the pattern is anchored, -1 is returned. For example, for the pattern +/a\\d+z\\d+/ the returned value is 'z'. + +The \fBpcre_info()\fR function is now obsolete because its interface is too +restrictive to return all the available data about a compiled pattern. New +programs should use \fBpcre_fullinfo()\fR instead. The yield of +\fBpcre_info()\fR is the number of capturing subpatterns, or one of the +following negative numbers: + + PCRE_ERROR_NULL the argument \fIcode\fR was NULL + PCRE_ERROR_BADMAGIC the "magic number" was not found + +If the \fIoptptr\fR argument is not NULL, a copy of the options with which the +pattern was compiled is placed in the integer it points to (see +PCRE_INFO_OPTIONS above). + +If the pattern is not anchored and the \fIfirstcharptr\fR argument is not NULL, +it is used to pass back information about the first character of any matched +string (see PCRE_INFO_FIRSTCHAR above). + + +.SH MATCHING A PATTERN +The function \fBpcre_exec()\fR is called to match a subject string against a +pre-compiled pattern, which is passed in the \fIcode\fR argument. If the +pattern has been studied, the result of the study should be passed in the +\fIextra\fR argument. Otherwise this must be NULL. + +Here is an example of a simple call to \fBpcre_exec()\fR: + + int rc; + int ovector[30]; + rc = pcre_exec( + re, /* result of pcre_compile() */ + NULL, /* we didn't study the pattern */ + "some string", /* the subject string */ + 11, /* the length of the subject string */ + 0, /* start at offset 0 in the subject */ + 0, /* default options */ + ovector, /* vector for substring information */ + 30); /* number of elements in the vector */ + +The PCRE_ANCHORED option can be passed in the \fIoptions\fR argument, whose +unused bits must be zero. However, if a pattern was compiled with +PCRE_ANCHORED, or turned out to be anchored by virtue of its contents, it +cannot be made unachored at matching time. + +There are also three further options that can be set only at matching time: + + PCRE_NOTBOL + +The first character of the string is not the beginning of a line, so the +circumflex metacharacter should not match before it. Setting this without +PCRE_MULTILINE (at compile time) causes circumflex never to match. + + PCRE_NOTEOL + +The end of the string is not the end of a line, so the dollar metacharacter +should not match it nor (except in multiline mode) a newline immediately before +it. Setting this without PCRE_MULTILINE (at compile time) causes dollar never +to match. + + PCRE_NOTEMPTY + +An empty string is not considered to be a valid match if this option is set. If +there are alternatives in the pattern, they are tried. If all the alternatives +match the empty string, the entire match fails. For example, if the pattern + + a?b? + +is applied to a string not beginning with "a" or "b", it matches the empty +string at the start of the subject. With PCRE_NOTEMPTY set, this match is not +valid, so PCRE searches further into the string for occurrences of "a" or "b". + +Perl has no direct equivalent of PCRE_NOTEMPTY, but it does make a special case +of a pattern match of the empty string within its \fBsplit()\fR function, and +when using the /g modifier. It is possible to emulate Perl's behaviour after +matching a null string by first trying the match again at the same offset with +PCRE_NOTEMPTY set, and then if that fails by advancing the starting offset (see +below) and trying an ordinary match again. + +The subject string is passed as a pointer in \fIsubject\fR, a length in +\fIlength\fR, and a starting offset in \fIstartoffset\fR. Unlike the pattern +string, the subject may contain binary zero characters. When the starting +offset is zero, the search for a match starts at the beginning of the subject, +and this is by far the most common case. + +A non-zero starting offset is useful when searching for another match in the +same subject by calling \fBpcre_exec()\fR again after a previous success. +Setting \fIstartoffset\fR differs from just passing over a shortened string and +setting PCRE_NOTBOL in the case of a pattern that begins with any kind of +lookbehind. For example, consider the pattern + + \\Biss\\B + +which finds occurrences of "iss" in the middle of words. (\\B matches only if +the current position in the subject is not a word boundary.) When applied to +the string "Mississipi" the first call to \fBpcre_exec()\fR finds the first +occurrence. If \fBpcre_exec()\fR is called again with just the remainder of the +subject, namely "issipi", it does not match, because \\B is always false at the +start of the subject, which is deemed to be a word boundary. However, if +\fBpcre_exec()\fR is passed the entire string again, but with \fIstartoffset\fR +set to 4, it finds the second occurrence of "iss" because it is able to look +behind the starting point to discover that it is preceded by a letter. + +If a non-zero starting offset is passed when the pattern is anchored, one +attempt to match at the given offset is tried. This can only succeed if the +pattern does not require the match to be at the start of the subject. + +In general, a pattern matches a certain portion of the subject, and in +addition, further substrings from the subject may be picked out by parts of the +pattern. Following the usage in Jeffrey Friedl's book, this is called +"capturing" in what follows, and the phrase "capturing subpattern" is used for +a fragment of a pattern that picks out a substring. PCRE supports several other +kinds of parenthesized subpattern that do not cause substrings to be captured. + +Captured substrings are returned to the caller via a vector of integer offsets +whose address is passed in \fIovector\fR. The number of elements in the vector +is passed in \fIovecsize\fR. The first two-thirds of the vector is used to pass +back captured substrings, each substring using a pair of integers. The +remaining third of the vector is used as workspace by \fBpcre_exec()\fR while +matching capturing subpatterns, and is not available for passing back +information. The length passed in \fIovecsize\fR should always be a multiple of +three. If it is not, it is rounded down. + +When a match has been successful, information about captured substrings is +returned in pairs of integers, starting at the beginning of \fIovector\fR, and +continuing up to two-thirds of its length at the most. The first element of a +pair is set to the offset of the first character in a substring, and the second +is set to the offset of the first character after the end of a substring. The +first pair, \fIovector[0]\fR and \fIovector[1]\fR, identify the portion of the +subject string matched by the entire pattern. The next pair is used for the +first capturing subpattern, and so on. The value returned by \fBpcre_exec()\fR +is the number of pairs that have been set. If there are no capturing +subpatterns, the return value from a successful match is 1, indicating that +just the first pair of offsets has been set. + +Some convenience functions are provided for extracting the captured substrings +as separate strings. These are described in the following section. + +It is possible for an capturing subpattern number \fIn+1\fR to match some +part of the subject when subpattern \fIn\fR has not been used at all. For +example, if the string "abc" is matched against the pattern (a|(z))(bc) +subpatterns 1 and 3 are matched, but 2 is not. When this happens, both offset +values corresponding to the unused subpattern are set to -1. + +If a capturing subpattern is matched repeatedly, it is the last portion of the +string that it matched that gets returned. + +If the vector is too small to hold all the captured substrings, it is used as +far as possible (up to two-thirds of its length), and the function returns a +value of zero. In particular, if the substring offsets are not of interest, +\fBpcre_exec()\fR may be called with \fIovector\fR passed as NULL and +\fIovecsize\fR as zero. However, if the pattern contains back references and +the \fIovector\fR isn't big enough to remember the related substrings, PCRE has +to get additional memory for use during matching. Thus it is usually advisable +to supply an \fIovector\fR. + +Note that \fBpcre_info()\fR can be used to find out how many capturing +subpatterns there are in a compiled pattern. The smallest size for +\fIovector\fR that will allow for \fIn\fR captured substrings in addition to +the offsets of the substring matched by the whole pattern is (\fIn\fR+1)*3. + +If \fBpcre_exec()\fR fails, it returns a negative number. The following are +defined in the header file: + + PCRE_ERROR_NOMATCH (-1) + +The subject string did not match the pattern. + + PCRE_ERROR_NULL (-2) + +Either \fIcode\fR or \fIsubject\fR was passed as NULL, or \fIovector\fR was +NULL and \fIovecsize\fR was not zero. + + PCRE_ERROR_BADOPTION (-3) + +An unrecognized bit was set in the \fIoptions\fR argument. + + PCRE_ERROR_BADMAGIC (-4) + +PCRE stores a 4-byte "magic number" at the start of the compiled code, to catch +the case when it is passed a junk pointer. This is the error it gives when the +magic number isn't present. + + PCRE_ERROR_UNKNOWN_NODE (-5) + +While running the pattern match, an unknown item was encountered in the +compiled pattern. This error could be caused by a bug in PCRE or by overwriting +of the compiled pattern. + + PCRE_ERROR_NOMEMORY (-6) + +If a pattern contains back references, but the \fIovector\fR that is passed to +\fBpcre_exec()\fR is not big enough to remember the referenced substrings, PCRE +gets a block of memory at the start of matching to use for this purpose. If the +call via \fBpcre_malloc()\fR fails, this error is given. The memory is freed at +the end of matching. + + +.SH EXTRACTING CAPTURED SUBSTRINGS +Captured substrings can be accessed directly by using the offsets returned by +\fBpcre_exec()\fR in \fIovector\fR. For convenience, the functions +\fBpcre_copy_substring()\fR, \fBpcre_get_substring()\fR, and +\fBpcre_get_substring_list()\fR are provided for extracting captured substrings +as new, separate, zero-terminated strings. A substring that contains a binary +zero is correctly extracted and has a further zero added on the end, but the +result does not, of course, function as a C string. + +The first three arguments are the same for all three functions: \fIsubject\fR +is the subject string which has just been successfully matched, \fIovector\fR +is a pointer to the vector of integer offsets that was passed to +\fBpcre_exec()\fR, and \fIstringcount\fR is the number of substrings that +were captured by the match, including the substring that matched the entire +regular expression. This is the value returned by \fBpcre_exec\fR if it +is greater than zero. If \fBpcre_exec()\fR returned zero, indicating that it +ran out of space in \fIovector\fR, the value passed as \fIstringcount\fR should +be the size of the vector divided by three. + +The functions \fBpcre_copy_substring()\fR and \fBpcre_get_substring()\fR +extract a single substring, whose number is given as \fIstringnumber\fR. A +value of zero extracts the substring that matched the entire pattern, while +higher values extract the captured substrings. For \fBpcre_copy_substring()\fR, +the string is placed in \fIbuffer\fR, whose length is given by +\fIbuffersize\fR, while for \fBpcre_get_substring()\fR a new block of memory is +obtained via \fBpcre_malloc\fR, and its address is returned via +\fIstringptr\fR. The yield of the function is the length of the string, not +including the terminating zero, or one of + + PCRE_ERROR_NOMEMORY (-6) + +The buffer was too small for \fBpcre_copy_substring()\fR, or the attempt to get +memory failed for \fBpcre_get_substring()\fR. + + PCRE_ERROR_NOSUBSTRING (-7) + +There is no substring whose number is \fIstringnumber\fR. + +The \fBpcre_get_substring_list()\fR function extracts all available substrings +and builds a list of pointers to them. All this is done in a single block of +memory which is obtained via \fBpcre_malloc\fR. The address of the memory block +is returned via \fIlistptr\fR, which is also the start of the list of string +pointers. The end of the list is marked by a NULL pointer. The yield of the +function is zero if all went well, or + + PCRE_ERROR_NOMEMORY (-6) + +if the attempt to get the memory block failed. + +When any of these functions encounter a substring that is unset, which can +happen when capturing subpattern number \fIn+1\fR matches some part of the +subject, but subpattern \fIn\fR has not been used at all, they return an empty +string. This can be distinguished from a genuine zero-length substring by +inspecting the appropriate offset in \fIovector\fR, which is negative for unset +substrings. + +The two convenience functions \fBpcre_free_substring()\fR and +\fBpcre_free_substring_list()\fR can be used to free the memory returned by +a previous call of \fBpcre_get_substring()\fR or +\fBpcre_get_substring_list()\fR, respectively. They do nothing more than call +the function pointed to by \fBpcre_free\fR, which of course could be called +directly from a C program. However, PCRE is used in some situations where it is +linked via a special interface to another programming language which cannot use +\fBpcre_free\fR directly; it is for these cases that the functions are +provided. + + +.SH LIMITATIONS +There are some size limitations in PCRE but it is hoped that they will never in +practice be relevant. +The maximum length of a compiled pattern is 65539 (sic) bytes. +All values in repeating quantifiers must be less than 65536. +There maximum number of capturing subpatterns is 65535. +There is no limit to the number of non-capturing subpatterns, but the maximum +depth of nesting of all kinds of parenthesized subpattern, including capturing +subpatterns, assertions, and other types of subpattern, is 200. + +The maximum length of a subject string is the largest positive number that an +integer variable can hold. However, PCRE uses recursion to handle subpatterns +and indefinite repetition. This means that the available stack space may limit +the size of a subject string that can be processed by certain patterns. + + +.SH DIFFERENCES FROM PERL +The differences described here are with respect to Perl 5.005. + +1. By default, a whitespace character is any character that the C library +function \fBisspace()\fR recognizes, though it is possible to compile PCRE with +alternative character type tables. Normally \fBisspace()\fR matches space, +formfeed, newline, carriage return, horizontal tab, and vertical tab. Perl 5 +no longer includes vertical tab in its set of whitespace characters. The \\v +escape that was in the Perl documentation for a long time was never in fact +recognized. However, the character itself was treated as whitespace at least +up to 5.002. In 5.004 and 5.005 it does not match \\s. + +2. PCRE does not allow repeat quantifiers on lookahead assertions. Perl permits +them, but they do not mean what you might think. For example, (?!a){3} does +not assert that the next three characters are not "a". It just asserts that the +next character is not "a" three times. + +3. Capturing subpatterns that occur inside negative lookahead assertions are +counted, but their entries in the offsets vector are never set. Perl sets its +numerical variables from any such patterns that are matched before the +assertion fails to match something (thereby succeeding), but only if the +negative lookahead assertion contains just one branch. + +4. Though binary zero characters are supported in the subject string, they are +not allowed in a pattern string because it is passed as a normal C string, +terminated by zero. The escape sequence "\\0" can be used in the pattern to +represent a binary zero. + +5. The following Perl escape sequences are not supported: \\l, \\u, \\L, \\U, +\\E, \\Q. In fact these are implemented by Perl's general string-handling and +are not part of its pattern matching engine. + +6. The Perl \\G assertion is not supported as it is not relevant to single +pattern matches. + +7. Fairly obviously, PCRE does not support the (?{code}) and (?p{code}) +constructions. However, there is some experimental support for recursive +patterns using the non-Perl item (?R). + +8. There are at the time of writing some oddities in Perl 5.005_02 concerned +with the settings of captured strings when part of a pattern is repeated. For +example, matching "aba" against the pattern /^(a(b)?)+$/ sets $2 to the value +"b", but matching "aabbaa" against /^(aa(bb)?)+$/ leaves $2 unset. However, if +the pattern is changed to /^(aa(b(b))?)+$/ then $2 (and $3) are set. + +In Perl 5.004 $2 is set in both cases, and that is also true of PCRE. If in the +future Perl changes to a consistent state that is different, PCRE may change to +follow. + +9. Another as yet unresolved discrepancy is that in Perl 5.005_02 the pattern +/^(a)?(?(1)a|b)+$/ matches the string "a", whereas in PCRE it does not. +However, in both Perl and PCRE /^(a)?a/ matched against "a" leaves $1 unset. + +10. PCRE provides some extensions to the Perl regular expression facilities: + +(a) Although lookbehind assertions must match fixed length strings, each +alternative branch of a lookbehind assertion can match a different length of +string. Perl 5.005 requires them all to have the same length. + +(b) If PCRE_DOLLAR_ENDONLY is set and PCRE_MULTILINE is not set, the $ meta- +character matches only at the very end of the string. + +(c) If PCRE_EXTRA is set, a backslash followed by a letter with no special +meaning is faulted. + +(d) If PCRE_UNGREEDY is set, the greediness of the repetition quantifiers is +inverted, that is, by default they are not greedy, but if followed by a +question mark they are. + +(e) PCRE_ANCHORED can be used to force a pattern to be tried only at the start +of the subject. + +(f) The PCRE_NOTBOL, PCRE_NOTEOL, and PCRE_NOTEMPTY options for +\fBpcre_exec()\fR have no Perl equivalents. + +(g) The (?R) construct allows for recursive pattern matching (Perl 5.6 can do +this using the (?p{code}) construct, which PCRE cannot of course support.) + + +.SH REGULAR EXPRESSION DETAILS +The syntax and semantics of the regular expressions supported by PCRE are +described below. Regular expressions are also described in the Perl +documentation and in a number of other books, some of which have copious +examples. Jeffrey Friedl's "Mastering Regular Expressions", published by +O'Reilly (ISBN 1-56592-257), covers them in great detail. + +The description here is intended as reference documentation. The basic +operation of PCRE is on strings of bytes. However, there is the beginnings of +some support for UTF-8 character strings. To use this support you must +configure PCRE to include it, and then call \fBpcre_compile()\fR with the +PCRE_UTF8 option. How this affects the pattern matching is described in the +final section of this document. + +A regular expression is a pattern that is matched against a subject string from +left to right. Most characters stand for themselves in a pattern, and match the +corresponding characters in the subject. As a trivial example, the pattern + + The quick brown fox + +matches a portion of a subject string that is identical to itself. The power of +regular expressions comes from the ability to include alternatives and +repetitions in the pattern. These are encoded in the pattern by the use of +\fImeta-characters\fR, which do not stand for themselves but instead are +interpreted in some special way. + +There are two different sets of meta-characters: those that are recognized +anywhere in the pattern except within square brackets, and those that are +recognized in square brackets. Outside square brackets, the meta-characters are +as follows: + + \\ general escape character with several uses + ^ assert start of subject (or line, in multiline mode) + $ assert end of subject (or line, in multiline mode) + . match any character except newline (by default) + [ start character class definition + | start of alternative branch + ( start subpattern + ) end subpattern + ? extends the meaning of ( + also 0 or 1 quantifier + also quantifier minimizer + * 0 or more quantifier + + 1 or more quantifier + { start min/max quantifier + +Part of a pattern that is in square brackets is called a "character class". In +a character class the only meta-characters are: + + \\ general escape character + ^ negate the class, but only if the first character + - indicates character range + ] terminates the character class + +The following sections describe the use of each of the meta-characters. + + +.SH BACKSLASH +The backslash character has several uses. Firstly, if it is followed by a +non-alphameric character, it takes away any special meaning that character may +have. This use of backslash as an escape character applies both inside and +outside character classes. + +For example, if you want to match a "*" character, you write "\\*" in the +pattern. This applies whether or not the following character would otherwise be +interpreted as a meta-character, so it is always safe to precede a +non-alphameric with "\\" to specify that it stands for itself. In particular, +if you want to match a backslash, you write "\\\\". + +If a pattern is compiled with the PCRE_EXTENDED option, whitespace in the +pattern (other than in a character class) and characters between a "#" outside +a character class and the next newline character are ignored. An escaping +backslash can be used to include a whitespace or "#" character as part of the +pattern. + +A second use of backslash provides a way of encoding non-printing characters +in patterns in a visible manner. There is no restriction on the appearance of +non-printing characters, apart from the binary zero that terminates a pattern, +but when a pattern is being prepared by text editing, it is usually easier to +use one of the following escape sequences than the binary character it +represents: + + \\a alarm, that is, the BEL character (hex 07) + \\cx "control-x", where x is any character + \\e escape (hex 1B) + \\f formfeed (hex 0C) + \\n newline (hex 0A) + \\r carriage return (hex 0D) + \\t tab (hex 09) + \\xhh character with hex code hh + \\ddd character with octal code ddd, or backreference + +The precise effect of "\\cx" is as follows: if "x" is a lower case letter, it +is converted to upper case. Then bit 6 of the character (hex 40) is inverted. +Thus "\\cz" becomes hex 1A, but "\\c{" becomes hex 3B, while "\\c;" becomes hex +7B. + +After "\\x", up to two hexadecimal digits are read (letters can be in upper or +lower case). + +After "\\0" up to two further octal digits are read. In both cases, if there +are fewer than two digits, just those that are present are used. Thus the +sequence "\\0\\x\\07" specifies two binary zeros followed by a BEL character. +Make sure you supply two digits after the initial zero if the character that +follows is itself an octal digit. + +The handling of a backslash followed by a digit other than 0 is complicated. +Outside a character class, PCRE reads it and any following digits as a decimal +number. If the number is less than 10, or if there have been at least that many +previous capturing left parentheses in the expression, the entire sequence is +taken as a \fIback reference\fR. A description of how this works is given +later, following the discussion of parenthesized subpatterns. + +Inside a character class, or if the decimal number is greater than 9 and there +have not been that many capturing subpatterns, PCRE re-reads up to three octal +digits following the backslash, and generates a single byte from the least +significant 8 bits of the value. Any subsequent digits stand for themselves. +For example: + + \\040 is another way of writing a space + \\40 is the same, provided there are fewer than 40 + previous capturing subpatterns + \\7 is always a back reference + \\11 might be a back reference, or another way of + writing a tab + \\011 is always a tab + \\0113 is a tab followed by the character "3" + \\113 is the character with octal code 113 (since there + can be no more than 99 back references) + \\377 is a byte consisting entirely of 1 bits + \\81 is either a back reference, or a binary zero + followed by the two characters "8" and "1" + +Note that octal values of 100 or greater must not be introduced by a leading +zero, because no more than three octal digits are ever read. + +All the sequences that define a single byte value can be used both inside and +outside character classes. In addition, inside a character class, the sequence +"\\b" is interpreted as the backspace character (hex 08). Outside a character +class it has a different meaning (see below). + +The third use of backslash is for specifying generic character types: + + \\d any decimal digit + \\D any character that is not a decimal digit + \\s any whitespace character + \\S any character that is not a whitespace character + \\w any "word" character + \\W any "non-word" character + +Each pair of escape sequences partitions the complete set of characters into +two disjoint sets. Any given character matches one, and only one, of each pair. + +A "word" character is any letter or digit or the underscore character, that is, +any character which can be part of a Perl "word". The definition of letters and +digits is controlled by PCRE's character tables, and may vary if locale- +specific matching is taking place (see "Locale support" above). For example, in +the "fr" (French) locale, some character codes greater than 128 are used for +accented letters, and these are matched by \\w. + +These character type sequences can appear both inside and outside character +classes. They each match one character of the appropriate type. If the current +matching point is at the end of the subject string, all of them fail, since +there is no character to match. + +The fourth use of backslash is for certain simple assertions. An assertion +specifies a condition that has to be met at a particular point in a match, +without consuming any characters from the subject string. The use of +subpatterns for more complicated assertions is described below. The backslashed +assertions are + + \\b word boundary + \\B not a word boundary + \\A start of subject (independent of multiline mode) + \\Z end of subject or newline at end (independent of multiline mode) + \\z end of subject (independent of multiline mode) + +These assertions may not appear in character classes (but note that "\\b" has a +different meaning, namely the backspace character, inside a character class). + +A word boundary is a position in the subject string where the current character +and the previous character do not both match \\w or \\W (i.e. one matches +\\w and the other matches \\W), or the start or end of the string if the +first or last character matches \\w, respectively. + +The \\A, \\Z, and \\z assertions differ from the traditional circumflex and +dollar (described below) in that they only ever match at the very start and end +of the subject string, whatever options are set. They are not affected by the +PCRE_NOTBOL or PCRE_NOTEOL options. If the \fIstartoffset\fR argument of +\fBpcre_exec()\fR is non-zero, \\A can never match. The difference between \\Z +and \\z is that \\Z matches before a newline that is the last character of the +string as well as at the end of the string, whereas \\z matches only at the +end. + + +.SH CIRCUMFLEX AND DOLLAR +Outside a character class, in the default matching mode, the circumflex +character is an assertion which is true only if the current matching point is +at the start of the subject string. If the \fIstartoffset\fR argument of +\fBpcre_exec()\fR is non-zero, circumflex can never match. Inside a character +class, circumflex has an entirely different meaning (see below). + +Circumflex need not be the first character of the pattern if a number of +alternatives are involved, but it should be the first thing in each alternative +in which it appears if the pattern is ever to match that branch. If all +possible alternatives start with a circumflex, that is, if the pattern is +constrained to match only at the start of the subject, it is said to be an +"anchored" pattern. (There are also other constructs that can cause a pattern +to be anchored.) + +A dollar character is an assertion which is true only if the current matching +point is at the end of the subject string, or immediately before a newline +character that is the last character in the string (by default). Dollar need +not be the last character of the pattern if a number of alternatives are +involved, but it should be the last item in any branch in which it appears. +Dollar has no special meaning in a character class. + +The meaning of dollar can be changed so that it matches only at the very end of +the string, by setting the PCRE_DOLLAR_ENDONLY option at compile or matching +time. This does not affect the \\Z assertion. + +The meanings of the circumflex and dollar characters are changed if the +PCRE_MULTILINE option is set. When this is the case, they match immediately +after and immediately before an internal "\\n" character, respectively, in +addition to matching at the start and end of the subject string. For example, +the pattern /^abc$/ matches the subject string "def\\nabc" in multiline mode, +but not otherwise. Consequently, patterns that are anchored in single line mode +because all branches start with "^" are not anchored in multiline mode, and a +match for circumflex is possible when the \fIstartoffset\fR argument of +\fBpcre_exec()\fR is non-zero. The PCRE_DOLLAR_ENDONLY option is ignored if +PCRE_MULTILINE is set. + +Note that the sequences \\A, \\Z, and \\z can be used to match the start and +end of the subject in both modes, and if all branches of a pattern start with +\\A it is always anchored, whether PCRE_MULTILINE is set or not. + + +.SH FULL STOP (PERIOD, DOT) +Outside a character class, a dot in the pattern matches any one character in +the subject, including a non-printing character, but not (by default) newline. +If the PCRE_DOTALL option is set, dots match newlines as well. The handling of +dot is entirely independent of the handling of circumflex and dollar, the only +relationship being that they both involve newline characters. Dot has no +special meaning in a character class. + + +.SH SQUARE BRACKETS +An opening square bracket introduces a character class, terminated by a closing +square bracket. A closing square bracket on its own is not special. If a +closing square bracket is required as a member of the class, it should be the +first data character in the class (after an initial circumflex, if present) or +escaped with a backslash. + +A character class matches a single character in the subject; the character must +be in the set of characters defined by the class, unless the first character in +the class is a circumflex, in which case the subject character must not be in +the set defined by the class. If a circumflex is actually required as a member +of the class, ensure it is not the first character, or escape it with a +backslash. + +For example, the character class [aeiou] matches any lower case vowel, while +[^aeiou] matches any character that is not a lower case vowel. Note that a +circumflex is just a convenient notation for specifying the characters which +are in the class by enumerating those that are not. It is not an assertion: it +still consumes a character from the subject string, and fails if the current +pointer is at the end of the string. + +When caseless matching is set, any letters in a class represent both their +upper case and lower case versions, so for example, a caseless [aeiou] matches +"A" as well as "a", and a caseless [^aeiou] does not match "A", whereas a +caseful version would. + +The newline character is never treated in any special way in character classes, +whatever the setting of the PCRE_DOTALL or PCRE_MULTILINE options is. A class +such as [^a] will always match a newline. + +The minus (hyphen) character can be used to specify a range of characters in a +character class. For example, [d-m] matches any letter between d and m, +inclusive. If a minus character is required in a class, it must be escaped with +a backslash or appear in a position where it cannot be interpreted as +indicating a range, typically as the first or last character in the class. + +It is not possible to have the literal character "]" as the end character of a +range. A pattern such as [W-]46] is interpreted as a class of two characters +("W" and "-") followed by a literal string "46]", so it would match "W46]" or +"-46]". However, if the "]" is escaped with a backslash it is interpreted as +the end of range, so [W-\\]46] is interpreted as a single class containing a +range followed by two separate characters. The octal or hexadecimal +representation of "]" can also be used to end a range. + +Ranges operate in ASCII collating sequence. They can also be used for +characters specified numerically, for example [\\000-\\037]. If a range that +includes letters is used when caseless matching is set, it matches the letters +in either case. For example, [W-c] is equivalent to [][\\^_`wxyzabc], matched +caselessly, and if character tables for the "fr" locale are in use, +[\\xc8-\\xcb] matches accented E characters in both cases. + +The character types \\d, \\D, \\s, \\S, \\w, and \\W may also appear in a +character class, and add the characters that they match to the class. For +example, [\\dABCDEF] matches any hexadecimal digit. A circumflex can +conveniently be used with the upper case character types to specify a more +restricted set of characters than the matching lower case type. For example, +the class [^\\W_] matches any letter or digit, but not underscore. + +All non-alphameric characters other than \\, -, ^ (at the start) and the +terminating ] are non-special in character classes, but it does no harm if they +are escaped. + + +.SH POSIX CHARACTER CLASSES +Perl 5.6 (not yet released at the time of writing) is going to support the +POSIX notation for character classes, which uses names enclosed by [: and :] +within the enclosing square brackets. PCRE supports this notation. For example, + + [01[:alpha:]%] + +matches "0", "1", any alphabetic character, or "%". The supported class names +are + + alnum letters and digits + alpha letters + ascii character codes 0 - 127 + cntrl control characters + digit decimal digits (same as \\d) + graph printing characters, excluding space + lower lower case letters + print printing characters, including space + punct printing characters, excluding letters and digits + space white space (same as \\s) + upper upper case letters + word "word" characters (same as \\w) + xdigit hexadecimal digits + +The names "ascii" and "word" are Perl extensions. Another Perl extension is +negation, which is indicated by a ^ character after the colon. For example, + + [12[:^digit:]] + +matches "1", "2", or any non-digit. PCRE (and Perl) also recognize the POSIX +syntax [.ch.] and [=ch=] where "ch" is a "collating element", but these are not +supported, and an error is given if they are encountered. + + +.SH VERTICAL BAR +Vertical bar characters are used to separate alternative patterns. For example, +the pattern + + gilbert|sullivan + +matches either "gilbert" or "sullivan". Any number of alternatives may appear, +and an empty alternative is permitted (matching the empty string). +The matching process tries each alternative in turn, from left to right, +and the first one that succeeds is used. If the alternatives are within a +subpattern (defined below), "succeeds" means matching the rest of the main +pattern as well as the alternative in the subpattern. + + +.SH INTERNAL OPTION SETTING +The settings of PCRE_CASELESS, PCRE_MULTILINE, PCRE_DOTALL, and PCRE_EXTENDED +can be changed from within the pattern by a sequence of Perl option letters +enclosed between "(?" and ")". The option letters are + + i for PCRE_CASELESS + m for PCRE_MULTILINE + s for PCRE_DOTALL + x for PCRE_EXTENDED + +For example, (?im) sets caseless, multiline matching. It is also possible to +unset these options by preceding the letter with a hyphen, and a combined +setting and unsetting such as (?im-sx), which sets PCRE_CASELESS and +PCRE_MULTILINE while unsetting PCRE_DOTALL and PCRE_EXTENDED, is also +permitted. If a letter appears both before and after the hyphen, the option is +unset. + +The scope of these option changes depends on where in the pattern the setting +occurs. For settings that are outside any subpattern (defined below), the +effect is the same as if the options were set or unset at the start of +matching. The following patterns all behave in exactly the same way: + + (?i)abc + a(?i)bc + ab(?i)c + abc(?i) + +which in turn is the same as compiling the pattern abc with PCRE_CASELESS set. +In other words, such "top level" settings apply to the whole pattern (unless +there are other changes inside subpatterns). If there is more than one setting +of the same option at top level, the rightmost setting is used. + +If an option change occurs inside a subpattern, the effect is different. This +is a change of behaviour in Perl 5.005. An option change inside a subpattern +affects only that part of the subpattern that follows it, so + + (a(?i)b)c + +matches abc and aBc and no other strings (assuming PCRE_CASELESS is not used). +By this means, options can be made to have different settings in different +parts of the pattern. Any changes made in one alternative do carry on +into subsequent branches within the same subpattern. For example, + + (a(?i)b|c) + +matches "ab", "aB", "c", and "C", even though when matching "C" the first +branch is abandoned before the option setting. This is because the effects of +option settings happen at compile time. There would be some very weird +behaviour otherwise. + +The PCRE-specific options PCRE_UNGREEDY and PCRE_EXTRA can be changed in the +same way as the Perl-compatible options by using the characters U and X +respectively. The (?X) flag setting is special in that it must always occur +earlier in the pattern than any of the additional features it turns on, even +when it is at top level. It is best put at the start. + + +.SH SUBPATTERNS +Subpatterns are delimited by parentheses (round brackets), which can be nested. +Marking part of a pattern as a subpattern does two things: + +1. It localizes a set of alternatives. For example, the pattern + + cat(aract|erpillar|) + +matches one of the words "cat", "cataract", or "caterpillar". Without the +parentheses, it would match "cataract", "erpillar" or the empty string. + +2. It sets up the subpattern as a capturing subpattern (as defined above). +When the whole pattern matches, that portion of the subject string that matched +the subpattern is passed back to the caller via the \fIovector\fR argument of +\fBpcre_exec()\fR. Opening parentheses are counted from left to right (starting +from 1) to obtain the numbers of the capturing subpatterns. + +For example, if the string "the red king" is matched against the pattern + + the ((red|white) (king|queen)) + +the captured substrings are "red king", "red", and "king", and are numbered 1, +2, and 3, respectively. + +The fact that plain parentheses fulfil two functions is not always helpful. +There are often times when a grouping subpattern is required without a +capturing requirement. If an opening parenthesis is followed by "?:", the +subpattern does not do any capturing, and is not counted when computing the +number of any subsequent capturing subpatterns. For example, if the string "the +white queen" is matched against the pattern + + the ((?:red|white) (king|queen)) + +the captured substrings are "white queen" and "queen", and are numbered 1 and +2. The maximum number of captured substrings is 99, and the maximum number of +all subpatterns, both capturing and non-capturing, is 200. + +As a convenient shorthand, if any option settings are required at the start of +a non-capturing subpattern, the option letters may appear between the "?" and +the ":". Thus the two patterns + + (?i:saturday|sunday) + (?:(?i)saturday|sunday) + +match exactly the same set of strings. Because alternative branches are tried +from left to right, and options are not reset until the end of the subpattern +is reached, an option setting in one branch does affect subsequent branches, so +the above patterns match "SUNDAY" as well as "Saturday". + + +.SH REPETITION +Repetition is specified by quantifiers, which can follow any of the following +items: + + a single character, possibly escaped + the . metacharacter + a character class + a back reference (see next section) + a parenthesized subpattern (unless it is an assertion - see below) + +The general repetition quantifier specifies a minimum and maximum number of +permitted matches, by giving the two numbers in curly brackets (braces), +separated by a comma. The numbers must be less than 65536, and the first must +be less than or equal to the second. For example: + + z{2,4} + +matches "zz", "zzz", or "zzzz". A closing brace on its own is not a special +character. If the second number is omitted, but the comma is present, there is +no upper limit; if the second number and the comma are both omitted, the +quantifier specifies an exact number of required matches. Thus + + [aeiou]{3,} + +matches at least 3 successive vowels, but may match many more, while + + \\d{8} + +matches exactly 8 digits. An opening curly bracket that appears in a position +where a quantifier is not allowed, or one that does not match the syntax of a +quantifier, is taken as a literal character. For example, {,6} is not a +quantifier, but a literal string of four characters. + +The quantifier {0} is permitted, causing the expression to behave as if the +previous item and the quantifier were not present. + +For convenience (and historical compatibility) the three most common +quantifiers have single-character abbreviations: + + * is equivalent to {0,} + + is equivalent to {1,} + ? is equivalent to {0,1} + +It is possible to construct infinite loops by following a subpattern that can +match no characters with a quantifier that has no upper limit, for example: + + (a?)* + +Earlier versions of Perl and PCRE used to give an error at compile time for +such patterns. However, because there are cases where this can be useful, such +patterns are now accepted, but if any repetition of the subpattern does in fact +match no characters, the loop is forcibly broken. + +By default, the quantifiers are "greedy", that is, they match as much as +possible (up to the maximum number of permitted times), without causing the +rest of the pattern to fail. The classic example of where this gives problems +is in trying to match comments in C programs. These appear between the +sequences /* and */ and within the sequence, individual * and / characters may +appear. An attempt to match C comments by applying the pattern + + /\\*.*\\*/ + +to the string + + /* first command */ not comment /* second comment */ + +fails, because it matches the entire string owing to the greediness of the .* +item. + +However, if a quantifier is followed by a question mark, it ceases to be +greedy, and instead matches the minimum number of times possible, so the +pattern + + /\\*.*?\\*/ + +does the right thing with the C comments. The meaning of the various +quantifiers is not otherwise changed, just the preferred number of matches. +Do not confuse this use of question mark with its use as a quantifier in its +own right. Because it has two uses, it can sometimes appear doubled, as in + + \\d??\\d + +which matches one digit by preference, but can match two if that is the only +way the rest of the pattern matches. + +If the PCRE_UNGREEDY option is set (an option which is not available in Perl), +the quantifiers are not greedy by default, but individual ones can be made +greedy by following them with a question mark. In other words, it inverts the +default behaviour. + +When a parenthesized subpattern is quantified with a minimum repeat count that +is greater than 1 or with a limited maximum, more store is required for the +compiled pattern, in proportion to the size of the minimum or maximum. + +If a pattern starts with .* or .{0,} and the PCRE_DOTALL option (equivalent +to Perl's /s) is set, thus allowing the . to match newlines, the pattern is +implicitly anchored, because whatever follows will be tried against every +character position in the subject string, so there is no point in retrying the +overall match at any position after the first. PCRE treats such a pattern as +though it were preceded by \\A. In cases where it is known that the subject +string contains no newlines, it is worth setting PCRE_DOTALL when the pattern +begins with .* in order to obtain this optimization, or alternatively using ^ +to indicate anchoring explicitly. + +When a capturing subpattern is repeated, the value captured is the substring +that matched the final iteration. For example, after + + (tweedle[dume]{3}\\s*)+ + +has matched "tweedledum tweedledee" the value of the captured substring is +"tweedledee". However, if there are nested capturing subpatterns, the +corresponding captured values may have been set in previous iterations. For +example, after + + /(a|(b))+/ + +matches "aba" the value of the second captured substring is "b". + + +.SH BACK REFERENCES +Outside a character class, a backslash followed by a digit greater than 0 (and +possibly further digits) is a back reference to a capturing subpattern earlier +(i.e. to its left) in the pattern, provided there have been that many previous +capturing left parentheses. + +However, if the decimal number following the backslash is less than 10, it is +always taken as a back reference, and causes an error only if there are not +that many capturing left parentheses in the entire pattern. In other words, the +parentheses that are referenced need not be to the left of the reference for +numbers less than 10. See the section entitled "Backslash" above for further +details of the handling of digits following a backslash. + +A back reference matches whatever actually matched the capturing subpattern in +the current subject string, rather than anything matching the subpattern +itself. So the pattern + + (sens|respons)e and \\1ibility + +matches "sense and sensibility" and "response and responsibility", but not +"sense and responsibility". If caseful matching is in force at the time of the +back reference, the case of letters is relevant. For example, + + ((?i)rah)\\s+\\1 + +matches "rah rah" and "RAH RAH", but not "RAH rah", even though the original +capturing subpattern is matched caselessly. + +There may be more than one back reference to the same subpattern. If a +subpattern has not actually been used in a particular match, any back +references to it always fail. For example, the pattern + + (a|(bc))\\2 + +always fails if it starts to match "a" rather than "bc". Because there may be +up to 99 back references, all digits following the backslash are taken +as part of a potential back reference number. If the pattern continues with a +digit character, some delimiter must be used to terminate the back reference. +If the PCRE_EXTENDED option is set, this can be whitespace. Otherwise an empty +comment can be used. + +A back reference that occurs inside the parentheses to which it refers fails +when the subpattern is first used, so, for example, (a\\1) never matches. +However, such references can be useful inside repeated subpatterns. For +example, the pattern + + (a|b\\1)+ + +matches any number of "a"s and also "aba", "ababbaa" etc. At each iteration of +the subpattern, the back reference matches the character string corresponding +to the previous iteration. In order for this to work, the pattern must be such +that the first iteration does not need to match the back reference. This can be +done using alternation, as in the example above, or by a quantifier with a +minimum of zero. + + +.SH ASSERTIONS +An assertion is a test on the characters following or preceding the current +matching point that does not actually consume any characters. The simple +assertions coded as \\b, \\B, \\A, \\Z, \\z, ^ and $ are described above. More +complicated assertions are coded as subpatterns. There are two kinds: those +that look ahead of the current position in the subject string, and those that +look behind it. + +An assertion subpattern is matched in the normal way, except that it does not +cause the current matching position to be changed. Lookahead assertions start +with (?= for positive assertions and (?! for negative assertions. For example, + + \\w+(?=;) + +matches a word followed by a semicolon, but does not include the semicolon in +the match, and + + foo(?!bar) + +matches any occurrence of "foo" that is not followed by "bar". Note that the +apparently similar pattern + + (?!foo)bar + +does not find an occurrence of "bar" that is preceded by something other than +"foo"; it finds any occurrence of "bar" whatsoever, because the assertion +(?!foo) is always true when the next three characters are "bar". A +lookbehind assertion is needed to achieve this effect. + +Lookbehind assertions start with (?<= for positive assertions and (? as in this example: + + (?>\\d+)bar + +This kind of parenthesis "locks up" the part of the pattern it contains once +it has matched, and a failure further into the pattern is prevented from +backtracking into it. Backtracking past it to previous items, however, works as +normal. + +An alternative description is that a subpattern of this type matches the string +of characters that an identical standalone pattern would match, if anchored at +the current point in the subject string. + +Once-only subpatterns are not capturing subpatterns. Simple cases such as the +above example can be thought of as a maximizing repeat that must swallow +everything it can. So, while both \\d+ and \\d+? are prepared to adjust the +number of digits they match in order to make the rest of the pattern match, +(?>\\d+) can only match an entire sequence of digits. + +This construction can of course contain arbitrarily complicated subpatterns, +and it can be nested. + +Once-only subpatterns can be used in conjunction with lookbehind assertions to +specify efficient matching at the end of the subject string. Consider a simple +pattern such as + + abcd$ + +when applied to a long string which does not match. Because matching proceeds +from left to right, PCRE will look for each "a" in the subject and then see if +what follows matches the rest of the pattern. If the pattern is specified as + + ^.*abcd$ + +the initial .* matches the entire string at first, but when this fails (because +there is no following "a"), it backtracks to match all but the last character, +then all but the last two characters, and so on. Once again the search for "a" +covers the entire string, from right to left, so we are no better off. However, +if the pattern is written as + + ^(?>.*)(?<=abcd) + +there can be no backtracking for the .* item; it can match only the entire +string. The subsequent lookbehind assertion does a single test on the last four +characters. If it fails, the match fails immediately. For long strings, this +approach makes a significant difference to the processing time. + +When a pattern contains an unlimited repeat inside a subpattern that can itself +be repeated an unlimited number of times, the use of a once-only subpattern is +the only way to avoid some failing matches taking a very long time indeed. +The pattern + + (\\D+|<\\d+>)*[!?] + +matches an unlimited number of substrings that either consist of non-digits, or +digits enclosed in <>, followed by either ! or ?. When it matches, it runs +quickly. However, if it is applied to + + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + +it takes a long time before reporting failure. This is because the string can +be divided between the two repeats in a large number of ways, and all have to +be tried. (The example used [!?] rather than a single character at the end, +because both PCRE and Perl have an optimization that allows for fast failure +when a single character is used. They remember the last single character that +is required for a match, and fail early if it is not present in the string.) +If the pattern is changed to + + ((?>\\D+)|<\\d+>)*[!?] + +sequences of non-digits cannot be broken, and failure happens quickly. + + +.SH CONDITIONAL SUBPATTERNS +It is possible to cause the matching process to obey a subpattern +conditionally or to choose between two alternative subpatterns, depending on +the result of an assertion, or whether a previous capturing subpattern matched +or not. The two possible forms of conditional subpattern are + + (?(condition)yes-pattern) + (?(condition)yes-pattern|no-pattern) + +If the condition is satisfied, the yes-pattern is used; otherwise the +no-pattern (if present) is used. If there are more than two alternatives in the +subpattern, a compile-time error occurs. + +There are two kinds of condition. If the text between the parentheses consists +of a sequence of digits, the condition is satisfied if the capturing subpattern +of that number has previously matched. The number must be greater than zero. +Consider the following pattern, which contains non-significant white space to +make it more readable (assume the PCRE_EXTENDED option) and to divide it into +three parts for ease of discussion: + + ( \\( )? [^()]+ (?(1) \\) ) + +The first part matches an optional opening parenthesis, and if that +character is present, sets it as the first captured substring. The second part +matches one or more characters that are not parentheses. The third part is a +conditional subpattern that tests whether the first set of parentheses matched +or not. If they did, that is, if subject started with an opening parenthesis, +the condition is true, and so the yes-pattern is executed and a closing +parenthesis is required. Otherwise, since no-pattern is not present, the +subpattern matches nothing. In other words, this pattern matches a sequence of +non-parentheses, optionally enclosed in parentheses. + +If the condition is not a sequence of digits, it must be an assertion. This may +be a positive or negative lookahead or lookbehind assertion. Consider this +pattern, again containing non-significant white space, and with the two +alternatives on the second line: + + (?(?=[^a-z]*[a-z]) + \\d{2}-[a-z]{3}-\\d{2} | \\d{2}-\\d{2}-\\d{2} ) + +The condition is a positive lookahead assertion that matches an optional +sequence of non-letters followed by a letter. In other words, it tests for the +presence of at least one letter in the subject. If a letter is found, the +subject is matched against the first alternative; otherwise it is matched +against the second. This pattern matches strings in one of the two forms +dd-aaa-dd or dd-dd-dd, where aaa are letters and dd are digits. + + +.SH COMMENTS +The sequence (?# marks the start of a comment which continues up to the next +closing parenthesis. Nested parentheses are not permitted. The characters +that make up a comment play no part in the pattern matching at all. + +If the PCRE_EXTENDED option is set, an unescaped # character outside a +character class introduces a comment that continues up to the next newline +character in the pattern. + + +.SH RECURSIVE PATTERNS +Consider the problem of matching a string in parentheses, allowing for +unlimited nested parentheses. Without the use of recursion, the best that can +be done is to use a pattern that matches up to some fixed depth of nesting. It +is not possible to handle an arbitrary nesting depth. Perl 5.6 has provided an +experimental facility that allows regular expressions to recurse (amongst other +things). It does this by interpolating Perl code in the expression at run time, +and the code can refer to the expression itself. A Perl pattern to solve the +parentheses problem can be created like this: + + $re = qr{\\( (?: (?>[^()]+) | (?p{$re}) )* \\)}x; + +The (?p{...}) item interpolates Perl code at run time, and in this case refers +recursively to the pattern in which it appears. Obviously, PCRE cannot support +the interpolation of Perl code. Instead, the special item (?R) is provided for +the specific case of recursion. This PCRE pattern solves the parentheses +problem (assume the PCRE_EXTENDED option is set so that white space is +ignored): + + \\( ( (?>[^()]+) | (?R) )* \\) + +First it matches an opening parenthesis. Then it matches any number of +substrings which can either be a sequence of non-parentheses, or a recursive +match of the pattern itself (i.e. a correctly parenthesized substring). Finally +there is a closing parenthesis. + +This particular example pattern contains nested unlimited repeats, and so the +use of a once-only subpattern for matching strings of non-parentheses is +important when applying the pattern to strings that do not match. For example, +when it is applied to + + (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa() + +it yields "no match" quickly. However, if a once-only subpattern is not used, +the match runs for a very long time indeed because there are so many different +ways the + and * repeats can carve up the subject, and all have to be tested +before failure can be reported. + +The values set for any capturing subpatterns are those from the outermost level +of the recursion at which the subpattern value is set. If the pattern above is +matched against + + (ab(cd)ef) + +the value for the capturing parentheses is "ef", which is the last value taken +on at the top level. If additional parentheses are added, giving + + \\( ( ( (?>[^()]+) | (?R) )* ) \\) + ^ ^ + ^ ^ +the string they capture is "ab(cd)ef", the contents of the top level +parentheses. If there are more than 15 capturing parentheses in a pattern, PCRE +has to obtain extra memory to store data during a recursion, which it does by +using \fBpcre_malloc\fR, freeing it via \fBpcre_free\fR afterwards. If no +memory can be obtained, it saves data for the first 15 capturing parentheses +only, as there is no way to give an out-of-memory error from within a +recursion. + + +.SH PERFORMANCE +Certain items that may appear in patterns are more efficient than others. It is +more efficient to use a character class like [aeiou] than a set of alternatives +such as (a|e|i|o|u). In general, the simplest construction that provides the +required behaviour is usually the most efficient. Jeffrey Friedl's book +contains a lot of discussion about optimizing regular expressions for efficient +performance. + +When a pattern begins with .* and the PCRE_DOTALL option is set, the pattern is +implicitly anchored by PCRE, since it can match only at the start of a subject +string. However, if PCRE_DOTALL is not set, PCRE cannot make this optimization, +because the . metacharacter does not then match a newline, and if the subject +string contains newlines, the pattern may match from the character immediately +following one of them instead of from the very start. For example, the pattern + + (.*) second + +matches the subject "first\\nand second" (where \\n stands for a newline +character) with the first captured substring being "and". In order to do this, +PCRE has to retry the match starting after every newline in the subject. + +If you are using such a pattern with subject strings that do not contain +newlines, the best performance is obtained by setting PCRE_DOTALL, or starting +the pattern with ^.* to indicate explicit anchoring. That saves PCRE from +having to scan along the subject looking for a newline to restart at. + +Beware of patterns that contain nested indefinite repeats. These can take a +long time to run when applied to a string that does not match. Consider the +pattern fragment + + (a+)* + +This can match "aaaa" in 33 different ways, and this number increases very +rapidly as the string gets longer. (The * repeat can match 0, 1, 2, 3, or 4 +times, and for each of those cases other than 0, the + repeats can match +different numbers of times.) When the remainder of the pattern is such that the +entire match is going to fail, PCRE has in principle to try every possible +variation, and this can take an extremely long time. + +An optimization catches some of the more simple cases such as + + (a+)*b + +where a literal character follows. Before embarking on the standard matching +procedure, PCRE checks that there is a "b" later in the subject string, and if +there is not, it fails the match immediately. However, when there is no +following literal this optimization cannot be used. You can see the difference +by comparing the behaviour of + + (a+)*\\d + +with the pattern above. The former gives a failure almost instantly when +applied to a whole line of "a" characters, whereas the latter takes an +appreciable time with strings longer than about 20 characters. + + +.SH UTF-8 SUPPORT +Starting at release 3.3, PCRE has some support for character strings encoded +in the UTF-8 format. This is incomplete, and is regarded as experimental. In +order to use it, you must configure PCRE to include UTF-8 support in the code, +and, in addition, you must call \fBpcre_compile()\fR with the PCRE_UTF8 option +flag. When you do this, both the pattern and any subject strings that are +matched against it are treated as UTF-8 strings instead of just strings of +bytes, but only in the cases that are mentioned below. + +If you compile PCRE with UTF-8 support, but do not use it at run time, the +library will be a bit bigger, but the additional run time overhead is limited +to testing the PCRE_UTF8 flag in several places, so should not be very large. + +PCRE assumes that the strings it is given contain valid UTF-8 codes. It does +not diagnose invalid UTF-8 strings. If you pass invalid UTF-8 strings to PCRE, +the results are undefined. + +Running with PCRE_UTF8 set causes these changes in the way PCRE works: + +1. In a pattern, the escape sequence \\x{...}, where the contents of the braces +is a string of hexadecimal digits, is interpreted as a UTF-8 character whose +code number is the given hexadecimal number, for example: \\x{1234}. This +inserts from one to six literal bytes into the pattern, using the UTF-8 +encoding. If a non-hexadecimal digit appears between the braces, the item is +not recognized. + +2. The original hexadecimal escape sequence, \\xhh, generates a two-byte UTF-8 +character if its value is greater than 127. + +3. Repeat quantifiers are NOT correctly handled if they follow a multibyte +character. For example, \\x{100}* and \\xc3+ do not work. If you want to +repeat such characters, you must enclose them in non-capturing parentheses, +for example (?:\\x{100}), at present. + +4. The dot metacharacter matches one UTF-8 character instead of a single byte. + +5. Unlike literal UTF-8 characters, the dot metacharacter followed by a +repeat quantifier does operate correctly on UTF-8 characters instead of +single bytes. + +4. Although the \\x{...} escape is permitted in a character class, characters +whose values are greater than 255 cannot be included in a class. + +5. A class is matched against a UTF-8 character instead of just a single byte, +but it can match only characters whose values are less than 256. Characters +with greater values always fail to match a class. + +6. Repeated classes work correctly on multiple characters. + +7. Classes containing just a single character whose value is greater than 127 +(but less than 256), for example, [\\x80] or [^\\x{93}], do not work because +these are optimized into single byte matches. In the first case, of course, +the class brackets are just redundant. + +8. Lookbehind assertions move backwards in the subject by a fixed number of +characters instead of a fixed number of bytes. Simple cases have been tested +to work correctly, but there may be hidden gotchas herein. + +9. The character types such as \\d and \\w do not work correctly with UTF-8 +characters. They continue to test a single byte. + +10. Anything not explicitly mentioned here continues to work in bytes rather +than in characters. + +The following UTF-8 features of Perl 5.6 are not implemented: + +1. The escape sequence \\C to match a single byte. + +2. The use of Unicode tables and properties and escapes \\p, \\P, and \\X. + + +.SH SAMPLE PROGRAM +The code below is a simple, complete demonstration program, to get you started +with using PCRE. This code is also supplied in the file \fIpcredemo.c\fR in the +PCRE distribution. + +The program compiles the regular expression that is its first argument, and +matches it against the subject string in its second argument. No options are +set, and default character tables are used. If matching succeeds, the program +outputs the portion of the subject that matched, together with the contents of +any captured substrings. + +On a Unix system that has PCRE installed in \fI/usr/local\fR, you can compile +the demonstration program using a command like this: + + gcc -o pcredemo pcredemo.c -I/usr/local/include -L/usr/local/lib -lpcre + +Then you can run simple tests like this: + + ./pcredemo 'cat|dog' 'the cat sat on the mat' + +Note that there is a much more comprehensive test program, called +\fBpcretest\fR, which supports many more facilities for testing regular +expressions. The \fBpcredemo\fR program is provided as a simple coding example. + +On some operating systems (e.g. Solaris) you may get an error like this when +you try to run \fBpcredemo\fR: + + ld.so.1: a.out: fatal: libpcre.so.0: open failed: No such file or directory + +This is caused by the way shared library support works on those systems. You +need to add + + -R/usr/local/lib + +to the compile command to get round this problem. Here's the code: + + #include + #include + #include + + #define OVECCOUNT 30 /* should be a multiple of 3 */ + + int main(int argc, char **argv) + { + pcre *re; + const char *error; + int erroffset; + int ovector[OVECCOUNT]; + int rc, i; + + if (argc != 3) + { + printf("Two arguments required: a regex and a " + "subject string\\n"); + return 1; + } + + /* Compile the regular expression in the first argument */ + + re = pcre_compile( + argv[1], /* the pattern */ + 0, /* default options */ + &error, /* for error message */ + &erroffset, /* for error offset */ + NULL); /* use default character tables */ + + /* Compilation failed: print the error message and exit */ + + if (re == NULL) + { + printf("PCRE compilation failed at offset %d: %s\\n", + erroffset, error); + return 1; + } + + /* Compilation succeeded: match the subject in the second + argument */ + + rc = pcre_exec( + re, /* the compiled pattern */ + NULL, /* we didn't study the pattern */ + argv[2], /* the subject string */ + (int)strlen(argv[2]), /* the length of the subject */ + 0, /* start at offset 0 in the subject */ + 0, /* default options */ + ovector, /* vector for substring information */ + OVECCOUNT); /* number of elements in the vector */ + + /* Matching failed: handle error cases */ + + if (rc < 0) + { + switch(rc) + { + case PCRE_ERROR_NOMATCH: printf("No match\\n"); break; + /* + Handle other special cases if you like + */ + default: printf("Matching error %d\\n", rc); break; + } + return 1; + } + + /* Match succeded */ + + printf("Match succeeded\\n"); + + /* The output vector wasn't big enough */ + + if (rc == 0) + { + rc = OVECCOUNT/3; + printf("ovector only has room for %d captured " + substrings\\n", rc - 1); + } + + /* Show substrings stored in the output vector */ + + for (i = 0; i < rc; i++) + { + char *substring_start = argv[2] + ovector[2*i]; + int substring_length = ovector[2*i+1] - ovector[2*i]; + printf("%2d: %.*s\\n", i, substring_length, + substring_start); + } + + return 0; + } + + +.SH AUTHOR +Philip Hazel +.br +University Computing Service, +.br +New Museums Site, +.br +Cambridge CB2 3QG, England. +.br +Phone: +44 1223 334714 + +Last updated: 15 August 2001 +.br +Copyright (c) 1997-2001 University of Cambridge. diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/doc/pcre.html b/rubbos/app/httpd-2.0.64/srclib/pcre/doc/pcre.html new file mode 100644 index 00000000..3e9eb36b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/doc/pcre.html @@ -0,0 +1,2669 @@ + + +pcre specification + + +

    pcre specification

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

    +pcre - Perl-compatible regular expressions. +

    +
  • SYNOPSIS +

    +#include <pcre.h> +

    +

    +pcre *pcre_compile(const char *pattern, int options, +const char **errptr, int *erroffset, +const unsigned char *tableptr); +

    +

    +pcre_extra *pcre_study(const pcre *code, int options, +const char **errptr); +

    +

    +int pcre_exec(const pcre *code, const pcre_extra *extra, +const char *subject, int length, int startoffset, +int options, int *ovector, int ovecsize); +

    +

    +int pcre_copy_substring(const char *subject, int *ovector, +int stringcount, int stringnumber, char *buffer, +int buffersize); +

    +

    +int pcre_get_substring(const char *subject, int *ovector, +int stringcount, int stringnumber, +const char **stringptr); +

    +

    +int pcre_get_substring_list(const char *subject, +int *ovector, int stringcount, const char ***listptr); +

    +

    +void pcre_free_substring(const char *stringptr); +

    +

    +void pcre_free_substring_list(const char **stringptr); +

    +

    +const unsigned char *pcre_maketables(void); +

    +

    +int pcre_fullinfo(const pcre *code, const pcre_extra *extra, +int what, void *where); +

    +

    +int pcre_info(const pcre *code, int *optptr, int +*firstcharptr); +

    +

    +char *pcre_version(void); +

    +

    +void *(*pcre_malloc)(size_t); +

    +

    +void (*pcre_free)(void *); +

    +
  • DESCRIPTION +

    +The PCRE library is a set of functions that implement regular expression +pattern matching using the same syntax and semantics as Perl 5, with just a few +differences (see below). The current implementation corresponds to Perl 5.005, +with some additional features from later versions. This includes some +experimental, incomplete support for UTF-8 encoded strings. Details of exactly +what is and what is not supported are given below. +

    +

    +PCRE has its own native API, which is described in this document. There is also +a set of wrapper functions that correspond to the POSIX regular expression API. +These are described in the pcreposix documentation. +

    +

    +The native API function prototypes are defined in the header file pcre.h, +and on Unix systems the library itself is called libpcre.a, so can be +accessed by adding -lpcre to the command for linking an application which +calls it. The header file defines the macros PCRE_MAJOR and PCRE_MINOR to +contain the major and minor release numbers for the library. Applications can +use these to include support for different releases. +

    +

    +The functions pcre_compile(), pcre_study(), and pcre_exec() +are used for compiling and matching regular expressions. A sample program that +demonstrates the simplest way of using them is given in the file +pcredemo.c. The last section of this man page describes how to run it. +

    +

    +The functions pcre_copy_substring(), pcre_get_substring(), and +pcre_get_substring_list() are convenience functions for extracting +captured substrings from a matched subject string; pcre_free_substring() +and pcre_free_substring_list() are also provided, to free the memory used +for extracted strings. +

    +

    +The function pcre_maketables() is used (optionally) to build a set of +character tables in the current locale for passing to pcre_compile(). +

    +

    +The function pcre_fullinfo() is used to find out information about a +compiled pattern; pcre_info() is an obsolete version which returns only +some of the available information, but is retained for backwards compatibility. +The function pcre_version() returns a pointer to a string containing the +version of PCRE and its date of release. +

    +

    +The global variables pcre_malloc and pcre_free initially contain +the entry points of the standard malloc() and free() functions +respectively. PCRE calls the memory management functions via these variables, +so a calling program can replace them if it wishes to intercept the calls. This +should be done before calling any PCRE functions. +

    +
  • MULTI-THREADING +

    +The PCRE functions can be used in multi-threading applications, with the +proviso that the memory management functions pointed to by pcre_malloc +and pcre_free are shared by all threads. +

    +

    +The compiled form of a regular expression is not altered during matching, so +the same compiled pattern can safely be used by several threads at once. +

    +
  • COMPILING A PATTERN +

    +The function pcre_compile() is called to compile a pattern into an +internal form. The pattern is a C string terminated by a binary zero, and +is passed in the argument pattern. A pointer to a single block of memory +that is obtained via pcre_malloc is returned. This contains the compiled +code and related data. The pcre type is defined for the returned block; +this is a typedef for a structure whose contents are not externally defined. It +is up to the caller to free the memory when it is no longer required. +

    +

    +Although the compiled code of a PCRE regex is relocatable, that is, it does not +depend on memory location, the complete pcre data block is not +fully relocatable, because it contains a copy of the tableptr argument, +which is an address (see below). +

    +

    +The size of a compiled pattern is roughly proportional to the length of the +pattern string, except that each character class (other than those containing +just a single character, negated or not) requires 33 bytes, and repeat +quantifiers with a minimum greater than one or a bounded maximum cause the +relevant portions of the compiled pattern to be replicated. +

    +

    +The options argument contains independent bits that affect the +compilation. It should be zero if no options are required. Some of the options, +in particular, those that are compatible with Perl, can also be set and unset +from within the pattern (see the detailed description of regular expressions +below). For these options, the contents of the options argument specifies +their initial settings at the start of compilation and execution. The +PCRE_ANCHORED option can be set at the time of matching as well as at compile +time. +

    +

    +If errptr is NULL, pcre_compile() returns NULL immediately. +Otherwise, if compilation of a pattern fails, pcre_compile() returns +NULL, and sets the variable pointed to by errptr to point to a textual +error message. The offset from the start of the pattern to the character where +the error was discovered is placed in the variable pointed to by +erroffset, which must not be NULL. If it is, an immediate error is given. +

    +

    +If the final argument, tableptr, is NULL, PCRE uses a default set of +character tables which are built when it is compiled, using the default C +locale. Otherwise, tableptr must be the result of a call to +pcre_maketables(). See the section on locale support below. +

    +

    +This code fragment shows a typical straightforward call to pcre_compile(): +

    +

    +

    +  pcre *re;
    +  const char *error;
    +  int erroffset;
    +  re = pcre_compile(
    +    "^A.*Z",          /* the pattern */
    +    0,                /* default options */
    +    &error,           /* for error message */
    +    &erroffset,       /* for error offset */
    +    NULL);            /* use default character tables */
    +
    +

    +

    +The following option bits are defined in the header file: +

    +

    +

    +  PCRE_ANCHORED
    +
    +

    +

    +If this bit is set, the pattern is forced to be "anchored", that is, it is +constrained to match only at the start of the string which is being searched +(the "subject string"). This effect can also be achieved by appropriate +constructs in the pattern itself, which is the only way to do it in Perl. +

    +

    +

    +  PCRE_CASELESS
    +
    +

    +

    +If this bit is set, letters in the pattern match both upper and lower case +letters. It is equivalent to Perl's /i option. +

    +

    +

    +  PCRE_DOLLAR_ENDONLY
    +
    +

    +

    +If this bit is set, a dollar metacharacter in the pattern matches only at the +end of the subject string. Without this option, a dollar also matches +immediately before the final character if it is a newline (but not before any +other newlines). The PCRE_DOLLAR_ENDONLY option is ignored if PCRE_MULTILINE is +set. There is no equivalent to this option in Perl. +

    +

    +

    +  PCRE_DOTALL
    +
    +

    +

    +If this bit is set, a dot metacharater in the pattern matches all characters, +including newlines. Without it, newlines are excluded. This option is +equivalent to Perl's /s option. A negative class such as [^a] always matches a +newline character, independent of the setting of this option. +

    +

    +

    +  PCRE_EXTENDED
    +
    +

    +

    +If this bit is set, whitespace data characters in the pattern are totally +ignored except when escaped or inside a character class, and characters between +an unescaped # outside a character class and the next newline character, +inclusive, are also ignored. This is equivalent to Perl's /x option, and makes +it possible to include comments inside complicated patterns. Note, however, +that this applies only to data characters. Whitespace characters may never +appear within special character sequences in a pattern, for example within the +sequence (?( which introduces a conditional subpattern. +

    +

    +

    +  PCRE_EXTRA
    +
    +

    +

    +This option was invented in order to turn on additional functionality of PCRE +that is incompatible with Perl, but it is currently of very little use. When +set, any backslash in a pattern that is followed by a letter that has no +special meaning causes an error, thus reserving these combinations for future +expansion. By default, as in Perl, a backslash followed by a letter with no +special meaning is treated as a literal. There are at present no other features +controlled by this option. It can also be set by a (?X) option setting within a +pattern. +

    +

    +

    +  PCRE_MULTILINE
    +
    +

    +

    +By default, PCRE treats the subject string as consisting of a single "line" of +characters (even if it actually contains several newlines). The "start of line" +metacharacter (^) matches only at the start of the string, while the "end of +line" metacharacter ($) matches only at the end of the string, or before a +terminating newline (unless PCRE_DOLLAR_ENDONLY is set). This is the same as +Perl. +

    +

    +When PCRE_MULTILINE it is set, the "start of line" and "end of line" constructs +match immediately following or immediately before any newline in the subject +string, respectively, as well as at the very start and end. This is equivalent +to Perl's /m option. If there are no "\n" characters in a subject string, or +no occurrences of ^ or $ in a pattern, setting PCRE_MULTILINE has no +effect. +

    +

    +

    +  PCRE_UNGREEDY
    +
    +

    +

    +This option inverts the "greediness" of the quantifiers so that they are not +greedy by default, but become greedy if followed by "?". It is not compatible +with Perl. It can also be set by a (?U) option setting within the pattern. +

    +

    +

    +  PCRE_UTF8
    +
    +

    +

    +This option causes PCRE to regard both the pattern and the subject as strings +of UTF-8 characters instead of just byte strings. However, it is available only +if PCRE has been built to include UTF-8 support. If not, the use of this option +provokes an error. Support for UTF-8 is new, experimental, and incomplete. +Details of exactly what it entails are given below. +

    +
  • STUDYING A PATTERN +

    +When a pattern is going to be used several times, it is worth spending more +time analyzing it in order to speed up the time taken for matching. The +function pcre_study() takes a pointer to a compiled pattern as its first +argument, and returns a pointer to a pcre_extra block (another typedef +for a structure with hidden contents) containing additional information about +the pattern; this can be passed to pcre_exec(). If no additional +information is available, NULL is returned. +

    +

    +The second argument contains option bits. At present, no options are defined +for pcre_study(), and this argument should always be zero. +

    +

    +The third argument for pcre_study() is a pointer to an error message. If +studying succeeds (even if no data is returned), the variable it points to is +set to NULL. Otherwise it points to a textual error message. +

    +

    +This is a typical call to pcre_study(): +

    +

    +

    +  pcre_extra *pe;
    +  pe = pcre_study(
    +    re,             /* result of pcre_compile() */
    +    0,              /* no options exist */
    +    &error);        /* set to NULL or points to a message */
    +
    +

    +

    +At present, studying a pattern is useful only for non-anchored patterns that do +not have a single fixed starting character. A bitmap of possible starting +characters is created. +

    +
  • LOCALE SUPPORT +

    +PCRE handles caseless matching, and determines whether characters are letters, +digits, or whatever, by reference to a set of tables. The library contains a +default set of tables which is created in the default C locale when PCRE is +compiled. This is used when the final argument of pcre_compile() is NULL, +and is sufficient for many applications. +

    +

    +An alternative set of tables can, however, be supplied. Such tables are built +by calling the pcre_maketables() function, which has no arguments, in the +relevant locale. The result can then be passed to pcre_compile() as often +as necessary. For example, to build and use tables that are appropriate for the +French locale (where accented characters with codes greater than 128 are +treated as letters), the following code could be used: +

    +

    +

    +  setlocale(LC_CTYPE, "fr");
    +  tables = pcre_maketables();
    +  re = pcre_compile(..., tables);
    +
    +

    +

    +The tables are built in memory that is obtained via pcre_malloc. The +pointer that is passed to pcre_compile is saved with the compiled +pattern, and the same tables are used via this pointer by pcre_study() +and pcre_exec(). Thus for any single pattern, compilation, studying and +matching all happen in the same locale, but different patterns can be compiled +in different locales. It is the caller's responsibility to ensure that the +memory containing the tables remains available for as long as it is needed. +

    +
  • INFORMATION ABOUT A PATTERN +

    +The pcre_fullinfo() function returns information about a compiled +pattern. It replaces the obsolete pcre_info() function, which is +nevertheless retained for backwards compability (and is documented below). +

    +

    +The first argument for pcre_fullinfo() is a pointer to the compiled +pattern. The second argument is the result of pcre_study(), or NULL if +the pattern was not studied. The third argument specifies which piece of +information is required, while the fourth argument is a pointer to a variable +to receive the data. The yield of the function is zero for success, or one of +the following negative numbers: +

    +

    +

    +  PCRE_ERROR_NULL       the argument code was NULL
    +                        the argument where was NULL
    +  PCRE_ERROR_BADMAGIC   the "magic number" was not found
    +  PCRE_ERROR_BADOPTION  the value of what was invalid
    +
    +

    +

    +Here is a typical call of pcre_fullinfo(), to obtain the length of the +compiled pattern: +

    +

    +

    +  int rc;
    +  unsigned long int length;
    +  rc = pcre_fullinfo(
    +    re,               /* result of pcre_compile() */
    +    pe,               /* result of pcre_study(), or NULL */
    +    PCRE_INFO_SIZE,   /* what is required */
    +    &length);         /* where to put the data */
    +
    +

    +

    +The possible values for the third argument are defined in pcre.h, and are +as follows: +

    +

    +

    +  PCRE_INFO_OPTIONS
    +
    +

    +

    +Return a copy of the options with which the pattern was compiled. The fourth +argument should point to an unsigned long int variable. These option bits +are those specified in the call to pcre_compile(), modified by any +top-level option settings within the pattern itself, and with the PCRE_ANCHORED +bit forcibly set if the form of the pattern implies that it can match only at +the start of a subject string. +

    +

    +

    +  PCRE_INFO_SIZE
    +
    +

    +

    +Return the size of the compiled pattern, that is, the value that was passed as +the argument to pcre_malloc() when PCRE was getting memory in which to +place the compiled data. The fourth argument should point to a size_t +variable. +

    +

    +

    +  PCRE_INFO_CAPTURECOUNT
    +
    +

    +

    +Return the number of capturing subpatterns in the pattern. The fourth argument +should point to an \fbint\fR variable. +

    +

    +

    +  PCRE_INFO_BACKREFMAX
    +
    +

    +

    +Return the number of the highest back reference in the pattern. The fourth +argument should point to an int variable. Zero is returned if there are +no back references. +

    +

    +

    +  PCRE_INFO_FIRSTCHAR
    +
    +

    +

    +Return information about the first character of any matched string, for a +non-anchored pattern. If there is a fixed first character, e.g. from a pattern +such as (cat|cow|coyote), it is returned in the integer pointed to by +where. Otherwise, if either +

    +

    +(a) the pattern was compiled with the PCRE_MULTILINE option, and every branch +starts with "^", or +

    +

    +(b) every branch of the pattern starts with ".*" and PCRE_DOTALL is not set +(if it were set, the pattern would be anchored), +

    +

    +-1 is returned, indicating that the pattern matches only at the start of a +subject string or after any "\n" within the string. Otherwise -2 is returned. +For anchored patterns, -2 is returned. +

    +

    +

    +  PCRE_INFO_FIRSTTABLE
    +
    +

    +

    +If the pattern was studied, and this resulted in the construction of a 256-bit +table indicating a fixed set of characters for the first character in any +matching string, a pointer to the table is returned. Otherwise NULL is +returned. The fourth argument should point to an unsigned char * +variable. +

    +

    +

    +  PCRE_INFO_LASTLITERAL
    +
    +

    +

    +For a non-anchored pattern, return the value of the rightmost literal character +which must exist in any matched string, other than at its start. The fourth +argument should point to an int variable. If there is no such character, +or if the pattern is anchored, -1 is returned. For example, for the pattern +/a\d+z\d+/ the returned value is 'z'. +

    +

    +The pcre_info() function is now obsolete because its interface is too +restrictive to return all the available data about a compiled pattern. New +programs should use pcre_fullinfo() instead. The yield of +pcre_info() is the number of capturing subpatterns, or one of the +following negative numbers: +

    +

    +

    +  PCRE_ERROR_NULL       the argument code was NULL
    +  PCRE_ERROR_BADMAGIC   the "magic number" was not found
    +
    +

    +

    +If the optptr argument is not NULL, a copy of the options with which the +pattern was compiled is placed in the integer it points to (see +PCRE_INFO_OPTIONS above). +

    +

    +If the pattern is not anchored and the firstcharptr argument is not NULL, +it is used to pass back information about the first character of any matched +string (see PCRE_INFO_FIRSTCHAR above). +

    +
  • MATCHING A PATTERN +

    +The function pcre_exec() is called to match a subject string against a +pre-compiled pattern, which is passed in the code argument. If the +pattern has been studied, the result of the study should be passed in the +extra argument. Otherwise this must be NULL. +

    +

    +Here is an example of a simple call to pcre_exec(): +

    +

    +

    +  int rc;
    +  int ovector[30];
    +  rc = pcre_exec(
    +    re,             /* result of pcre_compile() */
    +    NULL,           /* we didn't study the pattern */
    +    "some string",  /* the subject string */
    +    11,             /* the length of the subject string */
    +    0,              /* start at offset 0 in the subject */
    +    0,              /* default options */
    +    ovector,        /* vector for substring information */
    +    30);            /* number of elements in the vector */
    +
    +

    +

    +The PCRE_ANCHORED option can be passed in the options argument, whose +unused bits must be zero. However, if a pattern was compiled with +PCRE_ANCHORED, or turned out to be anchored by virtue of its contents, it +cannot be made unachored at matching time. +

    +

    +There are also three further options that can be set only at matching time: +

    +

    +

    +  PCRE_NOTBOL
    +
    +

    +

    +The first character of the string is not the beginning of a line, so the +circumflex metacharacter should not match before it. Setting this without +PCRE_MULTILINE (at compile time) causes circumflex never to match. +

    +

    +

    +  PCRE_NOTEOL
    +
    +

    +

    +The end of the string is not the end of a line, so the dollar metacharacter +should not match it nor (except in multiline mode) a newline immediately before +it. Setting this without PCRE_MULTILINE (at compile time) causes dollar never +to match. +

    +

    +

    +  PCRE_NOTEMPTY
    +
    +

    +

    +An empty string is not considered to be a valid match if this option is set. If +there are alternatives in the pattern, they are tried. If all the alternatives +match the empty string, the entire match fails. For example, if the pattern +

    +

    +

    +  a?b?
    +
    +

    +

    +is applied to a string not beginning with "a" or "b", it matches the empty +string at the start of the subject. With PCRE_NOTEMPTY set, this match is not +valid, so PCRE searches further into the string for occurrences of "a" or "b". +

    +

    +Perl has no direct equivalent of PCRE_NOTEMPTY, but it does make a special case +of a pattern match of the empty string within its split() function, and +when using the /g modifier. It is possible to emulate Perl's behaviour after +matching a null string by first trying the match again at the same offset with +PCRE_NOTEMPTY set, and then if that fails by advancing the starting offset (see +below) and trying an ordinary match again. +

    +

    +The subject string is passed as a pointer in subject, a length in +length, and a starting offset in startoffset. Unlike the pattern +string, the subject may contain binary zero characters. When the starting +offset is zero, the search for a match starts at the beginning of the subject, +and this is by far the most common case. +

    +

    +A non-zero starting offset is useful when searching for another match in the +same subject by calling pcre_exec() again after a previous success. +Setting startoffset differs from just passing over a shortened string and +setting PCRE_NOTBOL in the case of a pattern that begins with any kind of +lookbehind. For example, consider the pattern +

    +

    +

    +  \Biss\B
    +
    +

    +

    +which finds occurrences of "iss" in the middle of words. (\B matches only if +the current position in the subject is not a word boundary.) When applied to +the string "Mississipi" the first call to pcre_exec() finds the first +occurrence. If pcre_exec() is called again with just the remainder of the +subject, namely "issipi", it does not match, because \B is always false at the +start of the subject, which is deemed to be a word boundary. However, if +pcre_exec() is passed the entire string again, but with startoffset +set to 4, it finds the second occurrence of "iss" because it is able to look +behind the starting point to discover that it is preceded by a letter. +

    +

    +If a non-zero starting offset is passed when the pattern is anchored, one +attempt to match at the given offset is tried. This can only succeed if the +pattern does not require the match to be at the start of the subject. +

    +

    +In general, a pattern matches a certain portion of the subject, and in +addition, further substrings from the subject may be picked out by parts of the +pattern. Following the usage in Jeffrey Friedl's book, this is called +"capturing" in what follows, and the phrase "capturing subpattern" is used for +a fragment of a pattern that picks out a substring. PCRE supports several other +kinds of parenthesized subpattern that do not cause substrings to be captured. +

    +

    +Captured substrings are returned to the caller via a vector of integer offsets +whose address is passed in ovector. The number of elements in the vector +is passed in ovecsize. The first two-thirds of the vector is used to pass +back captured substrings, each substring using a pair of integers. The +remaining third of the vector is used as workspace by pcre_exec() while +matching capturing subpatterns, and is not available for passing back +information. The length passed in ovecsize should always be a multiple of +three. If it is not, it is rounded down. +

    +

    +When a match has been successful, information about captured substrings is +returned in pairs of integers, starting at the beginning of ovector, and +continuing up to two-thirds of its length at the most. The first element of a +pair is set to the offset of the first character in a substring, and the second +is set to the offset of the first character after the end of a substring. The +first pair, ovector[0] and ovector[1], identify the portion of the +subject string matched by the entire pattern. The next pair is used for the +first capturing subpattern, and so on. The value returned by pcre_exec() +is the number of pairs that have been set. If there are no capturing +subpatterns, the return value from a successful match is 1, indicating that +just the first pair of offsets has been set. +

    +

    +Some convenience functions are provided for extracting the captured substrings +as separate strings. These are described in the following section. +

    +

    +It is possible for an capturing subpattern number n+1 to match some +part of the subject when subpattern n has not been used at all. For +example, if the string "abc" is matched against the pattern (a|(z))(bc) +subpatterns 1 and 3 are matched, but 2 is not. When this happens, both offset +values corresponding to the unused subpattern are set to -1. +

    +

    +If a capturing subpattern is matched repeatedly, it is the last portion of the +string that it matched that gets returned. +

    +

    +If the vector is too small to hold all the captured substrings, it is used as +far as possible (up to two-thirds of its length), and the function returns a +value of zero. In particular, if the substring offsets are not of interest, +pcre_exec() may be called with ovector passed as NULL and +ovecsize as zero. However, if the pattern contains back references and +the ovector isn't big enough to remember the related substrings, PCRE has +to get additional memory for use during matching. Thus it is usually advisable +to supply an ovector. +

    +

    +Note that pcre_info() can be used to find out how many capturing +subpatterns there are in a compiled pattern. The smallest size for +ovector that will allow for n captured substrings in addition to +the offsets of the substring matched by the whole pattern is (n+1)*3. +

    +

    +If pcre_exec() fails, it returns a negative number. The following are +defined in the header file: +

    +

    +

    +  PCRE_ERROR_NOMATCH        (-1)
    +
    +

    +

    +The subject string did not match the pattern. +

    +

    +

    +  PCRE_ERROR_NULL           (-2)
    +
    +

    +

    +Either code or subject was passed as NULL, or ovector was +NULL and ovecsize was not zero. +

    +

    +

    +  PCRE_ERROR_BADOPTION      (-3)
    +
    +

    +

    +An unrecognized bit was set in the options argument. +

    +

    +

    +  PCRE_ERROR_BADMAGIC       (-4)
    +
    +

    +

    +PCRE stores a 4-byte "magic number" at the start of the compiled code, to catch +the case when it is passed a junk pointer. This is the error it gives when the +magic number isn't present. +

    +

    +

    +  PCRE_ERROR_UNKNOWN_NODE   (-5)
    +
    +

    +

    +While running the pattern match, an unknown item was encountered in the +compiled pattern. This error could be caused by a bug in PCRE or by overwriting +of the compiled pattern. +

    +

    +

    +  PCRE_ERROR_NOMEMORY       (-6)
    +
    +

    +

    +If a pattern contains back references, but the ovector that is passed to +pcre_exec() is not big enough to remember the referenced substrings, PCRE +gets a block of memory at the start of matching to use for this purpose. If the +call via pcre_malloc() fails, this error is given. The memory is freed at +the end of matching. +

    +
  • EXTRACTING CAPTURED SUBSTRINGS +

    +Captured substrings can be accessed directly by using the offsets returned by +pcre_exec() in ovector. For convenience, the functions +pcre_copy_substring(), pcre_get_substring(), and +pcre_get_substring_list() are provided for extracting captured substrings +as new, separate, zero-terminated strings. A substring that contains a binary +zero is correctly extracted and has a further zero added on the end, but the +result does not, of course, function as a C string. +

    +

    +The first three arguments are the same for all three functions: subject +is the subject string which has just been successfully matched, ovector +is a pointer to the vector of integer offsets that was passed to +pcre_exec(), and stringcount is the number of substrings that +were captured by the match, including the substring that matched the entire +regular expression. This is the value returned by pcre_exec if it +is greater than zero. If pcre_exec() returned zero, indicating that it +ran out of space in ovector, the value passed as stringcount should +be the size of the vector divided by three. +

    +

    +The functions pcre_copy_substring() and pcre_get_substring() +extract a single substring, whose number is given as stringnumber. A +value of zero extracts the substring that matched the entire pattern, while +higher values extract the captured substrings. For pcre_copy_substring(), +the string is placed in buffer, whose length is given by +buffersize, while for pcre_get_substring() a new block of memory is +obtained via pcre_malloc, and its address is returned via +stringptr. The yield of the function is the length of the string, not +including the terminating zero, or one of +

    +

    +

    +  PCRE_ERROR_NOMEMORY       (-6)
    +
    +

    +

    +The buffer was too small for pcre_copy_substring(), or the attempt to get +memory failed for pcre_get_substring(). +

    +

    +

    +  PCRE_ERROR_NOSUBSTRING    (-7)
    +
    +

    +

    +There is no substring whose number is stringnumber. +

    +

    +The pcre_get_substring_list() function extracts all available substrings +and builds a list of pointers to them. All this is done in a single block of +memory which is obtained via pcre_malloc. The address of the memory block +is returned via listptr, which is also the start of the list of string +pointers. The end of the list is marked by a NULL pointer. The yield of the +function is zero if all went well, or +

    +

    +

    +  PCRE_ERROR_NOMEMORY       (-6)
    +
    +

    +

    +if the attempt to get the memory block failed. +

    +

    +When any of these functions encounter a substring that is unset, which can +happen when capturing subpattern number n+1 matches some part of the +subject, but subpattern n has not been used at all, they return an empty +string. This can be distinguished from a genuine zero-length substring by +inspecting the appropriate offset in ovector, which is negative for unset +substrings. +

    +

    +The two convenience functions pcre_free_substring() and +pcre_free_substring_list() can be used to free the memory returned by +a previous call of pcre_get_substring() or +pcre_get_substring_list(), respectively. They do nothing more than call +the function pointed to by pcre_free, which of course could be called +directly from a C program. However, PCRE is used in some situations where it is +linked via a special interface to another programming language which cannot use +pcre_free directly; it is for these cases that the functions are +provided. +

    +
  • LIMITATIONS +

    +There are some size limitations in PCRE but it is hoped that they will never in +practice be relevant. +The maximum length of a compiled pattern is 65539 (sic) bytes. +All values in repeating quantifiers must be less than 65536. +There maximum number of capturing subpatterns is 65535. +There is no limit to the number of non-capturing subpatterns, but the maximum +depth of nesting of all kinds of parenthesized subpattern, including capturing +subpatterns, assertions, and other types of subpattern, is 200. +

    +

    +The maximum length of a subject string is the largest positive number that an +integer variable can hold. However, PCRE uses recursion to handle subpatterns +and indefinite repetition. This means that the available stack space may limit +the size of a subject string that can be processed by certain patterns. +

    +
  • DIFFERENCES FROM PERL +

    +The differences described here are with respect to Perl 5.005. +

    +

    +1. By default, a whitespace character is any character that the C library +function isspace() recognizes, though it is possible to compile PCRE with +alternative character type tables. Normally isspace() matches space, +formfeed, newline, carriage return, horizontal tab, and vertical tab. Perl 5 +no longer includes vertical tab in its set of whitespace characters. The \v +escape that was in the Perl documentation for a long time was never in fact +recognized. However, the character itself was treated as whitespace at least +up to 5.002. In 5.004 and 5.005 it does not match \s. +

    +

    +2. PCRE does not allow repeat quantifiers on lookahead assertions. Perl permits +them, but they do not mean what you might think. For example, (?!a){3} does +not assert that the next three characters are not "a". It just asserts that the +next character is not "a" three times. +

    +

    +3. Capturing subpatterns that occur inside negative lookahead assertions are +counted, but their entries in the offsets vector are never set. Perl sets its +numerical variables from any such patterns that are matched before the +assertion fails to match something (thereby succeeding), but only if the +negative lookahead assertion contains just one branch. +

    +

    +4. Though binary zero characters are supported in the subject string, they are +not allowed in a pattern string because it is passed as a normal C string, +terminated by zero. The escape sequence "\0" can be used in the pattern to +represent a binary zero. +

    +

    +5. The following Perl escape sequences are not supported: \l, \u, \L, \U, +\E, \Q. In fact these are implemented by Perl's general string-handling and +are not part of its pattern matching engine. +

    +

    +6. The Perl \G assertion is not supported as it is not relevant to single +pattern matches. +

    +

    +7. Fairly obviously, PCRE does not support the (?{code}) and (?p{code}) +constructions. However, there is some experimental support for recursive +patterns using the non-Perl item (?R). +

    +

    +8. There are at the time of writing some oddities in Perl 5.005_02 concerned +with the settings of captured strings when part of a pattern is repeated. For +example, matching "aba" against the pattern /^(a(b)?)+$/ sets $2 to the value +"b", but matching "aabbaa" against /^(aa(bb)?)+$/ leaves $2 unset. However, if +the pattern is changed to /^(aa(b(b))?)+$/ then $2 (and $3) are set. +

    +

    +In Perl 5.004 $2 is set in both cases, and that is also true of PCRE. If in the +future Perl changes to a consistent state that is different, PCRE may change to +follow. +

    +

    +9. Another as yet unresolved discrepancy is that in Perl 5.005_02 the pattern +/^(a)?(?(1)a|b)+$/ matches the string "a", whereas in PCRE it does not. +However, in both Perl and PCRE /^(a)?a/ matched against "a" leaves $1 unset. +

    +

    +10. PCRE provides some extensions to the Perl regular expression facilities: +

    +

    +(a) Although lookbehind assertions must match fixed length strings, each +alternative branch of a lookbehind assertion can match a different length of +string. Perl 5.005 requires them all to have the same length. +

    +

    +(b) If PCRE_DOLLAR_ENDONLY is set and PCRE_MULTILINE is not set, the $ meta- +character matches only at the very end of the string. +

    +

    +(c) If PCRE_EXTRA is set, a backslash followed by a letter with no special +meaning is faulted. +

    +

    +(d) If PCRE_UNGREEDY is set, the greediness of the repetition quantifiers is +inverted, that is, by default they are not greedy, but if followed by a +question mark they are. +

    +

    +(e) PCRE_ANCHORED can be used to force a pattern to be tried only at the start +of the subject. +

    +

    +(f) The PCRE_NOTBOL, PCRE_NOTEOL, and PCRE_NOTEMPTY options for +pcre_exec() have no Perl equivalents. +

    +

    +(g) The (?R) construct allows for recursive pattern matching (Perl 5.6 can do +this using the (?p{code}) construct, which PCRE cannot of course support.) +

    +
  • REGULAR EXPRESSION DETAILS +

    +The syntax and semantics of the regular expressions supported by PCRE are +described below. Regular expressions are also described in the Perl +documentation and in a number of other books, some of which have copious +examples. Jeffrey Friedl's "Mastering Regular Expressions", published by +O'Reilly (ISBN 1-56592-257), covers them in great detail. +

    +

    +The description here is intended as reference documentation. The basic +operation of PCRE is on strings of bytes. However, there is the beginnings of +some support for UTF-8 character strings. To use this support you must +configure PCRE to include it, and then call pcre_compile() with the +PCRE_UTF8 option. How this affects the pattern matching is described in the +final section of this document. +

    +

    +A regular expression is a pattern that is matched against a subject string from +left to right. Most characters stand for themselves in a pattern, and match the +corresponding characters in the subject. As a trivial example, the pattern +

    +

    +

    +  The quick brown fox
    +
    +

    +

    +matches a portion of a subject string that is identical to itself. The power of +regular expressions comes from the ability to include alternatives and +repetitions in the pattern. These are encoded in the pattern by the use of +meta-characters, which do not stand for themselves but instead are +interpreted in some special way. +

    +

    +There are two different sets of meta-characters: those that are recognized +anywhere in the pattern except within square brackets, and those that are +recognized in square brackets. Outside square brackets, the meta-characters are +as follows: +

    +

    +

    +  \      general escape character with several uses
    +  ^      assert start of subject (or line, in multiline mode)
    +  $      assert end of subject (or line, in multiline mode)
    +  .      match any character except newline (by default)
    +  [      start character class definition
    +  |      start of alternative branch
    +  (      start subpattern
    +  )      end subpattern
    +  ?      extends the meaning of (
    +         also 0 or 1 quantifier
    +         also quantifier minimizer
    +  *      0 or more quantifier
    +  +      1 or more quantifier
    +  {      start min/max quantifier
    +
    +

    +

    +Part of a pattern that is in square brackets is called a "character class". In +a character class the only meta-characters are: +

    +

    +

    +  \      general escape character
    +  ^      negate the class, but only if the first character
    +  -      indicates character range
    +  ]      terminates the character class
    +
    +

    +

    +The following sections describe the use of each of the meta-characters. +

    +
  • BACKSLASH +

    +The backslash character has several uses. Firstly, if it is followed by a +non-alphameric character, it takes away any special meaning that character may +have. This use of backslash as an escape character applies both inside and +outside character classes. +

    +

    +For example, if you want to match a "*" character, you write "\*" in the +pattern. This applies whether or not the following character would otherwise be +interpreted as a meta-character, so it is always safe to precede a +non-alphameric with "\" to specify that it stands for itself. In particular, +if you want to match a backslash, you write "\\". +

    +

    +If a pattern is compiled with the PCRE_EXTENDED option, whitespace in the +pattern (other than in a character class) and characters between a "#" outside +a character class and the next newline character are ignored. An escaping +backslash can be used to include a whitespace or "#" character as part of the +pattern. +

    +

    +A second use of backslash provides a way of encoding non-printing characters +in patterns in a visible manner. There is no restriction on the appearance of +non-printing characters, apart from the binary zero that terminates a pattern, +but when a pattern is being prepared by text editing, it is usually easier to +use one of the following escape sequences than the binary character it +represents: +

    +

    +

    +  \a     alarm, that is, the BEL character (hex 07)
    +  \cx    "control-x", where x is any character
    +  \e     escape (hex 1B)
    +  \f     formfeed (hex 0C)
    +  \n     newline (hex 0A)
    +  \r     carriage return (hex 0D)
    +  \t     tab (hex 09)
    +  \xhh   character with hex code hh
    +  \ddd   character with octal code ddd, or backreference
    +
    +

    +

    +The precise effect of "\cx" is as follows: if "x" is a lower case letter, it +is converted to upper case. Then bit 6 of the character (hex 40) is inverted. +Thus "\cz" becomes hex 1A, but "\c{" becomes hex 3B, while "\c;" becomes hex +7B. +

    +

    +After "\x", up to two hexadecimal digits are read (letters can be in upper or +lower case). +

    +

    +After "\0" up to two further octal digits are read. In both cases, if there +are fewer than two digits, just those that are present are used. Thus the +sequence "\0\x\07" specifies two binary zeros followed by a BEL character. +Make sure you supply two digits after the initial zero if the character that +follows is itself an octal digit. +

    +

    +The handling of a backslash followed by a digit other than 0 is complicated. +Outside a character class, PCRE reads it and any following digits as a decimal +number. If the number is less than 10, or if there have been at least that many +previous capturing left parentheses in the expression, the entire sequence is +taken as a back reference. A description of how this works is given +later, following the discussion of parenthesized subpatterns. +

    +

    +Inside a character class, or if the decimal number is greater than 9 and there +have not been that many capturing subpatterns, PCRE re-reads up to three octal +digits following the backslash, and generates a single byte from the least +significant 8 bits of the value. Any subsequent digits stand for themselves. +For example: +

    +

    +

    +  \040   is another way of writing a space
    +  \40    is the same, provided there are fewer than 40
    +            previous capturing subpatterns
    +  \7     is always a back reference
    +  \11    might be a back reference, or another way of
    +            writing a tab
    +  \011   is always a tab
    +  \0113  is a tab followed by the character "3"
    +  \113   is the character with octal code 113 (since there
    +            can be no more than 99 back references)
    +  \377   is a byte consisting entirely of 1 bits
    +  \81    is either a back reference, or a binary zero
    +            followed by the two characters "8" and "1"
    +
    +

    +

    +Note that octal values of 100 or greater must not be introduced by a leading +zero, because no more than three octal digits are ever read. +

    +

    +All the sequences that define a single byte value can be used both inside and +outside character classes. In addition, inside a character class, the sequence +"\b" is interpreted as the backspace character (hex 08). Outside a character +class it has a different meaning (see below). +

    +

    +The third use of backslash is for specifying generic character types: +

    +

    +

    +  \d     any decimal digit
    +  \D     any character that is not a decimal digit
    +  \s     any whitespace character
    +  \S     any character that is not a whitespace character
    +  \w     any "word" character
    +  \W     any "non-word" character
    +
    +

    +

    +Each pair of escape sequences partitions the complete set of characters into +two disjoint sets. Any given character matches one, and only one, of each pair. +

    +

    +A "word" character is any letter or digit or the underscore character, that is, +any character which can be part of a Perl "word". The definition of letters and +digits is controlled by PCRE's character tables, and may vary if locale- +specific matching is taking place (see "Locale support" above). For example, in +the "fr" (French) locale, some character codes greater than 128 are used for +accented letters, and these are matched by \w. +

    +

    +These character type sequences can appear both inside and outside character +classes. They each match one character of the appropriate type. If the current +matching point is at the end of the subject string, all of them fail, since +there is no character to match. +

    +

    +The fourth use of backslash is for certain simple assertions. An assertion +specifies a condition that has to be met at a particular point in a match, +without consuming any characters from the subject string. The use of +subpatterns for more complicated assertions is described below. The backslashed +assertions are +

    +

    +

    +  \b     word boundary
    +  \B     not a word boundary
    +  \A     start of subject (independent of multiline mode)
    +  \Z     end of subject or newline at end (independent of multiline mode)
    +  \z     end of subject (independent of multiline mode)
    +
    +

    +

    +These assertions may not appear in character classes (but note that "\b" has a +different meaning, namely the backspace character, inside a character class). +

    +

    +A word boundary is a position in the subject string where the current character +and the previous character do not both match \w or \W (i.e. one matches +\w and the other matches \W), or the start or end of the string if the +first or last character matches \w, respectively. +

    +

    +The \A, \Z, and \z assertions differ from the traditional circumflex and +dollar (described below) in that they only ever match at the very start and end +of the subject string, whatever options are set. They are not affected by the +PCRE_NOTBOL or PCRE_NOTEOL options. If the startoffset argument of +pcre_exec() is non-zero, \A can never match. The difference between \Z +and \z is that \Z matches before a newline that is the last character of the +string as well as at the end of the string, whereas \z matches only at the +end. +

    +
  • CIRCUMFLEX AND DOLLAR +

    +Outside a character class, in the default matching mode, the circumflex +character is an assertion which is true only if the current matching point is +at the start of the subject string. If the startoffset argument of +pcre_exec() is non-zero, circumflex can never match. Inside a character +class, circumflex has an entirely different meaning (see below). +

    +

    +Circumflex need not be the first character of the pattern if a number of +alternatives are involved, but it should be the first thing in each alternative +in which it appears if the pattern is ever to match that branch. If all +possible alternatives start with a circumflex, that is, if the pattern is +constrained to match only at the start of the subject, it is said to be an +"anchored" pattern. (There are also other constructs that can cause a pattern +to be anchored.) +

    +

    +A dollar character is an assertion which is true only if the current matching +point is at the end of the subject string, or immediately before a newline +character that is the last character in the string (by default). Dollar need +not be the last character of the pattern if a number of alternatives are +involved, but it should be the last item in any branch in which it appears. +Dollar has no special meaning in a character class. +

    +

    +The meaning of dollar can be changed so that it matches only at the very end of +the string, by setting the PCRE_DOLLAR_ENDONLY option at compile or matching +time. This does not affect the \Z assertion. +

    +

    +The meanings of the circumflex and dollar characters are changed if the +PCRE_MULTILINE option is set. When this is the case, they match immediately +after and immediately before an internal "\n" character, respectively, in +addition to matching at the start and end of the subject string. For example, +the pattern /^abc$/ matches the subject string "def\nabc" in multiline mode, +but not otherwise. Consequently, patterns that are anchored in single line mode +because all branches start with "^" are not anchored in multiline mode, and a +match for circumflex is possible when the startoffset argument of +pcre_exec() is non-zero. The PCRE_DOLLAR_ENDONLY option is ignored if +PCRE_MULTILINE is set. +

    +

    +Note that the sequences \A, \Z, and \z can be used to match the start and +end of the subject in both modes, and if all branches of a pattern start with +\A it is always anchored, whether PCRE_MULTILINE is set or not. +

    +
  • FULL STOP (PERIOD, DOT) +

    +Outside a character class, a dot in the pattern matches any one character in +the subject, including a non-printing character, but not (by default) newline. +If the PCRE_DOTALL option is set, dots match newlines as well. The handling of +dot is entirely independent of the handling of circumflex and dollar, the only +relationship being that they both involve newline characters. Dot has no +special meaning in a character class. +

    +
  • SQUARE BRACKETS +

    +An opening square bracket introduces a character class, terminated by a closing +square bracket. A closing square bracket on its own is not special. If a +closing square bracket is required as a member of the class, it should be the +first data character in the class (after an initial circumflex, if present) or +escaped with a backslash. +

    +

    +A character class matches a single character in the subject; the character must +be in the set of characters defined by the class, unless the first character in +the class is a circumflex, in which case the subject character must not be in +the set defined by the class. If a circumflex is actually required as a member +of the class, ensure it is not the first character, or escape it with a +backslash. +

    +

    +For example, the character class [aeiou] matches any lower case vowel, while +[^aeiou] matches any character that is not a lower case vowel. Note that a +circumflex is just a convenient notation for specifying the characters which +are in the class by enumerating those that are not. It is not an assertion: it +still consumes a character from the subject string, and fails if the current +pointer is at the end of the string. +

    +

    +When caseless matching is set, any letters in a class represent both their +upper case and lower case versions, so for example, a caseless [aeiou] matches +"A" as well as "a", and a caseless [^aeiou] does not match "A", whereas a +caseful version would. +

    +

    +The newline character is never treated in any special way in character classes, +whatever the setting of the PCRE_DOTALL or PCRE_MULTILINE options is. A class +such as [^a] will always match a newline. +

    +

    +The minus (hyphen) character can be used to specify a range of characters in a +character class. For example, [d-m] matches any letter between d and m, +inclusive. If a minus character is required in a class, it must be escaped with +a backslash or appear in a position where it cannot be interpreted as +indicating a range, typically as the first or last character in the class. +

    +

    +It is not possible to have the literal character "]" as the end character of a +range. A pattern such as [W-]46] is interpreted as a class of two characters +("W" and "-") followed by a literal string "46]", so it would match "W46]" or +"-46]". However, if the "]" is escaped with a backslash it is interpreted as +the end of range, so [W-\]46] is interpreted as a single class containing a +range followed by two separate characters. The octal or hexadecimal +representation of "]" can also be used to end a range. +

    +

    +Ranges operate in ASCII collating sequence. They can also be used for +characters specified numerically, for example [\000-\037]. If a range that +includes letters is used when caseless matching is set, it matches the letters +in either case. For example, [W-c] is equivalent to [][\^_`wxyzabc], matched +caselessly, and if character tables for the "fr" locale are in use, +[\xc8-\xcb] matches accented E characters in both cases. +

    +

    +The character types \d, \D, \s, \S, \w, and \W may also appear in a +character class, and add the characters that they match to the class. For +example, [\dABCDEF] matches any hexadecimal digit. A circumflex can +conveniently be used with the upper case character types to specify a more +restricted set of characters than the matching lower case type. For example, +the class [^\W_] matches any letter or digit, but not underscore. +

    +

    +All non-alphameric characters other than \, -, ^ (at the start) and the +terminating ] are non-special in character classes, but it does no harm if they +are escaped. +

    +
  • POSIX CHARACTER CLASSES +

    +Perl 5.6 (not yet released at the time of writing) is going to support the +POSIX notation for character classes, which uses names enclosed by [: and :] +within the enclosing square brackets. PCRE supports this notation. For example, +

    +

    +

    +  [01[:alpha:]%]
    +
    +

    +

    +matches "0", "1", any alphabetic character, or "%". The supported class names +are +

    +

    +

    +  alnum    letters and digits
    +  alpha    letters
    +  ascii    character codes 0 - 127
    +  cntrl    control characters
    +  digit    decimal digits (same as \d)
    +  graph    printing characters, excluding space
    +  lower    lower case letters
    +  print    printing characters, including space
    +  punct    printing characters, excluding letters and digits
    +  space    white space (same as \s)
    +  upper    upper case letters
    +  word     "word" characters (same as \w)
    +  xdigit   hexadecimal digits
    +
    +

    +

    +The names "ascii" and "word" are Perl extensions. Another Perl extension is +negation, which is indicated by a ^ character after the colon. For example, +

    +

    +

    +  [12[:^digit:]]
    +
    +

    +

    +matches "1", "2", or any non-digit. PCRE (and Perl) also recognize the POSIX +syntax [.ch.] and [=ch=] where "ch" is a "collating element", but these are not +supported, and an error is given if they are encountered. +

    +
  • VERTICAL BAR +

    +Vertical bar characters are used to separate alternative patterns. For example, +the pattern +

    +

    +

    +  gilbert|sullivan
    +
    +

    +

    +matches either "gilbert" or "sullivan". Any number of alternatives may appear, +and an empty alternative is permitted (matching the empty string). +The matching process tries each alternative in turn, from left to right, +and the first one that succeeds is used. If the alternatives are within a +subpattern (defined below), "succeeds" means matching the rest of the main +pattern as well as the alternative in the subpattern. +

    +
  • INTERNAL OPTION SETTING +

    +The settings of PCRE_CASELESS, PCRE_MULTILINE, PCRE_DOTALL, and PCRE_EXTENDED +can be changed from within the pattern by a sequence of Perl option letters +enclosed between "(?" and ")". The option letters are +

    +

    +

    +  i  for PCRE_CASELESS
    +  m  for PCRE_MULTILINE
    +  s  for PCRE_DOTALL
    +  x  for PCRE_EXTENDED
    +
    +

    +

    +For example, (?im) sets caseless, multiline matching. It is also possible to +unset these options by preceding the letter with a hyphen, and a combined +setting and unsetting such as (?im-sx), which sets PCRE_CASELESS and +PCRE_MULTILINE while unsetting PCRE_DOTALL and PCRE_EXTENDED, is also +permitted. If a letter appears both before and after the hyphen, the option is +unset. +

    +

    +The scope of these option changes depends on where in the pattern the setting +occurs. For settings that are outside any subpattern (defined below), the +effect is the same as if the options were set or unset at the start of +matching. The following patterns all behave in exactly the same way: +

    +

    +

    +  (?i)abc
    +  a(?i)bc
    +  ab(?i)c
    +  abc(?i)
    +
    +

    +

    +which in turn is the same as compiling the pattern abc with PCRE_CASELESS set. +In other words, such "top level" settings apply to the whole pattern (unless +there are other changes inside subpatterns). If there is more than one setting +of the same option at top level, the rightmost setting is used. +

    +

    +If an option change occurs inside a subpattern, the effect is different. This +is a change of behaviour in Perl 5.005. An option change inside a subpattern +affects only that part of the subpattern that follows it, so +

    +

    +

    +  (a(?i)b)c
    +
    +

    +

    +matches abc and aBc and no other strings (assuming PCRE_CASELESS is not used). +By this means, options can be made to have different settings in different +parts of the pattern. Any changes made in one alternative do carry on +into subsequent branches within the same subpattern. For example, +

    +

    +

    +  (a(?i)b|c)
    +
    +

    +

    +matches "ab", "aB", "c", and "C", even though when matching "C" the first +branch is abandoned before the option setting. This is because the effects of +option settings happen at compile time. There would be some very weird +behaviour otherwise. +

    +

    +The PCRE-specific options PCRE_UNGREEDY and PCRE_EXTRA can be changed in the +same way as the Perl-compatible options by using the characters U and X +respectively. The (?X) flag setting is special in that it must always occur +earlier in the pattern than any of the additional features it turns on, even +when it is at top level. It is best put at the start. +

    +
  • SUBPATTERNS +

    +Subpatterns are delimited by parentheses (round brackets), which can be nested. +Marking part of a pattern as a subpattern does two things: +

    +

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

    +

    +

    +  cat(aract|erpillar|)
    +
    +

    +

    +matches one of the words "cat", "cataract", or "caterpillar". Without the +parentheses, it would match "cataract", "erpillar" or the empty string. +

    +

    +2. It sets up the subpattern as a capturing subpattern (as defined above). +When the whole pattern matches, that portion of the subject string that matched +the subpattern is passed back to the caller via the ovector argument of +pcre_exec(). Opening parentheses are counted from left to right (starting +from 1) to obtain the numbers of the capturing subpatterns. +

    +

    +For example, if the string "the red king" is matched against the pattern +

    +

    +

    +  the ((red|white) (king|queen))
    +
    +

    +

    +the captured substrings are "red king", "red", and "king", and are numbered 1, +2, and 3, respectively. +

    +

    +The fact that plain parentheses fulfil two functions is not always helpful. +There are often times when a grouping subpattern is required without a +capturing requirement. If an opening parenthesis is followed by "?:", the +subpattern does not do any capturing, and is not counted when computing the +number of any subsequent capturing subpatterns. For example, if the string "the +white queen" is matched against the pattern +

    +

    +

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

    +

    +the captured substrings are "white queen" and "queen", and are numbered 1 and +2. The maximum number of captured substrings is 99, and the maximum number of +all subpatterns, both capturing and non-capturing, is 200. +

    +

    +As a convenient shorthand, if any option settings are required at the start of +a non-capturing subpattern, the option letters may appear between the "?" and +the ":". Thus the two patterns +

    +

    +

    +  (?i:saturday|sunday)
    +  (?:(?i)saturday|sunday)
    +
    +

    +

    +match exactly the same set of strings. Because alternative branches are tried +from left to right, and options are not reset until the end of the subpattern +is reached, an option setting in one branch does affect subsequent branches, so +the above patterns match "SUNDAY" as well as "Saturday". +

    +
  • REPETITION +

    +Repetition is specified by quantifiers, which can follow any of the following +items: +

    +

    +

    +  a single character, possibly escaped
    +  the . metacharacter
    +  a character class
    +  a back reference (see next section)
    +  a parenthesized subpattern (unless it is an assertion - see below)
    +
    +

    +

    +The general repetition quantifier specifies a minimum and maximum number of +permitted matches, by giving the two numbers in curly brackets (braces), +separated by a comma. The numbers must be less than 65536, and the first must +be less than or equal to the second. For example: +

    +

    +

    +  z{2,4}
    +
    +

    +

    +matches "zz", "zzz", or "zzzz". A closing brace on its own is not a special +character. If the second number is omitted, but the comma is present, there is +no upper limit; if the second number and the comma are both omitted, the +quantifier specifies an exact number of required matches. Thus +

    +

    +

    +  [aeiou]{3,}
    +
    +

    +

    +matches at least 3 successive vowels, but may match many more, while +

    +

    +

    +  \d{8}
    +
    +

    +

    +matches exactly 8 digits. An opening curly bracket that appears in a position +where a quantifier is not allowed, or one that does not match the syntax of a +quantifier, is taken as a literal character. For example, {,6} is not a +quantifier, but a literal string of four characters. +

    +

    +The quantifier {0} is permitted, causing the expression to behave as if the +previous item and the quantifier were not present. +

    +

    +For convenience (and historical compatibility) the three most common +quantifiers have single-character abbreviations: +

    +

    +

    +  *    is equivalent to {0,}
    +  +    is equivalent to {1,}
    +  ?    is equivalent to {0,1}
    +
    +

    +

    +It is possible to construct infinite loops by following a subpattern that can +match no characters with a quantifier that has no upper limit, for example: +

    +

    +

    +  (a?)*
    +
    +

    +

    +Earlier versions of Perl and PCRE used to give an error at compile time for +such patterns. However, because there are cases where this can be useful, such +patterns are now accepted, but if any repetition of the subpattern does in fact +match no characters, the loop is forcibly broken. +

    +

    +By default, the quantifiers are "greedy", that is, they match as much as +possible (up to the maximum number of permitted times), without causing the +rest of the pattern to fail. The classic example of where this gives problems +is in trying to match comments in C programs. These appear between the +sequences /* and */ and within the sequence, individual * and / characters may +appear. An attempt to match C comments by applying the pattern +

    +

    +

    +  /\*.*\*/
    +
    +

    +

    +to the string +

    +

    +

    +  /* first command */  not comment  /* second comment */
    +
    +

    +

    +fails, because it matches the entire string owing to the greediness of the .* +item. +

    +

    +However, if a quantifier is followed by a question mark, it ceases to be +greedy, and instead matches the minimum number of times possible, so the +pattern +

    +

    +

    +  /\*.*?\*/
    +
    +

    +

    +does the right thing with the C comments. The meaning of the various +quantifiers is not otherwise changed, just the preferred number of matches. +Do not confuse this use of question mark with its use as a quantifier in its +own right. Because it has two uses, it can sometimes appear doubled, as in +

    +

    +

    +  \d??\d
    +
    +

    +

    +which matches one digit by preference, but can match two if that is the only +way the rest of the pattern matches. +

    +

    +If the PCRE_UNGREEDY option is set (an option which is not available in Perl), +the quantifiers are not greedy by default, but individual ones can be made +greedy by following them with a question mark. In other words, it inverts the +default behaviour. +

    +

    +When a parenthesized subpattern is quantified with a minimum repeat count that +is greater than 1 or with a limited maximum, more store is required for the +compiled pattern, in proportion to the size of the minimum or maximum. +

    +

    +If a pattern starts with .* or .{0,} and the PCRE_DOTALL option (equivalent +to Perl's /s) is set, thus allowing the . to match newlines, the pattern is +implicitly anchored, because whatever follows will be tried against every +character position in the subject string, so there is no point in retrying the +overall match at any position after the first. PCRE treats such a pattern as +though it were preceded by \A. In cases where it is known that the subject +string contains no newlines, it is worth setting PCRE_DOTALL when the pattern +begins with .* in order to obtain this optimization, or alternatively using ^ +to indicate anchoring explicitly. +

    +

    +When a capturing subpattern is repeated, the value captured is the substring +that matched the final iteration. For example, after +

    +

    +

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

    +

    +has matched "tweedledum tweedledee" the value of the captured substring is +"tweedledee". However, if there are nested capturing subpatterns, the +corresponding captured values may have been set in previous iterations. For +example, after +

    +

    +

    +  /(a|(b))+/
    +
    +

    +

    +matches "aba" the value of the second captured substring is "b". +

    +
  • BACK REFERENCES +

    +Outside a character class, a backslash followed by a digit greater than 0 (and +possibly further digits) is a back reference to a capturing subpattern earlier +(i.e. to its left) in the pattern, provided there have been that many previous +capturing left parentheses. +

    +

    +However, if the decimal number following the backslash is less than 10, it is +always taken as a back reference, and causes an error only if there are not +that many capturing left parentheses in the entire pattern. In other words, the +parentheses that are referenced need not be to the left of the reference for +numbers less than 10. See the section entitled "Backslash" above for further +details of the handling of digits following a backslash. +

    +

    +A back reference matches whatever actually matched the capturing subpattern in +the current subject string, rather than anything matching the subpattern +itself. So the pattern +

    +

    +

    +  (sens|respons)e and \1ibility
    +
    +

    +

    +matches "sense and sensibility" and "response and responsibility", but not +"sense and responsibility". If caseful matching is in force at the time of the +back reference, the case of letters is relevant. For example, +

    +

    +

    +  ((?i)rah)\s+\1
    +
    +

    +

    +matches "rah rah" and "RAH RAH", but not "RAH rah", even though the original +capturing subpattern is matched caselessly. +

    +

    +There may be more than one back reference to the same subpattern. If a +subpattern has not actually been used in a particular match, any back +references to it always fail. For example, the pattern +

    +

    +

    +  (a|(bc))\2
    +
    +

    +

    +always fails if it starts to match "a" rather than "bc". Because there may be +up to 99 back references, all digits following the backslash are taken +as part of a potential back reference number. If the pattern continues with a +digit character, some delimiter must be used to terminate the back reference. +If the PCRE_EXTENDED option is set, this can be whitespace. Otherwise an empty +comment can be used. +

    +

    +A back reference that occurs inside the parentheses to which it refers fails +when the subpattern is first used, so, for example, (a\1) never matches. +However, such references can be useful inside repeated subpatterns. For +example, the pattern +

    +

    +

    +  (a|b\1)+
    +
    +

    +

    +matches any number of "a"s and also "aba", "ababbaa" etc. At each iteration of +the subpattern, the back reference matches the character string corresponding +to the previous iteration. In order for this to work, the pattern must be such +that the first iteration does not need to match the back reference. This can be +done using alternation, as in the example above, or by a quantifier with a +minimum of zero. +

    +
  • ASSERTIONS +

    +An assertion is a test on the characters following or preceding the current +matching point that does not actually consume any characters. The simple +assertions coded as \b, \B, \A, \Z, \z, ^ and $ are described above. More +complicated assertions are coded as subpatterns. There are two kinds: those +that look ahead of the current position in the subject string, and those that +look behind it. +

    +

    +An assertion subpattern is matched in the normal way, except that it does not +cause the current matching position to be changed. Lookahead assertions start +with (?= for positive assertions and (?! for negative assertions. For example, +

    +

    +

    +  \w+(?=;)
    +
    +

    +

    +matches a word followed by a semicolon, but does not include the semicolon in +the match, and +

    +

    +

    +  foo(?!bar)
    +
    +

    +

    +matches any occurrence of "foo" that is not followed by "bar". Note that the +apparently similar pattern +

    +

    +

    +  (?!foo)bar
    +
    +

    +

    +does not find an occurrence of "bar" that is preceded by something other than +"foo"; it finds any occurrence of "bar" whatsoever, because the assertion +(?!foo) is always true when the next three characters are "bar". A +lookbehind assertion is needed to achieve this effect. +

    +

    +Lookbehind assertions start with (?<= for positive assertions and (?<! for +negative assertions. For example, +

    +

    +

    +  (?<!foo)bar
    +
    +

    +

    +does find an occurrence of "bar" that is not preceded by "foo". The contents of +a lookbehind assertion are restricted such that all the strings it matches must +have a fixed length. However, if there are several alternatives, they do not +all have to have the same fixed length. Thus +

    +

    +

    +  (?<=bullock|donkey)
    +
    +

    +

    +is permitted, but +

    +

    +

    +  (?<!dogs?|cats?)
    +
    +

    +

    +causes an error at compile time. Branches that match different length strings +are permitted only at the top level of a lookbehind assertion. This is an +extension compared with Perl 5.005, which requires all branches to match the +same length of string. An assertion such as +

    +

    +

    +  (?<=ab(c|de))
    +
    +

    +

    +is not permitted, because its single top-level branch can match two different +lengths, but it is acceptable if rewritten to use two top-level branches: +

    +

    +

    +  (?<=abc|abde)
    +
    +

    +

    +The implementation of lookbehind assertions is, for each alternative, to +temporarily move the current position back by the fixed width and then try to +match. If there are insufficient characters before the current position, the +match is deemed to fail. Lookbehinds in conjunction with once-only subpatterns +can be particularly useful for matching at the ends of strings; an example is +given at the end of the section on once-only subpatterns. +

    +

    +Several assertions (of any sort) may occur in succession. For example, +

    +

    +

    +  (?<=\d{3})(?<!999)foo
    +
    +

    +

    +matches "foo" preceded by three digits that are not "999". Notice that each of +the assertions is applied independently at the same point in the subject +string. First there is a check that the previous three characters are all +digits, and then there is a check that the same three characters are not "999". +This pattern does not match "foo" preceded by six characters, the first +of which are digits and the last three of which are not "999". For example, it +doesn't match "123abcfoo". A pattern to do that is +

    +

    +

    +  (?<=\d{3}...)(?<!999)foo
    +
    +

    +

    +This time the first assertion looks at the preceding six characters, checking +that the first three are digits, and then the second assertion checks that the +preceding three characters are not "999". +

    +

    +Assertions can be nested in any combination. For example, +

    +

    +

    +  (?<=(?<!foo)bar)baz
    +
    +

    +

    +matches an occurrence of "baz" that is preceded by "bar" which in turn is not +preceded by "foo", while +

    +

    +

    +  (?<=\d{3}(?!999)...)foo
    +
    +

    +

    +is another pattern which matches "foo" preceded by three digits and any three +characters that are not "999". +

    +

    +Assertion subpatterns are not capturing subpatterns, and may not be repeated, +because it makes no sense to assert the same thing several times. If any kind +of assertion contains capturing subpatterns within it, these are counted for +the purposes of numbering the capturing subpatterns in the whole pattern. +However, substring capturing is carried out only for positive assertions, +because it does not make sense for negative assertions. +

    +

    +Assertions count towards the maximum of 200 parenthesized subpatterns. +

    +
  • ONCE-ONLY SUBPATTERNS +

    +With both maximizing and minimizing repetition, failure of what follows +normally causes the repeated item to be re-evaluated to see if a different +number of repeats allows the rest of the pattern to match. Sometimes it is +useful to prevent this, either to change the nature of the match, or to cause +it fail earlier than it otherwise might, when the author of the pattern knows +there is no point in carrying on. +

    +

    +Consider, for example, the pattern \d+foo when applied to the subject line +

    +

    +

    +  123456bar
    +
    +

    +

    +After matching all 6 digits and then failing to match "foo", the normal +action of the matcher is to try again with only 5 digits matching the \d+ +item, and then with 4, and so on, before ultimately failing. Once-only +subpatterns provide the means for specifying that once a portion of the pattern +has matched, it is not to be re-evaluated in this way, so the matcher would +give up immediately on failing to match "foo" the first time. The notation is +another kind of special parenthesis, starting with (?> as in this example: +

    +

    +

    +  (?>\d+)bar
    +
    +

    +

    +This kind of parenthesis "locks up" the part of the pattern it contains once +it has matched, and a failure further into the pattern is prevented from +backtracking into it. Backtracking past it to previous items, however, works as +normal. +

    +

    +An alternative description is that a subpattern of this type matches the string +of characters that an identical standalone pattern would match, if anchored at +the current point in the subject string. +

    +

    +Once-only subpatterns are not capturing subpatterns. Simple cases such as the +above example can be thought of as a maximizing repeat that must swallow +everything it can. So, while both \d+ and \d+? are prepared to adjust the +number of digits they match in order to make the rest of the pattern match, +(?>\d+) can only match an entire sequence of digits. +

    +

    +This construction can of course contain arbitrarily complicated subpatterns, +and it can be nested. +

    +

    +Once-only subpatterns can be used in conjunction with lookbehind assertions to +specify efficient matching at the end of the subject string. Consider a simple +pattern such as +

    +

    +

    +  abcd$
    +
    +

    +

    +when applied to a long string which does not match. Because matching proceeds +from left to right, PCRE will look for each "a" in the subject and then see if +what follows matches the rest of the pattern. If the pattern is specified as +

    +

    +

    +  ^.*abcd$
    +
    +

    +

    +the initial .* matches the entire string at first, but when this fails (because +there is no following "a"), it backtracks to match all but the last character, +then all but the last two characters, and so on. Once again the search for "a" +covers the entire string, from right to left, so we are no better off. However, +if the pattern is written as +

    +

    +

    +  ^(?>.*)(?<=abcd)
    +
    +

    +

    +there can be no backtracking for the .* item; it can match only the entire +string. The subsequent lookbehind assertion does a single test on the last four +characters. If it fails, the match fails immediately. For long strings, this +approach makes a significant difference to the processing time. +

    +

    +When a pattern contains an unlimited repeat inside a subpattern that can itself +be repeated an unlimited number of times, the use of a once-only subpattern is +the only way to avoid some failing matches taking a very long time indeed. +The pattern +

    +

    +

    +  (\D+|<\d+>)*[!?]
    +
    +

    +

    +matches an unlimited number of substrings that either consist of non-digits, or +digits enclosed in <>, followed by either ! or ?. When it matches, it runs +quickly. However, if it is applied to +

    +

    +

    +  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
    +
    +

    +

    +it takes a long time before reporting failure. This is because the string can +be divided between the two repeats in a large number of ways, and all have to +be tried. (The example used [!?] rather than a single character at the end, +because both PCRE and Perl have an optimization that allows for fast failure +when a single character is used. They remember the last single character that +is required for a match, and fail early if it is not present in the string.) +If the pattern is changed to +

    +

    +

    +  ((?>\D+)|<\d+>)*[!?]
    +
    +

    +

    +sequences of non-digits cannot be broken, and failure happens quickly. +

    +
  • CONDITIONAL SUBPATTERNS +

    +It is possible to cause the matching process to obey a subpattern +conditionally or to choose between two alternative subpatterns, depending on +the result of an assertion, or whether a previous capturing subpattern matched +or not. The two possible forms of conditional subpattern are +

    +

    +

    +  (?(condition)yes-pattern)
    +  (?(condition)yes-pattern|no-pattern)
    +
    +

    +

    +If the condition is satisfied, the yes-pattern is used; otherwise the +no-pattern (if present) is used. If there are more than two alternatives in the +subpattern, a compile-time error occurs. +

    +

    +There are two kinds of condition. If the text between the parentheses consists +of a sequence of digits, the condition is satisfied if the capturing subpattern +of that number has previously matched. The number must be greater than zero. +Consider the following pattern, which contains non-significant white space to +make it more readable (assume the PCRE_EXTENDED option) and to divide it into +three parts for ease of discussion: +

    +

    +

    +  ( \( )?    [^()]+    (?(1) \) )
    +
    +

    +

    +The first part matches an optional opening parenthesis, and if that +character is present, sets it as the first captured substring. The second part +matches one or more characters that are not parentheses. The third part is a +conditional subpattern that tests whether the first set of parentheses matched +or not. If they did, that is, if subject started with an opening parenthesis, +the condition is true, and so the yes-pattern is executed and a closing +parenthesis is required. Otherwise, since no-pattern is not present, the +subpattern matches nothing. In other words, this pattern matches a sequence of +non-parentheses, optionally enclosed in parentheses. +

    +

    +If the condition is not a sequence of digits, it must be an assertion. This may +be a positive or negative lookahead or lookbehind assertion. Consider this +pattern, again containing non-significant white space, and with the two +alternatives on the second line: +

    +

    +

    +  (?(?=[^a-z]*[a-z])
    +  \d{2}-[a-z]{3}-\d{2}  |  \d{2}-\d{2}-\d{2} )
    +
    +

    +

    +The condition is a positive lookahead assertion that matches an optional +sequence of non-letters followed by a letter. In other words, it tests for the +presence of at least one letter in the subject. If a letter is found, the +subject is matched against the first alternative; otherwise it is matched +against the second. This pattern matches strings in one of the two forms +dd-aaa-dd or dd-dd-dd, where aaa are letters and dd are digits. +

    +
  • COMMENTS +

    +The sequence (?# marks the start of a comment which continues up to the next +closing parenthesis. Nested parentheses are not permitted. The characters +that make up a comment play no part in the pattern matching at all. +

    +

    +If the PCRE_EXTENDED option is set, an unescaped # character outside a +character class introduces a comment that continues up to the next newline +character in the pattern. +

    +
  • RECURSIVE PATTERNS +

    +Consider the problem of matching a string in parentheses, allowing for +unlimited nested parentheses. Without the use of recursion, the best that can +be done is to use a pattern that matches up to some fixed depth of nesting. It +is not possible to handle an arbitrary nesting depth. Perl 5.6 has provided an +experimental facility that allows regular expressions to recurse (amongst other +things). It does this by interpolating Perl code in the expression at run time, +and the code can refer to the expression itself. A Perl pattern to solve the +parentheses problem can be created like this: +

    +

    +

    +  $re = qr{\( (?: (?>[^()]+) | (?p{$re}) )* \)}x;
    +
    +

    +

    +The (?p{...}) item interpolates Perl code at run time, and in this case refers +recursively to the pattern in which it appears. Obviously, PCRE cannot support +the interpolation of Perl code. Instead, the special item (?R) is provided for +the specific case of recursion. This PCRE pattern solves the parentheses +problem (assume the PCRE_EXTENDED option is set so that white space is +ignored): +

    +

    +

    +  \( ( (?>[^()]+) | (?R) )* \)
    +
    +

    +

    +First it matches an opening parenthesis. Then it matches any number of +substrings which can either be a sequence of non-parentheses, or a recursive +match of the pattern itself (i.e. a correctly parenthesized substring). Finally +there is a closing parenthesis. +

    +

    +This particular example pattern contains nested unlimited repeats, and so the +use of a once-only subpattern for matching strings of non-parentheses is +important when applying the pattern to strings that do not match. For example, +when it is applied to +

    +

    +

    +  (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa()
    +
    +

    +

    +it yields "no match" quickly. However, if a once-only subpattern is not used, +the match runs for a very long time indeed because there are so many different +ways the + and * repeats can carve up the subject, and all have to be tested +before failure can be reported. +

    +

    +The values set for any capturing subpatterns are those from the outermost level +of the recursion at which the subpattern value is set. If the pattern above is +matched against +

    +

    +

    +  (ab(cd)ef)
    +
    +

    +

    +the value for the capturing parentheses is "ef", which is the last value taken +on at the top level. If additional parentheses are added, giving +

    +

    +

    +  \( ( ( (?>[^()]+) | (?R) )* ) \)
    +     ^                        ^
    +     ^                        ^
    +
    +the string they capture is "ab(cd)ef", the contents of the top level +parentheses. If there are more than 15 capturing parentheses in a pattern, PCRE +has to obtain extra memory to store data during a recursion, which it does by +using pcre_malloc, freeing it via pcre_free afterwards. If no +memory can be obtained, it saves data for the first 15 capturing parentheses +only, as there is no way to give an out-of-memory error from within a +recursion. +

    +
  • PERFORMANCE +

    +Certain items that may appear in patterns are more efficient than others. It is +more efficient to use a character class like [aeiou] than a set of alternatives +such as (a|e|i|o|u). In general, the simplest construction that provides the +required behaviour is usually the most efficient. Jeffrey Friedl's book +contains a lot of discussion about optimizing regular expressions for efficient +performance. +

    +

    +When a pattern begins with .* and the PCRE_DOTALL option is set, the pattern is +implicitly anchored by PCRE, since it can match only at the start of a subject +string. However, if PCRE_DOTALL is not set, PCRE cannot make this optimization, +because the . metacharacter does not then match a newline, and if the subject +string contains newlines, the pattern may match from the character immediately +following one of them instead of from the very start. For example, the pattern +

    +

    +

    +  (.*) second
    +
    +

    +

    +matches the subject "first\nand second" (where \n stands for a newline +character) with the first captured substring being "and". In order to do this, +PCRE has to retry the match starting after every newline in the subject. +

    +

    +If you are using such a pattern with subject strings that do not contain +newlines, the best performance is obtained by setting PCRE_DOTALL, or starting +the pattern with ^.* to indicate explicit anchoring. That saves PCRE from +having to scan along the subject looking for a newline to restart at. +

    +

    +Beware of patterns that contain nested indefinite repeats. These can take a +long time to run when applied to a string that does not match. Consider the +pattern fragment +

    +

    +

    +  (a+)*
    +
    +

    +

    +This can match "aaaa" in 33 different ways, and this number increases very +rapidly as the string gets longer. (The * repeat can match 0, 1, 2, 3, or 4 +times, and for each of those cases other than 0, the + repeats can match +different numbers of times.) When the remainder of the pattern is such that the +entire match is going to fail, PCRE has in principle to try every possible +variation, and this can take an extremely long time. +

    +

    +An optimization catches some of the more simple cases such as +

    +

    +

    +  (a+)*b
    +
    +

    +

    +where a literal character follows. Before embarking on the standard matching +procedure, PCRE checks that there is a "b" later in the subject string, and if +there is not, it fails the match immediately. However, when there is no +following literal this optimization cannot be used. You can see the difference +by comparing the behaviour of +

    +

    +

    +  (a+)*\d
    +
    +

    +

    +with the pattern above. The former gives a failure almost instantly when +applied to a whole line of "a" characters, whereas the latter takes an +appreciable time with strings longer than about 20 characters. +

    +
  • UTF-8 SUPPORT +

    +Starting at release 3.3, PCRE has some support for character strings encoded +in the UTF-8 format. This is incomplete, and is regarded as experimental. In +order to use it, you must configure PCRE to include UTF-8 support in the code, +and, in addition, you must call pcre_compile() with the PCRE_UTF8 option +flag. When you do this, both the pattern and any subject strings that are +matched against it are treated as UTF-8 strings instead of just strings of +bytes, but only in the cases that are mentioned below. +

    +

    +If you compile PCRE with UTF-8 support, but do not use it at run time, the +library will be a bit bigger, but the additional run time overhead is limited +to testing the PCRE_UTF8 flag in several places, so should not be very large. +

    +

    +PCRE assumes that the strings it is given contain valid UTF-8 codes. It does +not diagnose invalid UTF-8 strings. If you pass invalid UTF-8 strings to PCRE, +the results are undefined. +

    +

    +Running with PCRE_UTF8 set causes these changes in the way PCRE works: +

    +

    +1. In a pattern, the escape sequence \x{...}, where the contents of the braces +is a string of hexadecimal digits, is interpreted as a UTF-8 character whose +code number is the given hexadecimal number, for example: \x{1234}. This +inserts from one to six literal bytes into the pattern, using the UTF-8 +encoding. If a non-hexadecimal digit appears between the braces, the item is +not recognized. +

    +

    +2. The original hexadecimal escape sequence, \xhh, generates a two-byte UTF-8 +character if its value is greater than 127. +

    +

    +3. Repeat quantifiers are NOT correctly handled if they follow a multibyte +character. For example, \x{100}* and \xc3+ do not work. If you want to +repeat such characters, you must enclose them in non-capturing parentheses, +for example (?:\x{100}), at present. +

    +

    +4. The dot metacharacter matches one UTF-8 character instead of a single byte. +

    +

    +5. Unlike literal UTF-8 characters, the dot metacharacter followed by a +repeat quantifier does operate correctly on UTF-8 characters instead of +single bytes. +

    +

    +4. Although the \x{...} escape is permitted in a character class, characters +whose values are greater than 255 cannot be included in a class. +

    +

    +5. A class is matched against a UTF-8 character instead of just a single byte, +but it can match only characters whose values are less than 256. Characters +with greater values always fail to match a class. +

    +

    +6. Repeated classes work correctly on multiple characters. +

    +

    +7. Classes containing just a single character whose value is greater than 127 +(but less than 256), for example, [\x80] or [^\x{93}], do not work because +these are optimized into single byte matches. In the first case, of course, +the class brackets are just redundant. +

    +

    +8. Lookbehind assertions move backwards in the subject by a fixed number of +characters instead of a fixed number of bytes. Simple cases have been tested +to work correctly, but there may be hidden gotchas herein. +

    +

    +9. The character types such as \d and \w do not work correctly with UTF-8 +characters. They continue to test a single byte. +

    +

    +10. Anything not explicitly mentioned here continues to work in bytes rather +than in characters. +

    +

    +The following UTF-8 features of Perl 5.6 are not implemented: +

    +

    +1. The escape sequence \C to match a single byte. +

    +

    +2. The use of Unicode tables and properties and escapes \p, \P, and \X. +

    +
  • SAMPLE PROGRAM +

    +The code below is a simple, complete demonstration program, to get you started +with using PCRE. This code is also supplied in the file pcredemo.c in the +PCRE distribution. +

    +

    +The program compiles the regular expression that is its first argument, and +matches it against the subject string in its second argument. No options are +set, and default character tables are used. If matching succeeds, the program +outputs the portion of the subject that matched, together with the contents of +any captured substrings. +

    +

    +On a Unix system that has PCRE installed in /usr/local, you can compile +the demonstration program using a command like this: +

    +

    +

    +  gcc -o pcredemo pcredemo.c -I/usr/local/include -L/usr/local/lib -lpcre
    +
    +

    +

    +Then you can run simple tests like this: +

    +

    +

    +  ./pcredemo 'cat|dog' 'the cat sat on the mat'
    +
    +

    +

    +Note that there is a much more comprehensive test program, called +pcretest, which supports many more facilities for testing regular +expressions. The pcredemo program is provided as a simple coding example. +

    +

    +On some operating systems (e.g. Solaris) you may get an error like this when +you try to run pcredemo: +

    +

    +

    +  ld.so.1: a.out: fatal: libpcre.so.0: open failed: No such file or directory
    +
    +

    +

    +This is caused by the way shared library support works on those systems. You +need to add +

    +

    +

    +  -R/usr/local/lib
    +
    +

    +

    +to the compile command to get round this problem. Here's the code: +

    +

    +

    +  #include <stdio.h>
    +  #include <string.h>
    +  #include <pcre.h>
    +
    +

    +

    +

    +  #define OVECCOUNT 30    /* should be a multiple of 3 */
    +
    +

    +

    +

    +  int main(int argc, char **argv)
    +  {
    +  pcre *re;
    +  const char *error;
    +  int erroffset;
    +  int ovector[OVECCOUNT];
    +  int rc, i;
    +
    +

    +

    +

    +  if (argc != 3)
    +    {
    +    printf("Two arguments required: a regex and a "
    +      "subject string\n");
    +    return 1;
    +    }
    +
    +

    +

    +

    +  /* Compile the regular expression in the first argument */
    +
    +

    +

    +

    +  re = pcre_compile(
    +    argv[1],     /* the pattern */
    +    0,           /* default options */
    +    &error,      /* for error message */
    +    &erroffset,  /* for error offset */
    +    NULL);       /* use default character tables */
    +
    +

    +

    +

    +  /* Compilation failed: print the error message and exit */
    +
    +

    +

    +

    +  if (re == NULL)
    +    {
    +    printf("PCRE compilation failed at offset %d: %s\n",
    +      erroffset, error);
    +    return 1;
    +    }
    +
    +

    +

    +

    +  /* Compilation succeeded: match the subject in the second
    +     argument */
    +
    +

    +

    +

    +  rc = pcre_exec(
    +    re,          /* the compiled pattern */
    +    NULL,        /* we didn't study the pattern */
    +    argv[2],     /* the subject string */
    +    (int)strlen(argv[2]), /* the length of the subject */
    +    0,           /* start at offset 0 in the subject */
    +    0,           /* default options */
    +    ovector,     /* vector for substring information */
    +    OVECCOUNT);  /* number of elements in the vector */
    +
    +

    +

    +

    +  /* Matching failed: handle error cases */
    +
    +

    +

    +

    +  if (rc < 0)
    +    {
    +    switch(rc)
    +      {
    +      case PCRE_ERROR_NOMATCH: printf("No match\n"); break;
    +      /*
    +      Handle other special cases if you like
    +      */
    +      default: printf("Matching error %d\n", rc); break;
    +      }
    +    return 1;
    +    }
    +
    +

    +

    +

    +  /* Match succeded */
    +
    +

    +

    +

    +  printf("Match succeeded\n");
    +
    +

    +

    +

    +  /* The output vector wasn't big enough */
    +
    +

    +

    +

    +  if (rc == 0)
    +    {
    +    rc = OVECCOUNT/3;
    +    printf("ovector only has room for %d captured "
    +      substrings\n", rc - 1);
    +    }
    +
    +

    +

    +

    +  /* Show substrings stored in the output vector */
    +
    +

    +

    +

    +  for (i = 0; i < rc; i++)
    +    {
    +    char *substring_start = argv[2] + ovector[2*i];
    +    int substring_length = ovector[2*i+1] - ovector[2*i];
    +    printf("%2d: %.*s\n", i, substring_length,
    +      substring_start);
    +    }
    +
    +

    +

    +

    +  return 0;
    +  }
    +
    +

    +
  • AUTHOR +

    +Philip Hazel <ph10@cam.ac.uk> +
    +University Computing Service, +
    +New Museums Site, +
    +Cambridge CB2 3QG, England. +
    +Phone: +44 1223 334714 +

    +

    +Last updated: 15 August 2001 +
    +Copyright (c) 1997-2001 University of Cambridge. diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/doc/pcre.txt b/rubbos/app/httpd-2.0.64/srclib/pcre/doc/pcre.txt new file mode 100644 index 00000000..95f148f3 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/doc/pcre.txt @@ -0,0 +1,2315 @@ +NAME + pcre - Perl-compatible regular expressions. + + + +SYNOPSIS + #include + + pcre *pcre_compile(const char *pattern, int options, + const char **errptr, int *erroffset, + const unsigned char *tableptr); + + pcre_extra *pcre_study(const pcre *code, int options, + const char **errptr); + + int pcre_exec(const pcre *code, const pcre_extra *extra, + const char *subject, int length, int startoffset, + int options, int *ovector, int ovecsize); + + int pcre_copy_substring(const char *subject, int *ovector, + int stringcount, int stringnumber, char *buffer, + int buffersize); + + int pcre_get_substring(const char *subject, int *ovector, + int stringcount, int stringnumber, + const char **stringptr); + + int pcre_get_substring_list(const char *subject, + int *ovector, int stringcount, const char ***listptr); + + void pcre_free_substring(const char *stringptr); + + void pcre_free_substring_list(const char **stringptr); + + const unsigned char *pcre_maketables(void); + + int pcre_fullinfo(const pcre *code, const pcre_extra *extra, + int what, void *where); + + int pcre_info(const pcre *code, int *optptr, *firstcharptr); + + char *pcre_version(void); + + void *(*pcre_malloc)(size_t); + + void (*pcre_free)(void *); + + + + +DESCRIPTION + The PCRE library is a set of functions that implement regu- + lar expression pattern matching using the same syntax and + semantics as Perl 5, with just a few differences (see + + below). The current implementation corresponds to Perl + 5.005, with some additional features from later versions. + This includes some experimental, incomplete support for + UTF-8 encoded strings. Details of exactly what is and what + is not supported are given below. + + PCRE has its own native API, which is described in this + document. There is also a set of wrapper functions that + correspond to the POSIX regular expression API. These are + described in the pcreposix documentation. + + The native API function prototypes are defined in the header + file pcre.h, and on Unix systems the library itself is + called libpcre.a, so can be accessed by adding -lpcre to the + command for linking an application which calls it. The + header file defines the macros PCRE_MAJOR and PCRE_MINOR to + contain the major and minor release numbers for the library. + Applications can use these to include support for different + releases. + + The functions pcre_compile(), pcre_study(), and pcre_exec() + are used for compiling and matching regular expressions. A + sample program that demonstrates the simplest way of using + them is given in the file pcredemo.c. The last section of + this man page describes how to run it. + + The functions pcre_copy_substring(), pcre_get_substring(), + and pcre_get_substring_list() are convenience functions for + extracting captured substrings from a matched subject + string; pcre_free_substring() and pcre_free_substring_list() + are also provided, to free the memory used for extracted + strings. + + The function pcre_maketables() is used (optionally) to build + a set of character tables in the current locale for passing + to pcre_compile(). + + The function pcre_fullinfo() is used to find out information + about a compiled pattern; pcre_info() is an obsolete version + which returns only some of the available information, but is + retained for backwards compatibility. The function + pcre_version() returns a pointer to a string containing the + version of PCRE and its date of release. + + The global variables pcre_malloc and pcre_free initially + contain the entry points of the standard malloc() and free() + functions respectively. PCRE calls the memory management + functions via these variables, so a calling program can + replace them if it wishes to intercept the calls. This + should be done before calling any PCRE functions. + + + +MULTI-THREADING + The PCRE functions can be used in multi-threading applica- + tions, with the proviso that the memory management functions + pointed to by pcre_malloc and pcre_free are shared by all + threads. + + The compiled form of a regular expression is not altered + during matching, so the same compiled pattern can safely be + used by several threads at once. + + + +COMPILING A PATTERN + The function pcre_compile() is called to compile a pattern + into an internal form. The pattern is a C string terminated + by a binary zero, and is passed in the argument pattern. A + pointer to a single block of memory that is obtained via + pcre_malloc is returned. This contains the compiled code and + related data. The pcre type is defined for the returned + block; this is a typedef for a structure whose contents are + not externally defined. It is up to the caller to free the + memory when it is no longer required. + + Although the compiled code of a PCRE regex is relocatable, + that is, it does not depend on memory location, the complete + pcre data block is not fully relocatable, because it con- + tains a copy of the tableptr argument, which is an address + (see below). + + The size of a compiled pattern is roughly proportional to + the length of the pattern string, except that each character + class (other than those containing just a single character, + negated or not) requires 33 bytes, and repeat quantifiers + with a minimum greater than one or a bounded maximum cause + the relevant portions of the compiled pattern to be repli- + cated. + + The options argument contains independent bits that affect + the compilation. It should be zero if no options are + required. Some of the options, in particular, those that are + compatible with Perl, can also be set and unset from within + the pattern (see the detailed description of regular expres- + sions below). For these options, the contents of the options + argument specifies their initial settings at the start of + compilation and execution. The PCRE_ANCHORED option can be + set at the time of matching as well as at compile time. + + If errptr is NULL, pcre_compile() returns NULL immediately. + Otherwise, if compilation of a pattern fails, pcre_compile() + returns NULL, and sets the variable pointed to by errptr to + point to a textual error message. The offset from the start + of the pattern to the character where the error was + discovered is placed in the variable pointed to by + erroffset, which must not be NULL. If it is, an immediate + error is given. + + If the final argument, tableptr, is NULL, PCRE uses a + default set of character tables which are built when it is + compiled, using the default C locale. Otherwise, tableptr + must be the result of a call to pcre_maketables(). See the + section on locale support below. + + This code fragment shows a typical straightforward call to + pcre_compile(): + + pcre *re; + const char *error; + int erroffset; + re = pcre_compile( + "^A.*Z", /* the pattern */ + 0, /* default options */ + &error, /* for error message */ + &erroffset, /* for error offset */ + NULL); /* use default character tables */ + + The following option bits are defined in the header file: + + PCRE_ANCHORED + + If this bit is set, the pattern is forced to be "anchored", + that is, it is constrained to match only at the start of the + string which is being searched (the "subject string"). This + effect can also be achieved by appropriate constructs in the + pattern itself, which is the only way to do it in Perl. + + PCRE_CASELESS + + If this bit is set, letters in the pattern match both upper + and lower case letters. It is equivalent to Perl's /i + option. + + PCRE_DOLLAR_ENDONLY + + If this bit is set, a dollar metacharacter in the pattern + matches only at the end of the subject string. Without this + option, a dollar also matches immediately before the final + character if it is a newline (but not before any other new- + lines). The PCRE_DOLLAR_ENDONLY option is ignored if + PCRE_MULTILINE is set. There is no equivalent to this option + in Perl. + + PCRE_DOTALL + + If this bit is set, a dot metacharater in the pattern + matches all characters, including newlines. Without it, new- + lines are excluded. This option is equivalent to Perl's /s + option. A negative class such as [^a] always matches a new- + line character, independent of the setting of this option. + + PCRE_EXTENDED + + If this bit is set, whitespace data characters in the pat- + tern are totally ignored except when escaped or inside a + character class, and characters between an unescaped # out- + side a character class and the next newline character, + inclusive, are also ignored. This is equivalent to Perl's /x + option, and makes it possible to include comments inside + complicated patterns. Note, however, that this applies only + to data characters. Whitespace characters may never appear + within special character sequences in a pattern, for example + within the sequence (?( which introduces a conditional sub- + pattern. + + PCRE_EXTRA + + This option was invented in order to turn on additional + functionality of PCRE that is incompatible with Perl, but it + is currently of very little use. When set, any backslash in + a pattern that is followed by a letter that has no special + meaning causes an error, thus reserving these combinations + for future expansion. By default, as in Perl, a backslash + followed by a letter with no special meaning is treated as a + literal. There are at present no other features controlled + by this option. It can also be set by a (?X) option setting + within a pattern. + + PCRE_MULTILINE + + By default, PCRE treats the subject string as consisting of + a single "line" of characters (even if it actually contains + several newlines). The "start of line" metacharacter (^) + matches only at the start of the string, while the "end of + line" metacharacter ($) matches only at the end of the + string, or before a terminating newline (unless + PCRE_DOLLAR_ENDONLY is set). This is the same as Perl. + + When PCRE_MULTILINE it is set, the "start of line" and "end + of line" constructs match immediately following or immedi- + ately before any newline in the subject string, respec- + tively, as well as at the very start and end. This is + equivalent to Perl's /m option. If there are no "\n" charac- + ters in a subject string, or no occurrences of ^ or $ in a + pattern, setting PCRE_MULTILINE has no effect. + + PCRE_UNGREEDY + + This option inverts the "greediness" of the quantifiers so + that they are not greedy by default, but become greedy if + followed by "?". It is not compatible with Perl. It can also + be set by a (?U) option setting within the pattern. + + PCRE_UTF8 + + This option causes PCRE to regard both the pattern and the + subject as strings of UTF-8 characters instead of just byte + strings. However, it is available only if PCRE has been + built to include UTF-8 support. If not, the use of this + option provokes an error. Support for UTF-8 is new, experi- + mental, and incomplete. Details of exactly what it entails + are given below. + + + +STUDYING A PATTERN + When a pattern is going to be used several times, it is + worth spending more time analyzing it in order to speed up + the time taken for matching. The function pcre_study() takes + a pointer to a compiled pattern as its first argument, and + returns a pointer to a pcre_extra block (another typedef for + a structure with hidden contents) containing additional + information about the pattern; this can be passed to + pcre_exec(). If no additional information is available, NULL + is returned. + + The second argument contains option bits. At present, no + options are defined for pcre_study(), and this argument + should always be zero. + + The third argument for pcre_study() is a pointer to an error + message. If studying succeeds (even if no data is returned), + the variable it points to is set to NULL. Otherwise it + points to a textual error message. + + This is a typical call to pcre_study(): + + pcre_extra *pe; + pe = pcre_study( + re, /* result of pcre_compile() */ + 0, /* no options exist */ + &error); /* set to NULL or points to a message */ + + At present, studying a pattern is useful only for non- + anchored patterns that do not have a single fixed starting + character. A bitmap of possible starting characters is + created. + + + +LOCALE SUPPORT + PCRE handles caseless matching, and determines whether char- + acters are letters, digits, or whatever, by reference to a + set of tables. The library contains a default set of tables + which is created in the default C locale when PCRE is com- + piled. This is used when the final argument of + pcre_compile() is NULL, and is sufficient for many applica- + tions. + + An alternative set of tables can, however, be supplied. Such + tables are built by calling the pcre_maketables() function, + which has no arguments, in the relevant locale. The result + can then be passed to pcre_compile() as often as necessary. + For example, to build and use tables that are appropriate + for the French locale (where accented characters with codes + greater than 128 are treated as letters), the following code + could be used: + + setlocale(LC_CTYPE, "fr"); + tables = pcre_maketables(); + re = pcre_compile(..., tables); + + The tables are built in memory that is obtained via + pcre_malloc. The pointer that is passed to pcre_compile is + saved with the compiled pattern, and the same tables are + used via this pointer by pcre_study() and pcre_exec(). Thus + for any single pattern, compilation, studying and matching + all happen in the same locale, but different patterns can be + compiled in different locales. It is the caller's responsi- + bility to ensure that the memory containing the tables + remains available for as long as it is needed. + + + +INFORMATION ABOUT A PATTERN + The pcre_fullinfo() function returns information about a + compiled pattern. It replaces the obsolete pcre_info() func- + tion, which is nevertheless retained for backwards compabil- + ity (and is documented below). + + The first argument for pcre_fullinfo() is a pointer to the + compiled pattern. The second argument is the result of + pcre_study(), or NULL if the pattern was not studied. The + third argument specifies which piece of information is + required, while the fourth argument is a pointer to a vari- + able to receive the data. The yield of the function is zero + for success, or one of the following negative numbers: + + PCRE_ERROR_NULL the argument code was NULL + the argument where was NULL + PCRE_ERROR_BADMAGIC the "magic number" was not found + PCRE_ERROR_BADOPTION the value of what was invalid + + Here is a typical call of pcre_fullinfo(), to obtain the + length of the compiled pattern: + + int rc; + unsigned long int length; + rc = pcre_fullinfo( + re, /* result of pcre_compile() */ + pe, /* result of pcre_study(), or NULL */ + PCRE_INFO_SIZE, /* what is required */ + &length); /* where to put the data */ + + The possible values for the third argument are defined in + pcre.h, and are as follows: + + PCRE_INFO_OPTIONS + + Return a copy of the options with which the pattern was com- + piled. The fourth argument should point to an unsigned long + int variable. These option bits are those specified in the + call to pcre_compile(), modified by any top-level option + settings within the pattern itself, and with the + PCRE_ANCHORED bit forcibly set if the form of the pattern + implies that it can match only at the start of a subject + string. + + PCRE_INFO_SIZE + + Return the size of the compiled pattern, that is, the value + that was passed as the argument to pcre_malloc() when PCRE + was getting memory in which to place the compiled data. The + fourth argument should point to a size_t variable. + + PCRE_INFO_CAPTURECOUNT + + Return the number of capturing subpatterns in the pattern. + The fourth argument should point to an int variable. + + PCRE_INFO_BACKREFMAX + + Return the number of the highest back reference in the pat- + tern. The fourth argument should point to an int variable. + Zero is returned if there are no back references. + + PCRE_INFO_FIRSTCHAR + + Return information about the first character of any matched + string, for a non-anchored pattern. If there is a fixed + first character, e.g. from a pattern such as + (cat|cow|coyote), it is returned in the integer pointed to + by where. Otherwise, if either + + (a) the pattern was compiled with the PCRE_MULTILINE option, + and every branch starts with "^", or + + (b) every branch of the pattern starts with ".*" and + PCRE_DOTALL is not set (if it were set, the pattern would be + anchored), + + -1 is returned, indicating that the pattern matches only at + the start of a subject string or after any "\n" within the + string. Otherwise -2 is returned. For anchored patterns, -2 + is returned. + + PCRE_INFO_FIRSTTABLE + + If the pattern was studied, and this resulted in the con- + struction of a 256-bit table indicating a fixed set of char- + acters for the first character in any matching string, a + pointer to the table is returned. Otherwise NULL is + returned. The fourth argument should point to an unsigned + char * variable. + + PCRE_INFO_LASTLITERAL + + For a non-anchored pattern, return the value of the right- + most literal character which must exist in any matched + string, other than at its start. The fourth argument should + point to an int variable. If there is no such character, or + if the pattern is anchored, -1 is returned. For example, for + the pattern /a\d+z\d+/ the returned value is 'z'. + + The pcre_info() function is now obsolete because its inter- + face is too restrictive to return all the available data + about a compiled pattern. New programs should use + pcre_fullinfo() instead. The yield of pcre_info() is the + number of capturing subpatterns, or one of the following + negative numbers: + + PCRE_ERROR_NULL the argument code was NULL + PCRE_ERROR_BADMAGIC the "magic number" was not found + + If the optptr argument is not NULL, a copy of the options + with which the pattern was compiled is placed in the integer + it points to (see PCRE_INFO_OPTIONS above). + + If the pattern is not anchored and the firstcharptr argument + is not NULL, it is used to pass back information about the + first character of any matched string (see + PCRE_INFO_FIRSTCHAR above). + + + +MATCHING A PATTERN + The function pcre_exec() is called to match a subject string + + + + + +SunOS 5.8 Last change: 9 + + + + against a pre-compiled pattern, which is passed in the code + argument. If the pattern has been studied, the result of the + study should be passed in the extra argument. Otherwise this + must be NULL. + + Here is an example of a simple call to pcre_exec(): + + int rc; + int ovector[30]; + rc = pcre_exec( + re, /* result of pcre_compile() */ + NULL, /* we didn't study the pattern */ + "some string", /* the subject string */ + 11, /* the length of the subject string */ + 0, /* start at offset 0 in the subject */ + 0, /* default options */ + ovector, /* vector for substring information */ + 30); /* number of elements in the vector */ + + The PCRE_ANCHORED option can be passed in the options argu- + ment, whose unused bits must be zero. However, if a pattern + was compiled with PCRE_ANCHORED, or turned out to be + anchored by virtue of its contents, it cannot be made + unachored at matching time. + + There are also three further options that can be set only at + matching time: + + PCRE_NOTBOL + + The first character of the string is not the beginning of a + line, so the circumflex metacharacter should not match + before it. Setting this without PCRE_MULTILINE (at compile + time) causes circumflex never to match. + + PCRE_NOTEOL + + The end of the string is not the end of a line, so the dol- + lar metacharacter should not match it nor (except in multi- + line mode) a newline immediately before it. Setting this + without PCRE_MULTILINE (at compile time) causes dollar never + to match. + + PCRE_NOTEMPTY + + An empty string is not considered to be a valid match if + this option is set. If there are alternatives in the pat- + tern, they are tried. If all the alternatives match the + empty string, the entire match fails. For example, if the + pattern + + a?b? + + is applied to a string not beginning with "a" or "b", it + matches the empty string at the start of the subject. With + PCRE_NOTEMPTY set, this match is not valid, so PCRE searches + further into the string for occurrences of "a" or "b". + + Perl has no direct equivalent of PCRE_NOTEMPTY, but it does + make a special case of a pattern match of the empty string + within its split() function, and when using the /g modifier. + It is possible to emulate Perl's behaviour after matching a + null string by first trying the match again at the same + offset with PCRE_NOTEMPTY set, and then if that fails by + advancing the starting offset (see below) and trying an + ordinary match again. + + The subject string is passed as a pointer in subject, a + length in length, and a starting offset in startoffset. + Unlike the pattern string, the subject may contain binary + zero characters. When the starting offset is zero, the + search for a match starts at the beginning of the subject, + and this is by far the most common case. + + A non-zero starting offset is useful when searching for + another match in the same subject by calling pcre_exec() + again after a previous success. Setting startoffset differs + from just passing over a shortened string and setting + PCRE_NOTBOL in the case of a pattern that begins with any + kind of lookbehind. For example, consider the pattern + + \Biss\B + + which finds occurrences of "iss" in the middle of words. (\B + matches only if the current position in the subject is not a + word boundary.) When applied to the string "Mississipi" the + first call to pcre_exec() finds the first occurrence. If + pcre_exec() is called again with just the remainder of the + subject, namely "issipi", it does not match, because \B is + always false at the start of the subject, which is deemed to + be a word boundary. However, if pcre_exec() is passed the + entire string again, but with startoffset set to 4, it finds + the second occurrence of "iss" because it is able to look + behind the starting point to discover that it is preceded by + a letter. + + If a non-zero starting offset is passed when the pattern is + anchored, one attempt to match at the given offset is tried. + This can only succeed if the pattern does not require the + match to be at the start of the subject. + + In general, a pattern matches a certain portion of the sub- + ject, and in addition, further substrings from the subject + may be picked out by parts of the pattern. Following the + usage in Jeffrey Friedl's book, this is called "capturing" + in what follows, and the phrase "capturing subpattern" is + used for a fragment of a pattern that picks out a substring. + PCRE supports several other kinds of parenthesized subpat- + tern that do not cause substrings to be captured. + + Captured substrings are returned to the caller via a vector + of integer offsets whose address is passed in ovector. The + number of elements in the vector is passed in ovecsize. The + first two-thirds of the vector is used to pass back captured + substrings, each substring using a pair of integers. The + remaining third of the vector is used as workspace by + pcre_exec() while matching capturing subpatterns, and is not + available for passing back information. The length passed in + ovecsize should always be a multiple of three. If it is not, + it is rounded down. + + When a match has been successful, information about captured + substrings is returned in pairs of integers, starting at the + beginning of ovector, and continuing up to two-thirds of its + length at the most. The first element of a pair is set to + the offset of the first character in a substring, and the + second is set to the offset of the first character after the + end of a substring. The first pair, ovector[0] and ovec- + tor[1], identify the portion of the subject string matched + by the entire pattern. The next pair is used for the first + capturing subpattern, and so on. The value returned by + pcre_exec() is the number of pairs that have been set. If + there are no capturing subpatterns, the return value from a + successful match is 1, indicating that just the first pair + of offsets has been set. + + Some convenience functions are provided for extracting the + captured substrings as separate strings. These are described + in the following section. + + It is possible for an capturing subpattern number n+1 to + match some part of the subject when subpattern n has not + been used at all. For example, if the string "abc" is + matched against the pattern (a|(z))(bc) subpatterns 1 and 3 + are matched, but 2 is not. When this happens, both offset + values corresponding to the unused subpattern are set to -1. + + If a capturing subpattern is matched repeatedly, it is the + last portion of the string that it matched that gets + returned. + + If the vector is too small to hold all the captured sub- + strings, it is used as far as possible (up to two-thirds of + its length), and the function returns a value of zero. In + particular, if the substring offsets are not of interest, + pcre_exec() may be called with ovector passed as NULL and + ovecsize as zero. However, if the pattern contains back + references and the ovector isn't big enough to remember the + related substrings, PCRE has to get additional memory for + use during matching. Thus it is usually advisable to supply + an ovector. + + Note that pcre_info() can be used to find out how many cap- + turing subpatterns there are in a compiled pattern. The + smallest size for ovector that will allow for n captured + substrings in addition to the offsets of the substring + matched by the whole pattern is (n+1)*3. + + If pcre_exec() fails, it returns a negative number. The fol- + lowing are defined in the header file: + + PCRE_ERROR_NOMATCH (-1) + + The subject string did not match the pattern. + + PCRE_ERROR_NULL (-2) + + Either code or subject was passed as NULL, or ovector was + NULL and ovecsize was not zero. + + PCRE_ERROR_BADOPTION (-3) + + An unrecognized bit was set in the options argument. + + PCRE_ERROR_BADMAGIC (-4) + + PCRE stores a 4-byte "magic number" at the start of the com- + piled code, to catch the case when it is passed a junk + pointer. This is the error it gives when the magic number + isn't present. + + PCRE_ERROR_UNKNOWN_NODE (-5) + + While running the pattern match, an unknown item was encoun- + tered in the compiled pattern. This error could be caused by + a bug in PCRE or by overwriting of the compiled pattern. + + PCRE_ERROR_NOMEMORY (-6) + + If a pattern contains back references, but the ovector that + is passed to pcre_exec() is not big enough to remember the + referenced substrings, PCRE gets a block of memory at the + start of matching to use for this purpose. If the call via + pcre_malloc() fails, this error is given. The memory is + freed at the end of matching. + + + + +EXTRACTING CAPTURED SUBSTRINGS + Captured substrings can be accessed directly by using the + offsets returned by pcre_exec() in ovector. For convenience, + the functions pcre_copy_substring(), pcre_get_substring(), + and pcre_get_substring_list() are provided for extracting + captured substrings as new, separate, zero-terminated + strings. A substring that contains a binary zero is + correctly extracted and has a further zero added on the end, + but the result does not, of course, function as a C string. + + The first three arguments are the same for all three func- + tions: subject is the subject string which has just been + successfully matched, ovector is a pointer to the vector of + integer offsets that was passed to pcre_exec(), and + stringcount is the number of substrings that were captured + by the match, including the substring that matched the + entire regular expression. This is the value returned by + pcre_exec if it is greater than zero. If pcre_exec() + returned zero, indicating that it ran out of space in ovec- + tor, the value passed as stringcount should be the size of + the vector divided by three. + + The functions pcre_copy_substring() and pcre_get_substring() + extract a single substring, whose number is given as string- + number. A value of zero extracts the substring that matched + the entire pattern, while higher values extract the captured + substrings. For pcre_copy_substring(), the string is placed + in buffer, whose length is given by buffersize, while for + pcre_get_substring() a new block of memory is obtained via + pcre_malloc, and its address is returned via stringptr. The + yield of the function is the length of the string, not + including the terminating zero, or one of + + PCRE_ERROR_NOMEMORY (-6) + + The buffer was too small for pcre_copy_substring(), or the + attempt to get memory failed for pcre_get_substring(). + + PCRE_ERROR_NOSUBSTRING (-7) + + There is no substring whose number is stringnumber. + + The pcre_get_substring_list() function extracts all avail- + able substrings and builds a list of pointers to them. All + this is done in a single block of memory which is obtained + via pcre_malloc. The address of the memory block is returned + via listptr, which is also the start of the list of string + pointers. The end of the list is marked by a NULL pointer. + The yield of the function is zero if all went well, or + + PCRE_ERROR_NOMEMORY (-6) + + if the attempt to get the memory block failed. + + When any of these functions encounter a substring that is + unset, which can happen when capturing subpattern number n+1 + matches some part of the subject, but subpattern n has not + been used at all, they return an empty string. This can be + distinguished from a genuine zero-length substring by + inspecting the appropriate offset in ovector, which is nega- + tive for unset substrings. + + The two convenience functions pcre_free_substring() and + pcre_free_substring_list() can be used to free the memory + returned by a previous call of pcre_get_substring() or + pcre_get_substring_list(), respectively. They do nothing + more than call the function pointed to by pcre_free, which + of course could be called directly from a C program. How- + ever, PCRE is used in some situations where it is linked via + a special interface to another programming language which + cannot use pcre_free directly; it is for these cases that + the functions are provided. + + + +LIMITATIONS + There are some size limitations in PCRE but it is hoped that + they will never in practice be relevant. The maximum length + of a compiled pattern is 65539 (sic) bytes. All values in + repeating quantifiers must be less than 65536. There max- + imum number of capturing subpatterns is 65535. There is no + limit to the number of non-capturing subpatterns, but the + maximum depth of nesting of all kinds of parenthesized sub- + pattern, including capturing subpatterns, assertions, and + other types of subpattern, is 200. + + The maximum length of a subject string is the largest posi- + tive number that an integer variable can hold. However, PCRE + uses recursion to handle subpatterns and indefinite repeti- + tion. This means that the available stack space may limit + the size of a subject string that can be processed by cer- + tain patterns. + + + +DIFFERENCES FROM PERL + The differences described here are with respect to Perl + 5.005. + + 1. By default, a whitespace character is any character that + the C library function isspace() recognizes, though it is + possible to compile PCRE with alternative character type + tables. Normally isspace() matches space, formfeed, newline, + carriage return, horizontal tab, and vertical tab. Perl 5 no + longer includes vertical tab in its set of whitespace char- + acters. The \v escape that was in the Perl documentation for + a long time was never in fact recognized. However, the char- + acter itself was treated as whitespace at least up to 5.002. + In 5.004 and 5.005 it does not match \s. + + 2. PCRE does not allow repeat quantifiers on lookahead + assertions. Perl permits them, but they do not mean what you + might think. For example, (?!a){3} does not assert that the + next three characters are not "a". It just asserts that the + next character is not "a" three times. + + 3. Capturing subpatterns that occur inside negative looka- + head assertions are counted, but their entries in the + offsets vector are never set. Perl sets its numerical vari- + ables from any such patterns that are matched before the + assertion fails to match something (thereby succeeding), but + only if the negative lookahead assertion contains just one + branch. + + 4. Though binary zero characters are supported in the sub- + ject string, they are not allowed in a pattern string + because it is passed as a normal C string, terminated by + zero. The escape sequence "\0" can be used in the pattern to + represent a binary zero. + + 5. The following Perl escape sequences are not supported: + \l, \u, \L, \U, \E, \Q. In fact these are implemented by + Perl's general string-handling and are not part of its pat- + tern matching engine. + + 6. The Perl \G assertion is not supported as it is not + relevant to single pattern matches. + + 7. Fairly obviously, PCRE does not support the (?{code}) and + (?p{code}) constructions. However, there is some experimen- + tal support for recursive patterns using the non-Perl item + (?R). + + 8. There are at the time of writing some oddities in Perl + 5.005_02 concerned with the settings of captured strings + when part of a pattern is repeated. For example, matching + "aba" against the pattern /^(a(b)?)+$/ sets $2 to the value + "b", but matching "aabbaa" against /^(aa(bb)?)+$/ leaves $2 + unset. However, if the pattern is changed to + /^(aa(b(b))?)+$/ then $2 (and $3) are set. + + In Perl 5.004 $2 is set in both cases, and that is also true + of PCRE. If in the future Perl changes to a consistent state + that is different, PCRE may change to follow. + + 9. Another as yet unresolved discrepancy is that in Perl + 5.005_02 the pattern /^(a)?(?(1)a|b)+$/ matches the string + "a", whereas in PCRE it does not. However, in both Perl and + PCRE /^(a)?a/ matched against "a" leaves $1 unset. + + 10. PCRE provides some extensions to the Perl regular + expression facilities: + + (a) Although lookbehind assertions must match fixed length + strings, each alternative branch of a lookbehind assertion + can match a different length of string. Perl 5.005 requires + them all to have the same length. + + (b) If PCRE_DOLLAR_ENDONLY is set and PCRE_MULTILINE is not + set, the $ meta- character matches only at the very end of + the string. + + (c) If PCRE_EXTRA is set, a backslash followed by a letter + with no special meaning is faulted. + + (d) If PCRE_UNGREEDY is set, the greediness of the repeti- + tion quantifiers is inverted, that is, by default they are + not greedy, but if followed by a question mark they are. + + (e) PCRE_ANCHORED can be used to force a pattern to be tried + only at the start of the subject. + + (f) The PCRE_NOTBOL, PCRE_NOTEOL, and PCRE_NOTEMPTY options + for pcre_exec() have no Perl equivalents. + + (g) The (?R) construct allows for recursive pattern matching + (Perl 5.6 can do this using the (?p{code}) construct, which + PCRE cannot of course support.) + + + +REGULAR EXPRESSION DETAILS + The syntax and semantics of the regular expressions sup- + ported by PCRE are described below. Regular expressions are + also described in the Perl documentation and in a number of + other books, some of which have copious examples. Jeffrey + Friedl's "Mastering Regular Expressions", published by + O'Reilly (ISBN 1-56592-257), covers them in great detail. + + The description here is intended as reference documentation. + The basic operation of PCRE is on strings of bytes. However, + there is the beginnings of some support for UTF-8 character + strings. To use this support you must configure PCRE to + include it, and then call pcre_compile() with the PCRE_UTF8 + option. How this affects the pattern matching is described + in the final section of this document. + + A regular expression is a pattern that is matched against a + subject string from left to right. Most characters stand for + themselves in a pattern, and match the corresponding charac- + ters in the subject. As a trivial example, the pattern + + The quick brown fox + + matches a portion of a subject string that is identical to + itself. The power of regular expressions comes from the + ability to include alternatives and repetitions in the pat- + tern. These are encoded in the pattern by the use of meta- + characters, which do not stand for themselves but instead + are interpreted in some special way. + + There are two different sets of meta-characters: those that + are recognized anywhere in the pattern except within square + brackets, and those that are recognized in square brackets. + Outside square brackets, the meta-characters are as follows: + + \ general escape character with several uses + ^ assert start of subject (or line, in multiline + mode) + $ assert end of subject (or line, in multiline mode) + . match any character except newline (by default) + [ start character class definition + | start of alternative branch + ( start subpattern + ) end subpattern + ? extends the meaning of ( + also 0 or 1 quantifier + also quantifier minimizer + * 0 or more quantifier + + 1 or more quantifier + { start min/max quantifier + + Part of a pattern that is in square brackets is called a + "character class". In a character class the only meta- + characters are: + + \ general escape character + ^ negate the class, but only if the first character + - indicates character range + ] terminates the character class + + The following sections describe the use of each of the + meta-characters. + + + +BACKSLASH + The backslash character has several uses. Firstly, if it is + followed by a non-alphameric character, it takes away any + special meaning that character may have. This use of + + backslash as an escape character applies both inside and + outside character classes. + + For example, if you want to match a "*" character, you write + "\*" in the pattern. This applies whether or not the follow- + ing character would otherwise be interpreted as a meta- + character, so it is always safe to precede a non-alphameric + with "\" to specify that it stands for itself. In particu- + lar, if you want to match a backslash, you write "\\". + + If a pattern is compiled with the PCRE_EXTENDED option, whi- + tespace in the pattern (other than in a character class) and + characters between a "#" outside a character class and the + next newline character are ignored. An escaping backslash + can be used to include a whitespace or "#" character as part + of the pattern. + + A second use of backslash provides a way of encoding non- + printing characters in patterns in a visible manner. There + is no restriction on the appearance of non-printing charac- + ters, apart from the binary zero that terminates a pattern, + but when a pattern is being prepared by text editing, it is + usually easier to use one of the following escape sequences + than the binary character it represents: + + \a alarm, that is, the BEL character (hex 07) + \cx "control-x", where x is any character + \e escape (hex 1B) + \f formfeed (hex 0C) + \n newline (hex 0A) + \r carriage return (hex 0D) + \t tab (hex 09) + \xhh character with hex code hh + \ddd character with octal code ddd, or backreference + + The precise effect of "\cx" is as follows: if "x" is a lower + case letter, it is converted to upper case. Then bit 6 of + the character (hex 40) is inverted. Thus "\cz" becomes hex + 1A, but "\c{" becomes hex 3B, while "\c;" becomes hex 7B. + + After "\x", up to two hexadecimal digits are read (letters + can be in upper or lower case). + + After "\0" up to two further octal digits are read. In both + cases, if there are fewer than two digits, just those that + are present are used. Thus the sequence "\0\x\07" specifies + two binary zeros followed by a BEL character. Make sure you + supply two digits after the initial zero if the character + that follows is itself an octal digit. + + The handling of a backslash followed by a digit other than 0 + is complicated. Outside a character class, PCRE reads it + and any following digits as a decimal number. If the number + is less than 10, or if there have been at least that many + previous capturing left parentheses in the expression, the + entire sequence is taken as a back reference. A description + of how this works is given later, following the discussion + of parenthesized subpatterns. + + Inside a character class, or if the decimal number is + greater than 9 and there have not been that many capturing + subpatterns, PCRE re-reads up to three octal digits follow- + ing the backslash, and generates a single byte from the + least significant 8 bits of the value. Any subsequent digits + stand for themselves. For example: + + \040 is another way of writing a space + \40 is the same, provided there are fewer than 40 + previous capturing subpatterns + \7 is always a back reference + \11 might be a back reference, or another way of + writing a tab + \011 is always a tab + \0113 is a tab followed by the character "3" + \113 is the character with octal code 113 (since there + can be no more than 99 back references) + \377 is a byte consisting entirely of 1 bits + \81 is either a back reference, or a binary zero + followed by the two characters "8" and "1" + + Note that octal values of 100 or greater must not be intro- + duced by a leading zero, because no more than three octal + digits are ever read. + + All the sequences that define a single byte value can be + used both inside and outside character classes. In addition, + inside a character class, the sequence "\b" is interpreted + as the backspace character (hex 08). Outside a character + class it has a different meaning (see below). + + The third use of backslash is for specifying generic charac- + ter types: + + \d any decimal digit + \D any character that is not a decimal digit + \s any whitespace character + \S any character that is not a whitespace character + \w any "word" character + \W any "non-word" character + + Each pair of escape sequences partitions the complete set of + characters into two disjoint sets. Any given character + matches one, and only one, of each pair. + + A "word" character is any letter or digit or the underscore + character, that is, any character which can be part of a + Perl "word". The definition of letters and digits is con- + trolled by PCRE's character tables, and may vary if locale- + specific matching is taking place (see "Locale support" + above). For example, in the "fr" (French) locale, some char- + acter codes greater than 128 are used for accented letters, + and these are matched by \w. + + These character type sequences can appear both inside and + outside character classes. They each match one character of + the appropriate type. If the current matching point is at + the end of the subject string, all of them fail, since there + is no character to match. + + The fourth use of backslash is for certain simple asser- + tions. An assertion specifies a condition that has to be met + at a particular point in a match, without consuming any + characters from the subject string. The use of subpatterns + for more complicated assertions is described below. The + backslashed assertions are + + \b word boundary + \B not a word boundary + \A start of subject (independent of multiline mode) + \Z end of subject or newline at end (independent of + multiline mode) + \z end of subject (independent of multiline mode) + + These assertions may not appear in character classes (but + note that "\b" has a different meaning, namely the backspace + character, inside a character class). + + A word boundary is a position in the subject string where + the current character and the previous character do not both + match \w or \W (i.e. one matches \w and the other matches + \W), or the start or end of the string if the first or last + character matches \w, respectively. + + The \A, \Z, and \z assertions differ from the traditional + circumflex and dollar (described below) in that they only + ever match at the very start and end of the subject string, + whatever options are set. They are not affected by the + PCRE_NOTBOL or PCRE_NOTEOL options. If the startoffset argu- + ment of pcre_exec() is non-zero, \A can never match. The + difference between \Z and \z is that \Z matches before a + newline that is the last character of the string as well as + at the end of the string, whereas \z matches only at the + end. + + + +CIRCUMFLEX AND DOLLAR + Outside a character class, in the default matching mode, the + circumflex character is an assertion which is true only if + the current matching point is at the start of the subject + string. If the startoffset argument of pcre_exec() is non- + zero, circumflex can never match. Inside a character class, + circumflex has an entirely different meaning (see below). + + Circumflex need not be the first character of the pattern if + a number of alternatives are involved, but it should be the + first thing in each alternative in which it appears if the + pattern is ever to match that branch. If all possible alter- + natives start with a circumflex, that is, if the pattern is + constrained to match only at the start of the subject, it is + said to be an "anchored" pattern. (There are also other con- + structs that can cause a pattern to be anchored.) + + A dollar character is an assertion which is true only if the + current matching point is at the end of the subject string, + or immediately before a newline character that is the last + character in the string (by default). Dollar need not be the + last character of the pattern if a number of alternatives + are involved, but it should be the last item in any branch + in which it appears. Dollar has no special meaning in a + character class. + + The meaning of dollar can be changed so that it matches only + at the very end of the string, by setting the + PCRE_DOLLAR_ENDONLY option at compile or matching time. This + does not affect the \Z assertion. + + The meanings of the circumflex and dollar characters are + changed if the PCRE_MULTILINE option is set. When this is + the case, they match immediately after and immediately + before an internal "\n" character, respectively, in addition + to matching at the start and end of the subject string. For + example, the pattern /^abc$/ matches the subject string + "def\nabc" in multiline mode, but not otherwise. Conse- + quently, patterns that are anchored in single line mode + because all branches start with "^" are not anchored in mul- + tiline mode, and a match for circumflex is possible when the + startoffset argument of pcre_exec() is non-zero. The + PCRE_DOLLAR_ENDONLY option is ignored if PCRE_MULTILINE is + set. + + Note that the sequences \A, \Z, and \z can be used to match + the start and end of the subject in both modes, and if all + branches of a pattern start with \A it is always anchored, + whether PCRE_MULTILINE is set or not. + + + +FULL STOP (PERIOD, DOT) + Outside a character class, a dot in the pattern matches any + one character in the subject, including a non-printing char- + acter, but not (by default) newline. If the PCRE_DOTALL + option is set, dots match newlines as well. The handling of + dot is entirely independent of the handling of circumflex + and dollar, the only relationship being that they both + involve newline characters. Dot has no special meaning in a + character class. + + + +SQUARE BRACKETS + An opening square bracket introduces a character class, ter- + minated by a closing square bracket. A closing square + bracket on its own is not special. If a closing square + bracket is required as a member of the class, it should be + the first data character in the class (after an initial cir- + cumflex, if present) or escaped with a backslash. + + A character class matches a single character in the subject; + the character must be in the set of characters defined by + the class, unless the first character in the class is a cir- + cumflex, in which case the subject character must not be in + the set defined by the class. If a circumflex is actually + required as a member of the class, ensure it is not the + first character, or escape it with a backslash. + + For example, the character class [aeiou] matches any lower + case vowel, while [^aeiou] matches any character that is not + a lower case vowel. Note that a circumflex is just a con- + venient notation for specifying the characters which are in + the class by enumerating those that are not. It is not an + assertion: it still consumes a character from the subject + string, and fails if the current pointer is at the end of + the string. + + When caseless matching is set, any letters in a class + represent both their upper case and lower case versions, so + for example, a caseless [aeiou] matches "A" as well as "a", + and a caseless [^aeiou] does not match "A", whereas a case- + ful version would. + + The newline character is never treated in any special way in + character classes, whatever the setting of the PCRE_DOTALL + or PCRE_MULTILINE options is. A class such as [^a] will + always match a newline. + + The minus (hyphen) character can be used to specify a range + of characters in a character class. For example, [d-m] + matches any letter between d and m, inclusive. If a minus + character is required in a class, it must be escaped with a + backslash or appear in a position where it cannot be inter- + preted as indicating a range, typically as the first or last + character in the class. + + It is not possible to have the literal character "]" as the + end character of a range. A pattern such as [W-]46] is + interpreted as a class of two characters ("W" and "-") fol- + lowed by a literal string "46]", so it would match "W46]" or + "-46]". However, if the "]" is escaped with a backslash it + is interpreted as the end of range, so [W-\]46] is inter- + preted as a single class containing a range followed by two + separate characters. The octal or hexadecimal representation + of "]" can also be used to end a range. + + Ranges operate in ASCII collating sequence. They can also be + used for characters specified numerically, for example + [\000-\037]. If a range that includes letters is used when + caseless matching is set, it matches the letters in either + case. For example, [W-c] is equivalent to [][\^_`wxyzabc], + matched caselessly, and if character tables for the "fr" + locale are in use, [\xc8-\xcb] matches accented E characters + in both cases. + + The character types \d, \D, \s, \S, \w, and \W may also + appear in a character class, and add the characters that + they match to the class. For example, [\dABCDEF] matches any + hexadecimal digit. A circumflex can conveniently be used + with the upper case character types to specify a more res- + tricted set of characters than the matching lower case type. + For example, the class [^\W_] matches any letter or digit, + but not underscore. + + All non-alphameric characters other than \, -, ^ (at the + start) and the terminating ] are non-special in character + classes, but it does no harm if they are escaped. + + + +POSIX CHARACTER CLASSES + Perl 5.6 (not yet released at the time of writing) is going + to support the POSIX notation for character classes, which + uses names enclosed by [: and :] within the enclosing + square brackets. PCRE supports this notation. For example, + + [01[:alpha:]%] + + matches "0", "1", any alphabetic character, or "%". The sup- + ported class names are + + alnum letters and digits + alpha letters + ascii character codes 0 - 127 + cntrl control characters + digit decimal digits (same as \d) + graph printing characters, excluding space + lower lower case letters + print printing characters, including space + punct printing characters, excluding letters and digits + space white space (same as \s) + upper upper case letters + word "word" characters (same as \w) + xdigit hexadecimal digits + + The names "ascii" and "word" are Perl extensions. Another + Perl extension is negation, which is indicated by a ^ char- + acter after the colon. For example, + + [12[:^digit:]] + + matches "1", "2", or any non-digit. PCRE (and Perl) also + recognize the POSIX syntax [.ch.] and [=ch=] where "ch" is a + "collating element", but these are not supported, and an + error is given if they are encountered. + + + +VERTICAL BAR + Vertical bar characters are used to separate alternative + patterns. For example, the pattern + + gilbert|sullivan + + matches either "gilbert" or "sullivan". Any number of alter- + natives may appear, and an empty alternative is permitted + (matching the empty string). The matching process tries + each alternative in turn, from left to right, and the first + one that succeeds is used. If the alternatives are within a + subpattern (defined below), "succeeds" means matching the + rest of the main pattern as well as the alternative in the + subpattern. + + + +INTERNAL OPTION SETTING + The settings of PCRE_CASELESS, PCRE_MULTILINE, PCRE_DOTALL, + and PCRE_EXTENDED can be changed from within the pattern by + a sequence of Perl option letters enclosed between "(?" and + ")". The option letters are + + i for PCRE_CASELESS + m for PCRE_MULTILINE + s for PCRE_DOTALL + x for PCRE_EXTENDED + + For example, (?im) sets caseless, multiline matching. It is + also possible to unset these options by preceding the letter + with a hyphen, and a combined setting and unsetting such as + (?im-sx), which sets PCRE_CASELESS and PCRE_MULTILINE while + unsetting PCRE_DOTALL and PCRE_EXTENDED, is also permitted. + If a letter appears both before and after the hyphen, the + option is unset. + + The scope of these option changes depends on where in the + pattern the setting occurs. For settings that are outside + any subpattern (defined below), the effect is the same as if + the options were set or unset at the start of matching. The + following patterns all behave in exactly the same way: + + (?i)abc + a(?i)bc + ab(?i)c + abc(?i) + + which in turn is the same as compiling the pattern abc with + PCRE_CASELESS set. In other words, such "top level" set- + tings apply to the whole pattern (unless there are other + changes inside subpatterns). If there is more than one set- + ting of the same option at top level, the rightmost setting + is used. + + If an option change occurs inside a subpattern, the effect + is different. This is a change of behaviour in Perl 5.005. + An option change inside a subpattern affects only that part + of the subpattern that follows it, so + + (a(?i)b)c + + matches abc and aBc and no other strings (assuming + PCRE_CASELESS is not used). By this means, options can be + made to have different settings in different parts of the + pattern. Any changes made in one alternative do carry on + into subsequent branches within the same subpattern. For + example, + + (a(?i)b|c) + + matches "ab", "aB", "c", and "C", even though when matching + "C" the first branch is abandoned before the option setting. + This is because the effects of option settings happen at + compile time. There would be some very weird behaviour oth- + erwise. + + The PCRE-specific options PCRE_UNGREEDY and PCRE_EXTRA can + be changed in the same way as the Perl-compatible options by + using the characters U and X respectively. The (?X) flag + setting is special in that it must always occur earlier in + the pattern than any of the additional features it turns on, + even when it is at top level. It is best put at the start. + + + +SUBPATTERNS + Subpatterns are delimited by parentheses (round brackets), + which can be nested. Marking part of a pattern as a subpat- + tern does two things: + + 1. It localizes a set of alternatives. For example, the pat- + tern + + cat(aract|erpillar|) + + matches one of the words "cat", "cataract", or "caterpil- + lar". Without the parentheses, it would match "cataract", + "erpillar" or the empty string. + + 2. It sets up the subpattern as a capturing subpattern (as + defined above). When the whole pattern matches, that por- + tion of the subject string that matched the subpattern is + passed back to the caller via the ovector argument of + pcre_exec(). Opening parentheses are counted from left to + right (starting from 1) to obtain the numbers of the captur- + ing subpatterns. + + For example, if the string "the red king" is matched against + the pattern + + the ((red|white) (king|queen)) + + the captured substrings are "red king", "red", and "king", + and are numbered 1, 2, and 3, respectively. + + The fact that plain parentheses fulfil two functions is not + always helpful. There are often times when a grouping sub- + pattern is required without a capturing requirement. If an + opening parenthesis is followed by "?:", the subpattern does + not do any capturing, and is not counted when computing the + number of any subsequent capturing subpatterns. For example, + if the string "the white queen" is matched against the pat- + tern + + the ((?:red|white) (king|queen)) + + the captured substrings are "white queen" and "queen", and + are numbered 1 and 2. The maximum number of captured sub- + strings is 99, and the maximum number of all subpatterns, + both capturing and non-capturing, is 200. + + As a convenient shorthand, if any option settings are + required at the start of a non-capturing subpattern, the + option letters may appear between the "?" and the ":". Thus + the two patterns + + (?i:saturday|sunday) + (?:(?i)saturday|sunday) + + match exactly the same set of strings. Because alternative + branches are tried from left to right, and options are not + reset until the end of the subpattern is reached, an option + setting in one branch does affect subsequent branches, so + the above patterns match "SUNDAY" as well as "Saturday". + + + +REPETITION + Repetition is specified by quantifiers, which can follow any + of the following items: + + a single character, possibly escaped + the . metacharacter + a character class + a back reference (see next section) + a parenthesized subpattern (unless it is an assertion - + see below) + + The general repetition quantifier specifies a minimum and + maximum number of permitted matches, by giving the two + numbers in curly brackets (braces), separated by a comma. + The numbers must be less than 65536, and the first must be + less than or equal to the second. For example: + + z{2,4} + + matches "zz", "zzz", or "zzzz". A closing brace on its own + is not a special character. If the second number is omitted, + but the comma is present, there is no upper limit; if the + second number and the comma are both omitted, the quantifier + specifies an exact number of required matches. Thus + + [aeiou]{3,} + + matches at least 3 successive vowels, but may match many + more, while + + \d{8} + + matches exactly 8 digits. An opening curly bracket that + appears in a position where a quantifier is not allowed, or + one that does not match the syntax of a quantifier, is taken + as a literal character. For example, {,6} is not a quantif- + ier, but a literal string of four characters. + The quantifier {0} is permitted, causing the expression to + behave as if the previous item and the quantifier were not + present. + + For convenience (and historical compatibility) the three + most common quantifiers have single-character abbreviations: + + * is equivalent to {0,} + + is equivalent to {1,} + ? is equivalent to {0,1} + + It is possible to construct infinite loops by following a + subpattern that can match no characters with a quantifier + that has no upper limit, for example: + + (a?)* + + Earlier versions of Perl and PCRE used to give an error at + compile time for such patterns. However, because there are + cases where this can be useful, such patterns are now + accepted, but if any repetition of the subpattern does in + fact match no characters, the loop is forcibly broken. + + By default, the quantifiers are "greedy", that is, they + match as much as possible (up to the maximum number of per- + mitted times), without causing the rest of the pattern to + fail. The classic example of where this gives problems is in + trying to match comments in C programs. These appear between + the sequences /* and */ and within the sequence, individual + * and / characters may appear. An attempt to match C com- + ments by applying the pattern + + /\*.*\*/ + + to the string + + /* first command */ not comment /* second comment */ + + fails, because it matches the entire string owing to the + greediness of the .* item. + + However, if a quantifier is followed by a question mark, it + ceases to be greedy, and instead matches the minimum number + of times possible, so the pattern + + /\*.*?\*/ + + does the right thing with the C comments. The meaning of the + various quantifiers is not otherwise changed, just the pre- + ferred number of matches. Do not confuse this use of ques- + tion mark with its use as a quantifier in its own right. + Because it has two uses, it can sometimes appear doubled, as + in + + \d??\d + + which matches one digit by preference, but can match two if + that is the only way the rest of the pattern matches. + + If the PCRE_UNGREEDY option is set (an option which is not + available in Perl), the quantifiers are not greedy by + default, but individual ones can be made greedy by following + them with a question mark. In other words, it inverts the + default behaviour. + + When a parenthesized subpattern is quantified with a minimum + repeat count that is greater than 1 or with a limited max- + imum, more store is required for the compiled pattern, in + proportion to the size of the minimum or maximum. + + If a pattern starts with .* or .{0,} and the PCRE_DOTALL + option (equivalent to Perl's /s) is set, thus allowing the . + to match newlines, the pattern is implicitly anchored, + because whatever follows will be tried against every charac- + ter position in the subject string, so there is no point in + retrying the overall match at any position after the first. + PCRE treats such a pattern as though it were preceded by \A. + In cases where it is known that the subject string contains + no newlines, it is worth setting PCRE_DOTALL when the pat- + tern begins with .* in order to obtain this optimization, or + alternatively using ^ to indicate anchoring explicitly. + + When a capturing subpattern is repeated, the value captured + is the substring that matched the final iteration. For exam- + ple, after + + (tweedle[dume]{3}\s*)+ + + has matched "tweedledum tweedledee" the value of the cap- + tured substring is "tweedledee". However, if there are + nested capturing subpatterns, the corresponding captured + values may have been set in previous iterations. For exam- + ple, after + + /(a|(b))+/ + + matches "aba" the value of the second captured substring is + "b". + + + +BACK REFERENCES + Outside a character class, a backslash followed by a digit + greater than 0 (and possibly further digits) is a back + + + + +SunOS 5.8 Last change: 30 + + + + reference to a capturing subpattern earlier (i.e. to its + left) in the pattern, provided there have been that many + previous capturing left parentheses. + + However, if the decimal number following the backslash is + less than 10, it is always taken as a back reference, and + causes an error only if there are not that many capturing + left parentheses in the entire pattern. In other words, the + parentheses that are referenced need not be to the left of + the reference for numbers less than 10. See the section + entitled "Backslash" above for further details of the han- + dling of digits following a backslash. + + A back reference matches whatever actually matched the cap- + turing subpattern in the current subject string, rather than + anything matching the subpattern itself. So the pattern + + (sens|respons)e and \1ibility + + matches "sense and sensibility" and "response and responsi- + bility", but not "sense and responsibility". If caseful + matching is in force at the time of the back reference, the + case of letters is relevant. For example, + + ((?i)rah)\s+\1 + + matches "rah rah" and "RAH RAH", but not "RAH rah", even + though the original capturing subpattern is matched case- + lessly. + + There may be more than one back reference to the same sub- + pattern. If a subpattern has not actually been used in a + particular match, any back references to it always fail. For + example, the pattern + + (a|(bc))\2 + + always fails if it starts to match "a" rather than "bc". + Because there may be up to 99 back references, all digits + following the backslash are taken as part of a potential + back reference number. If the pattern continues with a digit + character, some delimiter must be used to terminate the back + reference. If the PCRE_EXTENDED option is set, this can be + whitespace. Otherwise an empty comment can be used. + + A back reference that occurs inside the parentheses to which + it refers fails when the subpattern is first used, so, for + example, (a\1) never matches. However, such references can + be useful inside repeated subpatterns. For example, the pat- + tern + + (a|b\1)+ + + matches any number of "a"s and also "aba", "ababbaa" etc. At + each iteration of the subpattern, the back reference matches + the character string corresponding to the previous itera- + tion. In order for this to work, the pattern must be such + that the first iteration does not need to match the back + reference. This can be done using alternation, as in the + example above, or by a quantifier with a minimum of zero. + + + +ASSERTIONS + An assertion is a test on the characters following or + preceding the current matching point that does not actually + consume any characters. The simple assertions coded as \b, + \B, \A, \Z, \z, ^ and $ are described above. More compli- + cated assertions are coded as subpatterns. There are two + kinds: those that look ahead of the current position in the + subject string, and those that look behind it. + + An assertion subpattern is matched in the normal way, except + that it does not cause the current matching position to be + changed. Lookahead assertions start with (?= for positive + assertions and (?! for negative assertions. For example, + + \w+(?=;) + + matches a word followed by a semicolon, but does not include + the semicolon in the match, and + + foo(?!bar) + + matches any occurrence of "foo" that is not followed by + "bar". Note that the apparently similar pattern + + (?!foo)bar + + does not find an occurrence of "bar" that is preceded by + something other than "foo"; it finds any occurrence of "bar" + whatsoever, because the assertion (?!foo) is always true + when the next three characters are "bar". A lookbehind + assertion is needed to achieve this effect. + + Lookbehind assertions start with (?<= for positive asser- + tions and (? as in this example: + + (?>\d+)bar + + This kind of parenthesis "locks up" the part of the pattern + it contains once it has matched, and a failure further into + the pattern is prevented from backtracking into it. Back- + tracking past it to previous items, however, works as nor- + mal. + + An alternative description is that a subpattern of this type + matches the string of characters that an identical stan- + dalone pattern would match, if anchored at the current point + in the subject string. + + Once-only subpatterns are not capturing subpatterns. Simple + cases such as the above example can be thought of as a max- + imizing repeat that must swallow everything it can. So, + while both \d+ and \d+? are prepared to adjust the number of + digits they match in order to make the rest of the pattern + match, (?>\d+) can only match an entire sequence of digits. + + This construction can of course contain arbitrarily compli- + cated subpatterns, and it can be nested. + + Once-only subpatterns can be used in conjunction with look- + behind assertions to specify efficient matching at the end + of the subject string. Consider a simple pattern such as + + abcd$ + + when applied to a long string which does not match. Because + matching proceeds from left to right, PCRE will look for + each "a" in the subject and then see if what follows matches + the rest of the pattern. If the pattern is specified as + + ^.*abcd$ + + the initial .* matches the entire string at first, but when + this fails (because there is no following "a"), it back- + tracks to match all but the last character, then all but the + last two characters, and so on. Once again the search for + "a" covers the entire string, from right to left, so we are + no better off. However, if the pattern is written as + + ^(?>.*)(?<=abcd) + + there can be no backtracking for the .* item; it can match + only the entire string. The subsequent lookbehind assertion + does a single test on the last four characters. If it fails, + the match fails immediately. For long strings, this approach + makes a significant difference to the processing time. + + When a pattern contains an unlimited repeat inside a subpat- + tern that can itself be repeated an unlimited number of + times, the use of a once-only subpattern is the only way to + avoid some failing matches taking a very long time indeed. + The pattern + + (\D+|<\d+>)*[!?] + + matches an unlimited number of substrings that either con- + sist of non-digits, or digits enclosed in <>, followed by + either ! or ?. When it matches, it runs quickly. However, if + it is applied to + + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + + it takes a long time before reporting failure. This is + because the string can be divided between the two repeats in + a large number of ways, and all have to be tried. (The exam- + ple used [!?] rather than a single character at the end, + because both PCRE and Perl have an optimization that allows + for fast failure when a single character is used. They + remember the last single character that is required for a + match, and fail early if it is not present in the string.) + If the pattern is changed to + + ((?>\D+)|<\d+>)*[!?] + + sequences of non-digits cannot be broken, and failure hap- + pens quickly. + + + +CONDITIONAL SUBPATTERNS + It is possible to cause the matching process to obey a sub- + pattern conditionally or to choose between two alternative + subpatterns, depending on the result of an assertion, or + whether a previous capturing subpattern matched or not. The + two possible forms of conditional subpattern are + + (?(condition)yes-pattern) + (?(condition)yes-pattern|no-pattern) + + If the condition is satisfied, the yes-pattern is used; oth- + erwise the no-pattern (if present) is used. If there are + more than two alternatives in the subpattern, a compile-time + error occurs. + + There are two kinds of condition. If the text between the + parentheses consists of a sequence of digits, the condition + is satisfied if the capturing subpattern of that number has + previously matched. The number must be greater than zero. + Consider the following pattern, which contains non- + significant white space to make it more readable (assume the + PCRE_EXTENDED option) and to divide it into three parts for + ease of discussion: + + ( \( )? [^()]+ (?(1) \) ) + + The first part matches an optional opening parenthesis, and + if that character is present, sets it as the first captured + substring. The second part matches one or more characters + that are not parentheses. The third part is a conditional + subpattern that tests whether the first set of parentheses + matched or not. If they did, that is, if subject started + with an opening parenthesis, the condition is true, and so + the yes-pattern is executed and a closing parenthesis is + required. Otherwise, since no-pattern is not present, the + subpattern matches nothing. In other words, this pattern + matches a sequence of non-parentheses, optionally enclosed + in parentheses. + + If the condition is not a sequence of digits, it must be an + assertion. This may be a positive or negative lookahead or + lookbehind assertion. Consider this pattern, again contain- + ing non-significant white space, and with the two alterna- + tives on the second line: + + (?(?=[^a-z]*[a-z]) + \d{2}-[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2} ) + + The condition is a positive lookahead assertion that matches + an optional sequence of non-letters followed by a letter. In + other words, it tests for the presence of at least one + letter in the subject. If a letter is found, the subject is + matched against the first alternative; otherwise it is + matched against the second. This pattern matches strings in + one of the two forms dd-aaa-dd or dd-dd-dd, where aaa are + letters and dd are digits. + + + +COMMENTS + The sequence (?# marks the start of a comment which contin- + ues up to the next closing parenthesis. Nested parentheses + are not permitted. The characters that make up a comment + play no part in the pattern matching at all. + + If the PCRE_EXTENDED option is set, an unescaped # character + outside a character class introduces a comment that contin- + ues up to the next newline character in the pattern. + + + +RECURSIVE PATTERNS + Consider the problem of matching a string in parentheses, + allowing for unlimited nested parentheses. Without the use + of recursion, the best that can be done is to use a pattern + that matches up to some fixed depth of nesting. It is not + possible to handle an arbitrary nesting depth. Perl 5.6 has + provided an experimental facility that allows regular + expressions to recurse (amongst other things). It does this + by interpolating Perl code in the expression at run time, + and the code can refer to the expression itself. A Perl pat- + tern to solve the parentheses problem can be created like + this: + + $re = qr{\( (?: (?>[^()]+) | (?p{$re}) )* \)}x; + + The (?p{...}) item interpolates Perl code at run time, and + in this case refers recursively to the pattern in which it + appears. Obviously, PCRE cannot support the interpolation of + Perl code. Instead, the special item (?R) is provided for + the specific case of recursion. This PCRE pattern solves the + parentheses problem (assume the PCRE_EXTENDED option is set + so that white space is ignored): + + \( ( (?>[^()]+) | (?R) )* \) + + First it matches an opening parenthesis. Then it matches any + number of substrings which can either be a sequence of non- + parentheses, or a recursive match of the pattern itself + (i.e. a correctly parenthesized substring). Finally there is + a closing parenthesis. + + This particular example pattern contains nested unlimited + repeats, and so the use of a once-only subpattern for match- + ing strings of non-parentheses is important when applying + the pattern to strings that do not match. For example, when + it is applied to + + (aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa() + + it yields "no match" quickly. However, if a once-only sub- + pattern is not used, the match runs for a very long time + indeed because there are so many different ways the + and * + repeats can carve up the subject, and all have to be tested + before failure can be reported. + + The values set for any capturing subpatterns are those from + the outermost level of the recursion at which the subpattern + value is set. If the pattern above is matched against + + (ab(cd)ef) + + the value for the capturing parentheses is "ef", which is + the last value taken on at the top level. If additional + parentheses are added, giving + + \( ( ( (?>[^()]+) | (?R) )* ) \) + ^ ^ + ^ ^ the string they capture is + "ab(cd)ef", the contents of the top level parentheses. If + there are more than 15 capturing parentheses in a pattern, + PCRE has to obtain extra memory to store data during a + recursion, which it does by using pcre_malloc, freeing it + via pcre_free afterwards. If no memory can be obtained, it + saves data for the first 15 capturing parentheses only, as + there is no way to give an out-of-memory error from within a + recursion. + + + +PERFORMANCE + Certain items that may appear in patterns are more efficient + than others. It is more efficient to use a character class + like [aeiou] than a set of alternatives such as (a|e|i|o|u). + In general, the simplest construction that provides the + required behaviour is usually the most efficient. Jeffrey + Friedl's book contains a lot of discussion about optimizing + regular expressions for efficient performance. + + When a pattern begins with .* and the PCRE_DOTALL option is + set, the pattern is implicitly anchored by PCRE, since it + can match only at the start of a subject string. However, if + PCRE_DOTALL is not set, PCRE cannot make this optimization, + because the . metacharacter does not then match a newline, + and if the subject string contains newlines, the pattern may + match from the character immediately following one of them + instead of from the very start. For example, the pattern + + (.*) second + + matches the subject "first\nand second" (where \n stands for + a newline character) with the first captured substring being + "and". In order to do this, PCRE has to retry the match + starting after every newline in the subject. + + If you are using such a pattern with subject strings that do + not contain newlines, the best performance is obtained by + setting PCRE_DOTALL, or starting the pattern with ^.* to + indicate explicit anchoring. That saves PCRE from having to + scan along the subject looking for a newline to restart at. + + Beware of patterns that contain nested indefinite repeats. + These can take a long time to run when applied to a string + that does not match. Consider the pattern fragment + + (a+)* + + This can match "aaaa" in 33 different ways, and this number + increases very rapidly as the string gets longer. (The * + repeat can match 0, 1, 2, 3, or 4 times, and for each of + those cases other than 0, the + repeats can match different + numbers of times.) When the remainder of the pattern is such + that the entire match is going to fail, PCRE has in princi- + ple to try every possible variation, and this can take an + extremely long time. + + An optimization catches some of the more simple cases such + as + + (a+)*b + + where a literal character follows. Before embarking on the + standard matching procedure, PCRE checks that there is a "b" + later in the subject string, and if there is not, it fails + the match immediately. However, when there is no following + literal this optimization cannot be used. You can see the + difference by comparing the behaviour of + + (a+)*\d + + with the pattern above. The former gives a failure almost + instantly when applied to a whole line of "a" characters, + whereas the latter takes an appreciable time with strings + longer than about 20 characters. + + + +UTF-8 SUPPORT + Starting at release 3.3, PCRE has some support for character + strings encoded in the UTF-8 format. This is incomplete, and + is regarded as experimental. In order to use it, you must + configure PCRE to include UTF-8 support in the code, and, in + addition, you must call pcre_compile() with the PCRE_UTF8 + option flag. When you do this, both the pattern and any sub- + ject strings that are matched against it are treated as + UTF-8 strings instead of just strings of bytes, but only in + the cases that are mentioned below. + + If you compile PCRE with UTF-8 support, but do not use it at + run time, the library will be a bit bigger, but the addi- + tional run time overhead is limited to testing the PCRE_UTF8 + flag in several places, so should not be very large. + + PCRE assumes that the strings it is given contain valid + UTF-8 codes. It does not diagnose invalid UTF-8 strings. If + you pass invalid UTF-8 strings to PCRE, the results are + undefined. + + Running with PCRE_UTF8 set causes these changes in the way + PCRE works: + + 1. In a pattern, the escape sequence \x{...}, where the + contents of the braces is a string of hexadecimal digits, is + interpreted as a UTF-8 character whose code number is the + given hexadecimal number, for example: \x{1234}. This + inserts from one to six literal bytes into the pattern, + using the UTF-8 encoding. If a non-hexadecimal digit appears + between the braces, the item is not recognized. + + 2. The original hexadecimal escape sequence, \xhh, generates + a two-byte UTF-8 character if its value is greater than 127. + + 3. Repeat quantifiers are NOT correctly handled if they fol- + low a multibyte character. For example, \x{100}* and \xc3+ + do not work. If you want to repeat such characters, you must + enclose them in non-capturing parentheses, for example + (?:\x{100}), at present. + + 4. The dot metacharacter matches one UTF-8 character instead + of a single byte. + + 5. Unlike literal UTF-8 characters, the dot metacharacter + followed by a repeat quantifier does operate correctly on + UTF-8 characters instead of single bytes. + + 4. Although the \x{...} escape is permitted in a character + class, characters whose values are greater than 255 cannot + be included in a class. + + 5. A class is matched against a UTF-8 character instead of + just a single byte, but it can match only characters whose + values are less than 256. Characters with greater values + always fail to match a class. + + 6. Repeated classes work correctly on multiple characters. + + 7. Classes containing just a single character whose value is + greater than 127 (but less than 256), for example, [\x80] or + [^\x{93}], do not work because these are optimized into sin- + gle byte matches. In the first case, of course, the class + brackets are just redundant. + + 8. Lookbehind assertions move backwards in the subject by a + fixed number of characters instead of a fixed number of + bytes. Simple cases have been tested to work correctly, but + there may be hidden gotchas herein. + + 9. The character types such as \d and \w do not work + correctly with UTF-8 characters. They continue to test a + single byte. + + 10. Anything not explicitly mentioned here continues to work + in bytes rather than in characters. + + The following UTF-8 features of Perl 5.6 are not imple- + mented: + + 1. The escape sequence \C to match a single byte. + + 2. The use of Unicode tables and properties and escapes \p, + \P, and \X. + + + +SAMPLE PROGRAM + The code below is a simple, complete demonstration program, + to get you started with using PCRE. This code is also sup- + plied in the file pcredemo.c in the PCRE distribution. + + The program compiles the regular expression that is its + first argument, and matches it against the subject string in + its second argument. No options are set, and default charac- + ter tables are used. If matching succeeds, the program out- + puts the portion of the subject that matched, together with + the contents of any captured substrings. + + On a Unix system that has PCRE installed in /usr/local, you + can compile the demonstration program using a command like + this: + + gcc -o pcredemo pcredemo.c -I/usr/local/include + -L/usr/local/lib -lpcre + + Then you can run simple tests like this: + + ./pcredemo 'cat|dog' 'the cat sat on the mat' + + Note that there is a much more comprehensive test program, + called pcretest, which supports many more facilities for + testing regular expressions. The pcredemo program is pro- + vided as a simple coding example. + + On some operating systems (e.g. Solaris) you may get an + error like this when you try to run pcredemo: + + ld.so.1: a.out: fatal: libpcre.so.0: open failed: No such + file or directory + + This is caused by the way shared library support works on + those systems. You need to add + + -R/usr/local/lib + + to the compile command to get round this problem. Here's the + code: + + #include + #include + #include + + #define OVECCOUNT 30 /* should be a multiple of 3 */ + + int main(int argc, char **argv) + { + pcre *re; + const char *error; + int erroffset; + int ovector[OVECCOUNT]; + int rc, i; + + if (argc != 3) + { + printf("Two arguments required: a regex and a " + "subject string\n"); + return 1; + } + + /* Compile the regular expression in the first argument */ + + re = pcre_compile( + argv[1], /* the pattern */ + 0, /* default options */ + &error, /* for error message */ + &erroffset, /* for error offset */ + NULL); /* use default character tables */ + + /* Compilation failed: print the error message and exit */ + + if (re == NULL) + { + printf("PCRE compilation failed at offset %d: %s\n", + erroffset, error); + return 1; + } + + /* Compilation succeeded: match the subject in the second + argument */ + + rc = pcre_exec( + re, /* the compiled pattern */ + NULL, /* we didn't study the pattern */ + argv[2], /* the subject string */ + (int)strlen(argv[2]), /* the length of the subject */ + 0, /* start at offset 0 in the subject */ + 0, /* default options */ + ovector, /* vector for substring information */ + OVECCOUNT); /* number of elements in the vector */ + + /* Matching failed: handle error cases */ + + if (rc < 0) + { + switch(rc) + { + case PCRE_ERROR_NOMATCH: printf("No match\n"); break; + /* + Handle other special cases if you like + */ + default: printf("Matching error %d\n", rc); break; + } + return 1; + } + + /* Match succeded */ + + printf("Match succeeded\n"); + + /* The output vector wasn't big enough */ + + if (rc == 0) + { + rc = OVECCOUNT/3; + printf("ovector only has room for %d captured " + substrings\n", rc - 1); + } + + /* Show substrings stored in the output vector */ + + for (i = 0; i < rc; i++) + { + char *substring_start = argv[2] + ovector[2*i]; + int substring_length = ovector[2*i+1] - ovector[2*i]; + printf("%2d: %.*s\n", i, substring_length, + substring_start); + } + + return 0; + } + + + +AUTHOR + Philip Hazel + University Computing Service, + New Museums Site, + Cambridge CB2 3QG, England. + Phone: +44 1223 334714 + + Last updated: 15 August 2001 + Copyright (c) 1997-2001 University of Cambridge. diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/doc/pcregrep.1 b/rubbos/app/httpd-2.0.64/srclib/pcre/doc/pcregrep.1 new file mode 100644 index 00000000..5d3151e8 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/doc/pcregrep.1 @@ -0,0 +1,88 @@ +.TH PCREGREP 1 +.SH NAME +pcregrep - a grep with Perl-compatible regular expressions. +.SH SYNOPSIS +.B pcregrep [-Vcfhilnrsvx] pattern [file] ... + + +.SH DESCRIPTION +\fBpcregrep\fR searches files for character patterns, in the same way as other +grep commands do, but it uses the PCRE regular expression library to support +patterns that are compatible with the regular expressions of Perl 5. See +\fBpcre(3)\fR for a full description of syntax and semantics. + +If no files are specified, \fBpcregrep\fR reads the standard input. By default, +each line that matches the pattern is copied to the standard output, and if +there is more than one file, the file name is printed before each line of +output. However, there are options that can change how \fBpcregrep\fR behaves. + +Lines are limited to BUFSIZ characters. BUFSIZ is defined in \fB\fR. +The newline character is removed from the end of each line before it is matched +against the pattern. + + +.SH OPTIONS +.TP 10 +\fB-V\fR +Write the version number of the PCRE library being used to the standard error +stream. +.TP +\fB-c\fR +Do not print individual lines; instead just print a count of the number of +lines that would otherwise have been printed. If several files are given, a +count is printed for each of them. +.TP +\fB-f\fIfilename\fR +Read patterns from the file, one per line, and match all patterns against each +line. There is a maximum of 100 patterns. Trailing white space is removed, and +blank lines are ignored. An empty file contains no patterns and therefore +matches nothing. +.TP +\fB-h\fR +Suppress printing of filenames when searching multiple files. +.TP +\fB-i\fR +Ignore upper/lower case distinctions during comparisons. +.TP +\fB-l\fR +Instead of printing lines from the files, just print the names of the files +containing lines that would have been printed. Each file name is printed +once, on a separate line. +.TP +\fB-n\fR +Precede each line by its line number in the file. +.TP +\fB-r\fR +If any file is a directory, recursively scan the files it contains. Without +\fB-r\fR a directory is scanned as a normal file. +.TP +\fB-s\fR +Work silently, that is, display nothing except error messages. +The exit status indicates whether any matches were found. +.TP +\fB-v\fR +Invert the sense of the match, so that lines which do \fInot\fR match the +pattern are now the ones that are found. +.TP +\fB-x\fR +Force the pattern to be anchored (it must start matching at the beginning of +the line) and in addition, require it to match the entire line. This is +equivalent to having ^ and $ characters at the start and end of each +alternative branch in the regular expression. + + +.SH SEE ALSO +\fBpcre(3)\fR, Perl 5 documentation + + +.SH DIAGNOSTICS +Exit status is 0 if any matches were found, 1 if no matches were found, and 2 +for syntax errors or inacessible files (even if matches were found). + + +.SH AUTHOR +Philip Hazel + +Last updated: 15 August 2001 +.br +Copyright (c) 1997-2001 University of Cambridge. diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/doc/pcregrep.html b/rubbos/app/httpd-2.0.64/srclib/pcre/doc/pcregrep.html new file mode 100644 index 00000000..7bc210c6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/doc/pcregrep.html @@ -0,0 +1,120 @@ + + +pcregrep specification + + +

    pcregrep specification

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

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

    +
  • SYNOPSIS +

    +pcregrep [-Vcfhilnrsvx] pattern [file] ... +

    +
  • DESCRIPTION +

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

    +

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

    +

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

    +
  • OPTIONS +

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

    +

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

    +

    +\fB-ffilename +Read patterns from the file, one per line, and match all patterns against each +line. There is a maximum of 100 patterns. Trailing white space is removed, and +blank lines are ignored. An empty file contains no patterns and therefore +matches nothing. +

    +

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

    +

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

    +

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

    +

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

    +

    +-r +If any file is a directory, recursively scan the files it contains. Without +-r a directory is scanned as a normal file. +

    +

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

    +

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

    +

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

    +
  • SEE ALSO +

    +pcre(3), Perl 5 documentation +

    +
  • DIAGNOSTICS +

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

    +
  • AUTHOR +

    +Philip Hazel <ph10@cam.ac.uk> +

    +

    +Last updated: 15 August 2001 +
    +Copyright (c) 1997-2001 University of Cambridge. diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/doc/pcregrep.txt b/rubbos/app/httpd-2.0.64/srclib/pcre/doc/pcregrep.txt new file mode 100644 index 00000000..16002284 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/doc/pcregrep.txt @@ -0,0 +1,101 @@ +NAME + pcregrep - a grep with Perl-compatible regular expressions. + + + +SYNOPSIS + pcregrep [-Vcfhilnrsvx] pattern [file] ... + + + +DESCRIPTION + pcregrep searches files for character patterns, in the same + way as other grep commands do, but it uses the PCRE regular + expression library to support patterns that are compatible + with the regular expressions of Perl 5. See pcre(3) for a + full description of syntax and semantics. + + If no files are specified, pcregrep reads the standard + input. By default, each line that matches the pattern is + copied to the standard output, and if there is more than one + file, the file name is printed before each line of output. + However, there are options that can change how pcregrep + behaves. + + Lines are limited to BUFSIZ characters. BUFSIZ is defined in + . The newline character is removed from the end of + each line before it is matched against the pattern. + + + +OPTIONS + -V Write the version number of the PCRE library being + used to the standard error stream. + + -c Do not print individual lines; instead just print + a count of the number of lines that would other- + wise have been printed. If several files are + given, a count is printed for each of them. + + -ffilename + Read patterns from the file, one per line, and + match all patterns against each line. There is a + maximum of 100 patterns. Trailing white space is + removed, and blank lines are ignored. An empty + file contains no patterns and therefore matches + nothing. + + -h Suppress printing of filenames when searching mul- + tiple files. + + -i Ignore upper/lower case distinctions during com- + parisons. + + -l Instead of printing lines from the files, just + + print the names of the files containing lines that + would have been printed. Each file name is printed + once, on a separate line. + + -n Precede each line by its line number in the file. + + -r If any file is a directory, recursively scan the + files it contains. Without -r a directory is + scanned as a normal file. + + -s Work silently, that is, display nothing except + error messages. The exit status indicates whether + any matches were found. + + -v Invert the sense of the match, so that lines which + do not match the pattern are now the ones that are + found. + + -x Force the pattern to be anchored (it must start + matching at the beginning of the line) and in + addition, require it to match the entire line. + This is equivalent to having ^ and $ characters at + the start and end of each alternative branch in + the regular expression. + + + +SEE ALSO + pcre(3), Perl 5 documentation + + + + + +DIAGNOSTICS + Exit status is 0 if any matches were found, 1 if no matches + were found, and 2 for syntax errors or inacessible files + (even if matches were found). + + + +AUTHOR + Philip Hazel + + Last updated: 15 August 2001 + Copyright (c) 1997-2001 University of Cambridge. diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/doc/pcreposix.3 b/rubbos/app/httpd-2.0.64/srclib/pcre/doc/pcreposix.3 new file mode 100644 index 00000000..41716ead --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/doc/pcreposix.3 @@ -0,0 +1,149 @@ +.TH PCRE 3 +.SH NAME +pcreposix - POSIX API for Perl-compatible regular expressions. +.SH SYNOPSIS +.B #include +.PP +.SM +.br +.B int regcomp(regex_t *\fIpreg\fR, const char *\fIpattern\fR, +.ti +5n +.B int \fIcflags\fR); +.PP +.br +.B int regexec(regex_t *\fIpreg\fR, const char *\fIstring\fR, +.ti +5n +.B size_t \fInmatch\fR, regmatch_t \fIpmatch\fR[], int \fIeflags\fR); +.PP +.br +.B size_t regerror(int \fIerrcode\fR, const regex_t *\fIpreg\fR, +.ti +5n +.B char *\fIerrbuf\fR, size_t \fIerrbuf_size\fR); +.PP +.br +.B void regfree(regex_t *\fIpreg\fR); + + +.SH DESCRIPTION +This set of functions provides a POSIX-style API to the PCRE regular expression +package. See the \fBpcre\fR documentation for a description of the native API, +which contains additional functionality. + +The functions described here are just wrapper functions that ultimately call +the native API. Their prototypes are defined in the \fBpcreposix.h\fR header +file, and on Unix systems the library itself is called \fBpcreposix.a\fR, so +can be accessed by adding \fB-lpcreposix\fR to the command for linking an +application which uses them. Because the POSIX functions call the native ones, +it is also necessary to add \fR-lpcre\fR. + +I have implemented only those option bits that can be reasonably mapped to PCRE +native options. In addition, the options REG_EXTENDED and REG_NOSUB are defined +with the value zero. They have no effect, but since programs that are written +to the POSIX interface often use them, this makes it easier to slot in PCRE as +a replacement library. Other POSIX options are not even defined. + +When PCRE is called via these functions, it is only the API that is POSIX-like +in style. The syntax and semantics of the regular expressions themselves are +still those of Perl, subject to the setting of various PCRE options, as +described below. + +The header for these functions is supplied as \fBpcreposix.h\fR to avoid any +potential clash with other POSIX libraries. It can, of course, be renamed or +aliased as \fBregex.h\fR, which is the "correct" name. It provides two +structure types, \fIregex_t\fR for compiled internal forms, and +\fIregmatch_t\fR for returning captured substrings. It also defines some +constants whose names start with "REG_"; these are used for setting options and +identifying error codes. + + +.SH COMPILING A PATTERN + +The function \fBregcomp()\fR is called to compile a pattern into an +internal form. The pattern is a C string terminated by a binary zero, and +is passed in the argument \fIpattern\fR. The \fIpreg\fR argument is a pointer +to a regex_t structure which is used as a base for storing information about +the compiled expression. + +The argument \fIcflags\fR is either zero, or contains one or more of the bits +defined by the following macros: + + REG_ICASE + +The PCRE_CASELESS option is set when the expression is passed for compilation +to the native function. + + REG_NEWLINE + +The PCRE_MULTILINE option is set when the expression is passed for compilation +to the native function. + +In the absence of these flags, no options are passed to the native function. +This means the the regex is compiled with PCRE default semantics. In +particular, the way it handles newline characters in the subject string is the +Perl way, not the POSIX way. Note that setting PCRE_MULTILINE has only +\fIsome\fR of the effects specified for REG_NEWLINE. It does not affect the way +newlines are matched by . (they aren't) or a negative class such as [^a] (they +are). + +The yield of \fBregcomp()\fR is zero on success, and non-zero otherwise. The +\fIpreg\fR structure is filled in on success, and one member of the structure +is publicized: \fIre_nsub\fR contains the number of capturing subpatterns in +the regular expression. Various error codes are defined in the header file. + + +.SH MATCHING A PATTERN +The function \fBregexec()\fR is called to match a pre-compiled pattern +\fIpreg\fR against a given \fIstring\fR, which is terminated by a zero byte, +subject to the options in \fIeflags\fR. These can be: + + REG_NOTBOL + +The PCRE_NOTBOL option is set when calling the underlying PCRE matching +function. + + REG_NOTEOL + +The PCRE_NOTEOL option is set when calling the underlying PCRE matching +function. + +The portion of the string that was matched, and also any captured substrings, +are returned via the \fIpmatch\fR argument, which points to an array of +\fInmatch\fR structures of type \fIregmatch_t\fR, containing the members +\fIrm_so\fR and \fIrm_eo\fR. These contain the offset to the first character of +each substring and the offset to the first character after the end of each +substring, respectively. The 0th element of the vector relates to the entire +portion of \fIstring\fR that was matched; subsequent elements relate to the +capturing subpatterns of the regular expression. Unused entries in the array +have both structure members set to -1. + +A successful match yields a zero return; various error codes are defined in the +header file, of which REG_NOMATCH is the "expected" failure code. + + +.SH ERROR MESSAGES +The \fBregerror()\fR function maps a non-zero errorcode from either +\fBregcomp\fR or \fBregexec\fR to a printable message. If \fIpreg\fR is not +NULL, the error should have arisen from the use of that structure. A message +terminated by a binary zero is placed in \fIerrbuf\fR. The length of the +message, including the zero, is limited to \fIerrbuf_size\fR. The yield of the +function is the size of buffer needed to hold the whole message. + + +.SH STORAGE +Compiling a regular expression causes memory to be allocated and associated +with the \fIpreg\fR structure. The function \fBregfree()\fR frees all such +memory, after which \fIpreg\fR may no longer be used as a compiled expression. + + +.SH AUTHOR +Philip Hazel +.br +University Computing Service, +.br +New Museums Site, +.br +Cambridge CB2 3QG, England. +.br +Phone: +44 1223 334714 + +Copyright (c) 1997-2000 University of Cambridge. diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/doc/pcreposix.html b/rubbos/app/httpd-2.0.64/srclib/pcre/doc/pcreposix.html new file mode 100644 index 00000000..9c894784 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/doc/pcreposix.html @@ -0,0 +1,191 @@ + + +pcreposix specification + + +

    pcreposix specification

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

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

    +
  • SYNOPSIS +

    +#include <pcreposix.h> +

    +

    +int regcomp(regex_t *preg, const char *pattern, +int cflags); +

    +

    +int regexec(regex_t *preg, const char *string, +size_t nmatch, regmatch_t pmatch[], int eflags); +

    +

    +size_t regerror(int errcode, const regex_t *preg, +char *errbuf, size_t errbuf_size); +

    +

    +void regfree(regex_t *preg); +

    +
  • DESCRIPTION +

    +This set of functions provides a POSIX-style API to the PCRE regular expression +package. See the pcre documentation for a description of the native API, +which contains additional functionality. +

    +

    +The functions described here are just wrapper functions that ultimately call +the native API. Their prototypes are defined in the pcreposix.h header +file, and on Unix systems the library itself is called pcreposix.a, so +can be accessed by adding -lpcreposix to the command for linking an +application which uses them. Because the POSIX functions call the native ones, +it is also necessary to add \fR-lpcre\fR. +

    +

    +I have implemented only those option bits that can be reasonably mapped to PCRE +native options. In addition, the options REG_EXTENDED and REG_NOSUB are defined +with the value zero. They have no effect, but since programs that are written +to the POSIX interface often use them, this makes it easier to slot in PCRE as +a replacement library. Other POSIX options are not even defined. +

    +

    +When PCRE is called via these functions, it is only the API that is POSIX-like +in style. The syntax and semantics of the regular expressions themselves are +still those of Perl, subject to the setting of various PCRE options, as +described below. +

    +

    +The header for these functions is supplied as pcreposix.h to avoid any +potential clash with other POSIX libraries. It can, of course, be renamed or +aliased as regex.h, which is the "correct" name. It provides two +structure types, regex_t for compiled internal forms, and +regmatch_t for returning captured substrings. It also defines some +constants whose names start with "REG_"; these are used for setting options and +identifying error codes. +

    +
  • COMPILING A PATTERN +

    +The function regcomp() is called to compile a pattern into an +internal form. The pattern is a C string terminated by a binary zero, and +is passed in the argument pattern. The preg argument is a pointer +to a regex_t structure which is used as a base for storing information about +the compiled expression. +

    +

    +The argument cflags is either zero, or contains one or more of the bits +defined by the following macros: +

    +

    +

    +  REG_ICASE
    +
    +

    +

    +The PCRE_CASELESS option is set when the expression is passed for compilation +to the native function. +

    +

    +

    +  REG_NEWLINE
    +
    +

    +

    +The PCRE_MULTILINE option is set when the expression is passed for compilation +to the native function. +

    +

    +In the absence of these flags, no options are passed to the native function. +This means the the regex is compiled with PCRE default semantics. In +particular, the way it handles newline characters in the subject string is the +Perl way, not the POSIX way. Note that setting PCRE_MULTILINE has only +some of the effects specified for REG_NEWLINE. It does not affect the way +newlines are matched by . (they aren't) or a negative class such as [^a] (they +are). +

    +

    +The yield of regcomp() is zero on success, and non-zero otherwise. The +preg structure is filled in on success, and one member of the structure +is publicized: re_nsub contains the number of capturing subpatterns in +the regular expression. Various error codes are defined in the header file. +

    +
  • MATCHING A PATTERN +

    +The function regexec() is called to match a pre-compiled pattern +preg against a given string, which is terminated by a zero byte, +subject to the options in eflags. These can be: +

    +

    +

    +  REG_NOTBOL
    +
    +

    +

    +The PCRE_NOTBOL option is set when calling the underlying PCRE matching +function. +

    +

    +

    +  REG_NOTEOL
    +
    +

    +

    +The PCRE_NOTEOL option is set when calling the underlying PCRE matching +function. +

    +

    +The portion of the string that was matched, and also any captured substrings, +are returned via the pmatch argument, which points to an array of +nmatch structures of type regmatch_t, containing the members +rm_so and rm_eo. These contain the offset to the first character of +each substring and the offset to the first character after the end of each +substring, respectively. The 0th element of the vector relates to the entire +portion of string that was matched; subsequent elements relate to the +capturing subpatterns of the regular expression. Unused entries in the array +have both structure members set to -1. +

    +

    +A successful match yields a zero return; various error codes are defined in the +header file, of which REG_NOMATCH is the "expected" failure code. +

    +
  • ERROR MESSAGES +

    +The regerror() function maps a non-zero errorcode from either +regcomp or regexec to a printable message. If preg is not +NULL, the error should have arisen from the use of that structure. A message +terminated by a binary zero is placed in errbuf. The length of the +message, including the zero, is limited to errbuf_size. The yield of the +function is the size of buffer needed to hold the whole message. +

    +
  • STORAGE +

    +Compiling a regular expression causes memory to be allocated and associated +with the preg structure. The function regfree() frees all such +memory, after which preg may no longer be used as a compiled expression. +

    +
  • AUTHOR +

    +Philip Hazel <ph10@cam.ac.uk> +
    +University Computing Service, +
    +New Museums Site, +
    +Cambridge CB2 3QG, England. +
    +Phone: +44 1223 334714 +

    +

    +Copyright (c) 1997-2000 University of Cambridge. diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/doc/pcreposix.txt b/rubbos/app/httpd-2.0.64/srclib/pcre/doc/pcreposix.txt new file mode 100644 index 00000000..2d76f7cd --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/doc/pcreposix.txt @@ -0,0 +1,159 @@ +NAME + pcreposix - POSIX API for Perl-compatible regular expres- + sions. + + + +SYNOPSIS + #include + + int regcomp(regex_t *preg, const char *pattern, + int cflags); + + int regexec(regex_t *preg, const char *string, + size_t nmatch, regmatch_t pmatch[], int eflags); + + size_t regerror(int errcode, const regex_t *preg, + char *errbuf, size_t errbuf_size); + + void regfree(regex_t *preg); + + + +DESCRIPTION + This set of functions provides a POSIX-style API to the PCRE + regular expression package. See the pcre documentation for a + description of the native API, which contains additional + functionality. + + The functions described here are just wrapper functions that + ultimately call the native API. Their prototypes are defined + in the pcreposix.h header file, and on Unix systems the + library itself is called pcreposix.a, so can be accessed by + adding -lpcreposix to the command for linking an application + which uses them. Because the POSIX functions call the native + ones, it is also necessary to add -lpcre. + + I have implemented only those option bits that can be rea- + sonably mapped to PCRE native options. In addition, the + options REG_EXTENDED and REG_NOSUB are defined with the + value zero. They have no effect, but since programs that are + written to the POSIX interface often use them, this makes it + easier to slot in PCRE as a replacement library. Other POSIX + options are not even defined. + + When PCRE is called via these functions, it is only the API + that is POSIX-like in style. The syntax and semantics of the + regular expressions themselves are still those of Perl, sub- + ject to the setting of various PCRE options, as described + below. + + The header for these functions is supplied as pcreposix.h to + avoid any potential clash with other POSIX libraries. It + can, of course, be renamed or aliased as regex.h, which is + the "correct" name. It provides two structure types, regex_t + for compiled internal forms, and regmatch_t for returning + captured substrings. It also defines some constants whose + names start with "REG_"; these are used for setting options + and identifying error codes. + + + +COMPILING A PATTERN + The function regcomp() is called to compile a pattern into + an internal form. The pattern is a C string terminated by a + binary zero, and is passed in the argument pattern. The preg + argument is a pointer to a regex_t structure which is used + as a base for storing information about the compiled expres- + sion. + + The argument cflags is either zero, or contains one or more + of the bits defined by the following macros: + + REG_ICASE + + The PCRE_CASELESS option is set when the expression is + passed for compilation to the native function. + + REG_NEWLINE + + The PCRE_MULTILINE option is set when the expression is + passed for compilation to the native function. + + In the absence of these flags, no options are passed to the + native function. This means the the regex is compiled with + PCRE default semantics. In particular, the way it handles + newline characters in the subject string is the Perl way, + not the POSIX way. Note that setting PCRE_MULTILINE has only + some of the effects specified for REG_NEWLINE. It does not + affect the way newlines are matched by . (they aren't) or a + negative class such as [^a] (they are). + + The yield of regcomp() is zero on success, and non-zero oth- + erwise. The preg structure is filled in on success, and one + member of the structure is publicized: re_nsub contains the + number of capturing subpatterns in the regular expression. + Various error codes are defined in the header file. + + + +MATCHING A PATTERN + The function regexec() is called to match a pre-compiled + pattern preg against a given string, which is terminated by + a zero byte, subject to the options in eflags. These can be: + + REG_NOTBOL + + The PCRE_NOTBOL option is set when calling the underlying + PCRE matching function. + + REG_NOTEOL + + The PCRE_NOTEOL option is set when calling the underlying + PCRE matching function. + + The portion of the string that was matched, and also any + captured substrings, are returned via the pmatch argument, + which points to an array of nmatch structures of type + regmatch_t, containing the members rm_so and rm_eo. These + contain the offset to the first character of each substring + and the offset to the first character after the end of each + substring, respectively. The 0th element of the vector + relates to the entire portion of string that was matched; + subsequent elements relate to the capturing subpatterns of + the regular expression. Unused entries in the array have + both structure members set to -1. + + A successful match yields a zero return; various error codes + are defined in the header file, of which REG_NOMATCH is the + "expected" failure code. + + + +ERROR MESSAGES + The regerror() function maps a non-zero errorcode from + either regcomp or regexec to a printable message. If preg is + not NULL, the error should have arisen from the use of that + structure. A message terminated by a binary zero is placed + in errbuf. The length of the message, including the zero, is + limited to errbuf_size. The yield of the function is the + size of buffer needed to hold the whole message. + + + +STORAGE + Compiling a regular expression causes memory to be allocated + and associated with the preg structure. The function reg- + free() frees all such memory, after which preg may no longer + be used as a compiled expression. + + + +AUTHOR + Philip Hazel + University Computing Service, + New Museums Site, + Cambridge CB2 3QG, England. + Phone: +44 1223 334714 + + Copyright (c) 1997-2000 University of Cambridge. diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/doc/pcretest.1 b/rubbos/app/httpd-2.0.64/srclib/pcre/doc/pcretest.1 new file mode 100644 index 00000000..b2e25560 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/doc/pcretest.1 @@ -0,0 +1,282 @@ +.TH PCRETEST 1 +.SH NAME +pcretest - a program for testing Perl-compatible regular expressions. +.SH SYNOPSIS +.B pcretest "[-d] [-i] [-m] [-o osize] [-p] [-t] [source] [destination]" + +\fBpcretest\fR was written as a test program for the PCRE regular expression +library itself, but it can also be used for experimenting with regular +expressions. This man page describes the features of the test program; for +details of the regular expressions themselves, see the \fBpcre\fR man page. + +.SH OPTIONS +.TP 10 +\fB-d\fR +Behave as if each regex had the \fB/D\fR modifier (see below); the internal +form is output after compilation. +.TP 10 +\fB-i\fR +Behave as if each regex had the \fB/I\fR modifier; information about the +compiled pattern is given after compilation. +.TP 10 +\fB-m\fR +Output the size of each compiled pattern after it has been compiled. This is +equivalent to adding /M to each regular expression. For compatibility with +earlier versions of pcretest, \fB-s\fR is a synonym for \fB-m\fR. +.TP 10 +\fB-o\fR \fIosize\fR +Set the number of elements in the output vector that is used when calling PCRE +to be \fIosize\fR. The default value is 45, which is enough for 14 capturing +subexpressions. The vector size can be changed for individual matching calls by +including \\O in the data line (see below). +.TP 10 +\fB-p\fR +Behave as if each regex has \fB/P\fR modifier; the POSIX wrapper API is used +to call PCRE. None of the other options has any effect when \fB-p\fR is set. +.TP 10 +\fB-t\fR +Run each compile, study, and match 20000 times with a timer, and output +resulting time per compile or match (in milliseconds). Do not set \fB-t\fR with +\fB-m\fR, because you will then get the size output 20000 times and the timing +will be distorted. + + +.SH DESCRIPTION + +If \fBpcretest\fR is given two filename arguments, it reads from the first and +writes to the second. If it is given only one filename argument, it reads from +that file and writes to stdout. Otherwise, it reads from stdin and writes to +stdout, and prompts for each line of input, using "re>" to prompt for regular +expressions, and "data>" to prompt for data lines. + +The program handles any number of sets of input on a single input file. Each +set starts with a regular expression, and continues with any number of data +lines to be matched against the pattern. An empty line signals the end of the +data lines, at which point a new regular expression is read. The regular +expressions are given enclosed in any non-alphameric delimiters other than +backslash, for example + + /(a|bc)x+yz/ + +White space before the initial delimiter is ignored. A regular expression may +be continued over several input lines, in which case the newline characters are +included within it. It is possible to include the delimiter within the pattern +by escaping it, for example + + /abc\\/def/ + +If you do so, the escape and the delimiter form part of the pattern, but since +delimiters are always non-alphameric, this does not affect its interpretation. +If the terminating delimiter is immediately followed by a backslash, for +example, + + /abc/\\ + +then a backslash is added to the end of the pattern. This is done to provide a +way of testing the error condition that arises if a pattern finishes with a +backslash, because + + /abc\\/ + +is interpreted as the first line of a pattern that starts with "abc/", causing +pcretest to read the next line as a continuation of the regular expression. + + +.SH PATTERN MODIFIERS + +The pattern may be followed by \fBi\fR, \fBm\fR, \fBs\fR, or \fBx\fR to set the +PCRE_CASELESS, PCRE_MULTILINE, PCRE_DOTALL, or PCRE_EXTENDED options, +respectively. For example: + + /caseless/i + +These modifier letters have the same effect as they do in Perl. There are +others which set PCRE options that do not correspond to anything in Perl: +\fB/A\fR, \fB/E\fR, and \fB/X\fR set PCRE_ANCHORED, PCRE_DOLLAR_ENDONLY, and +PCRE_EXTRA respectively. + +Searching for all possible matches within each subject string can be requested +by the \fB/g\fR or \fB/G\fR modifier. After finding a match, PCRE is called +again to search the remainder of the subject string. The difference between +\fB/g\fR and \fB/G\fR is that the former uses the \fIstartoffset\fR argument to +\fBpcre_exec()\fR to start searching at a new point within the entire string +(which is in effect what Perl does), whereas the latter passes over a shortened +substring. This makes a difference to the matching process if the pattern +begins with a lookbehind assertion (including \\b or \\B). + +If any call to \fBpcre_exec()\fR in a \fB/g\fR or \fB/G\fR sequence matches an +empty string, the next call is done with the PCRE_NOTEMPTY and PCRE_ANCHORED +flags set in order to search for another, non-empty, match at the same point. +If this second match fails, the start offset is advanced by one, and the normal +match is retried. This imitates the way Perl handles such cases when using the +\fB/g\fR modifier or the \fBsplit()\fR function. + +There are a number of other modifiers for controlling the way \fBpcretest\fR +operates. + +The \fB/+\fR modifier requests that as well as outputting the substring that +matched the entire pattern, pcretest should in addition output the remainder of +the subject string. This is useful for tests where the subject contains +multiple copies of the same substring. + +The \fB/L\fR modifier must be followed directly by the name of a locale, for +example, + + /pattern/Lfr + +For this reason, it must be the last modifier letter. The given locale is set, +\fBpcre_maketables()\fR is called to build a set of character tables for the +locale, and this is then passed to \fBpcre_compile()\fR when compiling the +regular expression. Without an \fB/L\fR modifier, NULL is passed as the tables +pointer; that is, \fB/L\fR applies only to the expression on which it appears. + +The \fB/I\fR modifier requests that \fBpcretest\fR output information about the +compiled expression (whether it is anchored, has a fixed first character, and +so on). It does this by calling \fBpcre_fullinfo()\fR after compiling an +expression, and outputting the information it gets back. If the pattern is +studied, the results of that are also output. + +The \fB/D\fR modifier is a PCRE debugging feature, which also assumes \fB/I\fR. +It causes the internal form of compiled regular expressions to be output after +compilation. + +The \fB/S\fR modifier causes \fBpcre_study()\fR to be called after the +expression has been compiled, and the results used when the expression is +matched. + +The \fB/M\fR modifier causes the size of memory block used to hold the compiled +pattern to be output. + +The \fB/P\fR modifier causes \fBpcretest\fR to call PCRE via the POSIX wrapper +API rather than its native API. When this is done, all other modifiers except +\fB/i\fR, \fB/m\fR, and \fB/+\fR are ignored. REG_ICASE is set if \fB/i\fR is +present, and REG_NEWLINE is set if \fB/m\fR is present. The wrapper functions +force PCRE_DOLLAR_ENDONLY always, and PCRE_DOTALL unless REG_NEWLINE is set. + +The \fB/8\fR modifier causes \fBpcretest\fR to call PCRE with the PCRE_UTF8 +option set. This turns on the (currently incomplete) support for UTF-8 +character handling in PCRE, provided that it was compiled with this support +enabled. This modifier also causes any non-printing characters in output +strings to be printed using the \\x{hh...} notation if they are valid UTF-8 +sequences. + + +.SH DATA LINES + +Before each data line is passed to \fBpcre_exec()\fR, leading and trailing +whitespace is removed, and it is then scanned for \\ escapes. The following are +recognized: + + \\a alarm (= BEL) + \\b backspace + \\e escape + \\f formfeed + \\n newline + \\r carriage return + \\t tab + \\v vertical tab + \\nnn octal character (up to 3 octal digits) + \\xhh hexadecimal character (up to 2 hex digits) + \\x{hh...} hexadecimal UTF-8 character + + \\A pass the PCRE_ANCHORED option to \fBpcre_exec()\fR + \\B pass the PCRE_NOTBOL option to \fBpcre_exec()\fR + \\Cdd call pcre_copy_substring() for substring dd + after a successful match (any decimal number + less than 32) + \\Gdd call pcre_get_substring() for substring dd + after a successful match (any decimal number + less than 32) + \\L call pcre_get_substringlist() after a + successful match + \\N pass the PCRE_NOTEMPTY option to \fBpcre_exec()\fR + \\Odd set the size of the output vector passed to + \fBpcre_exec()\fR to dd (any number of decimal + digits) + \\Z pass the PCRE_NOTEOL option to \fBpcre_exec()\fR + +When \\O is used, it may be higher or lower than the size set by the \fB-O\fR +option (or defaulted to 45); \\O applies only to the call of \fBpcre_exec()\fR +for the line in which it appears. + +A backslash followed by anything else just escapes the anything else. If the +very last character is a backslash, it is ignored. This gives a way of passing +an empty line as data, since a real empty line terminates the data input. + +If \fB/P\fR was present on the regex, causing the POSIX wrapper API to be used, +only \fB\B\fR, and \fB\Z\fR have any effect, causing REG_NOTBOL and REG_NOTEOL +to be passed to \fBregexec()\fR respectively. + +The use of \\x{hh...} to represent UTF-8 characters is not dependent on the use +of the \fB/8\fR modifier on the pattern. It is recognized always. There may be +any number of hexadecimal digits inside the braces. The result is from one to +six bytes, encoded according to the UTF-8 rules. + + +.SH OUTPUT FROM PCRETEST + +When a match succeeds, pcretest outputs the list of captured substrings that +\fBpcre_exec()\fR returns, starting with number 0 for the string that matched +the whole pattern. Here is an example of an interactive pcretest run. + + $ pcretest + PCRE version 2.06 08-Jun-1999 + + re> /^abc(\\d+)/ + data> abc123 + 0: abc123 + 1: 123 + data> xyz + No match + +If the strings contain any non-printing characters, they are output as \\0x +escapes, or as \\x{...} escapes if the \fB/8\fR modifier was present on the +pattern. If the pattern has the \fB/+\fR modifier, then the output for +substring 0 is followed by the the rest of the subject string, identified by +"0+" like this: + + re> /cat/+ + data> cataract + 0: cat + 0+ aract + +If the pattern has the \fB/g\fR or \fB/G\fR modifier, the results of successive +matching attempts are output in sequence, like this: + + re> /\\Bi(\\w\\w)/g + data> Mississippi + 0: iss + 1: ss + 0: iss + 1: ss + 0: ipp + 1: pp + +"No match" is output only if the first match attempt fails. + +If any of the sequences \fB\\C\fR, \fB\\G\fR, or \fB\\L\fR are present in a +data line that is successfully matched, the substrings extracted by the +convenience functions are output with C, G, or L after the string number +instead of a colon. This is in addition to the normal full list. The string +length (that is, the return from the extraction function) is given in +parentheses after each string for \fB\\C\fR and \fB\\G\fR. + +Note that while patterns can be continued over several lines (a plain ">" +prompt is used for continuations), data lines may not. However newlines can be +included in data by means of the \\n escape. + + +.SH AUTHOR +Philip Hazel +.br +University Computing Service, +.br +New Museums Site, +.br +Cambridge CB2 3QG, England. +.br +Phone: +44 1223 334714 + +Last updated: 15 August 2001 +.br +Copyright (c) 1997-2001 University of Cambridge. diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/doc/pcretest.html b/rubbos/app/httpd-2.0.64/srclib/pcre/doc/pcretest.html new file mode 100644 index 00000000..918e6dec --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/doc/pcretest.html @@ -0,0 +1,369 @@ + + +pcretest specification + + +

    pcretest specification

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

    +pcretest - a program for testing Perl-compatible regular expressions. +

    +
  • SYNOPSIS +

    +pcretest [-d] [-i] [-m] [-o osize] [-p] [-t] [source] [destination] +

    +

    +pcretest was written as a test program for the PCRE regular expression +library itself, but it can also be used for experimenting with regular +expressions. This man page describes the features of the test program; for +details of the regular expressions themselves, see the pcre man page. +

    +
  • OPTIONS +

    +-d +Behave as if each regex had the /D modifier (see below); the internal +form is output after compilation. +

    +

    +-i +Behave as if each regex had the /I modifier; information about the +compiled pattern is given after compilation. +

    +

    +-m +Output the size of each compiled pattern after it has been compiled. This is +equivalent to adding /M to each regular expression. For compatibility with +earlier versions of pcretest, -s is a synonym for -m. +

    +

    +-o osize +Set the number of elements in the output vector that is used when calling PCRE +to be osize. The default value is 45, which is enough for 14 capturing +subexpressions. The vector size can be changed for individual matching calls by +including \O in the data line (see below). +

    +

    +-p +Behave as if each regex has /P modifier; the POSIX wrapper API is used +to call PCRE. None of the other options has any effect when -p is set. +

    +

    +-t +Run each compile, study, and match 20000 times with a timer, and output +resulting time per compile or match (in milliseconds). Do not set -t with +-m, because you will then get the size output 20000 times and the timing +will be distorted. +

    +
  • DESCRIPTION +

    +If pcretest is given two filename arguments, it reads from the first and +writes to the second. If it is given only one filename argument, it reads from +that file and writes to stdout. Otherwise, it reads from stdin and writes to +stdout, and prompts for each line of input, using "re>" to prompt for regular +expressions, and "data>" to prompt for data lines. +

    +

    +The program handles any number of sets of input on a single input file. Each +set starts with a regular expression, and continues with any number of data +lines to be matched against the pattern. An empty line signals the end of the +data lines, at which point a new regular expression is read. The regular +expressions are given enclosed in any non-alphameric delimiters other than +backslash, for example +

    +

    +

    +  /(a|bc)x+yz/
    +
    +

    +

    +White space before the initial delimiter is ignored. A regular expression may +be continued over several input lines, in which case the newline characters are +included within it. It is possible to include the delimiter within the pattern +by escaping it, for example +

    +

    +

    +  /abc\/def/
    +
    +

    +

    +If you do so, the escape and the delimiter form part of the pattern, but since +delimiters are always non-alphameric, this does not affect its interpretation. +If the terminating delimiter is immediately followed by a backslash, for +example, +

    +

    +

    +  /abc/\
    +
    +

    +

    +then a backslash is added to the end of the pattern. This is done to provide a +way of testing the error condition that arises if a pattern finishes with a +backslash, because +

    +

    +

    +  /abc\/
    +
    +

    +

    +is interpreted as the first line of a pattern that starts with "abc/", causing +pcretest to read the next line as a continuation of the regular expression. +

    +
  • PATTERN MODIFIERS +

    +The pattern may be followed by i, m, s, or x to set the +PCRE_CASELESS, PCRE_MULTILINE, PCRE_DOTALL, or PCRE_EXTENDED options, +respectively. For example: +

    +

    +

    +  /caseless/i
    +
    +

    +

    +These modifier letters have the same effect as they do in Perl. There are +others which set PCRE options that do not correspond to anything in Perl: +/A, /E, and /X set PCRE_ANCHORED, PCRE_DOLLAR_ENDONLY, and +PCRE_EXTRA respectively. +

    +

    +Searching for all possible matches within each subject string can be requested +by the /g or /G modifier. After finding a match, PCRE is called +again to search the remainder of the subject string. The difference between +/g and /G is that the former uses the startoffset argument to +pcre_exec() to start searching at a new point within the entire string +(which is in effect what Perl does), whereas the latter passes over a shortened +substring. This makes a difference to the matching process if the pattern +begins with a lookbehind assertion (including \b or \B). +

    +

    +If any call to pcre_exec() in a /g or /G sequence matches an +empty string, the next call is done with the PCRE_NOTEMPTY and PCRE_ANCHORED +flags set in order to search for another, non-empty, match at the same point. +If this second match fails, the start offset is advanced by one, and the normal +match is retried. This imitates the way Perl handles such cases when using the +/g modifier or the split() function. +

    +

    +There are a number of other modifiers for controlling the way pcretest +operates. +

    +

    +The /+ modifier requests that as well as outputting the substring that +matched the entire pattern, pcretest should in addition output the remainder of +the subject string. This is useful for tests where the subject contains +multiple copies of the same substring. +

    +

    +The /L modifier must be followed directly by the name of a locale, for +example, +

    +

    +

    +  /pattern/Lfr
    +
    +

    +

    +For this reason, it must be the last modifier letter. The given locale is set, +pcre_maketables() is called to build a set of character tables for the +locale, and this is then passed to pcre_compile() when compiling the +regular expression. Without an /L modifier, NULL is passed as the tables +pointer; that is, /L applies only to the expression on which it appears. +

    +

    +The /I modifier requests that pcretest output information about the +compiled expression (whether it is anchored, has a fixed first character, and +so on). It does this by calling pcre_fullinfo() after compiling an +expression, and outputting the information it gets back. If the pattern is +studied, the results of that are also output. +

    +

    +The /D modifier is a PCRE debugging feature, which also assumes /I. +It causes the internal form of compiled regular expressions to be output after +compilation. +

    +

    +The /S modifier causes pcre_study() to be called after the +expression has been compiled, and the results used when the expression is +matched. +

    +

    +The /M modifier causes the size of memory block used to hold the compiled +pattern to be output. +

    +

    +The /P modifier causes pcretest to call PCRE via the POSIX wrapper +API rather than its native API. When this is done, all other modifiers except +/i, /m, and /+ are ignored. REG_ICASE is set if /i is +present, and REG_NEWLINE is set if /m is present. The wrapper functions +force PCRE_DOLLAR_ENDONLY always, and PCRE_DOTALL unless REG_NEWLINE is set. +

    +

    +The /8 modifier causes pcretest to call PCRE with the PCRE_UTF8 +option set. This turns on the (currently incomplete) support for UTF-8 +character handling in PCRE, provided that it was compiled with this support +enabled. This modifier also causes any non-printing characters in output +strings to be printed using the \x{hh...} notation if they are valid UTF-8 +sequences. +

    +
  • DATA LINES +

    +Before each data line is passed to pcre_exec(), leading and trailing +whitespace is removed, and it is then scanned for \ escapes. The following are +recognized: +

    +

    +

    +  \a         alarm (= BEL)
    +  \b         backspace
    +  \e         escape
    +  \f         formfeed
    +  \n         newline
    +  \r         carriage return
    +  \t         tab
    +  \v         vertical tab
    +  \nnn       octal character (up to 3 octal digits)
    +  \xhh       hexadecimal character (up to 2 hex digits)
    +  \x{hh...}  hexadecimal UTF-8 character
    +
    +

    +

    +

    +  \A         pass the PCRE_ANCHORED option to pcre_exec()
    +  \B         pass the PCRE_NOTBOL option to pcre_exec()
    +  \Cdd       call pcre_copy_substring() for substring dd
    +                after a successful match (any decimal number
    +                less than 32)
    +  \Gdd       call pcre_get_substring() for substring dd
    +                after a successful match (any decimal number
    +                less than 32)
    +  \L         call pcre_get_substringlist() after a
    +                successful match
    +  \N         pass the PCRE_NOTEMPTY option to pcre_exec()
    +  \Odd       set the size of the output vector passed to
    +                pcre_exec() to dd (any number of decimal
    +                digits)
    +  \Z         pass the PCRE_NOTEOL option to pcre_exec()
    +
    +

    +

    +When \O is used, it may be higher or lower than the size set by the -O +option (or defaulted to 45); \O applies only to the call of pcre_exec() +for the line in which it appears. +

    +

    +A backslash followed by anything else just escapes the anything else. If the +very last character is a backslash, it is ignored. This gives a way of passing +an empty line as data, since a real empty line terminates the data input. +

    +

    +If /P was present on the regex, causing the POSIX wrapper API to be used, +only \B, and \Z have any effect, causing REG_NOTBOL and REG_NOTEOL +to be passed to regexec() respectively. +

    +

    +The use of \x{hh...} to represent UTF-8 characters is not dependent on the use +of the /8 modifier on the pattern. It is recognized always. There may be +any number of hexadecimal digits inside the braces. The result is from one to +six bytes, encoded according to the UTF-8 rules. +

    +
  • OUTPUT FROM PCRETEST +

    +When a match succeeds, pcretest outputs the list of captured substrings that +pcre_exec() returns, starting with number 0 for the string that matched +the whole pattern. Here is an example of an interactive pcretest run. +

    +

    +

    +  $ pcretest
    +  PCRE version 2.06 08-Jun-1999
    +
    +

    +

    +

    +    re> /^abc(\d+)/
    +  data> abc123
    +   0: abc123
    +   1: 123
    +  data> xyz
    +  No match
    +
    +

    +

    +If the strings contain any non-printing characters, they are output as \0x +escapes, or as \x{...} escapes if the /8 modifier was present on the +pattern. If the pattern has the /+ modifier, then the output for +substring 0 is followed by the the rest of the subject string, identified by +"0+" like this: +

    +

    +

    +    re> /cat/+
    +  data> cataract
    +   0: cat
    +   0+ aract
    +
    +

    +

    +If the pattern has the /g or /G modifier, the results of successive +matching attempts are output in sequence, like this: +

    +

    +

    +    re> /\Bi(\w\w)/g
    +  data> Mississippi
    +   0: iss
    +   1: ss
    +   0: iss
    +   1: ss
    +   0: ipp
    +   1: pp
    +
    +

    +

    +"No match" is output only if the first match attempt fails. +

    +

    +If any of the sequences \C, \G, or \L are present in a +data line that is successfully matched, the substrings extracted by the +convenience functions are output with C, G, or L after the string number +instead of a colon. This is in addition to the normal full list. The string +length (that is, the return from the extraction function) is given in +parentheses after each string for \C and \G. +

    +

    +Note that while patterns can be continued over several lines (a plain ">" +prompt is used for continuations), data lines may not. However newlines can be +included in data by means of the \n escape. +

    +
  • AUTHOR +

    +Philip Hazel <ph10@cam.ac.uk> +
    +University Computing Service, +
    +New Museums Site, +
    +Cambridge CB2 3QG, England. +
    +Phone: +44 1223 334714 +

    +

    +Last updated: 15 August 2001 +
    +Copyright (c) 1997-2001 University of Cambridge. diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/doc/pcretest.txt b/rubbos/app/httpd-2.0.64/srclib/pcre/doc/pcretest.txt new file mode 100644 index 00000000..0e13b6c6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/doc/pcretest.txt @@ -0,0 +1,319 @@ +NAME + pcretest - a program for testing Perl-compatible regular + expressions. + + + +SYNOPSIS + pcretest [-d] [-i] [-m] [-o osize] [-p] [-t] [source] [des- + tination] + + pcretest was written as a test program for the PCRE regular + expression library itself, but it can also be used for + experimenting with regular expressions. This man page + describes the features of the test program; for details of + the regular expressions themselves, see the pcre man page. + + + +OPTIONS + -d Behave as if each regex had the /D modifier (see + below); the internal form is output after compila- + tion. + + -i Behave as if each regex had the /I modifier; + information about the compiled pattern is given + after compilation. + + -m Output the size of each compiled pattern after it + has been compiled. This is equivalent to adding /M + to each regular expression. For compatibility with + earlier versions of pcretest, -s is a synonym for + -m. + + -o osize Set the number of elements in the output vector + that is used when calling PCRE to be osize. The + default value is 45, which is enough for 14 cap- + turing subexpressions. The vector size can be + changed for individual matching calls by including + \O in the data line (see below). + + -p Behave as if each regex has /P modifier; the POSIX + wrapper API is used to call PCRE. None of the + other options has any effect when -p is set. + + -t Run each compile, study, and match 20000 times + with a timer, and output resulting time per com- + pile or match (in milliseconds). Do not set -t + with -m, because you will then get the size output + 20000 times and the timing will be distorted. + + + +DESCRIPTION + If pcretest is given two filename arguments, it reads from + the first and writes to the second. If it is given only one + + + + +SunOS 5.8 Last change: 1 + + + + filename argument, it reads from that file and writes to + stdout. Otherwise, it reads from stdin and writes to stdout, + and prompts for each line of input, using "re>" to prompt + for regular expressions, and "data>" to prompt for data + lines. + + The program handles any number of sets of input on a single + input file. Each set starts with a regular expression, and + continues with any number of data lines to be matched + against the pattern. An empty line signals the end of the + data lines, at which point a new regular expression is read. + The regular expressions are given enclosed in any non- + alphameric delimiters other than backslash, for example + + /(a|bc)x+yz/ + + White space before the initial delimiter is ignored. A regu- + lar expression may be continued over several input lines, in + which case the newline characters are included within it. It + is possible to include the delimiter within the pattern by + escaping it, for example + + /abc\/def/ + + If you do so, the escape and the delimiter form part of the + pattern, but since delimiters are always non-alphameric, + this does not affect its interpretation. If the terminating + delimiter is immediately followed by a backslash, for exam- + ple, + + /abc/\ + + then a backslash is added to the end of the pattern. This is + done to provide a way of testing the error condition that + arises if a pattern finishes with a backslash, because + + /abc\/ + + is interpreted as the first line of a pattern that starts + with "abc/", causing pcretest to read the next line as a + continuation of the regular expression. + + + +PATTERN MODIFIERS + The pattern may be followed by i, m, s, or x to set the + PCRE_CASELESS, PCRE_MULTILINE, PCRE_DOTALL, or PCRE_EXTENDED + options, respectively. For example: + + /caseless/i + + These modifier letters have the same effect as they do in + Perl. There are others which set PCRE options that do not + correspond to anything in Perl: /A, /E, and /X set + PCRE_ANCHORED, PCRE_DOLLAR_ENDONLY, and PCRE_EXTRA respec- + tively. + + Searching for all possible matches within each subject + string can be requested by the /g or /G modifier. After + finding a match, PCRE is called again to search the + remainder of the subject string. The difference between /g + and /G is that the former uses the startoffset argument to + pcre_exec() to start searching at a new point within the + entire string (which is in effect what Perl does), whereas + the latter passes over a shortened substring. This makes a + difference to the matching process if the pattern begins + with a lookbehind assertion (including \b or \B). + + If any call to pcre_exec() in a /g or /G sequence matches an + empty string, the next call is done with the PCRE_NOTEMPTY + and PCRE_ANCHORED flags set in order to search for another, + non-empty, match at the same point. If this second match + fails, the start offset is advanced by one, and the normal + match is retried. This imitates the way Perl handles such + cases when using the /g modifier or the split() function. + + There are a number of other modifiers for controlling the + way pcretest operates. + + The /+ modifier requests that as well as outputting the sub- + string that matched the entire pattern, pcretest should in + addition output the remainder of the subject string. This is + useful for tests where the subject contains multiple copies + of the same substring. + + The /L modifier must be followed directly by the name of a + locale, for example, + + /pattern/Lfr + + For this reason, it must be the last modifier letter. The + given locale is set, pcre_maketables() is called to build a + set of character tables for the locale, and this is then + passed to pcre_compile() when compiling the regular expres- + sion. Without an /L modifier, NULL is passed as the tables + pointer; that is, /L applies only to the expression on which + it appears. + + The /I modifier requests that pcretest output information + about the compiled expression (whether it is anchored, has a + fixed first character, and so on). It does this by calling + pcre_fullinfo() after compiling an expression, and output- + ting the information it gets back. If the pattern is stu- + died, the results of that are also output. + The /D modifier is a PCRE debugging feature, which also + assumes /I. It causes the internal form of compiled regular + expressions to be output after compilation. + + The /S modifier causes pcre_study() to be called after the + expression has been compiled, and the results used when the + expression is matched. + + The /M modifier causes the size of memory block used to hold + the compiled pattern to be output. + + The /P modifier causes pcretest to call PCRE via the POSIX + wrapper API rather than its native API. When this is done, + all other modifiers except /i, /m, and /+ are ignored. + REG_ICASE is set if /i is present, and REG_NEWLINE is set if + /m is present. The wrapper functions force + PCRE_DOLLAR_ENDONLY always, and PCRE_DOTALL unless + REG_NEWLINE is set. + + The /8 modifier causes pcretest to call PCRE with the + PCRE_UTF8 option set. This turns on the (currently incom- + plete) support for UTF-8 character handling in PCRE, pro- + vided that it was compiled with this support enabled. This + modifier also causes any non-printing characters in output + strings to be printed using the \x{hh...} notation if they + are valid UTF-8 sequences. + + + +DATA LINES + Before each data line is passed to pcre_exec(), leading and + trailing whitespace is removed, and it is then scanned for \ + escapes. The following are recognized: + + \a alarm (= BEL) + \b backspace + \e escape + \f formfeed + \n newline + \r carriage return + \t tab + \v vertical tab + \nnn octal character (up to 3 octal digits) + \xhh hexadecimal character (up to 2 hex digits) + \x{hh...} hexadecimal UTF-8 character + + \A pass the PCRE_ANCHORED option to pcre_exec() + \B pass the PCRE_NOTBOL option to pcre_exec() + \Cdd call pcre_copy_substring() for substring dd + after a successful match (any decimal number + less than 32) + \Gdd call pcre_get_substring() for substring dd + + after a successful match (any decimal number + less than 32) + \L call pcre_get_substringlist() after a + successful match + \N pass the PCRE_NOTEMPTY option to pcre_exec() + \Odd set the size of the output vector passed to + pcre_exec() to dd (any number of decimal + digits) + \Z pass the PCRE_NOTEOL option to pcre_exec() + + When \O is used, it may be higher or lower than the size set + by the -O option (or defaulted to 45); \O applies only to + the call of pcre_exec() for the line in which it appears. + + A backslash followed by anything else just escapes the any- + thing else. If the very last character is a backslash, it is + ignored. This gives a way of passing an empty line as data, + since a real empty line terminates the data input. + + If /P was present on the regex, causing the POSIX wrapper + API to be used, only B, and Z have any effect, causing + REG_NOTBOL and REG_NOTEOL to be passed to regexec() respec- + tively. + + The use of \x{hh...} to represent UTF-8 characters is not + dependent on the use of the /8 modifier on the pattern. It + is recognized always. There may be any number of hexadecimal + digits inside the braces. The result is from one to six + bytes, encoded according to the UTF-8 rules. + + + +OUTPUT FROM PCRETEST + When a match succeeds, pcretest outputs the list of captured + substrings that pcre_exec() returns, starting with number 0 + for the string that matched the whole pattern. Here is an + example of an interactive pcretest run. + + $ pcretest + PCRE version 2.06 08-Jun-1999 + + re> /^abc(\d+)/ + data> abc123 + 0: abc123 + 1: 123 + data> xyz + No match + + If the strings contain any non-printing characters, they are + output as \0x escapes, or as \x{...} escapes if the /8 + modifier was present on the pattern. If the pattern has the + /+ modifier, then the output for substring 0 is followed by + the the rest of the subject string, identified by "0+" like + this: + + re> /cat/+ + data> cataract + 0: cat + 0+ aract + + If the pattern has the /g or /G modifier, the results of + successive matching attempts are output in sequence, like + this: + + re> /\Bi(\w\w)/g + data> Mississippi + 0: iss + 1: ss + 0: iss + 1: ss + 0: ipp + 1: pp + + "No match" is output only if the first match attempt fails. + + If any of the sequences \C, \G, or \L are present in a data + line that is successfully matched, the substrings extracted + by the convenience functions are output with C, G, or L + after the string number instead of a colon. This is in addi- + tion to the normal full list. The string length (that is, + the return from the extraction function) is given in + parentheses after each string for \C and \G. + + Note that while patterns can be continued over several lines + (a plain ">" prompt is used for continuations), data lines + may not. However newlines can be included in data by means + of the \n escape. + + + +AUTHOR + Philip Hazel + University Computing Service, + New Museums Site, + Cambridge CB2 3QG, England. + Phone: +44 1223 334714 + + Last updated: 15 August 2001 + Copyright (c) 1997-2001 University of Cambridge. diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/doc/perltest.txt b/rubbos/app/httpd-2.0.64/srclib/pcre/doc/perltest.txt new file mode 100644 index 00000000..5a404016 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/doc/perltest.txt @@ -0,0 +1,29 @@ +The perltest program +-------------------- + +The perltest program tests Perl's regular expressions; it has the same +specification as pcretest, and so can be given identical input, except that +input patterns can be followed only by Perl's lower case modifiers and /+ (as +used by pcretest), which is recognized and handled by the program. + +The data lines are processed as Perl double-quoted strings, so if they contain +" \ $ or @ characters, these have to be escaped. For this reason, all such +characters in testinput1 and testinput3 are escaped so that they can be used +for perltest as well as for pcretest, and the special upper case modifiers such +as /A that pcretest recognizes are not used in these files. The output should +be identical, apart from the initial identifying banner. + +For testing UTF-8 features, an alternative form of perltest, called perltest8, +is supplied. This requires Perl 5.6 or higher. It recognizes the special +modifier /8 that pcretest uses to invoke UTF-8 functionality. The testinput5 +file can be fed to perltest8. + +The testinput2 and testinput4 files are not suitable for feeding to perltest, +since they do make use of the special upper case modifiers and escapes that +pcretest uses to test some features of PCRE. The first of these files also +contains malformed regular expressions, in order to check that PCRE diagnoses +them correctly. Similarly, testinput6 tests UTF-8 features that do not relate +to Perl. + +Philip Hazel +August 2000 diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/doc/pgrep.1 b/rubbos/app/httpd-2.0.64/srclib/pcre/doc/pgrep.1 new file mode 100644 index 00000000..d9e9b575 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/doc/pgrep.1 @@ -0,0 +1,76 @@ +.TH PGREP 1 +.SH NAME +pgrep - a grep with Perl-compatible regular expressions. +.SH SYNOPSIS +.B pgrep [-Vchilnsvx] pattern [file] ... + + +.SH DESCRIPTION +\fBpgrep\fR searches files for character patterns, in the same way as other +grep commands do, but it uses the PCRE regular expression library to support +patterns that are compatible with the regular expressions of Perl 5. See +\fBpcre(3)\fR for a full description of syntax and semantics. + +If no files are specified, \fBpgrep\fR reads the standard input. By default, +each line that matches the pattern is copied to the standard output, and if +there is more than one file, the file name is printed before each line of +output. However, there are options that can change how \fBpgrep\fR behaves. + +Lines are limited to BUFSIZ characters. BUFSIZ is defined in \fB\fR. +The newline character is removed from the end of each line before it is matched +against the pattern. + + +.SH OPTIONS +.TP 10 +\fB-V\fR +Write the version number of the PCRE library being used to the standard error +stream. +.TP +\fB-c\fR +Do not print individual lines; instead just print a count of the number of +lines that would otherwise have been printed. If several files are given, a +count is printed for each of them. +.TP +\fB-h\fR +Suppress printing of filenames when searching multiple files. +.TP +\fB-i\fR +Ignore upper/lower case distinctions during comparisons. +.TP +\fB-l\fR +Instead of printing lines from the files, just print the names of the files +containing lines that would have been printed. Each file name is printed +once, on a separate line. +.TP +\fB-n\fR +Precede each line by its line number in the file. +.TP +\fB-s\fR +Work silently, that is, display nothing except error messages. +The exit status indicates whether any matches were found. +.TP +\fB-v\fR +Invert the sense of the match, so that lines which do \fInot\fR match the +pattern are now the ones that are found. +.TP +\fB-x\fR +Force the pattern to be anchored (it must start matching at the beginning of +the line) and in addition, require it to match the entire line. This is +equivalent to having ^ and $ characters at the start and end of each +alternative branch in the regular expression. + + +.SH SEE ALSO +\fBpcre(3)\fR, Perl 5 documentation + + +.SH DIAGNOSTICS +Exit status is 0 if any matches were found, 1 if no matches were found, and 2 +for syntax errors or inacessible files (even if matches were found). + + +.SH AUTHOR +Philip Hazel +.br +Copyright (c) 1997-1999 University of Cambridge. diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/doc/pgrep.html b/rubbos/app/httpd-2.0.64/srclib/pcre/doc/pgrep.html new file mode 100644 index 00000000..54efed67 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/doc/pgrep.html @@ -0,0 +1,105 @@ + + +pgrep specification + + +

    pgrep specification

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

    +pgrep - a grep with Perl-compatible regular expressions. +

    +
  • SYNOPSIS +

    +pgrep [-Vchilnsvx] pattern [file] ... +

    +
  • DESCRIPTION +

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

    +

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

    +

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

    +
  • OPTIONS +

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

    +

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

    +

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

    +

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

    +

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

    +

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

    +

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

    +

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

    +

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

    +
  • SEE ALSO +

    +pcre(3), Perl 5 documentation +

    +
  • DIAGNOSTICS +

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

    +
  • AUTHOR +

    +Philip Hazel <ph10@cam.ac.uk> +
    +Copyright (c) 1997-1999 University of Cambridge. diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/doc/pgrep.txt b/rubbos/app/httpd-2.0.64/srclib/pcre/doc/pgrep.txt new file mode 100644 index 00000000..bcd08c0a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/doc/pgrep.txt @@ -0,0 +1,86 @@ +NAME + pgrep - a grep with Perl-compatible regular expressions. + + + +SYNOPSIS + pgrep [-Vchilnsvx] pattern [file] ... + + + +DESCRIPTION + pgrep searches files for character patterns, in the same way + as other grep commands do, but it uses the PCRE regular + expression library to support patterns that are compatible + with the regular expressions of Perl 5. See pcre(3) for a + full description of syntax and semantics. + + If no files are specified, pgrep reads the standard input. + By default, each line that matches the pattern is copied to + the standard output, and if there is more than one file, the + file name is printed before each line of output. However, + there are options that can change how pgrep behaves. + + Lines are limited to BUFSIZ characters. BUFSIZ is defined in + . The newline character is removed from the end of + each line before it is matched against the pattern. + + + +OPTIONS + -V Write the version number of the PCRE library being + used to the standard error stream. + + -c Do not print individual lines; instead just print + a count of the number of lines that would other- + wise have been printed. If several files are + given, a count is printed for each of them. + + -h Suppress printing of filenames when searching mul- + tiple files. + + -i Ignore upper/lower case distinctions during com- + parisons. + + -l Instead of printing lines from the files, just + print the names of the files containing lines that + would have been printed. Each file name is printed + once, on a separate line. + + -n Precede each line by its line number in the file. + + -s Work silently, that is, display nothing except + error messages. The exit status indicates whether + any matches were found. + + -v Invert the sense of the match, so that lines which + do not match the pattern are now the ones that are + found. + + -x Force the pattern to be anchored (it must start + matching at the beginning of the line) and in + addition, require it to match the entire line. + This is equivalent to having ^ and $ characters at + the start and end of each alternative branch in + the regular expression. + + + +SEE ALSO + pcre(3), Perl 5 documentation + + + + + +DIAGNOSTICS + Exit status is 0 if any matches were found, 1 if no matches + were found, and 2 for syntax errors or inacessible files + (even if matches were found). + + + +AUTHOR + Philip Hazel + Copyright (c) 1997-1999 University of Cambridge. + diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/get.c b/rubbos/app/httpd-2.0.64/srclib/pcre/get.c new file mode 100644 index 00000000..55e736dc --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/get.c @@ -0,0 +1,227 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* +This is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. See +the file Tech.Notes for some information on the internals. + +Written by: Philip Hazel + + Copyright (c) 1997-2001 University of Cambridge + +----------------------------------------------------------------------------- +Permission is granted to anyone to use this software for any purpose on any +computer system, and to redistribute it freely, subject to the following +restrictions: + +1. This software is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +2. The origin of this software must not be misrepresented, either by + explicit claim or by omission. + +3. Altered versions must be plainly marked as such, and must not be + misrepresented as being the original software. + +4. If PCRE is embedded in any software that is released under the GNU + General Purpose Licence (GPL), then the terms of that licence shall + supersede any condition above with which it is incompatible. +----------------------------------------------------------------------------- +*/ + +/* This module contains some convenience functions for extracting substrings +from the subject string after a regex match has succeeded. The original idea +for these functions came from Scott Wimer . */ + + +/* Include the internals header, which itself includes Standard C headers plus +the external pcre header. */ + +#include "internal.h" + + + +/************************************************* +* Copy captured string to given buffer * +*************************************************/ + +/* This function copies a single captured substring into a given buffer. +Note that we use memcpy() rather than strncpy() in case there are binary zeros +in the string. + +Arguments: + subject the subject string that was matched + ovector pointer to the offsets table + stringcount the number of substrings that were captured + (i.e. the yield of the pcre_exec call, unless + that was zero, in which case it should be 1/3 + of the offset table size) + stringnumber the number of the required substring + buffer where to put the substring + size the size of the buffer + +Returns: if successful: + the length of the copied string, not including the zero + that is put on the end; can be zero + if not successful: + PCRE_ERROR_NOMEMORY (-6) buffer too small + PCRE_ERROR_NOSUBSTRING (-7) no such captured substring +*/ + +int +pcre_copy_substring(const char *subject, int *ovector, int stringcount, + int stringnumber, char *buffer, int size) +{ +int yield; +if (stringnumber < 0 || stringnumber >= stringcount) + return PCRE_ERROR_NOSUBSTRING; +stringnumber *= 2; +yield = ovector[stringnumber+1] - ovector[stringnumber]; +if (size < yield + 1) return PCRE_ERROR_NOMEMORY; +memcpy(buffer, subject + ovector[stringnumber], yield); +buffer[yield] = 0; +return yield; +} + + + +/************************************************* +* Copy all captured strings to new store * +*************************************************/ + +/* This function gets one chunk of store and builds a list of pointers and all +of the captured substrings in it. A NULL pointer is put on the end of the list. + +Arguments: + subject the subject string that was matched + ovector pointer to the offsets table + stringcount the number of substrings that were captured + (i.e. the yield of the pcre_exec call, unless + that was zero, in which case it should be 1/3 + of the offset table size) + listptr set to point to the list of pointers + +Returns: if successful: 0 + if not successful: + PCRE_ERROR_NOMEMORY (-6) failed to get store +*/ + +int +pcre_get_substring_list(const char *subject, int *ovector, int stringcount, + const char ***listptr) +{ +int i; +int size = sizeof(char *); +int double_count = stringcount * 2; +char **stringlist; +char *p; + +for (i = 0; i < double_count; i += 2) + size += sizeof(char *) + ovector[i+1] - ovector[i] + 1; + +stringlist = (char **)(pcre_malloc)(size); +if (stringlist == NULL) return PCRE_ERROR_NOMEMORY; + +*listptr = (const char **)stringlist; +p = (char *)(stringlist + stringcount + 1); + +for (i = 0; i < double_count; i += 2) + { + int len = ovector[i+1] - ovector[i]; + memcpy(p, subject + ovector[i], len); + *stringlist++ = p; + p += len; + *p++ = 0; + } + +*stringlist = NULL; +return 0; +} + + + +/************************************************* +* Free store obtained by get_substring_list * +*************************************************/ + +/* This function exists for the benefit of people calling PCRE from non-C +programs that can call its functions, but not free() or (pcre_free)() directly. + +Argument: the result of a previous pcre_get_substring_list() +Returns: nothing +*/ + +void +pcre_free_substring_list(const char **pointer) +{ +(pcre_free)((void *)pointer); +} + + + +/************************************************* +* Copy captured string to new store * +*************************************************/ + +/* This function copies a single captured substring into a piece of new +store + +Arguments: + subject the subject string that was matched + ovector pointer to the offsets table + stringcount the number of substrings that were captured + (i.e. the yield of the pcre_exec call, unless + that was zero, in which case it should be 1/3 + of the offset table size) + stringnumber the number of the required substring + stringptr where to put a pointer to the substring + +Returns: if successful: + the length of the string, not including the zero that + is put on the end; can be zero + if not successful: + PCRE_ERROR_NOMEMORY (-6) failed to get store + PCRE_ERROR_NOSUBSTRING (-7) substring not present +*/ + +int +pcre_get_substring(const char *subject, int *ovector, int stringcount, + int stringnumber, const char **stringptr) +{ +int yield; +char *substring; +if (stringnumber < 0 || stringnumber >= stringcount) + return PCRE_ERROR_NOSUBSTRING; +stringnumber *= 2; +yield = ovector[stringnumber+1] - ovector[stringnumber]; +substring = (char *)(pcre_malloc)(yield + 1); +if (substring == NULL) return PCRE_ERROR_NOMEMORY; +memcpy(substring, subject + ovector[stringnumber], yield); +substring[yield] = 0; +*stringptr = substring; +return yield; +} + + + +/************************************************* +* Free store obtained by get_substring * +*************************************************/ + +/* This function exists for the benefit of people calling PCRE from non-C +programs that can call its functions, but not free() or (pcre_free)() directly. + +Argument: the result of a previous pcre_get_substring() +Returns: nothing +*/ + +void +pcre_free_substring(const char *pointer) +{ +(pcre_free)((void *)pointer); +} + +/* End of get.c */ diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/get.lo b/rubbos/app/httpd-2.0.64/srclib/pcre/get.lo new file mode 100644 index 00000000..45fdc174 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/get.lo @@ -0,0 +1,12 @@ +# get.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/get.o' + +# Name of the non-PIC object. +non_pic_object='get.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/get.o b/rubbos/app/httpd-2.0.64/srclib/pcre/get.o new file mode 100644 index 0000000000000000000000000000000000000000..ba278d440bcb98a77dc647658c8337fb0c5188bd GIT binary patch literal 11200 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/install-sh b/rubbos/app/httpd-2.0.64/srclib/pcre/install-sh new file mode 100755 index 00000000..e9de2384 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/install-sh @@ -0,0 +1,251 @@ +#!/bin/sh +# +# install - install a program, script, or datafile +# This comes from X11R5 (mit/util/scripts/install.sh). +# +# Copyright 1991 by the Massachusetts Institute of Technology +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of M.I.T. not be used in advertising or +# publicity pertaining to distribution of the software without specific, +# written prior permission. M.I.T. makes no representations about the +# suitability of this software for any purpose. It is provided "as is" +# without express or implied warranty. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# `make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. It can only install one file at a time, a restriction +# shared with many OS's install programs. + + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit="${DOITPROG-}" + + +# put in absolute paths if you don't have them in your path; or use env. vars. + +mvprog="${MVPROG-mv}" +cpprog="${CPPROG-cp}" +chmodprog="${CHMODPROG-chmod}" +chownprog="${CHOWNPROG-chown}" +chgrpprog="${CHGRPPROG-chgrp}" +stripprog="${STRIPPROG-strip}" +rmprog="${RMPROG-rm}" +mkdirprog="${MKDIRPROG-mkdir}" + +transformbasename="" +transform_arg="" +instcmd="$mvprog" +chmodcmd="$chmodprog 0755" +chowncmd="" +chgrpcmd="" +stripcmd="" +rmcmd="$rmprog -f" +mvcmd="$mvprog" +src="" +dst="" +dir_arg="" + +while [ x"$1" != x ]; do + case $1 in + -c) instcmd="$cpprog" + shift + continue;; + + -d) dir_arg=true + shift + continue;; + + -m) chmodcmd="$chmodprog $2" + shift + shift + continue;; + + -o) chowncmd="$chownprog $2" + shift + shift + continue;; + + -g) chgrpcmd="$chgrpprog $2" + shift + shift + continue;; + + -s) stripcmd="$stripprog" + shift + continue;; + + -t=*) transformarg=`echo $1 | sed 's/-t=//'` + shift + continue;; + + -b=*) transformbasename=`echo $1 | sed 's/-b=//'` + shift + continue;; + + *) if [ x"$src" = x ] + then + src=$1 + else + # this colon is to work around a 386BSD /bin/sh bug + : + dst=$1 + fi + shift + continue;; + esac +done + +if [ x"$src" = x ] +then + echo "install: no input file specified" + exit 1 +else + true +fi + +if [ x"$dir_arg" != x ]; then + dst=$src + src="" + + if [ -d $dst ]; then + instcmd=: + chmodcmd="" + else + instcmd=mkdir + fi +else + +# Waiting for this to be detected by the "$instcmd $src $dsttmp" command +# might cause directories to be created, which would be especially bad +# if $src (and thus $dsttmp) contains '*'. + + if [ -f $src -o -d $src ] + then + true + else + echo "install: $src does not exist" + exit 1 + fi + + if [ x"$dst" = x ] + then + echo "install: no destination specified" + exit 1 + else + true + fi + +# If destination is a directory, append the input filename; if your system +# does not like double slashes in filenames, you may need to add some logic + + if [ -d $dst ] + then + dst="$dst"/`basename $src` + else + true + fi +fi + +## this sed command emulates the dirname command +dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` + +# Make sure that the destination directory exists. +# this part is taken from Noah Friedman's mkinstalldirs script + +# Skip lots of stat calls in the usual case. +if [ ! -d "$dstdir" ]; then +defaultIFS=' +' +IFS="${IFS-${defaultIFS}}" + +oIFS="${IFS}" +# Some sh's can't handle IFS=/ for some reason. +IFS='%' +set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` +IFS="${oIFS}" + +pathcomp='' + +while [ $# -ne 0 ] ; do + pathcomp="${pathcomp}${1}" + shift + + if [ ! -d "${pathcomp}" ] ; + then + $mkdirprog "${pathcomp}" + else + true + fi + + pathcomp="${pathcomp}/" +done +fi + +if [ x"$dir_arg" != x ] +then + $doit $instcmd $dst && + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi +else + +# If we're going to rename the final executable, determine the name now. + + if [ x"$transformarg" = x ] + then + dstfile=`basename $dst` + else + dstfile=`basename $dst $transformbasename | + sed $transformarg`$transformbasename + fi + +# don't allow the sed command to completely eliminate the filename + + if [ x"$dstfile" = x ] + then + dstfile=`basename $dst` + else + true + fi + +# Make a temp file name in the proper directory. + + dsttmp=$dstdir/#inst.$$# + +# Move or copy the file name to the temp name + + $doit $instcmd $src $dsttmp && + + trap "rm -f ${dsttmp}" 0 && + +# and set any options; do chmod last to preserve setuid bits + +# If any of these fail, we abort the whole thing. If we want to +# ignore errors from any of these, just make sure not to ignore +# errors from the above "$doit $instcmd $src $dsttmp" command. + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && + +# Now rename the file to the real destination. + + $doit $rmcmd -f $dstdir/$dstfile && + $doit $mvcmd $dsttmp $dstdir/$dstfile + +fi && + + +exit 0 diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/internal.h b/rubbos/app/httpd-2.0.64/srclib/pcre/internal.h new file mode 100644 index 00000000..0c8c1c9d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/internal.h @@ -0,0 +1,412 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + + +/* This is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. See +the file Tech.Notes for some information on the internals. + +Written by: Philip Hazel + + Copyright (c) 1997-2001 University of Cambridge + +----------------------------------------------------------------------------- +Permission is granted to anyone to use this software for any purpose on any +computer system, and to redistribute it freely, subject to the following +restrictions: + +1. This software is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +2. The origin of this software must not be misrepresented, either by + explicit claim or by omission. + +3. Altered versions must be plainly marked as such, and must not be + misrepresented as being the original software. + +4. If PCRE is embedded in any software that is released under the GNU + General Purpose Licence (GPL), then the terms of that licence shall + supersede any condition above with which it is incompatible. +----------------------------------------------------------------------------- +*/ + +/* This header contains definitions that are shared between the different +modules, but which are not relevant to the outside. */ + +/* Get the definitions provided by running "configure" */ + +#include "config.h" + +/* To cope with SunOS4 and other systems that lack memmove() but have bcopy(), +define a macro for memmove() if HAVE_MEMMOVE is false, provided that HAVE_BCOPY +is set. Otherwise, include an emulating function for those systems that have +neither (there some non-Unix environments where this is the case). This assumes +that all calls to memmove are moving strings upwards in store, which is the +case in PCRE. */ + +#if ! HAVE_MEMMOVE +#undef memmove /* some systems may have a macro */ +#if HAVE_BCOPY +#define memmove(a, b, c) bcopy(b, a, c) +#else +void * +pcre_memmove(unsigned char *dest, const unsigned char *src, size_t n) +{ +int i; +dest += n; +src += n; +for (i = 0; i < n; ++i) *(--dest) = *(--src); +} +#define memmove(a, b, c) pcre_memmove(a, b, c) +#endif +#endif + +/* Standard C headers plus the external interface definition */ + +#include +#include +#include +#include +#include +#include +#include "pcre.h" + +/* In case there is no definition of offsetof() provided - though any proper +Standard C system should have one. */ + +#ifndef offsetof +#define offsetof(p_type,field) ((size_t)&(((p_type *)0)->field)) +#endif + +/* These are the public options that can change during matching. */ + +#define PCRE_IMS (PCRE_CASELESS|PCRE_MULTILINE|PCRE_DOTALL) + +/* Private options flags start at the most significant end of the four bytes, +but skip the top bit so we can use ints for convenience without getting tangled +with negative values. The public options defined in pcre.h start at the least +significant end. Make sure they don't overlap, though now that we have expanded +to four bytes there is plenty of space. */ + +#define PCRE_FIRSTSET 0x40000000 /* first_char is set */ +#define PCRE_REQCHSET 0x20000000 /* req_char is set */ +#define PCRE_STARTLINE 0x10000000 /* start after \n for multiline */ +#define PCRE_INGROUP 0x08000000 /* compiling inside a group */ +#define PCRE_ICHANGED 0x04000000 /* i option changes within regex */ + +/* Options for the "extra" block produced by pcre_study(). */ + +#define PCRE_STUDY_MAPPED 0x01 /* a map of starting chars exists */ + +/* Masks for identifying the public options which are permitted at compile +time, run time or study time, respectively. */ + +#define PUBLIC_OPTIONS \ + (PCRE_CASELESS|PCRE_EXTENDED|PCRE_ANCHORED|PCRE_MULTILINE| \ + PCRE_DOTALL|PCRE_DOLLAR_ENDONLY|PCRE_EXTRA|PCRE_UNGREEDY|PCRE_UTF8) + +#define PUBLIC_EXEC_OPTIONS \ + (PCRE_ANCHORED|PCRE_NOTBOL|PCRE_NOTEOL|PCRE_NOTEMPTY) + +#define PUBLIC_STUDY_OPTIONS 0 /* None defined */ + +/* Magic number to provide a small check against being handed junk. */ + +#define MAGIC_NUMBER 0x50435245UL /* 'PCRE' */ + +/* Miscellaneous definitions */ + +typedef int BOOL; + +#define FALSE 0 +#define TRUE 1 + +/* Escape items that are just an encoding of a particular data value. Note that +ESC_N is defined as yet another macro, which is set in config.h to either \n +(the default) or \r (which some people want). */ + +#ifndef ESC_E +#define ESC_E 27 +#endif + +#ifndef ESC_F +#define ESC_F '\f' +#endif + +#ifndef ESC_N +#define ESC_N NEWLINE +#endif + +#ifndef ESC_R +#define ESC_R '\r' +#endif + +#ifndef ESC_T +#define ESC_T '\t' +#endif + +/* These are escaped items that aren't just an encoding of a particular data +value such as \n. They must have non-zero values, as check_escape() returns +their negation. Also, they must appear in the same order as in the opcode +definitions below, up to ESC_z. The final one must be ESC_REF as subsequent +values are used for \1, \2, \3, etc. There is a test in the code for an escape +greater than ESC_b and less than ESC_Z to detect the types that may be +repeated. If any new escapes are put in-between that don't consume a character, +that code will have to change. */ + +enum { ESC_A = 1, ESC_B, ESC_b, ESC_D, ESC_d, ESC_S, ESC_s, ESC_W, ESC_w, + ESC_Z, ESC_z, ESC_REF }; + +/* Opcode table: OP_BRA must be last, as all values >= it are used for brackets +that extract substrings. Starting from 1 (i.e. after OP_END), the values up to +OP_EOD must correspond in order to the list of escapes immediately above. */ + +enum { + OP_END, /* End of pattern */ + + /* Values corresponding to backslashed metacharacters */ + + OP_SOD, /* Start of data: \A */ + OP_NOT_WORD_BOUNDARY, /* \B */ + OP_WORD_BOUNDARY, /* \b */ + OP_NOT_DIGIT, /* \D */ + OP_DIGIT, /* \d */ + OP_NOT_WHITESPACE, /* \S */ + OP_WHITESPACE, /* \s */ + OP_NOT_WORDCHAR, /* \W */ + OP_WORDCHAR, /* \w */ + OP_EODN, /* End of data or \n at end of data: \Z. */ + OP_EOD, /* End of data: \z */ + + OP_OPT, /* Set runtime options */ + OP_CIRC, /* Start of line - varies with multiline switch */ + OP_DOLL, /* End of line - varies with multiline switch */ + OP_ANY, /* Match any character */ + OP_CHARS, /* Match string of characters */ + OP_NOT, /* Match anything but the following char */ + + OP_STAR, /* The maximizing and minimizing versions of */ + OP_MINSTAR, /* all these opcodes must come in pairs, with */ + OP_PLUS, /* the minimizing one second. */ + OP_MINPLUS, /* This first set applies to single characters */ + OP_QUERY, + OP_MINQUERY, + OP_UPTO, /* From 0 to n matches */ + OP_MINUPTO, + OP_EXACT, /* Exactly n matches */ + + OP_NOTSTAR, /* The maximizing and minimizing versions of */ + OP_NOTMINSTAR, /* all these opcodes must come in pairs, with */ + OP_NOTPLUS, /* the minimizing one second. */ + OP_NOTMINPLUS, /* This first set applies to "not" single characters */ + OP_NOTQUERY, + OP_NOTMINQUERY, + OP_NOTUPTO, /* From 0 to n matches */ + OP_NOTMINUPTO, + OP_NOTEXACT, /* Exactly n matches */ + + OP_TYPESTAR, /* The maximizing and minimizing versions of */ + OP_TYPEMINSTAR, /* all these opcodes must come in pairs, with */ + OP_TYPEPLUS, /* the minimizing one second. These codes must */ + OP_TYPEMINPLUS, /* be in exactly the same order as those above. */ + OP_TYPEQUERY, /* This set applies to character types such as \d */ + OP_TYPEMINQUERY, + OP_TYPEUPTO, /* From 0 to n matches */ + OP_TYPEMINUPTO, + OP_TYPEEXACT, /* Exactly n matches */ + + OP_CRSTAR, /* The maximizing and minimizing versions of */ + OP_CRMINSTAR, /* all these opcodes must come in pairs, with */ + OP_CRPLUS, /* the minimizing one second. These codes must */ + OP_CRMINPLUS, /* be in exactly the same order as those above. */ + OP_CRQUERY, /* These are for character classes and back refs */ + OP_CRMINQUERY, + OP_CRRANGE, /* These are different to the three seta above. */ + OP_CRMINRANGE, + + OP_CLASS, /* Match a character class */ + OP_REF, /* Match a back reference */ + OP_RECURSE, /* Match this pattern recursively */ + + OP_ALT, /* Start of alternation */ + OP_KET, /* End of group that doesn't have an unbounded repeat */ + OP_KETRMAX, /* These two must remain together and in this */ + OP_KETRMIN, /* order. They are for groups the repeat for ever. */ + + /* The assertions must come before ONCE and COND */ + + OP_ASSERT, /* Positive lookahead */ + OP_ASSERT_NOT, /* Negative lookahead */ + OP_ASSERTBACK, /* Positive lookbehind */ + OP_ASSERTBACK_NOT, /* Negative lookbehind */ + OP_REVERSE, /* Move pointer back - used in lookbehind assertions */ + + /* ONCE and COND must come after the assertions, with ONCE first, as there's + a test for >= ONCE for a subpattern that isn't an assertion. */ + + OP_ONCE, /* Once matched, don't back up into the subpattern */ + OP_COND, /* Conditional group */ + OP_CREF, /* Used to hold an extraction string number (cond ref) */ + + OP_BRAZERO, /* These two must remain together and in this */ + OP_BRAMINZERO, /* order. */ + + OP_BRANUMBER, /* Used for extracting brackets whose number is greater + than can fit into an opcode. */ + + OP_BRA /* This and greater values are used for brackets that + extract substrings up to a basic limit. After that, + use is made of OP_BRANUMBER. */ +}; + +/* The highest extraction number before we have to start using additional +bytes. (Originally PCRE didn't have support for extraction counts highter than +this number.) The value is limited by the number of opcodes left after OP_BRA, +i.e. 255 - OP_BRA. We actually set it a bit lower to leave room for additional +opcodes. */ + +#define EXTRACT_BASIC_MAX 150 + +/* The texts of compile-time error messages are defined as macros here so that +they can be accessed by the POSIX wrapper and converted into error codes. Yes, +I could have used error codes in the first place, but didn't feel like changing +just to accommodate the POSIX wrapper. */ + +#define ERR1 "\\ at end of pattern" +#define ERR2 "\\c at end of pattern" +#define ERR3 "unrecognized character follows \\" +#define ERR4 "numbers out of order in {} quantifier" +#define ERR5 "number too big in {} quantifier" +#define ERR6 "missing terminating ] for character class" +#define ERR7 "invalid escape sequence in character class" +#define ERR8 "range out of order in character class" +#define ERR9 "nothing to repeat" +#define ERR10 "operand of unlimited repeat could match the empty string" +#define ERR11 "internal error: unexpected repeat" +#define ERR12 "unrecognized character after (?" +#define ERR13 "unused error" +#define ERR14 "missing )" +#define ERR15 "back reference to non-existent subpattern" +#define ERR16 "erroffset passed as NULL" +#define ERR17 "unknown option bit(s) set" +#define ERR18 "missing ) after comment" +#define ERR19 "parentheses nested too deeply" +#define ERR20 "regular expression too large" +#define ERR21 "failed to get memory" +#define ERR22 "unmatched parentheses" +#define ERR23 "internal error: code overflow" +#define ERR24 "unrecognized character after (?<" +#define ERR25 "lookbehind assertion is not fixed length" +#define ERR26 "malformed number after (?(" +#define ERR27 "conditional group contains more than two branches" +#define ERR28 "assertion expected after (?(" +#define ERR29 "(?p must be followed by )" +#define ERR30 "unknown POSIX class name" +#define ERR31 "POSIX collating elements are not supported" +#define ERR32 "this version of PCRE is not compiled with PCRE_UTF8 support" +#define ERR33 "characters with values > 255 are not yet supported in classes" +#define ERR34 "character value in \\x{...} sequence is too large" +#define ERR35 "invalid condition (?(0)" + +/* All character handling must be done as unsigned characters. Otherwise there +are problems with top-bit-set characters and functions such as isspace(). +However, we leave the interface to the outside world as char *, because that +should make things easier for callers. We define a short type for unsigned char +to save lots of typing. I tried "uchar", but it causes problems on Digital +Unix, where it is defined in sys/types, so use "uschar" instead. */ + +typedef unsigned char uschar; + +/* The real format of the start of the pcre block; the actual code vector +runs on as long as necessary after the end. */ + +typedef struct real_pcre { + unsigned long int magic_number; + size_t size; + const unsigned char *tables; + unsigned long int options; + unsigned short int top_bracket; + unsigned short int top_backref; + uschar first_char; + uschar req_char; + uschar code[1]; +} real_pcre; + +/* The real format of the extra block returned by pcre_study(). */ + +typedef struct real_pcre_extra { + uschar options; + uschar start_bits[32]; +} real_pcre_extra; + + +/* Structure for passing "static" information around between the functions +doing the compiling, so that they are thread-safe. */ + +typedef struct compile_data { + const uschar *lcc; /* Points to lower casing table */ + const uschar *fcc; /* Points to case-flipping table */ + const uschar *cbits; /* Points to character type table */ + const uschar *ctypes; /* Points to table of type maps */ +} compile_data; + +/* Structure for passing "static" information around between the functions +doing the matching, so that they are thread-safe. */ + +typedef struct match_data { + int errorcode; /* As it says */ + int *offset_vector; /* Offset vector */ + int offset_end; /* One past the end */ + int offset_max; /* The maximum usable for return data */ + const uschar *lcc; /* Points to lower casing table */ + const uschar *ctypes; /* Points to table of type maps */ + BOOL offset_overflow; /* Set if too many extractions */ + BOOL notbol; /* NOTBOL flag */ + BOOL noteol; /* NOTEOL flag */ + BOOL utf8; /* UTF8 flag */ + BOOL endonly; /* Dollar not before final \n */ + BOOL notempty; /* Empty string match not wanted */ + const uschar *start_pattern; /* For use when recursing */ + const uschar *start_subject; /* Start of the subject string */ + const uschar *end_subject; /* End of the subject string */ + const uschar *start_match; /* Start of this match attempt */ + const uschar *end_match_ptr; /* Subject position at end match */ + int end_offset_top; /* Highwater mark at end of match */ +} match_data; + +/* Bit definitions for entries in the pcre_ctypes table. */ + +#define ctype_space 0x01 +#define ctype_letter 0x02 +#define ctype_digit 0x04 +#define ctype_xdigit 0x08 +#define ctype_word 0x10 /* alphameric or '_' */ +#define ctype_meta 0x80 /* regexp meta char or zero (end pattern) */ + +/* Offsets for the bitmap tables in pcre_cbits. Each table contains a set +of bits for a class map. Some classes are built by combining these tables. */ + +#define cbit_space 0 /* [:space:] or \s */ +#define cbit_xdigit 32 /* [:xdigit:] */ +#define cbit_digit 64 /* [:digit:] or \d */ +#define cbit_upper 96 /* [:upper:] */ +#define cbit_lower 128 /* [:lower:] */ +#define cbit_word 160 /* [:word:] or \w */ +#define cbit_graph 192 /* [:graph:] */ +#define cbit_print 224 /* [:print:] */ +#define cbit_punct 256 /* [:punct:] */ +#define cbit_cntrl 288 /* [:cntrl:] */ +#define cbit_length 320 /* Length of the cbits table */ + +/* Offsets of the various tables from the base tables pointer, and +total length. */ + +#define lcc_offset 0 +#define fcc_offset 256 +#define cbits_offset 512 +#define ctypes_offset (cbits_offset + cbit_length) +#define tables_length (ctypes_offset + 256) + +/* End of internal.h */ diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/libpcre.la b/rubbos/app/httpd-2.0.64/srclib/pcre/libpcre.la new file mode 100644 index 00000000..f8f17785 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/libpcre.la @@ -0,0 +1,35 @@ +# libpcre.la - a libtool library file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='' + +# Names of this library. +library_names='' + +# The name of the static archive. +old_library='libpcre.a' + +# Libraries that this one depends upon. +dependency_libs=' -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib' + +# Version information for libpcre. +current= +age= +revision= + +# Is this an already installed library? +installed=no + +# Should we warn about portability when linking against -modules? +shouldnotlink=no + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='' diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/ltconfig b/rubbos/app/httpd-2.0.64/srclib/pcre/ltconfig new file mode 100755 index 00000000..a01334f9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/ltconfig @@ -0,0 +1,3078 @@ +#! /bin/sh + +# ltconfig - Create a system-specific libtool. +# Copyright (C) 1996-1999 Free Software Foundation, Inc. +# Originally by Gordon Matzigkeit , 1996 +# +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# A lot of this script is taken from autoconf-2.10. + +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} +echo=echo +if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X$1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then + # Yippee, $echo works! + : +else + # Restart under the correct shell. + exec "$SHELL" "$0" --no-reexec ${1+"$@"} +fi + +if test "X$1" = X--fallback-echo; then + # used as fallback echo + shift + cat </dev/null`} + case X$UNAME in + *-DOS) PATH_SEPARATOR=';' ;; + *) PATH_SEPARATOR=':' ;; + esac +fi + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +if test "X${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi + +if test "X${echo_test_string+set}" != Xset; then + # find a string as large as possible, as long as the shell can cope with it + for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do + # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... + if (echo_test_string="`eval $cmd`") 2>/dev/null && + echo_test_string="`eval $cmd`" && + (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null; then + break + fi + done +fi + +if test "X`($echo '\t') 2>/dev/null`" != 'X\t' || + test "X`($echo "$echo_test_string") 2>/dev/null`" != X"$echo_test_string"; then + # The Solaris, AIX, and Digital Unix default echo programs unquote + # backslashes. This makes it impossible to quote backslashes using + # echo "$something" | sed 's/\\/\\\\/g' + # + # So, first we look for a working echo in the user's PATH. + + IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" + for dir in $PATH /usr/ucb; do + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + test "X`($dir/echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then + echo="$dir/echo" + break + fi + done + IFS="$save_ifs" + + if test "X$echo" = Xecho; then + # We didn't find a better echo, so look for alternatives. + if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && + test "X`(print -r "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then + # This shell has a builtin print -r that does the trick. + echo='print -r' + elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && + test "X$CONFIG_SHELL" != X/bin/ksh; then + # If we have ksh, try running ltconfig again with it. + ORIGINAL_CONFIG_SHELL="${CONFIG_SHELL-/bin/sh}" + export ORIGINAL_CONFIG_SHELL + CONFIG_SHELL=/bin/ksh + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" --no-reexec ${1+"$@"} + else + # Try using printf. + echo='printf "%s\n"' + if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + test "X`($echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then + # Cool, printf works + : + elif test "X`("$ORIGINAL_CONFIG_SHELL" "$0" --fallback-echo '\t') 2>/dev/null`" = 'X\t' && + test "X`("$ORIGINAL_CONFIG_SHELL" "$0" --fallback-echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then + CONFIG_SHELL="$ORIGINAL_CONFIG_SHELL" + export CONFIG_SHELL + SHELL="$CONFIG_SHELL" + export SHELL + echo="$CONFIG_SHELL $0 --fallback-echo" + elif test "X`("$CONFIG_SHELL" "$0" --fallback-echo '\t') 2>/dev/null`" = 'X\t' && + test "X`("$CONFIG_SHELL" "$0" --fallback-echo "$echo_test_string") 2>/dev/null`" = X"$echo_test_string"; then + echo="$CONFIG_SHELL $0 --fallback-echo" + else + # maybe with a smaller string... + prev=: + + for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do + if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null; then + break + fi + prev="$cmd" + done + + if test "$prev" != 'sed 50q "$0"'; then + echo_test_string=`eval $prev` + export echo_test_string + exec "${ORIGINAL_CONFIG_SHELL}" "$0" ${1+"$@"} + else + # Oops. We lost completely, so just stick with echo. + echo=echo + fi + fi + fi + fi +fi + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='sed -e s/^X//' +sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# The name of this program. +progname=`$echo "X$0" | $Xsed -e 's%^.*/%%'` + +# Constants: +PROGRAM=ltconfig +PACKAGE=libtool +VERSION=1.3.4 +TIMESTAMP=" (1.385.2.196 1999/12/07 21:47:57)" +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +rm="rm -f" + +help="Try \`$progname --help' for more information." + +# Global variables: +default_ofile=libtool +can_build_shared=yes +enable_shared=yes +# All known linkers require a `.a' archive for static linking (except M$VC, +# which needs '.lib'). +enable_static=yes +enable_fast_install=yes +enable_dlopen=unknown +enable_win32_dll=no +ltmain= +silent= +srcdir= +ac_config_guess= +ac_config_sub= +host= +nonopt= +ofile="$default_ofile" +verify_host=yes +with_gcc=no +with_gnu_ld=no +need_locks=yes +ac_ext=c +objext=o +libext=a +exeext= +cache_file= + +old_AR="$AR" +old_CC="$CC" +old_CFLAGS="$CFLAGS" +old_CPPFLAGS="$CPPFLAGS" +old_LDFLAGS="$LDFLAGS" +old_LD="$LD" +old_LN_S="$LN_S" +old_LIBS="$LIBS" +old_NM="$NM" +old_RANLIB="$RANLIB" +old_DLLTOOL="$DLLTOOL" +old_OBJDUMP="$OBJDUMP" +old_AS="$AS" + +# Parse the command line options. +args= +prev= +for option +do + case "$option" in + -*=*) optarg=`echo "$option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; + *) optarg= ;; + esac + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + eval "$prev=\$option" + prev= + continue + fi + + case "$option" in + --help) cat <&2 + echo "$help" 1>&2 + exit 1 + ;; + + *) + if test -z "$ltmain"; then + ltmain="$option" + elif test -z "$host"; then +# This generates an unnecessary warning for sparc-sun-solaris4.1.3_U1 +# if test -n "`echo $option| sed 's/[-a-z0-9.]//g'`"; then +# echo "$progname: warning \`$option' is not a valid host type" 1>&2 +# fi + host="$option" + else + echo "$progname: too many arguments" 1>&2 + echo "$help" 1>&2 + exit 1 + fi ;; + esac +done + +if test -z "$ltmain"; then + echo "$progname: you must specify a LTMAIN file" 1>&2 + echo "$help" 1>&2 + exit 1 +fi + +if test ! -f "$ltmain"; then + echo "$progname: \`$ltmain' does not exist" 1>&2 + echo "$help" 1>&2 + exit 1 +fi + +# Quote any args containing shell metacharacters. +ltconfig_args= +for arg +do + case "$arg" in + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) + ltconfig_args="$ltconfig_args '$arg'" ;; + *) ltconfig_args="$ltconfig_args $arg" ;; + esac +done + +# A relevant subset of AC_INIT. + +# File descriptor usage: +# 0 standard input +# 1 file creation +# 2 errors and warnings +# 3 some systems may open it to /dev/tty +# 4 used on the Kubota Titan +# 5 compiler messages saved in config.log +# 6 checking for... messages and results +if test "$silent" = yes; then + exec 6>/dev/null +else + exec 6>&1 +fi +exec 5>>./config.log + +# NLS nuisances. +# Only set LANG and LC_ALL to C if already set. +# These must not be set unconditionally because not all systems understand +# e.g. LANG=C (notably SCO). +if test "X${LC_ALL+set}" = Xset; then LC_ALL=C; export LC_ALL; fi +if test "X${LANG+set}" = Xset; then LANG=C; export LANG; fi + +if test -n "$cache_file" && test -r "$cache_file"; then + echo "loading cache $cache_file within ltconfig" + . $cache_file +fi + +if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then + # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. + if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then + ac_n= ac_c=' +' ac_t=' ' + else + ac_n=-n ac_c= ac_t= + fi +else + ac_n= ac_c='\c' ac_t= +fi + +if test -z "$srcdir"; then + # Assume the source directory is the same one as the path to LTMAIN. + srcdir=`$echo "X$ltmain" | $Xsed -e 's%/[^/]*$%%'` + test "$srcdir" = "$ltmain" && srcdir=. +fi + +trap "$rm conftest*; exit 1" 1 2 15 +if test "$verify_host" = yes; then + # Check for config.guess and config.sub. + ac_aux_dir= + for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do + if test -f $ac_dir/config.guess; then + ac_aux_dir=$ac_dir + break + fi + done + if test -z "$ac_aux_dir"; then + echo "$progname: cannot find config.guess in $srcdir $srcdir/.. $srcdir/../.." 1>&2 + echo "$help" 1>&2 + exit 1 + fi + ac_config_guess=$ac_aux_dir/config.guess + ac_config_sub=$ac_aux_dir/config.sub + + # Make sure we can run config.sub. + if $SHELL $ac_config_sub sun4 >/dev/null 2>&1; then : + else + echo "$progname: cannot run $ac_config_sub" 1>&2 + echo "$help" 1>&2 + exit 1 + fi + + echo $ac_n "checking host system type""... $ac_c" 1>&6 + + host_alias=$host + case "$host_alias" in + "") + if host_alias=`$SHELL $ac_config_guess`; then : + else + echo "$progname: cannot guess host type; you must specify one" 1>&2 + echo "$help" 1>&2 + exit 1 + fi ;; + esac + host=`$SHELL $ac_config_sub $host_alias` + echo "$ac_t$host" 1>&6 + + # Make sure the host verified. + test -z "$host" && exit 1 + +elif test -z "$host"; then + echo "$progname: you must specify a host type if you use \`--no-verify'" 1>&2 + echo "$help" 1>&2 + exit 1 +else + host_alias=$host +fi + +# Transform linux* to *-*-linux-gnu*, to support old configure scripts. +case "$host_os" in +linux-gnu*) ;; +linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'` +esac + +host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + +case "$host_os" in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR cru $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +# Set a sane default for `AR'. +test -z "$AR" && AR=ar + +# Set a sane default for `OBJDUMP'. +test -z "$OBJDUMP" && OBJDUMP=objdump + +# If RANLIB is not set, then run the test. +if test "${RANLIB+set}" != "set"; then + result=no + + echo $ac_n "checking for ranlib... $ac_c" 1>&6 + IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" + for dir in $PATH; do + test -z "$dir" && dir=. + if test -f $dir/ranlib || test -f $dir/ranlib$ac_exeext; then + RANLIB="ranlib" + result="ranlib" + break + fi + done + IFS="$save_ifs" + + echo "$ac_t$result" 1>&6 +fi + +if test -n "$RANLIB"; then + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" + old_postinstall_cmds="\$RANLIB \$oldlib~$old_postinstall_cmds" +fi + +# Set sane defaults for `DLLTOOL', `OBJDUMP', and `AS', used on cygwin. +test -z "$DLLTOOL" && DLLTOOL=dlltool +test -z "$OBJDUMP" && OBJDUMP=objdump +test -z "$AS" && AS=as + +# Check to see if we are using GCC. +if test "$with_gcc" != yes || test -z "$CC"; then + # If CC is not set, then try to find GCC or a usable CC. + if test -z "$CC"; then + echo $ac_n "checking for gcc... $ac_c" 1>&6 + IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" + for dir in $PATH; do + test -z "$dir" && dir=. + if test -f $dir/gcc || test -f $dir/gcc$ac_exeext; then + CC="gcc" + break + fi + done + IFS="$save_ifs" + + if test -n "$CC"; then + echo "$ac_t$CC" 1>&6 + else + echo "$ac_t"no 1>&6 + fi + fi + + # Not "gcc", so try "cc", rejecting "/usr/ucb/cc". + if test -z "$CC"; then + echo $ac_n "checking for cc... $ac_c" 1>&6 + IFS="${IFS= }"; save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" + cc_rejected=no + for dir in $PATH; do + test -z "$dir" && dir=. + if test -f $dir/cc || test -f $dir/cc$ac_exeext; then + if test "$dir/cc" = "/usr/ucb/cc"; then + cc_rejected=yes + continue + fi + CC="cc" + break + fi + done + IFS="$save_ifs" + if test $cc_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $CC + shift + if test $# -gt 0; then + # We chose a different compiler from the bogus one. + # However, it has the same name, so the bogon will be chosen + # first if we set CC to just the name; use the full file name. + shift + set dummy "$dir/cc" "$@" + shift + CC="$@" + fi + fi + + if test -n "$CC"; then + echo "$ac_t$CC" 1>&6 + else + echo "$ac_t"no 1>&6 + fi + + if test -z "$CC"; then + echo "$progname: error: no acceptable cc found in \$PATH" 1>&2 + exit 1 + fi + fi + + # Now see if the compiler is really GCC. + with_gcc=no + echo $ac_n "checking whether we are using GNU C... $ac_c" 1>&6 + echo "$progname:581: checking whether we are using GNU C" >&5 + + $rm conftest.c + cat > conftest.c <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then + with_gcc=yes + fi + $rm conftest.c + echo "$ac_t$with_gcc" 1>&6 +fi + +# Allow CC to be a program name with arguments. +set dummy $CC +compiler="$2" + +echo $ac_n "checking for object suffix... $ac_c" 1>&6 +$rm conftest* +echo 'int i = 1;' > conftest.c +echo "$progname:603: checking for object suffix" >& 5 +if { (eval echo $progname:604: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; }; then + # Append any warnings to the config.log. + cat conftest.err 1>&5 + + for ac_file in conftest.*; do + case $ac_file in + *.c) ;; + *) objext=`echo $ac_file | sed -e s/conftest.//` ;; + esac + done +else + cat conftest.err 1>&5 + echo "$progname: failed program was:" >&5 + cat conftest.c >&5 +fi +$rm conftest* +echo "$ac_t$objext" 1>&6 + +echo $ac_n "checking for executable suffix... $ac_c" 1>&6 +if eval "test \"`echo '$''{'ac_cv_exeext'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_cv_exeext="no" + $rm conftest* + echo 'main () { return 0; }' > conftest.c + echo "$progname:629: checking for executable suffix" >& 5 + if { (eval echo $progname:630: \"$ac_link\") 1>&5; (eval $ac_link) 2>conftest.err; }; then + # Append any warnings to the config.log. + cat conftest.err 1>&5 + + for ac_file in conftest.*; do + case $ac_file in + *.c | *.err | *.$objext ) ;; + *) ac_cv_exeext=.`echo $ac_file | sed -e s/conftest.//` ;; + esac + done + else + cat conftest.err 1>&5 + echo "$progname: failed program was:" >&5 + cat conftest.c >&5 + fi + $rm conftest* +fi +if test "X$ac_cv_exeext" = Xno; then + exeext="" +else + exeext="$ac_cv_exeext" +fi +echo "$ac_t$ac_cv_exeext" 1>&6 + +echo $ac_n "checking for $compiler option to produce PIC... $ac_c" 1>&6 +pic_flag= +special_shlib_compile_flags= +wl= +link_static_flag= +no_builtin_flag= + +if test "$with_gcc" = yes; then + wl='-Wl,' + link_static_flag='-static' + + case "$host_os" in + beos* | irix5* | irix6* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + aix*) + # Below there is a dirty hack to force normal static linking with -ldl + # The problem is because libdl dynamically linked with both libc and + # libC (AIX C++ library), which obviously doesn't included in libraries + # list by gcc. This cause undefined symbols with -static flags. + # This hack allows C programs to be linked with "-static -ldl", but + # we not sure about C++ programs. + link_static_flag="$link_static_flag ${wl}-lC" + ;; + cygwin* | mingw* | os2*) + # We can build DLLs from non-PIC. + ;; + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + pic_flag='-m68020 -resident32 -malways-restore-a4' + ;; + sysv4*MP*) + if test -d /usr/nec; then + pic_flag=-Kconform_pic + fi + ;; + *) + pic_flag='-fPIC' + ;; + esac +else + # PORTME Check for PIC flags for the system compiler. + case "$host_os" in + aix3* | aix4*) + # All AIX code is PIC. + link_static_flag='-bnso -bI:/lib/syscalls.exp' + ;; + + hpux9* | hpux10* | hpux11*) + # Is there a better link_static_flag that works with the bundled CC? + wl='-Wl,' + link_static_flag="${wl}-a ${wl}archive" + pic_flag='+Z' + ;; + + irix5* | irix6*) + wl='-Wl,' + link_static_flag='-non_shared' + # PIC (with -KPIC) is the default. + ;; + + cygwin* | mingw* | os2*) + # We can build DLLs from non-PIC. + ;; + + osf3* | osf4* | osf5*) + # All OSF/1 code is PIC. + wl='-Wl,' + link_static_flag='-non_shared' + ;; + + sco3.2v5*) + pic_flag='-Kpic' + link_static_flag='-dn' + special_shlib_compile_flags='-belf' + ;; + + solaris*) + pic_flag='-KPIC' + link_static_flag='-Bstatic' + wl='-Wl,' + ;; + + sunos4*) + pic_flag='-PIC' + link_static_flag='-Bstatic' + wl='-Qoption ld ' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + pic_flag='-KPIC' + link_static_flag='-Bstatic' + wl='-Wl,' + ;; + + uts4*) + pic_flag='-pic' + link_static_flag='-Bstatic' + ;; + sysv4*MP*) + if test -d /usr/nec ;then + pic_flag='-Kconform_pic' + link_static_flag='-Bstatic' + fi + ;; + *) + can_build_shared=no + ;; + esac +fi + +if test -n "$pic_flag"; then + echo "$ac_t$pic_flag" 1>&6 + + # Check to make sure the pic_flag actually works. + echo $ac_n "checking if $compiler PIC flag $pic_flag works... $ac_c" 1>&6 + $rm conftest* + echo "int some_variable = 0;" > conftest.c + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $pic_flag -DPIC" + echo "$progname:776: checking if $compiler PIC flag $pic_flag works" >&5 + if { (eval echo $progname:777: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.$objext; then + # Append any warnings to the config.log. + cat conftest.err 1>&5 + + case "$host_os" in + hpux9* | hpux10* | hpux11*) + # On HP-UX, both CC and GCC only warn that PIC is supported... then they + # create non-PIC objects. So, if there were any warnings, we assume that + # PIC is not supported. + if test -s conftest.err; then + echo "$ac_t"no 1>&6 + can_build_shared=no + pic_flag= + else + echo "$ac_t"yes 1>&6 + pic_flag=" $pic_flag" + fi + ;; + *) + echo "$ac_t"yes 1>&6 + pic_flag=" $pic_flag" + ;; + esac + else + # Append any errors to the config.log. + cat conftest.err 1>&5 + can_build_shared=no + pic_flag= + echo "$ac_t"no 1>&6 + fi + CFLAGS="$save_CFLAGS" + $rm conftest* +else + echo "$ac_t"none 1>&6 +fi + +# Check to see if options -o and -c are simultaneously supported by compiler +echo $ac_n "checking if $compiler supports -c -o file.o... $ac_c" 1>&6 +$rm -r conftest 2>/dev/null +mkdir conftest +cd conftest +$rm conftest* +echo "int some_variable = 0;" > conftest.c +mkdir out +# According to Tom Tromey, Ian Lance Taylor reported there are C compilers +# that will create temporary files in the current directory regardless of +# the output directory. Thus, making CWD read-only will cause this test +# to fail, enabling locking or at least warning the user not to do parallel +# builds. +chmod -w . +save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS -o out/conftest2.o" +echo "$progname:829: checking if $compiler supports -c -o file.o" >&5 +if { (eval echo $progname:830: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>out/conftest.err; } && test -s out/conftest2.o; then + + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s out/conftest.err; then + echo "$ac_t"no 1>&6 + compiler_c_o=no + else + echo "$ac_t"yes 1>&6 + compiler_c_o=yes + fi +else + # Append any errors to the config.log. + cat out/conftest.err 1>&5 + compiler_c_o=no + echo "$ac_t"no 1>&6 +fi +CFLAGS="$save_CFLAGS" +chmod u+w . +$rm conftest* out/* +rmdir out +cd .. +rmdir conftest +$rm -r conftest 2>/dev/null + +if test x"$compiler_c_o" = x"yes"; then + # Check to see if we can write to a .lo + echo $ac_n "checking if $compiler supports -c -o file.lo... $ac_c" 1>&6 + $rm conftest* + echo "int some_variable = 0;" > conftest.c + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -c -o conftest.lo" + echo "$progname:862: checking if $compiler supports -c -o file.lo" >&5 +if { (eval echo $progname:863: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.lo; then + + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + echo "$ac_t"no 1>&6 + compiler_o_lo=no + else + echo "$ac_t"yes 1>&6 + compiler_o_lo=yes + fi + else + # Append any errors to the config.log. + cat conftest.err 1>&5 + compiler_o_lo=no + echo "$ac_t"no 1>&6 + fi + CFLAGS="$save_CFLAGS" + $rm conftest* +else + compiler_o_lo=no +fi + +# Check to see if we can do hard links to lock some files if needed +hard_links="nottested" +if test "$compiler_c_o" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + echo $ac_n "checking if we can lock with hard links... $ac_c" 1>&6 + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + echo "$ac_t$hard_links" 1>&6 + $rm conftest* + if test "$hard_links" = no; then + echo "*** WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2 + need_locks=warn + fi +else + need_locks=no +fi + +if test "$with_gcc" = yes; then + # Check to see if options -fno-rtti -fno-exceptions are supported by compiler + echo $ac_n "checking if $compiler supports -fno-rtti -fno-exceptions ... $ac_c" 1>&6 + $rm conftest* + echo "int some_variable = 0;" > conftest.c + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -fno-rtti -fno-exceptions -c conftest.c" + echo "$progname:914: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 + if { (eval echo $progname:915: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>conftest.err; } && test -s conftest.o; then + + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + echo "$ac_t"no 1>&6 + compiler_rtti_exceptions=no + else + echo "$ac_t"yes 1>&6 + compiler_rtti_exceptions=yes + fi + else + # Append any errors to the config.log. + cat conftest.err 1>&5 + compiler_rtti_exceptions=no + echo "$ac_t"no 1>&6 + fi + CFLAGS="$save_CFLAGS" + $rm conftest* + + if test "$compiler_rtti_exceptions" = "yes"; then + no_builtin_flag=' -fno-builtin -fno-rtti -fno-exceptions' + else + no_builtin_flag=' -fno-builtin' + fi + +fi + +# Check for any special shared library compilation flags. +if test -n "$special_shlib_compile_flags"; then + echo "$progname: warning: \`$CC' requires \`$special_shlib_compile_flags' to build shared libraries" 1>&2 + if echo "$old_CC $old_CFLAGS " | egrep -e "[ ]$special_shlib_compile_flags[ ]" >/dev/null; then : + else + echo "$progname: add \`$special_shlib_compile_flags' to the CC or CFLAGS env variable and reconfigure" 1>&2 + can_build_shared=no + fi +fi + +echo $ac_n "checking if $compiler static flag $link_static_flag works... $ac_c" 1>&6 +$rm conftest* +echo 'main(){return(0);}' > conftest.c +save_LDFLAGS="$LDFLAGS" +LDFLAGS="$LDFLAGS $link_static_flag" +echo "$progname:958: checking if $compiler static flag $link_static_flag works" >&5 +if { (eval echo $progname:959: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then + echo "$ac_t$link_static_flag" 1>&6 +else + echo "$ac_t"none 1>&6 + link_static_flag= +fi +LDFLAGS="$save_LDFLAGS" +$rm conftest* + +if test -z "$LN_S"; then + # Check to see if we can use ln -s, or we need hard links. + echo $ac_n "checking whether ln -s works... $ac_c" 1>&6 + $rm conftest.dat + if ln -s X conftest.dat 2>/dev/null; then + $rm conftest.dat + LN_S="ln -s" + else + LN_S=ln + fi + if test "$LN_S" = "ln -s"; then + echo "$ac_t"yes 1>&6 + else + echo "$ac_t"no 1>&6 + fi +fi + +# Make sure LD is an absolute path. +if test -z "$LD"; then + ac_prog=ld + if test "$with_gcc" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + echo $ac_n "checking for ld used by GCC... $ac_c" 1>&6 + echo "$progname:991: checking for ld used by GCC" >&5 + ac_prog=`($CC -print-prog-name=ld) 2>&5` + case "$ac_prog" in + # Accept absolute paths. + [\\/]* | [A-Za-z]:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the path of ld + ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we are not using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac + elif test "$with_gnu_ld" = yes; then + echo $ac_n "checking for GNU ld... $ac_c" 1>&6 + echo "$progname:1015: checking for GNU ld" >&5 + else + echo $ac_n "checking for non-GNU ld""... $ac_c" 1>&6 + echo "$progname:1018: checking for non-GNU ld" >&5 + fi + + if test -z "$LD"; then + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + if "$LD" -v 2>&1 < /dev/null | egrep '(GNU|with BFD)' > /dev/null; then + test "$with_gnu_ld" != no && break + else + test "$with_gnu_ld" != yes && break + fi + fi + done + IFS="$ac_save_ifs" + fi + + if test -n "$LD"; then + echo "$ac_t$LD" 1>&6 + else + echo "$ac_t"no 1>&6 + fi + + if test -z "$LD"; then + echo "$progname: error: no acceptable ld found in \$PATH" 1>&2 + exit 1 + fi +fi + +# Check to see if it really is or is not GNU ld. +echo $ac_n "checking if the linker ($LD) is GNU ld... $ac_c" 1>&6 +# I'd rather use --version here, but apparently some GNU ld's only accept -v. +if $LD -v 2>&1 &5; then + with_gnu_ld=yes +else + with_gnu_ld=no +fi +echo "$ac_t$with_gnu_ld" 1>&6 + +# See if the linker supports building shared libraries. +echo $ac_n "checking whether the linker ($LD) supports shared libraries... $ac_c" 1>&6 + +allow_undefined_flag= +no_undefined_flag= +need_lib_prefix=unknown +need_version=unknown +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +archive_cmds= +archive_expsym_cmds= +old_archive_from_new_cmds= +export_dynamic_flag_spec= +whole_archive_flag_spec= +thread_safe_flag_spec= +hardcode_libdir_flag_spec= +hardcode_libdir_separator= +hardcode_direct=no +hardcode_minus_L=no +hardcode_shlibpath_var=unsupported +runpath_var= +always_export_symbols=no +export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | sed '\''s/.* //'\'' | sort | uniq > $export_symbols' +# include_expsyms should be a list of space-separated symbols to be *always* +# included in the symbol list +include_expsyms= +# exclude_expsyms can be an egrep regular expression of symbols to exclude +# it will be wrapped by ` (' and `)$', so one must not match beginning or +# end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', +# as well as any symbol that contains `d'. +exclude_expsyms="_GLOBAL_OFFSET_TABLE_" +# Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out +# platforms (ab)use it in PIC code, but their linkers get confused if +# the symbol is explicitly referenced. Since portable code cannot +# rely on this symbol name, it's probably fine to never include it in +# preloaded symbol tables. + +case "$host_os" in +cygwin* | mingw*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$with_gcc" != yes; then + with_gnu_ld=no + fi + ;; + +esac + +ld_shlibs=yes +if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # See if GNU ld supports shared libraries. + case "$host_os" in + aix3* | aix4*) + # On AIX, the GNU linker is very broken + ld_shlibs=no + cat <&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + ;; + + amigaos*) + archive_cmds='$rm $objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $objdir/a2ixlibrary.data~$AR cru $lib $libobjs~$RANLIB $lib~(cd $objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can use + # them. + ld_shlibs=no + ;; + + beos*) + if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + + cygwin* | mingw*) + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + allow_undefined_flag=unsupported + always_export_symbols=yes + + # Extract the symbol export list from an `--export-all' def file, + # then regenerate the def file from the symbol export list, so that + # the compiled dll only exports the symbol export list. + export_symbols_cmds='test -f $objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < $0 > $objdir/$soname-ltdll.c~ + test -f $objdir/$soname-ltdll.$objext || (cd $objdir && $CC -c $soname-ltdll.c)~ + $DLLTOOL --export-all --exclude-symbols DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --output-def $objdir/$soname-def $objdir/$soname-ltdll.$objext $libobjs $convenience~ + sed -e "1,/EXPORTS/d" -e "s/ @ [0-9]* ; *//" < $objdir/$soname-def > $export_symbols' + + archive_expsym_cmds='echo EXPORTS > $objdir/$soname-def~ + _lt_hint=1; + for symbol in `cat $export_symbols`; do + echo " \$symbol @ \$_lt_hint ; " >> $objdir/$soname-def; + _lt_hint=`expr 1 + \$_lt_hint`; + done~ + test -f $objdir/$soname-ltdll.c || sed -e "/^# \/\* ltdll\.c starts here \*\//,/^# \/\* ltdll.c ends here \*\// { s/^# //; p; }" -e d < $0 > $objdir/$soname-ltdll.c~ + test -f $objdir/$soname-ltdll.$objext || (cd $objdir && $CC -c $soname-ltdll.c)~ + $CC -Wl,--base-file,$objdir/$soname-base -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o $lib $objdir/$soname-ltdll.$objext $libobjs $deplibs $linkopts~ + $DLLTOOL --as=$AS --dllname $soname --exclude-symbols DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --def $objdir/$soname-def --base-file $objdir/$soname-base --output-exp $objdir/$soname-exp~ + $CC -Wl,--base-file,$objdir/$soname-base $objdir/$soname-exp -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o $lib $objdir/$soname-ltdll.$objext $libobjs $deplibs $linkopts~ + $DLLTOOL --as=$AS --dllname $soname --exclude-symbols DllMain@12,_cygwin_dll_entry@12,_cygwin_noncygwin_dll_entry@12 --def $objdir/$soname-def --base-file $objdir/$soname-base --output-exp $objdir/$soname-exp~ + $CC $objdir/$soname-exp -Wl,--dll -nostartfiles -Wl,-e,__cygwin_dll_entry@12 -o $lib $objdir/$soname-ltdll.$objext $libobjs $deplibs $linkopts' + + old_archive_from_new_cmds='$DLLTOOL --as=$AS --dllname $soname --def $objdir/$soname-def --output-lib $objdir/$libname.a' + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + archive_cmds='$LD -Bshareable $libobjs $deplibs $linkopts -o $lib' + # can we support soname and/or expsyms with a.out? -oliva + fi + ;; + + solaris* | sysv5*) + if $LD -v 2>&1 | egrep 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linkopts' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + *) + if $LD --help 2>&1 | egrep ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test "$ld_shlibs" = yes; then + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec='${wl}--export-dynamic' + case $host_os in + cygwin* | mingw*) + # dlltool doesn't understand --whole-archive et. al. + whole_archive_flag_spec= + ;; + *) + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | egrep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec= + fi + ;; + esac + fi +else + # PORTME fill in a description of your system's linker (not GNU ld) + case "$host_os" in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $objdir/$soname $libobjs $deplibs $linkopts -bE:$export_symbols -T512 -H512 -bM:SRE~$AR cru $lib $objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$with_gcc" = yes && test -z "$link_static_flag"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix4*) + hardcode_libdir_flag_spec='${wl}-b ${wl}nolibpath ${wl}-b ${wl}libpath:$libdir:/usr/lib:/lib' + hardcode_libdir_separator=':' + if test "$with_gcc" = yes; then + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + hardcode_direct=yes + else + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + shared_flag='-shared' + else + shared_flag='${wl}-bM:SRE' + hardcode_direct=yes + fi + allow_undefined_flag=' ${wl}-berok' + archive_cmds="\$CC $shared_flag"' -o $objdir/$soname $libobjs $deplibs $linkopts ${wl}-bexpall ${wl}-bnoentry${allow_undefined_flag}' + archive_expsym_cmds="\$CC $shared_flag"' -o $objdir/$soname $libobjs $deplibs $linkopts ${wl}-bE:$export_symbols ${wl}-bnoentry${allow_undefined_flag}' + case "$host_os" in aix4.[01]|aix4.[01].*) + # According to Greg Wooledge, -bexpall is only supported from AIX 4.2 on + always_export_symbols=yes ;; + esac + ;; + + amigaos*) + archive_cmds='$rm $objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $objdir/a2ixlibrary.data~$AR cru $lib $libobjs~$RANLIB $lib~(cd $objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + # see comment about different semantics on the GNU ld section + ld_shlibs=no + ;; + + cygwin* | mingw*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $linkopts `echo "$deplibs" | sed -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_from_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib /OUT:$oldlib$oldobjs' + fix_srcfile_path='`cygpath -w $srcfile`' + ;; + + freebsd1*) + ld_shlibs=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd*) + archive_cmds='$CC -shared -o $lib $libobjs $deplibs $linkopts' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9* | hpux10* | hpux11*) + case "$host_os" in + hpux9*) archive_cmds='$rm $objdir/$soname~$LD -b +b $install_libdir -o $objdir/$soname $libobjs $deplibs $linkopts~test $objdir/$soname = $lib || mv $objdir/$soname $lib' ;; + *) archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linkopts' ;; + esac + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + hardcode_minus_L=yes # Not in the search PATH, but as the default + # location of the library. + export_dynamic_flag_spec='${wl}-E' + ;; + + irix5* | irix6*) + if test "$with_gcc" = yes; then + archive_cmds='$CC -shared $libobjs $deplibs $linkopts ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + else + archive_cmds='$LD -shared $libobjs $deplibs $linkopts -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + fi + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linkopts' # ELF + fi + hardcode_libdir_flag_spec='${wl}-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + openbsd*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linkopts' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $objdir/$libname.def~$echo DATA >> $objdir/$libname.def~$echo " SINGLE NONSHARED" >> $objdir/$libname.def~$echo EXPORTS >> $objdir/$libname.def~emxexp $libobjs >> $objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $linkopts $objdir/$libname.def' + old_archive_from_new_cmds='emximp -o $objdir/$libname.a $objdir/$libname.def' + ;; + + osf3*) + if test "$with_gcc" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $linkopts ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linkopts -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + fi + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + + osf4* | osf5*) # As osf3* with the addition of the -msym flag + if test "$with_gcc" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $linkopts ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${objdir}/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linkopts -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${objdir}/so_locations -o $lib' + fi + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + + sco3.2v5*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ;; + + solaris*) + no_undefined_flag=' -z text' + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linkopts' + archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linkopts~$rm $lib.exp' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case "$host_os" in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' ;; + esac + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linkopts' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' + ;; + + sysv5*) + no_undefined_flag=' -z text' + # $CC -shared without GNU ld will not create a library from C++ + # object files and a static libstdc++, better avoid it by now + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linkopts' + archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linkopts~$rm $lib.exp' + hardcode_libdir_flag_spec= + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi + ;; + + sysv4.2uw2*) + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linkopts' + hardcode_direct=yes + hardcode_minus_L=no + hardcode_shlibpath_var=no + hardcode_runpath_var=yes + runpath_var=LD_RUN_PATH + ;; + + unixware7*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linkopts' + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; + esac +fi +echo "$ac_t$ld_shlibs" 1>&6 +test "$ld_shlibs" = no && can_build_shared=no + +if test -z "$NM"; then + echo $ac_n "checking for BSD-compatible nm... $ac_c" 1>&6 + case "$NM" in + [\\/]* | [A-Za-z]:[\\/]*) ;; # Let the user override the test with a path. + *) + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR}" + for ac_dir in $PATH /usr/ucb /usr/ccs/bin /bin; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/nm || test -f $ac_dir/nm$ac_exeext; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + if ($ac_dir/nm -B /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then + NM="$ac_dir/nm -B" + break + elif ($ac_dir/nm -p /dev/null 2>&1 | sed '1q'; exit 0) | egrep /dev/null >/dev/null; then + NM="$ac_dir/nm -p" + break + else + NM=${NM="$ac_dir/nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + fi + fi + done + IFS="$ac_save_ifs" + test -z "$NM" && NM=nm + ;; + esac + echo "$ac_t$NM" 1>&6 +fi + +# Check for command to grab the raw symbol name followed by C symbol from nm. +echo $ac_n "checking command to parse $NM output... $ac_c" 1>&6 + +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[BCDEGRST]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([_A-Za-z][_A-Za-z0-9]*\)' + +# Transform the above into a raw symbol and a C symbol. +symxfrm='\1 \2\3 \3' + +# Transform an extracted symbol line into a proper C declaration +global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern char \1;/p'" + +# Define system-specific variables. +case "$host_os" in +aix*) + symcode='[BCDT]' + ;; +cygwin* | mingw*) + symcode='[ABCDGISTW]' + ;; +hpux*) # Its linker distinguishes data from code symbols + global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern char \1();/p' -e 's/^. .* \(.*\)$/extern char \1;/p'" + ;; +irix*) + symcode='[BCDEGRST]' + ;; +solaris*) + symcode='[BDT]' + ;; +sysv4) + symcode='[DFNSTU]' + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +if $NM -V 2>&1 | egrep '(GNU|with BFD)' > /dev/null; then + symcode='[ABCDGISTW]' +fi + +# Try without a prefix undercore, then with it. +for ac_symprfx in "" "_"; do + + # Write the raw and C identifiers. + global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode\)[ ][ ]*\($ac_symprfx\)$sympat$/$symxfrm/p'" + + # Check to see that the pipe works correctly. + pipe_works=no + $rm conftest* + cat > conftest.c <&5 + if { (eval echo $progname:1636: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; } && test -s conftest.$objext; then + # Now try to grab the symbols. + nlist=conftest.nm + if { echo "$progname:1639: eval \"$NM conftest.$objext | $global_symbol_pipe > $nlist\"" >&5; eval "$NM conftest.$objext | $global_symbol_pipe > $nlist 2>&5"; } && test -s "$nlist"; then + + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if egrep ' nm_test_var$' "$nlist" >/dev/null; then + if egrep ' nm_test_func$' "$nlist" >/dev/null; then + cat < conftest.c +#ifdef __cplusplus +extern "C" { +#endif + +EOF + # Now generate the symbol file. + eval "$global_symbol_to_cdecl"' < "$nlist" >> conftest.c' + + cat <> conftest.c +#if defined (__STDC__) && __STDC__ +# define lt_ptr_t void * +#else +# define lt_ptr_t char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + lt_ptr_t address; +} +lt_preloaded_symbols[] = +{ +EOF + sed 's/^. \(.*\) \(.*\)$/ {"\2", (lt_ptr_t) \&\2},/' < "$nlist" >> conftest.c + cat <<\EOF >> conftest.c + {0, (lt_ptr_t) 0} +}; + +#ifdef __cplusplus +} +#endif +EOF + # Now try linking the two files. + mv conftest.$objext conftstm.$objext + save_LIBS="$LIBS" + save_CFLAGS="$CFLAGS" + LIBS="conftstm.$objext" + CFLAGS="$CFLAGS$no_builtin_flag" + if { (eval echo $progname:1691: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then + pipe_works=yes + else + echo "$progname: failed program was:" >&5 + cat conftest.c >&5 + fi + LIBS="$save_LIBS" + else + echo "cannot find nm_test_func in $nlist" >&5 + fi + else + echo "cannot find nm_test_var in $nlist" >&5 + fi + else + echo "cannot run $global_symbol_pipe" >&5 + fi + else + echo "$progname: failed program was:" >&5 + cat conftest.c >&5 + fi + $rm conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + global_symbol_pipe= + fi +done +if test "$pipe_works" = yes; then + echo "${ac_t}ok" 1>&6 +else + echo "${ac_t}failed" 1>&6 +fi + +if test -z "$global_symbol_pipe"; then + global_symbol_to_cdecl= +fi + +# Check hardcoding attributes. +echo $ac_n "checking how to hardcode library paths into programs... $ac_c" 1>&6 +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || \ + test -n "$runpath_var"; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$hardcode_shlibpath_var" != no && + test "$hardcode_minus_L" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action=unsupported +fi +echo "$ac_t$hardcode_action" 1>&6 + + +reload_flag= +reload_cmds='$LD$reload_flag -o $output$reload_objs' +echo $ac_n "checking for $LD option to reload object files... $ac_c" 1>&6 +# PORTME Some linkers may need a different reload flag. +reload_flag='-r' +echo "$ac_t$reload_flag" 1>&6 +test -n "$reload_flag" && reload_flag=" $reload_flag" + +# PORTME Fill in your ld.so characteristics +library_names_spec= +libname_spec='lib$name' +soname_spec= +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +file_magic_cmd= +file_magic_test_file= +deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# `unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [regex]' -- check by looking for files in library path +# which responds to the $file_magic_cmd with a given egrep regex. +# If you have `file' or equivalent on your system and you're not sure +# whether `pass_all' will *always* work, you probably want this one. +echo $ac_n "checking dynamic linker characteristics... $ac_c" 1>&6 +case "$host_os" in +aix3*) + version_type=linux + library_names_spec='${libname}${release}.so$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}.so$major' + ;; + +aix4*) + version_type=linux + # AIX has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + # We preserve .a as extension for shared libraries though AIX4.2 + # and later linker supports .so + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.a' + shlibpath_var=LIBPATH + deplibs_check_method=pass_all + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "(cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a)"; (cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a) || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}.so' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + deplibs_check_method=pass_all + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + +bsdi4*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' + file_magic_cmd=/usr/bin/file + file_magic_test_file=/shlib/libc.so + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + export_dynamic_flag_spec=-rdynamic + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw*) + version_type=windows + need_version=no + need_lib_prefix=no + if test "$with_gcc" = yes; then + library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll $libname.a' + else + library_names_spec='${libname}`echo ${release} | sed -e 's/[.]/-/g'`${versuffix}.dll $libname.lib' + fi + dynamic_linker='Win32 ld.exe' + deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + file_magic_cmd='${OBJDUMP} -f' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd*) + objformat=`test -x /usr/bin/objformat && /usr/bin/objformat || echo aout` + version_type=freebsd-$objformat + case "$version_type" in + freebsd-elf*) + deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB shared object' + file_magic_cmd=/usr/bin/file + file_magic_test_file=`echo /usr/lib/libc.so*` + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + deplibs_check_method=unknown + library_names_spec='${libname}${release}.so$versuffix $libname.so$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case "$host_os" in + freebsd2* | freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + ;; + *) # from 3.2 on + shlibpath_overrides_runpath=no + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so${major} ${libname}.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + dynamic_linker="$host_os dld.sl" + version_type=sunos + need_lib_prefix=no + need_version=no + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}.sl$versuffix ${libname}${release}.sl$major $libname.sl' + soname_spec='${libname}${release}.sl$major' + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +irix5* | irix6*) + version_type=irix + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}.so.$major' + library_names_spec='${libname}${release}.so.$versuffix ${libname}${release}.so.$major ${libname}${release}.so $libname.so' + case "$host_os" in + irix5*) + libsuff= shlibsuff= + # this will be overridden with pass_all, but let us keep it just in case + deplibs_check_method="file_magic ELF 32-bit MSB dynamic lib MIPS - version 1" + ;; + *) + case "$LD" in # libtool.m4 will add one of these switches to LD + *-32|*"-32 ") libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 ") libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 ") libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + file_magic_cmd=/usr/bin/file + file_magic_test_file=`echo /lib${libsuff}/libc.so*` + deplibs_check_method='pass_all' + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux-gnuoldld* | linux-gnuaout* | linux-gnucoff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux-gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' + file_magic_cmd=/usr/bin/file + file_magic_test_file=`echo /lib/libc.so* /lib/libc-*.so` + + if test -f /lib/ld.so.1; then + dynamic_linker='GNU ld.so' + else + # Only the GNU ld.so supports shared libraries on MkLinux. + case "$host_cpu" in + powerpc*) dynamic_linker=no ;; + *) dynamic_linker='Linux ld.so' ;; + esac + fi + ;; + +netbsd*) + version_type=sunos + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major ${libname}${release}.so ${libname}.so' + soname_spec='${libname}${release}.so$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + ;; + +openbsd*) + version_type=sunos + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + need_version=no + fi + library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + ;; + +os2*) + libname_spec='$name' + need_lib_prefix=no + library_names_spec='$libname.dll $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_version=no + soname_spec='${libname}${release}.so' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so $libname.so' + shlibpath_var=LD_LIBRARY_PATH + # this will be overridden with pass_all, but let us keep it just in case + deplibs_check_method='file_magic COFF format alpha shared library' + file_magic_cmd=/usr/bin/file + file_magic_test_file=/shlib/libc.so + deplibs_check_method='pass_all' + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +sco3.2v5*) + version_type=osf + soname_spec='${libname}${release}.so$major' + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + shlibpath_var=LD_LIBRARY_PATH + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + deplibs_check_method="file_magic ELF [0-9][0-9]-bit [LM]SB dynamic lib" + file_magic_cmd=/usr/bin/file + file_magic_test_file=/lib/libc.so + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}.so$versuffix ${libname}.so$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + version_type=linux + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + case "$host_vendor" in + ncr) + deplibs_check_method='pass_all' + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' + file_magic_cmd=/usr/bin/file + file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + esac + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so' + soname_spec='${libname}${release}.so$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname.so.$versuffix $libname.so.$major $libname.so' + soname_spec='$libname.so.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +*) + dynamic_linker=no + ;; +esac +echo "$ac_t$dynamic_linker" 1>&6 +test "$dynamic_linker" = no && can_build_shared=no + +# Report the final consequences. +echo "checking if libtool supports shared libraries... $can_build_shared" 1>&6 + +# Only try to build win32 dlls if AC_LIBTOOL_WIN32_DLL was used in +# configure.in, otherwise build static only libraries. +case "$host_os" in +cygwin* | mingw* | os2*) + if test x$can_build_shared = xyes; then + test x$enable_win32_dll = xno && can_build_shared=no + echo "checking if package supports dlls... $can_build_shared" 1>&6 + fi +;; +esac + +if test -n "$file_magic_test_file" && test -n "$file_magic_cmd"; then + case "$deplibs_check_method" in + "file_magic "*) + file_magic_regex="`expr \"$deplibs_check_method\" : \"file_magic \(.*\)\"`" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + egrep "$file_magic_regex" > /dev/null; then + : + else + cat <&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +EOF + fi ;; + esac +fi + +echo $ac_n "checking whether to build shared libraries... $ac_c" 1>&6 +test "$can_build_shared" = "no" && enable_shared=no + +# On AIX, shared libraries and static libraries use the same namespace, and +# are all built from PIC. +case "$host_os" in +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + +aix4*) + test "$enable_shared" = yes && enable_static=no + ;; +esac + +echo "$ac_t$enable_shared" 1>&6 + +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes + +echo "checking whether to build static libraries... $enable_static" 1>&6 + +if test "$hardcode_action" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + +echo $ac_n "checking for objdir... $ac_c" 1>&6 +rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + objdir=_libs +fi +rmdir .libs 2>/dev/null +echo "$ac_t$objdir" 1>&6 + +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else +if eval "test \"`echo '$''{'lt_cv_dlopen'+set}'`\" != set"; then + lt_cv_dlopen=no lt_cv_dlopen_libs= +echo $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6 +echo "$progname:2212: checking for dlopen in -ldl" >&5 +ac_lib_var=`echo dl'_'dlopen | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-ldl $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + echo "$ac_t""no" 1>&6 +echo $ac_n "checking for dlopen""... $ac_c" 1>&6 +echo "$progname:2252: checking for dlopen" >&5 +if eval "test \"`echo '$''{'ac_cv_func_dlopen'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_dlopen) || defined (__stub___dlopen) +choke me +#else +dlopen(); +#endif + +; return 0; } +EOF +if { (eval echo $progname:2282: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_dlopen=yes" +else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_dlopen=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_func_'dlopen`\" = yes"; then + echo "$ac_t""yes" 1>&6 + lt_cv_dlopen="dlopen" +else + echo "$ac_t""no" 1>&6 +echo $ac_n "checking for dld_link in -ldld""... $ac_c" 1>&6 +echo "$progname:2299: checking for dld_link in -ldld" >&5 +ac_lib_var=`echo dld'_'dld_link | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-ldld $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" +else + echo "$ac_t""no" 1>&6 +echo $ac_n "checking for shl_load""... $ac_c" 1>&6 +echo "$progname:2339: checking for shl_load" >&5 +if eval "test \"`echo '$''{'ac_cv_func_shl_load'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char shl_load(); + +int main() { + +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_shl_load) || defined (__stub___shl_load) +choke me +#else +shl_load(); +#endif + +; return 0; } +EOF +if { (eval echo $progname:2369: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_func_shl_load=yes" +else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_func_shl_load=no" +fi +rm -f conftest* +fi + +if eval "test \"`echo '$ac_cv_func_'shl_load`\" = yes"; then + echo "$ac_t""yes" 1>&6 + lt_cv_dlopen="shl_load" +else + echo "$ac_t""no" 1>&6 +echo $ac_n "checking for shl_load in -ldld""... $ac_c" 1>&6 +echo "$progname:2387: checking for shl_load in -ldld" >&5 +ac_lib_var=`echo dld'_'shl_load | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-ldld $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" +else + echo "$ac_t""no" 1>&6 +fi + + +fi + + +fi + + +fi + + +fi + +fi + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + fi + + case "$lt_cv_dlopen" in + dlopen) +for ac_hdr in dlfcn.h; do +ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 +echo "$progname:2452: checking for $ac_hdr" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +int fnord = 0; +EOF +ac_try="$ac_compile >/dev/null 2>conftest.out" +{ (eval echo $progname:2462: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi +done + + if test "x$ac_cv_header_dlfcn_h" = xyes; then + CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + fi + eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + LIBS="$lt_cv_dlopen_libs $LIBS" + + echo $ac_n "checking whether a program can dlopen itself""... $ac_c" 1>&6 +echo "$progname:2490: checking whether a program can dlopen itself" >&5 +if test "${lt_cv_dlopen_self+set}" = set; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test "$cross_compiling" = yes; then + lt_cv_dlopen_self=cross + else + cat > conftest.c < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LTDL_GLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LTDL_GLOBAL DL_GLOBAL +# else +# define LTDL_GLOBAL 0 +# endif +#endif + +/* We may have to define LTDL_LAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LTDL_LAZY_OR_NOW +# ifdef RTLD_LAZY +# define LTDL_LAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LTDL_LAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LTDL_LAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LTDL_LAZY_OR_NOW DL_NOW +# else +# define LTDL_LAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +fnord() { int i=42;} +main() { void *self, *ptr1, *ptr2; self=dlopen(0,LTDL_GLOBAL|LTDL_LAZY_OR_NOW); + if(self) { ptr1=dlsym(self,"fnord"); ptr2=dlsym(self,"_fnord"); + if(ptr1 || ptr2) { dlclose(self); exit(0); } } exit(1); } + +EOF +if { (eval echo $progname:2544: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null +then + lt_cv_dlopen_self=yes +else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + lt_cv_dlopen_self=no +fi +rm -fr conftest* +fi + +fi + +echo "$ac_t""$lt_cv_dlopen_self" 1>&6 + + if test "$lt_cv_dlopen_self" = yes; then + LDFLAGS="$LDFLAGS $link_static_flag" + echo $ac_n "checking whether a statically linked program can dlopen itself""... $ac_c" 1>&6 +echo "$progname:2563: checking whether a statically linked program can dlopen itself" >&5 +if test "${lt_cv_dlopen_self_static+set}" = set; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test "$cross_compiling" = yes; then + lt_cv_dlopen_self_static=cross + else + cat > conftest.c < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LTDL_GLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LTDL_GLOBAL DL_GLOBAL +# else +# define LTDL_GLOBAL 0 +# endif +#endif + +/* We may have to define LTDL_LAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LTDL_LAZY_OR_NOW +# ifdef RTLD_LAZY +# define LTDL_LAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LTDL_LAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LTDL_LAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LTDL_LAZY_OR_NOW DL_NOW +# else +# define LTDL_LAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +fnord() { int i=42;} +main() { void *self, *ptr1, *ptr2; self=dlopen(0,LTDL_GLOBAL|LTDL_LAZY_OR_NOW); + if(self) { ptr1=dlsym(self,"fnord"); ptr2=dlsym(self,"_fnord"); + if(ptr1 || ptr2) { dlclose(self); exit(0); } } exit(1); } + +EOF +if { (eval echo $progname:2617: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null +then + lt_cv_dlopen_self_static=yes +else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + lt_cv_dlopen_self_static=no +fi +rm -fr conftest* +fi + +fi + +echo "$ac_t""$lt_cv_dlopen_self_static" 1>&6 +fi + ;; + esac + + case "$lt_cv_dlopen_self" in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case "$lt_cv_dlopen_self_static" in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + +# Copy echo and quote the copy, instead of the original, because it is +# used later. +ltecho="$echo" +if test "X$ltecho" = "X$CONFIG_SHELL $0 --fallback-echo"; then + ltecho="$CONFIG_SHELL \$0 --fallback-echo" +fi +LTSHELL="$SHELL" + +LTCONFIG_VERSION="$VERSION" + +# Only quote variables if we're using ltmain.sh. +case "$ltmain" in +*.sh) + # Now quote all the things that may contain metacharacters. + for var in ltecho old_CC old_CFLAGS old_CPPFLAGS \ + old_LD old_LDFLAGS old_LIBS \ + old_NM old_RANLIB old_LN_S old_DLLTOOL old_OBJDUMP old_AS \ + AR CC LD LN_S NM LTSHELL LTCONFIG_VERSION \ + reload_flag reload_cmds wl \ + pic_flag link_static_flag no_builtin_flag export_dynamic_flag_spec \ + thread_safe_flag_spec whole_archive_flag_spec libname_spec \ + library_names_spec soname_spec \ + RANLIB old_archive_cmds old_archive_from_new_cmds old_postinstall_cmds \ + old_postuninstall_cmds archive_cmds archive_expsym_cmds postinstall_cmds postuninstall_cmds \ + file_magic_cmd export_symbols_cmds deplibs_check_method allow_undefined_flag no_undefined_flag \ + finish_cmds finish_eval global_symbol_pipe global_symbol_to_cdecl \ + hardcode_libdir_flag_spec hardcode_libdir_separator \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + compiler_c_o compiler_o_lo need_locks exclude_expsyms include_expsyms; do + + case "$var" in + reload_cmds | old_archive_cmds | old_archive_from_new_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + export_symbols_cmds | archive_cmds | archive_expsym_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + finish_cmds | sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case "$ltecho" in + *'\$0 --fallback-echo"') + ltecho=`$echo "X$ltecho" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + + trap "$rm \"$ofile\"; exit 1" 1 2 15 + echo "creating $ofile" + $rm "$ofile" + cat < "$ofile" +#! $SHELL + +# `$echo "$ofile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) +# NOTE: Changes made to this file will be lost: look at ltconfig or ltmain.sh. +# +# Copyright (C) 1996-1999 Free Software Foundation, Inc. +# Originally by Gordon Matzigkeit , 1996 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="sed -e s/^X//" + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +if test "X\${CDPATH+set}" = Xset; then CDPATH=:; export CDPATH; fi + +### BEGIN LIBTOOL CONFIG +EOF + cfgfile="$ofile" + ;; + +*) + # Double-quote the variables that need it (for aesthetics). + for var in old_CC old_CFLAGS old_CPPFLAGS \ + old_LD old_LDFLAGS old_LIBS \ + old_NM old_RANLIB old_LN_S old_DLLTOOL old_OBJDUMP old_AS; do + eval "$var=\\\"\$var\\\"" + done + + # Just create a config file. + cfgfile="$ofile.cfg" + trap "$rm \"$cfgfile\"; exit 1" 1 2 15 + echo "creating $cfgfile" + $rm "$cfgfile" + cat < "$cfgfile" +# `$echo "$cfgfile" | sed 's%^.*/%%'` - Libtool configuration file. +# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) +EOF + ;; +esac + +cat <> "$cfgfile" +# Libtool was configured as follows, on host `(hostname || uname -n) 2>/dev/null | sed 1q`: +# +# CC=$old_CC CFLAGS=$old_CFLAGS CPPFLAGS=$old_CPPFLAGS \\ +# LD=$old_LD LDFLAGS=$old_LDFLAGS LIBS=$old_LIBS \\ +# NM=$old_NM RANLIB=$old_RANLIB LN_S=$old_LN_S \\ +# DLLTOOL=$old_DLLTOOL OBJDUMP=$old_OBJDUMP AS=$old_AS \\ +# $0$ltconfig_args +# +# Compiler and other test output produced by $progname, useful for +# debugging $progname, is in ./config.log if it exists. + +# The version of $progname that generated this script. +LTCONFIG_VERSION=$LTCONFIG_VERSION + +# Shell to use when invoking shell scripts. +SHELL=$LTSHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host + +# An echo program that does not interpret backslashes. +echo=$ltecho + +# The archiver. +AR=$AR + +# The default C compiler. +CC=$CC + +# The linker used to build libraries. +LD=$LD + +# Whether we need hard or soft links. +LN_S=$LN_S + +# A BSD-compatible nm program. +NM=$NM + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$reload_flag +reload_cmds=$reload_cmds + +# How to pass a linker flag through the compiler. +wl=$wl + +# Object file suffix (normally "o"). +objext="$objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$pic_flag + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$compiler_c_o + +# Can we write directly to a .lo ? +compiler_o_lo=$compiler_o_lo + +# Must we lock files when doing compilation ? +need_locks=$need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$link_static_flag + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$no_builtin_flag + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$whole_archive_flag_spec + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$thread_safe_flag_spec + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$RANLIB +old_archive_cmds=$old_archive_cmds +old_postinstall_cmds=$old_postinstall_cmds +old_postuninstall_cmds=$old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$old_archive_from_new_cmds + +# Commands used to build and install a shared archive. +archive_cmds=$archive_cmds +archive_expsym_cmds=$archive_expsym_cmds +postinstall_cmds=$postinstall_cmds +postuninstall_cmds=$postuninstall_cmds + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$allow_undefined_flag + +# Flag that forces no undefined symbols. +no_undefined_flag=$no_undefined_flag + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$global_symbol_to_cdecl + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$hardcode_libdir_flag_spec + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$hardcode_libdir_separator + +# Set to yes if using DIR/libNAME.so during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path="$fix_srcfile_path" + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$export_symbols_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$include_expsyms + +EOF + +case "$ltmain" in +*.sh) + echo '### END LIBTOOL CONFIG' >> "$ofile" + echo >> "$ofile" + case "$host_os" in + aix3*) + cat <<\EOF >> "$ofile" + +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +EOF + ;; + esac + + # Append the ltmain.sh script. + sed '$q' "$ltmain" >> "$ofile" || (rm -f "$ofile"; exit 1) + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + + chmod +x "$ofile" + ;; + +*) + # Compile the libtool program. + echo "FIXME: would compile $ltmain" + ;; +esac + +test -n "$cache_file" || exit 0 + +# AC_CACHE_SAVE +trap '' 1 2 15 +cat > confcache <<\EOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs. It is not useful on other systems. +# If it contains results you don't want to keep, you may remove or edit it. +# +# By default, configure uses ./config.cache as the cache file, +# creating it if it does not exist already. You can give configure +# the --cache-file=FILE option to use a different cache file; that is +# what configure does when it calls configure scripts in +# subdirectories, so they share the cache. +# Giving --cache-file=/dev/null disables caching, for debugging configure. +# config.status only pays attention to the cache file if you give it the +# --recheck option to rerun configure. +# +EOF +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, don't put newlines in cache variables' values. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +(set) 2>&1 | + case `(ac_space=' '; set | grep ac_space) 2>&1` in + *ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote substitution + # turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + -e "s/'/'\\\\''/g" \ + -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' + ;; + esac >> confcache +if cmp -s $cache_file confcache; then + : +else + if test -w $cache_file; then + echo "updating cache $cache_file" + cat confcache > $cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + +exit 0 + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/ltmain.sh b/rubbos/app/httpd-2.0.64/srclib/pcre/ltmain.sh new file mode 100644 index 00000000..5959c479 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/ltmain.sh @@ -0,0 +1,4946 @@ +# ltmain.sh - Provide generalized library-building support services. +# NOTE: Changing this file will not affect anything until you rerun configure. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001 +# Free Software Foundation, Inc. +# Originally by Gordon Matzigkeit , 1996 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Check that we have a working $echo. +if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X$1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then + # Yippee, $echo works! + : +else + # Restart under the correct shell, and then maybe $echo will work. + exec $SHELL "$0" --no-reexec ${1+"$@"} +fi + +if test "X$1" = X--fallback-echo; then + # used as fallback echo + shift + cat <&2 + echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit 1 +fi + +# Global variables. +mode=$default_mode +nonopt= +prev= +prevopt= +run= +show="$echo" +show_help= +execute_dlfiles= +lo2o="s/\\.lo\$/.${objext}/" +o2lo="s/\\.${objext}\$/.lo/" + +# Parse our command line options once, thoroughly. +while test $# -gt 0 +do + arg="$1" + shift + + case $arg in + -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;; + *) optarg= ;; + esac + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + execute_dlfiles) + execute_dlfiles="$execute_dlfiles $arg" + ;; + *) + eval "$prev=\$arg" + ;; + esac + + prev= + prevopt= + continue + fi + + # Have we seen a non-optional argument yet? + case $arg in + --help) + show_help=yes + ;; + + --version) + echo "$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP" + exit 0 + ;; + + --config) + sed -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $0 + exit 0 + ;; + + --debug) + echo "$progname: enabling shell trace mode" + set -x + ;; + + --dry-run | -n) + run=: + ;; + + --features) + echo "host: $host" + if test "$build_libtool_libs" = yes; then + echo "enable shared libraries" + else + echo "disable shared libraries" + fi + if test "$build_old_libs" = yes; then + echo "enable static libraries" + else + echo "disable static libraries" + fi + exit 0 + ;; + + --finish) mode="finish" ;; + + --mode) prevopt="--mode" prev=mode ;; + --mode=*) mode="$optarg" ;; + + --quiet | --silent) + show=: + ;; + + -dlopen) + prevopt="-dlopen" + prev=execute_dlfiles + ;; + + -*) + $echo "$modename: unrecognized option \`$arg'" 1>&2 + $echo "$help" 1>&2 + exit 1 + ;; + + *) + nonopt="$arg" + break + ;; + esac +done + +if test -n "$prevopt"; then + $echo "$modename: option \`$prevopt' requires an argument" 1>&2 + $echo "$help" 1>&2 + exit 1 +fi + +if test -z "$show_help"; then + + # Infer the operation mode. + if test -z "$mode"; then + case $nonopt in + *cc | *++ | gcc* | *-gcc*) + mode=link + for arg + do + case $arg in + -c) + mode=compile + break + ;; + esac + done + ;; + *db | *dbx | *strace | *truss) + mode=execute + ;; + *install*|cp|mv) + mode=install + ;; + *rm) + mode=uninstall + ;; + *) + # If we have no mode, but dlfiles were specified, then do execute mode. + test -n "$execute_dlfiles" && mode=execute + + # Just use the default operation mode. + if test -z "$mode"; then + if test -n "$nonopt"; then + $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2 + else + $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2 + fi + fi + ;; + esac + fi + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$execute_dlfiles" && test "$mode" != execute; then + $echo "$modename: unrecognized option \`-dlopen'" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + # Change the help message to a mode-specific one. + generic_help="$help" + help="Try \`$modename --help --mode=$mode' for more information." + + # These modes are in order of execution frequency so that they run quickly. + case $mode in + # libtool compile mode + compile) + modename="$modename: compile" + # Get the compilation command and the source file. + base_compile= + prev= + lastarg= + srcfile="$nonopt" + suppress_output= + + user_target=no + for arg + do + case $prev in + "") ;; + xcompiler) + # Aesthetically quote the previous argument. + prev= + lastarg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + + case $arg in + # Double-quote args containing other shell metacharacters. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + + # Add the previous argument to base_compile. + if test -z "$base_compile"; then + base_compile="$lastarg" + else + base_compile="$base_compile $lastarg" + fi + continue + ;; + esac + + # Accept any command-line options. + case $arg in + -o) + if test "$user_target" != "no"; then + $echo "$modename: you cannot specify \`-o' more than once" 1>&2 + exit 1 + fi + user_target=next + ;; + + -static) + build_old_libs=yes + continue + ;; + + -prefer-pic) + pic_mode=yes + continue + ;; + + -prefer-non-pic) + pic_mode=no + continue + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Wc,*) + args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"` + lastarg= + IFS="${IFS= }"; save_ifs="$IFS"; IFS=',' + for arg in $args; do + IFS="$save_ifs" + + # Double-quote args containing other shell metacharacters. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + lastarg="$lastarg $arg" + done + IFS="$save_ifs" + lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"` + + # Add the arguments to base_compile. + if test -z "$base_compile"; then + base_compile="$lastarg" + else + base_compile="$base_compile $lastarg" + fi + continue + ;; + esac + + case $user_target in + next) + # The next one is the -o target name + user_target=yes + continue + ;; + yes) + # We got the output file + user_target=set + libobj="$arg" + continue + ;; + esac + + # Accept the current argument as the source file. + lastarg="$srcfile" + srcfile="$arg" + + # Aesthetically quote the previous argument. + + # Backslashify any backslashes, double quotes, and dollar signs. + # These are the only characters that are still specially + # interpreted inside of double-quoted scrings. + lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"` + + # Double-quote args containing other shell metacharacters. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + case $lastarg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + lastarg="\"$lastarg\"" + ;; + esac + + # Add the previous argument to base_compile. + if test -z "$base_compile"; then + base_compile="$lastarg" + else + base_compile="$base_compile $lastarg" + fi + done + + case $user_target in + set) + ;; + no) + # Get the name of the library object. + libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'` + ;; + *) + $echo "$modename: you must specify a target with \`-o'" 1>&2 + exit 1 + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + xform='[cCFSfmso]' + case $libobj in + *.ada) xform=ada ;; + *.adb) xform=adb ;; + *.ads) xform=ads ;; + *.asm) xform=asm ;; + *.c++) xform=c++ ;; + *.cc) xform=cc ;; + *.cpp) xform=cpp ;; + *.cxx) xform=cxx ;; + *.f90) xform=f90 ;; + *.for) xform=for ;; + esac + + libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"` + + case $libobj in + *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;; + *) + $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2 + exit 1 + ;; + esac + + if test -z "$base_compile"; then + $echo "$modename: you must specify a compilation command" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + # Delete any leftover library objects. + if test "$build_old_libs" = yes; then + removelist="$obj $libobj" + else + removelist="$libobj" + fi + + $run $rm $removelist + trap "$run $rm $removelist; exit 1" 1 2 15 + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | pw32* | os2*) + pic_mode=default + ;; + esac + if test $pic_mode = no && test "$deplibs_check_method" != pass_all; 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 "$compiler_c_o" = no; then + output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext} + lockfile="$output_obj.lock" + removelist="$removelist $output_obj $lockfile" + trap "$run $rm $removelist; exit 1" 1 2 15 + else + need_locks=no + lockfile= + fi + + # Lock this critical section if it is needed + # We use this script file to make the link, it avoids creating a new file + if test "$need_locks" = yes; then + until $run ln "$0" "$lockfile" 2>/dev/null; do + $show "Waiting for $lockfile to be removed" + sleep 2 + done + elif test "$need_locks" = warn; then + if test -f "$lockfile"; then + echo "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit 1 + fi + echo $srcfile > "$lockfile" + fi + + if test -n "$fix_srcfile_path"; then + eval srcfile=\"$fix_srcfile_path\" + fi + + # Only build a PIC object if we are building libtool libraries. + if test "$build_libtool_libs" = yes; then + # Without this assignment, base_compile gets emptied. + fbsd_hideous_sh_bug=$base_compile + + if test "$pic_mode" != no; then + # All platforms use -DPIC, to notify preprocessed assembler code. + command="$base_compile $srcfile $pic_flag -DPIC" + else + # Don't build PIC code + command="$base_compile $srcfile" + fi + if test "$build_old_libs" = yes; then + lo_libobj="$libobj" + dir=`$echo "X$libobj" | $Xsed -e 's%/[^/]*$%%'` + if test "X$dir" = "X$libobj"; then + dir="$objdir" + else + dir="$dir/$objdir" + fi + libobj="$dir/"`$echo "X$libobj" | $Xsed -e 's%^.*/%%'` + + if test -d "$dir"; then + $show "$rm $libobj" + $run $rm $libobj + else + $show "$mkdir $dir" + $run $mkdir $dir + status=$? + if test $status -ne 0 && test ! -d $dir; then + exit $status + fi + fi + fi + if test "$compiler_o_lo" = yes; then + output_obj="$libobj" + command="$command -o $output_obj" + elif test "$compiler_c_o" = yes; then + output_obj="$obj" + command="$command -o $output_obj" + fi + + $run $rm "$output_obj" + $show "$command" + if $run eval "$command"; then : + else + test -n "$output_obj" && $run $rm $removelist + exit 1 + fi + + if test "$need_locks" = warn && + test x"`cat $lockfile 2>/dev/null`" != x"$srcfile"; then + echo "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit 1 + fi + + # Just move the object if needed, then go on to compile the next one + if test x"$output_obj" != x"$libobj"; then + $show "$mv $output_obj $libobj" + if $run $mv $output_obj $libobj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + fi + + # If we have no pic_flag, then copy the object into place and finish. + if (test -z "$pic_flag" || test "$pic_mode" != default) && + test "$build_old_libs" = yes; then + # Rename the .lo from within objdir to obj + if test -f $obj; then + $show $rm $obj + $run $rm $obj + fi + + $show "$mv $libobj $obj" + if $run $mv $libobj $obj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + + xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$obj"; then + xdir="." + else + xdir="$xdir" + fi + baseobj=`$echo "X$obj" | $Xsed -e "s%.*/%%"` + libobj=`$echo "X$baseobj" | $Xsed -e "$o2lo"` + # Now arrange that obj and lo_libobj become the same file + $show "(cd $xdir && $LN_S $baseobj $libobj)" + if $run eval '(cd $xdir && $LN_S $baseobj $libobj)'; then + exit 0 + else + error=$? + $run $rm $removelist + exit $error + fi + fi + + # Allow error messages only from the first compilation. + suppress_output=' >/dev/null 2>&1' + fi + + # Only build a position-dependent object if we build old libraries. + if test "$build_old_libs" = yes; then + if test "$pic_mode" != yes; then + # Don't build PIC code + command="$base_compile $srcfile" + else + # All platforms use -DPIC, to notify preprocessed assembler code. + command="$base_compile $srcfile $pic_flag -DPIC" + fi + if test "$compiler_c_o" = yes; then + command="$command -o $obj" + output_obj="$obj" + fi + + # Suppress compiler output if we already did a PIC compilation. + command="$command$suppress_output" + $run $rm "$output_obj" + $show "$command" + if $run eval "$command"; then : + else + $run $rm $removelist + exit 1 + fi + + if test "$need_locks" = warn && + test x"`cat $lockfile 2>/dev/null`" != x"$srcfile"; then + echo "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit 1 + fi + + # Just move the object if needed + if test x"$output_obj" != x"$obj"; then + $show "$mv $output_obj $obj" + if $run $mv $output_obj $obj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + fi + + # Create an invalid libtool object if no PIC, so that we do not + # accidentally link it into a program. + if test "$build_libtool_libs" != yes; then + $show "echo timestamp > $libobj" + $run eval "echo timestamp > \$libobj" || exit $? + else + # Move the .lo from within objdir + $show "$mv $libobj $lo_libobj" + if $run $mv $libobj $lo_libobj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + fi + fi + + # Unlock the critical section if it was locked + if test "$need_locks" != no; then + $run $rm "$lockfile" + fi + + exit 0 + ;; + + # libtool link mode + link | relink) + modename="$modename: link" + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) + # It is impossible to link a dll without this setting, and + # we shouldn't force the makefile maintainer to figure out + # which system we are compiling for in order to pass an extra + # flag for every libtool invokation. + # allow_undefined=no + + # FIXME: Unfortunately, there are problems with the above when trying + # to make a dll which has undefined symbols, in which case not + # even a static library is built. For now, we need to specify + # -no-undefined on the libtool link line when we can be certain + # that all symbols are satisfied, otherwise we get a static library. + allow_undefined=yes + ;; + *) + allow_undefined=yes + ;; + esac + libtool_args="$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` + + avoid_version=no + dlfiles= + dlprefiles= + dlself=no + export_dynamic=no + export_symbols= + export_symbols_regex= + generated= + libobjs= + ltlibs= + module=no + no_install=no + objs= + prefer_static_libs=no + preload=no + prev= + prevarg= + release= + rpath= + xrpath= + perm_rpath= + temp_rpath= + thread_safe=no + vinfo= + + # We need to know -static, to get the right output filenames. + for arg + do + case $arg in + -all-static | -static) + if test "X$arg" = "X-all-static"; then + if test "$build_libtool_libs" = yes && test -z "$link_static_flag"; then + $echo "$modename: warning: complete static linking is impossible in this configuration" 1>&2 + fi + if test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + else + if test -z "$pic_flag" && test -n "$link_static_flag"; then + dlopen_self=$dlopen_self_static + fi + fi + build_libtool_libs=no + build_old_libs=yes + prefer_static_libs=yes + break + ;; + esac + done + + # See if our shared archives depend on static archives. + test -n "$old_archive_from_new_cmds" && build_old_libs=yes + + # Go through the arguments, transforming them on the way. + while test $# -gt 0; do + arg="$1" + shift + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + qarg=\"`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`\" ### testsuite: skip nested quoting test + ;; + *) qarg=$arg ;; + esac + libtool_args="$libtool_args $qarg" + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + output) + compile_command="$compile_command @OUTPUT@" + finalize_command="$finalize_command @OUTPUT@" + ;; + esac + + case $prev in + dlfiles|dlprefiles) + if test "$preload" = no; then + # Add the symbol object into the linking commands. + compile_command="$compile_command @SYMFILE@" + finalize_command="$finalize_command @SYMFILE@" + preload=yes + fi + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test "$dlself" = no; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test "$prev" = dlprefiles; then + dlself=yes + elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test "$prev" = dlfiles; then + dlfiles="$dlfiles $arg" + else + dlprefiles="$dlprefiles $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols="$arg" + if test ! -f "$arg"; then + $echo "$modename: symbol file \`$arg' does not exist" + exit 1 + fi + prev= + continue + ;; + expsyms_regex) + export_symbols_regex="$arg" + prev= + continue + ;; + release) + release="-$arg" + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + $echo "$modename: only absolute run-paths are allowed" 1>&2 + exit 1 + ;; + esac + if test "$prev" = rpath; then + case "$rpath " in + *" $arg "*) ;; + *) rpath="$rpath $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) xrpath="$xrpath $arg" ;; + esac + fi + prev= + continue + ;; + xcompiler) + compiler_flags="$compiler_flags $qarg" + prev= + compile_command="$compile_command $qarg" + finalize_command="$finalize_command $qarg" + continue + ;; + xlinker) + linker_flags="$linker_flags $qarg" + compiler_flags="$compiler_flags $wl$qarg" + prev= + compile_command="$compile_command $wl$qarg" + finalize_command="$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 + compile_command="$compile_command $link_static_flag" + finalize_command="$finalize_command $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + $echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2 + continue + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + $echo "$modename: more than one -exported-symbols argument is not allowed" + exit 1 + fi + if test "X$arg" = "X-export-symbols"; then + prev=expsyms + else + prev=expsyms_regex + fi + 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*) + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + ;; + esac + continue + ;; + + -L*) + dir=`$echo "X$arg" | $Xsed -e 's/^-L//'` + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2 + exit 1 + fi + dir="$absdir" + ;; + esac + case "$deplibs " in + *" -L$dir "*) ;; + *) + deplibs="$deplibs -L$dir" + lib_search_path="$lib_search_path $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) + case :$dllsearchpath: in + *":$dir:"*) ;; + *) dllsearchpath="$dllsearchpath:$dir";; + esac + ;; + esac + continue + ;; + + -l*) + if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then + case $host in + *-*-cygwin* | *-*-pw32* | *-*-beos*) + # These systems don't actually have a C or math library (as such) + continue + ;; + *-*-mingw* | *-*-os2*) + # These systems don't actually have a C library (as such) + test "X$arg" = "X-lc" && continue + ;; + esac + fi + deplibs="$deplibs $arg" + continue + ;; + + -module) + module=yes + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) + # The PATH hackery in wrapper scripts is required on Windows + # in order for the loader to find any dlls it needs. + $echo "$modename: warning: \`-no-install' is ignored for $host" 1>&2 + $echo "$modename: warning: assuming \`-no-fast-install' instead" 1>&2 + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -o) prev=output ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + dir=`$echo "X$arg" | $Xsed -e 's/^-R//'` + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + $echo "$modename: only absolute run-paths are allowed" 1>&2 + exit 1 + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$xrpath $dir" ;; + esac + continue + ;; + + -static) + # 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 + ;; + + -Wc,*) + args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'` + arg= + IFS="${IFS= }"; save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + case $flag in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + flag="\"$flag\"" + ;; + esac + arg="$arg $wl$flag" + compiler_flags="$compiler_flags $flag" + done + IFS="$save_ifs" + arg=`$echo "X$arg" | $Xsed -e "s/^ //"` + ;; + + -Wl,*) + args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'` + arg= + IFS="${IFS= }"; save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + case $flag in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + flag="\"$flag\"" + ;; + esac + arg="$arg $wl$flag" + compiler_flags="$compiler_flags $wl$flag" + linker_flags="$linker_flags $flag" + done + IFS="$save_ifs" + arg=`$echo "X$arg" | $Xsed -e "s/^ //"` + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + # Some other compiler flag. + -* | +*) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + ;; + + *.lo | *.$objext) + # A library or standard object. + if test "$prev" = dlfiles; then + # This file was specified with -dlopen. + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles="$dlfiles $arg" + prev= + continue + else + # If libtool objects are unsupported, then we need to preload. + prev=dlprefiles + fi + fi + + if test "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles "`$echo "X$arg" | $Xsed -e "$lo2o"` + prev= + else + case $arg in + *.lo) libobjs="$libobjs $arg" ;; + *) objs="$objs $arg" ;; + esac + fi + ;; + + *.$libext) + # An archive. + deplibs="$deplibs $arg" + old_deplibs="$old_deplibs $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + if test "$prev" = dlfiles; then + # This library was specified with -dlopen. + dlfiles="$dlfiles $arg" + prev= + elif test "$prev" = dlprefiles; then + # The library was specified with -dlpreopen. + dlprefiles="$dlprefiles $arg" + prev= + else + deplibs="$deplibs $arg" + 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. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + ;; + esac # arg + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + fi + done # argument parsing loop + + if test -n "$prev"; then + $echo "$modename: the \`$prevarg' option requires an argument" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + fi + + # calculate the name of the file, without its directory + outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'` + libobjs_save="$libobjs" + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$echo \"X\${$shlibpath_var}\" \| \$Xsed -e \'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\" + + output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'` + if test "X$output_objdir" = "X$output"; then + output_objdir="$objdir" + else + output_objdir="$output_objdir/$objdir" + fi + # Create the object directory. + if test ! -d $output_objdir; then + $show "$mkdir $output_objdir" + $run $mkdir $output_objdir + status=$? + if test $status -ne 0 && test ! -d $output_objdir; then + exit $status + fi + fi + + # Determine the type of output + case $output in + "") + $echo "$modename: you must specify an output file" 1>&2 + $echo "$help" 1>&2 + exit 1 + ;; + *.$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 + case "$libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + libs="$libs $deplib" + done + 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 link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + $echo "$modename: libraries can \`-dlopen' only libtool libraries: $file" 1>&2 + exit 1 + ;; + esac + done + ;; + prog) + compile_deplibs= + finalize_deplibs= + alldeplibs=no + newdlfiles= + newdlprefiles= + passes="conv scan dlopen dlpreopen link" + ;; + *) passes="conv" + ;; + esac + for pass in $passes; do + if test $linkmode = prog; then + # Determine which files to process + case $pass in + dlopen) + libs="$dlfiles" + save_deplibs="$deplibs" # Collect dlpreopened libraries + deplibs= + ;; + dlpreopen) libs="$dlprefiles" ;; + link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; + esac + fi + for deplib in $libs; do + lib= + found=no + case $deplib in + -l*) + if test $linkmode = oldlib && test $linkmode = obj; then + $echo "$modename: warning: \`-l' is ignored for archives/objects: $deplib" 1>&2 + continue + fi + if test $pass = conv; then + deplibs="$deplib $deplibs" + continue + fi + name=`$echo "X$deplib" | $Xsed -e 's/^-l//'` + for searchdir in $newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path; do + # Search the libtool library + lib="$searchdir/lib${name}.la" + if test -f "$lib"; then + found=yes + break + fi + done + if test "$found" != yes; then + # deplib doesn't seem to be a libtool library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test $linkmode = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + ;; # -l + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test $pass = conv && continue + newdependency_libs="$deplib $newdependency_libs" + newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` + ;; + prog) + if test $pass = conv; then + deplibs="$deplib $deplibs" + continue + fi + if test $pass = scan; then + deplibs="$deplib $deplibs" + newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + ;; + *) + $echo "$modename: warning: \`-L' is ignored for archives/objects: $deplib" 1>&2 + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test $pass = link; then + dir=`$echo "X$deplib" | $Xsed -e 's/^-R//'` + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$xrpath $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) lib="$deplib" ;; + *.$libext) + if test $pass = conv; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + if test "$deplibs_check_method" != pass_all; then + echo + echo "*** Warning: This library needs some functionality provided by $deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have." + else + echo + echo "*** Warning: Linking the shared library $output against the" + echo "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + fi + continue + ;; + prog) + if test $pass != link; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test $pass = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + newdlprefiles="$newdlprefiles $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + newdlfiles="$newdlfiles $deplib" + fi + continue + ;; + %DEPLIBS%) + alldeplibs=yes + continue + ;; + esac # case $deplib + if test $found = yes || test -f "$lib"; then : + else + $echo "$modename: cannot find the library \`$lib'" 1>&2 + exit 1 + fi + + # Check to see that this really is a libtool archive. + if (sed -e '2q' $lib | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit 1 + fi + + ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` + test "X$ladir" = "X$lib" && ladir="." + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= + # If the library was installed with an old release of libtool, + # it will not redefine variable installed. + installed=yes + + # Read the .la file + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan" || + { test $linkmode = oldlib && test $linkmode = obj; }; then + # Add dl[pre]opened files of deplib + test -n "$dlopen" && dlfiles="$dlfiles $dlopen" + test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen" + fi + + if test $pass = conv; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 + exit 1 + fi + # It is a libtool convenience library, so add in its objects. + convenience="$convenience $ladir/$objdir/$old_library" + old_convenience="$old_convenience $ladir/$objdir/$old_library" + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + tmp_libs="$tmp_libs $deplib" + done + elif test $linkmode != prog && test $linkmode != lib; then + $echo "$modename: \`$lib' is not a convenience library" 1>&2 + exit 1 + fi + continue + fi # $pass = conv + + # Get the name of the library we link against. + linklib= + for l in $old_library $library_names; do + linklib="$l" + done + if test -z "$linklib"; then + $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 + exit 1 + fi + + # This library was specified with -dlopen. + if test $pass = dlopen; then + if test -z "$libdir"; then + $echo "$modename: cannot -dlopen a convenience library: \`$lib'" 1>&2 + exit 1 + fi + if test -z "$dlname" || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then + # If there is no dlname, no dlopen support or we're linking + # statically, we need to preload. + dlprefiles="$dlprefiles $lib" + else + newdlfiles="$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 + $echo "$modename: warning: cannot determine absolute directory name of \`$ladir'" 1>&2 + $echo "$modename: passing it literally to the linker, although it might fail" 1>&2 + abs_ladir="$ladir" + fi + ;; + esac + laname=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` + + # Find the relevant object directory and library name. + if test "X$installed" = Xyes; then + if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + $echo "$modename: warning: library \`$lib' was moved." 1>&2 + dir="$ladir" + absdir="$abs_ladir" + libdir="$abs_ladir" + else + dir="$libdir" + absdir="$libdir" + fi + else + dir="$ladir/$objdir" + absdir="$abs_ladir/$objdir" + # Remove this search path later + notinst_path="$notinst_path $abs_ladir" + fi # $installed = yes + name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` + + # This library was specified with -dlpreopen. + if test $pass = dlpreopen; then + if test -z "$libdir"; then + $echo "$modename: cannot -dlpreopen a convenience library: \`$lib'" 1>&2 + exit 1 + fi + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + newdlprefiles="$newdlprefiles $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + newdlprefiles="$newdlprefiles $dir/$dlname" + else + newdlprefiles="$newdlprefiles $dir/$linklib" + fi + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test $linkmode = lib; then + deplibs="$dir/$old_library $deplibs" + elif test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$dir/$old_library $compile_deplibs" + finalize_deplibs="$dir/$old_library $finalize_deplibs" + else + deplibs="$lib $deplibs" + fi + continue + fi + + if test $linkmode = prog && test $pass != link; then + newlib_search_path="$newlib_search_path $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=no + if test "$link_all_deplibs" != no || test -z "$library_names" || + test "$build_libtool_libs" = no; then + linkalldeplibs=yes + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test + esac + # Need to link against all dependency_libs? + if test $linkalldeplibs = yes; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + tmp_libs="$tmp_libs $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + link_static=no # Whether the deplib will be linked statically + if test -n "$library_names" && + { test "$prefer_static_libs" = no || test -z "$old_library"; }; then + # Link against this shared library + + if test "$linkmode,$pass" = "prog,link" || + { test $linkmode = lib && test $hardcode_into_libs = yes; }; 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 "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + if test $linkmode = prog; then + # We need to hardcode the library path + if test -n "$shlibpath_var"; then + # Make sure the rpath contains only unique directories. + case "$temp_rpath " in + *" $dir "*) ;; + *" $absdir "*) ;; + *) temp_rpath="$temp_rpath $dir" ;; + esac + fi + fi + fi # $linkmode,$pass = prog,link... + + if test "$alldeplibs" = yes && + { test "$deplibs_check_method" = pass_all || + { test "$build_libtool_libs" = yes && + test -n "$library_names"; }; }; then + # We only need to search for static libraries + continue + fi + + if test "$installed" = no; then + notinst_deplibs="$notinst_deplibs $lib" + need_relink=yes + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + realname="$2" + shift; 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 in + *cygwin*) + major=`expr $current - $age` + versuffix="-$major" + ;; + esac + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot="$soname" + soname=`echo $soroot | sed -e 's/^.*\///'` + newlib="libimp-`echo $soname | sed 's/^lib//;s/\.dll$//'`.a" + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + $show "extracting exported symbol list from \`$soname'" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + eval cmds=\"$extract_expsyms_cmds\" + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + $show "generating import library for \`$soname'" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + eval cmds=\"$old_archive_from_expsyms_cmds\" + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + 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 $linkmode = prog || test "$mode" != relink; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test "$hardcode_direct" = no; then + add="$dir/$linklib" + elif test "$hardcode_minus_L" = no; then + case $host in + *-*-sunos*) add_shlibpath="$dir" ;; + esac + add_dir="-L$dir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = no; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + relink) + if test "$hardcode_direct" = yes; then + add="$dir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$dir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test "$lib_linked" != yes; then + $echo "$modename: configuration error: unsupported hardcode properties" + exit 1 + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;; + esac + fi + if test $linkmode = prog; 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 "$hardcode_direct" != yes && \ + test "$hardcode_minus_L" != yes && \ + test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; + esac + fi + fi + fi + + if test $linkmode = prog || test "$mode" = relink; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test "$hardcode_direct" = yes; then + add="$libdir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$libdir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; + esac + add="-l$name" + else + # We cannot seem to hardcode it, guess we'll fake it. + add_dir="-L$libdir" + add="-l$name" + fi + + if test $linkmode = prog; 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 $linkmode = prog; then + if test "$alldeplibs" = yes && + { test "$deplibs_check_method" = pass_all || + { test "$build_libtool_libs" = yes && + test -n "$library_names"; }; }; then + # We only need to search for static libraries + continue + fi + + # Try to link the static library + # Here we assume that one of hardcode_direct or hardcode_minus_L + # is not unsupported. This is valid on all known static and + # shared platforms. + if test "$hardcode_direct" != unsupported; then + test -n "$old_library" && linklib="$old_library" + compile_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 "$build_libtool_libs" = yes; then + # Not a shared library + if test "$deplibs_check_method" != pass_all; 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. + echo + echo "*** Warning: This library needs some functionality provided by $lib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have." + if test "$module" = yes; then + echo "*** Therefore, libtool will create a static module, that should work " + echo "*** as long as the dlopening application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + fi + else + convenience="$convenience $dir/$old_library" + old_convenience="$old_convenience $dir/$old_library" + deplibs="$dir/$old_library $deplibs" + link_static=yes + fi + fi # link shared/static library? + + if test $linkmode = lib; then + if test -n "$dependency_libs" && + { test $hardcode_into_libs != yes || test $build_old_libs = yes || + test $link_static = yes; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) temp_xrpath=`$echo "X$libdir" | $Xsed -e 's/^-R//'` + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) xrpath="$xrpath $temp_xrpath";; + esac;; + *) temp_deplibs="$temp_deplibs $libdir";; + esac + done + dependency_libs="$temp_deplibs" + fi + + newlib_search_path="$newlib_search_path $absdir" + # Link against this library + test "$link_static" = no && 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 "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + tmp_libs="$tmp_libs $deplib" + done + + if test $link_all_deplibs != no; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + case $deplib in + -L*) path="$deplib" ;; + *.la) + dir=`$echo "X$deplib" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$deplib" && dir="." + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2 + absdir="$dir" + fi + ;; + esac + if grep "^installed=no" $deplib > /dev/null; then + path="-L$absdir/$objdir" + else + eval libdir=`sed -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + if test -z "$libdir"; then + $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 + exit 1 + fi + if test "$absdir" != "$libdir"; then + $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2 + fi + path="-L$absdir" + fi + ;; + *) continue ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$deplibs $path" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + if test $pass = dlpreopen; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test $pass != dlopen; then + test $pass != scan && dependency_libs="$newdependency_libs" + if test $pass != conv; then + # 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 "*) ;; + *) lib_search_path="$lib_search_path $dir" ;; + esac + done + newlib_search_path= + fi + + if test "$linkmode,$pass" != "prog,link"; then + vars="deplibs" + else + vars="compile_deplibs finalize_deplibs" + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + case $deplib in + -L*) new_libs="$deplib $new_libs" ;; + *) + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) tmp_libs="$tmp_libs $deplib" ;; + esac + ;; + *) tmp_libs="$tmp_libs $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + if test "$pass" = "conv" && + { test "$linkmode" = "lib" || test "$linkmode" = "prog"; }; then + libs="$deplibs" # reset libs + deplibs= + fi + done # for pass + if test $linkmode = prog; then + dlfiles="$newdlfiles" + dlprefiles="$newdlprefiles" + fi + + case $linkmode in + oldlib) + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2 + fi + + if test -n "$rpath"; then + $echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2 + fi + + if test -n "$xrpath"; then + $echo "$modename: warning: \`-R' is ignored for archives" 1>&2 + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for archives" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for archives" 1>&2 + fi + + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + $echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2 + fi + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs="$output" + objs="$objs$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form `libNAME.la'. + case $outputname in + lib*) + name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` + eval libname=\"$libname_spec\" + ;; + *) + if test "$module" = no; then + $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + if test "$need_lib_prefix" != no; then + # Add the "lib" prefix for modules if required + name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` + eval libname=\"$libname_spec\" + else + libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` + fi + ;; + esac + + if test -n "$objs"; then + if test "$deplibs_check_method" != pass_all; then + $echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1 + exit 1 + else + echo + echo "*** Warning: Linking the shared library $output against the non-libtool" + echo "*** objects $objs is not portable!" + libobjs="$libobjs $objs" + fi + fi + + if test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen self' is ignored for libtool libraries" 1>&2 + fi + + set dummy $rpath + if test $# -gt 2; then + $echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2 + fi + install_libdir="$2" + + oldlibs= + if test -z "$rpath"; then + if test "$build_libtool_libs" = yes; then + # Building a libtool convenience library. + libext=al + oldlibs="$output_objdir/$libname.$libext $oldlibs" + build_libtool_libs=convenience + build_old_libs=yes + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for convenience libraries" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2 + fi + else + + # Parse the version information argument. + IFS="${IFS= }"; save_ifs="$IFS"; IFS=':' + set dummy $vinfo 0 0 0 + IFS="$save_ifs" + + if test -n "$8"; then + $echo "$modename: too many parameters to \`-version-info'" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + current="$2" + revision="$3" + age="$4" + + # Check that each of the things are valid numbers. + case $current in + 0 | [1-9] | [1-9][0-9] | [1-9][0-9][0-9]) ;; + *) + $echo "$modename: CURRENT \`$current' is not a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit 1 + ;; + esac + + case $revision in + 0 | [1-9] | [1-9][0-9] | [1-9][0-9][0-9]) ;; + *) + $echo "$modename: REVISION \`$revision' is not a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit 1 + ;; + esac + + case $age in + 0 | [1-9] | [1-9][0-9] | [1-9][0-9][0-9]) ;; + *) + $echo "$modename: AGE \`$age' is not a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit 1 + ;; + esac + + if test $age -gt $current; then + $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit 1 + fi + + # Calculate the version variables. + major= + versuffix= + verstring= + case $version_type in + none) ;; + + darwin) + # Like Linux, but with the current version available in + # verstring for coding it into the library header + major=.`expr $current - $age` + versuffix="$major.$age.$revision" + # Darwin ld doesn't like 0 for these options... + minor_current=`expr $current + 1` + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + + freebsd-aout) + major=".$current" + versuffix=".$current.$revision"; + ;; + + freebsd-elf) + major=".$current" + versuffix=".$current"; + ;; + + irix) + major=`expr $current - $age + 1` + verstring="sgi$major.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$revision + while test $loop != 0; do + iface=`expr $revision - $loop` + loop=`expr $loop - 1` + verstring="sgi$major.$iface:$verstring" + done + + # Before this point, $major must not contain `.'. + major=.$major + versuffix="$major.$revision" + ;; + + linux) + major=.`expr $current - $age` + versuffix="$major.$age.$revision" + ;; + + osf) + major=`expr $current - $age` + versuffix=".$current.$age.$revision" + verstring="$current.$age.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$age + while test $loop != 0; do + iface=`expr $current - $loop` + loop=`expr $loop - 1` + verstring="$verstring:${iface}.0" + done + + # Make executables depend on our current version. + verstring="$verstring:${current}.0" + ;; + + sunos) + major=".$current" + versuffix=".$current.$revision" + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 filesystems. + major=`expr $current - $age` + versuffix="-$major" + ;; + + *) + $echo "$modename: unknown library version type \`$version_type'" 1>&2 + echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit 1 + ;; + esac + + # Clear the version info if we defaulted, and they specified a release. + if test -z "$vinfo" && test -n "$release"; then + major= + verstring="0.0" + if test "$need_version" = no; then + versuffix= + else + versuffix=".0.0" + fi + fi + + # Remove version info from name if versioning should be avoided + if test "$avoid_version" = yes && test "$need_version" = no; then + major= + versuffix= + verstring="" + fi + + # Check to see if the archive will have undefined symbols. + if test "$allow_undefined" = yes; then + if test "$allow_undefined_flag" = unsupported; then + $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2 + build_libtool_libs=no + build_old_libs=yes + fi + else + # Don't allow undefined symbols. + allow_undefined_flag="$no_undefined_flag" + fi + fi + + if test "$mode" != relink; then + # Remove our outputs. + $show "${rm}r $output_objdir/$outputname $output_objdir/$libname.* $output_objdir/${libname}${release}.*" + $run ${rm}r $output_objdir/$outputname $output_objdir/$libname.* $output_objdir/${libname}${release}.* + fi + + # Now set the variables for building old libraries. + if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then + oldlibs="$oldlibs $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + for path in $notinst_path; do + lib_search_path=`echo "$lib_search_path " | sed -e 's% $path % %g'` + deplibs=`echo "$deplibs " | sed -e 's% -L$path % %g'` + dependency_libs=`echo "$dependency_libs " | sed -e '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 + temp_xrpath="$temp_xrpath -R$libdir" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + if test $hardcode_into_libs != yes || test $build_old_libs = yes; 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 "*) ;; + *) dlfiles="$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 "*) ;; + *) dlprefiles="$dlprefiles $lib" ;; + esac + done + + if test "$build_libtool_libs" = yes; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + deplibs="$deplibs -framework System" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *) + # Add libc to deplibs on all other systems if necessary. + if test $build_libtool_need_lc = "yes"; then + deplibs="$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 behaviour. + newdeplibs=$deplibs + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $rm conftest.c + cat > conftest.c </dev/null` + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null \ + | grep " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib="$potent_lib" + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | sed 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; + *) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \ + | sed 10q \ + | egrep "$file_magic_regex" > /dev/null; then + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi + done + done + if test -n "$a_deplib" ; then + droppeddeps=yes + echo + echo "*** Warning: This library needs some functionality provided by $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have." + fi + else + # Add a -L argument. + newdeplibs="$newdeplibs $a_deplib" + fi + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method + match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` + for a_deplib in $deplibs; do + name="`expr $a_deplib : '-l\(.*\)'`" + # If $name is empty we are operating on a -L argument. + if test -n "$name" && test "$name" != "0"; 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 + if eval echo \"$potent_lib\" 2>/dev/null \ + | sed 10q \ + | egrep "$match_pattern_regex" > /dev/null; then + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi + done + done + if test -n "$a_deplib" ; then + droppeddeps=yes + echo + echo "*** Warning: This library needs some functionality provided by $a_deplib." + echo "*** I have the capability to make that library automatically link in when" + echo "*** you link to this library. But I can only do this if you have a" + echo "*** shared version of the library, which you do not appear to have." + fi + else + # Add a -L argument. + newdeplibs="$newdeplibs $a_deplib" + fi + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs="" + if $echo "X $deplibs" | $Xsed -e 's/ -lc$//' \ + -e 's/ -[LR][^ ]*//g' -e 's/[ ]//g' | + grep . >/dev/null; then + echo + if test "X$deplibs_check_method" = "Xnone"; then + echo "*** Warning: inter-library dependencies are not supported in this platform." + else + echo "*** Warning: inter-library dependencies are not known to be supported." + fi + echo "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + fi + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + newdeplibs=`$echo "X $newdeplibs" | $Xsed -e 's/ -lc / -framework System /'` + ;; + esac + + if test "$droppeddeps" = yes; then + if test "$module" = yes; then + echo + echo "*** Warning: libtool could not satisfy all declared inter-library" + echo "*** dependencies of module $libname. Therefore, libtool will create" + echo "*** a static module, that should work as long as the dlopening" + echo "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + echo + echo "*** However, this would only work if libtool was able to extract symbol" + echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + echo "*** not find such a program. So, this module is probably useless." + echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + echo "*** The inter-library dependencies that have been dropped here will be" + echo "*** automatically added whenever a program is linked with this library" + echo "*** or is declared to -dlopen it." + + if test $allow_undefined = no; 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 "$build_old_libs" = no; 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 + + # All the library-specific variables (install_libdir is set above). + library_names= + old_library= + dlname= + + # Test again, we may have decided not to build it any more + if test "$build_libtool_libs" = yes; then + if test $hardcode_into_libs = yes; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath="$finalize_rpath" + test "$mode" != relink && rpath="$compile_rpath$rpath" + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + dep_rpath="$dep_rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval 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 + rpath="$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 "$mode" != relink && 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 library_names=\"$library_names_spec\" + set dummy $library_names + realname="$2" + shift; shift + + if test -n "$soname_spec"; then + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + test -z "$dlname" && dlname=$soname + + lib="$output_objdir/$realname" + for link + do + linknames="$linknames $link" + done + + # Ensure that we have .o objects for linkers which dislike .lo + # (e.g. aix) in case we are running --disable-static + for obj in $libobjs; do + xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$obj"; then + xdir="." + else + xdir="$xdir" + fi + baseobj=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` + oldobj=`$echo "X$baseobj" | $Xsed -e "$lo2o"` + if test ! -f $xdir/$oldobj; then + $show "(cd $xdir && ${LN_S} $baseobj $oldobj)" + $run eval '(cd $xdir && ${LN_S} $baseobj $oldobj)' || exit $? + fi + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then + $show "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $run $rm $export_symbols + eval cmds=\"$export_symbols_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + if test -n "$export_symbols_regex"; then + $show "egrep -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"" + $run eval 'egrep -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + $show "$mv \"${export_symbols}T\" \"$export_symbols\"" + $run eval '$mv "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"' + fi + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + else + gentop="$output_objdir/${outputname}x" + $show "${rm}r $gentop" + $run ${rm}r "$gentop" + $show "mkdir $gentop" + $run mkdir "$gentop" + status=$? + if test $status -ne 0 && test ! -d "$gentop"; then + exit $status + fi + generated="$generated $gentop" + + for xlib in $convenience; do + # Extract the objects. + case $xlib in + [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; + *) xabs=`pwd`"/$xlib" ;; + esac + xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` + xdir="$gentop/$xlib" + + $show "${rm}r $xdir" + $run ${rm}r "$xdir" + $show "mkdir $xdir" + $run mkdir "$xdir" + status=$? + if test $status -ne 0 && test ! -d "$xdir"; then + exit $status + fi + $show "(cd $xdir && $AR x $xabs)" + $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? + + libobjs="$libobjs "`find $xdir -name \*.o -print -o -name \*.lo -print | $NL2SP` + done + fi + fi + + if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + linker_flags="$linker_flags $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test "$mode" = relink; then + $run eval '(cd $output_objdir && $rm ${realname}U && $mv $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test -n "$export_symbols" && test -n "$archive_expsym_cmds"; then + eval cmds=\"$archive_expsym_cmds\" + else + eval cmds=\"$archive_cmds\" + fi + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + # Restore the uninstalled library and exit + if test "$mode" = relink; then + $run eval '(cd $output_objdir && $rm ${realname}T && $mv $realname ${realname}T && $mv "$realname"U $realname)' || exit $? + exit 0 + fi + + # Create links to the real library. + for linkname in $linknames; do + if test "$realname" != "$linkname"; then + $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)" + $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $? + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test "$module" = yes || test "$export_dynamic" = yes; then + # On all known operating systems, these are identical. + dlname="$soname" + fi + fi + ;; + + obj) + if test -n "$deplibs"; then + $echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2 + fi + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2 + fi + + if test -n "$rpath"; then + $echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2 + fi + + if test -n "$xrpath"; then + $echo "$modename: warning: \`-R' is ignored for objects" 1>&2 + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for objects" 1>&2 + fi + + case $output in + *.lo) + if test -n "$objs$old_deplibs"; then + $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2 + exit 1 + fi + libobj="$output" + obj=`$echo "X$output" | $Xsed -e "$lo2o"` + ;; + *) + libobj= + obj="$output" + ;; + esac + + # Delete the old objects. + $run $rm $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # reload_cmds runs $LD directly, so let us get rid of + # -Wl from whole_archive_flag_spec + wl= + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval reload_conv_objs=\"\$reload_objs $whole_archive_flag_spec\" + else + gentop="$output_objdir/${obj}x" + $show "${rm}r $gentop" + $run ${rm}r "$gentop" + $show "mkdir $gentop" + $run mkdir "$gentop" + status=$? + if test $status -ne 0 && test ! -d "$gentop"; then + exit $status + fi + generated="$generated $gentop" + + for xlib in $convenience; do + # Extract the objects. + case $xlib in + [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; + *) xabs=`pwd`"/$xlib" ;; + esac + xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` + xdir="$gentop/$xlib" + + $show "${rm}r $xdir" + $run ${rm}r "$xdir" + $show "mkdir $xdir" + $run mkdir "$xdir" + status=$? + if test $status -ne 0 && test ! -d "$xdir"; then + exit $status + fi + $show "(cd $xdir && $AR x $xabs)" + $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? + + reload_conv_objs="$reload_objs "`find $xdir -name \*.o -print -o -name \*.lo -print | $NL2SP` + done + fi + fi + + # Create the old-style object. + reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test + + output="$obj" + eval cmds=\"$reload_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + exit 0 + fi + + if test "$build_libtool_libs" != yes; then + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. + $show "echo timestamp > $libobj" + $run eval "echo timestamp > $libobj" || exit $? + exit 0 + fi + + if test -n "$pic_flag" || test "$pic_mode" != default; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output="$libobj" + eval cmds=\"$reload_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + else + # Just create a symlink. + $show $rm $libobj + $run $rm $libobj + xdir=`$echo "X$libobj" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$libobj"; then + xdir="." + else + xdir="$xdir" + fi + baseobj=`$echo "X$libobj" | $Xsed -e 's%^.*/%%'` + oldobj=`$echo "X$baseobj" | $Xsed -e "$lo2o"` + $show "(cd $xdir && $LN_S $oldobj $baseobj)" + $run eval '(cd $xdir && $LN_S $oldobj $baseobj)' || exit $? + fi + + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + exit 0 + ;; + + prog) + case $host in + *cygwin*) output=`echo $output | sed -e 's,.exe$,,;s,$,.exe,'` ;; + esac + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for programs" 1>&2 + fi + + if test "$preload" = yes; then + if test "$dlopen_support" = unknown && test "$dlopen_self" = unknown && + test "$dlopen_self_static" = unknown; then + $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support." + fi + fi + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$echo "X $compile_deplibs" | $Xsed -e 's/ -lc / -framework System /'` + finalize_deplibs=`$echo "X $finalize_deplibs" | $Xsed -e 's/ -lc / -framework System /'` + ;; + esac + + compile_command="$compile_command $compile_deplibs" + finalize_command="$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 "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) + case :$dllsearchpath: in + *":$libdir:"*) ;; + *) dllsearchpath="$dllsearchpath:$libdir";; + 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"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath="$rpath" + + if test -n "$libobjs" && test "$build_old_libs" = yes; then + # Transform all the library objects into standard objects. + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + fi + + dlsyms= + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + dlsyms="${outputname}S.c" + else + $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2 + fi + fi + + if test -n "$dlsyms"; then + case $dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist="$output_objdir/${outputname}.nm" + + $show "$rm $nlist ${nlist}S ${nlist}T" + $run $rm "$nlist" "${nlist}S" "${nlist}T" + + # Parse the name list into a source file. + $show "creating $output_objdir/$dlsyms" + + test -z "$run" && $echo > "$output_objdir/$dlsyms" "\ +/* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */ +/* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +/* Prevent the only kind of declaration conflicts we can make. */ +#define lt_preloaded_symbols some_other_symbol + +/* External symbol declarations for the compiler. */\ +" + + if test "$dlself" = yes; then + $show "generating symbol list for \`$output'" + + test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$echo "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + for arg in $progfiles; do + $show "extracting global C symbols from \`$arg'" + $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $run eval 'egrep -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + $run eval '$mv "$nlist"T "$nlist"' + fi + + if test -n "$export_symbols_regex"; then + $run eval 'egrep -e "$export_symbols_regex" "$nlist" > "$nlist"T' + $run eval '$mv "$nlist"T "$nlist"' + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols="$output_objdir/$output.exp" + $run $rm $export_symbols + $run eval "sed -n -e '/^: @PROGRAM@$/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + else + $run eval "sed -e 's/\([][.*^$]\)/\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$output.exp"' + $run eval 'grep -f "$output_objdir/$output.exp" < "$nlist" > "$nlist"T' + $run eval 'mv "$nlist"T "$nlist"' + fi + fi + + for arg in $dlprefiles; do + $show "extracting global C symbols from \`$arg'" + name=`echo "$arg" | sed -e 's%^.*/%%'` + $run eval 'echo ": $name " >> "$nlist"' + $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" + done + + if test -z "$run"; then + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + egrep -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $mv "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if grep -v "^: " < "$nlist" | sort +2 | uniq > "$nlist"S; then + : + else + grep -v "^: " < "$nlist" > "$nlist"S + fi + + if test -f "$nlist"S; then + eval "$global_symbol_to_cdecl"' < "$nlist"S >> "$output_objdir/$dlsyms"' + else + echo '/* NONE */' >> "$output_objdir/$dlsyms" + fi + + $echo >> "$output_objdir/$dlsyms" "\ + +#undef lt_preloaded_symbols + +#if defined (__STDC__) && __STDC__ +# define lt_ptr_t void * +#else +# define lt_ptr_t char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + lt_ptr_t address; +} +lt_preloaded_symbols[] = +{\ +" + + sed -n -e 's/^: \([^ ]*\) $/ {\"\1\", (lt_ptr_t) 0},/p' \ + -e 's/^. \([^ ]*\) \([^ ]*\)$/ {"\2", (lt_ptr_t) \&\2},/p' \ + < "$nlist" >> "$output_objdir/$dlsyms" + + $echo >> "$output_objdir/$dlsyms" "\ + {0, (lt_ptr_t) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + fi + + pic_flag_for_symtable= + case $host in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + case "$compile_command " in + *" -static "*) ;; + *) pic_flag_for_symtable=" $pic_flag -DPIC -DFREEBSD_WORKAROUND";; + esac;; + *-*-hpux*) + case "$compile_command " in + *" -static "*) ;; + *) pic_flag_for_symtable=" $pic_flag -DPIC";; + esac + esac + + # Now compile the dynamic symbol file. + $show "(cd $output_objdir && $CC -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")" + $run eval '(cd $output_objdir && $CC -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $? + + # Clean up the generated files. + $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T" + $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T" + + # Transform the symbol file into the correct name. + compile_command=`$echo "X$compile_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` + finalize_command=`$echo "X$finalize_command" | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%"` + ;; + *) + $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2 + exit 1 + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$echo "X$compile_command" | $Xsed -e "s% @SYMFILE@%%"` + finalize_command=`$echo "X$finalize_command" | $Xsed -e "s% @SYMFILE@%%"` + fi + + if test $need_relink = no || test "$build_libtool_libs" != yes; then + # Replace the output file specification. + compile_command=`$echo "X$compile_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + link_command="$compile_command$compile_rpath" + + # We have no uninstalled library dependencies, so finalize right now. + $show "$link_command" + $run eval "$link_command" + status=$? + + # Delete the generated files. + if test -n "$dlsyms"; then + $show "$rm $output_objdir/${outputname}S.${objext}" + $run $rm "$output_objdir/${outputname}S.${objext}" + fi + + exit $status + fi + + if test -n "$shlibpath_var"; then + # We should set the shlibpath_var + rpath= + for dir in $temp_rpath; do + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) + # Absolute path. + rpath="$rpath$dir:" + ;; + *) + # Relative path: add a thisdir entry. + rpath="$rpath\$thisdir/$dir:" + ;; + esac + done + temp_rpath="$rpath" + fi + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath="$rpath$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + rpath="$rpath$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test "$no_install" = yes; 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 "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $run $rm $output + # Link the executable and exit + $show "$link_command" + $run eval "$link_command" || exit $? + exit 0 + fi + + if test "$hardcode_action" = relink; then + # Fast installation is not supported + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + + $echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2 + $echo "$modename: \`$output' will be relinked during installation" 1>&2 + else + if test "$fast_install" != no; then + link_command="$finalize_var$compile_command$finalize_rpath" + if test "$fast_install" = yes; then + relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g'` + else + # fast_install is set to needless + relink_command= + fi + else + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + fi + fi + + # Replace the output file specification. + link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname + + $show "$link_command" + $run eval "$link_command" || exit $? + + # Now create the wrapper script. + $show "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + # 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}\" || 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 + var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` + relink_command="$var=\"$var_value\"; export $var; $relink_command" + fi + done + relink_command="cd `pwd`; $relink_command" + relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"` + fi + + # Quote $echo for shipping. + if test "X$echo" = "X$SHELL $0 --fallback-echo"; then + case $0 in + [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $0 --fallback-echo";; + *) qecho="$SHELL `pwd`/$0 --fallback-echo";; + esac + qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"` + else + qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"` + fi + + # Only actually do things if our run command is non-null. + if test -z "$run"; then + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) output=`echo $output|sed 's,.exe$,,'` ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) exeext=.exe ;; + *) exeext= ;; + esac + $rm $output + trap "$rm $output; exit 1" 1 2 15 + + $echo > $output "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP +# +# The $output program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='sed -e 1s/^X//' +sed_quote_subst='$sed_quote_subst' + +# The HP-UX ksh and POSIX shell print the target directory to stdout +# if CDPATH is set. +if test \"\${CDPATH+set}\" = set; then CDPATH=:; export CDPATH; fi + +relink_command=\"$relink_command\" + +# This environment variable determines our operation mode. +if test \"\$libtool_install_magic\" = \"$magic\"; then + # install mode needs the following variable: + 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 + echo=\"$qecho\" + file=\"\$0\" + # Make sure echo works. + if test \"X\$1\" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift + elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then + # Yippee, \$echo works! + : + else + # Restart under the correct shell, and then maybe \$echo will work. + exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"} + fi + fi\ +" + $echo >> $output "\ + + # Find the directory that this script lives in. + thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | sed -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | sed -n 's/.*-> //p'\` + done + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test "$fast_install" = yes; then + echo >> $output "\ + program=lt-'$outputname'$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 >> $output "\ + + # relink executable if necessary + if test -n \"\$relink_command\"; then + if (eval \$relink_command); then : + else + $rm \"\$progdir/\$file\" + exit 1 + fi + fi + + $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $rm \"\$progdir/\$program\"; + $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $rm \"\$progdir/\$file\" + fi" + else + echo >> $output "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + echo >> $output "\ + + if test -f \"\$progdir/\$program\"; then" + + # Export our shlibpath_var if we have one. + if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $echo >> $output "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` + + export $shlibpath_var +" + fi + + # fixup the dll searchpath if we need to. + if test -n "$dllsearchpath"; then + $echo >> $output "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + $echo >> $output "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. +" + case $host in + # win32 systems need to use the prog path for dll + # lookup to work + *-*-cygwin* | *-*-pw32*) + $echo >> $output "\ + exec \$progdir/\$program \${1+\"\$@\"} +" + ;; + + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2*) + $echo >> $output "\ + exec \$progdir\\\\\$program \${1+\"\$@\"} +" + ;; + + *) + $echo >> $output "\ + # Export the path to the program. + PATH=\"\$progdir:\$PATH\" + export PATH + + exec \$program \${1+\"\$@\"} +" + ;; + esac + $echo >> $output "\ + \$echo \"\$0: cannot exec \$program \${1+\"\$@\"}\" + exit 1 + fi + else + # The program doesn't exist. + \$echo \"\$0: error: \$progdir/\$program does not exist\" 1>&2 + \$echo \"This script is just a wrapper for \$program.\" 1>&2 + echo \"See the $PACKAGE documentation for more information.\" 1>&2 + exit 1 + fi +fi\ +" + chmod +x $output + fi + exit 0 + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + if test "$build_libtool_libs" = convenience; then + oldobjs="$libobjs_save" + addlibs="$convenience" + build_libtool_libs=no + else + if test "$build_libtool_libs" = module; then + oldobjs="$libobjs_save" + build_libtool_libs=no + else + oldobjs="$objs$old_deplibs "`$echo "X$libobjs_save" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP` + fi + addlibs="$old_convenience" + fi + + if test -n "$addlibs"; then + gentop="$output_objdir/${outputname}x" + $show "${rm}r $gentop" + $run ${rm}r "$gentop" + $show "mkdir $gentop" + $run mkdir "$gentop" + status=$? + if test $status -ne 0 && test ! -d "$gentop"; then + exit $status + fi + generated="$generated $gentop" + + # Add in members from convenience archives. + for xlib in $addlibs; do + # Extract the objects. + case $xlib in + [\\/]* | [A-Za-z]:[\\/]*) xabs="$xlib" ;; + *) xabs=`pwd`"/$xlib" ;; + esac + xlib=`$echo "X$xlib" | $Xsed -e 's%^.*/%%'` + xdir="$gentop/$xlib" + + $show "${rm}r $xdir" + $run ${rm}r "$xdir" + $show "mkdir $xdir" + $run mkdir "$xdir" + status=$? + if test $status -ne 0 && test ! -d "$xdir"; then + exit $status + fi + $show "(cd $xdir && $AR x $xabs)" + $run eval "(cd \$xdir && $AR x \$xabs)" || exit $? + + oldobjs="$oldobjs "`find $xdir -name \*.${objext} -print -o -name \*.lo -print | $NL2SP` + done + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then + eval cmds=\"$old_archive_from_new_cmds\" + else + # Ensure that we have .o objects in place in case we decided + # not to build a shared library, and have fallen back to building + # static libs even though --disable-static was passed! + for oldobj in $oldobjs; do + if test ! -f $oldobj; then + xdir=`$echo "X$oldobj" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$oldobj"; then + xdir="." + else + xdir="$xdir" + fi + baseobj=`$echo "X$oldobj" | $Xsed -e 's%^.*/%%'` + obj=`$echo "X$baseobj" | $Xsed -e "$o2lo"` + $show "(cd $xdir && ${LN_S} $obj $baseobj)" + $run eval '(cd $xdir && ${LN_S} $obj $baseobj)' || exit $? + fi + done + + eval cmds=\"$old_archive_cmds\" + fi + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + done + + if test -n "$generated"; then + $show "${rm}r$generated" + $run ${rm}r$generated + fi + + # Now create the libtool archive. + case $output in + *.la) + old_library= + test "$build_old_libs" = yes && old_library="$libname.$libext" + $show "creating $output" + + # 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}\" || 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 + var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` + relink_command="$var=\"$var_value\"; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + relink_command="cd `pwd`; $SHELL $0 --mode=relink $libtool_args" + relink_command=`$echo "X$relink_command" | $Xsed -e "$sed_quote_subst"` + + # Only create the output if not a dry run. + if test -z "$run"; then + for installed in no yes; do + if test "$installed" = yes; then + if test -z "$install_libdir"; then + break + fi + output="$output_objdir/$outputname"i + # Replace all uninstalled libtool libraries with the installed ones + newdependency_libs= + for deplib in $dependency_libs; do + case $deplib in + *.la) + name=`$echo "X$deplib" | $Xsed -e 's%^.*/%%'` + eval libdir=`sed -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + if test -z "$libdir"; then + $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 + exit 1 + fi + newdependency_libs="$newdependency_libs $libdir/$name" + ;; + *) newdependency_libs="$newdependency_libs $deplib" ;; + esac + done + dependency_libs="$newdependency_libs" + newdlfiles= + for lib in $dlfiles; do + name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` + eval libdir=`sed -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + if test -z "$libdir"; then + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit 1 + fi + newdlfiles="$newdlfiles $libdir/$name" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` + eval libdir=`sed -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + if test -z "$libdir"; then + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit 1 + fi + newdlprefiles="$newdlprefiles $libdir/$name" + done + dlprefiles="$newdlprefiles" + fi + $rm $output + # place dlname in correct position for cygwin + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; + esac + $echo > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='$tdlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# Files to dlopen/dlpreopen +dlopen='$dlfiles' +dlpreopen='$dlprefiles' + +# Directory that this library needs to be installed in: +libdir='$install_libdir'" + if test "$installed" = no && test $need_relink = yes; then + $echo >> $output "\ +relink_command=\"$relink_command\"" + fi + done + fi + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" + $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $? + ;; + esac + exit 0 + ;; + + # libtool install mode + install) + modename="$modename: install" + + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || + # Allow the use of GNU shtool's install command. + $echo "X$nonopt" | $Xsed | grep shtool > /dev/null; then + # Aesthetically quote it. + arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) + arg="\"$arg\"" + ;; + esac + install_prog="$arg " + arg="$1" + shift + else + install_prog= + arg="$nonopt" + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) + arg="\"$arg\"" + ;; + esac + install_prog="$install_prog$arg" + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=no + stripme= + for arg + do + if test -n "$dest"; then + files="$files $dest" + dest="$arg" + continue + fi + + case $arg in + -d) isdir=yes ;; + -f) prev="-f" ;; + -g) prev="-g" ;; + -m) prev="-m" ;; + -o) prev="-o" ;; + -s) + stripme=" -s" + continue + ;; + -*) ;; + + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + prev= + else + dest="$arg" + continue + fi + ;; + esac + + # Aesthetically quote the argument. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*) + arg="\"$arg\"" + ;; + esac + install_prog="$install_prog $arg" + done + + if test -z "$install_prog"; then + $echo "$modename: you must specify an install program" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + if test -n "$prev"; then + $echo "$modename: the \`$prev' option requires an argument" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + if test -z "$files"; then + if test -z "$dest"; then + $echo "$modename: no file or destination specified" 1>&2 + else + $echo "$modename: you must specify a destination" 1>&2 + fi + $echo "$help" 1>&2 + exit 1 + fi + + # Strip any trailing slash from the destination. + dest=`$echo "X$dest" | $Xsed -e 's%/$%%'` + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=yes + if test "$isdir" = yes; then + destdir="$dest" + destname= + else + destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'` + test "X$destdir" = "X$dest" && destdir=. + destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'` + + # Not a directory, so check to see that there is only one file specified. + set dummy $files + if test $# -gt 2; then + $echo "$modename: \`$dest' is not a directory" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2 + $echo "$help" 1>&2 + exit 1 + ;; + esac + done + ;; + esac + + # This variable tells wrapper scripts just to set variables rather + # than running their programs. + libtool_install_magic="$magic" + + staticlibs= + future_libdirs= + current_libdirs= + for file in $files; do + + # Do each installation. + case $file in + *.$libext) + # Do the static libraries later. + staticlibs="$staticlibs $file" + ;; + + *.la) + # Check to see that this really is a libtool archive. + if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$file' is not a valid libtool archive" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + library_names= + old_library= + relink_command= + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) current_libdirs="$current_libdirs $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) future_libdirs="$future_libdirs $libdir" ;; + esac + fi + + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/ + test "X$dir" = "X$file/" && dir= + dir="$dir$objdir" + + if test -n "$relink_command"; then + $echo "$modename: warning: relinking \`$file'" 1>&2 + $show "$relink_command" + if $run eval "$relink_command"; then : + else + $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 + continue + fi + fi + + # See the names of the shared library. + set dummy $library_names + if test -n "$2"; then + realname="$2" + shift + shift + + srcname="$realname" + test -n "$relink_command" && srcname="$realname"T + + # Install the shared library and build the symlinks. + $show "$install_prog $dir/$srcname $destdir/$realname" + $run eval "$install_prog $dir/$srcname $destdir/$realname" || exit $? + if test -n "$stripme" && test -n "$striplib"; then + $show "$striplib $destdir/$realname" + $run eval "$striplib $destdir/$realname" || exit $? + fi + + if test $# -gt 0; then + # Delete the old symlinks, and create new ones. + for linkname + do + if test "$linkname" != "$realname"; then + $show "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)" + $run eval "(cd $destdir && $rm $linkname && $LN_S $realname $linkname)" + fi + done + fi + + # Do each command in the postinstall commands. + lib="$destdir/$realname" + eval cmds=\"$postinstall_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + + # Install the pseudo-library for information purposes. + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + instname="$dir/$name"i + $show "$install_prog $instname $destdir/$name" + $run eval "$install_prog $instname $destdir/$name" || exit $? + + # Maybe install the static library, too. + test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + destfile="$destdir/$destfile" + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"` + ;; + *.$objext) + staticdest="$destfile" + destfile= + ;; + *) + $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2 + $echo "$help" 1>&2 + exit 1 + ;; + esac + + # Install the libtool object if requested. + if test -n "$destfile"; then + $show "$install_prog $file $destfile" + $run eval "$install_prog $file $destfile" || exit $? + fi + + # Install the old object if enabled. + if test "$build_old_libs" = yes; then + # Deduce the name of the old-style object file. + staticobj=`$echo "X$file" | $Xsed -e "$lo2o"` + + $show "$install_prog $staticobj $staticdest" + $run eval "$install_prog \$staticobj \$staticdest" || exit $? + fi + exit 0 + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + destfile="$destdir/$destfile" + fi + + # Do a test to see if this is really a libtool program. + if (sed -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + notinst_deplibs= + relink_command= + + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Check the variables that should have been set. + if test -z "$notinst_deplibs"; then + $echo "$modename: invalid libtool wrapper script \`$file'" 1>&2 + exit 1 + fi + + finalize=yes + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + # If there is no directory component, then add one. + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + fi + libfile="$libdir/"`$echo "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test + if test -n "$libdir" && test ! -f "$libfile"; then + $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2 + finalize=no + fi + done + + relink_command= + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + outputname= + if test "$fast_install" = no && test -n "$relink_command"; then + if test "$finalize" = yes && test -z "$run"; then + tmpdir="/tmp" + test -n "$TMPDIR" && tmpdir="$TMPDIR" + tmpdir="$tmpdir/libtool-$$" + if $mkdir -p "$tmpdir" && chmod 700 "$tmpdir"; then : + else + $echo "$modename: error: cannot create temporary directory \`$tmpdir'" 1>&2 + continue + fi + file=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + outputname="$tmpdir/$file" + # Replace the output file specification. + relink_command=`$echo "X$relink_command" | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g'` + + $show "$relink_command" + if $run eval "$relink_command"; then : + else + $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 + ${rm}r "$tmpdir" + continue + fi + file="$outputname" + else + $echo "$modename: warning: cannot relink \`$file'" 1>&2 + fi + else + # Install the binary that we compiled earlier. + file=`$echo "X$file" | $Xsed -e "s%\([^/]*\)$%$objdir/\1%"` + fi + fi + + # remove .exe since cygwin /usr/bin/install will append another + # one anyways + case $install_prog,$host in + /usr/bin/install*,*cygwin*) + case $file:$destfile in + *.exe:*.exe) + # this is ok + ;; + *.exe:*) + destfile=$destfile.exe + ;; + *:*.exe) + destfile=`echo $destfile | sed -e 's,.exe$,,'` + ;; + esac + ;; + esac + $show "$install_prog$stripme $file $destfile" + $run eval "$install_prog\$stripme \$file \$destfile" || exit $? + test -n "$outputname" && ${rm}r "$tmpdir" + ;; + esac + done + + for file in $staticlibs; do + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + + # Set up the ranlib parameters. + oldlib="$destdir/$name" + + $show "$install_prog $file $oldlib" + $run eval "$install_prog \$file \$oldlib" || exit $? + + if test -n "$stripme" && test -n "$striplib"; then + $show "$old_striplib $oldlib" + $run eval "$old_striplib $oldlib" || exit $? + fi + + # Do each command in the postinstall commands. + eval cmds=\"$old_postinstall_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + done + + if test -n "$future_libdirs"; then + $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2 + fi + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + test -n "$run" && current_libdirs=" -n$current_libdirs" + exec $SHELL $0 --finish$current_libdirs + exit 1 + fi + + exit 0 + ;; + + # libtool finish mode + finish) + modename="$modename: finish" + libdirs="$nonopt" + admincmds= + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for dir + do + libdirs="$libdirs $dir" + done + + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + eval cmds=\"$finish_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || admincmds="$admincmds + $cmd" + done + IFS="$save_ifs" + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $run eval "$cmds" || admincmds="$admincmds + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + test "$show" = ":" && exit 0 + + echo "----------------------------------------------------------------------" + echo "Libraries have been installed in:" + for libdir in $libdirs; do + echo " $libdir" + done + echo + echo "If you ever happen to want to link against installed libraries" + echo "in a given directory, LIBDIR, you must either use libtool, and" + echo "specify the full pathname of the library, or use 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" + echo "more information, such as the ld(1) and ld.so(8) manual pages." + echo "----------------------------------------------------------------------" + exit 0 + ;; + + # libtool execute mode + execute) + modename="$modename: execute" + + # The first argument is the command name. + cmd="$nonopt" + if test -z "$cmd"; then + $echo "$modename: you must specify a COMMAND" 1>&2 + $echo "$help" + exit 1 + fi + + # Handle -dlopen flags immediately. + for file in $execute_dlfiles; do + if test ! -f "$file"; then + $echo "$modename: \`$file' is not a file" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + dir= + case $file in + *.la) + # Check to see that this really is a libtool archive. + if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + # Read the libtool library. + dlname= + library_names= + + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'" + continue + fi + + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$file" && dir=. + + if test -f "$dir/$objdir/$dlname"; then + dir="$dir/$objdir" + else + $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2 + exit 1 + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$file" && dir=. + ;; + + *) + $echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2 + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir="$absdir" + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic="$magic" + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case $file in + -*) ;; + *) + # Do a test to see if this is really a libtool program. + if (sed -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Transform arg to wrapped name. + file="$progdir/$program" + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"` + args="$args \"$file\"" + done + + if test -z "$run"; then + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved enviroment variables + if test "${save_LC_ALL+set}" = set; then + LC_ALL="$save_LC_ALL"; export LC_ALL + fi + if test "${save_LANG+set}" = set; then + LANG="$save_LANG"; export LANG + fi + + # Now actually exec the command. + eval "exec \$cmd$args" + + $echo "$modename: cannot exec \$cmd$args" + exit 1 + else + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\"" + $echo "export $shlibpath_var" + fi + $echo "$cmd$args" + exit 0 + fi + ;; + + # libtool clean and uninstall mode + clean | uninstall) + modename="$modename: $mode" + rm="$nonopt" + files= + rmforce= + 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) rm="$rm $arg"; rmforce=yes ;; + -*) rm="$rm $arg" ;; + *) files="$files $arg" ;; + esac + done + + if test -z "$rm"; then + $echo "$modename: you must specify an RM program" 1>&2 + $echo "$help" 1>&2 + exit 1 + fi + + rmdirs= + + for file in $files; do + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + if test "X$dir" = "X$file"; then + dir=. + objdir="$objdir" + else + objdir="$dir/$objdir" + fi + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + test $mode = uninstall && objdir="$dir" + + # Remember objdir for removal later, being careful to avoid duplicates + if test $mode = clean; then + case " $rmdirs " in + *" $objdir "*) ;; + *) rmdirs="$rmdirs $objdir" ;; + 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 test "$rmforce" = yes; then + continue + fi + + rmfiles="$file" + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if (sed -e '2q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + . $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + rmfiles="$rmfiles $objdir/$n" + done + test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library" + test $mode = clean && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" + + if test $mode = uninstall; then + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + eval cmds=\"$postuninstall_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" + if test $? != 0 && test "$rmforce" != yes; then + exit_status=1 + fi + done + IFS="$save_ifs" + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + eval cmds=\"$old_postuninstall_cmds\" + IFS="${IFS= }"; save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" + if test $? != 0 && test "$rmforce" != yes; then + exit_status=1 + fi + done + IFS="$save_ifs" + fi + # FIXME: should reinstall the best remaining shared library. + fi + fi + ;; + + *.lo) + if test "$build_old_libs" = yes; then + oldobj=`$echo "X$name" | $Xsed -e "$lo2o"` + rmfiles="$rmfiles $dir/$oldobj" + fi + ;; + + *) + # Do a test to see if this is a libtool program. + if test $mode = clean && + (sed -e '4q' $file | egrep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + relink_command= + . $dir/$file + + rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" + if test "$fast_install" = yes && test -n "$relink_command"; then + rmfiles="$rmfiles $objdir/lt-$name" + fi + fi + ;; + esac + $show "$rm $rmfiles" + $run $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 + $show "rmdir $dir" + $run rmdir $dir >/dev/null 2>&1 + fi + done + + exit $exit_status + ;; + + "") + $echo "$modename: you must specify a MODE" 1>&2 + $echo "$generic_help" 1>&2 + exit 1 + ;; + esac + + $echo "$modename: invalid operation mode \`$mode'" 1>&2 + $echo "$generic_help" 1>&2 + exit 1 +fi # test -z "$show_help" + +# We need to display help for each of the modes. +case $mode in +"") $echo \ +"Usage: $modename [OPTION]... [MODE-ARG]... + +Provide generalized library-building support services. + + --config show all configuration variables + --debug enable verbose shell tracing +-n, --dry-run display commands without modifying any files + --features display basic configuration information and exit + --finish same as \`--mode=finish' + --help display this help message and exit + --mode=MODE use operation mode MODE [default=inferred from MODE-ARGS] + --quiet same as \`--silent' + --silent don't print informational messages + --version print version information + +MODE must be one of the following: + + 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. Try \`$modename --help --mode=MODE' for +a more detailed description of MODE." + exit 0 + ;; + +clean) + $echo \ +"Usage: $modename [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: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -prefer-pic try to building PIC objects only + -prefer-non-pic try to building non-PIC objects only + -static always build a \`.o' file suitable for static linking + +COMPILE-COMMAND is a command to be used in creating a \`standard' object file +from the given SOURCEFILE. + +The output file name is determined by removing the directory component from +SOURCEFILE, then substituting the C source code suffix \`.c' with the +library object suffix, \`.lo'." + ;; + +execute) + $echo \ +"Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]... + +Automatically set library path, then run a program. + +This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + +This mode sets the library path environment variable according to \`-dlopen' +flags. + +If any of the ARGS are libtool executable wrappers, then they are translated +into their corresponding uninstalled binary, and any of their required library +directories are added to the library path. + +Then, COMMAND is executed, with ARGS as arguments." + ;; + +finish) + $echo \ +"Usage: $modename [OPTION]... --mode=finish [LIBDIR]... + +Complete the installation of libtool libraries. + +Each LIBDIR is a directory that contains libtool libraries. + +The commands that this mode executes may require superuser privileges. Use +the \`--dry-run' option if you just want to see what would be executed." + ;; + +install) + $echo \ +"Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND... + +Install executables or libraries. + +INSTALL-COMMAND is the installation command. The first component should be +either the \`install' or \`cp' program. + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + +link) + $echo \ +"Usage: $modename [OPTION]... --mode=link LINK-COMMAND... + +Link object files or libraries together to form another library, or to +create an executable program. + +LINK-COMMAND is a command using the C compiler that you would use to create +a program from several object files. + +The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-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 + -release RELEASE specify package release information + -rpath LIBDIR the created library will eventually be installed in LIBDIR + -R[ ]LIBDIR add LIBDIR to the runtime path of programs and libraries + -static do not do any dynamic linking of libtool libraries + -version-info CURRENT[:REVISION[:AGE]] + specify library version info [each variable defaults to 0] + +All other options (arguments beginning with \`-') are ignored. + +Every other argument is treated as a filename. Files ending in \`.la' are +treated as uninstalled libtool libraries, other files are standard or library +object files. + +If the OUTPUT-FILE ends in \`.la', then a libtool library is created, +only library objects (\`.lo' files) may be specified, and \`-rpath' is +required, except when creating a convenience library. + +If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created +using \`ar' and \`ranlib', or on Windows using \`lib'. + +If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file +is created, otherwise an executable program is created." + ;; + +uninstall) + $echo \ +"Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + +Remove libraries from an installation directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, all the files associated with it are deleted. +Otherwise, only FILE itself is deleted using RM." + ;; + +*) + $echo "$modename: invalid operation mode \`$mode'" 1>&2 + $echo "$help" 1>&2 + exit 1 + ;; +esac + +echo +$echo "Try \`$modename --help' for more information about other modes." + +exit 0 + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/maketables.c b/rubbos/app/httpd-2.0.64/srclib/pcre/maketables.c new file mode 100644 index 00000000..01078f19 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/maketables.c @@ -0,0 +1,132 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* +PCRE is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. + +Written by: Philip Hazel + + Copyright (c) 1997-2001 University of Cambridge + +----------------------------------------------------------------------------- +Permission is granted to anyone to use this software for any purpose on any +computer system, and to redistribute it freely, subject to the following +restrictions: + +1. This software is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +2. The origin of this software must not be misrepresented, either by + explicit claim or by omission. + +3. Altered versions must be plainly marked as such, and must not be + misrepresented as being the original software. + +4. If PCRE is embedded in any software that is released under the GNU + General Purpose Licence (GPL), then the terms of that licence shall + supersede any condition above with which it is incompatible. +----------------------------------------------------------------------------- + +See the file Tech.Notes for some information on the internals. +*/ + + +/* This file is compiled on its own as part of the PCRE library. However, +it is also included in the compilation of dftables.c, in which case the macro +DFTABLES is defined. */ + +#ifndef DFTABLES +#include "internal.h" +#endif + + + +/************************************************* +* Create PCRE character tables * +*************************************************/ + +/* This function builds a set of character tables for use by PCRE and returns +a pointer to them. They are build using the ctype functions, and consequently +their contents will depend upon the current locale setting. When compiled as +part of the library, the store is obtained via pcre_malloc(), but when compiled +inside dftables, use malloc(). + +Arguments: none +Returns: pointer to the contiguous block of data +*/ + +const unsigned char * +pcre_maketables(void) +{ +unsigned char *yield, *p; +int i; + +#ifndef DFTABLES +yield = (unsigned char*)(pcre_malloc)(tables_length); +#else +yield = (unsigned char*)malloc(tables_length); +#endif + +if (yield == NULL) return NULL; +p = yield; + +/* First comes the lower casing table */ + +for (i = 0; i < 256; i++) *p++ = tolower(i); + +/* Next the case-flipping table */ + +for (i = 0; i < 256; i++) *p++ = islower(i)? toupper(i) : tolower(i); + +/* Then the character class tables. Don't try to be clever and save effort +on exclusive ones - in some locales things may be different. */ + +memset(p, 0, cbit_length); +for (i = 0; i < 256; i++) + { + if (isdigit(i)) + { + p[cbit_digit + i/8] |= 1 << (i&7); + p[cbit_word + i/8] |= 1 << (i&7); + } + if (isupper(i)) + { + p[cbit_upper + i/8] |= 1 << (i&7); + p[cbit_word + i/8] |= 1 << (i&7); + } + if (islower(i)) + { + p[cbit_lower + i/8] |= 1 << (i&7); + p[cbit_word + i/8] |= 1 << (i&7); + } + if (i == '_') p[cbit_word + i/8] |= 1 << (i&7); + if (isspace(i)) p[cbit_space + i/8] |= 1 << (i&7); + if (isxdigit(i))p[cbit_xdigit + i/8] |= 1 << (i&7); + if (isgraph(i)) p[cbit_graph + i/8] |= 1 << (i&7); + if (isprint(i)) p[cbit_print + i/8] |= 1 << (i&7); + if (ispunct(i)) p[cbit_punct + i/8] |= 1 << (i&7); + if (iscntrl(i)) p[cbit_cntrl + i/8] |= 1 << (i&7); + } +p += cbit_length; + +/* Finally, the character type table */ + +for (i = 0; i < 256; i++) + { + int x = 0; + if (isspace(i)) x += ctype_space; + if (isalpha(i)) x += ctype_letter; + if (isdigit(i)) x += ctype_digit; + if (isxdigit(i)) x += ctype_xdigit; + if (isalnum(i) || i == '_') x += ctype_word; + if (strchr("*+?{^.$|()[", i) != 0) x += ctype_meta; + *p++ = x; + } + +return yield; +} + +/* End of maketables.c */ diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/maketables.lo b/rubbos/app/httpd-2.0.64/srclib/pcre/maketables.lo new file mode 100644 index 00000000..9fa5e2c4 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/maketables.lo @@ -0,0 +1,12 @@ +# maketables.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/maketables.o' + +# Name of the non-PIC object. +non_pic_object='maketables.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/maketables.o b/rubbos/app/httpd-2.0.64/srclib/pcre/maketables.o new file mode 100644 index 0000000000000000000000000000000000000000..9477e1c68e18457b992ff440fb2304c0f1803bd6 GIT binary patch literal 11272 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 +# Created: 1993-05-16 +# Public domain + +# $Id: mkinstalldirs 106449 2004-11-24 19:31:09Z nd $ + +errstatus=0 + +for file +do + set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` + shift + + pathcomp= + for d + do + pathcomp="$pathcomp$d" + case "$pathcomp" in + -* ) pathcomp=./$pathcomp ;; + esac + + if test ! -d "$pathcomp"; then + echo "mkdir $pathcomp" + + mkdir "$pathcomp" || lasterr=$? + + if test ! -d "$pathcomp"; then + errstatus=$lasterr + fi + fi + + pathcomp="$pathcomp/" + done +done + +exit $errstatus + +# mkinstalldirs ends here diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/pcre-config b/rubbos/app/httpd-2.0.64/srclib/pcre/pcre-config new file mode 100755 index 00000000..f91d8629 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/pcre-config @@ -0,0 +1,59 @@ +#!/bin/sh + +prefix=/bottlenecks/rubbos/app/apache2 +exec_prefix=/bottlenecks/rubbos/app/apache2 +exec_prefix_set=no + +usage="\ +Usage: pcre-config [--prefix] [--exec-prefix] [--version] [--libs] [--libs-posix] [--cflags] [--cflags-posix]" + +if test $# -eq 0; then + echo "${usage}" 1>&2 + exit 1 +fi + +while test $# -gt 0; do + case "$1" in + -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;; + *) optarg= ;; + esac + + case $1 in + --prefix=*) + prefix=$optarg + if test $exec_prefix_set = no ; then + exec_prefix=$optarg + fi + ;; + --prefix) + echo $prefix + ;; + --exec-prefix=*) + exec_prefix=$optarg + exec_prefix_set=yes + ;; + --exec-prefix) + echo $exec_prefix + ;; + --version) + echo 3.9 + ;; + --cflags | --cflags-posix) + if test /bottlenecks/rubbos/app/apache2/include != /usr/include ; then + includes=-I/bottlenecks/rubbos/app/apache2/include + fi + echo $includes + ;; + --libs-posix) + echo -L${prefix}/lib -lpcreposix -lpcre + ;; + --libs) + echo -L${prefix}/lib -lpcre + ;; + *) + echo "${usage}" 1>&2 + exit 1 + ;; + esac + shift +done diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/pcre-config.in b/rubbos/app/httpd-2.0.64/srclib/pcre/pcre-config.in new file mode 100644 index 00000000..8daded9f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/pcre-config.in @@ -0,0 +1,59 @@ +#!/bin/sh + +prefix=@prefix@ +exec_prefix=@exec_prefix@ +exec_prefix_set=no + +usage="\ +Usage: pcre-config [--prefix] [--exec-prefix] [--version] [--libs] [--libs-posix] [--cflags] [--cflags-posix]" + +if test $# -eq 0; then + echo "${usage}" 1>&2 + exit 1 +fi + +while test $# -gt 0; do + case "$1" in + -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;; + *) optarg= ;; + esac + + case $1 in + --prefix=*) + prefix=$optarg + if test $exec_prefix_set = no ; then + exec_prefix=$optarg + fi + ;; + --prefix) + echo $prefix + ;; + --exec-prefix=*) + exec_prefix=$optarg + exec_prefix_set=yes + ;; + --exec-prefix) + echo $exec_prefix + ;; + --version) + echo @PCRE_VERSION@ + ;; + --cflags | --cflags-posix) + if test @includedir@ != /usr/include ; then + includes=-I@includedir@ + fi + echo $includes + ;; + --libs-posix) + echo -L@libdir@ -lpcreposix -lpcre + ;; + --libs) + echo -L@libdir@ -lpcre + ;; + *) + echo "${usage}" 1>&2 + exit 1 + ;; + esac + shift +done diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/pcre.c b/rubbos/app/httpd-2.0.64/srclib/pcre/pcre.c new file mode 100644 index 00000000..56e1b106 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/pcre.c @@ -0,0 +1,5185 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* +This is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. See +the file Tech.Notes for some information on the internals. + +Written by: Philip Hazel + + Copyright (c) 1997-2001 University of Cambridge + +----------------------------------------------------------------------------- +Permission is granted to anyone to use this software for any purpose on any +computer system, and to redistribute it freely, subject to the following +restrictions: + +1. This software is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +2. The origin of this software must not be misrepresented, either by + explicit claim or by omission. + +3. Altered versions must be plainly marked as such, and must not be + misrepresented as being the original software. + +4. If PCRE is embedded in any software that is released under the GNU + General Purpose Licence (GPL), then the terms of that licence shall + supersede any condition above with which it is incompatible. +----------------------------------------------------------------------------- +*/ + + +/* Define DEBUG to get debugging output on stdout. */ + +/* #define DEBUG */ + +/* Use a macro for debugging printing, 'cause that eliminates the use of #ifdef +inline, and there are *still* stupid compilers about that don't like indented +pre-processor statements. I suppose it's only been 10 years... */ + +#ifdef DEBUG +#define DPRINTF(p) printf p +#else +#define DPRINTF(p) /*nothing*/ +#endif + +/* Include the internals header, which itself includes Standard C headers plus +the external pcre header. */ + +#include "internal.h" + + +/* Allow compilation as C++ source code, should anybody want to do that. */ + +#ifdef __cplusplus +#define class pcre_class +#endif + + +/* Maximum number of items on the nested bracket stacks at compile time. This +applies to the nesting of all kinds of parentheses. It does not limit +un-nested, non-capturing parentheses. This number can be made bigger if +necessary - it is used to dimension one int and one unsigned char vector at +compile time. */ + +#define BRASTACK_SIZE 200 + + +/* The number of bytes in a literal character string above which we can't add +any more is different when UTF-8 characters may be encountered. */ + +#ifdef SUPPORT_UTF8 +#define MAXLIT 250 +#else +#define MAXLIT 255 +#endif + + +/* Min and max values for the common repeats; for the maxima, 0 => infinity */ + +static const char rep_min[] = { 0, 0, 1, 1, 0, 0 }; +static const char rep_max[] = { 0, 0, 0, 0, 1, 1 }; + +/* Text forms of OP_ values and things, for debugging (not all used) */ + +#ifdef DEBUG +static const char *OP_names[] = { + "End", "\\A", "\\B", "\\b", "\\D", "\\d", + "\\S", "\\s", "\\W", "\\w", "\\Z", "\\z", + "Opt", "^", "$", "Any", "chars", "not", + "*", "*?", "+", "+?", "?", "??", "{", "{", "{", + "*", "*?", "+", "+?", "?", "??", "{", "{", "{", + "*", "*?", "+", "+?", "?", "??", "{", "{", "{", + "*", "*?", "+", "+?", "?", "??", "{", "{", + "class", "Ref", "Recurse", + "Alt", "Ket", "KetRmax", "KetRmin", "Assert", "Assert not", + "AssertB", "AssertB not", "Reverse", "Once", "Cond", "Cref", + "Brazero", "Braminzero", "Branumber", "Bra" +}; +#endif + +/* Table for handling escaped characters in the range '0'-'z'. Positive returns +are simple data values; negative values are for special things like \d and so +on. Zero means further processing is needed (for things like \x), or the escape +is invalid. */ + +static const short int escapes[] = { + 0, 0, 0, 0, 0, 0, 0, 0, /* 0 - 7 */ + 0, 0, ':', ';', '<', '=', '>', '?', /* 8 - ? */ + '@', -ESC_A, -ESC_B, 0, -ESC_D, 0, 0, 0, /* @ - G */ + 0, 0, 0, 0, 0, 0, 0, 0, /* H - O */ + 0, 0, 0, -ESC_S, 0, 0, 0, -ESC_W, /* P - W */ + 0, 0, -ESC_Z, '[', '\\', ']', '^', '_', /* X - _ */ + '`', 7, -ESC_b, 0, -ESC_d, ESC_E, ESC_F, 0, /* ` - g */ + 0, 0, 0, 0, 0, 0, ESC_N, 0, /* h - o */ + 0, 0, ESC_R, -ESC_s, ESC_T, 0, 0, -ESC_w, /* p - w */ + 0, 0, -ESC_z /* x - z */ +}; + +/* Tables of names of POSIX character classes and their lengths. The list is +terminated by a zero length entry. The first three must be alpha, upper, lower, +as this is assumed for handling case independence. */ + +static const char *posix_names[] = { + "alpha", "lower", "upper", + "alnum", "ascii", "cntrl", "digit", "graph", + "print", "punct", "space", "word", "xdigit" }; + +static const uschar posix_name_lengths[] = { + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 6, 0 }; + +/* Table of class bit maps for each POSIX class; up to three may be combined +to form the class. */ + +static const int posix_class_maps[] = { + cbit_lower, cbit_upper, -1, /* alpha */ + cbit_lower, -1, -1, /* lower */ + cbit_upper, -1, -1, /* upper */ + cbit_digit, cbit_lower, cbit_upper, /* alnum */ + cbit_print, cbit_cntrl, -1, /* ascii */ + cbit_cntrl, -1, -1, /* cntrl */ + cbit_digit, -1, -1, /* digit */ + cbit_graph, -1, -1, /* graph */ + cbit_print, -1, -1, /* print */ + cbit_punct, -1, -1, /* punct */ + cbit_space, -1, -1, /* space */ + cbit_word, -1, -1, /* word */ + cbit_xdigit,-1, -1 /* xdigit */ +}; + + +/* Definition to allow mutual recursion */ + +static BOOL + compile_regex(int, int, int *, uschar **, const uschar **, const char **, + BOOL, int, int *, int *, compile_data *); + +/* Structure for building a chain of data that actually lives on the +stack, for holding the values of the subject pointer at the start of each +subpattern, so as to detect when an empty string has been matched by a +subpattern - to break infinite loops. */ + +typedef struct eptrblock { + struct eptrblock *prev; + const uschar *saved_eptr; +} eptrblock; + +/* Flag bits for the match() function */ + +#define match_condassert 0x01 /* Called to check a condition assertion */ +#define match_isgroup 0x02 /* Set if start of bracketed group */ + + + +/************************************************* +* Global variables * +*************************************************/ + +/* PCRE is thread-clean and doesn't use any global variables in the normal +sense. However, it calls memory allocation and free functions via the two +indirections below, which are can be changed by the caller, but are shared +between all threads. */ + +void *(*pcre_malloc)(size_t) = malloc; +void (*pcre_free)(void *) = free; + + + +/************************************************* +* Macros and tables for character handling * +*************************************************/ + +/* When UTF-8 encoding is being used, a character is no longer just a single +byte. The macros for character handling generate simple sequences when used in +byte-mode, and more complicated ones for UTF-8 characters. */ + +#ifndef SUPPORT_UTF8 +#define GETCHARINC(c, eptr) c = *eptr++; +#define GETCHARLEN(c, eptr, len) c = *eptr; +#define BACKCHAR(eptr) + +#else /* SUPPORT_UTF8 */ + +/* Get the next UTF-8 character, advancing the pointer */ + +#define GETCHARINC(c, eptr) \ + c = *eptr++; \ + if (md->utf8 && (c & 0xc0) == 0xc0) \ + { \ + int a = utf8_table4[c & 0x3f]; /* Number of additional bytes */ \ + int s = 6*a; \ + c = (c & utf8_table3[a]) << s; \ + while (a-- > 0) \ + { \ + s -= 6; \ + c |= (*eptr++ & 0x3f) << s; \ + } \ + } + +/* Get the next UTF-8 character, not advancing the pointer, setting length */ + +#define GETCHARLEN(c, eptr, len) \ + c = *eptr; \ + len = 1; \ + if (md->utf8 && (c & 0xc0) == 0xc0) \ + { \ + int i; \ + int a = utf8_table4[c & 0x3f]; /* Number of additional bytes */ \ + int s = 6*a; \ + c = (c & utf8_table3[a]) << s; \ + for (i = 1; i <= a; i++) \ + { \ + s -= 6; \ + c |= (eptr[i] & 0x3f) << s; \ + } \ + len += a; \ + } + +/* If the pointer is not at the start of a character, move it back until +it is. */ + +#define BACKCHAR(eptr) while((*eptr & 0xc0) == 0x80) eptr--; + +#endif + + + +/************************************************* +* Default character tables * +*************************************************/ + +/* A default set of character tables is included in the PCRE binary. Its source +is built by the maketables auxiliary program, which uses the default C ctypes +functions, and put in the file chartables.c. These tables are used by PCRE +whenever the caller of pcre_compile() does not provide an alternate set of +tables. */ + +#include "chartables.c" + + + +#ifdef SUPPORT_UTF8 +/************************************************* +* Tables for UTF-8 support * +*************************************************/ + +/* These are the breakpoints for different numbers of bytes in a UTF-8 +character. */ + +static int utf8_table1[] = { 0x7f, 0x7ff, 0xffff, 0x1fffff, 0x3ffffff, 0x7fffffff}; + +/* These are the indicator bits and the mask for the data bits to set in the +first byte of a character, indexed by the number of additional bytes. */ + +static int utf8_table2[] = { 0, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc}; +static int utf8_table3[] = { 0xff, 0x1f, 0x0f, 0x07, 0x03, 0x01}; + +/* Table of the number of extra characters, indexed by the first character +masked with 0x3f. The highest number for a valid UTF-8 character is in fact +0x3d. */ + +static uschar utf8_table4[] = { + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, + 3,3,3,3,3,3,3,3,4,4,4,4,5,5,5,5 }; + + +/************************************************* +* Convert character value to UTF-8 * +*************************************************/ + +/* This function takes an integer value in the range 0 - 0x7fffffff +and encodes it as a UTF-8 character in 0 to 6 bytes. + +Arguments: + cvalue the character value + buffer pointer to buffer for result - at least 6 bytes long + +Returns: number of characters placed in the buffer +*/ + +static int +ord2utf8(int cvalue, uschar *buffer) +{ +register int i, j; +for (i = 0; i < sizeof(utf8_table1)/sizeof(int); i++) + if (cvalue <= utf8_table1[i]) break; +buffer += i; +for (j = i; j > 0; j--) + { + *buffer-- = 0x80 | (cvalue & 0x3f); + cvalue >>= 6; + } +*buffer = utf8_table2[i] | cvalue; +return i + 1; +} +#endif + + + +/************************************************* +* Return version string * +*************************************************/ + +#define STRING(a) # a +#define XSTRING(s) STRING(s) + +const char * +pcre_version(void) +{ +return XSTRING(PCRE_MAJOR) "." XSTRING(PCRE_MINOR) " " XSTRING(PCRE_DATE); +} + + + + +/************************************************* +* (Obsolete) Return info about compiled pattern * +*************************************************/ + +/* This is the original "info" function. It picks potentially useful data out +of the private structure, but its interface was too rigid. It remains for +backwards compatibility. The public options are passed back in an int - though +the re->options field has been expanded to a long int, all the public options +at the low end of it, and so even on 16-bit systems this will still be OK. +Therefore, I haven't changed the API for pcre_info(). + +Arguments: + external_re points to compiled code + optptr where to pass back the options + first_char where to pass back the first character, + or -1 if multiline and all branches start ^, + or -2 otherwise + +Returns: number of capturing subpatterns + or negative values on error +*/ + +int +pcre_info(const pcre *external_re, int *optptr, int *first_char) +{ +const real_pcre *re = (const real_pcre *)external_re; +if (re == NULL) return PCRE_ERROR_NULL; +if (re->magic_number != MAGIC_NUMBER) return PCRE_ERROR_BADMAGIC; +if (optptr != NULL) *optptr = (int)(re->options & PUBLIC_OPTIONS); +if (first_char != NULL) + *first_char = ((re->options & PCRE_FIRSTSET) != 0)? re->first_char : + ((re->options & PCRE_STARTLINE) != 0)? -1 : -2; +return re->top_bracket; +} + + + +/************************************************* +* Return info about compiled pattern * +*************************************************/ + +/* This is a newer "info" function which has an extensible interface so +that additional items can be added compatibly. + +Arguments: + external_re points to compiled code + external_study points to study data, or NULL + what what information is required + where where to put the information + +Returns: 0 if data returned, negative on error +*/ + +int +pcre_fullinfo(const pcre *external_re, const pcre_extra *study_data, int what, + void *where) +{ +const real_pcre *re = (const real_pcre *)external_re; +const real_pcre_extra *study = (const real_pcre_extra *)study_data; + +if (re == NULL || where == NULL) return PCRE_ERROR_NULL; +if (re->magic_number != MAGIC_NUMBER) return PCRE_ERROR_BADMAGIC; + +switch (what) + { + case PCRE_INFO_OPTIONS: + *((unsigned long int *)where) = re->options & PUBLIC_OPTIONS; + break; + + case PCRE_INFO_SIZE: + *((size_t *)where) = re->size; + break; + + case PCRE_INFO_CAPTURECOUNT: + *((int *)where) = re->top_bracket; + break; + + case PCRE_INFO_BACKREFMAX: + *((int *)where) = re->top_backref; + break; + + case PCRE_INFO_FIRSTCHAR: + *((int *)where) = + ((re->options & PCRE_FIRSTSET) != 0)? re->first_char : + ((re->options & PCRE_STARTLINE) != 0)? -1 : -2; + break; + + case PCRE_INFO_FIRSTTABLE: + *((const uschar **)where) = + (study != NULL && (study->options & PCRE_STUDY_MAPPED) != 0)? + study->start_bits : NULL; + break; + + case PCRE_INFO_LASTLITERAL: + *((int *)where) = + ((re->options & PCRE_REQCHSET) != 0)? re->req_char : -1; + break; + + default: return PCRE_ERROR_BADOPTION; + } + +return 0; +} + + + +#ifdef DEBUG +/************************************************* +* Debugging function to print chars * +*************************************************/ + +/* Print a sequence of chars in printable format, stopping at the end of the +subject if the requested. + +Arguments: + p points to characters + length number to print + is_subject TRUE if printing from within md->start_subject + md pointer to matching data block, if is_subject is TRUE + +Returns: nothing +*/ + +static void +pchars(const uschar *p, int length, BOOL is_subject, match_data *md) +{ +int c; +if (is_subject && length > md->end_subject - p) length = md->end_subject - p; +while (length-- > 0) + if (isprint(c = *(p++))) printf("%c", c); else printf("\\x%02x", c); +} +#endif + + + + +/************************************************* +* Handle escapes * +*************************************************/ + +/* This function is called when a \ has been encountered. It either returns a +positive value for a simple escape such as \n, or a negative value which +encodes one of the more complicated things such as \d. When UTF-8 is enabled, +a positive value greater than 255 may be returned. On entry, ptr is pointing at +the \. On exit, it is on the final character of the escape sequence. + +Arguments: + ptrptr points to the pattern position pointer + errorptr points to the pointer to the error message + bracount number of previous extracting brackets + options the options bits + isclass TRUE if inside a character class + cd pointer to char tables block + +Returns: zero or positive => a data character + negative => a special escape sequence + on error, errorptr is set +*/ + +static int +check_escape(const uschar **ptrptr, const char **errorptr, int bracount, + int options, BOOL isclass, compile_data *cd) +{ +const uschar *ptr = *ptrptr; +int c, i; + +/* If backslash is at the end of the pattern, it's an error. */ + +c = *(++ptr); +if (c == 0) *errorptr = ERR1; + +/* Digits or letters may have special meaning; all others are literals. */ + +else if (c < '0' || c > 'z') {} + +/* Do an initial lookup in a table. A non-zero result is something that can be +returned immediately. Otherwise further processing may be required. */ + +else if ((i = escapes[c - '0']) != 0) c = i; + +/* Escapes that need further processing, or are illegal. */ + +else + { + const uschar *oldptr; + switch (c) + { + /* The handling of escape sequences consisting of a string of digits + starting with one that is not zero is not straightforward. By experiment, + the way Perl works seems to be as follows: + + Outside a character class, the digits are read as a decimal number. If the + number is less than 10, or if there are that many previous extracting + left brackets, then it is a back reference. Otherwise, up to three octal + digits are read to form an escaped byte. Thus \123 is likely to be octal + 123 (cf \0123, which is octal 012 followed by the literal 3). If the octal + value is greater than 377, the least significant 8 bits are taken. Inside a + character class, \ followed by a digit is always an octal number. */ + + case '1': case '2': case '3': case '4': case '5': + case '6': case '7': case '8': case '9': + + if (!isclass) + { + oldptr = ptr; + c -= '0'; + while ((cd->ctypes[ptr[1]] & ctype_digit) != 0) + c = c * 10 + *(++ptr) - '0'; + if (c < 10 || c <= bracount) + { + c = -(ESC_REF + c); + break; + } + ptr = oldptr; /* Put the pointer back and fall through */ + } + + /* Handle an octal number following \. If the first digit is 8 or 9, Perl + generates a binary zero byte and treats the digit as a following literal. + Thus we have to pull back the pointer by one. */ + + if ((c = *ptr) >= '8') + { + ptr--; + c = 0; + break; + } + + /* \0 always starts an octal number, but we may drop through to here with a + larger first octal digit. */ + + case '0': + c -= '0'; + while(i++ < 2 && (cd->ctypes[ptr[1]] & ctype_digit) != 0 && + ptr[1] != '8' && ptr[1] != '9') + c = c * 8 + *(++ptr) - '0'; + c &= 255; /* Take least significant 8 bits */ + break; + + /* \x is complicated when UTF-8 is enabled. \x{ddd} is a character number + which can be greater than 0xff, but only if the ddd are hex digits. */ + + case 'x': +#ifdef SUPPORT_UTF8 + if (ptr[1] == '{' && (options & PCRE_UTF8) != 0) + { + const uschar *pt = ptr + 2; + register int count = 0; + c = 0; + while ((cd->ctypes[*pt] & ctype_xdigit) != 0) + { + count++; + c = c * 16 + cd->lcc[*pt] - + (((cd->ctypes[*pt] & ctype_digit) != 0)? '0' : 'W'); + pt++; + } + if (*pt == '}') + { + if (c < 0 || count > 8) *errorptr = ERR34; + ptr = pt; + break; + } + /* If the sequence of hex digits does not end with '}', then we don't + recognize this construct; fall through to the normal \x handling. */ + } +#endif + + /* Read just a single hex char */ + + c = 0; + while (i++ < 2 && (cd->ctypes[ptr[1]] & ctype_xdigit) != 0) + { + ptr++; + c = c * 16 + cd->lcc[*ptr] - + (((cd->ctypes[*ptr] & ctype_digit) != 0)? '0' : 'W'); + } + break; + + /* Other special escapes not starting with a digit are straightforward */ + + case 'c': + c = *(++ptr); + if (c == 0) + { + *errorptr = ERR2; + return 0; + } + + /* A letter is upper-cased; then the 0x40 bit is flipped */ + + if (c >= 'a' && c <= 'z') c = cd->fcc[c]; + c ^= 0x40; + break; + + /* PCRE_EXTRA enables extensions to Perl in the matter of escapes. Any + other alphameric following \ is an error if PCRE_EXTRA was set; otherwise, + for Perl compatibility, it is a literal. This code looks a bit odd, but + there used to be some cases other than the default, and there may be again + in future, so I haven't "optimized" it. */ + + default: + if ((options & PCRE_EXTRA) != 0) switch(c) + { + default: + *errorptr = ERR3; + break; + } + break; + } + } + +*ptrptr = ptr; +return c; +} + + + +/************************************************* +* Check for counted repeat * +*************************************************/ + +/* This function is called when a '{' is encountered in a place where it might +start a quantifier. It looks ahead to see if it really is a quantifier or not. +It is only a quantifier if it is one of the forms {ddd} {ddd,} or {ddd,ddd} +where the ddds are digits. + +Arguments: + p pointer to the first char after '{' + cd pointer to char tables block + +Returns: TRUE or FALSE +*/ + +static BOOL +is_counted_repeat(const uschar *p, compile_data *cd) +{ +if ((cd->ctypes[*p++] & ctype_digit) == 0) return FALSE; +while ((cd->ctypes[*p] & ctype_digit) != 0) p++; +if (*p == '}') return TRUE; + +if (*p++ != ',') return FALSE; +if (*p == '}') return TRUE; + +if ((cd->ctypes[*p++] & ctype_digit) == 0) return FALSE; +while ((cd->ctypes[*p] & ctype_digit) != 0) p++; +return (*p == '}'); +} + + + +/************************************************* +* Read repeat counts * +*************************************************/ + +/* Read an item of the form {n,m} and return the values. This is called only +after is_counted_repeat() has confirmed that a repeat-count quantifier exists, +so the syntax is guaranteed to be correct, but we need to check the values. + +Arguments: + p pointer to first char after '{' + minp pointer to int for min + maxp pointer to int for max + returned as -1 if no max + errorptr points to pointer to error message + cd pointer to character tables clock + +Returns: pointer to '}' on success; + current ptr on error, with errorptr set +*/ + +static const uschar * +read_repeat_counts(const uschar *p, int *minp, int *maxp, + const char **errorptr, compile_data *cd) +{ +int min = 0; +int max = -1; + +/* Read the minimum value and do a paranoid check: a negative value indicates +an integer overflow. */ + +while ((cd->ctypes[*p] & ctype_digit) != 0) min = min * 10 + *p++ - '0'; +if (min < 0 || min > 65535) + { + *errorptr = ERR5; + return p; + } + +/* Read the maximum value if there is one, and again do a paranoid on its size. +Also, max must not be less than min. */ + +if (*p == '}') max = min; else + { + if (*(++p) != '}') + { + max = 0; + while((cd->ctypes[*p] & ctype_digit) != 0) max = max * 10 + *p++ - '0'; + if (max < 0 || max > 65535) + { + *errorptr = ERR5; + return p; + } + if (max < min) + { + *errorptr = ERR4; + return p; + } + } + } + +/* Fill in the required variables, and pass back the pointer to the terminating +'}'. */ + +*minp = min; +*maxp = max; +return p; +} + + + +/************************************************* +* Find the fixed length of a pattern * +*************************************************/ + +/* Scan a pattern and compute the fixed length of subject that will match it, +if the length is fixed. This is needed for dealing with backward assertions. + +Arguments: + code points to the start of the pattern (the bracket) + options the compiling options + +Returns: the fixed length, or -1 if there is no fixed length +*/ + +static int +find_fixedlength(uschar *code, int options) +{ +int length = -1; + +register int branchlength = 0; +register uschar *cc = code + 3; + +/* Scan along the opcodes for this branch. If we get to the end of the +branch, check the length against that of the other branches. */ + +for (;;) + { + int d; + register int op = *cc; + if (op >= OP_BRA) op = OP_BRA; + + switch (op) + { + case OP_BRA: + case OP_ONCE: + case OP_COND: + d = find_fixedlength(cc, options); + if (d < 0) return -1; + branchlength += d; + do cc += (cc[1] << 8) + cc[2]; while (*cc == OP_ALT); + cc += 3; + break; + + /* Reached end of a branch; if it's a ket it is the end of a nested + call. If it's ALT it is an alternation in a nested call. If it is + END it's the end of the outer call. All can be handled by the same code. */ + + case OP_ALT: + case OP_KET: + case OP_KETRMAX: + case OP_KETRMIN: + case OP_END: + if (length < 0) length = branchlength; + else if (length != branchlength) return -1; + if (*cc != OP_ALT) return length; + cc += 3; + branchlength = 0; + break; + + /* Skip over assertive subpatterns */ + + case OP_ASSERT: + case OP_ASSERT_NOT: + case OP_ASSERTBACK: + case OP_ASSERTBACK_NOT: + do cc += (cc[1] << 8) + cc[2]; while (*cc == OP_ALT); + cc += 3; + break; + + /* Skip over things that don't match chars */ + + case OP_REVERSE: + case OP_BRANUMBER: + case OP_CREF: + cc++; + /* Fall through */ + + case OP_OPT: + cc++; + /* Fall through */ + + case OP_SOD: + case OP_EOD: + case OP_EODN: + case OP_CIRC: + case OP_DOLL: + case OP_NOT_WORD_BOUNDARY: + case OP_WORD_BOUNDARY: + cc++; + break; + + /* Handle char strings. In UTF-8 mode we must count characters, not bytes. + This requires a scan of the string, unfortunately. We assume valid UTF-8 + strings, so all we do is reduce the length by one for byte whose bits are + 10xxxxxx. */ + + case OP_CHARS: + branchlength += *(++cc); +#ifdef SUPPORT_UTF8 + for (d = 1; d <= *cc; d++) + if ((cc[d] & 0xc0) == 0x80) branchlength--; +#endif + cc += *cc + 1; + break; + + /* Handle exact repetitions */ + + case OP_EXACT: + case OP_TYPEEXACT: + branchlength += (cc[1] << 8) + cc[2]; + cc += 4; + break; + + /* Handle single-char matchers */ + + case OP_NOT_DIGIT: + case OP_DIGIT: + case OP_NOT_WHITESPACE: + case OP_WHITESPACE: + case OP_NOT_WORDCHAR: + case OP_WORDCHAR: + case OP_ANY: + branchlength++; + cc++; + break; + + + /* Check a class for variable quantification */ + + case OP_CLASS: + cc += 33; + + switch (*cc) + { + case OP_CRSTAR: + case OP_CRMINSTAR: + case OP_CRQUERY: + case OP_CRMINQUERY: + return -1; + + case OP_CRRANGE: + case OP_CRMINRANGE: + if ((cc[1] << 8) + cc[2] != (cc[3] << 8) + cc[4]) return -1; + branchlength += (cc[1] << 8) + cc[2]; + cc += 5; + break; + + default: + branchlength++; + } + break; + + /* Anything else is variable length */ + + default: + return -1; + } + } +/* Control never gets here */ +} + + + + +/************************************************* +* Check for POSIX class syntax * +*************************************************/ + +/* This function is called when the sequence "[:" or "[." or "[=" is +encountered in a character class. It checks whether this is followed by an +optional ^ and then a sequence of letters, terminated by a matching ":]" or +".]" or "=]". + +Argument: + ptr pointer to the initial [ + endptr where to return the end pointer + cd pointer to compile data + +Returns: TRUE or FALSE +*/ + +static BOOL +check_posix_syntax(const uschar *ptr, const uschar **endptr, compile_data *cd) +{ +int terminator; /* Don't combine these lines; the Solaris cc */ +terminator = *(++ptr); /* compiler warns about "non-constant" initializer. */ +if (*(++ptr) == '^') ptr++; +while ((cd->ctypes[*ptr] & ctype_letter) != 0) ptr++; +if (*ptr == terminator && ptr[1] == ']') + { + *endptr = ptr; + return TRUE; + } +return FALSE; +} + + + + +/************************************************* +* Check POSIX class name * +*************************************************/ + +/* This function is called to check the name given in a POSIX-style class entry +such as [:alnum:]. + +Arguments: + ptr points to the first letter + len the length of the name + +Returns: a value representing the name, or -1 if unknown +*/ + +static int +check_posix_name(const uschar *ptr, int len) +{ +register int yield = 0; +while (posix_name_lengths[yield] != 0) + { + if (len == posix_name_lengths[yield] && + strncmp((const char *)ptr, posix_names[yield], len) == 0) return yield; + yield++; + } +return -1; +} + + + + +/************************************************* +* Compile one branch * +*************************************************/ + +/* Scan the pattern, compiling it into the code vector. + +Arguments: + options the option bits + brackets points to number of extracting brackets used + code points to the pointer to the current code point + ptrptr points to the current pattern pointer + errorptr points to pointer to error message + optchanged set to the value of the last OP_OPT item compiled + reqchar set to the last literal character required, else -1 + countlits set to count of mandatory literal characters + cd contains pointers to tables + +Returns: TRUE on success + FALSE, with *errorptr set on error +*/ + +static BOOL +compile_branch(int options, int *brackets, uschar **codeptr, + const uschar **ptrptr, const char **errorptr, int *optchanged, + int *reqchar, int *countlits, compile_data *cd) +{ +int repeat_type, op_type; +int repeat_min, repeat_max; +int bravalue, length; +int greedy_default, greedy_non_default; +int prevreqchar; +int condcount = 0; +int subcountlits = 0; +register int c; +register uschar *code = *codeptr; +uschar *tempcode; +const uschar *ptr = *ptrptr; +const uschar *tempptr; +uschar *previous = NULL; +uschar class[32]; + +/* Set up the default and non-default settings for greediness */ + +greedy_default = ((options & PCRE_UNGREEDY) != 0); +greedy_non_default = greedy_default ^ 1; + +/* Initialize no required char, and count of literals */ + +*reqchar = prevreqchar = -1; +*countlits = 0; + +/* Switch on next character until the end of the branch */ + +for (;; ptr++) + { + BOOL negate_class; + int class_charcount; + int class_lastchar; + int newoptions; + int skipbytes; + int subreqchar; + + c = *ptr; + if ((options & PCRE_EXTENDED) != 0) + { + if ((cd->ctypes[c] & ctype_space) != 0) continue; + if (c == '#') + { + /* The space before the ; is to avoid a warning on a silly compiler + on the Macintosh. */ + while ((c = *(++ptr)) != 0 && c != NEWLINE) ; + continue; + } + } + + switch(c) + { + /* The branch terminates at end of string, |, or ). */ + + case 0: + case '|': + case ')': + *codeptr = code; + *ptrptr = ptr; + return TRUE; + + /* Handle single-character metacharacters */ + + case '^': + previous = NULL; + *code++ = OP_CIRC; + break; + + case '$': + previous = NULL; + *code++ = OP_DOLL; + break; + + case '.': + previous = code; + *code++ = OP_ANY; + break; + + /* Character classes. These always build a 32-byte bitmap of the permitted + characters, except in the special case where there is only one character. + For negated classes, we build the map as usual, then invert it at the end. + */ + + case '[': + previous = code; + *code++ = OP_CLASS; + + /* If the first character is '^', set the negation flag and skip it. */ + + if ((c = *(++ptr)) == '^') + { + negate_class = TRUE; + c = *(++ptr); + } + else negate_class = FALSE; + + /* Keep a count of chars so that we can optimize the case of just a single + character. */ + + class_charcount = 0; + class_lastchar = -1; + + /* Initialize the 32-char bit map to all zeros. We have to build the + map in a temporary bit of store, in case the class contains only 1 + character, because in that case the compiled code doesn't use the + bit map. */ + + memset(class, 0, 32 * sizeof(uschar)); + + /* Process characters until ] is reached. By writing this as a "do" it + means that an initial ] is taken as a data character. */ + + do + { + if (c == 0) + { + *errorptr = ERR6; + goto FAILED; + } + + /* Handle POSIX class names. Perl allows a negation extension of the + form [:^name]. A square bracket that doesn't match the syntax is + treated as a literal. We also recognize the POSIX constructions + [.ch.] and [=ch=] ("collating elements") and fault them, as Perl + 5.6 does. */ + + if (c == '[' && + (ptr[1] == ':' || ptr[1] == '.' || ptr[1] == '=') && + check_posix_syntax(ptr, &tempptr, cd)) + { + BOOL local_negate = FALSE; + int posix_class, i; + register const uschar *cbits = cd->cbits; + + if (ptr[1] != ':') + { + *errorptr = ERR31; + goto FAILED; + } + + ptr += 2; + if (*ptr == '^') + { + local_negate = TRUE; + ptr++; + } + + posix_class = check_posix_name(ptr, tempptr - ptr); + if (posix_class < 0) + { + *errorptr = ERR30; + goto FAILED; + } + + /* If matching is caseless, upper and lower are converted to + alpha. This relies on the fact that the class table starts with + alpha, lower, upper as the first 3 entries. */ + + if ((options & PCRE_CASELESS) != 0 && posix_class <= 2) + posix_class = 0; + + /* Or into the map we are building up to 3 of the static class + tables, or their negations. */ + + posix_class *= 3; + for (i = 0; i < 3; i++) + { + int taboffset = posix_class_maps[posix_class + i]; + if (taboffset < 0) break; + if (local_negate) + for (c = 0; c < 32; c++) class[c] |= ~cbits[c+taboffset]; + else + for (c = 0; c < 32; c++) class[c] |= cbits[c+taboffset]; + } + + ptr = tempptr + 1; + class_charcount = 10; /* Set > 1; assumes more than 1 per class */ + continue; + } + + /* Backslash may introduce a single character, or it may introduce one + of the specials, which just set a flag. Escaped items are checked for + validity in the pre-compiling pass. The sequence \b is a special case. + Inside a class (and only there) it is treated as backspace. Elsewhere + it marks a word boundary. Other escapes have preset maps ready to + or into the one we are building. We assume they have more than one + character in them, so set class_count bigger than one. */ + + if (c == '\\') + { + c = check_escape(&ptr, errorptr, *brackets, options, TRUE, cd); + if (-c == ESC_b) c = '\b'; + else if (c < 0) + { + register const uschar *cbits = cd->cbits; + class_charcount = 10; + switch (-c) + { + case ESC_d: + for (c = 0; c < 32; c++) class[c] |= cbits[c+cbit_digit]; + continue; + + case ESC_D: + for (c = 0; c < 32; c++) class[c] |= ~cbits[c+cbit_digit]; + continue; + + case ESC_w: + for (c = 0; c < 32; c++) class[c] |= cbits[c+cbit_word]; + continue; + + case ESC_W: + for (c = 0; c < 32; c++) class[c] |= ~cbits[c+cbit_word]; + continue; + + case ESC_s: + for (c = 0; c < 32; c++) class[c] |= cbits[c+cbit_space]; + continue; + + case ESC_S: + for (c = 0; c < 32; c++) class[c] |= ~cbits[c+cbit_space]; + continue; + + default: + *errorptr = ERR7; + goto FAILED; + } + } + + /* Fall through if single character, but don't at present allow + chars > 255 in UTF-8 mode. */ + +#ifdef SUPPORT_UTF8 + if (c > 255) + { + *errorptr = ERR33; + goto FAILED; + } +#endif + } + + /* A single character may be followed by '-' to form a range. However, + Perl does not permit ']' to be the end of the range. A '-' character + here is treated as a literal. */ + + if (ptr[1] == '-' && ptr[2] != ']') + { + int d; + ptr += 2; + d = *ptr; + + if (d == 0) + { + *errorptr = ERR6; + goto FAILED; + } + + /* The second part of a range can be a single-character escape, but + not any of the other escapes. Perl 5.6 treats a hyphen as a literal + in such circumstances. */ + + if (d == '\\') + { + const uschar *oldptr = ptr; + d = check_escape(&ptr, errorptr, *brackets, options, TRUE, cd); + +#ifdef SUPPORT_UTF8 + if (d > 255) + { + *errorptr = ERR33; + goto FAILED; + } +#endif + /* \b is backslash; any other special means the '-' was literal */ + + if (d < 0) + { + if (d == -ESC_b) d = '\b'; else + { + ptr = oldptr - 2; + goto SINGLE_CHARACTER; /* A few lines below */ + } + } + } + + if (d < c) + { + *errorptr = ERR8; + goto FAILED; + } + + for (; c <= d; c++) + { + class[c/8] |= (1 << (c&7)); + if ((options & PCRE_CASELESS) != 0) + { + int uc = cd->fcc[c]; /* flip case */ + class[uc/8] |= (1 << (uc&7)); + } + class_charcount++; /* in case a one-char range */ + class_lastchar = c; + } + continue; /* Go get the next char in the class */ + } + + /* Handle a lone single character - we can get here for a normal + non-escape char, or after \ that introduces a single character. */ + + SINGLE_CHARACTER: + + class [c/8] |= (1 << (c&7)); + if ((options & PCRE_CASELESS) != 0) + { + c = cd->fcc[c]; /* flip case */ + class[c/8] |= (1 << (c&7)); + } + class_charcount++; + class_lastchar = c; + } + + /* Loop until ']' reached; the check for end of string happens inside the + loop. This "while" is the end of the "do" above. */ + + while ((c = *(++ptr)) != ']'); + + /* If class_charcount is 1 and class_lastchar is not negative, we saw + precisely one character. This doesn't need the whole 32-byte bit map. + We turn it into a 1-character OP_CHAR if it's positive, or OP_NOT if + it's negative. */ + + if (class_charcount == 1 && class_lastchar >= 0) + { + if (negate_class) + { + code[-1] = OP_NOT; + } + else + { + code[-1] = OP_CHARS; + *code++ = 1; + } + *code++ = class_lastchar; + } + + /* Otherwise, negate the 32-byte map if necessary, and copy it into + the code vector. */ + + else + { + if (negate_class) + for (c = 0; c < 32; c++) code[c] = ~class[c]; + else + memcpy(code, class, 32); + code += 32; + } + break; + + /* Various kinds of repeat */ + + case '{': + if (!is_counted_repeat(ptr+1, cd)) goto NORMAL_CHAR; + ptr = read_repeat_counts(ptr+1, &repeat_min, &repeat_max, errorptr, cd); + if (*errorptr != NULL) goto FAILED; + goto REPEAT; + + case '*': + repeat_min = 0; + repeat_max = -1; + goto REPEAT; + + case '+': + repeat_min = 1; + repeat_max = -1; + goto REPEAT; + + case '?': + repeat_min = 0; + repeat_max = 1; + + REPEAT: + if (previous == NULL) + { + *errorptr = ERR9; + goto FAILED; + } + + /* If the next character is '?' this is a minimizing repeat, by default, + but if PCRE_UNGREEDY is set, it works the other way round. Advance to the + next character. */ + + if (ptr[1] == '?') + { repeat_type = greedy_non_default; ptr++; } + else repeat_type = greedy_default; + + /* If previous was a string of characters, chop off the last one and use it + as the subject of the repeat. If there was only one character, we can + abolish the previous item altogether. A repeat with a zero minimum wipes + out any reqchar setting, backing up to the previous value. We must also + adjust the countlits value. */ + + if (*previous == OP_CHARS) + { + int len = previous[1]; + + if (repeat_min == 0) *reqchar = prevreqchar; + *countlits += repeat_min - 1; + + if (len == 1) + { + c = previous[2]; + code = previous; + } + else + { + c = previous[len+1]; + previous[1]--; + code--; + } + op_type = 0; /* Use single-char op codes */ + goto OUTPUT_SINGLE_REPEAT; /* Code shared with single character types */ + } + + /* If previous was a single negated character ([^a] or similar), we use + one of the special opcodes, replacing it. The code is shared with single- + character repeats by adding a suitable offset into repeat_type. */ + + else if ((int)*previous == OP_NOT) + { + op_type = OP_NOTSTAR - OP_STAR; /* Use "not" opcodes */ + c = previous[1]; + code = previous; + goto OUTPUT_SINGLE_REPEAT; + } + + /* If previous was a character type match (\d or similar), abolish it and + create a suitable repeat item. The code is shared with single-character + repeats by adding a suitable offset into repeat_type. */ + + else if ((int)*previous < OP_EODN || *previous == OP_ANY) + { + op_type = OP_TYPESTAR - OP_STAR; /* Use type opcodes */ + c = *previous; + code = previous; + + OUTPUT_SINGLE_REPEAT: + + /* If the maximum is zero then the minimum must also be zero; Perl allows + this case, so we do too - by simply omitting the item altogether. */ + + if (repeat_max == 0) goto END_REPEAT; + + /* Combine the op_type with the repeat_type */ + + repeat_type += op_type; + + /* A minimum of zero is handled either as the special case * or ?, or as + an UPTO, with the maximum given. */ + + if (repeat_min == 0) + { + if (repeat_max == -1) *code++ = OP_STAR + repeat_type; + else if (repeat_max == 1) *code++ = OP_QUERY + repeat_type; + else + { + *code++ = OP_UPTO + repeat_type; + *code++ = repeat_max >> 8; + *code++ = (repeat_max & 255); + } + } + + /* The case {1,} is handled as the special case + */ + + else if (repeat_min == 1 && repeat_max == -1) + *code++ = OP_PLUS + repeat_type; + + /* The case {n,n} is just an EXACT, while the general case {n,m} is + handled as an EXACT followed by an UPTO. An EXACT of 1 is optimized. */ + + else + { + if (repeat_min != 1) + { + *code++ = OP_EXACT + op_type; /* NB EXACT doesn't have repeat_type */ + *code++ = repeat_min >> 8; + *code++ = (repeat_min & 255); + } + + /* If the mininum is 1 and the previous item was a character string, + we either have to put back the item that got cancelled if the string + length was 1, or add the character back onto the end of a longer + string. For a character type nothing need be done; it will just get + put back naturally. Note that the final character is always going to + get added below. */ + + else if (*previous == OP_CHARS) + { + if (code == previous) code += 2; else previous[1]++; + } + + /* For a single negated character we also have to put back the + item that got cancelled. */ + + else if (*previous == OP_NOT) code++; + + /* If the maximum is unlimited, insert an OP_STAR. */ + + if (repeat_max < 0) + { + *code++ = c; + *code++ = OP_STAR + repeat_type; + } + + /* Else insert an UPTO if the max is greater than the min. */ + + else if (repeat_max != repeat_min) + { + *code++ = c; + repeat_max -= repeat_min; + *code++ = OP_UPTO + repeat_type; + *code++ = repeat_max >> 8; + *code++ = (repeat_max & 255); + } + } + + /* The character or character type itself comes last in all cases. */ + + *code++ = c; + } + + /* If previous was a character class or a back reference, we put the repeat + stuff after it, but just skip the item if the repeat was {0,0}. */ + + else if (*previous == OP_CLASS || *previous == OP_REF) + { + if (repeat_max == 0) + { + code = previous; + goto END_REPEAT; + } + if (repeat_min == 0 && repeat_max == -1) + *code++ = OP_CRSTAR + repeat_type; + else if (repeat_min == 1 && repeat_max == -1) + *code++ = OP_CRPLUS + repeat_type; + else if (repeat_min == 0 && repeat_max == 1) + *code++ = OP_CRQUERY + repeat_type; + else + { + *code++ = OP_CRRANGE + repeat_type; + *code++ = repeat_min >> 8; + *code++ = repeat_min & 255; + if (repeat_max == -1) repeat_max = 0; /* 2-byte encoding for max */ + *code++ = repeat_max >> 8; + *code++ = repeat_max & 255; + } + } + + /* If previous was a bracket group, we may have to replicate it in certain + cases. */ + + else if ((int)*previous >= OP_BRA || (int)*previous == OP_ONCE || + (int)*previous == OP_COND) + { + register int i; + int ketoffset = 0; + int len = code - previous; + uschar *bralink = NULL; + + /* If the maximum repeat count is unlimited, find the end of the bracket + by scanning through from the start, and compute the offset back to it + from the current code pointer. There may be an OP_OPT setting following + the final KET, so we can't find the end just by going back from the code + pointer. */ + + if (repeat_max == -1) + { + register uschar *ket = previous; + do ket += (ket[1] << 8) + ket[2]; while (*ket != OP_KET); + ketoffset = code - ket; + } + + /* The case of a zero minimum is special because of the need to stick + OP_BRAZERO in front of it, and because the group appears once in the + data, whereas in other cases it appears the minimum number of times. For + this reason, it is simplest to treat this case separately, as otherwise + the code gets far too messy. There are several special subcases when the + minimum is zero. */ + + if (repeat_min == 0) + { + /* If we set up a required char from the bracket, we must back off + to the previous value and reset the countlits value too. */ + + if (subcountlits > 0) + { + *reqchar = prevreqchar; + *countlits -= subcountlits; + } + + /* If the maximum is also zero, we just omit the group from the output + altogether. */ + + if (repeat_max == 0) + { + code = previous; + goto END_REPEAT; + } + + /* If the maximum is 1 or unlimited, we just have to stick in the + BRAZERO and do no more at this point. */ + + if (repeat_max <= 1) + { + memmove(previous+1, previous, len); + code++; + *previous++ = OP_BRAZERO + repeat_type; + } + + /* If the maximum is greater than 1 and limited, we have to replicate + in a nested fashion, sticking OP_BRAZERO before each set of brackets. + The first one has to be handled carefully because it's the original + copy, which has to be moved up. The remainder can be handled by code + that is common with the non-zero minimum case below. We just have to + adjust the value or repeat_max, since one less copy is required. */ + + else + { + int offset; + memmove(previous+4, previous, len); + code += 4; + *previous++ = OP_BRAZERO + repeat_type; + *previous++ = OP_BRA; + + /* We chain together the bracket offset fields that have to be + filled in later when the ends of the brackets are reached. */ + + offset = (bralink == NULL)? 0 : previous - bralink; + bralink = previous; + *previous++ = offset >> 8; + *previous++ = offset & 255; + } + + repeat_max--; + } + + /* If the minimum is greater than zero, replicate the group as many + times as necessary, and adjust the maximum to the number of subsequent + copies that we need. */ + + else + { + for (i = 1; i < repeat_min; i++) + { + memcpy(code, previous, len); + code += len; + } + if (repeat_max > 0) repeat_max -= repeat_min; + } + + /* This code is common to both the zero and non-zero minimum cases. If + the maximum is limited, it replicates the group in a nested fashion, + remembering the bracket starts on a stack. In the case of a zero minimum, + the first one was set up above. In all cases the repeat_max now specifies + the number of additional copies needed. */ + + if (repeat_max >= 0) + { + for (i = repeat_max - 1; i >= 0; i--) + { + *code++ = OP_BRAZERO + repeat_type; + + /* All but the final copy start a new nesting, maintaining the + chain of brackets outstanding. */ + + if (i != 0) + { + int offset; + *code++ = OP_BRA; + offset = (bralink == NULL)? 0 : code - bralink; + bralink = code; + *code++ = offset >> 8; + *code++ = offset & 255; + } + + memcpy(code, previous, len); + code += len; + } + + /* Now chain through the pending brackets, and fill in their length + fields (which are holding the chain links pro tem). */ + + while (bralink != NULL) + { + int oldlinkoffset; + int offset = code - bralink + 1; + uschar *bra = code - offset; + oldlinkoffset = (bra[1] << 8) + bra[2]; + bralink = (oldlinkoffset == 0)? NULL : bralink - oldlinkoffset; + *code++ = OP_KET; + *code++ = bra[1] = offset >> 8; + *code++ = bra[2] = (offset & 255); + } + } + + /* If the maximum is unlimited, set a repeater in the final copy. We + can't just offset backwards from the current code point, because we + don't know if there's been an options resetting after the ket. The + correct offset was computed above. */ + + else code[-ketoffset] = OP_KETRMAX + repeat_type; + } + + /* Else there's some kind of shambles */ + + else + { + *errorptr = ERR11; + goto FAILED; + } + + /* In all case we no longer have a previous item. */ + + END_REPEAT: + previous = NULL; + break; + + + /* Start of nested bracket sub-expression, or comment or lookahead or + lookbehind or option setting or condition. First deal with special things + that can come after a bracket; all are introduced by ?, and the appearance + of any of them means that this is not a referencing group. They were + checked for validity in the first pass over the string, so we don't have to + check for syntax errors here. */ + + case '(': + newoptions = options; + skipbytes = 0; + + if (*(++ptr) == '?') + { + int set, unset; + int *optset; + + switch (*(++ptr)) + { + case '#': /* Comment; skip to ket */ + ptr++; + while (*ptr != ')') ptr++; + continue; + + case ':': /* Non-extracting bracket */ + bravalue = OP_BRA; + ptr++; + break; + + case '(': + bravalue = OP_COND; /* Conditional group */ + if ((cd->ctypes[*(++ptr)] & ctype_digit) != 0) + { + int condref = *ptr - '0'; + while (*(++ptr) != ')') condref = condref*10 + *ptr - '0'; + if (condref == 0) + { + *errorptr = ERR35; + goto FAILED; + } + ptr++; + code[3] = OP_CREF; + code[4] = condref >> 8; + code[5] = condref & 255; + skipbytes = 3; + } + else ptr--; + break; + + case '=': /* Positive lookahead */ + bravalue = OP_ASSERT; + ptr++; + break; + + case '!': /* Negative lookahead */ + bravalue = OP_ASSERT_NOT; + ptr++; + break; + + case '<': /* Lookbehinds */ + switch (*(++ptr)) + { + case '=': /* Positive lookbehind */ + bravalue = OP_ASSERTBACK; + ptr++; + break; + + case '!': /* Negative lookbehind */ + bravalue = OP_ASSERTBACK_NOT; + ptr++; + break; + + default: /* Syntax error */ + *errorptr = ERR24; + goto FAILED; + } + break; + + case '>': /* One-time brackets */ + bravalue = OP_ONCE; + ptr++; + break; + + case 'R': /* Pattern recursion */ + *code++ = OP_RECURSE; + ptr++; + continue; + + default: /* Option setting */ + set = unset = 0; + optset = &set; + + while (*ptr != ')' && *ptr != ':') + { + switch (*ptr++) + { + case '-': optset = &unset; break; + + case 'i': *optset |= PCRE_CASELESS; break; + case 'm': *optset |= PCRE_MULTILINE; break; + case 's': *optset |= PCRE_DOTALL; break; + case 'x': *optset |= PCRE_EXTENDED; break; + case 'U': *optset |= PCRE_UNGREEDY; break; + case 'X': *optset |= PCRE_EXTRA; break; + + default: + *errorptr = ERR12; + goto FAILED; + } + } + + /* Set up the changed option bits, but don't change anything yet. */ + + newoptions = (options | set) & (~unset); + + /* If the options ended with ')' this is not the start of a nested + group with option changes, so the options change at this level. At top + level there is nothing else to be done (the options will in fact have + been set from the start of compiling as a result of the first pass) but + at an inner level we must compile code to change the ims options if + necessary, and pass the new setting back so that it can be put at the + start of any following branches, and when this group ends, a resetting + item can be compiled. */ + + if (*ptr == ')') + { + if ((options & PCRE_INGROUP) != 0 && + (options & PCRE_IMS) != (newoptions & PCRE_IMS)) + { + *code++ = OP_OPT; + *code++ = *optchanged = newoptions & PCRE_IMS; + } + options = newoptions; /* Change options at this level */ + previous = NULL; /* This item can't be repeated */ + continue; /* It is complete */ + } + + /* If the options ended with ':' we are heading into a nested group + with possible change of options. Such groups are non-capturing and are + not assertions of any kind. All we need to do is skip over the ':'; + the newoptions value is handled below. */ + + bravalue = OP_BRA; + ptr++; + } + } + + /* Else we have a referencing group; adjust the opcode. If the bracket + number is greater than EXTRACT_BASIC_MAX, we set the opcode one higher, and + arrange for the true number to follow later, in an OP_BRANUMBER item. */ + + else + { + if (++(*brackets) > EXTRACT_BASIC_MAX) + { + bravalue = OP_BRA + EXTRACT_BASIC_MAX + 1; + code[3] = OP_BRANUMBER; + code[4] = *brackets >> 8; + code[5] = *brackets & 255; + skipbytes = 3; + } + else bravalue = OP_BRA + *brackets; + } + + /* Process nested bracketed re. Assertions may not be repeated, but other + kinds can be. We copy code into a non-register variable in order to be able + to pass its address because some compilers complain otherwise. Pass in a + new setting for the ims options if they have changed. */ + + previous = (bravalue >= OP_ONCE)? code : NULL; + *code = bravalue; + tempcode = code; + + if (!compile_regex( + options | PCRE_INGROUP, /* Set for all nested groups */ + ((options & PCRE_IMS) != (newoptions & PCRE_IMS))? + newoptions & PCRE_IMS : -1, /* Pass ims options if changed */ + brackets, /* Extracting bracket count */ + &tempcode, /* Where to put code (updated) */ + &ptr, /* Input pointer (updated) */ + errorptr, /* Where to put an error message */ + (bravalue == OP_ASSERTBACK || + bravalue == OP_ASSERTBACK_NOT), /* TRUE if back assert */ + skipbytes, /* Skip over OP_COND/OP_BRANUMBER */ + &subreqchar, /* For possible last char */ + &subcountlits, /* For literal count */ + cd)) /* Tables block */ + goto FAILED; + + /* At the end of compiling, code is still pointing to the start of the + group, while tempcode has been updated to point past the end of the group + and any option resetting that may follow it. The pattern pointer (ptr) + is on the bracket. */ + + /* If this is a conditional bracket, check that there are no more than + two branches in the group. */ + + else if (bravalue == OP_COND) + { + uschar *tc = code; + condcount = 0; + + do { + condcount++; + tc += (tc[1] << 8) | tc[2]; + } + while (*tc != OP_KET); + + if (condcount > 2) + { + *errorptr = ERR27; + goto FAILED; + } + } + + /* Handle updating of the required character. If the subpattern didn't + set one, leave it as it was. Otherwise, update it for normal brackets of + all kinds, forward assertions, and conditions with two branches. Don't + update the literal count for forward assertions, however. If the bracket + is followed by a quantifier with zero repeat, we have to back off. Hence + the definition of prevreqchar and subcountlits outside the main loop so + that they can be accessed for the back off. */ + + if (subreqchar > 0 && + (bravalue >= OP_BRA || bravalue == OP_ONCE || bravalue == OP_ASSERT || + (bravalue == OP_COND && condcount == 2))) + { + prevreqchar = *reqchar; + *reqchar = subreqchar; + if (bravalue != OP_ASSERT) *countlits += subcountlits; + } + + /* Now update the main code pointer to the end of the group. */ + + code = tempcode; + + /* Error if hit end of pattern */ + + if (*ptr != ')') + { + *errorptr = ERR14; + goto FAILED; + } + break; + + /* Check \ for being a real metacharacter; if not, fall through and handle + it as a data character at the start of a string. Escape items are checked + for validity in the pre-compiling pass. */ + + case '\\': + tempptr = ptr; + c = check_escape(&ptr, errorptr, *brackets, options, FALSE, cd); + + /* Handle metacharacters introduced by \. For ones like \d, the ESC_ values + are arranged to be the negation of the corresponding OP_values. For the + back references, the values are ESC_REF plus the reference number. Only + back references and those types that consume a character may be repeated. + We can test for values between ESC_b and ESC_Z for the latter; this may + have to change if any new ones are ever created. */ + + if (c < 0) + { + if (-c >= ESC_REF) + { + int number = -c - ESC_REF; + previous = code; + *code++ = OP_REF; + *code++ = number >> 8; + *code++ = number & 255; + } + else + { + previous = (-c > ESC_b && -c < ESC_Z)? code : NULL; + *code++ = -c; + } + continue; + } + + /* Data character: reset and fall through */ + + ptr = tempptr; + c = '\\'; + + /* Handle a run of data characters until a metacharacter is encountered. + The first character is guaranteed not to be whitespace or # when the + extended flag is set. */ + + NORMAL_CHAR: + default: + previous = code; + *code = OP_CHARS; + code += 2; + length = 0; + + do + { + if ((options & PCRE_EXTENDED) != 0) + { + if ((cd->ctypes[c] & ctype_space) != 0) continue; + if (c == '#') + { + /* The space before the ; is to avoid a warning on a silly compiler + on the Macintosh. */ + while ((c = *(++ptr)) != 0 && c != NEWLINE) ; + if (c == 0) break; + continue; + } + } + + /* Backslash may introduce a data char or a metacharacter. Escaped items + are checked for validity in the pre-compiling pass. Stop the string + before a metaitem. */ + + if (c == '\\') + { + tempptr = ptr; + c = check_escape(&ptr, errorptr, *brackets, options, FALSE, cd); + if (c < 0) { ptr = tempptr; break; } + + /* If a character is > 127 in UTF-8 mode, we have to turn it into + two or more characters in the UTF-8 encoding. */ + +#ifdef SUPPORT_UTF8 + if (c > 127 && (options & PCRE_UTF8) != 0) + { + uschar buffer[8]; + int len = ord2utf8(c, buffer); + for (c = 0; c < len; c++) *code++ = buffer[c]; + length += len; + continue; + } +#endif + } + + /* Ordinary character or single-char escape */ + + *code++ = c; + length++; + } + + /* This "while" is the end of the "do" above. */ + + while (length < MAXLIT && (cd->ctypes[c = *(++ptr)] & ctype_meta) == 0); + + /* Update the last character and the count of literals */ + + prevreqchar = (length > 1)? code[-2] : *reqchar; + *reqchar = code[-1]; + *countlits += length; + + /* Compute the length and set it in the data vector, and advance to + the next state. */ + + previous[1] = length; + if (length < MAXLIT) ptr--; + break; + } + } /* end of big loop */ + +/* Control never reaches here by falling through, only by a goto for all the +error states. Pass back the position in the pattern so that it can be displayed +to the user for diagnosing the error. */ + +FAILED: +*ptrptr = ptr; +return FALSE; +} + + + + +/************************************************* +* Compile sequence of alternatives * +*************************************************/ + +/* On entry, ptr is pointing past the bracket character, but on return +it points to the closing bracket, or vertical bar, or end of string. +The code variable is pointing at the byte into which the BRA operator has been +stored. If the ims options are changed at the start (for a (?ims: group) or +during any branch, we need to insert an OP_OPT item at the start of every +following branch to ensure they get set correctly at run time, and also pass +the new options into every subsequent branch compile. + +Argument: + options the option bits + optchanged new ims options to set as if (?ims) were at the start, or -1 + for no change + brackets -> int containing the number of extracting brackets used + codeptr -> the address of the current code pointer + ptrptr -> the address of the current pattern pointer + errorptr -> pointer to error message + lookbehind TRUE if this is a lookbehind assertion + skipbytes skip this many bytes at start (for OP_COND, OP_BRANUMBER) + reqchar -> place to put the last required character, or a negative number + countlits -> place to put the shortest literal count of any branch + cd points to the data block with tables pointers + +Returns: TRUE on success +*/ + +static BOOL +compile_regex(int options, int optchanged, int *brackets, uschar **codeptr, + const uschar **ptrptr, const char **errorptr, BOOL lookbehind, int skipbytes, + int *reqchar, int *countlits, compile_data *cd) +{ +const uschar *ptr = *ptrptr; +uschar *code = *codeptr; +uschar *last_branch = code; +uschar *start_bracket = code; +uschar *reverse_count = NULL; +int oldoptions = options & PCRE_IMS; +int branchreqchar, branchcountlits; + +*reqchar = -1; +*countlits = INT_MAX; +code += 3 + skipbytes; + +/* Loop for each alternative branch */ + +for (;;) + { + int length; + + /* Handle change of options */ + + if (optchanged >= 0) + { + *code++ = OP_OPT; + *code++ = optchanged; + options = (options & ~PCRE_IMS) | optchanged; + } + + /* Set up dummy OP_REVERSE if lookbehind assertion */ + + if (lookbehind) + { + *code++ = OP_REVERSE; + reverse_count = code; + *code++ = 0; + *code++ = 0; + } + + /* Now compile the branch */ + + if (!compile_branch(options, brackets, &code, &ptr, errorptr, &optchanged, + &branchreqchar, &branchcountlits, cd)) + { + *ptrptr = ptr; + return FALSE; + } + + /* Fill in the length of the last branch */ + + length = code - last_branch; + last_branch[1] = length >> 8; + last_branch[2] = length & 255; + + /* Save the last required character if all branches have the same; a current + value of -1 means unset, while -2 means "previous branch had no last required + char". */ + + if (*reqchar != -2) + { + if (branchreqchar >= 0) + { + if (*reqchar == -1) *reqchar = branchreqchar; + else if (*reqchar != branchreqchar) *reqchar = -2; + } + else *reqchar = -2; + } + + /* Keep the shortest literal count */ + + if (branchcountlits < *countlits) *countlits = branchcountlits; + DPRINTF(("literal count = %d min=%d\n", branchcountlits, *countlits)); + + /* If lookbehind, check that this branch matches a fixed-length string, + and put the length into the OP_REVERSE item. Temporarily mark the end of + the branch with OP_END. */ + + if (lookbehind) + { + *code = OP_END; + length = find_fixedlength(last_branch, options); + DPRINTF(("fixed length = %d\n", length)); + if (length < 0) + { + *errorptr = ERR25; + *ptrptr = ptr; + return FALSE; + } + reverse_count[0] = (length >> 8); + reverse_count[1] = length & 255; + } + + /* Reached end of expression, either ')' or end of pattern. Insert a + terminating ket and the length of the whole bracketed item, and return, + leaving the pointer at the terminating char. If any of the ims options + were changed inside the group, compile a resetting op-code following. */ + + if (*ptr != '|') + { + length = code - start_bracket; + *code++ = OP_KET; + *code++ = length >> 8; + *code++ = length & 255; + if (optchanged >= 0) + { + *code++ = OP_OPT; + *code++ = oldoptions; + } + *codeptr = code; + *ptrptr = ptr; + return TRUE; + } + + /* Another branch follows; insert an "or" node and advance the pointer. */ + + *code = OP_ALT; + last_branch = code; + code += 3; + ptr++; + } +/* Control never reaches here */ +} + + + + +/************************************************* +* Find first significant op code * +*************************************************/ + +/* This is called by several functions that scan a compiled expression looking +for a fixed first character, or an anchoring op code etc. It skips over things +that do not influence this. For one application, a change of caseless option is +important. + +Arguments: + code pointer to the start of the group + options pointer to external options + optbit the option bit whose changing is significant, or + zero if none are + optstop TRUE to return on option change, otherwise change the options + value and continue + +Returns: pointer to the first significant opcode +*/ + +static const uschar* +first_significant_code(const uschar *code, int *options, int optbit, + BOOL optstop) +{ +for (;;) + { + switch ((int)*code) + { + case OP_OPT: + if (optbit > 0 && ((int)code[1] & optbit) != (*options & optbit)) + { + if (optstop) return code; + *options = (int)code[1]; + } + code += 2; + break; + + case OP_CREF: + case OP_BRANUMBER: + code += 3; + break; + + case OP_WORD_BOUNDARY: + case OP_NOT_WORD_BOUNDARY: + code++; + break; + + case OP_ASSERT_NOT: + case OP_ASSERTBACK: + case OP_ASSERTBACK_NOT: + do code += (code[1] << 8) + code[2]; while (*code == OP_ALT); + code += 3; + break; + + default: + return code; + } + } +/* Control never reaches here */ +} + + + + +/************************************************* +* Check for anchored expression * +*************************************************/ + +/* Try to find out if this is an anchored regular expression. Consider each +alternative branch. If they all start with OP_SOD or OP_CIRC, or with a bracket +all of whose alternatives start with OP_SOD or OP_CIRC (recurse ad lib), then +it's anchored. However, if this is a multiline pattern, then only OP_SOD +counts, since OP_CIRC can match in the middle. + +A branch is also implicitly anchored if it starts with .* and DOTALL is set, +because that will try the rest of the pattern at all possible matching points, +so there is no point trying them again. + +Arguments: + code points to start of expression (the bracket) + options points to the options setting + +Returns: TRUE or FALSE +*/ + +static BOOL +is_anchored(register const uschar *code, int *options) +{ +do { + const uschar *scode = first_significant_code(code + 3, options, + PCRE_MULTILINE, FALSE); + register int op = *scode; + if (op >= OP_BRA || op == OP_ASSERT || op == OP_ONCE || op == OP_COND) + { if (!is_anchored(scode, options)) return FALSE; } + else if ((op == OP_TYPESTAR || op == OP_TYPEMINSTAR) && + (*options & PCRE_DOTALL) != 0) + { if (scode[1] != OP_ANY) return FALSE; } + else if (op != OP_SOD && + ((*options & PCRE_MULTILINE) != 0 || op != OP_CIRC)) + return FALSE; + code += (code[1] << 8) + code[2]; + } +while (*code == OP_ALT); +return TRUE; +} + + + +/************************************************* +* Check for starting with ^ or .* * +*************************************************/ + +/* This is called to find out if every branch starts with ^ or .* so that +"first char" processing can be done to speed things up in multiline +matching and for non-DOTALL patterns that start with .* (which must start at +the beginning or after \n). + +Argument: points to start of expression (the bracket) +Returns: TRUE or FALSE +*/ + +static BOOL +is_startline(const uschar *code) +{ +do { + const uschar *scode = first_significant_code(code + 3, NULL, 0, FALSE); + register int op = *scode; + if (op >= OP_BRA || op == OP_ASSERT || op == OP_ONCE || op == OP_COND) + { if (!is_startline(scode)) return FALSE; } + else if (op == OP_TYPESTAR || op == OP_TYPEMINSTAR) + { if (scode[1] != OP_ANY) return FALSE; } + else if (op != OP_CIRC) return FALSE; + code += (code[1] << 8) + code[2]; + } +while (*code == OP_ALT); +return TRUE; +} + + + +/************************************************* +* Check for fixed first char * +*************************************************/ + +/* Try to find out if there is a fixed first character. This is called for +unanchored expressions, as it speeds up their processing quite considerably. +Consider each alternative branch. If they all start with the same char, or with +a bracket all of whose alternatives start with the same char (recurse ad lib), +then we return that char, otherwise -1. + +Arguments: + code points to start of expression (the bracket) + options pointer to the options (used to check casing changes) + +Returns: -1 or the fixed first char +*/ + +static int +find_firstchar(const uschar *code, int *options) +{ +register int c = -1; +do { + int d; + const uschar *scode = first_significant_code(code + 3, options, + PCRE_CASELESS, TRUE); + register int op = *scode; + + if (op >= OP_BRA) op = OP_BRA; + + switch(op) + { + default: + return -1; + + case OP_BRA: + case OP_ASSERT: + case OP_ONCE: + case OP_COND: + if ((d = find_firstchar(scode, options)) < 0) return -1; + if (c < 0) c = d; else if (c != d) return -1; + break; + + case OP_EXACT: /* Fall through */ + scode++; + + case OP_CHARS: /* Fall through */ + scode++; + + case OP_PLUS: + case OP_MINPLUS: + if (c < 0) c = scode[1]; else if (c != scode[1]) return -1; + break; + } + + code += (code[1] << 8) + code[2]; + } +while (*code == OP_ALT); +return c; +} + + + + + +/************************************************* +* Compile a Regular Expression * +*************************************************/ + +/* This function takes a string and returns a pointer to a block of store +holding a compiled version of the expression. + +Arguments: + pattern the regular expression + options various option bits + errorptr pointer to pointer to error text + erroroffset ptr offset in pattern where error was detected + tables pointer to character tables or NULL + +Returns: pointer to compiled data block, or NULL on error, + with errorptr and erroroffset set +*/ + +pcre * +pcre_compile(const char *pattern, int options, const char **errorptr, + int *erroroffset, const unsigned char *tables) +{ +real_pcre *re; +int length = 3; /* For initial BRA plus length */ +int runlength; +int c, reqchar, countlits; +int bracount = 0; +int top_backref = 0; +int branch_extra = 0; +int branch_newextra; +unsigned int brastackptr = 0; +size_t size; +uschar *code; +const uschar *ptr; +compile_data compile_block; +int brastack[BRASTACK_SIZE]; +uschar bralenstack[BRASTACK_SIZE]; + +#ifdef DEBUG +uschar *code_base, *code_end; +#endif + +/* Can't support UTF8 unless PCRE has been compiled to include the code. */ + +#ifndef SUPPORT_UTF8 +if ((options & PCRE_UTF8) != 0) + { + *errorptr = ERR32; + return NULL; + } +#endif + +/* We can't pass back an error message if errorptr is NULL; I guess the best we +can do is just return NULL. */ + +if (errorptr == NULL) return NULL; +*errorptr = NULL; + +/* However, we can give a message for this error */ + +if (erroroffset == NULL) + { + *errorptr = ERR16; + return NULL; + } +*erroroffset = 0; + +if ((options & ~PUBLIC_OPTIONS) != 0) + { + *errorptr = ERR17; + return NULL; + } + +/* Set up pointers to the individual character tables */ + +if (tables == NULL) tables = pcre_default_tables; +compile_block.lcc = tables + lcc_offset; +compile_block.fcc = tables + fcc_offset; +compile_block.cbits = tables + cbits_offset; +compile_block.ctypes = tables + ctypes_offset; + +/* Reflect pattern for debugging output */ + +DPRINTF(("------------------------------------------------------------------\n")); +DPRINTF(("%s\n", pattern)); + +/* The first thing to do is to make a pass over the pattern to compute the +amount of store required to hold the compiled code. This does not have to be +perfect as long as errors are overestimates. At the same time we can detect any +internal flag settings. Make an attempt to correct for any counted white space +if an "extended" flag setting appears late in the pattern. We can't be so +clever for #-comments. */ + +ptr = (const uschar *)(pattern - 1); +while ((c = *(++ptr)) != 0) + { + int min, max; + int class_charcount; + int bracket_length; + + if ((options & PCRE_EXTENDED) != 0) + { + if ((compile_block.ctypes[c] & ctype_space) != 0) continue; + if (c == '#') + { + /* The space before the ; is to avoid a warning on a silly compiler + on the Macintosh. */ + while ((c = *(++ptr)) != 0 && c != NEWLINE) ; + continue; + } + } + + switch(c) + { + /* A backslashed item may be an escaped "normal" character or a + character type. For a "normal" character, put the pointers and + character back so that tests for whitespace etc. in the input + are done correctly. */ + + case '\\': + { + const uschar *save_ptr = ptr; + c = check_escape(&ptr, errorptr, bracount, options, FALSE, &compile_block); + if (*errorptr != NULL) goto PCRE_ERROR_RETURN; + if (c >= 0) + { + ptr = save_ptr; + c = '\\'; + goto NORMAL_CHAR; + } + } + length++; + + /* A back reference needs an additional 2 bytes, plus either one or 5 + bytes for a repeat. We also need to keep the value of the highest + back reference. */ + + if (c <= -ESC_REF) + { + int refnum = -c - ESC_REF; + if (refnum > top_backref) top_backref = refnum; + length += 2; /* For single back reference */ + if (ptr[1] == '{' && is_counted_repeat(ptr+2, &compile_block)) + { + ptr = read_repeat_counts(ptr+2, &min, &max, errorptr, &compile_block); + if (*errorptr != NULL) goto PCRE_ERROR_RETURN; + if ((min == 0 && (max == 1 || max == -1)) || + (min == 1 && max == -1)) + length++; + else length += 5; + if (ptr[1] == '?') ptr++; + } + } + continue; + + case '^': + case '.': + case '$': + case '*': /* These repeats won't be after brackets; */ + case '+': /* those are handled separately */ + case '?': + length++; + continue; + + /* This covers the cases of repeats after a single char, metachar, class, + or back reference. */ + + case '{': + if (!is_counted_repeat(ptr+1, &compile_block)) goto NORMAL_CHAR; + ptr = read_repeat_counts(ptr+1, &min, &max, errorptr, &compile_block); + if (*errorptr != NULL) goto PCRE_ERROR_RETURN; + if ((min == 0 && (max == 1 || max == -1)) || + (min == 1 && max == -1)) + length++; + else + { + length--; /* Uncount the original char or metachar */ + if (min == 1) length++; else if (min > 0) length += 4; + if (max > 0) length += 4; else length += 2; + } + if (ptr[1] == '?') ptr++; + continue; + + /* An alternation contains an offset to the next branch or ket. If any ims + options changed in the previous branch(es), and/or if we are in a + lookbehind assertion, extra space will be needed at the start of the + branch. This is handled by branch_extra. */ + + case '|': + length += 3 + branch_extra; + continue; + + /* A character class uses 33 characters. Don't worry about character types + that aren't allowed in classes - they'll get picked up during the compile. + A character class that contains only one character uses 2 or 3 bytes, + depending on whether it is negated or not. Notice this where we can. */ + + case '[': + class_charcount = 0; + if (*(++ptr) == '^') ptr++; + do + { + if (*ptr == '\\') + { + int ch = check_escape(&ptr, errorptr, bracount, options, TRUE, + &compile_block); + if (*errorptr != NULL) goto PCRE_ERROR_RETURN; + if (-ch == ESC_b) class_charcount++; else class_charcount = 10; + } + else class_charcount++; + ptr++; + } + while (*ptr != 0 && *ptr != ']'); + + /* Repeats for negated single chars are handled by the general code */ + + if (class_charcount == 1) length += 3; else + { + length += 33; + + /* A repeat needs either 1 or 5 bytes. */ + + if (*ptr != 0 && ptr[1] == '{' && is_counted_repeat(ptr+2, &compile_block)) + { + ptr = read_repeat_counts(ptr+2, &min, &max, errorptr, &compile_block); + if (*errorptr != NULL) goto PCRE_ERROR_RETURN; + if ((min == 0 && (max == 1 || max == -1)) || + (min == 1 && max == -1)) + length++; + else length += 5; + if (ptr[1] == '?') ptr++; + } + } + continue; + + /* Brackets may be genuine groups or special things */ + + case '(': + branch_newextra = 0; + bracket_length = 3; + + /* Handle special forms of bracket, which all start (? */ + + if (ptr[1] == '?') + { + int set, unset; + int *optset; + + switch (c = ptr[2]) + { + /* Skip over comments entirely */ + case '#': + ptr += 3; + while (*ptr != 0 && *ptr != ')') ptr++; + if (*ptr == 0) + { + *errorptr = ERR18; + goto PCRE_ERROR_RETURN; + } + continue; + + /* Non-referencing groups and lookaheads just move the pointer on, and + then behave like a non-special bracket, except that they don't increment + the count of extracting brackets. Ditto for the "once only" bracket, + which is in Perl from version 5.005. */ + + case ':': + case '=': + case '!': + case '>': + ptr += 2; + break; + + /* A recursive call to the regex is an extension, to provide the + facility which can be obtained by $(?p{perl-code}) in Perl 5.6. */ + + case 'R': + if (ptr[3] != ')') + { + *errorptr = ERR29; + goto PCRE_ERROR_RETURN; + } + ptr += 3; + length += 1; + break; + + /* Lookbehinds are in Perl from version 5.005 */ + + case '<': + if (ptr[3] == '=' || ptr[3] == '!') + { + ptr += 3; + branch_newextra = 3; + length += 3; /* For the first branch */ + break; + } + *errorptr = ERR24; + goto PCRE_ERROR_RETURN; + + /* Conditionals are in Perl from version 5.005. The bracket must either + be followed by a number (for bracket reference) or by an assertion + group. */ + + case '(': + if ((compile_block.ctypes[ptr[3]] & ctype_digit) != 0) + { + ptr += 4; + length += 3; + while ((compile_block.ctypes[*ptr] & ctype_digit) != 0) ptr++; + if (*ptr != ')') + { + *errorptr = ERR26; + goto PCRE_ERROR_RETURN; + } + } + else /* An assertion must follow */ + { + ptr++; /* Can treat like ':' as far as spacing is concerned */ + if (ptr[2] != '?' || + (ptr[3] != '=' && ptr[3] != '!' && ptr[3] != '<') ) + { + ptr += 2; /* To get right offset in message */ + *errorptr = ERR28; + goto PCRE_ERROR_RETURN; + } + } + break; + + /* Else loop checking valid options until ) is met. Anything else is an + error. If we are without any brackets, i.e. at top level, the settings + act as if specified in the options, so massage the options immediately. + This is for backward compatibility with Perl 5.004. */ + + default: + set = unset = 0; + optset = &set; + ptr += 2; + + for (;; ptr++) + { + c = *ptr; + switch (c) + { + case 'i': + *optset |= PCRE_CASELESS; + continue; + + case 'm': + *optset |= PCRE_MULTILINE; + continue; + + case 's': + *optset |= PCRE_DOTALL; + continue; + + case 'x': + *optset |= PCRE_EXTENDED; + continue; + + case 'X': + *optset |= PCRE_EXTRA; + continue; + + case 'U': + *optset |= PCRE_UNGREEDY; + continue; + + case '-': + optset = &unset; + continue; + + /* A termination by ')' indicates an options-setting-only item; + this is global at top level; otherwise nothing is done here and + it is handled during the compiling process on a per-bracket-group + basis. */ + + case ')': + if (brastackptr == 0) + { + options = (options | set) & (~unset); + set = unset = 0; /* To save length */ + } + /* Fall through */ + + /* A termination by ':' indicates the start of a nested group with + the given options set. This is again handled at compile time, but + we must allow for compiled space if any of the ims options are + set. We also have to allow for resetting space at the end of + the group, which is why 4 is added to the length and not just 2. + If there are several changes of options within the same group, this + will lead to an over-estimate on the length, but this shouldn't + matter very much. We also have to allow for resetting options at + the start of any alternations, which we do by setting + branch_newextra to 2. Finally, we record whether the case-dependent + flag ever changes within the regex. This is used by the "required + character" code. */ + + case ':': + if (((set|unset) & PCRE_IMS) != 0) + { + length += 4; + branch_newextra = 2; + if (((set|unset) & PCRE_CASELESS) != 0) options |= PCRE_ICHANGED; + } + goto END_OPTIONS; + + /* Unrecognized option character */ + + default: + *errorptr = ERR12; + goto PCRE_ERROR_RETURN; + } + } + + /* If we hit a closing bracket, that's it - this is a freestanding + option-setting. We need to ensure that branch_extra is updated if + necessary. The only values branch_newextra can have here are 0 or 2. + If the value is 2, then branch_extra must either be 2 or 5, depending + on whether this is a lookbehind group or not. */ + + END_OPTIONS: + if (c == ')') + { + if (branch_newextra == 2 && (branch_extra == 0 || branch_extra == 3)) + branch_extra += branch_newextra; + continue; + } + + /* If options were terminated by ':' control comes here. Fall through + to handle the group below. */ + } + } + + /* Extracting brackets must be counted so we can process escapes in a + Perlish way. If the number exceeds EXTRACT_BASIC_MAX we are going to + need an additional 3 bytes of store per extracting bracket. */ + + else + { + bracount++; + if (bracount > EXTRACT_BASIC_MAX) bracket_length += 3; + } + + /* Save length for computing whole length at end if there's a repeat that + requires duplication of the group. Also save the current value of + branch_extra, and start the new group with the new value. If non-zero, this + will either be 2 for a (?imsx: group, or 3 for a lookbehind assertion. */ + + if (brastackptr >= sizeof(brastack)/sizeof(int)) + { + *errorptr = ERR19; + goto PCRE_ERROR_RETURN; + } + + bralenstack[brastackptr] = branch_extra; + branch_extra = branch_newextra; + + brastack[brastackptr++] = length; + length += bracket_length; + continue; + + /* Handle ket. Look for subsequent max/min; for certain sets of values we + have to replicate this bracket up to that many times. If brastackptr is + 0 this is an unmatched bracket which will generate an error, but take care + not to try to access brastack[-1] when computing the length and restoring + the branch_extra value. */ + + case ')': + length += 3; + { + int minval = 1; + int maxval = 1; + int duplength; + + if (brastackptr > 0) + { + duplength = length - brastack[--brastackptr]; + branch_extra = bralenstack[brastackptr]; + } + else duplength = 0; + + /* Leave ptr at the final char; for read_repeat_counts this happens + automatically; for the others we need an increment. */ + + if ((c = ptr[1]) == '{' && is_counted_repeat(ptr+2, &compile_block)) + { + ptr = read_repeat_counts(ptr+2, &minval, &maxval, errorptr, + &compile_block); + if (*errorptr != NULL) goto PCRE_ERROR_RETURN; + } + else if (c == '*') { minval = 0; maxval = -1; ptr++; } + else if (c == '+') { maxval = -1; ptr++; } + else if (c == '?') { minval = 0; ptr++; } + + /* If the minimum is zero, we have to allow for an OP_BRAZERO before the + group, and if the maximum is greater than zero, we have to replicate + maxval-1 times; each replication acquires an OP_BRAZERO plus a nesting + bracket set - hence the 7. */ + + if (minval == 0) + { + length++; + if (maxval > 0) length += (maxval - 1) * (duplength + 7); + } + + /* When the minimum is greater than zero, 1 we have to replicate up to + minval-1 times, with no additions required in the copies. Then, if + there is a limited maximum we have to replicate up to maxval-1 times + allowing for a BRAZERO item before each optional copy and nesting + brackets for all but one of the optional copies. */ + + else + { + length += (minval - 1) * duplength; + if (maxval > minval) /* Need this test as maxval=-1 means no limit */ + length += (maxval - minval) * (duplength + 7) - 6; + } + } + continue; + + /* Non-special character. For a run of such characters the length required + is the number of characters + 2, except that the maximum run length is 255. + We won't get a skipped space or a non-data escape or the start of a # + comment as the first character, so the length can't be zero. */ + + NORMAL_CHAR: + default: + length += 2; + runlength = 0; + do + { + if ((options & PCRE_EXTENDED) != 0) + { + if ((compile_block.ctypes[c] & ctype_space) != 0) continue; + if (c == '#') + { + /* The space before the ; is to avoid a warning on a silly compiler + on the Macintosh. */ + while ((c = *(++ptr)) != 0 && c != NEWLINE) ; + continue; + } + } + + /* Backslash may introduce a data char or a metacharacter; stop the + string before the latter. */ + + if (c == '\\') + { + const uschar *saveptr = ptr; + c = check_escape(&ptr, errorptr, bracount, options, FALSE, + &compile_block); + if (*errorptr != NULL) goto PCRE_ERROR_RETURN; + if (c < 0) { ptr = saveptr; break; } + +#ifdef SUPPORT_UTF8 + if (c > 127 && (options & PCRE_UTF8) != 0) + { + int i; + for (i = 0; i < sizeof(utf8_table1)/sizeof(int); i++) + if (c <= utf8_table1[i]) break; + runlength += i; + } +#endif + } + + /* Ordinary character or single-char escape */ + + runlength++; + } + + /* This "while" is the end of the "do" above. */ + + while (runlength < MAXLIT && + (compile_block.ctypes[c = *(++ptr)] & ctype_meta) == 0); + + ptr--; + length += runlength; + continue; + } + } + +length += 4; /* For final KET and END */ + +if (length > 65539) + { + *errorptr = ERR20; + return NULL; + } + +/* Compute the size of data block needed and get it, either from malloc or +externally provided function. We specify "code[0]" in the offsetof() expression +rather than just "code", because it has been reported that one broken compiler +fails on "code" because it is also an independent variable. It should make no +difference to the value of the offsetof(). */ + +size = length + offsetof(real_pcre, code[0]); +re = (real_pcre *)(pcre_malloc)(size); + +if (re == NULL) + { + *errorptr = ERR21; + return NULL; + } + +/* Put in the magic number, and save the size, options, and table pointer */ + +re->magic_number = MAGIC_NUMBER; +re->size = size; +re->options = options; +re->tables = tables; + +/* Set up a starting, non-extracting bracket, then compile the expression. On +error, *errorptr will be set non-NULL, so we don't need to look at the result +of the function here. */ + +ptr = (const uschar *)pattern; +code = re->code; +*code = OP_BRA; +bracount = 0; +(void)compile_regex(options, -1, &bracount, &code, &ptr, errorptr, FALSE, 0, + &reqchar, &countlits, &compile_block); +re->top_bracket = bracount; +re->top_backref = top_backref; + +/* If not reached end of pattern on success, there's an excess bracket. */ + +if (*errorptr == NULL && *ptr != 0) *errorptr = ERR22; + +/* Fill in the terminating state and check for disastrous overflow, but +if debugging, leave the test till after things are printed out. */ + +*code++ = OP_END; + +#ifndef DEBUG +if (code - re->code > length) *errorptr = ERR23; +#endif + +/* Give an error if there's back reference to a non-existent capturing +subpattern. */ + +if (top_backref > re->top_bracket) *errorptr = ERR15; + +/* Failed to compile */ + +if (*errorptr != NULL) + { + (pcre_free)(re); + PCRE_ERROR_RETURN: + *erroroffset = ptr - (const uschar *)pattern; + return NULL; + } + +/* If the anchored option was not passed, set flag if we can determine that the +pattern is anchored by virtue of ^ characters or \A or anything else (such as +starting with .* when DOTALL is set). + +Otherwise, see if we can determine what the first character has to be, because +that speeds up unanchored matches no end. If not, see if we can set the +PCRE_STARTLINE flag. This is helpful for multiline matches when all branches +start with ^. and also when all branches start with .* for non-DOTALL matches. +*/ + +if ((options & PCRE_ANCHORED) == 0) + { + int temp_options = options; + if (is_anchored(re->code, &temp_options)) + re->options |= PCRE_ANCHORED; + else + { + int ch = find_firstchar(re->code, &temp_options); + if (ch >= 0) + { + re->first_char = ch; + re->options |= PCRE_FIRSTSET; + } + else if (is_startline(re->code)) + re->options |= PCRE_STARTLINE; + } + } + +/* Save the last required character if there are at least two literal +characters on all paths, or if there is no first character setting. */ + +if (reqchar >= 0 && (countlits > 1 || (re->options & PCRE_FIRSTSET) == 0)) + { + re->req_char = reqchar; + re->options |= PCRE_REQCHSET; + } + +/* Print out the compiled data for debugging */ + +#ifdef DEBUG + +printf("Length = %d top_bracket = %d top_backref = %d\n", + length, re->top_bracket, re->top_backref); + +if (re->options != 0) + { + printf("%s%s%s%s%s%s%s%s%s\n", + ((re->options & PCRE_ANCHORED) != 0)? "anchored " : "", + ((re->options & PCRE_CASELESS) != 0)? "caseless " : "", + ((re->options & PCRE_ICHANGED) != 0)? "case state changed " : "", + ((re->options & PCRE_EXTENDED) != 0)? "extended " : "", + ((re->options & PCRE_MULTILINE) != 0)? "multiline " : "", + ((re->options & PCRE_DOTALL) != 0)? "dotall " : "", + ((re->options & PCRE_DOLLAR_ENDONLY) != 0)? "endonly " : "", + ((re->options & PCRE_EXTRA) != 0)? "extra " : "", + ((re->options & PCRE_UNGREEDY) != 0)? "ungreedy " : ""); + } + +if ((re->options & PCRE_FIRSTSET) != 0) + { + if (isprint(re->first_char)) printf("First char = %c\n", re->first_char); + else printf("First char = \\x%02x\n", re->first_char); + } + +if ((re->options & PCRE_REQCHSET) != 0) + { + if (isprint(re->req_char)) printf("Req char = %c\n", re->req_char); + else printf("Req char = \\x%02x\n", re->req_char); + } + +code_end = code; +code_base = code = re->code; + +while (code < code_end) + { + int charlength; + + printf("%3d ", code - code_base); + + if (*code >= OP_BRA) + { + if (*code - OP_BRA > EXTRACT_BASIC_MAX) + printf("%3d Bra extra", (code[1] << 8) + code[2]); + else + printf("%3d Bra %d", (code[1] << 8) + code[2], *code - OP_BRA); + code += 2; + } + + else switch(*code) + { + case OP_OPT: + printf(" %.2x %s", code[1], OP_names[*code]); + code++; + break; + + case OP_CHARS: + charlength = *(++code); + printf("%3d ", charlength); + while (charlength-- > 0) + if (isprint(c = *(++code))) printf("%c", c); else printf("\\x%02x", c); + break; + + case OP_KETRMAX: + case OP_KETRMIN: + case OP_ALT: + case OP_KET: + case OP_ASSERT: + case OP_ASSERT_NOT: + case OP_ASSERTBACK: + case OP_ASSERTBACK_NOT: + case OP_ONCE: + case OP_REVERSE: + case OP_BRANUMBER: + case OP_COND: + case OP_CREF: + printf("%3d %s", (code[1] << 8) + code[2], OP_names[*code]); + code += 2; + break; + + case OP_STAR: + case OP_MINSTAR: + case OP_PLUS: + case OP_MINPLUS: + case OP_QUERY: + case OP_MINQUERY: + case OP_TYPESTAR: + case OP_TYPEMINSTAR: + case OP_TYPEPLUS: + case OP_TYPEMINPLUS: + case OP_TYPEQUERY: + case OP_TYPEMINQUERY: + if (*code >= OP_TYPESTAR) + printf(" %s", OP_names[code[1]]); + else if (isprint(c = code[1])) printf(" %c", c); + else printf(" \\x%02x", c); + printf("%s", OP_names[*code++]); + break; + + case OP_EXACT: + case OP_UPTO: + case OP_MINUPTO: + if (isprint(c = code[3])) printf(" %c{", c); + else printf(" \\x%02x{", c); + if (*code != OP_EXACT) printf("0,"); + printf("%d}", (code[1] << 8) + code[2]); + if (*code == OP_MINUPTO) printf("?"); + code += 3; + break; + + case OP_TYPEEXACT: + case OP_TYPEUPTO: + case OP_TYPEMINUPTO: + printf(" %s{", OP_names[code[3]]); + if (*code != OP_TYPEEXACT) printf(","); + printf("%d}", (code[1] << 8) + code[2]); + if (*code == OP_TYPEMINUPTO) printf("?"); + code += 3; + break; + + case OP_NOT: + if (isprint(c = *(++code))) printf(" [^%c]", c); + else printf(" [^\\x%02x]", c); + break; + + case OP_NOTSTAR: + case OP_NOTMINSTAR: + case OP_NOTPLUS: + case OP_NOTMINPLUS: + case OP_NOTQUERY: + case OP_NOTMINQUERY: + if (isprint(c = code[1])) printf(" [^%c]", c); + else printf(" [^\\x%02x]", c); + printf("%s", OP_names[*code++]); + break; + + case OP_NOTEXACT: + case OP_NOTUPTO: + case OP_NOTMINUPTO: + if (isprint(c = code[3])) printf(" [^%c]{", c); + else printf(" [^\\x%02x]{", c); + if (*code != OP_NOTEXACT) printf(","); + printf("%d}", (code[1] << 8) + code[2]); + if (*code == OP_NOTMINUPTO) printf("?"); + code += 3; + break; + + case OP_REF: + printf(" \\%d", (code[1] << 8) | code[2]); + code += 3; + goto CLASS_REF_REPEAT; + + case OP_CLASS: + { + int i, min, max; + code++; + printf(" ["); + + for (i = 0; i < 256; i++) + { + if ((code[i/8] & (1 << (i&7))) != 0) + { + int j; + for (j = i+1; j < 256; j++) + if ((code[j/8] & (1 << (j&7))) == 0) break; + if (i == '-' || i == ']') printf("\\"); + if (isprint(i)) printf("%c", i); else printf("\\x%02x", i); + if (--j > i) + { + printf("-"); + if (j == '-' || j == ']') printf("\\"); + if (isprint(j)) printf("%c", j); else printf("\\x%02x", j); + } + i = j; + } + } + printf("]"); + code += 32; + + CLASS_REF_REPEAT: + + switch(*code) + { + case OP_CRSTAR: + case OP_CRMINSTAR: + case OP_CRPLUS: + case OP_CRMINPLUS: + case OP_CRQUERY: + case OP_CRMINQUERY: + printf("%s", OP_names[*code]); + break; + + case OP_CRRANGE: + case OP_CRMINRANGE: + min = (code[1] << 8) + code[2]; + max = (code[3] << 8) + code[4]; + if (max == 0) printf("{%d,}", min); + else printf("{%d,%d}", min, max); + if (*code == OP_CRMINRANGE) printf("?"); + code += 4; + break; + + default: + code--; + } + } + break; + + /* Anything else is just a one-node item */ + + default: + printf(" %s", OP_names[*code]); + break; + } + + code++; + printf("\n"); + } +printf("------------------------------------------------------------------\n"); + +/* This check is done here in the debugging case so that the code that +was compiled can be seen. */ + +if (code - re->code > length) + { + *errorptr = ERR23; + (pcre_free)(re); + *erroroffset = ptr - (uschar *)pattern; + return NULL; + } +#endif + +return (pcre *)re; +} + + + +/************************************************* +* Match a back-reference * +*************************************************/ + +/* If a back reference hasn't been set, the length that is passed is greater +than the number of characters left in the string, so the match fails. + +Arguments: + offset index into the offset vector + eptr points into the subject + length length to be matched + md points to match data block + ims the ims flags + +Returns: TRUE if matched +*/ + +static BOOL +match_ref(int offset, register const uschar *eptr, int length, match_data *md, + unsigned long int ims) +{ +const uschar *p = md->start_subject + md->offset_vector[offset]; + +#ifdef DEBUG +if (eptr >= md->end_subject) + printf("matching subject "); +else + { + printf("matching subject "); + pchars(eptr, length, TRUE, md); + } +printf(" against backref "); +pchars(p, length, FALSE, md); +printf("\n"); +#endif + +/* Always fail if not enough characters left */ + +if (length > md->end_subject - eptr) return FALSE; + +/* Separate the caselesss case for speed */ + +if ((ims & PCRE_CASELESS) != 0) + { + while (length-- > 0) + if (md->lcc[*p++] != md->lcc[*eptr++]) return FALSE; + } +else + { while (length-- > 0) if (*p++ != *eptr++) return FALSE; } + +return TRUE; +} + + + +/************************************************* +* Match from current position * +*************************************************/ + +/* On entry ecode points to the first opcode, and eptr to the first character +in the subject string, while eptrb holds the value of eptr at the start of the +last bracketed group - used for breaking infinite loops matching zero-length +strings. + +Arguments: + eptr pointer in subject + ecode position in code + offset_top current top pointer + md pointer to "static" info for the match + ims current /i, /m, and /s options + eptrb pointer to chain of blocks containing eptr at start of + brackets - for testing for empty matches + flags can contain + match_condassert - this is an assertion condition + match_isgroup - this is the start of a bracketed group + +Returns: TRUE if matched +*/ + +static BOOL +match(register const uschar *eptr, register const uschar *ecode, + int offset_top, match_data *md, unsigned long int ims, eptrblock *eptrb, + int flags) +{ +unsigned long int original_ims = ims; /* Save for resetting on ')' */ +eptrblock newptrb; + +/* At the start of a bracketed group, add the current subject pointer to the +stack of such pointers, to be re-instated at the end of the group when we hit +the closing ket. When match() is called in other circumstances, we don't add to +the stack. */ + +if ((flags & match_isgroup) != 0) + { + newptrb.prev = eptrb; + newptrb.saved_eptr = eptr; + eptrb = &newptrb; + } + +/* Now start processing the operations. */ + +for (;;) + { + int op = (int)*ecode; + int min, max, ctype; + register int i; + register int c; + BOOL minimize = FALSE; + + /* Opening capturing bracket. If there is space in the offset vector, save + the current subject position in the working slot at the top of the vector. We + mustn't change the current values of the data slot, because they may be set + from a previous iteration of this group, and be referred to by a reference + inside the group. + + If the bracket fails to match, we need to restore this value and also the + values of the final offsets, in case they were set by a previous iteration of + the same bracket. + + If there isn't enough space in the offset vector, treat this as if it were a + non-capturing bracket. Don't worry about setting the flag for the error case + here; that is handled in the code for KET. */ + + if (op > OP_BRA) + { + int offset; + int number = op - OP_BRA; + + /* For extended extraction brackets (large number), we have to fish out the + number from a dummy opcode at the start. */ + + if (number > EXTRACT_BASIC_MAX) number = (ecode[4] << 8) | ecode[5]; + offset = number << 1; + +#ifdef DEBUG + printf("start bracket %d subject=", number); + pchars(eptr, 16, TRUE, md); + printf("\n"); +#endif + + if (offset < md->offset_max) + { + int save_offset1 = md->offset_vector[offset]; + int save_offset2 = md->offset_vector[offset+1]; + int save_offset3 = md->offset_vector[md->offset_end - number]; + + DPRINTF(("saving %d %d %d\n", save_offset1, save_offset2, save_offset3)); + md->offset_vector[md->offset_end - number] = eptr - md->start_subject; + + do + { + if (match(eptr, ecode+3, offset_top, md, ims, eptrb, match_isgroup)) + return TRUE; + ecode += (ecode[1] << 8) + ecode[2]; + } + while (*ecode == OP_ALT); + + DPRINTF(("bracket %d failed\n", number)); + + md->offset_vector[offset] = save_offset1; + md->offset_vector[offset+1] = save_offset2; + md->offset_vector[md->offset_end - number] = save_offset3; + + return FALSE; + } + + /* Insufficient room for saving captured contents */ + + else op = OP_BRA; + } + + /* Other types of node can be handled by a switch */ + + switch(op) + { + case OP_BRA: /* Non-capturing bracket: optimized */ + DPRINTF(("start bracket 0\n")); + do + { + if (match(eptr, ecode+3, offset_top, md, ims, eptrb, match_isgroup)) + return TRUE; + ecode += (ecode[1] << 8) + ecode[2]; + } + while (*ecode == OP_ALT); + DPRINTF(("bracket 0 failed\n")); + return FALSE; + + /* Conditional group: compilation checked that there are no more than + two branches. If the condition is false, skipping the first branch takes us + past the end if there is only one branch, but that's OK because that is + exactly what going to the ket would do. */ + + case OP_COND: + if (ecode[3] == OP_CREF) /* Condition is extraction test */ + { + int offset = (ecode[4] << 9) | (ecode[5] << 1); /* Doubled ref number */ + return match(eptr, + ecode + ((offset < offset_top && md->offset_vector[offset] >= 0)? + 6 : 3 + (ecode[1] << 8) + ecode[2]), + offset_top, md, ims, eptrb, match_isgroup); + } + + /* The condition is an assertion. Call match() to evaluate it - setting + the final argument TRUE causes it to stop at the end of an assertion. */ + + else + { + if (match(eptr, ecode+3, offset_top, md, ims, NULL, + match_condassert | match_isgroup)) + { + ecode += 3 + (ecode[4] << 8) + ecode[5]; + while (*ecode == OP_ALT) ecode += (ecode[1] << 8) + ecode[2]; + } + else ecode += (ecode[1] << 8) + ecode[2]; + return match(eptr, ecode+3, offset_top, md, ims, eptrb, match_isgroup); + } + /* Control never reaches here */ + + /* Skip over conditional reference or large extraction number data if + encountered. */ + + case OP_CREF: + case OP_BRANUMBER: + ecode += 3; + break; + + /* End of the pattern. If PCRE_NOTEMPTY is set, fail if we have matched + an empty string - recursion will then try other alternatives, if any. */ + + case OP_END: + if (md->notempty && eptr == md->start_match) return FALSE; + md->end_match_ptr = eptr; /* Record where we ended */ + md->end_offset_top = offset_top; /* and how many extracts were taken */ + return TRUE; + + /* Change option settings */ + + case OP_OPT: + ims = ecode[1]; + ecode += 2; + DPRINTF(("ims set to %02lx\n", ims)); + break; + + /* Assertion brackets. Check the alternative branches in turn - the + matching won't pass the KET for an assertion. If any one branch matches, + the assertion is true. Lookbehind assertions have an OP_REVERSE item at the + start of each branch to move the current point backwards, so the code at + this level is identical to the lookahead case. */ + + case OP_ASSERT: + case OP_ASSERTBACK: + do + { + if (match(eptr, ecode+3, offset_top, md, ims, NULL, match_isgroup)) break; + ecode += (ecode[1] << 8) + ecode[2]; + } + while (*ecode == OP_ALT); + if (*ecode == OP_KET) return FALSE; + + /* If checking an assertion for a condition, return TRUE. */ + + if ((flags & match_condassert) != 0) return TRUE; + + /* Continue from after the assertion, updating the offsets high water + mark, since extracts may have been taken during the assertion. */ + + do ecode += (ecode[1] << 8) + ecode[2]; while (*ecode == OP_ALT); + ecode += 3; + offset_top = md->end_offset_top; + continue; + + /* Negative assertion: all branches must fail to match */ + + case OP_ASSERT_NOT: + case OP_ASSERTBACK_NOT: + do + { + if (match(eptr, ecode+3, offset_top, md, ims, NULL, match_isgroup)) + return FALSE; + ecode += (ecode[1] << 8) + ecode[2]; + } + while (*ecode == OP_ALT); + + if ((flags & match_condassert) != 0) return TRUE; + + ecode += 3; + continue; + + /* Move the subject pointer back. This occurs only at the start of + each branch of a lookbehind assertion. If we are too close to the start to + move back, this match function fails. When working with UTF-8 we move + back a number of characters, not bytes. */ + + case OP_REVERSE: +#ifdef SUPPORT_UTF8 + c = (ecode[1] << 8) + ecode[2]; + for (i = 0; i < c; i++) + { + eptr--; + BACKCHAR(eptr) + } +#else + eptr -= (ecode[1] << 8) + ecode[2]; +#endif + + if (eptr < md->start_subject) return FALSE; + ecode += 3; + break; + + /* Recursion matches the current regex, nested. If there are any capturing + brackets started but not finished, we have to save their starting points + and reinstate them after the recursion. However, we don't know how many + such there are (offset_top records the completed total) so we just have + to save all the potential data. There may be up to 99 such values, which + is a bit large to put on the stack, but using malloc for small numbers + seems expensive. As a compromise, the stack is used when there are fewer + than 16 values to store; otherwise malloc is used. A problem is what to do + if the malloc fails ... there is no way of returning to the top level with + an error. Save the top 15 values on the stack, and accept that the rest + may be wrong. */ + + case OP_RECURSE: + { + BOOL rc; + int *save; + int stacksave[15]; + + c = md->offset_max; + + if (c < 16) save = stacksave; else + { + save = (int *)(pcre_malloc)((c+1) * sizeof(int)); + if (save == NULL) + { + save = stacksave; + c = 15; + } + } + + for (i = 1; i <= c; i++) + save[i] = md->offset_vector[md->offset_end - i]; + rc = match(eptr, md->start_pattern, offset_top, md, ims, eptrb, + match_isgroup); + for (i = 1; i <= c; i++) + md->offset_vector[md->offset_end - i] = save[i]; + if (save != stacksave) (pcre_free)(save); + if (!rc) return FALSE; + + /* In case the recursion has set more capturing values, save the final + number, then move along the subject till after the recursive match, + and advance one byte in the pattern code. */ + + offset_top = md->end_offset_top; + eptr = md->end_match_ptr; + ecode++; + } + break; + + /* "Once" brackets are like assertion brackets except that after a match, + the point in the subject string is not moved back. Thus there can never be + a move back into the brackets. Check the alternative branches in turn - the + matching won't pass the KET for this kind of subpattern. If any one branch + matches, we carry on as at the end of a normal bracket, leaving the subject + pointer. */ + + case OP_ONCE: + { + const uschar *prev = ecode; + const uschar *saved_eptr = eptr; + + do + { + if (match(eptr, ecode+3, offset_top, md, ims, eptrb, match_isgroup)) + break; + ecode += (ecode[1] << 8) + ecode[2]; + } + while (*ecode == OP_ALT); + + /* If hit the end of the group (which could be repeated), fail */ + + if (*ecode != OP_ONCE && *ecode != OP_ALT) return FALSE; + + /* Continue as from after the assertion, updating the offsets high water + mark, since extracts may have been taken. */ + + do ecode += (ecode[1] << 8) + ecode[2]; while (*ecode == OP_ALT); + + offset_top = md->end_offset_top; + eptr = md->end_match_ptr; + + /* For a non-repeating ket, just continue at this level. This also + happens for a repeating ket if no characters were matched in the group. + This is the forcible breaking of infinite loops as implemented in Perl + 5.005. If there is an options reset, it will get obeyed in the normal + course of events. */ + + if (*ecode == OP_KET || eptr == saved_eptr) + { + ecode += 3; + break; + } + + /* The repeating kets try the rest of the pattern or restart from the + preceding bracket, in the appropriate order. We need to reset any options + that changed within the bracket before re-running it, so check the next + opcode. */ + + if (ecode[3] == OP_OPT) + { + ims = (ims & ~PCRE_IMS) | ecode[4]; + DPRINTF(("ims set to %02lx at group repeat\n", ims)); + } + + if (*ecode == OP_KETRMIN) + { + if (match(eptr, ecode+3, offset_top, md, ims, eptrb, 0) || + match(eptr, prev, offset_top, md, ims, eptrb, match_isgroup)) + return TRUE; + } + else /* OP_KETRMAX */ + { + if (match(eptr, prev, offset_top, md, ims, eptrb, match_isgroup) || + match(eptr, ecode+3, offset_top, md, ims, eptrb, 0)) return TRUE; + } + } + return FALSE; + + /* An alternation is the end of a branch; scan along to find the end of the + bracketed group and go to there. */ + + case OP_ALT: + do ecode += (ecode[1] << 8) + ecode[2]; while (*ecode == OP_ALT); + break; + + /* BRAZERO and BRAMINZERO occur just before a bracket group, indicating + that it may occur zero times. It may repeat infinitely, or not at all - + i.e. it could be ()* or ()? in the pattern. Brackets with fixed upper + repeat limits are compiled as a number of copies, with the optional ones + preceded by BRAZERO or BRAMINZERO. */ + + case OP_BRAZERO: + { + const uschar *next = ecode+1; + if (match(eptr, next, offset_top, md, ims, eptrb, match_isgroup)) + return TRUE; + do next += (next[1] << 8) + next[2]; while (*next == OP_ALT); + ecode = next + 3; + } + break; + + case OP_BRAMINZERO: + { + const uschar *next = ecode+1; + do next += (next[1] << 8) + next[2]; while (*next == OP_ALT); + if (match(eptr, next+3, offset_top, md, ims, eptrb, match_isgroup)) + return TRUE; + ecode++; + } + break; + + /* End of a group, repeated or non-repeating. If we are at the end of + an assertion "group", stop matching and return TRUE, but record the + current high water mark for use by positive assertions. Do this also + for the "once" (not-backup up) groups. */ + + case OP_KET: + case OP_KETRMIN: + case OP_KETRMAX: + { + const uschar *prev = ecode - (ecode[1] << 8) - ecode[2]; + const uschar *saved_eptr = eptrb->saved_eptr; + + eptrb = eptrb->prev; /* Back up the stack of bracket start pointers */ + + if (*prev == OP_ASSERT || *prev == OP_ASSERT_NOT || + *prev == OP_ASSERTBACK || *prev == OP_ASSERTBACK_NOT || + *prev == OP_ONCE) + { + md->end_match_ptr = eptr; /* For ONCE */ + md->end_offset_top = offset_top; + return TRUE; + } + + /* In all other cases except a conditional group we have to check the + group number back at the start and if necessary complete handling an + extraction by setting the offsets and bumping the high water mark. */ + + if (*prev != OP_COND) + { + int offset; + int number = *prev - OP_BRA; + + /* For extended extraction brackets (large number), we have to fish out + the number from a dummy opcode at the start. */ + + if (number > EXTRACT_BASIC_MAX) number = (prev[4] << 8) | prev[5]; + offset = number << 1; + +#ifdef DEBUG + printf("end bracket %d", number); + printf("\n"); +#endif + + if (number > 0) + { + if (offset >= md->offset_max) md->offset_overflow = TRUE; else + { + md->offset_vector[offset] = + md->offset_vector[md->offset_end - number]; + md->offset_vector[offset+1] = eptr - md->start_subject; + if (offset_top <= offset) offset_top = offset + 2; + } + } + } + + /* Reset the value of the ims flags, in case they got changed during + the group. */ + + ims = original_ims; + DPRINTF(("ims reset to %02lx\n", ims)); + + /* For a non-repeating ket, just continue at this level. This also + happens for a repeating ket if no characters were matched in the group. + This is the forcible breaking of infinite loops as implemented in Perl + 5.005. If there is an options reset, it will get obeyed in the normal + course of events. */ + + if (*ecode == OP_KET || eptr == saved_eptr) + { + ecode += 3; + break; + } + + /* The repeating kets try the rest of the pattern or restart from the + preceding bracket, in the appropriate order. */ + + if (*ecode == OP_KETRMIN) + { + if (match(eptr, ecode+3, offset_top, md, ims, eptrb, 0) || + match(eptr, prev, offset_top, md, ims, eptrb, match_isgroup)) + return TRUE; + } + else /* OP_KETRMAX */ + { + if (match(eptr, prev, offset_top, md, ims, eptrb, match_isgroup) || + match(eptr, ecode+3, offset_top, md, ims, eptrb, 0)) return TRUE; + } + } + return FALSE; + + /* Start of subject unless notbol, or after internal newline if multiline */ + + case OP_CIRC: + if (md->notbol && eptr == md->start_subject) return FALSE; + if ((ims & PCRE_MULTILINE) != 0) + { + if (eptr != md->start_subject && eptr[-1] != NEWLINE) return FALSE; + ecode++; + break; + } + /* ... else fall through */ + + /* Start of subject assertion */ + + case OP_SOD: + if (eptr != md->start_subject) return FALSE; + ecode++; + break; + + /* Assert before internal newline if multiline, or before a terminating + newline unless endonly is set, else end of subject unless noteol is set. */ + + case OP_DOLL: + if ((ims & PCRE_MULTILINE) != 0) + { + if (eptr < md->end_subject) { if (*eptr != NEWLINE) return FALSE; } + else { if (md->noteol) return FALSE; } + ecode++; + break; + } + else + { + if (md->noteol) return FALSE; + if (!md->endonly) + { + if (eptr < md->end_subject - 1 || + (eptr == md->end_subject - 1 && *eptr != NEWLINE)) return FALSE; + + ecode++; + break; + } + } + /* ... else fall through */ + + /* End of subject assertion (\z) */ + + case OP_EOD: + if (eptr < md->end_subject) return FALSE; + ecode++; + break; + + /* End of subject or ending \n assertion (\Z) */ + + case OP_EODN: + if (eptr < md->end_subject - 1 || + (eptr == md->end_subject - 1 && *eptr != NEWLINE)) return FALSE; + ecode++; + break; + + /* Word boundary assertions */ + + case OP_NOT_WORD_BOUNDARY: + case OP_WORD_BOUNDARY: + { + BOOL prev_is_word = (eptr != md->start_subject) && + ((md->ctypes[eptr[-1]] & ctype_word) != 0); + BOOL cur_is_word = (eptr < md->end_subject) && + ((md->ctypes[*eptr] & ctype_word) != 0); + if ((*ecode++ == OP_WORD_BOUNDARY)? + cur_is_word == prev_is_word : cur_is_word != prev_is_word) + return FALSE; + } + break; + + /* Match a single character type; inline for speed */ + + case OP_ANY: + if ((ims & PCRE_DOTALL) == 0 && eptr < md->end_subject && *eptr == NEWLINE) + return FALSE; + if (eptr++ >= md->end_subject) return FALSE; +#ifdef SUPPORT_UTF8 + if (md->utf8) + while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++; +#endif + ecode++; + break; + + case OP_NOT_DIGIT: + if (eptr >= md->end_subject || + (md->ctypes[*eptr++] & ctype_digit) != 0) + return FALSE; + ecode++; + break; + + case OP_DIGIT: + if (eptr >= md->end_subject || + (md->ctypes[*eptr++] & ctype_digit) == 0) + return FALSE; + ecode++; + break; + + case OP_NOT_WHITESPACE: + if (eptr >= md->end_subject || + (md->ctypes[*eptr++] & ctype_space) != 0) + return FALSE; + ecode++; + break; + + case OP_WHITESPACE: + if (eptr >= md->end_subject || + (md->ctypes[*eptr++] & ctype_space) == 0) + return FALSE; + ecode++; + break; + + case OP_NOT_WORDCHAR: + if (eptr >= md->end_subject || + (md->ctypes[*eptr++] & ctype_word) != 0) + return FALSE; + ecode++; + break; + + case OP_WORDCHAR: + if (eptr >= md->end_subject || + (md->ctypes[*eptr++] & ctype_word) == 0) + return FALSE; + ecode++; + break; + + /* Match a back reference, possibly repeatedly. Look past the end of the + item to see if there is repeat information following. The code is similar + to that for character classes, but repeated for efficiency. Then obey + similar code to character type repeats - written out again for speed. + However, if the referenced string is the empty string, always treat + it as matched, any number of times (otherwise there could be infinite + loops). */ + + case OP_REF: + { + int length; + int offset = (ecode[1] << 9) | (ecode[2] << 1); /* Doubled ref number */ + ecode += 3; /* Advance past item */ + + /* If the reference is unset, set the length to be longer than the amount + of subject left; this ensures that every attempt at a match fails. We + can't just fail here, because of the possibility of quantifiers with zero + minima. */ + + length = (offset >= offset_top || md->offset_vector[offset] < 0)? + md->end_subject - eptr + 1 : + md->offset_vector[offset+1] - md->offset_vector[offset]; + + /* Set up for repetition, or handle the non-repeated case */ + + switch (*ecode) + { + case OP_CRSTAR: + case OP_CRMINSTAR: + case OP_CRPLUS: + case OP_CRMINPLUS: + case OP_CRQUERY: + case OP_CRMINQUERY: + c = *ecode++ - OP_CRSTAR; + minimize = (c & 1) != 0; + min = rep_min[c]; /* Pick up values from tables; */ + max = rep_max[c]; /* zero for max => infinity */ + if (max == 0) max = INT_MAX; + break; + + case OP_CRRANGE: + case OP_CRMINRANGE: + minimize = (*ecode == OP_CRMINRANGE); + min = (ecode[1] << 8) + ecode[2]; + max = (ecode[3] << 8) + ecode[4]; + if (max == 0) max = INT_MAX; + ecode += 5; + break; + + default: /* No repeat follows */ + if (!match_ref(offset, eptr, length, md, ims)) return FALSE; + eptr += length; + continue; /* With the main loop */ + } + + /* If the length of the reference is zero, just continue with the + main loop. */ + + if (length == 0) continue; + + /* First, ensure the minimum number of matches are present. We get back + the length of the reference string explicitly rather than passing the + address of eptr, so that eptr can be a register variable. */ + + for (i = 1; i <= min; i++) + { + if (!match_ref(offset, eptr, length, md, ims)) return FALSE; + eptr += length; + } + + /* If min = max, continue at the same level without recursion. + They are not both allowed to be zero. */ + + if (min == max) continue; + + /* If minimizing, keep trying and advancing the pointer */ + + if (minimize) + { + for (i = min;; i++) + { + if (match(eptr, ecode, offset_top, md, ims, eptrb, 0)) + return TRUE; + if (i >= max || !match_ref(offset, eptr, length, md, ims)) + return FALSE; + eptr += length; + } + /* Control never gets here */ + } + + /* If maximizing, find the longest string and work backwards */ + + else + { + const uschar *pp = eptr; + for (i = min; i < max; i++) + { + if (!match_ref(offset, eptr, length, md, ims)) break; + eptr += length; + } + while (eptr >= pp) + { + if (match(eptr, ecode, offset_top, md, ims, eptrb, 0)) + return TRUE; + eptr -= length; + } + return FALSE; + } + } + /* Control never gets here */ + + + + /* Match a character class, possibly repeatedly. Look past the end of the + item to see if there is repeat information following. Then obey similar + code to character type repeats - written out again for speed. */ + + case OP_CLASS: + { + const uschar *data = ecode + 1; /* Save for matching */ + ecode += 33; /* Advance past the item */ + + switch (*ecode) + { + case OP_CRSTAR: + case OP_CRMINSTAR: + case OP_CRPLUS: + case OP_CRMINPLUS: + case OP_CRQUERY: + case OP_CRMINQUERY: + c = *ecode++ - OP_CRSTAR; + minimize = (c & 1) != 0; + min = rep_min[c]; /* Pick up values from tables; */ + max = rep_max[c]; /* zero for max => infinity */ + if (max == 0) max = INT_MAX; + break; + + case OP_CRRANGE: + case OP_CRMINRANGE: + minimize = (*ecode == OP_CRMINRANGE); + min = (ecode[1] << 8) + ecode[2]; + max = (ecode[3] << 8) + ecode[4]; + if (max == 0) max = INT_MAX; + ecode += 5; + break; + + default: /* No repeat follows */ + min = max = 1; + break; + } + + /* First, ensure the minimum number of matches are present. */ + + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject) return FALSE; + GETCHARINC(c, eptr) /* Get character; increment eptr */ + +#ifdef SUPPORT_UTF8 + /* We do not yet support class members > 255 */ + if (c > 255) return FALSE; +#endif + + if ((data[c/8] & (1 << (c&7))) != 0) continue; + return FALSE; + } + + /* If max == min we can continue with the main loop without the + need to recurse. */ + + if (min == max) continue; + + /* If minimizing, keep testing the rest of the expression and advancing + the pointer while it matches the class. */ + + if (minimize) + { + for (i = min;; i++) + { + if (match(eptr, ecode, offset_top, md, ims, eptrb, 0)) + return TRUE; + if (i >= max || eptr >= md->end_subject) return FALSE; + GETCHARINC(c, eptr) /* Get character; increment eptr */ + +#ifdef SUPPORT_UTF8 + /* We do not yet support class members > 255 */ + if (c > 255) return FALSE; +#endif + if ((data[c/8] & (1 << (c&7))) != 0) continue; + return FALSE; + } + /* Control never gets here */ + } + + /* If maximizing, find the longest possible run, then work backwards. */ + + else + { + const uschar *pp = eptr; + int len = 1; + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject) break; + GETCHARLEN(c, eptr, len) /* Get character, set length if UTF-8 */ + +#ifdef SUPPORT_UTF8 + /* We do not yet support class members > 255 */ + if (c > 255) break; +#endif + if ((data[c/8] & (1 << (c&7))) == 0) break; + eptr += len; + } + + while (eptr >= pp) + { + if (match(eptr--, ecode, offset_top, md, ims, eptrb, 0)) + return TRUE; + +#ifdef SUPPORT_UTF8 + BACKCHAR(eptr) +#endif + } + return FALSE; + } + } + /* Control never gets here */ + + /* Match a run of characters */ + + case OP_CHARS: + { + register int length = ecode[1]; + ecode += 2; + +#ifdef DEBUG /* Sigh. Some compilers never learn. */ + if (eptr >= md->end_subject) + printf("matching subject against pattern "); + else + { + printf("matching subject "); + pchars(eptr, length, TRUE, md); + printf(" against pattern "); + } + pchars(ecode, length, FALSE, md); + printf("\n"); +#endif + + if (length > md->end_subject - eptr) return FALSE; + if ((ims & PCRE_CASELESS) != 0) + { + while (length-- > 0) + if (md->lcc[*ecode++] != md->lcc[*eptr++]) + return FALSE; + } + else + { + while (length-- > 0) if (*ecode++ != *eptr++) return FALSE; + } + } + break; + + /* Match a single character repeatedly; different opcodes share code. */ + + case OP_EXACT: + min = max = (ecode[1] << 8) + ecode[2]; + ecode += 3; + goto REPEATCHAR; + + case OP_UPTO: + case OP_MINUPTO: + min = 0; + max = (ecode[1] << 8) + ecode[2]; + minimize = *ecode == OP_MINUPTO; + ecode += 3; + goto REPEATCHAR; + + case OP_STAR: + case OP_MINSTAR: + case OP_PLUS: + case OP_MINPLUS: + case OP_QUERY: + case OP_MINQUERY: + c = *ecode++ - OP_STAR; + minimize = (c & 1) != 0; + min = rep_min[c]; /* Pick up values from tables; */ + max = rep_max[c]; /* zero for max => infinity */ + if (max == 0) max = INT_MAX; + + /* Common code for all repeated single-character matches. We can give + up quickly if there are fewer than the minimum number of characters left in + the subject. */ + + REPEATCHAR: + if (min > md->end_subject - eptr) return FALSE; + c = *ecode++; + + /* The code is duplicated for the caseless and caseful cases, for speed, + since matching characters is likely to be quite common. First, ensure the + minimum number of matches are present. If min = max, continue at the same + level without recursing. Otherwise, if minimizing, keep trying the rest of + the expression and advancing one matching character if failing, up to the + maximum. Alternatively, if maximizing, find the maximum number of + characters and work backwards. */ + + DPRINTF(("matching %c{%d,%d} against subject %.*s\n", c, min, max, + max, eptr)); + + if ((ims & PCRE_CASELESS) != 0) + { + c = md->lcc[c]; + for (i = 1; i <= min; i++) + if (c != md->lcc[*eptr++]) return FALSE; + if (min == max) continue; + if (minimize) + { + for (i = min;; i++) + { + if (match(eptr, ecode, offset_top, md, ims, eptrb, 0)) + return TRUE; + if (i >= max || eptr >= md->end_subject || + c != md->lcc[*eptr++]) + return FALSE; + } + /* Control never gets here */ + } + else + { + const uschar *pp = eptr; + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject || c != md->lcc[*eptr]) break; + eptr++; + } + while (eptr >= pp) + if (match(eptr--, ecode, offset_top, md, ims, eptrb, 0)) + return TRUE; + return FALSE; + } + /* Control never gets here */ + } + + /* Caseful comparisons */ + + else + { + for (i = 1; i <= min; i++) if (c != *eptr++) return FALSE; + if (min == max) continue; + if (minimize) + { + for (i = min;; i++) + { + if (match(eptr, ecode, offset_top, md, ims, eptrb, 0)) + return TRUE; + if (i >= max || eptr >= md->end_subject || c != *eptr++) return FALSE; + } + /* Control never gets here */ + } + else + { + const uschar *pp = eptr; + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject || c != *eptr) break; + eptr++; + } + while (eptr >= pp) + if (match(eptr--, ecode, offset_top, md, ims, eptrb, 0)) + return TRUE; + return FALSE; + } + } + /* Control never gets here */ + + /* Match a negated single character */ + + case OP_NOT: + if (eptr >= md->end_subject) return FALSE; + ecode++; + if ((ims & PCRE_CASELESS) != 0) + { + if (md->lcc[*ecode++] == md->lcc[*eptr++]) return FALSE; + } + else + { + if (*ecode++ == *eptr++) return FALSE; + } + break; + + /* Match a negated single character repeatedly. This is almost a repeat of + the code for a repeated single character, but I haven't found a nice way of + commoning these up that doesn't require a test of the positive/negative + option for each character match. Maybe that wouldn't add very much to the + time taken, but character matching *is* what this is all about... */ + + case OP_NOTEXACT: + min = max = (ecode[1] << 8) + ecode[2]; + ecode += 3; + goto REPEATNOTCHAR; + + case OP_NOTUPTO: + case OP_NOTMINUPTO: + min = 0; + max = (ecode[1] << 8) + ecode[2]; + minimize = *ecode == OP_NOTMINUPTO; + ecode += 3; + goto REPEATNOTCHAR; + + case OP_NOTSTAR: + case OP_NOTMINSTAR: + case OP_NOTPLUS: + case OP_NOTMINPLUS: + case OP_NOTQUERY: + case OP_NOTMINQUERY: + c = *ecode++ - OP_NOTSTAR; + minimize = (c & 1) != 0; + min = rep_min[c]; /* Pick up values from tables; */ + max = rep_max[c]; /* zero for max => infinity */ + if (max == 0) max = INT_MAX; + + /* Common code for all repeated single-character matches. We can give + up quickly if there are fewer than the minimum number of characters left in + the subject. */ + + REPEATNOTCHAR: + if (min > md->end_subject - eptr) return FALSE; + c = *ecode++; + + /* The code is duplicated for the caseless and caseful cases, for speed, + since matching characters is likely to be quite common. First, ensure the + minimum number of matches are present. If min = max, continue at the same + level without recursing. Otherwise, if minimizing, keep trying the rest of + the expression and advancing one matching character if failing, up to the + maximum. Alternatively, if maximizing, find the maximum number of + characters and work backwards. */ + + DPRINTF(("negative matching %c{%d,%d} against subject %.*s\n", c, min, max, + max, eptr)); + + if ((ims & PCRE_CASELESS) != 0) + { + c = md->lcc[c]; + for (i = 1; i <= min; i++) + if (c == md->lcc[*eptr++]) return FALSE; + if (min == max) continue; + if (minimize) + { + for (i = min;; i++) + { + if (match(eptr, ecode, offset_top, md, ims, eptrb, 0)) + return TRUE; + if (i >= max || eptr >= md->end_subject || + c == md->lcc[*eptr++]) + return FALSE; + } + /* Control never gets here */ + } + else + { + const uschar *pp = eptr; + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject || c == md->lcc[*eptr]) break; + eptr++; + } + while (eptr >= pp) + if (match(eptr--, ecode, offset_top, md, ims, eptrb, 0)) + return TRUE; + return FALSE; + } + /* Control never gets here */ + } + + /* Caseful comparisons */ + + else + { + for (i = 1; i <= min; i++) if (c == *eptr++) return FALSE; + if (min == max) continue; + if (minimize) + { + for (i = min;; i++) + { + if (match(eptr, ecode, offset_top, md, ims, eptrb, 0)) + return TRUE; + if (i >= max || eptr >= md->end_subject || c == *eptr++) return FALSE; + } + /* Control never gets here */ + } + else + { + const uschar *pp = eptr; + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject || c == *eptr) break; + eptr++; + } + while (eptr >= pp) + if (match(eptr--, ecode, offset_top, md, ims, eptrb, 0)) + return TRUE; + return FALSE; + } + } + /* Control never gets here */ + + /* Match a single character type repeatedly; several different opcodes + share code. This is very similar to the code for single characters, but we + repeat it in the interests of efficiency. */ + + case OP_TYPEEXACT: + min = max = (ecode[1] << 8) + ecode[2]; + minimize = TRUE; + ecode += 3; + goto REPEATTYPE; + + case OP_TYPEUPTO: + case OP_TYPEMINUPTO: + min = 0; + max = (ecode[1] << 8) + ecode[2]; + minimize = *ecode == OP_TYPEMINUPTO; + ecode += 3; + goto REPEATTYPE; + + case OP_TYPESTAR: + case OP_TYPEMINSTAR: + case OP_TYPEPLUS: + case OP_TYPEMINPLUS: + case OP_TYPEQUERY: + case OP_TYPEMINQUERY: + c = *ecode++ - OP_TYPESTAR; + minimize = (c & 1) != 0; + min = rep_min[c]; /* Pick up values from tables; */ + max = rep_max[c]; /* zero for max => infinity */ + if (max == 0) max = INT_MAX; + + /* Common code for all repeated single character type matches */ + + REPEATTYPE: + ctype = *ecode++; /* Code for the character type */ + + /* First, ensure the minimum number of matches are present. Use inline + code for maximizing the speed, and do the type test once at the start + (i.e. keep it out of the loop). Also we can test that there are at least + the minimum number of bytes before we start, except when doing '.' in + UTF8 mode. Leave the test in in all cases; in the special case we have + to test after each character. */ + + if (min > md->end_subject - eptr) return FALSE; + if (min > 0) switch(ctype) + { + case OP_ANY: +#ifdef SUPPORT_UTF8 + if (md->utf8) + { + for (i = 1; i <= min; i++) + { + if (eptr >= md->end_subject || + (*eptr++ == NEWLINE && (ims & PCRE_DOTALL) == 0)) + return FALSE; + while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++; + } + break; + } +#endif + /* Non-UTF8 can be faster */ + if ((ims & PCRE_DOTALL) == 0) + { for (i = 1; i <= min; i++) if (*eptr++ == NEWLINE) return FALSE; } + else eptr += min; + break; + + case OP_NOT_DIGIT: + for (i = 1; i <= min; i++) + if ((md->ctypes[*eptr++] & ctype_digit) != 0) return FALSE; + break; + + case OP_DIGIT: + for (i = 1; i <= min; i++) + if ((md->ctypes[*eptr++] & ctype_digit) == 0) return FALSE; + break; + + case OP_NOT_WHITESPACE: + for (i = 1; i <= min; i++) + if ((md->ctypes[*eptr++] & ctype_space) != 0) return FALSE; + break; + + case OP_WHITESPACE: + for (i = 1; i <= min; i++) + if ((md->ctypes[*eptr++] & ctype_space) == 0) return FALSE; + break; + + case OP_NOT_WORDCHAR: + for (i = 1; i <= min; i++) + if ((md->ctypes[*eptr++] & ctype_word) != 0) + return FALSE; + break; + + case OP_WORDCHAR: + for (i = 1; i <= min; i++) + if ((md->ctypes[*eptr++] & ctype_word) == 0) + return FALSE; + break; + } + + /* If min = max, continue at the same level without recursing */ + + if (min == max) continue; + + /* If minimizing, we have to test the rest of the pattern before each + subsequent match. */ + + if (minimize) + { + for (i = min;; i++) + { + if (match(eptr, ecode, offset_top, md, ims, eptrb, 0)) return TRUE; + if (i >= max || eptr >= md->end_subject) return FALSE; + + c = *eptr++; + switch(ctype) + { + case OP_ANY: + if ((ims & PCRE_DOTALL) == 0 && c == NEWLINE) return FALSE; +#ifdef SUPPORT_UTF8 + if (md->utf8) + while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++; +#endif + break; + + case OP_NOT_DIGIT: + if ((md->ctypes[c] & ctype_digit) != 0) return FALSE; + break; + + case OP_DIGIT: + if ((md->ctypes[c] & ctype_digit) == 0) return FALSE; + break; + + case OP_NOT_WHITESPACE: + if ((md->ctypes[c] & ctype_space) != 0) return FALSE; + break; + + case OP_WHITESPACE: + if ((md->ctypes[c] & ctype_space) == 0) return FALSE; + break; + + case OP_NOT_WORDCHAR: + if ((md->ctypes[c] & ctype_word) != 0) return FALSE; + break; + + case OP_WORDCHAR: + if ((md->ctypes[c] & ctype_word) == 0) return FALSE; + break; + } + } + /* Control never gets here */ + } + + /* If maximizing it is worth using inline code for speed, doing the type + test once at the start (i.e. keep it out of the loop). */ + + else + { + const uschar *pp = eptr; + switch(ctype) + { + case OP_ANY: + + /* Special code is required for UTF8, but when the maximum is unlimited + we don't need it. */ + +#ifdef SUPPORT_UTF8 + if (md->utf8 && max < INT_MAX) + { + if ((ims & PCRE_DOTALL) == 0) + { + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject || *eptr++ == NEWLINE) break; + while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++; + } + } + else + { + for (i = min; i < max; i++) + { + eptr++; + while (eptr < md->end_subject && (*eptr & 0xc0) == 0x80) eptr++; + } + } + break; + } +#endif + /* Non-UTF8 can be faster */ + if ((ims & PCRE_DOTALL) == 0) + { + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject || *eptr == NEWLINE) break; + eptr++; + } + } + else + { + c = max - min; + if (c > md->end_subject - eptr) c = md->end_subject - eptr; + eptr += c; + } + break; + + case OP_NOT_DIGIT: + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_digit) != 0) + break; + eptr++; + } + break; + + case OP_DIGIT: + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_digit) == 0) + break; + eptr++; + } + break; + + case OP_NOT_WHITESPACE: + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_space) != 0) + break; + eptr++; + } + break; + + case OP_WHITESPACE: + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_space) == 0) + break; + eptr++; + } + break; + + case OP_NOT_WORDCHAR: + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_word) != 0) + break; + eptr++; + } + break; + + case OP_WORDCHAR: + for (i = min; i < max; i++) + { + if (eptr >= md->end_subject || (md->ctypes[*eptr] & ctype_word) == 0) + break; + eptr++; + } + break; + } + + while (eptr >= pp) + { + if (match(eptr--, ecode, offset_top, md, ims, eptrb, 0)) + return TRUE; +#ifdef SUPPORT_UTF8 + if (md->utf8) + while (eptr > pp && (*eptr & 0xc0) == 0x80) eptr--; +#endif + } + return FALSE; + } + /* Control never gets here */ + + /* There's been some horrible disaster. */ + + default: + DPRINTF(("Unknown opcode %d\n", *ecode)); + md->errorcode = PCRE_ERROR_UNKNOWN_NODE; + return FALSE; + } + + /* Do not stick any code in here without much thought; it is assumed + that "continue" in the code above comes out to here to repeat the main + loop. */ + + } /* End of main loop */ +/* Control never reaches here */ +} + + + + +/************************************************* +* Execute a Regular Expression * +*************************************************/ + +/* This function applies a compiled re to a subject string and picks out +portions of the string if it matches. Two elements in the vector are set for +each substring: the offsets to the start and end of the substring. + +Arguments: + external_re points to the compiled expression + external_extra points to "hints" from pcre_study() or is NULL + subject points to the subject string + length length of subject string (may contain binary zeros) + start_offset where to start in the subject string + options option bits + offsets points to a vector of ints to be filled in with offsets + offsetcount the number of elements in the vector + +Returns: > 0 => success; value is the number of elements filled in + = 0 => success, but offsets is not big enough + -1 => failed to match + < -1 => some kind of unexpected problem +*/ + +int +pcre_exec(const pcre *external_re, const pcre_extra *external_extra, + const char *subject, int length, int start_offset, int options, int *offsets, + int offsetcount) +{ +int resetcount, ocount; +int first_char = -1; +int req_char = -1; +int req_char2 = -1; +unsigned long int ims = 0; +match_data match_block; +const uschar *start_bits = NULL; +const uschar *start_match = (const uschar *)subject + start_offset; +const uschar *end_subject; +const uschar *req_char_ptr = start_match - 1; +const real_pcre *re = (const real_pcre *)external_re; +const real_pcre_extra *extra = (const real_pcre_extra *)external_extra; +BOOL using_temporary_offsets = FALSE; +BOOL anchored; +BOOL startline; + +if ((options & ~PUBLIC_EXEC_OPTIONS) != 0) return PCRE_ERROR_BADOPTION; + +if (re == NULL || subject == NULL || + (offsets == NULL && offsetcount > 0)) return PCRE_ERROR_NULL; +if (re->magic_number != MAGIC_NUMBER) return PCRE_ERROR_BADMAGIC; + +anchored = ((re->options | options) & PCRE_ANCHORED) != 0; +startline = (re->options & PCRE_STARTLINE) != 0; + +match_block.start_pattern = re->code; +match_block.start_subject = (const uschar *)subject; +match_block.end_subject = match_block.start_subject + length; +end_subject = match_block.end_subject; + +match_block.endonly = (re->options & PCRE_DOLLAR_ENDONLY) != 0; +match_block.utf8 = (re->options & PCRE_UTF8) != 0; + +match_block.notbol = (options & PCRE_NOTBOL) != 0; +match_block.noteol = (options & PCRE_NOTEOL) != 0; +match_block.notempty = (options & PCRE_NOTEMPTY) != 0; + +match_block.errorcode = PCRE_ERROR_NOMATCH; /* Default error */ + +match_block.lcc = re->tables + lcc_offset; +match_block.ctypes = re->tables + ctypes_offset; + +/* The ims options can vary during the matching as a result of the presence +of (?ims) items in the pattern. They are kept in a local variable so that +restoring at the exit of a group is easy. */ + +ims = re->options & (PCRE_CASELESS|PCRE_MULTILINE|PCRE_DOTALL); + +/* If the expression has got more back references than the offsets supplied can +hold, we get a temporary bit of working store to use during the matching. +Otherwise, we can use the vector supplied, rounding down its size to a multiple +of 3. */ + +ocount = offsetcount - (offsetcount % 3); + +if (re->top_backref > 0 && re->top_backref >= ocount/3) + { + ocount = re->top_backref * 3 + 3; + match_block.offset_vector = (int *)(pcre_malloc)(ocount * sizeof(int)); + if (match_block.offset_vector == NULL) return PCRE_ERROR_NOMEMORY; + using_temporary_offsets = TRUE; + DPRINTF(("Got memory to hold back references\n")); + } +else match_block.offset_vector = offsets; + +match_block.offset_end = ocount; +match_block.offset_max = (2*ocount)/3; +match_block.offset_overflow = FALSE; + +/* Compute the minimum number of offsets that we need to reset each time. Doing +this makes a huge difference to execution time when there aren't many brackets +in the pattern. */ + +resetcount = 2 + re->top_bracket * 2; +if (resetcount > offsetcount) resetcount = ocount; + +/* Reset the working variable associated with each extraction. These should +never be used unless previously set, but they get saved and restored, and so we +initialize them to avoid reading uninitialized locations. */ + +if (match_block.offset_vector != NULL) + { + register int *iptr = match_block.offset_vector + ocount; + register int *iend = iptr - resetcount/2 + 1; + while (--iptr >= iend) *iptr = -1; + } + +/* Set up the first character to match, if available. The first_char value is +never set for an anchored regular expression, but the anchoring may be forced +at run time, so we have to test for anchoring. The first char may be unset for +an unanchored pattern, of course. If there's no first char and the pattern was +studied, there may be a bitmap of possible first characters. */ + +if (!anchored) + { + if ((re->options & PCRE_FIRSTSET) != 0) + { + first_char = re->first_char; + if ((ims & PCRE_CASELESS) != 0) first_char = match_block.lcc[first_char]; + } + else + if (!startline && extra != NULL && + (extra->options & PCRE_STUDY_MAPPED) != 0) + start_bits = extra->start_bits; + } + +/* For anchored or unanchored matches, there may be a "last known required +character" set. If the PCRE_CASELESS is set, implying that the match starts +caselessly, or if there are any changes of this flag within the regex, set up +both cases of the character. Otherwise set the two values the same, which will +avoid duplicate testing (which takes significant time). This covers the vast +majority of cases. It will be suboptimal when the case flag changes in a regex +and the required character in fact is caseful. */ + +if ((re->options & PCRE_REQCHSET) != 0) + { + req_char = re->req_char; + req_char2 = ((re->options & (PCRE_CASELESS | PCRE_ICHANGED)) != 0)? + (re->tables + fcc_offset)[req_char] : req_char; + } + +/* Loop for handling unanchored repeated matching attempts; for anchored regexs +the loop runs just once. */ + +do + { + int rc; + register int *iptr = match_block.offset_vector; + register int *iend = iptr + resetcount; + + /* Reset the maximum number of extractions we might see. */ + + while (iptr < iend) *iptr++ = -1; + + /* Advance to a unique first char if possible */ + + if (first_char >= 0) + { + if ((ims & PCRE_CASELESS) != 0) + while (start_match < end_subject && + match_block.lcc[*start_match] != first_char) + start_match++; + else + while (start_match < end_subject && *start_match != first_char) + start_match++; + } + + /* Or to just after \n for a multiline match if possible */ + + else if (startline) + { + if (start_match > match_block.start_subject + start_offset) + { + while (start_match < end_subject && start_match[-1] != NEWLINE) + start_match++; + } + } + + /* Or to a non-unique first char after study */ + + else if (start_bits != NULL) + { + while (start_match < end_subject) + { + register int c = *start_match; + if ((start_bits[c/8] & (1 << (c&7))) == 0) start_match++; else break; + } + } + +#ifdef DEBUG /* Sigh. Some compilers never learn. */ + printf(">>>> Match against: "); + pchars(start_match, end_subject - start_match, TRUE, &match_block); + printf("\n"); +#endif + + /* If req_char is set, we know that that character must appear in the subject + for the match to succeed. If the first character is set, req_char must be + later in the subject; otherwise the test starts at the match point. This + optimization can save a huge amount of backtracking in patterns with nested + unlimited repeats that aren't going to match. We don't know what the state of + case matching may be when this character is hit, so test for it in both its + cases if necessary. However, the different cased versions will not be set up + unless PCRE_CASELESS was given or the casing state changes within the regex. + Writing separate code makes it go faster, as does using an autoincrement and + backing off on a match. */ + + if (req_char >= 0) + { + register const uschar *p = start_match + ((first_char >= 0)? 1 : 0); + + /* We don't need to repeat the search if we haven't yet reached the + place we found it at last time. */ + + if (p > req_char_ptr) + { + /* Do a single test if no case difference is set up */ + + if (req_char == req_char2) + { + while (p < end_subject) + { + if (*p++ == req_char) { p--; break; } + } + } + + /* Otherwise test for either case */ + + else + { + while (p < end_subject) + { + register int pp = *p++; + if (pp == req_char || pp == req_char2) { p--; break; } + } + } + + /* If we can't find the required character, break the matching loop */ + + if (p >= end_subject) break; + + /* If we have found the required character, save the point where we + found it, so that we don't search again next time round the loop if + the start hasn't passed this character yet. */ + + req_char_ptr = p; + } + } + + /* When a match occurs, substrings will be set for all internal extractions; + we just need to set up the whole thing as substring 0 before returning. If + there were too many extractions, set the return code to zero. In the case + where we had to get some local store to hold offsets for backreferences, copy + those back references that we can. In this case there need not be overflow + if certain parts of the pattern were not used. */ + + match_block.start_match = start_match; + if (!match(start_match, re->code, 2, &match_block, ims, NULL, match_isgroup)) + continue; + + /* Copy the offset information from temporary store if necessary */ + + if (using_temporary_offsets) + { + if (offsetcount >= 4) + { + memcpy(offsets + 2, match_block.offset_vector + 2, + (offsetcount - 2) * sizeof(int)); + DPRINTF(("Copied offsets from temporary memory\n")); + } + if (match_block.end_offset_top > offsetcount) + match_block.offset_overflow = TRUE; + + DPRINTF(("Freeing temporary memory\n")); + (pcre_free)(match_block.offset_vector); + } + + rc = match_block.offset_overflow? 0 : match_block.end_offset_top/2; + + if (offsetcount < 2) rc = 0; else + { + offsets[0] = start_match - match_block.start_subject; + offsets[1] = match_block.end_match_ptr - match_block.start_subject; + } + + DPRINTF((">>>> returning %d\n", rc)); + return rc; + } + +/* This "while" is the end of the "do" above */ + +while (!anchored && + match_block.errorcode == PCRE_ERROR_NOMATCH && + start_match++ < end_subject); + +if (using_temporary_offsets) + { + DPRINTF(("Freeing temporary memory\n")); + (pcre_free)(match_block.offset_vector); + } + +DPRINTF((">>>> returning %d\n", match_block.errorcode)); + +return match_block.errorcode; +} + +/* End of pcre.c */ diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/pcre.def b/rubbos/app/httpd-2.0.64/srclib/pcre/pcre.def new file mode 100644 index 00000000..0e8cf3f4 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/pcre.def @@ -0,0 +1,19 @@ +EXPORTS + +pcre_malloc DATA +pcre_free DATA + +pcre_compile +pcre_copy_substring +pcre_exec +pcre_get_substring +pcre_get_substring_list +pcre_info +pcre_maketables +pcre_study +pcre_version + +regcomp +regexec +regerror +regfree diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/pcre.dsp b/rubbos/app/httpd-2.0.64/srclib/pcre/pcre.dsp new file mode 100644 index 00000000..65418228 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/pcre.dsp @@ -0,0 +1,193 @@ +# Microsoft Developer Studio Project File - Name="pcre" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Static Library" 0x0104 + +CFG=pcre - 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 "pcre.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 "pcre.mak" CFG="pcre - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "pcre - Win32 Release" (based on "Win32 (x86) Static Library") +!MESSAGE "pcre - Win32 Debug" (based on "Win32 (x86) Static Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "pcre - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "LibR" +# PROP Intermediate_Dir "LibR" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "_WIN32" /D "NDEBUG" /D "_WINDOWS" /D "STATIC" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /D "_WIN32" /D "NDEBUG" /D "_WINDOWS" /D "STATIC" /Fd"LibR/pcre_src" /FD /c +# ADD BASE RSC /l 0x409 +# ADD RSC /l 0x409 +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo + +!ELSEIF "$(CFG)" == "pcre - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "LibD" +# PROP Intermediate_Dir "LibD" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "_WIN32" /D "_DEBUG" /D "_WINDOWS" /D "STATIC" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "_WIN32" /D "_DEBUG" /D "_WINDOWS" /D "STATIC" /Fd"LibD/pcre_src" /FD /c +# ADD BASE RSC /l 0x409 +# ADD RSC /l 0x409 +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo + +!ENDIF + +# Begin Target + +# Name "pcre - Win32 Release" +# Name "pcre - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "*.c" +# Begin Source File + +SOURCE=.\dftables.exe + +!IF "$(CFG)" == "pcre - Win32 Release" + +# Begin Custom Build - Creating pcre chartables.c from dftables +InputPath=.\dftables.exe + +".\chartables.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + .\dftables.exe >.\chartables.c + +# End Custom Build + +!ELSEIF "$(CFG)" == "pcre - Win32 Debug" + +# Begin Custom Build - Creating pcre chartables.c from dftables +InputPath=.\dftables.exe + +".\chartables.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + .\dftables.exe >.\chartables.c + +# End Custom Build + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\get.c +# End Source File +# Begin Source File + +SOURCE=.\maketables.c +# End Source File +# Begin Source File + +SOURCE=.\pcre.c +# End Source File +# Begin Source File + +SOURCE=.\study.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "*.h" +# Begin Source File + +SOURCE=.\config.hw + +!IF "$(CFG)" == "pcre - Win32 Release" + +# Begin Custom Build - Creating pcre config.h from config.hw +InputPath=.\config.hw + +".\config.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + type .\config.hw > .\config.h + +# End Custom Build + +!ELSEIF "$(CFG)" == "pcre - Win32 Debug" + +# Begin Custom Build - Creating pcre config.h from config.hw +InputPath=.\config.hw + +".\config.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + type .\config.hw > .\config.h + +# End Custom Build + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\internal.h +# End Source File +# Begin Source File + +SOURCE=.\pcre.hw + +!IF "$(CFG)" == "pcre - Win32 Release" + +# Begin Custom Build - Creating pcre.h from pcre.hw +InputPath=.\pcre.hw + +".\pcre.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + type .\pcre.hw > .\pcre.h + +# End Custom Build + +!ELSEIF "$(CFG)" == "pcre - Win32 Debug" + +# Begin Custom Build - Creating pcre.h from pcre.hw +InputPath=.\pcre.hw + +".\pcre.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + type .\pcre.hw > .\pcre.h + +# End Custom Build + +!ENDIF + +# End Source File +# End Group +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/pcre.h b/rubbos/app/httpd-2.0.64/srclib/pcre/pcre.h new file mode 100644 index 00000000..d6c23939 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/pcre.h @@ -0,0 +1,113 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* Copyright (c) 1997-2001 University of Cambridge */ + +#ifndef _PCRE_H +#define _PCRE_H + +/* The file pcre.h is build by "configure". Do not edit it; instead +make changes to pcre.in. */ + +#define PCRE_MAJOR 3 +#define PCRE_MINOR 9 +#define PCRE_DATE 02-Jan-2002 + +/* Win32 uses DLL by default */ + +#ifdef _WIN32 +# ifdef STATIC +# define PCRE_DL_IMPORT +# else +# define PCRE_DL_IMPORT __declspec(dllimport) +# endif +#else +# define PCRE_DL_IMPORT +#endif + +/* Have to include stdlib.h in order to ensure that size_t is defined; +it is needed here for malloc. */ + +#include + +/* Allow for C++ users */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Options */ + +#define PCRE_CASELESS 0x0001 +#define PCRE_MULTILINE 0x0002 +#define PCRE_DOTALL 0x0004 +#define PCRE_EXTENDED 0x0008 +#define PCRE_ANCHORED 0x0010 +#define PCRE_DOLLAR_ENDONLY 0x0020 +#define PCRE_EXTRA 0x0040 +#define PCRE_NOTBOL 0x0080 +#define PCRE_NOTEOL 0x0100 +#define PCRE_UNGREEDY 0x0200 +#define PCRE_NOTEMPTY 0x0400 +#define PCRE_UTF8 0x0800 + +/* Exec-time and get-time error codes */ + +#define PCRE_ERROR_NOMATCH (-1) +#define PCRE_ERROR_NULL (-2) +#define PCRE_ERROR_BADOPTION (-3) +#define PCRE_ERROR_BADMAGIC (-4) +#define PCRE_ERROR_UNKNOWN_NODE (-5) +#define PCRE_ERROR_NOMEMORY (-6) +#define PCRE_ERROR_NOSUBSTRING (-7) + +/* Request types for pcre_fullinfo() */ + +#define PCRE_INFO_OPTIONS 0 +#define PCRE_INFO_SIZE 1 +#define PCRE_INFO_CAPTURECOUNT 2 +#define PCRE_INFO_BACKREFMAX 3 +#define PCRE_INFO_FIRSTCHAR 4 +#define PCRE_INFO_FIRSTTABLE 5 +#define PCRE_INFO_LASTLITERAL 6 + +/* Types */ + +struct real_pcre; /* declaration; the definition is private */ +struct real_pcre_extra; /* declaration; the definition is private */ + +typedef struct real_pcre pcre; +typedef struct real_pcre_extra pcre_extra; + +/* Store get and free functions. These can be set to alternative malloc/free +functions if required. Some magic is required for Win32 DLL; it is null on +other OS. */ + +PCRE_DL_IMPORT extern void *(*pcre_malloc)(size_t); +PCRE_DL_IMPORT extern void (*pcre_free)(void *); + +#undef PCRE_DL_IMPORT + +/* Functions */ + +extern pcre *pcre_compile(const char *, int, const char **, int *, + const unsigned char *); +extern int pcre_copy_substring(const char *, int *, int, int, char *, int); +extern int pcre_exec(const pcre *, const pcre_extra *, const char *, + int, int, int, int *, int); +extern void pcre_free_substring(const char *); +extern void pcre_free_substring_list(const char **); +extern int pcre_get_substring(const char *, int *, int, int, const char **); +extern int pcre_get_substring_list(const char *, int *, int, const char ***); +extern int pcre_info(const pcre *, int *, int *); +extern int pcre_fullinfo(const pcre *, const pcre_extra *, int, void *); +extern const unsigned char *pcre_maketables(void); +extern pcre_extra *pcre_study(const pcre *, int, const char **); +extern const char *pcre_version(void); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* End of pcre.h */ diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/pcre.hw b/rubbos/app/httpd-2.0.64/srclib/pcre/pcre.hw new file mode 100644 index 00000000..40d81981 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/pcre.hw @@ -0,0 +1,113 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* Copyright (c) 1997-2001 University of Cambridge */ + +#ifndef _PCRE_H +#define _PCRE_H + +/* The file pcre.h is build by "configure" or copied from pcre.hw +Do not edit it; instead make changes to pcre.in and/or pcre.hw */ + +#define PCRE_MAJOR 3 +#define PCRE_MINOR 9 +#define PCRE_DATE 02-Jan-2002 + +/* Win32 uses DLL by default */ + +#ifdef _WIN32 +# ifdef STATIC +# define PCRE_DL_IMPORT +# else +# define PCRE_DL_IMPORT __declspec(dllimport) +# endif +#else +# define PCRE_DL_IMPORT +#endif + +/* Have to include stdlib.h in order to ensure that size_t is defined; +it is needed here for malloc. */ + +#include + +/* Allow for C++ users */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Options */ + +#define PCRE_CASELESS 0x0001 +#define PCRE_MULTILINE 0x0002 +#define PCRE_DOTALL 0x0004 +#define PCRE_EXTENDED 0x0008 +#define PCRE_ANCHORED 0x0010 +#define PCRE_DOLLAR_ENDONLY 0x0020 +#define PCRE_EXTRA 0x0040 +#define PCRE_NOTBOL 0x0080 +#define PCRE_NOTEOL 0x0100 +#define PCRE_UNGREEDY 0x0200 +#define PCRE_NOTEMPTY 0x0400 +#define PCRE_UTF8 0x0800 + +/* Exec-time and get-time error codes */ + +#define PCRE_ERROR_NOMATCH (-1) +#define PCRE_ERROR_NULL (-2) +#define PCRE_ERROR_BADOPTION (-3) +#define PCRE_ERROR_BADMAGIC (-4) +#define PCRE_ERROR_UNKNOWN_NODE (-5) +#define PCRE_ERROR_NOMEMORY (-6) +#define PCRE_ERROR_NOSUBSTRING (-7) + +/* Request types for pcre_fullinfo() */ + +#define PCRE_INFO_OPTIONS 0 +#define PCRE_INFO_SIZE 1 +#define PCRE_INFO_CAPTURECOUNT 2 +#define PCRE_INFO_BACKREFMAX 3 +#define PCRE_INFO_FIRSTCHAR 4 +#define PCRE_INFO_FIRSTTABLE 5 +#define PCRE_INFO_LASTLITERAL 6 + +/* Types */ + +struct real_pcre; /* declaration; the definition is private */ +struct real_pcre_extra; /* declaration; the definition is private */ + +typedef struct real_pcre pcre; +typedef struct real_pcre_extra pcre_extra; + +/* Store get and free functions. These can be set to alternative malloc/free +functions if required. Some magic is required for Win32 DLL; it is null on +other OS. */ + +PCRE_DL_IMPORT extern void *(*pcre_malloc)(size_t); +PCRE_DL_IMPORT extern void (*pcre_free)(void *); + +#undef PCRE_DL_IMPORT + +/* Functions */ + +extern pcre *pcre_compile(const char *, int, const char **, int *, + const unsigned char *); +extern int pcre_copy_substring(const char *, int *, int, int, char *, int); +extern int pcre_exec(const pcre *, const pcre_extra *, const char *, + int, int, int, int *, int); +extern void pcre_free_substring(const char *); +extern void pcre_free_substring_list(const char **); +extern int pcre_get_substring(const char *, int *, int, int, const char **); +extern int pcre_get_substring_list(const char *, int *, int, const char ***); +extern int pcre_info(const pcre *, int *, int *); +extern int pcre_fullinfo(const pcre *, const pcre_extra *, int, void *); +extern const unsigned char *pcre_maketables(void); +extern pcre_extra *pcre_study(const pcre *, int, const char **); +extern const char *pcre_version(void); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* End of pcre.h */ diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/pcre.in b/rubbos/app/httpd-2.0.64/srclib/pcre/pcre.in new file mode 100644 index 00000000..ef375690 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/pcre.in @@ -0,0 +1,113 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* Copyright (c) 1997-2001 University of Cambridge */ + +#ifndef _PCRE_H +#define _PCRE_H + +/* The file pcre.h is build by "configure". Do not edit it; instead +make changes to pcre.in. */ + +#define PCRE_MAJOR @PCRE_MAJOR@ +#define PCRE_MINOR @PCRE_MINOR@ +#define PCRE_DATE @PCRE_DATE@ + +/* Win32 uses DLL by default */ + +#ifdef _WIN32 +# ifdef STATIC +# define PCRE_DL_IMPORT +# else +# define PCRE_DL_IMPORT __declspec(dllimport) +# endif +#else +# define PCRE_DL_IMPORT +#endif + +/* Have to include stdlib.h in order to ensure that size_t is defined; +it is needed here for malloc. */ + +#include + +/* Allow for C++ users */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Options */ + +#define PCRE_CASELESS 0x0001 +#define PCRE_MULTILINE 0x0002 +#define PCRE_DOTALL 0x0004 +#define PCRE_EXTENDED 0x0008 +#define PCRE_ANCHORED 0x0010 +#define PCRE_DOLLAR_ENDONLY 0x0020 +#define PCRE_EXTRA 0x0040 +#define PCRE_NOTBOL 0x0080 +#define PCRE_NOTEOL 0x0100 +#define PCRE_UNGREEDY 0x0200 +#define PCRE_NOTEMPTY 0x0400 +#define PCRE_UTF8 0x0800 + +/* Exec-time and get-time error codes */ + +#define PCRE_ERROR_NOMATCH (-1) +#define PCRE_ERROR_NULL (-2) +#define PCRE_ERROR_BADOPTION (-3) +#define PCRE_ERROR_BADMAGIC (-4) +#define PCRE_ERROR_UNKNOWN_NODE (-5) +#define PCRE_ERROR_NOMEMORY (-6) +#define PCRE_ERROR_NOSUBSTRING (-7) + +/* Request types for pcre_fullinfo() */ + +#define PCRE_INFO_OPTIONS 0 +#define PCRE_INFO_SIZE 1 +#define PCRE_INFO_CAPTURECOUNT 2 +#define PCRE_INFO_BACKREFMAX 3 +#define PCRE_INFO_FIRSTCHAR 4 +#define PCRE_INFO_FIRSTTABLE 5 +#define PCRE_INFO_LASTLITERAL 6 + +/* Types */ + +struct real_pcre; /* declaration; the definition is private */ +struct real_pcre_extra; /* declaration; the definition is private */ + +typedef struct real_pcre pcre; +typedef struct real_pcre_extra pcre_extra; + +/* Store get and free functions. These can be set to alternative malloc/free +functions if required. Some magic is required for Win32 DLL; it is null on +other OS. */ + +PCRE_DL_IMPORT extern void *(*pcre_malloc)(size_t); +PCRE_DL_IMPORT extern void (*pcre_free)(void *); + +#undef PCRE_DL_IMPORT + +/* Functions */ + +extern pcre *pcre_compile(const char *, int, const char **, int *, + const unsigned char *); +extern int pcre_copy_substring(const char *, int *, int, int, char *, int); +extern int pcre_exec(const pcre *, const pcre_extra *, const char *, + int, int, int, int *, int); +extern void pcre_free_substring(const char *); +extern void pcre_free_substring_list(const char **); +extern int pcre_get_substring(const char *, int *, int, int, const char **); +extern int pcre_get_substring_list(const char *, int *, int, const char ***); +extern int pcre_info(const pcre *, int *, int *); +extern int pcre_fullinfo(const pcre *, const pcre_extra *, int, void *); +extern const unsigned char *pcre_maketables(void); +extern pcre_extra *pcre_study(const pcre *, int, const char **); +extern const char *pcre_version(void); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* End of pcre.h */ diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/pcre.lo b/rubbos/app/httpd-2.0.64/srclib/pcre/pcre.lo new file mode 100644 index 00000000..6c6c8d6f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/pcre.lo @@ -0,0 +1,12 @@ +# pcre.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/pcre.o' + +# Name of the non-PIC object. +non_pic_object='pcre.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/pcre.o b/rubbos/app/httpd-2.0.64/srclib/pcre/pcre.o new file mode 100644 index 0000000000000000000000000000000000000000..0dc04632a14a23eb88b290ac8245779399afcc1e GIT binary patch literal 147848 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 +#include +#include + +/* Compile thuswise: + gcc -Wall pcredemo.c -I/opt/local/include -L/opt/local/lib \ + -R/opt/local/lib -lpcre +*/ + +#define OVECCOUNT 30 /* should be a multiple of 3 */ + +int main(int argc, char **argv) +{ +pcre *re; +const char *error; +int erroffset; +int ovector[OVECCOUNT]; +int rc, i; + +if (argc != 3) + { + printf("Two arguments required: a regex and a subject string\n"); + return 1; + } + +/* Compile the regular expression in the first argument */ + +re = pcre_compile( + argv[1], /* the pattern */ + 0, /* default options */ + &error, /* for error message */ + &erroffset, /* for error offset */ + NULL); /* use default character tables */ + +/* Compilation failed: print the error message and exit */ + +if (re == NULL) + { + printf("PCRE compilation failed at offset %d: %s\n", erroffset, error); + return 1; + } + +/* Compilation succeeded: match the subject in the second argument */ + +rc = pcre_exec( + re, /* the compiled pattern */ + NULL, /* no extra data - we didn't study the pattern */ + argv[2], /* the subject string */ + (int)strlen(argv[2]), /* the length of the subject */ + 0, /* start at offset 0 in the subject */ + 0, /* default options */ + ovector, /* output vector for substring information */ + OVECCOUNT); /* number of elements in the output vector */ + +/* Matching failed: handle error cases */ + +if (rc < 0) + { + switch(rc) + { + case PCRE_ERROR_NOMATCH: printf("No match\n"); break; + /* + Handle other special cases if you like + */ + default: printf("Matching error %d\n", rc); break; + } + return 1; + } + +/* Match succeded */ + +printf("Match succeeded\n"); + +/* The output vector wasn't big enough */ + +if (rc == 0) + { + rc = OVECCOUNT/3; + printf("ovector only has room for %d captured substrings\n", rc - 1); + } + +/* Show substrings stored in the output vector */ + +for (i = 0; i < rc; i++) + { + char *substring_start = argv[2] + ovector[2*i]; + int substring_length = ovector[2*i+1] - ovector[2*i]; + printf("%2d: %.*s\n", i, substring_length, substring_start); + } + +return 0; +} + + diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/pcregrep.c b/rubbos/app/httpd-2.0.64/srclib/pcre/pcregrep.c new file mode 100644 index 00000000..b50ed078 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/pcregrep.c @@ -0,0 +1,540 @@ +/************************************************* +* pcregrep program * +*************************************************/ + +/* This is a grep program that uses the PCRE regular expression library to do +its pattern matching. On a Unix system it can recurse into directories. */ + +#include +#include +#include +#include +#include +#include "config.h" +#include "pcre.h" + +#define FALSE 0 +#define TRUE 1 + +typedef int BOOL; + +#define VERSION "2.0 01-Aug-2001" +#define MAX_PATTERN_COUNT 100 + + +/************************************************* +* Global variables * +*************************************************/ + +static char *pattern_filename = NULL; +static int pattern_count = 0; +static pcre **pattern_list; +static pcre_extra **hints_list; + +static BOOL count_only = FALSE; +static BOOL filenames = TRUE; +static BOOL filenames_only = FALSE; +static BOOL invert = FALSE; +static BOOL number = FALSE; +static BOOL recurse = FALSE; +static BOOL silent = FALSE; +static BOOL whole_lines = FALSE; + +/* Structure for options and list of them */ + +typedef struct option_item { + int one_char; + char *long_name; + char *help_text; +} option_item; + +static option_item optionlist[] = { + { -1, "help", "display this help and exit" }, + { 'c', "count", "print only a count of matching lines per FILE" }, + { 'h', "no-filename", "suppress the prefixing filename on output" }, + { 'i', "ignore-case", "ignore case distinctions" }, + { 'l', "files-with-matches", "print only FILE names containing matches" }, + { 'n', "line-number", "print line number with output lines" }, + { 'r', "recursive", "recursively scan sub-directories" }, + { 's', "no-messages", "suppress error messages" }, + { 'V', "version", "print version information and exit" }, + { 'v', "invert-match", "select non-matching lines" }, + { 'x', "line-regex", "force PATTERN to match only whole lines" }, + { 'x', "line-regexp", "force PATTERN to match only whole lines" }, + { 0, NULL, NULL } +}; + + +/************************************************* +* Functions for directory scanning * +*************************************************/ + +/* These functions are defined so that they can be made system specific, +although at present the only ones are for Unix, and for "no directory recursion +support". */ + + +/************* Directory scanning in Unix ***********/ + +#if IS_UNIX +#include +#include +#include + +typedef DIR directory_type; + +int +isdirectory(char *filename) +{ +struct stat statbuf; +if (stat(filename, &statbuf) < 0) + return 0; /* In the expectation that opening as a file will fail */ +return ((statbuf.st_mode & S_IFMT) == S_IFDIR)? '/' : 0; +} + +directory_type * +opendirectory(char *filename) +{ +return opendir(filename); +} + +char * +readdirectory(directory_type *dir) +{ +for (;;) + { + struct dirent *dent = readdir(dir); + if (dent == NULL) return NULL; + if (strcmp(dent->d_name, ".") != 0 && strcmp(dent->d_name, "..") != 0) + return dent->d_name; + } +return NULL; /* Keep compiler happy; never executed */ +} + +void +closedirectory(directory_type *dir) +{ +closedir(dir); +} + + +#else + + +/************* Directory scanning when we can't do it ***********/ + +/* The type is void, and apart from isdirectory(), the functions do nothing. */ + +typedef void directory_type; + +int isdirectory(char *filename) { return FALSE; } +directory_type * opendirectory(char *filename) {} +char *readdirectory(directory_type *dir) {} +void closedirectory(directory_type *dir) {} + +#endif + + + +#if ! HAVE_STRERROR +/************************************************* +* Provide strerror() for non-ANSI libraries * +*************************************************/ + +/* Some old-fashioned systems still around (e.g. SunOS4) don't have strerror() +in their libraries, but can provide the same facility by this simple +alternative function. */ + +extern int sys_nerr; +extern char *sys_errlist[]; + +char * +strerror(int n) +{ +if (n < 0 || n >= sys_nerr) return "unknown error number"; +return sys_errlist[n]; +} +#endif /* HAVE_STRERROR */ + + + +/************************************************* +* Grep an individual file * +*************************************************/ + +static int +pcregrep(FILE *in, char *name) +{ +int rc = 1; +int linenumber = 0; +int count = 0; +int offsets[99]; +char buffer[BUFSIZ]; + +while (fgets(buffer, sizeof(buffer), in) != NULL) + { + BOOL match = FALSE; + int i; + int length = (int)strlen(buffer); + if (length > 0 && buffer[length-1] == '\n') buffer[--length] = 0; + linenumber++; + + for (i = 0; !match && i < pattern_count; i++) + { + match = pcre_exec(pattern_list[i], hints_list[i], buffer, length, 0, 0, + offsets, 99) >= 0; + if (match && whole_lines && offsets[1] != length) match = FALSE; + } + + if (match != invert) + { + if (count_only) count++; + + else if (filenames_only) + { + fprintf(stdout, "%s\n", (name == NULL)? "" : name); + return 0; + } + + else if (silent) return 0; + + else + { + if (name != NULL) fprintf(stdout, "%s:", name); + if (number) fprintf(stdout, "%d:", linenumber); + fprintf(stdout, "%s\n", buffer); + } + + rc = 0; + } + } + +if (count_only) + { + if (name != NULL) fprintf(stdout, "%s:", name); + fprintf(stdout, "%d\n", count); + } + +return rc; +} + + + + +/************************************************* +* Grep a file or recurse into a directory * +*************************************************/ + +static int +grep_or_recurse(char *filename, BOOL recurse, BOOL show_filenames, + BOOL only_one_at_top) +{ +int rc = 1; +int sep; +FILE *in; + +/* If the file is a directory and we are recursing, scan each file within it. +The scanning code is localized so it can be made system-specific. */ + +if ((sep = isdirectory(filename)) != 0 && recurse) + { + char buffer[1024]; + char *nextfile; + directory_type *dir = opendirectory(filename); + + if (dir == NULL) + { + fprintf(stderr, "pcregrep: Failed to open directory %s: %s\n", filename, + strerror(errno)); + return 2; + } + + while ((nextfile = readdirectory(dir)) != NULL) + { + int frc; + sprintf(buffer, "%.512s%c%.128s", filename, sep, nextfile); + frc = grep_or_recurse(buffer, recurse, TRUE, FALSE); + if (frc == 0 && rc == 1) rc = 0; + } + + closedirectory(dir); + return rc; + } + +/* If the file is not a directory, or we are not recursing, scan it. If this is +the first and only argument at top level, we don't show the file name. +Otherwise, control is via the show_filenames variable. */ + +in = fopen(filename, "r"); +if (in == NULL) + { + fprintf(stderr, "pcregrep: Failed to open %s: %s\n", filename, strerror(errno)); + return 2; + } + +rc = pcregrep(in, (show_filenames && !only_one_at_top)? filename : NULL); +fclose(in); +return rc; +} + + + + +/************************************************* +* Usage function * +*************************************************/ + +static int +usage(int rc) +{ +fprintf(stderr, "Usage: pcregrep [-Vcfhilnrsvx] [long-options] pattern [file] ...\n"); +fprintf(stderr, "Type `pcregrep --help' for more information.\n"); +return rc; +} + + + + +/************************************************* +* Help function * +*************************************************/ + +static void +help(void) +{ +option_item *op; + +printf("Usage: pcregrep [OPTION]... PATTERN [FILE] ...\n"); +printf("Search for PATTERN in each FILE or standard input.\n"); +printf("Example: pcregrep -i 'hello.*world' menu.h main.c\n\n"); + +printf("Options:\n"); + +for (op = optionlist; op->one_char != 0; op++) + { + int n; + char s[4]; + if (op->one_char > 0) sprintf(s, "-%c,", op->one_char); else strcpy(s, " "); + printf(" %s --%s%n", s, op->long_name, &n); + n = 30 - n; + if (n < 1) n = 1; + printf("%.*s%s\n", n, " ", op->help_text); + } + +printf("\n -f or --file=\n"); +printf(" Read patterns from instead of using a command line option.\n"); +printf(" Trailing white space is removed; blanks lines are ignored.\n"); +printf(" There is a maximum of %d patterns.\n", MAX_PATTERN_COUNT); + +printf("\nWith no FILE, read standard input. If fewer than two FILEs given, assume -h.\n"); +printf("Exit status is 0 if any matches, 1 if no matches, and 2 if trouble.\n"); +} + + + + +/************************************************* +* Handle an option * +*************************************************/ + +static int +handle_option(int letter, int options) +{ +switch(letter) + { + case -1: help(); exit(0); + case 'c': count_only = TRUE; break; + case 'h': filenames = FALSE; break; + case 'i': options |= PCRE_CASELESS; break; + case 'l': filenames_only = TRUE; + case 'n': number = TRUE; break; + case 'r': recurse = TRUE; break; + case 's': silent = TRUE; break; + case 'v': invert = TRUE; break; + case 'x': whole_lines = TRUE; options |= PCRE_ANCHORED; break; + + case 'V': + fprintf(stderr, "pcregrep version %s using ", VERSION); + fprintf(stderr, "PCRE version %s\n", pcre_version()); + exit(0); + break; + + default: + fprintf(stderr, "pcregrep: Unknown option -%c\n", letter); + exit(usage(2)); + } + +return options; +} + + + + +/************************************************* +* Main program * +*************************************************/ + +int +main(int argc, char **argv) +{ +int i, j; +int rc = 1; +int options = 0; +int errptr; +const char *error; +BOOL only_one_at_top; + +/* Process the options */ + +for (i = 1; i < argc; i++) + { + if (argv[i][0] != '-') break; + + /* Long name options */ + + if (argv[i][1] == '-') + { + option_item *op; + + if (strncmp(argv[i]+2, "file=", 5) == 0) + { + pattern_filename = argv[i] + 7; + continue; + } + + for (op = optionlist; op->one_char != 0; op++) + { + if (strcmp(argv[i]+2, op->long_name) == 0) + { + options = handle_option(op->one_char, options); + break; + } + } + if (op->one_char == 0) + { + fprintf(stderr, "pcregrep: Unknown option %s\n", argv[i]); + exit(usage(2)); + } + } + + /* One-char options */ + + else + { + char *s = argv[i] + 1; + while (*s != 0) + { + if (*s == 'f') + { + pattern_filename = s + 1; + if (pattern_filename[0] == 0) + { + if (i >= argc - 1) + { + fprintf(stderr, "pcregrep: File name missing after -f\n"); + exit(usage(2)); + } + pattern_filename = argv[++i]; + } + break; + } + else options = handle_option(*s++, options); + } + } + } + +pattern_list = malloc(MAX_PATTERN_COUNT * sizeof(pcre *)); +hints_list = malloc(MAX_PATTERN_COUNT * sizeof(pcre_extra *)); + +if (pattern_list == NULL || hints_list == NULL) + { + fprintf(stderr, "pcregrep: malloc failed\n"); + return 2; + } + +/* Compile the regular expression(s). */ + +if (pattern_filename != NULL) + { + FILE *f = fopen(pattern_filename, "r"); + char buffer[BUFSIZ]; + if (f == NULL) + { + fprintf(stderr, "pcregrep: Failed to open %s: %s\n", pattern_filename, + strerror(errno)); + return 2; + } + while (fgets(buffer, sizeof(buffer), f) != NULL) + { + char *s = buffer + (int)strlen(buffer); + if (pattern_count >= MAX_PATTERN_COUNT) + { + fprintf(stderr, "pcregrep: Too many patterns in file (max %d)\n", + MAX_PATTERN_COUNT); + return 2; + } + while (s > buffer && isspace((unsigned char)(s[-1]))) s--; + if (s == buffer) continue; + *s = 0; + pattern_list[pattern_count] = pcre_compile(buffer, options, &error, + &errptr, NULL); + if (pattern_list[pattern_count++] == NULL) + { + fprintf(stderr, "pcregrep: Error in regex number %d at offset %d: %s\n", + pattern_count, errptr, error); + return 2; + } + } + fclose(f); + } + +/* If no file name, a single regex must be given inline */ + +else + { + if (i >= argc) return usage(0); + pattern_list[0] = pcre_compile(argv[i++], options, &error, &errptr, NULL); + if (pattern_list[0] == NULL) + { + fprintf(stderr, "pcregrep: Error in regex at offset %d: %s\n", errptr, + error); + return 2; + } + pattern_count++; + } + +/* Study the regular expressions, as we will be running them may times */ + +for (j = 0; j < pattern_count; j++) + { + hints_list[j] = pcre_study(pattern_list[j], 0, &error); + if (error != NULL) + { + char s[16]; + if (pattern_count == 1) s[0] = 0; else sprintf(s, " number %d", j); + fprintf(stderr, "pcregrep: Error while studying regex%s: %s\n", s, error); + return 2; + } + } + +/* If there are no further arguments, do the business on stdin and exit */ + +if (i >= argc) return pcregrep(stdin, NULL); + +/* Otherwise, work through the remaining arguments as files or directories. +Pass in the fact that there is only one argument at top level - this suppresses +the file name if the argument is not a directory. */ + +only_one_at_top = (i == argc - 1); +if (filenames_only) filenames = TRUE; + +for (; i < argc; i++) + { + int frc = grep_or_recurse(argv[i], recurse, filenames, only_one_at_top); + if (frc == 0 && rc == 1) rc = 0; + } + +return rc; +} + +/* End */ diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/pcreposix.c b/rubbos/app/httpd-2.0.64/srclib/pcre/pcreposix.c new file mode 100644 index 00000000..29f2e017 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/pcreposix.c @@ -0,0 +1,303 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* +This is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. See +the file Tech.Notes for some information on the internals. + +This module is a wrapper that provides a POSIX API to the underlying PCRE +functions. + +Written by: Philip Hazel + + Copyright (c) 1997-2001 University of Cambridge + +----------------------------------------------------------------------------- +Permission is granted to anyone to use this software for any purpose on any +computer system, and to redistribute it freely, subject to the following +restrictions: + +1. This software is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +2. The origin of this software must not be misrepresented, either by + explicit claim or by omission. + +3. Altered versions must be plainly marked as such, and must not be + misrepresented as being the original software. + +4. If PCRE is embedded in any software that is released under the GNU + General Purpose Licence (GPL), then the terms of that licence shall + supersede any condition above with which it is incompatible. +----------------------------------------------------------------------------- +*/ + +#include "internal.h" +#include "pcreposix.h" +#include "stdlib.h" + + + +/* Corresponding tables of PCRE error messages and POSIX error codes. */ + +static const char *estring[] = { + ERR1, ERR2, ERR3, ERR4, ERR5, ERR6, ERR7, ERR8, ERR9, ERR10, + ERR11, ERR12, ERR13, ERR14, ERR15, ERR16, ERR17, ERR18, ERR19, ERR20, + ERR21, ERR22, ERR23, ERR24, ERR25, ERR26, ERR27, ERR29, ERR29, ERR30, + ERR31 }; + +static int eint[] = { + REG_EESCAPE, /* "\\ at end of pattern" */ + REG_EESCAPE, /* "\\c at end of pattern" */ + REG_EESCAPE, /* "unrecognized character follows \\" */ + REG_BADBR, /* "numbers out of order in {} quantifier" */ + REG_BADBR, /* "number too big in {} quantifier" */ + REG_EBRACK, /* "missing terminating ] for character class" */ + REG_ECTYPE, /* "invalid escape sequence in character class" */ + REG_ERANGE, /* "range out of order in character class" */ + REG_BADRPT, /* "nothing to repeat" */ + REG_BADRPT, /* "operand of unlimited repeat could match the empty string" */ + REG_ASSERT, /* "internal error: unexpected repeat" */ + REG_BADPAT, /* "unrecognized character after (?" */ + REG_ASSERT, /* "unused error" */ + REG_EPAREN, /* "missing )" */ + REG_ESUBREG, /* "back reference to non-existent subpattern" */ + REG_INVARG, /* "erroffset passed as NULL" */ + REG_INVARG, /* "unknown option bit(s) set" */ + REG_EPAREN, /* "missing ) after comment" */ + REG_ESIZE, /* "parentheses nested too deeply" */ + REG_ESIZE, /* "regular expression too large" */ + REG_ESPACE, /* "failed to get memory" */ + REG_EPAREN, /* "unmatched brackets" */ + REG_ASSERT, /* "internal error: code overflow" */ + REG_BADPAT, /* "unrecognized character after (?<" */ + REG_BADPAT, /* "lookbehind assertion is not fixed length" */ + REG_BADPAT, /* "malformed number after (?(" */ + REG_BADPAT, /* "conditional group containe more than two branches" */ + REG_BADPAT, /* "assertion expected after (?(" */ + REG_BADPAT, /* "(?p must be followed by )" */ + REG_ECTYPE, /* "unknown POSIX class name" */ + REG_BADPAT, /* "POSIX collating elements are not supported" */ + REG_INVARG, /* "this version of PCRE is not compiled with PCRE_UTF8 support" */ + REG_BADPAT, /* "characters with values > 255 are not yet supported in classes" */ + REG_BADPAT, /* "character value in \x{...} sequence is too large" */ + REG_BADPAT /* "invalid condition (?(0)" */ +}; + +/* Table of texts corresponding to POSIX error codes */ + +static const char *pstring[] = { + "", /* Dummy for value 0 */ + "internal error", /* REG_ASSERT */ + "invalid repeat counts in {}", /* BADBR */ + "pattern error", /* BADPAT */ + "? * + invalid", /* BADRPT */ + "unbalanced {}", /* EBRACE */ + "unbalanced []", /* EBRACK */ + "collation error - not relevant", /* ECOLLATE */ + "bad class", /* ECTYPE */ + "bad escape sequence", /* EESCAPE */ + "empty expression", /* EMPTY */ + "unbalanced ()", /* EPAREN */ + "bad range inside []", /* ERANGE */ + "expression too big", /* ESIZE */ + "failed to get memory", /* ESPACE */ + "bad back reference", /* ESUBREG */ + "bad argument", /* INVARG */ + "match failed" /* NOMATCH */ +}; + + + + +/************************************************* +* Translate PCRE text code to int * +*************************************************/ + +/* PCRE compile-time errors are given as strings defined as macros. We can just +look them up in a table to turn them into POSIX-style error codes. */ + +static int +pcre_posix_error_code(const char *s) +{ +size_t i; +for (i = 0; i < sizeof(estring)/sizeof(char *); i++) + if (strcmp(s, estring[i]) == 0) return eint[i]; +return REG_ASSERT; +} + + + +/************************************************* +* Translate error code to string * +*************************************************/ + +size_t +regerror(int errcode, const regex_t *preg, char *errbuf, size_t errbuf_size) +{ +const char *message, *addmessage; +size_t length, addlength; + +message = (errcode >= (int)(sizeof(pstring)/sizeof(char *)))? + "unknown error code" : pstring[errcode]; +length = strlen(message) + 1; + +addmessage = " at offset "; +addlength = (preg != NULL && (int)preg->re_erroffset != -1)? + strlen(addmessage) + 6 : 0; + +if (errbuf_size > 0) + { + if (addlength > 0 && errbuf_size >= length + addlength) + sprintf(errbuf, "%s%s%-6d", message, addmessage, (int)preg->re_erroffset); + else + { + strncpy(errbuf, message, errbuf_size - 1); + errbuf[errbuf_size-1] = 0; + } + } + +return length + addlength; +} + + + + +/************************************************* +* Free store held by a regex * +*************************************************/ + +void +regfree(regex_t *preg) +{ +(pcre_free)(preg->re_pcre); +} + + + + +/************************************************* +* Compile a regular expression * +*************************************************/ + +/* +Arguments: + preg points to a structure for recording the compiled expression + pattern the pattern to compile + cflags compilation flags + +Returns: 0 on success + various non-zero codes on failure +*/ + +int +regcomp(regex_t *preg, const char *pattern, int cflags) +{ +const char *errorptr; +int erroffset; +int options = 0; + +if ((cflags & REG_ICASE) != 0) options |= PCRE_CASELESS; +if ((cflags & REG_NEWLINE) != 0) options |= PCRE_MULTILINE; + +preg->re_pcre = pcre_compile(pattern, options, &errorptr, &erroffset, NULL); +preg->re_erroffset = erroffset; + +if (preg->re_pcre == NULL) return pcre_posix_error_code(errorptr); + +preg->re_nsub = pcre_info(preg->re_pcre, NULL, NULL); +return 0; +} + + + + +/************************************************* +* Match a regular expression * +*************************************************/ + +/* Unfortunately, PCRE requires 3 ints of working space for each captured +substring, so we have to get and release working store instead of just using +the POSIX structures as was done in earlier releases when PCRE needed only 2 +ints. */ + +#define SMALL_NMATCH 5 +int +regexec(regex_t *preg, const char *string, size_t nmatch, + regmatch_t pmatch[], int eflags) +{ +int rc; +int options = 0; +/* NOTE: The code related to the "SMALL_NMATCH" optimization + * currently is unique to the httpd-2.0 copy of PCRE 3.9. I've + * submitted the patch to the PCRE maintainer for inclusion in + * the next PCRE release, slated for late 2002. At that time, + * we can merge the new PCRE version into the httpd-2.0/srclib + * tree. --brianp 3/20/2002 + */ +int small_ovector[SMALL_NMATCH * 3]; +int *ovector = NULL; +int allocated_ovector = 0; + +if ((eflags & REG_NOTBOL) != 0) options |= PCRE_NOTBOL; +if ((eflags & REG_NOTEOL) != 0) options |= PCRE_NOTEOL; + +#if 0 +/* This causes a memory segfault after locking the const, thread-shared *preg + * generated at compile time, and is entirely unnecessary. + */ +preg->re_erroffset = (size_t)(-1); /* Only has meaning after compile */ +#endif + +if (nmatch > 0) + { + if (nmatch <= SMALL_NMATCH) + { + ovector = &(small_ovector[0]); + } + else + { + ovector = (int *)malloc(sizeof(int) * nmatch * 3); + if (ovector == NULL) return REG_ESPACE; + allocated_ovector = 1; + } + } + +rc = pcre_exec(preg->re_pcre, NULL, string, (int)strlen(string), 0, options, + ovector, nmatch * 3); + +if (rc == 0) rc = nmatch; /* All captured slots were filled in */ + +if (rc >= 0) + { + size_t i; + for (i = 0; i < (size_t) rc; i++) + { + pmatch[i].rm_so = ovector[i*2]; + pmatch[i].rm_eo = ovector[i*2+1]; + } + if (allocated_ovector) free(ovector); + for (; i < nmatch; i++) pmatch[i].rm_so = pmatch[i].rm_eo = -1; + return 0; + } + +else + { + if (allocated_ovector) free(ovector); + switch(rc) + { + case PCRE_ERROR_NOMATCH: return REG_NOMATCH; + case PCRE_ERROR_NULL: return REG_INVARG; + case PCRE_ERROR_BADOPTION: return REG_INVARG; + case PCRE_ERROR_BADMAGIC: return REG_INVARG; + case PCRE_ERROR_UNKNOWN_NODE: return REG_ASSERT; + case PCRE_ERROR_NOMEMORY: return REG_ESPACE; + default: return REG_ASSERT; + } + } +} + +/* End of pcreposix.c */ diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/pcreposix.dsp b/rubbos/app/httpd-2.0.64/srclib/pcre/pcreposix.dsp new file mode 100644 index 00000000..bf6f11f4 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/pcreposix.dsp @@ -0,0 +1,154 @@ +# Microsoft Developer Studio Project File - Name="pcreposix" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Static Library" 0x0104 + +CFG=pcreposix - 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 "pcreposix.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 "pcreposix.mak" CFG="pcreposix - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "pcreposix - Win32 Release" (based on "Win32 (x86) Static Library") +!MESSAGE "pcreposix - Win32 Debug" (based on "Win32 (x86) Static Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "pcreposix - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "LibR" +# PROP Intermediate_Dir "LibR" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "_WIN32" /D "NDEBUG" /D "_WINDOWS" /D "STATIC" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /D "_WIN32" /D "NDEBUG" /D "_WINDOWS" /D "STATIC" /Fd"LibR/pcreposix_src" /FD /c +# ADD BASE RSC /l 0x409 +# ADD RSC /l 0x409 +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo + +!ELSEIF "$(CFG)" == "pcreposix - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "LibD" +# PROP Intermediate_Dir "LibD" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "_WIN32" /D "_DEBUG" /D "_WINDOWS" /D "STATIC" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "_WIN32" /D "_DEBUG" /D "_WINDOWS" /D "STATIC" /Fd"LibD/pcreposix_src" /FD /c +# ADD BASE RSC /l 0x409 +# ADD RSC /l 0x409 +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo + +!ENDIF + +# Begin Target + +# Name "pcreposix - Win32 Release" +# Name "pcreposix - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "*.c" +# Begin Source File + +SOURCE=.\pcreposix.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "*.h" +# Begin Source File + +SOURCE=.\config.hw + +!IF "$(CFG)" == "pcreposix - Win32 Release" + +# Begin Custom Build - Creating pcre config.h from config.hw +InputPath=.\config.hw + +".\config.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + type .\config.hw > .\config.h + +# End Custom Build + +!ELSEIF "$(CFG)" == "pcreposix - Win32 Debug" + +# Begin Custom Build - Creating pcre config.h from config.hw +InputPath=.\config.hw + +".\config.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + type .\config.hw > .\config.h + +# End Custom Build + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\pcre.hw + +!IF "$(CFG)" == "pcreposix - Win32 Release" + +# Begin Custom Build - Creating pcre.h from pcre.hw +InputPath=.\pcre.hw + +".\pcre.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + type .\pcre.hw > .\pcre.h + +# End Custom Build + +!ELSEIF "$(CFG)" == "pcreposix - Win32 Debug" + +# Begin Custom Build - Creating pcre.h from pcre.hw +InputPath=.\pcre.hw + +".\pcre.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + type .\pcre.hw > .\pcre.h + +# End Custom Build + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\pcreposix.h +# End Source File +# End Group +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/pcreposix.h b/rubbos/app/httpd-2.0.64/srclib/pcre/pcreposix.h new file mode 100644 index 00000000..e70af2de --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/pcreposix.h @@ -0,0 +1,88 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* Copyright (c) 1997-2001 University of Cambridge */ + +#ifndef _PCREPOSIX_H +#define _PCREPOSIX_H + +/* This is the header for the POSIX wrapper interface to the PCRE Perl- +Compatible Regular Expression library. It defines the things POSIX says should +be there. I hope. */ + +/* Have to include stdlib.h in order to ensure that size_t is defined. */ + +#include + +/* Allow for C++ users */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Options defined by POSIX. */ + +#define REG_ICASE 0x01 +#define REG_NEWLINE 0x02 +#define REG_NOTBOL 0x04 +#define REG_NOTEOL 0x08 + +/* These are not used by PCRE, but by defining them we make it easier +to slot PCRE into existing programs that make POSIX calls. */ + +#define REG_EXTENDED 0 +#define REG_NOSUB 0 + +/* Error values. Not all these are relevant or used by the wrapper. */ + +enum { + REG_ASSERT = 1, /* internal error ? */ + REG_BADBR, /* invalid repeat counts in {} */ + REG_BADPAT, /* pattern error */ + REG_BADRPT, /* ? * + invalid */ + REG_EBRACE, /* unbalanced {} */ + REG_EBRACK, /* unbalanced [] */ + REG_ECOLLATE, /* collation error - not relevant */ + REG_ECTYPE, /* bad class */ + REG_EESCAPE, /* bad escape sequence */ + REG_EMPTY, /* empty expression */ + REG_EPAREN, /* unbalanced () */ + REG_ERANGE, /* bad range inside [] */ + REG_ESIZE, /* expression too big */ + REG_ESPACE, /* failed to get memory */ + REG_ESUBREG, /* bad back reference */ + REG_INVARG, /* bad argument */ + REG_NOMATCH /* match failed */ +}; + + +/* The structure representing a compiled regular expression. */ + +typedef struct { + void *re_pcre; + size_t re_nsub; + size_t re_erroffset; +} regex_t; + +/* The structure in which a captured offset is returned. */ + +typedef int regoff_t; + +typedef struct { + regoff_t rm_so; + regoff_t rm_eo; +} regmatch_t; + +/* The functions */ + +extern int regcomp(regex_t *, const char *, int); +extern int regexec(regex_t *, const char *, size_t, regmatch_t *, int); +extern size_t regerror(int, const regex_t *, char *, size_t); +extern void regfree(regex_t *); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* End of pcreposix.h */ diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/pcreposix.lo b/rubbos/app/httpd-2.0.64/srclib/pcre/pcreposix.lo new file mode 100644 index 00000000..03184f38 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/pcreposix.lo @@ -0,0 +1,12 @@ +# pcreposix.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/pcreposix.o' + +# Name of the non-PIC object. +non_pic_object='pcreposix.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/pcreposix.o b/rubbos/app/httpd-2.0.64/srclib/pcre/pcreposix.o new file mode 100644 index 0000000000000000000000000000000000000000..3877a13cacfdd7e5d98f6d472f41fb394d3836d4 GIT binary patch literal 21840 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 Y-=^Vwzvkcnkc*!|;ypk)<2*nA2jr+8&;S4c literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/pcretest.c b/rubbos/app/httpd-2.0.64/srclib/pcre/pcretest.c new file mode 100644 index 00000000..f04443ab --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/pcretest.c @@ -0,0 +1,1262 @@ +/************************************************* +* PCRE testing program * +*************************************************/ + +#include +#include +#include +#include +#include +#include + +/* Use the internal info for displaying the results of pcre_study(). */ + +#include "internal.h" + +/* It is possible to compile this test program without including support for +testing the POSIX interface, though this is not available via the standard +Makefile. */ + +#if !defined NOPOSIX +#include "pcreposix.h" +#endif + +#ifndef CLOCKS_PER_SEC +#ifdef CLK_TCK +#define CLOCKS_PER_SEC CLK_TCK +#else +#define CLOCKS_PER_SEC 100 +#endif +#endif + +#define LOOPREPEAT 20000 + + +static FILE *outfile; +static int log_store = 0; +static size_t gotten_store; + + + +static int utf8_table1[] = { + 0x0000007f, 0x000007ff, 0x0000ffff, 0x001fffff, 0x03ffffff, 0x7fffffff}; + +static int utf8_table2[] = { + 0, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc}; + +static int utf8_table3[] = { + 0xff, 0x1f, 0x0f, 0x07, 0x03, 0x01}; + + +/************************************************* +* Convert character value to UTF-8 * +*************************************************/ + +/* This function takes an integer value in the range 0 - 0x7fffffff +and encodes it as a UTF-8 character in 0 to 6 bytes. + +Arguments: + cvalue the character value + buffer pointer to buffer for result - at least 6 bytes long + +Returns: number of characters placed in the buffer + -1 if input character is negative + 0 if input character is positive but too big (only when + int is longer than 32 bits) +*/ + +static int +ord2utf8(int cvalue, unsigned char *buffer) +{ +register int i, j; +for (i = 0; i < sizeof(utf8_table1)/sizeof(int); i++) + if (cvalue <= utf8_table1[i]) break; +if (i >= sizeof(utf8_table1)/sizeof(int)) return 0; +if (cvalue < 0) return -1; + +buffer += i; +for (j = i; j > 0; j--) + { + *buffer-- = 0x80 | (cvalue & 0x3f); + cvalue >>= 6; + } +*buffer = utf8_table2[i] | cvalue; +return i + 1; +} + + +/************************************************* +* Convert UTF-8 string to value * +*************************************************/ + +/* This function takes one or more bytes that represents a UTF-8 character, +and returns the value of the character. + +Argument: + buffer a pointer to the byte vector + vptr a pointer to an int to receive the value + +Returns: > 0 => the number of bytes consumed + -6 to 0 => malformed UTF-8 character at offset = (-return) +*/ + +int +utf82ord(unsigned char *buffer, int *vptr) +{ +int c = *buffer++; +int d = c; +int i, j, s; + +for (i = -1; i < 6; i++) /* i is number of additional bytes */ + { + if ((d & 0x80) == 0) break; + d <<= 1; + } + +if (i == -1) { *vptr = c; return 1; } /* ascii character */ +if (i == 0 || i == 6) return 0; /* invalid UTF-8 */ + +/* i now has a value in the range 1-5 */ + +s = 6*i; +d = (c & utf8_table3[i]) << s; + +for (j = 0; j < i; j++) + { + c = *buffer++; + if ((c & 0xc0) != 0x80) return -(j+1); + s -= 6; + d |= (c & 0x3f) << s; + } + +/* Check that encoding was the correct unique one */ + +for (j = 0; j < sizeof(utf8_table1)/sizeof(int); j++) + if (d <= utf8_table1[j]) break; +if (j != i) return -(i+1); + +/* Valid value */ + +*vptr = d; +return i+1; +} + + + + + + +/* Debugging function to print the internal form of the regex. This is the same +code as contained in pcre.c under the DEBUG macro. */ + +static const char *OP_names[] = { + "End", "\\A", "\\B", "\\b", "\\D", "\\d", + "\\S", "\\s", "\\W", "\\w", "\\Z", "\\z", + "Opt", "^", "$", "Any", "chars", "not", + "*", "*?", "+", "+?", "?", "??", "{", "{", "{", + "*", "*?", "+", "+?", "?", "??", "{", "{", "{", + "*", "*?", "+", "+?", "?", "??", "{", "{", "{", + "*", "*?", "+", "+?", "?", "??", "{", "{", + "class", "Ref", "Recurse", + "Alt", "Ket", "KetRmax", "KetRmin", "Assert", "Assert not", + "AssertB", "AssertB not", "Reverse", "Once", "Cond", "Cref", + "Brazero", "Braminzero", "Branumber", "Bra" +}; + + +static void print_internals(pcre *re) +{ +unsigned char *code = ((real_pcre *)re)->code; + +fprintf(outfile, "------------------------------------------------------------------\n"); + +for(;;) + { + int c; + int charlength; + + fprintf(outfile, "%3d ", (int)(code - ((real_pcre *)re)->code)); + + if (*code >= OP_BRA) + { + if (*code - OP_BRA > EXTRACT_BASIC_MAX) + fprintf(outfile, "%3d Bra extra", (code[1] << 8) + code[2]); + else + fprintf(outfile, "%3d Bra %d", (code[1] << 8) + code[2], *code - OP_BRA); + code += 2; + } + + else switch(*code) + { + case OP_END: + fprintf(outfile, " %s\n", OP_names[*code]); + fprintf(outfile, "------------------------------------------------------------------\n"); + return; + + case OP_OPT: + fprintf(outfile, " %.2x %s", code[1], OP_names[*code]); + code++; + break; + + case OP_CHARS: + charlength = *(++code); + fprintf(outfile, "%3d ", charlength); + while (charlength-- > 0) + if (isprint(c = *(++code))) fprintf(outfile, "%c", c); + else fprintf(outfile, "\\x%02x", c); + break; + + case OP_KETRMAX: + case OP_KETRMIN: + case OP_ALT: + case OP_KET: + case OP_ASSERT: + case OP_ASSERT_NOT: + case OP_ASSERTBACK: + case OP_ASSERTBACK_NOT: + case OP_ONCE: + case OP_COND: + case OP_BRANUMBER: + case OP_REVERSE: + case OP_CREF: + fprintf(outfile, "%3d %s", (code[1] << 8) + code[2], OP_names[*code]); + code += 2; + break; + + case OP_STAR: + case OP_MINSTAR: + case OP_PLUS: + case OP_MINPLUS: + case OP_QUERY: + case OP_MINQUERY: + case OP_TYPESTAR: + case OP_TYPEMINSTAR: + case OP_TYPEPLUS: + case OP_TYPEMINPLUS: + case OP_TYPEQUERY: + case OP_TYPEMINQUERY: + if (*code >= OP_TYPESTAR) + fprintf(outfile, " %s", OP_names[code[1]]); + else if (isprint(c = code[1])) fprintf(outfile, " %c", c); + else fprintf(outfile, " \\x%02x", c); + fprintf(outfile, "%s", OP_names[*code++]); + break; + + case OP_EXACT: + case OP_UPTO: + case OP_MINUPTO: + if (isprint(c = code[3])) fprintf(outfile, " %c{", c); + else fprintf(outfile, " \\x%02x{", c); + if (*code != OP_EXACT) fprintf(outfile, ","); + fprintf(outfile, "%d}", (code[1] << 8) + code[2]); + if (*code == OP_MINUPTO) fprintf(outfile, "?"); + code += 3; + break; + + case OP_TYPEEXACT: + case OP_TYPEUPTO: + case OP_TYPEMINUPTO: + fprintf(outfile, " %s{", OP_names[code[3]]); + if (*code != OP_TYPEEXACT) fprintf(outfile, "0,"); + fprintf(outfile, "%d}", (code[1] << 8) + code[2]); + if (*code == OP_TYPEMINUPTO) fprintf(outfile, "?"); + code += 3; + break; + + case OP_NOT: + if (isprint(c = *(++code))) fprintf(outfile, " [^%c]", c); + else fprintf(outfile, " [^\\x%02x]", c); + break; + + case OP_NOTSTAR: + case OP_NOTMINSTAR: + case OP_NOTPLUS: + case OP_NOTMINPLUS: + case OP_NOTQUERY: + case OP_NOTMINQUERY: + if (isprint(c = code[1])) fprintf(outfile, " [^%c]", c); + else fprintf(outfile, " [^\\x%02x]", c); + fprintf(outfile, "%s", OP_names[*code++]); + break; + + case OP_NOTEXACT: + case OP_NOTUPTO: + case OP_NOTMINUPTO: + if (isprint(c = code[3])) fprintf(outfile, " [^%c]{", c); + else fprintf(outfile, " [^\\x%02x]{", c); + if (*code != OP_NOTEXACT) fprintf(outfile, ","); + fprintf(outfile, "%d}", (code[1] << 8) + code[2]); + if (*code == OP_NOTMINUPTO) fprintf(outfile, "?"); + code += 3; + break; + + case OP_REF: + fprintf(outfile, " \\%d", (code[1] << 8) | code[2]); + code += 3; + goto CLASS_REF_REPEAT; + + case OP_CLASS: + { + int i, min, max; + code++; + fprintf(outfile, " ["); + + for (i = 0; i < 256; i++) + { + if ((code[i/8] & (1 << (i&7))) != 0) + { + int j; + for (j = i+1; j < 256; j++) + if ((code[j/8] & (1 << (j&7))) == 0) break; + if (i == '-' || i == ']') fprintf(outfile, "\\"); + if (isprint(i)) fprintf(outfile, "%c", i); else fprintf(outfile, "\\x%02x", i); + if (--j > i) + { + fprintf(outfile, "-"); + if (j == '-' || j == ']') fprintf(outfile, "\\"); + if (isprint(j)) fprintf(outfile, "%c", j); else fprintf(outfile, "\\x%02x", j); + } + i = j; + } + } + fprintf(outfile, "]"); + code += 32; + + CLASS_REF_REPEAT: + + switch(*code) + { + case OP_CRSTAR: + case OP_CRMINSTAR: + case OP_CRPLUS: + case OP_CRMINPLUS: + case OP_CRQUERY: + case OP_CRMINQUERY: + fprintf(outfile, "%s", OP_names[*code]); + break; + + case OP_CRRANGE: + case OP_CRMINRANGE: + min = (code[1] << 8) + code[2]; + max = (code[3] << 8) + code[4]; + if (max == 0) fprintf(outfile, "{%d,}", min); + else fprintf(outfile, "{%d,%d}", min, max); + if (*code == OP_CRMINRANGE) fprintf(outfile, "?"); + code += 4; + break; + + default: + code--; + } + } + break; + + /* Anything else is just a one-node item */ + + default: + fprintf(outfile, " %s", OP_names[*code]); + break; + } + + code++; + fprintf(outfile, "\n"); + } +} + + + +/* Character string printing function. A "normal" and a UTF-8 version. */ + +static void pchars(unsigned char *p, int length, int utf8) +{ +int c; +while (length-- > 0) + { + if (utf8) + { + int rc = utf82ord(p, &c); + if (rc > 0) + { + length -= rc - 1; + p += rc; + if (c < 256 && isprint(c)) fprintf(outfile, "%c", c); + else fprintf(outfile, "\\x{%02x}", c); + continue; + } + } + + /* Not UTF-8, or malformed UTF-8 */ + + if (isprint(c = *(p++))) fprintf(outfile, "%c", c); + else fprintf(outfile, "\\x%02x", c); + } +} + + + +/* Alternative malloc function, to test functionality and show the size of the +compiled re. */ + +static void *new_malloc(size_t size) +{ +gotten_store = size; +if (log_store) + fprintf(outfile, "Memory allocation (code space): %d\n", + (int)((int)size - offsetof(real_pcre, code[0]))); +return malloc(size); +} + + + + +/* Get one piece of information from the pcre_fullinfo() function */ + +static void new_info(pcre *re, pcre_extra *study, int option, void *ptr) +{ +int rc; +if ((rc = pcre_fullinfo(re, study, option, ptr)) < 0) + fprintf(outfile, "Error %d from pcre_fullinfo(%d)\n", rc, option); +} + + + + +/* Read lines from named file or stdin and write to named file or stdout; lines +consist of a regular expression, in delimiters and optionally followed by +options, followed by a set of test data, terminated by an empty line. */ + +int main(int argc, char **argv) +{ +FILE *infile = stdin; +int options = 0; +int study_options = 0; +int op = 1; +int timeit = 0; +int showinfo = 0; +int showstore = 0; +int size_offsets = 45; +int size_offsets_max; +int *offsets; +#if !defined NOPOSIX +int posix = 0; +#endif +int debug = 0; +int done = 0; +unsigned char buffer[30000]; +unsigned char dbuffer[1024]; + +/* Static so that new_malloc can use it. */ + +outfile = stdout; + +/* Scan options */ + +while (argc > 1 && argv[op][0] == '-') + { + char *endptr; + + if (strcmp(argv[op], "-s") == 0 || strcmp(argv[op], "-m") == 0) + showstore = 1; + else if (strcmp(argv[op], "-t") == 0) timeit = 1; + else if (strcmp(argv[op], "-i") == 0) showinfo = 1; + else if (strcmp(argv[op], "-d") == 0) showinfo = debug = 1; + else if (strcmp(argv[op], "-o") == 0 && argc > 2 && + ((size_offsets = (int)strtoul(argv[op+1], &endptr, 10)), *endptr == 0)) + { + op++; + argc--; + } +#if !defined NOPOSIX + else if (strcmp(argv[op], "-p") == 0) posix = 1; +#endif + else + { + printf("** Unknown or malformed option %s\n", argv[op]); + printf("Usage: pcretest [-d] [-i] [-o ] [-p] [-s] [-t] [ []]\n"); + printf(" -d debug: show compiled code; implies -i\n" + " -i show information about compiled pattern\n" + " -o set size of offsets vector to \n"); +#if !defined NOPOSIX + printf(" -p use POSIX interface\n"); +#endif + printf(" -s output store information\n" + " -t time compilation and execution\n"); + return 1; + } + op++; + argc--; + } + +/* Get the store for the offsets vector, and remember what it was */ + +size_offsets_max = size_offsets; +offsets = malloc(size_offsets_max * sizeof(int)); +if (offsets == NULL) + { + printf("** Failed to get %d bytes of memory for offsets vector\n", + size_offsets_max * sizeof(int)); + return 1; + } + +/* Sort out the input and output files */ + +if (argc > 1) + { + infile = fopen(argv[op], "r"); + if (infile == NULL) + { + printf("** Failed to open %s\n", argv[op]); + return 1; + } + } + +if (argc > 2) + { + outfile = fopen(argv[op+1], "w"); + if (outfile == NULL) + { + printf("** Failed to open %s\n", argv[op+1]); + return 1; + } + } + +/* Set alternative malloc function */ + +pcre_malloc = new_malloc; + +/* Heading line, then prompt for first regex if stdin */ + +fprintf(outfile, "PCRE version %s\n\n", pcre_version()); + +/* Main loop */ + +while (!done) + { + pcre *re = NULL; + pcre_extra *extra = NULL; + +#if !defined NOPOSIX /* There are still compilers that require no indent */ + regex_t preg; + int do_posix = 0; +#endif + + const char *error; + unsigned char *p, *pp, *ppp; + const unsigned char *tables = NULL; + int do_study = 0; + int do_debug = debug; + int do_G = 0; + int do_g = 0; + int do_showinfo = showinfo; + int do_showrest = 0; + int utf8 = 0; + int erroroffset, len, delimiter; + + if (infile == stdin) printf(" re> "); + if (fgets((char *)buffer, sizeof(buffer), infile) == NULL) break; + if (infile != stdin) fprintf(outfile, "%s", (char *)buffer); + + p = buffer; + while (isspace(*p)) p++; + if (*p == 0) continue; + + /* Get the delimiter and seek the end of the pattern; if is isn't + complete, read more. */ + + delimiter = *p++; + + if (isalnum(delimiter) || delimiter == '\\') + { + fprintf(outfile, "** Delimiter must not be alphameric or \\\n"); + goto SKIP_DATA; + } + + pp = p; + + for(;;) + { + while (*pp != 0) + { + if (*pp == '\\' && pp[1] != 0) pp++; + else if (*pp == delimiter) break; + pp++; + } + if (*pp != 0) break; + + len = sizeof(buffer) - (pp - buffer); + if (len < 256) + { + fprintf(outfile, "** Expression too long - missing delimiter?\n"); + goto SKIP_DATA; + } + + if (infile == stdin) printf(" > "); + if (fgets((char *)pp, len, infile) == NULL) + { + fprintf(outfile, "** Unexpected EOF\n"); + done = 1; + goto CONTINUE; + } + if (infile != stdin) fprintf(outfile, "%s", (char *)pp); + } + + /* If the first character after the delimiter is backslash, make + the pattern end with backslash. This is purely to provide a way + of testing for the error message when a pattern ends with backslash. */ + + if (pp[1] == '\\') *pp++ = '\\'; + + /* Terminate the pattern at the delimiter */ + + *pp++ = 0; + + /* Look for options after final delimiter */ + + options = 0; + study_options = 0; + log_store = showstore; /* default from command line */ + + while (*pp != 0) + { + switch (*pp++) + { + case 'g': do_g = 1; break; + case 'i': options |= PCRE_CASELESS; break; + case 'm': options |= PCRE_MULTILINE; break; + case 's': options |= PCRE_DOTALL; break; + case 'x': options |= PCRE_EXTENDED; break; + + case '+': do_showrest = 1; break; + case 'A': options |= PCRE_ANCHORED; break; + case 'D': do_debug = do_showinfo = 1; break; + case 'E': options |= PCRE_DOLLAR_ENDONLY; break; + case 'G': do_G = 1; break; + case 'I': do_showinfo = 1; break; + case 'M': log_store = 1; break; + +#if !defined NOPOSIX + case 'P': do_posix = 1; break; +#endif + + case 'S': do_study = 1; break; + case 'U': options |= PCRE_UNGREEDY; break; + case 'X': options |= PCRE_EXTRA; break; + case '8': options |= PCRE_UTF8; utf8 = 1; break; + + case 'L': + ppp = pp; + while (*ppp != '\n' && *ppp != ' ') ppp++; + *ppp = 0; + if (setlocale(LC_CTYPE, (const char *)pp) == NULL) + { + fprintf(outfile, "** Failed to set locale \"%s\"\n", pp); + goto SKIP_DATA; + } + tables = pcre_maketables(); + pp = ppp; + break; + + case '\n': case ' ': break; + default: + fprintf(outfile, "** Unknown option '%c'\n", pp[-1]); + goto SKIP_DATA; + } + } + + /* Handle compiling via the POSIX interface, which doesn't support the + timing, showing, or debugging options, nor the ability to pass over + local character tables. */ + +#if !defined NOPOSIX + if (posix || do_posix) + { + int rc; + int cflags = 0; + if ((options & PCRE_CASELESS) != 0) cflags |= REG_ICASE; + if ((options & PCRE_MULTILINE) != 0) cflags |= REG_NEWLINE; + rc = regcomp(&preg, (char *)p, cflags); + + /* Compilation failed; go back for another re, skipping to blank line + if non-interactive. */ + + if (rc != 0) + { + (void)regerror(rc, &preg, (char *)buffer, sizeof(buffer)); + fprintf(outfile, "Failed: POSIX code %d: %s\n", rc, buffer); + goto SKIP_DATA; + } + } + + /* Handle compiling via the native interface */ + + else +#endif /* !defined NOPOSIX */ + + { + if (timeit) + { + register int i; + clock_t time_taken; + clock_t start_time = clock(); + for (i = 0; i < LOOPREPEAT; i++) + { + re = pcre_compile((char *)p, options, &error, &erroroffset, tables); + if (re != NULL) free(re); + } + time_taken = clock() - start_time; + fprintf(outfile, "Compile time %.3f milliseconds\n", + ((double)time_taken * 1000.0) / + ((double)LOOPREPEAT * (double)CLOCKS_PER_SEC)); + } + + re = pcre_compile((char *)p, options, &error, &erroroffset, tables); + + /* Compilation failed; go back for another re, skipping to blank line + if non-interactive. */ + + if (re == NULL) + { + fprintf(outfile, "Failed: %s at offset %d\n", error, erroroffset); + SKIP_DATA: + if (infile != stdin) + { + for (;;) + { + if (fgets((char *)buffer, sizeof(buffer), infile) == NULL) + { + done = 1; + goto CONTINUE; + } + len = (int)strlen((char *)buffer); + while (len > 0 && isspace(buffer[len-1])) len--; + if (len == 0) break; + } + fprintf(outfile, "\n"); + } + goto CONTINUE; + } + + /* Compilation succeeded; print data if required. There are now two + info-returning functions. The old one has a limited interface and + returns only limited data. Check that it agrees with the newer one. */ + + if (do_showinfo) + { + unsigned long int get_options; + int old_first_char, old_options, old_count; + int count, backrefmax, first_char, need_char; + size_t size; + + if (do_debug) print_internals(re); + + new_info(re, NULL, PCRE_INFO_OPTIONS, &get_options); + new_info(re, NULL, PCRE_INFO_SIZE, &size); + new_info(re, NULL, PCRE_INFO_CAPTURECOUNT, &count); + new_info(re, NULL, PCRE_INFO_BACKREFMAX, &backrefmax); + new_info(re, NULL, PCRE_INFO_FIRSTCHAR, &first_char); + new_info(re, NULL, PCRE_INFO_LASTLITERAL, &need_char); + + old_count = pcre_info(re, &old_options, &old_first_char); + if (count < 0) fprintf(outfile, + "Error %d from pcre_info()\n", count); + else + { + if (old_count != count) fprintf(outfile, + "Count disagreement: pcre_fullinfo=%d pcre_info=%d\n", count, + old_count); + + if (old_first_char != first_char) fprintf(outfile, + "First char disagreement: pcre_fullinfo=%d pcre_info=%d\n", + first_char, old_first_char); + + if (old_options != (int)get_options) fprintf(outfile, + "Options disagreement: pcre_fullinfo=%ld pcre_info=%d\n", + get_options, old_options); + } + + if (size != gotten_store) fprintf(outfile, + "Size disagreement: pcre_fullinfo=%d call to malloc for %d\n", + size, gotten_store); + + fprintf(outfile, "Capturing subpattern count = %d\n", count); + if (backrefmax > 0) + fprintf(outfile, "Max back reference = %d\n", backrefmax); + if (get_options == 0) fprintf(outfile, "No options\n"); + else fprintf(outfile, "Options:%s%s%s%s%s%s%s%s%s\n", + ((get_options & PCRE_ANCHORED) != 0)? " anchored" : "", + ((get_options & PCRE_CASELESS) != 0)? " caseless" : "", + ((get_options & PCRE_EXTENDED) != 0)? " extended" : "", + ((get_options & PCRE_MULTILINE) != 0)? " multiline" : "", + ((get_options & PCRE_DOTALL) != 0)? " dotall" : "", + ((get_options & PCRE_DOLLAR_ENDONLY) != 0)? " dollar_endonly" : "", + ((get_options & PCRE_EXTRA) != 0)? " extra" : "", + ((get_options & PCRE_UNGREEDY) != 0)? " ungreedy" : "", + ((get_options & PCRE_UTF8) != 0)? " utf8" : ""); + + if (((((real_pcre *)re)->options) & PCRE_ICHANGED) != 0) + fprintf(outfile, "Case state changes\n"); + + if (first_char == -1) + { + fprintf(outfile, "First char at start or follows \\n\n"); + } + else if (first_char < 0) + { + fprintf(outfile, "No first char\n"); + } + else + { + if (isprint(first_char)) + fprintf(outfile, "First char = \'%c\'\n", first_char); + else + fprintf(outfile, "First char = %d\n", first_char); + } + + if (need_char < 0) + { + fprintf(outfile, "No need char\n"); + } + else + { + if (isprint(need_char)) + fprintf(outfile, "Need char = \'%c\'\n", need_char); + else + fprintf(outfile, "Need char = %d\n", need_char); + } + } + + /* If /S was present, study the regexp to generate additional info to + help with the matching. */ + + if (do_study) + { + if (timeit) + { + register int i; + clock_t time_taken; + clock_t start_time = clock(); + for (i = 0; i < LOOPREPEAT; i++) + extra = pcre_study(re, study_options, &error); + time_taken = clock() - start_time; + if (extra != NULL) free(extra); + fprintf(outfile, " Study time %.3f milliseconds\n", + ((double)time_taken * 1000.0)/ + ((double)LOOPREPEAT * (double)CLOCKS_PER_SEC)); + } + + extra = pcre_study(re, study_options, &error); + if (error != NULL) + fprintf(outfile, "Failed to study: %s\n", error); + else if (extra == NULL) + fprintf(outfile, "Study returned NULL\n"); + + else if (do_showinfo) + { + uschar *start_bits = NULL; + new_info(re, extra, PCRE_INFO_FIRSTTABLE, &start_bits); + if (start_bits == NULL) + fprintf(outfile, "No starting character set\n"); + else + { + int i; + int c = 24; + fprintf(outfile, "Starting character set: "); + for (i = 0; i < 256; i++) + { + if ((start_bits[i/8] & (1<<(i%8))) != 0) + { + if (c > 75) + { + fprintf(outfile, "\n "); + c = 2; + } + if (isprint(i) && i != ' ') + { + fprintf(outfile, "%c ", i); + c += 2; + } + else + { + fprintf(outfile, "\\x%02x ", i); + c += 5; + } + } + } + fprintf(outfile, "\n"); + } + } + } + } + + /* Read data lines and test them */ + + for (;;) + { + unsigned char *q; + unsigned char *bptr = dbuffer; + int *use_offsets = offsets; + int use_size_offsets = size_offsets; + int count, c; + int copystrings = 0; + int getstrings = 0; + int getlist = 0; + int gmatched = 0; + int start_offset = 0; + int g_notempty = 0; + + options = 0; + + if (infile == stdin) printf("data> "); + if (fgets((char *)buffer, sizeof(buffer), infile) == NULL) + { + done = 1; + goto CONTINUE; + } + if (infile != stdin) fprintf(outfile, "%s", (char *)buffer); + + len = (int)strlen((char *)buffer); + while (len > 0 && isspace(buffer[len-1])) len--; + buffer[len] = 0; + if (len == 0) break; + + p = buffer; + while (isspace(*p)) p++; + + q = dbuffer; + while ((c = *p++) != 0) + { + int i = 0; + int n = 0; + if (c == '\\') switch ((c = *p++)) + { + case 'a': c = 7; break; + case 'b': c = '\b'; break; + case 'e': c = 27; break; + case 'f': c = '\f'; break; + case 'n': c = '\n'; break; + case 'r': c = '\r'; break; + case 't': c = '\t'; break; + case 'v': c = '\v'; break; + + case '0': case '1': case '2': case '3': + case '4': case '5': case '6': case '7': + c -= '0'; + while (i++ < 2 && isdigit(*p) && *p != '8' && *p != '9') + c = c * 8 + *p++ - '0'; + break; + + case 'x': + + /* Handle \x{..} specially - new Perl thing for utf8 */ + + if (*p == '{') + { + unsigned char *pt = p; + c = 0; + while (isxdigit(*(++pt))) + c = c * 16 + tolower(*pt) - ((isdigit(*pt))? '0' : 'W'); + if (*pt == '}') + { + unsigned char buffer[8]; + int ii, utn; + utn = ord2utf8(c, buffer); + for (ii = 0; ii < utn - 1; ii++) *q++ = buffer[ii]; + c = buffer[ii]; /* Last byte */ + p = pt + 1; + break; + } + /* Not correct form; fall through */ + } + + /* Ordinary \x */ + + c = 0; + while (i++ < 2 && isxdigit(*p)) + { + c = c * 16 + tolower(*p) - ((isdigit(*p))? '0' : 'W'); + p++; + } + break; + + case 0: /* Allows for an empty line */ + p--; + continue; + + case 'A': /* Option setting */ + options |= PCRE_ANCHORED; + continue; + + case 'B': + options |= PCRE_NOTBOL; + continue; + + case 'C': + while(isdigit(*p)) n = n * 10 + *p++ - '0'; + copystrings |= 1 << n; + continue; + + case 'G': + while(isdigit(*p)) n = n * 10 + *p++ - '0'; + getstrings |= 1 << n; + continue; + + case 'L': + getlist = 1; + continue; + + case 'N': + options |= PCRE_NOTEMPTY; + continue; + + case 'O': + while(isdigit(*p)) n = n * 10 + *p++ - '0'; + if (n > size_offsets_max) + { + size_offsets_max = n; + free(offsets); + use_offsets = offsets = malloc(size_offsets_max * sizeof(int)); + if (offsets == NULL) + { + printf("** Failed to get %d bytes of memory for offsets vector\n", + size_offsets_max * sizeof(int)); + return 1; + } + } + use_size_offsets = n; + if (n == 0) use_offsets = NULL; + continue; + + case 'Z': + options |= PCRE_NOTEOL; + continue; + } + *q++ = c; + } + *q = 0; + len = q - dbuffer; + + /* Handle matching via the POSIX interface, which does not + support timing. */ + +#if !defined NOPOSIX + if (posix || do_posix) + { + int rc; + int eflags = 0; + regmatch_t *pmatch = malloc(sizeof(regmatch_t) * use_size_offsets); + if ((options & PCRE_NOTBOL) != 0) eflags |= REG_NOTBOL; + if ((options & PCRE_NOTEOL) != 0) eflags |= REG_NOTEOL; + + rc = regexec(&preg, (const char *)bptr, use_size_offsets, pmatch, eflags); + + if (rc != 0) + { + (void)regerror(rc, &preg, (char *)buffer, sizeof(buffer)); + fprintf(outfile, "No match: POSIX code %d: %s\n", rc, buffer); + } + else + { + size_t i; + for (i = 0; i < use_size_offsets; i++) + { + if (pmatch[i].rm_so >= 0) + { + fprintf(outfile, "%2d: ", (int)i); + pchars(dbuffer + pmatch[i].rm_so, + pmatch[i].rm_eo - pmatch[i].rm_so, utf8); + fprintf(outfile, "\n"); + if (i == 0 && do_showrest) + { + fprintf(outfile, " 0+ "); + pchars(dbuffer + pmatch[i].rm_eo, len - pmatch[i].rm_eo, utf8); + fprintf(outfile, "\n"); + } + } + } + } + free(pmatch); + } + + /* Handle matching via the native interface - repeats for /g and /G */ + + else +#endif /* !defined NOPOSIX */ + + for (;; gmatched++) /* Loop for /g or /G */ + { + if (timeit) + { + register int i; + clock_t time_taken; + clock_t start_time = clock(); + for (i = 0; i < LOOPREPEAT; i++) + count = pcre_exec(re, extra, (char *)bptr, len, + start_offset, options | g_notempty, use_offsets, use_size_offsets); + time_taken = clock() - start_time; + fprintf(outfile, "Execute time %.3f milliseconds\n", + ((double)time_taken * 1000.0)/ + ((double)LOOPREPEAT * (double)CLOCKS_PER_SEC)); + } + + count = pcre_exec(re, extra, (char *)bptr, len, + start_offset, options | g_notempty, use_offsets, use_size_offsets); + + if (count == 0) + { + fprintf(outfile, "Matched, but too many substrings\n"); + count = use_size_offsets/3; + } + + /* Matched */ + + if (count >= 0) + { + int i; + for (i = 0; i < count * 2; i += 2) + { + if (use_offsets[i] < 0) + fprintf(outfile, "%2d: \n", i/2); + else + { + fprintf(outfile, "%2d: ", i/2); + pchars(bptr + use_offsets[i], use_offsets[i+1] - use_offsets[i], utf8); + fprintf(outfile, "\n"); + if (i == 0) + { + if (do_showrest) + { + fprintf(outfile, " 0+ "); + pchars(bptr + use_offsets[i+1], len - use_offsets[i+1], utf8); + fprintf(outfile, "\n"); + } + } + } + } + + for (i = 0; i < 32; i++) + { + if ((copystrings & (1 << i)) != 0) + { + char copybuffer[16]; + int rc = pcre_copy_substring((char *)bptr, use_offsets, count, + i, copybuffer, sizeof(copybuffer)); + if (rc < 0) + fprintf(outfile, "copy substring %d failed %d\n", i, rc); + else + fprintf(outfile, "%2dC %s (%d)\n", i, copybuffer, rc); + } + } + + for (i = 0; i < 32; i++) + { + if ((getstrings & (1 << i)) != 0) + { + const char *substring; + int rc = pcre_get_substring((char *)bptr, use_offsets, count, + i, &substring); + if (rc < 0) + fprintf(outfile, "get substring %d failed %d\n", i, rc); + else + { + fprintf(outfile, "%2dG %s (%d)\n", i, substring, rc); + /* free((void *)substring); */ + pcre_free_substring(substring); + } + } + } + + if (getlist) + { + const char **stringlist; + int rc = pcre_get_substring_list((char *)bptr, use_offsets, count, + &stringlist); + if (rc < 0) + fprintf(outfile, "get substring list failed %d\n", rc); + else + { + for (i = 0; i < count; i++) + fprintf(outfile, "%2dL %s\n", i, stringlist[i]); + if (stringlist[i] != NULL) + fprintf(outfile, "string list not terminated by NULL\n"); + /* free((void *)stringlist); */ + pcre_free_substring_list(stringlist); + } + } + } + + /* Failed to match. If this is a /g or /G loop and we previously set + g_notempty after a null match, this is not necessarily the end. + We want to advance the start offset, and continue. Fudge the offset + values to achieve this. We won't be at the end of the string - that + was checked before setting g_notempty. */ + + else + { + if (g_notempty != 0) + { + use_offsets[0] = start_offset; + use_offsets[1] = start_offset + 1; + } + else + { + if (gmatched == 0) /* Error if no previous matches */ + { + if (count == -1) fprintf(outfile, "No match\n"); + else fprintf(outfile, "Error %d\n", count); + } + break; /* Out of the /g loop */ + } + } + + /* If not /g or /G we are done */ + + if (!do_g && !do_G) break; + + /* If we have matched an empty string, first check to see if we are at + the end of the subject. If so, the /g loop is over. Otherwise, mimic + what Perl's /g options does. This turns out to be rather cunning. First + we set PCRE_NOTEMPTY and PCRE_ANCHORED and try the match again at the + same point. If this fails (picked up above) we advance to the next + character. */ + + g_notempty = 0; + if (use_offsets[0] == use_offsets[1]) + { + if (use_offsets[0] == len) break; + g_notempty = PCRE_NOTEMPTY | PCRE_ANCHORED; + } + + /* For /g, update the start offset, leaving the rest alone */ + + if (do_g) start_offset = use_offsets[1]; + + /* For /G, update the pointer and length */ + + else + { + bptr += use_offsets[1]; + len -= use_offsets[1]; + } + } /* End of loop for /g and /G */ + } /* End of loop for data lines */ + + CONTINUE: + +#if !defined NOPOSIX + if (posix || do_posix) regfree(&preg); +#endif + + if (re != NULL) free(re); + if (extra != NULL) free(extra); + if (tables != NULL) + { + free((void *)tables); + setlocale(LC_CTYPE, "C"); + } + } + +fprintf(outfile, "\n"); +return 0; +} + +/* End */ diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/perltest b/rubbos/app/httpd-2.0.64/srclib/pcre/perltest new file mode 100755 index 00000000..e6f79749 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/perltest @@ -0,0 +1,169 @@ +#! /usr/bin/perl + +# Program for testing regular expressions with perl to check that PCRE handles +# them the same. + + +# Function for turning a string into a string of printing chars + +sub pchars { +my($t) = ""; + +foreach $c (split(//, $_[0])) + { + if (ord $c >= 32 && ord $c < 127) { $t .= $c; } + else { $t .= sprintf("\\x%02x", ord $c); } + } +$t; +} + + + +# Read lines from named file or stdin and write to named file or stdout; lines +# consist of a regular expression, in delimiters and optionally followed by +# options, followed by a set of test data, terminated by an empty line. + +# Sort out the input and output files + +if (@ARGV > 0) + { + open(INFILE, "<$ARGV[0]") || die "Failed to open $ARGV[0]\n"; + $infile = "INFILE"; + } +else { $infile = "STDIN"; } + +if (@ARGV > 1) + { + open(OUTFILE, ">$ARGV[1]") || die "Failed to open $ARGV[1]\n"; + $outfile = "OUTFILE"; + } +else { $outfile = "STDOUT"; } + +printf($outfile "Perl $] Regular Expressions\n\n"); + +# Main loop + +NEXT_RE: +for (;;) + { + printf " re> " if $infile eq "STDIN"; + last if ! ($_ = <$infile>); + printf $outfile "$_" if $infile ne "STDIN"; + next if ($_ eq ""); + + $pattern = $_; + + while ($pattern !~ /^\s*(.).*\1/s) + { + printf " > " if $infile eq "STDIN"; + last if ! ($_ = <$infile>); + printf $outfile "$_" if $infile ne "STDIN"; + $pattern .= $_; + } + + chomp($pattern); + $pattern =~ s/\s+$//; + + # The private /+ modifier means "print $' afterwards". We use it + # only on the end of patterns to make it easy to chop off here. + + $showrest = ($pattern =~ s/\+(?=[a-z]*$)//); + + # Check that the pattern is valid + + eval "\$_ =~ ${pattern}"; + if ($@) + { + printf $outfile "Error: $@"; + next NEXT_RE; + } + + # If the /g modifier is present, we want to put a loop round the matching; + # otherwise just a single "if". + + $cmd = ($pattern =~ /g[a-z]*$/)? "while" : "if"; + + # If the pattern is actually the null string, Perl uses the most recently + # executed (and successfully compiled) regex is used instead. This is a + # nasty trap for the unwary! The PCRE test suite does contain null strings + # in places - if they are allowed through here all sorts of weird and + # unexpected effects happen. To avoid this, we replace such patterns with + # a non-null pattern that has the same effect. + + $pattern = "/(?#)/$2" if ($pattern =~ /^(.)\1(.*)$/); + + # Read data lines and test them + + for (;;) + { + printf "data> " if $infile eq "STDIN"; + last NEXT_RE if ! ($_ = <$infile>); + chomp; + printf $outfile "$_\n" if $infile ne "STDIN"; + + s/\s+$//; + s/^\s+//; + + last if ($_ eq ""); + + $x = eval "\"$_\""; # To get escapes processed + + # Empty array for holding results, then do the matching. + + @subs = (); + + eval "${cmd} (\$x =~ ${pattern}) {" . + "push \@subs,\$&;" . + "push \@subs,\$1;" . + "push \@subs,\$2;" . + "push \@subs,\$3;" . + "push \@subs,\$4;" . + "push \@subs,\$5;" . + "push \@subs,\$6;" . + "push \@subs,\$7;" . + "push \@subs,\$8;" . + "push \@subs,\$9;" . + "push \@subs,\$10;" . + "push \@subs,\$11;" . + "push \@subs,\$12;" . + "push \@subs,\$13;" . + "push \@subs,\$14;" . + "push \@subs,\$15;" . + "push \@subs,\$16;" . + "push \@subs,\$'; }"; + + if ($@) + { + printf $outfile "Error: $@\n"; + next NEXT_RE; + } + elsif (scalar(@subs) == 0) + { + printf $outfile "No match\n"; + } + else + { + while (scalar(@subs) != 0) + { + printf $outfile (" 0: %s\n", &pchars($subs[0])); + printf $outfile (" 0+ %s\n", &pchars($subs[17])) if $showrest; + $last_printed = 0; + for ($i = 1; $i <= 16; $i++) + { + if (defined $subs[$i]) + { + while ($last_printed++ < $i-1) + { printf $outfile ("%2d: \n", $last_printed); } + printf $outfile ("%2d: %s\n", $i, &pchars($subs[$i])); + $last_printed = $i; + } + } + splice(@subs, 0, 18); + } + } + } + } + +printf $outfile "\n"; + +# End diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/perltest8 b/rubbos/app/httpd-2.0.64/srclib/pcre/perltest8 new file mode 100755 index 00000000..2fe522d6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/perltest8 @@ -0,0 +1,208 @@ +#! /usr/bin/perl + +# Program for testing regular expressions with perl to check that PCRE handles +# them the same. This is the version that supports /8 for UTF-8 testing. It +# requires at least Perl 5.6. + + +# Function for turning a string into a string of printing chars. There are +# currently problems with UTF-8 strings; this fudges round them. + +sub pchars { +my($t) = ""; + +if ($utf8) + { + use utf8; + @p = unpack('U*', $_[0]); + foreach $c (@p) + { + if ($c >= 32 && $c < 127) { $t .= chr $c; } + else { $t .= sprintf("\\x{%02x}", $c); } + } + } + +else + { + foreach $c (split(//, $_[0])) + { + if (ord $c >= 32 && ord $c < 127) { $t .= $c; } + else { $t .= sprintf("\\x%02x", ord $c); } + } + } + +$t; +} + + + +# Read lines from named file or stdin and write to named file or stdout; lines +# consist of a regular expression, in delimiters and optionally followed by +# options, followed by a set of test data, terminated by an empty line. + +# Sort out the input and output files + +if (@ARGV > 0) + { + open(INFILE, "<$ARGV[0]") || die "Failed to open $ARGV[0]\n"; + $infile = "INFILE"; + } +else { $infile = "STDIN"; } + +if (@ARGV > 1) + { + open(OUTFILE, ">$ARGV[1]") || die "Failed to open $ARGV[1]\n"; + $outfile = "OUTFILE"; + } +else { $outfile = "STDOUT"; } + +printf($outfile "Perl $] Regular Expressions\n\n"); + +# Main loop + +NEXT_RE: +for (;;) + { + printf " re> " if $infile eq "STDIN"; + last if ! ($_ = <$infile>); + printf $outfile "$_" if $infile ne "STDIN"; + next if ($_ eq ""); + + $pattern = $_; + + while ($pattern !~ /^\s*(.).*\1/s) + { + printf " > " if $infile eq "STDIN"; + last if ! ($_ = <$infile>); + printf $outfile "$_" if $infile ne "STDIN"; + $pattern .= $_; + } + + chomp($pattern); + $pattern =~ s/\s+$//; + + # The private /+ modifier means "print $' afterwards". + + $showrest = ($pattern =~ s/\+(?=[a-z]*$)//); + + # The private /8 modifier means "operate in UTF-8". Currently, Perl + # has bugs that we try to work around using this flag. + + $utf8 = ($pattern =~ s/8(?=[a-z]*$)//); + + # Check that the pattern is valid + + if ($utf8) + { + use utf8; + eval "\$_ =~ ${pattern}"; + } + else + { + eval "\$_ =~ ${pattern}"; + } + + if ($@) + { + printf $outfile "Error: $@"; + next NEXT_RE; + } + + # If the /g modifier is present, we want to put a loop round the matching; + # otherwise just a single "if". + + $cmd = ($pattern =~ /g[a-z]*$/)? "while" : "if"; + + # If the pattern is actually the null string, Perl uses the most recently + # executed (and successfully compiled) regex is used instead. This is a + # nasty trap for the unwary! The PCRE test suite does contain null strings + # in places - if they are allowed through here all sorts of weird and + # unexpected effects happen. To avoid this, we replace such patterns with + # a non-null pattern that has the same effect. + + $pattern = "/(?#)/$2" if ($pattern =~ /^(.)\1(.*)$/); + + # Read data lines and test them + + for (;;) + { + printf "data> " if $infile eq "STDIN"; + last NEXT_RE if ! ($_ = <$infile>); + chomp; + printf $outfile "$_\n" if $infile ne "STDIN"; + + s/\s+$//; + s/^\s+//; + + last if ($_ eq ""); + + $x = eval "\"$_\""; # To get escapes processed + + # Empty array for holding results, then do the matching. + + @subs = (); + + $pushes = "push \@subs,\$&;" . + "push \@subs,\$1;" . + "push \@subs,\$2;" . + "push \@subs,\$3;" . + "push \@subs,\$4;" . + "push \@subs,\$5;" . + "push \@subs,\$6;" . + "push \@subs,\$7;" . + "push \@subs,\$8;" . + "push \@subs,\$9;" . + "push \@subs,\$10;" . + "push \@subs,\$11;" . + "push \@subs,\$12;" . + "push \@subs,\$13;" . + "push \@subs,\$14;" . + "push \@subs,\$15;" . + "push \@subs,\$16;" . + "push \@subs,\$'; }"; + + if ($utf8) + { + use utf8; + eval "${cmd} (\$x =~ ${pattern}) {" . $pushes; + } + else + { + eval "${cmd} (\$x =~ ${pattern}) {" . $pushes; + } + + if ($@) + { + printf $outfile "Error: $@\n"; + next NEXT_RE; + } + elsif (scalar(@subs) == 0) + { + printf $outfile "No match\n"; + } + else + { + while (scalar(@subs) != 0) + { + printf $outfile (" 0: %s\n", &pchars($subs[0])); + printf $outfile (" 0+ %s\n", &pchars($subs[17])) if $showrest; + $last_printed = 0; + for ($i = 1; $i <= 16; $i++) + { + if (defined $subs[$i]) + { + while ($last_printed++ < $i-1) + { printf $outfile ("%2d: \n", $last_printed); } + printf $outfile ("%2d: %s\n", $i, &pchars($subs[$i])); + $last_printed = $i; + } + } + splice(@subs, 0, 18); + } + } + } + } + +printf $outfile "\n"; + +# End diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/pgrep.c b/rubbos/app/httpd-2.0.64/srclib/pcre/pgrep.c new file mode 100644 index 00000000..ad1b87ea --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/pgrep.c @@ -0,0 +1,225 @@ +/************************************************* +* PCRE grep program * +*************************************************/ + +#include +#include +#include +#include +#include "config.h" +#include "pcre.h" + +#define FALSE 0 +#define TRUE 1 + +typedef int BOOL; + + + +/************************************************* +* Global variables * +*************************************************/ + +static pcre *pattern; +static pcre_extra *hints; + +static BOOL count_only = FALSE; +static BOOL filenames_only = FALSE; +static BOOL invert = FALSE; +static BOOL number = FALSE; +static BOOL silent = FALSE; +static BOOL whole_lines = FALSE; + + + +#if ! HAVE_STRERROR +/************************************************* +* Provide strerror() for non-ANSI libraries * +*************************************************/ + +/* Some old-fashioned systems still around (e.g. SunOS4) don't have strerror() +in their libraries, but can provide the same facility by this simple +alternative function. */ + +extern int sys_nerr; +extern char *sys_errlist[]; + +char * +strerror(int n) +{ +if (n < 0 || n >= sys_nerr) return "unknown error number"; +return sys_errlist[n]; +} +#endif /* HAVE_STRERROR */ + + + +/************************************************* +* Grep an individual file * +*************************************************/ + +static int +pgrep(FILE *in, char *name) +{ +int rc = 1; +int linenumber = 0; +int count = 0; +int offsets[99]; +char buffer[BUFSIZ]; + +while (fgets(buffer, sizeof(buffer), in) != NULL) + { + BOOL match; + int length = (int)strlen(buffer); + if (length > 0 && buffer[length-1] == '\n') buffer[--length] = 0; + linenumber++; + + match = pcre_exec(pattern, hints, buffer, length, 0, 0, offsets, 99) >= 0; + if (match && whole_lines && offsets[1] != length) match = FALSE; + + if (match != invert) + { + if (count_only) count++; + + else if (filenames_only) + { + fprintf(stdout, "%s\n", (name == NULL)? "" : name); + return 0; + } + + else if (silent) return 0; + + else + { + if (name != NULL) fprintf(stdout, "%s:", name); + if (number) fprintf(stdout, "%d:", linenumber); + fprintf(stdout, "%s\n", buffer); + } + + rc = 0; + } + } + +if (count_only) + { + if (name != NULL) fprintf(stdout, "%s:", name); + fprintf(stdout, "%d\n", count); + } + +return rc; +} + + + + +/************************************************* +* Usage function * +*************************************************/ + +static int +usage(int rc) +{ +fprintf(stderr, "Usage: pgrep [-Vchilnsvx] pattern [file] ...\n"); +return rc; +} + + + + +/************************************************* +* Main program * +*************************************************/ + +int +main(int argc, char **argv) +{ +int i; +int rc = 1; +int options = 0; +int errptr; +const char *error; +BOOL filenames = TRUE; + +/* Process the options */ + +for (i = 1; i < argc; i++) + { + char *s; + if (argv[i][0] != '-') break; + s = argv[i] + 1; + while (*s != 0) + { + switch (*s++) + { + case 'c': count_only = TRUE; break; + case 'h': filenames = FALSE; break; + case 'i': options |= PCRE_CASELESS; break; + case 'l': filenames_only = TRUE; + case 'n': number = TRUE; break; + case 's': silent = TRUE; break; + case 'v': invert = TRUE; break; + case 'x': whole_lines = TRUE; options |= PCRE_ANCHORED; break; + + case 'V': + fprintf(stderr, "PCRE version %s\n", pcre_version()); + break; + + default: + fprintf(stderr, "pgrep: unknown option %c\n", s[-1]); + return usage(2); + } + } + } + +/* There must be at least a regexp argument */ + +if (i >= argc) return usage(0); + +/* Compile the regular expression. */ + +pattern = pcre_compile(argv[i++], options, &error, &errptr, NULL); +if (pattern == NULL) + { + fprintf(stderr, "pgrep: error in regex at offset %d: %s\n", errptr, error); + return 2; + } + +/* Study the regular expression, as we will be running it may times */ + +hints = pcre_study(pattern, 0, &error); +if (error != NULL) + { + fprintf(stderr, "pgrep: error while studing regex: %s\n", error); + return 2; + } + +/* If there are no further arguments, do the business on stdin and exit */ + +if (i >= argc) return pgrep(stdin, NULL); + +/* Otherwise, work through the remaining arguments as files. If there is only +one, don't give its name on the output. */ + +if (i == argc - 1) filenames = FALSE; +if (filenames_only) filenames = TRUE; + +for (; i < argc; i++) + { + FILE *in = fopen(argv[i], "r"); + if (in == NULL) + { + fprintf(stderr, "%s: failed to open: %s\n", argv[i], strerror(errno)); + rc = 2; + } + else + { + int frc = pgrep(in, filenames? argv[i] : NULL); + if (frc == 0 && rc == 1) rc = 0; + fclose(in); + } + } + +return rc; +} + +/* End */ diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/study.c b/rubbos/app/httpd-2.0.64/srclib/pcre/study.c new file mode 100644 index 00000000..f924543d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/study.c @@ -0,0 +1,401 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* +This is a library of functions to support regular expressions whose syntax +and semantics are as close as possible to those of the Perl 5 language. See +the file Tech.Notes for some information on the internals. + +Written by: Philip Hazel + + Copyright (c) 1997-2001 University of Cambridge + +----------------------------------------------------------------------------- +Permission is granted to anyone to use this software for any purpose on any +computer system, and to redistribute it freely, subject to the following +restrictions: + +1. This software is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +2. The origin of this software must not be misrepresented, either by + explicit claim or by omission. + +3. Altered versions must be plainly marked as such, and must not be + misrepresented as being the original software. + +4. If PCRE is embedded in any software that is released under the GNU + General Purpose Licence (GPL), then the terms of that licence shall + supersede any condition above with which it is incompatible. +----------------------------------------------------------------------------- +*/ + + +/* Include the internals header, which itself includes Standard C headers plus +the external pcre header. */ + +#include "internal.h" + + + +/************************************************* +* Set a bit and maybe its alternate case * +*************************************************/ + +/* Given a character, set its bit in the table, and also the bit for the other +version of a letter if we are caseless. + +Arguments: + start_bits points to the bit map + c is the character + caseless the caseless flag + cd the block with char table pointers + +Returns: nothing +*/ + +static void +set_bit(uschar *start_bits, int c, BOOL caseless, compile_data *cd) +{ +start_bits[c/8] |= (1 << (c&7)); +if (caseless && (cd->ctypes[c] & ctype_letter) != 0) + start_bits[cd->fcc[c]/8] |= (1 << (cd->fcc[c]&7)); +} + + + +/************************************************* +* Create bitmap of starting chars * +*************************************************/ + +/* This function scans a compiled unanchored expression and attempts to build a +bitmap of the set of initial characters. If it can't, it returns FALSE. As time +goes by, we may be able to get more clever at doing this. + +Arguments: + code points to an expression + start_bits points to a 32-byte table, initialized to 0 + caseless the current state of the caseless flag + cd the block with char table pointers + +Returns: TRUE if table built, FALSE otherwise +*/ + +static BOOL +set_start_bits(const uschar *code, uschar *start_bits, BOOL caseless, + compile_data *cd) +{ +register int c; + +/* This next statement and the later reference to dummy are here in order to +trick the optimizer of the IBM C compiler for OS/2 into generating correct +code. Apparently IBM isn't going to fix the problem, and we would rather not +disable optimization (in this module it actually makes a big difference, and +the pcre module can use all the optimization it can get). */ + +volatile int dummy; + +do + { + const uschar *tcode = code + 3; + BOOL try_next = TRUE; + + while (try_next) + { + /* If a branch starts with a bracket or a positive lookahead assertion, + recurse to set bits from within them. That's all for this branch. */ + + if ((int)*tcode >= OP_BRA || *tcode == OP_ASSERT) + { + if (!set_start_bits(tcode, start_bits, caseless, cd)) + return FALSE; + try_next = FALSE; + } + + else switch(*tcode) + { + default: + return FALSE; + + /* Skip over extended extraction bracket number */ + + case OP_BRANUMBER: + tcode += 3; + break; + + /* Skip over lookbehind and negative lookahead assertions */ + + case OP_ASSERT_NOT: + case OP_ASSERTBACK: + case OP_ASSERTBACK_NOT: + do tcode += (tcode[1] << 8) + tcode[2]; while (*tcode == OP_ALT); + tcode += 3; + break; + + /* Skip over an option setting, changing the caseless flag */ + + case OP_OPT: + caseless = (tcode[1] & PCRE_CASELESS) != 0; + tcode += 2; + break; + + /* BRAZERO does the bracket, but carries on. */ + + case OP_BRAZERO: + case OP_BRAMINZERO: + if (!set_start_bits(++tcode, start_bits, caseless, cd)) + return FALSE; + dummy = 1; + do tcode += (tcode[1] << 8) + tcode[2]; while (*tcode == OP_ALT); + tcode += 3; + break; + + /* Single-char * or ? sets the bit and tries the next item */ + + case OP_STAR: + case OP_MINSTAR: + case OP_QUERY: + case OP_MINQUERY: + set_bit(start_bits, tcode[1], caseless, cd); + tcode += 2; + break; + + /* Single-char upto sets the bit and tries the next */ + + case OP_UPTO: + case OP_MINUPTO: + set_bit(start_bits, tcode[3], caseless, cd); + tcode += 4; + break; + + /* At least one single char sets the bit and stops */ + + case OP_EXACT: /* Fall through */ + tcode++; + + case OP_CHARS: /* Fall through */ + tcode++; + + case OP_PLUS: + case OP_MINPLUS: + set_bit(start_bits, tcode[1], caseless, cd); + try_next = FALSE; + break; + + /* Single character type sets the bits and stops */ + + case OP_NOT_DIGIT: + for (c = 0; c < 32; c++) + start_bits[c] |= ~cd->cbits[c+cbit_digit]; + try_next = FALSE; + break; + + case OP_DIGIT: + for (c = 0; c < 32; c++) + start_bits[c] |= cd->cbits[c+cbit_digit]; + try_next = FALSE; + break; + + case OP_NOT_WHITESPACE: + for (c = 0; c < 32; c++) + start_bits[c] |= ~cd->cbits[c+cbit_space]; + try_next = FALSE; + break; + + case OP_WHITESPACE: + for (c = 0; c < 32; c++) + start_bits[c] |= cd->cbits[c+cbit_space]; + try_next = FALSE; + break; + + case OP_NOT_WORDCHAR: + for (c = 0; c < 32; c++) + start_bits[c] |= ~cd->cbits[c+cbit_word]; + try_next = FALSE; + break; + + case OP_WORDCHAR: + for (c = 0; c < 32; c++) + start_bits[c] |= cd->cbits[c+cbit_word]; + try_next = FALSE; + break; + + /* One or more character type fudges the pointer and restarts, knowing + it will hit a single character type and stop there. */ + + case OP_TYPEPLUS: + case OP_TYPEMINPLUS: + tcode++; + break; + + case OP_TYPEEXACT: + tcode += 3; + break; + + /* Zero or more repeats of character types set the bits and then + try again. */ + + case OP_TYPEUPTO: + case OP_TYPEMINUPTO: + tcode += 2; /* Fall through */ + + case OP_TYPESTAR: + case OP_TYPEMINSTAR: + case OP_TYPEQUERY: + case OP_TYPEMINQUERY: + switch(tcode[1]) + { + case OP_NOT_DIGIT: + for (c = 0; c < 32; c++) + start_bits[c] |= ~cd->cbits[c+cbit_digit]; + break; + + case OP_DIGIT: + for (c = 0; c < 32; c++) + start_bits[c] |= cd->cbits[c+cbit_digit]; + break; + + case OP_NOT_WHITESPACE: + for (c = 0; c < 32; c++) + start_bits[c] |= ~cd->cbits[c+cbit_space]; + break; + + case OP_WHITESPACE: + for (c = 0; c < 32; c++) + start_bits[c] |= cd->cbits[c+cbit_space]; + break; + + case OP_NOT_WORDCHAR: + for (c = 0; c < 32; c++) + start_bits[c] |= ~cd->cbits[c+cbit_word]; + break; + + case OP_WORDCHAR: + for (c = 0; c < 32; c++) + start_bits[c] |= cd->cbits[c+cbit_word]; + break; + } + + tcode += 2; + break; + + /* Character class: set the bits and either carry on or not, + according to the repeat count. */ + + case OP_CLASS: + { + tcode++; + for (c = 0; c < 32; c++) start_bits[c] |= tcode[c]; + tcode += 32; + switch (*tcode) + { + case OP_CRSTAR: + case OP_CRMINSTAR: + case OP_CRQUERY: + case OP_CRMINQUERY: + tcode++; + break; + + case OP_CRRANGE: + case OP_CRMINRANGE: + if (((tcode[1] << 8) + tcode[2]) == 0) tcode += 5; + else try_next = FALSE; + break; + + default: + try_next = FALSE; + break; + } + } + break; /* End of class handling */ + + } /* End of switch */ + } /* End of try_next loop */ + + code += (code[1] << 8) + code[2]; /* Advance to next branch */ + } +while (*code == OP_ALT); +return TRUE; +} + + + +/************************************************* +* Study a compiled expression * +*************************************************/ + +/* This function is handed a compiled expression that it must study to produce +information that will speed up the matching. It returns a pcre_extra block +which then gets handed back to pcre_exec(). + +Arguments: + re points to the compiled expression + options contains option bits + errorptr points to where to place error messages; + set NULL unless error + +Returns: pointer to a pcre_extra block, + NULL on error or if no optimization possible +*/ + +pcre_extra * +pcre_study(const pcre *external_re, int options, const char **errorptr) +{ +uschar start_bits[32]; +real_pcre_extra *extra; +const real_pcre *re = (const real_pcre *)external_re; +compile_data compile_block; + +*errorptr = NULL; + +if (re == NULL || re->magic_number != MAGIC_NUMBER) + { + *errorptr = "argument is not a compiled regular expression"; + return NULL; + } + +if ((options & ~PUBLIC_STUDY_OPTIONS) != 0) + { + *errorptr = "unknown or incorrect option bit(s) set"; + return NULL; + } + +/* For an anchored pattern, or an unchored pattern that has a first char, or a +multiline pattern that matches only at "line starts", no further processing at +present. */ + +if ((re->options & (PCRE_ANCHORED|PCRE_FIRSTSET|PCRE_STARTLINE)) != 0) + return NULL; + +/* Set the character tables in the block which is passed around */ + +compile_block.lcc = re->tables + lcc_offset; +compile_block.fcc = re->tables + fcc_offset; +compile_block.cbits = re->tables + cbits_offset; +compile_block.ctypes = re->tables + ctypes_offset; + +/* See if we can find a fixed set of initial characters for the pattern. */ + +memset(start_bits, 0, 32 * sizeof(uschar)); +if (!set_start_bits(re->code, start_bits, (re->options & PCRE_CASELESS) != 0, + &compile_block)) return NULL; + +/* Get an "extra" block and put the information therein. */ + +extra = (real_pcre_extra *)(pcre_malloc)(sizeof(real_pcre_extra)); + +if (extra == NULL) + { + *errorptr = "failed to get memory"; + return NULL; + } + +extra->options = PCRE_STUDY_MAPPED; +memcpy(extra->start_bits, start_bits, sizeof(start_bits)); + +return (pcre_extra *)extra; +} + +/* End of study.c */ diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/study.lo b/rubbos/app/httpd-2.0.64/srclib/pcre/study.lo new file mode 100644 index 00000000..9d794e72 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/study.lo @@ -0,0 +1,12 @@ +# study.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/study.o' + +# Name of the non-PIC object. +non_pic_object='study.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/study.o b/rubbos/app/httpd-2.0.64/srclib/pcre/study.o new file mode 100644 index 0000000000000000000000000000000000000000..2c38086a6dcbf01092a7bb164c12144b9e3be1c5 GIT binary patch literal 20776 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 O@oMJn<5Kvt{{I^xDpckG literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/testdata/testinput1 b/rubbos/app/httpd-2.0.64/srclib/pcre/testdata/testinput1 new file mode 100644 index 00000000..66df9b3d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/testdata/testinput1 @@ -0,0 +1,1950 @@ +/the quick brown fox/ + the quick brown fox + The quick brown FOX + What do you know about the quick brown fox? + What do you know about THE QUICK BROWN FOX? + +/The quick brown fox/i + the quick brown fox + The quick brown FOX + What do you know about the quick brown fox? + What do you know about THE QUICK BROWN FOX? + +/abcd\t\n\r\f\a\e\071\x3b\$\\\?caxyz/ + abcd\t\n\r\f\a\e9;\$\\?caxyz + +/a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/ + abxyzpqrrrabbxyyyypqAzz + abxyzpqrrrabbxyyyypqAzz + aabxyzpqrrrabbxyyyypqAzz + aaabxyzpqrrrabbxyyyypqAzz + aaaabxyzpqrrrabbxyyyypqAzz + abcxyzpqrrrabbxyyyypqAzz + aabcxyzpqrrrabbxyyyypqAzz + aaabcxyzpqrrrabbxyyyypAzz + aaabcxyzpqrrrabbxyyyypqAzz + aaabcxyzpqrrrabbxyyyypqqAzz + aaabcxyzpqrrrabbxyyyypqqqAzz + aaabcxyzpqrrrabbxyyyypqqqqAzz + aaabcxyzpqrrrabbxyyyypqqqqqAzz + aaabcxyzpqrrrabbxyyyypqqqqqqAzz + aaaabcxyzpqrrrabbxyyyypqAzz + abxyzzpqrrrabbxyyyypqAzz + aabxyzzzpqrrrabbxyyyypqAzz + aaabxyzzzzpqrrrabbxyyyypqAzz + aaaabxyzzzzpqrrrabbxyyyypqAzz + abcxyzzpqrrrabbxyyyypqAzz + aabcxyzzzpqrrrabbxyyyypqAzz + aaabcxyzzzzpqrrrabbxyyyypqAzz + aaaabcxyzzzzpqrrrabbxyyyypqAzz + aaaabcxyzzzzpqrrrabbbxyyyypqAzz + aaaabcxyzzzzpqrrrabbbxyyyyypqAzz + aaabcxyzpqrrrabbxyyyypABzz + aaabcxyzpqrrrabbxyyyypABBzz + >>>aaabxyzpqrrrabbxyyyypqAzz + >aaaabxyzpqrrrabbxyyyypqAzz + >>>>abcxyzpqrrrabbxyyyypqAzz + *** Failers + abxyzpqrrabbxyyyypqAzz + abxyzpqrrrrabbxyyyypqAzz + abxyzpqrrrabxyyyypqAzz + aaaabcxyzzzzpqrrrabbbxyyyyyypqAzz + aaaabcxyzzzzpqrrrabbbxyyypqAzz + aaabcxyzpqrrrabbxyyyypqqqqqqqAzz + +/^(abc){1,2}zz/ + abczz + abcabczz + *** Failers + zz + abcabcabczz + >>abczz + +/^(b+?|a){1,2}?c/ + bc + bbc + bbbc + bac + bbac + aac + abbbbbbbbbbbc + bbbbbbbbbbbac + *** Failers + aaac + abbbbbbbbbbbac + +/^(b+|a){1,2}c/ + bc + bbc + bbbc + bac + bbac + aac + abbbbbbbbbbbc + bbbbbbbbbbbac + *** Failers + aaac + abbbbbbbbbbbac + +/^(b+|a){1,2}?bc/ + bbc + +/^(b*|ba){1,2}?bc/ + babc + bbabc + bababc + *** Failers + bababbc + babababc + +/^(ba|b*){1,2}?bc/ + babc + bbabc + bababc + *** Failers + bababbc + babababc + +/^\ca\cA\c[\c{\c:/ + \x01\x01\e;z + +/^[ab\]cde]/ + athing + bthing + ]thing + cthing + dthing + ething + *** Failers + fthing + [thing + \\thing + +/^[]cde]/ + ]thing + cthing + dthing + ething + *** Failers + athing + fthing + +/^[^ab\]cde]/ + fthing + [thing + \\thing + *** Failers + athing + bthing + ]thing + cthing + dthing + ething + +/^[^]cde]/ + athing + fthing + *** Failers + ]thing + cthing + dthing + ething + +/^\/ +  + +/^ÿ/ + ÿ + +/^[0-9]+$/ + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 100 + *** Failers + abc + +/^.*nter/ + enter + inter + uponter + +/^xxx[0-9]+$/ + xxx0 + xxx1234 + *** Failers + xxx + +/^.+[0-9][0-9][0-9]$/ + x123 + xx123 + 123456 + *** Failers + 123 + x1234 + +/^.+?[0-9][0-9][0-9]$/ + x123 + xx123 + 123456 + *** Failers + 123 + x1234 + +/^([^!]+)!(.+)=apquxz\.ixr\.zzz\.ac\.uk$/ + abc!pqr=apquxz.ixr.zzz.ac.uk + *** Failers + !pqr=apquxz.ixr.zzz.ac.uk + abc!=apquxz.ixr.zzz.ac.uk + abc!pqr=apquxz:ixr.zzz.ac.uk + abc!pqr=apquxz.ixr.zzz.ac.ukk + +/:/ + Well, we need a colon: somewhere + *** Fail if we don't + +/([\da-f:]+)$/i + 0abc + abc + fed + E + :: + 5f03:12C0::932e + fed def + Any old stuff + *** Failers + 0zzz + gzzz + fed\x20 + Any old rubbish + +/^.*\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/ + .1.2.3 + A.12.123.0 + *** Failers + .1.2.3333 + 1.2.3 + 1234.2.3 + +/^(\d+)\s+IN\s+SOA\s+(\S+)\s+(\S+)\s*\(\s*$/ + 1 IN SOA non-sp1 non-sp2( + 1 IN SOA non-sp1 non-sp2 ( + *** Failers + 1IN SOA non-sp1 non-sp2( + +/^[a-zA-Z\d][a-zA-Z\d\-]*(\.[a-zA-Z\d][a-zA-z\d\-]*)*\.$/ + a. + Z. + 2. + ab-c.pq-r. + sxk.zzz.ac.uk. + x-.y-. + *** Failers + -abc.peq. + +/^\*\.[a-z]([a-z\-\d]*[a-z\d]+)?(\.[a-z]([a-z\-\d]*[a-z\d]+)?)*$/ + *.a + *.b0-a + *.c3-b.c + *.c-a.b-c + *** Failers + *.0 + *.a- + *.a-b.c- + *.c-a.0-c + +/^(?=ab(de))(abd)(e)/ + abde + +/^(?!(ab)de|x)(abd)(f)/ + abdf + +/^(?=(ab(cd)))(ab)/ + abcd + +/^[\da-f](\.[\da-f])*$/i + a.b.c.d + A.B.C.D + a.b.c.1.2.3.C + +/^\".*\"\s*(;.*)?$/ + \"1234\" + \"abcd\" ; + \"\" ; rhubarb + *** Failers + \"1234\" : things + +/^$/ + \ + *** Failers + +/ ^ a (?# begins with a) b\sc (?# then b c) $ (?# then end)/x + ab c + *** Failers + abc + ab cde + +/(?x) ^ a (?# begins with a) b\sc (?# then b c) $ (?# then end)/ + ab c + *** Failers + abc + ab cde + +/^ a\ b[c ]d $/x + a bcd + a b d + *** Failers + abcd + ab d + +/^(a(b(c)))(d(e(f)))(h(i(j)))(k(l(m)))$/ + abcdefhijklm + +/^(?:a(b(c)))(?:d(e(f)))(?:h(i(j)))(?:k(l(m)))$/ + abcdefhijklm + +/^[\w][\W][\s][\S][\d][\D][\b][\n][\c]][\022]/ + a+ Z0+\x08\n\x1d\x12 + +/^[.^$|()*+?{,}]+/ + .^\$(*+)|{?,?} + +/^a*\w/ + z + az + aaaz + a + aa + aaaa + a+ + aa+ + +/^a*?\w/ + z + az + aaaz + a + aa + aaaa + a+ + aa+ + +/^a+\w/ + az + aaaz + aa + aaaa + aa+ + +/^a+?\w/ + az + aaaz + aa + aaaa + aa+ + +/^\d{8}\w{2,}/ + 1234567890 + 12345678ab + 12345678__ + *** Failers + 1234567 + +/^[aeiou\d]{4,5}$/ + uoie + 1234 + 12345 + aaaaa + *** Failers + 123456 + +/^[aeiou\d]{4,5}?/ + uoie + 1234 + 12345 + aaaaa + 123456 + +/\A(abc|def)=(\1){2,3}\Z/ + abc=abcabc + def=defdefdef + *** Failers + abc=defdef + +/^(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\11*(\3\4)\1(?#)2$/ + abcdefghijkcda2 + abcdefghijkkkkcda2 + +/(cat(a(ract|tonic)|erpillar)) \1()2(3)/ + cataract cataract23 + catatonic catatonic23 + caterpillar caterpillar23 + + +/^From +([^ ]+) +[a-zA-Z][a-zA-Z][a-zA-Z] +[a-zA-Z][a-zA-Z][a-zA-Z] +[0-9]?[0-9] +[0-9][0-9]:[0-9][0-9]/ + From abcd Mon Sep 01 12:33:02 1997 + +/^From\s+\S+\s+([a-zA-Z]{3}\s+){2}\d{1,2}\s+\d\d:\d\d/ + From abcd Mon Sep 01 12:33:02 1997 + From abcd Mon Sep 1 12:33:02 1997 + *** Failers + From abcd Sep 01 12:33:02 1997 + +/^12.34/s + 12\n34 + 12\r34 + +/\w+(?=\t)/ + the quick brown\t fox + +/foo(?!bar)(.*)/ + foobar is foolish see? + +/(?:(?!foo)...|^.{0,2})bar(.*)/ + foobar crowbar etc + barrel + 2barrel + A barrel + +/^(\D*)(?=\d)(?!123)/ + abc456 + *** Failers + abc123 + +/^1234(?# test newlines + inside)/ + 1234 + +/^1234 #comment in extended re + /x + 1234 + +/#rhubarb + abcd/x + abcd + +/^abcd#rhubarb/x + abcd + +/^(a)\1{2,3}(.)/ + aaab + aaaab + aaaaab + aaaaaab + +/(?!^)abc/ + the abc + *** Failers + abc + +/(?=^)abc/ + abc + *** Failers + the abc + +/^[ab]{1,3}(ab*|b)/ + aabbbbb + +/^[ab]{1,3}?(ab*|b)/ + aabbbbb + +/^[ab]{1,3}?(ab*?|b)/ + aabbbbb + +/^[ab]{1,3}(ab*?|b)/ + aabbbbb + +/ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* # optional leading comment +(?: (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) # initial word +(?: (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) )* # further okay, if led by a period +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] | # atom and space parts, or... +\( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) | # comments, or... + +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +# quoted strings +)* +< (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* # leading < +(?: @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* + +(?: (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* , (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* )? # optional route +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) # initial word +(?: (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) )* # further okay, if led by a period +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* +# address spec +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* > # trailing > +# name and address +) (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* # optional trailing comment +/x + Alan Other + + user\@dom.ain + \"A. Other\" (a comment) + A. Other (a comment) + \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"\@x400-re.lay + A missing angle @,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +" # " +[^\\\x80-\xff\n\015"] * # normal +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* +" # " +# Quoted string +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +\. +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +" # " +[^\\\x80-\xff\n\015"] * # normal +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* +" # " +# Quoted string +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\. +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address +| # or +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +" # " +[^\\\x80-\xff\n\015"] * # normal +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* +" # " +# Quoted string +) +# leading word +[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] * # "normal" atoms and or spaces +(?: +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +| +" # " +[^\\\x80-\xff\n\015"] * # normal +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* +" # " +) # "special" comment or quoted string +[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] * # more "normal" +)* +< +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# < +(?: +@ +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\. +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +(?: , +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +@ +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\. +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +)* # additional domains +: +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)? # optional route +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +" # " +[^\\\x80-\xff\n\015"] * # normal +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* +" # " +# Quoted string +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +\. +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +" # " +[^\\\x80-\xff\n\015"] * # normal +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* +" # " +# Quoted string +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\. +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address spec +> # > +# name and address +) +/x + Alan Other + + user\@dom.ain + \"A. Other\" (a comment) + A. Other (a comment) + \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"\@x400-re.lay + A missing angle ]{0,})>]{0,})>([\d]{0,}\.)(.*)((
    ([\w\W\s\d][^<>]{0,})|[\s]{0,}))<\/a><\/TD>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD><\/TR>/is +

  • + +/a[^a]b/ + acb + a\nb + +/a.b/ + acb + *** Failers + a\nb + +/a[^a]b/s + acb + a\nb + +/a.b/s + acb + a\nb + +/^(b+?|a){1,2}?c/ + bac + bbac + bbbac + bbbbac + bbbbbac + +/^(b+|a){1,2}?c/ + bac + bbac + bbbac + bbbbac + bbbbbac + +/(?!\A)x/m + x\nb\n + a\bx\n + +/\x0{ab}/ + \0{ab} + +/(A|B)*?CD/ + CD + +/(A|B)*CD/ + CD + +/(AB)*?\1/ + ABABAB + +/(AB)*\1/ + ABABAB + +/ End of testinput1 / diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/testdata/testinput2 b/rubbos/app/httpd-2.0.64/srclib/pcre/testdata/testinput2 new file mode 100644 index 00000000..f41478e1 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/testdata/testinput2 @@ -0,0 +1,723 @@ +/(a)b|/ + +/abc/ + abc + defabc + \Aabc + *** Failers + \Adefabc + ABC + +/^abc/ + abc + \Aabc + *** Failers + defabc + \Adefabc + +/a+bc/ + +/a*bc/ + +/a{3}bc/ + +/(abc|a+z)/ + +/^abc$/ + abc + *** Failers + def\nabc + +/ab\gdef/X + +/(?X)ab\gdef/X + +/x{5,4}/ + +/z{65536}/ + +/[abcd/ + +/[\B]/ + +/[z-a]/ + +/^*/ + +/(abc/ + +/(?# abc/ + +/(?z)abc/ + +/.*b/ + +/.*?b/ + +/cat|dog|elephant/ + this sentence eventually mentions a cat + this sentences rambles on and on for a while and then reaches elephant + +/cat|dog|elephant/S + this sentence eventually mentions a cat + this sentences rambles on and on for a while and then reaches elephant + +/cat|dog|elephant/iS + this sentence eventually mentions a CAT cat + this sentences rambles on and on for a while to elephant ElePhant + +/a|[bcd]/S + +/(a|[^\dZ])/S + +/(a|b)*[\s]/S + +/(ab\2)/ + +/{4,5}abc/ + +/(a)(b)(c)\2/ + abcb + \O0abcb + \O3abcb + \O6abcb + \O9abcb + \O12abcb + +/(a)bc|(a)(b)\2/ + abc + \O0abc + \O3abc + \O6abc + aba + \O0aba + \O3aba + \O6aba + \O9aba + \O12aba + +/abc$/E + abc + *** Failers + abc\n + abc\ndef + +/(a)(b)(c)(d)(e)\6/ + +/the quick brown fox/ + the quick brown fox + this is a line with the quick brown fox + +/the quick brown fox/A + the quick brown fox + *** Failers + this is a line with the quick brown fox + +/ab(?z)cd/ + +/^abc|def/ + abcdef + abcdef\B + +/.*((abc)$|(def))/ + defabc + \Zdefabc + +/abc/P + abc + *** Failers + +/^abc|def/P + abcdef + abcdef\B + +/.*((abc)$|(def))/P + defabc + \Zdefabc + +/the quick brown fox/P + the quick brown fox + *** Failers + The Quick Brown Fox + +/the quick brown fox/Pi + the quick brown fox + The Quick Brown Fox + +/abc.def/P + *** Failers + abc\ndef + +/abc$/P + abc + abc\n + +/(abc)\2/P + +/(abc\1)/P + abc + +/)/ + +/a[]b/ + +/[^aeiou ]{3,}/ + co-processors, and for + +/<.*>/ + abcghinop + +/<.*?>/ + abcghinop + +/<.*>/U + abcghinop + +/<.*>(?U)/ + abcghinop + +/<.*?>/U + abcghinop + +/={3,}/U + abc========def + +/(?U)={3,}?/ + abc========def + +/(?^abc)/m + abc + def\nabc + *** Failers + defabc + +/(?<=ab(c+)d)ef/ + +/(?<=ab(?<=c+)d)ef/ + +/(?<=ab(c|de)f)g/ + +/The next three are in testinput2 because they have variable length branches/ + +/(?<=bullock|donkey)-cart/ + the bullock-cart + a donkey-cart race + *** Failers + cart + horse-and-cart + +/(?<=ab(?i)x|y|z)/ + +/(?>.*)(?<=(abcd)|(xyz))/ + alphabetabcd + endingxyz + +/(?<=ab(?i)x(?-i)y|(?i)z|b)ZZ/ + abxyZZ + abXyZZ + ZZZ + zZZ + bZZ + BZZ + *** Failers + ZZ + abXYZZ + zzz + bzz + +/(?[^()]+) # Either a sequence of non-brackets (no backtracking) + | # Or + (?R) # Recurse - i.e. nested bracketed string + )* # Zero or more contents + \) # Closing ) + /x + (abcd) + (abcd)xyz + xyz(abcd) + (ab(xy)cd)pqr + (ab(xycd)pqr + () abc () + 12(abcde(fsh)xyz(foo(bar))lmno)89 + *** Failers + abcd + abcd) + (abcd + +/\( ( (?>[^()]+) | (?R) )* \) /xg + (ab(xy)cd)pqr + 1(abcd)(x(y)z)pqr + +/\( (?: (?>[^()]+) | (?R) ) \) /x + (abcd) + (ab(xy)cd) + (a(b(c)d)e) + ((ab)) + *** Failers + () + +/\( (?: (?>[^()]+) | (?R) )? \) /x + () + 12(abcde(fsh)xyz(foo(bar))lmno)89 + +/\( ( (?>[^()]+) | (?R) )* \) /x + (ab(xy)cd) + +/\( ( ( (?>[^()]+) | (?R) )* ) \) /x + (ab(xy)cd) + +/\( (123)? ( ( (?>[^()]+) | (?R) )* ) \) /x + (ab(xy)cd) + (123ab(xy)cd) + +/\( ( (123)? ( (?>[^()]+) | (?R) )* ) \) /x + (ab(xy)cd) + (123ab(xy)cd) + +/\( (((((((((( ( (?>[^()]+) | (?R) )* )))))))))) \) /x + (ab(xy)cd) + +/\( ( ( (?>[^()<>]+) | ((?>[^()]+)) | (?R) )* ) \) /x + (abcd(xyz

    qrs)123) + +/\( ( ( (?>[^()]+) | ((?R)) )* ) \) /x + (ab(cd)ef) + (ab(cd(ef)gh)ij) + +/^[[:alnum:]]/D + +/^[[:alpha:]]/D + +/^[[:ascii:]]/D + +/^[[:cntrl:]]/D + +/^[[:digit:]]/D + +/^[[:graph:]]/D + +/^[[:lower:]]/D + +/^[[:print:]]/D + +/^[[:punct:]]/D + +/^[[:space:]]/D + +/^[[:upper:]]/D + +/^[[:xdigit:]]/D + +/^[[:word:]]/D + +/^[[:^cntrl:]]/D + +/^[12[:^digit:]]/D + +/[01[:alpha:]%]/D + +/[[.ch.]]/ + +/[[=ch=]]/ + +/[[:rhubarb:]]/ + +/[[:upper:]]/i + A + a + +/[[:lower:]]/i + A + a + +/((?-i)[[:lower:]])[[:lower:]]/i + ab + aB + *** Failers + Ab + AB + +/[\200-\410]/ + +/^(?(0)f|b)oo/ + +/This one's here because of the large output vector needed/ + +/(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\w+)\s+(\270)/ + \O900 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 ABC ABC + +/This one's here because Perl does this differently and PCRE can't at present/ + +/(main(O)?)+/ + mainmain + mainOmain + +/ End of testinput2 / diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/testdata/testinput3 b/rubbos/app/httpd-2.0.64/srclib/pcre/testdata/testinput3 new file mode 100644 index 00000000..d3bd74fd --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/testdata/testinput3 @@ -0,0 +1,1724 @@ +/(?.*/)foo" + /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/it/you/see/ + +"(?>.*/)foo" + /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/and/foo + +/(?>(\.\d\d[1-9]?))\d+/ + 1.230003938 + 1.875000282 + *** Failers + 1.235 + +/^((?>\w+)|(?>\s+))*$/ + now is the time for all good men to come to the aid of the party + *** Failers + this is not a line with only words and spaces! + +/(\d+)(\w)/ + 12345a + 12345+ + +/((?>\d+))(\w)/ + 12345a + *** Failers + 12345+ + +/(?>a+)b/ + aaab + +/((?>a+)b)/ + aaab + +/(?>(a+))b/ + aaab + +/(?>b)+/ + aaabbbccc + +/(?>a+|b+|c+)*c/ + aaabbbbccccd + +/((?>[^()]+)|\([^()]*\))+/ + ((abc(ade)ufh()()x + +/\(((?>[^()]+)|\([^()]+\))+\)/ + (abc) + (abc(def)xyz) + *** Failers + ((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa + +/a(?-i)b/i + ab + *** Failers + Ab + aB + AB + +/(a (?x)b c)d e/ + a bcd e + *** Failers + a b cd e + abcd e + a bcde + +/(a b(?x)c d (?-x)e f)/ + a bcde f + *** Failers + abcdef + +/(a(?i)b)c/ + abc + aBc + *** Failers + abC + aBC + Abc + ABc + ABC + AbC + +/a(?i:b)c/ + abc + aBc + *** Failers + ABC + abC + aBC + +/a(?i:b)*c/ + aBc + aBBc + *** Failers + aBC + aBBC + +/a(?=b(?i)c)\w\wd/ + abcd + abCd + *** Failers + aBCd + abcD + +/(?s-i:more.*than).*million/i + more than million + more than MILLION + more \n than Million + *** Failers + MORE THAN MILLION + more \n than \n million + +/(?:(?s-i)more.*than).*million/i + more than million + more than MILLION + more \n than Million + *** Failers + MORE THAN MILLION + more \n than \n million + +/(?>a(?i)b+)+c/ + abc + aBbc + aBBc + *** Failers + Abc + abAb + abbC + +/(?=a(?i)b)\w\wc/ + abc + aBc + *** Failers + Ab + abC + aBC + +/(?<=a(?i)b)(\w\w)c/ + abxxc + aBxxc + *** Failers + Abxxc + ABxxc + abxxC + +/(?:(a)|b)(?(1)A|B)/ + aA + bB + *** Failers + aB + bA + +/^(a)?(?(1)a|b)+$/ + aa + b + bb + *** Failers + ab + +/^(?(?=abc)\w{3}:|\d\d)$/ + abc: + 12 + *** Failers + 123 + xyz + +/^(?(?!abc)\d\d|\w{3}:)$/ + abc: + 12 + *** Failers + 123 + xyz + +/(?(?<=foo)bar|cat)/ + foobar + cat + fcat + focat + *** Failers + foocat + +/(?(?a*)*/ + a + aa + aaaa + +/(abc|)+/ + abc + abcabc + abcabcabc + xyz + +/([a]*)*/ + a + aaaaa + +/([ab]*)*/ + a + b + ababab + aaaabcde + bbbb + +/([^a]*)*/ + b + bbbb + aaa + +/([^ab]*)*/ + cccc + abab + +/([a]*?)*/ + a + aaaa + +/([ab]*?)*/ + a + b + abab + baba + +/([^a]*?)*/ + b + bbbb + aaa + +/([^ab]*?)*/ + c + cccc + baba + +/(?>a*)*/ + a + aaabcde + +/((?>a*))*/ + aaaaa + aabbaa + +/((?>a*?))*/ + aaaaa + aabbaa + +/(?(?=[^a-z]+[a-z]) \d{2}-[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2} ) /x + 12-sep-98 + 12-09-98 + *** Failers + sep-12-98 + +/(?<=(foo))bar\1/ + foobarfoo + foobarfootling + *** Failers + foobar + barfoo + +/(?i:saturday|sunday)/ + saturday + sunday + Saturday + Sunday + SATURDAY + SUNDAY + SunDay + +/(a(?i)bc|BB)x/ + abcx + aBCx + bbx + BBx + *** Failers + abcX + aBCX + bbX + BBX + +/^([ab](?i)[cd]|[ef])/ + ac + aC + bD + elephant + Europe + frog + France + *** Failers + Africa + +/^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/ + ab + aBd + xy + xY + zebra + Zambesi + *** Failers + aCD + XY + +/(?<=foo\n)^bar/m + foo\nbar + *** Failers + bar + baz\nbar + +/(?<=(?]&/ + <&OUT + +/^(a\1?){4}$/ + aaaaaaaaaa + *** Failers + AB + aaaaaaaaa + aaaaaaaaaaa + +/^(a(?(1)\1)){4}$/ + aaaaaaaaaa + *** Failers + aaaaaaaaa + aaaaaaaaaaa + +/(?:(f)(o)(o)|(b)(a)(r))*/ + foobar + +/(?<=a)b/ + ab + *** Failers + cb + b + +/(?a+)ab/ + +/(?>a+)b/ + aaab + +/([[:]+)/ + a:[b]: + +/([[=]+)/ + a=[b]= + +/([[.]+)/ + a.[b]. + +/((?>a+)b)/ + aaab + +/(?>(a+))b/ + aaab + +/((?>[^()]+)|\([^()]*\))+/ + ((abc(ade)ufh()()x + +/a\Z/ + *** Failers + aaab + a\nb\n + +/b\Z/ + a\nb\n + +/b\z/ + +/b\Z/ + a\nb + +/b\z/ + a\nb + *** Failers + +/^(?>(?(1)\.|())[^\W_](?>[a-z0-9-]*[^\W_])?)+$/ + a + abc + a-b + 0-9 + a.b + 5.6.7 + the.quick.brown.fox + a100.b200.300c + 12-ab.1245 + ***Failers + \ + .a + -a + a- + a. + a_b + a.- + a.. + ab..bc + the.quick.brown.fox- + the.quick.brown.fox. + the.quick.brown.fox_ + the.quick.brown.fox+ + +/(?>.*)(?<=(abcd|wxyz))/ + alphabetabcd + endingwxyz + *** Failers + a rather long string that doesn't end with one of them + +/word (?>(?:(?!otherword)[a-zA-Z0-9]+ ){0,30})otherword/ + word cat dog elephant mussel cow horse canary baboon snake shark otherword + word cat dog elephant mussel cow horse canary baboon snake shark + +/word (?>[a-zA-Z0-9]+ ){0,30}otherword/ + word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope + +/(?<=\d{3}(?!999))foo/ + 999foo + 123999foo + *** Failers + 123abcfoo + +/(?<=(?!...999)\d{3})foo/ + 999foo + 123999foo + *** Failers + 123abcfoo + +/(?<=\d{3}(?!999)...)foo/ + 123abcfoo + 123456foo + *** Failers + 123999foo + +/(?<=\d{3}...)(?\s*)=(?>\s*) # find Z)+|A)*/ + ZABCDEFG + +/((?>)+|A)*/ + ZABCDEFG + +/a*/g + abbab + +/^[a-\d]/ + abcde + -things + 0digit + *** Failers + bcdef + +/^[\d-a]/ + abcde + -things + 0digit + *** Failers + bcdef + +/ End of testinput3 / diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/testdata/testinput4 b/rubbos/app/httpd-2.0.64/srclib/pcre/testdata/testinput4 new file mode 100644 index 00000000..f2878965 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/testdata/testinput4 @@ -0,0 +1,65 @@ +/^[\w]+/ + *** Failers + École + +/^[\w]+/Lfr + École + +/^[\w]+/ + *** Failers + École + +/^[\W]+/ + École + +/^[\W]+/Lfr + *** Failers + École + +/[\b]/ + \b + *** Failers + a + +/[\b]/Lfr + \b + *** Failers + a + +/^\w+/ + *** Failers + École + +/^\w+/Lfr + École + +/(.+)\b(.+)/ + École + +/(.+)\b(.+)/Lfr + *** Failers + École + +/École/i + École + *** Failers + école + +/École/iLfr + École + école + +/\w/IS + +/\w/ISLfr + +/^[\xc8-\xc9]/iLfr + École + école + +/^[\xc8-\xc9]/Lfr + École + *** Failers + école + +/ End of testinput4 / diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/testdata/testinput5 b/rubbos/app/httpd-2.0.64/srclib/pcre/testdata/testinput5 new file mode 100644 index 00000000..d66cfbdd --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/testdata/testinput5 @@ -0,0 +1,118 @@ +/-- Because of problems with Perl 5.6 in handling UTF-8 vs non UTF-8 --/ +/-- strings automatically, do not use the \x{} construct except with --/ +/-- patterns that have the /8 option set, and don't use them without! --/ + +/a.b/8 + acb + a\x7fb + a\x{100}b + *** Failers + a\nb + +/a(.{3})b/8 + a\x{4000}xyb + a\x{4000}\x7fyb + a\x{4000}\x{100}yb + *** Failers + a\x{4000}b + ac\ncb + +/a(.*?)(.)/ + a\xc0\x88b + +/a(.*?)(.)/8 + a\x{100}b + +/a(.*)(.)/ + a\xc0\x88b + +/a(.*)(.)/8 + a\x{100}b + +/a(.)(.)/ + a\xc0\x92bcd + +/a(.)(.)/8 + a\x{240}bcd + +/a(.?)(.)/ + a\xc0\x92bcd + +/a(.?)(.)/8 + a\x{240}bcd + +/a(.??)(.)/ + a\xc0\x92bcd + +/a(.??)(.)/8 + a\x{240}bcd + +/a(.{3})b/8 + a\x{1234}xyb + a\x{1234}\x{4321}yb + a\x{1234}\x{4321}\x{3412}b + *** Failers + a\x{1234}b + ac\ncb + +/a(.{3,})b/8 + a\x{1234}xyb + a\x{1234}\x{4321}yb + a\x{1234}\x{4321}\x{3412}b + axxxxbcdefghijb + a\x{1234}\x{4321}\x{3412}\x{3421}b + *** Failers + a\x{1234}b + +/a(.{3,}?)b/8 + a\x{1234}xyb + a\x{1234}\x{4321}yb + a\x{1234}\x{4321}\x{3412}b + axxxxbcdefghijb + a\x{1234}\x{4321}\x{3412}\x{3421}b + *** Failers + a\x{1234}b + +/a(.{3,5})b/8 + a\x{1234}xyb + a\x{1234}\x{4321}yb + a\x{1234}\x{4321}\x{3412}b + axxxxbcdefghijb + a\x{1234}\x{4321}\x{3412}\x{3421}b + axbxxbcdefghijb + axxxxxbcdefghijb + *** Failers + a\x{1234}b + axxxxxxbcdefghijb + +/a(.{3,5}?)b/8 + a\x{1234}xyb + a\x{1234}\x{4321}yb + a\x{1234}\x{4321}\x{3412}b + axxxxbcdefghijb + a\x{1234}\x{4321}\x{3412}\x{3421}b + axbxxbcdefghijb + axxxxxbcdefghijb + *** Failers + a\x{1234}b + axxxxxxbcdefghijb + +/^[a\x{c0}]/8 + *** Failers + \x{100} + +/(?<=aXb)cd/8 + aXbcd + +/(?<=a\x{100}b)cd/8 + a\x{100}bcd + +/(?<=a\x{100000}b)cd/8 + a\x{100000}bcd + +/(?:\x{100}){3}b/8 + \x{100}\x{100}\x{100}b + *** Failers + \x{100}\x{100}b + +/ End of testinput5 / diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/testdata/testinput6 b/rubbos/app/httpd-2.0.64/srclib/pcre/testdata/testinput6 new file mode 100644 index 00000000..00748513 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/testdata/testinput6 @@ -0,0 +1,78 @@ +/\x{100}/8DM + +/\x{1000}/8DM + +/\x{10000}/8DM + +/\x{100000}/8DM + +/\x{1000000}/8DM + +/\x{4000000}/8DM + +/\x{7fffFFFF}/8DM + +/[\x{ff}]/8DM + +/[\x{100}]/8DM + +/\x{ffffffff}/8 + +/\x{100000000}/8 + +/^\x{100}a\x{1234}/8 + \x{100}a\x{1234}bcd + +/\x80/8D + +/\xff/8D + +/\x{0041}\x{2262}\x{0391}\x{002e}/D8 + \x{0041}\x{2262}\x{0391}\x{002e} + +/\x{D55c}\x{ad6d}\x{C5B4}/D8 + \x{D55c}\x{ad6d}\x{C5B4} + +/\x{65e5}\x{672c}\x{8a9e}/D8 + \x{65e5}\x{672c}\x{8a9e} + +/\x{80}/D8 + +/\x{084}/D8 + +/\x{104}/D8 + +/\x{861}/D8 + +/\x{212ab}/D8 + +/.{3,5}X/D8 + \x{212ab}\x{212ab}\x{212ab}\x{861}X + + +/.{3,5}?/D8 + \x{212ab}\x{212ab}\x{212ab}\x{861} + +/-- These tests are here rather than in testinput5 because Perl 5.6 has --/ +/-- some problems with UTF-8 support, in the area of \x{..} where the --/ +/-- value is < 255. It grumbles about invalid UTF-8 strings. --/ + +/^[a\x{c0}]b/8 + \x{c0}b + +/^([a\x{c0}]*?)aa/8 + a\x{c0}aaaa/ + +/^([a\x{c0}]*?)aa/8 + a\x{c0}aaaa/ + a\x{c0}a\x{c0}aaa/ + +/^([a\x{c0}]*)aa/8 + a\x{c0}aaaa/ + a\x{c0}a\x{c0}aaa/ + +/^([a\x{c0}]*)a\x{c0}/8 + a\x{c0}aaaa/ + a\x{c0}a\x{c0}aaa/ + +/ End of testinput6 / diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/testdata/testoutput1 b/rubbos/app/httpd-2.0.64/srclib/pcre/testdata/testoutput1 new file mode 100644 index 00000000..f0047ffc --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/testdata/testoutput1 @@ -0,0 +1,3018 @@ +PCRE version 3.9 02-Jan-2002 + +/the quick brown fox/ + the quick brown fox + 0: the quick brown fox + The quick brown FOX +No match + What do you know about the quick brown fox? + 0: the quick brown fox + What do you know about THE QUICK BROWN FOX? +No match + +/The quick brown fox/i + the quick brown fox + 0: the quick brown fox + The quick brown FOX + 0: The quick brown FOX + What do you know about the quick brown fox? + 0: the quick brown fox + What do you know about THE QUICK BROWN FOX? + 0: THE QUICK BROWN FOX + +/abcd\t\n\r\f\a\e\071\x3b\$\\\?caxyz/ + abcd\t\n\r\f\a\e9;\$\\?caxyz + 0: abcd\x09\x0a\x0d\x0c\x07\x1b9;$\?caxyz + +/a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/ + abxyzpqrrrabbxyyyypqAzz + 0: abxyzpqrrrabbxyyyypqAzz + abxyzpqrrrabbxyyyypqAzz + 0: abxyzpqrrrabbxyyyypqAzz + aabxyzpqrrrabbxyyyypqAzz + 0: aabxyzpqrrrabbxyyyypqAzz + aaabxyzpqrrrabbxyyyypqAzz + 0: aaabxyzpqrrrabbxyyyypqAzz + aaaabxyzpqrrrabbxyyyypqAzz + 0: aaaabxyzpqrrrabbxyyyypqAzz + abcxyzpqrrrabbxyyyypqAzz + 0: abcxyzpqrrrabbxyyyypqAzz + aabcxyzpqrrrabbxyyyypqAzz + 0: aabcxyzpqrrrabbxyyyypqAzz + aaabcxyzpqrrrabbxyyyypAzz + 0: aaabcxyzpqrrrabbxyyyypAzz + aaabcxyzpqrrrabbxyyyypqAzz + 0: aaabcxyzpqrrrabbxyyyypqAzz + aaabcxyzpqrrrabbxyyyypqqAzz + 0: aaabcxyzpqrrrabbxyyyypqqAzz + aaabcxyzpqrrrabbxyyyypqqqAzz + 0: aaabcxyzpqrrrabbxyyyypqqqAzz + aaabcxyzpqrrrabbxyyyypqqqqAzz + 0: aaabcxyzpqrrrabbxyyyypqqqqAzz + aaabcxyzpqrrrabbxyyyypqqqqqAzz + 0: aaabcxyzpqrrrabbxyyyypqqqqqAzz + aaabcxyzpqrrrabbxyyyypqqqqqqAzz + 0: aaabcxyzpqrrrabbxyyyypqqqqqqAzz + aaaabcxyzpqrrrabbxyyyypqAzz + 0: aaaabcxyzpqrrrabbxyyyypqAzz + abxyzzpqrrrabbxyyyypqAzz + 0: abxyzzpqrrrabbxyyyypqAzz + aabxyzzzpqrrrabbxyyyypqAzz + 0: aabxyzzzpqrrrabbxyyyypqAzz + aaabxyzzzzpqrrrabbxyyyypqAzz + 0: aaabxyzzzzpqrrrabbxyyyypqAzz + aaaabxyzzzzpqrrrabbxyyyypqAzz + 0: aaaabxyzzzzpqrrrabbxyyyypqAzz + abcxyzzpqrrrabbxyyyypqAzz + 0: abcxyzzpqrrrabbxyyyypqAzz + aabcxyzzzpqrrrabbxyyyypqAzz + 0: aabcxyzzzpqrrrabbxyyyypqAzz + aaabcxyzzzzpqrrrabbxyyyypqAzz + 0: aaabcxyzzzzpqrrrabbxyyyypqAzz + aaaabcxyzzzzpqrrrabbxyyyypqAzz + 0: aaaabcxyzzzzpqrrrabbxyyyypqAzz + aaaabcxyzzzzpqrrrabbbxyyyypqAzz + 0: aaaabcxyzzzzpqrrrabbbxyyyypqAzz + aaaabcxyzzzzpqrrrabbbxyyyyypqAzz + 0: aaaabcxyzzzzpqrrrabbbxyyyyypqAzz + aaabcxyzpqrrrabbxyyyypABzz + 0: aaabcxyzpqrrrabbxyyyypABzz + aaabcxyzpqrrrabbxyyyypABBzz + 0: aaabcxyzpqrrrabbxyyyypABBzz + >>>aaabxyzpqrrrabbxyyyypqAzz + 0: aaabxyzpqrrrabbxyyyypqAzz + >aaaabxyzpqrrrabbxyyyypqAzz + 0: aaaabxyzpqrrrabbxyyyypqAzz + >>>>abcxyzpqrrrabbxyyyypqAzz + 0: abcxyzpqrrrabbxyyyypqAzz + *** Failers +No match + abxyzpqrrabbxyyyypqAzz +No match + abxyzpqrrrrabbxyyyypqAzz +No match + abxyzpqrrrabxyyyypqAzz +No match + aaaabcxyzzzzpqrrrabbbxyyyyyypqAzz +No match + aaaabcxyzzzzpqrrrabbbxyyypqAzz +No match + aaabcxyzpqrrrabbxyyyypqqqqqqqAzz +No match + +/^(abc){1,2}zz/ + abczz + 0: abczz + 1: abc + abcabczz + 0: abcabczz + 1: abc + *** Failers +No match + zz +No match + abcabcabczz +No match + >>abczz +No match + +/^(b+?|a){1,2}?c/ + bc + 0: bc + 1: b + bbc + 0: bbc + 1: b + bbbc + 0: bbbc + 1: bb + bac + 0: bac + 1: a + bbac + 0: bbac + 1: a + aac + 0: aac + 1: a + abbbbbbbbbbbc + 0: abbbbbbbbbbbc + 1: bbbbbbbbbbb + bbbbbbbbbbbac + 0: bbbbbbbbbbbac + 1: a + *** Failers +No match + aaac +No match + abbbbbbbbbbbac +No match + +/^(b+|a){1,2}c/ + bc + 0: bc + 1: b + bbc + 0: bbc + 1: bb + bbbc + 0: bbbc + 1: bbb + bac + 0: bac + 1: a + bbac + 0: bbac + 1: a + aac + 0: aac + 1: a + abbbbbbbbbbbc + 0: abbbbbbbbbbbc + 1: bbbbbbbbbbb + bbbbbbbbbbbac + 0: bbbbbbbbbbbac + 1: a + *** Failers +No match + aaac +No match + abbbbbbbbbbbac +No match + +/^(b+|a){1,2}?bc/ + bbc + 0: bbc + 1: b + +/^(b*|ba){1,2}?bc/ + babc + 0: babc + 1: ba + bbabc + 0: bbabc + 1: ba + bababc + 0: bababc + 1: ba + *** Failers +No match + bababbc +No match + babababc +No match + +/^(ba|b*){1,2}?bc/ + babc + 0: babc + 1: ba + bbabc + 0: bbabc + 1: ba + bababc + 0: bababc + 1: ba + *** Failers +No match + bababbc +No match + babababc +No match + +/^\ca\cA\c[\c{\c:/ + \x01\x01\e;z + 0: \x01\x01\x1b;z + +/^[ab\]cde]/ + athing + 0: a + bthing + 0: b + ]thing + 0: ] + cthing + 0: c + dthing + 0: d + ething + 0: e + *** Failers +No match + fthing +No match + [thing +No match + \\thing +No match + +/^[]cde]/ + ]thing + 0: ] + cthing + 0: c + dthing + 0: d + ething + 0: e + *** Failers +No match + athing +No match + fthing +No match + +/^[^ab\]cde]/ + fthing + 0: f + [thing + 0: [ + \\thing + 0: \ + *** Failers + 0: * + athing +No match + bthing +No match + ]thing +No match + cthing +No match + dthing +No match + ething +No match + +/^[^]cde]/ + athing + 0: a + fthing + 0: f + *** Failers + 0: * + ]thing +No match + cthing +No match + dthing +No match + ething +No match + +/^\/ +  + 0: \x81 + +/^ÿ/ + ÿ + 0: \xff + +/^[0-9]+$/ + 0 + 0: 0 + 1 + 0: 1 + 2 + 0: 2 + 3 + 0: 3 + 4 + 0: 4 + 5 + 0: 5 + 6 + 0: 6 + 7 + 0: 7 + 8 + 0: 8 + 9 + 0: 9 + 10 + 0: 10 + 100 + 0: 100 + *** Failers +No match + abc +No match + +/^.*nter/ + enter + 0: enter + inter + 0: inter + uponter + 0: uponter + +/^xxx[0-9]+$/ + xxx0 + 0: xxx0 + xxx1234 + 0: xxx1234 + *** Failers +No match + xxx +No match + +/^.+[0-9][0-9][0-9]$/ + x123 + 0: x123 + xx123 + 0: xx123 + 123456 + 0: 123456 + *** Failers +No match + 123 +No match + x1234 + 0: x1234 + +/^.+?[0-9][0-9][0-9]$/ + x123 + 0: x123 + xx123 + 0: xx123 + 123456 + 0: 123456 + *** Failers +No match + 123 +No match + x1234 + 0: x1234 + +/^([^!]+)!(.+)=apquxz\.ixr\.zzz\.ac\.uk$/ + abc!pqr=apquxz.ixr.zzz.ac.uk + 0: abc!pqr=apquxz.ixr.zzz.ac.uk + 1: abc + 2: pqr + *** Failers +No match + !pqr=apquxz.ixr.zzz.ac.uk +No match + abc!=apquxz.ixr.zzz.ac.uk +No match + abc!pqr=apquxz:ixr.zzz.ac.uk +No match + abc!pqr=apquxz.ixr.zzz.ac.ukk +No match + +/:/ + Well, we need a colon: somewhere + 0: : + *** Fail if we don't +No match + +/([\da-f:]+)$/i + 0abc + 0: 0abc + 1: 0abc + abc + 0: abc + 1: abc + fed + 0: fed + 1: fed + E + 0: E + 1: E + :: + 0: :: + 1: :: + 5f03:12C0::932e + 0: 5f03:12C0::932e + 1: 5f03:12C0::932e + fed def + 0: def + 1: def + Any old stuff + 0: ff + 1: ff + *** Failers +No match + 0zzz +No match + gzzz +No match + fed\x20 +No match + Any old rubbish +No match + +/^.*\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/ + .1.2.3 + 0: .1.2.3 + 1: 1 + 2: 2 + 3: 3 + A.12.123.0 + 0: A.12.123.0 + 1: 12 + 2: 123 + 3: 0 + *** Failers +No match + .1.2.3333 +No match + 1.2.3 +No match + 1234.2.3 +No match + +/^(\d+)\s+IN\s+SOA\s+(\S+)\s+(\S+)\s*\(\s*$/ + 1 IN SOA non-sp1 non-sp2( + 0: 1 IN SOA non-sp1 non-sp2( + 1: 1 + 2: non-sp1 + 3: non-sp2 + 1 IN SOA non-sp1 non-sp2 ( + 0: 1 IN SOA non-sp1 non-sp2 ( + 1: 1 + 2: non-sp1 + 3: non-sp2 + *** Failers +No match + 1IN SOA non-sp1 non-sp2( +No match + +/^[a-zA-Z\d][a-zA-Z\d\-]*(\.[a-zA-Z\d][a-zA-z\d\-]*)*\.$/ + a. + 0: a. + Z. + 0: Z. + 2. + 0: 2. + ab-c.pq-r. + 0: ab-c.pq-r. + 1: .pq-r + sxk.zzz.ac.uk. + 0: sxk.zzz.ac.uk. + 1: .uk + x-.y-. + 0: x-.y-. + 1: .y- + *** Failers +No match + -abc.peq. +No match + +/^\*\.[a-z]([a-z\-\d]*[a-z\d]+)?(\.[a-z]([a-z\-\d]*[a-z\d]+)?)*$/ + *.a + 0: *.a + *.b0-a + 0: *.b0-a + 1: 0-a + *.c3-b.c + 0: *.c3-b.c + 1: 3-b + 2: .c + *.c-a.b-c + 0: *.c-a.b-c + 1: -a + 2: .b-c + 3: -c + *** Failers +No match + *.0 +No match + *.a- +No match + *.a-b.c- +No match + *.c-a.0-c +No match + +/^(?=ab(de))(abd)(e)/ + abde + 0: abde + 1: de + 2: abd + 3: e + +/^(?!(ab)de|x)(abd)(f)/ + abdf + 0: abdf + 1: + 2: abd + 3: f + +/^(?=(ab(cd)))(ab)/ + abcd + 0: ab + 1: abcd + 2: cd + 3: ab + +/^[\da-f](\.[\da-f])*$/i + a.b.c.d + 0: a.b.c.d + 1: .d + A.B.C.D + 0: A.B.C.D + 1: .D + a.b.c.1.2.3.C + 0: a.b.c.1.2.3.C + 1: .C + +/^\".*\"\s*(;.*)?$/ + \"1234\" + 0: "1234" + \"abcd\" ; + 0: "abcd" ; + 1: ; + \"\" ; rhubarb + 0: "" ; rhubarb + 1: ; rhubarb + *** Failers +No match + \"1234\" : things +No match + +/^$/ + \ + 0: + *** Failers +No match + +/ ^ a (?# begins with a) b\sc (?# then b c) $ (?# then end)/x + ab c + 0: ab c + *** Failers +No match + abc +No match + ab cde +No match + +/(?x) ^ a (?# begins with a) b\sc (?# then b c) $ (?# then end)/ + ab c + 0: ab c + *** Failers +No match + abc +No match + ab cde +No match + +/^ a\ b[c ]d $/x + a bcd + 0: a bcd + a b d + 0: a b d + *** Failers +No match + abcd +No match + ab d +No match + +/^(a(b(c)))(d(e(f)))(h(i(j)))(k(l(m)))$/ + abcdefhijklm + 0: abcdefhijklm + 1: abc + 2: bc + 3: c + 4: def + 5: ef + 6: f + 7: hij + 8: ij + 9: j +10: klm +11: lm +12: m + +/^(?:a(b(c)))(?:d(e(f)))(?:h(i(j)))(?:k(l(m)))$/ + abcdefhijklm + 0: abcdefhijklm + 1: bc + 2: c + 3: ef + 4: f + 5: ij + 6: j + 7: lm + 8: m + +/^[\w][\W][\s][\S][\d][\D][\b][\n][\c]][\022]/ + a+ Z0+\x08\n\x1d\x12 + 0: a+ Z0+\x08\x0a\x1d\x12 + +/^[.^$|()*+?{,}]+/ + .^\$(*+)|{?,?} + 0: .^$(*+)|{?,?} + +/^a*\w/ + z + 0: z + az + 0: az + aaaz + 0: aaaz + a + 0: a + aa + 0: aa + aaaa + 0: aaaa + a+ + 0: a + aa+ + 0: aa + +/^a*?\w/ + z + 0: z + az + 0: a + aaaz + 0: a + a + 0: a + aa + 0: a + aaaa + 0: a + a+ + 0: a + aa+ + 0: a + +/^a+\w/ + az + 0: az + aaaz + 0: aaaz + aa + 0: aa + aaaa + 0: aaaa + aa+ + 0: aa + +/^a+?\w/ + az + 0: az + aaaz + 0: aa + aa + 0: aa + aaaa + 0: aa + aa+ + 0: aa + +/^\d{8}\w{2,}/ + 1234567890 + 0: 1234567890 + 12345678ab + 0: 12345678ab + 12345678__ + 0: 12345678__ + *** Failers +No match + 1234567 +No match + +/^[aeiou\d]{4,5}$/ + uoie + 0: uoie + 1234 + 0: 1234 + 12345 + 0: 12345 + aaaaa + 0: aaaaa + *** Failers +No match + 123456 +No match + +/^[aeiou\d]{4,5}?/ + uoie + 0: uoie + 1234 + 0: 1234 + 12345 + 0: 1234 + aaaaa + 0: aaaa + 123456 + 0: 1234 + +/\A(abc|def)=(\1){2,3}\Z/ + abc=abcabc + 0: abc=abcabc + 1: abc + 2: abc + def=defdefdef + 0: def=defdefdef + 1: def + 2: def + *** Failers +No match + abc=defdef +No match + +/^(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\11*(\3\4)\1(?#)2$/ + abcdefghijkcda2 + 0: abcdefghijkcda2 + 1: a + 2: b + 3: c + 4: d + 5: e + 6: f + 7: g + 8: h + 9: i +10: j +11: k +12: cd + abcdefghijkkkkcda2 + 0: abcdefghijkkkkcda2 + 1: a + 2: b + 3: c + 4: d + 5: e + 6: f + 7: g + 8: h + 9: i +10: j +11: k +12: cd + +/(cat(a(ract|tonic)|erpillar)) \1()2(3)/ + cataract cataract23 + 0: cataract cataract23 + 1: cataract + 2: aract + 3: ract + 4: + 5: 3 + catatonic catatonic23 + 0: catatonic catatonic23 + 1: catatonic + 2: atonic + 3: tonic + 4: + 5: 3 + caterpillar caterpillar23 + 0: caterpillar caterpillar23 + 1: caterpillar + 2: erpillar + 3: + 4: + 5: 3 + + +/^From +([^ ]+) +[a-zA-Z][a-zA-Z][a-zA-Z] +[a-zA-Z][a-zA-Z][a-zA-Z] +[0-9]?[0-9] +[0-9][0-9]:[0-9][0-9]/ + From abcd Mon Sep 01 12:33:02 1997 + 0: From abcd Mon Sep 01 12:33 + 1: abcd + +/^From\s+\S+\s+([a-zA-Z]{3}\s+){2}\d{1,2}\s+\d\d:\d\d/ + From abcd Mon Sep 01 12:33:02 1997 + 0: From abcd Mon Sep 01 12:33 + 1: Sep + From abcd Mon Sep 1 12:33:02 1997 + 0: From abcd Mon Sep 1 12:33 + 1: Sep + *** Failers +No match + From abcd Sep 01 12:33:02 1997 +No match + +/^12.34/s + 12\n34 + 0: 12\x0a34 + 12\r34 + 0: 12\x0d34 + +/\w+(?=\t)/ + the quick brown\t fox + 0: brown + +/foo(?!bar)(.*)/ + foobar is foolish see? + 0: foolish see? + 1: lish see? + +/(?:(?!foo)...|^.{0,2})bar(.*)/ + foobar crowbar etc + 0: rowbar etc + 1: etc + barrel + 0: barrel + 1: rel + 2barrel + 0: 2barrel + 1: rel + A barrel + 0: A barrel + 1: rel + +/^(\D*)(?=\d)(?!123)/ + abc456 + 0: abc + 1: abc + *** Failers +No match + abc123 +No match + +/^1234(?# test newlines + inside)/ + 1234 + 0: 1234 + +/^1234 #comment in extended re + /x + 1234 + 0: 1234 + +/#rhubarb + abcd/x + abcd + 0: abcd + +/^abcd#rhubarb/x + abcd + 0: abcd + +/^(a)\1{2,3}(.)/ + aaab + 0: aaab + 1: a + 2: b + aaaab + 0: aaaab + 1: a + 2: b + aaaaab + 0: aaaaa + 1: a + 2: a + aaaaaab + 0: aaaaa + 1: a + 2: a + +/(?!^)abc/ + the abc + 0: abc + *** Failers +No match + abc +No match + +/(?=^)abc/ + abc + 0: abc + *** Failers +No match + the abc +No match + +/^[ab]{1,3}(ab*|b)/ + aabbbbb + 0: aabb + 1: b + +/^[ab]{1,3}?(ab*|b)/ + aabbbbb + 0: aabbbbb + 1: abbbbb + +/^[ab]{1,3}?(ab*?|b)/ + aabbbbb + 0: aa + 1: a + +/^[ab]{1,3}(ab*?|b)/ + aabbbbb + 0: aabb + 1: b + +/ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* # optional leading comment +(?: (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) # initial word +(?: (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) )* # further okay, if led by a period +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] | # atom and space parts, or... +\( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) | # comments, or... + +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +# quoted strings +)* +< (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* # leading < +(?: @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* + +(?: (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* , (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* )? # optional route +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) # initial word +(?: (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) )* # further okay, if led by a period +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* +# address spec +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* > # trailing > +# name and address +) (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* # optional trailing comment +/x + Alan Other + 0: Alan Other + + 0: user@dom.ain + user\@dom.ain + 0: user@dom.ain + \"A. Other\" (a comment) + 0: "A. Other" (a comment) + A. Other (a comment) + 0: Other (a comment) + \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"\@x400-re.lay + 0: "/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/"@x400-re.lay + A missing angle @,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +" # " +[^\\\x80-\xff\n\015"] * # normal +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* +" # " +# Quoted string +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +\. +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +" # " +[^\\\x80-\xff\n\015"] * # normal +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* +" # " +# Quoted string +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\. +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address +| # or +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +" # " +[^\\\x80-\xff\n\015"] * # normal +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* +" # " +# Quoted string +) +# leading word +[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] * # "normal" atoms and or spaces +(?: +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +| +" # " +[^\\\x80-\xff\n\015"] * # normal +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* +" # " +) # "special" comment or quoted string +[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] * # more "normal" +)* +< +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# < +(?: +@ +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\. +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +(?: , +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +@ +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\. +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +)* # additional domains +: +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)? # optional route +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +" # " +[^\\\x80-\xff\n\015"] * # normal +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* +" # " +# Quoted string +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +\. +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +" # " +[^\\\x80-\xff\n\015"] * # normal +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* +" # " +# Quoted string +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\. +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address spec +> # > +# name and address +) +/x + Alan Other + 0: Alan Other + + 0: user@dom.ain + user\@dom.ain + 0: user@dom.ain + \"A. Other\" (a comment) + 0: "A. Other" + A. Other (a comment) + 0: Other + \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"\@x400-re.lay + 0: "/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/"@x400-re.lay + A missing angle ?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xdf\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff + +/P[^*]TAIRE[^*]{1,6}?LL/ + xxxxxxxxxxxPSTAIREISLLxxxxxxxxx + 0: PSTAIREISLL + +/P[^*]TAIRE[^*]{1,}?LL/ + xxxxxxxxxxxPSTAIREISLLxxxxxxxxx + 0: PSTAIREISLL + +/(\.\d\d[1-9]?)\d+/ + 1.230003938 + 0: .230003938 + 1: .23 + 1.875000282 + 0: .875000282 + 1: .875 + 1.235 + 0: .235 + 1: .23 + +/(\.\d\d((?=0)|\d(?=\d)))/ + 1.230003938 + 0: .23 + 1: .23 + 2: + 1.875000282 + 0: .875 + 1: .875 + 2: 5 + *** Failers +No match + 1.235 +No match + +/a(?)b/ + ab + 0: ab + +/\b(foo)\s+(\w+)/i + Food is on the foo table + 0: foo table + 1: foo + 2: table + +/foo(.*)bar/ + The food is under the bar in the barn. + 0: food is under the bar in the bar + 1: d is under the bar in the + +/foo(.*?)bar/ + The food is under the bar in the barn. + 0: food is under the bar + 1: d is under the + +/(.*)(\d*)/ + I have 2 numbers: 53147 + 0: I have 2 numbers: 53147 + 1: I have 2 numbers: 53147 + 2: + +/(.*)(\d+)/ + I have 2 numbers: 53147 + 0: I have 2 numbers: 53147 + 1: I have 2 numbers: 5314 + 2: 7 + +/(.*?)(\d*)/ + I have 2 numbers: 53147 + 0: + 1: + 2: + +/(.*?)(\d+)/ + I have 2 numbers: 53147 + 0: I have 2 + 1: I have + 2: 2 + +/(.*)(\d+)$/ + I have 2 numbers: 53147 + 0: I have 2 numbers: 53147 + 1: I have 2 numbers: 5314 + 2: 7 + +/(.*?)(\d+)$/ + I have 2 numbers: 53147 + 0: I have 2 numbers: 53147 + 1: I have 2 numbers: + 2: 53147 + +/(.*)\b(\d+)$/ + I have 2 numbers: 53147 + 0: I have 2 numbers: 53147 + 1: I have 2 numbers: + 2: 53147 + +/(.*\D)(\d+)$/ + I have 2 numbers: 53147 + 0: I have 2 numbers: 53147 + 1: I have 2 numbers: + 2: 53147 + +/^\D*(?!123)/ + ABC123 + 0: AB + +/^(\D*)(?=\d)(?!123)/ + ABC445 + 0: ABC + 1: ABC + *** Failers +No match + ABC123 +No match + +/^[W-]46]/ + W46]789 + 0: W46] + -46]789 + 0: -46] + *** Failers +No match + Wall +No match + Zebra +No match + 42 +No match + [abcd] +No match + ]abcd[ +No match + +/^[W-\]46]/ + W46]789 + 0: W + Wall + 0: W + Zebra + 0: Z + Xylophone + 0: X + 42 + 0: 4 + [abcd] + 0: [ + ]abcd[ + 0: ] + \\backslash + 0: \ + *** Failers +No match + -46]789 +No match + well +No match + +/\d\d\/\d\d\/\d\d\d\d/ + 01/01/2000 + 0: 01/01/2000 + +/word (?:[a-zA-Z0-9]+ ){0,10}otherword/ + word cat dog elephant mussel cow horse canary baboon snake shark otherword + 0: word cat dog elephant mussel cow horse canary baboon snake shark otherword + word cat dog elephant mussel cow horse canary baboon snake shark +No match + +/word (?:[a-zA-Z0-9]+ ){0,300}otherword/ + word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope +No match + +/^(a){0,0}/ + bcd + 0: + abc + 0: + aab + 0: + +/^(a){0,1}/ + bcd + 0: + abc + 0: a + 1: a + aab + 0: a + 1: a + +/^(a){0,2}/ + bcd + 0: + abc + 0: a + 1: a + aab + 0: aa + 1: a + +/^(a){0,3}/ + bcd + 0: + abc + 0: a + 1: a + aab + 0: aa + 1: a + aaa + 0: aaa + 1: a + +/^(a){0,}/ + bcd + 0: + abc + 0: a + 1: a + aab + 0: aa + 1: a + aaa + 0: aaa + 1: a + aaaaaaaa + 0: aaaaaaaa + 1: a + +/^(a){1,1}/ + bcd +No match + abc + 0: a + 1: a + aab + 0: a + 1: a + +/^(a){1,2}/ + bcd +No match + abc + 0: a + 1: a + aab + 0: aa + 1: a + +/^(a){1,3}/ + bcd +No match + abc + 0: a + 1: a + aab + 0: aa + 1: a + aaa + 0: aaa + 1: a + +/^(a){1,}/ + bcd +No match + abc + 0: a + 1: a + aab + 0: aa + 1: a + aaa + 0: aaa + 1: a + aaaaaaaa + 0: aaaaaaaa + 1: a + +/.*\.gif/ + borfle\nbib.gif\nno + 0: bib.gif + +/.{0,}\.gif/ + borfle\nbib.gif\nno + 0: bib.gif + +/.*\.gif/m + borfle\nbib.gif\nno + 0: bib.gif + +/.*\.gif/s + borfle\nbib.gif\nno + 0: borfle\x0abib.gif + +/.*\.gif/ms + borfle\nbib.gif\nno + 0: borfle\x0abib.gif + +/.*$/ + borfle\nbib.gif\nno + 0: no + +/.*$/m + borfle\nbib.gif\nno + 0: borfle + +/.*$/s + borfle\nbib.gif\nno + 0: borfle\x0abib.gif\x0ano + +/.*$/ms + borfle\nbib.gif\nno + 0: borfle\x0abib.gif\x0ano + +/.*$/ + borfle\nbib.gif\nno\n + 0: no + +/.*$/m + borfle\nbib.gif\nno\n + 0: borfle + +/.*$/s + borfle\nbib.gif\nno\n + 0: borfle\x0abib.gif\x0ano\x0a + +/.*$/ms + borfle\nbib.gif\nno\n + 0: borfle\x0abib.gif\x0ano\x0a + +/(.*X|^B)/ + abcde\n1234Xyz + 0: 1234X + 1: 1234X + BarFoo + 0: B + 1: B + *** Failers +No match + abcde\nBar +No match + +/(.*X|^B)/m + abcde\n1234Xyz + 0: 1234X + 1: 1234X + BarFoo + 0: B + 1: B + abcde\nBar + 0: B + 1: B + +/(.*X|^B)/s + abcde\n1234Xyz + 0: abcde\x0a1234X + 1: abcde\x0a1234X + BarFoo + 0: B + 1: B + *** Failers +No match + abcde\nBar +No match + +/(.*X|^B)/ms + abcde\n1234Xyz + 0: abcde\x0a1234X + 1: abcde\x0a1234X + BarFoo + 0: B + 1: B + abcde\nBar + 0: B + 1: B + +/(?s)(.*X|^B)/ + abcde\n1234Xyz + 0: abcde\x0a1234X + 1: abcde\x0a1234X + BarFoo + 0: B + 1: B + *** Failers +No match + abcde\nBar +No match + +/(?s:.*X|^B)/ + abcde\n1234Xyz + 0: abcde\x0a1234X + BarFoo + 0: B + *** Failers +No match + abcde\nBar +No match + +/^.*B/ + **** Failers +No match + abc\nB +No match + +/(?s)^.*B/ + abc\nB + 0: abc\x0aB + +/(?m)^.*B/ + abc\nB + 0: B + +/(?ms)^.*B/ + abc\nB + 0: abc\x0aB + +/(?ms)^B/ + abc\nB + 0: B + +/(?s)B$/ + B\n + 0: B + +/^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/ + 123456654321 + 0: 123456654321 + +/^\d\d\d\d\d\d\d\d\d\d\d\d/ + 123456654321 + 0: 123456654321 + +/^[\d][\d][\d][\d][\d][\d][\d][\d][\d][\d][\d][\d]/ + 123456654321 + 0: 123456654321 + +/^[abc]{12}/ + abcabcabcabc + 0: abcabcabcabc + +/^[a-c]{12}/ + abcabcabcabc + 0: abcabcabcabc + +/^(a|b|c){12}/ + abcabcabcabc + 0: abcabcabcabc + 1: c + +/^[abcdefghijklmnopqrstuvwxy0123456789]/ + n + 0: n + *** Failers +No match + z +No match + +/abcde{0,0}/ + abcd + 0: abcd + *** Failers +No match + abce +No match + +/ab[cd]{0,0}e/ + abe + 0: abe + *** Failers +No match + abcde +No match + +/ab(c){0,0}d/ + abd + 0: abd + *** Failers +No match + abcd +No match + +/a(b*)/ + a + 0: a + 1: + ab + 0: ab + 1: b + abbbb + 0: abbbb + 1: bbbb + *** Failers + 0: a + 1: + bbbbb +No match + +/ab\d{0}e/ + abe + 0: abe + *** Failers +No match + ab1e +No match + +/"([^\\"]+|\\.)*"/ + the \"quick\" brown fox + 0: "quick" + 1: quick + \"the \\\"quick\\\" brown fox\" + 0: "the \"quick\" brown fox" + 1: brown fox + +/.*?/g+ + abc + 0: + 0+ abc + 0: a + 0+ bc + 0: + 0+ bc + 0: b + 0+ c + 0: + 0+ c + 0: c + 0+ + 0: + 0+ + +/\b/g+ + abc + 0: + 0+ abc + 0: + 0+ + +/\b/+g + abc + 0: + 0+ abc + 0: + 0+ + +//g + abc + 0: + 0: + 0: + 0: + +/]{0,})>]{0,})>([\d]{0,}\.)(.*)((
    ([\w\W\s\d][^<>]{0,})|[\s]{0,}))<\/a><\/TD>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD><\/TR>/is +

    + 0: + 1: BGCOLOR='#DBE9E9' + 2: align=left valign=top + 3: 43. + 4: Word Processor
    (N-1286) + 5: + 6: + 7: + 8: align=left valign=top + 9: Lega lstaff.com +10: align=left valign=top +11: CA - Statewide + +/a[^a]b/ + acb + 0: acb + a\nb + 0: a\x0ab + +/a.b/ + acb + 0: acb + *** Failers +No match + a\nb +No match + +/a[^a]b/s + acb + 0: acb + a\nb + 0: a\x0ab + +/a.b/s + acb + 0: acb + a\nb + 0: a\x0ab + +/^(b+?|a){1,2}?c/ + bac + 0: bac + 1: a + bbac + 0: bbac + 1: a + bbbac + 0: bbbac + 1: a + bbbbac + 0: bbbbac + 1: a + bbbbbac + 0: bbbbbac + 1: a + +/^(b+|a){1,2}?c/ + bac + 0: bac + 1: a + bbac + 0: bbac + 1: a + bbbac + 0: bbbac + 1: a + bbbbac + 0: bbbbac + 1: a + bbbbbac + 0: bbbbbac + 1: a + +/(?!\A)x/m + x\nb\n +No match + a\bx\n + 0: x + +/\x0{ab}/ + \0{ab} + 0: \x00{ab} + +/(A|B)*?CD/ + CD + 0: CD + +/(A|B)*CD/ + CD + 0: CD + +/(AB)*?\1/ + ABABAB + 0: ABAB + 1: AB + +/(AB)*\1/ + ABABAB + 0: ABABAB + 1: AB + +/ End of testinput1 / + diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/testdata/testoutput2 b/rubbos/app/httpd-2.0.64/srclib/pcre/testdata/testoutput2 new file mode 100644 index 00000000..e8844d2a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/testdata/testoutput2 @@ -0,0 +1,2380 @@ +PCRE version 3.9 02-Jan-2002 + +/(a)b|/ +Capturing subpattern count = 1 +No options +No first char +No need char + +/abc/ +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'c' + abc + 0: abc + defabc + 0: abc + \Aabc + 0: abc + *** Failers +No match + \Adefabc +No match + ABC +No match + +/^abc/ +Capturing subpattern count = 0 +Options: anchored +No first char +Need char = 'c' + abc + 0: abc + \Aabc + 0: abc + *** Failers +No match + defabc +No match + \Adefabc +No match + +/a+bc/ +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'c' + +/a*bc/ +Capturing subpattern count = 0 +No options +No first char +Need char = 'c' + +/a{3}bc/ +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'c' + +/(abc|a+z)/ +Capturing subpattern count = 1 +No options +First char = 'a' +No need char + +/^abc$/ +Capturing subpattern count = 0 +Options: anchored +No first char +Need char = 'c' + abc + 0: abc + *** Failers +No match + def\nabc +No match + +/ab\gdef/X +Failed: unrecognized character follows \ at offset 3 + +/(?X)ab\gdef/X +Failed: unrecognized character follows \ at offset 7 + +/x{5,4}/ +Failed: numbers out of order in {} quantifier at offset 5 + +/z{65536}/ +Failed: number too big in {} quantifier at offset 7 + +/[abcd/ +Failed: missing terminating ] for character class at offset 5 + +/[\B]/ +Failed: invalid escape sequence in character class at offset 2 + +/[z-a]/ +Failed: range out of order in character class at offset 3 + +/^*/ +Failed: nothing to repeat at offset 1 + +/(abc/ +Failed: missing ) at offset 4 + +/(?# abc/ +Failed: missing ) after comment at offset 7 + +/(?z)abc/ +Failed: unrecognized character after (? at offset 2 + +/.*b/ +Capturing subpattern count = 0 +No options +First char at start or follows \n +Need char = 'b' + +/.*?b/ +Capturing subpattern count = 0 +No options +First char at start or follows \n +Need char = 'b' + +/cat|dog|elephant/ +Capturing subpattern count = 0 +No options +No first char +No need char + this sentence eventually mentions a cat + 0: cat + this sentences rambles on and on for a while and then reaches elephant + 0: elephant + +/cat|dog|elephant/S +Capturing subpattern count = 0 +No options +No first char +No need char +Starting character set: c d e + this sentence eventually mentions a cat + 0: cat + this sentences rambles on and on for a while and then reaches elephant + 0: elephant + +/cat|dog|elephant/iS +Capturing subpattern count = 0 +Options: caseless +No first char +No need char +Starting character set: C D E c d e + this sentence eventually mentions a CAT cat + 0: CAT + this sentences rambles on and on for a while to elephant ElePhant + 0: elephant + +/a|[bcd]/S +Capturing subpattern count = 0 +No options +No first char +No need char +Starting character set: a b c d + +/(a|[^\dZ])/S +Capturing subpattern count = 1 +No options +No first char +No need char +Starting character set: \x00 \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \x09 \x0a + \x0b \x0c \x0d \x0e \x0f \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 + \x1a \x1b \x1c \x1d \x1e \x1f \x20 ! " # $ % & ' ( ) * + , - . / : ; < = > + ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y [ \ ] ^ _ ` a b c d + e f g h i j k l m n o p q r s t u v w x y z { | } ~ \x7f \x80 \x81 \x82 \x83 + \x84 \x85 \x86 \x87 \x88 \x89 \x8a \x8b \x8c \x8d \x8e \x8f \x90 \x91 \x92 + \x93 \x94 \x95 \x96 \x97 \x98 \x99 \x9a \x9b \x9c \x9d \x9e \x9f \xa0 \xa1 + \xa2 \xa3 \xa4 \xa5 \xa6 \xa7 \xa8 \xa9 \xaa \xab \xac \xad \xae \xaf \xb0 + \xb1 \xb2 \xb3 \xb4 \xb5 \xb6 \xb7 \xb8 \xb9 \xba \xbb \xbc \xbd \xbe \xbf + \xc0 \xc1 \xc2 \xc3 \xc4 \xc5 \xc6 \xc7 \xc8 \xc9 \xca \xcb \xcc \xcd \xce + \xcf \xd0 \xd1 \xd2 \xd3 \xd4 \xd5 \xd6 \xd7 \xd8 \xd9 \xda \xdb \xdc \xdd + \xde \xdf \xe0 \xe1 \xe2 \xe3 \xe4 \xe5 \xe6 \xe7 \xe8 \xe9 \xea \xeb \xec + \xed \xee \xef \xf0 \xf1 \xf2 \xf3 \xf4 \xf5 \xf6 \xf7 \xf8 \xf9 \xfa \xfb + \xfc \xfd \xfe \xff + +/(a|b)*[\s]/S +Capturing subpattern count = 1 +No options +No first char +No need char +Starting character set: \x09 \x0a \x0b \x0c \x0d \x20 a b + +/(ab\2)/ +Failed: back reference to non-existent subpattern at offset 6 + +/{4,5}abc/ +Failed: nothing to repeat at offset 4 + +/(a)(b)(c)\2/ +Capturing subpattern count = 3 +Max back reference = 2 +No options +First char = 'a' +Need char = 'c' + abcb + 0: abcb + 1: a + 2: b + 3: c + \O0abcb +Matched, but too many substrings + \O3abcb +Matched, but too many substrings + 0: abcb + \O6abcb +Matched, but too many substrings + 0: abcb + 1: a + \O9abcb +Matched, but too many substrings + 0: abcb + 1: a + 2: b + \O12abcb + 0: abcb + 1: a + 2: b + 3: c + +/(a)bc|(a)(b)\2/ +Capturing subpattern count = 3 +Max back reference = 2 +No options +First char = 'a' +No need char + abc + 0: abc + 1: a + \O0abc +Matched, but too many substrings + \O3abc +Matched, but too many substrings + 0: abc + \O6abc + 0: abc + 1: a + aba + 0: aba + 1: + 2: a + 3: b + \O0aba +Matched, but too many substrings + \O3aba +Matched, but too many substrings + 0: aba + \O6aba +Matched, but too many substrings + 0: aba + 1: + \O9aba +Matched, but too many substrings + 0: aba + 1: + 2: a + \O12aba + 0: aba + 1: + 2: a + 3: b + +/abc$/E +Capturing subpattern count = 0 +Options: dollar_endonly +First char = 'a' +Need char = 'c' + abc + 0: abc + *** Failers +No match + abc\n +No match + abc\ndef +No match + +/(a)(b)(c)(d)(e)\6/ +Failed: back reference to non-existent subpattern at offset 17 + +/the quick brown fox/ +Capturing subpattern count = 0 +No options +First char = 't' +Need char = 'x' + the quick brown fox + 0: the quick brown fox + this is a line with the quick brown fox + 0: the quick brown fox + +/the quick brown fox/A +Capturing subpattern count = 0 +Options: anchored +No first char +Need char = 'x' + the quick brown fox + 0: the quick brown fox + *** Failers +No match + this is a line with the quick brown fox +No match + +/ab(?z)cd/ +Failed: unrecognized character after (? at offset 4 + +/^abc|def/ +Capturing subpattern count = 0 +No options +No first char +No need char + abcdef + 0: abc + abcdef\B + 0: def + +/.*((abc)$|(def))/ +Capturing subpattern count = 3 +No options +First char at start or follows \n +No need char + defabc + 0: defabc + 1: abc + 2: abc + \Zdefabc + 0: def + 1: def + 2: + 3: def + +/abc/P + abc + 0: abc + *** Failers +No match: POSIX code 17: match failed + +/^abc|def/P + abcdef + 0: abc + abcdef\B + 0: def + +/.*((abc)$|(def))/P + defabc + 0: defabc + 1: abc + 2: abc + \Zdefabc + 0: def + 1: def + 3: def + +/the quick brown fox/P + the quick brown fox + 0: the quick brown fox + *** Failers +No match: POSIX code 17: match failed + The Quick Brown Fox +No match: POSIX code 17: match failed + +/the quick brown fox/Pi + the quick brown fox + 0: the quick brown fox + The Quick Brown Fox + 0: The Quick Brown Fox + +/abc.def/P + *** Failers +No match: POSIX code 17: match failed + abc\ndef +No match: POSIX code 17: match failed + +/abc$/P + abc + 0: abc + abc\n + 0: abc + +/(abc)\2/P +Failed: POSIX code 15: bad back reference at offset 7 + +/(abc\1)/P + abc +No match: POSIX code 17: match failed + +/)/ +Failed: unmatched parentheses at offset 0 + +/a[]b/ +Failed: missing terminating ] for character class at offset 4 + +/[^aeiou ]{3,}/ +Capturing subpattern count = 0 +No options +No first char +No need char + co-processors, and for + 0: -pr + +/<.*>/ +Capturing subpattern count = 0 +No options +First char = '<' +Need char = '>' + abcghinop + 0: ghi + +/<.*?>/ +Capturing subpattern count = 0 +No options +First char = '<' +Need char = '>' + abcghinop + 0: + +/<.*>/U +Capturing subpattern count = 0 +Options: ungreedy +First char = '<' +Need char = '>' + abcghinop + 0: + +/<.*>(?U)/ +Capturing subpattern count = 0 +Options: ungreedy +First char = '<' +Need char = '>' + abcghinop + 0: + +/<.*?>/U +Capturing subpattern count = 0 +Options: ungreedy +First char = '<' +Need char = '>' + abcghinop + 0: ghi + +/={3,}/U +Capturing subpattern count = 0 +Options: ungreedy +First char = '=' +Need char = '=' + abc========def + 0: === + +/(?U)={3,}?/ +Capturing subpattern count = 0 +Options: ungreedy +First char = '=' +Need char = '=' + abc========def + 0: ======== + +/(?^abc)/m +Capturing subpattern count = 0 +Options: multiline +First char at start or follows \n +Need char = 'c' + abc + 0: abc + def\nabc + 0: abc + *** Failers +No match + defabc +No match + +/(?<=ab(c+)d)ef/ +Failed: lookbehind assertion is not fixed length at offset 11 + +/(?<=ab(?<=c+)d)ef/ +Failed: lookbehind assertion is not fixed length at offset 12 + +/(?<=ab(c|de)f)g/ +Failed: lookbehind assertion is not fixed length at offset 13 + +/The next three are in testinput2 because they have variable length branches/ +Capturing subpattern count = 0 +No options +First char = 'T' +Need char = 's' + +/(?<=bullock|donkey)-cart/ +Capturing subpattern count = 0 +No options +First char = '-' +Need char = 't' + the bullock-cart + 0: -cart + a donkey-cart race + 0: -cart + *** Failers +No match + cart +No match + horse-and-cart +No match + +/(?<=ab(?i)x|y|z)/ +Capturing subpattern count = 0 +No options +Case state changes +No first char +No need char + +/(?>.*)(?<=(abcd)|(xyz))/ +Capturing subpattern count = 2 +No options +First char at start or follows \n +No need char + alphabetabcd + 0: alphabetabcd + 1: abcd + endingxyz + 0: endingxyz + 1: + 2: xyz + +/(?<=ab(?i)x(?-i)y|(?i)z|b)ZZ/ +Capturing subpattern count = 0 +No options +Case state changes +First char = 'Z' +Need char = 'Z' + abxyZZ + 0: ZZ + abXyZZ + 0: ZZ + ZZZ + 0: ZZ + zZZ + 0: ZZ + bZZ + 0: ZZ + BZZ + 0: ZZ + *** Failers +No match + ZZ +No match + abXYZZ +No match + zzz +No match + bzz +No match + +/(? + 3: f + 1G a (1) + 2G (0) + 3G f (1) +get substring 4 failed -7 + 0L adef + 1L a + 2L + 3L f + bcdef\G1\G2\G3\G4\L + 0: bcdef + 1: bc + 2: bc + 3: f + 1G bc (2) + 2G bc (2) + 3G f (1) +get substring 4 failed -7 + 0L bcdef + 1L bc + 2L bc + 3L f + adefghijk\C0 + 0: adef + 1: a + 2: + 3: f + 0C adef (4) + +/^abc\00def/ +Capturing subpattern count = 0 +Options: anchored +No first char +Need char = 'f' + abc\00def\L\C0 + 0: abc\x00def + 0C abc (7) + 0L abc + +/word ((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ +)((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ )((?:[a-zA-Z0-9]+ +)?)?)?)?)?)?)?)?)?otherword/M +Memory allocation (code space): 428 +Capturing subpattern count = 8 +No options +First char = 'w' +Need char = 'd' + +/.*X/D +------------------------------------------------------------------ + 0 8 Bra 0 + 3 Any* + 5 1 X + 8 8 Ket + 11 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +First char at start or follows \n +Need char = 'X' + +/.*X/Ds +------------------------------------------------------------------ + 0 8 Bra 0 + 3 Any* + 5 1 X + 8 8 Ket + 11 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored dotall +No first char +Need char = 'X' + +/(.*X|^B)/D +------------------------------------------------------------------ + 0 21 Bra 0 + 3 8 Bra 1 + 6 Any* + 8 1 X + 11 7 Alt + 14 ^ + 15 1 B + 18 15 Ket + 21 21 Ket + 24 End +------------------------------------------------------------------ +Capturing subpattern count = 1 +No options +First char at start or follows \n +No need char + +/(.*X|^B)/Ds +------------------------------------------------------------------ + 0 21 Bra 0 + 3 8 Bra 1 + 6 Any* + 8 1 X + 11 7 Alt + 14 ^ + 15 1 B + 18 15 Ket + 21 21 Ket + 24 End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Options: anchored dotall +No first char +No need char + +/(?s)(.*X|^B)/D +------------------------------------------------------------------ + 0 21 Bra 0 + 3 8 Bra 1 + 6 Any* + 8 1 X + 11 7 Alt + 14 ^ + 15 1 B + 18 15 Ket + 21 21 Ket + 24 End +------------------------------------------------------------------ +Capturing subpattern count = 1 +Options: anchored dotall +No first char +No need char + +/(?s:.*X|^B)/D +------------------------------------------------------------------ + 0 27 Bra 0 + 3 10 Bra 0 + 6 04 Opt + 8 Any* + 10 1 X + 13 9 Alt + 16 04 Opt + 18 ^ + 19 1 B + 22 19 Ket + 25 00 Opt + 27 27 Ket + 30 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +First char at start or follows \n +No need char + +/\Biss\B/+ +Capturing subpattern count = 0 +No options +First char = 'i' +Need char = 's' + Mississippi + 0: iss + 0+ issippi + +/\Biss\B/+P + Mississippi + 0: iss + 0+ issippi + +/iss/G+ +Capturing subpattern count = 0 +No options +First char = 'i' +Need char = 's' + Mississippi + 0: iss + 0+ issippi + 0: iss + 0+ ippi + +/\Biss\B/G+ +Capturing subpattern count = 0 +No options +First char = 'i' +Need char = 's' + Mississippi + 0: iss + 0+ issippi + +/\Biss\B/g+ +Capturing subpattern count = 0 +No options +First char = 'i' +Need char = 's' + Mississippi + 0: iss + 0+ issippi + 0: iss + 0+ ippi + *** Failers +No match + Mississippi\A +No match + +/(?<=[Ms])iss/g+ +Capturing subpattern count = 0 +No options +First char = 'i' +Need char = 's' + Mississippi + 0: iss + 0+ issippi + 0: iss + 0+ ippi + +/(?<=[Ms])iss/G+ +Capturing subpattern count = 0 +No options +First char = 'i' +Need char = 's' + Mississippi + 0: iss + 0+ issippi + +/^iss/g+ +Capturing subpattern count = 0 +Options: anchored +No first char +Need char = 's' + ississippi + 0: iss + 0+ issippi + +/.*iss/g+ +Capturing subpattern count = 0 +No options +First char at start or follows \n +Need char = 's' + abciss\nxyzisspqr + 0: abciss + 0+ \x0axyzisspqr + 0: xyziss + 0+ pqr + +/.i./+g +Capturing subpattern count = 0 +No options +No first char +Need char = 'i' + Mississippi + 0: Mis + 0+ sissippi + 0: sis + 0+ sippi + 0: sip + 0+ pi + Mississippi\A + 0: Mis + 0+ sissippi + 0: sis + 0+ sippi + 0: sip + 0+ pi + Missouri river + 0: Mis + 0+ souri river + 0: ri + 0+ river + 0: riv + 0+ er + Missouri river\A + 0: Mis + 0+ souri river + +/^.is/+g +Capturing subpattern count = 0 +Options: anchored +No first char +Need char = 's' + Mississippi + 0: Mis + 0+ sissippi + +/^ab\n/g+ +Capturing subpattern count = 0 +Options: anchored +No first char +Need char = 10 + ab\nab\ncd + 0: ab\x0a + 0+ ab\x0acd + +/^ab\n/mg+ +Capturing subpattern count = 0 +Options: multiline +First char at start or follows \n +Need char = 10 + ab\nab\ncd + 0: ab\x0a + 0+ ab\x0acd + 0: ab\x0a + 0+ cd + +/abc/ +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'c' + +/abc|bac/ +Capturing subpattern count = 0 +No options +No first char +Need char = 'c' + +/(abc|bac)/ +Capturing subpattern count = 1 +No options +No first char +Need char = 'c' + +/(abc|(c|dc))/ +Capturing subpattern count = 2 +No options +No first char +Need char = 'c' + +/(abc|(d|de)c)/ +Capturing subpattern count = 2 +No options +No first char +Need char = 'c' + +/a*/ +Capturing subpattern count = 0 +No options +No first char +No need char + +/a+/ +Capturing subpattern count = 0 +No options +First char = 'a' +No need char + +/(baa|a+)/ +Capturing subpattern count = 1 +No options +No first char +Need char = 'a' + +/a{0,3}/ +Capturing subpattern count = 0 +No options +No first char +No need char + +/baa{3,}/ +Capturing subpattern count = 0 +No options +First char = 'b' +Need char = 'a' + +/"([^\\"]+|\\.)*"/ +Capturing subpattern count = 1 +No options +First char = '"' +Need char = '"' + +/(abc|ab[cd])/ +Capturing subpattern count = 1 +No options +First char = 'a' +No need char + +/(a|.)/ +Capturing subpattern count = 1 +No options +No first char +No need char + +/a|ba|\w/ +Capturing subpattern count = 0 +No options +No first char +No need char + +/abc(?=pqr)/ +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'r' + +/...(?<=abc)/ +Capturing subpattern count = 0 +No options +No first char +No need char + +/abc(?!pqr)/ +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'c' + +/ab./ +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'b' + +/ab[xyz]/ +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'b' + +/abc*/ +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'b' + +/ab.c*/ +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'b' + +/a.c*/ +Capturing subpattern count = 0 +No options +First char = 'a' +No need char + +/.c*/ +Capturing subpattern count = 0 +No options +No first char +No need char + +/ac*/ +Capturing subpattern count = 0 +No options +First char = 'a' +No need char + +/(a.c*|b.c*)/ +Capturing subpattern count = 1 +No options +No first char +No need char + +/a.c*|aba/ +Capturing subpattern count = 0 +No options +First char = 'a' +No need char + +/.+a/ +Capturing subpattern count = 0 +No options +No first char +Need char = 'a' + +/(?=abcda)a.*/ +Capturing subpattern count = 0 +No options +First char = 'a' +No need char + +/(?=a)a.*/ +Capturing subpattern count = 0 +No options +First char = 'a' +No need char + +/a(b)*/ +Capturing subpattern count = 1 +No options +First char = 'a' +No need char + +/a\d*/ +Capturing subpattern count = 0 +No options +First char = 'a' +No need char + +/ab\d*/ +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'b' + +/a(\d)*/ +Capturing subpattern count = 1 +No options +First char = 'a' +No need char + +/abcde{0,0}/ +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'd' + +/ab\d+/ +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'b' + +/a(?(1)b)/ +Capturing subpattern count = 0 +No options +First char = 'a' +No need char + +/a(?(1)bag|big)/ +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'g' + +/a(?(1)bag|big)*/ +Capturing subpattern count = 0 +No options +First char = 'a' +No need char + +/a(?(1)bag|big)+/ +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'g' + +/a(?(1)b..|b..)/ +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'b' + +/ab\d{0}e/ +Capturing subpattern count = 0 +No options +First char = 'a' +Need char = 'e' + +/a?b?/ +Capturing subpattern count = 0 +No options +No first char +No need char + a + 0: a + b + 0: b + ab + 0: ab + \ + 0: + *** Failers + 0: + \N +No match + +/|-/ +Capturing subpattern count = 0 +No options +No first char +No need char + abcd + 0: + -abc + 0: + \Nab-c + 0: - + *** Failers + 0: + \Nabc +No match + +/a*(b+)(z)(z)/P + aaaabbbbzzzz + 0: aaaabbbbzz + 1: bbbb + 2: z + 3: z + aaaabbbbzzzz\O0 + aaaabbbbzzzz\O1 + 0: aaaabbbbzz + aaaabbbbzzzz\O2 + 0: aaaabbbbzz + 1: bbbb + aaaabbbbzzzz\O3 + 0: aaaabbbbzz + 1: bbbb + 2: z + aaaabbbbzzzz\O4 + 0: aaaabbbbzz + 1: bbbb + 2: z + 3: z + aaaabbbbzzzz\O5 + 0: aaaabbbbzz + 1: bbbb + 2: z + 3: z + +/^.?abcd/S +Capturing subpattern count = 0 +Options: anchored +No first char +Need char = 'd' +Study returned NULL + +/\( # ( at start + (?: # Non-capturing bracket + (?>[^()]+) # Either a sequence of non-brackets (no backtracking) + | # Or + (?R) # Recurse - i.e. nested bracketed string + )* # Zero or more contents + \) # Closing ) + /x +Capturing subpattern count = 0 +Options: extended +First char = '(' +Need char = ')' + (abcd) + 0: (abcd) + (abcd)xyz + 0: (abcd) + xyz(abcd) + 0: (abcd) + (ab(xy)cd)pqr + 0: (ab(xy)cd) + (ab(xycd)pqr + 0: (xycd) + () abc () + 0: () + 12(abcde(fsh)xyz(foo(bar))lmno)89 + 0: (abcde(fsh)xyz(foo(bar))lmno) + *** Failers +No match + abcd +No match + abcd) +No match + (abcd +No match + +/\( ( (?>[^()]+) | (?R) )* \) /xg +Capturing subpattern count = 1 +Options: extended +First char = '(' +Need char = ')' + (ab(xy)cd)pqr + 0: (ab(xy)cd) + 1: cd + 1(abcd)(x(y)z)pqr + 0: (abcd) + 1: abcd + 0: (x(y)z) + 1: z + +/\( (?: (?>[^()]+) | (?R) ) \) /x +Capturing subpattern count = 0 +Options: extended +First char = '(' +Need char = ')' + (abcd) + 0: (abcd) + (ab(xy)cd) + 0: (xy) + (a(b(c)d)e) + 0: (c) + ((ab)) + 0: ((ab)) + *** Failers +No match + () +No match + +/\( (?: (?>[^()]+) | (?R) )? \) /x +Capturing subpattern count = 0 +Options: extended +First char = '(' +Need char = ')' + () + 0: () + 12(abcde(fsh)xyz(foo(bar))lmno)89 + 0: (fsh) + +/\( ( (?>[^()]+) | (?R) )* \) /x +Capturing subpattern count = 1 +Options: extended +First char = '(' +Need char = ')' + (ab(xy)cd) + 0: (ab(xy)cd) + 1: cd + +/\( ( ( (?>[^()]+) | (?R) )* ) \) /x +Capturing subpattern count = 2 +Options: extended +First char = '(' +Need char = ')' + (ab(xy)cd) + 0: (ab(xy)cd) + 1: ab(xy)cd + 2: cd + +/\( (123)? ( ( (?>[^()]+) | (?R) )* ) \) /x +Capturing subpattern count = 3 +Options: extended +First char = '(' +Need char = ')' + (ab(xy)cd) + 0: (ab(xy)cd) + 1: + 2: ab(xy)cd + 3: cd + (123ab(xy)cd) + 0: (123ab(xy)cd) + 1: 123 + 2: ab(xy)cd + 3: cd + +/\( ( (123)? ( (?>[^()]+) | (?R) )* ) \) /x +Capturing subpattern count = 3 +Options: extended +First char = '(' +Need char = ')' + (ab(xy)cd) + 0: (ab(xy)cd) + 1: ab(xy)cd + 2: + 3: cd + (123ab(xy)cd) + 0: (123ab(xy)cd) + 1: 123ab(xy)cd + 2: 123 + 3: cd + +/\( (((((((((( ( (?>[^()]+) | (?R) )* )))))))))) \) /x +Capturing subpattern count = 11 +Options: extended +First char = '(' +Need char = ')' + (ab(xy)cd) + 0: (ab(xy)cd) + 1: ab(xy)cd + 2: ab(xy)cd + 3: ab(xy)cd + 4: ab(xy)cd + 5: ab(xy)cd + 6: ab(xy)cd + 7: ab(xy)cd + 8: ab(xy)cd + 9: ab(xy)cd +10: ab(xy)cd +11: cd + +/\( ( ( (?>[^()<>]+) | ((?>[^()]+)) | (?R) )* ) \) /x +Capturing subpattern count = 3 +Options: extended +First char = '(' +Need char = ')' + (abcd(xyz

    qrs)123) + 0: (abcd(xyz

    qrs)123) + 1: abcd(xyz

    qrs)123 + 2: 123 + 3:

    qrs + +/\( ( ( (?>[^()]+) | ((?R)) )* ) \) /x +Capturing subpattern count = 3 +Options: extended +First char = '(' +Need char = ')' + (ab(cd)ef) + 0: (ab(cd)ef) + 1: ab(cd)ef + 2: ef + 3: (cd) + (ab(cd(ef)gh)ij) + 0: (ab(cd(ef)gh)ij) + 1: ab(cd(ef)gh)ij + 2: ij + 3: (cd(ef)gh) + +/^[[:alnum:]]/D +------------------------------------------------------------------ + 0 37 Bra 0 + 3 ^ + 4 [0-9A-Za-z] + 37 37 Ket + 40 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/^[[:alpha:]]/D +------------------------------------------------------------------ + 0 37 Bra 0 + 3 ^ + 4 [A-Za-z] + 37 37 Ket + 40 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/^[[:ascii:]]/D +------------------------------------------------------------------ + 0 37 Bra 0 + 3 ^ + 4 [\x00-\x7f] + 37 37 Ket + 40 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/^[[:cntrl:]]/D +------------------------------------------------------------------ + 0 37 Bra 0 + 3 ^ + 4 [\x00-\x1f\x7f] + 37 37 Ket + 40 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/^[[:digit:]]/D +------------------------------------------------------------------ + 0 37 Bra 0 + 3 ^ + 4 [0-9] + 37 37 Ket + 40 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/^[[:graph:]]/D +------------------------------------------------------------------ + 0 37 Bra 0 + 3 ^ + 4 [!-~] + 37 37 Ket + 40 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/^[[:lower:]]/D +------------------------------------------------------------------ + 0 37 Bra 0 + 3 ^ + 4 [a-z] + 37 37 Ket + 40 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/^[[:print:]]/D +------------------------------------------------------------------ + 0 37 Bra 0 + 3 ^ + 4 [ -~] + 37 37 Ket + 40 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/^[[:punct:]]/D +------------------------------------------------------------------ + 0 37 Bra 0 + 3 ^ + 4 [!-/:-@[-`{-~] + 37 37 Ket + 40 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/^[[:space:]]/D +------------------------------------------------------------------ + 0 37 Bra 0 + 3 ^ + 4 [\x09-\x0d ] + 37 37 Ket + 40 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/^[[:upper:]]/D +------------------------------------------------------------------ + 0 37 Bra 0 + 3 ^ + 4 [A-Z] + 37 37 Ket + 40 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/^[[:xdigit:]]/D +------------------------------------------------------------------ + 0 37 Bra 0 + 3 ^ + 4 [0-9A-Fa-f] + 37 37 Ket + 40 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/^[[:word:]]/D +------------------------------------------------------------------ + 0 37 Bra 0 + 3 ^ + 4 [0-9A-Z_a-z] + 37 37 Ket + 40 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/^[[:^cntrl:]]/D +------------------------------------------------------------------ + 0 37 Bra 0 + 3 ^ + 4 [ -~\x80-\xff] + 37 37 Ket + 40 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/^[12[:^digit:]]/D +------------------------------------------------------------------ + 0 37 Bra 0 + 3 ^ + 4 [\x00-/1-2:-\xff] + 37 37 Ket + 40 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: anchored +No first char +No need char + +/[01[:alpha:]%]/D +------------------------------------------------------------------ + 0 36 Bra 0 + 3 [%0-1A-Za-z] + 36 36 Ket + 39 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +No options +No first char +No need char + +/[[.ch.]]/ +Failed: POSIX collating elements are not supported at offset 1 + +/[[=ch=]]/ +Failed: POSIX collating elements are not supported at offset 1 + +/[[:rhubarb:]]/ +Failed: unknown POSIX class name at offset 3 + +/[[:upper:]]/i +Capturing subpattern count = 0 +Options: caseless +No first char +No need char + A + 0: A + a + 0: a + +/[[:lower:]]/i +Capturing subpattern count = 0 +Options: caseless +No first char +No need char + A + 0: A + a + 0: a + +/((?-i)[[:lower:]])[[:lower:]]/i +Capturing subpattern count = 1 +Options: caseless +Case state changes +No first char +No need char + ab + 0: ab + 1: a + aB + 0: aB + 1: a + *** Failers + 0: ai + 1: a + Ab +No match + AB +No match + +/[\200-\410]/ +Failed: range out of order in character class at offset 9 + +/^(?(0)f|b)oo/ +Failed: invalid condition (?(0) at offset 5 + +/This one's here because of the large output vector needed/ +Capturing subpattern count = 0 +No options +First char = 'T' +Need char = 'd' + +/(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\d+(?:\s|$))(\w+)\s+(\270)/ +Capturing subpattern count = 271 +Max back reference = 270 +No options +No first char +No need char + \O900 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 ABC ABC + 0: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 ABC ABC + 1: 1 + 2: 2 + 3: 3 + 4: 4 + 5: 5 + 6: 6 + 7: 7 + 8: 8 + 9: 9 +10: 10 +11: 11 +12: 12 +13: 13 +14: 14 +15: 15 +16: 16 +17: 17 +18: 18 +19: 19 +20: 20 +21: 21 +22: 22 +23: 23 +24: 24 +25: 25 +26: 26 +27: 27 +28: 28 +29: 29 +30: 30 +31: 31 +32: 32 +33: 33 +34: 34 +35: 35 +36: 36 +37: 37 +38: 38 +39: 39 +40: 40 +41: 41 +42: 42 +43: 43 +44: 44 +45: 45 +46: 46 +47: 47 +48: 48 +49: 49 +50: 50 +51: 51 +52: 52 +53: 53 +54: 54 +55: 55 +56: 56 +57: 57 +58: 58 +59: 59 +60: 60 +61: 61 +62: 62 +63: 63 +64: 64 +65: 65 +66: 66 +67: 67 +68: 68 +69: 69 +70: 70 +71: 71 +72: 72 +73: 73 +74: 74 +75: 75 +76: 76 +77: 77 +78: 78 +79: 79 +80: 80 +81: 81 +82: 82 +83: 83 +84: 84 +85: 85 +86: 86 +87: 87 +88: 88 +89: 89 +90: 90 +91: 91 +92: 92 +93: 93 +94: 94 +95: 95 +96: 96 +97: 97 +98: 98 +99: 99 +100: 100 +101: 101 +102: 102 +103: 103 +104: 104 +105: 105 +106: 106 +107: 107 +108: 108 +109: 109 +110: 110 +111: 111 +112: 112 +113: 113 +114: 114 +115: 115 +116: 116 +117: 117 +118: 118 +119: 119 +120: 120 +121: 121 +122: 122 +123: 123 +124: 124 +125: 125 +126: 126 +127: 127 +128: 128 +129: 129 +130: 130 +131: 131 +132: 132 +133: 133 +134: 134 +135: 135 +136: 136 +137: 137 +138: 138 +139: 139 +140: 140 +141: 141 +142: 142 +143: 143 +144: 144 +145: 145 +146: 146 +147: 147 +148: 148 +149: 149 +150: 150 +151: 151 +152: 152 +153: 153 +154: 154 +155: 155 +156: 156 +157: 157 +158: 158 +159: 159 +160: 160 +161: 161 +162: 162 +163: 163 +164: 164 +165: 165 +166: 166 +167: 167 +168: 168 +169: 169 +170: 170 +171: 171 +172: 172 +173: 173 +174: 174 +175: 175 +176: 176 +177: 177 +178: 178 +179: 179 +180: 180 +181: 181 +182: 182 +183: 183 +184: 184 +185: 185 +186: 186 +187: 187 +188: 188 +189: 189 +190: 190 +191: 191 +192: 192 +193: 193 +194: 194 +195: 195 +196: 196 +197: 197 +198: 198 +199: 199 +200: 200 +201: 201 +202: 202 +203: 203 +204: 204 +205: 205 +206: 206 +207: 207 +208: 208 +209: 209 +210: 210 +211: 211 +212: 212 +213: 213 +214: 214 +215: 215 +216: 216 +217: 217 +218: 218 +219: 219 +220: 220 +221: 221 +222: 222 +223: 223 +224: 224 +225: 225 +226: 226 +227: 227 +228: 228 +229: 229 +230: 230 +231: 231 +232: 232 +233: 233 +234: 234 +235: 235 +236: 236 +237: 237 +238: 238 +239: 239 +240: 240 +241: 241 +242: 242 +243: 243 +244: 244 +245: 245 +246: 246 +247: 247 +248: 248 +249: 249 +250: 250 +251: 251 +252: 252 +253: 253 +254: 254 +255: 255 +256: 256 +257: 257 +258: 258 +259: 259 +260: 260 +261: 261 +262: 262 +263: 263 +264: 264 +265: 265 +266: 266 +267: 267 +268: 268 +269: 269 +270: ABC +271: ABC + +/This one's here because Perl does this differently and PCRE can't at present/ +Capturing subpattern count = 0 +No options +First char = 'T' +Need char = 't' + +/(main(O)?)+/ +Capturing subpattern count = 2 +No options +First char = 'm' +Need char = 'n' + mainmain + 0: mainmain + 1: main + mainOmain + 0: mainOmain + 1: main + 2: O + +/ End of testinput2 / +Capturing subpattern count = 0 +No options +First char = ' ' +Need char = ' ' + diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/testdata/testoutput3 b/rubbos/app/httpd-2.0.64/srclib/pcre/testdata/testoutput3 new file mode 100644 index 00000000..cbe9aaa7 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/testdata/testoutput3 @@ -0,0 +1,2991 @@ +PCRE version 3.9 02-Jan-2002 + +/(?.*/)foo" + /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/it/you/see/ +No match + +"(?>.*/)foo" + /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/and/foo + 0: /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/and/foo + +/(?>(\.\d\d[1-9]?))\d+/ + 1.230003938 + 0: .230003938 + 1: .23 + 1.875000282 + 0: .875000282 + 1: .875 + *** Failers +No match + 1.235 +No match + +/^((?>\w+)|(?>\s+))*$/ + now is the time for all good men to come to the aid of the party + 0: now is the time for all good men to come to the aid of the party + 1: party + *** Failers +No match + this is not a line with only words and spaces! +No match + +/(\d+)(\w)/ + 12345a + 0: 12345a + 1: 12345 + 2: a + 12345+ + 0: 12345 + 1: 1234 + 2: 5 + +/((?>\d+))(\w)/ + 12345a + 0: 12345a + 1: 12345 + 2: a + *** Failers +No match + 12345+ +No match + +/(?>a+)b/ + aaab + 0: aaab + +/((?>a+)b)/ + aaab + 0: aaab + 1: aaab + +/(?>(a+))b/ + aaab + 0: aaab + 1: aaa + +/(?>b)+/ + aaabbbccc + 0: bbb + +/(?>a+|b+|c+)*c/ + aaabbbbccccd + 0: aaabbbbc + +/((?>[^()]+)|\([^()]*\))+/ + ((abc(ade)ufh()()x + 0: abc(ade)ufh()()x + 1: x + +/\(((?>[^()]+)|\([^()]+\))+\)/ + (abc) + 0: (abc) + 1: abc + (abc(def)xyz) + 0: (abc(def)xyz) + 1: xyz + *** Failers +No match + ((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +No match + +/a(?-i)b/i + ab + 0: ab + *** Failers +No match + Ab +No match + aB +No match + AB +No match + +/(a (?x)b c)d e/ + a bcd e + 0: a bcd e + 1: a bc + *** Failers +No match + a b cd e +No match + abcd e +No match + a bcde +No match + +/(a b(?x)c d (?-x)e f)/ + a bcde f + 0: a bcde f + 1: a bcde f + *** Failers +No match + abcdef +No match + +/(a(?i)b)c/ + abc + 0: abc + 1: ab + aBc + 0: aBc + 1: aB + *** Failers +No match + abC +No match + aBC +No match + Abc +No match + ABc +No match + ABC +No match + AbC +No match + +/a(?i:b)c/ + abc + 0: abc + aBc + 0: aBc + *** Failers +No match + ABC +No match + abC +No match + aBC +No match + +/a(?i:b)*c/ + aBc + 0: aBc + aBBc + 0: aBBc + *** Failers +No match + aBC +No match + aBBC +No match + +/a(?=b(?i)c)\w\wd/ + abcd + 0: abcd + abCd + 0: abCd + *** Failers +No match + aBCd +No match + abcD +No match + +/(?s-i:more.*than).*million/i + more than million + 0: more than million + more than MILLION + 0: more than MILLION + more \n than Million + 0: more \x0a than Million + *** Failers +No match + MORE THAN MILLION +No match + more \n than \n million +No match + +/(?:(?s-i)more.*than).*million/i + more than million + 0: more than million + more than MILLION + 0: more than MILLION + more \n than Million + 0: more \x0a than Million + *** Failers +No match + MORE THAN MILLION +No match + more \n than \n million +No match + +/(?>a(?i)b+)+c/ + abc + 0: abc + aBbc + 0: aBbc + aBBc + 0: aBBc + *** Failers +No match + Abc +No match + abAb +No match + abbC +No match + +/(?=a(?i)b)\w\wc/ + abc + 0: abc + aBc + 0: aBc + *** Failers +No match + Ab +No match + abC +No match + aBC +No match + +/(?<=a(?i)b)(\w\w)c/ + abxxc + 0: xxc + 1: xx + aBxxc + 0: xxc + 1: xx + *** Failers +No match + Abxxc +No match + ABxxc +No match + abxxC +No match + +/(?:(a)|b)(?(1)A|B)/ + aA + 0: aA + 1: a + bB + 0: bB + *** Failers +No match + aB +No match + bA +No match + +/^(a)?(?(1)a|b)+$/ + aa + 0: aa + 1: a + b + 0: b + bb + 0: bb + *** Failers +No match + ab +No match + +/^(?(?=abc)\w{3}:|\d\d)$/ + abc: + 0: abc: + 12 + 0: 12 + *** Failers +No match + 123 +No match + xyz +No match + +/^(?(?!abc)\d\d|\w{3}:)$/ + abc: + 0: abc: + 12 + 0: 12 + *** Failers +No match + 123 +No match + xyz +No match + +/(?(?<=foo)bar|cat)/ + foobar + 0: bar + cat + 0: cat + fcat + 0: cat + focat + 0: cat + *** Failers +No match + foocat +No match + +/(?(?a*)*/ + a + 0: a + aa + 0: aa + aaaa + 0: aaaa + +/(abc|)+/ + abc + 0: abc + 1: + abcabc + 0: abcabc + 1: + abcabcabc + 0: abcabcabc + 1: + xyz + 0: + 1: + +/([a]*)*/ + a + 0: a + 1: + aaaaa + 0: aaaaa + 1: + +/([ab]*)*/ + a + 0: a + 1: + b + 0: b + 1: + ababab + 0: ababab + 1: + aaaabcde + 0: aaaab + 1: + bbbb + 0: bbbb + 1: + +/([^a]*)*/ + b + 0: b + 1: + bbbb + 0: bbbb + 1: + aaa + 0: + 1: + +/([^ab]*)*/ + cccc + 0: cccc + 1: + abab + 0: + 1: + +/([a]*?)*/ + a + 0: + 1: + aaaa + 0: + 1: + +/([ab]*?)*/ + a + 0: + 1: + b + 0: + 1: + abab + 0: + 1: + baba + 0: + 1: + +/([^a]*?)*/ + b + 0: + 1: + bbbb + 0: + 1: + aaa + 0: + 1: + +/([^ab]*?)*/ + c + 0: + 1: + cccc + 0: + 1: + baba + 0: + 1: + +/(?>a*)*/ + a + 0: a + aaabcde + 0: aaa + +/((?>a*))*/ + aaaaa + 0: aaaaa + 1: + aabbaa + 0: aa + 1: + +/((?>a*?))*/ + aaaaa + 0: + 1: + aabbaa + 0: + 1: + +/(?(?=[^a-z]+[a-z]) \d{2}-[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2} ) /x + 12-sep-98 + 0: 12-sep-98 + 12-09-98 + 0: 12-09-98 + *** Failers +No match + sep-12-98 +No match + +/(?<=(foo))bar\1/ + foobarfoo + 0: barfoo + 1: foo + foobarfootling + 0: barfoo + 1: foo + *** Failers +No match + foobar +No match + barfoo +No match + +/(?i:saturday|sunday)/ + saturday + 0: saturday + sunday + 0: sunday + Saturday + 0: Saturday + Sunday + 0: Sunday + SATURDAY + 0: SATURDAY + SUNDAY + 0: SUNDAY + SunDay + 0: SunDay + +/(a(?i)bc|BB)x/ + abcx + 0: abcx + 1: abc + aBCx + 0: aBCx + 1: aBC + bbx + 0: bbx + 1: bb + BBx + 0: BBx + 1: BB + *** Failers +No match + abcX +No match + aBCX +No match + bbX +No match + BBX +No match + +/^([ab](?i)[cd]|[ef])/ + ac + 0: ac + 1: ac + aC + 0: aC + 1: aC + bD + 0: bD + 1: bD + elephant + 0: e + 1: e + Europe + 0: E + 1: E + frog + 0: f + 1: f + France + 0: F + 1: F + *** Failers +No match + Africa +No match + +/^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/ + ab + 0: ab + 1: ab + aBd + 0: aBd + 1: aBd + xy + 0: xy + 1: xy + xY + 0: xY + 1: xY + zebra + 0: z + 1: z + Zambesi + 0: Z + 1: Z + *** Failers +No match + aCD +No match + XY +No match + +/(?<=foo\n)^bar/m + foo\nbar + 0: bar + *** Failers +No match + bar +No match + baz\nbar +No match + +/(?<=(?]&/ + <&OUT + 0: <& + +/^(a\1?){4}$/ + aaaaaaaaaa + 0: aaaaaaaaaa + 1: aaaa + *** Failers +No match + AB +No match + aaaaaaaaa +No match + aaaaaaaaaaa +No match + +/^(a(?(1)\1)){4}$/ + aaaaaaaaaa + 0: aaaaaaaaaa + 1: aaaa + *** Failers +No match + aaaaaaaaa +No match + aaaaaaaaaaa +No match + +/(?:(f)(o)(o)|(b)(a)(r))*/ + foobar + 0: foobar + 1: f + 2: o + 3: o + 4: b + 5: a + 6: r + +/(?<=a)b/ + ab + 0: b + *** Failers +No match + cb +No match + b +No match + +/(? + 2: abcd + xy:z:::abcd + 0: xy:z:::abcd + 1: xy:z::: + 2: abcd + +/^[^bcd]*(c+)/ + aexycd + 0: aexyc + 1: c + +/(a*)b+/ + caab + 0: aab + 1: aa + +/([\w:]+::)?(\w+)$/ + abcd + 0: abcd + 1: + 2: abcd + xy:z:::abcd + 0: xy:z:::abcd + 1: xy:z::: + 2: abcd + *** Failers + 0: Failers + 1: + 2: Failers + abcd: +No match + abcd: +No match + +/^[^bcd]*(c+)/ + aexycd + 0: aexyc + 1: c + +/(>a+)ab/ + +/(?>a+)b/ + aaab + 0: aaab + +/([[:]+)/ + a:[b]: + 0: :[ + 1: :[ + +/([[=]+)/ + a=[b]= + 0: =[ + 1: =[ + +/([[.]+)/ + a.[b]. + 0: .[ + 1: .[ + +/((?>a+)b)/ + aaab + 0: aaab + 1: aaab + +/(?>(a+))b/ + aaab + 0: aaab + 1: aaa + +/((?>[^()]+)|\([^()]*\))+/ + ((abc(ade)ufh()()x + 0: abc(ade)ufh()()x + 1: x + +/a\Z/ + *** Failers +No match + aaab +No match + a\nb\n +No match + +/b\Z/ + a\nb\n + 0: b + +/b\z/ + +/b\Z/ + a\nb + 0: b + +/b\z/ + a\nb + 0: b + *** Failers +No match + +/^(?>(?(1)\.|())[^\W_](?>[a-z0-9-]*[^\W_])?)+$/ + a + 0: a + 1: + abc + 0: abc + 1: + a-b + 0: a-b + 1: + 0-9 + 0: 0-9 + 1: + a.b + 0: a.b + 1: + 5.6.7 + 0: 5.6.7 + 1: + the.quick.brown.fox + 0: the.quick.brown.fox + 1: + a100.b200.300c + 0: a100.b200.300c + 1: + 12-ab.1245 + 0: 12-ab.1245 + 1: + ***Failers +No match + \ +No match + .a +No match + -a +No match + a- +No match + a. +No match + a_b +No match + a.- +No match + a.. +No match + ab..bc +No match + the.quick.brown.fox- +No match + the.quick.brown.fox. +No match + the.quick.brown.fox_ +No match + the.quick.brown.fox+ +No match + +/(?>.*)(?<=(abcd|wxyz))/ + alphabetabcd + 0: alphabetabcd + 1: abcd + endingwxyz + 0: endingwxyz + 1: wxyz + *** Failers +No match + a rather long string that doesn't end with one of them +No match + +/word (?>(?:(?!otherword)[a-zA-Z0-9]+ ){0,30})otherword/ + word cat dog elephant mussel cow horse canary baboon snake shark otherword + 0: word cat dog elephant mussel cow horse canary baboon snake shark otherword + word cat dog elephant mussel cow horse canary baboon snake shark +No match + +/word (?>[a-zA-Z0-9]+ ){0,30}otherword/ + word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope +No match + +/(?<=\d{3}(?!999))foo/ + 999foo + 0: foo + 123999foo + 0: foo + *** Failers +No match + 123abcfoo +No match + +/(?<=(?!...999)\d{3})foo/ + 999foo + 0: foo + 123999foo + 0: foo + *** Failers +No match + 123abcfoo +No match + +/(?<=\d{3}(?!999)...)foo/ + 123abcfoo + 0: foo + 123456foo + 0: foo + *** Failers +No match + 123999foo +No match + +/(?<=\d{3}...)(? + 2: + 3: abcd + + 2: + 3: abcd + \s*)=(?>\s*) # find + 2: + 3: abcd + Z)+|A)*/ + ZABCDEFG + 0: ZA + 1: A + +/((?>)+|A)*/ + ZABCDEFG + 0: + 1: + +/a*/g + abbab + 0: a + 0: + 0: + 0: a + 0: + 0: + +/^[a-\d]/ + abcde + 0: a + -things + 0: - + 0digit + 0: 0 + *** Failers +No match + bcdef +No match + +/^[\d-a]/ + abcde + 0: a + -things + 0: - + 0digit + 0: 0 + *** Failers +No match + bcdef +No match + +/ End of testinput3 / + diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/testdata/testoutput4 b/rubbos/app/httpd-2.0.64/srclib/pcre/testdata/testoutput4 new file mode 100644 index 00000000..df81a0f5 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/testdata/testoutput4 @@ -0,0 +1,116 @@ +PCRE version 3.9 02-Jan-2002 + +/^[\w]+/ + *** Failers +No match + École +No match + +/^[\w]+/Lfr + École + 0: École + +/^[\w]+/ + *** Failers +No match + École +No match + +/^[\W]+/ + École + 0: \xc9 + +/^[\W]+/Lfr + *** Failers + 0: *** + École +No match + +/[\b]/ + \b + 0: \x08 + *** Failers +No match + a +No match + +/[\b]/Lfr + \b + 0: \x08 + *** Failers +No match + a +No match + +/^\w+/ + *** Failers +No match + École +No match + +/^\w+/Lfr + École + 0: École + +/(.+)\b(.+)/ + École + 0: \xc9cole + 1: \xc9 + 2: cole + +/(.+)\b(.+)/Lfr + *** Failers + 0: *** Failers + 1: *** + 2: Failers + École +No match + +/École/i + École + 0: \xc9cole + *** Failers +No match + école +No match + +/École/iLfr + École + 0: École + école + 0: école + +/\w/IS +Capturing subpattern count = 0 +No options +No first char +No need char +Starting character set: 0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P + Q R S T U V W X Y Z _ a b c d e f g h i j k l m n o p q r s t u v w x y z + +/\w/ISLfr +Capturing subpattern count = 0 +No options +No first char +No need char +Starting character set: 0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P + Q R S T U V W X Y Z _ a b c d e f g h i j k l m n o p q r s t u v w x y z + À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ð Ñ Ò Ó Ô Õ Ö Ø Ù Ú Û Ü Ý Þ ß à á â ã ä å + æ ç è é ê ë ì í î ï ð ñ ò ó ô õ ö ø ù ú û ü ý þ ÿ + +/^[\xc8-\xc9]/iLfr + École + 0: É + école + 0: é + +/^[\xc8-\xc9]/Lfr + École + 0: É + *** Failers +No match + école +No match + +/ End of testinput4 / + diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/testdata/testoutput5 b/rubbos/app/httpd-2.0.64/srclib/pcre/testdata/testoutput5 new file mode 100644 index 00000000..6bb9ad31 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/testdata/testoutput5 @@ -0,0 +1,242 @@ +PCRE version 3.9 02-Jan-2002 + +/-- Because of problems with Perl 5.6 in handling UTF-8 vs non UTF-8 --/ +/-- strings automatically, do not use the \x{} construct except with --/ +No match +/-- patterns that have the /8 option set, and don't use them without! --/ +No match + +/a.b/8 + acb + 0: acb + a\x7fb + 0: a\x{7f}b + a\x{100}b + 0: a\x{100}b + *** Failers +No match + a\nb +No match + +/a(.{3})b/8 + a\x{4000}xyb + 0: a\x{4000}xyb + 1: \x{4000}xy + a\x{4000}\x7fyb + 0: a\x{4000}\x{7f}yb + 1: \x{4000}\x{7f}y + a\x{4000}\x{100}yb + 0: a\x{4000}\x{100}yb + 1: \x{4000}\x{100}y + *** Failers +No match + a\x{4000}b +No match + ac\ncb +No match + +/a(.*?)(.)/ + a\xc0\x88b + 0: a\xc0 + 1: + 2: \xc0 + +/a(.*?)(.)/8 + a\x{100}b + 0: a\x{100} + 1: + 2: \x{100} + +/a(.*)(.)/ + a\xc0\x88b + 0: a\xc0\x88b + 1: \xc0\x88 + 2: b + +/a(.*)(.)/8 + a\x{100}b + 0: a\x{100}b + 1: \x{100} + 2: b + +/a(.)(.)/ + a\xc0\x92bcd + 0: a\xc0\x92 + 1: \xc0 + 2: \x92 + +/a(.)(.)/8 + a\x{240}bcd + 0: a\x{240}b + 1: \x{240} + 2: b + +/a(.?)(.)/ + a\xc0\x92bcd + 0: a\xc0\x92 + 1: \xc0 + 2: \x92 + +/a(.?)(.)/8 + a\x{240}bcd + 0: a\x{240}b + 1: \x{240} + 2: b + +/a(.??)(.)/ + a\xc0\x92bcd + 0: a\xc0 + 1: + 2: \xc0 + +/a(.??)(.)/8 + a\x{240}bcd + 0: a\x{240} + 1: + 2: \x{240} + +/a(.{3})b/8 + a\x{1234}xyb + 0: a\x{1234}xyb + 1: \x{1234}xy + a\x{1234}\x{4321}yb + 0: a\x{1234}\x{4321}yb + 1: \x{1234}\x{4321}y + a\x{1234}\x{4321}\x{3412}b + 0: a\x{1234}\x{4321}\x{3412}b + 1: \x{1234}\x{4321}\x{3412} + *** Failers +No match + a\x{1234}b +No match + ac\ncb +No match + +/a(.{3,})b/8 + a\x{1234}xyb + 0: a\x{1234}xyb + 1: \x{1234}xy + a\x{1234}\x{4321}yb + 0: a\x{1234}\x{4321}yb + 1: \x{1234}\x{4321}y + a\x{1234}\x{4321}\x{3412}b + 0: a\x{1234}\x{4321}\x{3412}b + 1: \x{1234}\x{4321}\x{3412} + axxxxbcdefghijb + 0: axxxxbcdefghijb + 1: xxxxbcdefghij + a\x{1234}\x{4321}\x{3412}\x{3421}b + 0: a\x{1234}\x{4321}\x{3412}\x{3421}b + 1: \x{1234}\x{4321}\x{3412}\x{3421} + *** Failers +No match + a\x{1234}b +No match + +/a(.{3,}?)b/8 + a\x{1234}xyb + 0: a\x{1234}xyb + 1: \x{1234}xy + a\x{1234}\x{4321}yb + 0: a\x{1234}\x{4321}yb + 1: \x{1234}\x{4321}y + a\x{1234}\x{4321}\x{3412}b + 0: a\x{1234}\x{4321}\x{3412}b + 1: \x{1234}\x{4321}\x{3412} + axxxxbcdefghijb + 0: axxxxb + 1: xxxx + a\x{1234}\x{4321}\x{3412}\x{3421}b + 0: a\x{1234}\x{4321}\x{3412}\x{3421}b + 1: \x{1234}\x{4321}\x{3412}\x{3421} + *** Failers +No match + a\x{1234}b +No match + +/a(.{3,5})b/8 + a\x{1234}xyb + 0: a\x{1234}xyb + 1: \x{1234}xy + a\x{1234}\x{4321}yb + 0: a\x{1234}\x{4321}yb + 1: \x{1234}\x{4321}y + a\x{1234}\x{4321}\x{3412}b + 0: a\x{1234}\x{4321}\x{3412}b + 1: \x{1234}\x{4321}\x{3412} + axxxxbcdefghijb + 0: axxxxb + 1: xxxx + a\x{1234}\x{4321}\x{3412}\x{3421}b + 0: a\x{1234}\x{4321}\x{3412}\x{3421}b + 1: \x{1234}\x{4321}\x{3412}\x{3421} + axbxxbcdefghijb + 0: axbxxb + 1: xbxx + axxxxxbcdefghijb + 0: axxxxxb + 1: xxxxx + *** Failers +No match + a\x{1234}b +No match + axxxxxxbcdefghijb +No match + +/a(.{3,5}?)b/8 + a\x{1234}xyb + 0: a\x{1234}xyb + 1: \x{1234}xy + a\x{1234}\x{4321}yb + 0: a\x{1234}\x{4321}yb + 1: \x{1234}\x{4321}y + a\x{1234}\x{4321}\x{3412}b + 0: a\x{1234}\x{4321}\x{3412}b + 1: \x{1234}\x{4321}\x{3412} + axxxxbcdefghijb + 0: axxxxb + 1: xxxx + a\x{1234}\x{4321}\x{3412}\x{3421}b + 0: a\x{1234}\x{4321}\x{3412}\x{3421}b + 1: \x{1234}\x{4321}\x{3412}\x{3421} + axbxxbcdefghijb + 0: axbxxb + 1: xbxx + axxxxxbcdefghijb + 0: axxxxxb + 1: xxxxx + *** Failers +No match + a\x{1234}b +No match + axxxxxxbcdefghijb +No match + +/^[a\x{c0}]/8 + *** Failers +No match + \x{100} +No match + +/(?<=aXb)cd/8 + aXbcd + 0: cd + +/(?<=a\x{100}b)cd/8 + a\x{100}bcd + 0: cd + +/(?<=a\x{100000}b)cd/8 + a\x{100000}bcd + 0: cd + +/(?:\x{100}){3}b/8 + \x{100}\x{100}\x{100}b + 0: \x{100}\x{100}\x{100}b + *** Failers +No match + \x{100}\x{100}b +No match + +/ End of testinput5 / + diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/testdata/testoutput6 b/rubbos/app/httpd-2.0.64/srclib/pcre/testdata/testoutput6 new file mode 100644 index 00000000..fcf08467 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/pcre/testdata/testoutput6 @@ -0,0 +1,319 @@ +PCRE version 3.9 02-Jan-2002 + +/\x{100}/8DM +Memory allocation (code space): 11 +------------------------------------------------------------------ + 0 7 Bra 0 + 3 2 \xc4\x80 + 7 7 Ket + 10 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf8 +First char = 196 +Need char = 128 + +/\x{1000}/8DM +Memory allocation (code space): 12 +------------------------------------------------------------------ + 0 8 Bra 0 + 3 3 \xe1\x80\x80 + 8 8 Ket + 11 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf8 +First char = 225 +Need char = 128 + +/\x{10000}/8DM +Memory allocation (code space): 13 +------------------------------------------------------------------ + 0 9 Bra 0 + 3 4 \xf0\x90\x80\x80 + 9 9 Ket + 12 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf8 +First char = 240 +Need char = 128 + +/\x{100000}/8DM +Memory allocation (code space): 13 +------------------------------------------------------------------ + 0 9 Bra 0 + 3 4 \xf4\x80\x80\x80 + 9 9 Ket + 12 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf8 +First char = 244 +Need char = 128 + +/\x{1000000}/8DM +Memory allocation (code space): 14 +------------------------------------------------------------------ + 0 10 Bra 0 + 3 5 \xf9\x80\x80\x80\x80 + 10 10 Ket + 13 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf8 +First char = 249 +Need char = 128 + +/\x{4000000}/8DM +Memory allocation (code space): 15 +------------------------------------------------------------------ + 0 11 Bra 0 + 3 6 \xfc\x84\x80\x80\x80\x80 + 11 11 Ket + 14 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf8 +First char = 252 +Need char = 128 + +/\x{7fffFFFF}/8DM +Memory allocation (code space): 15 +------------------------------------------------------------------ + 0 11 Bra 0 + 3 6 \xfd\xbf\xbf\xbf\xbf\xbf + 11 11 Ket + 14 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf8 +First char = 253 +Need char = 191 + +/[\x{ff}]/8DM +Memory allocation (code space): 40 +------------------------------------------------------------------ + 0 6 Bra 0 + 3 1 \xff + 6 6 Ket + 9 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf8 +First char = 255 +No need char + +/[\x{100}]/8DM +Memory allocation (code space): 40 +Failed: characters with values > 255 are not yet supported in classes at offset 7 + +/\x{ffffffff}/8 +Failed: character value in \x{...} sequence is too large at offset 11 + +/\x{100000000}/8 +Failed: character value in \x{...} sequence is too large at offset 12 + +/^\x{100}a\x{1234}/8 + \x{100}a\x{1234}bcd + 0: \x{100}a\x{1234} + +/\x80/8D +------------------------------------------------------------------ + 0 7 Bra 0 + 3 2 \xc2\x80 + 7 7 Ket + 10 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf8 +First char = 194 +Need char = 128 + +/\xff/8D +------------------------------------------------------------------ + 0 7 Bra 0 + 3 2 \xc3\xbf + 7 7 Ket + 10 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf8 +First char = 195 +Need char = 191 + +/\x{0041}\x{2262}\x{0391}\x{002e}/D8 +------------------------------------------------------------------ + 0 12 Bra 0 + 3 7 A\xe2\x89\xa2\xce\x91. + 12 12 Ket + 15 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf8 +First char = 'A' +Need char = '.' + \x{0041}\x{2262}\x{0391}\x{002e} + 0: A\x{2262}\x{391}. + +/\x{D55c}\x{ad6d}\x{C5B4}/D8 +------------------------------------------------------------------ + 0 14 Bra 0 + 3 9 \xed\x95\x9c\xea\xb5\xad\xec\x96\xb4 + 14 14 Ket + 17 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf8 +First char = 237 +Need char = 180 + \x{D55c}\x{ad6d}\x{C5B4} + 0: \x{d55c}\x{ad6d}\x{c5b4} + +/\x{65e5}\x{672c}\x{8a9e}/D8 +------------------------------------------------------------------ + 0 14 Bra 0 + 3 9 \xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e + 14 14 Ket + 17 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf8 +First char = 230 +Need char = 158 + \x{65e5}\x{672c}\x{8a9e} + 0: \x{65e5}\x{672c}\x{8a9e} + +/\x{80}/D8 +------------------------------------------------------------------ + 0 7 Bra 0 + 3 2 \xc2\x80 + 7 7 Ket + 10 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf8 +First char = 194 +Need char = 128 + +/\x{084}/D8 +------------------------------------------------------------------ + 0 7 Bra 0 + 3 2 \xc2\x84 + 7 7 Ket + 10 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf8 +First char = 194 +Need char = 132 + +/\x{104}/D8 +------------------------------------------------------------------ + 0 7 Bra 0 + 3 2 \xc4\x84 + 7 7 Ket + 10 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf8 +First char = 196 +Need char = 132 + +/\x{861}/D8 +------------------------------------------------------------------ + 0 8 Bra 0 + 3 3 \xe0\xa1\xa1 + 8 8 Ket + 11 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf8 +First char = 224 +Need char = 161 + +/\x{212ab}/D8 +------------------------------------------------------------------ + 0 9 Bra 0 + 3 4 \xf0\xa1\x8a\xab + 9 9 Ket + 12 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf8 +First char = 240 +Need char = 171 + +/.{3,5}X/D8 +------------------------------------------------------------------ + 0 14 Bra 0 + 3 Any{3} + 7 Any{0,2} + 11 1 X + 14 14 Ket + 17 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf8 +No first char +Need char = 'X' + \x{212ab}\x{212ab}\x{212ab}\x{861}X + 0: \x{212ab}\x{212ab}\x{212ab}\x{861}X + + +/.{3,5}?/D8 +------------------------------------------------------------------ + 0 11 Bra 0 + 3 Any{3} + 7 Any{0,2}? + 11 11 Ket + 14 End +------------------------------------------------------------------ +Capturing subpattern count = 0 +Options: utf8 +No first char +No need char + \x{212ab}\x{212ab}\x{212ab}\x{861} + 0: \x{212ab}\x{212ab}\x{212ab} + +/-- These tests are here rather than in testinput5 because Perl 5.6 has --/ +/-- some problems with UTF-8 support, in the area of \x{..} where the --/ +No match +/-- value is < 255. It grumbles about invalid UTF-8 strings. --/ +No match + +/^[a\x{c0}]b/8 + \x{c0}b + 0: \x{c0}b + +/^([a\x{c0}]*?)aa/8 + a\x{c0}aaaa/ + 0: a\x{c0}aa + 1: a\x{c0} + +/^([a\x{c0}]*?)aa/8 + a\x{c0}aaaa/ + 0: a\x{c0}aa + 1: a\x{c0} + a\x{c0}a\x{c0}aaa/ + 0: a\x{c0}a\x{c0}aa + 1: a\x{c0}a\x{c0} + +/^([a\x{c0}]*)aa/8 + a\x{c0}aaaa/ + 0: a\x{c0}aaaa + 1: a\x{c0}aa + a\x{c0}a\x{c0}aaa/ + 0: a\x{c0}a\x{c0}aaa + 1: a\x{c0}a\x{c0}a + +/^([a\x{c0}]*)a\x{c0}/8 + a\x{c0}aaaa/ + 0: a\x{c0} + 1: + a\x{c0}a\x{c0}aaa/ + 0: a\x{c0}a\x{c0} + 1: a\x{c0} + +/ End of testinput6 / + diff --git a/rubbos/app/httpd-2.0.64/support/.deps b/rubbos/app/httpd-2.0.64/support/.deps new file mode 100644 index 00000000..e69de29b diff --git a/rubbos/app/httpd-2.0.64/support/.indent.pro b/rubbos/app/httpd-2.0.64/support/.indent.pro new file mode 100644 index 00000000..a9fbe9f9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/support/.indent.pro @@ -0,0 +1,54 @@ +-i4 -npsl -di0 -br -nce -d0 -cli0 -npcs -nfc1 +-TBUFF +-TFILE +-TTRANS +-TUINT4 +-T_trans +-Tallow_options_t +-Tapache_sfio +-Tarray_header +-Tbool_int +-Tbuf_area +-Tbuff_struct +-Tbuffy +-Tcmd_how +-Tcmd_parms +-Tcommand_rec +-Tcommand_struct +-Tconn_rec +-Tcore_dir_config +-Tcore_server_config +-Tdir_maker_func +-Tevent +-Tglobals_s +-Thandler_func +-Thandler_rec +-Tjoblist_s +-Tlisten_rec +-Tmerger_func +-Tmode_t +-Tmodule +-Tmodule_struct +-Tmutex +-Tn_long +-Tother_child_rec +-Toverrides_t +-Tparent_score +-Tpid_t +-Tpiped_log +-Tpool +-Trequest_rec +-Trequire_line +-Trlim_t +-Tscoreboard +-Tsemaphore +-Tserver_addr_rec +-Tserver_rec +-Tserver_rec_chain +-Tshort_score +-Ttable +-Ttable_entry +-Tthread +-Tu_wide_int +-Tvtime_t +-Twide_int diff --git a/rubbos/app/httpd-2.0.64/support/.libs/ab b/rubbos/app/httpd-2.0.64/support/.libs/ab new file mode 100755 index 0000000000000000000000000000000000000000..e5b37b700448d83f060457efe51346261330a3bd GIT binary patch literal 104358 zcmeEvdq7mx+V|eTFyqKDc*k3A4HQxkR8&xO5YSCxqT;3000$5fftW$j%qXCoCdxWi zR-Uv@r`K~%r>xT{vjV&%+STl4*~Qa!CNoV-(Jp+yXRWnoHj{JSzW4p!@B98}*UVba zW&PH(o^@ZdS>BMHJ3T~}CG823rbt9RlV@Wr{w+zHul4KLq=`~D$tJ~0!=!L%8Sv5c zY$B$G9U_?)nxIQhC_Z8MObj84LK_9Xa1f&;Nei{yDWv@Tk4;2*7;_^hwNR22#-Ma$ z>$YY_A}nMPE&PUz!Q+|CLoFSdN9lHobUQ^lEwl;ywNNV`!OH(FsQApp zCl?=jX5%vlpSk$V!-t-Hd=}ty6+TPw(VnGR1YrR_c6^rOQ;rWkEAgphF-fWt;k6>9 zpavfYK2CgU@mYn>YJBSOS&Pqg_^iW+n#6j1>hZY|AMI&EadX{Ot?Ny@~xVd-d*he|A1{Jj8No)T!^5^&i!v-`1B( zH*_C$+mn|(_m2(TkH2*?GNSjV4<1Z&y|8)zv~Tx+GU~vA`)}!ZuKByj*F$%-Z+v#q z*JG9)J#ovWCo}sVoNUc*zWeOvlzEqY@Y-h&KK#w=e_dMCdz-a9eCp5rj{g0U!SC$s z{{55#Ln6O8d-w34p19-5)>Uu(=rUN+?(IG@y!e`h8JpJK|Mb~z1&(vyujrQf?u?L@ zp9UArcz(qV_ph6l{mwV{&VO#DB3cU_;$i=y7jDT?ZMXX^QxMO)TAR=A=2+BZjKzJKi^Z5YydlSc=jVfXwM zSCTFby*S?xgnuFkPA_097s3Awo$F%xj)v~V_-_TluL{Dq1hI2d5dPR8_Rw&8F?;Mm za8iTtsXtx}r)LoT<{h~A( z&&VM7OM>t>2f=9zQm#jW=szEXe;^3|njrSP8pO|+1>xTmgnuH4{r3mScTy0X%|UQJ z2%`T^kn$c5g7Z}noL_?QKLfskPvBD<1b=W4{y6|#to^hH@y}m^;Jgt;e@+nlZw{hA zBM3hf`6_{h1-&&0z8r*a3BoT5QZ8E%d#(+_|BoR2@3401Aw^3Y?kZ%Z0Lh+FjNf0f z{h^T2wCEvle@1M=-5^_R8_d=2MOrXMY>3&{6&ET&06dS4-B z$JSdEwh6vX@Yw_8g#pR@kG8e6{{^ zslYD`;71Goz5x8Gn*A?x`!$>x;42uf6rnHNAPo@twuyGA>8}y|sDS=5P1xTSkZ&&y zN7R=#xDNwA>LU4`5c<&p{(nQ@?+n1-gK>%KQ5tSzrayBTFTva36aH-h<@!+IybyqM zjmXy&P_7E0pC|0m`j<=a>+db(8G@!~k-(AK3K^{pi1!PATtNN)Ecj6Y{NV!sfUr~Z z|5vPB{iO|}9(g9%w+j6u0s1cr{)T}55-;*S7BH@cYy1G5pD^yxcv~pStNGzMfqy7K z|L+1PDWD#Y3i|`=MZ$SQQFTqNv%Df9iH;ePq=KCMSp~%qN2*~ z7ec*QDkxaKvZ}Jc;Vi0g78Lk}_KGS8nrtSPRoW+F$GeMO0r9M`d+Q zd8MK_uZ1q))yRY~>{Mx7R8-?Ap*wcxKJ%9>$ysc%R5^2#EfF?3 zb}0dz#A+5ETuHthFFCG-i6HGYYpR)hlZmQ!mQfS(x!cZ_OG_(i9c2>yWv^a?_QhL6 zfxT>nRLWWcB$f7+)ewo6Rn3da_()P+>vS+-k$nXvD<~~0uOP0ytf+=?omCZ*oi}Ds z)EE%peqh}qmfE0OIDI0rQBUBdAfoEyK_x-Nx`xL>Jrd|2~z3mnsQVoknCkO z(zOn%7-l5WGy6g4@CypaC8F!BEGkDEFR<4Y6`(=Xp{5E-ii?~@;4O1FxDr@scB7Y7 zIh`=N#J<8Yx~6v7vMR@DR0cjp_Og;Obo7Ws4BGCfEht5`OYo50A(d2@SC>fS^JV35 zQCSK4>@xKE8gwPtUqB6r8Vt2ED*5uNs$ywXNeyx+cdkLgYspulnXzV9T3b<3TLb4- zIh@p0rRtihx;15>q+*OVoMf6v#jGf)#25tuRLU!tOUp2XVC;Z30+yvEV_;NuRVBs{ zB1-D)CFpwgDvV)F1GdznOF1NGm9waV&`OF~mMe-Rd!@6^DJ`olEiI{$;4#)|3JS=Z z!jH(yURzUx(EzOlX}P0wWGBU~uiwmf(rLy80nCVzW&Xk-L z)j~_>ZPv$}G{~YAPyq>^yvFQY#)ixlB_-A9G#DPJD3wL%(kLw}4`o2FeY(KVu~+5)*nk8=Zh!%qvO~l8iFm5HmgynQ9KO2 zsEo8Q0s0;-jrJP`CP6%YE`#_$E(kkD}vK{b)~| zj=xZ2B23cpv83@m6Loxj%dqMAD5CFCb$qf(d-8OAZS6<0MLIql>U#=xe6x=$No6{I zcOAc4$B)qQ>vVinpzo>I@gsd){3fB}TXp=6IzH9E_H5SiduU9A+jM;WIn{O@zn4yb zhmPM{$KR>r_tEj&bo{$B)+WkLdXQb^K#G{s0}{qvPw_?I|69kWRlt z#~-ZYOLrDBirUB}I=)HAAEM(&>G+C{AFbmL)$tV_f0&LRr{iC$<0t9(F*^Q49Y0pb zx9Rx9b$nIFAED#t>G*Lv{vsVeUdJ!g@x>O9Ny~Knkvjcq9eG;QV{K-1LN5@as@lWaaQ*`_e9e=8hFNtxU+P_W5H|h8pI)0Rn zKTXG18@@5AZo@~FiljERISroYF$<^-`%HVeQfJCxh&p56#AdZe#RciKc1EyOGfk6HQZsx1Q1W6HUeR zRx|o8qG<~77Bc!)qG{;&<}vyvqG`zY+8Di-Xd3FhNsO)`nud63 z(~$0!7=0DdR-#Y+0!HjyqG<^C9%J<7MAOjiJ;dl~ME4}RjnQdD_ab@+qsI_UL$r4r zqc0xn3KiFRTPj zL#;Q7(Wi-~A=axf`fH+TX!S-h`ctB5NcBpL{(xv2O1-Ckrt%*qS|R!vqhBVPhEDGx zM(-h-hD>i8qjwQaL#1~Iqn{$0hDh%=M*o#)8XCPD8T~NPG$eZK8GS#|G!%NP8GRSg zGz5AJ8GS3!H1v7%7=07bG~{`0j9yDL4RzimM%NHMifDz=*APuZn>UKl%ZR2S%_}kb zDxyaded;Gx|3uRe<~_#f%ZW}V`Vgb15j}?JHb$orO+%P>2cyRjO+%M=8>25HnuaXz zMn(@KnuaQGJ);K@O+%Eon$bOprlHAO$Y?XsG$eWR7#%`14MkoXqc2o|oBY1BcpfxbR0s+K190I(i$Ax?YHRmD%!iOdEyGf^HUc zyTJm@o0qUeUvK4!bVX>4*#PY1Hb8C?==%*nS1T;P8o}`-z@@G9+ll8bG>PPc$%m8A zw$fR?XC67*eH+W%y@}fb8;+4J?v!_&isY%jKq`XQd|Ql%*|{m^D8d%gH2{r7;hWlO z`&*xBWZVW%#^lu1uUMaH>x_Bn*mbbo-N+!35i6}dFS_~K&eYS^ra9Rcq)LFH*`Q(Z4P%W_=%kn^_=RDJx1InB-(+4CgC zxvo!D*T<@>-IIxIr|l0@q+GY59cn5nhITNjYxgcXlx?M7uskn9iyWXfqz~PqVB2L? z8(v^~lC|+$%sS+NHsrr+7uu`p#$1?w<28!J+83H&GrEALqPiz~PB5>$z+COIk-aWM z{KJamb+V=?1S7a$^8*kphM?W>b2&1{Mp~lQ1K=(@fL>PLYe z>3*6u&ti4#IM(H?O{*}(syFVV4zYM?#*&Ps8CPc%>{X#i&58lH(jmTQEl|Bpz-l*K zs+DRLLGNZw10HN-NsdR*dO>w@3RR{yw8_?I`kl?1BP+FEsSU4nCLeVjL1z}NWpcdd zabTxY8LYP)#}uID&a_n5IVhqF)Ke`}^P1D?8QcLEpy@N-=IrEy`y0b3E@kZe8qICj z2x@cgl)m>X2-3G+tI%+?i2UX<$Y6S3U=_THSq#OG?o*^}bXs@11G>)<1`>$+Y=hA2 z?vfxq7ivhrG+RQrdI!~)%kVx`{}QNs{(~~4wk15%(?1~n@A>C;APfJzgDLYr_s`E~ zku&*)`$O}N=CWN0u-JQ)H9BrvyW!jAyuF|Vqp1YQVlc>e<*T^?m%mZy=jwX7UXVK`|~)9`FZqv6xhdc@idWzeC=`vmH#Aw3FN zNYE=@R>(OA=(X7HDeFcP~lF0V5P!psu$IQ%kbfyinKpllIkZdwl+=} zMvgRe+)XNmp=iO@XAPHOkSnG6>J9j;wA~O5I*(Qg*+8O2!;R^e7Aul+1w4Aod(de} z9{?Ke-QFMXq#AmHNWTY#vEF_!823F#qxZS9dh;g+AgM?RtvbEbFj^G z7aD9s`f?6cfs`=*V=RSQ*w~&A7s19C!EhU9K&cdc13^Q2GEb2*5I~Qg?(B3A-k_nY z_8-;q&U*A0&(mj+-kx6T6S)jUz*1Lq#(6fA%-!c&(8&ienb12r$SVi5XAorMj78r(qtmRt}xo*n@*v)2+DQEk$kiv{mUXMoy#!w4nbbAg-M>s#cVFnK#-C1o(|Y>^>^R+q zD+tw{GJyijvTP`Fr*|-NQ_P3J$MjBt=V`PwY8U-4K{_sKxB$m=4#r&E0uAYg>E1U& ze0DW_7Ut}g(QthfMvgj+rn#<@o>L>B3s$HAzzPkLoQD0fYTuKSy5HJ-I{(- z4ISOBjTbPK8*wE19**(M#56}iz+H0 zSMJDhWk)x4qQ7Ivnk8SaK(iT|8SdsRC^Q|kHr|6gfT83}%ARPwX#*&DHHXle7szVE z1zC0VNdswZEJm*CBtr=ZTB{lcA|f{!OcbD+Un)Qvx8)L$YU%;&?f-(&&@wPFYF2R@ z9)t>f(O0#fQe6ks`_yy4U`K}WISRwqM$ZG^c6R2tU(ADLIqv2~6u9=}xSFaFQ+K{` zZr*2qeqf(6%e^#OjX$3ge?dLxRd=7C>KCc5chOdiYW(X+PX{qMBby5;F%;c~Mlz7} zcVB?Y%WAWVvRNvL+Z<63h0rndXcsvJi9l~+E|6< zE7ah~$F64XzLNsawxPbZtZRg~T?g$_Ej{Wa8Oo@#TM=0AxDD&QhV=f3qcT6ku@7pi zniSmW@d$S1TrI{wOj=3knhohUGTo*lXi}bEzQM@rGW5Fz2}T-{+!&H<)2veK-laB) z)#Mq~df6V;^$vxo-o0n6R~tT3CFzWH(f%{m9$7Iq&)2}%RgVFuWj*p@(=GD)9@S3c zAx4;%`*r*e!M8r!CmZ8K%QHIuKJZ)3Uf{<|uhgM>b_j- z>|<*D8#$>Rh_$P!Xi2j_&PjbO*P09Qegvm-QZFEQFDLaJf?rfQHzrS&*TvX!PDWqu1zsJU`4JQyi)7Jqq&$Fwu7PGmvinysWt91e2(LD zhITv~ND~Fau>(b!4)He<0XQ4&Y#2eQNwQf;R9fCKf+SSn#+YqFR+ftm77@p5PNRRk zPG7bt`pz>U=MFL+zKlCWcULMB6yZdsc!Q=Gg``5=1NE0YQA~Z0roM=&U+Gh4`7!ikP~YeI7j-|w zA2jtsUz0()^$N2kido9i96_4Bp1&gvvju)m&%0B>bcc!U6nxsU6FtE5(bs7Dv`Il7 zSsVAV9+Vqn+l6BhzN~ANRzYn#V6v%lmc-Plu8NqlTvu^Sb*}5Nn0hGYy52hO$X#(f zj_u|RsB)}raxo%=TD~YkmhN&>uDeLd9a$7jd#d-pqS4u-h8o(Llv<+8vuhXZVf#7N ztw!a#aXy9BAJ%y`h3#$uo9l{+Axll@v-`+!yP;_j@UdjNQFQ}Gb(3jsn5Md6X)bnq z^%91>uaKi^Pgz9D?({jx^|@_xu&RwC;r$T0Et4T@IFEXLI7*Vv?#3$SK15tEV_qK$ z{WmYD_QUFm!&t>;^^I0Tv-;Xvuq5GwIN5|8(>pM0tM>00>~qJEfoBTCKDJO`M{C$t z!ajg8=OrY0vqRmiu4sez#)YWOSs}<{fue@yDeA}t(L9%tdGN*|KKCQDGGyk~XBIUV znZ5ZX6~v)sb~9EUtRUAT!V0p8GSe3%iV8BZYeDLOJz9_5Mg^%QY(qc7rp6xz$nEga zPnhIjzT5IMEePy~gok>-{Hz}8bDD?FQ?IUvyIK!Zql*SuL;7f^?+(kqDCfz zP5qFMA*ZcTDW7DZ($NR2XVLWXbxR@CsH3q-aHkAFwC&qscCyH#-5{LQ#YUl9M`gt< z^1K1}6XGLmgn{@GHawxj7suFgF<9+DO3DBZ-NZ(>mJP^)r7qNGGU`=NgTQ($W*g7< zF#);=-I_4!STc2%3#I*_We0G&AiUpL8Uwj5!(FWRF|*+bJ8 z#me(^2uHy&K;h-5AsWNifl_PY`*6|jRS^(b9=BnQXk7@;L^){~k9!?ue;qozt+zam z2@5g!X_dKk^J-K;{pU1TL~Y?tg5Tg6r2ZVZ7)=ss#NW$t7wB;dyW-B!a0`LkRtMZT zjw@<`;no571aOZ5_Zy_&$8mp|>a%xAj0*lMu=f>iZyWjyvsVS~u{FRw^cl1FG44;` za$f@aFrYEUCcXoRmpJsF{Ls#rysjoM(4g}G-LV$XwSdOHKVP9HYQee*Yd{ca`VxrN z`s-{`^3fM*%kQ}ys>f3>7M-7mbwwK_toB%s4mEs^MS|+i>%fqe@dZX9jEri-kKL?| zJ8>}U9`{GvU4>H9S?ldv&w*>$>QMWIa+V??OoE{3Qo zKs*V@9)FDOFLUfoHWSv-FLW9)a?|c8r+K9#o3y?+b-dTHUS%dB)3wO7#X}2NZ1I|@ zOigV$SdP#FCJYX-HhzPCkCog+z)7`PEhmI-5!bag=F@ienLKRfRMSpc+16iB*7wH} zoc75$R8|{y%Nz1KtRQDs9f7=Sd2_j(*JV88dbW7zMxn%G8-cClio>rIE) zIs|(_Y?9q6u}zBPX+wc9n)e5SYcIB|a5(=>1%5KYGBS=v<|srwWB)~`8Aq*+_mfRP z@g$SIZo@TmFz6fR;agUl^H4b*X6$bBL0j**hW5?v+2}qrJD>DS>FwKLd3$3wRJxI6 z>rTHL>RRsXpjBrAEhC~~LMfJ<5eR)I6~X{Kce;U;c=bxBO&VL=>dgs3f+Iq)998Zwb5B7u|1#koFOWxP8V{N%aw96AH z47Jv#xv@J-8dVDr%r#}wzWzNxK;hHEc?GFgEvkKF`@yU!mHWIV@qwWs`D zFvoSkGmz^wLIEdl=}6yVtFTd;atz>zhxUoy#tGMDP;AXik9kZagfh+FosyK@jT}Rli zAI3fosd^vx(79hwik2gk%+)&v<#R#E_JW>%9KIe5_&_E*CRQ>#O1i>-OZDKkEaZx9 zumd|ucb}=CTQ(pC%ZZ%z5-B#M{}CFJbG+MdBOK5tPCB~^*Mk}(w=@GOLOL;6N2OU`(xJ_{WbBnga` zdZ;4V7O-@c8OsZDJ69Y5MOKhi1b##VC+MF(BItC2UQf_Vc#1D_$%<+QozWHgWu$=O zSgyDaiVS)nLDwUN&qoiDB1XWbP)wmHY&=x`TX}SX==qd3`2^d=f5^7;owMw_lMf#s zr@EcSXbkH{B`5WJY{b7*Q(wVG{QaENAF${CmUis4AD7SN$ggYL*4)%R>)PQ>>+R!Y ziCn+&24v{&b0dP5q#B<`Jtkg)Yq@wCiL3qM9M?fOMs-ERcs}_MC9tPd&xE^Ov@D-O zN$#8F`WGu?E_QCwOqVuRNI*x4?mj&T@Bjd{z13z86Au^_`!u)Z+Ba{}(p-lr2F4hR|H?lq)-+boY54X<8HqP~+R-aM!vR6Enh-#?fE7oQymL^!uQR zRNT1tnG%NuCS}2ltRT2Lf)g9SGe>ctRg3Y)bMSqt;PksN0C-*l*ZU2Ikaoi|WI&JC zf#ou$#M9{aP+LK2Uw#0V%P<>p{2~;M!3{sR$SAM(HYm3i5^N1%y$RT&V;Ei!ESDh~ z-`tWaKLp<;C? zdq$8u=oDbDwUJ)k%XNK8i>o{+!*MsRBE88YJvO3UgTGVZhEL$9hV;J!g8weWe)B;e z-$$VC^w*%1v2)cD8_u)BV)Q=};m034OI3f3jeh#ETn6~2!)S-eYmt;{cV`XKLDWX= zhX0E6cTC#auSi#7y3u|mvamGyG3a}JQUyPX{T|edTEcN!E@B*8Lmjte=~B_BJkOwR z8`6)$NSx+Pz^b(&eLN96=OgD`bUNE|gQiSBY+(d!;H_*F)I3IN8dX^Gu^sMxnCbWi zKGg67&F^$%AvU~TGvb+bz#wR5vA=+sagRbw*OA-Qsc2B z^LAnezKHf(4hc={3%x6$L`(8KWX#SK7ip0~EuvDy`#BCdTfGHnC^x=KKajn^c7L=|XT^J3hG}}3>vH2e(E8!AInX8**ZZ`! zP1jT)nE;9RkNClcj=c>-XDB%Dz8X!rWt&sv$6E0j>s4)@?$9MQ%Z2HRRBqUSZ?@Dp zq^X`k#}MjQ0s~09S;E8biG;h61jo39FV)%*z0$BMS>ojq2}P2vNP<4L9SNSJw^my6 zpw9;+TF;OfT2^E(%Vq`AG^9U?O$hhrQww%k?<_4%DWbsp>cnZjb!Ulfuf>3@00M12TQ$WI__TL9s(CreFKuX zElreAfg9a@Rw1e-zn>Iugd$mRl)el%Kum6%iu^HPduZ9`?(;r^mLu8>%1Vdf8ve(x z7&tQJ?#Trj!Dk**!FBj?B?`q;E zqtm)ATL8L?e!*|4)CLSR@CBr>{YUhy>b2-uBi;h}cl5~Cyfq-BiOi%9>b88IiS!BR zh4ITLT zD~T;1({IH3#ro`_mMftIo5sA23|$60xZeIugTE<<(YgQt89V8Xhh2*>DvMKCI%Zu8 zQ)r{w1`FwZxfequsr5+!diFvB3$|1I0@E^dU;<4($YvdF;$r9O3iGO`2NkO~6>Ci) z64k&SR%M<86tk6sS4lv0kbrC??@k)%_P5?nS=`IAu>5lx>X2qqroU?_VxGSsxwZ97 zYY4_}PZji9kD(KJdiwCo5QD3WXgx#kn;GEkI;7mS9o|MEO{fn|03gpumRFzM4(Pkn z(~ztspZoAz_#QrduNFRhlC8?PYj#b9+wex1w;4U!v;9rj(4DM)kZd?cCEG-?9c1CH zh|$kLZ(gn9<;RB4Pvzz3w71dy7Ha!$x~@TOZ>PWZ_q++1?|0sNSD`dtP1uM4TklBK z^~LItrF(b6eER9y`Tf#X5_KLE?+5H8O4Hxn5ej|PwMX6k^;A_pq`uivi^RKl;=@Rc zcLjL*PeuCr^eZzI9NYAmkCdMEot>Ra_Zy~zC7;>L-v7h7&SWS!FY%esdw%PVW?1L? zqVv#F?{!Fm^^DiSL)AS!8b2JQ&WPR#MyGY_9_y?!^mOp#{nlCg_m0tP4J1fljsN3E%N$u zDn!XX(J>Nzz(uc+2#Y*nM)Wd>TDfQki6;3(c_ey-i|!^7R+b{wMiRNWXf26G`9udu zRLMmJBue#(I!H8+i?T>G-Y1%9hiD=f#gk~VPgG5!!CVwcqNzU74ibfM(U~a_&Gd;* zk?5;K%o|5Yl;acGiXnQHi(VvAhEKGSL{DpqU*S*;v%UE zxo8fF{Pk5vsj|6fJc;}bU>k`pIBMlZKXyVA9!o(&MOHw8UcBNotK&>!5E z*O3a_`mENksI}L`1yzYeI)V0h+1sr3}aau8e8`YH6iQxM&? z2)Vaxz?Zh7P$|(4Fg%w~B8d|9M(ir~LW0-z3XIadfAJ*77rcLQ8EmrN9xqE0-t2e% zh(BzKQ`=`mqf{6nv1G*4ev9@VN&78yhRS)`izLvBBaZ5xN;@@!XUA*g^OW*znx^R2 z%uhToB5$nt&Q>8ycXzePHN0FmfNA_g#s>*&<= z34(Dou$NLYQE0p!@RD<7Lx;oK*vJgYgjTwX%IEqL(;OYbBAOKw<#}45c%DbLu;}|q zbny2PzV!!xAA`2uu@R}-Go$d0#GiN$(sr(4U)vhmy(G#+A(JhD1_fB;|Fy5EYdhzdy^>BiEIID!|KdcySLIF__czz7(q) z{BBL@1KZ6y6oXo)2k$_3>Ket@wwfLfzUL?8?|p(Ls7D3(`|9y|;=RW|FyDsu*)tK@ zryjE2(Vx|=BS{TSd6amt9xEZw;R95XnQ^Kcr=h8DI#*Jwc#$eqo|mM?zp1)r#(DnU zPD=CQ@HZuR362gl!Sy$md3z={E)tzGxH99Mw_q=D zf-(l-UCov$HtGwZEHBIb5P7mGA6Em_EL*&y#~cQqcNKIK^p=Zskte7!SWm=SiF!N^ z7CO2+ziG8Cv7vDr`T|1s^k>+gc)sIRgnp}A54FZY)pK?~W&erib-#+Jr;LReuFi}F zIj*xA^K)G9WaQ^I$8H{@V9D2 z%>qVe?+@9pk*UXPzlPB!-Cv35)>CJ6wz2hJv*F3{@EzKbS#?JxpY?u?dczUu4-!g< zwH1)|vXb*J8Mi~su6CB=q7bF1rXvmQsTJegyND_(&W+AQ_PdAr%3$z9T6y%Rh7$dv&#y0e~!4CBraactXf%J zQG&Zhl-P=5MZ1K=EX~6;BO0mDeIvyRE>IcTl~32uloSt@5)%^v#O~^0rp?5CAPE_C zAqaj7o{^m|so5D>5-x#pj;^ktYhjixr;AT&(pQ(!^)fk?t8jZru~J#Pa#=}@QdO#D z>@Z82MU|CRPGx0zosu_uUcOQUvj~kzMmQCAd5uDMlF)4}igrf|-4q0rB3yp5+$SYJ zA|1P91Y<)UT}Gnd0wCN@;>4vt4#injrQkl6ni>N-*lxanda=Rjx zIi1yMqervQL6OC=j-^ssY_T*A*PN8CEUH;SxuVXb#kdfts&;u92*{TzQrxl<1^2L& zBggnyaotmwn}`(dQ&vmtmL&5$cDsqc4$NjIWOpv*&YqE`;MN;l)`Qa8OW^V1G&7ab zVutH^(lklU&(D*X?p$#PjY79ZDe251{@Rl0B9{bylMCvTE{aLWWtXj_QT;NSU%rwi zO~=JBj%u#6+#}1bXwE*wKh#w0pWDkv;#%R zk%SBBRwM;i(Nxu-bNU}9yrQZyVN6{elJe_*G!4qq@9M6|EMY!f{KHx~D$x(hvs^93 zI=VqE@MD(D{+_4gqoZP|Sm}tDbO4CrRxW%Oty)g;qB^a&vTR~g(DUhwKCJ26OB@a~ zVf2@-B4(lHrLH0+DK=J7CMQi%;ws_i8jMwNRxvR-tmw#e-<6U%Zvl-axWGzbcP!=M z{vlLg(ee_7-Q`m}iVC8@=9Op|vBjfeOZYfgE=G#^b92pnyyQ;9kOANLe2UgBMm3>@ zdDa1RHjpmHZC*6IE>#wbp1f4MwP(KLZu&>=qr9TPGRIwaEVfB zRn1C$Iy(&Uw?AFFm9-Vla*VrvTmY;rT7hDUhvn;Jy`J66MD)B8z!lRlMRk~{tS%~t z1KB_)ni@GB_E!6bJR+6pG%_No6GJbJOmsOEfzW`eWk`An`Amy?JzWo_pkc8t&j>Nf zP^lq^qFMr5#y($bU1j2)M##MP8k;|eq?2kV5$U;TCZj2hgS zR#Q~7Mw>qH&pP~uF-LN;A3$cBOCYs;%ga8FSFflm(e9;Sk#Qd|H?Q!-W?HMmz! zkL?Jwj5l<`O33)NeSEH6xNxCDlQ5cOIj%%Rw;cr^1*@MxyD-BjMer1+bc`$2MK!pG zu2{ikW9+Ulwv?#GwTr8(YKjxP)N@`id-#&!w^+o=wMbzXp0QB{43?S=aBvdVF*Mj{ ziykyW7$*Afg03au{Q+H!7Jga+0-#&TR=%>xiMf)M8WTT_LJp3^ zaF(-afG%)jfV273fQqZY?T@H3ZNL(@y3v>iK$fVBJtY^#q1lEl4p*0>e~E%&HqZ*@ z?`LHJ<-vt@6-8@MF*GyL;6>R|9mF}y${h;kT9TlbNxB8NGC9a1eTu>_G)%x^UCJi_ z{Li~CTR4tV7KkdQm5X>XtE$)3lrP5>1abCwB{?;9Ji33;N+o}Fxx+C^xvHerq2!m? z%PP^zm##=c73*Ma$52eFI){5?i&SUpcTi=g+)(xvVqMN`y8^Xg-s`V0D9r zS6fY;AIjR^$G3xFy&x{u5zlukY>|n1FmNYB9HpwVVhvmPEL(#ajb+?*Yznfwfo5fz zJ7OWez%P5t_bBij`d6E(nvHxLu*b-ne&(9m3oS0-WV~nav$XJe{ zCQaWLM#nlV*vHU+v>_m05GRApOlitxqc0;dwm584_eR9o0pZ>0^j7 zkMAmdJ27n0%AiFH3!PT11N`DC_|iJ+e}d=Rz5O4;V>`YeSY^e5#=&pF?CZKo41)Np z(*6cKu|E!ih)oIWo4>L&n4S8*!#Au!kOK-I43BN3oY+}ZvZjM!!s$p00$EX<7@IT} zCOh~>LvM62{9kXPgM#bfg4R>uzWcYK>FUYfg2$nqD^oC~$HA#|k2HEOW=BzBES}A7 z;l(V6(F^BmT`c4sH(0rUy~__`>2Iv3i=7MvL97UXWQGQ_lkbnQ(yw&j@?e~G1+V;z zw$y)*OQY|V*-GAB4pzUd{xK^3geWG0l^FZR5(%)`xzA#mxO~t=KR8}k- z?Z9x)&*uIOzQ5hF@p*XVGDkJmOEmiaYE*`$92d8?JG)}~{QFDUQ0_us#zgWHQ8n|2oV--PaJFF#28??C$IGi^8%TNgS8V>6CecwBV+ zhc5KG4)#L-e`mO)B)=YCxFLad{HlKkvG-#Al~iM?%`d)mG^VDdIN&TPs^se%RzB+6 zVnwALoW>@Oh5kyM^68YxUOHI(&-F(sMfRF12X?GD%&=?gSvrv7x3u%j39rjIAPVKP zcP6U}ZnQQAa7X(!yT({K*_c6no1X`C)!>w0kM&tmd)VLc-%HprtF~R%AGNXz(w%TZ zH!;a~WB&w0H+H9dHz$+OxuOQxHE(u|OwM0Ca&&?NKWN~0q4FX+TBbu~dVEtYc>MHu z933tvCgX&5JlbaL1Uh4u=m!?9XZ>5fg|LO4LH#Fqyhm|s|6RV>bLY;Uo5uFM!ge}H zp(6415%$73B&DB&sM@s=j@&{&$0=Bzm*4~n+RoMGc8cQ2+6joFnqo80UBQoV<@}fc z+vOT(B4vh?N$o6?V6K>*54xh94(Sq^-+b$N+KvBLETfe_9dO{Nv`9OC^I4*qb`eu> zLbVKLtYN!Vl#JTA&amI$FCd7jWXIM2ANc8F7X82T4|ONn^Zm~^BDAF6)Q)~-(f^Qh zV9#%8KWqT|pZ3mg@=Jgv{}Wy@=lOr@!iJy54{c7-&RKoE*pA;M@RJR94f|0K=WWSJ z?3Xq+#>LT()pQ;uATTRAFSD`nP3?^#}{` zvNpZla|+=Rgop5FJ@oe64*cm5{k!f_c*FYu!g_@CcF;zIaR}+@%>zkZJ6DqHqU3=Q zM$<;w7)AU+_*?>8E)zNwTwGt0Vjv^^vWJmJ7$T8T(<7rVw{~A`s+Xn?m~`3Lm|@_u z^jQdZ0JkqO#6!4C@Y#70z7za5@EL$k|2D*rTtxp7@K61@von))vm)6GhJ^nDJ_n#5 zLS+|xviWU%LLcqytU)McL`K~lk`o!-5IQq*o6O4eJ=ojuF8wVeN4k(KbEN6=?kghk zR@FGLdc)^Y_^X9a5K8kYeFmkU5ors(M2?Kk*c%y@u|Lw38EI<>y&3gD5BVz>`a4l) z?^8PD+YmA%GAXo7HbXzsG^0D|O~%Iwc{S?vN}=b+5BbRqe5Rh$-R_Ie?7l!_=OX>n zNVg6CVE^Xcw8*GCLb4*GZx5XosWgX8i;TO?kP(@5b9hGN#0KMx$V0tCdxV-JCxVv| z83&zdkEGzor+XxTeky>bf3uSwD-Wb^#Qr@(&{0EeEJlCuOV4eK zZ7l51zOnynE@ZKRg2vXBJ=z{?yO7gy03!!MmxL~jnUQ6L%EH*U@BX=AZ)LB|<5 zZ5H%;Az+(W@S+93j|jCu6a$A6g^VSN>H8;FY2Qwdkq1&g5k?KPv6#j`Fo4sV-Kx;* zCPFQL{Dl`Qk1F)>XH$&U@;xQ!;r%(DNd7+_>=gbF%xJo(*99Uh72zro-YmjLeK3tSX^3S~3CO*R+_%?N$dRz&cxUYm^c+c%1ph+>6p0lsPIKOyS& z4&`@gbSZSrG;7G_pW&wvGyX9NDb#!wat|{*z&DtulO^VUD6H9h9wn%+SIp0&*6O3A zu$chwHYgi_-7|q5Wj^sZ(nqv_VLnONQp6JQ&8PN+13cm&@xS{E;$aaj#Q)v~vrJO= zdgptH()vSt4bolL1_dRVLsbPryP;51A^s$K$9IOKT@D+7g>B&-}cM8!vd(Tk#Cdr?(AQmMRQn_y4RL?=ZbfXO{4vgoIX_DZ0? zGY`vysMq*cm<4Yl-Y2a0l-q%1?m@lPoQw3bxdEsl=KJ8IP;)*wVdkF^H<&-bcer^a zk{QjrVQD8sHzHkc^$I|QRl_m8S1zH<-JpA~ZlfHxgYJC;IiWj6>v})<2RJ-p6^!n^ zO$A$u7=X6l`%je66!8(^{rNudBO<~G<*#I3RK#W|_I_*(aU$HvyZ7Vih(|}vApIS* zno=SL5av^lfFBp}IAK0bm`M@8peB1ia~t9lBYvj%PKw(iekPq=gP^ZQWT4EwU!Zti z#9vY7-Ypbg6j4F?ZTq2L7_pM#dnjHOkppS(eVb8~YN^*@7#D7$a)lj$ZGDpdf@t@N zP&v}~hj?%zPQlE+XQ?8kh*}8y{lC4nRcM&wyOLdw43j96r8 zCreCn5iBgUoTD^mc{zwO%RaIzf^~#y%W*O+iV;o={qyjBd&(~0)LDL^G<{j$skgj> z=FzvGOf%6J^#n`JUVkCz(|?34PApwivnojO)@-)&UL z2s>Hz5JjbkM+oL&Dy}KwZc=@eswWB+nFLs{el1 zvHHIhzA|4zLs|Ei!3{GHp)oGv0r=BA^g%?y>x-GnTx)<%zbNxt=fI5ahk7-?!=ew9 z>U%~oqMt|2n~#u8GSUc2OlFByGP2|vZIq0ZB^xyP{Lr0#IE*sCNyBi2LK%MW8q3{C z<7b{fVVDe`L_f6{oL&?S8wrm_zeoc`*ddDUSp`vdiY|)Y9}cInz8igj_uWWJ{qlBT znj&t3$D&`QcvQqjioafnq|p&~5zHa#i-Y<*ilpfG2}OzcfeL<; z!_LEq{&C}>7fIuUm2j-oe+Noo@4&bHN6rPiJ4Mz0NhcAHIF01}$MCYvK~3}@M{HBX zUtv`L@dOanzr3OYYTjP8#=VwL)*QG8IuM=-GeWQr>hcar`TipNAeNpaf`z=?|( z4`1}3Mm8ixd`{+Nkch+?414t^a}6=0%-0|@%;R)t%Bp(CU$f{<2jzKLy69l(#A3 zD8*-G!SaZRJ5e_Sub_Bj1pPufaQ0uJ6BW@!{Jckz85Ra6wC{m?E&*aMiuQOH)`xu= zG8&96qa+xBw z0a$LQnu&_I6s407)Wfpqh>wt1K1gvT;w&`fmnj|>aXCuD<4F#Ge>(59z-~ zS=lbJFGF6hv)VQdIf*Kf-ykB(G~^3PeTWFvG~_u-ewa;ArXj^}ulyF9p-e;mNon3D zqR=#i{!mDMhln!MkaH-Q{4NpIrXd+*?-4?)Gw~s8A@WyfxWL`}-ETuNSVfp`>~B;~It9v$%u8S0_9A`Lad(2!C}9Qq=_hTVo(NGb1i zmsXQ=PK3)t!%3@vX?;stlvhXri?Rd-JVChWL6mN2CNc<3qS_7}j)cQL#TTcC#laP! zNmQ-FMl$X<1Qqibd3bA>Tn=8WouU*QUb9M)9}3%nN*Hk!=(uj=yFFq5gjrI2+%hWP zYn(#+SO|=viwM7VJ7xV4Qt+%9&9km0LwVM<-%!>=Z>JQcEX4s|3P$r3%ooyS!;vnm zFPphSzl7dM1%(8I@T8&Vk$1=t=ATILM->z}Kocl;=n(Fo1nN?9XecRaJ1y-s3wcWp zQYIFWoMQ6)#AUvCK9vuSPq-VkCPy#;`WI8^@dMl{03vh%BAzcLY(;vx4@-JXBpt>8 zz~1tSNZLmv9gVzsoK%vkCAnWHwHSGB(zTKt&Es>Vgt64!6b4HFIt)F2dj>#A1yXeO zhOf^emtOv%N6wSK0PqAFNt-~Y ztPu(iGO+msmftOu{;6{Qq-eY1=QIV38Y|F9qRbK&RBmJ{AqJVUVAU&dhvxRck0%}VB0+Q!6-GK}M8HXF+^8?e>gY*dCYXtBs zye!>9HM!!X2l^-{+D{jO*o{g_LXmUU9 zB!R1``fx4AsXcvu*w__!L?Esv_v5ArTus%78)>}Pk9(ji?zBK$P434XC2%!WAFkDS z(vREG6?bVMt|s^6Vx(gJ)l_}BQN|g)e14c{=MEL!tu7E(llyVU3tUarhug!r)sIUT zW6~pV{}70)$^E!^d5zhtsrqnx8qfK0cXY*lJP=ot`*EiVTus%7+sil`KNyI9ajGls z!9ZM1?#G=ea5YsQZg1m%_;KkzPn{n=55(2ve%u^^tEu{M`xra@xO5q)4!1K9SCjj3 zGX$=t>cj18T!Tpv6aW%OgH&fWF zsrqoEjYdrB7q>Sr5I4BJnyL@Czp=oNOBbN(>|GIvtI7TLYU8h_>cbsieAbUkx2NiG zZw|!OVfvc(da0eS({kUpZ-1h=;HMt)*OWC3j?9bqjrk%_JnRYT`Wvr)h;hrQfl1VZ2 z&SUG-XqC1j)+P{uah2TI-{<0|v=!O}THDeoa>|=Rx$E*zQ^fKwWEEQ8l_3s5vPJGk zB0&$4hkUjCGIC&x+}jB8TcHqakvmDV@62LJ`W8vY%ku#bH-)Um_nZ(@os{x}01<9t z*|YPvUMML$3tKHsrhTSO`12OcoGpLAZ`;h$D})GJD)z`{!&e~nI9iUUEE2+=OPB%O zLg^}D{;-1ULR(G|wJ#G2ff_fy{mUx!Y)x+$IwN^=k<-APN@o&>gn<1~ z0GRTYVT0k1v9xKMXG^CbFCz(pal~S=X~fN}2G0Oh+hR~5ciN^<*WIwt1~yK$*f-L? z9X5`(rED*XookYi+l1UUizg;>;%6v;>kgiZ0J17op}g?YOr&>;K)ye(7D&W z_#{B!Kd<e|O7^w#0&eF-&S|d$-(&cnQCy(Trlp>SZ+8R{cNFyEl47cOVDS=1JBsr1A z;$8)`JeqT9N=;&@Qp|h6mcKX1Lx&<|Wz}j)K5L-Hz_LDPpabdQ<&xZCm;mUw&&lTV z26nFa6!ML`m%3nPIOQvi*ayyVHbGw<&g_gIUMb0y;q;40+!&hkt9X1e`KUUa@{Eu3 zm_WD~F&usN)^KX1BcdSV=af%`i&INh7w>Qi*@c@%K&K}OW44ePF$UQS4xNI=82Blu zBo8-`Be~%tnBj3}DEBx6*&O#URZhI&9GU+i5)a4lFrSHr!=VcdRE=>j68b_8bRX5! zBE}!_w9m%tS^t$ryiO2s{~a6x2Yx&z#Sgaw?^(u1p(&dq1{#H6{6=y>OqgsRhP*BX zPaYmd-i{~7*RW`uB!le;ql3h_yCBozZ<1+F&QBs85icU0TF%c8_r+Ppb!_;foEMWM zK2&as0qh?s$w+oS$*mX_ng?`d#j;RV{mcq`D76o6g^2g2x)t#?WQB+)QkyO2`X!_z z;w?J<%T!>&XQe6OCa}_oxJor9;%`yfQm(^FxtzyYDMkEmR7oQKFqKindsFi*2Foady3prO!r>;4us8CCRxG9p@n< zl{NIv9aTAOta+FXQ<)^EUm)c_89x9{=$#uY)sxf^9%18Z=$)G@lhEz|%kb_F8HzB2bJM0%ns(!NLa zvrSa4{6qdO1`dgM&w zh~Y?23yvlX2K*r2G|I-LzI|I+IcNCyS4cEzfygUjDJ{_Ww1hcs(k+5N9Q<;|7n_c5 zp_xlHpgDNeXVNyInGMZb^qL{2(U?Pp)DG!Zfxk|cCY=%d_23`osk((K`wE%OFp-?d zmc51da-KBli;+BEGU+FMM%_YZ>P(s_P163VnRY|HMzA%GoGeYUBys>M>qy4V$8JrU zlsKF7p9cSO&hHjV|Ev~!Qfl)2Vp!HKl>W6S@vs$ObR4JQd-ljhrn>;cD&$G6LL|1= zRD|j=Y6(kBuWD-aJ`b-q?Jv81D@4>f{XVAsWjIaX^vItY&2h-&eaO0Dph?**px;0# zsE(81K3aFr(Ee6^Ax|iMgk;(1Ea|50;3Og~%V3{K@5>;|v_i|Em@+sNB!e-uocLG> zdx}it>83rD`US{tLFx%lBJvo)oD!PfGCSvY3#ETvjUE`y_O)|D%@TTg%1)t34a>jh zHK9l>$Ic+pdBl=8gs+mXog0Qe51 z%pj)iZBU_iZmYB%V-XB5-yrfA$ZZ{rv%NAmOp&B7h+{sR|jb7+y9BZpk zg{d6t7UP@1;w$;T2%&Eq@Um|u&kSi7a^KL`Z0t8u6sJ2XA?4^r4f)cCGRdwv)YVNdR2o$O|s1|FgG%DpABC4OHLGnSNQ3{Q9T!S_UlU^76 zb>QF4_;W(<++Hb7(i}-gIlFubfJhZaZo*m4B(0F7^hpq<=_f@&w;&7AfwemxaCFWd z`Ca3vQKJ1$Am>~r()_CZmMW6;c%qG^s-{+WhpA&O8Xv`T9S|--^4uE`xq%|LA~Flp zXYM9MhD2hL`x5NcqiqsBw7Qq$!(SPNtYv6D1ceD_q3{|aDV8Lz^(5>@x!Lc-A>BIJ zkWR;{mA#a3IqYrRnv zrB>_zx7J?k%$YN1`u6>v?|Yta9?0H%t+m%}uf6xVuZo4JyopLU%BWo{$||wA^)5pA zy$J|!AQfeXuVdVwv%etYXh%OCQ`hVa^+M(B3<#K%YX{k*4I9385EE*?c2KqkGIODB zMJHrN!LnivDuw+}`5`K6sB!};dHv;(<%ly4uifYvsL$RAeff}O83_20&P&c%AswisJF_=|lyyD>R3)>8AXVo*5_qtm<~EcLL+N2SNUrz;biDvQdDFRF zdP6Y(0*`0EMeJ$QxtG}ABLv<_TY8ls$kH6}r7e<{FjzbM{IKCxaz>e{dE9Zj5*QmN zPBv6SO)p%-$xeVH+xRLeu|Nn?ZTu!VF2=@DZO}R@vm!%6`=sLvK^C6=( z?F~V!2BI`q%%=-oN25Ra=wb+bX?ED6A3Z1oSe_kjG63{h=Zc{7rH}aaLye-+FI+_H zQi%>aM7E4jLBz6d7NUzFA>kUi-Km}X>%f$5nrt+pk$W$d=r<~%WT^k}9-~}v%sa}k zDS{3oumEs;xF#p>OVbXFHdK5yEHuV6=rU*(cVVYZJ1A;1(Xh#eh^~#TND`Iw7SGbd zHtbo-VJp9~?HIEqRDFu%;Eg}dGlFibfAeqcmY;UPG*{~u%oSTG~94?wTCQ@cv z`hk6@!wMB2A1cP_$@J~Qw~~>Tbw63&S1d2tCs?@_$a>*q>eMh(lgt-fGK*zQNJj}` zYudqLL(BuRNP0HG@IGUR3JcGVaI{iI$2V5##jcPa$#{f4rTXPx$(7!5qs+hN$Ah$7 z6gXCZfqgkQfC~@OXU-sP6spuMs@w_3@pO^uRw3GlXb60ebINpVo>Z@h0eRE_R4zg# ziV9yd{C5M-UnLd@}j~yp4mq9|*S6Bze+HWbBwKxMQ zImMUD{i$4($T^rk%|2?Z_@^E7sbs8haovY8yPCiqBgWY^+HuKXbe!cY{^eBhO5|`k z-M&+~RAFH#Y4GK;r^7f%#z=`ABgWf*RW6e;4@zPgj8OOh^ zPc=e`94-^=70P8uA-HVw<+5LlK#1^JE8X}NgS3O=mNV_glw&{4|C0NCIrfaCxJ8K^ zE@9gqC)NcqK}ufmY_xBE*18m)5S0UA}%$)T)G@x%C=)Ad14CI znJeLd&rU#P3o5T*&93N1B_9`MDt?K|RH{6H$|Y3!Eh=|V6y_OR5Y&<%!{_3`ON=obgtSMCC%Nl%g{9WK^c3LZ|-~b5U7* z3Mvs)hK)dF87hCF$_i9|iG${fb*OaGLGZPx{E;d*qf&=sp^BfOl6xwSn~HOBe2xny z6%PV(JT_IUjNUaFL!dnXRRUD;5-PVaZXPrL%ooou+GY`yP(HDr?jJW{ghRZfJ52 zY0?+s_J9G4ds3JH!N0)mb}8yC?qd}<0Ly5}w?b()qWR2LCFR)?4ZO*0*)P&cwHf?Xop{Hdoh7)+RA1{21LlF9^eey&Rx}Ai!_zK;S6q>bZFY$xe z2T6hvo)o*$5xbSeW^LL>FW#}>%Y}Ch3EpdOSHW4>iAwJA6}&4c*z5p(H|_Bgdx%`X z*6uLYUZU1MA$<83-k$X8k z#qpR{&p`^u*tCgeFr66t$gT&GiLpvSIx)6&g`u`Aej4PHS*Do}{`A8gCDZXMK{y>P zr=wM7<>4OGnNVa56bYWD8>d&1zuBKUitO+zvb!tH5=D_Wy^8!z6#2lbNU_rqDMdjy%fXzWhq@R|_qC(+qiUnz$di9_H_BQ2G~vKrN) ztQd~EU^2W|122AyE)~tFEE^{q$c-}$B@p}zFih6 zixAyK0%v2P;r*hlhDL{ku7Io-^gf%OO?pE(Yy>t?ki{~tq0Nz=B|Lyi>51iG)`B*v zm!Sro*wLKUw`T5jL{`yd<&t~k9F6Gz4J{sB0rRUwJZ)6RLOIVyHCklTMs*saNw!t` zxX7SwYJq|0*(*g6t7MO$z1!5(nZ^|I1pNY^+do5Z6Ew30=}ef9B4MVIX|MPp0u21! z{vMqT_sr`>tr4QQosemmc;2~cD6O#gXtZ8IPXl@|!1o2%d1gXxb7QVOyvT0nH`yRv)PTTEneC}=xJv~WQI&HjZ^r*3{xl<@w za4%vQjL)<6eL1W2HWyJ>Dv`d}W|iibCOO@jN~ABUStZL{L@rUg=a{~-CqFM9EXITh zRND0ZJjcYxe{6vTf4+DpVcHT7c!_CCuNnZ{dQaSuV zh$@N0dG<`@@HBDw#+Sn`hXaS@_d;~EWqyGf_9o@>1#ua0wx2gwr_S`jLgWPZH2XE> za_mHK8R5%iNh+67LNr`;nQR|DU3@Z=xGeDHQs|8AwA;oQW$DTpf{mX0N|YJUMsm@6 zIX!3Ne23~4UjexSTzP-HTBvpt)yY}cso32lcBddy1FG?S!&v6`eL@7T{0p3t^?`B; z;b5oa6<;pJ8~JL|Kl^8ZkrsQAsTS<;ybMY*>n7*;7mtCwlw~jLPaz zE?bGqFd;}aZ(}N#kwWC?Qj+zMa@j{*=J;~im&&Eu%Vk{F_sV71nc%X@mrHSrF+nW4 z)XSwbYihapB}QCs_vNy|;le|HpAcESFyv=s-Ju*FBo43pa@Z>zFj%-Cd{}sLzBPzW zFAtN(;fD`8X0Rx^&#UC*tiP!U3+9vrry8SD-9D~0#ne0@a@;;OtN1K2l@0_-PWI)p zA(cys5RJ9WFHoMhwa+5EY;x^#;#|zHSg~+j} zGAlS!Ecy_XCBOIOvL=vt}rl!zY2um%d!~rgF)e27&lFx}1}BjdEE;Tuu~% z)G;cKnQk)DBfMPB&HAHq*+5)o`*K<1aG72$1os439qY@pu|C<*>P2*~=!MD`R2hiM zk&{t50hQCKaw;l|s4@|iOQ=$g%5A8Wg?r(suL6(-fczIA<}l~Sw(}+X0FNZzCfi5oKkUF@cAbD8WEIqapyQ{L6DZ6%JcfT*YLg!-dLL3cVgrh-l z%((5_&4T89BFu z9Y5~&Ds<$B2>wCJ)(GXvHRhzvyt#D|`i-Y25fohsF@f@&_ms)Vslw!3R7zs0Ob~;e zv>5S4(Z|Fag{sQboUzcC&o_6Xv$=h`SE!ux*)HdRLLR~ijlk(bxd@^sn#^N8*9nB4 zh6xPLxt&d_--wQ{+GxcpcM zQuSyRE;xz7jlvsir1x~aoLek_zkyfyfkJcXymUronBnC$xVQ}rPUiI@bEu11?U2#I z`X;n;w^`_1_nAwdD>B^ZvDUmQIn#G^nRYQjh9JDW=&fuV@OXkmFNQl&JFl$oUt@hV*Knd3mVRU z5fTldv*scs=rYfX7)&!I>V#_bd91vAs-*e?(-->LJqoezlx{iEK;EsftTwRW(fYOp z_S&2Fqku8iv|EKJuNFOaO5<2GeqnmxJo;wz$B$gh&*tJ!75PeYEX@Y>Z+_FC) zY*qrXpAop%5OVax{r#)V{r#^5mUg+}Si(s&(>`g!7jU2WF1&<{-iLqv7Dt8qP3;o`yHocTecUAojo^E;-2 zML~xqt;4jH(t(xwjWk%PFQh?A{ll%4J_bpbs7f^-7Cq>5!hBXe&%SPvQQIp0xy+5; zOK`Sl(1D3&4ouSrBH20pB^dE(AZuEO1P*(5Yo%cp2B!2jX^^<4$zI+JiF#bp{;}PK#oY$)x7dCg63i>5pAJr_8sXP z5@{P{ov9o|eDj2FrP2E&1phNZ~K}Sj0ELA}_k;6yJ;LH$*Gs_nomd9F^^omzt zY~V3wsgE!6YhYgj6e7tXtMYmhaeClgBUnVtL1J7yF3z90!(yV5`8Wxl5GaTFdG-c{ zenKNM5f?WJsylWieO@?lW?%_+l;rVFPKdtESos|JZ&HB1vI(5TTvZ&)N^pKL)S~0X ze0occKT9m1)vW3Pj=^&XPur9mHTPn;KI_;Z9jG(hnzshV54L`Yzc>i6=(PazeMV~K z^Pf9Wv#NSQ>)vB_ph{eY?IA9iBh(85m_`4hQ z=5;=O7t&hL170ckl%e-2ly%6bCU!PbbU`ab6>Q)a$LZln?we0*g;n)5@PqzJ0_j0> zm%wxA(}&~*I{e9}ig6JIhE+8H+8!MtSJ1m-`82x5^s1%M>zFNMHoawJbfHZ){}bvs z?`(|fVCx+GrOtH@33ad*yod!he+GYUmtJEteA(9va-dGZui4Tagi8Lo+hIa#z-Ho{ z6Qb3>>PrOF(Z3)7J?)*;bC6YaER@Q6;54ANU6l{H>K!&A`07SRK?22XR|s(KldWYFKqn5zlHlYpW%pPO3%gR{tS zIU$-GRd+)Deyb5JU}(5`72J^B<7g5p)S3beaNU~4q^TyVKwU_|M{VR(gbY^2bJ^!izo`0VGH~=}JN6^3O zuOJ&zN)qTS$1KWK7h=qYOd%khb|ptj&}YNkqpu>)bW+2P#_|zHr@rA~fY5&?&8He9 z^@YB38{z)^69aS-V^)Fc9C#e>atBW6-M^>ZdrmiNaMp?r{lH5Js(4Ft;j2T%zeXO;IK2~=KI!0z3%Cv_k=USzd<4~7ao z`=`JU>*a7AhhDv;nO)wWn!S$*oHUTS=Vya0o_asRI%y!x6jeZliFP8R`u7K;2|ylB zeT*_k;FI2t21ly?SeOR5-~~wyFsf*TjFBWC-{aRNqPzg^8hj%D9L+Xlt8K?5sm5U@ z9h+oG%|iAFD#sNC&Kzi5ND3DA9K)s!$#y(|XGDukBm1O*g^+)I5u61v+$2Ao0AkXQ zEkALLt8r4#01*rWjC+u4hErONA2?#cg~Srs$s&~boFYtlBu6AgmiO-)=$9KVxN$No zT9lL>geyk6nh2WWq%wp(6>M11lLn?R8Fh5vRAyV5xpHj) zF-g_2KU^EIf(4r<1A7{iLC(0OekqJkPg)cN*?5vu6_`Ij<&-L45;~zsv~Y}@XwcVB z9!QeUaBGRT=9A<%7+-|Ph}M&OLIxfUqBa&9YLS2`Jz)cV9AK);EufnQF_y7zx*;Lz z8OcE-Pn5fw=yO)mVjaGjsbiYrhzeE>{myo~0M`(ND@OUufizKOy8$G(GAZ}WfdrTX zfJB=CR5@~cQY=m2xR~nz5nu*1&jIyp?VY5YUu3yw04cG+q2%Z^-On*V>NrL?R-3LT z4I}`j;8t7)4qAtTSil1R#CM@_){a=W@INpz(a}D#skN>-Q6C-IHEwKV?3fYFO|6Np z5sj^hkxQE59hRFUrIAkGu~NvJo0g1htgB0>K%O8Km&&U(8gIgXYvhu)c)U5<8m(K_ zF|s|eWJz1c$l6$JqtUv%+dXS+iyf7-qh@9V%07ws)I+Y zj(B}j+o&RZ=!fdpa7SC+vS?g-qF!5H z-)>q>tthd+k)T$h0Kbl=#@5t!Qgs7GWZh)EJH9 ziy}r=9eE|$Ki1Yv#({9cl0;K;d_+_08RTo?ZG0?7nTF}uQX5}d2Mfi|MB9jxglGMAV>AxAKDe+?KsAC(yqlbi_UU=kW4b^UG&F_5n5Q z*K_YWD=TQf)jk3H@o#$t|DGMN&kDt70``ygZGc_ZD|mVUtxwtuO>0cD^0b$55KTemP&92|ON=(dHwOzgCKZ=89{x`hijcO*iy6L#L(t2;~A+0j?e zvscAeEUY+f-DT&TYscb`gZ~{X9tQt|q0lzF|DJVLFe{J~&-u%ro>{jdgkeFeIwyF- zk>@79>#hhb4ZRjTq0bpJ&S39LTt48_4~TV5z`-+dwe9Dcw) zJhUw|`USh^+L?A)d|`Q+y=p?`s9p8fcCI_6Vx)a)XhKKlljkizZ~P2sbgtd_F4(NU zuo_&x%c@3w-GysW|30hQK5{LZAFm4aL;KHJ+wAdcgSl8;;BEbyy8T>`Ty)*)vq17$ z0J;S2n^u!`9|c1F?if11>Esos9|Z7<)g<5__~H`PX#l&dwD{aA(apBXxDnE2rw>>hnjdXlxd+_)pf+rrarg;4N;7Ny{8$6}Iy|_B~ zgZ`m^xX}HJuUT)GgbFY1PRzxBySbYFuBaw0-d|2y{0&;5aRaOLX|K=(G`4W~e%`CW zegu9F+THEJ<4J*cdcl&L1KYaoBddRJue)Tey)v}+$#o+}HitH?D@`mcO)LwIShsM* z$YtpC+VT*M;?CZoe)b1e^=sgJGYfeFLPj(;-qv07Y`1;GB_!Z)%ON*lZ|@x(7PuYl zKb!VFy&>-%Ymfcf>UTp6XI}UEA-m^B`Izq;jmC4w+@&Fh0URkySQQMG*CAk7Mx7scXyn|;FX@C zc<6+-Kifw&*m=Q`f%AU8BJtYziUpz3p*zlvCdxz4T+wW=3hi07@UpM$6G9Uf+68yn zz1Q0JT@oq`HLjbz)$V(T03(^=+V1pbY8G& zU1wndx$}#KrLWnK1omthzb;{)|F9hm zt+fwW@L14Z+p!0#uIm+g)qb{X&m#$d9$ZDkx+lAO;W;}mnE#-+uLZNv27K3;e+g8F{TY99v0dbtm%Ko_?e0B&O{>7 zdG0xO#{@fnt-ZWDw8rlLu-#IPzw1JY(5BGPlS9pS*H6E4+PazLGoM+v`J8p#cIR3I zbZ~V4Xd|YV{wX^Ai`&L6g0wv=X(m0E6IzQEaP`dXGcLOl&<9tN?vLdJO9OVVheQ7e zJsL^`Pd+lV9>tLU&BI2&Zk`8vJw$MjRQbzSxJ!z zL}&zB*KzCfoV!rpgn$O>vz*`$$UU1G_4gc#(Q6HAe@=*2xQ&eYf-zUGq_FxTCsYK) z)q>b|EgIKwapne zb{CEA&ABu}?{(2w{+OxW@1khFA@{D=-e1gQGcx;rY`h z*+;#5`?H(NXPme5mzUW+COlJ0{ePF>DgB!scfCeY`DlWo>DeBkwL52aKYiV^*U_5y z=T1`k&b)`4g2VfF*w&VZ0?2qQ&*y6@07^GS|tP8CHFu zz@v6ewY}-WcSB^7P9@SE)tn z|Fb8}zRTjz@s4A%tZUMtI6VPnAL&ocP~ZbTE=|I-G9Uz(3jl(N4#?Z{tAe$W}k=Hewq7jxBYc+o87+6{z-r)&a-jy+3VO*?R_ivblXp5 zZwtMT)IJC74M8(-m+_I~ulnq&*!mpQ%Rbn%g>}RwUBU61U=Q z@!DpKP8KaXe~i~Ii?*Uw$MkeE*Ab0J>cAlmNlmShhT4{<=9OF}p-jf-jByB^9qFj; zj7FlZ^;Qh0bd1D_@90sHxYe<|U8J#sk;bNaK)){4xbIJ@kZ03sErZ}^oQeFk~ z`OG!4B!Uxbt3A3Lmmx?C*h!FOR#OL@-L=wmWfu~*!)i!0H`B8Lb#2XUtxMZFV0fgi zttD2Aljl~5a@;^Csh~n);Yi)mTI3*%)Fs+M+MH-XJrctOhj;@}%h0Hgc9M_c?eVr| z3#a)_R((@L1DiqTx6qBz@KLnhIBiNM2qi z%xocY8vjHG4FttwM_pSC*Hr2;dag?lR=mYrtq{TUs-{jln>$b_;6hiN$EG#9B0?T) zfb(bu)+?6%ORl6CgeZ#ldJF%XYFjyeNtR4^Hj`X*>R6)`SYq&6qP0A0NM%ZQM%>7& zkyso?McX@DYcb8(1|tpL79%vyaJh=6L;~a5VPQJ+WTP&TRnhh~OUAi_6^QXXgOs_k zL~C8#fvE96=Fzx-Q)`^B>|nqV zjaD?)gcXm6t`>uVRY0uc#B2bTWH`S5xyuz>zFZ#=1Ar2iVB`6 z2oLID#s$>Wpk-F7G!zl~%=gkL=HU`7iS1Ewfvl6%lh=?09NN%a+t@M6qCs;OEglA5 z7nnCMlnC{D7-O;3h@A+#RsybA6<(p#e)hZ6F+G7$x8c-)S|) zSU1v({55~pOrDF5?C>q=AEUd4Mh5QFGWz{BRN1=!xOO_@#dx$cnkiEk>*%f5=%&v^0`>Zu-u#dMkWQ%DFdM~?5Jm-Vd=%S zUCgbd2n*yqbRzq`Jt=Wxc&1QElt#1b@rf0OBnbfznMwivHB+L}E z)1fCVmQAgsVNwdruUkr%VW3Vm#VAvZHpLiIlsK^?Q%8bkX}qO5895yg$Al0AFW0rT zEo+LJO6 z4sCQE!a=;)f#1+_d{TLhh@(x-8IUZVK z&^@-Yy{U1jnado0=2#{Y?J_H%9M8nth?GMCOAdt~CW1L=s$Bw(4OrUP7qnH>w`2LN zr%A`NSQlh>K=Oeef{VBJcC*&-vCfp~RoD*@Rkh8rrL}b66(R3iH~?sZk%%Uam1O8U zdlJt9UXkbq0`A1iu^7}MHF!n9j>HFlOPXt2>97Kmn*4`p$22K((Mq0}Ci`=M<~h zwu!YF0v`LairG`Er}+8M9M{Ib~cLW%&IZCFkl zWi5=s4%`-ENgM&RP12zcBCEDBYGE>`@0e8j}Tz*3+DA8tfCc|z;HL7PFvteH?7g99(nK8ZNe+qQqYv<^;ppicTGCwc_6BG7dI#3_|+Q znug_}wT<9$JPCstz;S?`A=-(xqXUQAaU3CF+$`KAqfHb_wsb%%4k<_{;WDHtvl|Bj zw4hQ{V(G(bN9z#9q}g3?aG|?9ghCO7quGPVXJi#_o#HI8Dc%HUVyjU@X|kEcIzkbO zyQy?o#Rnbj@mA5Ah%vUKuoB1Fxo=1*jMvsz}6S2z&Wke;%b|w(bU^Fx|Cpwl= zL>Z`%kbW{i=H!x&7$Q(vDGW_fU#R*ze#pt)KdA|NwV+PX4Hn4&Wpb=8K)Dk*zd=WfZ`l2yGW zw532{Hwi93i3`mGK}Zo#3PB%-V9pjpp_tc&qOY5xy?~e~N>f+$b4c3zYzY|}uhyD? z>So8V`C7fBDBt^O{BP+K1)3AOrB3ZYj!Rpk*!yGpHo=71J_ zBh_9G`%10e=ztcew*Qp`sa~%;ph~TN=z!7!Uz1!VHK?2-)aN?ADplP5Ns!k%z0({% zQ5`*BtD6NBv=Wxq^@Szd+VpKpCSEffUh}l7{exEAkJtV*Uit>w7sFMrN`3#U;A98n z)j;2$`*}){Dt-4rEO;FV2w1;K3rqErO|2(Z;@CA?YIjv(5{!^zEMgnHhACF^V3{0PbFhRtAB7n zY5V$rK%#kVKL2;pmFRmRf;sxeUYhA6WeJ-qrLQ?kG*gJcP+vGqV|b}7fY(Xs%TTk^ z-23l{G!c!yL5rE&B5RsX8K0xB^CUL3SC)nBDc#k8@t=gg=7DJV|#sO7oRdddO>R!SAE=i@;w;j-2t$yZ!Dz%#QMB4KEspzLlVbnB{ zPWq?`XH^Zfnl2}eRujUgR-o04Hfgjv3d4oJZ#3wKlU6C~M z{B$GFPdD=XbR+SeQ|eDY#n3R)cnwBt1_0FrAl<{RmdzX>J)*cswrPMamg z5|k?6vVK3(NbV(mK~!o2pR}k{+QS?lrme-A;79ZLfSo4qNn;lj|7-jnX2q=K)?o9Y zt!{-5R4QNvrJ$o7R9sPB^Zr{%4jbh-*h`|0{*90Zti`WLH5mnq)1zQ)}rB+qTfECf9*Q7K6X;r5o^s+oZ9p|m;N^4BFYNc|6 zfNA|O@m$av)vXehJ;6Net>MCVy5pKfTD?F(IrtJ*+#1}iZ5`DR;Pf5$!Hz;YY)On) zg(SwS$Y_zKV+HqURmTXM-2P@ACG{)=yTNfck*TMPN>)?Fsb#OlRIyfJD9h}!*&12=V zSJO}V+3VnZ>~(NH_BuEpdmWsQy$;UDUI*u6uY>d2tI4!n_WpKpn5q2ib#OlRIyfJD z9h{H74$jA32j^q2gY&W1!Flb~++Z$yHNTgiy$;UDUI*u6uY>ck*TMPN>)?Fsb#OlR zIykSrnyt)buVy0iv)94-*z4eY>~(NH_BuEpdmWsQy$;UDUI*v3SM#d5>~&(nXFqaq zKK42|AA22~kG&4g$6g2LW3PkrvDd+Q?bUQ}E_*fAo8S04I3If*oR7T@&c|K{=VPyf z^Rd^#`Pl2=y!LA1I+wkgl+Mpy2j^q2gY&W1!TH$h;C$?La6a}rI3If*oY!7WtLL&; zQ|9^E>)?Fsb#OlRIyfJD9h{H74$jA32j^q2gY(*}2>@O84vU1D%FkX0=VPyf^Rd^# z`Pl2=eC%~_KK42|AA22~*IrFk=(1PS5c=8c;M87C3xQ)+2j^q2gY&W1!TH$h;C$?L za6a}rIIq2$RMBOxCQS6R*TJd1nvw(dIyfJD9h{H74$jA32j^q2gY&W1!Fla1mNP0% z;0V1nwPV_enbNp?qX``SeBx;4&Wr`3f5Vs_ftn55GTUmMOaU5TC6bu@6( zWw4wPpCBa^_WBo8Y>VrUnt7|E#HKYZURF5cUen_0#8vH?)bu=WzkqdKrd|^qAL2sc znbL?SmDt~$sb_1F=ujGwy8eer_7A3Mu0*#biFRisdNfJ2CnM3`B+-j$MCzz3PY<(A zxMQnTO->01Z*{z`nY%#e4OpL>z3JQ+`EcLv!+lXY_q0p*%KbetFkn?{RYMQD?``oO zy)sazzFw} zAFaB$@ABckIGy|AOuDPj1J?Ooj|1fOH$Yx*1LXBJKweJ+3XK!1J!VeI^lAz zR#kP3%|5?y+1KJ#pDDctFwkoP1HDEt&}#+*y@oI_lgl-wBW`l2g6B9ZY{aVxsJwar zf)z6r%e#UG~Gp4FEEt+=t8MDJN zMuz}i+|lxs7^4>YN7D{JQ+D{7vcu1m9e$?lNHawboHjTIM2&i^a<2ob)#`9r++jxg zVNAek^iDhFo;-+Y&?-LjVP+)V%GAc&Ns(H0iQM2U@5zI(2CWv!6zySc3whPhcDg!I zRp*~cbq+Oa<49*OtJSJYosB-~M7`?3Q-_*WHx1bTosRXYqf7SI7N;S16Am@i#Thk1E=Mea@L?{ z1wE`Seem#p6+L>dG+OFlXUWJO2HKdlB@_egmXJdAgn+SlQ6N_1$E%OTNWPUivA<1;Y1A zDd|j0>o++v=W10`+Vewc+88YRh|e+NJ;FjseU9em2#K15Gjglb7?I`;rBxTeO08;l zUn|qqNIUF*(xWNVcvvrV>0oH-rS+Bhx@<^#GzEq=YL|Cjx^dp=>Bgx7T8^0z=Bi7E zW}@%*k>TKcWH>nGt>v0@8Jcw7Plki@k>TK!x0WBJ%h>yGeC6PLWH>nGt!2T)Fjr?w ziQDX&HvXU-PXVOVTE>L>XUSeF^!?1e_6YU&$zGa}{ejHAhRW5BbESkjI*2j{kTBwfEQbR+- z0;6)TMz1>0HJT1irMO1Z!6|Poy)qD~Ue^9muMD)*eDZoO3S~7{eA-mg)bcLcA!?ZN z(^6BuyJ$6?dm3NwF(Gu&6zyrW%FlH{U-Ou!(Y`0g^)A{M<6+h?jaCz!yJ$5xc^d7U z3d6)jt69j?Xg8>@G%?0kq z$HBQ+aPVf74G7r zX~6yTad2Kfnk?MKM-zej@o{ioKEF!$kER3np z6;CHgJK;(vNxM^*PLg(;Af04^*P*RIOEgpA7rmW5V$@=k%yjt9q8^vny)e>?EVK z;8YTo=`Wr`!}Uk=Xt#;dd6tvT(?!KqC0!<@IXKuyI_++4D+@g6u2of6Nxdx98EQF( zSo3SA4TbX34*`HyGh}C^9W0l~VU=c1^s1oj^ztUyYLe`3eR^C^Y27$4p9T@-;-jgu z)710f+qyW+9MfnuC$qkP2pu%lavJTf6AY6Fq|{He{I|5zbY5WSbI&nlA1Px}UL@r` zQhNK}<>|lSf1vMOZRF@@O==dJwtkDn%YVDzXPj&3woCbhlrKv8wv^ufKNa{dr2LhX z4`iU%T+lO5GV=737W#_*GbbB(zf(-9?=;UXGHrbYSI5lz`2x%H({C3%FY?}!@?9xC z{&N%?=Id{oNcO8I*!_0?G~zx~CAU!}aB5|W!5`buM+=%@EL z^eqpszIyhp*M9VUKku74Uilm3E!JO2`HYmOWzfef|9>k_Ut{g#;onEz5)Vx_{!sh> zCwX3bULIxo-#6Nn`VN=!^U|xo_lFIA@#NHgUi-ZLkC5>?O3LG;JWXPo}0_`20I z&Kk#h1xfcF?|HI!zwvIn8W-NU_ufqN+VgAC=V2-JO)h=I$xDCT*f4`MPBQ7Q7k2ch z>;EhLRUdt_ZTe|OKfN#L)nD%gek*j|yMJE#(>?cz{wIH4E%et*>Ai*J<^Pu4ulc)_ z2c`U8$|L0-#c@)4`;QlRy_8F(Y{@`>xxnv~@)uIxlY#yTfxjf>t5WWh@>3}fN$J&3 z;gu7^jMAGQ8n0e@rQ0F&dRVFby!1+E$vpABx@(wBWK8ct9HNn3j<=awzB;{99>U{I|zf|@^T|d0@-%GDovGtCI((6@f zFZ~C5!QZFET`;QR(C@IHFIYr6}DfObVxBp_nH%hr&%1$ZQ zNO_r*-u^!k_%10QmGa39^nVce>r(zj%6FtZD5YM2_R7=a1U)|V?n_?!tL0kjjZ)qs zy%#Uh)LT^f1SYZmhvGfAD42ElzPp<+rL__AuN$nuPL-h z+e@#hD)rNw`UzY8psSYp6<7UCrG9_X%g-w6SlNPaGowU05iXZ%jX&@kvx-{r?c}0K zlgmfMYa6A7?@kxdN7?H~;5*Dk)LL4L&-WJ9uWSWBQ{pqjjKNo>JLuEi?nVT-_Goi0 zb&y)DIc^p4_kN4;@oChN#GwheHvaT*QFLjfp&g&gkKoJqmeVplBDKgru+sF<`UQ0$ z19xPgse@>IBb)vdu@u8`Nk@lOgbyaS;QPiPjV?(vqH}F)Bl0vzlfPK3s3rJhd8cCV zvFE7P;V-SyN9BcHIHfuKe+w9d4gvfRO2=`*FxNOaJ8FZumHb1r?%z-}a`9jL&kKgp zLN0p&6ml#1Co5Uy+Nt>K?jH|^86KDZ$8#(B$J>7jP+xujeVfYP8Vob>Rsn33GMk~u zd@iLHvry@Y|Jr|8c9>Daq{EtC+@vJ3>?iGCV8HzCV;gntzoTE6F+2Jhg4NW~_4E4g zeBi!!>3`zDFjJp6&~z%44ywP((Q+Bc{^jaF<0#XA#!;sK8dI?T)JOFfu(b*m@~QIM zBmMVC{~1E4^0mL(zuwco&!8~(=tF@;Ke39S2So-(zbm$|Tw7kyKUst^F35M{jvC_fQPoY0X#V!9w=Y<*dqw@?! zo++Ha9(Ankz)*kn|90uWUHXTII9<7-dMk7XD(?RKE)Fwl-^GT4>~sIT^6v-I-M?#f zn8~|Vn_hRRVy5YgpERxAsPx8vngjIPesztMT%^(K_#3QcJ%>s@{%ijo(tpR*|5^XN zAS3;?|1Rmj>p$%OCi+tBY5xbM|AW#$EcR=Bs{T3-?|bAQy0!)o%Q|!|7a8qWJ|Bb3 zt-rOg#&q0hih>OO*ZyC6`WJ3C{R=mn{>`Rv{uVklQ~3r3@lyM@OaC89{|`?~?NFH7 zw7y51^e^_nwg1^3IMLEi%MdDBHyHExb&+4=2BPkz9gv~_>03<4X-iTWc>52{(EpNy zrr!ge3FGa5YKHz}$+7s|Lc#6&dHYY4{$BsRlxHZ1W$3SbW=MaR2(ErpU?{$wmWt7S z3Z0vw|5p)18P-6T4&MHK0oT}3o>Y#F8OmBu2Tzm7(-Y#%X74IPxwXIHdOV8B_^)xV z`wy+Je)412nEqou3$Rzd;qL#}hIZqE;WVU;)q0*U+_vJr@GNVqFFf1Q;|;eE8!M6? zN2J1YEj>O+g@-KN_fz3{mhR`N@E(@#)2Z;D*muKj5Z7(&+`6y2k+#*#()}_O-rLfB zFcqF}>Hd}q?_=q{l?v}`>3)<7@8|3@sqp@m?jNb}!!6wxQsGBfy56V4kHq?2;|6iv zwgyAzHQve?Ygt7C*Q6&wSq#PqT+dkBg?@s-!;%%`3W3uyNpfEl_+MqAm?v;ehOtoK zw5<^RF1bVfy1+XC_wx@OP6e#=IJ`>u?5hl;mi%o;mHi<8QOvypuk^s50X%?s+a>$A zsAHMqqx5+}14#U19zH$MF<_<7uMW`r+4Tda?`sua8U{u3H;&=y_7a63pDCbcedPF8 zXUI&zE$HK&*Nd2cfi+C*B`W$gF+6=Z{^{%Rwha7#nF0QU@SoxF|L+7|DR4CT_fiHv?`430Eqtmy{J+mY z-w*4V-#8u*IQgeW_+V1;Z$t+Au+raH!*meGzo`P(GzrRQw!lC1jQc!+7m8dRm-Cg+ z%{9zd$7Kn_3#^Mg@!0}+AH?C01a7pkthn$Q=iz^mz+d#}vqs?h%7n_j9B@Cs{aENX zdi102sqXfRyqyO;?FR(Uv=tltV z=ZCQH+3)dZg~0cD;BzzZIbZ0vd-SQ#K))gb{OSzw8#2Iu4LJEnKkKZE%cBZ^BsC77 z%D`u@(C-s^jsG_Qr}!)sKWKb@l!4FJ%IAqxx!(a^sGVKqVYndXH!g!Rz(;0)PX?UU z^EIAvpT+Qj)`uQ_&S7}+I2`KnuR-Ydd+3)5T(h32f4Tto(|^6vKUKqgbv|C1f&ONp z4|(Ws&p`ih2Kdv$XN+gvcp(G*pM}1UNA5nR?`7>jH_ZA+`LAW|&%h@O2fluOC;*(| zv%tguc!3WSJ=H&_2>g&|-km1!Vvk*u0Ph3-8=kEZ4NWl(a6f&{VR$dgd#C1n;a}*{ zvr*t-f#cwef3Xbw*D-y8)#Zu9YckN^mI3}K;AEF~U)Ym@{x1ygWjS}E=tKd(cQVj_ znE~EA*NoR-kDreO+|QrKXMmRopYZQ$SPvcF2@Ef=mU_l_iqKo0c$k%ee{BYM0`NkX znEK~R;a}jfYjXxZw`G7om;wHj@Sowa_xBm--^&31ECZY_`1tw1C*U-{`gr`-F9ZFF z8Q_xu_w(C%!oSjES3?FqT^Zo(Gr%`xfZqZ**;Vb4`%{5G<(Xf*1YYBze~9^~U(b0$ z=+_9nuIJARJmm4`OUx%Vrl|FP2Ke{NU)Ciw`In39aAemGPy7!8+;4oX+9gGGCJ8d< zxaM@oNO{|)iIJULw8&^H35F^8E47lDwo~&)r>0F$OAcMv9`A@F`!wW6B4?E$hj97a zd65W`>$XQ5n~+2qiGy1r=+=r`xIQ4H8%Db0=C&nBT8oU_?a1Pr=wfx7qsYKqH1_n< zCUQ;J#E_D zsq-T9CQYuG8sX%*?qs^i6y3C>E>hQ#V4EbLeKgh-i*i!$B~3_5jEuy{ogJ->BZV+0 zRHnqgrODq)_ zDW7*XGBE3?!7Liad6Wj88JiT_$qdyd{c$P}y00HeCZFcK#FSbZ0@IX024>0{O@<+b zIcJro==3B-hRGeNG8z)i&6M$)Q^%*GsQ;4Mjwmu9BTY7?rH^S|Wq?TM;i;-&JNs_9E*u-ox+mhL^&4|Mr zuspR3>6e-joO045ojRqYN9y>d<|O?X_UF>}B!uFC1Uad~F?1{)PEJtb>y#AEb;zxa z_;9B_ug6d?t2I<6F?(HW9M6Clx0%e(?a`LDPIv-(wbv&+(L;nCl&)LCn}ZYe7r89HGMip7E6CFqjAFD;~b`ZuX33q%YCMo;G_`t%mFvho(Bpivm z#kF-EofJDvDj1ogoYI?})f#KZ^F0k#yt%1Gb8L4AtTq9mu7!e@9jnF1S0-zB(kL>N z6TL$}ic_+RW*Lt)9-l$jE{jHENH|U-=}xas$~U(mW4rOGMd5>IchHs?avOt8=_WUM zTWdp8J?5Hth11a|v&3_#VB%8@Cv_ZMGzPZe;UAI2-hlhKA3g9x>B(VjQ>$@xN@n~QUTtE(uv;34KB*)*5<}SD=9y)YvpOSHve%V0 z*LHMZeMX!_md0C}Q>4KfZl|nA5gH4PpSoHkcW-N3)h`2pk*J(w& zn&RoGj;6-eT3FRqN1PjY`%b08)|km$$Lj^gyQtNH-1X6R4l$n6m}|h}pI84nnst#S5j@(JM2)ua%v-D( TPnBV=LP!!rBZt7tWc2?9$D*v( literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/support/.libs/ab.o b/rubbos/app/httpd-2.0.64/support/.libs/ab.o new file mode 100644 index 0000000000000000000000000000000000000000..446096ca9f3f7485940b96dcd9e1b2662bd49a31 GIT binary patch literal 194072 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
    oTt@;MW^x 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/support/.libs/checkgid.o b/rubbos/app/httpd-2.0.64/support/.libs/checkgid.o new file mode 100644 index 0000000000000000000000000000000000000000..9116a3a98683ab7fa9925bcc25f176e5b260d022 GIT binary patch literal 12312 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

    -öznitelikleri\fR ] [http://]\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-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-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-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-s\fR +Derlendiği takdirde (\fBab -h\fR bunu gösterir) http protokolü yerine SSL korumalı https protokolü kullanılır\&. Bu özellik henüz \fIemekleme\fR aşamasında olup geliştirilmeye devam edilmektedir\&. Bu bakımdan kullanımı önerilmez\&. +.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 verisi için kullanılacak içerik türü belirtilir\&. +.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 +\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" + "" + "" + "" + "" + "" + "" + "", + node->url, + type_str, + cache_node->size, + cache_node->maxentries, + cache_node->numentries, + cache_node->fullmark, + date_str); + + ap_rputs(buf, r); + } + +} + +/* ------------------------------------------------------------------ */ + +/* Cache functions for search nodes */ +unsigned long util_ldap_search_node_hash(void *n) +{ + util_search_node_t *node = (util_search_node_t *)n; + return util_ald_hash_string(1, ((util_search_node_t *)(node))->username); +} + +int util_ldap_search_node_compare(void *a, void *b) +{ + return(strcmp(((util_search_node_t *)a)->username, + ((util_search_node_t *)b)->username) == 0); +} + +void *util_ldap_search_node_copy(util_ald_cache_t *cache, void *c) +{ + util_search_node_t *node = (util_search_node_t *)c; + util_search_node_t *newnode = util_ald_alloc(cache, sizeof(util_search_node_t)); + + /* safety check */ + if (newnode) { + + /* copy vals */ + if (node->vals) { + int k = node->numvals; + int i = 0; + if (!(newnode->vals = util_ald_alloc(cache, sizeof(char *) * (k+1)))) { + util_ldap_search_node_free(cache, newnode); + return NULL; + } + newnode->numvals = node->numvals; + for (;k;k--) { + if (node->vals[i]) { + if (!(newnode->vals[i] = util_ald_strdup(cache, node->vals[i]))) { + util_ldap_search_node_free(cache, newnode); + return NULL; + } + } + else + newnode->vals[i] = NULL; + i++; + } + } + else { + newnode->vals = NULL; + } + if (!(newnode->username = util_ald_strdup(cache, node->username)) || + !(newnode->dn = util_ald_strdup(cache, node->dn)) ) { + util_ldap_search_node_free(cache, newnode); + return NULL; + } + if(node->bindpw) { + if(!(newnode->bindpw = util_ald_strdup(cache, node->bindpw))) { + util_ldap_search_node_free(cache, newnode); + return NULL; + } + } else { + newnode->bindpw = NULL; + } + newnode->lastbind = node->lastbind; + + } + return (void *)newnode; +} + +void util_ldap_search_node_free(util_ald_cache_t *cache, void *n) +{ + int i = 0; + util_search_node_t *node = (util_search_node_t *)n; + int k = node->numvals; + + if (node->vals) { + for (;k;k--,i++) { + if (node->vals[i]) { + util_ald_free(cache, node->vals[i]); + } + } + util_ald_free(cache, node->vals); + } + util_ald_free(cache, node->username); + util_ald_free(cache, node->dn); + util_ald_free(cache, node->bindpw); + util_ald_free(cache, node); +} + +void util_ldap_search_node_display(request_rec *r, util_ald_cache_t *cache, void *n) +{ + util_search_node_t *node = (util_search_node_t *)n; + char date_str[APR_CTIME_LEN+1]; + char *buf; + + apr_ctime(date_str, node->lastbind); + + buf = apr_psprintf(r->pool, + "" + "" + "" + "" + "", + node->username, + node->dn, + date_str); + + ap_rputs(buf, r); +} + +/* ------------------------------------------------------------------ */ + +unsigned long util_ldap_compare_node_hash(void *n) +{ + util_compare_node_t *node = (util_compare_node_t *)n; + return util_ald_hash_string(3, node->dn, node->attrib, node->value); +} + +int util_ldap_compare_node_compare(void *a, void *b) +{ + util_compare_node_t *na = (util_compare_node_t *)a; + util_compare_node_t *nb = (util_compare_node_t *)b; + return (strcmp(na->dn, nb->dn) == 0 && + strcmp(na->attrib, nb->attrib) == 0 && + strcmp(na->value, nb->value) == 0); +} + +void *util_ldap_compare_node_copy(util_ald_cache_t *cache, void *c) +{ + util_compare_node_t *n = (util_compare_node_t *)c; + util_compare_node_t *node = (util_compare_node_t *)util_ald_alloc(cache, sizeof(util_compare_node_t)); + + if (node) { + if (!(node->dn = util_ald_strdup(cache, n->dn)) || + !(node->attrib = util_ald_strdup(cache, n->attrib)) || + !(node->value = util_ald_strdup(cache, n->value))) { + util_ldap_compare_node_free(cache, node); + return NULL; + } + node->lastcompare = n->lastcompare; + node->result = n->result; + return node; + } + else { + return NULL; + } +} + +void util_ldap_compare_node_free(util_ald_cache_t *cache, void *n) +{ + util_compare_node_t *node = (util_compare_node_t *)n; + util_ald_free(cache, node->dn); + util_ald_free(cache, node->attrib); + util_ald_free(cache, node->value); + util_ald_free(cache, node); +} + +void util_ldap_compare_node_display(request_rec *r, util_ald_cache_t *cache, void *n) +{ + util_compare_node_t *node = (util_compare_node_t *)n; + char date_str[APR_CTIME_LEN+1]; + char *buf, *cmp_result; + + apr_ctime(date_str, node->lastcompare); + + if (node->result == LDAP_COMPARE_TRUE) { + cmp_result = "LDAP_COMPARE_TRUE"; + } + else if (node->result == LDAP_COMPARE_FALSE) { + cmp_result = "LDAP_COMPARE_FALSE"; + } + else { + cmp_result = apr_itoa(r->pool, node->result); + } + + buf = apr_psprintf(r->pool, + "" + "" + "" + "" + "" + "" + "", + node->dn, + node->attrib, + node->value, + date_str, + cmp_result); + + ap_rputs(buf, r); +} + +/* ------------------------------------------------------------------ */ + +unsigned long util_ldap_dn_compare_node_hash(void *n) +{ + return util_ald_hash_string(1, ((util_dn_compare_node_t *)n)->reqdn); +} + +int util_ldap_dn_compare_node_compare(void *a, void *b) +{ + return (strcmp(((util_dn_compare_node_t *)a)->reqdn, + ((util_dn_compare_node_t *)b)->reqdn) == 0); +} + +void *util_ldap_dn_compare_node_copy(util_ald_cache_t *cache, void *c) +{ + util_dn_compare_node_t *n = (util_dn_compare_node_t *)c; + util_dn_compare_node_t *node = (util_dn_compare_node_t *)util_ald_alloc(cache, sizeof(util_dn_compare_node_t)); + if (node) { + if (!(node->reqdn = util_ald_strdup(cache, n->reqdn)) || + !(node->dn = util_ald_strdup(cache, n->dn))) { + util_ldap_dn_compare_node_free(cache, node); + return NULL; + } + return node; + } + else { + return NULL; + } +} + +void util_ldap_dn_compare_node_free(util_ald_cache_t *cache, void *n) +{ + util_dn_compare_node_t *node = (util_dn_compare_node_t *)n; + util_ald_free(cache, node->reqdn); + util_ald_free(cache, node->dn); + util_ald_free(cache, node); +} + +void util_ldap_dn_compare_node_display(request_rec *r, util_ald_cache_t *cache, void *n) +{ + util_dn_compare_node_t *node = (util_dn_compare_node_t *)n; + char *buf; + + buf = apr_psprintf(r->pool, + "" + "" + "" + "", + node->reqdn, + node->dn); + + ap_rputs(buf, r); +} + + +/* ------------------------------------------------------------------ */ +apr_status_t util_ldap_cache_child_kill(void *data); +apr_status_t util_ldap_cache_module_kill(void *data); + +apr_status_t util_ldap_cache_module_kill(void *data) +{ + util_ldap_state_t *st = (util_ldap_state_t *)data; + + util_ald_destroy_cache(st->util_ldap_cache); +#if APR_HAS_SHARED_MEMORY + if (st->cache_rmm != NULL) { + apr_rmm_destroy (st->cache_rmm); + st->cache_rmm = NULL; + } + if (st->cache_shm != NULL) { + apr_status_t result = apr_shm_destroy(st->cache_shm); + st->cache_shm = NULL; + apr_file_remove(st->cache_file, st->pool); + return result; + } +#endif + return APR_SUCCESS; +} + +apr_status_t util_ldap_cache_init(apr_pool_t *pool, util_ldap_state_t *st) +{ +#if APR_HAS_SHARED_MEMORY + apr_status_t result; + apr_size_t size; + + size = APR_ALIGN_DEFAULT(st->cache_bytes); + + result = apr_shm_create(&st->cache_shm, size, st->cache_file, st->pool); + if (result == APR_EEXIST) { + /* + * The cache could have already been created (i.e. we may be a child process). See + * if we can attach to the existing shared memory + */ + result = apr_shm_attach(&st->cache_shm, st->cache_file, st->pool); + } + if (result != APR_SUCCESS) { + return result; + } + + /* Determine the usable size of the shm segment. */ + size = apr_shm_size_get(st->cache_shm); + + /* This will create a rmm "handler" to get into the shared memory area */ + result = apr_rmm_init(&st->cache_rmm, NULL, + apr_shm_baseaddr_get(st->cache_shm), size, + st->pool); + if (result != APR_SUCCESS) { + return result; + } + +#endif + + apr_pool_cleanup_register(st->pool, st , util_ldap_cache_module_kill, apr_pool_cleanup_null); + + st->util_ldap_cache = + util_ald_create_cache(st, + util_ldap_url_node_hash, + util_ldap_url_node_compare, + util_ldap_url_node_copy, + util_ldap_url_node_free, + util_ldap_url_node_display); + return APR_SUCCESS; +} + + +#endif /* APU_HAS_LDAP */ diff --git a/rubbos/app/httpd-2.0.64/modules/experimental/util_ldap_cache.h b/rubbos/app/httpd-2.0.64/modules/experimental/util_ldap_cache.h new file mode 100644 index 00000000..2c1c09c1 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/experimental/util_ldap_cache.h @@ -0,0 +1,193 @@ +/* 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. + */ + +#ifndef APU_LDAP_CACHE_H +#define APU_LDAP_CACHE_H + +/* + * This switches LDAP support on or off. + */ + +/* this whole thing disappears if LDAP is not enabled */ +#ifdef APU_HAS_LDAP + + +/* + * LDAP Cache Manager + */ + +#if APR_HAS_SHARED_MEMORY +#include +#include /* EDD */ +#endif + +typedef struct util_cache_node_t { + void *payload; /* Pointer to the payload */ + apr_time_t add_time; /* Time node was added to cache */ + struct util_cache_node_t *next; +} util_cache_node_t; + +typedef struct util_ald_cache util_ald_cache_t; + +struct util_ald_cache { + unsigned long size; /* Size of cache array */ + unsigned long maxentries; /* Maximum number of cache entries */ + unsigned long numentries; /* Current number of cache entries */ + unsigned long fullmark; /* Used to keep track of when cache becomes 3/4 full */ + apr_time_t marktime; /* Time that the cache became 3/4 full */ + unsigned long (*hash)(void *); /* Func to hash the payload */ + int (*compare)(void *, void *); /* Func to compare two payloads */ + void * (*copy)(util_ald_cache_t *cache, void *); /* Func to alloc mem and copy payload to new mem */ + void (*free)(util_ald_cache_t *cache, void *); /* Func to free mem used by the payload */ + void (*display)(request_rec *r, util_ald_cache_t *cache, void *); /* Func to display the payload contents */ + util_cache_node_t **nodes; + + unsigned long numpurges; /* No. of times the cache has been purged */ + double avg_purgetime; /* Average time to purge the cache */ + apr_time_t last_purge; /* Time of the last purge */ + unsigned long npurged; /* Number of elements purged in last purge. This is not + obvious: it won't be 3/4 the size of the cache if + there were a lot of expired entries. */ + + unsigned long fetches; /* Number of fetches */ + unsigned long hits; /* Number of cache hits */ + unsigned long inserts; /* Number of inserts */ + unsigned long removes; /* Number of removes */ + +#if APR_HAS_SHARED_MEMORY + apr_shm_t *shm_addr; + apr_rmm_t *rmm_addr; +#endif + +}; + +#ifndef WIN32 +#define ALD_MM_FILE_MODE ( S_IRUSR|S_IWUSR ) +#else +#define ALD_MM_FILE_MODE ( _S_IREAD|_S_IWRITE ) +#endif + + +/* + * LDAP Cache + */ + +/* + * Maintain a cache of LDAP URLs that the server handles. Each node in + * the cache contains the search cache for that URL, and a compare cache + * for the URL. The compare cash is populated when doing require group + * compares. + */ +typedef struct util_url_node_t { + const char *url; + util_ald_cache_t *search_cache; + util_ald_cache_t *compare_cache; + util_ald_cache_t *dn_compare_cache; +} util_url_node_t; + +/* + * We cache every successful search and bind operation, using the username + * as the key. Each node in the cache contains the returned DN, plus the + * password used to bind. + */ +typedef struct util_search_node_t { + const char *username; /* Cache key */ + const char *dn; /* DN returned from search */ + const char *bindpw; /* The most recently used bind password; + NULL if the bind failed */ + apr_time_t lastbind; /* Time of last successful bind */ + const char **vals; /* Values of queried attributes */ + int numvals; /* Number of queried attributes */ +} util_search_node_t; + +/* + * We cache every successful compare operation, using the DN, attrib, and + * value as the key. + */ +typedef struct util_compare_node_t { + const char *dn; /* DN, attrib and value combine to be the key */ + const char *attrib; + const char *value; + apr_time_t lastcompare; + int result; +} util_compare_node_t; + +/* + * We cache every successful compare dn operation, using the dn in the require + * statement and the dn fetched based on the client-provided username. + */ +typedef struct util_dn_compare_node_t { + const char *reqdn; /* The DN in the require dn statement */ + const char *dn; /* The DN found in the search */ +} util_dn_compare_node_t; + + +/* + * Function prototypes for LDAP cache + */ + +/* util_ldap_cache.c */ +unsigned long util_ldap_url_node_hash(void *n); +int util_ldap_url_node_compare(void *a, void *b); +void *util_ldap_url_node_copy(util_ald_cache_t *cache, void *c); +void util_ldap_url_node_free(util_ald_cache_t *cache, void *n); +void util_ldap_url_node_display(request_rec *r, util_ald_cache_t *cache, void *n); + +unsigned long util_ldap_search_node_hash(void *n); +int util_ldap_search_node_compare(void *a, void *b); +void *util_ldap_search_node_copy(util_ald_cache_t *cache, void *c); +void util_ldap_search_node_free(util_ald_cache_t *cache, void *n); +void util_ldap_search_node_display(request_rec *r, util_ald_cache_t *cache, void *n); + +unsigned long util_ldap_compare_node_hash(void *n); +int util_ldap_compare_node_compare(void *a, void *b); +void *util_ldap_compare_node_copy(util_ald_cache_t *cache, void *c); +void util_ldap_compare_node_free(util_ald_cache_t *cache, void *n); +void util_ldap_compare_node_display(request_rec *r, util_ald_cache_t *cache, void *n); + +unsigned long util_ldap_dn_compare_node_hash(void *n); +int util_ldap_dn_compare_node_compare(void *a, void *b); +void *util_ldap_dn_compare_node_copy(util_ald_cache_t *cache, void *c); +void util_ldap_dn_compare_node_free(util_ald_cache_t *cache, void *n); +void util_ldap_dn_compare_node_display(request_rec *r, util_ald_cache_t *cache, void *n); + + +/* util_ldap_cache_mgr.c */ + +/* Cache alloc and free function, dealing or not with shm */ +void util_ald_free(util_ald_cache_t *cache, const void *ptr); +void *util_ald_alloc(util_ald_cache_t *cache, unsigned long size); +const char *util_ald_strdup(util_ald_cache_t *cache, const char *s); + +/* Cache managing function */ +unsigned long util_ald_hash_string(int nstr, ...); +void util_ald_cache_purge(util_ald_cache_t *cache); +util_url_node_t *util_ald_create_caches(util_ldap_state_t *s, const char *url); +util_ald_cache_t *util_ald_create_cache(util_ldap_state_t *st, + unsigned long (*hashfunc)(void *), + int (*comparefunc)(void *, void *), + void * (*copyfunc)(util_ald_cache_t *cache, void *), + void (*freefunc)(util_ald_cache_t *cache, void *), + void (*displayfunc)(request_rec *r, util_ald_cache_t *cache, void *)); + +void util_ald_destroy_cache(util_ald_cache_t *cache); +void *util_ald_cache_fetch(util_ald_cache_t *cache, void *payload); +void *util_ald_cache_insert(util_ald_cache_t *cache, void *payload); +void util_ald_cache_remove(util_ald_cache_t *cache, void *payload); +char *util_ald_cache_display_stats(request_rec *r, util_ald_cache_t *cache, char *name, char *id); + +#endif /* APU_HAS_LDAP */ +#endif /* APU_LDAP_CACHE_H */ diff --git a/rubbos/app/httpd-2.0.64/modules/experimental/util_ldap_cache_mgr.c b/rubbos/app/httpd-2.0.64/modules/experimental/util_ldap_cache_mgr.c new file mode 100644 index 00000000..178ac185 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/experimental/util_ldap_cache_mgr.c @@ -0,0 +1,762 @@ +/* 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. + */ + +/* + * util_ldap_cache_mgr.c: LDAP cache manager things + * + * Original code from auth_ldap module for Apache v1.3: + * Copyright 1998, 1999 Enbridge Pipelines Inc. + * Copyright 1999-2001 Dave Carrigan + */ + +#include +#include "util_ldap.h" +#include "util_ldap_cache.h" +#include + +#ifdef APU_HAS_LDAP + +/* only here until strdup is gone */ +#include + +/* here till malloc is gone */ +#include + +static const unsigned long primes[] = +{ + 11, + 19, + 37, + 73, + 109, + 163, + 251, + 367, + 557, + 823, + 1237, + 1861, + 2777, + 4177, + 6247, + 9371, + 14057, + 21089, + 31627, + 47431, + 71143, + 106721, + 160073, + 240101, + 360163, + 540217, + 810343, + 1215497, + 1823231, + 2734867, + 4102283, + 6153409, + 9230113, + 13845163, + 0 +}; + +void util_ald_free(util_ald_cache_t *cache, const void *ptr) +{ +#if APR_HAS_SHARED_MEMORY + if (cache->rmm_addr) { + if (ptr) + /* Free in shared memory */ + apr_rmm_free(cache->rmm_addr, apr_rmm_offset_get(cache->rmm_addr, (void *)ptr)); + } + else { + if (ptr) + /* Cache shm is not used */ + free((void *)ptr); + } +#else + if (ptr) + free((void *)ptr); +#endif +} + +void *util_ald_alloc(util_ald_cache_t *cache, unsigned long size) +{ + if (0 == size) + return NULL; +#if APR_HAS_SHARED_MEMORY + if (cache->rmm_addr) { + /* allocate from shared memory */ + apr_rmm_off_t block = apr_rmm_calloc(cache->rmm_addr, size); + return block ? (void *)apr_rmm_addr_get(cache->rmm_addr, block) : NULL; + } + else { + /* Cache shm is not used */ + return (void *)calloc(sizeof(char), size); + } +#else + return (void *)calloc(sizeof(char), size); +#endif +} + +const char *util_ald_strdup(util_ald_cache_t *cache, const char *s) +{ +#if APR_HAS_SHARED_MEMORY + if (cache->rmm_addr) { + /* allocate from shared memory */ + apr_rmm_off_t block = apr_rmm_calloc(cache->rmm_addr, strlen(s)+1); + char *buf = block ? (char *)apr_rmm_addr_get(cache->rmm_addr, block) : NULL; + if (buf) { + strcpy(buf, s); + return buf; + } + else { + return NULL; + } + } else { + /* Cache shm is not used */ + return strdup(s); + } +#else + return strdup(s); +#endif +} + + +/* + * Computes the hash on a set of strings. The first argument is the number + * of strings to hash, the rest of the args are strings. + * Algorithm taken from glibc. + */ +unsigned long util_ald_hash_string(int nstr, ...) +{ + int i; + va_list args; + unsigned long h=0, g; + char *str, *p; + + va_start(args, nstr); + for (i=0; i < nstr; ++i) { + str = va_arg(args, char *); + for (p = str; *p; ++p) { + h = ( h << 4 ) + *p; + if ( ( g = h & 0xf0000000 ) ) { + h = h ^ (g >> 24); + h = h ^ g; + } + } + } + va_end(args); + + return h; +} + + +/* + Purges a cache that has gotten full. We keep track of the time that we + added the entry that made the cache 3/4 full, then delete all entries + that were added before that time. It's pretty simplistic, but time to + purge is only O(n), which is more important. +*/ +void util_ald_cache_purge(util_ald_cache_t *cache) +{ + unsigned long i; + util_cache_node_t *p, *q, **pp; + apr_time_t t; + + if (!cache) + return; + + cache->last_purge = apr_time_now(); + cache->npurged = 0; + cache->numpurges++; + + for (i=0; i < cache->size; ++i) { + pp = cache->nodes + i; + p = *pp; + while (p != NULL) { + if (p->add_time < cache->marktime) { + q = p->next; + (*cache->free)(cache, p->payload); + util_ald_free(cache, p); + cache->numentries--; + cache->npurged++; + p = *pp = q; + } + else { + pp = &(p->next); + p = *pp; + } + } + } + + t = apr_time_now(); + cache->avg_purgetime = + ((t - cache->last_purge) + (cache->avg_purgetime * (cache->numpurges-1))) / + cache->numpurges; +} + + +/* + * create caches + */ +util_url_node_t *util_ald_create_caches(util_ldap_state_t *st, const char *url) +{ + util_url_node_t curl, *newcurl = NULL; + util_ald_cache_t *search_cache; + util_ald_cache_t *compare_cache; + util_ald_cache_t *dn_compare_cache; + + /* create the three caches */ + search_cache = util_ald_create_cache(st, + util_ldap_search_node_hash, + util_ldap_search_node_compare, + util_ldap_search_node_copy, + util_ldap_search_node_free, + util_ldap_search_node_display); + compare_cache = util_ald_create_cache(st, + util_ldap_compare_node_hash, + util_ldap_compare_node_compare, + util_ldap_compare_node_copy, + util_ldap_compare_node_free, + util_ldap_compare_node_display); + dn_compare_cache = util_ald_create_cache(st, + util_ldap_dn_compare_node_hash, + util_ldap_dn_compare_node_compare, + util_ldap_dn_compare_node_copy, + util_ldap_dn_compare_node_free, + util_ldap_dn_compare_node_display); + + /* check that all the caches initialised successfully */ + if (search_cache && compare_cache && dn_compare_cache) { + + /* The contents of this structure will be duplicated in shared + memory during the insert. So use stack memory rather than + pool memory to avoid a memory leak. */ + memset (&curl, 0, sizeof(util_url_node_t)); + curl.url = url; + curl.search_cache = search_cache; + curl.compare_cache = compare_cache; + curl.dn_compare_cache = dn_compare_cache; + + newcurl = util_ald_cache_insert(st->util_ldap_cache, &curl); + + } + + return newcurl; +} + + +util_ald_cache_t *util_ald_create_cache(util_ldap_state_t *st, + unsigned long (*hashfunc)(void *), + int (*comparefunc)(void *, void *), + void * (*copyfunc)(util_ald_cache_t *cache, void *), + void (*freefunc)(util_ald_cache_t *cache, void *), + void (*displayfunc)(request_rec *r, util_ald_cache_t *cache, void *)) +{ + util_ald_cache_t *cache; + unsigned long i; + + if (st->search_cache_size <= 0) + return NULL; + +#if APR_HAS_SHARED_MEMORY + if (!st->cache_rmm) { + return NULL; + } + else { + apr_rmm_off_t block = apr_rmm_calloc(st->cache_rmm, sizeof(util_ald_cache_t)); + cache = block ? (util_ald_cache_t *)apr_rmm_addr_get(st->cache_rmm, block) : NULL; + } +#else + cache = (util_ald_cache_t *)calloc(sizeof(util_ald_cache_t), 1); +#endif + if (!cache) + return NULL; + +#if APR_HAS_SHARED_MEMORY + cache->rmm_addr = st->cache_rmm; + cache->shm_addr = st->cache_shm; +#endif + cache->maxentries = st->search_cache_size; + cache->numentries = 0; + cache->size = st->search_cache_size / 3; + if (cache->size < 64) cache->size = 64; + for (i = 0; primes[i] && primes[i] < cache->size; ++i) ; + cache->size = primes[i]? primes[i] : primes[i-1]; + + cache->nodes = (util_cache_node_t **)util_ald_alloc(cache, cache->size * sizeof(util_cache_node_t *)); + if (!cache->nodes) { + util_ald_free(cache, cache); + return NULL; + } + + for (i=0; i < cache->size; ++i) + cache->nodes[i] = NULL; + + cache->hash = hashfunc; + cache->compare = comparefunc; + cache->copy = copyfunc; + cache->free = freefunc; + cache->display = displayfunc; + + cache->fullmark = cache->maxentries / 4 * 3; + cache->marktime = 0; + cache->avg_purgetime = 0.0; + cache->numpurges = 0; + cache->last_purge = 0; + cache->npurged = 0; + + cache->fetches = 0; + cache->hits = 0; + cache->inserts = 0; + cache->removes = 0; + + return cache; +} + +void util_ald_destroy_cache(util_ald_cache_t *cache) +{ + unsigned long i; + util_cache_node_t *p, *q; + + if (cache == NULL) + return; + + for (i = 0; i < cache->size; ++i) { + p = cache->nodes[i]; + q = NULL; + while (p != NULL) { + q = p->next; + (*cache->free)(cache, p->payload); + util_ald_free(cache, p); + p = q; + } + } + util_ald_free(cache, cache->nodes); + util_ald_free(cache, cache); +} + +void *util_ald_cache_fetch(util_ald_cache_t *cache, void *payload) +{ + int hashval; + util_cache_node_t *p; + + if (cache == NULL) + return NULL; + + cache->fetches++; + + hashval = (*cache->hash)(payload) % cache->size; + for (p = cache->nodes[hashval]; + p && !(*cache->compare)(p->payload, payload); + p = p->next) ; + + if (p != NULL) { + cache->hits++; + return p->payload; + } + else { + return NULL; + } +} + +/* + * Insert an item into the cache. + * *** Does not catch duplicates!!! *** + */ +void *util_ald_cache_insert(util_ald_cache_t *cache, void *payload) +{ + int hashval; + util_cache_node_t *node; + + /* sanity check */ + if (cache == NULL || payload == NULL) { + return NULL; + } + + /* check if we are full - if so, try purge */ + if (cache->numentries >= cache->maxentries) { + util_ald_cache_purge(cache); + if (cache->numentries >= cache->maxentries) { + /* if the purge was not effective, we leave now to avoid an overflow */ + return NULL; + } + } + + /* should be safe to add an entry */ + if ((node = (util_cache_node_t *)util_ald_alloc(cache, sizeof(util_cache_node_t))) == NULL) { + return NULL; + } + + /* Take a copy of the payload before proceeeding. */ + payload = (*cache->copy)(cache, payload); + if (!payload) { + util_ald_free(cache, node); + return NULL; + } + + /* populate the entry */ + cache->inserts++; + hashval = (*cache->hash)(payload) % cache->size; + node->add_time = apr_time_now(); + node->payload = payload; + node->next = cache->nodes[hashval]; + cache->nodes[hashval] = node; + + /* if we reach the full mark, note the time we did so + * for the benefit of the purge function + */ + if (++cache->numentries == cache->fullmark) { + cache->marktime=apr_time_now(); + } + + return node->payload; +} + +void util_ald_cache_remove(util_ald_cache_t *cache, void *payload) +{ + int hashval; + util_cache_node_t *p, *q; + + if (cache == NULL) + return; + + cache->removes++; + hashval = (*cache->hash)(payload) % cache->size; + for (p = cache->nodes[hashval], q=NULL; + p && !(*cache->compare)(p->payload, payload); + p = p->next) { + q = p; + } + + /* If p is null, it means that we couldn't find the node, so just return */ + if (p == NULL) + return; + + if (q == NULL) { + /* We found the node, and it's the first in the list */ + cache->nodes[hashval] = p->next; + } + else { + /* We found the node and it's not the first in the list */ + q->next = p->next; + } + (*cache->free)(cache, p->payload); + util_ald_free(cache, p); + cache->numentries--; +} + +char *util_ald_cache_display_stats(request_rec *r, util_ald_cache_t *cache, char *name, char *id) +{ + unsigned long i; + int totchainlen = 0; + int nchains = 0; + double chainlen; + util_cache_node_t *n; + char *buf, *buf2; + apr_pool_t *p = r->pool; + + if (cache == NULL) { + return ""; + } + + for (i=0; i < cache->size; ++i) { + if (cache->nodes[i] != NULL) { + nchains++; + for (n = cache->nodes[i]; + n != NULL && n != n->next; + n = n->next) { + totchainlen++; + } + } + } + chainlen = nchains? (double)totchainlen / (double)nchains : 0; + + if (id) { + buf2 = apr_psprintf(p, + "%s", + r->uri, + id, + name); + } + else { + buf2 = name; + } + + buf = apr_psprintf(p, + "" + "" + "" + "" + "" + "" + "", + buf2, + cache->numentries, + (double)cache->numentries / (double)cache->maxentries * 100.0, + chainlen, + cache->hits, + cache->fetches, + (cache->fetches > 0 ? (double)(cache->hits) / (double)(cache->fetches) * 100.0 : 100.0), + cache->inserts, + cache->removes); + + if (cache->numpurges) { + char str_ctime[APR_CTIME_LEN]; + + apr_ctime(str_ctime, cache->last_purge); + buf = apr_psprintf(p, + "%s" + "\n" + "\n", + buf, + cache->numpurges, + str_ctime); + } + else { + buf = apr_psprintf(p, + "%s\n", + buf); + } + + buf = apr_psprintf(p, "%s\n", buf, cache->avg_purgetime); + + return buf; +} + +char *util_ald_cache_display(request_rec *r, util_ldap_state_t *st) +{ + unsigned long i,j; + char *buf, *t1, *t2, *t3; + char *id1, *id2, *id3; + char *argfmt = "cache=%s&id=%d&off=%d"; + char *scanfmt = "cache=%4s&id=%u&off=%u%1s"; + apr_pool_t *pool = r->pool; + util_cache_node_t *p = NULL; + util_url_node_t *n = NULL; + + util_ald_cache_t *util_ldap_cache = st->util_ldap_cache; + + + if (!util_ldap_cache) { + return ""; + } + + if (r->args && strlen(r->args)) { + char cachetype[5], lint[2]; + unsigned int id, off; + char date_str[APR_CTIME_LEN+1]; + + if ((3 == sscanf(r->args, scanfmt, cachetype, &id, &off, lint)) && + (id < util_ldap_cache->size)) { + + if ((p = util_ldap_cache->nodes[id]) != NULL) { + n = (util_url_node_t *)p->payload; + buf = (char*)n->url; + } + else { + buf = ""; + } + + ap_rputs(apr_psprintf(r->pool, + "

    \n" + "

    -öznitelikleri\fR + etiketinde kullanılacak öznitelikler belirtilir\&. + +.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/rubbos/app/httpd-2.0.64/docs/man/tr/apachectl.8 b/rubbos/app/httpd-2.0.64/docs/man/tr/apachectl.8 new file mode 100644 index 00000000..d99e50d9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/man/tr/apachectl.8 @@ -0,0 +1,92 @@ +.\" 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 "2009-02-16" "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 +\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ımı önerilmemektedir\&. + + +.TP +startssl +\fBapachectl -k start -DSSL\fR komutuna eşdeğerdir; doğrudan doğruya bu komutu kullanmanızı öneriyoruz\&. Veya httpd\&.conf dosyanızdan bölümünü silmek suretiyle SSL’nin daima etkin olmasını sağlayabilir ve normal \fBapachectl start\fR komutunu da kullanabirsiniz\&. + diff --git a/rubbos/app/httpd-2.0.64/docs/man/tr/apxs.8 b/rubbos/app/httpd-2.0.64/docs/man/tr/apxs.8 new file mode 100644 index 00000000..bb10a097 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/man/tr/apxs.8 @@ -0,0 +1,255 @@ +.\" 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" 8 "2009-02-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 [ -\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 ] \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 +-i (kurulum) ve -g (ş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 +\fBapxs\fR'in belli ayarlar hakkında bilgisine başvurmak için bir sorgu gerçekleştirir\&. \fIsorgu\fR olarak şu dizgelerden biri veya birkaçı belirtilebilir: CC, CFLAGS, CFLAGS_SHLIB, INCLUDEDIR, LD_SHLIB, LDFLAGS_SHLIB, LIBEXECDIR, LIBS_SHLIB, SBINDIR, SYSCONFDIR, TARGET\&. .PP Bu seçeneği ayarları öğrenmek için kullanın\&. Ö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ğihe 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 derleme 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 nesne ilintileme 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\&. + +.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 + gcc -fpic -DSHARED_MODULE -I/dosya/yolu/apache/include -c mod_foo\&.c + ld -Bshareable -o mod_foo\&.so mod_foo\&.o + $ _ + +.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\&.c + 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'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/mod_foo\&.c + $ _ + +.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 + gcc -fpic -DSHARED_MODULE -I/dosya/yolu/apache/include -c mod_foo\&.c + ld -Bshareable -o mod_foo\&.so mod_foo\&.o + apxs -i -a -n "foo" mod_foo\&.so + 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 +\fBapxs\fR C kaynak dosyalarını va nesne dosyalarını özdevinimli olarak tanıdığından, \fBapxs\fR'yi PHP3 gibi karmaşık modülleri Apache kaynak ağacının dışında derlemek için de kullanabilirsiniz: + +.nf + + $ cd php3 + $ \&./configure --with-shared-apache=\&.\&./apache-1\&.3 + $ apxs -c -o libphp3\&.so mod_php3\&.c libmodphp3-so\&.a + gcc -fpic -DSHARED_MODULE -I/tmp/apache/include -c mod_php3\&.c + ld -Bshareable -o libphp3\&.so mod_php3\&.o libmodphp3-so\&.a + $ _ + +.fi + +.PP +Sadece C kaynak dosyaları derlenir ve diğer nesne dosyaları ile ilintilenir\&. + diff --git a/rubbos/app/httpd-2.0.64/docs/man/tr/dbmmanage.1 b/rubbos/app/httpd-2.0.64/docs/man/tr/dbmmanage.1 new file mode 100644 index 00000000..63fd5548 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/man/tr/dbmmanage.1 @@ -0,0 +1,118 @@ +.\" 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 "2009-02-16" "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_auth_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 +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/rubbos/app/httpd-2.0.64/docs/man/tr/htdbm.1 b/rubbos/app/httpd-2.0.64/docs/man/tr/htdbm.1 new file mode 100644 index 00000000..3fa76603 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/man/tr/htdbm.1 @@ -0,0 +1,169 @@ +.\" 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 "2009-02-16" "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 ] [ -\fBc\fR ] [ -\fBm\fR | -\fBd\fR | -\fBp\fR | -\fBs\fR ] [ -\fBt\fR ] [ -\fBv\fR ] [ -\fBx\fR ] \fIparola-dosyası\fR \fIkullanıcı\fR + +.PP +\fBhtdbm\fR -\fBb\fR [ -\fBT\fR\fIVTtürü\fR ] [ -\fBc\fR ] [ -\fBm\fR | -\fBd\fR | -\fBp\fR | -\fBs\fR ] [ -\fBt\fR ] [ -\fBv\fR ] \fIparola-dosyası\fR \fIkullanıcı\fR \fIparola\fR + +.PP +\fBhtdbm\fR -\fBn\fR [ -\fBc\fR ] [ -\fBm\fR | -\fBd\fR | -\fBp\fR | -\fBs\fR ] [ -\fBt\fR ] [ -\fBv\fR ] \fIkullanıcı\fR + +.PP +\fBhtdbm\fR -\fBnb\fR [ -\fBc\fR ] [ -\fBm\fR | -\fBd\fR | -\fBp\fR | -\fBs\fR ] [ -\fBt\fR ] [ -\fBv\fR ] \fIkullanıcı\fR \fIparola\fR + +.PP +\fBhtdbm\fR -\fBv\fR [ -\fBT\fR\fIVTtürü\fR ] [ -\fBc\fR ] [ -\fBm\fR | -\fBd\fR | -\fBp\fR | -\fBs\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 | -\fBd\fR | -\fBp\fR | -\fBs\fR ] [ -\fBt\fR ] [ -\fBv\fR ] \fIparola-dosyası\fR \fIkullanıcı\fR \fIparola\fR + +.PP +\fBhtdbm\fR -\fBx\fR [ -\fBT\fR\fIVTtürü\fR ] [ -\fBm\fR | -\fBd\fR | -\fBp\fR | -\fBs\fR ] \fIparola-dosyası\fR \fIkullanıcı\fR + +.PP +\fBhtdbm\fR -\fBl\fR [ -\fBT\fR\fIVTtürü\fR ] + + +.SH "ÖZET" + +.PP +\fBhtdbm\fR, mod_auth_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\&. +.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, Netware ve TPF için öntanımlıdır\&. +.TP +\fB-d\fR +Parolaları şifrelemek için crypt() kullanılır\&. Windows, Netware ve TPF dışında öntanımlıdır\&. \fBhtdbm\fR tarafından tüm platformlarda destekleniyor olsa da Windows, Netware ve TPF üzerinde httpd sunucusu tarafından desteklenmez\&. +.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\&. +.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-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 +\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 +\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\&. + +.SH "KISITLAMALAR" + +.PP +Windows ve MPE platformlarında, \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/rubbos/app/httpd-2.0.64/docs/man/tr/htdigest.1 b/rubbos/app/httpd-2.0.64/docs/man/tr/htdigest.1 new file mode 100644 index 00000000..7ca86c40 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/man/tr/htdigest.1 @@ -0,0 +1,57 @@ +.\" 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 "2009-02-16" "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\&. +.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\&. + diff --git a/rubbos/app/httpd-2.0.64/docs/man/tr/htpasswd.1 b/rubbos/app/httpd-2.0.64/docs/man/tr/htpasswd.1 new file mode 100644 index 00000000..e95cd0a8 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/man/tr/htpasswd.1 @@ -0,0 +1,143 @@ +.\" 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 "2009-02-16" "Apache HTTP Sunucusu" "htpasswd" +.nh +.SH İSİM +htpasswd \- Temel kimlik doğrulama dosyalarını yönetir + +.SH "KULLANIM" + +.PP +\fBhtpasswd\fR [ -\fBc\fR ] [ -\fBm\fR ] [ -\fBD\fR ] \fIparola-dosyası\fR \fIkullanıcı\fR + +.PP +\fBhtpasswd\fR -\fBb\fR [ -\fBc\fR ] [ -\fBm\fR | -\fBd\fR | -\fBp\fR | -\fBs\fR ] [ -\fBD\fR ] \fIparola-dosyası\fR \fIkullanıcı\fR \fIparola\fR + +.PP +\fBhtpasswd\fR -\fBn\fR [ -\fBm\fR | -\fBd\fR | -\fBs\fR | -\fBp\fR ] \fIkullanıcı\fR + +.PP +\fBhtpasswd\fR -\fBnb\fR [ -\fBm\fR | -\fBd\fR | -\fBs\fR | -\fBp\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 sayfasına bakınız\&. + +.PP +\fBhtpasswd\fR, parolaları şifrelemek için ya Apache'nin kendine özgü MD5 algoritmasını ya da sistemin crypt() yordamını kullanır\&. Bazı kullanıcılar MD5 şifreli parolalara, bazıları da crypt() ile şifrelenmiş parolalara sahip olabileceğinden \fBhtpasswd\fR tarafından yönetilen dosyalar her iki tür parolayı da 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\&. +.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\&. Windows, Netware ve TPF için öntanımlıdır\&. +.TP +\fB-d\fR +Parolaları şifrelemek için crypt() kullanılır\&. Windows, Netware ve TPF dışında öntanımlıdır\&. \fBhtpasswd\fR tarafından tüm platformlarda destekleniyor olsa da Windows, Netware ve TPF üzerinde httpd sunucusu tarafından desteklenmez\&. +.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\&. +.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 +\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\&. 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 \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 -mb /usr/web/\&.htpasswd-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 +\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\&. + +.SH "KISITLAMALAR" + +.PP +Windows ve MPE platformlarında, \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/rubbos/app/httpd-2.0.64/docs/man/tr/httpd.8 b/rubbos/app/httpd-2.0.64/docs/man/tr/httpd.8 new file mode 100644 index 00000000..010dd381 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/man/tr/httpd.8 @@ -0,0 +1,116 @@ +.\" 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 "2009-02-16" "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 ] [ -\fBR\fR \fIdizin\fR ] [ -\fBh\fR ] [ -\fBl\fR ] [ -\fBL\fR ] [ -\fBS\fR ] [ -\fBt\fR ] [ -\fBv\fR ] [ -\fBV\fR ] [ -\fBX\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 +\fBhttpd\fR'yi başlatmak, durdurmak ve yeniden başlatmak için sinyal gönderir\&. Daha ayrıntılı bilgi edinmek için Apache'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\&. +.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\&. +.TP +\fB-R\fR \fIdizin\fR +Sunucu SHARED_CORE kullanılarak derlendiği takdirde bu seçenek paylaşımlı nesne dosyaları için \fIdizin\fR belirtir\&. +.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 +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\&. +.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 bir Windows NT hizmeti haline getirilir; başlatma seçenekleri Apache hizmeti için değiştirilir; ve Apache hizmeti sistemden kaldırılır\&. +.TP +\fB-n\fR \fIisim\fR +Sinyal gönderilecek Apache hizmetinin \fIismi\fR\&. +.TP +\fB-w\fR +Hata durumunda konsol penceresi açık tutularak hata iletilerinin okunması sağlanır\&. + diff --git a/rubbos/app/httpd-2.0.64/docs/man/tr/logresolve.8 b/rubbos/app/httpd-2.0.64/docs/man/tr/logresolve.8 new file mode 100644 index 00000000..f0d0fe17 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/man/tr/logresolve.8 @@ -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" 8 "2009-02-16" "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/rubbos/app/httpd-2.0.64/docs/man/tr/rotatelogs.8 b/rubbos/app/httpd-2.0.64/docs/man/tr/rotatelogs.8 new file mode 100644 index 00000000..d038f90e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/man/tr/rotatelogs.8 @@ -0,0 +1,144 @@ +.\" 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 "2009-02-16" "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 ] \fIdosyaismi\fR [ \fIsüre\fR [ \fIsaat_farkı\fR ]] | [ \fIboyut\fRM ] + + +.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 (\fI2\&.0\&.51 ve sonrası\fR) +GMT yerine yerel zamanın kullanılmasını sağlar\&. Zaman dilimi değişik olan ortamlarda (BST, DST gibi) bu seçeneğin kullanımı beklenmedik sonuçlar verebilir! +.TP +\fIdosyaismi\fR +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\&. 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\&. +.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\fRM +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 M (megabayt) harfi konmalıdır\&. .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/logs/logfile 86400" common + +.fi + +.PP +nnnn, günlük kaydının başladığı sistem zamanı olmak üzere /var/logs/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/logs/logfile\&.%Y\&.%m\&.%d 86400" common + +.fi + +.PP +yyyy, yıl; mm, ay; dd, ayın gününü belirtmek üzere /var/logs/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/logs/logfile 5M" common + +.fi + +.PP +Günlük dosyası 5 megabaytlık olunca yenisinin oluşturulmasını sağlar\&. + +.nf + + ErrorLog "|bin/rotatelogs /var/logs/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\&. + +.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/rubbos/app/httpd-2.0.64/docs/man/tr/suexec.8 b/rubbos/app/httpd-2.0.64/docs/man/tr/suexec.8 new file mode 100644 index 00000000..c22f878d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/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 "2009-02-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\&.0/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/rubbos/app/httpd-2.0.64/docs/manual/LICENSE b/rubbos/app/httpd-2.0.64/docs/manual/LICENSE new file mode 100644 index 00000000..57bc88a1 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/manual/bind.html b/rubbos/app/httpd-2.0.64/docs/manual/bind.html new file mode 100644 index 00000000..3cdb8888 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/bind.html @@ -0,0 +1,25 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: bind.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: bind.html.es +Content-Language: es +Content-type: text/html; charset=ISO-8859-1 + +URI: bind.html.fr +Content-Language: fr +Content-type: text/html; charset=ISO-8859-1 + +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/rubbos/app/httpd-2.0.64/docs/manual/bind.html.en b/rubbos/app/httpd-2.0.64/docs/manual/bind.html.en new file mode 100644 index 00000000..4925f910 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/bind.html.en @@ -0,0 +1,177 @@ + + + +Binding - Apache HTTP Server + + + + + +
    <-
    +

    Binding

    +
    +

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

    +
    + +

    Configuring Apache to listen on specific addresses and ports.

    +
    + +
    top
    +
    +

    Overview

    + + + + + +

    When Apache 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 needs to + be told to listen on specific ports, or to listen on only selected + addresses, or a combination. This is often combined with the + Virtual Host feature which determines how Apache responds to + different IP addresses, hostnames and ports.

    + +

    The Listen + directive tells the server to accept + incoming requests only on the specified port 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, use:

    + +

    + Listen 80
    + Listen 8000 +

    + +

    To make the server accept connections on two specified + interfaces and port numbers, use

    + +

    + Listen 192.170.2.1:80
    + Listen 192.170.2.5:8000 +

    + +

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

    + +

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

    +
    top
    +
    +

    Special IPv6 Considerations

    + + +

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

    + +

    One complicating factor for Apache 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. But even on systems where it is disallowed by default, a + special configure parameter can change this behavior + for Apache.

    + +

    If you want Apache 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 and use generic Listen + directives like the following:

    + +

    + Listen 80 +

    + +

    With --enable-v4-mapped, the Listen directives in the + default configuration file created by Apache will use this form. + --enable-v4-mapped is the default on all platforms but + FreeBSD, NetBSD, and OpenBSD, so this is probably how your Apache was + built.

    + +

    If you want Apache 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.170.2.1:80 +

    + +

    If you want Apache to handle IPv4 and IPv6 connections on separate + sockets (i.e., to disable IPv4-mapped addresses), specify the + --disable-v4-mapped configure option and + use specific Listen directives like the following:

    + +

    + Listen [::]:80
    + Listen 0.0.0.0:80 +

    + +

    With --disable-v4-mapped, the Listen directives in the + default configuration file created by Apache will use this form. + --disable-v4-mapped is the default on FreeBSD, NetBSD, and + OpenBSD.

    + +
    top
    +
    +

    How This Works With Virtual Hosts

    + + +

    Listen does not implement + Virtual Hosts. It only tells the main server what addresses and ports to + listen to. If no <VirtualHost> directives are used, the server will behave + the same for all accepted requests. However, + <VirtualHost> + can be used to specify a different behavior + for one or more of the addresses and 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 a 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:  en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/bind.html.es b/rubbos/app/httpd-2.0.64/docs/manual/bind.html.es new file mode 100644 index 00000000..fa77a258 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/bind.html.es @@ -0,0 +1,187 @@ + + + +Direcciones IP y puertos de escucha - Servidor HTTP Apache + + + + + +
    <-
    +

    Direcciones IP y puertos de escucha

    +
    +

    Idiomas disponibles:  en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    + +

    Cómo configurar Apache para que escuche en direcciones IP + y puertos específicos.

    +
    + +
    top
    +
    +

    Introducción

    + + + + + +

    Cuando Apache se inicia, comienza a esperar peticiones + entrantes en determinados puertos y direcciones de la máquina + en la que se está ejecutando. Sin embargo, si quiere que + Apache escuche solamente en determinados puertos específicos, + o solamente en determinadas direcciones, o en una combinación + de ambos, debe especificarlo adecuadamente. Esto puede además + combinarlo con la posibilidad de usar hosts virtuales, + funcionalidad con la que un servidor Apache puede responder a + peticiones en diferentes direcciones IP, diferentes nombres de + hosts y diferentes puertos.

    + +

    La directiva Listen + le indica al servidor que acepte peticiones entrantes solamente en + los puertos y en las combinaciones de puertos y direcciones que se + especifiquen. Si solo se especifica un número de puerto en la + directiva Listen el + servidor escuchará en ese puerto, en todas las interfaces de + red de la máquina. Si se especifica una dirección IP y + un puerto, el servidor escuchará solamente en la interfaz de + red a la que pertenezca esa dirección IP y solamente en el + puerto indicado. Se pueden usar varias directivas Listen para + especificar varias direcciones IP y puertos de escucha. El + servidor responderá a las peticiones de todas las direcciones + y puertos que se incluyan.

    + +

    Por ejemplo, para hacer que el servidor acepte conexiones tanto + en el puerto 80 como en el puerto 8000, puede usar:

    + +

    + Listen 80
    + Listen 8000 +

    + +

    Para hacer que el servidor acepte conexiones en dos interfaces + de red y puertos específicos, use

    + +

    + Listen 192.170.2.1:80
    + Listen 192.170.2.5:8000 +

    + +

    Las direcciones IPv6 deben escribirse entre corchetes, como en el siguiente ejemplo:

    + +

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

    +
    top
    +
    +

    Consideraciones especiales para IPv6

    + + +

    Cada vez más plataformas implementan IPv6, y APR soporta + IPv6 en la mayor parte de esas plataformas, permitiendo que Apache + use sockets IPv6 y pueda tratar las peticiones que se envían + con IPv6.

    + +

    Un factor de complejidad para los administradores de Apache es + si un socket IPv6 puede tratar tanto conexiones IPv4 como + IPv6. Para tratar conexiones IPv4 con sockets IPv6 se utiliza un + traductor de direcciones IPv4-IPv6, cuyo uso está permitido + por defecto en la mayor parte de las plataformas, pero que + está desactivado por defecto en FreeBSD, NetBSD, y OpenBSD + para cumplir con la política system-wide en esas + palaformas. Pero incluso en los sistemas en los que no está + permitido su uso por defecto, un parámetro especial de + configure puede modificar ese + comportamiento.

    + +

    Si quiere que Apache trate conexiones IPv4 y IPv6 con un + mínimo de sockets, lo que requiere traducir direcciones IPv4 + a IPv6, especifique la opción de configure + --enable-v4-mapped y use directivas Listen genéricas de la + siguiente forma:

    + +

    + Listen 80 +

    + +

    Con --enable-v4-mapped, las directivas Listen en + el fichero de configuración por defecto creado por Apache + usarán ese formato. --enable-v4-mapped es el + valor por defecto en todas las plataformas excepto en FreeBSD, + NetBSD, y OpenBSD, de modo que esa es probablemente la manera en + que su servidor Apache fue construido.

    + +

    Si quiere que Apache solo procese conexiones IPv4, sin tener en + cuenta cuál es su plataforma o qué soporta APR, especifique + una dirección IPv4 en todas las directivas Listen, como en + estos ejemplos:

    + +

    + Listen 0.0.0.0:80
    + Listen 192.170.2.1:80 +

    + +

    Si quiere que Apache procese conexiones IPv4 y IPv6 en sockets + diferentes (es decir, deshabilitar la conversión de + direcciones IPv4 a IPv6), especifique la opción de + configure --disable-v4-mapped y + use directivas Listen específicas como en el siguiente ejemplo:

    + +

    + Listen [::]:80
    + Listen 0.0.0.0:80 +

    + +

    Con --disable-v4-mapped, las directivas Listen en + el fichero de configuración que Apache crea por defecto + usarán ese formato. --disable-v4-mapped se usa + por defecto en FreeBSD, NetBSD, y OpenBSD.

    + +
    top
    +
    +

    Cómo funciona este mecanismo en hosts virtuales

    + + +

    Listen no implementa + hosts virtuales. Solo le dice al servidor + principal en qué direcciones y puertos tiene que escuchar. Si no + se usan directivas <VirtualHost>, el servidor se comporta de + la misma manera con todas las peticiones que se acepten. Sin + embargo, <VirtualHost> puede usarse para + especificar un comportamiento diferente en una o varias + direcciones y puertos. Para implementar un host virtual, hay que + indicarle primero al servidor que escuche en aquellas direcciones y + puertos a usar. Entonces se debe crear un una sección + <VirtualHost> + en una dirección y puerto específicos para determinar + el comportamiento de ese host virtual. Tenga en cuenta que si se + especifica en una sección <VirtualHost> una dirección y puerto + en los que el servidor no está escuchando, ese host virtual no + podrá ser accedido.

    +
    +
    +

    Idiomas disponibles:  en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/bind.html.fr b/rubbos/app/httpd-2.0.64/docs/manual/bind.html.fr new file mode 100644 index 00000000..2ca22a1d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/bind.html.fr @@ -0,0 +1,194 @@ + + + +Liaison - Serveur Apache HTTP + + + + + +
    <-
    +

    Liaison

    +
    +

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

    +
    + +

    Configuration des adresses et ports sur lesquels Apache écoute.

    +
    + +
    top
    +
    +

    Informations générales

    + + + + + +

    Au moment de son démarrage, Apache se lie à un port et à une + adresse sur la machine et se met en attente de requêtes entrantes. + Par défaut, toutes les adresses de la machine se retrouvent + à l'écoute. Dans tous les cas, Apache accepte d'écouter sur un + ou plusieurs ports spécifiques, ou sur une seule ou plusieurs + adresses, ou encore une combinaison des deux. + Il est fréquent d'utiliser ces possibilités avec les fonctionnalités + de Serveurs Virtuels, qui permettent de faire répondre Apache de + manière différente en fonction de l'adresse IP, du nom ou du port.

    + +

    Le serveur utilise la directive + Listen + pour n'accepter que des requêtes provenant de ports spécifiques ou + d'une combinaison adresse IP + port passés en argument. + Dans le cas où seul un port est spécifié avec la directive + Listen, + le serveur se met à l'écoute sur le port spécifié, sur toutes + les interfaces et adresses de la machine. Si une adresse IP est + précisée en plus du port, le serveur n'écoute que sur l'adresse + et le port spécifiés. Il est possible de configurer plusieurs + directives Listen, + afin qu'Apache écoute sur plusieurs adresses + et ports. Dans ce cas, le serveur répondra aux requêtes faites + sur tous les adresses et ports énumérés.

    + + +

    Par exemple, pour que le serveur accepte les connexions à la fois sur + les ports 80 et 8000, spécifiez :

    + +

    + Listen 80
    + Listen 8000 +

    + +

    Pour qu'Apache accepte les connexions sur deux combinaisons + adresses + ports, spécifiez :

    + +

    + Listen 192.170.2.1:80
    + Listen 192.170.2.5:8000 +

    + +

    Les adresses IPv6 sont acceptées, pourvu qu'elles soient entourées + entre crochets de la façon suivante :

    + +

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

    +
    top
    +
    +

    Précisions au sujet d'IPv6

    + + +

    De plus en plus de plates-formes implémentent IPv6, et APR + supporte IPv6 sur la plupart d'entre elles, si bien qu'Apache + peut utiliser des sockets IPv6 et répondre aux requêtes envoyées + en IPv6.

    + +

    Une complication possible pour les administrateurs Apache est de + savoir si un socket IPv6 est capable de gérer les connexions IPv4 + aussi bien qu'IPv6. Gérer les connexions IPv4 sur une socket IPv6 + suppose l'utilisation d'adresses IPv6 mappées en IPv4, ce qui est + le cas sur la plupart des plates-formes, mais pas sur FreeBSD, NetBSD + et OpenBSD, en raison des politiques systèmes de ces plates-formes. + Même sur des systèmes où cette fonctionnalité n'est pas activée par + défaut, un paramètre de compilation pour configure + permet de changer ce comportement pour Apache.

    + +

    Pour qu'Apache puisse gérer à la fois les connexions IPv4 et IPv6 + avec un minimum de sockets, il faut permettre l'utilisation des adresses + IPv6 mappées en IPv4, ce qui est faisable en spécifiant l'option + de compilation --enable-v4-mapped et en utilisant la + directive générique Listen + comme suit :

    + +

    + Listen 80 +

    + +

    Si --enable-v4-mapped a été spécifié à la compilation, + les directives Listen de la configuration par défaut sont de la forme + ci-dessus. --enable-v4-mapped est l'option de compilation + par défaut sur toutes les plates-formes, sauf pour FreeBSD, NetBSD, et + OpenBSD, donc il est probable que votre Apache ait été compilé avec + cette option.

    + +

    Pour qu'Apache ne gère que les connexions IPv4, en ignorant l'éventuel + support IPv6 de la plate-forme ou d'APR, une adresse IPv4 peut être + donnée dans toutes les directives + Listen, comme dans les + exemples suivants :

    + +

    + Listen 0.0.0.0:80
    + Listen 192.170.2.1:80 +

    + +

    Pour qu'Apache gère les connexions IPv4 et IPv6 sur des sockets + différents (i.e., pour ne pas accepter les adresses IPv6 mappées + en IPv4), spécifiez l'option de compilation + --disable-v4-mapped et utilisez des directives + Listen spécifiques telles que :

    + +

    + Listen [::]:80
    + Listen 0.0.0.0:80 +

    + +

    Si le paramètre --disable-v4-mapped a été défini + au moment de la compilation, les directives Listen de la + configuration par défaut sont de la forme ci-dessus. + --disable-v4-mapped est l'option de + compilation par défaut sous FreeBSD, NetBSD, et OpenBSD.

    + +
    top
    +
    +

    Faire fonctionner tout ceci avec les Serveurs Virtuels

    + + +

    La directive Listen + n'implémente aucun Serveur Virtuel. Elle sert simplement à + indiquer au serveur principal sur quels adresses et ports écouter. + Dans le cas où aucune section + <VirtualHost> + n'est utilisée, le serveur répondra de la même manière pour toutes + les requêtes qu'il recevra. + Des sections + <VirtualHost> + peuvent être utilisées pour qu'Apache réagisse différemment selon que la + requête est destinée à telle adresse ou à tel port. Avant d'implémenter + un Serveur Virtuel au moyen de la directive VirtualHost, la directive + Listen doit être configurée pour que le serveur écoute sur l'adresse + ou le port utilisé. Ensuite, une section + <VirtualHost> + devrait être utilisée pour qu'Apache réagisse différemment selon + l'adresse ou le port. + À noter que si un Serveur Virtuel + <VirtualHost> + est configuré sur une adresse et un port sur lesquels le serveur + n'est pas à l'écoute, le Serveur Virtuel ne sera pas accessible.

    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/bind.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/bind.html.ja.utf8 new file mode 100644 index 00000000..3d170dde --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/bind.html.ja.utf8 @@ -0,0 +1,193 @@ + + + +バインド - Apache HTTP サーバ + + + + + +
    <-
    +

    バインド

    +
    +

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

    +
    +
    This translation may be out of date. Check the + English version for recent changes.
    + +

    Apache が使用するアドレスとポートの設定をします。

    +
    + +
    top
    +
    +

    概要

    + + + + + +

    Apache は起動時に、ローカルマシンのあるポートあよびアドレス + に対して接続し、リクエストが来るのを待ちます。 + デフォルトではマシンのすべてのアドレスに対して listen します。 + しかしながら、特定のポートか、特定のアドレスのみか、 + またはそれらの組み合わせのいずれかを listen するようにする必要があります。 + これは、異なる IP アドレス、ホスト名、ポートに対する Apache + の応答方法を決定するバーチャルホスト機能と組み合わせて使われます。

    + +

    Listen + ディレクティブで、特定のポートやアドレス・ポートの組からのみ入ってくる + リクエストを受け付けるようにできます。 + もしポート番号のみが Listen + ディレクティブで指定された場合は、 + すべてのインターフェースの与えられたポート番号を + listen します。 IP アドレスがポート番号と同時に与えられた場合は、 + サーバは与えられたポートとインターフェースを listen します。 + 複数の Listen ディレクティブを用いて + いくつかの listen するアドレスとポートを指定できます。 + サーバはリストされたアドレスやポートからのすべてのリクエストに + 対して応答します。

    + +

    たとえば、ポート 80 と 8000 の両方に対しての接続を受け付けるには

    + +

    + Listen 80
    + Listen 8000 +

    + +

    とします。 + 二つの指定されたインタフェースとポート番号に対しての接続を受け付けるには、 +

    + +

    + Listen 192.170.2.1:80
    + Listen 192.170.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 では、システム全体としてのポリシーとの整合性から、 + デフォルトでは使用不可に設定されています。 + これらのデフォルトで使用不可のプラットホームであっても、 + 特別な設定パラメータで Apache の挙動を変化させることができます。

    + +

    IPv4 と IPv6 のコネクションを最小限のソケットで扱いたいのであれば、 + IPv4 マップの IPv6 アドレスを使用する必要があり、 + --enable-v4-mapped configure オプションを指定して、単純に + Listen + ディレクティブで次のように設定します。

    + +

    + Listen 80 +

    + +

    --enable-v4-mapped では、Apache + の生成するデフォルトの設定ファイル中の + Listen + ディレクティブはこの形式を使用しています。 + --enable-v4-mapped は、 + FreeBSD, NetBSD, OpenBSD 以外の全てのプラットホームでのデフォルトです。 + ですから、おそらくお手元の Apache はこの設定でビルドされているでしょう。

    + +

    プラットフォームや APR が何をサポートするかに関わらず、 + IPv4 コネクションのみを扱うようにしたい場合は、 + 次の例のように全ての + Listen ディレクティブで + IPv4 アドレスを指定してください。

    + +

    + Listen 0.0.0.0:80
    + Listen 192.170.2.1:80 +

    + +

    IPv4 と IPv6 のコネクションを個別のソケットで扱うようにしたい場合 + (つまり IPv4 マップのアドレスを無効にしたい場合) + は、--disable-v4-mapped configure + オプションを指定して、次のように個別指定の + Listen + ディレクティブを使用してください。

    + +

    + Listen [::]:80
    + Listen 0.0.0.0:80 +

    + +

    --disable-v4-mapped では、Apache + の生成するデフォルトの設定ファイル中の + Listen + ディレクティブはこの形式を使用しています。 + --disable-v4-mapped は、 + FreeBSD, NetBSD, OpenBSD プラットホームでのデフォルトです。

    + +
    top
    +
    +

    バーチャルホストに対してどう働くのか

    + + +

    Listen でバーチャルホストが実装されるわけではありません。 + Listen は単にメインサーバにどのアドレスとポートを listen すべきかを + 教えるだけです。 + <VirtualHost> + ディレクティブが使われない場合は、 + 受け入れたリクエストすべてに対して全く同じ挙動をします。 + しかしながら + <VirtualHost> + を使って、 + 一つ以上のアドレスやポートに対して異なる挙動をするように + 指定することができます。 + VirtualHost を実装するには、使用するアドレスとポートを + まず初めにサーバに通知しなければなりません。 + そして、その指定したアドレスとポートでの + このバーチャルホストの挙動を設定するために、 + <VirtualHost> + セクションを作ります。もし + <VirtualHost> + が listen していないアドレスとポートに対して + 設定されてしまうと、 + それにはアクセスできないということに注意してください。

    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/bind.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/bind.html.ko.euc-kr new file mode 100644 index 00000000..727cb6da --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/bind.html.ko.euc-kr @@ -0,0 +1,163 @@ + + + +ÁÖ¼Ò¿Í Æ÷Æ® ÁöÁ¤ (Binding) - Apache HTTP Server + + + + + +
    <-
    +

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

    +
    +

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

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

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

    +
    + +
    top
    +
    +

    °³¿ä

    + + + + + +

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

    + +

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

    + +

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

    + +

    + Listen 80
    + Listen 8000 +

    + +

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

    + +

    + Listen 192.170.2.1:80
    + Listen 192.170.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Àº ½Ã½ºÅÛÀüü Á¤Ã¥¶§¹®¿¡ + ±âº»ÀûÀ¸·Î Çã¿ëÇÏÁö ¾Ê´Â´Ù. ±×·¯³ª ±âº»ÀûÀ¸·Î Çã¿ëÇÏÁö¾Ê´Â + ½Ã½ºÅÛÀÌ¶óµµ ¾ÆÆÄÄ¡¸¦ À§ÇØ Æ¯º°ÇÑ ¼³Á¤ ÆĶó¹ÌÅÍ·Î º¯°æÇÒ + ¼ö ÀÖ´Ù.

    + +

    ¾ÆÆÄÄ¡°¡ ÃÖ¼ÒÇÑÀÇ ¼ÒÄÏÀ» »ç¿ëÇÏ¿© IPv4 ¿¬°á°ú IPv6 ¿¬°áÀ» + ¸ðµÎ ¹Þµµ·ÏÇÏ·Á¸é IPv4-´ëÀÀ IPv6 ÁÖ¼Ò¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù. ±×·¯±âÀ§Çؼ­ + ÄÄÆÄÀ϶§ ±¸¼º ¿É¼Ç --enable-v4-mapped¸¦ »ç¿ëÇÏ°í, + ´ÙÀ½°ú °°ÀÌ ÀϹÝÀûÀÎ Listen Áö½Ã¾î¸¦ »ç¿ëÇÑ´Ù:

    + +

    + Listen 80 +

    + +

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

    + +

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

    + +

    + Listen 0.0.0.0:80
    + Listen 192.170.2.1:80 +

    + +

    IPv4 ¿¬°á°ú IPv6 ¿¬°áÀ» ¼­·Î ´Ù¸¥ ¼ÒÄÏÀ¸·Î ¹ÞÀ¸·Á¸é, + ÄÄÆÄÀ϶§ ±¸¼º ¿É¼Ç --disable-v4-mapped¸¦ »ç¿ëÇÏ°í + ´ÙÀ½°ú °°ÀÌ Listen Áö½Ã¾î¸¦ µû·Î »ç¿ëÇÑ´Ù:

    + +

    + Listen [::]:80
    + Listen 0.0.0.0:80 +

    + +

    --disable-v4-mapped¸¦ »ç¿ëÇÒ¶§ ¾ÆÆÄÄ¡°¡ ¸¸µå´Â + ±âº» ¼³Á¤ÆÄÀÏÀÇ Listen Áö½Ã¾î´Â À§¿Í °°´Ù. + --disable-v4-mapped´Â FreeBSD, NetBSD, OpenBSD¿¡¼­ + ±âº»°ªÀÌ´Ù.

    + +
    top
    +
    +

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

    + + +

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

    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/bind.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/bind.html.tr.utf8 new file mode 100644 index 00000000..c9504466 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/bind.html.tr.utf8 @@ -0,0 +1,172 @@ + + + +Dinleme - Apache HTTP Sunucusu + + + + + +
    <-
    +

    Dinleme

    +
    +

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

    +
    + +

    Apache’nin belli adresleri ve portları dinlemek üzere + yapılandırılması.

    +
    + +
    top
    +
    +

    Genel Bakış

    + + + + + +

    Apache 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, Apache’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 portlardan 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 +

    +
    top
    +
    +

    IPv6 Adreslerin Durumu

    + + +

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

    + +

    Apache 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 Apache’nin davranışı + değiştirilebilir.

    + +

    Apache’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 ve Listen yönergesini örnekteki gibi + kullanınız:

    + +

    + Listen 80 +

    + +

    --enable-v4-mapped seçeneği ile derlenen Apache + tarafından oluşturulan öntanımlı yapılandırma dosyasındaki Listen yönergeleri bu biçimi + kullanacaktır. --enable-v4-mapped seçeneği, FreeBSD, + NetBSD ve OpenBSD hariç tüm platformlarda öntanımlıdır. Muhtemelen siz + de Apache’nin böyle derlenmesini isterdiniz.

    + +

    Platformunuzun ve APR’nin neyi desteklediğine bakmaksızın Apache’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 +

    + +

    Apache’nin IPv4 ve IPv6 adresleri ayrı soketlerden kabul etmesini + (yani IPv4 eşlemli IPv6 adreslerin iptalini) istiyorsanız + configure betiğine --disable-v4-mapped + seçeneğini belirtiniz ve bu amaca yönelik Listen yönergelerini örnekteki gibi + belirtiniz:

    + +

    + Listen [::]:80
    + Listen 0.0.0.0:80 +

    + +

    --disable-v4-mapped seçeneği ile derlenen Apache + tarafından oluşturulan öntanımlı yapılandırma dosyasındaki Listen yönergeleri bu biçimi + kullanacaktır. --disable-v4-mapped seçeneği, FreeBSD, + NetBSD ve OpenBSD’de öntanımlıdır.

    +
    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:  en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/configuring.html b/rubbos/app/httpd-2.0.64/docs/manual/configuring.html new file mode 100644 index 00000000..3a97c489 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/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=ISO-8859-1 + +URI: configuring.html.fr +Content-Language: fr +Content-type: text/html; charset=ISO-8859-1 + +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/rubbos/app/httpd-2.0.64/docs/manual/configuring.html.de b/rubbos/app/httpd-2.0.64/docs/manual/configuring.html.de new file mode 100644 index 00000000..dbacaaae --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/configuring.html.de @@ -0,0 +1,190 @@ + + + +Konfigurationsdateien - Apache HTTP Server + + + + + +
    <-
    +

    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 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/configuring.html.en b/rubbos/app/httpd-2.0.64/docs/manual/configuring.html.en new file mode 100644 index 00000000..e57c8e23 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/configuring.html.en @@ -0,0 +1,171 @@ + + + +Configuration Files - Apache HTTP Server + + + + + +
    <-
    +

    Configuration Files

    +
    +

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

    +
    + +

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

    +
    + +
    top
    +
    +

    Main Configuration Files

    + + + +

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

    + + +

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

    + +

    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 a line after a configuration directive. Blank lines + and white space occurring before a directive are ignored, so + you may indent directives for clarity.

    + +

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

    +
    top
    +
    +

    Modules

    + + + + +

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

    + +

    To see which modules are currently compiled into the server, + you can use the -l 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.

    + +

    Apache 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

    + + + + +

    Apache 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 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/configuring.html.fr b/rubbos/app/httpd-2.0.64/docs/manual/configuring.html.fr new file mode 100644 index 00000000..17f0af3c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/configuring.html.fr @@ -0,0 +1,185 @@ + + + +Fichiers de Configuration - Serveur Apache HTTP + + + + + +
    <-
    +

    Fichiers de Configuration

    +
    +

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

    +
    +
    Cette traduction peut être périmée. Consultez la version + Anglaise pour les changements récents.
    + +

    Ce document présente les fichiers utilisés pour la configuration +du serveur HTTP Apache.

    +
    + +
    top
    +
    +

    Fichiers de Configuration principaux

    + + + +

    Apache se configure en positionnant des directives dans des fichiers de + configurations, au format texte. Le fichier de configuration principal + est habituellement nommé httpd.conf. + L'emplacement de ce fichier est défini lors de la compilation + mais il est possible de le modifier en ligne de commande au lancement + d'Apache au moyen de l'option -f. + De plus, il est possible d'ajouter d'autres fichiers de configuration au + moyen de la directive Include, + qui accepte des jokers, rendant possible la lecture de multiples + fichiers de configuration. Cette directive peut être incluse dans + n'importe quel fichier de configuration. Les changements apportés + aux fichiers de configuration principale ne seront pris en compte + qu'au démarrage d'Apache ou à son redémarrage.

    + +

    Le serveur lit également un fichier contenant les types de documents + mime ; le nom de ce fichier est défini au moyen de la directive + TypesConfig, et son nom + par défaut est mime.types.

    +
    top
    +
    +

    Syntaxe des fichiers de configuration

    + + +

    Les fichiers de configuration d'Apache contiennent une directive par + ligne. Il est possible d'utiliser le caractère antislash "\" à la fin + d'une ligne pour signaler que celle-ci se continue sur la ligne suivante. + Dans ce cas l'antislash doit impérativement être le tout dernier + caractère de la ligne et ne doit pas être suivi d'espaces.

    + +

    Les directives placées dans les fichiers de configuration + ne sont pas sensibles à la casse, mais leurs arguments le sont. + Les lignes commençant par le caractère "#" sont considérées comme + des commentaires, et sont donc ignorées. Il n'est + pas possible d'ajouter un commentaire en fin de + ligne, après une directive. Les lignes vides, ainsi que les + espaces précédant les directives, sont ignorés, ce qui vous + permet d'indenter le fichier pour de simplifier sa lecture.

    + +

    Vous pouvez tester vos fichiers de configuration sans + avoir à démarrer le serveur en utilisant la commande + apachectl configtest ou en appelant Apache + avec l'option -t.

    +
    top
    +
    +

    Modules

    + + + + +

    Apache est un serveur modulaire, ce qui signifie que le + noyau du serveur ne dispose que des fonctions des plus basiques. + Toutes les fonctions étendues sont possibles grâce à des modules, qui peuvent être chargés par Apache. + Par défaut, un certain + nombre de modules est fourni et compilé avec le serveur. + Dans le cas où le serveur a été compilé avec le + support dynamique des modules, il est possible de compiler + des modules à part et de les charger au moyen de la directive + LoadModule. Dans le cas + contraire, il faudra recompiler tout Apache pour lui ajouter ou + lui enlever des modules. Des directives peuvent être incluses de + façon conditionnelle selon la présence d'un module particulier en + les positionnant dans un bloc <IfModule>.

    + +

    L'option -l, à passer en ligne de commande, provoque + l'affichage des modules qui sont compilés dans Apache.

    +
    top
    +
    +

    Directives Possibles

    + + + + +

    Les directives positionnées dans les fichiers de configuration principaux + s'appliquent au serveur dans son ensemble. Pour spécifier des directives + spécifiques à une partie du serveur, il est possible de les positionner à + l'intérieur d'une des sections <Directory>, <DirectoryMatch>, <Files>, <FilesMatch>, <Location>, ou <LocationMatch>. + Chacune de ces sections limite la validité des directives qu'elle + contient à la partie du système de fichier ou de l'URL qu'elle + contient. Ces sections peuvent également se contenir les unes les autres, + ce qui permet une configuration très fine.

    + +

    Il est possible d'utiliser un seul serveur Apache pour servir plusieurs + sites web, ce qu'on appelle des Serveurs Virtuels. + Les différentes directives peuvent être positionnées à l'intérieur de + sections <VirtualHost>, + afin qu'elles régulent le fonctionnement d'un site (dit virtuel) + particulier.

    + +

    La plupart des directives peuvent être positionnées dans toutes les + sections présentées ci-dessus, sauf dans certains cas. Par exemple, + les directives qui contrôlent la création du processus Apache ne + peuvent être placées que dans le contexte du serveur principal. Les + sections possibles pour chaque directive sont décrites au niveau du Contexte de celle-ci. + Des informations plus complètes au sujet du fonctionnement des sections + Directory, Location et Files + sont disponibles ailleurs.

    +
    top
    +
    +

    Fichiers .htaccess

    + + + + +

    Apache permet de délocaliser la gestion de la configuration, au + moyen de fichiers spéciaux, placés directement dans l'arborescence Web. + Ces fichiers spéciaux portent le plus souvent le nom .htaccess, + mais il est bien sûr possible de changer ce nom au moyen de la directive + AccessFileName. + Les directives positionnées dans un fichier .htaccess + s'appliquent au répertoire le contenant ainsi qu'à tous ses + sous-répertoires. La syntaxe à employer dans un fichier + .htaccess est identique à la syntaxe des fichiers de + configuration principaux. De plus, les fichiers .htaccess + étant lus au moment de chaque requête les concernant, toute + modification de ces fichiers prend effet immédiatement sans qu'il soit + nécessaire de redémarrer le serveur.

    + +

    Pour savoir si une directive peut être placée dans un fichier + .htaccess, il suffit de vérifier son Contexte. Il est possible à + l'administrateur du serveur de spécifier quelles directives sont + autorisées ou non dans les fichiers .htaccess, au moyen + de la directive AllowOverride, + positionnée dans les fichiers de configuration principaux.

    + +

    Des informations plus complètes concernant les fichiers + .htaccess sont disponible dans le + tutoriel .htaccess.

    + +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/configuring.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/configuring.html.ja.utf8 new file mode 100644 index 00000000..02b9e0cc --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/configuring.html.ja.utf8 @@ -0,0 +1,175 @@ + + + +設定ファイル - Apache HTTP サーバ + + + + + +
    <-
    +

    設定ファイル

    +
    +

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

    +
    +
    This translation may be out of date. Check the + English version for recent changes.
    + +

    この文書では、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 + ファイルに書けるかを調べるには、ディレクティブのコンテキスト + を調べてください。サーバ管理者はさらにメイン設定ファイルの + AllowOverride + を設定することでどのディレクティブを .htaccess + ファイルに書けるようにするかを制御することができます。

    + +

    .htaccess ファイルに関する詳しい情報は + .htaccess チュートリアル + を参照してください。

    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/configuring.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/configuring.html.ko.euc-kr new file mode 100644 index 00000000..c947dd81 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/configuring.html.ko.euc-kr @@ -0,0 +1,156 @@ + + + +¼³Á¤ÆÄÀÏ - Apache HTTP Server + + + + + +
    <-
    +

    ¼³Á¤ÆÄÀÏ

    +
    +

    °¡´ÉÇÑ ¾ð¾î:  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 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/configuring.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/configuring.html.tr.utf8 new file mode 100644 index 00000000..0c85b6b2 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/configuring.html.tr.utf8 @@ -0,0 +1,101 @@ + + + +Yapılandırma Dosyaları - Apache HTTP Sunucusu + + + + + +
    <-
    +

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

    + + +

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

    + +

    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ırların ardına açıklama yerleştirilemez. Yönerge isminden önce yer alan boşluklar ve boş satırlar yok sayılır; bu özellik, okunabilirliği sağlamak için yönergelerin girintilenebilmesi olanağını verir.

    + +

    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.

    +
    top
    +
    +

    Modüller

    + + + + +

    Apache modüler yapıda bir sunucudur. Bu, çekirdek sunucunun sadece en temel işlevselliği içermesi demektir. Ek özellikler, Apache’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 Apache’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.

    + +

    Sunucunun içinde derlenmiş modüllerin listesini görmek için -l komut satırı seçeneğini kullanabilirsiniz.

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

    + +

    Apache, ç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 siteden 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ı

    + + + + +

    Apache 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 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/content-negotiation.html b/rubbos/app/httpd-2.0.64/docs/manual/content-negotiation.html new file mode 100644 index 00000000..d2170a4b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/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=ISO-8859-1 + +URI: content-negotiation.html.fr +Content-Language: fr +Content-type: text/html; charset=ISO-8859-1 + +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/rubbos/app/httpd-2.0.64/docs/manual/content-negotiation.html.en b/rubbos/app/httpd-2.0.64/docs/manual/content-negotiation.html.en new file mode 100644 index 00000000..89093c86 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/content-negotiation.html.en @@ -0,0 +1,666 @@ + + + +Content Negotiation - Apache HTTP Server + + + + + +
    <-
    +

    Content Negotiation

    +
    +

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

    +
    + + +

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

    + +

    Apache supports 'server driven' content negotiation, as + defined in the HTTP/1.1 specification. It fully supports the + Accept, Accept-Language, + Accept-Charset andAccept-Encoding + request headers. Apache 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 + 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 Apache

    + +

    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 Apache 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, and 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. + This file would be named foo.var, as it describes + a resource named 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
    +

    +

    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_negotation + 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 Apache 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 Apache'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 Apache + algorithm is used in the normal case. The Apache + algorithm is explained in more detail below. When this + algorithm is used, Apache can sometimes 'fiddle' the quality + factor of a particular dimension to achieve a better result. + The ways Apache 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 Apache 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.
    + + +

    Apache Negotiation Algorithm

    + +

    Apache 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

    + +

    Apache sometimes changes the quality values from what would + be expected by a strict interpretation of the Apache + 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, Apache 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 Apache 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 Apache 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, Apache 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 Apache 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=en" prefer-language=en
    + SetEnvIf Cookie "language=fr" prefer-language=fr +

    + +
    top
    +
    +

    Extensions to Transparent Content +Negotiation

    + +

    Apache 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, Apache normally + marks all responses that are returned after content negotiation + as non-cacheable by HTTP/1.0 clients. Apache 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.

    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/content-negotiation.html.fr b/rubbos/app/httpd-2.0.64/docs/manual/content-negotiation.html.fr new file mode 100644 index 00000000..d800ca77 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/content-negotiation.html.fr @@ -0,0 +1,715 @@ + + + +Négociation de Contenus - Serveur Apache HTTP + + + + + +
    <-
    +

    Négociation de Contenus

    +
    +

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

    +
    +
    Cette traduction peut être périmée. Consultez la version + Anglaise pour les changements récents.
    + + +

    Apache suit les spécifications HTTP/1.1 en ce qui concerne + les négociations de contenus. Il est ainsi possible d'utiliser + les informations fournies par le navigateur (préférences de langues, + jeu de caractères, encodage et types de médias). Apache essaye + aussi d'optimiser les cas des navigateurs envoyant des + informations incomplètes.

    + +

    C'est le module mod_negotiation qui fournit + la négociation de contenus ; ce module est inclus dans Apache + par défaut.

    +
    + +
    top
    +
    +

    À propos de la Négociation de Contenus

    + +

    Différentes représentations peuvent être utilisées pour + communiquer une ressource. Par exemple, plusieurs langues peuvent + être disponibles, ou plusieurs types de médias, voire parfois une + combinaison de ces possibilités. + Une méthode pour gérer cela est de donner le choix au visiteur, + en lui proposant un index général, qui lui permet par exemple de + choisir sa langue. Cependant, il est souvent possible de faire ce + choix de manière automatique car les navigateurs peuvent préciser + avec leurs requêtes, la représentation qu'ils préfèrent recevoir. Par + exemple, un navigateur pourrait spécifier qu'il préfère recevoir les + informations en français si elles sont disponibles, ou en anglais + dans le cas contraire. Ce type d'information est communiqué par les + navigateurs, dans les en-têtes de chaque requête. Un navigateur ne + demandant que des documents en français enverrait

    + +

    Accept-Language: fr

    + +

    Notez que cette préférence ne sera gérée par le serveur que + s'il existe un choix de langues du côté du serveur.

    + +

    Voici un exemple plus complet, où le navigateur est configuré pour + accepter le français et l'anglais, mais avec une préférence pour le + français, et pour accepter divers types de médias, en préférant le + HTML au texte brut, et en préférant le GIF ou le JPEG aux autres types + de médias (sans pour autant refuser ces derniers, le cas échéant) :

    + +

    + 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 supporte les négociations de contenus 'gérés par + le serveur', telles que spécifiées dans HTTP/1.1. Les en-têtes + Accept, Accept-Language, + Accept-Charset et Accept-Encoding + sont gérés. Apache supporte également les négociations de + contenus 'transparentes', telles que définies dans les RFC + 2295 et 2296. En revanche les fonctions de 'feature + negotiation' définies dans ces RFCs ne sont pas supportées.

    + +

    On appelle ressource une entité conceptuelle + identifiée par un URI (RFC 2396). Le travail d'un serveur HTTP, + tel Apache, est de donner un accès à des + représentations des ressources à sa disposition, + chaque représentation étant envoyée sous la forme d'une séquence + d'octets définie selon un type de média, un jeu de caractères, + un encodage, etc. À tout moment, chaque ressource est associée + à zéro, une ou plusieurs représentations. Si plusieurs représentations + sont disponibles pour une ressource, on dit que cette dernière est + négociable et chacune de ses représentations + possibles est appelée une variante. + Les différentes possibilités de choisir les variantes d'une ressource + négociable sont appelées dimensions de la + négociation.

    +
    top
    +
    +

    Négociations avec Apache

    + +

    Pour qu'Apache puisse procéder à la négociation d'une ressource, + il faut qu'il dispose d'informations à propos de chacune des variantes. + Deux méthodes sont possibles :

    + +
      +
    • Réaliser une "Table de Types" (c'est-à-dire, + un fichier *.var) qui précise explicitement les fichiers + définissant les variantes, ou
    • + +
    • Utiliser une recherche 'MultiViews', méthode par laquelle + le serveur réalise une recherche par motifs implicites, + et choisit parmi les résultats.
    • +
    + +

    Utilisation d'une Table de Types (Type Map)

    + +

    Une table de types est un document qui est associé avec le + gestionnaire type-map (ou, dans les plus anciennes + versions d'Apache, le type mime application/x-type-map). + Notez que pour implémenter cette méthode, un 'handler' doit être + défini dans la configuration pour associer une extension de fichier à + type-map ; ce qui est généralement obtenu au moyen de

    + +

    AddHandler type-map .var

    + +

    dans le fichier de configuration du serveur.

    + +

    Les fichiers de table de types portent généralement le nom de la + ressource qu'ils décrivent, et contiennent une entrée correspondant + à chaque variante possible ; ces entrées sont constituées de lignes + au format d'en-têtes HTTP. Les entrées de deux variantes distinctes + sont à séparer par des lignes vides. Il n'est pas permis d'utiliser + des lignes vides au sein d'une entrée. Il est courant de placer en + début de fichier une entrée pour l'entité combinée + dans son ensemble (bien que cela ne soit pas nécessaire, et ignoré + par Apache). Un exemple de fichier de table est donné en exemple + ci-après. Le nom de ce fichier serait foo.var, puisque + le fichier décrit une ressource appelée 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
    +

    + +

    Notez que les fichiers de table de types sont toujours + utilisés en priorité par Apache par rapport à l'extension du + nom du fichier, et ce même si l'option Multiviews est activée. + Des variantes présentant des qualités inégales peuvent être indiquées + au moyen du paramètre de type de média : "qs", comme dans le cas de + cette image (disponible en 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 acceptables sont comprises entre 0.000 + et 1.000. Notez qu'une variante avec un qs de 0.000 ne sera + jamais choisie. La valeur de qs par défaut est de 1.0. Le + paramètre qs sert à indiquer la qualité de la variante, par + rapport aux autres variantes disponibles, et ce indépendamment + des possibilités du navigateur. Par exemple, un fichier JPEG + est généralement de meilleure qualité qu'un fichier ASCII, si + les 2 documents sont destinés à représenter une photographie. + Bien sûr, si la ressource originale est elle-même un fichier + ASCII, la représentation ASCII sera considéré comme de meilleure + qualité que la représentation JPEG. La valeur de qs dépend donc + de la nature de la ressource que l'on souhaite représenter.

    + +

    La liste complète des en-têtes utilisables est disponible + dans la documentation de + mod_negotation.

    + + +

    Multiviews

    + +

    L'option MultiViews est à spécifier par répertoire, + ce qui signifie qu'elle peut être utilisée au moyen d'une directive + Options dans une section + <Directory>, + <Location> ou + <Files> + du fichier httpd.conf, ou dans les fichiers + .htaccess (à condition que l'option AllowOverride soit paramétrée pour cela). + Notez que Options All n'active pas l'option + MultiViews ; cette dernière doit être positionnée + explicitement.

    + +

    Voici comment fonctionne MultiViews : supposons qu'un + serveur reçoive une requête pour /some/dir/foo, que l'option + MultiViews soit activée pour /some/dir, + et que le fichier /some/dir/foo n'existe + pas ; alors le serveur cherche les fichiers nommés foo.* + dans le répertoire /some/dir, et construit une table de types à + partir de ces noms de fichiers. Dans la table, chaque fichier se + voit assigner les types de médias et les encodages de contenu + tels qu'ils seraient envoyés si le client les demandait par leur + nom propre. Apache choisit alors la meilleure représentation à + envoyer au client, en fonction de ses préférences.

    + +

    L'option MultiViews sert aussi lors du choix d'un + index, lorsque la directive DirectoryIndex est précisée. + Par exemple, si la configuration contient

    +

    DirectoryIndex index

    +

    le serveur devra choisir entre les fichiers index.html et + index.html3, dans le cas où ces deux fichiers existent. Si + aucun de ces fichiers n'existe, mais qu'un fichier index.cgi + est présent, ce dernier sera exécuté par le serveur.

    + +

    Si à la lecture du répertoire, un fichier est trouvé + dont l'extension n'est pas reconnue par mod_mime + comme précisant son jeu de caractères, sa langue, son type de + contenu (Content-Type) ou son encodage, alors tout dépendra de la + directive MultiViewsMatch. + Cette directive précise en effet quels gestionnaires, filtres, et + autres types d'extensions peuvent contribuer à la négociation + MultiViews.

    + +
    top
    +
    +

    Méthodes de Négociations

    + +

    Après qu'Apache ait défini la liste de variantes possibles + pour une ressource, que ce soit via un fichier de tables de + types ou à partir des noms de fichiers contenus dans le répertoire, + deux méthodes peuvent être invoquées pour choisir la 'meilleure' + variante qui sera envoyée, pour autant qu'il en existe au moins + une. Il n'est pas nécessaire de connaître ce fonctionnement pour + utiliser les négociations de contenu avec Apache ; cependant pour + le lecteur intéressé la suite de ce document s'attache à décrire + ce fonctionnement.

    + +

    Il existe deux méthodes de négociations :

    + +
      +
    1. La négociation menée par le serveur, selon + l'algorithme d'Apache, est utilisée dans la plupart + des cas. L'algorithme d'Apache est détaillé dans la suite de + ce document. Dans les cas où cet algorithme est utilisé, il + arrive qu'Apache 'triche' sur le facteur qualité (qs) d'une + dimension donnée pour parvenir à un meilleur résultat. Les cas + où cela se produit sont présentés dans la suite de ce document.
    2. + +
    3. La négociation transparente de contenu + est utilisée sur demande spécifique du navigateur, selon la + méthode définie dans la RFC 2295. Cette méthode de négociation + donne au navigateur les pleins pouvoirs pour choisir la + 'meilleure' variante, les résultats dépendent donc des algorithmes + de choix propres à chaque navigateur. Cette méthode permet + également au navigateur de demander à Apache d'utiliser + l'algorithme de 'sélection de variante à distance', tel que défini + par la RFC 2296.
    4. +
    + +

    Dimensions d'une Négociation

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    DimensionNotes
    Type de MédiaLe navigateur présente ses préférences au moyen du + champ Accept de l'en-tête. À chaque élément peut être + associé un facteur de qualité. De la même manière, la description + de la variante peut présenter un facteur de qualité (le + paramètre "qs").
    LanguesLe navigateur présente ses préférences au moyen du champ + Accept-Language de l'en-tête. À chaque élément + peut être associé un facteur de qualité. Les différentes + variantes peuvent également être associées ou non à une + ou plusieurs langues.
    EncodageLe navigateur présente ses préférences au moyen du champ + Accept-Encoding de l'en-tête. À chaque élément + peut être associé un facteur de qualité.
    Jeu de caractèresLe navigateur présente ses préférences au moyen du champ + Accept-Charset de l'en-tête. À chaque élément + peut être associé un facteur de qualité. Les différentes + variantes peuvent se voir associer un jeu de caractères + comme type de média.
    + + +

    Algorithme de Négociation d'Apache

    + +

    Apache peut utiliser l'algorithme présenté ci-après pour choisir la + 'meilleure' variante, si elle existe, à renvoyer au navigateur. Cet + algorithme n'est pas configurable. Il fonctionne de cette manière :

    + +
      +
    1. En premier lieu, pour chaque dimension de la négociation, + vérifier le champ d'en-tête Accept* approprié et + attribuer un facteur de qualité à chacune des variantes. Si + l'en-tête Accept* d'une dimension indique que cette + variante n'est pas acceptable, éliminer cette variante. S'il + ne reste aucune variante, aller à l'étape 4.
    2. + +
    3. + Choisir la 'meilleure' des variantes par élimination. + Chacun des tests suivants est appliqué dans cet ordre. + Toutes les variantes ne passant pas un test sont + systématiquement éliminées. Après chacun des tests, s'il + ne reste qu'une variante, la choisir comme la meilleure + et aller à l'étape 3. S'il reste plus d'une variante, aller + à l'étape suivante. + +
        +
      1. Multiplier le facteur de qualité de l'en-tête + Accept par le facteur qualité de la source du + type de média de cette variante, et choisir les variantes + avec le plus grand résultat.
      2. + +
      3. Choisir les variantes qui présentent le plus grand + facteur de qualité de langue.
      4. + +
      5. Choisir les variantes dont la langue correspond le + mieux, soit à l'ordre de préférence des langues dans + l'en-tête Accept-Language (s'il existe), + soit à l'ordre des langues de la directive + LanguagePriority (si elle existe).
      6. + +
      7. Choisir les variantes présentant le paramètre de niveau + ('level') de média le plus grand (c'est ce qui est utilisé + pour connaître la version des types de médias text/html).
      8. + +
      9. Choisir les variantes dont le jeu de caractères est le + meilleur, par rapport à l'en-tête Accept-Charset. + Le jeu de caractères ISO-8859-1 est toujours acceptable, à + moins qu'il n'ait été explicitement refusé. Les variantes + avec un type de média test/* et qui ne sont + pas explicitement associées à un jeu de caractère donné + sont supposées encodées en ISO-8859-1.
      10. + +
      11. Choisir les variantes qui ont un jeu de caractères + défini et qui n'est pas ISO-8859-1. + S'il n'existe pas de telles variantes, alors les + choisir toutes.
      12. + +
      13. Choisir les variantes présentant le meilleur encodage. + S'il existe des variantes avec un encodage acceptable par + le 'user-agent' du navigateur, choisir ces variantes seules. + Dans le cas contraire, s'il existe à la fois des variantes + encodées et non encodées, ne choisir que les variantes + non encodées. Dans les autres cas, choisir toutes les + variantes.
      14. + +
      15. Choisir les variantes présentant la plus petite taille.
      16. + +
      17. Choisir la première variante de celles qui restent. Ce + sera donc soit la première variante listée dans le fichier + des tables de types, soit, si les variantes sont lues d'un + répertoire, celle dont le nom apparaît en premier dans un + classement par code ASCII.
      18. +
      +
    4. + +
    5. Cet algorithme a permis de choisir la 'meilleure' des + variantes, qui est renvoyée en réponse à la requête du + navigateur. L'en-tête Vary de la réponse HTTP + est utilisé pour indiquer les dimensions de la négociation + (les navigateurs et les serveurs mandataires sont capables de + prendre en compte cette information quand il gardent une + ressource en cache). Fin des opérations.
    6. + +
    7. Arriver à ce point signifie qu'aucune variante n'a pu être + choisie, car aucune n'est acceptable aux yeux du navigateur. + Renvoyer une erreur 406 ("No acceptable representation" - NdT : + "Aucune représentation acceptable") dans un document HTML + présentant les diverses variantes possibles. L'en-tête HTTP + Vary est également renseigné pour présenter les + dimensions de la négociation.
    8. +
    + +
    top
    +
    +

    Tricher sur les Facteurs de Qualité

    + +

    Il arrive qu'Apache modifie les facteurs de qualité par rapport + à la valeur qu'ils devraient avoir en suivant strictement + l'algorithme décrit plus haut. Ceci permet d'obtenir de meilleurs + résultats pour gérer les navigateurs qui n'envoient pas toutes + les informations ou envoient des informations erronées. Ainsi, + certains navigateurs, parmi les plus répandus du marché, envoient + des en-têtes Accept qui entraîneraient l'envoi de la + mauvaise variante dans de nombreux cas. Si le navigateur envoie + des informations correctes, Apache ne trichera pas sur les facteurs + de qualité.

    + +

    Types de Médias et Jokers

    + +

    L'en-tête de requête Accept: indique les préférences + des types de médias. Elle peut comporter des 'jokers' tels que + "image/*" ou "*/*", où * signifie "n'importe quoi". Ainsi, une + requête présentant :

    + +

    Accept: image/*, */*

    + +

    signifierait que tout type commençant par "image/" est + acceptable, comme serait acceptable tout autre type. Certains + navigateurs envoient sans arrêt des jokers en plus des types + qu'ils peuvent effectivement gérer. Par exemple :

    + +

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

    +

    Le but de ces informations est d'indiquer que les types + explicitement cités sont les préférés mais que le + navigateur accepte également d'autres représentations. + En utilisant les facteurs de qualité, voici ce que devrait + envoyer le navigateur :

    +

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

    +

    Les types explicitement cités ne présentent pas de facteur + de qualité, ils reçoivent donc la valeur par défaut de 1.0 + (la plus haute valeur possible). Les jokers sont affectés + d'une préférence très basse de 0.01, si bien que les autres + types ne seront utilisés que si aucune des variantes ne + correspond à un des types explicitement préférés.

    + +

    Si le champ d'en-tête Accept: ne + contient aucun facteur de qualité, Apache modifie + le facteur de qualité de "*/*" (s'il est présent) en 0.01 + afin d'émuler le comportement souhaité. Apache positionne + également le facteur de qualité des jokers qui se présentent + sous la forme "type/*" en 0.02 (afin que ces derniers soient + préférés à "*/*"). Si un seul ou plusieurs types de média de + l'en-tête Accept: présente un facteur de qualité, + ces modifications ne sont pas effectuées, + afin que les requêtes des navigateurs qui envoient des + informations correctes fonctionnent comme prévu.

    + + +

    Exceptions aux Négociations sur la Langue

    + +

    À partir d'Apache 2.0, certaines exceptions ont été ajoutées + à l'algorithme de négociation afin de retomber élégamment sur + nos pattes dans les cas où la négociation sur la langue + n'aboutit pas.

    + +

    Si un client demande une page du serveur, sans que ce dernier + ne puisse déterminer une page correspondant au champ + Accept-language envoyé par le navigateur, le serveur + doit renvoyer une réponse parmi "Pas de Variante Acceptable" + et "Choix Multiples" au client. Afin d'éviter ces messages + d'erreur, il est possible de configurer Apache pour qu'il ignore + le champ Accept-language dans ces cas et qu'il + fournisse au client un document qui ne correspond pas + explicitement à sa requête. La directive + ForceLanguagePriority + peut être utilisée pour passer outre à ces deux messages d'erreur + et modifier la réponse du serveur au moyen de la directive + LanguagePriority.

    + +

    Le serveur va également essayer de modifier la sous-classe + de langue si aucune correspondance n'est trouvée. Par exemple, + dans le cas où un client demande des documents avec le langage + en-GB pour "British English", le protocole HTTP/1.1 + n'autorise pas le serveur à répondre par un document qui serait + marqué par en. (Notez que présenter + en-GB dans l'en-tête Accept-language + est loin d'être pertinent, il semble très peu probable que le + lecteur comprenne l'anglais "British" et ne comprenne pas + l'anglais "tout court". Il se trouve malheureusement que + beaucoup de navigateurs présentent ce comportement.) Bref, + si aucune autre langue ne correspond et que le serveur + s'apprêterait normalement à envoyer une réponse d'erreur + "No Acceptable Variants", ou à utiliser la méthode + LanguagePriority + présentée ci-avant, le serveur va ignorer la sous-classe de + langue GB et considérer que la requête + en-GB correspond bien au document en. + Implicitement, Apache ajoute la langue parente (en) + à la liste des langues considérées comme acceptables par le + navigateur, avec un facteur de qualité très faible. Notez + cependant que si le client demande "en-GB; qs=0.9, fr; qs=0.8", + et que le serveur dispose de documents marqués comme "en" et + "fr", alors le document en français sera renvoyé par le serveur. + Ce comportement est nécessaire, afin de garder la compatibilité + avec HTTP/1.1 et fonctionner avec les navigateurs correctement + configurés.

    + +

    Pour supporter les techniques avancées de détection de + préférence de langues de l'utilisateur (telles que les + Cookies, ou les chemins d'URL spéciaux), Apache reconnaît + depuis la version 2.0.47 la variable + d'environnement prefer-language. Si cette + variable existe, et qu'elle précise une langue valide, + mod_negociation cherchera une variante qui + y corresponde. S'il n'en trouve pas, le processus de + négociation normal se déroulera.

    + +

    Exemple

    + SetEnvIf Cookie "language=en" prefer-language=en
    + SetEnvIf Cookie "language=fr" prefer-language=fr +

    + +
    top
    +
    +

    Extensions vers la Négociation de Contenu +Transparente

    + +

    Apache complète le protocole de négociation de contenu (RFC 2295) +comme décrit ici. Un nouvel élément {encoding ..} est +utilisé dans la liste des variantes pour nommer celles qui ne sont +disponibles que sous un encodage spécifique. L'implémentation de +l'algorithme RVSA/1.0 (RFC 2296) est étendue afin d'intégrer les +variantes encodées dans la liste, et de les proposer comme +candidates quand leur encodage est acceptable au vu de l'en-tête +Accept-Encoding. L'implémentation RVSA/1.0 ne tronque +pas les facteurs de qualité à 5 décimales avant de choisir la +meilleure des variantes.

    +
    top
    +
    +

    À propos des liens hypertextes et des conventions de nommage

    + +

    Dans le cas où la négociation de langues est utilisée, il est + possible de choisir diverses conventions de nommage, car les + fichiers peuvent présenter plus d'une extension, et l'ordre des + extensions n'est normalement pas significatif (voir la + documentation mod_mime + pour plus de détails).

    + +

    Habituellement, un fichier a une extension pour son type MIME + (par exemple, html), parfois une extension pour son + encodage (par exemple, gz), et bien sûr une extension + de langue (par exemple, en) pour distinguer les + diverses variantes.

    + +

    Exemples :

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

    Voici d'autres exemples de noms de fichiers ainsi que des liens + hypertextes valides et invalides :

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Nom de 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
    + +

    Le tableau ci-dessus montre qu'il est toujours possible de + spécifier le lien sans aucune extension dans un lien hypertexte. + (par exemple, foo). L'avantage en est qu'il est + ainsi possible de ne pas montrer le type d'un document, et de + le modifier ultérieurement, par exemple le passer de html + à shtml ou cgi sans avoir besoin de + modifier aucun lien.

    + +

    Pour continuer à utiliser les types MIME dans les liens + (par exemple, foo.html), l'extension correspondant + à la langue (ainsi que l'extension d'encodage, si elle existe) + doit être du coté droit de l'extension du type MIME (par exemple, + foo.html.en).

    +
    top
    +
    +

    À propos des Caches

    + +

    Quand un cache garde en mémoire une représentation, il l'associe + à l'URL de la requête. Quand la même URL vient à être redemandée, + le cache peut utiliser la représentation gardée en mémoire, plutôt + que de refaire une requête au serveur. Cependant, si la ressource + est négociable coté serveur, le résultat pourrait en être que la + réponse à la première requête mise en cache serait renvoyée de + façon erronée. Pour prévenir ce problème, Apache marque toutes + les réponses issues d'une négociation comme "non-cachables" par + les clients HTTP/1.0. Apache supporte les spécifications du + protocole HTTP/1.1 en ce qui concerne la mise en cache des + réponses négociées.

    + +

    Les requêtes venant d'un client conforme au protocole HTTP/1.0 + (qu'il s'agisse d'un navigateur ou d'un serveur cache) peuvent + être rendues "cachables" si la directive CacheNegotiatedDocs est + utilisée. Cette directive peut être spécifiée aussi bien dans + la configuration principale du serveur que dans un serveur + virtuel, et ne nécessite pas d'argument. Elle n'a aucun impact + sur les requêtes des clients fonctionnant en HTTP/1.1.

    +
    top
    +
    +

    Plus d'Information

    + +

    Pour plus d'informations au sujet de la négociation de contenu, voir + Language + Negotiation Notes de Alan J. Flavell. Notez que ce + document ne sera peut-être pas mis à jour en fonction des + changements intervenus dans Apache 2.0.

    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/content-negotiation.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/content-negotiation.html.ja.utf8 new file mode 100644 index 00000000..47a3b8c2 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/content-negotiation.html.ja.utf8 @@ -0,0 +1,725 @@ + + + +コンテントネゴシエーション - Apache HTTP サーバ + + + + + +
    <-
    +

    コンテントネゴシエーション

    +
    +

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

    +
    +
    This translation may be out of date. Check the + English version for recent changes.
    + + +

    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=en" prefer-language=en
    + SetEnvIf Cookie "language=fr" prefer-language=fr +

    + +
    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 クライアントからのリクエストには効力を持ちません。

    +
    top
    +
    +

    追加情報

    + +

    コンテントネゴシエーションに関する追加情報は、 + Alan J. Flavell さんのLanguage + Negotiation Notes をご覧下さい。ですが、 + Apache 2.0 での変更点を含むためには更新されていないかもしれない + ということに注意してください。

    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/content-negotiation.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/content-negotiation.html.ko.euc-kr new file mode 100644 index 00000000..bfbb216c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/content-negotiation.html.ko.euc-kr @@ -0,0 +1,608 @@ + + + +³»¿ëÇù»ó (Content Negotiation) - Apache HTTP Server + + + + + +
    <-
    +

    ³»¿ëÇù»ó (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=en" prefer-language=en
    + SetEnvIf Cookie "language=fr" prefer-language=fr +

    + +
    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 Ŭ¶óÀ̾ðÆ®ÀÇ ¿äû°ú´Â °ü°è°¡ ¾ø´Ù.

    +
    top
    +
    +

    ´Ù¸¥ Á¤º¸

    + +

    ³»¿ëÇù»ó¿¡ ´ëÇÑ ´Ù¸¥ Á¤º¸´Â Alan J. Flavell°¡ ¾´ Language + Negotiation Notes¸¦ Âü°íÇ϶ó. ±×·¯³ª ÀÌ ¹®¼­´Â ¾ÆÁ÷ + ¾ÆÆÄÄ¡ 2.0ÀÇ º¯È­¸¦ ¹Ý¿µÇÏÁö ¾ÊÀ» ¼ö ÀÖ´Ù.

    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/content-negotiation.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/content-negotiation.html.tr.utf8 new file mode 100644 index 00000000..424b4f5b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/content-negotiation.html.tr.utf8 @@ -0,0 +1,640 @@ + + + +İçerik Uzlaşımı - Apache HTTP Sunucusu + + + + + +
    <-
    +

    İçerik Uzlaşımı

    +
    +

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

    +
    + + +

    Apache, 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 +

    + +

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

    Apache’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, type-map eylemcisi ile ilişkili bir belgedir + (ya da eski Apache 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 bir 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 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. Dosya misal + isimli bir özkaynak hakkında olduğundan dosyaya misal.var + ismi verilebilir.

    + +

    + 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, bir türeşlem dosyasının MultiViews etkin olsa bile + dosya ismi uzantısı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_negotation 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

    + +

    Apache’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. Apache’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 Apache uzlaşım + algoritması kullanılır. Bu algoritma aşağıda ayrıntılı olarak + açıklanmıştır. Bu algoritma kullanıldığı zaman, Apache, en iyi sonuca + ulaşmak için bazen belli boyutların üstünlük katsayılarıyla ‘oynar’. + Apache’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ı Apache’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.
    + + +

    Apache Uzlaşım Algoritması

    + +

    Apache, 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

    + +

    Apache bazen yukarıdaki Apache 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 Apache 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, Apache 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

    + +

    Apache 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 Apache + 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. Apache, 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 Apache 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=en" prefer-language=en
    + SetEnvIf Cookie "language=fr" prefer-language=fr +

    + +
    top
    +
    +

    Şeffaf İçerik Uzlaşımının Genişletilmesi

    + + +

    Apache, ş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 br 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 Apache, 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. Apache + 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.

    + +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/custom-error.html b/rubbos/app/httpd-2.0.64/docs/manual/custom-error.html new file mode 100644 index 00000000..6ef11163 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/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=ISO-8859-1 + +URI: custom-error.html.es +Content-Language: es +Content-type: text/html; charset=ISO-8859-1 + +URI: custom-error.html.fr +Content-Language: fr +Content-type: text/html; charset=ISO-8859-1 + +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/rubbos/app/httpd-2.0.64/docs/manual/custom-error.html.en b/rubbos/app/httpd-2.0.64/docs/manual/custom-error.html.en new file mode 100644 index 00000000..e0f688e0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/custom-error.html.en @@ -0,0 +1,208 @@ + + + +Custom Error Responses - Apache HTTP Server + + + + + +
    <-
    +

    Custom Error Responses

    +
    +

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

    +
    + +

    Additional functionality allows webmasters to configure the response + of Apache to some error or problem.

    + +

    Customizable responses can be defined to be activated in the event of + a server detected error or problem.

    + +

    If a script crashes and produces a "500 Server Error" response, + then this response can be replaced with either some friendlier text or by + a redirection to another URL (local or external).

    +
    + +
    top
    +
    +

    Behavior

    + + +

    Old Behavior

    + + +

    NCSA httpd 1.3 would return some boring old error/problem message + which would often be meaningless to the user, and would provide no + means of logging the symptoms which caused it.

    + + +

    New Behavior

    + + +

    The server can be asked to:

    + +
      +
    1. Display some other text, instead of the NCSA hard coded + messages, or
    2. + +
    3. redirect to a local URL, or
    4. + +
    5. redirect to an external URL.
    6. +
    + +

    Redirecting to another URL can be useful, but only if some + information can be passed which can then be used to explain and/or log + the error/problem more clearly.

    + +

    To achieve this, Apache will define new CGI-like environment + variables:

    + +

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

    + +

    Note the REDIRECT_ prefix.

    + +

    At least REDIRECT_URL and + REDIRECT_QUERY_STRING will be passed to the + new URL (assuming it's a cgi-script or a cgi-include). The + other variables will exist only if they existed prior to + the error/problem. None of these will be + set if your ErrorDocument is an + external redirect (anything starting with a + scheme name like http:, even if it refers to the same host + as the server).

    + +
    top
    +
    +

    Configuration

    + + +

    Use of ErrorDocument is enabled + for .htaccess files when the + AllowOverride is set accordingly.

    + +

    Here are some examples...

    + +

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

    + +

    The syntax is,

    + +

    + ErrorDocument <3-digit-code> <action> +

    + +

    where the action can be,

    + +
      +
    1. Text to be displayed. Prefix the text with a quote + ("). Whatever follows the quote is displayed. Note: + the (") prefix isn't displayed.
    2. + +
    3. An external URL to redirect to.
    4. + +
    5. A local URL to redirect to.
    6. +
    +
    top
    +
    +

    Custom Error Responses and Redirects

    + + +

    Apache's behavior to redirected URLs has been modified so + that additional environment variables are available to a + script/server-include.

    + +

    Old behavior

    + + +

    Standard CGI vars were made available to a script which + has been redirected to. No indication of where the + redirection came from was provided.

    + + +

    New behavior

    + + +

    A new batch of environment variables will be initialized + for use by a script which has been redirected to. Each new + variable will have the prefix REDIRECT_. + REDIRECT_ environment variables are created from + the CGI 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. In addition to these + new variables, Apache will define REDIRECT_URL + and REDIRECT_STATUS to help the script trace its + origin. Both the original URL and the URL being redirected to + can be logged in the access log.

    + +

    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 the script must emit an appropriate + Status: header (such as 302 Found), if the + response contains a Location: header (in order to issue a + client side redirect). Otherwise the Location: header may + have no effect.

    + +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/custom-error.html.es b/rubbos/app/httpd-2.0.64/docs/manual/custom-error.html.es new file mode 100644 index 00000000..506957c4 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/custom-error.html.es @@ -0,0 +1,223 @@ + + + +Respuestas de error personalizadas - Servidor HTTP Apache + + + + + +
    <-
    +

    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 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/custom-error.html.fr b/rubbos/app/httpd-2.0.64/docs/manual/custom-error.html.fr new file mode 100644 index 00000000..4bc86c26 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/custom-error.html.fr @@ -0,0 +1,215 @@ + + + +Personnalisation des Messages d'Erreurs - Serveur Apache HTTP + + + + + +
    <-
    +

    Personnalisation des Messages d'Erreurs

    +
    +

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

    +
    + +

    Il est possible à un administrateur Apache de configurer les réponses + d'Apache dans les cas où des erreurs ou problèmes se présentent.

    + +

    Des réponses paramétrables peuvent être définies pour être activées au + cas où le serveur détecterait une erreur ou un problème.

    + +

    Quand un script plante et génère une réponse "500 Server Error", sa + réponse peut être remplacée par un message plus convivial, ou par une + redirection vers une autre URL (locale, ou sur un autre serveur).

    +
    + +
    top
    +
    +

    Fonctionnement

    + + +

    Fonctionnement antérieur

    + + +

    NCSA httpd 1.3 renvoyait un message d'erreur insipide qui ne + présentait le plus souvent aucun sens ni à l'utilisateur, ni + dans les journaux d'enregistrement sur des symptômes causant + le plantage.

    + + +

    Fonctionnement des versions plus récentes

    + + +

    Le serveur peut être paramétré pour :

    + +
      +
    1. Afficher un autre message que celui codé dans NCSA, ou bien
    2. + +
    3. procéder à une redirection sur une URL locale, ou bien
    4. + +
    5. procéder à une redirection vers un autre serveur.
    6. +
    + +

    La redirection vers une autre URL peut être utile, mais seulement + si des informations peuvent être envoyées pour expliquer/enregistrer + l'erreur ou le problème plus clairement.

    + +

    Pour y parvenir, Apache définit de nouvelles variables + d'environnement 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 +

    + +

    Notez que le préfixe REDIRECT_ est présent pour toutes + ces variables d'environnement.

    + +

    Au minimum, REDIRECT_URL et + REDIRECT_QUERY_STRING seront passées à la nouvelle + URL (en supposant qu'il s'agisse d'un script CGI ou d'un + include CGI). Les autres variables ne sont définies que si + elles existaient avant l'apparition du problème ou de l'erreur. + Aucune de ces variables ne sera + définie si votre directive ErrorDocument + entraîne une redirection vers un serveur externe ; + tout ce qui commence par http: est considéré comme + une redirection externe, y compris si cela pointe vers le + serveur local.

    + +
    top
    +
    +

    Configuration

    + + +

    Il est possible d'utiliser la directive + ErrorDocument dans les fichiers + .htaccess si AllowOverride est + paramétrée pour le permettre.

    + +

    Voici quelques exemples :

    + +

    + 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 syntaxe à utiliser est :

    + +

    + ErrorDocument <code-à-3-chiffres> <action> +

    + +

    où l'action peut désigner :

    + +
      +
    1. Un message à afficher. Le message doit être précédé par + des guillemets ("). Tout ce qui suit ces guillemets est affiché. + Notez que le préfixe (") n'est pas affiché.
    2. + +
    3. Une URL vers un serveur externe, vers lequel la redirection + sera effectuée.
    4. + +
    5. Une URL locale vers laquelle la redirection sera effectuée.
    6. +
    +
    top
    +
    +

    Messages d'Erreurs Personnalisés et Redirections

    + + +

    Le fonctionnement d'Apache vis-à-vis des redirections a été + modifié afin que les nouvelles variables d'environnement soient + disponibles pour un script ou un server-include.

    + +

    Fonctionnement antérieur

    + + +

    Les variables CGI standard étaient passées au script sur + lequel pointe la redirection. Aucune indication sur la + provenance de la redirection n'était fournie.

    + + +

    Fonctionnement pour les nouvelles versions

    + + +

    Une série de nouvelles variables d'environnement est + initialisée pour être passée au script sur lequel pointe + la redirection. Chacune de ces variables est munie du préfixe + REDIRECT_. Les variables d'environnement + REDIRECT_ sont créées à partir des variables + d'environnement "normales", telles qu'existant avant la + redirection, mais simplement renommées au moyen du préfixe + REDIRECT_ ; ainsi par exemple HTTP_USER_AGENT + devient REDIRECT_HTTP_USER_AGENT. En plus de ces + nouvelles variables, Apache définit REDIRECT_URL + et REDIRECT_status pour aider le script à + comprendre d'où il a été appelé. L'URL d'origine et l'URL + redirigée sont toutes deux ajoutées dans le journal "access".

    + +

    Si ErrorDocument précise une redirection + locale vers un script CGI, ce script devrait inclure un + champ "Status:" dans son en-tête de transmission + afin d'assurer que le client reçoive bien le code d'erreur et + puisse comprendre ce qui l'a causé. Par exemple, un script + Perl ErrorDocument pourrait inclure quelque chose comme :

    + +

    + ...
    + print "Content-type: text/html\n";
    + printf "Status: %s Condition Intercepted\n", $ENV{"REDIRECT_STATUS"};
    + ... +

    + +

    Un script dédié à la gestion d'une erreur donnée, + telle que 404 Not Found, peut bien sûr + utiliser le code spécifique d'erreur et le texte associé.

    + +

    Notez que le script doit envoyer l'en-tête + Status: appropriée (comme par exemple + 302 Found), si la réponse contient un en-tête + Location: (pour générer la redirection coté client). + Sans cet en-tête Status:, Location: n'aura + pas d'effet.

    + +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/custom-error.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/custom-error.html.ja.utf8 new file mode 100644 index 00000000..8062e472 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/custom-error.html.ja.utf8 @@ -0,0 +1,201 @@ + + + +カスタムエラーレスポンス - Apache HTTP サーバ + + + + + +
    <-
    +

    カスタムエラーレスポンス

    +
    +

    Available Languages:  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 のような + 特定のエラーコンディションを扱うためだけに使われる場合は、 + 代わりに特定のコードとエラーテキストを使用することができます。

    + +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/custom-error.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/custom-error.html.ko.euc-kr new file mode 100644 index 00000000..7d20a0a9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/custom-error.html.ko.euc-kr @@ -0,0 +1,202 @@ + + + +»ç¿ëÀÚÁ¤ÀÇ ¿À·ù ÀÀ´ä - Apache HTTP Server + + + + + +
    <-
    +

    »ç¿ëÀÚÁ¤ÀÇ ¿À·ù ÀÀ´ä

    +
    +

    °¡´ÉÇÑ ¾ð¾î:  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 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/custom-error.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/custom-error.html.tr.utf8 new file mode 100644 index 00000000..eeb4a236 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/custom-error.html.tr.utf8 @@ -0,0 +1,205 @@ + + + +Hata Yanıtlarının Kişiselleştirilmesi - Apache HTTP Sunucusu + + + + + +
    <-
    +

    Hata Yanıtlarının Kişiselleştirilmesi

    +
    +

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

    +
    + +

    Apache, bazı sorunlara ve hatalara karşılık vereceği yanıtların + yapılandırabilmesini mümkün kılan ek bir işlevselliğe sahiptir.

    + +

    Site yöneticisi tarafından kişiselleştirilebilen bu tür yanıtlar, + sunucu belli hatalar veya sorunlarla karşılaştığında etkin kılınmak + üzere tanımlanabilir.

    + +

    Bir betik bir hata nedeniyle bir "500 Server Error" yanıtının + verilmesine sebep olursa bu yanıt yerine başka bir adrese + yönlendirilerek (dahili veya harici) veya doğrudan daha dostça bir + metin sunulabilir.

    +
    + +
    top
    +
    +

    Davranış

    + + +

    Eski Davranış

    + + +

    NCSA httpd 1.3, çoğunlukla kullanıcıya anlamsız gelen ve sebebiyle + kavramsal bir bağ kurulamayan günlük kayıtları üreten, can sıkıcı + bazı hata/sorun yanıtları döndürürdü.

    + + +

    Yeni Davranış

    + + +

    Sunucudan NCSA kodlu iletiler yerine

    + +
      +
    • başka bir metin göstermesi,
    • + +
    • istemciyi başka bir yerel adrese yönlendirmesi veya
    • + +
    • istemciyi bir harici adrese yönlendirmesi
    • +
    + +

    istenebilir. Başka bir adrese yönlendirme, hata veya sorunu daha iyi + açıklamakta kullanılabilecek bazı bilgilerin aktarılması şartıyla + oldukça kullanışlı olabilir.

    + +

    Apache, buna olanak vermek için CGI benzeri yeni ortam değişkenleri + tanımlamıştır:

    + +

    + 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.dom
    + REDIRECT_SERVER_NAME=batti.balik.yan.gider.edu
    + REDIRECT_SERVER_PORT=80
    + REDIRECT_SERVER_SOFTWARE=Apache/0.8.15
    + REDIRECT_URL=/cgi-bin/hatalar.pl +

    + +

    REDIRECT_ önekine dikkat edin.

    + +

    Yeni adrese (hedefin bir CGI betiği veya SSI sayfası olduğu + kabulüyle) en azından REDIRECT_URL ve + REDIRECT_QUERY_STRING değişkenleri aktarılır. Diğer + değişkenler ise sadece hata veya sorunun öncesinde mevcut oldukları + takdirde aktarılacaklardır. Eğer harici yönlendirmeyi + ErrorDocument yönergesi + üzerinden yapıyorsanız bunlara None değeri + atanacaktır. (Yönlendirme adresi http: ile başlıyorsa + adres aynı sunucuya ait olsa bile bu bir harici yönlendirme olarak + ele alınır.)

    + +
    top
    +
    +

    Yapılandırma

    + + +

    ErrorDocument yönergesinin + .htaccess dosyalarında kullanılması sadece AllowOverride yönergesine uygun bir değer + atanmışsa mümkündür.

    + +

    Bazı örnekler:

    + +

    + ErrorDocument 500 /cgi-bin/hata-kurtarma
    + ErrorDocument 500 "Pardon, galiba bizim betik hata verdi."
    + ErrorDocument 500 http://xxx/
    + ErrorDocument 404 /ozuru_kabahatinden_buyuk/yok.html
    + ErrorDocument 401 /Uyeler/NASIL_uye_olunur.html +

    + +

    Burada sözdizimi şöyledir:

    + +

    + ErrorDocument <3-rakamlı-kod> <eylem> +

    + +

    eylem şunlardan biri olabilir:

    + +
      +
    • Gösterilecek metin. Metnin başına bir tırnak imi (") konmalıdır. (Bu tırnak öneki çıktıda gösterilmez.)
    • + +
    • Yönlendirmenin yapılacağı harici adres.
    • + +
    • Yönlendirmenin yapılacağı dahili adres.
    • +
    +
    top
    +
    +

    Özel Hata Yanıtları ve Yönlendirme

    + + +

    Apache’nin yönlendirme ile ilgili davranışı bir CGI betiği veya SSI + sayfası sözkonusu olduğunda bazı ek ortam değişkenleri ile + yapılandırılabilir.

    + +

    Eski Davranış

    + + +

    Yönlendirme yapılan betikte standart CGI değişkenleri kullanılırdı. + Yönlendirmenin kaynağı ile ilgili bir belirtiye rastlanmazdı.

    + + +

    Yeni Davranış

    + + +

    Yönlendirme yapılan betikte kullanılmak üzere özel olarak + tanımlanmış ortam değişkenleri vardır. Her değişkenin ismi + REDIRECT_ ile başlar. REDIRECT_ ortam + değişkenleri, yönlendirme öncesinde tanımlanmış CGI ortam + değişkenlerinin isimlerinin başına REDIRECT_ öneki + getirilerek oluşturulur. Yani, HTTP_USER_AGENT değişkeni + REDIRECT_HTTP_USER_AGENT haline gelir. Bunlara ek + olarak, betiğe olayın izini sürmekte yardımcı olması için + REDIRECT_URL ve REDIRECT_STATUS + değişkenleri tanımlanmıştır. Erişim günlüğüne özgün adresle birlikte + yönlendirme adresi de kaydedilir.

    + +

    Eğer ErrorDocument yönergesi + bir yerel CGI betiğine 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 verilmesi önerilir. + Örneğin, bir Perl betiği şunları içerebilirdi:

    + +

    + ...
    + print "Content-type: text/html; charset=UTF-8\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 gibi) + eklemesinin gerekli oluşuna dikkat ediniz. Aksi takdirde, + Location: başlığı etkisiz olabilir.

    + +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/developer/API.html b/rubbos/app/httpd-2.0.64/docs/manual/developer/API.html new file mode 100644 index 00000000..b8ea3a1c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/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=ISO-8859-1 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/developer/API.html.en b/rubbos/app/httpd-2.0.64/docs/manual/developer/API.html.en new file mode 100644 index 00000000..db62a134 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/developer/API.html.en @@ -0,0 +1,1223 @@ + + + +Apache 1.3 API notes - Apache HTTP Server + + + + + +
    <-
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/developer/debugging.html b/rubbos/app/httpd-2.0.64/docs/manual/developer/debugging.html new file mode 100644 index 00000000..6d94fa27 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/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=ISO-8859-1 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/developer/debugging.html.en b/rubbos/app/httpd-2.0.64/docs/manual/developer/debugging.html.en new file mode 100644 index 00000000..3febd64c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/developer/debugging.html.en @@ -0,0 +1,196 @@ + + + +Debugging Memory Allocation in APR - Apache HTTP Server + + + + + +
    <-
    +

    Debugging Memory Allocation in APR

    +
    +

    Available Languages:  en 

    +
    + +

    The allocation mechanism's within APR have a number of debugging modes + that can be used to assist in finding memory problems. This document + describes the modes available and gives instructions on activating + them.

    +
    + +
    top
    +
    +

    Available debugging options

    +

    Allocation Debugging - ALLOC_DEBUG

    + + +
    Debugging support: Define this to enable code which + helps detect re-use of free()d memory and other such + nonsense.
    + +

    The theory is simple. The FILL_BYTE (0xa5) + is written over all malloc'd memory as we receive it, and + is written over everything that we free up during a + clear_pool. We check that blocks on the free list always + have the FILL_BYTE in them, and we check during + palloc() that the bytes still have FILL_BYTE + in them. If you ever see garbage URLs or whatnot containing lots + of 0xa5s then you know something used data that's been + freed or uninitialized.

    + + +

    Malloc Support - ALLOC_USE_MALLOC

    + + +
    If defined all allocations will be done with + malloc() and free()d appropriately at the + end.
    + +

    This is intended to be used with something like Electric + Fence or Purify to help detect memory problems. Note that if + you're using efence then you should also add in ALLOC_DEBUG. + But don't add in ALLOC_DEBUG if you're using Purify because + ALLOC_DEBUG would hide all the uninitialized read errors + that Purify can diagnose.

    + + +

    Pool Debugging - POOL_DEBUG

    +
    This is intended to detect cases where the wrong pool is + used when assigning data to an object in another pool.
    + +

    In particular, it causes the table_{set,add,merge}n + routines to check that their arguments are safe for the + apr_table_t they're being placed in. It currently only works + with the unix multiprocess model, but could be extended to others.

    + + +

    Table Debugging - MAKE_TABLE_PROFILE

    + + +
    Provide diagnostic information about make_table() calls + which are possibly too small.
    + +

    This requires a recent gcc which supports + __builtin_return_address(). The error_log output will be a + message such as:

    +

    + table_push: apr_table_t created by 0x804d874 hit limit of 10 +

    + +

    Use l *0x804d874 to find the + source that corresponds to. It indicates that a apr_table_t + allocated by a call at that address has possibly too small an + initial apr_table_t size guess.

    + + +

    Allocation Statistics - ALLOC_STATS

    + + +
    Provide some statistics on the cost of allocations.
    + +

    This requires a bit of an understanding of how alloc.c works.

    + +
    top
    +
    +

    Allowable Combinations

    + +

    Not all the options outlined above can be activated at the + same time. the following table gives more information.

    + + + + + + + + + + + + + + + + +
    + ALLOC DEBUGALLOC USE MALLOCPOOL DEBUGMAKE TABLE PROFILEALLOC STATS
    ALLOC DEBUG-NoYesYesYes
    ALLOC USE MALLOCNo-NoNoNo
    POOL DEBUGYesNo-YesYes
    MAKE TABLE PROFILEYesNoYes-Yes
    ALLOC STATSYesNoYesYes-
    + +

    Additionally the debugging options are not suitable for + multi-threaded versions of the server. When trying to debug + with these options the server should be started in single + process mode.

    +
    top
    +
    +

    Activating Debugging Options

    + +

    The various options for debugging memory are now enabled in + the apr_general.h header file in APR. The various options are + enabled by uncommenting the define for the option you wish to + use. The section of the code currently looks like this + (contained in srclib/apr/include/apr_pools.h)

    + +

    + /*
    + #define ALLOC_DEBUG
    + #define POOL_DEBUG
    + #define ALLOC_USE_MALLOC
    + #define MAKE_TABLE_PROFILE
    + #define ALLOC_STATS
    + */
    +
    + typedef struct ap_pool_t {
    + + union block_hdr *first;
    + union block_hdr *last;
    + struct cleanup *cleanups;
    + struct process_chain *subprocesses;
    + struct ap_pool_t *sub_pools;
    + struct ap_pool_t *sub_next;
    + struct ap_pool_t *sub_prev;
    + struct ap_pool_t *parent;
    + char *free_first_avail;
    +
    + #ifdef ALLOC_USE_MALLOC
    + + void *allocation_list;
    +
    + #endif
    + #ifdef POOL_DEBUG
    + + struct ap_pool_t *joined;
    +
    + #endif
    + + int (*apr_abort)(int retcode);
    + struct datastruct *prog_data;
    +
    + } ap_pool_t; +

    + +

    To enable allocation debugging simply move the #define + ALLOC_DEBUG above the start of the comments block and rebuild + the server.

    + +

    Note

    +

    In order to use the various options the server must + be rebuilt after editing the header file.

    +
    +
    +
    +

    Available Languages:  en 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/developer/documenting.html b/rubbos/app/httpd-2.0.64/docs/manual/developer/documenting.html new file mode 100644 index 00000000..db57cef3 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/developer/documenting.html @@ -0,0 +1,5 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: documenting.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/developer/documenting.html.en b/rubbos/app/httpd-2.0.64/docs/manual/developer/documenting.html.en new file mode 100644 index 00000000..204801d4 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/developer/documenting.html.en @@ -0,0 +1,84 @@ + + + +Documenting Apache 2.0 - Apache HTTP Server + + + + + +
    <-
    +

    Documenting Apache 2.0

    +
    +

    Available Languages:  en 

    +
    + +

    Apache 2.0 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 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/developer/filters.html b/rubbos/app/httpd-2.0.64/docs/manual/developer/filters.html new file mode 100644 index 00000000..6caade35 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/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=ISO-8859-1 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/developer/filters.html.en b/rubbos/app/httpd-2.0.64/docs/manual/developer/filters.html.en new file mode 100644 index 00000000..5f6fc54a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/developer/filters.html.en @@ -0,0 +1,210 @@ + + + +How filters work in Apache 2.0 - Apache HTTP Server + + + + + +
    <-
    +

    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. So, the first list is + r->output_filters, then r->proto_output_filters, + and finally r->connection->output_filters. These correspond + to the RESOURCE, PROTOCOL, and + CONNECTION filters respectively. 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 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/developer/hooks.html b/rubbos/app/httpd-2.0.64/docs/manual/developer/hooks.html new file mode 100644 index 00000000..a4077c72 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/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=ISO-8859-1 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/developer/hooks.html.en b/rubbos/app/httpd-2.0.64/docs/manual/developer/hooks.html.en new file mode 100644 index 00000000..b89e9906 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/developer/hooks.html.en @@ -0,0 +1,239 @@ + + + +Apache 2.0 Hook Functions - Apache HTTP Server + + + + + +
    <-
    +

    Apache 2.0 Hook Functions

    +
    +

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

    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 tradition Apache + hook return 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, Apache 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, 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. + 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: HOOK_FIRST, + HOOK_MIDDLE and HOOK_LAST.

    + +

    All modules using any particular value may be run in any + order relative to each other, but, of course, all modules using + HOOK_FIRST will be run before HOOK_MIDDLE + which are before HOOK_LAST. Modules that don't care + when they are run should use HOOK_MIDDLE. (I spaced + these out so people could do stuff like HOOK_FIRST-2 + to get in slightly earlier, but is this wise? - Ben)

    + +

    Note that there are two more values, + HOOK_REALLY_FIRST and 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, HOOK_MIDDLE);
    +
    + } +

    + +

    Note that the sort used to achieve this is stable, so + ordering set by HOOK_ORDER is preserved, as far + as is possible.

    + +

    Ben Laurie, 15th August 1999

    + +
    +
    +

    Available Languages:  en 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/developer/index.html b/rubbos/app/httpd-2.0.64/docs/manual/developer/index.html new file mode 100644 index 00000000..e4d079c3 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/developer/index.html @@ -0,0 +1,5 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: index.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/developer/index.html.en b/rubbos/app/httpd-2.0.64/docs/manual/developer/index.html.en new file mode 100644 index 00000000..7006579b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/developer/index.html.en @@ -0,0 +1,73 @@ + + + +Developer Documentation for Apache 2.0 - Apache HTTP Server + + + + + +
    <-
    +

    Developer Documentation for Apache 2.0

    +
    +

    Available Languages:  en 

    +
    + +

    Many of the documents on these Developer pages are lifted + from Apache 1.3's documentation. While they are all being + updated to Apache 2.0, they are in different stages of + progress. Please be patient, and point out any discrepancies or + errors on the developer/ pages directly to the + dev@httpd.apache.org mailing list.

    +
    + +
    top
    +
    top
    +
    +
    +

    Available Languages:  en 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/developer/modules.html b/rubbos/app/httpd-2.0.64/docs/manual/developer/modules.html new file mode 100644 index 00000000..33cfd0f4 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/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=ISO-8859-1 + +URI: modules.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/developer/modules.html.en b/rubbos/app/httpd-2.0.64/docs/manual/developer/modules.html.en new file mode 100644 index 00000000..176a94dd --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/developer/modules.html.en @@ -0,0 +1,273 @@ + + + +Converting Modules from Apache 1.3 to Apache 2.0 - Apache HTTP Server + + + + + +
    <-
    +

    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 it's 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 defintion 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_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_open_logs
    +
    open any specified logs
    + +
    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 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/developer/modules.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/developer/modules.html.ja.utf8 new file mode 100644 index 00000000..8297d28d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/developer/modules.html.ja.utf8 @@ -0,0 +1,274 @@ + + + +モジュールの Apache 1.3 から Apache 2.0 への移植 - Apache HTTP サーバ + + + + + +
    <-
    +

    モジュールの Apache 1.3 から Apache 2.0 への移植

    +
    +

    Available Languages:  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
    +
    (文書型の決定と設定。あるいはその片方)
    +
    + +
    +
    +

    Available Languages:  en  | + ja 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/developer/request.html b/rubbos/app/httpd-2.0.64/docs/manual/developer/request.html new file mode 100644 index 00000000..ed3694f6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/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=ISO-8859-1 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/developer/request.html.en b/rubbos/app/httpd-2.0.64/docs/manual/developer/request.html.en new file mode 100644 index 00000000..1ac89d24 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/developer/request.html.en @@ -0,0 +1,260 @@ + + + +Request Processing in Apache 2.0 - Apache HTTP Server + + + + + +
    <-
    +

    Request Processing in Apache 2.0

    +
    +

    Available Languages:  en 

    +
    + +

    Warning

    +

    Warning - this is a first (fast) draft that needs further + revision!

    +
    + +

    Several changes in Apache 2.0 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 + Apache 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 Apache 1.3) without introducing fragile or + insecure code.

    +
    + +
    top
    +
    +

    The Request Processing Cycle

    +

    All requests pass through ap_process_request_internal() + in 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 Apache 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 + reprecussions.

    + + +

    Strips Parent and This Elements from the + URI

    +

    All /../ and /./ elements are + removed by ap_getparents(). This helps to ensure + the path is (nearly) absolute before the request processing + continues.

    + +

    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:

    + +
    +switch (ap_satisfies(r)) {
    +case SATISFY_ALL:
    +case SATISFY_NOSPEC:
    +    if ((access_status = ap_run_access_checker(r)) != 0) {
    +        return decl_die(access_status, "check access", r);
    +    }
    +
    +    if (ap_some_auth_required(r)) {
    +        if (((access_status = ap_run_check_user_id(r)) != 0)
    +            || !ap_auth_type(r)) {
    +            return decl_die(access_status, ap_auth_type(r)
    +                          ? "check user.  No user file?"
    +                          : "perform authentication. AuthType not set!",
    +                          r);
    +        }
    +
    +        if (((access_status = ap_run_auth_checker(r)) != 0)
    +            || !ap_auth_type(r)) {
    +            return decl_die(access_status, ap_auth_type(r)
    +                          ? "check access.  No groups file?"
    +                          : "perform authentication. AuthType not set!",
    +                          r);
    +        }
    +    }
    +    break;
    +
    +case SATISFY_ANY:
    +    if (((access_status = ap_run_access_checker(r)) != 0)) {
    +        if (!ap_some_auth_required(r)) {
    +            return decl_die(access_status, "check access", r);
    +        }
    +
    +        if (((access_status = ap_run_check_user_id(r)) != 0)
    +            || !ap_auth_type(r)) {
    +            return decl_die(access_status, ap_auth_type(r)
    +                          ? "check user.  No user file?"
    +                          : "perform authentication. AuthType not set!",
    +                          r);
    +        }
    +
    +        if (((access_status = ap_run_auth_checker(r)) != 0)
    +            || !ap_auth_type(r)) {
    +            return decl_die(access_status, ap_auth_type(r)
    +                          ? "check access.  No groups file?"
    +                          : "perform authentication. AuthType not set!",
    +                          r);
    +        }
    +    }
    +    break;
    +}
    +
    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 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/developer/thread_safety.html b/rubbos/app/httpd-2.0.64/docs/manual/developer/thread_safety.html new file mode 100644 index 00000000..50f07bf3 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/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=ISO-8859-1 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/developer/thread_safety.html.en b/rubbos/app/httpd-2.0.64/docs/manual/developer/thread_safety.html.en new file mode 100644 index 00000000..82b4e5a7 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/developer/thread_safety.html.en @@ -0,0 +1,285 @@ + + + +Apache 2.0 Thread Safety Issues - Apache HTTP Server + + + + + +
    <-
    +

    Apache 2.0 Thread Safety Issues

    +
    +

    Available Languages:  en 

    +
    + +

    When using any of the threaded mpms in Apache 2.0 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 conditons 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 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.
    cpdflib ?
    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://www.mysql.com/doc/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/index.html.
    libpng1.0.x?
    libpng1.2.x?
    libpq (PostgreSQL)7.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 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/dns-caveats.html b/rubbos/app/httpd-2.0.64/docs/manual/dns-caveats.html new file mode 100644 index 00000000..b52ce878 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/dns-caveats.html @@ -0,0 +1,25 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: dns-caveats.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: dns-caveats.html.es +Content-Language: es +Content-type: text/html; charset=ISO-8859-1 + +URI: dns-caveats.html.fr +Content-Language: fr +Content-type: text/html; charset=ISO-8859-1 + +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/rubbos/app/httpd-2.0.64/docs/manual/dns-caveats.html.en b/rubbos/app/httpd-2.0.64/docs/manual/dns-caveats.html.en new file mode 100644 index 00000000..12e87973 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/dns-caveats.html.en @@ -0,0 +1,245 @@ + + + +Issues Regarding DNS and Apache - Apache HTTP Server + + + + + +
    <-
    +

    Issues Regarding DNS and Apache

    +
    +

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

    +
    + +

    This page could be summarized with the statement: don't + configure Apache in such a way that it relies on DNS resolution + for parsing of the configuration files. If Apache requires DNS + resolution to parse the configuration files then your server + may be subject to reliability problems (ie. it might not boot), + or denial and theft of service attacks (including users able + to steal hits from other users).

    +
    + +
    top
    +
    +

    A Simple Example

    + + +

    + <VirtualHost www.abc.dom>
    + ServerAdmin webgirl@abc.dom
    + DocumentRoot /www/abc
    + </VirtualHost> +

    + +

    In order for Apache 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 Apache must use DNS + to find the address of www.abc.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 (prior to Apache version 1.2 the server + would not even boot).

    + +

    Suppose that www.abc.dom has address 10.0.0.1. + Then consider this configuration snippet:

    + +

    + <VirtualHost 10.0.0.1>
    + ServerAdmin webgirl@abc.dom
    + DocumentRoot /www/abc
    + </VirtualHost> +

    + +

    This time Apache needs to use reverse DNS to find the + ServerName for this virtualhost. If that reverse + lookup fails then it will partially disable the virtualhost + (prior to Apache version 1.2 the server would not even boot). + 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 Apache should ever have to generate a full + URL for the server which includes the server name, then it will + fail to generate a valid URL.

    + +

    Here is a snippet that avoids both of these problems:

    + +

    + <VirtualHost 10.0.0.1>
    + ServerName www.abc.dom
    + ServerAdmin webgirl@abc.dom
    + DocumentRoot /www/abc
    + </VirtualHost> +

    +
    top
    +
    +

    Denial of Service

    + + +

    There are (at least) two forms that denial of service + can come in. If you are running a version of Apache prior to + version 1.2 then your server will not even boot if one of the + two DNS lookups mentioned above fails for any of your virtual + hosts. In some cases this DNS lookup may not even be under your + control; for example, if abc.dom is one of your + customers and they control their own DNS, they can force your + (pre-1.2) server to fail while booting simply by deleting the + www.abc.dom record.

    + +

    Another form is far more insidious. Consider this + configuration snippet:

    + +

    + <VirtualHost www.abc.dom>
    +   ServerAdmin webgirl@abc.dom
    +   DocumentRoot /www/abc
    + </VirtualHost>
    +
    + <VirtualHost www.def.dom>
    +   ServerAdmin webguy@def.dom
    +   DocumentRoot /www/def
    + </VirtualHost> +

    + +

    Suppose that you've assigned 10.0.0.1 to + www.abc.dom and 10.0.0.2 to + www.def.dom. Furthermore, suppose that + def.dom has control of their own DNS. With this + config you have put def.dom into a position where + they can steal all traffic destined to abc.dom. To + do so, all they have to do is set www.def.dom to + 10.0.0.1. Since they control their own DNS you can't stop them + from pointing the www.def.dom record wherever they + wish.

    + +

    Requests coming in to 10.0.0.1 (including all those where + users typed in URLs of the form + http://www.abc.dom/whatever) will all be served by + the def.dom virtual host. To better understand why + this happens requires a more in-depth discussion of how Apache + matches up incoming requests with the virtual host that will + serve it. A rough document describing this is available.

    +
    top
    +
    +

    The "main server" Address

    + + +

    The addition of name-based + virtual host support in Apache 1.1 requires Apache 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 Apache + 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
    • +
    +
    top
    +
    +

    Appendix: Future Directions

    + + +

    The situation regarding DNS is highly undesirable. For + Apache 1.2 we've attempted to make the server at least continue + booting in the event of failed DNS, but it might not be the + best we can do. In any event, requiring the use of explicit IP + addresses in configuration files is highly undesirable in + today's Internet where renumbering is a necessity.

    + +

    A possible work around to the theft of service attack + described above would be to perform a reverse DNS lookup on the + IP address returned by the forward lookup and compare the two + names -- in the event of a mismatch, the virtualhost would be + disabled. This would require reverse DNS to be configured + properly (which is something that most admins are familiar with + because of the common use of "double-reverse" DNS lookups by + FTP servers and TCP wrappers).

    + +

    In any event, it doesn't seem possible to reliably boot a + virtual-hosted web server when DNS has failed unless IP + addresses are used. Partial solutions such as disabling + portions of the configuration might be worse than not booting + at all depending on what the webserver is supposed to + accomplish.

    + +

    As HTTP/1.1 is deployed and browsers and proxies start + issuing the Host header it will become possible to + avoid the use of IP-based virtual hosts entirely. In this case, + a webserver has no requirement to do DNS lookups during + configuration. But as of March 1997 these features have not + been deployed widely enough to be put into use on critical + webservers.

    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/dns-caveats.html.es b/rubbos/app/httpd-2.0.64/docs/manual/dns-caveats.html.es new file mode 100644 index 00000000..e276eef1 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/dns-caveats.html.es @@ -0,0 +1,268 @@ + + + +Asuntos relacionados con Apache y las DNS - Servidor HTTP Apache + + + + + +
    <-
    +

    Asuntos relacionados con Apache y las DNS

    +
    +

    Idiomas disponibles:  en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    + +

    Este documento puede resumirse en la siguiente frase: no + configure Apache de manera que el análisis sintáctico de + los ficheros de configuración tenga que confiar en + resoluciones DNS. Si Apache necesita de resoluciones DNS para + analizar los ficheros de configuración, entonces su servidor + puede no funcionar correctamente (por ejemplo, podría no + iniciarse), o sufrir ataques de denegación o robo de servicio + (incluyendo que otas web puedan "robar" peticiones de otras + web).

    +
    + +
    top
    +
    +

    Un ejemplo sencillo

    + + +

    + <VirtualHost www.abc.dom>
    + ServerAdmin webgirl@abc.dom
    + DocumentRoot /www/abc
    + </VirtualHost> +

    + +

    Para que Apache funcione correctamente, es imprescindible + conocer dos aspectos sobre cada host virtual: el valor de la + directiva ServerName y al + menos una dirección IP en la que servidor escuchará y + responderá a las peticiones que se produzcan. El ejemplo + mostrado arriba no incluye la direccion IP, de manera que Apache + tiene que usar una resolución DNS para encontrar la + dirección IP correspondiente a www.abc.dom. Si + por alguna razón la resolución DNS no está + disponible en el momento en que su servidor está analizando + sintánticamente su fichero de configuración, entonces + este host virtual no se configurará y no + será capaz de responder a ninguna de las peticiones que se + hagan a ese host virtual (en las versiones de Apache anteriores a + la 1.2 el servidor ni siquiera se iniciaba).

    + +

    Suponga que www.abc.dom tiene como dirección + IP la 10.0.0.1. Considere la siguiente configuración:

    + +

    + <VirtualHost 10.0.0.1>
    + ServerAdmin webgirl@abc.dom
    + DocumentRoot /www/abc
    + </VirtualHost> +

    + +

    Ahora Apache necesita hacer una búsqueda DNS inversa para + encontrar el ServerName de este host virtual. Si esta + búsqueda inversa falla entonces el host virtual se + desactivará parcialmente (en las versiones de Apache + anteriores a la 1.2 el servidor ni siquiera se iniciaba). Si el + host virtual está basado en el nombre, entonces se + desactivará completamente, pero si está basado en la + dirección IP, entonces funcionará para la mayor parte de + las cosas. Sin embargo, si Apache tiene que generar en algún + momento una URL completa que incluya el nombre del servidor, no + será capaz de generar una URL válida.

    + +

    Aquí tiene una forma de evitar ambos problemas:

    + +

    + <VirtualHost 10.0.0.1>
    + ServerName www.abc.dom
    + ServerAdmin webgirl@abc.dom
    + DocumentRoot /www/abc
    + </VirtualHost> +

    +
    top
    +
    +

    Denegación de servicio

    + + +

    Hay (al menos) dos formas de que ocurra una denegación de + servicio. Si está ejecutando una versión de Apache + anterior a la 1.2, entonces su servidor no se iniciará si una + de las dos búsquedas de DNS mencionadas arriba falla para + cualquiera de sus hosts virtuales. En algunos casos estas + búsquedas DNS puede que no estén bajo su control; por + ejemplo, si abc.dom es uno de sus clientes y ellos + controlan su propia DNS, pueden forzar a su servidor (pre-1.2) a + fallar al iniciarse simplemente borrando el registro + www.abc.dom.

    + +

    Otra formas pueden ser bastante más complicadas. Fíjese + en esta configuración:

    + +

    + <VirtualHost www.abc.dom>
    +   ServerAdmin webgirl@abc.dom
    +   DocumentRoot /www/abc
    + </VirtualHost>
    +
    + <VirtualHost www.def.com>
    +   ServerAdmin webguy@def.com
    +   DocumentRoot /www/def
    + </VirtualHost> +

    + +

    Suponga que ha asignado la dirección 10.0.0.1 a + www.abc.dom y 10.0.0.2 a + www.def.com. Todavía más, suponga que + def.com tiene el control de sus propias DNS. Con esta + configuración ha puesto def.com en una + posición en la que puede robar todo el trafico destinado a + abc.dom. Para conseguirlo, todo lo que tiene que + hacer es asignarle a www.def.com la dirección + 10.0.0.1. Como ellos controlan sus propias DNS no puede evitar que + apunten el registro www.def.com a donde quieran.

    + +

    Las peticiones dirigidas a la dirección 10.0.0.1 + (incluídas aquellas en las los usuarios escriben URLs de tipo + http://www.abc.dom/whatever) serán todas + servidas por el host virtual def.com. Comprender por + qué ocurre esto requiere una discusión más profunda + acerca de como Apache asigna las peticiones que recibe a los hosts + virtuales que las servirán. Puede consultar aquí un documento que trata el + tema.

    +
    top
    +
    +

    La dirección del "servidor principal"

    + + +

    El que Apache soporte hosting + virtual basado en nombres desde la version 1.1 hace que sea + necesario que el servidor conozca la dirección (o + direcciones) IP del host que httpd está + ejecutando. Para tener acceso a esta dirección puede usar la + directiva global ServerName + (si está presente) o llamar a la función de C + gethostname (la cuál debe devolver el mismo + resultado que devuelve ejecutar por línea de comandos + "hostname"). Entonces se produce una búsqueda DNS de esa + dirección. Actualmente, no hay forma de evitar que se + produzca esta búsqueda.

    + +

    Si teme que esta búsqueda pueda fallar porque su servidor + DNS está desactivado entonces puede insertar el nombre de + host en /etc/hosts (donde probablemente ya lo tiene + para que la máquina pueda arrancar + correctamente). Asegúrese de que su máquina está + configurada para usar /etc/hosts en caso de que esa + búsqueda DNS falle. En función del sistema operativo que + use, puede conseguir esto editando /etc/resolv.conf, + o puede que /etc/nsswitch.conf.

    + +

    Si su servidor no tiene que ejecutar búsquedas DNS por + ninguna otra razón entonces considere ejecutar Apache + especificando el valor "local" en la variable de entorno + HOSTRESORDER. Todo esto depende del sistema operativo + y de las librerías de resolución que use. Esto + también afecta a los CGIs a menos que use + mod_env para controlar el entorno. Por favor, + consulte las páginas de ayuda o la sección de Preguntas + Más Frecuentes de su sistema operativo.

    +
    top
    +
    +

    Consejos para evitar problemas

    + + +
      +
    • + use direcciones IP en + VirtualHost +
    • + +
    • + use direcciones IP en + Listen +
    • + +
    • + asegúrese de que todos los host virtuales tienen + explícitamente especificados una directiva ServerName +
    • + +
    • cree un servidor <VirtualHost _default_:*> + que no tenga páginas que servir.
    • +
    +
    top
    +
    +

    Apéndice: Líneas de evolución de Apache

    + + +

    La situación actual respecto a las búsquedas DNS + está lejos de ser la deseable. En Apache 1.2 se intentó + hacer que el servidor al menos se iniciara a pesar de que fallara + la búsqueda DNS, pero puede que esa no sea la mejor + solución. En cualquier caso, requerir el uso de direcciones + IP explícitas en los ficheros de configuración no es ni + mucho menos una solución deseable con la situación + actual de Internet, donde la renumeración es una + necesidad.

    + +

    Una posible solución a los ataques de robo de servicio + descritos más arriba, sería hacer una búsqueda DNS + inversa de la dirección IP devuelta por la búsqueda + previa y comparar los dos nombres -- en caso de que sean + diferentes, el host virtual se desactivaría. Esto + requeriría configurar correctamente DNS inverso (una tarea + con la que suelen estar familiarizados la mayoría de los + administradores de sistemas).

    + +

    En cualquier caso, no parece posible iniciar en las condiciones + apropiadas un servidor web alojado virtualmente cuando DNS ha + fallado a no ser que se usen direcciones IP. Soluciones parciales + tales como desactivar partes de la configuración podrían + ser incluso peores que no iniciar el servidor en absoluto, + dependiendo de las funciones que se espera que realice el servidor + web.

    + +

    Como HTTP/1.1 está ampliamente extendido y los navegadores + y los servidores proxy empiezan a usar la cabecera + Host, en el futuro será posible evitar el uso de + hosting virtual basado en direcciones IP completamente. En ese + caso, un servidor web no tiene ninguna necesidad de hacer + búsquedas de DNS durante la configuración. Sin embargo, + en Marzo de 1997 esas funcionalidades no estaban lo + suficientemente implantadas como para ponerlas en uso en + servidores web que realizaban tareas de importancia + crítica.

    +
    +
    +

    Idiomas disponibles:  en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/dns-caveats.html.fr b/rubbos/app/httpd-2.0.64/docs/manual/dns-caveats.html.fr new file mode 100644 index 00000000..0f953f67 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/dns-caveats.html.fr @@ -0,0 +1,255 @@ + + + +Problèmes DNS avec Apache - Serveur Apache HTTP + + + + + +
    <-
    +

    Problèmes DNS avec Apache

    +
    +

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

    +
    + +

    L'ensemble de cette page pourrait se résumer à la phrase : ne + jamais configurer Apache de telle sorte qu'il s'appuie sur des + résolutions DNS pour parcourir ses fichiers de configuration. + Une telle configuration risque d'engendrer des problèmes de + fiabilité (le serveur peut ne pas démarrer), des attaques de type + déni et de vol de service (comme par exemple des utilisateurs volant + les hits d'autres utilisateurs).

    +
    + +
    top
    +
    +

    Un exemple simple

    + + +

    + <VirtualHost www.abc.dom>
    + ServerAdmin webgirl@abc.dom
    + DocumentRoot /www/abc
    + </VirtualHost> +

    + +

    Pour qu'Apache fonctionne correctement, il a absolument besoin + de deux informations pour chacun de ses serveurs virtuels : + ServerName ainsi qu'au moins une + adresse IP à laquelle le serveur s'attachera pour répondre. + L'exemple ci-dessus ne précise pas l'adresse IP, si bien qu'Apache doit + utiliser le DNS pour trouver l'adresse de www.abc.dom. + Si, pour une raison ou une autre, le DNS ne fonctionne pas au moment + où Apache lit ses fichiers de configuration, le serveur virtuel + ne sera pas configuré. Il sera incapable de répondre + aux requêtes. Jusqu'à la version 1.2, Apache refusait même de + démarrer dans ce cas de figure.

    + +

    Prenons le cas où l'adresse de www.abc.dom est 10.0.0.1 + et considérons cet extrait de configuration :

    + +

    + <VirtualHost 10.0.0.1>
    + ServerAdmin webgirl@abc.dom
    + DocumentRoot /www/abc
    + </VirtualHost> +

    + +

    Cette fois, Apache a besoin d'utiliser la résolution DNS + inversée pour déterminer le nom ServerName de ce + serveur virtuel. Si cette résolution n'aboutit pas, le serveur + virtuel sera partiellement mis hors service (jusqu'à la version + 1.2, Apache refusait même de démarrer dans ce cas de figure). Si + le serveur virtuel est un serveur basé sur un nom (name-based), + il sera totalement hors service, mais s'il s'agit d'un serveur + par IP (IP-based), il fonctionnera correctement. Cependant, dans + le cas où Apache doit générer une adresse complète URL en + s'appuyant sur le nom du serveur, il échouera à fournir une + adresse valide.

    + +

    Voici un extrait de configuration qui résout ces deux problèmes :

    + +

    + <VirtualHost 10.0.0.1>
    + ServerName www.abc.dom
    + ServerAdmin webgirl@abc.dom
    + DocumentRoot /www/abc
    + </VirtualHost> +

    +
    top
    +
    +

    Déni de Service

    + + +

    Il existe (au moins) deux problèmes possibles de déni de service. + Les versions d'Apache antérieures à 1.2 ne démarreront pas si + l'une des deux requêtes DNS citées ci-dessus n'aboutissent pas pour + un de vos serveurs virtuels. Dans certains cas, les entrées DNS + sont hors de contrôle de l'administrateur Web ; par exemple si + abc.dom appartient à un de vos clients qui a la + maîtrise de son propre DNS, celui-ci peut empêcher votre serveur + Web (avant la version 1.2) de démarrer, simplement en effaçant + l'enregistrement www.abc.dom du DNS.

    + +

    L'autre problème possible est bien plus pernicieux. Dans la + configuration suivante :

    + +

    + <VirtualHost www.abc.dom>
    +   ServerAdmin webgirl@abc.dom
    +   DocumentRoot /www/abc
    + </VirtualHost>
    +
    + <VirtualHost www.def.dom>
    +   ServerAdmin webguy@def.dom
    +   DocumentRoot /www/def
    + </VirtualHost> +

    + +

    Supposons que www.abc.dom ait l'adresse 10.0.0.1, + et que www.def.dom ait l'adresse 10.0.0.2. Supposons + également que def.com ait la main sur son DNS. + Cette configuration peut permettre à def.dom de + détourner vers son serveur tout le trafic destiné à + abc.dom. Pour ce faire, il doit simplement + positionner le champ DNS de www.def.dom sur 10.0.0.1, + et rien ne peut l'empêcher de faire, puisqu'il a la main sur + son DNS.

    + +

    Les requêtes à destination de 10.0.0.1 (incluant celles dont + l'URL contient http://www.abc.com/tout_et_n_importe_quoi) + seront envoyées au serveur virtuel de def.dom. Une + bonne compréhension des mécanismes internes d'Apache concernant + la gestion des serveur virtuels est requise. + Ce document explique ce + fonctionnement.

    +
    top
    +
    +

    L'Adresse du "serveur principal"

    + + +

    L'implémentation du support des serveur virtuels par nom depuis Apache 1.1 suppose + qu'Apache connaisse la ou les adresse(s) IP sur lesquelles le serveur + écoute. Pour déterminer cette adresse, Apache utilise soit la + directive globale ServerName + (si elle est présente), soit un appel à la fonction C + gethostname (cet appel renvoie le même résultat + que la commande "hostname" entrée sur une ligne de commande). + Une résolution DNS est alors effectuée sur l'adresse obtenue. + Pour l'instant, il n'existe aucun moyen de contourner cette + requête DNS.

    + +

    Pour se prémunir du cas où cette résolution DNS échouerait à + cause de la défaillance du serveur DNS, le nom d'hôte peut être + ajouté dans /etc/hosts (il y est probablement déjà). + Assurez vous que votre machine est configurée pour lire ce fichier + /etc/hosts en cas de défaillance du serveur DNS. + Pour cela, selon votre système d'exploitation, il vous faudra configurer + /etc/resolv.conf ou /etc/nsswitch.conf.

    + +

    Au cas où votre serveur n'a pas besoin de réaliser des requêtes + DNS pour d'autres raisons que de démarrer Apache, il est possible + que vous puissiez vous en sortir en positionnant la variable + d'environnement HOSTRESORDER sur "local". Ceci dépend + cependant de votre système d'exploitation et des librairies de + résolution DNS que vous utilisez. Ceci affecte également le + comportement des scripts CGIs, à moins que vous n'utilisiez + mod_env pour contrôler leur environnement. La + meilleure solution est de consulter les pages "man" ou les FAQs + spécifiques à votre système d'exploitation.

    +
    top
    +
    +

    Comment éviter ces problèmes

    + + +
      +
    • + spécifier les adresses IP dans les + VirtualHost +
    • + +
    • + spécifier les adresses IP au moyen de + Listen +
    • + +
    • + s'assurer que tous les serveurs virtuels spécifient explicitement + leur ServerName +
    • + +
    • créer un serveur virtuel <VirtualHost _default_:*> + qui ne sert aucune page
    • +
    +
    top
    +
    +

    Appendice: Perspectives futures

    + + +

    Les problèmes liés au DNS sont très indésirables. À partir + d'Apache 1.2, nous avons travaillé à ce qu'Apache démarre même + dans le cas où les requêtes DNS échouent, mais ce n'est pas + forcément la meilleure des solutions. En tous cas, obliger + l'administrateur à spécifier explicitement des adresses IP est + également très indésirable sur le réseau Internet tel qu'il + existe actuellement, où le nombre d'adresses IP commence à manquer.

    + +

    Une réponse possible au problème de vol de trafic décrit ci-avant + pourrait être de réaliser une résolution inverse DNS sur l'adresse IP + renvoyée par la première requête, et de comparer les deux noms + obtenus -- lorsqu'ils sont différents, le serveur virtuel serait + désactivé. Ceci suppose que la configuration pour la résolution + inverse DNS soit faite correctement (c'est une chose à laquelle + les administrateurs DNS commencent à s'habituer, en raison de + l'utilisation de plus en plus répandue des requêtes DNS + "double-reverse" par les serveurs FTP et les filtrages + "TCP wrappers").

    + +

    Dans tous les cas de figures, il ne semble pas possible de + démarrer de façon fiable un serveur virtuel quand la requête + DNS a échoué, à moins de recourir à l'utilisation d'adresses + IP fixes. Des solutions partielles, telles que désactiver des + portions de la configuration selon les tâches attribuées au + serveur Web, risquent d'être pires que ne pas démarrer du tout.

    + +

    Au fur et à mesure que HTTP/1.1 se répand, et que les navigateurs + et les serveurs mandataires envoient l'en-tête Host, + il devient possible d'éviter complètement l'utilisation de serveurs + virtuels par IP. Dans ce cas, les serveurs Web n'ont plus aucun + besoin de réaliser des requêtes DNS lors de leur démarrage. Au 1er + mars 1997, ces fonctionnalités ne sont pas suffisamment déployées pour + que des serveurs Web sensibles les mettent en oeuvre (NdT : cette + remarque est aujourd'hui complètement dépassée, HTTP/1.1 est + désormais supporté par l'immense majorité des navigateurs et + des serveurs mandataires).

    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/dns-caveats.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/dns-caveats.html.ja.utf8 new file mode 100644 index 00000000..8db56f4b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/dns-caveats.html.ja.utf8 @@ -0,0 +1,249 @@ + + + +DNS と Apache にまつわる注意事項 - Apache HTTP サーバ + + + + + +
    <-
    +

    DNS と Apache にまつわる注意事項

    +
    +

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

    +
    +
    This translation may be out of date. Check the + English version for recent changes.
    + +

    本文書の内容は次の一言に尽きます。「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 のアドレスが 10.0.0.1 + だとします。では、次の設定について考えてみましょう。

    + +

    + <VirtualHost 10.0.0.1>
    + ServerAdmin webgirl@abc.dom
    + DocumentRoot /www/abc
    + </VirtualHost> +

    + +

    現在のリリースでは Apache は DNS 逆引きを使用して + このバーチャルホストの ServerName + を見つけます。 + その逆引きが失敗した場合は部分的にバーチャルホストを無効にします + (Apache 1.2 より前では起動すらしません)。 + バーチャルホストが名前ベースであれば完全に無効になりますが、 + IP ベースであれば概ね動作します。しかしながら、サーバ名を + 含む完全な URL を生成しなければならない場合は、正しい URL + の生成ができません。

    + +

    次の例は上記の問題を解決しています。

    + +

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

    + +

    10.0.0.1 を www.abc.dom に、 + 10.0.0.2 を www.def.dom に割り当てているとします。 + また、def.dom は顧客自身の DNS + の制御下にあるとします。この設定で、abc.dom + に向けられたトラフィック全てを奪うことができる位置に + def.dom を設置できています。後は単に + www.def.dom が 10.0.0.1 を参照するように + 設定するだけです。DNS は顧客側の DNS でコントロールされているので、 + www.def.dom レコードが好きな場所を指すように + 設定できてしまうのを止めさせることができません。

    + +

    10.0.0.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 月時点の状況では、 + 商用レベルのウェブサーバで使用できるほどには、 + これらの機能は広く開発が進んでいません。

    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/dns-caveats.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/dns-caveats.html.ko.euc-kr new file mode 100644 index 00000000..392609a7 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/dns-caveats.html.ko.euc-kr @@ -0,0 +1,229 @@ + + + +DNS¿Í ¾ÆÆÄÄ¡¿Í °ü·ÃµÈ »çÇ× - Apache HTTP Server + + + + + +
    <-
    +

    DNS¿Í ¾ÆÆÄÄ¡¿Í °ü·ÃµÈ »çÇ×

    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + es  | + 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ÀÇ ÁÖ¼Ò°¡ 10.0.0.1À̶ó°í °¡Á¤ÇÏÀÚ. + ±×¸®°í ´ÙÀ½ ¼³Á¤À» º¸¶ó:

    + +

    + <VirtualHost 10.0.0.1>
    + ServerAdmin webgirl@abc.dom
    + DocumentRoot /www/abc
    + </VirtualHost> +

    + +

    ÀÌÁ¦ ¾ÆÆÄÄ¡´Â ÀÌ °¡»óÈ£½ºÆ®ÀÇ ServerNameÀ» + ã±âÀ§ÇØ ¿ªDNS¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù. ¿ªÃ£±â°¡ ½ÇÆÐÇÏ¸é ¾ÆÆÄÄ¡´Â + °¡»óÈ£½ºÆ®¸¦ ºÎºÐÀûÀ¸·Î ²ö´Ù. (¾ÆÆÄÄ¡ 1.2 ÀÌÀü ¹öÀü¿¡¼­´Â + ½ÉÁö¾î ¼­¹ö°¡ ºÎÆõµ ¾ÈÇÑ´Ù.) Áï, ÀÌ °æ¿ì À̸§±â¹Ý + °¡»óÈ£½ºÆ®¶ó¸é °¡»óÈ£½ºÆ®´Â ¿ÏÀüÈ÷ µ¿ÀÛÇÏÁö¾Ê°í, ip±â¹ÝÀ̶ó¸é + ´ëºÎºÐ µ¿ÀÛÇÑ´Ù. ±×·¯³ª ¾ÆÆÄÄ¡°¡ ¼­¹ö¸íÀ» Æ÷ÇÔÇÏ¿© ¼­¹öÀÇ + Àüü URLÀ» ¸¸µé¾î¾ß ÇÑ´Ù¸é Á¤»óÀûÀÎ URLÀ» ¸¸µéÁö ¸øÇÑ´Ù.

    + +

    ¾Æ·¡ °æ¿ì ÀÌ µÎ°¡Áö ¹®Á¦°¡ ¾ø´Ù.

    + +

    + <VirtualHost 10.0.0.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¿¡ 10.0.0.1, + www.def.dom¿¡ 10.0.0.2¸¦ ÇÒ´çÇß´Ù°í ÇÏÀÚ. + ¶Ç, def.domÀº ÀÚü DNS¸¦ »ç¿ëÇÑ´Ù°í °¡Á¤ÇÏÀÚ. + ÀÌ ¼³Á¤°ú ÇÔ²² def.domÀ» abc.domÀ¸·Î + °¡´Â ¸ðµç Åë½ÅÀ» °¡·Îç ¼ö ÀÖ´Â Àå¼Ò¿¡ µÎ¾ú´Ù. ±×·¸´Ù¸é ±×µéÀº + www.def.domÀ» 10.0.0.1·Î ¼³Á¤Çϱ⸸ ÇÏ¸é µÈ´Ù. + ±×µéÀÌ ÀÚü DNS¸¦ »ç¿ëÇϱ⶧¹®¿¡ ´ç½ÅÀº ±×µéÀÌ ¿øÇϴµ¥·Î + www.def.dom ·¹Äڵ带 ¼³Á¤ÇÏ´Â °ÍÀ» ¸·À» ¼ö + ¾ø´Ù.

    + +

    (»ç¿ëÀÚ°¡ http://www.abc.dom/whatever Çü½ÄÀÇ + URLÀ» ÀÔ·ÂÇÏ´Â °æ¿ì¸¦ Æ÷ÇÔÇÏ¿©) 10.0.0.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  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/dns-caveats.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/dns-caveats.html.tr.utf8 new file mode 100644 index 00000000..539383da --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/dns-caveats.html.tr.utf8 @@ -0,0 +1,239 @@ + + + +Apache ve DNS ile ilgili Konular - Apache HTTP Sunucusu + + + + + +
    <-
    +

    Apache ve DNS ile ilgili Konular

    +
    +

    Mevcut Diller:  en  | + es  | + 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ı kullanıcıların diğerlerine giden sayfaları çalma + olasılığı dahil) saldırılarına açık hale gelebilir.

    +
    + +
    top
    +
    +

    Basit Bir Örnek

    + + +

    + <VirtualHost falan.fesmekan.dom> + + ServerAdmin filanca@fesmekan.dom
    + DocumentRoot /siteler/fesmekan +
    + </VirtualHost> +

    + +

    Apache’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 (hApache 1.2 + öncesinde sunucu hiç başlatılmazdı) 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:

    + +

    + <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 + Apache’nin bir ters DNS sorgusu yapması gerekecektir. Eğer bu sorgu + başarısız olursa kısmi bir yapılandırmaya gidilir (Apache 1.2 öncesinde + sunucu hiç başlatılmazdı). 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 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

    + + +

    Hizmet reddinin meydana gelebilecek (en az) iki türü vardır. + Apache’nin 1.2 öncesi bir sürümünü kullanıyorsanız sanal + konaklarınızdan herhangi biri için yukarıdaki iki sorgudan biri + başarısız olursa sunucunuzu asla başlatamazsınız. Bazı durumlarda, DNS + sorgularından alınacak yanıtlar sizin denetiminizde olmayabilir; + örneğin fesmekan.dom müşterilerinizden birine aitse ve + kendi DNS sunucuları varsa falan.fesmekan.dom kaydını + silerek sunucunuzun hiç başlatılamamasına (1.2 öncesi) sebep + olabilirler.

    + +

    Diğer türü biraz daha sinsidir. Şö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

    + + +

    Apache 1.1’de isme dayalı sanal konak + desteğine ek olarak, Apache’nin, httpd’nin + çalıştığı makinenin IP adres(ler)ini de bilmeye ihtiyacı vardır. 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, Apache’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.
    • +
    +
    top
    +
    +

    Ek: Ufuk Turu

    + + +

    DNS ile ilgili durum hiç de arzu edildiği gibi değildir. Apache 1.2 + için, DNS sorguları başarısız olsa bile sunucunun başlatılabilmesini + sağlamaya çalıştık, fakat belki yapabildiğimizden daha da iyisi + mümkündür. Günümüz Genel Ağ’ında IP adresleri sık sık değiştiğinden + yapılandırma dosyasına doğrudan IP adresini yazma gerekliliği asla arzu + edilen davranış değildir.

    + +

    Yukarıda nasıl yapıldığı açıklanan hizmet hırsızlığı saldırısına karşı + önlem olarak, normal sorgudan dönen IP adresine bir ters DNS sorgusu + yapıp bu iki sonucu karşılaştırmak ve eşleşmeme durumunda sanal konağı + iptal etmek bir çözüm olabilir. Fakat bunun mümkün olabilmesi için + uygun bir ters DNS kaydına ihtiyaç vardır. (FTP sunucuları ve TCP + sarmalayıcılar tarafından yapılan çifte ters DNS sorgusu kullanımından + dolayı çoğu ağ yöneticisi bu konuda zaten bilgi sahibidir.)

    + +

    Her halükarda, IP adreslerinin kullanılmaması nedeniyle yapılan DNS + sorgularının başarısız olması durumunda sanal konaklı bir sunucuyu + düzgün bir şekilde başlatmak olası görünmektedir. Yapılandırmayı kısmen + iptal etmek gibi kısmi çözümler, sunucudan beklentinizin ne olduğuna + bağlı olarak sunucuyu hiç başlatmamaktan daha iyi olabilir.

    + +

    HTTP/1.1’de belirtildiği gibi Host başlığını göndererek + işlem yapabilen tarayıcılar ve vekiller IP’ye dayalı sanal konak + kullanımını tamamen ortadan kaldırmanın mümkün olabileceğini + göstermektedir. Bu durumda yapılandırmanın çözümlenmesi aşamasında DNS + sorgusu yapma gereği kalmayacaktır. Fakat 1997 Mart’ından beri önemli + sunucular üzerinde bunların yeterince geniş bir uygulama alanı + bulmadığı görülmektedir.

    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/dso.html b/rubbos/app/httpd-2.0.64/docs/manual/dso.html new file mode 100644 index 00000000..dd32ded0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/dso.html @@ -0,0 +1,25 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: dso.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: dso.html.es +Content-Language: es +Content-type: text/html; charset=ISO-8859-1 + +URI: dso.html.fr +Content-Language: fr +Content-type: text/html; charset=ISO-8859-1 + +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/rubbos/app/httpd-2.0.64/docs/manual/dso.html.en b/rubbos/app/httpd-2.0.64/docs/manual/dso.html.en new file mode 100644 index 00000000..f37d73a0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/dso.html.en @@ -0,0 +1,318 @@ + + + +Dynamic Shared Object (DSO) Support - Apache HTTP Server + + + + + +
    <-
    +

    Dynamic Shared Object (DSO) Support

    +
    +

    Available Languages:  en  | + es  | + 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. The modules can be + statically compiled into the httpd binary when the + server is built. Alternatively, modules can 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).

    + +

    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 modules is based + on a module named mod_so which must be statically + compiled into the Apache core. It is the only module besides + core which cannot be put into a DSO + itself. Practically all other distributed Apache modules can then + be placed into a DSO by individually enabling the DSO build for + them via configure's + --enable-module=shared option as discussed + in the install documentation. After a + module is compiled into a DSO named mod_foo.so you + can use mod_so's LoadModule command in your + httpd.conf file to load this module at server startup + or restart.

    + +

    To simplify this creation of DSO files for Apache modules + (especially for third-party modules) a new support program + named apxs (APache + eXtenSion) is available. It can be used to build DSO based + modules outside of the Apache source tree. The idea is + simple: When installing Apache the configure's + make install procedure installs the Apache 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 module sources without the Apache 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 2.x, + here is a short and concise summary:

    + +
      +
    1. + Build and install a distributed Apache module, say + mod_foo.c, into its own DSO + mod_foo.so: + +

      +$ ./configure --prefix=/path/to/install --enable-foo=shared
      +$ make install +

      +
    2. + +
    3. + Build and install a third-party Apache module, say + mod_foo.c, into its own DSO + mod_foo.so: + +

      +$ ./configure --add-module=module_type:/path/to/3rdparty/mod_foo.c --enable-foo=shared
      +$ make install +

      +
    4. + +
    5. + Configure Apache for later installation of shared + modules: + +

      +$ ./configure --enable-so
      +$ make install +

      +
    6. + +
    7. + Build and install a third-party Apache module, say + mod_foo.c, into its own DSO + mod_foo.so outside of the Apache + source tree using apxs: + +

      +$ cd /path/to/3rdparty
      +$ apxs -c mod_foo.c
      +$ apxs -i -a -n foo mod_foo.la +

      +
    8. +
    + +

    In all cases, once the shared module is compiled, you must + use a LoadModule + directive in httpd.conf to tell Apache to activate + the module.

    +
    top
    +
    +

    Background

    + +

    On modern Unix derivatives there exists a nifty mechanism + usually 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. On the other hand using shared objects for extending + a program is not used by a lot of programs.

    + +

    As of 1998 there are only a few software packages available + which use the DSO mechanism to actually extend their + functionality at run-time: Perl 5 (via its XS mechanism and the + DynaLoader module), Netscape Server, etc. Starting + with version 1.3, Apache joined the crew, because Apache + already uses a module concept to extend its functionality and + internally uses a dispatch-list-based approach to link external + modules into the Apache core functionality. So, Apache is + really predestined for using DSO to load its modules at + run-time.

    +
    top
    +
    +

    Advantages and Disadvantages

    + +

    The above DSO based features have the following + advantages:

    + +
      +
    • The server package is more flexible at run-time because + the actual server process can be assembled at run-time via + LoadModule + httpd.conf configuration commands instead of + configure options at build-time. For instance + this way one is able to run different server instances + (standard & SSL version, minimalistic & powered up + version [mod_perl, PHP3], etc.) with only one Apache + installation.
    • + +
    • The server package can be easily extended with + third-party modules even after installation. This is at least + a great benefit for vendor package maintainers who can create + a Apache core package and additional packages containing + extensions like PHP3, mod_perl, mod_fastcgi, + etc.
    • + +
    • Easier Apache module prototyping because with the + DSO/apxs pair you can both work outside the + Apache 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 server.
    • +
    + +

    DSO has the following disadvantages:

    + +
      +
    • The DSO mechanism cannot be used on every platform + because not all operating systems support dynamic loading of + code into the address space of a program.
    • + +
    • 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 core, from the C library + (libc) and all other dynamic or static libraries + used by the Apache 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 + Apache core itself already contains a reference to it or + loading the code yourself via dlopen().
    • +
    + +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/dso.html.es b/rubbos/app/httpd-2.0.64/docs/manual/dso.html.es new file mode 100644 index 00000000..c162e8e9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/dso.html.es @@ -0,0 +1,375 @@ + + + +Soporte de Objetos Dinamicos Compartidos (DSO) - Servidor HTTP Apache + + + + + +
    <-
    +

    Soporte de Objetos Dinamicos Compartidos (DSO)

    +
    +

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

    El servidor HTTP Apache es un programa modular en el que el + administrador puede elegir qué funcionalidades se incluyen + mediante la selección de un conjunto de módulos. En + primer lugar, los módulos pueden compilarse de manera + estática en el binario httpd. De forma + alternativa, los módulos también pueden compilarse como + Objetos Dinamicos Compartidos (DSOs) que existen de forma + independiente del archivo binario httpd. Los + módulos que se deseen usar como objetos dinámicos + compartidos pueden compilarse al mismo tiempo que el servidor, o + pueden compilarse en otro momento y ser añadidos después + usando la Herramienta de Extensión de Apache + (apxs).

    + +

    Este documento describe cómo usar los módulos en + forma de objeto dinámico compartido (DSO) así como los + fundamentos teóricos que hay detrás para explicar su + funcionamiento.

    +
    + +
    top
    +
    +

    Implementación

    + + + +

    Cargar módulos de Apache individualmente como objetos + dinámicos compartidos (DSO) es posible gracias a un + módulo llamado mod_so que debe compilarse + estáticamente en el núcleo (kernel) de Apache. Es el + único módulo junto con el módulo + core que no se puede usar como objeto + dinámico compartido. Prácticamente todos los demás + módulos distribuidos con Apache se pueden usar como objetos + dinámicos compartidos individualmente siempre y cuando se + haya activado la posibilidad de usarlos con la opción de + configure + --enable-module=shared tal y como se + explicó en la documentación de + instalación. Una vez que haya compilado un módulo + como objeto dinámico compartido y le haya puesto un nombre + del tipo mod_foo.so, puede cargarlo al iniciar o + reiniciar el servidor usando el comando LoadModule de mod_so + en el fichero httpd.conf.

    + +

    Para simplificar la creación de objetos dinámicos + compartidos para Apache (especialmente módulos de terceras + partes) está disponible un nuevo programa de soporte llamado + apxs (APache eXtenSion). Puede usar + este programa para crear módulos como objetos dinámicos + compartidos sin tener que crearlos al mismo tiempo que + compila su servidor Apache. La idea es simple: cuando se instala + Apache el procedimiento make install de + configure @@@ installs the Apache C header + files and puts the platform-dependent compiler and linker flags + for building DSO files into the apxs program / instala los + ficheros de cabecera de C de Apache y especifica las opciones de + compilación y enlace dependientes de la plataforma para + generar objetos dinámicos compartidos con + apxs. De esta manera el usuario puede usar + apxs para compilar el código fuente de + módulos de Apache de manera independiente y sin tener que + preocuparse por las opciones de compilación y enlace + dependientes de la plataforma que soportan objetos dinámicos + compartidos.

    + +
    top
    +
    +

    Resumen de uso

    + +

    Para que se haga una idea de lo que permite el soporte de + objetos dinámicos compartidos en Apache 2.0, aquí tiene + un resumen breve pero conciso:

    + +
      +
    1. + Construir e instalar un módulo incluido en la + distribución de Apache, digamos + mod_foo.c, como un objeto dinámico + compartido de nombre mod_foo.so: + +

      +$ ./configure --prefix=/path/to/install --enable-foo=shared
      +$ make install +

      +
    2. + +
    3. + Construir e instalar un módulo de Apache de una + tercera parte, digamos mod_foo.c, como + un objeto dinámico compartido de nombre + mod_foo.so: + +

      +$ ./configure --add-module=module_type:/path/to/3rdparty/mod_foo.c --enable-foo=shared
      +$ make install +

      +
    4. + +
    5. + Configurar Apache para poder instalar después + objetos dinámicos compartidos: + +

      +$ ./configure --enable-so
      +$ make install +

      +
    6. + +
    7. + Construir e instalar un módulo de Apache de una + tercera parte, digamos mod_foo.c, como + un objeto dinámico compartido de nombre + mod_foo.so fuera de la estructura de + directorios de Apache usando apxs: + +

      +$ cd /path/to/3rdparty
      +$ apxs -c mod_foo.c
      +$ apxs -i -a -n foo mod_foo.la +

      +
    8. +
    + +

    En todos los casos, una vez que se compila el objeto + dinámico compartido, debe usar una directiva LoadModule en + httpd.conf para activar dicho módulo.

    +
    top
    +
    +

    Fundamentos teoróricos +detrás de los objetos dinámicos compartidos

    + +

    En las versiones modernas de Unix, existe un mecanismo + especialmente útil normalmente llamado enlazado/carga de + Objetos Dinámicos Compartidos (DSO). Este mecanismo + ofrece una forma de construir trozos de código de programa en + un formato especial para cargarlo en tiempo de ejecución en + el espacio de direcciones de memoria de un programa + ejecutable.

    + +

    Esta carga puede hacerse de dos maneras: automáticamente + con un programa de sistema llamado ld.so al inicio de + un programa ejecutable o manualmente desde dentro del programa en + ejecución con una interfaz programática del sistema al + cargador de Unix mediante llamadas al sistema + dlopen()/dlsym().

    + +

    Si se usa el primer método, los objetos dinámicos + compartidos se llaman normalmente librerías + compartidas ó librerías DSO y se + nombran como libfoo.so o + libfoo.so.1.2. Residen en un directorio de + sistema (normalmente /usr/lib) y el enlace con el + programa ejecutable se establece al construir la librería + especificando la opción-lfoo al comando de + enlace. Esto incluye las referencias literales a las + librerías en el programa ejecutable de manera que cuando + se inicie, el cargador de Unix será capaz de localizar + libfoo.so en /usr/lib, en rutas + referenciadas literalmente mediante opciones del linker como + -R o en rutas configuradas mediante la variable + de entorno LD_LIBRARY_PATH. Entonces se resuelven + los símbolos (todavía no resueltos) en el programa + ejecutable que están presentes en el objeto dinámico + compartido.

    + +

    Los símbolos en el programa ejecutable no están + referenciados normalmente en el objeto dinámico compartido + (porque son librerías reusables de propósito general) y + por tanto, no se producen más resoluciones. El programa + ejecutable no tiene que hacer nada por sí mismo para usar los + símbolos del objeto dinámico compartido porque todo el + trabajo de resolución lo hace @@@ Unix loader / el cargador + de Unix @@@. (De hecho, el código para invocar + ld.so es parte del código que se ejecuta al + iniciar, y que hay en cualquier programa ejecutable que haya sido + construido de forma no estática). La ventaja de cargar + dinámicamente el código de las librerías comunes es + obvia: el código de las librerías necesita ser almacenado + solamente una vez, en una librería de sistema como + libc.so, ahorrando así espacio en disco.

    + +

    Por otro lado, los objetos dinámicos compartidos + también suelen llamarse objetos compatidos o + ficheros DSO y se les puede nombrar con cualquier + extensión (aunque su nombre canónico es + foo.so). Estos archivos normalmente permanecen + dentro de un directorio específico del programa y no se + establecen enlaces automáticamente con los programas + ejecutables con los que se usan. En lugar de esto, el + programa ejecutable carga manualmente el objeto dinámico + compartido en tiempo de ejecución en su espacio de + direcciones de memoria con dlopen(). En ese + momento no se resuelven los símbolos del objeto + dinámico compartido para el programa ejecutable. En lugar + de esto, el cargador de Unix resuelve automáticamente los + símbolos (aún no resueltos en el objeto + dinámico compartido del conjunto de símbolos + exportados por el programa ejecutable y de las librerías + DSO que tenga ya cargadas (especialmente todos los + símbolos de la omnipresente libc.so). De + esta manera el objeto dinámico compartido puede conocer + el conjunto de símbolos del programa ejecutable como si + hubiera sido enlazado estáticamente en un primer + momento.

    + +

    Finalmente, para beneficiarse de la API de las DSOs, el + programa ejecutable tiene que resolver los símbolos + particulares de la DSO con dlsym() para ser usado + más tarde dentro de tablas de direccionamiento (dispatch + tables) etc. En otras palabras: El programa ejecutable + tiene que resolver manualmente cada uno de los símbolos que + necesita para poder usarlo después. La ventaja de ese + mecanismo es que las partes opcionales del programa no necesitan + ser cargadas (y por tanto no consumen memoria) hasta que se + necesitan por el programa en cuestión. Cuando es necesario, + estas partes del programa pueden cargarse dinámicamente para + expandir las funcionalidades básicas del programa.

    + +

    Aunque este mecanismo DSO parece muy claro, hay al menos un + paso de cierta dificultad: la resolución de los símbolos + que usa el programa ejecutable por la DSO cuando se usa una DSO + para extender la funcionalidad de una programa (segundo caso). Por + qué? Porque la resolución inversa de símbolos de + DSOs del conjunto de símbolos del programa ejecutable se hace + en contra del diseño de la librería (donde la + librería no tiene conocimiento sobre los programas que la + usan) y tampoco está disponible en todas las plataformas no + estandarizadas. En la práctica los símbolos globales del + programa ejecutable están disponibles para su uso en una + DSO. El mayor problema que hay que resolver cuando se usan DSOs + para extender un programa en tiempo de ejecución es encontrar + un modo de forzar al enlazador a exportar todos los símbolos + globales.

    + +

    El enfoque de las librerías compartidas es bastante + típico, porque es para lo que se diseño el mecanismo + DSO, por tanto se usa para casi todos los tipos de librerías + que incluye el sistema operativo. Por otro lado, no muchos + programas usan objetos compartidos para expandir sus + funcionalidades.

    + +

    En 1998, había solamente unos pocos programas disponibles + que usaban el mecanismo DSO para extender su funcionalidad en + tiempo de ejecucion: Perl 5 (por medio de su mecanismo XS y el + módulo DynaLoader), Netscape Server, etc. A partir + de la version 1.3, Apache se unió a este grupo, Apache usa + desde entonces una concepción modular para extender su + funcionalidad e internamente usa un enfoque de tablas de + direccionamiento (dispatch-list-based) para enlazar módulos + externos con las funcionalidades propias del servidor. De esta + manera, Apache puede usar el mecanismo DSO para cargar sus + módulos en tiempo de ejecución.

    +
    top
    +
    +

    Ventajas e Inconvenientes

    + +

    Las características de las librerías dinámicas + compartidas arriba explicadas tienen las siguientes ventajas:

    + +
      +
    • El servidor es mucho más flexible en tiempo de + ejecución porque pueden añadirse módulos mediante + comandos de configuración LoadModule en + httpd.conf en lugar de tener que hacerlo con las + opciones de configure al compilar. Por + ejemplo, de esta manera uno puede ejecutar diferentes instancias + del servidor (estándar & SSL, mínima & super + potente [mod_perl, PHP3], etc.) con una única + instalación de Apache.
    • + +
    • El servidor puede ser extendido fácilmente con + módulos de terceras partes después de la + instalación. Esto es un gran beneficio al menos para los + mantenedores de paquetes de distribuciones, que pueden crear un + paquete básico de Apache y paquetes adicionales que + contengan extensiones tales como PHP3, mod_perl, mod_fastcgi, + etc.
    • + +
    • Facilita la labor de hacer prototipos de módulos de + Apache porque con el dúo DSO/apxs se + puede trabajar fuera de la estructura de directorios de Apache y + únicamente es necesario el comando apxs -i + seguido del comando apachectl restart para probar + la nueva versión del módulo que se está + desarrollando.
    • +
    + +

    DSO presenta los siguientes inconvenientes:

    + +
      +
    • El mecanismo DSO no puede ser usado en todas las plataformas + porque no todos los sistemas operativos soportan la carga + dinámica de código en el espacio de direcciones de + memoria de un programa.
    • + +
    • El servidor es aproximadamente un 20% más lento + iniciándose por la sobrecarga que implica la + resolución de símbolos por parte del cargador de Unix.
    • + +
    • El servidor es aproximadamente un 5% más lento + ejecutándose en algunas plataformas porque el código + posicionado independientemente (PIC) necesita algunas veces + procesos bastante complicados para calcular direcciones + relativas que no son en principio tan rápidos como los que + se usan para calcular direcciones absolutas.
    • + +
    • Como los módulos DSO no pueden enlazarse a otras + librerías basadas en DSO (ld -lfoo) en todas + las plataformas (por ejemplo en las plataformas basadas en a.out + normalmente no puede ser usada esta funcionalidad, mientras que + sí puede ser usada en las plataformas basadas en ELF) no se + puede usar el mecanismo DSO para todos los tipos de + módulos. En otras palabras, los módulos compilados + como ficheros DSO solamente pueden usar símbolos del + núcleo (kernel) de Apache, los de las librerías de C + (libc) y de todas las demas librerías + dinámicas o estáticas usadas por el núcleo de + Apache, o de archivos de librerías estáticas + (libfoo.a) que contengan código independiente + de su posición. Las únicas posibilidades para usar + otro código es asegurarse de que el núcleo de Apache + contiene una referencia a él o cargar el código por + medio de dlopen().
    • +
    + +
    +
    +

    Idiomas disponibles:  en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/dso.html.fr b/rubbos/app/httpd-2.0.64/docs/manual/dso.html.fr new file mode 100644 index 00000000..1da1434b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/dso.html.fr @@ -0,0 +1,322 @@ + + + +Support des objets partagés dynamiques (DSO) - Serveur Apache HTTP + + + + + +
    <-
    +

    Support des objets partagés dynamiques (DSO)

    +
    +

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

    +
    +
    Cette traduction peut être périmée. Consultez la version + Anglaise pour les changements récents.
    + +

    Le serveur HTTP Apache est un programme modulaire permettant à + l'administrateur de choisir les fonctionnalités qu'il souhaite + activer, au moyen de modules. Les modules peuvent être intégrés + dans le programme binaire httpd au moment de la + compilation. Il est également possible de compiler à part des + modules en tant qu'objets dynamiques partagés (Dynamic Shared + Objects : DSOs) existant séparément du fichier binaire principal + httpd. Les modules DSO peuvent être compilés en même + temps que le serveur, ou après, au moyen de l'outil Apache pour + les extensions (apxs).

    + +

    Ce document décrit les principes de fonctionnement des modules DSO, et + montre comment les utiliser.

    +
    + +
    top
    +
    +

    Implémentation

    + + + +

    Le support DSO servant à charger des modules Apache, est lui-même + codé dans un module, nommé mod_so, qui doit être + compilé dans le noyau d'Apache. Ce module, ainsi que le module + core, sont les deux seuls modules qui ne peuvent + être compilés séparément d'Apache. En pratique, tous les autres + modules d'Apache peuvent être compilés en tant que modules DSO, + en passant au script configure l'option + --enable-module=shared, comme précisé dans + la documentation d'installation. Après + qu'un module ait été compilé en DSO (nommé + mod_monmodule.so), il est possible d'utiliser la + directive de mod_so : LoadModule dans le fichier httpd.conf, + afin qu'Apache charge ledit module au démarrage ou redémarrage du + serveur.

    + +

    Afin de simplifier la création de fichiers DSO pour les + modules Apache (et en particulier les modules tiers), un nouveau + programme de support a été ajouté : apxs (APache eXtenSion). Ce programme peut être + utilisé pour créer des modules DSO en se passant de + l'arborescence source d'Apache. L'idée en est simple : lors de + l'installation d'Apache, la commande make install + positionne les fichiers d'en-têtes C d'Apache, ainsi que les + options du compilateur et les options propres à la plate-forme + dans le programme apxs. Ceci permet à l'utilisateur + de compiler ses modules Apache, au moyen de apxs, + sans disposer de l'arborescence source d'Apache et sans devoir + manipuler les options de compilation ou les options propres à + sa plate-forme.

    +
    top
    +
    +

    Résumé sur l'utilisation des DSO

    + +

    Voici un résumé bref des fonctionnalités DSO d'Apache 2.0 :

    + +
      +
    1. + Pour compiler et installer un module Apache distribué + avec Apache, par exemple mod_foo.c, en tant + que DSO, sous le nom mod_foo.so : + +

      +$ ./configure --prefix=/path/to/install --enable-foo=shared
      +$ make install +

      +
    2. + +
    3. + Pour compiler et installer un module Apache fourni par un + tiers, par exemple mod_foo.c, en tant que DSO, + sous le nom mod_foo.so : + +

      +$ ./configure --add-module=module_type:/chemin/vers/le/tiers/mod_foo.c --enable-foo=shared
      +$ make install +

      +
    4. + +
    5. + Pour configurer Apache afin qu'il puisse accepter les modules DSO : + +

      +$ ./configure --enable-so
      +$ make install +

      +
    6. + +
    7. + Pour compiler et installer un module Apache fourni par un + tiers, par exemple mod_foo.c, en tant que + DSO, et sans disposer de l'arborescence source d'Apache + (utilisation d'apxs) : + +

      +$ cd /chemin/vers/le/tiers
      +$ apxs -c mod_foo.c
      +$ apxs -i -a -n foo mod_foo.la +

      +
    8. +
    + +

    Dans tous les cas, une fois qu'un module a été compilé en tant + que DSO, vous devrez utiliser la directive + LoadModule dans le + fichier httpd.conf afin qu'Apache active le module.

    +
    top
    +
    +

    Contexte

    + +

    Sur les systèmes récents, dérivés d'Unix, il existe un procédé + élégant, habituellement appelé chargement dynamique d'objets + partagés DSO, permettant de compiler un morceau de code sous un + format spécial, et de pouvoir le charger en temps réel dans + l'espace d'adressage d'un programme exécutable.

    + +

    Ce chargement peut être réalisé de deux manières : + automatiquement, grâce à un programme système nommé ld.so + lors du démarrage d'un exécutable, ou manuellement depuis un programme + en exécution via une interface programmée au moyen des appels + systèmes dlopen()/dlsym() du "chargeur" Unix

    + +

    Dans le premier cas, il est courant d'appeler les DSO des + bibliothèques partagées ou des bibliothèques DSO ; + on les nomme libfoo.so ou libfoo.so.1.2. + Elles sont toutes placées dans un répertoire système (souvent + /usr/lib) et sont liées par les programmes exécutables + lors de la compilation de ces derniers, en précisant au moment de + la compilation l'option -lfoo à la commande de link + (linker command). Cette manière de procéder insère les références + des bibliothèques dans le coeur des programmes, afin qu'au moment + du démarrage du programme, le "chargeur" Unix puisse trouver + libfoo.so dans /usr/lib, ou bien dans + les chemins codés en dur au moyen de l'option de link -R, + ou dans un chemin configuré au moyen de la variable d'environnement + LD_LIBRARY_PATH. Tous les symboles non résolus présents + dans le programme sont alors résolus au moyen de DSO.

    + +

    Les symboles propres au programme exécutable ne sont généralement + pas référencés par le DSO (puisque c'est une bibliothèque de code + générique), et donc aucune résolution ne doit être suivie au delà + de ce point. Le programme exécutable n'a pas de travail particulier + à faire pour résoudre les symboles des DSO, puisque c'est le + "chargeur" Unix qui s'occupe de cette tâche. (En réalité, le code + utilisé pour invoquer ld.so fait partie du code de + démarrage run-time, qui est lié à chaque programme exécutable + non statique). L'avantage du chargement dynamique des bibliothèques + de code générique est évident : le code n'est conservé qu'à un seul + endroit du disque, dans une bibliothèque système comme + libc.so, ce qui permet de gagner de l'espace disque + pour chaque programme.

    + +

    Dans le second cas, les DSO sont appelés objets partagés + ou fichiers DSO et on peut leur attribuer une extension au + choix (bien que leur nom soit habituellement foo.so). + Ces fichiers résident normalement dans un répertoire propre au + programme qui les utilise, et ils ne sont pas liés de manière + automatique au programme qui les appelle. Celui-ci les charge en + temps réel lors de son exécution, au moyen de dlopen(). + À cet instant, aucune résolution des symboles du DSO n'est réalisée. + C'est le "chargeur" Unix qui réalise la tâche de résoudre les + symboles non résolus du DSO, à partir du jeu de symboles exportés + par le programme et ses bibliothèques DSO (en particulier, tous + les symboles de l'omniprésente libc.so). Ainsi, le DSO + gagne la connaissance des symboles du programme exécutable, comme + s'il lui avait été lié statiquement au départ.

    + +

    Enfin, pour tirer parti de l'API DSO, l'exécutable doit résoudre + les symboles propres au DSO via dlsym(), pour les + utiliser plus tard dans les tables de répartition (NdT : "dispatch + tables"), etc. En d'autres termes, le programme exécutable + doit résoudre lui-même chaque symbole pour utiliser chacun d'entre + eux. L'avantage de ce mécanisme est que les parties optionnelles + d'un programme ne sont pas chargées (et donc, n'encombrent pas la + mémoire) avant que le programme n'en ait effectivement besoin. + Quand elles deviennent nécessaires, ces parties du programme peuvent + être chargées dynamiquement pour étendre les fonctionnalités du + programme.

    + +

    Bien que ce fonctionnement de DSO puisse paraître simple à + comprendre, il existe au moins une difficulté d'implémentation : + permettre au DSO de résoudre les symboles du programme quand un DSO + est utilisé pour étendre un programme. Pourquoi cela ? Parce que la + "résolution à l'envers" des symboles DSO à partir des symboles du + programme exécutable est contraire au principe de conception des + bibliothèques (où, rappelons-le, la bibliothèque ne sait rien du + programme qui l'utilise) ; cette "résolution à l'envers" n'est pas + standardisée, et n'existe pas sur toutes les plates-formes. En + pratique, les symboles globaux d'un programme exécutable ne sont + que rarement réexportés vers un DSO, et donc ne sont pas accessibles. + Celui qui veut pouvoir étendre les fonctionnalités d'un programme + dynamiquement, lors de l'exécution, doit trouver un moyen de forcer + le programme de liaison à exporter tous les symboles globaux de ce + programme.

    + +

    L'approche par bibliothèques partagées est de loin la plus courante + parce que c'est celle pour laquelle les mécanismes DSO ont été conçus ; + elle est donc utilisée par presque toutes les bibliothèques du système + d'exploitation. De l'autre coté, l'utilisation des objets partagés reste + une approche marginale.

    + +

    Depuis 1998, seules quelques solutions logiciels existantes + utilisent le mécanisme des DSO pour étendre leurs fonctionnalités + en cours exécution : Perl 5 (via son "XS mechanism" et le module + DynaLoader), Netscape Server, etc. Depuis la version 1.3, + Apache a rejoint ce groupe, car Apache utilise une approche + modulaire pour étendre ses fonctionnalités, et utilise de manière + interne des mécanismes de répartition par liste pour lier des + modules externes à son noyau. Apache était vraiment prédestiné, + par concept, à utiliser les DSO pour charger ses modules en temps + réel.

    +
    top
    +
    +

    Avantages et Inconvénients

    + +

    Les possibilités des DSO décrites ci-avant présentent les + avantages suivants :

    + +
      +
    • Le paquetage du serveur est plus flexible lors de son exécution, + car les processus du serveur central peuvent être étendus pendant + son exécution, au moyen de la directive + LoadModule, dans + httpd.conf, plutôt que forcer les utilisateurs à + recompiler le serveur pour modifier ses fonctionnalités. Par + exemple, ce mode de fonctionnement permet de faire tourner + plusieurs instances du serveur (version standard & SSL + version, version minimaliste & étendue [mod_perl, PHP3], + etc.) au moyen d'une seule installation d'Apache.
    • + +
    • Il est très facile d'étendre les fonctionnalités du serveur + de base, même après son installation. Ceci est d'un grand secours + aux mainteneurs des paquets qui peuvent facilement créer des + paquets pour l'installation de base d'Apache et d'autres paquets + différents pour les extensions, comme PHP3, mod_perl, + mod_fastcgi, etc.
    • + +
    • Facilité de développement des modules Apache ; grâce aux outils + DSO/apxs, ce travail est faisable sans l'arborescence + source d'Apache, et ne nécessite qu'une commande apxs -i + suivi d'un apachectl restart pour ajouter au serveur + déjà en marche les fonctionnalités du module développé.
    • +
    + +

    Les inconvénients liés à l'utilisation des DSO :

    + +
      +
    • Les mécanismes de DSO ne sont pas portables sur toutes les + plates-formes, car tous les systèmes d'exploitation ne supportent + pas le chargement dynamique de code dans l'espace d'adressage d'un + programme en marche.
    • + +
    • Le serveur est à peu près 20% plus lent au démarrage, à cause de la + charge prise par le "chargeur" Unix de la résolution des symboles.
    • + +
    • Le serveur est à peu près 5% plus lent en fonctionnement sur + certaines plates-formes parce que le code indépendant de la + position ("position independent code" - PIC) requiert parfois des + tours de passe-passe en assembleur pour l'adressage relatif, ce qui + n'est pas toujours aussi rapide que l'adressage absolu.
    • + +
    • Les modules DSO ne pouvant pas être liés à d'autres bibliothèques + DSO (ld -lfoo) sur toutes les plates-formes (par + exemple, les plates-formes basées sur a.out ne le permettent pas, + alors que celles basées sur ELF le permettent), il n'est pas possible + d'utiliser les mécanismes de DSO pour tous les modules. En d'autres + termes, les modules compilés en tant que fichiers DSO sont limités + à l'utilisation des symboles exportés par le noyau d'Apache, par + la bibliothèque C (libc) et toute autre bibliothèque + dynamique ou statique utilisée par le noyau d'Apache, ou par des + archives de bibliothèques statiques (libfoo.a) qui + contiennent du code indépendant de la position. Les seuls moyens + d'utiliser du code à l'extérieur d'un fichier DSO sont, soit de + s'assurer que le noyau d'Apache contienne une référence vers ce + code, soit de charger ce code au moyen de dlopen().
    • +
    + +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/dso.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/dso.html.ja.utf8 new file mode 100644 index 00000000..739c0fce --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/dso.html.ja.utf8 @@ -0,0 +1,301 @@ + + + +動的共有オブジェクト (DSO) サポート - Apache HTTP サーバ + + + + + +
    <-
    +

    動的共有オブジェクト (DSO) サポート

    +
    +

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

    +
    +
    This translation may be out of date. Check the + English version for recent changes.
    + +

    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.0 の 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 () を使ってコードを自分自身でロードするかの + どちらかしかありません。
    • +
    + +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/dso.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/dso.html.ko.euc-kr new file mode 100644 index 00000000..fcf463e6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/dso.html.ko.euc-kr @@ -0,0 +1,282 @@ + + + +µ¿Àû°øÀ¯°´Ã¼ (DSO) Áö¿ø - Apache HTTP Server + + + + + +
    <-
    +

    µ¿Àû°øÀ¯°´Ã¼ (DSO) Áö¿ø

    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + es  | + 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.0ÀÇ 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  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/dso.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/dso.html.tr.utf8 new file mode 100644 index 00000000..6503d871 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/dso.html.tr.utf8 @@ -0,0 +1,312 @@ + + + +Devingen Paylaşımlı Nesne Desteği - Apache HTTP Sunucusu + + + + + +
    <-
    +

    Devingen Paylaşımlı Nesne Desteği

    +
    +

    Mevcut Diller:  en  | + es  | + 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 sunucunun + derlenmesi sırasında doğrudan httpd programının + içinde derlenebileceği gibi Devingen Paylaşımlı Nesneler (DSO - Dynamic + Shared Object) halinde httpd programından ayrı + olarak da derlenebilir. 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 sunucuya eklenebilir.

    + +

    Bu belgede DSO modüllerinin kullanımının yanında teorisine de + değinilecektir.

    +
    + +
    top
    +
    +

    Gerçeklenim

    + + + +

    Apache modüllerini yüklemek için DSO desteği, Apache ç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. Hemen hemen tüm diğer Apache modülleri kurulum belgesinde de açıklandığı gibi + configure betiğinin + --enable-modül=shared seçeneği her modül için ayrı + ayrı belirtilerek birer DSO modülü olarak derlenebilir. 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.

    + +

    Apache 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 modüllerini Apache kaynak ağacından + ayrı olarak derlemek için kullanılabilir. Fikir basittir: Apache + derlenirken DSO dosyalarını derlemek için platforma bağımlı + derleyici ve ilintileyici seçenekleri apxs + programının içine konur ve Apache’nin make install ile + kurulumu sırasında Apache C başlık dosyaları da kurulur. Böylece + kullanıcı Apache 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 modülünü apxs programını + kullanarak derleyebilir.

    +
    top
    +
    +

    Kullanıcı Özeti

    + +

    Apache 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 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=shared
      + $ make install +

      +
    2. + +
    3. Kaynak dosyası mod_filanca.c dosyasında dağıtılan bir + üçüncü parti Apache modülünü mod_filanca.so + isminde bir DSO modülü olarak derlemek ve kurmak için şöyle yapılır: + +

      +$ ./configure --add-module=modül-türü:/bir/kurulum/yeri/mod_filanca.c \
      + + --enable-filanca=shared
      +
      +$ make install +

      +
    4. + +
    5. Paylaşımlı modülleri sonradan kurmak için Apache şöyle + yapılandırılır: + +

      +$ ./configure --enable-so
      +$ make install +

      +
    6. + +
    7. Kaynak dosyası mod_filanca.c dosyasında dağıtılan bir + üçüncü parti Apache modülü mod_filanca.so + isminde bir DSO modülü olarak Apache 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 -i -a -n filanca mod_filanca.la +

      +
    8. +
    + +

    Tüm durumlarda derlenen paylaşımlı modülü Apache’nin etkin kılabilmesi + için httpd.conf dosyasında o modül için bir LoadModule yönergesi bulunmalıdır.

    +
    top
    +
    +

    Artalan Bilgisi

    + +

    Günümüzün Unix türevlerinde var olan şık 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. Diğer taraftan, bir programın işlevselliğini + genişletmek için paylaşımlı nesne kullanımı çoğu program tarafından + kullanılan bir şey değildir.

    + +

    1998 itibariyle, DSO nesneleriyle çalışma anında çalıştırılabilir + program işlevselliğini genişleten başlıca birkaç yazılım paketi vardır: + Perl 5 (XS mekanizması ve DynaLoader modülü üzerinden), Netscape + Sunucusu, vd. 1.3 sürümünden itibaren Apache de bu gruba katıldı. Çünkü + Apache, modül kavramını zaten program işlevselliğini genişletmek için + kullanıyordu ve temel işlevselliğine dış modülleri ilintilemek için + dahili olarak dağıtım listesine dayalı bir yaklaşım kullanmaktaydı. + Dolayısıyla Apache, modüllerini çalışma anında yüklemek için DSO + kullanmaya baştan yazgılıydı.

    +
    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ü, asıl 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 güçlendirilmiş 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 + PHP3, mod_perl, mod_fastcgi gibi ek paketler oluşturan paket + dağıtıcılarına büyük yarar sağlar.
    • + +
    • Yeni Apache modülleri için daha kolay prototip geliştirilebilir: + Modül kaynak kodunu DSO/apxs çifti sayesinde + Apache 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 sunucusunda denemek daha + kolay hale getirilmiştir.
    • +
    + +

    DSO kullanımının götürüleri ise şunlardır:

    + +
      +
    • Her platformda hazır olarak desteklenmeme: Tüm işletim sistemleri + bir programa devingen olarak kod yükleme becerisine sahip + olmadığından DSO mekanizması her platformda kullanılamaz.
    • + +
    • Ä°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 temel kodunda vardır ya Apache 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 + ç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  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/env.html b/rubbos/app/httpd-2.0.64/docs/manual/env.html new file mode 100644 index 00000000..8d49411e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/env.html @@ -0,0 +1,25 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: env.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: env.html.es +Content-Language: es +Content-type: text/html; charset=ISO-8859-1 + +URI: env.html.fr +Content-Language: fr +Content-type: text/html; charset=ISO-8859-1 + +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/rubbos/app/httpd-2.0.64/docs/manual/env.html.en b/rubbos/app/httpd-2.0.64/docs/manual/env.html.en new file mode 100644 index 00000000..b1713321 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/env.html.en @@ -0,0 +1,417 @@ + + + +Environment Variables in Apache - Apache HTTP Server + + + + + +
    <-
    +

    Environment Variables in Apache

    +
    +

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

    +
    + +

    The Apache HTTP Server provides a mechanism for storing + information in named variables that are 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.
    • + +
    • The SetEnv directive runs + late during request processing meaning that directives such as + SetEnvIf and RewriteCond will not see the + variables set with it.
    • +
    + +
    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 the value of + environment variables using the allow from env= + and deny from 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-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 (see the known client + problems page); 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.

    + + +

    no-gzip

    + +

    When set, the DEFLATE filter of + mod_deflate will be turned off.

    + + + +

    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.

    + + + +
    top
    +
    +

    Examples

    + + +

    Changing protocol behavior with misbehaving clients

    + + +

    We recommend that the following lines be included in + httpd.conf to deal with known client problems.

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

    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>
    + + Order Deny,Allow
    + Deny from all
    + Allow from 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  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/env.html.es b/rubbos/app/httpd-2.0.64/docs/manual/env.html.es new file mode 100644 index 00000000..d83da9e6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/env.html.es @@ -0,0 +1,440 @@ + + + +Variables de entorno de Apache - Servidor HTTP Apache + + + + + +
    <-
    +

    Variables de entorno de Apache

    +
    +

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

    El servidor HTTP Apache HTTP ofrece un mecanismo para almacenar + información en variables especiales que se llaman + variables de entorno. Esta información puede ser + usada para controlar diversas operaciones como por ejemplo, + almacenar datos en ficheros de registro (log files) o controlar el + acceso al servidor. Las variables de entorno se usan también + como un mecanismo de comunicación con programas externos como + por ejemplo, scripts CGI. Este documento explica las diferentes + maneras de usar y manipular esas variables.

    + +

    Aunque estas variables se llaman variables de entorno, + no son iguales que las variables de entorno que controla el + sistema operativo de la máquina en que se está + ejecutando Apache. Las variables de entorno de Apache se almacenan + y manipulan la en estructura interna de Apache. Solamente se + convierten en auténticas variables de entorno del sistema + operativo cuando se pasan a scripts CGI o a scripts Server Side + Include. Si quiere manipular el entorno del sistema operativo + sobre el que Apache se está ejecutando, debe usar los + mecanismos estándar de manipulación que tenga su sistema + operativo.

    +
    + +
    top
    +
    +

    Especificación de variables de entorno

    + + + +

    Manipulación básica del entorno

    + + +

    El modo más básico de especificar el valor de una + variable de entorno en Apache es usando la directiva + incondicional SetEnv. Las variables pueden + también pasarse desde el shell en el que se inicio Apache + usando la directiva PassEnv.

    + + +

    Especificación condicional por petición

    + + +

    Si necesita más flexibilidad, las directivas incluidas + con mod_setenvif permiten especificar valores para las + variables de entorno de manera condicional en función de + las caracteristicas particulares de la petición que se + esté procesando. Por ejemplo, se puede especificar un + valor para una variable solamente cuando la petición se + haga con un navegador específico, o solamente cuando la + petición contenga una determinada información en su + cabecera. Si necesita aún más flexibilidad, puede + conseguirla con la directiva RewriteRule del módulo + mod_rewrite que tiene la opción [E=...] para + especificar valores en las variables de entorno.

    + + +

    Identificadores únicos

    + + +

    Finalmente, mod_unique_id determina el valor de la variable + de entorno UNIQUE_ID para cada + petición. Este valor está garantizado que sea + único entre todas las peticiones bajo condiciones muy + específicas.

    + + +

    Variables CGI estándar

    + + +

    Además de todas las variables de entorno especificadas + en la configuración de Apache y las que se pasan desde el + shell, los scripts CGI y las páginas SSI tienen un + conjunto de variables de entorno que contienen + meta-información sobre la petición tal y como + establece la especificación + CGI.

    + + +

    Algunas limitaciones

    + + +
      +
    • No es posible reeemplazar los valores o cambiar las + variables estándar CGI usando las directivas de + manipulación del entorno.
    • + +
    • Cuando se usa suexec para + lanzar scripts CGI, el entorno se limpia y se queda reducido + a un conjunto de variables seguras antes de que se + lancen los scripts. La lista de variables seguras + se define en el momento de compilar en + suexec.c.
    • + +
    • Por razones de portabilidad, los nombres de las + variables de entorno solo pueden contener letras, + números y guiones bajos. Además, el primer + caracter no puede ser un número. Los caracteres que no + cumplan con esta restricción, se reemplazan + automáticamente por un guión bajo cuando se pasan + a scripts CGI y a páginas SSI.
    • +
    + +
    top
    +
    +

    Cómo usar las variables de entorno

    + + + + +

    Scripts CGI

    + + +

    Uno de los principales usos de las variables de entorno es + pasar información a scripts CGI. Tal y como se explicaba + más arriba, el entorno que se pasa a los scripts CGI + incluye meta-información estándar acerca de la + petición además de cualquier variable especificada + en la configuración de Apache. Para obtener más + información sobre este tema consulte el tutorial sobre CGIs.

    + + +

    Páginas SSI

    + + +

    Los documentos procesados por el servidor con el filtro + INCLUDES perteneciente a mod_include pueden + imprimir las variables de entorno usando el elemento + echo, y pueden usar las variables de entorno en + elementos de control de flujo para dividir en partes una + página condicional según las características de + la petición. Apache también sirve páginas SSI + con las variables CGI estándar tal y como se explica + más arriba en este documento. Para obetener más + información, consulte el tutorial sobre SSI.

    + + +

    Control de acceso

    + + +

    El acceso al servidor puede ser controlado en función + del valor de las variables de entorno usando las directivas + allow from env= y deny from env=. En + combinación con la directiva SetEnvIf, se puede tener un + control más flexible del acceso al servidor en + función de las características del cliente. Por + ejemplo, puede usar estas directivas para denegar el acceso si + el cliente usa un determinado navegador.

    + + +

    Registro condicional

    + + +

    Los valores de las variables de entorno pueden registrarse + en el log de acceso usando la directiva LogFormat con la + opción %e. Además, la decisión + sobre qué peticiones se registran puede ser tomada en + función del valor de las variables de entorno usando la + forma condicional de la directiva CustomLog. En + combinación con SetEnvIf, esto permite controlar de forma + flexible de qué peticiones se guarda registro. Por + ejemplo, puede elegir no registrar las peticiones que se hagan + a ficheros cuyo nombre termine en gif, o puede + elegir registrar únicamente las peticiones que provengan + de clientes que estén fuera de su propia red.

    + + +

    Cabeceras de respuesta condicionales

    + + +

    La directiva Header puede utilizar la + presencia o ausencia de una variable de entorno para + determinar si una determinada cabecera HTTP se incluye en la + respuesta al cliente. Esto permite, por ejemplo, que una + determinada cabecera de respuesta sea enviada únicamente + si también estaba presente en la petición del + cliente.

    + + + +

    Activación de filtros externos

    + + +

    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.

    + + +

    Reescritura de URLs

    + + +

    La expresion %{ENV:...} de TestString + en una directiva RewriteCond permite que el + motor de reescritura de mod_rewrite pueda tomar decisiones en + función del valor de variables de entorno. Tenga en + cuenta que las variables accesibles en mod_rewrite sin el + prefijo ENV: no son realmente variables de + entorno. En realidad, son variables especiales de mod_rewrite + que no pueden ser accedidas desde otros módulos.

    + +
    top
    +
    +

    Variables de entorno con funciones especiales

    + + +

    Los problemas de interoperatividad han conducido a la + introducción de mecanismos para modificar el + comportamiento de Apache cuando se comunica con determinados + clientes. Para hacer que esos mecanismos sean tan flexibles + como sea posible, se invocan definiendo variables de entorno, + normalmente con la directiva BrowserMatch, aunque + también se puede usar por ejemplo con las directivas + SetEnv y PassEnv.

    + +

    downgrade-1.0

    + + +

    Fuerza que la petición sea tratada como una petición + HTTP/1.0 incluso si viene en una especificación posterior.

    + + +

    force-no-vary

    + + +

    Hace que cualquier campo Vary se elimine de la + cabecera de la respuesta antes de ser enviada al + cliente. Algunos clientes no interpretan este campo + correctamente (consulte la sección sobre problemas conocidos con + clientes); usar esta variable puede evitar esos + problemas. Usar esta variable implica también el uso de + force-response-1.0.

    + + +

    force-response-1.0

    + + +

    Fuerza que la respuesta a una petición HTTP/1.0 se haga + también según la especificación HTTP/1.0. Esto se + implementó originalmente como resultado de un problema con + los proxies de AOL. Algunos clientes HTTP/1.0 no se comportan + correctamente cuando se les envía una respuesta HTTP/1.1, y + este mecanismo hace que se pueda interactuar con ellos.

    + + + +

    gzip-only-text/html

    + + +

    Cuando tiene valor "1", esta variable desactiva el filtro + de salida DEFLATE de mod_deflate para + contenidos de tipo diferentes de text/html.

    + + +

    no-gzip

    + +

    Cuando se especifica, se desactiva el filtro + DEFLATE de mod_deflate.

    + + + +

    nokeepalive

    + + +

    Desactiva KeepAlive.

    + + + +

    prefer-language

    + +

    Influye en el comportamiento de + mod_negotiation. Si contiene una etiqueta de + idioma (del tipo en, ja o + x-klingon), mod_negotiation + intenta que se use ese mismo idioma en la respuesta. Si no + está disponible ese idioma, se aplica el proceso de negociación + normal.

    + + + +

    redirect-carefully

    + + +

    Fuerza que el servidor sea especialmente cuidadoso al + enviar una redirección al cliente. Se usa normalmente + cuando un cliente tiene un problema conocido tratando las + redirecciones. Fue implementado originalmente por el problema + que presentaba el software de WebFolders de Microsoft, que + tenía problemas interpretando redirecciones originadas + cuando se accedía a recursos servidos usando DAV.

    + + + +

    suppress-error-charset

    + + +

    Disponible en las versiones de Apache 2.0.40 y posteriores

    + +

    Cuando Apache efectúa una redirección en respuesta a la + petición de un cliente, la respuesta incluye algún texto para que + se muestre en caso de que el cliente no pueda seguir (o no siga) + automáticamente la redirección. Apache normalmente etiqueta este + texto siguiendo la codificación ISO-8859-1.

    + +

    Sin embargo, si la redirección es a una página que + usa una codificación diferente, algunas versiones de + navegadores que no funcionan correctamente intentarán usar la + codificación del texto de redirección en lugar de la de + pagina a la que ha sido redireccionado. La consecuencia de esto + puede ser, por ejemplo, que una página en griego no se + muestre correctamente.

    + +

    Especificar un valor en esta variable de entorno hace que + Apache omita la codificación en el texto que incluye con las + redirecciones, y que esos navegadores que no funcionan + correctamente muestren correctamente la página de destino.

    + + + +
    top
    +
    +

    Ejemplos

    + + +

    Cómo cambiar el comportamiento de clientes que se + comportan de manera inapropiada

    + + +

    Recomendamos que incluya las siguentes líneas en el + fichero httpd.conf para evitar problemas conocidos

    +
    +
    +#
    +# Las siguientes directivas modifican el comportamiento normal de las respuestas HTTP.
    +# La primera directiva desactiva keepalive para Netscape 2.x y para navegadores 
    +# que la simulan. Hay problemas conocidos con esos navegadores.
    +# La segunda directiva es para Microsoft Internet Explorer 4.0b2
    +# que tiene un fallo en la implemantación de HTTP/1.1 y no soporta
    +# keepalive adecuadamente cuando se usan respuestas 301 ó 302 (redirecciones).
    +#
    +BrowserMatch "Mozilla/2" nokeepalive
    +BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0
    +
    +#
    +# La siguiente directiva desactiva las respuestas HTTP/1.1 para navegadores que
    +# violan la especificación HTTP/1.0 @@@ 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
    + + +

    No almacenar entradas en registro de acceso para las + imágenes

    + + +

    Este ejemplo evita que las peticiones de imágenes + aparezcan en el registro de acceso. Puede ser modificada + fácilmente para evitar que se registren entradas de + peticiones de directorios, o provenientes de determinados + clientes.

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

    Evitar el "robo de imagenes"

    + + +

    Este ejemplo muestra como evitar que otras webs usen las + imágenes de su servidor para sus páginas. Esta + configuración no se recomienda, pero puede funcionar en + determinadas circunstancias. Asumimos que que todas sus + imágenes están en un directorio llamado + /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>
    + +

    Para obtener más información sobre esta + técnica, consulte el tutorial de ApacheToday " + Keeping Your Images from Adorning Other Sites".

    +
    +
    +

    Idiomas disponibles:  en  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/env.html.fr b/rubbos/app/httpd-2.0.64/docs/manual/env.html.fr new file mode 100644 index 00000000..5836ebbb --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/env.html.fr @@ -0,0 +1,425 @@ + + + +Apache et les variables d'environnement - Serveur Apache HTTP + + + + + +
    <-
    +

    Apache et les variables d'environnement

    +
    +

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

    +
    +
    Cette traduction peut être périmée. Consultez la version + Anglaise pour les changements récents.
    + +

    Le serveur HTTP Apache permet de conserver et d'utiliser + certaines informations dans des variables appelées variables + d'environnement. Ces informations peuvent servir à contrôler + divers paramètres tels que la journalisation ou le contrôle d'accès. + Ces variables sont également utilisées pour communiquer avec d'autres + programmes, comme les scripts CGI. Ce document traite des manières + de manipuler et de tirer parti de ces variables.

    + +

    Bien qu'elles soient appelées variables d'environnement, + il ne s'agit pas de variables d'environnement contrôlées par le + système d'exploitation. Ces variables sont conservées, et manipulées + suivant des mécanismes internes à Apache. Elles sont transformées + en véritables variables d'environnement (au sens système) seulement + quand elles doivent être passées à des scripts CGI ou à des scripts + 'Server Side Includes'. Pour manipuler l'environnement du système + d'exploitation sur lequel tourne un serveur Apache, il suffit + d'utiliser les méthodes standard fournies par l'interpréteur de + commandes du système d'exploitation.

    +
    + +
    top
    +
    +

    Définir les variables d'environnement

    + + + +

    Manipulations simples de l'environnement

    + + +

    La méthode la plus simple pour définir une variable + d'environnement dans Apache est d'utiliser la directive + SetEnv. Les variables + peuvent également être chargées depuis l'interpréteur de + commandes à partir duquel le serveur a été démarré, au moyen + de la directive PassEnv.

    + + +

    Paramétrage selon les requêtes

    + + +

    Dans un but de souplesse, les directives que mod_setenvif + permet d'utiliser sont ajustables en fonction de certaines + caractéristiques des requêtes parvenant au serveur. Par exemple, + il est possible de définir une variable seulement si la requête + provient d'un certain type de navigateur (User-Agent), ou bien + si un champ Referer bien précis est trouvé. Une souplesse encore + plus grande est offerte par la directive + RewriteRule du + module mod_rewrite qui accepte le paramètre [E=...] + pour définir des variables d'environnement.

    + + +

    Identifiants uniques

    + + +

    Enfin, la variable d'environnement UNIQUE_ID + est créée par mod_unique_id pour chaque requête, de manière à + être unique et donc représentative de chaque requête.

    + + +

    Variables CGI standard

    + + +

    En plus de toutes les variables d'environnement définies dans + la configuration d'Apache et celles du système d'exploitation, + les spécifications + CGI demandent que certaines variables d'environnement + contenant des informations propres à la requête soient toujours + passées aux scripts CGI et aux pages SSI.

    + + +

    Problèmes possibles

    + + +
      +
    • Il n'est pas possible de remplacer la valeur des variables + CGI standard au moyen des directives qui manipulent les + variables d'environnement.
    • + +
    • Dans les cas où les scripts CGI sont lancés au moyen de + suexec, l'environnement est nettoyé et + les variables sont initialisées avec des valeurs sûres, + définies lors de la compilation de suexec.c.
    • + +
    • Pour des raisons d'interopérabilité, les noms des variables + d'environnement ne peuvent être constitués que de lettres, de + chiffres et du caractère de soulignement '_'. De plus, le + premier caractère du nom ne peut pas être un chiffre. Les + caractères en contradiction avec ces règles sont remplacés par + des caractères de soulignement avant que les variables ne + soient transmises aux scripts CGI ou aux pages SSI.
    • +
    + +
    top
    +
    +

    Utilisation des variables d'environnement

    + + + + +

    Scripts CGI

    + + +

    Une des principales utilisations des variables d'environnement + est l'envoi d'informations aux scripts CGI. Comme précisé ci- + avant, l'environnement passé aux scripts CGI contient des + informations standard au sujet de la requête en plus de toutes + les variables initialisées au travers de la configuration + d'Apache. Pour plus de détails, consultez le + tutorial CGI.

    + + +

    Pages SSI

    + + +

    Les documents analysés par le serveur (documents SSI), gérés + par le filtre INCLUDES de mod_include, peuvent + demander l'affichage de variables d'environnement au moyen de + l'élément echo, et peuvent les utiliser pour + personnaliser des pages en fonctions de certaines caractéristiques + de la requête. Apache permet aussi l'utilisation de pages SSI avec + les variables d'environnement standard CGI comme discuté ci-avant. + Consultez le tutorial SSI + pour plus d'informations.

    + + +

    Contrôle d'accès

    + + +

    Les droits d'accès au serveur peuvent être contrôlés au moyen + de variables d'environnement en utilisant les directives + allow from env= et deny from env=. + Celles ci, utilisées avec SetEnvIf, permettent un contrôle d'accès au serveur + très souple en fonction de caractéristiques propres au client. Par + exemple, il est possible d'utiliser ces directives pour refuser + l'accès au serveur à certains navigateurs (User-Agent).

    + + +

    Journalisation sous certaines conditions

    + + +

    Les variables d'environnement peuvent être enregistrées dans + le journal des accès ('access log') au moyen de l'option + %e de LogFormat. De plus, la décision d'enregistrer ou + non certaines requêtes peut être prise en fonction des variables + d'environnement au moyen de la directive + CustomLog. Cette + méthode, utilisée avec la directive SetEnvIf, permet un contrôle très souple de + l'enregistrement des requêtes. Par exemple, il est possible de + ne pas garder de trace des requêtes demandant des noms de fichiers + se terminant par gif, ou de n'enregistrer que les + requêtes des clients situés hors du sous-réseau auquel appartient + le serveur.

    + + +

    Personnaliser les en-têtes des réponses HTTP

    + + +

    La directive Header + peut tirer parti de l'existence ou non d'une variable + d'environnement afin de choisir d'inclure certains en-têtes + HTTP dans la réponse retournée au client. Ceci permet, par + exemple, d'envoyer un certain en-tête de réponse seulement si un + en-tête similaire a été positionné dans la requête émanant du + client.

    + + + +

    Activation des filtres externes

    + + +

    Il est possible d'utiliser une variable d'environnement pour + activer les filtres externes (gérés par + mod_ext_filter au moyen de la directive + ExtFilterDefine) + grâce aux options disableenv= et + enableenv=.

    + + +

    Réécriture d'URL

    + + +

    La forme %{ENV:...} de TestString, dans + la directive RewriteCond, permet au moteur de réécriture de + mod_rewrite d'utiliser les variables d'environnement pour + contrôler les réécritures. Notez que toutes les variables + internes à mod_rewrite, accessibles sans le préfixe + ENV:, ne sont pas des variables d'environnement + d'Apache. Elles sont uniquement propres à mod_rewrite et ne + peuvent pas être utilisées par d'autres modules.

    + +
    top
    +
    +

    Variables d'environnement spéciales

    + + +

    Certains problèmes liés à l'interopérabilité ont conduit à la + mise en place de mécanismes spéciaux, qui modifient le + fonctionnement d'Apache selon le type des clients auxquels il + répond. Afin de garantir la plus grande souplesse possible, ces + mécanismes sont contrôlés par des variables d'environnement + spéciales, telles que BrowserMatch, bien qu'on puisse également utiliser + SetEnv et + PassEnv par exemple.

    + +

    downgrade-1.0

    + + +

    Ceci oblige Apache à traiter la requête comme du HTTP/1.0 même + si elle a été construite sur une norme plus récente.

    + + +

    force-no-vary

    + + +

    Ceci provoque l'effacement de tous les champs Vary + de l'en-tête de réponse avant qu'il ne soit envoyé au client. + Certains clients interprètent mal ce champ (voir + les problèmes avec + certains clients), et initialiser cette variable peut + permettre de résoudre ce problème. Cette variable requiert + également l'utilisation de force-response-1.0.

    + + +

    force-response-1.0

    + + +

    Ceci oblige Apache à n'envoyer que des réponses en HTTP/1.0 aux + clients réalisant une requête en HTTP/1.0. Cette fonction a été + implémentée au départ pour résoudre un problème avec les serveurs + mandataires d'AOL. Certains clients HTTP/1.0 réagissent mal quand + ils reçoivent une réponse en HTTP/1.1, ce qui peut poser des + problèmes d'interopérabilité avec eux.

    + + + +

    gzip-only-text/html

    + + +

    Si cette variable est positionnée avec une valeur de "1", le + filtre de sortie DEFLATE du module mod_deflate + se retrouve désactivé pour les documents dont le type mime n'est + pas text/html.

    + + + +

    no-gzip

    + +

    Si cette variable est initialisée, le filtre DEFLATE + du module mod_deflate est totalement désactivé.

    + + + +

    nokeepalive

    + + +

    Si cette variable est initialisée, les fonctions + KeepAlive sont désactivées.

    + + + +

    prefer-language

    + +

    Cette variable modifie le fonctionnement de + mod_negotiation. Si la variable contient un + marqueur de langue (comme en, ja ou + x-klingon), le module mod_negotiation + va tenter de fournir une réponse dans cette langue parmi les + variantes possibles. Si aucune de ces variantes n'existe, une + négociation normale aura + lieu.

    + + + +

    redirect-carefully

    + + +

    Cette variable rend le serveur plus attentif quand il doit + envoyer une redirection au client. Cette variable est + habituellement utilisée quand un client a un problème connu + pour gérer les redirections. Cette variable a été implémentée + pour pallier à un problème du logiciel WebFolders de Microsoft + qui ne sait pas gérer correctement les redirections vers les + répertoires via les méthodes DAV.

    + + + +

    suppress-error-charset

    + + +

    Existe depuis la version 2.0.40

    + +

    Quand Apache envoie une redirection en réponse à une requête, la + réponse contient un message à afficher par le client, au cas où il + ne peut suivre automatiquement la redirection. Le fonctionnement + par défaut d'Apache est d'écrire ce texte avec le jeu de caractère + qu'il utilise, c'est à dire ISO-8859-1.

    +

    Cependant, si la redirection pointe vers une page présentant un jeu + de caractères différent, certains navigateurs buggés utilisent le jeu + de caractères du texte de la redirection, au lieu de celui de la page + qu'ils affichaient. De ce fait, un texte en grec serait mal affiché.

    +

    Si cette variable d'environnement est utilisée, Apache n'indiquera + pas le jeu de caractère dans le texte de la redirection, ce qui permet + à ces navigateurs d'afficher correctement la page de destination.

    + + + +
    top
    +
    +

    Exemples

    + + +

    Modifier le fonctionnement d'un protocole pour les clients + qui le gèrent mal

    + + +

    Il est conseillé de placer les lignes suivantes dans httpd.conf + afin de gérer des problèmes connus de certains clients.

    +
    +#
    +# Les directives ci-après modifient le fonctionnement standard de HTTP.
    +# La première directive désactive les fonctions keepalive pour les 
    +# navigateurs disant s'appeler 'Netscape 2.x'
    +# Il existe des problèmes connus avec ces navigateurs.
    +# La deuxième directive gère Internet Explorer 4.0b2 de Microsoft qui
    +# n'implémente pas correctement HTTP/1.1 et qui ne supporte pas les 
    +# fonctions keepalive quand la réponse du serveur contient des codes 301 
    +# ou 302 (redirections)
    +#
    +BrowserMatch "Mozilla/2" nokeepalive
    +BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0
    +
    +#
    +# Les directives ci-dessous désactivent HTTP/1.1 pour les navigateurs qui 
    +# violent les spécifications HTTP/1.0, en ne sachant pas analyser des 
    +# réponses basiques en 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
    + + +

    Ne pas enregistrer les requêtes pour des images dans le + journal des accès

    + + +

    Cet exemple montre comment ne pas enregistrer les requêtes à + destination d'images dans le journal des accès. Il est facile + de le modifier, pour limiter l'enregistrement à certains + répertoires, ou pour des requêtes venant de machines précises.

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

    Empêcher le « vol d'images »

    + + +

    Cet exemple montre comment empêcher le chargement d'images de + votre serveur depuis des pages qui ne sont pas hébergées sur + celui-ci. Cette configuration n'est pas conseillée, mais elle + peut être utile dans certaines circonstances. Il est supposé ici + que toutes les images sont stockées dans le répertoire + /web/images.

    +
    +SetEnvIf Referer "^http://www.example.com/" local_referal
    +# Autorise les navigateurs qui n'envoient pas de champ Referer
    +SetEnvIf Referer "^$" local_referal
    +<Directory /web/images>
    +   Order Deny,Allow
    +   Deny from all
    +   Allow from env=local_referal
    +</Directory>
    + +

    Pour plus d'informations sur cette technique, consultez le + tutorial ApacheToday « Keeping Your Images from Adorning Other Sites ».

    + +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/env.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/env.html.ja.utf8 new file mode 100644 index 00000000..c4c56139 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/env.html.ja.utf8 @@ -0,0 +1,391 @@ + + + +Apache の環境変数 - Apache HTTP サーバ + + + + + +
    <-
    +

    Apache の環境変数

    +
    +

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

    +
    +
    This translation may be out of date. Check the + English version for recent changes.
    + +

    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 + ページに渡されるときにアンダースコアに置換されます。
    • +
    + +
    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-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 出力フィルタを無効にします。

    + + +

    no-gzip

    +

    セットされると、mod_deflate の + DEFLATE フィルタがオフになります。

    + + +

    nokeepalive

    + + +

    これが設定されている場合は、KeepAlive を使用しないようにします。

    + +

    prefer-language

    + +

    mod_negotiation の挙動に影響を与えます。 + (en, ja, x-klingonといった) + 言語タグが格納されていれば、その言語の variant を送信しようとします。 + そのような variant がない場合は、 + 通常のネゴシエーション処理が + 適用されます。

    + + + + +

    redirect-carefully

    + + +

    これはクライアントへのリダイレクトの送信をサーバがより注意深く + 行なうようにします。 + これは通常、リダイレクトに際してクライアントに + 問題があることが分かっている場合に使われます。この機能は元々は + マイクロソフトのウェブフォルダのソフトが DAV + メソッドによるディレクトリのリソースへのリダイレクトの扱いに + 問題がり、それを回避するために実装されました。

    + + + +

    suppress-error-charset

    + + +

    Apache 2.0.40 以降で利用可能

    + +

    クライアントのリクエストに対する応答としてリダイレクトを送信する際、 + レスポンスにはリダイレクトが自動的に行なえない (行なわれない) + 場合に表示するテキストが含まれます。 + 通常、このテキストに合致したキャラクタセット、ISO-8859-1 + でラベル付けをします。

    +

    しかし、リダイレクト先が別の文字セットを使っている場合、 + ある問題のあるブラウザのバージョンでは、 + リダイレクト先の実際の文字セットの代わりに、 + リダイレクト元の文字セットを使ってしまうことがあります。 + その結果、例えば変な描画が行なわれたりして、読めなくなったりします。

    +

    この環境変数を設定することで、リダイレクションテキストに対する + キャラクタセットの指定を除去しますので、それら問題のあるブラウザでも + リダイレクト先の文字セットを正しく使うようにできます。

    + + + +
    top
    +
    +

    例

    + + +

    おかしな挙動をするクライアントに対してプロトコルの動作を変更する

    + + +

    クライアントに関する既知の問題に対処するために、以下の行を + 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>
    + +

    この手法に関する詳しい情報は ApacheToday のチュートリアル「Keeping Your Images from Adorning Other Sites + 」を参照してください。

    + +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/env.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/env.html.ko.euc-kr new file mode 100644 index 00000000..827a94bd --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/env.html.ko.euc-kr @@ -0,0 +1,370 @@ + + + +¾ÆÆÄÄ¡ÀÇ È¯°æº¯¼ö - Apache HTTP Server + + + + + +
    <-
    +

    ¾ÆÆÄÄ¡ÀÇ È¯°æº¯¼ö

    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + es  | + 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-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 Ãâ·ÂÇÊÅ͸¦ + »ç¿ëÇÏÁö ¾Ê´Â´Ù.

    + + +

    no-gzip

    + +

    ÀÌ ¿É¼ÇÀ» ¼³Á¤Çϸé mod_deflateÀÇ + DEFLATE ÇÊÅ͸¦ »ç¿ëÇÏÁö ¾Ê´Â´Ù.

    + + + +

    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  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/env.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/env.html.tr.utf8 new file mode 100644 index 00000000..eae439b1 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/env.html.tr.utf8 @@ -0,0 +1,413 @@ + + + +Apache’de Ortam Değişkenleri - Apache HTTP Sunucusu + + + + + +
    <-
    +

    Apache’de Ortam Değişkenleri

    +
    +

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

    +
    + +

    Apache HTTP Sunucusunda bilgiyi değişkenlerde saklamak için ortam + değişkenleri adı verilen bir mekanizma bulunur. Saklanan bu 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.
    • + +
    • Ä°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.
    • +
    + +
    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

    + + +

    allow from env= ve deny from 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-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 (bilinen + istemci sorunları sayfasına bakınız), 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.

    + + +

    no-gzip

    + +

    Bu değişken atandığında, mod_deflate modülünün + DEFLATE süzgeci kapatılır.

    + + + +

    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.

    + + +
    top
    +
    +

    Örnekler

    + + +

    Protokolü yanlış yorumlayan tarayıcıların davranışlarının + değiştirilmesi

    + + +

    Bilinen istemci davranışlarına karşı önlem olarak + aşağıdaki satırların httpd.conf içinde bulunması + önerilir.

    + +
    +#
    +# 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://filan.fesmekan.dom/" local_referal
    + # Referrer bilgisi göndermeyen tarayıcılara izin verelim
    + SetEnvIf Referer "^$" local_referal
    + <Directory /siteler/resimler> + + Order Deny,Allow
    + Deny from all
    + Allow from 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  | + es  | + fr  | + ja  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/faq/all_in_one.html b/rubbos/app/httpd-2.0.64/docs/manual/faq/all_in_one.html new file mode 100644 index 00000000..26b549f1 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/faq/all_in_one.html @@ -0,0 +1,13 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: all_in_one.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: all_in_one.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: all_in_one.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/faq/all_in_one.html.en b/rubbos/app/httpd-2.0.64/docs/manual/faq/all_in_one.html.en new file mode 100644 index 00000000..24ba124d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/faq/all_in_one.html.en @@ -0,0 +1,206 @@ + + + +Frequently Asked Questions - Apache HTTP Server + + + + + +
    <-
    +

    Frequently Asked Questions

    +
    +

    Available Languages:  en  | + ko  | + tr 

    +
    + +

    The latest version of this FAQ is always available from the main Apache + web site, at <http://httpd.apache.org/docs/2.0/faq/>.

    + +

    Since Apache 2.0 is quite new, we don't yet know what the Frequently + Asked Questions will be. While this section fills up, you should also + consult the Apache 1.3 + FAQ to see if your question is answered there.

    +
    + +
    top
    +
    +

    Topics

    +
    Support
    What do I do when I have problems?
    +
    Error Messages
    What does this error message mean?
    +
    top
    +
    +

    Support

    + + +

    "Why can't I ...? Why won't ... work?" What to do in case of + problems

    + + +

    If you are having trouble with your Apache server software, you should + take the following steps:

    + +
    +
    Check the errorlog!
    +
    Apache tries to be helpful when it encounters a problem. In many + cases, it will provide some details by writing one or messages to the + server error log. Sometimes this is enough for you to diagnose & fix + the problem yourself (such as file permissions or the like). The default + location of the error log is + /usr/local/apache2/logs/error_log, but see the ErrorLog directive in your config files for the + location on your server.
    + +
    Check the FAQ!
    +
    The latest version of the Apache Frequently-Asked Questions list can + always be found at the main Apache web site.
    + +
    Check the Apache bug database
    +
    Most problems that get reported to The Apache Group are recorded in + the bug database. + Please check the existing reports, open + and closed, before adding one. If you find that your + issue has already been reported, please don't add a "me, too" + report. If the original report isn't closed yet, we suggest that you + check it periodically. You might also consider contacting the original + submitter, because there may be an email exchange going on about the + issue that isn't getting recorded in the database.
    + +
    Ask in a user support forum
    +

    Apache has an active community of users who are willing to share + their knowledge. Participating in this community is usually the best and + fastest way to get answers to your questions and problems.

    + +

    Users + mailing list

    + +

    #httpd on + Freenode IRC is available for + user support issues.

    + +

    USENET newsgroups:

    + +
      +
    • comp.infosystems.www.servers.unix + [news] + [google] +
    • + +
    • comp.infosystems.www.servers.ms-windows + [news] + [google] +
    • + +
    • comp.infosystems.www.authoring.cgi + [news] + [google] +
    • +
    + +
    If all else fails, report the problem in the bug database
    +

    If you've gone through those steps above that are appropriate and + have obtained no relief, then please do let the httpd developers + know about the problem by logging a bug + report.

    + +

    If your problem involves the server crashing and generating a core + dump, please include a backtrace (if possible). As an example,

    + +

    + # cd ServerRoot
    + # dbx httpd core
    + (dbx) where +

    + +

    (Substitute the appropriate locations for your ServerRoot + and your httpd and core files. You may have to use + gdb instead of dbx.)

    +
    +
    + + +

    Whom do I contact for support?

    +

    With several million users and fewer than forty volunteer developers, + we cannot provide personal support for Apache. For free support, we + suggest participating in a user forum.

    + +

    Professional, commercial support for Apache is available from + a number of + companies.

    + +
    top
    +
    +

    Error Messages

    + + +

    Invalid argument: + core_output_filter: writing data to the network

    + +

    Apache uses the sendfile syscall on platforms + where it is available in order to speed sending of responses. + Unfortunately, on some systems, Apache will detect the presence of + sendfile at compile-time, even when it does not work + properly. This happens most frequently when using network or + other non-standard file-system.

    + +

    Symptoms of this problem include the above message in the error + log and zero-length responses to non-zero-sized files. The + problem generally occurs only for static files, since dynamic + content usually does not make use of sendfile.

    + +

    To fix this problem, simply use the EnableSendfile directive to disable + sendfile for all or part of your server. Also see + the EnableMMAP, which can + help with similar problems.

    + + + +

    AcceptEx Failed

    + +

    If you get error messages related to the AcceptEx syscall + on win32, see the Win32DisableAcceptEx + directive.

    + + + +

    Premature end of script + headers

    + +

    Most problems with CGI scripts result in this message written in the + error log together with an Internal Server Error delivered + to the browser. A guide to helping debug this type of problem is + available in the CGI + tutorial.

    + + +
    +
    +

    Available Languages:  en  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/faq/all_in_one.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/faq/all_in_one.html.ko.euc-kr new file mode 100644 index 00000000..46fbf1e2 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/faq/all_in_one.html.ko.euc-kr @@ -0,0 +1,207 @@ + + + +ÀÚÁÖ ¹°¾îº¸´Â Áú¹® (FAQ) - Apache HTTP Server + + + + + +
    <-
    +

    ÀÚÁÖ ¹°¾îº¸´Â Áú¹® (FAQ)

    +
    +

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

    +
    + +

    FAQ ÃÖ½ÅÆÇÀº ¾ÆÆÄÄ¡ À¥»çÀÌÆ® <http://httpd.apache.org/docs/2.0/faq/>¿¡¼­ º¼ ¼ö + ÀÖ´Ù.

    + +

    ¾ÆÆÄÄ¡ 2.0ÀÌ ³ª¿ÂÁö ¾ó¸¶ ¾ÈµÇ¼­ ¿ì¸®´Â ¾ÆÁ÷ ÀÚÁÖ + ¹°¾îº¸´Â Áú¹® (FAQ)ÀÌ ¹«¾ùÀÎÁö ¸ð¸¥´Ù. ³»¿ëÀÌ Ã¤¿öÁú + ¶§±îÁö ¿©±â¿¡ ÇØ´äÀÌ ¾ø´Ù¸é ¾ÆÆÄÄ¡ + 1.3 FAQµµ Âü°íÇ϶ó.

    +
    + +
    top
    +
    +

    ÁÖÁ¦

    +
    Áö¿ø
    ¹®Á¦°¡ »ý±â¸é ¾î¶»°Ô ÇØ°áÇϳª?
    +
    ¿À·ù¹®
    ÀÌ ¿À·ù¹®ÀÌ ¹«½¼ ¶æÀΰ¡?
    +
    top
    +
    +

    Áö¿ø

    + + +

    "¿Ö ... ¾ÈµÇ³ª? ¿Ö ... µ¿ÀÛÇÏÁö ¾Ê´Â°¡?" ¹®Á¦°¡ »ý±â¸é + ÇÒÀÏ

    + + +

    ¾ÆÆÄÄ¡ ¼­¹ö ¼ÒÇÁÆ®¿þ¾î¿¡ ¹®Á¦°¡ »ý±â¸é ´ÙÀ½°ú °°Àº + ´Ü°è¸¦ µû¸¥´Ù:

    + +
    +
    ¿À·ù ·Î±×(errorlog)¸¦ È®ÀÎÇ϶ó!
    +
    ¾ÆÆÄÄ¡ ¼­¹ö´Â ¹®Á¦°¡ »ý±â¸é µµ¿òÀ» ÁÖ·Á°í ³ë·ÂÇÑ´Ù. + ¸¹Àº °æ¿ì ¼­¹ö ¿À·ù ·Î±×¿¡ ÀÚ¼¼ÇÑ ³»¿ëÀ» ±â·ÏÇÑ´Ù. + À̰͸¸À¸·Îµµ Á÷Á¢ (ÆÄÀϱÇÇÑ µî) ¹®Á¦¸¦ ¹ß°ßÇÏ°í °íÄ¥ ¼ö + ÀÖ´Â °æ¿ì°¡ ¸¹´Ù. ¿À·ù ·Î±×ÀÇ ±âº» À§Ä¡´Â + /usr/local/apache2/logs/error_logÀÌÁö¸¸, + Á¤È®ÇÑ À§Ä¡´Â ¼³Á¤ÆÄÀÏÀÇ ErrorLog Áö½Ã¾î¸¦ Âü°íÇ϶ó.
    + +
    FAQ¸¦ + È®ÀÎÇ϶ó!
    +
    ¾ÆÆÄÄ¡ À¥»çÀÌÆ®¿¡¼­ Ç×»ó ¾ÆÆÄÄ¡ FAQ ÃÖ½ÅÆÇÀ» º¼ ¼ö + ÀÖ´Ù.
    + +
    ¾ÆÆÄÄ¡ ¹ö±× µ¥ÀÌÅͺ£À̽º¸¦ È®ÀÎÇ϶ó
    +
    ¾ÆÆÄÄ¡±×·ì(The Apache Group)¿¡ º¸°íµÈ ´ëºÎºÐÀÇ ¹®Á¦´Â + ¹ö±× + µ¥ÀÌÅͺ£À̽º¿¡ ±â·ÏµÈ´Ù. »õ·Î ¹ö±×¸¦ Ãß°¡Çϱâ Àü¿¡, + ÀÌ¹Ì ¾Ë·ÁÁ³°Å³ª(open) ÇØ°áµÈ(closed) ¹ö±×°¡ ÀÖ´ÂÁö È®ÀÎÇϱæ + ¹Ù¶õ´Ù. ÀÌ¹Ì ¹®Á¦°¡ º¸°íµÇ¾ú´Ù¸é "³ªµµ + ÀÌ·± ¹®Á¦°¡ ÀÖ´Ù°í" º¸°íÇÏÁö ¾Ê±æ ¹Ù¶õ´Ù. ¾ÆÁ÷ + ÇØ°áµÇÁö ¾Ê¾Ò´Ù¸é ÁÖ±âÀûÀ¸·Î »óȲÀ» È®ÀÎÇÏ±æ ¹Ù¶õ´Ù. ¶Ç, + µ¥ÀÌÅͺ£À̽º¿¡ ±â·ÏµÇÁö ¾Ê°í À̸ÞÀÏ ±³È¯À¸·Î ÁøÇàµÈ »çÇ×ÀÌ + ÀÖÀ» ¼ö ÀÖÀ¸´Ï óÀ½ ¹®Á¦¸¦ º¸°íÇÑ »ç¶÷¿¡°Ô ¿¬¶ôÇغ¼ ¼öµµ + ÀÖ´Ù.
    + +
    »ç¿ëÀÚ Áö¿ø °ø°£¿¡ + ¹®ÀÇÇÑ´Ù
    +

    ¾ÆÆÄÄ¡¿¡ ´ëÇÑ Áö½ÄÀ» °øÀ¯ÇÏ±æ ¿øÇÏ´Â È°¹ßÇÑ »ç¿ëÀÚ + °øµ¿Ã¼µéÀÌ ÀÖ´Ù. ÀϹÝÀûÀ¸·Î ÀÌ·± °øµ¿Ã¼¿¡ Âü¿©ÇÏ´Â °ÍÀÌ + ¹®Á¦ÀÇ ´äÀ» ¾ò´Â °¡Àå ÁÁ°í ºü¸¥ ¹æ¹ýÀÌ´Ù.

    + +

    »ç¿ëÀÚ + ¸ÞÀϸµ¸®½ºÆ®

    + +

    USENET ´º½º±×·ì:

    + +
      +
    • comp.infosystems.www.servers.unix + [news] + [google] +
    • + +
    • comp.infosystems.www.servers.ms-windows + [news] + [google] +
    • + +
    • comp.infosystems.www.authoring.cgi + [news] + [google] +
    • +
    + +
    À§ÀÇ ¹æ¹ýÀÌ ¸ðµÎ ½ÇÆÐÇÏ¸é ¹ö±× µ¥ÀÌÅͺ£À̽º¿¡ ¹®Á¦¸¦ + º¸°íÇÑ´Ù
    +

    À§ÀÇ ´Ü°è¸¦ ¸ðµÎ ½ÃµµÇÏ°íµµ ÇØ°áÃ¥ÀÌ ¾ø´Ù¸é, ¹ö±×¸¦ + º¸°íÇÏ¿© À¥¼­¹ö °³¹ßÀڵ鿡°Ô ¹®Á¦¸¦ ¾Ë¸®±æ + ¹Ù¶õ´Ù.

    + +

    core dump¸¦ ¸¸µé¸ç ¼­¹ö°¡ Á×´Â °æ¿ì¶ó¸é (°¡´ÉÇϸé) + backtrace(¿ªÁÖ; ¹®Á¦°¡ ½ÇÇàÆÄÀÏÀÇ Á¤È®È÷ ¾î¶² ÁöÁ¡¿¡¼­ + ¹ß»ýÇÏ¿´°í, ÇÁ·Î±×·¥ÀÌ ±× ÁöÁ¡±îÁö ¾î¶² °æ·Î·Î ½ÇÇàµÇ¾ú´ÂÁö¸¦ + ¾Ë·ÁÁÖ´Â Á¤º¸)¸¦ Æ÷ÇÔÇÏ±æ ¹Ù¶õ´Ù. ¿¹¸¦ µé¾î,

    + +

    + # cd ServerRoot
    + # dbx httpd core
    + (dbx) where +

    + +

    (ServerRoot, httpd, core + ÆÄÀÏÀÇ ½ÇÁ¦ À§Ä¡¸¦ ´ë½Å »ç¿ëÇ϶ó. dbx ´ë½Å + gdb¸¦ »ç¿ëÇØ¾ß ÇÒ ¼öµµ ÀÖ´Ù.)

    +
    +
    + + +

    µµ¿òÀ» ¾òÀ¸·Á¸é ´©±¸¿¡°Ô + ¿¬¶ôÇϳª?

    +

    40¸í °¡·®ÀÇ ÀÚ¹ßÀûÀ¸·Î Âü¿©ÇÑ °³¹ßÀÚ¸¸À¸·Î´Â ¼ö¹é¸¸ÀÇ + »ç¿ëÀÚ¿¡°Ô ¾ÆÆÄÄ¡¿¡ ´ëÇØ ÀÏÀÏÀÌ Áö¿øÇÒ ¼ö ¾ø´Ù. ¹«·á Áö¿øÀ» + ¾òÀ¸·Á¸é »ç¿ëÀÚ + °ø°£¿¡ Âü¿©ÇÏ±æ ±ÇÇÑ´Ù.

    + +

    ¾ÆÆÄÄ¡¿¡ ´ëÇÑ Á÷¾÷ÀûÀÎ À¯·á Áö¿øÀº ¿©·¯ + ȸ»ç¿¡¼­ Á¦°øÇÑ´Ù.

    + +
    top
    +
    +

    ¿À·ù¹®

    + + +

    Invalid argument: + core_output_filter: writing data to the network

    + +

    Ç÷¡ÆûÀÌ sendfile ½Ã½ºÅÛÈ£ÃâÀ» Áö¿øÇÑ´Ù¸é, + ¾ÆÆÄÄ¡´Â ÀÀ´äÀÇ ¼Óµµ¸¦ ºü¸£°ÔÇϱâÀ§ÇØ ÀÌ ½Ã½ºÅÛÈ£ÃâÀ» »ç¿ëÇÑ´Ù. + ºÒÇàÈ÷µµ ¾î¶² ½Ã½ºÅÛ¿¡¼­ ¾ÆÆÄÄ¡´Â ÄÄÆÄÀÏÇÒ¶§ + sendfileÀÌ Á¤»óÀûÀ¸·Î ÀÛµ¿ÇÏÁö ¾Ê´Âµ¥µµ Á¤»óÀûÀ¸·Î + ÀÛµ¿ÇÑ´Ù°í ¿ÀÆÇÇÑ´Ù. ÀÌ ¹®Á¦´Â ³×Æ®¿÷ ÆÄÀϽýºÅÛÀ̳ª ºñÇ¥ÁØ + ÆÄÀϽýºÅÛÀ» »ç¿ëÇÒ¶§ ÀÚÁÖ ¹ß»ýÇÑ´Ù.

    + +

    ÀÌ ¹®Á¦ÀÇ Áõ»óÀº ¿À·ù ·Î±×(error log)¿¡ À§ÀÇ ¹®±¸¸¦ + ±â·ÏÇϰųª Å©±â°¡ 0ÀÌ ¾Æ´Ñ ÆÄÀÏ¿¡ ´ëÇØ Å©±â°¡ 0ÀÎ ÀÀ´äÀ» + ÇÏ´Â °æ¿ìÀÌ´Ù. µ¿ÀûÀ¸·Î ³»¿ëÀ» »ý¼ºÇÒ¶§´Â + sendfileÀ» »ç¿ëÇÏÁö ¾Ê±â¶§¹®¿¡ ÀϹÝÀûÀ¸·Î Á¤ÀûÀÎ + ÆÄÀÏÀ» ¿äûÇÒ¶§¸¸ ¹®Á¦°¡ ¹ß»ýÇÑ´Ù.

    + +

    ¹®Á¦¸¦ ÇØ°áÇÏ·Á¸é ¼­¹ö°¡ sendfileÀ» »ç¿ëÇÏÁö + ¾Êµµ·Ï EnableSendfile + Áö½Ã¾î¸¦ »ç¿ëÇÑ´Ù. ¶Ç, ÀÌ¿Í À¯»çÇÑ ¹®Á¦¿¡ ´ëÇØ EnableMMAPÀ» Âü°íÇ϶ó.

    + + + +

    AcceptEx Failed

    + +

    win32¿¡¼­ AcceptEx ½Ã½ºÅÛÈ£Ãâ¿¡ ´ëÇÑ ¿À·ù¹®À» + ³ª¿À¸é, Win32DisableAcceptEx + Áö½Ã¾î¸¦ Âü°íÇ϶ó.

    + + + +

    Premature end of script + headers

    + +

    º¸Åë CGI ½ºÅ©¸³Æ®¿¡ ¹®Á¦°¡ ÀÖÀ¸¸é ºê¶ó¿ìÀú¿¡°Ô Internal + Server Error¸¦ º¸³»°í ¿À·ù·Î±×¿¡ ÀÌ ¹®±¸¸¦ ±â·ÏÇÑ´Ù. + ÀÌ·± ¹®Á¦¸¦ µð¹ö±ëÇÒ¶§ CGI ÅõÅ丮¾óÀÌ + µµ¿òÀÌ µÉ ¼ö ÀÖ´Ù.

    + + +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/faq/all_in_one.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/faq/all_in_one.html.tr.utf8 new file mode 100644 index 00000000..353b2614 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/faq/all_in_one.html.tr.utf8 @@ -0,0 +1,209 @@ + + + +Sıkça Sorulan Sorular - Apache HTTP Sunucusu + + + + + +
    <-
    +

    Sıkça Sorulan Sorular

    +
    +

    Mevcut Diller:  en  | + ko  | + tr 

    +
    + +

    Bu SSS’nin en son sürümünü daima <http://httpd.apache.org/docs/2.0/faq/> adresindeki + ana Apache sitesinde bulabilirsiniz.

    + +

    Apache 2.0 yeni olduğundan Sıkça Sorulan Soruların neler + olacağını henüz bilmiyoruz. Bu bölüm dolana kadar sorularınızın + yanıtlarını aramak için Apache 1.3 SSS’sini + incelemenizi öneriyoruz.

    +
    + +
    top
    +
    +

    Konular

    +
    Destek
    Sorunlarım olduğunda ne yapayım?
    +
    Hata Ä°letileri
    Bu hata iletileri ne anlama geliyor?
    +
    top
    +
    +

    Destek

    + + +

    “Neden ... yapamıyorum? Niçin ... çalışmıyor?” gibi + sorular için

    + + +

    Apache sunucu yazılımınızla ilgili sorunlar yaşıyorsanız şu + adımları izleyin:

    + +
    +
    Günlük kayıt dosyalarına bakın!
    +
    Apache sorunları saptamaya ve size yardımcı olmaya çalışır. Çoğu + durumda, günlük dosyalarına bir kaç ileti yazarak sunucu hataları için + size bazı ayrıntıları sağlayacaktır. Bu genellikle sorunun sizin + tarafınızdan teşhis edilmesi (dosya izinleri ve benzeri) ve düzeltilmesi + için yeterli olur. Hata kayıtlarının tutulduğu günlük dosyalarının + öntanımlı yeri /usr/local/apache2/logs/error_log olup + sizin sunucunuzdaki yeri için yapılandırma dosyalarınızdaki ErrorLog yönergesine bakabilirsiniz.
    + +
    SSS’ye + bakın!
    +
    Apache Sıkça Sorulan Sorular listesinin en son sürümünü daima + ana Apache sitesinde bulabilirsiniz.
    + +
    Apache hata ayıklama veritabanına bakın
    +
    Apache Grubuna bildirilen çoğu sorun hata ayıklama + veritabanına kaydedilir. Açık ya da kapalı, mevcut hata raporlarını + incelemeden ve sorununuz hakkında kullanıcı destek listelerine (aşağıya + bakınız) danışmadan lütfen yeni bir hata bildirimi + yapmayın. Zaten raporlanmış bir sorunsa bir “ben de” + veya “+1” raporu eklemeyin. Eğer özgün rapor henüz + kapatılmamışsa ara sıra son durumuna bakmanızı öneririz. Ayrıca, + raporu gönderenle de iletişime geçmeniz iyi olabilir, çünkü konu + hakkında henüz veritabanına geçmemiş bir eposta alışverişi olabilir.
    + +
    Bir kullanıcı destek listesine + sorun
    +

    Apache, bilgilerini gönüllü olarak paylaşan etkin bir kullanıcı + topluluğuna sahiptir. Bu topluluğa katılarak sorularınıza ve + sorunlarınıza genellikle en iyi ve en hızlı yanıtı alırsınız.

    + +

    Apache kullanıcıları + eposta listesi

    + +

    Kullanıcılara destek için Freenode IRC'nin + #httpd kanalı

    + +

    USENET haber öbekleri:

    + +
      +
    • comp.infosystems.www.servers.unix + [news] + [google] +
    • + +
    • comp.infosystems.www.servers.ms-windows + [news] + [google] +
    • + +
    • comp.infosystems.www.authoring.cgi + [news] + [google] +
    • +
    + +
    Bunlar da çözüm olmadıysa sorunu hata ayıklama veritabanına + bildirin
    +

    Eğer yukarıdaki adımlardan size uygun olanları izlemiş ve + bir çare bulamamışsanız lütfen bir hata ayıklama + bildiriminde bulunarak httpd geliştiricilerini sorun hakkında + bilgilendirin.

    + +

    Eğer sorununuz sunucunun çökmesine ve bir ‘core’ üretilmesine sebep + oluyorsa hatayı bildirirken lütfen (mümkünse) bir geriye doğru hata + izleme raporu ekleyin. Bir örnek:

    + +

    + # cd ServerRoot
    + # dbx httpd core
    + (dbx) where +

    + +

    (ServerRoot yerine kendi sunucu kök dizininizi ve + httpd ve core dosyalarının yerine de kendi + dosyalarınızı yazınız. Ayrıca, dbx yerine + gdb de kullanabilirsiniz.)

    +
    +
    + + +

    Destek için kime başvurayım?

    +

    Milyonlarca kullanıcı ve altmıştan az gönüllü geliştirici ile + Apache için kişisel destek sağlayamıyoruz. Ücretsiz destek için + yardımlaşma listelerine + katılmanızı öneriyoruz.

    + +

    Profesyonel ve ticari Apache desteği almak için bu tür destekleri + sunan şirketlere + başvurunuz.

    + +
    top
    +
    +

    Hata Ä°letileri

    + + +

    Invalid argument: + core_output_filter: writing data to the network

    + +

    Yanıtların gönderiminin hızlandırılmasının mümkün olduğu platformlarda + Apache sendfile sistem çağrısını kullanır. Ne yazık ki, + Apache’nin derleme sırasında varlığını tespit ettiği + sendfile bazı sistemlerde düzgün çalışmaz. Bu en çok ağ ve + diğer standartdışı dosya sistemleri kullanılırken ortaya çıkar.

    + +

    Hata kayıt dosyalarında yukarıdaki iletinin bulunması, sıfır boyutlu + olmayan dosyalar için sıfır boyutlu yanıtlar dönmesi bu sorunun + belirtileri arasında sayılabilir. Devingen içerik için normalde + sendfile kullanılmadığından sorun genellikle sadece durağan + dosyalarda ortaya çıkar.

    + +

    Sorunu ortadan kaldırmak için EnableSendfile yönergesini kullanarak sunucunun + bütün bölümlerinde sendfile kullanımını iptal etmek yeterli + olur. Ayrıca, benzer sorunlarda yardımı olabilen EnableMMAP yönergesine de bakınız.

    + + + +

    AcceptEx Failed

    + +

    Eğer win32’de AcceptEx sistem çağrısı ile ilgili hata + iletileri alıyorsanız Win32DisableAcceptEx yönergesine + bakınız.

    + + + +

    Premature end of script + headers

    + +

    CGI betiklerindeki çoğu sorun tarayıcıya bir Internal Server + Error (Dahili Sunucu Hatası) bildirimiyle ve hata kayıt dosyasına + bu iletinin yazılmasıyla sonuçlanır. Bu tür sorunlarda hata ayıklamaya + yardımcı olmak için bir CGI + öğretici mevcuttur.

    + + +
    +
    +

    Mevcut Diller:  en  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/faq/error.html b/rubbos/app/httpd-2.0.64/docs/manual/faq/error.html new file mode 100644 index 00000000..10b45850 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/faq/error.html @@ -0,0 +1,13 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: error.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: error.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: error.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/faq/error.html.en b/rubbos/app/httpd-2.0.64/docs/manual/faq/error.html.en new file mode 100644 index 00000000..e2086ca9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/faq/error.html.en @@ -0,0 +1,85 @@ + + + +Error Messages - Frequently Asked Questions - Apache HTTP Server + + + + + +
    <-
    +

    Error Messages - Frequently Asked Questions

    +
    +

    Available Languages:  en  | + ko  | + tr 

    +
    +
    +
    top
    +
    +

    Error Messages

    + + +

    Invalid argument: + core_output_filter: writing data to the network

    + +

    Apache uses the sendfile syscall on platforms + where it is available in order to speed sending of responses. + Unfortunately, on some systems, Apache will detect the presence of + sendfile at compile-time, even when it does not work + properly. This happens most frequently when using network or + other non-standard file-system.

    + +

    Symptoms of this problem include the above message in the error + log and zero-length responses to non-zero-sized files. The + problem generally occurs only for static files, since dynamic + content usually does not make use of sendfile.

    + +

    To fix this problem, simply use the EnableSendfile directive to disable + sendfile for all or part of your server. Also see + the EnableMMAP, which can + help with similar problems.

    + + + +

    AcceptEx Failed

    + +

    If you get error messages related to the AcceptEx syscall + on win32, see the Win32DisableAcceptEx + directive.

    + + + +

    Premature end of script + headers

    + +

    Most problems with CGI scripts result in this message written in the + error log together with an Internal Server Error delivered + to the browser. A guide to helping debug this type of problem is + available in the CGI + tutorial.

    + + +
    +
    +

    Available Languages:  en  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/faq/error.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/faq/error.html.ko.euc-kr new file mode 100644 index 00000000..b4c390db --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/faq/error.html.ko.euc-kr @@ -0,0 +1,84 @@ + + + +¿À·ù¹® - ÀÚÁÖ ¹°¾îº¸´Â Áú¹® (FAQ) - Apache HTTP Server + + + + + +
    <-
    +

    ¿À·ù¹® - ÀÚÁÖ ¹°¾îº¸´Â Áú¹® (FAQ)

    +
    +

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

    +
    +
    +
    top
    +
    +

    ¿À·ù¹®

    + + +

    Invalid argument: + core_output_filter: writing data to the network

    + +

    Ç÷¡ÆûÀÌ sendfile ½Ã½ºÅÛÈ£ÃâÀ» Áö¿øÇÑ´Ù¸é, + ¾ÆÆÄÄ¡´Â ÀÀ´äÀÇ ¼Óµµ¸¦ ºü¸£°ÔÇϱâÀ§ÇØ ÀÌ ½Ã½ºÅÛÈ£ÃâÀ» »ç¿ëÇÑ´Ù. + ºÒÇàÈ÷µµ ¾î¶² ½Ã½ºÅÛ¿¡¼­ ¾ÆÆÄÄ¡´Â ÄÄÆÄÀÏÇÒ¶§ + sendfileÀÌ Á¤»óÀûÀ¸·Î ÀÛµ¿ÇÏÁö ¾Ê´Âµ¥µµ Á¤»óÀûÀ¸·Î + ÀÛµ¿ÇÑ´Ù°í ¿ÀÆÇÇÑ´Ù. ÀÌ ¹®Á¦´Â ³×Æ®¿÷ ÆÄÀϽýºÅÛÀ̳ª ºñÇ¥ÁØ + ÆÄÀϽýºÅÛÀ» »ç¿ëÇÒ¶§ ÀÚÁÖ ¹ß»ýÇÑ´Ù.

    + +

    ÀÌ ¹®Á¦ÀÇ Áõ»óÀº ¿À·ù ·Î±×(error log)¿¡ À§ÀÇ ¹®±¸¸¦ + ±â·ÏÇϰųª Å©±â°¡ 0ÀÌ ¾Æ´Ñ ÆÄÀÏ¿¡ ´ëÇØ Å©±â°¡ 0ÀÎ ÀÀ´äÀ» + ÇÏ´Â °æ¿ìÀÌ´Ù. µ¿ÀûÀ¸·Î ³»¿ëÀ» »ý¼ºÇÒ¶§´Â + sendfileÀ» »ç¿ëÇÏÁö ¾Ê±â¶§¹®¿¡ ÀϹÝÀûÀ¸·Î Á¤ÀûÀÎ + ÆÄÀÏÀ» ¿äûÇÒ¶§¸¸ ¹®Á¦°¡ ¹ß»ýÇÑ´Ù.

    + +

    ¹®Á¦¸¦ ÇØ°áÇÏ·Á¸é ¼­¹ö°¡ sendfileÀ» »ç¿ëÇÏÁö + ¾Êµµ·Ï EnableSendfile + Áö½Ã¾î¸¦ »ç¿ëÇÑ´Ù. ¶Ç, ÀÌ¿Í À¯»çÇÑ ¹®Á¦¿¡ ´ëÇØ EnableMMAPÀ» Âü°íÇ϶ó.

    + + + +

    AcceptEx Failed

    + +

    win32¿¡¼­ AcceptEx ½Ã½ºÅÛÈ£Ãâ¿¡ ´ëÇÑ ¿À·ù¹®À» + ³ª¿À¸é, Win32DisableAcceptEx + Áö½Ã¾î¸¦ Âü°íÇ϶ó.

    + + + +

    Premature end of script + headers

    + +

    º¸Åë CGI ½ºÅ©¸³Æ®¿¡ ¹®Á¦°¡ ÀÖÀ¸¸é ºê¶ó¿ìÀú¿¡°Ô Internal + Server Error¸¦ º¸³»°í ¿À·ù·Î±×¿¡ ÀÌ ¹®±¸¸¦ ±â·ÏÇÑ´Ù. + ÀÌ·± ¹®Á¦¸¦ µð¹ö±ëÇÒ¶§ CGI ÅõÅ丮¾óÀÌ + µµ¿òÀÌ µÉ ¼ö ÀÖ´Ù.

    + + +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/faq/error.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/faq/error.html.tr.utf8 new file mode 100644 index 00000000..b34d0418 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/faq/error.html.tr.utf8 @@ -0,0 +1,84 @@ + + + +Hata İletileri - Sıkça Sorulan Sorular - Apache HTTP Sunucusu + + + + + +
    <-
    +

    Hata İletileri - Sıkça Sorulan Sorular

    +
    +

    Mevcut Diller:  en  | + ko  | + tr 

    +
    +
    +
    top
    +
    +

    Hata Ä°letileri

    + + +

    Invalid argument: + core_output_filter: writing data to the network

    + +

    Yanıtların gönderiminin hızlandırılmasının mümkün olduğu platformlarda + Apache sendfile sistem çağrısını kullanır. Ne yazık ki, + Apache’nin derleme sırasında varlığını tespit ettiği + sendfile bazı sistemlerde düzgün çalışmaz. Bu en çok ağ ve + diğer standartdışı dosya sistemleri kullanılırken ortaya çıkar.

    + +

    Hata kayıt dosyalarında yukarıdaki iletinin bulunması, sıfır boyutlu + olmayan dosyalar için sıfır boyutlu yanıtlar dönmesi bu sorunun + belirtileri arasında sayılabilir. Devingen içerik için normalde + sendfile kullanılmadığından sorun genellikle sadece durağan + dosyalarda ortaya çıkar.

    + +

    Sorunu ortadan kaldırmak için EnableSendfile yönergesini kullanarak sunucunun + bütün bölümlerinde sendfile kullanımını iptal etmek yeterli + olur. Ayrıca, benzer sorunlarda yardımı olabilen EnableMMAP yönergesine de bakınız.

    + + + +

    AcceptEx Failed

    + +

    Eğer win32’de AcceptEx sistem çağrısı ile ilgili hata + iletileri alıyorsanız Win32DisableAcceptEx yönergesine + bakınız.

    + + + +

    Premature end of script + headers

    + +

    CGI betiklerindeki çoğu sorun tarayıcıya bir Internal Server + Error (Dahili Sunucu Hatası) bildirimiyle ve hata kayıt dosyasına + bu iletinin yazılmasıyla sonuçlanır. Bu tür sorunlarda hata ayıklamaya + yardımcı olmak için bir CGI + öğretici mevcuttur.

    + + +
    +
    +

    Mevcut Diller:  en  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/faq/index.html b/rubbos/app/httpd-2.0.64/docs/manual/faq/index.html new file mode 100644 index 00000000..0f2f79ca --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/faq/index.html @@ -0,0 +1,13 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: index.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: index.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: index.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/faq/index.html.en b/rubbos/app/httpd-2.0.64/docs/manual/faq/index.html.en new file mode 100644 index 00000000..e0335eaa --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/faq/index.html.en @@ -0,0 +1,49 @@ + + + +Frequently Asked Questions - Apache HTTP Server + + + + + +
    <-
    +

    Frequently Asked Questions

    +
    +

    Available Languages:  en  | + ko  | + tr 

    +
    + +

    The latest version of this FAQ is always available from the + main Apache web site, at <http://httpd.apache.org/docs/2.0/faq/>. In addition, you can view + this FAQ all in one page for easy searching + and printing.

    + +

    Since Apache 2.0 is quite new, we don't yet know what the + Frequently Asked Questions will be. While this section fills up, + you should also consult the Apache 1.3 FAQ to see + if your question is answered there.

    +
    +
    top
    +
    +

    Topics

    +
    Support
    What do I do when I have problems?
    +
    Error Messages
    What does this error message mean?
    +
    +
    +

    Available Languages:  en  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/faq/index.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/faq/index.html.ko.euc-kr new file mode 100644 index 00000000..7d0c8a55 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/faq/index.html.ko.euc-kr @@ -0,0 +1,47 @@ + + + +ÀÚÁÖ ¹°¾îº¸´Â Áú¹® (FAQ) - Apache HTTP Server + + + + + +
    <-
    +

    ÀÚÁÖ ¹°¾îº¸´Â Áú¹® (FAQ)

    +
    +

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

    +
    + +

    FAQ ÃÖ½ÅÆÇÀº ¾ÆÆÄÄ¡ À¥»çÀÌÆ® <http://httpd.apache.org/docs/2.0/faq/>¿¡¼­ º¼ ¼ö + ÀÖ´Ù. ¶Ç, °Ë»öÇÏ°í Ãâ·ÂÇϱâ ÆíÇÏ°Ô FAQ¸¦ ÇÑ ÆäÀÌÁö·Î º¼ ¼ö ÀÖ´Ù.

    + +

    ¾ÆÆÄÄ¡ 2.0ÀÌ ³ª¿ÂÁö ¾ó¸¶ ¾ÈµÇ¼­ ¿ì¸®´Â ¾ÆÁ÷ ÀÚÁÖ + ¹°¾îº¸´Â Áú¹® (FAQ)ÀÌ ¹«¾ùÀÎÁö ¸ð¸¥´Ù. ³»¿ëÀÌ Ã¤¿öÁú + ¶§±îÁö ¿©±â¿¡ ÇØ´äÀÌ ¾ø´Ù¸é ¾ÆÆÄÄ¡ + 1.3 FAQµµ Âü°íÇ϶ó.

    +
    +
    top
    +
    +

    ÁÖÁ¦

    +
    Áö¿ø
    ¹®Á¦°¡ »ý±â¸é ¾î¶»°Ô ÇØ°áÇϳª?
    +
    ¿À·ù¹®
    ÀÌ ¿À·ù¹®ÀÌ ¹«½¼ ¶æÀΰ¡?
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/faq/index.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/faq/index.html.tr.utf8 new file mode 100644 index 00000000..c8f1ae80 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/faq/index.html.tr.utf8 @@ -0,0 +1,49 @@ + + + +Sıkça Sorulan Sorular - Apache HTTP Sunucusu + + + + + +
    <-
    +

    Sıkça Sorulan Sorular

    +
    +

    Mevcut Diller:  en  | + ko  | + tr 

    +
    + +

    Bu SSS’nin en son sürümünü daima <http://httpd.apache.org/docs/2.0/faq/> adresindeki + ana Apache sitesinde bulabilirsiniz. Ayrıca, bu SSS’yi kolayca araştırmak + ve yazdırmak için hepsi bir arada sayfasına + bakabilirsiniz.

    + +

    Apache 2.0 yeni olduğundan Sıkça Sorulan Soruların neler + olacağını henüz bilmiyoruz. Bu bölüm dolana kadar sorularınızın yanıtlarını + aramak için Apache 1.3 SSS’sini + incelemenizi öneriyoruz.

    +
    +
    top
    +
    +

    Konular

    +
    Destek
    Sorunlarım olduğunda ne yapayım?
    +
    Hata Ä°letileri
    Bu hata iletileri ne anlama geliyor?
    +
    +
    +

    Mevcut Diller:  en  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/faq/support.html b/rubbos/app/httpd-2.0.64/docs/manual/faq/support.html new file mode 100644 index 00000000..11873803 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/faq/support.html @@ -0,0 +1,13 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: support.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: support.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: support.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/faq/support.html.en b/rubbos/app/httpd-2.0.64/docs/manual/faq/support.html.en new file mode 100644 index 00000000..861781fe --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/faq/support.html.en @@ -0,0 +1,138 @@ + + + +Support - Frequently Asked Questions - Apache HTTP Server + + + + + +
    <-
    +

    Support - Frequently Asked Questions

    +
    +

    Available Languages:  en  | + ko  | + tr 

    +
    +
    +
    top
    +
    +

    Support

    + + +

    "Why can't I ...? Why won't ... work?" What to do in case of + problems

    + + +

    If you are having trouble with your Apache server software, you should + take the following steps:

    + +
    +
    Check the errorlog!
    +
    Apache tries to be helpful when it encounters a problem. In many + cases, it will provide some details by writing one or messages to the + server error log. Sometimes this is enough for you to diagnose & fix + the problem yourself (such as file permissions or the like). The default + location of the error log is + /usr/local/apache2/logs/error_log, but see the ErrorLog directive in your config files for the + location on your server.
    + +
    Check the FAQ!
    +
    The latest version of the Apache Frequently-Asked Questions list can + always be found at the main Apache web site.
    + +
    Check the Apache bug database
    +
    Most problems that get reported to The Apache Group are recorded in + the bug database. + Please check the existing reports, open + and closed, before adding one. If you find that your + issue has already been reported, please don't add a "me, too" + report. If the original report isn't closed yet, we suggest that you + check it periodically. You might also consider contacting the original + submitter, because there may be an email exchange going on about the + issue that isn't getting recorded in the database.
    + +
    Ask in a user support forum
    +

    Apache has an active community of users who are willing to share + their knowledge. Participating in this community is usually the best and + fastest way to get answers to your questions and problems.

    + +

    Users + mailing list

    + +

    #httpd on + Freenode IRC is available for + user support issues.

    + +

    USENET newsgroups:

    + +
      +
    • comp.infosystems.www.servers.unix + [news] + [google] +
    • + +
    • comp.infosystems.www.servers.ms-windows + [news] + [google] +
    • + +
    • comp.infosystems.www.authoring.cgi + [news] + [google] +
    • +
    + +
    If all else fails, report the problem in the bug database
    +

    If you've gone through those steps above that are appropriate and + have obtained no relief, then please do let the httpd developers + know about the problem by logging a bug + report.

    + +

    If your problem involves the server crashing and generating a core + dump, please include a backtrace (if possible). As an example,

    + +

    + # cd ServerRoot
    + # dbx httpd core
    + (dbx) where +

    + +

    (Substitute the appropriate locations for your ServerRoot + and your httpd and core files. You may have to use + gdb instead of dbx.)

    +
    +
    + + +

    Whom do I contact for support?

    +

    With several million users and fewer than forty volunteer developers, + we cannot provide personal support for Apache. For free support, we + suggest participating in a user forum.

    + +

    Professional, commercial support for Apache is available from + a number of + companies.

    + +
    +
    +

    Available Languages:  en  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/faq/support.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/faq/support.html.ko.euc-kr new file mode 100644 index 00000000..09c58f8c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/faq/support.html.ko.euc-kr @@ -0,0 +1,142 @@ + + + +Áö¿ø - ÀÚÁÖ ¹°¾îº¸´Â Áú¹® (FAQ) - Apache HTTP Server + + + + + +
    <-
    +

    Áö¿ø - ÀÚÁÖ ¹°¾îº¸´Â Áú¹® (FAQ)

    +
    +

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

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

    Áö¿ø

    + + +

    "¿Ö ... ¾ÈµÇ³ª? ¿Ö ... µ¿ÀÛÇÏÁö ¾Ê´Â°¡?" ¹®Á¦°¡ »ý±â¸é + ÇÒÀÏ

    + + +

    ¾ÆÆÄÄ¡ ¼­¹ö ¼ÒÇÁÆ®¿þ¾î¿¡ ¹®Á¦°¡ »ý±â¸é ´ÙÀ½°ú °°Àº + ´Ü°è¸¦ µû¸¥´Ù:

    + +
    +
    ¿À·ù ·Î±×(errorlog)¸¦ È®ÀÎÇ϶ó!
    +
    ¾ÆÆÄÄ¡ ¼­¹ö´Â ¹®Á¦°¡ »ý±â¸é µµ¿òÀ» ÁÖ·Á°í ³ë·ÂÇÑ´Ù. + ¸¹Àº °æ¿ì ¼­¹ö ¿À·ù ·Î±×¿¡ ÀÚ¼¼ÇÑ ³»¿ëÀ» ±â·ÏÇÑ´Ù. + À̰͸¸À¸·Îµµ Á÷Á¢ (ÆÄÀϱÇÇÑ µî) ¹®Á¦¸¦ ¹ß°ßÇÏ°í °íÄ¥ ¼ö + ÀÖ´Â °æ¿ì°¡ ¸¹´Ù. ¿À·ù ·Î±×ÀÇ ±âº» À§Ä¡´Â + /usr/local/apache2/logs/error_logÀÌÁö¸¸, + Á¤È®ÇÑ À§Ä¡´Â ¼³Á¤ÆÄÀÏÀÇ ErrorLog Áö½Ã¾î¸¦ Âü°íÇ϶ó.
    + +
    FAQ¸¦ + È®ÀÎÇ϶ó!
    +
    ¾ÆÆÄÄ¡ À¥»çÀÌÆ®¿¡¼­ Ç×»ó ¾ÆÆÄÄ¡ FAQ ÃÖ½ÅÆÇÀ» º¼ ¼ö + ÀÖ´Ù.
    + +
    ¾ÆÆÄÄ¡ ¹ö±× µ¥ÀÌÅͺ£À̽º¸¦ È®ÀÎÇ϶ó
    +
    ¾ÆÆÄÄ¡±×·ì(The Apache Group)¿¡ º¸°íµÈ ´ëºÎºÐÀÇ ¹®Á¦´Â + ¹ö±× + µ¥ÀÌÅͺ£À̽º¿¡ ±â·ÏµÈ´Ù. »õ·Î ¹ö±×¸¦ Ãß°¡Çϱâ Àü¿¡, + ÀÌ¹Ì ¾Ë·ÁÁ³°Å³ª(open) ÇØ°áµÈ(closed) ¹ö±×°¡ ÀÖ´ÂÁö È®ÀÎÇϱæ + ¹Ù¶õ´Ù. ÀÌ¹Ì ¹®Á¦°¡ º¸°íµÇ¾ú´Ù¸é "³ªµµ + ÀÌ·± ¹®Á¦°¡ ÀÖ´Ù°í" º¸°íÇÏÁö ¾Ê±æ ¹Ù¶õ´Ù. ¾ÆÁ÷ + ÇØ°áµÇÁö ¾Ê¾Ò´Ù¸é ÁÖ±âÀûÀ¸·Î »óȲÀ» È®ÀÎÇÏ±æ ¹Ù¶õ´Ù. ¶Ç, + µ¥ÀÌÅͺ£À̽º¿¡ ±â·ÏµÇÁö ¾Ê°í À̸ÞÀÏ ±³È¯À¸·Î ÁøÇàµÈ »çÇ×ÀÌ + ÀÖÀ» ¼ö ÀÖÀ¸´Ï óÀ½ ¹®Á¦¸¦ º¸°íÇÑ »ç¶÷¿¡°Ô ¿¬¶ôÇغ¼ ¼öµµ + ÀÖ´Ù.
    + +
    »ç¿ëÀÚ Áö¿ø °ø°£¿¡ + ¹®ÀÇÇÑ´Ù
    +

    ¾ÆÆÄÄ¡¿¡ ´ëÇÑ Áö½ÄÀ» °øÀ¯ÇÏ±æ ¿øÇÏ´Â È°¹ßÇÑ »ç¿ëÀÚ + °øµ¿Ã¼µéÀÌ ÀÖ´Ù. ÀϹÝÀûÀ¸·Î ÀÌ·± °øµ¿Ã¼¿¡ Âü¿©ÇÏ´Â °ÍÀÌ + ¹®Á¦ÀÇ ´äÀ» ¾ò´Â °¡Àå ÁÁ°í ºü¸¥ ¹æ¹ýÀÌ´Ù.

    + +

    »ç¿ëÀÚ + ¸ÞÀϸµ¸®½ºÆ®

    + +

    USENET ´º½º±×·ì:

    + +
      +
    • comp.infosystems.www.servers.unix + [news] + [google] +
    • + +
    • comp.infosystems.www.servers.ms-windows + [news] + [google] +
    • + +
    • comp.infosystems.www.authoring.cgi + [news] + [google] +
    • +
    + +
    À§ÀÇ ¹æ¹ýÀÌ ¸ðµÎ ½ÇÆÐÇÏ¸é ¹ö±× µ¥ÀÌÅͺ£À̽º¿¡ ¹®Á¦¸¦ + º¸°íÇÑ´Ù
    +

    À§ÀÇ ´Ü°è¸¦ ¸ðµÎ ½ÃµµÇÏ°íµµ ÇØ°áÃ¥ÀÌ ¾ø´Ù¸é, ¹ö±×¸¦ + º¸°íÇÏ¿© À¥¼­¹ö °³¹ßÀڵ鿡°Ô ¹®Á¦¸¦ ¾Ë¸®±æ + ¹Ù¶õ´Ù.

    + +

    core dump¸¦ ¸¸µé¸ç ¼­¹ö°¡ Á×´Â °æ¿ì¶ó¸é (°¡´ÉÇϸé) + backtrace(¿ªÁÖ; ¹®Á¦°¡ ½ÇÇàÆÄÀÏÀÇ Á¤È®È÷ ¾î¶² ÁöÁ¡¿¡¼­ + ¹ß»ýÇÏ¿´°í, ÇÁ·Î±×·¥ÀÌ ±× ÁöÁ¡±îÁö ¾î¶² °æ·Î·Î ½ÇÇàµÇ¾ú´ÂÁö¸¦ + ¾Ë·ÁÁÖ´Â Á¤º¸)¸¦ Æ÷ÇÔÇÏ±æ ¹Ù¶õ´Ù. ¿¹¸¦ µé¾î,

    + +

    + # cd ServerRoot
    + # dbx httpd core
    + (dbx) where +

    + +

    (ServerRoot, httpd, core + ÆÄÀÏÀÇ ½ÇÁ¦ À§Ä¡¸¦ ´ë½Å »ç¿ëÇ϶ó. dbx ´ë½Å + gdb¸¦ »ç¿ëÇØ¾ß ÇÒ ¼öµµ ÀÖ´Ù.)

    +
    +
    + + +

    µµ¿òÀ» ¾òÀ¸·Á¸é ´©±¸¿¡°Ô + ¿¬¶ôÇϳª?

    +

    40¸í °¡·®ÀÇ ÀÚ¹ßÀûÀ¸·Î Âü¿©ÇÑ °³¹ßÀÚ¸¸À¸·Î´Â ¼ö¹é¸¸ÀÇ + »ç¿ëÀÚ¿¡°Ô ¾ÆÆÄÄ¡¿¡ ´ëÇØ ÀÏÀÏÀÌ Áö¿øÇÒ ¼ö ¾ø´Ù. ¹«·á Áö¿øÀ» + ¾òÀ¸·Á¸é »ç¿ëÀÚ + °ø°£¿¡ Âü¿©ÇÏ±æ ±ÇÇÑ´Ù.

    + +

    ¾ÆÆÄÄ¡¿¡ ´ëÇÑ Á÷¾÷ÀûÀÎ À¯·á Áö¿øÀº ¿©·¯ + ȸ»ç¿¡¼­ Á¦°øÇÑ´Ù.

    + +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/faq/support.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/faq/support.html.tr.utf8 new file mode 100644 index 00000000..fb4e7f52 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/faq/support.html.tr.utf8 @@ -0,0 +1,142 @@ + + + +Destek - Sıkça Sorulan Sorular - Apache HTTP Sunucusu + + + + + +
    <-
    +

    Destek - Sıkça Sorulan Sorular

    +
    +

    Mevcut Diller:  en  | + ko  | + tr 

    +
    +
    +
    top
    +
    +

    Destek

    + + +

    “Neden ... yapamıyorum? Niçin ... çalışmıyor?” gibi + sorular için

    + + +

    Apache sunucu yazılımınızla ilgili sorunlar yaşıyorsanız şu + adımları izleyin:

    + +
    +
    Günlük kayıt dosyalarına bakın!
    +
    Apache sorunları saptamaya ve size yardımcı olmaya çalışır. Çoğu + durumda, günlük dosyalarına bir kaç ileti yazarak sunucu hataları için + size bazı ayrıntıları sağlayacaktır. Bu genellikle sorunun sizin + tarafınızdan teşhis edilmesi (dosya izinleri ve benzeri) ve düzeltilmesi + için yeterli olur. Hata kayıtlarının tutulduğu günlük dosyalarının + öntanımlı yeri /usr/local/apache2/logs/error_log olup + sizin sunucunuzdaki yeri için yapılandırma dosyalarınızdaki ErrorLog yönergesine bakabilirsiniz.
    + +
    SSS’ye + bakın!
    +
    Apache Sıkça Sorulan Sorular listesinin en son sürümünü daima + ana Apache sitesinde bulabilirsiniz.
    + +
    Apache hata ayıklama veritabanına bakın
    +
    Apache Grubuna bildirilen çoğu sorun hata ayıklama + veritabanına kaydedilir. Açık ya da kapalı, mevcut hata raporlarını + incelemeden ve sorununuz hakkında kullanıcı destek listelerine (aşağıya + bakınız) danışmadan lütfen yeni bir hata bildirimi + yapmayın. Zaten raporlanmış bir sorunsa bir “ben de” + veya “+1” raporu eklemeyin. Eğer özgün rapor henüz + kapatılmamışsa ara sıra son durumuna bakmanızı öneririz. Ayrıca, + raporu gönderenle de iletişime geçmeniz iyi olabilir, çünkü konu + hakkında henüz veritabanına geçmemiş bir eposta alışverişi olabilir.
    + +
    Bir kullanıcı destek listesine + sorun
    +

    Apache, bilgilerini gönüllü olarak paylaşan etkin bir kullanıcı + topluluğuna sahiptir. Bu topluluğa katılarak sorularınıza ve + sorunlarınıza genellikle en iyi ve en hızlı yanıtı alırsınız.

    + +

    Apache kullanıcıları + eposta listesi

    + +

    Kullanıcılara destek için Freenode IRC'nin + #httpd kanalı

    + +

    USENET haber öbekleri:

    + +
      +
    • comp.infosystems.www.servers.unix + [news] + [google] +
    • + +
    • comp.infosystems.www.servers.ms-windows + [news] + [google] +
    • + +
    • comp.infosystems.www.authoring.cgi + [news] + [google] +
    • +
    + +
    Bunlar da çözüm olmadıysa sorunu hata ayıklama veritabanına + bildirin
    +

    Eğer yukarıdaki adımlardan size uygun olanları izlemiş ve + bir çare bulamamışsanız lütfen bir hata ayıklama + bildiriminde bulunarak httpd geliştiricilerini sorun hakkında + bilgilendirin.

    + +

    Eğer sorununuz sunucunun çökmesine ve bir ‘core’ üretilmesine sebep + oluyorsa hatayı bildirirken lütfen (mümkünse) bir geriye doğru hata + izleme raporu ekleyin. Bir örnek:

    + +

    + # cd ServerRoot
    + # dbx httpd core
    + (dbx) where +

    + +

    (ServerRoot yerine kendi sunucu kök dizininizi ve + httpd ve core dosyalarının yerine de kendi + dosyalarınızı yazınız. Ayrıca, dbx yerine + gdb de kullanabilirsiniz.)

    +
    +
    + + +

    Destek için kime başvurayım?

    +

    Milyonlarca kullanıcı ve altmıştan az gönüllü geliştirici ile + Apache için kişisel destek sağlayamıyoruz. Ücretsiz destek için + yardımlaşma listelerine + katılmanızı öneriyoruz.

    + +

    Profesyonel ve ticari Apache desteği almak için bu tür destekleri + sunan şirketlere + başvurunuz.

    + +
    +
    +

    Mevcut Diller:  en  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/filter.html b/rubbos/app/httpd-2.0.64/docs/manual/filter.html new file mode 100644 index 00000000..9dcc13f2 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/filter.html @@ -0,0 +1,29 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: filter.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: filter.html.es +Content-Language: es +Content-type: text/html; charset=ISO-8859-1 + +URI: filter.html.fr +Content-Language: fr +Content-type: text/html; charset=ISO-8859-1 + +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.ru.koi8-r +Content-Language: ru +Content-type: text/html; charset=KOI8-R + +URI: filter.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/filter.html.en b/rubbos/app/httpd-2.0.64/docs/manual/filter.html.en new file mode 100644 index 00000000..2cc7f2cc --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/filter.html.en @@ -0,0 +1,84 @@ + + + +Filters - Apache HTTP Server + + + + + +
    <-
    +

    Filters

    +
    +

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

    +
    + +

    This document describes the use of filters in Apache.

    +
    +
    top
    +
    +

    Filters

    + + + +

    A filter is a process that is applied to data that + is sent or received by the server. Data sent by clients to the + server is processed by input filters while data sent + by the server to the client is processed by output + filters. Multiple filters can be applied to the data, and + the order of the filters can be explicitly specified.

    + +

    Filters are used internally by Apache to perform functions such + as chunking and byte-range request handling. In addition, modules + can provide filters that are selectable using run-time + configuration directives. The set of filters that apply to data + can be manipulated with the + SetInputFilter, + SetOutputFilter, + AddInputFilter, + AddOutputFilter, + RemoveInputFilter, and + RemoveOutputFilter + directives.

    + +

    The following user-selectable filters are currently provided + with the Apache HTTP Server distribution.

    + +
    +
    INCLUDES
    +
    Server-Side Includes processing by mod_include
    +
    DEFLATE
    +
    Compress output before sending it to the client using + mod_deflate +
    +
    + +

    In addition, the module mod_ext_filter allows + for external programs to be defined as filters.

    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/filter.html.es b/rubbos/app/httpd-2.0.64/docs/manual/filter.html.es new file mode 100644 index 00000000..948e12c1 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/filter.html.es @@ -0,0 +1,81 @@ + + + +Filtros - Servidor HTTP Apache + + + + + +
    <-
    +

    Filtros

    +
    +

    Idiomas disponibles:  en  | + es  | + fr  | + ja  | + ko  | + ru  | + tr 

    +
    + +

    Este documento describe cómo usar filtros en Apache.

    +
    +
    top
    +
    +

    Filtros

    + + + +

    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.

    + +

    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. El conjunto de filtros que se aplica a los + datos puede manipularse con las directivas SetInputFilter, SetOutputFilter, AddInputFilter, AddOutputFilter, RemoveInputFilter, y RemoveOutputFilter.

    + +

    Actualmente, vienen con la distribución de Apache los + siguientes filtros seleccionables por el usuario.

    + +
    +
    INCLUDES
    +
    Server-Side Includes procesado por + mod_include
    +
    DEFLATE
    +
    Comprime los datos de salida antes de enviarlos al cliente + usando el módulo + mod_deflate +
    +
    + +

    Además, el módulo mod_ext_filter + permite definir programas externos como filtros.

    +
    +
    +

    Idiomas disponibles:  en  | + es  | + fr  | + ja  | + ko  | + ru  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/filter.html.fr b/rubbos/app/httpd-2.0.64/docs/manual/filter.html.fr new file mode 100644 index 00000000..e9e94fa1 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/filter.html.fr @@ -0,0 +1,89 @@ + + + +Filtres - Serveur Apache HTTP + + + + + +
    <-
    +

    Filtres

    +
    +

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

    +
    + +

    Ce document explique le fonctionnement des filtres avec Apache.

    +
    +
    top
    +
    +

    Filtres

    + + + +

    On appelle filtre un processus qui s'applique aux + données reçues ou envoyées par le serveur. Les filtres en + entrée (input filters) servent à filtrer les données envoyées + par les clients vers le serveur, tandis que les filtres en sortie + (output filters) traitent les données envoyées par le + serveur vers un client. Il est possible d'appliquer plusieurs + filtres sur un flux de données, et l'ordre de ces filtres est + configurable.

    + +

    Apache utilise des filtres en interne pour gérer les « grosses » + requêtes ou les requêtes partielles (NdT sur "byte-range" : + requêtes portant seulement sur une partie d'un fichier, partie + spécifiée par un pointeur de départ, et un pointeur de fin). + Certains modules permettent en plus d'utiliser des filtres en + utilisant des directives de configuration. Les filtres sont utilisables + au moyen des directives + SetInputFilter, + SetOutputFilter, + AddInputFilter, + AddOutputFilter, + RemoveInputFilter, et + RemoveOutputFilter + .

    + +

    Les filtres listés ci-après sont fournis dans le paquetage Apache et + sont utilisables par tout administrateur.

    + +
    +
    INCLUDES
    +
    Gestion des "Server-Side Includes" grâce au module + mod_include
    +
    DEFLATE
    +
    Compression des données avant leur envoi au client (filtre en + sortie) au moyen de mod_deflate +
    +
    + +

    Le module mod_ext_filter permet également + d'utiliser des programmes externes à Apache en tant que filtres.

    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/filter.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/filter.html.ja.utf8 new file mode 100644 index 00000000..db92c310 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/filter.html.ja.utf8 @@ -0,0 +1,84 @@ + + + +フィルタ - Apache HTTP サーバ + + + + + +
    <-
    +

    フィルタ

    +
    +

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

    +
    + +

    Apache でのフィルタの使い方について記述しています。

    +
    +
    top
    +
    +

    フィルタ

    + + + +

    フィルタ とは、サーバが送受信したデータに + 適用される処理プロセスのことをいいます。クライアントからサーバに + 送られたデータは 入力フィルタ によって、サーバから + クライアントに送られるデータは出力フィルタによって + 処理されます。複数のフィルタを適用することができ、 + その順番を厳密に指定することもできます。

    + +

    Apache 内部では、チャンク (データのぶつ切り) を行ったり、 + バイト範囲の指定されたリクエストを扱ったりといった機能を + 行う際に、フィルタが使われています。それに加えて、 + 実行時の設定ディレクティブで選択が可能なフィルタを + モジュールが提供できます。 + データに適応されるフィルタのセットは、 + SetInputFilter, + SetOutputFilter, + AddInputFilter, + AddOutputFilter, + RemoveInputFilter, + RemoveOutputFilter + ディレクティブで制御できます。

    + +

    現行の Apache HTTP サーバの配布では、 + 次のユーザ選択可能なフィルタが提供されています。

    + +
    +
    INCLUDES
    +
    mod_include で Server-Side Include をします。
    +
    DEFLATE
    +
    mod_deflate + を使って、クライアントに送信する前に出力を圧縮します。
    +
    + +

    また、mod_ext_filter モジュールで + 外部プログラムをフィルタとして指定することができます。

    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/filter.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/filter.html.ko.euc-kr new file mode 100644 index 00000000..4360a3a4 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/filter.html.ko.euc-kr @@ -0,0 +1,82 @@ + + + +ÇÊÅÍ - Apache HTTP Server + + + + + +
    <-
    +

    ÇÊÅÍ

    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + es  | + fr  | + ja  | + ko  | + ru  | + 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  | + ru  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/filter.html.ru.koi8-r b/rubbos/app/httpd-2.0.64/docs/manual/filter.html.ru.koi8-r new file mode 100644 index 00000000..4bc6765e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/filter.html.ru.koi8-r @@ -0,0 +1,85 @@ + + + +æÉÌØÔÒÙ - HTTP ÓÅÒ×ÅÒ Apache + + + + + +
    <-
    +

    æÉÌØÔÒÙ

    +
    +

    äÏÓÔÕÐÎÙÅ ÑÚÙËÉ:  en  | + es  | + fr  | + ja  | + ko  | + ru  | + tr 

    +
    + +

    äÁÎÎÙÊ ÄÏËÕÍÅÎÔ ÏÐÉÓÙ×ÁÅÔ ÉÓÐÏÌØÚÏ×ÁÎÉÅ ÆÉÌØÔÒÏ× × Apache.

    +
    +
    top
    +
    +

    æÉÌØÔÒÙ

    + + + +

    æÉÌØÔÒ - ÜÔÏ ÐÒÏÃÅÓÓ, ÐÒÅÏÂÒÁÚÕÀÝÉÊ ÄÁÎÎÙÅ, ËÏÔÏÒÙÅ + ÐÏÓÙÌÁÀÔÓÑ ÉÌÉ ÐÏÌÕÞÁÀÔÓÑ ÓÅÒ×ÅÒÏÍ. äÁÎÎÙÅ, ÐÏÌÕÞÁÅÍÙÅ ÏÔ + ËÌÉÅÎÔÁ, ÏÂÒÁÂÁÔÙ×ÁÀÔÓÑ ×ÈÏÄÎÙÍ (input) ÆÉÌØÔÒÏÍ, + × ÔÏ ×ÒÅÍÑ ËÁË ÄÁÎÎÙÅ, ÐÏÓÙÌÁÅÍÙÅ ÓÅÒ×ÅÒÏÍ ËÌÉÅÎÔÕ - + ×ÙÈÏÄÎÙÍ (output). ë ÏÄÎÉÍ É ÔÅÍ ÖÅ ÄÁÎÎÙÍ ÍÏÖÎÏ + ÐÒÉÍÅÎÑÔØ ÐÏÓÌÅÄÏ×ÁÔÅÌØÎÏ ÎÅÓËÏÌØËÏ ÆÉÌØÔÒÏ×, ÐÒÉÞ£Í + ÐÏÒÑÄÏË ÉÈ ÓÌÅÄÏ×ÁÎÉÑ ÍÏÖÅÔ ÂÙÔØ Ñ×ÎÏ ÚÁÄÁÎ.

    + +

    æÉÌØÔÒÙ ÉÓÐÏÌØÚÕÀÔÓÑ ÓÁÍÉÍ ÓÅÒÅÒÏÍ Apache ÄÌÑ ×ÙÐÏÌÎÅÎÉÑ + ÆÕÎËÃÉÊ ÏÂÒÁÂÏÔËÉ ÄÁÎÎÙÈ. ÷ ÄÏÐÏÌÎÅÎÉÅ Ë ÜÔÏÍÕ ÆÉÌØÔÒÙ ÍÏÇÕÔ + ÐÒÅÄÏÓÔÁ×ÌÑÔØÓÑ ÍÏÄÕÌÑÍÉ - × ÜÔÏÍ ÓÌÕÞÁÅ ÕÐÒÁ×ÌÅÎÉÅ ÉÍÉ + ÐÒÏÉÚ×ÏÄÉÔÓÑ ÐÏÓÒÅÄÓÔ×ÏÍ ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÉÈ ÄÉÒÅËÔÉ×, + ÕËÁÚÙ×ÁÅÍÙÈ × ËÏÎÆÉÇÕÒÁÃÉÏÎÎÏÍ ÆÁÊÌÅ. ë ÞÉÓÌÕ ÔÁËÉÈ ÄÉÒÅËÔÉ× + ÏÔÎÏÓÑÔÓÑ ÓÌÅÄÕÀÝÉÅ: + SetInputFilter, + SetOutputFilter, + AddInputFilter, + AddOutputFilter, + RemoveInputFilter, É + RemoveOutputFilter.

    + +

    ÷ ÓÔÁÎÄÁÒÔÎÙÊ ÄÉÓÔÒÉÂÕÔÉ× HTTP ÓÅÒ×ÅÒÁ Apache × ÎÁÓÔÏÑÝÅÅ ×ÒÅÍÑ + ×ÈÏÄÑÔ ÓÌÅÄÕÀÝÉÅ ÆÉÌØÔÒÙ, ÄÏÓÔÕÐÎÙÅ ÄÌÑ ÐÏÌØÚÏ×ÁÔÅÌÑ:

    + +
    +
    INCLUDES
    +
    ïÂÒÁÂÏÔËÁ Server-Side Includes ÏÂÅÓÐÅÞÉ×ÁÅÔÓÑ ÆÉÌØÔÒÏÍ mod_include
    +
    DEFLATE
    +
    óÖÁÔØ ×ÙÈÏÄÎÙÅ ÄÁÎÎÙÅ ÐÅÒÅÄ ÏÔÐÒÁ×ËÏÊ ÍÏÖÎÏ Ó ÐÏÍÏÝØÀ ÆÉÌØÔÒÁ + mod_deflate +
    +
    + +

    íÏÄÕÌØ mod_ext_filter + ÐÏÚ×ÏÌÑÅÔ ÉÓÐÏÌØÚÏ×ÁÔØ ×ÎÅÛÎÉÅ ÐÒÏÇÒÁÍÍÙ × ËÁÞÅÓÔ×Å ÆÉÌØÔÒÏ×.

    +
    +
    +

    äÏÓÔÕÐÎÙÅ ÑÚÙËÉ:  en  | + es  | + fr  | + ja  | + ko  | + ru  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/filter.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/filter.html.tr.utf8 new file mode 100644 index 00000000..efb453c6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/filter.html.tr.utf8 @@ -0,0 +1,82 @@ + + + +Süzgeçler - Apache HTTP Sunucusu + + + + + +
    <-
    +

    Süzgeçler

    +
    +

    Mevcut Diller:  en  | + es  | + fr  | + ja  | + ko  | + ru  | + tr 

    +
    + +

    Bu belge, Apache’de süzgeç kullanımı hakkındadır.

    +
    +
    top
    +
    +

    Süzgeçler

    + + +

    Bir süzgeç, sunucu tarafından alınan ve gönderilen verilere + uygulanan bir işlemdir. Sunucuya istemcilerin gönderdiği veriler + girdi süzgeçleri tarafından, sunucunun istemciye gönderdiği + veriler ise çıktı süzgeçleri tarafından işleme tabi tutulurlar. + Verilere çok sayıda süzgeç uygulanabilir ve süzgeçlerin uygulanma sırası + belirlenebilir.

    + +

    Süzgeçler Apache tarafından dahili olarak bayt dizilerinin elde edilmesi + ve içeriğin bölünmesi gibi işlemler için kullanılabilir. Bundan başka, + modüller tarafından sağlanan süzgeçler de vardır ve bunlar çalışma anında + yapılandırma yönergeleri ile seçilebilir. Veriye uygulanacak süzgeçlerle + ilgili işlemler için kullanılabilecek yönergeler: + SetInputFilter, + SetOutputFilter, + AddInputFilter, + AddOutputFilter, + RemoveInputFilter ve + RemoveOutputFilter.

    + +

    Aşağıdaki kullanıcı tarafından seçilebilen süzgeç uygulamaları Apache + HTTP Sunucusu dağıtımıyla gelmektedir:

    + +
    +
    mod_include
    +
    Sunucu taraflı içerik yerleştirmeyi gerçekler.
    +
    mod_deflate
    +
    Çıktıyı istemciye göndermeden önce sıkıştırır. +
    +
    + +

    Bunlardan başka mod_ext_filter modülü ile harici + uygulamaların süzgeç olarak kullanılması da mümkündür.

    + +
    +
    +

    Mevcut Diller:  en  | + es  | + fr  | + ja  | + ko  | + ru  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/glossary.html b/rubbos/app/httpd-2.0.64/docs/manual/glossary.html new file mode 100644 index 00000000..64348762 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/glossary.html @@ -0,0 +1,21 @@ +# 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=ISO-8859-1 + +URI: glossary.html.es +Content-Language: es +Content-type: text/html; charset=ISO-8859-1 + +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/rubbos/app/httpd-2.0.64/docs/manual/glossary.html.de b/rubbos/app/httpd-2.0.64/docs/manual/glossary.html.de new file mode 100644 index 00000000..481d26df --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/glossary.html.de @@ -0,0 +1,544 @@ + + + +Glossar - Apache HTTP Server + + + + + +
    <-
    +

    Glossar

    +
    +

    Verfügbare Sprachen:  de  | + en  | + es  | + 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 +
    + +
    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.0/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  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/glossary.html.en b/rubbos/app/httpd-2.0.64/docs/manual/glossary.html.en new file mode 100644 index 00000000..8044234d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/glossary.html.en @@ -0,0 +1,449 @@ + + + +Glossary - Apache HTTP Server + + + + + +
    <-
    +

    Glossary

    +
    +

    Available Languages:  de  | + en  | + es  | + 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 +
    + +
    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. + The interface was originally defined by NCSA but there + is also an RFC project.
    + 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, irreversable 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)$". Apache uses Perl + Compatible Regular Expressions provided by the PCRE library. +
    + +
    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 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 +
    + +
    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 is + http://httpd.apache.org/docs/2.0/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  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/glossary.html.es b/rubbos/app/httpd-2.0.64/docs/manual/glossary.html.es new file mode 100644 index 00000000..2ead4629 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/glossary.html.es @@ -0,0 +1,397 @@ + + + +Glosario - Servidor HTTP Apache + + + + + +
    <-
    +

    Glosario

    +
    +

    Idiomas disponibles:  de  | + en  | + es  | + 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 glosario define la terminología más común +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.

    +
    +
    top
    +
    +

    Definiciones

    + +
    +
    Autentificació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
    + +
    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
    + +
    Algoritmo
    Un proceso definido sin +ambiguedades 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.
    + +
    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 Dinamicos +Compartidos (DSOs) y ayuda a instalarlos en el +servidor web Apache.
    Consulte: Paginas de Ayuda: apxs
    + +
    Certificado
    + +
    Una información que se almacena para autentificar 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 expendedor) que lo firma, más la clave publica del propietario y la firma de + la AC. Las entidades de red verifican las firmas usando + certificados de las AC.
    + +Consulte: Encriptado SSL/TLS
    + +
    Autoridad Certificadora (CA)
    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
    + +
    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 de Autoridad Certificadora. Una +vez que el CSR está firmado, se convierte en un auténtico +certificado.
    Consulte: Encriptado +SSL/TLS
    + + +
    Algoritmo de cifrado
    Es un algoritmo +o sistema de encriptado de información. Ejemplos de estos +algoritmos son DES, IDEA, RC4, etc.
    Consulte: Encriptado SSL/TLS
    + +
    Texto cifrado
    El resultado de +haber aplicado a un texto sin cifrar un algoritmo de cifrado.
    Consultar: Encriptado SSL/TLS
    + +
    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 +fue definido originalmente por la NCSA pero +tambien hay un proyecto RFC.
    Consulte: Contenido Dinámico con CGI
    + + +
    Directivas de +configuración
    Consulte: Directivas
    + +
    Fichero de Configuración
    +
    Un fichero de texto que contiene Directivas que controlan la configuración +de Apache.
    Consulte: Ficheros de +Configuración
    + +
    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: Terminos usados para describir +las directivas de Apache
    + +
    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
    + +
    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
    + +
    Objetos Dinámicos +Compartidos (DSO)
    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
    + +
    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
    + +
    Export-Crippled
    +
    Disminución de la fortaleza criptográfica (y seguridad) +para cumplir con las Regulaciones sobre Exportación de la +Administracció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 desencriptarse por fuerza bruta.
    Consulte: Encriptado SSL/TLS
    + +
    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
    + +
    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.
    + +
    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 +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
    + +
    Cabecera
    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.
    + +
    .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
    + +
    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
    + +
    Protocolo de Tranferencia 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 +Hipertext (Seguro), es el mecanismo de comunicación encriptado +estándar en World Wide Web. En realidad es HTTP sobre SSL.
    Consulte: Encriptado +SSL/TLS
    + +
    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 metodos diponibles en HTTP son GET, +POST, y PUT.
    + +
    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
    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 httpd de 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 dinamicos o DSOs. +Los módulos que están incluidos por sefecto 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
    + +
    Número Mágico de +Módulo (MMN)
    El número +mágico de módulo 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
    + +
    OpenSSL
    +
    El toolkit Open Source para SSL/TLS
    + see http://www.openssl.org/
    + +
    Pass Phrase
    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
    + +
    Plaintext
    +
    Un texto no encriptado.
    + +
    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
    + +
    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
    + +
    Clave Publica
    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
    + +
    Criptográfia 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. Tambien se llama Criptografia Asimétrica.
    +Consulte: Encriptado SSL/TLS
    + +
    Expresiones Regulares (Regex)
    Una forma de describir un modelo de +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 utiles 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 un directorio "imágenes" +podrían ser escritos como "/images/.*(jpg|gif)$". +Apache usa Expresiones Regulares compatibles con Perl gracias a la +librería PCRE.
    + +
    Reverse Proxy
    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.
    + +
    Secure Sockets Layer (SSL)
    Un protocolo creado por Netscape +Communications Corporation para la autentificación en +comunicaciones en general y encriptado sobre redes TCP/IP. Su +aplicación más popular es HTTPS, el Protocolo de +Transferencia de Hipertexto (HTTP) sobre SSL.
    Consulte: Encriptado SSL/TLS
    + +
    Server Side Includes (SSI)
    Una tecnica para incluir directivas de +proceso en archivos HTML.
    Consulte: Introducción al Server Side +Includes
    + +
    Sesion
    Información del +contexto de una comunicación en general.
    + +
    SSLeay
    La implementación +original de la librería SSL/TLS desarrollada por Eric +A. Young
    + +
    Criptografía +Simétrica
    El estudio y aplicación de +Algoritmos de Cifrado que usan una solo clave secreta tanto +para encriptar como para desencriptar.
    Consulte: Encriptado SSL/TLS
    + +
    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.
    + +
    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
    + +
    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.0/glossary.html.
    + +
    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.
    + +
    Hosting Virtual
    Se trata de +servir diferentes sitios web con una sola entidad de Apache. El +hosting virtual de IPs diferencia los sitios web basandose 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
    + +
    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  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/glossary.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/glossary.html.ko.euc-kr new file mode 100644 index 00000000..57daf4e4 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/glossary.html.ko.euc-kr @@ -0,0 +1,366 @@ + + + +¿ë¾î - Apache HTTP Server + + + + + +
    <-
    +

    ¿ë¾î

    +
    +

    °¡´ÉÇÑ ¾ð¾î:  de  | + en  | + es  | + 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.0/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  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/glossary.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/glossary.html.tr.utf8 new file mode 100644 index 00000000..765dca92 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/glossary.html.tr.utf8 @@ -0,0 +1,460 @@ + + + +Terim Sözlüğü - Apache HTTP Sunucusu + + + + + +
    <-
    +

    Terim Sözlüğü

    +
    +

    Mevcut Diller:  de  | + en  | + es  | + 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 +
    + +
    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. +
    + +
    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. Apache, PCRE + kütüphanesi ile sağlanan Perl uyumlu düzenli ifadeleri kullanır. +
    + +
    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ı. Özgün arayüz NCSA tarafından + tanımlanmış olmakla birlikte ayrıca bir CGI RFC’si de 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 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.0/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  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/handler.html b/rubbos/app/httpd-2.0.64/docs/manual/handler.html new file mode 100644 index 00000000..3109a133 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/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=ISO-8859-1 + +URI: handler.html.es +Content-Language: es +Content-type: text/html; charset=ISO-8859-1 + +URI: handler.html.fr +Content-Language: fr +Content-type: text/html; charset=ISO-8859-1 + +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.ru.koi8-r +Content-Language: ru +Content-type: text/html; charset=KOI8-R + +URI: handler.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/handler.html.en b/rubbos/app/httpd-2.0.64/docs/manual/handler.html.en new file mode 100644 index 00000000..97abe943 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/handler.html.en @@ -0,0 +1,159 @@ + + + +Apache's Handler Use - Apache HTTP Server + + + + + +
    <-
    +

    Apache's Handler Use

    +
    +

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

    +
    + +

    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.

    + +

    Apache 1.1 adds the ability to use handlers explicitly. + Based on either filename extensions or on location, handlers + can be specified 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_imap)
    • + +
    • 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  | + ru  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/handler.html.es b/rubbos/app/httpd-2.0.64/docs/manual/handler.html.es new file mode 100644 index 00000000..76bd2b4d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/handler.html.es @@ -0,0 +1,168 @@ + + + +Uso de los Handlers en Apache - Servidor HTTP Apache + + + + + +
    <-
    +

    Uso de los Handlers en Apache

    +
    +

    Idiomas disponibles:  en  | + es  | + fr  | + ja  | + ko  | + ru  | + tr 

    +
    + +

    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.

    + +

    Apache 1.1 añade la posibilidad de usar handlers + explicitamente. Basándose en la extension del fichero o en + la ubicación en la que este, se pueden especificar handlers + sin tener en cuenta el tipo de fichero de 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 ser tanto ser compilados con el servidor + como incluidos en un módulo, como añadidos con la + directiva Action. Los + handlers compilados 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_imap)
    • + +
    • server-info: Extrae la información de + configuración del + servidor. (mod_info)
    • + +
    • server-status: Extrae el informe de 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 cabaceras 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  | + ru  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/handler.html.fr b/rubbos/app/httpd-2.0.64/docs/manual/handler.html.fr new file mode 100644 index 00000000..a4d3d0a2 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/handler.html.fr @@ -0,0 +1,168 @@ + + + +Utilisation des gestionnaires apache - Serveur Apache HTTP + + + + + +
    <-
    +

    Utilisation des gestionnaires apache

    +
    +

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

    +
    + +

    Ce document décrit l'utilisation des gestionnaires (Handlers) Apache.

    +
    + +
    top
    +
    +

    Qu'est ce qu'un Gestionnaire ?

    + + + + +

    Un Gestionnaire "handler" est une représentation interne à + Apache, qui décrit quoi faire quand un fichier est appelé. De + manière générale, les fichiers disposent d'un gestionnaire + implicite en fonction de leurs types. Le fonctionnement standard + est de simplement servir le fichier tel qu'il est demandé, mais + certains types de fichiers peuvent être gérés différemment.

    + +

    Depuis Apache 1.1, il est possible de forcer l'utilisation + des gestionnaires. Ils peuvent être spécifiés pour des fichiers + présentant une certaine extension ou présents dans un certain + répertoire, et peuvent être utilisés indépendamment des types + des fichiers. Cette technique est avantageuse, d'abord parce + que plus élégante, mais aussi parce qu'on peut ainsi associer + un type de fichier et un gestionnaire à un + fichier. (Voir aussi : Fichiers à Extensions Multiples.)

    + +

    Les gestionnaires peuvent être intégrés au serveur, ou inclus + dans un module, ou encore être configurés au moyen de la directive + Action. Les + gestionnaires fournis par défaut dans la distribution d'Apache + se présentent comme suit :

    + +
      +
    • default-handler : Envoie le fichier en + utilisant default_handler() qui est le + gestionnaire utilisé par défaut pour gérer les contenus + statiques. (noyau d'Apache)
    • + +
    • send-as-is : Envoie le fichier avec les + 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 imagemap. NdT : ces fonctionnalités sont + désuètes, et sont réalisées à présent coté client. + (mod_imap)
    • + +
    • server-info : Envoie les informations + de configuration du serveur. (mod_info)
    • + +
    • server-status : Envoie les informations sur + le fonctionnement et la charge du serveur. + (mod_status)
    • + +
    • type-map : Traite le fichier comme un + fichier de types pour la négociation de contenu. + (mod_negotiation)
    • +
    +
    top
    +
    +

    Exemples

    + + +

    Modifier un contenu statique au moyen d'un script CGI

    + + +

    Les directives ci-après provoquent l'exécution du script + CGI footer.pl à chaque requête de fichier + présentant l'extension html.

    + +

    + Action add-footer /cgi-bin/footer.pl
    + AddHandler add-footer .html +

    + +

    Le travail du script CGI est alors d'envoyer le document + demandé (désigné au moyen de la variable d'environnement + PATH_TRANSLATED) en lui faisant subir au préalable + les transformations désirées.

    + + +

    Fichiers contenant des en-têtes HTTP

    + + +

    Les directives ci-après activent le gestionnaire + send-as-is, utilisé pour gérer les fichiers + qui contiennent leurs propres en-têtes HTTP. Tous les fichiers + contenus dans le répertoire /web/htdocs/asis/ + seront traités par le gestionnaire send-as-is, + sans tenir compte de leurs extensions.

    + +

    + <Directory /web/htdocs/asis>
    + SetHandler send-as-is
    + </Directory> +

    + + +
    top
    +
    +

    Note aux programmeurs

    + + +

    L'API d'Apache a été modifiée + lors de l'implémentation des gestionnaires ; cette modification + peut se révéler intéressante. Un nouvel enregistrement a été ajouté + à la structure request_rec :

    + +

    + char *handler +

    + +

    Pour qu'un module utilise un gestionnaire, il suffit d'affecter + r->handler avec le nom du gestionnaire avant + l'étape invoke_handler de la requête. Les + gestionnaires fonctionnent comme auparavant, bien que leurs noms + soient nécessaires au lieu d'un type de contenu. Bien qu'elle ne + soit pas nécessaire, la convention de nommage des gestionnaires + demande l'utilisation de mots séparés par des tirets, ne contenant + aucun slash, afin de ne pas interférer avec l'espace de nommage + des types de médias.

    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/handler.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/handler.html.ja.utf8 new file mode 100644 index 00000000..feefbf9e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/handler.html.ja.utf8 @@ -0,0 +1,163 @@ + + + +Apache のハンドラの使用 - Apache HTTP サーバ + + + + + +
    <-
    +

    Apache のハンドラの使用

    +
    +

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

    +
    + +

    Apache のハンドラの使用に関して記述しています。

    +
    + +
    top
    +
    +

    ハンドラとは

    + + + + +

    「ハンドラ」とは、ファイルが呼ばれたときに実行される動作の + Apache における内部表現です。 + 通常、ファイルはファイル型に基づいた暗黙のハンドラがあります。 + 普通はすべてのファイルは単にサーバに扱われますが、 + ファイルタイプの中には別に「ハンドル」(訳注: 扱う) + されるものもあります。

    + +

    Apache 1.1 では、ハンドラを明示的に使用する機能が追加されました。 + ファイルの拡張子や置いている場所に基づいて、 + ファイル型と関係なくハンドラを指定することができます。 + これはより優雅な解決法という点と、ファイルにタイプとハンドラの両方を関連付けることができるという点で優れています。 + (複数の拡張子のあるファイルも参照してください)。

    + +

    ハンドラはサーバに組み込んだり、モジュールとして含めたり、 + Action + ディレクティブとして追加したりすることができます。 + 以下は標準配布に組み込まれているハンドラです。 +

    + +
      +
    • default-handler:default_handelr() + を使ってファイルを送ります。 + 静的なコンテンツを扱うときにデフォルトで使用されるハンドラです。 + (core)
    • + +
    • send-as-is: + HTTP ヘッダのあるファイルをそのまま送ります。 + (mod_asis)
    • + +
    • cgi-script: ファイルを CGI + スクリプトとして扱います。 + (mod_cgi)
    • + +
    • imap-file: + イメージマップのルールファイルとして解析します。 + (mod_imap)
    • + +
    • 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 + を設定することだけです。ハンドラはコンテントタイプの代わりに + ハンドラ名を使うようになっていること以外は、以前と同じように実装されています。 + 必ず要求されているわけではありませんが、メディアタイプ + の名前空間を侵さないように、ハンドラの名前にはスラッシュを含まない、 + ダッシュ (訳注: "-") で分離された名前を付ける習慣になっています。

    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/handler.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/handler.html.ko.euc-kr new file mode 100644 index 00000000..8cc951f4 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/handler.html.ko.euc-kr @@ -0,0 +1,153 @@ + + + +¾ÆÆÄÄ¡¿¡¼­ Çڵ鷯 »ç¿ë - Apache HTTP Server + + + + + +
    <-
    +

    ¾ÆÆÄÄ¡¿¡¼­ Çڵ鷯 »ç¿ë

    +
    +

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

    +
    + +

    ÀÌ ¹®¼­´Â ¾ÆÆÄÄ¡¿¡¼­ Çڵ鷯¸¦ »ç¿ëÇÏ´Â ¹æ¹ýÀ» ¼³¸íÇÑ´Ù.

    +
    + +
    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_imap)
    • + +
    • 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  | + ru  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/handler.html.ru.koi8-r b/rubbos/app/httpd-2.0.64/docs/manual/handler.html.ru.koi8-r new file mode 100644 index 00000000..0977117f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/handler.html.ru.koi8-r @@ -0,0 +1,168 @@ + + + +éÓÐÏÌØÚÏ×ÁÎÉÅ ÏÂÒÁÂÏÔÞÉËÏ× × Apache - HTTP ÓÅÒ×ÅÒ Apache + + + + + +
    <-
    +

    éÓÐÏÌØÚÏ×ÁÎÉÅ ÏÂÒÁÂÏÔÞÉËÏ× × Apache

    +
    +

    äÏÓÔÕÐÎÙÅ ÑÚÙËÉ:  en  | + es  | + fr  | + ja  | + ko  | + ru  | + tr 

    +
    + +

    üÔÏÔ ÄÏËÕÍÅÎÔ ÏÐÉÓÙ×ÁÅÔ ÉÓÐÏÌØÚÏ×ÁÎÉÅ ÏÂÒÁÂÏÔÞÉËÏ× (handlers) × Apache.

    +
    + +
    top
    +
    +

    þÔÏ ÔÁËÏÅ ÏÂÒÁÂÏÔÞÉË

    + + + + +

    ïÂÒÁÂÏÔÞÉË Ñ×ÌÑÅÔÓÑ ×ÎÕÔÒÅÎÎÅÊ ÓÔÒÕËÔÕÒÏÊ + Apache, ËÏÔÏÒÁÑ ÚÁÄÁ£Ô ÐÏ×ÅÄÅÎÉÅ ÓÅÒ×ÅÒÁ ÐÒÉ ÏÂÒÁÂÏÔËÅ + ÚÁÐÒÁÛÉ×ÁÅÍÏÇÏ ÆÁÊÌÁ. ëÁË ÐÒÁ×ÉÌÏ, ËÁÖÄÏÍÕ ÆÁÊÌÕ ÓÏÏÔ×ÅÔÓÔ×ÕÅÔ + Ó×ÏÊ ×ÎÕÔÒÅÎÎÉÊ ÏÂÒÁÂÏÔÞÉË, ËÏÔÏÒÙÊ ÎÁÚÎÁÞÁÅÔÓÑ ÓÅÒ×ÅÒÏÍ + ÉÓÈÏÄÑ ÉÚ ÔÉÐÁ ÆÁÊÌÁ. ïÂÙÞÎÏ ÆÁÊÌÙ ÐÒÏÓÔÏ ×ÏÚ×ÒÁÝÁÀÔÓÑ + ÐÏÌØÚÏ×ÁÔÅÌÀ, ÎÏ ÎÅËÏÔÏÒÙÅ ÔÉÐÙ ÆÁÊÌÏ× ÐÒÅÄ×ÁÒÉÔÅÌØÎÏ + ÏÂÒÁÂÁÔÙ×ÁÀÔÓÑ (handled) ÓÅÒ×ÅÒÏÍ.

    + +

    ÷ Apache 1.1 ÄÏÂÁ×ÌÅÎÁ ×ÏÚÍÏÖÎÏÓÔØ ÉÓÐÏÌØÚÏ×ÁÔØ ÏÂÒÁÂÏÔÞÉËÉ + Ñ×ÎÏ. ðÒÉÞ£Í ÏÂÒÁÂÏÔËÁ ÆÁÊÌÏ× ÍÏÖÅÔ ÏÓÎÏ×Ù×ÁÔØÓÑ + ÔÅÐÅÒØ ÎÅ ÔÏÌØËÏ ÎÁ ÉÈ ÔÉÐÅ, ÎÏ É ÎÁ ÒÁÓÛÉÒÅÎÉÉ ÆÁÊÌÏ× ÉÌÉ + ÉÈ ÍÅÓÔÏÎÁÈÏÖÄÅÎÉÉ. üÔÏ ÐÒÅÄÓÔÁ×ÌÑÅÔÓÑ ÎÁÉÂÏÌÅÅ ÕÄÁÞÎÙÍ + ÒÅÛÅÎÉÅÍ, ×Ï-ÐÅÒ×ÙÈ ÐÏÔÏÍÕ, ÞÔÏ ÜÔÏ ÒÅÛÅÎÉÅ ÜÌÅÇÁÎÔÎÏ, Á + ×Ï-×ÔÏÒÙÈ, ÜÔÏ ÐÏÚ×ÏÌÑÅÔ ÁÓÓÏÃÉÉÒÏ×ÁÔØ Ó ÆÁÊÌÏÍ ËÁË + ÔÉÐ, ÔÁË É ÏÂÒÁÂÏÔÞÉË. (óÍ. ÔÁËÖÅ + «æÁÊÌÙ Ó ÎÅÓËÏÌØËÉÍÉ + ÒÁÓÛÉÒÅÎÉÑÍÉ»)

    + +

    ïÂÒÁÂÏÔÞÉËÉ ÍÏÇÕÔ ÐÒÅÄÓÔÁ×ÌÑÔØ ÉÚ ÓÅÂÑ ËÁË + ×ËÏÍÐÉÌÉÒÏ×ÁÎÎÙÅ × ÓÅÒ×ÅÒ (ÉÌÉ ÐÏÄËÌÀÞÁÅÍÙÅ Ó ÐÏÍÏÝØÀ + ÍÏÄÕÌÅÊ) ÆÕÎËÃÉÉ, ÉÌÉ ÏÎÉ ÍÏÇÕÔ ÂÙÔØ ÄÏÂÁ×ÌÅÎÙ Ó ÐÏÍÏÝØÀ + ÄÉÒÅËÔÉ×Ù Action. + ÷ ÓÔÁÎÄÁÒÔÎÏÍ ÄÉÓÔÒÉÂÕÔÉ×Å ÓÅÒ×ÅÒÁ ÉÍÅÀÔÓÑ ÓÌÅÄÕÀÝÉÅ ×ÓÔÒÏÅÎÎÙÅ + ÏÂÒÁÂÏÔÞÉËÉ:

    + +
      +
    • default-handler: ðÏÓÙÌÁÅÔ ÆÁÊÌ, ÉÓÐÏÌØÚÕÑ ÆÕÎËÃÉÀ + default_handler(), ËÏÔÏÒÁÑ Ñ×ÌÑÅÔÓÑ ÏÂÒÁÂÏÔÞÉËÏÍ + ÐÏ-ÕÍÏÌÞÁÎÉÀ ÄÌÑ ÓÔÁÔÉÞÅÓËÉÈ ÆÁÊÌÏ×. (ÑÄÒÏ)
    • + +
    • send-as-is: ðÏÓÙÌÁÅÔ ÆÁÊÌ, ÓÏÄÅÒÖÁÝÉÊ × + ÓÅÂÅ HTTP ÚÁÇÏÌÏ×ËÉ, ËÁË ÅÓÔØ. (mod_asis)
    • + +
    • cgi-script: ïÂÒÁÂÁÔÙ×ÁÅÔ ÆÁÊÌ ËÁË CGI-ÓËÒÉÐÔ. + (mod_cgi)
    • + +
    • imap-file: ïÂÒÁÂÁÔÙ×ÁÅÔ ÆÁÊÌ ËÁË ËÁÒÔÕ ÉÚÏÂÒÁÖÅÎÉÑ + (imagemap). (mod_imap)
    • + +
    • server-info: ÷ÏÚ×ÒÁÝÁÅÔ ËÏÎÆÉÇÕÒÁÃÉÏÎÎÕÀ + ÉÎÆÏÒÍÁÃÉÀ ÓÅÒ×ÅÒÁ. (mod_info)
    • + +
    • server-status: ÷ÏÚ×ÒÁÝÁÅÔ ÏÔÞÅÔ Ï ÓÏÓÔÏÑÎÉÉ + ÓÅÒ×ÅÒÁ. (mod_status)
    • + +
    • type-map: ïÂÒÁÂÁÔÙ×ÁÅÔ ÆÁÊÌ ËÁË ËÁÒÔÕ ÔÉÐÏ× + (type map). (mod_negotiation)
    • +
    +
    top
    +
    +

    ðÒÉÍÅÒÙ

    + + +

    ïÂÒÁÂÏÔËÁ ÓÔÁÔÉÞÅÓËÏÇÏ ÄÏËÕÍÅÎÔÁ CGI-ÓËÒÉÐÔÏÍ

    + + +

    ðÒÉ ÉÓÐÏÌØÚÏ×ÁÎÉÉ ÓÌÅÄÕÀÝÉÈ ÄÉÒÅËÔÉ×, ËÁÖÄÙÊ ÚÁÐÒÏÓ ÆÁÊÌÁ + Ó ÒÁÓÛÉÒÅÎÉÅÍ html ÂÕÄÅÔ ÚÁÐÕÓËÁÔØ ÎÁ ×ÙÐÏÌÎÅÎÉÅ + CGI-ÓËÒÉÐÔ footer.pl ÄÌÑ ÐÒÅÄ×ÁÒÉÔÅÌØÎÏÊ ÏÂÒÁÂÏÔËÉ + ÚÁÐÒÁÛÉ×ÁÅÍÏÇÏ ÆÁÊÌÁ.

    + +

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

    + +

    åÓÌÉ ×Ù ÈÏÔÉÔÅ × Ó×Ï£Í ÍÏÄÕÌÅ ÉÓÐÏÌØÚÏ×ÁÔØ ÏÂÒÁÂÏÔÞÉË, + ÔÏ ×Ó£, ÞÔÏ ×ÁÍ ÎÁÄÏ ÓÄÅÌÁÔØ, ÜÔÏ ÚÁÐÉÓÁÔØ × r->handler + ÉÍÑ ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÅÇÏ ÏÂÒÁÂÏÔÞÉËÁ, ÐÒÉÞ£Í ÓÄÅÌÁÔØ ÜÔÏ ÎÅÏÂÈÏÄÉÍÏ + ÐÅÒÅÄ ÔÅÍ, ËÁË ÚÁÐÒÏÓ ÄÏÈÏÄÉÔ ÄÏ ÓÔÁÄÉÉ invoke_handler. + ïÂÒÁÂÏÔÞÉËÉ ÒÅÁÌÉÚÕÀÔÓÑ ÔÏÞÎÏ ÔÁË ÖÅ, ËÁË É ÒÁÎØÛÅ, + ÚÁ ÉÓËÌÀÞÅÎÉÅÍ ÌÉÛØ ÔÏÇÏ, ÞÔÏ ÔÅÐÅÒØ ÎÅÏÂÈÏÄÉÍÏ ÕËÁÚÙ×ÁÔØ + ÉÍÑ ÏÂÒÁÂÏÔÞÉËÁ, Á ÎÅ ÔÉÐ ÓÏÄÅÒÖÉÍÏÇÏ (content type). + èÏÔÑ ÜÔÏ É ÎÅ Ñ×ÌÑÅÔÓÑ ÏÂÑÚÁÔÅÌØÎÙÍ, ÎÏ ÓÕÝÅÓÔ×ÕÀÔ ÓÌÅÄÕÀÝÉÅ + ÐÒÁ×ÉÌÁ ÉÍÅÎÏ×ÁÎÉÑ ÏÂÒÁÂÏÔÞÉËÏ× - ÎÅÏÂÈÏÄÉÍÏ ÉÓÐÏÌØÚÏ×ÁÔØ + ÓÌÏ×Á, ÒÁÚÄÅÌ£ÎÎÙÅ ÄÅÆÉÓÏÍ É ÎÅ ÓÏÄÅÒÖÁÝÉÅ ËÏÓÙÈ ÞÅÒÔ - ÜÔÏ + ÐÏÚ×ÏÌÉÔ ÎÅ ÐÅÒÅÓÅËÁÔØÓÑ Ó ÐÒÏÓÔÒÁÎÓÔ×ÏÍ ÉͣΠÍÅÄÉÁ-ÔÉÐÏ× (media type).

    +
    +
    +

    äÏÓÔÕÐÎÙÅ ÑÚÙËÉ:  en  | + es  | + fr  | + ja  | + ko  | + ru  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/handler.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/handler.html.tr.utf8 new file mode 100644 index 00000000..bf1e6886 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/handler.html.tr.utf8 @@ -0,0 +1,157 @@ + + + +Apache Eylemcilerinin Kullanımı - Apache HTTP Sunucusu + + + + + +
    <-
    +

    Apache Eylemcilerinin Kullanımı

    +
    +

    Mevcut Diller:  en  | + es  | + fr  | + ja  | + ko  | + ru  | + tr 

    +
    + +

    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.

    + +

    Apache 1.1 sürümünden itibaren eylemciler doğrudan kullanılabilmektedir. + 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_imap)
    • + +
    • 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 /siteler/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  | + ru  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/howto/auth.html b/rubbos/app/httpd-2.0.64/docs/manual/howto/auth.html new file mode 100644 index 00000000..c485dfb9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/howto/auth.html @@ -0,0 +1,17 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: auth.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: auth.html.es +Content-Language: es +Content-type: text/html; charset=ISO-8859-1 + +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 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/howto/auth.html.en b/rubbos/app/httpd-2.0.64/docs/manual/howto/auth.html.en new file mode 100644 index 00000000..f410577f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/howto/auth.html.en @@ -0,0 +1,355 @@ + + + +Authentication, Authorization and Access Control - Apache HTTP Server + + + + + +
    <-
    +

    Authentication, Authorization and Access Control

    +
    +

    Available Languages:  en  | + es  | + ja  | + ko 

    +
    + +

    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.

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

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

    +
    top
    +
    +

    Getting it working

    +

    Here's the basics of password protecting a directory on your + server.

    + +

    You'll need to create a 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. 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. + On my server, it's located at + /usr/local/apache/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/apache/htdocs/secret> section.

    + +

    + AuthType Basic
    + AuthName "Restricted Files"
    + AuthUserFile /usr/local/apache/passwd/passwords
    + Require user rbowen +

    + +

    Let's examine each of those directives individually. The AuthType directive selects + that method that is used to authenticate the user. The most + common method is Basic, and this is the method + implemented by mod_auth. It is important to be aware, + however, that Basic authentication sends the password from the client to + the browser unencrypted. This method should therefore not be used for + highly sensitive data. Apache supports one other authentication method: + AuthType Digest. This method is implemented by mod_auth_digest and is much more secure. Only the most recent + versions of clients are known to support Digest authentication.

    + +

    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 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_auth_dbm module provides the AuthDBMUserFile directive. These + files can be created and manipulated with the dbmmanage program. Many + other types of authentication options are available from third + party modules in the Apache Modules + Database.

    + +

    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 to + look like the following:

    + +

    + AuthType Basic
    + AuthName "By Invitation Only"
    + 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. You can even emulate + the group behavior here, by just keeping a separate password + file for each group. The advantage of this approach is that + Apache only has to check one file, rather than two. The + disadvantage is that you have to maintain a bunch of password + files, and remember to reference the right one in the + AuthUserFile directive.

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

    What other neat stuff can I +do?

    +

    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 Allow and + Deny directives let + you allow and deny access based on the host name, or host + address, of the machine requesting a document. The + Order directive goes + hand-in-hand with these two, and tells Apache in which order to + apply the filters.

    + +

    The usage of these directives is:

    + +

    + Allow from address +

    + +

    where address is an IP address (or a partial IP + address) or 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:

    + +

    + Deny from 10.252.46.165 +

    + +

    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.

    + +

    + Deny from 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:

    + +

    + Deny from 192.168.205
    + Deny from phishers.example.com moreidiots.example
    + Deny from ke +

    + +

    Using Order will let you be + sure that you are actually restricting things to the group that you want + to let in, by combining a Deny + and an Allow directive:

    + +

    + Order deny,allow
    + Deny from all
    + Allow from dev.example.com +

    + +

    Listing just the Allow + directive would not do what you want, because it will let folks from that + host in, in addition to letting everyone in. What you want is to let + only those folks in.

    +
    top
    +
    +

    More information

    +

    You should also read the documentation for mod_auth + and mod_access which contain some more information + about how this all works.

    +
    +
    +

    Available Languages:  en  | + es  | + ja  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/howto/auth.html.es b/rubbos/app/httpd-2.0.64/docs/manual/howto/auth.html.es new file mode 100644 index 00000000..f2839d77 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/howto/auth.html.es @@ -0,0 +1,374 @@ + + + +Autentificación, Autorización y Control de Acceso - Servidor HTTP Apache + + + + + +
    <-
    +

    Autentificación, Autorización y Control de Acceso

    +
    +

    Idiomas disponibles:  en  | + es  | + 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.
    + +

    La autentificación es cualquier proceso mediante el cual se + verifica que alguien es quien dice ser. La autorización es + cualquier proceso por el cual a alguien se le permite estar donde + quiere ir, o tener la información que quiere tener.

    +
    + +
    top
    +
    top
    +
    +

    Introducción

    +

    Si en su sitio web tiene información sensible o dirigida + sólo a un pequeño grupo de personas, las técnicas + explicadas en éste artículo le ayudarán a + asegurarse de que las personas que ven esas páginas son las + personas que usted quiere que las vean.

    + +

    Este artículo cubre la manera "estándar" de proteger + partes de su sitio web que la mayoría de ustedes van a usar.

    +
    top
    +
    +

    Los Prerrequisitos

    +

    Las directivas tratadas en éste artículo necesitarán + ir en el archivo de configuración principal de su servidor + (típicamente en una sección del tipo + <Directory>), + o en archivos de configuración por directorios (archivos + .htaccess).

    + +

    Si planea usar archivos .htaccess, necesitará + tener una configuración en el servidor que permita poner directivas + de autentificación en estos archivos. Esto se logra con la + directiva AllowOverride, + la cual especifica cuáles directivas, en caso de existir, pueden + ser colocadas en los archivos de configuración por directorios.

    + +

    Ya que se está hablando de autentificación, necesitará + una directiva AllowOverride como + la siguiente:

    + +

    + AllowOverride AuthConfig +

    + +

    O, si sólo va a colocar directivas directamente en el principal + archivo de configuración del servidor, por supuesto necesitará + tener permiso de escritura a ese archivo.

    + +

    Y necesitará saber un poco acerca de la estructura de + directorios de su servidor, con la finalidad de que sepa dónde + están algunos archivos. Esto no debería ser muy + difícil, y trataré de hacerlo sencillo cuando lleguemos a + ese punto.

    +
    top
    +
    +

    Puesta en funcionamiento

    +

    Aquí está lo esencial en cuanto a proteger con + contraseña un directorio de su servidor.

    + +

    Necesitará crear un archivo de contraseñas. Éste + archivo debería colocarlo en algún sitio no accesible + mediante la Web. Por ejemplo, si sus documentos son servidos desde + /usr/local/apache/htdocs usted podría querer colocar + el(los) archivo(s) de contraseñas en + /usr/local/apache/passwd.

    + +

    Para crear un archivo de contraseñas, use la utilidad + htpasswd que viene con Apache. + Ésta utilidad puede encontrarla en el directorio bin + de cualquier sitio en que haya instalado Apache. Para crear el + archivo, escriba:

    + +

    + htpasswd -c /usr/local/apache/passwd/passwords rbowen +

    + +

    htpasswd le pedirá la contraseña, y luego se + la volverá a pedir 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 su ruta, por supuesto + tendrá que escribir la ruta completa al archivo para ejecutarlo. + En mi servidor, éste archivo está en + /usr/local/apache/bin/htpasswd

    + +

    El siguiente paso es configurar el servidor para que solicite una + contraseña y decirle al servidor a qué usuarios se les + permite el acceso. Puede hacer esto editando el archivo + httpd.conf o usando un archivo .htaccess. + Por ejemplo, si desea proteger el directorio + /usr/local/apache/htdocs/secret, puede usar las siguientes + directivas, ya sea colocándolas en el archivo + /usr/local/apache/htdocs/secret/.htaccess, + o en httpd.conf dentro de una sección <Directory + /usr/local/apache/apache/htdocs/secret>.

    + +

    + AuthType Basic
    + AuthName "Restricted Files"
    + AuthUserFile /usr/local/apache/passwd/passwords
    + Require user rbowen +

    + +

    Vamos a examinar cada una de estas directivas por separado. La + directiva AuthType selecciona + el método que se va a usar para autentificar al usuario. El + método más común es Basic, y éste + método está implementado en mod_auth. Es importante + ser consciente, sin embargo, de que la autentificación Básica + envía la contraseña desde el cliente hasta el navegador sin + encriptar. Por lo tanto, este método no debería ser usado + para información altamente sensible. Apache soporta otro método + de autentificación: AuthType Digest. Este método + está implementado en mod_auth_digest y es mucho más + seguro. Sólo las versiones más recientes de clientes soportan + la autentificación del tipo Digest.

    + +

    La directiva AuthName establece + el Dominio (Realm) a usar en la + autentificación. El dominio (realm) cumple + dos funciones importantes. Primero, el cliente frecuentemente presenta + esta información al usuario como parte del cuatro de diálogo + para la contraseña. Segundo, es usado por el cliente para determinar + qué contraseña enviar para un área autentificada dada.

    + +

    Así, por ejemplo, una vez que el cliente se haya autentificado en + el área "Restricted Files", + automáticamente se volverá a tratar de usar la misma + contraseña en cualquier área del mismo servidor que esté + marcado con el Dominio (Realm) "Restricted Files". Por lo tanto, + puede evitar que se le pida al usuario la contraseña + más de una vez permitiendo compartir el mismo dominio (realm) + para múltiples áreas restringidas. Por supuesto, por + razones de seguridad, el cliente siempre necesitará pedir de + nuevo la contraseña cuando cambie el nombre de la + máquina del servidor.

    + +

    La directiva AuthUserFile + establece la ruta al archivo de contraseña que acabamos de crear + con htpasswd. Si tiene un gran número de usuarios, + sería bastante lento buscar por medio de un archivo en texto plano + para autentificar al usuario en cada solicitud. Apache también tiene + la capacidad de almacenar la información del usuario en + archivos rápidos de bases de datos. El módulo mod_auth_dbm + proporciona la directiva AuthDBMUserFile. Estos archivos pueden + ser creados y manipulados con el programa + dbmmanage. Muchos otros tipos + de opciones de autentificación están disponibles en módulos + de terceras partes en la Base de + datos de Módulos de Apache.

    + +

    Finalmente, la directiva Require + proporciona la parte de la autorización del proceso estableciendo + el usuario al que se le permite acceder a ese área del servidor. + En la próxima sección, discutimos varias formas de usar la + directiva Require.

    +
    top
    +
    +

    Permitir el acceso a más +de una persona

    +

    Las directivas anteriores sólo permiten que una persona + (específicamente alguien con un nombre de usuario de + rbowen) acceda al directorio. En la mayoría de los + casos, usted querrá permitir el acceso a más de una persona. + Aquí es donde entra la directiva AuthGroupFile.

    + +

    Si desea permitir la entrada a más de una persona, necesitará + crear un archivo de grupo que asocie nombres de grupo con una lista + de usuarios perteneciente a ese grupo. El formato de este archivo es muy sencillo, + y puede crearlo con su editor favorito. El contenido del archivo + será parecido a este:

    + +

    + GroupName: rbowen dpitts sungo rshersey +

    + +

    Esto es solo una lista de miembros del grupo escritos en una + línea separados por espacios.

    + +

    Para agregar un usuario a un archivo de contraseñas ya existente, + escriba:

    + +

    + htpasswd /usr/local/apache/passwd/passwords dpitts +

    + +

    Obtendrá la misma respuesta que antes, pero el nuevo usuario será agregado + al archivo existente, en lugar de crear un nuevo archivo. + (Es la opción -c la que se cree un nuevo archivo + de contraseñas).

    + +

    Ahora, necesita modificar su archivo .htaccess para que + sea como el siguiente:

    + +

    + AuthType Basic
    + AuthName "By Invitation Only"
    + 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 figure en el archivo password, se le permitirá + el acceso, si escribe la contraseña correcta.

    + +

    Existe otra manera de permitir entrar a múltiples usuarios que + es menos específica. En lugar de crear un archivo de grupo, puede + usar sólo la siguiente directiva:

    + +

    + Require valid-user +

    + +

    Usando eso en vez de la línea Require user rbowen, + le permitirá el acceso a cualquiera que esté listado en el + archivo de contraseñas y que haya introducido correctamente su + contraseña. Incluso puede emular el comportamiento del grupo + aquí, sólo manteniendo un archivo de contraseña para + cada grupo. La ventaja de esta técnica es que Apache sólo + tiene que verificar un archivo, en vez de dos. La desventaja es que + usted tiene que mantener un grupo de archivos de contraseña, y + recordar referirse al correcto en la directiva AuthUserFile.

    +
    top
    +
    +

    Posibles Problemas

    +

    Por la manera en la que la autentificación básica está + especificada, su nombre de usuario y contraseña debe ser verificado + cada vez que se solicita un documento del servidor. Incluso si está + recargando la misma página, y por cada imagen de la página + (si vienen de un directorio protegido). Como se puede imaginar, esto + retrasa un poco las cosas. El retraso es proporcional al + tamaño del archivo de contraseña, porque se tiene que abrir ese + archivo, y recorrer la lista de usuarios hasta que encuentre su nombre. + Y eso se tiene que hacer cada vez que se cargue la página.

    + +

    Una consecuencia de esto es que hay un límite práctico + de cuántos usuarios puede colocar en un archivo de contraseñas. + Este límite variará dependiendo del rendimiento de su equipo + servidor en particular, pero puede esperar observar una disminución + una vez que inserte unos cientos de entradas, y puede que entonces considere + un método distinto de autentificaciên.

    +
    top
    +
    +

    ¿Qué otra cosa +sencilla y efectiva puedo hacer?

    +

    La autentificación por nombre de usuario y contraseña es + sólo parte del cuento. Frecuentemente se desea permitir el acceso + a los usuarios basandose en algo más que quiénes son. Algo como de + dónde vienen.

    + +

    Las directivas Allow y + Deny posibilitan permitir + y rechazar el acceso dependiendo del nombre o la dirección de la + máquina que solicita un documento. La directiva Order va de la mano con estas dos, y le + dice a Apache en qué orden aplicar los filtros.

    + +

    El uso de estas directivas es:

    + +

    + Allow from address +

    + +

    donde address es una dirección IP (o una + dirección IP parcial) o un nombre de dominio completamente + cualificado (o un nombre de dominio parcial); puede proporcionar + múltiples direcciones o nombres de dominio, si lo desea.

    + +

    Por ejemplo, si usted tiene a alguien que manda mensajes no deseados + a su foro, y quiere que no vuelva a acceder, podría hacer lo + siguiente:

    + +

    + Deny from 205.252.46.165 +

    + +

    Los visitantes que vengan de esa dirección no podrán + ver el contenido afectado por esta directiva. Si, por el + contrario, usted tiene un nombre de máquina pero no una + dirección IP, también puede usarlo.

    + +

    + Deny from host.example.com +

    + +

    Y, si le gustaría bloquear el acceso de un dominio entero, + puede especificar sólo parte de una dirección o nombre de + dominio:

    + +

    + Deny from 192.101.205
    + Deny from cyberthugs.com moreidiots.com
    + Deny from ke +

    + +

    Usar Order le permitirá + estar seguro de que efectivamente está restringiendo el acceso + al grupo al que quiere permitir el acceso, combinando una directiva + Deny y una Allow:

    + +

    + Order deny,allow
    + Deny from all
    + Allow from dev.example.com +

    + +

    Usando sólo la directiva Allow no haría lo que desea, porque + le permitiría entrar a la gente proveniente de esa máquina, y + adicionalmente a cualquier persona. Lo que usted quiere es dejar entrar + sólo aquellos.

    +
    top
    +
    +

    Más información

    +

    También debería leer la documentación de + mod_auth y mod_access que + contiene más información acerca de cómo funciona todo esto.

    +
    +
    +

    Idiomas disponibles:  en  | + es  | + ja  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/howto/auth.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/howto/auth.html.ja.utf8 new file mode 100644 index 00000000..bcbfd650 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/howto/auth.html.ja.utf8 @@ -0,0 +1,388 @@ + + + +認証、承認、アクセス制御 - Apache HTTP サーバ + + + + + +
    <-
    +

    認証、承認、アクセス制御

    +
    +

    Available Languages:  en  | + es  | + ja  | + ko 

    +
    +
    This translation may be out of date. Check the + English version for recent changes.
    + +

    「認証」とは、誰かが自分は誰であるかを主張した場合に、 + それを確認するための全過程を指します。「承認」とは、 + 誰かが行きたい場所に行けるように、あるいは欲しい情報を + 得ることができるようにするための全過程を指します。

    +
    + +
    top
    +
    top
    +
    +

    はじめに

    +

    もし機密の情報や、ごくごく少数グループの人向けの情報を + ウェブサイトに置くのであれば、この文書に書かれている + テクニックを使うことで、そのページを見ている人たちが + 望みの人たちであることを確実にできるでしょう。

    + +

    この文書では、多くの人が採用するであろう、 + ウェブサイトの一部分を保護する「一般的な」 + 方法についてカバーしています。

    +
    top
    +
    +

    準備

    +

    この文書で取り扱われるディレクティブは、 + メインサーバ設定ファイル (普通は + <Directory> + セクション中) か、あるいはディレクトリ毎の設定ファイル + (.htaccess ファイル) かで用います。

    + +

    .htaccess ファイルを用いるのであれば、 + これらのファイルに認証用のディレクティブを置けるように + サーバの設定をしないといけないでしょう。これは + AllowOverride + ディレクティブで可能になります。 + AllowOverride + ディレクティブでは、ディレクトリ毎の設定ファイル中に置くことのできる + ディレクティブを、もしあれば、指定します。

    + +

    認証について話を進めているので、次のような + AllowOverride + ディレクティブが必要になるでしょう。

    + +

    + AllowOverride AuthConfig +

    + +

    そうでなく、メインサーバ設定ファイルの中に + 直接置くのであれば、当然ながらそのファイルへの書き込み + 権限を持っていなければならないでしょう。

    + +

    また、どのファイルがどこに保存されているか知るために、 + サーバのディレクトリ構造について少し知っておく + 必要があるでしょう。 + これはそんなに難しくないので、この文書中で + ディレクトリ構造について知っておく必要がある場面では、 + 明らかになるようにします。

    +
    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/apache/htdocs/secret> セクションに + 配置して、次のディレクティブを使うことができます。

    + +

    + AuthType Basic
    + AuthName "Restricted Files"
    + AuthUserFile /usr/local/apache/passwd/passwords
    + Require user rbowen +

    + +

    個々のディレクティブについて見てみましょう。 + AuthType + ディレクティブはどういう認証方法でユーザの認証を行うかを + 選択します。最も一般的な方法は Basic + で、これは mod_auth + で実装されています。しかしながら、 + これは気を付けるべき重要なポイントなのですが、 + Basic 認証はクライアントからブラウザへ、 + パスワードを暗号化せずに送ります。ですから、 + この方法は特に機密性の高いデータに対しては用いるべきでは + ありません。 Apache ではもう一つ別の認証方法: + AuthType Digest をサポートしています。 + この方法は mod_auth_digest + で実装されていて、もっと安全です。 + ごくごく最近のクライアントしか Digest + 認証をサポートしていないようです。

    + +

    AuthName + ディレクティブでは、認証に使う Realm (訳注: 領域) + を設定します。Realm は大きく分けて二つの機能を提供します。 + 一つ目は、クライアントがパスワードダイアログボックスの + 一部としてユーザにこの情報をよく提示する、というものです。 + 二つ目には、クライアントが与えられた認証領域に対してどのパスワードを + 送信すれば良いのかを決定するために使われる、という機能です。

    + +

    例えば、"Restricted Files" 領域中で + 一度認証されれば、同一サーバ上で "Restricted Files" + Realm としてマークされたどんな領域でも、クライアントは + 自動的に同じパスワードを使おうと試みます。 + このおかげで、複数の制限領域に同じ realm を共有させて、 + ユーザがパスワードを何度も要求される事態を + 防ぐことができます。もちろん、セキュリティ上の理由から、 + サーバのホスト名が変わればいつでも必ず、 + クライアントは再びパスワードを尋ねる必要があります。

    + +

    AuthUserFile + ディレクティブは htpasswd で作った + パスワードファイルへのパスを設定します。 + ユーザ数が多い場合は、リクエスト毎のユーザの認証のための + プレーンテキストの探索が非常に遅くなることがあります。 + Apache ではユーザ情報を高速なデータベースファイルに + 保管することもできます。 + mod_auth_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"
    + 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
    +
    +

    もっと巧みに制御できない +?

    +

    ユーザ名とパスワードによる認証は認証の一つの方法に過ぎません。 + しばしば誰であるかということとは違う何かに基づいて、 + 入れるようにしたくなることもあるでしょう。 + 例えばその人がどこから来ているかといったことです。

    + +

    Allow と + Deny + ディレクティブを使って、ドキュメントを要求してきたマシンの + ホスト名やホストアドレスに基づいて許可不許可を制御できます。 + Order + ディレクティブはこの二つと連携して動作し、Apache + にどの順番でフィルタを適用するかを知らせます。

    + +

    これらのディレクティブの使い方は次のようになります。

    + +

    + 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 と + mod_access + の文書も読むとよいでしょう。

    +
    +
    +

    Available Languages:  en  | + es  | + ja  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/howto/auth.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/howto/auth.html.ko.euc-kr new file mode 100644 index 00000000..f79cc967 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/howto/auth.html.ko.euc-kr @@ -0,0 +1,325 @@ + + + +ÀÎÁõ(Authentication), ±ÇÇѺο©(Authorization), +Á¢±ÙÁ¦¾î(Access Control) - Apache HTTP Server + + + + + +
    <-
    +

    ÀÎÁõ(Authentication), ±ÇÇѺο©(Authorization), +Á¢±ÙÁ¦¾î(Access Control)

    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + es  | + ja  | + ko 

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

    ÀÎÁõ(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 + ÀÎÁõÀº ºê¶ó¿ìÀú°¡ ¼­¹ö·Î ¾ÏÈ£¸¦ ¾ÏȣȭÇÏÁö ¾Ê°í º¸³½´Ù. + ±×·¯¹Ç·Î ±â¹Ð ÀڷḦ º¸È£ÇϱâÀ§ÇØ ÀÌ ¹æ¹ýÀ» »ç¿ëÇÏ¸é ¾ÈµÈ´Ù. + ¾ÆÆÄÄ¡´Â AuthType Digest¶ó´Â ÀÎÁõ ¹æ¹ýµµ Áö¿øÇÑ´Ù. + ÀÌ ¹æ¹ýÀº mod_auth_digest°¡ ±¸ÇöÇϸç, ¸Å¿ì + ¾ÈÀüÇÏ´Ù. °¡Àå Ãֱ٠Ŭ¶óÀ̾ðÆ®µé¸¸ÀÌ Digest ÀÎÁõÀ» Áö¿øÇÑ´Ù°í + ÇÑ´Ù.

    + +

    AuthName Áö½Ã¾î´Â + ÀÎÁõ¿¡ »ç¿ëÇÒ ¿µ¿ª(realm)À» ÁöÁ¤ÇÑ´Ù. ¿µ¿ªÀº + µÎ°¡Áö ¿ªÇÒÀ» ÇÑ´Ù. ù¹ø°´Â Ŭ¶óÀ̾ðÆ®°¡ º¸Åë ÀÌ Á¤º¸¸¦ + ¾ÏÈ£ ´ëȭâ¿¡ º¸¿©ÁØ´Ù. µÎ¹ø°´Â ¿µ¿ª Á¤º¸¸¦ »ç¿ëÇÏ¿© + Ŭ¶óÀ̾ðÆ®°¡ ƯÁ¤ ÀÎÁõ±¸¿ª¿¡ ¾î¶² ¾ÏÈ£¸¦ º¸³¾Áö °áÁ¤ÇÑ´Ù.

    + +

    ¿¹¸¦ µé¾î, ÀÏ´Ü Å¬¶óÀ̾ðÆ®°¡ "Restricted Files" + ¿µ¿ª¿¡ ÀÎÁõÀÌ ¼º°øÇÏ¿´´Ù¸é, Ŭ¶óÀ̾ðÆ®´Â ÀÚµ¿À¸·Î °°Àº ¼­¹ö¿¡¼­ + "Restricted Files" ¿µ¿ªÀ¸·Î Ç¥½ÃµÈ ±¸¿ª¿¡ ´ëÇØ + µ¿ÀÏÇÑ ¾ÏÈ£¸¦ ½ÃµµÇÑ´Ù. ±×·¡¼­ ¿©·¯ Á¦ÇÑ ±¸¿ªÀÌ °°Àº ¿µ¿ªÀ» + °øÀ¯ÇÏ¸é »ç¿ëÀÚ°¡ ¿©·¯¹ø ¾ÏÈ£¸¦ ÀÔ·ÂÇÏÁö ¾Ê¾Æµµ µÈ´Ù. ¹°·Ð + º¸¾È»ó ÀÌÀ¯·Î Ŭ¶óÀ̾ðÆ®´Â ¼­¹öÀÇ È£½ºÆ®¸íÀÌ ´Ù¸£¸é Ç×»ó + »õ·Î ¾ÏÈ£¸¦ ¹°¾îº»´Ù.

    + +

    AuthUserFile + Áö½Ã¾î´Â ¿ì¸®°¡ ¹æ±Ý htpasswd·Î ¸¸µç ¾ÏÈ£ÆÄÀÏÀÇ + °æ·Î¸¦ ¼³Á¤ÇÑ´Ù. »ç¿ëÀÚ°¡ ¸¹´Ù¸é ¿äû¸¶´Ù ¸Å¹ø »ç¿ëÀÚ¸¦ + ÀÎÁõÇϱâÀ§ÇØ ÀÏ¹Ý ¹®¼­ÆÄÀÏÀ» °Ë»öÇϴµ¥ ½Ã°£ÀÌ »ó´çÈ÷ ¸¹ÀÌ + °É¸± ¼ö ÀÖ´Ù. ¾ÆÆÄÄ¡´Â ºü¸¥ µ¥ÀÌŸº£À̽º ÆÄÀÏ¿¡ »ç¿ëÀÚ Á¤º¸¸¦ + ÀúÀåÇÒ ¼ö ÀÖ´Ù. mod_auth_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¿Í + mod_access ¹®¼­¿¡ Á¢±ÙÁ¦¾î°¡ µ¿ÀÛÇÏ´Â + ¹æ¹ý¿¡ ´ëÇÑ ´õ ¸¹Àº Á¤º¸°¡ ÀÖ´Ù.

    +
    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + es  | + ja  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/howto/cgi.html b/rubbos/app/httpd-2.0.64/docs/manual/howto/cgi.html new file mode 100644 index 00000000..61f160a2 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/howto/cgi.html @@ -0,0 +1,13 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: cgi.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +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/rubbos/app/httpd-2.0.64/docs/manual/howto/cgi.html.en b/rubbos/app/httpd-2.0.64/docs/manual/howto/cgi.html.en new file mode 100644 index 00000000..c3299f6c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/howto/cgi.html.en @@ -0,0 +1,555 @@ + + + +Apache Tutorial: Dynamic Content with CGI - Apache HTTP Server + + + + + +
    <-
    +

    Apache Tutorial: Dynamic Content with CGI

    +
    +

    Available Languages:  en  | + 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 the simplest, and most common, 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.

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

    + +

    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.

    + +

    In addition, if your CGI program depends on other environment variables, you will need to + assure that those variables are passed by Apache.

    + + + +

    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 + http://hoohoo.ncsa.uiuc.edu/cgi/env.html.

    + +

    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
    + print "Content-type: text/html\n\n";
    + foreach $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 + http://www.boutell.com/cgic/.

    +
    top
    +
    +

    For more information

    + + +

    There are a large number of CGI resources on the web. You + can discuss CGI problems with other users on the Usenet group + comp.infosystems.www.authoring.cgi. And the -servers mailing + list from the HTML Writers Guild is a great source of answers + to your questions. You can find out more at + http://www.hwg.org/lists/hwg-servers/.

    + +

    And, of course, you should probably read the CGI + specification, which has all the details on the operation of + CGI programs. You can find the original version at the + NCSA and there is an updated draft at the + Common Gateway + Interface RFC project.

    + +

    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  | + ja  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/howto/cgi.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/howto/cgi.html.ja.utf8 new file mode 100644 index 00000000..51168ac5 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/howto/cgi.html.ja.utf8 @@ -0,0 +1,546 @@ + + + +Apache Tutorial: CGI による動的コンテンツ - Apache HTTP サーバ + + + + + +
    <-
    +

    Apache Tutorial: CGI による動的コンテンツ

    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    +
    This translation may be out of date. Check the + English version for recent changes.
    +
    + +
    top
    +
    +

    はじめに

    + + + + +

    CGI (Common Gateway Interface) は、ウェブサーバが + コンテンツ生成をする外部プログラムと協調して動作するための方法を + 定義しています。そのプログラムはしばしば CGI プログラムや + CGI スクリプトと呼ばれます。CGI は、ウェブサイトに動的な + コンテンツを置くための最も簡単で一般的な方法です。このドキュメントは、 + Apache ウェブサーバで CGI を設定し、 + CGI プログラムを書き始めるための入門書となるでしょう。

    +
    top
    +
    +

    CGI を許可するように Apache を設定する

    + + +

    CGI プログラムを正しく動作させるには、CGI を許可するように + Apache の設定を行う必要があります。 + これを行なうための方法がいくつかあります。

    + +

    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://dev.rcbowen.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 files

    + + +

    .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-type + ヘッダを付けなければなりません。 + これはどのような種類のコンテンツを受け取っているかをクライアントに示す + 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 + プログラムが失敗するのは大抵、プログラム自身に問題がある場合です。 + 一度 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 + バグデータベースに送るべきでない + ことに注目してください。

    +
    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/howto/cgi.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/howto/cgi.html.ko.euc-kr new file mode 100644 index 00000000..0486a222 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/howto/cgi.html.ko.euc-kr @@ -0,0 +1,503 @@ + + + +¾ÆÆÄÄ¡ ÅõÅ丮¾ó: CGI¸¦ »ç¿ëÇÑ µ¿Àû ÆäÀÌÁö »ý¼º - Apache HTTP Server + + + + + +
    <-
    +

    ¾ÆÆÄÄ¡ ÅõÅ丮¾ó: CGI¸¦ »ç¿ëÇÑ µ¿Àû ÆäÀÌÁö »ý¼º

    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + 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  | + ja  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/howto/htaccess.html b/rubbos/app/httpd-2.0.64/docs/manual/howto/htaccess.html new file mode 100644 index 00000000..9c5991ce --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/howto/htaccess.html @@ -0,0 +1,13 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: htaccess.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +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 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/howto/htaccess.html.en b/rubbos/app/httpd-2.0.64/docs/manual/howto/htaccess.html.en new file mode 100644 index 00000000..f9d6614f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/howto/htaccess.html.en @@ -0,0 +1,386 @@ + + + +Apache Tutorial: .htaccess files - Apache HTTP Server + + + + + +
    <-
    +

    Apache Tutorial: .htaccess files

    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + +

    .htaccess files provide a way to make configuration +changes on a per-directory basis.

    +
    + +
    top
    +
    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 never use .htaccess files unless + you don't have access to the main server configuration file. There is, + for example, a prevailing misconception that user authentication should + always be done 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.

    + +

    .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, Apache 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 Apache 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, Apache 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.)

    + +

    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 Apache 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 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:

    + +

    +<Directory />
    + +Allowoverride All
    +
    +</Directory>
    +
    +<Location />
    + +Options +IncludesNoExec -ExecCGI
    +
    +</Location> +

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

    + +

    You must have "AllowOverride AuthConfig" in effect for + these directives to be honored.

    + +

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

    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. 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 Apache error log. It will likely tell you + that the directive used in your .htaccess file is not + permitted. Alternately, it may tell you that you had a syntax error, + which you will then need to fix.

    + +
    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/howto/htaccess.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/howto/htaccess.html.ja.utf8 new file mode 100644 index 00000000..bafb8b7c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/howto/htaccess.html.ja.utf8 @@ -0,0 +1,347 @@ + + + +Apache チュートリアル: .htaccess ファイル - Apache HTTP サーバ + + + + + +
    <-
    +

    Apache チュートリアル: .htaccess ファイル

    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    +
    This translation may be out of date. Check the + English version for recent changes.
    + +

    .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 のみが + 効力を持ち、それがすべての以前の設定を上書きするからです。

    +
    top
    +
    +

    認証の例

    + +

    もし認証の方法を知るためにこの部分に直接来たのであれば、次のことを + 知っておくことが重要です。よくある誤解に、パスワード認証を行なうためには + .htaccess ファイルを使う必要がある、というものがあります。 + これは正しくありません。主サーバ設定ファイルの <Directory> セクションに + 認証用のディレクティブを書く方が推奨される方法で、.htaccess + ファイルは主サーバ設定ファイルを変更できないときにのみ使用すべきです。 + いつ .htaccess ファイルを使うべきで、いつ使うべきではないかに + ついては 上を参照してください。

    + +

    以上のことをふまえた上で、もし .htaccess の使用が + まだ必要だと思う場合は、次のようなものが望みのことをしてくれるかも + しれません。

    + +

    ディレクティブが適用されるためには、 + "AllowOverride AuthConfig" の設定がなされている + 必要があります。

    + +

    .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 ファイルで + 使用されたディレクティブが許可されていない、ということを知らせている + 可能性が高いです。または、構文の間違いがあることを述べているかもしれません。 + その場合にはまずそれを修正する必要があります。

    + +
    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/howto/htaccess.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/howto/htaccess.html.ko.euc-kr new file mode 100644 index 00000000..7fcb2b92 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/howto/htaccess.html.ko.euc-kr @@ -0,0 +1,334 @@ + + + +¾ÆÆÄÄ¡ ÅõÅ丮¾ó: .htaccess ÆÄÀÏ - Apache HTTP Server + + + + + +
    <-
    +

    ¾ÆÆÄÄ¡ ÅõÅ丮¾ó: .htaccess ÆÄÀÏ

    +
    +

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

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

    .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 ÆÄÀÏÀÌ + ÇÊ¿äÇÏ´Ù°í »ý°¢µÇ¸é ¾Æ·¡ ¼³Á¤ÀÌ µµ¿òÀÌ µÉ °ÍÀÌ´Ù.

    + +

    ÀÌ Áö½Ã¾î°¡ µ¿ÀÛÇÏ·Á¸é "AllowOverride AuthConfig"°¡ + ÀÖ¾î¾ß ÇÑ´Ù.

    + +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/howto/index.html b/rubbos/app/httpd-2.0.64/docs/manual/howto/index.html new file mode 100644 index 00000000..4f3357b3 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/howto/index.html @@ -0,0 +1,13 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: index.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +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 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/howto/index.html.en b/rubbos/app/httpd-2.0.64/docs/manual/howto/index.html.en new file mode 100644 index 00000000..5ef8dc03 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/howto/index.html.en @@ -0,0 +1,105 @@ + + + +How-To / Tutorials - Apache HTTP Server + + + + + +
    <-
    +

    How-To / Tutorials

    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    +
    +
    top
    +
    +

    How-To / Tutorials

    + + + +
    +
    Authentication
    +
    +

    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, and 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 the simplest, and most common, 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

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

    +
    +
    + +
    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/howto/index.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/howto/index.html.ja.utf8 new file mode 100644 index 00000000..cd111ec5 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/howto/index.html.ja.utf8 @@ -0,0 +1,102 @@ + + + +How-To / チュートリアル - Apache HTTP サーバ + + + + + +
    <-
    +

    How-To / チュートリアル

    +
    +

    Available Languages:  en  | + ja  | + ko 

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

    +
    +
    + +
    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/howto/index.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/howto/index.html.ko.euc-kr new file mode 100644 index 00000000..14434cc7 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/howto/index.html.ko.euc-kr @@ -0,0 +1,107 @@ + + + +How-To / ÅõÅ丮¾ó - Apache HTTP Server + + + + + +
    <-
    +

    How-To / ÅõÅ丮¾ó

    +
    +

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

    +
    +
    +
    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  | + ja  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/howto/public_html.html b/rubbos/app/httpd-2.0.64/docs/manual/howto/public_html.html new file mode 100644 index 00000000..f67a8c66 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/howto/public_html.html @@ -0,0 +1,17 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: public_html.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +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/rubbos/app/httpd-2.0.64/docs/manual/howto/public_html.html.en b/rubbos/app/httpd-2.0.64/docs/manual/howto/public_html.html.en new file mode 100644 index 00000000..df6751db --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/howto/public_html.html.en @@ -0,0 +1,163 @@ + + + +Per-user web directories - Apache HTTP Server + + + + + +
    <-
    +

    Per-user web directories

    +
    +

    Available Languages:  en  | + 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.

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

    + +
    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 enabled
    + 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 changed. 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  | + ja  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/howto/public_html.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/howto/public_html.html.ja.utf8 new file mode 100644 index 00000000..1fc52c9f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/howto/public_html.html.ja.utf8 @@ -0,0 +1,157 @@ + + + +ユーザ毎のウェブディレクトリ - Apache HTTP サーバ + + + + + +
    <-
    +

    ユーザ毎のウェブディレクトリ

    +
    +

    Available Languages:  en  | + 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 +

    + +

    上の設定は 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 チュートリアル を読んで + ください。

    + +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/howto/public_html.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/howto/public_html.html.ko.euc-kr new file mode 100644 index 00000000..782bd448 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/howto/public_html.html.ko.euc-kr @@ -0,0 +1,158 @@ + + + +»ç¿ëÀÚº° À¥µð·ºÅ丮 - Apache HTTP Server + + + + + +
    <-
    +

    »ç¿ëÀÚº° À¥µð·ºÅ丮

    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + 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  | + ja  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/howto/public_html.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/howto/public_html.html.tr.utf8 new file mode 100644 index 00000000..0788ed25 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/howto/public_html.html.tr.utf8 @@ -0,0 +1,167 @@ + + + +Kullanıcı Dizinleri (public_html) - Apache HTTP Sunucusu + + + + + +
    <-
    +

    Kullanıcı Dizinleri (public_html)

    +
    +

    Mevcut Diller:  en  | + 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.

    +
    + +
    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/siteler/*/sayfam +

    + +

    http://example.com/~orhan/dosya.html adresine karşılık + gelen dosya yolu /var/siteler/orhan/sayfam/dosya.html + olarak çözümlenir.

    + +
    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 enabled
    + UserDir disabled root ahmet mustafa +

    + +

    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  | + ja  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/howto/ssi.html b/rubbos/app/httpd-2.0.64/docs/manual/howto/ssi.html new file mode 100644 index 00000000..477d79ca --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/howto/ssi.html @@ -0,0 +1,13 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: ssi.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +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/rubbos/app/httpd-2.0.64/docs/manual/howto/ssi.html.en b/rubbos/app/httpd-2.0.64/docs/manual/howto/ssi.html.en new file mode 100644 index 00000000..f03a467d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/howto/ssi.html.en @@ -0,0 +1,486 @@ + + + +Apache Tutorial: Introduction to Server Side Includes - Apache HTTP Server + + + + + +
    <-
    +

    Apache Tutorial: Introduction to Server Side Includes

    +
    +

    Available Languages:  en  | + 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.

    + +

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

    +

    + <!--#element 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 element 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 element 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 element.

    + +

    If you don't like the format in which the date gets printed, + you can use the config element, 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 element 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 + element 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 element:

    +

    + <!--#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

    + + +

    I expect that I'll have an article some time in the coming + months about using SSI with small CGI programs. For now, here's + something else that you can do with the exec + element. 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.

    + +

    Caveat

    + +

    Most of the features discussed in this article are only + available to you if you are running Apache 1.2 or later. Of + course, if you are not running Apache 1.2 or later, you need to + upgrade immediately, if not sooner. Go on. Do it now. We'll + wait.

    + + +

    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. Here are some examples of how one might use this + construct.

    + +

    In your configuration file, you could put the following + line:

    +

    + BrowserMatchNoCase macintosh Mac
    + BrowserMatchNoCase MSIE InternetExplorer +

    + +

    This will set environment variables ``Mac'' and + ``InternetExplorer'' to true, if the client is running Internet + Explorer on a Macintosh.

    + +

    Then, in your SSI-enabled document, you might do the + following:

    +

    + <!--#if expr="${Mac} && ${InternetExplorer}" -->
    + Apologetic text goes here
    + <!--#else -->
    + Cool JavaScript code goes here
    + <!--#endif --> +

    + +

    Not that I have anything against IE on Macs - I just + struggled for a few hours last week trying to get some + JavaScript working on IE on a Mac, when it was working + everywhere else. The above was the interim workaround.

    + +

    Any other variable (either ones that you define, or normal + environment variables) can be used in conditional statements. + With Apache's ability to set environment variables with the + SetEnvIf directives, and other related directives, + this functionality can let you do some pretty involved dynamic + stuff without ever resorting to CGI.

    + +
    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  | + ja  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/howto/ssi.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/howto/ssi.html.ja.utf8 new file mode 100644 index 00000000..4e83b0fd --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/howto/ssi.html.ja.utf8 @@ -0,0 +1,481 @@ + + + +Apache チュートリアル: Server Side Includes 入門 - Apache HTTP サーバ + + + + + +
    <-
    +

    Apache チュートリアル: Server Side Includes 入門

    +
    +

    Available Languages:  en  | + 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 + や動的なウェブページを生成する他の技術に代わるものではありません。 + しかし、たくさんの余分な作業をせずに、 + 少量の動的なコンテンツを加えるにはすぐれた方法です。

    +
    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/howto/ssi.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/howto/ssi.html.ko.euc-kr new file mode 100644 index 00000000..f849bd67 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/howto/ssi.html.ko.euc-kr @@ -0,0 +1,426 @@ + + + +¾ÆÆÄÄ¡ ÅõÅ丮¾ó: Server Side Includes ¼Ò°³ - Apache HTTP Server + + + + + +
    <-
    +

    ¾ÆÆÄÄ¡ ÅõÅ丮¾ó: Server Side Includes ¼Ò°³

    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + 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  | + ja  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/images/apache_header.gif b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/manual/images/custom_errordocs.gif b/rubbos/app/httpd-2.0.64/docs/manual/images/custom_errordocs.gif new file mode 100644 index 0000000000000000000000000000000000000000..d566c5d891e5c574267fe715fc10706c5702b790 GIT binary patch literal 23291 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/images/custom_errordocs.png b/rubbos/app/httpd-2.0.64/docs/manual/images/custom_errordocs.png new file mode 100644 index 0000000000000000000000000000000000000000..f2b94907cebebb7a518f2445a128ea9f44ab2e2e GIT binary patch literal 22907 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

  • tGsqDN#!CkT80X|R)*9VGR&6VD~k=r6fdp)w}R3p=IECjld zQ?lIW8nOVOba)%OvDt2)xh>;3_)74x$%XCBebz0--E}>k+|r}n=Ftzw)~n& zV7Inm)m{`_R z1)@`N?3&iL`zT2UWhSh6B&B2*JxvgC1W9@+PO{Hudsk$5tA6Q3}bdru?;H-#WB|s zAumYANJ!e-`|{gA`FF)^>#IW0&Lf~ja`^`*`n3>@loP$Z;(zUM^WAKuls3M@ynT#{ zvD!O8eD2@1Yw&`9S2T$Mp;ZZjwF_WBOI9p}oM~mlDkoZtb) z;A^w&CM6L1o5UymPAg{fqVdI-vxG0*L~`)10)gA8&Bff06g=K!n0jm{4ca(l>D*tn z?xD*u`<-uxtxWH}dZLMizX%sh3zFc|ieHKsOf+X&p`^NqK>+(JCEvk@yjPz@F ztP2w-_t5oS6HyK8E-#WGnoKBkBfIwtZ8K|ykLMfpF%XcoLL~!ln>yyBfiMLp<89$A z^MpL2w(1~tH=IJ`g@OG+A#jgxRD>r52=aaKY5ro56;rs{Ux3KCGW-yyru8-=?5Xz< z&pHMpJ7LS`Y2n4pH9o|cW!KINO|?#d2e9!pcQT{*uI~&g?lns-Uwj(MIHY%g$3?_bA+uljMf#0hB5zhaGG+mmn z*N|VRJk{ptLDPcu7tQJk1{_n8Duiq_Cp1u0)@5Q7IoUA&^$P6F6L-plSxk79hoBsm zUEZ>pD=MC#9l}QszJE)o!`=H$ln-f0s+Gm-c$Ocwje|thg6jp?$@Jx*SkmR1K1R$cw z*W|gYL3?uH;KgL`maz?nqp%aJLspveAX!hN^_#(57~2A^7L+*^R1@Bc8g3)+}+OYJ*YF4;AD@ww!52&RXui_|?&->t#|H&3xL@pkD(*kQTdV-V&H2U9f^ zZll0-w(+r2+agk(QUa?mr4pm~5-J^m%iX|4Njnw&>URPz3R-@FHj3Z{v7XUeDX3pp z)WqVWNZGrZ0T*onz6R9ofqZqf+d>BHy!0*Gj|Mb0BfXXucoML>lWd7%! z!&`uzNA0|x8}704#M+*%iiCe)FnbyqKwhszDffp|_MW3XOU?bB4%cysKc227PKpwe3{`qw$bf+T|;@fXHdytMIE1K?KWAM4r zY=uvOF5L|(VJ*^aWcRXYff)^jy%tS5^gwMm-t@J!?Km1tUAp;K^ZL@a*rmBLlzeCC>nGEVifx?kKC^h6j}gU*kE#j zEOk*@I&}$?j7@Kgzmo|w@|WDoKVGVlh{R_uQ9FrWJcKh~3GaUWuvNFEC_nDYrcQ0N z#I}Wb&QZN$m)$W_MPy(N!}jyIQcIS+&sLLK&8B%k1@j6hp&vTG^v@VDO|>y=1oDKX z%R&{Ssv}1m23M}GB_b5l+)ZEV1rxiA689_rr8wq$46H<6I3^rIrr} z-9I99pA}cmNXitG8drSJRPmM>iFQRB?N#O)_x0?wjfj0;+q)yoXn|(CkoP(rPmpX% z{OVv6EAD4;36a#jY2&dP$0s`5H6HiI*5|&>UUK{$8|ujLmt@P2&__~{xi*0Mp62>} z^P-B=d-dcV00mh7)>Z>pY&)H6JN@Y;VvpTna-sTEU7KlukE;t!OOKm#KDAo?IqmdE zAZwpB=-^J4$XA9qXp-WSWFL2*`!_#3%ZQ!k;5q0dh(td)aQ~X_zDvTVwv}JAUE^3% zA*E)mtn*HLSk`Ib$v@1U|1bk0R30`5SR|D7v`iU~tqv%0#)>7PByWMzKJvLP2g>}z zP!ag32E3gGz=dAp7pCTZZNK7Fr8(I8#Mm4e6%`||kN`CVKh?Q8T%(3Q)ocWShux-+*AAhGdq>5O;-`9OZIP;sNJ9e1i~D zl*0uWCYbnl1A2eTFzNTS>3z;u95GQ5?W#&jN(xFGRD)>959d$+gieQC;s+KCD6C%B z=v}X`4nMtlwZ1AB(I{-{pw1d+6W>-bd+8eSq>X4jyW*SViQl9b=;Ap2cgNBIeWy`o z?nLVfJBJeB1INRMC&)8$`R}Kt)Y1rfyDY{jKw1b`P^5HjZRZ^9pnXDK-4J!KH=91@ zUB#qJS9>F#D9-2j62N+acTVueNe(eKao7Xv)#^P?u94SB83i_~2Tt!m$#Pb#%{K?e z9Tr_#YiF&6cEXNXm~V!Ou)Zudj$^M=sH zU^Rp?+bcfnCUjHNK>TfZMRX_1-Q)iKT1bSlYQ?7YbeOrV$NTvUbBQA+qfrZ_1o_ zZw7s0e;NR&zWuI|bP+X7_ZA=li=!7r+k8X(Z^7j+wUer9WJLrngBK z1JJ;>xP|az*EOForZ9~t*c9|}>hM@9ZlZ>}f>ti3Rsc<+ce9j!&1+edqe1Wba{N#x zusMVx1!3Pr_|4!eRj}b z^Y3{tK0Aky@*fKARfeBj9&EAgUaVYlf_{wRUj?cj1bmmyu>Tv3B%S~?;y_`_cN89y z3lHvII*zUHvxX2fUxhNuj)|UN-})QryZA{KhDB5nx1jhiiQ%7byvH*(>?0R&A(*FTObg3flkb47I)~4 zhy+4A>S~)pj`OPE&DgI;aDKS8dYXwcx8vG1%F~U9&_eb zhwM96qWuJk@nq$Z{`hmZx$C&u*5#&eP{u5oNqcA3@-Uak#L*8&W3m1Sq0i}CFrB84 zKW6}+op`JR2h{@7Fq~})Ca(~YZ{oV0vRU$oI%V6ftm>S)M1dv{u6{6b^_5a=HNgFmr(s$8k_r;*DC7F ze^-v*hFL3iB_E_O!2lMA=+eQGVI+zRn=Xi(P;;J_mY%Xi|Rq#d{3M0phF{gLGDKRq?@`W-bq6O5=W=KD@v5#>DQuA zx(928O+w?$Bzi!<=P!Rb;;C~Mq7LdKss^o`7vx+jmE9g_5!J=lf*OctlKG)LOM(sW zUE?o4(v$uCRh>G3f zA81hMG(g*Idruj|dTF+6u37oBE0Z^ znjYPj_SoNQ54$Ao?~N_=<|9cbU_If7FL@#YoYx3ALm=Fuu$y9DqjRgDNi)3iO7+tq z2?EiBmv4t4N#KvDZ)+#JvnN6gyh%S!=%EV~Sivq9QB5tMjBkKI(&3=5R%|Z20@=j! zm%p?Et`~N!*;$zqVg?Ige@mKQK&`0o6T>@Yd9#Q}B8r|JLxO!j8EnG5!%3qHX_j9q zZ^`>pvC949w`89Rz$CJU&eW00bAS^xY-68_6{$jZnTmc#whF{ z;J9d{=E3Y9O(*=lRYQ=JnTYP0uqwj0&|<3>oMxY_7iwl818ZGNBql3=%m)CKxWvgAP+Z)u^lb*VC}NG^5JxP1A1t+$X;)Q>&bO6Bn- z-pYyucL>W8zD1O_SiyD4!Rrk9usTBB;f)=2nvoon@{7{XrF!L`HKq3D>pp|!{m><3 zw08pbGNm;z&U;cCOlr&J^#-4@O~-=9f6vWq7_WB{%0!jH$KTQINog z_%E*Yi=ISW`K2`A9z+)gkNW7pg-6_o+o|_vcj9YknEMzi=KQwsq=CtQT7%?Rt>w29 ztJ)9S*&d(hE*37d($*P5sjZ>h8Yj}Vag=_0y~iSeeR>WIV=@)u{3-TwppYCq`r{RQ zSTdPil5hZbTqqG=;Ykm1@5lRa6^@dZRI^&cVqxkdh=`rNTTXD)>vUth9^6K@Wj}qe zpuxJ&0P#itL7N2$Qb9y?wvdK@b8+$Ti_5}v&wfE;%P=2{=ll#}A3NI2Q17eXq|r7} z(eU1TX9Nuc+k{mRFO!D2Fv)SH!K4uHyZf zm#80*+Jcr4v9;6ap1|J#WtTD+c=2q)KFjJPZ=cMrLdJ(4n$!ks0EIA&$m$`K6x;I? zq$cvDR+l*yrKE{`_} za8}1hq6S-(0JOw==Q-TqH<&Bj1mddoad?>TJ>rYju8THmacHD8dHkHfo@ z1~>accsQ8~^71`S`~Ch5b3&#++=|<`SAm2jGg_-PMTAMpi}x$U>eS;x&rRO;gwS)_ zc=h>6H}=%m*#kI--tE$S_eBZCxs$oNlr56t>5JIplX&tY@D7u8D?uU7{^L{bg(1o2gOkE(EvVC`HwDQijBU9HjfjD3x*VW!6E?QIRlPA|(HNshK$hv62TO3aVQb@t?{i2AbGEMLKlAPb$ z{FVHGe2l4^Pr4s$dBMtp2#kb2hfU#1Ua1gcVI^-E-=g1$zWyVM(H6qLU@eXM8aaAG z!l|%kncsEGnrtvTz=;8ZPG0O)(4hPZLDK*#6Uh}Tb4AxtYvy=7D!c_rn5&PZzTYe_ z<_*pQv=Srb3u%6UzhYi>mG7PB+5J^`5hn#G+h|7!=e?8vU{RrXl@No{DR*--q?g-yc64`Pu@9O zzttcIComcUPp+H8LxL0%EQzw{DBk?Hr!-LGx9WGhwj&-2#xVx!4D+dppl!910c3es z-4e6UCokApO#3Ptmm=InsHgECWlz7EvwBnRx=z`ABCMYRlo4G1%=K|9y|f9?u@;JB zXYm_!qjI2Mhy5C10o1H!Ei)Co(>Me^eWXdP+5RGH%&C+HN z8Qx(I;>^V<+UJwUX+^9xF!lFh*($JWM4f%B=?WkyUbcGbQp8eCk|HjRe%m=)yT9IkDr3ibrm)2%OY# zNYUvJ8@0r0tl?4<#joVrsjhlbVQ`yFcCcv zQW}{T0edqS8YRZDkEP1m)IUf5|W(i__f4H0wh`UBY2#ji4xA`^5(VQSNPI#g1^ECPPjtggQ+}+ zM>{gr+bwy<^b&0Mj4noUl8dNQbsUFOnD4_i1W>)VZ{PcI4_M2GJWSUHzW1wG+xwIo z2*tTomA;!+Yd=s;KwZ;<$8KM)4wT89piU;flr6HQnZc!*vS)4D8Ue3|g9k zY_gIz{p_(~)mBTTkOcwpAT33vYy2DNKT4H+y_YG`}-iB==V!vlJt?_nz z`m?HQngFiqXUL0Y!P+GT=Zxn=lj8Ak{6NBNs-TFO!hHyo&2&s>EGm!5Rho62YW`}> zLqdT_qP&04uj6>CsU)E$Tw;vs6gPR})JF#UF+79TE?B!F6&8Df%+x|9?zh*rB{EeJry;MFgcwzfAI6)Fck`b- zuQ99h*^acH)n2KGK{c$uDku&5iG7%__yvgF7Izv2+8^w^T<|-tIAT-%P`}T_*E5l) zq!k+Ki|XAkd$ZI22bRScJs<0LtH)$MQ_P9n+5pt_+G8eufM|Ru*~h}I>h0v^0a%G_ zt7&cL@uysmA^%n7A|)N{5EeCewYElkrII2bri+$t@u~2a%#nk5E>$fD(mx%xzCXkK z_H{~D^sQu=bU;tu&3KQS$o3gl;o>ygPM0;_yk`wwp=koEpShplzDVHcXRfH2>8Oqd zdYpunNrnNe$Y)-W^{@u5pAMqfj;s&y)t{YRbAdu85PL1MlS{^n+tdr2vgQ+S^qkIq z&dsvoXpBdA`FW{yD)>IBl1fC!r7|Sk2NVQclTuHC+Z6e(#!RNuNXJ4Mix#`TzJze{8PNBj%RJ}OuNn1A1kNH!hsrLQS zKzo3o zprA02A|6=>v}N2$cE?<5wo5gub+P!zZB~;NQ>u~Xq}YP*m05W3nS6^&qS3OX3o@sI z#iv=pzY5T72>mS{rp^*F*%T^1rSccmPJQ~6r6IN1B}?3PSwANEgft;hGfoEd>x49J zf>^YbVf?*FitwCIgA~%hU-GP?GCk0o&1!|X;pVHSIyH{vX!1mn&!Y)x%0!<_fbPJQ zxOvT!$T~GGo#Bn%m%S7v>oeR#9FO~Nm?t#ImTHNTn#l#7{zbR5EIyq!sL`0LYhKU=0K0=JwOTQqe&Fz9^bHG6H65FV zVL>;Zc>fqO0Cwn-JO&v)PeaD&lx~Nf579DjMRMPEm3F^R2fcuo!p|Q+3K*$j@&Yw5 zrv=6_CN!e<8$B_EbJn-pdwbOqk;Ewt!Pd(OZ$SXG)0BoAew~k4Ea5^Z5caZSa=l?c ze7t^V1R(?Hu&?{X_`y>3N*G1r?)uMO9NKbQbJ78bRe@|??6Ul6ry9hkYs2vH8FFMb z0H-iCjccr_of^_$YIkiph5|(V^2-jB+lkb7az%+^`f#!|z9ROSH(-PlKbNwu@bg+trZ+^hv%4|WRD#+b0l!NJzJ{?LU7cng zR9IqR^^JC#{S^>I+RQy5}0CTy&jdK ztE9#b129o>DS+9TmPnkM7-#n9?>IB}b_@cW`3i&quCLCGy|D2G#07}aTczo+WpL-7 z_%xIIKk@`gX}Kt-7=Hr!C1fVJ1Hn|p=^$L1eP2F#rayZHVT0n^K~C_3w;KH16D496 z0N3AgW~lcl<3Z2>-TZ5U(+vXX-g5_q$ndat{Y<-beU$09Y6(p}P*6~1S5?;1WHN#l zm)k}~XiWf|m;pf{%Gy8jo!S$WC3NI#qbQnoNTH#Yx3}x(Y|4lB7({~oWb6qv)N
    Q7q3uL%@*et-w6#r9IAqf<<_ILeM_A9+rC&dG5?YNm5 zWsZWfMBqr3G4z(MWvEtB+;STuCH(t=uyLyAB;ZceXyfMw^0ePm%g^8w7ghplbKugZ zl4ouJW^yhSh7AouzQvKPpC;WRWLsm7ghJ~@Nk`IJ}0BN#%&6pdSM`45v_ zZtz4eEm?0A(0X(QeABbs`^~b>KK3ClBygTIj2Uki4Cn;6uqIgGheDg5USFS{037i&6qrDTA?nmp1`eF@ z;pyxkk~@F{F=I_(n6UkI5)^RG7n^Wp??Xa(Rh0k6ZC z!Kw8o@T0Xuo3%Y@nZv|KHkEe;9XNgUNzE?|^|pXhha<_FOhEL@}6gG=tEGP->3(l0HfP6B;68hiHC zF>UOGs~<1$icIv(W*Ae-VZ>tcm4~wjy!mniC%!cRonZCUYgbFKpnuf*wYA&vb^Cx& zRp@+3$6Akv(e?dvK9*1x*Z=1jq(tfCcpQiqoXy$j!Zw+4sc} ziO|EuPnUx(yHSjzJw|-=u>7%!`wfHSxx*aQ>-8$2DB1c7nqfsiw z$4F|(kwPxoIS3alK$hVe*+qfwC;tv?H-Z1LX*Lkyd+s~mX8q&K?ZsYHo&_UTVTJK$ zhqLFV%z`gAvUhXY@Wxh_`|Ew6nqPQfh5A^-U>mI`kW1}|OzJBBjqtVHT~$?<@9`K(`ueDe;d#jJ3&2_t}i5PU^xg7*^W08CG(M zghG0syuCeH!RI28FYe(cLpB@l7bN_^&a&o5fkxfgL|=xGS(!EmQ}>(ih?aI?yzR7T ziWdDcQ0WcW#Up^LRPCd!)6RHZ5!-lh;bWhqtp>fg4x@Xq=j#4FHx#MgcZYO}BrN!X z)PrmUH{Qv&@JM&7YdmAPh$j_ptP1W%vy2or7&k~Y^K`L1LGFLl<4)>1&0~+*+7s<6 zSb5WE>Q)-l@yXgowM1Is9Zl#XQ+M<#-P^^whWf?%#>i1d@wRu)mb$|*ijEOEmv-Ao z8Cnc%)3+S`R+q2vpLM`ZMrXpM2VB3H%So9=83sHkT)L@OngVuSBphCAZ_F@+Jfll< z`nUf+qs)4b=8KpA=f^eGsTMjI;+KG+W7fk6r&NibHAy~tPHfosECzD^^aJl>n3a6l zzwo7GGw0h58OLwusxe@t{DGJT27XndZ~DrkuS`LvJ+P*KUSIc|!1Rv=;Bpb7jY-Ju zf%C{?=zG|1TiZdBU&D@2*+sTm(#k(ej4C0}@wMf_gb%UnAg2(zvS-2?*5YHg9IEw} zaSUzLGiq(BUhOTa38FpF-=>qqoQw^jq?Ztd5mkC)fF-rKco-0`R zQ;<8T`sMAOuFzlTm(MG!nCv&oCFX=>-l~+@jlzdt=(PGgW@g@==Uu#iII(|qY=}xo z5%y$Wxnzjh4FAF;P()dDFH8`S^jBeG&*gjCZ=M&2c3Kx9*tg%vrY)9IZUh&-v25`X z?P3{We#dr%s16D|6Qi)~Z442%hgjLBXiSu7{YqAQCtyJV7q2`)%y_&rs|`&vPeq_U zJJST!!m_;}tLn#5%3<7V;Tv-#hm$M*(T|Qe02r#d%8lpqB%0ZBccfTY*7w*G>x|L| zkGp503^3DPEK}_9J$%R#Qn1gb%lK(9{o;_dExt3p8q(WluY*{6M9$(DAi-*0>vM-QJ*r&YQ~tU%hj6}rTx zUZo4!uKvt0bt@mRDG3^%J}R zX|X)89TQFId|4(yT|y(7!e;PEHm9 zbkkZL&el5ME(ndU`zT$A;QQ>HWvyIt?jryB8P8|1aP$J8?0KC!IK1S@5W02pmA#7v zZS0mCpH+eKy$_6O0ujSc)>%O0VwzUJf+UXYmL}RN7J0h_;)4Z4|R-hjiklwER9B`%5x? zCKvjtOGa>HK1RO2c;Wx5zBjAm;E9+2_e^JPdxH>{NqDlIHLIfu{70Y((bHNW%m3U}RaItpzWy`6 z>3Vu45|kUk`~6tX;%4ss4gs3`tS3D_LGtZOPM)!cgrX;QkH0U-sOo$UOp72|Fj^?y&{+|^p~T-9JTAu?U|2=;hQ(?=OyRs z?n|qdqm&I(kKv9!HyyZly@esKa4G*Lz@ArYF$8f;0uLiageFOK76s{ zKJ4Bzqol>^M%L0f+0!f|6;JxuYCGbHqK8>Nz$?~bD@LTSy}^mfa{qh~X6d|sqUca- zLbBBmBX`OImi4-6zY^I@)o6JWM`u6(Ht90LX^hHWr_T4nIVqdkM?A@WFGt+Og$>=wa9N8Y9NV zk+Yv??}gA0oRi;;&^%Uj-@JRPu=*h2MabhH;G4^8ab@&+-}Jbn=5CF^(MEmC#9;;a zWpR3A<;)GP%Udg!Po>b!SaSOej;*?Vk!m|pRDxcwCfMI{$my@%Nrc;hWIfnMEONa* z!#r1l4yVQY3<5c;i^TjoTMGG5muzJC-n_Y}vSS{Tn;_3m98Y`knX2h5FaBU)<{k)n zw8xs66mdOOx_r}l2$RDvNHoqc{b-DI=0Pjjp2x-}%EJxzrpM}AW??`gUE^)-@XXMR zG8+?t%Nw~%h18t_5Hv6+{YvNO`NQLbOS_UQ4&Lw+e-LABe$w zigdxrP5u!xauC%ZpbZ2TD zfV=2kin!kjq)4}2ns=Ruf`3Hl#aj02x04;L47EYm3|(H)z~4$aoG^4#OApE3?R4FL z#6$G3%zO}agJMFta>+2BVg0@Sjrp8GSq2OYA;@QJd*f)`VrZVI5F5L8S6~kB!)XZ_ zhK;?HDsZuj2VZQw+iXKKSuO`T-)c|;z{MTEY*~2B1z5JnPxFt!H_v?4y$S!y^Be8K zR6QHcUnK>gJ*CbxKiP`5hlt+s#1Di=bdj7NWsz=L3nf}qJe7X6qUl|$r54HFwJhQNpvxh8K$~+E2dEzMxwG%->5PD~cNY+WaWx0Iv zZ#mB`XNm`ThEZ}3tfUN90%mOdb!J7g(2%69{?|Bi6Is_5Z5oOCzT7#)%LMORybbQ( zv$HhOlZ`43f7UF%D&0zV6KeMRD4HTelN(>Cb@MQc<+%?d9j$+L95JZQ=1%C+Q)t^6ySEDVjTwz#WZ6pNdxsRlE>H1{{()XkQo> zl~c;U%vqMg98(Z~?8UF5jPXGd#KdqVF52JU$GaRlHy?gWz2EU7*}d|U{xXgqb`r+H zK8ofH&log&7Xn-PU29txmrc`CY}>9AXX-<&aKtoB`!k3wJkNgdap*o=Z+4jvM~X$g z^Nkk*JXuUasm6DaR8DifdoT0$>H2)a=Jty9lNc4;kE=`phi4`}V3z+BYF=`B&b?fM zQv65oo;&@Dc|@1y@{iy>GJ4)BoUaD{=M*PX^LzHcCqJ(Sizol-Upj4D{&?O0bnXXt zAN!pDGC#6#9HOH5v1h$jgfNbNV*4gK0)rt?LWc;?NWcAmfq=7TukEkCYW*)Hh?{h! z_I`tu$stn(`-M@}K|A=l)XeUdUDpu2#fP$sWnZwz;>)H1Pa(pT-8$yf?1>)8ilEf> zQyO%;SoB);K+rrj3hZkF*+ZI|pXm{}9@{Y!-y>-~rxv=jHmo+Gz}M7#PY-0u-c_;U z%pWO8CSn1i>>1^OGwc$WZ6Mj@O`dc_1tC`8%khXt3vZoq|Htb&z1Mp4_Kie}k#(&buOuHlS{xSILKM{IrFA3$|5uh3T z=Wi;OGM;76{-5A7^%MnUYW^qZ0&|>DR5o4OKSNf9URl@e#?I*ri+^&Ob?{}(GrZR? zfy>TTl8?ysxUYOL#2uaRY^Y)AX*?|A4l!?Aa?$l6AP2;$_;@=1H^}L_Cuc}TV zKEyRtcK*s4&JNRl_uoyp;8MMXCijCkUa_dxk4bPd@y)!-{CAxAuDNirMh;(7m{XKa z-R#fDF3moOk%KmHkSMrfQ-{XZ8_`9hhIbN*b#RzrR)68jDRA}G3X(?RrapjXFRl*SV2~svEOE_4D zzMVFvK`QHC{6~uctOj}h{;UX%onR7Ofs`4EIvPxEKqSh8P zo6O@IS5Vtwr`C^`eifc9G=SMc zGG=`TnO-ir-BTyWK3qGzz`G;qUCEK0fCJ*IH``+aFVFAiPFKc0{QL^PzYzfl#4%6? z{5qM3yiN+BuvcH-mOlxY&9x~yuUM3w5Y=9|EBDiPob$*33FH+U>frdZN&oF1@4?U8 zw>LMAYJUw(IRJWvKez@H_=C5Tch`sj~FnfiV1$I4#KY$#*?j!5~h42;uJQ)xW z@w?;RF<|%@XSXrD!j%HUAH+}Rku`Jiu@YSH$}-Ao9aRu1$e; z+Im;FW?+@wVoV0ep#Zu^kDfew^W^oD*KgjCS^$axGAnAN0@n%AEa33~L3#1~_k;cc za4vTI`-2OBEqn{m^>9T+g0zA}u8rZfid|RVEd~M#Q25CwkDkEw-J3^m-hf_keD5CI z|Kr<#xVeN^FpV6LLWNvU|&CZbNm`KS+EzJ z{psf7DlpGZp4(PHt5)%aW3Y5JCV>ccU1hfzFi@g_)}u$CFk+Eok3TsE$bN?$`v@!s zpvLxS{B?8l_U)hQDWYioYOJkNLY3^g;%+e}ljjqlMg*oqEMOL{N1p&>L61eq!gcSD zf4oOl12h^$PtE@HAaQG>4_PF;uC7}QP+t2Jz~gtXzXLVk5zwn#gjrM!zC+03`0EYe zwFm0KAMgF?`@z-ZveAY}iN#1DPInbsR=tieCi^yo0l31P7HFz4$U?;xFl!(SEDJmf z-#mKs`nxx99lu6}_AS}ErV9k%{;RNpXnV+9KLx1&>EHkQ?|;n*W%7p~#kR&4wtGKn zl*xbn`Op9L(guGClN@jL&bxO%(69c%TbeBH@D<6fEAAF!G5{1{pa15&CvX1kJAkYs zS<+^~WPnx!_=3syHOwdg-`;!er)={WplJUS-2bTnuTKnK{~Mo&H*W$2UkXSqWPjvT zFAWHz0XkumEdvPH)nr#}+{w*nhzh_fTtK2vP&4q5 z6*CuGx*mP^9e(`;XqG7UAAa|`h-Mk%p9FYixc>C@Pk+7q75&GLo`D&x8N5Os_x||f zAK>RN7x43!|H4eUB@nLn0=WK&09LsEfIz)?dGYcE|9x}u@`nyHD;B*DyRP&Yck=f5 zEm{B&vE1u3nLfg0Ean2T1uFs$#QyEOC%++c*PFM;H`lbxz+V%j!PcpCt)XMexH#av|-``wWz%p9&3|WuV}a(C4TKygLWw6|SzU0bHl5p_VEGYvLATaC3}< zsC#GtAjJT6RK5UM|3)LRUmP3z0f6}X<14@_{CbAH6twpH|AYMMbkRcHmD%?v%;PKn zR@BpeKMPlj-05(A=QY=x?^hkJYw8wb@);l&2mUkz3)(4-z*MIty_PHpFpB^R?C~R7 zl1cT3ukU zUNbb4$zbqyK+O;91_(5-pRlkG6DfZF=snyz;o#=Mvp)_01X%6;@!9L&-UExP;Iv0R%WN*9N)zg9I6$Zp&c`0gG6NV~e{``qp za>A9=SW3XckTbBnn}vnpHI7|x#Vv+Ae9Rpu${27W_h+7F&MDJV%Jh`R?0KZ_6f;fA zwE-hRQ0Q7*^Ho~&8JmMlT@!I@o1@S2kaLFyx{@;N?SXv`2=tZ5kYpa5pXm-ulYG6D zIHo@uP@(8CpFyyc-B&D+UcMubjXf>S9#yy)#73~|ZMnrTlD4g&XmH0n>N$PdfYRs+ zVSh#>qm7u+w;?ATG^vXr#3>=9%{j3CXLKt(z(aTCD(DMSTsa)ub9#y`CrU-D3Q-?Sp>>sj)Hkf5myrsB^AM5T8eD_j1S{qi zqksiwC5Bn!Ex27X$?GGq++3T_t%_aEw(S+#xZMqmHP_lJQ{P&;>uT)xX$}P`rDaQ? zie1;lEyl9Np7NVb0(IDRrQKr8CcYGFxe|z4;<6@gF_tU&l-mpvh*bvG#4W}Q5=>E+ zD1oF5EK%4gt9d0*#jf#gF?6+qo4+n88e7%vm$Wp(o2t!p^z_p%sv8;OZw~Bi&*IaMh`GnSys64$pY=L#$%)LX;>>BG9!@yN5r>c_nUkX)ub(mt!HH;P95h;h@WCm7%81U-T@8BD- zrpqRacF*ZS5Wz(e^Qz8WQF51&EM?J!Iz|lqMCteLeehhE)h`OiKrSkcTtZ%bkY~%w zT2{4a)|8%U3iEV1VGA!T7pIb2Ib7M(J2PvXTMV~q&dE(_P4Hs??Mar!AaWAQ(_0qS z%8`NCyqLX^H5Uf}lfKQyw~B(^;Wfxt3+M>OH&k57gN)>%%s<<%*x|G6%VZHPPpWdI z$k{)?1@h!lXY$R+PeYj2kq9Ppi}ht=b_!f&{uLk_=@!GmRmb_hj_#>;>-@YafWPyd zwTUHxobZEAJ#4-}toiJuUBYY}%lV#M1vRO3qSv6XB4yrja+HG^Cd;Y049 zOe3*O+CC|I9s>2pf{~wl{o2A?J1xgA%LXfY&n{C2m|TfnVH+&*E1u;G|M4IG&z{b! z)aZsZ1#mUh*UCD$h5|JJQ(o{Sl4AvfXs1_sn$m9_dl)`Sj#+iK{!jUHqC(We6>AfoKRc}rZ1D&{_(|!(dU~JV zwbMt}0-LT+2Yse40`icQ7!NL^X(i87A}7UhIXET(~aW&)7`3fr}m2JDo09EW-%PmF-v#G@<7?lA#b3X?ErD?fRm{e?n zuFNIh`*IdMHYFuv3st`UYd)-R0LPK+8s`=R$u+V})8IM_S}QXyL!-iV3R;1F>DkKH zZ3gMo0z{B_H(}@N60K zrhP_C-oen`;fujY&yDH=9N+Z-tO?jB$rRQ^%IX4cNrFzZ%OZg^;+g@d9L2y@b{Xnk zExSBhreUY&;_xPFrZl>H5uVKwXvmr&VhbTJu(tfE6z)i`=u1n0`i$VKFuXFVf9j;V zVGm%G7Ja@Bu3&2+(JMeU0lj(D}+X7rZpA;eQ#(rSc)HvvUtGd7e&t0Vrv}lR~8B$ldqixMb@YkjvEw^)so z^?FD^CSlpzK5)0&U>IKpq2I+i+)VdlUZcz`xlqz!+VnDfBirO$Jkxft`&$6me%e z>8`W4Mz>=syKd7VR@-)5(cj+c!`;oToxN-w`+wiR*Z+I?g_q4KU`E6v#xR}T9sHEJ zFjGM5-JZWc4X*u--Y<7{6I{EExj9O2lmSAM?P0e7u-jW3@9*WvRj1kziT!f85GT& zc#z3n+1`k8nZ?+{kFJf3MoWwvMCV)r3)f6}16)Pd`YG{@UDDv=X;&P1jwwCBNNY zCb)JSaPt+vOc~hR-ez{)+unMAFRQ&Gy8 zUAOzY{~NDgCU%{#xw{^Fnq>e?MjLxOn`q1;!0o!qitY+FP<0~Tg7ngqcZUR`-xq<4!HTsKgBYzxwWwe#@DUwy`5d?>o+}GH^`2)0SMhw zxZ-C0Vq9=BpuSHincDZF>6URb0Q2^|^v$<)}DiR?S z%LTwSqkGj?NdqV_w{ilT?{5iOs|;D7yE3~bWniVzSXsGpWuU*Y_dc-e-rf$H1~!c< zpoyAc)=q#{7+>jCid9JDeZU}&vOKe5%7vBzCIJ7E(b zIwXMruB~GJRG1`z!j0MLJ-b6sSt{!KN+7{?ecQf+HBWHuV56;XkrA#xOIMOWMn+a07*qoM6N<$f(s^ua{vGU literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/images/down.gif b/rubbos/app/httpd-2.0.64/docs/manual/images/down.gif new file mode 100644 index 0000000000000000000000000000000000000000..2194532b45efe0a14e3683762ff12fd10037109a GIT binary patch literal 56 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/images/home.gif b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/manual/images/index.gif b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/manual/images/left.gif b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/docs/manual/images/mod_rewrite_fig1.gif b/rubbos/app/httpd-2.0.64/docs/manual/images/mod_rewrite_fig1.gif new file mode 100644 index 0000000000000000000000000000000000000000..664ac1e7bb7a186d2c6157878cdadd5bfb7d3466 GIT binary patch literal 3525 zcmV;$4Lb5iNk%v~VXOgx0igf@000000I&Z50RR90EC2ui0IUIl0RRI2oR6u??GK}z zwAzca-n{z{hT=$;=82~2%C_zc$MQ_q_KoNI&iDQg3<`(DqVb4KDwoWr^9hYgr_`$T zip^@b+^+Wv4vWX+viXcotJmzd`wfrF=k&V$j?e4&{J#GW7$`VMSZH{Nn5ekO*y#8O z87VnQS!sERnW?$S+3EQS8ma{VAZi*%daBx%y6XB08!J0YTWfoZJJ_1b`?T8&tn?d9 zTx@)doUFXe+}t>uEKSD7VUw$V!fPAKs7Md zyD+KN9Q=3h;kSZ|nq;i_tyjVj)go#8aj#*#l1DDS3)(Z@%69kyPTY9&V!4&)rtBFx zuj2)w`FT#Zid9C@pqy*6bX(4r!i z`&oEWA8EOQzK;7h-_)wNdu5K?Iehubp{JLgo4RDqgZ`)Y*B;$$)*%+$dHscE#A{gb zR-kbH1*IQZjHxyr2lYAeQhMI0XB~uIWhh>7=EXn_fCXlz9*RV4IG20X@n;)YEyjqV zZzf#W#9BIHb|Q;WnUx=P*|kMtQ@s&q*LfQbkywavf%hMh?0vUnUk~7jP?lP5$z_*b zehFrnVvb2>nP#3T29{_Bqvo2uwCQFpaK?GdoOIS==bf|Usb?&FW&>ZKf(}Y(p@H_f zM*u!3is&7TF4|}vkNz-eq;FK(1E!X;q3H^pF7W53V|Z$>}`s%Bqu>#xc1iDTV{;D&&R{HCsu*yp8vByf1Y%|O9+Ux z-3#mecOiw7a5$cc3$nP<;RJq2<6evY1GyoR!%g|+e`u}&=de^Bx#tvsE~n^zl#IIR zpR0~*Af&ghHS4gSF8l0!yl#8wxx0e|zaD&_XPZ1tY z8sBI|GGg#PLSdr?;8?|v9qvbAnbL=N1Qhdf)ZUCxu8f|=>UjiK^T)Xn(x5qHnABbZJemex0KS7O!VPvHiOI4 zbn-}bfu$R3X+v_v206$;FM3iA0kfKH24|KF;HD2d zbRTN!D4cp3&Ii01OhUGDkjTWQh(1H1vfzgU==9q&4^*N+R+E+Z5vDd*iNt1}U>K-G z&pMFgA1Ap;K(B0NDE{eqOAToel@Xoi2I_gEdqydR`rKkX56Xbri1afU4FN$zN+EY@ z@jpEpr3d^;AbtrDV3 z8zUqoPBzGn7d>jJ2p9ykQema15Nyx@3k1VTK|6)@D+(rP1jQ<4rlFAR*%12!%R-@` zrqJvLAX@~_o=LR-!mJNSTPD-g7gL!zm2Ld9`Fd@01J4)Jd^-|4~*ahD_FpK zeC~oD3}HALIKmXJu!YgsV1Wo0zSMGWW%)}=5SMNs8x}F(JPe8wvkS$aP_Z)f`wAE1 zi^ZOhG0|w;2^${+#;(w@F?hTRA2$uhoDeeDh`b3Sr;WrW=5Qo{tO_Lq1Imq^@QRsi z3tW zla!qSrQ;asOrmg^adiU8P@2#pim{RgHdy&pneohVSpnZih{MM+D4kU zC~y|7O4MBX5~l_oW-smO?RJ@lk_OlKKV>uW6Rk7dx3zRr7OtcT<>%jfRx?lveoX$x z=KQBFdZe_y=I0URQ%D|_d92BZYX8EYstA5?*kuPLdhNN{4a+L37O=#vv&?H`#b)ux_e3j_lTMFt< z^_KH9>jUok*W=*KvL^!VYmc(nJUY4n><{pn|a8_Mtg$NqLd{;{RM z{N`_e3BW)9*f&SBU#$xJw>Fs)fcWPqKwyAMAb^pBGN!PAmeYXhLOF;NEuWQuNAQ4# z<2PoLH=vM#zXJiX5-Y+YEX+oNv~nR12PzWyI3ZXzD0nVp(<>ubfmgzUdgFpWGlF&_ zgC`h+sB(cu@PUH>gy7|aNkcY2$bl;u3PZ>^IruX#h=ep)D{q5bH~0;>6@*3Lgsw9< zOVfo2xP@_`g^1>Cd^0@jMl%9uf-2aCkoJZwvuWnShC1kmb_j=fh$Cf)Gyms@e+Y;s zBLiwkhi9mVokEClh=_Bjh%2**b+~SPScrj0iIo_L6S!J;!-JUP{)l0?J7e=UR%jt$ zn1}r50H7!}qWD?$w_{^ydmZ>JG02Ho=!#!xHFsl#jzfzM2#e^lgq`y^wHSdG&@o7J zhocjWyf}>B;E7ToiOeXBLGX;-(2P+aThZt{*Jz5RvW(l9UkK=pDv(^&_&=7|FyV-f z>8OscK#uF^9Pao9?Ff%BGml*$kM#&%_?QLvh>!fJkN*ge0V$9JNst9;kOygg{y2|$ za*P}W01t_J(ROnXnG_F69uygoS#W6?NrswMhZ1R#i}qO zhk~eW$~I857HZtlcxS*^AZ0@>`960DFwZ8FN0e+N$&o|;bdy2F1t>X`KzVFBDF@%i zX%N{*ocC3Kgpw3#ZVA^?Md=dlc9Ix*l~QSyLbW1Fxp-n3Z&In2V(D>M`4v{_lBIZ1 zZs|}?(jEXsC1@FQwqcepqD#`c!5cEh}o9Zv_B#TP1bahF$H$4 zL70&#cwos;;c-kSS5Ad#m|qEXgoSaU$(J5Sl51d^pmv!vQkgfUP8F`AC znin~4JV#Zl*_wQ}8h*zLE7h0!)_5NUk~TF=BJ^@|_f$%Gl;pv75wce`Wu4R+QyF&$ z&{=w;2~Kato!$v`MFM!8$#_o17KP`UHNsCEr+BO8iFncJ253p2huKnMr9p4WmV}8< zdP$yhX`5B4cR{%WnrV8Y*K~Ht9$^Wa26>6auilG?+ni*OG#mS)} zv7sL-q9aP8CHg%cYNDH&qEHp0E9#;z3ZpSvCMYVSEkL6+8k#t&qdUr@Jvt^g>Z3*( zq!TfuMQWr+`U*gbq-nLJa@C?unwwB6rBh0!RcfVIilteqrCZ9SUFxOoR{#JzTehj$ literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/images/mod_rewrite_fig1.png b/rubbos/app/httpd-2.0.64/docs/manual/images/mod_rewrite_fig1.png new file mode 100644 index 0000000000000000000000000000000000000000..f914f681ad73b7beaa007a8a336dda10d6b8de1c GIT binary patch literal 5597 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 Vdo9@>EB$4r85^1#)L%wN{||688W8{h literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/images/mod_rewrite_fig2.gif b/rubbos/app/httpd-2.0.64/docs/manual/images/mod_rewrite_fig2.gif new file mode 100644 index 0000000000000000000000000000000000000000..3ea8cb65a3f9f1682c6b52d3911f52d2434ad38f GIT binary patch literal 2553 zcmV*@J5W=b#yB~Kp0=~-bve892N4)}p(pW%2p5sZht~LD zI1%}hx8|otxH2g-xLK0vxppC@5V~NentIoI(rJ0{2OE+}BP-$wx*=Bz983yn zON(iU%aN>EEQsprz_yI0Q)?}KoO*nQ-CZ_4KxX`yc3=u2d>*X_(0`guqzqd@*%#-LfeXh5BVQWpLp z)QG8|NtFn{$$Q4mA4HAe4t}G#aHU6(6t}s=hq0PVmJMrKq`A|k!e|9O8l4z&!W#`S zjZ$>#(5cRsJn6|i1(K`QjsTk`MM>77$!02Ard6pHsnu+78$i8lc7VuF^ky0)tFtHF zr(QWty35d@Uzmf7Y8_lL2S2v}^FhUV^=(jScxmn>5x6qvpoM!Pb&QqLVZdksM=H$I z>f6||`_!fUG4I*j11X7%v6>pY2xh3(3xa*;o zNYwSdUv1ZB&wdX*)_krZ4vewXW?IWbBeN8I)p6nPzS&B?4Ba$!41htm$T)Y{DsLok!AXXP!Iasb`-s^66)wB?2mFp%M~m zXrkQ3=fOx@uY&%$*{vTrQ0I{>pr{8vB)Ijjp5X8oW+QCNZyu6c=x)f=Sie!59OmW78?Uq0#Q z-A_M>*2j0|B3IR1{j3WUtyZmwDmAPb*OzWZ(KlCd!!olPXD?x<)MZ`WCSOCy2xXtD zBJXyVst}vinMV{8xGT+dtvA`ugw^Np$GNUjU414?N3v`l^XJ|U-Mw}&ZPjtd6m(DJ z6=fj;N4r>Zw<*{1t;9aJ(R|1-mS1mQ3*BsPl^rbC)KrgcT-_5(HI>#v|5g>Q3aoBpX0Y3fE=(`y56f!k?an7cM1Y2Z z>89<%9O0m%5>UCP<%ld{q4w}rZ#fjfi|+vUI%bW2f9l`Je*0g%Phpa(w)!Vrq^ zK;-L{1y9HXM4@nnK~NzJU&sR&!f=MpVu1{4I70`L;D$JSp$#5&cs{ zYT@jNOnhJx6M&^AO3?#^;?n*Uuh<3#lnIMmM8^c;)kQ!3a6w;0P#6_8#t_^LgJ*0~ z8bMIOHp($7bF3p3?TE(>#4(Rt+#?@BK)p8k@sBNFBX(pkNJ5^-eBJ6mA{CheLyiju zkA&n2BzXe>G;%|hOadk^RLM@dsDz>{!Y2<^N+X=|L7_|~AW7-UAgr=&FKA^fYs5%I z`f7x{?4>V%3Cv(F(FvN=r3r6Y#~>n;iOO825u52uAwn~nIGiRmXK2l9zA&5GEP^J# zSxjy@;+s@?7XnT-%uMkmW9qbo!NR!*cxJ^gHB45ja8-zDopYBYWED8c87Y7YLT~j< z!9TkN&v44KJU)w6L;elAvYZ*|nCAo|*E}W(wrLbBv>95q?)j~FcCxUUeXSS_qn!ztLk!=+AD_Zz6^so0i)aBZQiC`j+k z*P9!?-z)_r-R~*Ey)V3Rf27Mu^G49eU|?}Kw+G83*MP`hFtU<|l;kJNfXQBPvXr$L z_+~zF2`O9&Z^NR0`=RE7#d1Vx) zpa1;+r88#{$%0-X#R_fcFCrR+hhDS=8|`QXLORm?n>3~6XX#6$FVmXV9;Z87n?$UQ1dKj$WxKWt%&lC&*2KeJ zg|Jc^3%8wSJbJ~>Es5hsvVku&bMOtThffzVrY3bjZp9qQL0cRG3m7&S2lxLF`)k|Z zf?Q-y{q1!w@@ujE{JG!dHe$z|&Vcqbv=aBY>W)J$AvZ9!qFH%?Ma*N^PF&p0-WiVv zzMQNZfxTa!4%O>=-_E_8*b=)>dpCpizhqA8omJk;HIvg6=s4YH_3mYv&UCJ#46a;f zD6N=H-t{KN>tGW*NzbkI=0cs4Ge);y`zlrYMtkMWtfc2gZs#07qC6*Y8&p!K)?pjTI?meG(PwMLdKh&2SzNe>a{NyWt`OI&=^Pdm> P=u3b4)UW=R3jhE+CPVN4 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/images/mod_rewrite_fig2.png b/rubbos/app/httpd-2.0.64/docs/manual/images/mod_rewrite_fig2.png new file mode 100644 index 0000000000000000000000000000000000000000..90dbf544d053bfc9296d1798856ce72fe70ec9f7 GIT binary patch literal 4144 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 K3yffYA?0tGe50TM literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/images/pixel.gif b/rubbos/app/httpd-2.0.64/docs/manual/images/pixel.gif new file mode 100644 index 0000000000000000000000000000000000000000..c0801475d2729dddd97b223bfc8af320516926e2 GIT binary patch literal 61 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/images/ssl_intro_fig2.gif b/rubbos/app/httpd-2.0.64/docs/manual/images/ssl_intro_fig2.gif new file mode 100644 index 0000000000000000000000000000000000000000..26b295a67b0a5fe44bc4dcd9f06cba8e281eed6b GIT binary patch literal 2700 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 G002AZ8?&qc literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/images/ssl_intro_fig2.png b/rubbos/app/httpd-2.0.64/docs/manual/images/ssl_intro_fig2.png new file mode 100644 index 0000000000000000000000000000000000000000..c540f48a59222026dabf9ee1e3653ef87c62941a GIT binary patch literal 3190 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 a`g;3&{Cxd={(k>|fB`c^000000028vI}uy} literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/images/ssl_intro_fig3.png b/rubbos/app/httpd-2.0.64/docs/manual/images/ssl_intro_fig3.png new file mode 100644 index 0000000000000000000000000000000000000000..d71a1cba98daeb8cd650162669671610b2240ceb GIT binary patch literal 5487 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/images/sub.gif b/rubbos/app/httpd-2.0.64/docs/manual/images/sub.gif new file mode 100644 index 0000000000000000000000000000000000000000..93061c5ad7f011307c4188fbc5d134db19fbc8c0 GIT binary patch literal 6083 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 GgEauCMi2b} literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/index.html b/rubbos/app/httpd-2.0.64/docs/manual/index.html new file mode 100644 index 00000000..e1d67be1 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/index.html @@ -0,0 +1,33 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: index.html.de +Content-Language: de +Content-type: text/html; charset=ISO-8859-1 + +URI: index.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: index.html.es +Content-Language: es +Content-type: text/html; charset=ISO-8859-1 + +URI: index.html.fr +Content-Language: fr +Content-type: text/html; charset=ISO-8859-1 + +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.ru.koi8-r +Content-Language: ru +Content-type: text/html; charset=KOI8-R + +URI: index.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/index.html.de b/rubbos/app/httpd-2.0.64/docs/manual/index.html.de new file mode 100644 index 00000000..335fb794 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/index.html.de @@ -0,0 +1,104 @@ + + + +Dokumentation zum Apache HTTP Server Version +2.0 - Apache HTTP Server + + + + + +

    +
    <-
    + + +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/index.html.en b/rubbos/app/httpd-2.0.64/docs/manual/index.html.en new file mode 100644 index 00000000..59ffc2da --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/index.html.en @@ -0,0 +1,103 @@ + + + +Apache HTTP Server Version 2.0 +Documentation - Apache HTTP Server + + + + + + +
    <-
    + + +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/index.html.es b/rubbos/app/httpd-2.0.64/docs/manual/index.html.es new file mode 100644 index 00000000..7d1f4980 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/index.html.es @@ -0,0 +1,108 @@ + + + +Documentación del Servidor HTTP Apache +2.0 - Servidor HTTP Apache + + + + + + +
    <-
    + + +
    +

    Idiomas disponibles:  de  | + en  | + es  | + fr  | + ja  | + ko  | + ru  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/index.html.fr b/rubbos/app/httpd-2.0.64/docs/manual/index.html.fr new file mode 100644 index 00000000..a8102b54 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/index.html.fr @@ -0,0 +1,103 @@ + + + +Documentation du Serveur Apache Version +2.0 - Serveur Apache HTTP + + + + + + +
    <-
    + + +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/index.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/index.html.ja.utf8 new file mode 100644 index 00000000..8ade990c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/index.html.ja.utf8 @@ -0,0 +1,101 @@ + + + +Apache HTTP サーバ バージョン 2.0 ドキュメント - Apache HTTP サーバ + + + + + + +
    <-
    + +

    Apache HTTP サーバ バージョン 2.0 ドキュメント

    +
    +

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

    +
    +

    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/index.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/index.html.ko.euc-kr new file mode 100644 index 00000000..7331a954 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/index.html.ko.euc-kr @@ -0,0 +1,101 @@ + + + +Apache HTTP Server Version 2.0 ¹®¼­ - Apache HTTP Server + + + + + + +
    <-
    + + +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/index.html.ru.koi8-r b/rubbos/app/httpd-2.0.64/docs/manual/index.html.ru.koi8-r new file mode 100644 index 00000000..bb45b5f2 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/index.html.ru.koi8-r @@ -0,0 +1,103 @@ + + + +äÏËÕÍÅÎÔÁÃÉÑ Ë HTTP ÓÅÒ×ÅÒÕ Apache ×ÅÒÓÉÉ +2.0 - HTTP ÓÅÒ×ÅÒ Apache + + + + + + +
    <-
    + +

    äÏËÕÍÅÎÔÁÃÉÑ Ë HTTP ÓÅÒ×ÅÒÕ Apache ×ÅÒÓÉÉ +2.0

    +
    +

    äÏÓÔÕÐÎÙÅ ÑÚÙËÉ:  de  | + en  | + es  | + fr  | + ja  | + ko  | + ru  | + tr 

    +
    +

    +
    +
    +

    äÏÓÔÕÐÎÙÅ ÑÚÙËÉ:  de  | + en  | + es  | + fr  | + ja  | + ko  | + ru  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/index.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/index.html.tr.utf8 new file mode 100644 index 00000000..7c393586 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/index.html.tr.utf8 @@ -0,0 +1,101 @@ + + + +Apache HTTP Sunucusu Sürüm 2.0 +Belgeleri - Apache HTTP Sunucusu + + + + + + +
    <-
    + +

    Apache HTTP Sunucusu Sürüm 2.0 +Belgeleri

    +
    +

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

    +
    +

    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/install.html b/rubbos/app/httpd-2.0.64/docs/manual/install.html new file mode 100644 index 00000000..38d88404 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/install.html @@ -0,0 +1,29 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: install.html.de +Content-Language: de +Content-type: text/html; charset=ISO-8859-1 + +URI: install.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: install.html.es +Content-Language: es +Content-type: text/html; charset=ISO-8859-1 + +URI: install.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: install.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: install.html.ru.koi8-r +Content-Language: ru +Content-type: text/html; charset=KOI8-R + +URI: install.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/install.html.de b/rubbos/app/httpd-2.0.64/docs/manual/install.html.de new file mode 100644 index 00000000..953099ec --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/install.html.de @@ -0,0 +1,406 @@ + + + +Kompilieren und Installieren - Apache HTTP Server + + + + + +
    <-
    +

    Kompilieren und Installieren

    +
    +

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

    +
    + +

    Dieses Dokument umfaßt nur die Kompilierung und Installation des + Apache auf Unix und Unix-ähnlichen Systemen. Für die + Kompilierung und Installation unter Windows lesen Sie bitte Den Apache unter Microsoft Windows + betreiben. Für andere Plattformen lesen Sie bitte die + Dokumentation Plattformen.

    + +

    Die Konfigurations- und Installationsumgebung des Apache 2.0 hat sich + seit dem Apache 1.3 komplett verändert. Der Apache 1.3 benutzt einen + speziellen Satz von Skripten, um eine einfache Installation zu + ermöglichen. Der Apache 2.0 dagegen verwendet nun + libtool und autoconf, um eine Umgebung zu + schaffen, die der vieler anderer Open Source Projekte ähnlich + sieht.

    + +

    Wenn Sie von einer Unterversion auf die nächste aktualisieren (z.B. + von 2.0.50 auf 2.0.51), springen Sie bitte zum Abschnitt Upgrade.

    +
    + +
    top
    +
    +

    Überblick für die Ungeduldigen

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Download$ lynx http://httpd.apache.org/download.cgi
    Auspacken$ gzip -d httpd-2_0_NN.tar.gz
    + $ tar xvf httpd-2_0_NN.tar
    Konfigurieren$ ./configure --prefix=PREFIX +
    Kompilieren$ make
    Installieren$ make install
    Anpassen$ vi PREFIX/conf/httpd.conf
    Testen$ PREFIX/bin/apachectl start +
    + +

    NN muss durch die Nummer der Unterversion ersetzt werden, + und PREFIX durch den Verzeichnispfad, + in dem der Server installiert werden soll. Wenn PREFIX nicht + angegeben ist, wird die Voreinstellung /usr/local/apache2 + verwendet.

    + +

    Beginnend mit den Anforderungen + für die Kompilierung und Installation des Apache HTTPD ist + weiter unten jeder Abschnitt des Kompilierungs- und + Installationsvorganges genauer beschrieben.

    +
    top
    +
    +

    Anforderungen

    + +

    Folgende Anforderungen gelten für die Erstellung des + Apache:

    + +
    +
    Plattenplatz
    +
    Stellen Sie sicher, dass Sie kurzzeitig wenigstens 50 MB freien + Festplattenplatz zur Verfügung haben. Nach der Installation + belegt der Apache ungefähr 10 MB Plattenplatz. Der + tatsächliche Platzbedarf variiert in Abhängigkeit von den + gewählten Konfigurationseinstellungen und + Modulen von Drittanbietern.
    + +
    ANSI-C-Compiler und Generierungswerkzeuge
    +
    Stellen Sie sicher, dass Sie einen ANSI-C Compiler installiert + haben. Der GNU C + Compiler (GCC) der Free Software + Foundation (FSF) ist empfehlenswert (Version 2.7.2 ist gut). Wenn + Sie den GCC nicht besitzen, stellen Sie zumindest sicher, dass der + Compiler Ihres Anbieters ANSI-kompatibel ist. Außerdem muss Ihr + PATH wesentliche Generierungswerkzeuge wie + make enthalten.
    + +
    Zeitgenauigkeit bewahren
    +
    Elemente des HTTP-Protokolls werden in Form einer Tageszeit + ausgedrückt. Darum sollten Sie jetzt prüfen, ob Ihr System + die Fähigkeit zur Zeitsynchronisation besitzt, und diese + gegebenenfalls installieren. Üblicherweise werden hierfür + die Programme ntpdate oder xntpd verwendet, + die auf dem Network Time Protocol (NTP) basieren. Nähere + Informationen über NTP Software und öffentliche Zeitserver + finden Sie in der Usenet Newsgroup comp.protocols.time.ntp + und auf der NTP + Homepage.
    + +
    Perl 5 + [OPTIONAL]
    +
    Für einige Hilfsskripte wie apxs + oder dbmmanage (die in Perl + geschrieben sind) wird der Perl 5 Interpreter benötigt (die + Versionen ab 5.003 sind ausreichend). Wenn Sie mehrere Perl + Interpreter haben (beispielsweise eine systemweite Installation von + Perl 4 und Ihre eigene Perl 5-Installation), dann sollten Sie die + --with-perl-Option (siehe unten) verwenden, um + sicherzustellen, dass der richtige Interpreter von + configure ausgewählt wird. + Wenn kein Perl 5-Interpreter vom configure-Skript + gefunden werden kann, können Sie die betroffenen Hilfsskripte nicht + verwenden, sind jedoch selbstverständlich nach wie vor in der Lage, + den Apache 2.0 zu bauen und zu installieren.
    +
    +
    top
    +
    +

    Download

    + +

    Der Apache kann von der Apache HTTP Server + Downloadseite heruntergeladen werden, auf der verschiedene Spiegelserver + angegeben sind. Für die meisten Benutzer des Apache ist es auf + Unix-ähnlichen Systemen am Besten, die Quellcodeversion herunterzuladen + und zu kompilieren. Der Erstellungsprozess (weiter unten beschrieben) ist + einfach und erlaubt es Ihnen, den Server Ihren Bedürfnissen anzupassen. + Dazu kommt, dass Binärdistributionen gegenüber der aktuellen + Quellcodeversion oft veraltet sind. Wenn Sie tatsächlich ein + Binärpaket herunterladen, folgen Sie bitte den Anweisungen in der Datei + INSTALL.bindist, die der Distribution beiliegt.

    + +

    Es ist wichtig, dass Sie nach dem Herunterladen überprüfen, + dass es sich um einer vollständige und unveränderte Version des + Apache HTTP Servers handelt. Das können Sie erreichen, indem Sie das + heruntergeladene Paket gegen die PGP-Signatur prüfen. Einzelheiten dazu + erfahren Sie auf der Download-Seite. Es + ist auch ein erweitertes Beispiel verfügbar, dass die Anwendung von PGP + beschreibt.

    + +
    top
    +
    +

    Auspacken

    + +

    Das Auspacken des Quellcodes aus dem Apache HTTPD Tarball besteht + aus einem simplen Dekomprimieren und danach "Ent-tarren":

    + +

    + $ gzip -d httpd-2_0_NN.tar.gz
    + $ tar xvf httpd-2_0_NN.tar +

    + +

    Dies erstellt unterhalb des aktuellen Verzeichnisses ein neues + Verzeichnis, das den Quellcode für die Distribution enthält. + Sie sollten mit cd in dieses Verzeichnis wechseln, + bevor Sie mit der Kompilierung des Servers weitermachen.

    + +
    top
    +
    +

    Den Codebaum konfigurieren

    + +

    Der nächste Schritt ist die Konfiguration des + Apache-Codebaumes für Ihre spezielle Plattform und Ihre + persönlichen Bedürfnisse. Dies wird mit dem Skript + configure durchgeführt, das im Wurzelverzeichnis + der Distribution enthalten ist. (Entwickler, welche die CVS Version + des Apache-Codebaumes herunterladen, müssen autoconf + und libtool installiert haben und müssen + buildconf ausführen, bevor sie mit den + nächsten Schritten fortfahren können. Dies wird bei + offiziellen Releases nicht notwendig sein.)

    + +

    Um den Codebaum mit den Standardeinstellungen zu konfigurieren, + geben Sie einfach ./configure ein. Zur Änderung + dieser Voreinstellungen akzeptiert configure eine + Reihe von Variablen und Kommandozeilenoptionen.

    + +

    Die wichtigste Option ist --prefix, der Ablageort, an dem + der Apache später installiert wird, da er für diesen Ort + konfiguriert werden muss, um korrekt zu arbeiten. Eine feinere Einstellung + der Dateiablagen ist mit weiteren configure-Optionen + möglich.

    + +

    Weiterhin können Sie zu diesem Zeitpunkt festlegen, welche Funktionalität Sie + in den Apache aufnehmen möchten, indem Sie Module + aktivieren oder deaktivieren. Der Apache bindet standardmäßig + einen Satz von Basismodulen ein. + Andere Module werden mit Hilfe der Option + --enable-module aktiviert, wobei module + den Namen des Moduls ohne das Präfix mod_ darstellt. + Ausserdem sind alle Unterstriche durch Bindestriche zu ersetzen. Sie + können sich auch entscheiden, Module als "Shared + Objects (DSOs)" zu kompilieren, welche zur Laufzeit ge- und entladen + werden können. Dazu verwenden Sie die Option + --enable-module=shared. Entsprechend können Sie + Basismodule mit der Option --disable-module + deaktivieren. Lassen Sie Vorsicht walten. wenn Sie diese Optionen verwenden, + da configure Sie nicht warnen kann, wenn die von Ihnen + angegebenen Module nicht existieren; die Option wird dann einfach + ignoriert.

    + +

    Zusätzlich ist es zuweilen notwendig, das + configure-Skript mit Extrainformationen zum Ablageort + Ihres Compilers, Ihrer Bibliotheken oder Header-Dateien zu versorgen. Das + tun Sie, indem Sie entweder Umgebungsvariablen oder Kommandozeilenoptionen + an configure übergeben. Für mehr Informationen + lesen Sie bitte die Hilfeseite zu configure.

    + +

    Um einen kurzen Eindruck zu gewinnen, welche Möglichkeiten Sie + haben, folgt hier ein typisches Beispiel, das den Apache mit einem + speziellen Compiler und Compilerflags für das + Installationsverzeichnis /sk/pkg/apache kompiliert, sowie + die beiden zusätzlichen Module mod_rewrite und + mod_speling für späteres Laden durch den + DSO-Mechanismus:

    + +

    + $ CC="pgcc" CFLAGS="-O2" \
    + ./configure --prefix=/sw/pkg/apache \
    + --enable-rewrite=shared \
    + --enable-speling=shared +

    + +

    Wenn configure startet, benötigt es mehrere + Minuten, um die Verfügbarkeit von Features auf Ihrem System zu + prüfen und ein Makefile zu generieren, das später zur + Kompilierung des Servers verwendet wird.

    + +

    Einzelheiten zu den vielen verschiedenen configure-Optionen finden Sie auf der Hilfeseite zu + configure.

    + +
    top
    +
    +

    Erstellen

    + +

    Nun können Sie die verschiedenen Teile, die das Apache-Paket + bilden, einfach durch Ausführen des folgenden Befehls erstellen:

    + +

    $ make

    + +

    Seien Sie hierbei bitte geduldig, denn eine Basiskonfiguration + benötigt ungefähr 3 Minuten auf einem Pentium III/Linux 2.2. + System. Dies kann aber abhängig von Ihrer Hardware und der Anzahl + der Module, die Sie aktiviert haben, sehr stark variieren.

    +
    top
    +
    +

    Installieren

    + +

    Nun endlich installieren Sie das Package unter dem konfigurierten + Installations-PREFIX (siehe oben: Option --prefix + durch Aufrufen von:

    + +

    $ make install

    + +

    Wenn Sie upgraden, wird die Installation Ihre Konfigurationsdateien + oder Dokumente nicht überschrieben.

    +
    top
    +
    +

    Anpassen

    + +

    Als nächstes können Sie Ihren Apache HTTP Server anpassen, + indem Sie die Konfigurationsdateien + unterhalb von PREFIX/conf/ editieren.

    + +

    $ vi PREFIX/conf/httpd.conf

    + +

    Werfen Sie auch einen Blick in das Apache-Handbuch unter docs/manual/. Die aktuellste Version dieses Handbuchs + sowie eine komplette Referenz der verfügbaren Konfigurationsanweisungen finden + Sie unter http://httpd.apache.org/docs/2.0/.

    +
    top
    +
    +

    Testen

    + +

    Sie können nun Ihren Apache HTTP Server starten, indem Sie einfach

    + +

    $ PREFIX/bin/apachectl start

    + +

    ausführen.

    + +

    Danach sollten Sie Ihr erstes Dokument unter dem URL + http://localhost/ anfordern können. Die Webseite, + die Sie sehen, ist im DocumentRoot + abgelegt, welches üblicherweise PREFIX/htdocs/ + ist. Den Server stoppen Sie wieder durch + Ausführen von:

    + +

    $ PREFIX/bin/apachectl stop

    +
    top
    +
    +

    Upgrade

    + +

    Der erste Schritt beim Aktualisieren besteht darin, die + Versionsankündigung sowie die CHANGES-Datei in der + Quelltextdistribution zu lesen, um Änderungen zu finden, die Ihr + System möglicherweise betreffen. Wenn Sie einen größeren + Versionssprung durchführen (z.B. vom 1.3 auf 2.0 oder von 2.0 auf + 2.2), wird es wahrscheinlich auch größere Unterschiede in der + Kompilier- und Laufzeitkonfiguration geben, die manuelle Nacharbeiten + erfordern. Außerdem müssen alle Module aktualisiert + werden, um den Änderungen der Modul-API gerecht zu werden.

    + +

    Die Aktualisierung einer Unterversion auf eine andere (z.B. von 2.0.55 + auf 2.0.57) ist einfacher. make install überschreibt + keine der bereits existierenden Dokumente, Log- und Konfigurationsdateien. + Ausserdem bemühen sich die Entwickler, inkompatible Änderungen + der configure-Optionen, der Laufzeitkonfiguration sowie + der Modul-API zu vermeiden. In den meisten Fällen sollten Sie in der + Lage sein, den gleichen configure-Befehl, die gleiche + Konfiguration und die gleichen Module wieder zu verwenden. (Das gilt erst + seit Version 2.0.41 -- frühere Versionen enthielten noch inkompatible + Änderungen).

    + +

    Um auf eine neue Unterversion zu aktualisieren, suchen Sie zunächst + die Datei config.nice im build-Verzeichnis + Ihrer Serverinstallation oder im Wurzelverzeichnis des Quelltextbaums + der alten Installation. Die Datei enthält den genauen + configure-Befehl, der verwendet wurde, um den + Quellcode zu konfigurieren. Um jetzt von einer Version auf die + nächste zu aktualisieren, kopieren Sie einfach die + config.nice in das Verzeichnis der neuen Version, + passen sie bei Bedarf an, und führen Sie sie aus:

    + +

    + $ ./config.nice
    + $ make
    + $ make install
    + $ PREFIX/bin/apachectl stop
    + $ PREFIX/bin/apachectl start
    +

    + +
    Sie sollten jede neue Version immer in Ihrer Umgebung + testen, bevor Sie sie produktiv schalten. Beispielsweise können Sie + die neue Version neben der alten installieren, indem Sie ein anderes + --prefix und einen anderen Port wählen (durch Anpassen der + Listen-Direktive). So + können Sie auf eventuelle Inkompatibilitäten testen, bevor Sie + endgültig die neue Version verwenden.
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/install.html.en b/rubbos/app/httpd-2.0.64/docs/manual/install.html.en new file mode 100644 index 00000000..0db521df --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/install.html.en @@ -0,0 +1,386 @@ + + + +Compiling and Installing - Apache HTTP Server + + + + + +
    <-
    +

    Compiling and Installing

    +
    +

    Available Languages:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + + +

    This document covers compilation and installation of Apache + on Unix and Unix-like systems only. For compiling and + installation on Windows, see Using Apache with Microsoft + Windows. For other platforms, see the platform documentation.

    + +

    Apache 2.0's configuration and installation environment has + changed completely from Apache 1.3. Apache 1.3 used a custom + set of scripts to achieve easy installation. Apache 2.0 now + uses libtool and autoconf + to create an environment that looks like many other Open Source + projects.

    + +

    If you are upgrading from one minor version to the next (for + example, 2.0.50 to 2.0.51), please skip down to the upgrading section.

    + +
    + +
    top
    +
    +

    Overview for the + impatient

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Download$ lynx http://httpd.apache.org/download.cgi +
    Extract$ gzip -d httpd-2_0_NN.tar.gz
    + $ tar xvf httpd-2_0_NN.tar
    Configure$ ./configure --prefix=PREFIX +
    Compile$ make
    Install$ make install
    Customize$ vi PREFIX/conf/httpd.conf
    Test$ PREFIX/bin/apachectl start +
    + +

    NN must be replaced with the current minor version + number, and PREFIX must be replaced with the + filesystem path under which the server should be installed. If + PREFIX is not specified, it defaults to + /usr/local/apache2.

    + +

    Each section of the compilation and installation process is + described in more detail below, beginning with the requirements + for compiling and installing Apache HTTPD.

    +
    top
    +
    +

    Requirements

    + +

    The following requirements exist for building Apache:

    + +
    +
    Disk Space
    +
    Make sure you have at least 50 MB of temporary free disk + space available. After installation Apache occupies + approximately 10 MB of disk space. The actual disk space + requirements will vary considerably based on your chosen + configuration options and any third-party modules.
    + +
    ANSI-C Compiler and Build System
    +
    Make sure you have an ANSI-C compiler installed. The GNU C + compiler (GCC) from the Free Software Foundation (FSF) + is recommended (version 2.7.2 is fine). If you don't have GCC + then at least make sure your vendor's compiler is ANSI + compliant. In addition, your PATH must contain + basic build tools such as make.
    + +
    Accurate time keeping
    +
    Elements of the HTTP protocol are expressed as the time of + day. So, it's time to investigate setting some time + synchronization facility on your system. Usually the + ntpdate or xntpd programs are used for + this purpose which are based on the Network Time Protocol (NTP). + See the Usenet newsgroup comp.protocols.time.ntp + and the NTP + homepage for more details about NTP software and public + time servers.
    + +
    Perl 5 + [OPTIONAL]
    +
    For some of the support scripts like apxs or dbmmanage (which are + written in Perl) the Perl 5 interpreter is required (versions + 5.003 or newer are sufficient). If you have multiple Perl + interpreters (for example, a systemwide install of Perl 4, and + your own install of Perl 5), you are advised to use the + --with-perl option (see below) to make sure the + correct one is used by configure. + If no Perl 5 interpreter is found by the + configure script, you will not be able to use + the affected support scripts. Of course, you will still be able to + build and use Apache 2.0.
    +
    +
    top
    +
    +

    Download

    + +

    Apache can be downloaded from the Apache HTTP Server + download site which lists several mirrors. Most users of + Apache on unix-like systems will be better off downloading and + compiling a source version. The build process (described below) is + easy, and it allows you to customize your server to suit your needs. + In addition, binary releases are often not up to date with the latest + source releases. If you do download a binary, follow the instructions + in the INSTALL.bindist file inside the distribution.

    + +

    After downloading, it is important to verify that you have a + complete and unmodified version of the Apache HTTP Server. This + can be accomplished by testing the downloaded tarball against the + PGP signature. Details on how to do this are available on the download + page and an extended example is available describing the use of + PGP.

    + +
    top
    +
    +

    Extract

    + +

    Extracting the source from the Apache HTTPD tarball is a + simple matter of uncompressing, and then untarring:

    + +

    +$ gzip -d httpd-2_0_NN.tar.gz
    +$ tar xvf httpd-2_0_NN.tar +

    + +

    This will create a new directory under the current directory + containing the source code for the distribution. You should + cd into that directory before proceeding with + compiling the server.

    +
    top
    +
    +

    Configuring the source tree

    + +

    The next step is to configure the Apache source tree for your + particular platform and personal requirements. This is done using + the script configure included in + the root directory of the distribution. (Developers downloading + the CVS version of the Apache source tree will need to have + autoconf and libtool installed and will + need to run buildconf before proceeding with the next + steps. This is not necessary for official releases.)

    + +

    To configure the source tree using all the default options, + simply type ./configure. To change the default + options, configure accepts a variety of variables + and command line options.

    + +

    The most important option is the location --prefix + where Apache is to be installed later, because Apache has to be + configured for this location to work correctly. More fine-tuned + control of the location of files is possible with additional configure + options.

    + +

    Also at this point, you can specify which features you + want included in Apache by enabling and disabling modules. Apache comes with a Base set of modules included by + default. Other modules are enabled using the + --enable-module option, where + module is the name of the module with the + mod_ string removed and with any underscore converted + to a dash. You can also choose to compile modules as shared objects (DSOs) -- which can be loaded + or unloaded at runtime -- by using the option + --enable-module=shared. Similarly, you can + disable Base modules with the + --disable-module option. Be careful when + using these options, since configure cannot warn you + if the module you specify does not exist; it will simply ignore the + option.

    + +

    In addition, it is sometimes necessary to provide the + configure script with extra information about the + location of your compiler, libraries, or header files. This is + done by passing either environment variables or command line + options to configure. For more information, see the + configure manual page.

    + +

    For a short impression of what possibilities you have, here + is a typical example which compiles 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 +

    + +

    When configure is run it will take several minutes to + test for the availability of features on your system and build + Makefiles which will later be used to compile the server.

    + +

    Details on all the different configure options are + available on the configure manual page.

    +
    top
    +
    +

    Build

    + +

    Now you can build the various parts which form the Apache + package by simply running the command:

    + +

    $ make

    + +

    Please be patient here, since a base configuration takes + approximately 3 minutes to compile under a Pentium III/Linux + 2.2 system, but this will vary widely depending on your + hardware and the number of modules which you have enabled.

    +
    top
    +
    +

    Install

    + +

    Now it's time to install the package under the configured + installation PREFIX (see --prefix option + above) by running:

    + +

    $ make install

    + +

    If you are upgrading, the installation will not overwrite + your configuration files or documents.

    +
    top
    +
    +

    Customize

    + +

    Next, you can customize your Apache HTTP server by editing + the configuration files under + PREFIX/conf/.

    + +

    $ vi PREFIX/conf/httpd.conf

    + +

    Have a look at the Apache manual under docs/manual/ or consult http://httpd.apache.org/docs/2.0/ for the most recent + version of this manual and a complete reference of available configuration directives.

    +
    top
    +
    +

    Test

    + +

    Now you can start your Apache + HTTP server by immediately running:

    + +

    $ PREFIX/bin/apachectl start

    + +

    and then you should be able to request your first document + via URL http://localhost/. The web page you see is located + under the DocumentRoot + which will usually be PREFIX/htdocs/. + Then stop the server again by + running:

    + +

    $ PREFIX/bin/apachectl stop

    +
    top
    +
    +

    Upgrading

    + +

    The first step in upgrading is to read the release announcement + and the file CHANGES in the source distribution to + find any changes that may affect your site. When changing between + major releases (for example, from 1.3 to 2.0 or from 2.0 to 2.2), + there will likely be major differences in the compile-time and + run-time configuration that will require manual adjustments. All + modules will also need to be upgraded to accomodate changes in the + module API.

    + +

    Upgrading from one minor version to the next (for example, from + 2.0.55 to 2.0.57) is easier. The make install + process will not overwrite any of your existing documents, log + files, or configuration files. In addition, the developers make + every effort to avoid incompatible changes in the + configure options, run-time configuration, or the + module API between minor versions. In most cases you should be able to + use an identical configure command line, an identical + configuration file, and all of your modules should continue to + work. (This is only valid for versions after 2.0.41; earlier + versions have incompatible changes.)

    + +

    To upgrade across minor versions, start by finding the file + config.nice in the build directory of + your installed server or at the root of the source tree for your + old install. This will contain the exact + configure command line that you used to + configure the source tree. Then to upgrade from one version to + the next, you need only copy the config.nice file to + the source tree of the new version, edit it to make any desired + changes, and then run:

    + +

    + $ ./config.nice
    + $ make
    + $ make install
    + $ PREFIX/bin/apachectl stop
    + $ PREFIX/bin/apachectl start
    +

    + +
    You should always test any new version in your + environment before putting it into production. For example, you + can install and run the new version along side the old one by + using a different --prefix and a + different port (by adjusting the Listen directive) to test for any + incompatibilities before doing the final upgrade.
    +
    +
    +

    Available Languages:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/install.html.es b/rubbos/app/httpd-2.0.64/docs/manual/install.html.es new file mode 100644 index 00000000..4e86e9cc --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/install.html.es @@ -0,0 +1,446 @@ + + + +Compilación e Instalación - Servidor HTTP Apache + + + + + +
    <-
    +

    Compilación e Instalación

    +
    +

    Idiomas disponibles:  de  | + en  | + es  | + ja  | + ko  | + ru  | + 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 explica cómo compilar e instalar Apache en + sistemas Unix y tipo Unix. Si lo que busca es información sobre + cómo compilar e instalar Apache en Windows, consulte la sección + Usar Apache en Microsoft + Windows. Para otras plataformas, consulte la + documentación sobre plataformas.

    + +

    El entorno de configuración e instalación de Apache + 2.0 ha cambiado completamente respecto al de Apache 1.3. Apache + 1.3 usaba un conjunto de scripts a medida para conseguir una + instalación fácil. Apache 2.0 usa libtool y + autoconf para crear un entorno más parecido al + de muchos otros proyectos Open Source.

    + +

    Si lo que quiere hacer es actualizar su servidor Apache desde + una versión menor (por ejemplo, desde la 2.0.50 a la 2.0.51), + pase directamente a la sección de actualización.

    + +
    + +
    top
    +
    +

    Visión general del proceso para + impacientes

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Descargar$ lynx http://httpd.apache.org/download.cgi +
    Descomprimir$ gzip -d httpd-2_0_NN.tar.gz
    + $ tar xvf httpd-2_0_NN.tar
    Ejecutar el script configure$ ./configure --prefix=PREFIX +
    Compilar$ make
    Instalar$ make install
    Personalizar$ vi PREFIX/conf/httpd.conf
    Comprobar que la instalación + funciona$ PREFIX/bin/apachectl start +
    + +

    NN hay que reemplazarlo por el número de la + versión menor, y PREFIX hay que reemplazarlo por la + ruta en la que se va a instalar Apache. Si no especifica + ningún valor en PREFIX, el valor que se usa + por defecto es /usr/local/apache2.

    + +

    Cada parte del proceso de configuración e instalación + se describe detalladamente más abajo, empezando por los + requisitos para compilar e instalar Apache.

    +
    top
    +
    +

    Requisitos

    + +

    Requisitos necesarios para compilar Apache:

    + +
    +
    Espacio en disco
    Compruebe que tiene disponibles al + menos 50 MB de espacio libre en disco. Después de la + instalación, Apache ocupa aproximadamente 10 MB. No + obstante, la necesidad real de espacio en disco varía + considerablemente en función de las opciones de + configuración que elija y de los módulos externos que + use.
    + +
    Compilador ANSI-C y Build System
    Compruebe que + tiene instalado un compilador de ANSI-C. Se recomienda el Compilador GNU C + (GCC) de la Free Software + Foundation (FSF) (con la versión 2.7.2 es + suficiente). Si no tiene instaldo el GCC, entonces compruebe que + el compilador que va a utilizar cumple con los estándares + ANSI. Además, su variable de entorno PATH debe + contener la ubicación en la que se encuentran las + herramientas básicas para compilar, como por ejemplo + make.
    + +
    Ajuste exacto del reloj del sistema
    Los elementos + del protocolo HTTP están expresados según la hora del + día. Por eso, si quiere puede investigar como instalar + alguna utilidad para sincronizar la hora de su sistema. Para + esto, normalmente, se usan los programas ntpdate o + xntpd, que están basados en el protocolo + Network Time Protocol (NTP). Consulte el grupo de noticias comp.protocols.time.ntp + y el sitio web de NTP + para obtener más información sobre NTP y los + servidores públicos de tiempo.
    + +
    Perl 5 [OPCIONAL]
    +
    Para algunos de los scripts de soporte como + apxs o dbmmanage (que + están escritos en Perl) es necesario el intérprete de + Perl 5 (las versiones 5.003 o posteriores son suficientes). Si + el script configure no encuentra ese + intérprete tampoco pasa nada. Aún puede compilar e + instalar Apache 2.0. Lo único que ocurrirá es que esos + scripts de soporte no podrán ser usados. Si usted tiene + varios interpretes de Perl instalados (quizás Perl 4 porque + estaba ya incluido en su distribución de Linux y Perl 5 + porque lo ha instalado usted), entonces se recomienda usar la + opción --with-perl para asegurarse de que + configure usa el intérprete + correcto.
    +
    +
    top
    +
    +

    Descargar

    + +

    Puede descargar Apache desde la sección de + descargas del sitio web de Apache el cual tiene varios + mirrors. Para la mayoría de los usuarios de Apache que tienen + sistemas tipo Unix, se recomienda que se descarguen y compilen el + código fuente. El proceso de compilación (descrito + más abajo) es fácil, y permite adaptar el servidor + Apache a sus necesidades. Además, las versiones de + disponibles en archivos binarios no están siempre actulizadas + con las últimas modificaciones en el codigo fuente. Si se + descarga un binario, siga las instrucciones contenidas en el + archivo INSTALL.bindist incluido en la + distribución

    + +

    Después de la descarga, es importante que verifique que el + archivo descargado del servidor HTTP Apache está completo y + sin modificaciones. Esto puede hacerlo comparando el archivo + descargado (.tgz) con su firma PGP. Instrucciones detalladas de + cómo hacer esto están disponibles en la + sección de descargas junto con un ejemplo de cómo usar + PGP.

    + +
    top
    +
    +

    Descomprimir

    + +

    Extraer el código fuente del archivo .tgz que acabada de + descargar es muy fácil. Ejecute los siguientes comandos:

    + +

    + $ gzip -d httpd-2_0_NN.tar.gz
    + $ tar xvf httpd-2_0_NN.tar +

    + +

    Estos comandos crearán un nuevo directorio dentro del + directorio en el que se encuentra y que contendrá el + código fuente de la distribución. Debe cambiarse a ese + directorio con cd para proceder a compilar el + servidor Apache.

    + +
    top
    +
    +

    Configuración de la estructura de +directorios

    + +

    El siguiente paso es configurar la estructura de directorios + para su plataforma y sus necesidades personales. Esto se hace + usando el script configure incluido en el directorio + raiz de la distribución que acaba de descargar. (Los + desarrolladores que se descarguen la versión del CVS de la + estructura de directorios necesitarán tener instalados + autoconf y libtool, y necesitarán + ejecutar buildconf antes de continuar con los + siguientes pasos. Esto no es preciso para las versiones + oficiales.)

    + +

    Para configurar la estructura de directorios a partir del + código fuente usando las opciones por defecto, solo tiene que + ejecutar ./configure. Para cambiar las opciones por + defecto, configure acepta una serie de variables y + opciones por la línea de comandos.

    + +

    La opción más importante es --prefix que + es el directorio en el que Apache va a ser instalado después, + porque Apache tiene que ser configurado para el directorio que se + especifique para que funcione correctamente. Es posible lograr un + mayor control del lugar donde se van a instalar los ficheros de + Apache con otras opciones de + configuración.

    + +

    En este momento, puede especificar que características + o funcionalidades quiere incluir en Apache activando o + desactivando módulos. Apache viene con + una selección + básica de módulos incluidos por defecto. Se pueden + activar otros módulos usando la opción + --enable-module, donde module + es el nombre del módulo sin el mod_ y + convirtiendo los guiones bajos que tenga en guiones normales. + También puede optar por compilar módulos como objetos dinámicos compartidos (DSOs) -- + que pueden ser activados o desactivados al ejecutar -- usando la + opción --enable-module=shared. De + igual manera, puede desactivar alguno de los módulos que + vienen por defecto en la selección basica con la opción + --disable-module. Tenga cuidado cuando + use estas opciones, porque configure no le + avisará si el módulo que especifica no existe; + simplemente ignorará esa opción.

    + +

    Además, a veces es necesario pasarle al script + configure información adicional sobre + donde está su compilador, librerías o ficheros de cabecera. Esto + se puede hacer, tanto pasando variables de entorno, como pasándole + opciones a configure a través de la + línea de comandos. Para más información, consulte + la página de ayuda de configure.

    + +

    Para que se haga una idea sobre las posibilidades que tiene, + aquí tiene un ejemplo típico que configura Apache para + la ruta /sw/pkg/apache con un compilador y unos flags + determinados, y además, con dos módulos adicionales + mod_rewrite y mod_speling para + cargarlos después a través del mecanismo DSO:

    + +

    + $ CC="pgcc" CFLAGS="-O2" \
    + ./configure --prefix=/sw/pkg/apache \
    + --enable-rewrite=shared \
    + --enable-speling=shared +

    + +

    Cuando se ejecuta configure se comprueban + que características o funcionalidades están disponibles + en su sistema y se crean los Makefiles que serán usados luego + para compilar el servidor. Esto tardará algunos minutos.

    + +

    La información sobre todas las opciones de + configure está disponible en la + página de ayuda de configure.

    + +
    top
    +
    +

    Compilar

    + +

    Ahora puede compilar las diferentes partes que forman Apache + simplemente ejecutando el siguiente comando:

    + +

    $ make

    + +

    Por favor, tanga un poco de paciencia ahora, porque una + configuración básica tarda aproximadamente 3 minutos en + compilar en un Pentium III con un sistema Linux 2.2, pero este + tiempo puede variar considerablemente en función de su + hardware y del número de módulos que haya + seleccionado.

    +
    top
    +
    +

    Instalar

    + +

    Ahora es el momento de instalar el paquete en el diretorio + elegido en PREFIX (consulte la opción + --prefix más arriba) ejecutando:

    + +

    $ make install

    + +

    Si usted está solo actualizando una instalación + anterior, la nueva instalación no sobreescribirá sus + ficheros de configuración ni otros documentos.

    +
    top
    +
    +

    Personalizar

    + +

    El paso siguiente, es personalizar su servidor Apache editando + los ficheros de configuración + que están en PREFIX/conf/.

    + +

    $ vi PREFIX/conf/httpd.conf

    + +

    échele un vistazo al Manual de Apache que está en docs/manual/ o consulte en http://httpd.apache.org/docs/2.0/ la versión más + reciente de este manual y la Guia de Referencia de todas las directivas de configuración + disponibles.

    +
    top
    +
    +

    Comprobar que la instalación +funciona

    + +

    Ahora puede iniciar su servidor + Apache cuando quiera ejecutando:

    + +

    $ PREFIX/bin/apachectl start

    + +

    y entonces debe poder acceder al documento que tenga + especificado por defecto usando el siguiente URL: + http://localhost/. El documento que verá + estará en DocumentRoot y + casi siempre estará en PREFIX/htdocs/. + Si quiere parar el servidor, puede + hacerlo ejecutando:

    + +

    $ PREFIX/bin/apachectl stop

    +
    top
    +
    +

    Actualizar una instalación +prrevia

    + +

    El primer paso para actualizar una instalación anterior es + leer las especificaciones de la versión y el fichero + CHANGES en la distribución de código fuente + que ha descargado para encontrar los cambios que puedan afectar a + su instalación actual. Cuando el cambio sea entre versiones + mayores (por ejemplo, de la 1.3 a la 2.0 o de la 2.0 a la 2.2), + entonces es más probable que haya diferencias importantes en + la compilación y en la ejecución que necesitarán + ajustes manuales. Todos los módulos necesitarán + también ser actualizados para adaptarse a los cambios en el + interfaz de programación (API) de módulos.

    + +

    La actualización cuando el cambio es entre versiones + menores (por ejemplo, de la 2.0.55 a la 2.0.57) es más + fácil. El proceso make install no + sobreescribirá ninguno de los documentos existentes, archivos + log, o archivos de configuración. Además, los + desarrolladores hacen todos los esfuerzos posibles para evitar + cambios que generen incompatibilidades en las opciones de + configure, en la configuración de la + ejecución o en la interfaz de programación de + módulos. En la mayor parte de los casos debe poder usar un + comando configure idéntico, un fichero de + configuracién idéntico, y todos sus módulos deben + seguir funcionando. (Esto es válido solo para versiones + posteriores a la 2.0.41; las versiones anteriores contienen + cambios incompatibles.)

    + +

    Si la actualización es entre versiones menores (por + ejemplo, de la 2.0.55 a la 2.0.57), lo primero que debe hacer es + encontrar el fichero config.nice en el directorio + build de la instalación antigua de Apache que + desea actualizar o en el directorio raiz de la estructura de + directorios con las fuentes del servidor que uso para su anterior + instalación. Ese fichero contiene el comando + configure exacto que usó originalmente + para configurar la estructura de directorios de las fuentes de + Apache. Para actualizar su instalación de una versión a + la siguiente, solo tiene que copiar el archivo + config.nice a la estructura de directorios que + contiene las fuentes de la nueva versión de Apache, editarlo, + hacer cualquier cambio que desee, y ejecutar:

    + +

    + $ ./config.nice
    + $ make
    + $ make install
    + $ PREFIX/bin/apachectl stop
    + $ PREFIX/bin/apachectl start
    +

    + +
    Tenga en cuenta que antes de poner una nueva + versión de Apache en producción, debe siempre probarla + antes en su entorno. Por ejemplo, puede instalar y ejecutar la + nueva versión junto con la antigua usando un + --prefix diferente y un puerto diferente (modificando + la directiva Listen) + para comprobar que no existe ninguna incompatibilidad antes de + hacer la actualización definitiva.
    +
    +
    +

    Idiomas disponibles:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/install.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/install.html.ja.utf8 new file mode 100644 index 00000000..ee6db41f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/install.html.ja.utf8 @@ -0,0 +1,396 @@ + + + +コンパイルとインストール - Apache HTTP サーバ + + + + + +
    <-
    +

    コンパイルとインストール

    +
    +

    Available Languages:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    +
    This translation may be out of date. Check the + English version for recent changes.
    + + +

    この文書で扱う範囲は、Unix や Unix に類似したシステムでの + Apache のコンパイルとインストールです。 Windows における + コンパイルとインストールに関しては「Microsoft + Windows で Apache を使う」をご覧下さい。 + その他のプラットホームに関しては「プラットホーム」をご覧下さい。

    + +

    Apache 2.0 の設定とインストールの環境は、Apache 1.3 とは + 完全に異なるものになりました。簡単にインストールできるように、 + Apache 1.3 では特製スクリプトを使っていました。 + Apache 2.0 では他の Open Source プロジェクトと同様の環境に + するために libtool と autoconf + を使うようになっています。

    + +

    マイナーバージョンからその次のバージョンにアップグレードする + (2.0.50 から 2.0.51 へ等) 場合は、まず + アップグレードをご覧下さい。

    + +
    + +
    top
    +
    +

    概要 (せっかちな人向け)

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ダウンロード$ lynx http://httpd.apache.org/download.cgi +
    展開$ gzip -d httpd-2_0_NN.tar.gz
    + $ tar xvf httpd-2_0_NN.tar
    設定$ ./configure --prefix=PREFIX +
    コンパイル$ make
    インストール$ make install
    カスタマイズ$ vi PREFIX/conf/httpd.conf
    テスト$ PREFIX/bin/apachectl start +
    + +

    NN は最新のマイナーバージョンナンバーに、 + PREFIX はインストールするサーバでのファイルシステムのパスに、 + 置き換えてください。PREFIX を指定しなかった場合は、 + デフォルトの /usr/local/apache2 になります。

    + +

    Apache HTTPD のコンパイルとインストールに必要なものをはじめとして、 + 編集とインストールプロセスでのそれぞれの項は + 次に詳しく記述されています。

    +
    top
    +
    +

    必要なもの

    + +

    Apache のビルドには次のものが必要です:

    + +
    +
    ディスクスペース
    +
    ディスクに少なくとも 50 MB の一時的な空き容量があるように + 気を付けてください。インストール後は Apache は 10 MB 程度の + ディスクスペースを占めます。実際に必要になるディスクスペースは、 + 設定オプションやサードパーティー製モジュールをどう選択するかによって + 大きく変わるでしょう。
    + +
    ANSI-C コンパイラとビルドシステム
    +
    ANSI-C コンパイラをインストールしておいて下さい。お薦めは Free Software Foundation (FSF) + による GNU C + compiler (GCC) です (バージョン 2.7.2 で大丈夫です)。GCC がない場合は、 + 少なくとも提供されているコンパイラが ANSI 準拠であることを確認しておいて下さい。 + それから、変数 PATH には make + といった基本的なビルドツールが含まれている必要があります。
    + +
    時刻を正確にする
    +
    HTTP プロトコルの要素は日時の時刻で表現されています。ですから、 + 正確な時刻にシンクロさせる機能をシステムに設定することを吟味してみて下さい。 + Network Time Protocol (NTP) をベースとした ntpdate や xntpd プログラムが + この目的によく用いられます。NTP ソフトウェアや公開 NTP + サーバに関する詳細は、Usenet ニュースグループ comp.protocols.time.ntp や NTP ホームページ をご覧下さい。
    + +
    Perl 5 + [オプション]
    +
    提供されているスクリプト幾つか、例えば apxs や dbmmanage は + Perl で書かれているので、Perl + 5 インタプリタが必要になります (5.003 以降)。 + "configure"スクリプトでこのようなインタプリタが見つからなくても、 + 別に不具合はありません。もちろん、Apache + 2.0 のコンパイルとインストールはできます。 + これらのサポートスクリプトが使えなくなるだけです。 + Perl インタプリタを複数インストールしている場合 (ベンダーの Perl + 4 と自分で入れた Perl 5 がある場合など) は、 + --with-perl オプション (下記参照) を使って ./configure + が適切なものを確実に選ぶようにすると良いでしょう。
    +
    +
    top
    +
    +

    ダウンロード

    + +

    Apache は Apache HTTP + サーバダウンロードサイトからダウンロードできますし、 + 同じ場所に幾つかのミラーサイトもリストしています。 + UNIX に類似するシステムで Apache を使うユーザは、ソースを + ダウンロードしてビルドしたほうが良いでしょう。 + ビルドの手順(下記)は簡単ですし、そのおかげでニーズに + 見合ったカスタマイズを簡単にできます。 + さらに、バイナリのリリースはソースリリースよりも + 遅れていることがよくあります。 + それでもバイナリをダウンロードしたのであれば、 + ディストリビューションの中にある INSSTALL.bindist + ファイルの説明に従ってください。

    + +

    ダウンロード後、ダウンロードしたものが Apache HTTP + サーバの完全で改竄されていないバージョンであることを + 検証することが重要です。これはダウンロードした tarball の PGP 署名を + テストすることによって検証します。 + この手順の詳細は ダウンロード + ページ にあり、さらに詳しい例は PGP の使用 + に記載されています。

    + +
    top
    +
    +

    展開

    + +

    Apache HTTPD の tarball + からソースファイルを展開して取り出すとは、 + 単なる圧縮の解除と tar の展開です:

    + +

    +$ gzip -d httpd-2_0_NN.tar.gz
    +$ tar xvf httpd-2_0_NN.tar +

    + +

    配布用のソースコードがある現在いるディレクトリの下に、 + 新しいディレクトリが作られます。 + サーバをコンパイルする段階に進む前に、そのディレクトリに + cd で移動してください。

    +
    top
    +
    +

    ソースツリーを設定する

    + +

    次のステップは、あなたのプラットホームと + 個人的な要求に合うように Apache + ソースツリーを設定することです。 + これは配布ディレクトリのルートディレクトリにある、 + configure + スクリプトで行ないます。 + (Apache ソースツリーの CVS + 版をダウンロードした開発者は、次のステップに進む前に + autoconf とlibtool + をインストールして buildconf + を実行する必要があるでしょう。 + 公式リリースではこの作業は必要ありません。)

    + +

    デフォルトオプションを使ってソースツリーを全て設定する + のであれば、単純に ./configure とタイプしてください。 + デフォルトオプションを変更できるように、configure + には様々な変数やコマンドラインオプションが用意されています。

    + +

    最も重要なオプションは、Apache がこの後でインストールされる位置 + --prefix です。Apache は、このインストール位置に + おいて正常に動作するように設定しなければならないからです。 + さらに詳細なファイル位置の制御は追加の 設定オプション + でできます。

    + +

    この時点で、モジュール を有効にしたり + 無効にしたりすることで Apache 本体に含まれる 機能 + を指定できます。Apache 本体にはデフォルトで、モジュールの Base セットが + 含まれます。その他のモジュールは + --enable-module オプションで + 有効になります。ここで module はモジュールの名前で、 + つまりそれはモジュールの名前から mod_ 文字列を取り除いた後に + アンダースコアをダッシュで置換した文字列です。 + これとは別の方法で --enable-module=shared + オプションを使って、モジュールを + シェアードオブジェクト (DSO) -- 実行時にロードしたり + アンロードしたりできる形式 -- としてコンパイルすることもできます。 + 同様に、--disable-module オプションで + Base モジュールを無効化することもできます。 + これらのオプションを使っているときに、もし指定したモジュールが存在しなくても + configure は警告を上げることなく、単純にオプションを + 無視することに気をつけてください。

    + +

    上記に加えて、configure スクリプトに、 + コンパイラ、ライブラリ、ヘッダファイルの位置を追加情報として渡す + 必要がある場合があります。このような場合には、環境変数あるいは + コマンドラインオプションで configure に渡します。 + 詳細に関しては configure マニュアルページ + をご覧ください。

    + +

    ちょっとどんなことができるかを見せましょう。 + ここで典型的な例として、/sw/pkg/apache + というインストールツリーでコンパイラとフラグを指定して、 + さらに二つの追加モジュール mod_rewrite と + mod_speling を後で DSO + メカニズムでロードするようにコンパイルしてみます:

    + +

    + $ CC="pgcc" CFLAGS="-O2" \
    + ./configure --prefix=/sw/pkg/apache \
    + --enable-rewrite=shared \
    + --enable-speling=shared +

    + +

    configure を実行したら、システムの機能を + テストしたり、後でサーバをコンパイルするために必要な Makefile + を生成したりするのに数分間かかるでしょう。

    + +

    個々の configure オプションの詳細に関しては + configure マニュアルページ + をご覧ください。

    +
    top
    +
    +

    ビルド

    + +

    これで Apache の様々なパーツをビルドすることができます。 + 次のコマンドを単純に実行するだけです:

    + +

    $ make

    + +

    基本的な設定をするのに、Pentium III/Linux 2.2 + のシステムでおおよそ 3 分程度かかりますが、 + あらかじめご了承下さい。 + また、時間はハードウェアや有効にしたモジュールの数に + 大きく依存するでしょう。

    +
    top
    +
    +

    インストール

    + +

    さて、設定したインストール PREFIX + (前述の --prefix オプションを参照) + 以下にパッケージをインストールする段階になりました。 + 次のコマンドを実行してください:

    + +

    $ make install

    + +

    アップグレードする場合は、インストールでは設定ファイルや + ドキュメントファイルの上書きは行いません。

    +
    top
    +
    +

    カスタマイズ

    + +

    次に PREFIX/conf/ 以下にある 設定ファイルを編集して、 + Apache HTTP サーバをカスタマイズします。

    + +

    $ vi PREFIX/conf/httpd.conf

    + +

    docs/manual/ の Apache マニュアルをざっと見てください。 + または、http://httpd.apache.org/docs/2.0/ + にあるマニュアル最新版、設定ディレクティブに当たってみてください。

    +
    top
    +
    +

    テスト

    + +

    次のコマンドを実行して Apache HTTP サーバを開始できます:

    + +

    $ PREFIX/bin/apachectl start

    + +

    URL http://localhost/ を通して最初のドキュメントに対する + リクエストを発行する事ができるはずです。これで見える + ウェブページは DocumentRoot + 以下に置かれたもので、通常は + PREFIX/htdocs/ でしょう。 + サーバを再び停止するには、 + 次のコマンドを実行します:

    + +

    $ PREFIX/bin/apachectl stop

    +
    top
    +
    +

    アップグレード

    + +

    アップグレードでまず行なうべきことは、リリースアナウンスと + ソースディストリビューションに入っている CHANGES を読んで、 + 自身のサイトに対して影響を及ぼす変更点を探すことです。 + メジャーリリース間の変更をする場合 (例えば 1.3 から 2.0 へ、2.0 から 2.2 へ) + は、コンパイル時や実行時の設定に大きな差異があるでしょうから、 + 手動の調整が必要になるでしょう。モジュールも全て、API + の変更に合わせるためにアップグレードが必要になるでしょう。

    + +

    マイナーバージョンから次のバージョンにアップグレードする場合 + (例えば 2.0.55 から 2.0.57 へ) は、もっと簡単です。 + make install を実行しても今あるドキュメント、 + ログファイル、設定ファイルは上書きされません。 + さらに、マイナーバージョン間では configure オプション、 + 実行時の設定、モジュール API に不整合が起こらないように、 + 開発者は最大限の努力をしています。 + 大抵の場合、同一の configure コマンドライン、 + 同一の設定ファイル、モジュール全てが正常に動作するはずです。 + (2.0.41 以降ではそのようになっています。それ以前のバージョンには + 不整合が存在します。)

    + +

    前回のインストール時のソースツリーが残されているのであれば、 + アップグレードはさらに簡単です。古いソースツリーのルートに存在する + config.nice ファイルには、前回ソースツリーを設定した時の + configure コマンドラインが入っています。 + 次のバージョンにアップグレードする場合は、config.nice + ファイルを新しいバージョンのソースツリーにコピーし、 + それを編集し必要な変更を行なって、次のように実行します。

    + +

    + $ ./config.nice
    + $ make
    + $ make install
    + $ PREFIX/bin/apachectl stop
    + $ PREFIX/bin/apachectl start
    +

    + +
    新しいバージョンを使用する場合は、 + 実際に運用を始める前に、必ず自分用の環境でテストすべきです。 + 最終的にアップグレードする前に、非互換性がないかをテストするために、 + 例えば、異なる --prefix と異なるポート (Listen ディレクティブで設定します) + を使用することで、古いバージョンに影響を与えずに新しいバージョンを + インストールし、実行できます。
    +
    +
    +

    Available Languages:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/install.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/install.html.ko.euc-kr new file mode 100644 index 00000000..e2a75c07 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/install.html.ko.euc-kr @@ -0,0 +1,363 @@ + + + +ÄÄÆÄÀÏ°ú ¼³Ä¡ - Apache HTTP Server + + + + + +
    <-
    +

    ÄÄÆÄÀÏ°ú ¼³Ä¡

    +
    +

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

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

    ÀÌ ¹®¼­´Â À¯´Ð½º¿Í À¯´Ð½º·ù ½Ã½ºÅÛ¿¡¼­ ¾ÆÆÄÄ¡¸¦ ÄÄÆÄÀÏÇÏ°í + ¼³Ä¡ÇÏ´Â °Í¸¸À» ´Ù·é´Ù. À©µµ¿ìÁî¿¡¼­ ÄÄÆÄÀÏÇÏ°í ¼³Ä¡ÇÏ´Â ¹æ¹ýÀº + ¸¶ÀÌÅ©·Î¼ÒÇÁÆ® À©µµ¿ìÁî¿¡¼­ + ¾ÆÆÄÄ¡ »ç¿ëÀ» Âü°íÇ϶ó. ´Ù¸¥ Ç÷¡Æû¿¡ ´ëÇؼ­´Â Ç÷¡Æû ¹®¼­¸¦ Âü°íÇ϶ó.

    + +

    ¾ÆÆÄÄ¡ 2.0ÀÇ ±¸¼º°ú ¼³Ä¡ ȯ°æÀº 1.3°ú ¸Å¿ì ´Ù¸£´Ù. + ¾ÆÆÄÄ¡ 1.3Àº ½¬¿î ¼³Ä¡¸¦ À§ÇØ ÀÚü ½ºÅ©¸³Æ®¸¦ »ç¿ëÇß´Ù. + ¾ÆÆÄÄ¡ 2.0Àº ÀÌÁ¦ ´Ù¸¥ ¿©·¯ ¿ÀǼҽº ÇÁ·ÎÁ§Æ®¿Í ºñ½ÁÇÑ È¯°æÀ» + ¸¸µé±âÀ§ÇØ libtool°ú autoconf¸¦ + »ç¿ëÇÑ´Ù.

    + +

    ¸¸¾à ÀÛÀº ¹öÀüÀ» ÇÑ´Ü°è ¾÷±×·¹À̵åÇÑ´Ù¸é (¿¹¸¦ µé¾î, + 2.0.50¿¡¼­ 2.0.51), ¾÷±×·¹À̵å + ÀåÀ¸·Î ¹Ù·Î °¡±æ ¹Ù¶õ´Ù.

    + +
    + +
    top
    +
    +

    ¼º¹Ì ±ÞÇÑ »ç¶÷À» À§ÇÑ °³¿ä

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ´Ù¿î·Îµå$ lynx http://httpd.apache.org/download.cgi +
    ¾ÐÃà Ç®±â$ gzip -d httpd-2_0_NN.tar.gz
    + $ tar xvf httpd-2_0_NN.tar
    ±¸¼º$ ./configure --prefix=PREFIX +
    ÄÄÆÄÀÏ$ make
    ¼³Ä¡$ make install
    ¼³Á¤$ vi PREFIX/conf/httpd.conf
    °Ë»ç$ PREFIX/bin/apachectl start +
    + +

    NNÀº ÇöÀç ÀÛÀº ¹öÀü ¼ýÀÚ·Î, PREFIX´Â + ¼­¹ö°¡ ¼³Ä¡µÉ ÆÄÀϽýºÅÛ °æ·Î·Î ´ëüÇØ¾ß ÇÑ´Ù. PREFIX¸¦ + ÁöÁ¤ÇÏÁö ¾ÊÀ¸¸é ±âº»°ªÀ¸·Î /usr/local/apache2¸¦ + »ç¿ëÇÑ´Ù.

    + +

    ¾Æ·¡´Â ¾ÆÆÄÄ¡ À¥¼­¹ö¸¦ ÄÄÆÄÀÏÇÏ°í ¼³Ä¡ÇϱâÀ§ÇÑ ¿ä±¸»çÇ׺ÎÅÍ + ÄÄÆÄÀÏ°ú ¼³Ä¡ °úÁ¤À» °¢°¢ ÀÚ¼¼È÷ ¼³¸íÇÑ´Ù.

    +
    top
    +
    +

    ¿ä±¸»çÇ×

    + +

    ¾ÆÆÄÄ¡¸¦ ÄÄÆÄÀÏÇϱâÀ§ÇØ ´ÙÀ½°ú °°Àº °ÍµéÀÌ ÇÊ¿äÇÏ´Ù:

    + +
    +
    µð½ºÅ© °ø°£
    +
    µð½ºÅ© ¿©À¯°ø°£ÀÌ ÃÖ¼Ò 50 MB ÀÌ»óÀÎÁö È®ÀÎÇ϶ó. + ¼³Ä¡ÈÄ ¾ÆÆÄÄ¡´Â ¾à 10 MBÀÇ µð½ºÅ© °ø°£À» Â÷ÁöÇÑ´Ù. + ½ÇÁ¦ ÇÊ¿äÇÑ µð½ºÅ© °ø°£Àº ¼±ÅÃÇÑ ±¸¼º ¿É¼Ç°ú Ãß°¡ ¸ðµâ¿¡ + µû¶ó »ó´çÈ÷ Â÷ÀÌ°¡ ³­´Ù.
    + +
    ANSI-C ÄÄÆÄÀÏ·¯¿Í ÄÄÆÄÀÏ ½Ã½ºÅÛ
    +
    ANSI-C ÄÄÆÄÀÏ·¯°¡ ¼³Ä¡µÇÀÖ´ÂÁö È®ÀÎÇ϶ó. Free Software Foundation (FSF)ÀÇ + GNU C + compiler (GCC)¸¦ ÃßõÇÑ´Ù. (¹öÀü 2.7.2¸é µÈ´Ù.) GCC°¡ + ¾ø´Ù¸é ÃÖ¼ÒÇÑ »ç¿ëÇÏ´Â ÄÄÆÄÀÏ·¯°¡ ANSI ȣȯÀÎÁö È®ÀÎÇ϶ó. + Ãß°¡·Î PATH ȯ°æº¯¼ö´Â make¿Í + °°Àº ±âº»ÀûÀÎ ÄÄÆÄÀÏ µµ±¸¸¦ Æ÷ÇÔÇØ¾ß ÇÑ´Ù.
    + +
    Á¤È®ÇÑ ½Ã°£
    +
    HTTP ÇÁ·ÎÅäÄÝ¿¡´Â ÇÏ·çÁß ½Ã°£À» Ç¥ÇöÇÏ´Â ºÎºÐÀÌ ÀÖ´Ù. ±×·¡¼­ + ÀÌÁ¦ ½Ã½ºÅÛÀÇ ½Ã°£ µ¿±âÈ­ ±â´ÉÀ» »ìÆ캼 ½Ã°£ÀÌ´Ù. º¸Åë + À̸¦ À§ÇØ Network Time Protocol (NTP)¿¡ ±â¹ÝÇÑ + ntpdate³ª xntpd¸¦ »ç¿ëÇÑ´Ù. + NTP ¼ÒÇÁÆ®¿þ¾î¿Í °ø°³ ½Ã°£ ¼­¹ö¿¡ ´ëÇÑ Á¤º¸´Â ´º½º±×·ì + comp.protocols.time.ntp¿Í + NTP ȨÆäÀÌÁö¸¦ + Âü°íÇ϶ó.
    + +
    Perl 5 + [¼±ÅûçÇ×]
    +
    (Perl·Î ¾²¿©Áø) apxs³ª + dbmmanage¿Í °°Àº + Áö¿ø ½ºÅ©¸³Æ®¸¦ À§ÇØ Perl 5 ÀÎÅÍÇÁ¸®ÅÍ°¡ ÇÊ¿äÇÏ´Ù. (¹öÀü + 5.003 ÀÌ»óÀÌ¸é µÈ´Ù.) `configure' ½ºÅ©¸³Æ®°¡ + ÀÌ ÀÎÅÍÇÁ¸®Å͸¦ ãÁö ¸øÇصµ ¹®Á¦¾øÀÌ ¾ÆÆÄÄ¡ 2.0À» + ÄÄÆÄÀÏÇÏ°í ¼³Ä¡ÇÒ ¼ö ÀÖ´Ù. ´Ù¸¸ Áö¿ø ½ºÅ©¸³Æ®¸¦ »ç¿ëÇÏÁö + ¸øÇÒ »ÓÀÌ´Ù. ¿©·¯ Perl ÀÎÅÍÇÁ¸®ÅÍ°¡ ¼³Ä¡µÇÀÖ´Ù¸é (¾Æ¸¶µµ + »ì¶§ Æ÷ÇÔµÈ Perl 4¿Í Á÷Á¢ ÄÄÆÄÀÏÇÑ Perl 5) + ./configure°¡ ¿Ã¹Ù¸¥ °ÍÀ» ã±âÀ§ÇØ + --with-perl ¿É¼ÇÀ» (¾Æ·¡ Âü°í) »ç¿ëÇÏ±æ ¹Ù¶õ´Ù.
    +
    +
    top
    +
    +

    ´Ù¿î·Îµå

    + +

    ¾ÆÆÄÄ¡´Â ¿©·¯ ¹Ì·¯ ¸ñ·ÏÀÌ ÀÖ´Â ¾ÆÆÄÄ¡ À¥¼­¹ö + ´Ù¿î·Îµå »çÀÌÆ®¿¡¼­ ´Ù¿î·ÎµåÇÒ ¼ö ÀÖ´Ù. À¯´Ð½º·ù ½Ã½ºÅÛÀ» + »ç¿ëÇÑ´Ù¸é ¼Ò½ºÄڵ带 ´Ù¿î¹Þ¾Æ¼­ ÄÄÆÄÀÏÇÏ´Â ÆíÀÌ ³´´Ù. ½±°Ô + (¾Æ·¡¿¡¼­ ¼³¸í) ÄÄÆÄÀÏÇÒ ¼ö ÀÖ°í, ÀÚ½ÅÀÇ ¿ëµµ¿¡ ¾Ë¸Â°Ô ¼­¹ö¸¦ + ¸ÂÃâ ¼ö ÀÖ´Ù. ¶Ç, ÃֽŠ¹öÀü ¹ÙÀ̳ʸ® ¹èÆ÷º»ÀÌ ¾ø´Â °æ¿ìµµ + ¸¹´Ù. ¹ÙÀ̳ʸ®¸¦ ´Ù¿î¹Þ´Â´Ù¸é ¹èÆ÷º»¿¡ ÀÖ´Â + INSTALL.bindist ÆÄÀÏÀÇ Áö½Ã¸¦ µû¸£¶ó.

    + +

    ´Ù¿î·ÎµåÈÄ ´Ù¿î¹ÞÀº ÆÄÀÏÀÌ ¿ÏÀüÇÏ°í + º¯°æµÇÁö¾ÊÀº ¾ÆÆÄÄ¡ À¥¼­¹öÀÓÀ» È®ÀÎÇÏ´Â °ÍÀÌ Áß¿äÇÏ´Ù. + PGP ¼­¸íÀ» °¡Áö°í ´Ù¿î·ÎµåÇÑ Å¸º¼(tarball)À» °Ë»çÇÏ¿© È®ÀÎÇÑ´Ù. + ÀÚ¼¼ÇÑ ¹æ¹ýÀº ´Ù¿î·Îµå + ÆäÀÌÁö¿¡ ÀÖ°í, PGP + »ç¿ë¹ýÀ» ¼³¸íÇÏ´Â »ó¼¼ÇÑ ¿¹µµ ÀÖ´Ù.

    + +
    top
    +
    +

    ¾ÐÃà Ç®±â

    + +

    ¾ÆÆÄÄ¡ À¥¼­¹ö Ÿº¼¿¡¼­ ¼Ò½º¸¦ Ǫ´Â ÀÛ¾÷Àº ´Ü¼øÈ÷ ¾ÐÃà°ú + tar¸¦ Ǫ´Â °ÍÀÌ´Ù:

    + +

    +$ gzip -d httpd-2_0_NN.tar.gz
    +$ tar xvf httpd-2_0_NN.tar +

    + +

    ±×·¯¸é ÇöÀç µð·ºÅ丮 ¾Æ·¡¿¡ ¹èÆ÷º»ÀÇ ¼Ò½ºÄڵ带 ´ãÀº + »õ·Î¿î µð·ºÅ丮°¡ »ý±ä´Ù. ¼­¹ö¸¦ ÄÄÆÄÀÏÇϱâ Àü¿¡ ±× + µð·ºÅ丮·Î cdÇØ¾ß ÇÑ´Ù.

    +
    top
    +
    +

    ¼Ò½º Æ®¸® ±¸¼ºÇϱâ

    + +

    ´ÙÀ½ °úÁ¤Àº ƯÁ¤ Ç÷¡Æû°ú °³ÀÎÀûÀÎ ÇÊ¿ä¿¡ µû¶ó ¾ÆÆÄÄ¡ + ¼Ò½º Æ®¸®¸¦ ±¸¼ºÇÏ´Â ÀÏÀÌ´Ù. À̸¦ À§ÇØ ¹èÆ÷º»ÀÇ ÃÖ»óÀ§ µð·ºÅ丮¿¡ + ÀÖ´Â configure + ½ºÅ©¸³Æ®¸¦ »ç¿ëÇÑ´Ù. (¾ÆÆÄÄ¡ + ¼Ò½º Æ®¸®ÀÇ CVS ¹öÀüÀ» ´Ù¿î·ÎµåÇÑ °³¹ßÀÚ´Â ÀÌ¹Ì + autoconf¿Í libtool°¡ ¼³Ä¡µÇÀÖ°í, + ´ÙÀ½ °úÁ¤À¸·Î ³Ñ¾î°¡±â Àü¿¡ buildconf¸¦ ½ÇÇàÇØ¾ß + ÇÑ´Ù. ÀÌ´Â Á¤½Ä ¹öÀü¿¡¼­´Â ÇÊ¿ä¾ø´Ù.)

    + +

    ¸ðµÎ ±âº» ¿É¼ÇÀ» »ç¿ëÇÏ¿© ¼Ò½º Æ®¸®¸¦ ±¸¼ºÇÏ·Á¸é °£´ÜÈ÷ + ./configure¸¦ ÀÔ·ÂÇϸéµÈ´Ù. ±âº» ¿É¼ÇÀ» ¼öÁ¤ÇÏ·Á¸é + ./configure¿¡ ¿©·¯ º¯¼ö¿Í ¸í·ÉÇà ¿É¼ÇÀ» »ç¿ëÇÑ´Ù.

    + +

    °¡Àå Áß¿äÇÑ ¿É¼ÇÀº ¾ÆÆÄÄ¡°¡ Á¤»óÀûÀ¸·Î ÀÛµ¿ÇϱâÀ§ÇØ ¾ÆÆÄÄ¡¸¦ + ±¸¼ºÇÏ°í ¼³Ä¡ÇÒ Àå¼ÒÀÎ --prefix´Ù. ´Ù¸¥ configure + ¿É¼ÇµéÀ» »ç¿ëÇÏ¿© ÆÄÀÏÀÇ À§Ä¡¸¦ ´õ ÀÚ¼¼È÷ ¼³Á¤ÇÒ ¼öµµ + ÀÖ´Ù.

    + +

    ¸ðµâÀ» Æ÷ÇÔÇϰųª »©¼­ ¾ÆÆÄÄ¡¿¡ Æ÷ÇÔÇÒ + ±â´ÉÀ» + ¼±ÅÃÇÑ´Ù. Base + »óÅÂÀÎ ¸ðµâÀº ±âº»ÀûÀ¸·Î ¾ÆÆÄÄ¡¿¡ Æ÷ÇԵȴÙ. ´Ù¸¥ »óÅÂÀÇ + ¸ðµâÀº --enable-module ¿É¼ÇÀ» »ç¿ëÇÏ¿© + Æ÷ÇÔÇÑ´Ù. ¿©±â¼­ moduleÀº ¸ðµâ À̸§¿¡¼­ + mod_¸¦ »©°í ¹ØÁÙÀ» »©±â±âÈ£·Î º¯°æÇÑ °á°ú´Ù. + --enable-module=shared ¿É¼ÇÀ» »ç¿ëÇϸé + ¸ðµâÀ» ½ÇÇàÁß¿¡ Æ÷ÇÔÇϰųª »¬ ¼ö ÀÖ´Â °øÀ¯°´Ã¼(shared object, DSO)·Î ÄÄÆÄÀÏÇÑ´Ù. + ¶Ç, --disable-module ¿É¼ÇÀ» »ç¿ëÇÏ¿© + Base ¸ðµâÀ» »¬ ¼ö ÀÖ´Ù. ÁöÁ¤ÇÑ ¸ðµâÀÌ ¾ø¾îµµ + configure°¡ °æ°íÇÏÁö¾Ê°í ±×³É ¹«½ÃÇϱ⶧¹®¿¡ + ¸ðµâ À̸§À» Á¤È®È÷ ÀÔ·ÂÇ϶ó.

    + +

    °¡²û configure ½ºÅ©¸³Æ®¿¡°Ô ÄÄÆÄÀÏ·¯, + ¶óÀ̺귯¸®, Çì´õÆÄÀÏ µîÀÇ À§Ä¡¸¦ ¾Ë·ÁÁà¾ß ÇÒ °æ¿ì°¡ ÀÖ´Ù. + ÀÌ Á¤º¸´Â ȯ°æº¯¼ö³ª configureÀÇ ¸í·ÉÇà ¿É¼ÇÀ» + »ç¿ëÇÏ¿© Àü´ÞÇÑ´Ù. ÀÚ¼¼ÇÑ ³»¿ëÀº configure manpage¸¦ + Âü°íÇ϶ó.

    + +

    ¿©·¯ºÐÀÌ ¼±ÅÃÇÒ ¼ö ÀÖ´Â °¡´É¼ºÀ» º¸¿©ÁÖ±âÀ§ÇØ ´ÙÀ½Àº + ƯÁ¤ ÄÄÆÄÀÏ·¯¿Í Ç÷¡±×¸¦ »ç¿ëÇÏ°í ³ªÁß¿¡ DSO·Î ÀоîµéÀÏ + µÎ ¸ðµâ mod_rewrite¿Í + mod_spelingÀ» Ãß°¡ÇÏ¿© + /sw/pkg/apache¿¡ ¼³Ä¡ÇÒ ¾ÆÆÄÄ¡¸¦ ÄÄÆÄÀÏÇÏ´Â + ÀüÇüÀûÀÎ ¿¹ÀÌ´Ù:

    + +

    + $ CC="pgcc" CFLAGS="-O2" \
    + ./configure --prefix=/sw/pkg/apache \
    + --enable-rewrite=shared \
    + --enable-speling=shared +

    + +

    configure¸¦ ½ÇÇàÇÏ¸é ¸îºÐ°£ ½Ã½ºÅÛÀÇ ±â´ÉÀ» + °Ë»çÇÏ¿© ³ªÁß¿¡ ¼­¹ö¸¦ ÄÄÆÄÀÏÇÒ¶§ »ç¿ëÇÒ MakefileµéÀ» + ¸¸µç´Ù.

    + +

    configure ¿É¼Çµé¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ¼³¸íÀº configure manpage¿¡ ÀÖ´Ù.

    + +
    top
    +
    +

    ÄÄÆÄÀÏ

    + +

    ÀÌÁ¦ ´ÙÀ½ ¸í·É¾î Çϳª·Î ¾ÆÆÄÄ¡ÀÇ ¿©·¯ ºÎºÐÀ» ÄÄÆÄÀÏÇÒ + ¼ö ÀÖ´Ù:

    + +

    $ make

    + +

    ¿©±â¼­ Á» ±â´Ù·Á¶ó. ÆæƼ¾ö III/¸®´ª½º 2.2 ½Ã½ºÅÛ¿¡¼­ + ±âº» ±¸¼ºÀ» ÄÄÆÄÀÏÇϴµ¥ ¾à 3ºÐ Á¤µµ °É¸°´Ù. ÀÌ ½Ã°£Àº + Çϵå¿þ¾î¿Í Æ÷ÇÔÇÑ ¸ðµâ¼ö¿¡ µû¶ó Å©°Ô º¯ÇÑ´Ù.

    +
    top
    +
    +

    ¼³Ä¡

    + +

    ÀÌÁ¦ ´ÙÀ½ ¸í·É¾î·Î ÆÐÅ°Áö¸¦ (À§ÀÇ --prefix + ¿É¼Ç Âü°í) ÁöÁ¤ÇÑ ¼³Ä¡ À§Ä¡ PREFIX¿¡ ¼³Ä¡ÇÑ´Ù:

    + +

    $ make install

    + +

    ¾÷±×·¹À̵åÇÑ´Ù¸é ÀÌ ¼³Ä¡ °úÁ¤ÀÌ ±âÁ¸ ¼³Á¤ÆÄÀÏÀ̳ª ¹®¼­¸¦ + µ¤¾î¾²Áö ¾Ê´Â´Ù.

    +
    top
    +
    +

    ¼³Á¤

    + +

    ´ÙÀ½À¸·Î PREFIX/conf/¿¡ ÀÖ´Â + ¼³Á¤ÆÄÀÏÀ» ÆíÁýÇÏ¿© ¾ÆÆÄÄ¡ + À¥¼­¹ö¸¦ ¼³Á¤ÇÑ´Ù.

    + +

    $ vi PREFIX/conf/httpd.conf

    + +

    »ç¿ë°¡´ÉÇÑ ¼³Á¤ Áö½Ã¾î¿¡ + ´ëÇÑ ¿ÏÀüÇÑ ¼³¸í°ú ÀÌ ¹®¼­ÀÇ °¡Àå ÃÖ±Ù ÆÇÀº docs/manual/À̳ª http://httpd.apache.org/docs/2.0/¿¡ ÀÖ´Â ¾ÆÆÄÄ¡ ¼³¸í¼­¸¦ + Âü°íÇ϶ó.

    +
    top
    +
    +

    °Ë»ç

    + +

    ÀÌÁ¦ ´ÙÀ½°ú °°ÀÌ ¾ÆÆÄÄ¡ À¥¼­¹ö¸¦ ½ÃÀÛÇÒ ¼ö ÀÖ´Ù:

    + +

    $ PREFIX/bin/apachectl start

    + +

    ±×¸®°í URL http://localhost/·Î ù ¹®¼­¸¦ + ¿äûÇÑ´Ù. º¸°ÔµÉ À¥ÆäÀÌÁö´Â ¾Æ¸¶µµ + PREFIX/htdocs/ÀÏ DocumentRoot ¾Æ·¡¿¡ ÀÖ´Ù. ±×¸®°í + ´ÙÀ½ ¸í·É¾î·Î ´Ù½Ã ¼­¹ö¸¦ Áß´ÜÇÑ´Ù:

    + +

    $ PREFIX/bin/apachectl stop

    +
    top
    +
    +

    ¾÷±×·¹À̵å

    + +

    ¾÷±×·¹À̵åÇÑ´Ù¸é ¸ÕÀú »çÀÌÆ®¿¡ ¿µÇâÀ» ÁÙ ¼ö ÀÖ´Â º¯È­°¡ + ÀÖ´ÂÁö ¾Ë¾Æº¸±âÀ§ÇØ ¹ßÇ¥¹®°ú ¼Ò½º ¹èÆ÷º»ÀÇ CHANGES + ÆÄÀÏÀ» Àд´Ù. (¿¹¸¦ µé¾î, 1.3¿¡¼­ 2.0À̳ª 2.0¿¡¼­ 2.2¿Í + °°Àº) Å« ¹öÀüÀÌ º¯ÇÑ °æ¿ì ÄÄÆÄÀÏ ¿É¼Ç°ú ¼³Á¤À» Á÷Á¢ ¼öÁ¤ÇؾßÇÒ + Á¤µµÀÇ Å« º¯È­°¡ ÀÖÀ» °ÍÀÌ´Ù. ¸ðµç ¸ðµâµµ ¸ðµâ APIÀÇ º¯È­¿¡ + ¾Ë¸Â°Ô ¾÷±×·¹À̵åÇØ¾ß ÇÑ´Ù.

    + +

    ÀÛÀº ¹öÀüÀ» ÇÑ´Ü°è ¾÷±×·¹À̵åÇÏ´Â °ÍÀº (¿¹¸¦ µé¾î, + 2.0.55¿¡¼­ 2.0.57) ½±´Ù. make install ÀÛ¾÷Àº + ±âÁ¸ÀÇ ¹®¼­, ·Î±×ÆÄÀÏ, ¼³Á¤ÆÄÀÏÀ» ¼öÁ¤ÇÏÁö ¾Ê´Â´Ù. ¶Ç, + °³¹ßÀÚ´Â ÀÛÀº ¹öÀü°£¿¡ configure ¿É¼Ç, ¼³Á¤, + ¸ðµâ APIÀÇ È£È¯¼º¾ø´Â º¯È­¸¦ ÃÖ´ëÇÑ ¸·´Â´Ù. ´ëºÎºÐÀÇ °æ¿ì + µ¿ÀÏÇÑ configure ¸í·ÉÇà, µ¿ÀÏÇÑ ¼³Á¤ÆÄÀÏÀ» + »ç¿ëÇÒ ¼ö ÀÖ°í, ¸ðµâµéµµ ¸ðµÎ °è¼Ó µ¿ÀÛÇÒ °ÍÀÌ´Ù. (ÀÌ ¸»Àº + 2.0.41ÀÌÈÄ ¹öÀü¿¡¸¸ ÇØ´çÇÑ´Ù. ÀÌÀü ¹öÀüµé¿¡´Â ȣȯ¼º¾ø´Â + º¯È­°¡ ÀÖ´Ù.)

    + +

    ÀÌÀü¿¡ ¼³Ä¡Çß´ø ¼Ò½º¸¦ °¡Áö°í ÀÖ´Ù¸é, ¾÷±×·¹À̵尡 ´õ + ½¬¿öÁø´Ù. ÀÌÀü ¼Ò½º ÃÖ»óÀ§¿¡ ÀÖ´Â config.nice + ÆÄÀÏ¿¡´Â ¼Ò½º¸¦ ±¸¼ºÇÒ ¶§ »ç¿ëÇß´ø configure + ¸í·ÉÇà ¿É¼ÇÀÌ ±×´ë·Î ÀÖ´Ù. ±×·¡¼­ ´ÙÀ½ ¹öÀüÀ¸·Î ¾÷±×·¹À̵åÇÑ´Ù¸é + »õ·Î¿î ¹öÀü ¼Ò½º·Î config.nice ÆÄÀÏÀ» º¹»çÇÏ°í, + ¿øÇÑ´Ù¸é Á¶±Ý ¼öÁ¤À» ÇÑ ÈÄ, ´ÙÀ½°ú °°ÀÌ ½ÇÇàÇÑ´Ù:

    + +

    + $ ./config.nice
    + $ make
    + $ make install
    + $ PREFIX/bin/apachectl stop
    + $ PREFIX/bin/apachectl start
    +

    + +
    »õ·Î¿î ¹öÀüÀ» »ç¿ëÇϱâ Àü¿¡ Ç×»ó °Ë»çÇغÁ¾ß + ÇÑ´Ù. ¿¹¸¦ µé¾î, ¾÷±×·¹À̵带 ¸¶Ä¡±â Àü¿¡ ȣȯ¼º ¹®Á¦°¡ + ÀÖ´ÂÁö ¾Ë¾Æº¸±âÀ§ÇØ ´Ù¸¥ --prefix¿Í (Listen Áö½Ã¾î·Î) ´Ù¸¥ Æ÷Æ®¸¦ + »ç¿ëÇÏ¿© »õ·Î¿î ¹öÀüÀ» ¼³Ä¡ÇÑÈÄ ÀÌÀü ¹öÀü°ú °°ÀÌ ½ÇÇàÇغ¼ + ¼ö ÀÖ´Ù.
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/install.html.ru.koi8-r b/rubbos/app/httpd-2.0.64/docs/manual/install.html.ru.koi8-r new file mode 100644 index 00000000..73d96e4f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/install.html.ru.koi8-r @@ -0,0 +1,406 @@ + + + +ëÏÍÐÉÌÉÒÏ×ÁÎÉÅ É ÕÓÔÁÎÏ×ËÁ - HTTP ÓÅÒ×ÅÒ Apache + + + + + +
    <-
    +

    ëÏÍÐÉÌÉÒÏ×ÁÎÉÅ É ÕÓÔÁÎÏ×ËÁ

    +
    +

    äÏÓÔÕÐÎÙÅ ÑÚÙËÉ:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + + +

    üÔÏÔ ÄÏËÕÍÅÎÔ ÏÓ×ÅÝÁÅÔ ×ÏÐÒÏÓÙ ËÏÍÐÉÌÉÒÏ×ÁÎÉÑ É ÕÓÔÁÎÏ×ËÉ ÓÅÒ×ÅÒÁ + Apache ÔÏÌØËÏ ÎÁ UNIX É UNIX-ÐÏÄÏÂÎÙÈ ÓÉÓÔÅÍÁÈ. åÓÌÉ ×Ù ÈÏÔÉÔÅ ÕÓÔÁÎÏ×ÉÔØ + ÓÅÒ×ÅÒ ÐÏÄ Windows, ÔÏ ×ÁÍ ÎÅÏÂÈÏÄÉÍÏ ÐÒÏÞÉÔÁÔØ ÄÏËÕÍÅÎÔ «éÓÐÏÌØÚÏ×ÁÎÉÅ Apache ÐÏÄ Microsoft Windows». + éÎÆÏÒÍÁÃÉÑ, ËÁÓÁÀÝÁÑÓÑ ÏÓÔÁÌØÎÙÈ ÐÌÁÔÆÏÒÍ, ÓÏÄÅÒÖÉÔÓÑ × ÄÏËÕÍÅÎÔÅ + «ðÌÁÔÆÏÒÍÙ».

    + +

    óÒÅÄÁ ËÏÎÆÉÇÕÒÉÒÏ×ÁÎÉÑ É ÕÓÔÁÎÏ×ËÉ ÓÅÒ×ÅÒÁ ÐÏÌÎÏÓÔØÀ ÏÔÌÉÞÁÅÔÓÑ ÏÔ ÔÏÊ, ËÏÔÏÒÁÑ ÂÙÌÁ + × Apache 1.3. Apache 1.3 ÉÓÐÏÌØÚÏ×ÁÌ ÏÂÙÞÎÙÊ ÎÁÂÏÒ ÓËÒÉÐÔÏ×, ÐÏÚ×ÏÌÑ×ÛÉÊ ÕÐÒÏÓÔÉÔØ + ÐÒÏÃÅÓÓ ÕÓÔÁÎÏ×ËÉ. Apache 2.0 ÔÅÐÅÒØ ÉÓÐÏÌØÚÕÅÔ ÓÉÓÔÅÍÙ libtool É + autoconf, ÞÔÏ ÄÅÌÁÅÔ ÓÅÒ×ÅÒ ÐÏÈÏÖÉÍ ÎÁ ÄÒÕÇÉÅ ÐÒÏÇÒÁÍÍÎÙÅ ÐÒÏÄÕËÔÙ + Ó ÏÔËÒÙÔÙÍ ÉÓÈÏÄÎÙÍ ËÏÄÏÍ (Open Source projects).

    + +

    åÓÌÉ ×Ù ÐÅÒÅÈÏÄÉÔÅ ÏÔ ÍÌÁÄÛÅÇÏ ÒÅÌÉÚÁ ÓÅÒ×ÅÒÁ Ë ÓÔÁÒÛÅÍÕ ×ÎÕÔÒÉ + ÏÄÎÏÊ É ÔÏÊ ÖÅ ×ÅÔËÉ (ÎÁÐÒÉÍÅÒ, ÏÔ 2.0.50 Ë 2.0.51), ÔÏ + ÍÏÖÅÔÅ ÎÁÞÁÔØ ÞÔÅÎÉÅ Ó ÒÁÚÄÅÌÁ ÁÐÇÒÅÊÄ.

    + +
    + +
    top
    +
    +

    ëÒÁÔËÉÊ ÏÂÚÏÒ «ÄÌÑ ÎÅÔÅÒÐÅÌÉ×ÙÈ»

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    úÁÇÒÕÚËÁ$ lynx http://httpd.apache.org/download.cgi +
    òÁÓÐÁËÏ×ËÁ$ gzip -d httpd-2_0_NN.tar.gz
    + $ tar xvf httpd-2_0_NN.tar
    ëÏÎÆÉÇÕÒÉÒÏ×ÁÎÉÅ$ ./configure --prefix=PREFIX +
    ëÏÍÐÉÌÉÒÏ×ÁÎÉÅ$ make
    õÓÔÁÎÏ×ËÁ$ make install
    îÁÓÔÒÏÊËÁ$ vi PREFIX/conf/httpd.conf
    ðÒÏÂÎÙÊ ÚÁÐÕÓË$ PREFIX/bin/apachectl start +
    + +

    NN ÎÅÏÂÈÏÄÉÍÏ ÚÁÍÅÎÉÔØ ÎÁ ÔÅËÕÝÉÊ ÍÌÁÄÛÉÊ ÎÏÍÅÒ ×ÅÒÓÉÉ, + Á ×ÍÅÓÔÏ PREFIX ÎÁÄÏ ÕËÁÚÁÔØ ÐÕÔØ, ÐÏ + ËÏÔÏÒÏÍÕ ÄÏÌÖÅÎ ÂÙÔØ ÕÓÔÁÎÏ×ÌÅÎ ÓÅÒ×ÅÒ. åÓÌÉ PREFIX ÎÅ ÕËÁÚÁÎ, + ÔÏ ÕÓÔÁÎÏ×ËÁ ÐÏ ÕÍÏÌÞÁÎÉÀ ÐÒÏÉÚ×ÏÄÉÔÓÑ × ËÁÔÁÌÏÇ + /usr/local/apache2.

    + +

    âÏÌÅÅ ÐÏÄÒÏÂÎÏ ×ÓÅ ÜÔÁÐÙ ËÏÍÐÉÌÉÒÏ×ÁÎÉÑ É ÕÓÔÁÎÏ×ËÉ ÓÅÒ×ÅÒÁ ÒÁÓÓÍÏÔÒÅÎÙ + ÎÉÖÅ, ÐÒÉÞ£Í ÎÁÞÉÎÁÅÔÓÑ ÓÌÅÄÕÀÝÉÊ ÒÁÚÄÅÌ Ó ÏÐÉÓÁÎÉÑ ÓÉÓÔÅÍÎÙÈ ÔÒÅÂÏ×ÁÎÉÊ, + ÎÅÏÂÈÏÄÉÍÙÈ, ÄÌÑ ÔÏÇÏ ÞÔÏÂÙ ÕÓÔÁÎÏ×ËÁ ÐÒÏÛÌÁ ÕÓÐÅÛÎÏ.

    +
    top
    +
    +

    ôÒÅÂÏ×ÁÎÉÑ

    + +

    ôÒÅÂÏ×ÁÎÉÑ, ÎÅÏÂÈÏÄÉÍÙÅ ÄÌÑ ÕÓÐÅÛÎÏÊ ÓÂÏÒËÉ ÓÅÒ×ÅÒÁ:

    + +
    +
    äÉÓËÏ×ÏÅ ÐÒÏÓÔÒÁÎÓÔ×Ï
    +
    õÂÅÄÉÔÅÓØ, ÞÔÏ ÎÁ ÄÉÓËÅ ÅÓÔØ ËÁË ÍÉÎÉÎÉÍÕÍ 50 MB + Ó×ÏÂÏÄÎÏÇÏ ÍÅÓÔÁ ÄÌÑ ×ÒÅÍÅÎÎÙÈ ÆÁÊÌÏ×. ðÏÓÌÅ ÕÓÔÁÎÏ×ËÉ + Apache ÚÁÎÉÍÁÅÔ ÐÒÉÂÌÉÚÉÔÅÌØÎÏ 10 MB. ôÏÞÎÙÊ ÒÁÚÍÅÒ ÚÁÎÉÍÁÅÍÏÇÏ + ÍÅÓÔÁ ÂÕÄÅÔ ÚÁ×ÉÓÅÔØ × ÏÓÎÏ×ÎÏÍ ÏÔ ×ÙÂÒÁÎÎÏÊ ËÏÎÆÉÇÕÒÁÃÉÉ É + ÄÏÐÏÌÎÉÔÅÌØÎÏ ÕÓÔÁÎÁ×ÌÉ×ÁÅÍÙÈ ÍÏÄÕÌÅÊ, ÎÅ ×ÈÏÄÑÝÉÈ × ÄÉÓÔÒÉÂÕÔÉ× + Apache.
    + +
    ANSI-C ËÏÍÐÉÌÑÔÏÒ É ÎÅÏÂÈÏÄÉÍÁÑ ÓÒÅÄÁ ÓÂÏÒËÉ
    +
    õÂÅÄÉÔÅÓØ, ÞÔÏ × ×ÁÛÅÊ ÓÉÓÔÅÍÅ ÕÓÔÁÎÏ×ÌÅÎ ANSI-C + ËÏÍÐÉÌÑÔÏÒ. òÅËÏÍÅÎÄÕÅÔÓÑ ÉÓÐÏÌØÚÏ×ÁÔØ GNU C + ËÏÍÐÉÌÑÔÏÒ (GCC) ÏÔ Free Software Foundation (FSF) + (×ÅÒÓÉÉ 2.7.2 ×ÐÏÌÎÅ ÄÏÓÔÁÔÏÞÎÏ). åÓÌÉ Õ ×ÁÓ ÄÒÕÇÏÊ ËÏÍÐÉÌÑÔÏÒ, + ÔÏ ×ÙÑÓÎÉÔÅ, ÐÏÄÄÅÒÖÉ×ÁÅÔ ÌÉ ÏÎ ÓÔÁÎÄÁÒÔ ANSI. ðÒÏ×ÅÒØÔÅ ÔÁËÖÅ, + ÞÔÏÂÙ × ÐÅÒÅÍÅÎÎÏÊ ÏËÒÕÖÅÎÉÑ PATH ÂÙÌ ÕËÁÚÁÎ ËÁÔÁÌÏÇ, + ÓÏÄÅÒÖÁÝÉÊ ÏÓÎÏ×ÎÙÅ ÕÔÉÌÉÔÙ, ÎÅÏÂÈÏÄÉÍÙÅ ÄÌÑ ÓÂÏÒËÉ (make É ÄÒÕÇÉÅ).
    + +
    óÉÎÈÒÏÎÉÚÁÃÉÑ ×ÒÅÍÅÎÉ
    +
    ÷ ÎÅËÏÔÏÒÙÈ ÚÁÇÏÌÏ×ËÁÈ HTTP ÐÒÏÔÏËÏÌÁ ÕËÁÚÙ×ÁÅÔÓÑ ×ÒÅÍÑ. + ðÏÜÔÏÍÕ ×ÁÍ ÎÅÏÂÈÏÄÉÍÏ ×ÙÑÓÎÉÔØ, ËÁË ÍÏÖÎÏ ÕÓÔÁÎÏ×ÉÔØ × ×ÁÛÅÊ + ÓÉÓÔÅÍÅ ÓÒÅÄÓÔ×Ï ÓÉÎÈÒÏÎÉÚÁÃÉÉ ×ÒÅÍÅÎÉ. ïÂÙÞÎÏ ÄÌÑ ÜÔÉÈ ÃÅÌÅÊ + ÉÓÐÏÌØÚÕÀÔÓÑ ÐÒÏÇÒÁÍÍÙ ntpdate ÉÌÉ xntpd, + ÏÓÎÏ×ÁÎÎÙÅ ÎÁ ÓÅÔÅ×ÏÍ ÐÒÏÔÏËÏÌÅ ÓÉÎÈÒÏÎÉÚÁÃÉÉ ×ÒÅÍÅÎÉ + (Network Time Protocol - NTP). äÌÑ ÐÏÌÕÞÅÎÉÑ ÂÏÌÅÅ ÐÏÄÒÏÂÎÏÊ ÉÎÆÏÒÍÁÃÉÉ + Ï NTP É ÓÅÒ×ÅÒÁÈ ÓÉÎÈÒÏÎÉÚÁÃÉÉ ×ÒÅÍÅÎÉ, ÏÂÒÁÔÉÔÅÓØ × ÇÒÕÐÐÕ ÎÏ×ÏÓÔÅÊ Usenet comp.protocols.time.ntp, + Á ÔÁËÖÅ ÐÏÓÅÔÉÔÅ ÄÏÍÁÛÎÀÀ ÓÔÒÁÎÉÃÕ NTP.
    + +
    Perl 5 + [ïðãéïîáìøîï]
    +
    äÌÑ ×ÙÐÏÌÎÅÎÉÑ ÎÅËÏÔÏÒÙÈ ×ÓÐÏÍÏÇÁÔÅÌØÎÙÈ ÓËÒÉÐÔÏ×, ÔÁËÉÈ ËÁË + apxs ÉÌÉ dbmmanage + (ËÏÔÏÒÙÅ ÎÁÐÉÓÁÎÙ ÎÁ Perl), ÎÅÏÂÈÏÄÉÍ ÉÎÔÅÒÐÒÅÔÁÔÏÒ Ó ÑÚÙËÁ Perl + (×ÅÒÓÉÉ 5.003 ÉÌÉ ×ÙÛÅ ÄÏÓÔÁÔÏÞÎÏ). + åÓÌÉ × ×ÁÛÅÊ + ÓÉÓÔÅÍÅ ÕÓÔÁÎÏ×ÌÅÎÏ ÎÅÓËÏÌØËÏ ÉÎÔÅÒÐÒÅÔÁÔÏÒÏ× Ó ÑÚÙËÁ Perl (ÎÁÐÒÉÍÅÒ Perl 4 É Perl 5), + ÔÏ ÄÌÑ ÔÏÇÏ ÞÔÏÂÙ ÓËÒÉÐÔ configure ×ÙÂÒÁÌ ÎÕÖÎÙÊ, ×ÙÐÏÌÎÉÔÅ + ÅÇÏ Ó ÏÐÃÉÅÊ --with-perl (ÏÐÉÓÁÎÉÅ ÓÍÏÔÒÉÔÅ ÎÉÖÅ). + åÓÌÉ ËÏÎÆÉÇÕÒÁÃÉÏÎÎÙÊ ÓËÒÉÐÔ + configure ÎÅ ÎÁÊÄ£Ô ÅÇÏ × ×ÁÛÅÊ ÓÉÓÔÅÍÅ, ÔÏ ×Ù ×Ó£ ÒÁ×ÎÏ + ÓÍÏÖÅÔÅ ÓÏÂÒÁÔØ É ÕÓÔÁÎÏ×ÉÔØ Apache 2.0 - × ÜÔÏÍ ÓÌÕÞÁÅ ÎÅ ÂÕÄÕÔ + ÒÁÂÏÔÁÔØ ÔÏÌØËÏ ÐÅÒÅÞÉÓÌÅÎÎÙÅ ×ÙÛÅ ×ÓÐÏÍÏÇÁÔÅÌØÎÙÅ ÓËÒÉÐÔÙ. +
    +
    +
    top
    +
    +

    úÁÇÒÕÚËÁ

    + +

    Apache ÍÏÖÎÏ ÚÁÇÒÕÚÉÔØ ÓÏ ÓÔÒÁÎÉÃÙ ÚÁÇÒÕÚËÉ Apache HTTP Software + Foundation, ÎÁ ËÏÔÏÒÏÊ ÔÁËÖÅ ÐÒÉ×ÏÄÉÔÓÑ ÓÐÉÓÏË ÎÅËÏÔÏÒÙÈ ÚÅÒËÁÌØÎÙÈ ÓÅÒ×ÅÒÏ×. + ðÏÌØÚÏ×ÁÔÅÌÑÍ, ÒÁÂÏÔÁÀÝÉÍ ÎÁ unix-ÐÏÄÏÂÎÙÈ ÓÉÓÔÅÍÁÈ, ÒÅËÏÍÅÎÄÕÅÔÓÑ + ÓÏÂÉÒÁÔØ Apache ÉÚ ÉÓÈÏÄÎÙÈ ËÏÄÏ×. ðÒÏÃÅÓÓ ÓÂÏÒËÉ (ÏÐÉÓÁÎÎÙÊ ÎÉÖÅ) + ÄÏÓÔÁÔÏÞÎÏ ÐÒÏÓÔ É ÐÏÚ×ÏÌÑÅÔ ÎÁÓÔÒÏÉÔØ ÓÅÒ×ÅÒ ÐÏÄ ×ÁÛÉ ÎÕÖÄÙ. + ë ÔÏÍÕ ÖÅ ÚÁÞÁÓÔÕÀ ÂÉÎÁÒÎÙÅ ÐÁËÅÔÙ ÓÏÄÅÒÖÁÔ ÕÓÔÁÒÅ×ÛÕÀ ×ÅÒÓÉÀ ÓÅÒ×ÅÒÁ. + åÓÌÉ ÖÅ ×Ù ×Ó£-ÔÁËÉ ÚÁÇÒÕÚÉÌÉ ÂÉÎÁÒÎÙÊ ÐÁËÅÔ, ÔÏ ÓÌÅÄÕÊÔÅ ÉÎÓÔÒÕËÃÉÑÍ, + ÎÁÈÏÄÑÝÉÍÓÑ × ÆÁÊÌÅ INSTALL.bindist ÉÚ ÄÉÓÔÒÉÂÕÔÉ×Á.

    + +

    ðÏÓÌÅ ÚÁÇÒÕÚËÉ ÄÉÓÔÒÉÂÕÔÉ×Á, ÎÅÏÂÈÏÄÉÍÏ ÕÂÅÄÉÔØÓÑ, ÞÔÏ Õ ×ÁÓ × ÒÕËÁÈ ÐÏÌÎÁÑ, + ÎÅÉÚÍÅΣÎÎÁÑ ×ÅÒÓÉÑ HTTP ÓÅÒ×ÅÒÁ Apache. üÔÏ ÍÏÖÎÏ ÓÄÅÌÁÔØ + ÔÅÓÔÉÒÏ×ÁÎÉÅÍ ÁÒÈÉ×Á (tarball) ÎÁ ÓÏÏÔ×ÅÔÓÔ×ÉÅ PGP ÐÏÄÐÉÓÉ. + ðÒÏÃÅÄÕÒÁ ÐÒÏ×ÅÒËÉ ÄÅÔÁÌØÎÏ ÏÐÉÓÁÎÁ ÎÁ ÓÔÒÁÎÉÃÅ + ÚÁÇÒÕÚËÉ. ôÁËÖÅ ×Ù ÍÏÖÅÔÅ ÐÏÓÍÏÔÒÅÔØ ÐÏÄÒÏÂÎÙÊ + ÐÒÉÍÅÒ ÉÓÐÏÌØÚÏ×ÁÎÉÑ PGP.

    + +
    top
    +
    +

    òÁÓÐÁËÏ×ËÁ

    + +

    òÁÓÐÁËÏ×ËÁ ÁÒÈÉ×Á ÉÓÈÏÄÎÙÈ ËÏÄÏ× Apache + ÚÁËÌÀÞÁÅÔÓÑ × ÅÇÏ ÎÅÐÏÓÒÅÄÓÔ×ÅÎÎÏÊ ÒÁÓÐÁËÏ×ËÅ É + ÒÁÚÁÒÈÉ×ÉÒÏ×ÁÎÉÉ (untarring):

    + +

    +$ gzip -d httpd-2_0_NN.tar.gz
    +$ tar xvf httpd-2_0_NN.tar +

    + +

    ðÏÓÌÅ ×ÙÐÏÌÎÅÎÉÑ ÜÔÉÈ ËÏÍÁÎÄ ÂÕÄÅÔ ÓÏÚÄÁÎ ÎÏ×ÙÊ ËÁÔÁÌÏÇ + Ó ÉÓÈÏÄÎÙÍÉ ËÏÄÁÍÉ ÓÅÒ×ÅÒÁ. ÷Ù ÄÏÌÖÎÙ ÚÁÊÔÉ + × ÜÔÏÔ ËÁÔÁÌÏÇ, ÐÒÅÖÄÅ ÞÅÍ ÎÁÞΣÔÅ ËÏÍÐÉÌÉÒÏ×ÁÔØ ÓÅÒ×ÅÒ.

    +
    top
    +
    +

    ëÏÎÆÉÇÕÒÉÒÏ×ÁÎÉÅ ÄÅÒÅ×Á ÉÓÈÏÄÎÙÈ ËÏÄÏ×

    + +

    óÌÅÄÕÀÝÉÊ ÛÁÇ ÚÁËÌÀÞÁÅÔÓÑ × ËÏÎÆÉÇÕÒÉÒÏ×ÁÎÉÉ ÄÅÒÅ×Á ÉÓÈÏÄÎÙÈ + ËÏÄÏ× × ÓÏÏÔ×ÅÔÓÔ×ÉÉ Ó ÔÏÊ ÓÉÓÔÅÍÏÊ, ÎÁ ËÏÔÏÒÕÀ ×Ù ÕÓÔÁÎÁ×ÌÉ×ÁÅÔÅ + ÓÅÒ×ÅÒ, É ×ÁÛÉÍÉ ÓÏÂÓÔ×ÅÎÎÙÍÉ ÎÕÖÄÁÍÉ. üÔÏ ÄÅÌÁÅÔÓÑ ÐÒÉ ÐÏÍÏÝÉ + ÓËÒÉÐÔÁ configure, ÒÁÓÐÏÌÏÖÅÎÎÏÇÏ × ËÏÒÎÅ×ÏÍ ËÁÔÁÌÏÇÅ + ÄÉÓÔÒÉÂÕÔÉ×Á. (òÁÚÒÁÂÏÔÞÉËÉ, ÚÁÇÒÕÖÁÀÝÉÅ ÄÅÒÅ×Ï ÉÓÈÏÄÎÙÈ ËÏÄÏ× ÐÏÓÒÅÄÓÔ×ÏÍ + CVS, ÄÏÌÖÎÙ ÕÓÔÁÎÏ×ÉÔØ × Ó×ÏÅÊ ÓÉÓÔÅÍÅ ÕÔÉÌÉÔÙ autoconf + É libtool É ×ÙÐÏÌÎÉÔØ ÐÒÏÇÒÁÍÍÕ buildconf, ÐÒÅÖÄÅ + ÞÅÍ ÏÎÉ ÓÍÏÇÕÔ ÐÒÏÄÏÌÖÎÉÔØ ÕÓÔÁÎÏ×ËÕ. ÷ ÏÆÉÃÉÁÌØÎÙÈ ×ÙÐÕÓËÁÈ ÓÅÒ×ÅÒÁ + ÜÔÏÇÏ ÄÅÌÁÔØ ÎÅ ÔÒÅÂÕÅÔÓÑ.)

    + +

    äÌÑ ËÏÎÆÉÇÕÒÉÒÏ×ÁÎÉÑ ÄÅÒÅ×Á ÉÓÈÏÄÎÙÈ ËÏÄÏ× Ó ÉÓÐÏÌØÚÏ×ÁÎÉÅÍ + ÚÎÁÞÅÎÉÊ ×ÓÅÈ ÏÐÃÉÊ ÐÏ ÕÍÏÌÞÁÎÉÀ, ÐÒÏÓÔÏ ×ÙÐÏÌÎÉÔÅ ÓËÒÉÐÔ ./configure + ÂÅÚ ÐÁÒÁÍÅÔÒÏ×. äÌÑ ÉÚÍÅÎÅÎÉÑ ÚÎÁÞÅÎÉÊ ÏÐÃÉÊ, ÓËÒÉÐÔ configure + ÐÒÅÄÌÁÇÁÅÔ ÛÉÒÏËÉÊ ÎÁÂÏÒ ÐÅÒÅÍÅÎÎÙÈ É ÏÐÃÉÊ ËÏÍÁÎÄÎÏÊ ÓÔÒÏËÉ.

    + +

    îÁÉÂÏÌÅÅ ×ÁÖÎÁÑ ÏÐÃÉÑ ÚÄÅÓØ - ÜÔÏ ÐÒÅÆÉËÓ ËÁÔÁÌÏÇÁ + ÕÓÔÁÎÏ×ËÉ (--prefix), ÔÏ ÅÓÔØ ÔÏÔ ÐÕÔØ, ÐÏ ËÏÔÏÒÏÍÕ + ×ÐÏÓÌÅÄÓÔ×ÉÉ ÂÕÄÅÔ ÕÓÔÁÎÏ×ÌÅÎ Apache. + ÷ÏÚÍÏÖÅÎ ÂÏÌÅÅ ÇÉÂËÉÊ ËÏÎÔÒÏÌØ ÎÁÄ ÔÅÍ, ËÕÄÁ ÂÕÄÕÔ ÕÓÔÁÎÏ×ÌÅÎÙ + ÆÁÊÌÙ ÓÅÒ×ÅÒÁ, ÏÓÕÝÅÓÔ×ÌÑÅÍÙÊ ÄÏÐÏÌÎÉÔÅÌØÎÙÍÉ ÏÐÃÉÑÍÉ + ËÏÎÆÉÇÕÒÁÃÉÉ.

    + +

    ôÁËÖÅ ÓÅÊÞÁÓ ÓÁÍÏÅ ×ÒÅÍÑ ÒÅÛÉÔØ, ËÁËÏÊ ÆÕÎËÃÉÏÎÁÌØÎÏÓÔØÀ + ×Ù ÈÏÔÉÔÅ ÎÁÄÅÌÉÔØ ×ÁÛ ×ÅÂ-ÓÅÒ×ÅÒ ÐÕÔ£Í ×ËÌÀÞÅÎÉÑ É ÏÔËÌÀÞÅÎÉÑ + ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÉÈ ÍÏÄÕÌÅÊ. ðÏ ÕÍÏÌÞÁÎÉÀ, + Apache ËÏÍÐÉÌÉÒÕÅÔÓÑ Ó ÂÁÚÏ×ÙÍ ÎÁÂÏÒÏÍ ÍÏÄÕÌÅÊ. + ÷ÓÅ ÏÓÔÁÌØÎÙÅ ÍÏÄÕÌÉ ÐÏÄËÌÀÞÁÀÔÓÑ ÐÒÉ ÐÏÍÏÝÉ ÏÐÃÉÉ + --enable-module, ÇÄÅ module - + ÜÔÏ ÎÁÚ×ÁÎÉÅ ÍÏÄÕÌÑ, ÉÚ ËÏÔÏÒÏÇÏ ÕÂÒÁÎ ÐÒÅÆÉËÓ mod_ + É ×ÓÅ ÓÉÍ×ÏÌÙ ÐÏÄÞ£ÒËÉ×ÁÎÉÑ ÚÁÍÅÎÅÎÙ ÎÁ ÓÉÍ×ÏÌÙ ÔÉÒÅ. + ÷Ù ÔÁËÖÅ ÍÏÖÅÔÅ ÓËÏÍÐÉÌÉÒÏ×ÁÔØ ÍÏÄÕÌÉ ËÁË ÄÉÎÁÍÉÞÅÓËÉ ÐÏÄËÌÀÞÁÅÍÙÅ ÏÂßÅËÔÙ (DSO) -- + ÏÎÉ ÍÏÇÕÔ ÂÙÔØ ÚÁÇÒÕÖÅÎÙ É ×ÙÇÒÕÖÅÎÙ ÉÚ ÓÅÒ×ÅÒÁ ×Ï ×ÒÅÍÑ + ÅÇÏ ÒÁÂÏÔÙ -- × ÜÔÏÍ ÓÌÕÞÁÅ ÉÓÐÏÌØÚÕÊÔÅ ÏÐÃÉÀ + --enable-module=shared. ïÔËÌÀÞÅÎÉÅ + ÂÁÚÏ×ÏÇÏ ÍÏÄÕÌÑ ÐÒÏÉÚ×ÏÄÉÔÓÑ ÐÒÉ ÐÏÍÏÝÉ ÏÐÃÉÉ + --disable-module. éÓÐÏÌØÚÕÊÔÅ ÄÁÎÎÙÅ + ÏÐÃÉÉ Ó ÏÓÔÏÒÏÖÎÏÓÔØÀ, ÔÁË ËÁË configure + ÎÅ ÓÍÏÖÅÔ ÐÒÅÄÕÐÒÅÄÉÔØ ×ÁÓ × ÔÏÍ ÓÌÕÞÁÅ, ÅÓÌÉ ÍÏÄÕÌÑ, ËÏÔÏÒÙÊ + ×Ù ÕËÁÚÁÌÉ, ÎÅÔ; ÏÎ ÐÒÏÓÔÏ ÐÒÏÉÇÎÏÒÉÒÕÅÔ ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÕÀ ÏÐÃÉÀ.

    + +

    îÁËÏÎÅÃ, ÉÎÏÇÄÁ ÂÙ×ÁÅÔ ÎÅÏÂÈÏÄÉÍÏ ÐÒÅÄÏÓÔÁ×ÉÔØ ÓËÒÉÐÔÕ + configure ÄÏÐÏÌÎÉÔÅÌØÎÕÀ ÉÎÆÏÒÍÁÃÉÀ Ï + ÒÁÓÐÏÌÏÖÅÎÉÉ ×ÁÛÅÇÏ ËÏÍÐÉÌÑÔÏÒÁ, ÂÉÂÌÉÏÔÅË ÉÌÉ ÚÁÇÏÌÏ×ÏÞÎÙÈ ÆÁÊÌÏ×. + üÔÏ ÍÏÖÎÏ ÓÄÅÌÁÔØ ÌÉÂÏ ÐÒÉ ÐÏÍÏÝÉ ÐÅÒÅÍÅÎÎÙÈ ÏËÒÕÖÅÎÉÑ, ÌÉÂÏ + ÐÒÉ ÐÏÍÏÝÉ ÏÐÃÉÊ ËÏÍÁÎÄÎÏÊ ÓÔÒÏËÉ ÓËÒÉÐÔÁ configure. + úÁ ÂÏÌÅÅ ÐÏÄÒÏÂÎÏÊ ÉÎÆÏÒÍÁÃÉÅÊ ÏÂÒÁÝÁÊÔÅÓØ Ë ÓÐÒÁ×ÏÞÎÏÍÕ ÒÕËÏ×ÏÄÓÔ×Õ + ÓËÒÉÐÔÁ configure.

    + +

    äÌÑ ÔÏÇÏ ÞÔÏÂÙ ÐÏÌÕÞÉÔØ ÐÒÅÄÓÔÁ×ÌÅÎÉÅ Ï ÇÉÂËÏÓÔÉ ÐÒÏÃÅÓÓÁ ËÏÎÆÉÇÕÒÉÒÏ×ÁÎÉÑ Apache, + ÒÁÓÓÍÏÔÒÉÔÅ ÐÒÉ×ÅÄ£ÎÎÙÊ ÎÉÖÅ ÔÉÐÉÞÎÙÊ ÐÒÉÍÅÒ ÚÁÐÕÓËÁ ÓËÒÉÐÔÁ ./configure. + ôÁËÁÑ ËÏÎÆÉÇÕÒÁÃÉÑ ÐÏÚ×ÏÌÑÅÔ ÓËÏÍÐÉÌÉÒÏ×ÁÔØ + ÓÅÒ×ÅÒ ÄÌÑ ÐÏÓÌÅÄÕÀÝÅÊ ÕÓÔÁÎÏ×ËÉ + × ËÁÔÁÌÏÇ /sw/pkg/apache, ÉÓÐÏÌØÚÕÑ ÕËÁÚÁÎÎÙÊ ËÏÍÐÉÌÑÔÏÒ Ó + ÎÅÓËÏÌØËÉÍÉ ÐÒÅÄÎÁÚÎÁÞÅÎÎÙÍÉ ÄÌÑ ÎÅÇÏ ÏÐÃÉÑÍÉ ËÏÍÁÎÄÎÏÊ ÓÔÒÏËÉ, É ÕÓÔÁÎÏ×ÉÔØ + ÅÝ£ Ä×Á ÄÏÂÁ×ÏÞÎÙÈ ÍÏÄÕÌÑ mod_rewrite É mod_speling, + ËÏÔÏÒÙÅ ÍÏÖÎÏ ÂÕÄÅÔ ÐÏÔÏÍ ÉÓÐÏÌØÚÏ×ÁÔØ ÐÏÓÒÅÄÓÔ×ÏÍ ÍÅÈÁÎÉÚÍÁ DSO.

    + +

    + $ CC="pgcc" CFLAGS="-O2" \
    + ./configure --prefix=/sw/pkg/apache \
    + --enable-rewrite=shared \
    + --enable-speling=shared +

    + +

    ðÒÉ ×ÙÐÏÌÎÅÎÉÉ, ÓËÒÉÐÔ configure ÐÒÏ×ÅÒÑÅÔ, ÕÓÔÁÎÏ×ÌÅÎÏ ÌÉ × ×ÁÛÅÊ ÓÉÓÔÅÍÅ + ×Ó£ ÎÅÏÂÈÏÄÉÍÏÅ, Á ÚÁÔÅÍ ÓÏÚÄÁÅÔ Make-ÆÁÊÌÙ, ËÏÔÏÒÙÅ ÂÕÄÕÔ ÚÁÔÅÍ ÉÓÐÏÌØÚÏ×ÁÎÙ + ÄÌÑ ËÏÍÐÉÌÉÒÏ×ÁÎÉÑ ÓÅÒ×ÅÒÁ.

    + +

    ðÏÄÒÏÂÎÏÅ ÏÐÉÓÁÎÉÅ ×ÓÅÈ ×ÏÚÍÏÖÎÙÈ ÏÐÃÉÊ ÓËÒÉÐÔÁ + configure ÐÒÉ×ÅÄÅÎÏ × ÓÐÒÁ×ÏÞÎÏÍ ÒÕËÏ×ÏÄÓÔ×Å + configure.

    +
    top
    +
    +

    óÂÏÒËÁ

    + +

    ôÅÐÅÒØ ×Ù ÍÏÖÅÔÅ ÓËÏÍÐÉÌÉÒÏ×ÁÔØ É ÓÏÂÒÁÔØ ÓÅÒ×ÅÒ Apache, + ×ÙÐÏÌÎÉ× ÓÌÅÄÕÀÝÕÀ ËÏÍÁÎÄÕ:

    + +

    $ make

    + +

    îÁÂÅÒÉÔÅÓØ ÔÅÒÐÅÎÉÑ - ËÏÍÐÉÌÉÒÏ×ÁÎÉÅ ÓÅÒ×ÅÒÁ Ó ÂÁÚÏ×ÏÊ ËÏÎÆÉÇÕÒÁÃÉÅÊ + (ËÏÎÆÉÇÕÒÁÃÉÅÊ ÐÏ ÕÍÏÌÞÁÎÉÀ) ÚÁÎÉÍÁÅÔ ÐÒÉÂÌÉÚÉÔÅÌØÎÏ ÔÒÉ ÍÉÎÕÔÙ + ÎÁ ÔÁËÏÊ ÓÉÓÔÅÍÅ, ËÁË Pentium III/Linux 2.2. òÅÁÌØÎÏÅ ×ÒÅÍÑ ÓÂÏÒËÉ + ÂÕÄÅÔ ÚÁ×ÉÓÅÔØ ÏÔ ×ÁÛÅÇÏ ÁÐÐÁÒÁÔÎÏÇÏ ÏÂÅÓÐÅÞÅÎÉÑ É ÏÔ ËÏÌÉÞÅÓÔ×Á + ÍÏÄÕÌÅÊ, ËÏÔÏÒÙÅ ×Ù ÒÅÛÉÌÉ ËÏÍÐÉÌÉÒÏ×ÁÔØ ×ÍÅÓÔÅ Ó ÓÅÒ×ÅÒÏÍ.

    +
    top
    +
    +

    õÓÔÁÎÏ×ËÁ

    + +

    ôÅÐÅÒØ ÎÁÓÔÁÌÏ ×ÒÅÍÑ ÄÌÑ ÕÓÔÁÎÏ×ËÉ ÓÅÒ×ÅÒÁ × ËÁÔÁÌÏÇ + PREFIX, ËÏÔÏÒÙÊ ÂÙÌ ÕËÁÚÁÎ ÐÒÉ ËÏÎÆÉÇÕÒÉÒÏ×ÁÎÉÉ Apache + (ÓÍÏÔÒÉÔÅ ×ÙÛÅ ÏÐÃÉÀ --prefix), ×ÙÐÏÌÎÉ×:

    + +

    $ make install

    + +

    åÓÌÉ ÕÓÔÁÎÁ×ÌÉ×ÁÔØ Apache ÐÏ×ÅÒÈ ÐÒÅÄÙÄÕÝÅÊ ×ÅÒÓÉÉ ÓÅÒ×ÅÒÁ, ÔÏ + ÓÔÁÒÙÅ ËÏÎÆÉÇÕÒÁÃÉÏÎÎÙÅ ÆÁÊÌÙ É ÄÏËÕÍÅÎÔÙ ÂÕÄÕÔ ÏÓÔÁ×ÌÅÎÙ ÂÅÚ ÉÚÍÅÎÅÎÉÊ.

    +
    top
    +
    +

    îÁÓÔÒÏÊËÁ

    + +

    äÁÌÅÅ ×Ù ÍÏÖÅÔÅ ÎÁÓÔÒÏÉÔØ ×ÁÛ HTTP ÓÅÒ×ÅÒ Apache ÐÏÓÒÅÄÓÔ×ÏÍ ÒÅÄÁËÔÉÒÏ×ÁÎÉÑ + ËÏÎÆÉÇÕÒÁÃÉÏÎÎÙÈ ÆÁÊÌÏ× × ËÁÔÁÌÏÇÅ + PREFIX/conf/.

    + +

    $ vi PREFIX/conf/httpd.conf

    + +

    òÕËÏ×ÏÄÓÔ×Ï ÐÏ ÉÓÐÏÌØÚÏ×ÁÎÉÀ Apache ×Ù ÍÏÖÅÔÅ ÎÁÊÔÉ ÌÉÂÏ ÐÏ ÌÏËÁÌØÎÏÍÕ + ÁÄÒÅÓÕ Õ ÓÅÂÑ ÎÁ ÓÅÒ×ÅÒÅ docs/manual/, ÌÉÂÏ ÎÁ ÏÆÉÃÉÁÌØÎÏÍ + ÓÁÊÔÅ Apache http://httpd.apache.org/docs/2.0/, + ÇÄÅ ÏÐÕÂÌÉËÏ×ÁÎÁ ÓÁÍÁÑ ÐÏÓÌÅÄÎÑÑ ×ÅÒÓÉÑ ÄÏËÕÍÅÎÔÁÃÉÉ É ×ÓÑ ÎÅÏÂÈÏÄÉÍÁÑ ÓÐÒÁ×ÏÞÎÁÑ ÉÎÆÏÒÍÁÃÉÑ + ÐÏ ×ÓÅÍ ×ÏÚÍÏÖÎÙÍ ËÏÎÆÉÇÕÒÁÃÉÏÎÎÙÍ ÄÉÒÅËÔÉ×ÁÍ.

    +
    top
    +
    +

    ôÅÓÔÉÒÏ×ÁÎÉÅ

    + +

    ôÅÐÅÒØ ×Ù ÍÏÖÅÔÅ ÚÁÐÕÓÔÉÔØ Ó×ÏÊ HTTP ÓÅÒ×ÅÒ Apache, + ×ÙÐÏÌÎÉ× ÓÌÅÄÕÀÝÕÀ ËÏÍÁÎÄÕ:

    + +

    $ PREFIX/bin/apachectl start

    + +

    É ÅÓÌÉ ×Ó£ ÐÒÏÛÌÏ ÕÓÐÅÛÎÏ, ÔÏ ×Ù ÓÍÏÖÅÔÅ ÚÁÐÒÏÓÉÔØ Ó×ÏÊ ÐÅÒ×ÙÊ ÄÏËÕÍÅÎÔ + ÐÏ ÁÄÒÅÓÕ http://localhost/. ÷ÅÂ-ÓÔÒÁÎÉÃÁ, ËÏÔÏÒÕÀ ×Ù Õ×ÉÄÅÔÅ, + ÎÁÈÏÄÉÔÓÑ × ËÁÔÁÌÏÇÅ DocumentRoot - ÐÏ ÕÍÏÌÞÁÎÉÀ, + ÜÔÏ PREFIX/htdocs/. úÁÔÅÍ ÏÓÔÁÎÏ×ÉÔÅ + ÓÅÒ×ÅÒ ÓÌÅÄÕÀÝÅÊ ËÏÍÁÎÄÏÊ:

    + +

    $ PREFIX/bin/apachectl stop

    +
    top
    +
    +

    áÐÇÒÅÊÄ

    + +

    ðÅÒ×ÙÍ ÛÁÇÏÍ ÐÒÉ ÁÐÇÒÅÊÄÅ Ñ×ÌÑÅÔÓÑ ÞÔÅÎÉÅ ÉÎÆÏÒÍÁÃÉÉ Ï ÒÅÌÉÚÅ + É ÆÁÊÌÁ CHANGES, ÎÁÈÏÄÑÝÅÇÏÓÑ × ÄÅÒÅ×Å ÉÓÈÏÄÎÙÈ + ËÏÄÏ× - ÜÔÏ ÐÏÍÏÖÅÔ ×ÁÍ ÐÏÎÑÔØ, ËÁËÉÍ ÏÂÒÁÚÏÍ ÁÐÇÒÅÊÄ ÐÏ×ÌÉÑÅÔ + ÎÁ ×ÁÛ ÔÅËÕÝÉÊ ×ÅÂ-ÓÅÒ×ÅÒ. ðÒÉ ÐÅÒÅÈÏÄÅ ÍÅÖÄÕ ÒÁÚÎÙÍÉ ×ÅÔËÁÍÉ + ÓÅÒ×ÅÒÁ (ÎÁÐÒÉÍÅÒ, Ó 1.3 ÎÁ 2.0, ÉÌÉ Ó 2.0 ÎÁ 2.2), ÓËÏÒÅÅ ×ÓÅÇÏ + ÐÏÑ×ÑÔÓÑ ÓÕÝÅÓÔ×ÅÎÎÙÅ ÎÏ×Ï××ÅÄÅÎÉÑ × ËÏÎÆÉÇÕÒÉÒÏ×ÁÎÉÉ ÐÒÏÃÅÓÓÁ ÓÂÏÒËÉ + ÉÌÉ ÒÁÂÏÔÙ ÓÅÒ×ÅÒÁ, ËÏÔÏÒÙÅ ÐÏÔÒÅÂÕÀÔ ÁÎÁÌÉÚÁ É ÒÕÞÎÏÊ ÎÁÓÔÒÏÊËÉ. + ÷ÓÅ ÍÏÄÕÌÉ ÔÁËÖÅ ÎÅÏÂÈÏÄÉÍÏ ÂÕÄÅÔ ÐÒÏÁÐÇÒÅÊÄÉÔØ, ÄÌÑ ÔÏÇÏ ÞÔÏÂÙ + ÏÎÉ ÍÏÇÌÉ ÓÏÏÔ×ÅÔÓÔ×Ï×ÁÔØ ÉÚÍÅÎÅÎÉÑÍ × API ÍÏÄÕÌÅÊ.

    + +

    áÐÇÒÅÊÄ, ÏÓÕÝÅÓÔ×ÌÑÅÍÙÊ ×ÎÕÔÒÉ ÏÄÎÏÊ ×ÅÔËÉ ÓÅÒ×ÅÒÁ + (ÎÁÐÒÉÍÅÒ, Ó 2.0.55 ÎÁ 2.0.57) ÓÕÝÅÓÔ×ÅÎÎÏ ÐÒÏÝÅ. + ÷ÙÐÏÌÎÅÎÉÅ ËÏÍÁÎÄÙ make install ÎÅ ÐÅÒÅÚÁÐÉÛÅÔ + ÎÉËÁËÉÅ ÓÕÝÅÓÔ×ÕÀÝÉÅ ÄÏËÕÍÅÎÔÙ, ÆÁÊÌÙ ÌÏÇÏ× ÉÌÉ ËÏÎÆÉÇÕÒÁÃÉÏÎÎÙÅ ÆÁÊÌÙ. + ÷ ÄÏÐÏÌÎÅÎÉÅ Ë ÜÔÏÍÕ, ÒÁÚÒÁÂÏÔÞÉËÉ ÓÅÒ×ÅÒÁ ÄÅÌÁÀÔ ×Ó£ ×ÏÚÍÏÖÎÏÅ, + ÞÔÏÂÙ ÉÚÂÅÖÁÔØ ÎÅÓÏ×ÍÅÓÔÉÍÏÓÔÉ × ÏÐÃÉÑÈ ÓËÒÉÐÔÁ configure, + ÒÁÂÏÞÅÊ ËÏÎÆÉÇÕÒÁÃÉÉ ÓÅÒ×ÅÒÁ É API ÍÏÄÕÌÅÊ ÄÌÑ ÒÁÚÎÙÈ + ÍÌÁÄÛÉÈ ÒÅÌÉÚÏ× ×ÎÕÔÒÉ ÏÄÎÏÊ ×ÅÔËÉ. ÷ ÂÏÌØÛÉÎÓÔ×Å ÓÌÕÞÁÅ× ×Ù + ÍÏÖÅÔÅ ÉÓÐÏÌØÚÏ×ÁÔØ ÉÄÅÎÔÉÞÎÕÀ ÓÔÒÏËÕ ÚÁÐÕÓËÁ ÓËÒÉÐÔÁ + configure, ÔÏÔ ÖÅ ÓÁÍÙÊ ËÏÎÆÉÇÕÒÁÃÉÏÎÎÙÊ ÆÁÊÌ + É ÂÙÔØ Õ×ÅÒÅÎÎÙÍÉ, ÞÔÏ ×ÓÅ ×ÁÛÉ ÍÏÄÕÌÉ ÐÒÏÄÏÌÖÁÔ ÒÁÂÏÔÁÔØ. + (üÔÏ ×ÅÒÎÏ ÔÏÌØËÏ ÄÌÑ ×ÅÒÓÉÊ ÓÅÒ×ÅÒÁ, ÎÁÞÉÎÁÑ Ó 2.0.41; ÐÒÅÄÙÄÕÝÉÅ + ×ÅÒÓÉÉ ÉÍÅÀÔ ÎÅÓÏ×ÍÅÓÔÉÍÙÅ ÉÚÍÅÎÅÎÉÑ.)

    + +

    äÌÑ ÁÐÇÒÅÊÄÁ Ó ÏÄÎÏÇÏ ÍÌÁÄÛÅÇÏ ÒÅÌÉÚÁ ÎÁ ÄÒÕÇÏÊ, ÎÁÞÎÉÔÅ + Ó ÐÏÉÓËÁ ÆÁÊÌÁ config.nice, ËÏÔÏÒÙÊ ÄÏÌÖÅÎ ÎÁÈÏÄÉÔØÓÑ + ÌÉÂÏ × ËÁÔÁÌÏÇÅ build ÓÅÒ×ÅÒÁ, ÌÉÂÏ + × ËÏÒÎÅ ÄÅÒÅ×Á ÉÓÈÏÄÎÙÈ ËÏÄÏ× ÒÁÂÏÞÅÇÏ ÓÅÒ×ÅÒÁ. üÔÏÔ ÆÁÊÌ + ÓÏÄÅÒÖÉÔ × ÓÅÂÅ ÔÏÞÎÕÀ ËÏÐÉÀ ÓÔÒÏËÉ ÚÁÐÕÓËÁ ÓËÒÉÐÔÁ + configure, ËÏÔÏÒÕÀ ×Ù ÉÓÐÏÌØÚÏ×ÁÌÉ + ÐÒÉ ËÏÎÆÉÇÕÒÉÒÏ×ÁÎÉÉ ÄÅÒÅ×Á ÉÓÈÏÄÎÙÈ ËÏÄÏ×. úÁÔÅÍ, ÞÔÏÂÙ + ÏÓÕÝÅÓÔ×ÉÔØ ÁÐÇÒÅÊÄ, ÓËÏÐÉÒÕÊÔÅ ÆÁÊÌ config.nice + × ÄÅÒÅ×Ï ÉÓÈÏÄÎÙÈ ËÏÄÏ× ÎÏ×ÏÊ ×ÅÒÓÉÉ ÓÅÒ×ÅÒÁ, ×ÎÅÓÉÔÅ × ÎÅÇÏ + ×ÓÅ ÎÅÏÂÈÏÄÉÍÙÅ ÉÚÍÅÎÅÎÉÑ, Á ÚÁÔÅÍ ×ÙÐÏÌÎÉÔÅ:

    + +

    + $ ./config.nice
    + $ make
    + $ make install
    + $ PREFIX/bin/apachectl stop
    + $ PREFIX/bin/apachectl start
    +

    + +
    ÷ÓÅÇÄÁ ÔÅÓÔÉÒÕÊÔÅ ÎÏ×ÕÀ ×ÅÒÓÉÀ ÓÅÒ×ÅÒÁ + ÐÒÅÖÄÅ, ÞÅÍ ÚÁÐÕÓËÁÔØ Å£ × ÒÁÂÏÔÕ. îÁÐÒÉÍÅÒ, ×Ù ÍÏÖÅÔÅ + ÕÓÔÁÎÏ×ÉÔØ É ÚÁÐÕÓÔÉÔØ ÎÏ×ÕÀ ×ÅÒÓÉÀ ÓÅÒ×ÅÒÁ ÒÑÄÏÍ Ó ÔÅËÕÝÅÊ, ÉÓÐÏÌØÚÕÑ + ÄÒÕÇÏÊ ÐÒÅÆÉËÓ ÕÓÔÁÎÏ×ËÉ --prefix É ÄÒÕÇÏÊ + ÎÏÍÅÒ ÐÏÒÔÁ (ÐÕÔ£Í ÉÚÍÅÎÅÎÉÑ ÚÎÁÞÅÎÉÑ ÄÉÒÅËÔÉ×Ù Listen), ÄÌÑ ÔÏÇÏ ÞÔÏÂÙ + ÐÒÏÔÅÓÔÉÒÏ×ÁÔØ ÓÅÒ×ÅÒ ÎÁ ÓÏ×ÍÅÓÔÉÍÏÓÔØ Ó ÒÁÂÏÞÅÊ ËÏÎÆÉÇÕÒÁÃÉÅÊ, + ÐÒÅÖÄÅ ÞÅÍ ÄÅÌÁÔØ ÆÉÎÁÌØÎÙÊ ÁÐÇÒÅÊÄ.
    + +
    +
    +

    äÏÓÔÕÐÎÙÅ ÑÚÙËÉ:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/install.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/install.html.tr.utf8 new file mode 100644 index 00000000..8291cbe8 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/install.html.tr.utf8 @@ -0,0 +1,380 @@ + + + +Derleme ve Kurulum - Apache HTTP Sunucusu + + + + + +
    <-
    +

    Derleme ve Kurulum

    +
    +

    Mevcut Diller:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + + +

    Bu belge Apache’nin sadece Unix ve Unix benzeri sistemlerde + derlenmesini ve kurulmasını kapsar. Windows üzerinde derleme ve kurulum + için Apache’nin Microsoft Windows ile + kullanımı bölümüne bakınız. Diğer platformlar için ise platform belgelerine bakınız.

    + +

    Apache 2.0’ın yapılandırma ve kurulum ortamı Apache 1.3’e göre tamamen değişmiştir. Apache 1.3, kurulumu kolaylaştırmak için özel bazı betikler kullanırdı. Apache 2.0 ise artık derleme ortamını oluşturmak için çoğu Açık Kaynak Kodlu projenin yaptığı gibi libtool ve autoconf kullanmaktadır.

    + +

    Eğer sadece sürüm yükseltiyorsanız (2.0.50’den 2.0.51’e yükseltmek + gibi) lütfen doğrudan Yükseltme bölümüne + atlayınız.

    + +
    + +
    top
    +
    +

    Tez canlılar için genel bir bakış

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Ä°ndirme$ lynx http://httpd.apache.org/download.cgi +
    Paketi açma$ gzip -d httpd-2_0_NN.tar.gz
    + $ tar xvf httpd-2_0_NN.tar
    Yapılandırma$ ./configure --prefix=ÖNEK +
    Derleme$ make
    Kurulum$ make install
    Kişiselleştirme$ vi ÖNEK/conf/httpd.conf
    Deneme$ ÖNEK/bin/apachectl start +
    + +

    NN yerine kuracağınız alt sürümü, ÖNEK + yerine de dosya sisteminde sunucunun altına kurulacağı dizin yolunu + yazınız. ÖNEK belirtilmezse + /usr/local/apache2 öntanımlıdır.

    + +

    Derleme ve kurulum işleminin her aşaması, Apache httpd’nin derlenmesi + ve kurulması için gerekenler başta olmak üzere aşağıda ayrıntılı olarak + açıklanmıştır.

    +
    top
    +
    +

    Gereksinimler

    + +

    Apache’yi derleyebilmek için şunlar mevcut olmalıdır:

    + +
    +
    Disk Alanı
    +
    Geçici olarak en azından 50 MB boş disk alanınız olduğundan emin + olunuz. Kurulumdan sonra Apache yaklaşık 10 MB disk alanı kaplıyor + olacaktır. Asıl disk alanı gereksinimi seçtiğiniz yapılandırma + seçenekleri ve üçüncü parti modüllere göre değişiklik + gösterecektir.
    + +
    ANSI-C Derleyici ve Derleme Sistemi
    +
    Bir ANSI-C derleyicinin kurulu olduğundan emin olunuz. Free Software Foundation (FSF) + tarafından dağıtılan GNU C derleyicisini + (GCC) kullanmanız önerilir (2.7.2 sürümü uygundur). GCC yoksa en + azından satıcınızın derleyicisinin ANSI uyumlu olduğundan emin + olunuz. Ayrıca, PATH ortam değişkeninizin içerdiği + yollarda make gibi temel derleme araçları da + bulunmalıdır.
    + +
    Zamanın doğru belirlenmesi
    +
    HTTP protokolünün elemanları sunuldukları tarih ve saate göre ifade + edilirler. Bu bakımdan sisteminizdeki zaman ayarlama oluşumunun + ayarlarını gözden geçirmenizin tam sırasıdır. Bu amaçla, Ağ Zaman + Protokolüne (NTP) göre çalışan ntpdate veya + xntpd programları kullanılır. NTP yazılımları ve halka + açık zaman sunucuları hakkında daha ayrıntılı bilgi için NTP sitesine ve Usenet comp.protocols.time.ntp haber + grubuna bakınız.
    + +
    Perl 5 [SEÇİMLİK]
    +
    Perl ile yazılmış apxs veya + dbmmanage gibi bazı betikleri desteklemek için + Perl 5 yorumlayıcısı gerekir (5.003 veya daha yeni sürümleri + yeterlidir). Eğer sisteminizde birden fazla Perl yorumlayıcı + kuruluysa (örneğin, sistem geneli için Perl 4, kendi kullanımızı için + Perl 5 kurulu olabilir), doğru sürümün kullanılacağından emin olmak + bunu configure betiğine --with-perl + seçeneğini kullanarak belirtmeniz önerilir. Eğer + configure betiği sisteminizde Perl 5 yorumlayıcısı + bulamazsa bu betikleri kullanamazsınız. Ancak, bu durum Apache + 2.0’ın derlenip kurulmasına engel değildir.
    +
    +
    top
    +
    +

    Ä°ndirme

    + +

    Apache HTTP Sunucusunu, çeşitli yansıların da listelendiği Apache HTTP Sunucusu + indirme sayfasından indirebilirsiniz. Unix benzeri sistemler + kullanan Apache kullanıcılarının kaynak paketlerinden birini indirip + derlemeleri daha iyi olacaktır. Derleme işlemi (aşağıda açıklanmıştır) + kolaydır ve sunucunuzu ihtiyaçlarınıza uygun olarak kişiselleştirmenize + imkan tanır. Ayrıca, hazır derlenmiş paketler çoğunlukla en son kaynak + sürüm kadar güncel değildirler. Eğer böyle bir paket indirmişseniz, + kurarken paketin içinde bulunan INSTALL.bindist + dosyasındaki talimatlara uyunuz.

    + +

    İndirme işleminin ardından Apache HTTP Sunucusunun eksiksiz ve + değişikliğe uğramamış olduğunun doğrulanması önemlidir. Bu indirilen + tar paketinin PGP imzasına göre sınanması ile sağlanabilir. Bunun nasıl + yapılacağı indirme + sayfasında anlatıldığı gibi PGP + kullanımının anlatıldığı daha geniş bir örnek de vardır.

    + +
    top
    +
    +

    Paketi açma

    + +

    Apache HTTPD tar paketinden sıkıştırmayı kaldırdıktan sonra tar + arşivinden dosyaları çıkarmak basit bir işlemdir:

    + +

    +$ gzip -d httpd-2_0_NN.tar.gz
    +$ tar xvf httpd-2_0_NN.tar +

    + +

    Bu işlem bulunduğunuz dizinin içinde dağıtımın kaynak dosyalarını + içeren yeni bir dizin oluşturacaktır. Sunucuyu derleme işlmine + başlayabilmek için önce cd ile bu dizine geçmelisiniz.

    +
    top
    +
    +

    Kaynak ağacının yapılandırılması

    + +

    Sonraki adım, Apache kaynak ağacının platformunuza ve kişisel + gereksinimlerinize uygun olarak yapılandırılmasıdır. Bu işlem dağıtımın + kök dizininde bulunan configure betiği kullanılarak + yapılır. (Apache kaynak ağacının CVS sürümünü + indiren geliştiricilerin sistemlerinde autoconf ve + libtool kurulu olması ve sonraki adıma geçmek için + buildconf çalıştırmaları gerekir. Bu işlem resmi + dağıtımlar için gerekli değildir.)

    + +

    Kaynak ağacını tamamen öntanımlı seçenekler kullanılarak derlemek için + ./configure komutunu vermek yeterlidir. Öntanımlı + seçenekleri değiştirmek için configure betiği + çeşitli değişkenler ve komut satırı seçenekleri kabul eder.

    + +

    En önemli seçenek, Apache’nin kurulacağı yerin belirlenmesini, + dolayısıyla Apache’nin bu konumda doğru olarak çalışması için + yapılandırılmasını sağlayan --prefix’tir. Kurulacak + dosyaların yerleri ile ilgili daha ayrıntılı denetim ek yapılandırma + seçenekleri ile mümkün kılınmıştır.

    + +

    Bu noktada ayrıca, Apache’de hangi özelliklerin bulunmasını + istediğinizi modülleri etkin kılarak veya iptal + ederek belirtebilirsiniz. Apache, öntanımlı olarak içerilmiş temel modüllerle gelir. Diğer + modüller --enable-modül seçenekleri + kullanılarak etkinleştirilir. Buradaki modül, + önünden mod_ dizgesi kaldırılmış ve içindeki altçizgi + imleri tire imleri ile değiştirilmiş modül ismidir. Ayrıca, + --enable-modül=shared seçeneklerini kullanarak + modülleri çalışma anında gerektiğinde yüklemek veya kaldırmak üzere paylaşımlı nesneler (DSO’lar) olarak derlemeniz de + mümkündür. Temel modülleri de benzer şekilde + --disable-modül seçenekleriyle iptal + edebilirsiniz. configure betiği mevcut olmayan + modüller için sizi uyarmayıp, seçeneği yok saymakla yetineceğinden, bu + seçenekleri kullanırken dikkatli olmalısınız.

    + +

    Ek olarak, bazen kullandığınız derleyici, kütüphaneler veya başlık + dosyalarının yerleri hakkında configure betiğine + ilave bilgiler sağlamanız gerekir. Bu işlem + configure betiğine ya ortam değişkenleriyle ya da + komut satırı seçenekleriyle bilgi aktarılarak yapılır. Daha fazla bilgi + için configure kılavuz sayfasına bakınız.

    + +

    Apache’yi derlerken ne gibi olasılıklara sahip olduğunuz hakkında bir + izlenim edinmeniz için aşağıda tipik bir örneğe yer verilmiştir. Bu + örnekte, Apache’nin /sw/pkg/apache önekiyle başlayan + dizinlere kurulması, belli bir derleyici ve derleyici seçenekleriyle + derlenmesi ve mod_rewrite ve + mod_speling modüllerinin de DSO mekanizması üzerinden + daha sonra yüklenmek üzere derlenmesi istenmektedir:

    + +

    + $ CC="pgcc" CFLAGS="-O2" \
    + ./configure --prefix=/sw/pkg/apache \
    + --enable-rewrite=shared \
    + --enable-speling=shared +

    + +

    configure betiği başlatıldığında sisteminizde + mevcut özelliklerin işe yararlığını sınamak ve sonradan sunucuyu + derlemek için kullanılacak Makefile dosyalarını oluşturmak için bir kaç + dakika çalışacaktır.

    + +

    configure seçeneklerinin tamamı ayrıtılı olarak + configure kılavuz sayfasında açıklanmıştır.

    +
    top
    +
    +

    Derleme

    + +

    Artık, Apache paketini şekillendiren çeşitli parçaları derlemek için + basitçe aşağıdaki komutu verebilirsiniz:

    + +

    $ make

    + +

    Bu komutu verdikten sonra lütfen sabırlı olunuz. Temel yapılandırmanın + derlenmesi bir Pentium III/Linux 2.2 makinede 3 dakika alsa da + modüllerin derlenmesi donanımınıza ve seçtiğiniz modüllerin sayısına + bağlı olarak daha uzun süre gerektirecektir.

    +
    top
    +
    +

    Kurulum

    + +

    Şimdi sıra ÖNEK dizini altına kurulmak üzere + yapılandırdığınız (yukarı --prefix seçeneğine bakınız) + paketi kurmaya geldi. Basitçe şu komutu veriniz:

    + +

    # make install

    + +

    ÖNEK dizininde genellikle yazma izinlerinin + sınırlı oluşu nedeniyle bu adım genellikle root yetkilerini + gerektirir.

    + +

    Eğer sürüm yükseltiyorsanız, kurulum sırasında mevcut yapılandırma + dosyalarının ve belgelerin üzerine yazılmayacaktır.

    +
    top
    +
    +

    Kişiselleştirme

    + +

    Bu adımda, Apache HTTP sunucunuzu ÖNEK/conf/ + dizini altındaki yapılandırma + dosyalarını düzenleyerek kişiselleştirebilirsiniz.

    + +

    $ vi ÖNEK/conf/httpd.conf

    + +

    Bu kılavuz ve kullanılabilecek yapılandırma yönergelerinin kılavuzlarını + docs/manual/ altında bulabileceğiniz gibi en + son sürümünü daima http://httpd.apache.org/docs/2.0/ adresinde + bulabilirsiniz.

    +
    top
    +
    +

    Deneme

    + +

    Artık Apache HTTP sunucunuzu başlatmaya + hazırsınız. Hemen şu komutu verin:

    + +

    $ ÖNEK/bin/apachectl start

    + +

    http://localhost/ üzerinden ilk belgeniz için bir istek + yapmalısınız. Genellikle DocumentRoot olarak bilinen + ÖNEK/htdocs/ altındaki sayfayı görürsünüz. + Çalışmakta olan sunucuyu durdurmak için şu + komutu verebilirsiniz:

    + +

    $ ÖNEK/bin/apachectl stop

    +
    top
    +
    +

    Yükseltme

    + +

    Sürüm yükseltme işleminin ilk adımı, sitenizi etkileyen değişiklikleri + öğrenmek için dağıtım duyurusunu ve kaynak paketindeki + CHANGES dosyasını okumaktır. Ana sürümlerden yükseltme + yapıyorsanız (1.3’ten 2.0’a veya 2.0’dan 2.2’ye gibi), derleme anı ve + çalışma anı yapılandırmalarındaki ana farklılıklar elle ayarlamalar + yapmanızı gerektirecektir. Ayrıca, tüm modüllerin de modül API’sindeki + değişikliklere uyum sağlaması için yükseltilmesi gerekecektir.

    + +

    Aynı ana sürüm içinde yükseltme yapmak (2.0.55’ten 2.0.57’ye + yükseltmek gibi) daha kolaydır. make install işlemi, + mevcut yapılandırma ve günlük dosyalarınızın ve belgelerin üzerine + yazmayacaktır. Ek olarak, geliştiriciler alt sürüm değişikliklerinde + configure seçenekleri, çalışma anı yapılandırması + veya modül API’sinde uyumsuz değişiklikler yapmamaya özen + göstereceklerdir. Çoğu durumda, aynı configure komut + satırını, aynı yapılandırma dosyasını kullanabileceksiniz ve tüm + modülleriniz de çalışmaya devam edebilecektir. (Bu sadece 2.0.41 sürümünden sonrası için geçerlidir; daha önceki sürümler için uyumluluk söz konusu değildir.)

    + +

    Aynı ana sürüm içinde yükseltme işlemine, eski kaynak ağacının kök + dizininde veya kurulu sunucunuzun build dizininde + bulacağınız config.nice dosyasını yeni kaynak ağacının kök + dizinine kopyalamak suretiyle başlayabilirsiniz. Bu dosya evvelce + kaynak ağacını yapılandırmakta kullandığınız + configure komut satırını içerir. + config.nice dosyasında yapmak istediğiniz değişiklikler + varsa yaptıktan sonra şu komutları veriniz:

    + +

    + $ ./config.nice
    + $ make
    + $ make install
    + $ ÖNEK/bin/apachectl graceful-stop
    + $ ÖNEK/bin/apachectl start
    +

    + +
    Her yeni sürümü hizmete sokmadan önce daima çalışma + ortamınızda denemeniz gerekir. Örneğin, yükseltme işlemini + sonuçlandırmadan önce eski sürümün çalışmasını durdurmadan yenisini + farklı bir --prefix ile kurabilir ve farklı bir port ile + (Listen yönergesini + ayarlamak suretiyle) çalıştırabilirsiniz.
    +
    +
    +

    Mevcut Diller:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/invoking.html b/rubbos/app/httpd-2.0.64/docs/manual/invoking.html new file mode 100644 index 00000000..f38962a0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/invoking.html @@ -0,0 +1,29 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: invoking.html.de +Content-Language: de +Content-type: text/html; charset=ISO-8859-1 + +URI: invoking.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: invoking.html.es +Content-Language: es +Content-type: text/html; charset=ISO-8859-1 + +URI: invoking.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: invoking.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: invoking.html.ru.koi8-r +Content-Language: ru +Content-type: text/html; charset=KOI8-R + +URI: invoking.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/invoking.html.de b/rubbos/app/httpd-2.0.64/docs/manual/invoking.html.de new file mode 100644 index 00000000..c1477952 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/invoking.html.de @@ -0,0 +1,158 @@ + + + +Apache starten - Apache HTTP Server + + + + + +
    <-
    +

    Apache starten

    +
    +

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

    +
    + +

    Unter Windows läuft der Apache üblicherweise als Dienst + (Windows NT, 2000 und XP) oder als Konsolenanwendung (Windows 9x und + ME). Für Einzelheiten lesen Sie bitte Apache als Dienst betreiben + und Apache als Konsolenanwendung betreiben.

    + +

    Unter Unix wird das httpd-Programm als Daemon + ausgeführt, der im Hintergrund fortlaufend aktiv ist, um + Anfragen zu bearbeiten. Dieses Dokument beschreibt, wie + httpd aufgerufen wird.

    +
    + +
    top
    +
    +

    Wie der Apache startet

    + +

    Wenn die in der Konfigurationsdatei angegebene Listen-Anweisung auf die Voreinstellung + von 80 gesetzt ist (oder einen anderen Port unterhalb von 1024), dann + müssen Sie root-Berechtigung besitzen, um den Apache starten + zu können. Nur dann kann er sich an diesen privilegierten + Port binden. Sobald der Server gestartet ist und einige vorbereitende + Aktionen wie das Öffnen seiner Log-Dateien ausgeführt hat, + startet er mehrere Kind-Prozesse, welche die Arbeit erledigen: + das Lauschen auf und Beantworten von Anfragen von Clients. Der + Haupt-httpd-Prozess läuft unter dem Benutzer root + weiter, die Kind-Prozesse jedoch werden unter weniger privilegierten + Benutzerkennungen ausgeführt. Dies wird von dem ausgewählten + Multi-Processing-Modul gesteuert.

    + +

    Die Verwendung des Steuerskripts apachectl ist die + empfohlene Methode, das httpd-Programm zu starten. + Dieses Skript setzt verschiedene Umgebungsvariablen, die für die + korrekte Funktion von httpd unter einigen + Betriebssystemen notwendig sind, und startet dann das + httpd-Programm. apachectl + reicht alle Kommandozeilenargumente durch, so dass alle + httpd-Optionen auch mit apachectl + verwendet werden können. Um den korrekten Ablageort des + httpd-Programms sowie einige Kommandozeilenargumente + anzugeben, die Sie immer verwenden möchten, können + Sie auch das Skript apachectl direkt editieren und die + Variable HTTPD am Anfang ändern.

    + +

    Das Erste was httpd macht, wenn es startet, ist das + Suchen und Einlesen der Konfigurationsdatei httpd.conf. + Der Ablageort dieser Datei wird zur Kompilierungszeit festgelegt. Es ist + aber möglich, den Ablageort zur Laufzeit anzugeben, indem die + Kommandozeilenoption -f wie folgt verwendet wird:

    + +

    /usr/local/apache2/bin/apachectl -f + /usr/local/apache2/conf/httpd.conf

    + +

    Wenn während des Starts alles gutgeht, trennt sich der Server + vom Terminal ab und die Eingabeaufforderung erscheint gleich darauf + wieder. Dies zeigt an, dass der Server hochgefahren ist und läuft. + Sie können nun Ihren Browser benutzen, um Verbindung zum Server + aufzunehmen und sich die Testseite im DocumentRoot-Verzeichnis anzusehen wie auch + die lokale Kopie der Dokumentation, die von dieser Seite aus verlinkt + ist.

    +
    top
    +
    +

    Fehler während des Hochfahrens

    + +

    Wenn der Apache während des Hochfahrens einen schweren Fehler + feststellt, schreibt er entweder eine Nachricht, die das Problem + näher schildert, auf die Konsole oder ins ErrorLog, bevor er sich selbst beendet. + Eine der häufigsten Fehlermeldungen ist "Unable + to bind to Port ..." (Anm.d.Ü.: "Kann nicht an Port ... + binden"). Diese Meldung wird üblicherweise verursacht:

    + +
      +
    • entweder durch den Versuch, den Server an einem privilegierten + Port zu starten, während man nicht als Benutzer root angemeldet + ist,
    • + +
    • oder durch den Versuch, den Server zu starten, wenn bereits eine + andere Instanz des Apache oder ein anderer Webserver an den gleichen + Port gebunden ist.
    • +
    + +

    Für weitere Anleitungen zur Fehlerbehebung lesen Sie bitte die + Apache-FAQ.

    +
    top
    +
    +

    Beim Bootvorgang starten

    + +

    Wenn Sie möchten, dass Ihr Server direkt nach einem + System-Neustart weiterläuft, sollten Sie einen Aufruf von + apachectl zu den Startdateien Ihres Systems + hinzufügen (üblicherweise rc.local oder + eine Datei in einem rc.N-Verzeichnis). Dies startet + den Apache als root. Stellen Sie zuvor jedoch sicher, dass Ihr + Server hinsichtlich Sicherheit und Zugriffsbeschränkungen + richtig konfiguriert ist.

    + +

    Das apachectl-Skript ist dafür ausgelegt, wie + ein Standard-SysV-init-Skript zu arbeiten. Es akzeptiert die Argumente + start, restart und stop + und übersetzt sie in die entsprechenden Signale für + httpd. Daher können Sie oftmals + einfach apachectl in das entsprechende init-Verzeichnis + linken. Überprüfen Sie bitte auf jeden Fall die genauen + Anforderungen Ihres Systems.

    +
    top
    +
    +

    Weitere Informationen

    + +

    Weitere Informationen über Kommandozeilenoptionen von httpd und apachectl sowie anderen + Hilfsprogrammen, die dem Server beigefügt sind, sind auf der + Seite Server und Hilfsprogramme + verfügbar. Es existiert außerdem eine Dokumentation + aller in der Apache-Distribution enthaltenen Module und der von ihnen bereitgestellten + Direktiven.

    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/invoking.html.en b/rubbos/app/httpd-2.0.64/docs/manual/invoking.html.en new file mode 100644 index 00000000..ebf75c0d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/invoking.html.en @@ -0,0 +1,153 @@ + + + +Starting Apache - Apache HTTP Server + + + + + +
    <-
    +

    Starting Apache

    +
    +

    Available Languages:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + +

    On Windows, Apache is normally run as a service on Windows + NT, 2000 and XP, or as a console application on Windows 9x and + ME. For details, see Running Apache as a Service + and Running Apache as a + Console Application.

    + +

    On Unix, the httpd program + is run as a daemon that executes continuously in the + background to handle requests. This document describes how + to invoke httpd.

    +
    + +
    top
    +
    +

    How Apache Starts

    + +

    If the Listen + specified in the configuration file is default of 80 (or any other + port below 1024), then it is necessary to have root privileges in + order to start apache, so that it can bind to this privileged + port. Once the server has started and performed a few preliminary + activities such as opening its log files, it will launch several + child processes which do the work of listening for and + answering requests from clients. The main httpd + process continues to run as the root user, but the child processes + run as a less privileged user. This is controlled by the selected + Multi-Processing Module.

    + +

    The recommended method of invoking the httpd + executable is to use the apachectl control script. This + script sets certain environment variables that are necessary for + httpd to function correctly under some operating + systems, and then invokes the httpd binary. + apachectl will pass through any command line + arguments, so any httpd options may also be used with + apachectl. You may also directly edit the + apachectl script by changing the HTTPD + variable near the top to specify the correct location of the + httpd binary and any command-line arguments that you + wish to be always present.

    + +

    The first thing that httpd does when it is + invoked is to locate and read the configuration file + httpd.conf. The location of this file is set at + compile-time, but it is possible to specify its location at run + time using the -f command-line option as in

    + +

    /usr/local/apache2/bin/apachectl -f + /usr/local/apache2/conf/httpd.conf

    + +

    If all goes well during startup, the server will detach from + the terminal and the command prompt will return almost + immediately. This indicates that the server is up and running. + You can then use your browser to connect to the server and view + the test page in the DocumentRoot directory + and the local copy of the documentation linked from that + page.

    +
    top
    +
    +

    Errors During Start-up

    + +

    If Apache suffers a fatal problem during startup, it will + write a message describing the problem either to the console or + to the ErrorLog before + exiting. One of the most common error messages is "Unable + to bind to Port ...". This message is usually caused by + either:

    + +
      +
    • Trying to start the server on a privileged port when not + logged in as the root user; or
    • + +
    • Trying to start the server when there is another instance + of Apache or some other web server already bound to the same + Port.
    • +
    + +

    For further trouble-shooting instructions, consult the + Apache FAQ.

    +
    top
    +
    +

    Starting at Boot-Time

    + +

    If you want your server to continue running after a system + reboot, you should add a call to apachectl to your + system startup files (typically rc.local or a file in + an rc.N directory). This will start Apache as + root. Before doing this ensure that your server is properly + configured for security and access restrictions.

    + +

    The apachectl script is designed to act like a + standard SysV init script; it can take the arguments + start, restart, and stop + and translate them into the appropriate signals to + httpd. So you can often simply link + apachectl into the appropriate init directory. But be + sure to check the exact requirements of your system.

    +
    top
    +
    +

    Additional Information

    + +

    Additional information about the command-line options of httpd and apachectl as well as other support + programs included with the server is available on the + Server and Supporting Programs page. + There is also documentation on all the modules included with the Apache distribution + and the directives that they + provide.

    +
    +
    +

    Available Languages:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/invoking.html.es b/rubbos/app/httpd-2.0.64/docs/manual/invoking.html.es new file mode 100644 index 00000000..47afcfc5 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/invoking.html.es @@ -0,0 +1,170 @@ + + + +Iniciar Apache - Servidor HTTP Apache + + + + + +
    <-
    +

    Iniciar Apache

    +
    +

    Idiomas disponibles:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + +

    En Windows, Apache se ejecuta normalmente como un servicio en + Windows NT, 2000 y XP, y como una aplicación de consola en + Windows 9x y ME. Para obtener más información, consulte + Ejecutar Apache como un + servicio y Ejecutar + Apache como una aplicación de consola.

    + +

    En Unix, el programa httpd se ejecuta como + un demonio (daemon) en modo silencioso y atiende las peticiones + que le lleguen. Este documento explica cómo invocar el + programa httpd.

    +
    + +
    top
    +
    +

    Cómo iniciar Apache

    + +

    Si el puerto especificado en la directiva Listen del fichero de + configuración es el que viene por defecto, es decir, el + puerto 80 (o cualquier otro puerto por debajo del 1024), es + necesario tener privilegios de usuario root (superusuario) para + iniciar Apache. Solamente con esos privilegios puede establecerse + una conexión a través de esos puertos. Una vez que el + servidor Apache se ha iniciado y ha completado algunas tareas + preliminares, como abrir sus ficheros log, lanzará varios + procesos hijo, que hacen el trabajo de escuchar y atender + las peticiones de los clientes. El proceso principal, + httpd continúa ejecutandose como root, pero los + procesos hijo se ejecutan con menores privilegios de usuario. + Esto lo controla el módulo de + multiprocesamiento (MPM) seleccionado.

    + +

    El método recomendado para invocar el ejecutable + httpd es usar el script de control + apachectl. Este script fija los valores de + determinadas variables de entorno que son necesarias para que + httpd funcione correctamente en el sistema operativo, + y después invoca el binario httpd. + apachectl pasa a httpd cualquier argumento que + se le pase a través de la línea de comandos, de forma + que cualquier opción de httpd puede ser + usada también con apachectl. Puede editar + directamente el script apachectl y cambiar la + variable HTTPD que está al principio y que + especifica la ubicación exacta en la que está el binario + httpd y cualquier argumento de línea de + comandos que quiera que esté siempre presente cuando + use este script.

    + +

    La primera cosa que hace httpd cuando es invocado + es localizar y leer el fichero de + configuración httpd.conf. El lugar en el que + está ese fichero se determina al compilar, pero también + es posible especificar la ubicación en la que se encuentra al + iniciar el servidor Apache usando la opción de línea de + comandos -f

    + +

    /usr/local/apache2/bin/apachectl -f + /usr/local/apache2/conf/httpd.conf

    + +

    Si todo va bien durante el arranque, la sesión de terminal + se suspenderá un momento y volverá a estar activa casi + inmediatamente. Esto quiere decir que el servidor está activo + y funcionando. Puede usar su navegador para conectarse al + servidor y ver la página de prueba que hay en el directorio + DocumentRoot y la copia local + de esta documentación a la que se puede acceder desde esa + página.

    +
    top
    +
    +

    Errores Durante el Arranque

    + +

    Si se produce algún error irrecuperable durante el proceso de + arranque de Apache, aparecerá un mensaje describiendo el + problema en la consola o en el archivo ErrorLog antes de abortar la + ejecución. Uno de los mensajes de error más comunes es + "Unable to bind to Port ...". Cuando se recibe este + mensaje es normalmente por alguna de las siguientes razones:

    + +
      +
    • Está intentando iniciar el servidor Apache en un puerto + privilegiado (del 0 al 1024) sin haber hecho login como usuario + root; ó
    • + +
    • Está intentando iniciar el servidor Apache mientras + está ya ejecutando Apache o algún otro servidor web en + el mismo puerto.
    • +
    + +

    Puede encontrar más información sobre cómo + solucionar estos problemas, en la sección de Preguntas Frecuentes de Apache.

    +
    top
    +
    +

    Iniciar Apache al Iniciar el Sistema

    + +

    Si quiere que el servidor Apache continúe su + ejecución después de reiniciar el sistema, debe + añadir una llamada a apachectl en sus + archivos de arranque (normalmente rc.local o + algún fichero un directorio del tipo rc.N). Esto + iniciará Apache como usuario root. Antes de hacer esto, + asegúrese de que la configuración de seguridad y las + restricciones de acceso de su servidor Apache están + correctamente configuradas.

    + +

    El script apachectl está diseñado + para actuar como un script estándar de tipo SysV init; puede + tomar los argumentos start, restart, y + stop y traducirlos en las señales apropiadas + para httpd. De esta manera, casi siempre puede + simplemente enlazar apachectl con el directorio + init adecuado. Pero asegúrese de comprobar cuales son los + requerimientos específicos de su sistema.

    +
    top
    +
    +

    Información Adicional

    + +

    En la sección El Servidor y Programas + de Soporte puede encontrar más información sobre las + opciones de línea de comandos que puede pasar a + httpd y a apachectl así + como sobre otros programas de soporte incluidos con el servidor + Apache. También hay documentación sobre todos los módulos incluidos con la distribución de + Apache y sus correspondientes directivas asociadas.

    +
    +
    +

    Idiomas disponibles:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/invoking.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/invoking.html.ja.utf8 new file mode 100644 index 00000000..ec33f07f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/invoking.html.ja.utf8 @@ -0,0 +1,166 @@ + + + +Apache の起動 - Apache HTTP サーバ + + + + + +
    <-
    +

    Apache の起動

    +
    +

    Available Languages:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    +
    This translation may be out of date. Check the + English version for recent changes.
    + +

    Windows 上では、Apache は通常は + Windows NT, 2000, XP ではサービスとして、Windows 9x, ME + ではコンソールアプリケーションとして実行されます。 + 詳細に関しては、「 + サービスとして実行する」と「 + コンソールアプリケーションとして実行する」をご覧下さい。

    + +

    Unixでは、httpd + プログラムが、バックグラウンドで常にリクエスト処理を行う + デーモンとして実行されます。この文書ではどのように + httpd を起動するかについて記述しています。

    +
    + +
    top
    +
    +

    Apache の起動方法

    + +

    もし、設定ファイル中で指定されている + Listen + がデフォルトの 80 (もしくは 1024 以下の他のポート) + である場合は、Apache を起動するためには root + 権限が必要になりますが、 + これはこの特権ポートにバインドするためです。 + 起動して、一度ログファイルを開くといった準備のための + 動作を幾つか実行した後は、クライアントからのリクエストに対する + listen と応答を実際に行う子プロセスを起動します。 + メインの httpd プロセスは root 権限で走り続けますが、 + 子プロセスはもっと低い権限で走ります。 + これは選択したマルチプロセッシングモジュールで制御されます。

    + +

    推奨の httpd 実行プログラムの起動方法は、 + apachectl + 制御スクリプトを使用する方法です。このスクリプトは、httpd + がオペレーティングシステム上で正常に動作するように必要な環境変数を + 適切に設定して、httpd バイナリを起動します。 + apachectl はどんなコマンドライン引数も通過させますので、 + httpd のどのコマンドラインオプションも + apchectl のオプションとして使用できます。 + また、apchectl スクリプトを直接編集し、 + スクリプト先頭付近の HTTPD 変数を変更することで、 + httpd バイナリの正しい位置を指定したり、常に + 付加させるコマンドライン引数を指定したりすることができます。

    + +

    httpd が起動されてまず最初にすることは、 + 設定ファイル + httpd.conf の位置を特定して読み込むことです。 + このファイルの位置はコンパイル時に設定されますが、実行時に + -f コマンドラインオプションを使って + 位置を指定することもできます。例えば次のようにです。

    + +

    /usr/local/apache2/bin/apachectl -f + /usr/local/apache2/conf/httpd.conf

    + +

    スタートアップが万事上手くいったら、サーバはターミナルから + 切り離されて、コマンドプロンプトが即座に戻ってくるでしょう。 + これはサーバが起動している状態を示しています。 + その後はブラウザでサーバに接続して、 + DocumentRoot + ディレクトリのテストページやそこからリンクされている + ローカルのドキュメントを見ることができるでしょう。

    +
    top
    +
    +

    起動時のエラー

    + +

    Apache は、起動時に致命的な問題に遭遇すると、 + 終了する前に、コンソールか + ErrorLog + のどちらかに問題を記述したメッセージを出力します。 + 最もよくあるエラーメッセージは + 「Unable to bind to Port ...」 + です。このメッセージは普通は次のどちらかが原因です。

    + +
      +
    • root でログインしていない時に、 + 特権ポートでサーバを起動しようとした。
    • + +
    • 同じポートに既にバインドされている Apache + がもう一つあるときや他のウェブサーバが存在している時に、 + サーバを開始しようとした。
    • +
    + +

    より多くの問題解決の方策の説明は、 + Apache FAQ をご覧下さい。

    +
    top
    +
    +

    ブート時の起動

    + +

    システムがリブートした後でも + サーバが実行され続けるようにしたい場合は、 + apachectl + を呼び出すものをシステムスタートアップファイル + (通常 rc.local や rc.N + 内のファイル) に追加しなければなりません。 + この方法では Apache を root 権限で起動します。 + これをする前に、セキュリティやアクセス制限が + 適切に設定されていていることを確認してください。

    + +

    apachectl スクリプトは通常は、標準的な SysV init + スクリプトとして動作するように設計されています。 + start, restart, stop + といった引数をとって、httpd + への適切なシグナルに変換します。 + ですから、通常は単に適切な init ディレクトリ内から + apachectl へリンクすることができます。しかし、 + 念のためシステムの要求に合致していることを確認してください。

    +
    top
    +
    +

    追加情報

    + +

    httpd や + apachectl + 、サーバに含まれていたその他補助プログラムの、 + コマンドラインオプションに関する追加情報は、 + サーバと補助プログラムページに + 記載されています。 + Apache 配布に含まれている全モジュール、 + それによって提供されるディレクティブ + のドキュメントもあります。

    +
    +
    +

    Available Languages:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/invoking.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/invoking.html.ko.euc-kr new file mode 100644 index 00000000..55d16518 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/invoking.html.ko.euc-kr @@ -0,0 +1,142 @@ + + + +¾ÆÆÄÄ¡ ½ÃÀÛ - Apache HTTP Server + + + + + +
    <-
    +

    ¾ÆÆÄÄ¡ ½ÃÀÛ

    +
    +

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

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

    º¸Åë ¾ÆÆÄÄ¡´Â Windows NT, 2000, XP¿¡¼­´Â ¼­ºñ½º·Î, + Windows 95°ú ME¿¡¼­´Â ÄÜ¼Ö ÇÁ·Î±×·¥À¸·Î ½ÇÇàµÈ´Ù. ÀÚ¼¼ÇÑ + ³»¿ëÀº ¼­ºñ½º·Î + ¾ÆÆÄÄ¡¸¦ ½ÇÇàÇϱâ¿Í ÄÜ¼Ö ÇÁ·Î±×·¥À¸·Î + ¾ÆÆÄÄ¡¸¦ ½ÇÇàÇϱâ.

    + +

    À¯´Ð½º¿¡¼­ httpd + ÇÁ·Î±×·¥Àº ¹é±×¶ó¿îµå¿¡¼­ °è¼Ó ¿äûÀ» ó¸®ÇÏ´Â µ¥¸óÀ¸·Î + ½ÇÇàµÈ´Ù. ÀÌ ¹®¼­´Â httpd¸¦ ½ÃÀÛÇÏ´Â ¹æ¹ýÀ» + ¼³¸íÇÑ´Ù.

    +
    + +
    top
    +
    +

    ¾î¶»°Ô ¾ÆÆÄÄ¡°¡ ½ÃÀÛÇϳª

    + +

    ¼³Á¤ÆÄÀÏ¿¡¼­ ListenÀÌ ±âº»°ªÀÎ 80(ȤÀº + 1024ÀÌÇÏÀÇ ´Ù¸¥ Æ÷Æ®)À̶ó¸é ÀÌ Æ¯±Ç Æ÷Æ®¿¡ ¿¬°áÇϱâÀ§ÇØ + root ±ÇÇÑÀÌ ÇÊ¿äÇÏ´Ù. ¼­¹ö´Â ½ÃÀÛÇÏ¿© ·Î±×ÆÄÀÏÀ» ¿©´Â µîÀÇ + ¸î¸î ±âÃÊÀûÀÎ ÀÛ¾÷À» ¸¶Ä£ÈÄ, Ŭ¶óÀ̾ðÆ®ÀÇ ¿äûÀ» ±â´Ù¸®°í + ÀÀ´äÇÏ´Â ÀÚ½Ä(child) ÇÁ·Î¼¼½º¸¦ ¿©·¯°³ ¶ç¿î´Ù. + ÁÖ httpd ÇÁ·Î¼¼½º´Â °è¼Ó root »ç¿ëÀÚ·Î ½ÇÇàµÇÁö¸¸, + ÀÚ½Ä ÇÁ·Î¼¼½ºµéÀº ´õ ±ÇÇÑÀÌ ÀÛÀº »ç¿ëÀÚ·Î ½ÇÇàµÈ´Ù. ÀÌ´Â + ¼±ÅÃÇÑ ´ÙÁßó¸® ¸ðµâ·Î Á¶Á¤ÇÑ´Ù.

    + +

    apachectl + ½ºÅ©¸³Æ®¸¦ »ç¿ëÇÏ¿© httpd ½ÇÇàÆÄÀÏÀ» ½ÃÀÛÇϱæ + ±ÇÀåÇÑ´Ù. ÀÌ ½ºÅ©¸³Æ®´Â httpd°¡ ¸î¸î + ¿î¿µÃ¼Á¦¿¡¼­ Á¤»óÀûÀ¸·Î µ¿ÀÛÇϱâÀ§ÇØ ÇÊ¿äÇÑ È¯°æº¯¼öµéÀ» + ¼³Á¤ÇÏ°í httpd ½ÇÇàÆÄÀÏÀ» ½ÃÀÛÇÑ´Ù. + apachectlÀº ¸í·ÉÇà ¾Æ±Ô¸ÕÆ®¸¦ ±×´ë·Î ³Ñ±â±â¶§¹®¿¡, + httpdÀÇ ¾î¶² ¿É¼ÇÀÌ¶óµµ apachectl¿¡ + »ç¿ë°¡´ÉÇÏ´Ù. ¶Ç, apachectl ½ºÅ©¸³Æ®ÀÇ ¾ÕºÎºÐ¿¡ + ³ª¿À´Â HTTPD º¯¼ö¸¦ httpd ½ÇÇàÆÄÀÏÀÌ + ÀÖ´Â À§Ä¡¿Í Ç×»ó »ç¿ëÇÒ ¸í·ÉÇà ¾Æ±Ô¸ÕÆ®·Î Á÷Á¢ + ¼öÁ¤ÇÒ ¼ö ÀÖ´Ù.

    + +

    httpd¸¦ ½ÇÇàÇÏ¸é ¸ÕÀú ¼³Á¤ÆÄÀÏ httpd.conf¸¦ + ã¾Æ¼­ Àд´Ù. ÀÌ ÆÄÀÏÀÇ À§Ä¡´Â ÄÄÆÄÀÏ Áß¿¡ ÁöÁ¤Çϳª, ½ÇÇà½Ã + ´ÙÀ½°ú °°ÀÌ -f ¸í·ÉÇà ¿É¼ÇÀ¸·Î ÁöÁ¤ÇÒ ¼öµµ ÀÖ´Ù.

    + +

    /usr/local/apache2/bin/apachectl -f + /usr/local/apache2/conf/httpd.conf

    + +

    ½ÃÀÛÇÏ´Â °úÁ¤¿¡¼­ ¹®Á¦°¡ ¾ø´Ù¸é, ¼­¹ö´Â Å͹̳ο¡¼­ + ¶³¾îÁö°í ¸í·É ÇÁ·ÒÇÁÆ®°¡ °ÅÀÇ Áï½Ã ³ª¿À°ÔµÈ´Ù. ÀÌ´Â ¼­¹ö°¡ + ½ÇÇàµÊÀ» ÀǹÌÇÑ´Ù. ºê¶ó¿ìÀú·Î ¼­¹ö¿¡ ¿¬°áÇÏ¿© DocumentRoot µð·ºÅ丮¿¡ ÀÖ´Â + Å×½ºÆ® ÆäÀÌÁö¿Í ±× ÆäÀÌÁö¿¡ ¸µÅ©µÈ (·ÎÄÃÄ«ÇÇ) ¼³¸í¼­¸¦ º¼ + ¼ö ÀÖ´Ù.

    +
    top
    +
    +

    ½ÃÀÛÁß ¿À·ù

    + +

    ¾ÆÆÄÄ¡°¡ ½ÃÀÛÇÏ´Â °úÁ¤Áß¿¡ ½É°¢ÇÑ ¹®Á¦°¡ ¹ß»ýÇϸé, + Á¾·áÇϱâ Àü¿¡ ¹®Á¦¸¦ ¾Ë¸®´Â ¹®±¸¸¦ ÄܼÖÀ̳ª ErrorLog¿¡ ¾´´Ù. °¡Àå ÈçÇÑ ¿À·ù¹® Áß + Çϳª´Â "Unable to bind to Port ..."ÀÌ´Ù. + ÀÌ ¸Þ¼¼Áö´Â º¸Åë ´ÙÀ½ µÎ °æ¿ì¿¡ ¹ß»ýÇÑ´Ù:

    + +
      +
    • root »ç¿ëÀÚ·Î ·Î±×ÀÎÇÏÁö ¾Ê°í Ư±Ç Æ÷Æ®¿¡ ¼­¹ö¸¦ + ½ÃÀÛÇÏ·Á ÇÑ °æ¿ì. ȤÀº
    • + +
    • ÀÌ¹Ì ¾ÆÆÄÄ¡³ª ´Ù¸¥ À¥¼­¹ö°¡ »ç¿ëÁßÀÎ Æ÷Æ®¿¡ + ¼­¹ö¸¦ ½ÃÀÛÇÏ·Á ÇÑ °æ¿ì.
    • +
    + +

    ±âŸ ¹®Á¦ÇØ°á ¹æ¹ýÀº ¾ÆÆÄÄ¡ FAQ¸¦ + Âü°íÇ϶ó.

    +
    top
    +
    +

    ºÎÆÃÇÒ¶§ ½ÃÀÛÇϱâ

    + +

    ½Ã½ºÅÛÀÌ Àç½ÃÀÛÇÑ ÈÄ¿¡µµ ¼­¹ö°¡ °è¼Ó ½ÇÇàµÇ±æ ¹Ù¶õ´Ù¸é, + ½Ã½ºÅÛ ½ÃÀÛÆÄÀÏ(º¸Åë rc.localÀ̳ª rc.N + µð·ºÅ丮¿¡ ÀÖ´Â ÆÄÀÏ)¿¡ apachectlÀ» Ãß°¡ÇØ¾ß + ÇÑ´Ù. ÀÌ °æ¿ì ¾ÆÆÄÄ¡´Â root·Î ½ÃÀ۵ȴÙ. ÀÌÀü¿¡ ¼­¹öÀÇ º¸¾ÈÀ̳ª + Á¢±Ù Á¦ÇÑ(ÆÄÀϱÇÇÑ)ÀÌ ¿Ã¹Ù·Î ¼³Á¤µÇ¾ú´ÂÁö È®ÀÎÇ϶ó.

    + +

    apachectlÀº Ç¥ÁØ SysV init ½ºÅ©¸³Æ®¿Í ºñ½ÁÇÏ°Ô + µ¿ÀÛÇϵµ·Ï ¸¸µé¾îÁ³´Ù. ½ºÅ©¸³Æ®´Â ¾Æ±Ô¸ÕÆ®·Î start, + restart, stopÀ» ¹ÞÀ¸¸é °¢°¢ ÀûÀýÇÑ + ½Ã±×³ÎÀ» httpd¿¡ º¸³½´Ù. ±×·¡¼­ º¸ÅëÀº + apachectlÀ» ÀûÀýÇÑ init µð·ºÅ丮·Î ¸µÅ©¸¦ °É¸éµÈ´Ù. + ±×·¯³ª »ç¿ëÇÏ´Â ½Ã½ºÅÛÀÇ Á¤È®ÇÑ ¿ä±¸»çÇ×À» È®ÀÎÇ϶ó.

    +
    top
    +
    +

    Ãß°¡ Á¤º¸

    + +

    httpd¿Í apachectl, ±âŸ ¼­¹ö¿¡ + Æ÷ÇÔµÈ Áö¿ø ÇÁ·Î±×·¥µéÀÇ ¸í·ÉÇà ¿É¼ÇÀº + ¼­¹ö¿Í Áö¿ø ÇÁ·Î±×·¥ ÆäÀÌÁö¸¦ + Âü°íÇ϶ó. ¶Ç ¾ÆÆÄÄ¡ ¹èÆ÷º»¿¡´Â ¸ðµç ¸ðµâ°ú + ±×µéÀÌ Á¦°øÇÏ´Â Áö½Ã¾î¿¡ + ´ëÇÑ ¹®¼­°¡ ÀÖ´Ù.

    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/invoking.html.ru.koi8-r b/rubbos/app/httpd-2.0.64/docs/manual/invoking.html.ru.koi8-r new file mode 100644 index 00000000..f943ab4e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/invoking.html.ru.koi8-r @@ -0,0 +1,145 @@ + + + +úÁÐÕÓË Apache - HTTP ÓÅÒ×ÅÒ Apache + + + + + +
    <-
    +

    úÁÐÕÓË Apache

    +
    +

    äÏÓÔÕÐÎÙÅ ÑÚÙËÉ:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + +

    îÁ Windows ÐÌÁÔÆÏÒÍÁÈ Apache ÏÂÙÞÎÏ ÒÁÂÏÔÁÅÔ ËÁË ÓÅÒ×ÉÓ Windows NT/2000/XP + ÉÌÉ ËÁË ËÏÎÓÏÌØÎÏÅ ÐÒÉÌÏÖÅÎÉÅ Windows 95/ME. äÌÑ ÐÏÌÕÞÅÎÉÑ ÂÏÌÅÅ ÐÏÄÒÏÂÎÏÊ + ÉÎÆÏÒÍÁÃÉÉ ÐÏ ÜÔÏÍÕ ×ÏÐÒÏÓÕ, ÏÂÒÁÔÉÔÅÓØ Ë ÄÏËÕÍÅÎÔÁÍ, ÏÂßÑÓÎÑÀÝÉÍ ÒÁÂÏÔÕ Apache ÐÏÄ Windows × ËÁÞÅÓÔ×Å ÓÅÒ×ÉÓÁ É + ÒÁÂÏÔÕ Apache ÐÏÄ Windows × ËÁÞÅÓÔ×Å ËÏÎÓÏÌØÎÏÇÏ + ÐÒÉÌÏÖÅÎÉÑ.

    + +

    ÷ Unix ÐÒÏÇÒÁÍÍÁ httpd ÐÒÅÄÓÔÁ×ÌÑÅÔ ÓÏÂÏÊ + ÄÅÍÏÎ, ×ÙÐÏÌÎÑÀÝÉÊÓÑ × ÆÏÎÏ×ÏÍ ÒÅÖÉÍÅ É ÏÂÓÌÕÖÉ×ÁÀÝÉÊ ÐÏÓÔÕÐÁÀÝÉÅ ÚÁÐÒÏÓÙ. + ï ÔÏÍ, ËÁËÉÍ ÏÂÒÁÚÏÍ ÍÏÖÎÏ ÚÁÐÕÓÔÉÔØ httpd É ÞÔÏ × ÒÅÚÕÌØÔÁÔÅ ÜÔÏÇÏ + ÐÏÌÕÞÉÔÓÑ, É ÒÁÓÓËÁÚÙ×ÁÅÔÓÑ × ÜÔÏÍ ÄÏËÕÍÅÎÔÅ.

    +
    + +
    top
    +
    +

    þÔÏ ÐÒÏÉÓÈÏÄÉÔ × ÍÏÍÅÎÔ ÚÁÐÕÓËÁ Apache

    + +

    åÓÌÉ × ÄÉÒÅËÔÉ×Å Listen + × ËÏÎÆÉÇÕÒÁÃÉÏÎÎÏÍ ÆÁÊÌÅ ÕËÁÚÁÎÏ ÚÎÁÞÅÎÉÅ 80 (ÚÁÄÁ×ÁÅÍÏÅ ÐÏ ÕÍÏÌÞÁÎÉÀ) + ÉÌÉ ÌÀÂÏÅ ÄÒÕÇÏÅ ÚÎÁÞÅÎÉÅ ÐÏÒÔÁ ÍÅÎØÛÅÅ 1024, ÔÏ ÄÌÑ ÚÁÐÕÓËÁ Apache + ÎÅÏÂÈÏÄÉÍÏ ÂÙÔØ ÐÒÉ×ÉÌÅÇÉÒÏ×ÁÎÎÙÍ ÐÏÌØÚÏ×ÁÔÅÌÅÍ, ÔÁË ËÁË Apache ÐÒÉÄÅÔÓÑ + ÐÏÄËÌÀÞÁÔØÓÑ Ë ÐÒÉ×ÉÌÅÇÉÒÏ×ÁÎÎÏÍÕ ÐÏÒÔÕ. ðÏÓÌÅ ÔÏÇÏ, ËÁË ÓÅÒ×ÅÒ ÚÁÐÕÓÔÉÌÓÑ + É ×ÙÐÏÌÎÉÌ ÒÑÄ ÐÏÄÇÏÔÏ×ÉÔÅÌØÎÙÈ ÏÐÅÒÁÃÉÊ, ÔÁËÉÈ ËÁË ÏÔËÒÙÔÉÅ Ó×ÏÉÈ log-ÆÁÊÌÏ×, + ÏÎ ÐÏÒÏÖÄÁÅÔ ÎÅÓËÏÌØËÏ ÐÒÏÃÅÓÓÏ× ÐÏÔÏÍËÏ×, ËÏÔÏÒÙÅ É ÂÕÄÕÔ ×ÙÐÏÌÎÑÔØ + ×ÓÀ ÒÁÂÏÔÕ ÐÏ ÏÂÒÁÂÏÔËÅ ÚÁÐÒÏÓÏ× ÏÔ ËÌÉÅÎÔÏ×. ïÓÎÏ×ÎÏÊ ÐÒÏÃÅÓÓ httpd + ×ÙÐÏÌÎÑÅÔÓÑ Ó ÐÒÁ×ÁÍÉ ÐÒÉ×ÉÌÅÇÉÒÏ×ÁÎÎÏÇÏ ÐÏÌØÚÏ×ÁÔÅÌÑ, × ÔÏ ×ÒÅÍÑ ËÁË ÐÒÏÃÅÓÓÙ + ÐÏÔÏÍËÉ ÉÍÅÀÔ ÍÅÎØÛÉÊ ÐÒÉÏÒÉÔÅÔ. ÷ÓÅ ÜÔÏ ËÏÎÔÒÏÌÉÒÕÅÔÓÑ íð-ÍÏÄÕÌÅÍ, ËÏÔÏÒÙÊ ËÏÍÐÉÌÉÒÕÅÔÓÑ ×ÍÅÓÔÅ Ó ÓÅÒ×ÅÒÏÍ.

    + +

    äÌÑ ÚÁÐÕÓËÁ ÄÅÍÏÎÁ httpd ÌÕÞÛÅ ×ÓÅÇÏ ÉÓÐÏÌØÚÏ×ÁÔØ ÓËÒÉÐÔ + apachectl. üÔÏÔ ÓËÒÉÐÔ ÕÓÔÁÎÁ×ÌÉ×ÁÅÔ ÒÑÄ + ÐÅÒÅÍÅÎÎÙÈ ÏËÒÕÖÅÎÉÑ, ÎÅÏÂÈÏÄÉÍÙÈ ÄÌÑ ÐÒÁ×ÉÌØÎÏÊ ÒÁÂÏÔÙ ÓÅÒ×ÅÒÁ ÐÏÄ ÎÅËÏÔÏÒÙÍÉ + ÏÐÅÒÁÃÉÏÎÎÙÍÉ ÓÉÓÔÅÍÁÍÉ, Á ÚÁÔÅÍ ÚÁÐÕÓËÁÅÔ ÉÓÐÏÌÎÑÅÍÙÊ ÆÁÊÌ httpd. + óËÒÉÐÔ apachectl ÐÅÒÅÄÁÓÔ ÓÅÒ×ÅÒÕ ÌÀÂÕÀ ËÏÍÁÎÄÎÕÀ ÓÔÒÏËÕ, ÔÁË ÞÔÏ + ÐÒÉ ×ÙÚÏ×Å ÍÏÖÎÏ ÕËÁÚÙ×ÁÔØ × ÅÇÏ ËÏÍÁÎÄÎÏÊ ÓÔÒÏËÅ ×ÓÅ ÎÅÏÂÈÏÄÉÍÙÅ ÄÌÑ ÓÅÒ×ÅÒÁ ÏÐÃÉÉ. + ÷Ù ÔÁËÖÅ ÍÏÖÅÔÅ ×ÒÕÞÎÕÀ ×ÎÅÓÔÉ ÎÅËÏÔÏÒÙÅ ÉÚÍÅÎÅÎÉÑ × ÓËÒÉÐÔ apachectl, + × ÞÁÓÔÎÏÓÔÉ, ÉÚÍÅÎÉ× ÚÎÁÞÅÎÉÅ ÐÅÒÅÍÅÎÎÏÊ HTTPD ÄÌÑ ÚÁÐÕÓËÁ Apache + ÉÚ ÄÒÕÇÏÇÏ ËÁÔÁÌÏÇÁ, É ÕËÁÚÁ× ÏÐÃÉÉ, ËÏÔÏÒÙÅ ÂÕÄÕÔ ÐÅÒÅÄÁ×ÁÔØÓÑ ÓÅÒ×ÅÒÕ ËÁÖÄÙÊ ÒÁÚ + ÐÒÉ ÅÇÏ ÚÁÐÕÓËÅ.

    + +

    ðÅÒ×ÙÍ ÄÅÌÏÍ httpd ÎÁÈÏÄÉÔ É ÓÞÉÔÙ×ÁÅÔ ËÏÎÆÉÇÕÒÁÃÉÏÎÎÙÊ + ÆÁÊÌ httpd.conf. ðÕÔØ Ë ÜÔÏÍÕ ÆÁÊÌÕ ÚÁÄÁÅÔÓÑ ÅÝÅ ×Ï ×ÒÅÍÑ ÓÂÏÒËÉ ÓÅÒ×ÅÒÁ, + ÎÏ ÅÇÏ ÍÏÖÎÏ ÉÚÍÅÎÉÔØ É ÐÏÓÌÅ ÜÔÏÇÏ, ÚÁÐÕÓÔÉ× ÓÅÒ×ÅÒ Ó ÏÐÃÉÅÊ -f, ËÁË ÜÔÏ ÐÏËÁÚÁÎÏ + × ÓÌÅÄÕÀÝÅÍ ÐÒÉÍÅÒÅ

    + +

    /usr/local/apache2/bin/apachectl -f + /usr/local/apache2/conf/httpd.conf

    + +

    åÓÌÉ ×Ï ×ÒÅÍÑ ÚÁÐÕÓËÁ ÎÅ ×ÏÚÎÉËÌÏ ÎÉËÁËÉÈ ÐÒÏÂÌÅÍ, ÔÏ ÓÅÒ×ÅÒ ÏÔÓÏÅÄÉÎÉÔÓÑ + ÏÔ ËÏÎÓÏÌÉ É ÐÒÉÇÌÁÛÅÎÉÅ ÎÁ ××ÏÄ ËÏÍÁÎÄÎÏÊ ÓÔÒÏËÉ ×ÅÒÎÅÔÓÑ Ë ÐÏÌØÚÏ×ÁÔÅÌÀ + ÐÒÁËÔÉÞÅÓËÉ ÍÇÎÏ×ÅÎÎÏ. üÔÏ ÕËÁÚÙ×ÁÅÔ ÎÁ ÔÏ, ÞÔÏ ÓÅÒ×ÅÒ ÚÁÐÕÓÔÉÌÓÑ É ÔÅÐÅÒØ + ×ÙÐÏÌÎÑÅÔ Ó×ÏÀ ÒÁÂÏÔÕ. ôÅÐÅÒØ ×Ù ÍÏÖÅÔÅ, ÉÓÐÏÌØÚÕÑ ÂÒÁÕÚÅÒ, ÐÏÄËÌÀÞÉÔØÓÑ Ë + ÎÅÍÕ É Õ×ÉÄÅÔØ ÔÅÓÔÏ×ÕÀ ÓÔÒÁÎÉÃÕ, ÎÁÈÏÄÑÝÕÀÓÑ × ËÁÔÁÌÏÇÅ + DocumentRoot, Á ÔÁËÖÅ ÌÏËÁÌØÎÕÀ ËÏÐÉÀ ÄÏËÕÍÅÎÔÁÃÉÉ, + ÓÓÙÌËÕ ÎÁ ËÏÔÏÒÕÀ ×Ù ÎÁÊÄÅÔÅ ÎÁ ÔÏÊ ÖÅ ÓÔÒÁÎÉÃÅ.

    +
    top
    +
    +

    ïÛÉÂËÉ, ËÏÔÏÒÙÅ ÍÏÇÕÔ ×ÏÚÎÉËÎÕÔØ ×Ï ×ÒÅÍÑ ÚÁÐÕÓËÁ

    + +

    åÓÌÉ ×Ï ×ÒÅÍÑ ÚÁÐÕÓËÁ Apache ÐÒÏÉÚÏÊÄÅÔ ËÁËÁÑ-ÌÉÂÏ ÆÁÔÁÌØÎÁÑ ÏÛÉÂËÁ, + ÔÏ ÐÅÒÅÄ ÔÅÍ, ËÁË ÚÁ×ÅÒÛÉÔØ Ó×ÏÀ ÒÁÂÏÔÕ, ÓÅÒ×ÅÒ ÐÏÛÌÅÔ ÎÁ ËÏÎÓÏÌØ ÉÌÉ × + ErrorLog ÓÏÏÂÝÅÎÉÅ, ÏÐÉÓÙ×ÁÀÝÅÅ + ÄÁÎÎÕÀ ÏÛÉÂËÕ. îÁÉÂÏÌÅÅ ÒÁÓÐÒÏÓÔÒÁÎÅÎÎÙÍ ÓÏÏÂÝÅÎÉÅÍ Ï ÏÛÉÂËÅ Ñ×ÌÑÅÔÓÑ + "Unable to bind to Port ...". ðÏÄÏÂÎÁÑ ÏÛÉÂËÁ ×ÏÚÎÉËÁÅÔ × Ä×ÕÈ ÓÌÕÞÁÑÈ:

    + +
      +
    • åÓÌÉ ×Ù ÐÙÔÁÅÔÅÓØ ÚÁÐÕÓÔÉÔØ ÓÅÒ×ÅÒ ÎÁ ÐÒÉ×ÉÌÅÇÉÒÏ×ÁÎÎÏÍ ÐÏÒÔÕ, ÂÕÄÕÞÉ ÚÁÒÅÇÉÓÔÒÉÒÏ×ÁÎÎÙÍ + × ÓÉÓÔÅÍÅ ËÁË ÏÂÙÞÎÙÊ ÐÏÌØÚÏ×ÁÔÅÌØ; ÉÌÉ
    • + +
    • åÓÌÉ ×Ù ÐÙÔÁÅÔÅÓØ ÚÁÐÕÓÔØ ÓÅÒ×ÅÒ, ËÏÇÄÁ × ÓÉÓÔÅÍÅ ÕÖÅ ÅÓÔØ ×ÙÐÏÌÎÑÀÝÉÊÓÑ ÄÅÍÏÎ Apache + ÉÌÉ ÄÒÕÇÏÊ web-ÓÅÒ×ÅÒ, ÓÌÕÛÁÀÝÉÊ ÔÏÔ ÖÅ ÓÁÍÙÊ ÐÏÒÔ.
    • +
    + +

    òÅÛÅÎÉÅ ÍÎÏÇÉÈ ÐÏÄÏÂÎÙÈ ÐÒÏÂÌÅÍ ÍÏÖÎÏ ÎÁÊÔÉ ÎÁ ÓÔÒÁÎÉÃÅ + FAQ.

    +
    top
    +
    +

    úÁÐÕÓË ÓÅÒ×ÅÒÁ ×ÍÅÓÔÅ Ó ÚÁÐÕÓËÏÍ ×ÓÅÊ ÓÉÓÔÅÍÙ

    + +

    åÓÌÉ ×Ù ÈÏÔÉÔÅ, ÞÔÏÂÙ ÓÅÒ×ÅÒ ÚÁÐÕÓËÁÌÓÑ Á×ÔÏÍÁÔÉÞÅÓËÉ ÐÏÓÌÅ ÐÅÒÅÚÁÇÒÕÚËÉ ÓÉÓÔÅÍÙ, + ÄÏÂÁ×ØÔÅ ×ÙÚÏ× ÓËÒÉÐÔÁ apachectl × ÓÉÓÔÅÍÎÙÅ ÆÁÊÌÙ, ÏÔ×ÅÞÁÀÝÉÅ ÚÁ ÚÁÇÒÕÚËÕ + ÏÐÅÒÁÃÉÏÎÎÏÊ ÓÒÅÄÙ (ÏÂÙÞÎÏ ÜÔÏ rc.local ÉÌÉ ÆÁÊÌÙ × ËÁÔÁÌÏÇÅ rc.N). + üÔÏ ÐÒÉ×ÅÄÅÔ Ë ÚÁÐÕÓËÕ Apache ÏÔ ÉÍÅÎÉ ÐÒÉ×ÉÌÅÇÉÒÏ×ÁÎÎÏÇÏ ÐÏÌØÚÏ×ÁÔÅÌÑ. + ÷Ï ÉÚÂÅÖÁÎÉÅ ÐÒÏÂÌÅÍ Ó ÂÅÚÏÐÁÓÎÏÓÔØÀ ÓÉÓÔÅÍÙ, ÕÂÅÄÉÔÅÓØ, ÞÔÏ ÓÅÒ×ÅÒ ÓËÏÎÆÉÇÕÒÉÒÏ×ÁÎ ÐÒÁ×ÉÌØÎÏ.

    + +

    óËÒÉÐÔ apachectl ÒÁÚÒÁÂÏÔÁÎ ÔÁËÉÍ ÏÂÒÁÚÏÍ, ÞÔÏ ÏÎ ÍÏÖÅÔ + ÄÅÊÓÔ×Ï×ÁÔØ ËÁË ÓÔÁÎÄÁÒÔÎÙÊ init-ÓËÒÉÐÔ ÓÉÓÔÅÍÙ SysV; ÏÎ ÍÏÖÅÔ ÐÒÉÎÉÍÁÔØ + ÁÒÇÕÍÅÎÔÙ start, restart, É stop + É ÐÅÒÅ×ÏÄÉÔØ ÉÈ × ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÉÅ ÓÉÇÎÁÌÙ ÐÒÏÃÅÓÓÕ httpd. + ðÏÜÔÏÍÕ ÞÁÝÅ ×ÓÅÇÏ ×ÁÍ ÄÏÓÔÁÔÏÞÎÏ ÓÄÅÌÁÔØ ÓÓÙÌËÕ ÎÁ apachectl + × ÚÁÐÕÓËÎÏÍ ËÁÔÁÌÏÇÅ ÐÒÏÃÅÓÓÁ init. îÏ ÐÒÅÖÄÅ ÞÅÍ ÄÅÌÁÔØ ÜÔÏ, ÕÚÎÁÊÔÅ + ÔÏÞÎÙÅ ÔÒÅÂÏ×ÁÎÉÑ ×ÁÛÅÊ ÓÉÓÔÅÍÙ.

    +
    top
    +
    +

    äÏÐÏÌÎÉÔÅÌØÎÁÑ ÉÎÆÏÒÍÁÃÉÑ

    + +

    äÏÐÏÌÎÉÔÅÌØÎÕÀ ÉÎÆÏÒÍÁÃÉÀ ÐÏ ÏÐÃÉÑÍ ËÏÍÁÎÄÎÏÊ ÓÔÒÏËÉ httpd + É apachectl, Á ÔÁËÖÅ ÄÒÕÇÉÈ + ×ÓÐÏÍÏÇÁÔÅÌØÎÙÈ ÐÒÏÇÒÁÍÍ, ×Ù ÍÏÖÅÔÅ ÎÁÊÔÉ ÎÁ ÓÔÒÁÎÉÃÅ "óÅÒ×ÅÒ + É ×ÓÐÏÍÏÇÁÔÅÌØÎÙÅ ÐÒÏÇÒÁÍÍÙ". éÍÅÅÔÓÑ ÔÁËÖÅ ÄÏËÕÍÅÎÔÁÃÉÑ + ÎÁ ×ÓÅ ÍÏÄÕÌÉ, ×ÈÏÄÑÝÉÅ × ÄÉÓÔÒÉÂÕÔÉ× Apache, É ×ÓÅ ÄÉÒÅËÔÉ×Ù, ËÏÔÏÒÙÅ ÏÎÉ ÐÒÅÄÏÓÔÁ×ÌÑÀÔ.

    +
    +
    +

    äÏÓÔÕÐÎÙÅ ÑÚÙËÉ:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/invoking.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/invoking.html.tr.utf8 new file mode 100644 index 00000000..d2396aed --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/invoking.html.tr.utf8 @@ -0,0 +1,149 @@ + + + +Apache HTTPd’nin başlatılması - Apache HTTP Sunucusu + + + + + +
    <-
    +

    Apache HTTPd’nin başlatılması

    +
    +

    Mevcut Diller:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + +

    Apache normal olarak, Windows NT, 2000 ve XP'de bir hizmet olarak, + Windows 9x ve ME’de ise bir konsol uygulaması olarak çalışır. Ayrıntılı + bilgi için Apache HTTPd’nin bir + hizmet olarak çalıştırılması ve Apache HTTPd’nin bir konsol + uygulaması olarak çalıştırılması bölümlerine bakınız.

    + +

    Unix’te ise artalanda isteklere yanıt vermek için sürekli çalışan bir + artalan sürecidir. Bu belgede httpd’nin nasıl + çalıştırılacağı açıklanmaktadır.

    +
    + +
    top
    +
    +

    Apache Nasıl Başlatılır?

    + +

    Yapılandırma dosyasında Listen yönergesi ile öntanımlı olan port + 80 (veya 1024’ten küçük herhangi bir port) belirtilmişse Apache HTTP + Sunucusunu başlatmak için root yetkileri gerekecektir. Sunucu başlatılıp + günlük dosyalarını açmak gibi bazı ön hazırlık etkinliklerinde + bulunduktan sonra istemcilerden gelen istekleri dinlemek ve yanıt vermek + için çeşitli çocuk süreçler başlatır. Ana + httpd süreci root kullanıcısının aidiyetinde + çalışmasını sürdürürken çocuk süreçler daha az yetkili bir kullanıcının + aidiyetinde çalışır. Bu işlem seçilen Çok Süreçlilik + Modülü tarafından denetlenir.

    + +

    httpd’yi çalıştırmak için önerilen yöntem + apachectl betiğini kullanmaktır. Bu betik, + httpd’nin bazı işletim sistemlerinde işlevini + gerektiği gibi yerine getirebilmesi için gereken belli ortam + değişkenlerini ayarlar ve httpd’yi çalıştırır. + apachectl, komut satırı argümanlarını + httpd’ye aktarabildiğinden gerekli + httpd seçenekleri apachectl + betiğine komut satırı seçenekleri olarak belirtilebilir. Ayrıca, + apachectl betiğinin içeriğini doğrudan düzenlemek + suretiyle betiğin başlangıç satırlarındaki HTTPD + değişkenine httpd çalıştırılabilir dosyasının doğru + yerini ve daima mevcut olmasını istediğiniz komut satırı + seçeneklerini belirtebilirsiniz.

    + +

    httpd çalıştırıldığında yaptığı ilk şey yapılandırma dosyası + httpd.conf’u bulup okumaktır. Bu dosyanın yeri derleme + sırasında belirtilmekteyse de -f komut satırı seçeneği + kullanılarak çalıştırma sırasında belirtmek de mümkündür:

    + +

    /usr/local/apache2/bin/apachectl -f + /usr/local/apache2/conf/httpd.conf

    + +

    Başlatma sırasında herşey yolunda giderse sunucu kendini uçbirimden + ayıracak ve hemen ardından uçbirim, komut istemine düşecektir. Bu, + sunucunun etkin ve çalışmakta olduğunu gösterir. Artık tarayıcınızı + kullanarak sunucuya bağlanabilir, DocumentRoot dizinindeki deneme sayfasını + görebilir ve bu sayfadan bir bağla bu belgelerin makinenizdeki kopyasına + erişebilirsiniz.

    +
    top
    +
    +

    Başlatma Sırasındaki Hatalar

    + +

    Apache başlatma sırasında ölümcül bir sorunla karşılaşacak olursa + çıkmadan önce sorunu açıklayan bir iletiyi konsola veya ErrorLog yönergesi ile belirtilen hata + günlüğüne yazacaktır. En çok karşılaşılan hata iletilerinden biri + "Unable to bind to Port ..." dizgesidir. Bu iletiye + genellikle şu iki durumdan biri sebep olur:

    + +
      +
    • Sunucunun, root yetkileri gerektiren bir portu kullanmak üzere root + kullanıcısı tarafından çalıştırılmamış olması.
    • + +
    • Aynı portu kullanan başka bir Apache Sunucusunun veya başka bir HTTP + sunucusunun zaten çalışmakta oluşu.
    • +
    + +

    Bu ve diğer sorun çözme talimatları için Apache SSS’sini inceleyiniz.

    +
    top
    +
    +

    Sistem Açılışında Başlatma

    + +

    Sunucunuzun sistem yeniden başlatıldıktan sonra çalışmasına devam + etmesini istiyorsanız sistem başlatma betiklerinize (genellikle ya + rc.local dosyasıdır ya da bir rc.N dizininde + bir dosyadır) apachectl betiği için bir çağrı + eklemelisiniz. Bu, Apache sunucunuzu root yetkileriyle başlatacaktır. + Bunu yapmadan önce sunucunuzun güvenlik ve erişim kısıtlamaları + bakımından gerektiği gibi yapılandırıldığından emin olunuz.

    + +

    apachectl betiği, bir standart SysV init betiği gibi + davranacak şekilde tasarlanmıştır. start, + restart ve stop argümanlarını kabul edebilir + ve bunları httpd’ye uygun sinyallere dönüştürebilir. + Bu bakımdan, çoğunlukla uygun init dizinlerinden birine + apachectl betiği için basitçe bir bağ + yerleştirebilirsiniz. Fakat bunu yapmadan önce betiğin sisteminizin + gereklerini yerine getirdiğinden emin olunuz.

    +
    top
    +
    +

    Ek Bilgiler

    + +

    httpd, apachectl ve sunucuyla + gelen diğer destek programlarının komut satırı seçenekleri hakkında ek + bilgi Sunucu ve Destek Programları sayfasında + bulunabilir. Ayrıca, Apache dağıtımında bulunan tüm modüller ve bunlarla sağlanan yönergeler hakkında da belgeler + vardır.

    +
    +
    +

    Mevcut Diller:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/license.html b/rubbos/app/httpd-2.0.64/docs/manual/license.html new file mode 100644 index 00000000..96b08f6d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/license.html @@ -0,0 +1,5 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: license.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/license.html.en b/rubbos/app/httpd-2.0.64/docs/manual/license.html.en new file mode 100644 index 00000000..e83a833a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/license.html.en @@ -0,0 +1,238 @@ + + + +The Apache License, Version 2.0 - Apache HTTP Server + + + + + +
    <-
    +

    The Apache License, Version 2.0

    +
    +

    Available Languages:  en 

    +
    + +

    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. + +
    3. 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.
    4. + +
    5. 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.
    6. + +
    7. 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: + +
        +
      1. You must give any other recipients of the Work or + Derivative Works a copy of this License; and
      2. + +
      3. You must cause any modified files to carry prominent notices + stating that You changed the files; and
      4. + +
      5. 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
      6. + +
      7. 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.
      8. +
      + +

      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.

    8. + +
    9. 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.
    10. + +
    11. 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.
    12. + +
    13. 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.
    14. + +
    15. 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.
    16. + +
    17. 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.
    18. +
    + +

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

    Available Languages:  en 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/logs.html b/rubbos/app/httpd-2.0.64/docs/manual/logs.html new file mode 100644 index 00000000..a7f27c28 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/logs.html @@ -0,0 +1,21 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: logs.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: logs.html.es +Content-Language: es +Content-type: text/html; charset=ISO-8859-1 + +URI: logs.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: logs.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: logs.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/logs.html.en b/rubbos/app/httpd-2.0.64/docs/manual/logs.html.en new file mode 100644 index 00000000..cc625f8a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/logs.html.en @@ -0,0 +1,587 @@ + + + +Log Files - Apache HTTP Server + + + + + +
    <-
    +

    Log Files

    +
    +

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

    +
    + +

    In order to effectively manage a web server, it is necessary + to get feedback about the activity and performance of the + server as well as any problems that may be occurring. The Apache + HTTP Server provides very comprehensive and flexible logging + capabilities. This document describes how to configure its + logging capabilities, and how to understand what the logs + contain.

    +
    + +
    top
    +
    +

    Security Warning

    + + +

    Anyone who can write to the directory where Apache is + writing a log file can almost certainly gain access to the uid + that the server is started as, which is normally root. Do + NOT give people write access to the directory the logs + are stored in without being aware of the consequences; see the + security tips document + for details.

    + +

    In addition, log files may contain information supplied + directly by the client, without escaping. Therefore, it is + possible for malicious clients to insert control-characters in + the log files, so care must be taken in dealing with raw + logs.

    +
    top
    +
    +

    Error Log

    + + + + +

    The server error log, whose name and location is set by the + ErrorLog directive, is the + most important log file. This is the place where Apache httpd + will send diagnostic information and record any errors that it + encounters in processing requests. It is the first place to + look when a problem occurs with starting the server or with the + operation of the server, since it will often contain details of + what went wrong and how to fix it.

    + +

    The error log is usually written to a file (typically + error_log on Unix systems and + error.log on Windows and OS/2). On Unix systems it + is also possible to have the server send errors to + syslog or pipe them to a + program.

    + +

    The format of the error log is relatively free-form and + descriptive. But there is certain information that is contained + in most error log entries. For example, here is a typical + message.

    + +

    + [Wed Oct 11 14:32:52 2000] [error] [client 127.0.0.1] + client denied by server configuration: + /export/home/live/ap/htdocs/test +

    + +

    The first item in the log entry is the date and time of the + message. The second item lists the severity of the error being + reported. The LogLevel + directive is used to control the types of errors that are sent + to the error log by restricting the severity level. The third + item gives the IP address of the client that generated the + error. Beyond that is the message itself, which in this case + indicates that the server has been configured to deny the + client access. The server reports the file-system path (as + opposed to the web path) of the requested document.

    + +

    A very wide variety of different messages can appear in the + error log. Most look similar to the example above. The error + log will also contain debugging output from CGI scripts. Any + information written to stderr by a CGI script will + be copied directly to the error log.

    + +

    It is not possible to customize the error log by adding or + removing information. However, error log entries dealing with + particular requests have corresponding entries in the access log. For example, the above example + entry corresponds to an access log entry with status code 403. + Since it is possible to customize the access log, you can + obtain more information about error conditions using that log + file.

    + +

    During testing, it is often useful to continuously monitor + the error log for any problems. On Unix systems, you can + accomplish this using:

    + +

    + tail -f error_log +

    +
    top
    +
    +

    Access Log

    + + + + +

    The server access log records all requests processed by the + server. The location and content of the access log are + controlled by the CustomLog + directive. The LogFormat + directive can be used to simplify the selection of + the contents of the logs. This section describes how to configure the server + to record information in the access log.

    + +

    Of course, storing the information in the access log is only + the start of log management. The next step is to analyze this + information to produce useful statistics. Log analysis in + general is beyond the scope of this document, and not really + part of the job of the web server itself. For more information + about this topic, and for applications which perform log + analysis, check the + Open Directory or + Yahoo.

    + +

    Various versions of Apache httpd have used other modules and + directives to control access logging, including + mod_log_referer, mod_log_agent, and the + TransferLog directive. The CustomLog directive now subsumes + the functionality of all the older directives.

    + +

    The format of the access log is highly configurable. The format + is specified using a format string that looks much like a C-style + printf(1) format string. Some examples are presented in the next + sections. For a complete list of the possible contents of the + format string, see the mod_log_config format strings.

    + +

    Common Log Format

    + + +

    A typical configuration for the access log might look as + follows.

    + +

    + LogFormat "%h %l %u %t \"%r\" %>s %b" common
    + CustomLog logs/access_log common +

    + +

    This defines the nickname common and + associates it with a particular log format string. The format + string consists of percent directives, each of which tell the + server to log a particular piece of information. Literal + characters may also be placed in the format string and will be + copied directly into the log output. The quote character + (") must be escaped by placing a backslash before + it to prevent it from being interpreted as the end of the + format string. The format string may also contain the special + control characters "\n" for new-line and + "\t" for tab.

    + +

    The CustomLog + directive sets up a new log file using the defined + nickname. The filename for the access log is relative to + the ServerRoot unless it + begins with a slash.

    + +

    The above configuration will write log entries in a format + known as the Common Log Format (CLF). This standard format can + be produced by many different web servers and read by many log + analysis programs. The log file entries produced in CLF will + look something like this:

    + +

    + 127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET + /apache_pb.gif HTTP/1.0" 200 2326 +

    + +

    Each part of this log entry is described below.

    + +
    +
    127.0.0.1 (%h)
    + +
    This is the IP address of the client (remote host) which + made the request to the server. If HostnameLookups is + set to On, then the server will try to determine + the hostname and log it in place of the IP address. However, + this configuration is not recommended since it can + significantly slow the server. Instead, it is best to use a + log post-processor such as logresolve to determine + the hostnames. The IP address reported here is not + necessarily the address of the machine at which the user is + sitting. If a proxy server exists between the user and the + server, this address will be the address of the proxy, rather + than the originating machine.
    + +
    - (%l)
    + +
    The "hyphen" in the output indicates that the requested + piece of information is not available. In this case, the + information that is not available is the RFC 1413 identity of + the client determined by identd on the clients + machine. This information is highly unreliable and should + almost never be used except on tightly controlled internal + networks. Apache httpd will not even attempt to determine + this information unless IdentityCheck is set + to On.
    + +
    frank (%u)
    + +
    This is the userid of the person requesting the document + as determined by HTTP authentication. The same value is + typically provided to CGI scripts in the + REMOTE_USER environment variable. If the status + code for the request (see below) is 401, then this value + should not be trusted because the user is not yet + authenticated. If the document is not password protected, + this part will be "-" just like the previous + one.
    + +
    [10/Oct/2000:13:55:36 -0700] + (%t)
    + +
    + The time that the request was received. + The format is: + +

    + [day/month/year:hour:minute:second zone]
    + day = 2*digit
    + month = 3*letter
    + year = 4*digit
    + hour = 2*digit
    + minute = 2*digit
    + second = 2*digit
    + zone = (`+' | `-') 4*digit
    +

    + It is possible to have the time displayed in another format + by specifying %{format}t in the log format + string, where format is as in + strftime(3) from the C standard library. +
    + +
    "GET /apache_pb.gif HTTP/1.0" + (\"%r\")
    + +
    The request line from the client is given in double + quotes. The request line contains a great deal of useful + information. First, the method used by the client is + GET. Second, the client requested the resource + /apache_pb.gif, and third, the client used the + protocol HTTP/1.0. It is also possible to log + one or more parts of the request line independently. For + example, the format string "%m %U%q %H" will log + the method, path, query-string, and protocol, resulting in + exactly the same output as "%r".
    + +
    200 (%>s)
    + +
    This is the status code that the server sends back to the + client. This information is very valuable, because it reveals + whether the request resulted in a successful response (codes + beginning in 2), a redirection (codes beginning in 3), an + error caused by the client (codes beginning in 4), or an + error in the server (codes beginning in 5). The full list of + possible status codes can be found in the HTTP + specification (RFC2616 section 10).
    + +
    2326 (%b)
    + +
    The last part indicates the size of the object returned + to the client, not including the response headers. If no + content was returned to the client, this value will be + "-". To log "0" for no content, use + %B instead.
    +
    + + +

    Combined Log Format

    + + +

    Another commonly used format string is called the Combined + Log Format. It can be used as follows.

    + +

    + LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" + \"%{User-agent}i\"" combined
    + CustomLog log/access_log combined +

    + +

    This format is exactly the same as the Common Log Format, + with the addition of two more fields. Each of the additional + fields uses the percent-directive + %{header}i, where header can be + any HTTP request header. The access log under this format will + look like:

    + +

    + 127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET + /apache_pb.gif HTTP/1.0" 200 2326 + "http://www.example.com/start.html" "Mozilla/4.08 [en] + (Win98; I ;Nav)" +

    + +

    The additional fields are:

    + +
    +
    "http://www.example.com/start.html" + (\"%{Referer}i\")
    + +
    The "Referer" (sic) HTTP request header. This gives the + site that the client reports having been referred from. (This + should be the page that links to or includes + /apache_pb.gif).
    + +
    "Mozilla/4.08 [en] (Win98; I ;Nav)" + (\"%{User-agent}i\")
    + +
    The User-Agent HTTP request header. This is the + identifying information that the client browser reports about + itself.
    +
    + + +

    Multiple Access Logs

    + + +

    Multiple access logs can be created simply by specifying + multiple CustomLog + directives in the configuration + file. For example, the following directives will create three + access logs. The first contains the basic CLF information, + while the second and third contain referer and browser + information. The last two CustomLog lines show how + to mimic the effects of the ReferLog and AgentLog directives.

    + +

    + LogFormat "%h %l %u %t \"%r\" %>s %b" common
    + CustomLog logs/access_log common
    + CustomLog logs/referer_log "%{Referer}i -> %U"
    + CustomLog logs/agent_log "%{User-agent}i" +

    + +

    This example also shows that it is not necessary to define a + nickname with the LogFormat directive. Instead, + the log format can be specified directly in the CustomLog directive.

    + + +

    Conditional Logs

    + + +

    There are times when it is convenient to exclude certain + entries from the access logs based on characteristics of the + client request. This is easily accomplished with the help of environment variables. First, an + environment variable must be set to indicate that the request + meets certain conditions. This is usually accomplished with + SetEnvIf. Then the + env= clause of the CustomLog directive is used to + include or exclude requests where the environment variable is + set. Some examples:

    + +

    + # Mark requests from the loop-back interface
    + SetEnvIf Remote_Addr "127\.0\.0\.1" dontlog
    + # Mark requests for the robots.txt file
    + SetEnvIf Request_URI "^/robots\.txt$" dontlog
    + # Log what remains
    + CustomLog logs/access_log common env=!dontlog +

    + +

    As another example, consider logging requests from + english-speakers to one log file, and non-english speakers to a + different log file.

    + +

    + SetEnvIf Accept-Language "en" english
    + CustomLog logs/english_log common env=english
    + CustomLog logs/non_english_log common env=!english +

    + +

    Although we have just shown that conditional logging is very + powerful and flexible, it is not the only way to control the + contents of the logs. Log files are more useful when they + contain a complete record of server activity. It is often + easier to simply post-process the log files to remove requests + that you do not want to consider.

    + +
    top
    +
    +

    Log Rotation

    + + +

    On even a moderately busy server, the quantity of + information stored in the log files is very large. The access + log file typically grows 1 MB or more per 10,000 requests. It + will consequently be necessary to periodically rotate the log + files by moving or deleting the existing logs. This cannot be + done while the server is running, because Apache will continue + writing to the old log file as long as it holds the file open. + Instead, the server must be restarted after the log files are + moved or deleted so that it will open new log files.

    + +

    By using a graceful restart, the server can be + instructed to open new log files without losing any existing or + pending connections from clients. However, in order to + accomplish this, the server must continue to write to the old + log files while it finishes serving old requests. It is + therefore necessary to wait for some time after the restart + before doing any processing on the log files. A typical + scenario that simply rotates the logs and compresses the old + logs to save space is:

    + +

    + mv access_log access_log.old
    + mv error_log error_log.old
    + apachectl graceful
    + sleep 600
    + gzip access_log.old error_log.old +

    + +

    Another way to perform log rotation is using piped logs as discussed in the next + section.

    +
    top
    +
    +

    Piped Logs

    + + +

    Apache httpd is capable of writing error and access log + files through a pipe to another process, rather than directly + to a file. This capability dramatically increases the + flexibility of logging, without adding code to the main server. + In order to write logs to a pipe, simply replace the filename + with the pipe character "|", followed by the name + of the executable which should accept log entries on its + standard input. Apache will start the piped-log process when + the server starts, and will restart it if it crashes while the + server is running. (This last feature is why we can refer to + this technique as "reliable piped logging".)

    + +

    Piped log processes are spawned by the parent Apache httpd + process, and inherit the userid of that process. This means + that piped log programs usually run as root. It is therefore + very important to keep the programs simple and secure.

    + +

    One important use of piped logs is to allow log rotation + without having to restart the server. The Apache HTTP Server + includes a simple program called rotatelogs + for this purpose. For example, to rotate the logs every 24 hours, you + can use:

    + +

    + CustomLog "|/usr/local/apache/bin/rotatelogs + /var/log/access_log 86400" common +

    + +

    Notice that quotes are used to enclose the entire command + that will be called for the pipe. Although these examples are + for the access log, the same technique can be used for the + error log.

    + +

    A similar but much more flexible log rotation program + called cronolog + is available at an external site.

    + +

    As with conditional logging, piped logs are a very powerful + tool, but they should not be used where a simpler solution like + off-line post-processing is available.

    +
    top
    +
    +

    Virtual Hosts

    + + +

    When running a server with many virtual + hosts, there are several options for dealing with log + files. First, it is possible to use logs exactly as in a + single-host server. Simply by placing the logging directives + outside the <VirtualHost> sections in the + main server context, it is possible to log all requests in the + same access log and error log. This technique does not allow + for easy collection of statistics on individual virtual + hosts.

    + +

    If CustomLog + or ErrorLog + directives are placed inside a + <VirtualHost> + section, all requests or errors for that virtual host will be + logged only to the specified file. Any virtual host which does + not have logging directives will still have its requests sent + to the main server logs. This technique is very useful for a + small number of virtual hosts, but if the number of hosts is + very large, it can be complicated to manage. In addition, it + can often create problems with insufficient file + descriptors.

    + +

    For the access log, there is a very good compromise. By + adding information on the virtual host to the log format + string, it is possible to log all hosts to the same log, and + later split the log into individual files. For example, + consider the following directives.

    + +

    + LogFormat "%v %l %u %t \"%r\" %>s %b" + comonvhost
    + CustomLog logs/access_log comonvhost +

    + +

    The %v is used to log the name of the virtual + host that is serving the request. Then a program like split-logfile can be used to + post-process the access log in order to split it into one file + per virtual host.

    +
    top
    +
    +

    Other Log Files

    + + + + +

    PID File

    + + +

    On startup, Apache httpd saves the process id of the parent + httpd process to the file logs/httpd.pid. This + filename can be changed with the PidFile directive. The + process-id is for use by the administrator in restarting and + terminating the daemon by sending signals to the parent + process; on Windows, use the -k command line option instead. + For more information see the Stopping + and Restarting page.

    + + +

    Script Log

    + + +

    In order to aid in debugging, the + ScriptLog directive + allows you to record the input to and output from CGI scripts. + This should only be used in testing - not for live servers. + More information is available in the mod_cgi documentation.

    + + +

    Rewrite Log

    + + +

    When using the powerful and complex features of mod_rewrite, it is almost + always necessary to use the RewriteLog to help + in debugging. This log file produces a detailed analysis of how + the rewriting engine transforms requests. The level of detail + is controlled by the RewriteLogLevel directive.

    + +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/logs.html.es b/rubbos/app/httpd-2.0.64/docs/manual/logs.html.es new file mode 100644 index 00000000..7b9d4f26 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/logs.html.es @@ -0,0 +1,644 @@ + + + +Archivos de Registro (Log Files) - Servidor HTTP Apache + + + + + +
    <-
    +

    Archivos de Registro (Log Files)

    +
    +

    Idiomas disponibles:  en  | + es  | + 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.
    + +

    Para administrar de manera efectiva un servidor web, es + necesario tener registros de la actividad y el rendimiento del + servidor así como de cualquier problema que haya podido + ocurrir durante su operación. El servidor HTTP Apache ofrece + capacidades muy amplias de registro de este tipo de + información. Este documento explica cómo configurar esas + capacidades de registro, y cómo comprender qué + información contienen los ficheros de registro.

    +
    + +
    top
    +
    +

    Advertencia de seguridad

    + + +

    Cualquiera que tenga permisos de escritura sobre el directorio + en el que Apache esté escribiendo un archivo de registro + puede con casi toda seguridad tener acceso al identificador de + usuario con el que se inició el servidor, normalmente + root. NO le de a nadie permisos de escritura sobre el + directorio en que se almacenan los ficheros de registro sin tener + en cuenta las consecuencias; consulte los consejos de seguridad para + obtener más información.

    + +

    Además, los ficheros de registro pueden contener + información suministrada directamente por el cliente, sin + sustituir. Es posible por tanto que clientes con malas intenciones + inserten caracteres de control en los ficheros de registro. Por + ello es necesario tener cuidado cuando se procesan los ficheros de + registro originales.

    +
    top
    +
    +

    Registro de Errores (Error Log)

    + + + + +

    El registro de errores del servidor, cuyo nombre y + ubicación se especifica en la directiva ErrorLog, es el más importante de + todos los registros. Apache enviará cualquier + información de diagnóstico y registrará cualquier + error que encuentre al procesar peticiones al archivo de registro + seleccionado. Es el primer lugar donde tiene que mirar cuando + surja un problema al iniciar el servidor o durante su + operación normal, porque con frecuencia encontrará en + él información detallada de qué ha ido mal y + cómo solucionar el problema.

    + +

    El registro de errores se escribe normalmente en un fichero + (cuyo nombre suele ser error_log en sistemas Unix y + error.log en Windows y OS/2). En sistemas Unix + también es posible hacer que el servidor envíe los + mensajes de error al syslog o pasarlos a un programa.

    + +

    El formato del registro de errores es relativamente libre y + descriptivo. No obstante, hay cierta información que se + incluye en casi todas las entradas de un registro de errores. Por + ejemplo, este es un mensaje típico.

    + +

    + [Wed Oct 11 14:32:52 2000] [error] [client 127.0.0.1] + client denied by server configuration: + /export/home/live/ap/htdocs/test +

    + +

    El primer elemento de la entrada es la fecha y la hora del + mensaje. El segundo elemento indica la gravedad del error que se + ha producido. La directiva LogLevel se usa para controlar los tipos + de errores que se envían al registro de errores según su + gravedad. La tercera parte contiene la dirección IP del + cliente que generó el error. Después de la dirección + IP está el mensaje de error propiamente dicho, que en este + caso indica que el servidor ha sido configurado para denegar el + acceso a ese cliente. El servidor reporta también la ruta en + el sistema de ficheros (en vez de la ruta en el servidor + web) del documento solicitado.

    + +

    En el registro de errores puede aparecer una amplia variedad de + mensajes diferentes. La mayoría tienen un aspecto similar al + del ejemplo de arriba. El registro de errores también + contiene mensaje de depuración de scripts CGI. Cualquier + información escrita en el stderr por un script + CGI se copiará directamente en el registro de errores.

    + +

    El registro de errores no se puede personalizar añadiendo + o quitando información. Sin embargo, las entradas del + registro de errores que se refieren a determinadas peticiones + tienen sus correspondientes entradas en el registro de acceso. El ejemplo de arriba se + corresponde con una entrada en el registro de acceso que + tendrá un código de estado 403. Como es posible + personalizar el registro de acceso, puede obtener más + información sobre los errores que se producen usando ese + registro también.

    + +

    Si hace pruebas, suele ser de utilidad monitorizar de forma + continua el registro de errores para comprobar si ocurre + algún problema. En sistemas Unix, puede hacer esto + usando:

    + +

    + tail -f error_log +

    +
    top
    +
    +

    Registro de Acceso (Access Log)

    + + + + +

    El servidor almacena en el registro de acceso información + sobre todas las peticiones que procesa. La ubicación del + fichero de registro y el contenido que se registra se pueden + modificar con la directiva CustomLog. Puede usar la + directiva LogFormat + para simplificar la selección de los contenidos que quiere + que se incluyan en los registros. Esta sección explica como + configurar el servidor para que registre la información que + usted considere oportuno en el registro de acceso.

    + +

    Por supuesto, almacenar información en el registro de + acceso es solamente el principio en la gestión de los + registros. El siguiente paso es analizar la información que + contienen para producir estadísticas que le resulten de + utilidad. Explicar el análisis de los registros en general + está fuera de los propósitos de este documento, y no es + propiamente una parte del trabajo del servidor web. Para más + información sobre este tema, y para aplicaciones que analizan + los registros, puede visitar + + Open Directory o + Yahoo.

    + +

    Diferentes versiones de Apache httpd han usado otros + módulos y directivas para controlar la información que + se almacena en el registro de acceso, incluyendo mod_log_referer, + mod_log_agent, y la directiva TransferLog. Ahora la + directiva CustomLog + asume toda la funcionalidad que antes estaba repartida.

    + +

    El formato del registro de acceso es altamente configurable. El + formato se especifica usando una cadena de caracteres de formato + similar a las de printf(1) en lenguaje C. Hay algunos ejemplos en + las siguientes secciones. Si quiere una lista completa de los + posibles contenidos que se pueden incluir, consulte la + documentació sobre las cadenas de caracteres + de formato del mod_log_config.

    + +

    Formato Común de Registro (Common Log + Format)

    + + +

    Una configuración típica del registro de acceso + podría tener un aspecto similar a este.

    + +

    + LogFormat "%h %l %u %t \"%r\" %>s %b" common
    + CustomLog logs/access_log common +

    + +

    Con esto se define el apodo (nickname) common y se + le lo asocia con un determinado formato. El formato consiste en + una serie de directivas con tantos por ciento, cada una de las + cuales le dice al servidor que registre una determinada + información en particular. El formato también puede + incluir caracteres literales, que se copiarán directamente + en el registro. Si usa el caracter comillas (") + debe anteponerle una barra invertida para evitar que sea + interpretado como el final la cadena de caracteres a + registrar. El formato que especifique también puede + contener los caracteres de control especiales "\n" + para salto de línea y "\t" para tabulador.

    + +

    La directiva CustomLog crea un nuevo + fichero de registro usando el apodo definido. El + nombre del fichero de registro de acceso se asume que es + relativo al valor especificado en ServerRoot a no ser que empiece + por una barra (/).

    + +

    La configuración de arriba escribirá las entradas + en el registro con el formato conocido como Formato Común + de Registro (CLF). Este formato estándar lo pueden generar + muchos servidores web diferentes y lo pueden leer muchos de los + progrmas que analizan registros. Las entradas de un fichero de + registro que respetan ese formato común tienen una + aparariencia parecida es esta:

    + +

    + 127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET + /apache_pb.gif HTTP/1.0" 200 2326 +

    + +

    Cada una de las partes de la entrada se explican a + continuaci#243;n.

    + +
    +
    127.0.0.1 (%h)
    + +
    Es la dirección IP del cliente (host remoto) que hizo + la petición al servidor. Si la directiva HostnameLookups tiene valor + On, el servidor intentará determinar el + nombre del host y registrar ese nombre en lugar de la + dirección IP. Sin embargo, no se recomienda que use esta + configuración porque puede ralentizar significativamente + las operaciones del servidor. En su lugar, es mejor usar un + programa que realice esta tarea posteriormente sobre el + registro, por ejemplo logresolve. Las + direcciones IP que se registren no son necesariamente las + direcciones de las máquinas de los usuarios finales. Si + existe un servidor proxy entre el usuario final y el servidor, + la dirección que se registra es la del proxy.
    + +
    - (%l)
    + +
    Un "guión" siginifica que la información que + debería ir en ese lugar no está disponible. En este + caso, esa información es la identidad RFC 1413 del + cliente determinada por identd en la máquina + del cliente. Esta información es muy poco fiable y no + debería ser usada nunca excepto con clientes que + estén sometidos a controles muy estrictos en redes + internas. Apache httpd ni siquiera intenta recoger esa + información a menos que la directiva IdentityCheck tenga valor + On.
    + +
    frank (%u)
    + +
    Este es el identificador de usuario de la persona que + solicita el documento determinado por la autentificación + HTTP. Normalmente ese mismo valor se pasa a los scripts CGI + con la variable de entorno REMOTE_USER. Si el + código de estado de la petición (ver abajo) es 401, + entonces no debe confiar en la veracidad de ese dato porque el + usuario no ha sido aún autentificado. Si el documento no + está protegido por contraseña, se mostrará un + guión "-" en esta entrada.
    + +
    [10/Oct/2000:13:55:36 -0700] + (%t)
    + +
    + La hora a la que el servidor recibió la + petición. El formato es: + +

    + [día/mes/año:hora:minuto:segundo zona_horaria]
    + day = 2*digit
    + month = 3*letter
    + year = 4*digit
    + hour = 2*digit
    + minute = 2*digit
    + second = 2*digit
    + zone = (`+' | `-') 4*digit
    +

    + Es posible mostrar la hora de otra manera especificando + %{format} en el formato a usar en el registro, + donde format se sustituye como se haría al + usar strftime(3) de la librería + estándar de C. +
    + +
    "GET /apache_pb.gif HTTP/1.0" + (\"%r\")
    + +
    La línea de la petición del cliente se muestra + entre dobles comillas. La línea de petición contiene + mucha información de utilidad. Primero, el método + usado por el cliente es GET. Segundo, el cliente + ha hecho una petición al recurso + /apache_pb.gif, y tercero, el cliente uso el + protocolo HTTP/1.0. También es posible + registrar una o más partes de la línea de + petición independientemente. Por ejemplo, el formato + "%m %U%q %H" registrará el método, ruta, + cadena de consulta y protocolo, teniendo exactamente el mismo + resultado que "%r".
    + +
    200 (%>s)
    + +
    Es el código de estado que el servidor envía de + vuelta al cliente. Esta información es muy valiosa, + porque revela si la petición fue respondida con + éxito por el servidor (los códigos que empiezan por + 2), una redirección (los códigos que empiezan por + 3), un error provocado por el cliente (los códigos que + empiezan por 4), o un error en el servidor (los códigos + que empiezan por 5). La lista completa de códigos de + estado posibles puede consultarle en la + especificación de HTTP (RFC2616 sección + 10).
    + +
    2326 (%b)
    + +
    La última entrada indica el tamaño del objeto + retornado por el cliente, no incluídas las cabeceras de + respuesta. Si no se respondió con ningún contenido + al cliente, este valor mostrará valor + "-". Para registrar "0" en ese caso, + use %B en su lugar.
    +
    + + +

    Formato de Registro Combinado (Combined Log Format)

    + + +

    Otro formato usado a menudo es el llamado Formato de Registro + Combinado. Este formato puede ser usado como sigue.

    + +

    + LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" + \"%{User-agent}i\"" combined
    + CustomLog log/access_log combined +

    + +

    Es exactamente igual que Formato Común de Registro, pero + añade dos campos. Cada campo adicional usa la directiva + %{header}i, donde header puede + ser cualquier cabecera de petición HTTP. El registro de + acceso cuando se usa este formato tendrá este aspecto:

    + +

    + 127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET + /apache_pb.gif HTTP/1.0" 200 2326 + "http://www.example.com/start.html" "Mozilla/4.08 [en] + (Win98; I ;Nav)" +

    + +

    Los campos adicionales son:

    + +
    +
    "http://www.example.com/start.html" + (\"%{Referer}i\")
    + +
    La cabecera de petición de HTTP "Referer" + (sic). Muestra el servidor del que proviene el cliente. (Esta + debería ser la página que contiene un enlace o + que contiene a /apache_pb.gif).
    + +
    "Mozilla/4.08 [en] (Win98; I ;Nav)" + (\"%{User-agent}i\")
    + +
    La cabecera de petición HTTP "User-Agent". Es la + información de identificación que el navegador del + cliente incluye sobre sí mismo.
    +
    + + +

    Cómo usar varios registros de acceso

    + + +

    Para crear varios registros de acceso solamente tiene que + especificar varias directivas CustomLog en el fichero de + configuración. Por ejemplo, las siguientes directivas + crearán tres registros de acceso. El primero contendrá + la información básica en Formato Común de + Registro, mientras que el segundo y el tercero contendrán + contendrán la información de los "referer" y de los + navegadores usados. Las dos últimas líneas CustomLog muestran cómo + reproducir el comportamiento de las directivas + ReferLog y AgentLog.

    + +

    + LogFormat "%h %l %u %t \"%r\" %>s %b" common
    + CustomLog logs/access_log common
    + CustomLog logs/referer_log "%{Referer}i -> %U"
    + CustomLog logs/agent_log "%{User-agent}i" +

    + +

    Este ejemplo también muestra que no es necesario definir un + "apodo" con la directiva LogFormat. En lugar de esto, + el formato de registro puede especificarse directamente en la + directiva CustomLog.

    + + +

    Registro Condicional

    + + +

    Algunas veces es más conveniente excluir determinadas + entradas del registro de acceso en función de las + características de la petición del cliente. Puede + hacer esto fácilmente con la ayuda de variables de entorno. Primero, debe + especificar una variable de entorno que indique que la + petición cumple determinadas condiciones. Esto se hace + normalmente con SetEnvIf. Entonces puede usar + la claúsula env= de la directiva CustomLog para incluir o + excluir peticiones en las que esté presente la variable de + entorno. Algunos ejemplos:

    + +

    + # Marcar las peticiones de la interfaz loop-back
    + SetEnvIf Remote_Addr "127\.0\.0\.1" dontlog
    + # Marcar las peticiones del fichero robots.txt
    + SetEnvIf Request_URI "^/robots\.txt$" dontlog
    + # Registrar lo que quede
    + CustomLog logs/access_log common env=!dontlog +

    + +

    Como otro ejemplo, considere registrar las peticiones de los + angloparlantes en un fichero de registro, y el resto de + peticiones en un fichero de registro diferente.

    + +

    + SetEnvIf Accept-Language "en" english
    + CustomLog logs/english_log common env=english
    + CustomLog logs/non_english_log common env=!english +

    + +

    Aunque acabamos de mostar que el registro condicional es muy + potente y flexible, no es la única manera de controlar los + contenidos de los ficheros de registro. Los ficheros de registro + son más útiles cuanta más información sobre + la actividad del servidor contengan. A menudo es más + fácil eliminar las peticiones que no le interesen + procesando posteriormente los ficheros de registro + originales.

    + +
    top
    +
    +

    Rotación de los ficheros de registro

    + + +

    Incluso en un servidor con una actividad moderada, la cantidad + de información almacenada en los ficheros de registro es muy + grande. El registro de acceso crece normalmente en 1MB por cada + 10.000 peticiones. Por lo tanto, es necesario rotar + periódicamente los registros moviendo o borrando su + contenido. Esto no se puede hacer con el servidor funcionando, + porque Apache continuará escribiendo en el antiguo registro + mientras que el archivo esté abierto. En lugar de esto, el + servidor debe ser reiniciado + después de mover o borrar los ficheros de registro para que + se abran nuevos ficheros de registro.

    + +

    Usando un reinicio graceful, se le puede indicar al + servidor que abra nuevos ficheros de registro sin perder ninguna + petición siendo servida o en espera de algún cliente. Sin + embargo, para hacer esto, el servidor debe continuar escribiendo + en los ficheros de registro antiguos mientras termina de servir + esas peticiones. Por lo tanto, es preciso esperar algún + tiempo después del reinicio antes de realizar ninguna + operación sobre los antiguos ficheros de registro. Una + situación típica que simplemente rota los registros y + comprime los registros antiguos para ahorrar espacio es:

    + +

    + mv access_log access_log.old
    + mv error_log error_log.old
    + apachectl graceful
    + sleep 600
    + gzip access_log.old error_log.old +

    + +

    Otra manera de realizar la rotación de los registros es + usando ficheros de registro redireccionados + (piped logs) de la forma en que se explica en la siguiente + sección.

    +
    top
    +
    +

    Ficheros de registro redireccionados (Piped Logs)

    + + +

    Apache httpd es capaz de escribir la información del + registro de acceso y errores mediante una redirección a otro + proceso, en lugar de directamente a un fichero. Esta capacidad + incrementa de forma muy importante la flexibilidad de registro, + sin añadir código al servidor principal. Para escribir + registros a una redirección, simplemente reemplace el nombre + de fichero por el carácter "|", seguido por el + nombre del ejecutable que debería aceptar las entradas de + registro por su canal de entrada estándar. Apache + iniciará el proceso de registro redireccionado cuando se + inicie el servidor, y lo reiniciará si se produce algún + error irrecuperable durante su ejecución. (Esta última + funcionalidad es la que hace que se llame a esta técnica + "registro redireccionado fiable".)

    + +

    Los procesos de registros son engendrados por el proceso padre + de Apache httpd, y heredan el identificador de usuario de ese + proceso. Esto significa que los programas a los que se + redireccionan los registros se ejecutan normalmente como root. Es + por ello que es muy importante que los programas sean simples y + seguros.

    + +

    Un uso importante de los registros redireccionados es permitir + la rotación de los registros sin tener que reiniciar el + servidor. El servidor Apache HTTP incluye un programa simple + llamado rotatelogs con este propósito. Por + ejemplo para rotar los registros cada 24 horas, puede usar:

    + +

    + CustomLog "|/usr/local/apache/bin/rotatelogs + /var/log/access_log 86400" common +

    + +

    Tenga en cuenta que las comillas se usan para abarcar el + comando entero que será invocado por la + redirección. Aunque estos ejemplos son para el registro de + acceso, la misma técnica se puede usar para el registro de + errores.

    + +

    Otro programa para la rotación de los registros mucho + más flexible llamado cronolog está disponible + en un sitio web externo.

    + +

    Como ocurre con el registro condicional, la redirección de + registros es una herramienta muy potente, pero no deben ser usados + si hay disponible una solución más simple de procesado + posterior de los registros fuera de línea.

    +
    top
    +
    +

    Hosts Virtuales

    + + +

    Cuando se está ejecutando un servidor con muchos hosts virtuales, hay varias formas de abordar + el asunto de los registros. Primero, es posible usar los registros + de la misma manera que se usarían si hubiera solamente un + host en el servidor. Simplemente poniendo las directivas que + tienen que ver con los registros fuera de las secciones <VirtualHost> en el + contexto del servidor principal, puede almacenar toda la + información de todas las peticiones en los mismos registros + de acceso y errores. Esta técnica no permite una + recolección fácil de las estadísticas individuales + de cada uno de los hosts virtuales.

    + +

    Si una directiva CustomLog o ErrorLog se pone dentro una sección + <VirtualHost>, + todas las peticiones de ese host virtual se registrarán + solamente en el fichero especificado. Las peticiones de cualquier + host virtual que no tenga directivas de registro específicas + para él se registrarán en los registros del servidor + principal. Esta técnica es muy útil si usa un + pequeño número de hosts virtuales, pero si usa un gran + número de ellos, puede ser complicado de + gestionar. Además, puede a menudo provocar problemas con descriptores de fichero + insuficientes.

    + +

    Para el registro de acceso, se puede llegar a un buen + equilibrio. Añadiendo información del host virtual al + formato de registro, es posible registrar las operaciones de todos + los hosts en un único registro, y posteriormente dividir el + fichero con todos los registros en ficheros individualizados. Por + ejemplo, considere las siguientes directivas.

    + +

    + LogFormat "%v %l %u %t \"%r\" %>s %b" + comonvhost
    + CustomLog logs/access_log comonvhost +

    + +

    El %v se usa para registrar el nombre del host + virtual que está sirviendo la petición. Puede usar un + programa como split-logfile para + procesar posteriormente el registro de acceso y dividirlo en + ficheros independientes para cada host virtual.

    +
    top
    +
    +

    Otros ficheros de registro

    + + + + +

    Fichero PID (PID File)

    + + +

    Al iniciar, Apache httpd guarda el identificador del proceso + padre del servidor en el fichero + logs/httpd.pid. Puede modificar el nombre de este + fichero con la directiva PidFile. El identificador del + proceso puede usarlo el administrador para reiniciar y finalizar + el demonio (daemon) mediante el envío de señales al + proceso padre; en Windows, use la opción de línea de + comandos -k en su lugar. Para más información al + respecto, consulte la documentación sobre parar y reiniciar Apache.

    + + +

    Registro de actividad de scripts (Script Log)

    + + +

    Para ayudar a la detección de errores, la directiva + ScriptLog permite + guardar la entrada y la salida de los scripts CGI. Esta + directiva solamente debería usarla para hacer pruebas - no + en servidores en producción. Puede encontrar más + información al respecto en la documentación de mod_cgi.

    + + +

    Registro de actividad de Rewrite (Rewrite Log)

    + + +

    Cuando use las potentes y complejas funcionalidades de mod_rewrite, será casi + siempre necesario usar la direcitiva RewriteLog para ayudar a la + detección de errores. Este fichero de registro produce un + análisis detallado de cómo actúa este + módulo sobre las peticiones. El nivel de detalle del + registro se controla con la directiva RewriteLogLevel.

    + +
    +
    +

    Idiomas disponibles:  en  | + es  | + ja  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/logs.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/logs.html.ja.utf8 new file mode 100644 index 00000000..0e76e4a4 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/logs.html.ja.utf8 @@ -0,0 +1,557 @@ + + + +ログファイル - Apache HTTP サーバ + + + + + +
    <-
    +

    ログファイル

    +
    +

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

    +
    +
    This translation may be out of date. Check the + English version for recent changes.
    + +

    ウェブサーバを効果的に管理するためには、サーバの活動やパフォーマンス、 + 今発生しているかもしれない問題に関するフィードバックを得ることが必要です。 + Apache HTTP サーバには非常に包括的で柔軟なロギング機能があります。 + この文書はロギング機能の設定の仕方と、ログに何が書かれているかを + 理解するための方法を説明します。

    +
    + +
    top
    +
    +

    + セキュリティに関する警告

    + +

    Apache がログファイルを書いているディレクトリに書き込める人は、 + ほぼ確実にサーバが起動された uid へのアクセスを手に入れることができます。 + そして、それは通常は root ユーザです。 + ちゃんと結果を考えることなく、そのディレクトリへの + 書き込み権限を与えないでください。詳しくは + セキュリティのこつの文書を + 読んでください。

    + +

    加えて、ログファイルにはクライアントからの情報がそのまま、 + エスケープされることなく書かれています。ですから、悪意のある + クライアントがログファイルに制御文字を挿入することができます。 + 生のログを扱うときは注意してください。

    +
    top
    +
    +

    エラーログ

    + + + +

    ErrorLog ディレクティブにより + 名前と場所が決まるサーバのエラーログは、一番重要なログファイルです。 + Apache の診断情報はここに送られ、リクエストを処理しているときに + 発生したエラーはすべてここに記録されます。サーバを起動したときや、 + サーバの動作に問題が起こったときは、一番最初に調べるべき + ところです。間違いの詳細や修正方法がそこに書かれていることが + よくあります。

    + +

    エラーログは普通はファイルに書かれます (通常 unix システムでは + error_log、Windows と OS/2 では error.log)。 + Unix システムではエラーを syslog や + パイプでプログラムに送る ことができます。

    + +

    エラーログの書式は比較的自由度の高いもので、説明的に書かれています。 + ただし、いくつかの情報はほとんどのエラーログのエントリにあります。 + 例えば、代表的なものに次のようなメッセージがあります。

    + +

    + [Wed Oct 11 14:32:52 2000] [error] [client 127.0.0.1] + client denied by server configuration: + /export/home/live/ap/htdocs/test +

    + +

    ログエントリの最初の項目はメッセージの日付と時刻です。 + 二つめの項目は報告されているエラーの重要度です。 + LogLevel で重要度のレベルを + 制限することによりエラーログに送られるエラーの種類を制御することが + できます。三つ目の項目はエラーを発生させたクライアントの IP アドレス + です。残りはメッセージで、この場合はサーバがクライアントのアクセスを + 拒否するように設定されている、ということを示しています。 + サーバはリクエストされた文書の (ウェブのパスではなく) ファイルシステムの + パスを報告します。

    + +

    非常に広範囲のメッセージがエラーログに現れます。たいていのものは + 上の例のような感じです。エラーログには CGI スクリプトのデバッグ + 出力も書かれます。CGI スクリプトが stderr に書いた + すべての情報は直接エラーログにコピーされます。

    + +

    情報を追加したり削除したりしてエラーログをカスタマイズすることは + できません。しかし、リクエストに対するエラーログのエントリは、 + 対応するエントリがアクセスログにあります。 + 例えば、上の例のエントリはアクセスログのステータスコード 403 の + エントリに対応します。アクセスログはカスタマイズ可能ですので、 + そちらを使うことによりエラーの状況に関する情報をより多く + 手に入れることができます。

    + +

    テストの最中は、問題が発生しているかどうかを見るために、 + 常にエラーログを監視するのが役に立つ場合がよくあります。 + Unix システムでは、次のものを使うことができます。

    + +

    + tail -f error_log +

    +
    top
    +
    +

    アクセスログ

    + + + + +

    サーバアクセスログはサーバが処理をしたすべてのリクエストを + 記録します。アクセスログの場所と内容は CustomLog + ディレクティブにより決まります。ログの内容の選択を簡潔にするために + LogFormat + ディレクティブを使用することができます。このセクションはアクセスログに + 情報を記録するためのサーバの設定方法を説明します。

    + +

    もちろん、アクセスログに情報を蓄積することはログ管理の + 始まりに過ぎません。次の段階は有用な統計を取るためにこの情報を + 解析することです。一般的なログ解析はこの文書の範囲外で、 + ウェブサーバ自身の仕事というわけでもありません。この話や、 + ログ解析を行なうアプリケーションの情報を得るには、 + Open Directory や + Yahoo を調べてください。

    + +

    いろんなバージョンの Apache httpd が mod_log_config, + mod_log_agent, TransferLog ディレクティブといった、 + 他のモジュールやディレクティブを使ってアクセスのロギングを + 制御してきました。今では、CustomLog がすべての古い + ディレクティブの機能を含むようになっています。

    + +

    アクセスログの書式は非常に柔軟な設定が可能です。 + 書式は C の printf(1) フォーマット文字列に非常に似た + フォーマット文字列 + により指定されます。いくつか次の節で例を示します。 + フォーマット文字列に使用できる内容の一覧は mod_log_config の文書 + を見てください。

    + +

    Common Log Format

    + + +

    アクセスログのよくある設定に以下のものがあります。

    + +

    + LogFormat "%h %l %u %t \"%r\" %>s %b" common
    + CustomLog logs/access_log common +

    + +

    これは、ニックネーム common を定義し、 + ログのフォーマット文字列の一つと関連付けます。フォーマット文字列は + パーセントディレクティブからなり、それぞれのパーセントディレクティブは + サーバにどの情報をロギングするかを指示します。フォーマット文字列に + 文字をそのまま入れることもでき、それらはログの出力に直接コピーされます。 + そこに引用文字 (") を書くときは、 + フォーマット文字列の最後として解釈 + されることを防ぐためにバックスラッシュでエスケープする必要があります。 + フォーマット文字列には改行用の "\n"、タブ用の + "\t" という特別な制御文字も含めることができます。

    + +

    CustomLog ディレクティブは + 既に定義された + ニックネーム を使って新しいログファイルを設定します。 + アクセスログのファイル名はスラッシュで始まらない限り、 + ServerRoot からの相対パスとして + 扱われます。

    + +

    上の設定は Common Log Format (CLF) と呼ばれる形式で + ログエントリを書きます。この標準の形式は異なるウェブサーバの多くが + 生成することができ、多くのログ解析プログラムが読みこむことができます。 + CLF により生成されたログファイルのエントリは以下のようになります:

    + +

    + 127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET + /apache_pb.gif HTTP/1.0" 200 2326 +

    + +

    このログエントリのそれぞれの部分の意味は以下で説明します。

    + +
    +
    127.0.0.1 (%h)
    + +
    これはサーバへリクエストをしたクライアント (リモートホスト) + の IP アドレスです。HostnameLookups が + On の場合は、サーバはホスト名を調べて、 + IP アドレスが書かれているところに記録します。しかし、この設定は + サーバをかなり遅くするので、あまりお勧めできません。 + そうではなく、logresolve の + ようなログの後処理を行なうプログラムでホスト名を調べるのが良いでしょう。 + ここに報告される IP アドレスは必ずしもユーザが使っているマシンの + ものであるとは限りません。ユーザとサーバの間にプロキシサーバが + あれば、このアドレスは元のマシンのものではなく、プロキシの + アドレスになります。
    + +
    - (%l)
    + +
    出力中の「ハイフン」は要求された情報が手に入らなかったということを + 意味します。この場合、取得できなかった情報はクライアントのマシンの + identd により決まる RFC 1413 のクライアントの + アイデンティティです。この情報はあまり信用することができず、 + しっかりと管理された内部ネットワークを除いては使うべきではありません。 + Apache は IdentityCheck が + On になっていない限り、この情報を得ようとすらしません。
    + +
    frank (%u)
    + +
    これは HTTP 認証による、ドキュメントをリクエストした人の + ユーザ ID です。CGI スクリプトには通常同じ値が REMOTE_USER + 環境変数として与えられます。リクエストのステータスコード + (以下を参照) が 401 であった場合は、ユーザは認証に失敗しているので、 + この値は信用できません。ドキュメントがパスワードで保護されていない + 場合は、このエントリは前のものと同じように "-" に + なります。
    + +
    [10/Oct/2000:13:55:36 -0700] + (%t)
    + +
    + サーバがリクエストの処理を終えた時刻です。書式は: + +

    + [day/month/year:hour:minute:second zone]
    + day = 2*digit
    + month = 3*letter
    + year = 4*digit
    + hour = 2*digit
    + minute = 2*digit
    + second = 2*digit
    + zone = (`+' | `-') 4*digit
    +

    + ログのフォーマット文字列に %{format}t を + 指定することで、別の形式で時刻を表示させることもできます。 + このとき、format は C の標準ライブラリの + strftime(3) の形式になります。 +
    + +
    "GET /apache_pb.gif HTTP/1.0" + (\"%r\")
    + +
    クライアントからのリクエストが二重引用符の中に示されています。 + リクエストには多くの有用な情報があります。まず、この場合クライアントが + 使ったメソッドは GET です。次に、クライアントは + リソース /apache_pb.gif を要求しました。そして、 + クライアントはプロトコル HTTP/1.0 を使用しました。 + リクエストの各部分を独立にログ収集することもできます。例えば、 + フォーマット文字列 "%m %U%q %H" は + メソッド、パス、クエリ文字列、プロトコルをログ収集し、 + 結局 "%r" とまったく同じ出力になります。
    + +
    200 (%>s)
    + +
    サーバがクライアントに送り返すステータスコードです。 + この情報は、リクエストが成功応答 (2 で始まるコード) であったか、 + リダイレクション (3 で始まるコード) であったか、クライアントによる + エラー (4 で始まるコード) であったか、サーバのエラー (5 で始まるコード) + であったか、を現すので、非常に大切です。ステータスコードの + 完全なリストは HTTP + 規格 (RFC2616 第 10 節) にあります。
    + +
    2326 (%b)
    + +
    この最後のエントリはクライアントに送信されたオブジェクトの、 + 応答ヘッダを除いたサイズを現します。コンテントがクライアントに送られなかった + 場合は、この値は "-" になります。コンテントが無い場合に + "0" をログ収集するには、%b ではなく + %B を使ってください。
    + +
    + + +

    Combined Log Format

    + + +

    もう一つのよく使われる書式は Combined Log Format と呼ばれています。 + 以下のようにして使うことができます。

    + +

    + LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" + \"%{User-agent}i\"" combined
    + CustomLog log/access_log combined +

    + +

    この書式の最初の方は Common Log Format とまったく同じで、最後に + 二つ追加のエントリがあります。追加のエントリはパーセントディレクティブ + %{header}i を使っています。ここで + header は HTTP のリクエストヘッダのどれかです。この書式による + アクセスログは以下のような感じになります:

    + +

    + 127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET + /apache_pb.gif HTTP/1.0" 200 2326 + "http://www.example.com/start.html" "Mozilla/4.08 [en] + (Win98; I ;Nav)" +

    + +

    追加のエントリは:

    + +
    +
    "http://www.example.com/start.html" + (\"%{Referer}i\")
    + +
    "Referer" (意図的な綴り間違い) HTTP リクエストヘッダです。 + これはクライアントが報告してくる参照元のサイトを表します。 + (この場合は、/apache_pb.gif にリンクしているか、 + それを含んでいるページです)。
    + +
    "Mozilla/4.08 [en] (Win98; I ;Nav)" + (\"%{User-agent}i\")
    + +
    User-Agent HTTP リクエストヘッダです。これはクライアントのブラウザが + 自分自身のことを報告してくる情報です。
    +
    + + +

    複数のアクセスログ

    + + +

    複数のアクセスログは単に設定ファイルに複数の CustomLog + ディレクティブを書くことで作成されます。例えば、以下のディレクティブは + 三つのアクセスログを作ります。最初のものは基本的な CLF の情報で、 + 二つ目と三つ目は referer とブラウザの情報です。最後二つの + CustomLog は + ReferLog ディレクティブと + AgentLog ディレクティブの効果をまねる方法を示しています。

    + +

    + LogFormat "%h %l %u %t \"%r\" %>s %b" common
    + CustomLog logs/access_log common
    + CustomLog logs/referer_log "%{Referer}i -> %U"
    + CustomLog logs/agent_log "%{User-agent}i" +

    + +

    この例は LogFormat で + ニックネームを定義する必要がない、 + ということも示しています。ニックネームの代わりに、 + CustomLog ディレクティブに + 直接ログの書式を指定することができます。

    + + +

    条件付きログ

    + + +

    クライアントのリクエストの特徴に基づいてアクセスログにエントリの + 一部をロギングしない方が便利なことがあります。これは 環境変数 の補助により簡単に実現できます。まず、 + リクエストが何らかの条件に合うということを現すために環境変数が + 設定される必要があります。これは通常は SetEnvIf により + 行なわれます。そして、CustomLog ディレクティブの + env= 節を使って環境変数が設定されているリクエストを + 含めたり排除したりすることができます。いくつか例を挙げます:

    + +

    + # Mark requests from the loop-back interface
    + SetEnvIf Remote_Addr "127\.0\.0\.1" dontlog
    + # Mark requests for the robots.txt file
    + SetEnvIf Request_URI "^/robots\.txt$" dontlog
    + # Log what remains
    + CustomLog logs/access_log common env=!dontlog +

    + +

    他の例として、英語を話す人からのリクエストとそれ以外の人からのリクエストを + 分けたい、という場合を考えてみてください。

    + +

    + SetEnvIf Accept-Language "en" english
    + CustomLog logs/english_log common env=english
    + CustomLog logs/non_english_log common env=!english +

    + +

    ここまででは条件付きロギングが非常に強力で柔軟であることを示してきましたが、 + それがログの内容を制御する唯一の方法というわけではありません。ログファイルは + サーバの活動の完全な記録である方がより役に立ちます。単純にログファイルを + 後処理して、考慮したくないログを削除する方が簡単であることがよくあります。

    + +
    top
    +
    +

    ログの交替

    + + +

    普通の負荷のサーバでさえ、ログファイルに保存される情報の量は + 膨大になります。アクセスログのファイルは普通 10,000 リクエスト毎に + 1 MB 以上増えます。ですから、既存のログを移動したり、削除したりして、 + 定期的にログを交替させることが必要になります。これはサーバの実行中には + 行なえません。というのは、Apache はファイルが open されている間は + ずっと古いログファイルに書き続けるからです。 + 新しいログファイルを open できるように、ログファイルが移動されたり + 削除された後に、サーバを再起動する + 必要があります。

    + +

    優雅な 再起動を行なうことで、サーバは既存のコネクションや + 処理待ちのコネクションを失うことなく新しいログファイルを open させる + ことができます。しかし、これを実現するために、サーバは古いリクエストを + 扱っている間は古いログファイルに書き続ける必要があります。 + ですから、再起動の後ではログファイルの処理を始める前に、しばらく待たなければ + なりません。単にログを交替させて、ディスクの節約のために古いログを + 圧縮する普通のシナリオは:

    + +

    + mv access_log access_log.old
    + mv error_log error_log.old
    + apachectl graceful
    + sleep 600
    + gzip access_log.old error_log.old +

    + +

    ログの交替をするもう一つの方法はパイプ経由のログを使うもので、次の節で説明されています。

    +
    top
    +
    +

    パイプ経由のログ

    + + +

    Apache httpd はエラーログとアクセスログをファイルに直接書く代わりに、 + パイプを通して別のプログラムに書き出すことができます。 + この機能により、主サーバにコードを追加することなく + ロギングの柔軟性が非常に高まっています。パイプにログを書くためには、 + 単にファイル名をパイプ文字 "|" に置き換え、その続きに + 標準入力からログのエントリを受けとる実行プログラムの名前を書くだけです。 + Apache はパイプ経由のログ用のプロセスをサーバの起動時に実行し、 + サーバの実行中にそのプログラムがクラッシュしたときはそれを再び + 実行します。(この最後の機能がこの技術が「信頼性のあるパイプ経由のロギング」 + と呼ばれている理由です。)

    + +

    パイプ経由のログ用のプロセスは Apache httpd の親プロセスから起動され、 + そのプロセスのユーザ ID を継承します。これは、これは、パイプ経由のログ用の + プログラムは普通 root として実行されることを意味します。 + ですから、プログラムを簡単で安全に保つことが非常に重要です。

    + +

    パイプ経由のログの重要な利用法は、サーバの再起動なしでログの交替を + することです。Apache HTTP サーバにはこのための rotatelogs と呼ばれる簡単な + プログラムが付属しています。たとえば、24 時間毎にログを交替させるには、 + 以下のものを使うことができます:

    + +

    + CustomLog "|/usr/local/apache/bin/rotatelogs + /var/log/access_log 86400" common +

    + +

    パイプの先で呼ばれるコマンド全体が引用符で囲まれていることに注目して + ください。この例はアクセスログを使っていますが、エラーログにも同じ技術を + 使うことができます。

    + +

    似ているけれど、よりずっと柔軟な + cronolog というログ交替用の + プログラムが外部のサイトにあります。

    + +

    条件付きロギングと同様、パイプ経由のログは非常に強力な + 道具ですが、オフラインの後処理のような、より簡単な解決方法があるときは + 使わない方が良いでしょう。

    +
    top
    +
    +

    バーチャルホスト

    + + +

    多くの バーチャルホスト のあるサーバを実行している + ときは、ログファイルの扱い方にいくつかの方法があります。 + まず、単独のホストのみのサーバとまったく同じようにログを使うことができます。 + ロギングディレクティブを主サーバのコンテキストの + <VirtualHost> セクションの外に置くことで、 + すべてのログを同じアクセスログとエラーログにログ収集することができます。 + この手法では個々のバーチャルホストの統計を簡単にとることはできません。

    + +

    >CustomLog や + ErrorLog ディレクティブが + <VirtualHost> の中に + 置かれた場合は、そのバーチャル + ホストへのすべてのリクエストやエラーがそこで指定されたファイルにのみ + ログ収集されます。ロギングディレクティブのないバーチャルホストは + 依然としてリクエストが主サーバのログに送られます。この手法は少ない + バーチャルホストに対しては非常に有用ですが、ホストの数が非常に多くなると + 管理が大変になります。さらに、ファイル記述子の限界の問題を起こすことが + あります。

    + +

    アクセスログには、非常に良い妥協案があります。バーチャルホストの + 情報をログのフォーマット文字列に加えることで、すべてのホストへの + リクエストを同じログにログ収集して、後でログを個々のファイルに分割することが + できます。たとえば、以下のディレクティブを見てください。

    + +

    + LogFormat "%v %l %u %t \"%r\" %>s %b" + comonvhost
    + CustomLog logs/access_log comonvhost +

    + +

    %v がリクエストを扱っているバーチャルホストの名前を + ログ収集するために使われています。そして、split-logfile のようなプログラムを + 使ってアクセスログを後処理することで、 + バーチャルホスト毎のファイルにログを分割することができます。

    + +

    残念ながら、エラーログには同様の手法はありません。ですから、 + すべてのバーチャルホストを同じエラーログの中に混ぜるか、 + バーチャルホスト毎にエラーログを使うかを選ばなければなりません。

    +
    top
    +
    +

    他のログファイル

    + + + + +

    PID ファイル

    + + +

    起動時に、Apache は親 httpd プロセスのプロセス ID を + logs/httpd.pid に保存します。この + ファイル名は PidFile ディレクティブを使って + 変更することができます。プロセス ID は管理者が親プロセスに + シグナルを送ることでデーモンを再起動したり終了させたりするときに + 使用します。Windows では、代わりに -k コマンドオプションを + 使ってください。詳しい情報は 終了と + 再起動 のページを見てください。

    + + +

    スクリプトログ

    + + +

    デバッグの補助のために、ScriptLog ディレクティブは + CGI スクリプトの入力と出力を記録するようにできます。 + これはテスト用にのみ使用して、通常のサーバでは使用しないでください。 + 詳しい情報は mod_cgi の文書 にあります。

    + + +

    リライトログ

    + + +

    mod_rewrite の強力で + 複雑な機能を + 使っているときは、ほぼいつもデバッグを簡単にするために + RewriteLog の使用が + 必要でしょう。このログファイルにはリライトエンジンがリクエストを + 書き換える方法の詳細な解析が出力されます。詳しさの度合は RewriteLogLevel + で制御できます。

    + +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/logs.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/logs.html.ko.euc-kr new file mode 100644 index 00000000..7adb5a0a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/logs.html.ko.euc-kr @@ -0,0 +1,525 @@ + + + +·Î±×ÆÄÀÏ - Apache HTTP Server + + + + + +
    <-
    +

    ·Î±×ÆÄÀÏ

    +
    +

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

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

    È¿À²ÀûÀ¸·Î À¥¼­¹ö¸¦ °ü¸®ÇÏ·Á¸é ¹ß»ýÇÏ´Â ¹®Á¦¿Í ÇÔ²² ¼­¹öÀÇ + È°µ¿°ú ¼º´É¿¡ ´ëÇØ ¾Ë¾Æ¾ß ÇÑ´Ù. ¾ÆÆÄÄ¡ À¥¼­¹ö´Â ¸Å¿ì Á¾ÇÕÀûÀÌ°í + À¯¿¬ÇÑ ·Î±× ±â´ÉÀ» Á¦°øÇÑ´Ù. ÀÌ ¹®¼­´Â ·Î±× ±â´ÉÀ» ¼³Á¤ÇÏ´Â + ¹æ¹ý°ú ·Î±×¿¡ µé¾î°¥ ³»¿ëÀ» ¼³¸íÇÑ´Ù.

    +
    + +
    top
    +
    +

    º¸¾È °æ°í

    + + +

    ´©±º°¡¿¡°Ô ¾ÆÆÄÄ¡ÀÇ ·Î±×ÆÄÀÏÀÌ ÀÖ´Â µð·ºÅ丮¿¡ ¾²±â±ÇÇÑÀÌ + ÀÖ´Ù¸é (º¸Åë root) ¼­¹ö¸¦ ½ÇÇàÇÏ´Â uid¸¦ °ÅÀÇ È®½ÇÈ÷ ¾òÀ» + ¼ö ÀÖ´Ù. À̸¦ °í·ÁÇÏÁö¾Ê°í ·Î±×°¡ ÀúÀåµÈ µð·ºÅ丮¿¡ ¾²±â±ÇÇÑÀ» + ÁÖÁö ¸¶¶ó. ÀÚ¼¼ÇÑ ³»¿ëÀº º¸¾È ÆÁ ¹®¼­¸¦ Âü°íÇ϶ó.

    + +

    ¶Ç, Ŭ¶óÀ̾ðÆ®°¡ Á¦°øÇÑ Á¤º¸´Â ·Î±×ÆÄÀÏ¿¡ °ÅÀÇ ±×´ë·Î + ±â·ÏµÈ´Ù. ±×·¡¼­ ¾ÇÀÇ°¡ Àִ Ŭ¶óÀ̾ðÆ®°¡ ·Î±×ÆÄÀÏ¿¡ Á¦¾î¹®ÀÚ¸¦ + ³ÖÀ» ¼ö ÀÖÀ¸¹Ç·Î, ·Î±×¸¦ ´Ù·ê¶§´Â ÁÖÀÇÇØ¾ß ÇÑ´Ù.

    +
    top
    +
    +

    ¿À·ù ·Î±× (Error Log)

    + + + + +

    ErrorLog Áö½Ã¾î´Â + °¡Àå Áß¿äÇÑ ·Î±×ÆÄÀÏÀÎ ¼­¹ö ¿À·ù ·Î±×ÀÇ À̸§°ú À§Ä¡¸¦ ÁöÁ¤ÇÑ´Ù. + ¾ÆÆÄÄ¡ À¥¼­¹ö´Â ÀÌ ÆÄÀÏ¿¡ Áø´ÜÁ¤º¸¿Í ¿äûÀ» ó¸®ÇÏ´Â µµÁß + ¹ß»ýÇÑ ¿À·ù¸¦ ±â·ÏÇÑ´Ù. ¼­¹ö°¡ ½ÃÀÛÇϰųª µ¿ÀÛÇϴµ¥ ¹®Á¦°¡ + ÀÖ´Ù¸é ¹«¾ùÀÌ À߸øµÇ¾ú°í ¶§¶§·Î ¾î¶»°Ô °íÄ¡´ÂÁö¸¦ ¾Ë·ÁÁÖ´Â + ÀÌ°÷À» °¡Àå ¸ÕÀú »ìÆìºÁ¾ß ÇÑ´Ù.

    + +

    ¿À·ù ·Î±×´Â º¸Åë (ÀüÇüÀûÀ¸·Î À¯´Ð½º ½Ã½ºÅÛ¿¡¼­´Â + error_log, À©µµ¿ìÁî¿Í OS/2¿¡¼­´Â + error.log) ÆÄÀÏ¿¡ ±â·ÏµÈ´Ù. À¯´Ð½º ½Ã½ºÅÛ¿¡¼­ + ¼­¹ö´Â ¿À·ù¸¦ syslog³ª ÆÄÀÌÇÁ¸¦ + »ç¿ëÇÏ¿© ´Ù¸¥ ÇÁ·Î±×·¥À¸·Î º¸³¾ ¼öµµ ÀÖ´Ù.

    + +

    ¿À·ù ·Î±×ÀÇ Çü½ÄÀº »ó´ëÀûÀ¸·Î ÀÚÀ¯·Ó°í ÀÚ¼¼ÇÏ´Ù. ±×·¯³ª + ´ëºÎºÐÀÇ ¿À·ù ·Î±× Ç׸ñ¿¡ °øÅëÀûÀ¸·Î ³ª¿À´Â Á¤º¸°¡ ÀÖ´Ù. + ¿¹¸¦ µé¾î, Ç׸ñÀº º¸Åë ´ÙÀ½°ú °°´Ù.

    + +

    + [Wed Oct 11 14:32:52 2000] [error] [client 127.0.0.1] + client denied by server configuration: + /export/home/live/ap/htdocs/test +

    + +

    ·Î±× Ç׸ñ¿¡¼­ ù¹ø° Ç׸ñÀº ³¯Â¥¿Í ½Ã°£ÀÌ´Ù. µÎ¹ø° + Ç׸ñÀº º¸°íÇÏ´Â ¿À·ùÀÇ ½É°¢¼ºÀ» ³ªÅ¸³½´Ù. LogLevel Áö½Ã¾î·Î ¿À·ù ·Î±×¿¡ + ±â·ÏµÇ´Â ¿À·ùÀÇ ½É°¢¼ºÀ» Á¦ÇÑÇÒ ¼ö ÀÖ´Ù. ¼¼¹ø° Ç׸ñÀº + ¿À·ù¸¦ ¹ß»ýÇÑ Å¬¶óÀ̾ðÆ®ÀÇ IP ÁÖ¼ÒÀÌ´Ù. ÀÌ ´ÙÀ½ºÎÅÍ ¿À·ù¹®ÀÌ + ³ª¿À¸ç, ÀÌ °æ¿ì ¼­¹ö°¡ Ŭ¶óÀ̾ðÆ®ÀÇ Á¢±ÙÀ» °ÅºÎÇϵµ·Ï + ¼³Á¤µÇ¾ú´Ù°í ³ª¿ÍÀÖ´Ù. ¿äûÇÑ ¹®¼­ÀÇ (À¥ °æ·Î°¡ ¾Æ´Ñ) + ÆÄÀϽýºÅÛ °æ·Îµµ º¸ÀδÙ.

    + +

    ¿À·ù ·Î±×¿¡´Â ¸Å¿ì ´Ù¾çÇÑ Á¾·ùÀÇ ¹®±¸°¡ ³ª¿Ã ¼ö ÀÖ´Ù. + ´ëºÎºÐÀº À§¿Í ºñ½ÁÇÏ´Ù. CGI ½ºÅ©¸³Æ®ÀÇ µð¹ö±ë Ãâ·Âµµ ¿À·ù + ·Î±×¿¡ ±â·ÏµÈ´Ù. CGI ½ºÅ©¸³Æ®°¡ stderr¿¡ ¾´ + Á¤º¸´Â ±×´ë·Î ¿À·ù ·Î±×·Î º¹»çµÈ´Ù.

    + +

    ¿À·ù ·Î±×¿¡ Á¤º¸¸¦ Ãß°¡ÇÏ°¡³ª »ý·«ÇÒ ¼ö ¾ø´Ù. ±×·¯³ª + ¿äû¿¡ ´ëÇÑ ¿À·ù ·Î±×ÀÇ °æ¿ì Á¢±Ù + ·Î±×¿¡µµ ´ëÀÀÇÏ´Â Ç׸ñÀÌ »ý±ä´Ù. ¿¹¸¦ µé¾î, À§ÀÇ °æ¿ì + »óÅÂÄڵ尡 403ÀÎ Á¢±Ù ·Î±× Ç׸ñÀÌ »ý±ä´Ù. Á¢±Ù ·Î±×´Â + »ç¿ëÀÚÁ¤ÀÇÇÒ ¼ö ÀÖÀ¸¹Ç·Î ÀÌ ÆÄÀÏÀ» Âü°íÇÏ¿© ¿À·ù »óȲ¿¡ + ´ëÇÑ Ãß°¡Á¤º¸¸¦ ¾òÀ» ¼ö ÀÖ´Ù.

    + +

    °Ë»çÇÒ¶§ ¾î¶² ¹®Á¦°¡ »ý±â´ÂÁö ¿À·ù ·Î±×¸¦ °è¼Ó »ìÆ캸´Â + °ÍÀÌ ÁÁ´Ù. À¯´Ð½º ½Ã½ºÅÛ¿¡¼­ ´ÙÀ½°ú °°ÀÌ ÇÑ´Ù:

    + +

    + tail -f error_log +

    +
    top
    +
    +

    Á¢±Ù ·Î±× (Access Log)

    + + + + +

    ¼­¹ö Á¢±Ù ·Î±×´Â ¼­¹ö°¡ ó¸®ÇÏ´Â ¸ðµç ¿äûÀ» ±â·ÏÇÑ´Ù. + CustomLog + Áö½Ã¾î´Â Á¢±Ù ·Î±×ÀÇ À§Ä¡¿Í ³»¿ëÀ» ÁöÁ¤ÇÑ´Ù. LogFormat Áö½Ã¾î¸¦ + »ç¿ëÇÏ¿© ·Î±×¿¡ Æ÷ÇÔÇÒ ³»¿ëÀ» ½±°Ô ¼±ÅÃÇÒ ¼ö ÀÖ´Ù. ÀÌ ÀýÀº + ¼­¹ö°¡ Á¢±Ù ·Î±×¿¡ ¾µ ³»¿ëÀ» ¼³Á¤ÇÏ´Â ¹æ¹ýÀ» ¼³¸íÇÑ´Ù.

    + +

    ¹°·Ð Á¢±Ù ·Î±×¿¡ Á¤º¸¸¦ ±â·ÏÇÏ´Â °ÍÀº ·Î±× °ü¸®ÀÇ ½ÃÀÛÀÏ + »ÓÀÌ´Ù. ´ÙÀ½ ´Ü°è´Â ÀÌ Á¤º¸¸¦ ºÐ¼®ÇÏ¿© À¯¿ëÇÑ Åë°è¸¦ ¸¸µå´Â + °ÍÀÌ´Ù. ÀÌ ¹®¼­´Â ÀϹÝÀûÀÎ ·Î±× ºÐ¼®¿¡ ´ëÇؼ­ ´Ù·çÁö ¾ÊÀ¸¸ç, + ·Î±× ºÐ¼®Àº ½ÇÁ¦ À¥¼­¹ö°¡ ÇÒ ÀÏÀÌ ¾Æ´Ï´Ù. ·Î±× ºÐ¼®¿¡ ´ëÇÑ + Á¤º¸¿Í ·Î±×¸¦ ºÐ¼®ÇÏ´Â ¼ÒÇÁÆ®¿þ¾î¿¡ ´ëÇؼ­´Â Open Directory³ª + Yahoo¸¦ + Âü°íÇ϶ó.

    + +

    ¾ÆÆÄÄ¡ À¥¼­¹ö´Â ÀÌÀüºÎÅÍ mod_log_referer, mod_log_agent, + CustomLog + °°Àº ¸ðµâ°ú Áö½Ã¾î¸¦ »ç¿ëÇÏ¿© Á¢±Ù ·Î±×¸¦ ´Ù·ç¾ú´Ù. Áö±ÝÀº + CustomLog + Áö½Ã¾î°¡ ¿À·¡µÈ Áö½Ã¾îµéÀÇ ¸ðµç ±â´ÉÀ» À̾î¹Þ¾Ò´Ù.

    + +

    Á¢±Ù ·Î±×ÀÇ Çü½ÄÀº ¸Å¿ì »ç¿ëÀÚÁ¤ÀÇ °¡´ÉÇÏ´Ù. Çü½ÄÀº CÀÇ + printf(1) Çü½Ä¹®ÀÚ¿­°ú ¸Å¿ì À¯»çÇÑ Çü½Ä¹®ÀÚ¿­À» »ç¿ëÇÏ¿© + ÁöÁ¤ÇÑ´Ù. ´ÙÀ½ Àý¿¡ ¿¹¸¦ µé¾ú´Ù. Çü½Ä¹®ÀÚ¿­¿¡ »ç¿ë°¡´ÉÇÑ + ¸ðµç ³»¿ëÀ» ¾Ë·Á¸é mod_log_config Çü½Ä¹®ÀÚ¿­À» + Âü°íÇ϶ó.

    + +

    Common ·Î±× Çü½Ä

    + + +

    Á¢±Ù ·Î±×ÀÇ ÀüÇüÀûÀÎ ¼³Á¤Àº ´ÙÀ½°ú °°´Ù.

    + +

    + LogFormat "%h %l %u %t \"%r\" %>s %b" common
    + CustomLog logs/access_log common +

    + +

    ±×·¯¸é ÁöÁ¤ÇÑ ·Î±× Çü½Ä¹®ÀÚ¿­À» º°¸í + commonÀ¸·Î Á¤ÀÇÇÑ´Ù. Çü½Ä¹®ÀÚ¿­Àº ÆÛ¼¾Æ® + Áö½Ã¾îµé·Î ±¸¼ºµÇ¸ç, °¢°¢Àº ¾î¶² Á¤º¸¸¦ ±â·ÏÇÒÁö ¾Ë¸°´Ù. + Çü½Ä¹®ÀÚ¿­¿¡ ÀÏ¹Ý ¹®ÀÚ¸¦ ÀûÀ¸¸é ±×´ë·Î ·Î±×¿¡ Ãâ·ÂµÈ´Ù. + µû¿ÈÇ¥ ¹®ÀÚ(")¸¦ Ãâ·ÂÇÏ°í ½Í´Ù¸é ¹é½½·¡½¬¸¦ + ¾Õ¿¡ ºÙ¿©¼­ Çü½Ä¹®ÀÚ¿­ÀÇ ³¡ÀÌ ¾Æ´ÔÀ» Ç¥½ÃÇÑ´Ù. Çü½Ä¹®ÀÚ¿­¿¡ + ÁÙ¹Ù²Þ "\n", ÅÇ "\t"¿Í °°Àº + Ư¼ö Á¶Àý¹®ÀÚ¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù.

    + +

    CustomLog + Áö½Ã¾î´Â Á¤ÀÇÇÑ º°¸íÀ» »ç¿ëÇÏ´Â »õ·Î¿î ·Î±×ÆÄÀÏÀ» + ¸¸µç´Ù. Á¢±Ù ·Î±×ÀÇ ÆÄÀϸíÀÌ ½½·¡½¬·Î ½ÃÀÛÇÏÁö¾ÊÀ¸¸é + ServerRootÀÇ »ó´ë°æ·ÎÀÌ´Ù.

    + +

    ¾ÕÀÇ ¼³Á¤Àº °øÅë·Î±×Çü½Ä(Common Log Format, CLF)À̶ó´Â + Çü½ÄÀ¸·Î ·Î±× Ç׸ñÀ» ±â·ÏÇÑ´Ù. ¿©·¯ ´Ù¸¥ À¥¼­¹öµéµµ ÀÌ·± + Ç¥ÁØ Çü½ÄÀ¸·Î ·Î±×¸¦ ¸¸µé¸ç, ¿©·¯ ·Î±× ºÐ¼® ÇÁ·Î±×·¥¿¡¼­ + ÀÐÀ» ¼ö ÀÖ´Ù. CLF·Î ¸¸µç ·Î±×ÆÄÀÏ Ç׸ñÀº ´ÙÀ½°ú °°´Ù:

    + +

    + 127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET + /apache_pb.gif HTTP/1.0" 200 2326 +

    + +

    ÀÌÁ¦ ·Î±× Ç׸ñÀÇ °¢ ºÎºÐÀ» ¼³¸íÇÑ´Ù.

    + +
    +
    127.0.0.1 (%h)
    + +
    ¼­¹ö¿¡ ¿äûÀ» ÇÑ Å¬¶óÀ̾ðÆ®(¿ø°Ý È£½ºÆ®)ÀÇ IP + ÁÖ¼ÒÀÌ´Ù. HostnameLookups°¡ + OnÀ̶ó¸é È£½ºÆ®¸íÀ» ã¾Æ¼­ IP ÁÖ¼Ò ÀÚ¸®¿¡ + ´ë½Å ¾´´Ù. ±×·¯³ª ÀÌ ¼³Á¤Àº ¼­¹ö¸¦ ¸Å¿ì ´À¸®°Ô ÇÒ ¼ö + ÀÖÀ¸¹Ç·Î ÃßõÇÏÁö ¾Ê´Â´Ù. È£½ºÆ®¸íÀ» ¾Ë·Á¸é ´ë½Å ³ªÁß¿¡ + logresolve¿Í + °°Àº ·Î±×¸¦ ó¸®ÇÏ´Â ÇÁ·Î±×·¥À» »ç¿ëÇÏ´Â °ÍÀÌ ÁÁ´Ù. + ¿©±â¿¡ ³ª¿Â IP ÁÖ¼Ò´Â »ç¿ëÀÚ°¡ »ç¿ëÇÏ´Â ÄÄÇ»ÅÍ ÁÖ¼Ò°¡ + ¾Æ´Ò ¼ö ÀÖ´Ù. ÇÁ·Ï½Ã ¼­¹ö°¡ »ç¿ëÀÚ¿Í ¼­¹ö»çÀÌ¿¡ Á¸ÀçÇÑ´Ù¸é, + ¿ø·¡ ÄÄÇ»ÅÍ ÁÖ¼Ò°¡ ¾Æ´Ï¶ó ÇÁ·Ï½ÃÀÇ ÁÖ¼Ò°¡ ±â·ÏµÉ °ÍÀÌ´Ù.
    + +
    - (%l)
    + +
    Ãâ·Â¿¡¼­ "»©±â±âÈ£"´Â ¿äûÇÑ Á¤º¸°¡ ¾øÀ½À» ³ªÅ¸³½´Ù. + ÀÌ °æ¿ì ¿©±â¿¡ ³ª¿Ã Á¤º¸´Â Ŭ¶óÀ̾ðÆ® ÄÄÇ»ÅÍÀÇ + identd°¡ Á¦°øÇÒ Å¬¶óÀ̾ðÆ®ÀÇ RFC 1413 + ½Å¿øÀÌ´Ù. ÀÌ Á¤º¸´Â ¸Å¿ì ¹ÏÀ» ¼ö ¾ø±â¶§¹®¿¡, ±ä¹ÐÈ÷ + °ü¸®µÇ´Â ³»ºÎ ³×Æ®¿÷ÀÌ ¾Æ´Ï¶ó¸é Àý´ë·Î ÀÌ Á¤º¸¸¦ »ç¿ëÇϸé + ¾ÈµÈ´Ù. IdentityCheck°¡ + OnÀÌ ¾Æ´Ï¶ó¸é ¾ÆÆÄÄ¡ À¥¼­¹ö´Â ÀÌ Á¤º¸¸¦ + ¾Ë¾Æº¸·Á°í ½ÃµµÇÏÁöµµ ¾Ê´Â´Ù.
    + +
    frank (%u)
    + +
    ÀÌ´Â HTTP ÀÎÁõÀ¸·Î ¾Ë¾Æ³½ ¹®¼­¸¦ ¿äûÇÑ »ç¿ëÀÚÀÇ + useridÀÌ´Ù. º¸Åë ÀÌ °ªÀº CGI ½ºÅ©¸³Æ®¿¡°Ô + REMOTE_USER ȯ°æº¯¼ö·Î ³Ñ°ÜÁø´Ù. ¿äûÀÇ + »óÅÂÄڵ尡 401À̶ó¸é (¾Æ·¡ Âü°í) »ç¿ëÀÚ°¡ ¾ÆÁ÷ ÀÎÁõÀ» + °ÅÄ¡Áö ¾Ê¾ÒÀ¸¹Ç·Î ÀÌ °ªÀ» ¹ÏÀ¸¸é ¾ÈµÈ´Ù. ¹®¼­¸¦ ¾ÏÈ£·Î + º¸È£ÇÏÁö ¾Ê´Â´Ù¸é ÀÌ Ç׸ñÀº ÀÌÀü Ç׸ñ°ú °°ÀÌ + "-"ÀÌ´Ù.
    + +
    [10/Oct/2000:13:55:36 -0700] + (%t)
    + +
    + ¼­¹ö°¡ ¿äû󸮸¦ ¸¶Ä£ ½Ã°£. + Çü½ÄÀº: + +

    + [day/month/year:hour:minute:second zone]
    + day = ¼ýÀÚ 2°³
    + month = ¼ýÀÚ 3°³
    + year = ¼ýÀÚ 4°³
    + hour = ¼ýÀÚ 2°³
    + minute = ¼ýÀÚ 2°³
    + second = ¼ýÀÚ 2°³
    + zone = (`+' | `-') ¼ýÀÚ 4°³
    +

    + ·Î±× Çü½Ä¹®ÀÚ¿­¿¡ %{format}t¸¦ »ç¿ëÇÏ¿© + ´Ù¸¥ Çü½ÄÀ¸·Î ½Ã°£À» Ãâ·ÂÇÒ ¼ö ÀÖ´Ù. formatÀº + C Ç¥ÁØ ¶óÀ̺귯¸®ÀÇ strftime(3)°ú °°´Ù. +
    + +
    "GET /apache_pb.gif HTTP/1.0" + (\"%r\")
    + +
    Ŭ¶óÀ̾ðÆ®ÀÇ ¿äûÁÙÀÌ ½Öµû¿ÈÇ¥·Î ¹­¿©ÀÖ´Ù. ¿äûÁÙÀº + ¸Å¿ì À¯¿ëÇÑ Á¤º¸¸¦ ´ã°í ÀÖ´Ù. ù°, Ŭ¶óÀ̾ðÆ®°¡ »ç¿ëÇÑ + ¸Þ½áµå´Â GETÀÌ´Ù. µÑ°, Ŭ¶óÀ̾ðÆ®´Â ÀÚ¿ø + /apache_pb.gif¸¦ ¿äûÇÑ´Ù. ¼¼¹ø°, Ŭ¶óÀ̾ðÆ®´Â + HTTP/1.0 ÇÁ·ÎÅäÄÝÀ» »ç¿ëÇÑ´Ù. ¿äûÁÙÀÇ + ¿©·¯ ºÎºÐÀ» µû·Î ·Î±×ÇÒ ¼öµµ ÀÖ´Ù. ¿¹¸¦ µé¾î, Çü½Ä¹®ÀÚ¿­ + "%m %U%q %H"Àº "%r"°ú ¶È°°ÀÌ + ¸Þ½áµå, °æ·Î, ÁúÀǹ®ÀÚ¿­, ÇÁ·ÎÅäÄÝÀ» ·Î±×ÇÑ´Ù.
    + +
    200 (%>s)
    + +
    ÀÌ´Â ¼­¹ö°¡ Ŭ¶óÀ̾ðÆ®¿¡°Ô º¸³»´Â »óÅÂÄÚµåÀÌ´Ù. ÀÌ + Á¤º¸´Â (2·Î ½ÃÀÛÇÏ´Â ÄÚµå) ¿äûÀÌ ¼º°øÇÏ¿´´ÂÁö, (4·Î + ½ÃÀÛÇÏ´Â ÄÚµå) Ŭ¶óÀ̾ðÆ®¿¡ ¿À·ù°¡ ÀÖ´ÂÁö, (5·Î ½ÃÀÛÇÏ´Â + ÄÚµå) ¼­¹ö¿¡ ¿À·ù°¡ ÀÖ´ÂÁö ¾Ë·ÁÁֹǷΠ¸Å¿ì Áß¿äÇÏ´Ù. + »óÅÂÄÚµåÀÇ Àüü ¸ñ·ÏÀº HTTP + ±Ô¾à (RFC2616 section 10)¿¡¼­ ãÀ» ¼ö ÀÖ´Ù.
    + +
    2326 (%b)
    + +
    ¸¶Áö¸· Ç׸ñÀº ÀÀ´ä Çì´õ¸¦ Á¦¿ÜÇÏ°í Ŭ¶óÀ̾ðÆ®¿¡°Ô + º¸³»´Â ³»¿ëÀÇ Å©±â¸¦ ³ªÅ¸³½´Ù. Ŭ¶óÀ̾ðÆ®¿¡°Ô º¸³»´Â + ³»¿ëÀÌ ¾ø´Ù¸é ÀÌ °ªÀº "-"ÀÌ´Ù. ³»¿ëÀÌ + ¾ø´Â °æ¿ì "0"À» ·Î±×ÇÏ·Á¸é ´ë½Å + %B¸¦ »ç¿ëÇÑ´Ù.
    +
    + + +

    Combined ·Î±× Çü½Ä

    + + +

    ÀÚÁÖ »ç¿ëµÇ´Â ´Ù¸¥ Çü½Ä¹®ÀÚ¿­Àº °áÇյȷα×Çü½Ä(Combined + Log Format)ÀÌ´Ù. ´ÙÀ½°ú °°ÀÌ »ç¿ëÇÑ´Ù.

    + +

    + LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" + \"%{User-agent}i\"" combined
    + CustomLog log/access_log combined +

    + +

    ÀÌ Çü½ÄÀº µÎ Ç׸ñÀ» ´õ Ãß°¡ÇÑ °ÍÀ» Á¦¿ÜÇÏ°í´Â Common + ·Î±× Çü½Ä°ú ¿ÏÀüÈ÷ °°´Ù. Ãß°¡µÈ Ç׸ñµéÀº ÆÛ¼¾Æ® Áö½Ã¾î + %{header}i¸¦ »ç¿ëÇÑ´Ù. ¿©±â¼­ + header ÀÚ¸®¿¡ HTTP ¿äû Çì´õ À̸§ÀÌ ³ª¿Ã ¼ö + ÀÖ´Ù. ÀÌ Çü½ÄÀÇ Á¢±Ù ·Î±×´Â ´ÙÀ½°ú °°´Ù:

    + +

    + 127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET + /apache_pb.gif HTTP/1.0" 200 2326 + "http://www.example.com/start.html" "Mozilla/4.08 [en] + (Win98; I ;Nav)" +

    + +

    Ãß°¡µÈ Ç׸ñÀº:

    + +
    +
    "http://www.example.com/start.html" + (\"%{Referer}i\")
    + +
    "Referer" (¸ÂÃã¹ý Ʋ¸®Áö¾Ê¾ÒÀ½) HTTP ¿äû Çì´õ. + Ŭ¶óÀ̾ðÆ®°¡ ÂüÁ¶Çß´Ù°í ¼­¹ö¿¡°Ô ¾Ë¸° »çÀÌÆ®ÀÌ´Ù. + (Áï, /apache_pb.gif¸¦ ¸µÅ©ÇÏ¿´°Å³ª Æ÷ÇÔÇÑ + »çÀÌÆ®ÀÌ´Ù.)
    + +
    "Mozilla/4.08 [en] (Win98; I ;Nav)" + (\"%{User-agent}i\")
    + +
    User-Agent HTTP ¿äû Çì´õ. Ŭ¶óÀ̾ðÆ® ºê¶ó¿ìÀú°¡ + Àڽſ¡ ´ëÇØ ¾Ë¸®´Â ½Äº°Á¤º¸ÀÌ´Ù.
    +
    + + +

    ¿©·¯ Á¢±Ù ·Î±×

    + + +

    ¼³Á¤ÆÄÀÏ¿¡ ¿©·¯ CustomLog Áö½Ã¾î¸¦ + »ç¿ëÇϸé Á¢±Ù ·Î±×°¡ ¿©·¯°³ ¸¸µé¾îÁø´Ù. ¿¹¸¦ µé¾î, ´ÙÀ½ + ¼³Á¤Àº ¼¼°¡Áö Á¢±Ù ·Î±×¸¦ ¸¸µç´Ù. ù¹ø°´Â ±âº» CLF Á¤º¸¸¦ + ±â·ÏÇÏ°í, µÎ¹ø°¿Í ¼¼¹ø°´Â referer¿Í ºê¶ó¿ìÀú Á¤º¸¸¦ + ±â·ÏÇÑ´Ù. ¸¶Áö¸· µÎ CustomLog ÁÙÀº ¾î¶»°Ô + ÀÌÀü ReferLog¿Í AgentLog Áö½Ã¾îÀÇ + ±â´ÉÀ» Èä³»³¾ ¼ö ÀÖ´ÂÁö º¸¿©ÁØ´Ù.

    + +

    + LogFormat "%h %l %u %t \"%r\" %>s %b" common
    + CustomLog logs/access_log common
    + CustomLog logs/referer_log "%{Referer}i -> %U"
    + CustomLog logs/agent_log "%{User-agent}i" +

    + +

    ¶Ç, ÀÌ ¿¹´Â LogFormatÀ¸·Î ¹Ýµå½Ã + º°¸íÀ» Á¤ÀÇÇÒ ÇÊ¿ä´Â ¾øÀ½À» º¸¿©ÁØ´Ù. ´ë½Å CustomLog Áö½Ã¾î¿¡ + Á÷Á¢ ·Î±× Çü½ÄÀ» ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù.

    + + +

    Á¶°ÇºÎ ·Î±×

    + + +

    Ŭ¶óÀ̾ðÆ® ¿äûÀÇ ¼º°Ý¿¡ µû¶ó ÇØ´ç Ç׸ñÀ» Á¢±Ù ·Î±×¿¡ + ±â·ÏÇÏÁö¾Ê°í ½ÍÀ» ¶§°¡ ÀÖ´Ù. ȯ°æº¯¼ö¸¦ + »ç¿ëÇÏ¸é ½±°Ô ÇØ°áµÈ´Ù. ¸ÕÀú, Ŭ¶óÀ̾ðÆ®°¡ ƯÁ¤ Á¶°ÇÀ» + ¸¸Á·Çϸé ȯ°æº¯¼ö¸¦ ¼³Á¤ÇÑ´Ù. ÀÌ ÀÛ¾÷¿¡´Â º¸Åë SetEnvIf¸¦ »ç¿ëÇÑ´Ù. + ±×¸®°í CustomLog + Áö½Ã¾î¿¡ env=À» »ç¿ëÇÏ¿© ȯ°æº¯¼ö À¯¹«¿¡ + µû¶ó ¿äûÀ» Áý¾î³Ö°Å³ª »«´Ù. ¿¹¸¦ µé¸é:

    + +

    + # loop-back ÀÎÅÍÆäÀ̽º¿¡¼­ ¿äûÀ» Ç¥½ÃÇÑ´Ù
    + SetEnvIf Remote_Addr "127\.0\.0\.1" dontlog
    + # robots.txt ÆÄÀÏ¿¡ ´ëÇÑ ¿äûÀ» Ç¥½ÃÇÑ´Ù
    + SetEnvIf Request_URI "^/robots\.txt$" dontlog
    + # ³ª¸ÓÁö¸¦ ·Î±×¿¡ ³²±ä´Ù
    + CustomLog logs/access_log common env=!dontlog +

    + +

    ´Ù¸¥ ¿¹·Î ¿µ¾î±Ç »ç¿ëÀÚÀÇ ¿äû¸¸À» ÇÑ ·Î±×ÆÄÀÏ¿¡ ±â·ÏÇÏ°í, + ºñ¿µ¾î±Ç »ç¿ëÀÚÀÇ ¿äûÀº ´Ù¸¥ ·Î±×ÆÄÀÏ¿¡ ±â·ÏÇÏ´Â °æ¿ì¸¦ + »ý°¢Çغ¸ÀÚ.

    + +

    + SetEnvIf Accept-Language "en" english
    + CustomLog logs/english_log common env=english
    + CustomLog logs/non_english_log common env=!english +

    + +

    Á¶°ÇºÎ ·Î±×´Â ¸Å¿ì °­·ÂÇÏ°í À¯¿¬ÇÏÁö¸¸, ÀÌ°ÍÀÌ ·Î±× + ³»¿ëÀ» Á¶ÀýÇÏ´Â À¯ÀÏÇÑ ¹æ¹ýÀº ¾Æ´Ï´Ù. ·Î±×ÆÄÀÏÀº ¼­¹öÀÇ + ¸ðµç ÇൿÀ» ±â·ÏÇÒ¶§ ´õ À¯¿ëÇÏ´Ù. ³ªÁß¿¡ ¿øÇÏÁö¾Ê´Â ¿äûÀ» + Á¦¿ÜÇÏ°í ·Î±×ÆÄÀÏÀ» ºÐ¼®ÇÏ´Â °ÍÀÌ ´õ ½±´Ù.

    + +
    top
    +
    +

    ·Î±× ¼øȯ (Log Rotation)

    + + +

    Á¶±Ý ¹Ù»Û ¼­¹öÁ¶Â÷µµ ·Î±×ÆÄÀÏ¿¡ ÀúÀåµÇ´Â Á¤º¸·®Àº ¸Å¿ì + ¸¹´Ù. Á¢¼Ó ·Î±×´Â º¸Åë ¸¸¹ø ¿äû´ç 1MB ÀÌ»ó Áõ°¡ÇÑ´Ù. °á°úÀûÀ¸·Î + ±âÁ¸ÀÇ ·Î±×¸¦ ¿Å±â°Å³ª Áö¿ì´Â ¹æ¹ýÀ¸·Î ·Î±×¸¦ ÁÖ±âÀûÀ¸·Î + ¼øÈ°ÇÒ ÇÊ¿ä°¡ ÀÖ´Ù. ¾ÆÆÄÄ¡´Â ÆÄÀÏÀ» ¿­°íÀÖ´Â µ¿¾È¿¡´Â °è¼Ó + ÀÌÀü ·Î±×ÆÄÀÏ¿¡ ¾²±â¶§¹®¿¡ ¼­¹ö°¡ ½ÇÇàÁßÀ϶§ ·Î±×¸¦ ¼øȯÇÒ + ¼ö ¾ø´Ù. ´ë½Å ·Î±×ÆÄÀÏÀ» ¿Å±â°Å³ª Áö¿îÈÄ ¼­¹ö¸¦ Àç½ÃÀÛÇÏ¿©, ·Î±×ÆÄÀÏÀ» »õ·Î ¿­¾î¾ß + ÇÑ´Ù.

    + +

    Á¡ÀÝÀº Àç½ÃÀÛÀ» »ç¿ëÇÏ¸é ¼­¹ö´Â Ŭ¶óÀ̾ðÆ®¿Í + ±âÁ¸ÀÇ È¤Àº ´ë±âµÈ ¿¬°áÀ» ÀÒÁö¾Ê°í »õ ·Î±×ÆÄÀÏÀ» ¿­ ¼ö ÀÖ´Ù. + ±×·¯³ª À̸¦ À§ÇØ ¼­¹ö´Â ¿À·¡µÈ ¿äûÀÇ ¼­ºñ½º¸¦ ³¡³»´Â µ¿¾È + ÀÌÀü ·Î±×ÆÄÀÏÀ» °è¼Ó »ç¿ëÇØ¾ß ÇÑ´Ù. ±×·¯¹Ç·Î Àç½ÃÀÛÇÑÈÄ + ·Î±×ÆÄÀÏÀ» ó¸®Çϱâ Àü¿¡ ¾ó¸¶°£ ±â´Ù¸± ÇÊ¿ä°¡ ÀÖ´Ù. ÀϹÝÀûÀ¸·Î + ´ÙÀ½°ú °°ÀÌ ·Î±×¸¦ ¼øȯÇÏ°í, µð½ºÅ©°ø°£À» Àý¾àÇϱâÀ§ÇØ ÀÌÀü + ·Î±×¸¦ ¾ÐÃàÇÑ´Ù:

    + +

    + mv access_log access_log.old
    + mv error_log error_log.old
    + apachectl graceful
    + sleep 600
    + gzip access_log.old error_log.old +

    + +

    ·Î±×¸¦ ¼øȯÇÏ´Â ´Ù¸¥ ¹æ¹ýÀº ´ÙÀ½ Àý¿¡¼­ ¼³¸íÇÒ ÆÄÀÌÇÁ ·Î±×¸¦ »ç¿ëÇÏ´Â °ÍÀÌ´Ù.

    +
    top
    +
    +

    ·Î±×¸¦ ÆÄÀÌÇÁ·Î º¸³»±â

    + + +

    ¾ÆÆÄÄ¡ À¥¼­¹ö´Â ¿À·ù ·Î±×¿Í Á¢±Ù ·Î±×¸¦ ÆÄÀÏ¿¡ Á÷Á¢ + ¾²Áö¾Ê°í ÆÄÀÌÇÁ¸¦ ÅëÇØ ´Ù¸¥ ÇÁ·Î¼¼½º·Î º¸³¾ ¼ö ÀÖ´Ù. ÀÌ + ±â´ÉÀ» »ç¿ëÇÏ¸é ¼­¹ö¿¡ Äڵ带 Ãß°¡ÇÏÁö¾Ê°íµµ ¸Å¿ì À¯¿¬ÇÏ°Ô + ·Î±×¸¦ ó¸®ÇÒ ¼ö ÀÖ´Ù. ·Î±×¸¦ ÆÄÀÌÇÁ¿¡ ¾²±âÀ§ÇØ ÆÄÀϸí + ÀÚ¸®¿¡ ÆÄÀÌÇÁ¹®ÀÚ "|"¿Í µÚ¿¡ Ç¥ÁØÀÔ·ÂÀ¸·Î + ·Î±× Ç׸ñÀ» ÀÐÀ» ½ÇÇàÆÄÀϸíÀ» ÀûÀ¸¸é µÈ´Ù. ¾ÆÆÄÄ¡´Â ¼­¹ö°¡ + ½ÃÀÛÇÒ¶§ ÆÄÀÌÇÁ·Î ¿¬°áÇÒ ·Î±× ÇÁ·Î¼¼½º¸¦ ½ÃÀÛÇÏ°í, ¼­¹ö°¡ + ½ÇÇàµÇ´Â µ¿¾È ÇÁ·Î¼¼½º°¡ Á×À¸¸é ´Ù½Ã ½ÃÀÛÇÑ´Ù. (ÀÌ ¸¶Áö¸· + ±â´É¶§¹®¿¡ ¿ì¸®´Â ÀÌ ¹æ¹ýÀ» "¹ÏÀ» ¼ö ÀÖ´Â ÆÄÀÌÇÁ ·Î±×"¶ó°í + ºÎ¸¥´Ù.)

    + +

    ÆÄÀÌÇÁ·Î ¿¬°áµÈ ·Î±× ÇÁ·Î¼¼½º´Â ºÎ¸ð ¾ÆÆÄÄ¡ httpd ÇÁ·Î¼¼½º°¡ + ¶ç¿ì°í, ÇÁ·Î¼¼½ºÀÇ useridµµ °°´Ù. Áï, ÆÄÀÌÇÁ·Î ¿¬°áµÈ ·Î±× + ÇÁ·Î±×·¥Àº º¸Åë root·Î ½ÇÇàµÈ´Ù. ±×·¯¹Ç·Î ÇÁ·Î±×·¥À» °£´ÜÇÏ°í + ¾ÈÀüÇÏ°Ô ¸¸µå´Â °ÍÀÌ ¸Å¿ì Áß¿äÇÏ´Ù.

    + +

    ÆÄÀÌÇÁ·Î ºÎ¸£´Â Àüü ¸í·É¾î¸¦ µû¿ÈÇ¥·Î ¹­À½À» ¸í½ÉÇ϶ó. + ÀÌ ¿¹´Â Á¢±Ù ·Î±×¿¡ ´ëÇÑ °ÍÀÌÁö¸¸, ¿À·ù ·Î±×µµ ¸¶Âù°¡Áö´Ù.

    + +

    ¼­¹ö¸¦ Àç½ÃÀÛÇÏÁö¾Ê°í ·Î±×¸¦ ¼øȯÇÒ ¼ö ÀÖ´Â °ÍÀÌ ÆÄÀÌÇÁ + ·Î±×¸¦ »ç¿ëÇÏ´Â Áß¿äÇÑ ÀÌÀ¯´Ù. ¾ÆÆÄÄ¡ À¥¼­¹ö´Â À̸¦ À§ÇØ + rotatelogs¶ó´Â °£´ÜÇÑ + ÇÁ·Î±×·¥À» Æ÷ÇÔÇÑ´Ù. ¿¹¸¦ µé¾î 24½Ã°£¸¶´Ù ·Î±×¸¦ ¼øȯÇÑ´Ù¸é:

    + +

    + CustomLog "|/usr/local/apache/bin/rotatelogs + /var/log/access_log 86400" common +

    + +

    ´Ù¸¥ »çÀÌÆ®¿¡ cronolog¶ó´Â ºñ½ÁÇÏÁö¸¸ + ÈξÀ ´õ À¯¿¬ÇÑ ·Î±× ¼øȯ ÇÁ·Î±×·¥ÀÌ ÀÖ´Ù.

    + +

    Á¶°ÇºÎ ·Î±×¿Í °°ÀÌ ÆÄÀÌÇÁ ·Î±×´Â ¸Å¿ì °­·ÂÇÑ µµ±¸Áö¸¸, + ³ªÁß¿¡ ó¸®ÇÏ´Â µîÀÇ ´õ °£´ÜÇÑ ¹æ¹ýÀÌ °¡´ÉÇÑ °æ¿ì »ç¿ëÇؼ­´Â + ¾ÈµÈ´Ù.

    +
    top
    +
    +

    °¡»óÈ£½ºÆ®

    + + +

    ¸¹Àº °¡»óÈ£½ºÆ®°¡ ÀÖ´Â ¼­¹ö¸¦ + ¿î¿µÇÒ¶§ ¿©·¯°¡Áö ¹æ¹ýÀ¸·Î ·Î±×ÆÄÀÏÀ» ´Ù·ê ¼ö ÀÖ´Ù. ¸ÕÀú, + È£½ºÆ®°¡ ÇÑ°³ÀÎ ¼­¹ö¿Í °°ÀÌ ·Î±×¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. <VirtualHost> ¼½¼ÇÀÌ + ¾Æ´Ñ ÁÖ¼­¹ö ¼³Á¤¿¡ ·Î±× Áö½Ã¾î¸¦ µÎ¸é ¸ðµç ¿äûÀÌ °°Àº Á¢±Ù + ·Î±×¿Í ¿À·ù ·Î±×·Î ±â·ÏµÈ´Ù. ÀÌ ¹æ¹ýÀº °¡»óÈ£½ºÆ®º°·Î ½±°Ô + Åë°è󸮸¦ ÇÒ ¼ö ¾ø´Ù.

    + +

    <VirtualHost> + ¼½¼Ç ¾È¿¡ CustomLog³ª + ErrorLog Áö½Ã¾î¸¦ + »ç¿ëÇϸé ÇØ´ç °¡»óÈ£½ºÆ®¿¡ ´ëÇÑ ¿äû°ú ¿À·ù¸¸ÀÌ ÁöÁ¤µÈ + ÆÄÀÏ¿¡ ±â·ÏµÈ´Ù. ·Î±× Áö½Ã¾î°¡ ¾ø´Â ´Ù¸¥ °¡»óÈ£½ºÆ®´Â °è¼Ó + ÁÖ¼­¹ö ·Î±×¿¡ ·Î±×¸¦ ±â·ÏÇÑ´Ù. ÀÌ ¹æ¹ýÀº °¡»óÈ£½ºÆ® °³¼ö°¡ + ÀûÀ» °æ¿ì ¸Å¿ì À¯¿ëÇÏÁö¸¸, È£½ºÆ® ¼ö°¡ ¸¹´Ù¸é °ü¸®Çϱâ + Èûµé¾îÁø´Ù. ¶Ç, ÆÄÀϱâ¼úÀÚ°¡ + ºÎÁ·ÇÑ ¹®Á¦°¡ ÀÚÁÖ ¹ß»ýÇÑ´Ù.

    + +

    Á¢±Ù ·Î±×ÀÇ °æ¿ì ¸Å¿ì ÁÁÀº ÇØ°áÃ¥ÀÌ ÀÖ´Ù. ·Î±× Çü½Ä¹®ÀÚ¿­¿¡ + °¡»óÈ£½ºÆ®¿¡ ´ëÇÑ Á¤º¸¸¦ Ãß°¡ÇÏ¸é ¸ðµç È£½ºÆ®°¡ °°Àº ·Î±×¸¦ + »ç¿ëÇÏ°í, ³ªÁß¿¡ ·Î±×¸¦ °¡»óÈ£½ºÆ®º°·Î ³ª´­ ¼ö ÀÖ´Ù. ¿¹¸¦ + µé¾î, ´ÙÀ½ Áö½Ã¾î¸¦ ºÁ¶ó.

    + +

    + LogFormat "%v %l %u %t \"%r\" %>s %b" + comonvhost
    + CustomLog logs/access_log comonvhost +

    + +

    %v´Â ¿äûÀ» ¼­ºñ½ºÇÏ´Â °¡»óÈ£½ºÆ® À̸§À» + ±â·ÏÇÑ´Ù. ³ªÁß¿¡ split-logfile + °°Àº ÇÁ·Î±×·¥À¸·Î Á¢±Ù ·Î±×¸¦ °¡»óÈ£½ºº°·Î ³ª´­ ¼ö ÀÖ´Ù.

    +
    top
    +
    +

    ´Ù¸¥ ·Î±×ÆÄÀÏ

    + + + + +

    PID ÆÄÀÏ

    + + +

    ¾ÆÆÄÄ¡ À¥¼­¹ö´Â ½ÃÀÛÇÒ¶§ logs/httpd.pid + ÆÄÀÏ¿¡ ºÎ¸ð httpd ÇÁ·Î¼¼½ºÀÇ process id¸¦ ÀúÀåÇÑ´Ù. ÀÌ + ÆÄÀϸíÀº PidFile + Áö½Ã¾î·Î º¯°æÇÒ ¼ö ÀÖ´Ù. process-id´Â °ü¸®ÀÚ°¡ ºÎ¸ð ÇÁ·Î¼¼½º¿¡ + ½Ã±×³ÎÀ» º¸³» ¼­¹ö¸¦ Àç½ÃÀÛÇϰųª Á×À϶§ »ç¿ëÇÑ´Ù. + À©µµ¿ìÁî¿¡¼­´Â ´ë½Å -k ¸í·ÉÇà¿É¼ÇÀ» »ç¿ëÇÑ´Ù. ´õ ÀÚ¼¼ÇÑ + Á¤º¸´Â Áß´Ü°ú Àç½ÃÀÛ ÆäÀÌÁö¸¦ + Âü°íÇ϶ó.

    + + +

    ½ºÅ©¸³Æ® ·Î±×

    + + +

    µð¹ö±ëÀ» µ½±âÀ§ÇØ ScriptLog Áö½Ã¾î¸¦ »ç¿ëÇÏ¿© + CGI ½ºÅ©¸³Æ®ÀÇ ÀԷ°ú Ãâ·ÂÀ» ±â·ÏÇÒ ¼ö ÀÖ´Ù. ÀÌ Áö½Ã¾î´Â + ¿ÀÁ÷ Å×½ºÆ®¿ëÀ¸·Î¸¸ »ç¿ëÇØ¾ß ÇÑ´Ù. ½ÇÁ¦ »ç¿ëÇÏ´Â ¼­¹ö¿¡¼­ + »ç¿ëÇÏ¸é ¾ÈµÈ´Ù. ´õ ÀÚ¼¼ÇÑ Á¤º¸´Â mod_cgi ¹®¼­¸¦ Âü°íÇ϶ó.

    + + +

    ÀçÀÛ¼º ·Î±×

    + + +

    mod_rewriteÀÇ °­·ÂÇÏ°í + º¹ÀâÇÑ ±â´ÉÀ» »ç¿ëÇÑ´Ù¸é µð¹ö±ëÀ» À§ÇØ °ÅÀÇ Ç×»ó RewriteLog¸¦ »ç¿ëÇÒ ÇÊ¿ä°¡ + ÀÖ´Ù. ÀÌ ·Î±×ÆÄÀÏÀº ÀçÀÛ¼º ¿£ÁøÀÌ ¾î¶»°Ô ¿äûÀ» º¯È¯ÇÏ´ÂÁö¿¡ + ´ëÇØ ÀÚ¼¼È÷ ¾Ë·ÁÁØ´Ù. ÀÚ¼¼ÇÑ Á¤µµ´Â RewriteLogLevel Áö½Ã¾î·Î + Á¶ÀýÇÑ´Ù.

    + +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/logs.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/logs.html.tr.utf8 new file mode 100644 index 00000000..46cea7f3 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/logs.html.tr.utf8 @@ -0,0 +1,557 @@ + + + +Günlük Dosyaları - Apache HTTP Sunucusu + + + + + +
    <-
    +

    Günlük Dosyaları

    +
    +

    Mevcut Diller:  en  | + es  | + ja  | + ko  | + tr 

    +
    + +

    Bir HTTP sunucusunu verimli şekilde yönetebilmek için oluşabilecek + sorunlardan başka sunucunun başarımı ve etkinliği hakkında da bazı geri + bildirimler almak gerekir. Apache HTTP Sunucusu çok kapsamlı ve esnek + bir günlükleme yeteneğine sahiptir. Bu belgede sunucunun günlükleme + yeteneğini nasıl yapılandıracağınızdan ve günlük kayıtlarını nasıl + yorumlayacağınızdan bahsedilecektir.

    +
    + +
    top
    +
    +

    Güvenlik Uyarısı

    + + +

    Apache’nin günlük dosyalarını yazdığı dizine yazabilen birinin sunucuyu + başlatan kullanıcı kimliğine (bu genellikle root olur) erişim + kazanabileceğine hemen hemen kesin gözüyle bakılabilir. Sonuçlarının + neler olacağını kestiremiyorsanız günlüklerin yazıldığı dizinde hiç + kimseye yazma erişimi vermeyin; ayrıntılı bilgi için güvenlik ipuçları belgesine + bakınız.

    + +

    Buna ilaveten, günlük dosyaları istemci tarafından sağlanmış bilgiler + de içerebilir. Bu nedenle, kötü niyetli istemcilerin günlük dosyalarına + denetim karakterleri girmeleri olasılığına karşı ham günlükler ele + alınırken dikkatli olunmalıdır.

    +
    top
    +
    +

    Hata Günlüğü

    + + + + +

    İsmi ve yeri ErrorLog yönergesi + ile belirtilen sunucu hata günlüğü, en önemli günlük dosyasıdır. Apache + httpd tarafından istekler işlenirken saptanan hatalar ve tanı bilgileri + bu dosyaya gönderilir. Sunucuyu başlatırken veya sunucu çalışırken bir + sorunla karşılaşıldığında, neyin yanlış gittiğini öğrenmek için + bakılacak ilk yer burasıdır. Günlük kaydı çoğunlukla sorunun nasıl + düzeltileceği ile ilgili ayrıntıları da içerir.

    + +

    Hata günlüğü normal olarak bir dosyaya yazılır (genellikle, dosyanın + ismi Unix sistemlerinde error_log, Windows ve OS/2’de ise + error.log’dur). Ayrıca, Unix sistemlerinde sunucunun + hataları syslog’a veya borulamak suretiyle + bir programa aktarması da mümkündür.

    + +

    Hata günlüğünün biçemi anlaşılır olup içeriği kısmen serbestçe + belirlenir. Çoğu hata günlüğü girdisinde bulunan belli başlı bilgiler + vardır. Örnek tipik bir hata iletisi içermektedir:

    + +

    + [Wed Oct 11 14:32:52 2000] [error] [client 127.0.0.1] + client denied by server configuration: + /export/home/live/ap/htdocs/test +

    + +

    Günlük girdisinin ilk öğesi iletinin yazıldığı tarih ve saatten oluşur. + İkinci öğe raponlanan bilginin önem derecesini belirtir. Hata günlüğüne + gönderilecek hata türlerinin önem seviyesini belirlemek için LogLevel yönergesi kullanılır. Üçüncü öğe + hatanın üretilmesine sebep olan istemcinin IP adresini içerir. Kalanı + iletinin kendisidir (duruma bakılırsa sunucu istemci erişimini reddetmek + üzere yapılandırılmış). Sunucu istenen belgenin (belge yolunu değil) + dosya sistemindeki yolunu raporlamıştır.

    + +

    Hata günlüğünde görünebilecek ileti çeşitliliği oldukça fazladır. Çoğu + yukarıdaki örneğin benzeridir. Hata günlüğü ayrıca, CGI betiklerinin + hata ayıklama çıktılarını da içerir. Bir CGI betiği tarafından standart + hataya (stderr) yazılan her türlü bilgi doğrudan hata + günlüğüne kopyalanır.

    + +

    Hata günlüğünü bilgi ekleyerek veya kaldırarak kişiselleştirmek + mümkündür. Bununla birlikte, hata günlüğü girdilerinin ilgili olduğu + isteklerin erişim günlüğünde de girdileri + vardır. Örneğin, yukarıdaki girdi, erişim günlüğünde 403 durum kodlu bir + girdiyle ilgilidir. Erişim günlüğünü de kişiselleştirmek mümkün + olduğundan hata durumlarında bu günlük dosyasını da kullanarak daha + fazla bilgi sağlayabilirsiniz.

    + +

    Sunucuyu denerken olası sorunlara karşı hata günlüğünü sürekli + izlemelisiniz. Unix sistemlerinde bunu şöyle bir komutla + sağlayabilirsiniz:

    + +

    + tail -f error_log +

    +
    top
    +
    +

    Erişim Günlüğü

    + + + + +

    Sunucu erişim günlüğü sunucu tarafından işleme alınan tüm istekleri + kaydeder. Erişim günlüğünün yeri ve içeriği CustomLog yönergesi ile belirlenir. + LogFormat yönergesi ile + günlük içeriğini kişiselleştirmek mümkündür. Bu bölümde sunucunun + bilgileri erişim günlüğüne kaydetmesi için nasıl yapılandırılacağından + bahsedilecektir.

    + +

    Şüphesiz, bilginin erişim günlüğünde saklanması günlük yönetiminde ilk + adımı oluşturur. Sonraki adım yararlı istatistikleri üretmek için bu + bilgiyi incelemektir. Günlük incelemesi bu belgenin kapsamına dahil + değildir ve aslında bu işlem sunucunun yaptığı işlerden biri değildir. + Bu konu ve günlük incelemesi yapan uygulamalar hakkında daha ayrıntılı + bilgi edinmek için dmoz.org veya Yahoo’ya bakınız.

    + +

    Apache httpd’nin çeşitli sürümlerinde erişim günlüklerini denetlemek + için kullanılan diğer modüller ve yönergeler arasında mod_log_referer, + mod_log_agent modülleri ve TransferLog yönergesi + sayılabilir. Artık, daha eski tüm diğer yönergelerin işlevselliklerini + bir araya toplayan CustomLog yönergesi kullanılmaktadır.

    + +

    Erişim günlüğünün girdi biçemi kolayca isteğe göre + düzenlenebilmektedir. Biçemi belirtmekte kullanılan biçem dizgesi, C + tarzı printf(1) biçem dizgesini andırır. Sonraki bölümlerde bazı + örneklere yer verilmiştir. Biçem dizgesini oluşturan belirteçlerin tam + listesi için mod_log_config belgesinin Günlük Girdilerinin + Kişiselleştirilmesi bölümüne bakınız.

    + +

    Ortak Günlük Biçemi (OGB)

    + + +

    Erişim günlüğü için sıklıkla kullanılan bir yapılandırma:

    + +

    + LogFormat "%h %l %u %t \"%r\" %>s %b" common
    + CustomLog logs/access_log common +

    + +

    İlk satırda belli bir biçem dizgesi için common diye bir + takma ad tanımlanmaktadır. Biçem dizgesi, sunucuya hangi + belli bir bilgi parçalarını günlükleyeceğini söyleyen % imli biçem + belirteçlerinden oluşur. Biçem dizgesine ayrıca dizgesel sabitler de + yerleştirilebilir ve bunlar erişim günlüğüne oldukları gibi + kopyalanırlar. Biçem dizgesi içinde çift tırnak karakteri (") biçem + dizgesini vaktinden önce sonlandırmaması için ters bölü çizgisi ile + öncelenmelidir. Biçem dizgesi ayrıca, satır sonlarını belirtmek için + "\n" ve sekmeleri belirtmek için "\t" + denetim karakterlerini de içerebilir.

    + +

    CustomLog yönergesi + evvelce tanımlanmış bir takma adı kullanarak yeni bir günlük + dosyası tanımlar. Erişim günlüğünün dosya ismi bölü çizgisi ile + başlamadıkça dosya yolunun ServerRoot değerine göreli olduğu varsayılır.

    + +

    Yukarıdaki yapılandırma günlük dosyasına girdileri Ortak Günlük + Biçemi (Common Log Format) adı verilen standart biçemde yazar. + Bu standart biçem başka HTTP sunucuları tarafından da kullanılır ve + çoğu günlük inceleme yazılımı tarafından tanınır. Ortak Günlük + Biçeminde üretilen günlük girdileri şöyle görünür:

    + +

    + 127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET + /apache_pb.gif HTTP/1.0" 200 2326 +

    + +

    Bu günlük girdisini parça parça açıklayalım:

    + +
    +
    127.0.0.1 (%h)
    + +
    Bu, sunucuya istek yapan istemcinin (uzak konağın) IP adresidir. + Eğer HostnameLookups + yönergesine On değeri atanmışsa sunucu bu IP adresi + için DNS sorgusu yapacak ve IP adresi yerine bulduğu konak ismini + yazmaya çalışacaktır. Bununla birlikte, bu işlem sunucuyu epeyce + yavaşlattığından önerilmemektedir. Konak isimlerini saptamak için en + iyisi günlük girdilerini logresolve gibi bir + günlük işlemcisinden geçirmektir. Burada raporlanan IP adresi + doğrudan istemcinin IP adresi olmayabilir. Eğer sunucu ile istemci + arasında bir vekil sunucu varsa bu IP adresi, vekil sunucunun IP + adresi olacaktır.
    + +
    - (%l)
    + +
    Çıktıdaki bir "tire" imi istenen bilgi parçasının mevcut olmadığı + anlamına gelir. Bu durumda, mevcut olmayan bilgi istemci makine + üzerinde identd tarafından belirlenen istemcinin RFC + 1413 kimliğidir. Bu bilgi oldukça güvenilmezdir ve sıkıca denetlenen + iç ağlar haricinde hemen hemen asla kullanılmamalıdır. Apache, + IdentityCheck yönergesine + On değeri atanmış olmadıkça bu bilgiyi saptamaya + uğraşmaz.
    + +
    frank (%u)
    + +
    Bu, belge isteğinde bulunan kişinin HTTP kimlik doğrulamasıyla + saptanan kullanıcı kimliğidir. Bu değer CGI betiklerine + REMOTE_USER ortam değişkeni ile sağlanır. Eğer istek + için durum kodu 401 ise (aşağıya bakınız) henüz kullanıcının kimliği + doğrulanmamış olacağından bu değere güvenilmemelidir. Eğer belge + parola korumalı değilse günlüğün bu kısmı da yukarıdaki gibi + "-" olacaktır.
    + +
    [10/Oct/2000:13:55:36 -0700] + (%t)
    + +
    İsteğin alındığı tarih ve saat. Biçemi şöyledir: + +

    + [gün/ay/yıl:saat:dakika:saniye dilim]
    + gün    = 2 hane
    + ay     = 3 harf
    + yıl    = 4 hane
    + saat   = 2 hane
    + dakika = 2 hane
    + saniye = 2 hane
    + dilim  = (`+' | `-') 4 hane
    +

    + Günlük biçem dizgesinde zaman gösterim biçemini + %{biçem}t şeklinde belirtmek de mümkündür. + Buradaki biçem dizgesi, stardart C + kütüphanesindeki strftime(3) işlevi için tanımlanmış + biçem belirteçleriyle oluşturulabilir. +
    + +
    "GET /apache_pb.gif HTTP/1.0" + (\"%r\")
    + +
    İstemciden alınan istek satırının çift tırnaklar arasında + gösterilmesi istenmiştir. İstek satırı en yararlı bilgi parçalarını + içerir. Birincisi, istemci tarafından kullanılan yöntem + GET’miş. İkinci olarak istemci + /apache_pb.gif dosyasını istemiş ve üçüncü olarak + istemci HTTP/1.0 protokolünü kullanmış. İstek satırının + bazı parçalarını bağımsız olarak da günlüklemek mümkündür. Örneğin, + "%m %U%q %H" dizgesi, yöntem, yol, sorgu dizgesi ve + protokolü kaydedecektir; bu dizge "%r" biçem + belirtecinin tek başına yaptığı işi yapar.
    + +
    200 (%>s)
    + +
    Bu, sunucunun istemciye gönderdiği durum kodudur. İsteğin + başarıyla yerine getirilip getirilmediğini gösterdiği için bu bilgi + çok değerlidir. Durum kodu 2 ile başlıyorsa istek başarıyla yerine + getirilmiştir, 3 ile başlıyorsa yönlendirilmiştir, 4 ile başlıyorsa + istemci tarafında bir hata oluşmuştur, 5 ile başlıyorsa sunucuda bir + hata oluşmuştur. Olası hata kodlarının tam listesi RFC2616 Hiper + Metin Aktarım Protokolünün 10. bölümünde bulunabilir.
    + +
    2326 (%b)
    + +
    Son parça istemciye döndürülen nesnenin yanıt başlığı hariç + uzunluğudur. Eğer istemciye bir içerik döndürülmemişse bu değer + "-" olacaktır. Bunun yerine günlüğe "0" + yazdırmak için %B belirtecini kullanınız.
    +
    + + +

    Birleşik Günlük Biçemi

    + + +

    Sıklıkla kullanılan diğer bir biçem dizgesi Birleşik Günlük Biçemi + (Combined Log Format) olup şöyle kullanılabilir:

    + +

    + LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" + \"%{User-agent}i\"" combined
    + CustomLog log/access_log combined +

    + +

    Bu biçem ilaveten 2 alan içermesi dışında Ortak Günlük Biçemi ile + aynıdır. İlave alanların ikisi de %{başlık}i + biçeminde olup buradaki başlık, HTTP isteğindeki + başlık alanlarından biridir. Bu biçemin kullanıldığı bir erişim + günlüğü girdisi şöyle olurdu:

    + +

    + 127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET + /apache_pb.gif HTTP/1.0" 200 2326 + "http://www.example.com/start.html" "Mozilla/4.08 [en] + (Win98; I ;Nav)" +

    + +

    Ek alanlar:

    + +
    +
    "http://www.example.com/start.html" + (\"%{Referer}i\")
    + +
    HTTP istek başlığı "Referer". İstemcinin raporladığı isteğin + kaynaklandığı URI. (Bu isteğin yapılmasını sağlayan bağlantıyı + içeren URL veya istek bir sayfanın bileşenleri ile ilgiliyse istenen + sayfanın URL’si olabilir.)
    + +
    "Mozilla/4.08 [en] (Win98; I ;Nav)" + (\"%{User-agent}i\")
    + +
    Tarayıcı kimliğini içeren HTTP istek başlığı. Bu istemcinin + tarayıcısının raporladığı kendi tanıtım bilgisidir.
    +
    + + +

    Çok Sayıda Erişim Günlüğü

    + + +

    Yapılandırma dosyasında çok sayıda CustomLog yönergesi kullanarak çok + sayıda erişim günlüğü kolayca oluşturulabilir. Örneğin aşağıdaki + yönergelerle 3 tane erişim günlüğü oluşturulacaktır. İlki temel OGB + bilgisini içerirken diğer ikisi isteğin kaynaklandığı yeri ve tarayıcı + kimliğini içerir. Son iki CustomLog satırı ayrıca, ReferLog ve + AgentLog yönergelerinin etkilerinin nasıl taklit + edileceğini de göstermektedir.

    + +

    + LogFormat "%h %l %u %t \"%r\" %>s %b" common
    + CustomLog logs/access_log common
    + CustomLog logs/referer_log "%{Referer}i -> %U"
    + CustomLog logs/agent_log "%{User-agent}i" +

    + +

    Bu örnek ayrıca, LogFormat yönergesi ile bir takma ad tanımlamanın şart + olmadığını da göstermektedir. Günlük biçemi doğrudan CustomLog yönergesinde + belirtilebilir.

    + + +

    Şarta Bağlı Günlükler

    + + +

    Bazı durumlarda istemcinin yaptığı isteğe bağlı olarak erişim + günlüğünde belli girdilerin dışlanması gerekebilir. Bu, ortam değişkenleri sayesinde kolayca yerine + getirilebilir. Önce isteğin belli koşulları sağladığını belirten bir + ortam değişkeni ataması yapılır. Bu işlem SetEnvIf yönergesi ile yapılır. + Sonra da, ortam değişkenine bağlı olarak isteklerin günlüğe dahil + edilip edilmeyeceği CustomLog yönergesinin + env= deyimi kullanılarak belirtilir. Bazı örnekler:

    + +

    + # yerel konaktan kaynaklanan istekleri imleyelim
    + SetEnvIf Remote_Addr "127\.0\.0\.1" kaydetme
    + # robots.txt dosyası isteklerini imleyelim
    + SetEnvIf Request_URI "^/robots\.txt$" kaydetme
    + # Kalanları günlüğe kaydedelim
    + CustomLog logs/access_log common env=!kaydetme +

    + +

    Başka bir örnek olarak, Türkçe belge isteklerini bir dosyaya diğer + dillerdeki istekleri başka bir dosyaya kaydedelim.

    + +

    + SetEnvIf Accept-Language "tr" turkce
    + CustomLog logs/turkce_log common env=turkce
    + CustomLog logs/diger_diller_log common env=!turkce +

    + +

    Şarta bağlı günlük kaydının çok esnek ve güçlü olabileceğini + göstermiş olsak da günlük içeriğini denetlemenin tek yolu bu değildir. + Günlük dosyaları sunucu etkinliğini eksiksiz olarak kaydedebildikleri + takdirde daha yararlı olurlar. Günlük dosyalarını sonradan işleme tabi + tutarak istenmeyen girdileri kaldırılmış bir kopya almak hem kolay hem + de daha yararlıdır.

    + +
    top
    +
    +

    Günlük Çevrimi

    + + +

    Yükü ağır sunucularda günlük dosyalarına kaydedilen bilginin miktarı + çok büyük boyutlara ulaşabilir. 10.000 istek içeren bir erişim günlüğü + yaklaşık 1MB yer kaplar. Etkin günlük dosyasını belirli aralıklarla + değiştirmek veya silmek gerekebilir. Apache çalışırken dosyayı sürekli + açık tuttuğu ve yazdığı için bu işlem sunucu çalışırken yapılamaz. Bu + bakımdan, günlük dosyası değiştirildikten veya silindikten sonra yeni + dosyanın açılması için sunucunun yeniden + başlatılması gerekir.

    + +

    Nazikçe yeniden başlatmak + suretiyle sunucunun, mevcut ve bekleyen bağlantıları kaybetmeden yeni + günlük dosyalarını açması sağlanabilir. Bununla birlikte, bu işlem + sırasında sunucunun eski isteklere sunumu bitirene kadar eski günlük + dosyalarına yazmaya devam edebilmesi gerekir. Bu bakımdan, yeniden + başlatmanın ardından eski günlük dosyaları üzerinde bir işlem yapmadan + önce biraz beklemek gerekir. Günlük dosyalarını döndürürken kullanılan + senaryolarda genellikle eski günlük dosyaları yer kazanmak için + sıkıştırılırlar:

    + +

    + mv access_log access_log.old
    + mv error_log error_log.old
    + apachectl graceful
    + sleep 600
    + gzip access_log.old error_log.old +

    + +

    Günlük çevrimi yapmanın başka bir yolu da sonraki bölümde açıklandığı + gibi borulu günlükler kullanmaktır.

    +
    top
    +
    +

    Borulu Günlükler

    + + +

    Apache httpd hata ve erişim günlüklerini doğrudan bir dosyaya yazmak + yerine bir boru üzerinden başka bir sürece yazabilir. Bu yetenek ana + sunucuya herhangi bir kod eklemeksizin günlükleme esnekliğini şaşırtıcı + derecede arttırır. Günlükler boruya yazılmak istenirse dosya ismini boru + karakteriyle ("|") değiştirip ardına günlük girdilerini + standart girdisinden kabul edecek programın ismini eklemek yeterlidir. + Apache sunucusu başlatıldığı zaman borulu günlük işlemini de + başlatacaktır. Eğer sunucu çalışırken günlükleri kabul eden süreç + çökerse Apache bu programı yeniden başlatır. (Bu son özelliği sebebiyle + bu tekniğe “güvenilir borulu günlükleme” adını veriyoruz.)

    + +

    Borulu günlük süreçleri ana Apache httpd süreci tarafından başlatılır + ve bu süreçler ana Apache httpd sürecinin kullanıcı kimliğini miras + alırlar. Yani borulu günlükleme programları aslında root tarafından + çalıştırılmış gibi olur. Bu bakımdan, bu programları basit ve güvenilir + kılmak çok önemlidir.

    + +

    Borulu günlüklerin önemli kullanım alanlarından biri de sunucuyu + yeniden başlatmak gerekmeksizin günlük çevrimini mümkün kılmaktır. + Apache HTTP sunucusu bu amaçla kullanılmak üzere + rotatelogs diye bir program içerir. Örneğin, + günlükleri 24 saatte bir döndürmek isterseniz bunu şöyle + yapabilirsiniz:

    + +

    + CustomLog "|/usr/local/apache/bin/rotatelogs + /var/log/access_log 86400" common +

    + +

    Borunun diğer ucundaki süreci başlatacak komutun tırnak içine + alındığına dikkat ediniz. Bu örnekler erişim günlüğü için verilmişse de + aynı teknik hata günlüğü için de kullanılabilir.

    + +

    Hariçten bir uygulama olarak cronolog isminde buna benzer ancak + çok daha esnek bir program daha vardır.

    + +

    Borulu günlükler de şarta bağlı günlükleme kadar güçlü olmakla beraber + çevrimdışı ardıl işlemler gibi daha basit çözümler için + kullanılmamalıdır.

    +
    top
    +
    +

    Sanal Konaklar

    + + +

    Bir sunucu çok sayıda sanal konak ile hizmet + sunarken bunların günlük kayıtları için çeşitli seçenekler mevcuttur. + İlk seçenekte, sanki sunucu tek bir konakla hizmet sunuyormuş gibi + günlük kaydı yapılır. Günlükleme yönergelerini <VirtualHost> bölümlerinin dışına, ana sunucu + bağlamına yerleştirerek tüm isteklerin aynı erişim ve hata günlüğüne + yazılmasını sağlamak olasıdır. Bu teknik, tek tek sanal konaklar için + kolayca istatistik toplamaya izin vermez.

    + +

    Eğer CustomLog + veya ErrorLog yönergesi bir + <VirtualHost> bölümüne + yerleştirilirse bu sanal konağa bütün erişimler veya hatalar belirtilen + dosyaya günlüklenecektir. Böyle günlükleme yönergeleri içermeyen sanal + konakların günlükleri hala ana sunucunun hata ve erişim günlüklerine + yazılmaya devam edecektir. Bu teknik az sayıda sanal konak barındıran + sunucular için çok kullanışlıdır. Fakat sanal konak sayısı çok fazlaysa + bu teknikle günlük dosyalarını yönetmek çok karmaşık bir hal alabilir. + Ayrıca, yetersiz dosya tanıtıcısı + sorunlarıyla çok sık karşılaşılabilir.

    + +

    Erişim günlükleri için çok az bir fedakarlıkla çok iyi bir çözüm vardır. + Günlük biçemine sanal konaklarla ilgili bilgi eklemek suretiyle tüm + konakların aynı günlük dosyasını kullanmaları olasıdır. Böylece günlük + dosyası sonradan her sanal konak için ayrı bir dosya oluşturmak üzere + ayrıştırılabilir. Örneğin, bu işlem için şu yönergeler kullanılıyor + olsun:

    + +

    + LogFormat "%v %l %u %t \"%r\" %>s %b" + ortaksankon
    + CustomLog logs/access_log ortaksankon +

    + +

    %v belirteci isteği sunan sanal konağın ismini günlüğe + yazmak için kullanılır. Daha sonra split-logfile gibi bir program + kullanarak, bu dosyadan her sanal konak için ayrı birer dosya elde + edilebilir.

    +
    top
    +
    +

    Diğer Günlük Dosyaları

    + + + + +

    PID Dosyası

    + + +

    Apache httpd başlatıldığında, ana httpd sürecinin kimliği (PID) + logs/httpd.pid dosyasına kaydedilir. Bu dosyanın ismi + PidFile yönergesi ile + değiştirilebilir. Bu süreç kimliği sistem yöneticisi tarafından ana + sürece sinyal göndererek artalan sürecini sonlandırmak veya yeniden + başlatmak için kullanılır. Windows üzerinde bu işlem için + -k komut satırı seçeneği kullanılır. Bu konuda daha + ayrıntılı bilgi edinmek için Durdurma ve + Yeniden Başlatma belgesine bakınız.

    + + +

    Betik Günlüğü

    + + +

    ScriptLog yönergesi CGI + betiklerinin girdi ve çıktılarını kaydetmenizi mümkün kılmak suretiyle + hata ayıklamaya yardımcı olur. Bu sadece deneysel amaçla kullanılmalı, + asıl sunucuya uygulanmamalıdır. mod_cgi + belgesinde daha fazla bilgi bulunabilir.

    + + +

    Yeniden Yazım Günlüğü

    + + +

    Güçlü ve karmaşık mod_rewrite + özellikleri kullanılırken, hata ayıklamaya yardımcı olmak için + RewriteLog yönergesini + kullanmak gerekebilir. Yönerge, günlük dosyasında yeniden yazım + motorunun istekleri nasıl dönüştürdüğüyle ilgili ayrıntılı bir döküm + üretir. Ayrıntı seviyesi RewriteLogLevel yönergesi ile belirlenir.

    + +
    +
    +

    Mevcut Diller:  en  | + es  | + ja  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/misc/custom_errordocs.html b/rubbos/app/httpd-2.0.64/docs/manual/misc/custom_errordocs.html new file mode 100644 index 00000000..23ab34ae --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/misc/custom_errordocs.html @@ -0,0 +1,5 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: custom_errordocs.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/misc/custom_errordocs.html.en b/rubbos/app/httpd-2.0.64/docs/manual/misc/custom_errordocs.html.en new file mode 100644 index 00000000..fc2ccd8e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/misc/custom_errordocs.html.en @@ -0,0 +1,577 @@ + + + +International Customized Server Error Messages - Apache HTTP Server + + + + + +
    <-
    +

    International Customized Server Error Messages

    +
    +

    Available Languages:  en 

    +
    + + +

    Warning:

    +

    This document has not been fully 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.

    +
    + +

    This document describes an easy way to provide your Apache + HTTP Server with a set of customized error messages which take + advantage of Content + Negotiation and mod_include to return + error messages generated by the server in the client's native + language.

    + +
    + +
    top
    +
    +

    Introduction

    + + + +

    By using SSI, all ErrorDocument messages + can share a homogenous and consistent style and layout, and + maintenance work (changing images, changing links) is kept to a + minimum because all layout information can be kept in a single + file.

    + +

    Error documents can be shared across different servers, or + even hosts, because all varying information is inserted at the + time the error document is returned on behalf of a failed + request.

    + +

    Content Negotiation then selects the appropriate language + version of a particular error message text, honoring the + language preferences passed in the client's request. (Users + usually select their favorite languages in the preferences + options menu of today's browsers). When an error document in + the client's primary language version is unavailable, the + secondary languages are tried or a default (fallback) version + is used.

    + +

    You have full flexibility in designing your error documents + to your personal taste (or your company's conventions). For + demonstration purposes, we present a simple generic error + document scheme. For this hypothetic server, we assume that all + error messages...

    + +
      +
    • possibly are served by different virtual hosts (different + host name, different IP address, or different port) on the + server machine,
    • + +
    • show a predefined company logo in the right top of the + message (selectable by virtual host),
    • + +
    • print the error title first, followed by an explanatory + text and (depending on the error context) help on how to + resolve the error,
    • + +
    • have some kind of standardized background image,
    • + +
    • display an apache logo and a feedback email address at + the bottom of the error message.
    • +
    + +

    An example of a "document not found" message for a german + client might look like this:

    + +

    [Needs graphics capability to display]

    + +

    All links in the document as well as links to the server's + administrator mail address, and even the name and port of the + serving virtual host are inserted in the error document at + "run-time", i.e., when the error actually occurs.

    +
    top
    +
    +

    Creating an ErrorDocument directory

    + + + +

    For this concept to work as easily as possible, we must take + advantage of as much server support as we can get:

    + +
      +
    1. By defining the MultiViews Options, we + enable the language selection of the most appropriate + language alternative (content negotiation).
    2. + +
    3. By setting the LanguagePriority + directive we define a set of default fallback languages in + the situation where the client's browser did not express any + preference at all.
    4. + +
    5. By enabling mod_include + (and disallowing execution of cgi scripts for + security reasons), we allow the server to include building + blocks of the error message, and to substitute the value of + certain environment variables into the generated document + (dynamic HTML) or even to conditionally include or omit parts + of the text.
    6. + +
    7. The AddHandler and AddType directives + are useful for automatically SSI-expanding all files with a + .shtml suffix to text/html.
    8. + +
    9. By using the Alias directive, we + keep the error document directory outside of the document + tree because it can be regarded more as a server part than + part of the document tree.
    10. + +
    11. The <Directory> block + restricts these "special" settings to the error document + directory and avoids an impact on any of the settings for the + regular document tree.
    12. + +
    13. For each of the error codes to be handled (see RFC2068 + for an exact description of each error code, or look at + src/main/http_protocol.c if you wish to see + apache's standard messages), an ErrorDocument in + the aliased /errordocs directory is defined. + Note that we only define the basename of the document here + because the MultiViews option will select the best candidate + based on the language suffixes and the client's preferences. + Any error situation with an error code not handled + by a custom document will be dealt with by the server in the + standard way (i.e., a plain error message in + english).
    14. + +
    15. Finally, the AllowOverride directive tells + apache that it is not necessary to look for a .htaccess file + in the /errordocs directory: a minor speed optimization.
    16. +
    + +

    The resulting httpd.conf configuration would then + look similar to this:

    + +

    Note

    Note that you can define your own + error messages using this method for only part of the document + tree, e.g., a /~user/ subtree. In this case, the configuration + could as well be put into the .htaccess file at the root of the + subtree, and the <Directory> and </Directory> + directives -but not the contained directives- must be + omitted.
    + +

    + LanguagePriority en fr de
    + Alias /errordocs /usr/local/apache/errordocs
    +
    + <Directory /usr/local/apache/errordocs>
    + + AllowOverride none
    + Options MultiViews IncludesNoExec FollowSymLinks
    + AddType text/html .shtml
    + <FilesMatch "\.shtml[.$]">
    + + SetOutputFilter INCLUDES
    +
    + </FilesMatch>
    +
    + </Directory>
    +
    + # "400 Bad Request",
    + ErrorDocument 400 /errordocs/400
    + # "401 Authorization Required",
    + ErrorDocument 401 /errordocs/401
    + # "403 Forbidden",
    + ErrorDocument 403 /errordocs/403
    + # "404 Not Found",
    + ErrorDocument 404 /errordocs/404
    + # "500 Internal Server Error",
    + ErrorDocument 500 /errordocs/500
    +

    + +

    The directory for the error messages (here: + /usr/local/apache/errordocs/) must then be created + with the appropriate permissions (readable and executable by + the server uid or gid, only writable for the administrator).

    + +

    Naming the Individual Error Document files

    + + + +

    By defining the MultiViews option, the server was + told to automatically scan the directory for matching variants + (looking at language and content type suffixes) when a + requested document was not found. In the configuration, we + defined the names for the error documents to be just their + error number (without any suffix).

    + +

    The names of the individual error documents are now + determined like this (I'm using 403 as an example, think of it + as a placeholder for any of the configured error + documents):

    + +
      +
    • No file errordocs/403 should exist. Otherwise, it would + be found and served (with the DefaultType, usually + text/plain), all negotiation would be bypassed.
    • + +
    • For each language for which we have an internationalized + version (note that this need not be the same set of languages + for each error code - you can get by with a single language + version until you actually have translated + versions), a document + errordocs/403.shtml.lang is created and + filled with the error text in that language (see below).
    • + +
    • One fallback document called + errordocs/403.shtml is created, usually by + creating a symlink to the default language variant (see below).
    • +
    + + +

    The Common Header and Footer Files

    + + + +

    By putting as much layout information in two special "include + files", the error documents can be reduced to a bare minimum.

    + +

    One of these layout files defines the HTML document header + and a configurable list of paths to the icons to be shown in + the resulting error document. These paths are exported as a set + of SSI environment variables and are later evaluated by the + "footer" special file. The title of the current error (which is + put into the TITLE tag and an H1 header) is simply passed in + from the main error document in a variable called + title.

    + +

    By changing this file, the layout of all generated + error messages can be changed in a second. (By + exploiting the features of SSI, you can easily define + different layouts based on the current virtual host, or even + based on the client's domain name).

    + +

    The second layout file describes the footer to be displayed + at the bottom of every error message. In this example, it shows + an apache logo, the current server time, the server version + string and adds a mail reference to the site's webmaster.

    + +

    For simplicity, the header file is simply called + head.shtml because it contains server-parsed + content but no language specific information. The footer file + exists once for each language translation, plus a symlink for + the default language.

    + +

    +for English, French and German versions (default english)
    +
    +foot.shtml.en,
    +foot.shtml.fr,
    +foot.shtml.de,
    +foot.shtml symlink to
    +foot.shtml.en +

    + +

    Both files are included into the error document by using the + directives <!--#include virtual="head" --> + and <!--#include virtual="foot" --> + respectively: the rest of the magic occurs in mod_negotiation + and in mod_include.

    + +

    See the listings below to see an + actual HTML implementation of the discussed example.

    + + +

    Creating ErrorDocuments in Different Languages

    + + + +

    After all this preparation work, little remains to be said + about the actual documents. They all share a simple common + structure:

    + +

    +<!--#set var="title" value="error description title" -->
    +<!--#include virtual="head" -->
    + + explanatory error text
    +
    +<!--#include virtual="foot" --> +

    + +

    In the listings section, you can see an + example of a [400 Bad Request] error document. Documents as + simple as that certainly cause no problems to translate or + expand.

    + + +

    The Fallback Language

    + + + +

    Do we need a special handling for languages other than those we + have translations for? We did set the LanguagePriority, didn't + we?!

    + +

    Well, the LanguagePriority directive is for the case where + the client does not express any language priority at all. But + what happens in the situation where the client wants one of the + languages we do not have, and none of those we do have?

    + +

    Without doing anything, the Apache server will usually + return a [406 no acceptable variant] error, listing the choices + from which the client may select. But we're in an error message + already, and important error information might get lost when + the client had to choose a language representation first.

    + +

    So, in this situation it appears to be easier to define a + fallback language (by copying or linking, e.g., the + english version to a language-less version). Because the + negotiation algorithm prefers "more specialized" variants over + "more generic" variants, these generic alternatives will only + be chosen when the normal negotiation did not succeed.

    + +

    A simple shell script to do it (execute within the + errordocs/ dir):

    + +

    + for f in *.shtml.en
    + do
    + + ln -s $f `basename $f .en`
    +
    + done +

    + + +
    top
    +
    +

    Customizing Proxy Error Messages

    + + + +

    As of Apache-1.3, it is possible to use the + ErrorDocument mechanism for proxy error messages + as well (previous versions always returned fixed predefined + error messages).

    + +

    Most proxy errors return an error code of [500 Internal + Server Error]. To find out whether a particular error document + was invoked on behalf of a proxy error or because of some other + server error, and what the reason for the failure was, you can + check the contents of the new ERROR_NOTES CGI + environment variable: if invoked for a proxy error, this + variable will contain the actual proxy error message text in + HTML form.

    + +

    The following excerpt demonstrates how to exploit the + ERROR_NOTES variable within an error document:

    + +

    + <!--#if expr="$REDIRECT_ERROR_NOTES = ''" -->
    +
    + <p>
    + + The server encountered an unexpected condition
    + which prevented it from fulfilling the request.
    +
    + </p>
    +
    + <p>
    + + <a href="mailto:<!--#echo var="SERVER_ADMIN" -->"
    + SUBJECT="Error message [<!--#echo var="REDIRECT_STATUS" -->] <!--#echo var="title" --> for <!--#echo var="REQUEST_URI" -->">
    + Please forward this error screen to <!--#echo var="SERVER_NAME" -->'s
    + WebMaster</a>; it includes useful debugging information about
    + the Request which caused the error.
    +
    + <pre><!--#printenv --></pre>
    +
    + </p>
    +
    + <!--#else -->
    + + <!--#echo var="REDIRECT_ERROR_NOTES" -->
    +
    +
    + <!--#endif --> +

    + +
    top
    +
    +

    HTML Listing of the Discussed Example

    + + + +

    So, to summarize our example, here's the complete listing of + the 400.shtml.en document. You will notice that it + contains almost nothing but the error text (with conditional + additions). Starting with this example, you will find it easy + to add more error documents, or to translate the error + documents to different languages.

    + +

    +<!--#set var="title" value="Bad Request"-->
    +<!--#include virtual="head" -->
    +
    + <p>
    + + Your browser sent a request that this server could not understand:
    + <blockquote>
    + + <strong><!--#echo var="REQUEST_URI" --></strong>
    +
    + </blockquote>
    +
    + The request could not be understood by the server due to malformed
    + syntax. The client should not repeat the request without
    + modifications.
    +
    + </p>
    +
    + <p>
    + + <!--#if expr="$HTTP_REFERER != ''" -->
    + + Please inform the owner of
    + <a href="<!--#echo var="HTTP_REFERER" -->">the referring page</a> about
    + the malformed link.
    +
    +
    + <!--#else -->
    + + Please check your request for typing errors and retry.
    +
    +
    + <!--#endif -->
    +
    + </p>
    +
    +<!--#include virtual="foot" --> +

    + +

    Here is the complete head.shtml.en file (the funny + line breaks avoid empty lines in the document after SSI + processing). Note the configuration section at top. That's + where you configure the images and logos as well as the apache + documentation directory. Look how this file displays two + different logos depending on the content of the virtual host + name ($SERVER_NAME), and that an animated apache logo is shown + if the browser appears to support it (the latter requires + server configuration lines of the form

    + +

    BrowserMatch "^Mozilla/[2-4]" anigif

    + +

    for browser types which support animated GIFs).

    + +

    +<!--#if expr="$SERVER_NAME = /.*\.mycompany\.com/" -->
    + +<!--#set var="IMG_CorpLogo" value="http://$SERVER_NAME:$SERVER_PORT/errordocs/CorpLogo.gif" -->
    +<!--#set var="ALT_CorpLogo" value="Powered by Linux!" -->
    +
    +
    +<!--#else -->
    + +<!--#set var="IMG_CorpLogo" value="http://$SERVER_NAME:$SERVER_PORT/errordocs/PrivLogo.gif" -->
    +<!--#set var="ALT_CorpLogo" value="Powered by Linux!" -->
    +
    +<!--#endif-->
    +
    +<!--#set var="IMG_BgImage" value="http://$SERVER_NAME:$SERVER_PORT/errordocs/BgImage.gif" -->
    +<!--#set var="DOC_Apache" value="http://$SERVER_NAME:$SERVER_PORT/Apache/" -->
    +
    +<!--#if expr="$anigif" -->
    + +<!--#set var="IMG_Apache" value="http://$SERVER_NAME:$SERVER_PORT/icons/apache_anim.gif" -->
    +
    +<!--#else-->
    + +<!--#set var="IMG_Apache" value="http://$SERVER_NAME:$SERVER_PORT/icons/apache_pb.gif" -->
    +
    +<!--#endif-->
    +
    + +<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
    +<html>
    +<head>
    + + <title>
    + [<!--#echo var="REDIRECT_STATUS" -->] <!--#echo var="title" -->
    + </title>
    +
    +</head>
    +
    +<body bgcolor="white" background="<!--#echo var="IMG_BgImage" -->">
    + + <h1 align="center">
    + [<!--#echo var="REDIRECT_STATUS" -->] + <!--#echo var="title" -->
    + <img src="<!--#echo var="IMG_CorpLogo" -->"
    +   alt="<!--#echo var="ALT_CorpLogo" -->" align="right">
    + </h1>
    +
    + <hr /> + <!-- ======================================================== -->
    + <div> +
    +

    + +

    and this is the foot.shtml.en file:

    + +

    + + </div>
    + <hr />
    +
    + <div align="right">
    + + <small>Local Server time: + <!--#echo var="DATE_LOCAL" --></small>
    +
    + </div>
    +
    + <div align="center">
    + + <a href="<!--#echo var="DOC_Apache" -->">
    + <img src="<!--#echo var="IMG_Apache" -->" border="0" align="bottom"
    +   alt="Powered by <!--#echo var="SERVER_SOFTWARE" -->"></a>
    + <br />
    + + <small><!--#set var="var" value="Powered by $SERVER_SOFTWARE --
    + File last modified on $LAST_MODIFIED" -->
    + <!--#echo var="var" --></small>
    +
    + </div>
    +
    + <p>If the indicated error looks like a misconfiguration, please inform
    + <a href="mailto:<!--#echo var="SERVER_ADMIN" -->"
    + subject="Feedback about Error message [<!--#echo var="REDIRECT_STATUS" -->]
    + <!--#echo var="title" -->, req=<!--#echo var="REQUEST_URI" -->">
    + <!--#echo var="SERVER_NAME" -->'s WebMaster</a>.
    + </p>
    +
    +
    +</body>
    +</html> +

    + +

    If you have tips to contribute, send mail to martin@apache.org

    +
    +
    +

    Available Languages:  en 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/misc/descriptors.html b/rubbos/app/httpd-2.0.64/docs/manual/misc/descriptors.html new file mode 100644 index 00000000..e751d582 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/misc/descriptors.html @@ -0,0 +1,5 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: descriptors.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/misc/descriptors.html.en b/rubbos/app/httpd-2.0.64/docs/manual/misc/descriptors.html.en new file mode 100644 index 00000000..005356d6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/misc/descriptors.html.en @@ -0,0 +1,233 @@ + + + +Descriptors and Apache - Apache HTTP Server + + + + + +
    <-
    +

    Descriptors and Apache

    +
    +

    Available Languages:  en 

    +
    + + +

    Warning:

    +

    This document has not been fully 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.

    +
    + +

    A descriptor, also commonly called a file + handle is an object that a program uses to read or write + an open file, or open network socket, or a variety of other + devices. It is represented by an integer, and you may be + familiar with stdin, stdout, and + stderr which are descriptors 0, 1, and 2 + respectively. Apache needs a descriptor for each log file, plus + one for each network socket that it listens on, plus a handful + of others. Libraries that Apache uses may also require + descriptors. Normal programs don't open up many descriptors at + all, and so there are some latent problems that you may + experience should you start running Apache with many + descriptors (i.e., with many virtual hosts).

    + +

    The operating system enforces a limit on the number of + descriptors that a program can have open at a time. There are + typically three limits involved here. One is a kernel + limitation, depending on your operating system you will either + be able to tune the number of descriptors available to higher + numbers (this is frequently called FD_SETSIZE). Or you + may be stuck with a (relatively) low amount. The second limit + is called the hard resource limit, and it is sometimes + set by root in an obscure operating system file, but frequently + is the same as the kernel limit. The third limit is called the + soft resource limit. The soft limit is always less + than or equal to the hard limit. For example, the hard limit + may be 1024, but the soft limit only 64. Any user can raise + their soft limit up to the hard limit. Root can raise the hard + limit up to the system maximum limit. The soft limit is the + actual limit that is used when enforcing the maximum number of + files a process can have open.

    + +

    To summarize:

    + +

    + #open files <= soft limit <= hard limit <= kernel limit +

    + + +

    You control the hard and soft limits using the + limit (csh) or ulimit (sh) + directives. See the respective man pages for more information. + For example you can probably use ulimit -n + unlimited to raise your soft limit up to the hard limit. + You should include this command in a shell script which starts + your webserver.

    + +

    Unfortunately, it's not always this simple. As mentioned + above, you will probably run into some system limitations that + will need to be worked around somehow. Work was done in version + 1.2.1 to improve the situation somewhat. Here is a partial list + of systems and workarounds (assuming you are using 1.2.1 or + later).

    + +
    + +
    top
    +
    +

    BSDI 2.0

    + +

    Under BSDI 2.0 you can build Apache to support more + descriptors by adding -DFD_SETSIZE=nnn to + EXTRA_CFLAGS (where nnn is the number of + descriptors you wish to support, keep it less than the hard + limit). But it will run into trouble if more than + approximately 240 Listen directives are used. This may be + cured by rebuilding your kernel with a higher + FD_SETSIZE.

    + +
    top
    +
    +

    FreeBSD 2.2, BSDI 2.1+

    + +

    Similar to the BSDI 2.0 case, you should define + FD_SETSIZE and rebuild. But the extra Listen + limitation doesn't exist.

    + +
    top
    +
    +

    Linux

    + +

    By default Linux has a kernel maximum of 256 open + descriptors per process. There are several patches available + for the 2.0.x series which raise this to 1024 and beyond, and + you can find them in the "unofficial patches" section of the Linux Information HQ. + None of these patches are perfect, and an entirely different + approach is likely to be taken during the 2.1.x development. + Applying these patches will raise the FD_SETSIZE used to + compile all programs, and unless you rebuild all your + libraries you should avoid running any other program with a + soft descriptor limit above 256. As of this writing the + patches available for increasing the number of descriptors do + not take this into account. On a dedicated webserver you + probably won't run into trouble.

    + +
    top
    +
    +

    Solaris through 2.5.1

    + +

    Solaris has a kernel hard limit of 1024 (may be lower in + earlier versions). But it has a limitation that files using + the stdio library cannot have a descriptor above 255. Apache + uses the stdio library for the ErrorLog directive. When you + have more than approximately 110 virtual hosts (with an error + log and an access log each) you will need to build Apache + with -DHIGH_SLACK_LINE=256 added to + EXTRA_CFLAGS. You will be limited to + approximately 240 error logs if you do this.

    + +
    top
    +
    +

    AIX

    + +

    AIX version 3.2?? appears to have a hard limit of 128 + descriptors. End of story. Version 4.1.5 has a hard limit of + 2000.

    + +
    top
    +
    +

    SCO OpenServer

    + +

    Edit the /etc/conf/cf.d/stune file or use + /etc/conf/cf.d/configure choice 7 (User and + Group configuration) and modify the NOFILES + kernel parameter to a suitably higher value. SCO recommends a + number between 60 and 11000, the default is 110. Relink and + reboot, and the new number of descriptors will be + available.

    + +
    top
    +
    +

    Compaq Tru64 UNIX/Digital UNIX/OSF

    + +
      +
    1. Raise open_max_soft and + open_max_hard to 4096 in the proc subsystem. + Do a man on sysconfig, sysconfigdb, and + sysconfigtab.
    2. + +
    3. Raise max-vnodes to a large number which + is greater than the number of apache processes * 4096 + (Setting it to 250,000 should be good for most people). + Do a man on sysconfig, sysconfigdb, and + sysconfigtab.
    4. + +
    5. If you are using Tru64 5.0, 5.0A, or 5.1, define + NO_SLACK to work around a bug in the OS. + CFLAGS="-DNO_SLACK" ./configure
    6. +
    + +
    top
    +
    +

    Others

    + +

    If you have details on another operating system, please + submit it through our Bug Report + Page.

    + +

    In addition to the problems described above there are + problems with many libraries that Apache uses. The most common + example is the bind DNS resolver library that is used by pretty + much every unix, which fails if it ends up with a descriptor + above 256. We suspect there are other libraries that similar + limitations. So the code as of 1.2.1 takes a defensive stance + and tries to save descriptors less than 16 for use while + processing each request. This is called the low slack + line.

    + +

    Note that this shouldn't waste descriptors. If you really + are pushing the limits and Apache can't get a descriptor above + 16 when it wants it, it will settle for one below 16.

    + +

    In extreme situations you may want to lower the low slack + line, but you shouldn't ever need to. For example, lowering it + can increase the limits 240 described above under Solaris and + BSDI 2.0. But you'll play a delicate balancing game with the + descriptors needed to serve a request. Should you want to play + this game, the compile time parameter is + LOW_SLACK_LINE and there's a tiny bit of + documentation in the header file httpd.h.

    + +

    Finally, if you suspect that all this slack stuff is causing + you problems, you can disable it. Add -DNO_SLACK + to EXTRA_CFLAGS and rebuild. But please report it + to our Bug + Report Page so that we can investigate.

    + +
    +
    +

    Available Languages:  en 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/misc/fin_wait_2.html b/rubbos/app/httpd-2.0.64/docs/manual/misc/fin_wait_2.html new file mode 100644 index 00000000..64957238 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/misc/fin_wait_2.html @@ -0,0 +1,5 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: fin_wait_2.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/misc/fin_wait_2.html.en b/rubbos/app/httpd-2.0.64/docs/manual/misc/fin_wait_2.html.en new file mode 100644 index 00000000..60da4b0d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/misc/fin_wait_2.html.en @@ -0,0 +1,422 @@ + + + +Connections in the FIN_WAIT_2 state and Apache - Apache HTTP Server + + + + + +
    <-
    +

    Connections in the FIN_WAIT_2 state and Apache

    +
    +

    Available Languages:  en 

    +
    + + +

    Warning:

    +

    This document has not been fully 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.

    +
    + +

    Starting with the Apache 1.2 betas, people are reporting + many more connections in the FIN_WAIT_2 state (as reported + by netstat) than they saw using older + versions. When the server closes a TCP connection, it sends + a packet with the FIN bit set to the client, which then + responds with a packet with the ACK bit set. The client + then sends a packet with the FIN bit set to the server, + which responds with an ACK and the connection is closed. + The state that the connection is in during the period + between when the server gets the ACK from the client and + the server gets the FIN from the client is known as + FIN_WAIT_2. See the TCP RFC for + the technical details of the state transitions.

    + +

    The FIN_WAIT_2 state is somewhat unusual in that there + is no timeout defined in the standard for it. This means + that on many operating systems, a connection in the + FIN_WAIT_2 state will stay around until the system is + rebooted. If the system does not have a timeout and too + many FIN_WAIT_2 connections build up, it can fill up the + space allocated for storing information about the + connections and crash the kernel. The connections in + FIN_WAIT_2 do not tie up an httpd process.

    + +
    + +
    top
    +
    +

    Why Does It Happen?

    + +

    There are numerous reasons for it happening, some of them + may not yet be fully clear. What is known follows.

    + +

    Buggy Clients and Persistent + Connections

    + +

    Several clients have a bug which pops up when dealing with + persistent connections (aka + keepalives). When the connection is idle and the server + closes the connection (based on the KeepAliveTimeout), + the client is programmed so that the client does not send + back a FIN and ACK to the server. This means that the + connection stays in the FIN_WAIT_2 state until one of the + following happens:

    + +
      +
    • The client opens a new connection to the same or a + different site, which causes it to fully close the older + connection on that socket.
    • + +
    • The user exits the client, which on some (most?) + clients causes the OS to fully shutdown the + connection.
    • + +
    • The FIN_WAIT_2 times out, on servers that have a + timeout for this state.
    • +
    + +

    If you are lucky, this means that the buggy client will + fully close the connection and release the resources on + your server. However, there are some cases where the socket + is never fully closed, such as a dialup client + disconnecting from their provider before closing the + client. In addition, a client might sit idle for days + without making another connection, and thus may hold its + end of the socket open for days even though it has no + further use for it. This is a bug in the browser or + in its operating system's TCP implementation.

    + +

    The clients on which this problem has been verified to + exist:

    + +
      +
    • Mozilla/3.01 (X11; I; FreeBSD 2.1.5-RELEASE + i386)
    • + +
    • Mozilla/2.02 (X11; I; FreeBSD 2.1.5-RELEASE + i386)
    • + +
    • Mozilla/3.01Gold (X11; I; SunOS 5.5 sun4m)
    • + +
    • MSIE 3.01 on the Macintosh
    • + +
    • MSIE 3.01 on Windows 95
    • +
    + +

    This does not appear to be a problem on:

    + +
      +
    • Mozilla/3.01 (Win95; I)
    • +
    + +

    It is expected that many other clients have the same + problem. What a client should do is + periodically check its open socket(s) to see if they have + been closed by the server, and close their side of the + connection if the server has closed. This check need only + occur once every few seconds, and may even be detected by a + OS signal on some systems (e.g., Win95 and NT + clients have this capability, but they seem to be ignoring + it).

    + +

    Apache cannot avoid these FIN_WAIT_2 + states unless it disables persistent connections for the + buggy clients, just like we recommend doing for Navigator + 2.x clients due to other bugs. However, non-persistent + connections increase the total number of connections needed + per client and slow retrieval of an image-laden web page. + Since non-persistent connections have their own resource + consumptions and a short waiting period after each closure, + a busy server may need persistence in order to best serve + its clients.

    + +

    As far as we know, the client-caused FIN_WAIT_2 problem + is present for all servers that support persistent + connections, including Apache 1.1.x and 1.2.

    + + + +

    A necessary bit of code + introduced in 1.2

    + +

    While the above bug is a problem, it is not the whole + problem. Some users have observed no FIN_WAIT_2 problems + with Apache 1.1.x, but with 1.2b enough connections build + up in the FIN_WAIT_2 state to crash their server. The most + likely source for additional FIN_WAIT_2 states is a + function called lingering_close() which was + added between 1.1 and 1.2. This function is necessary for + the proper handling of persistent connections and any + request which includes content in the message body + (e.g., PUTs and POSTs). What it does is read any + data sent by the client for a certain time after the server + closes the connection. The exact reasons for doing this are + somewhat complicated, but involve what happens if the + client is making a request at the same time the server + sends a response and closes the connection. Without + lingering, the client might be forced to reset its TCP + input buffer before it has a chance to read the server's + response, and thus understand why the connection has + closed. See the appendix for more + details.

    + +

    The code in lingering_close() appears to + cause problems for a number of factors, including the + change in traffic patterns that it causes. The code has + been thoroughly reviewed and we are not aware of any bugs + in it. It is possible that there is some problem in the BSD + TCP stack, aside from the lack of a timeout for the + FIN_WAIT_2 state, exposed by the + lingering_close code that causes the observed + problems.

    + + +
    top
    +
    +

    What Can I Do About it?

    + +

    There are several possible workarounds to the problem, some + of which work better than others.

    + +

    Add a timeout for FIN_WAIT_2

    + +

    The obvious workaround is to simply have a timeout for the + FIN_WAIT_2 state. This is not specified by the RFC, and + could be claimed to be a violation of the RFC, but it is + widely recognized as being necessary. The following systems + are known to have a timeout:

    + +
      +
    • FreeBSD + versions starting at 2.0 or possibly earlier.
    • + +
    • NetBSD version + 1.2(?)
    • + +
    • OpenBSD all + versions(?)
    • + +
    • BSD/OS 2.1, with + the + K210-027 patch installed.
    • + +
    • Solaris as of + around version 2.2. The timeout can be tuned by using + ndd to modify + tcp_fin_wait_2_flush_interval, but the + default should be appropriate for most servers and + improper tuning can have negative impacts.
    • + +
    • Linux 2.0.x and + earlier(?)
    • + +
    • HP-UX 10.x defaults + to terminating connections in the FIN_WAIT_2 state after + the normal keepalive timeouts. This does not refer to the + persistent connection or HTTP keepalive timeouts, but the + SO_LINGER socket option which is enabled by + Apache. This parameter can be adjusted by using + nettune to modify parameters such as + tcp_keepstart and tcp_keepstop. + In later revisions, there is an explicit timer for + connections in FIN_WAIT_2 that can be modified; contact + HP support for details.
    • + +
    • SGI IRIX can be + patched to support a timeout. For IRIX 5.3, 6.2, and 6.3, + use patches 1654, 1703 and 1778 respectively. If you have + trouble locating these patches, please contact your SGI + support channel for help.
    • + +
    • NCR's MP RAS Unix + 2.xx and 3.xx both have FIN_WAIT_2 timeouts. In 2.xx it + is non-tunable at 600 seconds, while in 3.xx it defaults + to 600 seconds and is calculated based on the tunable + "max keep alive probes" (default of 8) multiplied by the + "keep alive interval" (default 75 seconds).
    • + +
    • Sequent's ptx/TCP/IP + for DYNIX/ptx has had a FIN_WAIT_2 timeout since + around release 4.1 in mid-1994.
    • +
    + +

    The following systems are known to not have a + timeout:

    + +
      +
    • SunOS 4.x does not + and almost certainly never will have one because it as at + the very end of its development cycle for Sun. If you + have kernel source should be easy to patch.
    • +
    + +

    There is a + patch available for adding a timeout to the FIN_WAIT_2 + state; it was originally intended for BSD/OS, but should be + adaptable to most systems using BSD networking code. You + need kernel source code to be able to use it.

    + + + +

    Compile without using + lingering_close()

    + +

    It is possible to compile Apache 1.2 without using the + lingering_close() function. This will result + in that section of code being similar to that which was in + 1.1. If you do this, be aware that it can cause problems + with PUTs, POSTs and persistent connections, especially if + the client uses pipelining. That said, it is no worse than + on 1.1, and we understand that keeping your server running + is quite important.

    + +

    To compile without the lingering_close() + function, add -DNO_LINGCLOSE to the end of the + EXTRA_CFLAGS line in your + Configuration file, rerun + Configure and rebuild the server.

    + + + +

    Use SO_LINGER as + an alternative to lingering_close()

    + +

    On most systems, there is an option called + SO_LINGER that can be set with + setsockopt(2). It does something very similar + to lingering_close(), except that it is broken + on many systems so that it causes far more problems than + lingering_close. On some systems, it could + possibly work better so it may be worth a try if you have + no other alternatives.

    + +

    To try it, add -DUSE_SO_LINGER + -DNO_LINGCLOSE to the end of the + EXTRA_CFLAGS line in your + Configuration file, rerun + Configure and rebuild the server.

    + +

    NOTE

    Attempting to use + SO_LINGER and lingering_close() + at the same time is very likely to do very bad things, so + don't.
    + + + +

    Increase the amount of memory + used for storing connection state

    + +
    +
    BSD based networking code:
    + +
    + BSD stores network data, such as connection states, in + something called an mbuf. When you get so many + connections that the kernel does not have enough mbufs + to put them all in, your kernel will likely crash. You + can reduce the effects of the problem by increasing the + number of mbufs that are available; this will not + prevent the problem, it will just make the server go + longer before crashing. + +

    The exact way to increase them may depend on your + OS; look for some reference to the number of "mbufs" or + "mbuf clusters". On many systems, this can be done by + adding the line NMBCLUSTERS="n", where + n is the number of mbuf clusters you want + to your kernel config file and rebuilding your + kernel.

    +
    +
    + + + +

    Disable KeepAlive

    + +

    If you are unable to do any of the above then you + should, as a last resort, disable KeepAlive. Edit your + httpd.conf and change "KeepAlive On" to "KeepAlive + Off".

    + + +
    top
    +
    +

    Appendix

    + +

    Below is a message from Roy Fielding, one of the authors + of HTTP/1.1.

    + +

    Why the lingering close + functionality is necessary with HTTP

    + +

    The need for a server to linger on a socket after a close + is noted a couple times in the HTTP specs, but not + explained. This explanation is based on discussions between + myself, Henrik Frystyk, Robert S. Thau, Dave Raggett, and + John C. Mallery in the hallways of MIT while I was at W3C.

    + +

    If a server closes the input side of the connection + while the client is sending data (or is planning to send + data), then the server's TCP stack will signal an RST + (reset) back to the client. Upon receipt of the RST, the + client will flush its own incoming TCP buffer back to the + un-ACKed packet indicated by the RST packet argument. If + the server has sent a message, usually an error response, + to the client just before the close, and the client + receives the RST packet before its application code has + read the error message from its incoming TCP buffer and + before the server has received the ACK sent by the client + upon receipt of that buffer, then the RST will flush the + error message before the client application has a chance to + see it. The result is that the client is left thinking that + the connection failed for no apparent reason.

    + +

    There are two conditions under which this is likely to + occur:

    + +
      +
    1. sending POST or PUT data without proper + authorization
    2. + +
    3. sending multiple requests before each response + (pipelining) and one of the middle requests resulting in + an error or other break-the-connection result.
    4. +
    + +

    The solution in all cases is to send the response, close + only the write half of the connection (what shutdown is + supposed to do), and continue reading on the socket until + it is either closed by the client (signifying it has + finally read the response) or a timeout occurs. That is + what the kernel is supposed to do if SO_LINGER is set. + Unfortunately, SO_LINGER has no effect on some systems; on + some other systems, it does not have its own timeout and + thus the TCP memory segments just pile-up until the next + reboot (planned or not).

    + +

    Please note that simply removing the linger code will + not solve the problem -- it only moves it to a different + and much harder one to detect.

    + +
    +
    +

    Available Languages:  en 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/misc/index.html b/rubbos/app/httpd-2.0.64/docs/manual/misc/index.html new file mode 100644 index 00000000..23ec1ec0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/misc/index.html @@ -0,0 +1,9 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: index.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: index.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/misc/index.html.en b/rubbos/app/httpd-2.0.64/docs/manual/misc/index.html.en new file mode 100644 index 00000000..81445841 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/misc/index.html.en @@ -0,0 +1,121 @@ + + + +Apache Miscellaneous Documentation - Apache HTTP Server + + + + + +
    <-
    +

    Apache Miscellaneous Documentation

    +
    +

    Available Languages:  en  | + tr 

    +
    + + +

    Below is a list of additional documentation pages that apply + to the Apache web server development project.

    + +

    Warning

    +

    Some of the documents below have not been fully 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.

    +
    + +
    +
    How to use XSSI and + Negotiation for custom ErrorDocuments
    + +
    +

    Describes a solution which uses XSSI and negotiation to + custom-tailor the Apache ErrorDocuments to taste, adding the + advantage of returning internationalized versions of the + error messages depending on the client's language + preferences.

    +
    + +
    File Descriptor use in + Apache
    + +
    +

    Describes how Apache uses file descriptors and talks + about various limits imposed on the number of descriptors + available by various operating systems.

    +
    + +
    FIN_WAIT_2
    + +
    +

    A description of the causes of Apache processes going + into the FIN_WAIT_2 state, and what you can do + about it.

    +
    + +
    Known Client + Problems
    + +
    +

    A list of problems in HTTP clients which can be mitigated + by Apache.

    +
    + +
    Performance Notes - Apache + Tuning
    + +
    +

    Notes about how to (run-time and compile-time) configure + Apache for highest performance. Notes explaining why Apache + does some things, and why it doesn't do other things (which + make it slower/faster).

    +
    + +
    Security Tips
    + +
    +

    Some "do"s - and "don't"s - for keeping your Apache web + site secure.

    +
    + +
    URL Rewriting Guide
    +
    +

    This document supplements the mod_rewrite + reference documentation. + It describes how one can use Apache's mod_rewrite + to solve typical URL-based problems webmasters are usually confronted + with in practice.

    +
    + +
    Apache Tutorials
    + +
    +

    A list of external resources which help to accomplish common + tasks with the Apache HTTP server.

    +
    + +
    Relevant Standards
    + +
    +

    This document acts as a reference page for most of the relevant + standards that Apache follows.

    +
    +
    +
    +
    +
    +

    Available Languages:  en  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/misc/index.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/misc/index.html.tr.utf8 new file mode 100644 index 00000000..e4cb8a26 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/misc/index.html.tr.utf8 @@ -0,0 +1,122 @@ + + + +Çeşitli Belgeler - Apache HTTP Sunucusu + + + + + +
    <-
    +

    Çeşitli Belgeler

    +
    +

    Mevcut Diller:  en  | + tr 

    +
    + + +

    Aşağıda listelenen belgeler de Apache HTTP sunucusu geliştirme projesi + kapsamındadır.

    + +

    Uyarı

    +

    Aşağıdaki belgeler, Apache HTTP Sunucusunun 2.0 sürümünde yapılmış + değişikliklere göre tam olarak güncellenmemiştir. Hala güncel kalmış + bazı bilgiler olabilir, fakat siz yine de bu belgeleri kullanırken + dikkatli olun.

    +
    + +
    +
    Hata belgelerinin özelleştirilmesi + için XSSI ve içerik uzlaşımının kullanımı
    + +
    +

    Belgede, istemcinin dil tercihlerine bağlı olarak hata + iletilerinin yerelleştirilmiş sürümlerini döndürmenin yanında + Apache hata belgelerine bir çeşni katmak için XSSI ve içerik + uzlaşımının kullanımıyla ilgili bir çözüme yer verilmiştir.

    +
    + +
    Apache’de dosya tanıtıcılarının + kullanımı
    + +
    +

    Belgede, Apache’nin çeşitli işletim sistemleri tarafından + dayatılan dosya tanıtıcı miktarları için işletim sistemleri ile + nasıl anlaştığı ve bu dosya tanıtıcılarını nasıl kullandığı + açıklanmıştır.

    +
    + +
    FIN_WAIT_2
    + +
    +

    Belgede, Apache’nin FIN_WAIT_2 durumuna girme + sebepleri ile bu konuda neler yapılabileceği açıklanmıştır.

    +
    + +
    Bilinen İstemci Sorunları +
    + +
    +

    Belgede, HTTP istemcilerinden kaynaklanan bazı sorunların Apache + tarafından hafifletilebilenlerinin bir listesi yer almaktadır.

    +
    + +
    Başarım Arttırma İpuçları - Apache’ye + İnce Ayar Çekilmesi
    + +
    +

    Yüksek başarım elde etmek için Apache yapılandırmasında (çalışma + anında ve derleme sırasında) yapılacaklar ile ilgili bazı bilgiler + yanında Apache’de bazı şeylerin (bir şeyleri hızlandıran ve + yavaşlatan şeylerin) yapılma ve yapılmama sebepleri + açıklanmıştır.

    +
    + +
    Güvenlik İpuçları
    + +
    +

    Apache HTTP sitenizi güvenli kılmak için yapılacaklar ve + yapılmayacaklar.

    +
    + +
    URL Yeniden Yazma Rehberi
    + +
    +

    Bu belge mod_rewrite modülünün başvuru belgesi yerine geçer. + Site yöneticilerinin sıkça karşılaştıkları belli başlı URL temelli + sorunları çözümlemek için Apache’nin mod_rewrite + modülünün nasıl kullanılacağını açıklar.

    +
    + +
    Apache Öğreticileri
    + +
    +

    Apache HTTP Sunucusu ile ilgili görevlerinizi yerine getirmenize + yardımcı olacak harici kaynakların bir listesi.

    +
    + +
    Ä°lgili Standartlar
    + +
    +

    Bu belge Apache’nin uyacağı standartların bir çoğuna atıfta + bulunmak amacıyla hazırlanmıştır.

    +
    +
    + +
    +
    +
    +

    Mevcut Diller:  en  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/misc/known_client_problems.html b/rubbos/app/httpd-2.0.64/docs/manual/misc/known_client_problems.html new file mode 100644 index 00000000..9f5b039f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/misc/known_client_problems.html @@ -0,0 +1,5 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: known_client_problems.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/misc/known_client_problems.html.en b/rubbos/app/httpd-2.0.64/docs/manual/misc/known_client_problems.html.en new file mode 100644 index 00000000..cfc02954 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/misc/known_client_problems.html.en @@ -0,0 +1,408 @@ + + + +Known Problems in Clients - Apache HTTP Server + + + + + +
    <-
    +

    Known Problems in Clients

    +
    +

    Available Languages:  en 

    +
    + + +

    Warning:

    +

    This document has not been fully 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.

    +
    + +

    Over time the Apache Group has discovered or been notified + of problems with various clients which we have had to work + around, or explain. This document describes these problems and + the workarounds available. It's not arranged in any particular + order. Some familiarity with the standards is assumed, but not + necessary.

    + +

    For brevity, Navigator will refer to Netscape's + Navigator product (which in later versions was renamed + "Communicator" and various other names), and MSIE will + refer to Microsoft's Internet Explorer product. All trademarks + and copyrights belong to their respective companies. We welcome + input from the various client authors to correct + inconsistencies in this paper, or to provide us with exact + version numbers where things are broken/fixed.

    + +

    For reference, RFC1945 + defines HTTP/1.0, and RFC2068 + defines HTTP/1.1. Apache as of version 1.2 is an HTTP/1.1 + server (with an optional HTTP/1.0 proxy).

    + +

    Various of these workarounds are triggered by environment + variables. The admin typically controls which are set, and for + which clients, by using mod_browser. Unless + otherwise noted all of these workarounds exist in versions 1.2 + and later.

    + +
    + +
    top
    +
    +

    Trailing CRLF on POSTs

    + +

    This is a legacy issue. The CERN webserver required + POST data to have an extra CRLF + following it. Thus many clients send an extra CRLF + that is not included in the Content-Length of the + request. Apache works around this problem by eating any empty + lines which appear before a request.

    + +
    top
    +
    +

    Broken KeepAlive

    + +

    Various clients have had broken implementations of + keepalive (persistent connections). In particular the + Windows versions of Navigator 2.0 get very confused when the + server times out an idle connection. The workaround is present + in the default config files:

    + +

    + BrowserMatch Mozilla/2 nokeepalive +

    + +

    Note that this matches some earlier versions of MSIE, which + began the practice of calling themselves Mozilla in + their user-agent strings just like Navigator.

    + +

    MSIE 4.0b2, which claims to support HTTP/1.1, does not + properly support keepalive when it is used on 301 or 302 + (redirect) responses. Unfortunately Apache's + nokeepalive code prior to 1.2.2 would not work + with HTTP/1.1 clients. You must apply + this patch to version 1.2.1. Then add this to your + config:

    + +

    + BrowserMatch "MSIE 4\.0b2;" nokeepalive +

    + +
    top
    +
    +

    Incorrect interpretation of + HTTP/1.1 in response

    + +

    To quote from section 3.1 of RFC1945:

    + +
    + HTTP uses a "<MAJOR>.<MINOR>" numbering scheme to + indicate versions of the protocol. The protocol versioning + policy is intended to allow the sender to indicate the format + of a message and its capacity for understanding further HTTP + communication, rather than the features obtained via that + communication. +
    + +

    Since Apache is an HTTP/1.1 server, it indicates so as part of + its response. Many client authors mistakenly treat this part of + the response as an indication of the protocol that the response + is in, and then refuse to accept the response.

    + +

    The first major indication of this problem was with AOL's + proxy servers. When Apache 1.2 went into beta it was the first + wide-spread HTTP/1.1 server. After some discussion, AOL fixed + their proxies. In anticipation of similar problems, the + force-response-1.0 environment variable was added + to Apache. When present Apache will indicate "HTTP/1.0" in + response to an HTTP/1.0 client, but will not in any other way + change the response.

    + +

    The pre-1.1 Java Development Kit (JDK) that is used in many + clients (including Navigator 3.x and MSIE 3.x) exhibits this + problem. As do some of the early pre-releases of the 1.1 JDK. + We think it is fixed in the 1.1 JDK release. In any event the + workaround:

    + +

    + BrowserMatch Java/1.0 force-response-1.0
    + BrowserMatch JDK/1.0 force-response-1.0 +

    + +

    RealPlayer 4.0 from Progressive Networks also exhibits this + problem. However they have fixed it in version 4.01 of the + player, but version 4.01 uses the same User-Agent + as version 4.0. The workaround is still:

    + +

    + BrowserMatch "RealPlayer 4.0" force-response-1.0 +

    + +
    top
    +
    +

    Requests use HTTP/1.1 but + responses must be in HTTP/1.0

    + +

    MSIE 4.0b2 has this problem. Its Java VM makes requests in + HTTP/1.1 format but the responses must be in HTTP/1.0 format + (in particular, it does not understand chunked + responses). The workaround is to fool Apache into believing the + request came in HTTP/1.0 format.

    + +

    + BrowserMatch "MSIE 4\.0b2;" downgrade-1.0 + force-response-1.0 +

    + +

    This workaround is available in 1.2.2, and in a + patch against 1.2.1.

    + +
    top
    +
    +

    Boundary problems with + header parsing

    + +

    All versions of Navigator from 2.0 through 4.0b2 (and + possibly later) have a problem if the trailing CRLF of the + response header starts at offset 256, 257 or 258 of the + response. A BrowserMatch for this would match on nearly every + hit, so the workaround is enabled automatically on all + responses. The workaround implemented detects when this + condition would occur in a response and adds extra padding to + the header to push the trailing CRLF past offset 258 of the + response.

    + +
    top
    +
    +

    Multipart responses and + Quoted Boundary Strings

    + +

    On multipart responses some clients will not accept quotes + (") around the boundary string. The MIME standard recommends + that such quotes be used. But the clients were probably written + based on one of the examples in RFC2068, which does not include + quotes. Apache does not include quotes on its boundary strings + to workaround this problem.

    + +
    top
    +
    +

    Byterange Requests

    + +

    A byterange request is used when the client wishes to + retrieve a portion of an object, not necessarily the entire + object. There was a very old draft which included these + byteranges in the URL. Old clients such as Navigator 2.0b1 and + MSIE 3.0 for the MAC exhibit this behaviour, and it will appear + in the servers' access logs as (failed) attempts to retrieve a + URL with a trailing ";xxx-yyy". Apache does not attempt to + implement this at all.

    + +

    A subsequent draft of this standard defines a header + Request-Range, and a response type + multipart/x-byteranges. The HTTP/1.1 standard + includes this draft with a few fixes, and it defines the header + Range and type + multipart/byteranges.

    + +

    Navigator (versions 2 and 3) sends both Range + and Request-Range headers (with the same value), + but does not accept a multipart/byteranges + response. The response must be + multipart/x-byteranges. As a workaround, if Apache + receives a Request-Range header it considers it + "higher priority" than a Range header and in + response uses multipart/x-byteranges.

    + +

    The Adobe Acrobat Reader plugin makes extensive use of + byteranges and prior to version 3.01 supports only the + multipart/x-byterange response. Unfortunately + there is no clue that it is the plugin making the request. If + the plugin is used with Navigator, the above workaround works + fine. But if the plugin is used with MSIE 3 (on Windows) the + workaround won't work because MSIE 3 doesn't give the + Range-Request clue that Navigator does. To + workaround this, Apache special cases "MSIE 3" in the + User-Agent and serves + multipart/x-byteranges. Note that the necessity + for this with MSIE 3 is actually due to the Acrobat plugin, not + due to the browser.

    + +

    Netscape Communicator appears to not issue the non-standard + Request-Range header. When an Acrobat plugin prior + to version 3.01 is used with it, it will not properly + understand byteranges. The user must upgrade their Acrobat + reader to 3.01.

    + +
    top
    +
    +

    Set-Cookie header is + unmergeable

    + +

    The HTTP specifications say that it is legal to merge + headers with duplicate names into one (separated by commas). + Some browsers that support Cookies don't like merged headers + and prefer that each Set-Cookie header is sent + separately. When parsing the headers returned by a CGI, Apache + will explicitly avoid merging any Set-Cookie + headers.

    + +
    top
    +
    +

    Expires headers + and GIF89A animations

    + +

    Navigator versions 2 through 4 will erroneously re-request + GIF89A animations on each loop of the animation if the first + response included an Expires header. This happens + regardless of how far in the future the expiry time is set. + There is no workaround supplied with Apache, however there are + hacks for + 1.2 and for + 1.3.

    + +
    top
    +
    +

    POST without + Content-Length

    + +

    In certain situations Navigator 3.01 through 3.03 appear to + incorrectly issue a POST without the request body. There is no + known workaround. It has been fixed in Navigator 3.04, + Netscapes provides some information. + There's also + some information about the actual problem.

    + +
    top
    +
    +

    JDK 1.2 betas lose + parts of responses.

    + +

    The http client in the JDK1.2beta2 and beta3 will throw away + the first part of the response body when both the headers and + the first part of the body are sent in the same network packet + AND keep-alive's are being used. If either condition is not met + then it works fine.

    + +

    See also Bug-ID's 4124329 and 4125538 at the java developer + connection.

    + +

    If you are seeing this bug yourself, you can add the + following BrowserMatch directive to work around it:

    + +

    + BrowserMatch "Java1\.2beta[23]" nokeepalive +

    + +

    We don't advocate this though since bending over backwards + for beta software is usually not a good idea; ideally it gets + fixed, new betas or a final release comes out, and no one uses + the broken old software anymore. In theory.

    + +
    top
    +
    +

    Content-Type + change is not noticed after reload

    + +

    Navigator (all versions?) will cache the + content-type for an object "forever". Using reload + or shift-reload will not cause Navigator to notice a + content-type change. The only work-around is for + the user to flush their caches (memory and disk). By way of an + example, some folks may be using an old mime.types + file which does not map .htm to + text/html, in this case Apache will default to + sending text/plain. If the user requests the page + and it is served as text/plain. After the admin + fixes the server, the user will have to flush their caches + before the object will be shown with the correct + text/html type.

    + +
    top
    +
    +

    MSIE Cookie + problem with expiry date in the year 2000

    + +

    MSIE versions 3.00 and 3.02 (without the Y2K patch) do not + handle cookie expiry dates in the year 2000 properly. Years + after 2000 and before 2000 work fine. This is fixed in IE4.01 + service pack 1, and in the Y2K patch for IE3.02. Users should + avoid using expiry dates in the year 2000.

    + +
    top
    +
    +

    Lynx incorrectly asking for + transparent content negotiation

    + +

    The Lynx browser versions 2.7 and 2.8 send a "negotiate: + trans" header in their requests, which is an indication the + browser supports transparent content negotiation (TCN). However + the browser does not support TCN. As of version 1.3.4, Apache + supports TCN, and this causes problems with these versions of + Lynx. As a workaround future versions of Apache will ignore + this header when sent by the Lynx client.

    + +
    top
    +
    +

    MSIE 4.0 mishandles Vary + response header

    + +

    MSIE 4.0 does not handle a Vary header properly. The Vary + header is generated by mod_rewrite in apache 1.3. The result is + an error from MSIE saying it cannot download the requested + file. There are more details in PR#4118.

    + +

    A workaround is to add the following to your server's + configuration files:

    + +

    + BrowserMatch "MSIE 4\.0" force-no-vary +

    + +

    (This workaround is only available with releases + after 1.3.6 of the Apache Web server.)

    + +
    +
    +

    Available Languages:  en 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/misc/perf-tuning.html b/rubbos/app/httpd-2.0.64/docs/manual/misc/perf-tuning.html new file mode 100644 index 00000000..84956329 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/misc/perf-tuning.html @@ -0,0 +1,13 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: perf-tuning.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: perf-tuning.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: perf-tuning.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/misc/perf-tuning.html.en b/rubbos/app/httpd-2.0.64/docs/manual/misc/perf-tuning.html.en new file mode 100644 index 00000000..2a6bc9d1 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/misc/perf-tuning.html.en @@ -0,0 +1,1058 @@ + + + +Apache Performance Tuning - Apache HTTP Server + + + + + +
    <-
    +

    Apache Performance Tuning

    +
    +

    Available Languages:  en  | + ko  | + tr 

    +
    + + +

    Apache 2.x is a general-purpose webserver, designed to + provide a balance of flexibility, portability, and performance. + Although it has not been designed specifically to set benchmark + records, Apache 2.x is capable of high performance in many + real-world situations.

    + +

    Compared to Apache 1.3, release 2.x contains many additional + optimizations to increase throughput and scalability. Most of + these improvements are enabled by default. However, there are + compile-time and run-time configuration choices that can + significantly affect performance. This document describes the + options that a server administrator can configure to tune the + performance of an Apache 2.x installation. Some of these + configuration options enable the httpd to better take advantage + of the capabilities of the hardware and OS, while others allow + the administrator to trade functionality for speed.

    + +
    + +
    top
    +
    +

    Hardware and Operating System Issues

    + + + +

    The single biggest hardware issue affecting webserver + performance is RAM. A webserver should never ever have to swap, + as swapping increases the latency of each request beyond a point + that users consider "fast enough". This causes users to hit + stop and reload, further increasing the load. You can, and + should, control the MaxClients setting so that your server + does not spawn so many children it starts swapping. This procedure + for doing this is simple: determine the size of your average Apache + process, by looking at your process list via a tool such as + top, and divide this into your total available memory, + leaving some room for other processes.

    + +

    Beyond that the rest is mundane: get a fast enough CPU, a + fast enough network card, and fast enough disks, where "fast + enough" is something that needs to be determined by + experimentation.

    + +

    Operating system choice is largely a matter of local + concerns. But some guidelines that have proven generally + useful are:

    + +
      +
    • +

      Run the latest stable release and patchlevel of the + operating system that you choose. Many OS suppliers have + introduced significant performance improvements to their + TCP stacks and thread libraries in recent years.

      +
    • + +
    • +

      If your OS supports a sendfile(2) system + call, make sure you install the release and/or patches + needed to enable it. (With Linux, for example, this means + using Linux 2.4 or later. For early releases of Solaris 8, + you may need to apply a patch.) On systems where it is + available, sendfile enables Apache 2 to deliver + static content faster and with lower CPU utilization.

      +
    • +
    + +
    top
    +
    +

    Run-Time Configuration Issues

    + + + + + +

    HostnameLookups and other DNS considerations

    + + + +

    Prior to Apache 1.3, HostnameLookups defaulted to On. + This adds latency to every request because it requires a + DNS lookup to complete before the request is finished. In + Apache 1.3 this setting defaults to Off. If you need + to have addresses in your log files resolved to hostnames, use the + logresolve + program that comes with Apache, or one of the numerous log + reporting packages which are available.

    + +

    It is recommended that you do this sort of postprocessing of + your log files on some machine other than the production web + server machine, in order that this activity not adversely affect + server performance.

    + +

    If you use any Allow + from domain or Deny from domain + directives (i.e., using a hostname, or a domain name, rather than + an IP address) then you will pay for + two DNS lookups (a reverse, followed by a forward lookup + to make sure that the reverse is not being spoofed). For best + performance, therefore, use IP addresses, rather than names, when + using these directives, if possible.

    + +

    Note that it's possible to scope the directives, such as + within a <Location /server-status> section. + In this case the DNS lookups are only performed on requests + matching the criteria. Here's an example which disables lookups + except for .html and .cgi files:

    + +

    + HostnameLookups off
    + <Files ~ "\.(html|cgi)$">
    + + HostnameLookups on
    +
    + </Files> +

    + +

    But even still, if you just need DNS names in some CGIs you + could consider doing the gethostbyname call in the + specific CGIs that need it.

    + + + +

    FollowSymLinks and SymLinksIfOwnerMatch

    + + + +

    Wherever in your URL-space you do not have an Options + FollowSymLinks, or you do have an Options + SymLinksIfOwnerMatch Apache will have to issue extra + system calls to check up on symlinks. One extra call per + filename component. For example, if you had:

    + +

    + DocumentRoot /www/htdocs
    + <Directory />
    + + Options SymLinksIfOwnerMatch
    +
    + </Directory> +

    + +

    and a request is made for the URI /index.html. + Then Apache will perform lstat(2) on + /www, /www/htdocs, and + /www/htdocs/index.html. The results of these + lstats are never cached, so they will occur on + every single request. If you really desire the symlinks + security checking you can do something like this:

    + +

    + DocumentRoot /www/htdocs
    + <Directory />
    + + Options FollowSymLinks
    +
    + </Directory>
    +
    + <Directory /www/htdocs>
    + + Options -FollowSymLinks +SymLinksIfOwnerMatch
    +
    + </Directory> +

    + +

    This at least avoids the extra checks for the + DocumentRoot path. + Note that you'll need to add similar sections if you + have any Alias or + RewriteRule paths + outside of your document root. For highest performance, + and no symlink protection, set FollowSymLinks + everywhere, and never set SymLinksIfOwnerMatch.

    + + + +

    AllowOverride

    + + + +

    Wherever in your URL-space you allow overrides (typically + .htaccess files) Apache will attempt to open + .htaccess for each filename component. For + example,

    + +

    + DocumentRoot /www/htdocs
    + <Directory />
    + + AllowOverride all
    +
    + </Directory> +

    + +

    and a request is made for the URI /index.html. + Then Apache will attempt to open /.htaccess, + /www/.htaccess, and + /www/htdocs/.htaccess. The solutions are similar + to the previous case of Options FollowSymLinks. + For highest performance use AllowOverride None + everywhere in your filesystem.

    + + + +

    Negotiation

    + + + +

    If at all possible, avoid content-negotiation if you're + really interested in every last ounce of performance. In + practice the benefits of negotiation outweigh the performance + penalties. There's one case where you can speed up the server. + Instead of using a wildcard such as:

    + +

    + DirectoryIndex index +

    + +

    Use a complete list of options:

    + +

    + DirectoryIndex index.cgi index.pl index.shtml index.html +

    + +

    where you list the most common choice first.

    + +

    Also note that explicitly creating a type-map + file provides better performance than using + MultiViews, as the necessary information can be + determined by reading this single file, rather than having to + scan the directory for files.

    + +

    If your site needs content negotiation consider using + type-map files, rather than the Options + MultiViews directive to accomplish the negotiation. See the + Content Negotiation + documentation for a full discussion of the methods of negotiation, + and instructions for creating type-map files.

    + + + +

    Memory-mapping

    + + + +

    In situations where Apache 2.x needs to look at the contents + of a file being delivered--for example, when doing server-side-include + processing--it normally memory-maps the file if the OS supports + some form of mmap(2).

    + +

    On some platforms, this memory-mapping improves performance. + However, there are cases where memory-mapping can hurt the performance + or even the stability of the httpd:

    + +
      +
    • +

      On some operating systems, mmap does not scale + as well as read(2) when the number of CPUs increases. + On multiprocessor Solaris servers, for example, Apache 2.x sometimes + delivers server-parsed files faster when mmap is disabled.

      +
    • + +
    • +

      If you memory-map a file located on an NFS-mounted filesystem + and a process on another NFS client machine deletes or truncates + the file, your process may get a bus error the next time it tries + to access the mapped file content.

      +
    • +
    + +

    For installations where either of these factors applies, you + should use EnableMMAP off to disable the memory-mapping + of delivered files. (Note: This directive can be overridden on + a per-directory basis.)

    + + + +

    Sendfile

    + + + +

    In situations where Apache 2.x can ignore the contents of the file + to be delivered -- for example, when serving static file content -- + it normally uses the kernel sendfile support the file if the OS + supports the sendfile(2) operation.

    + +

    On most platforms, using sendfile improves performance by eliminating + separate read and send mechanics. However, there are cases where using + sendfile can harm the stability of the httpd:

    + +
      +
    • +

      Some platforms may have broken sendfile support that the build + system did not detect, especially if the binaries were built on + another box and moved to such a machine with broken sendfile support.

      +
    • +
    • +

      With an NFS-mounted files, the kernel may be unable + to reliably serve the network file through it's own cache.

      +
    • +
    + +

    For installations where either of these factors applies, you + should use EnableSendfile off to disable sendfile + delivery of file contents. (Note: This directive can be overridden + on a per-directory basis.)

    + + + +

    Process Creation

    + + + +

    Prior to Apache 1.3 the MinSpareServers, MaxSpareServers, and StartServers settings all had drastic effects on + benchmark results. In particular, Apache required a "ramp-up" + period in order to reach a number of children sufficient to serve + the load being applied. After the initial spawning of + StartServers children, + only one child per second would be created to satisfy the + MinSpareServers + setting. So a server being accessed by 100 simultaneous + clients, using the default StartServers of 5 would take on + the order 95 seconds to spawn enough children to handle + the load. This works fine in practice on real-life servers, + because they aren't restarted frequently. But does really + poorly on benchmarks which might only run for ten minutes.

    + +

    The one-per-second rule was implemented in an effort to + avoid swamping the machine with the startup of new children. If + the machine is busy spawning children it can't service + requests. But it has such a drastic effect on the perceived + performance of Apache that it had to be replaced. As of Apache + 1.3, the code will relax the one-per-second rule. It will spawn + one, wait a second, then spawn two, wait a second, then spawn + four, and it will continue exponentially until it is spawning + 32 children per second. It will stop whenever it satisfies the + MinSpareServers + setting.

    + +

    This appears to be responsive enough that it's almost + unnecessary to twiddle the MinSpareServers, MaxSpareServers and StartServers knobs. When more than 4 children are + spawned per second, a message will be emitted to the + ErrorLog. If you + see a lot of these errors then consider tuning these settings. + Use the mod_status output as a guide.

    + +

    Related to process creation is process death induced by the + MaxRequestsPerChild + setting. By default this is 0, + which means that there is no limit to the number of requests + handled per child. If your configuration currently has this set + to some very low number, such as 30, you may want to bump this + up significantly. If you are running SunOS or an old version of + Solaris, limit this to 10000 or so because of memory leaks.

    + +

    When keep-alives are in use, children will be kept busy + doing nothing waiting for more requests on the already open + connection. The default KeepAliveTimeout of 15 + seconds attempts to minimize this effect. The tradeoff here is + between network bandwidth and server resources. In no event + should you raise this above about 60 seconds, as + most of the benefits are lost.

    + + + +
    top
    +
    +

    Compile-Time Configuration Issues

    + + + +

    Choosing an MPM

    + + + +

    Apache 2.x supports pluggable concurrency models, called + Multi-Processing Modules (MPMs). + When building Apache, you must choose an MPM to use. There + are platform-specific MPMs for some platforms: + beos, mpm_netware, + mpmt_os2, and mpm_winnt. For + general Unix-type systems, there are several MPMs from which + to choose. The choice of MPM can affect the speed and scalability + of the httpd:

    + +
      + +
    • The worker MPM uses multiple child + processes with many threads each. Each thread handles + one connection at a time. Worker generally is a good + choice for high-traffic servers because it has a smaller + memory footprint than the prefork MPM.
    • + +
    • The prefork MPM uses multiple child + processes with one thread each. Each process handles + one connection at a time. On many systems, prefork is + comparable in speed to worker, but it uses more memory. + Prefork's threadless design has advantages over worker + in some situations: it can be used with non-thread-safe + third-party modules, and it is easier to debug on platforms + with poor thread debugging support.
    • + +
    + +

    For more information on these and other MPMs, please + see the MPM documentation.

    + + + +

    Modules

    + + + +

    Since memory usage is such an important consideration in + performance, you should attempt to eliminate modules that you are + not actually using. If you have built the modules as DSOs, eliminating modules is a simple + matter of commenting out the associated LoadModule directive for that module. + This allows you to experiment with removing modules, and seeing + if your site still functions in their absense.

    + +

    If, on the other hand, you have modules statically linked + into your Apache binary, you will need to recompile Apache in + order to remove unwanted modules.

    + +

    An associated question that arises here is, of course, what + modules you need, and which ones you don't. The answer here + will, of course, vary from one web site to another. However, the + minimal list of modules which you can get by with tends + to include mod_mime, mod_dir, + and mod_log_config. mod_log_config is, + of course, optional, as you can run a web site without log + files. This is, however, not recommended.

    + + + +

    Atomic Operations

    + + + +

    Some modules, such as mod_cache and + recent development builds of the worker MPM, use APR's + atomic API. This API provides atomic operations that can + be used for lightweight thread synchronization.

    + +

    By default, APR implements these operations using the + most efficient mechanism available on each target + OS/CPU platform. Many modern CPUs, for example, have + an instruction that does an atomic compare-and-swap (CAS) + operation in hardware. On some platforms, however, APR + defaults to a slower, mutex-based implementation of the + atomic API in order to ensure compatibility with older + CPU models that lack such instructions. If you are + building Apache for one of these platforms, and you plan + to run only on newer CPUs, you can select a faster atomic + implementation at build time by configuring Apache with + the --enable-nonportable-atomics option:

    + +

    + ./buildconf
    + ./configure --with-mpm=worker --enable-nonportable-atomics=yes +

    + +

    The --enable-nonportable-atomics option is + relevant for the following platforms:

    + +
      + +
    • Solaris on SPARC
      + By default, APR uses mutex-based atomics on Solaris/SPARC. + If you configure with --enable-nonportable-atomics, + however, APR generates code that uses a SPARC v8plus opcode for + fast hardware compare-and-swap. If you configure Apache with + this option, the atomic operations will be more efficient + (allowing for lower CPU utilization and higher concurrency), + but the resulting executable will run only on UltraSPARC + chips. +
    • + +
    • Linux on x86
      + By default, APR uses mutex-based atomics on Linux. If you + configure with --enable-nonportable-atomics, + however, APR generates code that uses a 486 opcode for fast + hardware compare-and-swap. This will result in more efficient + atomic operations, but the resulting executable will run only + on 486 and later chips (and not on 386). +
    • + +
    + + + +

    mod_status and ExtendedStatus On

    + + + +

    If you include mod_status and you also set + ExtendedStatus On when building and running + Apache, then on every request Apache will perform two calls to + gettimeofday(2) (or times(2) + depending on your operating system), and (pre-1.3) several + extra calls to time(2). This is all done so that + the status report contains timing indications. For highest + performance, set ExtendedStatus off (which is the + default).

    + + + +

    accept Serialization - multiple sockets

    + + + +

    Warning:

    +

    This section has not been fully updated + to take into account changes made in the 2.x version of the + Apache HTTP Server. Some of the information may still be + relevant, but please use it with care.

    +
    + +

    This discusses a shortcoming in the Unix socket API. Suppose + your web server uses multiple Listen statements to listen on either multiple + ports or multiple addresses. In order to test each socket + to see if a connection is ready Apache uses + select(2). select(2) indicates that a + socket has zero or at least one connection + waiting on it. Apache's model includes multiple children, and + all the idle ones test for new connections at the same time. A + naive implementation looks something like this (these examples + do not match the code, they're contrived for pedagogical + purposes):

    + +

    + for (;;) {
    + + for (;;) {
    + + fd_set accept_fds;
    +
    + FD_ZERO (&accept_fds);
    + for (i = first_socket; i <= last_socket; ++i) {
    + + FD_SET (i, &accept_fds);
    +
    + }
    + rc = select (last_socket+1, &accept_fds, NULL, NULL, NULL);
    + if (rc < 1) continue;
    + new_connection = -1;
    + for (i = first_socket; i <= last_socket; ++i) {
    + + if (FD_ISSET (i, &accept_fds)) {
    + + new_connection = accept (i, NULL, NULL);
    + if (new_connection != -1) break;
    +
    + }
    +
    + }
    + if (new_connection != -1) break;
    +
    + }
    + process the new_connection;
    +
    + } +

    + +

    But this naive implementation has a serious starvation problem. + Recall that multiple children execute this loop at the same + time, and so multiple children will block at + select when they are in between requests. All + those blocked children will awaken and return from + select when a single request appears on any socket + (the number of children which awaken varies depending on the + operating system and timing issues). They will all then fall + down into the loop and try to accept the + connection. But only one will succeed (assuming there's still + only one connection ready), the rest will be blocked + in accept. This effectively locks those children + into serving requests from that one socket and no other + sockets, and they'll be stuck there until enough new requests + appear on that socket to wake them all up. This starvation + problem was first documented in PR#467. There + are at least two solutions.

    + +

    One solution is to make the sockets non-blocking. In this + case the accept won't block the children, and they + will be allowed to continue immediately. But this wastes CPU + time. Suppose you have ten idle children in + select, and one connection arrives. Then nine of + those children will wake up, try to accept the + connection, fail, and loop back into select, + accomplishing nothing. Meanwhile none of those children are + servicing requests that occurred on other sockets until they + get back up to the select again. Overall this + solution does not seem very fruitful unless you have as many + idle CPUs (in a multiprocessor box) as you have idle children, + not a very likely situation.

    + +

    Another solution, the one used by Apache, is to serialize + entry into the inner loop. The loop looks like this + (differences highlighted):

    + +

    + for (;;) {
    + + accept_mutex_on ();
    + for (;;) {
    + + fd_set accept_fds;
    +
    + FD_ZERO (&accept_fds);
    + for (i = first_socket; i <= last_socket; ++i) {
    + + FD_SET (i, &accept_fds);
    +
    + }
    + rc = select (last_socket+1, &accept_fds, NULL, NULL, NULL);
    + if (rc < 1) continue;
    + new_connection = -1;
    + for (i = first_socket; i <= last_socket; ++i) {
    + + if (FD_ISSET (i, &accept_fds)) {
    + + new_connection = accept (i, NULL, NULL);
    + if (new_connection != -1) break;
    +
    + }
    +
    + }
    + if (new_connection != -1) break;
    +
    + }
    + accept_mutex_off ();
    + process the new_connection;
    +
    + } +

    + +

    The functions + accept_mutex_on and accept_mutex_off + implement a mutual exclusion semaphore. Only one child can have + the mutex at any time. There are several choices for + implementing these mutexes. The choice is defined in + src/conf.h (pre-1.3) or + src/include/ap_config.h (1.3 or later). Some + architectures do not have any locking choice made, on these + architectures it is unsafe to use multiple + Listen + directives.

    + +

    The directive AcceptMutex can be used to + change the selected mutex implementation at run-time.

    + +
    +
    AcceptMutex flock
    + +
    +

    This method uses the flock(2) system call to + lock a lock file (located by the LockFile directive).

    +
    + +
    AcceptMutex fcntl
    + +
    +

    This method uses the fcntl(2) system call to + lock a lock file (located by the LockFile directive).

    +
    + +
    AcceptMutex sysvsem
    + +
    +

    (1.3 or later) This method uses SysV-style semaphores to + implement the mutex. Unfortunately SysV-style semaphores have + some bad side-effects. One is that it's possible Apache will + die without cleaning up the semaphore (see the + ipcs(8) man page). The other is that the + semaphore API allows for a denial of service attack by any + CGIs running under the same uid as the webserver + (i.e., all CGIs, unless you use something like + suexec or cgiwrapper). For these + reasons this method is not used on any architecture except + IRIX (where the previous two are prohibitively expensive + on most IRIX boxes).

    +
    + +
    AcceptMutex pthread
    + +
    +

    (1.3 or later) This method uses POSIX mutexes and should + work on any architecture implementing the full POSIX threads + specification, however appears to only work on Solaris (2.5 + or later), and even then only in certain configurations. If + you experiment with this you should watch out for your server + hanging and not responding. Static content only servers may + work just fine.

    +
    + +
    AcceptMutex posixsem
    + +
    +

    (2.0 or later) This method uses POSIX semaphores. The + semaphore ownership is not recovered if a thread in the process + holding the mutex segfaults, resulting in a hang of the web + server.

    +
    + +
    + +

    If your system has another method of serialization which + isn't in the above list then it may be worthwhile adding code + for it to APR.

    + +

    Another solution that has been considered but never + implemented is to partially serialize the loop -- that is, let + in a certain number of processes. This would only be of + interest on multiprocessor boxes where it's possible multiple + children could run simultaneously, and the serialization + actually doesn't take advantage of the full bandwidth. This is + a possible area of future investigation, but priority remains + low because highly parallel web servers are not the norm.

    + +

    Ideally you should run servers without multiple + Listen + statements if you want the highest performance. + But read on.

    + + + +

    accept Serialization - single socket

    + + + +

    The above is fine and dandy for multiple socket servers, but + what about single socket servers? In theory they shouldn't + experience any of these same problems because all children can + just block in accept(2) until a connection + arrives, and no starvation results. In practice this hides + almost the same "spinning" behaviour discussed above in the + non-blocking solution. The way that most TCP stacks are + implemented, the kernel actually wakes up all processes blocked + in accept when a single connection arrives. One of + those processes gets the connection and returns to user-space, + the rest spin in the kernel and go back to sleep when they + discover there's no connection for them. This spinning is + hidden from the user-land code, but it's there nonetheless. + This can result in the same load-spiking wasteful behaviour + that a non-blocking solution to the multiple sockets case + can.

    + +

    For this reason we have found that many architectures behave + more "nicely" if we serialize even the single socket case. So + this is actually the default in almost all cases. Crude + experiments under Linux (2.0.30 on a dual Pentium pro 166 + w/128Mb RAM) have shown that the serialization of the single + socket case causes less than a 3% decrease in requests per + second over unserialized single-socket. But unserialized + single-socket showed an extra 100ms latency on each request. + This latency is probably a wash on long haul lines, and only an + issue on LANs. If you want to override the single socket + serialization you can define + SINGLE_LISTEN_UNSERIALIZED_ACCEPT and then + single-socket servers will not serialize at all.

    + + + +

    Lingering Close

    + + + +

    As discussed in + draft-ietf-http-connection-00.txt section 8, in order for + an HTTP server to reliably implement the + protocol it needs to shutdown each direction of the + communication independently (recall that a TCP connection is + bi-directional, each half is independent of the other). This + fact is often overlooked by other servers, but is correctly + implemented in Apache as of 1.2.

    + +

    When this feature was added to Apache it caused a flurry of + problems on various versions of Unix because of a + shortsightedness. The TCP specification does not state that the + FIN_WAIT_2 state has a timeout, but it doesn't prohibit it. + On systems without the timeout, Apache 1.2 induces many sockets + stuck forever in the FIN_WAIT_2 state. In many cases this + can be avoided by simply upgrading to the latest TCP/IP patches + supplied by the vendor. In cases where the vendor has never + released patches (i.e., SunOS4 -- although folks with + a source license can patch it themselves) we have decided to + disable this feature.

    + +

    There are two ways of accomplishing this. One is the socket + option SO_LINGER. But as fate would have it, this + has never been implemented properly in most TCP/IP stacks. Even + on those stacks with a proper implementation (i.e., + Linux 2.0.31) this method proves to be more expensive (cputime) + than the next solution.

    + +

    For the most part, Apache implements this in a function + called lingering_close (in + http_main.c). The function looks roughly like + this:

    + +

    + void lingering_close (int s)
    + {
    + + char junk_buffer[2048];
    +
    + /* shutdown the sending side */
    + shutdown (s, 1);
    +
    + signal (SIGALRM, lingering_death);
    + alarm (30);
    +
    + for (;;) {
    + + select (s for reading, 2 second timeout);
    + if (error) break;
    + if (s is ready for reading) {
    + + if (read (s, junk_buffer, sizeof (junk_buffer)) <= 0) {
    + + break;
    +
    + }
    + /* just toss away whatever is here */
    +
    + }
    +
    + }
    +
    + close (s);
    +
    + } +

    + +

    This naturally adds some expense at the end of a connection, + but it is required for a reliable implementation. As HTTP/1.1 + becomes more prevalent, and all connections are persistent, + this expense will be amortized over more requests. If you want + to play with fire and disable this feature you can define + NO_LINGCLOSE, but this is not recommended at all. + In particular, as HTTP/1.1 pipelined persistent connections + come into use lingering_close is an absolute + necessity (and + pipelined connections are faster, so you want to support + them).

    + + + +

    Scoreboard File

    + + + +

    Apache's parent and children communicate with each other + through something called the scoreboard. Ideally this should be + implemented in shared memory. For those operating systems that + we either have access to, or have been given detailed ports + for, it typically is implemented using shared memory. The rest + default to using an on-disk file. The on-disk file is not only + slow, but it is unreliable (and less featured). Peruse the + src/main/conf.h file for your architecture and + look for either USE_MMAP_SCOREBOARD or + USE_SHMGET_SCOREBOARD. Defining one of those two + (as well as their companions HAVE_MMAP and + HAVE_SHMGET respectively) enables the supplied + shared memory code. If your system has another type of shared + memory, edit the file src/main/http_main.c and add + the hooks necessary to use it in Apache. (Send us back a patch + too please.)

    + +
    Historical note: The Linux port of Apache didn't start to + use shared memory until version 1.2 of Apache. This oversight + resulted in really poor and unreliable behaviour of earlier + versions of Apache on Linux.
    + + + +

    DYNAMIC_MODULE_LIMIT

    + + + +

    If you have no intention of using dynamically loaded modules + (you probably don't if you're reading this and tuning your + server for every last ounce of performance) then you should add + -DDYNAMIC_MODULE_LIMIT=0 when building your + server. This will save RAM that's allocated only for supporting + dynamically loaded modules.

    + + + +
    top
    +
    +

    Appendix: Detailed Analysis of a Trace

    + + + +

    Here is a system call trace of Apache 2.0.38 with the worker MPM + on Solaris 8. This trace was collected using:

    + +

    + truss -l -p httpd_child_pid. +

    + +

    The -l option tells truss to log the ID of the + LWP (lightweight process--Solaris's form of kernel-level thread) + that invokes each system call.

    + +

    Other systems may have different system call tracing utilities + such as strace, ktrace, or par. + They all produce similar output.

    + +

    In this trace, a client has requested a 10KB static file + from the httpd. Traces of non-static requests or requests + with content negotiation look wildly different (and quite ugly + in some cases).

    + +
    /67:    accept(3, 0x00200BEC, 0x00200C0C, 1) (sleeping...)
    +/67:    accept(3, 0x00200BEC, 0x00200C0C, 1)            = 9
    + +

    In this trace, the listener thread is running within LWP #67.

    + +
    Note the lack of accept(2) serialization. On this + particular platform, the worker MPM uses an unserialized accept by + default unless it is listening on multiple ports.
    + +
    /65:    lwp_park(0x00000000, 0)                         = 0
    +/67:    lwp_unpark(65, 1)                               = 0
    + +

    Upon accepting the connection, the listener thread wakes up + a worker thread to do the request processing. In this trace, + the worker thread that handles the request is mapped to LWP #65.

    + +
    /65:    getsockname(9, 0x00200BA4, 0x00200BC4, 1)       = 0
    + +

    In order to implement virtual hosts, Apache needs to know + the local socket address used to accept the connection. It + is possible to eliminate this call in many situations (such + as when there are no virtual hosts, or when + Listen directives + are used which do not have wildcard addresses). But + no effort has yet been made to do these optimizations.

    + +
    /65:    brk(0x002170E8)                                 = 0
    +/65:    brk(0x002190E8)                                 = 0
    + +

    The brk(2) calls allocate memory from the heap. + It is rare to see these in a system call trace, because the httpd + uses custom memory allocators (apr_pool and + apr_bucket_alloc) for most request processing. + In this trace, the httpd has just been started, so it must + call malloc(3) to get the blocks of raw memory + with which to create the custom memory allocators.

    + +
    /65:    fcntl(9, F_GETFL, 0x00000000)                   = 2
    +/65:    fstat64(9, 0xFAF7B818)                          = 0
    +/65:    getsockopt(9, 65535, 8192, 0xFAF7B918, 0xFAF7B910, 2190656) = 0
    +/65:    fstat64(9, 0xFAF7B818)                          = 0
    +/65:    getsockopt(9, 65535, 8192, 0xFAF7B918, 0xFAF7B914, 2190656) = 0
    +/65:    setsockopt(9, 65535, 8192, 0xFAF7B918, 4, 2190656) = 0
    +/65:    fcntl(9, F_SETFL, 0x00000082)                   = 0
    + +

    Next, the worker thread puts the connection to the client (file + descriptor 9) in non-blocking mode. The setsockopt(2) + and getsockopt(2) calls are a side-effect of how + Solaris's libc handles fcntl(2) on sockets.

    + +
    /65:    read(9, " G E T   / 1 0 k . h t m".., 8000)     = 97
    + +

    The worker thread reads the request from the client.

    + +
    /65:    stat("/var/httpd/apache/httpd-8999/htdocs/10k.html", 0xFAF7B978) = 0
    +/65:    open("/var/httpd/apache/httpd-8999/htdocs/10k.html", O_RDONLY) = 10
    + +

    This httpd has been configured with Options FollowSymLinks + and AllowOverride None. Thus it doesn't need to + lstat(2) each directory in the path leading up to the + requested file, nor check for .htaccess files. + It simply calls stat(2) to verify that the file: + 1) exists, and 2) is a regular file, not a directory.

    + +
    /65:    sendfilev(0, 9, 0x00200F90, 2, 0xFAF7B53C)      = 10269
    + +

    In this example, the httpd is able to send the HTTP response + header and the requested file with a single sendfilev(2) + system call. Sendfile semantics vary among operating systems. On some other + systems, it is necessary to do a write(2) or + writev(2) call to send the headers before calling + sendfile(2).

    + +
    /65:    write(4, " 1 2 7 . 0 . 0 . 1   -  ".., 78)      = 78
    + +

    This write(2) call records the request in the + access log. Note that one thing missing from this trace is a + time(2) call. Unlike Apache 1.3, Apache 2.x uses + gettimeofday(3) to look up the time. On some operating + systems, like Linux or Solaris, gettimeofday has an + optimized implementation that doesn't require as much overhead + as a typical system call.

    + +
    /65:    shutdown(9, 1, 1)                               = 0
    +/65:    poll(0xFAF7B980, 1, 2000)                       = 1
    +/65:    read(9, 0xFAF7BC20, 512)                        = 0
    +/65:    close(9)                                        = 0
    + +

    The worker thread does a lingering close of the connection.

    + +
    /65:    close(10)                                       = 0
    +/65:    lwp_park(0x00000000, 0)         (sleeping...)
    + +

    Finally the worker thread closes the file that it has just delivered + and blocks until the listener assigns it another connection.

    + +
    /67:    accept(3, 0x001FEB74, 0x001FEB94, 1) (sleeping...)
    + +

    Meanwhile, the listener thread is able to accept another connection + as soon as it has dispatched this connection to a worker thread (subject + to some flow-control logic in the worker MPM that throttles the listener + if all the available workers are busy). Though it isn't apparent from + this trace, the next accept(2) can (and usually does, under + high load conditions) occur in parallel with the worker thread's handling + of the just-accepted connection.

    + +
    +
    +

    Available Languages:  en  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/misc/perf-tuning.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/misc/perf-tuning.html.ko.euc-kr new file mode 100644 index 00000000..b5443b1e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/misc/perf-tuning.html.ko.euc-kr @@ -0,0 +1,978 @@ + + + +¾ÆÆÄÄ¡ ¼º´ÉÇâ»ó - Apache HTTP Server + + + + + +
    <-
    +

    ¾ÆÆÄÄ¡ ¼º´ÉÇâ»ó

    +
    +

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

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

    ¾ÆÆÄÄ¡ 2.0Àº ±â´É°ú Æ÷Æð¡´É¼º°ú ¼º´ÉÀÇ ±ÕÇüÀÌ ¸Âµµ·Ï + ¼³°èÇÑ ¹ü¿ë À¥¼­¹öÀÌ´Ù. º¥Ä¡¸¶Å© ±â·ÏÀ» ¼¼¿ì±âÀ§ÇØ ¼³°èÇÏÁö + ¾Ê¾ÒÁö¸¸ ¾ÆÆÄÄ¡ 2.0Àº ½ÇÁ¦ ¸¹Àº °æ¿ì ³ôÀº ¼º´ÉÀ» ³½´Ù.

    + +

    ¾ÆÆÄÄ¡ 1.3°ú ºñ±³Çؼ­ 2.0 ¹öÀüÀº 󸮷®°ú È®À强(scalability)À» + ³ôÀ̱âÀ§ÇØ ¸¹Àº ÃÖÀûÈ­¸¦ Çß´Ù. ±âº»°ªÀ¸·Î ´ëºÎºÐ ÃÖÀûÈ­ÇÑ + °ªÀ» »ç¿ëÇÑ´Ù. ±×·¯³ª ÄÄÆÄÀϽà ȤÀº ½ÇÇà½Ã ¼³Á¤ÀÌ ¼º´É¿¡ + Å« ¿µÇâÀ» ÁÙ ¼ö ÀÖ´Ù. ÀÌ ¹®¼­´Â ¾ÆÆÄÄ¡ 2.0ÀÇ ¼º´ÉÀ» Çâ»óÇϱâÀ§ÇØ + ¼­¹ö °ü¸®ÀÚ°¡ ¼³Á¤ÇÒ ¼ö ÀÖ´Â ¿É¼ÇÀ» ¼³¸íÇÑ´Ù. ¾î¶² ¼³Á¤ + ¿É¼ÇÀº À¥¼­¹ö°¡ Çϵå¿þ¾î¿Í ¿î¿µÃ¼Á¦ÀÇ ±â´ÉÀ» ´õ Àß È°¿ëÇϵµ·Ï + ÇÏ´Â ¹Ý¸é, ¾î¶² ¿É¼ÇÀº ¼Óµµ¸¦ À§ÇØ ±â´ÉÀ» Èñ»ýÇÑ´Ù.

    + +
    + +
    top
    +
    +

    Çϵå¿þ¾î¿Í ¿î¿µÃ¼Á¦¿¡ ´ëÇؼ­

    + + + +

    À¥¼­¹ö ¼º´É¿¡ °¡Àå Å« ¿µÇâÀ» ÁÖ´Â °ÍÀº ¸Þ¸ð¸®´Ù. ½º¿ÒÀº + ¿äû´ç Áö¿¬½Ã°£À» »ç¿ëÀÚ°¡ "ÃæºÐÈ÷ ºü¸£´Ù°í" »ý°¢ÇÏÁö ¸øÇÏ°Ô + ´Ã¸®±â¶§¹®¿¡ À¥¼­¹ö´Â ½º¿ÒÀ» ÇÏ¸é ¾ÈµÈ´Ù. ´À·ÁÁö¸é »ç¿ëÀÚ´Â + Á¤ÁöÇÏ°í ´Ù½Ã Á¢¼ÓÇÏ¿© ºÎÇÏ°¡ °è¼Ó Áõ°¡ÇÑ´Ù. MaxClients Áö½Ã¾î¸¦ Á¶ÀýÇÏ¿© + À¥¼­¹ö°¡ ½º¿ÒÀ» ÇÒ Á¤µµ·Î ¸¹Àº ÀÚ½ÄÀ» ¸¸µéÁö¾Êµµ·Ï ÇØ¾ß + ÇÑ´Ù. ¹æ¹ýÀº °£´ÜÇÏ´Ù: top°ú °°Àº µµ±¸¿¡¼­ + ÇÁ·Î¼¼½º ¸ñ·ÏÀ» º¸°í ¾ÆÆÄÄ¡ ÇÁ·Î¼¼½ºÀÇ Æò±Õ ¸Þ¸ð¸® »ç¿ë·®À» + ¾Ë¾Æ³½ÈÄ, Àüü »ç¿ë°¡´ÉÇÑ ¸Þ¸ð¸®¿¡¼­ ´Ù¸¥ ÇÁ·Î¼¼½ºµéÀÌ »ç¿ëÇÒ + °ø°£À» »« °ª¿¡¼­ ³ª´«´Ù.

    + +

    ³ª¸ÓÁö´Â Æò¹üÇÏ´Ù: ÃæºÐÈ÷ ºü¸¥ CPU, ÃæºÐÈ÷ ºü¸¥ ³×Æ®¿÷Ä«µå, + ÃæºÐÈ÷ ºü¸¥ µð½ºÅ©, ¿©±â¼­ "ÃæºÐÈ÷ ºü¸¥"Àº ½ÇÇèÀ» Çؼ­ °áÁ¤ÇØ¾ß + ÇÑ´Ù.

    + +

    ¿î¿µÃ¼Á¦´Â º¸Åë °¢ÀÚ ¾Ë¾Æ¼­ ¼±ÅÃÇÒ ÀÏÀÌ´Ù. ±×·¯³ª ÀϹÝÀûÀ¸·Î + À¯¿ëÇÏ´Ù°í ÆǸíµÈ ¸î°¡Áö ÁöħÀÌ ÀÖ´Ù:

    + +
      +
    • +

      ¼±ÅÃÇÑ ¿î¿µÃ¼Á¦ÀÇ ÃֽŠ¾ÈÁ¤ ¹öÀü°ú ÆÐÄ¡¸¦ ½ÇÇàÇÑ´Ù. + ¸¹Àº ¿î¿µÃ¼Á¦ Á¦ÀÛ»ç´Â ÃÖ±Ù TCP ½ºÅðú ¾²·¹µå ¶óÀ̺귯¸®¿¡ + ¸¹Àº ¼ÓµµÇâ»óÀ» Çß´Ù.

      +
    • + +
    • +

      ¿î¿µÃ¼Á¦°¡ sendfile(2) ½Ã½ºÅÛÈ£ÃâÀ» + Áö¿øÇÑ´Ù¸é, À̸¦ »ç¿ëÇϱâÀ§ÇÑ ¹öÀüÀ̳ª ÆÐÄ¡¸¦ ¼³Ä¡ÇÏ¿´´ÂÁö + È®ÀÎÇÑ´Ù. (¿¹¸¦ µé¾î, ¸®´ª½º¶ó¸é 2.4 ÀÌ»ó ¹öÀüÀ» ¶æÇÑ´Ù. + Solaris 8 Ãʱ⠹öÀüÀº ÆÐÄ¡°¡ ÇÊ¿äÇÏ´Ù.) Áö¿øÇÏ´Â ½Ã½ºÅÛÀ̶ó¸é + ¾ÆÆÄÄ¡ 2´Â sendfileÀ» »ç¿ëÇÏ¿© CPU¸¦ ´ú + »ç¿ëÇϸç Á¤Àû ÆÄÀÏÀ» ´õ »¡¸® Àü¼ÛÇÒ ¼ö ÀÕ´Ù.

      +
    • +
    + +
    top
    +
    +

    ½ÇÇà½Ã ¼³Á¤¿¡ ´ëÇؼ­

    + + + + + +

    HostnameLookups¿Í DNS¿¡ ´ëÇØ °í·ÁÇÒ Á¡µé

    + + + +

    ¾ÆÆÄÄ¡ 1.3 ÀÌÀü¿¡ HostnameLookupsÀÇ ±âº»°ªÀº + OnÀÌ¿´´Ù. ¿äûÀ» ¸¶Ä¡±âÀü¿¡ DNS °Ë»öÀÌ ³¡³ª¾ß + ÇϹǷΠ¿äû¸¶´Ù Áö¿¬ÀÌ »ý°å´Ù. ¾ÆÆÄÄ¡ 1.3¿¡¼­ ÀÌ ¼³Á¤ÀÇ + ±âº»°ªÀÌ Off·Î º¯°æµÇ¾ú´Ù. ·Î±×ÆÄÀÏÀÇ ÁÖ¼Ò¸¦ + È£½ºÆ®¸íÀ¸·Î º¯È¯ÇÏ·Á¸é ¿©·¯ ·Î±×ó¸® ÇÁ·Î±×·¥Áß ÇϳªÀÎ, + ¾ÆÆÄÄ¡¿¡ Æ÷ÇÔµÈ logresolve + ÇÁ·Î±×·¥À» »ç¿ëÇ϶ó.

    + +

    ·Î±×ó¸® ÀÛ¾÷ÀÌ ¼­¹ö ¼º´É¿¡ ¾Ç¿µÇâÀ» ¹ÌÄ¡¹Ç·Î ½ÇÁ¦ + »ç¿ëÇÏ´Â À¥¼­¹ö°¡ ¾Æ´Ñ ´Ù¸¥ ÄÄÇ»ÅÍ¿¡¼­ ·Î±×ÆÄÀÏÀ» ÈÄó¸®Çϱæ + ¹Ù¶õ´Ù.

    + +

    Allow + from domainÀ̳ª Deny from domain + Áö½Ã¾î¸¦ »ç¿ëÇÑ´Ù¸é (Áï, IP ÁÖ¼Ò°¡ ¾Æ´Ñ È£½ºÆ®¸íÀ̳ª µµ¸ÞÀθíÀ» + »ç¿ëÇÑ´Ù¸é) ºÎµæÀÌ Áߺ¹-¿ª DNS °Ë»öÀ» (¿ª°Ë»öÀ» ÇÑÈÄ ¾ÇÀÇ·Î + º¯°æµÇ¾ú´ÂÁö È®ÀÎÇϱâÀ§ÇØ ´Ù½Ã °Ë»ö) ÇØ¾ß ÇÑ´Ù. ±×·¯¹Ç·Î + ¼º´ÉÀ» ³ôÀ̱âÀ§ÇØ ÀÌ·± Áö½Ã¾î¿¡´Â °¡´ÉÇϸé À̸§´ë½Å IP + ÁÖ¼Ò¸¦ »ç¿ëÇÑ´Ù.

    + +

    <Location /server-status> ¼½¼Ç µîÀ¸·Î + Áö½Ã¾îÀÇ Àû¿ë¹üÀ§¸¦ Á¦ÇÑÇÒ ¼ö ÀÖÀ½À» ±â¾ïÇ϶ó. ÀÌ °æ¿ì + Á¶°Ç¿¡ ¸Â´Â ¿äû¿¡¸¸ DNS Á¶È¸¸¦ ÇÑ´Ù. ´ÙÀ½Àº + .html°ú .cgi ÆÄÀϸ¸ DNS °Ë»öÀ» + ÇÏ´Â ¿¹Á¦´Ù:

    + +

    + HostnameLookups off
    + <Files ~ "\.(html|cgi)$">
    + + HostnameLookups on
    +
    + </Files> +

    + +

    ±×·¯³ª CGI¿¡¼­ DNS¸íÀÌ ÇÊ¿äÇÒ »ÓÀ̶ó¸é, ÇÊ¿äÇÑ Æ¯Á¤ + CGI¿¡¼­¸¸ gethostbyname È£ÃâÀ» Çϵµ·Ï °í·ÁÇغ¼ + ¼ö ÀÖ´Ù.

    + + + +

    FollowSymLinks¿Í SymLinksIfOwnerMatch

    + + + +

    URL °ø°£¿¡¼­ Options FollowSymLinks¸¦ + »ç¿ëÇÏÁö¾Ê°í Options SymLinksIfOwnerMatch¸¦ + »ç¿ëÇÏ¸é ¾ÆÆÄÄ¡´Â ½Éº¼¸µÅ©¸¦ °Ë»çÇϱâÀ§ÇØ ½Ã½ºÅÛÈ£ÃâÀ» + Çѹø ´õ ÇØ¾ß ÇÑ´Ù. ÆÄÀϸíÀÇ °¢ ºÎºÐ¸¶´Ù Çѹø¾¿ ´õ È£ÃâÀ» + ÇÑ´Ù. ¿¹¸¦ µé¾î, ¼³Á¤ÀÌ ´ÙÀ½°ú °°°í:

    + +

    + DocumentRoot /www/htdocs
    + <Directory />
    + + Options SymLinksIfOwnerMatch
    +
    + </Directory> +

    + +

    /index.html URI¿¡ ´ëÇÑ ¿äûÀÌ ÀÖ´Ù°í °¡Á¤ÇÏÀÚ. + ±×·¯¸é ¾ÆÆÄÄ¡´Â /www, /www/htdocs, + /www/htdocs/index.html °¢°¢¿¡ ´ëÇØ + lstat(2)¸¦ È£ÃâÇÑ´Ù. lstats + °á°ú¸¦ ij½ÌÇÏÁö ¾Ê±â¶§¹®¿¡ ¿äûÀÌ µé¾î¿Ã ¶§¸¶´Ù ¸Å¹ø °°Àº + ÀÛ¾÷À» ÇÑ´Ù. ÁøÂ¥ ½Éº¼¸µÅ© º¸¾È °Ë»ç¸¦ ¿øÇÑ´Ù¸é ´ÙÀ½°ú + °°ÀÌ ÇÒ ¼ö ÀÖ´Ù:

    + +

    + DocumentRoot /www/htdocs
    + <Directory />
    + + Options FollowSymLinks
    +
    + </Directory>
    +
    + <Directory /www/htdocs>
    + + Options -FollowSymLinks +SymLinksIfOwnerMatch
    +
    + </Directory> +

    + +

    ÀÌ °æ¿ì ÃÖ¼ÒÇÑ DocumentRoot °æ·Î´Â °Ë»çÇÏÁö + ¾Ê´Â´Ù. DocumentRoot ¹Û¿¡ ÀÖ´Â °æ·Î·Î Alias³ª RewriteRuleÀ» »ç¿ëÇÑ + °æ¿ì¿¡µµ À§¿Í ºñ½ÁÇÑ ¼½¼ÇÀÌ ÇÊ¿äÇÏ´Ù. ½Éº¼¸µÅ© º¸¾ÈÀ» + °í·ÁÇÏÁö ¾Ê°í ÃÖ°íÀÇ ¼º´ÉÀ» ¾òÀ¸·Á¸é, + FollowSymLinks¸¦ ¼³Á¤ÇÏ°í, + SymLinksIfOwnerMatch´Â Àý´ë·Î ¾ÈµÈ´Ù.

    + + + +

    AllowOverride

    + + + +

    URL °ø°£¿¡¼­ overrides¸¦ Çã¿ëÇÑ´Ù¸é (º¸Åë + .htaccess ÆÄÀÏ) ¾ÆÆÄÄ¡´Â ÆÄÀϸíÀÇ °¢ ºÎºÐ¸¶´Ù + .htaccess¸¦ ¿­±æ ½ÃµµÇÑ´Ù. ¿¹¸¦ µé¾î,

    + +

    + DocumentRoot /www/htdocs
    + <Directory />
    + + AllowOverride all
    +
    + </Directory> +

    + +

    /index.html URI¿¡ ´ëÇÑ ¿äûÀÌ ÀÖ´Ù°í °¡Á¤ÇÏÀÚ. + ¾ÆÆÄÄ¡´Â /.htaccess, /www/.htaccess, + /www/htdocs/.htaccess¸¦ ¿­·Á°í ½ÃµµÇÑ´Ù. + ÇØ°áÃ¥Àº ¾ÕÀÇ Options FollowSymLinks °æ¿ì¿Í + ºñ½ÁÇÏ´Ù. ÃÖ°íÀÇ ¼º´ÉÀ» ¾òÀ¸·Á¸é ÆÄÀϽýºÅÛ¿¡ ´ëÇؼ­ Ç×»ó + AllowOverride NoneÀ» »ç¿ëÇÑ´Ù.

    + + + +

    ³»¿ëÇù»ó

    + + + +

    °¡´ÉÇÏ°í ÁøÂ¥ Á¶±ÝÀÇ ¼º´ÉÇâ»ó¿¡µµ °ü½ÉÀÌ ÀÖ´Ù¸é ³»¿ëÇù»óÀ» + ¸·´Â´Ù. ½ÇÁ¦·Î Çù»óÀÇ À̵æÀº ¼º´ÉÀúÇϺ¸´Ù ÀÛ´Ù. ¼­¹ö¸¦ + ºü¸£°Ô ÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½°ú °°ÀÌ ¿ÍÀϵåÄ«µå¸¦ »ç¿ëÇÏ´Â ´ë½Å:

    + +

    + DirectoryIndex index +

    + +

    ¿ÏÀüÇÑ ¸ñ·ÏÀ» »ç¿ëÇÑ´Ù:

    + +

    + DirectoryIndex index.cgi index.pl index.shtml index.html +

    + +

    °¡Àå ÈçÇÑ °ÍÀ» ¾Õ¿¡ µÐ´Ù.

    + +

    ¶Ç, µð·ºÅ丮¿¡¼­ ÆÄÀϵéÀ» ã´Â MultiViews + º¸´Ù´Â, ÇÑ ÆÄÀϸ¸ ÀÐÀ¸¸é ÇÊ¿äÇÑ Á¤º¸¸¦ ¾òÀ» ¼ö ÀÖ´Â + type-map ÆÄÀÏÀ» Á÷Á¢ ¸¸µå´Â °ÍÀÌ ´õ ºü¸§À» + ¸í½ÉÇ϶ó.

    + +

    »çÀÌÆ®¿¡ ³»¿ëÇù»óÀÌ ÇÊ¿äÇÏ´Ù¸é Çù»óÀ» À§ÇØ Options + MultiViews Áö½Ã¾î¸¦ »ç¿ëÇϱ⺸´Ù type-map + ÆÄÀÏÀ» °í·ÁÇ϶ó. Çù»ó¹æ¹ý¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ¼³¸í°ú + type-map ÆÄÀÏÀ» ¸¸µå´Â ¹æ¹ýÀº ³»¿ëÇù»ó ¹®¼­¸¦ Âü°íÇ϶ó.

    + + + +

    ¸Þ¸ð¸®´ëÀÀ (memory-mapping)

    + + + +

    ¿¹¸¦ µé¾î, server-side-include¸¦ ó¸®ÇÏ´Â µî ¾ÆÆÄÄ¡ + 2.0ÀÌ Àü¼ÛÇÒ ÆÄÀÏÀ» ÀÐÀ»¶§ ¿î¿µÃ¼Á¦°¡ mmap(2) + µîÀ» Áö¿øÇÑ´Ù¸é ÆÄÀÏÀ» ¸Þ¸ð¸®´ëÀÀÇÑ´Ù.

    + +

    ¿©·¯ Ç÷¡Æû¿¡¼­ ¸Þ¸ð¸®´ëÀÀÀ» ¼º´ÉÀ» Çâ»óÇÑ´Ù. ±×·¯³ª + ¸Þ¸ð¸®´ëÀÀÀÌ ¼­¹öÀÇ ¼º´ÉÀ» ¶³¾îÆ®¸®°í ½ÉÁö¾î ¾ÈÁ¤¼ºÀ» + ÇØÄ¡´Â °æ¿ì°¡ ÀÖ´Ù:

    + +
      +
    • +

      ¾î¶² ¿î¿µÃ¼Á¦¿¡¼­ mmapÀº CPU °³¼ö°¡ + ¸¹¾ÆÁú¶§ read(2) ¸¸Å­ È®À强ÀÌ ÁÁÁö ¾Ê´Ù. + ¿¹¸¦ µé¾î, ´ÙÁßÇÁ·Î¼¼¼­ Solaris ¼­¹ö¿¡¼­ ¾ÆÆÄÄ¡ 2.0Àº + Á¾Á¾ mmapÀ» »ç¿ëÇÏÁö ¾ÊÀ»¶§ ¼­¹ö°¡ ó¸®ÇÑ + ÆÄÀÏÀ» ´õ »¡¸® Àü¼ÛÇÑ´Ù.

      +
    • + +
    • +

      NFS ¸¶¿îÆ®ÇÑ ÆÄÀϽýºÅÛ¿¡ ÀÖ´Â ÆÄÀÏÀ» ¸Þ¸ð¸®´ëÀÀÇÏ´Â + µµÁß¿¡ ´Ù¸¥ NFS Ŭ¶óÀ̾ðÆ®¿¡ ÀÖ´Â ÇÁ·Î¼¼½º°¡ ÆÄÀÏÀ» + Áö¿ì°Å³ª ÆÄÀÏÅ©±â¸¦ ÁÙÀ̸é, À¥¼­¹ö ÇÁ·Î¼¼½º°¡ ´ÙÀ½ + ¹ø¿¡ ¸Þ¸ð¸®´ëÀÀÇÑ ÆÄÀϳ»¿ëÀ» ÀÐÀ»¶§ bus error°¡ ¹ß»ýÇÒ + ¼ö ÀÖ´Ù.

      +
    • +
    + +

    À§ÀÇ Á¶°Ç¿¡ ÇØ´çÇϸé Àü¼ÛÇÏ´Â ÆÄÀÏÀ» ¸Þ¸ð¸®´ëÀÀÇÏÁö + ¾Êµµ·Ï EnableMMAP off¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù. (ÁÖÀÇ: + ÀÌ Áö½Ã¾î´Â µð·ºÅ丮º°·Î º¯°æÇÒ ¼ö ÀÖ´Ù.)

    + + + +

    Sendfile

    + + + +

    ¾ÆÆÄÄ¡´Â ¿î¿µÃ¼Á¦°¡ sendfile(2)À» Áö¿øÇϸé + Ä¿³Î sendfileÀ» »ç¿ëÇÏ¿© -- ¿¹¸¦ µé¾î, Á¤Àû ÆÄÀÏÀ» ¼­ºñ½ºÇÒ¶§ + -- Àü¼ÛÇÒ ÆÄÀÏÀ» Á÷Á¢ ÀÐÁö¾ÊÀ» ¼ö ÀÖ´Ù.

    + +

    ¿©·¯ Ç÷¡Æû¿¡¼­ sendfileÀ» »ç¿ëÇϸé read¿Í send¸¦ µû·Î + ÇÒ ÇÊ¿ä°¡ ¾ø¾î¼­ »¡¶óÁø´Ù. ±×·¯³ª sendfileÀ» »ç¿ëÇϸé + À¥¼­¹öÀÇ ¾ÈÁ¤¼ºÀ» ÇØÄ¡°ÔµÇ´Â °æ¿ì°¡ ÀÖ´Ù:

    + +
      +
    • +

      sendfile Áö¿øÀÌ À߸øµÇ¾ú°í ÄÄÆÄÀÏ ½Ã½ºÅÛÀÌ ÀÌÁ¡À» + ¹ß°ßÇÏÁö ¸øÇÏ´Â Ç÷¡ÆûÀÌ ÀÖ´Ù. ƯÈ÷ ´Ù¸¥ ÄÄÇ»ÅÍ¿¡¼­ + ½ÇÇàÆÄÀÏÀ» ÄÄÆÄÀÏÇÏ¿© sendfile Áö¿øÀÌ À߸øµÈ ÄÄÇ»ÅÍ·Î + °¡Á®¿Â °æ¿ì¿¡ °¡´ÉÇÏ´Ù.

      +
    • +
    • +

      Ä¿³ÎÀº ÀÚ½ÅÀÇ Ä³½¬¸¦ »ç¿ëÇÏ¿© NFS·Î ¸¶¿îÆ®ÇÑ ÆÄÀÏÀ» + ¾ÈÁ¤ÀûÀ¸·Î ¼­ºñ½ºÇÒ ¼ö ¾ø´Â °æ¿ì°¡ ÀÖ´Ù.

      +
    • +
    + +

    À§ÀÇ Á¶°Ç¿¡ ÇØ´çÇϸé ÆÄÀÏÀ» sendfile Àü¼ÛÇÏÁö ¾Êµµ·Ï + EnableSendfile off¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù. (ÁÖÀÇ: + ÀÌ Áö½Ã¾î´Â µð·ºÅ丮º°·Î º¯°æÇÒ ¼ö ÀÖ´Ù.)

    + + + +

    ÇÁ·Î¼¼½º »ý¼º

    + + + +

    ¾ÆÆÄÄ¡ 1.3 ÀÌÀü¿¡´Â MinSpareServers, MaxSpareServers, StartServers ¼³Á¤ÀÌ ¸ðµÎ + º¥Ä¡¸¶Å© °á°ú¿¡ Å« ¿µÇâÀ» ¹ÌÃÆ´Ù. ƯÈ÷ ¾ÆÆÄÄ¡´Â ÀÛ¾÷À» + ¼­ºñ½ºÇϱâÀ§ÇØ ÃæºÐÇÑ Àڽļö¿¡ ´Ù´Ù¸¦ ¶§±îÁö "µµ´Þ" ±â°£ÀÌ + ÇÊ¿äÇß´Ù. óÀ½ StartServers°³ ÀÚ½ÄÀ» + ¸¸µçÈÄ, MinSpareServers + ¼³Á¤°ª±îÁö ÃÊ´ç ÀÚ½ÄÀ» Çϳª¾¿ ¸¸µé¾ú´Ù. ±×·¡¼­ StartServers ±âº»°ªÀÌ + 5ÀÎ ¼­¹ö¿¡ Ŭ¶óÀ̾ðÆ® 100°³°¡ µ¿½Ã¿¡ Á¢¼ÓÇϸé + ºÎÇϸ¦ ó¸®Çϱ⿡ ÃæºÐÇÑ ÀÚ½ÄÀ» ¸¸µé±â±îÁö 95ÃÊ°¡ °É·È´Ù. + ÀÚÁÖ Àç½ÃÀÛÇÏÁö ¾Ê´Â ½ÇÁ¦ ¼­¹ö¿¡¼­´Â Àß µ¿ÀÛÇÏÁö¸¸, 10ºÐ°£¸¸ + ½ÇÇàÇÏ´Â º¥Ä¡¸¶Å© °á°ú´Â ¸Å¿ì ³ª»Ú°Ô ³ª¿Â´Ù.

    + +

    ÃÊ´ç ÇÑ°³ ±ÔÄ¢Àº ÀÚ½ÄÀ» »õ·Î ½ÃÀÛÇϸ鼭 ¼­¹ö¿¡ ¹«¸®¸¦ + ÁÖÁö ¾ÊÀ¸·Á°í Á¤Çß´Ù. ÄÄÇ»ÅÍ°¡ ÀÚ½ÄÀ» ½ÃÀÛÇÏ´À¶ó ¹Ù»Ú¸é + ¿äûÀ» ¼­ºñ½ºÇÒ ¼ö ¾ø´Ù. ±×·¯³ª ÀÌ ±ÔÄ¢ÀÌ ¾ÆÆÄÄ¡ÀÇ Ã¼°¨ + ¼º´É¿¡ ¾Ç¿µÇâÀ» ÁÖ¾î º¯°æÇÏ¿´´Ù. ¾ÆÆÄÄ¡ 1.3¿¡¼­ ÃÊ´ç ÇÑ°³ + ±ÔÄ¢Àº ¿ÏÈ­µÇ¾ú´Ù. ÄÚµå´Â ÀÚ½Ä ÇÑ°³¸¦ ¸¸µé°í, 1ÃÊ ½¬°í, + µÎ°³¸¦ ¸¸µé°í, 1ÃÊ ½¬°í, ³×°³¸¦ ¸¸µé°í, ÀÌ·± ½ÄÀ¸·Î ÃÊ´ç + ÀÚ½ÄÀ» 32°³ ¸¸µé¶§±îÁö Áö¼ö·Î Áõ°¡ÇÑ´Ù. Àڽļö°¡ MinSpareServers ¼³Á¤¿¡ ´Ù´Ù¸£¸é + Áõ°¡¸¦ Áß´ÜÇÑ´Ù.

    + +

    ÀÌ °æ¿ì ¹ÝÀÀ¼Óµµ°¡ »¡¶óÁ®¼­ MinSpareServers, MaxSpareServers, StartServers¸¦ °ÅÀÇ ¼³Á¤ÇÒ ÇÊ¿ä°¡ ¾ø´Ù. ÀÏÃÊ¿¡ + ÀÚ½ÄÀ» 4°³ ÀÌ»ó »ý¼ºÇϸé ErrorLog¿¡ ±â·ÏÇÑ´Ù. ÀÌ·± ¿À·ù¹®ÀÌ + ¸¹ÀÌ º¸À̸é ÀÌ ¼³Á¤µéÀ» Á¶ÀýÇÏ±æ ¹Ù¶õ´Ù. + mod_status °á°ú°¡ µµ¿òÀÌ µÉ °ÍÀÌ´Ù.

    + +

    ÇÁ·Î¼¼½º »ý¼º°ú °ü·ÃÇÏ¿© MaxRequestsPerChild ¼³Á¤Àº + ÇÁ·Î¼¼½º¸¦ Á¾·áÇÑ´Ù. ±âº»°ªÀº ÀڽĴç ó¸®ÇÒ ¿äû¼ö¿¡ Á¦ÇÑÀÌ + ¾ø´Ù´Â 0ÀÌ´Ù. ÇöÀç ¼³Á¤ÀÌ 30°ú + °°ÀÌ ¸Å¿ì ÀÛÀº °ªÀ¸·Î ¼³Á¤µÇÀÖ´Ù¸é, °ªÀ» »ó´çÈ÷ ³ôÈú ÇÊ¿ä°¡ + ÀÖ´Ù. SunOS³ª ¿À·¡µÈ Solaris ¹öÀüÀ» »ç¿ëÇÑ´Ù¸é, ¸Þ¸ð¸®À¯Ã⶧¹®¿¡ + ÀÌ °ªÀ» 10000 Á¤µµ·Î ¼³Á¤Ç϶ó.

    + +

    ¿¬°áÀ¯Áö(keep-alive)¸¦ »ç¿ëÇÑ´Ù¸é ÀڽĵéÀº ÀÌ¹Ì ¿­¸° + ¿¬°á¿¡¼­ Ãß°¡ ¿äûÀ» ±â´Ù¸®¸ç ¾Æ¹«°Íµµ ÇÏÁö¾Ê±â¶§¹®¿¡ °è¼Ó + ¹Ù»Ú´Ù. KeepAliveTimeoutÀÇ + ±âº»°ª 15 ÃÊ´Â ÀÌ·± Çö»óÀ» ÃÖ¼ÒÈ­ÇÑ´Ù. ³×Æ®¿÷ + ´ë¿ªÆø°ú ¼­¹ö ÀÚ¿ø °£ÀÇ ±ÕÇüÀÌ ¸Â°Ô ¼³Á¤ÇÑ´Ù. + ¿¬°áÀ¯ÁöÀÇ ´ëºÎºÐÀÇ ÀÌÁ¡ÀÌ »ç¶óÁö±â¶§¹®¿¡ ¾î¶² °æ¿ì¿¡µµ + ÀÌ °ªÀ» 60 ÃÊ ÀÌ»óÀ¸·Î ¿Ã¸®Áö ¸¶¶ó.

    + + + +
    top
    +
    +

    ÄÄÆÄÀϽà ¼³Á¤¿¡ ´ëÇؼ­

    + + + +

    MPM ¼±ÅÃ

    + + + +

    ¾ÆÆÄÄ¡ 2.x´Â ´ÙÁß󸮸ðµâ + (MPMs)À̶ó´Â ±³Ã¼ÇÒ ¼ö ÀÖ´Â µ¿±âÈ­ ¸ðµ¨À» Áö¿øÇÑ´Ù. ¾ÆÆÄÄ¡¸¦ + ÄÄÆÄÀÏÇÒ¶§ MPMÀ» ¼±ÅÃÇØ¾ß ÇÑ´Ù. beos, + mpm_netware, mpmt_os2, + mpm_winnt¿Í °°ÀÌ Æ¯Á¤ Ç÷¡Æû¿¡¼­¸¸ »ç¿ëÇÒ + ¼ö ÀÖ´Â MPMµµ ÀÖ´Ù. ÀϹÝÀûÀÎ À¯´Ð½º·ù ½Ã½ºÅÛÀº ¿©·¯ MPM + Áß¿¡ Çϳª¸¦ ¼±ÅÃÇÒ ¼ö ÀÖ´Ù. À¥¼­¹öÀÇ ¼Óµµ¿Í + È®À强(scalability)Àº ¾î¶² MPMÀ» ¼±ÅÃÇ߳Ŀ¡ ´Þ·È´Ù:

    + +
      + +
    • worker MPMÀº ¿©·¯ ÀÚ½Ä ÇÁ·Î¼¼½º°¡ + °¢°¢ ¿©·¯ ¾²·¹µå¸¦ »ç¿ëÇÑ´Ù. °¢ ¾²·¹µå´Â Çѹø¿¡ ÇÑ ¿¬°áÀ» + ´ã´çÇÑ´Ù. ÀϹÝÀûÀ¸·Î worker´Â prefork MPM º¸´Ù ÀûÀº + ¸Þ¸ð¸®¸¦ »ç¿ëÇϹǷΠÅë½Å·®ÀÌ ¸¹Àº ¼­¹ö¿¡ ÀûÀýÇÏ´Ù.
    • + +
    • prefork MPMÀº ¾²·¹µå°¡ ÇÑ°³ÀÎ ÀÚ½Ä + ÇÁ·Î¼¼½º¸¦ ¿©·¯°³ »ç¿ëÇÑ´Ù. °¢ ÇÁ·Î¼¼½º´Â Çѹø¿¡ ÇÑ + ¿¬°áÀ» ´ã´çÇÑ´Ù. ¿©·¯ ½Ã½ºÅÛ¿¡¼­ preforkÀÇ ¼Óµµ´Â worker¿Í + ºñ½ÁÇÏÁö¸¸, ´õ ¸¹Àº ¸Þ¸ð¸®¸¦ »ç¿ëÇÑ´Ù. ´ÙÀ½°ú °°Àº »óȲ¿¡¼­ + ¾²·¹µå¸¦ »ç¿ëÇÏÁö ¾Ê´Â prefork ¹æ½ÄÀÌ worker¿¡ ºñÇØ + ÀÌÁ¡À» °¡Áø´Ù: ¾²·¹µå¿¡ ¾ÈÀüÇÏÁö (thread-safe) ¾ÊÀº + Á¦»ïÀÚ°¡ ¸¸µç ¸ðµâÀ» »ç¿ëÇÒ ¼ö ÀÖ°í, ¾²·¹µå µð¹ö±ë Áö¿øÀÌ + ºó¾àÇÑ Ç÷¡Æû¿¡¼­ ½±°Ô µð¹ö±ëÇÒ ¼ö ÀÖ´Ù.
    • + +
    + +

    ÀÌ MPMµé°ú ´Ù¸¥ MPM¿¡ ´ëÇØ ´õ ÀÚ¼¼ÇÑ Á¤º¸´Â MPM ¹®¼­¸¦ Âü°íÇÏ±æ ¹Ù¶õ´Ù.

    + + + +

    ¸ðµâ

    + + + +

    ¸Þ¸ð¸® »ç¿ë·®ÀÌ ¼º´É¿¡¼­ °¡Àå Áß¿äÇÑ ¿äÀÎÀ̱⶧¹®¿¡ + ½ÇÁ¦·Î »ç¿ëÇÏÁö ¾Ê´Â ¸ðµâÀ» Á¦°ÅÇغ¸ÀÚ. ¸ðµâÀ» DSO·Î ÄÄÆÄÀÏÇß´Ù¸é °£´ÜÈ÷ ±× + ¸ðµâ¿¡ ´ëÇÑ LoadModule Áö½Ã¾î¸¦ ÁÖ¼®Ã³¸®Çϸé + µÈ´Ù. ±×·¡¼­ ¸ðµâÀ» Á¦°ÅÇÏ°í ½ÇÇàÇÏ¿© »çÀÌÆ®°¡ ¸ðµâ¾øÀ̵µ + Á¤»óÀûÀ¸·Î µ¿ÀÛÇÏ´ÂÁö »ìÆ캼 ¼ö ÀÖ´Ù.

    + +

    ¹Ý´ë·Î ¸ðµâÀÌ ¾ÆÆÄÄ¡ ½ÇÇàÆÄÀÏ¿¡ Á¤ÀûÀ¸·Î ¸µÅ©µÇÀÖ´Ù¸é + ¿øÇÏÁö ¾Ê´Â ¸ðµâÀ» Á¦°ÅÇϱâÀ§ÇØ ¾ÆÆÄÄ¡¸¦ ÀçÄÄÆÄÀÏÇØ¾ß + ÇÑ´Ù.

    + +

    ¿©±â¼­ ´ç¿¬È÷ ¾î¶² ¸ðµâÀ» »ç¿ëÇÏ°í »ç¿ëÇÏÁö ¸»Áö + Àǹ®ÀÌ »ý±ä´Ù. Á¤´äÀº À¥»çÀÌÆ®¸¶´Ù ´Ù¸£´Ù. ±×·¯³ª ¾Æ¸¶µµ + ÃÖ¼ÒÇÑ mod_mime, + mod_dir, mod_log_config + ¸ðµâÀº »ç¿ëÇÒ °ÍÀÌ´Ù. ¹°·Ð À¥»çÀÌÆ®¿¡ ·Î±×ÆÄÀÏÀÌ ÇÊ¿ä¾ø´Ù¸é + mod_log_config´Â ¾ø¾îµµ µÈ´Ù. ±×·¯³ª ÃßõÇÏÁö + ¾Ê´Â´Ù.

    + + + +

    Atomic ¸í·É

    + + + +

    mod_cache °°Àº ¸ðµâ°ú ÃÖ±Ù °³¹ßÁßÀÎ + worker MPMÀº APRÀÇ atomic API¸¦ »ç¿ëÇÑ´Ù. ÀÌ API´Â °æ·®±Þ + ¾²·¹µå µ¿±âÈ­¸¦ À§ÇÒ atomic ¸í·ÉÀ» Á¦°øÇÑ´Ù.

    + +

    ±âº»ÀûÀ¸·Î APRÀº °¢ ¿î¿µÃ¼Á¦/CPU Ç÷¡Æû¿¡¼­ °¡Àå È¿À²ÀûÀÎ + ¹æ¹ýÀ» »ç¿ëÇÏ¿© ÀÌ ¸í·ÉÀ» ±¸ÇöÇÑ´Ù. ¿¹¸¦ µé¾î, ¿©·¯ ÃֽŠ+ CPU¿¡´Â Çϵå¿þ¾î·Î atomic compare-and-swap (CAS) ¿¬»êÀ» + ÇÏ´Â ¸í·É¾î°¡ ÀÖ´Ù. ±×·¯³ª ¾î¶² Ç÷¡Æû¿¡¼­ APRÀº ÀÌ·± + ¸í·É¾î°¡ ¾ø´Â ¿À·¡µÈ CPU¿Í ȣȯ¼ºÀ» À§ÇØ ´õ ´À¸° mutex±â¹Ý + ±¸ÇöÀ» ±âº»ÀûÀ¸·Î »ç¿ëÇÑ´Ù. ÀÌ·± Ç÷¡Æû¿¡¼­ ¾ÆÆÄÄ¡¸¦ + ÄÄÆÄÀÏÇÒ¶§ ¾ÆÆÄÄ¡¸¦ ÃֽŠCPU¿¡¼­¸¸ ½ÇÇàÇÒ °èȹÀ̶ó¸é, + ¾ÆÆÄÄ¡¸¦ ±¸¼ºÇÒ¶§ --enable-nonportable-atomics + ¿É¼ÇÀ» »ç¿ëÇÏ¿© ´õ ºü¸¥ atomic ±¸ÇöÀ» ¼±ÅÃÇÒ ¼ö ÀÖ´Ù:

    + +

    + ./buildconf
    + ./configure --with-mpm=worker --enable-nonportable-atomics=yes +

    + +

    --enable-nonportable-atomics ¿É¼ÇÀº ´ÙÀ½°ú + °°Àº Ç÷¡Æû¿¡ ¿µÇâÀÌ ÀÖ´Ù:

    + +
      + +
    • SPARC¿¡¼­ Solaris
      + ±âº»ÀûÀ¸·Î APRÀº Solaris/SPARC¿¡¼­ mutex±â¹Ý atomicÀ» + »ç¿ëÇÑ´Ù. ±×·¯³ª ±¸¼ºÇÒ¶§ + --enable-nonportable-atomics¸¦ »ç¿ëÇϸé + APRÀº ºü¸¥ Çϵå¿þ¾î compare-and-swapÀ» À§ÇÑ SPARC + v8plus ¸í·É¾î¸¦ »ç¿ëÇÑ´Ù. ÀÌ ¿É¼ÇÀ» »ç¿ëÇϸé atomic + ¸í·ÉÀÌ ´õ È¿À²ÀûÀÌÁö¸¸ (CPU¸¦ ´ú »ç¿ëÇÏ°í ´õ ³ôÀº + µ¿±âÈ­°¡ °¡´ÉÇÏ´Ù), ÄÄÆÄÀÏÇÑ ½ÇÇàÆÄÀÏÀº UltraSPARC + Ĩ¿¡¼­¸¸ ½ÇÇàÇÒ ¼ö ÀÖ´Ù. +
    • + +
    • Linux on x86
      + ±âº»ÀûÀ¸·Î APRÀº ¸®´ª½º¿¡¼­ mutex±â¹Ý atomicÀ» + »ç¿ëÇÑ´Ù. ±×·¯³ª ±¸¼ºÇÒ¶§ + --enable-nonportable-atomics¸¦ »ç¿ëÇϸé + APRÀº ºü¸¥ Çϵå¿þ¾î compare-and-swapÀ» À§ÇÑ 486 + ¸í·É¾î¸¦ »ç¿ëÇÑ´Ù. ´õ È¿À²ÀûÀÎ atomic ¸í·ÉÀÌ °¡´ÉÇÏÁö¸¸, + ÄÄÆÄÀÏÇÑ ½ÇÇàÆÄÀÏÀº 486 ÀÌ»ó Ĩ¿¡¼­¸¸ (386Àº ¾ÈµÈ´Ù) + ½ÇÇàÇÒ ¼ö ÀÖ´Ù. +
    • + +
    + + + +

    mod_status¿Í ExtendedStatus On

    + + + +

    ¾ÆÆÄÄ¡¸¦ ÄÄÆÄÀÏÇÒ¶§ mod_status¸¦ Æ÷ÇÔÇÏ°í + ½ÇÇàÇÒ¶§ ExtendedStatus OnÀ» ¼³Á¤ÇÏ¸é ¾ÆÆÄÄ¡´Â + ¿äûÀ» ¹ÞÀ»¶§¸¶´Ù gettimeofday(2)(ȤÀº ¿î¿µÃ¼Á¦¿¡ + µû¶ó times(2))¸¦ µÎ¹ø È£ÃâÇÏ°í (1.3 ÀÌÀü¿¡´Â) + time(2)µµ Ãß°¡·Î ¿©·¯¹ø È£ÃâÇÑ´Ù. »óÅ º¸°í¼­¿¡ + µ¿À۽ð£ÀÌ ÇÊ¿äÇϱ⠶§¹®ÀÌ´Ù. ÃÖ»óÀÇ ¼º´ÉÀ» ¾òÀ¸·Á¸é + (±âº»°ªÀÎ) ExtendedStatus off¸¦ ¼³Á¤ÇÑ´Ù.

    + + + +

    accept Á÷·ÄÈ­ - ¿©·¯ ¼ÒÄÏ

    + + + +

    ÁÖÀÇ:

    +

    ¾Æ·¡ ¹®¼­´Â ¾ÆÆÄÄ¡ À¥¼­¹ö 2.0 ¹öÀü¿¡¼­ º¯°æµÈ ³»¿ëÀ» + ´ã°í ÀÖÁö ¾Ê´Ù. ¾ÆÁ÷µµ À¯È¿ÇÑ Á¤º¸°¡ ÀÖÁö¸¸, ÁÖÀÇÇؼ­ + »ç¿ëÇÏ±æ ¹Ù¶õ´Ù.

    +
    + +

    À¯´Ð½º ¼ÒÄÏ APIÀÇ ´ÜÁ¡À» ¼³¸íÇÑ´Ù. À¥¼­¹ö°¡ ¿©·¯ Æ÷Æ® + ȤÀº ¿©·¯ ÁÖ¼Ò¸¦ ±â´Ù¸®±âÀ§ÇØ ¿©·¯ ListenÀ» »ç¿ëÇÑ´Ù°í °¡Á¤ÇÏÀÚ. + ¿¬°áÀÌ °¡´ÉÇÑÁö °¢ ¼ÒÄÏÀ» °Ë»çÇϱâÀ§ÇØ ¾ÆÆÄÄ¡´Â + select(2)¸¦ »ç¿ëÇÑ´Ù. select(2)´Â + ¼ÒÄÏ¿¡ ±â´Ù¸®°í ÀÖ´Â ¿¬°áÀÌ ¾ø´ÂÁö ȤÀº ÃÖ¼ÒÇÑ + ÇÑ°³ ÀÖ´ÂÁö ¾Ë·ÁÁØ´Ù. ¾ÆÆÄÄ¡¿¡´Â ¿©·¯ ÀÚ½ÄÀÌ ÀÖ°í, + ½¬°í ÀÖ´Â ¸ðµç ÀÚ½ÄÀº µ¿½Ã¿¡ »õ·Î¿î ¿¬°áÀ» °Ë»çÇÑ´Ù. ¿ø·¡ + ±¸ÇöÀº ´ÙÀ½°ú ºñ½ÁÇÏ´Ù (ÀÌ ¿¹´Â Äڵ忡¼­ °¡Á®¿ÀÁö ¾Ê¾Ò´Ù. + ´ÜÁö ¼³¸íÇϱâÀ§ÇÑ ¿ëµµ·Î ¸¸µé¾ú´Ù.):

    + +

    + for (;;) {
    + + for (;;) {
    + + fd_set accept_fds;
    +
    + FD_ZERO (&accept_fds);
    + for (i = first_socket; i <= last_socket; ++i) {
    + + FD_SET (i, &accept_fds);
    +
    + }
    + rc = select (last_socket+1, &accept_fds, NULL, NULL, NULL);
    + if (rc < 1) continue;
    + new_connection = -1;
    + for (i = first_socket; i <= last_socket; ++i) {
    + + if (FD_ISSET (i, &accept_fds)) {
    + + new_connection = accept (i, NULL, NULL);
    + if (new_connection != -1) break;
    +
    + }
    +
    + }
    + if (new_connection != -1) break;
    +
    + }
    + process the new_connection;
    +
    + } +

    + +

    ±×·¯³ª À§ÀÇ ´Ü¼øÇÑ ±¸Çö¿¡´Â ½É°¢ÇÑ °í°¥(starvation) + ¹®Á¦°¡ ÀÖ´Ù. ¿©·¯ ÀÚ½ÄÀÌ µ¿½Ã¿¡ ÀÌ ¹Ýº¹¹®À» ½ÇÇàÇϸé, + ¿äûÀ» ±â´Ù¸®¸ç ¸ðµÎ select¿¡¼­ ¸ØÃá´Ù. À̶§ + ¾î¶² ¼ÒÄÏ¿¡ ¿äûÀÌ Çϳª¶óµµ µé¾î¿À¸é ¸ðµç ÀÚ½ÄÀÌ ±ú¾î³­´Ù + (±ú¾î³ª´Â ÀÚ½ÄÀÇ °³¼ö´Â ¿î¿µÃ¼Á¦¿Í ŸÀֿ̹¡ µû¶ó ´Ù¸£´Ù). + À̵éÀº ¸ðµÎ ¿¬°áÀ» acceptÇÏ±æ ½ÃµµÇÑ´Ù. ±×·¯³ª + (¾ÆÁ÷µµ ÇÑ ¿¬°á¸¸ ´ë±âÁßÀ̶ó¸é) ÇÑ Àڽĸ¸ ¼º°øÇÏ°í, ³ª¸ÓÁö´Â + accept¿¡¼­ ¸ØÃá´Ù. ±×·¯¸é ÀÌ ÀڽĵéÀº + ÇÑ ¼ÒÄÏÀÇ ¿äû¸¸À» ¼­ºñ½ºÇϵµ·Ï ¹­¿©¼­, ±× ¼ÒÄÏÀ¸·Î »õ·Î¿î + ¿äûÀÌ ÃæºÐÈ÷ µé¾î¿Í¼­ ¸ðµç ÀÚ½ÄÀ» ±ú¿ï¶§±îÁö Á¤ÁöÇØÀÖ´Ù. + ÀÌ·± °í°¥ ¹®Á¦´Â PR#467¿¡ + óÀ½ º¸°íµÇ¾ú´Ù. ÃÖ¼ÒÇÑ µÎ°¡Áö ÇØ°áÃ¥ÀÌ ÀÖ´Ù.

    + +

    ÇÑ°¡Áö´Â ¼ÒÄÏÀ» ´ë±âÇÏÁö ¾Êµµ·Ï (non-blocking) ¸¸µå´Â + ¹æ¹ýÀÌ´Ù. ÀÌ °æ¿ì ÀÚ½ÄÀÌ accept¸¦ Çصµ ¸ØÃßÁö + ¾Ê°í, Áï½Ã ÁøÇàÇÒ ¼ö ÀÖ´Ù. ±×·¯³ª CPU ½Ã°£À» ³¶ºñÇÑ´Ù. + select¿¡¼­ ½¬´Â ÀÚ½ÄÀÌ 10°³ ÀÖ°í, »õ·Î ¿¬°áÀÌ + ÇÑ°³ µé¾î¿Ô´Ù°í °¡Á¤ÇÏÀÚ. ±×·¯¸é ÀÌ ÀÚ½ÄÁß 9°³´Â ±ú¾î³ª¼­ + ¿¬°áÀ» acceptÇÏ±æ ½ÃµµÇÏ°í ½ÇÆÐÇÏ¸é ¾Æ¹« + Àϵµ ÇÏÁö ¾Ê°í ´Ù½Ã select¸¦ ¹Ýº¹ÇÑ´Ù. ´Ù½Ã + select·Î µ¹¾Æ¿Ã ¶§±îÁö ¾î¶² Àڽĵµ ´Ù¸¥ ¼ÒÄÏ¿¡ + µé¾î¿Â ¿äûÀ» ¼­ºñ½ºÇÏÁö ¾Ê´Â´Ù. (´ÙÁßÇÁ·Î¼¼¼­ ÄÄÇ»ÅÍ¿¡¼­) + ½¬´Â ÀÚ½Ä °³¼ö¸¸Å­ CPU °³¼ö°¡ ÀÖ´Â µå¹® °æ¿ì°¡ ¾Æ´Ï¶ó¸é + ÀÌ ÇØ°áÃ¥Àº º°·Î ÁÁ¾Æº¸ÀÌÁö ¾Ê´Â´Ù.

    + +

    ´Ù¸¥ ¹æ¹ýÀº ¾ÆÆÄÄ¡°¡ »ç¿ëÇÏ´Â ¹æ¹ýÀ¸·Î ³»ºÎ ¹Ýº¹¹®¿¡ + ÇÑ Àڽĸ¸À» µé¿©º¸³½´Ù. ¹Ýº¹¹®Àº ´ÙÀ½°ú °°´Ù (Â÷À̸¦ + °­Á¶ÇßÀ½):

    + +

    + for (;;) {
    + + accept_mutex_on ();
    + for (;;) {
    + + fd_set accept_fds;
    +
    + FD_ZERO (&accept_fds);
    + for (i = first_socket; i <= last_socket; ++i) {
    + + FD_SET (i, &accept_fds);
    +
    + }
    + rc = select (last_socket+1, &accept_fds, NULL, NULL, NULL);
    + if (rc < 1) continue;
    + new_connection = -1;
    + for (i = first_socket; i <= last_socket; ++i) {
    + + if (FD_ISSET (i, &accept_fds)) {
    + + new_connection = accept (i, NULL, NULL);
    + if (new_connection != -1) break;
    +
    + }
    +
    + }
    + if (new_connection != -1) break;
    +
    + }
    + accept_mutex_off ();
    + process the new_connection;
    +
    + } +

    + +

    accept_mutex_on°ú accept_mutex_off + ÇÔ¼ö´Â mutex ¼¼¸¶Æ÷¾î¸¦ + ±¸ÇöÇÑ´Ù. Çѹø¿¡ ¿ÀÁ÷ ÇÑ Àڽĸ¸ÀÌ mutex¸¦ °¡Áú ¼ö ÀÖ´Ù. + mutex¸¦ ±¸ÇöÇÏ´Â ¹æ¹ýÀº ¿©·¯°¡ÁöÀÌ´Ù. ±¸Çö ¹æ¹ýÀº (1.3 + ÀÌÀü) src/conf.h³ª (1.3°ú ±× ÀÌÈÄ) + src/include/ap_config.h¿¡ Á¤ÀǵÇÀÖ´Ù. ¾î¶² + ¾ÆÅ°ÅØÃÄ´Â Àá±Ý(locking) ¹æ¹ýÀ» ¼±ÅÃÇÏÁö ¾Ê±â¶§¹®¿¡, ÀÌ·± + ¾ÆÅ°ÅØÃÄ¿¡¼­ ¿©·¯ Listen Áö½Ã¾î¸¦ »ç¿ëÇϸé + À§ÇèÇÏ´Ù.

    + +

    ½ÇÇà½Ã AcceptMutex Áö½Ã¾î¸¦ »ç¿ëÇÏ¿© + mutex ±¸ÇöÀ» º¯°æÇÒ ¼ö ÀÖ´Ù.

    + +
    +
    AcceptMutex flock
    + +
    +

    ÀÌ ¹æ¹ýÀº Àá±ÝÆÄÀÏÀ» Àá±×±âÀ§ÇØ flock(2) + ½Ã½ºÅÛÈ£ÃâÀ» »ç¿ëÇÑ´Ù (Àá±ÝÆÄÀÏ À§Ä¡´Â LockFile Áö½Ã¾î·Î ÁöÁ¤).

    +
    + +
    AcceptMutex fcntl
    + +
    +

    ÀÌ ¹æ¹ýÀº Àá±ÝÆÄÀÏÀ» Àá±×±âÀ§ÇØ fcntl(2) + ½Ã½ºÅÛÈ£ÃâÀ» »ç¿ëÇÑ´Ù (Àá±ÝÆÄÀÏ À§Ä¡´Â LockFile Áö½Ã¾î·Î ÁöÁ¤).

    +
    + +
    AcceptMutex sysvsem
    + +
    +

    (1.3°ú ±× ÀÌÈÄ) ÀÌ ¹æ¹ýÀ» SysV½Ä ¼¼¸¶Æ÷¾î¸¦ »ç¿ëÇÏ¿© + mutex¸¦ ±¸ÇöÇÑ´Ù. ºÒÇàÈ÷µµ SysV½Ä ¼¼¸¶Æ÷¾î´Â ³ª»Û + ºÎÀÛ¿ëÀÌ ÀÖ´Ù. Çϳª´Â ¾ÆÆÄÄ¡°¡ ¼¼¸¶Æ÷¾î¸¦ Á¤¸®ÇÏÁö + ¾Ê°í Á×À» ¼ö ÀÖ´Â Á¡ÀÌ´Ù (ipcs(8) manpage + Âü°í). ´Ù¸¥ Çϳª´Â À¥¼­¹ö¿Í µ¿ÀÏÇÑ uid·Î ½ÇÇàÇÏ´Â + CGI°¡ (Áï, suexec³ª + cgiwrapper¸¦ »ç¿ëÇÏÁö¾Ê´Â ÇÑ ¸ðµç CGI) + ¼¼¸¶Æ÷¾î API¸¦ »ç¿ëÇÏ¿© ¼­ºñ½º°ÅºÎ°ø°ÝÀ» ÇÒ ¼ö ÀÖ´Â + Á¡ÀÌ´Ù. ÀÌ·± ÀÌÀ¯¶§¹®¿¡ IRIX¸¦ Á¦¿ÜÇÑ ¾ÆÅ°ÅØÃÄ¿¡¼­ + ÀÌ ¹æ¹ýÀ» »ç¿ëÇÏÁö ¾Ê´Â´Ù (´ëºÎºÐÀÇ IRIX ÄÄÇ»ÅÍ¿¡¼­ + ¾ÕÀÇ µÎ ¹æ¹ýÀº Áö³ªÄ¡°Ô ¹ö°Ì´Ù).

    +
    + +
    AcceptMutex pthread
    + +
    +

    (1.3°ú ±× ÀÌÈÄ) ÀÌ ¹æ¹ýÀº POSIX mutex¸¦ »ç¿ëÇϱ⶧¹®¿¡ + POSIX ¾²·¹µå ±Ô¾àÀ» ¿ÏÀüÈ÷ ±¸ÇöÇÑ ¾ÆÅ°ÅØÃĶó¸é ¸ðµÎ + »ç¿ë°¡´ÉÇÏÁö¸¸, (2.5 ÀÌÈÄ) Solaris¿¡¼­¸¸ ±×°Íµµ ƯÁ¤ + ±¸¼º¿¡¼­¸¸ µ¿ÀÛÇÏ´Â µíÇÏ´Ù. ÀÌ ¹æ¹ýÀ» ½ÃµµÇغ»´Ù¸é + ¼­¹ö°¡ ¸ØÃç¼­ ÀÀ´äÀ» ¾ÈÇÏ´ÂÁö »ìÆìºÁ¾ß ÇÑ´Ù. Á¤Àû + ³»¿ë¸¸ ¼­ºñ½ºÇÏ´Â ¼­¹ö´Â Àß µ¿ÀÛÇÏ´Â °Í °°´Ù.

    +
    + +
    AcceptMutex posixsem
    + +
    +

    (2.0°ú ±× ÀÌÈÄ) ÀÌ ¹æ¹ýÀº POSIX ¼¼¸¶Æ÷¾î¸¦ »ç¿ëÇÑ´Ù. + mutex¸¦ °¡Áø ÇÁ·Î¼¼½ºÀÇ ¾²·¹µå°¡ Á״´ٸé(segfault) + ¼¼¸¶Æ÷¾î ¼ÒÀ¯±ÇÀÌ È¸º¹µÇÁö ¾Ê¾Æ¼­ À¥¼­¹ö°¡ ¸ØÃá´Ù.

    +
    + +
    + +

    ½Ã½ºÅÛ¿¡ À§ ¸ñ·Ï¿¡ ¾ø´Â Á÷·ÄÈ­(serialization) ¹æ¹ýÀÌ + ÀÖ´Ù¸é ±× ¹æ¹ýÀ» »ç¿ëÇÏ´Â Äڵ带 APR¿¡ Ãß°¡ÇÒ °¡Ä¡°¡ ÀÖ´Ù.

    + +

    °í·Á´Â ÇغÃÁö¸¸ ±¸ÇöÇÏÁö¾ÊÀº ´Ù¸¥ ¹æ¹ýÀº ºÎºÐÀûÀ¸·Î + ¹Ýº¹¹®À» Á÷·ÄÈ­ÇÏ´Â ¹æ¹ýÀÌ´Ù. Áï, ÇÁ·Î¼¼¼­¸¦ ¸î°³¸¸ µé¿©º¸³»´Â + °ÍÀÌ´Ù. ÀÌ ¹æ¹ýÀº ¿©·¯ ÀÚ½ÄÀ» µ¿½Ã¿¡ ½ÇÇàÇÒ ¼ö À־ + Á÷·ÄÈ­¶§¹®¿¡ Àüü ´ë¿ªÆøÀ» È°¿ëÇÏÁö ¸øÇÏ´Â ´ÙÁßÇÁ·Î¼¼¼­ + ÄÄÇ»ÅÍ¿¡¼­¸¸ °ü½ÉÀ» °¡Á®º¼ ¼ö ÀÖ´Ù. ¾ÕÀ¸·Î »ìÆ캼 ºÎºÐÀÌÁö¸¸, + ¸Å¿ì º´·ÄÈ­µÈ À¥¼­¹ö°¡ ÈçÇÏÁö ¾Ê¾Æ¼­ ¿ì¼±¼øÀ§°¡ ³·´Ù.

    + +

    ÃÖ»óÀÇ ¼º´ÉÀ» ¾ò±âÀ§Çؼ­´Â ¿©·¯ Listen ¹®À» »ç¿ëÇÏÁö ¾Ê´Â + °ÍÀÌ ÀÌ»óÀûÀÌ´Ù. ±×·¯³ª °è¼Ó ¼³¸íÇÑ´Ù.

    + + + +

    accept Á÷·ÄÈ­ - ¼ÒÄÏ ÇÑ°³

    + + + +

    ¾ÕÀÇ ¼³¸íÀº ´ÙÁß¼ÒÄÏ ¼­¹ö¿¡´Â ÁÁÁö¸¸, ¼ÒÄÏÀÌ ÇÑ°³ÀÎ + ¼­¹ö´Â ¾î¶²°¡? ¿¬°áÀÌ µµÂøÇÒ¶§±îÁö ¸ðµç ÀÚ½ÄÀÌ + accept(2)¿¡¼­ ¸ØÃçÀֱ⶧¹®¿¡ ÀÌ·Ð»ó °°Àº + ¹®Á¦°¡ ¹ß»ýÇÏÁö ¾Ê°í, °í°¥ ¹®Á¦µµ ¾ø´Ù. ±×·¯³ª ½ÇÁ¦·Î´Â + ¾Õ¿¡¼­ ¸»ÇÑ ´ë±âÇÏÁö ¾Ê´Â (non-blocking) ¹æ¹ý¿¡¼­ ¹ß»ýÇÏ´Â + "°øȸÀü(spinning)" Çö»óÀ» °¨Ãß°í ÀÖ´Ù. ´ëºÎºÐÀÇ TCP ½ºÅÃÀº + ¿¬°áÀÌ µµÂøÇϸé Ä¿³ÎÀÌ accept¿¡¼­ ¸ØÃçÀÖ´Â + ¸ðµç ÀÚ½ÄÀ» ±ú¿ìµµ·Ï ±¸ÇöµÇÀÖ´Ù. ÇÁ·Î¼¼½ºÁß ÇÑ°³°¡ ¿¬°áÀ» + ¾ò°í »ç¿ëÀÚ¿µ¿ªÀ¸·Î µ¹¾Æ°¡°í, ³ª¸ÓÁö´Â Ä¿³Î¿¡¼­ °øȸÀüÇÏ¿© + ¿¬°áÀÌ ¾øÀ½À» ¹ß°ßÇÏ¸é ´Ù½Ã ÀáÀ» ÀÜ´Ù. »ç¿ëÀÚ¿µ¿ª Äڵ忡¼­´Â + ÀÌ·± °øȸÀüÀ» ¾Ë ¼ö ¾øÁö¸¸, ºÐ¸íÈ÷ Á¸ÀçÇÑ´Ù. ±×·¡¼­ ´ÙÁß¼ÒÄÏÀÇ + ´ë±âÇÏÁö ¾Ê´Â ¹æ¹ý°ú µ¿ÀÏÇÏ°Ô ºÎÇϸ¦ ³ôÀÌ´Â ºÒÇÊ¿äÇÑ ÇൿÀÌ + ÀϾ´Ù.

    + +

    ±×·¡¼­ ¿ì¸®´Â ¿©·¯ ¾ÆÅ°ÅØÃÄ¿¡¼­ ¼ÒÄÏÀÌ ÇÑ°³ÀÎ °æ¿ì¿¡µµ + Á÷·ÄÈ­ÇÏ¸é ´õ "Àß" µ¿ÀÛÇÔÀ» ¹ß°ßÇß´Ù. ±×·¡¼­ °ÅÀÇ ´ëºÎºÐÀÇ + °æ¿ì ±âº»ÀûÀ¸·Î Á÷·ÄÈ­¸¦ »ç¿ëÇÑ´Ù. ¸®´ª½º¿¡¼­ (Ä¿³Î 2.0.30, + 128Mb ¸Þ¸ð¸®¿¡ µà¾ó Pentium pro) ½ÇÇèÇÑ °á°ú ¼ÒÄÏ ÇÑ°³¸¦ + Á÷·ÄÈ­Çϸé ÇÏÁö ¾ÊÀº °æ¿ì¿¡ ºñÇØ ÃÊ´ç ¿äûÀÌ 3% ¹Ì¸¸ + ÁÙ¾îµé¾ú´Ù. ±×·¯³ª Á÷·ÄÈ­¸¦ ÇÏÁö ¾ÊÀº °æ¿ì ¿äû´ç 100ms + Áö¿¬ÀÌ ¹ß»ýÇß´Ù. ÀÌ Áö¿¬Àº ¾Æ¸¶µµ LAN¿¡¼­ ¹ß»ýÇÏ´Â ±ä + ¿¬°á¼±¶§¹®ÀÏ °ÍÀÌ´Ù. ¼ÒÄÏÀÌ ÇÑ°³ÀÎ °æ¿ì Á÷·ÄÈ­¸¦ »ç¿ëÇÏÁö + ¾ÊÀ¸·Á¸é SINGLE_LISTEN_UNSERIALIZED_ACCEPT¸¦ + Á¤ÀÇÇÑ´Ù.

    + + + +

    Close Áö¿¬(lingering)

    + + + +

    + draft-ietf-http-connection-00.txt 8Àý¿¡¼­ ¼³¸íÇϵíÀÌ + ¾ÈÁ¤ÀûÀÎ À¥¼­¹ö°¡ µÇ·Á¸é, Åë½ÅÀÇ ¾ç ¹æÇâÀ» + µ¶¸³ÀûÀ¸·Î ´ÝÀ» ¼ö ÀÖ¾î¾ß ÇÑ´Ù (TCP ¿¬°áÀº ½Ö¹æÇâÀÌ°í, + ¹æÇâÀº ¼­·Î µ¶¸³ÀûÀÌ´Ù). ÀÌÁ¡À» ´Ù¸¥ ¼­¹ö¿¡¼­´Â ÀÚÁÖ + °£°úÇÏÁö¸¸, ¾ÆÆÄÄ¡´Â 1.2ºÎÅÍ Á¤È®È÷ ±¸ÇöÇØ¿Ô´Ù.

    + +

    ÀÌ ±â´ÉÀ» ºÎÁÖÀÇÇÏ°Ô ¾ÆÆÄÄ¡¿¡ Ãß°¡ÇßÀ»¶§ ¿©·¯ À¯´Ð½º + ¹öÀü¿¡¼­ ¸¹Àº ¹®Á¦°¡ ¹ß»ýÇß´Ù. TCP ±Ô¾àÀº + FIN_WAIT_2¿¡ ŸÀӾƿôÀÌ ÀÖ´Ù°í Á¤ÇÏÁö ¾Ê¾ÒÁö¸¸, + ±ÝÁöÇÏÁöµµ ¾Ê¾Ò´Ù. ŸÀӾƿôÀÌ ¾ø´Â ½Ã½ºÅÛ¿¡¼­ ¾ÆÆÄÄ¡ 1.2´Â + ¸¹Àº ¼ÒÄÏÀ» ¿µ¿øÈ÷ FIN_WAIT_2 »óÅ·Π¸¸µé¾ú´Ù. + ¸¹Àº °æ¿ì ÀÌ ¹®Á¦´Â Á¦Àۻ簡 Á¦°øÇÏ´Â ÃֽŠTCP/IP ÆÐÄ¡¸¦ + Àû¿ëÇÏ¿© ÇØ°áÇÒ ¼ö ÀÖ´Ù. ±×·¯³ª Á¦Àۻ簡 ÆÐÄ¡¸¦ ¹ßÇ¥ÇÏÁö + ¾Ê´Â °æ¿ì°¡ (Áï, SunOS4 -- ¼Ò½º ¶óÀ̼±½º°¡ ÀÖ´Â + »ç¶÷Àº Á÷Á¢ ÆÐÄ¡ÇÒ ¼ö ÀÖÁö¸¸) Àֱ⶧¹®¿¡ ÀÌ ±â´ÉÀ» »ç¿ëÇÏÁö + ¾Ê±â·Î °áÁ¤Çß´Ù.

    + +

    ¹æ¹ýÀº µÎ°¡Áö´Ù. Çϳª´Â ¼ÒÄÏ ¿É¼Ç SO_LINGER¸¦ + »ç¿ëÇÏ´Â ¹æ¹ýÀÌ´Ù. ±×·¯³ª ºÒÇàÈ÷µµ ´ëºÎºÐÀÇ TCP/IP ½ºÅÃÀº + ÀÌ ¿É¼ÇÀ» ¿Ã¹Ù·Î ±¸ÇöÇÏÁö ¾Ê¾Ò´Ù. ¿Ã¹Ù·Î ±¸ÇöÇÑ ½ºÅÿ¡¼­ + Á¶Â÷µµ (Áï, ¸®´ª½º 2.0.31) ÀÌ ¹æ¹ýÀº ´ÙÀ½ ¹æ¹ýº¸´Ù + ´õ cpu¸¦ Àâ¾Æ¸Ô´Â´Ù.

    + +

    ¾ÆÆÄÄ¡´Â º¸Åë (http_main.c¿¡ ÀÖ´Â) + lingering_close¶ó´Â ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù. ÀÌ ÇÔ¼ö´Â + ´ëÃæ ´ÙÀ½°ú °°´Ù:

    + +

    + void lingering_close (int s)
    + {
    + + char junk_buffer[2048];
    +
    + /* shutdown the sending side */
    + shutdown (s, 1);
    +
    + signal (SIGALRM, lingering_death);
    + alarm (30);
    +
    + for (;;) {
    + + select (s for reading, 2 second timeout);
    + if (error) break;
    + if (s is ready for reading) {
    + + if (read (s, junk_buffer, sizeof (junk_buffer)) <= 0) {
    + + break;
    +
    + }
    + /* just toss away whatever is here */
    +
    + }
    +
    + }
    +
    + close (s);
    +
    + } +

    + +

    ÀÌ ÄÚµå´Â ¿¬°áÀ» ´ÝÀ»¶§ ´õ CPU¸¦ »ç¿ëÇÏÁö¸¸, ¾ÈÁ¤ÀûÀÎ + ±¸ÇöÀ» À§ÇØ ÇÊ¿äÇÏ´Ù. HTTP/1.1ÀÌ ´õ ³Î¸® ÆÛÁö°í ¸ðµç ¿¬°áÀ» + À¯ÁöÇÑ´Ù¸é(persistent), ¿¬°áÀ» ¹Þ´Â ºñ¿ëÀº ¿©·¯ ¿äûÀ» + ó¸®Çϸ鼭 »ó¼âµÉ °ÍÀÌ´Ù. À§ÇèÇÏ°Ôµµ + NO_LINGCLOSE¸¦ Á¤ÀÇÇÏ¿© ÀÌ ±â´ÉÀ» »ç¿ëÇÏÁö + ¾ÊÀ» ¼ö ÀÖÁö¸¸, Àý´ë·Î ±ÇÇÏÁö ¾Ê´Â´Ù. ƯÈ÷ HTTP/1.1 + ÆÄÀÌÇÁ¶óÀÎ (¿ªÁÖ; ¿¬°áÀ¯Áö »óÅ¿¡¼­ ÀÀ´äÀ» ±â´Ù¸®Áö + ¾Ê°í ¿©·¯ ¿äûÀ» º¸³»´Â ±â¼ú) ¿¬°áÀ¯Áö¿¡´Â + lingering_close°¡ ÇʼöÀûÀÌ´Ù (±×¸®°í + ÆÄÀÌÇÁ¶óÀÎ ¿¬°áÀÌ ´õ ºü¸£±â¶§¹®¿¡ »ç¿ëÇÏ±æ ¹Ù¶ö °ÍÀÌ´Ù).

    + + + +

    Scoreboard ÆÄÀÏ

    + + + +

    ¾ÆÆÄÄ¡ÀÇ ºÎ¸ð¿Í ÀÚ½ÄÀº scoreboard¶ó´Â °ÍÀ» ÅëÇØ ¼­·Î + Åë½ÅÇÑ´Ù. ÀÌ»óÀûÀ¸·Î´Â scoreboard¸¦ °øÀ¯¸Þ¸ð¸®·Î ±¸ÇöÇØ¾ß + ÇÑ´Ù. ¿ì¸® °³¹ßÀÚ°¡ ÇØ´ç ¿î¿µÃ¼Á¦¿¡ Á¢±ÙÇÒ ¼ö Àְųª »ó¼¼ÇÑ + Æ÷Æà °á°ú¸¦ ¹ÞÀº °æ¿ì º¸Åë °øÀ¯¸Þ¸ð¸®¸¦ »ç¿ëÇÏ¿© ±¸ÇöÇÑ´Ù. + ³ª¸ÓÁö´Â µð½ºÅ©¿¡ ÀÖ´Â ÆÄÀÏÀ» »ç¿ëÇÏ¿© ±¸ÇöÇÑ´Ù. µð½ºÅ©¿¡ + ÀÖ´Â ÆÄÀÏÀº ´À¸®°í ½Å·Úµµ°¡ ¶³¾îÁø´Ù (±â´Éµµ ´õ Àû´Ù). + src/main/conf.h ÆÄÀÏ¿¡¼­ »ç¿ëÇÏ´Â ¾ÆÅ°ÅØÃĸ¦ + ã¾Æ¼­ USE_MMAP_SCOREBOARD ȤÀº + USE_SHMGET_SCOREBOARDÀÎÁö È®ÀÎÇÑ´Ù. µÑÁß + Çϳª¸¦ (°¢°¢ ÇÔ²² »ç¿ëÇÒ HAVE_MMAPÀ̳ª + HAVE_SHMGETµµ °°ÀÌ) Á¤ÀÇÇÏ¸é °øÀ¯¸Þ¸ð¸® Äڵ带 + »ç¿ëÇÑ´Ù. ½Ã½ºÅÛÀÌ ´Ù¸¥ Á¾·ùÀÇ °øÀ¯¸Þ¸ð¸®¸¦ »ç¿ëÇÑ´Ù¸é + src/main/http_main.c ÆÄÀÏÀ» ¼öÁ¤ÇÏ¿© ¾ÆÆÄÄ¡¿¡¼­ + °øÀ¯¸Þ¸ð¸®¸¦ »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ÈÅ(hook)À» Ãß°¡Ç϶ó. (¶ÇÇÑ + ÆÐÄ¡¸¦ ¿ì¸®¿¡°Ô º¸³»ÁÖ±æ ¹Ù¶õ´Ù.)

    + +
    ¿ª»çÀû ¼³¸í: ¾ÆÆÄÄ¡ÀÇ ¸®´ª½º ¹öÀüÀº ¾ÆÆÄÄ¡ 1.2 ¹öÀüºÎÅÍ + °øÀ¯¸Þ¸ð¸®¸¦ »ç¿ëÇϱ⠽ÃÀÛÇß´Ù. ¸®´ª½º¿¡¼­ Ãʱ⠾ÆÆÄÄ¡ + ¹öÀüÀÌ ´À¸®°í ½Å·Úµµ°¡ ¶³¾îÁ³±â ¶§¹®ÀÌ´Ù.
    + + + +

    DYNAMIC_MODULE_LIMIT

    + + + +

    ¸ðµâÀ» µ¿ÀûÀ¸·Î ÀоîµéÀÌÁö ¾Ê´Â´Ù¸é (°¡´ÉÇÑ Á¶±ÝÀÌ¶óµµ + ¼º´ÉÀ» ³ôÀ̱âÀ§ÇØ ÀÌ ±ÛÀ» ÀÐ´Â´Ù¸é ¾Æ¸¶µµ ¸ðµâÀ» µ¿ÀûÀ¸·Î + ÀоîµéÀÌÁö ¾ÊÀ» °ÍÀÌ´Ù), ¼­¹ö¸¦ ÄÄÆÄÀÏÇÒ¶§ + -DDYNAMIC_MODULE_LIMIT=0À» Ãß°¡ÇÑ´Ù. ±×·¯¸é + ¸ðµâÀ» µ¿ÀûÀ¸·Î ÀоîµéÀ̱âÀ§ÇØ ÇÒ´çÇÏ´Â ¸Þ¸ð¸®¸¦ Àý¾àÇÑ´Ù.

    + + + +
    top
    +
    +

    ºÎ·Ï: ½Ã½ºÅÛÈ£Ãâ ±â·ÏÀ» ÀÚ¼¼È÷ ºÐ¼®Çϱâ

    + + + +

    ´ÙÀ½Àº Solaris 8¿¡¼­ worker MPMÀ» »ç¿ëÇÑ ¾ÆÆÄÄ¡ 2.0.38ÀÇ + ½Ã½ºÅÛÈ£Ãâ ±â·Ï(trace)ÀÌ´Ù. ¾Æ·¡ ¸í·É¾î¸¦ »ç¿ëÇÏ¿© ±â·ÏÀ» + ¾ò¾ú´Ù:

    + +

    + truss -l -p httpd_child_pid. +

    + +

    -l ¿É¼ÇÀ» »ç¿ëÇϸé truss´Â ½Ã½ºÅÛÈ£ÃâÀ» + ÇÏ´Â LWP (lightweight process, °æ·®±Þ ÇÁ·Î¼¼½º--SolarisÀÇ + Ä¿³Î¼öÁØ ¾²·¹µå) ID¸¦ °°ÀÌ ±â·ÏÇÑ´Ù.

    + +

    ´Ù¸¥ ½Ã½ºÅÛ¿¡´Â strace, ktrace, + par °°Àº ½Ã½ºÅÛÈ£Ãâ ÃßÀû µµ±¸°¡ ÀÖ´Ù. °á°ú´Â + ºñ½ÁÇÏ´Ù.

    + +

    Ŭ¶óÀ̾ðÆ®´Â À¥¼­¹ö¿¡°Ô Å©±â°¡ 10KBÀÎ Á¤Àû ÆÄÀÏÀ» ¿äûÇÑ´Ù. + Á¤ÀûÀÎ ÆÄÀÏÀ» ¿äûÇÏÁö ¾Ê°Å³ª ³»¿ëÇù»óÇÏ´Â ¿äûÀ» ÇÑ °æ¿ì + ±â·ÏÀÌ ¸Å¿ì ´Ù¸£´Ù (¶§·Î´Â ¸Å¿ì ¾Ë¾Æº¸±â Èûµé´Ù).

    + +
    /67:    accept(3, 0x00200BEC, 0x00200C0C, 1) (sleeping...)
    +/67:    accept(3, 0x00200BEC, 0x00200C0C, 1)            = 9
    + +

    À§¿¡¼­ ¿¬°á´ë±â(listener) ¾²·¹µå°¡ LWP #67¿¡¼­ ½ÇÇàµÊÀ» + ¾Ë ¼ö ÀÖ´Ù.

    + +
    accept(2) Á÷·ÄÈ­¸¦ »ç¿ëÇÏÁö ¾ÊÀ½À» ÁÖ¸ñÇ϶ó. + ¿©·¯ Æ÷Æ®¸¦ ±â´Ù¸®Áö¾Ê´Â °æ¿ì ÀÌ Ç÷¡ÆûÀÇ worker MPMÀº + ±âº»ÀûÀ¸·Î Á÷·ÄÈ­ÇÏÁö ¾ÊÀº accept¸¦ »ç¿ëÇÑ´Ù.
    + +
    /65:    lwp_park(0x00000000, 0)                         = 0
    +/67:    lwp_unpark(65, 1)                               = 0
    + +

    ¿¬°áÀº ¹Þ¾ÆµéÀÌ°í(accept) ¿¬°á´ë±â ¾²·¹µå´Â + worker ¾²·¹µå¸¦ ±ú¿ö¼­ ¿äûÀ» ó¸®ÇÏ°Ô ÇÑ´Ù. ¾Æ·¡ ±â·Ï¿¡¼­ + ¿äûÀ» ó¸®ÇÏ´Â worker ¾²·¹µå°¡ LWP #65ÀÓÀ» ¾Ë ¼ö ÀÖ´Ù.

    + +
    /65:    getsockname(9, 0x00200BA4, 0x00200BC4, 1)       = 0
    + +

    °¡»óÈ£½ºÆ®¸¦ ±¸ÇöÇϱâÀ§ÇØ ¾ÆÆÄÄ¡´Â ¿¬°áÀ» ¹Þ¾ÆµéÀÎ + Áö¿ª(local) ¼ÒÄÏ ÁÖ¼Ò¸¦ ¾Ë¾Æ¾ß ÇÑ´Ù. (°¡»óÈ£½ºÆ®¸¦ »ç¿ëÇÏÁö + ¾Ê°Å³ª Listen + Áö½Ã¾î¿¡ ¿ÍÀϵåÄ«µå ÁÖ¼Ò¸¦ »ç¿ëÇÏÁö ¾ÊÀº °æ¿ì µî) ¸¹Àº °æ¿ì + ÀÌ È£ÃâÀ» ¾ø¾Ù ¼ö ÀÖ´Ù. ±×·¯³ª ¾ÆÁ÷ ÀÌ·± ÃÖÀûÈ­ ÀÛ¾÷ÀÌ + ¾ÈµÇÀÖ´Ù.

    + +
    /65:    brk(0x002170E8)                                 = 0
    +/65:    brk(0x002190E8)                                 = 0
    + +

    brk(2) È£ÃâÀº Èü(heap)¿¡¼­ ¸Þ¸ð¸®¸¦ ÇÒ´çÇÑ´Ù. + À¥¼­¹ö´Â ´ëºÎºÐÀÇ ¿äû 󸮽à ÀÚü ¸Þ¸ð¸® + ÇÒ´çÀÚ(apr_pool°ú apr_bucket_alloc)¸¦ + »ç¿ëÇϱ⶧¹®¿¡ ½Ã½ºÅÛÈ£Ãâ ±â·Ï¿¡¼­ ÀÌ ½Ã½ºÅÛÈ£ÃâÀ» º¸±â°¡ + µå¹°´Ù. ÀÌ ±â·Ï¿¡¼­ À¥¼­¹ö´Â ½ÃÀÛÇÏÀÚ¸¶ÀÚ ÀÚü ¸Þ¸ð¸® ÇÒ´çÀÚ°¡ + »ç¿ëÇÒ ¸Þ¸ð¸®ºí·ÏÀ» ¾ò±âÀ§ÇØ malloc(3)À» È£ÃâÇÑ´Ù.

    + +
    /65:    fcntl(9, F_GETFL, 0x00000000)                   = 2
    +/65:    fstat64(9, 0xFAF7B818)                          = 0
    +/65:    getsockopt(9, 65535, 8192, 0xFAF7B918, 0xFAF7B910, 2190656) = 0
    +/65:    fstat64(9, 0xFAF7B818)                          = 0
    +/65:    getsockopt(9, 65535, 8192, 0xFAF7B918, 0xFAF7B914, 2190656) = 0
    +/65:    setsockopt(9, 65535, 8192, 0xFAF7B918, 4, 2190656) = 0
    +/65:    fcntl(9, F_SETFL, 0x00000082)                   = 0
    + +

    ´ÙÀ½ worker ¾²·¹µå´Â Ŭ¶óÀ̾ðÆ®ÀÇ ¿¬°á(ÆÄÀϱâ¼úÀÚ 9)À» + ´ë±â¾ÈÇÔ(non-blocking) »óÅ·Π¹Ù²Û´Ù. setsockopt(2)¿Í + getsockopt(2) È£ÃâÀº SolarisÀÇ libc°¡ ¼ÒÄÏ¿¡ + ´ëÇÑ fcntl(2)À» ¾î¶»°Ô ó¸®ÇÏ´ÂÁö º¸¿©ÁØ´Ù.

    + +
    /65:    read(9, " G E T   / 1 0 k . h t m".., 8000)     = 97
    + +

    worker ¾²·¹µå´Â Ŭ¶óÀ̾ðÆ®·Î ºÎÅÍ ¿äûÀ» Àд´Ù.

    + +
    /65:    stat("/var/httpd/apache/httpd-8999/htdocs/10k.html", 0xFAF7B978) = 0
    +/65:    open("/var/httpd/apache/httpd-8999/htdocs/10k.html", O_RDONLY) = 10
    + +

    À¥¼­¹ö ¼³Á¤Àº Options FollowSymLinks¿Í + AllowOverride NoneÀÌ´Ù. ±×·¡¼­ ¿äûÇÑ ÆÄÀÏ°æ·ÎÀÇ + °¢ µð·ºÅ丮¿¡ ´ëÇØ lstat(2)Çϰųª + .htaccess ÆÄÀÏÀ» °Ë»çÇÒ ÇÊ¿ä°¡ ¾ø´Ù. ÆÄÀÏÀ» + °Ë»çÇϱâÀ§ÇØ, 1) ÆÄÀÏÀÌ ÀÖ´ÂÁö, 2) µð·ºÅ丮°¡ ¾Æ´Ñ ÀϹÝÆÄÀÏÀÎÁö, + stat(2) È£Ã⸸ ÇÏ¸é µÈ´Ù.

    + +
    /65:    sendfilev(0, 9, 0x00200F90, 2, 0xFAF7B53C)      = 10269
    + +

    ÀÌ °æ¿ì À¥¼­¹ö´Â ÇѹøÀÇ sendfilev(2) ½Ã½ºÅÛÈ£Ãâ·Î + HTTP ÀÀ´äÇì´õ¿Í ¿äûÇÑ ÆÄÀÏÀ» Àü¼ÛÇÒ ¼ö ÀÖ´Ù. Sendfile Áö¿ø¿©ºÎ´Â + ¿î¿µÃ¼Á¦¸¶´Ù ´Ù¸£´Ù. ´Ù¸¥ ½Ã½ºÅÛÀ̶ó¸é sendfile(2)À» + È£ÃâÇϱâ Àü¿¡ Çì´õ¸¦ º¸³»±âÀ§ÇØ write(2)³ª + writev(2) È£ÃâÀ» ÇÑ´Ù.

    + +
    /65:    write(4, " 1 2 7 . 0 . 0 . 1   -  ".., 78)      = 78
    + +

    write(2) È£ÃâÀº Á¢±Ù·Î±×(access log)¿¡ ¿äûÀ» + ±â·ÏÇÑ´Ù. ÀÌ ±â·Ï¿¡ time(2) È£ÃâÀÌ ¾øÀ½À» ÁÖ¸ñÇ϶ó. + ¾ÆÆÄÄ¡ 1.3°ú ´Þ¸® ¾ÆÆÄÄ¡ 2.0Àº ½Ã°£À» ¾Ë±âÀ§ÇØ + gettimeofday(3)¸¦ »ç¿ëÇÑ´Ù. + gettimeofday¸¦ ÃÖÀûÈ­ÇÑ ¸®´ª½º¿Í Solaris °°Àº + ¸î¸î ¿î¿µÃ¼Á¦¿¡¼­´Â ÀϹÝÀûÀÎ ½Ã½ºÅÛÈ£Ã⠺δãÀÌ ¾ø´Ù.

    + +
    /65:    shutdown(9, 1, 1)                               = 0
    +/65:    poll(0xFAF7B980, 1, 2000)                       = 1
    +/65:    read(9, 0xFAF7BC20, 512)                        = 0
    +/65:    close(9)                                        = 0
    + +

    worker ¾²·¹µå´Â ¿¬°áÀ» Áö¿¬´Ý±â(lingering close)ÇÑ´Ù.

    + +
    /65:    close(10)                                       = 0
    +/65:    lwp_park(0x00000000, 0)         (sleeping...)
    + +

    ¸¶Áö¸·À¸·Î worker ¾²·¹µå´Â ¹æ±Ý Àü¼ÛÇÑ ÆÄÀÏÀ» ´Ý°í, + ¿¬°á´ë±â(listener) ¾²·¹µå°¡ ´Ù¸¥ ¿¬°áÀ» ÇÒ´çÇÒ ¶§±îÁö + Á¤ÁöÇÑ´Ù.

    + +
    /67:    accept(3, 0x001FEB74, 0x001FEB94, 1) (sleeping...)
    + +

    ±×µ¿¾È ¿¬°á´ë±â ¾²·¹µå´Â ¿¬°áÀ» (¸ðµç worker°¡ ÀÛ¾÷ÁßÀ̸é + ¿¬°á´ë±â ¾²·¹µå¸¦ ¸ØÃß´Â worker MPMÀÇ È帧Á¦¾î ±â´É¿¡ µû¶ó) + worker ¾²·¹µå¿¡ ÇÒ´çÇÏÀÚ¸¶ÀÚ ´Ù¸¥ ¿¬°áÀ» ¹Þ¾ÆµéÀÏ ¼ö ÀÖ´Ù. + ÀÌ ±â·Ï¿¡´Â ³ª¿ÀÁö ¾ÊÁö¸¸, worker ¾²·¹µå°¡ ¹æ±Ý ¹ÞÀº ¿¬°áÀ» + ó¸®ÇÏ´Â µ¿¾È ´ÙÀ½ accept(2)°¡ (¿äûÀÌ ¸Å¿ì + ¸¹Àº °æ¿ì Ç×»ó) ÀϾ ¼ö ÀÖ´Ù.

    + +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/misc/perf-tuning.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/misc/perf-tuning.html.tr.utf8 new file mode 100644 index 00000000..44b6dba2 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/misc/perf-tuning.html.tr.utf8 @@ -0,0 +1,1100 @@ + + + +Apache’de Başarımın Arttırılması - Apache HTTP Sunucusu + + + + + +
    <-
    +

    Apache’de Başarımın Arttırılması

    +
    +

    Mevcut Diller:  en  | + ko  | + tr 

    +
    + + +

    Apache 2.x, esneklik, taşınabilirlik ve başarım arasında bir denge + sağlamak üzere tasarlanmış genel amaçlı bir HTTP sunucusudur. Başka + sunucularla kıyaslama denemelerinde öne geçmek üzere tasarlanmamış + olsa da Apache 2.x gerçek yaşamda karşılaşılan pek çok durumda oldukça + yüksek bir başarıma ulaşacak yetenektedir.

    + +

    Apache 1.3 ile karşılaştırıldığında 2.x sürümleri toplam veri hızını + ve ölçeklenebilirliği arttırmak için pek çok en iyileme seçeneği + içerir. Bu iyileştirmelerin pek çoğu zaten öntanımlı olarak etkin + olmakla birlikte derleme ve kullanım sırasında başarımı önemli ölçüde + etkileyebilen yapılandırma seçenekleri de mevcuttur. Bu belgede, bir + Apache 2.x kurulumunda sunucu yöneticisinin sunucunun başarımını + arttırmak amacıyla yapılandırma sırasında neler yapabileceğinden + bahsedilmiştir. Bu yapılandırma seçeneklerinden bazıları, httpd’nin + donanımın ve işletim sisteminin olanaklarından daha iyi + yararlanabilmesini sağlarken bir kısmı da daha hızlı bir sunum için + yöneticinin işlevsellikten ödün verebilmesini olanaklı kılar.

    + +
    + +
    top
    +
    +

    Donanım ve İşletim Sistemi ile İlgili Konular

    + + + +

    HTTP sunucusunun başarımını etkileyen en önemli donanım bellektir + (RAM). Bir HTTP sunucusu asla takaslama yapmamalıdır. Çünkü takaslama, + kullanıcının "yeterince hız" umduğu noktada sunumun gecikmesine sebep + olur. Böyle bir durumda kullanıcılar yüklemeyi durdurup tekrar + başlatma eğilimindedirler; sonuçta yük daha da artar. MaxClients yönergesinin değerini + değiştirerek takaslamaya sebep olabilecek kadar çok çocuk süreç + oluşturulmasını engelleyebilirsiniz ve böyle bir durumda bunu mutlaka + yapmalısınız. Bunun için yapacağınız işlem basittir: top + benzeri bir araç üzerinden çalışan süreçlerinizin bir listesini alıp + Apache süreçlerinizin ortalama büyüklüğünü saptayıp, mevcut bellekten + bir kısmını diğer süreçler için ayırdıktan sonra kalan miktarı bu + değere bölerseniz yönergeye atayacağınız değeri bulmuş olursunuz.

    + +

    Donanımın diğer unsurları için kararı siz verin: Daha hızlı işlemci, + daha hızlı ağ kartı, daha hızlı disk; daha hızlının ne kadar hızlı + olacağını deneyimlerinize bağlı olarak tamamen sizin ihtiyaçlarınız + belirler.

    + +

    İşletim sistemi seçimi büyük oranda yerel ilgi konusudur. Fakat yine + de, genelde yararlılığı kanıtlanmış bazı kurallar bu seçimde size + yardımcı olabilir:

    + +
      +
    • +

      Seçtiğiniz işletim sisteminin (çekirdeğin) en son kararlı + sürümünü çalıştırın. Bir çok işletim sistemi, son yıllarda TCP + yığıtları ve evre kütüphaneleri ile ilgili belirgin iyileştirmeler + yapmışlar ve yapmaktadırlar.

      +
    • + +
    • +

      İşletim sisteminiz sendfile(2) sistem çağrısını + destekliyorsa bunun etkinleştirilebildiği sürümün kurulu olması + önemlidir. (Örneğin, Linux için bu, Linux 2.4 ve sonraki sürümler + anlamına gelirken, Solaris için Solaris 8’den önceki sürümlerin + yamanması gerektirdiği anlamına gelmektedir.) + sendfile işlevinin desteklendiği sistemlerde Apache 2 + duruk içeriği daha hızlı teslim etmek ve işlemci kullanımını + düşürmek amacıyla bu işlevselliği kullanacaktır.

      +
    • +
    + +
    top
    +
    +

    Çalışma Anı Yapılandırması ile İlgili Konular

    + + + + + +

    HostnameLookups ve DNS ile ilgili diğer konular

    + + + +

    Apache 1.3 öncesinde, HostnameLookups yönergesinin öntanımlı değeri + On idi. İstek yerine getirilmeden önce bir DNS sorgusu + yapılmasını gerektirmesi sebebiyle bu ayarlama her istekte bir + miktar gecikmeye sebep olurdu. Apache 1.3’ten itibaren yönergenin + öntanımlı değeri Off yapılmıştır. Eğer günlük + dosyalarınızda konak isimlerinin bulunmasını isterseniz, Apache ile + birlikte gelen logresolve programını + kullanabileceğiniz gibi günlük raporlarını çözümleyen Apache ile + gelmeyen programlardan herhangi birini de kullanabilirsiniz.

    + +

    Günlük dosyaları üzerindeki bu işlemi sunucu makinesi dışında + günlük dosyasının bir kopyası üzerinde yapmanızı öneririz. Aksi + takdirde sunucunuzun başarımı önemli ölçüde etkilenebilir.

    + +

    Allow veya + Deny + yönergelerinde IP adresi yerine bir konak veya alan ismi + belirtirseniz, iki DNS sorguluk bir bedel ödersiniz (biri normal, + diğeri IP taklidine karşı ters DNS sorgusu). Başarımı en iyilemek + için bu yönergelerde mümkün olduğunca isim yerine IP adreslerini + kullanınız.

    + +

    HostnameLookups + yönergelerinin <Location /server-status> gibi + bölüm yönergelerinin içinde de yer alabileceğini unutmayın. Bu gibi + durumlarda DNS sorguları sadece istek kuralla eşleştiği takdirde + yapılacaktır. Aşağıdaki örnekte .html ve + .cgi dosyalarına yapılan istekler hariç DNS sorguları + iptal edilmektedir:

    + +

    + HostnameLookups off
    + <Files ~ "\.(html|cgi)$">
    + + HostnameLookups on
    +
    + </Files> +

    + +

    Yine de bazı CGI’lerin DNS isimlerine ihtiyacı olursa bu CGI’lerin + bu ihtiyaçlarına yönelik olarak gethostbyname çağrıları + yapabileceğini gözardı etmeyiniz.

    + + + +

    FollowSymLinks ve + SymLinksIfOwnerMatch

    + + + +

    URL uzayınızda geçerli olmak üzere bir Options + FollowSymLinks yoksa veya Options + SymLinksIfOwnerMatch yönergeleri varsa, Apache her sembolik + bağın üzerinde bazı sınamalar yapmak için ek bir sistem çağrısından + başka istenen her dosya için de ayrı bir çağrı yapacaktır.

    + +

    Örnek:

    + DocumentRoot /siteler/htdocs
    + <Directory />
    + + Options SymLinksIfOwnerMatch
    +
    + </Directory> +

    + +

    Bu durumda /index.html için bir istek yapıldığında + Apache, /siteler, /siteler/htdocs ve
    + /siteler/htdocs/index.html üzerinde + lstat(2) çağrıları yapacaktır. lstat + sonuçları önbelleğe kaydedilmediğinden bu işlem her istekte + yinelenecektir. Amacınız gerçekten sembolik bağları güvenlik + açısından sınamaksa bunu şöyle yapabilirsiniz:

    + +

    + DocumentRoot /siteler/htdocs
    + <Directory />
    + + Options FollowSymLinks
    +
    + </Directory>
    +
    + <Directory /sitem/htdocs>
    + + Options -FollowSymLinks +SymLinksIfOwnerMatch
    +
    + </Directory> +

    + +

    Böylece DocumentRoot altındaki + dosyalar için fazladan bir çağrı yapılmasını engellemiş olursunuz. + Eğer bazı bölümlerde Alias, RewriteRule gibi yönergeler üzerinden belge kök + dizininizin dışında kalan dosya yollarına sahipseniz benzer + işlemleri onlar için de yapmalısınız. Sembolik bağ koruması yapmamak + suretiyle başarımı arttırmak isterseniz, FollowSymLinks + seçeneğini her yerde etkin kılın ve + SymLinksIfOwnerMatch seçeneğini asla + etkinleştirmeyin.

    + + + +

    AllowOverride

    + + + +

    Genellikle .htaccess dosyaları üzerinden yapıldığı + gibi URL uzayınızda geçersizleştirmelere izin veriyorsanız, Apache + her dosya bileşeni için bu .htaccess dosyalarını açmaya + çalışacaktır.

    + +

    Örnek:

    + DocumentRoot /siteler/htdocs
    + <Directory />
    + + AllowOverride all
    +
    + </Directory> +

    + +

    Bu durumda /index.html sayfasına yapılan bir istek için + Apache, /.htaccess, /siteler/.htaccess ve + /siteler/htdocs/.htaccess dosyalarını açmaya + çalışacaktır. Çözüm Options FollowSymLinks durumunun + benzeridir; başarımı arttırmak için dosya sisteminizin her yerinde + AllowOverride None olsun.

    + + + +

    Dil Uzlaşımı

    + + + +

    Başarımı son kırıntısına kadar arttırmak istiyorsanız, mümkünse + içerik dili uzlaşımı da yapmayın. Dil uzlaşımından yararlanmak + isterken büyük başarım kayıplarına uğrayabilirsiniz. Böyle bir + durumda sunucunun başarımını arttırmanın tek bir yolu vardır.

    + +

    + DirectoryIndex index +

    + +

    Yukarıdaki gibi bir dosya ismi kalıbı kullanmak yerine, aşağıdaki + gibi seçenekleri tam bir liste halinde belirtin:

    + +

    + DirectoryIndex index.cgi index.pl index.shtml index.html +

    + +

    Buradaki sıralama öncelik sırasını belirler; yani, + öncelikli olmasını istediğiniz seçeneği listenin başına + yazmalısınız.

    + +

    İstenen dosya için MultiViews kullanarak dizini + taratmak yerine, gerekli bilgiyi tek bir dosyadan okutmak suretiyle + başarımı arttırabilirsiniz. Bu amaçla türeşlem + (type-map) dosyaları kullanmanız yeterli olacaktır.

    + +

    Sitenizde içerik dili uzlaşımına gerek varsa, bunu Options + MultiViews yönergesi üzerinden değil, türeşlem dosyaları + kullanarak yapmayı deneyin. İçerik dili uzlaşımı ve türeşlem + dosyalarının oluşturulması hakkında daha ayrıntılı bilgi edinmek + için İçerik Uzlaşımı + belgesine bakınız.

    + + + +

    Bellek Eşlemleri

    + + + +

    Apache’nin SSI sayfalarında olduğu gibi teslim edilecek dosyanın + içeriğine bakma gereği duyduğu durumlarda, eğer işletim sistemi + mmap(2) ve benzerlerini destekliyorsa çekirdek normal + olarak dosyayı belleğe kopyalayacaktır.

    + +

    Bazı platformlarda bu belleğe eşleme işlemi başarımı arttırsa da + başarımın veya httpd kararlılığının zora girdiği durumlar + olabilmektedir:

    + +
      +
    • +

      Bazı işletim sistemlerinde işlemci sayısı artışına bağlı + olarak, mmap işlevi read(2) kadar iyi + ölçeklenmemiştir. Örneğin, çok işlemcili Solaris sunucularda + mmap iptal edildiği takdirde içeriği sunucu + tarafından işlenen dosyalar üzerinde bazen daha hızlı işlem + yapılabilmektedir.

      +
    • + +
    • +

      Belleğe kopyalanacak dosya NFS üzerinden bağlanan bir dosya + sistemindeyse ve dosya başka bir NFS istemcisi makine tarafından + silinmiş veya dosyanın boyutu değiştirilmişse sunucunuz dosyaya + tekrar erişmeye çalıştığında bir hata alabilecektir.

      +
    • +
    + +

    Böyle durumların olasılık dahilinde olduğu kurulumlarda içeriği + sunucu tarafından işlenecek dosyaların belleğe kopyalanmaması için + yapılandırmanıza EnableMMAP off satırını ekleyiniz. + (Dikkat: Bu yönerge dizin seviyesinde geçersizleştirilebilen + yönergelerdendir.)

    + + + +

    sendfile

    + + + +

    Apache’nin duruk dosyalarda olduğu gibi teslim edilecek dosyanın + içeriğine bakmadığı durumlarda, eğer işletim sistemi + sendfile(2) desteğine sahipse çekirdek normal olarak bu + desteği kullanacaktır.

    + +

    Bazı platformlarda sendfile kullanımı, okuma ve yazma + işlemlerinin ayrı ayrı yapılmamasını sağlasa da + sendfile kullanımının httpd kararlılığını bozduğu bazı + durumlar sözkonusudur:

    + +
      +
    • +

      Bazı platformlar derleme sisteminin saptayamadığı bozuk bir + sendfile desteğine sahip olabilir. Özellikle + derleme işleminin başka bir platformda yapılıp + sendfile desteği bozuk bir makineye kurulum + yapıldığı durumlarda bu desteğin bozuk olduğu + saptanamayacaktır.

      +
    • +
    • +

      Çekirdek, NFS üzerinden erişilen ağ dosyalarını kendi önbelleği + üzerinden gerektiği gibi sunamayabilir.

      +
    • +
    + +

    Böyle durumların olasılık dahilinde olduğu kurulumlarda içeriğin + sendfile desteğiyle teslim edilmemesi için + yapılandırmanıza EnableSendfile off satırını ekleyiniz. + (Dikkat: Bu yönerge dizin seviyesinde geçersizleştirilebilen + yönergelerdendir.)

    + + + +

    Süreç Oluşturma

    + + + +

    Apache 1.3 öncesinde MinSpareServers, MaxSpareServers ve StartServers ayarları, başka sunucularla kıyaslama + denemelerinde olağanüstü kötü sonuçlar alınmasına sebep olmaktaydı. + Özellikle uygulanan yükü karşılamaya yetecek sayıda çocuk süreç + oluşturulması aşamasında Apache’nin elde ettiği ivme bunlardan + biriydi. Başlangıçta StartServers yönergesiyle belli sayıda süreç + oluşturulduktan sonra her saniyede bir tane olmak üzere MinSpareServers sayıda çocuk süreç + oluşturulmaktaydı. Örneğin, aynı anda 100 isteğe yanıt vermek için + StartServers + yönergesinin öntanımlı değeri olarak başta 5 süreç + oluşturulduğundan kalan süreçler için 95 saniye geçmesi gerekirdi. + Sık sık yeniden başlatılmadıklarından dolayı gerçek hayatta + sunucuların başına gelen de buydu. Başka sunucularla kıyaslama + denemelerinde ise işlem sadece on dakika sürmekte ve içler acısı + sonuçlar alınmaktaydı.

    + +

    Saniyede bir kuralı, sunucunun yeni çocukları oluşturması sırasında + sistemin aşırı meşgul duruma düşmemesi için alınmış bir önlemdi. + Makine çocuk süreç oluşturmakla meşgul edildiği sürece isteklere + yanıt veremeyecektir. Böylesi bir durum Apache’nin başarımını + kötüleştirmekten başka işe yaramayacaktır. Apache 1.3’te saniyede + bir kuralı biraz esnetildi. Yeni gerçeklenimde artık bir süreç + oluşturduktan bir saniye sonra iki süreç, bir saniye sonra dört + süreç oluşturulmakta ve işlem, saniyede 32 çocuk süreç oluşturulur + duruma gelene kadar böyle ivmelenmektedir. Çocuk süreç oluşturma + işlemi MinSpareServers + değerine ulaşılınca durmaktadır.

    + +

    Bu, MinSpareServers, + MaxSpareServers ve + StartServers ayarlarıyla + oynamayı neredeyse gereksiz kılacak kadar iyi sonuçlar verecek gibi + görünmektedir. Saniyede 4 çocuktan fazlası oluşturulmaya + başlandığında hata günlüğüne bazı iletiler düşmeye başlar. Bu + iletilerin sayısı çok artarsa bu ayarlarla oynama vakti gelmiş + demektir. Bunun için mod_status çıktısını bir + kılavuz olarak kullanabilirsiniz.

    + +

    Süreç oluşturmayla ilgili olarak süreç ölümü MaxRequestsPerChild değeri ile + sağlanır. Bu değer öntanımlı olarak 0 olup, çocuk süreç + başına istek sayısının sınırsız olduğu anlamına gelir. Eğer + yapılandırmanızda bu değeri 30 gibi çok düşük bir + değere ayarlarsanız bunu hemen kaldırmak zorunda kalabilirsiniz. + Sunucunuzu SunOS veya Solaris’in eski bir sürümü üzerinde + çalıştırıyorsanız bellek kaçaklarına sebep olmamak için bu değeri + 10000 ile sınırlayınız.

    + +

    Kalıcı bağlantı özelliğini kullanıyorsanız, çocuk süreçler zaten + açık bağlantılardan istek beklemekte olacaklardır. KeepAliveTimeout yönergesinin öntanımlı + değeri 15 saniye olup bu etkiyi en aza indirmeye yönelik + süredir. Burada ağ band genişliği ile sunucu kaynaklarının kullanımı + arasında bir seçim yapmak söz konusudur. Hiçbir şey umurunuzda + değilse + çoğu ayrıcalığın yitirilmesi pahasına bu değeri rahatça + 60 saniyenin üzerine çıkarabilirsiniz.

    + + +
    top
    +
    +

    Derleme Sırasında Yapılandırma ile İlgili Konular

    + + +

    MPM Seçimi

    + + +

    Apache 2.x, Çok Süreçlilik Modülleri + (MPM) adı verilen eklemlenebilir çok görevlilik modellerini + destekler. Apache’yi derlerken bu MPM’lerden birini seçmeniz + gerekir. MPM’lerden bazıları platformlara özeldir: + beos, mpm_netware, + mpmt_os2 ve mpm_winnt. Unix + benzeri sistemler için ise seçebileceğiniz modül sayısı birden + fazladır. MPM seçiminin httpd’nin hızında ve ölçeklenebilirliğinde + bazı etkileri olabilir:

    + +
      + +
    • worker modülü her biri çok evreli çok sayıda + çocuk süreç kullanımını destekler. Her evre aynı anda tek bir + bağlantıya hizmet sunar. Aynı hizmeti daha az bellek harcayarak + vermesi nedeniyle yüksek trafiğe sahip sunucularda + prefork modülüne göre daha iyi bir seçimdir.
    • + +
    • prefork modülü her biri tek bir evreye sahip + çok sayıda çocuk süreç kullanımını destekler. Her süreç aynı anda + tek bir bağlantıya hizmet sunar. Çoğu sistemde daha hızlı olması + nedeniyle worker modülüne göre daha iyi bir seçim + olarak görünürse de bunu daha fazla bellek kullanarak sağlar. + prefork modülünün evresiz tasarımının + worker modülüne göre bazı yararlı tarafları + vardır: Çok evreli sistemlerde güvenilir olmayan üçüncü parti + modülleri kullanabilir ve evrelerde hata ayıklamanın yetersiz + kaldığı platformlarda hatalarını ayıklamak daha kolaydır.
    • + +
    + +

    Bu modüller ve diğerleri hakkında daha ayrıntılı bilgi edinmek için + Çok Süreçlilik Modülleri belgesine + bakınız.

    + + + +

    Modüller

    + + + +

    Bellek kullanımı başarım konusunda önemli olduğundan gerçekte + kullanmadığınız modülleri elemeye çalışmalısınız. Modülleri birer DSO olarak derlediyseniz LoadModule yönergesinin bulunduğu satırı + açıklama haline getirmeniz modülden kurtulmanız için yeterli + olacaktır. Modülleri bu şekilde kaldırarak onların yokluğunda + sitenizin hala işlevlerini yerine getirdiğini görme şansına da + kavuşmuş olursunuz.

    + +

    Ancak, eğer modülleri Apache çalıştırılabilirinin içine + gömmüşseniz istenmeyen modülleri kaldırmak için Apache'yi yeniden + derlemeniz gerekir.

    + +

    Bu noktada bir soru akla gelebilir: Hangi modüller gerekli, + hangileri değil? Bu sorunun yanıtı şüphesiz siteden siteye değişir. + Ancak, olmazsa olmaz moüller olarak mod_mime, + mod_dir ve mod_log_config + modüllerini sayabiliriz. Bunlardan mod_log_config + olmadan da bir sitenin çalışabileceğinden hareketle bu modülün + varlığı isteğe bağlı olsa da bu modülü kaldırmanızı önermiyoruz.

    + + + +

    Atomik İşlemler

    + + + +

    Worker MPM'nin en son geliştirme sürümleri ve + mod_cache gibi bazı modüller APR'nin atomik API'sini + kullanırlar. Bu API, düşük ayarlı evre eşzamanlamasında atomik + işlemler yapar.

    + +

    Öntanımlı olarak, APR bu işlemleri hedef işletim sistemi/işlemci + platformunda kullanılabilecek en verimli mekanizmayı kullanarak + gerçekleştirir. Günümüz işlemcilerinin çoğu, örneğin, bir atomik + karşılaştırma ve takas (CAS) işlemini donanımda gerçekleştirmektedir. + Bazı platformlarda APR'nin atomik işlemler için öntanımlı olarak daha + yavaş olan mutekslere dayalı gerçeklenimi kullanmasının sebebi eski + işlemcilerde bu tür makine kodlarının yokluğudur. Apache'yi bu tür + platformalarda günümüz işlemcileriyde çalıştırmayı düşünüyorsanız + Apache'yi derlemek için yapılandırırken en hızlı atomik işlemin + seçilebilmesi için --enable-nonportable-atomics + seçeneğini kullanın:

    + +

    + ./buildconf
    + ./configure --with-mpm=worker --enable-nonportable-atomics=yes +

    + +

    --enable-nonportable-atomics seçeneği şu platformlar + için uygundur:

    + +
      + +
    • SPARC üzerinde Solaris
      + APR öntanımlı olarak, SPARC/Solaris üzerinde mutekslere dayalı + atomik işlemleri kullanır. Ancak, + --enable-nonportable-atomics yapılandırmasını + kullanırsanız, donanım üzerinde hızlı karşılaştırma ve takas + için uygun SPARC v8plus kodunu kullanacak şekilde kod üretilir. + Apache'yi bu seçenekle yapılandırırsanız atomik işlemler daha + verimli olacak fakat derlenen Apache çalıştırılabiliri sadece + UltraSPARC kırmığı üzerinde çalışacaktır. +
    • + +
    • x86 üzerinde Linux
      + APR öntanımlı olarak, Linux üzerinde mutekslere dayalı atomik + işlemleri kullanır. Ancak, + --enable-nonportable-atomics yapılandırmasını + kullanırsanız, donanım üzerinde hızlı karşılaştırma ve takas + için uygun 486 kodunu kullanacak şekilde kod üretilir. Apache'yi + bu seçenekle yapılandırırsanız atomik işlemler daha verimli + olacak fakat derlenen Apache çalıştırılabiliri (386 üzerinde + değil) sadece 486 ve sonrası kırmıklarda çalışacaktır. +
    • + +
    + + + +

    mod_status ve ExtendedStatus On +

    + + + +

    mod_status modülünü derlemiş ve Apache'yi + yapılandırır ve çalıştırırken ExtendedStatus On satırını + da kullanmışsanız Apache her istek üzerinde + gettimeofday(2) (veya işletim sistemine bağlı olarak + time(2)) çağrısından başka (1.3 öncesinde) fazladan + defalarca time(2) çağrıları yapacaktır. Bu çağrılarla + durum raporununun zamanlama bilgilerini içermesi sağlanır. Başarımı + arttırmak için ExtendedStatus off yapın (zaten öntanımlı + böyledir).

    + + + +

    accept dizgilemesi ve çok soketli işlem

    + + + +

    Uyarı:

    +

    Bu bölüm, Apache HTTP sunucusunun 2.x sürümlerinde yapılan + değişikliklere göre tamamen güncellenmemiştir. Bazı bilgiler hala + geçerliyse de lütfen dikkatli kullanınız.

    +
    + +

    Burada Unix soket arayüzü gerçeklenirken ihmal edilen bir durumdan + bahsedeceğiz. HTTP sunucunuzun çok sayıda adresten çok sayıda portu + dinlemek için çok sayıda Listen yönergesi kullanmakta olduğunu varsayalım. Her + soketi çalıştığını görmek için denerken Apache bağlantı için + select(2) kullanacaktır. select(2) çağrısı + bu soketin üzerinde sıfır veya en azından bir + bağlantının beklemekte olduğu anlamına gelir. Apache'nin modeli çok + sayıda çocuk süreç içerir ve boşta olanların tümünde aynı anda yeni + bağlantılar denenebilir. Gerçekte çalışan kod bu olmasa da meramımızı + anlatmak için kodun şöyle bir şey olduğunu varsayabiliriz:

    + +

    + for (;;) {
    + + for (;;) {
    + + fd_set accept_fds;
    +
    + FD_ZERO (&accept_fds);
    + for (i = first_socket; i <= last_socket; ++i) {
    + + FD_SET (i, &accept_fds);
    +
    + }
    + rc = select (last_socket+1, &accept_fds, NULL, NULL, NULL);
    + if (rc < 1) continue;
    + new_connection = -1;
    + for (i = first_socket; i <= last_socket; ++i) {
    + + if (FD_ISSET (i, &accept_fds)) {
    + + new_connection = accept (i, NULL, NULL);
    + if (new_connection != -1) break;
    +
    + }
    +
    + }
    + if (new_connection != -1) break;
    +
    + }
    + process the new_connection;
    +
    + } +

    + +

    Bu özet gerçeklenim bir takım açlık sorunlarına sebep olur. Bu + döngünün çalışması sırasında aynı anda çok sayıda çocuk süreç yeniden + çağrılır ve istekler arasında kalan çoğu çocuk da select + ile engellenir. Engellenen tüm bu çocuklar soketlerden herhangi biri + üzerinde tek bir istek göründüğünde select tarafından + uyandırılıp işleme sokulmak üzere döndürülürler (uyandırılan çocuk + sayısı işletim sistemine ve zamanlama ayarlarına göre değişiklik + gösterir). Bunların hepsi döngüye katılıp bağlantı kabul etmeye + (accept) çalışırlar. Fakat içlerinden yalnız biri + (sadece bir bağlantı isteğinin mevcut olduğu varsayımıyla) bunu + başarabilir. Kalanının bağlantı kabul etmesi (accept) + engellenir. Bu durum, bu çocukları istekleri başka başka soketlerden + değil mecburen tek bir soketten kabul etmeye kilitler ve bu soket + üzerinde yeni bir istek belirip uyandırılana kadar bu durumda + kalırlar. Bu açlık sorunu ilk olarak PR#467 sayılı raporla + belgelenmiştir. Bu sorunun en az iki çözümü vardır.

    + +

    Çözümün biri engellenmeyen soket kullanımıdır. Bu durumda + accept çocukları engellemeyecek ve yapılan bir + bağlantının ardından diğer çocuklar durumları değişmeksizin bağlantı + beklemeye devam edeceklerdir. Fakat bu durum işlemci zamanının boşa + harcanmasına sebep olur. Seçilmiş (select) boşta on + çocuğun olduğunu ve bir bağlantı geldiğini varsayalım. Kalan dokuz + çocuk işine devam edip bağlantı kabul etmeyi (accept) + deneyecek, başarızsız olacak, dönecek başa, tekrar seçilecek + (select) ve böyle hiçbir iş yapmadan dönüp duracaktır. Bu + arada hizmet sunmakta olanlar da işlerini bitirdikten sonra bu + döngüdeki yerlerini alacaklardır. Aynı kutunun içinde boşta bir sürü + işlemciniz (çok işlemcili sistemler) yoksa bu çözüm pek verimli + olmayacaktır.

    + +

    Diğer çözüm ise Apache tarafından kullanılan çözüm olup, girdiyi + bir iç döngüde sıraya sokmaktır. Döngü aşağıda örneklenmiştir (farklar + vurgulanmıştır):

    + +

    + for (;;) {
    + + accept_mutex_on ();
    + for (;;) {
    + + fd_set accept_fds;
    +
    + FD_ZERO (&accept_fds);
    + for (i = first_socket; i <= last_socket; ++i) {
    + + FD_SET (i, &accept_fds);
    +
    + }
    + rc = select (last_socket+1, &accept_fds, NULL, NULL, NULL);
    + if (rc < 1) continue;
    + new_connection = -1;
    + for (i = first_socket; i <= last_socket; ++i) {
    + + if (FD_ISSET (i, &accept_fds)) {
    + + new_connection = accept (i, NULL, NULL);
    + if (new_connection != -1) break;
    +
    + }
    +
    + }
    + if (new_connection != -1) break;
    +
    + }
    + accept_mutex_off ();
    + process the new_connection;
    +
    + } +

    + +

    accept_mutex_on ve accept_mutex_off işlevleri bir karşılıklı red + semoforu oluştururlar. Mutekse aynı anda sadece bir çocuk sahip + olabilir. Bu muteksleri gerçeklemek için çeşitli seçenekler vardır. + Seçim, src/conf.h (1.3 öncesi) veya + src/include/ap_config.h (1.3 ve sonrası) dosyasında + tanımlanmıştır. Bazı mimariler bir kilitleme seçeneğine sahip + değildir. Böyle mimarilerde çok sayıda Listen yönergesi kullanmak güvenilir + olmayacaktır.

    + +

    AcceptMutex yönergesi, + seçilen muteks gerçeklenimini çalışma anında değiştirmek için + kullanılabilir.

    + +
    +
    AcceptMutex flock
    + +
    +

    Bu yöntem, bir kilit dosyasını kilitlemek için + flock(2) sistem çağrısını kullanır (Kilit dosyasının + yeri LockFile + yönergesiyle belirtilir).

    +
    + +
    AcceptMutex fcntl
    + +
    +

    Bu yöntem, bir kilit dosyasını kilitlemek için + fcntl(2) sistem çağrısını kullanır (Kilit dosyasının + yeri LockFile + yönergesiyle belirtilir).

    +
    + +
    AcceptMutex sysvsem
    + +
    +

    (1.3 ve sonrası) Bu yöntem muteksi gerçeklemek için SysV tarzı + semaforları kullanır. Maalesef, SysV tarzı semaforların bazı yan + etkileri vardır. Bunlardan biri Apache'nin semaforu temizlemeden + ölme ihtimalidir (ipcs(8) kılavuz sayfasına bakınız). + Diğer biri, CGI'lerin sunucu ile aynı kullanıcı kimliğini + kullanmaları nedeniyle semafor arayüzünün hizmet reddi + saldırılarına açık olmasıdır (suexec veya + cgiwrapper gibi bir şeyler kullanmadıkça bütün + CGI'ler için söz konusudur). Bu sebeple bu yöntem IRIX haricinde + hiçbir mimaride kullanılmaz (önceki ikisi çoğu IRIX makine için + elde edilmesi imkansız derecede pahalı olduğundan).

    +
    + +
    AcceptMutex pthread
    + +
    +

    (1.3 ve sonrası) Bu yöntem POSIX mutekslerini kullanır ve POSIX + evreleri belirtiminin tamamen gerçeklendiği mimarilerde çalışması + gerekirse de sadece Solaris (2.5 ve sonrası) üzerinde ve sadece + belli yapılandırmalarla çalışmakta gibi görünmektedir. Bunu + denemişseniz sunucunuzun çöktüğünü ve yanıt vermediğini + görmüşsünüzdür. Sadece duruk içerikli sunucular iyi + çalışmaktadır.

    +
    + +
    AcceptMutex posixsem
    + +
    +

    (2.0 ve sonrası) Bu yöntem POSIX semaforlarını kullanır. Eğer + işlem sırasında bir evre muteks kaynaklı parçalama arızalarıyla + karşı karşıya kalırsa HTTP sunucusunun çökmesiyle semaforun sahibi + kurtarılamaz.

    +
    + +
    + +

    Eğer sisteminiz yukarıda bahsedilenler dışında başka bir dizgileme + yöntemi kullanıyorsa bununla ilgili kodun APR'ye eklenmesi girilen + zahmete değecektir.

    + +

    Başka bir çözüm daha vardır ancak döngü kısmen dizgilenmeyeceğinden + (yani belli sayıda sürece izin verilemeyeceğinden) asla + gerçeklenmemiştir. Bu sadece, aynı anda çok sayıda çocuk sürecin + çalışabileceği ve dolayısıyla band genişliğinin tüm yönleriyle + kullanılabileceği çok işlemcili sistemlerde ilginç olabilirdi. Bu + gelecekte incelenmeye değer bir konu olmakla beraber çok sayıda HTTP + sunucusunun aynı anda aynı amaca hizmet edecek şekilde çalışması + standart olarak pek mümkün görülmediğinden bu olasılık çok + düşüktür.

    + +

    En yüksek başarımı elde etmek için ideal olanı sunucuları + çalıştırırken çok sayıda Listen yönergesi kullanmamaktır. Fakat siz yine de + okumaya devam edin.

    + + + +

    accept dizgilemesi - tek soket

    + + + +

    Çok soketli sunucular için yukarıda açıklananlar iyi güzel de tek + soketli sunucularda durum ne? Kuramsal olarak, bunların hiçbiriyle bir + sorunları olmaması gerekir. Çünkü yeni bir bağlantı gelene kadar tüm + çocuklar accept(2) ile engellenirler dolayısıyla hiçbir + açlık sorununun ortaya çıkmaması gerekir. Uygulamada ise son + kullanıcıdan gizli olarak, yukarıda engellenmeyen çocuklar çözümünde + bahsedilenle hemen hemen aynı "boşa dönüp durma" davranışı mevcuttur. + Çoğu TCP yığıtı bu yolu gerçeklemiştir. Çekirdek, yeni bir bağlantı + ortaya çıktığında accept ile engellenen tüm süreçleri + uyandırır. Bu süreçlerden bağlantıyı alan kullanıcı bölgesine geçerken + çekirdek içinde döngüde olan diğerleri de yeni bağlantı keşfedilene + kadar uykularına geri dönerler. Bu çekirdek içi döngü, kullanıcı + bölgesindeki kodlara görünür değildir ama bu olmadıkları anlamına + gelmez. Bu durum, çok soketli engellenmeyen çocuklar çözümündeki boşa + döngünün sebep olduğu gereksiz işlemci yükü sorununu içinde + barındırır.

    + +

    Bununla birlikte, tek soketli durumda bile bundan daha verimli bir + davranış sergileyen bir çok mimari bulduk. Bu aslında hemen hemen her + durumda öntanımlı olarak böyledir. Linux altında yapılan üstünkörü + denemelerde (128MB bellekli çift Pentium pro 166 işlemcili makinede + Linux 2.0.30) tek sokette dizgilemenin dizgilenmemiş duruma göre + saniyede %3 daha az istekle sonuçlandığı gösterilmiştir. Fakat + dizgilenmemiş tek soket durumunda her istekte 100ms'lik ek bir gecikme + olduğu görülmüştür. Bu gecikmenin sebebi muhtemelen uzun mesafeli + hatlar olup sadece yerel ağlarda söz konusudur. Tek soketli + dizgilemeyi geçersiz kılmak için + SINGLE_LISTEN_UNSERIALIZED_ACCEPT tanımlarsanız tek + soketli sunucularda artık dizgileme yapılmayacaktır.

    + + + +

    Kapatmayı zamana yaymak

    + + + +

    draft-ietf-http-connection-00.txt taslağının 8. bölümünde + bahsedildiği gibi, bir HTTP sunucusunun protokolü güvenilir + şekilde gerçeklemesi için her iki yöndeki iletişimi + birbirinden bağımsız olarak (iki yönlü bir TCP bağlantısının her + yarısını diğerinden bağımsız olarak) kapatması gerekir. Bu olgu başka + sunucular tarafından çoğunlukla dikkate alınmaz fakat Apache'nin 1.2 + sürümünden beri gerektiği gibi gerçeklenmektedir.

    + +

    Bu özellik Apache'ye eklendiğinde Unix'in çeşitli sürümlerinde + uzgörüsüzlükten dolayı bir takım geçici telaş sorunlarına sebep oldu. + TCP belirtimi FIN_WAIT_2 durumunda bir zaman aşımından + bahsetmez ama yasaklamaz da. Zaman aşımı olmayan sistemlerde, Apache + 1.2 çoğu soketin sonsuza kadar FIN_WAIT_2 durumunda + takılıp kalmasına sebep olur. Çoğu durumda, satıcıdan sağlanan en son + TCP/IP yamalarını uygulanarak bu önlenebilir. Satıcının hiçbir yeni + yama dağıtmadığı durumlarda (örneğin, SunOS4 -- bir kaynak lisansı ile + insanlar bunu kendileri yamayabilirse de) bu özelliği devre dışı + bırakmaya karar verdik.

    + +

    Bunun üstesinden gelmenin iki yolu vardır. Bunlardan biri + SO_LINGER soket seçeneğidir. Bu işin kaderi buymuş gibi + görünürse de çoğu TCP/IP yığıtında bu gerektiği gibi + gerçeklenmemiştir. Bu yığıtlar üzerinde, bu yöntemin, doğru bir + gerçeklenimle bile (örneğin, Linux 2.0.31) sonraki çözümden daha + pahalı olduğu ortaya çıkmıştır.

    + +

    Çoğunlukla, Apache bunu (http_main.c içindeki) + lingering_close adında bir işlevle gerçekler. Bu işlev + kabaca şöyle görünür:

    + +

    + void lingering_close (int s)
    + {
    + + char junk_buffer[2048];
    +
    + /* gönderen tarafı kapat */
    + shutdown (s, 1);
    +
    + signal (SIGALRM, lingering_death);
    + alarm (30);
    +
    + for (;;) {
    + + /* s'i okumak için, 2 saniyelik zaman aşımı ile seç */
    + select (s for reading, 2 second timeout);
    + /* Hata oluşmuşsa döngüden çık */
    + if (error) break;
    + /* s okumak için hazırsa */
    + if (s is ready for reading) {
    + + if (read (s, junk_buffer, sizeof (junk_buffer)) <= 0) {
    + + break;
    +
    + }
    + /* geri kalan herşey burada */
    +
    + }
    +
    + }
    +
    + close (s);
    +
    + } +

    + +

    Bağlantı sonunda bu doğal olarak biraz daha masrafa yol açar, fakat + güvenilir bir gerçeklenim için bu gereklidir. HTTP/1.1'in daha yaygın + kullanılmaya başlanması ve tüm bağlantıların kalıcı hale gelmesiyle bu + gerçeklenim daha fazla istek üzerinden kendi masrafını + karşılayacaktır. Ateşle oynamak ve bu özelliği devre dışı bırakmak + isterseniz NO_LINGCLOSE'u tanımlayabilirsiniz, fakat bu + asla önerilmez. Özellikle, HTTP/1.1'den itibaren boruhatlı kalıcı + bağlantıların lingering_close kullanmaya başlaması mutlak + bir gerekliliktir (ve + boruhatlı bağlantıların daha hızlı olması nedeniyle bu + bağlantıları desteklemek isteyebilirsiniz).

    + + + +

    Çetele Dosyası

    + + + +

    Apache'nin ana ve alt süreçleri birbirleriyle çetele denen birşey + üzerinden haberleşirler. Bunun en mükemmel şekilde paylaşımlı bellekte + gerçeklenmesi gerekir. Eriştiğimiz veya portlarını ayrıntılı olarak + belirttiğimiz işletim sistemleri için bu, genellikle paylaşımlı bellek + kullanılarak gerçeklenir. Geri kalanlar, öntanımlı olarak bunu bir + disk dosyası kullanarak gerçekler. Bir disk dosyaı yavaş olmanın yanı + sıra güvenilir de değildir (ve daha az özelliğe sahiptir). Mimarinizin + src/main/conf.h dosyasını inceleyin ve + USE_MMAP_SCOREBOARD veya + USE_SHMGET_SCOREBOARD'a bakın. Bu ikisinden birinin (ve + yanı sıra sırasıyla HAVE_MMAP veya + HAVE_SHMGET'in) tanımlanmış olması, sağlanan paylaşımlı + bellek kodunu etkinleştirir. Eğer sisteminiz diğer türdeki paylaşımlı + belleğe sahipse, src/main/http_main.c dosyasını açıp, + Apache'de bu belleği kullanması gereken kanca işlevleri ekleyin (Bize + de bir yama yollayın, lütfen).

    + +
    Tarihsel bilgi: Apache'nin Linux uyarlaması, Apache'nin 1.2 + sürümüne kadar paylaşımlı belleği kullanmaya başlamamıştı. Bu kusur, + Apache'nin Linux üzerindeki erken dönem sürümlerinin davranışlarının + zayıf ve güvenilmez olmasına yol açmıştı.
    + + + +

    DYNAMIC_MODULE_LIMIT

    + + + +

    Devingen olarak yüklenen modülleri kullanmamak niyetindeyseniz + (burayı okuyan ve sunucunuzun başarımını son kırıntısına kadar + arttırmakla ilgilenen biriyseniz bunu düşünmezsiniz), sunucunuzu + derlerken seçenekler arasına -DDYNAMIC_MODULE_LIMIT=0 + seçeneğini de ekleyin. Bu suretle, sadece, devingen olarak yüklenen + modüller için ayrılacak belleği kazanmış olacaksınız.

    + + + +
    top
    +
    +

    Ek: Bir çağrı izlemesinin ayrıntılı çözümlemesi

    + + + +

    Burada, Solaris 8 üzerinde worker MPM'li Apache 2.0.38'in bir sistem + çağrısı izlenmektedir. Bu izleme şu komutla elde edilmiştir:

    + +

    + truss -l -p httpd_çocuk_pidi. +

    + +

    -l seçeneği, truss'a hafif bir sürecin yaptığı her + sistem çağrısını (hafif süreç -- HS -- Solaris'in bir çekirdek seviyesi + evreleme biçimi) günlüğe yazmasını söyler.

    + +

    Diğer sistemlerin sistem çağrılarını izleyen farklı araçları vardır + (strace, ktrace, par gibi). + Bunlar da benzer çıktılar üretirler.

    + +

    Bu izleme sırasında, bir istemci httpd'den 10 KB'lık duruk bir dosya + talebinde bulunmuştur. Duruk olmayan veya içerik uzlaşımlı isteklerin + izleme kayıtları vahşice (bazı durumlarda epey çirkince) farklı + görünür.

    + +

    + /67: accept(3, 0x00200BEC, 0x00200C0C, 1) (uykuda...)
    + /67: accept(3, 0x00200BEC, 0x00200C0C, 1) = 9 +

    + +

    Bu izlemede, dinleyen evre HS #67 içinde çalışmaktadır.

    + +
    accept(2) dizgelemesinin olmayışına dikkat edin. + Özellikle bu platformda worker MPM, çok sayıda portu dinlemedikçe, + öntanımlı olarak dizgeleştirilmemiş bir accept çağrısı kullanır.
    + +

    + /65: lwp_park(0x00000000, 0) = 0
    + /67: lwp_unpark(65, 1) = 0 +

    + +

    Bağlantının kabul edilmesiyle, dinleyici evre isteği yerine getirmek + üzere bir worker evresini uyandırır. Bu izlemede, isteği yerine getiren + worker evresi HS #65'e aittir.

    + +

    + /65: getsockname(9, 0x00200BA4, 0x00200BC4, 1) = 0 +

    + +

    Sanal konakların gerçeklenimi sırasında, Apache'nin, bağlantıları + kabul etmek için kullanılan yerel soket adreslerini bilmesi gerekir. + Çoğu durumda bu çağrıyı bertaraf etmek mümkündür (hiç sanal konağın + olmadığı veya Listen + yönergelerinin mutlak adreslerle kullanıldığı durumlarda). Fakat bu en + iyilemeleri yapmak için henüz bir çaba harcanmamıştır.

    + +

    + /65: brk(0x002170E8) = 0
    + /65: brk(0x002190E8) = 0 +

    + +

    brk(2) çağrıları devingen bellekten bellek ayırır. httpd + çoğu isteği yerine getirirken özel bellek ayırıcılar + (apr_pool ve apr_bucket_alloc) kullandığından + bunlar bir sistem çağrısı izlemesinde nadiren görünür. Bu izlemede, + httpd henüz yeni başlatıldığından, özel bellek ayırıcıları oluşturmak + için ham bellek bloklarını ayırmak amacıyla malloc(3) + çağrıları yapması gerekir.

    + +

    +/65: fcntl(9, F_GETFL, 0x00000000) = 2
    +/65: fstat64(9, 0xFAF7B818) = 0
    +/65: getsockopt(9, 65535, 8192, 0xFAF7B918, 0xFAF7B910, 2190656) = 0
    +/65: fstat64(9, 0xFAF7B818) = 0
    +/65: getsockopt(9, 65535, 8192, 0xFAF7B918, 0xFAF7B914, 2190656) = 0
    +/65: setsockopt(9, 65535, 8192, 0xFAF7B918, 4, 2190656) = 0
    +/65: fcntl(9, F_SETFL, 0x00000082) = 0 +

    + +

    Ardından, worker evresi istemciye (dosya tanıtıcısı 9) engellenmeyen + kipte bir bağlantı açar. setsockopt(2) + ve getsockopt(2) çağrıları, Solaris libc'sinin soketler + üzerindeki fcntl(2) çağrısı yanında birer yan etkiden + ibarettirler.

    + +

    + /65: read(9, " G E T / 1 0 k . h t m".., 8000) = 97 +

    + +

    Worker evresi istemciden isteği okur.

    + +

    +/65: stat("/var/httpd/apache/httpd-8999/htdocs/10k.html", 0xFAF7B978) = 0
    +/65: open("/var/httpd/apache/httpd-8999/htdocs/10k.html", O_RDONLY) = 10 +

    + +

    Bu httpd Options FollowSymLinks ve AllowOverride + None ile yapılandırılmıştır. Bu bakımdan, ne istenen dosya ile + sonuçlanan yol üzerindeki her dizinde lstat(2) çağrısına ne + de .htaccess dosyalarına bakılmasına gerek vardır. + stat(2) çağrısı basitçe dosya için şunları doğrulamak + amacıyla yapılır: 1) dosya mevcuttur ve 2) bir dizin değil normal bir + dosyadır.

    + +

    + /65: sendfilev(0, 9, 0x00200F90, 2, 0xFAF7B53C) = 10269 +

    + +

    Bu örnekte, httpd, istenen dosyayı ve HTTP yanıt başlığını tek bir + sendfilev(2) sistem çağrısı ile göndermektedir. Dosya + gönderim işleminin anlamı sistemden sisteme değişiklik gösterir. Bazı + sistemlerde, sendfile(2) çağrısından önce başlıkları + göndermek için write(2) veya writev(2) + çağrısı yapmak gerekir.

    + +

    + /65: write(4, " 1 2 7 . 0 . 0 . 1 - ".., 78) = 78 +

    + +

    Bu write(2) çağrısı isteği erişim günlüğüne kaydeder. Bu + izlemede eksik olan tek şey, time(2) çağrısıdır. Apache + 1.3'ün aksine, Apache 2.x zamana bakmak için + gettimeofday(3) çağırısını kullanır. Linux ve Solaris gibi + bazı işletim sistemleri, gettimeofday işlevinin, sıradan + bir sistem çağrısından daha fazla götürüsü olmayan en iyilenmiş bir + gerçeklenimine sahiptir.

    + +

    + /65: shutdown(9, 1, 1) = 0
    + /65: poll(0xFAF7B980, 1, 2000) = 1
    + /65: read(9, 0xFAF7BC20, 512) = 0
    + /65: close(9) = 0 +

    + +

    Burada worker evresi bağlantıyı zamana yaymaktadır.

    + +

    + /65: close(10) = 0
    + /65: lwp_park(0x00000000, 0) (uykuda...) +

    + +

    Son olarak, worker evresi teslim edilen dosyayı kapattıktan sonra + dinleyici evre tarafından başka bir bağlantı atanıncaya kadar beklemeye + alınır.

    + +

    + /67: accept(3, 0x001FEB74, 0x001FEB94, 1) (uykuda...) +

    + +

    Bu arada, dinleyici evre bağlantıyı bir worker evresine atar atamaz + başka bir bağlantıyı beklemeye başlar (Mevcut tüm evreler meşgulse + dinleyici evreyi baskılayan worker MPM'nin akış denetim şemasına konu + olur). Bu izlemede görünmüyor olsa da sonraki accept(2) + çağrısı, yeni bağlantı kabul eden worker evresine paralel olarak + yapılabilir (aşırı yük durumlarında normal olarak, bu yapılır).

    + +
    +
    +

    Mevcut Diller:  en  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/misc/relevant_standards.html b/rubbos/app/httpd-2.0.64/docs/manual/misc/relevant_standards.html new file mode 100644 index 00000000..0890a9e4 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/misc/relevant_standards.html @@ -0,0 +1,9 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: relevant_standards.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: relevant_standards.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR diff --git a/rubbos/app/httpd-2.0.64/docs/manual/misc/relevant_standards.html.en b/rubbos/app/httpd-2.0.64/docs/manual/misc/relevant_standards.html.en new file mode 100644 index 00000000..2924d461 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/misc/relevant_standards.html.en @@ -0,0 +1,199 @@ + + + +Relevant Standards - Apache HTTP Server + + + + + +
    <-
    +

    Relevant Standards

    +
    +

    Available Languages:  en  | + ko 

    +
    + +

    This page documents all the relevant standards that the + Apache HTTP Server follows, along with brief descriptions.

    + +

    In addition to the information listed below, the following resources + should be consulted:

    + + + +

    Notice

    +

    This document is not yet complete.

    +
    + +
    + +
    top
    +
    +

    HTTP Recommendations

    + +

    Regardless of what modules are compiled and used, Apache as a + basic web server complies with the following IETF recommendations:

    + +
    +
    RFC 1945 + (Informational)
    + +
    The Hypertext Transfer Protocol (HTTP) is an application-level + protocol with the lightness and speed necessary for distributed, + collaborative, hypermedia information systems. This documents + HTTP/1.0.
    + +
    RFC 2616 + (Standards Track)
    + +
    The Hypertext Transfer Protocol (HTTP) is an + application-level protocol for distributed, collaborative, + hypermedia information systems. This documents HTTP/1.1.
    + +
    RFC 2396 + (Standards Track)
    + +
    A Uniform Resource Identifier (URI) is a compact string of + characters for identifying an abstract or physical resource.
    +
    + +
    top
    +
    +

    HTML Recommendations

    + +

    Regarding the Hypertext Markup Language, Apache complies with + the following IETF and W3C recommendations:

    + +
    +
    RFC 2854 + (Informational)
    + +
    This document summarizes the history of HTML development, + and defines the "text/html" MIME type by pointing to the relevant + W3C recommendations.
    + +
    HTML 4.01 Specification + (Errata) +
    + +
    This specification defines the HyperText Markup Language (HTML), + the publishing language of the World Wide Web. This specification + defines HTML 4.01, which is a subversion of HTML 4.
    + +
    HTML 3.2 Reference + Specification
    + +
    The HyperText Markup Language (HTML) is a simple markup language + used to create hypertext documents that are portable from one + platform to another. HTML documents are SGML documents.
    + +
    XHTML 1.1 - + Module-based XHTML + (Errata) +
    + +
    This Recommendation defines a new XHTML document type + that is based upon the module framework and modules defined in + Modularization of XHTML.
    + +
    XHTML 1.0 The + Extensible HyperText Markup Language (Second Edition) + (Errata) +
    + +
    This specification defines the Second Edition of XHTML 1.0, + a reformulation of HTML 4 as an XML 1.0 application, and three + DTDs corresponding to the ones defined by HTML 4.
    +
    + +
    top
    +
    +

    Authentication

    + +

    Concerning the different methods of authentication, Apache + follows the following IETF recommendations:

    + +
    +
    RFC 2617 + (Draft standard)
    + +
    "HTTP/1.0", includes the specification for a Basic + Access Authentication scheme.
    + +
    + +
    top
    +
    +

    Language/Country Codes

    + +

    The following links document ISO and other language and country + code information:

    + +
    +
    ISO 639-2
    + +
    ISO 639 provides two sets of language codes, one as a two-letter + code set (639-1) and another as a three-letter code set (this part + of ISO 639) for the representation of names of languages.
    + +
    + ISO 3166-1
    + +
    These pages document the country names (official short names + in English) in alphabetical order as given in ISO 3166-1 and the + corresponding ISO 3166-1-alpha-2 code elements.
    + +
    BCP 47 + (Best Current Practice), + RFC 3066
    + +
    This document describes a language tag for use in cases where + it is desired to indicate the language used in an information + object, how to register values for use in this language tag, + and a construct for matching such language tags.
    + +
    RFC 3282 + (Standards Track)
    + +
    This document defines a "Content-language:" header, for use in + cases where one desires to indicate the language of something that + has RFC 822-like headers, like MIME body parts or Web documents, + and an "Accept-Language:" header for use in cases where one wishes + to indicate one's preferences with regard to language.
    +
    + +
    +
    +

    Available Languages:  en  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/misc/relevant_standards.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/misc/relevant_standards.html.ko.euc-kr new file mode 100644 index 00000000..acbccb9d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/misc/relevant_standards.html.ko.euc-kr @@ -0,0 +1,191 @@ + + + +°ü·Ã Ç¥ÁØ - Apache HTTP Server + + + + + +
    <-
    +

    °ü·Ã Ç¥ÁØ

    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + ko 

    +
    + +

    ÀÌ ¹®¼­¿¡´Â °£´ÜÇÑ ¼³¸í°ú ÇÔ²² ¾ÆÆÄÄ¡ À¥¼­¹ö°¡ µû¸£´Â + ¸ðµç °ü·Ã Ç¥ÁØÀ» ¿­°ÅÇÑ´Ù.

    + +

    ¾Æ·¡ Á¤º¸¿¡ ´õÇÏ¿© ´ÙÀ½ ÀÚ·áµµ »ìÆìºÁ¾ß ÇÑ´Ù:

    + + + +

    ÁÖÀÇ

    +

    ÀÌ ¹®¼­´Â ¾ÆÁ÷ ¿ÏÀüÇÏÁö ¾Ê´Ù.

    +
    + +
    + +
    top
    +
    +

    HTTP ±Ç°í

    + +

    ¾î¶² ¸ðµâÀ» ÄÄÆÄÀÏÇÏ°í »ç¿ëÇÏ´ÂÁö¿Í °ü°è¾øÀÌ ±âº»ÀûÀ¸·Î + À¥¼­¹öÀÎ ¾ÆÆÄÄ¡´Â ´ÙÀ½ IETF ±Ç°í(recommendation)¸¦ µû¸¥´Ù:

    + +
    +
    RFC 1945 + (Informational)
    + +
    ÇÏÀÌÆÛÅؽºÆ® Àü¼Û ÇÁ·ÎÅäÄÝ (Hypertext Transfer Protocol, + HTTP)Àº ºÐ»ê, Çùµ¿, ÇÏÀÌÆÛ¸Åü Á¤º¸ ½Ã½ºÅÛ¿¡ ÇÊ¿äÇÑ ºü¸£°í + °¡º­¿î ¾îÇø®ÄÉÀÌ¼Ç ¼öÁØ(application-level) ÇÁ·ÎÅäÄÝÀÌ´Ù. + ÀÌ ¹®¼­´Â HTTP/1.0À» ¼³¸íÇÑ´Ù.
    + +
    RFC 2616 + (Standards Track)
    + +
    ÇÏÀÌÆÛÅؽºÆ® Àü¼Û ÇÁ·ÎÅäÄÝ (Hypertext Transfer Protocol, + HTTP)Àº ºÐ»ê, Çùµ¿, ÇÏÀÌÆÛ¸Åü Á¤º¸ ½Ã½ºÅÛÀ» À§ÇÑ ¾îÇø®ÄÉÀÌ¼Ç + ¼öÁØ ÇÁ·ÎÅäÄÝÀÌ´Ù. ÀÌ ¹®¼­´Â HTTP/1.1À» ¼³¸íÇÑ´Ù.
    + +
    RFC 2396 + (Standards Track)
    + +
    Ç¥ÁØ ÀÚ¿ø ½Äº°ÀÚ (Uniform Resource Identifier, URI)´Â + Ãß»óÀû ȤÀº ¹°¸®Àû ÀÚ¿øÀ» ½Äº°ÇϱâÀ§ÇÑ ÂªÀº ¹®ÀÚ¿­ÀÌ´Ù.
    +
    + +
    top
    +
    +

    HTML ±Ç°í

    + +

    ÇÏÀÌÆÛÅؽºÆ® ¸¶Å©¾÷ ¾ð¾î (Hypertext Markup Language, + HTML)¿Í °ü·ÃÇÏ¿© ¾ÆÆÄÄ¡´Â ´ÙÀ½ IETF ±Ç°í¿Í W3C ±Ç°í¸¦ µû¸¥´Ù:

    + +
    +
    RFC 2854 + (Informational)
    + +
    ÀÌ ¹®¼­´Â HTML °³¹ß°úÁ¤À» ¿ä¾àÇÏ°í, °ü·Ã W3C ±Ç°í¸¦ + ±â¹ÝÀ¸·Î "text/html" MIME typeÀ» Á¤ÀÇÇÑ´Ù.
    + +
    HTML 4.01 ±Ô¾à + (Errata) +
    + +
    ÀÌ ±Ô¾àÀº ¿ùµå¿ÍÀ̵åÀ¥ÀÇ ÃâÆǾð¾îÀÎ ÇÏÀÌÆÛÅؽºÆ® ¸¶Å©¾÷ + ¾ð¾î (Hypertext Markup Language, HTML)¸¦ Á¤ÀÇÇÑ´Ù. ÀÌ + ±Ô¾àÀº HTML 4ÀÇ ÇÏÀ§¹öÀüÀÎ HTML 4.01À» Á¤ÀÇÇÑ´Ù.
    + +
    HTML 3.2 Âü°í ±Ô¾à
    + +
    ÇÏÀÌÆÛÅؽºÆ® ¸¶Å©¾÷ ¾ð¾î (Hypertext Markup Language, + HTML)´Â Ç÷¡Æû°ú ¹«°üÇÑ ÇÏÀÌÆÛÅؽºÆ® ¹®¼­¸¦ À§ÇÑ °£´ÜÇÑ + ¸¶Å©¾÷ ¾ð¾îÀÌ´Ù. HTML ¹®¼­´Â SGML ¹®¼­À̱⵵ ÇÏ´Ù.
    + +
    XHTML 1.1 - + ¸ðµâ±â¹Ý XHTML + (Á¤¿ÀÇ¥) +
    + +
    ÀÌ ±Ç°í´Â Modularization of XHTML¿¡¼­ Á¤ÀÇÇÑ ¸ðµâ + Ç÷¹ÀÓ¿öÅ©¿Í ¸ðµâµéÀ» ±â¹ÝÀ¸·Î »õ·Î¿î XHTML document typeÀ» + Á¤ÀÇÇÑ´Ù.
    + +
    XHTML 1.0 + È®Àå ÇÏÀÌÆÛÅؽºÆ® ¸¶Å©¾÷ ¾ð¾î (Extensible HyperText Markup + Language) (Second Edition) + (Á¤¿ÀÇ¥) +
    + +
    ÀÌ ¹®¼­´Â HTML 4¸¦ XML 1.0À¸·Î À籸¼ºÇÑ XHTML 1.0ÀÇ + µÎ¹ø° ¹öÀü°ú HTML 4¿¡ ÇØ´çÇÏ´Â ¼¼°¡Áö DTD¸¦ Á¤ÀÇÇÑ´Ù.
    +
    + +
    top
    +
    +

    ÀÎÁõ

    + +

    ÀÎÁõ¹æ¹ý¿¡ ´ëÇØ ¾ÆÆÄÄ¡´Â ´ÙÀ½ IETF ±Ç°í¸¦ µû¸¥´Ù:

    + +
    +
    RFC 2617 + (Draft standard)
    + +
    Basic Access Authentication ±Ô¾àÀ» Æ÷ÇÔÇÑ "HTTP/1.0".
    + +
    + +
    top
    +
    +

    ¾ð¾î/±¹°¡ ÄÚµå

    + +

    ¾Æ·¡ ¸µÅ©¿¡ ISO¿Í ´Ù¸¥ ¾ð¾î/±¹°¡ ÄÚµå Á¤º¸°¡ ÀÖ´Ù:

    + +
    +
    ISO 639-2
    + +
    ISO 639´Â ¾ð¾îÀÇ À̸§À» ³ªÅ¸³»´Â µÎ°¡Áö ¾ð¾î Äڵ带 + Á¦°øÇÑ´Ù. Çϳª´Â (639-1) µÎ ±ÛÀÚ ÄÚµåÀÌ°í ´Ù¸¥ Çϳª´Â + (ÀÌ ¹®¼­) ¼¼ ±ÛÀÚ ÄÚµåÀÌ´Ù.
    + +
    + ISO 3166-1
    + +
    ÀÌ ¹®¼­´Â ISO 3166-1°ú ISO 3166-1-alpha-2 Äڵ忡 µû¶ó + ¾ËÆĺª ¼ø¼­·Î (¿µ¾î·Î ªÀº °ø½ÄÀ̸§) ±¹°¡¸íÀ» ¿­°ÅÇÑ´Ù.
    + +
    BCP 47 + (Best Current Practice), + RFC 3066
    + +
    ÀÌ ¹®¼­´Â Á¤º¸ °´Ã¼¿¡ »ç¿ëÇÑ ¾ð¾î¸¦ ¾Ë¸®±âÀ§ÇØ »ç¿ëÇÒ + ¾ð¾î ÅÂ±×¿Í ¾ð¾î ű׿¡ »ç¿ëÇÒ °ªÀ» µî·ÏÇÏ´Â ¹æ¹ý, ¾ð¾î + ű׸¦ ã´Â ¹æ½ÄÀ» ¼³¸íÇÑ´Ù.
    + +
    RFC 3282 + (Standards Track)
    + +
    ÀÌ ¹®¼­´Â MIME ³»¿ë ºÎºÐ°ú À¥ ¹®¼­¿Í °°Àº RFC 822½Ä + Çì´õ°¡ ÀÖ´Â Á¤º¸ÀÇ ¾ð¾î¸¦ ¾Ë¸®±âÀ§ÇÑ "Content-language:" + Çì´õ¿Í, ¼±È£ÇÏ´Â ¾ð¾î¸¦ ³ªÅ¸³»´Â "Accept-Language:" Çì´õ¸¦ + Á¤ÀÇÇÑ´Ù.
    +
    + +
    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/misc/rewriteguide.html b/rubbos/app/httpd-2.0.64/docs/manual/misc/rewriteguide.html new file mode 100644 index 00000000..e58a64eb --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/misc/rewriteguide.html @@ -0,0 +1,9 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: rewriteguide.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: rewriteguide.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR diff --git a/rubbos/app/httpd-2.0.64/docs/manual/misc/rewriteguide.html.en b/rubbos/app/httpd-2.0.64/docs/manual/misc/rewriteguide.html.en new file mode 100644 index 00000000..733f48bd --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/misc/rewriteguide.html.en @@ -0,0 +1,2110 @@ + + + +URL Rewriting Guide - Apache HTTP Server + + + + + +
    <-
    +

    URL Rewriting Guide

    +
    +

    Available Languages:  en  | + ko 

    +
    + +
    +

    Originally written by
    + Ralf S. Engelschall <rse@apache.org>
    + December 1997

    +
    + +

    This document supplements the mod_rewrite + reference documentation. + It describes how one can use Apache's mod_rewrite + to solve typical URL-based problems with which webmasters are + commonony confronted. We give detailed descriptions on how to + solve each problem by configuring URL rewriting rulesets.

    + +
    + +
    top
    +
    +

    Introduction to mod_rewrite

    + + + +

    The Apache module mod_rewrite is a killer + one, i.e. it is a really sophisticated module which provides + a powerful way to do URL manipulations. With it you can do nearly + all types of URL manipulations you ever dreamed about. + The price you have to pay is to accept complexity, because + mod_rewrite's major drawback is that it is + not easy to understand and use for the beginner. And even + Apache experts sometimes discover new aspects where + mod_rewrite can help.

    + +

    In other words: With mod_rewrite you either + shoot yourself in the foot the first time and never use it again + or love it for the rest of your life because of its power. + This paper tries to give you a few initial success events to + avoid the first case by presenting already invented solutions + to you.

    + +
    top
    +
    +

    Practical Solutions

    + + + +

    Here come a lot of practical solutions I've either invented + myself or collected from other people's solutions in the past. + Feel free to learn the black magic of URL rewriting from + these examples.

    + +
    ATTENTION: Depending on your server-configuration + it can be necessary to slightly change the examples for your + situation, e.g. adding the [PT] flag when + additionally using mod_alias and + mod_userdir, etc. Or rewriting a ruleset + to fit in .htaccess context instead + of per-server context. Always try to understand what a + particular ruleset really does before you use it. It + avoid problems.
    + +
    top
    +
    +

    URL Layout

    + + + +

    Canonical URLs

    + + + +
    +
    Description:
    + +
    +

    On some webservers there are more than one URL for a + resource. Usually there are canonical URLs (which should be + actually used and distributed) and those which are just + shortcuts, internal ones, etc. Independent of which URL the + user supplied with the request he should finally see the + canonical one only.

    +
    + +
    Solution:
    + +
    +

    We do an external HTTP redirect for all non-canonical + URLs to fix them in the location view of the Browser and + for all subsequent requests. In the example ruleset below + we replace /~user by the canonical + /u/user and fix a missing trailing slash for + /u/user.

    + +
    +RewriteRule   ^/~([^/]+)/?(.*)    /u/$1/$2  [R]
    +RewriteRule   ^/([uge])/([^/]+)$  /$1/$2/   [R]
    +
    +
    +
    + + + +

    Canonical Hostnames

    + + + +
    +
    Description:
    + +
    The goal of this rule is to force the use of a particular + hostname, in preference to other hostnames which may be used to + reach the same site. For example, if you wish to force the use + of www.example.com instead of + example.com, you might use a variant of the + following recipe.
    + +
    Solution:
    + +
    +
    +# For sites running on a port other than 80
    +RewriteCond %{HTTP_HOST}   !^www\.example\.com [NC]
    +RewriteCond %{HTTP_HOST}   !^$
    +RewriteCond %{SERVER_PORT} !^80$
    +RewriteRule ^/(.*)         http://www.example.com:%{SERVER_PORT}/$1 [L,R]
    +
    +# And for a site running on port 80
    +RewriteCond %{HTTP_HOST}   !^www\.example\.com [NC]
    +RewriteCond %{HTTP_HOST}   !^$
    +RewriteRule ^/(.*)         http://www.example.com/$1 [L,R]
    +
    +
    +
    + + + +

    Moved DocumentRoot

    + + + +
    +
    Description:
    + +
    +

    Usually the DocumentRoot + of the webserver directly relates to the URL "/". + But often this data is not really of top-level priority, it is + perhaps just one entity of a lot of data pools. For instance at + our Intranet sites there are /e/www/ + (the homepage for WWW), /e/sww/ (the homepage for + the Intranet) etc. Now because the data of the DocumentRoot stays at /e/www/ we had + to make sure that all inlined images and other stuff inside this + data pool work for subsequent requests.

    +
    + +
    Solution:
    + +
    +

    We redirect the URL / to + /e/www/: +

    + +
    +RewriteEngine on
    +RewriteRule   ^/$  /e/www/  [R]
    +
    + +

    Note that this can also be handled using the RedirectMatch directive:

    + +

    + RedirectMatch ^/$ http://example.com/e/www/ +

    +
    +
    + + + +

    Trailing Slash Problem

    + + + +
    +
    Description:
    + +
    +

    Every webmaster can sing a song about the problem of + the trailing slash on URLs referencing directories. If they + are missing, the server dumps an error, because if you say + /~quux/foo instead of /~quux/foo/ + then the server searches for a file named + foo. And because this file is a directory it + complains. Actually it tries to fix it itself in most of + the cases, but sometimes this mechanism need to be emulated + by you. For instance after you have done a lot of + complicated URL rewritings to CGI scripts etc.

    +
    + +
    Solution:
    + +
    +

    The solution to this subtle problem is to let the server + add the trailing slash automatically. To do this + correctly we have to use an external redirect, so the + browser correctly requests subsequent images etc. If we + only did a internal rewrite, this would only work for the + directory page, but would go wrong when any images are + included into this page with relative URLs, because the + browser would request an in-lined object. For instance, a + request for image.gif in + /~quux/foo/index.html would become + /~quux/image.gif without the external + redirect!

    + +

    So, to do this trick we write:

    + +
    +RewriteEngine  on
    +RewriteBase    /~quux/
    +RewriteRule    ^foo$  foo/  [R]
    +
    + +

    The crazy and lazy can even do the following in the + top-level .htaccess file of their homedir. + But notice that this creates some processing + overhead.

    + +
    +RewriteEngine  on
    +RewriteBase    /~quux/
    +RewriteCond    %{REQUEST_FILENAME}  -d
    +RewriteRule    ^(.+[^/])$           $1/  [R]
    +
    +
    +
    + + + +

    Webcluster through Homogeneous URL Layout

    + + + +
    +
    Description:
    + +
    +

    We want to create a homogeneous and consistent URL + layout over all WWW servers on a Intranet webcluster, i.e. + all URLs (per definition server local and thus server + dependent!) become actually server independent! + What we want is to give the WWW namespace a consistent + server-independent layout: no URL should have to include + any physically correct target server. The cluster itself + should drive us automatically to the physical target + host.

    +
    + +
    Solution:
    + +
    +

    First, the knowledge of the target servers come from + (distributed) external maps which contain information + where our users, groups and entities stay. The have the + form

    + +
    +user1  server_of_user1
    +user2  server_of_user2
    +:      :
    +
    + +

    We put them into files map.xxx-to-host. + Second we need to instruct all servers to redirect URLs + of the forms

    + +
    +/u/user/anypath
    +/g/group/anypath
    +/e/entity/anypath
    +
    + +

    to

    + +
    +http://physical-host/u/user/anypath
    +http://physical-host/g/group/anypath
    +http://physical-host/e/entity/anypath
    +
    + +

    when the URL is not locally valid to a server. The + following ruleset does this for us by the help of the map + files (assuming that server0 is a default server which + will be used if a user has no entry in the map):

    + +
    +RewriteEngine on
    +
    +RewriteMap      user-to-host   txt:/path/to/map.user-to-host
    +RewriteMap     group-to-host   txt:/path/to/map.group-to-host
    +RewriteMap    entity-to-host   txt:/path/to/map.entity-to-host
    +
    +RewriteRule   ^/u/([^/]+)/?(.*)   http://${user-to-host:$1|server0}/u/$1/$2
    +RewriteRule   ^/g/([^/]+)/?(.*)  http://${group-to-host:$1|server0}/g/$1/$2
    +RewriteRule   ^/e/([^/]+)/?(.*) http://${entity-to-host:$1|server0}/e/$1/$2
    +
    +RewriteRule   ^/([uge])/([^/]+)/?$          /$1/$2/.www/
    +RewriteRule   ^/([uge])/([^/]+)/([^.]+.+)   /$1/$2/.www/$3\
    +
    +
    +
    + + + +

    Move Homedirs to Different Webserver

    + + + +
    +
    Description:
    + +
    +

    Many webmasters have asked for a solution to the + following situation: They wanted to redirect just all + homedirs on a webserver to another webserver. They usually + need such things when establishing a newer webserver which + will replace the old one over time.

    +
    + +
    Solution:
    + +
    +

    The solution is trivial with mod_rewrite. + On the old webserver we just redirect all + /~user/anypath URLs to + http://newserver/~user/anypath.

    + +
    +RewriteEngine on
    +RewriteRule   ^/~(.+)  http://newserver/~$1  [R,L]
    +
    +
    +
    + + + +

    Structured Homedirs

    + + + +
    +
    Description:
    + +
    +

    Some sites with thousands of users usually use a + structured homedir layout, i.e. each homedir is in a + subdirectory which begins for instance with the first + character of the username. So, /~foo/anypath + is /home/f/foo/.www/anypath + while /~bar/anypath is + /home/b/bar/.www/anypath.

    +
    + +
    Solution:
    + +
    +

    We use the following ruleset to expand the tilde URLs + into exactly the above layout.

    + +
    +RewriteEngine on
    +RewriteRule   ^/~(([a-z])[a-z0-9]+)(.*)  /home/$2/$1/.www$3
    +
    +
    +
    + + + +

    Filesystem Reorganization

    + + + +
    +
    Description:
    + +
    +

    This really is a hardcore example: a killer application + which heavily uses per-directory + RewriteRules to get a smooth look and feel + on the Web while its data structure is never touched or + adjusted. Background: net.sw is + my archive of freely available Unix software packages, + which I started to collect in 1992. It is both my hobby + and job to to this, because while I'm studying computer + science I have also worked for many years as a system and + network administrator in my spare time. Every week I need + some sort of software so I created a deep hierarchy of + directories where I stored the packages:

    + +
    +drwxrwxr-x   2 netsw  users    512 Aug  3 18:39 Audio/
    +drwxrwxr-x   2 netsw  users    512 Jul  9 14:37 Benchmark/
    +drwxrwxr-x  12 netsw  users    512 Jul  9 00:34 Crypto/
    +drwxrwxr-x   5 netsw  users    512 Jul  9 00:41 Database/
    +drwxrwxr-x   4 netsw  users    512 Jul 30 19:25 Dicts/
    +drwxrwxr-x  10 netsw  users    512 Jul  9 01:54 Graphic/
    +drwxrwxr-x   5 netsw  users    512 Jul  9 01:58 Hackers/
    +drwxrwxr-x   8 netsw  users    512 Jul  9 03:19 InfoSys/
    +drwxrwxr-x   3 netsw  users    512 Jul  9 03:21 Math/
    +drwxrwxr-x   3 netsw  users    512 Jul  9 03:24 Misc/
    +drwxrwxr-x   9 netsw  users    512 Aug  1 16:33 Network/
    +drwxrwxr-x   2 netsw  users    512 Jul  9 05:53 Office/
    +drwxrwxr-x   7 netsw  users    512 Jul  9 09:24 SoftEng/
    +drwxrwxr-x   7 netsw  users    512 Jul  9 12:17 System/
    +drwxrwxr-x  12 netsw  users    512 Aug  3 20:15 Typesetting/
    +drwxrwxr-x  10 netsw  users    512 Jul  9 14:08 X11/
    +
    + +

    In July 1996 I decided to make this archive public to + the world via a nice Web interface. "Nice" means that I + wanted to offer an interface where you can browse + directly through the archive hierarchy. And "nice" means + that I didn't wanted to change anything inside this + hierarchy - not even by putting some CGI scripts at the + top of it. Why? Because the above structure should be + later accessible via FTP as well, and I didn't want any + Web or CGI stuff to be there.

    +
    + +
    Solution:
    + +
    +

    The solution has two parts: The first is a set of CGI + scripts which create all the pages at all directory + levels on-the-fly. I put them under + /e/netsw/.www/ as follows:

    + +
    +-rw-r--r--   1 netsw  users    1318 Aug  1 18:10 .wwwacl
    +drwxr-xr-x  18 netsw  users     512 Aug  5 15:51 DATA/
    +-rw-rw-rw-   1 netsw  users  372982 Aug  5 16:35 LOGFILE
    +-rw-r--r--   1 netsw  users     659 Aug  4 09:27 TODO
    +-rw-r--r--   1 netsw  users    5697 Aug  1 18:01 netsw-about.html
    +-rwxr-xr-x   1 netsw  users     579 Aug  2 10:33 netsw-access.pl
    +-rwxr-xr-x   1 netsw  users    1532 Aug  1 17:35 netsw-changes.cgi
    +-rwxr-xr-x   1 netsw  users    2866 Aug  5 14:49 netsw-home.cgi
    +drwxr-xr-x   2 netsw  users     512 Jul  8 23:47 netsw-img/
    +-rwxr-xr-x   1 netsw  users   24050 Aug  5 15:49 netsw-lsdir.cgi
    +-rwxr-xr-x   1 netsw  users    1589 Aug  3 18:43 netsw-search.cgi
    +-rwxr-xr-x   1 netsw  users    1885 Aug  1 17:41 netsw-tree.cgi
    +-rw-r--r--   1 netsw  users     234 Jul 30 16:35 netsw-unlimit.lst
    +
    + +

    The DATA/ subdirectory holds the above + directory structure, i.e. the real + net.sw stuff and gets + automatically updated via rdist from time to + time. The second part of the problem remains: how to link + these two structures together into one smooth-looking URL + tree? We want to hide the DATA/ directory + from the user while running the appropriate CGI scripts + for the various URLs. Here is the solution: first I put + the following into the per-directory configuration file + in the DocumentRoot + of the server to rewrite the announced URL + /net.sw/ to the internal path + /e/netsw:

    + +
    +RewriteRule  ^net.sw$       net.sw/        [R]
    +RewriteRule  ^net.sw/(.*)$  e/netsw/$1
    +
    + +

    The first rule is for requests which miss the trailing + slash! The second rule does the real thing. And then + comes the killer configuration which stays in the + per-directory config file + /e/netsw/.www/.wwwacl:

    + +
    +Options       ExecCGI FollowSymLinks Includes MultiViews
    +
    +RewriteEngine on
    +
    +#  we are reached via /net.sw/ prefix
    +RewriteBase   /net.sw/
    +
    +#  first we rewrite the root dir to
    +#  the handling cgi script
    +RewriteRule   ^$                       netsw-home.cgi     [L]
    +RewriteRule   ^index\.html$            netsw-home.cgi     [L]
    +
    +#  strip out the subdirs when
    +#  the browser requests us from perdir pages
    +RewriteRule   ^.+/(netsw-[^/]+/.+)$    $1                 [L]
    +
    +#  and now break the rewriting for local files
    +RewriteRule   ^netsw-home\.cgi.*       -                  [L]
    +RewriteRule   ^netsw-changes\.cgi.*    -                  [L]
    +RewriteRule   ^netsw-search\.cgi.*     -                  [L]
    +RewriteRule   ^netsw-tree\.cgi$        -                  [L]
    +RewriteRule   ^netsw-about\.html$      -                  [L]
    +RewriteRule   ^netsw-img/.*$           -                  [L]
    +
    +#  anything else is a subdir which gets handled
    +#  by another cgi script
    +RewriteRule   !^netsw-lsdir\.cgi.*     -                  [C]
    +RewriteRule   (.*)                     netsw-lsdir.cgi/$1
    +
    + +

    Some hints for interpretation:

    + +
      +
    1. Notice the L (last) flag and no + substitution field ('-') in the forth part
    2. + +
    3. Notice the ! (not) character and + the C (chain) flag at the first rule + in the last part
    4. + +
    5. Notice the catch-all pattern in the last rule
    6. +
    +
    +
    + + + +

    NCSA imagemap to Apache mod_imap

    + + + +
    +
    Description:
    + +
    +

    When switching from the NCSA webserver to the more + modern Apache webserver a lot of people want a smooth + transition. So they want pages which use their old NCSA + imagemap program to work under Apache with the + modern mod_imap. The problem is that there + are a lot of hyperlinks around which reference the + imagemap program via + /cgi-bin/imagemap/path/to/page.map. Under + Apache this has to read just + /path/to/page.map.

    +
    + +
    Solution:
    + +
    +

    We use a global rule to remove the prefix on-the-fly for + all requests:

    + +
    +RewriteEngine  on
    +RewriteRule    ^/cgi-bin/imagemap(.*)  $1  [PT]
    +
    +
    +
    + + + +

    Search pages in more than one directory

    + + + +
    +
    Description:
    + +
    +

    Sometimes it is necessary to let the webserver search + for pages in more than one directory. Here MultiViews or + other techniques cannot help.

    +
    + +
    Solution:
    + +
    +

    We program a explicit ruleset which searches for the + files in the directories.

    + +
    +RewriteEngine on
    +
    +#   first try to find it in custom/...
    +#   ...and if found stop and be happy:
    +RewriteCond         /your/docroot/dir1/%{REQUEST_FILENAME}  -f
    +RewriteRule  ^(.+)  /your/docroot/dir1/$1  [L]
    +
    +#   second try to find it in pub/...
    +#   ...and if found stop and be happy:
    +RewriteCond         /your/docroot/dir2/%{REQUEST_FILENAME}  -f
    +RewriteRule  ^(.+)  /your/docroot/dir2/$1  [L]
    +
    +#   else go on for other Alias or ScriptAlias directives,
    +#   etc.
    +RewriteRule   ^(.+)  -  [PT]
    +
    +
    +
    + + + +

    Set Environment Variables According To URL Parts

    + + + +
    +
    Description:
    + +
    +

    Perhaps you want to keep status information between + requests and use the URL to encode it. But you don't want + to use a CGI wrapper for all pages just to strip out this + information.

    +
    + +
    Solution:
    + +
    +

    We use a rewrite rule to strip out the status information + and remember it via an environment variable which can be + later dereferenced from within XSSI or CGI. This way a + URL /foo/S=java/bar/ gets translated to + /foo/bar/ and the environment variable named + STATUS is set to the value "java".

    + +
    +RewriteEngine on
    +RewriteRule   ^(.*)/S=([^/]+)/(.*)    $1/$3 [E=STATUS:$2]
    +
    +
    +
    + + + +

    Virtual User Hosts

    + + + +
    +
    Description:
    + +
    +

    Assume that you want to provide + www.username.host.domain.com + for the homepage of username via just DNS A records to the + same machine and without any virtualhosts on this + machine.

    +
    + +
    Solution:
    + +
    +

    For HTTP/1.0 requests there is no solution, but for + HTTP/1.1 requests which contain a Host: HTTP header we + can use the following ruleset to rewrite + http://www.username.host.com/anypath + internally to /home/username/anypath:

    + +
    +RewriteEngine on
    +RewriteCond   %{HTTP_HOST}                 ^www\.[^.]+\.host\.com$
    +RewriteRule   ^(.+)                        %{HTTP_HOST}$1          [C]
    +RewriteRule   ^www\.([^.]+)\.host\.com(.*) /home/$1$2
    +
    +
    +
    + + + +

    Redirect Homedirs For Foreigners

    + + + +
    +
    Description:
    + +
    +

    We want to redirect homedir URLs to another webserver + www.somewhere.com when the requesting user + does not stay in the local domain + ourdomain.com. This is sometimes used in + virtual host contexts.

    +
    + +
    Solution:
    + +
    +

    Just a rewrite condition:

    + +
    +RewriteEngine on
    +RewriteCond   %{REMOTE_HOST}  !^.+\.ourdomain\.com$
    +RewriteRule   ^(/~.+)         http://www.somewhere.com/$1 [R,L]
    +
    +
    +
    + + + +

    Redirect Failing URLs To Other Webserver

    + + + +
    +
    Description:
    + +
    +

    A typical FAQ about URL rewriting is how to redirect + failing requests on webserver A to webserver B. Usually + this is done via ErrorDocument CGI-scripts in Perl, but + there is also a mod_rewrite solution. + But notice that this performs more poorly than using an + ErrorDocument + CGI-script!

    +
    + +
    Solution:
    + +
    +

    The first solution has the best performance but less + flexibility, and is less error safe:

    + +
    +RewriteEngine on
    +RewriteCond   /your/docroot/%{REQUEST_FILENAME} !-f
    +RewriteRule   ^(.+)                             http://webserverB.dom/$1
    +
    + +

    The problem here is that this will only work for pages + inside the DocumentRoot. While you can add more + Conditions (for instance to also handle homedirs, etc.) + there is better variant:

    + +
    +RewriteEngine on
    +RewriteCond   %{REQUEST_URI} !-U
    +RewriteRule   ^(.+)          http://webserverB.dom/$1
    +
    + +

    This uses the URL look-ahead feature of mod_rewrite. + The result is that this will work for all types of URLs + and is a safe way. But it does a performance impact on + the webserver, because for every request there is one + more internal subrequest. So, if your webserver runs on a + powerful CPU, use this one. If it is a slow machine, use + the first approach or better a ErrorDocument CGI-script.

    +
    +
    + + + +

    Extended Redirection

    + + + +
    +
    Description:
    + +
    +

    Sometimes we need more control (concerning the + character escaping mechanism) of URLs on redirects. + Usually the Apache kernels URL escape function also + escapes anchors, i.e. URLs like "url#anchor". + You cannot use this directly on redirects with + mod_rewrite because the + uri_escape() function of Apache + would also escape the hash character. + How can we redirect to such a URL?

    +
    + +
    Solution:
    + +
    +

    We have to use a kludge by the use of a NPH-CGI script + which does the redirect itself. Because here no escaping + is done (NPH=non-parseable headers). First we introduce a + new URL scheme xredirect: by the following + per-server config-line (should be one of the last rewrite + rules):

    + +
    +RewriteRule ^xredirect:(.+) /path/to/nph-xredirect.cgi/$1 \
    +            [T=application/x-httpd-cgi,L]
    +
    + +

    This forces all URLs prefixed with + xredirect: to be piped through the + nph-xredirect.cgi program. And this program + just looks like:

    + +
    +#!/path/to/perl
    +##
    +##  nph-xredirect.cgi -- NPH/CGI script for extended redirects
    +##  Copyright (c) 1997 Ralf S. Engelschall, All Rights Reserved.
    +##
    +
    +$| = 1;
    +$url = $ENV{'PATH_INFO'};
    +
    +print "HTTP/1.0 302 Moved Temporarily\n";
    +print "Server: $ENV{'SERVER_SOFTWARE'}\n";
    +print "Location: $url\n";
    +print "Content-type: text/html\n";
    +print "\n";
    +print "<html>\n";
    +print "<head>\n";
    +print "<title>302 Moved Temporarily (EXTENDED)</title>\n";
    +print "</head>\n";
    +print "<body>\n";
    +print "<h1>Moved Temporarily (EXTENDED)</h1>\n";
    +print "The document has moved <a HREF=\"$url\">here</a>.<p>\n";
    +print "</body>\n";
    +print "</html>\n";
    +
    +##EOF##
    +
    + +

    This provides you with the functionality to do + redirects to all URL schemes, i.e. including the one + which are not directly accepted by mod_rewrite. + For instance you can now also redirect to + news:newsgroup via

    + +
    +RewriteRule ^anyurl  xredirect:news:newsgroup
    +
    + +
    Notice: You have not to put [R] or + [R,L] to the above rule because the + xredirect: need to be expanded later + by our special "pipe through" rule above.
    +
    +
    + + + +

    Archive Access Multiplexer

    + + + +
    +
    Description:
    + +
    +

    Do you know the great CPAN (Comprehensive Perl Archive + Network) under http://www.perl.com/CPAN? + This does a redirect to one of several FTP servers around + the world which carry a CPAN mirror and is approximately + near the location of the requesting client. Actually this + can be called an FTP access multiplexing service. While + CPAN runs via CGI scripts, how can a similar approach + implemented via mod_rewrite?

    +
    + +
    Solution:
    + +
    +

    First we notice that from version 3.0.0 + mod_rewrite can + also use the "ftp:" scheme on redirects. + And second, the location approximation can be done by a + RewriteMap + over the top-level domain of the client. + With a tricky chained ruleset we can use this top-level + domain as a key to our multiplexing map.

    + +
    +RewriteEngine on
    +RewriteMap    multiplex                txt:/path/to/map.cxan
    +RewriteRule   ^/CxAN/(.*)              %{REMOTE_HOST}::$1                 [C]
    +RewriteRule   ^.+\.([a-zA-Z]+)::(.*)$  ${multiplex:$1|ftp.default.dom}$2  [R,L]
    +
    + +
    +##
    +##  map.cxan -- Multiplexing Map for CxAN
    +##
    +
    +de        ftp://ftp.cxan.de/CxAN/
    +uk        ftp://ftp.cxan.uk/CxAN/
    +com       ftp://ftp.cxan.com/CxAN/
    + :
    +##EOF##
    +
    +
    +
    + + + +

    Time-Dependent Rewriting

    + + + +
    +
    Description:
    + +
    +

    When tricks like time-dependent content should happen a + lot of webmasters still use CGI scripts which do for + instance redirects to specialized pages. How can it be done + via mod_rewrite?

    +
    + +
    Solution:
    + +
    +

    There are a lot of variables named TIME_xxx + for rewrite conditions. In conjunction with the special + lexicographic comparison patterns <STRING, + >STRING and =STRING we can + do time-dependent redirects:

    + +
    +RewriteEngine on
    +RewriteCond   %{TIME_HOUR}%{TIME_MIN} >0700
    +RewriteCond   %{TIME_HOUR}%{TIME_MIN} <1900
    +RewriteRule   ^foo\.html$             foo.day.html
    +RewriteRule   ^foo\.html$             foo.night.html
    +
    + +

    This provides the content of foo.day.html + under the URL foo.html from + 07:00-19:00 and at the remaining time the + contents of foo.night.html. Just a nice + feature for a homepage...

    +
    +
    + + + +

    Backward Compatibility for YYYY to XXXX migration

    + + + +
    +
    Description:
    + +
    +

    How can we make URLs backward compatible (still + existing virtually) after migrating document.YYYY + to document.XXXX, e.g. after translating a + bunch of .html files to .phtml?

    +
    + +
    Solution:
    + +
    +

    We just rewrite the name to its basename and test for + existence of the new extension. If it exists, we take + that name, else we rewrite the URL to its original state.

    + + +
    +#   backward compatibility ruleset for
    +#   rewriting document.html to document.phtml
    +#   when and only when document.phtml exists
    +#   but no longer document.html
    +RewriteEngine on
    +RewriteBase   /~quux/
    +#   parse out basename, but remember the fact
    +RewriteRule   ^(.*)\.html$              $1      [C,E=WasHTML:yes]
    +#   rewrite to document.phtml if exists
    +RewriteCond   %{REQUEST_FILENAME}.phtml -f
    +RewriteRule   ^(.*)$ $1.phtml                   [S=1]
    +#   else reverse the previous basename cutout
    +RewriteCond   %{ENV:WasHTML}            ^yes$
    +RewriteRule   ^(.*)$ $1.html
    +
    +
    +
    + + + +
    top
    +
    +

    Content Handling

    + + + +

    From Old to New (intern)

    + + + +
    +
    Description:
    + +
    +

    Assume we have recently renamed the page + foo.html to bar.html and now want + to provide the old URL for backward compatibility. Actually + we want that users of the old URL even not recognize that + the pages was renamed.

    +
    + +
    Solution:
    + +
    +

    We rewrite the old URL to the new one internally via the + following rule:

    + +
    +RewriteEngine  on
    +RewriteBase    /~quux/
    +RewriteRule    ^foo\.html$  bar.html
    +
    +
    +
    + + + +

    From Old to New (extern)

    + + + +
    +
    Description:
    + +
    +

    Assume again that we have recently renamed the page + foo.html to bar.html and now want + to provide the old URL for backward compatibility. But this + time we want that the users of the old URL get hinted to + the new one, i.e. their browsers Location field should + change, too.

    +
    + +
    Solution:
    + +
    +

    We force a HTTP redirect to the new URL which leads to a + change of the browsers and thus the users view:

    + +
    +RewriteEngine  on
    +RewriteBase    /~quux/
    +RewriteRule    ^foo\.html$  bar.html  [R]
    +
    +
    +
    + + + +

    Browser Dependent Content

    + + + +
    +
    Description:
    + +
    +

    At least for important top-level pages it is sometimes + necessary to provide the optimum of browser dependent + content, i.e. one has to provide a maximum version for the + latest Netscape variants, a minimum version for the Lynx + browsers and a average feature version for all others.

    +
    + +
    Solution:
    + +
    +

    We cannot use content negotiation because the browsers do + not provide their type in that form. Instead we have to + act on the HTTP header "User-Agent". The following condig + does the following: If the HTTP header "User-Agent" + begins with "Mozilla/3", the page foo.html + is rewritten to foo.NS.html and and the + rewriting stops. If the browser is "Lynx" or "Mozilla" of + version 1 or 2 the URL becomes foo.20.html. + All other browsers receive page foo.32.html. + This is done by the following ruleset:

    + +
    +RewriteCond %{HTTP_USER_AGENT}  ^Mozilla/3.*
    +RewriteRule ^foo\.html$         foo.NS.html          [L]
    +
    +RewriteCond %{HTTP_USER_AGENT}  ^Lynx/.*         [OR]
    +RewriteCond %{HTTP_USER_AGENT}  ^Mozilla/[12].*
    +RewriteRule ^foo\.html$         foo.20.html          [L]
    +
    +RewriteRule ^foo\.html$         foo.32.html          [L]
    +
    +
    +
    + + + +

    Dynamic Mirror

    + + + +
    +
    Description:
    + +
    +

    Assume there are nice webpages on remote hosts we want + to bring into our namespace. For FTP servers we would use + the mirror program which actually maintains an + explicit up-to-date copy of the remote data on the local + machine. For a webserver we could use the program + webcopy which acts similar via HTTP. But both + techniques have one major drawback: The local copy is + always just as up-to-date as often we run the program. It + would be much better if the mirror is not a static one we + have to establish explicitly. Instead we want a dynamic + mirror with data which gets updated automatically when + there is need (updated data on the remote host).

    +
    + +
    Solution:
    + +
    +

    To provide this feature we map the remote webpage or even + the complete remote webarea to our namespace by the use + of the Proxy Throughput feature + (flag [P]):

    + +
    +RewriteEngine  on
    +RewriteBase    /~quux/
    +RewriteRule    ^hotsheet/(.*)$  http://www.tstimpreso.com/hotsheet/$1  [P]
    +
    + +
    +RewriteEngine  on
    +RewriteBase    /~quux/
    +RewriteRule    ^usa-news\.html$   http://www.quux-corp.com/news/index.html  [P]
    +
    +
    +
    + + + +

    Reverse Dynamic Mirror

    + + + +
    +
    Description:
    + +
    ...
    + +
    Solution:
    + +
    +
    +RewriteEngine on
    +RewriteCond   /mirror/of/remotesite/$1           -U
    +RewriteRule   ^http://www\.remotesite\.com/(.*)$ /mirror/of/remotesite/$1
    +
    +
    +
    + + + +

    Retrieve Missing Data from Intranet

    + + + +
    +
    Description:
    + +
    +

    This is a tricky way of virtually running a corporate + (external) Internet webserver + (www.quux-corp.dom), while actually keeping + and maintaining its data on a (internal) Intranet webserver + (www2.quux-corp.dom) which is protected by a + firewall. The trick is that on the external webserver we + retrieve the requested data on-the-fly from the internal + one.

    +
    + +
    Solution:
    + +
    +

    First, we have to make sure that our firewall still + protects the internal webserver and that only the + external webserver is allowed to retrieve data from it. + For a packet-filtering firewall we could for instance + configure a firewall ruleset like the following:

    + +
    +ALLOW Host www.quux-corp.dom Port >1024 --> Host www2.quux-corp.dom Port 80
    +DENY  Host *                 Port *     --> Host www2.quux-corp.dom Port 80
    +
    + +

    Just adjust it to your actual configuration syntax. + Now we can establish the mod_rewrite + rules which request the missing data in the background + through the proxy throughput feature:

    + +
    +RewriteRule ^/~([^/]+)/?(.*)          /home/$1/.www/$2
    +RewriteCond %{REQUEST_FILENAME}       !-f
    +RewriteCond %{REQUEST_FILENAME}       !-d
    +RewriteRule ^/home/([^/]+)/.www/?(.*) http://www2.quux-corp.dom/~$1/pub/$2 [P]
    +
    +
    +
    + + + +

    Load Balancing

    + + + +
    +
    Description:
    + +
    +

    Suppose we want to load balance the traffic to + www.foo.com over www[0-5].foo.com + (a total of 6 servers). How can this be done?

    +
    + +
    Solution:
    + +
    +

    There are a lot of possible solutions for this problem. + We will discuss first a commonly known DNS-based variant + and then the special one with mod_rewrite:

    + +
      +
    1. + DNS Round-Robin + +

      The simplest method for load-balancing is to use + the DNS round-robin feature of BIND. + Here you just configure www[0-9].foo.com + as usual in your DNS with A(address) records, e.g.

      + +
      +www0   IN  A       1.2.3.1
      +www1   IN  A       1.2.3.2
      +www2   IN  A       1.2.3.3
      +www3   IN  A       1.2.3.4
      +www4   IN  A       1.2.3.5
      +www5   IN  A       1.2.3.6
      +
      + +

      Then you additionally add the following entry:

      + +
      +www    IN  CNAME   www0.foo.com.
      +       IN  CNAME   www1.foo.com.
      +       IN  CNAME   www2.foo.com.
      +       IN  CNAME   www3.foo.com.
      +       IN  CNAME   www4.foo.com.
      +       IN  CNAME   www5.foo.com.
      +       IN  CNAME   www6.foo.com.
      +
      + +

      Notice that this seems wrong, but is actually an + intended feature of BIND and can be used + in this way. However, now when www.foo.com gets + resolved, BIND gives out www0-www6 + - but in a slightly permutated/rotated order every time. + This way the clients are spread over the various + servers. But notice that this not a perfect load + balancing scheme, because DNS resolve information + gets cached by the other nameservers on the net, so + once a client has resolved www.foo.com + to a particular wwwN.foo.com, all + subsequent requests also go to this particular name + wwwN.foo.com. But the final result is + ok, because the total sum of the requests are really + spread over the various webservers.

      +
    2. + +
    3. + DNS Load-Balancing + +

      A sophisticated DNS-based method for + load-balancing is to use the program + lbnamed which can be found at + http://www.stanford.edu/~schemers/docs/lbnamed/lbnamed.html. + It is a Perl 5 program in conjunction with auxilliary + tools which provides a real load-balancing for + DNS.

      +
    4. + +
    5. + Proxy Throughput Round-Robin + +

      In this variant we use mod_rewrite + and its proxy throughput feature. First we dedicate + www0.foo.com to be actually + www.foo.com by using a single

      + +
      +www    IN  CNAME   www0.foo.com.
      +
      + +

      entry in the DNS. Then we convert + www0.foo.com to a proxy-only server, + i.e. we configure this machine so all arriving URLs + are just pushed through the internal proxy to one of + the 5 other servers (www1-www5). To + accomplish this we first establish a ruleset which + contacts a load balancing script lb.pl + for all URLs.

      + +
      +RewriteEngine on
      +RewriteMap    lb      prg:/path/to/lb.pl
      +RewriteRule   ^/(.+)$ ${lb:$1}           [P,L]
      +
      + +

      Then we write lb.pl:

      + +
      +#!/path/to/perl
      +##
      +##  lb.pl -- load balancing script
      +##
      +
      +$| = 1;
      +
      +$name   = "www";     # the hostname base
      +$first  = 1;         # the first server (not 0 here, because 0 is myself)
      +$last   = 5;         # the last server in the round-robin
      +$domain = "foo.dom"; # the domainname
      +
      +$cnt = 0;
      +while (<STDIN>) {
      +    $cnt = (($cnt+1) % ($last+1-$first));
      +    $server = sprintf("%s%d.%s", $name, $cnt+$first, $domain);
      +    print "http://$server/$_";
      +}
      +
      +##EOF##
      +
      + +
      A last notice: Why is this useful? Seems like + www0.foo.com still is overloaded? The + answer is yes, it is overloaded, but with plain proxy + throughput requests, only! All SSI, CGI, ePerl, etc. + processing is completely done on the other machines. + This is the essential point.
      +
    6. + +
    7. + Hardware/TCP Round-Robin + +

      There is a hardware solution available, too. Cisco + has a beast called LocalDirector which does a load + balancing at the TCP/IP level. Actually this is some + sort of a circuit level gateway in front of a + webcluster. If you have enough money and really need + a solution with high performance, use this one.

      +
    8. +
    +
    +
    + + + +

    New MIME-type, New Service

    + + + +
    +
    Description:
    + +
    +

    On the net there are a lot of nifty CGI programs. But + their usage is usually boring, so a lot of webmaster + don't use them. Even Apache's Action handler feature for + MIME-types is only appropriate when the CGI programs + don't need special URLs (actually PATH_INFO + and QUERY_STRINGS) as their input. First, + let us configure a new file type with extension + .scgi (for secure CGI) which will be processed + by the popular cgiwrap program. The problem + here is that for instance we use a Homogeneous URL Layout + (see above) a file inside the user homedirs has the URL + /u/user/foo/bar.scgi. But + cgiwrap needs the URL in the form + /~user/foo/bar.scgi/. The following rule + solves the problem:

    + +
    +RewriteRule ^/[uge]/([^/]+)/\.www/(.+)\.scgi(.*) ...
    +... /internal/cgi/user/cgiwrap/~$1/$2.scgi$3  [NS,T=application/x-http-cgi]
    +
    + +

    Or assume we have some more nifty programs: + wwwlog (which displays the + access.log for a URL subtree and + wwwidx (which runs Glimpse on a URL + subtree). We have to provide the URL area to these + programs so they know on which area they have to act on. + But usually this ugly, because they are all the times + still requested from that areas, i.e. typically we would + run the swwidx program from within + /u/user/foo/ via hyperlink to

    + +
    +/internal/cgi/user/swwidx?i=/u/user/foo/
    +
    + +

    which is ugly. Because we have to hard-code + both the location of the area + and the location of the CGI inside the + hyperlink. When we have to reorganize the area, we spend a + lot of time changing the various hyperlinks.

    +
    + +
    Solution:
    + +
    +

    The solution here is to provide a special new URL format + which automatically leads to the proper CGI invocation. + We configure the following:

    + +
    +RewriteRule   ^/([uge])/([^/]+)(/?.*)/\*  /internal/cgi/user/wwwidx?i=/$1/$2$3/
    +RewriteRule   ^/([uge])/([^/]+)(/?.*):log /internal/cgi/user/wwwlog?f=/$1/$2$3
    +
    + +

    Now the hyperlink to search at + /u/user/foo/ reads only

    + +
    +HREF="*"
    +
    + +

    which internally gets automatically transformed to

    + +
    +/internal/cgi/user/wwwidx?i=/u/user/foo/
    +
    + +

    The same approach leads to an invocation for the + access log CGI program when the hyperlink + :log gets used.

    +
    +
    + + + +

    From Static to Dynamic

    + + + +
    +
    Description:
    + +
    +

    How can we transform a static page + foo.html into a dynamic variant + foo.cgi in a seamless way, i.e. without notice + by the browser/user.

    +
    + +
    Solution:
    + +
    +

    We just rewrite the URL to the CGI-script and force the + correct MIME-type so it gets really run as a CGI-script. + This way a request to /~quux/foo.html + internally leads to the invocation of + /~quux/foo.cgi.

    + +
    +RewriteEngine  on
    +RewriteBase    /~quux/
    +RewriteRule    ^foo\.html$  foo.cgi  [T=application/x-httpd-cgi]
    +
    +
    +
    + + + +

    On-the-fly Content-Regeneration

    + + + +
    +
    Description:
    + +
    +

    Here comes a really esoteric feature: Dynamically + generated but statically served pages, i.e. pages should be + delivered as pure static pages (read from the filesystem + and just passed through), but they have to be generated + dynamically by the webserver if missing. This way you can + have CGI-generated pages which are statically served unless + one (or a cronjob) removes the static contents. Then the + contents gets refreshed.

    +
    + +
    Solution:
    + +
    + This is done via the following ruleset: + +
    +RewriteCond %{REQUEST_FILENAME}   !-s
    +RewriteRule ^page\.html$          page.cgi   [T=application/x-httpd-cgi,L]
    +
    + +

    Here a request to page.html leads to a + internal run of a corresponding page.cgi if + page.html is still missing or has filesize + null. The trick here is that page.cgi is a + usual CGI script which (additionally to its STDOUT) + writes its output to the file page.html. + Once it was run, the server sends out the data of + page.html. When the webmaster wants to force + a refresh the contents, he just removes + page.html (usually done by a cronjob).

    +
    +
    + + + +

    Document With Autorefresh

    + + + +
    +
    Description:
    + +
    +

    Wouldn't it be nice while creating a complex webpage if + the webbrowser would automatically refresh the page every + time we write a new version from within our editor? + Impossible?

    +
    + +
    Solution:
    + +
    +

    No! We just combine the MIME multipart feature, the + webserver NPH feature and the URL manipulation power of + mod_rewrite. First, we establish a new + URL feature: Adding just :refresh to any + URL causes this to be refreshed every time it gets + updated on the filesystem.

    + +
    +RewriteRule   ^(/[uge]/[^/]+/?.*):refresh  /internal/cgi/apache/nph-refresh?f=$1
    +
    + +

    Now when we reference the URL

    + +
    +/u/foo/bar/page.html:refresh
    +
    + +

    this leads to the internal invocation of the URL

    + +
    +/internal/cgi/apache/nph-refresh?f=/u/foo/bar/page.html
    +
    + +

    The only missing part is the NPH-CGI script. Although + one would usually say "left as an exercise to the reader" + ;-) I will provide this, too.

    + +
    +#!/sw/bin/perl
    +##
    +##  nph-refresh -- NPH/CGI script for auto refreshing pages
    +##  Copyright (c) 1997 Ralf S. Engelschall, All Rights Reserved.
    +##
    +$| = 1;
    +
    +#   split the QUERY_STRING variable
    +@pairs = split(/&/, $ENV{'QUERY_STRING'});
    +foreach $pair (@pairs) {
    +    ($name, $value) = split(/=/, $pair);
    +    $name =~ tr/A-Z/a-z/;
    +    $name = 'QS_' . $name;
    +    $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
    +    eval "\$$name = \"$value\"";
    +}
    +$QS_s = 1 if ($QS_s eq '');
    +$QS_n = 3600 if ($QS_n eq '');
    +if ($QS_f eq '') {
    +    print "HTTP/1.0 200 OK\n";
    +    print "Content-type: text/html\n\n";
    +    print "&lt;b&gt;ERROR&lt;/b&gt;: No file given\n";
    +    exit(0);
    +}
    +if (! -f $QS_f) {
    +    print "HTTP/1.0 200 OK\n";
    +    print "Content-type: text/html\n\n";
    +    print "&lt;b&gt;ERROR&lt;/b&gt;: File $QS_f not found\n";
    +    exit(0);
    +}
    +
    +sub print_http_headers_multipart_begin {
    +    print "HTTP/1.0 200 OK\n";
    +    $bound = "ThisRandomString12345";
    +    print "Content-type: multipart/x-mixed-replace;boundary=$bound\n";
    +    &print_http_headers_multipart_next;
    +}
    +
    +sub print_http_headers_multipart_next {
    +    print "\n--$bound\n";
    +}
    +
    +sub print_http_headers_multipart_end {
    +    print "\n--$bound--\n";
    +}
    +
    +sub displayhtml {
    +    local($buffer) = @_;
    +    $len = length($buffer);
    +    print "Content-type: text/html\n";
    +    print "Content-length: $len\n\n";
    +    print $buffer;
    +}
    +
    +sub readfile {
    +    local($file) = @_;
    +    local(*FP, $size, $buffer, $bytes);
    +    ($x, $x, $x, $x, $x, $x, $x, $size) = stat($file);
    +    $size = sprintf("%d", $size);
    +    open(FP, "&lt;$file");
    +    $bytes = sysread(FP, $buffer, $size);
    +    close(FP);
    +    return $buffer;
    +}
    +
    +$buffer = &readfile($QS_f);
    +&print_http_headers_multipart_begin;
    +&displayhtml($buffer);
    +
    +sub mystat {
    +    local($file) = $_[0];
    +    local($time);
    +
    +    ($x, $x, $x, $x, $x, $x, $x, $x, $x, $mtime) = stat($file);
    +    return $mtime;
    +}
    +
    +$mtimeL = &mystat($QS_f);
    +$mtime = $mtime;
    +for ($n = 0; $n &lt; $QS_n; $n++) {
    +    while (1) {
    +        $mtime = &mystat($QS_f);
    +        if ($mtime ne $mtimeL) {
    +            $mtimeL = $mtime;
    +            sleep(2);
    +            $buffer = &readfile($QS_f);
    +            &print_http_headers_multipart_next;
    +            &displayhtml($buffer);
    +            sleep(5);
    +            $mtimeL = &mystat($QS_f);
    +            last;
    +        }
    +        sleep($QS_s);
    +    }
    +}
    +
    +&print_http_headers_multipart_end;
    +
    +exit(0);
    +
    +##EOF##
    +
    +
    +
    + + + +

    Mass Virtual Hosting

    + + + +
    +
    Description:
    + +
    +

    The <VirtualHost> feature of Apache is nice + and works great when you just have a few dozens + virtual hosts. But when you are an ISP and have hundreds of + virtual hosts to provide this feature is not the best + choice.

    +
    + +
    Solution:
    + +
    +

    To provide this feature we map the remote webpage or even + the complete remote webarea to our namespace by the use + of the Proxy Throughput feature (flag [P]):

    + +
    +##
    +##  vhost.map
    +##
    +www.vhost1.dom:80  /path/to/docroot/vhost1
    +www.vhost2.dom:80  /path/to/docroot/vhost2
    +     :
    +www.vhostN.dom:80  /path/to/docroot/vhostN
    +
    + +
    +##
    +##  httpd.conf
    +##
    +    :
    +#   use the canonical hostname on redirects, etc.
    +UseCanonicalName on
    +
    +    :
    +#   add the virtual host in front of the CLF-format
    +CustomLog  /path/to/access_log  "%{VHOST}e %h %l %u %t \"%r\" %>s %b"
    +    :
    +
    +#   enable the rewriting engine in the main server
    +RewriteEngine on
    +
    +#   define two maps: one for fixing the URL and one which defines
    +#   the available virtual hosts with their corresponding
    +#   DocumentRoot.
    +RewriteMap    lowercase    int:tolower
    +RewriteMap    vhost        txt:/path/to/vhost.map
    +
    +#   Now do the actual virtual host mapping
    +#   via a huge and complicated single rule:
    +#
    +#   1. make sure we don't map for common locations
    +RewriteCond   %{REQUEST_URI}  !^/commonurl1/.*
    +RewriteCond   %{REQUEST_URI}  !^/commonurl2/.*
    +    :
    +RewriteCond   %{REQUEST_URI}  !^/commonurlN/.*
    +#
    +#   2. make sure we have a Host header, because
    +#      currently our approach only supports
    +#      virtual hosting through this header
    +RewriteCond   %{HTTP_HOST}  !^$
    +#
    +#   3. lowercase the hostname
    +RewriteCond   ${lowercase:%{HTTP_HOST}|NONE}  ^(.+)$
    +#
    +#   4. lookup this hostname in vhost.map and
    +#      remember it only when it is a path
    +#      (and not "NONE" from above)
    +RewriteCond   ${vhost:%1}  ^(/.*)$
    +#
    +#   5. finally we can map the URL to its docroot location
    +#      and remember the virtual host for logging puposes
    +RewriteRule   ^/(.*)$   %1/$1  [E=VHOST:${lowercase:%{HTTP_HOST}}]
    +    :
    +
    +
    +
    + + + +
    top
    +
    +

    Access Restriction

    + + + +

    Blocking of Robots

    + + + +
    +
    Description:
    + +
    +

    How can we block a really annoying robot from + retrieving pages of a specific webarea? A + /robots.txt file containing entries of the + "Robot Exclusion Protocol" is typically not enough to get + rid of such a robot.

    +
    + +
    Solution:
    + +
    +

    We use a ruleset which forbids the URLs of the webarea + /~quux/foo/arc/ (perhaps a very deep + directory indexed area where the robot traversal would + create big server load). We have to make sure that we + forbid access only to the particular robot, i.e. just + forbidding the host where the robot runs is not enough. + This would block users from this host, too. We accomplish + this by also matching the User-Agent HTTP header + information.

    + +
    +RewriteCond %{HTTP_USER_AGENT}   ^NameOfBadRobot.*
    +RewriteCond %{REMOTE_ADDR}       ^123\.45\.67\.[8-9]$
    +RewriteRule ^/~quux/foo/arc/.+   -   [F]
    +
    +
    +
    + + + +

    Blocked Inline-Images

    + + + +
    +
    Description:
    + +
    +

    Assume we have under http://www.quux-corp.de/~quux/ + some pages with inlined GIF graphics. These graphics are + nice, so others directly incorporate them via hyperlinks to + their pages. We don't like this practice because it adds + useless traffic to our server.

    +
    + +
    Solution:
    + +
    +

    While we cannot 100% protect the images from inclusion, + we can at least restrict the cases where the browser + sends a HTTP Referer header.

    + +
    +RewriteCond %{HTTP_REFERER} !^$
    +RewriteCond %{HTTP_REFERER} !^http://www.quux-corp.de/~quux/.*$ [NC]
    +RewriteRule .*\.gif$        -                                    [F]
    +
    + +
    +RewriteCond %{HTTP_REFERER}         !^$
    +RewriteCond %{HTTP_REFERER}         !.*/foo-with-gif\.html$
    +RewriteRule ^inlined-in-foo\.gif$   -                        [F]
    +
    +
    +
    + + + +

    Host Deny

    + + + +
    +
    Description:
    + +
    +

    How can we forbid a list of externally configured hosts + from using our server?

    +
    + +
    Solution:
    + +
    +

    For Apache >= 1.3b6:

    + +
    +RewriteEngine on
    +RewriteMap    hosts-deny  txt:/path/to/hosts.deny
    +RewriteCond   ${hosts-deny:%{REMOTE_HOST}|NOT-FOUND} !=NOT-FOUND [OR]
    +RewriteCond   ${hosts-deny:%{REMOTE_ADDR}|NOT-FOUND} !=NOT-FOUND
    +RewriteRule   ^/.*  -  [F]
    +
    + +

    For Apache <= 1.3b6:

    + +
    +RewriteEngine on
    +RewriteMap    hosts-deny  txt:/path/to/hosts.deny
    +RewriteRule   ^/(.*)$ ${hosts-deny:%{REMOTE_HOST}|NOT-FOUND}/$1
    +RewriteRule   !^NOT-FOUND/.* - [F]
    +RewriteRule   ^NOT-FOUND/(.*)$ ${hosts-deny:%{REMOTE_ADDR}|NOT-FOUND}/$1
    +RewriteRule   !^NOT-FOUND/.* - [F]
    +RewriteRule   ^NOT-FOUND/(.*)$ /$1
    +
    + +
    +##
    +##  hosts.deny
    +##
    +##  ATTENTION! This is a map, not a list, even when we treat it as such.
    +##             mod_rewrite parses it for key/value pairs, so at least a
    +##             dummy value "-" must be present for each entry.
    +##
    +
    +193.102.180.41 -
    +bsdti1.sdm.de  -
    +192.76.162.40  -
    +
    +
    +
    + + + +

    Proxy Deny

    + + + +
    +
    Description:
    + +
    +

    How can we forbid a certain host or even a user of a + special host from using the Apache proxy?

    +
    + +
    Solution:
    + +
    +

    We first have to make sure mod_rewrite + is below(!) mod_proxy in the Configuration + file when compiling the Apache webserver. This way it gets + called before mod_proxy. Then we + configure the following for a host-dependent deny...

    + +
    +RewriteCond %{REMOTE_HOST} ^badhost\.mydomain\.com$
    +RewriteRule !^http://[^/.]\.mydomain.com.*  - [F]
    +
    + +

    ...and this one for a user@host-dependent deny:

    + +
    +RewriteCond %{REMOTE_IDENT}@%{REMOTE_HOST}  ^badguy@badhost\.mydomain\.com$
    +RewriteRule !^http://[^/.]\.mydomain.com.*  - [F]
    +
    +
    +
    + + + +

    Special Authentication Variant

    + + + +
    +
    Description:
    + +
    +

    Sometimes a very special authentication is needed, for + instance a authentication which checks for a set of + explicitly configured users. Only these should receive + access and without explicit prompting (which would occur + when using the Basic Auth via mod_auth).

    +
    + +
    Solution:
    + +
    +

    We use a list of rewrite conditions to exclude all except + our friends:

    + +
    +RewriteCond %{REMOTE_IDENT}@%{REMOTE_HOST} !^friend1@client1.quux-corp\.com$
    +RewriteCond %{REMOTE_IDENT}@%{REMOTE_HOST} !^friend2@client2.quux-corp\.com$
    +RewriteCond %{REMOTE_IDENT}@%{REMOTE_HOST} !^friend3@client3.quux-corp\.com$
    +RewriteRule ^/~quux/only-for-friends/      -                                 [F]
    +
    +
    +
    + + + +

    Referer-based Deflector

    + + + +
    +
    Description:
    + +
    +

    How can we program a flexible URL Deflector which acts + on the "Referer" HTTP header and can be configured with as + many referring pages as we like?

    +
    + +
    Solution:
    + +
    +

    Use the following really tricky ruleset...

    + +
    +RewriteMap  deflector txt:/path/to/deflector.map
    +
    +RewriteCond %{HTTP_REFERER} !=""
    +RewriteCond ${deflector:%{HTTP_REFERER}} ^-$
    +RewriteRule ^.* %{HTTP_REFERER} [R,L]
    +
    +RewriteCond %{HTTP_REFERER} !=""
    +RewriteCond ${deflector:%{HTTP_REFERER}|NOT-FOUND} !=NOT-FOUND
    +RewriteRule ^.* ${deflector:%{HTTP_REFERER}} [R,L]
    +
    + +

    ... in conjunction with a corresponding rewrite + map:

    + +
    +##
    +##  deflector.map
    +##
    +
    +http://www.badguys.com/bad/index.html    -
    +http://www.badguys.com/bad/index2.html   -
    +http://www.badguys.com/bad/index3.html   http://somewhere.com/
    +
    + +

    This automatically redirects the request back to the + referring page (when "-" is used as the value + in the map) or to a specific URL (when an URL is specified + in the map as the second argument).

    +
    +
    + + + +
    top
    +
    +

    Other

    + + + +

    External Rewriting Engine

    + + + +
    +
    Description:
    + +
    +

    A FAQ: How can we solve the FOO/BAR/QUUX/etc. + problem? There seems no solution by the use of + mod_rewrite...

    +
    + +
    Solution:
    + +
    +

    Use an external RewriteMap, i.e. a program which acts + like a RewriteMap. It is run once on startup of Apache + receives the requested URLs on STDIN and has + to put the resulting (usually rewritten) URL on + STDOUT (same order!).

    + +
    +RewriteEngine on
    +RewriteMap    quux-map       prg:/path/to/map.quux.pl
    +RewriteRule   ^/~quux/(.*)$  /~quux/${quux-map:$1}
    +
    + +
    +#!/path/to/perl
    +
    +#   disable buffered I/O which would lead
    +#   to deadloops for the Apache server
    +$| = 1;
    +
    +#   read URLs one per line from stdin and
    +#   generate substitution URL on stdout
    +while (<>) {
    +    s|^foo/|bar/|;
    +    print $_;
    +}
    +
    + +

    This is a demonstration-only example and just rewrites + all URLs /~quux/foo/... to + /~quux/bar/.... Actually you can program + whatever you like. But notice that while such maps can be + used also by an average user, only the + system administrator can define it.

    +
    +
    + + + +
    +
    +

    Available Languages:  en  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/misc/rewriteguide.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/misc/rewriteguide.html.ko.euc-kr new file mode 100644 index 00000000..694b8f01 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/misc/rewriteguide.html.ko.euc-kr @@ -0,0 +1,2013 @@ + + + +URL ÀçÀÛ¼º Áöħ¼­ - Apache HTTP Server + + + + + +
    <-
    +

    URL ÀçÀÛ¼º Áöħ¼­

    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + ko 

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

    ¿øÀúÀÚ
    + Ralf S. Engelschall <rse@apache.org>
    + 1997³â 12¿ù

    +
    + +

    ÀÌ ¹®¼­´Â mod_rewrite ÂüÁ¶ ¹®¼­¸¦ º¸ÃæÇÑ´Ù. + ÀÌ ¹®¼­´Â À¥°ü¸®ÀÚ°¡ ½ÇÁ¦ ÀÛ¾÷¿¡¼­ ºÎµúÄ¡°ÔµÇ´Â ÀüÇüÀûÀÎ + URL°ü·Ã ¹®Á¦¸¦ ÇØ°áÇϱâÀ§Çؼ­ ¾î¶»°Ô ¾ÆÆÄÄ¡ + mod_rewrite¸¦ »ç¿ëÇÏ´ÂÁö ¼³¸íÇÑ´Ù. URL + ÀçÀÛ¼º ±ÔÄ¢À» ¼³Á¤ÇÏ¿© ¹®Á¦¸¦ ÇØ°áÇÏ´Â ¹æ¹ýÀ» ÀÚ¼¼È÷ ¼³¸íÇÑ´Ù.

    + +
    + +
    top
    +
    +

    mod_rewrite ¼Ò°³

    + + + +

    ¾ÆÆÄÄ¡ mod_rewrite ¸ðµâÀº ±²ÀåÇÏ´Ù. + Áï, URLÀ» Á¶ÀÛÇÒ ¼ö ÀÖ´Â °­·ÂÇÏ°í ½Ç·Î Á¤±³ÇÑ ¸ðµâÀÌ´Ù. + »ó»óÇØ¿Ô´ø °ÅÀÇ ¸ðµç Á¾·ùÀÇ URL Á¶ÀÛÀÌ °¡´ÉÇÏ´Ù. ±×·¯³ª + ±× ´ë°¡·Î »ç¿ëÇϱ⠺¹ÀâÇÏ´Ù. mod_rewriteÀÇ + ÃÖ´ë ´ÜÁ¡Àº Ãʺ¸ÀÚ°¡ ÀÌÇØÇÏ°í »ç¿ëÇϱ⠽±Áö ¾Ê´Ù´Â Á¡ÀÌ´Ù. + ½ÉÁö¾î ¾ÆÆÄÄ¡ Àü¹®°¡µµ Á¾Á¾ mod_rewriteÀÇ + »õ·Î¿î ¿ëµµ¸¦ ¹ß°ßÇÑ´Ù.

    + +

    ´Ù¸¥ ¸»·Î: mod_rewrite¿¡ ´ëÇØ ´ç½ÅÀº + óÀ½¿¡ °ÌÀ» ¸Ô°í Àý´ë·Î ´Ù½Ã »ç¿ëÇÏÁö ¾Ê°Å³ª, °­·ÂÇÔ¿¡ ¸Å·áµÇ¾î + ¾ÕÀ¸·Î »î µ¿¾È »ç¶û¿¡ ºüÁú °ÍÀÌ´Ù. ÀÌ ±ÛÀº ù¹ø° °æ¿ì¸¦ + ¸·±âÀ§ÇØ ÀÌ¹Ì ¾Ë·ÁÁø ¸î°¡Áö ¼º°ø»ç·Ê¸¦ ¼Ò°³ÇÏ·Á°í ÇÑ´Ù.

    + +
    top
    +
    +

    ½Ç¿ëÀûÀÎ ÇØ°áÃ¥

    + + + +

    ÀÌÁ¦ ³»°¡ Á÷Á¢ ¸¸µé¾ú°Å³ª ´Ù¸¥ »ç¶÷µéÀÌ ¸¸µç ¸¹Àº ½Ç¿ëÀûÀÎ + ÇØ°áÃ¥ÀÌ ³ª¿Â´Ù. ¿¹Á¦¿¡¼­ URL ÀçÀÛ¼ºÀÇ È渶¼úÀ» ¸¶À½²¯ ¹è¿ì±æ + ¹Ù¶õ´Ù.

    + +
    ÁÖÀÇ: ¼­¹ö ¼³Á¤¿¡ µû¶ó »óȲ¿¡ ¸Â°Ô + ¿¹Á¦¸¦ Á¶±Ý ¼öÁ¤ÇØ¾ß ÇÒ °æ¿ì°¡ ÀÖ´Ù. ¿¹¸¦ µé¾î, Ãß°¡·Î + mod_alias, mod_userdir + µîÀ» »ç¿ëÇÑ´Ù¸é [PT] Ç÷¡±×¸¦ Ãß°¡ÇÑ´Ù. ȤÀº + ÁÖ¼­¹ö¼³Á¤/°¡»óÈ£½ºÆ® »ç¿ëÀå¼Ò°¡ ¾Æ´Ñ .htaccess + »ç¿ëÀå¼Ò¿¡ ¾Ë¸Â°Ô ±ÔÄ¢À» ¼öÁ¤ÇÒ ¼öµµ ÀÖ´Ù. »ç¿ëÇϱâ Àü¿¡ + Ç×»ó ±ÔÄ¢ÀÌ ¾î¶² ±â´ÉÀ» ÇÏ´ÂÁö ÀÌÇØÇϵµ·Ï Çضó. ±×·¯¸é ¹®Á¦¸¦ + ÇÇÇÒ ¼ö ÀÖ´Ù.
    + +
    top
    +
    +

    URL ±¸Á¶

    + + + +

    ±âÁØÀÌ µÇ´Â URL

    + + + +
    +
    »óȲ¼³¸í:
    + +
    +

    ÇÑ ¸®¼Ò½º¿¡ ´ëÇØ ¿©·¯ URLÀ» °¡Áö´Â À¥¼­¹ö°¡ ÀÖ´Ù. + º¸Åë (½ÇÁ¦ »ç¿ëÇÏ°í ¾Ë·ÁÁ®¾ß ÇÒ) ±âÁØÀÌ µÇ´Â URL°ú, + ´ÜÃà ȤÀº ³»ºÎ ¿ëµµÀÇ URLÀÌ ÀÖ´Ù. »ç¿ëÀÚ°¡ ¿äû¿¡ + ¾î¶² URLÀ» »ç¿ëÇÏ´øÁö ±âÁØÀÌ µÇ´Â URL¸¸À» º¸¿©Áà¾ß + ÇÑ´Ù.

    +
    + +
    ÇØ°áÃ¥:
    + +
    +

    ±âÁØÀÌ µÇÁö¾Ê´Â ¸ðµç URLÀ» ºê¶ó¿ìÀú°¡ ¾Ëµµ·Ï °íÄ¡±âÀ§ÇØ + ¿ÜºÎ HTTP ¸®´ÙÀÌ·º¼ÇÇÑ´Ù. ¿¹¸¦ µé¾î ¾Æ·¡ ±ÔÄ¢Àº + /~user¸¦ ±âÁØÀÌ µÇ´Â /u/user·Î + ´ëüÇÏ°í, /u/user ¸¶Áö¸·¿¡ ½½·¡½¬°¡ ¾ø´Ù¸é + Ãß°¡ÇÑ´Ù.

    + +
    +RewriteRule   ^/~([^/]+)/?(.*)    /u/$1/$2  [R]
    +RewriteRule   ^/([uge])/([^/]+)$  /$1/$2/   [R]
    +
    +
    +
    + + + +

    ±âÁØÀÌ µÇ´Â È£½ºÆ®¸í

    + + + +
    +
    »óȲ¼³¸í:
    + +
    ÀÌ ±ÔÄ¢Àº µ¿ÀÏÇÑ »çÀÌÆ®¿¡ µµ´ÞÇÒ ¼ö ÀÖ´Â ´Ù¸¥ È£½ºÆ®¸í + ´ë½Å ƯÁ¤ È£½ºÆ®¸íÀ» »ç¿ëÇϵµ·Ï °­Á¦ÇÑ´Ù. ¿¹¸¦ µé¾î, + example.com ´ë½Å + www.example.comÀ» »ç¿ëÇϵµ·Ï °­Á¦ÇÏ°í + ½Í´Ù¸é ´ÙÀ½°ú °°Àº ±ÔÄ¢À» »ç¿ëÇÒ ¼ö ÀÖ´Ù.
    + +
    ÇØ°áÃ¥:
    + +
    +
    +# 80¹øÀÌ ¾Æ´Ñ Æ÷Æ®¿¡¼­ ½ÇÇàÇÏ´Â »çÀÌÆ®¿ë
    +RewriteCond %{HTTP_HOST}   !^fully\.qualified\.domain\.name [NC]
    +RewriteCond %{HTTP_HOST}   !^$
    +RewriteCond %{SERVER_PORT} !^80$
    +RewriteRule ^/(.*)         http://fully.qualified.domain.name:%{SERVER_PORT}/$1 [L,R]
    +
    +# ±×¸®°í, 80¹ø Æ÷Æ®¿¡¼­ ½ÇÇàÇÏ´Â »çÀÌÆ®¿ë
    +RewriteCond %{HTTP_HOST}   !^fully\.qualified\.domain\.name [NC]
    +RewriteCond %{HTTP_HOST}   !^$
    +RewriteRule ^/(.*)         http://fully.qualified.domain.name/$1 [L,R]
    +
    +
    +
    + + + +

    DocumentRoot¸¦ ¿Å±ä °æ¿ì

    + + + +
    +
    »óȲ¼³¸í:
    + +
    +

    À¥¼­¹öÀÇ DocumentRoot´Â º¸Åë URL + "/"°ú Á÷Á¢ °ü·ÃÀÖ´Ù. ±×·¯³ª ÀÌ°÷¿¡ ¸ðµç + ÀÚ·á°¡ ÀÖÁö ¾Ê°í, ÀÚ·á°¡ ´Ù¸¥ ¿©·¯ °÷¿¡ Èð¾îÁ®ÀÖ´Â + °æ¿ì°¡ ÀÖ´Ù. ¿¹¸¦ µé¾î ÀÎÆ®¶ó³Ý »çÀÌÆ®¿¡ (¿ÜºÎ¸¦ À§ÇÑ + ȨÆäÀÌÁö) /e/www/¿Í (ÀÎÆ®¶ó³ÝÀ» À§ÇÑ + ȨÆäÀÌÁö) /e/sww/°¡ ÀÖ´Ù°í ÇÏÀÚ. ÀÌÁ¦ + DocumentRoot°¡ + /e/www/À̱⶧¹®¿¡, ¿äû¿¡¼­ ÆäÀÌÁö¿¡ + Æ÷ÇÔµÈ ±×¸² µîÀ» ÀÌ°÷¿¡¼­ °¡Á®¿Í¾ß ÇÑ´Ù.

    +
    + +
    ÇØ°áÃ¥:
    + +
    +

    ¿ì¸®´Â URL /¸¦ /e/www/·Î + ¸®´ÙÀÌ·º¼Ç¸¸ ÇÏ¸é µÈ´Ù. »ç¼ÒÇØ º¸ÀÌÁö¸¸ ½ÇÁ¦·Î + mod_rewrite¸¦ »ç¿ëÇؼ­¸¸ °¡´ÉÇÏ´Ù. + (mod_alias µîÀÌ Á¦°øÇÏ´Â) URL + Alias °°Àº ÀüÇüÀûÀÎ ¹æ¹ýÀº ¾ÕºÎºÐ¸¸ + ã´Â´Ù. DocumentRoot°¡ + ¸ðµç URLÀÇ ¾ÕºÎºÐÀ̱⶧¹®¿¡ ÀÌ ¹æ¹ýÀ» »ç¿ëÇÏ¿© ¸®´ÙÀÌ·º¼ÇÀ» + ÇÒ ¼ö ¾ø´Ù. mod_rewrite¸¦ »ç¿ëÇϸé + ÁøÂ¥ °£´ÜÇÏ´Ù:

    + +
    +RewriteEngine on
    +RewriteRule   ^/$  /e/www/  [R]
    +
    +
    +
    + + + +

    ¸¶Áö¸· ½½·¡½¬ ¹®Á¦

    + + + +
    +
    »óȲ¼³¸í:
    + +
    +

    µð·ºÅ丮¸¦ ÁöĪÇÏ´Â URLÀÇ ¸¶Áö¸· ½½·¡½¬ ¹®Á¦°¡ + ¾ø´Ù¸é ¸ðµç À¥°ü¸®Àڴ ȯȣÇÒ °ÍÀÌ´Ù. ½½·¡½¬°¡ ¾ø´Ù¸é, + Áï /~quux/foo/ ´ë½Å /~quux/foo¸¦ + »ç¿ëÇÏ¸é ¼­¹ö°¡ foo¶ó´Â ÆÄÀÏÀ» + ã±â¶§¹®¿¡ ¿À·ù°¡ ¹ß»ýÇÑ´Ù. ÆÄÀÏÀÌ µð·ºÅ丮À̱⶧¹®¿¡ + ¹Þ¾ÆµéÀÌÁö ¾Ê´Â´Ù. ´ëºÎºÐÀÇ °æ¿ì º¸Åë ¼­¹ö°¡ ÀÚµ¿À¸·Î + URLÀ» °íÄ¡Áö¸¸, °¡²û Á÷Á¢ ÇØÁà¾ß ÇÒ °æ¿ì°¡ ÀÖ´Ù. ¿¹¸¦ + µé¾î, CGI ½ºÅ©¸³Æ® µîÀ¸·Î º¹ÀâÇÑ URL ÀçÀÛ¼ºÀ» ÇÑ ÈÄ¿¡ + ±×·¯ÇÏ´Ù.

    +
    + +
    ÇØ°áÃ¥:
    + +
    +

    ÀÌ ¹Ì¹¦ÇÑ ¹®Á¦ÀÇ ÇØ°á¹æ¹ýÀº ¼­¹ö°¡ ÀÚµ¿À¸·Î ¸¶Áö¸· + ½½·¡½¬¸¦ Ãß°¡ÇÏ´Â °ÍÀÌ´Ù. ºê¶ó¿ìÀú°¡ ³ª¸ÓÁö ±×¸² µîÀ» + ¿Ã¹Ù·Î ¿äûÇÒ ¼ö ÀÖµµ·Ï, ¿ÜºÎ ¸®´ÙÀÌ·º¼ÇÀ» ÇØ¾ß ÇÑ´Ù. + ³»ºÎ ¸®´ÙÀÌ·º¼ÇÀ» ÇÑ´Ù¸é µð·ºÅ丮 ÆäÀÌÁö¿¡¸¸ µ¿ÀÛÇÏ¿© + ÀÌ ÆäÀÌÁö°¡ »ó´ë URL·Î Æ÷ÇÔÇÏ´Â ±×¸²À» ºê¶ó¿ìÀú°¡ + ¿äûÇÒ¶§ ãÀ» ¼ö ¾ø´Ù. ¿¹¸¦ µé¾î, ¿ÜºÎ ¸®´ÙÀÌ·º¼ÇÀ» + »ç¿ëÇÏÁö ¾ÊÀ»¶§ /~quux/foo/index.html¿¡¼­ + image.gif¸¦ ¿äûÇϸé + /~quux/image.gif¸¦ ¿äûÇÏ°Ô µÈ´Ù!

    + +

    ±×·¡¼­ À̸¦ ÇØ°áÇϱâÀ§ÇØ ´ÙÀ½°ú °°ÀÌ ¼³Á¤ÇÑ´Ù:

    + +
    +RewriteEngine  on
    +RewriteBase    /~quux/
    +RewriteRule    ^foo$  foo/  [R]
    +
    + +

    Ȩµð·ºÅ丮ÀÇ ÃÖ»óÀ§ .htaccess ÆÄÀÏ¿¡ + ´ÙÀ½°ú °°ÀÌ ¼³Á¤ÇÒ ¼öµµ ÀÖ´Ù. ±×·¯³ª ó¸®Çϴµ¥ ºÎ´ãÀÌ + µÈ´Ù.

    + +
    +RewriteEngine  on
    +RewriteBase    /~quux/
    +RewriteCond    %{REQUEST_FILENAME}  -d
    +RewriteRule    ^(.+[^/])$           $1/  [R]
    +
    +
    +
    + + + +

    ÀÏ°üµÈ URL ±¸Á¶·Î ¸¸µç À¥Å¬·¯½ºÅÍ

    + + + +
    +
    »óȲ¼³¸í:
    + +
    +

    ÀÎÆ®¶ó³Ý À¥¼­¹ö±ºÀÇ ¸ðµç À¥¼­¹ö¿¡ µ¿ÀÏÇÏ°í ÀÏ°üµÈ + URL ±¸Á¶¸¦ ¸¸µé°í ½Í´Ù. Áï, ¸ðµç (Á¤ÀÇ»ó ¼­¹ö¿¡ ¼ÓÇÏ¿© + ¼­¹ö¿¡ ÀÇÁ¸ÀûÀÎ!) URLÀ» ¼­¹ö µ¶¸³ÀûÀ¸·Î ¸¸µç´Ù! + À¥ À̸§°ø°£¿¡ ¼­¹öµ¶¸³ÀûÀÎ µ¿ÀÏÇÑ ±¸Á¶¸¦ ºÎ¿©ÇØ¾ß ÇÑ´Ù: + URLÀº ½ÇÁ¦ ¼­¹ö¸¦ ÁöĪÇÏ¸é ¾ÈµÈ´Ù. ¼­¹ö±ºÀÌ ÀÚµ¿À¸·Î + ½ÇÁ¦ ¼­¹ö·Î À¯µµÇÑ´Ù.

    +
    + +
    ÇØ°áÃ¥:
    + +
    +

    ¸ÕÀú »ç¿ëÀÚ, ±×·ì, µ¶¸³Ã¼ÀÇ À§Ä¡ Á¤º¸¸¦ ÀúÀåÇÑ + (ºÐ»êµÈ) ¿ÜºÎ¸Ê¿¡ ½ÇÁ¦ ¼­¹ö Á¤º¸¸¦ ¾ò¾î¿Â´Ù. ¿ÜºÎ¸ÊÀº + ´ÙÀ½°ú °°Àº Çü½ÄÀÌ´Ù

    + +
    +user1  server_of_user1
    +user2  server_of_user2
    +:      :
    +
    + +

    ¿ì¸®´Â ÀÌ Á¤º¸¸¦ °¢°¢ map.xxx-to-host + ÆÄÀÏ¿¡ ÀúÀåÇß´Ù. ´ÙÀ½À¸·Î ¸ðµç ¼­¹ö¿¡¼­ URLÀÌ ¼­¹ö¿¡ + ¾ø´Ù¸é ´ÙÀ½°ú °°Àº URLÀ»,

    + +
    +/u/user/anypath
    +/g/group/anypath
    +/e/entity/anypath
    +
    + +

    ´ÙÀ½°ú °°ÀÌ ¸®´ÙÀÌ·º¼ÇÇÑ´Ù

    + +
    +http://physical-host/u/user/anypath
    +http://physical-host/g/group/anypath
    +http://physical-host/e/entity/anypath
    +
    + +

    ¾Æ·¡ ±ÔÄ¢Àº ¸ÊÆÄÀÏÀ» »ç¿ëÇÏ¿© ÀÌ ÀÛ¾÷À» ÇÑ´Ù (server0Àº + ¸Ê¿¡ Ç׸ñÀÌ ¾ø´Â °æ¿ì »ç¿ëÇÒ ±âº»¼­¹ö¶ó°í °¡Á¤ÇÑ´Ù):

    + +
    +RewriteEngine on
    +
    +RewriteMap      user-to-host   txt:/path/to/map.user-to-host
    +RewriteMap     group-to-host   txt:/path/to/map.group-to-host
    +RewriteMap    entity-to-host   txt:/path/to/map.entity-to-host
    +
    +RewriteRule   ^/u/([^/]+)/?(.*)   http://${user-to-host:$1|server0}/u/$1/$2
    +RewriteRule   ^/g/([^/]+)/?(.*)  http://${group-to-host:$1|server0}/g/$1/$2
    +RewriteRule   ^/e/([^/]+)/?(.*) http://${entity-to-host:$1|server0}/e/$1/$2
    +
    +RewriteRule   ^/([uge])/([^/]+)/?$          /$1/$2/.www/
    +RewriteRule   ^/([uge])/([^/]+)/([^.]+.+)   /$1/$2/.www/$3\
    +
    +
    +
    + + + +

    Ȩµð·ºÅ丮¸¦ ´Ù¸¥ À¥¼­¹ö·Î ÀÌÀü

    + + + +
    +
    »óȲ¼³¸í:
    + +
    +

    ¸¹Àº À¥°ü¸®ÀÚ´Â À¥¼­¹öÀÇ ¸ðµç Ȩµð·ºÅ丮¸¦ ´Ù¸¥ + À¥¼­¹ö·Î ÀÌÀüÇÑ °æ¿ì ÇØ°áÃ¥À» ¹°¾îº»´Ù. ÀÌ ¹æ¹ýÀº + ÀÌÀü ¼­¹ö¸¦ ´ëüÇÒ »õ·Î¿î ¼­¹ö¸¦ ±¸¼ºÇϴµ¥ ½Ã°£ÀÌ + °É¸®´Â °æ¿ì¿¡ ÇÊ¿äÇÏ´Ù.

    +
    + +
    ÇØ°áÃ¥:
    + +
    +

    mod_rewrite¸¦ »ç¿ëÇÏ¸é °£´ÜÇÏ´Ù. + ÀÌÀü À¥¼­¹ö´Â ¸ðµç /~user/anypath URLÀ» + http://newserver/~user/anypath·Î + ¸®´ÙÀÌ·º¼ÇÇÏ¸é µÈ´Ù.

    + +
    +RewriteEngine on
    +RewriteRule   ^/~(.+)  http://newserver/~$1  [R,L]
    +
    +
    +
    + + + +

    Ȩµð·ºÅ丮 ±¸Á¶ ¸¸µé±â

    + + + +
    +
    »óȲ¼³¸í:
    + +
    +

    »ç¿ëÀÚ°¡ ¼öõ¸íÀÎ »çÀÌÆ®´Â º¸Åë Ȩµð·ºÅ丮 ±¸Á¶¸¦ + ¸¸µç´Ù. Áï, ¿¹¸¦ µé¾î À̸§ÀÌ »ç¿ëÀÚ¸íÀÇ Ã¹¹ø° ¹®ÀÚÀÎ + ÇÏÀ§µð·ºÅ丮¿¡ Ȩµð·ºÅ丮¸¦ µÐ´Ù. ±×·¡¼­, + /~foo/anypath´Â + /home/f/foo/.www/anypathÀÌ°í, + /~bar/anypath´Â + /home/b/bar/.www/anypathÀÌ´Ù.

    +
    + +
    ÇØ°áÃ¥:
    + +
    +

    ¹°°áÇ¥½Ã°¡ ÀÖ´Â URLÀ» À§¿Í °°Àº ±¸Á¶·Î º¯È¯ÇϱâÀ§ÇØ + ´ÙÀ½ ±ÔÄ¢À» »ç¿ëÇÑ´Ù.

    + +
    +RewriteEngine on
    +RewriteRule   ^/~(([a-z])[a-z0-9]+)(.*)  /home/$2/$1/.www$3
    +
    +
    +
    + + + +

    ÆÄÀϽýºÅÛ À籸¼º

    + + + +
    +
    »óȲ¼³¸í:
    + +
    +

    ÀÌ ¿¹´Â ½Ç·Î ÇϵåÄÚ¾îÀûÀÌ´Ù: µð·ºÅ丮º° + RewriteRules¸¦ ¸Å¿ì ¸¹ÀÌ »ç¿ëÇÏ¿© ÀÚ·á + ÀÚü´Â ±×´ë·Î µÐü·Î À¥¿¡ ÀڷḦ ÀÚ¿¬½º·´°Ô ºê¶ó¿ì¡Çϵµ·Ï + ÇÑ´Ù. ¹è°æ: ³ª´Â 1992³â ºÎÅÍ ÀÚÀ¯·Ó°Ô »ç¿ëÇÒ ¼ö ÀÖ´Â + À¯´Ð½º ¼ÒÇÁÆ®¿þ¾îµéÀ» net.sw¿¡ + ¸ð¾ÆµÎ°í ÀÖ¾ú´Ù. ÀÌ´Â ³»°¡ ÄÄÇ»ÅÍ°úÇÐÀ» °øºÎÇϸ鼭 + ¿©·¯Çص¿¾È ¿©°¡½Ã°£¿¡ ½Ã½ºÅÛ °ü¸®ÀÚ¿Í ³×Æ®¿÷ °ü¸®ÀÚ¸¦ + ÇؿԱ⶧¹®¿¡ ³» Ãë¹ÌÀÌÀÚ ÀÏÀÌ´Ù. ¸ÅÁÖ¸¶´Ù »õ·Î ¼ÒÇÁÆ®¿þ¾î°¡ + Ãß°¡µÉ ¶§¸¶´Ù µð·ºÅ丮¸¦ ±í°Ô ¸¸µé¾î¿Ô´Ù:

    + +
    +drwxrwxr-x   2 netsw  users    512 Aug  3 18:39 Audio/
    +drwxrwxr-x   2 netsw  users    512 Jul  9 14:37 Benchmark/
    +drwxrwxr-x  12 netsw  users    512 Jul  9 00:34 Crypto/
    +drwxrwxr-x   5 netsw  users    512 Jul  9 00:41 Database/
    +drwxrwxr-x   4 netsw  users    512 Jul 30 19:25 Dicts/
    +drwxrwxr-x  10 netsw  users    512 Jul  9 01:54 Graphic/
    +drwxrwxr-x   5 netsw  users    512 Jul  9 01:58 Hackers/
    +drwxrwxr-x   8 netsw  users    512 Jul  9 03:19 InfoSys/
    +drwxrwxr-x   3 netsw  users    512 Jul  9 03:21 Math/
    +drwxrwxr-x   3 netsw  users    512 Jul  9 03:24 Misc/
    +drwxrwxr-x   9 netsw  users    512 Aug  1 16:33 Network/
    +drwxrwxr-x   2 netsw  users    512 Jul  9 05:53 Office/
    +drwxrwxr-x   7 netsw  users    512 Jul  9 09:24 SoftEng/
    +drwxrwxr-x   7 netsw  users    512 Jul  9 12:17 System/
    +drwxrwxr-x  12 netsw  users    512 Aug  3 20:15 Typesetting/
    +drwxrwxr-x  10 netsw  users    512 Jul  9 14:08 X11/
    +
    + +

    1996³â 7¿ù ÀÌ ÀúÀå¼Ò¸¦ ¸ÚÀÖ´Â À¥ ÀÎÅÍÆäÀ̽º¸¦ ÅëÇØ + ¼¼»ó¿¡ °ø°³Çϱâ·Î °áÁ¤ÇÞ´Ù. "¸ÚÀÖ´Ù"´Â ¸»Àº, ÃÖ»óÀ§ + µð·ºÅ丮¿¡ CGI ½ºÅ©¸³Æ®¸¦ µÎÁö ¾Ê°íµµ, ÀúÀå¼Ò °èÃþ±¸Á¶¸¦ + Á÷Á¢ ºê¶ó¿ìÁúÇÏ±æ ¹Ù¶õ´Ù´Â ¶æÀÌ´Ù. ¿Ö? ÀúÀå¼Ò¸¦ ³ªÁß¿¡ + FTP·Îµµ Á¢±ÙÇÒ ¼ö ÀÖµµ·Ï ¸¸µé ¿¹Á¤ÀÌ¿´±â¶§¹®¿¡ À¥À̳ª + CGI¿Í °ü·ÃµÈ ³»¿ëÀ» °°ÀÌ µÎ±â ½È¾ú´Ù.

    +
    + +
    ÇØ°áÃ¥:
    + +
    +

    ÇØ°áÃ¥Àº µÎ ºÎºÐÀ¸·Î ³ª´¶´Ù: ¸ÕÀú µð·ºÅ丮 ¼öÁØ¿¡¼­ + ÇÊ¿äÇÑ ¸ðµç ÆäÀÌÁö¸¦ µ¿ÀûÀ¸·Î ¸¸µå´Â CGI ½ºÅ©¸³Æ®°¡ + ÇÊ¿äÇÏ´Ù. ³ª´Â ÀÌ ½ºÅ©¸³Æ®µéÀ» ´ÙÀ½°ú °°ÀÌ + /e/netsw/.www/¿¡ µÎ¾ú´Ù:

    + +
    +-rw-r--r--   1 netsw  users    1318 Aug  1 18:10 .wwwacl
    +drwxr-xr-x  18 netsw  users     512 Aug  5 15:51 DATA/
    +-rw-rw-rw-   1 netsw  users  372982 Aug  5 16:35 LOGFILE
    +-rw-r--r--   1 netsw  users     659 Aug  4 09:27 TODO
    +-rw-r--r--   1 netsw  users    5697 Aug  1 18:01 netsw-about.html
    +-rwxr-xr-x   1 netsw  users     579 Aug  2 10:33 netsw-access.pl
    +-rwxr-xr-x   1 netsw  users    1532 Aug  1 17:35 netsw-changes.cgi
    +-rwxr-xr-x   1 netsw  users    2866 Aug  5 14:49 netsw-home.cgi
    +drwxr-xr-x   2 netsw  users     512 Jul  8 23:47 netsw-img/
    +-rwxr-xr-x   1 netsw  users   24050 Aug  5 15:49 netsw-lsdir.cgi
    +-rwxr-xr-x   1 netsw  users    1589 Aug  3 18:43 netsw-search.cgi
    +-rwxr-xr-x   1 netsw  users    1885 Aug  1 17:41 netsw-tree.cgi
    +-rw-r--r--   1 netsw  users     234 Jul 30 16:35 netsw-unlimit.lst
    +
    + +

    DATA/ ÇÏÀ§µð·ºÅ丮¿¡ À§¿¡¼­ ¸»ÇÑ ÀúÀå¼Ò°¡ + ÀÖ´Ù. ½ÇÁ¦ net.swÀÇ ³»¿ëÀº º¸Åë + rdist¸¦ »ç¿ëÇÏ¿© ÀÚµ¿À¸·Î °¡Á®¿Â´Ù. µÎ¹ø° + ºÎºÐÀÌ ³²¾Ò´Ù: ¾î¶»°Ô ÀÌ µÎ ±¸Á¶¸¦ ÇϳªÀÇ ÀÚ¿¬½º·¯¿î + URL ±¸Á¶·Î ¿¬°áÇϴ°¡? »ç¿ëÀÚ¿¡°Ô DATA/ + µð·ºÅ丮¸¦ °¨Ãß°í, URL¸¶´Ù ÀûÀýÇÑ CGI ½ºÅ©¸³Æ®¸¦ ½ÇÇàÇÏ°í + ½Í´Ù. ÇØ°áÃ¥Àº ´ÙÀ½°ú °°´Ù: ¸ÕÀú ¼­¹öÀÇ DocumentRoot¿¡¼­ °ø°³µÈ + URL /net.sw/¸¦ ³»ºÎ °æ·Î /e/netsw·Î + ÀçÀÛ¼ºÇϱâÀ§ÇØ µð·ºÅ丮º° ¼³Á¤ÆÄÀÏ¿¡ ´ÙÀ½°ú °°ÀÌ ¼³Á¤ÇÑ´Ù:

    + +
    +RewriteRule  ^net.sw$       net.sw/        [R]
    +RewriteRule  ^net.sw/(.*)$  e/netsw/$1
    +
    + +

    ù¹ø° ±ÔÄ¢Àº ¸¶Áö¸·¿¡ ½½·¡½¬°¡ ¾ø´Â ¿äûÀ» À§Çؼ­ + »ç¿ëÇß´Ù! µÎ¹ø° ±ÔÄ¢ÀÌ ½ÇÁ¦ ÀÛ¾÷À» ÇÑ´Ù. ±×¸®°í µð·ºÅ丮º° + ¼³Á¤ÆÄÀÏ /e/netsw/.www/.wwwacl¿¡ °áÁ¤ÀûÀÎ + ¼³Á¤ÀÌ ³ª¿Â´Ù:

    + +
    +Options       ExecCGI FollowSymLinks Includes MultiViews
    +
    +RewriteEngine on
    +
    +#  ¾Õ ºÎºÐÀÌ /net.sw/ ·Î Á¢±ÙÇÑ´Ù
    +RewriteBase   /net.sw/
    +
    +#  ¸ÕÀú ÃÖ»óÀ§ µð·ºÅ丮¸¦
    +#  cgi ½ºÅ©¸³Æ®·Î ÀçÀÛ¼ºÇÑ´Ù
    +RewriteRule   ^$                       netsw-home.cgi     [L]
    +RewriteRule   ^index\.html$            netsw-home.cgi     [L]
    +
    +#  ºê¶ó¿ìÀú°¡ µð·ºÅ丮º° ÆäÀÌÁö¸¦ ¿äûÇÑ °æ¿ì
    +#  ÇÏÀ§µð·ºÅ丮¸¦ ÃßÃâÇÑ´Ù
    +RewriteRule   ^.+/(netsw-[^/]+/.+)$    $1                 [L]
    +
    +#  ÀÌÁ¦ ÀçÀÛ¼ºÀ» ¸¶Ä£´Ù
    +RewriteRule   ^netsw-home\.cgi.*       -                  [L]
    +RewriteRule   ^netsw-changes\.cgi.*    -                  [L]
    +RewriteRule   ^netsw-search\.cgi.*     -                  [L]
    +RewriteRule   ^netsw-tree\.cgi$        -                  [L]
    +RewriteRule   ^netsw-about\.html$      -                  [L]
    +RewriteRule   ^netsw-img/.*$           -                  [L]
    +
    +#  ´Ù¸¥ cgi ½ºÅ©¸³Æ®°¡ ó¸®ÇÒ
    +#  ÇÏÀ§µð·ºÅ丮°¡ ³²¾Ò´Ù
    +RewriteRule   !^netsw-lsdir\.cgi.*     -                  [C]
    +RewriteRule   (.*)                     netsw-lsdir.cgi/$1
    +
    + +

    Çؼ®À» À§ÇÑ ÈùÆ®:

    + +
      +
    1. ³×¹ø° ºÎºÐ¿¡¼­ ´ëü Çʵå('-')°¡ + ¾ø°í L (last) Ç÷¡±×°¡ ÀÖÀ½À» ÁÖ¸ñÇ϶ó
    2. + +
    3. ¸¶Áö¸· ºÎºÐ¿¡¼­ ù¹ø° ±ÔÄ¢¿¡ ! + (not) ¹®ÀÚ¿Í C (chain) Ç÷¡±×¸¦ ÁÖ¸ñÇ϶ó
    4. + +
    5. ¸¶Áö¸· ±ÔÄ¢¿¡¼­ ±âŸ ÇØ´çÇÏÁö ¾Ê´Â ¸ðµç °æ¿ì¸¦ + Àâ¾Æ³»´Â ÆÐÅÏÀ» ÁÖ¸ñÇ϶ó
    6. +
    +
    +
    + + + +

    NCSA imagemapÀ» ¾ÆÆÄÄ¡ mod_imapÀ¸·Î

    + + + +
    +
    »óȲ¼³¸í:
    + +
    +

    »ç¶÷µéÀº NCSA À¥¼­¹ö¿¡¼­ Çö´ëÀûÀÎ ¾ÆÆÄÄ¡ À¥¼­¹ö·Î + ÀÚ¿¬½º·´°Ô ¿Å°Ü°¡±æ ¹Ù¶õ´Ù. ±×·¡¼­ ¿À·¡µÈ NCSA + imagemap ÇÁ·Î±×·¥À» »ç¿ëÇÑ ÆäÀÌÁö¸¦ Çö´ëÀûÀÎ + ¾ÆÆÄÄ¡ mod_imap·Î ó¸®ÇÏ±æ ¹Ù¶õ´Ù. + ¹®Á¦´Â imagemap ÇÁ·Î±×·¥À» + /cgi-bin/imagemap/path/to/page.map°ú + °°ÀÌ ÂüÁ¶ÇÏ´Â ÇÏÀÌÆÛ¸µÅ©°¡ ¸¹´Ù´Â °ÍÀÌ´Ù. ¾ÆÆÄÄ¡´Â + /path/to/page.map°ú °°Àº ¿äûÀ» ¹Þ¾Æ¾ß + ÇÑ´Ù.

    +
    + +
    ÇØ°áÃ¥:
    + +
    +

    ¸ðµç ¿äû¿¡¼­ ¾ÕºÎºÐÀ» µ¿ÀûÀ¸·Î Á¦°ÅÇÏ´Â Àü¿ª ±ÔÄ¢À» + »ç¿ëÇÑ´Ù:

    + +
    +RewriteEngine  on
    +RewriteRule    ^/cgi-bin/imagemap(.*)  $1  [PT]
    +
    +
    +
    + + + +

    ¿©·¯ µð·ºÅ丮¿¡¼­ ÆäÀÌÁö °Ë»ö

    + + + +
    +
    »óȲ¼³¸í:
    + +
    +

    °¡²û À¥¼­¹ö°¡ ¿©·¯ µð·ºÅ丮¿¡¼­ ÆÄÀÏÀ» ã¾Æ¾ß ÇÒ + ¶§°¡ ÀÖ´Ù. ÀÌ °æ¿ì MultiViews³ª ´Ù¸¥ ¹æ¹ýÀº µµ¿òÀÌ + ¾ÈµÈ´Ù.

    +
    + +
    ÇØ°áÃ¥:
    + +
    +

    ¿©·¯ µð·ºÅ丮¿¡¼­ ÆÄÀÏÀ» ã´Â ±ÔÄ¢À» Á÷Á¢ ÇÁ·Î±×·¥ÇÑ´Ù.

    + +
    +RewriteEngine on
    +
    +#   ¸ÕÀú custom/¿¡¼­ ã±æ ½ÃµµÇÏ°í...
    +#   ...ãÀ¸¸é ³¡!
    +RewriteCond         /your/docroot/dir1/%{REQUEST_FILENAME}  -f
    +RewriteRule  ^(.+)  /your/docroot/dir1/$1  [L]
    +
    +#   µÎ¹ø°·Î pub/¿¡¼­ ã±æ ½ÃµµÇÑ´Ù...
    +#   ...ãÀ¸¸é ³¡!
    +RewriteCond         /your/docroot/dir2/%{REQUEST_FILENAME}  -f
    +RewriteRule  ^(.+)  /your/docroot/dir2/$1  [L]
    +
    +#   ¸øãÀ¸¸é ´Ù¸¥ Alias³ª ScriptAlias Áö½Ã¾î µîÀ¸·Î ÁøÇàÇÑ´Ù.
    +RewriteRule   ^(.+)  -  [PT]
    +
    +
    +
    + + + +

    URL¿¡ µû¶ó ȯ°æº¯¼ö¸¦ ¼³Á¤ÇÑ´Ù

    + + + +
    +
    »óȲ¼³¸í:
    + +
    +

    ¿äûµé°£¿¡ »óÅÂÁ¤º¸¸¦ À¯ÁöÇϱâÀ§ÇØ URL¿¡ Á¤º¸¸¦ + ÀÎÄÚµùÇÏ´Â ¹æ¹ýµµ ÀÖ´Ù. ±×·¯³ª ´ÜÁö ÀÌ Á¤º¸¸¦ Á¦°ÅÇϱâÀ§ÇØ + ¸ðµç ÆäÀÌÁö¿¡ CGI wrapper¸¦ »ç¿ëÇÏ°í ½ÍÁö ¾Ê´Ù.

    +
    + +
    ÇØ°áÃ¥:
    + +
    +

    ÀçÀÛ¼º ±ÔÄ¢À» »ç¿ëÇÏ¿© »óÅÂÁ¤º¸¸¦ ÃßÃâÇÏ°í, ÃßÃâÇÑ + Á¤º¸¸¦ ³ªÁß¿¡ XSSI³ª CGI¿¡¼­ »ç¿ëÇϱâÀ§ÇØ È¯°æº¯¼ö¿¡ + ÀúÀåÇÑ´Ù. ±×·¡¼­ URL /foo/S=java/bar/´Â + /foo/bar/·Î º¯È¯µÇ°í STATUS¶ó´Â + ȯ°æº¯¼ö °ªÀ» "java"·Î ¼³Á¤ÇÑ´Ù.

    + +
    +RewriteEngine on
    +RewriteRule   ^(.*)/S=([^/]+)/(.*)    $1/$3 [E=STATUS:$2]
    +
    +
    +
    + + + +

    °¡»ó »ç¿ëÀÚ È£½ºÆ®

    + + + +
    +
    »óȲ¼³¸í:
    + +
    +

    °¡»óÈ£½ºÆ®¸¦ »ç¿ëÇÏÁö ¾Ê°í °°Àº ÄÄÇ»ÅÍ·Î DNS A + ·¹Äڵ带 ¼³Á¤ÇÏ¿© + www.username.host.domain.comÀ» + »ç¿ëÀÚÀÇ È¨ÆäÀÌÁö·Î Á¦°øÇÏ°í ½Í´Ù.

    +
    + +
    ÇØ°áÃ¥:
    + +
    +

    HTTP/1.0 ¿äûÀÇ °æ¿ì ¹æ¹ýÀÌ ¾øÁö¸¸, Host: HTTP + Çì´õ¸¦ Æ÷ÇÔÇÑ HTTP/1.1 ¿äûÀº ´ÙÀ½ ±ÔÄ¢À» »ç¿ëÇÏ¿© + ³»ºÎÀûÀ¸·Î http://www.username.host.com/anypath¸¦ + /home/username/anypath·Î ÀçÀÛ¼ºÇÒ ¼ö + ÀÖ´Ù:

    + +
    +RewriteEngine on
    +RewriteCond   %{HTTP_HOST}                 ^www\.[^.]+\.host\.com$
    +RewriteRule   ^(.+)                        %{HTTP_HOST}$1          [C]
    +RewriteRule   ^www\.([^.]+)\.host\.com(.*) /home/$1$2
    +
    +
    +
    + + + +

    Ȩµð·ºÅ丮¸¦ ¿ÜºÎ ¼­¹ö·Î ¸®´ÙÀÌ·º¼Ç

    + + + +
    +
    »óȲ¼³¸í:
    + +
    +

    Áö¿ª µµ¸ÞÀÎ ourdomain.com ¹Û¿¡¼­ ¿äûÀÌ + µé¾î¿À¸é Ȩµð·ºÅ丮 URLÀ» ´Ù¸¥ À¥¼­¹ö + www.somewhere.comÀ¸·Î ¸®´Ù¸®·º¼ÇÇϱæ + ¹Ù¶õ´Ù. Á¾Á¾ °¡»óÈ£½ºÆ® »ç¿ëÀå¼Ò¿¡¼­ »ç¿ëÇÑ´Ù.

    +
    + +
    ÇØ°áÃ¥:
    + +
    +

    ÀçÀÛ¼º Á¶°ÇÀ» »ç¿ëÇÏ¸é µÈ´Ù:

    + +
    +RewriteEngine on
    +RewriteCond   %{REMOTE_HOST}  !^.+\.ourdomain\.com$
    +RewriteRule   ^(/~.+)         http://www.somewhere.com/$1 [R,L]
    +
    +
    +
    + + + +

    ½ÇÆÐÇÑ URLÀ» ´Ù¸¥ À¥¼­¹ö·Î ¸®´ÙÀÌ·º¼Ç

    + + + +
    +
    »óȲ¼³¸í:
    + +
    +

    URL ÀçÀÛ¼º¿¡ ´ëÇؼ­ À¥¼­¹ö A¿¡ ÇØ´ç ÆÄÀÏÀÌ ¾ø´Â + °æ¿ì À¥¼­¹ö B·Î ¿äûÀ» ¸®´ÙÀÌ·º¼ÇÇÏ´Â ¹æ¹ýÀ» ÀÚÁÖ + ¹°¾îº»´Ù. º¸Åë Perl·Î ÀÛ¼ºÇÑ ErrorDocument CGI ½ºÅ©¸³Æ®¸¦ + »ç¿ëÇÏÁö¸¸, mod_rewrite¸¦ »ç¿ëÇÏ´Â + ¹æ¹ýµµ ÀÖ´Ù. ±×·¯³ª ¼º´ÉÀº ErrorDocument CGI ½ºÅ©¸³Æ®º¸´Ù + ¶³¾îÁüÀ» ¸í½ÉÇ϶ó!

    +
    + +
    ÇØ°áÃ¥:
    + +
    +

    ù¹ø° ¹æ¹ýÀº ºü¸£Áö¸¸ À¯¿¬¼ºÀÌ ¶³¾îÁö°í ¿ÏÀüÇÏÁö + ¾Ê´Ù:

    + +
    +RewriteEngine on
    +RewriteCond   /your/docroot/%{REQUEST_FILENAME} !-f
    +RewriteRule   ^(.+)                             http://webserverB.dom/$1
    +
    + +

    ÀÌ ¹æ¹ýÀÇ ´ÜÁ¡Àº DocumentRoot ¾È¿¡ ÀÖ´Â ÆäÀÌÁö¸¸ + °¡´ÉÇÏ´Ù´Â Á¡ÀÌ´Ù. (¿¹¸¦ µé¾î Ȩµð·ºÅ丮 µîÀ» À§ÇØ) + Á¶°ÇÀ» Ãß°¡ÇÒ ¼ö ÀÖÁö¸¸, ´õ ÁÁÀº ¹æ¹ýÀÌ ÀÖ´Ù:

    + +
    +RewriteEngine on
    +RewriteCond   %{REQUEST_URI} !-U
    +RewriteRule   ^(.+)          http://webserverB.dom/$1
    +
    + +

    mod_rewriteÀÇ URL Àü¹æÂüÁ¶(look-ahead)¸¦ + »ç¿ëÇÑ´Ù. ±×·¡¼­ ¸ðµç URL¿¡ µ¿ÀÛÇÏ°í ¾ÈÀüÇÏ´Ù. ±×·¯³ª + ¸ðµç ¿äû¸¶´Ù ³»ºÎ ÇÏÀ§¿äûÀ» Çѹø ´õ Çϱ⶧¹®¿¡ À¥¼­¹ö + ¼º´É¿¡ ¾Ç¿µÇâÀ» ÁØ´Ù. ±×·¡¼­ °­·ÂÇÑ CPU¿¡¼­ À¥¼­¹ö¸¦ + ½ÇÇàÇÑ´Ù¸é »ç¿ëÇ϶ó. ÄÄÇ»ÅÍ°¡ ´À¸®´Ù¸é ù¹ø° ¹æ¹ýÀ̳ª + ´õ ³ªÀº ErrorDocument + CGI ½ºÅ©¸³Æ®¸¦ »ç¿ëÇ϶ó.

    +
    +
    + + + +

    È®Àå ¸®´ÙÀÌ·º¼Ç

    + + + +
    +
    »óȲ¼³¸í:
    + +
    +

    °¡²û ¸®´ÙÀÌ·º¼ÇÇÏ´Â URLÀ» ´õ Á¶ÀýÇÒ ÇÊ¿ä°¡ ÀÖ´Ù. + ¾ÆÆÄÄ¡ ³»ºÎ URL escape ÇÔ¼ö´Â "url#anchor" + °°Àº URLÀÇ anchorµµ escapeÇÑ´Ù. ¾ÆÆÄÄ¡ÀÇ + uri_escape() ÇÔ¼ö´Â ¿ì¹°Á¤ÀÚ(#)µµ °°ÀÌ + escapeÇϹǷΠ»ç¿ëÇÒ ¼ö ¾ø´Ù. ±×·¯¸é ¾î¶»°Ô ÀÌ·± URL·Î + ¸®´ÙÀÌ·º¼ÇÇÒ ¼ö ÀÖ³ª?

    +
    + +
    ÇØ°áÃ¥:
    + +
    +

    Á÷Á¢ ¸®´ÙÀÌ·º¼ÇÇÏ´Â NPH-CGI ½ºÅ©¸³Æ®¸¦ »ç¿ëÇÑ ÇØ°áÃ¥ÀÌ + ÇÊ¿äÇÏ´Ù. escape¸¦ ÇÏÁö ¾Ê±â¶§¹®ÀÌ´Ù (NPH=non-parseable + headers). ¸ÕÀú ´ÙÀ½ ¼­¹ö¼³Á¤À» ÇÏ¿© (ÀçÀÛ¼º ±ÔÄ¢ÀÇ + ³¡ºÎºÐ¿¡ »ç¿ëÇØ¾ß ÇÑ´Ù) »õ·Î¿î URL scheme + xredirect:¸¦ µµÀÔÇÑ´Ù:

    + +
    +RewriteRule ^xredirect:(.+) /path/to/nph-xredirect.cgi/$1 \
    +            [T=application/x-httpd-cgi,L]
    +
    + +

    ±×·¯¸é xredirect:·Î ½ÃÀÛÇÏ´Â ¸ðµç URLÀº + nph-xredirect.cgi ÇÁ·Î±×·¥À» ÅëÇÏ°Ô µÈ´Ù. + ÇÁ·Î±×·¥Àº ´ÙÀ½°ú °°´Ù:

    + +
    +#!/path/to/perl
    +##
    +##  nph-xredirect.cgi -- NPH/CGI script for extended redirects
    +##  Copyright (c) 1997 Ralf S. Engelschall, All Rights Reserved.
    +##
    +
    +$| = 1;
    +$url = $ENV{'PATH_INFO'};
    +
    +print "HTTP/1.0 302 Moved Temporarily\n";
    +print "Server: $ENV{'SERVER_SOFTWARE'}\n";
    +print "Location: $url\n";
    +print "Content-type: text/html\n";
    +print "\n";
    +print "<html>\n";
    +print "<head>\n";
    +print "<title>302 Moved Temporarily (EXTENDED)</title>\n";
    +print "</head>\n";
    +print "<body>\n";
    +print "<h1>Moved Temporarily (EXTENDED)</h1>\n";
    +print "The document has moved <a HREF=\"$url\">here</a>.<p>\n";
    +print "</body>\n";
    +print "</html>\n";
    +
    +##EOF##
    +
    + +

    ±×·¯¸é mod_rewrite°¡ Á÷Á¢ ¹ÞÁö¸øÇÏ´Â + ¸ðµç URL schemeÀ¸·Î ¸®´ÙÀÌ·º¼ÇÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î, + ´ÙÀ½°ú °°ÀÌ news:newsgroupÀ¸·Î ¸®´ÙÀÌ·º¼ÇÇÒ + ¼ö ÀÖ´Ù

    + +
    +RewriteRule ^anyurl  xredirect:news:newsgroup
    +
    + +
    ÁÖÀÇ: À§ÀÇ Æ¯º°ÇÑ "Åë°ú" ±ÔÄ¢À» »ç¿ëÇÏ¿© + xredirect:¸¦ ¸¶Áö¸·¿¡ È®ÀåÇØ¾ß Çϱ⶧¹®¿¡ + ±ÔÄ¢¿¡ [R]À̳ª [R,L]À» »ç¿ëÇϸé + ¾ÈµÈ´Ù.
    +
    +
    + + + +

    ÀúÀå¼Ò Á¢±Ù Áß°è(multiplexer)

    + + + +
    +
    »óȲ¼³¸í:
    + +
    +

    http://www.perl.com/CPAN¿¡ + ÀÖ´Â ´ë´ÜÇÑ CPAN (Comprehensive Perl Archive Network)À» + ¾Æ´Â°¡? ÀÌ ÁÖ¼Ò´Â ¼¼°è¿¡ Èð¾îÁø ¿©·¯ CPAN ¹Ì·¯ FTP + ¼­¹öÁß Å¬¶óÀ̾ðÆ®¿¡ °¡±îÀÌ ÀÖ´Â ¼­¹ö·Î ¸®´ÙÀÌ·º¼ÇÇÑ´Ù. + À̸¦ FTP Á¢±Ù Áß°è ¼­ºñ½º¶ó°í ÇÑ´Ù. CPANÀº CGI ½ºÅ©¸³Æ®¸¦ + »ç¿ëÇÏÁö¸¸, mod_rewrite¸¦ »ç¿ëÇÏ¿© + ºñ½ÁÇÏ°Ô ¸¸µé ¼ö ÀÖÀ»±î?

    +
    + +
    ÇØ°áÃ¥:
    + +
    +

    ¸ÕÀú mod_rewrite 3.0.0 ¹öÀüºÎÅÍ + ¸®´ÙÀÌ·º¼Ç¿¡ "ftp:" schemeÀ» »ç¿ëÇÒ ¼ö + ÀÖ´Ù. ´ÙÀ½À¸·Î Ŭ¶óÀ̾ðÆ®ÀÇ ÃÖ»óÀ§ µµ¸ÞÀÎÀ» RewriteMap°ú °°ÀÌ + »ç¿ëÇÏ¿© À§Ä¡¸¦ ÃßÁ¤ÇÒ ¼ö ÀÖ´Ù. º¹ÀâÈ÷ ¿«ÀÎ ±ÔÄ¢¿¡¼­ + ÃÖ»óÀ§ µµ¸ÞÀÎÀ» Áß°è¸ÊÀÇ Å°·Î »ç¿ëÇÑ´Ù.

    + +
    +RewriteEngine on
    +RewriteMap    multiplex                txt:/path/to/map.cxan
    +RewriteRule   ^/CxAN/(.*)              %{REMOTE_HOST}::$1                 [C]
    +RewriteRule   ^.+\.([a-zA-Z]+)::(.*)$  ${multiplex:$1|ftp.default.dom}$2  [R,L]
    +
    + +
    +##
    +##  map.cxan -- Multiplexing Map for CxAN
    +##
    +
    +de        ftp://ftp.cxan.de/CxAN/
    +uk        ftp://ftp.cxan.uk/CxAN/
    +com       ftp://ftp.cxan.com/CxAN/
    + :
    +##EOF##
    +
    +
    +
    + + + +

    ½Ã°£¿¡ µû¸¥ ÀçÀÛ¼º

    + + + +
    +
    »óȲ¼³¸í:
    + +
    +

    ½Ã°£¿¡ µû¶ó ´Ù¸¥ ³»¿ëÀ» ¼­ºñ½ºÇÏ´Â °æ¿ì ¸¹Àº À¥°ü¸®ÀÚ´Â + Àá½Ã Ưº°ÇÑ ÆäÀÌÁö·Î ¸®´ÙÀÌ·º¼ÇÇϱâÀ§ÇØ CGI ½ºÅ©¸³Æ®¸¦ + »ç¿ëÇÑ´Ù. mod_rewrite·Î´Â ¾î¶»°Ô + ÇÒ ¼ö Àִ°¡?

    +
    + +
    ÇØ°áÃ¥:
    + +
    +

    ÀçÀÛ¼º Á¶°Ç¿¡¼­ »ç¿ëÇÒ ¼ö ÀÖ´Â ¿©·¯ TIME_xxx + º¯¼ö°¡ ÀÖ´Ù. º¯¼ö¿Í Ưº°ÇÑ »çÀü¼ø¼­ ºñ±³ + <STRING, >STRING, + =STRINGÀ» »ç¿ëÇÏ¿© ½Ã°£¿¡ µû¶ó ¸®´ÙÀÌ·º¼ÇÇÒ + ¼ö ÀÖ´Ù:

    + +
    +RewriteEngine on
    +RewriteCond   %{TIME_HOUR}%{TIME_MIN} >0700
    +RewriteCond   %{TIME_HOUR}%{TIME_MIN} <1900
    +RewriteRule   ^foo\.html$             foo.day.html
    +RewriteRule   ^foo\.html$             foo.night.html
    +
    + +

    URL foo.htmlÀ» ¿äûÇϸé + 07:00-19:00 µ¿¾È foo.day.html + ³»¿ëÀ» ¼­ºñ½ºÇÏ°í, ³ª¸ÓÁö ½Ã°£ µ¿¾È + foo.night.html ³»¿ëÀ» ¼­ºñ½ºÇÑ´Ù. ȨÆäÀÌÁö¿¡¼­ + »ç¿ëÇϱâ ÁÁÀº ±â´ÉÀÌ´Ù...

    +
    +
    + + + +

    YYYY¸¦ XXXX·Î ÀÌÀüÇÑ °æ¿ì ¿ªÈ£È¯

    + + + +
    +
    »óȲ¼³¸í:
    + +
    +

    ¿©·¯ .html ÆÄÀÏÀ» .phtml·Î + º¯È¯ÇÏ´Â µî document.YYYY¸¦ + document.XXXX·Î ÀÌÀüÇÑÈÄ ¿ªÈ£È¯(backward + compatibility) URLÀ» (°¡»óÀûÀ¸·Î Á¸ÀçÇÏ°Ô) ¸¸µé ¼ö + ÀÖ³ª?

    +
    + +
    ÇØ°áÃ¥:
    + +
    +

    À̸§À» ±âº»À̸§À¸·Î ÀçÀÛ¼ºÇÑÈÄ »õ·Î¿î È®ÀåÀÚ¸¦ + °¡Áø ÆÄÀÏÀÌ ÀÖ´ÂÁö °Ë»çÇÑ´Ù. ÀÖ´Ù¸é ±× ÆÄÀϸíÀ» »ç¿ëÇÏ°í, + ¾øÀ¸¸é URLÀ» ¿ø·¡ »óÅ·ΠÀçÀÛ¼ºÇÑ´Ù.

    + + +
    +#   ¹®¼­.html ÀÌ ¾ø°í
    +#   ¹®¼­.phtml ¸¸ ÀÖ´Â °æ¿ì
    +#   ¹®¼­.html À» ¹®¼­.phtml ·Î
    +#   ÀçÀÛ¼ºÇÏ´Â ¿ªÈ£È¯ ±ÔÄ¢
    +RewriteEngine on
    +RewriteBase   /~quux/
    +#   ±âº»À̸§À» ã°í, ã¾Ò´Ù´Â »ç½ÇÀ» ±â¾ïÇÑ´Ù
    +RewriteRule   ^(.*)\.html$              $1      [C,E=WasHTML:yes]
    +#   ÆÄÀÏÀÌ ÀÖ´Ù¸é ¹®¼­.phtml ·Î ÀçÀÛ¼ºÇÑ´Ù
    +RewriteCond   %{REQUEST_FILENAME}.phtml -f
    +RewriteRule   ^(.*)$ $1.phtml                   [S=1]
    +#   ¾Æ´Ï¸é ¾Õ¿¡¼­ ãÀº ±âº»À̸§À» µÇµ¹¸°´Ù
    +RewriteCond   %{ENV:WasHTML}            ^yes$
    +RewriteRule   ^(.*)$ $1.html
    +
    +
    +
    + + + +
    top
    +
    +

    ÄÁÅÙÃ÷ ´Ù·ç±â

    + + + +

    »õ·Î ÀÌÀü (°¨Ãß±â)

    + + + +
    +
    »óȲ¼³¸í:
    + +
    +

    ÃÖ±Ù foo.htmlÀ» bar.html·Î + º¯°æÇÏ°í ¿ªÈ£È¯¼ºÀ» À§ÇØ ÀÌÀü URLÀ» °è¼Ó Á¦°øÇÏ°í + ½Í´Ù°í °¡Á¤ÇÏÀÚ. »ç¿ëÀÚ´Â ÀÌÀü URLÀÌ º¯°æµÇ¾ú´Ù´Â + »ç½ÇÀ» ´«Ä¡Ã¤Áö ¸øÇÑ´Ù.

    +
    + +
    ÇØ°áÃ¥:
    + +
    +

    ´ÙÀ½ ±ÔÄ¢À¸·Î ÀÌÀü URLÀ» ³»ºÎÀûÀ¸·Î »õ·Î¿î URL·Î + ÀçÀÛ¼ºÇÑ´Ù:

    + +
    +RewriteEngine  on
    +RewriteBase    /~quux/
    +RewriteRule    ^foo\.html$  bar.html
    +
    +
    +
    + + + +

    »õ·Î ÀÌÀü (¾Ë¸®±â)

    + + + +
    +
    »óȲ¼³¸í:
    + +
    +

    ´Ù½Ã foo.htmlÀ» bar.html·Î + º¯°æÇÏ°í ¿ªÈ£È¯¼ºÀ» À§ÇØ ÀÌÀü URLÀ» °è¼Ó Á¦°øÇÏ°í + ½Í´Ù°í °¡Á¤ÇÏÀÚ. ±×·¯³ª ÀÌÁ¦´Â ÀÌÀü URLÀ» »ç¿ëÇϸé + »ç¿ëÀÚ¿¡°Ô »õ·Î¿î URLÀ» ÈùÆ®·Î ¾Ë·ÁÁØ´Ù. Áï, ºê¶ó¿ìÀú + ÁÖ¼ÒâÀÌ º¯ÇÑ´Ù.

    +
    + +
    ÇØ°áÃ¥:
    + +
    +

    »õ·Î¿î URL·Î HTTP ¸®´ÙÀÌ·º¼ÇÇÏ´Ù. ±×·¯¸é ºê¶ó¿ìÀú°¡ + »õ·Î¿î URL¸¦ º¸ÀÌ°í º¯°æ»ç½ÇÀ» »ç¿ëÀÚ°¡ ¾Ë°ÔµÈ´Ù:

    + +
    +RewriteEngine  on
    +RewriteBase    /~quux/
    +RewriteRule    ^foo\.html$  bar.html  [R]
    +
    +
    +
    + + + +

    ºê¶ó¿ìÀú¿¡ µû¸¥ ³»¿ë

    + + + +
    +
    »óȲ¼³¸í:
    + +
    +

    ÃÖ¼ÒÇÑ Áß¿äÇÑ ÃÖ»óÀ§ ÆäÀÌÁö´Â ºê¶ó¿ìÀú¿¡ ÃÖÀûÈ­µÈ + ³»¿ëÀ¸·Î ¼­ºñ½ºÇؾßÇÒ °æ¿ì°¡ ÀÖ´Ù. Áï, ÃֽŠNetscape + ºê¶ó¿ìÀú¿¡°Ô´Â ÃÖ»óÀÇ ¹öÀüÀ», Lynx ºê¶ó¿ìÀú¿¡°Ô´Â + ÃÖÀú ¹öÀüÀ», ³ª¸ÓÁö ºê¶ó¿ìÀú¿¡´Â Æò±ÕÀûÀÎ ¹öÀüÀ» + Á¦°øÇÑ´Ù.

    +
    + +
    ÇØ°áÃ¥:
    + +
    +

    ºê¶ó¿ìÀú°¡ ³»¿ëÇù»óÀ» À§ÇØ ÀÚ½ÅÀÇ Á¾·ù¿¡ ´ëÇÑ Á¤º¸¸¦ + Á¦°øÇÏÁö ¾Ê±â¶§¹®¿¡ ³»¿ëÇù»óÀ» »ç¿ëÇÒ ¼ö ¾ø´Ù. ´ë½Å + HTTP "User-Agent" Çì´õ¸¦ »ç¿ëÇÑ´Ù. ´ÙÀ½ ±ÔÄ¢Àº HTTP + "User-Agent" Çì´õ°¡ "Mozilla/3"À¸·Î ½ÃÀÛÇϸé + foo.html ÆäÀÌÁö¸¦ foo.NS.html·Î + ÀçÀÛ¼ºÇÏ°í ÀçÀÛ¼ºÀ» Áß´ÜÇÑ´Ù. ºê¶ó¿ìÀú°¡ "Lynx"³ª + "Mozilla" ¹öÀü 1 ȤÀº 2¶ó¸é URLÀº + foo.20.htmlÀÌ µÈ´Ù. ³ª¸ÓÁö ºê¶ó¿ìÀú´Â + foo.32.html ÆäÀÌÁö¸¦ ¹Þ´Â´Ù. ¾Æ·¡ ±ÔÄ¢ÀÌ + ÀÌ ÀÛ¾÷À» ÇÑ´Ù:

    + +
    +RewriteCond %{HTTP_USER_AGENT}  ^Mozilla/3.*
    +RewriteRule ^foo\.html$         foo.NS.html          [L]
    +
    +RewriteCond %{HTTP_USER_AGENT}  ^Lynx/.*         [OR]
    +RewriteCond %{HTTP_USER_AGENT}  ^Mozilla/[12].*
    +RewriteRule ^foo\.html$         foo.20.html          [L]
    +
    +RewriteRule ^foo\.html$         foo.32.html          [L]
    +
    +
    +
    + + + +

    µ¿Àû ¹Ì·¯

    + + + +
    +
    »óȲ¼³¸í:
    + +
    +

    ¿ÜºÎ È£½ºÆ®¿¡ ¿ì¸® »çÀÌÆ®·Î °¡Á®¿À°í ½ÍÀº ÁÁÀº + À¥ÆäÀÌÁö°¡ ÀÖ´Ù°í °¡Á¤ÇÏÀÚ. FTP ¼­¹öÀÇ °æ¿ì Á÷Á¢ ¿ÜºÎ + ÀÚ·áÀÇ Ãֽź¹»çº»À» À¯ÁöÇÏ´Â mirror ÇÁ·Î±×·¥À» + »ç¿ëÇÒ ¼ö ÀÖ°í, À¥¼­¹ö¶ó¸é HTTP·Î ºñ½ÁÇÑ ÀÛ¾÷À» ÇÏ´Â + webcopy ÇÁ·Î±×·¥À» »ç¿ëÇÒ ¼ö ÀÖ´Ù. ±×·¯³ª + µÎ ¹æ¹ý ¸ðµÎ ´ÜÁ¡ÀÌ ÀÖ´Ù: º¹»çº»Àº °¡²û¾¿ ÇÁ·Î±×·¥À» + ½ÇÇàÇØÁÙ ¶§¸¸ ÃÖ½ÅÆÇÀ¸·Î À¯ÁöµÈ´Ù. Á÷Á¢ ±¸¼ºÇؾßÇÏ´Â + Á¤ÀûÀÎ ¹Ì·¯°¡ ¾Æ´Ï¶ó¸é ÁÁ°Ú´Ù. ´ë½Å (¿ÜºÎ È£½ºÆ®¿¡¼­ + ÀÚ·á°¡ °»½ÅµÇ¸é) ÇÊ¿äÇÒ¶§ ÀÚµ¿À¸·Î ÀڷḦ °»½ÅÇÏ´Â + µ¿Àû ¹Ì·¯°¡ ÇÊ¿äÇÏ´Ù.

    +
    + +
    ÇØ°áÃ¥:
    + +
    +

    À̸¦ À§ÇØ Proxy Throughput ±â´ÉÀ» (Ç÷¡±× + [P]) »ç¿ëÇÏ¿© ¿ÜºÎ À¥ÆäÀÌÁö ȤÀº ¿ÜºÎ + À¥°ø°£ Àüü¸¦ ¿ì¸® À̸§°ø°£À¸·Î ´ëÀÀÇÑ´Ù:

    + +
    +RewriteEngine  on
    +RewriteBase    /~quux/
    +RewriteRule    ^hotsheet/(.*)$  http://www.tstimpreso.com/hotsheet/$1  [P]
    +
    + +
    +RewriteEngine  on
    +RewriteBase    /~quux/
    +RewriteRule    ^usa-news\.html$   http://www.quux-corp.com/news/index.html  [P]
    +
    +
    +
    + + + +

    µ¿Àû ¿ª¹Ì·¯

    + + + +
    +
    »óȲ¼³¸í:
    + +
    ...
    + +
    ÇØ°áÃ¥:
    + +
    +
    +RewriteEngine on
    +RewriteCond   /mirror/of/remotesite/$1           -U
    +RewriteRule   ^http://www\.remotesite\.com/(.*)$ /mirror/of/remotesite/$1
    +
    +
    +
    + + + +

    ¾ø´Â ÀڷḦ ÀÎÆ®¶ó³Ý¿¡¼­ °¡Á®¿À±â

    + + + +
    +
    »óȲ¼³¸í:
    + +
    +

    ½ÇÁ¦ ÀڷḦ ¹æÈ­º®ÀÌ º¸È£ÇÏ´Â (³»ºÎ) ÀÎÆ®¶ó³Ý À¥¼­¹ö¿¡ + (www2.quux-corp.dom) ÀúÀåÇϸ鼭, ±â¾÷ÀÇ + (¿ÜºÎ) ÀÎÅÍ³Ý À¥¼­¹ö¸¦ (www.quux-corp.dom) + ½ÇÇàÇÏ´Â °Íó·³ º¸ÀÌ°Ô ÇÑ´Ù. ¿ÜºÎ À¥¼­¹ö´Â ¿äûÇÑ + ÀڷḦ ³»ºÎ À¥¼­¹ö¿¡¼­ °¡Á®¿Â´Ù.

    +
    + +
    ÇØ°áÃ¥:
    + +
    +

    ¸ÕÀú ¹æÈ­º®ÀÌ ³»ºÎ À¥¼­¹ö¸¦ º¸È£ÇÏ°í ¿ÜºÎ À¥¼­¹ö¸¸ÀÌ + ³»ºÎ À¥¼­¹ö¿¡¼­ ÀڷḦ ¾òÀ» ¼ö ÀÖ°Ô ÇÑ´Ù. ´ÙÀ½°ú °°ÀÌ + ÆÐŶÇÊÅ͸µ ¹æÈ­º®À» ¼³Á¤ÇÑ´Ù:

    + +
    +ALLOW Host www.quux-corp.dom Port >1024 --> Host www2.quux-corp.dom Port 80
    +DENY  Host *                 Port *     --> Host www2.quux-corp.dom Port 80
    +
    + +

    ½ÇÁ¦ ¼³Á¤¹®¹ý¿¡ ¾Ë¸Â°Ô °íÃĶó. ¾ø´Â ÀڷḦ ³»ºÎÀûÀ¸·Î + proxy throughput ±â´ÉÀ» ÅëÇØ ¿äûÇÏ´Â + mod_rewrite ±ÔÄ¢À» ÀÛ¼ºÇÑ´Ù:

    + +
    +RewriteRule ^/~([^/]+)/?(.*)          /home/$1/.www/$2
    +RewriteCond %{REQUEST_FILENAME}       !-f
    +RewriteCond %{REQUEST_FILENAME}       !-d
    +RewriteRule ^/home/([^/]+)/.www/?(.*) http://www2.quux-corp.dom/~$1/pub/$2 [P]
    +
    +
    +
    + + + +

    ·Îµå¹ë·±½Ì (ºÎÇÏ ºÐ»êÇϱâ)

    + + + +
    +
    »óȲ¼³¸í:
    + +
    +

    www.foo.comÀÇ Åë½Å·®À» + www[0-5].foo.com (ÃÑ ¼­¹ö 6´ë)À¸·Î ºÐ»êÇÏ°í + ½Í´Ù. ¾î¶»°Ô Çϴ°¡?

    +
    + +
    ÇØ°áÃ¥:
    + +
    +

    ¸Å¿ì ´Ù¾çÇÑ ¹æ¹ýÀ¸·Î ÀÌ ¹®Á¦¸¦ ÇØ°áÇÒ ¼ö ÀÖ´Ù. + ¸ÕÀú DNS¸¦ »ç¿ëÇÑ Àß ¾Ë·ÁÁø ¹æ¹ýÀ» ¼³¸íÇÏ°í, + mod_rewrite¸¦ »ç¿ëÇÏ´Â °æ¿ì¸¦ »ìÆ캸ÀÚ:

    + +
      +
    1. + DNS Round-Robin + +

      °¡Àå °£´ÜÇÑ ·Îµå¹ë·±½Ì ¹æ¹ýÀº BINDÀÇ + DNS round-robin ¹æ½ÄÀ» »ç¿ëÇÏ´Â °ÍÀÌ´Ù. ´ÙÀ½°ú + °°ÀÌ DNS A(address) ·¹Äڵ忡 + www[0-9].foo.comÀ» ¼³Á¤ÇÑ´Ù.

      + +
      +www0   IN  A       1.2.3.1
      +www1   IN  A       1.2.3.2
      +www2   IN  A       1.2.3.3
      +www3   IN  A       1.2.3.4
      +www4   IN  A       1.2.3.5
      +www5   IN  A       1.2.3.6
      +
      + +

      ±×¸®°í ´ÙÀ½ Ç׸ñÀ» Ãß°¡ÇÑ´Ù:

      + +
      +www    IN  CNAME   www0.foo.com.
      +       IN  CNAME   www1.foo.com.
      +       IN  CNAME   www2.foo.com.
      +       IN  CNAME   www3.foo.com.
      +       IN  CNAME   www4.foo.com.
      +       IN  CNAME   www5.foo.com.
      +       IN  CNAME   www6.foo.com.
      +
      + +

      À߸øµÈ °Íó·³ º¸ÀÌÁö¸¸, ½ÇÁ¦·Î BINDÀÇ + ÀǵµµÈ ±â´ÉÀÌ´Ù. ÀÌÁ¦ www.foo.comÀ» + ãÀ¸¸é, BIND´Â ¸Å¹ø ¼ø¼­¸¦ Á¶±Ý¾¿ + ¹Ù²ã°¡¸ç www0-www6À» ¹ÝȯÇÑ´Ù. ±×·¡¼­ + Ŭ¶óÀ̾ðÆ®µéÀ» ¿©·¯ ¼­¹ö·Î ºÐ»êÇÑ´Ù. ±×·¯³ª DNS + °Ë»ö °á°ú°¡ ³×Æ®¿÷ÀÇ ´Ù¸¥ ³×ÀÓ¼­¹ö¿¡ ij½¬µÇ¿© + www.foo.comÀ» ãÀº °á°ú°¡ ƯÁ¤ + wwwN.foo.comÀ̸é Ŭ¶óÀ̾ðÆ®ÀÇ ´ÙÀ½ + ¿äûµéµµ °°Àº wwwN.foo.comÀ¸·Î + º¸³»Áö±â¶§¹®¿¡ ¿Ïº®ÇÑ ·Îµå¹ë·±½Ì ±â¹ýÀÌ ¾Æ´ÔÀ» + ÁÖÀÇÇ϶ó. ±×·¯³ª Å©°Ô º¸¸é ¿äûÀÌ ¿©·¯ À¥¼­¹ö¿¡ + ºÐ»êµÇ¹Ç·Î È¿°ú°¡ ÁÁ´Ù.

      +
    2. + +
    3. + DNS ·Îµå¹ë·±½Ì + +

      http://www.stanford.edu/~schemers/docs/lbnamed/lbnamed.html¿¡ + ÀÖ´Â lbnamed ÇÁ·Î±×·¥À» »ç¿ëÇÏ¿© + Á¤±³ÇÑ DNS±â¹Ý ·Îµå¹ë·±½ÌÀ» ÇÒ ¼ö ÀÖ´Ù. DNS°¡ + ½ÇÁ¦ ·Îµå¹ë·±½ÌÀ» Çϵµ·Ï ¸¸µå´Â ¿©·¯ µµ±¸¿Í Perl + 5 ÇÁ·Î±×·¥ÀÌ´Ù.

      +
    4. + +
    5. + Proxy Throughput Round-Robin + +

      ÀÌ ¹æ¹ýÀº mod_rewrite¿Í proxy + throughput ±â´ÉÀ» »ç¿ëÇÑ´Ù. ¸ÕÀú DNS¿¡ ´ÙÀ½ Ç׸ñÀ» + »ç¿ëÇÏ¿© www0.foo.comÀÌ ½ÇÁ¦ + www.foo.comÀ» Àü´ãÇÏ°Ô ÇÑ´Ù

      + +
      +www    IN  CNAME   www0.foo.com.
      +
      + +

      ±×¸®°í www0.foo.comÀ» ÇÁ·Ï½ÃÀü¿ë + ¼­¹ö·Î º¯°æÇÑ´Ù. Áï, URLÀ» ¹ÞÀ¸¸é ¼­¹ö´Â ³»ºÎ + ÇÁ·Ï½Ã¸¦ ÅëÇØ ´Ù¸¥ 5´ë ¼­¹öÁß (www1-www5) + ÇÑ´ë·Î º¸³»±â¸¸ ÇÑ´Ù. À̸¦ À§ÇØ ¸ÕÀú ¸ðµç URLÀ» + ·Îµå¹ë·±½Ì ½ºÅ©¸³Æ® lb.pl·Î º¸³»´Â + ±ÔÄ¢À» ¸¸µç´Ù.

      + +
      +RewriteEngine on
      +RewriteMap    lb      prg:/path/to/lb.pl
      +RewriteRule   ^/(.+)$ ${lb:$1}           [P,L]
      +
      + +

      lb.plÀ» ÀÛ¼ºÇÑ´Ù:

      + +
      +#!/path/to/perl
      +##
      +##  lb.pl -- ·Îµå¹ë·±½Ì ½ºÅ©¸³Æ®
      +##
      +
      +$| = 1;
      +
      +$name   = "www";     # ±âº» È£½ºÆ®¸í
      +$first  = 1;         # ù¹ø° ¼­¹ö (ÀÚ½ÅÀÌ 0À̱⠶§¹®¿¡, 0À» »ç¿ëÇÏÁö ¾Ê´Â´Ù)
      +$last   = 5;         # round-robin¿¡¼­ ¸¶Áö¸· ¼­¹ö
      +$domain = "foo.dom"; # µµ¸ÞÀθí
      +
      +$cnt = 0;
      +while (<STDIN>) {
      +    $cnt = (($cnt+1) % ($last+1-$first));
      +    $server = sprintf("%s%d.%s", $name, $cnt+$first, $domain);
      +    print "http://$server/$_";
      +}
      +
      +##EOF##
      +
      + +
      ¸¶Áö¸· ÁÖÀÇ: ¿Ö ÀÌ ¹æ¹ýÀÌ À¯¿ëÇÑ°¡? + www0.foo.com¿¡ ºÎ´ãÀÌ °¡Áö¾Ê´Â°¡? + ¹°·Ð, ºÎ´ãÀÌ µÈ´Ù. ±×·¯³ª ´Ü¼øÇÑ proxy throughput + ¿äû¸¸ Çϱ⶧¹®¿¡ ±¦Âú´Ù! ¸ðµç SSI, CGI, ePerl + µîÀº ÀüÀûÀ¸·Î ´Ù¸¥ ¼­¹ö°¡ ó¸®ÇÑ´Ù. ÀÌ°ÍÀÌ ÇÙ½ÉÀÌ´Ù.
      +
    6. + +
    7. + Çϵå¿þ¾î/TCP Round-Robin + +

      Çϵå¿þ¾î¸¦ »ç¿ëÇÑ ÇØ°áÃ¥µµ ÀÖ´Ù. Cisco´Â TCP/IP + ¼öÁØ¿¡¼­ ·Îµå¹ë·±½ÌÀ» ÇÏ´Â LocalDirector¶ó´Â ±«¹°À» + ÆÇ´Ù. ½ÇÁ¦·Î´Â À¥¼­¹ö±º ¾Õ´Ü¿¡ À§Ä¡ÇÏ´Â ÀÏÁ¾ÀÇ + ȸ·Î¼öÁØ °ÔÀÌÆ®¿þÀÌ´Ù. ÀÚ±ÝÀÌ ÃæºÐÇÏ°í °í¼º´É + ÇØ°áÃ¥ÀÌ ÇÊ¿äÇÏ´Ù¸é ÀÌ°ÍÀ» »ç¿ëÇ϶ó.

      +
    8. +
    +
    +
    + + + +

    »õ·Î¿î MIME-type, »õ·Î¿î ¼­ºñ½º

    + + + +
    +
    »óȲ¼³¸í:
    + +
    +

    ³×Æ®¿÷¿¡´Â ¸ÚÁø CGI ÇÁ·Î±×·¥µéÀÌ ¸¹´Ù. ±×·¯³ª »ç¿ëÇϱâ + ¹ø°Å·¯¿ö¼­ ¸¹Àº À¥°ü¸®ÀÚ°¡ »ç¿ëÇÏÁö ¾Ê´Â´Ù. ¾ÆÆÄÄ¡ÀÇ + MIME-type¿¡ µû¸¥ Action Çڵ鷯 ±â´Éµµ CGI ÇÁ·Î±×·¥ÀÌ + Ưº°ÇÑ URLÀ» (Á¤È®È÷ PATH_INFO¿Í + QUERY_STRINGS) ÇÁ·Î±×·¥ÀÇ ÀÔ·ÂÀ¸·Î »ç¿ëÇÏÁö + ¾ÊÀ» ¶§¸¸ ÀûÀýÇÏ´Ù. ¸ÕÀú, È®ÀåÀÚ°¡ (secure CGI¸¦ ÁÙ¿©) + .scgiÀÎ ÆÄÀÏÀ» À¯¸íÇÑ cgiwrap + ÇÁ·Î±×·¥À¸·Î ó¸®ÇϱâÀ§ÇØ »õ·Î¿î typeÀ» ¼³Á¤ÇÑ´Ù. + ¹®Á¦´Â (À§¿¡¼­ º») ÀÏ°üµÈ URL ±¸Á¶¸¦ »ç¿ëÇÏ´Â °æ¿ì + »ç¿ëÀÚ È¨µð·ºÅ丮°¡ /u/user/foo/bar.scgi°°Àº + URLÀÎ Á¡ÀÌ´Ù. cgiwrap´Â + /~user/foo/bar.scgi/ Çü½ÄÀÇ URLÀ» + ¿øÇϱ⶧¹®ÀÌ´Ù. ´ÙÀ½ ±ÔÄ¢ÀÌ ¹®Á¦¸¦ ÇØ°áÇÑ´Ù:

    + +
    +RewriteRule ^/[uge]/([^/]+)/\.www/(.+)\.scgi(.*) ...
    +... /internal/cgi/user/cgiwrap/~$1/$2.scgi$3  [NS,T=application/x-http-cgi]
    +
    + +

    ÀÌÁ¦ ´Ù¸¥ ¸ÚÁø ÇÁ·Î±×·¥, (URL ÇÏÀ§Æ®¸®¿¡ ´ëÇÑ + access.log¸¦ Ãâ·ÂÇÏ´Â) wwwlog¿Í + (URL ÇÏÀ§Æ®¸®¿¡ Glimpse¸¦ ½ÇÇàÇÏ´Â) wwwidx°¡ + ÀÖ´Ù°í °¡Á¤ÇÏÀÚ. ¿ì¸®´Â ÇÁ·Î±×·¥¿¡°Ô ÀÛ¾÷ÇÒ ´ë»óÀÎ + URL ¿µ¿ªÀ» ¾Ë·ÁÁà¾ß ÇÑ´Ù. ±×·¯³ª ¿äûÇÒ¶§¸¶´Ù Ç×»ó + Àû¾îÁà¾ß Çϱ⶧¹®¿¡ ±ò²ûÇÏÁö ¾Ê´Ù. Áï, º¸Åë + /u/user/foo/¿¡ ´ëÇØ swwidx + ÇÁ·Î±×·¥À» ½ÇÇàÇÑ´Ù¸é ´ÙÀ½°ú °°Àº ¸µÅ©¸¦ »ç¿ëÇÑ´Ù

    + +
    +/internal/cgi/user/swwidx?i=/u/user/foo/
    +
    + +

    ±ò²ûÇÏÁö ¾Ê´Ù. ¸µÅ©¿¡ ¿µ¿ªÀÇ À§Ä¡¿Í + CGI À§Ä¡¸¦ ¸ðµÎ Àû¾î¾ß Çϱ⶧¹®ÀÌ´Ù. + ¿µ¿ªÀ» À籸¼ºÇÑ´Ù¸é ¿©·¯ ÇÏÀÌÆÛ¸µÅ©¸¦ ¼öÁ¤Çϴµ¥ ¸¹Àº + ½Ã°£ÀÌ °É¸± °ÍÀÌ´Ù.

    +
    + +
    ÇØ°áÃ¥:
    + +
    +

    ÇØ°áÃ¥Àº ÀÚµ¿À¸·Î ÀûÀýÇÑ CGI¸¦ ½ÇÇàÇÏ´Â »õ·Î¿î + Ưº°ÇÑ URL Çü½ÄÀ» ¸¸µå´Â °ÍÀÌ´Ù. ´ÙÀ½°ú °°ÀÌ ¼³Á¤ÇÑ´Ù:

    + +
    +RewriteRule   ^/([uge])/([^/]+)(/?.*)/\*  /internal/cgi/user/wwwidx?i=/$1/$2$3/
    +RewriteRule   ^/([uge])/([^/]+)(/?.*):log /internal/cgi/user/wwwlog?f=/$1/$2$3
    +
    + +

    ÀÌÁ¦ /u/user/foo/À» °Ë»öÇÏ´Â ¸µÅ©´Â + ´ÙÀ½°ú °°´Ù

    + +
    +HREF="*"
    +/u/user/foo/* (???)
    +
    + +

    ³»ºÎÀûÀ¸·Î ´ÙÀ½°ú °°ÀÌ ÀÚµ¿º¯È¯µÈ´Ù

    + +
    +/internal/cgi/user/wwwidx?i=/u/user/foo/
    +
    + +

    °°Àº ¹æ¹ýÀ¸·Î ¸µÅ© µÚ¿¡ :log¸¦ »ç¿ëÇÏ¿© + Á¢±Ù ·Î±× CGI ÇÁ·Î±×·¥À» ½ÇÇàÇÒ ¼ö ÀÖ´Ù.

    +
    +
    + + + +

    Á¤Àû¿¡¼­ µ¿ÀûÀ¸·Î

    + + + +
    +
    »óȲ¼³¸í:
    + +
    +

    ¾î¶»°Ô ºê¶ó¿ìÀú¿Í »ç¿ëÀÚ°¡ ¸ð¸£°Ô ÀÚ¿¬½º·´°Ô Á¤Àû + ÆäÀÌÁö foo.htmlÀ» µ¿ÀûÀÎ foo.cgi·Î + º¯°æÇÒ ¼ö ÀÖ³ª.

    +
    + +
    ÇØ°áÃ¥:
    + +
    +

    URLÀ» CGI ½ºÅ©¸³Æ®·Î ÀçÀÛ¼ºÇÏ°í, MIME-typeÀ» ¼öÁ¤ÇÏ¿© + CGI ½ºÅ©¸³Æ®·Î ½ÇÇàÇÏ°Ô ÇÑ´Ù. ±×·¡¼­ + /~quux/foo.html¸¦ ¿äûÇÏ¸é ³»ºÎÀûÀ¸·Î + /~quux/foo.cgi¸¦ ½ÇÇàÇÏ°Ô µÈ´Ù.

    + +
    +RewriteEngine  on
    +RewriteBase    /~quux/
    +RewriteRule    ^foo\.html$  foo.cgi  [T=application/x-httpd-cgi]
    +
    +
    +
    + + + +

    Áï¼® ÄÁÅÙÃ÷ Àç»ý¼º

    + + + +
    +
    »óȲ¼³¸í:
    + +
    +

    ÀÌ ¹æ¹ýÀº ½Ç·Î ºñ±âÀÌ´Ù: µ¿ÀûÀ¸·Î ÆäÀÌÁö¸¦ »ý¼ºÇÏÁö¸¸, + Á¤ÀûÀ¸·Î ÆäÀÌÁö¸¦ ¼­ºñ½ºÇÑ´Ù. Áï, ÆäÀÌÁö´Â ¼ø¼öÇÏ°Ô + (ÆÄÀϽýºÅÛ¿¡¼­ ÀÐÀº ³»¿ëÀ» ±×´ë·Î) Á¤Àû ÆäÀÌÁö·Î + Àü´ÞµÇÁö¸¸, ¾øÀ» °æ¿ì À¥¼­¹ö°¡ µ¿ÀûÀ¸·Î »ý¼ºÇÑ´Ù. + ±×·¯¸é ´©°¡ (ȤÀº cron ÀÛ¾÷ÀÌ) Á¤Àû ÄÁÅÙÃ÷¸¦ Áö¿ìÁö¾Ê´Â + ÇÑ CGI°¡ »ý¼ºÇÑ ÆäÀÌÁö¸¦ Á¤ÀûÀ¸·Î ¼­ºñ½ºÇÑ´Ù. ÄÁÅÙÃ÷¸¦ + Áö¿ì¸é ³»¿ëÀ» °»½ÅÇÑ´Ù.

    +
    + +
    ÇØ°áÃ¥:
    + +
    + ´ÙÀ½ ±ÔÄ¢À» »ç¿ëÇÑ´Ù: + +
    +RewriteCond %{REQUEST_FILENAME}   !-s
    +RewriteRule ^page\.html$          page.cgi   [T=application/x-httpd-cgi,L]
    +
    + +

    ¿©±â¼­ page.html¸¦ ¿äûÇÒ¶§ + page.htmlÀÌ ¾ø°Å³ª ÆÄÀÏÅ©±â°¡ 0ÀÎ °æ¿ì + ³»ºÎÀûÀ¸·Î page.cgi¸¦ ½ÇÇàÇÑ´Ù. ¿©±â¼­ + ºñ°áÀº page.cgi°¡ ÀϹÝÀûÀÎ CGI ½ºÅ©¸³Æ®¿Í + °°ÀÌ STDOUT¿¡ Ãâ·ÂÇÏ°í, Ãß°¡·Î Ãâ·ÂÀ» + page.html ÆÄÀÏ¿¡ Àû´Â´Ù. Çѹø ½ÇÇàÇÑÈÄ + ¼­¹ö´Â page.htmlÀÇ Á¤º¸¸¦ º¸³½´Ù. À¥°ü¸®ÀÚ°¡ + °­Àç·Î ³»¿ëÀ» °»½ÅÇÏ°í ½Í´Ù¸é, (º¸Åë cron ÀÛ¾÷ÀÌ) + page.htmlÀ» Áö¿ì±â¸¸ ÇÏ¸é µÈ´Ù.

    +
    +
    + + + +

    ÀÚµ¿À¸·Î »õ·Î °íħÇÏ´Â ¹®¼­

    + + + +
    +
    »óȲ¼³¸í:
    + +
    +

    º¹ÀâÇÑ À¥ÆäÀÌÁö¸¦ ¸¸µé¶§ ÆíÁýÀÚ°¡ ³»¿ëÀ» ¼öÁ¤ÇÒ + ¶§¸¶´Ù ÀÚµ¿À¸·Î ÆäÀÌÁö¸¦ »õ·Î °íħÇÏ´Â À¥ºê¶ó¿ìÀú°¡ + ÀÖÀ¸¸é ¾ó¸¶³ª ÁÁÀ»±î? ºÒ°¡´ÉÇÑ°¡?

    +
    + +
    ÇØ°áÃ¥:
    + +
    +

    °¡´ÉÇÏ´Ù! MIME multipart ±â´É°ú À¥¼­¹ö NPH ±â´É, + mod_rewriteÀÇ URL Á¶ÀÛ ´É·ÂÀ» °áÇÕÇϸé + µÈ´Ù. ¸ÕÀú, »õ·Î¿î URL ±â´ÉÀ» ¸¸µç´Ù: URL¿¡ + :refresh¸¦ Ãß°¡Çϱ⸸ Çϸé ÆÄÀϽýºÅÛ¿¡¼­ + ¼öÁ¤µÉ ¶§¸¶´Ù »õ·Î °íħÇÑ´Ù.

    + +
    +RewriteRule   ^(/[uge]/[^/]+/?.*):refresh  /internal/cgi/apache/nph-refresh?f=$1
    +
    + +

    ÀÌÁ¦ ´ÙÀ½ URL¿¡ Á¢±ÙÇϸé

    + +
    +/u/foo/bar/page.html:refresh
    +
    + +

    ´ÙÀ½ URLÀ» ³»ºÎÀûÀ¸·Î ºÎ¸¥´Ù

    + +
    +/internal/cgi/apache/nph-refresh?f=/u/foo/bar/page.html
    +
    + +

    ÀÌÁ¦ NPH-CGI ½ºÅ©¸³Æ®¸¸ ³²¾Ò´Ù. º¸Åë "µ¶ÀÚ¿¡°Ô + ¿¬½ÀÀ¸·Î ³²°ÜµÒ"À̶ó°í ¸»ÇÏÁö¸¸ ;-) ³ª´Â À̰͵µ Á¦°øÇÑ´Ù.

    + +
    +#!/sw/bin/perl
    +##
    +##  nph-refresh -- NPH/CGI script for auto refreshing pages
    +##  Copyright (c) 1997 Ralf S. Engelschall, All Rights Reserved.
    +##
    +$| = 1;
    +
    +#   split the QUERY_STRING variable
    +@pairs = split(/&/, $ENV{'QUERY_STRING'});
    +foreach $pair (@pairs) {
    +    ($name, $value) = split(/=/, $pair);
    +    $name =~ tr/A-Z/a-z/;
    +    $name = 'QS_' . $name;
    +    $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
    +    eval "\$$name = \"$value\"";
    +}
    +$QS_s = 1 if ($QS_s eq '');
    +$QS_n = 3600 if ($QS_n eq '');
    +if ($QS_f eq '') {
    +    print "HTTP/1.0 200 OK\n";
    +    print "Content-type: text/html\n\n";
    +    print "&lt;b&gt;ERROR&lt;/b&gt;: No file given\n";
    +    exit(0);
    +}
    +if (! -f $QS_f) {
    +    print "HTTP/1.0 200 OK\n";
    +    print "Content-type: text/html\n\n";
    +    print "&lt;b&gt;ERROR&lt;/b&gt;: File $QS_f not found\n";
    +    exit(0);
    +}
    +
    +sub print_http_headers_multipart_begin {
    +    print "HTTP/1.0 200 OK\n";
    +    $bound = "ThisRandomString12345";
    +    print "Content-type: multipart/x-mixed-replace;boundary=$bound\n";
    +    &print_http_headers_multipart_next;
    +}
    +
    +sub print_http_headers_multipart_next {
    +    print "\n--$bound\n";
    +}
    +
    +sub print_http_headers_multipart_end {
    +    print "\n--$bound--\n";
    +}
    +
    +sub displayhtml {
    +    local($buffer) = @_;
    +    $len = length($buffer);
    +    print "Content-type: text/html\n";
    +    print "Content-length: $len\n\n";
    +    print $buffer;
    +}
    +
    +sub readfile {
    +    local($file) = @_;
    +    local(*FP, $size, $buffer, $bytes);
    +    ($x, $x, $x, $x, $x, $x, $x, $size) = stat($file);
    +    $size = sprintf("%d", $size);
    +    open(FP, "&lt;$file");
    +    $bytes = sysread(FP, $buffer, $size);
    +    close(FP);
    +    return $buffer;
    +}
    +
    +$buffer = &readfile($QS_f);
    +&print_http_headers_multipart_begin;
    +&displayhtml($buffer);
    +
    +sub mystat {
    +    local($file) = $_[0];
    +    local($time);
    +
    +    ($x, $x, $x, $x, $x, $x, $x, $x, $x, $mtime) = stat($file);
    +    return $mtime;
    +}
    +
    +$mtimeL = &mystat($QS_f);
    +$mtime = $mtime;
    +for ($n = 0; $n &lt; $QS_n; $n++) {
    +    while (1) {
    +        $mtime = &mystat($QS_f);
    +        if ($mtime ne $mtimeL) {
    +            $mtimeL = $mtime;
    +            sleep(2);
    +            $buffer = &readfile($QS_f);
    +            &print_http_headers_multipart_next;
    +            &displayhtml($buffer);
    +            sleep(5);
    +            $mtimeL = &mystat($QS_f);
    +            last;
    +        }
    +        sleep($QS_s);
    +    }
    +}
    +
    +&print_http_headers_multipart_end;
    +
    +exit(0);
    +
    +##EOF##
    +
    +
    +
    + + + +

    ´ë·®ÀÇ °¡»óÈ£½ºÆ®

    + + + +
    +
    »óȲ¼³¸í:
    + +
    +

    °¡»óÈ£½ºÆ®°¡ ¸î°³¸¸ ÀÖ´Ù¸é ¾ÆÆÄÄ¡ÀÇ <VirtualHost> + ±â´ÉÀÌ Àß µ¿ÀÛÇÑ´Ù. ±×·¯³ª °¡»óÈ£½ºÆ®°¡ ¼ö¹é°³ ÀÖ´Â + ISP¶ó¸é ÀÌ ±â´ÉÀÌ ÃÖ¼±Àº ¾Æ´Ï´Ù.

    +
    + +
    ÇØ°áÃ¥:
    + +
    +

    ÀÌ ±â´ÉÀ» Á¦°øÇÏ·Á¸é Proxy Throughput + ±â´ÉÀ» (Ç÷¡±× [P]) »ç¿ëÇÏ¿© ¿ÜºÎ À¥ÆäÀÌÁö + ȤÀº Àüü ¿ÜºÎ À¥¿µ¿ªÀ» ¿ì¸®ÀÇ À̸§°ø°£¿¡ ´ëÀÀÇÑ´Ù:

    + +
    +##
    +##  vhost.map
    +##
    +www.vhost1.dom:80  /path/to/docroot/vhost1
    +www.vhost2.dom:80  /path/to/docroot/vhost2
    +     :
    +www.vhostN.dom:80  /path/to/docroot/vhostN
    +
    + +
    +##
    +##  httpd.conf
    +##
    +    :
    +#   ¸®´ÙÀÌ·ºÆ®ÇÒ¶§ Á¤±Ô È£½ºÆ®¸íÀ» »ç¿ëÇÑ´Ù.
    +UseCanonicalName on
    +
    +    :
    +#   °¡»óÈ£½ºÆ®¸¦ CLF Çü½Ä ¾Õ¿¡ Ãß°¡ÇÑ´Ù
    +CustomLog  /path/to/access_log  "%{VHOST}e %h %l %u %t \"%r\" %>s %b"
    +    :
    +
    +#   ÁÖ¼­¹ö¿¡¼­ ÀçÀÛ¼º ¿£ÁøÀ» »ç¿ëÇÑ´Ù
    +RewriteEngine on
    +
    +#   µÎ ¸ÊÀ» Á¤ÀÇÇÑ´Ù: Çϳª´Â URLÀ» °íÄ¡°í,
    +#   ´Ù¸¥ Çϳª´Â °¡»óÈ£½ºÆ®º° DocumentRoot¸¦
    +#   Á¤ÀÇÇÑ´Ù.
    +RewriteMap    lowercase    int:tolower
    +RewriteMap    vhost        txt:/path/to/vhost.map
    +
    +#   ÀÌÁ¦ Å©°í º¹ÀâÇÑ ±ÔÄ¢ ÇÑ°³¸¦ »ç¿ëÇÏ¿©
    +#   °¡»óÈ£½ºÆ®·Î ´ëÀÀÇÑ´Ù.
    +#
    +#   1. °¡»óÈ£½ºÆ®µéÀÌ °°ÀÌ »ç¿ëÇÏ´Â À§Ä¡´Â ´ëÀÀÇÏÁö ¾Ê´Â´Ù
    +RewriteCond   %{REQUEST_URI}  !^/commonurl1/.*
    +RewriteCond   %{REQUEST_URI}  !^/commonurl2/.*
    +    :
    +RewriteCond   %{REQUEST_URI}  !^/commonurlN/.*
    +#
    +#   2. ¿ì¸®°¡ ÇöÀç »ç¿ëÇÏ´Â ¹æ¹ýÀÌ Host Çì´õ¸¦
    +#      °¡»óÈ£½ºÆ®¸¦ Áö¿øÇϹǷÎ
    +#      Host Çì´õ°¡ ÀÖ´ÂÁö È®ÀÎÇÑ´Ù
    +RewriteCond   %{HTTP_HOST}  !^$
    +#
    +#   3. È£½ºÆ®¸íÀ» ¼Ò¹®ÀÚ·Î ¸¸µç´Ù
    +RewriteCond   ${lowercase:%{HTTP_HOST}|NONE}  ^(.+)$
    +#
    +#   4. vhost.map¿¡¼­ È£½ºÆ®¸íÀ» ã°í
    +#      °æ·ÎÀ϶§¸¸ ±â¾ïÇÑ´Ù
    +#      (À§¿¡¼­ "NONE"Àº ¾Æ´Ï´Ù)
    +RewriteCond   ${vhost:%1}  ^(/.*)$
    +#
    +#   5. ¸¶Áö¸·À¸·Î URLÀ» ¹®¼­ À§Ä¡·Î ´ëÀÀÇÏ°í
    +#      ·Î±×¿¡ ³²±â±âÀ§ÇØ °¡»óÈ£½ºÆ®¸¦ ±â¾ïÇØ µÐ´Ù
    +RewriteRule   ^/(.*)$   %1/$1  [E=VHOST:${lowercase:%{HTTP_HOST}}]
    +    :
    +
    +
    +
    + + + +
    top
    +
    +

    Á¢±Ù Á¦ÇÑ

    + + + +

    ·Îº¿ ¸·±â

    + + + +
    +
    »óȲ¼³¸í:
    + +
    +

    ¾î¶»°Ô Çϸé ƯÁ¤ À¥°ø°£ÀÇ ÆäÀÌÁö¸¦ ±Ü¾î¸ðÀ¸´Â ±ÍÂúÀº + ·Îº¿À» ¸·À» ¼ö ÀÖ³ª? "Robot Exclusion Protocol" Ç׸ñÀ» + ÀúÀåÇÑ /robots.txt ÆÄÀÏÀº º¸Åë ÀÌ·± ·Îº¿À» + ¸·´Âµ¥ ÃæºÐÇÏÁö ¾Ê´Ù.

    +
    + +
    ÇØ°áÃ¥:
    + +
    +

    (¾Æ¸¶µµ µð·ºÅ丮°¡ ±í¾î¼­ ·Îº¿ÀÌ µ¹¾Æ´Ù´Ï¸é ¼­¹ö¿¡ + ºÎ´ãÀÌ Å« °æ¿ì) À¥°ø°£ /~quux/foo/arc/¿¡ + ÀÖ´Â URLµéÀ» °ÅºÎÇÏ´Â ±ÔÄ¢À» »ç¿ëÇÑ´Ù. ¿ì¸®´Â ƯÁ¤ + ·Îº¿ÀÇ Á¢±ÙÀ» ¸·¾Æ¾ß ÇÑ´Ù. Áï, ·Îº¿À» ½ÇÇàÇϴ ȣ½ºÆ®¸¦ + ¸·´Â °ÍÀ¸·Î´Â ºÒÃæºÐÇϸç, ±× È£½ºÆ®ÀÇ »ç¿ëÀÚµµ ¸·¾Æ¹ö¸®°Ô + µÈ´Ù. User-Agent HTTP Çì´õ Á¤º¸µµ ºñ±³ÇÑ´Ù.

    + +
    +RewriteCond %{HTTP_USER_AGENT}   ^NameOfBadRobot.*
    +RewriteCond %{REMOTE_ADDR}       ^123\.45\.67\.[8-9]$
    +RewriteRule ^/~quux/foo/arc/.+   -   [F]
    +
    +
    +
    + + + +

    ±×¸² ÆÛ°¡±â ¹æÁö

    + + + +
    +
    »óȲ¼³¸í:
    + +
    +

    http://www.quux-corp.de/~quux/¿¡ ÀÖ´Â + ÆäÀÌÁöµéÀÌ GIF ±×¸²À» Æ÷ÇÔÇÑ´Ù°í °¡Á¤ÇÏÀÚ. ÀÌ ±×¸²ÀÌ + ¸ÚÀ־, ´Ù¸¥ »ç¶÷µéÀÌ ÀÚ½ÅÀÇ ÆäÀÌÁö¿¡ Á÷Á¢ ¸µÅ©¸¦ + °Ç´Ù. ¼­¹ö¿¡ ºÒÇÊ¿äÇÑ ºÎ´ãÀÌ µÇ¹Ç·Î ¸·°í ½Í´Ù.

    +
    + +
    ÇØ°áÃ¥:
    + +
    +

    ±×¸²À» 100% º¸È£ÇÒ ¼ö´Â ¾øÁö¸¸, ÃÖ¼ÒÇÑ ºê¶ó¿ìÀú°¡ + HTTP Referer Çì´õ¸¦ º¸³»´Â °æ¿ì Á¦ÇÑÇÒ ¼ö ÀÖ´Ù.

    + +
    +RewriteCond %{HTTP_REFERER} !^$
    +RewriteCond %{HTTP_REFERER} !^http://www.quux-corp.de/~quux/.*$ [NC]
    +RewriteRule .*\.gif$        -                                    [F]
    +
    + +
    +RewriteCond %{HTTP_REFERER}         !^$
    +RewriteCond %{HTTP_REFERER}         !.*/foo-with-gif\.html$
    +RewriteRule ^inlined-in-foo\.gif$   -                        [F]
    +
    +
    +
    + + + +

    È£½ºÆ® °ÅºÎ

    + + + +
    +
    »óȲ¼³¸í:
    + +
    +

    ¾î¶»°Ô ¿ÜºÎ¿¡¼­ ¼­¹ö¿¡ Á¢±ÙÇÒ ¼ö ¾ø´Â È£½ºÆ® ¸ñ·ÏÀ» + ¼³Á¤ÇÒ ¼ö ÀÖ³ª?

    +
    + +
    ÇØ°áÃ¥:
    + +
    +

    ¾ÆÆÄÄ¡ >= 1.3b6¿¡¼­:

    + +
    +RewriteEngine on
    +RewriteMap    hosts-deny  txt:/path/to/hosts.deny
    +RewriteCond   ${hosts-deny:%{REMOTE_HOST}|NOT-FOUND} !=NOT-FOUND [OR]
    +RewriteCond   ${hosts-deny:%{REMOTE_ADDR}|NOT-FOUND} !=NOT-FOUND
    +RewriteRule   ^/.*  -  [F]
    +
    + +

    ¾ÆÆÄÄ¡ <= 1.3b6¿¡¼­:

    + +
    +RewriteEngine on
    +RewriteMap    hosts-deny  txt:/path/to/hosts.deny
    +RewriteRule   ^/(.*)$ ${hosts-deny:%{REMOTE_HOST}|NOT-FOUND}/$1
    +RewriteRule   !^NOT-FOUND/.* - [F]
    +RewriteRule   ^NOT-FOUND/(.*)$ ${hosts-deny:%{REMOTE_ADDR}|NOT-FOUND}/$1
    +RewriteRule   !^NOT-FOUND/.* - [F]
    +RewriteRule   ^NOT-FOUND/(.*)$ /$1
    +
    + +
    +##
    +##  hosts.deny
    +##
    +##  ÁÖÀÇ! ÀÌ°ÍÀº ¸ñ·Ïó·³ º¸ÀÌÁö¸¸ ¸ñ·ÏÀÌ ¾Æ´Ï¶ó ¸ÊÀÌ´Ù.
    +##        mod_rewrite´Â ÀÌ Á¤º¸¸¦ Å°/°ª ½ÖÀ¸·Î Çؼ®Çϱ⶧¹®¿¡,
    +##        °¢ Ç׸ñÀÇ °ª ÀÚ¸®¿¡ ÃÖ¼ÒÇÑ "-"°¡ ÇÊ¿äÇÏ´Ù.
    +##
    +
    +193.102.180.41 -
    +bsdti1.sdm.de  -
    +192.76.162.40  -
    +
    +
    +
    + + + +

    ÇÁ·Ï½Ã °ÅºÎ

    + + + +
    +
    »óȲ¼³¸í:
    + +
    +

    ¾î¶»°Ô ƯÁ¤ È£½ºÆ® ȤÀº ƯÁ¤ È£½ºÆ®ÀÇ »ç¿ëÀÚ°¡ + ¾ÆÆÄÄ¡ ÇÁ·Ï½Ã¸¦ »ç¿ëÇÒ ¼ö ¾øµµ·Ï Çϳª?

    +
    + +
    ÇØ°áÃ¥:
    + +
    +

    ¸ÕÀú ¾ÆÆÄÄ¡ À¥¼­¹ö¸¦ ÄÄÆÄÀÏÇÒ¶§ ±¸¼ºÆÄÀÏ¿¡¼­ + mod_rewrite°¡ mod_proxy + ¾Æ·¡¿¡(!) ÀÖ¾î¾ß ÇÑ´Ù. ±×·¯¸é mod_rewrite´Â + mod_proxy ÀÌÀü¿¡ ºÒ¸°´Ù. + ÀÌÁ¦ ´ÙÀ½°ú °°ÀÌ Æ¯Á¤ È£½ºÆ®¸¦ °ÅºÎÇϵµ·Ï ¼³Á¤ÇÑ´Ù...

    + +
    +RewriteCond %{REMOTE_HOST} ^badhost\.mydomain\.com$
    +RewriteRule !^http://[^/.]\.mydomain.com.*  - [F]
    +
    + +

    ...±×¸®°í ´ÙÀ½Àº user@host¿¡ µû¶ó °ÅºÎÇÑ´Ù:

    + +
    +RewriteCond %{REMOTE_IDENT}@%{REMOTE_HOST}  ^badguy@badhost\.mydomain\.com$
    +RewriteRule !^http://[^/.]\.mydomain.com.*  - [F]
    +
    +
    +
    + + + +

    Ưº°ÇÑ ÀÎÁõ ¹æ½Ä

    + + + +
    +
    »óÈ°¼³¸í:
    + +
    +

    °¡²û ¸Å¿ì Ưº°ÇÑ ÀÎÁõÀÌ ÇÊ¿äÇÒ ¶§°¡ ÀÖ´Ù. ¿¹¸¦ + µé¾î, ¹Ì¸® ¼³Á¤ÇصР»ç¿ëÀÚÀÎÁö °Ë»çÇÑ´Ù. À̵鿡°Ô¸¸ + (mod_authÀÇ Basic Auth¸¦ »ç¿ëÇÑ + °æ¿ì¿Í ´Þ¸®) º°´Ù¸¥ ¹°À½¾øÀÌ Á¢±ÙÀ» Çã¿ëÇÑ´Ù.

    +
    + +
    ÇØ°áÃ¥:
    + +
    +

    Ä£±¸¸¸ Á¢±ÙÀÌ °¡´ÉÇϵµ·Ï ÀçÀÛ¼º ±ÔÄ¢µéÀ» »ç¿ëÇÑ´Ù:

    + +
    +RewriteCond %{REMOTE_IDENT}@%{REMOTE_HOST} !^friend1@client1.quux-corp\.com$
    +RewriteCond %{REMOTE_IDENT}@%{REMOTE_HOST} !^friend2@client2.quux-corp\.com$
    +RewriteCond %{REMOTE_IDENT}@%{REMOTE_HOST} !^friend3@client3.quux-corp\.com$
    +RewriteRule ^/~quux/only-for-friends/      -                                 [F]
    +
    +
    +
    + + + +

    Referer±â¹Ý º¯È¯±â(deflector)

    + + + +
    +
    »óȲ¼³¸í:
    + +
    +

    "Referer" HTTP Çì´õ¿¡ µû¶ó ¿øÇϴ´ë·Î ÂüÁ¶ÆäÀÌÁö¸¦ + ¼³Á¤ÇÒ ¼ö ÀÖ´Â À¯¿¬ÇÑ URL º¯È¯±â¸¦ ¸¸µé ¼ö Àִ°¡?

    +
    + +
    ÇØ°áÃ¥:
    + +
    +

    ´ÙÀ½°ú °°ÀÌ º¹ÀâÇÑ ±ÔÄ¢À»...

    + +
    +RewriteMap  deflector txt:/path/to/deflector.map
    +
    +RewriteCond %{HTTP_REFERER} !=""
    +RewriteCond ${deflector:%{HTTP_REFERER}} ^-$
    +RewriteRule ^.* %{HTTP_REFERER} [R,L]
    +
    +RewriteCond %{HTTP_REFERER} !=""
    +RewriteCond ${deflector:%{HTTP_REFERER}|NOT-FOUND} !=NOT-FOUND
    +RewriteRule ^.* ${deflector:%{HTTP_REFERER}} [R,L]
    +
    + +

    ... ÀçÀÛ¼º ¸Ê°ú °°ÀÌ »ç¿ëÇÑ´Ù:

    + +
    +##
    +##  deflector.map
    +##
    +
    +http://www.badguys.com/bad/index.html    -
    +http://www.badguys.com/bad/index2.html   -
    +http://www.badguys.com/bad/index3.html   http://somewhere.com/
    +
    + +

    ±×·¯¸é ¿äûÀ» ÀÚµ¿À¸·Î (¸Ê¿¡¼­ °ªÀ¸·Î "-"¸¦ + »ç¿ëÇÑ °æ¿ì) ÂüÁ¶ÆäÀÌÁö³ª (URLÀÌ ¸Ê¿¡ ÀÖ´Â °æ¿ì µÎ¹ø° + ¾Æ±Ô¸ÕÆ®·Î) ƯÁ¤ URL·Î ¸®´ÙÀÌ·º¼ÇÇÑ´Ù.

    +
    +
    + + + +
    top
    +
    +

    ±âŸ

    + + + +

    ¿ÜºÎ ÀçÀÛ¼º ¿£Áø

    + + + +
    +
    »óȲ¼³¸í:
    + +
    +

    FAQ: ¾î¶»°Ô ÀÌ·±Àú·± Àâ´ÙÇÑ ¹®Á¦¸¦ Ç® ¼ö Àִ°¡? + mod_rewrite·Î´Â ÇØ°áÃ¥ÀÌ ¾Èº¸ÀδÙ...

    +
    + +
    ÇØ°áÃ¥:
    + +
    +

    ¿ÜºÎ RewriteMapÀ» »ç¿ëÇ϶ó. + Áï, ÇÁ·Î±×·¥ÀÌ RewriteMap ¿ªÇÒÀ» + ÇÑ´Ù. ÇÁ·Î±×·¥Àº ¾ÆÆÄÄ¡°¡ ½ÃÀÛÇÒ¶§ ½ÃÀÛÇÏ¿© + STDIN¿¡¼­ ¿äûÇÑ URLÀ» ¹Þ°í, (°°Àº ¼ø¼­·Î!) + °á°ú (º¸Åë ÀçÀÛ¼ºµÈ) URLÀ» STDOUT¿¡ Ãâ·ÂÇÑ´Ù.

    + +
    +RewriteEngine on
    +RewriteMap    quux-map       prg:/path/to/map.quux.pl
    +RewriteRule   ^/~quux/(.*)$  /~quux/${quux-map:$1}
    +
    + +
    +#!/path/to/perl
    +
    +#   ¾ÆÆÄÄ¡ ¼­¹ö°¡ ¸ØÃßÁö ¾Êµµ·Ï
    +#   ÀÔÃâ·Â ¹öÆÛ¸¦ »ç¿ëÇÏÁö ¾Ê´Â´Ù
    +$| = 1;
    +
    +#   stdin¿¡¼­ ÇÑÁÙ¾¿ URLÀ» Àаí
    +#   stdout¿¡ º¯È¯ÇÑ URLÀ» Ãâ·ÂÇÑ´Ù
    +while (<>) {
    +    s|^foo/|bar/|;
    +    print $_;
    +}
    +
    + +

    ¼³¸íÇϱâÀ§ÇØ ¸ðµç /~quux/foo/... URLÀ» + /~quux/bar/...·Î ÀçÀÛ¼ºÇÏ´Â ½ºÅ©¸³Æ®¸¦ + ¿¹·Î µé¾ú´Ù. ½ÇÁ¦·Î ¸¶À½´ë·Î ÇÁ·Î±×·¡¹ÖÇÒ ¼ö ÀÖ´Ù. + ±×·¯³ª ÀÏ¹Ý »ç¿ëÀÚ°¡ ÀÌ·± ¸ÊÀ» »ç¿ëÇÒ + ¼ö ÀÖ´Ù°í ÇÏ´õ¶ó°í, ¿ÀÁ÷ ½Ã½ºÅÛ °ü¸®ÀÚ¸¸ÀÌ ¸ÊÀ» + Á¤ÀÇÇØ¾ß ÇÔÀ» ÁÖÀÇÇ϶ó.

    +
    +
    + + + +
    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/misc/security_tips.html b/rubbos/app/httpd-2.0.64/docs/manual/misc/security_tips.html new file mode 100644 index 00000000..893872b5 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/misc/security_tips.html @@ -0,0 +1,13 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: security_tips.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: security_tips.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: security_tips.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/misc/security_tips.html.en b/rubbos/app/httpd-2.0.64/docs/manual/misc/security_tips.html.en new file mode 100644 index 00000000..560c8259 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/misc/security_tips.html.en @@ -0,0 +1,354 @@ + + + +Security Tips - Apache HTTP Server + + + + + +
    <-
    +

    Security Tips

    +
    +

    Available Languages:  en  | + ko  | + tr 

    +
    + +

    Some hints and tips on security issues in setting up a web server. + Some of the suggestions will be general, others specific to Apache.

    +
    + +
    top
    +
    +

    Keep up to Date

    + +

    The Apache HTTP Server has a good record for security and a + developer community highly concerned about security issues. But + it is inevitable that some problems -- small or large -- will be + discovered in software after it is released. For this reason, it + is crucial to keep aware of updates to the software. If you have + obtained your version of the HTTP Server directly from Apache, we + highly recommend you subscribe to the Apache + HTTP Server Announcements List where you can keep informed of + new releases and security updates. Similar services are available + from most third-party distributors of Apache software.

    + +

    Of course, most times that a web server is compromised, it is + not because of problems in the HTTP Server code. Rather, it comes + from problems in add-on code, CGI scripts, or the underlying + Operating System. You must therefore stay aware of problems and + updates with all the software on your system.

    + +
    top
    +
    +

    Permissions on ServerRoot Directories

    + + + +

    In typical operation, Apache is started by the root user, and it + switches to the user defined by the User directive to serve hits. As is the + case with any command that root executes, you must take care that it is + protected from modification by non-root users. Not only must the files + themselves be writeable only by root, but so must the directories, and + parents of all directories. For example, if you choose to place + ServerRoot in /usr/local/apache then it is suggested that + you create that directory as root, with commands like these:

    + +

    + mkdir /usr/local/apache
    + cd /usr/local/apache
    + mkdir bin conf logs
    + chown 0 . bin conf logs
    + chgrp 0 . bin conf logs
    + chmod 755 . bin conf logs +

    + +

    It is assumed that /, /usr, and + /usr/local are only modifiable by root. When you install the + httpd executable, you should ensure that it is + similarly protected:

    + +

    + cp httpd /usr/local/apache/bin
    + chown 0 /usr/local/apache/bin/httpd
    + chgrp 0 /usr/local/apache/bin/httpd
    + chmod 511 /usr/local/apache/bin/httpd +

    + +

    You can create an htdocs subdirectory which is modifiable by other + users -- since root never executes any files out of there, and shouldn't + be creating files in there.

    + +

    If you allow non-root users to modify any files that root either + executes or writes on then you open your system to root compromises. + For example, someone could replace the httpd binary so + that the next time you start it, it will execute some arbitrary code. If + the logs directory is writeable (by a non-root user), someone could replace + a log file with a symlink to some other system file, and then root + might overwrite that file with arbitrary data. If the log files + themselves are writeable (by a non-root user), then someone may be + able to overwrite the log itself with bogus data.

    + +
    top
    +
    +

    Server Side Includes

    + + + +

    Server Side Includes (SSI) present a server administrator with + several potential security risks.

    + +

    The first risk is the increased load on the server. All + SSI-enabled files have to be parsed by Apache, whether or not + there are any SSI directives included within the files. While this + load increase is minor, in a shared server environment it can become + significant.

    + +

    SSI files also pose the same risks that are associated with CGI + scripts in general. Using the exec cmd element, SSI-enabled + files can execute any CGI script or program under the permissions of the + user and group Apache runs as, as configured in + httpd.conf.

    + +

    There are ways to enhance the security of SSI files while still + taking advantage of the benefits they provide.

    + +

    To isolate the damage a wayward SSI file can cause, a server + administrator can enable suexec as + described in the CGI in General section.

    + +

    Enabling SSI for files with .html or .htm + extensions can be dangerous. This is especially true in a shared, or high + traffic, server environment. SSI-enabled files should have a separate + extension, such as the conventional .shtml. This helps keep + server load at a minimum and allows for easier management of risk.

    + +

    Another solution is to disable the ability to run scripts and + programs from SSI pages. To do this replace Includes + with IncludesNOEXEC in the Options directive. Note that users may + still use <--#include virtual="..." --> to execute CGI + scripts if these scripts are in directories designated by a ScriptAlias directive.

    + +
    top
    +
    +

    CGI in General

    + + + +

    First of all, you always have to remember that you must trust the + writers of the CGI scripts/programs or your ability to spot potential + security holes in CGI, whether they were deliberate or accidental. CGI + scripts can run essentially arbitrary commands on your system with the + permissions of the web server user and can therefore be extremely + dangerous if they are not carefully checked.

    + +

    All the CGI scripts will run as the same user, so they have potential + to conflict (accidentally or deliberately) with other scripts e.g. User + A hates User B, so he writes a script to trash User B's CGI database. One + program which can be used to allow scripts to run as different users is + suEXEC which is included with Apache as of + 1.2 and is called from special hooks in the Apache server code. Another + popular way of doing this is with + CGIWrap.

    + +
    top
    +
    +

    Non Script Aliased CGI

    + + + +

    Allowing users to execute CGI scripts in any directory should only be + considered if:

    + +
      +
    • You trust your users not to write scripts which will deliberately + or accidentally expose your system to an attack.
    • +
    • You consider security at your site to be so feeble in other areas, + as to make one more potential hole irrelevant.
    • +
    • You have no users, and nobody ever visits your server.
    • +
    + +
    top
    +
    +

    Script Aliased CGI

    + + + +

    Limiting CGI to special directories gives the admin control over what + goes into those directories. This is inevitably more secure than non + script aliased CGI, but only if users with write access to the + directories are trusted or the admin is willing to test each + new CGI script/program for potential security holes.

    + +

    Most sites choose this option over the non script aliased CGI + approach.

    + +
    top
    +
    +

    Other sources of dynamic content

    + + + +

    Embedded scripting options which run as part of the server itself, + such as mod_php, mod_perl, mod_tcl, + and mod_python, run under the identity of the server itself + (see the User directive), and + therefore scripts executed by these engines potentially can access + anything the server user can. Some scripting engines may provide + restrictions, but it is better to be safe and assume not.

    + +
    top
    +
    +

    Protecting System Settings

    + + + +

    To run a really tight ship, you'll want to stop users from setting + up .htaccess files which can override security features + you've configured. Here's one way to do it.

    + +

    In the server configuration file, put

    + +

    + <Directory />
    + AllowOverride None
    + </Directory> +

    + +

    This prevents the use of .htaccess files in all + directories apart from those specifically enabled.

    + +
    top
    +
    +

    Protect Server Files by Default

    + + + +

    One aspect of Apache which is occasionally misunderstood is the + feature of default access. That is, unless you take steps to change it, + if the server can find its way to a file through normal URL mapping + rules, it can serve it to clients.

    + +

    For instance, consider the following example:

    + +

    + # cd /; ln -s / public_html
    + Accessing http://localhost/~root/ +

    + +

    This would allow clients to walk through the entire filesystem. To + work around this, add the following block to your server's + configuration:

    + +

    + <Directory />
    + Order Deny,Allow
    + Deny from all
    + </Directory> +

    + +

    This will forbid default access to filesystem locations. Add + appropriate Directory blocks to + allow access only in those areas you wish. For example,

    + +

    + <Directory /usr/users/*/public_html>
    + Order Deny,Allow
    + Allow from all
    + </Directory>
    + <Directory /usr/local/httpd>
    + Order Deny,Allow
    + Allow from all
    + </Directory> +

    + +

    Pay particular attention to the interactions of Location and Directory directives; for instance, even + if <Directory /> denies access, a + <Location /> directive might overturn it.

    + +

    Also be wary of playing games with the UserDir directive; setting it to + something like ./ would have the same effect, for root, as + the first example above. If you are using Apache 1.3 or above, we strongly + recommend that you include the following line in your server + configuration files:

    + +

    + UserDir disabled root +

    + +
    top
    +
    +

    Watching Your Logs

    + + + +

    To keep up-to-date with what is actually going on against your server + you have to check the Log Files. Even though + the log files only reports what has already happened, they will give you + some understanding of what attacks is thrown against the server and + allow you to check if the necessary level of security is present.

    + +

    A couple of examples:

    + +

    + grep -c "/jsp/source.jsp?/jsp/ /jsp/source.jsp??" access_log
    + grep "client denied" error_log | tail -n 10 +

    + +

    The first example will list the number of attacks trying to exploit the + Apache Tomcat + Source.JSP Malformed Request Information Disclosure Vulnerability, + the second example will list the ten last denied clients, for example:

    + +

    + [Thu Jul 11 17:18:39 2002] [error] [client foo.bar.com] client denied + by server configuration: /usr/local/apache/htdocs/.htpasswd +

    + +

    As you can see, the log files only report what already has happened, so + if the client had been able to access the .htpasswd file you + would have seen something similar to:

    + +

    + foo.bar.com - - [12/Jul/2002:01:59:13 +0200] "GET /.htpasswd HTTP/1.1" +

    + +

    in your Access Log. This means + you probably commented out the following in your server configuration + file:

    + +

    + <Files ~ "^\.ht">
    + Order allow,deny
    + Deny from all
    + </Files> +

    + +
    +
    +

    Available Languages:  en  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/misc/security_tips.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/misc/security_tips.html.ko.euc-kr new file mode 100644 index 00000000..58c56f14 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/misc/security_tips.html.ko.euc-kr @@ -0,0 +1,345 @@ + + + +º¸¾È ÆÁ - Apache HTTP Server + + + + + +
    <-
    +

    º¸¾È ÆÁ

    +
    +

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

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

    À¥¼­¹ö¸¦ ¿î¿µÇÒ¶§ µµ¿òÀÌ µÉ º¸¾È °ü·Ã ÈùÆ®¿Í ÆÁÀÌ´Ù. + ¾î¶² °ÍÀº ÀϹÝÀûÀÌ°í, ¾î¶² °ÍÀº ¾ÆÆÄÄ¡¿¡¸¸ ÇØ´çÇÏ´Â °ÍÀÌ´Ù.

    +
    + +
    top
    +
    +

    ÃÖ½ÅÆÇÀ¸·Î À¯ÁöÇϱâ

    + +

    ¾ÆÆÄÄ¡ À¥¼­¹ö´Â ¾ÈÀü°ú º¸¾È ¹®Á¦¿¡ °ü½ÉÀÌ ¸¹Àº °³¹ßÀÚ + °øµ¿Ã¼·Î À¯¸íÇÏ´Ù. ±×·¯³ª Å©°Ç ÀÛ°Ç ¹ßÇ¥ÈÄ ¹ß°ßµÇ´Â ¹®Á¦µéÀ» + ÇÇÇÒ ¼ö ¾ø´Ù. ±×·¡¼­ ¼ÒÇÁÆ®¿þ¾î¸¦ ÃֽŹöÀüÀ¸·Î À¯ÁöÇÏ´Â + °ÍÀÌ Áß¿äÇÏ´Ù. ¾ÆÆÄÄ¡¿¡¼­ Á÷Á¢ À¥¼­¹ö¸¦ ´Ù¿î·ÎµåÇß´Ù¸é, + »õ·Î¿î ¹öÀü°ú º¸¾È ¾÷µ¥ÀÌÆ®¸¦ ¾Ë·ÁÁÖ´Â ¾ÆÆÄÄ¡ + À¥¼­¹ö ¹ßÇ¥ ¸ÞÀϸµ¸®½ºÆ®¸¦ ±¸µ¶ÇÏ±æ °­·ÂÈ÷ ±ÇÇÑ´Ù. + ¾ÆÆÄÄ¡ ¼ÒÇÁÆ®¿þ¾î¸¦ ¹èÆ÷ÇÏ´Â ¸¹Àº Á¦»ïÀڵ鵵 ºñ½ÁÇÑ ¼­ºñ½º¸¦ + Á¦°øÇÑ´Ù.

    + +

    ¹°·Ð À¥¼­¹ö Äڵ嶧¹®¿¡ À¥¼­¹ö°¡ °ø°ÝÀ» ´çÇÏ´Â °æ¿ì´Â + ¸¹Áö ¾Ê´Ù. ±×º¸´Ù Ãß°¡ ÄÚµå, CGI ½ºÅ©¸³Æ®, ÇÏÀ§ ¿î¿µÃ¼Á¦ÀÇ + ¹®Á¦·Î °ø°ÝÀ» ´çÇÏ´Â °æ¿ì°¡ ¸¹´Ù. ±×·¯¹Ç·Î Ç×»ó ÁÖÀÇÇϸç + ½Ã½ºÅÛÀÇ ¸ðµç ¼ÒÇÁÆ®¿þ¾î¸¦ ¾÷µ¥ÀÌÆ®ÇØ¾ß ÇÑ´Ù.

    + +
    top
    +
    +

    ServerRoot µð·ºÅ丮 ±ÇÇÑ

    + + + +

    º¸Åë root »ç¿ëÀÚ°¡ ¾ÆÆÄÄ¡¸¦ ½ÃÀÛÇÑ ÈÄ, ¿äûÀ» ¼­ºñ½ºÇϱâÀ§ÇØ + User Áö½Ã¾î·Î + ÁöÁ¤ÇÑ »ç¿ëÀÚ·Î º¯È¯ÇÑ´Ù. root°¡ ½ÇÇàÇÏ´Â ¸í·É¾î°¡ ÀÖ´Ù¸é, + root ÀÌ¿ÜÀÇ »ç¿ëÀÚ°¡ ¼öÁ¤ÇÏÁö ¸øÇϵµ·Ï ÁÖÀÇÇØ¾ß ÇÑ´Ù. ÀÌ + ÆÄÀϵéÀ» root¸¸ ¾µ ¼ö ÀÖ¾î¾ß ÇÏ°í, µð·ºÅ丮¿Í ¸ðµç »óÀ§µð·ºÅ丮µµ + ¸¶Âù°¡Áö´Ù. ¿¹¸¦ µé¾î, ServerRoot·Î /usr/local/apache¸¦ + »ç¿ëÇÑ´Ù¸é root »ç¿ëÀÚ°¡ ´ÙÀ½°ú °°ÀÌ µð·ºÅ丮¸¦ ¸¸µé±æ + Á¦¾ÈÇÑ´Ù:

    + +

    + mkdir /usr/local/apache
    + cd /usr/local/apache
    + mkdir bin conf logs
    + chown 0 . bin conf logs
    + chgrp 0 . bin conf logs
    + chmod 755 . bin conf logs +

    + +

    ±×·¯¸é /, /usr, /usr/local Àº root¸¸ÀÌ ¼öÁ¤ÇÒ ¼ö ÀÖ´Ù. + httpd ½ÇÇàÆÄÀÏÀ» ¼³Ä¡ÇÒ¶§ ´ÙÀ½°ú °°ÀÌ º¸È£ÇØ¾ß ÇÑ´Ù:

    + +

    + cp httpd /usr/local/apache/bin
    + chown 0 /usr/local/apache/bin/httpd
    + chgrp 0 /usr/local/apache/bin/httpd
    + chmod 511 /usr/local/apache/bin/httpd +

    + +

    htdocs ÇÏÀ§µð·ºÅ丮´Â ´Ù¸¥ »ç¿ëÀÚµéÀÌ ¼öÁ¤ÇÒ ¼ö ÀÖµµ·Ï + ¸¸µé ¼ö ÀÖ´Ù -- root´Â ±×°÷¿¡ ÀÖ´Â ÆÄÀÏÀ» ½ÇÇàÇÏÁöµµ, ¸¸µéÁöµµ + ¾Ê¾Æ¾ß ÇÑ´Ù.

    + +

    root°¡ ¾Æ´Ñ »ç¿ëÀÚ°¡ root°¡ ½ÇÇàÇϰųª ¾²±â°¡´ÉÇÑ ÆÄÀÏÀ» + ¼öÁ¤ÇÒ ¼ö ÀÖ´Ù¸é ½Ã½ºÅÛÀÇ root ±ÇÇÑÀ» ÈÉÄ¥ ¼ö ÀÖ´Ù. ¿¹¸¦ + µé¾î, ´©±º°¡ httpd ½ÇÇàÆÄÀÏÀ» º¯°æÇÏ¿´´Ù¸é ´ÙÀ½¹ø ½ÃÀÛÇÒ¶§ + ÀÓÀÇÀÇ Äڵ带 ½ÇÇàÇÏ°Ô µÈ´Ù. logs µð·ºÅ丮°¡ (root°¡ ¾Æ´Ñ + »ç¿ëÀÚ¿¡°Ô) ¾²±â°¡´ÉÇÏ´Ù¸é ´©±º°¡ ·Î±×ÆÄÀÏÀ» ´Ù¸¥ ½Ã½ºÅÛÆÄÀÏ·Î + ½Éº¼¸µÅ©¸¦ °É¾î¼­ root°¡ ÆÄÀÏ¿¡ ÀÓÀÇÀÇ ÀڷḦ µ¤¾î¾µ ¼ö + ÀÖ´Ù. ·Î±×ÆÄÀÏÀÌ (root°¡ ¾Æ´Ñ »ç¿ëÀÚ¿¡°Ô) ¾²±â°¡´ÉÇÏ´Ù¸é + ´©±º°¡ ·Î±×¿¡ ÀÌ»óÇÑ ÀڷḦ ±â·ÏÇÒ ¼ö ÀÖ´Ù.

    + +
    top
    +
    +

    Server Side Includes

    + + + +

    Server Side Includes (SSI)´Â ¼­¹ö °ü¸®ÀÚ¿¡°Ô º¸¾È»ó ¸î°¡Áö + ÀáÀçÀûÀÎ À§ÇèÀÌ´Ù.

    + +

    ù¹ø° À§ÇèÀº ¼­¹öÀÇ ºÎÇϸ¦ ´Ã¸®´Â Á¡ÀÌ´Ù. ¾ÆÆÄÄ¡´Â ÆÄÀÏ¿¡ + SSI Áö½Ã¾î°¡ ÀÖ´ÂÁö ¿©ºÎ¿Í °ü°è¾øÀÌ ¸ðµç SSI ÆÄÀÏÀ» ºÐ¼®ÇØ¾ß + ÇÑ´Ù. Á¶±Ý ºÎÇÏ°¡ ´ÃÁö¸¸, ¼­¹ö¸¦ ¿©·¯ »ç¶÷ÀÌ °°ÀÌ »ç¿ëÇÏ´Â + ȯ°æ¿¡¼­´Â ½É°¢ÇÒ ¼ö ÀÖ´Ù.

    + +

    ¶Ç, SSI ÆÄÀÏÀº ÀϹÝÀûÀÎ CGI ½ºÅ©¸³Æ®¿Í µ¿ÀÏÇÑ À§ÇèÀ» + °¡Áø´Ù. SSI ÆÄÀÏ¿¡¼­ "exec cmd"¸¦ »ç¿ëÇϸé httpd.conf¿¡¼­ + ¾ÆÆÄÄ¡¸¦ ½ÇÇàÇϵµ·Ï ¼³Á¤ÇÑ »ç¿ëÀÚ¿Í ±×·ì ±ÇÇÑÀ¸·Î CGI + ½ºÅ©¸³Æ®³ª ÇÁ·Î±×·¥À» ½ÇÇàÇÒ ¼ö ÀÖ´Ù.

    + +

    ÀåÁ¡À» È°¿ëÇϸ鼭 SSI ÆÄÀÏÀÇ º¸¾ÈÀ» Çâ»ó½ÃÅ°´Â ¹æ¹ýÀÌ + ÀÖ´Ù.

    + +

    SSI ÆÄÀÏÀÌ °¡Á®¿Ã ¼ö ÀÖ´Â ÇÇÇظ¦ °Ý¸®ÇϱâÀ§ÇØ ¼­¹ö°ü¸®ÀÚ´Â + ÀϹÝÀûÀÎ CGI Àý¿¡¼­ ¼³¸íÇÏ´Â ¹æ¹ýÀ¸·Î + suexec¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù

    + +

    .htmlÀ̳ª .htm È®ÀåÀÚ¸¦ SSI ÆÄÀÏ·Î »ç¿ëÇÏ´Â °ÍÀº À§ÇèÇÏ´Ù. + ƯÈ÷ ¿©·¯ »ç¶÷ÀÌ °øÀ¯Çϰųª Åë½Å·®ÀÌ ¸¹Àº ¼­¹ö ȯ°æ¿¡¼­ + À§ÇèÇÏ´Ù. SSI ÆÄÀÏÀº ÀϹÝÀûÀ¸·Î ¸¹ÀÌ »ç¿ëÇÏ´Â .shtml °°Àº + º°µµÀÇ È®ÀåÀÚ¸¦ °¡Á®¾ß ÇÑ´Ù. ±×·¯¸é ¼­¹ö ºÎÇϸ¦ ÃÖ¼ÒÈ­ÇÏ°í + À§Çè¿ä¼Ò¸¦ ½±°Ô °ü¸®ÇÒ ¼ö ÀÖ´Ù.

    + +

    ´Ù¸¥ ¹æ¹ýÀº SSI ÆäÀÌÁö°¡ ½ºÅ©¸³Æ®³ª ÇÁ·Î±×·¥À» ½ÇÇàÇÏÁö + ¸øÇϵµ·Ï ¸¸µå´Â °ÍÀÌ´Ù. Options Áö½Ã¾î¿¡¼­ Includes + ´ë½Å IncludesNOEXEC¸¦ »ç¿ëÇÑ´Ù. ±×·¡µµ ½ºÅ©¸³Æ®°¡ + ScriptAlias Áö½Ã¾î·Î + ÁöÁ¤ÇÑ µð·ºÅ丮¿¡ ÀÖ´Ù¸é <--#include virtual="..." -->¸¦ + »ç¿ëÇÏ¿© CGI ½ºÅ©¸³Æ®¸¦ ½ÇÇàÇÒ ¼ö ÀÖÀ½À» ÁÖÀÇÇ϶ó.

    + +
    top
    +
    +

    ÀϹÝÀûÀÎ CGI

    + + + +

    °á±¹ ´ç½ÅÀº Ç×»ó CGI ½ºÅ©¸³Æ®/ÇÁ·Î±×·¥ÀÇ ÀúÀÚ¸¦ ½Å·ÚÇØ¾ß + ÇÏ°í, °íÀÇ°Ç ½Ç¼öÀÌ°Ç CGIÀÇ ÀáÀçÀûÀÎ º¸¾È»ó ÇãÁ¡À» ¹ß°ßÇÒ + ¼ö ÀÖ¾î¾ß ÇÑ´Ù. ±âº»ÀûÀ¸·Î CGI ½ºÅ©¸³Æ®´Â À¥¼­¹ö »ç¿ëÀÚ + ±ÇÇÑÀ¸·Î ½Ã½ºÅÛ¿¡¼­ ¾î¶² ¸í·É¾î¶óµµ ½ÇÇàÇÒ ¼ö Àֱ⶧¹®¿¡ + ÁÖÀÇÀÖ°Ô È®ÀÎÇÏÁö ¾ÊÀ¸¸é ¸Å¿ì À§ÇèÇÏ´Ù.

    + +

    ¸ðµç CGI ½ºÅ©¸³Æ®°¡ °°Àº »ç¿ëÀÚ·Î ½ÇÇàµÇ±â¶§¹®¿¡ ´Ù¸¥ + ½ºÅ©¸³Æ®¿Í (°íÀÇ°Ç ½Ç¼öÀÌ°Ç) Ãæµ¹ÇÒ °¡´É¼ºÀÌ ÀÖ´Ù. ¿¹¸¦ + µé¾î, »ç¿ëÀÚ A´Â »ç¿ëÀÚ B¸¦ ¸Å¿ì ½È¾îÇÏ¿©, »ç¿ëÀÚ BÀÇ CGI + µ¥ÀÌÅͺ£À̽º¸¦ Áö¿ö¹ö¸®´Â ½ºÅ©¸³Æ®¸¦ ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù. ¾ÆÆÄÄ¡ + 1.2 ¹öÀüºÎÅÍ Æ÷ÇԵǾú°í ¾ÆÆÄÄ¡ ¼­¹ö¿¡¼­ Ưº°ÇÑ ÈÅ(hook)À¸·Î + µ¿ÀÛÇÏ´Â suEXEC´Â ½ºÅ©¸³Æ®¸¦ + ´Ù¸¥ »ç¿ëÀÚ·Î ½ÇÇàÇÏ´Â ¹æ¹ýÁß Çϳª´Ù. ´Ù¸¥ ´ëÁßÀûÀÎ ¹æ¹ý¿¡´Â + CGIWrapÀÌ ÀÖ´Ù.

    + +
    top
    +
    +

    ScriptAliasÇÏÁö ¾ÊÀº CGI

    + + + +

    ´ÙÀ½ Á¶°ÇÀ» ¸¸Á·ÇÒ¶§¸¸ »ç¿ëÀÚ°¡ ¾î¶² µð·ºÅ丮¿¡¼­¶óµµ + CGI ½ºÅ©¸³Æ®¸¦ ½ÇÇàÇϵµ·Ï Çã¿ëÇÒ ¼ö ÀÖ´Ù:

    + +
      +
    • ´ç½ÅÀº °íÀÇ°Ç ½Ç¼öÀÌ°Ç »ç¿ëÀÚ°¡ ½Ã½ºÅÛÀ» °ø°Ý¿¡ ³ëÃâ½ÃÅ°´Â + ½ºÅ©¸³Æ®¸¦ ÀÛ¼ºÇÏÁö ¾Ê´Â´Ù°í ¹Ï´Â´Ù.
    • +
    • ½Ã½ºÅÛÀÇ ´Ù¸¥ ºÎºÐÀÇ º¸¾ÈÀÌ ¾àÇؼ­, ÀáÀçÀûÀÎ ÇãÁ¡À» + Çϳª ´õ ¸¸µé¾îµµ ³ªºüÁú °ÍÀÌ ¾ø´Ù°í »ý°¢ÇÏ´Â °æ¿ì.
    • +
    • »ç¿ëÀÚ°¡ ¾ø°í, ¾Æ¸¶ ¾Æ¹«µµ ¼­¹ö¸¦ ¹æ¹®ÇÏÁö¾Ê´Â °æ¿ì.
    • +
    + +
    top
    +
    +

    ScriptAliasÇÑ CGI

    + + + +

    ƯÁ¤ µð·ºÅ丮¿¡¼­¸¸ CGI¸¦ ½ÇÇàÇÒ ¼ö ÀÖµµ·Ï Á¦ÇÑÇÏ¸é °ü¸®ÀÚ´Â + ÀÌµé µð·ºÅ丮¸¦ ÅëÁ¦ÇÒ ¼ö ÀÖ´Ù. ÀÌ °æ¿ì´Â scriptaliasÇÏÁö + ¾ÊÀº CGIº¸´Ù È®½ÇÈ÷ ¾ÈÀüÇÏ´Ù. ´Ü, ½Å·ÚÇÏ´Â »ç¿ëÀÚ¸¸ µð·ºÅ丮¿¡ + Á¢±ÙÇÒ ¼ö ÀÖ°í, °ü¸®ÀÚ°¡ »õ·Î¿î CGI ½ºÅ©¸³Æ®/ÇÁ·Î±×·¥ÀÇ + ÀáÀçÀûÀÎ º¸¾È»ó ÇãÁ¡À» °Ë»çÇÒ ¿ëÀÌ°¡ ÀÖ´Ù¸é.

    + +

    ´ëºÎºÐÀÇ »çÀÌÆ®´Â scriptaliasÇÏÁö ¾ÊÀº CGI ¹æ½Ä ´ë½Å + ÀÌ ¹æ½ÄÀ» »ç¿ëÇÑ´Ù.

    + +
    top
    +
    +

    µ¿Àû ³»¿ëÀ» »ý¼ºÇÏ´Â ´Ù¸¥ ¹æ¹ý

    + + + +

    + mod_php, mod_perl, mod_tcl, mod_python °°ÀÌ ¼­¹öÀÇ ÀϺηΠ+ µ¿ÀÛÇÏ´Â ÀÓº£µðµå ½ºÅ©¸³Æ®´Â ¼­¹ö¿Í °°Àº »ç¿ëÀÚ·Î (User Áö½Ã¾î Âü°í) ½ÇÇàµÇ±â¶§¹®¿¡, + ½ºÅ©¸³Æ® ¿£ÁøÀÌ ½ÇÇàÇÏ´Â ½ºÅ©¸³Æ®´Â ÀáÀçÀûÀ¸·Î ¼­¹ö »ç¿ëÀÚ°¡ + Á¢±ÙÇÒ ¼ö ÀÖ´Â ¸ðµç °Í¿¡ Á¢±ÙÇÒ ¼ö ÀÖ´Ù. ¾î¶² ½ºÅ©¸³Æ® ¿£ÁøÀº + ¾î´ÀÁ¤µµ Á¦ÇÑÀ» ÇÏÁö¸¸, ¾ÈÀüÇÏ´Ù°í °¡Á¤ÇÏÁö ¾Ê´Â °ÍÀÌ ÁÁ´Ù.

    + +
    top
    +
    +

    ½Ã½ºÅÛ ¼³Á¤ º¸È£Çϱâ

    + + + +

    Á¤¸»·Î ¾ÈÀüÇÑ ¼­¹ö¸¦ ¿î¿µÇÏ·Á¸é »ç¿ëÀÚ°¡ + .htaccess ÆÄÀÏÀ» »ç¿ëÇÏ¿© ´ç½ÅÀÌ ¼³Á¤ÇÑ º¸¾È±â´ÉÀ» + º¯°æÇÏ±æ ¹Ù¶óÁö ¾ÊÀ» °ÍÀÌ´Ù. ±×·¯±âÀ§ÇØ ´ÙÀ½°ú °°Àº ¹æ¹ýÀÌ + ÀÖ´Ù.

    + +

    ¼­¹ö ¼³Á¤ÆÄÀÏ¿¡ ´ÙÀ½À» Ãß°¡ÇÑ´Ù

    + +

    + <Directory />
    + AllowOverride None
    + </Directory> +

    + +

    ±×·¯¸é »ç¿ë°¡´ÉÇϵµ·Ï ¸í½ÃÀûÀ¸·Î Çã¿ëÇÑ µð·ºÅ丮¸¦ Á¦¿ÜÇÏ°í´Â + .htaccess ÆÄÀÏÀ» »ç¿ëÇÒ ¼ö ¾ø´Ù.

    + +
    top
    +
    +

    ±âº»ÀûÀ¸·Î ¼­¹ö¿¡ ÀÖ´Â ÆÄÀÏ º¸È£Çϱâ

    + + + +

    »ç¶÷µéÀº Á¾Á¾ ¾ÆÆÄÄ¡ÀÇ ±âº» Á¢±Ù¿¡ ´ëÇØ À߸ø ¾Ë°íÀÖ´Ù. + Áï, ¼­¹ö°¡ ÀϹÝÀûÀÎ URL ´ëÀÀ ±ÔÄ¢À» »ç¿ëÇÏ¿© ÆÄÀÏÀ» ãÀ» + ¼ö ÀÖ´Ù¸é, Ưº°È÷ Á¶Ä¡¸¦ ÇÏÁö ¾Ê´ÂÇÑ Å¬¶óÀ̾ðÆ®¿¡°Ô ÆÄÀÏÀÌ + ¼­ºñ½ºµÉ ¼ö ÀÖ´Ù.

    + +

    ¿¹¸¦ µé¾î, ¾Æ·¡¿Í °°Àº °æ¿ì:

    + +

    + # cd /; ln -s / public_html
    + http://localhost/~root/ ¿¡ Á¢±ÙÇÑ´Ù +

    + +

    ±×·¯¸é Ŭ¶óÀ̾ðÆ®´Â Àüü ÆÄÀϽýºÅÛÀ» µ¹¾Æ´Ù´Ò ¼ö ÀÖ´Ù. + À̸¦ ¸·±âÀ§ÇØ ¼­¹ö¼³Á¤¿¡¼­ ´ÙÀ½°ú °°Àº Á¶Ä¡¸¦ ÇÑ´Ù:

    + +

    + <Directory />
    + Order Deny,Allow
    + Deny from all
    + </Directory> +

    + +

    ±×·¯¸é ÆÄÀϽýºÅÛ À§Ä¡¿¡ ´ëÇØ ±âº» Á¢±ÙÀÌ °ÅºÎµÈ´Ù. + ¿øÇÏ´Â ¿µ¿ª¿¡ Á¢±ÙÇÒ ¼ö ÀÖµµ·Ï ´ÙÀ½°ú °°Àº Directory ºí·ÏÀ» Ãß°¡ÇÑ´Ù.

    + +

    + <Directory /usr/users/*/public_html>
    + Order Deny,Allow
    + Allow from all
    + </Directory>
    + <Directory /usr/local/httpd>
    + Order Deny,Allow
    + Allow from all
    + </Directory> +

    + +

    Location°ú Directory Áö½Ã¾î¸¦ °°ÀÌ »ç¿ëÇÏ´Â + °æ¿ì Ưº°È÷ ÁÖÀǸ¦ ±â¿ï¿©¶ó. ¿¹¸¦ µé¾î, <Directory + />°¡ Á¢±ÙÀ» °ÅºÎÇÏ´õ¶óµµ <Location + /> Áö½Ã¾î°¡ À̸¦ ¹«½ÃÇÒ ¼ö ÀÖ´Ù

    + +

    UserDir Áö½Ã¾î¸¦ + »ç¿ëÇÏ´Â °æ¿ì¿¡µµ ÁÖÀÇÇ϶ó. Áö½Ã¾î¸¦ "./" °°ÀÌ ¼³Á¤Çϸé + root »ç¿ëÀÚ¿¡ ´ëÇØ ¹Ù·Î À§ÀÇ °æ¿ì¿Í °°Àº ¹®Á¦°¡ ¹ß»ýÇÑ´Ù. + ¾ÆÆÄÄ¡ 1.3 ÀÌ»óÀ» »ç¿ëÇÑ´Ù¸é ¼­¹ö ¼³Á¤ÆÄÀÏ¿¡ ¾Æ·¡ ÁÙÀ» Ãß°¡Çϱæ + °­·ÂÈ÷ ±ÇÇÑ´Ù:

    + +

    + UserDir disabled root +

    + +
    top
    +
    +

    ·Î±× »ìÆ캸±â

    + + + +

    ½ÇÁ¦·Î ¼­¹ö¿¡¼­ ¹«½¼ ÀÏÀÌ À־°í ÀÖ´ÂÁö ¾Ë·Á¸é ·Î±×ÆÄÀÏÀ» »ìÆìºÁ¾ß ÇÑ´Ù. ·Î±×ÆÄÀÏÀº + ÀÌ¹Ì ÀϾ Àϸ¸À» º¸°íÇÏÁö¸¸, ¼­¹ö¿¡ ¾î¶² °ø°ÝÀÌ ÀÖ¾ú´ÂÁö + ¾Ë·ÁÁÖ°í ÇöÀç ÇÊ¿äÇÑ ¸¸Å­ ¾ÈÀüÇÑÁö È®ÀÎÇÏ°Ô ÇØÁØ´Ù.

    + +

    ¿©·¯°¡Áö ¿¹:

    + +

    + grep -c "/jsp/source.jsp?/jsp/ /jsp/source.jsp??" access_log
    + grep "client denied" error_log | tail -n 10 +

    + +

    ù¹ø° ¿¹´Â À߸øµÈ + Source.JSP ¿äûÀ¸·Î ¼­¹öÁ¤º¸¸¦ ¾Ë¾Æ³¾ ¼ö ÀÖ´Â TomcatÀÇ + Ãë¾àÁ¡¸¦ ÀÌ¿ëÇÏ·Á´Â °ø°Ý Ƚ¼ö¸¦ ¾Ë·ÁÁÖ°í, µÎ¹ø° ¿¹´Â + Á¢±ÙÀÌ °ÅºÎµÈ Ãֱ٠Ŭ¶óÀ̾ðÆ® 10°³¸¦ ´ÙÀ½°ú °°ÀÌ º¸¿©ÁØ´Ù:

    + +

    + [Thu Jul 11 17:18:39 2002] [error] [client foo.bar.com] client denied + by server configuration: /usr/local/apache/htdocs/.htpasswd +

    + +

    Àß ¾Ë µíÀÌ ·Î±×ÆÄÀÏÀº ÀÌ¹Ì ¹ß»ýÇÑ »ç°Ç¸¸À» º¸°íÇÑ´Ù. + ±×·¡¼­ Ŭ¶óÀ̾ðÆ®°¡ .htpasswd ÆÄÀÏ¿¡ Á¢±ÙÇÒ + ¼ö ÀÖ¾ú´Ù¸é Á¢±Ù ·Î±×¿¡ + ´ÙÀ½°ú °°Àº ±â·ÏÀÌ ³²À» °ÍÀÌ´Ù:

    + +

    + foo.bar.com - - [12/Jul/2002:01:59:13 +0200] "GET /.htpasswd HTTP/1.1" +

    + +

    Áï, ´ç½ÅÀº ¼­¹ö ¼³Á¤ÆÄÀÏ¿¡¼­ ´ÙÀ½ ºÎºÐÀ» ÁÖ¼®Ã³¸®ÇßÀ» + °ÍÀÌ´Ù:

    + +

    + <Files ~ "^\.ht">
    + Order allow,deny
    + Deny from all
    + <Files> +

    + +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/misc/security_tips.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/misc/security_tips.html.tr.utf8 new file mode 100644 index 00000000..7257521f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/misc/security_tips.html.tr.utf8 @@ -0,0 +1,344 @@ + + + +Güvenlik İpuçları - Apache HTTP Sunucusu + + + + + +
    <-
    +

    Güvenlik İpuçları

    +
    +

    Mevcut Diller:  en  | + ko  | + tr 

    +
    + +

    Bir HTTP Sunucusunu ayarlarken dikkat edilmesi gerekenler ve bazı + ipuçları. Öneriler kısmen Apache’ye özel kısmen de genel olacaktır.

    +
    + +
    top
    +
    +

    Güncel Tutma

    + +

    Apache HTTP Sunucusu iyi bir güvenlik sicilinin yanında güvenlik + konularıyla oldukça ilgili bir geliştirici topluluğuna sahiptir. Fakat, + bir yazılımın dağıtılmasının ardından küçük ya da büyük bazı sorunların + keşfedilmesi kaçınılmazdır. Bu sebeple, yazılım güncellemelerinden + haberdar olmak oldukça önem kazanır. HTTP sunucunuzu doğrudan + Apache’den temin ediyorsanız yeni sürümler ve güvenlik güncellemeleri + ile ilgili bilgileri tam zamanında alabilmek için Apache + HTTP Sunucusu Duyuru Listesine mutlaka üye olmanızı öneririz. + Apache yazılımının üçüncü parti dağıtımlarını yapanların da buna benzer + hizmetleri vardır.

    + +

    Şüphesiz, bir HTTP sunucusu, sunucu kodunda bir sorun olmasa da + tehlike altındadır. Eklenti kodları, CGI betikleri hatta işletim + sisteminden kaynaklanan sorunlar nedeniyle bu ortaya çıkabilir. Bu + bakımdan, sisteminizdeki tüm yazılımların sorunları ve güncellemeleri + hakkında bilgi sahibi olmalısınız.

    + +
    top
    +
    +

    ServerRoot Dizinlerinin Ä°zinleri

    + + +

    Normalde, Apache root kullanıcı tarafından başlatılır ve hizmetleri + sunarken User yönergesi + tarafından tanımlanan kullanıcının aidiyetinde çalışır. Root tarafından + çalıştırılan komutlarda olduğu gibi, root olmayan kullanıcıların + yapacakları değişikliklerden korunmak konusunda da dikkatli + olmalısınız. Dosyaların sadece root tarafından yazılabilir olmasını + sağlamak yeterli değildir, bu dizinler ve üst dizinler için de + yapılmalıdır. Örneğin, sunucu kök dizininin + /usr/local/apache olmasına karar verdiyseniz, bu dizini + root olarak şöyle oluşturmanız önerilir:

    + +

    + mkdir /usr/local/apache
    + cd /usr/local/apache
    + mkdir bin conf logs
    + chown 0 . bin conf logs
    + chgrp 0 . bin conf logs
    + chmod 755 . bin conf logs +

    + +

    /, /usr, /usr/local + dizinlerinde sadece root tarafından değişiklik yapılabileceği kabul + edilir. httpd çalıştırılabilirini kurarken de benzer + bir önlemin alındığından emin olmalısınız:

    + +

    + cp httpd /usr/local/apache/bin
    + chown 0 /usr/local/apache/bin/httpd
    + chgrp 0 /usr/local/apache/bin/httpd
    + chmod 511 /usr/local/apache/bin/httpd +

    + +

    Diğer kullanıcıların değişiklik yapabileceği bir dizin olarak bir + htdocs dizini oluşturabilirsiniz. Bu dizine root + tarafından çalıştırılabilecek dosyalar konulmamalı ve burada root + tarafından hiçbir dosya oluşturulmamalıdır.

    + +

    Diğer kullanıcılara root tarafından yazılabilen ve çalıştırılabilen + dosyalarda değişiklik yapma hakkını tanırsanız, onlara root + kullanıcısını ele geçirilebilme hakkını da tanımış olursunuz. Örneğin, + biri httpd çalıştırılabilirini zararlı bir programla + değiştirebilir ve o programı tekrar çalıştırdığınız sırada program + yapacağını yapmış olur. Günlükleri kaydettiğiniz dizin herkes + tarafından yazılabilen bir dizin olduğu takdirde, birileri bir günlük + dosyasını bir sistem dosyasına sembolik bağ haline getirerek root + kullanıcısının bu dosyaya ilgisiz şeyler yazmasına sebep olabilir. + Günlüklerin dosyaları herkes tarafından yazılabilir olduğu takdirde ise + birileri dosyaya yanıltıcı veriler girebilir.

    +
    top
    +
    +

    Sunucu Taraflı İçerik Yerleştirme

    + + +

    SSI sayfaları bir sunucu yöneticisi açısından çeşitli olası risklere + kaynaklık edebilir.

    + +

    İlk risk, sunucu yükündeki artış olasılığıdır. Tüm SSI sayfaları, SSI + kodu içersin içermesin Apache tarafından çözümlenir. Bu küçük bir artış + gibi görünürse de bir paylaşımlı sunucu ortamında önemli bir yük haline + gelebilir.

    + +

    SSI sayfaları, CGI betikleriyle ilgili riskleri de taşır. exec + cmd elemanı kullanılarak bir SSI sayfasından herhangi bir CGI + betiğini veya bir sistem programını Apache’nin aidiyetinde olduğu + kullanıcının yetkisiyle çalıştırmak mümkündür.

    + +

    SSI sayfalarının yararlı özelliklerinden yararlanırken güvenliğini de + arttırmanın bazı yolları vardır.

    + +

    Sunucu yöneticisi, bir başıbozuk SSI sayfasının sebep olabileceği + zararları bertaraf etmek için CGI Genelinde + bölümünde açıklandığı gibi suexec’i etkin + kılabilir.

    + +

    SSI sayfalarını .html veya .htm + uzantılarıyla etkinleştirmek tehlikeli olabilir. Bu özellikle + paylaşımlı ve yüksek trafikli bir sunucu ortamında önemlidir. SSI + sayfalarını normal sayfalardan farklı olarak .shtml gibi + bildik bir uzantıyla etkinleştirmek gerekir. Bu, sunucu yükünü asgari + düzeyde tutmaya ve risk yönetimini kolaylaştırmaya yarar.

    + +

    Diğer bir çözüm de SSI sayfalarından betik ve program çalıştırmayı + iptal etmektir. Bu, Options + yönergesine değer olarak Includes yerine + IncludesNOEXEC vererek sağlanır. Ancak, eğer betiklerin + bulunduğu dizinde ScriptAlias + yönergesiyle CGI betiklerinin çalışması mümkün kılınmışsa, + kullanıcıların <--#include virtual="..." --> ile bu + betikleri çalıştırabileceklerine dikkat ediniz.

    + +
    top
    +
    +

    CGI Genelinde

    + + +

    Herşeyden önce ya CGI betiğini/programını yazanlara ya da kendinizin + CGI'deki güvenlik açıklarını (ister kasıtlı olsun ister tesadüfi) + yakalama becerinize güvenmek zorundasınız. CGI betikleri esasen + sisteminizdeki komutları site kullanıcılarının izinleriyle + çalıştırırlar. Bu bakımdan dikkatle denenmedikleri takdirde oldukça + tehlikeli olabilirler.

    + +

    CGI betiklerinin hepsi aynı kullanıcının aidiyetinde çalışırsa diğer + betiklerle aralarında çelişkilerin ortaya çıkması ister istemez + kaçınılmazdır. Örneğin A kullanıcısının B kullanıcısına garezi varsa + bir betik yazıp B’nin CGI veritabanını silebilir. Bu gibi durumların + ortaya çıkmaması için betiklerin farklı kullanıcıların aidiyetlerinde + çalışmasını sağlayan ve 1.2 sürümünden beri Apache ile dağıtılan suEXEC diye bir program vardır. Başka bir yol + da CGIWrap kullanmaktır.

    + +
    top
    +
    +

    ScriptAlias’sız CGI

    + + +

    Kullanıcıların sitenin her yerinde CGI betiklerini çalıştırmalarına + izin vermek ancak şu koşullarda mümkün olabilir:

    + +
      +
    • Kullanıcılarınızın kasıtlı ya da kasıtsız sistemi saldırıya açık + hale getirecek betikler yazmayacaklarına tam güveniniz vardır.
    • +
    • Sitenizin güvenliği zaten o kadar kötüdür ki, bir delik daha + açılmasının mahzuru yoktur.
    • +
    • Sitenizin sizden başka kullanıcısı yoktur ve sunucunuzu sizden + başka hiç kimsenin ziyaret etmesi mümkün değildir.
    • +
    + +
    top
    +
    +

    ScriptAlias’lı CGI

    + + +

    CGI’yi belli dizinlerle sınırlamak yöneticiye bu dizinlerde daha iyi + denetim imkanı sağlar. Bu kaçınılmaz olarak ScriptAlias’sız CGI’den çok daha + güvenlidir, ancak bu dizinlere yazma hakkı olan kullanıcılarınız + güvenilir kişiler olması ve site yöneticisinin de olası güvenlik + açıklarına karşı CGI betiklerini ve programlarını denemeye istekli + olması şartıyla.

    + +

    Çoğu site yöneticisi ScriptAlias’sız CGI yerine bu + yaklaşımı seçer.

    + +
    top
    +
    +

    Devingen içerikli kaynaklar

    + + +

    Sunucunun bir parçası gibi çalışan, mod_php, + mod_perl, mod_tcl ve mod_python + gibi gömülü betik çalıştırma seçenekleri sunucuyu çalıştıran + kullanıcının aidiyetinde çalışırlar (User yönergesine bakınız). Bu bakımdan bu betik + yorumlayıcılar tarafından çalıştırılan betikler, sunucu kullanıcısının + eriştiği herşeye erişebilirler. Bazı betik yorumlayıcıların getirdiği + bazı sınırlamalar varsa da bunlara pek güvenmemek, gerekli sınamaları + yine de yapmak gerekir.

    + +
    top
    +
    +

    Sistem Ayarlarının Korunması

    + + +

    Güvenliği gerçekten sıkı tutmak istiyorsanız, kullanıcılarınızın + yapılandırmanızdaki güvenlik ayarlarını geçersiz kılmak için + .htaccess dosyalarını kullanabilmelerinin de önüne + geçmelisiniz. Bunu yapmanın tek bir yolu vardır.

    + +

    Sunucu yapılandırma dosyanıza şunu yerleştirin:

    + +

    + <Directory /> + + AllowOverride None + + </Directory> +

    + +

    Böylece, belli dizinlerde özellikle etkinleştirilmedikçe bütün + dizinlerde .htaccess dosyalarının kullanımını engellemiş + olursunuz.

    + +
    top
    +
    +

    Sunucu dosyalarının öntanımlı olarak korunması

    + + +

    Apache’nin ister istemez yanlış anlaşılan yönlerinden biri öntanımlı erişim özelliğidir. Yani siz aksine bir şeyler yapmadıkça, sunucu normal URL eşleme kurallarını kullanarak bir dosyayı bulabildiği sürece onu istemciye sunacaktır.

    + +

    Örneğin, aşağıdaki durumu ele alalım:

    + +

    + # cd /; ln -s / public_html +

    + +

    Ve, tarayıcınıza http://localhost/~root/ yazın.

    + +

    Böylece, istemcilerin tüm dosya sisteminizi gezmelerine izin vermiş olursunuz. Bu işlemin sonuçlarının önünü almak için sunucu yapılandırma dosyanıza şunları yazın:

    + +

    + <Directory /> + + Order Deny,Allow
    + Deny from all +
    + </Directory> +

    + +

    Bu suretle, dosya sisteminize öntanımlı erişimi yasaklamış olursunuz. Erişime izin vermek istediğiniz dizinler için uygun Directory bölümleri eklemeniz yeterli olacaktır. Örnek:

    + +

    + <Directory /usr/users/*/public_html> + + Order Deny,Allow
    + Allow from all +
    + </Directory>
    + <Directory /usr/local/httpd> + + Order Deny,Allow
    + Allow from all +
    + </Directory> +

    + +

    Location ve Directory yönergelerinin etkileşimine de özellikle önem vermelisiniz; örneğin <Directory /> erişimi yasaklarken bir <Location /> yönergesi bunu ortadan kaldırabilir.

    + +

    UserDir yönergesi de size buna benzer bir oyun oynayabilir; yönergeye ./ atamasını yaparsanız, root kullanıcısı söz konusu olduğunda yukarıda ilk örnekteki durumla karşılaşırız. Apache 1.3 veya üstünü kullanıyorsanız, sunucu yapılandırma dosyanızda aşağıdaki satırın mutlaka bulunmasını öneririz:

    + +

    + UserDir disabled root +

    + +
    top
    +
    +

    Günlüklerin İzlenmesi

    + + +

    Sunucunuzda olup biteni günü gününe bilmek istiyorsanız günlük dosyalarına bakmalısınız. Günlük dosyaları sadece olup biteni raporlamakla kalmaz, sunucunuza ne tür saldırılar yapıldığını ve güvenlik seviyenizin yeterli olup olmadığını anlamanızı da sağlarlar.

    + +

    Bazı örnekler:

    + +

    + grep -c "/jsp/source.jsp?/jsp/ /jsp/source.jsp??" access_log
    + grep "client denied" error_log | tail -n 10 +

    + +

    İlk örnek, Apache Tomcat + Source.JSP Bozuk İstek Bilgilerini İfşa Açığını istismar etmeyi deneyen saldırıların sayısını verirken ikinci örnek, reddedilen son on istemciyi listeler; örnek:

    + +

    + [Thu Jul 11 17:18:39 2002] [error] [client falan.filan.dom] client denied + by server configuration: /usr/local/apache/htdocs/.htpasswd +

    + +

    Gördüğünüz gibi günlük dosyaları sadece ne olup bittiğini raporlar, bu bakımdan eğer istemci .htpasswd dosyasına erişebiliyorsa erişim günlüğünüzde şuna benzer bir kayıt görürsünüz:

    + +

    + falan.filan.dom - - [12/Jul/2002:01:59:13 +0200] "GET /.htpasswd HTTP/1.1" +

    + +

    Bu, sunucu yapılandırma dosyanızda aşağıdaki yapılandırmayı iptal ettiğiniz anlamına gelir:

    + +

    + <Files ~ "^\.ht"> + + Order allow,deny
    + Deny from all +
    + </Files> +

    + +
    +
    +

    Mevcut Diller:  en  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/misc/tutorials.html b/rubbos/app/httpd-2.0.64/docs/manual/misc/tutorials.html new file mode 100644 index 00000000..e17505c2 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/misc/tutorials.html @@ -0,0 +1,5 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: tutorials.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/misc/tutorials.html.en b/rubbos/app/httpd-2.0.64/docs/manual/misc/tutorials.html.en new file mode 100644 index 00000000..0b9f2d12 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/misc/tutorials.html.en @@ -0,0 +1,211 @@ + + + +Apache Tutorials - Apache HTTP Server + + + + + +
    <-
    +

    Apache Tutorials

    +
    +

    Available Languages:  en 

    +
    + + +

    Warning:

    +

    This document has not been fully 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.

    +
    + +

    The following documents give you step-by-step instructions + on how to accomplish common tasks with the Apache HTTP server. + Many of these documents are located at external sites and are + not the work of the Apache Software Foundation. Copyright to + documents on external sites is owned by the authors or their + assignees. Please consult the official Apache + Server documentation to verify what you read on external + sites.

    + +
    + +
    top
    +
    top
    +
    +

    Basic Configuration

    + + + + +
    top
    +
    top
    +
    +

    Logging

    + + + + +
    top
    +
    +

    CGI and SSI

    + + + + +
    top
    +
    +

    Other Features

    + + + + + +

    If you have a pointer to an accurate and well-written + tutorial not included here, please let us know by submitting it + to the Apache Bug + Database.

    +
    +
    +

    Available Languages:  en 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/beos.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/beos.html new file mode 100644 index 00000000..1bb91b93 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/beos.html @@ -0,0 +1,17 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: beos.html.de +Content-Language: de +Content-type: text/html; charset=ISO-8859-1 + +URI: beos.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: beos.html.es +Content-Language: es +Content-type: text/html; charset=ISO-8859-1 + +URI: beos.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/beos.html.de b/rubbos/app/httpd-2.0.64/docs/manual/mod/beos.html.de new file mode 100644 index 00000000..c7934981 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/beos.html.de @@ -0,0 +1,109 @@ + + + +beos - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache-MPM beos

    +
    +

    Verfügbare Sprachen:  de  | + en  | + es  | + ko 

    +
    + + + +
    Beschreibung:Dieses Multi-Processing-Modul ist für BeOS + optimiert.
    Status:MPM
    Modulbezeichner:mpm_beos_module
    Quelltext-Datei:beos.c
    +

    Zusammenfassung

    + +

    Dieses Multi-Processing-Modul (MPM) ist das Standardmodul für BeOS. + Es benutzt einen einzelnen Steuerprozess welcher Threads für die + Bedienung der Anfragen erzeugt.

    +
    + + +
    top
    +

    MaxRequestsPerThread-Direktive

    + + + + + + + +
    Beschreibung:Die maximale Anzahl von Anfragen, die ein einzelner Thread + während seiner Lebensdauer bedient.
    Syntax:MaxRequestsPerThread Anzahl
    Voreinstellung:MaxRequestsPerThread 0
    Kontext:Serverkonfiguration
    Status:MPM
    Modul:beos
    +

    Die Direktive MaxRequestsPerThread legt die + Anzahl der Anfragen fest, die ein einzelner Server-Thread bedient. Nach + Erreichen der angegebenen Anzahl von Anfragen wird der Thread beendet. + Wird für MaxRequestsPerThread der Wert + 0 angegeben, wird der Thread niemals beendet.

    + +

    Das Setzen von MaxRequestsPerThread auf einen + Wert ungleich null hat zwei Vorteile:

    + +
      +
    • Die Menge des von einem Thread benötigten Speicherplatzes + bei (unvorhergesehenen) Speicherproblemen kann begrenzt werden;
    • + +
    • Threads mit begrenzter Lebensdauer reduzieren die Anzahl + der Threads bei reduzierter Serverlast.
    • +
    + +

    Hinweis:

    +

    Bei KeepAlive-Anfragen wird nur die + erste Anfrage auf das Maximum angerechnet. Das führt dazu, dass + die Anzahl der Verbindungen + pro Thread reduziert wird.

    +
    + +
    +
    +
    +

    Verfügbare Sprachen:  de  | + en  | + es  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/beos.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/beos.html.en new file mode 100644 index 00000000..32c8c1f5 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/beos.html.en @@ -0,0 +1,107 @@ + + + +beos - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache MPM beos

    +
    +

    Available Languages:  de  | + en  | + es  | + ko 

    +
    + + + +
    Description:This Multi-Processing Module is optimized for BeOS.
    Status:MPM
    Module Identifier:mpm_beos_module
    Source File:beos.c
    +

    Summary

    + +

    This Multi-Processing Module (MPM) is the default for BeOS. It uses + a single control process which creates threads to handle requests.

    +
    + + +
    top
    +

    MaxRequestsPerThread Directive

    + + + + + + + +
    Description:Limit on the number of requests that an individual thread +will handle during its life
    Syntax:MaxRequestsPerThread number
    Default:MaxRequestsPerThread 0
    Context:server config
    Status:MPM
    Module:beos
    +

    The MaxRequestsPerThread directive sets + the limit on the number of requests that an individual server thread + will handle. After MaxRequestsPerThread + requests, the thread will die. If MaxRequestsPerThread is 0, then the thread + will never expire.

    + +

    Setting MaxRequestsPerThread to a + non-zero limit has two beneficial effects:

    + +
      +
    • it limits the amount of memory that a thread can consume + by (accidental) memory leakage;
    • + +
    • by giving threads a finite lifetime, it helps reduce + the number of threads when the server load reduces.
    • +
    + +

    Note:

    +

    For KeepAlive requests, only + the first request is counted towards this limit. In effect, it + changes the behavior to limit the number of connections + per thread.

    +
    + +
    +
    +
    +

    Available Languages:  de  | + en  | + es  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/beos.html.es b/rubbos/app/httpd-2.0.64/docs/manual/mod/beos.html.es new file mode 100644 index 00000000..80c95718 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/beos.html.es @@ -0,0 +1,115 @@ + + + +beos - Servidor HTTP Apache + + + + + + +
    <-
    + +
    +

    MPM de Apache beos

    +
    +

    Idiomas disponibles:  de  | + en  | + es  | + 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.
    + + + +
    Descripción:Este módulo de muiltiprocesamiento está +optimizado para BeOS.
    Estado:MPM
    Identificador de Módulos:mpm_beos_module
    Fichero de Código Fuente:beos.c
    +

    Resumen de contenidos

    + +

    Este módulo de muiltiprocesamiento (MMP) + es el que usa por defecto para BeOS. Usa un + único proceso de control que crea hebras para atender las + peticiones.

    +
    + + +
    top
    +

    MaxRequestsPerThread Directiva

    + + + + + + + +
    Descripción:Limita el número de peticiones que una hebra (thread) puede +atender durante su vida
    Sintaxis:MaxRequestsPerThread number
    Valor por defecto:MaxRequestsPerThread 0
    Contexto:server config
    Estado:MPM
    Módulo:beos
    +

    La directiva MaxRequestsPerThread fija + el número máximo de peticiones que una hebra del + servidor puede atender durante su vida. Despues de atender + MaxRequestsPerThread peticiones, la hebra + termina. Si el límite fijado en MaxRequestsPerThread es 0, entonces la + hebra puede atender peticiones indefinidamente.

    + +

    Fijar la directiva MaxRequestsPerThread + a un límite distinto de cero ofrece dos benefcios + fundamentales:

    + +
      +
    • limita la cantidad de memoria que puede consumir una hebra + si hay una filtración (accidental) de memoria;
    • + +
    • poniendo un límite a la vida de las hebras, se ayuda a + reducir el número de hebras cuando se reduce la carga de + trabajo en el servidor.
    • +
    + +

    Nota:

    Para peticiones KeepAlive, solo la primera + petición se tiene en cuenta para este límite. De hecho, en este + caso el límite se impone sobre el número máximo + de conexiones por hebra.

    +
    + +
    +
    +
    +

    Idiomas disponibles:  de  | + en  | + es  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/beos.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/mod/beos.html.ko.euc-kr new file mode 100644 index 00000000..9a03b917 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/beos.html.ko.euc-kr @@ -0,0 +1,105 @@ + + + +beos - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    ¾ÆÆÄÄ¡ MPM beos

    +
    +

    °¡´ÉÇÑ ¾ð¾î:  de  | + en  | + es  | + ko 

    +
    +
    ÀÌ ¹®¼­´Â ÃÖ½ÅÆÇ ¹ø¿ªÀÌ ¾Æ´Õ´Ï´Ù. + ÃÖ±Ù¿¡ º¯°æµÈ ³»¿ëÀº ¿µ¾î ¹®¼­¸¦ Âü°íÇϼ¼¿ä.
    + + + +
    ¼³¸í:BeOS¿¡ ÃÖÀûÈ­µÈ ´ÙÁßó¸® ¸ðµâ.
    »óÅÂ:MPM
    ¸ðµâ¸í:mpm_beos_module
    ¼Ò½ºÆÄÀÏ:beos.c
    +

    ¿ä¾à

    + +

    ÀÌ ´ÙÁßó¸® ¸ðµâ(MPM)Àº BeOS¿¡¼­ ±âº»ÀûÀ¸·Î »ç¿ëÇÑ´Ù. + ÇÑ Á¶Àý ÇÁ·Î¼¼½º°¡ ¿äûÀ» ó¸®ÇÒ ¾²·¹µåµéÀ» ¸¸µç´Ù.

    +
    + + +
    top
    +

    MaxRequestsPerThread Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:ÇÑ ¾²·¹µå°¡ ½ÇÇàÇÏ´Â µ¿¾È ó¸®ÇÒ ¿äû°³¼ö ÇÑ°è
    ¹®¹ý:MaxRequestsPerThread number
    ±âº»°ª:MaxRequestsPerThread 0
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤
    »óÅÂ:MPM
    ¸ðµâ:beos
    +

    MaxRequestsPerThread Áö½Ã¾î´Â + ÇÑ ¼­¹ö ¾²·¹µå°¡ ó¸®ÇÒ ¿äû°³¼ö¸¦ Á¦ÇÑÇÑ´Ù. + MaxRequestsPerThread°³ ¿äûÀ» ó¸®ÇÑÈÄ + ¾²·¹µå´Â Á״´Ù. MaxRequestsPerThread°¡ + 0À̸é Àý´ë·Î ¾²·¹µå¸¦ Á×ÀÌÁö ¾Ê´Â´Ù.

    + +

    MaxRequestsPerThread¸¦ 0ÀÌ ¾Æ´Ñ + °ªÀ¸·Î ¼³Á¤ÇÏ¸é µÎ°¡Áö ÀåÁ¡ÀÌ ÀÖ´Ù:

    + +
      +
    • (¿ì¿¬È÷ ¹ß»ýÇÑ) ¸Þ¸ð¸® À¯Ãâ(memory leakage)¶§¹®¿¡ + ¾²·¹µå°¡ ³¶ºñÇÒ ¸Þ¸ð¸®·®À» Á¦ÇÑÇÑ´Ù;
    • + +
    • ¾²·¹µåÀÇ ¼ö¸íÀ» Á¦ÇÑÇÏ¿© ¼­¹ö ºÎÇÏ°¡ °¨¼ÒÇÒ¶§ + ¾²·¹µå ¼ö¸¦ ÁÙÀδÙ.
    • +
    + +

    ÁÖÀÇ:

    +

    KeepAlive ¿äûÀÇ + °æ¿ì ¿ÀÁ÷ ù¹ø° ¿äû¸¸À» ¼¾´Ù. ±×·¡¼­ ÀÌ Áö½Ã¾î´Â ¾²·¹µå´ç + ¿¬°á °³¼ö¸¦ Á¦ÇÑÇÏ°Ô µÈ´Ù.

    +
    + +
    +
    +
    +

    °¡´ÉÇÑ ¾ð¾î:  de  | + en  | + es  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/core.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/core.html new file mode 100644 index 00000000..25de2b72 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/core.html @@ -0,0 +1,21 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: core.html.de +Content-Language: de +Content-type: text/html; charset=ISO-8859-1 + +URI: core.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: core.html.es +Content-Language: es +Content-type: text/html; charset=ISO-8859-1 + +URI: core.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: core.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/core.html.de b/rubbos/app/httpd-2.0.64/docs/manual/mod/core.html.de new file mode 100644 index 00000000..48e81964 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/core.html.de @@ -0,0 +1,3422 @@ + + + +core - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache-Kernfunktionen

    +
    +

    Verfügbare Sprachen:  de  | + en  | + es  | + ja  | + tr 

    +
    +
    Diese Übersetzung ist möglicherweise + nicht mehr aktuell. Bitte prüfen Sie die englische Version auf + die neuesten Änderungen.
    + +
    Beschreibung:Ständig verfügbare Kernfunktionen des Apache HTTP +Servers
    Status:Core
    +
    + + +
    top
    +

    AcceptPathInfo-Direktive

    + + + + + + + + + +
    Beschreibung:Ressourcen lassen angehängte Pfadangaben zu
    Syntax:AcceptPathInfo On|Off|Default
    Voreinstellung:AcceptPathInfo Default
    Kontext:Serverkonfiguration, Virtual Host, Verzeichnis, .htaccess
    AllowOverride:FileInfo
    Status:Core
    Modul:core
    Kompatibilität:Verfügbar ab Apache 2.0.30
    +

    Die Direktive steuert, ob Anfragen akzeptiert oder + abgewiesen werden, bei denen nach der tatsächlichen + Datei (oder einer nicht existierenden Datei in einem existierenden + Verzeichnis) zusätzliche Pfadangaben folgen. Die angehängte + Pfadangabe kann Skripten in der Umgebungsvariable PATH_INFO + verfügbar gemacht werden.

    + +

    Nehmen wir beispielsweise an, dass /test/ auf ein + Verzeichnis zeigt, welches lediglich eine Datei here.html + enthält. Dann wird bei Anfragen nach + /test/here.html/more und + /test/nothere.html/more beides Mal /more + als PATH_INFO ermittelt.

    + +

    Die drei möglichen Argumente für die Direktive + AcceptPathInfo sind:

    + +
    +
    Off
    Eine Anfrage wird nur dann akzeptiert, + wenn sie exakt auf ein existierendes Verzeichnis (oder eine Datei) + abgebildet werden kann. Daher würde eine Anfrage mit einer nach dem + tatsächlichen Dateinamen angehängten Pfadangabe, wie + /test/here.html/more im obigen Beispiel, den Fehler + 404 NOT FOUND (Anm.d.Ü.: nicht gefunden) + zurückgeben.
    + +
    On
    +
    Eine Anfrage wird akzeptiert, wenn eine vorangestellte Pfadangabe + auf ein existierendes Verzeichnis abgebildet werden kann. Das + obige Beispiel /test/here.html/more wird akzeptiert, + wenn /test/here.html auf eine gültige Datei + zeigt.
    + +
    Default
    +
    Die Behandlung von Anfragen mit angehängten Pfadangaben + wird von dem für die Anfrage verantwortlichen Handler bestimmt. Der Core-Handler + für gewöhnliche Dateien weist PATH_INFO-Zugriffe + standardmäßig zurück. Handler, die Skripte bedienen, + wie z.B. cgi-script und + isapi-handler, sind im Allgemeinen darauf + voreingestellt, PATH_INFO zu akzeptieren.
    +
    + +

    Das eigentliche Ziel von AcceptPathInfo ist es, Ihnen + das Überschreiben der Voreinstellung der Handler bezüglich + der Akzeptanz oder Ablehnung von PATH_INFO zu erlauben. + Eine solche Änderung ist zum Beispiel notwendig, wenn Sie einen + Filter wie INCLUDES verwenden, um Inhalte + abhängig von PATH_INFO zu generieren. Der + Core-Handler würde die Anfrage normalerweise abweisen. Verwenden + Sie die folgende Konfiguration, um dennoch solch ein Skript zu + ermöglichen.

    + +

    + <Files "mypaths.shtml">
    + + Options +Includes
    + SetOutputFilter INCLUDES
    + AcceptPathInfo On
    +
    + </Files> +

    + + +
    +
    top
    +

    AccessFileName-Direktive

    + + + + + + + +
    Beschreibung:Name der dezentralen Konfigurationsdateien
    Syntax:AccessFileName Dateiname [Dateiname] ...
    Voreinstellung:AccessFileName .htaccess
    Kontext:Serverkonfiguration, Virtual Host
    Status:Core
    Modul:core
    +

    Aus dieser Namensliste sucht der Server während der + Bearbeitung einer Anfrage in jedem Verzeichnis nach der ersten + existierenden Datei, sofern im betreffenden Verzeichnis dezentrale + Konfigurationsdateien erlaubt sind. + Beispiel:

    + +

    + AccessFileName .acl +

    + +

    Vor der Rücksendung des Dokuments + /usr/local/web/index.html wird der Server + /.acl, /usr/.acl, + /usr/local/.acl und /usr/local/web/.acl + einlesen, solange diese nicht mit

    + +

    + <Directory />
    + + AllowOverride None
    +
    + </Directory> +

    + +

    deaktiviert wurden.

    + +

    Siehe auch

    + +
    +
    top
    +

    AddDefaultCharset-Direktive

    + + + + + + + + +
    Beschreibung:Standard-Charset-Parameter, der bei Antworten vom Content-Type + text/plain oder text/html hinzugefügt wird +
    Syntax:AddDefaultCharset On|Off|Zeichenkodierung
    Voreinstellung:AddDefaultCharset Off
    Kontext:Serverkonfiguration, Virtual Host, Verzeichnis, .htaccess
    AllowOverride:FileInfo
    Status:Core
    Modul:core
    +

    Die Direktive gibt einen Standardwert für den Charset-Paramter des + Medientyps (den Namen einer Zeichencodierung) an, der einer Antwort + genau dann hinzugefügt wird, wenn der Content-Type der Antwort entweder + text/plain oder text/html ist. Dies sollte jedes + mittels META-Element im Datenteil der Antwort angegebene + Charset überschreiben. Das genaue Verhalten hängt jedoch oft von + der Client-Konfiguration des Benutzers ab. Die Einstellung + AddDefaultCharset Off deaktiviert diese Funktionalität. + AddDefaultCharset On aktiviert die Standard-Zeichenkodierung + iso-8859-1. Jeder andere Wert wird als die zu verwendende + Zeichenkodierung aufgefaßt, die eines der bei IANA registrierten + Charset-Werte zur Verwendung in MIME-Medientypen sein sollte. Zum + Beispiel:

    + +

    + AddDefaultCharset utf-8 +

    + +

    AddDefaultCharset sollte nur verwendet werden, + wenn von allen Textressourcen, für die es gilt, bekannt ist, dass sie + in dieser Zeichkodierung vorliegen, oder wenn es zu unbequem ist, ihre + Zeichenkodierung indivuell zu benennen. Ein solches Beispiel ist das + Hinzufügen des Charset-Parameters zu Ressourcen, die generierte + Inhalte enthalten. Ein Beispiel sind CGI-Skript-Altlasten, die aufgrund von + in die Ausgabe integrierten Daten, die durch den Benutzer übermittelt + wurden, gegen Cross-Site-Scripting-Angriffe verwundbar sind. Eine bessere + Lösung wäre jedoch, diese Skripte zu korrigieren (oder zu + löschen), da die Angabe einer Standard-Zeichencodierung keine + Anwender schützt, die in ihrem Browser die Funktion zur + automatischen Erkennung der Zeichenkodierung aktiviert haben.

    + +

    Siehe auch

    + +
    +
    top
    +

    AddOutputFilterByType-Direktive

    + + + + + + + + +
    Beschreibung:einen Ausgabefilter einem bestimmten MIME-Type +zuordnen
    Syntax:AddOutputFilterByType Filter[;Filter...] +MIME-Type [MIME-Type] ...
    Kontext:Serverkonfiguration, Virtual Host, Verzeichnis, .htaccess
    AllowOverride:FileInfo
    Status:Core
    Modul:core
    Kompatibilität:Verfügbar ab Apache 2.0.33
    +

    Die Direktive aktiviert für eine Anfrage abhängig vom + MIME-Type der Antwort einen bestimmten Ausgabe-Filter.

    + +

    Das folgende Beispiel verwendet den Filter DEFLATE, + der von mod_deflate angeboten wird. Er komprimiert + jede Ausgabe, die als text/html oder text/plain + gekennzeichnet ist, (gleichgültig, ob statisch oder dynamisch) + bevor sie an den Client gesendet wird.

    + +

    + AddOutputFilterByType DEFLATE text/html text/plain +

    + +

    Wenn Sie den Inhalt von mehr als einem Filter verarbeiten lassen + wollen, dann müssen deren Namen durch Semikolons voneinander + getrennt werden. Es ist ebenfalls möglich, eine + AddOutputFilterByType-Direktive für + jeden von diesen Filtern zu verwenden.

    + +

    Die folgende Konfiguration sorgt dafür, dass alle + Skriptausgaben, die als text/html gekennzeichnet + sind, zuerst vom INCLUDES-Filter und dann vom + DEFLATE-Filter verarbeitet werden.

    + +

    + <Location /cgi-bin/>
    + + Options Includes
    + AddOutputFilterByType INCLUDES;DEFLATE text/html
    +
    + </Location> +

    + +

    Hinweis:

    +

    Die Aktivierung von Filtern mittels + AddOutputFilterByType kann in einigen + Fällen ganz oder teilweise fehlschlagen. Beispielsweise + werden keine Filter angewendet, wenn der MIME-Type nicht bestimmt + werden kann und auf die Einstellung der DefaultType-Anweisung zurückfällt, + selbst wenn die DefaultType-Einstellung die gleiche ist.

    + +

    Wenn Sie jedoch sicherstellen wollen, dass der Filter + angewendet wird, sollten Sie den Content-Type z.B. mit + AddType oder + ForceType der Ressource + explizit zuordnen. Das Setzen des Content-Types innerhalb + eines (nicht-nph) CGI-Skriptes funktioniert ebenfalls + zuverlässig.

    + +

    Die Typ-gebundenen Ausgabefilter werden niemals auf + Proxy-Anfragen angewendet.

    +
    + +

    Siehe auch

    + +
    +
    top
    +

    AllowEncodedSlashes-Direktive

    + + + + + + + + +
    Beschreibung:Legt fest, ob kodierte Pfadtrennzeichen in URLs durchgereicht +werden dürfen
    Syntax:AllowEncodedSlashes On|Off
    Voreinstellung:AllowEncodedSlashes Off
    Kontext:Serverkonfiguration, Virtual Host
    Status:Core
    Modul:core
    Kompatibilität:Verfügbar ab Apache 2.0.46
    +

    Die AllowEncodedSlashes-Direktive erlaubt die + Verwendung von URLs, welche kodierte Pfadtrennzeichen (%2F + für / und auf entsprechenden Systemen zusätzlich + %5C für \) enthalten. Normalerweise werden + derartige URLs mit einem 404-Fehler (Nicht gefunden) abgewiesen.

    + +

    AllowEncodedSlashes On ist + vor allem in Verbindung mit PATH_INFO hilfreich.

    + +

    Anmerkung

    +

    Das Erlauben von Schrägstrichen impliziert nicht deren + Dekodierung. Vorkommen von %2F oder %5C + (nur auf entsprechenden Systemen) werden unverändert in der + ansonsten dekodierten URL belassen.

    +
    + +

    Siehe auch

    + +
    +
    top
    +

    AllowOverride-Direktive

    + + + + + + + +
    Beschreibung:Direktiven-Typen, die in .htaccess-Dateien +erlaubt sind.
    Syntax:AllowOverride All|None|Direktiven-Typ +[Direktiven-Typ] ...
    Voreinstellung:AllowOverride All
    Kontext:Verzeichnis
    Status:Core
    Modul:core
    +

    Wenn der Server eine .htaccess-Datei (wie durch + AccessFileName definiert) + findet, muss er wissen, welche in der Datei angegebenen Direktiven + frühere Konfigurationsanweisungen überschreiben + dürfen.

    + +

    Nun in <Directory>-Abschnitten verfügbar

    + AllowOverride ist nur in <Directory>-Abschnitten + gültig, die ohne reguläre Ausdrüke definiert wurden, nicht + in <Location>-, + <DirectoryMatch>- oder + <Files>-Abschnitten. +
    + +

    Wenn diese Anweisung auf None gesetzt wird, dann + werden .htaccess-Dateien komplett + ignoriert. In diesem Fall wird der Server nicht einmal versuchen, + die .htaccess-Dateien im Dateisystem zu lesen.

    + +

    Wenn diese Anweisung auf All gesetzt wird, dann + ist jede Direktive in den .htaccess-Dateien erlaubt, + die den Kontext + .htaccess besitzt.

    + +

    Der Direktiven-Typ kann eine der folgenden + Anweisungsgruppen sein.

    + +
    +
    AuthConfig
    + +
    + Erlaubt die Verwendung von Autorisierungs-Anweisungen (AuthDBMGroupFile, + AuthDBMUserFile, + AuthGroupFile, + AuthName, + AuthType, AuthUserFile, Require usw.).
    + +
    FileInfo
    + +
    + Erlaubt die Verwendung von Direktiven zur Steuerung der + Dokumenttypen (DefaultType, ErrorDocument, ForceType, LanguagePriority, + SetHandler, SetInputFilter, SetOutputFilter, und + mod_mime-Direktiven Add* und Remove* + usw.).
    + +
    Indexes
    + +
    + Erlaubt die Verwendung von Direktiven zur Steuerung von + Verzeichnisindizes (AddDescription, + AddIcon, AddIconByEncoding, + AddIconByType, + DefaultIcon, DirectoryIndex, FancyIndexing, HeaderName, IndexIgnore, IndexOptions, ReadmeName + usw.).
    + +
    Limit
    + +
    + Erlaubt die Verwendung von Direktiven zur Steuerung des + Zugriffs von Hosts (Allow, Deny und Order).
    + +
    Options
    + +
    + Erlaubt die Verwendung von Direktiven zur Steuerung spezieller + Verzeichniseigenschaften (Options + und XBitHack).
    +
    + +

    Beispiel:

    + +

    + AllowOverride AuthConfig Indexes +

    + +

    Im obigen Beispiel erzeugen alle Direktiven einen internal server + error (Anm.d.Ü.: (Server-interner Fehler)), die weder der + Gruppe AuthConfig noch der Gruppe Indexes + angehören.

    + +

    Siehe auch

    + +
    +
    top
    +

    AuthName-Direktive

    + + + + + + + +
    Beschreibung:Autorisierungsbereich zur Verwendung in der +HTTP-Authentisierung
    Syntax:AuthName auth-Bereich
    Kontext:Verzeichnis, .htaccess
    AllowOverride:AuthConfig
    Status:Core
    Modul:core
    +

    Die Direktive legt den Namen des Autorisierungsbereiches + (Anm.d.Ü.: Der Autorisierungsbereich wird auch Realm genannt.) + für ein Verzeichnis fest. Dieser Realm wird dem Client mitgeteilt, + damit der Anwender weiß, welchen Benutzernamen und welches Passwort + er zu übermitteln hat. AuthName akzeptiert ein + Argument. Falls der Name des Realm Leerzeichen enthält, muss er in + Anführungszeichen eingeschlossen werden. Um zu funktionieren, muss + die Anweisung von den Direktiven AuthType und Require sowie von + Direktiven wie AuthUserFile + und AuthGroupFile + begleitet werden.

    + +

    Beispiel:

    + +

    + AuthName "Top Secret" +

    + +

    Die AuthName übergebene Zeichenkette ist das, + was in dem von den meisten Browsern angebotenen Passwort-Dialog + angezeigt wird.

    + +

    Siehe auch

    + +
    +
    top
    +

    AuthType-Direktive

    + + + + + + + +
    Beschreibung:Art der Authentisierung
    Syntax:AuthType Basic|Digest
    Kontext:Verzeichnis, .htaccess
    AllowOverride:AuthConfig
    Status:Core
    Modul:core
    +

    Die Direktive wählt die Art der Benutzer-Authentisierung + für ein Verzeichnis aus. Derzeit sind lediglich Basic + und Digest implementiert. + Um zu funktionieren, muss die Anweisung von den Direktiven AuthName und Require sowie von + Direktiven wie AuthUserFile + und AuthGroupFile + begleitet werden.

    + +

    Siehe auch

    + +
    +
    top
    +

    CGIMapExtension-Direktive

    + + + + + + + + +
    Beschreibung:Technik zur Bestimmung des Interpreters für +CGI-Skripte
    Syntax:CGIMapExtension CGI-Pfad .Endung
    Kontext:Verzeichnis, .htaccess
    AllowOverride:FileInfo
    Status:Core
    Modul:core
    Kompatibilität:ausschließlich NetWare
    +

    Die Direktive wird zur Steuerung verwendet, wie Apache + den Interpreter ermittelt, der zur Ausführung von + CGI-Skripten verwendet wird. Beispielsweise bestimmt die Angabe + von CGIMapExtension sys:\foo.nlm .foo, dass + alle CGI-Scripte mit der Endung .foo an den + FOO-Interpreter übergeben werden.

    + +
    +
    top
    +

    ContentDigest-Direktive

    + + + + + + + + +
    Beschreibung:Aktiviert die Generierung von Content-MD5 +HTTP-Response-Headern
    Syntax:ContentDigest On|Off
    Voreinstellung:ContentDigest Off
    Kontext:Serverkonfiguration, Virtual Host, Verzeichnis, .htaccess
    AllowOverride:Options
    Status:Core
    Modul:core
    +

    Die Direktive aktiviert die Generierung von + Content-MD5-Headern, wie sie in RFC1864 bzw. RFC2068 + definiert sind.

    + +

    MD5 ist ein Algorithmus zur Berechnung eines "Datenextrakts" + (zuweilen "Fingerabdruck" genannt) (Anm.d.Ü.: Der "Datenextrakt" wird im + Englischen als "message digest" oder "fingerprint" bezeichnet.) + aus beliebig langen Daten. Es gilt als zuverlässig, dass + Veränderungen an den Daten sich in Veränderungen des + Extrakts wiederspiegeln.

    + +

    Der Content-MD5-Header bietet eine + End-to-End-Integritätsprüfung (MIC) (Anm.d.Ü.: MIC steht für + "message integrity check".) des Daten-Inhalts. Ein Proxy oder + Client kann diesen Header prüfen, um zufällige Veränderungen + des Entity-Inhalts bei der Übertragung festzustellen. + Beispielheader:

    + +

    + Content-MD5: AuLb7Dp1rqtRtxz2m9kRpA== +

    + +

    Beachten Sie bitte, dass dies Performanceprobleme auf Ihrem + System verursachen kann, da der Extrakt bei jeder Anfrage + berechnet wird (der Wert wird nicht zwischengespeichert).

    + +

    Content-MD5 wird nur für Dokumente gesendet, + die von core bedient werden, nicht jedoch bei + Modulen. SSI-Dokumente, CGI-Skript-Ausgaben und Byte-Range-Antworten + besitzen diesen Header beispielsweise nicht.

    + +
    +
    top
    +

    DefaultType-Direktive

    + + + + + + + + +
    Beschreibung:MIME-Content-Type, der gesendet wird, wenn der Server den Typ +nicht auf andere Weise ermitteln kann.
    Syntax:DefaultType MIME-Type
    Voreinstellung:DefaultType text/plain
    Kontext:Serverkonfiguration, Virtual Host, Verzeichnis, .htaccess
    AllowOverride:FileInfo
    Status:Core
    Modul:core
    +

    Es kann vorkommen, dass der Server ein Dokument ausliefern muss, + dessen Typ er nicht mit Hilfe seiner MIME-Type-Zuordnungen bestimmen + kann.

    + +

    Der Server muss den Client über den Content-Type des + Dokumentes informieren. Daher verwendet er im Falle eines + unbekannten Typs die DefaultType-Einstellung. + Zum Beispiel:

    + +

    + DefaultType image/gif +

    + +

    wäre angemessen für ein Verzeichnis, das viele GIF-Bilder + enthält, deren Dateinamen nicht Endung .gif + besitzen.

    + +

    Beachten Sie bitte, dass die Direktive anders als ForceType lediglich den Standard-MIME-Type + bestimmt. Alle anderen MIME-Type-Definitionen, einschließlich + Dateierweiterungen, die den Medien-Typ anzeigen können, + überschreiben diese Voreinstellung.

    + +
    +
    top
    +

    <Directory>-Direktive

    + + + + + + +
    Beschreibung:Umschließt eine Gruppe von Direktiven, die nur auf +das genannte Verzeichnis des Dateisystems und Unterverzeichnisse angewendet +werden
    Syntax:<Directory Verzeichnispfad> +... </Directory>
    Kontext:Serverkonfiguration, Virtual Host
    Status:Core
    Modul:core
    +

    <Directory> und + </Directory> werden dazu verwendet, eine Gruppe + von Direktiven zusammenzufassen, die nur für das genannte + Verzeichnis und dessen Unterverzeichnisse gelten. Jede Direktive, + die im Verzeichnis-Kontext erlaubt ist, kann verwendet werden. + Verzeichnispfad ist entweder der vollständige Pfad zu + einem Verzeichnis oder eine Zeichenkette mit Platzhaltern wie sie von der + Unix-Shell zum Abgleich verwendet werden. In einer Zeichenkette + mit Platzhaltern (Anm.d.Ü.: sogenannte wild-cards) entspricht + ? einem einzelnen Zeichen und * einer + Zeichenkette beliebiger Länge. Sie können auch auch + []-Zeichenbereiche verwenden. Keiner der Platzhalter + entspricht dem Zeichen "/". Daher passt <Directory + /*/public_html> nicht auf /home/user/public_html, + <Directory /home/*/public_html> jedoch tut es. + Beispiel:

    + +

    + <Directory /usr/local/httpd/htdocs>
    + + Options Indexes FollowSymLinks
    +
    + </Directory> +

    + +
    +

    Seien Sie vorsichtig mit den Verzeichnispfad-Argumenten. + Sie müssen buchstäblich mit dem Dateisystempfad + übereinstimmen, den der Apache für den Zugriff auf die + Dateien verwendet. Direktiven, die für ein bestimmtes + Verzeichnis gelten, gelten nicht für Dateien in dem Verzeichnis, + auf die über einen anderen Pfad zugegriffen wird, wie z.B. + über verschiedene symbolische Links.

    +
    + +

    Erweiterte reguläre Ausdrücke können ebenfalls + verwendet werden, indem das Zeichen ~ hinzugefügt + wird. Beispielsweise würde

    + +

    + <Directory ~ "^/www/.*/[0-9]{3}"> +

    + +

    auf Verzeichnisse in /www/ passen, die aus drei + Zahlen bestehen.

    + +

    Wenn mehrere <Directory>-Abschnitte + (ohne reguläre Ausdrücke) auf ein Verzeichnis (oder + ein ihm übergeordnetes Verzeichnis) passen, welches ein Dokument + enthält, dann werden die Direktiven der Reihe nach, angefangen + beim kürzesten passenden Muster, vermischt mit den Direktiven + aus den .htaccess-Dateien, angewendet. + Beispiel:

    + +

    + <Directory />
    + + AllowOverride None
    +
    + </Directory>
    +
    + <Directory /home/>
    + + AllowOverride FileInfo
    +
    + </Directory> +

    + +

    Beim Zugriff auf das Dokument /home/web/dir/doc.html + sind die einzelnen Schritte:

    + +
      +
    • Wende die Direktive AllowOverride None an + (deaktiviere .htaccess-Dateien).
    • + +
    • Wende die Direktive AllowOverride FileInfo + (auf das Verzeichnis /home) an.
    • + +
    • Wende jede FileInfo-Direktive aus + /home/.htaccess, /home/web/.htaccess und + /home/web/dir/.htaccess der Reihe nach an.
    • +
    + +

    Reguläre Ausdrücke werden solange nicht berücksichtigt, + bis alle normalen Abschnitte angewendet wurden. Anschließend + werden alle regulären Ausdrücke in der Reihenfolge + geprüft, in der sie in der Konfigurationsdatei auftauchen. + Beispielsweise wird bei

    + +

    + <Directory ~ abc$>
    + + # ... hier die Direktiven ...
    +
    + </Directory> +

    + +

    der Abschnitt mit dem regulären Ausdruck nicht + berücksichtigt, bis alle normalen + <Directory>-Abschnitte und + .htaccess-Dateien angewendet wurden. Dann erst wird + der reguläre Ausdruck mit /home/abc/public_html/abc + abgeglichen und der entsprechende <Directory>-Abschnitt angewendet.

    + +

    Beachten Sie bitte, dass der vom Apache voreingestellte + Zugriff für <Directory /> + Allow from All ist. Das bedeutet, dass der Apache + jede Datei ausliefert, die durch eine URL abgebildet wird. Es wird + empfohlen, dass Sie dies durch einen Block wie

    + +

    + <Directory />
    + + Order Deny,Allow
    + Deny from All
    +
    + </Directory> +

    + +

    ändern und anschließend für + Verzeichnisse überschreiben, die Sie verfügbar machen + wollen. Für weitere Einzelheiten lesen Sie bitte + die Seite zu den Sicherheitshinweisen.

    + +

    Die Verzeichnisabschnitte erscheinen in der Datei + httpd.conf. <Directory>-Direktiven dürfen nicht + ineinander verschachtelt werden oder innerhalb von <Limit>- oder <LimitExcept>-Abschnitten auftauchen.

    + +

    Siehe auch

    + +
    +
    top
    +

    <DirectoryMatch>-Direktive

    + + + + + + +
    Beschreibung:Umschließt eine Gruppe von Direktiven, die auf + Verzeichnisse des Dateisystems und ihre Unterverzeichnisse abgebildet + werden, welche auf einen regulären Ausdruck passen
    Syntax:<DirectoryMatch regex> +... </DirectoryMatch>
    Kontext:Serverkonfiguration, Virtual Host
    Status:Core
    Modul:core
    +

    <DirectoryMatch> und + </DirectoryMatch> werden dazu verwendet, eine + Gruppe von Direktiven zusammenzufassen, die nur für das + genannte Verzeichnis und dessen Unterverzeichnisse gelten, genauso + wie bei <Directory>. + Als Argument dient jedoch ein regulärer Ausdruck. + Beispielsweise würde

    + +

    + <DirectoryMatch "^/www/(.+/)?[0-9]{3}"> +

    + +

    auf Verzeichnisse in /www/ passen, die aus drei + Zeichen bestehen.

    + +

    Siehe auch

    + +
    +
    top
    +

    DocumentRoot-Direktive

    + + + + + + + +
    Beschreibung:Verzeichnis, welches den Haupt-Dokumentenbaum bildet, der im +Web sichtbar ist.
    Syntax:DocumentRoot Verzeichnis
    Voreinstellung:DocumentRoot /usr/local/apache/htdocs
    Kontext:Serverkonfiguration, Virtual Host
    Status:Core
    Modul:core
    +

    Die Direktive setzt das Verzeichnis, von dem aus + httpd Dateien ausliefert. Sofern nicht eine Direktive + wie Alias greift, hängt + der Server Pfade aus der angeforderten URL an das Wurzelverzeichnis + an, um den Pfad zum Dokument zu bilden. Beispiel:

    + +

    + DocumentRoot /usr/web +

    + +

    Damit bezieht sich ein Zugriff auf + http://www.my.host.com/index.html auf + /usr/web/index.html.

    + +

    DocumentRoot sollte ohne einen + Schrägstrich am Ende angegeben werden.

    + +

    Siehe auch

    + +
    +
    top
    +

    EnableMMAP-Direktive

    + + + + + + + + +
    Beschreibung:Verwende Memory-Mapping, um Dateien während der +Auslieferung zu lesen
    Syntax:EnableMMAP On|Off
    Voreinstellung:EnableMMAP On
    Kontext:Serverkonfiguration, Virtual Host, Verzeichnis, .htaccess
    AllowOverride:FileInfo
    Status:Core
    Modul:core
    +

    Die Direktive steuert, ob httpd Memory-Mapping + verwenden darf, wenn er während der Auslieferung den Inhalt einer + Datei lesen muss. Wenn die Bearbeitung einer Anfrage es erfordert, + auf die Daten in einer Datei zuzugreifen -- zum Beispiel bei der + Auslieferung einer mittels mod_include serverseitig + analysierten Datei --, dann verwendet der Apache standardmäßig + Memory-Mapping für diese Datei, sofern das Betriebssystem es + unterstützt.

    + +

    Memory-Mapping bedeutet zuweilen eine Performanceverbesserung. + In einigen Umgebungen ist es jedoch besser, Memory-Mapping zu + deaktivieren, um Problemen während des Betriebs vorzubeugen:

    + +
      +
    • Bei einigen Multiprozessorsystemen kann Memory-Mapping die + Performance von httpd reduzieren.
    • +
    • Bei einem per NFS eingebundenen DocumentRoot kann httpd mit + einem Speicherzugriffsfehler (Anm.d.Ü.: ein so genannter "segmentation + fault") abstürzen, wenn eine Datei gelöscht oder + gekürzt wird, während httpd sie im Speicher + abbildet.
    • +
    + +

    Bei Serverkonfigurationen, die für dieses Problem + anfällig sind, sollten Sie das Memory-Mapping für + auszuliefernde Dateien deaktivieren, indem Sie schreiben:

    + +

    + EnableMMAP Off +

    + +

    Bei per NFS eingebundenen Dateien kann diese Funktion + explizit für die störenden Dateien deaktiviert werden, + indem Sie angeben:

    + +

    + <Directory "/pfad-zu-den-nfs-dateien"> + + EnableMMAP Off + + </Directory> +

    + +
    +
    top
    +

    EnableSendfile-Direktive

    + + + + + + + + + +
    Beschreibung:Verwende die sendfile-Unterstützung des Kernels, um +Dateien an den Client auszuliefern
    Syntax:EnableSendfile On|Off
    Voreinstellung:EnableSendfile On
    Kontext:Serverkonfiguration, Virtual Host, Verzeichnis, .htaccess
    AllowOverride:FileInfo
    Status:Core
    Modul:core
    Kompatibilität:Verfügbar ab Apache Version 2.0.44
    +

    Die Direktive steuert, ob httpd die + sendfile-Unterstützung des Kernels verwenden kann, um + Dateiinhalte an den Client zu übermitteln. Wenn die Bearbeitung + einer Anfrage keinen Zugriff auf die Daten in der Datei erfordert -- + zum Beispiel bei der Auslieferung einer statischen Datei -- und das + Betriebssystem es unterstützt, verwendet der Apache + standardmäßig sendfile, um den Dateiinhalt zu + übertragen, ohne die Datei jemals zu lesen.

    + +

    Der sendfile-Mechanismus vermeidet getrennte Lese- und + Sendeoperationen sowie Puffer-Zuweisungen. Bei einigen Plattformen bzw. + Dateisystemen deaktivieren Sie diese Funktion jedoch besser, um Probleme + während des Betriebs zu vermeiden:

    + +
      +
    • Einige Plattformen besitzen u.U. eine fehlerhafte + sendfile-Unterstützung, die das Erstellungssystem nicht erkennt, + insbesondere wenn die Binärdateien auf einem anderen Rechner erstellt + und auf eine solche Maschine mit fehlerhafter sendfile-Unterstützung + übertragen wurden.
    • +
    • Bei einem über das Netzwerk eingebundenen DocumentRoot (z.B. NFS oder SMB) ist der + Kernel möglicherweise nicht in der Lage, die Netzwerkdatei + über seinen eigenen Cache zu bedienen.
    • +
    • Unter Linux löst die Verwendung von sendfile + in Verbindung mit bestimmten Netzwerkkarten und IPv6 + TCP-Checksummenfehler aus.
    • +
    + +

    Bei Serverkonfigurationen, die für dieses Problam + anfällig sind, sollten die diese Funktion deaktivieren, indem + Sie schreiben:

    + +

    + EnableSendfile Off +

    + +

    Bei per NFS oder SMB eingebundenen Dateien kann diese Funktion + explizit für die störenden Dateien deaktiviert werden, indem + Sie angeben:

    + +

    + <Directory "/pfad-zu-den-nfs-dateien"> + + EnableSendfile Off + + </Directory> +

    + +
    +
    top
    +

    ErrorDocument-Direktive

    + + + + + + + + +
    Beschreibung:Das, was der Server im Fehlerfall an den Client +zurückgibt
    Syntax:ErrorDocument Fehlercode Dokument
    Kontext:Serverkonfiguration, Virtual Host, Verzeichnis, .htaccess
    AllowOverride:FileInfo
    Status:Core
    Modul:core
    Kompatibilität:Die Syntax der Anführungszeichen bei Textnachrichten hat +sich im Apache 2.0 geändert
    +

    Im Falle eines Problems oder Fehlers kann der Apache + konfiguriert werden, eine der vier Aktionen auszuführen:

    + +
      +
    1. Ausgabe einer einfachen, hartkodierten Fehlermeldung
    2. + +
    3. Ausgabe einer angepassten Meldung
    4. + +
    5. Umleitung zu einem lokalen URL-Pfad der das + Problem bzw. den Fehler behandelt
    6. + +
    7. Umleitung zu einer externen URL, die das Problem + bzw. den Fehler behandelt
    8. +
    + +

    Die erste Option ist Voreinstellung, während die Optionen + 2 bis 4 über die Direktive ErrorDocument + eingestellt werden, welcher der HTTP-Statuscode und eine + URL oder Nachricht folgen. Abhängig vom Problem bzw. Fehler bietet + der Apache manchmal zusätzliche Informationen an.

    + +

    URLs können bei lokalen Webpfaden mit einem Schrägstrich + (/) beginnen (relativ zum DocumentRoot-Verzeichnis) oder eine vollständige URL + bilden, die der Client auflösen kann. Alternativ kann eine + Nachricht für die Anzeige im Browser angeboten werden. Beispiel:

    + +

    + ErrorDocument 500 http://foo.example.com/cgi-bin/tester
    + ErrorDocument 404 /cgi-bin/falsche_urls.pl
    + ErrorDocument 401 /info_zur_anmeldung.html
    + ErrorDocument 403 "Der Zugriff ist nicht erlaubt." +

    + +

    Außerdem kann auch der Spezialwert default verwendet + werden, um die schlichte, im Apache hartkodierte Nachricht anzugeben. + Während es normalerweise nicht benötigt wird, stellt + default die einfache, hartkodierte Nachricht des Apache + bei Konfigurationen wieder her, bei denen andernfalls eine bestehende + ErrorDocument-Anweisung übernommen + würde.

    + +

    + ErrorDocument 404 /cgi-bin/bad_urls.pl

    + <Directory /web/docs>
    + + ErrorDocument 404 default
    +
    + </Directory> +

    + +

    Wenn Sie eine ErrorDocument-Anweisung + angeben, die auf eine entfernte URL weist (d.h. irgendetwas mit der + Methode http davor), beachten Sie bitte, dass der Apache + eine Umleitung zum Client sendet, um diesem mitzuteilen, wo das + Dokument zu finden ist, auch wenn das Dokument letztlich wieder zum + gleichen Server führt. Das hat mehrere Auswirkungen. Die + wichtigste ist, dass der Client nicht den Original-Statuscode + erhält sondern statt dessen einen Umleitungs-Statuscode. Dies + wiederum kann Web-Robots und andere Clients verwirren, die den + Statuscode dazu verwenden, herauszufinden ob eine URL gültig ist. + Wenn Sie eine entfernte URL in einer Anweisung + ErrorDocument 401 verwenden, wird der Client + darüber hinaus nicht wissen, dass er den Benutzer zur Eingabe + eines Passwortes auffordern muss, da er den Statuscode 401 nicht + erhält. Deshalb müssen Sie sich auf ein lokales + Dokument beziehen, wenn Sie eine Anweisung ErrorDocument + 401 verwenden.

    + +

    Der Microsoft Internet Explorer (MSIE) ignoriert + standardmäßig serverseitig generierte Fehlermeldungen, wenn + sie "zu kurz" sind und ersetzt sie durch eigene "freundliche" + Fehlermeldungen. Die Größe variiert abhängig von der + Art des Fehlers, im Allgemeinen zeigt der MSIE jedoch den + serverseitig generierten Fehler, anstatt ihn zu verstecken, wenn Ihr + Fehlerdokument größer als 512 Bytes ist. Weitere Informationen + sind im Artikel Q294807 in der Microsoft Knowledgebase verfügbar.

    + +

    Obwohl die meisten Fehlermeldungen überschrieben werden + können, werden unter bestimmten Umständen die internen + Meldungen ungeachtet der Einstellung der ErrorDocument-Direktive verwendet. Insbesondere bei + einer fehlerhaften Anfrage werden der normale Bearbeitungsprozess sofort + beendet und die interne Meldung zurückgegeben. Das ist notwendig, um + Sicherheitsprobleme zu vermeiden, die auf Grund fehlerhafter Anfragen + entstehen.

    + +

    In Versionen vor 2.0 wurden Meldungen durch ein einzelnes + vorangestelltes Anführungszeichen (") erkannt.

    + +

    Siehe auch

    + +
    +
    top
    +

    ErrorLog-Direktive

    + + + + + + + +
    Beschreibung:Ablageort, an dem der Server Fehler protokolliert
    Syntax: ErrorLog Dateiname|syslog[:facility]
    Voreinstellung:ErrorLog logs/error_log (Unix) ErrorLog logs/error.log (Windows and + OS/2)
    Kontext:Serverkonfiguration, Virtual Host
    Status:Core
    Modul:core
    +

    Die Direktive ErrorLog bestimmt den Namen + der Datei, in welcher der Server alle auftretenden Fehler protokolliert + werden. Wenn Dateiname nicht absolut ist, wird er relativ zu + ServerRoot betrachtet.

    + +

    Beispiel

    + ErrorLog /var/log/httpd/error_log +

    + +

    Wenn der Dateiname mit einem senkrechten Strich (|, + engl.: Pipe) beginnt, wird angenommen, dass es sich um einen Befehl + handelt, der ausgeführt wird, um das Fehlerprotokolls zu + verarbeiten.

    + +

    Beispiel

    + ErrorLog "|/usr/local/bin/httpd_errors" +

    + +

    Die Verwendung von syslog anstelle eines Dateinamens + aktiviert die Protokollierung mittels syslogd(8), sofern das System + es unterstützt. Als Voreinstellung wird der syslog-Typ (syslog + facility) local7 verwendet, Sie können dies jedoch + auch überschreiben, indem Sie die Syntax + syslog:facility verwenden, wobei + facility einer der Namen sein kann, die üblicherweise + in syslog(1) dokumentiert sind.

    + +

    Beispiel

    + ErrorLog syslog:user +

    + +

    SICHERHEITSHINWEIS: Lesen Sie das Dokument Sicherheitshinweise + zu Einzelheiten darüber, warum Ihre Sicherheit gefährdet + sein kann, wenn das Verzeichnis, in dem die Log-Dateien gespeichert + werden, für jemand anderen, als den Benutzer, der den Server + gestartet hat, beschreibbar ist.

    + +

    Anmerkung

    +

    Bei der Eingabe eines Dateipfads auf nicht-Unix-Plattformen sollte + darauf geachtet werden, nur (Vorwärts-)Schrägstriche zu + verwenden, auch wenn die Plattform rückwärts gerichtete + Schrägstriche (Backslashes) erlaubt. Im Allgemeinen ist es eine gute + Idee, innerhalb der Konfigurationsdateien immer + Vorwärts-Schrägstriche zu verwenden.

    +
    + +

    Siehe auch

    + +
    +
    top
    +

    FileETag-Direktive

    + + + + + + + + +
    Beschreibung:Dateiattribute, die zur Erstellung des HTTP-Response-Headers +ETag verwendet werden
    Syntax:FileETag Komponente ...
    Voreinstellung:FileETag INode MTime Size
    Kontext:Serverkonfiguration, Virtual Host, Verzeichnis, .htaccess
    AllowOverride:FileInfo
    Status:Core
    Modul:core
    +

    Wenn dem Dokument eine Datei zugrundeliegt, bestimmt die Direktive + FileETag die Dateiattribute, die zur Erstellung + des HTTP-Response-Headers ETag (Entity-Tag) verwendet + werden. (Der Wert von ETag wird bei der Cache-Verwaltung + zur Einsparung von Netzwerk-Bandbreite benutzt.) Im Apache 1.3.22 und + früher wurde der ETag-Wert stets aus + der I-Node, der Größe und dem Datum der letzten + Änderung (mtime) der Datei gebildet. Die Direktive + FileETag erlaubt es Ihnen, zu bestimmen, + welche dieser Eigenschaften -- falls überhaupt -- verwendet + werden sollen. Die gültigen Schlüsselworte lauten:

    + +
    +
    INode
    +
    Die I-Node-Nummer wird in die Berechnung mit einbezogen
    +
    MTime
    +
    Datum und Uhrzeit der letzten Änderung werden mit einbezogen
    +
    Size
    +
    Die Anzahl der Bytes in der Datei wird mit einbezogen
    +
    All
    +
    Alle verfügbaren Angaben werden verwendet. Die ist + gleichbedeutend mit: +

    FileETag INode MTime Size

    +
    None
    +
    Es wird keine ETag-Angabe in die Antwort eingefügt, + wenn dem Dokument eine Datei zugrundeliegt.
    +
    + +

    Den Schlüsselwörtern INode, MTime + und Size kann entweder ein + oder ein + - vorangestellt werden, was die Änderung einer + Vorgabe erlaubt, die von einem größeren Umfeld + geerbt wurde. Jedes Schlüselwort ohne ein solches Präfix + hebt die ererbte Einstellung sofort und vollständig auf.

    + +

    Wenn die Konfiguration für ein Verzeichnis + FileETag INode MTime Size enthält + und die eines Unterverzeichnisses FileETag -INode, + dann ist die Einstellung für das Unterverzeichnis (die an + jedes Unter-Unterverzeichnis weitervererbt wird, welches dies nicht + überschreibt) äquivalent mit + FileETag MTime Size.

    + +
    +
    top
    +

    <Files>-Direktive

    + + + + + + + +
    Beschreibung:Enthält Direktiven, die sich nur auf passende Dateinamen +beziehen
    Syntax:<Files Dateiname> ... </Files>
    Kontext:Serverkonfiguration, Virtual Host, Verzeichnis, .htaccess
    AllowOverride:All
    Status:Core
    Modul:core
    +

    Die Direktive <Files> + begrenzt die Reichweite der enthaltenen Anweisungen auf Dateinamen. + Sie ist vergleichbar mit den Direktiven <Directory> und <Location>. Sie muss eine + passende </Files>-Anweisung besitzen. + Die innerhalb dieses Abschnittes angegebenen Direktiven werden auf + jedes Objekt mit einem Basisnamen (letzte Komponente des Dateinamens) + angewendet, der auf die angegebenen Dateinamen passt. <Files>-Container werden, nachdem die + <Directory>-Container + und .htaccess-Dateien gelesen sind, jedoch vor den + <Location>-Containern, + in der Reihenfolge ihres Auftretens ausgeführt. Beachten Sie, dass + <Files>-Anweisungen innerhalb von + <Directory>-Containern + auftreten können, um den Teil des Dateisystems einzuschränken, + den sie betreffen.

    + +

    Das Argument Dateiname kann einen Dateinamen oder eine + Zeichenkette mit Platzhaltern enthalten, wobei ? auf ein + einzelnes Zeichen passt und * auf eine beliebige Folge von + Zeichen. Erweiterte reguläre Ausdrücke können ebenfalls + verwendet werden, indem das Zeichen ~ hinzugefügt wird. + Beispielsweise würde

    + +

    + <Files ~ "\.(gif|jpe?g|png)$"> +

    + +

    auf die gebräuchlichsten Grafikformate im Internet passen. + <FilesMatch> wird + jedoch bevorzugt.

    + +

    Beachten Sie bitte, dass die <Files>-Container anders als <Directory>- und <Location>-Container innerhalb + von .htaccess-Dateien verwendet werden können. + Dies erlaubt den Anwendern auf Dateiebene die Kontrolle über ihre + eigenen Dateien.

    + +

    Siehe auch

    + +
    +
    top
    +

    <FilesMatch>-Direktive

    + + + + + + + +
    Beschreibung:Enthält Direktiven, die für Dateinamen gelten, die + auf einen regulären Ausdruck passen
    Syntax:<FilesMatch regex> ... </FilesMatch>
    Kontext:Serverkonfiguration, Virtual Host, Verzeichnis, .htaccess
    AllowOverride:All
    Status:Core
    Modul:core
    +

    Die Direktive <FilesMatch> + begrenzt wie die Direktive <Files> die enthaltenen Anweisungen auf + Dateinamen. Sie akzeptiert jedoch reguläre Ausdrücke. + Beispielsweise würde

    + +

    + <FilesMatch "\.(gif|jpe?g|png)$"> +

    + +

    auf die gebräuchlichsten Grafikformate im Internet passen.

    + +

    Siehe auch

    + +
    +
    top
    +

    ForceType-Direktive

    + + + + + + + + +
    Beschreibung:Erzwingt die Auslieferung aller passendenden Dateien mit dem +angegebenen MIME-Content-Type
    Syntax:ForceType MIME-Type|None
    Kontext:Verzeichnis, .htaccess
    AllowOverride:FileInfo
    Status:Core
    Modul:core
    Kompatibilität:Wurde im Apache 2.0 in den Core verschoben
    +

    Wenn sie innerhalb einer .htaccess-Datei, eines + <Directory>-, + <Location>- + <Files>-Containers + angegeben wird, erzwingt die Direktive die Auslieferung aller + entsprechenden Dateien mit dem Content-Type, der durch + MIME-Type definiert wurde. Wenn Sie zum Beispiel ein + Verzeichnis voller GIF-Dateien haben, die Sie nicht alle durch + .gif kennzeichnen wollen, können Sie angeben:

    + +

    + ForceType image/gif +

    + +

    Beachten Sie bitte, dass die Direktive anders als DefaultType alle MIME-Type-Zuordnungen + überschreibt, einschließlich Dateiendungen, die einen + Medientyp bezeichnen könnten.

    + +

    Sie können jede ForceType-Angabe + durch die Verwendung des Wertes None überschreiben:

    + +

    + # erzwinge image/gif für alle Dateien:
    + <Location /images>
    + + ForceType image/gif
    +
    + </Location>
    +
    + # hier jedoch normale MIME-Type-Zuordnungen:
    + <Location /images/mixed>
    + + ForceType None
    +
    + </Location> +

    + +
    +
    top
    +

    HostnameLookups-Direktive

    + + + + + + + +
    Beschreibung:Aktiviert DNS-Lookups auf Client-IP-Adressen
    Syntax:HostnameLookups On|Off|Double
    Voreinstellung:HostnameLookups Off
    Kontext:Serverkonfiguration, Virtual Host, Verzeichnis
    Status:Core
    Modul:core
    +

    Diese Direktive aktiviert die DNS-Abfrage (Anm.d.Ü.: ein sogenannter + DNS-Lookup), so dass Hostnamen protokolliert (und in + REMOTE_HOST an CGIs/SSIs übergeben) werden könnnen. + Der Wert Double bezieht sich auf ein + Double-Reverse-DNS-Lookup. D.h. nachdem ein Reverse-Lookup + durchgeführt wurde, wird dann auf dem Ergebnis ein + Forward-Lookup ausgeführt. Wenigstens eine der IP-Adressen + aus dem Forward-Lookup muss der Originaladresse entsprechen. + (In der "tcpwrappers"-Terminologie wird dies PARANOID + genannt.)

    + +

    Unabhängig von der Einstellung wird ein Double-Reverse-Lookup + durchgeführt, wenn mod_access zur Zugriffskontrolle + per Hostnamen eingesetzt wird. Dies ist aus Sicherheitsgründen + notwendig. Beachten Sie, dass das Ergebnis dieses + Double-Reverse-Lookups nicht generell verfügbar ist, solange Sie + nicht HostnameLookups Double setzen. Wenn beispielsweise + nur HostnameLookups On angegeben ist und eine Anfrage + für ein Objekt erfolgt, welches durch Hostnamen-Beschränkungen + geschützt ist, dann wird CGIs nur das Ergebnis des + Singel-Reverse-Lookups in REMOTE_HOST übergeben, + egal ob das Doble-Reverse-Lookup fehlschlug oder nicht.

    + +

    Die Voreinstellung ist Off, um Netzwerktraffic bei den + Angeboten einzusparen, die nicht tatsächlich Reverse-Lookups + benötigen. Es ist auch für die Endanwender besser, da sie nicht + die zusätzliche Wartezeit ertragen müssen, die ein Lookup mit + sich bringt. Hoch frequentierte Angebote sollten diese Direktive auf + Offlassen. Das Hilfsprogramm logresolve, das standardmäßig in das + Unterverzeichnis bin Ihres Installationsverzeichnisses + kompiliert wird, kann dazu verwendet werden, um offline Hostnamen von + protokollierten IP-Adressen nachzuschlagen.

    + +
    +
    top
    +

    IdentityCheck-Direktive

    + + + + + + + +
    Beschreibung:Ermöglicht die Protokollierung der Identität des +entfernten Anwenders nach RFC1413
    Syntax:IdentityCheck On|Off
    Voreinstellung:IdentityCheck Off
    Kontext:Serverkonfiguration, Virtual Host, Verzeichnis
    Status:Core
    Modul:core
    +

    Die Direktive ermöglicht die RFC1413-konforme Protokollierung des + entfernten Benutzernamens für jede Verbindung, bei der auf der + Client-Maschine identd oder etwas ähnliches läuft. Die + Information wird im Zugriffsprotokoll festgehalten.

    + +

    Der Information sollte außer für eine rudimentäre + Benutzerverfolgung in keinster Weise vertraut werden.

    + +

    Beachten Sie bitte, dass dies beträchtliche Zeitprobleme + beim Zugriff auf Ihren Server verursachen kann, da für jede Anfrage + eine solche Rückfrage durchgeführt werden muss. Wenn + Firewalls beteiligt sind, kann unter Umständen jede Rückfrage + fehlschlagen und weitere 30 Sekunden Wartezeit zu jedem Hit + zufügen. Daher ist dies im Allgemeinen bei öffentlichen + Servern, die im Internet erreichbar sind, nicht besonders sinnvoll.

    + +
    +
    top
    +

    <IfDefine>-Direktive

    + + + + + + + +
    Beschreibung:Schließt Direktiven ein, die nur ausgeführt werden, +wenn eine Testbedingung beim Start wahr ist
    Syntax:<IfDefine [!]Parametername> ... + </IfDefine>
    Kontext:Serverkonfiguration, Virtual Host, Verzeichnis, .htaccess
    AllowOverride:All
    Status:Core
    Modul:core
    +

    Der Container <IfDefine Test>...</IfDefine> + wird dazu verwendet, Direktiven als bedingt zu kennzeichnen. + Die Direktiven innerhalb eines <IfDefine>-Abschnittes werden nur ausgeführt, + wenn Test wahr ist. Ist Test falsch, wird alles + zwischen der Start- und Endemarkierung ignoriert.

    + +

    In der <IfDefine>-Anweisung kann + Test eine von zwei Formen annehmen:

    + +
      +
    • Parametername
    • + +
    • !Parametername
    • +
    + +

    Im ersten Fall werden die Direktiven zwischen der Start- und + Endemarkierung nur ausgeführt, wenn der Parameter namens + Parametername definiert ist. Die zweite Form kehrt den + Test um und führt die Direktiven nur dann aus, wenn + Parametername nicht definiert ist.

    + +

    Das Argument Parametername ist ein sogenanntes + "Define", das beim beim Start des Servers in der + httpd-Befehlszeile durch + -DParameter angegeben wird.

    + +

    <IfDefine>-Container können + ineinander verschachtelt werden, um einfache Multi-Parameter-Tests + zu implementieren. Beispiel:

    + +

    + httpd -DReverseProxy ...
    +
    + # httpd.conf
    + <IfDefine ReverseProxy>
    + + LoadModule rewrite_module modules/mod_rewrite.so
    + LoadModule proxy_module modules/libproxy.so
    +
    + </IfDefine> +

    + +
    +
    top
    +

    <IfModule>-Direktive

    + + + + + + + +
    Beschreibung:Schließt Direktiven ein, die abhängig vom +Vorhandensein oder Fehlen eines speziellen Moduls ausgeführt +werden
    Syntax:<IfModule [!]Modulname> ... + </IfModule>
    Kontext:Serverkonfiguration, Virtual Host, Verzeichnis, .htaccess
    AllowOverride:All
    Status:Core
    Modul:core
    +

    Der Container <IfModule + Test>...</IfModule> wird dazu verwendet, + Direktiven als abhängig von dem Vorhandensein eines speziellen + Moduls zu kennzeichnen. Die Direktiven innerhalb eines <IfModule>-Abschnitts werden nur + ausgeführt, wenn Test wahr ist. Ist Test + falsch, wird alles zwischen der Start- und Endemarkierung ignoriert.

    + +

    In der <IfModule>-Anweisung + kann Test eine von zwei Formen annehmen:

    + +
      +
    • Modulname
    • + +
    • !Modulname
    • +
    + +

    Im ersten Fall werden die Direktiven zwischen der Start- und + Endemarkierung nur ausgeführt, das Modul namens + Modulname im Apache enthalten ist -- entweder einkompiliert + oder mittels LoadModule + dynamisch geladen. Die zweite Form dreht den Test um und führt die + Direktiven nur aus, wenn Modulname nicht + enthalten ist.

    + +

    Das Argument Modulname ist der Dateiname des Moduls zum + Zeitpunkt seiner Kompilierung, z.B. mod_rewrite.c. + Wenn ein Modul aus mehreren Quelltext-Dateien besteht, verwenden Sie den + Namen der Datei, welche die Zeichenfolge + STANDARD20_MODULE_STUFF enthält.

    + +

    <IfModule>-Container können + inneinander verschachtelt werden, um einfache Multi-Modul-Tests + durchzuführen.

    + +

    Dieser Container sollte verwendet werden, wenn Sie eine + Konfigurationsdatei benötigen, die unabhängig davon funktioniert, + ob ein bestimmtes Modul verfügbar ist oder nicht. Normalerweise + ist es nicht notwendig, Direktiven in <IfModule>-Containern unterzubringen.

    + +
    +
    top
    +

    Include-Direktive

    + + + + + + + +
    Beschreibung:Fügt andere Konfigurationsdateien innerhalb der +Server-Konfigurationsdatei ein
    Syntax:Include Dateiname|Verzeichnis
    Kontext:Serverkonfiguration, Virtual Host, Verzeichnis
    Status:Core
    Modul:core
    Kompatibilität:Die Platzhalter-Suche ist verfügbar seit +2.0.41
    +

    Die Direktive erlaubt das Einfügen anderer Konfigurationsdateien + in die Konfigurationsdatei des Servers.

    + +

    Shell-typische (fnmatch()) Platzhlaterzeichen können + dazu verwendet werden, mehrere Dateien auf einmal in alphabetischer + Reihenfolge einzufügen. Wenn Include + darüber hinaus auf ein Verzeichnis anstatt auf eine Datei zeigt, + liest der Apache alle Dateien in diesem Verzeichnis und allen + Unterverzeichnissen ein. Das Einfügen ganzer Verzeichnisse ist + jedoch nicht empfehlenswert, da temporäre Dateien sehr leicht + versehentlich in einem Verzeichnis zurückgelassen werden, was + httpd scheitern lassen kann.

    + +

    Der angegebene Dateiname kann ein absoluter Pfad sein oder relativ zum + ServerRoot-Verzeichnis angegeben + werden.

    + +

    Beispiele:

    + +

    + Include /usr/local/apache2/conf/ssl.conf
    + Include /usr/local/apache2/conf/vhosts/*.conf +

    + +

    Oder Sie geben Pfade relativ zu Ihrem ServerRoot-Verzeichnis an:

    + +

    + Include conf/ssl.conf
    + Include conf/vhosts/*.conf +

    + +

    Der Aufruf von apachectl configtest liefert eine Liste + der Dateien, die während des Konfigurations-Tests verarbeitet + werden:

    + +

    + root@host# apachectl configtest
    + Processing config file: /usr/local/apache2/conf/ssl.conf
    + Processing config file: /usr/local/apache2/conf/vhosts/vhost1.conf
    + Processing config file: /usr/local/apache2/conf/vhosts/vhost2.conf
    + Syntax OK +

    + +

    Siehe auch

    + +
    +
    top
    +

    KeepAlive-Direktive

    + + + + + + + +
    Beschreibung:Aktiviert persistente HTTP-Verbindungen
    Syntax:KeepAlive On|Off
    Voreinstellung:KeepAlive On
    Kontext:Serverkonfiguration, Virtual Host
    Status:Core
    Modul:core
    +

    Die Keep-Alive-Erweiterung von HTTP/1.0 und die + HTTP/1.1-Funktionalität persistenter Verbindungen unterstützt + langlebige HTTP-Sitzungen, die es erlauben, mehrere Anfragen über + die gleich TCP-Verbindung zu senden. In einigen Fällen wurde eine + Beschleunigung der Wartezeiten von beinahe 50% für HTML-Dokumente + mit vielen Bildern festgestellt. Um Keep-Alive-Verbindungen zu aktivieren, + setzen Sie KeepAlive On.

    + +

    Bei HTTP/1.0-Clients werden Keep-Alive-Verbindungen nur dann verwendet, + wenn sie vom Client eigens angefordert werden. Desweiteren können + Keep-Alive-Verbindungen bei einem HTTP/1.0-Client nur dann verwendet + werden, wenn die Länge des Inhalts im Voraus bekannt ist. Dies + impliziert, dass dynamische Inhalte wie CGI-Ausgaben, SSI-Seiten und + servergenerierte Verzeichnisauflistungen im Allgemeinen keine + Keep-Alive-Verbindungen mit HTTP/1.0-Clients verwenden. Bei + HTTP/1.1-Clients sind Keep-Alive-Verbindungen Voreinstellung, solange + nichts anderes angegeben ist. Wenn der Client es anfordert, wird + Chunked-Encoding verwendet, um Inhalte mit unbekannter Länge + über persistente Verbindungen zu senden.

    + +

    Siehe auch

    + +
    +
    top
    +

    KeepAliveTimeout-Direktive

    + + + + + + + +
    Beschreibung:Zeitspanne, die der Server während persistenter Verbindungen +auf nachfolgende Anfragen wartet
    Syntax:KeepAliveTimeout Sekunden
    Voreinstellung:KeepAliveTimeout 15
    Kontext:Serverkonfiguration, Virtual Host
    Status:Core
    Modul:core
    +

    Dies legt die Anzahl der Sekunden fest, die der Apache auf weitere + Anfragen wartet, bevor er die Verbindung schließt. Nachdem einmal + eine Anfrage entgegen genommen wurde, wird die durch die Direktive + Timeout festgelegte Auszeit + angewendet.

    + +

    Auf stark belasteten Servern kann ein hoher + KeepAliveTimeout-Wert zu Durchsatzminderungen + führen. Je höher die Auszeit angegeben ist, desto länger + ist der Apache damit beschäftigt, auf untätige Clients zu + warten.

    + +
    +
    top
    +

    <Limit>-Direktive

    + + + + + + + +
    Beschreibung:Beschränkt die eingeschlossenen Zugriffskontrollen auf +bestimmte HTTP-Methoden
    Syntax:<Limit Methode [Methode] ... > ... + </Limit>
    Kontext:Serverkonfiguration, Virtual Host, Verzeichnis, .htaccess
    AllowOverride:All
    Status:Core
    Modul:core
    +

    Zugriffskontrollen gelten normalerweise für alle + Zugriffsmethoden, was normalerweise auch das gewünschte Verhalten ist. + Im Allgemeinen sollten Zugriffskontrollen nicht in einen + <Limit>-Container gepackt + werden.

    + +

    Der Sinn der Direktive <Limit> + ist es, den Effekt der Zugriffskontrollen auf die angegebenen + HTTP-Methoden zu beschränken. Bei allen anderen Methoden haben + die in der <Limit>-Gruppe + enthaltenen Zugriffsbeschränkungen keine Wirkung. + Im folgenden Beispiel gilt die Zugriffskontrolle nur für die + Methoden POST, PUT und DELETE. + Alle anderen Methoden bleiben ungeschützt:

    + +

    + <Limit POST PUT DELETE>
    + + Require valid-user
    +
    + </Limit> +

    + +

    Sie können eine oder mehrere der folgenden Methoden angeben: + GET, POST, PUT, DELETE, + CONNECT, OPTIONS, + PATCH, PROPFIND, PROPPATCH, + MKCOL, COPY, MOVE, + LOCK und UNLOCK. Die Methodennamen + unterscheiden zwischen Groß- und Kleinschreibung. Wenn + GET verwendet wird, sind HEAD-Anfragen + ebenfalls eingeschränkt. Die TRACE-Methode kann nicht + limitiert werden.

    + +
    + Bei Zugriffsbeschränkungen ist ein <LimitExcept>-Abschnitt stets einem + <Limit>-Abschnitt + vorzuziehen, da ein <LimitExcept>-Abschnitt vor allen möglichen + Methoden schützt.
    + + +
    +
    top
    +

    <LimitExcept>-Direktive

    + + + + + + + +
    Beschreibung:Beschränkt Zugriffskontrollen auf alle HTTP-Methoden +außer den genannten
    Syntax:<LimitExcept Methode [Methode] ... > ... + </LimitExcept>
    Kontext:Serverkonfiguration, Virtual Host, Verzeichnis, .htaccess
    AllowOverride:All
    Status:Core
    Modul:core
    +

    <LimitExcept> und + </LimitExcept> werden dazu verwendet, eine Gruppe + von Anweisungen zur Zugriffskontrolle zusammenzufassen, die dann auf + jede HTTP-Methode angewendet werden, die nicht + als Argument angegeben ist. D.h. dies ist das Gegenteil des + <Limit>-Containers + und kann zur Steuerung von Standard- und nicht-Standard-/unbekannten + Methoden verwendet werden. Für weitere Einzelheiten lesen Sie bitte + die Beschreibung zu <Limit>.

    + +

    Beispiel:

    + +

    + <LimitExcept POST GET>
    + + Require valid-user
    +
    + </LimitExcept> +

    + + +
    +
    top
    +

    LimitInternalRecursion-Direktive

    + + + + + + + + +
    Beschreibung:Bestimmt die maximale Anzahl interner Umleitungen und + verschachtelter Unteranfragen
    Syntax:LimitInternalRecursion Zahl [Zahl]
    Voreinstellung:LimitInternalRecursion 10
    Kontext:Serverkonfiguration, Virtual Host
    Status:Core
    Modul:core
    Kompatibilität:Verfügbar ab Apache 2.0.47
    +

    Eine interne Umleitung erfolgt beispielsweise, wenn die Direktive + Action verwendet wird, welche + die Originalanfrage intern zu einem CGI-Skript weiterleitet. Eine + Unteranfrage (Anm.d.Ü.: engl. Subrequest) ist ein Mechanismus des + Apache, um herauszufinden, was bei einer URI geschehen würde, wäre + sie angefordert worden. mod_dir z.B. verwendet + Unteranfragen, um nach den Dateien zu suchen, die in der DirectoryIndex-Anweisung aufgeführt + sind.

    + +

    LimitInternalRecursion bewahrt den Server vor + einem Absturz, wenn er in eine Endlosschleife aus internen Umleitungen + oder Unteranfragen hineinläuft. Derartige Schleifen werden + gewöhnlich durch Fehlkonfiguration verursacht.

    + +

    Die Direktive setzt zwei verschiedene Begrenzungen, welche je Anfrage + ausgewertet werden. Die erste Zahl bestimmt die maximale + Anzahl der Umleitungen, die aufeinander folgen dürfen. Die zweite + Zahl legt fest, wie tief Unteranfragen ineinander + verschachtelt werden dürfen. Wenn Sie lediglich eine Zahl + angeben, wird sie beiden Begrenzungen zugewiesen.

    + +

    Beispiel

    + LimitInternalRecursion 5 +

    + +
    +
    top
    +

    LimitRequestBody-Direktive

    + + + + + + + + +
    Beschreibung:Begrenzt die Gesamtgröße des vom Client gesendeten +HTTP-Request-Body
    Syntax:LimitRequestBody Bytes
    Voreinstellung:LimitRequestBody 0
    Kontext:Serverkonfiguration, Virtual Host, Verzeichnis, .htaccess
    AllowOverride:All
    Status:Core
    Modul:core
    +

    Die Direktive gibt die Anzahl der Bytes zwischen 0 + (unbegrenzt) und 2147483647 (2GB) an, die im Request-Body (Datenteil der + Anfrage) erlaubt sind.

    + +

    Die Direktive LimitRequestBody erlaubt es dem + Benutzer, die Größe des HTTP-Request-Bodys in dem Kontext zu + begrenzen, in dem die Anweisung angegeben ist (Server, pro Verzeichnis, + pro Datei oder pro Adresse). Wenn die Anfrage des Clients dieses Limit + überschreitet, gibt der Server einen Fehler zurück anstatt die + Anfrage zu bearbeiten. Die Größe des Datenteils einer Anfrage + kann sehr stark variieren, abhängig von der Art der Ressource und + den für diese Ressource erlaubten Methoden. CGI-Skripte verwenden + den Datenteil üblicherweise zum Empfang von Formulardaten. Wird + die PUT-Methode angewendet, dann muss der Wert mindestens + so groß sein wie irgendeine Darstellungsform, die der Server + für diese Ressource akzeptieren soll.

    + +

    Die Direktive gibt dem Serveradministrator eine größere + Kontrolle gegenüber abnormalem Verhalten von Clients, was bei der + Vermeidung einiger Formen von Denial-of-Service-Attacken hilfreich + sein kann.

    + +

    Wenn Sie beispielsweise das Hochladen von Dateien zu einer bestimmten + Adresse erlauben, aber die Größe der hochgeladenen Dateien + auf 100K beschränken wollen, können Sie die folgende Anweisung + verwenden:

    + +

    + LimitRequestBody 102400 +

    + + +
    +
    top
    +

    LimitRequestFields-Direktive

    + + + + + + + +
    Beschreibung:Begrenzt die Anzahl der HTTP-Request-Header, die vom Client +entgegengenommen werden
    Syntax:LimitRequestFields Anzahl
    Voreinstellung:LimitRequestFields 100
    Kontext:Serverkonfiguration
    Status:Core
    Modul:core
    +

    Anzahl ist ein Integer-Wert (eine positive Ganzzahl) + zwischen 0 (unbegrenzt) und 32767. Die Voreinstellung wird durch die + Konstante DEFAULT_LIMIT_REQUEST_FIELDS (100 + bei der Auslieferung) zur Kompilierungszeit gesetzt.

    + +

    Die Direktive LimitRequestFields erlaubt es + dem Serveradministrator, die maximale Anzahl der in einem HTTP-Request + erlaubten HTTP-Request-Header zu verändern. Für den Server + muss dieser Wert größer sein als die Anzahl der Headerzeilen, + die ein normaler Client senden könnte. Die Anzahl der Request-Header, + die ein gewöhnlicher Client verwendet, überschreitet selten 20 + Zeilen. Allerdings kann dies zwischen den verschiedenen + Client-Ausführungen variieren, oft abhängig vom Ausmaß, + mit dem der Anwender die genaue Content-Negotiation-Unterstützung + seines Browsers konfiguriert hat. Optionale HTTP-Erweiterungen + äußern sich oft in Form von HTTP-Headern.

    + +

    Die Direktive gibt dem Serveradministrator eine größere + Kontrolle gegenüber abnormalem Verhalten von Clients, was bei der + Vermeidung einiger Formen von Denial-of-Service-Attacken hilfreich + sein kann. Der Wert sollte erhöht werden, wenn normale Clients + eine Fehlermeldung vom Server erhalten, die besagt, dass mit der Anfrage + zu viele Headerzeilen gesendet wurden.

    + +

    Beispiel:

    + +

    + LimitRequestFields 50 +

    + + +
    +
    top
    +

    LimitRequestFieldSize-Direktive

    + + + + + + + +
    Beschreibung:Begrenzt die Länge des vom Client gesendeten +HTTP-Request-Headers
    Syntax:LimitRequestFieldsize Bytes
    Voreinstellung:LimitRequestFieldsize 8190
    Kontext:Serverkonfiguration
    Status:Core
    Modul:core
    +

    Die Direktive gibt die Anzahl der Bytes an, die in einem + HTTP-Header erlaubt sind.

    + +

    Die Direktive LimitRequestFieldsize erlaubt es + dem Serveradministrator, die maximale Größe eines + HTTP-Request-Headers zu verringern oder erhöhen. Für den Server + muss der Wert groß genug sein, um eine beliebige Headerzeile einer + normalen Client-Anfrage vorzuhalten. Die Größe variiert stark + zwischen den verschiedenen Client-Ausführungen, oft abhängig vom + Ausmaß, mit dem der Anwender die genaue + Content-Negotiation-Unterstützung seines Browsers konfiguriert hat. + SPNEGO-Authentisierungs-Header können bis zu 12392 Bytes lang + sein.

    + +

    Die Direktive gibt dem Serveradministrator eine größere + Kontrolle gegenüber abnormalem Verhalten von Clients, was bei der + Vermeidung einiger Formen von Denial-of-Service-Attacken hilfreich + sein kann.

    + +

    Beispiel:

    + +

    + LimitRequestFieldSize 4094 +

    + +
    Unter normalen Umständen sollte die Voreinstellung nicht + verändert werden.
    + +
    Sie benötigen mindestens Apache 2.0.53, um das Limit + über den einkompilierten Wert von DEFAULT_LIMIT_REQUEST_FIELDSIZE + hinaus zu setzen (8190 bei der Auslieferung).
    + +
    +
    top
    +

    LimitRequestLine-Direktive

    + + + + + + + +
    Beschreibung:Begrenzt die Länge der vom Client entgegengenommenen +HTTP-Anfragezeile
    Syntax:LimitRequestLine Bytes
    Voreinstellung:LimitRequestLine 8190
    Kontext:Serverkonfiguration
    Status:Core
    Modul:core
    +

    Die Direktive legt die Anzahl der Bytes zwischen 0 und + dem Wert der zur Kompilierungszeit definierten Konstante + DEFAULT_LIMIT_REQUEST_LINE (8190 bei der + Auslieferung) fest, die in der HTTP-Anfragezeile erlaubt sind.

    + +

    Die Direktive LimitRequestLine erlaubt es dem + Serveradministrator, die maximale Größe der + HTTP-Anfragezeile auf einen Wert unterhalb der normalen, im Server + einkompilierten Größe des Eingabepuffers zu verringern. Da + die Anfragezeile aus der HTTP-Methode, der URI und der Protokollversion + besteht, bedeutet die LimitRequestLine-Direktive + eine Beschränkung der Länge der für eine Anfrage an den + Server erlaubten Anfrage-URI. Für den Server muss der Wert groß + genug sein, um jeden seiner Ressourcennamen vorzuhalten, + einschließlich aller Informationen, die im Query-String einer + GET-Anfrage übergeben werden können.

    + +

    Die Direktive gibt dem Serveradministrator eine größere + Kontrolle gegenüber abnormalem Verhalten von Clients, was bei der + Vermeidung einiger Formen von Denial-of-Service-Attacken hilfreich + sein kann.

    + +

    Beispiel:

    + +

    + LimitRequestLine 4094 +

    + +
    Unter normalen Umständen sollte die Voreinstellung nicht + verändert werden.
    + +
    +
    top
    +

    LimitXMLRequestBody-Direktive

    + + + + + + + + +
    Beschreibung:Begrenzt die Größe eines XML-basierten +Request-Bodys
    Syntax:LimitXMLRequestBody Bytes
    Voreinstellung:LimitXMLRequestBody 1000000
    Kontext:Serverkonfiguration, Virtual Host, Verzeichnis, .htaccess
    AllowOverride:All
    Status:Core
    Modul:core
    +

    Dies gibt die Grenze für die maximale Größe (in Bytes) + des XML-basierten Request-Bodys an. Der Wert 0 deaktiviert + diese Prüfung.

    + +

    Beispiel:

    + +

    + LimitXMLRequestBody 0 +

    + + +
    +
    top
    +

    <Location>-Direktive

    + + + + + + +
    Beschreibung:Wendet die enthaltenen Direktiven nur auf die entsprechenden +URLs an
    Syntax:<Location + URL-Pfad|URL> ... </Location>
    Kontext:Serverkonfiguration, Virtual Host
    Status:Core
    Modul:core
    +

    Die Direktive <Location> + begrenzt die Reichweite der enthaltenen Anweisungen auf URLs. + Sie ist der Direktive <Directory> ähnlich und startet einen + Abschnitt, der mit der Anweisung </Location> + abgeschlossen wird. <Location>-Container werden, nachdem die + <Directory>-Container + und .htaccess-Dateien gelesen wurden, und nach den + <Files>-Containern, in + der Reihenfolge ausgeführt, in der sie in der Konfigurationsdatei + erscheinen.

    + +

    <Location>-Abschnitte operieren + vollständig außerhalb des Dateisystems. Dies hat mehrere + Konsequenzen. An Wichtigsten, <Location>-Anweisungen sollten nicht dafür + verwendet werden, den Zugriff zu Teilen des Dateisystems zu steuern. Da + mehrere unterschiedliche URLs auf die gleiche Stelle des Dateisystems + zeigen können, könnte eine solche Zugriffskontrolle u.U. + umgangen werden.

    + +

    Wann sollte<Location> verwendet werden

    + +

    Verwenden Sie <Location>, um + Anweisungen auf Inhalte anzuwenden, die außerhalb des Dateisystems + abgelegt sind. Benutzen Sie <Directory> und <Files> für Inhalte, die + innerhalb des Dateisystems abgelegt sind. Eine Ausnahme bildet + <Location />, welches ein einfacher Weg ist, um eine + Konfiguration auf den gesamten Server anzuwenden.

    +
    + +

    Für alle nicht-Proxy-Anfragen ist die entsprechende URL + ein URL-Pfad in der Form /path/. Es dürfen weder ein + Schema, noch ein Hostname, noch ein Port, noch ein Query-String einbezogen + werden. Für Proxy-Anfragen hat die Vergleichs-URL die Form + schema://servername/path. Das Präfix muss angegeben + werden.

    + +

    Die URL kann Platzhalter verwenden. In einer Zeichenfolge mit + Platzhaltern entspricht ? einem einzelnen Zeichen und + *einer beliebigen Zeichenfolge.

    + +

    Erweiterte reguläre Ausdrücke können ebenfalls + verwendet werden, indem das Zeichen ~ hinzugefügt + wird. Beispielsweise würde

    + +

    + <Location ~ "/(extra|special)/data"> +

    + +

    auf URLs passen, welche die Zeichenfolge /extra/data + oder /special/data enthalten. Die Direktive <LocationMatch> verhält sich + genauso wie <Location> mit + regulären Ausdrücken.

    + +

    Die Funktionalität von <Location> ist insbesondere dann nützlich, + wenn sie mit der SetHandler-Direktive + kombiniert wird. Um zum Beispiel Statusabfragen zu aktivieren, sie aber + nur von Browsern aus foo.com zuzulassen, könnten Sie + schreiben:

    + +

    + <Location /status>
    + + SetHandler server-status
    + Order Deny,Allow
    + Deny from all
    + Allow from .foo.com
    +
    + </Location> +

    + +

    Anmerkung zu / (Schrägstrich, Slash)

    +

    Das Slash-Zeichen hat eine besondere Bedeutung, je nachdem, wo es + in der URL erscheint. Manche werden sein Verhalten vom Dateisystem + gewohnt sein, wo mehrere aufeinanderfolgende Schrägstriche + häufig zu einem Schrägstrich zusammengefaßt werden + (d.h. /home///foo ist das gleiche wie + /home/foo). Im URL-Raum ist dies nicht notwendigerweise + genauso. Bei der Direktive <LocationMatch> und der <Location>-Version mit regulären Ausdrücken + müssen Sie explizit mehrere Schrägstriche angeben, wenn Sie + genau dies beabsichtigen.

    + +

    Beispielsweise würde <LocationMatch ^/abc> + auf die angeforderte URL /abc passen, nicht aber auf + //abc. Die Direktive <Location> (ohne reguläre Ausdrücke) verhält + sich ähnlich, wenn sie für Proxy-Anfragen verwendet wird. + Wenn <Location> (ohne + reguläre Ausdrücke) jedoch für nicht-Proxy-Anfragen + verwendet wird, werden stillscheigend mehrere Schrächstriche mit + mit einem einzigen Schrägstrich gleichgesetzt. Geben Sie + beispielsweise <Location /abc/def> an und die + Anfrage lautet auf /abc//def, dann greift die Anweisung.

    +
    + +

    Siehe auch

    + +
    +
    top
    +

    <LocationMatch>-Direktive

    + + + + + + +
    Beschreibung:Wendet die enthaltenen Direktiven nur auf URLs an, die auf +reguläre Ausdrücke passen
    Syntax:<LocationMatch + regex> ... </LocationMatch>
    Kontext:Serverkonfiguration, Virtual Host
    Status:Core
    Modul:core
    +

    Die Direktive <LocationMatch> + begrenzt die Reichweite der enthaltenen Anweisungen in der gleichen Weise + wie <Location> auf URLs. + Sie verwendet jedoch reguläre Ausdrücke als Argument anstelle + einer einfachen Zeichenkette. Beispielsweise würde

    + +

    + <LocationMatch "/(extra|special)/data"> +

    + +

    auf URLs passen, welche die Zeichenfolge /extra/data + oder /special/data enthalten.

    + +

    Siehe auch

    + +
    +
    top
    +

    LogLevel-Direktive

    + + + + + + + +
    Beschreibung:Steuert die Ausführlichkeit des Fehlerprotokolls
    Syntax:LogLevel Level
    Voreinstellung:LogLevel warn
    Kontext:Serverkonfiguration, Virtual Host
    Status:Core
    Modul:core
    +

    LogLevel stellt die Ausführlichkeit + der Nachrichten ein, die im Fehlerprotokoll aufgezeichnet werden (siehe + Direktive ErrorLog). Die folgenden, + nach absteigender Aussagekraft sortierten Level sind + verfügbar:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Level Beschreibung Beispiel
    emerg Notfall - das System ist unbenutzbar."Child cannot open lock file. Exiting" + (Anm.d.Ü.: "Kindprozess kann die Lock-Datei nicht öffnen. + Beende Programm")
    alert Maßnahmen müssen unverzüglich ergriffen + werden."getpwuid: couldn't determine user name from uid" + (Anm.d.Ü.: "getpwuid: kann keinen Benutzernamen aus der UID + ermitteln")
    crit Kritischer Zustand."socket: Failed to get a socket, exiting child" + (Anm.d.Ü.: "socket: Socket-Zuweisung fehlgeschlagen, beende + Kindprozess")
    error Fehlerbedingung."Premature end of script headers" + (Anm.d.Ü.: "Vorzeitiges Ende der Skript-Header")
    warn Warnung."child process 1234 did not exit, sending another SIGHUP" + (Anm.d.Ü.: "Kindprozess 1234 nicht beendet, sende ein weiteres + SIGHUP")
    notice Normaler, aber signifikanter Zustand."httpd: caught SIGBUS, attempting to dump core in ..." + (Anm.d.Ü.: "httpd: SIGBUS empfangen, versuche Speicherabbild nach ... + zu schreiben")
    info Information."Server seems busy, (you may need to increase + StartServers, or Min/MaxSpareServers)..." + (Anm.d.Ü.: "Server scheint beschäftigt zu sein, + (möglicherweise müssen Sie StartServers oder + Min/MaxSpareServers erhöhen)")
    debug Debug-Level-Nachrichten"Opening config file ..." + (Anm.d.Ü.: "Öffne Konfigurationsdatei ...")
    + +

    Geben Sie einen bestimmten Level an, denn werden Nachrichten von + allen höheren Leveln ebenso angezeigt. Z.B.: Wenn + LogLevel info eingestellt ist, dann werden Nachrichten der + Log-Level notice und warn ebenso eingetragen.

    + +

    Es wird empfohlen, mindestens den Level crit zu + verwenden.

    + +

    Beispiel:

    + +

    + LogLevel notice +

    + +

    Hinweis

    +

    Beim Protokollieren in eine reguläre Datei können + Nachrichten des Levels notice nicht unterdrückt + werden und werden daher immer protokolliert. Dies trifft allerdings + nicht zu wenn mittels syslog protokolliert wird.

    +
    + +
    +
    top
    +

    MaxKeepAliveRequests-Direktive

    + + + + + + + +
    Beschreibung:Anzahl der Anfragen, die bei einer persistenten Verbindung +zulässig sind
    Syntax:MaxKeepAliveRequests Anzahl
    Voreinstellung:MaxKeepAliveRequests 100
    Kontext:Serverkonfiguration, Virtual Host
    Status:Core
    Modul:core
    +

    Die Direktive MaxKeepAliveRequests + begrenzt die Anzahl der Anfragen, die pro Verbindung zulässig sind, + wenn KeepAlive eingeschaltet ist. + Bei der Einstellung 0 sind unbegrenzt viele Anfragen + erlaubt. Wir empfehlen für diese Einstellung einen hohen Wert + für eine maximale Serverleistung.

    + +

    Beispiel:

    + +

    + MaxKeepAliveRequests 500 +

    + +
    +
    top
    +

    NameVirtualHost-Direktive

    + + + + + + +
    Beschreibung:Bestimmt eine IP-Adresse für den Betrieb namensbasierter +virtueller Hosts
    Syntax:NameVirtualHost Adresse[:Port]
    Kontext:Serverkonfiguration
    Status:Core
    Modul:core
    +

    Die Direktive NameVirtualHost ist erforderlich, + wenn Sie namensbasierte virtuelle Hosts + konfigurieren möchten.

    + +

    Obwohl Adresse eine Hostname sein kann, wird empfohlen, + dass Sie stets eine IP-Adresse verwenden, z.B.:

    + +

    + NameVirtualHost 111.22.33.44 +

    + +

    Mit der NameVirtualHost-Anweisung geben Sie + die IP-Adresse an, unter der der Server Anfragen für + namensbasierte virtuelle Hosts entgegennimmt. Das ist üblicherweise + die Adresse, zu der die Namen Ihrer namensbasierten virtuellen Hosts + aufgelöst werden. Falls eine Firewall oder ein anderer Proxy die + Anfrage in Empfang nimmt und Sie zu einer weiteren IP-Adresse des Servers + weiterleitet, müssen Sie die IP-Adresse der physikalischen + Schnittstelle der Maschine angeben, welche die Anfragen bedient. + Wenn Sie mehrere namensbasierte Hosts an verschiedenen Adressen + betreiben, wiederholen Sie einfach die Anweisung für jede + Adresse.

    + +

    Anmerkung

    +

    Beachten Sie, dass der "Hauptserver" und jeder + _default_-Server niemals bei einer + Anfrage an einer NameVirtualHost-IP-Adresse + bedient wird (es sei denn, Sie geben aus irgendwelchen Gründen + NameVirtualHost an, definieren dann aber keine + VirtualHosts für diese Adresse).

    +
    + +

    Optional können Sie die Nummer eines Ports angeben, an dem + namensbasierte virtuelle Hosts verwendet werden sollen. Beispiel:

    + +

    + NameVirtualHost 111.22.33.44:8080 +

    + +

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

    + +

    + NameVirtualHost [2001:db8::a00:20ff:fea7:ccea]:8080 +

    + +

    Um an allen Schnittstellen Anfragen zu empfangen, können Sie + * als Argument verwenden.

    + +

    + NameVirtualHost * +

    + +

    Argument der Direktive <VirtualHost>

    +

    Beachten Sie, dass das Argument der <VirtualHost>-Anweisung exakt auf das Argument + der NameVirtualHost-Anweisung passen muss.

    + +

    + NameVirtualHost 1.2.3.4
    + <VirtualHost 1.2.3.4>
    + # ...
    + </VirtualHost>
    +

    +
    + +

    Siehe auch

    + +
    +
    top
    +

    Options-Direktive

    + + + + + + + + +
    Beschreibung:Definiert, welche Eigenschaften oder Funktionen in einem +bestimmten Verzeichnis verfügbar sind
    Syntax:Options + [+|-]Option [[+|-]Option] ...
    Voreinstellung:Options All
    Kontext:Serverkonfiguration, Virtual Host, Verzeichnis, .htaccess
    AllowOverride:Options
    Status:Core
    Modul:core
    +

    Die Direktive Options steuert, welche + Eigenschaften bzw. Funktionen in einem bestimmten Verzeichnis + verfügbar sind.

    + +

    Option kann auf None gesetzt werden, wobei + keine der besonderen Eigenschaften verfügbar sind, oder auf eines + oder mehrere der folgenden:

    + +
    +
    All
    + +
    Alle Optionen außer MultiViews. Dies ist + die Voreinstellung.
    + +
    ExecCGI
    + +
    Die Ausführung von CGI-Skripten, welche mod_cgi + verwenden, ist erlaubt.
    + +
    FollowSymLinks
    + +
    Der Server folgt symbolischen Links in diesem Verzeichnis. +
    +

    Auch wenn der Server symbolischen Links folgt, bedeutet dies + nicht, dass der zum Abgleich gegen <Directory>-Abschnitte verwendete Pfadname + wechselt.

    +

    Beachten Sie auch, dass diese Option innerhalb eines + <Location>-Abschnitts + ignoriert wird.

    +
    + +
    Includes
    + +
    + Server Side Includes, die von mod_include bereitgestellt + werden, sind erlaubt.
    + +
    IncludesNOEXEC
    + +
    Server Side Includes sind erlaubt, #exec cmd + und #exec cgi sind jedoch deaktiviert. Es ist aber noch + möglich, CGI-Skripte aus + ScriptAlias-Verzeichnissen mittels + #include virtual einzubinden.
    + +
    Indexes
    + +
    Wenn eine URL, die auf ein Verzeichnis zeigt, in dem sich keine durch + DirectoryIndex definierte + Indexdatei (z.B. index.html) befindet, dann liefert + mod_autoindex eine formatierte Auflistung des + Verzeichnisses zurück.
    + +
    MultiViews
    + +
    "MultiViews" sind bei der Verwendung von + mod_negotiation erlaubt (siehe Content-Negotiation).
    + +
    SymLinksIfOwnerMatch
    + +
    Der Server folgt nur symbolischen Links, bei denen die Zieldatei + bzw. das Zielverzeichnis der gleichen Benutzerkennung gehört, wie + der Link. +

    Anmerkung

    Diese Option wird innerhalb eines + <Location>-Abschnitts + ignoriert.
    +
    + +

    Wenn mehrere Options auf ein Verzeichnis + angewandt werden können, dann wird normalerweise die + spezifischste (Anm.d.Ü.: Gemeint ist die zuletzt + ausgeführte Option.) verwendet und alle anderen werden + ignoriert; die Optionen werden nicht vermischt. (Siehe auch Wie Abschnitte zusammengeführt + werden..) Wenn jedoch allen Optionen der + Options-Anweisung eines der Zeichen + + oder - vorangestellt wird, werden die Optionen + zusammengemischt. Jede Option mit vorangestelltem + wird + zu den momentan gültigen Optionen hinzugefügt und jede Option + mit vorangestelltem - wird aus den derzeit gültigen + Optionen entfernt.

    + +

    Warnung

    +

    Die Verwendung von Options, bei der einzelne + Optionen mit + oder - und Optionen ohne diese + Präfixe vermischt werden, ist ungültig und führt + häufig zu unerwarteten Ergebnissen.

    +
    + +

    So wird zum Beispiel ohne die Zeichen + und + -

    + +

    + <Directory /web/docs>
    + + Options Indexes FollowSymLinks
    +
    + </Directory>
    +
    + <Directory /web/docs/spec>
    + + Options Includes
    +
    + </Directory> +

    + +

    für das Verzeichnis /web/docs/spec wird jetzt + lediglich Includes gesetzt. Wenn die zweite + Options-Anweisung jedoch +- + und --Zeichen verwenden würde,

    + +

    + <Directory /web/docs>
    + + Options Indexes FollowSymLinks
    +
    + </Directory>
    +
    + <Directory /web/docs/spec>
    + + Options +Includes -Indexes
    +
    + </Directory> +

    + +

    dann würden die Optionen FollowSymLinks und + Includes für das Verzeichnis /web/docs/spec + gesetzt.

    + +

    Anmerkung

    +

    Die Verwendung von -IncludesNOEXEC oder + -Includes deaktiviert Server Side Includes unabhängig + von der vorigen Einstellung vollständig.

    +
    + +

    Die Voreinstellung ist All, sofern keine anderen Angaben + gemacht wurden.

    + +
    +
    top
    +

    Require-Direktive

    + + + + + + + +
    Beschreibung:Wählt die authentisierten Benutzer aus, die auf eine +Ressource zugreifen können
    Syntax:Require Name [Name] ...
    Kontext:Verzeichnis, .htaccess
    AllowOverride:AuthConfig
    Status:Core
    Modul:core
    +

    Die Direktive wählt aus, welche authentisierten Benutzer auf eine + Ressource zugreifen dürfen. Folgende Syntax ist erlaubt:

    + +
    +
    Require user User-ID [User-ID] + ...
    +
    Nur die genannten Benutzer dürfen auf die Ressource + zugreifen.
    + +
    Require group Gruppenname [Gruppenname] + ...
    +
    Nur Benutzer der genannten Gruppen dürfen auf die + Ressource zugreifen.
    + +
    Require valid-user
    +
    Alle gültigen Benutzer dürfen auf die Ressource + zugreifen.
    +
    + +

    Require muss von den Direktiven + AuthName und AuthType sowie Direktiven wie + AuthUserFile + und AuthGroupFile + (zur Definition von Benutzern und Gruppen) begleitet werden, um + korrekt zu funktionieren. Beispiel:

    + +

    + AuthType Basic
    + AuthName "Geschützte Ressource"
    + AuthUserFile /web/users
    + AuthGroupFile /web/groups
    + Require group admin +

    + +

    Zugriffskontrollen, die in dieser Form angewandt werden, gelten + für alle Methoden. Dies ist normalerweise + gewünscht. Wenn Sie Zugriffskontrollen nur auf bestimmte + Methoden anwenden möchten, während andere Methoden + ungeschützt bleiben, dann müssen Sie die + Require-Anweisung innerhalb eines + <Limit>-Abschnitts + platzieren.

    + +

    Siehe auch

    + +
    +
    top
    +

    RLimitCPU-Direktive

    + + + + + + + + +
    Beschreibung:Begrenzt den CPU-Verbrauch von Prozessen, die von +Apache-Kindprozessen gestartet wurden
    Syntax:RLimitCPU Sekunden|max [Sekunden|max]
    Voreinstellung:unbestimmt; verwendet die Voreinstellung des Systems
    Kontext:Serverkonfiguration, Virtual Host, Verzeichnis, .htaccess
    AllowOverride:All
    Status:Core
    Modul:core
    +

    Akzeptiert einen oder zwei Parameter. Der erste Paramater setzt eine + weiche Ressourcenbegrenzung für alle Prozesse, der zweite Parameter + setzt die Maximalgrenze für die Ressourcennutzung. Jeder der + Parameter kann eine Zahl oder max sein. max + zeigt dem Server an, dass das vom Betriebssystem erlaubte Maximum + verwendet werden soll. Das Anheben der maximal erlaubten Ressourcennutzung + erfordert, dass der Server als root läuft, zumindest in + der anfänglichen Startphase.

    + +

    Dies wird auf Prozesse angewendet, die von Anfragen bearbeitenden + Apache-Kindprozessen abgespalten werden, nicht auf die + Apache-Kindprozesse selbst. Das beinhaltet CGI-Skripte und + SSI-exec-Befehle, nicht jedoch Prozesse, die vom Apache-Elternprozess + abgespalten werden, wie z.B. Protokollierung.

    + +

    CPU-Ressourcenbegrenzung wird in Sekunden pro Prozess + ausgedrückt.

    + +

    Siehe auch

    + +
    +
    top
    +

    RLimitMEM-Direktive

    + + + + + + + + +
    Beschreibung:Begrenzt den Speicherverbrauch von Prozessen, die von +Apache-Kindprozessen gestartet wurden
    Syntax:RLimitMEM Bytes|max [Bytes|max]
    Voreinstellung:unbestimmt; verwendet die Voreinstellung des Systems
    Kontext:Serverkonfiguration, Virtual Host, Verzeichnis, .htaccess
    AllowOverride:All
    Status:Core
    Modul:core
    +

    Akzeptiert einen oder zwei Parameter. Der erste Paramater setzt eine + weiche Ressourcenbegrenzung für alle Prozesse, der zweite Parameter + setzt die Maximalgrenze für die Ressourcennutzung. Jeder der + Parameter kann eine Zahl oder max sein. max + zeigt dem Server an, dass das vom Betriebssystem erlaubte Maximum + verwendet werden soll. Das Anheben der maximal erlaubten Ressourcennutzung + erfordert, dass der Server als root läuft, zumindest in + der anfänglichen Startphase.

    + +

    Dies wird auf Prozesse angewendet, die von Anfragen bearbeitenden + Apache-Kindprozessen abgespalten werden, nicht auf die + Apache-Kindprozesse selbst. Das beinhaltet CGI-Skripte und + SSI-exec-Befehle, nicht jedoch Prozesse, die vom Apache-Elternprozess + abgespalten werden, wie z.B. Protokollierung.

    + +

    Die Begrenzung des Speicherverbrauchs wird in Bytes pro Prozess + ausgedrückt.

    + +

    Siehe auch

    + +
    +
    top
    +

    RLimitNPROC-Direktive

    + + + + + + + + +
    Beschreibung:Begrenzt die Anzahl der Prozesse, die von Prozessen gestartet +werden können, der ihrerseits von Apache-Kinprozessen gestartet +wurden
    Syntax:RLimitNPROC Zahl|max [Zahl|max]
    Voreinstellung:unbestimmt; verwendet die Voreinstellung des Systems
    Kontext:Serverkonfiguration, Virtual Host, Verzeichnis, .htaccess
    AllowOverride:All
    Status:Core
    Modul:core
    +

    Akzeptiert einen oder zwei Parameter. Der erste Paramater setzt eine + weiche Ressourcenbegrenzung für alle Prozesse, der zweite Parameter + setzt die Maximalgrenze für die Ressourcennutzung. Jeder der + Parameter kann eine Zahl oder max sein. max + zeigt dem Server an, dass das vom Betriebssystem erlaubte Maximum + verwendet werden soll. Das Anheben der maximal erlaubten Ressourcennutzung + erfordert, dass der Server als root läuft, zumindest in + der anfänglichen Startphase.

    + +

    Dies wird auf Prozesse angewendet, die von Anfragen bearbeitenden + Apache-Kindprozessen abgespalten werden, nicht auf die + Apache-Kindprozesse selbst. Dies beinhaltet CGI-Skripte und + SSI-exec-Befehle, nicht jedoch Prozesse, die vom Apache-Elternprozess + abgespalten werden, wie z.B. Protokollierung.

    + +

    Prozessbegrenzungen steuern die Anzahl der Prozesse pro Benutzer.

    + +

    Anmerkung

    +

    Wenn CGI-Prozesse nicht unter anderen Benutzerkennungen als der + User-ID des Webservers laufen, dann beschränkt diese Direktive + die Anzahl der Prozesse, die der Server selbst erstellen kann. + Kennzeichen einer solchen Situation sind + cannot fork-Meldungen + (Anm.d.Ü.: kann nicht abspalten) in der + Datei error_log.

    +
    + +

    Siehe auch

    + +
    +
    top
    +

    Satisfy-Direktive

    + + + + + + + + + +
    Beschreibung:Zusammenspiel von rechnerbasierter Zugriffskontrolle und +Benutzerauthentisierung
    Syntax:Satisfy Any|All
    Voreinstellung:Satisfy All
    Kontext:Verzeichnis, .htaccess
    AllowOverride:AuthConfig
    Status:Core
    Modul:core
    Kompatibilität:Wird seit Version 2.0.51 von <Limit> und <LimitExcept> beeinflusst
    +

    Verfahrensweise für den Zugriff, falls sowohl Allow als auch Require verwendet werden. Der Parameter kann + entweder All oder Any sein. Die Direktive ist + nur dann nützlich, wenn der Zugriff zu einem bestimmten Bereich + durch Benutzername/Passwort und Clientrechner-Adressen + eingeschränkt ist. In diesem Fall verlangt die Voreinstellung + (All), dass der Client die Adressbeschränkung passiert + und eine gültige Benutzerkennung und ein gültiges + Passwort übermittelt. Mit der Auswahl Any wird dem + Client der Zugriff erlaubt, wenn er entweder die Rechner-Beschänkung + passiert oder einen gültigen Benutzernamen und ein gültiges + Passwort übermittelt. Dies kann verwendet werden, um einen Bereich + mit einem Passwort zu schützen, jedoch Clients von bestimmten + Adressen ohne Abfrage des Passwortes zuzulassen.

    + +

    Wenn Sie beispielsweise möchten, dass Personen aus Ihrem + privaten Netzwerk unbechänkten Zugriff zu Teilen Ihres + Webangebots haben, jedoch verlangen, dass Personen außerhalb + Ihres privaten Netzwerks ein Passwort übergeben müssen, + können Sie eine Konfiguration ähnlich der folgenden + verwenden:

    + +

    + Require valid-user
    + Allow from 192.168.1
    + Satisfy Any +

    + +

    Seit Version 2.0.51 können + Satisfy-Anweisungen durch <Limit>- und <LimitExcept>-Abschnitte auf bestimmte Methoden + beschränkt werden.

    + +

    Siehe auch

    + +
    +
    top
    +

    ScriptInterpreterSource-Direktive

    + + + + + + + + + +
    Beschreibung:Methode zur Ermittlung des Interpreters von +CGI-Skripten
    Syntax:ScriptInterpreterSource Registry|Registry-Strict|Script
    Voreinstellung:ScriptInterpreterSource Script
    Kontext:Serverkonfiguration, Virtual Host, Verzeichnis, .htaccess
    AllowOverride:FileInfo
    Status:Core
    Modul:core
    Kompatibilität:ausschließlich Win32; Die Option + Registry-Strict ist verfügbar seit Apache +2.0.
    +

    Die Direktive steuert, wie der Apache den Interpreter zur Ausführung + von CGI-Skripten bestimmt. Die Voreinstellung ist Script. Dies + veranlaßt den Apache, den Interpreter zu verwenden, auf den die + Shebang-Zeile (erste Zeile, beginnt mit #!) im Skript zeigt. + Auf Win32-Systemen sieht diese Zeile üblicherweise so aus:

    + +

    + #!C:/Perl/bin/perl.exe +

    + +

    oder, wenn perl im Pfad (Umgebungsvariable + PATH) liegt, einfach:

    + +

    + #!perl +

    + +

    Die Einstellung ScriptInterpreterSource Registry + veranlaßt eine Suche in HKEY_CLASSES_ROOT der + Windows-Registrierungsdatenbank und verwendet die Endung der Skript-Datei + (z.B. .pl) als Suchargument. Der durch den Unterschlüssel + Shell\ExecCGI\Command oder, falls dieser nicht existiert, + Shell\Open\Command definierte Befehl wird zum Öffnen der + Skript-Datei verwendet. Wenn die Registrierungsschlüsel nicht gefunden + werden, dann verwendet der Apache die Option Script.

    + +

    Sicherheit

    +

    Seien Sie vorsichtig, wenn Sie ScriptInterpreterSource + Registry bei Verzeichnissen verwenden, auf die eine ScriptAlias-Anweisung zeigt, denn der + Apache wird versuchen, jede Datei innerhalb des + Verzeichnisses auszuführen. Die Einstellung Registry + kann unerwünschte Programmaufrufe bei Dateien verursachen, die + üblicherweise nicht ausgeführt werden. Auf den meisten + Windows-Systemen beispielsweise startet der voreingestellte + Öffnen-Befehl für .htm-Dateien den Microsoft + Internet Explorer, so dass jede HTTP-Anfrage nach einer existierenden + .htm-Datei im Skript-Verzeichnis den Browser auf dem Server + im Hintergrund starten würde. Dies ist leichte Art und Weise, Ihr + System binnen etwa einer Minute zum Absturz zu bringen.

    +
    + +

    Die seit Apache 2.0 neue Option Registry-Strict + macht das gleiche wie Registry, verwendet jedoch nur den + Unterschlüssel Shell\ExecCGI\Command. Der Schlüssel + ExecCGI ist gewöhnlich nicht voreingestellt. Er muss + manuell in der Windows-Registrierungsdatenbank eingerichtet werden und + verhindert dann versehentlicht Programmaufrufe auf Ihrem System.

    + +
    +
    top
    +

    ServerAdmin-Direktive

    + + + + + + +
    Beschreibung:E-Mail-Adresse, die der Server in Fehlermeldungen einfügt, +welche an den Client gesendet werden
    Syntax:ServerAdmin E-Mail-Adresse
    Kontext:Serverkonfiguration, Virtual Host
    Status:Core
    Modul:core
    +

    ServerAdmin legt die E-Mail-Adresse fest, + die der Server in jede Fehlermeldung einfügt, die er an den + Client zurückschickt.

    + +

    Es kann sich lohnen, hierfür eine reservierte Adresse + anzugeben, z.B.

    + +

    + ServerAdmin www-admin@foo.example.com +

    + +

    da Anwender nicht unbedingt erwähnen, dass sie vom Server + sprechen!

    + +
    +
    top
    +

    ServerAlias-Direktive

    + + + + + + +
    Beschreibung:Alternativer Name für einen Host, der verwendet wird, wenn +Anfragen einem namensbasierten virtuellen Host zugeordnet werden
    Syntax:ServerAlias Hostname [Hostname] ...
    Kontext:Virtual Host
    Status:Core
    Modul:core
    +

    Die Direktive ServerAlias bestimmt die + alternativen Namen eines Hosts zur Verwendung mit namensbasierten virtuellen Hosts.

    + +

    + <VirtualHost *>
    + ServerName server.domain.com
    + ServerAlias server server2.domain.com server2
    + # ...
    + </VirtualHost> +

    + +

    Siehe auch

    + +
    +
    top
    +

    ServerName-Direktive

    + + + + + + + +
    Beschreibung:Rechnername und Port, die der Server dazu verwendet, sich +selbst zu identifizieren
    Syntax:ServerName +voll-qualifizierter-Domainname[:port]
    Kontext:Serverkonfiguration, Virtual Host
    Status:Core
    Modul:core
    Kompatibilität:Diese Direktive löst in Version 2.0 die + Funktionalität der Direktive Port aus + Version 1.3 ab.
    +

    Die Direktive ServerName bestimmt den + Rechnernamen und Port, den der Server dazu verwendet, sich selbst + zu identifizieren. Diese werden bei der Erstellung von Umleitungs-URLs + benötigt. Wenn beispielsweise der Name der Maschine, die den Webserver + beherbergt, simple.example.com lautet, die Maschine jedoch + auch einen DNS-Alias www.example.com besitzt und Sie den + Webserver so identifizieren möchten, sollten Sie die folgende + Anweisung verwenden:

    + +

    + ServerName www.example.com:80 +

    + +

    Wenn kein ServerName angegeben wurde, + dann versucht der Server den Rechnernamen mittels eines Reverse-Lookup + herzuleiten. Wenn kein Post in der ServerName-Anweisung angegeben wurde, dann + verwendet der Server den Port der eingegangenen Anfrage. Für eine + optimale Zuverlässigkeit und Berechenbarkeit sollten Sie einen + eindeutigen Rechnernamen und Port angeben, in dem Sie die Direktive + ServerName verwenden.

    + +

    Wenn Sie namensbasierte + virtuelle Hosts verwenden, gibt ServerName + innerhalb eines <VirtualHost>-Abschnitts an, welcher + Hostname im Host:-Header der Anfrage auftauchen muss, + damit sie diesem virtuellen Host zugeordnet wird.

    + +

    Lesen Sie bitte die Beschreibung der Direktive UseCanonicalName für Einstellungen, die + bestimmen, ob selbstreferenzierende URLs (z.B. vom Modul + mod_dir) auf den angegebenen Port zeigen oder auf die + Portnummern die in der Anfrage des Clients angegeben ist.

    + +

    Siehe auch

    + +
    +
    top
    +

    ServerPath-Direktive

    + + + + + + +
    Beschreibung:Veralteter URL-Pfad für einen namensbasierten +virtuellen Host, auf den von einem inkompatiblen Browser zugegriffen +wird
    Syntax:ServerPath URL-Pfad
    Kontext:Virtual Host
    Status:Core
    Modul:core
    +

    Die Direktive ServerPath legt den + veralteten (Anm.d.Ü.: Gemeint ist eigentlich "Altlast" aufgrund + antiquierter Clients.) URL-Pfad eines Hosts zur Verwendung mit + namensbasierten virtuellen Hosts fest.

    + +

    Siehe auch

    + +
    +
    top
    +

    ServerRoot-Direktive

    + + + + + + + +
    Beschreibung:Basisverzeichnis der Serverinstallation
    Syntax:ServerRoot Verzeichnis
    Voreinstellung:ServerRoot /usr/local/apache
    Kontext:Serverkonfiguration
    Status:Core
    Modul:core
    +

    Die Direktive ServerRoot bestimmt das + Verzeichnis, in dem der Server installiert ist. Üblicherweise + enthält es die Unterverzeichnisse conf/ und + logs/. Relative Pfadangaben anderer Direktiven (wie z.B. + Include oder LoadModule) werden relativ zu diesem + Verzeichnis betrachtet.

    + +

    Beispiel

    + ServerRoot /home/httpd +

    + +

    Siehe auch

    + +
    +
    top
    +

    ServerSignature-Direktive

    + + + + + + + + +
    Beschreibung:Konfiguriert die Fußzeile von servergenerierten +Dokumenten
    Syntax:ServerSignature On|Off|EMail
    Voreinstellung:ServerSignature Off
    Kontext:Serverkonfiguration, Virtual Host, Verzeichnis, .htaccess
    AllowOverride:All
    Status:Core
    Modul:core
    +

    Die Direktive ServerSignature ermöglicht + die Gestaltung einer unter servergenerierten Dokumenten (z.B. + Fehlerdokumente, FTP-Verzeichnislisten von mod_proxy, + mod_info-Ausgaben, ...) angefügten + Fußzeile. Ein möglicher Grund für die Aktivierung einer + solchen Fußzeile ist, dass der Anwender bei einer Kette von + Proxy-Servern oft keine Möglichkeit hat, zu erkennen, welcher der + verketteten Server gegenwärtig die zurückgegebene Fehlermeldung + produziert hat.

    + +

    Die (Vor-)Einstellung Off unterdrückt die + Fußzeile (und ist damit kompatibel zum Verhalten des Apache 1.2 und + früher). Die Einstellung On fügt schlicht eine + Zeile mit der Versionsnummer des Servers und dem Servernamen (ServerName) des bedienenden virtuellen Hosts an. + Die Einstellung EMail erstellt zusätzlich einen + "mailto:"-Verweis zum Serveradministrator (ServerAdmin) des referenzierten Dokuments.

    + +

    Ab Version 2.0.44 werden die Details der angegebenen Versionsnummer des + Servers von der Direktive ServerTokens kontrolliert.

    + +

    Siehe auch

    + +
    +
    top
    +

    ServerTokens-Direktive

    + + + + + + + +
    Beschreibung:Konfiguriert den HTTP-Response-Header +Server
    Syntax:ServerTokens Major|Minor|Min[imal]|Prod[uctOnly]|OS|Full
    Voreinstellung:ServerTokens Full
    Kontext:Serverkonfiguration
    Status:Core
    Modul:core
    +

    die Direktive steuert, ob der Response-Header Server, + der an den Client zurückgesendet wird, eine Beschreibung des + allgemeinen Betriesbsystemtyps des Servers wie auch Informationen + über einkompilierte Module enthält.

    + +
    +
    ServerTokens Prod[uctOnly]
    + +
    Der Server sendet (z.B.): Server: + Apache
    + +
    ServerTokens Major
    + +
    Der Server sendet (z.B.): Server: + Apache/2
    + +
    ServerTokens Minor
    + +
    Der Server sendet (z.B.): Server: + Apache/2.0
    + +
    ServerTokens Min[imal]
    + +
    Der Server sendet (z.B.): Server: + Apache/2.0.41
    + +
    ServerTokens OS
    + +
    Der Server sendet (z.B.): Server: Apache/2.0.41 + (Unix)
    + +
    ServerTokens Full (oder nicht angegeben)
    + +
    Der Server sendet (z.B.): Server: Apache/2.0.41 + (Unix) PHP/4.2.2 MyMod/1.2
    +
    + +

    Diese Einstellung gilt für den gesamten Server und kann nicht + auf Virtual-Host-Basis aktiviert oder deaktiviert werden.

    + +

    Ab Version 2.0.44 steuert diese Direktive auch die Informationen, die + durch die Direktive ServerSignature + angeboten werden.

    + +

    Siehe auch

    + +
    +
    top
    +

    SetHandler-Direktive

    + + + + + + + + +
    Beschreibung:Erzwingt die Verarbeitung aller passenden Dateien durch +einen Handler
    Syntax:SetHandler Handlername|None
    Kontext:Serverkonfiguration, Virtual Host, Verzeichnis, .htaccess
    AllowOverride:FileInfo
    Status:Core
    Modul:core
    Kompatibilität:Seit Apache 2.0 im Core
    +

    Wenn die Direktive innerhalb einer .htaccess-Datei + oder in einem <Directory>- oder + <Location>-Abschnitt + angegeben wird, erzwingt sie, dass alle entsprechenden Dateien von dem + durch Handlername angegebenen Handler analysiert werden. Wenn Sie + beispielsweise ein Verzeichnis haben, dessen Dateien unabhängig von + der Endung gänzlich als Image-Maps interpretiert werden sollen, + können Sie folgendes in eine .htaccess-Datei in + dem Verzeichnis schreiben:

    + +

    + SetHandler imap-file +

    + +

    Noch ein Beispiel: wenn Sie den Server immer, wenn die URL + http://servername/status aufgerufen wird, einen + Statusbericht anzeigen lassen möchten, dann können + Sie folgendes in die httpd.conf schreiben:

    + +

    + <Location /status>
    + + SetHandler server-status
    +
    + </Location> +

    +

    Sie können eine zuvor definierte + SetHandler-Anweisung aufheben, indem Sie den Wert + None verwenden.

    + +

    Siehe auch

    + +
    +
    top
    +

    SetInputFilter-Direktive

    + + + + + + + +
    Beschreibung:Bestimmt die Filter, die Client-Anfragen und POST-Eingaben +verarbeiten
    Syntax:SetInputFilter Filter[;Filter...]
    Kontext:Serverkonfiguration, Virtual Host, Verzeichnis, .htaccess
    AllowOverride:FileInfo
    Status:Core
    Modul:core
    +

    Die Direktive SetInputFilter bestimmt den oder + die Filter, die Client-Anfragen und POST-Eingaben verarbeiten, wenn + sie vom Server empfangen werden. Diese gelten zusätzlich zu + anderweitig definierten Filtern, einschließlich denen der Direktive + AddInputFilter.

    + +

    Wenn mehr als ein Filter angegeben wird, dann müssen diese + durch Semikolon voneinander getrennt in der Reihenfolge angegeben werden, + in der sie die Daten verarbeiten sollen.

    + +

    Siehe auch

    + +
    +
    top
    +

    SetOutputFilter-Direktive

    + + + + + + + +
    Beschreibung:Bestimmt die Filter, die Antworten des Servers verarbeiten
    Syntax:SetOutputFilter Filter[;Filter...]
    Kontext:Serverkonfiguration, Virtual Host, Verzeichnis, .htaccess
    AllowOverride:FileInfo
    Status:Core
    Modul:core
    +

    Die Direktive SetOutputFilter bestimmt + die Filter, die Antworten des Servers verarbeiten, bevor sie an den + Client gesendet werden. Diese gelten zusätzlich zu anderweitig + definierten Filtern, einschließlich denen der Direktive + AddOutputFilter.

    + +

    Die folgende Konfiguration verarbeitet zum Beispiel alle Dateien + im Verzeichnis /www/data als Server Side Includes.

    + +

    + <Directory /www/data/>
    + + SetOutputFilter INCLUDES
    +
    + </Directory> +

    + +

    Wenn mehr als ein Filter angegeben wird, dann müssen diese + durch Semikolon voneinander getrennt in der Reihenfolge angegeben werden, + in der sie die Daten verarbeiten sollen.

    + +

    Siehe auch

    + +
    +
    top
    +

    TimeOut-Direktive

    + + + + + + + +
    Beschreibung:Zeitspanne, die der Server auf verschiedene Ereignisse wartet, +bevor er die Anfrage abbricht
    Syntax:TimeOut Sekunden
    Voreinstellung:TimeOut 300
    Kontext:Serverkonfiguration
    Status:Core
    Modul:core
    +

    Die Direktive TimeOut definiert derzeit die + Zeitspanne, die der Apache auf drei Dinge wartet:

    + +
      +
    1. Die gesamte Zeispanne, die benötigt wird, um eine GET-Anfrage + zu empfangen.
    2. + +
    3. Die Zeitspanne zwischen dem Empfang von TCP-Paketen einer + POST- oder PUT-Anfrage.
    4. + +
    5. Die Zeitspanne zwischen ACKs bei der Übermittlung der + TCP-Pakete der Antwort.
    6. +
    + +

    Wir haben vor, diese Zeitspannen in Zukunft separat konfigurierbar zu + machen. Vor Version 1.2 war der Zeitgeber auf 1200 voreingestellt, wurde + dann aber auf 300 herabgesetzt, was immer noch weit mehr ist, als in den + meisten Situationen benötigt wird. Die Voreinstellung wurde nicht + weiter herabgesetzt, da gelegentlich noch Stellen im Code existieren + können, wo der Zeitgeber nicht zurückgesetzt wird, wenn ein + Paket verschickt wird.

    + +
    +
    top
    +

    TraceEnable-Direktive

    + + + + + + + + +
    Beschreibung:Legt das Serververhalten bei TRACE-Anfragen +fest
    Syntax:TraceEnable [on|off|extended]
    Voreinstellung:TraceEnable on
    Kontext:Serverkonfiguration
    Status:Core
    Modul:core
    Kompatibilität:Seit den Versionen 1.3.34 und 2.0.55
    +

    Diese Direktive überschreibt das Verhalten bei TRACE + sowohl für den Hauptserver als auch für + mod_proxy. Die Voreinstellung TraceEnable on + erlaubt TRACE-Anfragen gemäß RFC 2616, welcher + das Mitschicken von Request-Bodies verbietet. TraceEnable off + veranlasst den Hauptserver und mod_proxy, dem + Client mit dem Fehler 405 (Methode nicht erlaubt) + antworten.

    + +

    Mit Hilfe der nicht konformen Direktive TraceEnable + extended können Request-Bodies zugelassen werden. Das ist + allerdings ausschließlich für Test- und Diagnosezwecke gedacht. + Der Hauptserver (als Ursprungsserver) (Anm.d.Ü.: damit ist der + Normalbetrieb und nicht der Einsatz als Proxy-Server gemeint) + limitiert den Request-Body auf 64K (plus 8K für die Chunk-Header, + wenn Transfer-Encoding: chunked verwendet wird) und + reflektiert den vollen Headersatz sowie alle Chunk-Header in seiner + Antwort. Im Betrieb als Proxyserver wird der Request-Body nicht auf + 64K begrenzt.

    + +
    +
    top
    +

    UseCanonicalName-Direktive

    + + + + + + + +
    Beschreibung:Bestimmt, wie der Server seinen eigenen Namen und Port +ermittelt
    Syntax:UseCanonicalName On|Off|DNS
    Voreinstellung:UseCanonicalName On
    Kontext:Serverkonfiguration, Virtual Host, Verzeichnis
    Status:Core
    Modul:core
    +

    In vielen Situationen muss der Apache eine + selbstreferenzierende URL -- d.h. eine URL, die auf den selben + Server zurück verweist -- zusammenbauen. Bei UseCanonicalName + On verwendet der Apache den Hostnamen und Port, der in der + ServerName-Anweisung angegeben ist, + um den kanonischen Namen des Servers zu erstellen. Dieser Name wird in + allen selbstreferenzierenden URLs sowie in CGI-Skripten für die + Werte von SERVER_NAME und SERVER_PORT + verwendet.

    + +

    Bei UseCanonicalName Off bildet der Apache + selbstreferenzierende URLs, indem er den vom Client übermittelten + Hostnamen und Port verwendet, sofern diese vorhanden sind (andernfalls + wird der kanonische Name, wie oben beschrieben, benutzt). Die Werte + sind die gleichen, die zur Anwendung von namensbasierten virtuellen Hosts + verwendet werden, und sie sind mit den gleichen Clients verfügbar + (Anm.d.Ü.: , die auch in der Lage sind, auf namensbasierte virtuelle Hosts + zuzugreifen, d.h. einen Host-Header mitschicken). + Die CGI-Variablen SERVER_NAME und SERVER_PORT + werden ebenfalls aus den vom Client angeboten Werten erstellt.

    + +

    Ein Intranet-Server, auf den Anwender mit kurzen Namen wie + www zugreifen, ist ein Beispiel, wo dies sinnvoll sein kann. + Sie werden bemerken, dass der Apache den Benutzer auf + http://www.domain.com/splat/ umleitet, wenn dieser einen + Kurznamen und eine URL, die einem Verzeichnis entspricht, ohne + abschließenden Schrägstrich eingibt, wie z.B. + http://www/splat. Wenn Sie Authentisierung aktiviert haben, + bewirkt dies, dass der Benutzer sich zweimal identifizieren muss + (einmal für www und noch einmal für + www.domain.com -- lesen Sie für weitere Informationen die + FAQ zu diesem Thema). Wenn UseCanonicalName + jedoch auf Off gesetzt ist, denn wird der Apache zu + http://www/splat/ umleiten.

    + +

    Es existiert noch eine dritte Option, UseCanonicalName DNS, + die für den Betrieb von IP-basierten Massen-Virtual-Hosts gedacht ist, + um antiquierte Clients zu unterstützen, die keinen + Host:-Header bereit stellen. Um selbstreferenzierende + URLs zu ermitteln, führt der Apache bei dieser Option ein + Reverse-DNS-Lookup auf die IP-Adresse des Servers aus, zu der der Client + Verbindung aufgenommen hat.

    + +

    Warnung

    +

    Wenn CGI-Skripte Vermutungen aufgrund des Wertes von + SERVER_NAME anstellen, können sie durch diese + Option fehlschlagen. Clients steht es im Wesentlichen frei, einen Wert + für den Hostnamen anzugeben, wie er will. Wenn das + CGI-Skript SERVER_NAME jedoch lediglich dazu verwendet, + selbstreferenzierende URLs zu erstellen, sollte das gerade noch + in Ordnung sein.

    +
    + +

    Siehe auch

    + +
    +
    top
    +

    <VirtualHost>-Direktive

    + + + + + + +
    Beschreibung:Enthält Direktiven, die nur auf bestimmte Hostnamen oder +IP-Adressen angewendet werden
    Syntax:<VirtualHost + Adresse[:Port] [Adresse[:Port]] + ...> ... </VirtualHost>
    Kontext:Serverkonfiguration
    Status:Core
    Modul:core
    +

    <VirtualHost> und + </VirtualHost> werden dazu verwendet, eine Gruppe + von Direktiven zusammenzufassen, die nur auf einen bestimmten virtuellen + Host angewendet werden. Jede Direktive, die im Virtual-Host-Kontext + zulässig ist, kann verwendet werden. Wenn der Server eine Anfrage + für ein bestimmtes Dokument eines bestimmten virtuellen Hosts + empfängt, dann benutzt er die im + <VirtualHost>-Container enthaltenen + Konfigurationsanweisungen. Adresse kann sein:

    + +
      +
    • Die IP-Adresse des virtuellen Hosts.
    • + +
    • Ein voll qualifizierter Domainname für die IP-Adresse des + virtuellen Hosts.
    • + +
    • Das Zeichen *, welches nur in Kombination mit + NameVirtualHost * verwendet wird, um allen IP-Adressen + zu entsprechen.
    • + +
    • Die Zeichenkette _default_, die nur mit IP-basierten + virtuellen Hosts verwendet wird, um nicht zugewiesene IP-Adressen + aufzufangen.
    • +
    + +

    Beispiel

    + <VirtualHost 10.1.2.3>
    + + ServerAdmin webmaster@host.foo.com
    + DocumentRoot /www/docs/host.foo.com
    + ServerName host.foo.com
    + ErrorLog logs/host.foo.com-error_log
    + TransferLog logs/host.foo.com-access_log
    +
    + </VirtualHost> +

    + +

    IPv6-Adressen müssen in eckigen Klammern angegeben werden, da die + optionale Portnummer sonst nicht erkannt werden kann. Hier ein + IPv6-Beispiel:

    + +

    + <VirtualHost [2001:db8::a00:20ff:fea7:ccea]>
    + + ServerAdmin webmaster@host.example.com
    + DocumentRoot /www/docs/host.example.com
    + ServerName host.example.com
    + ErrorLog logs/host.example.com-error_log
    + TransferLog logs/host.example.com-access_log
    +
    + </VirtualHost> +

    + +

    Jeder virtuelle Host muss einer anderen IP-Adresse, einem anderen Port + oder einem anderen Hostnamen für den Server entsprechen. Im ersten + Fall muss die Servermaschine so eingerichtet sein, dass sie IP-Pakete + für mehrere Adressen akzeptiert. (Wenn der Rechner nicht mehrere + Netzwerkkarten besitzt, kann dies mit dem Befehl ifconfig + alias durchgeführt werden -- sofern Ihr Betriebssystem das + unterstützt).

    + +

    Anmerkung

    +

    Die Verwendung von <VirtualHost> + beeinflusst nicht, an welchen Adressen der Apache + lauscht. Sie müssen mit Listen sicherstellen, dass der Apache + an der richtigen Adresse lauscht.

    +
    + +

    Bei der Verwendung IP-basierter virtueller Hosts kann der spezielle + Name _default_ benutzt werden. In diesem Fall weist + der Apache jede IP-Adresse diesem virtuellen Host zu, die nicht explizit in + einem anderen virtuellen Host angegeben ist. Falls kein virtueller Host + _default_ angegeben ist, wird die "Hauptserver"-Konfiguration, + die aus allen Definitionen außerhalb der Virtual-Host-Abschnitte + besteht, für nicht passende IPs verwendet. (Beachten Sie jedoch, + dass eine IP-Adresse die zu einer NameVirtualHost-Anweisung passt, weder den + "Hauptserver" noch den virtuellen Host _default_ verwendet. + Lesen Sie für weitere Details die Dokumentation zu namensbasierten virtuellen Hosts.)

    + +

    Sie können einen speziellen :Port angeben, + um den entsprechenden Port zu wechseln. Falls nicht angegeben, wird + er auf den gleichen Port voreingestellt, wie die letzte + Listen-Anweisung des + Hauptservers. Sie können auch :* angeben, um alle + Ports dieser Adresse zu akzeptieren. (Dies wird zusammen mit + _default_ empfohlen.)

    + +

    Sicherheit

    +

    Lesen Sie das Dokument Sicherheitshinweise für + Details, warum Ihre Sicherheit gefährdet sein kann, wenn das + Verzeichnis, in dem Protokolldateien gespeichert werden, für + jemanden anderes als den Benutzer beschreibbar ist, der den Server + gestartet hat.

    +
    + +

    Siehe auch

    + +
    +
    +
    +

    Verfügbare Sprachen:  de  | + en  | + es  | + ja  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/core.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/core.html.en new file mode 100644 index 00000000..5b417797 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/core.html.en @@ -0,0 +1,3250 @@ + + + +core - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Core Features

    +
    +

    Available Languages:  de  | + en  | + es  | + ja  | + tr 

    +
    + +
    Description:Core Apache HTTP Server features that are always +available
    Status:Core
    +
    + + +
    top
    +

    AcceptPathInfo Directive

    + + + + + + + + + +
    Description:Resources accept trailing pathname information
    Syntax:AcceptPathInfo On|Off|Default
    Default:AcceptPathInfo Default
    Context:server config, virtual host, directory, .htaccess
    Override:FileInfo
    Status:Core
    Module:core
    Compatibility:Available in Apache 2.0.30 and later
    + +

    This directive controls whether requests that contain trailing + pathname information that follows an actual filename (or + non-existent file in an existing directory) will be accepted or + rejected. The trailing pathname information can be made + available to scripts in the PATH_INFO environment + variable.

    + +

    For example, assume the location /test/ points to + a directory that contains only the single file + here.html. Then requests for + /test/here.html/more and + /test/nothere.html/more both collect + /more as PATH_INFO.

    + +

    The three possible arguments for the + AcceptPathInfo directive are:

    +
    +
    Off
    A request will only be accepted if it + maps to a literal path that exists. Therefore a request with + trailing pathname information after the true filename such as + /test/here.html/more in the above example will return + a 404 NOT FOUND error.
    + +
    On
    A request will be accepted if a + leading path component maps to a file that exists. The above + example /test/here.html/more will be accepted if + /test/here.html maps to a valid file.
    + +
    Default
    The treatment of requests with + trailing pathname information is determined by the handler responsible for the request. + The core handler for normal files defaults to rejecting + PATH_INFO requests. Handlers that serve scripts, such as cgi-script and isapi-handler, generally accept + PATH_INFO by default.
    +
    + +

    The primary purpose of the AcceptPathInfo + directive is to allow you to override the handler's choice of + accepting or rejecting PATH_INFO. This override is required, + for example, when you use a filter, such + as INCLUDES, to generate content + based on PATH_INFO. The core handler would usually reject + the request, so you can use the following configuration to enable + such a script:

    + +

    + <Files "mypaths.shtml">
    + + Options +Includes
    + SetOutputFilter INCLUDES
    + AcceptPathInfo On
    +
    + </Files> +

    + + +
    +
    top
    +

    AccessFileName Directive

    + + + + + + + +
    Description:Name of the distributed configuration file
    Syntax:AccessFileName filename [filename] ...
    Default:AccessFileName .htaccess
    Context:server config, virtual host
    Status:Core
    Module:core
    +

    While processing a request the server looks for + the first existing configuration file from this list of names in + every directory of the path to the document, if distributed + configuration files are enabled for that + directory. For example:

    + +

    + AccessFileName .acl +

    + +

    before returning the document + /usr/local/web/index.html, the server will read + /.acl, /usr/.acl, + /usr/local/.acl and /usr/local/web/.acl + for directives, unless they have been disabled with

    + +

    + <Directory />
    + + AllowOverride None
    +
    + </Directory> +

    + +

    See also

    + +
    +
    top
    +

    AddDefaultCharset Directive

    + + + + + + + + +
    Description:Default charset parameter to be added when a response +content-type is text/plain or text/html
    Syntax:AddDefaultCharset On|Off|charset
    Default:AddDefaultCharset Off
    Context:server config, virtual host, directory, .htaccess
    Override:FileInfo
    Status:Core
    Module:core
    +

    This directive specifies a default value for the media type + charset parameter (the name of a character encoding) to be added + to a response if and only if the response's content-type is either + text/plain or text/html. This should override + any charset specified in the body of the response via a META + element, though the exact behavior is often dependent on the user's client + configuration. A setting of AddDefaultCharset Off + disables this functionality. AddDefaultCharset On enables + a default charset of iso-8859-1. Any other value is assumed + to be the charset to be used, which should be one of the + IANA registered + charset values for use in MIME media types. + For example:

    + +

    + AddDefaultCharset utf-8 +

    + +

    AddDefaultCharset should only be used when all + of the text resources to which it applies are known to be in that + character encoding and it is too inconvenient to label their charset + individually. One such example is to add the charset parameter + to resources containing generated content, such as legacy CGI + scripts, that might be vulnerable to cross-site scripting attacks + due to user-provided data being included in the output. Note, however, + that a better solution is to just fix (or delete) those scripts, since + setting a default charset does not protect users that have enabled + the "auto-detect character encoding" feature on their browser.

    + +

    See also

    + +
    +
    top
    +

    AddOutputFilterByType Directive

    + + + + + + + + +
    Description:assigns an output filter to a particular MIME-type
    Syntax:AddOutputFilterByType filter[;filter...] +MIME-type [MIME-type] ...
    Context:server config, virtual host, directory, .htaccess
    Override:FileInfo
    Status:Core
    Module:core
    Compatibility:Available in Apache 2.0.33 and later
    +

    This directive activates a particular output filter for a request depending on the + response MIME-type.

    + +

    The following example uses the DEFLATE filter, which + is provided by mod_deflate. It will compress all + output (either static or dynamic) which is labeled as + text/html or text/plain before it is sent + to the client.

    + +

    + AddOutputFilterByType DEFLATE text/html text/plain +

    + +

    If you want the content to be processed by more than one filter, their + names have to be separated by semicolons. It's also possible to use one + AddOutputFilterByType directive for each of + these filters.

    + +

    The configuration below causes all script output labeled as + text/html to be processed at first by the + INCLUDES filter and then by the DEFLATE + filter.

    + +

    + <Location /cgi-bin/>
    + + Options Includes
    + AddOutputFilterByType INCLUDES;DEFLATE text/html
    +
    + </Location> +

    + +

    Note

    +

    Enabling filters with AddOutputFilterByType + may fail partially or completely in some cases. For example, no + filters are applied if the MIME-type could not be determined and falls + back to the DefaultType setting, + even if the DefaultType is the + same.

    + +

    However, if you want to make sure, that the filters will be + applied, assign the content type to a resource explicitly, for + example with AddType or + ForceType. Setting the + content type within a (non-nph) CGI script is also safe.

    + +

    The by-type output filters are never applied on proxy requests.

    +
    + +

    See also

    + +
    +
    top
    +

    AllowEncodedSlashes Directive

    + + + + + + + + +
    Description:Determines whether encoded path separators in URLs are allowed to +be passed through
    Syntax:AllowEncodedSlashes On|Off
    Default:AllowEncodedSlashes Off
    Context:server config, virtual host
    Status:Core
    Module:core
    Compatibility:Available in Apache 2.0.46 and later
    +

    The AllowEncodedSlashes directive allows URLs + which contain encoded path separators (%2F for / + and additionally %5C for \ on according systems) + to be used. Normally such URLs are refused with a 404 (Not found) error.

    + +

    Turning AllowEncodedSlashes On is + mostly useful when used in conjunction with PATH_INFO.

    + +

    Note

    +

    Allowing encoded slashes does not imply decoding. + Occurrences of %2F or %5C (only on + according systems) will be left as such in the otherwise decoded URL + string.

    +
    + +

    See also

    + +
    +
    top
    +

    AllowOverride Directive

    + + + + + + + +
    Description:Types of directives that are allowed in +.htaccess files
    Syntax:AllowOverride All|None|directive-type +[directive-type] ...
    Default:AllowOverride All
    Context:directory
    Status:Core
    Module:core
    +

    When the server finds an .htaccess file (as + specified by AccessFileName) + it needs to know which directives declared in that file can override + earlier configuration directives.

    + +

    Only available in <Directory> sections

    + AllowOverride is valid only in + <Directory> + sections specified without regular expressions, not in <Location>, <DirectoryMatch> or + <Files> sections. +
    + +

    When this directive is set to None, then + .htaccess files are completely ignored. + In this case, the server will not even attempt to read + .htaccess files in the filesystem.

    + +

    When this directive is set to All, then any + directive which has the .htaccess Context is allowed in + .htaccess files.

    + +

    The directive-type can be one of the following + groupings of directives.

    + +
    +
    AuthConfig
    + +
    + + Allow use of the authorization directives (AuthDBMGroupFile, + AuthDBMUserFile, + AuthGroupFile, + AuthName, + AuthType, AuthUserFile, Require, etc.).
    + +
    FileInfo
    + +
    + Allow use of the directives controlling document types (DefaultType, ErrorDocument, ForceType, LanguagePriority, + SetHandler, SetInputFilter, SetOutputFilter, and + mod_mime Add* and Remove* + directives, etc.).
    + +
    Indexes
    + +
    + Allow use of the directives controlling directory indexing + (AddDescription, + AddIcon, AddIconByEncoding, + AddIconByType, + DefaultIcon, DirectoryIndex, FancyIndexing, HeaderName, IndexIgnore, IndexOptions, ReadmeName, + etc.).
    + +
    Limit
    + +
    + Allow use of the directives controlling host access (Allow, Deny and Order).
    + +
    Options
    + +
    + Allow use of the directives controlling specific directory + features (Options and + XBitHack).
    +
    + +

    Example:

    + +

    + AllowOverride AuthConfig Indexes +

    + +

    In the example above all directives that are neither in the group + AuthConfig nor Indexes cause an internal + server error.

    + +

    See also

    + +
    +
    top
    +

    AuthName Directive

    + + + + + + + +
    Description:Authorization realm for use in HTTP +authentication
    Syntax:AuthName auth-domain
    Context:directory, .htaccess
    Override:AuthConfig
    Status:Core
    Module:core
    +

    This directive sets the name of the authorization realm for a + directory. This realm is given to the client so that the user + knows which username and password to send. + AuthName takes a single argument; if the + realm name contains spaces, it must be enclosed in quotation + marks. It must be accompanied by AuthType and Require directives, and directives such + as AuthUserFile and + AuthGroupFile to + work.

    + +

    For example:

    + +

    + AuthName "Top Secret" +

    + +

    The string provided for the AuthName is what will + appear in the password dialog provided by most browsers.

    + +

    See also

    + +
    +
    top
    +

    AuthType Directive

    + + + + + + + +
    Description:Type of user authentication
    Syntax:AuthType Basic|Digest
    Context:directory, .htaccess
    Override:AuthConfig
    Status:Core
    Module:core
    +

    This directive selects the type of user authentication for a + directory. Only Basic and Digest are + currently implemented. + + It must be accompanied by AuthName and Require directives, and directives such + as AuthUserFile and + AuthGroupFile to + work.

    + +

    See also

    + +
    +
    top
    +

    CGIMapExtension Directive

    + + + + + + + + +
    Description:Technique for locating the interpreter for CGI +scripts
    Syntax:CGIMapExtension cgi-path .extension
    Context:directory, .htaccess
    Override:FileInfo
    Status:Core
    Module:core
    Compatibility:NetWare only
    +

    This directive is used to control how Apache finds the + interpreter used to run CGI scripts. For example, setting + CGIMapExtension sys:\foo.nlm .foo will + cause all CGI script files with a .foo extension to + be passed to the FOO interpreter.

    + +
    +
    top
    +

    ContentDigest Directive

    + + + + + + + + +
    Description:Enables the generation of Content-MD5 HTTP Response +headers
    Syntax:ContentDigest On|Off
    Default:ContentDigest Off
    Context:server config, virtual host, directory, .htaccess
    Override:Options
    Status:Core
    Module:core
    +

    This directive enables the generation of + Content-MD5 headers as defined in RFC1864 + respectively RFC2068.

    + +

    MD5 is an algorithm for computing a "message digest" + (sometimes called "fingerprint") of arbitrary-length data, with + a high degree of confidence that any alterations in the data + will be reflected in alterations in the message digest.

    + +

    The Content-MD5 header provides an end-to-end + message integrity check (MIC) of the entity-body. A proxy or + client may check this header for detecting accidental + modification of the entity-body in transit. Example header:

    + +

    + Content-MD5: AuLb7Dp1rqtRtxz2m9kRpA== +

    + +

    Note that this can cause performance problems on your server + since the message digest is computed on every request (the + values are not cached).

    + +

    Content-MD5 is only sent for documents served + by the core, and not by any module. For example, + SSI documents, output from CGI scripts, and byte range responses + do not have this header.

    + +
    +
    top
    +

    DefaultType Directive

    + + + + + + + + +
    Description:MIME content-type that will be sent if the +server cannot determine a type in any other way
    Syntax:DefaultType MIME-type
    Default:DefaultType text/plain
    Context:server config, virtual host, directory, .htaccess
    Override:FileInfo
    Status:Core
    Module:core
    +

    There will be times when the server is asked to provide a + document whose type cannot be determined by its MIME types + mappings.

    + +

    The server must inform the client of the content-type of the + document, so in the event of an unknown type it uses the + DefaultType. For example:

    + +

    + DefaultType image/gif +

    + +

    would be appropriate for a directory which contained many GIF + images with filenames missing the .gif extension.

    + +

    Note that unlike ForceType, this directive only + provides the default mime-type. All other mime-type definitions, + including filename extensions, that might identify the media type + will override this default.

    + +
    +
    top
    +

    <Directory> Directive

    + + + + + + +
    Description:Enclose a group of directives that apply only to the +named file-system directory and sub-directories
    Syntax:<Directory directory-path> +... </Directory>
    Context:server config, virtual host
    Status:Core
    Module:core
    +

    <Directory> and + </Directory> are used to enclose a group of + directives that will apply only to the named directory and + sub-directories of that directory. Any directive that is allowed + in a directory context may be used. Directory-path is + either the full path to a directory, or a wild-card string using + Unix shell-style matching. In a wild-card string, ? matches + any single character, and * matches any sequences of + characters. You may also use [] character ranges. None + of the wildcards match a `/' character, so <Directory + /*/public_html> will not match + /home/user/public_html, but <Directory + /home/*/public_html> will match. Example:

    + +

    + <Directory /usr/local/httpd/htdocs>
    + + Options Indexes FollowSymLinks
    +
    + </Directory> +

    + +
    +

    Be careful with the directory-path arguments: + They have to literally match the filesystem path which Apache uses + to access the files. Directives applied to a particular + <Directory> will not apply to files accessed from + that same directory via a different path, such as via different symbolic + links.

    +
    + +

    Extended regular + expressions can also be used, with the addition of the + ~ character. For example:

    + +

    + <Directory ~ "^/www/.*/[0-9]{3}"> +

    + +

    would match directories in /www/ that consisted of + three numbers.

    + +

    If multiple (non-regular expression) <Directory> sections + match the directory (or one of its parents) containing a document, + then the directives are applied in the order of shortest match + first, interspersed with the directives from the .htaccess files. For example, + with

    + +

    + <Directory />
    + + AllowOverride None
    +
    + </Directory>
    +
    + <Directory /home/>
    + + AllowOverride FileInfo
    +
    + </Directory> +

    + +

    for access to the document /home/web/dir/doc.html + the steps are:

    + +
      +
    • Apply directive AllowOverride None + (disabling .htaccess files).
    • + +
    • Apply directive AllowOverride FileInfo (for + directory /home).
    • + +
    • Apply any FileInfo directives in + /home/.htaccess, /home/web/.htaccess and + /home/web/dir/.htaccess in that order.
    • +
    + +

    Regular expressions are not considered until after all of the + normal sections have been applied. Then all of the regular + expressions are tested in the order they appeared in the + configuration file. For example, with

    + +

    + <Directory ~ abc$>
    + + # ... directives here ...
    +
    + </Directory> +

    + +

    the regular expression section won't be considered until after + all normal <Directory>s and + .htaccess files have been applied. Then the regular + expression will match on /home/abc/public_html/abc and + the corresponding <Directory> will + be applied.

    + +

    Note that the default Apache access for + <Directory /> is Allow from All. + This means that Apache will serve any file mapped from an URL. It is + recommended that you change this with a block such + as

    + +

    + <Directory />
    + + Order Deny,Allow
    + Deny from All
    +
    + </Directory> +

    + +

    and then override this for directories you + want accessible. See the Security Tips page for more + details.

    + +

    The directory sections occur in the httpd.conf file. + <Directory> directives + cannot nest, and cannot appear in a <Limit> or <LimitExcept> section.

    + +

    See also

    + +
    +
    top
    +

    <DirectoryMatch> Directive

    + + + + + + +
    Description:Enclose directives that apply to +file-system directories matching a regular expression and their +subdirectories
    Syntax:<DirectoryMatch regex> +... </DirectoryMatch>
    Context:server config, virtual host
    Status:Core
    Module:core
    +

    <DirectoryMatch> and + </DirectoryMatch> are used to enclose a group + of directives which will apply only to the named directory and + sub-directories of that directory, the same as <Directory>. However, it + takes as an argument a regular expression. For example:

    + +

    + <DirectoryMatch "^/www/(.+/)?[0-9]{3}"> +

    + +

    would match directories in /www/ that consisted of three + numbers.

    + +

    See also

    + +
    +
    top
    +

    DocumentRoot Directive

    + + + + + + + +
    Description:Directory that forms the main document tree visible +from the web
    Syntax:DocumentRoot directory-path
    Default:DocumentRoot /usr/local/apache/htdocs
    Context:server config, virtual host
    Status:Core
    Module:core
    +

    This directive sets the directory from which httpd + will serve files. Unless matched by a directive like Alias, the server appends the + path from the requested URL to the document root to make the + path to the document. Example:

    + +

    + DocumentRoot /usr/web +

    + +

    then an access to + http://www.my.host.com/index.html refers to + /usr/web/index.html.

    + +

    The DocumentRoot should be specified without + a trailing slash.

    + +

    See also

    + +
    +
    top
    +

    EnableMMAP Directive

    + + + + + + + + +
    Description:Use memory-mapping to read files during delivery
    Syntax:EnableMMAP On|Off
    Default:EnableMMAP On
    Context:server config, virtual host, directory, .htaccess
    Override:FileInfo
    Status:Core
    Module:core
    +

    This directive controls whether the httpd may use + memory-mapping if it needs to read the contents of a file during + delivery. By default, when the handling of a request requires + access to the data within a file -- for example, when delivering a + server-parsed file using mod_include -- Apache + memory-maps the file if the OS supports it.

    + +

    This memory-mapping sometimes yields a performance improvement. + But in some environments, it is better to disable the memory-mapping + to prevent operational problems:

    + +
      +
    • On some multiprocessor systems, memory-mapping can reduce the + performance of the httpd.
    • +
    • With an NFS-mounted DocumentRoot, + the httpd may crash due to a segmentation fault if a file + is deleted or truncated while the httpd has it + memory-mapped.
    • +
    + +

    For server configurations that are vulnerable to these problems, + you should disable memory-mapping of delivered files by specifying:

    + +

    + EnableMMAP Off +

    + +

    For NFS mounted files, this feature may be disabled explicitly for + the offending files by specifying:

    + +

    + <Directory "/path-to-nfs-files"> + + EnableMMAP Off + + </Directory> +

    + +
    +
    top
    +

    EnableSendfile Directive

    + + + + + + + + + +
    Description:Use the kernel sendfile support to deliver files to the client
    Syntax:EnableSendfile On|Off
    Default:EnableSendfile On
    Context:server config, virtual host, directory, .htaccess
    Override:FileInfo
    Status:Core
    Module:core
    Compatibility:Available in version 2.0.44 and later
    +

    This directive controls whether httpd may use the + sendfile support from the kernel to transmit file contents to the client. + By default, when the handling of a request requires no access + to the data within a file -- for example, when delivering a + static file -- Apache uses sendfile to deliver the file contents + without ever reading the file if the OS supports it.

    + +

    This sendfile mechanism avoids separate read and send operations, + and buffer allocations. But on some platforms or within some + filesystems, it is better to disable this feature to avoid + operational problems:

    + +
      +
    • Some platforms may have broken sendfile support that the build + system did not detect, especially if the binaries were built on + another box and moved to such a machine with broken sendfile + support.
    • +
    • On Linux the use of sendfile triggers TCP-checksum + offloading bugs on certain networking cards when using IPv6.
    • +
    • With a network-mounted DocumentRoot (e.g., NFS or SMB), + the kernel may be unable to serve the network file through + its own cache.
    • +
    + +

    For server configurations that are vulnerable to these problems, + you should disable this feature by specifying:

    + +

    + EnableSendfile Off +

    + +

    For NFS or SMB mounted files, this feature may be disabled explicitly + for the offending files by specifying:

    + +

    + <Directory "/path-to-nfs-files"> + + EnableSendfile Off + + </Directory> +

    + +
    +
    top
    +

    ErrorDocument Directive

    + + + + + + + + +
    Description:What the server will return to the client +in case of an error
    Syntax:ErrorDocument error-code document
    Context:server config, virtual host, directory, .htaccess
    Override:FileInfo
    Status:Core
    Module:core
    Compatibility:Quoting syntax for text messages is different in Apache +2.0
    +

    In the event of a problem or error, Apache can be configured + to do one of four things,

    + +
      +
    1. output a simple hardcoded error message
    2. + +
    3. output a customized message
    4. + +
    5. redirect to a local URL-path to handle the + problem/error
    6. + +
    7. redirect to an external URL to handle the + problem/error
    8. +
    + +

    The first option is the default, while options 2-4 are + configured using the ErrorDocument + directive, which is followed by the HTTP response code and a URL + or a message. Apache will sometimes offer additional information + regarding the problem/error.

    + +

    URLs can begin with a slash (/) for local web-paths (relative + to the DocumentRoot), or be a + full URL which the client can resolve. Alternatively, a message + can be provided to be displayed by the browser. Examples:

    + +

    + ErrorDocument 500 http://foo.example.com/cgi-bin/tester
    + ErrorDocument 404 /cgi-bin/bad_urls.pl
    + ErrorDocument 401 /subscription_info.html
    + ErrorDocument 403 "Sorry can't allow you access today" +

    + +

    Additionally, the special value default can be used + to specify Apache's simple hardcoded message. While not required + under normal circumstances, default will restore + Apache's simple hardcoded message for configurations that would + otherwise inherit an existing ErrorDocument.

    + +

    + ErrorDocument 404 /cgi-bin/bad_urls.pl

    + <Directory /web/docs>
    + + ErrorDocument 404 default
    +
    + </Directory> +

    + +

    Note that when you specify an ErrorDocument + that points to a remote URL (ie. anything with a method such as + http in front of it), Apache will send a redirect to the + client to tell it where to find the document, even if the + document ends up being on the same server. This has several + implications, the most important being that the client will not + receive the original error status code, but instead will + receive a redirect status code. This in turn can confuse web + robots and other clients which try to determine if a URL is + valid using the status code. In addition, if you use a remote + URL in an ErrorDocument 401, the client will not + know to prompt the user for a password since it will not + receive the 401 status code. Therefore, if you use an + ErrorDocument 401 directive then it must refer to a local + document.

    + +

    Microsoft Internet Explorer (MSIE) will by default ignore + server-generated error messages when they are "too small" and substitute + its own "friendly" error messages. The size threshold varies depending on + the type of error, but in general, if you make your error document + greater than 512 bytes, then MSIE will show the server-generated + error rather than masking it. More information is available in + Microsoft Knowledge Base article Q294807.

    + +

    Although most error messages can be overriden, there are certain + circumstances where the internal messages are used regardless of the + setting of ErrorDocument. In + particular, if a malformed request is detected, normal request processing + will be immediately halted and the internal error message returned. + This is necessary to guard against security problems caused by + bad requests.

    + +

    If you are using mod_proxy, you may wish to enable + ProxyErrorOverride so that you can provide + custom error messages on behalf of your Origin servers. If you don't enable ProxyErrorOverride, + Apache will not generate custom error documents for proxied content.

    + +

    Prior to version 2.0, messages were indicated by prefixing + them with a single unmatched double quote character.

    + +

    See also

    + +
    +
    top
    +

    ErrorLog Directive

    + + + + + + + +
    Description:Location where the server will log errors
    Syntax: ErrorLog file-path|syslog[:facility]
    Default:ErrorLog logs/error_log (Unix) ErrorLog logs/error.log (Windows and OS/2)
    Context:server config, virtual host
    Status:Core
    Module:core
    +

    The ErrorLog directive sets the name of + the file to which the server will log any errors it encounters. If + the file-path is not absolute then it is assumed to be + relative to the ServerRoot.

    + +

    Example

    + ErrorLog /var/log/httpd/error_log +

    + +

    If the file-path + begins with a pipe (|) then it is assumed to be a command to spawn + to handle the error log.

    + +

    Example

    + ErrorLog "|/usr/local/bin/httpd_errors" +

    + +

    Using syslog instead of a filename enables logging + via syslogd(8) if the system supports it. The default is to use + syslog facility local7, but you can override this by + using the syslog:facility syntax where + facility can be one of the names usually documented in + syslog(1).

    + +

    Example

    + ErrorLog syslog:user +

    + +

    SECURITY: See the security tips + document for details on why your security could be compromised + if the directory where log files are stored is writable by + anyone other than the user that starts the server.

    +

    Note

    +

    When entering a file path on non-Unix platforms, care should be taken + to make sure that only forward slashed are used even though the platform + may allow the use of back slashes. In general it is a good idea to always + use forward slashes throughout the configuration files.

    +
    + +

    See also

    + +
    +
    top
    +

    FileETag Directive

    + + + + + + + + +
    Description:File attributes used to create the ETag +HTTP response header
    Syntax:FileETag component ...
    Default:FileETag INode MTime Size
    Context:server config, virtual host, directory, .htaccess
    Override:FileInfo
    Status:Core
    Module:core
    +

    + The FileETag directive configures the file + attributes that are used to create the ETag (entity + tag) response header field when the document is based on a file. + (The ETag value is used in cache management to save + network bandwidth.) In Apache 1.3.22 and earlier, the + ETag value was always formed + from the file's inode, size, and last-modified time (mtime). The + FileETag directive allows you to choose + which of these -- if any -- should be used. The recognized keywords are: +

    + +
    +
    INode
    +
    The file's i-node number will be included in the calculation
    +
    MTime
    +
    The date and time the file was last modified will be included
    +
    Size
    +
    The number of bytes in the file will be included
    +
    All
    +
    All available fields will be used. This is equivalent to: +

    FileETag INode MTime Size

    +
    None
    +
    If a document is file-based, no ETag field will be + included in the response
    +
    + +

    The INode, MTime, and Size + keywords may be prefixed with either + or -, + which allow changes to be made to the default setting inherited + from a broader scope. Any keyword appearing without such a prefix + immediately and completely cancels the inherited setting.

    + +

    If a directory's configuration includes + FileETag INode MTime Size, and a + subdirectory's includes FileETag -INode, + the setting for that subdirectory (which will be inherited by + any sub-subdirectories that don't override it) will be equivalent to + FileETag MTime Size.

    + +
    +
    top
    +

    <Files> Directive

    + + + + + + + +
    Description:Contains directives that apply to matched +filenames
    Syntax:<Files filename> ... </Files>
    Context:server config, virtual host, directory, .htaccess
    Override:All
    Status:Core
    Module:core
    +

    The <Files> directive + limits the scope of the enclosed directives by filename. It is comparable + to the <Directory> + and <Location> + directives. It should be matched with a </Files> + directive. The directives given within this section will be applied to + any object with a basename (last component of filename) matching the + specified filename. <Files> + sections are processed in the order they appear in the + configuration file, after the <Directory> sections and + .htaccess files are read, but before <Location> sections. Note + that <Files> can be nested + inside <Directory> sections to restrict the + portion of the filesystem they apply to.

    + +

    The filename argument should include a filename, or + a wild-card string, where ? matches any single character, + and * matches any sequences of characters. Extended regular + expressions can also be used, with the addition of the + ~ character. For example:

    + +

    + <Files ~ "\.(gif|jpe?g|png)$"> +

    + +

    would match most common Internet graphics formats. <FilesMatch> is preferred, + however.

    + +

    Note that unlike <Directory> and <Location> sections, <Files> sections can be used inside + .htaccess files. This allows users to control access to + their own files, at a file-by-file level.

    + + +

    See also

    + +
    +
    top
    +

    <FilesMatch> Directive

    + + + + + + + +
    Description:Contains directives that apply to regular-expression matched +filenames
    Syntax:<FilesMatch regex> ... </FilesMatch>
    Context:server config, virtual host, directory, .htaccess
    Override:All
    Status:Core
    Module:core
    +

    The <FilesMatch> directive + limits the scope of the enclosed directives by filename, just as the + <Files> directive + does. However, it accepts a regular expression. For example:

    + +

    + <FilesMatch "\.(gif|jpe?g|png)$"> +

    + +

    would match most common Internet graphics formats.

    + +

    See also

    + +
    +
    top
    +

    ForceType Directive

    + + + + + + + + +
    Description:Forces all matching files to be served with the specified +MIME content-type
    Syntax:ForceType MIME-type|None
    Context:directory, .htaccess
    Override:FileInfo
    Status:Core
    Module:core
    Compatibility:Moved to the core in Apache 2.0
    +

    When placed into an .htaccess file or a + <Directory>, or + <Location> or + <Files> + section, this directive forces all matching files to be served + with the content type identification given by + MIME-type. For example, if you had a directory full of + GIF files, but did not want to label them all with .gif, + you might want to use:

    + +

    + ForceType image/gif +

    + +

    Note that unlike DefaultType, + this directive overrides all mime-type associations, including + filename extensions, that might identify the media type.

    + +

    You can override any ForceType setting + by using the value of None:

    + +

    + # force all files to be image/gif:
    + <Location /images>
    + + ForceType image/gif
    +
    + </Location>
    +
    + # but normal mime-type associations here:
    + <Location /images/mixed>
    + + ForceType None
    +
    + </Location> +

    + +
    +
    top
    +

    HostnameLookups Directive

    + + + + + + + +
    Description:Enables DNS lookups on client IP addresses
    Syntax:HostnameLookups On|Off|Double
    Default:HostnameLookups Off
    Context:server config, virtual host, directory
    Status:Core
    Module:core
    +

    This directive enables DNS lookups so that host names can be + logged (and passed to CGIs/SSIs in REMOTE_HOST). + The value Double refers to doing double-reverse + DNS lookup. That is, after a reverse lookup is performed, a forward + lookup is then performed on that result. At least one of the IP + addresses in the forward lookup must match the original + address. (In "tcpwrappers" terminology this is called + PARANOID.)

    + +

    Regardless of the setting, when mod_access is + used for controlling access by hostname, a double reverse lookup + will be performed. This is necessary for security. Note that the + result of this double-reverse isn't generally available unless you + set HostnameLookups Double. For example, if only + HostnameLookups On and a request is made to an object + that is protected by hostname restrictions, regardless of whether + the double-reverse fails or not, CGIs will still be passed the + single-reverse result in REMOTE_HOST.

    + +

    The default is Off in order to save the network + traffic for those sites that don't truly need the reverse + lookups done. It is also better for the end users because they + don't have to suffer the extra latency that a lookup entails. + Heavily loaded sites should leave this directive + Off, since DNS lookups can take considerable + amounts of time. The utility logresolve, compiled by + default to the bin subdirectory of your installation + directory, can be used to look up host names from logged IP addresses + offline.

    + +
    +
    top
    +

    IdentityCheck Directive

    + + + + + + + +
    Description:Enables logging of the RFC1413 identity of the remote +user
    Syntax:IdentityCheck On|Off
    Default:IdentityCheck Off
    Context:server config, virtual host, directory
    Status:Core
    Module:core
    +

    This directive enables RFC1413-compliant logging of the + remote user name for each connection, where the client machine + runs identd or something similar. This information is logged in + the access log.

    + +

    The information should not be trusted in any way except for + rudimentary usage tracking.

    + +

    Note that this can cause serious latency problems accessing + your server since every request requires one of these lookups + to be performed. When firewalls are involved each lookup might + possibly fail and add 30 seconds of latency to each hit. So in + general this is not very useful on public servers accessible + from the Internet.

    + +
    +
    top
    +

    <IfDefine> Directive

    + + + + + + + +
    Description:Encloses directives that will be processed only +if a test is true at startup
    Syntax:<IfDefine [!]parameter-name> ... + </IfDefine>
    Context:server config, virtual host, directory, .htaccess
    Override:All
    Status:Core
    Module:core
    +

    The <IfDefine test>...</IfDefine> + section is used to mark directives that are conditional. The + directives within an <IfDefine> + section are only processed if the test is true. If + test is false, everything between the start and end markers is + ignored.

    + +

    The test in the <IfDefine> section directive can be one of two forms:

    + +
      +
    • parameter-name
    • + +
    • !parameter-name
    • +
    + +

    In the former case, the directives between the start and end + markers are only processed if the parameter named + parameter-name is defined. The second format reverses + the test, and only processes the directives if + parameter-name is not defined.

    + +

    The parameter-name argument is a define as given on + the httpd command line via -Dparameter- + , at the time the server was started.

    + +

    <IfDefine> sections are + nest-able, which can be used to implement simple + multiple-parameter tests. Example:

    + +

    + httpd -DReverseProxy ...
    +
    + # httpd.conf
    + <IfDefine ReverseProxy>
    + + LoadModule rewrite_module modules/mod_rewrite.so
    + LoadModule proxy_module modules/libproxy.so
    +
    + </IfDefine> +

    + +
    +
    top
    +

    <IfModule> Directive

    + + + + + + + +
    Description:Encloses directives that are processed conditional on the +presence or absence of a specific module
    Syntax:<IfModule [!]module-name> ... + </IfModule>
    Context:server config, virtual host, directory, .htaccess
    Override:All
    Status:Core
    Module:core
    +

    The <IfModule test>...</IfModule> + section is used to mark directives that are conditional on the presence of + a specific module. The directives within an <IfModule> section are only processed if the test + is true. If test is false, everything between the start and + end markers is ignored.

    + +

    The test in the <IfModule> section directive can be one of two forms:

    + +
      +
    • module name
    • + +
    • !module name
    • +
    + +

    In the former case, the directives between the start and end + markers are only processed if the module named module + name is included in Apache -- either compiled in or + dynamically loaded using LoadModule. The second format reverses the test, + and only processes the directives if module name is + not included.

    + +

    The module name argument is the file name of the + module, at the time it was compiled. For example, + mod_rewrite.c. If a module consists of several + source files, use the name of the file containing the string + STANDARD20_MODULE_STUFF.

    + +

    <IfModule> sections are + nest-able, which can be used to implement simple multiple-module + tests.

    + +
    This section should only be used if you need to have one + configuration file that works whether or not a specific module + is available. In normal operation, directives need not be + placed in <IfModule> + sections.
    + +
    +
    top
    +

    Include Directive

    + + + + + + + +
    Description:Includes other configuration files from within +the server configuration files
    Syntax:Include file-path|directory-path
    Context:server config, virtual host, directory
    Status:Core
    Module:core
    Compatibility:Wildcard matching available in 2.0.41 and later
    +

    This directive allows inclusion of other configuration files + from within the server configuration files.

    + +

    Shell-style (fnmatch()) wildcard characters can be used to + include several files at once, in alphabetical order. In + addition, if Include points to a directory, + rather than a file, Apache will read all files in that directory + and any subdirectory. But including entire directories is not + recommended, because it is easy to accidentally leave temporary + files in a directory that can cause httpd to + fail.

    + +

    The file path specified may be an absolute path, or may be relative + to the ServerRoot directory.

    + +

    Examples:

    + +

    + Include /usr/local/apache2/conf/ssl.conf
    + Include /usr/local/apache2/conf/vhosts/*.conf +

    + +

    Or, providing paths relative to your ServerRoot directory:

    + +

    + Include conf/ssl.conf
    + Include conf/vhosts/*.conf +

    + +

    See also

    + +
    +
    top
    +

    KeepAlive Directive

    + + + + + + + +
    Description:Enables HTTP persistent connections
    Syntax:KeepAlive On|Off
    Default:KeepAlive On
    Context:server config, virtual host
    Status:Core
    Module:core
    +

    The Keep-Alive extension to HTTP/1.0 and the persistent + connection feature of HTTP/1.1 provide long-lived HTTP sessions + which allow multiple requests to be sent over the same TCP + connection. In some cases this has been shown to result in an + almost 50% speedup in latency times for HTML documents with + many images. To enable Keep-Alive connections, set + KeepAlive On.

    + +

    For HTTP/1.0 clients, Keep-Alive connections will only be + used if they are specifically requested by a client. In + addition, a Keep-Alive connection with an HTTP/1.0 client can + only be used when the length of the content is known in + advance. This implies that dynamic content such as CGI output, + SSI pages, and server-generated directory listings will + generally not use Keep-Alive connections to HTTP/1.0 clients. + For HTTP/1.1 clients, persistent connections are the default + unless otherwise specified. If the client requests it, chunked + encoding will be used in order to send content of unknown + length over persistent connections.

    + +

    See also

    + +
    +
    top
    +

    KeepAliveTimeout Directive

    + + + + + + + +
    Description:Amount of time the server will wait for subsequent +requests on a persistent connection
    Syntax:KeepAliveTimeout seconds
    Default:KeepAliveTimeout 15
    Context:server config, virtual host
    Status:Core
    Module:core
    +

    The number of seconds Apache will wait for a subsequent + request before closing the connection. Once a request has been + received, the timeout value specified by the + Timeout directive applies.

    + +

    Setting KeepAliveTimeout to a high value + may cause performance problems in heavily loaded servers. The + higher the timeout, the more server processes will be kept + occupied waiting on connections with idle clients.

    + +

    In a name-based virtual host context, the value of the first + defined virtual host (the default host) in a set of NameVirtualHost will be used. + The other values will be ignored.

    + +
    +
    top
    +

    <Limit> Directive

    + + + + + + + +
    Description:Restrict enclosed access controls to only certain HTTP +methods
    Syntax:<Limit method [method] ... > ... + </Limit>
    Context:server config, virtual host, directory, .htaccess
    Override:All
    Status:Core
    Module:core
    +

    Access controls are normally effective for + all access methods, and this is the usual + desired behavior. In the general case, access control + directives should not be placed within a + <Limit> section.

    + +

    The purpose of the <Limit> + directive is to restrict the effect of the access controls to the + nominated HTTP methods. For all other methods, the access + restrictions that are enclosed in the <Limit> bracket will have no + effect. The following example applies the access control + only to the methods POST, PUT, and + DELETE, leaving all other methods unprotected:

    + +

    + <Limit POST PUT DELETE>
    + + Require valid-user
    +
    + </Limit> +

    + +

    The method names listed can be one or more of: GET, + POST, PUT, DELETE, + CONNECT, OPTIONS, + PATCH, PROPFIND, PROPPATCH, + MKCOL, COPY, MOVE, + LOCK, and UNLOCK. The method name is + case-sensitive. If GET is used it will also + restrict HEAD requests. The TRACE method + cannot be limited.

    + +
    A <LimitExcept> section should always be + used in preference to a <Limit> section when restricting access, + since a <LimitExcept> section provides protection + against arbitrary methods.
    + + +
    +
    top
    +

    <LimitExcept> Directive

    + + + + + + + +
    Description:Restrict access controls to all HTTP methods +except the named ones
    Syntax:<LimitExcept method [method] ... > ... + </LimitExcept>
    Context:server config, virtual host, directory, .htaccess
    Override:All
    Status:Core
    Module:core
    +

    <LimitExcept> and + </LimitExcept> are used to enclose + a group of access control directives which will then apply to any + HTTP access method not listed in the arguments; + i.e., it is the opposite of a <Limit> section and can be used to control + both standard and nonstandard/unrecognized methods. See the + documentation for <Limit> for more details.

    + +

    For example:

    + +

    + <LimitExcept POST GET>
    + + Require valid-user
    +
    + </LimitExcept> +

    + + +
    +
    top
    +

    LimitInternalRecursion Directive

    + + + + + + + + +
    Description:Determine maximum number of internal redirects and nested +subrequests
    Syntax:LimitInternalRecursion number [number]
    Default:LimitInternalRecursion 10
    Context:server config, virtual host
    Status:Core
    Module:core
    Compatibility:Available in Apache 2.0.47 and later
    +

    An internal redirect happens, for example, when using the Action directive, which internally + redirects the original request to a CGI script. A subrequest is Apache's + mechanism to find out what would happen for some URI if it were requested. + For example, mod_dir uses subrequests to look for the + files listed in the DirectoryIndex + directive.

    + +

    LimitInternalRecursion prevents the server + from crashing when entering an infinite loop of internal redirects or + subrequests. Such loops are usually caused by misconfigurations.

    + +

    The directive stores two different limits, which are evaluated on + per-request basis. The first number is the maximum number of + internal redirects, that may follow each other. The second number + determines, how deep subrequests may be nested. If you specify only one + number, it will be assigned to both limits.

    + +

    Example

    + LimitInternalRecursion 5 +

    + +
    +
    top
    +

    LimitRequestBody Directive

    + + + + + + + + +
    Description:Restricts the total size of the HTTP request body sent +from the client
    Syntax:LimitRequestBody bytes
    Default:LimitRequestBody 0
    Context:server config, virtual host, directory, .htaccess
    Override:All
    Status:Core
    Module:core
    +

    This directive specifies the number of bytes from 0 + (meaning unlimited) to 2147483647 (2GB) that are allowed in a + request body.

    + +

    The LimitRequestBody directive allows + the user to set a limit on the allowed size of an HTTP request + message body within the context in which the directive is given + (server, per-directory, per-file or per-location). If the client + request exceeds that limit, the server will return an error + response instead of servicing the request. The size of a normal + request message body will vary greatly depending on the nature of + the resource and the methods allowed on that resource. CGI scripts + typically use the message body for retrieving form information. + Implementations of the PUT method will require + a value at least as large as any representation that the server + wishes to accept for that resource.

    + +

    This directive gives the server administrator greater + control over abnormal client request behavior, which may be + useful for avoiding some forms of denial-of-service + attacks.

    + +

    If, for example, you are permitting file upload to a particular + location, and wish to limit the size of the uploaded file to 100K, + you might use the following directive:

    + +

    + LimitRequestBody 102400 +

    + + +
    +
    top
    +

    LimitRequestFields Directive

    + + + + + + + +
    Description:Limits the number of HTTP request header fields that +will be accepted from the client
    Syntax:LimitRequestFields number
    Default:LimitRequestFields 100
    Context:server config
    Status:Core
    Module:core
    +

    Number is an integer from 0 (meaning unlimited) to + 32767. The default value is defined by the compile-time + constant DEFAULT_LIMIT_REQUEST_FIELDS (100 as + distributed).

    + +

    The LimitRequestFields directive allows + the server administrator to modify the limit on the number of + request header fields allowed in an HTTP request. A server needs + this value to be larger than the number of fields that a normal + client request might include. The number of request header fields + used by a client rarely exceeds 20, but this may vary among + different client implementations, often depending upon the extent + to which a user has configured their browser to support detailed + content negotiation. Optional HTTP extensions are often expressed + using request header fields.

    + +

    This directive gives the server administrator greater + control over abnormal client request behavior, which may be + useful for avoiding some forms of denial-of-service attacks. + The value should be increased if normal clients see an error + response from the server that indicates too many fields were + sent in the request.

    + +

    For example:

    + +

    + LimitRequestFields 50 +

    + + +
    +
    top
    +

    LimitRequestFieldSize Directive

    + + + + + + + +
    Description:Limits the size of the HTTP request header allowed from the +client
    Syntax:LimitRequestFieldsize bytes
    Default:LimitRequestFieldsize 8190
    Context:server config
    Status:Core
    Module:core
    +

    This directive specifies the number of bytes + that will be allowed in an HTTP request header.

    + +

    The LimitRequestFieldSize directive + allows the server administrator to reduce or increase the limit + on the allowed size of an HTTP request header field. A server + needs this value to be large enough to hold any one header field + from a normal client request. The size of a normal request header + field will vary greatly among different client implementations, + often depending upon the extent to which a user has configured + their browser to support detailed content negotiation. SPNEGO + authentication headers can be up to 12392 bytes.

    + +

    This directive gives the server administrator greater + control over abnormal client request behavior, which may be + useful for avoiding some forms of denial-of-service attacks.

    + +

    For example:

    + +

    + LimitRequestFieldSize 4094 +

    + +
    Under normal conditions, the value should not be changed from + the default.
    + +
    Apache 2.0.53 or higher is required for increasing the + limit above the compiled-in value of DEFAULT_LIMIT_REQUEST_FIELDSIZE + (8190 as distributed). +
    + + +
    +
    top
    +

    LimitRequestLine Directive

    + + + + + + + +
    Description:Limit the size of the HTTP request line that will be accepted +from the client
    Syntax:LimitRequestLine bytes
    Default:LimitRequestLine 8190
    Context:server config
    Status:Core
    Module:core
    +

    This directive sets the number of bytes from 0 to + the value of the compile-time constant + DEFAULT_LIMIT_REQUEST_LINE (8190 as distributed) + that will be allowed on the HTTP request-line.

    + +

    The LimitRequestLine directive allows + the server administrator to reduce the limit on the allowed size + of a client's HTTP request-line below the normal input buffer size + compiled with the server. Since the request-line consists of the + HTTP method, URI, and protocol version, the + LimitRequestLine directive places a + restriction on the length of a request-URI allowed for a request + on the server. A server needs this value to be large enough to + hold any of its resource names, including any information that + might be passed in the query part of a GET request.

    + +

    This directive gives the server administrator greater + control over abnormal client request behavior, which may be + useful for avoiding some forms of denial-of-service attacks.

    + +

    For example:

    + +

    + LimitRequestLine 4094 +

    + +
    Under normal conditions, the value should not be changed from + the default.
    + +
    +
    top
    +

    LimitXMLRequestBody Directive

    + + + + + + + + +
    Description:Limits the size of an XML-based request body
    Syntax:LimitXMLRequestBody bytes
    Default:LimitXMLRequestBody 1000000
    Context:server config, virtual host, directory, .htaccess
    Override:All
    Status:Core
    Module:core
    +

    Limit (in bytes) on maximum size of an XML-based request + body. A value of 0 will disable any checking.

    + +

    Example:

    + +

    + LimitXMLRequestBody 0 +

    + + +
    +
    top
    +

    <Location> Directive

    + + + + + + +
    Description:Applies the enclosed directives only to matching +URLs
    Syntax:<Location + URL-path|URL> ... </Location>
    Context:server config, virtual host
    Status:Core
    Module:core
    +

    The <Location> directive + limits the scope of the enclosed directives by URL. It is similar to the + <Directory> + directive, and starts a subsection which is terminated with a + </Location> directive. <Location> sections are processed in the + order they appear in the configuration file, after the <Directory> sections and + .htaccess files are read, and after the <Files> sections.

    + +

    <Location> sections operate + completely outside the filesystem. This has several consequences. + Most importantly, <Location> + directives should not be used to control access to filesystem + locations. Since several different URLs may map to the same + filesystem location, such access controls may by circumvented.

    + +

    When to use <Location>

    + +

    Use <Location> to apply + directives to content that lives outside the filesystem. For + content that lives in the filesystem, use <Directory> and <Files>. An exception is + <Location />, which is an easy way to + apply a configuration to the entire server.

    +
    + +

    For all origin (non-proxy) requests, the URL to be matched is a + URL-path of the form /path/. No scheme, hostname, + port, or query string may be included. For proxy requests, the + URL to be matched is of the form + scheme://servername/path, and you must include the + prefix.

    + +

    The URL may use wildcards. In a wild-card string, ? matches + any single character, and * matches any sequences of + characters.

    + +

    Extended regular + expressions can also be used, with the addition of the + ~ character. For example:

    + +

    + <Location ~ "/(extra|special)/data"> +

    + +

    would match URLs that contained the substring /extra/data + or /special/data. The directive <LocationMatch> behaves + identical to the regex version of <Location>.

    + +

    The <Location> + functionality is especially useful when combined with the + SetHandler + directive. For example, to enable status requests, but allow them + only from browsers at foo.com, you might use:

    + +

    + <Location /status>
    + + SetHandler server-status
    + Order Deny,Allow
    + Deny from all
    + Allow from .foo.com
    +
    + </Location> +

    + +

    Note about / (slash)

    +

    The slash character has special meaning depending on where in a + URL it appears. People may be used to its behavior in the filesystem + where multiple adjacent slashes are frequently collapsed to a single + slash (i.e., /home///foo is the same as + /home/foo). In URL-space this is not necessarily true. + The <LocationMatch> + directive and the regex version of <Location> require you to explicitly specify multiple + slashes if that is your intention.

    + +

    For example, <LocationMatch ^/abc> would match + the request URL /abc but not the request URL + //abc. The (non-regex) <Location> directive behaves similarly when used for + proxy requests. But when (non-regex) <Location> is used for non-proxy requests it will + implicitly match multiple slashes with a single slash. For example, + if you specify <Location /abc/def> and the + request is to /abc//def then it will match.

    +
    + +

    See also

    + +
    +
    top
    +

    <LocationMatch> Directive

    + + + + + + +
    Description:Applies the enclosed directives only to regular-expression +matching URLs
    Syntax:<LocationMatch + regex> ... </LocationMatch>
    Context:server config, virtual host
    Status:Core
    Module:core
    +

    The <LocationMatch> directive + limits the scope of the enclosed directives by URL, in an identical manner + to <Location>. However, + it takes a regular expression as an argument instead of a simple + string. For example:

    + +

    + <LocationMatch "/(extra|special)/data"> +

    + +

    would match URLs that contained the substring /extra/data + or /special/data.

    + +

    See also

    + +
    +
    top
    +

    LogLevel Directive

    + + + + + + + +
    Description:Controls the verbosity of the ErrorLog
    Syntax:LogLevel level
    Default:LogLevel warn
    Context:server config, virtual host
    Status:Core
    Module:core
    +

    LogLevel adjusts the verbosity of the + messages recorded in the error logs (see ErrorLog directive). The following + levels are available, in order of decreasing + significance:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Level Description Example
    emerg Emergencies - system is unusable."Child cannot open lock file. Exiting"
    alert Action must be taken immediately."getpwuid: couldn't determine user name from uid"
    crit Critical Conditions."socket: Failed to get a socket, exiting child"
    error Error conditions."Premature end of script headers"
    warn Warning conditions."child process 1234 did not exit, sending another + SIGHUP"
    notice Normal but significant condition."httpd: caught SIGBUS, attempting to dump core in + ..."
    info Informational."Server seems busy, (you may need to increase + StartServers, or Min/MaxSpareServers)..."
    debug Debug-level messages"Opening config file ..."
    + +

    When a particular level is specified, messages from all + other levels of higher significance will be reported as well. + E.g., when LogLevel info is specified, + then messages with log levels of notice and + warn will also be posted.

    + +

    Using a level of at least crit is + recommended.

    + +

    For example:

    + +

    + LogLevel notice +

    + +

    Note

    +

    When logging to a regular file messages of the level + notice cannot be suppressed and thus are always + logged. However, this doesn't apply when logging is done + using syslog.

    +
    + +
    +
    top
    +

    MaxKeepAliveRequests Directive

    + + + + + + + +
    Description:Number of requests allowed on a persistent +connection
    Syntax:MaxKeepAliveRequests number
    Default:MaxKeepAliveRequests 100
    Context:server config, virtual host
    Status:Core
    Module:core
    +

    The MaxKeepAliveRequests directive + limits the number of requests allowed per connection when + KeepAlive is on. If it is + set to 0, unlimited requests will be allowed. We + recommend that this setting be kept to a high value for maximum + server performance.

    + +

    For example:

    + +

    + MaxKeepAliveRequests 500 +

    + +
    +
    top
    +

    NameVirtualHost Directive

    + + + + + + +
    Description:Designates an IP address for name-virtual +hosting
    Syntax:NameVirtualHost addr[:port]
    Context:server config
    Status:Core
    Module:core
    +

    The NameVirtualHost directive is a + required directive if you want to configure name-based virtual hosts.

    + +

    Although addr can be hostname it is recommended + that you always use an IP address, e.g.

    + +

    + NameVirtualHost 111.22.33.44 +

    + +

    With the NameVirtualHost directive you + specify the IP address on which the server will receive requests + for the name-based virtual hosts. This will usually be the address + to which your name-based virtual host names resolve. In cases + where a firewall or other proxy receives the requests and forwards + them on a different IP address to the server, you must specify the + IP address of the physical interface on the machine which will be + servicing the requests. If you have multiple name-based hosts on + multiple addresses, repeat the directive for each address.

    + +

    Note

    +

    Note, that the "main server" and any _default_ servers + will never be served for a request to a + NameVirtualHost IP address (unless for some + reason you specify NameVirtualHost but then + don't define any VirtualHosts for that + address).

    +
    + +

    Optionally you can specify a port number on which the + name-based virtual hosts should be used, e.g.

    + +

    + NameVirtualHost 111.22.33.44:8080 +

    + +

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

    + +

    + NameVirtualHost [2001:db8::a00:20ff:fea7:ccea]:8080 +

    + +

    To receive requests on all interfaces, you can use an argument of + *

    + +

    + NameVirtualHost * +

    + +

    Argument to <VirtualHost> + directive

    +

    Note that the argument to the <VirtualHost> directive must + exactly match the argument to the NameVirtualHost directive.

    + +

    + NameVirtualHost 1.2.3.4
    + <VirtualHost 1.2.3.4>
    + # ...
    + </VirtualHost>
    +

    +
    + +

    See also

    + +
    +
    top
    +

    Options Directive

    + + + + + + + + +
    Description:Configures what features are available in a particular +directory
    Syntax:Options + [+|-]option [[+|-]option] ...
    Default:Options All
    Context:server config, virtual host, directory, .htaccess
    Override:Options
    Status:Core
    Module:core
    +

    The Options directive controls which + server features are available in a particular directory.

    + +

    option can be set to None, in which + case none of the extra features are enabled, or one or more of + the following:

    + +
    +
    All
    + +
    All options except for MultiViews. This is the default + setting.
    + +
    ExecCGI
    + +
    + Execution of CGI scripts using mod_cgi + is permitted.
    + +
    FollowSymLinks
    + +
    + + The server will follow symbolic links in this directory. +
    +

    Even though the server follows the symlink it does not + change the pathname used to match against <Directory> sections.

    +

    Note also, that this option gets ignored if set + inside a <Location> + section.

    +
    + +
    Includes
    + +
    + Server-side includes provided by mod_include + are permitted.
    + +
    IncludesNOEXEC
    + +
    + + Server-side includes are permitted, but the #exec + cmd and #exec cgi are disabled. It is still + possible to #include virtual CGI scripts from + ScriptAliased + directories.
    + +
    Indexes
    + +
    + If a URL which maps to a directory is requested, and there + is no DirectoryIndex + (e.g., index.html) in that directory, then + mod_autoindex will return a formatted listing + of the directory.
    + +
    MultiViews
    + +
    + Content negotiated + "MultiViews" are allowed using + mod_negotiation.
    + +
    SymLinksIfOwnerMatch
    + +
    The server will only follow symbolic links for which the + target file or directory is owned by the same user id as the + link. + +

    Note

    This option gets ignored if + set inside a <Location> section.
    +
    +
    + +

    Normally, if multiple Options could + apply to a directory, then the most specific one is used and + others are ignored; the options are not merged. (See how sections are merged.) + However if all the options on the + Options directive are preceded by a + + or - symbol, the options are + merged. Any options preceded by a + are added to the + options currently in force, and any options preceded by a + - are removed from the options currently in + force.

    + +

    Warning

    +

    Mixing Options with a + or + - with those without is not valid syntax, and is likely + to cause unexpected results.

    +
    + +

    For example, without any + and - symbols:

    + +

    + <Directory /web/docs>
    + + Options Indexes FollowSymLinks
    +
    + </Directory>
    +
    + <Directory /web/docs/spec>
    + + Options Includes
    +
    + </Directory> +

    + +

    then only Includes will be set for the + /web/docs/spec directory. However if the second + Options directive uses the + and + - symbols:

    + +

    + <Directory /web/docs>
    + + Options Indexes FollowSymLinks
    +
    + </Directory>
    +
    + <Directory /web/docs/spec>
    + + Options +Includes -Indexes
    +
    + </Directory> +

    + +

    then the options FollowSymLinks and + Includes are set for the /web/docs/spec + directory.

    + +

    Note

    +

    Using -IncludesNOEXEC or + -Includes disables server-side includes completely + regardless of the previous setting.

    +
    + +

    The default in the absence of any other settings is + All.

    + +
    +
    top
    +

    Require Directive

    + + + + + + + +
    Description:Selects which authenticated users can access +a resource
    Syntax:Require entity-name [entity-name] ...
    Context:directory, .htaccess
    Override:AuthConfig
    Status:Core
    Module:core
    +

    This directive selects which authenticated users can access + a resource. The allowed syntaxes are:

    + +
    +
    Require user userid [userid] + ...
    +
    Only the named users can access the resource.
    + +
    Require group group-name [group-name] + ...
    +
    Only users in the named groups can access the resource.
    + +
    Require valid-user
    +
    All valid users can access the resource.
    +
    + +

    Require must be accompanied by + AuthName and AuthType directives, and directives such + as AuthUserFile + and AuthGroupFile (to + define users and groups) in order to work correctly. Example:

    + +

    + AuthType Basic
    + AuthName "Restricted Resource"
    + AuthUserFile /web/users
    + AuthGroupFile /web/groups
    + Require group admin +

    + +

    Access controls which are applied in this way are effective for + all methods. This is what is normally + desired. If you wish to apply access controls only to + specific methods, while leaving other methods unprotected, then + place the Require statement into a + <Limit> + section.

    + +

    See also

    + +
    +
    top
    +

    RLimitCPU Directive

    + + + + + + + + +
    Description:Limits the CPU consumption of processes launched +by Apache children
    Syntax:RLimitCPU seconds|max [seconds|max]
    Default:Unset; uses operating system defaults
    Context:server config, virtual host, directory, .htaccess
    Override:All
    Status:Core
    Module:core
    +

    Takes 1 or 2 parameters. The first parameter sets the soft + resource limit for all processes and the second parameter sets + the maximum resource limit. Either parameter can be a number, + or max to indicate to the server that the limit should + be set to the maximum allowed by the operating system + configuration. Raising the maximum resource limit requires that + the server is running as root, or in the initial startup + phase.

    + +

    This applies to processes forked off from Apache children + servicing requests, not the Apache children themselves. This + includes CGI scripts and SSI exec commands, but not any + processes forked off from the Apache parent such as piped + logs.

    + +

    CPU resource limits are expressed in seconds per + process.

    + +

    See also

    + +
    +
    top
    +

    RLimitMEM Directive

    + + + + + + + + +
    Description:Limits the memory consumption of processes launched +by Apache children
    Syntax:RLimitMEM bytes|max [bytes|max]
    Default:Unset; uses operating system defaults
    Context:server config, virtual host, directory, .htaccess
    Override:All
    Status:Core
    Module:core
    +

    Takes 1 or 2 parameters. The first parameter sets the soft + resource limit for all processes and the second parameter sets + the maximum resource limit. Either parameter can be a number, + or max to indicate to the server that the limit should + be set to the maximum allowed by the operating system + configuration. Raising the maximum resource limit requires that + the server is running as root, or in the initial startup + phase.

    + +

    This applies to processes forked off from Apache children + servicing requests, not the Apache children themselves. This + includes CGI scripts and SSI exec commands, but not any + processes forked off from the Apache parent such as piped + logs.

    + +

    Memory resource limits are expressed in bytes per + process.

    + +

    See also

    + +
    +
    top
    +

    RLimitNPROC Directive

    + + + + + + + + +
    Description:Limits the number of processes that can be launched by +processes launched by Apache children
    Syntax:RLimitNPROC number|max [number|max]
    Default:Unset; uses operating system defaults
    Context:server config, virtual host, directory, .htaccess
    Override:All
    Status:Core
    Module:core
    +

    Takes 1 or 2 parameters. The first parameter sets the soft + resource limit for all processes and the second parameter sets + the maximum resource limit. Either parameter can be a number, + or max to indicate to the server that the limit + should be set to the maximum allowed by the operating system + configuration. Raising the maximum resource limit requires that + the server is running as root, or in the initial startup + phase.

    + +

    This applies to processes forked off from Apache children + servicing requests, not the Apache children themselves. This + includes CGI scripts and SSI exec commands, but not any + processes forked off from the Apache parent such as piped + logs.

    + +

    Process limits control the number of processes per user.

    + +

    Note

    +

    If CGI processes are not running + under user ids other than the web server user id, this directive + will limit the number of processes that the server itself can + create. Evidence of this situation will be indicated by + cannot fork messages in the + error_log.

    +
    + +

    See also

    + +
    +
    top
    +

    Satisfy Directive

    + + + + + + + + + +
    Description:Interaction between host-level access control and +user authentication
    Syntax:Satisfy Any|All
    Default:Satisfy All
    Context:directory, .htaccess
    Override:AuthConfig
    Status:Core
    Module:core
    Compatibility:Influenced by <Limit> and <LimitExcept> in version 2.0.51 and +later
    +

    Access policy if both Allow and Require used. The parameter can be + either All or Any. This directive is only + useful if access to a particular area is being restricted by both + username/password and client host address. In this case + the default behavior (All) is to require that the client + passes the address access restriction and enters a valid + username and password. With the Any option the client will be + granted access if they either pass the host restriction or enter a + valid username and password. This can be used to password restrict + an area, but to let clients from particular addresses in without + prompting for a password.

    + +

    For example, if you wanted to let people on your network have + unrestricted access to a portion of your website, but require that + people outside of your network provide a password, you could use a + configuration similar to the following:

    + +

    + Require valid-user
    + Allow from 192.168.1
    + Satisfy Any +

    + +

    Since version 2.0.51 Satisfy directives can + be restricted to particular methods by <Limit> and <LimitExcept> sections.

    + +

    See also

    + +
    +
    top
    +

    ScriptInterpreterSource Directive

    + + + + + + + + + +
    Description:Technique for locating the interpreter for CGI +scripts
    Syntax:ScriptInterpreterSource Registry|Registry-Strict|Script
    Default:ScriptInterpreterSource Script
    Context:server config, virtual host, directory, .htaccess
    Override:FileInfo
    Status:Core
    Module:core
    Compatibility:Win32 only; +option Registry-Strict is available in Apache 2.0 and +later
    +

    This directive is used to control how Apache finds the + interpreter used to run CGI scripts. The default setting is + Script. This causes Apache to use the interpreter pointed to + by the shebang line (first line, starting with #!) in the + script. On Win32 systems this line usually looks like:

    + +

    + #!C:/Perl/bin/perl.exe +

    + +

    or, if perl is in the PATH, simply:

    + +

    + #!perl +

    + +

    Setting ScriptInterpreterSource Registry will + cause the Windows Registry tree HKEY_CLASSES_ROOT to be + searched using the script file extension (e.g., .pl) as a + search key. The command defined by the registry subkey + Shell\ExecCGI\Command or, if it does not exist, by the subkey + Shell\Open\Command is used to open the script file. If the + registry keys cannot be found, Apache falls back to the behavior of the + Script option.

    + +

    Security

    +

    Be careful when using ScriptInterpreterSource + Registry with ScriptAlias'ed directories, because + Apache will try to execute every file within this + directory. The Registry setting may cause undesired + program calls on files which are typically not executed. For + example, the default open command on .htm files on + most Windows systems will execute Microsoft Internet Explorer, so + any HTTP request for an .htm file existing within the + script directory would start the browser in the background on the + server. This is a good way to crash your system within a minute or + so.

    +
    + +

    The option Registry-Strict which is new in Apache + 2.0 does the same thing as Registry but uses only the + subkey Shell\ExecCGI\Command. The + ExecCGI key is not a common one. It must be + configured manually in the windows registry and hence prevents + accidental program calls on your system.

    + +
    +
    top
    +

    ServerAdmin Directive

    + + + + + + +
    Description:Email address that the server includes in error +messages sent to the client
    Syntax:ServerAdmin email-address
    Context:server config, virtual host
    Status:Core
    Module:core
    +

    The ServerAdmin sets the e-mail address + that the server includes in any error messages it returns to the + client.

    + +

    It may be worth setting up a dedicated address for this, e.g.

    + +

    + ServerAdmin www-admin@foo.example.com +

    +

    as users do not always mention that they are talking about the + server!

    + +
    +
    top
    +

    ServerAlias Directive

    + + + + + + +
    Description:Alternate names for a host used when matching requests +to name-virtual hosts
    Syntax:ServerAlias hostname [hostname] ...
    Context:virtual host
    Status:Core
    Module:core
    +

    The ServerAlias directive sets the + alternate names for a host, for use with name-based virtual hosts.

    + +

    + <VirtualHost *>
    + ServerName server.domain.com
    + ServerAlias server server2.domain.com server2
    + # ...
    + </VirtualHost> +

    + +

    See also

    + +
    +
    top
    +

    ServerName Directive

    + + + + + + + +
    Description:Hostname and port that the server uses to identify +itself
    Syntax:ServerName fully-qualified-domain-name[:port]
    Context:server config, virtual host
    Status:Core
    Module:core
    Compatibility:In version 2.0, this + directive supersedes the functionality of the Port + directive from version 1.3.
    +

    The ServerName directive sets the hostname and + port that the server uses to identify itself. This is used when + creating redirection URLs. For example, if the name of the + machine hosting the web server is simple.example.com, + but the machine also has the DNS alias www.example.com + and you wish the web server to be so identified, the following + directive should be used:

    + +

    + ServerName www.example.com:80 +

    + +

    If no ServerName is specified, then the + server attempts to deduce the hostname by performing a reverse + lookup on the IP address. If no port is specified in the + ServerName, then the server will use the port + from the incoming + request. For optimal reliability and predictability, you should + specify an explicit hostname and port using the + ServerName directive.

    + +

    If you are using name-based virtual hosts, + the ServerName inside a + <VirtualHost> + section specifies what hostname must appear in the request's + Host: header to match this virtual host.

    + +

    See the description of the + UseCanonicalName directive for + settings which determine whether self-referential URL's (e.g., by the + mod_dir module) will refer to the + specified port, or to the port number given in the client's request. +

    + +

    See also

    + +
    +
    top
    +

    ServerPath Directive

    + + + + + + +
    Description:Legacy URL pathname for a name-based virtual host that +is accessed by an incompatible browser
    Syntax:ServerPath URL-path
    Context:virtual host
    Status:Core
    Module:core
    +

    The ServerPath directive sets the legacy + URL pathname for a host, for use with name-based virtual hosts.

    + +

    See also

    + +
    +
    top
    +

    ServerRoot Directive

    + + + + + + + +
    Description:Base directory for the server installation
    Syntax:ServerRoot directory-path
    Default:ServerRoot /usr/local/apache
    Context:server config
    Status:Core
    Module:core
    +

    The ServerRoot directive sets the + directory in which the server lives. Typically it will contain the + subdirectories conf/ and logs/. Relative + paths in other configuration directives (such as Include or LoadModule, for example) are taken as + relative to this directory.

    + +

    Example

    + ServerRoot /home/httpd +

    + + +

    See also

    + +
    +
    top
    +

    ServerSignature Directive

    + + + + + + + + +
    Description:Configures the footer on server-generated documents
    Syntax:ServerSignature On|Off|EMail
    Default:ServerSignature Off
    Context:server config, virtual host, directory, .htaccess
    Override:All
    Status:Core
    Module:core
    +

    The ServerSignature directive allows the + configuration of a trailing footer line under server-generated + documents (error messages, mod_proxy ftp directory + listings, mod_info output, ...). The reason why you + would want to enable such a footer line is that in a chain of proxies, + the user often has no possibility to tell which of the chained servers + actually produced a returned error message.

    + +

    The Off + setting, which is the default, suppresses the footer line (and is + therefore compatible with the behavior of Apache-1.2 and + below). The On setting simply adds a line with the + server version number and ServerName of the serving virtual host, + and the EMail setting additionally creates a + "mailto:" reference to the ServerAdmin of the referenced + document.

    + +

    After version 2.0.44, the details of the server version number + presented are controlled by the ServerTokens directive.

    + +

    See also

    + +
    +
    top
    +

    ServerTokens Directive

    + + + + + + + +
    Description:Configures the Server HTTP response +header
    Syntax:ServerTokens Major|Minor|Min[imal]|Prod[uctOnly]|OS|Full
    Default:ServerTokens Full
    Context:server config
    Status:Core
    Module:core
    +

    This directive controls whether Server response + header field which is sent back to clients includes a + description of the generic OS-type of the server as well as + information about compiled-in modules.

    + +
    +
    ServerTokens Prod[uctOnly]
    + +
    Server sends (e.g.): Server: + Apache
    + +
    ServerTokens Major
    + +
    Server sends (e.g.): Server: + Apache/2
    + +
    ServerTokens Minor
    + +
    Server sends (e.g.): Server: + Apache/2.0
    + +
    ServerTokens Min[imal]
    + +
    Server sends (e.g.): Server: + Apache/2.0.41
    + +
    ServerTokens OS
    + +
    Server sends (e.g.): Server: Apache/2.0.41 + (Unix)
    + +
    ServerTokens Full (or not specified)
    + +
    Server sends (e.g.): Server: Apache/2.0.41 + (Unix) PHP/4.2.2 MyMod/1.2
    +
    + +

    This setting applies to the entire server, and cannot be + enabled or disabled on a virtualhost-by-virtualhost basis.

    + +

    After version 2.0.44, this directive also controls the + information presented by the ServerSignature directive.

    + +

    See also

    + +
    +
    top
    +

    SetHandler Directive

    + + + + + + + + +
    Description:Forces all matching files to be processed by a +handler
    Syntax:SetHandler handler-name|None
    Context:server config, virtual host, directory, .htaccess
    Override:FileInfo
    Status:Core
    Module:core
    Compatibility:Moved into the core in Apache 2.0
    +

    When placed into an .htaccess file or a + <Directory> or + <Location> + section, this directive forces all matching files to be parsed + through the handler given by + handler-name. For example, if you had a directory you + wanted to be parsed entirely as imagemap rule files, regardless + of extension, you might put the following into an + .htaccess file in that directory:

    + +

    + SetHandler imap-file +

    + +

    Another example: if you wanted to have the server display a + status report whenever a URL of + http://servername/status was called, you might put + the following into httpd.conf:

    + +

    + <Location /status>
    + + SetHandler server-status
    +
    + </Location> +

    + +

    You can override an earlier defined SetHandler + directive by using the value None.

    + +

    See also

    + +
    +
    top
    +

    SetInputFilter Directive

    + + + + + + + +
    Description:Sets the filters that will process client requests and POST +input
    Syntax:SetInputFilter filter[;filter...]
    Context:server config, virtual host, directory, .htaccess
    Override:FileInfo
    Status:Core
    Module:core
    +

    The SetInputFilter directive sets the + filter or filters which will process client requests and POST + input when they are received by the server. This is in addition to + any filters defined elsewhere, including the + AddInputFilter + directive.

    + +

    If more than one filter is specified, they must be separated + by semicolons in the order in which they should process the + content.

    + +

    See also

    + +
    +
    top
    +

    SetOutputFilter Directive

    + + + + + + + +
    Description:Sets the filters that will process responses from the +server
    Syntax:SetOutputFilter filter[;filter...]
    Context:server config, virtual host, directory, .htaccess
    Override:FileInfo
    Status:Core
    Module:core
    +

    The SetOutputFilter directive sets the filters + which will process responses from the server before they are + sent to the client. This is in addition to any filters defined + elsewhere, including the + AddOutputFilter + directive.

    + +

    For example, the following configuration will process all files + in the /www/data/ directory for server-side + includes.

    + +

    + <Directory /www/data/>
    + + SetOutputFilter INCLUDES
    +
    + </Directory> +

    + +

    If more than one filter is specified, they must be separated + by semicolons in the order in which they should process the + content.

    + +

    See also

    + +
    +
    top
    +

    TimeOut Directive

    + + + + + + + +
    Description:Amount of time the server will wait for +certain events before failing a request
    Syntax:TimeOut seconds
    Default:TimeOut 300
    Context:server config, virtual host
    Status:Core
    Module:core
    +

    The TimeOut directive currently defines + the amount of time Apache will wait for three things:

    + +
      +
    1. The total amount of time it takes to receive a GET + request.
    2. + +
    3. The amount of time between receipt of TCP packets on a + POST or PUT request.
    4. + +
    5. The amount of time between ACKs on transmissions of TCP + packets in responses.
    6. +
    + +

    We plan on making these separately configurable at some point + down the road. The timer used to default to 1200 before 1.2, + but has been lowered to 300 which is still far more than + necessary in most situations. It is not set any lower by + default because there may still be odd places in the code where + the timer is not reset when a packet is sent.

    + +
    +
    top
    +

    TraceEnable Directive

    + + + + + + + + +
    Description:Determines the behaviour on TRACE +requests
    Syntax:TraceEnable [on|off|extended]
    Default:TraceEnable on
    Context:server config
    Status:Core
    Module:core
    Compatibility:Available in Apache 1.3.34, 2.0.55 and later
    +

    This directive overrides the behavior of TRACE for both + the core server and mod_proxy. The default + TraceEnable on permits TRACE requests per + RFC 2616, which disallows any request body to accompany the request. + TraceEnable off causes the core server and + mod_proxy to return a 405 (Method not + allowed) error to the client.

    + +

    Finally, for testing and diagnostic purposes only, request + bodies may be allowed using the non-compliant TraceEnable + extended directive. The core (as an origin server) will + restrict the request body to 64k (plus 8k for chunk headers if + Transfer-Encoding: chunked is used). The core will + reflect the full headers and all chunk headers with the response + body. As a proxy server, the request body is not restricted to 64k.

    + +
    +
    top
    +

    UseCanonicalName Directive

    + + + + + + + +
    Description:Configures how the server determines its own name and +port
    Syntax:UseCanonicalName On|Off|DNS
    Default:UseCanonicalName On
    Context:server config, virtual host, directory
    Status:Core
    Module:core
    +

    In many situations Apache must construct a self-referential + URL -- that is, a URL that refers back to the same server. With + UseCanonicalName On Apache will use the hostname and port + specified in the ServerName + directive to construct the canonical name for the server. This name + is used in all self-referential URLs, and for the values of + SERVER_NAME and SERVER_PORT in CGIs.

    + +

    With UseCanonicalName Off Apache will form + self-referential URLs using the hostname and port supplied by + the client if any are supplied (otherwise it will use the + canonical name, as defined above). These values are the same + that are used to implement name based virtual hosts, + and are available with the same clients. The CGI variables + SERVER_NAME and SERVER_PORT will be + constructed from the client supplied values as well.

    + +

    An example where this may be useful is on an intranet server + where you have users connecting to the machine using short + names such as www. You'll notice that if the users + type a shortname, and a URL which is a directory, such as + http://www/splat, without the trailing + slash then Apache will redirect them to + http://www.domain.com/splat/. If you have + authentication enabled, this will cause the user to have to + authenticate twice (once for www and once again + for www.domain.com -- see the + FAQ on this subject for more information). But if + UseCanonicalName is set Off, then + Apache will redirect to http://www/splat/.

    + +

    There is a third option, UseCanonicalName DNS, + which is intended for use with mass IP-based virtual hosting to + support ancient clients that do not provide a + Host: header. With this option Apache does a + reverse DNS lookup on the server IP address that the client + connected to in order to work out self-referential URLs.

    + +

    Warning

    +

    If CGIs make assumptions about the values of SERVER_NAME + they may be broken by this option. The client is essentially free + to give whatever value they want as a hostname. But if the CGI is + only using SERVER_NAME to construct self-referential URLs + then it should be just fine.

    +
    + +

    See also

    + +
    +
    top
    +

    <VirtualHost> Directive

    + + + + + + +
    Description:Contains directives that apply only to a specific +hostname or IP address
    Syntax:<VirtualHost + addr[:port] [addr[:port]] + ...> ... </VirtualHost>
    Context:server config
    Status:Core
    Module:core
    +

    <VirtualHost> and + </VirtualHost> are used to enclose a group of + directives that will apply only to a particular virtual host. Any + directive that is allowed in a virtual host context may be + used. When the server receives a request for a document on a + particular virtual host, it uses the configuration directives + enclosed in the <VirtualHost> + section. Addr can be:

    + +
      +
    • The IP address of the virtual host;
    • + +
    • A fully qualified domain name for the IP address of the + virtual host;
    • + +
    • The character *, which is used only in combination with + NameVirtualHost * to match all IP addresses; or
    • + +
    • The string _default_, which is used only + with IP virtual hosting to catch unmatched IP addresses.
    • +
    + +

    Example

    + <VirtualHost 10.1.2.3>
    + + ServerAdmin webmaster@host.foo.com
    + DocumentRoot /www/docs/host.foo.com
    + ServerName host.foo.com
    + ErrorLog logs/host.foo.com-error_log
    + TransferLog logs/host.foo.com-access_log
    +
    + </VirtualHost> +

    + + +

    IPv6 addresses must be specified in square brackets because + the optional port number could not be determined otherwise. An + IPv6 example is shown below:

    + +

    + <VirtualHost [2001:db8::a00:20ff:fea7:ccea]>
    + + ServerAdmin webmaster@host.example.com
    + DocumentRoot /www/docs/host.example.com
    + ServerName host.example.com
    + ErrorLog logs/host.example.com-error_log
    + TransferLog logs/host.example.com-access_log
    +
    + </VirtualHost> +

    + +

    Each Virtual Host must correspond to a different IP address, + different port number or a different host name for the server, + in the former case the server machine must be configured to + accept IP packets for multiple addresses. (If the machine does + not have multiple network interfaces, then this can be + accomplished with the ifconfig alias command -- if + your OS supports it).

    + +

    Note

    +

    The use of <VirtualHost> does + not affect what addresses Apache listens on. You + may need to ensure that Apache is listening on the correct addresses + using Listen.

    +
    + +

    When using IP-based virtual hosting, the special name + _default_ can be specified in + which case this virtual host will match any IP address that is + not explicitly listed in another virtual host. In the absence + of any _default_ virtual host the "main" server config, + consisting of all those definitions outside any VirtualHost + section, is used when no IP-match occurs. (But note that any IP + address that matches a NameVirtualHost directive will use neither + the "main" server config nor the _default_ virtual host. + See the name-based virtual hosting + documentation for further details.)

    + +

    You can specify a :port to change the port that is + matched. If unspecified then it defaults to the same port as the + most recent Listen + statement of the main server. You may also specify :* + to match all ports on that address. (This is recommended when used + with _default_.)

    + +

    Security

    +

    See the security tips + document for details on why your security could be compromised if the + directory where log files are stored is writable by anyone other + than the user that starts the server.

    +
    + +

    See also

    + +
    +
    +
    +

    Available Languages:  de  | + en  | + es  | + ja  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/core.html.es b/rubbos/app/httpd-2.0.64/docs/manual/mod/core.html.es new file mode 100644 index 00000000..517aafac --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/core.html.es @@ -0,0 +1,3421 @@ + + + +core - Servidor HTTP Apache + + + + + + +
    <-
    + +
    +

    Funcionalidad Básica de Apache

    +
    +

    Idiomas disponibles:  de  | + en  | + es  | + ja  | + 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.
    + +
    Descripción:Funcionalidades básicas del servidor HTTP Apache que +están siempre presentes
    Estado:Core
    +
    + + +
    top
    +

    AcceptPathInfo Directiva

    + + + + + + + + + +
    Descripción:Especifica si los recursos aceptan información de +path añadida (trailing pathname information)
    Sintaxis:AcceptPathInfo On|Off|Default
    Valor por defecto:AcceptPathInfo Default
    Contexto:server config, virtual host, directory, .htaccess
    Prevalece sobre:FileInfo
    Estado:Core
    Módulo:core
    Compatibilidad:Disponible en la versiones de Apache 2.0.30 y posteriores
    + +

    Esta directiva controla si las peticiones que contienen + información de path añadida (trailing pathname + information) a continuación de un nombre de fichero existente + (o no existente en un directorio que sí existe) serán + aceptadas o rechazadas. La información de path añadida + (trailing pathname information) puede pasarse a los scripts en la + variable de entorno PATH_INFO.

    + +

    Por ejemplo, suponga que la ubicación /test/ + se refiere a un directorio que contiene un único fichero: + here.html. Entonces, tanto las peticiones a + /test/here.html/more como las peticiones a + /test/nothere.html/more toman /more como + PATH_INFO.

    + +

    Los tres argumentos que puede tomar la directiva + AcceptPathInfo son:

    +
    +
    Off
    Una petición será aceptada + solamente si se refiere literalmente a una ruta que existe. Por + tanto, una petición con información de path añadida + (trailing pathname information) después de un nombre de + fichero que existe, del tipo /test/here.html/more + como en el ejemplo de arriba, devolverá el mensaje de error + 404 NOT FOUND.
    + +
    On
    Una petición será aceptada + si la componente anterior a la información de path + añadida (trailing pathname information) se refiere a un + fichero que existe. El ejemplo de arriba + /test/here.html/more será aceptado si + /test/here.html se refiere a un fichero + válido.
    + +
    Default
    El tratamiento de las peticiones + con información de path añadida (trailing pathname + information) está determinado por el handler responsable de la + petición. El handler básico para ficheros normales + rechaza por defecto las peticiones de PATH_INFO. Los + handlers que sirven scripts, como cgi-script e isapi-handler, generalmente aceptan + PATH_INFO por defecto.
    +
    + +

    El propósito principal de la directiva + AcceptPathInfo es permitirle hacer prevalecer su + propio criterio sobre el del handler acerca de si se debe aceptar + o rechazar PATH_INFO. Esto es necesario por ejemplo, + cuando use un filtro, como INCLUDES, para generar contenido + basado en PATH_INFO. El handler básico + rechazaría normalmente la petición. Puede usar la + siguiente configuración para activar dicho script:

    + +

    + <Files "mypaths.shtml">
    + + Options +Includes
    + SetOutputFilter INCLUDES
    + AcceptPathInfo On
    +
    + </Files> +

    + + +
    +
    top
    +

    AccessFileName Directiva

    + + + + + + + +
    Descripción:Nombre del fichero de configuración distribuida
    Sintaxis:AccessFileName filename [filename] ...
    Valor por defecto:AccessFileName .htaccess
    Contexto:server config, virtual host
    Estado:Core
    Módulo:core
    +

    Durante el procesamiento de una petición el servidor busca + el primer fichero de configuración de esta lista de nombres + en cada directorio de la ruta del documento, siempre y cuando los + ficheros de configuración distribuida estén activados para ese directorio. Por + ejemplo:

    + +

    + AccessFileName .acl +

    + +

    Antes de devolver el documento + /usr/local/web/index.html, el servidor leerá + /.acl, /usr/.acl, + /usr/local/.acl y /usr/local/web/.acl + buscando directivas, a menos que hayan sido desactivados con

    + +

    + <Directory />
    + + AllowOverride None
    +
    + </Directory> +

    + +

    Consulte también

    + +
    +
    top
    +

    AddDefaultCharset Directiva

    + + + + + + + + +
    Descripción:Parámetro del conjunto de caracteres que se +añade cuando el tipo de contenido de una respuesta es +text/plain o text/html
    Sintaxis:AddDefaultCharset On|Off|charset
    Valor por defecto:AddDefaultCharset Off
    Contexto:server config, virtual host, directory, .htaccess
    Prevalece sobre:FileInfo
    Estado:Core
    Módulo:core
    +

    Esta directiva especifica un valor por defecto para el + parámetro del conjunto de caracteres que se añade + añade si solo si el tipo de contenido de una respuesta es + text/plain o text/html. EL valor + pecificado en esta directiva no prevalecerá si cualquier otro + conjunto de caracteres es especificado en el cuerpo del documento + por medio de una etiqueta META, aunque a menudo, el + comportamiento exacto está determinado por la + configuración del cliente. Si se especifica + AddDefaultCharset Off, se desactiva esta + funcionalidad. AddDefaultCharset On activa el uso del + conjunto de caracteres por defecto interno de Apache, + iso-8859-1. Cualquier otro valor se asume que es el + charset a usar, que será uno los registrados + por la IANA como tipos MIME. Por ejemplo:

    + +

    + AddDefaultCharset utf-8 +

    + +

    AddDefaultCharset debe ser usada solo + cuando todos los recursos de texto a los que se aplican se saben + que usan un determiando conjunto de caracteres (character + encoding) y no es conveniente etiquetar los documentos + individualmente. Un ejemplo es su uso en recursos que contienen + contenido generado, como CGIs antiguos, que puede ser vulnerables + a ataques debidos a que se incluye en el resultado datos + suministrados por el usuario. Tenga en cuenta, sin embargo, que + una mejor solución es simplemente modificar (o borrar) esos + scripts, porque especificar un conjunto de caracteres por defecto + no protege a los usuarios que tengan activada en su navegador la + opción "auto-detect character encoding".

    + +

    Consulte también

    + +
    +
    top
    +

    AddOutputFilterByType Directiva

    + + + + + + + + +
    Descripción:Asigna un filtro de +salida a un tipo MIME en particular
    Sintaxis:AddOutputFilterByType filter[;filter...] +MIME-type [MIME-type] ...
    Contexto:server config, virtual host, directory, .htaccess
    Prevalece sobre:FileInfo
    Estado:Core
    Módulo:core
    Compatibilidad:Disponible en las +versiones de Apache 2.0.33 y posteriores
    +

    Esta directiva activa un filtro de + salida en particular para las peticiones en función del tipo + MIME de la respuesta.

    + +

    El siguiente ejemplo usa el filtro DEFLATE, del + módulo mod_deflate. Este filtro comprime la + parte de la respuesta de la petición (ya sea estática o + dinámica) que esté etiquetada como + text/html o text/plain antes de ser + enviada al cliente.

    + +

    + AddOutputFilterByType DEFLATE text/html text/plain +

    + +

    Si quiere que los contenidos sean procesados por más de un + filtro, debe separar sus nombres con puntos y comas + (;). Tambén es posible usar la directiva + AddOutputFilterByType para cada uno de los + filtros.

    + +

    La configuración que se muestra más abajo hace que + todos los scripts etiquetados como text/html sean + procesados primero por el filtro INCLUDES y + posteriormente por el filtro DEFLATE.

    + +

    + <Location /cgi-bin/>
    + + Options Includes
    + AddOutputFilterByType INCLUDES;DEFLATE text/html
    +
    + </Location> +

    + +

    Nota

    Activar filtros con la + directiva AddOutputFilterByType puede no + funcionar parcial o totalmente. Por ejemplo, no se aplica + ningún filtro si es posible determinar el tipo MIME y se + aplica en su lugar DefaultType, incluso si el DefaultType es el mismo.

    + +

    Si quiere estar seguro de que se apliquen los filtros, asigne + el tipo de contenido a un recurso explícitamente, por ejemplo + con la directiva AddType o con ForceType. Determinar el tipo de + contenido dentro de un script CGI (que no sea del tipo nph) + también es seguro.

    + +

    Los filtros de salida por tipo no se aplican nunca en + peticiones proxy.

    +
    + +

    Consulte también

    + +
    +
    top
    +

    AllowEncodedSlashes Directiva

    + + + + + + + + +
    Descripción:Determina si se acepta el uso de separadores de +ubicación codificados en las URLs
    Sintaxis:AllowEncodedSlashes On|Off
    Valor por defecto:AllowEncodedSlashes Off
    Contexto:server config, virtual host
    Estado:Core
    Módulo:core
    Compatibilidad:Disponible en las versines de Apache 2.0.46 y posteriores
    +

    La directiva AllowEncodedSlashes + perimite usar URLs que contienen separadores de ubicación + codificados (%2F para / y + %5C para \ en función del + sistema). Normalmente, tales URLs se rechazan y se devuelve un + mensaje de error 404 (Not found).

    + +

    Especificar el valor On en la directiva + AllowEncodedSlashes es útil sobre todo + cuando se usa junto con PATH_INFO.

    + +

    Nota

    Permitir barras codificadas + no implica su decodificado. La aparición + de %2F o %5C (según el sistemas + de que se trate) se dejará como tal en la cadena de + caracteres que conforma la de otra manera URL decodificada.

    +
    + +

    Consulte también

    + +
    +
    top
    +

    AllowOverride Directiva

    + + + + + + + +
    Descripción:Tipos de directivas que cuyo uso está permitido en los ficheros .htaccess
    Sintaxis:AllowOverride All|None|directive-type +[directive-type] ...
    Valor por defecto:AllowOverride All
    Contexto:directory
    Estado:Core
    Módulo:core
    +

    Cuando el servidor encuentra un fichero .htaccess + (como se explica en la directiva AccessFileName) es necesario saber que + directivas presentes en ese fichero pueden prevalecer sobre + las directivas de configuración previas.

    + +

    Solamente disponible en las secciones + <Directory>

    + + AllowOverride puede usarse solo en las + secciones <Directory> especificadas sin expresiones + regulares, nunca en las secciones <Location>, <DirectoryMatch> o <Files>. +
    + +

    Cuando el valor de esta directiva es None, + entonces los ficheros .htaccess son + ignorados completamente. En ese caso, el servidor ni siquiera + intentará leer los archivos .htaccess + existentes.

    + +

    Cuando el valor especificado en esta directiva es + All, entonces cualquier directiva que tenga Context .htaccess puede ser + usada en los ficheros .htaccess.

    + +

    El tipo de directiva puede ser uno de los siguientes + grupos de directivas.

    + +
    +
    AuthConfig
    + +
    + + Permite usar directivas de autentificación (AuthDBMGroupFile, AuthDBMUserFile, AuthGroupFile, AuthName, AuthType, AuthUserFile, Require, etc.).
    + +
    FileInfo
    + +
    + Permite usar directivas que controlan los tipos de documento + (DefaultType, ErrorDocument, ForceType, LanguagePriority, + SetHandler, SetInputFilter, SetOutputFilter, y + mod_mime las directivas Add* y Remove*, + etc.).
    + +
    Indexes
    + +
    + Permite el uso de directivas que controlan el indexado de + directorios (AddDescription, AddIcon, AddIconByEncoding, AddIconByType, DefaultIcon, DirectoryIndex, FancyIndexing, HeaderName, IndexIgnore, IndexOptions, ReadmeName, + etc.).
    + +
    Limit
    + +
    + Permite el uso de directivas que controlan el acceso al host + (Allow, Deny y Order).
    + +
    Options
    + +
    + Permite usar directivas que controlan funcionalidades + específicas de directorios (Options y XBitHack).
    +
    + +

    Ejemplo:

    + +

    + AllowOverride AuthConfig Indexes +

    + +

    En el ejemplo de arriba todas las directivas que no están + en el grupo AuthConfig ni en el grupo + Indexes provocan un error interno del servidor.

    + +

    Consulte también

    + +
    +
    top
    +

    AuthName Directiva

    + + + + + + + +
    Descripción:Ambito de autorización para su uso en +autentificación HTTP
    Sintaxis:AuthName auth-domain
    Contexto:directory, .htaccess
    Prevalece sobre:AuthConfig
    Estado:Core
    Módulo:core
    +

    Esta directiva especifica el nombre de dominio que se muestra + al solicitar autorización para acceder a un directorio. Este + nombre de dominio se muestra al cliente para que el usuario sepa + qué nombre de usuario y contraseña ha de introducir. + AuthName toma solamente un argumento; si + el nombre de dominio contiene algún espacio, debe escribirse + entre comillas. Para que funcione correctamente, esta directiva + debe usarse junto con las directivas AuthType y Require, y con directivas como + AuthUserFile y + AuthGroupFile.

    + +

    Por ejemplo:

    + +

    + AuthName "Top Secret" +

    + +

    La cadena de caracteres que se especifique como valor de + AuthName será lo que aparecerá en el cuadro + de diálogo de acceso de la mayoría de los + navegadores.

    + +

    Consulte también

    + +
    +
    top
    +

    AuthType Directiva

    + + + + + + + +
    Descripción:Tipo de autentificación de usuarios
    Sintaxis:AuthType Basic|Digest
    Contexto:directory, .htaccess
    Prevalece sobre:AuthConfig
    Estado:Core
    Módulo:core
    +

    Esta directiva selecciona el tipo de autentificación de + usuarios que usará para un directorio. Actualmente solamente + están implementadas las opciones Basic y + Digest. + + Para que funcione correctamente, esta directiva tiene que ir + acompañada por las directivas AuthName y Require, y de directivas como + AuthUserFile y + AuthGroupFile.

    + +

    Consulte también

    + +
    +
    top
    +

    CGIMapExtension Directiva

    + + + + + + + + +
    Descripción:Técnica para localizar +un intérprete de scripts CGI
    Sintaxis:CGIMapExtension cgi-path +.extension
    Contexto:directory, .htaccess
    Prevalece sobre:FileInfo
    Estado:Core
    Módulo:core
    Compatibilidad:Solamente NetWare
    +

    Esta directiva se usa para controlar la forma en que Apache + encuentra el intérprete para ejecutar scripts CGI. Por + ejemplo, si usa CGIMapExtension sys:\foo.nlm .foo, + todos los scripts CGI con extensión .foo se + pasarán al intérprete FOO.

    + +
    +
    top
    +

    ContentDigest Directiva

    + + + + + + + + +
    Descripción:Activa la generación de cabeceras de respuesta HTTP +Content-MD5
    Sintaxis:ContentDigest On|Off
    Valor por defecto:ContentDigest Off
    Contexto:server config, virtual host, directory, .htaccess
    Prevalece sobre:Options
    Estado:Core
    Módulo:core
    +

    Esta directiva permite la generación de cabeceras + Content-MD5 según se definen en RFC1864 y + RFC2068.

    + +

    MD5 es un algoritmo que genera una cadena de caracteres + ("message digest", a veces llamado "huella dactilar") a partir de + unos datos de longitud arbitraria. La forma en que funciona este + algoritmo hace que con casi toda seguridad, si se producen + alteraciones en los datos originales, el "message digest" generado + también será diferente.

    + +

    La cabecera Content-MD5 es una forma de comprobar + la integridad de un mensaje de principio a fin (MIC) para los + mensajes HTTP (entity-body). Un proxy o un cliente pueden + comprobar esta cabecera para detectar modificaciones accidentales + en el mensaje HTTP (entity-body) en tránsito. Cabecera de + ejemplo:

    + +

    + Content-MD5: AuLb7Dp1rqtRtxz2m9kRpA== +

    + +

    Tenga en cuenta que el uso de esta directiva puede provocar un + menor rendimiento de su servidor porque el "message digest" se + genera en cada petición (los valores no se guardan).

    + +

    La cebecera Content-MD5 se envía solamente + cuando un documento es servido por core. Si el + documento es servido con cuaquier otro módulo, no se + envía. Por ejemplo, los documentos SSI, las salidas de + scripts CGI, y las respuesta parciales (byte range responses) no + tienen esta cabecera.

    + +
    +
    top
    +

    DefaultType Directiva

    + + + + + + + + +
    Descripción:Tipo de contenido MIME por defecto que usará el servidor si no +puede determinar el tipo MIME en concreto del documento a servir
    Sintaxis:DefaultType MIME-type
    Valor por defecto:DefaultType text/plain
    Contexto:server config, virtual host, directory, .htaccess
    Prevalece sobre:FileInfo
    Estado:Core
    Módulo:core
    +

    Hay veces en las que se pide al servidor que devuelva un + documento cuyo tipo MIME no puede determinar.

    + +

    El servidor tiene que informar al cliente del tipo de contenido + del documento. En el caso de que se trate de un tipo desconocido, + se usa el tipo DefaultType. Por ejemplo:

    + +

    + DefaultType image/gif +

    + +

    sería apropiado para un directorio que contenga muchas + imagenes tipo GIF cuyos nombres de fichero no tengan la + extensión .gif.

    + +

    Tenga en cuenta que a diferencia de ForceType, esta directiva solamente + indica el tipo MIME por defecto. El resto de definiciones de tipos + MIME, incluidas las extensiones de fichero, que pueden identificar + el tipo MIME de que se trata prevalecen sobre esta opción por + defecto.

    + +
    +
    top
    +

    <Directory> Directiva

    + + + + + + +
    Descripción:Engloba a un grupo de directivas +que se aplicarán solamente al directorio del sistema de ficheros +especificado y a sus subdirectorios
    Sintaxis:<Directory directory-path> +... </Directory>
    Contexto:server config, virtual host
    Estado:Core
    Módulo:core
    +

    Las directivas <Directory> + y </Directory> se usan para englobar un grupo + de directivas que se aplicarán solamente al directorio + especificado y a sus subdirectorios. Puede incluir a cualquier + directiva cuyo uso esté permitido en un contexto + <directory>. Directory-path puede ser tanto la + ruta completa a un directorio, como una cadena de caracteres + comodín que use las reglas de equivalencia de los shells de + Unix. En una cadena de caracteres comodín, el carácter + ? equivale a cualquier carácter individual, y + * equivale a cualquier secuencia de + caracteres. También puede usar [] para expresar + rangos de caracteres. Ninguno de los caracteres comodín + equivale al carácter `/', de modo que <Directory + /*/public_html> no equivale a + /home/user/public_html, pero sí a + <Directory /home/*/public_html>. Ejemplo:

    + +

    + <Directory /usr/local/httpd/htdocs>
    + + Options Indexes FollowSymLinks
    +
    + </Directory> +

    + +
    +

    Tenga especial cuidado con los argumentos de + directory-path: tienen que equivaler literalmente a + la ruta del sistema de ficheros que Apache usa para acceder a + los ficheros. Las directivas aplicadas a un + <Directory> en particular no se + aplicarán a los ficheros de ese mismo directorio pero que + sean accedidos mediante una ruta diferente, como por ejemplo + mediante enlaces simbólicos diferentes.

    +
    + +

    También pueden usar expresiones regulares extendidas, + añadiendo el carácter ~. Por ejemplo:

    + +

    + <Directory ~ "^/www/.*/[0-9]{3}"> +

    + +

    equivaldría a los directorios en /www/ cuyo + nombres consistan en tres números.

    + +

    Si varias (expresiones no regulares) secciones <Directory> equivalen al directorio (o a + uno de los directorios de los que es subdirectorio) que contiene + un documento, entonces las directivas se aplican según el + criterio de la ruta equivalente más corta, junto con las + directivas de los archivos .htaccess. Por ejemplo, con

    + +

    + <Directory />
    + + AllowOverride None
    +
    + </Directory>
    +
    + <Directory /home/>
    + + AllowOverride FileInfo
    +
    + </Directory> +

    + +

    para acceder al documento /home/web/dir/doc.html + los pasos son:

    + +
      +
    • Se aplica la directiva AllowOverride None + (desactivando los ficheros .htaccess).
    • + +
    • Se aplica la directiva AllowOverride FileInfo + (para el directorio /home).
    • + +
    • Se aplica cualquier directiva FileInfo en + /home/.htaccess, /home/web/.htaccess y + /home/web/dir/.htaccess por ese orden.
    • +
    + +

    Las expresiones regulares no se tienen en cuenta hasta que + todas las secciones normales hayan sido aplicadas. En ese momento + todas se evalúan las expresiones regulares en el orden en que + aparecen en el fichero de configuración. Por ejemplo, con

    + +

    + <Directory ~ abc$>
    + + # ... directivas aquí ...
    +
    + </Directory> +

    + +

    la sección de expresiones regulares no será + considerada hasta después de que todas las directivas + <Directory> y los ficheros + .htaccess hayan sido aplicados. Solamente entonces + las expresiones regulares que tengan una equivalencia con + /home/abc/public_html/abc y la correspondiente + directiva <Directory> + serán aplicadas.

    + +

    Tenga en cuenta que por defecto el acceso de Apache a + <Directory /> es Allow from All. + Esto significa que Apache servirá cualquier fichero que se + corresponda con una URL. Se recomienda que modifique este + comportamiento con un bloque del siguiente tipo

    + +

    + <Directory />
    + + Order Deny,Allow
    + Deny from All
    +
    + </Directory> +

    + +

    y haga prevalecer una configuración diferente para + los solamente para los directorios que usted quiera que + sean accesibles. Consulte la sección Consejos de seguridad para + obtener más información.

    + +

    Las secciones "directory" se usan en el archivo + httpd.conf. Las directivas <Directory> no pueden anidarse, y no + pueden aparecer en una sección de tipo <Limit> o <LimitExcept>.

    + +

    Consulte también

    + +
    +
    top
    +

    <DirectoryMatch> Directiva

    + + + + + + +
    Descripción:Incluye las directivas que se +aplican a los directorios y subdirectorios del sistema de ficheros que +equivalen a una expresión regular
    Sintaxis:<DirectoryMatch regex> +... </DirectoryMatch>
    Contexto:server config, virtual host
    Estado:Core
    Módulo:core
    +

    <DirectoryMatch> y + </DirectoryMatch> se usan para englobar a un + grupo de directivas que se aplicarán solamente al directorio + (y los subdirectorios de éste) especificado, al igual que + <Directory>. Sin + embargo, en ese caso la directiva toma como argumento una + expresión regular. Por ejemplo:

    + +

    + <DirectoryMatch "^/www/.(.+)?[0-9]{3}"> +

    + +

    equivaldrá a los directorios en /www/ cuyo nombre + consista en tres números.

    + +

    Consulte también

    + +
    +
    top
    +

    DocumentRoot Directiva

    + + + + + + + +
    Descripción:Directorio principal que contiene la estructura de +directorios visible desde la web
    Sintaxis:DocumentRoot directory-path
    Valor por defecto:DocumentRoot /usr/local/apache/htdocs
    Contexto:server config, virtual host
    Estado:Core
    Módulo:core
    +

    Esta directiva especifica el directorio desde el cuál + httpd servirá los ficheros. A menos que + especifique alguna otra equivalencia mediante una directiva + Alias, el servidor + añade la ruta de la URL solicitada a este directorio para + construir la ruta del documento a servir. Ejemplo:

    + +

    + DocumentRoot /usr/web +

    + +

    esto quiere decir que una petición de acceso a + http://www.my.host.com/index.html se refiere a + /usr/web/index.html en el sistema de ficheros.

    + +

    El directorio que especifique en + DocumentRoot debe escribirlo sin barra al + final.

    + +

    Consulte también

    + +
    +
    top
    +

    EnableMMAP Directiva

    + + + + + + + + +
    Descripción:Permite el uso de mapeo de memoria para leer archivos mientras se +sirven
    Sintaxis:EnableMMAP On|Off
    Valor por defecto:EnableMMAP On
    Contexto:server config, virtual host, directory, .htaccess
    Prevalece sobre:FileInfo
    Estado:Core
    Módulo:core
    +

    Esta directiva controla si httpd puede usar + mapeo de memoria en caso de ser necesario para leer los contenidos + de un archivo al servirlo. Por defecto, cuando el tratamiento de + una petición requiere acceder a los datos dentro de un + fichero -- por ejemplo, cuando se sirve un fichero analizado + sintácticamente por el servidor con el módulo + mod_include -- Apache mapea en memoria el archivo + si el sistema operativo soporta esa operación.

    + +

    El mapeo de memoria supone a veces una mejora en el + rendimiento. Sin embargo, en ciertos entornos, es mejor desactivar + el mapeo de memoria para evitar problemas operacionales:

    + +
      +
    • En algunos sistemas con más de un procesador, el mapeo de + memoria puede reducir el rendimiento de + httpd.
    • Con un DocumentRoot montado en NFS, + httpd podría abortar su ejecución + debido a un fallo de segmentación si el fichero se borra o se + trunca mientras que httpd lo tiene mapeado en + memoria.
    • +
    + +

    Para configuraciones del servidor que son sensibles a estos + problemas, debe desactivar el uso del mapeo en memoria + especificando:

    + +

    + EnableMMAP Off +

    + +

    Para ficheros montados en NFS, puede desactivar esta + funcionalidad explícitamente para los archivos implicados + especificando:

    + +

    + <Directory "/path-to-nfs-files"> + + EnableMMAP Off + + </Directory> +

    + +
    +
    top
    +

    EnableSendfile Directiva

    + + + + + + + + + +
    Descripción:Permite el uso del soporte de sendfile del kernel para servir ficheros @@@@@ Use the kernel sendfile support to deliver files to the client @@@@@
    Sintaxis:EnableSendfile On|Off
    Valor por defecto:EnableSendfile On
    Contexto:server config, virtual host, directory, .htaccess
    Prevalece sobre:FileInfo
    Estado:Core
    Módulo:core
    Compatibilidad:Disponible en las versiones de Apache 2.0.44 y +posteriores
    +

    Esta directiva controla si httpd puede usar + el soporte de sendfile del kernel para transmitir contenidos de + ficheros al cliente. Por defecto, cuando se está procesando + una petición que no requiere acceso a los datos de un fichero + -- por ejemplo, cuando se sirve un fichero estático -- Apache + usa sendfile para servir los contenidos del fichero directamente a + la red, sin leer el fichero si el sistema operativo lo + permite.

    + +

    El mecanismo sendfile evita operaciones separadas de lectura y + envío, y reservas de buffer. Sin embargo, en algunas + plataformas o en algunos sistemas de ficheros, es mejor desactivar + esa funcionalidad para evitar problemas operacionales:

    + +
      +
    • En algunas plataformas puede que el soporte de sendfile no + funcione porque al compilar Apache no se detectó + correctamente, especialmente si los binarios fueron construidos en + una máquina y después se han trasladado a otra cuando el + soporte para sendfile ya no funcionaba.
    • + +
    • En Linux, el uso de send file provoca fallos de + comprobación de TCP_checksum en ciertas tarjetas de red que + usan IPv6
    • + +
    • Si DocumentRoot está + montado en red (por ejemplo, NFS o SMB), el kernel puede que no + sea capaz de servir el fichero de red a través de su + cache.
    • +
    + +

    Para configuraciones del servidor que son sensibles a estos + problemas, debe desactivar esta funcionalidad especificando:

    + +

    + EnableSendfile Off +

    + +

    Para archivos montados en NFS o SMB, esta funcionalidad puede + ser desactivada explícitamente para los ficheros que puedan + ocasionar problemas mediante:

    + +

    + <Directory "/path-to-nfs-files"> + + EnableSendfile Off + + </Directory> +

    + +
    +
    top
    +

    ErrorDocument Directiva

    + + + + + + + + +
    Descripción:Es lo que el servidor devuelve al cliente si se produce +algún error
    Sintaxis:ErrorDocument error-code +document
    Contexto:server config, virtual host, directory, .htaccess
    Prevalece sobre:FileInfo
    Estado:Core
    Módulo:core
    Compatibilidad:El uso de las comillas +(") en los mensajes de texto es diferente en Apache +2.0
    +

    En el caso de que aparezca un problema o error, puede + configurar Apache para hacer una de las siguientes cuatro + cosas,

    + +
      +
    1. devolver un mensaje de error estándar
    2. + +
    3. devolver un mensaje de error personalizado
    4. + +
    5. redireccionar la petición a una ruta-URL + local
    6. + +
    7. redireccionar la petición a una URL externa
    8. +
    + +

    La primera opción es la que se usa por defecto, mientras + que el resto se pueden configurar usando la directiva + ErrorDocument, la cual ha de seguirse del + código de respuesta HTTP y una URL o un mensaje. Apache + ofrece a veces otra información adicional sobre el problema o + error.

    + +

    Las URLs pueden empezar por una barra (/) para URLs locales, o + pueden ser una URL completa que el cliente pueda + resolver. También se puede hacer que el nevagador despliegue + un mensaje. Ejemplos:

    + +

    + ErrorDocument 500 http://foo.example.com/cgi-bin/tester
    + ErrorDocument 404 /cgi-bin/bad_urls.pl
    + ErrorDocument 401 /subscription_info.html
    + ErrorDocument 403 "Lo sentimos no podemos permitirle el acceso a esta página hoy" +

    + +

    Adicionalmente, el valor especial default puede + ser usado para que Apache use los mensajes literales que trae por + defecto. Aunque bajo circunstancias normales no es necesario, + default restaura los mensajes literales de Apache en + configuraciones que de otra manera heredan una directiva + ErrorDocument ya existente.

    + +

    + ErrorDocument 404 /cgi-bin/bad_urls.pl

    + <Directory /web/docs>
    + + ErrorDocument 404 default
    +
    + </Directory> +

    + +

    Tenga en cuenta que si usted especifica en + ErrorDocument un contenido que apunta a una + URL remota (por ejemplo, cualquier cosa que empiece por + http), Apache redireccionará al cliente, incluso + si al final, el documento al que redirecciona está en el + mismo servidor. Esto tiene varias implicaciones, la más + importante es que el cliente no recibirá el código de + error original, sino que en su lugar recibirá el código + de estado del redireccionamiento. Esto puede confundir a los + robots web y otros clientes que tratan de determinar si una URL es + válida usando el código de estado. Además, si usa + una URL remota en un ErrorDocument 401, el cliente no + sabrá pedir contraseñas al usuario porque no + recibirá el código de estado 401. Por tanto, si + usa una directiva ErrorDocument 401 entonces + debe referirse a un documento local.

    + +

    Microsoft Internet Explorer (MSIE) ignorará por defecto + los mensajes de error generados por el servidor cuando sean + "demasiado pequeños" y los sustituirá por mensajes de + error propios. El tamaño se considera pequeño según + el tipo de error de que se trate, pero en general, si su mensaje + de error es de más de 512 bytes, MSIE mostrará en + mensaje del error generado por el servidor y no el suyo. Puede + encontrar más información sobre este asunto en el + artículo de la Base de Datos de Conocimiento de Microsoft Q294807.

    + +

    En las versiones de Apache anteriores a la 2.0, los mensajes se + indicaban añadiendoles dobles comillas (") al principio que + no se cerraban al final del mensaje.

    + +

    Consulte también

    + +
    +
    top
    +

    ErrorLog Directiva

    + + + + + + + +
    Descripción:Ubicación del fichero en +el que se almacenan los mensajes de error
    Sintaxis: ErrorLog file-path|syslog[:facility]
    Valor por defecto:ErrorLog logs/error_log (Unix) ErrorLog logs/error.log (Windows y OS/2)
    Contexto:server config, virtual host
    Estado:Core
    Módulo:core
    +

    La directiva ErrorLog determina el + nombre del fichero en el cual el servidor almacenará los + mensajes de error en caso de que ocurra alguno. Si el + file-path no es absoluto, entonces se asume que es + relativo al valor especificado en la directiva ServerRoot.

    + +

    Ejemplo

    + ErrorLog /var/log/httpd/error_log +

    + +

    Si el file-path empieza con un barra vertical (|) + entonces se asume que es un comando para procesar el registro de + errores (error_log).

    + +

    Ejemplo

    + ErrorLog "|/usr/local/bin/httpd_errors" +

    + +

    Usar syslog en lugar de un nombre de fichero + permite almanecer los mesajes mediante syslogd(8) si el sistema lo + soporta. Por defecto se usa la utilidad de syslog + local7, pero puede cambiar esto usando + syslog:facility donde facility + es cualquiera de los nombres normalmente documentados en + syslog(1).

    + +

    Ejemplo

    + ErrorLog syslog:user +

    + +

    SEGURIDAD: Consulte la sección consejos sobre + seguridad para obtener más información sobre cómo se + compromete la seguridad de su sistema si sobre el directorio en + que se almacenan los ficheros log tiene permisos cualquier usuario + que no sea únicamente el que arranca el servidor.

    + +

    Nota

    Cuando se especifica una ruta a un fichero + en una plataforma que no es Unix, hay que tener cuidado de usar + solo barras (/) aunque el sistema permita barras invertidas + (\). En general, lo mejor es usar siempre barras / en los ficheros + de configuración.

    +
    + +

    Consulte también

    + +
    +
    top
    +

    FileETag Directiva

    + + + + + + + + +
    Descripción:Atributos de fichero usados para crear la ETAG de la +cabecera de respuesta HTTP
    Sintaxis:FileETag component ...
    Valor por defecto:FileETag INode MTime Size
    Contexto:server config, virtual host, directory, .htaccess
    Prevalece sobre:FileInfo
    Estado:Core
    Módulo:core
    +

    + La directiva FileETag configura los + atributos de fichero que se usan para crear la ETag + (etiqueta de entidad) del campo cabecera de respuesta cuando el + documento está basado en un fichero. (El valor de + ETag se usa en la gestión de cache para ahorrar + ancho de banda.) En Apache 1.3.22 y en versiones anteriores, el + valor de ETag se formaba siempre a partir + del inodo del fichero, su tamaño y la hora y la fecha en que + se modificó por última vez (mtime). La directiva + FileETag permite elegir cuál de esos + elementos quiere usar -- si es que se quiere usar alguno. Las + palabras clave reconocidas son: +

    + +
    +
    INode
    +
    Para incluir el número de inodo en el cálculo
    +
    MTime
    +
    Para incluir en el cálculo la hora y la fecha en que el + fichero fue modificado por última vez
    +
    Size
    +
    Para incluir en el cálculo el número de bytes que ocupa el fichero
    +
    All
    +
    Para incluir en el cálculo todos los campos disponibles. Esto es + equivalente a: +

    FileETag INode MTime Size

    +
    None
    +
    Si el documento está basado en un fichero, ningún campo + ETag será incluido en la respuesta
    +
    + +

    Las palabras clave INode, MTime, y + Size pueden ir precedidas por + o + -, lo cual permite hacer cambios en la configuración + heredada de un ámbito más amplio. Cualquier palabra clave que + aparezca sin un prefijo cancela inmediatamente la configuración + heredada.

    + +

    Si la configuración para un directorio incluye + FileETag INode MTime Size, y la de un subdirectorio + incluye FileETag -INode, la configuración para + ese subdirectorio (que será heredada por cualquier + subdirectorio que no tenga un configuración propia) será + equivalente a FileETag MTime Size.

    + +
    +
    top
    +

    <Files> Directiva

    + + + + + + + +
    Descripción:Contiene directivas que se aplican a los ficheros cuyos +nombres coincidan con los que se especifiquen
    Sintaxis:<Files filename> ... </Files>
    Contexto:server config, virtual host, directory, .htaccess
    Prevalece sobre:All
    Estado:Core
    Módulo:core
    +

    La directiva <Files> limita el ámbito de aplicación de las directivas que incluye según el nombre de los ficheros. Es + comparable a <Directory> y <Location>. Debe cerrarse con </Files>. Las directivas usadas en + esta sección se aplicarán a cualquier objeto con un nombre base + (último componente del nombre de fichero) que coincida con el nombre de fichero especificado. Las + secciones <Files> se + procesan en el orden en que aparecen en el fichero de + configuración, después de las secciones <Directory> y de leer los + ficheros .htaccess, pero antes de las secciones + <Location>. Tenga en cuenta que las directivas <Files> + pueden anidarse dentro de las secciones <Directory> para restringir la parte del + sistema de ficheros a la que se aplican.

    + +

    El argumento filename puede incluir un nombre de + fichero, o una cadena de carácteres comodín, donde ? + equivale a cualquier carácter individual, y * + equivale a cualquier secuencia de caracteres. También pueden + usarse expresiones regulares extendidas, con la ventaja de que + tambien se puede usar el carácter ~. Por + ejemplo:

    + +

    + <Files ~ "\.(gif|jpe?g|png)$"> +

    + +

    equivaldría a la mayoría de los formatos gráficos de + Internet. No obstante, es mejor usar <FilesMatch>.

    + +

    Tenga en cuenta que a diferencia de las secciones <Directory> y <Location>, las secciones + <Files> pueden usarse dentro + de los ficheros .htaccess. Esto permite a los + usuarios controlar el acceso a sus propios archivos, a un nivel de + fichero a fichero.

    + + +

    Consulte también

    + +
    +
    top
    +

    <FilesMatch> Directiva

    + + + + + + + +
    Descripción:Contiene las directivas que se aplican a los ficheros +cuyos nombres equivalen a las expresiones regulares que se especifiquen
    Sintaxis:<FilesMatch regex> ... </FilesMatch>
    Contexto:server config, virtual host, directory, .htaccess
    Prevalece sobre:Todas
    Estado:Core
    Módulo:core
    +

    La directiva <FilesMatch> + limita el rango de las directivas incluidas según el nombre de los + ficheros, como hace la directiva <Files>. Sin embargo, acepta + expresiones regulares. Por ejemplo:

    + +

    + <FilesMatch "\.(gif|jpe?g|png)$"> +

    + +

    equivaldría a la mayoría de los formatos gráficos de Internet.

    + +

    Consulte también

    + +
    +
    top
    +

    ForceType Directiva

    + + + + + + + + +
    Descripción:Hace que todos los ficheros cuyos nombres tengan una equivalencia con con lo que se especifique sean +servidos como contenido del tipo MIME que se establezca
    Sintaxis:ForceType MIME-type|None
    Contexto:directory, .htaccess
    Prevalece sobre:FileInfo
    Estado:Core
    Módulo:core
    Compatibilidad:Perteneciente al núcleo del servidor a partir de la +versión de Apache 2.0
    +

    Cuando se usa en un fichero .htaccess o en una + sección <Directory>, <Location> o <Files>, esta directiva hace que todos los + ficheros cuyos nombres guarden una equivalencia con lo + especificado sean servidos como contenido + MIME-type. Por ejemplo, si tiene un directorio lleno de + ficheros GIF, pero no quiere etiquetarlos con .gif, + puede usar:

    + +

    + ForceType image/gif +

    + +

    Tenga en cuenta que a diferencia de DefaultType, esta directiva prevalece sobre + todas las asociaciones de tipo MIME, incluidas las extensiones de + nombre de fichero que puedan identificar de qué tipo es un fichero.

    + +

    Puede hacer que ForceType no prevalezca sobre el resto de directivas usando el valor None:

    + +

    + # forzar a todos los tipos de fichero a ser tratados como imagen/gif:
    + <Location /images>
    + + ForceType image/gif
    +
    + </Location>
    +
    + # pero permitir la asociación de tipos MIME normal aquí:
    + <Location /images/mixed>
    + + ForceType None
    +
    + </Location> +

    + +
    +
    top
    +

    HostnameLookups Directiva

    + + + + + + + +
    Descripción:Activa la resolución de +DNS de las direcciones IP de los clientes
    Sintaxis:HostnameLookups On|Off|Double
    Valor por defecto:HostnameLookups Off
    Contexto:server config, virtual host, directory
    Estado:Core
    Módulo:core
    +

    Esta directiva activa la resolución de DNS de manera que + los nombres de host puedan ser guardados en los archivos log (y + pasados a CGIs/SSIs en REMOTE_HOST). El valor + Double se refiere a hacer una busqueda de DNSs + inversa doble. Esto es, después de hacer una busqueda + inversa, se hace una busqueda normal posteriormente sobre ese + resultado. Al menos una de las direcciones IP en la búsqueda + posterior debe equivaler a la dirección IP original. (En + terminología de "tcpwrappers" se llama + PARANOID.)

    + +

    Independientemente de lo que se especifique, cuando + mod_access se usa para controlar el acceso por + nombre de host, se hará una consulta inversa doble. Esto se + hace por seguridad. Tenga en cuenta que el resultado de una + busqueda inversa doble no está disponible generalmente a no + ser que especifique HostnameLookups Double. Por + ejemplo, si especifica solo HostnameLookups On y se + hace una petición a un objeto protegido por restricciones de + nombre de host, independientemente de si la consulta inversa doble + falla o no, el resultado de la consulta inversa simple se + pasará a los CGIs en REMOTE_HOST.

    + +

    El valor por defecto es Off para ahorrar + tráfico de red en aquellos sitios web que realmente no + necesitan hacer búsquedas inversas dobles. También es + mejor para los usuarios finales porque no tienen que sufrir el + retardo adicional que introducen las búsquedas. Los sitios + web con mucha carga deben usar en esta directiva el valor + Off, porque las búsquedas de DNSs pueden + consumir una cantidad de tiempo considerable. La utilidad + logresolve, compilada por defecto en el + subdirectorio bin de su directorio de + instalación, puede usarse más tarde para buscar nombres + de host en direcciones IP que estén en los logs cuando no + esté en línea.

    + +
    +
    top
    +

    IdentityCheck Directiva

    + + + + + + + +
    Descripción:Activa que se registre en los archivos log la entidad RFC1413 del usuario remoto
    Sintaxis:IdentityCheck On|Off
    Valor por defecto:IdentityCheck Off
    Contexto:server config, virtual host, directory
    Estado:Core
    Módulo:core
    +

    Esta directiva permite el almacenamiento en logs, según se + especifica en el RFC1413, del nombre de usuario remoto para casda + conexión cuando la máquina del cliente corra + "identd" o un programa similar. Esta información se + registra en el log de acceso.

    + +

    La información que se registra con este procedimiento no + debe ser considerada como fiable excepto para controles + rudimentarios.

    + +

    Tenga en cuenta que esto puede provocar serios problemas de + retardo en los accesos a su servidor porque para cada + petición hay que ejecutar una consulta de este tipo. Cuando + hay firewalls involucrados, cada búsqueda puede probablemente + fallar y añadir 30 segundos de retardo cada vez que se + intenta un acceso. De modo que en general, su uso no es muy + útil en servidores públicos accesibles desde + Internet.

    + +
    +
    top
    +

    <IfDefine> Directiva

    + + + + + + + +
    Descripción:Engloba directivas que serán procesadas solo si se +cumple una determinada condición al iniciar el servidor
    Sintaxis:<IfDefine [!]parameter-name> ... + </IfDefine>
    Contexto:server config, virtual host, directory, .htaccess
    Prevalece sobre:All
    Estado:Core
    Módulo:core
    +

    La sección <IfDefine + test>...</IfDefine> se usa para marcar + directivas que son condicionales. Las directivas que hay dentro de + una sección <IfDefine> se + procesan solo si test devuelve un resultado + positivo. Si el test produce un resultado negativo, + todo lo que haya entre los marcadores de comienzo y final + será ignorado.

    + +

    El test en la sección de directivas <IfDefine> puede tomar una de las + siguientes dos formas:

    + +
      +
    • parameter-name
    • + +
    • !parameter-name
    • +
    + +

    En el primer caso, las directivas entre los marcadores de + comienzo y final se procesan solo si el parámetro llamado + parameter-name está definido. El segundo formato + hace lo contrario, y procesa las directivas solo si + parameter-name no está + definido.

    + +

    El argumento parameter-name se define cuando se + ejecuta httpd por la línea de comandos con la opción + -Dparameter, al iniciar el servidor.

    + +

    Las secciones <IfDefine> + son anidables, lo cual puede usarse para implementar tests + simples con varios parámetros. Ejemplo:

    + +

    + httpd -DReverseProxy ...
    +
    + # httpd.conf
    + <IfDefine ReverseProxy>
    + + LoadModule rewrite_module modules/mod_rewrite.so
    + LoadModule proxy_module modules/libproxy.so
    +
    + </IfDefine> +

    + +
    +
    top
    +

    <IfModule> Directiva

    + + + + + + + +
    Descripción:Engloba directivas que se procesan de forma condicional +según esté presente o ausente un módulo específico
    Sintaxis:<IfModule [!]module-name> ... + </IfModule>
    Contexto:server config, virtual host, directory, .htaccess
    Prevalece sobre:Todas
    Estado:Core
    Módulo:core
    +

    La sección <IfModule + test>...</IfModule> se usa para marcar + las directivas que se aplican si está presente un módulo + específico. Las directivas dentro de una sección <IfModule> solo se procesan si el + test produce un resultado positivo. Si el test da falso, todo + lo que haya entre los marcadores de inicio y final es + ignorado.

    + +

    El test de las secciones <IfModule> puede tomar una de las siguientes + formas:

    + +
      +
    • module name
    • + +
    • !module name
    • +
    + +

    En el primer caso, las directivas entre los marcadores de + comienzo y final son procesados solo si el módulo llamado + module name está incluido en Apache -- ya sea + porque está compilado en el servidor o porque esté + cargado dinámicamente usando LoadModule. El segundo formato hace lo contrario, y + solo se procesan las directivas si el módulo module + name no está incluido.

    + +

    El argumento module name es el nombre del fichero del + módulo en el momento en que fue compilado. Por ejemplo, + mod_rewrite.c. Si un módulo consiste en varios + archivos fuente, use el nombre del fichero que contenga la cadena + de caracteres STANDARD20_MODULE_STUFF.

    + +

    Las secciones <IfModule> + son anidables, lo cual puede usarse para implementar tests simples + con varios módulos.

    + +
    Esta sección debe usarse solo si necesita tener un + fichero de configuración que funcione tanto si está como + si no está un determinado módulo disponible. En + condiciones normales, no es necesario usar directivas en + secciones <IfModule>.
    + +
    +
    top
    +

    Include Directiva

    + + + + + + + +
    Descripción:Incluye otros ficheros de configuración dentro de +los ficheros de configuración del servidor
    Sintaxis:Include file-path|directory-path
    Contexto:server config, virtual host, directory
    Estado:Core
    Módulo:core
    Compatibilidad:Se pueden usar caracteres comodín para encontrar +equivalencias en las versiones de Apache 2.0.41 y posteriores
    +

    Esta directiva permite la inclusión de otros ficheros de + configuración dentro de los ficheros de configuración del + servidor.

    + +

    Los caracteres comodín de tipo shell (fnmatch()) + pueden usarse para incluir varios ficheros de una vez por orden + alfabético. Además, si Include apunta a un + directorio, en lugar de a un fichero, Apache leerá todos los + ficheros en ese directorio y sus subdirectorios. Sin embargo, no se + recomienda incluir subdirectorios enteros, porque es fácil dejar + accidentalmente ficheros temporales en un directorio y esto + provocará que httpd aborte.

    + +

    La ruta del fichero especificada puede ser absoluta, o relativa + a un directorio respecto al valor especificado en ServerRoot.

    + +

    Ejemplos:

    + +

    + Include /usr/local/apache2/conf/ssl.conf
    + Include /usr/local/apache2/conf/vhosts/*.conf +

    + +

    O especificando rutas relativas al directorio ServerRoot:

    + +

    + Include conf/ssl.conf
    + Include conf/vhosts/*.conf +

    + +

    Si ejecuta apachectl configtest le aparecerá + una lista con los ficheros que están siendo procesados + durante la comprobación de la configuración:

    + +

    + root@host# apachectl configtest
    + Processing config file: /usr/local/apache2/conf/ssl.conf
    + Processing config file: /usr/local/apache2/conf/vhosts/vhost1.conf
    + Processing config file: /usr/local/apache2/conf/vhosts/vhost2.conf
    + Syntax OK +

    + +

    Consulte también

    + +
    +
    top
    +

    KeepAlive Directiva

    + + + + + + + +
    Descripción:Permite que se establezcan conexiones HTTP +persistentes
    Sintaxis:KeepAlive On|Off
    Valor por defecto:KeepAlive On
    Contexto:server config, virtual host
    Estado:Core
    Módulo:core
    +

    La extensión Keep-Alive de HTTP/1.0 y la funcionalidad de + conexión persistente de HTTP/1.1 facilitan la posibilidad de + que se establezcan sesiones HTTP de larga duración que + permiten que se puedan enviar múltiples peticiones sobre la + misma conexión TCP. En algunos casos, esto tiene como + resultado una reducción de casi el 50% en los tiempos de + retardo en el caso de documentos con muchas imágenes. Para + activar las conexiones Keep-Alive, especifique KeepAlive + On.

    + +

    Para clientes HTTP/1.0, las conexiones Keep-Alive se + usarán solo si el cliente lo solicita + específicamente. Además, una conexión Keep-Alive + con un cliente HTTP/1.0 puede usarse solo cuando el tamaño + del contenido es conocido con antelación. Esto implica que el + contenido dinámico, como puede ser el resultado de un CGI, + páginas SSI y listados de directorios generados por el + servidor, no usarán por lo general conexiones Keep-Alive para + clientes HTTP/1.0. Para clientes HTTP/1.1, las conexiones + persistentes son las que se usan por defecto a no ser que se + especifique lo contrario. Si el cliente lo solicita, se usará + @@@@@ chunked encoding @@@@@ para enviar contenido de tamaño + desconocido sobre conexiones persistentes.

    + +

    Consulte también

    + +
    +
    top
    +

    KeepAliveTimeout Directiva

    + + + + + + + +
    Descripción:Tiempo que el servidor esperará peticiones subsiguientes +en conexiones persistentes
    Sintaxis:KeepAliveTimeout seconds
    Valor por defecto:KeepAliveTimeout 15
    Contexto:server config, virtual host
    Estado:Core
    Módulo:core
    +

    Es el tiempo en segundos que Apache esperará peticiones + subsiguientes antes de cerrar una conexión persistente. Una + vez que una petición ha sido recibida, se aplica el valor + especificado en la directiva Timeout para cerrar la + conexión.

    + +

    Espeficificar un valor alto para + KeepAliveTimeout puede provocar un menor + rendimiento en servidores con mucha carga. Cuanto mayor sea el + valor de timeout, mayor será el número de procesos del + servidor se mantendrán ocupados esperando en conexiones con + clientes no activos.

    + +
    +
    top
    +

    <Limit> Directiva

    + + + + + + + +
    Descripción:Restringe la aplicación de los controles de acceso incluidos a solo ciertos métodos HTTP
    Sintaxis:<Limit method [method] ... > ... + </Limit>
    Contexto:server config, virtual host, directory, .htaccess
    Prevalece sobre:Todas
    Estado:Core
    Módulo:core
    +

    Los controles de acceso se aplican normalmente a + todos los métodos de acceso, y este es el + comportamiento que se busca casi siempre. En general, las + directivas de control de acceso no deben estar dentro de una + sección <Limit>.

    + +

    El propósito <Limit> + es restringir el efecto de los controles de acceso a los + métodos HTTP que se especifiquen. Para los demás + métodos, las restricciones de acceso que estén incluidas + en <Limit> no + tendrán efecto. Los siguientes ejemplos aplican el + control de acceso solo a los métodos POST, + PUT, y DELETE, no afectando al resto de + métodos:

    + +

    + <Limit POST PUT DELETE>
    + + Require valid-user
    +
    + </Limit> +

    + +

    Los métodos incluidos en la lista pueden ser uno o + más de los siguientes: GET, + POST, PUT, DELETE, + CONNECT, OPTIONS, PATCH, + PROPFIND, PROPPATCH, MKCOL, + COPY, MOVE, LOCK, y + UNLOCK. Los nombres de los métodos + distinguen mayúsculas de minúsculas. Si usa + GET también se restringirán las peticiones + HEAD. El método TRACE no puede + limitarse.

    + +
    Es mejor usar una sección <LimitExcept> en lugar de + una sección <Limit> cuando se quiere restringir el + acceso, porque una sección <LimitExcept> protege contra métodos + arbitrarios.
    + + +
    +
    top
    +

    <LimitExcept> Directiva

    + + + + + + + +
    Descripción:Restringe los controles de acceso a todos los métodos +HTTP excepto a los que se especifiquen
    Sintaxis:<LimitExcept method [method] ... > + ... </LimitExcept>
    Contexto:server config, virtual host, directory, .htaccess
    Prevalece sobre:Todas
    Estado:Core
    Módulo:core
    +

    <LimitExcept> y + </LimitExcept> se usan para englobar un grupo + de directivas de control de acceso que se aplicarán a + cualquier método de acceso HTTP no + especificado en los argumentos; es lo contrario a lo + que hace una sección <Limit> y puede usarse para controlar + tanto métodos estándar como no estándar o + métodos no reconocidos. Consulte la documentación de + <Limit> para + más detalles.

    + +

    Por ejemplo:

    + +

    + <LimitExcept POST GET>
    + + Require valid-user
    +
    + </LimitExcept> +

    + + +
    +
    top
    +

    LimitInternalRecursion Directiva

    + + + + + + + + +
    Descripción:Determina el número máximo de redirecciones internas y +subpeticiones anidadas
    Sintaxis:LimitInternalRecursion number [number]
    Valor por defecto:LimitInternalRecursion 10
    Contexto:server config, virtual host
    Estado:Core
    Módulo:core
    Compatibilidad:Disponible en las versiones Apache 2.0.47 y posteriores
    +

    Una redirección interna ocurre, por ejemplo, cuando se usa + la directiva Action, + la cual internamente redirige la petición original a un + script CGI. Una subpetición es un mecanismo de Apache para + saber qué ocurriría si se produjera una petición a + una URI. Por ejemplo, mod_dir usa subpeticiones + para buscar archivos especificados en la directiva DirectoryIndex.

    + +

    LimitInternalRecursion hace que el + servidor no sufra un error irrecuperable cuando entra en un ciclo + infinito de redirecciones internas o subpeticiones. Tales ciclos + se producen normalmente por errores de configuración.

    + +

    La directiva guarda dos límites diferentes, los cuales se + evalúan en para cada petición. El primer + número es el número máximo de + redirecciones internas, que pueden producirse una detrás de + otra. El segundo número determina, la profundidad + a la que subpeticiones pueden anidarse. Si especifica solo un + número, se asignará a ambos límites.

    + +

    Ejemplo

    + LimitInternalRecursion 5 +

    + +
    +
    top
    +

    LimitRequestBody Directiva

    + + + + + + + + +
    Descripción:Restringe el tamaño total del cuerpo de las peticiones +HTTP enviadas desde el cliente
    Sintaxis:LimitRequestBody bytes
    Valor por defecto:LimitRequestBody 0
    Contexto:server config, virtual host, directory, .htaccess
    Prevalece sobre:Todas
    Estado:Core
    Módulo:core
    +

    Esta directiva especifica el número de bytes + desde 0 (que significa sin límite) hasta 2147483647 (2GB) que + se permite que tenga el cuerpo de una petición.

    + +

    La directiva LimitRequestBody permite al + usuario especificar un límite al tamaño del cuerpo del + mensaje de las peticiones dentro del contexto en el que la + directiva aparece (server, per-directory, per-file o + per-location). Si la petición del cliente excede ese + límite, el servidor devolverá una respuesta de error en + lugar de servir la petición. El tamaño del cuerpo del + mensaje de una petición normal varía mucho en + función de la naturaleza del recurso y los métodos + permitidos para ese recurso. Los scripts CGI usan normamente el + cuerpo del mensaje para acceder la información de formularios + HTML. Las implementaciones del método PUT + requerirán un valor al menos del mismo tamaño que + cualquier representación que el servidor desee aceptar para + ese recurso.

    + +

    Esta directiva le da al administrador del servidor un mayor + control sobre el comportamiento anormal de peticiones de clientes, + lo cual puede ser útil para evitar algunos tipos de ataques de + denegación de servicio.

    + +

    Si, por ejemplo, permite que se suban archivos a una ubicación + en concreto, y quiere limitar el tamaño de los ficheros que se + suban a 100K, puede usar la siguiente directiva:

    + +

    + LimitRequestBody 102400 +

    + + +
    +
    top
    +

    LimitRequestFields Directiva

    + + + + + + + +
    Descripción:Limita el número de campos de la cabecera de las +peticiones HTTP del cliente que serán aceptadas
    Sintaxis:LimitRequestFields number
    Valor por defecto:LimitRequestFields 100
    Contexto:server config
    Estado:Core
    Módulo:core
    +

    Number es un entero entre 0 (sin límite) hasta + 32767. El valor por defecto se define por la constante + DEFAULT_LIMIT_REQUEST_FIELDS al compilar (y es de 100 + campos para la cabecera).

    + +

    La directiva LimitRequestFields permite + al administrador del servidor modificar el límite del + número de campos de la cabecera permitidos en una + petición HTTP. Este valor tiene que ser mayor que el + número de campos que tiene la cabecera de una petición + normal de un cliente. El número de campos de la cabecera de + una petición usados por un cliente raramente pasa de 20, pero + esto puede variar según las diferentes implementaciones, a + menudo dependiendo incluso de la configuración que un usuario + haya hecho de su navegador para soportar negociación de + contenidos detallada. Las extensiones opcionales de HTTP se + expresan muchas veces usando campos de cabecera de + petición.

    + +

    Esta directiva le da al administrador del servidor un mayor + control sobre el comportamiento anormal de peticiones de clientes, + lo cual puede ser útil para evitar algunos tipos de ataques + de denegación de servicio. Debe incrementar el valor que se + especifica en esta directiva si a los clientes normales les llegan + mensajes de error que indican que se han enviado demasiados campos + de cabecera en la petición.

    + +

    Por ejemplo:

    + +

    + LimitRequestFields 50 +

    + + +
    +
    top
    +

    LimitRequestFieldSize Directiva

    + + + + + + + +
    Descripción:Limita el tamaño permitido de las cabeceras de las peticiones HTTP de los clientes
    Sintaxis:LimitRequestFieldsize bytes
    Valor por defecto:LimitRequestFieldsize 8190
    Contexto:server config
    Estado:Core
    Módulo:core
    +

    Esta directiva especifica el número de bytes + desde 0 hasta el valor de la constante definida al compilar + DEFAULT_LIMIT_REQUEST_FIELDSIZE (8190 por defecto) + que será permitido para una cabecera de las peticiones + HTTP.

    + +

    La directiva LimitRequestFieldSize + permite al administrador del servidor reducir el límite del + tamaño permitido de una cabecera de las peticiones HTTP por + debajo del tamaño del buffer de entrada compilado en el + servidor. Este valor tiene que ser lo suficientemente grande para + que no quede por debajo del tamaño normal de una cabecera de + petición de un cliente. El tamaño de una cabecera de una + petición varía mucho en función de la + implementación del cliente, a menudo depende incluso de la + configuración del navegador que haya hecho el usuario para + soportar negociación de contenido detallada.

    + +

    Esta directiva le da al administrador del servidor un mayor + control sobre el comportamiento anormal de peticiones de clientes, + lo cual puede ser útil para evitar algunos tipos de ataques de + denegación de servicio.

    + +

    Por ejemplo:

    + +

    + LimitRequestFieldSize 4094 +

    + +
    En condiciones normales, no debe modificarse el valor que + viene por defecto.
    + + +
    +
    top
    +

    LimitRequestLine Directiva

    + + + + + + + +
    Descripción:Limita el tamaño la línea de petición HTTP que será +aceptada
    Sintaxis:LimitRequestLine bytes
    Valor por defecto:LimitRequestLine 8190
    Contexto:server config
    Estado:Core
    Módulo:core
    +

    Esta directiva especifica el número de bytes de + 0 hasta el valor de la constante definida al compilar + DEFAULT_LIMIT_REQUEST_LINE ( @@@@ 8190 as distributed @@@@ ) que + se permitirá para la línea de petición HTTP.

    + +

    La directiva LimitRequestLine permite al + administrador del servidor reducir el límite de tamaño + permitido de la línea de petición de las peticiones HTTP + de los clientes por debajo del tamaño del buffer de entrada + compilado con el servidor. Como la línea de petición + consiste en el método HTTP, la URI y la versión del + protocolo, la directiva LimitRequestLine + impone una restricción en la longitud de la URI de la + petición permitida por el servidor. Este valor tiene que ser + lo suficientemente grande como para que admita el tamaño de + sus nombres de recurso, incluida la información que puede + ser pasada como parte de consulta de una petición + GET.

    + +

    Esta directiva le da al administrador del servidor un mayor + control sobre el comportamiento anormal de peticiones de clientes, + lo cual puede ser útil para evitar algunos tipos de ataques de + denegación de servicio.

    + +

    Por ejemplo:

    + +

    + LimitRequestLine 4094 +

    + +
    En condiciones normales, no debe modificarse el valor que + viene por defecto.
    + +
    +
    top
    +

    LimitXMLRequestBody Directiva

    + + + + + + + + +
    Descripción:Limita el tamaño del cuerpo de una petición XML
    Sintaxis:LimitXMLRequestBody bytes
    Valor por defecto:LimitXMLRequestBody 1000000
    Contexto:server config, virtual host, directory, .htaccess
    Prevalece sobre:All
    Estado:Core
    Módulo:core
    +

    Límite (en bytes) o tamaño máximo del cuerpo de una petición + basada en XML. Si se especifica el valor 0 se + desactiva este control.

    + +

    Ejemplo:

    + +

    + LimitXMLRequestBody 0 +

    + + +
    +
    top
    +

    <Location> Directiva

    + + + + + + +
    Descripción:Aplica las directivas que contiene solo a las URLs que tengan una equivalencia con los valores que se especifiquen
    Sintaxis:<Location + URL-path|URL> ... </Location>
    Contexto:server config, virtual host
    Estado:Core
    Módulo:core
    +

    Una sección <Location> + aplica las directivas que contiene según la URL de que se + trate. Es parecida a la directiva <Directory>, y tiene que terminar con una + directiva </Location>. Las secciones <Location> se procesan en el orden en que + aparecen en el fichero de configuración, después de leer + las secciones <Directory> y los ficheros + .htaccess, y después de las secciones <Files>.

    + +

    Las secciones <Location> + operan completamente fuera del sistema de ficheros. Esto tiene + varias consecuencias. La más importante, es que las + directivas <Location> no deben + usarse para controlar el acceso a ubicaciones del sistema de + ficheros. Como diferentes URLs pueden corresponderse con una misma + ubicación de un sistema de ficheros, tales controles de + acceso pueden ser burlados.

    + +

    Cuándo usar <Location>

    + +

    Use <Location> para aplicar + las directivas que va a incluir a contenido que está fuera + del sistema de ficheros. Para el contenido que esté en el + sistema de ficheros, use <Directory> y <Files>. Una excepción a esto es el + uso de <Location />, que es un modo fácil + de aplicar una configuración a un servidor entero.

    +
    + +

    Para todas las peticiones que no provengan de servidores proxy, + la URL de la que se buscan equivalencias es una ruta URL de la + forma /path/. Ningún esquema, nombre de host, + puerto o cadena de consulta puede incluirse. Para peticiones + provenientes de servidores proxy, la URL de la que se buscan + euivalencias es de la forma scheme://servername/path, + y debe incluir el prefijo.

    + +

    La URL puede usar caracteres comodín. En una cadena de + caracteres comodín, ? equivale a cualquier + carácter, y * equivale a cualquier secuencia de + caracteres.

    + +

    También pueden usarse expresiones regulares extendidas, + con el carácter adicional ~. Por ejemplo:

    + +

    + <Location ~ "/(extra|special)/data"> +

    + +

    equivaldrá a las URLs que contengan la subcadena + /extra/data o /special/data. La + directiva <LocationMatch> se comporta de igual modo + que la versión de regex de <Location>.

    + +

    El uso de <Location> es + especialmente útil cuando se combina con la directiva + SetHandler. Por ejemplo, para + permitir peticiones de status, pero solo de navegadores que + intenten acceder a foo.com, puede usar:

    + +

    + <Location /status>
    + + SetHandler server-status
    + Order Deny,Allow
    + Deny from all
    + Allow from .foo.com
    +
    + </Location> +

    + +

    Comentarios sobre la barra : /

    El + carácter de la barra tiene un significado especial + dependiendo del lugar donde aparece en una URL. Los usuarios + puede estar no estar acostumbrada a que la barra tenga distintos + significados, por ejemplo, en los sistemas de ficheros, varias + barras consecutivas tienen el mismo significado que una sola + barra (por ejemplo, /home///foo es lo mismo que + /home/foo). Para las URL's esto no se cumple. La + directiva <LocationMatch> y la versión de + regex de <Location> + requieren que se especifiquen explícitamente múltiples + barras solo si esa es su intención.

    + +

    Por ejemplo, <LocationMatch ^/abc> + podría equivaler a la petición de la URL + /abc pero no a la petición de la URL + //abc. La directiva (no regex) <Location> se comporta de manera similar cuando se + usa para peticiones provenientes de servidores proxy. Sin + embargo, cuando la directiva (no regex) <Location> se usa para peticiones no + provenientes de servidores proxy, a efectos de encontrar + equivalencias, múltiples barras equivaldrán a una + sola. Por ejemplo, si especifica <Location + /abc/def> y la petición es a + /abc//def se producirá equivalencia.

    +
    + +

    Consulte también

    + +
    +
    top
    +

    <LocationMatch> Directiva

    + + + + + + +
    Descripción:Aplica las directiva que incluye solo a las URLs que tengan equivalencia con alguna de las expresiones regulares que se especifiquen
    Sintaxis:<LocationMatch + regex> ... </LocationMatch>
    Contexto:server config, virtual host
    Estado:Core
    Módulo:core
    +

    La directiva <LocationMatch> limita la aplicación + de las directivas que incluye a URLs que tengan equivalencia con + alguna de las expresiones regulares que se especifican, de manera + idéntica a como lo hace <Location>. Sin embargo, toma las + expresiones regulares como argumentos en lugar de como una cadena + de caracteres. Por ejemplo:

    + +

    + <LocationMatch "/(extra|special)/data"> +

    + +

    equivaldría a las URLs que contengan la subcadena + /extra/data ó /special/data.

    + +

    Consulte también

    + +
    +
    top
    +

    LogLevel Directiva

    + + + + + + + +
    Descripción:Controla la extensión de los mensajes que se almacenan +en el ErrorLog
    Sintaxis:LogLevel level
    Valor por defecto:LogLevel warn
    Contexto:server config, virtual host
    Estado:Core
    Módulo:core
    +

    LogLevel especifica el nivel al que se + detallan los errores que se almacenan en los logs de errores + (consulte la directiva ErrorLog). Los niveles + (levels) disponibles son, por orden decreciente:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Level Description Example
    emerg Emergencias - sistema inutilizable."Un proceso hijo no puede abrir el fichero de lock (lock + file). El programa va a terminar"
    alert Debe hacer algo inmediatamente."getpwuid: no pudo determinar el nombre de usuario a partir del uid"
    crit Condiciones críticas."socket: No se encontró un socket adecuado, el proceso hijo va a terminar"
    error Condiciones de error."Final prematuro de la cabecera del script""
    warn Condiciones de advertencia."el proceso hijo 1234 no ha terminado, enviando otra vez + SIGHUP"
    notice Condición normal, pero significativa."httpd: interceptada señal SIGBUS, intentando hacer + un volcado de memoria en ..."
    info Información."El servidor parece estar ocupado, (puede que necesite incrementar + StartServers, o Min/MaxSpareServers)..."
    debug Mensajes de nivel debug"Abriendo el fichero de configuración ..."
    + +

    Cuando se especifica un determinado nivel, se escriben en el + log también los mensajes de todos los demás niveles por + encima. Por ejemplo, cuando se especifica LogLevel + info, también se escribirán en el log los + mensajes de los niveles notice y + warn.

    + +

    Se recomienda usar, al menos, el nivel crit.

    + +

    Por ejemplo:

    + +

    + LogLevel notice +

    + +

    Nota

    Cuando el fichero log es un fichero + normal y se escriben en el mensajes de nivel + notice, estos mensajes no podrán ser + borrados. Sin embargo, esto no se aplica cuando se usa + syslog.

    +
    + +
    +
    top
    +

    MaxKeepAliveRequests Directiva

    + + + + + + + +
    Descripción:Número de peticiones permitidas en una conexión +persistente
    Sintaxis:MaxKeepAliveRequests number
    Valor por defecto:MaxKeepAliveRequests 100
    Contexto:server config, virtual host
    Estado:Core
    Módulo:core
    +

    La directiva MaxKeepAliveRequests limita + el número de peticiones permitidas por conexión cuando + KeepAlive está + activado. Si se especifica el valor 0, el número + de peticiones permitidas es ilimitado. Se recomienda que en esta + directiva se especifique un valor alto para obtener el máximo + rendimiento del servidor.

    + +

    Por ejemplo:

    + +

    + MaxKeepAliveRequests 500 +

    + +
    +
    top
    +

    NameVirtualHost Directiva

    + + + + + + +
    Descripción:Designa una dirección IP para usar hosting virtual basado en nombres
    Sintaxis:NameVirtualHost addr[:port]
    Contexto:server config
    Estado:Core
    Módulo:core
    +

    Es necesario usar la directiva + NameVirtualHost es necesario usarla si + quiere configurar hosts virtuales basados en + nombres.

    + +

    Aunque addr puede ser un nombre de host, se + recomienda que use siempre una dirección IP, por ejemplo:

    + +

    + NameVirtualHost 111.22.33.44 +

    + +

    Con la directiva NameVirtualHost se + especifica la dirección IP en la cual el servidor + recibirá las peticiones para los hosts virtuales basados en + nombres. Bsta será normalmente la dirección a la cual su + host virtual basado en nombres se resuelve. En los casos en que en + las peticiones las recibe un firewall (cortafuegos) o un proxy y + las redirige a una dirección IP diferente del servidor, debe + especificar la dirección IP del adaptador de red físico + de la máquina que servirá las peticiones. Si tiene + múltiples hosts basados en nombres o múltiples + direcciones, repita la directiva para cada dirección.

    + +

    Nota

    +

    Tenga en cuenta, que el "servidor principal" y cualquier + servidor _default_ nunca + servirán una petición a un dirección IP + NameVirtualHost (a menos que por alguna + razón use NameVirtualHost pero no + especifique ningún VirtualHost para + esa dirección).

    +
    + +

    De manera opcional puede especificar un número de puerto en + el que debe usarse el host virtual basado en el nombre, por + ejemplo

    + +

    + NameVirtualHost 111.22.33.44:8080 +

    + +

    Las direcciones IPv6 deben escribirse entre corchetes, como se + muestra en el siguiente ejemplo:

    + +

    + NameVirtualHost [2001:db8::a00:20ff:fea7:ccea]:8080 +

    + +

    Para recibir peticiones en todas las interfaces de red, puede + usar * como argumento

    + +

    + NameVirtualHost * +

    + +

    Argumento de la directiva <VirtualHost>

    +

    Tenga en cuenta que el argumento de la directiva <VirtualHost> debe coincidir + exactamente con el de la directiva NameVirtualHost.

    + +

    + NameVirtualHost 1.2.3.4
    + <VirtualHost 1.2.3.4>
    + # ...
    + </VirtualHost>
    +

    +
    + +

    Consulte también

    + +
    +
    top
    +

    Options Directiva

    + + + + + + + + +
    Descripción:Configura las funcionalidades disponibles en un directorio en particular
    Sintaxis:Options + [+|-]option [[+|-]option] ...
    Valor por defecto:Options All
    Contexto:server config, virtual host, directory, .htaccess
    Prevalece sobre:Options
    Estado:Core
    Módulo:core
    +

    La directiva Options controla qué + funcionalidades del servidor están disponibles en un + directorio en particular.

    + +

    En option puede especificar None, en + cuyo caso ninguna funcionalidad adicional estará activada, o + puede especificar una o más de las siguientes opciones:

    + +
    +
    All
    + +
    Todas las opciones excepto MultiViews. Este es + el valor por defecto.
    + +
    ExecCGI
    + +
    Se permite la ejecución de scripts CGI usando + mod_cgi.
    + +
    FollowSymLinks
    + +
    + + El servidor seguirá los enlaces simbólicos en este + directorio +
    +

    Aunque el servidor siga los enlaces simbólicos, eso + no cambia la ruta usada para encontrar equivalencias en + las secciones <Directory>.

    Tenga en cuenta + también que esta opción es ignorada si está + dentro de una sección <Location>.

    + +
    Includes
    + +
    + Permite el uso de Server-side includes, del módulo mod_include.
    + +
    IncludesNOEXEC
    + +
    + + Permite el uso de Server-side includes, pero #exec cmd + y #exec cgi son desactivados. Aunque es posible + #include virtual (incluir de forma virtual) scripts + CGI desde directorios especificados con ScriptAlias.
    + +
    Indexes
    + +
    + Si se produce una petición a una URL que se corresponde con un directorio, + y no hay DirectoryIndex + (por ejemplo, index.html) en ese directorio, + entonces mod_autoindex devolverá una lista con + los contenidos del directorio.
    + +
    MultiViews
    + +
    + Se permiten "MultiViews" de contenido negociado + "MultiViews" usando mod_negotiation.
    + +
    SymLinksIfOwnerMatch
    + +
    El servidor seguirá los enlaces simbólicos en los que el + fichero o directorio final pertenezca al mismo usuario que el + enlace. + +

    Nota

    Esta opción es ignorada si se pone + dentro de una sección <Location>.
    +
    +
    + +

    Normalmente, si se pueden aplicar múltiples + Options a un directorio, entonces la + más específica se aplica y las demás se ignoran; + las opciones no se fusionan. (Consulte cómo se fusionan las + secciones.) Sin embargo, si todas las opciones en la + directiva Options van precedidas de un + símbolo + o -, las opciones se + fusionan. Cualquier opción precedida de un + se + añade a las opciones en ese momento activas, y las opciones + precedidas de un - se quitan de las activas en ese + momento.

    + +

    Por ejemplo, sin ningún símbolo + o + -:

    + +

    + <Directory /web/docs>
    + + Options Indexes FollowSymLinks
    +
    + </Directory>
    +
    + <Directory /web/docs/spec>
    + + Options Includes
    +
    + </Directory> +

    + +

    entoces solo Includes tendrá efecto para el + directorio /web/docs/spec. Sin embargo, si la segunda + directiva Options usara un símbolo + + y otro -:

    + +

    + <Directory /web/docs>
    + + Options Indexes FollowSymLinks
    +
    + </Directory>
    +
    + <Directory /web/docs/spec>
    + + Options +Includes -Indexes
    +
    + </Directory> +

    + +

    entonces las opciones FollowSymLinks e + Includes estarán activas para el directorio + /web/docs/spec.

    + + +

    Nota

    +

    El uso de -IncludesNOEXEC o -Includes + desactiva server-side includes completamente independientemente + de la configuración anterior.

    +
    + +

    El comportamiento por defecto en ausencia de ninguna + configuración es All.

    + +
    +
    top
    +

    Require Directiva

    + + + + + + + +
    Descripción:Selecciona qué usuarios autentificados pueden acceder a +un recurso
    Sintaxis:Require entity-name [entity-name] ...
    Contexto:directory, .htaccess
    Prevalece sobre:AuthConfig
    Estado:Core
    Módulo:core
    +

    Esta directiva selecciona qué usuarios autentificados pueden + acceder a un recurso. La sintaxis a usar es:

    + +
    +
    Require user userid [userid] + ...
    +
    Solo los usuarios mencionados pueden acceder al + recurso.
    + +
    Require group group-name [group-name] + ...
    +
    Solo los usuarios pertenecientes a los grupos mencionados + pueden acceder al recurso.
    + +
    Require valid-user
    +
    Todos los usarios pueden acceder al recurso.
    +
    + +

    Require debe ser usada de forma conjunta + con las directivas AuthName, + AuthType, y con directivas + como AuthUserFile y + AuthGroupFile (para + definir usuarios y grupos) para funcionar + correctamente. Ejemplo:

    + +

    + AuthType Basic
    + AuthName "Restricted Resource"
    + AuthUserFile /web/users
    + AuthGroupFile /web/groups
    + Require group admin +

    + +

    Los controles de acceso que se aplican de esta manera son + efectivos para todos los + métodos. Esto es lo que normalmente se + quiere. Si quiere aplicar controles de acceso solo a + métodos específicos, mientras se dejan otros + métodos sin protección, use la directiva + Require en una sección <Limit>.

    + +

    Consulte también

    + +
    +
    top
    +

    RLimitCPU Directiva

    + + + + + + + + +
    Descripción:Limita el consumo de tiempo de CPU que pueden hacer proceses creados +por procesos hijo de Apache
    Sintaxis:RLimitCPU seconds|max [seconds|max]
    Valor por defecto:Unset; usa el valor por defecto del sistema operativo
    Contexto:server config, virtual host, directory, .htaccess
    Prevalece sobre:Todas
    Estado:Core
    Módulo:core
    +

    Toma 1 ó 2 parámetros. El primer parámetro + se refiere al límite flexible de recursos para todos los + procesos y el segundo parámetro especifica el límite + máximo de recursos. Cada uno de los parámetros puede ser + un número, ó max para indicarle al servidor que + el límite debe fijarse al máximo permitido por la + configuración del sistema operativo. Para elevar el + límite máximo de recursos es necesario que se esté + ejecutando el servidor como ususario root, o estar en + la fase inicial del arranque.

    + +

    Esto se aplica a procesos nacidos de procesos hijo de Apache + que están sirviendo peticiones, no a los procesos hijo de + Apache propiamente dichos. Esto incluye a los scripts CGI y a los + comandos de ejecución SSI, pero no a procesos nacidos del + proceso padre Apache tales como ficheros de registro + redireccionados (piped logs).

    + +

    Los límites de consumo de tiempo de la CPU se expresan en + segundos por proceso.

    + +

    Consulte también

    + +
    +
    top
    +

    RLimitMEM Directiva

    + + + + + + + + +
    Descripción:Limita el consumo de memoria que pueden hacer procesos creados por procesos hijo de Apache
    Sintaxis:RLimitMEM bytes|max [bytes|max]
    Valor por defecto:Unset; usa el valor por defecto del sistema operativo
    Contexto:server config, virtual host, directory, .htaccess
    Prevalece sobre:Todas
    Estado:Core
    Módulo:core
    +

    Toma 1 ó 2 parámetros. El primer parámetro + especifica el límite flexible de recursos para todos los + procesos y el segundo parámetro especifica el límite + máximo de recursos. Cada uno de los parámetros puede ser + un número, ó max para indicarle al servidor que + el límite debe fijarse al máximo permitido por la + configuración del sistema operativo. Para elevar el + límite máximo de recursos es necesario que se esté + ejecutando el servidor como ususario root, o estar en + la fase inicial del arranque.

    + +

    Esto se aplica a procesos nacidos de procesos hijo de Apache + que están sirviendo peticiones, no a los procesos hijo de + Apache propiamente dichos. Esto incluye a los scripts CGI y a los + comandos de ejecución SSI, pero no a procesos nacidos del + proceso padre Apache tales como ficheros de registro + redireccionados (piped logs).

    + +

    Los límites de consumo de memoria se expresan en bytes por + proceso.

    + +

    Consulte también

    + +
    +
    top
    +

    RLimitNPROC Directiva

    + + + + + + + + +
    Descripción:Limita el número de procesos que pueden crearse por parte de +procesos creados por procesos hijo de Apache
    Sintaxis:RLimitNPROC number|max [number|max]
    Valor por defecto:Unset; usa el valor por defecto del sistema operativo
    Contexto:server config, virtual host, directory, .htaccess
    Prevalece sobre:Todas
    Estado:Core
    Módulo:core
    +

    Toma 1 ó 2 parámetros. El primer parámetro + especifica el límite flexible de recursos para todos los + procesos y el segundo parámetro especifica el límite + máximo de recursos. Cada uno de los parámetros puede ser + un número, ó max para indicarle al servidor que + el límite debe fijarse al máximo permitido por la + configuración del sistema operativo. Para elevar el + límite máximo de recursos es necesario que se esté + ejecutando el servidor como usuario root, o estar en + la fase inicial del arranque.

    + +

    Esto se aplica a procesos nacidos de la división de + procesos hijo de Apache que están sirviendo peticiones, no a + los procesos hijo de Apache propiamente dichos. Esto incluye a los + scripts CGI y a los comandos de ejecución SSI, pero no a procesos + nacidos de la división del proceso padre Apache tales como + ficheros de registro + redireccionados (piped logs).

    + +

    Limita el número de procesos por usuario.

    + +

    Nota

    Si los procesos CGI + no están siendo ejecutados por + identificadores de usuario diferentes del identificador de + usuario que está ejecutando el servidor web, esta directiva + limitará el número de procesos que el servidor puede + crear. Como resultado de esta situación, en el + error_log aparecerán mensajes del tipo + cannot fork.

    +
    + +

    Consulte también

    + +
    +
    top
    +

    Satisfy Directiva

    + + + + + + + + + +
    Descripción:Interacción entre el control de acceso basado en host +y la autentificación de usuarios
    Sintaxis:Satisfy Any|All
    Valor por defecto:Satisfy All
    Contexto:directory, .htaccess
    Prevalece sobre:AuthConfig
    Estado:Core
    Módulo:core
    Compatibilidad:Influenciada por <Limit> y <LimitExcept> en las versiones de Apache 2.0.51 y +posteriores
    +

    Especifica la política de acceso a seguir cuando se usan tanto + Allow como Require. El parámetro puede ser + All o Any. Esta directiva es solo útil + si se va restringir el acceso a un área concreta con un nombre de + usuario/contraseña y dirección del cliente. En este caso + el comportamiento por defecto (All) es para requerir + que el cliente pase la restricción referente a la dirección + e introduzca un nombre de usuario y contraseña + válidos. Con la opción Any el cliente podrá acceder + si cumple la restricción referente a la dirección o si introduce un + nombre de usuario y contraseñas válidos. Esto puede usarse para + restringir el acceso a una zona con una contraseña, pero permitir + a los clientes de algunas direcciones en concreto que accedan sin + tener que introducir contraseña alguna.

    + +

    Por ejemplo, si quiere permitir que todo el mundo tenga acceso + total a su intranet o a una parte de si sitio web, pero requerir que + los visitantes de fuera de su intranet introduzcan una + contraseña, puede usar una configuración similar a la + siguiente:

    + +

    + Require valid-user
    + Allow from 192.168.1
    + Satisfy Any +

    + +

    A partir de la versión de Apache 2.0.51, puede limitarse + la aplicación de las directivas + Satisfy a determinados mótodos en + particular mediante secciones <Limit> y <LimitExcept>.

    + + + +

    Consulte también

    + +
    +
    top
    +

    ScriptInterpreterSource Directiva

    + + + + + + + + + +
    Descripción:Técnica para ubicar el intérprete de scripts CGI's
    Sintaxis:ScriptInterpreterSource Registry|Registry-Strict|Script
    Valor por defecto:ScriptInterpreterSource Script
    Contexto:server config, virtual host, directory, .htaccess
    Prevalece sobre:FileInfo
    Estado:Core
    Módulo:core
    Compatibilidad:Solo sistemas Windows; la opció +Registry-Strict está disponible en las versiones de +Apache 2.0 y posteriores
    +

    Esta directiva se usa para controlar la manera que Apache + encuentra el intérprete usado para ejecutar scripts CGI. La + configuración por defecto es Script. Esto hace que + Apache use el intérprete que aparece en la primera línea, la que + empieza por #!) en el script. En los sistemas Win32 + esta línea tiene un aspecto similar a:

    + +

    + #!C:/Perl/bin/perl.exe +

    + +

    o, si perl está en el PATH, + simplemente:

    + +

    + #!perl +

    + +

    Usar ScriptInterpreterSource Registry hará + que se busque en el Registro de Windows, en + HKEY_CLASSES_ROOT con la extensión del fichero + de script (por ejemplo, .pl) como clave de + búsqueda. El comando definido por la subclave del registro de + Windows Shell\ExecCGI\Command o, si esta no existe, + por la subclave Shell\Open\Command se usa para abrir + el script. Si no se encuentra ningún resutlado, Apache + recurre al comportamiento de la opción + Script.

    + +

    Seguridad

    Tenga cuidado + cuando use ScriptInterpreterSource Registry con + ScriptAlias para + directorios, porque Apache intentará ejecutar + cada fichero dentro de ese directorio. Lo + especificado en Registry puede causar llamadas + indeseadas a programas que normalmente no se ejecutan. Por + ejemplo, el programa por defecto para abrir ficheros + .htm en la mayoría de los sistemas Windows es + Microsoft Internet Explorer, entonces cualquier petición HTTP + de un fichero .htm que exista dentro del script del + directorio hará que el ejecute de fondo el navegador en el + servidor. Con esto el servidor se bloqueará en más o + menos un minuto.

    +
    + +

    La opción Registry-Strict que es nueva en + Apache 2.0 hace lo mismo que Registry pero usa solo + la subclave Shell\ExecCGI\Command. La clave + ExecCGI no es de uso común. Debe ser configurada + manualmente en el registro de Windows y por tanto previene la + ejecución accidental de procesos en su sistema.

    + +
    +
    top
    +

    ServerAdmin Directiva

    + + + + + + +
    Descripción:Dirección de email que el servidor incluye en los +mensajes de error que se envían al cliente
    Sintaxis:ServerAdmin email-address
    Contexto:server config, virtual host
    Estado:Core
    Módulo:core
    +

    ServerAdmin especifica la dirección de + e-mail que el servidor incluye en cualquier mensaje de error que + envía al cliente.

    + +

    Sería conveniente tener una dirección de email solo para esto, por ejemplo

    + +

    + ServerAdmin www-admin@foo.example.com +

    +

    ya que los usuarios no siempre mencionan que están hablando + del servidor!

    + +
    +
    top
    +

    ServerAlias Directiva

    + + + + + + +
    Descripción:Nombres alternativos usados para un host cuando se +intentan encontrar equivalencias a hosts virtuales basados en el +nombre
    Sintaxis:ServerAlias hostname [hostname] ...
    Contexto:virtual host
    Estado:Core
    Módulo:core
    +

    ServerAlias especifica los nombres + alternativos para un host, para usarlo con hosts virtuales basados en el + nombre.

    + +

    + <VirtualHost *>
    + ServerName example.com
    + ServerAlias example.com server2
    + # ...
    + </VirtualHost> +

    + +

    Consulte también

    + +
    +
    top
    +

    ServerName Directiva

    + + + + + + + +
    Descripción:Nombre de host y número de puerto que el servidor usa +para identificarse
    Sintaxis:ServerName fully-qualified-domain-name[:port]
    Contexto:server config, virtual host
    Estado:Core
    Módulo:core
    Compatibilidad:En la versión 2.0, esta directiva sustituye la + funcionalidad de la direciva Port de la + versión 1.3.
    +

    La directiva ServerName especifica el + nombre de host y el puerto que usa el servidor para + identificarse. Esto se usa cuando se hace redirección de URLs. Por + ejemplo, si el nombre de la maquina del servidor web es + simple.example.com, pero el la maquina también tiene + el alias DNS www.example.com y quiere que el servidor + web se identifique así, debe usar la siguiente directiva:

    + +

    + ServerName www.example.com:80 +

    + +

    Si no especifa ServerName, entonces el + servidor intentará deducir en nombre de host haciendo una + busqueda reversa en la dirección IP. Si no se especifica + ningún puerto en ServerName, entonces + el servidor usará el puerto para las peticiones + entrantes. Para disfrutar de la máxima fiabilidad y + predictibilidad, debe especificar explicitamente un nombre de host + y un puerto usando la directiva + ServerName.

    + +

    Si está usando hosts + virtuales basados en el nombre, la directiva + ServerName dentro de una sección <VirtualHost> especifica + qué nombre de host debe aparecer en la cabecera de petición + Host: para coincidir con ese host virtual.

    + +

    Consulte la descripción de la directiva UseCanonicalName para configuraciones + que determinan si URLs autoreferenciadas (por ejemplo, por el + módulo mod_dir module) se referirán al puerto + especificado, o al número de puerto dado en la petición del + cliente. +

    + +

    Consulte también

    + +
    +
    top
    +

    ServerPath Directiva

    + + + + + + +
    Descripción:URL que se usará para hosts virtuales basados en +nombre que son accedidos con un navegador incompatible
    Sintaxis:ServerPath URL-path
    Contexto:virtual host
    Estado:Core
    Módulo:core
    +

    The ServerPath directive sets the legacy + URL pathname for a host, for use with name-based virtual hosts.

    + +

    Consulte también

    + +
    +
    top
    +

    ServerRoot Directiva

    + + + + + + + +
    Descripción:Directorio base de la instalación del servidor
    Sintaxis:ServerRoot directory-path
    Valor por defecto:ServerRoot /usr/local/apache
    Contexto:server config
    Estado:Core
    Módulo:core
    +

    La directiva ServerRoot especifica el + directorio en el que ha sido instalado el servidor. Normalmente + contendrá los subdirectorios conf/ y + logs/. Las rutas que se especifican en otras + directivas (por ejemplo en Include o LoadModule) se toman como relativas a + este directorio.

    + +

    Example

    + ServerRoot /home/httpd +

    + + +

    Consulte también

    + +
    +
    top
    +

    ServerSignature Directiva

    + + + + + + + + +
    Descripción:Configura el pie de página en documentos generados +por el servidor
    Sintaxis:ServerSignature On|Off|EMail
    Valor por defecto:ServerSignature Off
    Contexto:server config, virtual host, directory, .htaccess
    Prevalece sobre:All
    Estado:Core
    Módulo:core
    +

    La directiva ServerSignature permite la + configuración de un pie de página que se + añadirá a documentos generados por el sevidor (mensajes + de error, listado de directorios generados por + mod_proxy, salida de + mod_info...). La razón por la que puede no + querer añadir este pie de página, es que en una cadena + de proxies, el usuario a menudo no tiene posibilidad de establecer + cual de los servidores encadenados ha retornado un mensaje de + error.

    + +

    Esta directiva usa por defecto el valor Off, que + suprime la generación del pie de página (y por tanto, es + compatible con el comportamiento de Apache 1.2 y las versiones + anteriores). Si usa el valor On simplemte se + añade una línea con el número de versión y el + valor de ServerName para el + host virtual que está respondiendo la petición, y el + valor EMail crea las referencias adicionales + "mailto:" a lo especificado en la directiva ServerAdmin.

    + +

    En las versiones 2.0.44 y posteriores, los detalles del número + de la versión del servidor son controlados por la directiva + ServerTokens.

    + +

    Consulte también

    + +
    +
    top
    +

    ServerTokens Directiva

    + + + + + + + +
    Descripción:Configura la cabecera de respuesta HTTP +Server
    Sintaxis:ServerTokens Major|Minor|Min[imal]|Prod[uctOnly]|OS|Full
    Valor por defecto:ServerTokens Full
    Contexto:server config
    Estado:Core
    Módulo:core
    +

    Esta directiva controla si el campo Server de las + cabeceras de las respuestas que se envían de vuelta a los clientes + incluye una descripción del sistema operativo genérico del + servidor así como información sobre los modulos compilados en el + servidor.

    + +
    +
    ServerTokens Prod[uctOnly]
    + +
    El servidor envía (por ejemplo): Server: + Apache
    + +
    ServerTokens Major
    + +
    El servidor envía (por ejemplo): Server: + Apache/2
    + +
    ServerTokens Minor
    + +
    El servidor envía (por ejemplo): Server: + Apache/2.0
    + +
    ServerTokens Min[imal]
    + +
    El servidor envía (por ejemplo): Server: + Apache/2.0.41
    + +
    ServerTokens OS
    + +
    El servidor envía (por ejemplo): Server: Apache/2.0.41 + (Unix)
    + +
    ServerTokens Full (or not specified)
    + +
    El servidor envía (por ejemplo): Server: Apache/2.0.41 + (Unix) PHP/4.2.2 MyMod/1.2
    +
    + +

    Esta configuración se aplica al servidor entero, y no puede ser + activada o desactivada para unos hosts virtuales sí y para otros + no.

    + +

    En las versiones posteriores a la 2.0.44, esta directiva + también controla la información especificada en la directiva + ServerSignature.

    + +

    Consulte también

    + +
    +
    top
    +

    SetHandler Directiva

    + + + + + + + + +
    Descripción:Hace que todos los ficheros que correspondan con el valor +especificado sean procesados obligatoriamente por un +handler
    Sintaxis:SetHandler handler-name|None
    Contexto:server config, virtual host, directory, .htaccess
    Prevalece sobre:FileInfo
    Estado:Core
    Módulo:core
    Compatibilidad:Trasladado al núcleo del servidor en Apache +2.0
    +

    Cuando se usa en un fichero .htaccess o en una + sección <Directory> r <Location>, esta directiva hace que todos + los ficheros cuyo nombre tenga equivalencia con el valor que + especifica sean tratados por el handler dado en + handler-name. Por ejemplo, si tiene un directorio cuyo + contenido quiere que sea tratado como as fichero de reglas de + mapas de imágenes, independientemente de las extensiones, + puede poner lo siguiente en un fichero .htaccess en + ese directorio:

    + +

    + SetHandler imap-file +

    + +

    Otro ejemplo: si quiere que el servidor despliegue un resumen + de su estado cuando se llame a una URL de + http://servername/status, puede poner lo siguiente en + el fichero httpd.conf:

    + +

    + <Location /status>
    + + SetHandler server-status
    +
    + </Location> +

    + +

    Puede evitar que se aplique lo especificado anteriormente en + una directiva SetHandler usando el valor + None.

    + +

    Consulte también

    + +
    +
    top
    +

    SetInputFilter Directiva

    + + + + + + + +
    Descripción:Especifica los filtros que procesarán las peticiones de +los clientes y el contenido de peticiones POST
    Sintaxis:SetInputFilter filter[;filter...]
    Contexto:server config, virtual host, directory, .htaccess
    Prevalece sobre:FileInfo
    Estado:Core
    Módulo:core
    +

    La directiva SetInputFilter espcifica el + filtro o filtros que procesarán las peticiones de los + clientes y el contenido de peticiones POST cuando son recibidas + por el servidor. El filtro o filtros especificados en esta + directiva se aplican además de los definidos en otras partes, + incluyendo los especificados en la directiva AddInputFilter.

    + +

    Si se especifica más de un filtro, deben separarse con puntos y + comas en el orden en que deban procesar los contenidos.

    + +

    Consulte también

    + +
    +
    top
    +

    SetOutputFilter Directiva

    + + + + + + + +
    Descripción:Especifica los filtros que procesarán las respuestas del +servidor
    Sintaxis:SetOutputFilter filter[;filter...]
    Contexto:server config, virtual host, directory, .htaccess
    Prevalece sobre:FileInfo
    Estado:Core
    Módulo:core
    +

    La directiva SetOutputFilter especifica + los filtros se usarán para procesar las respuestas del servidor + antes de enviarlas al cliente. Esto es además de los filtros + definidos en otras partes, incluidos los de la directiva + AddOutputFilter.

    + +

    Por ejemplo, la siguiente configuración procesará todos los + archivos en el directorio /www/data/ con server-side + includes.

    + +

    + <Directory /www/data/>
    + + SetOutputFilter INCLUDES
    +
    + </Directory> +

    + +

    Si se especifica más de un filtro, deben separarse con puntos y + comas en el orden en que deban procesar los contenidos.

    + +

    Consulte también

    + +
    +
    top
    +

    TimeOut Directiva

    + + + + + + + +
    Descripción:Cantidad de tiempo que el servidor esperará para que +ocurran determinados eventos antes de cerrar una +petición
    Sintaxis:TimeOut seconds
    Valor por defecto:TimeOut 300
    Contexto:server config
    Estado:Core
    Módulo:core
    +

    La directiva TimeOut define ahora la + cantidad de tiempo que Apache esperará para tres cosas:

    + +
      +
    1. La cantidad de tiempo que tarda en recibir una + petición GET.
    2. + +
    3. La cantidad de tiempo entre la recepción de paquetes TCP + packets en una petición POST o PUT.
    4. + +
    5. La cantidad de tiempo entre ACKs en transmisiones de + paquetes TCP en las respuestas.
    6. +
    + +

    Lo planeado es hacer configurable por separado cada una de + estas cosas. La cantidad de tiempo por defecto de 1200 usada antes + de la versión 1.2, ha sido reducida hasta 300, que es en la mayor + parte de las situaciones más de lo necesario. El tiempo usado por + defecto no es menor porque puede que haya alguna parte del código + en que el contador de tiempo no se pone a cero como debería cuando + se envía un paquete.

    + +
    +
    top
    +

    UseCanonicalName Directiva

    + + + + + + + +
    Descripción:Configura la forma en que el servidor determina su propio +nombre u puerto
    Sintaxis:UseCanonicalName On|Off|DNS
    Valor por defecto:UseCanonicalName On
    Contexto:server config, virtual host, directory
    Estado:Core
    Módulo:core
    +

    En muchas ocasiones, Apache tiene que construir una URL + autoreferenciada -- esto es, una URL que se refiere de + vuelta al mismo servidor. Con UseCanonicalName On + Apache usará el nombre de host y puerto que estén especificados en + la directiva ServerName para + construir el nombre canónico del servidor. Este nombre se usa en + todas las URLs autoreferenciadas, y para los valores de + SERVER_NAME y SERVER_PORT en los + CGIs.

    + +

    Con UseCanonicalName Off Apache formará las + URLs autoreferenciadas usando el nombre de host y puerto + suministrados por el cliente. Si se ha suministrado esa + información (si no se ha suministrado, se usará el + nombre canónico, tal y como se ha definido arriba). Estos + valores son los mismos que se usan para implementar hosting virtual basado en + nombres, y están disponibles con los mismos clientes. Las + variables de CGI SERVER_NAME y + SERVER_PORT se construirán con la + información suministrada por los clientes.

    + +

    Un ejemplo de donde esto puede ser útil es en un servidor de + una intranet, donde los usuarios se conectan a la máquina usando + nombres cortos como www. Se dará cuenta de que si los + usuarios teclean un nombre corto, y una URL que es un directorio, + tal como http://www/splat, sin una barra al + final entonces Apache los rediccionará a + http://www.domain.com/splat/. Si tiene la + autenfificación activada, esto hará que el usuario se tenga que + autentificar dos veces (una para www y otra para + www.domain.com -- consulte las + preguntas más frecuentes sobre este asunto para obtener más + información). Pero si especifica el valor Off en + la directiva UseCanonicalName, entonces + Apache redireccionará a http://www/splat/.

    + +

    Hay una tercera opción, UseCanonicalName DNS, para + el caso en que se usa hosting virtual masivo basado en IP para + soportar clientes antiguos que no envían la cabecera + Host:. Con esta opción Apache hace una busqueda de + DNS reversa en la dirección IP del servidor al que el cliente se + conectó para hacer funcionar las URLs autoreferenciadas.

    + +

    Advertencia

    + +

    Si los CGIs asumen los valores de SERVER_NAME, + puede que no funcionen con esta opción. El cliente es + esencialmente libre de dar cualquier valor que quiera como nombre + de host. Pero si el CGI solo usa SERVER_NAME para + constrir URLs autoreferenciadas, entonces no debe haber ningún + problema.

    +
    + +

    Consulte también

    + +
    +
    top
    +

    <VirtualHost> Directiva

    + + + + + + +
    Descripción:Contiene las directivas que se aplican solo a un nombre +de host específico o dirección IP
    Sintaxis:<VirtualHost + addr[:port] [addr[:port]] + ...> ... </VirtualHost>
    Contexto:server config
    Estado:Core
    Módulo:core
    +

    <VirtualHost> y + </VirtualHost> se usan para incluir un grupo de + directivas que se aplicarán solo a un host virtual en + particular. Cualquier directiva que esté permitido usar en un + contexto virtual host puede usarse. Cuando el servidor recibe una + petición de un documento de un host virtual en concreto, usa las + directivas de configuración incluidas en la sección <VirtualHost>. Addr puede + ser:

    + +
      +
    • La dirección IP del host virtual;
    • + +
    • Un nombre de dominio completo para la dirección IP del host + virtual;
    • + +
    • El carácter *, el cual puede usarse en + combinación con NameVirtualHost * para que + equivalga a todas las direcciones IP; o
    • + +
    • La cadena de caracteres _default_, que se usa + solo con hosting virtual IP para detectar direcciones IP sin + emparejar.
    • +
    + +

    Ejemplo

    + <VirtualHost 10.1.2.3>
    + + ServerAdmin webmaster@host.foo.com
    + DocumentRoot /www/docs/host.foo.com
    + ServerName host.foo.com
    + ErrorLog logs/host.foo.com-error_log
    + TransferLog logs/host.foo.com-access_log
    +
    + </VirtualHost> +

    + + +

    Las direcciones IPv6 deben especificarse entre corchetes porque + el número de puerto opcional no podría determinarse si no se hace + así. Un ejemplo de dirección IPv6 se mustra aquí abajo:

    + +

    + <VirtualHost [2001:db8::a00:20ff:fea7:ccea]>
    + + ServerAdmin webmaster@host.example.com
    + DocumentRoot /www/docs/host.example.com
    + ServerName host.example.com
    + ErrorLog logs/host.example.com-error_log
    + TransferLog logs/host.example.com-access_log
    +
    + </VirtualHost> +

    + +

    Cada host virtual se corresponde con una dirección IP + diferente, un número de puerto diferente o un nombre de host + diferente para el servidor, en el primer caso la máquina del + servidor debe estar configurada para aceptar paquetes IP para + múltiples direcciones. (Si la máquina no tiene múltiples infaces + de red, entonces esto puede conseguirse con el comando + ifconfig alias -- si su sistema operativo lo + soporta).

    + +

    Nota

    El uso de <VirtualHost> no afecta + a las direcciones en las que escucha Apache. Puede que necesite + asegurarse de que Apache está escuchando en la dirección correcta + usando Listen.

    +
    + +

    Cuando se usa hosting virtual basado en IP, puede + especificarse el nombre especial _default_, en cuyo + caso, este host virtual equivaldrá a cualquier dirección IP que no + esté especificamente listada en otro host virtual. En ausencia de + un host virtual _default_ el server config + "principal", consistente en todas las definiciones fuera de una + sección VirtualHost, se usa cuando la IP no coincide con ninguna. + (Pero tenga en cuenta que cualquier dirección IP que equivalga a + la directiva NameVirtualHost + no usará ni el server config "principal" ni el host virtual + _default_ virtual host. Consulte la documentación de + hosting virtual basado en + nombres para obtener más información.)

    + +

    Puede especificar :port para cambiar el puerto + de equivalencia. Si no especifica ninguno, entonces por defecto se + usa el mismo puerto de la directiva Listen mas reciente del servidor + principal. También puede especificar :* para hacer + coincidir con todos los puertos en esa dirección. (Esto se + recomienda cuando se usa con _default_.)

    + +

    Seguridad

    +

    Consulte la documentación de consejos de seguridad para + obtener más información sobre por qué pone en riesgo la seguridad + si en el directorio donde almacena los archivos log tiene permisos + de escritura alguien que no sea el usuario que inicia el + servidor.

    +
    + +

    Consulte también

    + +
    +
    +
    +

    Idiomas disponibles:  de  | + en  | + es  | + ja  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/core.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/core.html.ja.utf8 new file mode 100644 index 00000000..479ab4e8 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/core.html.ja.utf8 @@ -0,0 +1,3203 @@ + + + +core - Apache HTTP サーバ + + + + + + +
    <-
    + +
    +

    Apache コア機能

    +
    +

    Available Languages:  de  | + en  | + es  | + ja  | + tr 

    +
    +
    This translation may be out of date. Check the + English version for recent changes.
    + +
    説明:常に使用可能な Apache HTTP サーバのコア機能
    ステータス:Core
    +
    + + +
    top
    +

    AcceptPathInfo ディレクティブ

    + + + + + + + + + +
    説明:後に続くパス名情報を受け付けるリソースの指定
    構文:AcceptPathInfo On|Off|Default
    デフォルト:AcceptPathInfo Default
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:FileInfo
    ステータス:Core
    モジュール:core
    互換性:Apache 2.0.30 以降で使用可能
    + +

    このディレクティブは実際のファイル名 (もしくは存在するディレクトリの + 存在しないファイル) の後に続くパス名情報があるリクエストを受け付けるか + 拒否するかを制御します。続きのパス名情報はスクリプトには PATH_INFO + 環境変数として利用可能になります。

    + +

    例えば、/test/ が、here.html というファイル + 一つのみがあるディレクトリを指しているとします。そうすると、 + /test/here.html/more と /test/nothere.html/more + へのリクエストは両方とも /more を PATH_INFO とします。

    + +

    AcceptPathInfo ディレクティブに指定可能な + 三つの引数は:

    + +
    +
    Off
    リクエストは存在するパスにそのまま + マップされる場合にのみ受け付けられます。ですから、上の例の + /test/here.html/more のように、本当のファイル名の + 後にパス名情報が続くリクエストには 404 NOT FOUND エラーが返ります。
    + +
    On
    前の方のパスが存在するファイルにマップする場合は + リクエストが受け付けられます。上の例の /test/here.html/more + は /test/here.html が有効なファイルにマップすれば + 受け付けられます。
    + +
    Default
    続きのパス名情報の扱いはリクエストの + ハンドラで決まります。 + 普通のファイルのためのコアハンドラのデフォルトは PATH_INFO を拒否します。 + cgi-script や isapi-handler のようにスクリプトを扱うハンドラは + 一般的にデフォルトで PATH_INFO を受け付けます。
    +
    + +

    AcceptPathInfo の主な目的はハンドラの PATH_INFO を + 受け付けるか拒否するかの選択を上書きできるようにすることです。 + 例えば、これは例えば INCLUDES のような + フィルタを使って PATH_INFO に + 基づいてコンテンツを生成しているときに必要になります。

    + +

    + <Files "mypaths.shtml">
    + + Options +Includes
    + SetOutputFilter INCLUDES
    + AcceptPathInfo On
    +
    + </Files> +

    + +
    +
    top
    +

    AccessFileName ディレクティブ

    + + + + + + + +
    説明:分散設定ファイルの名前
    構文:AccessFileName filename [filename] ...
    デフォルト:AccessFileName .htaccess
    コンテキスト:サーバ設定ファイル, バーチャルホスト
    ステータス:Core
    モジュール:core
    +

    リクエストを処理するとき、サーバはディレクトリに + 対して分散設定ファイルが有効になっていれば、 + そのドキュメントへの + パス上にある全てのディレクトリから、ここで指定された名前の一覧の中で + 最初に見つかったファイルをそれぞれ設定ファイルとして読み込みます。例えば:

    + +

    + AccessFileName .acl +

    + +

    という設定があると、以下のようにして無効にされていない限り、 + ドキュメント /usr/local/web/index.html + を返す前に、サーバは /.acl, /usr/.acl, + /usr/local/.acl, /usr/local/web/.acl から + ディレクティブを読み込みます。

    + +

    + <Directory />
    + + AllowOverride None
    +
    + </Directory> +

    + +

    参照

    + +
    +
    top
    +

    AddDefaultCharset ディレクティブ

    + + + + + + + + +
    説明:明示的に文字セットを指定していない応答に追加される +デフォルトの文字セット
    構文:AddDefaultCharset On|Off|charset
    デフォルト:AddDefaultCharset Off
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:FileInfo
    ステータス:Core
    モジュール:core
    +

    このディレクティブは、HTTP ヘッダにコンテントタイプパラメータを + 持たない応答に追加される文字セットの名前を指定します。 + これは、ドキュメント内の META タグで指定されたどのような文字セット + も無効にします。 + AddDefaultCharset Off という設定により、この機能は無効になります。 + AddDefaultCharset On にすれば、ディレクティブの要求通り + Apache 内部のデフォルト文字セット iso-8859-1 に設定します。 + また、他の charset も指定できます。例えば:

    + +

    + AddDefaultCharset utf-8 +

    + +
    +
    top
    +

    AddOutputFilterByType ディレクティブ

    + + + + + + + + +
    説明:MIME-type に出力フィルタを割り当てる
    構文:AddOutputFilterByType filter[;filter...] MIME-type +[MIME-type] ...
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:FileInfo
    ステータス:Core
    モジュール:core
    互換性:Apache 2.0.33 以降で使用可能
    +

    このディレクティブは応答の MIME-type に応じて出力フィルタを使用するようにします。

    + +

    次の例は mod_deflate の DEFLATE フィルタを + 使っています。text/html と text/plain の + すべての出力 (静的なものも動的なものも) をクライアントに送られる前に + 圧縮します。

    + +

    + AddOutputFilterByType DEFLATE text/html text/plain +

    + +

    複数のフィルタでコンテンツを処理させたいときは、それぞれの名前をセミコロンで + 分ける必要があります。各フィルタに対して + AddOutputFilterByType を一つずつ書くこともできます。

    + +

    次の例は text/html のスクリプトのすべての出力を + まず INCLUDES フィルタで処理し、さらに DEFLATE フィルタにかけます。

    + +

    + <Location /cgi-bin/>
    + + Options Includes
    + AddOutputFilterByType INCLUDES;DEFLATE text/html
    +
    + </Location> +

    + +

    注:

    +

    AddOutputFilterByType ディレクティブにより + 有効にしたフィルタは場合によっては、部分的もしくは完全に適用されないことが + あります。例えば、MIME タイプがが決定できないときには + DefaultType の設定が同じだったとしても、 + DefaultType 設定を使うようになります。

    +

    しかし、確実にフィルタが適用されるようにしたいときは、リソースに + 明示的にコンテントタイプを割り当てることができます。これには例えば + AddType ディレクティブや + ForceType ディレクティブを使います。 + (nphでない) CGI スクリプトでコンテントタイプを設定するというものでも + 大丈夫です。

    + +

    タイプ毎の出力フィルタはプロキシリクエストには決して適用されません。

    +
    + +

    参照

    + +
    +
    top
    +

    AllowEncodedSlashes ディレクティブ

    + + + + + + + + +
    説明:URL 中の符号化されたパス分離文字が先に伝えられるのを許可するかどうかを +決定する
    構文:AllowEncodedSlashes On|Off
    デフォルト:AllowEncodedSlashes Off
    コンテキスト:サーバ設定ファイル, バーチャルホスト
    ステータス:Core
    モジュール:core
    互換性:Apache 2.0.46 以降で使用可能
    +

    AllowEncodedSlashes ディレクティブは符号化された + パス分離文字 (/ は %2F、さらにシステムによっては + \ に対応する %5C) が存在する URL の使用を + 許可するかどうかを決定します。通常はそのような URL は 404 (Not found) エラー + で拒否されます。

    + +

    AllowEncodedSlashes On による + パス分離文字の使用は、PATH_INFO と合わせて + 使うときに一番役に立ちます。

    +

    Turning AllowEncodedSlashes On is + mostly useful when used in conjunction with PATH_INFO.

    + +

    注

    +

    符号化されたスラッシュを許可することは、復号をすることを + 意味しません。%2F や (関係するシステムでの) + %5C は、他の部分が復号された URL の中でもそのままの形式で + 残されます。

    +
    + +

    参照

    + +
    +
    top
    +

    AllowOverride ディレクティブ

    + + + + + + + +
    説明:.htaccess で許可されるディレクティブの種類
    構文:AllowOverride All|None|directive-type +[directive-type] ...
    デフォルト:AllowOverride All
    コンテキスト:ディレクトリ
    ステータス:Core
    モジュール:core
    +

    サーバが (AccessFileName によって指定された) + .htaccess ファイルを見つけた時、そのファイルの中で + 宣言されたどのディレクティブがより前に定義された設定ディレクティブを + 上書きできるかを知る必要があります。

    + +

    <Directory> セクションでのみ使用可能

    + AllowOverride は正規表現無しの<Directory> + セクションでのみ有効で、<Location> や <DirectoryMatch> + や <Files> セクションでは無効です。 +
    + +

    このディレクティブを None に設定すると、.htaccess ファイルは完全に + 無視されます。 + この場合、サーバはファイルシステムの .htaccess ファイルを読むことを + 試みさえしません。

    + +

    このディレクティブが All に設定されている時には、 + .htaccess という コンテキスト を持つ + 全てのディレクティブが利用できます。

    + +

    directive-type には、以下のディレクティブ群の + キーワードのどれかを指定します。

    + +
    +
    AuthConfig
    + +
    + + 認証に関するディレクティブの使用を許可する (AuthDBMGroupFile, + AuthDBMUserFile, + AuthGroupFile, + AuthName, + AuthType, AuthUserFile, Require など。)。
    + +
    FileInfo
    + +
    + ドキュメントタイプを制御するためのディレクティブの使用を許可する (DefaultType, ErrorDocument, ForceType, LanguagePriority, + SetHandler, SetInputFilter, SetOutputFilter, + mod_mime の Add* と Remove* + ディレクティブなど。)。
    + +
    Indexes
    + +
    + ディレクトリインデックスを制御するためのディレクティブの使用を許可する + (AddDescription, + AddIcon, AddIconByEncoding, + AddIconByType, + DefaultIcon, DirectoryIndex, FancyIndexing, HeaderName, IndexIgnore, IndexOptions, ReadmeName + など。)。
    + +
    Limit
    + +
    + ホストへのアクセス制御を行うためのディレクティブの使用を許可する (Allow, Deny, Order).
    + +
    Options
    + +
    + 特定のディレクトリにおける機能を指定するためのディレクティブの使用を許可する + (Options と + XBitHack)。
    +
    + +

    例:

    + +

    + AllowOverride AuthConfig Indexes +

    + +

    上の例では AuthConfig と Indexes のどちらにも + 属さないディレクティブはすべて内部サーバエラーを引き起こします。

    + +

    参照

    + +
    +
    top
    +

    AuthName ディレクティブ

    + + + + + + + +
    説明:HTTP 認証の認可領域 (訳注: realm)
    構文:AuthName auth-domain
    コンテキスト:ディレクトリ, .htaccess
    上書き:AuthConfig
    ステータス:Core
    モジュール:core
    +

    このディレクティブはディレクトリに対する認可領域 (訳注: realm) + の名前を指定します。 + 認可領域は、利用者がどのユーザ名とパスワードを送信すればよいのかを + クライアントに教えるために利用します。 + AuthName は一つの引数をとり、 + スペースが含まれる場合には、 + 引用符で括らなければなりません。 + このディレクティブは + AuthType ディレクティブや + Require ディレクティブと、 + AuthUserFile や + AuthGroupFile などのディレクティブと + 一緒に利用する必要があります。

    + +

    例えば:

    + +

    + AuthName "Top Secret" +

    + +

    ここで AuthName に指定した文字列が、 + 大部分のブラウザのパスワードダイアログに表示されます。

    + +

    参照

    + +
    +
    top
    +

    AuthType ディレクティブ

    + + + + + + + +
    説明:ユーザ認証の種類
    構文:AuthType Basic|Digest
    コンテキスト:ディレクトリ, .htaccess
    上書き:AuthConfig
    ステータス:Core
    モジュール:core
    +

    このディレクティブは対象ディレクトリで利用するユーザー認証の種類を選びます。 + ただ、現在のところは Basic と Digest しか + 実装されていません。 + + このディレクティブは AuthNameディレクティブや + Require ディレクティブと、 + AuthUserFile や AuthGroupFile などのディレクティブと + 一緒に利用する必要があります。

    + +

    参照

    + +
    +
    top
    +

    CGIMapExtension ディレクティブ

    + + + + + + + + + +
    説明:CGI スクリプトのインタープリタの位置を調べるための手法
    構文:CGIMapExtension cgi-path .extension
    デフォルト:None
    コンテキスト:ディレクトリ, .htaccess
    上書き:FileInfo
    ステータス:Core
    モジュール:core
    互換性:NetWare のみ
    +

    このディレクティブは Apache が CGI スクリプトを実行するための + インタープリタを探す方法を制御します。 + 例えば、CGIMapExtension sys:\foo.nlm .foo と設定すると + .foo という拡張子のすべての CGI スクリプトは FOO インタープリタに + 渡されます。

    + +
    +
    top
    +

    ContentDigest ディレクティブ

    + + + + + + + + +
    説明:Content-MD5 HTTP 応答ヘッダの生成を有効にする
    構文:ContentDigest On|Off
    デフォルト:ContentDigest Off
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:Options
    ステータス:Core
    モジュール:core
    +

    このディレクティブは、RFC1864 及び RFC2068 において定義されている + Content-MD5 ヘッダーの生成を有効にします。

    + +

    MD5 は、任意長のデータの「メッセージダイジェスト」(「指紋」 + と表現されることもある) を計算するアルゴリズムで、 + データの変更があった場合には非常に高い信頼度でメッセージダイジェストに変更が + 反映されます。

    + +

    Content-MD5 ヘッダは、エンドツーエンドで + エンティティボディーに含まれるメッセージの完全性チェック + (Message Integrity Check - MIC)を提供します。 + このヘッダを調べることで、プロキシやクライアントは、 + 途中経路におけるエンティティボディの予期せぬ変更などを + 検出することができます。ヘッダの例:

    + +

    + Content-MD5: AuLb7Dp1rqtRtxz2m9kRpA== +

    + +

    リクエスト毎にメッセージダイジェストを計算する (値はキャッシュされません) + ことから、 + サーバパフォーマンスが低下することについて注意してください。

    + +

    Content-MD5は、core 機能により処理された + ドキュメントを送るときのみ有効であり、 + SSI ドキュメントや CGI スクリプトの出力、バイトレンジを指定した + 応答の場合にはこのヘッダは付与されません。 +

    + +
    +
    top
    +

    DefaultType ディレクティブ

    + + + + + + + + +
    説明:サーバがコンテントタイプを決定できないときに +送られる MIME コンテントタイプ
    構文:DefaultType MIME-type
    デフォルト:DefaultType text/plain
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:FileInfo
    ステータス:Core
    モジュール:core
    +

    サーバは、MIME のタイプマップからは決定できない + ドキュメントの送信を要求されることがあります。

    + +

    サーバは、ドキュメントのコンテントタイプをクライアントに通知する必要が + ありますので、このようにタイプが未知の場合は + DefaultType で指定されたタイプを利用します。 + 例:

    + +

    + DefaultType image/gif +

    + +

    これは .gif という拡張子がファイル名に含まれていない + 多くの GIF 画像が含まれているディレクトリに適しているでしょう。

    + +

    ForceType ディレクティブと + 違って、このディレクティブはデフォルトの MIME タイプを提供するだけで + あることに注意してください。ファイル名の拡張子を含め、 + メディアタイプを決定できる他の MIME タイプの定義があれば + このデフォルトは上書きされます。

    + +
    +
    top
    +

    <Directory> ディレクティブ

    + + + + + + +
    説明:指定のファイルシステムのディレクトリとサブディレクトリとのみに +適用されるディレクティブを囲む
    構文:<Directory directory-path> +... </Directory>
    コンテキスト:サーバ設定ファイル, バーチャルホスト
    ステータス:Core
    モジュール:core
    +

    指定されたディレクトリとそのサブディレクトリにのみ + ディレクティブを適用させるためには、 + <Directory> と + </Directory> を対として、ディレクティブ群を囲います。 + その中には、ディレクトリコンテキストで許可された全てのディレクティブを + 利用できます。 + directive-path は、フルパスもしくは Unix のシェル形式の + ワイルドカードを指定します。 + ? は任意の 1 文字、* は任意の文字列にマッチします。 + シェルにおける指定同様、文字の範囲を [] で指定できます。 + ワイルドカードは `/' 文字にはマッチしませんので、 + /home/user/public_html には + <Directory /*/public_html> はマッチしませんが、 + <Directory /home/*/public_html> はマッチします。 + 例:

    + +

    + <Directory /usr/local/httpd/htdocs>
    + + Options Indexes FollowSymLinks
    +
    + </Directory> +

    + +
    +

    directory-path 引数には注意してください: その引数は +Apache がファイルをアクセスするために使うファイルシステムのパスに +そのままマッチする必要があります。ある <Directory> に +適用されるディレクティブは、別のシンボリックリンクをたどったりして +同じディレクトリを違うパスでアクセスした場合には適用されません。

    +
    + +

    ~ という文字を + 付加することで拡張正規表現を利用することもできます。 + 例えば:

    + +

    + <Directory ~ "^/www/.*/[0-9]{3}"> +

    + +

    といった指定の場合、/www/ 以下にある数字 + 3 文字のディレクトリにマッチします。

    + +

    もし複数の (正規表現以外の) <Directory>セクションが + ドキュメントを含むディレクトリ (やその上位ディレクトリのどれか) とマッチしたならば、 + .htaccess ファイルのディレクティブも読み込みつつ、 + 短いパスから順に適用されます。 + 例えば、

    + +

    + <Directory />
    + + AllowOverride None
    +
    + </Directory>
    +
    + <Directory /home/>
    + + AllowOverride FileInfo
    +
    + </Directory> +

    + +

    と設定し、ドキュメント /home/web/dir/doc.html への + アクセスがあった場合には以下のように動作します:

    + +
      +
    • AllowOverride None が適用される。 + (.htaccess ファイルは無効になる)
    • + +
    • AllowOverride FileInfo が適用される + (/home ディレクトリに対して)。
    • + +
    • /home/.htaccess, /home/web/.htaccess, + /home/web/.htaccess の順にそれらのファイル中の + FileInfo ディレクティブが適用される。
    • +
    + +

    正規表現は、通常のセクションがすべて適用されるまで + 考慮されません。 + その後、全ての正規表現が設定ファイルに現れた順で試されます。 + 例えば、以下のような場合に

    + +

    + <Directory ~ abc$>
    + + # ... directives here ...
    +
    + </Directory> +

    + +

    正規表現のセクションはすべての通常の <Directory> と + .htaccess の適用が終わるまで考慮されません。 + その後で、正規表現は /home/abc/public_html/abc にマッチし、 + 対応する <Directory> が適用されます。

    + +

    Apache のデフォルトでは <Directory /> へのアクセスは + Allow from All になっていることに注意してください。 + これは、URL からマップされたどのファイルでも Apache は送るということです。 + これは以下のようにして変更することが推奨されています。

    + +

    + <Directory />
    + + Order Deny,Allow
    + Deny from All
    +
    + </Directory> +

    + +

    そしてアクセスを可能にしたいディレクトリに対して + 個別に設定すればよいでしょう。 + このあたりについては、セキュリティに関するコツを + 参照してください。

    + +

    ディレクトリセクションは httpd.conf ファイル書きます。 + <Directory> + ディレクティブは入れ子にすることができず、 + <Limit> や <LimitExcept> セクションの中にも + 記述できません。

    + + +

    参照

    + +
    +
    top
    +

    <DirectoryMatch> ディレクティブ

    + + + + + + +
    説明:正規表現にマッチするファイルシステムのディレクトリと +サブディレクトリとのみに適用されるディレクティブを囲む
    構文:<DirectoryMatch regex> +... </DirectoryMatch>
    コンテキスト:サーバ設定ファイル, バーチャルホスト
    ステータス:Core
    モジュール:core
    +

    <Directory> + ディレクティブと同様に、<DirectoryMatch> + と </DirectoryMatch> は指定されたディレクトリと + そのサブディレクトリにのみ適用されるディレクティブ群を囲います。 + しかし、このディレクティブは引数として正規表現をとります。例えば:

    + +

    + <DirectoryMatch "^/www/.*/[0-9]{3}"> +

    + +

    は /www/ 以下にある数字 3 文字のディレクトリにマッチします。

    + + +

    参照

    + +
    +
    top
    +

    DocumentRoot ディレクティブ

    + + + + + + + +
    説明:ウェブから見えるメインのドキュメントツリーになる +ディレクトリ
    構文:DocumentRoot directory-path
    デフォルト:DocumentRoot /usr/local/apache/htdocs
    コンテキスト:サーバ設定ファイル, バーチャルホスト
    ステータス:Core
    モジュール:core
    +

    このディレクティブは、httpd がファイルを提供するディレクトリを設定します。 + Alias のようなディレクティブにマッチしない場合には、 + ドキュメントの (訳注:ファイルシステム上の) パスを生成するために、 + リクエストされた URL のパス部分をドキュメントルートに付与します。 + 例:

    + +

    + DocumentRoot /usr/web +

    + +

    この場合、 + http://www.my.host.com/index.html へのアクセスがあれば + /usr/web/index.html が返されます。

    + +

    DocumentRoot は最後のスラッシュ無しで + 指定する必要があります。

    + +

    参照

    + +
    +
    top
    +

    EnableMMAP ディレクティブ

    + + + + + + + + +
    説明:配送中にファイルを読み込むためにメモリマッピングを +使うかどうか
    構文:EnableMMAP On|Off
    デフォルト:EnableMMAP On
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:FileInfo
    ステータス:Core
    モジュール:core
    +

    このディレクティブは配送中にファイルの内容を読み込む必要があるときに + httpd がメモリマッピングを使うかどうかを制御します。デフォルトでは、 + 例えば、mod_include を使って SSI ファイルを配送 + するときのように、ファイルの途中のデータをアクセスする必要があるときには + Apache は OS がサポートしていればファイルをメモリにマップします。

    + +

    + このメモリマップは性能の向上を持たらすことがあります。 + しかし、環境によっては運用上の問題を防ぐためにメモリマッピングを + 使用しないようにした方が良い場合もあります:

    + +
      +
    • マルチプロセッサシステムの中にはメモリマッピングをすると httpd の + 性能が落ちるものがあります。
    • +
    • NFS マウントされた DocumentRoot + では、httpd がメモリマップしている間にファイルが削除されたり + 短くなったりしたときに起こるセグメンテーションフォールトのために + httpd がクラッシュする可能性があります。
    • +
    + +

    これらの問題に当てはまるサーバの設定の場合は、以下のようにして + ファイルの配送時のメモリマッピングを使用不可にしてください:

    + +

    + EnableMMAP Off +

    + +

    NFS マウントされたファイルには、問題のあるファイルにのみ明示的に + この機能を使用不可にします:

    + +

    + <Directory "/path-to-nfs-files"> + + EnableMMAP Off + + </Directory> +

    + +
    +
    top
    +

    EnableSendfile ディレクティブ

    + + + + + + + + + +
    説明:ファイルのクライアントへの配送時にカーネルの sendfile サポートを +使うかどうか
    構文:EnableSendfile On|Off
    デフォルト:EnableSendfile On
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:FileInfo
    ステータス:Core
    モジュール:core
    互換性:バージョン 2.0.44 以降で使用可能
    +

    このディレクティブはクライアンにファイルの内容を送るときに + httpd がカーネルの + sendfile サポートを使うかどうかを制御します。デフォルトでは、 + 例えば静的なファイルの配送のように、リクエストの処理にファイルの + 途中のデータのアクセスを必要としないときには、Apache は OS が + サポートしていればファイルを読み込むことなく sendfile を使って + ファイルの内容を送ります。

    + +

    sendfile は read と send を別々に行なうことと、バッファの割り当てを + 回避します。しかし、プラットフォームやファイルシステムの中には + 運用上の問題を避けるためにこの機能を使用不可にした方が良い場合があります:

    + +
      +
    • プラットフォームの中にはビルドシステムが検知できなかった、壊れた + sendfile のサポートが存在するものがあります。これは特に + バイナリが別のマシンでビルドされ、壊れた sendfile のあるマシンに + 移動したときに起こります。
    • +
    • Linux では、sendfile を用いると、 + IPv6 使用時に存在する特定ネットワークカードの TCP-checksum + オフロードのバグを踏んでしまいます。
    • +
    • ネットワークマウントされた DocumentRoot + (例えば NFS や SMB) + では、カーネルは自身のキャッシュを使ってネットワークからのファイルを + 送ることができないことがあります。
    • +
    + +

    これらの問題に当てはまるサーバの設定の場合は、以下のようにして + この機能を使用不可にしてください:

    + + +

    + EnableSendfile Off +

    + +

    NFS や SMB マウントされたファイルには、問題のあるファイルにのみ明示的に + この機能を使用不可にします:

    + +

    + <Directory "/path-to-nfs-files"> + + EnableSendfile Off + + </Directory> +

    + +
    +
    top
    +

    ErrorDocument ディレクティブ

    + + + + + + + + +
    説明:エラーが発生したときにサーバがクライアントに送るもの
    構文:ErrorDocument error-code document
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:FileInfo
    ステータス:Core
    モジュール:core
    互換性:Apache 2.0 ではテキストをクウォートする構文が以前のバージョンから +変わっています。
    +

    問題やエラーが発生したときの動作として、 + Apache には以下の四つのうち一つの動作を設定することができます。

    + +
      +
    1. Apache 標準の簡単なエラーメッセージを表示
    2. + +
    3. 自分で指定したメッセージを表示
    4. + +
    5. 問題やエラーの処理をする為に、自サーバ内の + URL-path へリダイレクト
    6. + +
    7. 問題やエラーの処理をする為に、外部の URL へリダイレクト
    8. +
    + +

    最初のものがデフォルトの動作で、2 番目から 4 番目は、 + ErrorDocumentディレクティブにより、 + HTTP のレスポンスコードと、メッセージか URL を指定することで設定します。 + Apache が問題もしくはエラーに関する追加情報を提供することがあります。

    + +

    URL の場合は、ローカルの URL の指定としてスラッシュで始まる (/) パスか、 + クライアントが解釈できるフル URL を指定します。
    + もしくは、ブラウザに表示されるメッセージを指定できます。 + 例:

    + +

    + ErrorDocument 500 http://foo.example.com/cgi-bin/tester
    + ErrorDocument 404 /cgi-bin/bad_urls.pl
    + ErrorDocument 401 /subscription_info.html
    + ErrorDocument 403 "Sorry can't allow you access today" +

    + +

    加えて、特別な値 default を使って Apache に + ハードコードされている簡単なメッセージを指定することができます。 + 通常は必要ではありませんが、default を使うと + 既存の ErrorDocument ディレクティブの設定を + 継承するところで、Apache のハードコードされた簡単なメッセージに + 戻すことができます。

    + +

    + ErrorDocument 404 /cgi-bin/bad_urls.pl

    + <Directory /web/docs>
    + + ErrorDocument 404 default
    +
    + </Directory> +

    + +

    リモート URL (例えば、頭に http と付与した方法) を + ErrorDocument に指定するとき、 + たとえ文書が同じサーバにあろうとも、ドキュメントがどこにあるかを通知するために、 + Apache はリダイレクトをクライアントに送出するということに、注意してください。 + これにはいろいろと関連して起こる問題があります。 + 中でも最も重要なのは、クライアントは元々のエラーステータスコードを受け取らず、 + 代わりにリダイレクトのステータスコードを受け取るということです。 + これにより、ステータスコードを使って URL が有効であるかどうかを決定しようとする + ウェブロボットやその他クライアントを、混乱させるかもしれません。 + さらに、ErrorDocument 401 にリモートの URL を指定すると、 + クライアントは 401 というステータスコードを受け取らないため、 + パスワードをユーザーに入力要求しなければならないことがわかりません。 + 従って、ErrorDocument 401 というディレクティブを使う場合は、 + 必ずローカルな文書を参照しなければなりません。

    + +

    Microsoft Internet Explorer (MSIE) はデフォルトではサーバが生成したエラーメッセージが + 「小さすぎる」ときには無視をして自分自身の「やさしい」エラーメッセージで + 置換します。サイズのしきい値はエラーの種類によって異なりますが、 + 一般的にはエラーの文書を 512 バイトよりも多きくすると、MSIE は + サーバが生成したエラーを隠さずに表示します。詳しい情報は Microsoft + Knowledge Base の記事 Q294807 + にあります。

    + +

    2.0 より前のバージョンでは、対になっていない二重引用符を + 先頭に付けることによりメッセージであることを指定していました。

    + + +

    参照

    + +
    +
    top
    +

    ErrorLog ディレクティブ

    + + + + + + + +
    説明:サーバがエラーをログ収集する場所
    構文: ErrorLog file-path|syslog[:facility]
    デフォルト:ErrorLog logs/error_log (Unix) ErrorLog logs/error.log (Windows and OS/2)
    コンテキスト:サーバ設定ファイル, バーチャルホスト
    ステータス:Core
    モジュール:core
    +

    ErrorLog ディレクティブは、 + サーバに生じたさまざまなエラーを + 記録する為のファイルの名前を設定します。 + file-path が絶対パスでないときは、ServerRoot からの相対パスとみなされます。

    + +

    例

    + ErrorLog /var/log/httpd/error_log +

    + +

    file-path がパイプ (|) から始まる場合は、 + エラーログを処理するために実行されるコマンドが + 指定されていると解釈されます。

    + +

    例

    + ErrorLog "|/usr/local/bin/httpd_errors" +

    + +

    ファイル名の変わりに syslog と指定することによって、 + システムがサポートしていれば syslogd(8) を利用したロギングが有効になります。 + デフォルトでは、local7 ファシリティとなりますが、 + syslog:facility といった形で記述することにより、 + 通常 syslog(1) のドキュメントで説明されているファシリティの一つを使うように + することができます。

    + +

    例

    + ErrorLog syslog:user +

    + +

    セキュリティ: + ログファイルを格納するディレクトリが、サーバを起動したユーザ以外の + ユーザによって書き込める場合にセキュリティが破られる可能性があることに + 関する詳細は セキュリティに関するコツ を + 参照してください。

    +

    注

    +

    Unix 以外のプラットフォームでファイルのパスを入力するときは、 + プラットフォームがバックスラッシュの使用を許していたとしても、 + 確実にスラッシュのみが使用されるように注意してください。一般的には、 + 設定ファイル全般でスラッシュのみを使う方が良いでしょう。

    +
    + +

    参照

    + +
    +
    top
    +

    FileETag ディレクティブ

    + + + + + + + + +
    説明:ETag HTTP 応答ヘッダを作成するために使用される +ファイルの属性
    構文:FileETag component ...
    デフォルト:FileETag INode MTime Size
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:FileInfo
    ステータス:Core
    モジュール:core
    +

    + FileETag ディレクティブは + ドキュメントがファイルに基づいたものであるときに、 + ETag (エンティティタグ) 応答ヘッダフィールドを作成するときに使用する + ファイルの属性を設定します。 (ETag の値はネットワークの帯域を節約するための + キャッシュの管理で使われます。) Apache 1.3.22 以前では、ETag の値は + 常にファイルの inode, サイズ、最終修正時刻 (mtime) から作成 + されていました。FileETag ディレクティブにより、これらのどれを使うかを + 選ぶことができます。認識されるキーワードは: +

    + +
    +
    INode
    +
    ファイルの inode 番号を計算に使います
    +
    MTime
    +
    ファイルの最終修正時刻を使います
    +
    Size
    +
    ファイルの中身のバイト数を使います
    +
    All
    +
    使用可能なすべてのフィールドを使います。 + これは

    FileETag INode MTime Size

    と等価です。
    +
    None
    +
    ドキュメントがファイルに基づいたものでも、ETag フィールドを + 応答に付加しません
    +
    + +

    INode, MTime, Size キーワードには + + や - を前に付けて + 指定することもできます。この場合は、より広い範囲から継承された + デフォルトの設定に変更を加えるようになります。そのような接頭辞の + 無いキーワードを指定すると、即座に継承した設定を無効にします。

    + +

    あるディレクトリの設定に + FileETag INode MTime Size があり、 + サブディレクトリの設定に FileETag -INode があるときは、 + そのサブディレクトリの設定は (設定が上書きされなければサブディレクトリの + サブディレクトリにも継承されます) FileETag MTime Size + と同じになります。

    + +
    +
    top
    +

    <Files> ディレクティブ

    + + + + + + + +
    説明:マッチするファイル名に適用されるディレクティブを囲む
    構文:<Files filename> ... </Files>
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:All
    ステータス:Core
    モジュール:core
    +

    <Files> ディレクティブは、 + その中にあるディレクティブの適用範囲をファイル名で制限します。 + <Directory> ディレクティブや <Location> ディレクティブと + 同じような機能を持ちます。 + これは、</Files> ディレクティブと対に + なっていなければなりません。 + このセクション中のディレクティブは、ベース名 (ファイル名の最後の部分) + が指定されたファイル名にマッチするすべてのオブジェクトに適用されます。 + <Files> セクションは + <Directory> セクションと + .htaccess が読み込まれた後、 + <Location> セクションよりは先に + 設定ファイルに現れた順に適用されます。 + <Files> は、 + <Directory> セクション内に + ネストさせることができ、 + ファイルシステムの一部にのみ限定して適用させることができます。

    + +

    filename 引数は、ファイル名かワイルドカード文字列 + で、ワイルドカードでは ? は一つの文字、* は任意の文字列にマッチします。 + ~ という文字を付加することで拡張正規表現を使うこともできます。 + 例えば、

    + +

    + <Files ~ "\.(gif|jpe?g|png)$"> +

    + +

    とすることにより、一般的なインターネットの画像フォーマットにマッチします。 + ただし、 + <FilesMatch> を使う方が + 推奨されています。

    + +

    ちなみに、<Directory> と <Location> セクションとは異なり、 + <Files> + は .htaccess ファイル内で利用することができます。 + これにより、ユーザがファイル毎にアクセスの制御を行なうことができるように + なっています。

    + + +

    参照

    + +
    +
    top
    +

    <FilesMatch> ディレクティブ

    + + + + + + + +
    説明:正規表現にマッチするファイル名に適用される +ディレクティブを囲む
    構文:<FilesMatch regex> ... </FilesMatch>
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:All
    ステータス:Core
    モジュール:core
    +

    <FilesMatch> ディレクティブは、 + <Files> + ディレクティブ同様にその中にあるディレクティブの適用範囲をファイル名で制限します。ただし、 + このディレクティブには正規表現を指定します。 + 例えば:

    + +

    + <FilesMatch "\.(gif|jpe?g|png)$"> +

    + +

    は一般的なインターネットの画像形式にマッチします。

    + +

    参照

    + +
    +
    top
    +

    ForceType ディレクティブ

    + + + + + + + + +
    説明:すべてのマッチするファイルが指定の MIME コンテントタイプで +送られるようにする
    構文:ForceType MIME-type|None
    コンテキスト:ディレクトリ, .htaccess
    上書き:FileInfo
    ステータス:Core
    モジュール:core
    互換性:Apache 2.0 で core に移動
    +

    .htaccess や <Directory> セクション、 + <Location> セクション、 + <Files> セクションに + 書かれた場合、このディレクティブはそこにあるすべてのファイルが + MIME-type + で指定されたコンテントタイプとして扱われるようにします。たとえば、 + GIF ファイルばかりのディレクトリがあって、すべてのファイルを .gif + で終わらせたくはないときに、以下のものを使用します:

    + +

    + ForceType image/gif +

    + +

    DefaultType と違って + このディレクティブはメディアタイプを決めることができるかもしれない + ファイルの拡張子も含め、すべての MIME タイプの関連付けを + 上書きすることに注意してください。

    + +

    None という値を使うことで ForceType の + 設定を無効にできます:

    + +

    + # force all files to be image/gif:
    + <Location /images>
    + + ForceType image/gif
    +
    + </Location>
    +
    + # but normal mime-type associations here:
    + <Location /images/mixed>
    + + ForceType None
    +
    + </Location> +

    + +
    +
    top
    +

    HostnameLookups ディレクティブ

    + + + + + + + +
    説明:クライアントの IP アドレスの DNS ルックアップを +有効にする
    構文:HostnameLookups On|Off|Double
    デフォルト:HostnameLookups Off
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ
    ステータス:Core
    モジュール:core
    +

    このディレクティブは、ホスト名をログ収集できるように + DNS ルックアップを有効にします + (さらに、CGI/SSI に REMOTE_HOST 変数として渡します)。 + Doubleを指定した場合、2 重の逆引きを行ないます。 + つまり、逆引きの後に、その結果に対して正引きを行ないます。正引きの + 結果の IP アドレスの中にオリジナルのアドレスと一致するものがなければ + なりません。("tcpwrappers" の用語では PARANOID と呼ばれています。)

    + +

    mod_access でホスト名によるアクセス + 制御を行なう場合には、 + 設定の如何によらず 2 重の逆引きが実行されます。 + これは、セキュリティを保つために必要です。 + HostnameLookups Double を設定しない限り、 + 他の部分はこの 2 重逆引きの結果を使うことはできません。 + 例えば、HostnameLookups On と設定してある状態で、 + ホスト名によるアクセス制限を行なったオブジェクトへの + リクエストを受けたとすると、2 重の逆引きが成功するか否かによらず、 + REMOTE_HOST には通常の逆引き結果が渡されます。

    + +

    ディレクティブのデフォルトは + 本当に逆引きを必要としているわけではないサイトの + ネットワークトラフィックを低減させるために、Off になっています。 + ルックアップによる余計な遅延がなくなるため、 + エンドユーザにとっても良いでしょう。 + DNS のルックアップには、かなりの時間が必要となる場合が多く、 + 負荷の高いサイトではこのディレクティブは Off にすべきです。 + なお、/support ディレクトリに含まれ、デフォルトでは + インストールディレクトリの bin サブディレクトリに + インストールされる logresolve ユーティリティにより、 + Apache の動作とは別に、ログに残されている IP アドレスからホスト名を + ルックアップすることが可能です。

    + +
    +
    top
    +

    IdentityCheck ディレクティブ

    + + + + + + + +
    説明:リモートユーザの RFC1413 によるアイデンティティのロギングを +有効にする
    構文:IdentityCheck On|Off
    デフォルト:IdentityCheck Off
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ
    ステータス:Core
    モジュール:core
    +

    このディレクティブは、クライアントマシン上で + identd やそれに類似したデーモンが動作しているときに、 + それぞれの接続に対して RFC 1413 に準処したリモートユーザの + 名前のロギングを行なうようにします。 + この情報は、アクセスログに収集されます。

    + +

    ここで得られた情報は簡単なユーザ追跡に使う以外は、 + まったく信頼するべきではありません。

    + +

    すべてのリクエストに対してルックアップが行なわれますので、 + 深刻な遅延の問題を起こすかもしれないことに注意してください。 + (訳注: 例えばクライアント側に) ファイアウォールがあると、 + ルックアップが失敗し、各リクエストに 30 秒の遅延が加わることに + なる可能性があります。 + 従って、一般的にはインターネットからアクセス可能なパブリックなサーバで + 有益なものではありません。

    + +
    +
    top
    +

    <IfDefine> ディレクティブ

    + + + + + + + +
    説明:起動時にテストが真であるときのみに処理されるディレクティブを +囲む
    構文:<IfDefine [!]parameter-name> ... + </IfDefine>
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:All
    ステータス:Core
    モジュール:core
    +

    <IfDefine test>...</IfDefine> + セクションは、 + ディレクティブを条件付きで指定するために利用します。 + <IfDefine> セクションに + 含まれるディレクティブは、testが + 定義されているときのみ処理されます。 + もし test が定義されていなければ、 + 開始と終了の指定の間のディレクティブは無視されます。

    + +

    <IfDefine> セクションディレクティブに + 指定する test は、 + 次の二つの形式のうちの一つをとります:

    + +
      +
    • parameter-name
    • + +
    • !parameter-name
    • +
    + +

    前者の場合には、parameter-name と名付けられたパラメータが + 定義されていれば開始と終了の間のディレクティブが処理されます。 + 後者の場合は逆で、parameter-name が指定されていない + 場合に処理されます。

    + +

    parameter-name 引数は、サーバを起動する際に + httpd のコマンドラインに + -Dparameter- という形で指定すると定義されます。

    + +

    <IfDefine> セクションは + 入れ子にすることができ、複数のパラメータによるテストをするために使用できます。 + 例:

    + +

    + httpd -DReverseProxy ...
    +
    + # httpd.conf
    + <IfDefine ReverseProxy>
    + + LoadModule rewrite_module modules/mod_rewrite.so
    + LoadModule proxy_module modules/libproxy.so
    +
    + </IfDefine> +

    + +
    +
    top
    +

    <IfModule> ディレクティブ

    + + + + + + + +
    説明:モジュールの存在するかしないかに応じて処理される +ディレクティブを囲む
    構文:<IfModule [!]module-name> ... + </IfModule>
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:All
    ステータス:Core
    モジュール:core
    +

    <IfModule test>...</IfModule> + セクションは、モジュールが存在するときに処理されるディレクティブを + 指定するために利用します。 + <IfModule> セクションに + 含まれるディレクティブは、test + で指定するモジュールが組み込まれているときのみ処理されます。 + もし test が組み込まれていなければ、開始と終了の間のディレクティブ + は無視されます。

    + +

    <IfModule> セクションディレクティブに + 指定する test は、 + 次の二つの形式のうちの一つをとります。

    + +
      +
    • module name
    • + +
    • !module name
    • +
    + +

    前者の場合は、module name と名付けられたモジュールが + Apache に組み込まれていれば + (コンパイル済みのものと、LoadModule を利用して + 動的に読み込んだものの両方)、 + 開始と終了の間のディレクティブが処理されます。 + 後者の場合は逆で、module name が組み込まれていない + 場合に処理されます。

    + +

    module name 引数は、 + コンパイルをした時のモジュールのファイル名です。 + 例えば、 + mod_rewrite.c です。 + モジュールが複数のソースファイルから構成されている場合は、文字列 + STANDARD20_MODULE_STUFF があるファイルの名前を + 使ってください。

    + +

    <IfModule> セクションは + 入れ子にすることが可能であり、 + 複数のモジュールのテストを行なうために使用できます。

    + +
    特定のモジュールの存在に関わらず動作する + 設定ファイルの原本が必要なときにのみこのセクションを使用してください。 + 通常の動作では、ディレクティブを + <IfModule> セクションの中に + 入れる必要はありません。
    + +
    +
    top
    +

    Include ディレクティブ

    + + + + + + + +
    説明:サーバ設定ファイル中から他の設定ファイルを取り込む
    構文:Include file-path|directory-path
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ
    ステータス:Core
    モジュール:core
    互換性:ワイルドカードによるマッチは 2.0.41 以降で使用可能
    +

    このディレクティブにより、サーバの設定ファイルから + 他の設定ファイルをインクルードすることができます。

    + +

    複数のファイルをアルファベット順に一度に読み込むために、 + シェル形式 (fnmatch) のワイルドカード文字を使うことができます。 + さらに、Include にディレクトリを指定した場合は、 + ディレクトリとそのサブディレクトリ内の全てのファイルを + アルファベット順に読み込んで、設定ファイルとして処理します。 + しかし、ディレクトリ全体を読み込むのはお勧めできません。 + ふとしたことから httpd が読み込みに失敗するような + 一時ファイルをディレクトリに残してしまうようなことがよくあるからです。

    + +

    指定するファイルパスは絶対パスか、 + ServerRoot ディレクトリからの + 相対パスか、のどちらかです。

    + +

    例:

    + +

    + Include /usr/local/apache2/conf/ssl.conf
    + Include /usr/local/apache2/conf/vhosts/*.conf +

    + +

    ServerRoot からの相対パスの場合は:

    + +

    + Include conf/ssl.conf
    + Include conf/vhosts/*.conf +

    + +

    apachectl configtest を実行すると、設定をチェックしている時に + 読み込まれたファイルのリストが表示されます:

    + +

    + root@host# apachectl configtest
    + Processing config file: /usr/local/apache2/conf/ssl.conf
    + Processing config file: /usr/local/apache2/conf/vhosts/vhost1.conf
    + Processing config file: /usr/local/apache2/conf/vhosts/vhost2.conf
    + Syntax OK +

    + +

    参照

    + +
    +
    top
    +

    KeepAlive ディレクティブ

    + + + + + + + +
    説明:HTTP の持続的な接続を有効にする
    構文:KeepAlive On|Off
    デフォルト:KeepAlive On
    コンテキスト:サーバ設定ファイル, バーチャルホスト
    ステータス:Core
    モジュール:core
    +

    HTTP/1.0 の Keep-Alive 拡張と HTTP/1.1 の持続的接続の機能は、 + 複数のリクエストが同じ TCP の接続で送られる、長時間持続する + HTTP セッションを提供します。たくさんの画像が + 含まれる HTML ドキュメントでは場合によっては遅延時間が 50% 短縮される結果も + でています。Keep-Alive 接続を有効にするには + KeepAlive On と設定します。

    + +

    HTTP/1.0 に対応したクライアントの際には、 + クライアントより特に要求があった場合のみ Keep-Alive 接続となります。 + さらに、HTTP/1.0 クライアントでは、コンテンツの容量が先に + (訳注: 要求に対して応答を返す前に) わかる場合のみ Keep-Alive + 接続を利用できます。 + これは、CGI の出力や SSI のページ、 + サーバが生成したディレクトリのリストのような動的コンテンツを + HTTP/1.0 クライアントに送る場合には Keep-Alive 接続を使えないことを意味します。 + HTTP/1.1 に対応したクライアントの際には、 + 特に指定されない限りはデフォルトとして持続的な接続が行なわれます。 + クライアントが要求すれば、コンテンツの容量を判別できないものを + 持続的な接続を通して送るために、チャンクエンコーディングが用いられます。

    + +

    参照

    + +
    +
    top
    +

    KeepAliveTimeout ディレクティブ

    + + + + + + + +
    説明:持続的な接続で次のリクエストが来るまでサーバが待つ時間
    構文:KeepAliveTimeout seconds
    デフォルト:KeepAliveTimeout 15
    コンテキスト:サーバ設定ファイル, バーチャルホスト
    ステータス:Core
    モジュール:core
    +

    接続を閉じる前に、Apache が次のリクエストを何秒待つかを指定します。 + リクエストを受け付けた後は、Timeout ディレクティブによって + 指定されたタイムアウト値が使われます。

    + +

    KeepAliveTimeout を大きな値に設定すると、 + 負荷の高いサーバにおいてはパフォーマンスの問題を引き起こす場合があります。 + タイムアウトが長ければ長いほど、より多くのサーバプロセスが + 活発でないクライアントからの接続の終了を待ち続けることになります。

    + +
    +
    top
    +

    <Limit> ディレクティブ

    + + + + + + + +
    説明:囲いの中にあるアクセス制御の適用を特定の HTTP メソッドのみに +制限する
    構文:<Limit method [method] ... > ... + </Limit>
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:All
    ステータス:Core
    モジュール:core
    +

    アクセス制御は、通常全てのアクセスメソッドに対して + 影響し、普通はこれが望ましい挙動です。 + そうしたことから、大部分の場合にはアクセス制御に関わるディレクティブを + <Limit> セクション内に + 書くべきではありません。

    + +

    <Limit> ディレクティブの + 目的は、アクセス制御の範囲を + 指定された HTTP メソッドに限定するためです。 + それ以外のメソッドは、<Limit> で囲われたアクセス制御の + 影響を受けません。 + 以下の例は、POST, PUT, DELETE のメソッドに対してのみアクセスの制御を行ない、 + それ以外のメソッドについては制限しません:

    + +

    + <Limit POST PUT DELETE>
    + + Require valid-user
    +
    + </Limit> +

    + +

    メソッド名には以下の中から一つ以上を列挙することができます: + GET, + POST, PUT, DELETE, + CONNECT, OPTIONS, + PATCH, PROPFIND, PROPPATCH, + MKCOL, COPY, MOVE, + LOCK, UNLOCK. メソッド名は + 大文字小文字を区別します。 GET を指定した場合には + HEAD リクエストにも制限がかかります。TRACE + メソッドに制限をかけることはできません。

    + +
    アクセス制御が目的の場合は + <Limit> + セクションの代わりに <LimitExcept> セクションを使用した方が良いでしょう。 + <LimitExcept> + セクションでは不特定のメソッドに対しても防御できるからです。
    + + +
    +
    top
    +

    <LimitExcept> ディレクティブ

    + + + + + + + +
    説明:指定されたもの以外の HTTP メソッドにアクセス制御を +制限する
    構文:<LimitExcept method [method] ... > ... + </LimitExcept>
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:All
    ステータス:Core
    モジュール:core
    +

    <LimitExcept> と + </LimitExcept> は、引数に + 含まれていない + HTTP のアクセスメソッドに適用するためのアクセス制御 + ディレクティブを括るために利用します。 + つまり、<Limit> セクションの反対の動作をし、 + 標準のメソッドと標準外や未認識のメソッドの場合の両方を設定できます。 + <Limit> のドキュメントも + 併せて参照してください。

    + +

    例:

    + +

    + <LimitExcept POST GET>
    + + Require valid-user
    +
    + </LimitExcept> +

    + + +
    +
    top
    +

    LimitInternalRecursion ディレクティブ

    + + + + + + + + +
    説明:内部リダイレクトと入れ子になったサブリクエストの最大数を決定する
    構文:LimitInternalRecursion number [number]
    デフォルト:LimitInternalRecursion 10
    コンテキスト:サーバ設定ファイル, バーチャルホスト
    ステータス:Core
    モジュール:core
    互換性:Apache 2.0.47 以降で使用可能
    +

    内部リダイレクトは例えば Action ディレクティブを + 使っているときに起こります。Action ディレクティブは + 元々のリクエストを CGI スクリプトに内部リダイレクトを行ないます。 + サブリクエストはいくつかの URI に対して、リクエストされたときに + 何が起こるかを調べるための Apache の機構です。例えば、mod_dir + は DirectoryIndex ディレクティブ + がリストするファイルを調べるためにサブリクエストを使います。

    + +

    LimitInternalRecursion は内部リダイレクトや + サブリクエストが無限ループに陥ったときのサーバクラッシュを防ぎます。 + 普通、そのようなループは設定に失敗したときに発生します。

    + +

    このディレクティブは、リクエスト毎に評価される、二つの違う限界値を + 設定します。最初の number は、起こり得る + 内部リクエストの最大値を設定します。二つめの number は + サブリクエストが入れ子にできる深さを設定します。number を + 一つだけ指定したときは、両方の限界値にその値が設定されます。

    + +

    例

    + LimitInternalRecursion 5 +

    + +
    +
    top
    +

    LimitRequestBody ディレクティブ

    + + + + + + + + +
    説明:クライアントから送られる HTTP リクエストのボディの +総量を制限する
    構文:LimitRequestBody bytes
    デフォルト:LimitRequestBody 0
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:All
    ステータス:Core
    モジュール:core
    +

    このディレクティブは、リクエストボディに許されるバイト数、bytes + を 0 (無制限を意味します) から 2147483647 (2GB) までの数値で指定します。

    + +

    LimitRequestBody ディレクティブは、 + ディレクティブが書かれたコンテキスト + (サーバ全体、ディレクトリ、ファイル、ロケーション) 内で + 許容する HTTP リクエストメッセージボディのサイズに制限をかけることができます。 + クライアントのリクエストがその制限値を越えていれば、 + サーバはリクエストを処理せずにエラーを返します。 + 普通のリクエストメッセージボディのサイズは、リソースの種類や + 許可されているメソッドによって大きく変わります。 + CGI スクリプトは、よく情報を受信するために + メッセージボディを使います。 + PUT メソッドの実装は、このディレクティブの値として + 少なくともあるリソースに対してサーバが受け付けようとする + 表現の大きさほどの値を必要とします。

    + +

    このディレクティブは、 + 管理者にクライアントからの異常なリクエストを制御できるようにし、 + 何らかの形のサービス拒否攻撃 (訳注:DoS) を避けるのに有効です。

    + +

    ある場所へのファイルアップロードを許可する場合に、 + アップロードできるファイルのサイズを 100K に制限したければ、 + 以下のように指定します:

    + +

    + LimitRequestBody 102400 +

    + + +
    +
    top
    +

    LimitRequestFields ディレクティブ

    + + + + + + + +
    説明:クライアントからの HTTP リクエストのヘッダフィールドの数を +制限する
    構文:LimitRequestFields number
    デフォルト:LimitRequestFields 100
    コンテキスト:サーバ設定ファイル
    ステータス:Core
    モジュール:core
    +

    number には、0 (無制限を意味します) から 32767 + までの整数を指定します。 + デフォルト値は、定数 DEFAULT_LIMIT_REQUEST_FIELDS + によりコンパイル時に定義されます (配布時には 100 と指定されています)。

    + +

    LimitRequestBody ディレクティブは、 + サーバ管理者が HTTP リクエスト中において許可するリクエストヘッダフィールド数を + 指定します。 + サーバはこの値には通常のクライアントからのリクエストに含まれるであろう + フィールドの数より大きな値が必要とします。 + クライアントにより使われた要求ヘッダーフィールドの数が + 20 を超えることはほとんどありませんが、 + これは種々のクライアントの実装よって変わり、 + 詳細なコンテントネゴシエーションをするためのブラウザの設定までにも + 影響されることがあります。 + オプションの HTTP 拡張はリクエストヘッダフィールドを使って現される場合が + 多くあります。

    + +

    このディレクティブは、 + 管理者にクライアントからの異常なリクエストを制御できるようにし、 + 何らかの形のサービス拒否攻撃 (訳注:DoS) を避けるのに有効です。 + リクエストのフィールドが多過ぎることを意味するエラー応答が + 普通のクライアントに返されるような時はこの値を増やしてください。

    + +

    例:

    + +

    + LimitRequestFields 50 +

    + + +
    +
    top
    +

    LimitRequestFieldSize ディレクティブ

    + + + + + + + +
    説明:クライアントからの HTTP リクエストのヘッダの +サイズを制限する
    構文:LimitRequestFieldsize bytes
    デフォルト:LimitRequestFieldsize 8190
    コンテキスト:サーバ設定ファイル
    ステータス:Core
    モジュール:core
    +

    このディレクティブは、HTTP リクエストヘッダ内に含めることのできる + バイト数、bytes を + 0 からコンパイル時に定義される定数 + DEFAULT_LIMIT_REQUEST_FIELDSIZE (配布時には 8192 と指定) + で指定された値までの数字で指定します。

    + +

    LimitRequestFieldSize ディレクティブは、 + サーバのコンパイル時に指定したインプットバッファ容量以下に + HTTP リクエストヘッダの許容されるサイズを制限することができます。 + サーバは、このディレクティブの値として、 + 通常のクライアントリクエストから送られた個々のヘッダフィールドに + 十分足る大きさを必要とします。 + 普通のリクエストヘッダのサイズは、個々のクライアントにより大きく変わり、 + 詳細なコンテントネゴシエーションをするためのブラウザの設定までにも + 影響されることがあります。

    + +

    このディレクティブは、 + 管理者にクライアントからの異常なリクエストを制御できるようにし、 + 何らかの形のサービス拒否攻撃 (訳注:DoS) を避けるのに有効です。

    + +

    例:

    + +

    + LimitRequestFieldSize 4094 +

    + +
    通常はデフォルトから変更する必要はありません。
    + + +
    +
    top
    +

    LimitRequestLine ディレクティブ

    + + + + + + + +
    説明:クライアントからの HTTP リクエスト行のサイズを制限する
    構文:LimitRequestLine bytes
    デフォルト:LimitRequestLine 8190
    コンテキスト:サーバ設定ファイル
    ステータス:Core
    モジュール:core
    +

    このディレクティブは、HTTP リクエスト行内で許容されるバイト数 + bytes を 0 からコンパイル時の定数 + DEFAULT_LIMIT_REQUEST_LINE (配布時には 8190 と指定) + で指定された値までの数字で指定します。

    + +

    LimitRequestLine ディレクティブにより、サーバ管理者は + サーバのコンパイル時に指定したインプットバッファ容量以下に + クライアントからの HTTP リクエスト行のサイズの制限を行なうことができます。 + リクエスト行は、HTTPメソッド、URI、プロトコルバージョンから成っており、 + LimitRequestLine はサーバへのリクエストに対して + 許容するリクエスト URI の長さを制限することになります。 + サーバは、GET リクエストのクエリ部分も含めて、リソースの名前が入るに足る + 大きさを必要とします。

    + +

    このディレクティブは、 + 管理者にクライアントからの異常なリクエストを制御できるようにし、 + 何らかの形のサービス拒否攻撃 (訳注:DoS) を避けるのに有効です。

    + +

    例:

    + +

    + LimitRequestLine 4094 +

    + +
    通常はデフォルトから変更する必要はありません。
    + +
    +
    top
    +

    LimitXMLRequestBody ディレクティブ

    + + + + + + + + +
    説明:XML 形式のリクエストのボディのサイズを制限する
    構文:LimitXMLRequestBody bytes
    デフォルト:LimitXMLRequestBody 1000000
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:All
    ステータス:Core
    モジュール:core
    +

    XML 形式のリクエストのボディの最大値を (バイト単位で) 制限します。 + 値に 0 を指定するとチェックを無効にします。

    + +

    例:

    + +

    + LimitXMLRequestBody 0 +

    + + +
    +
    top
    +

    <Location> ディレクティブ

    + + + + + + +
    説明:囲んだディレクティブをマッチする URL のみに適用
    構文:<Location + URL-path|URL> ... </Location>
    コンテキスト:サーバ設定ファイル, バーチャルホスト
    ステータス:Core
    モジュール:core
    +

    <Location> ディレクティブは、 + URL により中に書かれたディレクティブの適用範囲を制限します。 + <Directory> + ディレクティブと似ていて、 + </Location> ディレクティブで終了する + サブセクションを開始します。 + <Location> セクションは、 + <Directory> セクションと + .htaccess の読み込みの後、 + <Files> セクションを + 適用した後に、設定ファイルに現れた順に処理されます。

    + +

    <Location> セクションは + 完全にファイルシステムと関連せずに動作します。このことから導かれる + 結果にはいつくか注意する点があります。最も重要なものは、 + ファイルシステムの位置へのアクセス制御に <Location> ディレクティブを使うべきではない + ということです。複数の URL がファイルシステムの同じ位置にマップされる + 可能がありますので、そのようなアクセス制御は回避されてしまう可能性が + あります。

    + +

    いつ <Location> を使うか

    + +

    <Location> ディレクティブは + ファイルシステム外のコンテンツにディレクティブを適用するときに + 使用してください。ファイルシステムに存在するコンテンツに対しては、 + <Directory> と <Files> を使ってください。 + 例外は、<Location /> で、これはサーバ全体に対して + 設定を適用する簡単な方法です。

    +
    + +

    全ての (プロキシ以外の) リクエストに対し、 + URL は /path/ という、 + 接頭辞 http://servername を含まない形でマッチします。 + プロキシリクエストの場合には、scheme://servername/path + という接頭辞を含む形でマッチし、接頭辞を含めて指定する必要があります。

    + +

    URL にはワイルドカードを利用することができます。 + ? は任意の一文字、* は任意の文字列にマッチします。

    + +

    ~ という文字を追加することで、拡張正規表現を + 利用することもできます。 + 例えば:

    + +

    + <Location ~ "/(extra|special)/data"> +

    + +

    は URL に /extra/data か /special/data という文字列が + 含まれている場合にマッチします。 + <LocationMatch> ディレクティブは + <Location> の正規表現 + 版とまったく同じ動作をします。

    + +

    <Location> 機能は、SetHandler ディレクティブと + 組合わせて利用すると特に便利です。 + 例えば、foo.com のブラウザからのみステータスの参照を有効にしたければ、 + 次のようにすれば良いでしょう。

    + +

    + <Location /status>
    + + SetHandler server-status
    + Order Deny,Allow
    + Deny from all
    + Allow from .foo.com
    +
    + </Location> +

    + +

    / (スラッシュ) に関する注

    +

    スラッシュ文字は、URL 内に現れる場所に応じて変化する + 特別な意味を持っています。 + ファイルシステムにおいて利用する場合には複数のスラッシュでも一つの + スラッシュとして扱われることが多いですが、 + (すなわち、/home///foo は + /home/foo と同じいったように) + URL においては必ずしもそうなるわけではありません。 + <LocationMatch> + ディレクティブや正規表現を利用した + <Location> ディレクティブで、 + 複数のスラッシュにマッチさせたいときには、、明示的に記述する + 必要があります。

    + +

    例えば、<LocationMatch ^/abc> は、 + /abc というリクエスト URL にマッチしますが、 + //abc というリクエスト URL にはマッチしません。 + (正規表現でない) <Location> + ディレクティブは、 + proxy リクエストに対して利用する際には同様の振る舞いをしますが、 + (正規表現でない) <Location> を proxy + でないリクエストに対して利用する際には、 + 一つのスラッシュで複数のスラッシュにマッチします。 + 例えば、<Location /abc/def> と指定し、 + /abc//def というリクエストがあれば、 + マッチすることになります。

    + + +

    参照

    + +
    +
    top
    +

    <LocationMatch> ディレクティブ

    + + + + + + +
    説明:囲んだディレクティブを正規表現にマッチする URL のみに +適用
    構文:<LocationMatch + regex> ... </LocationMatch>
    コンテキスト:サーバ設定ファイル, バーチャルホスト
    ステータス:Core
    モジュール:core
    +

    <LocationMatch> ディレクティブは、 + <Location> と同じ様に + URL により中に書かれたディレクティブの適用範囲を制限します。 + 但し、引数は普通の文字列ではなく、正規表現となります。例えば、

    + +

    + <LocationMatch "/(extra|special)/data"> +

    + +

    は URL に /extra/data か /special/data + という文字列が含まれている場合にマッチします。

    + +

    参照

    + +
    +
    top
    +

    LogLevel ディレクティブ

    + + + + + + + +
    説明:ErrorLog の冗長性を制御する
    構文:LogLevel level
    デフォルト:LogLevel warn
    コンテキスト:サーバ設定ファイル, バーチャルホスト
    ステータス:Core
    モジュール:core
    +

    LogLevel は、エラーログ (ErrorLog ディレクティブを + 見てください) へ記録するメッセージの冗長性を調整します。 + 以下の level を指定でき、順に重要度が下がっていきます。

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    レベル 説明 例
    emerg 緊急 - システムが利用できないChild cannot open lock file. Exiting + (子プロセスがロックファイルを開けないため終了した)
    alert 直ちに対処が必要getpwuid: couldn't determine user name from uid + (getpwuid: UID からユーザ名を特定できなかった)
    crit 致命的な状態socket: Failed to get a socket, exiting child + (socket: ソケットが得られないため、子プロセスを終了させた)
    error エラーPremature end of script headers + (スクリプトのヘッダが足りないままで終わった)
    warn 警告child process 1234 did not exit, sending another SIGHUP + (子プロセス 1234 が終了しなかった。もう一度 SIGHUP を送る)
    notice 普通だが、重要な情報httpd: caught SIGBUS, attempting to dump core in ... + (httpd: SIGBUS シグナルを受け、... へコアダンプをした)
    info 追加情報"Server seems busy, (you may need to increase + StartServers, or Min/MaxSpareServers)..." (「サーバは負荷が高い、 + (StartServers や Min/MaxSpareServers の値を増やす必要があるかも)」)
    debug デバッグメッセージ"Opening config file ..." (設定ファイルを開いている...)
    + +

    特定のレベルが指定された場合、それより高いレベルの全てのメッセージが + 報告されます。 + 例えば、LogLevel info に指定すると、 + notice と warn も報告されます。

    + +

    なお crit 以上のレベルを指定することが推奨されます。

    + +

    例:

    + +

    + LogLevel notice +

    + +

    注

    +

    ファイルにログを出力する場合、notice + レベルのメッセージは抑制されず、すべてログに出力されます。 + しかし syslog を使用している場合は、 + これは当てはまりません。

    +
    + +
    +
    top
    +

    MaxKeepAliveRequests ディレクティブ

    + + + + + + + +
    説明:持続的な接続上で許可されるリクエストの数
    構文:MaxKeepAliveRequests number
    デフォルト:MaxKeepAliveRequests 100
    コンテキスト:サーバ設定ファイル, バーチャルホスト
    ステータス:Core
    モジュール:core
    +

    MaxKeepAliveRequests ディレクティブは、 + KeepAlive が有効な場合に、 + 一回の接続で受け付け可能なリクエストの数を制限します。 + 0 に設定していれば、受け付けるリクエストは無制限になります。 + この設定は、サーバ性能を向上させるために、大きな数値を指定すること勧めます。 +

    + +

    例:

    + +

    + MaxKeepAliveRequests 500 +

    + +
    +
    top
    +

    NameVirtualHost ディレクティブ

    + + + + + + +
    説明:名前ベースのバーチャルホストのための IP アドレスを指定
    構文:NameVirtualHost addr[:port]
    コンテキスト:サーバ設定ファイル
    ステータス:Core
    モジュール:core
    +

    NameVirtualHost ディレクティブは、 + 名前ベースのバーチャルホストの設定を行ないたい場合に + 必要となるものです。

    + +

    addr にはホスト名を指定できますが、 + 常に IP アドレスを指定するのが推奨されます。 + 例えば、

    + +

    + NameVirtualHost 111.22.33.44 +

    + +

    NameVirtualHost ディレクティブは、 + 名前ベースのバーチャルホストを + 利用してリクエストを受け付ける IP アドレスを指定します。 + これは、普通は名前ベースのバーチャルホストアドレスです。 + ただし、ファイアーウォールや他のプロキシがリクエストを受け付け、 + 違う IP アドレスのサーバにフォワードするという場合は、 + リクエストを提供したいマシン上の物理インターフェースの + IP アドレスを指定する必要があります。 + 複数のアドレスで複数の名前ベースのバーチャルホストを指定する場合は + 各アドレスに対してディレクティブを書いてください。

    + +

    中

    +

    「主サーバ」や、どの _default_ サーバも、 + NameVirtualHost で指定した IP アドレスへのリクエスト + を処理することはありません (なぜか + NameVirtualHost を + 指定したけどそのアドレスに VirtualHost を定義しなかった場合を除く)。

    +
    + +

    名前ベースのバーチャルホストにポート番号を指定することも可能です。 + 例えば

    + +

    + NameVirtualHost 111.22.33.44:8080 +

    + +

    IPV6 のアドレスは次の例のように角括弧で囲む必要があります:

    + +

    + NameVirtualHost [2001:db8::a00:20ff:fea7:ccea]:8080 +

    + +

    すべてのインタフェースへのリクエストを受け取るようにするためには、 + 引数として * を使います。

    + +

    + NameVirtualHost * +

    + +

    <VirtualHost> ディレクティブの引数

    +

    <VirtualHost> ディレクティブの引数は NameVirtualHost ディレクティブの引数に正確に + 合っている必要があることに注意してください。

    + +

    + NameVirtualHost 1.2.3.4
    + <VirtualHost 1.2.3.4>
    + # ...
    + </VirtualHost>
    +

    +
    + + +

    参照

    + +
    +
    top
    +

    Options ディレクティブ

    + + + + + + + + +
    説明:ディレクトリに対して使用可能な機能を設定する
    構文:Options + [+|-]option [[+|-]option] ...
    デフォルト:Options All
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:Options
    ステータス:Core
    モジュール:core
    +

    Options ディレクティブは、特定のディレクトリに対して + どの機能が使用可能かを制御します。

    + +

    option を Noneに指定すると、 + 特別な機能は全て無効になります。 + また、以下の示す 1 個以上のものを指定できます。

    + +
    +
    All
    + +
    MultiViews を除いた全ての機能が有効となります。 + これがデフォルトです。
    + +
    ExecCGI
    + +
    + mod_cgi による CGI スクリプトの実行を許可します。
    + +
    FollowSymLinks
    + +
    + サーバが、このディレクトリ内でシンボリックリンクをたどれるようにします。 +

    サーバがシンボリックリンクをたどる場合でも、 + <Directory> セクションに + マッチさせるための + パス名は変更されません。

    +

    <Location> 内に + このオプションを指定しても無視されることに + 注意してください。

    + +
    Includes
    + +
    + mod_include が提供する SSI を有効にします。
    + +
    IncludesNOEXEC
    + +
    + SSI は有効になりますが、#exec コマンド と #exec CGI は無効になります。 + ただし、#include virtual により、ScriptAlias されたディレクトリで + CGI を実行することは可能です。
    + +
    Indexes
    + +
    + もし、URL がディレクトリにマップするリクエストであって、 + 且つ DirectoryIndex で指定したファイル (例えば、index.html) が + ディレクトリ内に無ければ、mod_autoindex が + ディレクトリ内の一覧を整形して返します。
    + +
    MultiViews
    + +
    + mod_negotiation による + コンテントネゴシエーション + された "MultiViews" を許可します。
    + +
    SymLinksIfOwnerMatch
    + +
    + シンボリック先のファイルまたはディレクトリが、 + シンボリックリンクの所有ユーザ ID と同じ場合にのみシンボリックリンクを + たどれるようにします。 + +

    注

    <Location> 内にこのオプションを + 指定しても無視されます。
    +
    +
    + +

    通常、ディレクトリに対して複数の Options が + 適用可能な場合、 + 最も近いもの一つのみが適用され、他のものは無視されます。 + 複数の指定がマージされるわけではありません。(セクションのマージ方法を参照してください。) + しかし、すべての Options ディレクティブが + や - 付きで + 指定された場合はオプションの値はマージされます。 + + を頭につければ現在の設定に加えられ、 + - を付ければ現在の設定から削除されます。

    + +

    例えば、+ や - を利用しない場合は:

    + +

    + <Directory /web/docs>
    + + Options Indexes FollowSymLinks
    +
    + </Directory>
    +
    + <Directory /web/docs/spec>
    + + Options Includes
    +
    + </Directory> +

    + +

    /web/docs/spec というディレクトリには、 + Includes だけが適用されます。 + しかし、2 番目の Options で + や - を利用してみると:

    + +

    + <Directory /web/docs>
    + + Options Indexes FollowSymLinks
    +
    + </Directory>
    +
    + <Directory /web/docs/spec>
    + + Options +Includes -Indexes
    +
    + </Directory> +

    + +

    /web/docs/spec というディレクトリには、 FollowSymLinks と + Includes が適用されます。

    + +

    注

    +

    -IncludesNOEXEC もしくは + -Includes を指定すると、 + 前の設定がどのようになっていようとも SSI は無効となります。

    +
    + +

    どのような設定もされていなければ、デフォルトでは All に + なります。

    + +
    +
    top
    +

    Require ディレクティブ

    + + + + + + + +
    説明:どの認証済みユーザがリソースをアクセスできるかを選択する
    構文:Require entity-name [entity-name] ...
    コンテキスト:ディレクトリ, .htaccess
    上書き:AuthConfig
    ステータス:Core
    モジュール:core
    +

    このディレクティブは、どの認証済みのユーザがディレクトリに + アクセスすることができるかを指定します。 + 以下のような構文になります。

    + +
    +
    Require user userid [userid] ...
    + +
    指定されたユーザのみ、ディレクトリへのアクセスを許可します。
    + +
    Require group group-name [group-name] ...
    + +
    指定されたグループに属するユーザのみ、ディレクトリへのアクセスを許可します。
    + +
    Require valid-user
    + +
    全ての認証されたユーザに、ディレクトリへのアクセスを許可します。
    +
    + +

    Require は、正しく動作するためには AuthName 及び AuthType ディレクティブや、 + (ユーザとグループを指定するために) AuthUserFile 及び AuthGroupFile + といったディレクティブと共に + 指定する必要があります。 + 例えば:

    + +

    + AuthType Basic
    + AuthName "Restricted Directory"
    + AuthUserFile /web/users
    + AuthGroupFile /web/groups
    + Require group admin +

    + +

    このようにして適用されたアクセス制御は、全てのメソッドに + 対して行なわれます。 + 通常は、これが望ましい動作です。 + もし、特定のメソッドに対してのみアクセスの制御を適用し、 + 他のメソッドは制限しない場合には、<Limit> セクション内に + Require を + 指定してください。

    + + +

    参照

    + +
    +
    top
    +

    RLimitCPU ディレクティブ

    + + + + + + + + +
    説明:Apache の子プロセスから起動されたプロセスの CPU 消費量を +制限する
    構文:RLimitCPU seconds|max [seconds|max]
    デフォルト:未設定。オペレーティングシステムのデフォルトを使用
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:All
    ステータス:Core
    モジュール:core
    +

    一つか二つのパラメータをとります。 + 最初のパラメータは全プロセスに対するリソースのソフトリミットを設定し、 + 2 番目のパラメータは最大のリソースリミットを設定します。 + パラメータには数字か、オペレーティングシステムの最大となる + max のどちらかを指定することができます。 + 最大のリソースリミットを上げるためには、サーバを + root で実行するか起動されなければいけません。

    + +

    ちなみに、この設定は Apache の子プロセス自体ではなく、 + リクエストを受け付けた Apache の子プロセスから fork されたプロセスに + 適用されます。 + これには CGI や SSI から実行されたコマンドが含まれますが、Apache の + 親プロセスから fork されたログのパイププロセスなどには適用されません。

    + +

    CPU リソースのリミットはプロセスあたりの秒数で表わされます。

    + + +

    参照

    + +
    +
    top
    +

    RLimitMEM ディレクティブ

    + + + + + + + + +
    説明:Apache の子プロセスから起動されたプロセスのメモリ消費量を +制限する
    構文:RLimitMEM bytes|max [bytes|max]
    デフォルト:未設定。オペレーティングシステムのデフォルトを使用
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:All
    ステータス:Core
    モジュール:core
    +

    一つか二つのパラメータををとります。 + 最初のパラメータは全プロセスに対するリソースのソフトリミットを設定し、 + 2 番目のパラメータは最大のリソースリミットを設定します。 + パラメータには数字か、オペレーティングシステムの最大となる + max のどちらかを指定することができます。 + 最大のリソースリミットを上げるためには、サーバを + root で実行するか起動されなければいけません。

    + +

    この設定は Apache の子プロセス自体ではなく、 + リクエストを受け付けた Apache の子プロセスから fork されたプロセスに + 適用されます。 + これには CGI や SSI から実行されたコマンドが含まれますが、Apache の + 親プロセスから fork されたログのパイププロセスなどには適用されません。

    + +

    メモリリソースのリミットはプロセスあたりのバイト数で表わされます。

    + +

    参照

    + +
    +
    top
    +

    RLimitNPROC ディレクティブ

    + + + + + + + + +
    説明:Apache の子プロセスから起動されたプロセスが起動するプロセスの +数を制限する
    構文:RLimitNPROC number|max [number|max]
    デフォルト:未設定。オペレーティングシステムのデフォルトを使用
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:All
    ステータス:Core
    モジュール:core
    +

    一つか二つのパラメータをとります。 + 最初のパラメータは全プロセスに対するリソースのソフトリミットを設定し、 + 2 番目のパラメータは最大のリソースリミットを設定します。 + パラメータには数字か、オペレーティングシステムの最大となる + max のどちらかを指定することができます。 + 最大のリソースリミットを上げるためには、サーバを + root で実行するか起動されなければいけません。

    + +

    この設定は Apache の子プロセス自体ではなく、 + リクエストを受け付けた Apache の子プロセスから fork されたプロセスに + 適用されます。 + これには CGI や SSI から実行されたコマンドが含まれますが、Apache の + 親プロセスから fork されたログのパイププロセスなどには適用されません。

    + +

    プロセスの制限は、ユーザあたりのプロセス数で制御されます。

    + +

    注

    +

    CGI プロセスがウェブサーバのユーザ ID 以外で実行されるので + 無ければ、 + このディレクティブは、サーバ自身が生成できるプロセスの数を制限することになります。 + そのような状況になっているかどうかは、error_log 中の + cannot fork というメッセージにより + 確認することができます。

    +
    + +

    参照

    + +
    +
    top
    +

    Satisfy ディレクティブ

    + + + + + + + + + +
    説明:ホストレベルのアクセス制御とユーザ認証との相互作用を指定
    構文:Satisfy Any|All
    デフォルト:Satisfy All
    コンテキスト:ディレクトリ, .htaccess
    上書き:AuthConfig
    ステータス:Core
    モジュール:core
    互換性:バージョン 2.0.51 以降では <Limit> ディレクティブと <LimitExcept> ディレクティブの影響を受ける +
    +

    Allow と + Require の両方が使われているときの + アクセスポリシーを設定します。パラメータは All か Any + です。このディレクティブはある場所へのアクセスがユーザ名/パスワード + とクライアントのホストのアドレスで制限されているときにのみ + 役立ちます。デフォルトの動作 (All) はクライアントがアドレスによる + アクセス制限を満たし、かつ正しいユーザ名とパスワードを入力することを + 要求します。Any では、クライアントはホストの制限を満たすか、 + 正しいユーザ名とパスワードの入力をするかをすればアクセスを許可されます。 + これは、ある場所をパスワードで保護するけれど、特定のアドレスからの + クライアントにはパスワードの入力を要求せずにアクセスを許可する、 + というようなときに使用できます。

    + +

    例えば、同じネットワーク上にいる人にはウェブサイトのある部分について + 無制限のアクセスを許したいけれど、外のネットワークの人には + パスワードを提供させるようにするためには、次のような設定をすることが + できます:

    + +

    + Require valid-user
    + Allow from 192.168.1
    + Satisfy Any +

    + +

    バージョン 2.0.51 からは + <Limit> セクションと + <LimitExcept> セクションを使用することで + Satisfy ディレクティブが + 適用されるメソッドを制限することが + できるようになりました。

    + +

    参照

    + +
    +
    top
    +

    ScriptInterpreterSource ディレクティブ

    + + + + + + + + + +
    説明:CGI スクリプトのインタープリタの位置を調べるための手法
    構文:ScriptInterpreterSource Registry|Registry-Strict|Script
    デフォルト:ScriptInterpreterSource Script
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:FileInfo
    ステータス:Core
    モジュール:core
    互換性:Win32 のみ。 +オプション Registry-Strict は Apache 2.0 以降で使用可能
    +

    このディレクティブは、Apache で CGI スクリプトを + 実行する場合に利用するインタープリタを、 + どのように探し出すかについて制御するために使用します。 + デフォルトの設定は Script です。これはスクリプトの + shebang 行 (最初の行で #! から始まるもの) + に指されているインタープリタを使用します。Win32 ではその行は + 以下の様になります。

    + +

    + #!C:/Perl/bin/perl.exe +

    + +

    もしくは、perl が PATH にある場合は単に:

    + +

    + #!perl +

    + +

    ScriptInterpreterSource Registry を指定すると、 + スクリプトファイルの拡張子 (例えば、.pl) を + キーとして、Windows のレジストリツリー HKEY_CLASSES_ROOT + を検索するようになります。レジストリのサブキー + Shell\ExecCGI\Command か、それが存在しない場合は + Shell\Open\Command がスクリプトファイルを開くために + 使われます。レジストリキーが見つからないときは、Apache は Script + オプションが指定されたときの動作に戻ります。

    + +

    セキュリティ

    +

    ScriptInterpreterSource Registry を ScriptAlias されたディレクトリで使うときは + 注意してください。Apache はそのディレクトリ中のすべてのファイルを + 実行しようとします。Registry という設定は通常は実行されない + ファイルに対して望ましくないプログラムの実行が発生する可能性があります。 + 例えば、ほとんどの Windows システムで、 + .htm ファイルのデフォルトの「開く」コマンドは + Microsoft Internet Explorer を実行しますので、スクリプトに指定された + ディレクトリにある .htm ファイルへのリクエストはサーバの + バックグラウンドでブラウザを実行することになります。これは、一分内くらいで + システムをクラッシュさるための良い方法です。

    +
    + +

    Apache 2.0 から導入されたオプション Registry-Strict は + Registry と同じことを行ないますが、サブキー + Shell\ExecCGI\Command のみを使います。 + ExecCGI キーは普通に使われるキーではありません。Windows + レジストリに手動で設定する必要がありますので、システムでの偶発的なプログラムの + 実行を防ぐことができます。

    + +
    +
    top
    +

    ServerAdmin ディレクティブ

    + + + + + + +
    説明:サーバがクライアントに送るエラーメッセージに含める電子メールの +アドレス
    構文:ServerAdmin email-address
    コンテキスト:サーバ設定ファイル, バーチャルホスト
    ステータス:Core
    モジュール:core
    +

    ServerAdmin は、クライアントに返すさまざまな + エラーメッセージ中に記述する、 + 電子メールアドレスを設定します。

    + +

    その際、これのために専用のアドレスを設定するのが良いでしょう。 + 例えば、

    + +

    + ServerAdmin www-admin@foo.example.com +

    + +

    といったようにします。ユーザはいつもサーバに関する話であるということを + 明記してくるわけではありませんので。

    + + +
    +
    top
    +

    ServerAlias ディレクティブ

    + + + + + + +
    説明:リクエストを名前ベースのバーチャルホストにマッチさせているときに +使用されるホストの別名
    構文:ServerAlias hostname [hostname] ...
    コンテキスト:バーチャルホスト
    ステータス:Core
    モジュール:core
    +

    ServerAlias ディレクティブは、ネームベースのバーチャルホストにおいて + 使用するホストの別名を指定します。

    + +

    + <VirtualHost *>
    + ServerName server.domain.com
    + ServerAlias server server2.domain.com server2
    + # ...
    + </VirtualHost> +

    + +

    参照

    + +
    +
    top
    +

    ServerName ディレクティブ

    + + + + + + + +
    説明:サーバが自分自身を示すときに使うホスト名とポート
    構文:ServerName fully-qualified-domain-name[:port]
    コンテキスト:サーバ設定ファイル, バーチャルホスト
    ステータス:Core
    モジュール:core
    互換性:このディレクティブはバージョン 2.0 ではバージョン 1.3 の + Port ディレクティブの機能も含みます。
    +

    ServerName ディレクティブは、 + サーバが自分自身を示すホスト名とポートを設定します。 + これは、リダイレクトする URL を生成する際に利用されます。 + 例えば、ウェブサーバを動かしているマシンは simple.example.com + で、DNS のエイリアス www.example.com もあるときに、 + ウェブサーバが後者として認識されて欲しいときは、以下のようにディレクティブを + 使います。

    + +

    + ServerName www.example.com:80 +

    + +

    ServerName が指定されていないときは、 + サーバは IP アドレスから逆引きを行なうことでホスト名を知ろうとします。 + ServerName にポートが指定されていないときは、 + サーバはリクエストが来ている + ポートを使います。最高の信頼性と確実性をもたらすためには、 + ServerName を使ってホスト名とポートを明示的に + 指定してください。

    + +

    名前ベースのバーチャルホスト + を利用している場合、<VirtualHost> セクション内の + ServerName はこのバーチャルホストにマッチするために + 何がリクエストの Host: ヘッダに現れる必要があるのかを指定します。

    + +

    自己参照 URL (例えば mod_dir モジュールによるものなど) + が指定されたポートを使うか、クライアントのリクエストのポート番号を使うかを + 決定する設定は UseCanonicalName + ディレクティブを参照してください。

    + +

    参照

    + +
    +
    top
    +

    ServerPath ディレクティブ

    + + + + + + +
    説明:非互換のブラウザが名前ベースのバーチャルホストにアクセスしたときの +ための互換用 URL パス名
    構文:ServerPath URL-path
    コンテキスト:バーチャルホスト
    ステータス:Core
    モジュール:core
    +

    ServerPath ディレクティブは、ネームベースのバーチャルホストにおいて利用する + 互換用 URL パス名を設定します。

    + +

    参照

    + +
    +
    top
    +

    ServerRoot ディレクティブ

    + + + + + + + +
    説明:インストールされたサーバのベースディレクトリ
    構文:ServerRoot directory-path
    デフォルト:ServerRoot /usr/local/apache
    コンテキスト:サーバ設定ファイル
    ステータス:Core
    モジュール:core
    +

    ServerRoot ディレクティブは、 + サーバが存在するディレクトリを設定します。 + 通常、conf/ や logs/ といったサブディレクトリが + 存在します。 + また、他の設定ファイルにおける相対パスは、このディレクトリからとなります。

    + +

    例

    + ServerRoot /home/httpd +

    + + + +

    参照

    + +
    +
    top
    +

    ServerSignature ディレクティブ

    + + + + + + + + +
    説明:サーバが生成するドキュメントのフッタを設定
    構文:ServerSignature On|Off|EMail
    デフォルト:ServerSignature Off
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:All
    ステータス:Core
    モジュール:core
    +

    ServerSignature ディレクティブは、 + サーバが生成するドキュメント + (エラーメッセージ、mod_proxy における FTP のディレクトリリスト、 + mod_info の出力、等々) + の最下行に付与するフッタの設定を行ないます。 + そのようなフッタ行を有効にしたい理由には、 + プロキシが複数連なっている場合に、ユーザはどのサーバが返した + エラーメッセージかを知る手段がほとんど無いというものがあります。

    + + +

    デフォルトである Off に設定をすると、フッタ行が抑制されます + (そして、Apache-1.2 以前と互換の動作をします)。 + On に設定した場合は、単にドキュメントの中に、サーバのバージョン、 + 稼動中のバーチャルホストの ServerName の書かれた行を追加し、 + EMail にした場合はさらに参照されたドキュメントに対する ServerAdmin を指す "mailto:" が追加されます。

    + +

    バージョン 2.0.44 以降ではこのディレクティブは ServerSignature + ディレクティブにより表示される情報も制御します。

    + +

    参照

    + +
    +
    top
    +

    ServerTokens ディレクティブ

    + + + + + + + +
    説明:Server HTTP 応答ヘッダを設定する
    構文:ServerTokens Major|Minor|Min[imal]|Prod[uctOnly]|OS|Full
    デフォルト:ServerTokens Full
    コンテキスト:サーバ設定ファイル
    ステータス:Core
    モジュール:core
    +

    このディレクティブは、クライアントに送り返す Server + 応答ヘッダ内に、サーバの一般的な OS 種別や、 + コンパイルされて組み込まれているモジュールの情報を + 含めるかどうかを指定します。

    + +
    +
    ServerTokens Prod[uctOnly]
    + +
    サーバは (例えば): Server: + Apache といったように送ります。
    + +
    ServerTokens Major
    + +
    Server sends (e.g.): Server: + Apache/2
    + +
    ServerTokens Minor
    + +
    Server sends (e.g.): Server: + Apache/2.0
    + +
    ServerTokens Min[imal]
    + +
    サーバは (例えば): Server: + Apache/2.0.41 といったように送ります。
    + +
    ServerTokens OS
    + +
    サーバは (例えば): Server: Apache/2.0.41 + (Unix) といったように送ります。
    + +
    ServerTokens Full (もしくは未指定)
    + +
    サーバは (例えば): Server: Apache/2.0.41 + (Unix) PHP/4.2.2 MyMod/1.2 といったように送ります。
    +
    + +

    この設定はサーバ全体に適用され、バーチャルホスト上で有効にしたり + 無効にしたりはできません。

    + +

    バージョン 2.0.44 以降ではこのディレクティブは ServerSignature + ディレクティブにより表示される情報も制御します。

    + +

    参照

    + +
    +
    top
    +

    SetHandler ディレクティブ

    + + + + + + + + +
    説明:マッチするファイルがハンドラで処理されるようにする
    構文:SetHandler handler-name|None
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:FileInfo
    ステータス:Core
    モジュール:core
    互換性:Apache 2.0 で core に移動
    +

    .htaccess や <Directory> + セクション、<Location> + セクションに書かれた場合、 + このディレクティブはそこにあるすべてのファイルが + handler-name で指定されたハンドラで扱われることを強制します。例えば、拡張子に関わらず、 + ディレクトリ全体がイメージマップファイルとして解析して欲しい場合には、 + 以下をそのディレクトリの .htaccess + ファイルに記述します:

    + +

    + SetHandler imap-file +

    + +

    別の例: URL http://servername/status + が指定されたときにサーバが状態報告をするようにしたいときは、以下を + httpd.conf に記述します:

    + +

    + <Location /status>
    + + SetHandler server-status
    +
    + </Location> +

    + +

    None という値を設定することで、 + 前の方の SetHandler で定義された設定を無効にすることが + できます。

    + + +

    参照

    + +
    +
    top
    +

    SetInputFilter ディレクティブ

    + + + + + + + +
    説明:クライアントのリクエストや POST の入力を処理するフィルタを設定する
    構文:SetInputFilter filter[;filter...]
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:FileInfo
    ステータス:Core
    モジュール:core
    +

    SetInputFilter ディレクティブはクライアントの + リクエストや POST の入力をサーバが受け取ったときに処理するフィルタを + 設定します。これは AddInputFilter + ディレクティブを含め、他の場所で定義されているフィルタの設定に + 追加されます。

    + +

    複数のフィルタを指定するときは、データを処理する順番に + セミコロンで区切る必要があります。

    + + +

    参照

    + +
    +
    top
    +

    SetOutputFilter ディレクティブ

    + + + + + + + +
    説明:サーバの応答を処理するフィルタを設定する
    構文:SetOutputFilter filter[;filter...]
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:FileInfo
    ステータス:Core
    モジュール:core
    +

    SetOutputFilter ディレクティブは + サーバの応答をクライアントに送り返される前に処理するフィルタを設定します。 + これは AddOutputFilter + ディレクティブを含め、他の場所で定義されているフィルタの設定に + 追加されます。

    + +

    例えば、以下の設定は /www/data/ ディレクトリのすべての + ファイルを SSI で処理します。

    + +

    + <Directory /www/data/>
    + + SetOutputFilter INCLUDES
    +
    + </Directory> +

    + +

    複数のフィルタを指定するときは、データを処理する順番に + セミコロンで区切る必要があります。

    + +

    参照

    + +
    +
    top
    +

    TimeOut ディレクティブ

    + + + + + + + +
    説明:各イベントについて、リクエストを失敗させるまでにサーバが +待つ時間を設定
    構文:TimeOut seconds
    デフォルト:TimeOut 300
    コンテキスト:サーバ設定ファイル
    ステータス:Core
    モジュール:core
    +

    TimeOut ディレクティブは、現在のところ + 以下の三つの待ち時間についての定義を行います:

    + +
      +
    1. GET リクエストを受け取るのにかかる総時間
    2. + +
    3. POST や PUTリクエストにおいて、次の TCP パケットが届くまでの待ち時間
    4. + +
    5. レスポンスを返す際、TCP の ACK が帰ってくるまでの時間
    6. +
    + +

    将来には別々の設定をすることが可能にできるよう考慮中です。 + Apache 1.2 以前はタイマーは 1200 がデフォルトでしたが、 + 300 に下げられました。300 でもほとんどの場合は十分すぎる値です。 + コード中の変な場所にまだパケットを送る際にタイマをリセットしない + 場所があるかもしれないので、デフォルトをより小さい値にはしていません。

    + + +
    +
    top
    +

    UseCanonicalName ディレクティブ

    + + + + + + + +
    説明:サーバが自分自身の名前とポートを決定する方法を設定する
    構文:UseCanonicalName On|Off|Dns
    デフォルト:UseCanonicalName On
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ
    ステータス:Core
    モジュール:core
    +

    多くの状況で Apache は自己参照 URL、すなわち + 同じサーバを指す URL、を作成する必要があります。 + UseCanonicalName On を使うと (1.3 より前の + すべてのバージョンでも) Apache は ServerName ディレクティブと Port + ディレクティブを使ってサーバの正式な名前を作成します。 + この名前がすべての自己参照 URL で使われ、CGI の SERVER_NAME + と SERVER_PORT にも使われます。

    + +

    UseCanonicalName Off では Apache は + クライアントがホスト名とポートを提供した場合には自己参照 URL を + それらを元に作成します (提供されていない場合は上で定義されているように + 正式な名前を使います)。 + これらの値は名前ベースの + バーチャルホストを実装するのに使われているのと同じ値で、 + 同じクライアントから取得できる値です。CGI 変数 SERVER_NAME + と SERVER_PORT もクライアントから与えられた値から + 作成されます。

    + +

    これが有用な場合の例は、イントラネットのサーバで、www の + ような短い名前でユーザがマシンに接続しているときです。 + ユーザが短い名前を入力して、URL が最後のスラッシュ無しのディレクトリ + へのものであるときに、Apache はリクエストを + http://www.domain.com/splat/ へリダイレクトすることに + 気付くでしょう。認証をするように設定していると、この場合 + ユーザは 2 回認証をしなければならなくなります (www に + 対して 1 回、www.domain.com に対してもう一回 -- + より詳しい情報は この話題の + FAQ を参照してください)。 + しかし、UseCanonicalName が Off になっていると、 + Apache は htttp://www/splat/ にリダイレクトします。

    + +

    三つ目のオプション UseCanonicalName DNS は、 + Host: ヘッダを提供しない古いクライアントをサポートした + 大規模な IP ベースのバーチャルホスティングで使用されることを + 意図しています。このオプションでは、Apache はクライアントが + 接続した IP アドレスに DNS の逆引きを行なって自己参照 URL を + 作成します。

    + +

    警告

    +

    CGI が SERVER_NAME に + 関する仮定を行なっているときは、このオプションの設定で動作しなく + なるかもしれません。クライアントは実質的にはホスト名にとして + 何でも望みの値を指定することができます。CGI が + SERVER_NAME のみを使って自己参照 URL を作成している + 場合はどの設定を行なっても大丈夫なはずです。

    + +

    参照

    + +
    +
    top
    +

    <VirtualHost> ディレクティブ

    + + + + + + +
    説明:特定のホスト名や IP アドレスのみに適用されるディレクティブを +囲む
    構文:<VirtualHost + addr[:port] [addr[:port]] + ...> ... </VirtualHost>
    コンテキスト:サーバ設定ファイル
    ステータス:Core
    モジュール:core
    +

    <VirtualHost> 及び + </VirtualHost> は、 + 特定のバーチャルホストに対してのみ適用されるディレクティブ群を括る + ために使われます。 + バーチャルホストコンテキストで許可される全てのディレクティブを指定可能です。 + サーバが、指定されたバーチャルホストにあるドキュメントへの + リクエストを受け付けた場合、 + <VirtualHost> セクションの中にある + ディレクティブが適用されます。 + Addrは、次のものが利用できます:

    + +
      +
    • バーチャルホストの IP アドレス
    • + +
    • バーチャルホストの IP に対応する完全なドメイン名
    • + +
    • NameVirtualHost * と共に使われる、 + すべての IP アドレスにマッチする文字 *
    • + +
    • IP ベースのバーチャルホストで他のものにマッチしない IP アドレス + のための文字列 _default_
    • +
    + +

    例

    + <VirtualHost 10.1.2.3>
    + + ServerAdmin webmaster@host.foo.com
    + DocumentRoot /www/docs/host.foo.com
    + ServerName host.foo.com
    + ErrorLog logs/host.foo.com-error_log
    + TransferLog logs/host.foo.com-access_log
    +
    + </VirtualHost> +

    + +

    IPv6 アドレスはオプションのポート番号の指定と区別するために、 + 角括弧で括って指定する必要があります。次は IPv6 の例です:

    + +

    + <VirtualHost [2001:db8::a00:20ff:fea7:ccea]>
    + + ServerAdmin webmaster@host.example.com
    + DocumentRoot /www/docs/host.example.com
    + ServerName host.example.com
    + ErrorLog logs/host.example.com-error_log
    + TransferLog logs/host.example.com-access_log
    +
    + </VirtualHost> +

    + +

    各々のバーチャルホストにはそれぞれ違う IP アドレス、ポート番号 + もしくはホスト名に対応する必要があり、 + 1 番目の場合には複数のアドレスで IP パケットを受信できるように + サーバマシンを設定しなければなりません。 + (もし、マシンが複数のネットワークインターフェースと持たない場合は、 + (OSがサポートしていれば) ifconfig alias コマンドにより + 達成できます)。

    + +

    :port といった形式で記述することにより、 + マッチさせるポートを変更可能です。 + この指定をしない場合には、主サーバ設定における + 一番最後に Port で指定されたポートが + デフォルトとなります。 + :* を指定することにより、 + アドレス上の全てのポートにマッチします。(_default_ のときは + これを使うことが推奨されています。)

    + +

    セキュリティに関して: + サーバーを起動した以外のユーザがログファイルが保管されるディレクトリに + 書き込み可能なときになぜセキュリティが破られる可能性があるかの詳細は + セキュリティに関するコツ を + 参照してください。

    + +

    注意点

    +

    <VirtualHost> は Apache が Listen する + IP アドレスには影響を与えません。 + Listen を + 使って Apache が正しいアドレスを listen するように設定する必要があります。

    +
    + +

    IP ベースのバーチャルホストを使っている場合は、特別な名前 + _default_ を指定することができます。その場合は + そのバーチャルホストは他のバーチャルホストで明示的に挙げられていない + すべての IP アドレスにマッチします。_default_ バーチャルホストが無い + 場合に IP がバーチャルホストで指定されたものにマッチしないときは、 + VirtualHost セクションの外のすべての定義からなる「主」サーバ設定が + 使われます。(ただし、NameVirtualHost ディレクティブにマッチする + すべての IP アドレスは「主」サーバ設定も _default_ バーチャルホストも + 使わないことに注意してください。詳しくは ネームベースのバーチャルホスト を + 参照してください。)

    + +

    :port といった形式で記述することにより、 + マッチさせるポートを変更可能です。 + この指定をしない場合には、主サーバ設定における + 一番最後に Listen で指定された + ポートがデフォルトとなります。 + :* を指定することにより、 + アドレス上の全てのポートにマッチします。(_default_ のときは + これを使うことが推奨されています。)

    + +

    :port といった形式で記述することにより、 + マッチさせるポートを変更可能です。 + この指定をしない場合には、主サーバ設定における + 一番最後に Port で指定されたポートが + デフォルトとなります。 + :* を指定することにより、 + アドレス上の全てのポートにマッチします。(_default_ のときは + これを使うことが推奨されています。)

    + +

    セキュリティ

    +

    サーバーを起動した以外のユーザがログファイルが保管されるディレクトリに + 書き込み可能なときになぜセキュリティが破られる可能性があるかの詳細は + セキュリティに関するコツ を + 参照してください。

    + +

    参照

    + +
    +
    +
    +

    Available Languages:  de  | + en  | + es  | + ja  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/core.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/core.html.tr.utf8 new file mode 100644 index 00000000..c234f217 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/core.html.tr.utf8 @@ -0,0 +1,3177 @@ + + + +core - Apache HTTP Sunucusu + + + + + + +
    <-
    + +
    +

    Apache Temel Özellikleri

    +
    +

    Mevcut Diller:  de  | + en  | + es  | + ja  | + tr 

    +
    + +
    Açıklama:Apache HTTP Sunucusunda daima mevcut olan çekirdek + özellikler
    Durum:Çekirdek
    +
    + + +
    top
    +

    AcceptPathInfo Yönergesi

    + + + + + + + + + +
    Açıklama:Dosya isminden sonra belirtilen yol verisini kabul veya + reddeder.
    Sözdizimi:AcceptPathInfo On|Off|Default
    Öntanımlı:AcceptPathInfo Default
    Bağlam:sunucu geneli, sanal konak, dizin, .htaccess
    Geçersizleştirme:FileInfo
    Durum:Çekirdek
    Modül:core
    Uyumluluk:Apache 2.0.30 ve sonrasında mevcuttur.
    +

    Bu yönerge, istekte dosya isminden sonra (dizinde belirtilen dosya + bulunmayabilir) belirtilen yol verisinin kabul edilip edilmeyeceğini + denetler. Dosya isminden sonra belirtilen yol verisi + PATH_INFO ortam değişkeninde betiklerin kullanımına + sunulabilir.

    + +

    Örneğin, içinde sadece here.html dosyası bulunan bir + /test/ dizinimiz olsun. /test/here.html/more + ve /test/nothere.html/more isteklerinin her ikisi de + PATH_INFO değişkenine /more verisinin + atanmasını sağlar.

    + +

    AcceptPathInfo yönergesine atanabilecek argüman + sayısı üçtür:

    +
    +
    Off
    Sadece dosya isminden sonra yol verisi + bulunmayan istekler kabul edilir. Yukarıdaki örnekteki gibi + /test/here.html/more şeklindeki istekler bir 404 (Nesne + bulunamadı) hatasıyla sonuçlanır.
    + +
    On
    Mevcut bir dosyaya ait bir dosya isminden + sonra bir yol verisinin de belirtildiği istekler kabul edilir. + Yukarıdaki örnekteki gibi /test/here.html/more şeklindeki + istekler, /test/here.html geçerli bir dosya olduğu + takdirde kabul edilir.
    + +
    Default
    Dosya isminden sonra yol verisi + belirtilen isteklerin nasıl ele alınacağı istekten sorumlu eylemci tarafından saptanır. Normal dosyalar + için çekirdek eylemci öntanımlı olarak PATH_INFO + isteklerini reddeder. cgi-script ve isapi-handler gibi betiklere + hizmet eden eylemciler ise genellikle PATH_INFO + isteklerini öntanımlı olarak kabul ederler.
    +
    + +

    AcceptPathInfo yönergesinin birincil amacı eylemcinin + PATH_INFO istekleri hakkında verdiği kabul veya red + kararını geçersiz kılabilmenizi sağlamaktır. Örneğin, + PATH_INFO’ya dayalı olarak içerik üretmek için INCLUDES gibi bir süzgeç kullandığınız takdirde bu + geçersizleştirme zorunlu olur. Normal dosyalar için çekirdek eylemci + normal olarak isteği reddederdi, böyle bir durumda bir betiği etkin + kılmak için aşağıdaki gibi bir yapılandırma kullanabilirsiniz:

    + +

    + <Files "mypaths.shtml">
    + + Options +Includes
    + SetOutputFilter INCLUDES
    + AcceptPathInfo On
    +
    + </Files> +

    + + +
    +
    top
    +

    AccessFileName Yönergesi

    + + + + + + + +
    Açıklama:Dağıtık yapılandırma dosyasının ismi belirtilir.
    Sözdizimi:AccessFileName filename [filename] ...
    Öntanımlı:AccessFileName .htaccess
    Bağlam:sunucu geneli, sanal konak
    Durum:Çekirdek
    Modül:core
    +

    Belge yolu üzerindeki dizinlerde dağıtık yapılandırma dosyalarının bulunmasına izin verilmişse sunucu bir isteği + işlerken önce bu dizinlerde bu yönergede belirtilmiş yapılandırma + dosyasını arar. Örnek:

    + +

    + AccessFileName .acl +

    + +

    Sunucu, /usr/local/web/index.html belgesini döndürmeden + önce,

    + +

    + <Directory />
    + + AllowOverride None
    +
    + </Directory> +

    + +

    şeklinde bir yapılandırma ile iptal edilmiş olmadıkça yönergeler için + /.acl, /usr/.acl, + /usr/local/.acl ve /usr/local/web/.acl + dosyalarını okur.

    + +

    Ayrıca bakınız:

    + +
    +
    top
    +

    AddDefaultCharset Yönergesi

    + + + + + + + + +
    Açıklama:Bir yanıtın içerik türü text/plain veya + text/html olduğunda eklenecek öntanımlı karakter kümesi + parametresini belirler.
    Sözdizimi:AddDefaultCharset On|Off|karküm
    Öntanımlı:AddDefaultCharset Off
    Bağlam:sunucu geneli, sanal konak, dizin, .htaccess
    Geçersizleştirme:FileInfo
    Durum:Çekirdek
    Modül:core
    +

    Bu yönerge, yanıtın içerik türü text/plain veya + text/html olmak şartıyla yanıta eklenecek karakter + kümesini (karakter kodlamasınının ismini) belirler. Bu, asıl davranış + çoğunlukla kullanıcının istemci yapılandırmasına bağlı olmakla + birlikte, yanıtın gövdesinde META elemanı vasıtasıyla + belirtilmiş karakter kümesini geçersiz kılar. AddDefaultCharset + Off şeklinde bir atama bu işlevselliği iptal eder. + AddDefaultCharset On ile bu işlevsellik etkin kılınmaktan + başka iso-8859-1 karakter kümesini öntanımlı olarak yanıta + eklenir. Yönergede karküm olarak belirtilecek değerler, MIME + ortam türlerinde kullanmak üzere IANA’da kayıtlı + karakter kümesi değerlerinden biri olmalıdır. Örnek:

    + +

    + AddDefaultCharset utf-8 +

    + +

    AddDefaultCharset yönergesi sadece, metin + kaynaklarının hepsinin aynı karakter kümesine sahip olduğu bilindiği + takdirde ve her birinde ayrı ayrı karakter kümesi belirtmek çok + külfetli olacaksa kullanılmalıdır. Buna bir örnek, CGI betikleri + tarafından üretilmiş içeriğe sahip kaynaklara karakter kümesinin + eklenmesidir; böyle kaynaklar çıktıda kullanıcı tarafından sağlanmış + veri içermeleri nedeniyle karşı siteden kaynaklanan betikli + saldırılardan zarar görebilir. Bununla birlikte, bir öntanımlı karakter + kümesi belirtmek, tarayıcılarında “karakter kodlamasını kendiliğinden + sapta” özelliğini etkin kılmış kullanıcıları korumayacağından daha iyi + bir çözüm bu betikleri bu tür saldırılara karşı düzeltmek veya en iyisi + silmektir.

    + +

    Ayrıca bakınız:

    + +
    +
    top
    +

    AddOutputFilterByType Yönergesi

    + + + + + + + + +
    Açıklama:Belli bir MIME türüne bir çıktı süzgeci atar.
    Sözdizimi:AddOutputFilterByType süzgeç[;süzgeç...] +MIME-türü [MIME-türü] ...
    Bağlam:sunucu geneli, sanal konak, dizin, .htaccess
    Geçersizleştirme:FileInfo
    Durum:Çekirdek
    Modül:core
    Uyumluluk:2.0.33 ve sonrasında mevcuttur.
    +

    Bu yönerge yanıtın → MIME türüne + bağlı olarak bir istek için belli bir çıktı + süzgecini etkin kılar.

    + +

    Aşağıdaki örnekte mod_deflate modülünce sağlanan + DEFLATE süzgeci kullanılmıştır. Bu süzgeç, + text/html veya text/plain olarak yaftalanmış + tüm çıktıyı (ister durağan ister devingen olsun) istemciye göndermeden + önce sıkıştırır.

    + +

    + AddOutputFilterByType DEFLATE text/html text/plain +

    + +

    İçeriğin birden fazla süzgeç tarafından işlenmesini isterseniz süzgeç + isimlerini noktalı virgüllerle ayırarak belirtebilirsiniz. Ayrıca, bu + süzgeçlerin her biri için ayrı bir + AddOutputFilterByType yönergesi belirtmek de + mümkündür.

    + +

    Aşağıdaki yapılandırma text/html olarak yaftalanmış tüm + betik çıktılarının önce INCLUDES sonra da + DEFLATE süzgecinden geçirilmesine sebep olur.

    + +

    + <Location /cgi-bin/>
    + + Options Includes
    + AddOutputFilterByType INCLUDES;DEFLATE text/html
    +
    + </Location> +

    + +

    Ek Bilgi

    +

    Süzgeçlerin AddOutputFilterByType ile etkin + kılınması bazı durumlarda kısmen bazılarında da tamamen başarısızlığa + uğrayabilir. Örneğin, → MIME türü + saptanamadığı takdirde hiçbir süzgeç uygulanmaz ve DefaultType aynı olsa bile son çare olarak + DefaultType ayarlarına geri + dönülür.

    + +

    Bununla birlikte, süzgeçlerin uygulanacağına emin olmak isterseniz, + bir kaynağa içerik türünü örneğin, AddType veya + ForceType ile açıkça + atayabilirsiniz. Ayrıca, içerik türünü (bir nph-olmayan) CGI betiği + içinde ayarlamak da bu güvenceyi sağlar.

    +

    Türe bağlı çıktı süzgeçleri vekil isteklerinde asla uygulanmaz.

    +
    + +

    Ayrıca bakınız:

    + +
    +
    top
    +

    AllowEncodedSlashes Yönergesi

    + + + + + + + + +
    Açıklama:Kodlanmış dosya yolu ayracı içeren URL’lere izin verilip + verilmeyeceğini belirler.
    Sözdizimi:AllowEncodedSlashes On|Off
    Öntanımlı:AllowEncodedSlashes Off
    Bağlam:sunucu geneli, sanal konak
    Durum:Çekirdek
    Modül:core
    Uyumluluk:Apache 2.0.46 ve sonrasında mevcuttur.
    +

    AllowEncodedSlashes yönergesi kodlanmış dosya + yolu ayracı içeren URL’lere izin verir (/ yerine + %2F ve ek olarak \ için ilgili sistemlerde + %5C kullanılmış URL’ler). Normalde böyle URL’ler bir 404 + (Nesne bulunamadı) hatasıyla reddedilirler.

    + +

    AllowEncodedSlashes On, çoğunlukla + PATH_INFO ile bir arada kullanıldığı zaman + kullanışlıdır.

    + +

    Ek Bilgi

    +

    Kodlanmış bölü çizgilerine izin vermek bu kodlamanın karakter olarak + çözümleneceği anlamına gelmez. URL içindeki %2F veya + %5C’ler (sadece ilgili sistemlerde), tıpkı normal + URL’lere yapıldığı gibi, oldukları gibi bırakılırlar.

    +
    + +

    Ayrıca bakınız:

    + +
    +
    top
    +

    AllowOverride Yönergesi

    + + + + + + + +
    Açıklama:.htaccess dosyalarında bulunmasına izin verilen + yönerge türleri belirtilir.
    Sözdizimi:AllowOverride All|None|yönerge-türü +[yönerge-türü] ...
    Öntanımlı:AllowOverride All
    Bağlam:dizin
    Durum:Çekirdek
    Modül:core
    +

    Sunucu AccessFileName yönergesi + ile belirtildiği şekilde bir .htaccess dosyasına rastlarsa + önceki yapılandırma yönergelerinin hangilerinin geçersiz kılınmak üzere + bildirildiğini bilmek ister.

    + +

    Sadece <Directory> bölümlerinde geçerli

    + AllowOverride yönergesi, <Location>, <DirectoryMatch> veya <Files> bölümlerinde değil, + sadece düzenli ifade içermeyen <Directory> bölümlerinde geçerlidir. +
    + +

    Yönergeye değer olarak None belirtilirse .htaccess dosyaları tamamen yok sayılır. Bu + durumda, sunucu dosya sisteminde rastladığı .htaccess + dosyalarını okumaya dahi çalışmayacaktır.

    + +

    Bu yönergeye All değeri atanırsa, .htaccess bağlamında kullanılabilecek her + yönergeye .htaccess dosyalarında izin verilir.

    + +

    yönerge-türü olarak aşağıdaki yönerge grup + isimlerinden biri belirtilebilir:

    + +
    +
    AuthConfig
    + +
    AuthDBMGroupFile, + AuthDBMUserFile, + AuthGroupFile, + AuthName, + AuthType, + AuthUserFile, + Require + ve benzeri yetkilendirme yönergelerinin kullanımını izin + verilir.
    + +
    FileInfo
    + +
    Belge türünü denetleyen mod_mime + Add* ve Remove* yönergeleri, + DefaultType, + ErrorDocument, + ForceType, + LanguagePriority, + SetHandler, + SetInputFilter, + SetOutputFilter + yönergelerinin kullanımına izin verilir. +
    + +
    Indexes
    + +
    Dizin içeriğinin listelenmesini denetleyen + AddDescription, + AddIcon, + AddIconByEncoding, + AddIconByType, + DefaultIcon, + DirectoryIndex, + FancyIndexing, + HeaderName, + IndexIgnore, + IndexOptions, + ReadmeName + yönergelerinin ve benzerlerinin kullanımına izin + verilir.
    + +
    Limit
    + +
    Konak erişimini denetleyen + Allow, + Deny ve + Order + yönergelerinin kullanımına izin verilir.
    + +
    Options
    + +
    Dizinlere özgü özellikleri denetleyen + Options ve + XBitHack yönergelerinin + kullanımına izin verilir.
    +
    + +

    Örnek:

    + +

    + AllowOverride AuthConfig Indexes +

    + +

    Bu örnekte AuthConfig ve Indexes grubundaki + yönergeler bir dahili sunucu hatasına yol açmayacaktır.

    + +

    Ayrıca bakınız:

    + +
    +
    top
    +

    AuthName Yönergesi

    + + + + + + + +
    Açıklama:HTTP kimlik doğrulamasında kullanmak için yetki alanı ismi
    Sözdizimi:AuthName yetki-alanı
    Bağlam:dizin, .htaccess
    Geçersizleştirme:AuthConfig
    Durum:Çekirdek
    Modül:core
    +

    Bu yönerge bir dizin için yetki alanı ismi belirler. Bu alan istemciye + bildirilerek kullanıcının hangi kullanıcı ismini ve parolasını + kullanacağını bilmesi sağlanır. AuthName tek bir + argüman alır. Bu bakımdan eğer alan ismi boşluk karakterleri içeriyorsa + ismin tırnak içine alınması gerekir. Çalışması için AuthUserFile ve + AuthGroupFile gibi yönergelerden + başka AuthType ve Require yönergelerinin kendine eşlik etmesini + gerektirir.

    + +

    Örnek:

    + +

    + AuthName "Top Secret" +

    + +

    AuthName için belirtilen dizge çoğu tarayıcı tarafından + parola diyaloğunda gösterilir.

    + +

    Ayrıca bakınız:

    + +
    +
    top
    +

    AuthType Yönergesi

    + + + + + + + +
    Açıklama:Kullanıcı kimlik doğrulaması türü
    Sözdizimi:AuthType Basic|Digest
    Bağlam:dizin, .htaccess
    Geçersizleştirme:AuthConfig
    Durum:Çekirdek
    Modül:core
    +

    Bu yönerge bir dizin için kullanıcı kimlik doğrulaması türünü belirler. + Olası kimlik doğrulama türleri Basic ve + Digest’tir.

    + +

    Kimlik doğrulamasının gerçekleşmesi için AuthName ve Require yönergelerini de kullanmalısınız. + Bunlara ek olarak sunucunun AuthUserFile ve AuthGroupFile gibi yönergelere de ihtiyacı + vardır.

    + +

    Ayrıca bakınız:

    + +
    +
    top
    +

    CGIMapExtension Yönergesi

    + + + + + + + + +
    Açıklama:CGI betik yorumlayıcısını saptama tekniğini belirler. +
    Sözdizimi:CGIMapExtension cgi-yolu .uzantı
    Bağlam:dizin, .htaccess
    Geçersizleştirme:FileInfo
    Durum:Çekirdek
    Modül:core
    Uyumluluk:Sadece NetWare’de geçerlidir.
    +

    Bu yönerge Apache’inin CGI bekitlerini çalıştırmak için kullanacağı + yorumlayıcıyı nasıl bulacağını denetlemek için kullanılır. Örneğin, + CGIMapExtension sys:\foo.nlm .foo satırı .foo + uzantılı CGI betik dosyalarının FOO yorumlayıcıya aktarılmasını + sağlar.

    + +
    +
    top
    +

    ContentDigest Yönergesi

    + + + + + + + + +
    Açıklama:Content-MD5 HTTP yanıt başlıklarının üretimini + etkin kılar.
    Sözdizimi:ContentDigest On|Off
    Öntanımlı:ContentDigest Off
    Bağlam:sunucu geneli, sanal konak, dizin, .htaccess
    Geçersizleştirme:Options
    Durum:Çekirdek
    Modül:core
    +

    Bu yönerge RFC2616 ve RFC1864’te tanımlandığı gibi + Content-MD5 üretimini etkin kılar.

    + +

    MD5, verideki herhangi bir değişikliğin ileti özetinin değişmesi + olarak yansıması nedeniyle yüksek derecede itimat sağlayan keyfi + uzunlukta bir "ileti özeti" (bazen "parmakizi" dendiği de olur) + hesaplama algoritmasıdır.

    + +

    Content-MD5 başlığı öğe gövdesinin iki uç arasında ileti + bütünlük sınamasının yapılabilmesini sağlar. Bir istemci veya vekil + aktarılan öğe gövdesinde rastlantısal bir değişiklik olup olmadığını + saptamak için bu başlığın doğruluğunu sınayabilir. Başlık örneği:

    + +

    + Content-MD5: AuLb7Dp1rqtRtxz2m9kRpA== +

    + +

    Her istekte ileti özeti hesaplanacağından (değerler saklanmaz), bu + yönergenin sunucunuzda başarım sorunlarına yol açacağına dikkat + ediniz.

    + +

    Content-MD5, herhangi bir modül değil, sadece + core modülü tarafından sunulan belgeler için + gönderilir. Örneğin, SSI belgeleri CGI betikleri tarafından + çıktılanırlar ve bayt seviyesinden çıktılar bu başlığa sahip + olmazlar.

    + +
    +
    top
    +

    DefaultType Yönergesi

    + + + + + + + + +
    Açıklama:Sunucunun MIME türünü saptayamadığı durumda göndereceği MIME + içerik türünü belirler.
    Sözdizimi:DefaultType MIME-türü
    Öntanımlı:DefaultType text/plain
    Bağlam:sunucu geneli, sanal konak, dizin, .htaccess
    Geçersizleştirme:FileInfo
    Durum:Çekirdek
    Modül:core
    +

    Sunucudan zaman zaman kendi → MIME + türü ile uyuşmayan bir belge sunması istenir.

    + +

    Sunucu, belgenin içerik türünü istemciye bildirmek zorundadır. Eğer + sunucu bunu normal yollardan saptayamazsa içerik türü olarak + DefaultType ile belirtilen değeri gönderir. Örneğin, GIF + dosyaları bulunan bir dizinde .gif uzantısına sahip + olmayan dosyaların da bulunması durumunda, bu dizin için,

    + +

    + DefaultType image/gif +

    + +

    belirtilmesi uygun olurdu.

    + +

    Bu yönergenin sadece öntanımlı MIME-türünü sağlaması nedeniyle + ForceType yönergesinden farklı + olduğuna dikkat ediniz. Dosya ismi uzantıları dahil, tüm diğer + MIME-türü tanımları ortam türünü tanımladığı noktada bu öntanımlı türü + sunulan veri için geçersiz kılacaktır.

    + +
    +
    top
    +

    <Directory> Yönergesi

    + + + + + + +
    Açıklama:Sadece ismi belirtilen dosya sistemi dizininde ve bunun + altdizinlerinde uygulanacak bir yönerge grubunu sarmalar.
    Sözdizimi:<Directory dizin-yolu> +... </Directory>
    Bağlam:sunucu geneli, sanal konak
    Durum:Çekirdek
    Modül:core
    +

    <Directory> ve + </Directory> sadece ismi belirtilen dosya sistemi + dizininde ve bunun altdizinlerinde uygulanacak bir yönerge grubunu + sarmalamakta kullanılır. Bir dizin bağlamında kullanılabilecek her + yönergeye izin verilir. dizin-yolu bir dizinin tam yolu + olabileceği gibi Unix kabuk tarzı bir dosya ismi eşleştirme kalıbı da + olabilir. Kalıp dizgesinde, ? herhangi bir tek karakterle, + * herhangi bir karakter dizisiyle eşleşir. Ayrıca + [] karakter aralıkları da kullanılabilir. ‘/’ karakteri + ile hiçbir kalıp karakteri eşleşmez, bu bakımdan <Directory + /*/public_html> ile /home/user/public_html + değil, ama <Directory /home/*/public_html> + eşleşecektir. Örnek:

    + +

    + <Directory /usr/local/httpd/htdocs>
    + + Options Indexes FollowSymLinks
    +
    + </Directory> +

    + +
    +

    dizin-yolu argümanlarını belirtirken dikkatli + olmalısınız: Apache’nin dosyalara erişmekte kullandığı dosya sistemi + yolu ile bire bir eşleşmelidir. Belli bir + <Directory> dizinine uygulanan yönergeler, aynı + dizine farklı bir yoldan, örneğin başka bir sembolik bağ üzerinden + erişilen dosyalara uygulanmayacaktır.

    +
    + +

    ~ karakterine ek olarak gelişkin → düzenli ifadeler de kullanılabilir. Örnek:

    + +

    + <Directory ~ "^/www/.*/[0-9]{3}"> +

    + +

    yönergesi /www/ içindeki üç rakamdan oluşan dizinlerle + eşleşecektir.

    + +

    Eğer çok sayıda (düzenli ifade olmayan) <Directory> bölümü, bir dosyayı içeren bir + dizinle veya üst dizinlerinden biri ile eşleşiyorsa, uygulama en kısa + eşleşmedeki yönergelerden başlayarak .htaccess dosyalarındaki yönergelere kadar + genişletilir. Örneğin,

    + +

    + <Directory />
    + + AllowOverride None
    +
    + </Directory>
    +
    + <Directory /home/>
    + + AllowOverride FileInfo
    +
    + </Directory> +

    + +

    bölümleri ile /home/web/dir/doc.html belgesine erişirken + şu aşamalardan geçilir:

    + +
      +
    • AllowOverride None yönergesi uygulanır + (.htaccess dosyaları iptal edilir).
    • + +
    • AllowOverride FileInfo yönergesi uygulanır + (/home dizini için).
    • + +
    • Sırayla /home/.htaccess, + /home/web/.htaccess ve + /home/web/dir/.htaccess dosyaları içindeki + FileInfo yönergeleri uygulanır.
    • +
    + +

    Normal bölümlerin tamamı uygulanıncaya kadar düzenli ifadeler + değerlendirilmez. Düzenli ifadelerin tamamı yapılandırma dosyasında + görüldükleri sıraya göre sınanırlar. Örneğin,

    + +

    + <Directory ~ abc$>
    + + # ... yönergeler burada ...
    +
    + </Directory> +

    + +

    düzenli ifadeli bölümü, tüm normal <Directory> bölümleri ve + .htaccess dosyaları uygulanıncaya kadar + değerlendirilmeyecektir. Düzenli ifadeleri değerlendirmeye sıra gelince + düzenli ifade /home/abc/public_html/abc ile eşleştirilecek + ve buna ilişkin <Directory> + uygulanacaktır.

    + +

    <Directory /> için öntanımlı Apache + erişiminin Allow from All oluşuna dikkat ediniz. Bunu şöyle + bir blokla değiştirmeniz,

    + +

    + <Directory />
    + + Order Deny,Allow
    + Deny from All
    +
    + </Directory> +

    + +

    ve erişilebilir olmasını istediğiniz dizinleri ayrıca + belirtmeniz önerilir. Daha ayrıntılı bilgi edinmek için Güvenlik İpuçları belgesine + bakınız.

    + +

    Dizin bölümleri httpd.conf dosyasında yer alır. + <Directory> yönergeleri iç içe + olamazlar ve bir <Limit> veya <LimitExcept> bölümü içinde bulunamazlar.

    + +

    Ayrıca bakınız:

    + +
    +
    top
    +

    <DirectoryMatch> Yönergesi

    + + + + + + +
    Açıklama:Bir düzenli ifade ile eşleşen dosya sistemi dizininde ve bunun + altdizinlerinde uygulanacak bir yönerge grubunu sarmalar.
    Sözdizimi:<DirectoryMatch düzifd> +... </DirectoryMatch>
    Bağlam:sunucu geneli, sanal konak
    Durum:Çekirdek
    Modül:core
    +

    <DirectoryMatch> and + </DirectoryMatch> yönergeleri <Directory> gibi sadece ismi + belirtilen dosya sistemi dizininde ve bunun altdizinlerinde uygulanacak + bir yönerge grubunu sarmalamakta kullanılır. Tek farkla argüman olarak + bir → düzenli ifade alır. Örnek:

    + +

    + <DirectoryMatch "^/www/(.+/)?[0-9]{3}"> +

    + +

    yönergesi /www/ içindeki üç rakamdan oluşan dizinlerle + eşleşecektir.

    + +

    Ayrıca bakınız:

    +
      +
    • Normal <Directory> + bölümlerindeki yönergelerle düzenli ifadelerin nasıl karıştırıldığının bir + açıklaması için <Directory> yönergesine bakınız.
    • +
    • Bir istek alındığında farklı yapılandırma bölümlerinin nasıl bir arada + ele alındığının açıklaması için <Directory>, <Location> ve + <Files> bölümleri nasıl çalışır? belgesine bakınız.
    • +
    +
    +
    top
    +

    DocumentRoot Yönergesi

    + + + + + + + +
    Açıklama:İstemciye görünür olan ana belge ağacının kök dizinini belirler.
    Sözdizimi:DocumentRoot dizin-yolu
    Öntanımlı:DocumentRoot /usr/local/apache/htdocs
    Bağlam:sunucu geneli, sanal konak
    Durum:Çekirdek
    Modül:core
    +

    Bu yönerge httpd tarafından dosyalarının sunulacağı + dizini belirler. Alias + benzeri bir yönerge ile eşleşmedikçe, sunucu istenen URL’deki yolu, + belge yolu haline getirmek için belge kök dizinine ekler. Örnek:

    + +

    + DocumentRoot /usr/web +

    + +

    yapılandırması ile http://www.my.host.com/index.html + isteği /usr/web/index.html ile eşleştirilir.

    + +

    DocumentRoot ile belirtilen dizin bir bölü + çizgisi ile bitirilmemelidir.

    + +

    Ayrıca bakınız:

    + +
    +
    top
    +

    EnableMMAP Yönergesi

    + + + + + + + + +
    Açıklama:Teslimat sırasında okunacak dosyalar için bellek eşlemeyi etkin + kılar.
    Sözdizimi:EnableMMAP On|Off
    Öntanımlı:EnableMMAP On
    Bağlam:sunucu geneli, sanal konak, dizin, .htaccess
    Geçersizleştirme:FileInfo
    Durum:Çekirdek
    Modül:core
    +

    Bu yönerge, sunucunun teslimat sırasında gerektiği takdirde bir dosya + içeriğinin okunması için bellek eşleme kullanıp kullanmayacağını + belirler. Öntanımlı olarak, bir isteğin yerine getirilmesi, + mod_include kullanarak sunucu tarafından çözümlenen + bir dosyanın teslimatı sırasında olduğu gibi, bir dosya içindeki veriye + erişilmesini gerektirdiğinde Apache, işletim sistemi tarafından + desteklendiği takdirde dosyayı belleğe eşler.

    + +

    Böyle bellek eşleme kimi zaman başarım artışını beraberinde getirirse + de bazen sorunlardan kaçınmak için bellek eşlemeyi kapatmak daha iyi + sonuç verir:

    + +
      +
    • Bazı çok işlemcili sistemlerde bellek eşleme + httpd’nin başarımını düşürebilmektedir.
    • +
    • DocumentRoot NFS gibi bir ağ + dosya sistemi üzerinde ise ağ kopması sonucunda, bir dosyanın silinmesi + veya dosya okuma işleminin kesilmesi durumunda + httpd parçalama arızası vererek çökebilir.
    • +
    + +

    Bu tür sorunlardan dolayı zarar görülebilecek sunucu + yapılandırmalarında dosya teslimatında bellek eşlemlerinin kullanımını + şu şekilde iptal etmeniz gerekir:

    + +

    + EnableMMAP Off +

    + +

    Bu özellik, sadece NFS dosya sistemi üzerinde sunulan dosyaları + kapsamak üzere şu şekilde kolayca kapatılabilir:

    + +

    + <Directory "/nfs-dosya-yolu"> + + EnableMMAP Off + + </Directory> +

    + +
    +
    top
    +

    EnableSendfile Yönergesi

    + + + + + + + + + +
    Açıklama:Dosyaların istemciye tesliminde çekirdeğin dosya gönderme + desteğinin kullanımını etkin kılar.
    Sözdizimi:EnableSendfile On|Off
    Öntanımlı:EnableSendfile On
    Bağlam:sunucu geneli, sanal konak, dizin, .htaccess
    Geçersizleştirme:FileInfo
    Durum:Çekirdek
    Modül:core
    Uyumluluk:2.0.44 ve sonrasında mevcuttur.
    +

    Bu yönerge, dosya içeriğinin istemciye teslimi için + httpd’nin çekirdeğin dosya gönderme desteğini + kullanıp kullanmayacağını belirler. Öntanımlı olarak, bir isteğin + yerine getirilmesi, bir durağan dosyanın teslimatı sırasında olduğu + gibi, bir dosya içindeki veriye erişilmesini gerektirmediği takdirde + Apache, işletim sistemi tarafından destekleniyorsa dosyayı istemciye + teslim etmek için çekirdeğin dosya gönderme özelliğini kullanır.

    + +

    Çekirdeğin dosya gönderme mekanizması, okuma, gönderme ve tampon + ayırma işlemlerini ayrı ayrı yapmaktan kaçınır. Fakat bazı + platformlarda veya bazı dosya sistemlerinde aşağıda belirtilen işlemsel + sorunlardan kaçınmak için bu özelliği iptal etmek daha iyidir:

    + +
      +
    • Bazı platformlar, derleme sistemince saptanamayan bozuk bir dosya + gönderme desteğine sahiptir; özellikle eğer derleme işlemi dosya + gönderme desteğinde sorun olmayan bir makinede yapılıp çalıştırılabilir + dosyaların sorunlu makineye kurulduğu durumda bu saptama + yapılamayacaktır.
    • +
    • Linux’ta IPv6 kullanırken dosya gönderme desteği bazı ağ + kartlarındaki TCP toplama sağlaması aktarım hatasını tetikler.
    • +
    • DocumentRoot ağ dosya sistemi + (NFS veya SMB gibi) üzerinde olduğu durumda çekirdek ağ dosyalarını + kendi arabelleği üzerinden sunamayabilir.
    • +
    + +

    Bu sorunlardan muzdarip sunucu yapılandırmaları için bu özelliği şöyle + iptal edebilirsiniz:

    + +

    + EnableSendfile Off +

    + +

    Bu özellik, sadece bir NFS veya SMB dosya sistemi üzerinde sunulan + dosyaları kapsamak üzere şu şekilde kolayca kapatılabilir:

    + +

    + <Directory "/path-to-nfs-files"> + + EnableSendfile Off + + </Directory> +

    + +
    +
    top
    +

    ErrorDocument Yönergesi

    + + + + + + + + +
    Açıklama:Bir hata durumunda sunucunun istemciye ne döndüreceğini + belirler.
    Sözdizimi:ErrorDocument hata-kodu belge
    Bağlam:sunucu geneli, sanal konak, dizin, .htaccess
    Geçersizleştirme:FileInfo
    Durum:Çekirdek
    Modül:core
    Uyumluluk:Metin iletilerini tırnak içine alma sözdizimi Apache 2.0’da + farklıdır.
    +

    Bir sorun çıktığında veya hata oluştuğunda Apache şu dört işlemden + birini yapacak şekilde yapılandırılabilir:

    + +
      +
    1. Yerleşik bir hata iletisi çıktılanır.
    2. + +
    3. Özel bir ileti çıktılanır.
    4. + +
    5. Sorunu/hatayı işleyecek yerel bir URL-yoluna yönlendirme + yapılır.
    6. + +
    7. Sorunu/hatayı işleyecek harici bir URL-yoluna + yönlendirme yapılır.
    8. +
    + +

    İlk seçenek öntanımlıdır. Diğer üç seçenek + ErrorDocument yönergesinin argümanları (hata + kodundan sonra bir URL veya hata iletisi) ile belirtilir. Apache bazı + durumlarda sorun/hata ile ilgili ek bilgi verecektir.

    + +

    URL’ler yerel yollarda (DocumentRoot’a göre) bir bölü çizgisi (/) ile + başlatılabileceği gibi istemci tarafından çözümlenecek tam bir URL + şeklinde de belirtilebilir. Bunlar yerine, tarayıcıda gösterilmek üzere + bir ileti de belirtilebilir. Örnekler:

    + +

    + ErrorDocument 500 http://hata.meselae.dom/cgi-bin/dnmci
    + ErrorDocument 404 /cgi-bin/bad_urls.pl
    + ErrorDocument 401 /subscription_info.html
    + ErrorDocument 403 "Kusura bakmayın, bugün hizmet veremiyoruz." +

    + +

    Bunlardan başka, Apache’nin kendi hata iletilerinin kullanılacağı özel + default değeri ile belirtilebilir. Normal şartlar altında + gerekmese de, bir şey belirtilmediği takdirde mevcut bir + ErrorDocument yönergesini miras alan + yapılandırmalarda Apache’nin kendi hata iletilerinin kullanımı + default değeri açıkça belirtilerek örnekteki gibi + zorlanabilir:

    + +

    + ErrorDocument 404 /cgi-bin/bad_urls.pl

    + <Directory /web/docs>
    + + ErrorDocument 404 default
    +
    + </Directory> +

    + +

    ErrorDocument yönergesinde bir uzak URL (önünde + http bulunan bir yol) belirtildiğinde, belge aynı sunucuda + olsa bile, Apache’nin istemciye belgeyi bulacağı yer için bir + yönlendirme göndereceğine dikkat ediniz. Bunun bazı istenmeyen etkileri + vardır; en önemlilerinden biri istemcinin hata kodu yerine bir + yönlendirme durum kodu alacak olmasıdır. Bu, bir URL’nin geçerliliğini + durum koduna göre saptayan istemciler veya robotlar için yanıltıcı + olacaktır. Buna ek olarak, ErrorDocument 401 için bir uzak + URL belirttiğiniz durumda istemci 401 durum kodunu almayacağı için + kullanıcıdan parola isteğinde bulunamayacaktır. Bu bakımdan, + ihtiyaç duyduğunuz takdirde, ErrorDocument 401 + yönergesine yerel bir belge belirtmelisiniz.

    + +

    Sunucunun ürettiği hata iletileri "çok kısa" olduğu takdirde, + Microsoft Internet Explorer (MSIE) öntanımlı olarak bu hata iletilerini + yoksayar ve bunun yerine kendi "kullanıcı dostu" hata iletilerini + kullanır. "Çok kısa" eşiği duruma göre değişmekle birlikte, genellikle, + hata iletileriniz 512 bayttan büyük olduğu takdirde MSIE kendi hata + iletileri yerine sunucunun ürettiği hata iletilerini gösterecektir. Bu + konuda daha fazla bilgiyi Q294807 kodlu Microsoft Knowledge Base makalesinde + bulabilirsiniz.

    + +

    Çoğu yerleşik hata iletisi özel iletilerle değiştirilebilse de bazı + durumlarda ErrorDocument ile ne + belirtildiğine bakılmaksızın yerleşik hata iletileri kullanılır. + Özellikle, bozuk bir istek saptandığında normal istek işleme hemen + devre dışı bırakılır ve yerleşik hata iletisi döndürülür. Bu, hatalı + istekler yaparak güvenlik sorunlarına yol açılmak istenmesi + durumlarında gereklidir.

    + +

    mod_proxy kullanıyorsanız, gerekise vekili olunan + sunucu yararına özel hata iletileri üretmenizi sağlayabilen ProxyErrorOverride yönergesini etkin + kılabilirsiniz. Bu yönergeyi etkinleştirmezseniz Apache vekaleten + sunulan içerik için özel hata sayfaları üretmeyecektir.

    + +

    2.0 öncesi sürümlerde iletiler bir çift çift-tırnak içine alınmayıp, + tek bir çift-tırnak ile başlatılması yeterli olurdu.

    + +

    Ayrıca bakınız:

    + +
    +
    top
    +

    ErrorLog Yönergesi

    + + + + + + + +
    Açıklama:Sunucunun hata günlüğünü tutacağı yeri belirler.
    Sözdizimi: ErrorLog dosya-yolu|syslog[:oluşum]
    Öntanımlı:ErrorLog logs/error_log (Unix) ErrorLog logs/error.log (Windows ve + OS/2)
    Bağlam:sunucu geneli, sanal konak
    Durum:Çekirdek
    Modül:core
    +

    ErrorLog yönergesi sunucunun saptadığı hataları + kaydedeceği dosyanın ismini belirtmek için kullanılır. + dosya-yolu ile göreli dosya yolu belirtildiği takdirde + dizininin ServerRoot ile + belirtilen sunucu kök dizinine göre belirtildiği varsayılır.

    + +

    Örnek

    + ErrorLog /var/log/httpd/error_log +

    + +

    dosya-yolu bir boru imi (|) ile başlatıldığı takdirde hata + iletilerinin hata günlüğünü işleme sokacak komuta borulanacağı + varsayılır.

    + +

    Örnek

    + ErrorLog "|/usr/local/bin/httpd_errors" +

    + +

    Dosya adı yerine syslog kullanılırsa, sistem desteklediği + takdirde günlük kaydı syslogd(8) üzerinden yürütülür. Öntanımlı olarak + local7 syslog oluşumu kullanılır. Bunu + syslog:oluşum sözdizimini kullanarak + değiştirebilirsiniz. Buradaki oluşum + syslog.conf(5) kılavuz sayfasında belirtilen oluşum isimlerinden biri + olabilir.

    + +

    Örnek

    + ErrorLog syslog:user +

    + +

    GÜVENLİK: Günlük dosyalarının saklandığı dizin, sunucuyu başlatan + kullanıcı dışındakiler tarafından yazılabilir olduğu takdirde + güvenliğinizin nasıl tehlikeye gireceği güvenlik ipuçları + belgesinde ayrıntılı olarak açıklanmıştır.

    +

    Ek Bilgi

    +

    Unix-dışı platformlarda dosya yolunu girerken, platform ters bölü + çizgilerini desteklese bile normal bölü çizgileri kullanmaya özen + göstermelisiniz. Genel olarak, dosya yollarını belirtirken + yapılandırma dosyası boyunca normal bölü çizgisi kullanmak her zaman + daha iyidir.

    +
    + +

    Ayrıca bakınız:

    + +
    +
    top
    +

    FileETag Yönergesi

    + + + + + + + + +
    Açıklama:ETag HTTP yanıt başlığını oluşturmakta kullanılacak + dosya özniteliklerini belirler.
    Sözdizimi:FileETag bileşen ...
    Öntanımlı:FileETag INode MTime Size
    Bağlam:sunucu geneli, sanal konak, dizin, .htaccess
    Geçersizleştirme:FileInfo
    Durum:Çekirdek
    Modül:core
    +

    FileETag yönergesi, belge bir dosyaya dayandığı + takdirde ETag (Entity Tag - öğe etiketi kısaltması) yanıt + başlığı alanını oluşturmakta kullanılacak dosya özniteliklerini + yapılandırır. (ETag değeri, ağ band genişliğinden kazanmak + için arabellek yönetiminde kullanılır.) Apache 1.3.22 ve öncesinde + ETag değeri daima dosyanın düğümü, boyutu ve son + değişiklik zamanından (mtime) oluşurdu. FileETag + yönergesi ne kullanılması gerektiğini belirleyebilmenizi sağlar. Değer + olarak belirtilebilecek anahtar sözcükler şunlardır:

    + +
    +
    INode
    +
    Dosyanın düğüm numarası hesaba katılır.
    +
    MTime
    +
    Dosyanın son değişiklik tarih ve saati dahil edilir.
    +
    Size
    +
    Dosyanın bayt cinsinden uzunluğu dahil edilir.
    +
    All
    +
    Olası tüm alanlar kullanılır. Bu şuna eşdeğerdir: +

    FileETag INode MTime Size

    +
    None
    +
    Bir belge dosyasıyla sunulsa bile yanıta hiçbir ETag + alanı dahil edilmez.
    +
    + +

    Öntanımlı ayarları miras alıp bunların kapsamını genişletmek/daraltmak + için INode, MTime ve Size + anahtar sözcüklerinin önüne + veya - imi + konabilir. Bu imlerin bulunmadığı bir anahtar sözcüğün varlığı halinde + hiçbir değer miras alınmaz.

    + +

    Eğer bir dizinin yapılandırması + FileETag INode MTime Size ve alt dizini + FileETag -INode içeriyorsa bu alt dizinin (ve bir + geçersizleştirme olmadığı takdirde onun alt dizinlerinin) ayarları + FileETag MTime Size yapılandırmasına eşdeğer + olacaktır.

    + +
    +
    top
    +

    <Files> Yönergesi

    + + + + + + + +
    Açıklama:Dosya isimleriyle eşleşme halinde uygulanacak yönergeleri + içerir.
    Sözdizimi:<Files dosya-adı> ... </Files>
    Bağlam:sunucu geneli, sanal konak, dizin, .htaccess
    Geçersizleştirme:All
    Durum:Çekirdek
    Modül:core
    +

    <Files> yönergesi, içerdiği + yönergelerin etki alanını dosya isimlerine göre sınırlandırır. + <Directory> ve + <Location> bölümleri + ile karşılaştırılabilir. Bir </Files> yönergesi ile + sonlandırılması gerekir. Bu bölüm içinde belirtilen yönergeler, + <Files> yönergesinde belirtilen + dosya-adı’nın son bileşeniyle (dizinler atıldıktan sonda + kalan dosya ismi) eşleşen nesnelere uygulanır. <Files> bölümleri yapılandırma dosyasında, + <Directory> bölümleri + ve .htaccess dosyaları okunduktan sonra fakat <Location> yönergelerinden önce + göründükleri sıraya göre işleme sokulurlar. <Files> bölümlerinin <Directory> bölümlerinin içinde uygulama + alanını sınırlamak amacıyla kullanılabileceğine dikkat ediniz.

    + +

    dosya-adı argümanının bir dosya ismi veya bir dosya ismi + kalıbı içermesi gerekir. Bir dosya ismi kalıbındaki her ? + imi bir karakterle eşleştirilirken * imi karakter dizileri + ile eşleştirilir. ~ imine ek olarak → düzenli ifadeler de kullanılabilir. Örneğin

    + +

    + <Files ~ "\.(gif|jpe?g|png)$"> +

    + +

    satırı en bilinen resim dosyası biçimleriyle eşleşecektir. Bunun + yerine <FilesMatch> + yönergesi de tercih edilebilirdi.

    + +

    <Directory> ve + <Location> + bölümlerinin aksine, <Files> + bölümleri .htaccess dosyaları içinde kullanılabilir. Bu + sayede kullanıcıların kendi dosyalarına erişimi dosya seviyesinde + denetlemelerine imkan sağlanmış olur.

    + + +

    Ayrıca bakınız:

    + +
    +
    top
    +

    <FilesMatch> Yönergesi

    + + + + + + + +
    Açıklama:Düzenli ifadelerin dosya isimleriyle eşleşmesi halinde + uygulanacak yönergeleri içerir.
    Sözdizimi:<FilesMatch düzifd> ... </FilesMatch>
    Bağlam:sunucu geneli, sanal konak, dizin, .htaccess
    Geçersizleştirme:All
    Durum:Çekirdek
    Modül:core
    +

    <FilesMatch> yönergesi, içerdiği + yönergelerin etki alanını <Files> yönergesinin yaptığı gibi dosya + isimlerine göre sınırlandırır. Ancak, argüman olarak bir → düzenli ifade kabul eder. Örneğin

    + +

    + <FilesMatch "\.(gif|jpe?g|png)$"> +

    + +

    satırı en bilinen resim dosyası biçimleriyle eşleşecektir.

    + +

    Ayrıca bakınız:

    + +
    +
    top
    +

    ForceType Yönergesi

    + + + + + + + + +
    Açıklama:Bütün dosyaların belirtilen MIME içerik türüyle sunulmasına + sebep olur.
    Sözdizimi:ForceType MIME-türü|None
    Bağlam:dizin, .htaccess
    Geçersizleştirme:FileInfo
    Durum:Çekirdek
    Modül:core
    Uyumluluk:Apache 2.0’da core modülüne taşındı.
    +

    Bu yönerge, bir .htaccess dosyası veya bir + <Directory>, + <Location> veya + <Files> bölümüne + yerleştirildiği zaman, eşleşen tüm dosyaların MIME-türü ile + belirtilen içerik türüyle sunulmasına sebep olur. Örneğin, altında + sadece GIF dosyaları bulunan bir dizininiz varsa ve bunlara tek tek + .gif uzantısı belirtmek istemiyorsanız şu yapılandırmayı + kullanabilirsiniz:

    + +

    + ForceType image/gif +

    + +

    DefaultType yönergesinin tersine + bu yönerge ortam türünü betimleyen tüm MIME-türü tanımlarını geçersiz + kılar.

    + +

    Mevcut ForceType ayarlarını None + değeriyle geçersiz kılabilirsiniz:

    + +

    + # tüm dosyaların image/gif olarak sunulması için:
    + <Location /images>
    + + ForceType image/gif
    +
    + </Location>
    +
    + # normal MIME-türüne geri dönmek için:
    + <Location /images/mixed>
    + + ForceType None
    +
    + </Location> +

    + +
    +
    top
    +

    HostnameLookups Yönergesi

    + + + + + + + +
    Açıklama:İstemci IP adresleri üzerinde DNS sorgularını etkin kılar. +
    Sözdizimi:HostnameLookups On|Off|Double
    Öntanımlı:HostnameLookups Off
    Bağlam:sunucu geneli, sanal konak, dizin
    Durum:Çekirdek
    Modül:core
    +

    Bu yönerge oturum açabilecek konak isimlerini tespit edebilmek için + DNS sorgularını etkin kılar (ve sonuç REMOTE_HOST’ta + belirtilerek CGI/SSI’lere aktarılır). Double değeri + sorgunun çift yönlü yapılacağını belirtir. Yani, bir tersine sorgunun + ardından bir normal sorgu yapılır. Normal sorguda elde edilen IP + adreslerinden birinin istek yapan IP adresi ile eşleşmesi gerekir. + ("tcpwrappers" terminolojisinde buna PARANOID adı + verilir.)

    + +

    Konak ismine göre erişimi denetlemek için + mod_access kullanıldığında, nasıl bir ayar + yapıldığına bakılmaksızın, çift yönlü sorgulama yapılır. Bu güvenlik + için gereklidir. Bunun dışında açıkça HostnameLookups + Double belirtilmedikçe genellikle çift yönlü sorgulama yapılmaz. + Örneğin, sadece HostnameLookups On belirtilmiş ve konak + ismi kısıtlamalarıyla korunmuş bir nesne için bir istek yapılmışsa çift + yönlü sorgunun başarısına bakılmaksızın CGI’lere + REMOTE_HOST olarak tek yönlü sorgu sonucu aktarılır.

    + +

    Gerçekte ters yönlü sorguya gerek duyulmayan sitelerde ağ trafiğini + yormamak için Off, öntanımlı değerdir. Ayrıca, son + kullanıcıların DNS sorguları nedeniyle gereksiz yere bir beklemeye + maruz kalmaması için de bu daha iyidir. Yükü zaten ağır olan sitelerde, + DNS sorgularının görece uzun zaman alması nedeniyle bu yönergenin + değeri Off olarak bırakılmalıdır. Öntanımlı olarak kurulum + dizininizin bin alt dizinine kurulan + logresolve uygulaması kullanılarak oturum açan IP + adresleri için isim sorguları çevrim dışıyken yapılabilir.

    + +
    +
    top
    +

    IdentityCheck Yönergesi

    + + + + + + + +
    Açıklama:Uzak kullanıcıların RFC 1413’e göre kimlik bilgilerinin günlük +kayıtlarını etkin kılar.
    Sözdizimi:IdentityCheck On|Off
    Öntanımlı:IdentityCheck Off
    Bağlam:sunucu geneli, sanal konak, dizin
    Durum:Çekirdek
    Modül:core
    +

    Bu yönerge, istemci makinenin identd veya benzeri bir uygulama çalıştırdığı durumda her bağlantıda uzak kullanıcı isimlerinin RFC1413’e uygun olarak günlüğe kaydedilmesini etkin kılar. Bu bilgi erişim günlüğüne kaydedilir.

    + +

    Bu bilgi ilkel kullanım izleme dışında herhangi bir şekilde güvenilir kılınmamalıdır.

    + +

    Sunucunuza yapılan her istek bu sorgulardan birinin uygulanmasını gerektireceğinden bu uygulamanın sunucunun yanıt verme süresi bakımından sorunlara yol açacağına dikkat ediniz. Her sorguda işe bir de güvenlik duvarları karışırsa sorgu muhtemelen başarısız olacağından her sorguya bir 30 saniye de buradan eklenir. Bu bakımdan Genel Ağ’dan erişilen sunucular için genelde pek yararlı değildir.

    + +
    +
    top
    +

    <IfDefine> Yönergesi

    + + + + + + + +
    Açıklama:Başlatma sırasında bir doğruluk sınamasından sonra işleme +sokulacak yönergeleri sarmalar.
    Sözdizimi:<IfDefine [!]parametre-adı> ... + </IfDefine>
    Bağlam:sunucu geneli, sanal konak, dizin, .htaccess
    Geçersizleştirme:All
    Durum:Çekirdek
    Modül:core
    +

    <IfDefine sınama>...</IfDefine> + bölümü koşullu olarak işleme sokulacak yönergeleri içerir. + Bir <IfDefine> bölümü içindeki + yönergeler sadece sınama doğru sonuç verirse işleme sokulur. + Aksi takdirde, bölüm içinde kalan her şey yok sayılır.

    + +

    <IfDefine> bölüm yönergesinde + sınama için belirtilebilecek iki biçim vardır:

    + +
      +
    • parametre-adı
    • + +
    • !parametre-adı
    • +
    + +

    Birinci durumda bölüm içinde kalan yönergeler sadece + parametre-adı ile belirtilen parametre tanımlı ise işleme + sokulur. İkinci durumda ise tersi yapılır, yani sadece + parametre-adı ile belirtilen parametre tanımlı + değil ise yönergeler işleme sokulur.

    + +

    parametre-adı argümanı sunucu başlatılırken + httpd komut satırında + -Dparametre ile + belirtilerek tanımlı hale getirilebilir.

    + +

    <IfDefine> bölümleri iç içe + olabilir, dolayısıyla çok parametreli basit sınamalar gerçeklenebilir. + Örnek:

    + +

    + httpd -DReverseProxy ...
    +
    + # httpd.conf
    + <IfDefine ReverseProxy>
    + + LoadModule rewrite_module modules/mod_rewrite.so
    + LoadModule proxy_module modules/libproxy.so
    +
    + </IfDefine> +

    + +
    +
    top
    +

    <IfModule> Yönergesi

    + + + + + + + +
    Açıklama:Belli bir modülün varlığına veya yokluğuna göre işleme sokulacak +yönergeleri sarmalar.
    Sözdizimi:<IfModule [!]modül-ismi ... + </IfModule>
    Bağlam:sunucu geneli, sanal konak, dizin, .htaccess
    Geçersizleştirme:All
    Durum:Çekirdek
    Modül:core
    +

    <IfModule sınama>...</IfModule> + bölümü belli bir modülün varlığına veya yokluğuna göre işleme sokulacak + yönergeleri içerir. Bir <IfModule> + bölümü içindeki yönergeler sadece sınama doğru sonuç verirse + işleme sokulur. Aksi takdirde, bölüm içinde kalan her şey yok sayılır.

    + +

    <IfModule> bölüm yönergesinde + sınama için belirtilebilecek iki biçim vardır:

    + +
      +
    • modül-ismi
    • + +
    • !modül-ismi
    • +
    + +

    Birinci durumda bölüm içinde kalan yönergeler sadece + modül-ismi ile belirtilen modül Apache içine dahil edilmişse + veya LoadModule yönergesi ile + devingen olarak yüklenmişse işleme sokulur. İkinci durumda ise tersi + yapılır, yani sadece modül-ismi içerilmiş + değil ise yönergeler işleme sokulur.

    + +

    modül-ismi modülün derleme sırasındaki dosya ismidir. + Örneğin, mod_rewrite.c. Eğer modül çok sayıda kaynak + dosyasından oluşuyorsa STANDARD20_MODULE_STUFF dizgesini + içeren dosyanın ismi kullanılır.

    + +

    <IfModule> bölümleri iç içe + olabilir, dolayısıyla çok parametreli basit sınamalar gerçeklenebilir.

    + +
    Bu bölümü sadece yapılandırma dosyanızın belli modüllerin varlığına + veya yokluğuna bağlı olarak çalışması gerektiği durumlarda + kullanmalısınız. Normal işlemlerde yönergelerin <IfModule> bölümlerine yerleştirilmeleri + gerekmez.
    + +
    +
    top
    +

    Include Yönergesi

    + + + + + + + +
    Açıklama:Sunucu yapılandırma dosyalarının başka dosyaları içermesini sağlar. +
    Sözdizimi:Include dosya-yolu|dizin-yolu
    Bağlam:sunucu geneli, sanal konak, dizin
    Durum:Çekirdek
    Modül:core
    Uyumluluk:Dosya kalıbıyla eşleşme 2.0.41 ve sonrasında mevcuttur. +
    +

    Bu yönerge sunucu yapılandırma dosyalarının başka dosyaları içermesini + mümkün kılar.

    + +

    Çok sayıda dosyayı bir kerede alfabetik sırada içermek için kabuk tarzı + (fnmatch()) dosya ismi kalıp karakterleri kullanılabilir. + Ayrıca, eğer Include yönergesi bir dosya değil de + bir dizin gösteriyorsa Apache bu dizindeki ve alt dizinlerindeki bütün + dosyaları okuyacaktır. Fakat dizinin bir bütün olarak okutulması + önerilmez, çünkü dizinde httpd programının çökmesine + sebep olabilecek geçici dosyalar unutulabilir.

    + +

    Dosya yolu mutlak bir dosya yolu olarak belirtilebileceği gibi + ServerRoot dizinine göreli olarak da + belirtilebilir.

    + +

    Örnekler:

    + +

    + Include /usr/local/apache2/conf/ssl.conf
    + Include /usr/local/apache2/conf/vhosts/*.conf +

    + +

    Veya dizinler ServerRoot dizinine + göre belirtilebilir:

    + +

    + Include conf/ssl.conf
    + Include conf/vhosts/*.conf +

    + + +

    Ayrıca bakınız:

    + +
    +
    top
    +

    KeepAlive Yönergesi

    + + + + + + + +
    Açıklama:HTTP kalıcı bağlantılarını etkin kılar
    Sözdizimi:KeepAlive On|Off
    Öntanımlı:KeepAlive On
    Bağlam:sunucu geneli, sanal konak
    Durum:Çekirdek
    Modül:core
    +

    Keep-Alive yönergesi HTTP/1.0 protokolüne bir eklenti olup + HTTP/1.1 protokolünün kalıcı bağlantı özelliği aynı TCP bağlantısı + üzerinden çok sayıda isteğin gönderilmesini mümkün kılan uzun süreli HTTP + oturumları açılmasını sağlar. Bunun, çok sayıda resim içeren HTML + belgelerin yanıt zamanlarında bazı durumlarda %50’lik bir hızlanmayla + sonuçlandığı gösterilmiştir. Kalıcı bağlantıları etkin kılmak için + yönerge KeepAlive On şeklinde kullanılır.

    + +

    HTTP/1.0 istemcileri için kalıcı bağlantılar sadece bir istemci + tarafından özellikle istendiği takdirde kullanılabilir. Ek olarak, + HTTP/1.0 istemci kalıcı bağlantıları sadece içerik uzunluğu baştan + bilindiği zaman kullanılabilir. Bu, CGI çıktısı, SSI sayfaları ve + sunucunun ürettiği dizin listeleri gibi genellikle HTTP/1.0 istemcilere + kalıcı bağlantılar kullanmayan devingen içeriklere uygulanır. HTTP/1.1 + istemciler için kalıcı bağlantılar aksi belirtilmedikçe öntanımlıdır. + İstemci istediği takdirde, uzunluğu bilinmeyen içerik kalıcı bağlantılar + üzerinden gönderilirken parçalı kodlama kullanılacaktır.

    + +

    Ayrıca bakınız:

    + +
    +
    top
    +

    KeepAliveTimeout Yönergesi

    + + + + + + + +
    Açıklama:Bir kalıcı bağlantıda sunucunun bir sonraki isteği bekleme süresi +
    Sözdizimi:KeepAliveTimeout saniye
    Öntanımlı:KeepAliveTimeout 15
    Bağlam:sunucu geneli, sanal konak
    Durum:Çekirdek
    Modül:core
    +

    Sunucunun kalıcı bir bağlantıyı kapatmadan önce bir sonraki isteği kaç + saniye bekleyeceğini belirler. İstek alındıktan sonra Timeout yönergesiyle belirtilen zaman aşımı + değeri uygulanır.

    + +

    KeepAliveTimeout için yüksek bir değer belirtmek + ağır yüklü sunucularda başarım sorunlarına yol açar. Daha yüksek bir + zaman aşımı, boştaki istemcilerin bulunduğu bağlantıları bekleyen daha + fazla sunucu sürecini meşgul edecektir.

    + +

    İsme dayalı sanal konak bağlamında, NameVirtualHost bölümleri içinde tanımlanmış ilk sanal konağın (öntanımlı konak) değeri kullanılır. Diğer değerler görmezden gelinir.

    + +
    +
    top
    +

    <Limit> Yönergesi

    + + + + + + + +
    Açıklama:Erişimi sınırlanacak HTTP yöntemleri için erişim sınırlayıcıları +sarmalar.
    Sözdizimi:<Limit yöntem [yöntem] ... > ... + </Limit>
    Bağlam:sunucu geneli, sanal konak, dizin, .htaccess
    Geçersizleştirme:All
    Durum:Çekirdek
    Modül:core
    +

    Erişim denetleyicileri normalde tüm erişim yöntemleri + için etkindir ve olağan olanı da budur. Genel durum olarak, + erişim denetim yönergeleri bir <Limit> bölümüne + yerleştirilmemelidir.

    + +

    <Limit> bölümünün amacı, erişim + denetleyicilerinin etkilerini belli HTTP yöntemleri için sınırlamaktır. + <Limit> bölümü içinde listelenen + erişim sınırlamaları, kalan tüm diğer yöntemler için etkisiz + olacaktır. Aşağıdaki örnekte, erişim sınırlaması + POST, PUT ve DELETE yöntemleri + için uygulanmakta, diğer tüm yöntemler korumasız bırakılmaktadır:

    + +

    + <Limit POST PUT DELETE>
    + + Require valid-user
    +
    + </Limit> +

    + +

    Birden fazla bölümde kullanılabilecek yöntem isimleri: GET, + POST, PUT, DELETE, + CONNECT, OPTIONS, + PATCH, PROPFIND, PROPPATCH, + MKCOL, COPY, MOVE, + LOCK ve UNLOCK. Yöntem isimleri harf + büyüklüğüne duyarlıdır. GET yöntemi sınırlanırsa + HEAD istekleri de sınırlanmış olur. TRACE + yöntemi sınırlanamaz.

    + +
    Erişimi sınarlarken bir <Limit> bölümü yerine daima bir <LimitExcept> bölümünü tercih + etmelisiniz, çünkü <LimitExcept> bölümü belirtilen yöntemler dışında kalanlara + erişim koruması sağlar.
    + + +
    +
    top
    +

    <LimitExcept> Yönergesi

    + + + + + + + +
    Açıklama:İsimleri belirtilenler dışında kalan HTTP yöntemleri için +kullanılacak erişim sınırlayıcıları sarmalar.
    Sözdizimi:<LimitExcept yöntem [yöntem] ... > ... + </LimitExcept>
    Bağlam:sunucu geneli, sanal konak, dizin, .htaccess
    Geçersizleştirme:All
    Durum:Çekirdek
    Modül:core
    +

    <LimitExcept> ve + </LimitExcept> argüman olarak belirtilenler + dışında kalan HTTP yöntemleri için kullanılacak erişim + sınırlayıcıları gruplamakta kullanılır. Yani, <Limit> bölümünün tersine, standart olsun olmasın + bütün yöntemler için erişimi kısıtlamakta kullanılabilir. Daha ayrıntılı + bilgi edinmek için <Limit> yönergesinin açıklamasına bakınız.

    + +

    Örnek:

    + +

    + <LimitExcept POST GET>
    + + Require valid-user
    +
    + </LimitExcept> +

    + + +
    +
    top
    +

    LimitInternalRecursion Yönergesi

    + + + + + + + + +
    Açıklama:Dahili yönlendirmelerin ve istek içi isteklerin azami sayısını +belirler.
    Sözdizimi:LimitInternalRecursion sayı [sayı]
    Öntanımlı:LimitInternalRecursion 10
    Bağlam:sunucu geneli, sanal konak
    Durum:Çekirdek
    Modül:core
    Uyumluluk:Apache 2.0.47 ve sonrasında mevcuttur.
    +

    Örneğin, özgün istekleri dahili olarak bir CGI betiğine yönlendiren + Action yönergesi + kullanıldığında bir dahili yönlendirme oluşur. İstek içi istekler ise + bazı URI’ler için istek yapıldığında ne olacağını bulmak için Apache’nin + kullandığı bir mekanizmadır. Örneğin, mod_dir, + DirectoryIndex yönergesinde + listelenen dosyalara bakmak için istek içi istekler kullanır.

    + +

    LimitInternalRecursion yönergesi sunucunun dahili + yönlendirmeler ve istek içi isteklerin oluşturduğu döngülerden dolayı + çökmemesini sağlar. Böyle döngüler genellikle yanlış yapılandırma sonucu + ortaya çıkarlar.

    + +

    Yönerge her istek için değerlendirmeye alınacak iki farklı sınırlama + için kullanılabilir. İlk sayı ardarda gelebilen dahili + yönlendirmelerin azami sayısını, ikinci sayı ise istek içi + isteklerin ne kadar iç içe olabileceğini belirler. Tek bir + sayı belirtilirse iki sınırlama için de aynı değer + kullanılır.

    + +

    Örnek

    + LimitInternalRecursion 5 +

    + +
    +
    top
    +

    LimitRequestBody Yönergesi

    + + + + + + + + +
    Açıklama:İstemci tarafından gönderilen HTTP istek gövdesinin toplam +uzunluğunu sınırlar.
    Sözdizimi:LimitRequestBody bayt-sayısı
    Öntanımlı:LimitRequestBody 0
    Bağlam:sunucu geneli, sanal konak, dizin, .htaccess
    Geçersizleştirme:All
    Durum:Çekirdek
    Modül:core
    +

    Bu yönerge, bir istek gövdesinde izin verilen bayt sayısını 0 (sınırsız + anlamında) ile 2147483647 (2GB) arasında sınırlamak için kullanılır.

    + +

    LimitRequestBody yönergesi kullanıcıya yönergenin + kullanıldığı bağlam (sunucu, belli bir dizin, belli bir dosya, belli bir + yer) dahilinde bir HTTP istek iletisi gövdesinin izin verilen uzunluğu + için bir sınır belirleme imkanı verir. Eğer istemcinin isteği bu sınırı + aşarsa sunucu isteği sunmak yerine bir hata iletisi döndürecektir. Normal + bir istek ileti gövdesinin uzunluğu büyük oranda özkaynağın doğasına ve + bu özkaynak üzerinde izin verilen yöntemlere bağlıdır. CGI betikleri + genellikle ileti gövdesini form bilgisini almak için kullanır. + PUT yöntemi gerçeklenimleri, en azından, sunucunun o + özkaynak için kabul etmek isteyeceği herhangi bir gösterim kadar büyük + bir değer gerektirecektir.

    + +

    Bu yönerge, bazı hizmet reddi (DoS) saldırılarından kaçınmak için sunucu + yöneticilerine, anormal istemci istekleri üzerinde daha iyi denetim + imkanı sağlar.

    + +

    Eğer, örneğin, belli bir yere dosya yükleme izni verir ve buraya + yüklenebilecek dosya boyutunu 100 kB ile sınırlamak isterseniz yönergeyi + şöyle kullanabilirsiniz:

    + +

    + LimitRequestBody 102400 +

    + + +
    +
    top
    +

    LimitRequestFields Yönergesi

    + + + + + + + +
    Açıklama:İstemciden kabul edilecek HTTP isteği başlık alanlarının sayısını +sınırlar.
    Sözdizimi:LimitRequestFields sayı
    Öntanımlı:LimitRequestFields 100
    Bağlam:sunucu geneli
    Durum:Çekirdek
    Modül:core
    +

    sayı, en küçük 0 (sınırsız anlamında), en büyük 32767 + olabilir. Öntanımlı değer bir derleme zamanı sabiti olan + DEFAULT_LIMIT_REQUEST_FIELDS ile belirlenir (dağıtımla gelen + değeri 100’dür).

    + +

    LimitRequestFields yönergesi sunucu + yöneticilerine bir HTTP isteğinde izin verilen istek başlık alanlarının + sayısı üzerindeki sınırı değiştirebilme imkanı verir. Sunucu bu değerin, + normal bir istemci isteğinin içerebileceği alan sayısından daha büyük + olmasına ihtiyaç duyar. Bir istemci tarafından kullanılan istek başlık + alanlarının sayısı nadiren 20’yi geçer, fakat bu farklı istemci + gerçeklenimleri için değişiklik gösterir ve çoğunlukla kullanıcının + tarayıcısını ayrıntılı içerik müzakeresini desteklemek için nasıl + yapılandırdığıyla ilgilidir. İsteğe bağlı HTTP eklentileri çoğunlukla + istek başlık alanları kullanılarak ifade edilir.

    + +

    Bu yönerge, bazı hizmet reddi (DoS) saldırılarından kaçınmak için sunucu + yöneticilerine, anormal istemci istekleri üzerinde daha iyi denetim + imkanı sağlar. Eğer normal istemciler sunucudan istekte bulunurken çok + fazla başlık alanı gönderildiğine dair bir hata iletisi alırlarsa bu + değerin arttırılması gerekir.

    + +

    Örnek:

    + +

    + LimitRequestFields 50 +

    + + +
    +
    top
    +

    LimitRequestFieldSize Yönergesi

    + + + + + + + +
    Açıklama:İstemciden kabul edilecek HTTP isteği başlık uzunluğunu sınırlar. +
    Sözdizimi:LimitRequestFieldSize bayt-sayısı
    Öntanımlı:LimitRequestFieldSize 8190
    Bağlam:sunucu geneli
    Durum:Çekirdek
    Modül:core
    +

    Bu yönerge, HTTP istek başlığında izin verilecek bayt sayısını + belirler.

    + +

    LimitRequestFieldSize yönergesi, sunucu + yöneticilerine HTTP istek başlık alanının azami uzunluğunu arttırıp + azaltma imkanı verir. Sunucu bu değerin, normal bir istemci isteğinin + içerebileceği herhangi bir başlık alanını tutabilecek kadar büyük + olmasını gerektirir. Normal bir istek başlık alanı uzunluğu kullanıcının + tarayıcısını ayrıntılı içerik müzakeresini desteklemek için nasıl + yapılandırdığıyla ilgilidir. SPNEGO kimlik doğrulama başlıkları 12392 + baytlık olabilir.

    + +

    Bu yönerge, bazı hizmet reddi (DoS) saldırılarından kaçınmak için sunucu + yöneticilerine, anormal istemci istekleri üzerinde daha iyi denetim + imkanı sağlar.

    + +

    Örnek:

    + +

    + LimitRequestFieldSize 4094 +

    + +
    Normal şartlar altında öntanımlı değer değiştirilmemelidir.
    + +
    Apache 2.0.53 ve sonrasında, sınırı, bir derleme değeri olan + DEFAULT_LIMIT_REQUEST_FIELDSIZE (dağıtımda 8190) değerinin + üzerine çıkarmak için gereklidir. +
    + + +
    +
    top
    +

    LimitRequestLine Yönergesi

    + + + + + + + +
    Açıklama:İstemciden kabul edilecek HTTP istek satırının uzunluğunu sınırlar. +
    Sözdizimi:LimitRequestLine bayt-sayısı
    Öntanımlı:LimitRequestLine 8190
    Bağlam:sunucu geneli
    Durum:Çekirdek
    Modül:core
    +

    Bu yönerge, HTTP istek satırında izin verilecek bayt sayısını 0 ile bir + derleme zamanı sabiti olan DEFAULT_LIMIT_REQUEST_LINE + (dağıtımda 8190) ile belirtilen değer arasında bir değere ayarlar.

    + +

    LimitRequestLine yönergesi, sunucu yöneticilerine + bir istemcinin HTTP istek satırının azami uzunluğunu, sunucunun + derlenmesi sırasında belirtilenden daha azına ayarlama + imkanı verir. İstek satırının içeriği HTTP yöntemi, URI ve protokol + sürümünden oluştuğundan LimitRequestLine + yönergesi, sunucudan bir istek için kullanılan istek adresinin uzunluğunu + sınırlamış olur. Sunucu bu değerin, bir GET isteğinin sorgu + kısmında aktarılabilen her bilgi dahil, özkaynak isimlerinden her birini + tutabilecek kadar büyük olmasını gerektirir.

    + +

    Bu yönerge, bazı hizmet reddi (DoS) saldırılarından kaçınmak için sunucu + yöneticilerine, anormal istemci istekleri üzerinde daha iyi denetim + imkanı sağlar.

    + +

    Örnek:

    + +

    + LimitRequestLine 4094 +

    + +
    Normal şartlar altında öntanımlı değer değiştirilmemelidir.
    + +
    +
    top
    +

    LimitXMLRequestBody Yönergesi

    + + + + + + + + +
    Açıklama:Bir XML temelli istek gövdesinin uzunluğunu sınırlar.
    Sözdizimi:LimitXMLRequestBody bayt-sayısı
    Öntanımlı:LimitXMLRequestBody 1000000
    Bağlam:sunucu geneli, sanal konak, dizin, .htaccess
    Geçersizleştirme:All
    Durum:Çekirdek
    Modül:core
    +

    Bir XML temelli istek gövdesinin azami bayt sayısını belirler. Değer + olarak 0 belirtildiğinde herhangi bir boyut sınaması + yapılmaz.

    + +

    Örnek:

    + +

    + LimitXMLRequestBody 0 +

    + + +
    +
    top
    +

    <Location> Yönergesi

    + + + + + + +
    Açıklama:İçerdiği yönergeler sadece eşleşen URL’lere uygulanır. +
    Sözdizimi:<Location URL-yolu|URL> ... +</Location>
    Bağlam:sunucu geneli, sanal konak
    Durum:Çekirdek
    Modül:core
    +

    <Location> bölüm yönergesi kapsadığı + yönergelerin etki alanını belirtilen URL’lerle sınırlar. Bu yönerge, + <Directory> yönergesine + benzer ve </Location> yönergesi ile biten bir alt + bölüm başlatır. <Location> bölümleri + yapılandırma dosyasında göründükleri sıraya göre, <Directory> bölümleri ve + .htaccess dosyaları okunup <Files> bölümleri de işlendikten sonra işleme + sokulurlar.

    + +

    <Location> bölümleri dosya + sisteminin tamamen dışında işlem görürler. Bunun çeşitli sonuçları olur. + En önemlisi, <Location> + yönergelerinin dosya sistemi konumlarına erişimi denetim altına almak + için kullanılmaması gerekliliğidir. Aynı dosya sistemi konumuna farklı + URL’lerle erişmek mümkün olduğundan bu tür erişim denetimleri hile ile + atlatılabilir olacaktır.

    + +

    <Location> ne zaman + kullanılmalı

    + +

    <Location> yönergesini dosya sistemi + dışındaki içeriğe çeşitli yönergeler uygulamak için kullanın. Dosya + sisteminde bulunan içerik için <Directory> ve <Files> bölümlerini kullanın. Bunun istisnası, + sunucunun tamamına bir yapılandırma uygulamak için kolay bir yol olan + <Location /> kullanımıdır.

    +
    + +

    Kaynağa yapılan (vekil olmayan) tüm istekler için eşleşecek URL, + /yol/ şeklinde bir URL yolu olmalı; ne şema, ne konak ismi + ne port ne de sorgu dizgesi içermelidir. Vekil istekleri için eşleşecek + URL ise şema://sunucuadı/dosya-yolu şeklinde olmalı ve önek + içermelidir.

    + +

    URL içinde dosya kalıp karakterleri kullanılabilir. Dosya kalıp + karakterleri bulunan bir dizgede bulunan ? karakteri + herhangi bir tek karakterle eşleşirken * karakteri herhangi + bir karakter dizisi ile eşleşecektir.

    + +

    Ayrıca, ~ karakteri eşliğinde gelişkin → düzenli ifadeler de kullanılabilir. Örneğin,

    + +

    + <Location ~ "/(ek|hususi)/veri"> +

    + +

    yönergesi /ek/veri ve /hususi/veri alt + dizgeleriyle eşleşecektir. <LocationMatch> yönergesi <Location> yönergesinin düzenli ifade sürümüne + eşdeğer davranır.

    + +

    <Location> işlevselliği özellikle + SetHandler yönergesi ile birlikte + kullanışlı olur. Örneğin, durum isteklerini etkin kılmak ama sadece + mesela.dom’dan gelen isteklere izin vermek için şöyle bir + uygulama yapabilirsiniz:

    + +

    + <Location /status>
    + + SetHandler server-status
    + Order Deny,Allow
    + Deny from all
    + Allow from .mesela.dom
    +
    + </Location> +

    + +

    / (bölü çizgisi) hakkında

    +

    Bölü çizgisinin URL içinde bulunduğu yere bağlı olarak özel anlamları + vardır. Dosya sistemindeki çok sayıda yanyana kullanımının tek bir bölü + çizgisi olarak ele alındığı duruma alışkın olanlar olabilir (yani, + /home///foo ile /home/foo aynıdır). URL + uzayında bunun böyle olması gerekli değildir. Eğer çok sayıda bölü + çizgisini yanyana belirtmeniz gerekiyorsa <LocationMatch> yönergesinde ve <Location> yönergesinin düzenli ifadeli + kullanımında bunu açıkça belirtmeniz gerekir.

    + +

    Örneğin, <LocationMatch ^/abc> yönergesi + /abc ile eşleşecek ama //abc ile + eşleşmeyecektir. <Location> + yönergesinin düzenli ifade içermeyen kullanımındaki davranış vekil + isteklerinde kullanılana benzer ve doğrudan kaynağa yapılan (vekil + olmayan) isteklerde çok sayıda bölü çizgisi dolaylı olarak tek bir bölü + çizgisiyle eşleşecektir. Örneğin, <Location + /abc/def> belirtirseniz ve istek /abc//def + şeklinde olursa bu ikisi eşleşir.

    +
    + +

    Ayrıca bakınız:

    + +
    +
    top
    +

    <LocationMatch> Yönergesi

    + + + + + + +
    Açıklama:İçerdiği yönergeler sadece düzenli ifadelerle eşleşen URL’lere +uygulanır.
    Sözdizimi:<LocationMatch + düzifade> ... </LocationMatch>
    Bağlam:sunucu geneli, sanal konak
    Durum:Çekirdek
    Modül:core
    +

    <LocationMatch> yönergesi içerdiği + yönergelerin etki alanını <Location> yönergesinin yaptığı gibi belirtilen URL’lerle + sınırlar. Ancak argüman olarak basit bir dizge değil bir → düzenli ifade alır. Örneğin,

    + +

    + <LocationMatch "/(ek|hususi)/veri"> +

    + +

    yönergesi /ek/veri ve /hususi/veri alt + dizgeleriyle eşleşecektir.

    + +

    Ayrıca bakınız:

    + +
    +
    top
    +

    LogLevel Yönergesi

    + + + + + + + +
    Açıklama:Hata günlüklerinin ayrıntı seviyesini belirler.
    Sözdizimi:LogLevel seviye
    Öntanımlı:LogLevel warn
    Bağlam:sunucu geneli, sanal konak
    Durum:Çekirdek
    Modül:core
    +

    LogLevel yönergesi hata günlüklerine kaydedilen + hata iletilerinde hangi ayrıntılara yer verileceğini belirler (ErrorLog yönergesine bakınız). En yüksek önem + derecesinden başlayarak olası seviye değerleri aşağıda + sıralanmıştır:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Seviye Açıklama Örnek
    emerg Acil durumlar - sistem kullanışsız."Child cannot open lock file. Exiting"
    (Alt süreç kilit + dosyasını açamıyor. Çıkılıyor)
    alert Ne yapılacaksa beklemeden yapılmalı."getpwuid: couldn't determine user name from uid"
    (getpwuid: + Kullanıcı ismi numarasından saptanamadı)
    crit Kriz durumları."socket: Failed to get a socket, exiting child"
    (socket: bir + soket alınamadı, alt süreç çıkıyor)
    error Hata durumları."Premature end of script headers"
    (Betik başlıkları + beklenmedik şekilde bitti)
    warn Uyarı durumları."child process 1234 did not exit, sending another + SIGHUP"
    (1234 alt süreci çıkmadı, başka bir SIGHUP + gönderiliyor)
    notice Normal fakat önemli durum."httpd: caught SIGBUS, attempting to dump core in + ..."
    (httpd: SIGBUS alındı, core dökümlenmeye çalışılıyor: + ...)
    info Bilgilendirme."Server seems busy, (you may need to increase + StartServers, or Min/MaxSpareServers)..."
    (Sunucu meşgul + görünüyor, (StartServers veya Min/MaxSpareServers değerlerini + arttırmanız gerekebilir)...)
    debug Hata ayıklama seviyesi iletileri"Opening config file ..."
    (... yapılandırma dosyası + açılıyor)
    + +

    Belli bir seviye belirtildiğinde daha yüksek seviyeden iletiler de + raporlanır. Örneğin, LogLevel info belirtildiğinde + notice ve warn günlük seviyelerinin iletileri + ayrıca raporlanacaktır.

    + +

    En az crit seviyesinin kullanılması önerilir.

    + +

    Örnek:

    + +

    + LogLevel notice +

    + +

    Ek Bilgi

    +

    Günlük iletileri normal bir dosyaya yazılırken notice + seviyesinden iletiler engellenemez ve dolayısıyla daima raporlanırlar. + Ancak, günlük kaydı syslog kullanılarak yapılıyorsa bu + uygulanmaz.

    +
    + +
    +
    top
    +

    MaxKeepAliveRequests Yönergesi

    + + + + + + + +
    Açıklama:Bir kalıcı bağlantıda izin verilen istek sayısı
    Sözdizimi:MaxKeepAliveRequests sayı
    Öntanımlı:MaxKeepAliveRequests 100
    Bağlam:sunucu geneli, sanal konak
    Durum:Çekirdek
    Modül:core
    +

    MaxKeepAliveRequests yönergesi KeepAlive etkinken bağlantı başına izin + verilecek istek sayısını sınırlar. Değer olarak 0 + belirtilirse istek sayısı sınırsız olur. Sunucu başarımını yüksek tutmak + için yüksekçe bir değer belirtmenizi öneririz.

    + +

    Örnek:

    + +

    + MaxKeepAliveRequests 500 +

    + +
    +
    top
    +

    NameVirtualHost Yönergesi

    + + + + + + +
    Açıklama:İsme dayalı sanal konaklar için IP adresi belirtir
    Sözdizimi:NameVirtualHost adres[:port]
    Bağlam:sunucu geneli
    Durum:Çekirdek
    Modül:core
    +

    NameVirtualHost yönergesi isme dayalı sanal konakları yapılandırmak isterseniz gerekli olur. +

    + +

    adres olarak bir konak ismi de belirtebilirsiniz ama daima + bir IP adresi kullanmanızı öneririz. Örnek:

    + +

    + NameVirtualHost 111.22.33.44 +

    + +

    NameVirtualHost yönergesi ile sunucunun isme + dayalı sanal konaklar için istekleri hangi IP adresinden alacağı + belirtilir. Bu adres genellikle isme dayalı sanal konak isimleri + çözümlendiğinde elde edilen IP adresidir. İstekleri bir güvenlik + duvarının veya bir vekilin alıp sunucuya yönlendirdiği durumlarda ise bu + adres sunucunun istekleri aldığı fiziksel arabirimin IP adresi olmalıdır. + Çok sayıda adres üzerinde çok sayıda isme dayalı sanal konak varsa her + adresin kendi yönergeleri olmalıdır.

    + +

    Ek Bilgi

    +

    “Ana sunucu” ve _default_ sunucuların bir + NameVirtualHost IP adresine yapılan bir isteği + asla sunmayacağına dikkat ediniz (bir sebeple + NameVirtualHost belirtip bu adres için herhangi + bir VirtualHost tanımlamadığınız durumlar + hariç).

    +
    + +

    Seçimlik olarak, isme dayalı sanal konakların kullanması gereken port + numarasını örnekteki gibi belirtebilirsiniz:

    + +

    + NameVirtualHost 111.22.33.44:8080 +

    + +

    IPv6 adresleri belirtilirken örnekteki gibi köşeli ayraçlar arasına + alınmalıdır:

    + +

    + NameVirtualHost [2001:db8::a00:20ff:fea7:ccea]:8080 +

    + +

    İsteklerin bütün arabirimlerden alınacağını belirtmek için değer olarak + * belirtebilirsiniz:

    + +

    + NameVirtualHost * +

    + +

    <VirtualHost> yönergesinin + argümanı

    +

    <VirtualHost> yönergesinin + argümanının NameVirtualHost yönergesininkiyle tam + olarak eşleşmesi gerektiğine dikkat ediniz.

    + +

    + NameVirtualHost 1.2.3.4
    + <VirtualHost 1.2.3.4>
    + # ...
    + </VirtualHost>
    +

    +
    + +

    Ayrıca bakınız:

    + +
    +
    top
    +

    Options Yönergesi

    + + + + + + + + +
    Açıklama:Belli bir dizinde geçerli olacak özellikleri yapılandırır. +
    Sözdizimi:Options + [+|-]seçenek [[+|-]seçenek] ...
    Öntanımlı:Options All
    Bağlam:sunucu geneli, sanal konak, dizin, .htaccess
    Geçersizleştirme:Options
    Durum:Çekirdek
    Modül:core
    +

    Options yönergesi belli bir dizinde hangi sunucu + özelliklerinin etkin olacağını (veya olmayacağını) belirler.

    + +

    seçenek olarak hiçbir ek özellik etkin olmayacaksa + None, aksi takdirde aşağıdakilerden biri veya bir kaçı + belirtilir:

    + +
    +
    All
    +
    MultiViews hariç tüm seçenekler. Bu öntanımlıdır.
    + +
    ExecCGI
    +
    mod_cgi kullanan CGI betiklerinin çalışmasına izin + verilir.
    + +
    FollowSymLinks
    +
    Sunucu bu dizindeki sembolik bağları izler. +
    +

    Sembolik bağlar izlense bile <Directory> bölümleriyle eşleşen dosya yolları + değiştirilmez.

    +

    Ayrıca, bu seçenek bir <Location> bölümü içinde belirtildiği takdirde yok + sayılır.

    +
    + +
    Includes
    +
    mod_include tarafından sağlanan sunucu taraflı + içeriklere izin verilir.
    + +
    IncludesNOEXEC
    +
    Sunucu taraflı içeriklere izin verilir fakat #exec cmd + ve #exec cgi iptal edilir. Ancak, ScriptAlias’lı dizinlerdeki CGI + betikleri için #include virtual hala mümkün olacaktır.
    + +
    Indexes
    +
    İstenen URL bir dizin ile eşleşiyorsa ve bu dizin için bir DirectoryIndex (index.html + gibi) belirtilmemişse mod_autoindex bu dizinin + biçimlenmiş bir listesini döndürecektir.
    + +
    MultiViews
    +
    mod_negotiation kullanılarak içerik uzlaştırmalı çok + görünümlü içeriğe izin verilir.
    + +
    SymLinksIfOwnerMatch
    +
    Sunucu sembolik bağları sadece sembolik bağın hedefi ile bulunduğu + dizinin sahibinin aynı kullanıcı olması halinde izleyecektir. + +

    Ek Bilgi

    Bu seçenek bir <Location> bölümü içinde belirtildiğinde yok + sayılır.

    +
    +
    + +

    Normalde, bir dizine çok sayıda Options + uygulanabilirse de, dizine en uygun olanı uygulanıp diğerleri yok + sayılır; seçenekler katıştırılmaz (bkz, Bölümler Nasıl Katıştırılır?). Bununla birlikte, önüne bir + + veya - simgesi konmuş seçenekler varsa, o + seçenekler katıştırılır. Önüne + konmuş seçenekler + mevcutlara eklenirken - konmuş seçenekler silinir.

    + +

    Uyarı

    +

    + veya - imli seçenekler içeren + Options ile imsiz seçenekler içerenlerin karışık + olarak kullanılması beklenmedik sonuçlara yol açması sebebiyle aslında + geçersiz bir sözdizimidir.

    +
    + +

    Örneğin, + ve - imleri olmaksızın,

    + +

    + <Directory /web/docs>
    + + Options Indexes FollowSymLinks
    +
    + </Directory>
    +
    + <Directory /web/docs/spec>
    + + Options Includes
    +
    + </Directory> +

    + +

    yapılandırmasıyla /web/docs/spec dizininde sadece + Includes seçeneği etkin olacaktır. Bununla birlikte, ikinci + Options yönergesinde + ve + - imleri kullanılırsa,

    + +

    + <Directory /web/docs>
    + + Options Indexes FollowSymLinks
    +
    + </Directory>
    +
    + <Directory /web/docs/spec>
    + + Options +Includes -Indexes
    +
    + </Directory> +

    + +

    yapılandırmasıyla /web/docs/spec dizininde + FollowSymLinks ve Includes seçenekleri etkin + olacaktır.

    + +

    Ek Bilgi

    +

    -IncludesNOEXEC veya -Includes kullanımı, + önceki ayarların ne olduğuna bakılmaksızın sunucu taraflı içeriğin + tamamen iptaline sebep olur.

    +
    + +

    Herhangi bir başka değer belirtilmedikçe All + öntanımlıdır.

    + +
    +
    top
    +

    Require Yönergesi

    + + + + + + + +
    Açıklama:Bir özkaynağa erişebilecek kimliği doğrulanmış kullanıcıları +belirler
    Sözdizimi:Require öğe-adı [öğe-adı] ...
    Bağlam:dizin, .htaccess
    Geçersizleştirme:AuthConfig
    Durum:Çekirdek
    Modül:core
    +

    Bu yönerge bir özkaynağa erişebilecek kimliği doğrulanmış kullanıcıları + belirlemek için kullanılır. İzin verilen bazı sözdizimleri:

    + +
    +
    Require user kull-kiml [kull-kiml] + ...
    +
    Sadece belirtilen kullanıcılar özkaynağa erişebilir.
    + +
    Require group grup-adı [grup-adı] + ...
    +
    Sadece belirtilen gruplara üye kullanıcılar özkaynağa erişebilir.
    + +
    Require valid-user
    +
    Geçerli kullanıcıların hepsi özkaynağa erişebilir.
    +
    + +

    Require yönergesinin düzgün çalışması için + kendisine AuthName ve AuthType yönergelerinin yanı sıra kullanıcıları + ve grupları tanımlamak için AuthUserFile ve AuthGroupFile gibi yönergelerinin de eşlik + etmesi gerekir. Örnek:

    + +

    + AuthType Basic
    + AuthName "Restricted Resource"
    + AuthUserFile /web/users
    + AuthGroupFile /web/groups
    + Require group admin +

    + +

    Bu yolla uygulanan erişim denetimleri tüm yöntemler + için etkilidir. Normalde istenen zaten budur. Erişim + denetimlerini diğerlerini korumasız bırakmak pahasına sadece belli + yöntemlerle sınırlamak isterseniz Require + yönergesini bir <Limit> + bölümüne yerleştirin.

    + +

    Ayrıca bakınız:

    + +
    +
    top
    +

    RLimitCPU Yönergesi

    + + + + + + + + +
    Açıklama:Apache alt süreçleri tarafından çalıştırılan süreçlerin işlemci +tüketimine sınırlama getirir.
    Sözdizimi:RLimitCPU saniye|max [saniye|max]
    Öntanımlı:Bir değer belirtilmemiştir; işletim sistemi öntanımlıları kullanılır +
    Bağlam:sunucu geneli, sanal konak, dizin, .htaccess
    Geçersizleştirme:All
    Durum:Çekirdek
    Modül:core
    +

    1 veya 2 değer alır. İlk değer bütün süreçler için sanal özkaynak + sınırını, ikinci değer ise kesin özkaynak sınırını belirler. İki değer de + birer sayı olabileceği gibi bu sınırın işletim sistemi yapılandırmasında + izin verilen üst sınıra ayarlanacağını belirtmek üzere max + olabilir. Kesin özkaynak sınırını yükseltmek için sunucunun + root olarak veya sistem açılışı sırasında çalıştırılması + gerekir.

    + +

    Bu sınırlar Apache’nin kendi alt süreçlerine değil, isteklere yanıt + verirken Apache alt süreçlerinin çatalladıkları süreçlere uygulanır. + Bunlar CGI betikleri ve SSI çalıştırma komutları olabilir fakat borulu + günlük kaydı gibi ana Apache süreci tarafından çatallanmış süreçler + olmazlar.

    + +

    İşlemci özkaynak sınırları saniye cinsinden ifade edilir.

    + +

    Ayrıca bakınız:

    + +
    +
    top
    +

    RLimitMEM Yönergesi

    + + + + + + + + +
    Açıklama:Apache alt süreçleri tarafından çalıştırılan süreçlerin bellek +tüketimine sınırlama getirir.
    Sözdizimi:RLimitMEM bayt-sayısı|max [bayt-sayısı|max] +
    Öntanımlı:Bir değer belirtilmemiştir; işletim sistemi öntanımlıları kullanılır +
    Bağlam:sunucu geneli, sanal konak, dizin, .htaccess
    Geçersizleştirme:All
    Durum:Çekirdek
    Modül:core
    +

    1 veya 2 değer alır. İlk değer bütün süreçler için sanal özkaynak + sınırını, ikinci değer ise kesin özkaynak sınırını belirler. İki değer de + birer sayı olabileceği gibi bu sınırın işletim sistemi yapılandırmasında + izin verilen üst sınıra ayarlanacağını belirtmek üzere max + olabilir. Kesin özkaynak sınırını yükseltmek için sunucunun + root olarak veya sistem açılışı sırasında çalıştırılması + gerekir.

    + +

    Bu sınırlar Apache’nin kendi alt süreçlerine değil, isteklere yanıt + verirken Apache alt süreçlerinin çatalladıkları süreçlere uygulanır. + Bunlar CGI betikleri ve SSI çalıştırma komutları olabilir fakat borulu + günlük kaydı gibi ana Apache süreci tarafından çatallanmış süreçler + olmazlar.

    + +

    Bellek özkaynak sınırları süreç başına bayt sayısı olarak ifade edilir. +

    + +

    Ayrıca bakınız:

    + +
    +
    top
    +

    RLimitNPROC Yönergesi

    + + + + + + + + +
    Açıklama:Apache alt süreçleri tarafından çalıştırılabilecek süreç sayısına +sınırlama getirir.
    Sözdizimi:RLimitNPROC sayı|max [sayı|max]
    Öntanımlı:Bir değer belirtilmemiştir; işletim sistemi öntanımlıları kullanılır +
    Bağlam:sunucu geneli, sanal konak, dizin, .htaccess
    Geçersizleştirme:All
    Durum:Çekirdek
    Modül:core
    +

    1 veya 2 değer alır. İlk değer bütün süreçler için sanal özkaynak + sınırını, ikinci değer ise kesin özkaynak sınırını belirler. İki değer de + birer sayı olabileceği gibi bu sınırın işletim sistemi yapılandırmasında + izin verilen üst sınıra ayarlanacağını belirtmek üzere max + olabilir. Kesin özkaynak sınırını yükseltmek için sunucunun + root olarak veya sistem açılışı sırasında çalıştırılması + gerekir.

    + +

    Bu sınırlar Apache’nin kendi alt süreçlerine değil, isteklere yanıt + verirken Apache alt süreçlerinin çatalladıkları süreçlere uygulanır. + Bunlar CGI betikleri ve SSI çalıştırma komutları olabilir fakat borulu + günlük kaydı gibi ana Apache süreci tarafından çatallanmış süreçler + olmazlar.

    + +

    Süreç sayısı sınırı kullanıcı başına süreç sayısına sınırlama getirir. +

    + +

    Ek Bilgi

    +

    CGI süreçleri sunucu kullanıcı kimliğinden farklı bir kullanıcı + kimliği altında çalışmıyorsa bu yönerge sunucunun kendi oluşturduğu + süreç sayısını sınırlayacaktır. Bunun kanıtı error_log’da + iletilerin çatallanamamasıdır.

    +
    + +

    Ayrıca bakınız:

    + +
    +
    top
    +

    Satisfy Yönergesi

    + + + + + + + + + +
    Açıklama:Konak seviyesinde erişim denetimi ile kullanıcı kimlik doğrulaması +arasındaki etkileşim
    Sözdizimi:Satisfy Any|All
    Öntanımlı:Satisfy All
    Bağlam:dizin, .htaccess
    Geçersizleştirme:AuthConfig
    Durum:Çekirdek
    Modül:core
    Uyumluluk:2.0.51 sürümü ve sonrasında <Limit> ve <LimitExcept> tarafından etkin kılınır.
    +

    Allow ve Require yönergelerinin ikisi birden + kullanıldığında uygulanacak erişim kuralını belirler. Değer olarak sadece + All veya Any belirtilebilir. Bu yönergenin + yararlı olabilmesi için belli bir alana hem istemci konak adresi hem de + kullanıcı ismi ve parolası belirtmek suretiyle erişilebiliyor olunması + gerekir. Bu durumda öntanımlı davranış (All), istemcinin + belli bir adrese erişebilmek için belli kısıtlamaları aşması ve geçerli + bir kullanıcı adı ve parola girmesi gerekir. Any seçeneğinin + belirtildiği durumda ise istemcinin ya konak kısıtlamalarıdan geçmesi ya + da geçerli bir kullanıcı adı ve parolası girmesi gerekir. Bu seçenek, + belli bir alana erişimi parolayla kısıtlayıp, belli adreslerden gelen + kullanıcılara parolasız erişim vermek için kullanılabilir.

    + +

    Örneğin, sitenizin belli bir bölümü için iç ağınızdan gelen isteklere + sınırsız erişim vermek ama dışardan gelen istekleri parolayla kısıtlamak + isterseniz şöyle bir yapılandırma kullanabilirsiniz:

    + +

    + Require valid-user
    + Allow from 192.168.1
    + Satisfy Any +

    + +

    2.0.51 sürümünden itibaren Satisfy yönergeleri + <Limit> ve <LimitExcept> bölümleri tarafından + belli yöntemlerle kullanılmak üzere kısıtlanmış olabilir.

    + +

    Ayrıca bakınız:

    + +
    +
    top
    +

    ScriptInterpreterSource Yönergesi

    + + + + + + + + + +
    Açıklama:CGI betikleri için yorumlayıcı belirleme tekniği
    Sözdizimi:ScriptInterpreterSource Registry|Registry-Strict|Script
    Öntanımlı:ScriptInterpreterSource Script
    Bağlam:sunucu geneli, sanal konak, dizin, .htaccess
    Geçersizleştirme:FileInfo
    Durum:Çekirdek
    Modül:core
    Uyumluluk:Sadece Win32 için; Registry-Strict seçeneği Apache +2.0 ve sonrası için geçerlidir.
    +

    Bu yönerge Apache’nin CGI betiklerini çalıştıracak yorumlayıcıyı nasıl + tespit edeceğini belirler. Script öntanımlı olup Apache’nin + yorumlayıcı olarak betiğin diyezli ünlem satırında (#! ile + başlayan ilk satır) belirtilen yorumlayıcıyı kullanacağını belirtir. + Win32 sistemlerinde bu satır genellikle şöyledir:

    + +

    + #!C:/Perl/bin/perl.exe +

    + +

    perl yorumlayıcının yeri PATH değişkeninde + kayıtlı ise şöyle de olabilir:

    + +

    + #!perl +

    + +

    ScriptInterpreterSource Registry değeri ise betik dosyası + uzantısının (.pl gibi) Windows Sicili içindeki + HKEY_CLASSES_ROOT ağacında arama yapmak için bir arama + anahtarı olarak kullanılmasını sağlar. Betik dosyasını çalıştırmak için + tanımlanmış komutu bulmak için Shell\ExecCGI\Command yoluna, + orada yoksa Shell\Open\Command yoluna bakılır. İkisi de + yoksa son çare olarak Script seçeneğinin davranışına + dönülür.

    + +

    Güvenlik

    +

    ScriptAlias’lı dizinlerde + Apache bulduğu her dosyayı çalıştırmayı deneyeceğinden + ScriptInterpreterSource Registry yapılandırmasını + kullanırken dikkatli olun. Registry seçeneği genellikle + çalıştırılmayacak dosyalar için istenmeyen program çağrılarına sebep + olabilir. Örneğin, çoğu Windows sisteminde .htm dosyaları + için ön tanımlı "open" komutu Microsoft Internet Explorer’ın + çalıştırılmasına sebep olur; bu bakımdan, betik dizininde bulunan bir + .htm dosyası için yapılan bir HTTP isteği tarayıcının sunucu + artalanında çalıştırılmasına sebep olacaktır. Bu, sistemi bir kaç dakika + içinde çökertmek için iyi bir yoldur.

    +
    + +

    Registry-Strict seçeneği Apache 2.0’da yeni olup + Registry seçeneğinin yaptığını + Shell\ExecCGI\Command yolu için yapar. ExecCGI + sistem tarafından bilinen bir anahtar olmadığından Windows Siciline elle + kaydedilmesi gerekir ve dolayısıyla sisteminiz üzerinde istenmeyen + program çağrılarına sebep olmaz.

    + +
    +
    top
    +

    ServerAdmin Yönergesi

    + + + + + + +
    Açıklama:Sunucunun hata iletilerinde istemciye göstereceği eposta adresi +
    Sözdizimi:ServerAdmin eposta-adresi
    Bağlam:sunucu geneli, sanal konak
    Durum:Çekirdek
    Modül:core
    +

    ServerAdmin yönergesi, sunucunun bir hata + durumunda istemciye döndüreceği hata iletilerinde içereceği eposta + adresini belirtmek için kullanılır.

    + +

    Kullanıcıların sunucu hakkında konuşurken isminizden bahsetmemeleri için + burada belirtilecek adresin sırf bu işe adanmış bir adres olması daha + iyidir. Örnek:

    + +

    + ServerAdmin www-admin@falan.filan.dom +

    + +
    +
    top
    +

    ServerAlias Yönergesi

    + + + + + + +
    Açıklama:İstekleri isme dayalı sanal konaklarla eşleştirilirken +kullanılacak konak adları için başka isimler belirtebilmeyi sağlar. +
    Sözdizimi:ServerAlias konakadı [konakadı] ...
    Bağlam:sanal konak
    Durum:Çekirdek
    Modül:core
    +

    ServerAlias yönergesi, istekleri isme dayalı sanal konaklarla + eşleştirilirken kullanılacak konak adları için başka isimler + belirtebilmeyi sağlar.

    + +

    + <VirtualHost *>
    + ServerName sunucu.mesela.dom
    + ServerAlias sunucu sunucu2.mesela.dom sunucu2
    + # ...
    + </VirtualHost> +

    + +

    Ayrıca bakınız:

    + +
    +
    top
    +

    ServerName Yönergesi

    + + + + + + + +
    Açıklama:Sunucunun özdeşleşeceği konak ismi ve port.
    Sözdizimi:ServerName tam-nitelenmiş-alan-adı[:port] +
    Bağlam:sunucu geneli, sanal konak
    Durum:Çekirdek
    Modül:core
    Uyumluluk:Bu yönerge 2.0 sürümünden itibaren 1.3 sürümündeki +Port yönergesinin işlevselliğini de +üstlenmiştir.
    +

    ServerName yönergesi, sunucunun kendini + betimlemekte kullanacağı konak adı ve port değerlerini belirler. + Bu, yönlendirme URL’leri oluşturulurken kullanılır. Örneğin, HTTP + sunucusunun barındırıldığı makinenin ismi falan.filan.dom + olduğu halde makinenin bir de www.filan.dom diye bir de DNS + rumuzu varsa ve HTTP sunucunuzun bu rumuzla kendini özdeşleştirmesini + isterseniz bunu şöyle belirtebilirsiniz:

    + +

    + ServerName www.filan.dom:80 +

    + +

    Bir ServerName ataması yapılmamışsa sunucu IP + adresine atanmış sunucu ismi için bir ters DNS sorgusu yapacaktır. + ServerName yönergesinde bir port belirtilmediği + takdirde sunucu, isteğin geldiği portu kullanacaktır. Öngörülebilirlik ve + güvenilirlik açısından en iyisi ServerName + yönergesini kullanarak açıkça bir konak ismi ve port belirtmektir.

    + +

    İsme dayalı sanal konaklar + kullanıyorsanız, <VirtualHost> bölümü içindeki + ServerName yönergesi, isteğin Host: + başlığında bu sanal konakla eşleşecek konak ismini belirler.

    + + +

    Sunucunun kendine yönelik URL’lerin belirtilen portu içerip içermediğini + veya istemcinin yaptığı istekte belirtilen port numarasının verilip + verilmediğinin saptanmasını sağlayan (örneğin, mod_dir + modülü tarafından) ayarlar için UseCanonicalName yönergesinin açıklamalarına + bakınız.

    + + +

    Ayrıca bakınız:

    + +
    +
    top
    +

    ServerPath Yönergesi

    + + + + + + +
    Açıklama:Uyumsuz bir tarayıcı tarafından erişilmesi için bir isme dayalı +sanal konak için meşru URL yolu
    Sözdizimi:ServerPath URL-yolu
    Bağlam:sanal konak
    Durum:Çekirdek
    Modül:core
    +

    ServerPath yönergesi isme + dayalı sanal konaklarda kullanmak için konağa meşru bir URL yolu + belirler.

    + +

    Ayrıca bakınız:

    + +
    +
    top
    +

    ServerRoot Yönergesi

    + + + + + + + +
    Açıklama:Sunucu yapılandırması için kök dizin
    Sözdizimi:ServerRoot dizin-yolu
    Öntanımlı:ServerRoot /usr/local/apache
    Bağlam:sunucu geneli
    Durum:Çekirdek
    Modül:core
    +

    ServerRoot yönergesi sunucu yapılandırmasını + içeren dizinin yerini belirtir. Genellikle conf/ ve + logs/ gibi alt dizinler içerir. Include, LoadModule gibi diğer yapılandırma + yönergelerindeki göreli yollar bu dizine göre ele alınır.

    + +

    Örnek

    + ServerRoot /home/httpd +

    + + +

    Ayrıca bakınız:

    + +
    +
    top
    +

    ServerSignature Yönergesi

    + + + + + + + + +
    Açıklama:Sunucu tarafından üretilen belgelerin dipnotunu ayarlar. +
    Sözdizimi:ServerSignature On|Off|EMail
    Öntanımlı:ServerSignature Off
    Bağlam:sunucu geneli, sanal konak, dizin, .htaccess
    Geçersizleştirme:All
    Durum:Çekirdek
    Modül:core
    +

    ServerSignature yönergesi, sunucu tarafından + üretilen belgelerin (hata iletileri, mod_proxy ftp dizin + listeleri, mod_info çıktısı, vs.) altındaki dipnot + satırını yapılandırabilmenizi sağlar. Böyle bir dipnot satırın + istenmesinin sebebi vekil zincirlerinde istemciye dönen hata iletisinin + aslında hangi sunucu tarafından üretildiğini kullanıcıya bildirmektir.

    + +

    Off değeri öntanımlı değer olup dipnot satırının + gösterilmemesini sağlar (Apache-1.2 ve öncesi ile uyumluluk). + On değeri, sunucu sürüm numarası ve hizmeti sunan sanal + konağın isminden (ServerName) oluşan + bir dipnot satırı oluşturulmasını sağlar; EMail değeri bu + ikisine ek olarak satıra ServerAdmin + ile belirtilen adres için bir "mailto:" bağı ekler.

    + +

    2.0.44 sürümünden beri sunucu sürüm numarasının ayrıntıları ServerTokens yönergesi ile belirlenmektedir.

    + +

    Ayrıca bakınız:

    + +
    +
    top
    +

    ServerTokens Yönergesi

    + + + + + + + +
    Açıklama:Server HTTP yanıt başlığını yapılandırır. +
    Sözdizimi:ServerTokens Major|Minor|Min[imal]|Prod[uctOnly]|OS|Full
    Öntanımlı:ServerTokens Full
    Bağlam:sunucu geneli
    Durum:Çekirdek
    Modül:core
    +

    Bu yönerge Server HTTP yanıt başlığı alanında istemcilere + sunucunun işletim sistemi, sunucuyla derlenmiş modüller, vs. hakkında + bilgi verilip verilmeyeceğini belirler.

    + +
    +
    ServerTokens Prod[uctOnly]
    + +
    Sunucu şunu gönderir (örnek): Server: + Apache
    + +
    ServerTokens Major
    + +
    Sunucu şunu gönderir (örnek): Server: + Apache/2
    + +
    ServerTokens Minor
    + +
    Sunucu şunu gönderir (örnek): Server: + Apache/2.0
    + +
    ServerTokens Min[imal]
    + +
    Sunucu şunu gönderir (örnek): Server: + Apache/2.0.41
    + +
    ServerTokens OS
    + +
    Sunucu şunu gönderir (örnek): Server: Apache/2.0.41 + (Unix)
    + +
    ServerTokens Full (ya da belirtilmezse)
    + +
    Sunucu şunu gönderir (örnek): Server: Apache/2.0.41 + (Unix) PHP/4.2.2 MyMod/1.2
    +
    + +

    Bu ayarlama sunucunun tamamını etkiler ve her sanal konak için + farklılaştırılamaz.

    + +

    2.0.44 sürümünden itibaren bu yönerge ServerSignature yönergesi tarafından sunulan + bilgiyi de etkilemektedir.

    + +

    Ayrıca bakınız:

    + +
    +
    top
    +

    SetHandler Yönergesi

    + + + + + + + + +
    Açıklama:Eşleşen tüm dosyaların belli bir eylemci tarafından işlenmesine +sebep olur.
    Sözdizimi:SetHandler eylemci-ismi|None
    Bağlam:sunucu geneli, sanal konak, dizin, .htaccess
    Geçersizleştirme:FileInfo
    Durum:Çekirdek
    Modül:core
    Uyumluluk:Apache 2.0’da core modülüne taşındı.
    +

    Bir .htaccess dosyasına veya bir <Directory> ya da <Location> bölümüne yerleştirildiğinde, eşleşen + tüm dosyaların, ismi eylemci-ismi ile belirtilen eylemci tarafından çözümlenmesine sebep olur. + Örneğin, bir dizin içindeki bütün dosyaların, uzantılarına bakılmaksızın + birer imagemap kural dosyası olarak çözümlenmesini istersiniz, bu dizin + içindeki bir .htaccess dosyasına şöyle bir satır + koyabilirsiniz:

    + +

    + SetHandler imap-file +

    + +

    Başka bir örnek: http://localhost/status gibi bir istek + yapıldığında sunucunun bir durum bilgisi göstermesi için + httpd.conf dosyasına şöyle bir satır koyabilirsiniz:

    + +

    + <Location /status>
    + + SetHandler server-status
    +
    + </Location> +

    + +

    Evvelce tanımlanmış bir SetHandler yönergesini + None değeriyle geçersiz hale getirebilirsiniz.

    + +

    Ayrıca bakınız:

    + +
    +
    top
    +

    SetInputFilter Yönergesi

    + + + + + + + +
    Açıklama:POST girdilerini ve istemci isteklerini işleyecek süzgeçleri +belirler.
    Sözdizimi:SetInputFilter süzgeç[;süzgeç...]
    Bağlam:sunucu geneli, sanal konak, dizin, .htaccess
    Geçersizleştirme:FileInfo
    Durum:Çekirdek
    Modül:core
    +

    SetInputFilter yönergesi, istemci isteklerini ve + sunucu tarafından alındığı takdirde POST girdisini işleyecek süzgeç veya + süzgeçleri belirler. Bu, diğer AddInputFilter yönergeleri dahil evvelce tanımlanmış + süzgeçlere eklenir.

    + +

    Birden fazla süzgeç belirtilmek istenirse birbirlerinden noktalı + virgüllerle ayrılmalı ve çıktıyı işleyecekleri sıraya uygun olarak + sıralanmalıdırlar.

    + +

    Ayrıca bakınız:

    + +
    +
    top
    +

    SetOutputFilter Yönergesi

    + + + + + + + +
    Açıklama:Sunucunun yanıtlarını işleyecek süzgeçleri belirler.
    Sözdizimi:SetOutputFilter süzgeç[;süzgeç...]
    Bağlam:sunucu geneli, sanal konak, dizin, .htaccess
    Geçersizleştirme:FileInfo
    Durum:Çekirdek
    Modül:core
    +

    SetOutputFilter yönergesi, istemciye + gönderilmeden önce sunucunun yanıtlarını işleyecek süzgeçleri belirler. + Bu, diğer AddOutputFilter + yönergeleri dahil evvelce tanımlanmış süzgeçlere eklenir.

    + +

    Örneğin, aşağıdaki yapılandırma ile /www/data/ dizinindeki + bütün dosyalar sunucu taraflı içerik kapsamında ele alınacaktır.

    + +

    + <Directory /www/data/>
    + + SetOutputFilter INCLUDES
    +
    + </Directory> +

    + +

    Birden fazla süzgeç belirtilmek istenirse birbirlerinden noktalı + virgüllerle ayrılmalı ve çıktıyı işleyecekleri sıraya uygun olarak + sıralanmalıdırlar.

    + +

    Ayrıca bakınız:

    + +
    +
    top
    +

    TimeOut Yönergesi

    + + + + + + + +
    Açıklama:Bir istek için başarısız olmadan önce belirli olayların +gerçekleşmesi için sunucunun geçmesini bekleyeceği süre.
    Sözdizimi:TimeOut saniye
    Öntanımlı:TimeOut 300
    Bağlam:sunucu geneli, sanal konak
    Durum:Çekirdek
    Modül:core
    +

    TimeOut yönergesi Apache’nin aşağıdaki üç durum + için bekleyeceği süreyi belirler:

    + +
      +
    1. Bir GET isteğini almak için geçecek toplam süre.
    2. + +
    3. Bir POST veya PUT isteğinde TCP paketlerinin alımları arasında geçen + süre.
    4. + +
    5. Yanıtlarda TCP paketlerinin aktarımı için alındılar arasında geçen + süre.
    6. +
    +

    Bunları ileride ayrı ayrı yapılandırılabilir kılmayı planlıyoruz. 1.2 + öncesinde zaman aşımı öntanımlı olarak 1200 saniye idi, fakat çoğu durum + için hala gereğinden fazla olsa bile şimdi 300 saniyeye düşürüldü. Kodun + içinde, bir paket gönderilmediği takdirde zaman aşımı değerinin + sıfırlanmadan kaldığı tuhaf yerler bulunabileceğinden bu değer öntanımlı + değerin altına ayarlanmamalıdır.

    + + +
    +
    top
    +

    TraceEnable Yönergesi

    + + + + + + + + +
    Açıklama:TRACE isteklerinde davranış şeklini belirler +
    Sözdizimi:TraceEnable [on|off|extended]
    Öntanımlı:TraceEnable on
    Bağlam:sunucu geneli
    Durum:Çekirdek
    Modül:core
    Uyumluluk:Apache 1.3.34, 2.0.55 ve sonrasında mevcuttur.
    +

    Bu yönerge çekirdek ve vekil (mod_proxy) sunucuların + her ikisi için öntanımlı TRACE davranışını değiştirir. + Öntanımlı olan TraceEnable on ile RFC 2616’dan kaynaklanan + ve isteğe herhangi bir istek gövdesinin eşlik etmesine izin vermeyen + TRACE isteklerine izin verilir. TraceEnable off + ile çekirdek ve vekil (mod_proxy) sunucuların her ikisi + de TRACE isteklerine yanıt olarak bir 405 + (Yönteme izin verilmiyor) hatası döndürür.

    + +

    TraceEnable extended ile sadece sınama ve tanı koyma + amaçlarına yönelik olarak istek gövdelerine izin verilir. Asıl sunucu + istek gövdesini 64k ile sınırlar (Transfer-Encoding: chunked + kullanılmışsa bölüm başlıkları için 8k daha). Asıl sunucu yanıt + gövdesinde tüm başlıkları ve bölüm başlıklarının tamamını yansıtacaktır. + Vekil sunucuda ise istek gövdesi için 64k’lık sınır yoktur.

    + +
    +
    top
    +

    UseCanonicalName Yönergesi

    + + + + + + + +
    Açıklama:Sunucunun kendi adını ve portunu nasıl belirleyeceğini ayarlar +
    Sözdizimi:UseCanonicalName On|Off|DNS
    Öntanımlı:UseCanonicalName On
    Bağlam:sunucu geneli, sanal konak, dizin
    Durum:Çekirdek
    Modül:core
    +

    Apache‘nin çoğu durumda özüne yönelik URL‘ler (isteğin tekrar aynı + sunucuya yapıldığı bir URL türü) oluşturması gerekir. + UseCanonicalName On ile Apache, sunucu için meşru ismi ve + portu oluşturmak için ServerName + yönergesinde belirtilen ismi ve portu kullanır. Bu isim CGI'lerde + SERVER_NAME ve SERVER_PORT değerlerinde ve tüm + özüne yönelik URL’lerde kullanılır.

    + +

    UseCanonicalName Off ile Apache, özüne yönelik URL’leri + varsa istemci tarafından sağlanan konak ismini ve portu kullanarak + oluşturur; bunlar istemci tarafından sağlanmamışsa yukarıda tanımlanan + işleme başvurulur. Bu değerler, isme + dayalı sanal konakları gerçekleştirirken kullanılan değerlerle aynı + olup aynı istemcilerle kullanılabilir. SERVER_NAME ve + SERVER_PORT CGI değişkenleri de istemci tarafından sağlanan + isim ve portla oluşturulur.

    + +

    Bir örnek olarak, iç ağdaki istemcilerin sunucuya www gibi + bir kısa isim kullanarak bağlandığı durumu ele alırsak daha yararlı olur. + Kullanıcılar bir kısa isim ve bir dizin isminden oluşan ve bir / ile + sonlandırılmamış http://www/splat şeklinde bir istek + yaparlarsa, Apache onları http://www.mesela.dom/splat/ + adresine yönlendirecektir. Eğer kimlik doğrulama da etkinse bu + kullanıcının iki defa kimlik doğrulamasına sokulmasına sebep olacaktır + (bir kere www için bir kere de www.mesela.dom + için; daha ayrıntılı bilgi için SSS’y + e bakınız). Fakat UseCanonicalName Off olsaydı + Apache isteği http://www/splat/ adresine yönlendirecekti.

    + +

    UseCanonicalName DNS diye üçüncü bir seçenek daha vardır ve + istek yaparken Host: başlığını kullanmayan eski istemcileri + desteklemek amacıyla IP’ye dayalı sanal konaklarla kullanmak için + tasarlanmıştır. Bu seçenek etkin olduğunda Apache, istemciyi özüne + yönelik URL’lerle doğru yere bağlamak için sunucu IP adresi üzerinde bir + ters DNS sorgusu yapar.

    + +

    Uyarı

    +

    Eğer CGI’ler SERVER_NAME değerleri için önkabuller + yapıyorlarsa bu seçenek işlerinin bozulmasına yol açabilir. Aslında + istemciler konak ismi olarak istedikleri değeri vermekte özgürdürler. + Fakat eğer CGI, özüne yönelik URL’leri oluştururken sadece + SERVER_NAME değerini kullanıyorsa bu istendiği gibi + çalışacaktır.

    +
    + +

    Ayrıca bakınız:

    + +
    +
    top
    +

    <VirtualHost> Yönergesi

    + + + + + + +
    Açıklama:Sadece belli bir konak ismine ve porta uygulanacak yönergeleri +barındırır.
    Sözdizimi:<VirtualHost + adres[:port] [adres[:port]] + ...> ... </VirtualHost>
    Bağlam:sunucu geneli
    Durum:Çekirdek
    Modül:core
    +

    <VirtualHost> ve + </VirtualHost> birlikte sadece belli bir sanal konağa + uygulanacak yönergeleri sarmalamakta kullanılırlar. Bir sanal konak + kapsamında belirtilebilecek her yönerge kullanılabilir. Sunucu belli bir + sanal konak üzerindeki bir belge için bir istek aldığında <VirtualHost> bölümünde bulunan yapılandırma + yönergelerini kullanır. adres şunlardan biri olabilir:

    + +
      +
    • Sanal konağın IP adresi.
    • + +
    • Sanal konağın IP adresi için tam nitelenmiş alan adı.
    • + +
    • NameVirtualHost * ile birlikte tüm IP adresleri ile + eşleşmek üzere * karakteri.
    • + +
    • Sadece IP sanal konaklarında kullanmak için eşleşmeyen IP adreslerini + yakalamak amacıyla _default_ dizgesi.
    • +
    + +

    Örnek

    + <VirtualHost 10.1.2.3>
    + + ServerAdmin webmaster@konak.mesela.dom
    + DocumentRoot /www/docs/konak.mesela.dom
    + ServerName konak.mesela.dom
    + ErrorLog logs/konak.mesela.dom-error_log
    + TransferLog logs/konak.mesela.dom-access_log
    +
    + </VirtualHost> +

    + + +

    İsteğe bağlı port numarasını belirtmeyi mümkün kılmak için IPv6 + adresleri köşeli ayraç içine alınır. IPv6 adresi kullanılan bir örnek:

    + +

    + <VirtualHost [2001:db8::a00:20ff:fea7:ccea]>
    + + ServerAdmin webmaster@konak.mesela.dom
    + DocumentRoot /www/docs/konak.mesela.dom
    + ServerName konak.mesela.dom
    + ErrorLog logs/konak.mesela.dom-error_log
    + TransferLog logs/konak.mesela.dom-access_log
    +
    + </VirtualHost> +

    + +

    Her sanal konağın ya farklı bir IP adresi ve port ile ya da farklı bir + konak ismiyle eşleşmesi gerekir. Birinci durumda sunucu makinesinin çok + sayıda adresten IP paketleri kabul edecek şekilde yapılandırılması + gerekir. (Eğer makinede çok sayıda ağ arabirimi yoksa bu, işletim sistemi + desteklediği takdirde ifconfig alias komutuyla + sağlanabilir.)

    + +

    Ek Bilgi

    +

    <VirtualHost> kullanımı Apache’nin + dinleyeceği adresler üzerinde belirleyici değildir. Apache’nin doğru + adresi dinlediğinden emin olmak için Listen kullanmanız gerekebilir.

    +
    + +

    IP’ye dayalı sanal konakları kullanıyorsanız, diğer sanal konaklarda + açıkça belirtilmemiş IP adresleriyle eşleşecek sanal konağı + _default_ özel ismiyle belirtebilirsiniz. "Ana" sunucu + yapılandırmasında _default_ diye bir sanal konağın + bulunmaması halinde, hiçbir IP adresi eşleşmesi bulunamadığı takdirde + <VirtualHost> bölümleri dışında kalan + tüm yapılandırmalar bu amaca yönelik olarak kullanılır. (Yalnız dikkat + edin, bir NameVirtualHost yönergesi + ile eşleşen bir IP adresi için ne "ana" sunucu yapılandırması ne de + _default_ sanal konak yapılandırması kullanılır. Bu konuda + daha ayrıntılı bilgi için isme dayalı + sanal konaklar belgesine bakınız.)

    + +

    Eşleşilecek portu değiştirmek için bir :port + belirtebilirsiniz. Port bu şekilde değiştirilmediği takdirde ana + sunucunun son Listen + yönergesinde belirtilen port kullanılır. Bir adresteki tüm portlarla + eşleşileceğini belirtmek için :* kullanabilirsiniz. (Bu, + _default_ kullanıldığı takdirde önerilir.)

    + +

    Güvenlik

    +

    Günlük dosyalarının sunucuyu çalıştıran kullanıcıdan başka herkes + tarafından yazılabilen bir yerde saklanmasından dolayı ortaya çıkabilecek + güvenlik sorunları hakkında daha ayrıntılı bilgi için güvenlik ipuçları belgesine + bakınız.

    +
    + +

    Ayrıca bakınız:

    + +
    +
    +
    +

    Mevcut Diller:  de  | + en  | + es  | + ja  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/directive-dict.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/directive-dict.html new file mode 100644 index 00000000..d9ac8c7c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/directive-dict.html @@ -0,0 +1,21 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: directive-dict.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: directive-dict.html.es +Content-Language: es +Content-type: text/html; charset=ISO-8859-1 + +URI: directive-dict.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: directive-dict.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: directive-dict.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/directive-dict.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/directive-dict.html.en new file mode 100644 index 00000000..a0753b61 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/directive-dict.html.en @@ -0,0 +1,297 @@ + + + +Terms Used to Describe Directives - Apache HTTP Server + + + + + +
    <-
    +

    Terms Used to Describe Directives

    +
    +

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

    +
    + +

    This document describes the terms that are used to describe + each Apache configuration + directive.

    +
    + +
    top
    +
    +

    Description

    + +

    A brief description of the purpose of the directive.

    +
    top
    +
    +

    Syntax

    + +

    This indicates the format of the directive as it would + appear in a configuration file. This syntax is extremely + directive-specific, and is described in detail in the + directive's definition. Generally, the directive name is + followed by a series of one or more space-separated arguments. + If an argument contains a space, the argument must be enclosed + in double quotes. Optional arguments are enclosed in square + brackets. Where an argument can take on more than one possible + value, the possible values are separated by vertical bars "|". + Literal text is presented in the default font, while + argument-types for which substitution is necessary are + emphasized. Directives which can take a variable + number of arguments will end in "..." indicating that the last + argument is repeated.

    + +

    Directives use a great number of different argument types. A + few common ones are defined below.

    + +
    +
    URL
    + +
    A complete Uniform Resource Locator including a scheme, + hostname, and optional pathname as in + http://www.example.com/path/to/file.html
    + +
    URL-path
    + +
    The part of a url which follows the scheme and + hostname as in /path/to/file.html. The + url-path represents a web-view of a resource, as + opposed to a file-system view.
    + +
    file-path
    + +
    The path to a file in the local file-system beginning + with the root directory as in + /usr/local/apache/htdocs/path/to/file.html. + Unless otherwise specified, a file-path which does + not begin with a slash will be treated as relative to the ServerRoot.
    + +
    directory-path
    + +
    The path to a directory in the local file-system + beginning with the root directory as in + /usr/local/apache/htdocs/path/to/.
    + +
    filename
    + +
    The name of a file with no accompanying path information + as in file.html.
    + +
    regex
    + +
    A Perl-compatible regular + expression. The directive definition will specify what the + regex is matching against.
    + +
    extension
    + +
    In general, this is the part of the filename + which follows the last dot. However, Apache recognizes + multiple filename extensions, so if a filename + contains more than one dot, each dot-separated part of the + filename following the first dot is an extension. + For example, the filename file.html.en + contains two extensions: .html and + .en. For Apache directives, you may specify + extensions with or without the leading dot. In + addition, extensions are not case sensitive.
    + +
    MIME-type
    + +
    A method of describing the format of a file which + consists of a major format type and a minor format type, + separated by a slash as in text/html.
    + +
    env-variable
    + +
    The name of an environment + variable defined in the Apache configuration process. + Note this is not necessarily the same as an operating system + environment variable. See the environment variable documentation for + more details.
    +
    +
    top
    +
    +

    Default

    + +

    If the directive has a default value (i.e., if you + omit it from your configuration entirely, the Apache Web server + will behave as though you set it to a particular value), it is + described here. If there is no default value, this section + should say "None". Note that the default listed here + is not necessarily the same as the value the directive takes in + the default httpd.conf distributed with the server.

    +
    top
    +
    +

    Context

    + +

    This indicates where in the server's configuration files the + directive is legal. It's a comma-separated list of one or more + of the following values:

    + +
    +
    server config
    + +
    This means that the directive may be used in the server + configuration files (e.g., httpd.conf), but + not within any + <VirtualHost> + or <Directory> + containers. It is not allowed in .htaccess files + at all.
    + +
    virtual host
    + +
    This context means that the directive may appear inside + <VirtualHost> + containers in the server + configuration files.
    + +
    directory
    + +
    A directive marked as being valid in this context may be + used inside <Directory>, + <Location>, + and <Files> + containers in the server configuration files, subject to the + restrictions outlined in How + Directory, Location and Files sections work.
    + +
    .htaccess
    + +
    If a directive is valid in this context, it means that it + can appear inside per-directory + .htaccess files. It may not be processed, though + depending upon the overrides currently active.
    +
    + +

    The directive is only allowed within the designated + context; if you try to use it elsewhere, you'll get a + configuration error that will either prevent the server from + handling requests in that context correctly, or will keep the + server from operating at all -- i.e., the server won't + even start.

    + +

    The valid locations for the directive are actually the + result of a Boolean OR of all of the listed contexts. In other + words, a directive that is marked as being valid in + "server config, .htaccess" can be used in the + httpd.conf file and in .htaccess + files, but not within any <Directory> or + <VirtualHost> + containers.

    +
    top
    +
    +

    Override

    + +

    This directive attribute indicates which configuration + override must be active in order for the directive to be + processed when it appears in a .htaccess file. If + the directive's context + doesn't permit it to appear in .htaccess files, + then no context will be listed.

    + +

    Overrides are activated by the AllowOverride directive, and apply + to a particular scope (such as a directory) and all + descendants, unless further modified by other + AllowOverride directives at + lower levels. The documentation for that directive also lists the + possible override names available.

    +
    top
    +
    +

    Status

    + +

    This indicates how tightly bound into the Apache Web server + the directive is; in other words, you may need to recompile the + server with an enhanced set of modules in order to gain access + to the directive and its functionality. Possible values for + this attribute are:

    + +
    +
    Core
    + +
    If a directive is listed as having "Core" status, that + means it is part of the innermost portions of the Apache Web + server, and is always available.
    + +
    MPM
    + +
    A directive labeled as having "MPM" status is provided by + a Multi-Processing Module. This + type of directive will be available if and only if you are + using one of the MPMs listed on the Module line of the directive + definition.
    + +
    Base
    + +
    A directive labeled as having "Base" status is supported + by one of the standard Apache modules which is compiled into + the server by default, and is therefore normally available + unless you've taken steps to remove the module from your + configuration.
    + +
    Extension
    + +
    A directive with "Extension" status is provided by one of + the modules included with the Apache server kit, but the + module isn't normally compiled into the server. To enable the + directive and its functionality, you will need to change the + server build configuration files and re-compile Apache.
    + +
    Experimental
    + +
    "Experimental" status indicates that the directive is + available as part of the Apache kit, but you're on your own + if you try to use it. The directive is being documented for + completeness, and is not necessarily supported. The module + which provides the directive may or may not be compiled in by + default; check the top of the page which describes the + directive and its module to see if it remarks on the + availability.
    +
    +
    top
    +
    +

    Module

    + +

    This quite simply lists the name of the source module which + defines the directive.

    +
    top
    +
    +

    Compatibility

    + +

    If the directive wasn't part of the original Apache version + 2 distribution, the version in which it was introduced should + be listed here. In addition, if the directive is available + only on certain platforms, it will be noted here.

    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/directive-dict.html.es b/rubbos/app/httpd-2.0.64/docs/manual/mod/directive-dict.html.es new file mode 100644 index 00000000..9c99e0b7 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/directive-dict.html.es @@ -0,0 +1,307 @@ + + + +Términos usados en las descripciones de las + Directivas - Servidor HTTP Apache + + + + + +
    <-
    +

    Términos usados en las descripciones de las + Directivas

    +
    +

    Idiomas disponibles:  en  | + es  | + 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 define los términos que se usan para describir + las directivas de configuración de + Apache.

    +
    + +
    top
    +
    +

    Descripción

    + +

    Descripción resumida de para qué sirve la directiva.

    +
    top
    +
    +

    Sintaxis

    + +

    Explica el formato de la directiva en la manera en que + aparecería en un fichero de configuración. La sintaxis es + específica para cada directiva, y se decribe en detalle en la + definición de cada una de ellas. Generalmente, es el nombre de la + directiva seguido del argumento o argumentos que correspondan + separados por espacios. Si un argumento contiene un espacio, + entonces debe escribirse entre comillas. Los argumentos opcionales + van entre corchetes ([]). Si cada argumento puede tomar más de un + valor, los valores posibles van separados por barras verticales + "|". Los textos literales (los que no hay que sustituir) están en + el tipo de letra por defecto del resto del texto, mientras que los + que hay que sustituir están resaltados. Las directivas + que pueden tomar un número variable de argumentos terminan con + puntos suspensivos ("...").

    + +

    Las directivas usan una gran variedad de tipos de + argumentos. Algunos de los más comunes son:

    + +
    +
    URL
    + +
    Un Localizador de Recursos Uniforme (Uniform Resource + Locator) que consiste en un esquema (www), un nombre de host + (example.com), y opcionalmente, una ruta; por ejemplo + http://www.example.com/path/to/file.html
    + +
    URL-path
    + +
    La parte de una url que va a continuación del + esquema y del nombre de host, por ejemplo + /path/to/file.html. El url-path representa + al fichero visto desde el servidor web, en contraposición a + verlo tomando el sistema de ficheros como punto de + referencia.
    + +
    file-path
    + +
    La ubicación de un fichero en el sistema de archivos local + que empieza con el directorio raiz, por ejemplo, + /usr/local/apache/htdocs/path/to/file.html. A + menos que se especifique otra cosa, un file-path que no + empieza con una barra será tratado como relativo a ServerRoot.
    + +
    directory-path
    + +
    La ubicación de un directorio en el sistema de archivos + local que empieza en el directorio raiz, por ejemplo + /usr/local/apache/htdocs/path/to/.
    + +
    filename
    + +
    El nombre de un fichero sin información adicional sobre su + ubicación, por ejemplo file.html.
    + +
    regex
    + +
    Una expresión regular, que es una forma de describir un + patrón para encontrar sus equivalencias en un texto. La + definición de la directiva especificará con qué se comparará + regex para encontrar equivalencias.
    + +
    extension
    + +
    En general, es la parte del filename que va después + del último punto. Apache reconoce muchas de estas extensiones, + de manera que si un filename contiene mas de un punto, + cada parte separada por uno de esos puntos después del primero + se trata como una extensión. Por ejemplo, el + filename file.html.en contiene dos + extensiones: .html y .en. Para las + directivas de Apache, puede especificar extensiones con + o sin punto delante. Las extensiones no distinguen + mayúsculas de minúsculas.
    + +
    MIME Type
    + +
    Es una forma de describir el formato de un fichero, que + consiste en un tipo de formato principal y un tipo de formato + secundario, separados por una barra, por ejemplo + text/html.
    + +
    env-variable
    + +
    El nombre de una variable de + entorno definida en el proceso de configuración de Apache. + Tenga en cuenta que esto no es necesariamente exactamente lo + mismo que una variable de entorno del sistema + operativo. Consulte la documentación sobre + variables de entorno si quiere obtener más información.
    +
    +
    top
    +
    +

    Valor por defecto

    + +

    Si una directiva tiene un valor por defecto (esto significa + que, si no especifica un valor explicitamente en la + configuración, el servidor Apache se comportará como si hubiera + especificado ese valor por defecto). Si no existe un valor por + defecto, en este apartado aparecerá "None". Tenga en + cuenta que el valor por defecto que se especifica aquí puede no + ser el mismo que el que viene especificado para la directiva en el + fichero de configuración httpd.conf que viene por defecto.

    +
    top
    +
    +

    Contexto

    + +

    Indica en qué parte de los ficheros de configuración del + servidor se puede usar la directiva. Es una lista de elementos + separados por comas. Los valores permitidos son los + siguientes:

    + +
    +
    server config
    + +
    Significa que la directiva puede ser usada en los ficheros + de configuración del servidor (por ejemplo, + httpd.conf), pero no dentro de las + secciones <VirtualHost> ni <Directory>. También + significa que la directiva no puede usarse en los ficheros + .htaccess.
    + +
    virtual host
    + +
    Este contexto significa que la directiva puede aparecer + dentro de las secciones <VirtualHost> de los ficheros de + configuración del servidor.
    + +
    directory
    + +
    Una directiva marcada como válida en este contexto puede + usarse en las secciones <Directory>, <Location>, y <Files> en los ficheros de + configuración del servidor, ateniéndose en todo caso a las + restricciones especificadas en el documento Modo de funcionamiento de las secciones + Directory, Location y Files.
    + +
    .htaccess
    + +
    Si una directiva es válida en este contexto, eso significa + que puede aparecer en los ficheros .htaccess. El + valor de la directiva puede no ser procesada si hay sobre ella + una orden de sobreescritura activa en + ese momento.
    +
    + +

    Una directiva puede usarse solo en el contexto + especificado, si la usa en otro sitio, se producirá en error de + configuración que hará que el servidor no pueda servir peticiones + en el contexto correctamente, o que el servidor no pueda + funcionar en absoluto -- por ejemplo, puede que el + servidor no se inicie.

    + +

    Las ubicaciones válidas para una directiva son el resultado de + la operación booleana OR de todos los contextos listados más + arriba en que esté perimitido su uso. En otras palabras, una + directiva que esté marcada como válida en "server config, + .htaccess" puede usarse tanto en el fichero + httpd.conf como en los ficheros + .htaccess, pero no dentro de las secciones + <Directory> o + <VirtualHost>.

    +
    top
    +
    +

    Override

    + +

    Este atributo indica qué configuración de las especificadas + para una directiva es la que prevalece cuando la directiva aparece + en un fichero .htaccess. Si el contexto de una directiva no permite que aparezca en ficheros + .htaccess, entonces no aparecerá ningún contexto en + este campo.

    + +

    Para que se aplique el valor especificado en este campo se usa + la directiva AllowOverride, y + se aplica a un entorno en particular (por ejemplo un directorio) + y todo lo que haya por debajo de él, a menos que haya alguna + modificación posterior por directivas AllowOverride a niveles más bajos. La + documentación de esta directiva también especifica los valores que + puede tomar override.

    +
    top
    +
    +

    Estado

    + +

    Indica el grado de integración con el el servidor web Apache + que presenta la directiva; en otras palabras, puede que tenga que + recompilar el servidor con un conjunto mejorado de módulos para + tener acceso a algunas directivas y a sus funcionalidades. Los + valores posibles de este campo son:

    + +
    +
    Core
    + +
    Si una directiva tiene estado "Core", esto significa que su + grado de integración con el servidor Apache es muy alto, y que + está disponible siempre.
    + +
    MPM
    + +
    Una directiva etiquetada con el estado "MPM" pertenece a un + Módulo de MultiProcesamiento. Este + tipo de directiva estará disponible solamente si está usando uno + de los MPMs listados en la línea Módulo de + la deficinición de la directiva.
    + +
    Base
    + +
    Una directiva etiquetada con el estado "Base" está soportada + por uno de los módulos estándar de Apache, que está compilado en + el servidor por defecto, y está siempre disponible a no ser que + haya eliminado ese módulo específicamente.
    + +
    Extension
    + +
    Una directiva con el estado "Extension" pertenece a un + módulo incluido en el kit del servidor Apache, pero que no está + normalmente compilado en el servidor. Para activar la directiva + y sus funcionalidades, tendrá que recompilar Apache.
    + +
    Experimental
    + +
    El estado "Experimental" indica que la directiva está + disponible como parte de la distribución Apache, pero que su correcto + funcionamiento no está todavía probado. Puede que la directiva + esté siendo documentada para completarla, o puede que no se + ofrezca soporte. El módulo que ofrece la directiva puede o no + estar compilado por defecto; compruebe la parte superior de la + página que describe la directiva y sus módulos para ver si hay + alguna indicación sobre su disponibilidad.
    +
    +
    top
    +
    +

    Módulo

    + +

    Indica el módulo en el cual se define la directiva.

    +
    top
    +
    +

    Compatibilidad

    + +

    Si una directiva no era originalmente parte de la versión 2.0 + de la distribución de Apache, la versión en la que fue introducida + debe aparecer aquí. Además, si la directiva está disponible solo + en algunas plataformas, también debe figurar aquí.

    +
    +
    +

    Idiomas disponibles:  en  | + es  | + ja  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/directive-dict.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/directive-dict.html.ja.utf8 new file mode 100644 index 00000000..1137917d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/directive-dict.html.ja.utf8 @@ -0,0 +1,304 @@ + + + +ディレクティブの解説に使われる用語 - Apache HTTP サーバ + + + + + +
    <-
    +

    ディレクティブの解説に使われる用語

    +
    +

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

    +
    + +

    この文書は各 Apache 設定ディレクティブ + を説明するために使われている用語を説明します。

    +
    + +
    top
    +
    +

    説明

    + +

    ディレクティブの目的の簡単な説明。

    +
    top
    +
    +

    構文

    + +

    設定ファイル中のディレクティブの書式を示します。 + この構文はディレクティブ特有なので、詳細はディレクティブの説明を + 参照してください。一般的に、ディレクティブ名の後には + 空白により分割されたいくつかの引数が続きます。 + 引数が空白を含むときは二重引用符 (訳注: ") + で囲まれています。 オプショナルな引数は括弧 + (訳注: []) で囲まれています。 + 引数が複数の値を取り得る場合は、それらの値は垂直の棒 "|" + で 分割されています。 + 変更されないテキストはデフォルトのフォントで表示され、置換の必要な + 引数は強調されて表示されます。 + 引数の数が変わるディレクティブは最後の + 引数が繰り返されることを示すために "..." + で終わります。

    + +

    + ディレクティブは多くの違う型の引数をとります。いくつか、良く + 使われるものを以下で定義します。

    + +
    +
    URL
    + +
    http://www.example.com/path/to/file.html + のように、 + スキーム、ホスト名、パス名(省略可能)を含んでいる完全な + Uniform Resource Locator。
    + +
    URL-path
    + +
    /path/to/file.html のように、スキームと + ホスト名の後に続く url + の一部。url-path は + ファイルシステムからの視点ではなく、 + ウェブからの視点でリソースを表現します。
    + +
    file-path
    + +
    /usr/local/apache/htdocs/path/to/file.html + のように、 + ルートディレクトリから始まるローカルのファイルシステム上のファイルへのパス。 + 通常、スラッシュで始まらない file-path は ServerRoot + からの相対パスとして 扱われます。
    + +
    directory-path
    + +
    /usr/local/apache/htdocs/path/to/ + のように、 + ルートディレクトリから始まるローカルのファイルシステムのディレクトリへの + パス。
    + +
    filename
    + +
    file.html のように、パス情報の付いていない + ファイル名。
    + +
    regex
    + +
    Perl 互換の正規表現です。 + ディレクティブの定義が regex + が何に対してマッチを行なうのかを指定します。
    + +
    extension
    + +
    一般的には filename + の最後のドットの後の部分です。 しかし、Apache + は複数のファイルの拡張子を認識しますので、filename + に複数のドットがあると、最初のドットの後の、それぞれのドットで分離された部分が + extension (訳注: 拡張子) + になります。例えば、filename + file.html.en + には二つの拡張子があります。.html と + .en です。Apache + のディレクティブでは、extension + はドット付きでも無しでも指定できます。さらに、extension + は 大文字小文字を区別しません。
    + +
    MIME-type
    + +
    text/html のように、スラッシュで分離された + 主フォーマットと副フォーマットによってファイルの形式を + 表す方法です。
    + +
    env-variable
    + +
    Apache の設定により定義される 環境変数の名前です。これはオペレーティングシステムの + 環境変数と同じとは限らないことに注意してください。詳細は 環境変数の説明を参照してください。
    +
    +
    top
    +
    +

    デフォルト

    + +

    ディレクティブにデフォルト値 + (すなわち、設定ファイルから + 省略されていても、Apache + ウェブサーバは特定の値に設定されているかのように + 動作します) がある場合はここに記述されます。 + デフォルト値の無い場合、ここは "None" と + 書かれます。ここで書かれているデフォルトはサーバと共に配布されている + デフォルトの httpd.conf + 内に書かれているディレクティブの値と + 違う可能性があることに注意してください。

    +
    top
    +
    +

    コンテキスト

    + +

    + これは、サーバの設定ファイル中のどこでディレクティブが有効なのかを示します。 + 次に示す値が一つ以上カンマ区切りで列挙されています。

    + +
    +
    サーバ設定ファイル
    + +
    これは、サーバ設定ファイル + (例えば、httpd.conf, + srm.conf, access.conf) + 内では使用できますが、 + <VirtualHost> や + <Directory> の中では + 使用できないことを示します。 + .htaccessファイルでの使用は許可されていません。
    + +
    バーチャルホスト
    + +
    これは、サーバ設定ファイルの + <VirtualHost> + の中で使用できることを示します。
    + +
    ディレクトリ
    + +
    これは、サーバ設定ファイルの + <Directory>, + <Location>, + <Files> + コンテナの中で、 Directory, Location, Files セクションの動作方法 + で説明されている制限の下で使用できることを示します。
    + +
    .htaccess
    + +
    これは、ディレクトリ毎の + .htaccess ファイル内で + 使用可能であることを示します。 ただ、上書き + の設定によっては、処理されないかもしれません。
    +
    + +

    + ディレクティブは指示されたコンテキストでのみ許可されます。 + 他の場所で使おうとすると、サーバがそのコンテキストを正しく扱えなく + なるような設定エラーが発生するか、サーバがまったく動作しなくなる、 + すなわち、サーバが起動しなくなるということになります。

    + +

    + ディレクティブの有効な位置は、実際は挙げられているコンテキストの + 論理和 (訳注: Boolen OR) + になります。言い換えると、 + "サーバ設定ファイル、.htaccess" で有効だと + 記されているディレクティブは httpd.conf + ファイルと .htaccess + ファイルとで有効ですが、 <Directory> + や <VirtualHost> + の中では使用できません。

    +
    top
    +
    +

    上書き

    + +

    このディレクティブの属性は、.htaccess + ファイル中に + ディレクティブが現れたときに、それの処理を有効にするために + どの設定の上書きが必要かを示します。 ディレクティブの + コンテキスト + が、.htaccess + ファイル中では許可していない場合は、 この属性は + "適用不可" と書かれます。

    + +

    上書きは、AllowOverride + ディレクティブによって有効にされ、 + 特定のスコープ(ディレクトリなど)と、 + さらに下位のレベルの AllowOverride + で修正されない限り、 その配下に対して適用されます。 + ディレクティブのドキュメントは取り得る上書きの名前も挙げます。

    +
    top
    +
    +

    ステータス

    + +

    これはディレクティブが Apache + ウェブサーバにどれくらいきつく組み込まれているかを + 示します。言い換えれば、ディレクティブとその機能を利用するために、 + モジュールの数を増やして、サーバを再コンパイルする必要があるかもしれない + ということを示します。 + この属性が取り得る値は以下のものです:

    + +
    +
    Core
    + +
    "Core" のディレクティブは Apache + ウェブサーバの基本となるべきものであり、 + 常に使用可能であることを示します。
    + +
    MPM
    + +
    "MPM" のディレクティブはマルチプロセッシングモジュールで提供されています。 + この種類のディレクティブはディレクティブの定義のモジュールの行に使っているモジュールの名前が書かれている + 場合にのみ使用可能です。
    + +
    Base
    + +
    "Base" のディレクティブは + デフォルトでサーバに組み込まれている標準モジュールの中の一つでサ + ポートされていて、わざわざ設定からモジュールを削除したときを除いて、 + 通常では使用可能であることを示します。
    + +
    Extension
    + +
    "Extension" のディレクティブは、 Apache + サーバの配布物に同梱されているモジュールの一つで提供されているものの、 + 通常ではサーバに組み込まれていないことを示します。 + ディレクティブとその機能を有効にするには、サーバビルド用の設定ファイルを + 変更して Apache + を再コンパイルする必要があります。
    + +
    Experimental
    + +
    "Experimental" のディレクティブは、Apache + 配布物に + 同梱されているものの、試したい場合は自己責任で行なう + 必要があるということを示します。ディレクティブは、すべてのドキュメントを + 完全にそろわせるために解説されていますが、サポートされているとは限りません。 + ディレクティブを提供するモジュールはデフォルトで組み込まれているかも + しれませんし、そうでないかもしれません。使用可能かどうかは、 + ディレクティブとモジュールの説明をしているページの先頭を調べてください。
    +
    +
    top
    +
    +

    モジュール

    + +

    + これは単純にディレクティブが定義されているモジュールの名前を記載します。

    +
    top
    +
    +

    互換性

    + +

    ディレクティブが Apache 2 + の配布に組み込まれていなかった場合、 + ディレクティブが導入されたバージョンがここに書かれています。 + また、ディレクティブが特定のプラットフォームにのみ存在するときも + ここに書かれています。

    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/directive-dict.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/mod/directive-dict.html.ko.euc-kr new file mode 100644 index 00000000..2f8c97b0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/directive-dict.html.ko.euc-kr @@ -0,0 +1,256 @@ + + + +Áö½Ã¾î¸¦ ¼³¸íÇϴµ¥ »ç¿ëÇÑ ¿ë¾îµé - Apache HTTP Server + + + + + +
    <-
    +

    Áö½Ã¾î¸¦ ¼³¸íÇϴµ¥ »ç¿ëÇÑ ¿ë¾îµé

    +
    +

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

    +
    + +

    ÀÌ ¹®¼­´Â ¾ÆÆÄÄ¡ ¼³Á¤ + Áö½Ã¾î¸¦ ¼³¸íÇϴµ¥ »ç¿ëÇÑ ¿ë¾îµéÀ» ¼³¸íÇÑ´Ù.

    +
    + +
    top
    +
    +

    ¼³¸í (Description)

    + +

    Áö½Ã¾îÀÇ ¸ñÀû¿¡ ´ëÇÑ °£´ÜÇÑ ¼³¸í.

    +
    top
    +
    +

    ¹®¹ý (Syntax)

    + +

    ¼³Á¤ÆÄÀÏ¿¡¼­ »ç¿ëÇÒ Áö½Ã¾îÀÇ Çü½ÄÀ» ¾Ë·ÁÁØ´Ù. ÀÌ ¹®¹ýÀº + Áö½Ã¾î¸¶´Ù ¸Å¿ì ´Ù¸£¸ç, Áö½Ã¾î¸¦ Á¤ÀÇÇÒ ¶§¸¶´Ù ÀÚ¼¼È÷ ¼³¸íÇÑ´Ù. + ÀϹÝÀûÀ¸·Î Áö½Ã¾î À̸§ µÚ¿¡ °ø¹éÀ¸·Î ±¸ºÐÇÑ ¾Æ±Ô¸ÕÆ®µéÀÌ + ³ª¿Â´Ù. ¾Æ±Ô¸ÕÆ®°¡ °ø¹éÀ» Æ÷ÇÔÇÑ´Ù¸é ¾Æ±Ô¸ÕÆ®¸¦ ½Öµû¿ÈÇ¥·Î + ¹­¾î¾ß ÇÑ´Ù. ¼±ÅÃÀûÀÎ ¾Æ±Ô¸ÕÆ®´Â Áß°ýÈ£·Î ¹­´Â´Ù. ¾Æ±Ô¸ÕÆ®°¡ + ¿©·¯ °ªÁß ÇϳªÀÏ °æ¿ì °ªµéÀ» ¼öÁ÷¸·´ë "|"·Î ±¸ºÐÇÑ´Ù. + ¹®ÀÚ±×´ë·Î »ç¿ëÇÒ ºÎºÐÀº ±âº» ¹®ÀÚü·Î ¾²°í, ´ëüÇÒ ¾Æ±Ô¸ÕÆ®´Â + °­Á¶ÇÑ´Ù. ¾Æ±Ô¸ÕÆ® °³¼ö°¡ Á¤ÇØÁöÁö¾ÊÀº Áö½Ã¾î´Â + ¸¶Áö¸· ¾Æ±Ô¸ÕÆ®°¡ ¹Ýº¹µÊÀ» ³ªÅ¸³»´Â "..."À¸·Î ³¡³­´Ù.

    + +

    Áö½Ã¾î´Â ¸Å¿ì ´Ù¾çÇÑ Á¾·ùÀÇ ¾Æ±Ô¸ÕÆ®¸¦ ¹Þ´Â´Ù. ÀÌÁß ÀÚÁÖ + »ç¿ëÇÏ´Â °ÍÀº ¾Æ·¡¿Í °°´Ù.

    + +
    +
    URL
    + +
    http://www.example.com/path/to/file.html°ú + °°ÀÌ ½ºÅ´(scheme), È£½ºÆ®¸í, ¼±ÅÃÀûÀÎ °æ·Î¸íÀ» Æ÷ÇÔÇÑ + ¿ÏÀüÇÑ Uniform Resource Locator
    + +
    URL-path
    + +
    /path/to/file.html°ú °°ÀÌ url¿¡¼­ + ½ºÅ´°ú È£½ºÆ®¸í µÚ¿¡ ³ª¿À´Â ºÎºÐ. url-path´Â + ÆÄÀϽýºÅÛ¿¡¼­ º» ½ÃÁ¡ÀÌ ¾Æ´Ñ À¥¿¡¼­ º» ½ÃÁ¡¿¡¼­ÀÇ ÀڷḦ + ³ªÅ¸³½´Ù.
    + +
    file-path
    + +
    /usr/local/apache/htdocs/path/to/file.html°ú + °°ÀÌ root µð·ºÅ丮·Î ½ÃÀÛÇÏ´Â ÆÄÀϽýºÅÛ»óÀÇ ÆÄÀÏ °æ·Î. µû·Î + ¾ð±ÞÇÏÁö¾ÊÀ¸¸é, ½½·¡½¬·Î ½ÃÀÛÇÏÁö¾ÊÀº file-path´Â + ServerRoot¿¡ »ó´ë°æ·Î·Î + Ãë±ÞÇÑ´Ù.
    + +
    directory-path
    + +
    /usr/local/apache/htdocs/path/to/¿Í °°ÀÌ + root µð·ºÅ丮·Î ½ÃÀÛÇÏ´Â ÆÄÀϽýºÅÛ»óÀÇ µð·ºÅ丮 °æ·Î.
    + +
    filename
    + +
    file.html°ú °°ÀÌ °æ·Î Á¤º¸°¡ ¾ø´Â ÆÄÀϸí.
    + +
    regex
    + +
    Perl Çü½ÄÀÇ Á¤±ÔÇ¥Çö½Ä(regular + expression). Áö½Ã¾î´Â regex·Î ¹«¾ùÀΰ¡¸¦ °Ë»öÇÑ´Ù.
    + +
    extension
    + +
    ÀϹÝÀûÀ¸·Î filename¿¡¼­ ¸¶Áö¸· ¸¶Ä§Ç¥ µÚ¿¡ + ³ª¿À´Â ºÎºÐÀÌ´Ù. ±×·¯³ª ¾ÆÆÄÄ¡´Â ¿©·¯ È®ÀåÀÚ¸¦ ÀνÄÇÒ + ¼ö Àֱ⶧¹®¿¡, filename¿¡ ¸¶Ä§Ç¥°¡ ¿©·¯°³ Æ÷ÇÔµÈ + °æ¿ì ¸¶Ä§Ç¥·Î ±¸ºÐµÈ ¸ðµç ºÎºÐÀ» È®ÀåÀÚ(extension)·Î + ó¸®ÇÑ´Ù. ¿¹¸¦ µé¾î, ÆÄÀϸí file.html.enÀº + .html°ú .enÀ̶ó´Â µÎ°¡Áö È®ÀåÀÚ¸¦ + °¡Áø´Ù. ¾ÆÆÄÄ¡ Áö½Ã¾î¿¡¼­ extension¿¡ ÁöÁ¤ÇÑ + °ª ¾Õ¿¡ ¸¶Ä§Ç¥°¡ À־ µÇ°í ¾ø¾îµµ µÈ´Ù. ¶Ç, + extensionÀº ´ë¼Ò¹®ÀÚ¸¦ °¡¸®Áö¾Ê´Â´Ù.
    + +
    MIME-type
    + +
    text/html°ú °°ÀÌ ½½·¡½¬·Î major format + type°ú minor format type¸¦ ±¸ºÐÇÏ¿© ÆÄÀÏÀÇ Çü½ÄÀ» ¼³¸íÇÏ´Â + ¹æ½Ä.
    + +
    env-variable
    + +
    ¾ÆÆÄÄ¡ ¼³Á¤¿¡¼­ Á¤ÀÇÇÑ È¯°æº¯¼ö + À̸§. ¿î¿µÃ¼Á¦ÀÇ È¯°æº¯¼ö¿Í ´Ù¸§À» ÁÖÀÇÇ϶ó. ÀÚ¼¼ÇÑ ³»¿ëÀº + ȯ°æº¯¼ö ¹®¼­¸¦ Âü°íÇ϶ó.
    +
    +
    top
    +
    +

    ±âº»°ª (Default)

    + +

    Áö½Ã¾î¿¡ ±âº»°ªÀÌ ÀÖ´Ù¸é (¿¹¸¦ µé¾î, ¼³Á¤¿¡¼­ + Áö½Ã¾î¸¦ »ý·«ÇÑ °æ¿ì ¾ÆÆÄÄ¡ À¥¼­¹ö´Â ÀÌ °ªÀ» »ç¿ëÇÑ´Ù.) + ÀÌ Ç׸ñ¿¡ ³ª¿Â´Ù. ±âº»°ªÀÌ ¾ø´Ù¸é ÀÌ Ç׸ñÀº + "None"À̾î¾ß ÇÑ´Ù. ±âº»°ªÀÌ ¼­¹ö¿¡ Æ÷ÇÔµÈ ±âº» + httpd.confÀÇ Áö½Ã¾î °ª°ú ´Ù¸¦ ¼ö ÀÖÀ½À» ÁÖÀÇÇ϶ó.

    +
    top
    +
    +

    »ç¿ëÀå¼Ò (Context)

    + +

    ¼­¹öÀÇ ¼³Á¤ÆÄÀÏÁß ¾î´À°÷¿¡¼­ Áö½Ã¾î¸¦ »ç¿ëÇÒ ¼ö ÀÖ´ÂÁö + ¾Ë·ÁÁØ´Ù. ´ÙÀ½ °ªµéÀ» ½°Ç¥·Î ±¸ºÐÇÑ ¸ñ·ÏÀÌ´Ù:

    + +
    +
    ÁÖ¼­¹ö¼³Á¤ (server config)
    + +
    Áö½Ã¾î¸¦ ¼­¹ö ¼³Á¤ÆÄÀÏ¿¡¼­ (¿¹¸¦ µé¾î, + httpd.conf) »ç¿ëÇÒ ¼ö ÀÖÀ¸³ª, <VirtualHost>³ª + <Directory>¿¡¼­ + »ç¿ëÇÒ ¼ö ¾øÀ½À» ¶æÇÑ´Ù. ÀÌ Áö½Ã¾î´Â + .htaccess ÆÄÀÏ¿¡¼­µµ »ç¿ëÇÒ ¼ö ¾ø´Ù.
    + +
    °¡»óÈ£½ºÆ® (virtual host)
    + +
    Áö½Ã¾î¸¦ ¼­¹ö ¼³Á¤ÆÄÀÏÀÇ <VirtualHost> ¾È¿¡¼­ »ç¿ëÇÒ ¼ö + ÀÖÀ½À» ¶æÇÑ´Ù.
    + +
    µð·ºÅ丮 (directory)
    + +
    Áö½Ã¾î°¡ ¾î¶»°Ô Directory, + Location, Files ¼½¼ÇÀÌ µ¿ÀÛÇϳª¿¡ ¼³¸íÇÑ Á¦¾àÀ» µû¸£¸ç, + ¼­¹ö ¼³Á¤ÆÄÀÏÀÇ <Directory>, <Location>, + <Files>¿¡¼­ + »ç¿ëÇÒ ¼ö ÀÖÀ½À» ¶æÇÑ´Ù.
    + +
    .htaccess
    + +
    Áö½Ã¾î¸¦ µð·ºÅ丮º° .htaccess + ÆÄÀÏ¿¡¼­ »ç¿ëÇÒ ¼ö ÀÖÀ½À» ¶æÇÑ´Ù. ÀÌ Áö½Ã¾î´Â ÇöÀç »ç¿ëÇÏ´Â + overrides °ª¿¡ µû¶ó ¹«½ÃµÉ ¼ö + ÀÖ´Ù.
    +
    + +

    Áö½Ã¾î´Â ÁöÁ¤µÈ Àå¼Ò¿¡¼­¸¸ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ´Ù¸¥ + °÷¿¡¼­ »ç¿ëÇÏ¸é ¼³Á¤¿À·ù°¡ ¹ß»ýÇÏ°í ¼­¹ö´Â ºÎºÐ¿¡ ´ëÇÑ ¿äûÀ» + ¿Ã¹Ù·Î ó¸®ÇÏÁö ¸øÇϰųª ÀÛµ¿ÀÌ, ¿¹¸¦ µé¾î ½ÃÀÛÁ¶Â÷µµ, + ¾ÈµÉ ¼ö ÀÖ´Ù.

    + +

    Áö½Ã¾î¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Â Àå¼Ò´Â ¿­°ÅÇÑ Àå¼Ò¸¦ ¸ðµÎ + ºÒ¸°(boolean) ORÇÑ °á°úÀÌ´Ù. Áï, + "server config, .htaccess"¿¡¼­ °¡´ÉÇÏ´Ù´Â + Áö½Ã¾î´Â httpd.conf ÆÄÀÏ°ú .htaccess + ÆÄÀÏ¿¡¼­´Â »ç¿ëÇÒ ¼ö ÀÖÁö¸¸, <Directory>³ª <VirtualHost>¿¡¼­´Â »ç¿ëÇÒ ¼ö ¾ø´Ù.

    +
    top
    +
    +

    Override ¿É¼Ç (Override)

    + +

    ÀÌ Áö½Ã¾î¸¦ .htaccess ÆÄÀÏ¿¡¼­ »ç¿ëÇÏ·Á¸é + ¾î¶² override ¿É¼ÇÀ» »ç¿ëÇØ¾ß ÇÏ´ÂÁö¸¦ ³ªÅ¸³½´Ù. Áö½Ã¾îÀÇ + »ç¿ëÀå¼Ò°¡ Áö½Ã¾î¸¦ .htaccess + ÆÄÀÏ¿¡¼­ »ç¿ëÇÒ ¼ö ¾ø´Ù°í ÇÑ´Ù¸é ¾î¶² »ç¿ëÀå¼Òµµ ³ª¿ÀÁö + ¾Ê´Â´Ù.

    + +

    Overrides´Â AllowOverride Áö½Ã¾î·Î Áö½ÃÇÏ°í, + (µð·ºÅ丮 µîÀÇ) ƯÁ¤ ¹üÀ§¿Í ÇÏÀ§ ¹üÀ§¿¡¼­ ´Ù¸¥ AllowOverride Áö½Ã¾î·Î ´Ù¸¥ °ªÀ» + ¼³Á¤ÇÏÁö¾Ê¾Ò´Ù¸é ÇÏÀ§ ¹üÀ§¿¡µµ ±×´ë·Î Àû¿ëµÈ´Ù. Áö½Ã¾î ¼³¸í¿¡ + »ç¿ë°¡´ÉÇÑ override À̸§µéÀÌ ³ª¿Â´Ù.

    +
    top
    +
    +

    »óÅÂ (Status)

    + +

    Áö½Ã¾î°¡ ¾ÆÆÄÄ¡ À¥¼­¹ö¿¡ ¾ó¸¶³ª ±ä¹ÐÈ÷ ¹­¿©ÀÖ´ÂÁö¸¦ + ³ªÅ¸³½´Ù. Áï, ±× Áö½Ã¾î³ª ±â´ÉÀ» »ç¿ëÇϱâÀ§ÇØ ¼­¹ö¸¦ + ¸ðµâ°ú °°ÀÌ ´Ù½Ã ÄÄÆÄÀÏÇÒ ÇÊ¿ä°¡ ÀÖÀ» ¼öµµ ÀÖ´Ù. + °¡´ÉÇÑ °ªÀº ´ÙÀ½°ú °°´Ù:

    + +
    +
    Core
    + +
    Áö½Ã¾î°¡ "Core" »óŸ¦ °¡Áö¸é, Áö½Ã¾î°¡ ¾ÆÆÄÄ¡ À¥¼­¹ö + Çٽɺκп¡ ¼ÓÇÏ°í Ç×»ó »ç¿ë°¡´ÉÇÔÀ» ¶æÇÑ´Ù.
    + +
    MPM
    + +
    "MPM" »óÅÂÀÎ Áö½Ã¾î´Â ´ÙÁßó¸® + ¸ðµâÀ» Á¦°øÇÑ´Ù. ÀÌ·± Áö½Ã¾î´Â Áö½Ã¾î ¼³¸í¿¡¼­ ¸ðµâ¿¡ ¿­°ÅµÈ MPMÁß Çϳª¸¦ »ç¿ëÇÒ¶§¸¸ + °¡´ÉÇÏ´Ù.
    + +
    Base
    + +
    ±âº»ÀûÀ¸·Î ¼­¹ö¿Í °°ÀÌ ÄÄÆÄÀϵǹǷΠÁ÷Á¢ ±¸¼º¿¡¼­ + ¸ðµâÀ» Á¦°ÅÇÏÁö ¾Ê¾Ò´Ù¸é ÀϹÝÀûÀ¸·Î »ç¿ë°¡´ÉÇÑ Ç¥ÁØ ¾ÆÆÄÄ¡ + ¸ðµâÀÌ Á¦°øÇÏ´Â Áö½Ã¾î´Â "Base" »óÅÂÀÌ´Ù.
    + +
    Extension
    + +
    ¾ÆÆÄÄ¡ ¼­¹ö ¹èÆ÷º»¿¡´Â Æ÷ÇÔµÇÀÖÁö¸¸ º¸Åë ¼­¹ö¿Í °°ÀÌ + ÄÄÆÄÀϵÇÁö¾Ê´Â ¸ðµâÀÌ Á¦°øÇÏ´Â Áö½Ã¾î´Â "Extension" »óÅÂÀÌ´Ù. + ÀÌ·± Áö½Ã¾î¸¦ »ç¿ëÇÏ·Á¸é ¼­¹ö ÄÄÆÄÀÏ ±¸¼ºÆÄÀÏÀ» ¼öÁ¤ÇÏ°í + ¾ÆÆÄÄ¡¸¦ ´Ù½Ã ÄÄÆÄÀÏÇØ¾ß ÇÑ´Ù.
    + +
    Experimental
    + +
    "Experimental"Àº Áö½Ã¾î°¡ ¾ÆÆÄÄ¡ ¹èÆ÷º»¿¡ Æ÷ÇÔµÇÀÖÁö¸¸, + »ç¿ëÀº ÀÚ½ÅÀÇ Ã¥ÀÓÀÓÀ» ³ªÅ¸³½´Ù. Áö½Ã¾î´Â ¹®¼­È­µÇÀÖÁö¸¸, + ½ÇÁ¦¿Í ´Ù¸¦ ¼ö ÀÖ´Ù. Áö½Ã¾î¸¦ Á¦°øÇÏ´Â ¸ðµâÀº ±âº»ÀûÀ¸·Î + ¾ÆÆÄÄ¡¿Í °°ÀÌ ÄÄÆÄÀ쵃 ¼öµµ ¾ÈµÉ ¼öµµ ÀÖ´Ù. Áö½Ã¾î¿Í ¸ðµâÀ» + ¼³¸íÇÏ´Â ¹®¼­ ¾Õ¿¡¼­ »ç¿ëÇÒ ¼ö ÀÖ´ÂÁö »ìÆìºÁ¶ó.
    +
    +
    top
    +
    +

    ¸ðµâ (Module)

    + +

    ´Ü¼øÈ÷ Áö½Ã¾î¸¦ Á¤ÀÇÇÑ ¼Ò½º ¸ðµâ¸íÀ» ¿­°ÅÇÑ´Ù.

    +
    top
    +
    +

    Áö¿ø (Compatibility)

    + +

    Áö½Ã¾î°¡ ¿ø·¡ ¾ÆÆÄÄ¡ ¹öÀü 2 ¹èÆ÷º»ÀÇ ÀϺΰ¡ ¾Æ´Ï¿´´Ù¸é, + Áö½Ã¾î¸¦ Ãß°¡Çϱ⠽ÃÀÛÇÑ ¹öÀüÀÌ ¿©±â ³ª¿Â´Ù. ¶Ç, ¾î¶² + Ç÷¡Æû¿¡¼­¸¸ »ç¿ë°¡´ÉÇÑ Áö½Ã¾îµµ ¿©±â ³ª¿Â´Ù.

    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/directive-dict.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/directive-dict.html.tr.utf8 new file mode 100644 index 00000000..607b559a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/directive-dict.html.tr.utf8 @@ -0,0 +1,176 @@ + + + +Yönergeleri Tanımlamakta Kullanılan Terimler - Apache HTTP Sunucusu + + + + + +
    <-
    +

    Yönergeleri Tanımlamakta Kullanılan Terimler

    +
    +

    Mevcut Diller:  en  | + es  | + ja  | + ko  | + tr 

    +
    + +

    Bu belgede Apache yapılandırma yönergelerini tanımlamakta kullanılan terimler açıklanmıştır.

    +
    + +
    top
    +
    +

    Açıklama

    + +

    Yönergenin kullanım amacının kısa bir açıklaması.

    +
    top
    +
    +

    Sözdizimi

    + +

    Yönergenin bir yapılandırma dosyasında hangi söz dizimiyle görünebileceği belirtilir. Bu sözdizimi yönergeye özeldir ve ayrıntıları yönerge tanımında açıklanır. Genelde yönerge ismini aralarında boşluklar bırakılmış bir dizi argüman izler. Eğer argümanlardan biri kendi içinde boşluk içeriyorsa çift tırnak içine alınır. İsteğe bağlı argümanlar sözdiziminde köşeli ayraçların arasında gösterilmiştir. Birden fazla olası değeri olan argümanlarda değerler aralarına | karakteri konarak ayrılmıştır. Değerin yerine ismi belirtilen argümanlarda bu isimler eğik yazılırken, kendisi değer olan dizgeler öntanımlı yazıtipi ile gösterilmiştir. Değişik sayıda argüman alan yönergelerde bu durum son argümanı takibeden “...” ile belirtilmiştir.

    + +

    Yönergelerde kullanılan argüman türleri çok çeşitlidir. Çok kullanılanlardan bazıları aşağıda tanımlanmıştır.

    + +
    +
    URL
    + +
    http://www.mesela.dom/yol/yordam/dosya.html örneğindeki gibi protokol şeması ve konak ismini isteğe bağlı bir dosya yolunun izlediği, açılımı “Uniform Resource Locator” olan ve Türkçe’ye “Tektip Özkaynak Konumlayıcı” şeklinde çevrilebilecek adresleri betimler.
    + +
    URL-yolu
    + +
    /yol/yordam/dosya.html örneğindeki gibi bir url’nin parçası olarak protokol şeması ve konak ismini izleyen bir yol dizgesini betimler. url-yolu, bir dosya sisteminin kök dizinine göre değil, DocumentRoot ile belirtilen dizine göre bir dosya yolu betimler.
    + +
    dosya-yolu
    + +
    /usr/local/apache/htdocs/yol/yordam/dosya.html örneğindeki gibi yerel dosya sisteminin kök dizini ile başlayan bir dosya yolunu betimler. Aksi belirtilmedikçe, bir / ile başlamayan bir dosya-yolu ServerRoot ile belirtilen dizine göre ele alınır.
    + +
    dizin-yolu
    + +
    /usr/local/apache/htdocs/yol/yordam/ örneğindeki gibi kök dizin ile başlayan, yerel dosya sistemindeki bir dizin yolunu betimler.
    + +
    dosya-ismi
    + +
    dosya.html örneğindeki gibi dizin yolu içermeyen bir dosya ismini betimler.
    + +
    düzifd
    + +
    Bir Perl uyumlu düzenli ifade betimler. Yönerge tanımında düzifd ile eşleşenler argüman olarak ele alınır.
    + +
    uzantı
    + +
    Bu genelde, dosya-ismi’nin bir parçası olarak son noktadan sonraki kısmı betimler. Bununla birlikte, Apache çok sayıda nokta içeren dosya isimlerinde ilk noktadan sonrasını uzantı kabul eden çoklu dosya ismi uzantılarını da tanır. Örneğin, dosya-ismi olarak dosya.html.tr değeri iki uzantı içerir: .html ve + .tr. Apache yönergelerinde uzantı’ları başında noktası olmaksızın da belirtebilirsiniz. Ayrıca, uzantı’lar harf büyüklüğüne de duyarlı değildir.
    + +
    MIME-türü
    + +
    Dosya biçiminin, text/html örneğindeki gibi aralarına bir / konulmuş asıl ve alt biçimler şeklinde açıklandığı yönteme göre belirtileceğini betimler.
    + +
    ortam-değişkeni
    + +
    Apache yapılandırma sürecinde tanımlanmış bir ortam değişkeninin ismini betimler. Daha ayrıntılı bilgi için ortam değişkenleri belgesine bakınız.
    +
    +
    top
    +
    +

    Öntanımlı

    + +

    Eğer yönerge öntanımlı bir değere sahipse o burada belirtilir (öntanımlı değer, yönergede kullanıcı tarafından belirtilmediği halde Apache tarafından belirtildiği varsayılarak işlem yapılan değerdir). Eğer öntanımlı bir değer yoksa bu bölümde bu durum “Yok” şeklinde belirtilir. Burada belirtilen öntanımlı değerin sunucu ile dağıtılan öntanımlı httpd.conf içindeki yönergede kullanılan değerle aynı olmasının gerekmediğine dikkat ediniz.

    +
    top
    +
    +

    Bağlam

    + +

    Yönergenin sunucunun yapılandırma dosyalarının nerelerinde meşru kabul edildiği aşağıdaki değerlerin virgül ayraçlı bir listesi halinde burada belirtilir.

    + +
    +
    sunucu geneli
    + +
    Yönergenin sunucunun (httpd.conf gibi) yapılandırma dosyalarında <VirtualHost> ve <Directory> bölümleri dışında her yerde kullanılabileceğini belirtir. Ayrıca, .htaccess dosyalarında bulunmasına da izin verilmez.
    + +
    sanal konak
    + +
    Yönergenin sunucunun yapılandırma dosyalarının sadece <VirtualHost> bölümlerinde kullanıldığında geçerli kabul edileceğini belirtir.
    + +
    dizin
    + +
    Yönergenin sunucunun yapılandırma dosyalarında sadece <Directory>, <Location> ve <Files> bölümlerinde kullanıldığında geçerli kabul edileceğini belirtir. Bu bağlama konu sınırlamaların çerçevesi Yapılandırma Bölümleri içinde çizilmiştir.
    + +
    .htaccess
    + +
    Bu bağlamda geçerli olacağı kabul edilen bir yönerge sadece dizin içi .htaccess dosyalarında görüldüğü zaman işleme sokulur. Üzerinde bir geçersizleştirme etkin kılınmışsa yönerge her şeye rağmen işleme sokulmayabilir.
    +
    + +

    Yönergeye sadece tasarlandığı bağlam içinde izin verilir; başka bir yerde kullanmayı denerseniz ya sunucunun bu bağlamı doğru şekilde işlemesine engel olan ya da sunucunun tamamen işlevsiz kalmasına sebep olan -- sunucu hiç başlatılamayabilir -- bir yapılandırma hatası alırsınız.

    + +

    Yönergenin geçerli olacağı konumlar, aslında, listelenen bağlamların tamamına mantıksal VEYA uygulanarak bulunur. Başka bir deyişle, bir yönergenin geçerli olacağı yerler "sunucu geneli, .htaccess" şeklinde belirtilmişse yönerge httpd.conf dosyasında ve .htaccess dosyalarında, <Directory> veya <VirtualHost> bölümleri haricinde her yerde kullanılabilir.

    +
    top
    +
    +

    Geçersizleştirme

    + +

    Bir .htaccess dosyasında göründüğü takdirde yönerge işlenirken hangi yapılandırma geçersizleşirmesinin etkin olacağı burada belirtilir. Eğer yönerge bağlamının .htaccess dosyalarında görünmesine izin verilmiyorsa hiçbir bağlam listelenmez.

    + +

    Geçersizleştirmeler AllowOverride yönergesi tarafından etkinleştirilir ve belli bir bağlama ve alt seviyelerde başka AllowOverride yönergeleri ile değiştirilmedikçe tüm çocuklarına uygulanır. Yönergenin belgesinde ayrıca kullanılabilecek tüm olası geçersizleştirme isimleri belirtilir.

    +
    top
    +
    +

    Durum

    + +

    Yönergenin Apache HTTP sunucusuna ne kadar sıkı bağlı olduğunu belirtir. Başka bir deyişle, yönergeye ve işlevselliğine erişim kazanmak için sunucuyu belli bir modül kümesiyle yeniden derlemek gerekip gerekmediği ile ilgili durumu belirtir. Bu özniteliğin olası değerleri şunlardır:

    + +
    +
    Çekirdek
    + +
    Eğer bir yönerge “Çekirdek” durumuna sahip olarak listelenmişse bu, yönergenin Apache HTTP sunucusunun en iç kısımlarının bir parçası olduğu ve daima kullanılabilir olacağı anlamına gelir.
    + +
    MPM
    + +
    “MPM” durumuna sahip bir yönerge Çok Süreklilik Modülü tarafından sağlanır. Bu yönerge türü sadece ve sadece yönerge tanımının Modül satırında listelenmiş MPM’lerden birini kullanıyorsanız mevcut olacaktır.
    + +
    Temel
    + +
    “Temel” durumuna sahip bir yönerge, sunucuda öntanımlı derlenmiş standart Apache modüllerinden biri tarafından destekleniyor demektir. Bu nedenle sunucuyu derlemek için yapılandırırken yönergeyi içeren modülü yapılandırmadan özellikle kaldırmazsanız yönerge normal olarak kullanılabilir olacaktır.
    + +
    Eklenti
    + +
    “Eklenti” durumuna sahip bir yönerge, Apache sunucu kitinde bulunan ancak normalde sunucuyla birlikte derlenmeyen modüllerden biri tarafından sağlanır. Yönergeyi ve işlevselliğini etkin kılmak için sunucunun derleme öncesi paket yapılandırması sırasında modülün derleneceğini açıkça belirttikten sonra gerekirse sunucuyu yeniden derlemeniz gerekir.
    + +
    Deneysel
    + +
    “Deneysel” durumuna sahip bir yönerge, Apache sunucu kitinde bulunan modüllerden biri tarafından sağlanır ve modülün denenmesi tamamen sizin insiyatifinize bırakılır. Böyle bir yönerge her şeyiyle belgelenmiştir fakat gerektiği gibi desteklenmemiştir. Yönergeyi içeren modül öntanımlı olarak sunucuyla birlikte derlenebileceği gibi derlenmeyebilir de; bunun için yönergenin açıklandığı sayfanın başına ve kullanılabilirliği hakkında bilgi edinmek için yönergeyi içeren modüle bakın.
    +
    +
    top
    +
    +

    Modül

    + +

    Burada sadece yönergeyi tanımlayan kaynak modülün ismi yazılır.

    +
    top
    +
    +

    Uyumluluk

    + +

    Eğer yönerge Apache’nin 2. sürüm dağıtımının özgün parçası değilse söz konusu sürüm burada belirtilir. Ayrıca, yönergenin kullanımı belli platformlarla sınırlıysa bunun ayrıntıları da burada belirtilir.

    +
    +
    +

    Mevcut Diller:  en  | + es  | + ja  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/directives.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/directives.html new file mode 100644 index 00000000..27f6ac5a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/directives.html @@ -0,0 +1,29 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: directives.html.de +Content-Language: de +Content-type: text/html; charset=ISO-8859-1 + +URI: directives.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: directives.html.es +Content-Language: es +Content-type: text/html; charset=ISO-8859-1 + +URI: directives.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: directives.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: directives.html.ru.koi8-r +Content-Language: ru +Content-type: text/html; charset=KOI8-R + +URI: directives.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/directives.html.de b/rubbos/app/httpd-2.0.64/docs/manual/mod/directives.html.de new file mode 100644 index 00000000..ff28b903 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/directives.html.de @@ -0,0 +1,416 @@ + + + +Verzeichnis der Direktiven - Apache HTTP Server + + + + + +
    <-
    +

    Verzeichnis der Direktiven

    +
    +

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

    +
    + +

    + Hier sind alle Apache-Direktiven aufgeführt, die in der + Standard-Apache-Distribution verfügbar sind. Sie sind in + einem einheitlichen Format beschrieben. Ein Glossar + erläutert die in der Beschreibung verwendeten Begriffe. +

    + +

    + Außerdem existiert eine Kurzreferenz der Direktiven, welche + zu jeder Direktive eine Zusammenfassung der Details enthält. +

    + +

     A  |  B  |  C  |  D  |  E  |  F  |  G  |  H  |  I  |  K  |  L  |  M  |  N  |  O  |  P  |  R  |  S  |  T  |  U  |  V  |  W  |  X 

    +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/directives.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/directives.html.en new file mode 100644 index 00000000..292638c6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/directives.html.en @@ -0,0 +1,417 @@ + + + +Directive Index - Apache HTTP Server + + + + + +
    <-
    +

    Directive Index

    +
    +

    Available Languages:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + +

    + Each Apache directive available in the standard Apache + distribution is listed here. They are described using a + consistent format, and there is a dictionary of the terms used in their + descriptions available. +

    + +

    + A Directive Quick-Reference + is also available giving details about each directive in a + summary form. +

    + +

     A  |  B  |  C  |  D  |  E  |  F  |  G  |  H  |  I  |  K  |  L  |  M  |  N  |  O  |  P  |  R  |  S  |  T  |  U  |  V  |  W  |  X 

    +
    +
    +
    +

    Available Languages:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/directives.html.es b/rubbos/app/httpd-2.0.64/docs/manual/mod/directives.html.es new file mode 100644 index 00000000..03af4af0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/directives.html.es @@ -0,0 +1,417 @@ + + + +Índice de Directivas - Servidor HTTP Apache + + + + + +
    <-
    +

    Índice de Directivas

    +
    +

    Idiomas disponibles:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + +

    + Todas las directivas disponibles en la distribución + estándar de Apache están en la lista que se muestra más + abajo. Cada una se describe usando un formato uniforme, y existe + un glosario + de los términos usados en las descripciones que puede + consultar. +

    + +

    + También existe una Guía Rápida de + Referencia de Directivas con información de cada + directiva de forma resumida. +

    + +

     A  |  B  |  C  |  D  |  E  |  F  |  G  |  H  |  I  |  K  |  L  |  M  |  N  |  O  |  P  |  R  |  S  |  T  |  U  |  V  |  W  |  X 

    +
    +
    +
    +

    Idiomas disponibles:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/directives.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/directives.html.ja.utf8 new file mode 100644 index 00000000..cead6155 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/directives.html.ja.utf8 @@ -0,0 +1,411 @@ + + + +ディレクティブ一覧 - Apache HTTP サーバ + + + + + +
    <-
    +

    ディレクティブ一覧

    +
    +

    Available Languages:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + +

    + 標準 Apache 配布にあるすべての Apache のディレクティブの一覧です。 + これらは一貫した形式で書かれていて、使われている用語の + 用語集 も用意されています。 +

    +

    + 各ディレクティブの概要を説明した ディレクティブクイックリファレンスも + あります。 +

    + +

     A  |  B  |  C  |  D  |  E  |  F  |  G  |  H  |  I  |  K  |  L  |  M  |  N  |  O  |  P  |  R  |  S  |  T  |  U  |  V  |  W  |  X 

    +
    +
    +
    +

    Available Languages:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/directives.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/mod/directives.html.ko.euc-kr new file mode 100644 index 00000000..ed0110b5 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/directives.html.ko.euc-kr @@ -0,0 +1,412 @@ + + + +Áö½Ã¾î ¸ñ·Ï - Apache HTTP Server + + + + + +
    <-
    +

    Áö½Ã¾î ¸ñ·Ï

    +
    +

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

    +
    + +

    + ´ÙÀ½Àº Ç¥ÁØ ¾ÆÆÄÄ¡ ¹èÆ÷º»¿¡¼­ »ç¿ë°¡´ÉÇÑ Áö½Ã¾î ¸ñ·ÏÀÌ´Ù. + À̵éÀ» µ¿ÀÏÇÑ Çü½ÄÀ¸·Î ¼³¸íÇÏ¿´°í, ¼³¸í¿¡ »ç¿ëÇÑ ¿ë¾î + »çÀüµµ ÀÖ´Ù. +

    + +

    + °¢ Áö½Ã¾î¸¦ ¿ä¾àÇÏ¿© ¼³¸íÇÑ Áö½Ã¾î ºü¸¥ÂüÁ¶µµ ÀÖ´Ù. +

    + +

     A  |  B  |  C  |  D  |  E  |  F  |  G  |  H  |  I  |  K  |  L  |  M  |  N  |  O  |  P  |  R  |  S  |  T  |  U  |  V  |  W  |  X 

    +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/directives.html.ru.koi8-r b/rubbos/app/httpd-2.0.64/docs/manual/mod/directives.html.ru.koi8-r new file mode 100644 index 00000000..53daf218 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/directives.html.ru.koi8-r @@ -0,0 +1,416 @@ + + + +áÌÆÁ×ÉÔÎÙÊ ÕËÁÚÁÔÅÌØ ÄÉÒÅËÔÉ× - HTTP ÓÅÒ×ÅÒ Apache + + + + + +
    <-
    +

    áÌÆÁ×ÉÔÎÙÊ ÕËÁÚÁÔÅÌØ ÄÉÒÅËÔÉ×

    +
    +

    äÏÓÔÕÐÎÙÅ ÑÚÙËÉ:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + +

    úÄÅÓØ ÐÒÉ×ÏÄÉÔÓÑ ÓÐÉÓÏË ×ÓÅÈ ÄÉÒÅËÔÉ×, ËÏÔÏÒÙÅ ÄÏÓÔÕÐÎÙ + × ÓÔÁÎÄÁÒÔÎÏÍ ÄÉÓÔÒÉÂÕÔÉ×Å Apache. äÌÑ ËÁÖÄÏÊ ÄÉÒÅËÔÉ×Ù + ÄÁ£ÔÓÑ ËÒÁÔËÏÅ ÏÐÉÓÁÎÉÅ, Á ÓÍÙÓÌ ×ÓÅÈ ÔÅÒÍÉÎÏ×, + ÉÓÐÏÌØÚÏ×ÁÎÎÙÈ ÐÒÉ ÜÔÏÍ, ÍÏÖÎÏ ÎÁÊÔÉ × çÌÏÓÓÁÒÉÉ ÔÅÒÍÉÎÏ×. +

    + +

    + ôÁËÖÅ ÄÏÓÔÕÐÎÏ ëÒÁÔËÏÅ ÒÕËÏ×ÏÄÓÔ×Ï + ÐÏ ÄÉÒÅËÔÉ×ÁÍ, × ËÏÔÏÒÏÍ ÐÒÉ×ÏÄÉÔÓÑ ÓÕÍÍÁÒÎÁÑ ÉÎÆÏÒÍÁÃÉÑ + ÐÏ ×ÓÅÍ ÄÉÒÅËÔÉ×ÁÍ. +

    + +

     A  |  B  |  C  |  D  |  E  |  F  |  G  |  H  |  I  |  K  |  L  |  M  |  N  |  O  |  P  |  R  |  S  |  T  |  U  |  V  |  W  |  X 

    +
    +
    +
    +

    äÏÓÔÕÐÎÙÅ ÑÚÙËÉ:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/directives.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/directives.html.tr.utf8 new file mode 100644 index 00000000..98c5ffa4 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/directives.html.tr.utf8 @@ -0,0 +1,413 @@ + + + +Yönerge Dizini - Apache HTTP Sunucusu + + + + + +
    <-
    +

    Yönerge Dizini

    +
    +

    Mevcut Diller:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + +

    Standart Apache dağıtımında bulunan yönergelerin tamamı burada + listelenmiştir. Hepsi aralarında şekilsel bir uyum sağlanarak + açıklanmışlardır. Açıklamalarında kullanılan terimler için Yönerge Sözlüğüne + bakabilirsiniz.

    + +

    Ayrıca, yönerge ayrıntılarının bir özet olarak listelendiği bir + Hızlı Yönerge Kılavuzu da + mevcuttur.

    + +

     A  |  B  |  C  |  D  |  E  |  F  |  G  |  H  |  I  |  K  |  L  |  M  |  N  |  O  |  P  |  R  |  S  |  T  |  U  |  V  |  W  |  X 

    +
    +
    +
    +

    Mevcut Diller:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/index.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/index.html new file mode 100644 index 00000000..a7474c15 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/index.html @@ -0,0 +1,25 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: index.html.de +Content-Language: de +Content-type: text/html; charset=ISO-8859-1 + +URI: index.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: index.html.es +Content-Language: es +Content-type: text/html; charset=ISO-8859-1 + +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.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/index.html.de b/rubbos/app/httpd-2.0.64/docs/manual/mod/index.html.de new file mode 100644 index 00000000..0262f05b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/index.html.de @@ -0,0 +1,183 @@ + + + +Modul-Index - Apache HTTP Server + + + + + +
    <-
    +

    Modul-Index

    +
    +

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

    +
    + +

    + Unten ist eine Liste aller Module angegeben, die als Bestandteil der + Apache-Distribution mitgeliefert werden. Bitte beachten Sie auch die + vollständige alphabetische Liste aller + Apache-Direktiven. +

    +
    + +
    top
    +

    Kernfunktionen und + Multi-Processing-Module

    +
    +
    core
    Ständig verfügbare Kernfunktionen des Apache HTTP +Servers
    +
    mpm_common
    Eine Sammlung von Direktiven, die in mehr als einem + Multi-Processing-Modul (MPM) implementiert sind.
    +
    beos
    Dieses Multi-Processing-Modul ist für BeOS + optimiert.
    +
    leader
    Eine experimentelle Variante des Standard-MPMs + worker
    +
    mpm_netware
    Multi-Processing Module implementing an exclusively threaded web + server optimized for Novell NetWare
    +
    mpmt_os2
    Hybrid multi-process, multi-threaded MPM for OS/2
    +
    perchild
    Multi-Processing Module allowing for daemon processes serving +requests to be assigned a variety of different userids
    +
    prefork
    Implementiert einen im Voraus forkenden Webserver ohne + Thread-Unterstützung
    +
    threadpool
    Yet another experimental variant of the standard +worker MPM
    +
    mpm_winnt
    Das Multi-Processing-Modul ist optimiert für + Windows NT.
    +
    worker
    Multi-Processing-Modul, das einen Hybrid-Webserver mit + Multi-Thread und Multi-Prozess-Unterstützung implementiert
    +
    +
    top
    +

    Andere Module

    +

     A  |  C  |  D  |  E  |  F  |  H  |  I  |  L  |  M  |  N  |  P  |  R  |  S  |  U  |  V 

    +
    mod_access
    Provides access control based on client hostname, IP +address, or other characteristics of the client request.
    +
    mod_actions
    This module provides for executing CGI scripts based on +media type or request method.
    +
    mod_alias
    Provides for mapping different parts of the host + filesystem in the document tree and for URL redirection
    +
    mod_asis
    Sends files that contain their own +HTTP headers
    +
    mod_auth
    User authentication using text files
    +
    mod_auth_anon
    Allows "anonymous" user access to authenticated +areas
    +
    mod_auth_dbm
    Provides for user authentication using DBM + files
    +
    mod_auth_digest
    User authentication using MD5 + Digest Authentication.
    +
    mod_auth_ldap
    Allows an LDAP directory to be used to store the database +for HTTP Basic authentication.
    +
    mod_autoindex
    Generates directory indexes, + automatically, similar to the Unix ls command or the + Win32 dir shell command
    +
    mod_cache
    Content cache keyed to URIs.
    +
    mod_cern_meta
    CERN httpd metafile semantics
    +
    mod_cgi
    Execution of CGI scripts
    +
    mod_cgid
    Execution of CGI scripts using an + external CGI daemon
    +
    mod_charset_lite
    Specify character set translation or recoding
    +
    mod_dav
    Distributed Authoring and Versioning +(WebDAV) functionality
    +
    mod_dav_fs
    filesystem provider for mod_dav
    +
    mod_deflate
    Compress content before it is delivered to the +client
    +
    mod_dir
    Provides for "trailing slash" redirects and + serving directory index files
    +
    mod_disk_cache
    Content cache storage manager keyed to URIs
    +
    mod_dumpio
    Dumps all I/O to error log as desired.
    +
    mod_echo
    A simple echo server to illustrate protocol +modules
    +
    mod_env
    Modifies the environment which is passed to CGI scripts and +SSI pages
    +
    mod_example
    Illustrates the Apache module API
    +
    mod_expires
    Generation of Expires and +Cache-Control HTTP headers according to user-specified +criteria
    +
    mod_ext_filter
    Pass the response body through an external program before +delivery to the client
    +
    mod_file_cache
    Caches a static list of files in memory
    +
    mod_headers
    Customization of HTTP request and response +headers
    +
    mod_imap
    Server-side imagemap processing
    +
    mod_include
    Server-parsed html documents (Server Side Includes)
    +
    mod_info
    Provides a comprehensive overview of the server +configuration
    +
    mod_isapi
    ISAPI Extensions within Apache for Windows
    +
    mod_ldap
    LDAP connection pooling and result caching services for use +by other LDAP modules
    +
    mod_log_config
    Logging of the requests made to the server
    +
    mod_log_forensic
    Forensic Logging of the requests made to the server
    +
    mod_logio
    Logging of input and output bytes per request
    +
    mod_mem_cache
    Content cache keyed to URIs
    +
    mod_mime
    Associates the requested filename's extensions + with the file's behavior (handlers and filters) + and content (mime-type, language, character set and + encoding)
    +
    mod_mime_magic
    Determines the MIME type of a file + by looking at a few bytes of its contents
    +
    mod_negotiation
    Provides for content negotiation
    +
    mod_nw_ssl
    Enable SSL encryption for NetWare
    +
    mod_proxy
    HTTP/1.1 proxy/gateway server
    +
    mod_proxy_connect
    mod_proxy extension for +CONNECT request handling
    +
    mod_proxy_ftp
    FTP support module for +mod_proxy
    +
    mod_proxy_http
    HTTP support module for +mod_proxy
    +
    mod_rewrite
    Provides a rule-based rewriting engine to rewrite requested +URLs on the fly
    +
    mod_setenvif
    Allows the setting of environment variables based +on characteristics of the request
    +
    mod_so
    Loading of executable code and +modules into the server at start-up or restart time
    +
    mod_speling
    Attempts to correct mistaken URLs that +users might have entered by ignoring capitalization and by +allowing up to one misspelling
    +
    mod_ssl
    Strong cryptography using the Secure Sockets +Layer (SSL) and Transport Layer Security (TLS) protocols
    +
    mod_status
    Provides information on server activity and +performance
    +
    mod_suexec
    Allows CGI scripts to run as a specified user +and Group
    +
    mod_unique_id
    Provides an environment variable with a unique +identifier for each request
    +
    mod_userdir
    User-specific directories
    +
    mod_usertrack
    +Clickstream logging of user activity on a site +
    +
    mod_version
    Version dependent configuration
    +
    mod_vhost_alias
    Provides for dynamically configured mass virtual +hosting
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/index.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/index.html.en new file mode 100644 index 00000000..bef05576 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/index.html.en @@ -0,0 +1,181 @@ + + + +Module Index - Apache HTTP Server + + + + + +
    <-
    +

    Module Index

    +
    +

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

    +
    + +

    + Below is a list of all of the modules that come as part of + the Apache distribution. See also the complete + alphabetical list of all Apache + directives. +

    +
    + +
    top
    +

    Core Features and Multi-Processing + Modules

    +
    +
    core
    Core Apache HTTP Server features that are always +available
    +
    mpm_common
    A collection of directives that are implemented by +more than one multi-processing module (MPM)
    +
    beos
    This Multi-Processing Module is optimized for BeOS.
    +
    leader
    An experimental variant of the standard worker +MPM
    +
    mpm_netware
    Multi-Processing Module implementing an exclusively threaded web + server optimized for Novell NetWare
    +
    mpmt_os2
    Hybrid multi-process, multi-threaded MPM for OS/2
    +
    perchild
    Multi-Processing Module allowing for daemon processes serving +requests to be assigned a variety of different userids
    +
    prefork
    Implements a non-threaded, pre-forking web server
    +
    threadpool
    Yet another experimental variant of the standard +worker MPM
    +
    mpm_winnt
    This Multi-Processing Module is optimized for Windows +NT.
    +
    worker
    Multi-Processing Module implementing a hybrid + multi-threaded multi-process web server
    +
    +
    top
    +

    Other Modules

    +

     A  |  C  |  D  |  E  |  F  |  H  |  I  |  L  |  M  |  N  |  P  |  R  |  S  |  U  |  V 

    +
    mod_access
    Provides access control based on client hostname, IP +address, or other characteristics of the client request.
    +
    mod_actions
    This module provides for executing CGI scripts based on +media type or request method.
    +
    mod_alias
    Provides for mapping different parts of the host + filesystem in the document tree and for URL redirection
    +
    mod_asis
    Sends files that contain their own +HTTP headers
    +
    mod_auth
    User authentication using text files
    +
    mod_auth_anon
    Allows "anonymous" user access to authenticated +areas
    +
    mod_auth_dbm
    Provides for user authentication using DBM + files
    +
    mod_auth_digest
    User authentication using MD5 + Digest Authentication.
    +
    mod_auth_ldap
    Allows an LDAP directory to be used to store the database +for HTTP Basic authentication.
    +
    mod_autoindex
    Generates directory indexes, + automatically, similar to the Unix ls command or the + Win32 dir shell command
    +
    mod_cache
    Content cache keyed to URIs.
    +
    mod_cern_meta
    CERN httpd metafile semantics
    +
    mod_cgi
    Execution of CGI scripts
    +
    mod_cgid
    Execution of CGI scripts using an + external CGI daemon
    +
    mod_charset_lite
    Specify character set translation or recoding
    +
    mod_dav
    Distributed Authoring and Versioning +(WebDAV) functionality
    +
    mod_dav_fs
    filesystem provider for mod_dav
    +
    mod_deflate
    Compress content before it is delivered to the +client
    +
    mod_dir
    Provides for "trailing slash" redirects and + serving directory index files
    +
    mod_disk_cache
    Content cache storage manager keyed to URIs
    +
    mod_dumpio
    Dumps all I/O to error log as desired.
    +
    mod_echo
    A simple echo server to illustrate protocol +modules
    +
    mod_env
    Modifies the environment which is passed to CGI scripts and +SSI pages
    +
    mod_example
    Illustrates the Apache module API
    +
    mod_expires
    Generation of Expires and +Cache-Control HTTP headers according to user-specified +criteria
    +
    mod_ext_filter
    Pass the response body through an external program before +delivery to the client
    +
    mod_file_cache
    Caches a static list of files in memory
    +
    mod_headers
    Customization of HTTP request and response +headers
    +
    mod_imap
    Server-side imagemap processing
    +
    mod_include
    Server-parsed html documents (Server Side Includes)
    +
    mod_info
    Provides a comprehensive overview of the server +configuration
    +
    mod_isapi
    ISAPI Extensions within Apache for Windows
    +
    mod_ldap
    LDAP connection pooling and result caching services for use +by other LDAP modules
    +
    mod_log_config
    Logging of the requests made to the server
    +
    mod_log_forensic
    Forensic Logging of the requests made to the server
    +
    mod_logio
    Logging of input and output bytes per request
    +
    mod_mem_cache
    Content cache keyed to URIs
    +
    mod_mime
    Associates the requested filename's extensions + with the file's behavior (handlers and filters) + and content (mime-type, language, character set and + encoding)
    +
    mod_mime_magic
    Determines the MIME type of a file + by looking at a few bytes of its contents
    +
    mod_negotiation
    Provides for content negotiation
    +
    mod_nw_ssl
    Enable SSL encryption for NetWare
    +
    mod_proxy
    HTTP/1.1 proxy/gateway server
    +
    mod_proxy_connect
    mod_proxy extension for +CONNECT request handling
    +
    mod_proxy_ftp
    FTP support module for +mod_proxy
    +
    mod_proxy_http
    HTTP support module for +mod_proxy
    +
    mod_rewrite
    Provides a rule-based rewriting engine to rewrite requested +URLs on the fly
    +
    mod_setenvif
    Allows the setting of environment variables based +on characteristics of the request
    +
    mod_so
    Loading of executable code and +modules into the server at start-up or restart time
    +
    mod_speling
    Attempts to correct mistaken URLs that +users might have entered by ignoring capitalization and by +allowing up to one misspelling
    +
    mod_ssl
    Strong cryptography using the Secure Sockets +Layer (SSL) and Transport Layer Security (TLS) protocols
    +
    mod_status
    Provides information on server activity and +performance
    +
    mod_suexec
    Allows CGI scripts to run as a specified user +and Group
    +
    mod_unique_id
    Provides an environment variable with a unique +identifier for each request
    +
    mod_userdir
    User-specific directories
    +
    mod_usertrack
    +Clickstream logging of user activity on a site +
    +
    mod_version
    Version dependent configuration
    +
    mod_vhost_alias
    Provides for dynamically configured mass virtual +hosting
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/index.html.es b/rubbos/app/httpd-2.0.64/docs/manual/mod/index.html.es new file mode 100644 index 00000000..8a5e4b11 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/index.html.es @@ -0,0 +1,185 @@ + + + +Índice de Módulos - Servidor HTTP Apache + + + + + +
    <-
    +

    Índice de Módulos

    +
    +

    Idiomas disponibles:  de  | + en  | + es  | + ja  | + ko  | + tr 

    +
    + +

    + Abajo se muestra una lista con todos los módulos que forman + parte de la distribución de Apache. Consulte también la lista + alfabética completa de las + directivas de Apache. +

    +
    + +
    top
    +

    Funcionalidad Básica y Módulos + de MultiProcesamiento

    +
    +
    core
    Funcionalidades básicas del servidor HTTP Apache que +están siempre presentes
    +
    mpm_common
    Es una colección de directivas que están implementadas +en más de un módulo de multiprocesamiento (MPM)
    +
    beos
    Este módulo de muiltiprocesamiento está +optimizado para BeOS.
    +
    leader
    Variante experimental del MPM estándar +worker
    +
    mpm_netware
    Multi-Processing Module implementing an exclusively threaded web + server optimized for Novell NetWare
    +
    mpmt_os2
    Hybrid multi-process, multi-threaded MPM for OS/2
    +
    perchild
    Multi-Processing Module allowing for daemon processes serving +requests to be assigned a variety of different userids
    +
    prefork
    Implementa un servidor web pre-forking y no +hebrado
    +
    threadpool
    Yet another experimental variant of the standard +worker MPM
    +
    mpm_winnt
    Módulo de multiprocesamiento optimizado para Windows +NT.
    +
    worker
    Módulo de MultiProcesamiento que implementa un +servidor web híbrido multihebra-multiproceso
    +
    +
    top
    +

    Otros Módulos

    +

     A  |  C  |  D  |  E  |  F  |  H  |  I  |  L  |  M  |  N  |  P  |  R  |  S  |  U  |  V 

    +
    mod_access
    Provides access control based on client hostname, IP +address, or other characteristics of the client request.
    +
    mod_actions
    This module provides for executing CGI scripts based on +media type or request method.
    +
    mod_alias
    Provides for mapping different parts of the host + filesystem in the document tree and for URL redirection
    +
    mod_asis
    Sends files that contain their own +HTTP headers
    +
    mod_auth
    User authentication using text files
    +
    mod_auth_anon
    Allows "anonymous" user access to authenticated +areas
    +
    mod_auth_dbm
    Provides for user authentication using DBM + files
    +
    mod_auth_digest
    User authentication using MD5 + Digest Authentication.
    +
    mod_auth_ldap
    Allows an LDAP directory to be used to store the database +for HTTP Basic authentication.
    +
    mod_autoindex
    Generates directory indexes, + automatically, similar to the Unix ls command or the + Win32 dir shell command
    +
    mod_cache
    Content cache keyed to URIs.
    +
    mod_cern_meta
    CERN httpd metafile semantics
    +
    mod_cgi
    Execution of CGI scripts
    +
    mod_cgid
    Execution of CGI scripts using an + external CGI daemon
    +
    mod_charset_lite
    Specify character set translation or recoding
    +
    mod_dav
    Distributed Authoring and Versioning +(WebDAV) functionality
    +
    mod_dav_fs
    filesystem provider for mod_dav
    +
    mod_deflate
    Compress content before it is delivered to the +client
    +
    mod_dir
    Provides for "trailing slash" redirects and + serving directory index files
    +
    mod_disk_cache
    Content cache storage manager keyed to URIs
    +
    mod_dumpio
    Dumps all I/O to error log as desired.
    +
    mod_echo
    A simple echo server to illustrate protocol +modules
    +
    mod_env
    Modifies the environment which is passed to CGI scripts and +SSI pages
    +
    mod_example
    Illustrates the Apache module API
    +
    mod_expires
    Generation of Expires and +Cache-Control HTTP headers according to user-specified +criteria
    +
    mod_ext_filter
    Pass the response body through an external program before +delivery to the client
    +
    mod_file_cache
    Caches a static list of files in memory
    +
    mod_headers
    Customization of HTTP request and response +headers
    +
    mod_imap
    Server-side imagemap processing
    +
    mod_include
    Server-parsed html documents (Server Side Includes)
    +
    mod_info
    Provides a comprehensive overview of the server +configuration
    +
    mod_isapi
    ISAPI Extensions within Apache for Windows
    +
    mod_ldap
    LDAP connection pooling and result caching services for use +by other LDAP modules
    +
    mod_log_config
    Logging of the requests made to the server
    +
    mod_log_forensic
    Forensic Logging of the requests made to the server
    +
    mod_logio
    Logging of input and output bytes per request
    +
    mod_mem_cache
    Content cache keyed to URIs
    +
    mod_mime
    Associates the requested filename's extensions + with the file's behavior (handlers and filters) + and content (mime-type, language, character set and + encoding)
    +
    mod_mime_magic
    Determines the MIME type of a file + by looking at a few bytes of its contents
    +
    mod_negotiation
    Provides for content negotiation
    +
    mod_nw_ssl
    Enable SSL encryption for NetWare
    +
    mod_proxy
    HTTP/1.1 proxy/gateway server
    +
    mod_proxy_connect
    mod_proxy extension for +CONNECT request handling
    +
    mod_proxy_ftp
    FTP support module for +mod_proxy
    +
    mod_proxy_http
    HTTP support module for +mod_proxy
    +
    mod_rewrite
    Provides a rule-based rewriting engine to rewrite requested +URLs on the fly
    +
    mod_setenvif
    Allows the setting of environment variables based +on characteristics of the request
    +
    mod_so
    Loading of executable code and +modules into the server at start-up or restart time
    +
    mod_speling
    Attempts to correct mistaken URLs that +users might have entered by ignoring capitalization and by +allowing up to one misspelling
    +
    mod_ssl
    Strong cryptography using the Secure Sockets +Layer (SSL) and Transport Layer Security (TLS) protocols
    +
    mod_status
    Provides information on server activity and +performance
    +
    mod_suexec
    Allows CGI scripts to run as a specified user +and Group
    +
    mod_unique_id
    Provides an environment variable with a unique +identifier for each request
    +
    mod_userdir
    User-specific directories
    +
    mod_usertrack
    +Clickstream logging of user activity on a site +
    +
    mod_version
    Version dependent configuration
    +
    mod_vhost_alias
    Provides for dynamically configured mass virtual +hosting
    +
    +
    +

    Idiomas disponibles:  de  | + en  | + es  | + ja  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/index.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/index.html.ja.utf8 new file mode 100644 index 00000000..11ebeb2f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/index.html.ja.utf8 @@ -0,0 +1,172 @@ + + + +モジュール一覧 - Apache HTTP サーバ + + + + + +
    <-
    +

    モジュール一覧

    +
    +

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

    +
    + +

    + 以下は Apache の配布の一部として配られているすべてのモジュールの + 一覧です。すべての Apache + ディレクティブ のアルファベット順のリストも見てください。 +

    +
    + +
    top
    +

    コア機能と MPM

    +
    +
    core
    常に使用可能な Apache HTTP サーバのコア機能
    +
    mpm_common
    二つ以上のマルチプロセッシングモジュール (MPM) +で実装されているディレクティブのコレクション
    +
    beos
    This Multi-Processing Module is optimized for BeOS.
    +
    leader
    An experimental variant of the standard worker +MPM
    +
    mpm_netware
    Multi-Processing Module implementing an exclusively threaded web + server optimized for Novell NetWare
    +
    mpmt_os2
    Hybrid multi-process, multi-threaded MPM for OS/2
    +
    perchild
    Multi-Processing Module allowing for daemon processes serving +requests to be assigned a variety of different userids
    +
    prefork
    スレッドを使わず、先行して fork を行なうウェブサーバを実装 +
    +
    threadpool
    Yet another experimental variant of the standard +worker MPM
    +
    mpm_winnt
    Windows NT +向けに最適化されたマルチプロセッシングモジュール
    +
    worker
    マルチスレッドとマルチプロセスのハイブリッド型 +ウェブサーバを実装したマルチプロセッシングモジュール
    +
    +
    top
    +

    他のモジュール

    +

     A  |  C  |  D  |  E  |  F  |  H  |  I  |  L  |  M  |  N  |  P  |  R  |  S  |  U  |  V 

    +
    mod_access
    クライアントのホスト名、IP アドレス、その他のクライアント +のリクエストの特徴に基づいたアクセス制御機能を提供する
    +
    mod_actions
    メディアタイプやリクエストメソッドに応じて +CGI スクリプトを実行する機能を提供
    +
    mod_alias
    ホストファイルシステム上のいろいろな違う場所を + ドキュメントツリーにマップする機能と、 + URL のリダイレクトを行なう機能を提供する
    +
    mod_asis
    自分用の HTTP ヘッダの書かれているファイルを送信する
    +
    mod_auth
    テキストファイルを用いたユーザ認証
    +
    mod_auth_anon
    Allows "anonymous" user access to authenticated +areas
    +
    mod_auth_dbm
    Provides for user authentication using DBM + files
    +
    mod_auth_digest
    User authentication using MD5 + Digest Authentication.
    +
    mod_auth_ldap
    Allows an LDAP directory to be used to store the database +for HTTP Basic authentication.
    +
    mod_autoindex
    Unix の ls コマンドや + Win32 の dir シェルコマンドに似た + ディレクトリインデックスを生成する
    +
    mod_cache
    Content cache keyed to URIs.
    +
    mod_cern_meta
    CERN httpd metafile semantics
    +
    mod_cgi
    CGI スクリプトの実行
    +
    mod_cgid
    外部 CGI デーモンを使った CGI スクリプトの実行
    +
    mod_charset_lite
    Specify character set translation or recoding
    +
    mod_dav
    分散オーサリングとバージョン管理 +(WebDAV) 機能
    +
    mod_dav_fs
    mod_dav のためのファイルシステムプロバイダ
    +
    mod_deflate
    クライアントへ送られる前にコンテンツを圧縮する
    +
    mod_dir
    「最後のスラッシュ」のリダイレクトと、ディレクトリの +インデックスファイルを扱う機能を提供する
    +
    mod_disk_cache
    Content cache storage manager keyed to URIs
    +
    mod_dumpio
    Dumps all I/O to error log as desired.
    +
    mod_echo
    プロトコルモジュールの概要を示すための単純なエコーサーバ +
    +
    mod_env
    CGI スクリプト及び SSI +ページに渡される環境変数を変更する機能を提供する
    +
    mod_example
    Illustrates the Apache module API
    +
    mod_expires
    ユーザの指定した基準に基づいた Expires と +Cache-Control HTTP ヘッダの生成
    +
    mod_ext_filter
    Pass the response body through an external program before +delivery to the client
    +
    mod_file_cache
    Caches a static list of files in memory
    +
    mod_headers
    Customization of HTTP request and response +headers
    +
    mod_imap
    Server-side imagemap processing
    +
    mod_include
    サーバがパースする html ドキュメント (Server Side Includes)
    +
    mod_info
    サーバの設定の包括的な概観を提供する
    +
    mod_isapi
    ISAPI Extensions within Apache for Windows
    +
    mod_ldap
    LDAP connection pooling and result caching services for use +by other LDAP modules
    +
    mod_log_config
    サーバへのリクエストのロギング
    +
    mod_log_forensic
    Forensic Logging of the requests made to the server
    +
    mod_logio
    リクエスト毎に入力バイト数と出力バイト数とをロギング
    +
    mod_mem_cache
    URI をキーにしたコンテンツのキャッシュ
    +
    mod_mime
    リクエストされたファイルの拡張子とファイルの振る舞い + (ハンドラとフィルタ)、内容 (MIME タイプ、言語、文字セット、エンコーディング) + とを関連付ける
    +
    mod_mime_magic
    Determines the MIME type of a file + by looking at a few bytes of its contents
    +
    mod_negotiation
    コンテントネゴシエーション + 機能を提供する
    +
    mod_nw_ssl
    Enable SSL encryption for NetWare
    +
    mod_proxy
    HTTP/1.1 proxy/gateway server
    +
    mod_proxy_connect
    mod_proxy extension for +CONNECT request handling
    +
    mod_proxy_ftp
    FTP support module for +mod_proxy
    +
    mod_proxy_http
    HTTP support module for +mod_proxy
    +
    mod_rewrite
    Provides a rule-based rewriting engine to rewrite requested +URLs on the fly
    +
    mod_setenvif
    リクエストの特徴に基づいた環境変数の設定を可能にする
    +
    mod_so
    起動時や再起動時に実行コードとモジュールをサーバにロードする +
    +
    mod_speling
    ユーザが入力したであろう間違った URL を、 +大文字小文字の区別を無視することと一つ以下の綴り間違いを許容することで +修正を試みる
    +
    mod_ssl
    Strong cryptography using the Secure Sockets +Layer (SSL) and Transport Layer Security (TLS) protocols
    +
    mod_status
    サーバの活動状況と性能に関する情報を提供する
    +
    mod_suexec
    指定されたユーザとグループで CGI スクリプトを実行する
    +
    mod_unique_id
    それぞれのリクエストに対する一意な識別子の入った環境変数を +提供する
    +
    mod_userdir
    ユーザ専用のディレクトリを提供 +
    +
    mod_usertrack
    +Clickstream logging of user activity on a site +
    +
    mod_version
    バージョン依存の設定
    +
    mod_vhost_alias
    Provides for dynamically configured mass virtual +hosting
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/index.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/mod/index.html.ko.euc-kr new file mode 100644 index 00000000..e56b5930 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/index.html.ko.euc-kr @@ -0,0 +1,163 @@ + + + +¸ðµâ ¸ñ·Ï - Apache HTTP Server + + + + + +
    <-
    +

    ¸ðµâ ¸ñ·Ï

    +
    +

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

    +
    + +

    + ´ÙÀ½Àº ¾ÆÆÄÄ¡ ¹èÆ÷º»¿¡ Æ÷ÇÔµÈ ¸ðµç ¸ðµâ ¸ñ·ÏÀÌ´Ù. ¸ðµç ¾ÆÆÄÄ¡ Áö½Ã¾î ¸ñ·Ïµµ + Âü°íÇ϶ó. +

    +
    + +
    top
    +

    ÇÙ½É ±â´É°ú ´ÙÁßó¸® ¸ðµâ

    +
    +
    core
    Core Apache HTTP Server features that are always +available
    +
    mpm_common
    A collection of directives that are implemented by +more than one multi-processing module (MPM)
    +
    beos
    BeOS¿¡ ÃÖÀûÈ­µÈ ´ÙÁßó¸® ¸ðµâ.
    +
    leader
    Ç¥ÁØ worker MPMÀÇ ½ÇÇèÀûÀÎ º¯Çü
    +
    mpm_netware
    Multi-Processing Module implementing an exclusively threaded web + server optimized for Novell NetWare
    +
    mpmt_os2
    Hybrid multi-process, multi-threaded MPM for OS/2
    +
    perchild
    Multi-Processing Module allowing for daemon processes serving +requests to be assigned a variety of different userids
    +
    prefork
    Implements a non-threaded, pre-forking web server
    +
    threadpool
    Yet another experimental variant of the standard +worker MPM
    +
    mpm_winnt
    This Multi-Processing Module is optimized for Windows +NT.
    +
    worker
    Multi-Processing Module implementing a hybrid + multi-threaded multi-process web server
    +
    +
    top
    +

    ´Ù¸¥ ¸ðµâ

    +

     A  |  C  |  D  |  E  |  F  |  H  |  I  |  L  |  M  |  N  |  P  |  R  |  S  |  U  |  V 

    +
    mod_access
    Provides access control based on client hostname, IP +address, or other characteristics of the client request.
    +
    mod_actions
    ÀÌ ¸ðµâÀº ¹Ìµð¾îÁ¾·ù³ª ¿äû¸Þ¼­µå¿¡ µû¶ó CGI +½ºÅ©¸³Æ®¸¦ ½ÇÇàÇÑ´Ù.
    +
    mod_alias
    ÆÄÀϽýºÅÛÀÇ ´Ù¸¥ ºÎºÐµéÀ» ¹®¼­ °èÃþ±¸Á¶¿¡ Æ÷ÇÔÇÏ°í, + URL ¸®´ÙÀÌ·º¼ÇÀ» Á¦°øÇÑ´Ù
    +
    mod_asis
    HTTP Çì´õ¸¦ Æ÷ÇÔÇÑ ÆÄÀÏÀ» º¸³½´Ù
    +
    mod_auth
    User authentication using text files
    +
    mod_auth_anon
    Allows "anonymous" user access to authenticated +areas
    +
    mod_auth_dbm
    Provides for user authentication using DBM + files
    +
    mod_auth_digest
    MD5 Digest AuthenticationÀ» »ç¿ëÇÑ »ç¿ëÀÚÀÎÁõ.
    +
    mod_auth_ldap
    Allows an LDAP directory to be used to store the database +for HTTP Basic authentication.
    +
    mod_autoindex
    ÀÚµ¿À¸·Î À¯´Ð½ºÀÇ ls ¸í·É¾î³ª Win32ÀÇ + dir ½©¸í·É¾î¿Í À¯»çÇÑ µð·ºÅ丮 ¸ñ·ÏÀ» ¸¸µç´Ù
    +
    mod_cache
    Content cache keyed to URIs.
    +
    mod_cern_meta
    CERN À¥¼­¹ö ¸ÞŸÆÄÀÏ Áö¿ø
    +
    mod_cgi
    CGI ½ºÅ©¸³Æ® ½ÇÇà
    +
    mod_cgid
    ¿ÜºÎ CGI µ¥¸óÀ» »ç¿ëÇÏ¿© CGI ½ºÅ©¸³Æ®¸¦ ½ÇÇà
    +
    mod_charset_lite
    ¹®ÀÚÁýÇÕ º¯È¯À» ÁöÁ¤
    +
    mod_dav
    Distributed Authoring and Versioning +(WebDAV) ±â´É
    +
    mod_dav_fs
    mod_davÀ» À§ÇÑ ÆÄÀϽýºÅÛ Á¦°øÀÚ
    +
    mod_deflate
    ³»¿ëÀ» Ŭ¶óÀ̾ðÆ®·Î º¸³»±â Àü¿¡ ¾ÐÃàÇÑ´Ù
    +
    mod_dir
    "¸¶Áö¸· ½½·¡½¬" ¸®´ÙÀÌ·º¼ÇÀ» Á¦°øÇÏ°í µð·ºÅ丮 +index ÆÄÀÏÀ» ¼­ºñ½ºÇÑ´Ù
    +
    mod_disk_cache
    Content cache storage manager keyed to URIs
    +
    mod_dumpio
    Dumps all I/O to error log as desired.
    +
    mod_echo
    ÇÁ·ÎÅäÄÝ ¸ðµâÀ» ¼³¸íÇϱâÀ§ÇÑ °£´ÜÇÑ echo ¼­¹ö
    +
    mod_env
    CGI ½ºÅ©¸³Æ®³ª SSI ÆäÀÌÁö¿¡ Àü´ÞÇÒ È¯°æº¯¼ö¸¦ +¼öÁ¤ÇÑ´Ù
    +
    mod_example
    ¾ÆÆÄÄ¡ ¸ðµâ API¸¦ ¼³¸íÇÑ´Ù
    +
    mod_expires
    »ç¿ëÀÚ°¡ ÁöÁ¤ÇÑ ±âÁØ¿¡ µû¶ó Expires¿Í +Cache-Control HTTP Çì´õ¸¦ »ý¼ºÇÑ´Ù
    +
    mod_ext_filter
    ÀÀ´ä ³»¿ëÀ» ¿ÜºÎ ÇÁ·Î±×·¥À¸·Î ó¸®ÇÑ ÈÄ Å¬¶óÀ̾ðÆ®·Î +º¸³½´Ù
    +
    mod_file_cache
    ¸Þ¸ð¸®¿¡ Á¤Àû ÆÄÀϵéÀ» ij½¬
    +
    mod_headers
    HTTP ¿äû Çì´õ¿Í ÀÀ´ä Çì´õ ¼öÁ¤
    +
    mod_imap
    ¼­¹öÃø À̹ÌÁö¸Ê(imagemap) ó¸®
    +
    mod_include
    Server-parsed html documents (Server Side Includes)
    +
    mod_info
    ¼­¹ö ¼³Á¤¿¡ ´ëÇÑ Á¾ÇÕÀûÀÎ Á¤º¸¸¦ º¸¿©ÁØ´Ù
    +
    mod_isapi
    Windows¿ë ¾ÆÆÄÄ¡¿¡¼­ ISAPI Extension »ç¿ë
    +
    mod_ldap
    LDAP connection pooling and result caching services for use +by other LDAP modules
    +
    mod_log_config
    ¼­¹ö·ÎÀÇ ¿äûÀ» ·Î±×¿¡ ±â·ÏÇÑ´Ù
    +
    mod_log_forensic
    Forensic Logging of the requests made to the server
    +
    mod_logio
    ¿äû´ç ÀÔÃâ·Â ¹ÙÀÌÆ®¼ö¸¦ ±â·Ï
    +
    mod_mem_cache
    URI¸¦ Å°·Î »ç¿ëÇÏ¿© ³»¿ëÀ» ij½¬ÇÑ´Ù.
    +
    mod_mime
    Associates the requested filename's extensions + with the file's behavior (handlers and filters) + and content (mime-type, language, character set and + encoding)
    +
    mod_mime_magic
    Determines the MIME type of a file + by looking at a few bytes of its contents
    +
    mod_negotiation
    Provides for content negotiation
    +
    mod_nw_ssl
    Enable SSL encryption for NetWare
    +
    mod_proxy
    HTTP/1.1 proxy/gateway server
    +
    mod_proxy_connect
    mod_proxy extension for +CONNECT request handling
    +
    mod_proxy_ftp
    FTP support module for +mod_proxy
    +
    mod_proxy_http
    HTTP support module for +mod_proxy
    +
    mod_rewrite
    Provides a rule-based rewriting engine to rewrite requested +URLs on the fly
    +
    mod_setenvif
    ¿äûÀÇ ¼º°Ý¿¡ µû¶ó ȯ°æº¯¼ö ¼³Á¤À» º¯°æÇÑ´Ù
    +
    mod_so
    ½ÃÀÛÇÒ¶§ ȤÀº Àç½ÃÀÛÇÒ¶§ ½ÇÇà°¡´ÉÇÑ ÄÚµå¿Í ¸ðµâÀ» +¼­¹ö·Î ÀоîµéÀδÙ
    +
    mod_speling
    »ç¿ëÀÚ°¡ ´ë¼Ò¹®ÀÚ¸¦ À߸ø »ç¿ëÇϰųª ¸ÂÃã¹ýÀÌ Æ²¸®´Â +°ÍÀ» Çѹø±îÁö Çã¿ëÇÏ¿© À߸øµÈ URLÀ» °íÄ¡·Á°í ½ÃµµÇÑ´Ù
    +
    mod_ssl
    Strong cryptography using the Secure Sockets +Layer (SSL) and Transport Layer Security (TLS) protocols
    +
    mod_status
    ¼­¹ö È°µ¿°ú ¼º´É¿¡ ´ëÇÑ Á¤º¸¸¦ Á¦°øÇÑ´Ù
    +
    mod_suexec
    CGI ½ºÅ©¸³Æ®¸¦ ƯÁ¤ »ç¿ëÀÚ¿Í ±×·ì ±ÇÇÑÀ¸·Î ½ÇÇàÇÑ´Ù
    +
    mod_unique_id
    °¢ ¿äû¸¶´Ù À¯ÀÏÇÑ ½Äº°ÀÚ¸¦ °¡Áö´Â ȯ°æº¯¼ö¸¦ +Á¦°øÇÑ´Ù
    +
    mod_userdir
    »ç¿ëÀÚº° µð·ºÅ丮
    +
    mod_usertrack
    +Clickstream logging of user activity on a site +
    +
    mod_version
    ¹öÀüº° ¼³Á¤
    +
    mod_vhost_alias
    Provides for dynamically configured mass virtual +hosting
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/index.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/index.html.tr.utf8 new file mode 100644 index 00000000..37335fbe --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/index.html.tr.utf8 @@ -0,0 +1,174 @@ + + + +Modül Dizini - Apache HTTP Sunucusu + + + + + +
    <-
    +

    Modül Dizini

    +
    +

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

    +
    + +

    Apache dağıtımının parçası olarak gelen modüllerin tamamı aşağıda + listelenmiştir. Ayrıca, tüm Apache yönergelerinin alfabetik olarak + listelendiği bir Yönerge Dizini de + mevcuttur.

    +
    + +
    top
    +

    Temel Özellikler ve Çoklu İşlem Modülleri

    +
    +
    core
    Apache HTTP Sunucusunda daima mevcut olan çekirdek + özellikler
    +
    mpm_common
    Birden fazla Çok Süreçlilik Modülü (MPM) tarafından gerçeklenmiş + yönergeler bütünü.
    +
    beos
    This Multi-Processing Module is optimized for BeOS.
    +
    leader
    An experimental variant of the standard worker +MPM
    +
    mpm_netware
    Multi-Processing Module implementing an exclusively threaded web + server optimized for Novell NetWare
    +
    mpmt_os2
    Hybrid multi-process, multi-threaded MPM for OS/2
    +
    perchild
    Multi-Processing Module allowing for daemon processes serving +requests to be assigned a variety of different userids
    +
    prefork
    Evresiz ön çatallamalı HTTP sunucusu oluşturur
    +
    threadpool
    Yet another experimental variant of the standard +worker MPM
    +
    mpm_winnt
    This Multi-Processing Module is optimized for Windows +NT.
    +
    worker
    Çok evreli ve çok süreçli melez bir HTTP sunucusu oluşturan çok +süreçlilik modülü.
    +
    +
    top
    +

    Diğer Modüller

    +

     A  |  C  |  D  |  E  |  F  |  H  |  I  |  L  |  M  |  N  |  P  |  R  |  S  |  U  |  V 

    +
    mod_access
    Provides access control based on client hostname, IP +address, or other characteristics of the client request.
    +
    mod_actions
    This module provides for executing CGI scripts based on +media type or request method.
    +
    mod_alias
    Belge ağacının parçalarının dosya sisteminin parçalarıyla +eşlenmesini sağlar ve URL yönlendirmesi yapar.
    +
    mod_asis
    Sends files that contain their own +HTTP headers
    +
    mod_auth
    User authentication using text files
    +
    mod_auth_anon
    Allows "anonymous" user access to authenticated +areas
    +
    mod_auth_dbm
    Provides for user authentication using DBM + files
    +
    mod_auth_digest
    User authentication using MD5 + Digest Authentication.
    +
    mod_auth_ldap
    Allows an LDAP directory to be used to store the database +for HTTP Basic authentication.
    +
    mod_autoindex
    Unix ls veya Win32 dir kabuk komutunun +yaptığı gibi dizin içeriğini listeler.
    +
    mod_cache
    Content cache keyed to URIs.
    +
    mod_cern_meta
    CERN httpd metafile semantics
    +
    mod_cgi
    Execution of CGI scripts
    +
    mod_cgid
    Execution of CGI scripts using an + external CGI daemon
    +
    mod_charset_lite
    Specify character set translation or recoding
    +
    mod_dav
    Distributed Authoring and Versioning +(WebDAV) functionality
    +
    mod_dav_fs
    filesystem provider for mod_dav
    +
    mod_deflate
    Compress content before it is delivered to the +client
    +
    mod_dir
    Bölü çizgisiyle biten yönlendirmeleri yapar ve dizin içeriği dosyalarını sunar.
    +
    mod_disk_cache
    Content cache storage manager keyed to URIs
    +
    mod_dumpio
    Dumps all I/O to error log as desired.
    +
    mod_echo
    A simple echo server to illustrate protocol +modules
    +
    mod_env
    CGI betiklerine ve SSI sayfalarına aktarılan değişkenlere +müdahale etmek için kullanılır.
    +
    mod_example
    Illustrates the Apache module API
    +
    mod_expires
    Generation of Expires and +Cache-Control HTTP headers according to user-specified +criteria
    +
    mod_ext_filter
    Pass the response body through an external program before +delivery to the client
    +
    mod_file_cache
    Caches a static list of files in memory
    +
    mod_headers
    Customization of HTTP request and response +headers
    +
    mod_imap
    Server-side imagemap processing
    +
    mod_include
    Server-parsed html documents (Server Side Includes)
    +
    mod_info
    Provides a comprehensive overview of the server +configuration
    +
    mod_isapi
    ISAPI Extensions within Apache for Windows
    +
    mod_ldap
    LDAP connection pooling and result caching services for use +by other LDAP modules
    +
    mod_log_config
    Sunucuya yapılan isteklerin günlük kayıtlarının tutulması +
    +
    mod_log_forensic
    Sunucuya yapılan isteklerin adli günlük kayıtlarının tutulması
    +
    mod_logio
    Her isteğin girdi ve çıktı uzunluklarının günlüklenmesi. +
    +
    mod_mem_cache
    Content cache keyed to URIs
    +
    mod_mime
    Associates the requested filename's extensions + with the file's behavior (handlers and filters) + and content (mime-type, language, character set and + encoding)
    +
    mod_mime_magic
    Determines the MIME type of a file + by looking at a few bytes of its contents
    +
    mod_negotiation
    Provides for content negotiation
    +
    mod_nw_ssl
    Enable SSL encryption for NetWare
    +
    mod_proxy
    HTTP/1.1 proxy/gateway server
    +
    mod_proxy_connect
    mod_proxy extension for +CONNECT request handling
    +
    mod_proxy_ftp
    FTP support module for +mod_proxy
    +
    mod_proxy_http
    HTTP support module for +mod_proxy
    +
    mod_rewrite
    Provides a rule-based rewriting engine to rewrite requested +URLs on the fly
    +
    mod_setenvif
    Ortam değişkenlerinin isteğin özelliklerine uygun olarak atanmasını sağlar
    +
    mod_so
    Modüllerin ve çalıştırılabilir kodun sunucunun başlatılması veya +yeniden başlatılması sırasında yüklenmesini sağlar.
    +
    mod_speling
    Attempts to correct mistaken URLs that +users might have entered by ignoring capitalization and by +allowing up to one misspelling
    +
    mod_ssl
    Strong cryptography using the Secure Sockets +Layer (SSL) and Transport Layer Security (TLS) protocols
    +
    mod_status
    Sunucu etkinliği ve başarımı hakkında bilgi sağlar.
    +
    mod_suexec
    CGI betiklerinin belli bir kullanıcı ve grubun aidiyetinde +çalışmasını mümkün kılar.
    +
    mod_unique_id
    Provides an environment variable with a unique +identifier for each request
    +
    mod_userdir
    Kullanıcılara özel dizinler
    +
    mod_usertrack
    +Clickstream logging of user activity on a site +
    +
    mod_version
    Version dependent configuration
    +
    mod_vhost_alias
    Kitlesel sanal konakların devingen olarak yapılandırılmasını sağlar
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/leader.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/leader.html new file mode 100644 index 00000000..852887c5 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/leader.html @@ -0,0 +1,17 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: leader.html.de +Content-Language: de +Content-type: text/html; charset=ISO-8859-1 + +URI: leader.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: leader.html.es +Content-Language: es +Content-type: text/html; charset=ISO-8859-1 + +URI: leader.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/leader.html.de b/rubbos/app/httpd-2.0.64/docs/manual/mod/leader.html.de new file mode 100644 index 00000000..b2c25e13 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/leader.html.de @@ -0,0 +1,97 @@ + + + +leader - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache-MPM leader

    +
    +

    Verfügbare Sprachen:  de  | + en  | + es  | + ko 

    +
    + + + +
    Beschreibung:Eine experimentelle Variante des Standard-MPMs + worker
    Status:MPM
    Modulbezeichner:mpm_leader_module
    Quelltext-Datei:leader.c
    +

    Zusammenfassung

    + +

    Warnung

    +

    Dieses MPM ist noch experimentell und funktioniert möglicherweise + nicht wie erwartet.

    +
    + +

    Dies ist eine experimentelle Variante des Standard-MPMs + worker. Das Modul verwendet ein + Leader/Followers-Design-Pattern, um die Arbeit zwischen Threads zu + koordinieren. Weitere Informationen finden Sie unter http://deuce.doc.wustl.edu/doc/pspdfs/lf.pdf.

    + +

    Um bei der Erstellung des httpd das MPM + leader zu verwenden, fügen Sie den Argumenten + des configure-Skripts --with-mpm=leader + hinzu.

    + +

    Dieses MPM baut auf den atomaren APR-Vergleichs- und -Tauschoperationen + für die Thread-Synchronisation auf. Wenn Sie für einen + x86-Rechner kompilieren, ohne dass 386-Unterstützung benötigt + wird, oder wenn Sie für einen SPARC-Rechner kompilieren und keine + pre-UltraSPARC-Chips betreiben müssen, fügen Sie den Argumenten + des configure-Skripts + --enable-nonportable-atomics=yes hinzu. Dies veranlasst die + APR veranlasst dazu, atomare Operationen einzusetzen, welche effizienten + Befehlscode verwenden, der älteren CPUs nicht zur Verfügung + stehen.

    +
    + + +
    +
    +

    Verfügbare Sprachen:  de  | + en  | + es  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/leader.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/leader.html.en new file mode 100644 index 00000000..a9673649 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/leader.html.en @@ -0,0 +1,93 @@ + + + +leader - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache MPM leader

    +
    +

    Available Languages:  de  | + en  | + es  | + ko 

    +
    + + + +
    Description:An experimental variant of the standard worker +MPM
    Status:MPM
    Module Identifier:mpm_leader_module
    Source File:leader.c
    +

    Summary

    + +

    Warning

    +

    This MPM is experimental, so it may or may not work + as expected.

    +
    + +

    This is an experimental variant of the standard + worker MPM. It uses a Leader/Followers design pattern + to coordinate work among threads. For more info, see http://deuce.doc.wustl.edu/doc/pspdfs/lf.pdf.

    + +

    To use the leader MPM, add + --with-mpm=leader to the configure + script's arguments when building the httpd.

    + +

    This MPM depends on APR's atomic compare-and-swap operations for + thread synchronization. If you are compiling for an x86 target + and you don't need to support 386s, or you are compiling for a + SPARC and you don't need to run on pre-UltraSPARC chips, add + --enable-nonportable-atomics=yes to the + configure script's arguments. This will cause + APR to implement atomic operations + using efficient opcodes not available in older CPUs.

    +
    + + +
    +
    +

    Available Languages:  de  | + en  | + es  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/leader.html.es b/rubbos/app/httpd-2.0.64/docs/manual/mod/leader.html.es new file mode 100644 index 00000000..5c70a9bb --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/leader.html.es @@ -0,0 +1,102 @@ + + + +leader - Servidor HTTP Apache + + + + + + +
    <-
    + +
    +

    MPM de Apache leader

    +
    +

    Idiomas disponibles:  de  | + en  | + es  | + 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.
    + + + +
    Descripción:Variante experimental del MPM estándar +worker
    Estado:MPM
    Identificador de Módulos:mpm_leader_module
    Fichero de Código Fuente:leader.c
    +

    Resumen de contenidos

    + +

    Advertencia

    +

    Este módulo es todavía experimental, lo que + significa que podría no funcionar como se espera.

    +
    + +

    Este módulo es una variante experimental del módulo + de multiprocesamiento estándar worker. Usa + un patrón de diseño Leader/Followers para coordinar el + trabajo entre las hebras. Para más información, consulte + http://deuce.doc.wustl.edu/doc/pspdfs/lf.pdf.

    + +

    Para usar el módulo de multiprocesamiento + leader, añada + --with-mpm=leader como argumento al script + configure en el momento de compilar + httpd.

    + +

    Este módulo de multiprocesamiento depende de operaciones + atómicas compare-and-swap del APR para sincronizar las + hebras. Si está compilando el servidor para una máquina + x86 y no necesita soportar la arquitectura 386, o está + compilando para una máquina SPARC y no necesita ejecutar el + servidor en chips pre-UltraSPARC, añada + --enable-nonportable-atomics=yes como argumento al + script configure. Esto hará que APR implemente + las operaciones atómicas usando opciones más eficientes + que no están presentes para CPUs antiguas.

    +
    + + +
    +
    +

    Idiomas disponibles:  de  | + en  | + es  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/leader.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/mod/leader.html.ko.euc-kr new file mode 100644 index 00000000..ad30936e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/leader.html.ko.euc-kr @@ -0,0 +1,92 @@ + + + +leader - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    ¾ÆÆÄÄ¡ MPM leader

    +
    +

    °¡´ÉÇÑ ¾ð¾î:  de  | + en  | + es  | + ko 

    +
    +
    ÀÌ ¹®¼­´Â ÃÖ½ÅÆÇ ¹ø¿ªÀÌ ¾Æ´Õ´Ï´Ù. + ÃÖ±Ù¿¡ º¯°æµÈ ³»¿ëÀº ¿µ¾î ¹®¼­¸¦ Âü°íÇϼ¼¿ä.
    + + + +
    ¼³¸í:Ç¥ÁØ worker MPMÀÇ ½ÇÇèÀûÀÎ º¯Çü
    »óÅÂ:MPM
    ¸ðµâ¸í:mpm_leader_module
    ¼Ò½ºÆÄÀÏ:leader.c
    +

    ¿ä¾à

    + +

    ÁÖÀÇ

    +

    ÀÌ MPMÀº ½ÇÇèÀûÀÎ »óÅ·Î, ±â´ëÇÑ´ë·Î µ¿ÀÛÇÏÁö¾ÊÀ» ¼ö ÀÖ´Ù.

    +
    + +

    ÀÌ ¸ðµâÀº Ç¥ÁØ worker MPMÀÇ ½ÇÇèÀûÀÎ + º¯ÇüÀÌ´Ù. ÀÌ ¸ðµâÀº ¾²·¹µå°£ÀÇ Çùµ¿À» À§ÇØ Leader/Followers + µðÀÚÀÎÆÐÅÏÀ» »ç¿ëÇÑ´Ù. ´õ ÀÚ¼¼ÇÑ Á¤º¸´Â http://deuce.doc.wustl.edu/doc/pspdfs/lf.pdf¸¦ Âü°íÇ϶ó.

    + +

    leader MPMÀ» »ç¿ëÇÏ·Á¸é, + httpd¸¦ ÄÄÆÄÀÏÇÒ¶§ configure + ½ºÅ©¸³Æ® ¾Æ±Ô¸ÕÆ®¿¡ --with-mpm=leader¸¦ + »ç¿ëÇÑ´Ù.

    + +

    ÀÌ MPMÀº ¾²·¹µå µ¿±â¸¦ À§ÇØ APRÀÇ atomic compare-and-swap + ¸í·ÉÀ» »ç¿ëÇÑ´Ù. x86¿ëÀ¸·Î ÄÄÆÄÀÏÇÏÁö¸¸ 386À» Áö¿øÇÒ ÇÊ¿ä°¡ + ¾ø°Å³ª, SPARC¿ëÀ¸·Î ÄÄÆÄÀÏÇÏÁö¸¸ UltraSPARC Ĩ ÀÌÀü¿¡¼­ + ½ÇÇàÇÏÁö ¾Ê´Â´Ù¸é, configure ½ºÅ©¸³Æ® ¾Æ±Ô¸ÕÆ®¿¡ + --enable-nonportable-atomics=yes¸¦ »ç¿ëÇ϶ó. + ±×·¯¸é APRÀÌ ¿À·¡µÈ CPU¿¡´Â ¾ø´Â ´õ È¿À²ÀûÀÎ ¸í·É¾î¸¦ »ç¿ëÇÏ¿© + atomic ¸í·ÉÀ» ±¸ÇöÇÑ´Ù.

    +
    + + +
    +
    +

    °¡´ÉÇÑ ¾ð¾î:  de  | + en  | + es  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_access.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_access.html new file mode 100644 index 00000000..f73dd7c2 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_access.html @@ -0,0 +1,9 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_access.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: mod_access.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_access.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_access.html.en new file mode 100644 index 00000000..18f9ceb0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_access.html.en @@ -0,0 +1,372 @@ + + + +mod_access - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_access

    +
    +

    Available Languages:  en  | + ja 

    +
    + + + + +
    Description:Provides access control based on client hostname, IP +address, or other characteristics of the client request.
    Status:Base
    Module Identifier:access_module
    Source File:mod_access.c
    Compatibility:Available only in versions prior to 2.1
    +

    Summary

    + +

    The directives provided by mod_access are used + in <Directory>, + <Files>, and + <Location> sections + as well as .htaccess + files to control access to particular parts of the server. Access + can be controlled based on the client hostname, IP address, or + other characteristics of the client request, as captured in environment variables. The Allow and Deny directives are used to + specify which clients are or are not allowed access to the server, + while the Order + directive sets the default access state, and configures how the + Allow and Deny directives interact with each + other.

    + +

    Both host-based access restrictions and password-based + authentication may be implemented simultaneously. In that case, + the Satisfy directive is used + to determine how the two sets of restrictions interact.

    + +

    In general, access restriction directives apply to all + access methods (GET, PUT, + POST, etc). This is the desired behavior in most + cases. However, it is possible to restrict some methods, while + leaving other methods unrestricted, by enclosing the directives + in a <Limit> section.

    +
    +

    Directives

    + +

    See also

    +
    + +
    top
    +

    Allow Directive

    + + + + + + + +
    Description:Controls which hosts can access an area of the +server
    Syntax: Allow from + all|host|env=env-variable + [host|env=env-variable] ...
    Context:directory, .htaccess
    Override:Limit
    Status:Base
    Module:mod_access
    + +

    The Allow directive affects which hosts can + access an area of the server. Access can be controlled by + hostname, IP address, IP address range, or by other + characteristics of the client request captured in environment + variables.

    + +

    The first argument to this directive is always + from. The subsequent arguments can take three + different forms. If Allow from all is specified, then + all hosts are allowed access, subject to the configuration of the + Deny and Order directives as discussed + below. To allow only particular hosts or groups of hosts to access + the server, the host can be specified in any of the + following formats:

    + +
    +
    A (partial) domain-name
    + +
    +

    Example:

    + Allow from apache.org
    + Allow from .net example.edu +

    +

    Hosts whose names match, or end in, this string are allowed + access. Only complete components are matched, so the above + example will match foo.apache.org but it will not + match fooapache.org. This configuration will cause + Apache to perform a double reverse DNS lookup on the client IP + address, regardless of the setting of the HostnameLookups directive. It will do + a reverse DNS lookup on the IP address to find the associated + hostname, and then do a forward lookup on the hostname to assure + that it matches the original IP address. Only if the forward + and reverse DNS are consistent and the hostname matches will + access be allowed.

    + +
    A full IP address
    + +
    +

    Example:

    + Allow from 10.1.2.3
    + Allow from 192.168.1.104 192.168.1.205 +

    +

    An IP address of a host allowed access

    + +
    A partial IP address
    + +
    +

    Example:

    + Allow from 10.1
    + Allow from 10 172.20 192.168.2 +

    +

    The first 1 to 3 bytes of an IP address, for subnet + restriction.

    + +
    A network/netmask pair
    + +
    +

    Example:

    + Allow from 10.1.0.0/255.255.0.0 +

    +

    A network a.b.c.d, and a netmask w.x.y.z. For more + fine-grained subnet restriction.

    + +
    A network/nnn CIDR specification
    + +
    +

    Example:

    + Allow from 10.1.0.0/16 +

    +

    Similar to the previous case, except the netmask consists of + nnn high-order 1 bits.

    +
    + +

    Note that the last three examples above match exactly the + same set of hosts.

    + +

    IPv6 addresses and IPv6 subnets can be specified as shown + below:

    + +

    + Allow from 2001:db8::a00:20ff:fea7:ccea
    + Allow from 2001:db8::a00:20ff:fea7:ccea/10 +

    + +

    The third format of the arguments to the + Allow directive allows access to the server + to be controlled based on the existence of an environment variable. When Allow from + env=env-variable is specified, then the request is + allowed access if the environment variable env-variable + exists. The server provides the ability to set environment + variables in a flexible way based on characteristics of the client + request using the directives provided by + mod_setenvif. Therefore, this directive can be + used to allow access based on such factors as the clients + User-Agent (browser type), Referer, or + other HTTP request header fields.

    + +

    Example:

    + SetEnvIf User-Agent ^KnockKnock/2\.0 let_me_in
    + <Directory /docroot>
    + + Order Deny,Allow
    + Deny from all
    + Allow from env=let_me_in
    +
    + </Directory> +

    + +

    In this case, browsers with a user-agent string beginning + with KnockKnock/2.0 will be allowed access, and all + others will be denied.

    + +
    +
    top
    +

    Deny Directive

    + + + + + + + +
    Description:Controls which hosts are denied access to the +server
    Syntax: Deny from all|host|env=env-variable +[host|env=env-variable] ...
    Context:directory, .htaccess
    Override:Limit
    Status:Base
    Module:mod_access
    +

    This directive allows access to the server to be restricted + based on hostname, IP address, or environment variables. The + arguments for the Deny directive are + identical to the arguments for the Allow directive.

    + +
    +
    top
    +

    Order Directive

    + + + + + + + + +
    Description:Controls the default access state and the order in which +Allow and Deny are +evaluated.
    Syntax: Order ordering
    Default:Order Deny,Allow
    Context:directory, .htaccess
    Override:Limit
    Status:Base
    Module:mod_access
    + +

    The Order directive, along with the + Allow and Deny directives, controls a + three-pass access control system. The first pass processes either + all Allow or all + Deny directives, as + specified by the Order directive. The second + pass parses the rest of the directives (Deny or Allow). The third pass applies to + all requests which do not match either of the first two.

    + +

    Note that all Allow + and Deny directives are + processed, unlike a typical firewall, where only the first match is + used. The last match is effective (also unlike a typical firewall). + Additionally, the order in which lines appear in the configuration + files is not significant -- all Allow lines are processed as one + group, all Deny lines are + considered as another, and the default state is considered by + itself.

    + +

    Ordering is one of:

    + +
    +
    Allow,Deny
    + +
    First, all Allow + directives are evaluated; at least one must match, or the request + is rejected. Next, all Deny directives are evaluated. If + any matches, the request is rejected. Last, any requests which do + not match an Allow or a + Deny directive are + denied by default.
    + +
    Deny,Allow
    + +
    First, all Deny + directives are evaluated; if any match, the request is denied + unless it also matches an Allow directive. Any requests + which do not match any Allow or Deny directives are + permitted.
    + +
    Mutual-failure
    + +
    This order has the same effect as Order + Allow,Deny and is deprecated in its favor.
    +
    + +

    Keywords may only be separated by a comma; no whitespace + is allowed between them.

    + + + + + + + + + + + + + + + + + + + + + + + +
    MatchAllow,Deny resultDeny,Allow result
    Match Allow onlyRequest allowedRequest allowed
    Match Deny onlyRequest deniedRequest denied
    No matchDefault to second directive: DeniedDefault to second directive: Allowed
    Match both Allow & DenyFinal match controls: DeniedFinal match controls: Allowed
    + +

    In the following example, all hosts in the apache.org domain + are allowed access; all other hosts are denied access.

    + +

    + Order Deny,Allow
    + Deny from all
    + Allow from apache.org +

    + +

    In the next example, all hosts in the apache.org domain are + allowed access, except for the hosts which are in the foo.apache.org + subdomain, who are denied access. All hosts not in the apache.org + domain are denied access because the default state is to Deny access to the server.

    + +

    + Order Allow,Deny
    + Allow from apache.org
    + Deny from foo.apache.org +

    + +

    On the other hand, if the Order in the + last example is changed to Deny,Allow, all hosts will + be allowed access. This happens because, regardless of the actual + ordering of the directives in the configuration file, the + Allow from apache.org will be evaluated last and will + override the Deny from foo.apache.org. All hosts not in + the apache.org domain will also be allowed access + because the default state is Allow.

    + +

    The presence of an Order directive can + affect access to a part of the server even in the absence of + accompanying Allow and + Deny directives because + of its effect on the default access state. For example,

    + +

    + <Directory /www>
    + + Order Allow,Deny
    +
    + </Directory> +

    + +

    will Deny all access + to the /www directory because the default access state + is set to Deny.

    + +

    The Order directive controls the order of + access directive processing only within each phase of the server's + configuration processing. This implies, for example, that an + Allow or Deny directive occurring in a + <Location> section + will always be evaluated after an Allow or Deny directive occurring in a + <Directory> + section or .htaccess file, regardless of the setting of + the Order directive. For details on the + merging of configuration sections, see the documentation on How Directory, Location and Files sections + work.

    + +
    +
    +
    +

    Available Languages:  en  | + ja 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_access.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_access.html.ja.utf8 new file mode 100644 index 00000000..a07f6ed6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_access.html.ja.utf8 @@ -0,0 +1,348 @@ + + + +mod_access - Apache HTTP サーバ + + + + + + +
    <-
    + +
    +

    Apache モジュール mod_access

    +
    +

    Available Languages:  en  | + ja 

    +
    +
    This translation may be out of date. Check the + English version for recent changes.
    + + + + +
    説明:クライアントのホスト名、IP アドレス、その他のクライアント +のリクエストの特徴に基づいたアクセス制御機能を提供する
    ステータス:Base
    モジュール識別子:access_module
    ソースファイル:mod_access.c
    互換性:2.1 より前のバージョンのみで使用可能
    +

    概要

    + +

    mod_access により提供されるディレクティブはサーバの特定の部分への + アクセスを制御するために <Directory>, <Files>, <Location> + と .htaccess ファイルで使用されます。クライアントのホスト名、IP + アドレスや 環境変数として取得された、その他のリクエストの特徴に基づいて + アクセス制御を行なうことができます。Allow と + Deny ディレクティブは + どのようなクライアントにアクセスを + 許可する、しないかを指定するために使用されます。一方、 + Order ディレクティブは + デフォルトのアクセス状態と、 + Allow ディレクティブと + Deny + ディレクティブとのお互いへの影響の仕方を設定します。 +

    + +

    ホストによるアクセス制限とパスワードによる認証を同時に + 行なうことが可能です。その場合、その二つの制限の関係を指定するために + Satisfy + ディレクティブを使用します。

    + +

    一般的には、アクセス制限ディレクティブはすべてのアクセスメソッド + (GET, PUT, POST など) + に適用されます。そして、ほとんどの場合これが望ましい動作です。 + しかし、<Limit> + セクションの中にディレクティブを書くことで、 + 一部のメソッドにのみ制限をかけることもできます。

    +
    +

    ディレクティブ

    + +

    参照

    +
    + +
    top
    +

    Allow ディレクティブ

    + + + + + + + +
    説明:サーバのある領域にアクセスできるホストを制御する
    構文: Allow from + all|host|env=env-variable + [host|env=env-variable] ...
    コンテキスト:ディレクトリ, .htaccess
    上書き:Limit
    ステータス:Base
    モジュール:mod_access
    + +

    Allow ディレクティブはどのホストが + サーバのある領域をアクセスできるかに影響を与えます。 + アクセスはホスト名、IP アドレス、IP アドレスの範囲や、 + 環境変数として取得された、その他のクライアントのリクエストの + 特徴によって制御することができます。

    + +

    このディレクティブの最初の引数は常に from です。 + それに続く引数は三つの違った形式があります。Allow from + all が指定されていれば、すべてのホストにアクセスを許可し、 + アクセス制限は下で説明されているように、 + Deny + ディレクティブと Order + ディレクティブの設定で決まります。 + 特定のホストやホスト群にのみサーバへのアクセスを許可するためには、 + 以下のどれかの形式で host を指定することができます:

    + +
    +
    ドメイン名 (の一部)
    + +
    +

    例:

    + Allow from apache.org +

    +

    この文字列に合うか、これで終わる名前のホストのアクセスが許可されます。 + 各部分が完全に合うものだけに適用されますので、上の例は + foo.apache.org にはマッチしますが、 + fooapache.org にはマッチしません。 + この設定をすると、Apache は + HostnameLookups + の設定に関わらず、クライアントの IP アドレスに対して + 二重の DNS の逆引きを行ないます。まず IP アドレスに対して DNS の + 逆引きを行なってホスト名を得、そのホスト名に対して正引きを + 行ない、元の IP アドレスと一致するかを調べます。DNS の正引きと + 逆引きが無矛盾かつホスト名が一致するときにのみ + アクセスが許可されます。

    + +
    完全な IP アドレス
    + +
    +

    例:

    + Allow from 10.1.2.3 +

    +

    アクセスを許可する IP アドレスです。

    + +
    IP アドレスの一部
    + +
    +

    例:

    + Allow from 10.1 +

    +

    サブネットの制限用の、IP + アドレスの最初の一つから三つまでのバイトです。

    + +
    ネットワーク/ネットマスク の対
    + +
    +

    例:

    + Allow from 10.1.0.0/255.255.0.0 +

    +

    ネットワーク a.b.c.d とネットマスク w.x.y.z です。 + より細粒度のサブネット制限用です。

    + +
    ネットワーク/nnn CIDR 指定
    + +
    +

    例:

    + Allow from 10.1.0.0/16 +

    +

    ネットマスクが nnn の上位ビットが 1 + となっているものからなること以外は前のものと同じです。

    +
    + +

    注: 最後の三つの例はまったく同じホストに合います。

    + + +

    IPv6 アドレスと IPv6 のサブネットは以下のように指定できます:

    + +

    + Allow from 2001:db8::a00:20ff:fea7:ccea
    + Allow from 2001:db8::a00:20ff:fea7:ccea/10 +

    + +

    Allow ディレクティブの引数の三つ目の形式は、 + 環境変数 + の存在によりアクセスの制御を行なえるようにするものです。 + Allow from env=env-variable + が指定されていると、環境変数 env-variable + が存在した場合にリクエストはアクセスを許可されます。サーバは + mod_setenvif + のディレクティブにより、クライアントのリクエスト + の特徴に基づいて柔軟に環境変数を設定する機能を提供します。 + ですから、このディレクティブはクライアントの + User-Agent (ブラウザの種類)、Referer + や他の HTTP リクエストのヘッダフィールドなどに基づいて + アクセス許可をするために使うことができます。 +

    + +

    例:

    + SetEnvIf User-Agent ^KnockKnock/2\.0 let_me_in
    + <Directory /docroot>
    + + Order Deny,Allow
    + Deny from all
    + Allow from env=let_me_in
    +
    + </Directory> +

    + +

    この場合、user-agent の文字列が KnockKnock/2.0 + で始まるブラウザのみがアクセスを許可され、 + 他のものはアクセスを拒否されます。

    + +
    +
    top
    +

    Deny ディレクティブ

    + + + + + + + +
    説明:サーバがアクセスを拒否するホストを制御する
    構文: Deny from + all|host|env=env-variable + [host|env=env-variable] ...
    コンテキスト:ディレクトリ, .htaccess
    上書き:Limit
    ステータス:Base
    モジュール:mod_access
    +

    このディレクティブはホスト名、IP + アドレス、環境変数に基づいてサーバへのアクセスを制限します。 + Deny ディレクティブの引数は Allow + ディレクティブとまったく同じです。

    + +
    +
    top
    +

    Order ディレクティブ

    + + + + + + + + +
    説明:デフォルトのアクセス可能な状態と、Allow と +Deny が評価される順番を制御する
    構文: Order ordering
    デフォルト:Order Deny,Allow
    コンテキスト:ディレクトリ, .htaccess
    上書き:Limit
    ステータス:Base
    モジュール:mod_access
    + +

    Order ディレクティブはデフォルトのアクセスの状態と + Allow ディレクティブと + Deny + ディレクティブが評価される順番を制御します。 + Ordering は以下のどれかです。

    + +
    +
    Deny,Allow
    + +
    Deny ディレクティブが + Allow + ディレクティブの前に評価されます。 + アクセスはデフォルトで許可されます。Deny + ディレクティブに合わないか、Allow + ディレクティブに合うクライアントはアクセスを許可されます。
    + +
    Allow,Deny
    + +
    Allow + ディレクティブが Deny + ディレクティブの前に評価されます。 + アクセスはデフォルトで拒否されます。Allow + ディレクティブに合わないか、Deny + ディレクティブに合うクライアントはアクセスを拒否されます。 +
    + +
    Mutual-failure
    + +
    Allow のリストに現れて、 + Deny + のリストに現れないホストのみがアクセスを許可されます。 + この順番付けは Order Allow,Deny と同じ効果を持ち、 + その設定の方が好ましいために非推奨となっています。
    +
    + +

    キーワードはコンマで分離することだけが可能です。 + 間に空白があってはいけません。どの場合でも、Allow と + Deny 文は + 全て評価されるということに注意してください。 +

    + +

    以下の例では、apache.org + ドメインのすべてのホストはアクセスを許可されます。 + 他のすべてのホストはアクセスを拒否されます。

    + +

    + Order Deny,Allow
    + Deny from all
    + Allow from apache.org +

    + +

    次の例では、foo.apache.org サブドメインにあるホスト以外の、 + apache.org ドメインのすべてのホストがアクセスを許可されます。 + apache.org + ドメインでないホストは、デフォルトの状態がアクセス拒否のため、 + サーバへのアクセスを拒否されます。

    + +

    + Order Allow,Deny
    + Allow from apache.org
    + Deny from foo.apache.org +

    + +

    一方、上の例の Order が Deny,Allow + に変わっていれば、すべのホストにアクセスが許可されます。 + これは、設定ファイル中の実際の順番に関わらず、 + Allow from apache.org が最後に評価されて、 + Deny from foo.apache.org を上書きするからです。 + apache.org + ドメインにないホストも、デフォルトの状態が allow + に変化するために、アクセスを許可されます。 +

    + +

    Order + ディレクティブはデフォルトのアクセスの状態に影響を与えるので、 + Allow ディレクティブと + Deny + ディレクティブが無くても、サーバのアクセスに影響を与えることができます。 + たとえば、

    + +

    + <Directory /www>
    + + Order Allow,Deny
    +
    + </Directory> +

    + +

    はデフォルトのアクセス状態が deny になるため、 + /www ディレクトリへのすべてのアクセスを拒否します。 +

    + +

    Order + ディレクティブはサーバの設定処理の各段階でだけ + アクセスディレクティブの処理の順番を変更します。これは、たとえば、 + Order ディレクティブの設定に関わらず、 + <Location> セクションの + Allow ディレクティブや + Deny ディレクティブは、 + Directory セクションや + .htaccess ファイルの Allow + ディレクティブや Deny + ディレクティブよりも常に後に評価されるということを意味します。 + 設定セクションのマージの詳細については、 + Directory,Location, Files + セクションの動作方法 を参照してください。

    + +
    +
    +
    +

    Available Languages:  en  | + ja 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_actions.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_actions.html new file mode 100644 index 00000000..f53fc7db --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_actions.html @@ -0,0 +1,13 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_actions.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: mod_actions.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: mod_actions.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_actions.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_actions.html.en new file mode 100644 index 00000000..d0971c56 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_actions.html.en @@ -0,0 +1,145 @@ + + + +mod_actions - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_actions

    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + + + +
    Description:This module provides for executing CGI scripts based on +media type or request method.
    Status:Base
    Module Identifier:actions_module
    Source File:mod_actions.c
    +

    Summary

    + +

    This module has two directives. The Action directive lets you run CGI + scripts whenever a file of a certain type is requested. The + Script directive lets + you run CGI scripts whenever a particular method is used in a + request. This makes it much easier to execute scripts that process + files.

    +
    + + +
    top
    +

    Action Directive

    + + + + + + + +
    Description:Activates a CGI script for a particular handler or +content-type
    Syntax:Action action-type cgi-script
    Context:server config, virtual host, directory, .htaccess
    Override:FileInfo
    Status:Base
    Module:mod_actions
    +

    This directive adds an action, which will activate + cgi-script when action-type is triggered by the + request. The cgi-script is the URL-path to a resource + that has been designated as a CGI script using ScriptAlias or AddHandler. The + action-type can be either a handler or a MIME content type. It + sends the URL and file path of the requested document using the + standard CGI PATH_INFO and PATH_TRANSLATED environment + variables.

    + +

    Examples

    + # Requests for files of a particular type:
    + Action image/gif /cgi-bin/images.cgi
    +
    + # Files of a particular file extension
    + AddHandler my-file-type .xyz
    + Action my-file-type /cgi-bin/program.cgi
    +

    + +

    In the first example, requests for files with a MIME content + type of image/gif will instead be handled by the + specified cgi script /cgi-bin/images.cgi.

    + +

    In the second example, requests for files with a file extension of + .xyz are handled instead by the specified cgi script + /cgi-bin/program.cgi.

    + +

    See also

    + +
    +
    top
    +

    Script Directive

    + + + + + + +
    Description:Activates a CGI script for a particular request +method.
    Syntax:Script method cgi-script
    Context:server config, virtual host, directory
    Status:Base
    Module:mod_actions
    +

    This directive adds an action, which will activate + cgi-script when a file is requested using the method of + method. The cgi-script is the URL-path to a + resource that has been designated as a CGI script using ScriptAlias or AddHandler. The URL and + file path of the requested document is sent using the standard CGI + PATH_INFO and PATH_TRANSLATED environment variables.

    + +
    + Any arbitrary method name may be used. Method names are + case-sensitive, so Script PUT and + Script put have two entirely different + effects. +
    + +

    Note that the Script command defines default actions only. + If a CGI script is called, or some other resource that is + capable of handling the requested method internally, it will do + so. Also note that Script with a method of GET + will only be called if there are query arguments present + (e.g., foo.html?hi). Otherwise, the request will + proceed normally.

    + +

    Examples

    + # For <ISINDEX>-style searching
    + Script GET /cgi-bin/search
    +
    + # A CGI PUT handler
    + Script PUT /~bob/put.cgi
    +

    + +
    +
    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_actions.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_actions.html.ja.utf8 new file mode 100644 index 00000000..1bbb7a58 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_actions.html.ja.utf8 @@ -0,0 +1,150 @@ + + + +mod_actions - Apache HTTP サーバ + + + + + + +
    <-
    + +
    +

    Apache モジュール mod_actions

    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + + + +
    説明:メディアタイプやリクエストメソッドに応じて +CGI スクリプトを実行する機能を提供
    ステータス:Base
    モジュール識別子:actions_module
    ソースファイル:mod_actions.c
    +

    概要

    + +

    このモジュールには二つのディレクティブがあります。Action + ディレクティブは特定のタイプのファイルをリクエストされた場合に + CGI スクリプトが実行されるようにします。Script + ディレクティブはリクエストで特定のメソッドが使用されたときに CGI + スクリプトが実行されるようにします。 + これはファイルを処理するスクリプトの実行をずっと簡単にします。

    +
    + + +
    top
    +

    Action ディレクティブ

    + + + + + + + +
    説明:特定のハンドラやコンテントタイプに対して CGI を実行するように +設定
    構文:Action action-type cgi-script
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:FileInfo
    ステータス:Base
    モジュール:mod_actions
    +

    このディレクティブは action-type + がリクエストされたときに cgi-script + が実行されるという動作を追加します。cgi-script は + ScriptAlias や + AddHandler によって + CGI スクリプトに設定されたリソースへの URL-path です。 + Action-type には + handler か MIME + コンテントタイプを指定できます。リクエストされたドキュメントの URL + とファイルのパスは標準 CGI 環境変数 PATH_INFO と PATH_TRANSLATED + を使って伝えられます。

    + +

    例

    + # Requests for files of a particular type:
    + Action image/gif /cgi-bin/images.cgi
    +
    + # Files of a particular file extension
    + AddHandler my-file-type .xyz
    + Action my-file-type /cgi-bin/program.cgi
    +

    + +

    最初の例では、MIME コンテントタイプが image/gif + のファイルへのリクエストは、そのファイルの代わりに指定されたスクリプト + /cgi-bin/images.cgi が呼ばれます。

    + +

    2 番目の例では、拡張子が .xyz のファイルへのリクエストは、 + そのファイルの代わりに指定されたスクリプト + /cgi-bin/program.cgi が呼ばれます。

    + +

    参照

    + +
    +
    top
    +

    Script ディレクティブ

    + + + + + + +
    説明:特定のリクエストメソッドに対して CGI スクリプトを +実行するように設定
    構文:Script method cgi-script
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ
    ステータス:Base
    モジュール:mod_actions
    +

    このディレクティブは method + というメソッドを使ってリクエストが行なわれたときに + cgi-script を実行するという動作を追加します。 + cgi-script は + ScriptAlias や + AddHandler によって + CGI スクリプトに設定されたリソースへの URL-path です。 + リクエストされたドキュメントの URL とファイルのパスは標準 CGI + 環境変数 PATH_INFO と PATH_TRANSLATED を使って伝えられます。

    + +
    + 任意のメソッド名を使用することができます。 + メソッド名は大文字小文字を区別します。ですから、 + Script PUT と Script put + はまったく違った効果になります。 +
    + +

    Script コマンドはデフォルトの動作を追加するだけであることに + 注意してください。もし CGI スクリプトが呼ばれたり、リクエストされた + メソッドを内部で扱うことのできる他のリソースがあれば、それが行なわれます。 + GET メソッドの Script は問合せ引数がある場合にのみ + (たとえば、foo.html?hi) 呼ばれるということにも注意してください。 + そうでない場合は、リクエストは通常通り処理されます。

    + +

    例

    + # For <ISINDEX>-style searching
    + Script GET /cgi-bin/search
    +
    + # A CGI PUT handler
    + Script PUT /~bob/put.cgi
    +

    + +
    +
    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_actions.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_actions.html.ko.euc-kr new file mode 100644 index 00000000..9586cc88 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_actions.html.ko.euc-kr @@ -0,0 +1,140 @@ + + + +mod_actions - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    ¾ÆÆÄÄ¡ ¸ðµâ mod_actions

    +
    +

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

    +
    + + + +
    ¼³¸í:ÀÌ ¸ðµâÀº ¹Ìµð¾îÁ¾·ù³ª ¿äû¸Þ¼­µå¿¡ µû¶ó CGI +½ºÅ©¸³Æ®¸¦ ½ÇÇàÇÑ´Ù.
    »óÅÂ:Base
    ¸ðµâ¸í:actions_module
    ¼Ò½ºÆÄÀÏ:mod_actions.c
    +

    ¿ä¾à

    + +

    ÀÌ ¸ðµâ¿¡´Â µÎ°¡Áö Áö½Ã¾î°¡ ÀÖ´Ù. Action Áö½Ã¾î´Â ¿äûÇÏ´Â + ÆÄÀÏÀÇ Á¾·ù¿¡ µû¶ó CGI ½ºÅ©¸³Æ®¸¦ ½ÇÇàÇÑ´Ù. Script Áö½Ã¾î´Â ¿äûÀÌ + ƯÁ¤ ¸Þ¼­µå¸¦ »ç¿ëÇÒ °æ¿ì CGI ½ºÅ©¸³Æ®¸¦ ½ÇÇàÇÑ´Ù. ±×·¡¼­ + ÆÄÀÏÀ» ó¸®ÇÏ´Â ½ºÅ©¸³Æ®¸¦ ¸Å¿ì ½±°Ô ½ÇÇàÇÒ ¼ö ÀÖ´Ù.

    +
    + + +
    top
    +

    Action Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:ƯÁ¤ Çڵ鷯³ª content-type¿¡ ´ëÇØ CGI ½ºÅ©¸³Æ®¸¦ +»ç¿ëÇÑ´Ù
    ¹®¹ý:Action action-type cgi-script
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®, directory, .htaccess
    Override ¿É¼Ç:FileInfo
    »óÅÂ:Base
    ¸ðµâ:mod_actions
    +

    ÀÌ Áö½Ã¾î´Â ¿äûÀÌ action-typeÀ̸é + cgi-script¸¦ ½ÇÇàÇÏ´Â ÇൿÀ» ¼­¹ö¿¡ Ãß°¡ÇÑ´Ù. + cgi-script´Â ScriptAlias³ª AddHandler¸¦ »ç¿ëÇÏ¿© CGI + ½ºÅ©¸³Æ®·Î ÁöÁ¤ÇÑ ¸®¼Ò½ºÀÇ URL°æ·ÎÀÌ´Ù. + action-type¿¡´Â Çڵ鷯³ª MIME content typeÀ» + »ç¿ëÇÒ ¼ö ÀÖ´Ù. ÀÌ Áö½Ã¾î´Â PATH_INFO¿Í PATH_TRANSLATED + CGI Ç¥ÁØ È¯°æº¯¼ö·Î ¿äûÇÑ ¹®¼­ÀÇ URL°ú ÆÄÀÏ°æ·Î¸¦ Àü´ÞÇÑ´Ù.

    + +

    ¿¹Á¦

    + # ƯÁ¤ Á¾·ùÀÇ ÆÄÀÏ ¿äû:
    + Action image/gif /cgi-bin/images.cgi
    +
    + # ƯÁ¤ÇÑ È®ÀåÀÚ¸¦ °¡Áø ÆÄÀÏ
    + AddHandler my-file-type .xyz
    + Action my-file-type /cgi-bin/program.cgi
    +

    + +

    ù¹ø° ¿¹¿¡¼­ MIME content typeÀÌ image/gifÀÎ + ÆÄÀÏÀ» ¿äûÇϸé ÁöÁ¤ÇÑ cgi ½ºÅ©¸³Æ® /cgi-bin/images.cgi°¡ + ´ë½Å ó¸®ÇÑ´Ù.

    + +

    µÎ¹ø° ¿¹¿¡¼­ È®ÀåÀÚ°¡ .xyzÀÎ ÆÄÀÏÀ» ¿äûÇϸé + ÁöÁ¤ÇÑ cgi ½ºÅ©¸³Æ® /cgi-bin/program.cgi°¡ + ´ë½Å ó¸®ÇÑ´Ù.

    + +

    Âü°í

    + +
    +
    top
    +

    Script Áö½Ã¾î

    + + + + + + +
    ¼³¸í:ƯÁ¤ ¿äû¸Þ¼­µå¿¡ ´ëÇØ CGI ½ºÅ©¸³Æ®¸¦ +»ç¿ëÇÑ´Ù.
    ¹®¹ý:Script method cgi-script
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®, directory
    »óÅÂ:Base
    ¸ðµâ:mod_actions
    +

    ÀÌ Áö½Ã¾î´Â ÆÄÀÏÀ» method ¸Þ¼­µå¸¦ »ç¿ëÇÏ¿© + ¿äûÇϸé cgi-script¸¦ ½ÇÇàÇÏ´Â ÇൿÀ» ¼­¹ö¿¡ + Ãß°¡ÇÑ´Ù. cgi-script´Â ScriptAlias³ª AddHandler¸¦ »ç¿ëÇÏ¿© CGI + ½ºÅ©¸³Æ®·Î ÁöÁ¤ÇÑ ¸®¼Ò½ºÀÇ URL°æ·ÎÀÌ´Ù. ÀÌ Áö½Ã¾î´Â PATH_INFO¿Í + PATH_TRANSLATED CGI Ç¥ÁØ È¯°æº¯¼ö·Î ¿äûÇÑ ¹®¼­ÀÇ URL°ú + ÆÄÀÏ°æ·Î¸¦ Àü´ÞÇÑ´Ù.

    + +
    + ¾î¶² ¸Þ¼­µå À̸§ÀÌ¶óµµ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¸Þ¼­µå À̸§Àº + ´ë¼Ò¹®ÀÚ¸¦ ±¸º°ÇÑ´Ù. ±×·¡¼­ Script PUT°ú + Script putÀº ¿ÏÀüÈ÷ ´Ù¸£´Ù. +
    + +

    Script ¸í·É¾î´Â ±âº»ÀûÀÎ Çൿ¸¸À» ó¸®ÇÔÀ» ÁÖÀÇÇ϶ó. + CGI ½ºÅ©¸³Æ®°¡ ºÒ¸®°Å³ª, ¿äûÇÑ ¸Þ¼­µå¸¦ ¾Ë¾Æ¼­ ó¸®ÇÒ ¼ö + ÀÖ´Â ¸®¼Ò½ºÀÇ °æ¿ì ±×´ë·Î ó¸®ÇÑ´Ù. GET + ¸Þ¼­µåÀÇ Script´Â ÁúÀǾƱԸÕÆ®°¡ ÀÖÀ»¶§¸¸ (¿¹, + foo.html?hi) »ç¿ëÇÔÀ» ÁÖÀÇÇ϶ó. ÁúÀǾƱԸÕÆ®°¡ ¾ø´Ù¸é + Á¤»óÀûÀ¸·Î ¿äûÀ» ó¸®ÇÑ´Ù.

    + +

    ¿¹Á¦

    + # <ISINDEX>½Ä °Ë»öÀ» À§ÇØ
    + Script GET /cgi-bin/search
    +
    + # CGI PUT Çڵ鷯
    + Script PUT /~bob/put.cgi
    +

    + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_alias.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_alias.html new file mode 100644 index 00000000..4a13e8ae --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_alias.html @@ -0,0 +1,17 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_alias.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: mod_alias.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: mod_alias.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: mod_alias.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_alias.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_alias.html.en new file mode 100644 index 00000000..ef214d60 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_alias.html.en @@ -0,0 +1,430 @@ + + + +mod_alias - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_alias

    +
    +

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

    +
    + + + +
    Description:Provides for mapping different parts of the host + filesystem in the document tree and for URL redirection
    Status:Base
    Module Identifier:alias_module
    Source File:mod_alias.c
    +

    Summary

    + +

    The directives contained in this module allow for manipulation + and control of URLs as requests arrive at the server. The + Alias and ScriptAlias directives are used to + map between URLs and filesystem paths. This allows for content + which is not directly under the DocumentRoot served as part of the web + document tree. The ScriptAlias directive has the + additional effect of marking the target directory as containing + only CGI scripts.

    + +

    The Redirect + directives are used to instruct clients to make a new request with + a different URL. They are often used when a resource has moved to + a new location.

    + +

    mod_alias is designed to handle simple URL + manipulation tasks. For more complicated tasks such as + manipulating the query string, use the tools provided by + mod_rewrite.

    + +
    + +
    top
    +
    +

    Order of Processing

    + +

    Aliases and Redirects occuring in different contexts are processed + like other directives according to standard merging rules. But when multiple + Aliases or Redirects occur in the same context (for example, in the + same <VirtualHost> + section) they are processed in a particular order.

    + +

    First, all Redirects are processed before Aliases are processed, + and therefore a request that matches a Redirect or RedirectMatch will never have Aliases + applied. Second, the Aliases and Redirects are processed in the order + they appear in the configuration files, with the first match taking + precedence.

    + +

    For this reason, when two or more of these directives apply to the + same sub-path, you must list the most specific path first in order for + all the directives to have an effect. For example, the following + configuration will work as expected:

    + +

    + Alias /foo/bar /baz
    + Alias /foo /gaq +

    + +

    But if the above two directives were reversed in order, the + /foo Alias + would always match before the /foo/bar Alias, so the latter directive would be + ignored.

    + +
    +
    top
    +

    Alias Directive

    + + + + + + +
    Description:Maps URLs to filesystem locations
    Syntax:Alias URL-path +file-path|directory-path
    Context:server config, virtual host
    Status:Base
    Module:mod_alias
    + +

    The Alias directive allows documents to + be stored in the local filesystem other than under the + DocumentRoot. URLs with a + (%-decoded) path beginning with url-path will be mapped + to local files beginning with directory-path. The + url-path is case-sensitive, even on case-insenitive + file systems.

    + +

    Example:

    + Alias /image /ftp/pub/image +

    + +

    A request for http://myserver/image/foo.gif would cause + the server to return the file /ftp/pub/image/foo.gif.

    + +

    Note that if you include a trailing / on the + url-path then the server will require a trailing / in + order to expand the alias. That is, if you use

    + +
    Alias /icons/ /usr/local/apache/icons/
    + +

    then the url /icons will not be aliased.

    + +

    Note that you may need to specify additional <Directory> sections which + cover the destination of aliases. Aliasing occurs before + <Directory> sections + are checked, so only the destination of aliases are affected. + (Note however <Location> + sections are run through once before aliases are performed, so + they will apply.)

    + +

    In particular, if you are creating an Alias to a + directory outside of your DocumentRoot, you may need to explicitly + permit access to the target directory.

    + +

    Example:

    + Alias /image /ftp/pub/image
    + <Directory /ftp/pub/image>
    + + Order allow,deny
    + Allow from all
    +
    + </Directory> +

    + + +
    +
    top
    +

    AliasMatch Directive

    + + + + + + +
    Description:Maps URLs to filesystem locations using regular +expressions
    Syntax:AliasMatch regex +file-path|directory-path
    Context:server config, virtual host
    Status:Base
    Module:mod_alias
    +

    This directive is equivalent to Alias, but makes use of standard + regular expressions, instead of simple prefix matching. The + supplied regular expression is matched against the URL-path, and + if it matches, the server will substitute any parenthesized + matches into the given string and use it as a filename. For + example, to activate the /icons directory, one might + use:

    + +

    + AliasMatch ^/icons(.*) /usr/local/apache/icons$1 +

    + +

    It is also possible to construct an alias with case-insensitive + matching of the url-path:

    + +

    + AliasMatch (?i)^/image(.*) /ftp/pub/image$1 +

    + + +
    +
    top
    +

    Redirect Directive

    + + + + + + + +
    Description:Sends an external redirect asking the client to fetch +a different URL
    Syntax:Redirect [status] URL-path +URL
    Context:server config, virtual host, directory, .htaccess
    Override:FileInfo
    Status:Base
    Module:mod_alias
    +

    The Redirect directive maps an old URL into a new one by asking + the client to refetch the resource at the new location.

    + +

    The old URL-path is a case-sensitive (%-decoded) path + beginning with a slash. A relative path is not allowed. The new + URL should be an absolute URL beginning with a scheme and + hostname.

    + +

    Example:

    + Redirect /service http://foo2.bar.com/service +

    + +

    If the client requests http://myserver/service/foo.txt, it + will be told to access http://foo2.bar.com/service/foo.txt + instead.

    + +

    Note

    +

    Redirect directives take precedence over + Alias and ScriptAlias directives, irrespective of their ordering in + the configuration file. Also, URL-path must be a fully + qualified URL, not a relative path, even when used with .htaccess files or + inside of <Directory> + sections.

    + +

    If no status argument is given, the redirect will + be "temporary" (HTTP status 302). This indicates to the client + that the resource has moved temporarily. The status + argument can be used to return other HTTP status codes:

    + +
    +
    permanent
    + +
    Returns a permanent redirect status (301) indicating that + the resource has moved permanently.
    + +
    temp
    + +
    Returns a temporary redirect status (302). This is the + default.
    + +
    seeother
    + +
    Returns a "See Other" status (303) indicating that the + resource has been replaced.
    + +
    gone
    + +
    Returns a "Gone" status (410) indicating that the + resource has been permanently removed. When this status is + used the URL argument should be omitted.
    +
    + +

    Other status codes can be returned by giving the numeric + status code as the value of status. If the status is + between 300 and 399, the URL argument must be present, + otherwise it must be omitted. Note that the status must be + known to the Apache code (see the function + send_error_response in http_protocol.c).

    + +

    Example:

    + Redirect permanent /one http://example.com/two
    + Redirect 303 /three http://example.com/other +

    + + +
    +
    top
    +

    RedirectMatch Directive

    + + + + + + + +
    Description:Sends an external redirect based on a regular expression match +of the current URL
    Syntax:RedirectMatch [status] regex +URL
    Context:server config, virtual host, directory, .htaccess
    Override:FileInfo
    Status:Base
    Module:mod_alias
    +

    This directive is equivalent to Redirect, but makes use of standard + regular expressions, instead of simple prefix matching. The + supplied regular expression is matched against the URL-path, and + if it matches, the server will substitute any parenthesized + matches into the given string and use it as a filename. For + example, to redirect all GIF files to like-named JPEG files on + another server, one might use:

    + +

    + RedirectMatch (.*)\.gif$ http://www.anotherserver.com$1.jpg +

    + +
    +
    top
    +

    RedirectPermanent Directive

    + + + + + + + +
    Description:Sends an external permanent redirect asking the client to fetch +a different URL
    Syntax:RedirectPermanent URL-path URL
    Context:server config, virtual host, directory, .htaccess
    Override:FileInfo
    Status:Base
    Module:mod_alias
    +

    This directive makes the client know that the Redirect is + permanent (status 301). Exactly equivalent to Redirect + permanent.

    + +
    +
    top
    +

    RedirectTemp Directive

    + + + + + + + +
    Description:Sends an external temporary redirect asking the client to fetch +a different URL
    Syntax:RedirectTemp URL-path URL
    Context:server config, virtual host, directory, .htaccess
    Override:FileInfo
    Status:Base
    Module:mod_alias
    +

    This directive makes the client know that the Redirect is + only temporary (status 302). Exactly equivalent to + Redirect temp.

    + +
    +
    top
    +

    ScriptAlias Directive

    + + + + + + +
    Description:Maps a URL to a filesystem location and designates the +target as a CGI script
    Syntax:ScriptAlias URL-path +file-path|directory-path
    Context:server config, virtual host
    Status:Base
    Module:mod_alias
    +

    The ScriptAlias directive has the same + behavior as the Alias + directive, except that in addition it marks the target directory + as containing CGI scripts that will be processed by mod_cgi's cgi-script handler. URLs with a case-sensitive + (%-decoded) path beginning with URL-path will be mapped + to scripts beginning with the second argument, which is a full + pathname in the local filesystem.

    + +

    Example:

    + ScriptAlias /cgi-bin/ /web/cgi-bin/ +

    + +

    A request for http://myserver/cgi-bin/foo would cause the + server to run the script /web/cgi-bin/foo. This configuration + is essentially equivalent to:

    +

    + Alias /cgi-bin/ /web/cgi-bin/
    + <Location /cgi-bin >
    + + SetHandler cgi-script
    + Options +ExecCGI
    +
    + </Location> +

    + +
    It is safer to avoid placing CGI scripts under the + DocumentRoot in order to + avoid accidentally revealing their source code if the + configuration is ever changed. The + ScriptAlias makes this easy by mapping a + URL and designating CGI scripts at the same time. If you do + choose to place your CGI scripts in a directory already + accessible from the web, do not use + ScriptAlias. Instead, use <Directory>, SetHandler, and Options as in: +

    + <Directory /usr/local/apache2/htdocs/cgi-bin >
    + + SetHandler cgi-script
    + Options ExecCGI
    +
    + </Directory> +

    + This is necessary since multiple URL-paths can map + to the same filesystem location, potentially bypassing the + ScriptAlias and revealing the source code + of the CGI scripts if they are not restricted by a + Directory section.
    + + +

    See also

    + +
    +
    top
    +

    ScriptAliasMatch Directive

    + + + + + + +
    Description:Maps a URL to a filesystem location using a regular expression +and designates the target as a CGI script
    Syntax:ScriptAliasMatch regex +file-path|directory-path
    Context:server config, virtual host
    Status:Base
    Module:mod_alias
    +

    This directive is equivalent to ScriptAlias, but makes use of standard + regular expressions, instead of simple prefix matching. The + supplied regular expression is matched against the URL-path, + and if it matches, the server will substitute any parenthesized + matches into the given string and use it as a filename. For + example, to activate the standard /cgi-bin, one + might use:

    + +

    + ScriptAliasMatch ^/cgi-bin(.*) /usr/local/apache/cgi-bin$1 +

    + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_alias.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_alias.html.ja.utf8 new file mode 100644 index 00000000..e4c9cdf3 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_alias.html.ja.utf8 @@ -0,0 +1,389 @@ + + + +mod_alias - Apache HTTP サーバ + + + + + + +
    <-
    + +
    +

    Apache モジュール mod_alias

    +
    +

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

    +
    +
    This translation may be out of date. Check the + English version for recent changes.
    + + + +
    説明:ホストファイルシステム上のいろいろな違う場所を + ドキュメントツリーにマップする機能と、 + URL のリダイレクトを行なう機能を提供する
    ステータス:Base
    モジュール識別子:alias_module
    ソースファイル:mod_alias.c
    +

    概要

    + +

    このモジュールのディレクティブはサーバにリクエストが到着したときに + URL の操作や制御をすることを可能にします。Alias + ディレクティブと ScriptAlias + ディレクティブは + URL とファイルシステムのパスをマップするために使用されます。これは + DocumentRoot + の下にないドキュメントをウェブのドキュメントツリーの一部として + 送られるようにします。ScriptAlias + ディレクティブにはマップ先のディレクトリが CGI + スクリプトのみであることを示すという追加の効果があります。 +

    + +

    Redirect ディレクティブは + クライアントに違った + URL に新しいリクエストを送るように指示します。これは、 + リソースが新しい場所に移動したときによく使用されます。

    + +

    mod_alias は簡単な URL 操作向けに設計されています。 + より複雑な操作、クエリーストリングの操作には、mod_rewrite + で提供されるツールを使用してください。

    + +
    + +
    top
    +
    +

    処理の順番

    + +

    様々なコンテキスト中での Alias や Redirect は他のディレクティブと +同じように標準の マージ規則 に +従って処理されます。ただし、(例えば <VirtualHost> セクションの中のように) 複数の Alias や Redirect が +同じコンテキスト中に現れた場合は決まった順番で処理されます。

    + +

    まず、Alias の前にすべての Redirect が処理されます。ですから、Redirect か RedirectMatch にマッチするリクエストには +Alias は決して適用されません。次に、Alias と Redirect が設定ファイル中の +順番に適用され、最初にマッチしたものが優先されます。

    + +

    ですから、二つ以上のディレクティブが同じパスに適用されるときは、 +すべてのディレクティブの効果を得るためにはより詳しいパスを先に書く +必要があります。例えば、次の設定は期待通りの動作をします:

    + +

    +Alias /foo/bar /baz
    +Alias /foo /gaq +

    + +

    しかし、上記の二つのディレクティブの順番が逆になると、 +/foo Alias が +常に /foo/bar Alias より先にマッチしますので、後者は +決して適用されることはありません。

    + +
    +
    top
    +

    Alias ディレクティブ

    + + + + + + +
    説明:URL をファイルシステムの位置にマップする
    構文:Alias URL-path +file-path|directory-path
    コンテキスト:サーバ設定ファイル, バーチャルホスト
    ステータス:Base
    モジュール:mod_alias
    +

    Alias ディレクティブはドキュメントを + ローカルファイルシステムの + DocumentRoot + 以外の場所に保管することを可能にします。 + URL の (% が復号された) パスが url-path で始まるものは + directory-filename + で始まるローカルファイルにマップされます。

    + +

    例

    + Alias /image /ftp/pub/image +

    + +

    http://myserver/image/foo.gif へのリクエストに対して、サーバは + ファイル /ftp/pub/image/foo.gif を返します。

    + +

    もし url-path の最後に / + を書いたなら、サーバがエイリアスを展開するためには、最後の / + が必要になることに注意してください。すなわち、Alias /icons/ + /usr/local/apache/icons/ というものを使用している場合は、 + /icons という url はエイリアスされません。

    + +

    エイリアスの行き先を含んでいる <Directory> + セクションを追加する必要があるかもしれないことに注意してください。 + エイリアスの展開は <Directory> + セクションを調べる前に行なわれますので、 + エイリアスの行き先の <Directory> セクションのみ + 効果があります。 + (しかし、<Location> + セクションはエイリアスが処理される前に実行されますので、 + こちらは適用されます。)

    + +

    特に、Alias を + DocumentRoot + ディレクトリの外側に配置した場合は、行き先のディレクトリに対する + アクセス権限を明示的に制限しなければならないでしょう。

    + +

    例

    + Alias /image /ftp/pub/image
    + <Directory /ftp/pub/image>
    + + Order allow,deny
    + Allow from all
    +
    + </Directory> +

    + + +
    +
    top
    +

    AliasMatch ディレクティブ

    + + + + + + +
    説明:正規表現を使って URL をファイルシステムの位置にマップする
    構文:AliasMatch regex +file-path|directory-path
    コンテキスト:サーバ設定ファイル, バーチャルホスト
    ステータス:Base
    モジュール:mod_alias
    +

    このディレクティブは Alias + とほとんど同じですが、簡単な先頭からのマッチを行なうのではなく、 + 標準正規表現を利用します。ここで指定された正規表現と URL のパス + が合うかどうかを調べ、合う場合は括弧で括られたマッチを + 与えられた文字列で置き換え、それをファイル名として使用します。たとえば、 + /icons ディレクトリを使う + ためには以下のようなものが使用できます:

    + +

    + AliasMatch ^/icons(.*) /usr/local/apache/icons$1 +

    + +
    +
    top
    +

    Redirect ディレクティブ

    + + + + + + + +
    説明:クライアントが違う URL を取得するように外部へのリダイレクトを +送る
    構文:Redirect [status] URL-path +URL
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:FileInfo
    ステータス:Base
    モジュール:mod_alias
    +

    Redirect ディレクティブは古い URL を新しいものへマップします。 + 新しい URL がクライアントに返されます。そして、 + クライアントは新しいアドレスをもう一回取得しようとします。 + URL-path (% が復号された) パスで始まるドキュメントへの + すべてのリクエストは URL で始まる新しい + (% が符号化された) URL へのリダイレクトエラーが返されます。

    + +

    例

    + Redirect /service http://foo2.bar.com/service +

    + +

    クライアントは http://myserver/service/foo.txt + へのリクエストを行なうと、代わりに http://foo2.bar.com/service/foo.txt + をアクセスするように告げられます。

    + +

    注意

    設定ファイル中の順番に関わらず、 +Redirect 系のディレクティブは Alias +ディレクティブと ScriptAlias ディレクティブよりも優先されます。 +また、.htaccess ファイルや <Directory> +セクションの中で使われていたとしても、URL-path +は相対パスではなく、完全な URL でなければなりません。

    + +

    もし status 引数が与えられていなければ、リダイレクトは + "temporary" (HTTP ステータス 302) になります。これはクライアントに + リソースが一時的に移動したということを示します。Status + 引数は 他の HTTP のステータスコードを返すために使用することができます:

    + +
    +
    permanent
    + +
    永久にリダイレクトをするステータス (301) を返します。 + これはリソースが永久に移動したということを意味します。
    + +
    temp
    + +
    一時的なリダイレクトステータス (302) + を返します。これがデフォルトです。
    + +
    seeother
    + +
    "See Other" ステータス (303) を返します。 + これはリソースが他のもので置き換えられたことを意味します。
    + +
    gone
    + +
    "Gone" ステータス (410) を返します。これはリソースが永久に + 削除されたことを意味します。このステータスが使用された場合、 + url 引数は省略されなければなりません。
    +
    + +

    Status の値にステータスコードを数値で与えることで + 他のステータスコードも返すことができます。ステータスが 300 と 399 + の間にある場合、url 引数は存在していなければいけません。 + その他の場合は省略されていなければなりません。ただし、 + ステータスは Apache のコードが知っているものである必要があります + (http_protocol.c の関数 send_error_response + を見てください)。

    +

    例:

    + +

    例

    + Redirect permanent /one http://example.com/two
    + Redirect 303 /three http://example.com/other +

    + + +
    +
    top
    +

    RedirectMatch ディレクティブ

    + + + + + + + +
    説明:現在の URL への正規表現のマッチにより +外部へのリダイレクトを送る
    構文:RedirectMatch [status] regex +URL
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:FileInfo
    ステータス:Base
    モジュール:mod_alias
    +

    このディレクティブは Redirect + とほとんど同じですが、簡単な先頭からのマッチを行なうのではなく、 + 標準正規表現を利用します。ここで指定された正規表現と URL-path + が合うかどうかを調べ、合う場合は括弧で括られたマッチを + 与えられた文字列で置き換え、それをファイル名として使用します。 + たとえば、すべての GIF ファイルを別サーバの同様な名前の JPEG + ファイルにリダイレクトするには、以下のようなものを使います: +

    + +

    + RedirectMatch (.*)\.gif$ http://www.anotherserver.com$1.jpg +

    + +
    +
    top
    +

    RedirectPermanent ディレクティブ

    + + + + + + + +
    説明:クライアントが違う URL を取得するように外部への永久的な +リダイレクトを送る
    構文:RedirectPermanent URL-path URL
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:FileInfo
    ステータス:Base
    モジュール:mod_alias
    +

    このディレクティブはクライアントに Redirect が永久的なもの + (ステータス 301) であることを知らせます。 + Redirect premanent とまったく同じです。

    + +
    +
    top
    +

    RedirectTemp ディレクティブ

    + + + + + + + +
    説明:クライアントが違う URL を取得するように外部への一時的な +リダイレクトを送る
    構文:RedirectTemp URL-path URL
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:FileInfo
    ステータス:Base
    モジュール:mod_alias
    +

    このディレクティブはクライアントに Redirect + が一時的なものである (ステータス 302) ことを知らせます。 + Redirect temp とまったく同じです。

    + +
    +
    top
    +

    ScriptAlias ディレクティブ

    + + + + + + +
    説明:URL をファイルシステムの位置へマップし、マップ先を +CGI スクリプトに指定
    構文:ScriptAlias URL-path +file-path|directory-path
    コンテキスト:サーバ設定ファイル, バーチャルホスト
    ステータス:Base
    モジュール:mod_alias
    +

    ScriptAlias ディレクティブは、対象ディレクトリに + mod_cgi の cgi-script + ハンドラで処理される CGI + スクリプトがあることを示す以外は + Alias + ディレクティブと同じ振る舞いをします。 + URL の (% が復号された) パスが URL-path で始まるものは + ローカルのファイルシステムの + フルパスである二番目の引数にマップされます。

    + +

    例

    + ScriptAlias /cgi-bin/ /web/cgi-bin/ +

    + +

    http://myserver/cgi-bin/foo + へのリクエストに対してサーバはスクリプト + /web/cgi-bin/foo を実行します。

    + +
    +
    top
    +

    ScriptAliasMatch ディレクティブ

    + + + + + + +
    説明:URL を正規表現を使ってファイルシステムの位置へマップし、マップ先を +CGI スクリプトに指定
    構文:ScriptAliasMatch regex +file-path|directory-path
    コンテキスト:サーバ設定ファイル, バーチャルホスト
    ステータス:Base
    モジュール:mod_alias
    +

    このディレクティブは ScriptAlias + とほとんど同じですが、簡単な先頭からのマッチを行なうのではなく、 + 標準正規表現を利用します。ここで指定された正規表現と URL-path + が合うかどうかを調べ、合う場合は括弧で括られたマッチを + 与えられた文字列で置き換え、それをファイル名として使用します。 + たとえば、標準の /cgi-bin + を使用するようにするためには、以下のようなものを使います: +

    + +

    + ScriptAliasMatch ^/cgi-bin(.*) /usr/local/apache/cgi-bin$1 +

    + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_alias.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_alias.html.ko.euc-kr new file mode 100644 index 00000000..77bed51f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_alias.html.ko.euc-kr @@ -0,0 +1,358 @@ + + + +mod_alias - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    ¾ÆÆÄÄ¡ ¸ðµâ mod_alias

    +
    +

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

    +
    +
    ÀÌ ¹®¼­´Â ÃÖ½ÅÆÇ ¹ø¿ªÀÌ ¾Æ´Õ´Ï´Ù. + ÃÖ±Ù¿¡ º¯°æµÈ ³»¿ëÀº ¿µ¾î ¹®¼­¸¦ Âü°íÇϼ¼¿ä.
    + + + +
    ¼³¸í:ÆÄÀϽýºÅÛÀÇ ´Ù¸¥ ºÎºÐµéÀ» ¹®¼­ °èÃþ±¸Á¶¿¡ Æ÷ÇÔÇÏ°í, + URL ¸®´ÙÀÌ·º¼ÇÀ» Á¦°øÇÑ´Ù
    »óÅÂ:Base
    ¸ðµâ¸í:alias_module
    ¼Ò½ºÆÄÀÏ:mod_alias.c
    +

    ¿ä¾à

    + +

    ÀÌ ¸ðµâÀÌ Á¦°øÇÏ´Â Áö½Ã¾îµéÀ» »ç¿ëÇÏ¿© ¼­¹ö°¡ ¿äûÀ» + ¹ÞÀ»¶§ URLÀ» ¼öÁ¤Çϰųª Á¶ÀÛÇÒ ¼ö ÀÖ´Ù. Alias¿Í ScriptAlias Áö½Ã¾î´Â URLÀ» + ÆÄÀϽýºÅÛ °æ·Î·Î ´ëÀÀÇÑ´Ù. ±×·¡¼­ DocumentRoot ¾Æ·¡¿¡ ¾ø´Â ³»¿ëÀ» + À¥À¸·Î ¼­ºñ½ºÇÒ ¼ö ÀÖ´Ù. ¶Ç, ScriptAlias Áö½Ã¾î´Â ÁöÁ¤ÇÑ + µð·ºÅ丮¿¡ CGI ½ºÅ©¸³Æ®¹Û¿¡ ¾ø´Ù°í ¾Ë¸°´Ù.

    + +

    Redirect Áö½Ã¾î´Â + Ŭ¶óÀ̾ðÆ®¿¡°Ô ´Ù¸¥ URL·Î »õ·Î¿î ¿äûÀ» Çϵµ·Ï Áö½ÃÇÑ´Ù. + ÀÚ¿øÀ» »õ·Î¿î Àå¼Ò·Î ¿Å±ä °æ¿ì ÀÚÁÖ »ç¿ëÇÑ´Ù.

    + +

    mod_alias´Â °£´ÜÇÑ URL Á¶ÀÛÀ» À§ÇØ + ¼³°èµÇ¾ú´Ù. ÁúÀǹ®ÀÚ¿­ Á¶ÀÛ°ú °°Àº º¹ÀâÇÑ ÀÛ¾÷Àº + mod_rewrite°¡ Á¦°øÇÏ´Â ±â´ÉÀ» ÀÌ¿ëÇ϶ó.

    + +
    + +
    top
    +
    +

    ó¸® ¼ø¼­

    + +

    ¼­·Î ´Ù¸¥ »ç¿ëÀå¼Ò¿¡¼­ Alias¿Í Redirect¸¦ »ç¿ëÇÏ¸é ´Ù¸¥ Áö½Ã¾î¿Í +°°ÀÌ Ç¥ÁØ °áÇÕ ¹æ¹ý¿¡ +µû¶ó ó¸®ÇÑ´Ù. ±×·¯³ª °°Àº »ç¿ëÀå¼Ò¿¡ (¿¹¸¦ µé¾î, °°Àº <VirtualHost> ¼½¼Ç¿¡) +Alias¿Í Redirect¸¦ »ç¿ëÇÏ¸é ¾Æ·¡ ¼ø¼­´ë·Î ó¸®ÇÑ´Ù.

    + +

    ¸ÕÀú ¸ðµç Redirect¸¦ ó¸®ÇÑ ÈÄ Alias¸¦ ó¸®ÇÑ´Ù. ±×·¡¼­ +Redirect³ª RedirectMatch¿¡ ÇØ´çÇÏ´Â ¿äûÀº +Àý´ë·Î AliasÇÏÁö ¾Ê´Â´Ù. ±×¸®°í Alias¿Í Redirect´Â ¼³Á¤ÆÄÀÏ¿¡¼­ +ù¹ø°·Î ³ª¿À´Â °ÍÀ» »ç¿ëÇÑ´Ù.

    + +

    ±×·¡¼­ ¿©·¯ Áö½Ã¾î°¡ µ¿ÀÏÇÑ ÇÏÀ§°æ·Î¿¡ ÇØ´çÇÏ´Â °æ¿ì ¸ðµç +Áö½Ã¾î¸¦ Àû¿ëÇϱâÀ§Çؼ­´Â °¡Àå »ó¼¼ÇÑ °æ·Î¸¦ ¸ÕÀú »ç¿ëÇØ¾ß ÇÑ´Ù. +¿¹¸¦ µé¾î, ´ÙÀ½ ¼³Á¤Àº ÀǵµÇÑ´ë·Î µ¿ÀÛÇÑ´Ù:

    + +

    +Alias /foo/bar /baz
    +Alias /foo /gaq +

    + +

    ±×·¯³ª À§ÀÇ µÎ Áö½Ã¾î ¼ø¼­¸¦ ¹Ù²Ù¸é /foo/bar +Alias ÀÌÀü¿¡ +/foo Alias¸¦ +Àû¿ëÇϹǷΠÇ×»ó µÎ¹ø° Áö½Ã¾î¸¦ ¹«½ÃÇÑ´Ù.

    + +
    +
    top
    +

    Alias Áö½Ã¾î

    + + + + + + +
    ¼³¸í:URLÀ» ƯÁ¤ ÆÄÀϽýºÅÛ Àå¼Ò·Î ´ëÀÀÇÑ´Ù
    ¹®¹ý:Alias URL-path +file-path|directory-path
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®
    »óÅÂ:Base
    ¸ðµâ:mod_alias
    + +

    Alias Áö½Ã¾î¸¦ »ç¿ëÇϸé ÆÄÀϽýºÅÛ¿¡¼­ + DocumentRoot ¹Û¿¡ ÀÖ´Â + ¹®¼­µµ ¼­ºñ½ºÇÒ ¼ö ÀÖ´Ù. url-path·Î ½ÃÀÛÇÏ´Â + (%·Î ÀÎÄÚµùµÈ) URLÀ» directory-path·Î ½ÃÀÛÇÏ´Â + ÆÄÀÏ¿¡ ´ëÀÀÇÑ´Ù.

    + +

    ¿¹Á¦:

    + Alias /image /ftp/pub/image +

    + +

    http://myserver/image/foo.gif¸¦ ¿äûÇÏ¸é ¼­¹ö´Â + /ftp/pub/image/foo.gif ÆÄÀÏÀ» ³Ñ°ÜÁØ´Ù.

    + +

    url-path ³¡¿¡ /¸¦ Æ÷ÇÔÇϸé, URL ³¡¿¡ /¸¦ + »ç¿ëÇؾ߸¸ ¿µÇâÀÌ ÀÖÀ½À» ÁÖÀÇÇ϶ó. Áï, Alias /icons/ + /usr/local/apache/icons/ ¼³Á¤Àº url /icons¿Í + °ü°è°¡ ¾ø´Ù.

    + +

    ´ëÀÀÀÇ ´ë»óÀ» Æ÷ÇÔÇÏ´Â ¿©·¯ <Directory> ¼½¼ÇÀÌ + ÇÊ¿äÇÒÁöµµ ¸ð¸¥´Ù. ÀÌ Áö½Ã¾î´Â <Directory> ¼½¼ÇÀ» °Ë»çÇϱâ Àü¿¡ + ó¸®ÇϹǷÎ, ´ëÀÀÀÇ ´ë»ó¸¸ ¼½¼ÇÀÇ ¿µÇâÀ» ¹Þ´Â´Ù. (±×·¯³ª + <Location> + ¼½¼ÇÀº ÀÌ Áö½Ã¾î¸¦ ó¸®Çϱâ Àü¿¡ Çѹø¸¸ °Ë»çÇϹǷΠÁöÁ¤ÇÑ + URL ÀÌÇÏ Àüü¿¡ ¿µÇâÀ» ÁØ´Ù.)

    + +

    ƯÈ÷ DocumentRoot + ¹Û¿¡ ÀÖ´Â µð·ºÅ丮·Î Alias¸¦ ¸¸µé¾ú´Ù¸é, Á÷Á¢ + ´ë»ó µð·ºÅ丮ÀÇ Á¢±ÙÀ» Çã¿ëÇØÁà¾ß ÇÑ´Ù.

    + +

    ¿¹Á¦:

    + Alias /image /ftp/pub/image
    + <Directory /ftp/pub/image>
    + + Order allow,deny
    + Allow from all
    +
    + </Directory> +

    + + +
    +
    top
    +

    AliasMatch Áö½Ã¾î

    + + + + + + +
    ¼³¸í:Á¤±ÔÇ¥Çö½ÄÀ» »ç¿ëÇÏ¿© URLÀ» ÆÄÀϽýºÅÛ Àå¼Ò·Î +´ëÀÀÇÑ´Ù
    ¹®¹ý:AliasMatch regex +file-path|directory-path
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®
    »óÅÂ:Base
    ¸ðµâ:mod_alias
    +

    ÀÌ Áö½Ã¾î´Â Alias¿Í + °°Áö¸¸, °£´ÜÈ÷ URLÀÇ ¾ÕºÎºÐ¸¸ ºñ±³ÇÏ´Â ´ë½Å Ç¥ÁØ Á¤±ÔÇ¥Çö½ÄÀ» + »ç¿ëÇÑ´Ù. ÁöÁ¤ÇÑ Á¤±ÔÇ¥Çö½ÄÀ» URL °æ·Î¿Í ºñ±³ÇÏ¿© ¸Â´Ù¸é, + ¼­¹ö´Â °ýÈ£·Î ¹­Àº ºÎºÐÀ» ´ëüÇÏ¿© ÆÄÀϸíÀ¸·Î »ç¿ëÇÑ´Ù. + ¿¹¸¦ µé¾î, ´ÙÀ½°ú °°ÀÌ /icons µð·ºÅ丮¸¦ »ç¿ëÇÒ + ¼ö ÀÖ´Ù:

    + +

    + AliasMatch ^/icons(.*) /usr/local/apache/icons$1 +

    + +
    +
    top
    +

    Redirect Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:Ŭ¶óÀ̾ðÆ®°¡ ´Ù¸¥ URL¿¡ Á¢¼ÓÇϵµ·Ï ¿äûÇÏ´Â ¿ÜºÎ +¸®´ÙÀÌ·º¼ÇÀ» º¸³½´Ù
    ¹®¹ý:Redirect [status] URL-path +URL
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®, directory, .htaccess
    Override ¿É¼Ç:FileInfo
    »óÅÂ:Base
    ¸ðµâ:mod_alias
    +

    Redirect Áö½Ã¾î´Â ÀÌÀü URLÀ» »õ·Î¿î URL·Î ´ëÀÀÇÑ´Ù. + Ŭ¶óÀ̾ðÆ®¿¡°Ô »õ·Î¿î URLÀ» º¸³»°í, Ŭ¶óÀ̾ðÆ®´Â »õ·Î¿î + ÁÖ¼Ò·Î ´Ù½Ã Çѹø Á¢¼ÓÇÑ´Ù. (%·Î ÀÎÄÚµùµÈ) URL-path·Î + ½ÃÀÛÇÏ´Â ¿äûÀ» ¹ÞÀ¸¸é (%·Î ÀÎÄÚµùµÈ) URL·Î ½ÃÀÛÇÏ´Â + »õ·Î¿î URL·Î ¸®´ÙÀÌ·º¼Ç ¿À·ù¸¦ º¸³½´Ù.

    + +

    ¿¹Á¦:

    + Redirect /service http://foo2.bar.com/service +

    + +

    Ŭ¶óÀ̾ðÆ®°¡ http://myserver/service/foo.txt¸¦ ¿äûÇϸé + ´ë½Å http://foo2.bar.com/service/foo.txt¿¡ Á¢±ÙÇ϶ó´Â ÀÀ´äÀ» + ¹Þ´Â´Ù.

    + +

    ÁÖÀÇ

    Redirect Áö½Ã¾î´Â ¼³Á¤ÆÄÀÏ¿¡¼­ +³ª¿À´Â ¼ø¼­¿Í °ü°è¾øÀÌ Alias¿Í ScriptAlias Áö½Ã¾îº¸´Ù ¿ì¼±¼øÀ§°¡ +³ô´Ù. ¶Ç, .htaccess ÆÄÀÏÀ̳ª <Directory> ¼½¼Ç¿¡¼­ »ç¿ëÇÏ´õ¶óµµ +URL-path¿¡´Â »ó´ë°æ·Î°¡ ¾Æ´Ï¶ó ¹Ýµå½Ã ¿ÏÀüÇÑ URLÀ» +»ç¿ëÇØ¾ß ÇÑ´Ù.

    + +

    status ¾Æ±Ô¸ÕÆ®¸¦ ÁöÁ¤ÇÏÁö¾ÊÀ¸¸é, "Àӽà + (temporary)" (HTTP »óÅ 302) ¸®´ÙÀÌ·º¼ÇÀ» º¸³½´Ù. Áï, + Ŭ¶óÀ̾ðÆ®¿¡°Ô ÀÚ¿øÀ» Àӽ÷Π¿Å°å´Ù°í ¾Ë¸°´Ù. status + ¾Æ±Ô¸ÕÆ®¸¦ »ç¿ëÇÏ¿© ´Ù¸¥ HTTP »óÅÂÄڵ带 ¹ÝȯÇÒ ¼ö ÀÖ´Ù:

    + +
    +
    permanent
    + +
    ÀÚ¿øÀ» ¿ÏÀüÈ÷ ¿Å°åÀ½À» ¶æÇÏ´Â ¿µ±¸ ¸®´ÙÀÌ·º¼Ç »óŸ¦ + (301) ¹ÝȯÇÑ´Ù.
    + +
    temp
    + +
    Àӽà ¸®´ÙÀÌ·º¼Ç »óŸ¦ (302) ¹ÝȯÇÑ´Ù. ±âº»°ªÀÌ´Ù.
    + +
    seeother
    + +
    ÀÚ¿øÀÌ ±³Ã¼µÇ¾úÀ½À» ¶æÇÏ´Â "ÂüÁ¶ (See Other)" »óŸ¦ + (303) ¹ÝȯÇÑ´Ù.
    + +
    gone
    + +
    ÀÚ¿øÀÌ ¿µ±¸È÷ »èÁ¦µÇ¾úÀ½À» ¶æÇÏ´Â "¼Ò¸ê (Gone)" »óŸ¦ + (410) ¹ÝȯÇÑ´Ù. ÀÌ »óŸ¦ »ç¿ëÇϸé URL ¾Æ±Ô¸ÕÆ®¸¦ + »ç¿ëÇÒ ¼ö ¾ø´Ù.
    +
    + +

    status¿¡ ¼ýÀÚ »óÅÂÄڵ带 »ç¿ëÇÏ¿© ´Ù¸¥ »óÅÂÄڵ嵵 + ¹ÝȯÇÒ ¼ö ÀÖ´Ù. »óÅ°¡ 300°ú 399 »çÀ̶ó¸é URL + ¾Æ±Ô¸ÕÆ®¸¦ »ç¿ëÇØ¾ß ÇÏ°í, ¾Æ´Ï¶ó¸é »ý·«ÇØ¾ß ÇÑ´Ù. ´Ü, ¾ÆÆÄÄ¡ + Äڵ忡 »óÅ°¡ Á¤ÀǵÇÀÖ¾î¾ß ÇÑ´Ù (http_protocol.cÀÇ + send_error_response ÇÔ¼ö Âü°í).

    + +

    ¿¹Á¦:

    + Redirect permanent /one http://example.com/two
    + Redirect 303 /three http://example.com/other +

    + + +
    +
    top
    +

    RedirectMatch Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:ÇöÀç URLÀÌ Á¤±ÔÇ¥Çö½Ä¿¡ ÇØ´çÇÏ¸é ¿ÜºÎ ¸®´ÙÀÌ·º¼ÇÀ» +º¸³½´Ù
    ¹®¹ý:RedirectMatch [status] regex +URL
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®, directory, .htaccess
    Override ¿É¼Ç:FileInfo
    »óÅÂ:Base
    ¸ðµâ:mod_alias
    +

    ÀÌ Áö½Ã¾î´Â Redirect¿Í °°Áö¸¸, °£´ÜÈ÷ + URLÀÇ ¾ÕºÎºÐ¸¸ ºñ±³ÇÏ´Â ´ë½Å Ç¥ÁØ Á¤±ÔÇ¥Çö½ÄÀ» »ç¿ëÇÑ´Ù. + ÁöÁ¤ÇÑ Á¤±ÔÇ¥Çö½ÄÀ» URL °æ·Î¿Í ºñ±³ÇÏ¿© ¸Â´Ù¸é, ¼­¹ö´Â °ýÈ£·Î + ¹­Àº ºÎºÐÀ» ´ëüÇÏ¿© ÆÄÀϸíÀ¸·Î »ç¿ëÇÑ´Ù. ¿¹¸¦ µé¾î, ´ÙÀ½Àº + ¸ðµç GIF ÆÄÀÏ ¿äû¿¡ ´ëÇØ ´Ù¸¥ ¼­¹öÀÇ ºñ½ÁÇÑ À̸§À» °¡Áø + JPEG ÆÄÀÏ·Î ¸®´ÙÀÌ·º¼ÇÀ» º¸³½´Ù:

    + +

    + RedirectMatch (.*)\.gif$ http://www.anotherserver.com$1.jpg +

    + +
    +
    top
    +

    RedirectPermanent Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:Ŭ¶óÀ̾ðÆ®°¡ ´Ù¸¥ URL¿¡ Á¢¼ÓÇϵµ·Ï ¿äûÇÏ´Â ¿ÜºÎ +¿µ±¸ ¸®´ÙÀÌ·º¼ÇÀ» º¸³½´Ù
    ¹®¹ý:RedirectPermanent URL-path URL
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®, directory, .htaccess
    Override ¿É¼Ç:FileInfo
    »óÅÂ:Base
    ¸ðµâ:mod_alias
    +

    ÀÌ Áö½Ã¾î´Â Ŭ¶óÀ̾ðÆ®¿¡°Ô ¸®´ÙÀÌ·º¼ÇÀÌ ¿µ±¸ÀûÀÓÀ» (»óÅ + 301) ¾Ë¸°´Ù. Redirect permanent¿Í Á¤È®È÷ °°´Ù.

    + +
    +
    top
    +

    RedirectTemp Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:Ŭ¶óÀ̾ðÆ®°¡ ´Ù¸¥ URL¿¡ Á¢¼ÓÇϵµ·Ï ¿äûÇÏ´Â ¿ÜºÎ +Àӽà ¸®´ÙÀÌ·º¼ÇÀ» º¸³½´Ù
    ¹®¹ý:RedirectTemp URL-path URL
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®, directory, .htaccess
    Override ¿É¼Ç:FileInfo
    »óÅÂ:Base
    ¸ðµâ:mod_alias
    +

    ÀÌ Áö½Ã¾î´Â Ŭ¶óÀ̾ðÆ®¿¡°Ô ¸®´ÙÀÌ·º¼ÇÀÌ ÀÓ½ÃÀûÀÓÀ» (»óÅ + 302) ¾Ë¸°´Ù. Redirect temp¿Í Á¤È®È÷ °°´Ù.

    + +
    +
    top
    +

    ScriptAlias Áö½Ã¾î

    + + + + + + +
    ¼³¸í:URLÀ» ƯÁ¤ ÆÄÀϽýºÅÛ Àå¼Ò·Î ´ëÀÀÇÏ°í ´ë»óÀÌ CGI +½ºÅ©¸³Æ®¶ó°í ¾Ë¸°´Ù
    ¹®¹ý:ScriptAlias URL-path +file-path|directory-path
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®
    »óÅÂ:Base
    ¸ðµâ:mod_alias
    +

    ScriptAlias Áö½Ã¾î´Â Alias Áö½Ã¾î¿Í ºñ½ÁÇÏÁö¸¸, + Ãß°¡·Î ´ë»ó µð·ºÅ丮¿¡ mod_cgiÀÇ cgi-script + Çڵ鷯°¡ ó¸®ÇÒ CGI ½ºÅ©¸³Æ®°¡ ÀÖ´Ù°í ¾Ë¸°´Ù. + URL-path·Î ½ÃÀÛÇÏ´Â (%·Î ÀÎÄÚµùµÈ) URLÀ» ÆÄÀϽýºÅÛÀÇ + Àý´ë°æ·ÎÀÎ µÎ¹ø° ¾Æ±Ô¸ÕÆ®·Î ½ÃÀÛÇÏ´Â ½ºÅ©¸³Æ®¿¡ ´ëÀÀÇÑ´Ù.

    + +

    ¿¹Á¦:

    + ScriptAlias /cgi-bin/ /web/cgi-bin/ +

    + +

    http://myserver/cgi-bin/foo¸¦ ¿äûÇÏ¸é ¼­¹ö´Â + /web/cgi-bin/foo ½ºÅ©¸³Æ®¸¦ ½ÇÇàÇÑ´Ù.

    + +
    +
    top
    +

    ScriptAliasMatch Áö½Ã¾î

    + + + + + + +
    ¼³¸í:Á¤±ÔÇ¥Çö½ÄÀ» »ç¿ëÇÏ¿© URLÀ» ƯÁ¤ ÆÄÀϽýºÅÛ Àå¼Ò·Î +´ëÀÀÇÏ°í ´ë»óÀÌ CGI ½ºÅ©¸³Æ®¶ó°í ¾Ë¸°´Ù
    ¹®¹ý:ScriptAliasMatch regex +file-path|directory-path
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®
    »óÅÂ:Base
    ¸ðµâ:mod_alias
    +

    ÀÌ Áö½Ã¾î´Â ScriptAlias¿Í °°Áö¸¸, °£´ÜÈ÷ + URLÀÇ ¾ÕºÎºÐ¸¸ ºñ±³ÇÏ´Â ´ë½Å Ç¥ÁØ Á¤±ÔÇ¥Çö½ÄÀ» »ç¿ëÇÑ´Ù. + ÁöÁ¤ÇÑ Á¤±ÔÇ¥Çö½ÄÀ» URL °æ·Î¿Í ºñ±³ÇÏ¿© ¸Â´Ù¸é, ¼­¹ö´Â °ýÈ£·Î + ¹­Àº ºÎºÐÀ» ´ëüÇÏ¿© ÆÄÀϸíÀ¸·Î »ç¿ëÇÑ´Ù. ¿¹¸¦ µé¾î, ´ÙÀ½°ú + °°ÀÌ Ç¥ÁØÀûÀÎ /cgi-binÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù:

    + +

    + ScriptAliasMatch ^/cgi-bin(.*) /usr/local/apache/cgi-bin$1 +

    + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_alias.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_alias.html.tr.utf8 new file mode 100644 index 00000000..abd6e548 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_alias.html.tr.utf8 @@ -0,0 +1,430 @@ + + + +mod_alias - Apache HTTP Sunucusu + + + + + + +
    <-
    + +
    +

    Apache Modülü mod_alias

    +
    +

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

    +
    + + + +
    Açıklama:Belge ağacının parçalarının dosya sisteminin parçalarıyla +eşlenmesini sağlar ve URL yönlendirmesi yapar.
    Durum:Temel
    Modül Betimleyici:alias_module
    Kaynak Dosyası:mod_alias.c
    +

    Özet

    + +

    Bu modülde bulunan yönergeler sunucuya istek olarak gelen URL’lerin + denetlenmesini ve değiştirilmesini mümkün kılar. Alias ve ScriptAlias yönergeleri URL’lerin dosya sisteminin + dizinlerine eşlenmesini sağlar. Böylece, kök dizini DocumentRoot ile belirtilen site belge ağacı + altında bulunmayan içeriğe erişmek mümkün olur. ScriptAlias yönergesi buna ek olarak + hedef dizini sadece CGI betiklerini içeren dizin olarak imler.

    + +

    Redirect yönergesi, + farklı bir URL ile yeni bir istek yapmaları için istemcileri + yönlendirmekte kullanılır. Çoğunlukla özkaynak başka bir yere + taşındığında kullanılır.

    + +

    mod_alias modülü basit URL değiştirme görevlerini + yerine getirmek için tasarlanmıştır. Sorgu dizgelerini işleme sokmak + gibi daha karmaşık görevler için mod_rewrite modülü ile + sağlanan araçlar kullanılır.

    + +
    + +
    top
    +
    +

    İşlem Sırası

    + +

    Farklı bağlamlarda bulunan Alias ve Redirect + yönergeleri standart katıştırma + kuralları ile ilgili diğer yönergeler gibi işleme sokulurlar. Fakat + aynı bağlam dahilinde (örneğin, aynı <VirtualHost> bölümünde) çok fazla Alias ve Redirect varsa bunlar belli bir sıraya göre işleme + sokulur.

    + +

    İlk adımda, Alias’lardan önce + bütün Redirect yönergeleri + işleme sokulur. Bu bakımdan bir Redirect veya RedirectMatch ile eşleşen bir istek için + hiçbir Alias + uygulanmayacaktır. İkinci adımda yapılandırma dosyasında yer aldıkları + sıraya göre Redirect ve + Alias yönergeleri işleme + sokulurlar, dolayısıyla ilk eşleşme öncelikli olmuş olur.

    + +

    İlk eşleşmenin öncelikli olması sebebiyle, bu yönergelerin birden + fazlası aynı alt yola uygulandığı takdirde, tüm yönergelerin etkili + olabilmesi için en uzun yolu sıralamada en öne almalısınız. Örneğin + aşağıdaki yapılandırma beklendiği gibi çalışacaktır:

    + +

    + Alias /foo/bar /baz
    + Alias /foo /gaz +

    + +

    Ama yukarıdaki iki satır ters sırada yerleştirilmiş olsaydı, + /foo rumuzu daima /foo/bar rumuzundan önce + eşleşecek, dolayısıyla ikinci yönerge yok sayılacaktı.

    + +
    +
    top
    +

    Alias Yönergesi

    + + + + + + +
    Açıklama:URL’leri dosya sistemi konumlarıyla eşler.
    Sözdizimi:Alias URL-yolu +dosya-yolu|dizin-yolu
    Bağlam:sunucu geneli, sanal konak
    Durum:Temel
    Modül:mod_alias
    + +

    Alias yönergesi, belgelerin DocumentRoot dizininden farklı bir yerde + saklanmasını mümkün kılar. URL-yolu ile başlayan + URL’ler (% imlemesi çözüldükten sonra) dizin-yolu + ile başlayan yerel dosyalarla eşlenir. URL-yolu, + harf büyüklüğüne duyarsız sistemlerde bile harf büyüklüğüne + duyarlıdır.

    + +

    Örnek:

    + Alias /image /ftp/pub/image +

    + +

    http://sunucum/image/foo.gif şeklinde bir istek, sunucunun + /ftp/pub/image/foo.gif dosyasıyla yanıt vermesine sebep + olurdu.

    + +

    URL-yolu’nu bir / ile + sonlandırırsanız Alias yönergesini yorumlarken + sunucunun da sona bir / ekleyeceğine dikkat ediniz. Yani, + eğer

    + +
    Alias /icons/ /usr/local/apache/icons/
    + +

    diye bir tanım yaparsanız /icons URL’si için bir + Alias kullanılmayacaktır.

    + +

    Alias hedefleri için ek <Directory> bölümleri + belirtmeniz gerekebileceğine dikkat ediniz. <Directory> bölümlerinden önce yer alan + Alias yönergelerine özellikle bakılır, + dolayısıyla sadece Alias hedefleri etkilenir. + (Bununla birlikte, Alias yönergelerinden önce + işleme sokulan <Location> bölümlerinin uygulanacağına dikkat + ediniz.)

    + +

    Özellikle, DocumentRoot dışında + bir dizine bir Alias oluşturuyorsanız hedef + dizine doğrudan erişim izni vermeniz gerekebilir.

    + +

    Örnek:

    + Alias /image /ftp/pub/image
    + <Directory /ftp/pub/image>
    + + Order allow,deny
    + Allow from all
    +
    + </Directory> +

    + +
    +
    top
    +

    AliasMatch Yönergesi

    + + + + + + +
    Açıklama:URL’leri dosya sistemi konumlarıyla düzenli ifadeleri kullanarak +eşler.
    Sözdizimi:AliasMatch düzenli-ifade +dosya-yolu|dizin-yolu
    Bağlam:sunucu geneli, sanal konak
    Durum:Temel
    Modül:mod_alias
    +

    Bu yönerge URL-yolu ile eşleşmek üzere bir + → düzenli ifade kabul etmesi dışında + Alias yönergesine eşdeğerdir. + Belirtilen düzenli ifade URL-yolu ile eşleşiyorsa + sunucu parantezli eşleşmeleri belirtilen dizgede kullanarak dosya yolunu + elde eder. Örneğin, /icons dizinini etkinleştirmek için şu + yazılabilir:

    + +

    + AliasMatch ^/icons(.*) /usr/local/apache/icons$1 +

    + +

    Ayrıca, URL-yolu ile harf büyüklüğüne duyarsız + eşleşmeler sağlayacak düzenli ifadeler de kullanılabilir:

    + +

    + AliasMatch (?i)^/image(.*) /ftp/pub/image$1 +

    + +
    +
    top
    +

    Redirect Yönergesi

    + + + + + + + +
    Açıklama:İstemciyi, bir yönlendirme isteği döndürerek farklı bir URL’ye +yönlendirir.
    Sözdizimi:Redirect [durum] URL-yolu +URL
    Bağlam:sunucu geneli, sanal konak, dizin, .htaccess
    Geçersizleştirme:FileInfo
    Durum:Temel
    Modül:mod_alias
    +

    Redirect yönergesi istemciye bir yönlendirme + isteği döndürerek eski URL’yi yenisiyle eşler.

    + +

    Eski URL-yolu bir bölü çizgisi ile başlar ve harf + büyüklüğüne duyarlıdır (% imlemesi çözüldükten sonra). + URL-yolu olarak göreli yollara izin verilmez. + URL ise bir şema ve konak ismi ile başlayan bir + mutlak URL olmalıdır.

    + +

    Örnek:

    + Redirect /hizmet http://iki.mesela.dom/hizmet +

    + +

    İstemcinin yaptığı http://mesela.dom/hizmet/fesmekan.txt + isteğine karşılık istemciye isteği + http://iki.mesela.dom/hizmet/fesmekan.txt olarak yapması + söylenecektir.

    + + +

    Bilginize

    +

    Yapılandırma dosyasında yer alış sırasına bakmaksızın + Redirect yönergeleri + Alias ve ScriptAlias + yönergelerinden önce ele alınır. <Directory> bölümleri ve .htaccess + dosyaları içinde bile kullanılsa URL-yolu göreli + bir yol değil, tam nitelikli bir URL olmak zorundadır.

    + +

    Herhangi bir durum belirtilmemişse "geçici" + yönlendirme (HTTP durum kodu: 302) yapılır. Bu, istemciye özkaynağın + geçici olarak başka yere taşındığını belirtir. Diğer HTTP durum + kodlarını döndürmek için kullanılabilecek durum + değerleri:

    + +
    +
    permanent
    +
    İstemciye özkaynağın kalıcı olarak taşındığını belirten kalıcı + yönlendirme durumu (301) döndürülür.
    + +
    temp
    +
    İstemciye geçici yönlendirme durumu (302) döner. Bu öntanımlıdır. +
    + +
    seeother
    +
    İstemciye özkaynağın yerine başka bir şey konduğunu belirten + "diğerine bak" durumu (303) döndürülür.
    + +
    gone
    +
    İstemciye özkaynağın kalıcı olarak kaldırıldığını belirten "ölü + bağlantı" durumu (410) döner. Bu durumda URL + belirtilmez.
    +
    + +

    Diğer durum kodları için durum olarak sayısal + durum kodu belirtilir. Eğer durum 300 ile 399 arasındaysa bir + URL belirtmek gereklidir, yoksa belirtilmez. + Belirtilecek durum kodunu Apache’nin bilmesi gerektiğine dikkat ediniz + (http_protocol.c dosyasında bulunan + send_error_response işlevine bakınız).

    + +

    Örnek:

    + Redirect permanent /bir http://mesela.dom/iki
    + Redirect 303 /yedi http://mesela.dom/baskabisey +

    + +
    +
    top
    +

    RedirectMatch Yönergesi

    + + + + + + + +
    Açıklama:Geçerli URL ile eşleşen bir düzenli ifadeye dayanarak bir harici +yönlendirme gönderir.
    Sözdizimi:RedirectMatch [durum] düzenli-ifade +URL
    Bağlam:sunucu geneli, sanal konak, dizin, .htaccess
    Geçersizleştirme:FileInfo
    Durum:Temel
    Modül:mod_alias
    +

    Bu yönerge URL-yolu ile eşleşmek üzere bir + → düzenli ifade kabul etmesi dışında + Redirect yönergesine + eşdeğerdir. Belirtilen düzenli ifade URL-yolu ile + eşleşiyorsa sunucu parantezli eşleşmeleri belirtilen dizgede kullanarak + dosya yolunu elde eder. Örneğin, tüm GIF dosyası isteklerini başka bir + sunucudaki aynı isimli JPEG dosyalarına yönlendirmek için şu + yazılabilir:

    + +

    + RedirectMatch (.*)\.gif$ http://baska.sunucu.dom$1.jpg +

    + +
    +
    top
    +

    RedirectPermanent Yönergesi

    + + + + + + + +
    Açıklama:İstemciyi, kalıcı bir yönlendirme isteği döndürerek farklı bir +URL’ye yönlendirir.
    Sözdizimi:RedirectPermanent URL-yolu URL
    Bağlam:sunucu geneli, sanal konak, dizin, .htaccess
    Geçersizleştirme:FileInfo
    Durum:Temel
    Modül:mod_alias
    +

    Bu yönerge istemciye daima kalıcı yönlendirme durumu (301) döndürür. + Yani, Redirect permanent ile aynı işi yapar.

    + +
    +
    top
    +

    RedirectTemp Yönergesi

    + + + + + + + +
    Açıklama:İstemciyi, geçici bir yönlendirme isteği döndürerek farklı bir +URL’ye yönlendirir.
    Sözdizimi:RedirectTemp URL-yolu URL
    Bağlam:sunucu geneli, sanal konak, dizin, .htaccess
    Geçersizleştirme:FileInfo
    Durum:Temel
    Modül:mod_alias
    +

    Bu yönerge istemciye daima geçici yönlendirme durumu (302) döndürür. + Yani, Redirect temp ile aynı işi yapar.

    + +
    +
    top
    +

    ScriptAlias Yönergesi

    + + + + + + +
    Açıklama:Bir URL’yi dosya sistemindeki bir yere eşler ve hedefi bir CGI betiği olarak çalıştırır.
    Sözdizimi:ScriptAlias URL-yolu +dosya-yolu|dizin-yolu
    Bağlam:sunucu geneli, sanal konak
    Durum:Temel
    Modül:mod_alias
    +

    Hedef dizini, mod_cgi modülünün CGI betiği + yorumlayıcısı tarafından çalıştırılacak betikleri içeren dizin olarak + imlemesi dışında Alias + yönergesinin yaptığı işi yapar. URL-yolu ile + başlayan harf büyüklüğüne duyarlı URL’ler (% imlemesi çözüldükten + sonra), dosya sistemindeki bir tam yol olarak belirtilmiş + dizin-yolu ile başlayan betiklerle eşlenir.

    + +

    Örnek:

    + ScriptAlias /cgi-bin/ /siteler/cgi-bin/ +

    + +

    http://sunucum/cgi-bin/foo şeklindeki bir istek sunucunun + /siteler/cgi-bin/foo betiğini çalıştırmasına sebep olur. Bu + yapılandırma aslında şuna eşdeğerdir:

    + +

    + Alias /cgi-bin/ /siteler/cgi-bin/
    + <Location /cgi-bin >
    + + SetHandler cgi-script
    + Options +ExecCGI
    +
    + </Location> +

    + +
    Yapılandırma değiştiğinde kaynak kodlarının ister + istemez açığa çıkmasını istemiyorsanız CGI betiklerinizi DocumentRoot altına koymayınız. + ScriptAlias yönergesi URL’yi doğru yere + eşlemekten başka orayı bir CGI betikleri dizini olarak imler. CGI + betiklerinizi DocumentRoot altına + koyarsanız çalıştırmak için ScriptAlias değil, + <Directory>, + SetHandler ve Options yönergelerini örnekteki gibi kullanın: + +

    + <Directory /usr/local/apache2/htdocs/cgi-bin >
    + + SetHandler cgi-script
    + Options ExecCGI
    +
    + </Directory> +

    + + Aynı dosya sistemi konumu ile çok sayıda URL-yolu + eşleşebileceğinden, bir Directory + bölümü ile sınırlanmadığı takdirde CGI betiklerinin kaynak kodları açığa + çıkabilir; bu bakımdan ScriptAlias yönergesini yok + sayan URL yollarının belirtilebilme olasılığı gözardı + edilmemelidir.
    + + +

    Ayrıca bakınız:

    + +
    +
    top
    +

    ScriptAliasMatch Yönergesi

    + + + + + + +
    Açıklama:Bir URL’yi dosya sistemindeki bir yere düzenli ifade kullanarak +eşler ve hedefi bir CGI betiği olarak çalıştırır.
    Sözdizimi:ScriptAliasMatch düzenli-ifade +dosya-yolu|dizin-yolu
    Bağlam:sunucu geneli, sanal konak
    Durum:Temel
    Modül:mod_alias
    +

    Bu yönerge URL-yolu ile eşleşmek üzere bir + → düzenli ifade kabul etmesi dışında + ScriptAlias yönergesine + eşdeğerdir. Belirtilen düzenli ifade URL-yolu ile + eşleşiyorsa sunucu parantezli eşleşmeleri belirtilen dizgede kullanarak + dosya yolunu elde eder. Örneğin, standart /cgi-bin dizinini + etkin kılmak için şu yazılabilir:

    + +

    + ScriptAliasMatch ^/cgi-bin(.*) /usr/local/apache/cgi-bin$1 +

    + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_asis.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_asis.html new file mode 100644 index 00000000..f2f687b0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_asis.html @@ -0,0 +1,13 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_asis.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: mod_asis.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: mod_asis.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_asis.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_asis.html.en new file mode 100644 index 00000000..6830aa16 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_asis.html.en @@ -0,0 +1,112 @@ + + + +mod_asis - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_asis

    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + + + +
    Description:Sends files that contain their own +HTTP headers
    Status:Base
    Module Identifier:asis_module
    Source File:mod_asis.c
    +

    Summary

    + +

    This module provides the handler send-as-is + which causes Apache to send the document without adding most of + the usual HTTP headers.

    + +

    This can be used to send any kind of data from the server, + including redirects and other special HTTP responses, without + requiring a cgi-script or an nph script.

    + +

    For historical reasons, this module will also process any + file with the mime type httpd/send-as-is.

    +
    +

    Directives

    +

    This module provides no directives.

    +

    Topics

    +

    See also

    +
    +
    top
    +
    +

    Usage

    + +

    In the server configuration file, associate files with the + send-as-is handler e.g.

    + +

    AddHandler send-as-is asis

    + +

    The contents of any file with a .asis extension + will then be sent by Apache to the client with almost no + changes. In particular, HTTP headers are derived from the file + itself according to mod_cgi rules, so an asis + file must include valid headers, and may also use the CGI + Status: header to determine the HTTP response code.

    + + +

    Here's an example of a file whose contents are sent as + is so as to tell the client that a file has + redirected.

    + + +

    + Status: 301 Now where did I leave that URL
    + Location: http://xyz.abc.com/foo/bar.html
    + Content-type: text/html
    +
    + <html>
    + <head>
    + <title>Lame excuses'R'us</title>
    + </head>
    + <body>
    + <h1>Fred's exceptionally wonderful page has moved to
    + <a href="http://xyz.abc.com/foo/bar.html">Joe's</a> + site.
    + </h1>
    + </body>
    + </html> +

    + +

    Notes:

    +

    The server always adds a Date: and Server: + header to the data returned to the client, so these should not be + included in the file. The server does not add a + Last-Modified header; it probably should.

    +
    +
    +
    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_asis.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_asis.html.ja.utf8 new file mode 100644 index 00000000..46023ba8 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_asis.html.ja.utf8 @@ -0,0 +1,112 @@ + + + +mod_asis - Apache HTTP サーバ + + + + + + +
    <-
    + +
    +

    Apache モジュール mod_asis

    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    +
    This translation may be out of date. Check the + English version for recent changes.
    + + + +
    説明:自分用の HTTP ヘッダの書かれているファイルを送信する
    ステータス:Base
    モジュール識別子:asis_module
    ソースファイル:mod_asis.c
    +

    概要

    + +

    このモジュールはハンドラ send-as-is + を提供します。このハンドラは通常の HTTP + ヘッダをほとんど追加することなくドキュメントを送信します。

    + +

    これはサーバからどんな種類のデータを送るときにも使用できます。 + Cgi スクリプトや nph スクリプトが無くてもリダイレクトや他の特別な + HTTP 応答を送ることができます。

    + +

    歴史的な理由により、このモジュールは mime タイプ + httpd/send-as-is のファイルも処理します。

    +
    +

    ディレクティブ

    +

    このモジュールにディレクティブはありません。

    +

    トピック

    +

    参照

    +
    +
    top
    +
    +

    使用法

    + +

    サーバ設定ファイルで、ファイルと send-as-is + ハンドラを例えば以下のように関連付けてください。

    + +

    AddHandler send-as-is asis

    + +

    拡張子が .asis のすべてのファイルの内容は Apache + からクライアントへほとんど変更無く送られます。クライアントには + HTTP ヘッダが必要ですので、ファイルに書くことを忘れないでください。 + Status: ヘッダも必要です。データは 3 桁の HTTP + 応答コードと、その後にテキストメッセージが続いたものでなければなりません。

    + +

    これはクライアントにファイルが移動したことを知らせるために + as is (そのまま) で送られるファイルの内容の例です。 +

    + + +

    + Status: 301 Now where did I leave that URL
    + Location: http://xyz.abc.com/foo/bar.html
    + Content-type: text/html
    +
    + <html>
    + <head>
    + <title>Lame excuses'R'us</title>
    + </head>
    + <body>
    + <h1>Fred's exceptionally wonderful page has moved to
    + <a href="http://xyz.abc.com/foo/bar.html">Joe's</a> + site.
    + </h1>
    + </body>
    + </html> +

    + +

    注意

    +

    注意: サーバはクライアントに返されるデータに常に Date: + と Server: ヘッダを追加しますので、 + それらがファイルに書かれていてはいけません。 + サーバは Last-Modified ヘッダを追加しません。 + おそらくはそうすべきでしょうけれど。

    +
    +
    +
    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_asis.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_asis.html.ko.euc-kr new file mode 100644 index 00000000..bf003ae4 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_asis.html.ko.euc-kr @@ -0,0 +1,110 @@ + + + +mod_asis - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    ¾ÆÆÄÄ¡ ¸ðµâ mod_asis

    +
    +

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

    +
    +
    ÀÌ ¹®¼­´Â ÃÖ½ÅÆÇ ¹ø¿ªÀÌ ¾Æ´Õ´Ï´Ù. + ÃÖ±Ù¿¡ º¯°æµÈ ³»¿ëÀº ¿µ¾î ¹®¼­¸¦ Âü°íÇϼ¼¿ä.
    + + + +
    ¼³¸í:HTTP Çì´õ¸¦ Æ÷ÇÔÇÑ ÆÄÀÏÀ» º¸³½´Ù
    »óÅÂ:Base
    ¸ðµâ¸í:asis_module
    ¼Ò½ºÆÄÀÏ:mod_asis.c
    +

    ¿ä¾à

    + +

    ÀÌ ¸ðµâÀº ¾ÆÆÄÄ¡°¡ ÀϹÝÀûÀÎ HTTP Çì´õÀÇ ´ëºÎºÐÀ» Ãß°¡ÇÏÁö¾Ê°í + ¹®¼­¸¦ º¸³»µµ·Ï ¸¸µå´Â send-as-is Çڵ鷯¸¦ + Á¦°øÇÑ´Ù.

    + +

    ±×·¡¼­ ¼­¹ö´Â cgi ½ºÅ©¸³Æ®³ª nph ½ºÅ©¸³Æ®¸¦ »ç¿ëÇÏÁö¾Ê°íµµ + ¸®´ÙÀÌ·º¼Ç°ú ´Ù¸¥ Ưº°ÇÑ HTTP ÀÀ´ä µî ¾î¶² ÀÚ·áµµ º¸³¾ ¼ö + ÀÖ´Ù.

    + +

    °ú°Å¿¡ ÀÌ ¸ðµâÀº mime typeÀÌ httpd/send-as-isÀÎ + ÆÄÀϵµ ó¸®Çß´Ù.

    +
    +

    Áö½Ã¾îµé

    +

    ÀÌ ¸ðµâ¿¡´Â Áö½Ã¾î°¡ ¾ø½À´Ï´Ù.

    +

    ÁÖÁ¦

    +

    Âü°í

    +
    +
    top
    +
    +

    »ç¿ë¹ý

    + +

    ¼­¹ö ¼³Á¤ÆÄÀÏ¿¡¼­ ÆÄÀÏ°ú send-as-is Çڵ鷯¸¦ + ¿¹¸¦ µé¾î ´ÙÀ½°ú °°ÀÌ ¿¬°áÇÑ´Ù.

    + +

    AddHandler send-as-is asis

    + +

    ¾ÆÆÄÄ¡´Â .asis È®ÀåÀÚ¸¦ °¡Áø ÆÄÀÏÀÇ ³»¿ëÀ» + °ÅÀÇ ¼öÁ¤ÇÏÁö¾Ê°í Ŭ¶óÀ̾ðÆ®¿¡°Ô º¸³½´Ù. Ŭ¶óÀ̾ðÆ®´Â HTTP + Çì´õ°¡ ÇÊ¿äÇϹǷΠ»©¸ÔÁö¸¶¶ó. Status: Çì´õµµ ÇÊ¿äÇÏ´Ù. ÀÌ + Çì´õÀÇ ³»¿ëÀº ¼¼ÀÚ¸® ¼ýÀÚÀÎ HTTP ÀÀ´äÄÚµå¿Í ±× µÚÀÇ ¹®±¸ÀÌ´Ù.

    + +

    ´ÙÀ½Àº ³»¿ë ±×´ë·Î Ŭ¶óÀ̾ðÆ®¿¡°Ô ÆÄÀÏÀÌ + ¸®´ÙÀ̷¼ǵǾú´Ù°í ¾Ë¸®´Â ÆÄÀÏÀÇ ¿¹ÀÌ´Ù.

    + + +

    + Status: 301 Now where did I leave that URL
    + Location: http://xyz.abc.com/foo/bar.html
    + Content-type: text/html
    +
    + <html>
    + <head>
    + <title>Lame excuses'R'us</title>
    + </head>
    + <body>
    + <h1>Fred's exceptionally wonderful page has moved to
    + <a href="http://xyz.abc.com/foo/bar.html">Joe's</a> + site.
    + </h1>
    + </body>
    + </html> +

    + +

    ÁÖÀÇ:

    +

    ¼­¹ö´Â ÀڷḦ Ŭ¶óÀ̾ðÆ®¿¡°Ô º¸³¾¶§ Ç×»ó Date:¿Í + Server: Çì´õ¸¦ Ãß°¡ÇϹǷÎ, ÆÄÀÏ¿¡ ÀÌ Çì´õ°¡ + ÀÖÀ¸¸é ¾ÈµÈ´Ù. ¼­¹ö´Â Last-Modified Çì´õ¸¦ + Ãß°¡ÇÏÁö ¾Ê´Â´Ù. ±×·¡¼­ ¾Æ¸¶µµ ÀÌ Çì´õ´Â Æ÷ÇÔÇØ¾ß + ÇÑ´Ù.

    +
    +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_auth.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_auth.html new file mode 100644 index 00000000..47ba7fea --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_auth.html @@ -0,0 +1,9 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_auth.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: mod_auth.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_auth.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_auth.html.en new file mode 100644 index 00000000..fc3c91bb --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_auth.html.en @@ -0,0 +1,201 @@ + + + +mod_auth - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_auth

    +
    +

    Available Languages:  en  | + ja 

    +
    + + + + +
    Description:User authentication using text files
    Status:Base
    Module Identifier:auth_module
    Source File:mod_auth.c
    Compatibility:Available only in versions prior to 2.1
    +

    Summary

    + +

    This module allows the use of HTTP Basic Authentication to + restrict access by looking up users in plain text password and + group files. Similar functionality and greater scalability is + provided by mod_auth_dbm. HTTP Digest + Authentication is provided by mod_auth_digest.

    +
    + + +
    top
    +

    AuthAuthoritative Directive

    + + + + + + + + +
    Description:Sets whether authorization and authentication are +passed to lower level modules
    Syntax:AuthAuthoritative On|Off
    Default:AuthAuthoritative On
    Context:directory, .htaccess
    Override:AuthConfig
    Status:Base
    Module:mod_auth
    +

    Setting the AuthAuthoritative directive + explicitly to Off allows for both authentication and + authorization to be passed on to lower level modules (as defined in the + modules.c files) if there is no userID + or rule matching the supplied userID. If there is a + userID and/or rule specified; the usual password and access checks + will be applied and a failure will give an "Authentication Required" + reply.

    + +

    So if a userID appears in the database of more than one module; + or if a valid Require + directive applies to more than one module; then the first module + will verify the credentials; and no access is passed on; + regardless of the AuthAuthoritative setting.

    + +

    A common use for this is in conjunction with one of the + database modules; such as mod_auth_dbm, + mod_auth_msql, and mod_auth_anon. + These modules supply the bulk of the user credential checking; but + a few (administrator) related accesses fall through to a lower + level with a well protected AuthUserFile.

    + +

    By default control is not passed on and an unknown userID or + rule will result in an "Authentication Required" reply. Not setting + it thus keeps the system secure and forces an NCSA compliant + behaviour.

    + +

    Security

    +

    Do consider the implications of allowing a user to allow + fall-through in his .htaccess file; and verify that this is really + what you want; Generally it is easier to just secure a single + .htpasswd file, than it is to secure a database such as mSQL. + Make sure that the AuthUserFile and the AuthGroupFile are stored outside the document tree of + the web-server; do not put them in the directory that they + protect. Otherwise, clients will be able to download the AuthUserFile and the AuthGroupFile.

    +
    + +
    +
    top
    +

    AuthGroupFile Directive

    + + + + + + + +
    Description:Sets the name of a text file containing the list +of user groups for authentication
    Syntax:AuthGroupFile file-path
    Context:directory, .htaccess
    Override:AuthConfig
    Status:Base
    Module:mod_auth
    +

    The AuthGroupFile directive sets the + name of a textual file containing the list of user groups for user + authentication. File-path is the path to the group + file. If it is not absolute, it is treated as relative to the ServerRoot.

    + +

    Each line of the group file contains a groupname followed by a + colon, followed by the member usernames separated by spaces.

    + +

    Example:

    + mygroup: bob joe anne +

    + +

    Note that searching large text files is very + inefficient; AuthDBMGroupFile provides a much better performance.

    + +

    Security

    +

    Make sure that the AuthGroupFile is + stored outside the document tree of the web-server; do not + put it in the directory that it protects. Otherwise, clients may + be able to download the AuthGroupFile.

    +
    + +
    +
    top
    +

    AuthUserFile Directive

    + + + + + + + +
    Description:Sets the name of a text file containing the list of users and +passwords for authentication
    Syntax:AuthUserFile file-path
    Context:directory, .htaccess
    Override:AuthConfig
    Status:Base
    Module:mod_auth
    +

    The AuthUserFile directive sets the name + of a textual file containing the list of users and passwords for + user authentication. File-path is the path to the user + file. If it is not absolute (i.e., if it doesn't begin + with a slash), it is treated as relative to the ServerRoot.

    + +

    Each line of the user file contains a username followed by + a colon, followed by the encrypted password. If the same user + ID is defined multiple times, mod_auth will + use the first occurrence to verify the password.

    + +

    The utility htpasswd + which is installed as part of the binary distribution, or which + can be found in src/support, is used to maintain + this password file. See the man + page for more details. In short:

    + +

    Create a password file Filename with + username as the initial ID. It will prompt for the + password:

    + +

    + htpasswd -c Filename username +

    + +

    Add or modify username2 in the password file + Filename:

    + +

    + htpasswd Filename username2 +

    + +

    Note that searching large text files is very + inefficient; AuthDBMUserFile should be used + instead.

    + +

    Security

    +

    Make sure that the AuthUserFile is + stored outside the document tree of the web-server. Do + not put it in the directory that it protects. + Otherwise, clients may be able to download the + AuthUserFile.

    +
    + +
    +
    +
    +

    Available Languages:  en  | + ja 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_auth.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_auth.html.ja.utf8 new file mode 100644 index 00000000..59754b18 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_auth.html.ja.utf8 @@ -0,0 +1,226 @@ + + + +mod_auth - Apache HTTP サーバ + + + + + + +
    <-
    + +
    +

    Apache モジュール mod_auth

    +
    +

    Available Languages:  en  | + ja 

    +
    +
    This translation may be out of date. Check the + English version for recent changes.
    + + + + +
    説明:テキストファイルを用いたユーザ認証
    ステータス:Base
    モジュール識別子:auth_module
    ソースファイル:mod_auth.c
    互換性:2.1 より前のバージョンでのみ使用可能
    +

    概要

    + +

    プレインテキストのパスワードファイルとグループファイルを検査して + ユーザを探すことで、HTTP 基本認証でアクセス制限できるようにします。 + 似たような機能で、もっと大きなスケーラビリティを持ったものは、 + mod_auth_dbm で提供されています。 + また、HTTP ダイジェスト認証は mod_auth_digest + で提供されています。

    + +
    +

    ディレクティブ

    + +

    参照

    +
    + +
    top
    +

    AuthAuthoritative ディレクティブ

    + + + + + + + + +
    説明:認証と承認プロセスを、 +より低いレベルのモジュールに移行させるかどうかを設定する
    構文:AuthAuthoritative On|Off
    デフォルト:AuthAuthoritative On
    コンテキスト:ディレクトリ, .htaccess
    上書き:AuthConfig
    ステータス:Base
    モジュール:mod_auth
    +

    AuthAuthoritative + ディレクティブで明示的に Off に設定すると、 + 与えられた認証ユーザ ID に対してユーザ ID がない + またはルールがない場合に、 + 認証と承認の両方のプロセスが、 + より低いレベルのモジュール (Configuration と + modules.c ファイルで定義) に移行するようにできます。 + ユーザ ID がある、かつまたは、ルールが指定されている場合は、 + 通常のパスワードとアクセスチェックが適用されて、 + 認証に失敗すると "Authentication Required" 応答が返されます。

    + +

    ですから、二つ以上のモジュールのデータベースで同一の + ユーザ ID が現われたり、 + または、正しい Require + ディレクティブが二つ以上のモジュールで現われたりした場合は、 + 一つ目のモジュールが認定を行って、AuthAuthoritative + の設定に関わらず、 + アクセスは移行しません。

    + +

    一般的な使用法は、mod_auth_dbm, + mod_auth_msql, mod_auth_anon + といったデータベースモジュールの一つと組み合わせることです。 + これらのモジュールは多くのユーザ資格検査を提供してくれます。 + しかし、少数の (管理者関連の) アクセスは + AuthUserFile + で良く保護された、より低レベルに移行するようにします。

    + +

    デフォルトでは、制御は移行しません。そして、未知のユーザ ID や + ルールがあっても "Authentication Required" 応答が返されます。 + ですから、このディレクティブ設定しないことでシステムの安全を維持できて、また、 + NCSA 準拠の挙動を強制できます。

    + +

    セキュリティ

    +

    ユーザが自分自身で作成した + .htaccess ファイルで認証できるようにすることの影響を + 考慮に入れておいてください。そして、 + それが本当に希望の挙動であるかどうかを検討してください。 + 一般的に言って、mSQL といったデータベースのセキュリティ保護よりも、 + 単純に一つのファイル .htpasswd のセキュリティを保護する方が容易です。 + AuthUserFile と + AuthGroupFile は、 + ウェブサーバのドキュメントツリーの外側に保管する + ようにしてください。保護しようとしているディレクトリ以下には、 + 置かないで下さい。そうしないと + AuthUserFile と + AuthGroupFile + はダウンロードできてしまいます。

    +
    + +
    +
    top
    +

    AuthGroupFile ディレクティブ

    + + + + + + + +
    説明:認証に使用するユーザグループの一覧が格納されている、 +テキストファイルの名前を設定する
    構文:AuthGroupFile file-path
    コンテキスト:ディレクトリ, .htaccess
    上書き:AuthConfig
    ステータス:Base
    モジュール:mod_auth
    +

    AuthGroupFile ディレクティブは、 + 認証に使用するユーザグループの一覧が格納されている、 + テキストファイルの名前を設定します。 + file-path はグループファイルへのパスです。 + もし絶対パスでなければ、 + ServerRoot + からの相対パスとして扱われます。

    + +

    グループファイル各行は、グループ名、コロン、そして + スペース区切りでそのメンバーのユーザ名を記述します。

    + +

    例:

    + mygroup: bob joe anne +

    + +

    大きなファイルを探索するのは、非常に効率が悪いという点に + 注意してください。そのような場合は、 + AuthDBMGroupFile + の方がずっと良い性能を発揮します。

    + +

    セキュリティ

    +

    AuthGroupFile は、 + ウェブサーバのドキュメントツリーの外側に + 保管するようにしてください。 + 保護しようとしているディレクトリ以下には、置かないで下さい。 + そうしないと AuthGroupFile は + ダウンロードできてしまいます。

    +
    + +
    +
    top
    +

    AuthUserFile ディレクティブ

    + + + + + + + +
    説明:認証に使用するユーザとパスワードの一覧が格納されている、 +テキストファイルの名前を設定する
    構文:AuthUserFile file-path
    コンテキスト:ディレクトリ, .htaccess
    上書き:AuthConfig
    ステータス:Base
    モジュール:mod_auth
    +

    AuthUserFile ディレクティブは、 + ユーザ認証のためのユーザとパスワードの一覧を格納した + テキストファイルの名前を設定します。file-path + はユーザファイルへのパスです。 + もし絶対パスでなければ + (つまり スラッシュで始まらないパスであれば) + 、ServerRoot + からの相対パスとして扱われます。

    + +

    ユーザファイルの各行には、ユーザ名、コロン、 + 暗号化したパスワードを記述します。 + 同一ユーザ ID が複数回登録された時は、mod_auth は + パスワードの検証には最初の登録を使用します。

    + +

    バイナリ配布の一部としてインストールされるか、 + あるいは src/support にある + htpasswd + ユーティリティで、このパスワードファイルをメインテナンスします。 + 詳細は man ページをご覧頂くとして、 + 簡単には:

    + +

    初期 ID username で、Filename + というパスワードファイルを生成します。 + 次のコマンドを発行するとパスワードが要求されます:

    + +

    htpasswd -c Filename username

    + +

    パスワードファイル Filename に、username2 + を追加したり修正したりします:

    + +

    htpasswd Filename username2

    + +

    (訳注: 非常に多くのユーザを登録すると大きなファイルになりますが) + 大きなテキストファイルを検索するのは非常に効率が悪い + ということに注意してください。そのような必要のある時は、 + AuthDBMUserFile + を代わりに使ってください。

    + +

    セキュリティ

    +

    AuthUserFile + は、ウェブサーバのドキュメントツリーの外側に保管するようにしてください。 + 保護しようとしているディレクトリ以下には、置かないで下さい。 + そうしないと AuthUserFile は + ダウンロードできてしまいます。

    +
    + +
    +
    +
    +

    Available Languages:  en  | + ja 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_auth_anon.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_auth_anon.html new file mode 100644 index 00000000..6fb59568 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_auth_anon.html @@ -0,0 +1,5 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_auth_anon.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_auth_anon.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_auth_anon.html.en new file mode 100644 index 00000000..8970a060 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_auth_anon.html.en @@ -0,0 +1,240 @@ + + + +mod_auth_anon - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_auth_anon

    +
    +

    Available Languages:  en 

    +
    + + + + +
    Description:Allows "anonymous" user access to authenticated +areas
    Status:Extension
    Module Identifier:auth_anon_module
    Source File:mod_auth_anon.c
    Compatibility:Available only in versions prior to 2.1
    +

    Summary

    + +

    This module does access control in a manner similar to + anonymous-ftp sites; i.e. have a 'magic' user id + 'anonymous' and the email address as a password. These email + addresses can be logged.

    + +

    Combined with other (database) access control methods, this + allows for effective user tracking and customization according + to a user profile while still keeping the site open for + 'unregistered' users. One advantage of using Auth-based user + tracking is that, unlike magic-cookies and funny URL + pre/postfixes, it is completely browser independent and it + allows users to share URLs.

    +
    + +
    top
    +
    +

    Example

    + +

    The example below (when combined with the Auth directives of a + htpasswd-file based (or GDM, mSQL etc.) base access + control system allows users in as 'guests' with the following + properties:

    + +
      +
    • It insists that the user enters a userID. + (Anonymous_NoUserID)
    • + +
    • It insists that the user enters a password. + (Anonymous_MustGiveEmail)
    • + +
    • The password entered must be a valid email address, ie. + contain at least one '@' and a '.'. + (Anonymous_VerifyEmail)
    • + +
    • The userID must be one of anonymous guest www test + welcome and comparison is not case + sensitive. (Anonymous)
    • + +
    • And the Email addresses entered in the passwd field are + logged to the error log file. + (Anonymous_LogEmail)
    • +
    + +

    Excerpt of httpd.conf:

    + Anonymous_NoUserID off
    + Anonymous_MustGiveEmail on
    + Anonymous_VerifyEmail on
    + Anonymous_LogEmail on
    + Anonymous anonymous guest www test welcome
    +
    + AuthName "Use 'anonymous' & Email address for guest entry"
    + AuthType basic
    +
    + # An + AuthUserFile/AuthDBUserFile/AuthDBMUserFile
    + # directive must be specified, or use
    + # Anonymous_Authoritative for public access.
    + # In the .htaccess for the public directory, add:
    + <Files *>
    + + Order Deny,Allow
    + Allow from all
    +
    + Require valid-user
    +
    + </Files> +

    +
    +
    top
    +

    Anonymous Directive

    + + + + + + + +
    Description:Specifies userIDs that are allowed access without +password verification
    Syntax:Anonymous user [user] ...
    Context:directory, .htaccess
    Override:AuthConfig
    Status:Extension
    Module:mod_auth_anon
    +

    A list of one or more 'magic' userIDs which are allowed + access without password verification. The userIDs are space + separated. It is possible to use the ' and " quotes to allow a + space in a userID as well as the \ escape character.

    + +

    Please note that the comparison is + case-IN-sensitive.
    + I strongly suggest that the magic username + 'anonymous' is always one of the allowed + userIDs.

    + +

    Example:

    + Anonymous anonymous "Not Registered" "I don't know" +

    + +

    This would allow the user to enter without password + verification by using the userIDs "anonymous", + "AnonyMous", "Not Registered" and "I Don't Know".

    + +
    +
    top
    +

    Anonymous_Authoritative Directive

    + + + + + + + + +
    Description:Configures if authorization will fall-through +to other methods
    Syntax:Anonymous_Authoritative On|Off
    Default:Anonymous_Authoritative Off
    Context:directory, .htaccess
    Override:AuthConfig
    Status:Extension
    Module:mod_auth_anon
    +

    When set On, there is no fall-through to other + authentication methods. So if a userID does not match the values + specified in the Anonymous + directive, access is denied.

    + +

    Be sure you know what you are doing when you decide to + switch it on. And remember that the order in which the Authentication + modules are queried is defined in the modules.c files at compile + time.

    + +
    +
    top
    +

    Anonymous_LogEmail Directive

    + + + + + + + + +
    Description:Sets whether the password entered will be logged in the +error log
    Syntax:Anonymous_LogEmail On|Off
    Default:Anonymous_LogEmail On
    Context:directory, .htaccess
    Override:AuthConfig
    Status:Extension
    Module:mod_auth_anon
    +

    When set On, the default, the 'password' entered + (which hopefully contains a sensible email address) is logged in + the error log.

    + +
    +
    top
    +

    Anonymous_MustGiveEmail Directive

    + + + + + + + + +
    Description:Specifies whether blank passwords are allowed
    Syntax:Anonymous_MustGiveEmail On|Off
    Default:Anonymous_MustGiveEmail On
    Context:directory, .htaccess
    Override:AuthConfig
    Status:Extension
    Module:mod_auth_anon
    +

    Specifies whether the user must specify an email address as + the password. This prohibits blank passwords.

    + +
    +
    top
    +

    Anonymous_NoUserID Directive

    + + + + + + + + +
    Description:Sets whether the userID field may be empty
    Syntax:Anonymous_NoUserID On|Off
    Default:Anonymous_NoUserID Off
    Context:directory, .htaccess
    Override:AuthConfig
    Status:Extension
    Module:mod_auth_anon
    +

    When set On, users can leave the userID (and + perhaps the password field) empty. This can be very convenient for + MS-Explorer users who can just hit return or click directly on the + OK button; which seems a natural reaction.

    + +
    +
    top
    +

    Anonymous_VerifyEmail Directive

    + + + + + + + + +
    Description:Sets whether to check the password field for a correctly +formatted email address
    Syntax:Anonymous_VerifyEmail On|Off
    Default:Anonymous_VerifyEmail Off
    Context:directory, .htaccess
    Override:AuthConfig
    Status:Extension
    Module:mod_auth_anon
    +

    When set On the 'password' entered is checked for + at least one '@' and a '.' to encourage users to enter valid email + addresses (see the above Anonymous_LogEmail).

    + +
    +
    +
    +

    Available Languages:  en 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_auth_dbm.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_auth_dbm.html new file mode 100644 index 00000000..091af48f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_auth_dbm.html @@ -0,0 +1,5 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_auth_dbm.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_auth_dbm.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_auth_dbm.html.en new file mode 100644 index 00000000..b1f84790 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_auth_dbm.html.en @@ -0,0 +1,228 @@ + + + +mod_auth_dbm - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_auth_dbm

    +
    +

    Available Languages:  en 

    +
    + + + + +
    Description:Provides for user authentication using DBM + files
    Status:Extension
    Module Identifier:auth_dbm_module
    Source File:mod_auth_dbm.c
    Compatibility:Available only in versions prior to 2.1
    +

    Summary

    + +

    This module provides for HTTP Basic Authentication, where + the usernames and passwords are stored in DBM type database + files. It is an alternative to the plain text password files + provided by mod_auth.

    +
    + + +
    top
    +

    AuthDBMAuthoritative Directive

    + + + + + + + + +
    Description:Sets whether authentication and authorization will be +passed on to lower level modules
    Syntax:AuthDBMAuthoritative On|Off
    Default:AuthDBMAuthoritative On
    Context:directory, .htaccess
    Override:AuthConfig
    Status:Extension
    Module:mod_auth_dbm
    +

    Setting the AuthDBMAuthoritative + directive explicitly to Off allows for both + authentication and authorization to be passed on to lower level + modules (as defined in the modules.c files) if there + is no userID or rule matching the + supplied userID. If there is a userID and/or rule specified; the + usual password and access checks will be applied and a failure will + give an "Authentication Required" reply.

    + +

    So if a userID appears in the database of more than one module; + or if a valid Require + directive applies to more than one module; then the first module + will verify the credentials; and no access is passed on; + regardless of the AuthDBMAuthoritative + setting.

    + +

    A common use for this is in conjunction with one of the + basic auth modules; such as mod_auth. Whereas this + DBM module supplies the bulk of the user credential checking; a + few (administrator) related accesses fall through to a lower + level with a well protected .htpasswd file.

    + +

    By default, control is not passed on and an unknown userID + or rule will result in an "Authentication Required" reply. Not + setting it thus keeps the system secure and forces an NCSA + compliant behaviour.

    + +

    Security:

    +

    Do consider the implications of allowing a user to allow + fall-through in his .htaccess file; and verify that this + is really what you want; Generally it is easier to just secure + a single .htpasswd file, than it is to secure a + database which might have more access interfaces.

    +
    + +
    +
    top
    +

    AuthDBMGroupFile Directive

    + + + + + + + +
    Description:Sets the name of the database file containing the list +of user groups for authentication
    Syntax:AuthDBMGroupFile file-path
    Context:directory, .htaccess
    Override:AuthConfig
    Status:Extension
    Module:mod_auth_dbm
    +

    The AuthDBMGroupFile directive sets the + name of a DBM file containing the list of user groups for user + authentication. File-path is the absolute path to the + group file.

    + +

    The group file is keyed on the username. The value for a + user is a comma-separated list of the groups to which the users + belongs. There must be no whitespace within the value, and it + must never contain any colons.

    + +

    Security: make sure that the + AuthDBMGroupFile is stored outside the + document tree of the web-server; do not put it in the + directory that it protects. Otherwise, clients will be able to + download the AuthDBMGroupFile unless + otherwise protected.

    + +

    Combining Group and Password DBM files: In some cases it is + easier to manage a single database which contains both the + password and group details for each user. This simplifies any + support programs that need to be written: they now only have to + deal with writing to and locking a single DBM file. This can be + accomplished by first setting the group and password files to + point to the same DBM:

    + +

    + AuthDBMGroupFile /www/userbase
    + AuthDBMUserFile /www/userbase +

    + +

    The key for the single DBM is the username. The value consists + of

    + +

    + Unix Crypt-ed Password:List of Groups[:(ignored)] +

    + +

    The password section contains the encrypted password as before. + This is followed by a colon and the comma separated list of groups. + Other data may optionally be left in the DBM file after another colon; + it is ignored by the authentication module. This is what + www.telescope.org uses for its combined password and group database.

    + +
    +
    top
    +

    AuthDBMType Directive

    + + + + + + + + + +
    Description:Sets the type of database file that is used to +store passwords
    Syntax:AuthDBMType default|SDBM|GDBM|NDBM|DB
    Default:AuthDBMType default
    Context:directory, .htaccess
    Override:AuthConfig
    Status:Extension
    Module:mod_auth_dbm
    Compatibility:Available in version 2.0.30 and later.
    +

    Sets the type of database file that is used to store the passwords. + The default database type is determined at compile time. The + availability of other types of database files also depends on + compile-time settings.

    + +

    It is crucial that whatever program you use to create your password + files is configured to use the same type of database.

    + +
    +
    top
    +

    AuthDBMUserFile Directive

    + + + + + + + +
    Description:Sets thename of a database file containing the list of users and +passwords for authentication
    Syntax:AuthDBMUserFile file-path
    Context:directory, .htaccess
    Override:AuthConfig
    Status:Extension
    Module:mod_auth_dbm
    +

    The AuthDBMUserFile directive sets the + name of a DBM file containing the list of users and passwords for + user authentication. File-path is the absolute path to + the user file.

    + +

    The user file is keyed on the username. The value for a user is + the encrypted password, optionally followed by a colon and arbitrary + data. The colon and the data following it will be ignored by the + server.

    + +

    Security:

    +

    Make sure that the AuthDBMUserFile is stored + outside the document tree of the web-server; do not put it in + the directory that it protects. Otherwise, clients will be able to + download the AuthDBMUserFile.

    +
    + +

    Important compatibility note: The implementation of + "dbmopen" in the apache modules reads the string length of the + hashed values from the DBM data structures, rather than relying + upon the string being NULL-appended. Some applications, such as + the Netscape web server, rely upon the string being + NULL-appended, so if you are having trouble using DBM files + interchangeably between applications this may be a part of the + problem.

    + +

    A perl script called + dbmmanage is included with + Apache. This program can be used to create and update DBM + format password files for use with this module.

    + +
    +
    +
    +

    Available Languages:  en 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_auth_digest.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_auth_digest.html new file mode 100644 index 00000000..eeb065dd --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_auth_digest.html @@ -0,0 +1,9 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_auth_digest.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: mod_auth_digest.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_auth_digest.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_auth_digest.html.en new file mode 100644 index 00000000..245b898f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_auth_digest.html.en @@ -0,0 +1,358 @@ + + + +mod_auth_digest - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_auth_digest

    +
    +

    Available Languages:  en  | + ko 

    +
    + + + +
    Description:User authentication using MD5 + Digest Authentication.
    Status:Experimental
    Module Identifier:auth_digest_module
    Source File:mod_auth_digest.c
    +

    Summary

    + +

    This module implements HTTP Digest Authentication. However, it + has not been extensively tested and is therefore marked + experimental.

    +
    + +
    top
    +
    +

    Using Digest Authentication

    + +

    Using MD5 Digest authentication is very simple. Simply set + up authentication normally, using AuthType Digest and + AuthDigestFile instead + of the normal AuthType Basic and AuthUserFile; also, replace any AuthGroupFile with AuthDigestGroupFile. Then add a + AuthDigestDomain directive + containing at least the root URI(s) for this protection space.

    + +

    Appropriate user (text) files can be created using the + htdigest tool.

    + +

    Example:

    + <Location /private/>
    + + AuthType Digest
    + AuthName "private area"
    + AuthDigestDomain /private/ http://mirror.my.dom/private2/
    + AuthDigestFile /web/auth/.digest_pw
    + Require valid-user
    +
    + </Location> +

    + +

    Note

    +

    Digest authentication provides a more secure password system + than Basic authentication, but only works with supporting + browsers. As of November 2002, the major browsers that support digest + authentication are Opera, MS Internet + Explorer (fails when used with a query string - see "Working with MS Internet Explorer" below for a workaround), Amaya, Mozilla and Netscape since version 7. Since digest authentication is not + as widely implemented as basic authentication, you should use it only + in controlled environments.

    +
    +
    top
    +
    +

    Working with MS Internet Explorer

    +

    The Digest authentication implementation in previous Internet + Explorer for Windows versions (5 and 6) had issues, namely that + GET requests with a query string were not RFC compliant. + There are a few ways to work around this issue.

    + +

    + The first way is to use POST requests instead of + GET requests to pass data to your program. This method + is the simplest approach if your application can work with this + limitation. +

    + +

    Since version 2.0.51 Apache also provides a workaround in the + AuthDigestEnableQueryStringHack environment variable. + If AuthDigestEnableQueryStringHack is set for the + request, Apache will take steps to work around the MSIE bug and + remove the query string from the digest comparison. Using this + method would look similar to the following.

    + +

    Using Digest Authentication with MSIE:

    + BrowserMatch "MSIE" AuthDigestEnableQueryStringHack=On +

    + +

    This workaround is not necessary for MSIE 7, though enabling it does + not cause any compatibility issues or significant overhead.

    + +

    See the BrowserMatch + directive for more details on conditionally setting environment + variables

    +
    +
    top
    +

    AuthDigestAlgorithm Directive

    + + + + + + + + +
    Description:Selects the algorithm used to calculate the challenge and +response hases in digest authentication
    Syntax:AuthDigestAlgorithm MD5|MD5-sess
    Default:AuthDigestAlgorithm MD5
    Context:directory, .htaccess
    Override:AuthConfig
    Status:Experimental
    Module:mod_auth_digest
    +

    The AuthDigestAlgorithm directive + selects the algorithm used to calculate the challenge and response + hashes.

    + +
    + MD5-sess is not correctly implemented yet. +
    + + +
    +
    top
    +

    AuthDigestDomain Directive

    + + + + + + + +
    Description:URIs that are in the same protection space for digest +authentication
    Syntax:AuthDigestDomain URI [URI] ...
    Context:directory, .htaccess
    Override:AuthConfig
    Status:Experimental
    Module:mod_auth_digest
    +

    The AuthDigestDomain directive allows + you to specify one or more URIs which are in the same protection + space (i.e. use the same realm and username/password info). + The specified URIs are prefixes, i.e. the client will assume + that all URIs "below" these are also protected by the same + username/password. The URIs may be either absolute URIs (i.e. + including a scheme, host, port, etc) or relative URIs.

    + +

    This directive should always be specified and + contain at least the (set of) root URI(s) for this space. + Omitting to do so will cause the client to send the + Authorization header for every request sent to this + server. Apart from increasing the size of the request, it may + also have a detrimental effect on performance if AuthDigestNcCheck is on.

    + +

    The URIs specified can also point to different servers, in + which case clients (which understand this) will then share + username/password info across multiple servers without + prompting the user each time.

    + +
    +
    top
    +

    AuthDigestFile Directive

    + + + + + + + +
    Description:Location of the text file containing the list +of users and encoded passwords for digest authentication
    Syntax:AuthDigestFile file-path
    Context:directory, .htaccess
    Override:AuthConfig
    Status:Experimental
    Module:mod_auth_digest
    +

    The AuthDigestFile directive sets the + name of a textual file containing the list of users and encoded + passwords for digest authentication. File-path is the + absolute path to the user file.

    + +

    The digest file uses a special format. Files in this format + can be created using the htdigest utility found in + the support/ subdirectory of the Apache distribution.

    + +
    +
    top
    +

    AuthDigestGroupFile Directive

    + + + + + + + +
    Description:Name of the text file containing the list of groups +for digest authentication
    Syntax:AuthDigestGroupFile file-path
    Context:directory, .htaccess
    Override:AuthConfig
    Status:Experimental
    Module:mod_auth_digest
    +

    The AuthDigestGroupFile directive sets + the name of a textual file containing the list of groups and their + members (user names). File-path is the absolute path to + the group file.

    + +

    Each line of the group file contains a groupname followed by + a colon, followed by the member usernames separated by spaces. + Example:

    + +

    mygroup: bob joe anne

    + +

    Note that searching large text files is very + inefficient.

    + +

    Security:

    +

    Make sure that the AuthGroupFile is stored + outside the document tree of the web-server; do not put it in + the directory that it protects. Otherwise, clients may be able + to download the AuthGroupFile.

    +
    + +
    +
    top
    +

    AuthDigestNcCheck Directive

    + + + + + + + +
    Description:Enables or disables checking of the nonce-count sent by the +server
    Syntax:AuthDigestNcCheck On|Off
    Default:AuthDigestNcCheck Off
    Context:server config
    Status:Experimental
    Module:mod_auth_digest
    +
    + Not implemented yet. +
    + + +
    +
    top
    +

    AuthDigestNonceFormat Directive

    + + + + + + + +
    Description:Determines how the nonce is generated
    Syntax:AuthDigestNonceFormat format
    Context:directory, .htaccess
    Override:AuthConfig
    Status:Experimental
    Module:mod_auth_digest
    +
    Not implemented yet.
    + + +
    +
    top
    +

    AuthDigestNonceLifetime Directive

    + + + + + + + + +
    Description:How long the server nonce is valid
    Syntax:AuthDigestNonceLifetime seconds
    Default:AuthDigestNonceLifetime 300
    Context:directory, .htaccess
    Override:AuthConfig
    Status:Experimental
    Module:mod_auth_digest
    +

    The AuthDigestNonceLifetime directive + controls how long the server nonce is valid. When the client + contacts the server using an expired nonce the server will send + back a 401 with stale=true. If seconds is + greater than 0 then it specifies the amount of time for which the + nonce is valid; this should probably never be set to less than 10 + seconds. If seconds is less than 0 then the nonce never + expires. +

    + +
    +
    top
    +

    AuthDigestQop Directive

    + + + + + + + + +
    Description:Determines the quality-of-protection to use in digest +authentication
    Syntax:AuthDigestQop none|auth|auth-int [auth|auth-int]
    Default:AuthDigestQop auth
    Context:directory, .htaccess
    Override:AuthConfig
    Status:Experimental
    Module:mod_auth_digest
    +

    The AuthDigestQop directive determines + the quality-of-protection to use. auth will only do + authentication (username/password); auth-int is + authentication plus integrity checking (an MD5 hash of the entity + is also computed and checked); none will cause the module + to use the old RFC-2069 digest algorithm (which does not include + integrity checking). Both auth and auth-int may + be specified, in which the case the browser will choose which of + these to use. none should only be used if the browser for + some reason does not like the challenge it receives otherwise.

    + +
    + auth-int is not implemented yet. +
    + +
    +
    top
    +

    AuthDigestShmemSize Directive

    + + + + + + + +
    Description:The amount of shared memory to allocate for keeping track +of clients
    Syntax:AuthDigestShmemSize size
    Default:AuthDigestShmemSize 1000
    Context:server config
    Status:Experimental
    Module:mod_auth_digest
    +

    The AuthDigestShmemSize directive defines + the amount of shared memory, that will be allocated at the server + startup for keeping track of clients. Note that the shared memory + segment cannot be set less than the space that is neccessary for + tracking at least one client. This value is dependant on your + system. If you want to find out the exact value, you may simply + set AuthDigestShmemSize to the value of + 0 and read the error message after trying to start the + server.

    + +

    The size is normally expressed in Bytes, but you + may let the number follow a K or an M to + express your value as KBytes or MBytes. For example, the following + directives are all equivalent:

    + +

    + AuthDigestShmemSize 1048576
    + AuthDigestShmemSize 1024K
    + AuthDigestShmemSize 1M +

    + +
    +
    +
    +

    Available Languages:  en  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_auth_digest.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_auth_digest.html.ko.euc-kr new file mode 100644 index 00000000..02f6994f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_auth_digest.html.ko.euc-kr @@ -0,0 +1,344 @@ + + + +mod_auth_digest - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    ¾ÆÆÄÄ¡ ¸ðµâ mod_auth_digest

    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + ko 

    +
    +
    ÀÌ ¹®¼­´Â ÃÖ½ÅÆÇ ¹ø¿ªÀÌ ¾Æ´Õ´Ï´Ù. + ÃÖ±Ù¿¡ º¯°æµÈ ³»¿ëÀº ¿µ¾î ¹®¼­¸¦ Âü°íÇϼ¼¿ä.
    + + + +
    ¼³¸í:MD5 Digest AuthenticationÀ» »ç¿ëÇÑ »ç¿ëÀÚÀÎÁõ.
    »óÅÂ:Experimental
    ¸ðµâ¸í:auth_digest_module
    ¼Ò½ºÆÄÀÏ:mod_auth_digest.c
    +

    ¿ä¾à

    + +

    ÀÌ ¸ðµâÀº HTTP Digest AuthenticationÀ» ±¸ÇöÇÑ´Ù. + ±×·¯³ª ¸¹Àº Å×½ºÆ®¸¦ °ÅÄ¡Áö ¾ÊÀº ½ÇÇèÀûÀÎ ¸ðµâÀÌ´Ù.

    +
    + +
    top
    +
    +

    Digest Authentication »ç¿ëÇϱâ

    + +

    MD5 Digest authenticationÀº ¸Å¿ì ½±°Ô »ç¿ëÇÒ ¼ö ÀÖ´Ù. + ¸ðµç AuthGroupFileÀ» + AuthDigestGroupFile·Î + º¯°æÇÏ°í, AuthType Basic°ú AuthUserFile ´ë½Å + AuthType Digest¿Í AuthDigestFileÀ» + »ç¿ëÇÏ¿© °£´ÜÈ÷ ÀÎÁõÀ» ¼³Á¤ÇÒ ¼ö ÀÖ´Ù. ±×¸®°í ÃÖ¼ÒÇÑ º¸È£ÇÏ·Á´Â + ¿µ¿ªÀÇ ±âº» URIÀ» AuthDigestDomain Áö½Ã¾î¿¡ »ç¿ëÇÑ´Ù.

    + +

    htdigest µµ±¸¸¦ + »ç¿ëÇÏ¿© »ç¿ëÀÚ (¹®ÀÚ)ÆÄÀÏÀ» ¸¸µé ¼ö ÀÖ´Ù.

    + +

    ¿¹Á¦:

    + <Location /private/>
    + + AuthType Digest
    + AuthName "private area"
    + AuthDigestDomain /private/ http://mirror.my.dom/private2/
    + AuthDigestFile /web/auth/.digest_pw
    + Require valid-user
    +
    + </Location> +

    + +

    ÁÖÀÇ

    +

    Digest authenticationÀº Basic authenticationº¸´Ù ´õ + ¾ÈÀüÇÑ ¾ÏÈ£½Ã½ºÅÛÀ» Á¦°øÇÏÁö¸¸, ºê¶ó¿ìÀú°¡ Áö¿øÇØ¾ß ÇÑ´Ù. + 2002³â 11¿ù ÇöÀç digest authenticationÀ» Áö¿øÇÏ´Â ºê¶ó¿ìÀú¿¡´Â + Opera, (ÁúÀǹ®ÀÚ¿­°ú + ÇÔ²² »ç¿ëÇÏ¸é ¾ÈµÇÁö¸¸ - ÇØ°á¹æ¹ýÀº ¾Æ·¡ "MS Internet Explorer ¹®Á¦ ÇØ°áÇϱâ"¸¦ Âü°í) MS Internet + Explorer, Amaya, Mozilla, ¹öÀü 7 ÀÌÈÄÀÇ + Netscape µîÀÌ ÀÖ´Ù. digest authenticationÀÌ basic + authentication ¸¸Å­ ³Î¸® ±¸ÇöµÇÁö ¾Ê¾Ò±â¶§¹®¿¡ ÁÖÀÇÇؼ­ + »ç¿ëÇØ¾ß ÇÑ´Ù.

    +
    +
    top
    +
    +

    MS Internet Explorer ¹®Á¦ ÇØ°áÇϱâ

    +

    ÇöÀç Internet Explorer´Â Digest authentication + »ç¿ë½Ã ÁúÀǹ®ÀÚ¿­ÀÌ ÀÖ´Â GET ¿äûÀ» RFC¿Í ´Ù¸£°Ô + ó¸®ÇÏ´Â ¹®Á¦°¡ ÀÖ´Ù. ¸î°¡Áö ¹æ¹ýÀ¸·Î ÀÌ ¹®Á¦¸¦ ÇØ°áÇÒ ¼ö + ÀÖ´Ù.

    + +

    + ù¹ø°´Â ÇÁ·Î±×·¥¿¡ ÀڷḦ ³Ñ°ÜÁÖ±âÀ§ÇØ GET + ´ë½Å POST ¿äûÀ» »ç¿ëÇÏ´Â ¹æ¹ýÀÌ´Ù. ÀÌ ¹æ¹ýÀÌ + °¡´ÉÇÏ´Ù¸é °¡Àå °£´ÜÇÑ ÇØ°áÃ¥ÀÌ´Ù. +

    + +

    ¶Ç, ¾ÆÆÄÄ¡ 2.0.51ºÎÅÍ AuthDigestEnableQueryStringHack + ȯ°æº¯¼ö¸¦ Á¦°øÇÏ¿© ¹®Á¦¸¦ ÇØ°áÇÑ´Ù. ¿äû¿¡ + AuthDigestEnableQueryStringHackÀ» ¼³Á¤Çϸé + ¾ÆÆÄÄ¡´Â MSIE ¹ö±×¸¦ ÇÇÇØ°¥ Á¶Ä¡¸¦ ÃëÇÏ°í ¿äû URI¸¦ digest + ºñ±³¿¡¼­ Á¦¿ÜÇÑ´Ù. ÀÌ ¹æ¹ýÀº ´ÙÀ½°ú °°ÀÌ »ç¿ëÇÑ´Ù.

    + +

    MSIE¿¡¼­ Digest Authentication »ç¿ëÇϱâ:

    + BrowserMatch "MSIE" AuthDigestEnableQueryStringHack=On +

    + +

    ¼±ÅÃÀûÀΠȯ°æº¯¼ö ¼³Á¤¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº BrowserMatch Áö½Ã¾î¸¦ + Âü°íÇ϶ó.

    +
    +
    top
    +

    AuthDigestAlgorithm Áö½Ã¾î

    + + + + + + + + +
    ¼³¸í:digest authentication¿¡¼­ challenge¿Í response +hash¸¦ °è»êÇÏ´Â ¾Ë°í¸®ÁòÀ» ¼±ÅÃÇÑ´Ù
    ¹®¹ý:AuthDigestAlgorithm MD5|MD5-sess
    ±âº»°ª:AuthDigestAlgorithm MD5
    »ç¿ëÀå¼Ò:directory, .htaccess
    Override ¿É¼Ç:AuthConfig
    »óÅÂ:Experimental
    ¸ðµâ:mod_auth_digest
    +

    AuthDigestAlgorithm Áö½Ã¾î´Â + challenge¿Í response hash¸¦ °è»êÇÏ´Â ¾Ë°í¸®ÁòÀ» ¼±ÅÃÇÑ´Ù.

    + +
    + MD5-sess´Â ¾ÆÁ÷ ¿ÏÀüÈ÷ ±¸ÇöµÇÁö ¾Ê¾Ò´Ù. +
    + + +
    +
    top
    +

    AuthDigestDomain Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:digest authentication¿¡¼­ °°Àº º¸È£¿µ¿ª¿¡ ¼ÓÇÏ´Â +URIµé
    ¹®¹ý:AuthDigestDomain URI [URI] ...
    »ç¿ëÀå¼Ò:directory, .htaccess
    Override ¿É¼Ç:AuthConfig
    »óÅÂ:Experimental
    ¸ðµâ:mod_auth_digest
    +

    AuthDigestDomain Áö½Ã¾î´Â °°Àº + º¸È£¿µ¿ª¿¡ ÀÖ´Â (¿¹¸¦ µé¾î °°Àº ¿µ¿ª°ú »ç¿ëÀÚ¸í/¾ÏÈ£ + Á¤º¸¸¦ »ç¿ëÇÏ´Â) URIµéÀ» ÁöÁ¤ÇÑ´Ù. ÁöÁ¤ÇÑ URI´Â Á¢µÎ»ç·Î + »ç¿ëÇÑ´Ù. Áï, Ŭ¶óÀ̾ðÆ®´Â URI "¾Æ·¡" ¸ðµÎ¸¦ + °°Àº »ç¿ëÀÚ¸í/¾ÏÈ£·Î º¸È£ÇÑ´Ù°í °¡Á¤ÇÑ´Ù. URI´Â + (Áï, ½ºÅ´(scheme), È£½ºÆ®, Æ÷Æ® µîÀ» Æ÷ÇÔÇÏ´Â) + Àý´ë URLÀ̰ųª »ó´ë URIÀÌ´Ù.

    + +

    ÀÌ Áö½Ã¾î´Â Ç×»ó ÁöÁ¤ÇØ¾ß Çϸç, ÃÖ¼ÒÇÑ ¿µ¿ªµéÀÇ + ±âº» URI(µé)¸¦ Æ÷ÇÔÇØ¾ß ÇÑ´Ù. »ý·«Çϸé Ŭ¶óÀ̾ðÆ®´Â + ÀÌ ¼­¹ö·Î º¸³»´Â ¸ðµç ¿äû¿¡ Authorization Çì´õ¸¦ + Æ÷ÇÔÇÑ´Ù. ±×·¯¸é ¿äûÀÇ Å©±â°¡ Ä¿Áö¸ç, AuthDigestNcCheck¸¦ + »ç¿ëÇÑ´Ù¸é ¼º´É¿¡ ³ª»Û ¿µÇâÀ» ÁÙ ¼ö ÀÖ´Ù.

    + +

    ´Ù¸¥ ¼­¹öÀÇ URI¸¦ ÁöÁ¤Çϸé, (À̸¦ ÀÌÇØÇÏ´Â) Ŭ¶óÀ̾ðÆ®´Â + ¿©·¯ ¼­¹ö¸¶´Ù ¸Å¹ø »ç¿ëÀÚ¿¡°Ô ¹¯Áö¾Ê°í °°Àº »ç¿ëÀÚ¸í/¾ÏÈ£¸¦ + »ç¿ëÇÒ ¼ö ÀÖ´Ù.

    + +
    +
    top
    +

    AuthDigestFile Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:digest authentication¿¡ »ç¿ëÇÒ »ç¿ëÀÚ¸í°ú ÀÎÄÚµùµÈ +¾ÏÈ£ ¸ñ·ÏÀ» ÀúÀåÇÑ ¹®¼­ÆÄÀÏ À§Ä¡
    ¹®¹ý:AuthDigestFile file-path
    »ç¿ëÀå¼Ò:directory, .htaccess
    Override ¿É¼Ç:AuthConfig
    »óÅÂ:Experimental
    ¸ðµâ:mod_auth_digest
    +

    AuthDigestFile Áö½Ã¾î´Â digest + authentication¿¡ »ç¿ëÇÒ »ç¿ëÀÚ¸í°ú ÀÎÄÚµùµÈ ¾ÏÈ£¸¦ ÀúÀåÇÏ´Â + ¹®¼­ÆÄÀϸíÀ» ÁöÁ¤ÇÑ´Ù. File-path´Â »ç¿ëÀÚÁ¤º¸ + ÆÄÀÏÀÇ Àý´ë°æ·ÎÀÌ´Ù.

    + +

    ÀÌ ÆÄÀÏ ³»¿ëÀº Ưº°ÇÑ Çü½ÄÀÌ ÀÖ´Ù. ¾ÆÆÄÄ¡ ¹èÆ÷º»ÀÇ + support/ ÇÏÀ§µð·ºÅ丮¿¡ ÀÖ´Â htdigest µµ±¸¸¦ »ç¿ëÇÏ¿© + ÀÌ·± Çü½ÄÀÇ ÆÄÀÏÀ» ¸¸µé ¼ö ÀÖ´Ù.

    + +
    +
    top
    +

    AuthDigestGroupFile Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:digest authentication¿¡ »ç¿ëÇÒ ±×·ì ¸ñ·ÏÀ» ÀúÀåÇÑ +¹®¼­ÆÄÀϸí
    ¹®¹ý:AuthDigestGroupFile file-path
    »ç¿ëÀå¼Ò:directory, .htaccess
    Override ¿É¼Ç:AuthConfig
    »óÅÂ:Experimental
    ¸ðµâ:mod_auth_digest
    +

    AuthDigestGroupFile Áö½Ã¾î´Â ±×·ì°ú + ±×·ìÀÇ ±¸¼º¿øµé(»ç¿ëÀÚ¸í) ¸ñ·ÏÀ» ÀúÀåÇÏ´Â ¹®¼­ÆÄÀϸíÀ» ÁöÁ¤ÇÑ´Ù. + File-path´Â ±×·ìÁ¤º¸ ÆÄÀÏÀÇ Àý´ë°æ·ÎÀÌ´Ù.

    + +

    ±×·ìÆÄÀÏÀº ±×·ì¸í µÚ¿¡ ÄÝ·Ð, ±×µÚ¿¡ ±×·ì¿¡ ¼ÓÇÑ »ç¿ëÀÚ¸íµéÀ» + °ø¹éÀ¸·Î ±¸ºÐÇÏ¿© ÇÑ ÁÙ·Î ±â·ÏÇÑ´Ù. ¿¹¸¦ µé¾î ´ÙÀ½°ú °°´Ù.

    + +

    mygroup: bob joe anne

    + +

    Å« ¹®ÀÚÆÄÀÏÀ» °Ë»öÇÏ´Â °ÍÀÌ ¸Å¿ì ºñÈ¿À²ÀûÀÓÀ» + ¸í½ÉÇ϶ó.

    + +

    º¸¾È:

    +

    AuthGroupFileÀ» À¥¼­¹ö ¹®¼­µé ¹Û¿¡ + ÀúÀåÇØ¾ß ÇÑ´Ù. ±×·ìÆÄÀÏÀÌ º¸È£ÇÏ´Â µð·ºÅ丮 ¾È¿¡ ±×·ìÆÄÀÏÀ» + µÎÁö ¸¶¶ó. ±×·¸Áö ¾ÊÀ¸¸é Ŭ¶óÀ̾ðÆ®°¡ + AuthGroupFileÀ» ´Ù¿î¹ÞÀ» ¼öµµ ÀÖ´Ù.

    +
    + +
    +
    top
    +

    AuthDigestNcCheck Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:¼­¹ö°¡ º¸³»´Â nonce-count¸¦ °Ë»çÇÒÁö ¿©ºÎ
    ¹®¹ý:AuthDigestNcCheck On|Off
    ±âº»°ª:AuthDigestNcCheck Off
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤
    »óÅÂ:Experimental
    ¸ðµâ:mod_auth_digest
    +
    + ¾ÆÁ÷ ±¸ÇöµÇÁö ¾Ê¾Ò´Ù. +
    + + +
    +
    top
    +

    AuthDigestNonceFormat Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:nonce¸¦ ¸¸µå´Â ¹æ¹ýÀ» °áÁ¤ÇÑ´Ù
    ¹®¹ý:AuthDigestNonceFormat format
    »ç¿ëÀå¼Ò:directory, .htaccess
    Override ¿É¼Ç:AuthConfig
    »óÅÂ:Experimental
    ¸ðµâ:mod_auth_digest
    +
    ¾ÆÁ÷ ±¸ÇöµÇÁö ¾Ê¾Ò´Ù.
    + + +
    +
    top
    +

    AuthDigestNonceLifetime Áö½Ã¾î

    + + + + + + + + +
    ¼³¸í:¼­¹ö nonce°¡ À¯È¿ÇÑ ±â°£
    ¹®¹ý:AuthDigestNonceLifetime seconds
    ±âº»°ª:AuthDigestNonceLifetime 300
    »ç¿ëÀå¼Ò:directory, .htaccess
    Override ¿É¼Ç:AuthConfig
    »óÅÂ:Experimental
    ¸ðµâ:mod_auth_digest
    +

    AuthDigestNonceLifetime Áö½Ã¾î´Â + ¼­¹ö nonce°¡ À¯È¿ÇÑ ±â°£À» Á¶ÀýÇÑ´Ù. Ŭ¶óÀ̾ðÆ®°¡ ¸¸±âµÈ + nonce¸¦ °¡Áö°í ¼­¹ö¿¡ Á¢±ÙÇÏ¸é ¼­¹ö´Â stale=true¿Í + ÇÔ²² 401À» ¹ÝȯÇÑ´Ù. seconds°¡ 0º¸´Ù Å©¸é nonce°¡ + À¯È¿ÇÑ ±â°£À» ÁöÁ¤ÇÑ´Ù. ¾Æ¸¶µµ 10 Ãʺ¸´Ù ÀÛ°Ô ¼³Á¤ÇÏ¸é ¾ÈµÈ´Ù. + seconds°¡ 0º¸´Ù ÀÛÀ¸¸é nonce´Â ¿µ¿øÈ÷ ¸¸±âµÇÁö + ¾Ê´Â´Ù. +

    + +
    +
    top
    +

    AuthDigestQop Áö½Ã¾î

    + + + + + + + + +
    ¼³¸í:digest authentication°¡ »ç¿ëÇÒ +º¸È£¼öÁØ(quality-of-protection)À» ÁöÁ¤ÇÑ´Ù.
    ¹®¹ý:AuthDigestQop none|auth|auth-int [auth|auth-int]
    ±âº»°ª:AuthDigestQop auth
    »ç¿ëÀå¼Ò:directory, .htaccess
    Override ¿É¼Ç:AuthConfig
    »óÅÂ:Experimental
    ¸ðµâ:mod_auth_digest
    +

    AuthDigestQop Áö½Ã¾î´Â + º¸È£¼öÁØ(quality-of-protection)À» ÁöÁ¤ÇÑ´Ù. + auth´Â (»ç¿ëÀÚ¸í/¾ÏÈ£) ÀÎÁõ¸¸ ÇÏ°í, + auth-int´Â ÀÎÁõ°ú ¿Ï°á¼º °Ë»ç¸¦ (MD5 Çؽ¬µµ + °è»êÇÏ¿© °Ë»çÇÑ´Ù) ÇÑ´Ù. noneÀº (¿Ï°á¼º °Ë»ç¸¦ + ÇÏÁö¾Ê´Â) ¿À·¡µÈ RFC-2069 digest ¾Ë°í¸®ÁòÀ» »ç¿ëÇÑ´Ù. + auth¿Í auth-int¸¦ ¸ðµÎ ÁöÁ¤ÇÒ + ¼ö ÀÖ´Ù. ÀÌ °æ¿ì ºê¶ó¿ìÀú´Â ¾î¶² °ÍÀ» »ç¿ëÇÒÁö ¼±ÅÃÇÑ´Ù. + ºê¶ó¿ìÀú°¡ ¾î´ø ÀÌÀ¯¿¡¼­°Ç challenge¸¦ ÁÁ¾ÆÇÏÁö ¾Ê´Â´Ù¸é + noneÀ» »ç¿ëÇØ¾ß ÇÑ´Ù.

    + +
    + auth-int´Â ¾ÆÁ÷ ±¸ÇöµÇÁö ¾Ê¾Ò´Ù. +
    + +
    +
    top
    +

    AuthDigestShmemSize Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:Ŭ¶óÀ̾ðÆ®¸¦ ÃßÀûÇϱâÀ§ÇØ ÇÒ´çÇÏ´Â °øÀ¯¸Þ¸ð¸®·®
    ¹®¹ý:AuthDigestShmemSize size
    ±âº»°ª:AuthDigestShmemSize 1000
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤
    »óÅÂ:Experimental
    ¸ðµâ:mod_auth_digest
    +

    AuthDigestShmemSize Áö½Ã¾î´Â + Ŭ¶óÀ̾ðÆ®¸¦ ÃßÀûÇϱâÀ§ÇØ ¼­¹ö°¡ ½ÃÀÛÇÒ¶§ ÇÒ´çÇÏ´Â + °øÀ¯¸Þ¸ð¸®·®À» Á¤ÀÇÇÑ´Ù. °øÀ¯¸Þ¸ð¸®´Â ÃÖ¼ÒÇÑ ÇϳªÀÇ + Ŭ¶óÀ̾ðÆ®¸¦ ÃßÀûÇϱâÀ§ÇØ ÇÊ¿äÇÑ °ø°£º¸´Ù ÀÛÀ» ¼ö ¾øÀ½À» + ÁÖÀÇÇ϶ó. ÀÌ °ªÀº ½Ã½ºÅÛ¿¡ µû¶ó ´Ù¸£´Ù. Á¤È®ÇÑ °ªÀ» ¾Ë·Á¸é + AuthDigestShmemSize¸¦ 0À¸·Î + ¼³Á¤ÇÏ°í ¼­¹ö¸¦ ½ÃÀÛÇÑÈÄ ¿À·ù¹®À» Âü°íÇ϶ó.

    + +

    size´Â º¸Åë ¹ÙÀÌÆ® ´ÜÀ§ÀÌÁö¸¸, µÚ¿¡ + K³ª MÀ» »ç¿ëÇÏ¿© KBytes³ª MBytes¸¦ + ³ªÅ¸³¾ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î, ´ÙÀ½ Áö½Ã¾îµéÀº ¸ðµÎ °°´Ù:

    + +

    + AuthDigestShmemSize 1048576
    + AuthDigestShmemSize 1024K
    + AuthDigestShmemSize 1M +

    + +
    +
    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_auth_ldap.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_auth_ldap.html new file mode 100644 index 00000000..da9f2249 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_auth_ldap.html @@ -0,0 +1,5 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_auth_ldap.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_auth_ldap.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_auth_ldap.html.en new file mode 100644 index 00000000..6c99dcc4 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_auth_ldap.html.en @@ -0,0 +1,891 @@ + + + +mod_auth_ldap - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_auth_ldap

    +
    +

    Available Languages:  en 

    +
    + + + + +
    Description:Allows an LDAP directory to be used to store the database +for HTTP Basic authentication.
    Status:Experimental
    Module Identifier:auth_ldap_module
    Source File:mod_auth_ldap.c
    Compatibility:Available in version 2.0.41 and later
    +

    Summary

    + +

    mod_auth_ldap supports the following features:

    + +
      +
    • Known to support the OpenLDAP SDK (both 1.x + and 2.x), + Novell LDAP SDK and the iPlanet + (Netscape) SDK.
    • + +
    • Complex authorization policies can be implemented by + representing the policy with LDAP filters.
    • + +
    • Support for Microsoft FrontPage allows FrontPage users to + control access to their webs, while retaining LDAP for user + authentication.
    • + +
    • Uses extensive caching of LDAP operations via mod_ldap.
    • + +
    • Support for LDAP over SSL (requires the Netscape SDK) or + TLS (requires the OpenLDAP 2.x SDK or Novell LDAP SDK).
    • +
    +
    + +
    top
    +
    top
    +
    +

    Operation

    + +

    There are two phases in granting access to a user. The first + phase is authentication, in which mod_auth_ldap + verifies that the user's credentials are valid. This also called + the search/bind phase. The second phase is + authorization, in which mod_auth_ldap determines + if the authenticated user is allowed access to the resource in + question. This is also known as the compare + phase.

    + +

    The Authentication + Phase

    + +

    During the authentication phase, mod_auth_ldap + searches for an entry in the directory that matches the username + that the HTTP client passes. If a single unique match is found, + then mod_auth_ldap attempts to bind to the + directory server using the DN of the entry plus the password + provided by the HTTP client. Because it does a search, then a + bind, it is often referred to as the search/bind phase. Here are + the steps taken during the search/bind phase.

    + +
      +
    1. Generate a search filter by combining the attribute and + filter provided in the AuthLDAPURL directive with + the username passed by the HTTP client.
    2. + +
    3. Search the directory using the generated filter. If the + search does not return exactly one entry, deny or decline + access.
    4. + +
    5. Fetch the distinguished name of the entry retrieved from + the search and attempt to bind to the LDAP server using the + DN and the password passed by the HTTP client. If the bind is + unsuccessful, deny or decline access.
    6. +
    + +

    The following directives are used during the search/bind + phase

    + + + + + + + + + + + + + + + + + + + + +
    AuthLDAPURLSpecifies the LDAP server, the + base DN, the attribute to use in the search, as well as the + extra search filter to use.
    AuthLDAPBindDNAn optional DN to bind with + during the search phase.
    AuthLDAPBindPasswordAn optional password to bind + with during the search phase.
    + + +

    The Authorization + Phase

    + +

    During the authorization phase, mod_auth_ldap + attempts to determine if the user is authorized to access the + resource. Many of these checks require + mod_auth_ldap to do a compare operation on the + LDAP server. This is why this phase is often referred to as the + compare phase. mod_auth_ldap accepts the + following Require + directives to determine if the credentials are acceptable:

    + +
      +
    • Grant access if there is a Require + valid-user directive.
    • + +
    • Grant access if there is a Require user directive, and the + username in the directive matches the username passed by the + client.
    • + +
    • Grant access if there is a Require + dn directive, and the DN in the directive matches + the DN fetched from the LDAP directory.
    • + +
    • Grant access if there is a Require group directive, and + the DN fetched from the LDAP directory (or the username + passed by the client) occurs in the LDAP group.
    • + +
    • Grant access if there is a + Require ldap-attribute + directive, and the attribute fetched from the LDAP directory + matches the given value.
    • + +
    • otherwise, deny or decline access
    • +
    + +

    mod_auth_ldap uses the following directives during the + compare phase:

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AuthLDAPURL The attribute specified in the + URL is used in compare operations for the Require + user operation.
    AuthLDAPCompareDNOnServerDetermines the behavior of the + Require dn directive.
    AuthLDAPGroupAttributeDetermines the attribute to + use for comparisons in the Require group + directive.
    AuthLDAPGroupAttributeIsDNSpecifies whether to use the + user DN or the username when doing comparisons for the + Require group directive.
    + +
    top
    +
    +

    The Require Directives

    + +

    Apache's Require + directives are used during the authorization phase to ensure that + a user is allowed to access a resource.

    + +

    Require + valid-user

    + +

    If this directive exists, mod_auth_ldap grants + access to any user that has successfully authenticated during the + search/bind phase.

    + + +

    Require user

    + +

    The Require user directive specifies what + usernames can access the resource. Once + mod_auth_ldap has retrieved a unique DN from the + directory, it does an LDAP compare operation using the username + specified in the Require user to see if that username + is part of the just-fetched LDAP entry. Multiple users can be + granted access by putting multiple usernames on the line, + separated with spaces. If a username has a space in it, then it + must be surrounded with double quotes. Multiple users can also be + granted access by using multiple Require user + directives, with one user per line. For example, with a AuthLDAPURL of + ldap://ldap/o=Airius?cn (i.e., cn is + used for searches), the following Require directives could be used + to restrict access:

    +

    +Require user "Barbara Jenson"
    +Require user "Fred User"
    +Require user "Joe Manager"
    +

    + +

    Because of the way that mod_auth_ldap handles this + directive, Barbara Jenson could sign on as Barbara + Jenson, Babs Jenson or any other cn that + she has in her LDAP entry. Only the single Require + user line is needed to support all values of the attribute + in the user's entry.

    + +

    If the uid attribute was used instead of the + cn attribute in the URL above, the above three lines + could be condensed to

    +

    Require user bjenson fuser jmanager

    + + +

    Require group

    + +

    This directive specifies an LDAP group whose members are + allowed access. It takes the distinguished name of the LDAP + group. Note: Do not surround the group name with quotes. + For example, assume that the following entry existed in + the LDAP directory:

    +

    +dn: cn=Administrators, o=Airius
    +objectClass: groupOfUniqueNames
    +uniqueMember: cn=Barbara Jenson, o=Airius
    +uniqueMember: cn=Fred User, o=Airius
    +

    + +

    The following directive would grant access to both Fred and + Barbara:

    +

    Require group cn=Administrators, o=Airius

    + +

    Behavior of this directive is modified by the AuthLDAPGroupAttribute and + AuthLDAPGroupAttributeIsDN + directives.

    + + +

    Require dn

    + +

    The Require dn directive allows the administrator + to grant access based on distinguished names. It specifies a DN + that must match for access to be granted. If the distinguished + name that was retrieved from the directory server matches the + distinguished name in the Require dn, then + authorization is granted. Note: do not surround the distinguished + name with quotes.

    + +

    The following directive would grant access to a specific + DN:

    +

    Require dn cn=Barbara Jenson, o=Airius

    + +

    Behavior of this directive is modified by the AuthLDAPCompareDNOnServer + directive.

    + + +

    Require ldap-attribute

    + +

    The Require ldap-attribute directive allows the + administrator to grant access based on attributes of the authenticated + user in the LDAP directory. If the attribute in the directory + matches the value given in the configuration, access is granted.

    + +

    The following directive would grant access to anyone with + the attribute employeeType = active

    + +

    Require ldap-attribute employeeType=active

    + +

    Multiple attribute/value pairs can be specified on the same line + separated by spaces or they can be specified in multiple + Require ldap-attribute directives. The effect of listing + multiple attribute/values pairs is an OR operation. Access will be + granted if any of the listed attribute values match the value of a + corresponding attribute in the user object. If the value of the + attribute contains a space, only the value must be within double quotes.

    + +

    The following directive would grant access to anyone with + the city attribute equal to "San Jose" or status equal to "Active"

    + +

    Require ldap-attribute city="San Jose" status=active

    + + +
    top
    +
    +

    Examples

    + +
      +
    • + Grant access to anyone who exists in the LDAP directory, + using their UID for searches. + +

      + AuthLDAPURL "ldap://ldap1.airius.com:389/ou=People, o=Airius?uid?sub?(objectClass=*)"
      + Require valid-user +

      +
    • + +
    • + The next example is the same as above; but with the fields + that have useful defaults omitted. Also, note the use of a + redundant LDAP server. +

      AuthLDAPURL "ldap://ldap1.airius.com ldap2.airius.com/ou=People, o=Airius"
      +Require valid-user +

      +
    • + +
    • + The next example is similar to the previous one, but is + uses the common name instead of the UID. Note that this + could be problematical if multiple people in the directory + share the same cn, because a search on cn + must return exactly one entry. That's why + this approach is not recommended: it's a better idea to + choose an attribute that is guaranteed unique in your + directory, such as uid. +

      +AuthLDAPURL "ldap://ldap.airius.com/ou=People, o=Airius?cn"
      +Require valid-user +

      +
    • + +
    • + Grant access to anybody in the Administrators group. The + users must authenticate using their UID. +

      +AuthLDAPURL ldap://ldap.airius.com/o=Airius?uid
      +Require group cn=Administrators, o=Airius +

      +
    • + +
    • + The next example assumes that everyone at Airius who + carries an alphanumeric pager will have an LDAP attribute + of qpagePagerID. The example will grant access + only to people (authenticated via their UID) who have + alphanumeric pagers: +

      +AuthLDAPURL ldap://ldap.airius.com/o=Airius?uid??(qpagePagerID=*)
      +Require valid-user +

      +
    • + +
    • +

      The next example demonstrates the power of using filters + to accomplish complicated administrative requirements. + Without filters, it would have been necessary to create a + new LDAP group and ensure that the group's members remain + synchronized with the pager users. This becomes trivial + with filters. The goal is to grant access to anyone who has + a filter, plus grant access to Joe Manager, who doesn't + have a pager, but does need to access the same + resource:

      +

      +AuthLDAPURL ldap://ldap.airius.com/o=Airius?uid??(|(qpagePagerID=*)(uid=jmanager))
      +Require valid-user +

      + +

      This last may look confusing at first, so it helps to + evaluate what the search filter will look like based on who + connects, as shown below. The text in blue is the part that + is filled in using the attribute specified in the URL. The + text in red is the part that is filled in using the filter + specified in the URL. The text in green is filled in using + the information that is retrieved from the HTTP client. If + Fred User connects as fuser, the filter would look + like

      + +

      (&(|(qpagePagerID=*)(uid=jmanager))(uid=fuser))

      + +

      The above search will only succeed if fuser has a + pager. When Joe Manager connects as jmanager, the + filter looks like

      + +

      (&(|(qpagePagerID=*)(uid=jmanager))(uid=jmanager))

      + +

      The above search will succeed whether jmanager + has a pager or not.

      +
    • +
    +
    top
    +
    +

    Using TLS

    + +

    To use TLS, see the mod_ldap directives LDAPTrustedCA and LDAPTrustedCAType.

    +
    top
    +
    +

    Using SSL

    + +

    To use SSL, see the mod_ldap directives LDAPTrustedCA and LDAPTrustedCAType.

    + +

    To specify a secure LDAP server, use ldaps:// in the + AuthLDAPURL + directive, instead of ldap://.

    +
    top
    +
    +

    Using Microsoft + FrontPage with mod_auth_ldap

    + +

    Normally, FrontPage uses FrontPage-web-specific user/group + files (i.e., the mod_auth module) to handle all + authentication. Unfortunately, it is not possible to just + change to LDAP authentication by adding the proper directives, + because it will break the Permissions forms in + the FrontPage client, which attempt to modify the standard + text-based authorization files.

    + +

    Once a FrontPage web has been created, adding LDAP + authentication to it is a matter of adding the following + directives to every .htaccess file + that gets created in the web

    +
    +AuthLDAPURL            "the url"
    +AuthLDAPAuthoritative  off
    +AuthLDAPFrontPageHack  on
    +
    + +

    AuthLDAPAuthoritative must be + off to allow mod_auth_ldap to decline group + authentication so that Apache will fall back to file + authentication for checking group membership. This allows the + FrontPage-managed group file to be used.

    + +

    How It Works

    + +

    FrontPage restricts access to a web by adding the Require + valid-user directive to the .htaccess + files. If AuthLDAPFrontPageHack is not + on, the Require valid-user directive will succeed for + any user who is valid as far as LDAP is + concerned. This means that anybody who has an entry in + the LDAP directory is considered a valid user, whereas FrontPage + considers only those people in the local user file to be + valid. The purpose of the hack is to force Apache to consult the + local user file (which is managed by FrontPage) - instead of LDAP + - when handling the Require valid-user directive.

    + +

    Once directives have been added as specified above, + FrontPage users will be able to perform all management + operations from the FrontPage client.

    + + +

    Caveats

    + +
      +
    • When choosing the LDAP URL, the attribute to use for + authentication should be something that will also be valid + for putting into a mod_auth user file. + The user ID is ideal for this.
    • + +
    • When adding users via FrontPage, FrontPage administrators + should choose usernames that already exist in the LDAP + directory (for obvious reasons). Also, the password that the + administrator enters into the form is ignored, since Apache + will actually be authenticating against the password in the + LDAP database, and not against the password in the local user + file. This could cause confusion for web administrators.
    • + + +
    • Apache must be compiled with mod_auth in order to + use FrontPage support. This is because Apache will still use + the mod_auth group file for determine the extent of a + user's access to the FrontPage web.
    • + +
    • The directives must be put in the .htaccess + files. Attempting to put them inside <Location> or <Directory> directives won't work. This + is because mod_auth_ldap has to be able to grab + the AuthUserFile + directive that is found in FrontPage .htaccess + files so that it knows where to look for the valid user list. If + the mod_auth_ldap directives aren't in the same + .htaccess file as the FrontPage directives, then + the hack won't work, because mod_auth_ldap will + never get a chance to process the .htaccess file, + and won't be able to find the FrontPage-managed user file.
    • +
    + +
    +
    top
    +

    AuthLDAPAuthoritative Directive

    + + + + + + + + +
    Description:Prevent other authentication modules from +authenticating the user if this one fails
    Syntax:AuthLDAPAuthoritative on|off
    Default:AuthLDAPAuthoritative on
    Context:directory, .htaccess
    Override:AuthConfig
    Status:Experimental
    Module:mod_auth_ldap
    +

    Set to off if this module should let other + authentication modules attempt to authenticate the user, should + authentication with this module fail. Control is only passed on + to lower modules if there is no DN or rule that matches the + supplied user name (as passed by the client).

    + +
    +
    top
    +

    AuthLDAPBindDN Directive

    + + + + + + + +
    Description:Optional DN to use in binding to the LDAP server
    Syntax:AuthLDAPBindDN distinguished-name
    Context:directory, .htaccess
    Override:AuthConfig
    Status:Experimental
    Module:mod_auth_ldap
    +

    An optional DN used to bind to the server when searching for + entries. If not provided, mod_auth_ldap will use + an anonymous bind.

    + +
    +
    top
    +

    AuthLDAPBindPassword Directive

    + + + + + + + +
    Description:Password used in conjuction with the bind DN
    Syntax:AuthLDAPBindPassword password
    Context:directory, .htaccess
    Override:AuthConfig
    Status:Experimental
    Module:mod_auth_ldap
    +

    A bind password to use in conjunction with the bind DN. Note + that the bind password is probably sensitive data, and should be + properly protected. You should only use the AuthLDAPBindDN and AuthLDAPBindPassword if you + absolutely need them to search the directory.

    + +
    +
    top
    +

    AuthLDAPCharsetConfig Directive

    + + + + + + +
    Description:Language to charset conversion configuration file
    Syntax:AuthLDAPCharsetConfig file-path
    Context:server config
    Status:Experimental
    Module:mod_auth_ldap
    +

    The AuthLDAPCharsetConfig directive sets the location + of the language to charset conversion configuration file. File-path is relative + to the ServerRoot. This file specifies + the list of language extensions to character sets. + Most administrators use the provided charset.conv + file, which associates common language extensions to character sets.

    + +

    The file contains lines in the following format:

    + +

    + Language-Extension charset [Language-String] ... +

    + +

    The case of the extension does not matter. Blank lines, and lines + beginning with a hash character (#) are ignored.

    + +
    +
    top
    +

    AuthLDAPCompareDNOnServer Directive

    + + + + + + + + +
    Description:Use the LDAP server to compare the DNs
    Syntax:AuthLDAPCompareDNOnServer on|off
    Default:AuthLDAPCompareDNOnServer on
    Context:directory, .htaccess
    Override:AuthConfig
    Status:Experimental
    Module:mod_auth_ldap
    +

    When set, mod_auth_ldap will use the LDAP + server to compare the DNs. This is the only foolproof way to + compare DNs. mod_auth_ldap will search the + directory for the DN specified with the Require dn directive, then, + retrieve the DN and compare it with the DN retrieved from the user + entry. If this directive is not set, + mod_auth_ldap simply does a string comparison. It + is possible to get false negatives with this approach, but it is + much faster. Note the mod_ldap cache can speed up + DN comparison in most situations.

    + +
    +
    top
    +

    AuthLDAPDereferenceAliases Directive

    + + + + + + + + +
    Description:When will the module de-reference aliases
    Syntax:AuthLDAPDereferenceAliases never|searching|finding|always
    Default:AuthLDAPDereferenceAliases Always
    Context:directory, .htaccess
    Override:AuthConfig
    Status:Experimental
    Module:mod_auth_ldap
    +

    This directive specifies when mod_auth_ldap will + de-reference aliases during LDAP operations. The default is + always.

    + +
    +
    top
    +

    AuthLDAPEnabled Directive

    + + + + + + + + +
    Description:Turn on or off LDAP authentication
    Syntax: AuthLDAPEnabled on|off
    Default:AuthLDAPEnabled on
    Context:directory, .htaccess
    Override:AuthConfig
    Status:Experimental
    Module:mod_auth_ldap
    +

    Set to off to disable + mod_auth_ldap in certain directories. This is + useful if you have mod_auth_ldap enabled at or + near the top of your tree, but want to disable it completely in + certain locations.

    + +
    +
    top
    +

    AuthLDAPFrontPageHack Directive

    + + + + + + + + +
    Description:Allow LDAP authentication to work with MS FrontPage
    Syntax:AuthLDAPFrontPageHack on|off
    Default:AuthLDAPFrontPageHack off
    Context:directory, .htaccess
    Override:AuthConfig
    Status:Experimental
    Module:mod_auth_ldap
    +

    See the section on using Microsoft + FrontPage with mod_auth_ldap.

    + +
    +
    top
    +

    AuthLDAPGroupAttribute Directive

    + + + + + + + +
    Description:LDAP attributes used to check for group membership
    Syntax:AuthLDAPGroupAttribute attribute
    Context:directory, .htaccess
    Override:AuthConfig
    Status:Experimental
    Module:mod_auth_ldap
    +

    This directive specifies which LDAP attributes are used to + check for group membership. Multiple attributes can be used by + specifying this directive multiple times. If not specified, + then mod_auth_ldap uses the member and + uniquemember attributes.

    + +
    +
    top
    +

    AuthLDAPGroupAttributeIsDN Directive

    + + + + + + + + +
    Description:Use the DN of the client username when checking for +group membership
    Syntax:AuthLDAPGroupAttributeIsDN on|off
    Default:AuthLDAPGroupAttributeIsDN on
    Context:directory, .htaccess
    Override:AuthConfig
    Status:Experimental
    Module:mod_auth_ldap
    +

    When set on, this directive says to use the + distinguished name of the client username when checking for group + membership. Otherwise, the username will be used. For example, + assume that the client sent the username bjenson, + which corresponds to the LDAP DN cn=Babs Jenson, + o=Airius. If this directive is set, + mod_auth_ldap will check if the group has + cn=Babs Jenson, o=Airius as a member. If this + directive is not set, then mod_auth_ldap will + check if the group has bjenson as a member.

    + +
    +
    top
    +

    AuthLDAPRemoteUserIsDN Directive

    + + + + + + + + +
    Description:Use the DN of the client username to set the REMOTE_USER +environment variable
    Syntax:AuthLDAPRemoteUserIsDN on|off
    Default:AuthLDAPRemoteUserIsDN off
    Context:directory, .htaccess
    Override:AuthConfig
    Status:Experimental
    Module:mod_auth_ldap
    +

    If this directive is set to on, the value of the + REMOTE_USER environment variable will be set to the full + distinguished name of the authenticated user, rather than just + the username that was passed by the client. It is turned off by + default.

    + +
    +
    top
    +

    AuthLDAPUrl Directive

    + + + + + + + +
    Description:URL specifying the LDAP search parameters
    Syntax:AuthLDAPUrl url
    Context:directory, .htaccess
    Override:AuthConfig
    Status:Experimental
    Module:mod_auth_ldap
    +

    An RFC 2255 URL which specifies the LDAP search parameters + to use. The syntax of the URL is

    +

    ldap://host:port/basedn?attribute?scope?filter

    + +
    +
    ldap
    + +
    For regular ldap, use the + string ldap. For secure LDAP, use ldaps + instead. Secure LDAP is only available if Apache was linked + to an LDAP library with SSL support.
    + +
    host:port
    + +
    +

    The name/port of the ldap server (defaults to + localhost:389 for ldap, and + localhost:636 for ldaps). To + specify multiple, redundant LDAP servers, just list all + servers, separated by spaces. mod_auth_ldap + will try connecting to each server in turn, until it makes a + successful connection.

    + +

    Once a connection has been made to a server, that + connection remains active for the life of the + httpd process, or until the LDAP server goes + down.

    + +

    If the LDAP server goes down and breaks an existing + connection, mod_auth_ldap will attempt to + re-connect, starting with the primary server, and trying + each redundant server in turn. Note that this is different + than a true round-robin search.

    +
    + +
    basedn
    + +
    The DN of the branch of the + directory where all searches should start from. At the very + least, this must be the top of your directory tree, but + could also specify a subtree in the directory.
    + +
    attribute
    + +
    The attribute to search for. + Although RFC 2255 allows a comma-separated list of + attributes, only the first attribute will be used, no + matter how many are provided. If no attributes are + provided, the default is to use uid. It's a good + idea to choose an attribute that will be unique across all + entries in the subtree you will be using.
    + +
    scope
    + +
    The scope of the search. Can be either one or + sub. Note that a scope of base is + also supported by RFC 2255, but is not supported by this + module. If the scope is not provided, or if base scope + is specified, the default is to use a scope of + sub.
    + +
    filter
    + +
    A valid LDAP search filter. If + not provided, defaults to (objectClass=*), which + will search for all objects in the tree. Filters are + limited to approximately 8000 characters (the definition of + MAX_STRING_LEN in the Apache source code). This + should be than sufficient for any application.
    +
    + +

    When doing searches, the attribute, filter and username passed + by the HTTP client are combined to create a search filter that + looks like + (&(filter)(attribute=username)).

    + +

    For example, consider an URL of + ldap://ldap.airius.com/o=Airius?cn?sub?(posixid=*). When + a client attempts to connect using a username of Babs + Jenson, the resulting search filter will be + (&(posixid=*)(cn=Babs Jenson)).

    + +

    See above for examples of AuthLDAPURL URLs.

    + +
    +
    +
    +

    Available Languages:  en 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_autoindex.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_autoindex.html new file mode 100644 index 00000000..80687cd6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_autoindex.html @@ -0,0 +1,17 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_autoindex.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: mod_autoindex.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: mod_autoindex.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: mod_autoindex.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_autoindex.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_autoindex.html.en new file mode 100644 index 00000000..6aafb84b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_autoindex.html.en @@ -0,0 +1,897 @@ + + + +mod_autoindex - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_autoindex

    +
    +

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

    +
    + + + +
    Description:Generates directory indexes, + automatically, similar to the Unix ls command or the + Win32 dir shell command
    Status:Base
    Module Identifier:autoindex_module
    Source File:mod_autoindex.c
    +

    Summary

    + +

    The index of a directory can come from one of two + sources:

    + +
      +
    • A file written by the user, typically called + index.html. The DirectoryIndex directive sets the + name of this file. This is controlled by + mod_dir.
    • + +
    • Otherwise, a listing generated by the server. The other + directives control the format of this listing. The AddIcon, AddIconByEncoding and + AddIconByType are + used to set a list of icons to display for various file types; + for each file listed, the first icon listed that matches the + file is displayed. These are controlled by + mod_autoindex.
    • +
    +

    The two functions are separated so that you can completely + remove (or replace) automatic index generation should you want + to.

    + +

    Automatic index generation is enabled with using + Options +Indexes. See the + Options directive for + more details.

    + +

    If the FancyIndexing option is given with the IndexOptions directive, + the column headers are links that control the order of the + display. If you select a header link, the listing will be + regenerated, sorted by the values in that column. Selecting the + same header repeatedly toggles between ascending and descending + order. These column header links are suppressed with + IndexOptions directive's + SuppressColumnSorting option.

    + +

    Note that when the display is sorted by "Size", it's the + actual size of the files that's used, not the + displayed value - so a 1010-byte file will always be displayed + before a 1011-byte file (if in ascending order) even though + they both are shown as "1K".

    +
    + +
    top
    +
    +

    Autoindex Request Query Arguments

    + + +

    Apache 2.0.23 reorganized the Query Arguments for Column + Sorting, and introduced an entire group of new query options. + To effectively eliminate all client control over the output, + the IndexOptions + IgnoreClient option was introduced.

    + +

    The column sorting headers themselves are self-referencing + hyperlinks that add the sort query options shown below. Any + option below may be added to any request for the directory + resource.

    + +
      +
    • C=N sorts the directory by file name
    • + +
    • C=M sorts the directory by last-modified + date, then file name
    • + +
    • C=S sorts the directory by size, then file + name
    • + +
    • C=D sorts the directory by description, then + file name
    • + +
    • O=A sorts the listing in Ascending + Order
    • + +
    • O=D sorts the listing in Descending + Order
    • + +
    • F=0 formats the listing as a simple list + (not FancyIndexed)
    • + +
    • F=1 formats the listing as a FancyIndexed + list
    • + +
    • F=2 formats the listing as an + HTMLTable FancyIndexed list
    • + +
    • V=0 disables version sorting
    • + +
    • V=1 enables version sorting
    • + +
    • P=pattern lists only files matching + the given pattern
    • +
    + +

    Note that the 'P'attern query argument is tested + after the usual IndexIgnore directives are processed, + and all file names are still subjected to the same criteria as + any other autoindex listing. The Query Arguments parser in + mod_autoindex will stop abruptly when an unrecognized + option is encountered. The Query Arguments must be well formed, + according to the table above.

    + +

    The simple example below, which can be clipped and saved in + a header.html file, illustrates these query options. Note that + the unknown "X" argument, for the submit button, is listed last + to assure the arguments are all parsed before mod_autoindex + encounters the X=Go input.

    + +

    + <form action="" method="get">
    + + Show me a <select name="F">
    + + <option value="0"> Plain list</option>
    + <option value="1" selected="selected"> Fancy list</option>
    + <option value="2"> Table list</option>
    +
    + </select>
    + Sorted by <select name="C">
    + + <option value="N" selected="selected"> Name</option>
    + <option value="M"> Date Modified</option>
    + <option value="S"> Size</option>
    + <option value="D"> Description</option>
    +
    + </select>
    + <select name="O">
    + + <option value="A" selected="selected"> Ascending</option>
    + <option value="D"> Descending</option>
    +
    + </select>
    + <select name="V">
    + + <option value="0" selected="selected"> in Normal order</option>
    + <option value="1"> in Version order</option>
    +
    + </select>
    + Matching <input type="text" name="P" value="*" />
    + <input type="submit" name="X" value="Go" />
    +
    + </form> +

    + +
    +
    top
    +

    AddAlt Directive

    + + + + + + + +
    Description:Alternate text to display for a file, instead of an +icon selected by filename
    Syntax:AddAlt string file [file] ...
    Context:server config, virtual host, directory, .htaccess
    Override:Indexes
    Status:Base
    Module:mod_autoindex
    +

    AddAlt provides the alternate text to + display for a file, instead of an icon, for FancyIndexing. + File is a file extension, partial filename, wild-card + expression or full filename for files to describe. + If String contains any whitespace, you have to enclose it + in quotes (" or '). This alternate text + is displayed if the client is image-incapable, has image loading + disabled, or fails to retrieve the icon.

    + +

    Examples

    + AddAlt "PDF file" *.pdf
    + AddAlt Compressed *.gz *.zip *.Z +

    + +
    +
    top
    +

    AddAltByEncoding Directive

    + + + + + + + +
    Description:Alternate text to display for a file instead of an icon +selected by MIME-encoding
    Syntax:AddAltByEncoding string MIME-encoding +[MIME-encoding] ...
    Context:server config, virtual host, directory, .htaccess
    Override:Indexes
    Status:Base
    Module:mod_autoindex
    +

    AddAltByEncoding provides the alternate + text to display for a file, instead of an icon, for FancyIndexing. + MIME-encoding is a valid content-encoding, such as + x-compress. If String contains any whitespace, + you have to enclose it in quotes (" or '). + This alternate text is displayed if the client is image-incapable, + has image loading disabled, or fails to retrieve the icon.

    + +

    Example

    + AddAltByEncoding gzip x-gzip +

    + +
    +
    top
    +

    AddAltByType Directive

    + + + + + + + +
    Description:Alternate text to display for a file, instead of an +icon selected by MIME content-type
    Syntax:AddAltByType string MIME-type +[MIME-type] ...
    Context:server config, virtual host, directory, .htaccess
    Override:Indexes
    Status:Base
    Module:mod_autoindex
    +

    AddAltByType sets the alternate text to + display for a file, instead of an icon, for FancyIndexing. + MIME-type is a valid content-type, such as + text/html. If String contains any whitespace, + you have to enclose it in quotes (" or '). + This alternate text is displayed if the client is image-incapable, + has image loading disabled, or fails to retrieve the icon.

    + +

    Example

    + AddAltByType 'plain text' text/plain +

    + +
    +
    top
    +

    AddDescription Directive

    + + + + + + + +
    Description:Description to display for a file
    Syntax:AddDescription string file [file] ...
    Context:server config, virtual host, directory, .htaccess
    Override:Indexes
    Status:Base
    Module:mod_autoindex
    +

    This sets the description to display for a file, for + FancyIndexing. + File is a file extension, partial filename, wild-card + expression or full filename for files to describe. + String is enclosed in double quotes (").

    + +

    Example

    + AddDescription "The planet Mars" /web/pics/mars.gif +

    + +

    The typical, default description field is 23 bytes wide. 6 + more bytes are added by the IndexOptions SuppressIcon option, 7 bytes are + added by the IndexOptions SuppressSize option, and 19 bytes are + added by the IndexOptions SuppressLastModified option. + Therefore, the widest default the description column is ever + assigned is 55 bytes.

    + +

    See the DescriptionWidth IndexOptions keyword for details on overriding the size + of this column, or allowing descriptions of unlimited length.

    + +

    Caution

    +

    Descriptive text defined with AddDescription + may contain HTML markup, such as tags and character entities. If the + width of the description column should happen to truncate a tagged + element (such as cutting off the end of a bolded phrase), the + results may affect the rest of the directory listing.

    +
    + +
    +
    top
    +

    AddIcon Directive

    + + + + + + + +
    Description:Icon to display for a file selected by name
    Syntax:AddIcon icon name [name] +...
    Context:server config, virtual host, directory, .htaccess
    Override:Indexes
    Status:Base
    Module:mod_autoindex
    +

    This sets the icon to display next to a file ending in + name for FancyIndexing. Icon is either a (%-escaped) + relative URL to the icon, or of the format + (alttext,url) where alttext + is the text tag given for an icon for non-graphical browsers.

    + +

    Name is either ^^DIRECTORY^^ for directories, + ^^BLANKICON^^ for blank lines (to format the list + correctly), a file extension, a wildcard expression, a partial + filename or a complete filename.

    + +

    Examples

    + AddIcon (IMG,/icons/image.xbm) .gif .jpg .xbm
    + AddIcon /icons/dir.xbm ^^DIRECTORY^^
    + AddIcon /icons/backup.xbm *~ +

    + +

    AddIconByType + should be used in preference to AddIcon, + when possible.

    + +
    +
    top
    +

    AddIconByEncoding Directive

    + + + + + + + +
    Description:Icon to display next to files selected by MIME +content-encoding
    Syntax:AddIconByEncoding icon MIME-encoding +[MIME-encoding] ...
    Context:server config, virtual host, directory, .htaccess
    Override:Indexes
    Status:Base
    Module:mod_autoindex
    +

    This sets the icon to display next to files with FancyIndexing. + Icon is either a (%-escaped) relative URL to the icon, + or of the format (alttext,url) + where alttext is the text tag given for an icon for + non-graphical browsers.

    + +

    MIME-encoding is a wildcard expression matching + required the content-encoding.

    + +

    Example

    + AddIconByEncoding /icons/compress.xbm x-compress +

    + +
    +
    top
    +

    AddIconByType Directive

    + + + + + + + +
    Description:Icon to display next to files selected by MIME +content-type
    Syntax:AddIconByType icon MIME-type +[MIME-type] ...
    Context:server config, virtual host, directory, .htaccess
    Override:Indexes
    Status:Base
    Module:mod_autoindex
    +

    This sets the icon to display next to files of type + MIME-type for FancyIndexing. + Icon is either a (%-escaped) relative URL to the icon, + or of the format (alttext,url) + where alttext is the text tag given for an icon for + non-graphical browsers.

    + +

    MIME-type is a wildcard expression matching + required the mime types.

    + +

    Example

    + AddIconByType (IMG,/icons/image.xbm) image/* +

    + +
    +
    top
    +

    DefaultIcon Directive

    + + + + + + + +
    Description:Icon to display for files when no specific icon is +configured
    Syntax:DefaultIcon url-path
    Context:server config, virtual host, directory, .htaccess
    Override:Indexes
    Status:Base
    Module:mod_autoindex
    +

    The DefaultIcon directive sets the icon + to display for files when no specific icon is known, for FancyIndexing. + Url-path is a (%-escaped) relative URL to the icon.

    + +

    Example

    + DefaultIcon /icon/unknown.xbm +

    + +
    +
    top
    +

    HeaderName Directive

    + + + + + + + +
    Description:Name of the file that will be inserted at the top +of the index listing
    Syntax:HeaderName filename
    Context:server config, virtual host, directory, .htaccess
    Override:Indexes
    Status:Base
    Module:mod_autoindex
    +

    The HeaderName directive sets the name + of the file that will be inserted at the top of the index + listing. Filename is the name of the file to include.

    + +

    Example

    + HeaderName HEADER.html +

    + +
    +

    Both HeaderName and ReadmeName now treat + Filename as a URI path relative to the one used to + access the directory being indexed. If Filename begins + with a slash, it will be taken to be relative to the DocumentRoot.

    + +

    Example

    + HeaderName /include/HEADER.html +

    + +

    Filename must resolve to a document with a major + content type of text/* (e.g., + text/html, text/plain, etc.). This means + that filename may refer to a CGI script if the script's + actual file type (as opposed to its output) is marked as + text/html such as with a directive like:

    + +

    + AddType text/html .cgi +

    + +

    Content negotiation + will be performed if Options + MultiViews is in effect. If filename resolves + to a static text/html document (not a CGI script) and + either one of the options + Includes or IncludesNOEXEC is enabled, + the file will be processed for server-side includes (see the + mod_include documentation).

    +
    + +

    If the file specified by HeaderName contains + the beginnings of an HTML document (<html>, <head>, etc.) + then you will probably want to set IndexOptions + +SuppressHTMLPreamble, so that these tags are not + repeated.

    + +
    +
    top
    +

    IndexIgnore Directive

    + + + + + + + +
    Description:Adds to the list of files to hide when listing +a directory
    Syntax:IndexIgnore file [file] ...
    Context:server config, virtual host, directory, .htaccess
    Override:Indexes
    Status:Base
    Module:mod_autoindex
    +

    The IndexIgnore directive adds to the + list of files to hide when listing a directory. File is a + shell-style wildcard expression or full + filename. Multiple IndexIgnore directives add + to the list, rather than the replacing the list of ignored + files. By default, the list contains . (the current + directory).

    + +

    + IndexIgnore README .htaccess *.bak *~ +

    + +
    +
    top
    +

    IndexOptions Directive

    + + + + + + + +
    Description:Various configuration settings for directory +indexing
    Syntax:IndexOptions [+|-]option [[+|-]option] +...
    Context:server config, virtual host, directory, .htaccess
    Override:Indexes
    Status:Base
    Module:mod_autoindex
    +

    The IndexOptions directive specifies the + behavior of the directory indexing. Option can be one + of

    + +
    +
    Charset=character-set (Apache 2.0.61 and + later)
    + +
    The Charset keyword allows you to + specify the character set of the generated page. The + default is either ISO-8859-1 or UTF-8, + depending on whether the underlying file system is unicode + or not. + +

    Example:

    + IndexOptions Charset=UTF-8 +

    +
    + +
    Type=MIME content-type (Apache 2.0.61 and + later)
    + +
    The Type keyword allows you to + specify the MIME content-type of the generated page. The default + is text/html. + +

    Example:

    + IndexOptions Type=text/plain +

    +
    + +
    DescriptionWidth=[n | *] (Apache 2.0.23 and + later)
    + +
    The DescriptionWidth keyword allows you to + specify the width of the description column in + characters.
    + +
    -DescriptionWidth (or unset) allows + mod_autoindex to calculate the best width.
    + +
    DescriptionWidth=n fixes the column width to + n bytes wide.
    + +
    DescriptionWidth=* grows the column to the + width necessary to accommodate the longest description + string.
    + +
    See the section on AddDescription for dangers + inherent in truncating descriptions.
    + +
    FancyIndexing
    + +
    This turns on fancy indexing of directories.
    + +
    FoldersFirst (Apache + 2.0.23 and later)
    + +
    If this option is enabled, subdirectory listings will + always appear first, followed by normal files in the + directory. The listing is basically broken into two + components, the files and the subdirectories, and each is + sorted separately and then displayed subdirectories-first. + For instance, if the sort order is descending by name, and + FoldersFirst is enabled, subdirectory + Zed will be listed before subdirectory + Beta, which will be listed before normal files + Gamma and Alpha. This option + only has an effect if FancyIndexing is also enabled.
    + +
    HTMLTable (Experimental, + Apache 2.0.23 and later)
    + +
    This experimental option with FancyIndexing + constructs a simple table for the fancy directory listing. Note this + will confuse older browsers. It is particularly necessary if file + names or description text will alternate between + left-to-right and right-to-left reading order, as can happen + on WinNT or other utf-8 enabled platforms.
    + +
    IconsAreLinks
    + +
    This makes the icons part of the anchor for the filename, for + fancy indexing.
    + +
    IconHeight[=pixels]
    + +
    Presence of this option, when used with IconWidth, + will cause the server to include height and + width attributes in the img tag for the + file icon. This allows browser to precalculate the page layout + without having to wait until all the images have been loaded. If no + value is given for the option, it defaults to the standard height of + the icons supplied with the Apache software.
    + +
    IconWidth[=pixels]
    + +
    Presence of this option, when used with IconHeight, + will cause the server to include height and + width attributes in the img tag for + the file icon. This allows browser to precalculate the page + layout without having to wait until all the images have been + loaded. If no value is given for the option, it defaults to + the standard width of the icons supplied with the Apache + software.
    + +
    IgnoreCase
    + +
    If this option is enabled, names are sorted in a case-insensitive + manner. For instance, if the sort order is ascending by name, and + IgnoreCase is enabled, file Zeta will be listed after + file alfa (Note: file GAMMA will always be listed before file gamma). +
    + +
    IgnoreClient
    + +
    This option causes mod_autoindex to ignore all + query variables from the client, including sort order (implies + SuppressColumnSorting.)
    + +
    NameWidth=[n + | *]
    + +
    The NameWidth keyword allows you to specify the width + of the filename column in bytes.
    + +
    -NameWidth (or unset) allows mod_autoindex to calculate the best width.
    + +
    NameWidth=n fixes the column width to + n bytes wide.
    + +
    NameWidth=* grows the column to the necessary + width.
    + +
    ScanHTMLTitles
    + +
    This enables the extraction of the title from HTML documents + for fancy indexing. If the file does not have a description + given by AddDescription + then httpd will read the document for the value of the + title element. This is CPU and disk intensive.
    + +
    SuppressColumnSorting
    + +
    If specified, Apache will not make the column headings in a + FancyIndexed directory listing into links for sorting. The + default behavior is for them to be links; selecting the + column heading will sort the directory listing by the values + in that column. Prior to Apache 2.0.23, this also + disabled parsing the Query Arguments for the sort + string. That behavior is now controlled by IndexOptions + IgnoreClient in Apache 2.0.23.
    + +
    SuppressDescription
    + +
    This will suppress the file description in fancy indexing + listings. By default, no file descriptions are defined, and + so the use of this option will regain 23 characters of screen + space to use for something else. See AddDescription for information about setting the file + description. See also the DescriptionWidth + index option to limit the size of the description column.
    + +
    SuppressHTMLPreamble
    + +
    If the directory actually contains a file specified by the + HeaderName + directive, the module usually includes the contents of the file + after a standard HTML preamble (<html>, + <head>, et cetera). The + SuppressHTMLPreamble option disables this behaviour, + causing the module to start the display with the header file + contents. The header file must contain appropriate HTML instructions + in this case. If there is no header file, the preamble is generated + as usual.
    + +
    SuppressIcon (Apache + 2.0.23 and later)
    + +
    This will suppress the icon in fancy indexing listings. + Combining both SuppressIcon and + SuppressRules yields proper HTML 3.2 output, which + by the final specification prohibits img and + hr elements from the pre block (used to + format FancyIndexed listings.)
    + +
    SuppressLastModified
    + +
    This will suppress the display of the last modification date, + in fancy indexing listings.
    + +
    SuppressRules + (Apache 2.0.23 and later)
    + +
    This will suppress the horizontal rule lines (hr + elements) in directory listings. Combining both SuppressIcon and + SuppressRules yields proper HTML 3.2 output, which + by the final specification prohibits img and + hr elements from the pre block (used to + format FancyIndexed listings.)
    + +
    SuppressSize
    + +
    This will suppress the file size in fancy indexing listings.
    + +
    TrackModified (Apache + 2.0.23 and later)
    + +
    This returns the Last-Modified and ETag + values for the listed directory in the HTTP header. It is only valid + if the operating system and file system return appropriate stat() + results. Some Unix systems do so, as do OS2's JFS and Win32's + NTFS volumes. OS2 and Win32 FAT volumes, for example, do not. + Once this feature is enabled, the client or proxy can track + changes to the list of files when they perform a HEAD + request. Note some operating systems correctly track new and + removed files, but do not track changes for sizes or dates of + the files within the directory. Changes to the size + or date stamp of an existing file will not update the + Last-Modified header on all Unix platforms. + If this is a concern, leave this option disabled.
    + +
    VersionSort + (Apache 2.0a3 and later)
    + +
    The VersionSort keyword causes files containing + version numbers to sort in a natural way. Strings are sorted as + usual, except that substrings of digits in the name and + description are compared according to their numeric value. + +

    Example:

    + foo-1.7
    + foo-1.7.2
    + foo-1.7.12
    + foo-1.8.2
    + foo-1.8.2a
    + foo-1.12 +

    + +

    If the number starts with a zero, then it is considered to + be a fraction:

    + +

    + foo-1.001
    + foo-1.002
    + foo-1.030
    + foo-1.04 +

    +
    + +
    XHTML + (Apache 2.0.49 and later)
    + +
    The XHTML keyword forces mod_autoindex + to emit XHTML 1.0 code instead of HTML 3.2.
    +
    + + +
    Incremental IndexOptions
    +
    +

    Apache 1.3.3 introduced some significant changes in the + handling of IndexOptions directives. In + particular:

    + +
      +
    • Multiple IndexOptions directives for a + single directory are now merged together. The result of: + +

      + <Directory /foo> + + IndexOptions HTMLTable
      + IndexOptions SuppressColumnsorting +
      + </Directory> +

      + +

      will be the equivalent of

      + +

      + IndexOptions HTMLTable SuppressColumnsorting +

      +
    • + +
    • The addition of the incremental syntax (i.e., prefixing + keywords with + or -).
    • +
    + +

    Whenever a '+' or '-' prefixed keyword is encountered, it + is applied to the current IndexOptions + settings (which may have been inherited from an upper-level + directory). However, whenever an unprefixed keyword is processed, it + clears all inherited options and any incremental settings encountered + so far. Consider the following example:

    + +

    + IndexOptions +ScanHTMLTitles -IconsAreLinks FancyIndexing
    + IndexOptions +SuppressSize +

    + +

    The net effect is equivalent to IndexOptions FancyIndexing + +SuppressSize, because the unprefixed FancyIndexing + discarded the incremental keywords before it, but allowed them to + start accumulating again afterward.

    + +

    To unconditionally set the IndexOptions for + a particular directory, clearing the inherited settings, specify + keywords without any + or - prefixes.

    +
    +
    + +
    +
    top
    +

    IndexOrderDefault Directive

    + + + + + + + + +
    Description:Sets the default ordering of the directory index
    Syntax:IndexOrderDefault Ascending|Descending +Name|Date|Size|Description
    Default:IndexOrderDefault Ascending Name
    Context:server config, virtual host, directory, .htaccess
    Override:Indexes
    Status:Base
    Module:mod_autoindex
    +

    The IndexOrderDefault directive is used + in combination with the FancyIndexing index option. By default, fancyindexed + directory listings are displayed in ascending order by filename; the + IndexOrderDefault allows you to change this + initial display order.

    + +

    IndexOrderDefault takes two + arguments. The first must be either Ascending or + Descending, indicating the direction of the sort. + The second argument must be one of the keywords Name, + Date, Size, or Description, + and identifies the primary key. The secondary key is + always the ascending filename.

    + +

    You can force a directory listing to only be displayed in a + particular order by combining this directive with the SuppressColumnSorting index option; this will prevent + the client from requesting the directory listing in a different + order.

    + +
    +
    top
    +

    ReadmeName Directive

    + + + + + + + +
    Description:Name of the file that will be inserted at the end +of the index listing
    Syntax:ReadmeName filename
    Context:server config, virtual host, directory, .htaccess
    Override:Indexes
    Status:Base
    Module:mod_autoindex
    +

    The ReadmeName directive sets the name + of the file that will be appended to the end of the index + listing. Filename is the name of the file to include, and + is taken to be relative to the location being indexed. If + Filename begins with a slash, it will be taken to be + relative to the DocumentRoot. +

    + +

    Example

    + ReadmeName FOOTER.html +

    + +

    Example 2

    + ReadmeName /include/FOOTER.html +

    + +

    See also HeaderName, where this behavior is described in greater + detail.

    + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_autoindex.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_autoindex.html.ja.utf8 new file mode 100644 index 00000000..399c1a41 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_autoindex.html.ja.utf8 @@ -0,0 +1,963 @@ + + + +mod_autoindex - Apache HTTP サーバ + + + + + + +
    <-
    + +
    +

    Apache モジュール mod_autoindex

    +
    +

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

    +
    +
    This translation may be out of date. Check the + English version for recent changes.
    + + + +
    説明:Unix の ls コマンドや + Win32 の dir シェルコマンドに似た + ディレクトリインデックスを生成する
    ステータス:Base
    モジュール識別子:autoindex_module
    ソースファイル:mod_autoindex.c
    +

    概要

    + +

    ディレクトリのインデックスは二つの情報源のうちの + 一つから生成できます:

    + +
      +
    • 普通は index.html と呼ばれる + ユーザによって書かれたファイル。 + DirectoryIndex + ディレクティブでこのファイル名を設定します。 + これは mod_dir で制御されます。
    • + +
    • もしくは、サーバによって生成された一覧。 + その他のディレクティブでこの一覧の書式を制御します。 + AddIcon, AddIconByEncoding と + AddIconByType + を使うことで、様々なファイルタイプに対してアイコン一覧を + セットします。つまり、リストされたファイル毎に、 + ファイルにマッチした一番最初のアイコンが表示されます。 + これらは mod_autoindex で制御されます。
    • +
    +

    望むならば、自動インデックス生成を完全に除去 (あるいは置換) + できるように、この二つの機能は分離されています。

    + +

    自動インデックス生成は Options +Indexes + を使うことで有効になります。詳細については、 + Options + ディレクティブをご覧下さい。

    + +

    もし FancyIndexingオプションが + IndexOptions + ディレクティブに与えられているならば、 + 列の先頭は表示の順番を制御するリンクになります。 + 先頭のリンクを選択すると、一覧は再生成されて + その列の値でソートされます。 + 同じ先頭を続けて選択すると、交互に昇順と降順とになります。 + これらの列の先頭のリンクは、 + IndexOptions + ディレクティブの + SuppressColumnSorting + オプションで消すことができます。

    + +

    "Size" でソートした場合は、用いられるのは + 実際のファイルのサイズであって、 + 表示の値ではないことに注意してください - + たとえ両方ともが "1K" と表示されていたとしても、 + 1010 バイトのファイルは必ず 1011 + バイトのファイルよりも前 (昇順の場合) に表示されます。

    +
    + +
    top
    +
    +

    Autoindex リクエストクエリー引数

    + + +

    Apache 2.0.23 で、 + コラムソートのためにクエリー引数を再編成して、 + 新しいクエリーオプションのグループを導入しました。 + 出力に対するクライアントのすべての制御を効率的に抹消 + できるように、 + IndexOptions + IgnoreClient が導入されました。

    + +

    コラムソートのヘッダそれ自体が、 + 下記のソートクエリーオプションを付加する + 自分自身を参照するリンクです。 + 下記のオプションのどれでも、 + ディレクトリリソースへのリクエストに加えることができます。

    + +
      +
    • C=N は、ファイル名でソートします。
    • + +
    • C=M は、更新日時、 + ディレクトリ、ファイル名の順でソートします。
    • + +
    • C=S は、サイズ、 + ディレクトリ、ファイル名の順でソートします。
    • + +
    • C=D は、説明、 + ディレクトリ、ファイル名の順でソートします。
    • + +
    • O=A は、昇順で表をソートします。
    • + +
    • O=D は、降順で表をソートします。
    • + +
    • F=0 は、単純な表の書式にします。 + (FancyIndex ではありません。)
    • + +
    • F=1 は、FancyIndex + 表示の表の書式にします。
    • + +
    • F=2 は、表を HTML + のテーブルを使った FancyIndex の書式にします。
    • + +
    • V=0 + は、バージョンによるソートを無効にします。
    • + +
    • V=1 + は、バージョンによるソートを有効にします。
    • + +
    • P=pattern + は、与えられた pattern + に適合したファイルのみを表示します。
    • +
    + +

    "P (パターンの P)" クエリー引数は、 + 通常の IndexIgnore + ディレクティブが処理された後に検査され、 + ファイル名全てが、他の autoindex + リスト処理と同様の判定基準下に置かれ続ける + ことに注意してください。 + mod_autoindex のクエリー引数パーサ (解析) は、 + 認識不能なオプションにぶつかると即座に停止します。 + クエリー引数は上の表に従って + 正しい形式になっていなければなりません。

    + +

    下の単純な例は、これらのクエリーオプションを + 表します。これをそのまま切り取って HEADER.html + ファイルに保存することもできます。 + mod_autoindex が X=Go 入力にぶつかる前に + 引数が全て解釈されるように、 + 未知の引数 "X" はリストの最後に置かれています。

    + +

    + <form action="" method="get">
    + + Show me a <select name="F">
    + + <option value="0"> Plain list</option>
    + <option value="1" selected="selected"> Fancy list</option>
    + <option value="2"> Table list</option>
    +
    + </select>
    + Sorted by <select name="C">
    + + <option value="N" selected="selected"> Name</option>
    + <option value="M"> Date Modified</option>
    + <option value="S"> Size</option>
    + <option value="D"> Description</option>
    +
    + </select>
    + <select name="O">
    + + <option value="A" selected="selected"> Ascending</option>
    + <option value="D"> Descending</option>
    +
    + </select>
    + <select name="V">
    + + <option value="0" selected="selected"> in Normal order</option>
    + <option value="1"> in Version order</option>
    +
    + </select>
    + Matching <input type="text" name="P" value="*" />
    + <input type="submit" name="X" value="Go" />
    +
    + </form> +

    + +
    +
    top
    +

    AddAlt ディレクティブ

    + + + + + + + +
    説明:アイコンの代わりに +表示される、ファイル名で選択された代替テキスト
    構文:AddAlt string file [file] ...
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:Indexes
    ステータス:Base
    モジュール:mod_autoindex
    +

    AddAlt は、FancyIndexing + において、アイコンの代わりに表示する代替テキストを提供します。 + file は、説明するファイルのファイル拡張子、 + ファイル名の一部、ワイルドカード表現、完全なファイル名の + どれかになります。 + string に空白がある場合は引用符 (" + か ') で囲む必要があります。 + この文字列は、クライアントが画像を表示できない場合や + 画像のロードを無効にしている場合や + アイコンの取得に失敗したときに表示されます。

    + +

    例

    + AddAlt "PDF file" *.pdf
    + AddAlt Compressed *.gz *.zip *.Z +

    + +
    +
    top
    +

    AddAltByEncoding ディレクティブ

    + + + + + + + +
    説明:アイコンの代わりに表示される、MIME 符号化方法で選択された +代替テキスト
    構文:AddAltByEncoding string MIME-encoding +[MIME-encoding] ...
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:Indexes
    ステータス:Base
    モジュール:mod_autoindex
    +

    AddAltByEncoding は、 + FancyIndexing + において、アイコンの代わりに表示する代替文字列を提供します。 + MIME-encoding は有効な符号化、例えば + x-compress + です。 + string に空白があるときは、引用符 (" か + ') で囲む必要があります。 + この文字列は、クライアントが画像を表示できない場合や + 画像のロードを無効にしている場合や + アイコンの取得に失敗したときに表示されます。

    + +

    例

    + AddAltByEncoding gzip x-gzip +

    + +
    +
    top
    +

    AddAltByType ディレクティブ

    + + + + + + + +
    説明:アイコンの代わりに +表示される、MIME タイプで選択された代替テキスト
    構文:AddAltByType string MIME-type +[MIME-type] ...
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:Indexes
    ステータス:Base
    モジュール:mod_autoindex
    +

    AddAltByType は、 + FancyIndexing + において、アイコンの代わりに表示する代替文字列を設定します。 + MIME-type は有効なタイプ、例えば + text/html + です。 + string に空白があるときは、引用符 (" か + ') で囲む必要があります。 + この文字列は、クライアントが画像を表示できない場合や + 画像のロードを無効にしている場合や + アイコンの取得に失敗したときに表示されます。

    + +

    例

    + AddAltByType 'plain text' text/plain +

    + +
    +
    top
    +

    AddDescription ディレクティブ

    + + + + + + + +
    説明:ファイルに対して表示する説明
    構文:AddDescription string file [file] ...
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:Indexes
    ステータス:Base
    モジュール:mod_autoindex
    +

    FancyIndexing + において、ファイルに対して表示する説明を設定します。 + file は説明するファイルのファイル拡張子、 + ファイル名の一部、ワイルドカード表現、完全なファイル名の + どれかになります。 + string は二重引用符 (") で囲まれます。

    + +

    例

    + AddDescription "The planet Mars" /web/pics/mars.gif +

    + +

    通常のデフォルトの説明領域は 23 バイトの幅です。 + IndexOptions SuppressIcon + オプションで 6 バイト追加、 + IndexOptions SuppressSize + オプションで 7 バイト追加、 + IndexOptions SuppressLastModified + オプションで 19 バイト追加されます。 + ですから、デフォルトの説明コラムの最大幅は + 55 バイトになります。

    + +

    このコラムの大きさを上書きしたり、 + 説明が無制限長でもよいようにするための詳細に関しては、 + DescriptionWidth + という + IndexOptions + のキーワードをご覧下さい。

    + +

    警告

    +

    AddDescription + で定義された説明テキストは、タグや文字列といった + HTML マークアップを含むことができます。 + もし、説明コラムの幅によってタグ付けされた要素が丸め込まれた + (太字の語句の最後が切れるといった) 場合、 + 出力結果は、ディレクトリ一覧の残りの部分に影響を与えるでしょう。

    +
    + +
    +
    top
    +

    AddIcon ディレクティブ

    + + + + + + + +
    説明:ファイルに表示するアイコンを名前で選択
    構文:AddIcon icon name +[name] ...
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:Indexes
    ステータス:Base
    モジュール:mod_autoindex
    +

    FancyIndexing + において、 + name で終わるファイルの隣に表示するアイコンを設定します。 + icon は、(% でエスケープされた) アイコンへの相対 URL + か、他の書式 (alttext, url) です。 + ここで alttext + は、非グラフィカルブラウザ向けにアイコンに付けられたテキストタグです。 +

    + +

    name は、ディレクトリに対応する ^^DIRECTORY^^ + か、空白行に対応する ^^BLANKICON^^ (一覧が正しく表示されるために) か、 + ファイル拡張子か、ワイルドカード表現か、ファイル名の一部か + 完全なファイル名です。

    + +

    例

    + AddIcon (IMG,/icons/image.xbm) .gif .jpg .xbm
    + AddIcon /icons/dir.xbm ^^DIRECTORY^^
    + AddIcon /icons/backup.xbm *~ +

    + +

    もし可能なら、 + AddIcon + より + AddIconByType + を優先的に使うべきでしょう。

    + +
    +
    top
    +

    AddIconByEncoding ディレクティブ

    + + + + + + + +
    説明:ファイルに表示するアイコンを MIME +符号化方法で選択
    構文:AddIconByEncoding icon MIME-encoding +[MIME-encoding] ...
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:Indexes
    ステータス:Base
    モジュール:mod_autoindex
    +

    FancyIndexing + において、ファイルの隣に表示するアイコンを設定します。 + icon は、(% でエスケープされた) アイコンへの相対 URL + か、他の書式 (alttext, url) です。 + ここで alttext + は、非グラフィカルブラウザ向けにアイコンに付けられたテキストタグです。 +

    + +

    MIME-encoding は、要求されたエンコードに該当する + ワイルドカード表現です。

    + +

    例

    + AddIconByEncoding /icons/compress.xbm x-compress +

    + +
    +
    top
    +

    AddIconByType ディレクティブ

    + + + + + + + +
    説明:ファイルの隣に表示するアイコンを +MIME タイプによって選択
    構文:AddIconByType icon MIME-type +[MIME-type] ...
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:Indexes
    ステータス:Base
    モジュール:mod_autoindex
    +

    FancyIndexing + において、ファイルの隣に表示するアイコンを設定します。 + icon は、(% でエスケープされた) アイコンへの相対 URL + か、他の書式 (alttext, url) です。 + ここで alttext + は、非グラフィカルブラウザ向けにアイコンに付けられたテキストタグです。 +

    + +

    MIME-type は、要求されたタイプに該当する + ワイルドカード表現です。

    + +

    例

    + AddIconByType (IMG,/icons/image.xbm) image/* +

    + +
    +
    top
    +

    DefaultIcon ディレクティブ

    + + + + + + + +
    説明:特定のアイコンが何も設定されていない時に +ファイルに表示するアイコン
    構文:DefaultIcon url-path
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:Indexes
    ステータス:Base
    モジュール:mod_autoindex
    +

    FancyIndexing + において、 + 特定のアイコンがない場合にファイルに表示するアイコンを設定します。 + url-path は、(% でエスケープされた) アイコンへの相対 URL + です。

    + +

    例

    + DefaultIcon /icon/unknown.xbm +

    + +
    +
    top
    +

    HeaderName ディレクティブ

    + + + + + + + +
    説明: +インデックス一覧の先頭に挿入されるファイルの名前
    構文:HeaderName filename
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:Indexes
    ステータス:Base
    モジュール:mod_autoindex
    +

    HeaderName + ディレクティブは、 + インデックス一覧の先頭に挿入するファイルの名前を設定します。 + Filename は取り込むファイルの名前です。

    + +

    例

    + HeaderName HEADER.html +

    + +
    +

    HeaderName も ReadmeName + も両方とも現在は、filename + をインデックスされているディレクトリに用いられた URI + に対する相対 URI パスとして扱います。 + filename がスラッシュで始まる場合は、 + DocumentRoot + からの相対パスとなります。

    + +

    例

    + HeaderName /include/HEADER.html +

    + +

    filename は + メジャーコンテントタイプが "text/*" + (例えば、text/html, + text/plain 等です。) + のドキュメントとして解決 + されなければなりません。これはつまり、 + もし CGI スクリプトの実際のファイルタイプが + 次のディレクティブのようにして実際の出力とは異なって + text/html としてマークされている場合、 + filename + は CGI スクリプトを参照するかも知れない、 + ということを意味します:

    + +

    + AddType text/html .cgi +

    + +

    Options MultiViews が + 有効になっている場合は、 + コンテントネゴシエーション + が行なわれます。 + もし filename が (CGI スクリプトでない) 静的な + text/html ドキュメントで解決され、 + options + Includes か IncludesNOEXEC + が有効になっている場合は、 + ファイルはサーバーサイドインクルードで処理されます + (mod_include ドキュメントを参照して下さい)。

    +
    + +

    もし HeaderName で指定されたファイルが + HTML ドキュメントの開始部分 (<html>, <head>, + 等) を含んでいたら、 + IndexOptions + +SuppressHTMLPreamble + を設定して、これらのタグが繰り返されないようにしたいと思うでしょう。

    + +
    +
    top
    +

    IndexIgnore ディレクティブ

    + + + + + + + +
    説明:ディレクトリ一覧を行なう際に無視すべき +ファイルリストに追加
    構文:IndexIgnore file [file] ...
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:Indexes
    ステータス:Base
    モジュール:mod_autoindex
    +

    IndexIgnore ディレクティブは、 + ディレクトリの一覧を行う際に無視すべきファイルリストに追加します。 + file は、 + シェル形式のワイルドカード表現か完全なファイル名です。 + IndexIgnore が複数ある場合は、無視するリストに追加が行われ、 + 置換は行われません。デフォルトではリストには . + (カレントディレクトリ) が含まれています。

    + +

    + IndexIgnore README .htaccess *.bak *~ +

    + +
    +
    top
    +

    IndexOptions ディレクティブ

    + + + + + + + +
    説明:ディレクトリインデックスの様々な設定項目 +
    構文:IndexOptions [+|-]option [[+|-]option] ...
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:Indexes
    ステータス:Base
    モジュール:mod_autoindex
    +

    IndexOptions + は、ディレクトリインデックスの挙動を指定します。 + option は次のどれかです:

    + +
    +
    DescriptionWidth=[n | *] + (2.0.23 以降)
    + +
    DescriptionWidth + キーワードは説明コラムの幅を文字数で指定することができます。
    + +
    -DescriptionWidth (または非設定) で、 + mod_autoindex が最適な幅を計算するようにできます。
    + +
    DescriptionWidth=n + で、コラム幅を n バイトに固定します。
    + +
    DescriptionWidth=* + は、最長の説明に合わせて必要な長さまでコラムを延ばします。
    + +
    説明を丸め込んだ場合特有の危険については + AddDescription + セクションをお読み下さい。
    + +
    FancyIndexing
    + +
    飾り付きインデックスをオンにします。
    + +
    FoldersFirst + (2.0.23 以降)
    + +
    このオプションが有効になった場合、サブディレクトリの一覧は + 必ず最初に現われて、そのディレクトリの通常のファイルは + その後に続きます。 + 一覧は基本的には、ファイルとディレクトリの二つの部分に分けられて、 + それぞれは別々にソートされ、その後サブディレクトリを先にして + 表示が行なわれます。例えばソート順が名前の降順になっていて、 + FoldersFirst が有効になっている場合は、 + サブディレクトリ Zed はサブディレクトリ + Beta よりも前にリストされ、通常のファイル + Gamma や Alpha + よりも前にリストされます。このオプションは + FancyIndexing + も有効になっているときにのみ、効果があります。
    + +
    HTMLTable (実験的、 + Apache 2.0.23 以降)
    + +
    この実験的なオプションは FancyIndexing とともに指定することで、 + 飾りの付いたディレクトリ一覧のためにテーブルを使った単純な表を作ります。 + これは古いブラウザを混乱させるかもしれないことに注意してください。 + WinNT やその他 utf-8 + が有効なプラットホームのように、ファイル名や説明テキストが + 右読みになったり左読みになりえる場合は特に必要です。
    + +
    IconsAreLinks
    + +
    これは、FancyIndexing において、 + アイコンもファイル名へのリンクの一部にします。
    + +
    IconHeight[=pixels]
    + +
    このオプションが、IconWidth とともに使われている場合は、 + サーバはファイルアイコンのための img + タグに height と width + 属性を取り込むようになります。 + これによって、イメージ全てをロードし終わるまで待たなくても、 + ブラウザはページレイアウトをあらかじめ計算することができます。 + このオプションに何も値が与えられなければ、Apache + ソフトウェアで提供されているアイコンの標準の高さが + デフォルトなります。
    + +
    IconWidth[=pixels]
    + +
    このオプションが、IconHeight とともに使われている場合は、 + サーバはファイルアイコンのための img + タグに height と width + 属性を取り込むようになります。 + これによって、イメージ全てをロードし終わるまで待たなくても、 + ブラウザはページレイアウトをあらかじめ計算することができます。 + このオプションに何も値が与えられなければ、Apache + ソフトウェアで提供されているアイコンの標準の高さが + デフォルトなります。
    + +
    IgnoreCase
    + +
    このオプションが有効であると、ファイル名は大文字小文字を区別せずにソートされます。 + 例えばファイル名が昇順でソートされ、IgnoreCase が有効であれば、 + Zeta は alfa の後にリストされます + (注意: GAMMA は常に gamma の前になります)。
    + +
    IgnoreClient
    + +
    このオプションで mod_autoindex は、 + クライアントからの全てのクエリー変数を無視するようになります。 + これはソート順も含みます。 + (つまり SuppressColumnSorting + を暗に意味します。)
    + +
    NameWidth=[n + | *]
    + +
    NameWidth キーワードでファイル名コラムの幅をバイト数で + 指定できます。
    + +
    -NameWidth (または非設定) で、 + mod_autoindex が最適な幅を計算するようにできます。
    + +
    NameWidth=n + で、コラム幅を n バイトに固定します。
    + +
    NameWidth=* + は、必要な長さまでコラムを延ばします。
    + +
    ScanHTMLTitles
    + +
    FancyIndexing のために、 + HTML ドキュメントからタイトルを取り出すことを可能にします。 + もしファイルに + AddDescription + で説明が与えられていなければ、 + httpd は title タグの値を読むためにドキュメントを読み始めます。 + これは CPU や disk に負荷をかけます。
    + +
    SuppressColumnSorting
    + +
    もし指定されていれば、Apache は + FancyIndexing で表示されているディレクトリ一覧での + コラムの先頭を、ソートのためのリンクにしなくなります。 + デフォルトの挙動は、リンクとします。 + コラムの先頭を選ぶとコラムの値に従ってディレクトリリストを + ソートします。 + Apache 2.0.23 以前では、これは同時に + ソート文字列のためのクエリー引数の解析も無効にします。 + + この挙動は Apache 2.0.23 では + IndexOptions + IgnoreClient で制御されるようになっています。
    + +
    SuppressDescription
    + +
    これは FancyIndexing におけるファイルの説明を消去します。 + デフォルトでは、説明は定義されておらず、 + このオプションを使うと他のために 23 + 文字の空白を稼ぐことができます。 ファイルの説明に関する情報は、 + AddDescription + をご覧下さい。また、説明のコラムサイズを制限する + DescriptionWidth + インデックスオプションもご覧下さい。
    + +
    SuppressHTMLPreamble
    + +
    通常、 + HeaderName + ディレクティブで指定したファイルを + ディレクトリが実際に含んでいれば、標準的な HTML プリアンブル + (<html>, <head>, 等) の後に、 + モジュールはファイルの中身をインクルードします。 + SuppressHTMLPreamble オプションは、 + この挙動を無効にできて、 + モジュールがヘッダーファイルの中身から表示を始めます。 + この場合、ヘッダーファイルは正しい HTML + 命令を含んでいなければなりません。 + ヘッダーファイルが存在しない場合は、プリアンブルは通常通り + 生成されます。
    + +
    SuppressIcon (Apache + 2.0.23 以降)
    + +
    + これは FancyIndexing の一覧からアイコンを消去します。 + SuppressIcon と SuppressRules + と組合わせることによって正しい HTML 3.2 の出力が得られます。 + 正しい HTML 3.2 出力は、最終規格において img と hr + が pre ブロックに入る (FancyIndexing 一覧で書式に使われています) + ことを禁止しています。
    + +
    SuppressLastModified
    + +
    FancyIndexing 一覧において最終更新日時の表示を消去します。
    + +
    SuppressRules + (Apache 2.0.23 以降)
    + +
    ディレクトリ一覧において水平区切り線 (hr タグ) を消去します。 + SuppressIcon と SuppressRules + と組合わせることによって正しい HTML 3.2 の出力が得られます。 + 正しい HTML 3.2 出力は、最終規格において img と hr + が pre ブロックに入る (FancyIndexing 一覧で書式に使われています) + ことを禁止しています。
    + +
    SuppressSize
    + +
    FancyIndexing 一覧においてファイルサイズの表示を消去します。
    + +
    TrackModified + (Apache 2.0.23 以降)
    + +
    これは HTTP ヘッダ中に、 + リストされたディレクトリの最終更新日や ETag 値を含めます。 + これは、オペレーティングシステムやファイルシステムが + 適切な stat() の返り値を返す場合にのみ有効です。 + いくつかの UNIX システム、OS2 の JFS や Win32 の NTFS + ボリュームはそうなっています。 + 例えば、OS2 と Win32 FAT ボリュームはそうではありません。 + この機能が有効になると、クライアントやプロキシは + HEAD リクエストを行うことによって、 + ファイル一覧の変化を追跡することができるようになります。 + いくつかのオペレーティングシステムは、新規ファイルや + 移動ファイルは正しく追跡するけれども、 + ディレクトリ中のファイルのサイズや日付は追跡ないということに + 注意してください。 + 既に存在するファイルのサイズや日付のスタンプが変化しても、 + 全ての Unix プラットホームでは、 + 最終更新日ヘッダーを更新しません。 + もしこれが重要であれば、 + このオプションを無効のままにしてください。
    + +
    VersionSort + (Apache 2.0a3 以降)
    + +
    VersionSort キーワードはバージョン番号を含んだファイルが + 自然な方法でソートされるようにします。 + 文字列は通常通りソートされ、 + それ以外の、説明や名前中の数となる部分文字列は + その数値で比較されます。 + +

    例:

    + foo-1.7
    + foo-1.7.2
    + foo-1.7.12
    + foo-1.8.2
    + foo-1.8.2a
    + foo-1.12 +

    + +

    番号が 0 から始まる場合は、端数と考えられます

    + +

    + foo-1.001
    + foo-1.002
    + foo-1.030
    + foo-1.04 +

    +
    + +
    XHTML + (Apache 2.0.49 以降)
    + +
    XHTML キーワードを指定すると、mod_autoindex + は HTML 3.2 の代わりに XHTML 1.0 のコードを出力するようになります。
    +
    + + +
    増減指定できる IndexOptions
    +
    +

    Apache 1.3.3 では、 + IndexOptions + ディレクティブの扱いで幾つかの大きな変化が導入されました。 + 特に、

    + +
      +
    • 一つのディレクトリに対する複数の + IndexOptions + ディレクティブは、現在では一つにマージされます。 + 上の例の結果は、 + +

      + <Directory /foo> + + IndexOptions HTMLTable
      + IndexOptions SuppressColumnsorting +
      + </Directory> +

      + +

      と同一になります。

      + +

      + IndexOptions HTMLTable SuppressColumnsorting +

      +
    • + +
    • 増減構文 + (すなわち、'+' や '-' + の接頭辞が付くキーワード) の追加。
    • +
    + +

    '+' や '-' 接頭辞の付いたキーワードに出会うとそれは、 + その時点での IndexOptions + の設定 (これは上流のディレクトリを受け継ぎます) + に対して適応されます。 + しかしながら、接頭辞の付かないキーワードが処理された場合は、 + 受け継いだオプション全てとそれまで出会った増減設定全てが + 消去されます。次の例を考えてみてください:

    + +

    + IndexOptions +ScanHTMLTitles -IconsAreLinks FancyIndexing
    + IndexOptions +SuppressSize +

    + +

    中身の効果は + IndexOptions FancyIndexing +SuppressSize + と同一です。 + 接頭辞の付かない FancyIndexing + でそれ以前の増減キーワードを無効にされて、 + その後の累積が始まるからです。

    + +

    無条件に IndexOptions + をあるディレクトリで設定することによって + 継承した設定を消去して、+ や - + 接頭辞の付かないキーワードで設定してください。

    +
    +
    + +
    +
    top
    +

    IndexOrderDefault ディレクティブ

    + + + + + + + + +
    説明: +ディレクトリインデックスの標準の順番付けを設定
    構文:IndexOrderDefault Ascending|Descending +Name|Date|Size|Description
    デフォルト:IndexOrderDefault Ascending Name
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:Indexes
    ステータス:Base
    モジュール:mod_autoindex
    +

    IndexOrderDefault ディレクティブは + FancyIndexing + インデックスオプションと併せて用いれれます。 + デフォルトでは、FancyIndexing + のディレクトリ一覧はファイル名の昇順で表示されます。 + IndexOrderDefault + で、初期状態の表示順番を変えることができます。

    + +

    IndexOrderDefault + は二つの引数をとります。一つ目はソートの方向を指示する + Ascending か Descending のいずれかです。 + 二つ目の引数は Name, Date, + Size か Description + のいずれか一つのキーワードであって、プライマリキーを指定します。 + 二つ目のキーは常にファイル名の昇順になります。

    + +

    このディレクティブと SuppressColumnSorting + インデックスオプションとを組み合わせることで、 + ディレクトリ一覧をある特定の順番でのみ表示するようにできます。 + これは、 + クライアントが別の順番でディレクトリ一覧をリクエストすることを防ぎます。

    + +
    +
    top
    +

    ReadmeName ディレクティブ

    + + + + + + + +
    説明:インデックス一覧の最後に挿入されるファイルの名前
    構文:ReadmeName filename
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:Indexes
    ステータス:Base
    モジュール:mod_autoindex
    +

    ReadmeName ディレクティブは、 + インデックスの終わりに付け加えられるファイルの名前を設定します。 + filename は挿入するファイルの名前で、 + 一覧の行われている位置から相対的なものとして解釈されます。 + filename がスラッシュで始まる場合は、 + DocumentRoot + からの相対パスとなります。

    + +

    例

    + ReadmeName FOOTER.html +

    + +

    例 2

    + ReadmeName /include/FOOTER.html +

    + +

    より詳細にまでこの挙動について記述している HeaderName + もご覧下さい。

    + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_autoindex.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_autoindex.html.ko.euc-kr new file mode 100644 index 00000000..a1558d53 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_autoindex.html.ko.euc-kr @@ -0,0 +1,817 @@ + + + +mod_autoindex - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    ¾ÆÆÄÄ¡ ¸ðµâ mod_autoindex

    +
    +

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

    +
    +
    ÀÌ ¹®¼­´Â ÃÖ½ÅÆÇ ¹ø¿ªÀÌ ¾Æ´Õ´Ï´Ù. + ÃÖ±Ù¿¡ º¯°æµÈ ³»¿ëÀº ¿µ¾î ¹®¼­¸¦ Âü°íÇϼ¼¿ä.
    + + + +
    ¼³¸í:ÀÚµ¿À¸·Î À¯´Ð½ºÀÇ ls ¸í·É¾î³ª Win32ÀÇ + dir ½©¸í·É¾î¿Í À¯»çÇÑ µð·ºÅ丮 ¸ñ·ÏÀ» ¸¸µç´Ù
    »óÅÂ:Base
    ¸ðµâ¸í:autoindex_module
    ¼Ò½ºÆÄÀÏ:mod_autoindex.c
    +

    ¿ä¾à

    + +

    µð·ºÅ丮 ¸ñ·ÏÀº ¾ò´Â ¹æ¹ýÀº µÎ°¡Áö´Ù:

    + +
      +
    • º¸Åë index.htmlÀ̶õ À̸§À¸·Î »ç¿ëÀÚ°¡ + ÀÛ¼ºÇÑ ÆÄÀÏ. ÀÌ ÆÄÀÏÀÇ À̸§Àº DirectoryIndex Áö½Ã¾î·Î + ÁöÁ¤ÇÑ´Ù. ÀÌ ÀÛ¾÷Àº mod_dirÀÌ ÇÑ´Ù.
    • + +
    • ¾Æ´Ï¸é ¼­¹ö°¡ ¸ñ·ÏÀ» ¸¸µç´Ù. ÀÌ ¸ñ·ÏÀÇ Çü½ÄÀ» ÁöÁ¤ÇÏ´Â + Áö½Ã¾îµéÀÌ ÀÖ´Ù. AddIcon, AddIconByEncoding, + AddIconByTypeÀº + ¿©·¯ ÆÄÀÏÁ¾·ù¸¶´Ù º¸¿©ÁÙ ¾ÆÀÌÄܵéÀ» ÁöÁ¤ÇÑ´Ù. °¢ ÆÄÀÏ¿¡ + ´ëÀÀÇϴ ù¹ø° ¾ÆÀÌÄÜÀ» º¸ÀδÙ. ÀÌ ÀÛ¾÷À» + mod_autoindex°¡ ÇÑ´Ù.
    • +
    +

    ÀÌ µÎ ±â´ÉÀº ¼­·Î º°°³·Î, ¿øÇÑ´Ù¸é ÀÚµ¿ ¸ñ·Ï »ý¼ºÀ» ¿ÏÀüÈ÷ + Á¦¿ÜÇÒ (ȤÀº ´ëüÇÒ) ¼ö ÀÖ´Ù.

    + +

    ÀÚµ¿ ¸ñ·Ï »ý¼ºÀº Options +Indexes·Î °¡´ÉÇÏ´Ù. + ÀÚ¼¼ÇÑ ³»¿ëÀº Options + Áö½Ã¾î¸¦ Âü°íÇ϶ó.

    + +

    IndexOptions + Áö½Ã¾î¿¡ FancyIndexing ¿É¼ÇÀ» ÁÖ¸é, ¿­ À̸§À» Ãâ·ÂÇÒ + ¼ø¼­¸¦ ¹Ù²Ù´Â ¸µÅ©·Î ¸¸µç´Ù. À̸§ ¸µÅ©¸¦ ¼±ÅÃÇÏ¸é ±× ¿­ÀÇ + °ª ¼ø¼­·Î ¸ñ·ÏÀ» ´Ù½Ã ¸¸µç´Ù. °°Àº À̸§À» ¹Ýº¹Çؼ­ ¼±ÅÃÇϸé + ¿À¸§Â÷¼ø°ú ³»¸²Â÷¼ø »çÀ̸¦ ¿À°£´Ù. IndexOptions Áö½Ã¾îÀÇ + SuppressColumnSorting ¿É¼ÇÀº ÀÌ·± ¿­ À̸§ ¸µÅ©¸¦ + ¸¸µéÁö ¾Ê´Â´Ù.

    + +

    "Size(Å©±â)" ¼øÀ¸·Î º¼¶§ Ãâ·ÂµÇ´Â °ª ¼ø¼­°¡ ¾Æ´Ï¶ó ½ÇÁ¦ + ÆÄÀÏÅ©±â ¼ø¼­ÀÓÀ» ÁÖÀÇÇ϶ó. Áï, 1010 ¹ÙÀÌÆ® ÆÄÀÏ°ú 1011 + ¹ÙÀÌÆ® ÆÄÀÏÀº µÑ´Ù "1K"·Î º¸ÀÌ´õ¶óµµ Ç×»ó 1010 ¹ÙÀÌÆ® ÆÄÀÏÀÌ + ¾Õ¿¡ ³ª¿Â´Ù.

    +
    + +
    top
    +
    +

    Autoindex ¿äû ¾Æ±Ô¸ÕÆ®

    + + +

    ¾ÆÆÄÄ¡ 2.0.23´Â ¿­¼ø¼­¿¡ ´ëÇÑ ¿äû ¾Æ±Ô¸ÕÆ®¸¦ Á¤¸®ÇÏ°í, + »õ·Î¿î ¿É¼ÇµéÀ» Ãß°¡Çß´Ù. Ãâ·ÂÀ» Ŭ¶óÀ̾ðÆ®°¡ Á¶ÀýÇÒ ¼ö + ¾øµµ·Ï ¸¸µå´Â IndexOptions + IgnoreClient ¿É¼ÇÀÌ Ãß°¡µÇ¾ú´Ù.

    + +

    ¿­¼ø¼­ À̸§Àº ¾Æ·¡ ³ª¿Â ¼ø¼­ ¿äû ¿É¼ÇÀ» ´õÇÑ ÀÚ±âÂüÁ¶ + ¸µÅ©´Ù. ¾Æ·¡ ¿É¼ÇÀº µð·ºÅ丮 ÀÚ¿ø¿¡ ´ëÇÑ ¾î¶² ¿äû¿¡µµ + »ç¿ëÇÒ ¼ö ÀÖ´Ù.

    + +
      +
    • C=NÀº ÆÄÀÏ¸í ¼øÀÌ´Ù
    • + +
    • C=MÀº ÃÖ±Ù ¼öÁ¤ÀÏ ¼ø, ±×¸®°í ÆÄÀÏ¸í ¼øÀÌ´Ù
    • + +
    • C=S´Â Å©±â ¼ø, ±×¸®°í ÆÄÀÏ¸í ¼øÀÌ´Ù
    • + +
    • C=D´Â ¼³¸í ¼ø, ±×¸®°í ÆÄÀϸí + ¼øÀÌ´Ù
    • + +
    • O=A´Â ¿À¸§Â÷¼øÀ¸·Î ¸ñ·ÏÀ» Á¤·ÄÇÑ´Ù
    • + +
    • O=D´Â ³»¸²Â÷¼øÀ¸·Î ¸ñ·ÏÀ» Á¤·ÄÇÑ´Ù
    • + +
    • F=0Àº (FancyIndexed°¡ ¾Æ´Ñ) °£´ÜÇÑ ¸ñ·Ï Çü½ÄÀÌ´Ù
    • + +
    • F=1Àº FancyIndexed ¸ñ·Ï Çü½ÄÀÌ´Ù
    • + +
    • F=2´Â HTMLTable FancyIndexed ¸ñ·Ï + Çü½ÄÀÌ´Ù
    • + +
    • V=0Àº ¹öÀü ¼øÀ¸·Î Á¤·ÄÇÏÁö ¾Ê´Â´Ù
    • + +
    • V=1Àº ¹öÀü ¼øÀ¸·Î Á¤·ÄÇÑ´Ù
    • + +
    • P=patternÀº ÁÖ¾îÁø pattern¿¡ + ÇØ´çÇÏ´Â ÆÄÀϸ¸À» ¸ñ·ÏÀ¸·Î ¸¸µç´Ù
    • +
    + +

    'P'attern ¾Æ±Ô¸ÕÆ®´Â ÀϹÝÀûÀÎ IndexIgnore Áö½Ã¾î¸¦ ó¸®ÇÑ ÈÄ¿¡ + °Ë»çÇϱ⶧¹®¿¡, ¸ñ·ÏÀº ´Ù¸¥ autoindex Á¶°ÇÀ» µû¸§À» ÁÖÀÇÇ϶ó. + mod_autoindexÀÇ ¿äû ¾Æ±Ô¸ÕÆ®¸¦ ÀоîµéÀ϶§ + ¾Ë ¼ö ¾ø´Â ¿É¼ÇÀ» ¹ß°ßÇÏ¸é ´õ ÀÌ»ó ÀÐÁö¾Ê´Â´Ù. ¿äû ¾Æ±Ô¸ÕÆ®´Â + À§ÀÇ Ç¥¿¡ µû¶ó ¸¸µé¾î¾ß ÇÑ´Ù.

    + +

    header.html ÆÄÀÏ¿¡ »ç¿ëÇÒ ¼ö ÀÖ´Â ¾Æ·¡ °£´ÜÇÑ ¿¹Á¦´Â + ÀÌ ¿É¼ÇµéÀ» ¼³¸íÇÑ´Ù. submit ¹öÅÏÀÇ ¾Ë ¼ö ¾ø´Â "X" ¾Æ±Ô¸ÕÆ®´Â + mod_autoindex°¡ X=Go Àü±îÁö ¸ðµç ¾Æ±Ô¸ÕÆ®¸¦ ÀоîµéÀÓÀ» + È®ÀÎÇϱâÀ§ÇØ ¸¶Áö¸·¿¡ »ç¿ëÇß´Ù.

    + +

    + <form action="" method="get">
    + + Show me a <select name="F">
    + + <option value="0"> Plain list</option>
    + <option value="1" selected="selected"> Fancy list</option>
    + <option value="2"> Table list</option>
    +
    + </select>
    + Sorted by <select name="C">
    + + <option value="N" selected="selected"> Name</option>
    + <option value="M"> Date Modified</option>
    + <option value="S"> Size</option>
    + <option value="D"> Description</option>
    +
    + </select>
    + <select name="O">
    + + <option value="A" selected="selected"> Ascending</option>
    + <option value="D"> Descending</option>
    +
    + </select>
    + <select name="V">
    + + <option value="0" selected="selected"> in Normal order</option>
    + <option value="1"> in Version order</option>
    +
    + </select>
    + Matching <input type="text" name="P" value="*" />
    + <input type="submit" name="X" value="Go" />
    +
    + </form> +

    + +
    +
    top
    +

    AddAlt Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:ÆÄÀϸíÀ¸·Î ¼±ÅÃÇÑ ¾ÆÀÌÄÜ´ë½Å »ç¿ëÇÒ ÆÄÀÏ ¼³¸í±Û
    ¹®¹ý:AddAlt string file [file] ...
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®, directory, .htaccess
    Override ¿É¼Ç:Indexes
    »óÅÂ:Base
    ¸ðµâ:mod_autoindex
    +

    AddAlt´Â FancyIndexing¿¡¼­ + ÆÄÀÏ¿¡ ´ëÇÑ ¾ÆÀÌÄÜ´ë½Å º¸ÀÏ ±ÛÀ» ÁöÁ¤ÇÑ´Ù. File¿¡´Â + ¼³¸íÇÒ ÆÄÀÏÀÇ ÆÄÀÏ È®ÀåÀÚ, ÆÄÀϸí ÀϺÎ, ¿ÍÀϵåÄ«µå Ç¥Çö, + Àüü ÆÄÀϸíÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù. String¿¡ °ø¹éÀÌ + µé¾î°£´Ù¸é µû¿ÈÇ¥(" ȤÀº ')·Î + ¹­¾î¾ß ÇÑ´Ù. Ŭ¶óÀ̾ðÆ®°¡ À̹ÌÁö¸¦ º¼ ¼ö ¾ø°Å³ª, À̹ÌÁö¸¦ + ÀÐÁö¾Ê°Å³ª, ¾ÆÀÌÄÜÀ» ¸ø ¾òÀº °æ¿ì ÀÌ Ãß°¡ ±ÛÀÌ º¸ÀÌ°Ô µÈ´Ù.

    + +

    ¿¹Á¦

    + AddAlt "PDF file" *.pdf
    + AddAlt Compressed *.gz *.zip *.Z +

    + +
    +
    top
    +

    AddAltByEncoding Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:MIME-encodingÀ¸·Î ¼±ÅÃÇÑ ¾ÆÀÌÄÜ´ë½Å »ç¿ëÇÒ ÆÄÀÏ +¼³¸í±Û
    ¹®¹ý:AddAltByEncoding string MIME-encoding +[MIME-encoding] ...
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®, directory, .htaccess
    Override ¿É¼Ç:Indexes
    »óÅÂ:Base
    ¸ðµâ:mod_autoindex
    +

    AddAltByEncodingÀº FancyIndexing¿¡¼­ + ÆÄÀÏ¿¡ ´ëÇÑ ¾ÆÀÌÄÜ´ë½Å º¸ÀÏ ±ÛÀ» ÁöÁ¤ÇÑ´Ù. MIME-encodingÀº + x-compress¿Í °°Àº À¯È¿ÇÑ content-encodingÀÌ´Ù. + String¿¡ °ø¹éÀÌ µé¾î°£´Ù¸é µû¿ÈÇ¥(" + ȤÀº ')·Î ¹­¾î¾ß ÇÑ´Ù. Ŭ¶óÀ̾ðÆ®°¡ À̹ÌÁö¸¦ + º¼ ¼ö ¾ø°Å³ª, À̹ÌÁö¸¦ ÀÐÁö¾Ê°Å³ª, ¾ÆÀÌÄÜÀ» ¸ø ¾òÀº °æ¿ì + ÀÌ Ãß°¡ ±ÛÀÌ º¸ÀÌ°Ô µÈ´Ù.

    + +

    ¿¹Á¦

    + AddAltByEncoding gzip x-gzip +

    + +
    +
    top
    +

    AddAltByType Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:MIME content-typeÀ¸·Î ¼±ÅÃÇÑ ¾ÆÀÌÄÜ´ë½Å »ç¿ëÇÒ ÆÄÀÏ +¼³¸í±Û
    ¹®¹ý:AddAltByType string MIME-type +[MIME-type] ...
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®, directory, .htaccess
    Override ¿É¼Ç:Indexes
    »óÅÂ:Base
    ¸ðµâ:mod_autoindex
    +

    AddAltByTypeÀº FancyIndexing¿¡¼­ + ÆÄÀÏ¿¡ ´ëÇÑ ¾ÆÀÌÄÜ´ë½Å º¸ÀÏ ±ÛÀ» ÁöÁ¤ÇÑ´Ù. MIME-typeÀº + text/html°ú °°Àº À¯È¿ÇÑ content-typeÀÌ´Ù. + String¿¡ °ø¹éÀÌ µé¾î°£´Ù¸é µû¿ÈÇ¥(" + ȤÀº ')·Î ¹­¾î¾ß ÇÑ´Ù. Ŭ¶óÀ̾ðÆ®°¡ À̹ÌÁö¸¦ + º¼ ¼ö ¾ø°Å³ª, À̹ÌÁö¸¦ ÀÐÁö¾Ê°Å³ª, ¾ÆÀÌÄÜÀ» ¸ø ¾òÀº °æ¿ì + ÀÌ Ãß°¡ ±ÛÀÌ º¸ÀÌ°Ô µÈ´Ù.

    + +

    ¿¹Á¦

    + AddAltByType 'plain text' text/plain +

    + +
    +
    top
    +

    AddDescription Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:ÆÄÀÏ¿¡ ´ëÇÑ ¼³¸í
    ¹®¹ý:AddDescription string file [file] ...
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®, directory, .htaccess
    Override ¿É¼Ç:Indexes
    »óÅÂ:Base
    ¸ðµâ:mod_autoindex
    +

    ÀÌ Áö½Ã¾î´Â FancyIndexing¿¡¼­ ÆÄÀÏ¿¡ ´ëÇÑ ¼³¸íÀ» ÁöÁ¤ÇÑ´Ù. + File¿¡´Â ¼³¸íÇÒ ÆÄÀÏÀÇ ÆÄÀÏ È®ÀåÀÚ, ÆÄÀϸí ÀϺÎ, + ¿ÍÀϵåÄ«µå Ç¥Çö, Àüü ÆÄÀϸíÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù. StringÀº + µû¿ÈÇ¥(")·Î ¹­¾î¾ß ÇÑ´Ù.

    + +

    ¿¹Á¦

    + AddDescription "The planet Mars" /web/pics/mars.gif +

    + +

    ÀüÇüÀûÀÎ ±âº» ¼³¸í ÇʵåÆøÀº 23 ¹ÙÀÌÆ®´Ù. IndexOptions + SuppressIcon ¿É¼ÇÀ» »ç¿ëÇÏ¸é ±âº»Æø¿¡ 6 ¹ÙÀÌÆ®¸¦ + ´õ Ãß°¡ÇÏ°í, IndexOptions SuppressSize ¿É¼ÇÀº 7 ¹ÙÀÌÆ®¸¦, + IndexOptions SuppressLastModified ¿É¼ÇÀº 19 + ¹ÙÀÌÆ®¸¦ ´õ Ãß°¡ÇÑ´Ù. ±×·¯¹Ç·Î °¡Àå ³ÐÀº ¼³¸íÆøÀº 55 ¹ÙÀÌÆ®´Ù.

    + +

    ÀÌ ÇʵåÀÇ Æø¸¦ ¹Ù²Ù°Å³ª ¼³¸íÀÇ ±æÀ̸¦ ¹«ÇÑ´ë·Î ¸¸µå·Á¸é + DescriptionWidth IndexOptions Å°¿öµå¸¦ Âü°íÇ϶ó.

    + +

    Á¶½É

    +

    AddDescriptionÀ¸·Î ÁöÁ¤ÇÑ ¼³¸í±Û¿¡ + ű׳ª character entity(¿ªÁÖ; &lt;, &amp; µîÀ» + ÁöĪ)°°Àº HTMLÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù. ±×·¯³ª Æø¶§¹®¿¡ + űװ¡ ÀÖ´Â ºÎºÐÀÌ Â©¸®°ÔµÇ¸é (¿¹¸¦ µé¾î ±½ÀºÃ¼ ºÎºÐ ³¡ÀÌ + ©¸®¸é) ³ª¸ÓÁö µð·ºÅ丮 ¸ñ·Ï¿¡ ¿µÇâÀ» ÁÙ ¼ö ÀÖ´Ù.

    +
    + +
    +
    top
    +

    AddIcon Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:À̸§À¸·Î ¼±ÅÃÇÑ ÆÄÀÏ¿¡ »ç¿ëÇÒ ¾ÆÀÌÄÜ
    ¹®¹ý:AddIcon icon name [name] +...
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®, directory, .htaccess
    Override ¿É¼Ç:Indexes
    »óÅÂ:Base
    ¸ðµâ:mod_autoindex
    +

    ÀÌ Áö½Ã¾î´Â FancyIndexing¿¡¼­ nameÀ¸·Î ³¡³ª´Â + ÆÄÀÏ ¿·¿¡ º¸¿©ÁÙ ¾ÆÀÌÄÜÀ» ÁöÁ¤ÇÑ´Ù. IconÀº + ¾ÆÀÌÄÜÀÇ (%-escaped) »ó´ë URL ȤÀº + (alttext,url) Çü½ÄÀÌ´Ù. + ¿©±â¼­ alttext´Â ±×¸²À» º¸¿©ÁÙ ¼ö ¾ø´Â ºê¶ó¿ìÀú°¡ + ¾ÆÀÌÄÜ´ë½Å »ç¿ëÇÒ ¹®±¸ÀÌ´Ù.

    + +

    Name¿¡´Â µð·ºÅ丮¸¦ ³ªÅ¸³»´Â ^^DIRECTORY^^, + (¸ñ·Ï Çü½ÄÀ» ¿Ã¹Ù·Î ¸ÂÃß±âÀ§ÇØ) ºóÁÙÀ» ³ªÅ¸³»´Â + ^^BLANKICON^^, ÆÄÀÏ È®ÀåÀÚ, ¿ÍÀϵåÄ«µå Ç¥Çö, + ÆÄÀϸí ÀϺΠȤÀº Àüü¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù.

    + +

    ¿¹Á¦

    + AddIcon (IMG,/icons/image.xbm) .gif .jpg .xbm
    + AddIcon /icons/dir.xbm ^^DIRECTORY^^
    + AddIcon /icons/backup.xbm *~ +

    + +

    °¡´ÉÇϸé AddIconº¸´Ù´Â AddIconByTypeÀ» »ç¿ëÇØ¾ß ÇÑ´Ù.

    + +
    +
    top
    +

    AddIconByEncoding Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:MIME content-encodingÀ¸·Î ¼±ÅÃÇÑ ÆÄÀÏ¿¡ »ç¿ëÇÒ ¾ÆÀÌÄÜ
    ¹®¹ý:AddIconByEncoding icon MIME-encoding +[MIME-encoding] ...
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®, directory, .htaccess
    Override ¿É¼Ç:Indexes
    »óÅÂ:Base
    ¸ðµâ:mod_autoindex
    +

    ÀÌ Áö½Ã¾î´Â FancyIndexing¿¡¼­ + ÆÄÀÏ ¿·¿¡ º¸¿©ÁÙ ¾ÆÀÌÄÜÀ» ÁöÁ¤ÇÑ´Ù. IconÀº + ¾ÆÀÌÄÜÀÇ (%-escaped) »ó´ë URL ȤÀº + (alttext,url) Çü½ÄÀÌ´Ù. + ¿©±â¼­ alttext´Â ±×¸²À» º¸¿©ÁÙ ¼ö ¾ø´Â ºê¶ó¿ìÀú°¡ + ¾ÆÀÌÄÜ´ë½Å »ç¿ëÇÒ ¹®±¸ÀÌ´Ù.

    + +

    MIME-encoding´Â content-encoding¿¡ ÇØ´çÇÏ´Â + ¿ÍÀϵåÄ«µå Ç¥ÇöÀÌ´Ù.

    + +

    ¿¹Á¦

    + AddIconByEncoding /icons/compress.xbm x-compress +

    + +
    +
    top
    +

    AddIconByType Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:MIME content-typeÀ¸·Î ¼±ÅÃÇÑ ÆÄÀÏ¿¡ »ç¿ëÇÒ ¾ÆÀÌÄÜ
    ¹®¹ý:AddIconByType icon MIME-type +[MIME-type] ...
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®, directory, .htaccess
    Override ¿É¼Ç:Indexes
    »óÅÂ:Base
    ¸ðµâ:mod_autoindex
    +

    ÀÌ Áö½Ã¾î´Â FancyIndexing¿¡¼­ + MIME-typeÀÇ ÆÄÀÏ ¿·¿¡ º¸¿©ÁÙ ¾ÆÀÌÄÜÀ» ÁöÁ¤ÇÑ´Ù. + IconÀº ¾ÆÀÌÄÜÀÇ (%-escaped) »ó´ë URL ȤÀº + (alttext,url) Çü½ÄÀÌ´Ù. + ¿©±â¼­ alttext´Â ±×¸²À» º¸¿©ÁÙ ¼ö ¾ø´Â ºê¶ó¿ìÀú°¡ + ¾ÆÀÌÄÜ´ë½Å »ç¿ëÇÒ ¹®±¸ÀÌ´Ù.

    + +

    MIME-typeÀº mime type¿¡ ÇØ´çÇÏ´Â ¿ÍÀϵåÄ«µå + Ç¥ÇöÀÌ´Ù.

    + +

    ¿¹Á¦

    + AddIconByType (IMG,/icons/image.xbm) image/* +

    + +
    +
    top
    +

    DefaultIcon Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:ƯÁ¤ ¾ÆÀÌÄÜÀ» ¼³Á¤ÇÏÁö¾ÊÀº ÆÄÀÏ¿¡ »ç¿ëÇÒ ¾ÆÀÌÄÜ
    ¹®¹ý:DefaultIcon url-path
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®, directory, .htaccess
    Override ¿É¼Ç:Indexes
    »óÅÂ:Base
    ¸ðµâ:mod_autoindex
    +

    DefaultIcon Áö½Ã¾î´Â FancyIndexing¿¡¼­ + ƯÁ¤ ¾ÆÀÌÄÜÀ» ¼³Á¤ÇÏÁö¾ÊÀº ÆÄÀÏ ¿·¿¡ ³ª¿Ã ¾ÆÀÌÄÜÀÌ´Ù. + IconÀº ¾ÆÀÌÄÜÀÇ (%-escaped) »ó´ë URLÀÌ´Ù.

    + +

    ¿¹Á¦

    + DefaultIcon /icon/unknown.xbm +

    + +
    +
    top
    +

    HeaderName Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:ÆÄÀϸñ·Ï À§¿¡ »ðÀÔÇÒ ÆÄÀÏÀÇ À̸§
    ¹®¹ý:HeaderName filename
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®, directory, .htaccess
    Override ¿É¼Ç:Indexes
    »óÅÂ:Base
    ¸ðµâ:mod_autoindex
    +

    HeaderName Áö½Ã¾î´Â ÆÄÀϸñ·Ï ¾Õ¿¡ + »ðÀÔÇÒ ÆÄÀÏÀÇ À̸§À» ÁöÁ¤ÇÑ´Ù. FilenameÀº »ðÀÔÇÒ + ÆÄÀϸíÀÌ´Ù.

    + +

    ¿¹Á¦

    + HeaderName HEADER.html +

    + +
    +

    ÇöÀç HeaderName°ú ReadmeName µÑ ¸ðµÎ + FilenameÀ» Á¢±ÙÇÏ·Á´Â µð·ºÅ丮ÀÇ »ó´ë URI °æ·Î·Î + ¹Þ¾ÆµéÀδÙ. FilenameÀÌ ½½·¡½¬·Î ½ÃÀÛÇϸé DocumentRoot¿¡ »ó´ëÀûÀÎ °æ·Î·Î + ¹Þ¾ÆµéÀδÙ.

    + +

    ¿¹Á¦

    + HeaderName /include/HEADER.html +

    + +

    Filename¿¡´Â major content typeÀÌ text/*ÀÎ + (¿¹¸¦ µé¾î, text/html, text/plain, + µî) ¹®¼­¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù. Áï, ½ºÅ©¸³Æ®ÀÇ (Ãâ·ÂÀÌ ¾Æ´Ñ) ½ÇÁ¦ ÆÄÀÏ + typeÀ» ´ÙÀ½°ú °°ÀÌ text/html·Î ÁöÁ¤ÇÑ´Ù¸é + filenameÀ¸·Î CGI ½ºÅ©¸³Æ®¸¦ ÁöÁ¤ÇÒ ¼öµµ ÀÖ´Ù:

    + +

    + AddType text/html .cgi +

    + +

    Options + MultiViewsÀ» »ç¿ëÇÏ¸é ³»¿ëÇù»óÀ» ÇÑ´Ù. + filenameÀÌ (CGI ½ºÅ©¸³Æ®°¡ ¾Æ´Ñ) °íÁ¤µÈ + text/html ¹®¼­ÀÌ°í options Includes³ª + IncludesNOEXEC Áß Çϳª¸¦ »ç¿ëÇÑ´Ù¸é ÆÄÀÏÀ» + server-side includes·Î ó¸®ÇÑ´Ù. (mod_include + ¹®¼­ Âü°í)

    +
    + +

    HeaderNameÀ¸·Î ÁöÁ¤ÇÑ ÆÄÀÏ¿¡ + (<html>, <head>, µî) HTML ¹®¼­ ½ÃÀۺκÐÀÌ Æ÷ÇÔµÇÀÖ´Ù¸é + IndexOptions + +SuppressHTMLPreambleÀ» »ç¿ëÇÏ¿© ÀÌ ºÎºÐÀ» Ãß°¡ÇÏÁö¾Ê´Â + °ÍÀÌ ÁÁ´Ù.

    + +
    +
    top
    +

    IndexIgnore Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:µð·ºÅ丮 ¸ñ·Ï¿¡¼­ ¼û±æ ÆÄÀϸñ·ÏÀ» Ãß°¡ÇÑ´Ù
    ¹®¹ý:IndexIgnore file [file] ...
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®, directory, .htaccess
    Override ¿É¼Ç:Indexes
    »óÅÂ:Base
    ¸ðµâ:mod_autoindex
    +

    IndexIgnore Áö½Ã¾î´Â µð·ºÅ丮 + ¸ñ·Ï¿¡¼­ °¨Ãâ ÆÄÀϸñ·ÏÀ» Ãß°¡ÇÑ´Ù. File¿¡´Â °¨Ãâ + (½©¿¡¼­ »ç¿ëÇÏ´Â) È­ÀϵåÄ«µå Ç¥ÇöÀ̳ª Àüü ÆÄÀϸíÀ» + »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¿©·¯ IndexIgnore Áö½Ã¾î¸¦ »ç¿ëÇÏ¸é ±âÁ¸ÀÇ + °¨Ãâ ÆÄÀϸñ·ÏÀ» ´ëüÇÏÁö¾Ê°í ¸ñ·Ï¿¡ ÁöÁ¤ÇÑ ÆÄÀϵéÀ» Ãß°¡ÇÑ´Ù. + ±âº»ÀûÀ¸·Î ¸ñ·ÏÀº .À» (ÇöÀç µð·ºÅ丮) Æ÷ÇÔÇÑ´Ù.

    + +

    + IndexIgnore README .htaccess *.bak *~ +

    + +
    +
    top
    +

    IndexOptions Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:µð·ºÅ丮 ¸ñ·ÏÀÇ ¿©·¯ ¼³Á¤µé
    ¹®¹ý:IndexOptions [+|-]option [[+|-]option] +...
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®, directory, .htaccess
    Override ¿É¼Ç:Indexes
    »óÅÂ:Base
    ¸ðµâ:mod_autoindex
    +

    IndexOptions Áö½Ã¾î´Â µð·ºÅ丮 + ¸ñ·ÏÀ» ¼³Á¤ÇÑ´Ù. OptionÀº ´ÙÀ½ Áß ÇϳªÀÌ´Ù

    + +
    +
    DescriptionWidth=[n | *] (¾ÆÆÄÄ¡ + 2.0.23 ÀÌÈÄ)
    + +
    DescriptionWidth Å°¿öµå¸¦ »ç¿ëÇÏ¿© ¹®ÀÚ´ÜÀ§·Î + ¼³¸í¿­ÀÇ ÆøÀ» ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù.
    + +
    -DescriptionWidth¸¦ ÁöÁ¤Çϸé (ȤÀº ¾Æ¹«°Íµµ + ÁöÁ¤ÇÏÁö¾ÊÀ¸¸é) mod_autoindex°¡ ÃÖÀûÀÇ + ÆøÀ» °è»êÇÑ´Ù.
    + +
    DescriptionWidth=nÀº ¿­ÀÇ + ÆøÀ» n ¹ÙÀÌÆ®·Î °íÁ¤ÇÑ´Ù.
    + +
    DescriptionWidth=*Àº ¿­ÀÇ ÆøÀ» °¡Àå ±ä + ¼³¸í±ÛÀ» ´ãÀ» ¼ö Àִ¸¸Å­ ´Ã¸°´Ù.
    + +
    ¼³Á¤ÀÌ Â©¸± ¼ö ÀÖ´Â ¹®Á¦´Â AddDescription + ÀýÀ» Âü°íÇ϶ó.
    + +
    FancyIndexing
    + +
    µð·ºÅ丮ÀÇ fancy ¸ñ·ÏÀ» ¸¸µç´Ù.
    + +
    FoldersFirst + (¾ÆÆÄÄ¡ 2.0.23 ÀÌÈÄ)
    + +
    ÀÌ ¿É¼ÇÀ» »ç¿ëÇϸé ÇÏÀ§µð·ºÅ丮 ¸ñ·ÏÀÌ Ç×»ó + ¸ÕÀú ³ª¿À°í, µð·ºÅ丮¿¡ ÀÖ´Â ÀÏ¹Ý ÆÄÀÏÀÌ µÚ¿¡ ³ª¿Â´Ù. + ±âº»ÀûÀ¸·Î ¸ñ·ÏÀº ÆÄÀÏ°ú ÇÏÀ§µð·ºÅ丮·Î ³ª´µ°í, µû·Î + °¢°¢ÀÇ ¼ø¼­¸¦ Á¤¸®ÇÏ¿© ÇÏÀ§µð·ºÅ丮µéÀ» ¸ÕÀú º¸ÀδÙ. + ¿¹¸¦ µé¾î, À̸§ ¿ª¼øÀ¸·Î Á¤·ÄÇÏ°í FoldersFirst¸¦ + »ç¿ëÇÑ´Ù¸é ÇÏÀ§µð·ºÅ丮 Zed°¡ ÇÏÀ§µð·ºÅ丮 + Beta ¾Õ¿¡ ³ª¿À°í, ÇÏÀ§µð·ºÅ丮 Beta´Â + ÀÏ¹Ý ÆÄÀÏ Gamma¿Í Alpha ¾Õ¿¡ + ³ª¿Â´Ù. ÀÌ ¿É¼ÇÀº FancyIndexingÀ» ÇÔ²² »ç¿ëÇÒ¶§¸¸ È¿°ú°¡ + ÀÖ´Ù.
    + +
    HTMLTable (½ÇÇèÀû, + ¾ÆÆÄÄ¡ 2.0.23 ÀÌÈÄ)
    + +
    ÀÌ ½ÇÇèÀûÀÎ FancyIndexing ¿É¼ÇÀº °£´ÜÇÑ HTML Ç¥·Î + fancy µð·ºÅ丮 ¸ñ·ÏÀ» ¸¸µç´Ù. ÀÌ ¿É¼ÇÀº ¿À·¡µÈ ºê¶ó¿ìÀú¸¦ + È¥¶õ½º·´°Ô ÇÒ ¼ö ÀÖÀ½À» ÁÖÀÇÇ϶ó. ÀÌ ¿É¼ÇÀº WinNT³ª ´Ù¸¥ + utf-8 »ç¿ë Ç÷¡Æû¿¡¼­ ÆÄÀϸíÀ̳ª ¼³¸í¹®ÀÇ Àб⠼ø¼­(¿ÞÂÊ¿¡¼­ + ¿À¸¥ÂÊ È¤Àº ¿À¸¥ÂÊ¿¡¼­ ¿ÞÂÊÀ¸·Î)°¡ ´Ù¸¦¶§ Ưº°È÷ À¯¿ëÇÏ´Ù.
    + +
    IconsAreLinks
    + +
    fancy ¸ñ·Ï¿¡¼­ ÆÄÀÏ¸í ¸µÅ©¿¡ ¾ÆÀÌÄÜÀ» Æ÷ÇÔÇÑ´Ù.
    + +
    IconHeight[=pixels]
    + +
    ÀÌ ¿É¼ÇÀ» IconWidth¿Í °°ÀÌ »ç¿ëÇÏ¸é ¼­¹ö´Â ÆÄÀÏ ¾ÆÀÌÄÜÀÇ + img ű׿¡ height¿Í width + ¼Ó¼ºÀ» Æ÷ÇÔÇÑ´Ù. ±×·¯¸é ºê¶ó¿ìÀú´Â ¸ðµç À̹ÌÁö¸¦ ¹ÞÁö¾ÊÀº + »óȲ¿¡¼­µµ ÆäÀÌÁö ±¸¼ºÀ» ¹Ì¸® °è»êÇÒ ¼ö ÀÖ´Ù. ¿É¼Ç¿¡ °ªÀ» + ÁÖÁö¾ÊÀ¸¸é ¾ÆÆÄÄ¡°¡ Á¦°øÇÏ´Â ¾ÆÀÌÄÜÀÇ Ç¥ÁØ ³ôÀ̸¦ »ç¿ëÇÑ´Ù.
    + +
    IconWidth[=pixels]
    + +
    ÀÌ ¿É¼ÇÀ» IconHeight¿Í °°ÀÌ »ç¿ëÇϸé + ¼­¹ö´Â ÆÄÀÏ ¾ÆÀÌÄÜÀÇ img ű׿¡ + height¿Í width ¼Ó¼ºÀ» Æ÷ÇÔÇÑ´Ù. + ±×·¯¸é ºê¶ó¿ìÀú´Â ¸ðµç À̹ÌÁö¸¦ ¹ÚÁö¾ÊÀº »óȲ¿¡¼­µµ ÆäÀÌÁö + ±¸¼ºÀ» ¹Ì¸® °è»êÇÒ ¼ö ÀÖ´Ù. ¿É¼Ç¿¡ °ªÀ» ÁÖÁö¾ÊÀ¸¸é ¾ÆÆÄÄ¡°¡ + Á¦°øÇÏ´Â ¾ÆÀÌÄÜÀÇ Ç¥ÁØ ÆøÀ» »ç¿ëÇÑ´Ù.
    + +
    IgnoreCase
    + +
    ÀÌ ¿É¼ÇÀ» »ç¿ëÇÏ¸é ´ë¼Ò¹®ÀÚ ±¸º°ÇÏÁö¾Ê°í À̸§À» Á¤·ÄÇÑ´Ù. + ¿¹¸¦ µé¾î, À̸§À¸·Î ¿À¸§Â÷¼øÀÌ°í IgnoreCase¸¦ »ç¿ëÇϸé + ÆÄÀÏ Zeta´Â ÆÄÀÏ alfa µÚ¿¡ ³ª¿Â´Ù (ÁÖÀÇ: ÆÄÀÏ GAMMA´Â + Ç×»ó ÆÄÀÏ gamma ¾Õ¿¡ ³ª¿Â´Ù).
    + +
    IgnoreClient
    + +
    ÀÌ ¿É¼ÇÀ» »ç¿ëÇϸé mod_autoindex´Â + ¼ø¼­¸¦ Æ÷ÇÔÇÏ¿© Ŭ¶óÀ̾ðÆ®°¡ º¸³»´Â ¸ðµç ÁúÀǺ¯¼ö¸¦ ¹«½ÃÇÑ´Ù. + (SuppressColumnSortingÀ» °¡Á¤ÇÑ´Ù.)
    + +
    NameWidth=[n + | *]
    + +
    NameWidth Å°¿öµå´Â ¹ÙÀÌÆ®´ÜÀ§·Î ÆÄÀϸí + ¿­ÀÇ ÆøÀ» ÁöÁ¤ÇÑ´Ù.
    + +
    -NameWidthÀ» ÁöÁ¤Çϸé (ȤÀº ¾Æ¹«°Íµµ + ÁöÁ¤ÇÏÁö¾ÊÀ¸¸é) mod_autoindex°¡ ÃÖÀûÀÇ + ÆøÀ» °è»êÇÑ´Ù.
    + +
    NameWidth=n´Â ¿­ÀÇ ÆøÀ» n + ¹ÙÀÌÆ®·Î °íÁ¤ÇÑ´Ù.
    + +
    NameWidth=*Àº ¿­ÀÇ ÆøÀ» ÇÊ¿äÇѸ¸Å­ ´Ã¸°´Ù.
    + +
    ScanHTMLTitles
    + +
    fancy ¸ñ·Ï¿¡¼­ HTML ¹®¼­ÀÇ titleÀ» »Ì´Â´Ù. ÆÄÀÏ¿¡ + AddDescription·Î + ÁöÁ¤ÇÑ ¼³¸íÀÌ ¾ø´Ù¸é À¥¼­¹ö´Â ¹®¼­ÀÇ title + ¿ä¼Ò°ªÀ» ÀоîµéÀδÙ. ÀÌ ÀÛ¾÷Àº CPU¿Í µð½ºÅ©¸¦ ¸¹ÀÌ »ç¿ëÇÑ´Ù.
    + +
    SuppressColumnSorting
    + +
    ÀÌ ¿É¼ÇÀ» »ç¿ëÇÏ¸é ¾ÆÆÄÄ¡´Â FancyIndexed µð·ºÅ丮 + ¸ñ·Ï¿¡¼­ ¿­ À̸§À» ¼ø¼­¸¦ ¹Ù²Ù´Â ¸µÅ©·Î ¸¸µéÁö ¾Ê´Â´Ù. + º¸ÅëÀº ¿­ À̸§À» ¸µÅ©·Î ¸¸µé¾î¼­, ¿­ À̸§À» ¼±ÅÃÇÏ¸é ±× + ¿­¿¡ ÀÖ´Â °ª¼ø¼­·Î µð·ºÅ丮 ¸ñ·ÏÀ» ¸¸µç´Ù. ¾ÆÆÄÄ¡ + 2.0.23 ÀÌÀü¿¡´Â ¼ø¼­ ¾Æ±Ô¸ÕÆ®µµ ÀÐÁö ¾Ê¾Ò´Ù. + ¾ÆÆÄÄ¡ 2.0.23¿¡¼­´Â IndexOptions + IgnoreClient¸¦ »ç¿ëÇÏ¿© ¼ø¼­ ¾Æ±Ô¸ÕÆ®¸¦ ÀÐÁö ¾Ê´Â´Ù.
    + +
    SuppressDescription
    + +
    fancy ¸ñ·Ï¿¡¼­ ÆÄÀÏ ¼³¸íÀ» Æ÷ÇÔÇÏÁö ¾Ê´Â´Ù. ±âº»ÀûÀ¸·Î + ¾î¶² ÆÄÀÏ ¼³¸íµµ Á¤ÀǵÇÀÖÁö¾Ê°í, ÀÌ ¿É¼ÇÀ» »ç¿ëÇϸé 23 + ¹®ÀÚ °ø°£À» ´Ù¸¥ ¿ëµµ·Î »ç¿ëÇÑ´Ù. ÆÄÀÏ ¼³¸íÀ» ÁöÁ¤ÇÏ´Â + ¹æ¹ýÀº AddDescriptionÀ» Âü°íÇ϶ó. ¼³¸í¿­ÀÇ Å©±â¸¦ + ÁöÁ¤ÇÏ´Â DescriptionWidth + ¿É¼Çµµ Âü°íÇ϶ó.
    + +
    SuppressHTMLPreamble
    + +
    µð·ºÅ丮¿¡ HeaderName Áö½Ã¾î·Î + ÁöÁ¤ÇÑ ÆÄÀÏÀÌ ÀÖ´Â °æ¿ì ¸ðµâÀº º¸Åë Ç¥ÁØ HTML ½ÃÀۺκР+ (<html>, <head>, + et cetera) µÚ¿¡ ÆÄÀÏ ³»¿ëÀ» ÷°¡ÇÑ´Ù. ±×·¯³ª + SuppressHTMLPreamble ¿É¼ÇÀ» »ç¿ëÇϸé óÀ½ºÎÅÍ + header ÆÄÀÏ ³»¿ëÀ» Æ÷ÇÔÇÑ´Ù. ÀÌ °æ¿ì header ÆÄÀÏ¿¡´Â ÀûÀýÇÑ + HTML ¸í·ÉÀÌ ÀÖ¾î¾ß ÇÑ´Ù. header ÆÄÀÏÀÌ ¾ø´Ù¸é ÀϹÝÀûÀÎ + ½ÃÀۺκÐÀÌ ¸¸µé¾îÁø´Ù.
    + +
    SuppressIcon + (¾ÆÆÄÄ¡ 2.0.23 ÀÌÈÄ)
    + +
    fancy ¸ñ·Ï¿¡¼­ ¾ÆÀÌÄÜÀ» »«´Ù. SuppressIcon°ú + SuppressRules¸¦ °°ÀÌ »ç¿ëÇϸé, (FancyIndexed + ¸ñ·ÏÀÌ »ç¿ëÇÑ) pre ¾È¿¡ img¿Í + hr ¿ä¼Ò »ç¿ëÀ» ±ÝÁöÇÑ ¸¶Áö¸· Ç¥ÁØÀÎ HTML 3.2¿¡ + ¾Ë¸ÂÀº Ãâ·ÂÀÌ µÈ´Ù.
    + +
    SuppressLastModified
    + +
    fancy ¸ñ·Ï¿¡¼­ ¸¶Áö¸· ¼öÁ¤ÀÏÀ» Ç¥½ÃÇÏÁö ¾Ê´Â´Ù.
    + +
    SuppressRules + (¾ÆÆÄÄ¡ 2.0.23 ÀÌÈÄ)
    + +
    µð·ºÅ丮 ¸ñ·Ï¿¡¼­ ¼öÆòÁÙÀ» (hr ¿ä¼Ò) + »ç¿ëÇÏÁö ¾Ê´Â´Ù. SuppressIcon°ú + SuppressRules¸¦ °°ÀÌ »ç¿ëÇϸé, (FancyIndexed + ¸ñ·ÏÀÌ »ç¿ëÇÑ) pre ¾È¿¡ img¿Í + hr ¿ä¼Ò »ç¿ëÀ» ±ÝÁöÇÑ ¸¶Áö¸· Ç¥ÁØÀÎ HTML 3.2¿¡ + ¾Ë¸ÂÀº Ãâ·ÂÀÌ µÈ´Ù.
    + +
    SuppressSize
    + +
    fancy ¸ñ·Ï¿¡¼­ ÆÄÀÏÅ©±â¸¦ Ç¥½ÃÇÏÁö ¾Ê´Â´Ù.
    + +
    TrackModified + (¾ÆÆÄÄ¡ 2.0.23 ÀÌÈÄ)
    + +
    µð·ºÅ丮 ¸ñ·ÏÀÇ HTTP Çì´õ¿¡ Last-Modified¿Í ETag °ªÀ» + Æ÷ÇÔÇÑ´Ù. ÀÌ ¿É¼ÇÀº ¿î¿µÃ¼Á¦¿Í ÆÄÀϽýºÅÛ¿¡¼­ ÀûÀýÇÑ stat() + °á°ú¸¦ ¾òÀ» ¼ö ÀÖÀ»¶§¸¸ À¯È¿ÇÏ´Ù. À¯´Ð½º ½Ã½ºÅÛ°ú OS2ÀÇ + JFS, Win32ÀÇ NTFS¿¡¼­´Â °¡´ÉÇÏ´Ù. ¿¹¸¦ µé¾î, OS2¿Í Win32ÀÇ + FATÀº ºÒ°¡´ÉÇÏ´Ù. ÀÌ ±â´ÉÀ» »ç¿ëÇϸé Ŭ¶óÀ̾ðÆ®³ª ÇÁ·Ï½Ã´Â + HEAD ¿äûÀ» »ç¿ëÇÏ¿© ÆÄÀϸñ·ÏÀÇ º¯È­¸¦ ÃßÀûÇÒ + ¼ö ÀÖ´Ù. ¾î¶² ¿î¿µÃ¼Á¦´Â »õ·Î¿î ÆÄÀÏ°ú »èÁ¦ÇÑ ÆÄÀÏÀ» ¿Ã¹Ù·Î + ÃßÀûÇÏÁö¸¸, µð·ºÅ丮¿¡ ÀÖ´Â ÆÄÀÏÀÇ Å©±â³ª ³¯Â¥ º¯È­¸¦ + ÃßÀûÇÏÁö ¸øÇÔÀ» ÁÖÀÇÇ϶ó. ¸ðµç À¯´Ð½º Ç÷¡Æû¿¡¼­ + ±âÁ¸ ÆÄÀÏÀÇ Å©±â³ª ³¯Â¥ º¯È­½Ã Last-Modified Çì´õ°¡ + ¹Ù²îÁö¾Ê´Â´Ù. ÀÌ·± º¯È­°¡ Áß¿äÇÏ´Ù¸é ÀÌ ¿É¼ÇÀ» + »ç¿ëÇÏÁö ¸¶¶ó.
    + +
    VersionSort + (¾ÆÆÄÄ¡ 2.0a3 ÀÌÈÄ)
    + +
    VersionSort Å°¿öµå´Â ¹öÀü ¹øÈ£¸¦ Æ÷ÇÔÇÑ + ÆÄÀϸíÀ» ÀÚ¿¬½º·´°Ô Á¤·ÄÇÑ´Ù. ¹®ÀÚ ºÎºÐÀº Á¤»óÀûÀÎ ¼ø¼­¸¦ + Á¤·ÄÇÏÁö¸¸, ÆÄÀÏ°ú ¼³¸í¿¡ ÀÖ´Â ¼ýÀÚ ºÎºÐÀº ¼ýÀÚ°ªÀ¸·Î + ºñ±³ÇÑ´Ù. + +

    ¿¹Á¦:

    + foo-1.7
    + foo-1.7.2
    + foo-1.7.12
    + foo-1.8.2
    + foo-1.8.2a
    + foo-1.12 +

    + +

    ¼ö°¡ 0À¸·Î ½ÃÀÛÇϸé, ±× ¼ö¸¦ ºÐ¼ö·Î Ãë±ÞÇÑ´Ù:

    + +

    + foo-1.001
    + foo-1.002
    + foo-1.030
    + foo-1.04 +

    +
    + +
    XHTML + (¾ÆÆÄÄ¡ 2.0.49 ÀÌÈÄ)
    + +
    XHTML Å°¿öµå¸¦ »ç¿ëÇϸé + mod_autoindex´Â HTML 3.2 ´ë½Å XHTML 1.0 + Äڵ带 »ý¼ºÇÑ´Ù.
    +
    + + +
    Á¡ÁøÀûÀÎ IndexOptions
    +
    +

    ¾ÆÆÄÄ¡ 1.3.3¿¡¼­ IndexOptions + Áö½Ã¾î 󸮹æ½ÄÀÌ Å©°Ô º¯È­µÇ¾ú´Ù. Ưº°È÷:

    + +
      +
    • ÀÌÁ¦ ÇÑ µð·ºÅ丮¿¡ ´ëÇÑ ¿©·¯ + IndexOptions Áö½Ã¾îµéÀ» ¼­·Î °áÇÕÇÑ´Ù. + ´ÙÀ½ÀÇ °á°ú´Â: + +

      + <Directory /foo> + + IndexOptions HTMLTable
      + IndexOptions SuppressColumnsorting +
      + </Directory> +

      + +

      ´ÙÀ½°ú °°´Ù

      + +

      + IndexOptions HTMLTable SuppressColumnsorting +

      +
    • + +
    • (¿¹¸¦ µé¾î, Å°¿öµå ¾Õ¿¡ +³ª + -¸¦ ºÙÀÌ´Â) Á¡ÁøÀûÀÎ ¹®¹ýÀÌ Ãß°¡µÇ¾ú´Ù.
    • +
    + +

    Å°¿öµå ¾Õ¿¡ '+'³ª '-'°¡ ºÙÀ»¶§¸¶´Ù ÇØ´ç Å°¿öµå°¡ ÇöÀç + (»óÀ§ µð·ºÅ丮¿¡¼­ »ó¼ÓµÇ¾úÀ») IndexOptions + ¼³Á¤¿¡ ¹Ý¿µµÈ´Ù. ±×·¯³ª ¾Õ¿¡ ¾Æ¹«°Íµµ ¾ø´Â Å°¿öµå¸¦ ¸¸³ª¸é + ¾ÆÁ÷±îÁö »ó¼ÓµÇ°Å³ª Á¡ÁøÀûÀ¸·Î º¯°æµÈ ¼³Á¤À» ¸ðµÎ Áö¿î´Ù. + ´ÙÀ½ ¿¹Á¦¸¦ »ìÆ캸ÀÚ:

    + +

    + IndexOptions +ScanHTMLTitles -IconsAreLinks FancyIndexing
    + IndexOptions +SuppressSize +

    + +

    ¾Õ¿¡ ¾Æ¹«°Íµµ ¾ø´Â FancyIndexingÀÌ ÀÌÀüÀÇ + Á¡ÁøÀûÀÎ ¼³Á¤À» Áö¿ö¹ö·ÈÁö¸¸ ¼³Á¤ÀÌ ´Ù½Ã Ãß°¡µÇ¿© °á°ú´Â + IndexOptions FancyIndexing +SuppressSize¿Í °°´Ù.

    + +

    ƯÁ¤ µð·ºÅ丮¿¡ ´ëÇØ ¹«Á¶°ÇÀûÀÎ + IndexOptions¸¦ ¼³Á¤ÇÏ·Á¸é Å°¿öµå + ¾Õ¿¡ +³ª -¸¦ »ç¿ëÇÏÁö¸»°í + »ó¼ÓµÈ ¼³Á¤À» Áö¿î´Ù.

    +
    +
    + +
    +
    top
    +

    IndexOrderDefault Áö½Ã¾î

    + + + + + + + + +
    ¼³¸í:µð·ºÅ丮 ¸ñ·ÏÀÇ ±âº» ¼ø¼­¸¦ ¼³Á¤ÇÑ´Ù
    ¹®¹ý:IndexOrderDefault Ascending|Descending +Name|Date|Size|Description
    ±âº»°ª:IndexOrderDefault Ascending Name
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®, directory, .htaccess
    Override ¿É¼Ç:Indexes
    »óÅÂ:Base
    ¸ðµâ:mod_autoindex
    +

    IndexOrderDefault Áö½Ã¾î´Â FancyIndexing + ¸ñ·Ï ¿É¼Ç°ú ÇÔ²² »ç¿ëÇÑ´Ù. ±âº»ÀûÀ¸·Î fancyindexed µð·ºÅ丮 + ¸ñ·ÏÀº ÆÄÀÏ¸í ¿À¸§Â÷¼øÀÌ´Ù. IndexOrderDefault´Â + ÀÌ Ãʱ⠼ø¼­¸¦ º¯°æÇÒ ¼ö ÀÖ´Ù.

    + +

    IndexOrderDefault´Â µÎ ¾Æ±Ô¸ÕÆ®¸¦ + ¹Þ´Â´Ù. ù¹ø°´Â ¼ø¼­ÀÇ ¹æÇâÀ» Áö½ÃÇÏ´Â Ascending + (¿À¸¥Â÷¼ø) À̳ª Descending (³»¸²Â÷¼ø) Áß Çϳª´Ù. + µÎ¹ø° ¾Æ±Ô¸ÕÆ®´Â ÀÏÂ÷ ¼ø¼­¸¦ ³ªÅ¸³»´Â Å°¿öµå Name, + Date, Size, Description + Áß Çϳª´Ù. ÀÌÂ÷ ¼ø¼­´Â Ç×»ó ÆÄÀÏ¸í ¿À¸§Â÷¼øÀÌ´Ù.

    + +

    ÀÌ Áö½Ã¾î¿Í SuppressColumnSorting ¸ñ·Ï ¿É¼ÇÀ» °°ÀÌ »ç¿ëÇϸé + ƯÁ¤ ¼ø¼­·Î¸¸ µð·ºÅ丮 ¸ñ·ÏÀ» ¸¸µç´Ù. ÀÌ °æ¿ì Ŭ¶óÀ̾ðÆ®´Â + ´Ù¸¥ ¼ø¼­·Î µð·ºÅ丮 ¸ñ·ÏÀ» ¿äûÇÏÁö ¸øÇÑ´Ù.

    + +
    +
    top
    +

    ReadmeName Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:ÆÄÀϸñ·Ï ¸¶Áö¸·¿¡ »ðÀÔÇÒ ÆÄÀÏÀÇ À̸§
    ¹®¹ý:ReadmeName filename
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®, directory, .htaccess
    Override ¿É¼Ç:Indexes
    »óÅÂ:Base
    ¸ðµâ:mod_autoindex
    +

    ReadmeName Áö½Ã¾î´Â ÆÄÀϸñ·Ï ³¡¿¡ + »ðÀÔÇÒ ÆÄÀÏÀÇ À̸§À» ÁöÁ¤ÇÑ´Ù. FilenameÀº Æ÷ÇÔÇÒ + ÆÄÀϸíÀÌ°í, ¸ñ·ÏÀ» ¸¸µé·Á´Â À§Ä¡ÀÇ »ó´ë°æ·Î·Î ¹Þ¾ÆµéÀδÙ. + FilenameÀÌ ½½·¡½¬·Î ½ÃÀÛÇϸé DocumentRoot¿¡ »ó´ë°æ·Î·Î ¹Þ¾ÆµéÀδÙ. +

    + +

    ¿¹Á¦

    + ReadmeName FOOTER.html +

    + +

    ¿¹Á¦ 2

    + ReadmeName /include/FOOTER.html +

    + +

    ÀÌ µ¿ÀÛÀ» ÀÚ¼¼È÷ ¼³¸íÇÑ HeaderNameµµ Âü°íÇ϶ó.

    + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_autoindex.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_autoindex.html.tr.utf8 new file mode 100644 index 00000000..508220af --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_autoindex.html.tr.utf8 @@ -0,0 +1,889 @@ + + + +mod_autoindex - Apache HTTP Sunucusu + + + + + + +
    <-
    + +
    +

    Apache Modülü mod_autoindex

    +
    +

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

    +
    + + + +
    Açıklama:Unix ls veya Win32 dir kabuk komutunun +yaptığı gibi dizin içeriğini listeler.
    Durum:Temel
    Modül Betimleyici:autoindex_module
    Kaynak Dosyası:mod_autoindex.c
    +

    Özet

    + +

    Bir dizin içerik dosyası iki kaynaktan gelebilir:

    + +
      +
    • Kullanıcı tarafından yazılmış ve genellikle index.html + adında bir dosya olarak. Dosyanın ismi DirectoryIndex yönergesi ile belirlenir ve + mod_dir tarafından denetlenir.
    • + +
    • Kullanıcı tarafından böyle bir dosya sağlanmadığı takdirde dizin + içerik listesini sunucu üretir. Diğer yönergeler bu listenin biçemini + belirler. Listede gösterilen dosya türü simgeleri AddIcon, AddIconByEncoding ve AddIconByType yönergeleri ile + belirlenir. Bunlar mod_autoindex tarafından + denetlenir.
    • +
    + +

    İki işlev birbirinden ayrı tutulmuştur, böylece kendiliğinden içerik + listesi üretimi tamamen iptal edilebilir (veya değiştirilebilir).

    + +

    Kendiliğinden içerik listesi üretimi Options +Indexes ile + etkin kılınabilir. Daha fazla bilgi için Options yönergesinin açıklamasına bakınız.

    + +

    IndexOptions yönergesi + FancyIndexing + seçeneği ile kullanılmışsa sütun başlıkları listenin sıralamasını + sütundaki sıralamaya göre değiştirecek hiper bağlar haline getirilir + (süslü liste). Aynı başlığa peşpeşe tıklamak suretiyle sıralamayı + büyükten küçüğe veya tersine değiştirebilirsiniz. Bu sütun başlığı + bağlarının oluşturulması IndexOptions yönergesi SuppressColumnSorting seçeneği ile kullanılarak + engellenebilir.

    + +

    Boyuta göre sıralamada daima dosyanın asıl boyutuna bakılır. + Dolayısıyla ikisi de "1K" olarak gösterilen iki dosyadan 1010 baytlık + olanı küçükten büyüğe sıralamada 1011 baytlıktan önce + gösterilecektir.

    +
    + +
    top
    +
    +

    Sütun Sıralamada Sorgu Seçenekleri

    + + +

    Apache 2.0.23’te Sütun Sıralama için Sorgu Seçenekleri yeniden + düzenlenip tamamen yeni bir sorgu seçenekleri grubu oluşturulmuştur. + Çıktı üzerinde kullanıcı denetimini tamamen ortadan kaldırmak için + IndexOptions yönergesinin + IgnoreClient + seçeneği kullanılabilir.

    + +

    Sütun sıralama başlıklarının her biri hedefi kendisi olan birer hiper + bağ olup aşağıda sıralanan sorgu seçeneklerini kullanırlar. Bu + seçeneklerin her biri her dizin içerik listesi isteğine eklenebilir.

    + +
      +
    • C=N dizini dosya adına göre sıralar
    • + +
    • C=M dizini son değişiklik zamanına ve ardından dosya + ismine göre sıralar.
    • + +
    • C=S dizini boyuta ve ardından dosya adına göre + sıralar
    • + +
    • C=D dizini açıklamaya ve ardından + dosya adına göre sıralar.
    • + +
    • O=A artan sıralama uygulanır.
    • + +
    • O=D azalan sıralama uygulanır.
    • + +
    • F=0 listeleme basit listeleme biçiminde yapılır + (FancyIndexing seçeneği ile etkinleştirilen biçimde + değil)
    • + +
    • F=1 listeleme FancyIndexing seçeneği ile + etkinleştirilen biçimde yapılır
    • + +
    • F=2 listeleme FancyIndexing ve + HTMLTable seçeneği + ile etkinleştirilen biçimde yapılır.
    • + +
    • V=0 sürüme göre sıralama iptal edilir.
    • + +
    • V=1 sürüme göre sıralama etkin + kılınır.
    • + +
    • P=kalıp sadece belirtilen + kalıp ile eşleşen dosyalar istelenir.
    • +
    + +

    P=kalıp sorgu seçeneğinin normalde IndexIgnore yönergesi işleme + sokulduktan sonra değerlendirildiğine ve dosya isimlerinin diğer + kendiliğinden içerik listeleme koşullarının konusu olmaya devam ettiğine + dikkat ediniz. mod_autoindex modülündeki Sorgu + Seçenekleri çözümleyicisi tanımadığı bir seçeneğe rastlar rastlamaz + işlemi durdurur. Sorgu Seçenekleri yukarıda belirtilene uygun olarak iyi + biçimli olmak zorundadır.

    + +

    Aşağıdaki basit örnekte sorgu seçeneklerinin kullanımı gösterilmiştir. + Son satırda bulunan "submit" düğmesindeki tanınmayan "X" girdisine + dikkat ediniz. "X=Göster" girdisi tüm seçenekler işlendikten sonra + mod_autoindex tarafından son argüman olarak ele + alınacak ve çözümleme işlemi o noktada duracaktır.

    + +
    +<form action="" method="get">
    +  <input type="text" name="P" value="*" /> ile eşleşen
    +  <select name="C">
    +    <option value="N" selected="selected">isme</option>
    +    <option value="M"> değişiklik tarihine</option>
    +    <option value="S"> boyuta</option>
    +    <option value="D"> açıklamaya</option>
    +  </select> göre
    +  <select name="O">
    +    <option value="A" selected="selected"> artan</option>
    +    <option value="D"> azalan</option>
    +  </select>
    +  <select name="V">
    +    <option value="0" selected="selected">normal</option>
    +    <option value="1"> sürümlü</option>
    +  </select> sıralamayla bir
    +  <select name="F">
    +    <option value="0"> basit liste</option>
    +    <option value="1" selected="selected"> süslü liste</option>
    +    <option value="2"> tablolu liste</option>
    +  </select>
    +  <input type="submit" name="X" value="Göster" />
    +</form>
    + +
    +
    top
    +

    AddAlt Yönergesi

    + + + + + + + +
    Açıklama:Dosyaya göre seçilen simgenin yerinde gösterilecek metni belirler. +
    Sözdizimi:AddAlt metin dosya [dosya] ...
    Bağlam:sunucu geneli, sanal konak, dizin, .htaccess
    Geçersizleştirme:Indexes
    Durum:Temel
    Modül:mod_autoindex
    +

    AddAlt yönergesi, FancyIndexing seçeneğiyle + üretilen dizin listesinde bir dosya simgesinin yerinde gösterilecek + metni belirler. dosya olarak dosya türünü + betimleyecek bir dosya uzantısı, dosya isminin bir kısmı, bir dosya ismi + kalıbı veya tam yoluyla bir dosya ismi belirtilebilir. Eğer + metin boşluk karakterleri içeriyorsa tırnak içine + (" veya ') alınmalıdır. Simge metni, simge + bulunamadığı veya istemci resim gösteremediği takdirde ya da kullanıcı + resim yüklememeyi tercih etmişse gösterilir.

    + +

    Örnekler

    + AddAlt "PDF dosya" *.pdf
    + AddAlt Sıkıştırılmış *.gz *.zip *.Z +

    + +
    +
    top
    +

    AddAltByEncoding Yönergesi

    + + + + + + + +
    Açıklama:Dosyanın MIME kodlamasına göre seçilen simgenin yerinde +gösterilecek metni belirler.
    Sözdizimi:AddAltByEncoding metin MIME-kodlaması +[MIME-kodlaması] ...
    Bağlam:sunucu geneli, sanal konak, dizin, .htaccess
    Geçersizleştirme:Indexes
    Durum:Temel
    Modül:mod_autoindex
    +

    AddAltByEncoding yönergesi, FancyIndexing seçeneğiyle + üretilen dizin listesinde bir dosya simgesinin yerinde gösterilecek + metni belirler. MIME-kodlaması olarak + x-compress gibi geçerli bir içerik kodlaması + belirtilmelidir. Eğer metin boşluk karakterleri + içeriyorsa tırnak içine (" veya ') + alınmalıdır. Simge metni simge bulunamadığı veya istemci resim + gösteremediği takdirde ya da kullanıcı resim yüklememeyi tercih etmişse + gösterilir.

    + +

    Örnek

    + AddAltByEncoding gzip x-gzip +

    + +
    +
    top
    +

    AddAltByType Yönergesi

    + + + + + + + +
    Açıklama:Dosyanın MIME türüne göre seçilen simgenin yerinde gösterilecek +metni belirler.
    Sözdizimi:AddAltByType metin MIME-türü +[MIME-türü] ...
    Bağlam:sunucu geneli, sanal konak, dizin, .htaccess
    Geçersizleştirme:Indexes
    Durum:Temel
    Modül:mod_autoindex
    +

    AddAltByType yönergesi, FancyIndexing seçeneğiyle + üretilen dizin listesinde bir dosya simgesinin yerinde gösterilecek + metni belirler. MIME-türü olarak + text/html gibi geçerli bir içerik türü belirtilmelidir. + Eğer metin boşluk karakterleri içeriyorsa tırnak + içine (" veya ') alınmalıdır. Simge metni + simge bulunamadığı veya istemci resim gösteremediği takdirde ya da + kullanıcı resim yüklememeyi tercih etmişse gösterilir.

    + +

    Örnek

    + AddAltByType 'salt metin' text/plain +

    + +
    +
    top
    +

    AddDescription Yönergesi

    + + + + + + + +
    Açıklama:Bir dosya için gösterilecek açıklama belirtilir.
    Sözdizimi:AddDescription metin dosya [dosya] ...
    Bağlam:sunucu geneli, sanal konak, dizin, .htaccess
    Geçersizleştirme:Indexes
    Durum:Temel
    Modül:mod_autoindex
    +

    Yönerge, FancyIndexing seçeneğiyle üretilen dizin listesinde bir + dosya için gösterilecek açıklamayı belirler. dosya + olarak dosya türünü betimleyecek bir dosya uzantısı, dosya isminin bir + kısmı, bir dosya ismi kalıbı veya tam yoluyla bir dosya ismi + belirtilebilir. Eğer dosya açıklamasını içeren + metin boşluk karakterleri içeriyorsa çift tırnak + (") içine alınmalıdır.

    + +

    Örnek

    + AddDescription "Mars Gezegeni" /resimler/mars.gif +

    + +

    Normalde öntanımlı açıklama alanının genişliği 23 bayttır. IndexOptions SuppressIcon + seçeneği buna 6 bayt daha ekler; IndexOptions SuppressSize + seçeneği 7 bayt, IndexOptions SuppressLastModified seçeneği ise 19 bayt + ekler. Böylece en fazla 55 karakterlik öntanımlı sütun genişliğine + ulaşılabilir.

    + +

    Açıklama sütununun öntanımlı genişliği geçersiz kılınabilir hatta + sınırsız açıklama uzunluğu atanabilir. Bu konu için IndexOptions yönergesinin DescriptionWidth + seçeneğinin açıklamasına bakınız.

    + +

    Önemli

    +

    AddDescription ile tanımlanan açıklama metni + HTML etiketleri ve karakter öğeleri içerebilir. Eğer açıklama + sütununun genişlik sınırlamasından dolayı bir HTML etiketinin içeriği + kırpılırsa bu durum dizin listesinin kalanını etkileyebilir (örneğin, + kalın gösterim listenin kalanına yayılabilir).

    +
    + +
    +
    top
    +

    AddIcon Yönergesi

    + + + + + + + +
    Açıklama:Bir dosya için gösterilecek simgeyi dosya adına göre belirler. +
    Sözdizimi:AddIcon simge isim [isim] +...
    Bağlam:sunucu geneli, sanal konak, dizin, .htaccess
    Geçersizleştirme:Indexes
    Durum:Temel
    Modül:mod_autoindex
    +

    Yönerge, FancyIndexing seçeneğiyle üretilen dizin listesinde adı + isim ile biten bir dosya için gösterilecek simgeyi + belirler. simge ya simgenin göreli URL’si (% + öncelemeli) ya da (alt-metin,url) + biçeminde olmalıdır; buradaki alt-metin simge + gösterilemediği durumda tarayıcı tarafından simgenin yerinde + gösterilecek metindir.

    + +

    isim olarak ya (listeyi düzgün biçemlemek + amacıyla) dizinler için ^^DIRECTORY^^, boş satırlar için + ^^BLANKICON^^ ya da dosya türünü betimleyecek bir dosya + uzantısı, dosya isminin bir kısmı, bir dosya ismi kalıbı veya tam + yoluyla bir dosya ismi belirtilebilir.

    + +

    Örnekler

    + AddIcon (IMG,/icons/image.xbm) .gif .jpg .xbm
    + AddIcon /icons/dir.xbm ^^DIRECTORY^^
    + AddIcon /icons/backup.xbm *~ +

    + +

    Mümkünse AddIcon yerine AddIconByType yönergesi tercih + edilmelidir.

    + +
    +
    top
    +

    AddIconByEncoding Yönergesi

    + + + + + + + +
    Açıklama:Bir dosya için gösterilecek simgeyi dosyanın MIME kodlamasına +göre belirler.
    Sözdizimi:AddIconByEncoding simge MIME-kodlaması +[MIME-kodlaması] ...
    Bağlam:sunucu geneli, sanal konak, dizin, .htaccess
    Geçersizleştirme:Indexes
    Durum:Temel
    Modül:mod_autoindex
    +

    Yönerge, FancyIndexing seçeneğiyle üretilen dizin listesinde bir + dosya için gösterilecek simgeyi belirler. simge ya + simgenin göreli URL’si (% öncelemeli) ya da + (alt-metin,url) biçeminde olmalıdır; + buradaki alt-metin simge gösterilemediği durumda + tarayıcı tarafından simgenin yerinde gösterilecek metindir.

    + +

    MIME-kodlaması olarak x-compress + gibi geçerli bir içerik kodlaması belirtilmelidir.

    + +

    Örnek

    + AddIconByEncoding /icons/compress.xbm x-compress +

    + +
    +
    top
    +

    AddIconByType Yönergesi

    + + + + + + + +
    Açıklama:Bir dosya için gösterilecek simgeyi dosyanın MIME türüne göre +belirler.
    Sözdizimi:AddIconByType simge MIME-türü +[MIME-türü] ...
    Bağlam:sunucu geneli, sanal konak, dizin, .htaccess
    Geçersizleştirme:Indexes
    Durum:Temel
    Modül:mod_autoindex
    +

    Yönerge, FancyIndexing seçeneğiyle üretilen dizin listesinde MIME + türü MIME-türü olarak belirtilen bir dosya için + gösterilecek simgeyi belirler. simge ya simgenin + göreli URL’si (% öncelemeli) ya da + (alt-metin,url) biçeminde olmalıdır; + buradaki alt-metin simge gösterilemediği durumda + tarayıcı tarafından simgenin yerinde gösterilecek metindir.

    + +

    MIME-türü MIME türleri ile eşleşen bir dosya kalıbı ifadesi + olabilir.

    + +

    Örnek

    + AddIconByType (IMG,/icons/image.xbm) image/* +

    + +
    +
    top
    +

    DefaultIcon Yönergesi

    + + + + + + + +
    Açıklama:Özel bir simge atanmamış dosyalar için gösterilecek simgeyi +belirler.
    Sözdizimi:DefaultIcon URL-yolu
    Bağlam:sunucu geneli, sanal konak, dizin, .htaccess
    Geçersizleştirme:Indexes
    Durum:Temel
    Modül:mod_autoindex
    +

    The DefaultIcon yönergesi FancyIndexing seçeneğiyle + üretilen dizin listesinde özel bir simge atanmamış dosyalar için + gösterilecek simgeyi belirler. URL-yolu simgeye + bir göreli URL (% öncelemeli) belirtir.

    + +

    Örnek

    + DefaultIcon /icon/unknown.xbm +

    + +
    +
    top
    +

    HeaderName Yönergesi

    + + + + + + + +
    Açıklama:Dizin listesinin tepesine yerleştirilecek dosyanın ismini +belirler.
    Sözdizimi:HeaderName dosya-ismi
    Bağlam:sunucu geneli, sanal konak, dizin, .htaccess
    Geçersizleştirme:Indexes
    Durum:Temel
    Modül:mod_autoindex
    +

    HeaderName yönergesi, dizin listesinin tepesine + yerleştirilecek dosyanın ismini belirler. Dosyanın ismi + dosya-ismi ile belirtilir.

    + +

    Örnek

    + HeaderName HEADER.html +

    + +
    +

    HeaderName and ReadmeName yönergelerinde + dosya-ismi artık içeriği listelenecek dizine + erişmek için kullanılan bir göreli URL yolu olarak ele alınmaktadır. + Eğer dosya-ismi bir bölü çizgisi ("/") ile + başlıyorsa DocumentRoot + yönergesinde belirtilen dizine göre belirtildiği varsayılır.

    + +

    Örnek

    + HeaderName /include/HEADER.html +

    + +

    dosya-ismi, içerik türü text/* + (text/html, text/plain gibi) olan bir belge + olarak çözümlenmelidir. Yani, aşağıdaki örnekteki gibi betiğin asıl + dosya türü text/html olarak imlenmişse + dosya-ismi bir CGI betiğinin ismi bile + olabilir:

    + +

    + AddType text/html .cgi +

    + +

    Options ile + MultiViews etkin kılınmışsa dosyaya içerik dili uzlaşımı da + uygulanabilir. dosya-ismi ile belirtilen dosya + text/html türünde durağan bir belge (bir CGI betiği + değil) ise ve options ile + Includes ve IncludesNOEXEC seçeneklerinden + biri belirtilmişse dosya bir SSI sayfası olarak ele alınır + (mod_include belgesine bakınız).

    +
    + +

    Eğer yönergede belirtilen dosya bir HTML belge gibi başlıyorsa + (<html>, <head>, vs.) ve bu etiketlerin yinelenmemesini + istiyorsanız IndexOptions +SuppressHTMLPreamble ataması yapmanız + gerekecektir.

    + +
    +
    top
    +

    IndexIgnore Yönergesi

    + + + + + + + +
    Açıklama:Dizin içerik listesinden gizlenecek dosyaların listesi belirtilir. +
    Sözdizimi:IndexIgnore dosya [dosya] ...
    Bağlam:sunucu geneli, sanal konak, dizin, .htaccess
    Geçersizleştirme:Indexes
    Durum:Temel
    Modül:mod_autoindex
    +

    IndexIgnore yönergesi, dizin içerik listesinden + gizlenecek dosyaların listesini belirtmek için kullanılır. + dosya olarak kabuk tarzı bir dosya ismi kalıbı + veya tam yoluyla bir dosya ismi belirtilebilir. Evvelce yapılmış bir + atamada değişiklik yapmak yerine birden fazla + IndexIgnore ataması yapabilirsiniz. Liste + öntanımlı olarak içinde bulunulan dizini (./) içerir.

    + +

    + IndexIgnore README .htaccess *.bak *~ +

    + +
    +
    top
    +

    IndexOptions Yönergesi

    + + + + + + + +
    Açıklama:Dizin içerik listesini yapılandıracak seçenekler belirtilir. +
    Sözdizimi:IndexOptions [+|-]seçenek [[+|-]seçenek] +...
    Bağlam:sunucu geneli, sanal konak, dizin, .htaccess
    Geçersizleştirme:Indexes
    Durum:Temel
    Modül:mod_autoindex
    +

    IndexOptions yönergesi dizin içerik listesinin + davranışını belirler. seçenek olarak şunlar + belirtilebilir:

    + +
    +
    Charset=karakter-kümesi (Apache 2.0.61 + ve sonrası)
    + +
    Charset seçeneği üretilen sayfa için bir karakter + kümesi belirtebilmenizi sağlar. Dizinin bulunduğu dosya sisteminin + karakter kodlamasına bağlı olarak öntanımlı değeri ya + ISO-8859-1 ya da UTF-8’dir. + +

    Örnek

    + IndexOptions Charset=UTF-8 +

    +
    + +
    Type=MIME-türü (Apache 2.0.61 ve + sonrası)
    + +
    Type seçeneği üretilen sayfa için bir MIME türü + belirtebilmenizi sağlar. Öntanımlı değer text/html’dir. + +

    Örnek

    + IndexOptions Type=text/plain +

    +
    + +
    DescriptionWidth=[n | *] + (Apache 2.0.23 ve sonrası)
    + +

    DescriptionWidth seçeneği üretilen sayfada açıklama + sütununun genişliğini sizin belirleyebilmenizi sağlar. Bu seçenek + kullanılmadığında veya -DescriptionWidth olarak + belirtildiğinde uygun genişliği mod_autoindex + hesaplar.

    + +

    DescriptionWidth=n ile açıklama sütununun + genişliği n baytla sınırlanır.

    + +

    DescriptionWidth=* ile açıklama sütununun genişliği en + uzun açıklama metni sığacak şekilde arttırılır.

    + +

    Sütun genişliğinin sabitliği nedeniyle metnin + kırpılmasından kaynaklanan sorunlar için AddDescription yönergesinin + açıklamasına bakınız.

    + +
    FancyIndexing
    + +
    Dizin içerik listesi süslü olur.
    + +
    FoldersFirst + (Apache 2.0.23 ve sonrası)
    + +
    Bu seçenek etkin kılındığında dizin içerik listesinde alt dizinler + dosyalardan önce listelenir. Listelemede genel olarak iki bileşen + vardır: Alt dizinler ve dosyalar. Her biri kendi arasında sıraya + dizilir ve alt dizinlerin tamamı dosyalardan önce gösterilir. Örneğin + sıralama isme göre azalan sırada yapılıyorsa ve + FoldersFirst etkinse Zed dizini listede + Beta dizininden ve Gamma ve + Alpha dosyalarından önce yer alacaktır. Bu + seçenek sadece FancyIndexing seçeneği etkinse etkili + olacaktır.
    + +
    HTMLTable + (Deneysel, Apache 2.0.23 ve sonrası)
    + +
    Bu deneysel seçenek FancyIndexing seçeneği ile birlikte süslü listeleme + için basit bir tablo oluşturur. Fakat bu eski tarayıcıları yanıltır. + Bununla birlikte, Linux, WinNT gibi sağdan sola veya soldan sağa yazım + yönünün UTF-8 karakter koduna göre değiştiği platformlarda dosya + isimleri ve açıklamalar için bu özellikle gerekli olabilir.
    + +
    IconsAreLinks
    + +
    Bu seçenek FancyIndexing seçeneği ile birlikte süslü + listelemede dosya simgesini dosyaya bir hiper bağ haline getirir.
    + +
    IconHeight[=benek-sayısı]
    + +
    Bu seçeneğin varlığı IconWidth seçeneği ile + kullanıldığında dosya simgesinin img etiketinin + height ve width özniteliklerini içermesine + sebep olur. Böylece tarayıcının tüm simgelerin yüklenmesini beklemeden + sayfa yerleşimi için bir ön hesaplama yapabilmesi mümkün olur. Seçenek + bir değer belirtilmeksizin kullanıldığında Apache tarafından atanmış + standart simge yüksekliği öntanımlıdır.
    + +
    IconWidth[=benek-sayısı]
    + +
    Bu seçeneğin varlığı IconHeight seçeneği ile + kullanıldığında dosya simgesinin img etiketinin + height ve width özniteliklerini içermesine + sebep olur. Böylece tarayıcının tüm simgelerin yüklenmesini beklemeden + sayfa yerleşimi için bir ön hesaplama yapabilmesi mümkün olur. Seçenek + bir değer belirtilmeksizin kullanıldığında Apache tarafından atanmış + standart simge genişliği öntanımlıdır.
    + +
    IgnoreCase
    + +
    Bu seçenek etkin kılındığında isimler harf büyüklüğüne duyarsız + sıralanır. Örneğin, isme göre artan sıralamada IgnoreCase + etkinse Zeta dosyası alfa dosyasından sonra listelenir (Dikkat: GAMMA + daima gamma’dan önce listelenir.)
    + +
    IgnoreClient
    + +
    Bu seçenek mod_autoindex’in listenin sıralanmasına + etki edenler dahil tüm sorgu değişkenlerini yoksaymasına sebep olur + (örtük olarak SuppressColumnSorting uygulanır).
    + +
    NameWidth=[n | *]
    + +

    NameWidth seçeneği dosya ismi sütunu için bir + genişlik belirtebilmenizi mümkün kılar.

    + +

    Hiç belirtilmediğinde veya -NameWidth biçeminde + belirtildiğinde mod_autoindex uygun genişliği kendisi + hesaplayacaktır.

    + +

    NameWidth=n ile sütun genişliği + n bayt genişlikte sabitlenir.

    + +

    NameWidth=* olduğunda ise sütun genişliği en geniş + satırın sığacağı kadar arttırılır.

    + +
    ScanHTMLTitles
    + +
    Bu seçenek süslü listeleme için HTML belgelerden sayfa başlığının + okunmasını sağlar. Dosya için AddDescription ile bir açıklama tanımlanmımışsa httpd + belgenin title etiketinin içeriğini okuyacaktır. Bu + seçenek işlemciyi ve diski fazla meşgul eder.
    + +
    SuppressColumnSorting
    + +
    Bu seçenek belirtilmişse Apache, süslü dizin listesinde sütun + başlıklarını sıralama için hiper bağ haline getirmeyecektir. Sütun + başlıkları için öntanımlı davranış hiper bağ olmak olup bunlar + seçilerek dizin listesinin o sütundaki değerlere göre sıralanması + sağlanır. Apache 2.0.23 öncesinde, bu seçenek ayrıca, sıralama + dizgesi için sorgu sözcüklerinin çözümlenmesini de iptal + ederdi. Bu davranış Apache 2.0.23’ten beri IndexOptions + IgnoreClient ile sağlanmaktadır.
    + +
    SuppressDescription
    + +
    Süslü listelemede dosya açıklamalarının gösterilmesini engeller. + Öntanımlı olarak hiçbir dosya açıklaması tanımlı değildir, dolayısıyla + bu seçenek kullanılarak ekran genişliğinden 23 karakterlik yer + kazanılabilir. Dosya açıklamalarının nasıl belirlendiğini öğrenmek + için AddDescription + yönergesinin açıklamasına bakınız. Ayrıca, açıklama sütununun + genişliğini ayarlayan DescriptionWidth dizin listeleme seçeneğine de + bakınız.
    + +
    SuppressHTMLPreamble
    + +
    Eğer dizin aslında HeaderName yönergesi ile belirtilmiş bir dosya içeriyorsa + modül normal olarak bu dosyanın içeriğinin öncesine HTML başlangıç + etiketlerini (<html>, <head>, + vs.) yerleştirir. Bu seçenek bu davranışı iptal ederek modülün dosya + içeriğinin başlangıcına bir şey eklememesini sağlar. Bu durumda başlık + dosyasının uygun HTML etiketlerini içermesi gerekir. Böyle bir başlık + dosyası yoksa normal olarak HTML başlangıç etiketleri üretilir.
    + +
    SuppressIcon + (Apache 2.0.23 ve sonrası)
    + +
    Süslü dizin listesinde dosya simgelerinin gösterilmesini engeller. + Son belirtim, süslü dizin listelemede kullanılan pre + etiketinin içeriğinde img ve hr + etiketlerinin bulunmasına izin vermediğinden SuppressIcon + ve SuppressRules seçenekleri birlikte kullanılarak HTML + 3.2 belirtimine uyum sağlanır.
    + +
    SuppressLastModified
    + +
    Süslü dizin listelemede son değişiklik tarihinin gösterilmesi + engellenir.
    + +
    SuppressRules + (Apache 2.0.23 ve sonrası)
    + +
    Dizin listelemede hr etiketinin kullanımını engeller. + Son belirtim, süslü dizin listelemede kullanılan pre + etiketinin içeriğinde img ve hr + etiketlerinin bulunmasına izin vermediğinden SuppressIcon + ve SuppressRules seçenekleri birlikte kullanılarak HTML + 3.2 belirtimine uyum sağlanır.
    + +
    SuppressSize
    + +
    Süslü dizin listelemede dosya boyutunun gösterilmesi engellenir.
    + +
    TrackModified + (Apache 2.0.23 ve sonrası)
    + +
    Bu seçenek listelenen dizin için HTTP başlığında + Last-Modified ve ETag alanlarının dönmesini + sağlar. Sadece işletim sistemi veya dosya sistemi uygun stat() + sonuçlarını döndürüyorsa bu geçerlidir. Bazı Unix sistemleri, OS2’nin + JFS’si ve Win32’nin NTFS’i böyledir. Ancak OS2 ve Win32 FAT dosya + sistemleri böyle değildir. Bu özellik etkin kılındığında istemci veya + vekil HEAD istekleriyle dosya listesindeki değişiklikleri + izleyebilirler. Yalnız, bazı işletim sistemlerinin yeni ve silinmiş + dosyaların izini iyi sürdüğü halde dizin içindeki dosyaların boyut ve + tarih değişikliklerini izlemediklerine dikkat ediniz. Mevcut + bir dosyanın boyut ve zaman damgasındaki değişiklikler + Last-Modified başlığının güncellenmesini tüm Unix + sistemlerinde sağlamaz. Bu gibi durumlarda bu seçeneğin + kapalı kalması daha iyidir.
    + +
    VersionSort + (Apache 2.0a3 ve sonrası)
    + +
    VersionSort seçeneği isimlerinde sürüm numarası bulunan + dosyaların sayısal sıralamaya uygun olarak sıralanmalarını sağlar. + Normalde sıralama karakter sıralamasına göre yapılır, ardından sürüm + numaralı dosyalar veya açıklamalar kendi aralarında sayısal sıralamaya + tabi tutulur. + +

    Örnek:

    + foo-1.7
    + foo-1.7.2
    + foo-1.7.12
    + foo-1.8.2
    + foo-1.8.2a
    + foo-1.12 +

    + +

    Sıfır ile başlalan numaralara ondalık sayı muamelesi yapılır:

    + +

    + foo-1.001
    + foo-1.002
    + foo-1.030
    + foo-1.04 +

    +
    + +
    XHTML + (Apache 2.0.49 ve sonrası)
    + +
    XHTML seçeneği mod_autoindex’in kodu + HTML 3.2’ye değil XHTML 1.0’a uygun üretmesini sağlar.
    +
    + + +
    + veya - Önekli Seçenekler
    +
    +

    Apache 1.3.3’te IndexOptions yönergelerinin ele + alınışıyla ilgili önemil değişiklikler yapılmıştır. Bunlar:

    + +
      +
    • Tek bir dizin için çok sayıda IndexOptions + yönergesi belirtilmişse bunlar ayrı ayrı değil birlikte ele alınır. + Yani, + +

      + <Directory /foo> + + IndexOptions HTMLTable
      + IndexOptions SuppressColumnsorting +
      + </Directory> +

      + +

      yapılandırmasındaki IndexOptions + yönergeleri

      + +

      + IndexOptions HTMLTable SuppressColumnsorting +

      + +

      yönergesine eşdeğerdir.

      +
    • + +
    • Seçeneklerde + veya - önekleri + kullanılabilmektedir.
    • +
    + +

    + veya - önekli seçeneklere rastlandığında + bunlar mevcut (üst dizinden miras alınanlar ve/veya önceki atamalar) + IndexOptions yönergelerine uygulanır. Ancak, + önek kullanılmamış bir seçeneğe raslandığında, o noktada önceki ve + miras alınmış bu tür seçenekler iptal edilir. Şu örneği ele alalım:

    + +

    + IndexOptions +ScanHTMLTitles -IconsAreLinks FancyIndexing
    + IndexOptions +SuppressSize +

    + +

    Bunun net etkisi IndexOptions FancyIndexing +SuppressSize + atamasına eşdeğerdir, çünkü öneksiz FancyIndexing seçeneği + kendinden önceki önekli seçenekleri iptal etmiş fakat hemen ardından + eklenmelerine izin vermiştir.

    + +

    Belli bir dizine önceki seçenekleri temizleyerek koşulsuz olarak + tamamen yeni seçenekler atamak istiyorsanız + IndexOptions yönergesinde seçenekleri + + veya - öneklerini kullanmadan + belirtiniz.

    +
    +
    + +
    +
    top
    +

    IndexOrderDefault Yönergesi

    + + + + + + + + +
    Açıklama:Dizin içerik listesinin öntanımlı sıralamasını belirler. +
    Sözdizimi:IndexOrderDefault Ascending|Descending +Name|Date|Size|Description
    Öntanımlı:IndexOrderDefault Ascending Name
    Bağlam:sunucu geneli, sanal konak, dizin, .htaccess
    Geçersizleştirme:Indexes
    Durum:Temel
    Modül:mod_autoindex
    +

    IndexOrderDefault yönergesi FancyIndexing seçeneğinin + etkin olduğu durumda işe yarar. Öntanımlı olarak süslü listelemede dizin + içeriği dosya ismine göre artan sıralamayla listelenir. + IndexOrderDefault yönergesi bu öntanımlı + sıralamanın değiştirilmesini mümkün kılar.

    + +

    IndexOrderDefault yönergesi iki değer alır. İlki + sıralama yönünü belirtmek üzere Ascending (küçükten büyüğe) + veya Descending (büyükten küçüğe) olmak zorundadır. İkinci + değer ise birincil sıralama anahtarını belirtmek üzere Name, + Date, Size ve Description + sözcüklerinden biri olmalıdır (anlamları sırayla: İsim, Tarih, Boyut, + Açıklama). İkincil sıralama anahtarı daima artan sıralamayla + dosya ismidir.

    + +

    Dizin listesinin belli bir sırada gösterilmesini zorunlu kılmak için + yönergeyi SuppressColumnSorting sıralama seçeneği ile birlikte + belirtebilirsiniz; böylece, istemcinin farklı sıralamalara sahip içerik + isteğini engellemiş olursunuz.

    + +
    +
    top
    +

    ReadmeName Yönergesi

    + + + + + + + +
    Açıklama:Dizin listesinin sonuna yerleştirilecek dosyanın ismini +belirler.
    Sözdizimi:ReadmeName dosya-ismi
    Bağlam:sunucu geneli, sanal konak, dizin, .htaccess
    Geçersizleştirme:Indexes
    Durum:Temel
    Modül:mod_autoindex
    +

    ReadmeName yönergesi dizin listesinin sonuna + eklenecek dosyanın ismini belirler. dosya-ismi ile + listeye dahil edilecek dosyanın ismi listelenen dizine göreli olarak + belirtilir. Eğer dosya ismi bir bölü çizgisi ile başlıyorsa DocumentRoot’a göreli belirtildiği + varsayılır.

    + +

    1. Örnek

    + ReadmeName FOOTER.html +

    + +

    2. Örnek

    + ReadmeName /include/FOOTER.html +

    + +

    Ayrıca bu davranışın daha ayrıntılı ele alındığı HeaderName yönergesine de + bakınız.

    + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_cache.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_cache.html new file mode 100644 index 00000000..1960e89c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_cache.html @@ -0,0 +1,9 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_cache.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: mod_cache.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_cache.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_cache.html.en new file mode 100644 index 00000000..8be49fbb --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_cache.html.en @@ -0,0 +1,387 @@ + + + +mod_cache - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_cache

    +
    +

    Available Languages:  en  | + ko 

    +
    + + + +
    Description:Content cache keyed to URIs.
    Status:Experimental
    Module Identifier:cache_module
    Source File:mod_cache.c
    +

    Summary

    + +
    + This module is experimental. Documentation is still under development... +
    + +

    mod_cache implements an RFC 2616 compliant HTTP + content cache that can be used to cache either local or proxied content. + mod_cache requires the services of one or more storage + management modules. Two storage management modules are included in + the base Apache distribution:

    +
    +
    mod_disk_cache
    +
    implements a disk based storage manager.
    + +
    mod_mem_cache
    +
    implements a memory based storage manager. + mod_mem_cache can be configured to operate in two + modes: caching open file descriptors or caching objects in heap storage. + mod_mem_cache can be used to cache locally generated content + or to cache backend server content for mod_proxy when + configured using ProxyPass + (aka reverse proxy)
    +
    + +

    Content is stored in and retrieved from the cache using URI based keys. Content with + access protection is not cached.

    +
    + +
    top
    +
    top
    +
    +

    Sample Configuration

    +

    Sample httpd.conf

    + #
    + # Sample Cache Configuration
    + #
    + LoadModule cache_module modules/mod_cache.so
    +
    + <IfModule mod_cache.c>
    + + #LoadModule disk_cache_module modules/mod_disk_cache.so
    + <IfModule mod_disk_cache.c>
    + + CacheRoot c:/cacheroot
    + CacheSize 256
    + CacheEnable disk /
    + CacheDirLevels 5
    + CacheDirLength 3
    +
    + </IfModule>
    +
    + LoadModule mem_cache_module modules/mod_mem_cache.so
    + <IfModule mod_mem_cache.c>
    + + CacheEnable mem /
    + MCacheSize 4096
    + MCacheMaxObjectCount 100
    + MCacheMinObjectSize 1
    + MCacheMaxObjectSize 2048
    +
    + </IfModule>
    +
    + </IfModule> +

    +
    +
    top
    +

    CacheDefaultExpire Directive

    + + + + + + + +
    Description:The default duration to cache a document when no expiry date is specified.
    Syntax:CacheDefaultExpire seconds
    Default:CacheDefaultExpire 3600 (one hour)
    Context:server config, virtual host
    Status:Experimental
    Module:mod_cache
    +

    The CacheDefaultExpire directive specifies a default time, + in seconds, to cache a document if neither an expiry date nor last-modified date are provided + with the document. The value specified with the CacheMaxExpire + directive does not override this setting.

    + +

    + CacheDefaultExpire 86400 +

    + +
    +
    top
    +

    CacheDisable Directive

    + + + + + + +
    Description:Disable caching of specified URLs
    Syntax:CacheDisable url-string
    Context:server config, virtual host
    Status:Experimental
    Module:mod_cache
    +

    The CacheDisable directive instructs + mod_cache to not cache urls at or below + url-string.

    + +

    Example

    + CacheDisable /local_files +

    + +
    +
    top
    +

    CacheEnable Directive

    + + + + + + +
    Description:Enable caching of specified URLs using a specified storage +manager
    Syntax:CacheEnable cache_type url-string
    Context:server config, virtual host
    Status:Experimental
    Module:mod_cache
    +

    The CacheEnable directive instructs + mod_cache to cache urls at or below + url-string. The cache storage manager is specified with the + cache_type argument. cache_type mem + instructs mod_cache to use the memory based storage + manager implemented by mod_mem_cache. + cache_type disk instructs + mod_cache to use the disk based storage manager + implemented by mod_disk_cache. + cache_type fd instructs + mod_cache to use the file descriptor cache implemented + by mod_mem_cache.

    +

    In the event that the URL space overlaps between different + CacheEnable directives (as in the example below), + each possible storage manager will be run until the first one that + actually processes the request. The order in which the storage managers are + run is determined by the order of the CacheEnable + directives in the configuration file.

    + +

    + CacheEnable mem /manual
    + CacheEnable fd /images
    + CacheEnable disk /
    +

    + +
    +
    top
    +

    CacheForceCompletion Directive

    + + + + + + + +
    Description:Percentage of document served, after which the server +will complete caching the file even if the request is cancelled.
    Syntax:CacheForceCompletion Percentage
    Default:CacheForceCompletion 60
    Context:server config, virtual host
    Status:Experimental
    Module:mod_cache
    +

    Ordinarily, if a request is cancelled while the response is being + cached and delivered to the client the processing of the response will + stop and the cache entry will be removed. The + CacheForceCompletion directive specifies a + threshold beyond which the document will continue to be cached to + completion, even if the request is cancelled.

    + +

    The threshold is a percentage specified as a value between + 1 and 100. A value of 0 + specifies that the default be used. A value of 100 + will only cache documents that are served in their entirety. A value + between 60 and 90 is recommended.

    + +

    + CacheForceCompletion 80 +

    + +

    Note:

    + This feature is currently not implemented. +
    + +
    +
    top
    +

    CacheIgnoreCacheControl Directive

    + + + + + + + +
    Description:Ignore the fact that the client requested the content not be +cached.
    Syntax:CacheIgnoreCacheControl On|Off
    Default:CacheIgnoreCacheControl Off
    Context:server config, virtual host
    Status:Experimental
    Module:mod_cache
    +

    Ordinarily, documents with no-cache or no-store header values will not be stored in the cache. + The CacheIgnoreCacheControl directive allows this behavior to be overridden. + CacheIgnoreCacheControl On tells the server to attempt to cache the document + even if it contains no-cache or no-store header values. Documents requiring authorization will + never be cached.

    + +

    + CacheIgnoreCacheControl On +

    + +
    +
    top
    +

    CacheIgnoreHeaders Directive

    + + + + + + + +
    Description:Do not store the given HTTP header(s) in the cache. +
    Syntax:CacheIgnoreHeaders header-string [header-string] ...
    Default:CacheIgnoreHeaders None
    Context:server config, virtual host
    Status:Experimental
    Module:mod_cache
    +

    According to RFC 2616, hop-by-hop HTTP headers are not stored in + the cache. The following HTTP headers are hop-by-hop headers and thus + do not get stored in the cache in any case regardless of the + setting of CacheIgnoreHeaders:

    + +
      +
    • Connection
    • +
    • Keep-Alive
    • +
    • Proxy-Authenticate
    • +
    • Proxy-Authorization
    • +
    • TE
    • +
    • Trailers
    • +
    • Transfer-Encoding
    • +
    • Upgrade
    • +
    + +

    CacheIgnoreHeaders specifies additional HTTP + headers that should not to be stored in the cache. For example, it makes + sense in some cases to prevent cookies from being stored in the cache.

    + +

    CacheIgnoreHeaders takes a space separated list + of HTTP headers that should not be stored in the cache. If only hop-by-hop + headers not should be stored in the cache (the RFC 2616 compliant + behaviour), CacheIgnoreHeaders can be set to + None.

    + +

    Example 1

    + CacheIgnoreHeaders Set-Cookie +

    + +

    Example 2

    + CacheIgnoreHeaders None +

    + +

    Warning:

    + If headers like Expires which are needed for proper cache + management are not stored due to a + CacheIgnoreHeaders setting, the behaviour of + mod_cache is undefined. +
    + +
    +
    top
    +

    CacheIgnoreNoLastMod Directive

    + + + + + + + +
    Description:Ignore the fact that a response has no Last Modified +header.
    Syntax:CacheIgnoreNoLastMod On|Off
    Default:CacheIgnoreNoLastMod Off
    Context:server config, virtual host
    Status:Experimental
    Module:mod_cache
    +

    Ordinarily, documents without a last-modified date are not cached. + Under some circumstances the last-modified date is removed (during + mod_include processing for example) or not provided + at all. The CacheIgnoreNoLastMod directive + provides a way to specify that documents without last-modified dates + should be considered for caching, even without a last-modified date. + If neither a last-modified date nor an expiry date are provided with + the document then the value specified by the + CacheDefaultExpire directive will be used to + generate an expiration date.

    + +

    + CacheIgnoreNoLastMod On +

    + +
    +
    top
    +

    CacheLastModifiedFactor Directive

    + + + + + + + +
    Description:The factor used to compute an expiry date based on the +LastModified date.
    Syntax:CacheLastModifiedFactor float
    Default:CacheLastModifiedFactor 0.1
    Context:server config, virtual host
    Status:Experimental
    Module:mod_cache
    +

    In the event that a document does not provide an expiry date but does + provide a last-modified date, an expiry date can be calculated based on + the time since the document was last modified. The + CacheLastModifiedFactor directive specifies a + factor to be used in the generation of this expiry date + according to the following formula: + + expiry-period = time-since-last-modified-date * factor + expiry-date = current-date + expiry-period + + For example, if the document was last modified 10 hours ago, and + factor is 0.1 then the expiry-period will be set to + 10*0.1 = 1 hour. If the current time was 3:00pm then the computed + expiry-date would be 3:00pm + 1hour = 4:00pm. + + If the expiry-period would be longer than that set by + CacheMaxExpire, then the latter takes + precedence.

    + +

    + CacheLastModifiedFactor 0.5 +

    + +
    +
    top
    +

    CacheMaxExpire Directive

    + + + + + + + +
    Description:The maximum time in seconds to cache a document
    Syntax:CacheMaxExpire seconds
    Default:CacheMaxExpire 86400 (one day)
    Context:server config, virtual host
    Status:Experimental
    Module:mod_cache
    +

    The CacheMaxExpire directive specifies the maximum number of + seconds for which cachable HTTP documents will be retained without checking the origin + server. Thus, documents will be out of date at most this number of seconds. This maximum + value is enforced even if an expiry date was supplied with the document.

    + +

    + CacheMaxExpire 604800 +

    + +
    +
    +
    +

    Available Languages:  en  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_cache.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_cache.html.ko.euc-kr new file mode 100644 index 00000000..0e67c69a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_cache.html.ko.euc-kr @@ -0,0 +1,323 @@ + + + +mod_cache - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    ¾ÆÆÄÄ¡ ¸ðµâ mod_cache

    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + ko 

    +
    +
    ÀÌ ¹®¼­´Â ÃÖ½ÅÆÇ ¹ø¿ªÀÌ ¾Æ´Õ´Ï´Ù. + ÃÖ±Ù¿¡ º¯°æµÈ ³»¿ëÀº ¿µ¾î ¹®¼­¸¦ Âü°íÇϼ¼¿ä.
    + + + +
    ¼³¸í:Content cache keyed to URIs.
    »óÅÂ:Experimental
    ¸ðµâ¸í:cache_module
    ¼Ò½ºÆÄÀÏ:mod_cache.c
    +

    ¿ä¾à

    + +
    + ÀÌ ¸ðµâÀº ½ÇÇèÀûÀÎ »óÅÂÀÌ´Ù. ¹®¼­´Â ¾ÆÁ÷ ÀÛ¾÷ÁßÀÌ´Ù... +
    + +

    mod_cache´Â °°Àº ÄÄÇ»ÅÍ¿¡ ÀÖ´Â ³»¿ëÀ̳ª + ÇÁ·Ï½ÃµÈ ³»¿ëÀ» ij½¬ÇÒ ¼ö ÀÖ´Â RFC 2616 + ȣȯ HTTP ³»¿ëij½¬¸¦ ±¸ÇöÇÑ´Ù. mod_cache¸¦ + »ç¿ëÇÏ·Á¸é ÀúÀå°ü¸®¸ðµâ(storage management module)ÀÌ ÇÊ¿äÇÏ´Ù. + ±âº» ¾ÆÆÄÄ¡ ¹èÆ÷º»¿¡´Â µÎ°¡Áö ÀúÀå°ü¸®¸ðµâÀÌ ÀÖ´Ù:

    +
    +
    mod_disk_cache
    +
    ´Â µð½ºÅ©±â¹Ý ÀúÀå°ü¸®ÀÚ¸¦ ±¸ÇöÇÑ´Ù.
    + +
    mod_mem_cache
    +
    ´Â ¸Þ¸ð¸®±â¹Ý ÀúÀå°ü¸®ÀÚ¸¦ ±¸ÇöÇÑ´Ù. + mod_mem_cache´Â ÆÄÀϱâ¼úÀÚ¸¦ ij½¬Çϰųª + Èü(heap) °ø°£¿¡ °´Ã¼¸¦ ij½¬ÇÏ´Â µÎ°¡Áö ¹æ½ÄÁß ÇÑ°¡Áö ¹æ¹ýÀ¸·Î + µ¿ÀÛÇϵµ·Ï ¼³Á¤ÇÒ ¼ö ÀÖ´Ù. mod_mem_cache´Â + ÀÚ½ÅÀÌ »ý¼ºÇÑ ³»¿ëÀ» ij½¬Çϰųª, (¿ªÇÁ·Ï½Ã(reverse proxy)·Î + ¾Ë·ÁÁø) ProxyPass¸¦ + »ç¿ëÇÏ¿© mod_proxy¸¦ À§ÇØ µÞ´Ü ¼­¹ö³»¿ëÀ» + ij½¬ÇÒ ¼ö ÀÖ´Ù.
    +
    + +

    ³»¿ëÀ» URI¸¦ Åä´ë·Î ¸¸µç Å°·Î ij½¬¿¡ ÀúÀåÇÏ°í °¡Á®¿Â´Ù. + Á¢±Ùº¸È£°¡ µÈ ³»¿ëÀº ij½¬ÇÏÁö¾Ê´Â´Ù.

    +
    + +
    top
    +
    top
    +
    +

    ¼³Á¤¿¹

    +

    Sample httpd.conf

    + #
    + # ¿¹Á¦ ij½¬ ¼³Á¤
    + #
    + LoadModule cache_module modules/mod_cache.so
    +
    + <IfModule mod_cache.c>
    + + #LoadModule disk_cache_module modules/mod_disk_cache.so
    + <IfModule mod_disk_cache.c>
    + + CacheRoot c:/cacheroot
    + CacheSize 256
    + CacheEnable disk /
    + CacheDirLevels 5
    + CacheDirLength 3
    +
    + </IfModule>
    +
    + LoadModule mem_cache_module modules/mod_mem_cache.so
    + <IfModule mod_mem_cache.c>
    + + CacheEnable mem /
    + MCacheSize 4096
    + MCacheMaxObjectCount 100
    + MCacheMinObjectSize 1
    + MCacheMaxObjectSize 2048
    +
    + </IfModule>
    +
    + </IfModule> +

    +
    +
    top
    +

    CacheDefaultExpire Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:¸¸±â½Ã°£À» ÁöÁ¤ÇÏÁö¾ÊÀº ¹®¼­¸¦ ij½¬ÇÒ ±âº» ±â°£.
    ¹®¹ý:CacheDefaultExpire seconds
    ±âº»°ª:CacheDefaultExpire 3600 (one hour)
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®
    »óÅÂ:Experimental
    ¸ðµâ:mod_cache
    +

    CacheDefaultExpire Áö½Ã¾î´Â ¹®¼­ÀÇ + ¸¸±â½Ã°£°ú ÃÖ±Ù¼öÁ¤½Ã°£ÀÌ ¾ø´Â °æ¿ì ¹®¼­¸¦ ij½¬ÇÒ ÃÊ´ÜÀ§ + ±âº» ½Ã°£À» ÁöÁ¤ÇÑ´Ù. CacheMaxExpire·Î + ÁöÁ¤ÇÑ °ªÀÌ ÀÌ ¼³Á¤À» ¹«½ÃÇÏÁö ¾Ê´Â´Ù.

    + +

    + CacheDefaultExpire 86400 +

    + +
    +
    top
    +

    CacheDisable Áö½Ã¾î

    + + + + + + +
    ¼³¸í:ƯÁ¤ URLÀ» ij½¬ÇÏÁö ¾Ê´Â´Ù
    ¹®¹ý:CacheDisable url-string
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®
    »óÅÂ:Experimental
    ¸ðµâ:mod_cache
    +

    CacheDisable Áö½Ã¾î¸¦ »ç¿ëÇϸé + mod_cache°¡ url-string ÀÌÇÏÀÇ + urlµéÀ» ij½¬ÇÏÁö ¾Ê´Â´Ù.

    + +

    ¿¹Á¦

    + CacheDisable /local_files +

    + +
    +
    top
    +

    CacheEnable Áö½Ã¾î

    + + + + + + +
    ¼³¸í:ÁöÁ¤ÇÑ ÀúÀå°ü¸®ÀÚ¸¦ »ç¿ëÇÏ¿© ÁöÁ¤ÇÑ URLÀ» ij½¬ÇÑ´Ù
    ¹®¹ý:CacheEnable cache_type url-string
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®
    »óÅÂ:Experimental
    ¸ðµâ:mod_cache
    +

    CacheEnable Áö½Ã¾î¸¦ »ç¿ëÇϸé + mod_cache°¡ url-string ÀÌÇÏ + urlµéÀ» ij½¬ÇÑ´Ù. ij½¬ ÀúÀå°ü¸®ÀÚ´Â cache_type + ¾Æ±Ô¸ÕÆ®·Î ÁöÁ¤ÇÑ´Ù. cache_type memÀº + mod_mem_cache°¡ ±¸ÇöÇÏ´Â ¸Þ¸ð¸®±â¹Ý + ÀúÀå°ü¸®ÀÚ¸¦ »ç¿ëÇÑ´Ù. cache_type disk´Â + mod_disk_cache°¡ ±¸ÇöÇÏ´Â µð½ºÅ©±â¹Ý + ÀúÀå°ü¸®ÀÚ¸¦ »ç¿ëÇÑ´Ù. cache_type fd´Â + mod_mem_cache°¡ ±¸ÇöÇÏ´Â ÆÄÀϱâ¼úÀÚ Ä³½¬¸¦ + »ç¿ëÇÑ´Ù.

    +

    (¾Æ·¡ ¿¹¿Í °°ÀÌ) URL °ø°£ÀÌ ´Ù¸¥ + CacheEnable Áö½Ã¾î¿Í °ãÄ¡¸é ½ÇÁ¦·Î + ÇÑ ÀúÀå°ü¸®ÀÚ°¡ ¿äûÀ» ó¸®ÇÒ¶§±îÁö µÎ ÀúÀå°ü¸®ÀÚ¸¦ ¸ðµÎ + ½ÇÇàÇÑ´Ù. ¼³Á¤ÆÄÀÏ¿¡¼­ CacheEnable + Áö½Ã¾îÀÇ ¼ø¼­´ë·Î ÀúÀå°ü¸®ÀÚ°¡ ½ÇÇàµÈ´Ù.

    + +

    + CacheEnable mem /manual
    + CacheEnable fd /images
    + CacheEnable disk /
    +

    + +
    +
    top
    +

    CacheForceCompletion Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:¿äûÀÌ Ãë¼ÒµÇ´õ¶óµµ ¼­¹ö°¡ ÆÄÀÏÀ» °è¼Ó ij½¬ÇϱâÀ§ÇØ +ÇÊ¿äÇÑ ¹®¼­ÀÇ ¼­ºñ½º·ü.
    ¹®¹ý:CacheForceCompletion Percentage
    ±âº»°ª:CacheForceCompletion 60
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®
    »óÅÂ:Experimental
    ¸ðµâ:mod_cache
    +

    º¸Åë ÀÀ´äÀ» ij½¬ÇÏ°í Ŭ¶óÀ̾ðÆ®·Î º¸³»´Â µµÁß¿¡ ¿äûÀÌ + Ãë¼ÒµÇ¸é ÀÀ´ä 󸮸¦ Áߴܵǰí ij½¬ Ç׸ñÀ» Áö¿î´Ù. + CacheForceCompletion Áö½Ã¾î´Â ¿äûÀÌ + Ãë¼ÒµÇ´õ¶óµµ ¹®¼­¸¦ °è¼Ó ij½¬ÇÒ Á¤µµ¸¦ ÁöÁ¤ÇÑ´Ù.

    + +

    Á¤µµ´Â ¹éºÐÀ²·Î ³ªÅ¸³»¸ç 1°ú 100 + »çÀÌÀÇ °ªÀÌ´Ù. 0 °ªÀ» ÁöÁ¤ÇÏ¸é ±âº»°ªÀ» »ç¿ëÇÑ´Ù. + 100Àº ³»¿ëÀ» ¸ðµÎ ¼­ºñ½ºÇÑ ¹®¼­¸¸À» ij½¬ÇÑ´Ù. + 60°ú 90 »çÀÌÀÇ °ªÀ» ÃßõÇÑ´Ù.

    + +

    + CacheForceCompletion 80 +

    + +

    ÁÖÀÇ:

    + ÀÌ ±â´ÉÀº ÇöÀç ±¸ÇöµÇÁö ¾Ê¾Ò´Ù. +
    + +
    +
    top
    +

    CacheIgnoreCacheControl Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:Ŭ¶óÀ̾ðÆ®°¡ ij½¬ÇÏÁö¾Ê´Â ³»¿ëÀ» ¿äûÇÔÀ» ¹«½ÃÇÑ´Ù.
    ¹®¹ý:CacheIgnoreCacheControl On|Off
    ±âº»°ª:CacheIgnoreCacheControl Off
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®
    »óÅÂ:Experimental
    ¸ðµâ:mod_cache
    +

    º¸Åë no-cache³ª no-store Çì´õ°ªÀ» °¡Áø ¹®¼­´Â ij½¬¿¡ + ÀúÀåÇÏÁö¾Ê´Â´Ù. CacheIgnoreCacheControl + Áö½Ã¾î´Â ÀÌ·± ÇൿÀ» º¯°æÇÑ´Ù. + CacheIgnoreCacheControl OnÀ» »ç¿ëÇϸé + ¼­¹ö´Â ¹®¼­¿¡ no-cache³ª no-store Çì´õ°ªÀÌ À־ ¹®¼­¸¦ + ij½¬ÇÑ´Ù. ÀÎÁõÀÌ ÇÊ¿äÇÑ ¹®¼­´Â Àý´ë·Î ij½¬ÇÏÁö + ¾Ê´Â´Ù.

    + +

    + CacheIgnoreCacheControl On +

    + +
    +
    top
    +

    CacheIgnoreNoLastMod Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:ÀÀ´ä¿¡ Last Modified Çì´õ°¡ ¾ø´Ù´Â »ç½ÇÀ» ¹«½ÃÇÑ´Ù.
    ¹®¹ý:CacheIgnoreNoLastMod On|Off
    ±âº»°ª:CacheIgnoreNoLastMod Off
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®
    »óÅÂ:Experimental
    ¸ðµâ:mod_cache
    +

    º¸Åë ÃÖ±Ù¼öÁ¤ÀÏÀÌ ¾ø´Â ¹®¼­´Â ij½¬ÇÏÁö ¾Ê´Â´Ù. ¾î¶² °æ¿ì + ÃÖ±Ù¼öÁ¤ÀÏÀ» (¿¹¸¦ µé¾î mod_include ó¸®Áß¿¡) + »©°Å³ª óÀ½ºÎÅÍ ¾ø¾úÀ» ¼ö°¡ ÀÖ´Ù. + CacheIgnoreNoLastMod Áö½Ã¾î´Â ÃÖ±Ù¼öÁ¤ÀÏÀÌ + ¾ø´Â ¹®¼­µµ ¹Ýµå½Ã ij½¬Çϵµ·Ï ¸¸µç´Ù. ¹®¼­¿¡ ÃÖ±Ù¼öÁ¤ÀÏ°ú + ¸¸±â½Ã°£ÀÌ ¾ø´Â °æ¿ì CacheDefaultExpire + Áö½Ã¾î·Î ÁöÁ¤ÇÑ °ªÀ» ¸¸±â½Ã°£À¸·Î »ç¿ëÇÑ´Ù.

    + +

    + CacheIgnoreNoLastMod On +

    + +
    +
    top
    +

    CacheLastModifiedFactor Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:LastModified ½Ã°£À¸·Î ¸¸±â½Ã°£À» °è»êÇϴµ¥ »ç¿ëÇÏ´Â +°è¼ö.
    ¹®¹ý:CacheLastModifiedFactor float
    ±âº»°ª:CacheLastModifiedFactor 0.1
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®
    »óÅÂ:Experimental
    ¸ðµâ:mod_cache
    +

    ¹®¼­¿¡ ¸¸±â½Ã°£Àº ¾øÁö¸¸ ÃÖ±Ù¼öÁ¤ÀÏÀÌ ÀÖ´Â °æ¿ì ÃÖ±Ù¼öÁ¤ÀÏ + ÀÌÈÄ Áö³­ ½Ã°£À¸·Î ¸¸±â½Ã°£À» °è»êÇÑ´Ù. + CacheLastModifiedFactor Áö½Ã¾î´Â + ¸¸±â½Ã°£À» °è»êÇÏ´Â ´ÙÀ½ °ø½Ä¿¡¼­ »ç¿ëÇÒ factor¸¦ + ÁöÁ¤ÇÑ´Ù: + + expiry-period = time-since-last-modified-date * factor + expiry-date = current-date + expiry-period + + ¿¹¸¦ µé¾î, ¹®¼­°¡ 10 ½Ã°£ Àü¿¡ ¸¶Áö¸·À¸·Î ¼öÁ¤µÇ¾ú°í factor°¡ + 0.1À̶ó¸é ¸¸±â±â°£Àº 10*01 = 1 ½Ã°£ÀÌ µÈ´Ù. ÇöÀç ½Ã°£ÀÌ + 3:00pmÀ̶ó¸é ¸¸±â½Ã°£Àº 3:00pm + 1½Ã°£ = 4:00pmÀÌ´Ù. + + ¸¸±â±â°£ÀÌ CacheMaxExpire º¸´Ù ±æ´Ù¸é + CacheMaxExpire¸¦ »ç¿ëÇÑ´Ù.

    + +

    + CacheLastModifiedFactor 0.5 +

    + +
    +
    top
    +

    CacheMaxExpire Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:¹®¼­¸¦ ij½¬ÇÏ´Â ÃÊ´ÜÀ§ ÃÖ´ë½Ã°£
    ¹®¹ý:CacheMaxExpire seconds
    ±âº»°ª:CacheMaxExpire 86400 (ÇÏ·ç)
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®
    »óÅÂ:Experimental
    ¸ðµâ:mod_cache
    +

    CacheMaxExpire Áö½Ã¾î´Â ½ÇÁ¦ ¼­¹ö¸¦ + °Ë»çÇÏÁö¾Ê°í ij½¬°¡´ÉÇÑ HTTP ¹®¼­¸¦ À¯ÁöÇÒ ¼ö ÀÖ´Â ÃÊ´ÜÀ§ + ÃÖ´ë½Ã°£À» ÁöÁ¤ÇÑ´Ù. Áï, ¹®¼­´Â ÃÖ´ëÇÑ ÀÌ ¼³Á¤°ª¸¸Å­ ¿À·¡µÇ¾ú´Ù. + ¹®¼­°¡ ¸¸±â½Ã°£À» ÁöÁ¤ÇÏ¿©µµ ÀÌ ÃÖ´ë°ªÀ» ÁöŲ´Ù.

    + +

    + CacheMaxExpire 604800 +

    + +
    +
    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_cern_meta.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_cern_meta.html new file mode 100644 index 00000000..65878639 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_cern_meta.html @@ -0,0 +1,9 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_cern_meta.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: mod_cern_meta.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_cern_meta.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_cern_meta.html.en new file mode 100644 index 00000000..22e4b78b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_cern_meta.html.en @@ -0,0 +1,128 @@ + + + +mod_cern_meta - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_cern_meta

    +
    +

    Available Languages:  en  | + ko 

    +
    + + + +
    Description:CERN httpd metafile semantics
    Status:Extension
    Module Identifier:cern_meta_module
    Source File:mod_cern_meta.c
    +

    Summary

    + +

    Emulate the CERN HTTPD Meta file semantics. Meta files are HTTP + headers that can be output in addition to the normal range of + headers for each file accessed. They appear rather like the + Apache .asis files, and are able to provide a crude way of + influencing the Expires: header, as well as providing other + curiosities. There are many ways to manage meta information, + this one was chosen because there is already a large number of + CERN users who can exploit this module.

    + +

    More information on the CERN metafile semantics is available.

    +
    +

    Directives

    + +

    See also

    +
    + +
    top
    +

    MetaDir Directive

    + + + + + + + + +
    Description:Name of the directory to find CERN-style meta information +files
    Syntax:MetaDir directory
    Default:MetaDir .web
    Context:server config, virtual host, directory, .htaccess
    Override:Indexes
    Status:Extension
    Module:mod_cern_meta
    +

    Specifies the name of the directory in which Apache can find + meta information files. The directory is usually a 'hidden' + subdirectory of the directory that contains the file being + accessed. Set to "." to look in the same directory + as the file:

    + +

    MetaDir .

    + +

    Or, to set it to a subdirectory of the directory containing the + files:

    + +

    MetaDir .meta

    + +
    +
    top
    +

    MetaFiles Directive

    + + + + + + + + +
    Description:Activates CERN meta-file processing
    Syntax:MetaFiles on|off
    Default:MetaFiles off
    Context:server config, virtual host, directory, .htaccess
    Override:Indexes
    Status:Extension
    Module:mod_cern_meta
    +

    Turns on/off Meta file processing on a per-directory basis.

    + +
    +
    top
    +

    MetaSuffix Directive

    + + + + + + + + +
    Description:File name suffix for the file containg CERN-style +meta information
    Syntax:MetaSuffix suffix
    Default:MetaSuffix .meta
    Context:server config, virtual host, directory, .htaccess
    Override:Indexes
    Status:Extension
    Module:mod_cern_meta
    +

    Specifies the file name suffix for the file containing the + meta information. For example, the default values for the two + directives will cause a request to + DOCUMENT_ROOT/somedir/index.html to look in + DOCUMENT_ROOT/somedir/.web/index.html.meta and + will use its contents to generate additional MIME header + information.

    + +

    Example:

    + MetaSuffix .meta +

    + +
    +
    +
    +

    Available Languages:  en  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_cern_meta.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_cern_meta.html.ko.euc-kr new file mode 100644 index 00000000..8b48f85f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_cern_meta.html.ko.euc-kr @@ -0,0 +1,120 @@ + + + +mod_cern_meta - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    ¾ÆÆÄÄ¡ ¸ðµâ mod_cern_meta

    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + ko 

    +
    + + + +
    ¼³¸í:CERN À¥¼­¹ö ¸ÞŸÆÄÀÏ Áö¿ø
    »óÅÂ:Extension
    ¸ðµâ¸í:cern_meta_module
    ¼Ò½ºÆÄÀÏ:mod_cern_meta.c
    +

    ¿ä¾à

    + +

    CERN À¥¼­¹ö ¸ÞŸÆÄÀÏÀ» Èä³»³½´Ù. ¸ÞŸÆÄÀÏÀº Á¢±ÙÇÏ´Â + ÆÄÀÏ¿¡ ´ëÇØ ÀϹÝÀûÀÎ Çì´õ¿Ü¿¡ Ãß°¡·Î Ãâ·ÂÇÒ HTTP Çì´õ¸¦ + ´ã°íÀÖ´Ù. ¾ÆÆÄÄ¡ .asis ÆÄÀÏ°ú ºñ½ÁÇÏ°í, Expires: Çì´õ¸¦ + ¼öÁ¤Çϰųª ´Ù¸¥ ½Å±âÇÑ ÀϵéÀ» ÇÒ ¼ö ÀÖ´Ù. ¸ÞŸ Á¤º¸¸¦ ´Ù·ç´Â + ¹æ¹ýÀº ´Ù¾çÇÏÁö¸¸, ÀÌ¹Ì ÀÌ ¸ðµâÀ» »ç¿ëÇÏ´Â ¸¹Àº CERN »ç¿ëÀÚµéÀ» + À§ÇØ ÀÌ ¹æ¹ýÀ» ¼±ÅÃÇß´Ù.

    + +

    ´õ ÀÚ¼¼ÇÑ Á¤º¸´Â CERN metafile semantics¸¦ Âü°íÇ϶ó.

    +
    +

    Áö½Ã¾îµé

    + +

    Âü°í

    +
    + +
    top
    +

    MetaDir Áö½Ã¾î

    + + + + + + + + +
    ¼³¸í:CERN ¸ÞŸÁ¤º¸¸¦ ãÀ» µð·ºÅ丮 À̸§
    ¹®¹ý:MetaDir directory
    ±âº»°ª:MetaDir .web
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®, directory, .htaccess
    Override ¿É¼Ç:Indexes
    »óÅÂ:Extension
    ¸ðµâ:mod_cern_meta
    +

    ¾ÆÆÄÄ¡°¡ ¸ÞŸÁ¤º¸ ÆÄÀÏÀ» ãÀ» µð·ºÅ丮¸íÀ» ÁöÁ¤ÇÑ´Ù. + µð·ºÅ丮´Â º¸Åë Á¢±ÙÇÒ ÆÄÀÏÀÌ ÀÖ´Â µð·ºÅ丮ÀÇ '°¨ÃçÁø' + ÇÏÀ§µð·ºÅ丮´Ù. "."À¸·Î ÁöÁ¤ÇÏ¸é °°Àº µð·ºÅ丮¿¡¼­ + ÆÄÀÏÀ» ã´Â´Ù:

    + +

    MetaDir .

    + +

    ¾Æ´Ï¸é ÆÄÀÏÀÌ ÀÖ´Â ÇÏÀ§µð·ºÅ丮¸¦ ÁöÁ¤ÇÑ´Ù:

    + +

    MetaDir .meta

    + +
    +
    top
    +

    MetaFiles Áö½Ã¾î

    + + + + + + + + +
    ¼³¸í:CERN ¸ÞŸÆÄÀÏÀ» ó¸®ÇÑ´Ù
    ¹®¹ý:MetaFiles on|off
    ±âº»°ª:MetaFiles off
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®, directory, .htaccess
    Override ¿É¼Ç:Indexes
    »óÅÂ:Extension
    ¸ðµâ:mod_cern_meta
    +

    µð·ºÅ丮º°·Î ¸ÞŸÆÄÀÏ Ã³¸®¿©ºÎ¸¦ °áÁ¤ÇÑ´Ù.

    + +
    +
    top
    +

    MetaSuffix Áö½Ã¾î

    + + + + + + + + +
    ¼³¸í:CERN ¸ÞŸÁ¤º¸¸¦ ÀúÀåÇÏ´Â ÆÄÀÏÀÇ Á¢¹Ì»ç
    ¹®¹ý:MetaSuffix suffix
    ±âº»°ª:MetaSuffix .meta
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®, directory, .htaccess
    Override ¿É¼Ç:Indexes
    »óÅÂ:Extension
    ¸ðµâ:mod_cern_meta
    +

    ¸ÞŸÁ¤º¸¸¦ ÀúÀåÇÏ´Â ÆÄÀÏÀÇ Á¢¹Ì»ç¸¦ ÁöÁ¤ÇÑ´Ù. ¿¹¸¦ µé¾î, + µÎ Áö½Ã¾îÀÇ ±âº»°ªÀ» »ç¿ëÇÒ °æ¿ì + DOCUMENT_ROOT/somedir/index.htmlÀ» ¿äûÇϸé + DOCUMENT_ROOT/somedir/.web/index.html.metaÀÇ + ³»¿ëÀ» Âü°íÇÏ¿© MIME Çì´õ Á¤º¸¸¦ Ãß°¡ÇÑ´Ù.

    + +

    ¿¹Á¦:

    + MetaSuffix .meta +

    + +
    +
    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_cgi.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_cgi.html new file mode 100644 index 00000000..f57e574b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_cgi.html @@ -0,0 +1,13 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_cgi.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: mod_cgi.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: mod_cgi.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_cgi.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_cgi.html.en new file mode 100644 index 00000000..3924f6ed --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_cgi.html.en @@ -0,0 +1,246 @@ + + + +mod_cgi - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_cgi

    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + + + +
    Description:Execution of CGI scripts
    Status:Base
    Module Identifier:cgi_module
    Source File:mod_cgi.c
    +

    Summary

    + + + +

    Any file that has the mime type + application/x-httpd-cgi or handler + cgi-script (Apache 1.1 or later) will be treated + as a CGI script, and run by the server, with its output being + returned to the client. Files acquire this type either by + having a name containing an extension defined by the + AddType directive, or by being + in a ScriptAlias + directory.

    + +

    When the server invokes a CGI script, it will add a variable + called DOCUMENT_ROOT to the environment. This + variable will contain the value of the + DocumentRoot configuration + variable.

    + +

    For an introduction to using CGI scripts with Apache, see + our tutorial on Dynamic Content + With CGI.

    + +

    When using a multi-threaded MPM under unix, the module + mod_cgid should be used in place of + this module. At the user level, the two modules are essentially + identical.

    +
    + +
    top
    +
    +

    CGI Environment variables

    +

    The server will set the CGI environment variables as described + in the CGI + specification, with the following provisions:

    + +
    +
    PATH_INFO
    + +
    This will not be available if the AcceptPathInfo directive is explicitly set to + off. The default behavior, if AcceptPathInfo is not given, is that mod_cgi will accept path info (trailing + /more/path/info following the script filename in the URI), + while the core server will return a 404 NOT FOUND error for requests + with additional path info. Omitting the AcceptPathInfo directive has the same effect as setting + it On for mod_cgi requests.
    + +
    REMOTE_HOST
    + +
    This will only be set if HostnameLookups is set to on (it + is off by default), and if a reverse DNS lookup of the accessing + host's address indeed finds a host name.
    + +
    REMOTE_IDENT
    + +
    This will only be set if IdentityCheck is set to + on and the accessing host supports the ident + protocol. Note that the contents of this variable cannot be + relied upon because it can easily be faked, and if there is a + proxy between the client and the server, it is usually + totally useless.
    + +
    REMOTE_USER
    + +
    This will only be set if the CGI script is subject to + authentication.
    +
    +
    top
    +
    +

    CGI Debugging

    +

    Debugging CGI scripts has traditionally been difficult, mainly + because it has not been possible to study the output (standard + output and error) for scripts which are failing to run + properly. These directives, included in Apache 1.2 and later, + provide more detailed logging of errors when they occur.

    + +

    CGI Logfile Format

    +

    When configured, the CGI error log logs any CGI which does not + execute properly. Each CGI script which fails to operate causes + several lines of information to be logged. The first two lines + are always of the format:

    + +

    + %% [time] request-line
    + %% HTTP-status CGI-script-filename +

    + +

    If the error is that CGI script cannot be run, the log file + will contain an extra two lines:

    + +

    + %%error
    + error-message +

    + +

    Alternatively, if the error is the result of the script + returning incorrect header information (often due to a bug in + the script), the following information is logged:

    + +

    + %request
    + All HTTP request headers received
    + POST or PUT entity (if any)
    + %response
    + All headers output by the CGI script
    + %stdout
    + CGI standard output
    + %stderr
    + CGI standard error
    +

    + +

    (The %stdout and %stderr parts may be missing if the script did + not output anything on standard output or standard error).

    + +
    +
    top
    +

    ScriptLog Directive

    + + + + + + +
    Description:Location of the CGI script error logfile
    Syntax:ScriptLog file-path
    Context:server config, virtual host
    Status:Base
    Module:mod_cgi, mod_cgid
    +

    The ScriptLog directive sets the CGI + script error logfile. If no ScriptLog is given, + no error log is created. If given, any CGI errors are logged into the + filename given as argument. If this is a relative file or path it is + taken relative to the ServerRoot. +

    + +

    Example

    + ScriptLog logs/cgi_log +

    + +

    This log will be opened as the user the child processes run + as, i.e. the user specified in the main User directive. This means that + either the directory the script log is in needs to be writable + by that user or the file needs to be manually created and set + to be writable by that user. If you place the script log in + your main logs directory, do NOT change the + directory permissions to make it writable by the user the child + processes run as.

    + +

    Note that script logging is meant to be a debugging feature + when writing CGI scripts, and is not meant to be activated + continuously on running servers. It is not optimized for speed + or efficiency, and may have security problems if used in a + manner other than that for which it was designed.

    + +
    +
    top
    +

    ScriptLogBuffer Directive

    + + + + + + + +
    Description:Maximum amount of PUT or POST requests that will be recorded +in the scriptlog
    Syntax:ScriptLogBuffer bytes
    Default:ScriptLogBuffer 1024
    Context:server config, virtual host
    Status:Base
    Module:mod_cgi, mod_cgid
    +

    The size of any PUT or POST entity body that is logged to + the file is limited, to prevent the log file growing too big + too quickly if large bodies are being received. By default, up + to 1024 bytes are logged, but this can be changed with this + directive.

    + +
    +
    top
    +

    ScriptLogLength Directive

    + + + + + + + +
    Description:Size limit of the CGI script logfile
    Syntax:ScriptLogLength bytes
    Default:ScriptLogLength 10385760
    Context:server config, virtual host
    Status:Base
    Module:mod_cgi, mod_cgid
    +

    ScriptLogLength can be used to limit the + size of the CGI script logfile. Since the logfile logs a lot of + information per CGI error (all request headers, all script output) + it can grow to be a big file. To prevent problems due to unbounded + growth, this directive can be used to set an maximum file-size for + the CGI logfile. If the file exceeds this size, no more + information will be written to it.

    + +
    +
    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_cgi.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_cgi.html.ja.utf8 new file mode 100644 index 00000000..053b6b56 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_cgi.html.ja.utf8 @@ -0,0 +1,254 @@ + + + +mod_cgi - Apache HTTP サーバ + + + + + + +
    <-
    + +
    +

    Apache モジュール mod_cgi

    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + + + +
    説明:CGI スクリプトの実行
    ステータス:Base
    モジュール識別子:cgi_module
    ソースファイル:mod_cgi.c
    +

    概要

    + + + +

    Mime タイプが application/x-httpd-cgi + であるか、ハンドラ cgi-script (Apache 1.1 以降) + が指定されているファイルは CGI スクリプトとして扱われ、 + サーバにより実行され、その出力がクライアントに返されます。 + ファイルは、AddType + ディレクティブに指定された 拡張子を名前に含むか、 + ScriptAlias + ディレクトリに存在することによりこのタイプになります。

    + +

    サーバが CGI スクリプトを実行するときには、 + DOCUMENT_ROOT + と呼ばれる変数を環境に追加します。この変数は + DocumentRoot + の値を保持します。

    + +

    Apache で CGI スクリプトを使用するためのイントロダクションは、 + CGI による動的コンテンツ + を参照してください。

    + +

    Unix でマルチスレッドの MPM を使っている場合は、このモジュールの + 代わりに mod_cgid を使う必要があります。 + ユーザレベルではこの二つのモジュールは本質的には同一です。

    +
    + +
    top
    +
    +

    CGI 環境変数

    +

    サーバは CGI + 規格 で決められている CGI + 環境変数を設定します。以下のものは、条件付きで設定されます。

    + +
    +
    PATH_INFO
    + +
    これは AcceptPathInfo ディレクティブが明示的に off + に設定されている場合は設定されません。デフォルトの、 + AcceptPathInfo が + 指定されていないときの振る舞いでは、mod_cgi はパス情報 + (URI のスクリプトのファイル名の後に続く /more/path/info) を + 受け付けますが、コアはサーバはパス情報のあるリクエストに + 対して 404 NOT FOUND エラーを返します。AcceptPathInfo + ディレクティブを + 省略すると、mod_cgi へのリクエストに対して + On を + 設定したのと同じ効果になります。
    + +
    REMOTE_HOST
    + +
    HostnameLookups + が on (デフォルトでは off です) + で、アクセスしているホストのアドレスの DNS + の逆引きが実際にホスト名を見つけたときにのみ設定されます。
    + +
    REMOTE_IDENT
    + +
    IdentityCheck + が on に設定されていて、アクセスしているホストが + ident プロトコルをサポートしているときにのみ設定されます。 + これは簡単に偽ることができ、クライアントとサーバの間に + プロキシがあればまったく役に立たないので、 + この変数の値は信用できないということに注意してください。 +
    + +
    REMOTE_USER
    + +
    CGI + スクリプトに認証が必要なときにのみ設定されます。
    +
    +
    top
    +
    +

    CGI のデバッグ

    +

    CGI スクリプトのデバッグは、正しく動作していないスクリプトの出力 + (標準出力とエラー) + を調べることができないために、難しい状態が続いていました。 + これらの Apache 1.2 以降にある + ディレクティブはより詳細なエラーのログ収集を提供します。

    + +

    CGI ログファイルの書式

    +

    設定されているときには、CGI エラーログは適切に動作しないすべての + CGI をログ収集します。それぞれの正しく動作しない CGI + スクリプトは 複数の行にわたる情報がログ収集されます。最初の + 2 行は常に以下の書式です:

    + +

    + %% [time] request-line
    + %% HTTP-status CGI-script-filename +

    + +

    エラーが、CGI スクリプトが実行できないというものである場合は、 + ログファイルはさらにもう 2 行書かれます:

    + +

    + %%error
    + error-message +

    + +

    そうではなく、エラーが正しくないヘッダ情報を返す結果である場合 + (スクリプトのバグであることがよくあります)、 + 以下の情報がログ収集されます:

    + +

    + %request
    + 受け取ったすべての HTTP リクエストヘッダ
    + (もしあれば) POST や PUT の中身
    + %response
    + CGI スクリプトにより出力されたすべてのヘッダ
    + %stdout
    + CGI 標準出力
    + %stderr
    + CGI 標準エラー
    +

    + +

    (スクリプトが標準出力や標準エラーに何も出力しなかった場合は、 + %stdout や %stderr はありません)。

    + +
    +
    top
    +

    ScriptLog ディレクティブ

    + + + + + + +
    説明:CGI スクリプトのエラーログファイルの場所
    構文:ScriptLog file-path
    コンテキスト:サーバ設定ファイル, バーチャルホスト
    ステータス:Base
    モジュール:mod_cgi, mod_cgid
    +

    ScriptLog ディレクティブは CGI スクリプトの + エラーログファイルを設定します。ScriptLog が + 設定されていないときは、 + エラーログは作成されません。設定されているときは、CGI + のエラーはすべて引数として与えられているファイル名にログされます。 + 相対パスで指定されているときは、 + ServerRootからの相対パスとして + 扱われます。

    + +

    例

    + ScriptLog logs/cgi_log +

    + +

    このログは子プロセスが実行されているユーザとしてオープンされます。 + すなわち、User ディレクティブで指定された + ユーザです。これは、スクリプトログが書かれるディレクトリがそのユーザで + 書き込み可能か、スクリプトファイルが手動で作成され、そのユーザで + 書き込み可能になっている必要があるということです。スクリプトログを + アクセスログなどのためのログディレクトリに書かれるようにしたときは、 + そのディレクトリを子プロセスを実行しているユーザの権限で + 書き込み可能にはしないようにしてください。

    + +

    スクリプトのログ収集は CGI スクリプトを書くときの + デバッグ用の機能として意図されていて、通常のサーバで + 常に使用されるようには意図されていないということに注意してください。 + 速度や効率は最適化されておらず、設計された以外の方法で使用されると + セキュリティの問題があるかもしれません。

    + +
    +
    top
    +

    ScriptLogBuffer ディレクティブ

    + + + + + + + +
    説明:スクリプトログに記録される PUT や POST リクエストの内容の上限
    構文:ScriptLogBuffer bytes
    デフォルト:ScriptLogBuffer 1024
    コンテキスト:サーバ設定ファイル, バーチャルホスト
    ステータス:Base
    モジュール:mod_cgi, mod_cgid
    +

    大きな本体を受け取ったときにログファイルがすぐに大きくなりすぎる + 問題を避けるために、ファイルにログ収集される PUT と POST + の本体の大きさは制限されています。デフォルトでは、1024 + バイトまでがログ収集されますが、 + このディレクティブはそれを変更することができます。 +

    + +
    +
    top
    +

    ScriptLogLength ディレクティブ

    + + + + + + + +
    説明:CGI スクリプトのログファイルの大きさの上限
    構文:ScriptLogLength bytes
    デフォルト:ScriptLogLength 10385760
    コンテキスト:サーバ設定ファイル, バーチャルホスト
    ステータス:Base
    モジュール:mod_cgi, mod_cgid
    +

    ScriptLogLength は CGI スクリプトのログファイル + の大きさを制限するために使用することができます。ログファイルは + CGI のエラー毎に大量の情報 (リクエストのすべてのヘッダ、 + すべての出力)をログしますので、すぐに大きなファイルになります。 + この大きさの制限がないことによる問題を防ぐために、 + このディレクティブを使って CGI のログファイルの + 最大のファイルサイズを設定することができます。 + ファイルがこの大きさを超えた場合は、それ以上は書き込まれません。

    + +
    +
    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_cgi.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_cgi.html.ko.euc-kr new file mode 100644 index 00000000..c5851baa --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_cgi.html.ko.euc-kr @@ -0,0 +1,232 @@ + + + +mod_cgi - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    ¾ÆÆÄÄ¡ ¸ðµâ mod_cgi

    +
    +

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

    +
    + + + +
    ¼³¸í:CGI ½ºÅ©¸³Æ® ½ÇÇà
    »óÅÂ:Base
    ¸ðµâ¸í:cgi_module
    ¼Ò½ºÆÄÀÏ:mod_cgi.c
    +

    ¿ä¾à

    + + + +

    ¼­¹ö´Â mime typeÀÌ application/x-httpd-cgiÀ̰ųª + (¾ÆÆÄÄ¡ 1.1 ÀÌÈÄ) Çڵ鷯°¡ cgi-scriptÀÎ ¸ðµç + ÆÄÀÏÀ» CGI ½ºÅ©¸³Æ®·Î ÀνÄÇÏ¿©, ½ÇÇàÇÏ°í, ±× °á°ú¸¦ Ŭ¶óÀ̾ðÆ®¿¡°Ô + º¸³½´Ù. ÆÄÀÏÀÌ AddType + Áö½Ã¾î·Î ÁöÁ¤ÇÑ È®ÀåÀÚ¸¦ °¡Áö°Å³ª, ScriptAlias µð·ºÅ丮 ¾È¿¡ + ÀÖÀ¸¸é CGI·Î 󸮵ȴÙ.

    + +

    ¼­¹ö´Â CGI ½ºÅ©¸³Æ®¸¦ ºÎ¸¦¶§ DOCUMENT_ROOT¶ó´Â + ȯ°æº¯¼ö¸¦ Ãß°¡ÇÑ´Ù. ÀÌ º¯¼ö´Â DocumentRoot ¼³Á¤°ªÀ» °¡Áø´Ù.

    + +

    ¾ÆÆÄÄ¡¿¡¼­ CGI ½ºÅ©¸³Æ®¸¦ »ç¿ëÇÏ´Â ¹æ¹ý¿¡ ´ëÇÑ ¼Ò°³´Â + CGI·Î µ¿Àû ÆäÀÌÁö »ý¼º ÅõÅ丮¾óÀ» + Âü°íÇ϶ó.

    + +

    À¯´Ð½º¿¡¼­ ´ÙÁß¾²·¹µå MPMÀ» »ç¿ëÇÑ´Ù¸é ÀÌ ¸ðµâ´ë½Å + mod_cgid ¸ðµâÀ» »ç¿ëÇØ¾ß ÇÑ´Ù. »ç¿ëÀÚ + ÀÔÀå¿¡¼­ ÀÌ µÎ ¸ðµâÀº ±âº»ÀûÀ¸·Î µ¿ÀÏÇÏ´Ù.

    +
    + +
    top
    +
    +

    CGI ȯ°æº¯¼ö

    +

    ¼­¹ö´Â ´ÙÀ½°ú °°Àº ¹æ¹ýÀ¸·Î CGI Ç¥ÁØÀÌ ¼³¸íÇÏ´Â + CGI ȯ°æº¯¼ö¸¦ ¼³Á¤ÇÑ´Ù:

    + +
    +
    PATH_INFO
    + +
    ÀÌ º¯¼ö´Â AcceptPathInfo Áö½Ã¾î¸¦ Á÷Á¢ off·Î + ÁöÁ¤ÇÑ °æ¿ì¿¡¸¸ ¼³Á¤ÇÑ´Ù. AcceptPathInfo°¡ ¾ø´Â °æ¿ì ¼­¹ö´Â ±âº»ÀûÀ¸·Î + °æ·Î Á¤º¸°¡ ÀÖ´Â ¿äû¿¡ ´ëÇØ 404 NOT FOUND ¿À·ù¸¦ ³»Áö¸¸, + mod_cgi´Â °æ·Î Á¤º¸¸¦ (URI¿¡¼­ ½ºÅ©¸³Æ® + ÆÄÀÏ¸í µÚ¿¡ ³ª¿À´Â /more/path/info) ¹Þ´Â´Ù. + AcceptPathInfo Áö½Ã¾î¸¦ »ý·«Çϸé + mod_cgi ¿äû¿¡ ´ëÇؼ­ AcceptPathInfo¸¦ OnÀ¸·Î + ¼³Á¤ÇÑ °Í°ú °°´Ù.
    + +
    REMOTE_HOST
    + +
    ÀÌ º¯¼ö´Â HostnameLookups°¡ onÀÌ°í (±âº»°ªÀº + off), Á¢¼ÓÇÑ È£½ºÆ® ÁÖ¼Ò¸¦ ¿ªDNS °Ë»öÇÏ¿© ½ÇÁ¦ È£½ºÆ®¸íÀ» + ãÀº °æ¿ì¿¡¸¸ ¼³Á¤ÇÑ´Ù.
    + +
    REMOTE_IDENT
    + +
    ÀÌ º¯¼ö´Â IdentityCheck°¡ onÀÌ°í, Á¢¼ÓÇÑ + È£½ºÆ®°¡ ident ÇÁ·ÎÅäÄÝÀ» Áö¿øÇÏ´Â °æ¿ì¿¡¸¸ ¼³Á¤ÇÑ´Ù. + ½±°Ô ÀÌ °ªÀ» ¼ÓÀÏ ¼ö Àֱ⶧¹®¿¡ ÀÌ º¯¼öÀÇ ³»¿ëÀ» ¹ÏÀ¸¸é + ¾ÈµÇ°í, Ŭ¶óÀ̾ðÆ®¿Í ¼­¹ö »çÀÌ¿¡ ÇÁ·Ï½Ã°¡ ÀÖ´Ù¸é º¯¼ö + ³»¿ëÀÌ ¿ÏÀüÈ÷ ¹«ÀǹÌÇÔÀ» ÁÖÀÇÇ϶ó.
    + +
    REMOTE_USER
    + +
    CGI ½ºÅ©¸³Æ®°¡ ÀÎÁõÀ» °ÅÃľßÇÏ´Â °æ¿ì¿¡¸¸ ¼³Á¤ÇÑ´Ù.
    +
    +
    top
    +
    +

    CGI µð¹ö±ë

    +

    ¾îµð¿¡¼­ À߸ø ½ÇÇàµÇ´ÂÁö ½ºÅ©¸³Æ®ÀÇ Ãâ·ÂÀ» (Ç¥ÁØÃâ·Â°ú + Ç¥ÁØ¿À·ù) º¼ ¼ö ¾ø±â¶§¹®¿¡ CGI ½ºÅ©¸³Æ®´Â ÀüÅëÀûÀ¸·Î µð¹ö±ëÇϱâ + ¾î·Á¿ü´Ù. ¾ÆÆÄÄ¡ 1.2 ÀÌÈÄ¿¡ Ãß°¡µÈ Áö½Ã¾î¸¦ »ç¿ëÇÏ¸é ¹ß»ýÇÑ + ¿À·ù¸¦ ÀÚ¼¼È÷ ·Î±×¿¡ ³²±æ ¼ö ÀÖ´Ù.

    + +

    CGI ·Î±×ÆÄÀÏ Çü½Ä

    +

    CGI ¿À·ù·Î±×´Â Á¤»óÀûÀ¸·Î ½ÇÇàÇÏÁö ¸øÇÑ CGI¸¦ ±â·ÏÇÑ´Ù. + ¿À·ù°¡ ¹ß»ýÇÑ CGI ½ºÅ©¸³Æ®´Â ·Î±×¿¡ ¿©·¯ ÁÙÀÇ Á¤º¸¸¦ ³²±ä´Ù. + ù¹ø° µÎ ÁÙÀº Ç×»ó ¾Æ·¡¿Í °°Àº Çü½ÄÀÌ´Ù:

    + +

    + %% [½Ã°£] ¿äûÁÙ
    + %% HTTP-»óÅ CGI-½ºÅ©¸³Æ®-ÆÄÀϸí +

    + +

    CGI ½ºÅ©¸³Æ®¸¦ ½ÇÇàÇÒ ¼ö ¾ø´Â ¿À·ùÀÎ °æ¿ì ·Î±×ÆÄÀÏ¿¡ + Ãß°¡·Î µÎ ÁÙÀ» ´õ ±â·ÏÇÑ´Ù:

    + +

    + %%error
    + ¿À·ù¹® +

    + +

    ½ºÅ©¸³Æ®°¡ (º¸Åë ½ºÅ©¸³Æ®ÀÇ ¹ö±×¶§¹®¿¡) À߸øµÈ Çì´õ + Á¤º¸¸¦ ¹ÝȯÇÏ´Â °æ¿ì, ´ÙÀ½ ³»¿ëÀ» ·Î±×¿¡ ±â·ÏÇÑ´Ù:

    + +

    + %request
    + ¹ÞÀº ¸ðµç HTTP Çì´õ
    + (ÀÖ´Ù¸é) POST³ª PUT ³»¿ë
    + %response
    + CGI ½ºÅ©¸³Æ® Ãâ·ÂÀÇ ¸ðµç Çì´õ
    + %stdout
    + CGI Ç¥ÁØÃâ·Â
    + %stderr
    + CGI Ç¥ÁØ¿À·ù
    +

    + +

    (½ºÅ©¸³Æ®°¡ Ç¥ÁØÃâ·ÂÀ̳ª Ç¥ÁØ¿À·ù¿¡ ¾Æ¹« ³»¿ëµµ Ãâ·ÂÇÏÁö + ¾Ê¾Ò´Ù¸é %stdout°ú %stderr ºÎºÐÀº »ý·«µÉ ¼ö ÀÖ´Ù).

    + +
    +
    top
    +

    ScriptLog Áö½Ã¾î

    + + + + + + +
    ¼³¸í:CGI ½ºÅ©¸³Æ® ¿À·ù·Î±×ÆÄÀÏÀÇ À§Ä¡
    ¹®¹ý:ScriptLog file-path
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®
    »óÅÂ:Base
    ¸ðµâ:mod_cgi, mod_cgid
    +

    ScriptLog Áö½Ã¾î´Â CGI ½ºÅ©¸³Æ® + ¿À·ù·Î±×ÆÄÀÏÀ» ÁöÁ¤ÇÑ´Ù. ScriptLog¸¦ + »ç¿ëÇÏÁö¾ÊÀ¸¸é ¿À·ù·Î±×¸¦ ¸¸µéÁö ¾Ê´Â´Ù. »ç¿ëÇÏ¸é ¾Æ±Ô¸ÕÆ®·Î + ÁöÁ¤ÇÑ ÆÄÀÏ¿¡ CGI ¿À·ù¸¦ ±â·ÏÇÑ´Ù. »ó´ë°æ·Î¸¦ ÁöÁ¤Çϸé + ServerRoot¿¡ »ó´ë°æ·Î·Î + ¹Þ¾ÆµéÀδÙ. +

    + +

    ¿¹Á¦

    + ScriptLog logs/cgi_log +

    + +

    ÀÚ½Ä ÇÁ·Î¼¼½º¸¦ ½ÇÇàÇÏ´Â »ç¿ëÀÚ, Áï User Áö½Ã¾î·Î ÁöÁ¤ÇÑ »ç¿ëÀÚ + ±ÇÇÑÀ¸·Î ·Î±×¸¦ ¿¬´Ù. ±×·¡¼­ ±× »ç¿ëÀÚ°¡ ½ºÅ©¸³Æ® ·Î±×°¡ + ÀÖ´Â µð·ºÅ丮¿¡ ¾²±â±ÇÇÑÀÌ ÀÖ´øÁö, Á÷Á¢ ¹Ì¸® ÆÄÀÏÀ» ¸¸µé¾î¼­ + ±× »ç¿ëÀÚ¿¡°Ô ¾²±â±ÇÇÑÀ» Áà¾ß ÇÑ´Ù. ½ºÅ©¸³Æ® ·Î±×¸¦ ÁÖ ·Î±× + µð·ºÅ丮¿¡ µÐ´Ù¸é ÀÚ½Ä ÇÁ·Î¼¼½º¸¦ ½ÇÇàÇÏ´Â »ç¿ëÀÚ¿¡°Ô ¾²±â±ÇÇÑÀ» + ÁÖ±âÀ§ÇØ µð·ºÅ丮 ±ÇÇÑÀ» º¯°æÇÏÁö ¸¶¶ó.

    + +

    ½ºÅ©¸³Æ® ·Î±×´Â CGI ½ºÅ©¸³Æ®¸¦ ÀÛ¼ºÇÒ¶§ µð¹ö±ëÀ» À§ÇÑ + ¿ëµµÀÌÁö ¼­¹ö¸¦ ½ÇÇàÇÏ´Â µ¿¾È °è¼Ó »ç¿ëÇϱâÀ§ÇÔÀÌ ¾Æ´ÔÀ» + ÁÖÀÇÇ϶ó. ¼Óµµ¿Í È¿À²¼º¸é¿¡¼­ ÃÖÀûÈ­°¡ ¾ÈµÇÀÖ°í, ¼³°èÇÑ + ¸ñÀûÀÌ¿ÜÀÇ ¹æ¹ýÀ¸·Î »ç¿ëÇÏ¸é º¸¾È»ó ¹®Á¦°¡ µÉ ¼ö ÀÖ´Ù.

    + +
    +
    top
    +

    ScriptLogBuffer Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:½ºÅ©¸³Æ® ·Î±×¿¡ ±â·ÏÇÒ PUT ȤÀº POST ¿äûÀÇ ÃÖ´ë·®
    ¹®¹ý:ScriptLogBuffer bytes
    ±âº»°ª:ScriptLogBuffer 1024
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®
    »óÅÂ:Base
    ¸ðµâ:mod_cgi, mod_cgid
    +

    Å« ³»¿ëÀ» ¹Þ¾Æ¼­ ·Î±×ÆÄÀÏÀÌ ³Ê¹« »¡¸® Ä¿Áö´Â Çö»óÀ» ¸·±âÀ§ÇØ + ÆÄÀÏ¿¡ ±â·ÏÇÒ PUT ȤÀº POST ³»¿ëÀÇ Å©±â¸¦ Á¦ÇÑÇÑ´Ù. ±âº»ÀûÀ¸·Î + 1024 ¹ÙÀÌÆ®±îÁö ·Î±×¿¡ ±â·ÏÇÏÁö¸¸, ÀÌ Áö½Ã¾î¸¦ »ç¿ëÇÏ¿© + ¼öÁ¤ÇÒ ¼ö ÀÖ´Ù.

    + +
    +
    top
    +

    ScriptLogLength Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:CGI ½ºÅ©¸³Æ® ·Î±×ÆÄÀÏÀÇ Å©±â Á¦ÇÑ
    ¹®¹ý:ScriptLogLength bytes
    ±âº»°ª:ScriptLogLength 10385760
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®
    »óÅÂ:Base
    ¸ðµâ:mod_cgi, mod_cgid
    +

    ScriptLogLength´Â CGI ½ºÅ©¸³Æ® + ·Î±×ÆÄÀÏÀÇ Å©±â¸¦ Á¦ÇÑÇÑ´Ù. CGI ¿À·ù°¡ ¹ß»ýÇÒ¶§¸¶´Ù (¸ðµç + ¿äû Çì´õ, ¸ðµç ½ºÅ©¸³Æ® Ãâ·Â µî) ¸¹Àº Á¤º¸°¡ ·Î±×¿¡ + ±â·ÏµÇ±â¶§¹®¿¡ ÆÄÀÏÀÌ ¸Å¿ì Ä¿Áú ¼ö ÀÖ´Ù. ÆÄÀÏÀÌ ¹«ÇÑÈ÷ Ä¿Áö´Â + ¹®Á¦¸¦ ¸·±âÀ§ÇØ ÀÌ Áö½Ã¾î¸¦ »ç¿ëÇÏ¿© CGI ·Î±×ÆÄÀÏÀÇ ÃÖ´ë + ÆÄÀÏÅ©±â¸¦ ¼³Á¤ÇÑ´Ù. ÆÄÀÏÀÇ Å©±â°¡ ¼³Á¤ÇÑ °ªÀ» ³ÑÀ¸¸é ´õ + ÀÌ»ó Á¤º¸¸¦ ±â·ÏÇÏÁö¾Ê´Â´Ù.

    + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_cgid.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_cgid.html new file mode 100644 index 00000000..33fcb349 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_cgid.html @@ -0,0 +1,13 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_cgid.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: mod_cgid.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: mod_cgid.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_cgid.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_cgid.html.en new file mode 100644 index 00000000..7ef1f93f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_cgid.html.en @@ -0,0 +1,104 @@ + + + +mod_cgid - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_cgid

    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + + + + +
    Description:Execution of CGI scripts using an + external CGI daemon
    Status:Base
    Module Identifier:cgid_module
    Source File:mod_cgid.c
    Compatibility:Unix threaded MPMs only
    +

    Summary

    + +

    Except for the optimizations and the additional ScriptSock directive noted below, + mod_cgid behaves similarly to mod_cgi. + See the mod_cgi summary for additional details + about Apache and CGI.

    + +

    On certain unix operating systems, forking a process from a + multi-threaded server is a very expensive operation because the + new process will replicate all the threads of the parent + process. In order to avoid incurring this expense on each CGI + invocation, mod_cgid creates an external daemon that is + responsible for forking child processes to run CGI scripts. The + main server communicates with this daemon using a unix domain + socket.

    + +

    This module is used by default instead of + mod_cgi whenever a multi-threaded MPM + is selected during the compilation process. At the user level, + this module is identical in configuration and operation to + mod_cgi. The only exception is the + additional directive ScriptSock which gives the + name of the socket to use for communication with the cgi + daemon.

    +
    + + +
    top
    +

    ScriptSock Directive

    + + + + + + + +
    Description:The name of the socket to use for communication with +the cgi daemon
    Syntax:ScriptSock file-path
    Default:ScriptSock logs/cgisock
    Context:server config, virtual host
    Status:Base
    Module:mod_cgid
    +

    This directive sets the name of the socket to use for + communication with the CGI daemon. The socket will be opened + using the permissions of the user who starts Apache (usually + root). To maintain the security of communications with CGI + scripts, it is important that no other user has permission to + write in the directory where the socket is located.

    + +

    Example

    + ScriptSock /var/run/cgid.sock +

    + + +
    +
    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_cgid.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_cgid.html.ja.utf8 new file mode 100644 index 00000000..07e14b49 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_cgid.html.ja.utf8 @@ -0,0 +1,98 @@ + + + +mod_cgid - Apache HTTP サーバ + + + + + + +
    <-
    + +
    +

    Apache モジュール mod_cgid

    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + + + + +
    説明:外部 CGI デーモンを使った CGI スクリプトの実行
    ステータス:Base
    モジュール識別子:cgid_module
    ソースファイル:mod_cgid.c
    互換性:Unix のスレッド MPM のみ
    +

    概要

    + +

    最適化が施されていることと、以下で説明されている追加の ScriptSock ディレクティブを除いては、 + mod_cgid は mod_cgi と同様の + 動作をします。Apache と CGI に関する詳細は + mod_cgi の概要を読んでください。

    + +

    Unix オペレーティングシステムの中には、マルチスレッドのサーバから + プロセスを fork するのが非常にコストの高い動作になっているものがあります。 + 理由は、新しいプロセスが親プロセスのスレッドすべてを複製するからです。 + 各 CGI 起動時にこのコストがかかるのを防ぐために、mod_cgid + は子プロセスを fork して CGI スクリプトを実行するための + 外部デーモンを実行します。 + 主サーバは unix ドメインソケットを使ってこのデーモンと通信します。

    + +

    コンパイル時にマルチスレッド MPM が選ばれたときは + mod_cgi の代わりに必ずこのモジュールが使用されます。 + ユーザのレベルではこのモジュールの設定と動作は mod_cgi + とまったく同じです。唯一の例外は ScriptSock ディレクティブの + 追加で、このディレクティブは CGI デーモンとの通信用のソケットの名前を + 指定します。

    +
    + + +
    top
    +

    ScriptSock ディレクティブ

    + + + + + + + +
    説明:CGI デーモンとの通信に使われるソケットの名前
    構文:ScriptSock file-path
    デフォルト:ScriptSock logs/cgisock
    コンテキスト:サーバ設定ファイル, バーチャルホスト
    ステータス:Base
    モジュール:mod_cgid
    +

    このディレクティブは CGI デーモンとの通信に使われるソケットの + 名前を設定します。ソケットは Apache が起動されたユーザ (通常 root) の + パーミッションを用いてオープンされます。CGI スクリプトとの通信の + セキュリティを保つために、ソケットの存在するディレクトリに + 他のユーザが書き込み権限を持っていないようにすることが重要です。

    + +

    例

    + ScriptSock /var/run/cgid.sock +

    + + +
    +
    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_cgid.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_cgid.html.ko.euc-kr new file mode 100644 index 00000000..6c126f6f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_cgid.html.ko.euc-kr @@ -0,0 +1,97 @@ + + + +mod_cgid - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    ¾ÆÆÄÄ¡ ¸ðµâ mod_cgid

    +
    +

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

    +
    + + + + +
    ¼³¸í:¿ÜºÎ CGI µ¥¸óÀ» »ç¿ëÇÏ¿© CGI ½ºÅ©¸³Æ®¸¦ ½ÇÇà
    »óÅÂ:Base
    ¸ðµâ¸í:cgid_module
    ¼Ò½ºÆÄÀÏ:mod_cgid.c
    Áö¿ø:À¯´Ð½º¿¡¼­ ¾²·¹µå¸¦ »ç¿ëÇÏ´Â MPMs Àü¿ë
    +

    ¿ä¾à

    + +

    ¾Æ·¡¿¡¼­ ¼³¸íÇÏ´Â Ãß°¡µÈ ScriptSock Áö½Ã¾î¸¦ Á¦¿ÜÇÏ°í + mod_cgid´Â mod_cgi¿Í + ºñ½ÁÇÏ°Ô µ¿ÀÛÇÑ´Ù. ¾ÆÆÄÄ¡¿Í CGI¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ¼³¸íÀº + mod_cgi¸¦ Âü°íÇ϶ó.

    + +

    ¾î¶² À¯´Ð½º ¿î¿µÃ¼Á¦ÀÇ °æ¿ì ´ÙÁß¾²·¹µå ¼­¹ö¿¡¼­ ÇÁ·Î¼¼½º¸¦ + Æ÷Å©(fork)ÇÏ¸é »õ·Î¿î ÇÁ·Î¼¼½º°¡ ºÎ¸ð ÇÁ·Î¼¼½ºÀÇ ¸ðµç ¾²·¹µå¸¦ + º¹Á¦ÇØ¾ß ÇϹǷΠºÎ´ãÀÌ µÈ´Ù. CGI ½ÇÇึ´Ù ÀÌ·± ºÎ´ãÀ» ÁÖÁö + ¾Ê±âÀ§ÇØ mod_cgid´Â CGI ½ºÅ©¸³Æ®¸¦ ½ÇÇàÇÏ´Â + ÀÚ½Ä ÇÁ·Î¼¼½º¸¦ Æ÷Å©ÇÏ´Â ¿ÜºÎ µ¥¸óÀ» ¸¸µç´Ù. ÁÖ¼­¹ö´Â ÀÌ + µ¥¸ó°ú À¯´Ð½º¼ÒÄÏ(unix domain socket)À» »ç¿ëÇÏ¿© Åë½ÅÇÑ´Ù.

    + +

    ÄÄÆÄÀÏÇÒ¶§ ´ÙÁß¾²·¹µå MPMÀ» ¼±ÅÃÇÏ¸é ±âº»ÀûÀ¸·Î + mod_cgi ´ë½Å ÀÌ ¸ðµâÀ» »ç¿ëÇÑ´Ù. »ç¿ëÀÚ + ÀÔÀå¿¡¼­ ÀÌ ¸ðµâÀÇ ¼³Á¤°ú µ¿ÀÛÀº mod_cgi¿Í + µ¿ÀÏÇÏ´Ù. À¯ÀÏÇÑ Â÷ÀÌÁ¡Àº cgi µ¥¸ó°ú Åë½ÅÀ» À§ÇØ »ç¿ëÇÒ + ¼ÒÄÏÀÇ À̸§À» ¼³Á¤ÇÏ´Â ScriptSock Áö½Ã¾î°¡ + Ãß°¡µÈ Á¡ÀÌ´Ù.

    +
    + + +
    top
    +

    ScriptSock Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:cgi µ¥¸ó°ú Åë½ÅÀ» À§ÇØ »ç¿ëÇÒ ¼ÒÄÏÀÇ À̸§
    ¹®¹ý:ScriptSock file-path
    ±âº»°ª:ScriptSock logs/cgisock
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®
    »óÅÂ:Base
    ¸ðµâ:mod_cgid
    +

    ÀÌ Áö½Ã¾î´Â CGI µ¥¸ó°ú Åë½ÅÀ» À§ÇØ »ç¿ëÇÒ ¼ÒÄÏÀÇ À̸§À» + ÁöÁ¤ÇÑ´Ù. ¾ÆÆÄÄ¡¸¦ ½ÃÀÛÇÑ »ç¿ëÀÚ (º¸Åë root) ±ÇÇÑÀ¸·Î ¼ÒÄÏÀ» + ¿¬´Ù. CGI ½ºÅ©¸³Æ®¿Í Åë½ÅÀÇ º¸¾ÈÀ» À§ÇØ ´Ù¸¥ »ç¿ëÀÚ°¡ ¼ÒÄÏÀÌ + ÀÖ´Â µð·ºÅ丮¿¡ ¾²±â±ÇÇÑÀ» °¡ÁöÁö¾Ê´Â °ÍÀÌ Áß¿äÇÏ´Ù.

    + +

    ¿¹Á¦

    + ScriptSock /var/run/cgid.sock +

    + + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_charset_lite.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_charset_lite.html new file mode 100644 index 00000000..626fcac8 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_charset_lite.html @@ -0,0 +1,9 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_charset_lite.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: mod_charset_lite.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_charset_lite.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_charset_lite.html.en new file mode 100644 index 00000000..fbab5e62 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_charset_lite.html.en @@ -0,0 +1,209 @@ + + + +mod_charset_lite - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_charset_lite

    +
    +

    Available Languages:  en  | + ko 

    +
    + + + +
    Description:Specify character set translation or recoding
    Status:Experimental
    Module Identifier:charset_lite_module
    Source File:mod_charset_lite.c
    +

    Summary

    + +

    This is an experimental module and should + be used with care. Experiment with your + mod_charset_lite configuration to ensure that it + performs the desired function.

    + +

    mod_charset_lite allows the administrator to + specify the source character set of objects as well as the + character set they should be translated into before sending to the + client. mod_charset_lite does not translate the + data itself but instead tells Apache what translation to + perform. mod_charset_lite is applicable to EBCDIC + and ASCII host environments. In an EBCDIC environment, Apache + normally translates text content from the code page of the Apache + process locale to ISO-8859-1. mod_charset_lite + can be used to specify that a different translation is to be + performed. In an ASCII environment, Apache normally performs no + translation, so mod_charset_lite is needed in + order for any translation to take place.

    + +

    This module provides a small subset of configuration + mechanisms implemented by Russian Apache and its associated + mod_charset.

    +
    + +
    top
    +
    +

    Common Problems

    + +

    Invalid character set names

    + +

    The character set name parameters of CharsetSourceEnc and + CharsetDefault + must be acceptable to the translation mechanism used by APR on the + system where mod_charset_lite is deployed. These + character set names are not standardized and are usually not the + same as the corresponding values used in http headers. Currently, + APR can only use iconv(3), so you can easily test your character + set names using the iconv(1) program, as follows:

    + +

    + iconv -f charsetsourceenc-value -t charsetdefault-value +

    + + +

    Mismatch between character set of content and translation + rules

    + +

    If the translation rules don't make sense for the content, + translation can fail in various ways, including:

    + +
      +
    • The translation mechanism may return a bad return code, + and the connection will be aborted.
    • + +
    • The translation mechanism may silently place special + characters (e.g., question marks) in the output buffer when + it cannot translate the input buffer.
    • +
    + +
    +
    top
    +

    CharsetDefault Directive

    + + + + + + + +
    Description:Charset to translate into
    Syntax:CharsetDefault charset
    Context:server config, virtual host, directory, .htaccess
    Override:FileInfo
    Status:Experimental
    Module:mod_charset_lite
    +

    The CharsetDefault directive specifies the + charset that content in the associated container should be + translated to.

    + +

    The value of the charset argument must be accepted + as a valid character set name by the character set support in + APR. Generally, this means that it must be supported by + iconv.

    + +

    Example

    + <Directory /export/home/trawick/apacheinst/htdocs/convert>
    + + CharsetSourceEnc UTF-16BE
    + CharsetDefault ISO-8859-1
    +
    + </Directory> +

    + +
    +
    top
    +

    CharsetOptions Directive

    + + + + + + + + +
    Description:Configures charset translation behavior
    Syntax:CharsetOptions option [option] ...
    Default:CharsetOptions DebugLevel=0 NoImplicitAdd
    Context:server config, virtual host, directory, .htaccess
    Override:FileInfo
    Status:Experimental
    Module:mod_charset_lite
    +

    The CharsetOptions directive configures certain + behaviors of mod_charset_lite. Option can + be one of

    + +
    +
    DebugLevel=n
    + +
    The DebugLevel keyword allows you to specify + the level of debug messages generated by + mod_charset_lite. By default, no messages are + generated. This is equivalent to DebugLevel=0. + With higher numbers, more debug messages are generated, and + server performance will be degraded. The actual meanings of + the numeric values are described with the definitions of the + DBGLVL_ constants near the beginning of + mod_charset_lite.c.
    + +
    ImplicitAdd | NoImplicitAdd
    + +
    The ImplicitAdd keyword specifies that + mod_charset_lite should implicitly insert its + filter when the configuration specifies that the character + set of content should be translated. If the filter chain is + explicitly configured using the AddOutputFilter directive, NoImplicitAdd + should be specified so that mod_charset_lite + doesn't add its filter.
    +
    + +
    +
    top
    +

    CharsetSourceEnc Directive

    + + + + + + + +
    Description:Source charset of files
    Syntax:CharsetSourceEnc charset
    Context:server config, virtual host, directory, .htaccess
    Override:FileInfo
    Status:Experimental
    Module:mod_charset_lite
    +

    The CharsetSourceEnc directive specifies the + source charset of files in the associated container.

    + +

    The value of the charset argument must be accepted + as a valid character set name by the character set support in + APR. Generally, this means that it must be supported by + iconv.

    + +

    Example

    + <Directory /export/home/trawick/apacheinst/htdocs/convert>
    + + CharsetSourceEnc UTF-16BE
    + CharsetDefault ISO-8859-1
    +
    + </Directory> +

    + +

    The character set names in this example work with the iconv + translation support in Solaris 8.

    + +
    +
    +
    +

    Available Languages:  en  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_charset_lite.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_charset_lite.html.ko.euc-kr new file mode 100644 index 00000000..d18aa502 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_charset_lite.html.ko.euc-kr @@ -0,0 +1,196 @@ + + + +mod_charset_lite - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    ¾ÆÆÄÄ¡ ¸ðµâ mod_charset_lite

    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + ko 

    +
    + + + +
    ¼³¸í:¹®ÀÚÁýÇÕ º¯È¯À» ÁöÁ¤
    »óÅÂ:Experimental
    ¸ðµâ¸í:charset_lite_module
    ¼Ò½ºÆÄÀÏ:mod_charset_lite.c
    +

    ¿ä¾à

    + +

    ÀÌ ¸ðµâÀº ½ÇÇèÀûÀÎ ¸ðµâÀÌ°í, ÁÖÀÇÀÖ°Ô + »ç¿ëÇØ¾ß ÇÑ´Ù. ¿øÇÏ´Â µ¿ÀÛÀ» ÇÏ´ÂÁö + mod_charset_lite ¼³Á¤À» ½ÃÇèÇغÁ¶ó.

    + +

    mod_charset_lite¸¦ »ç¿ëÇÏ¿© ¹®¼­ ¿øº»ÀÇ + ¹®ÀÚÁýÇÕ°ú ¹®¼­¸¦ Ŭ¶óÀ̾ðÆ®·Î º¸³»±â Àü¿¡ º¯È¯ÇÒ ¹®ÀÚÁýÇÕÀ» + ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. mod_charset_lite´Â Á÷Á¢ + ÀڷḦ º¯È¯ÇÏÁö¾Ê°í ´ë½Å ¾ÆÆÄÄ¡¿¡°Ô º¯È¯Ç϶ó°í ¿äûÇÑ´Ù. + mod_charset_lite´Â EBCDIC°ú ASCII ȯ°æ¿¡¼­ + »ç¿ëÇÒ ¼ö ÀÖ´Ù. EBCDIC ȯ°æ¿¡¼­ ¾ÆÆÄÄ¡´Â º¸Åë ¾ÆÆÄÄ¡ ÇÁ·Î¼¼½ºÀÇ + ÄÚµåÆäÀÌÁö¿¡¼­ ISO-8859-1 ¹®ÀÚÁýÇÕÀ¸·Î ¹®¼­¸¦ º¯È¯ÇÑ´Ù. + mod_charset_lite¸¦ »ç¿ëÇÏ¿© ´Ù¸¥ º¯È¯À» + Áö½ÃÇÒ ¼ö ÀÖ´Ù. ASCII ȯ°æ¿¡¼­ ¾ÆÆÄÄ¡´Â ±âº»ÀûÀ¸·Î º¯È¯À» + ÇÏÁö ¾Ê±â¶§¹®¿¡, ¾î¶² º¯È¯À» À§Çؼ­´Â + mod_charset_lite°¡ ÇÊ¿äÇÏ´Ù.

    + +

    ÀÌ ¸ðµâÀº ·¯½Ã¾ÆÆÇ ¾ÆÆÄÄ¡ÀÇ mod_charsetÀÌ + Á¦°øÇÏ´Â ¼³Á¤ÀÇ ÀϺθ¦ Á¦°øÇÑ´Ù.

    +
    + +
    top
    +
    +

    ÀϹÝÀûÀÎ ¹®Á¦Á¡

    + +

    À߸øµÈ ¹®ÀÚÁýÇÕ À̸§

    + +

    mod_charset_lite¸¦ »ç¿ëÇÏ´Â ½Ã½ºÅÛÀÇ + ARP ¹ø¿ª±â´ÉÀÌ CharsetSourceEnc¿Í + CharsetDefaultÀÇ + ÆĶó¹ÌÅÍÀÎ ¹®ÀÚÁýÇÕ À̸§À» ó¸®ÇÒ ¼ö ÀÖ¾î¾ß ÇÑ´Ù. ¹®ÀÚÁýÇÕ + À̸§Àº Ç¥ÁØÈ­µÇÁö ¾Ê¾Ò°í, http Çì´õ¿¡ »ç¿ëÇÏ´Â °ª°ú Ç×»ó + °°Áö´Â ¾Ê´Ù. ÇöÀç APRÀº iconv(3)¸¸À» »ç¿ëÇϱ⶧¹®¿¡, + ´ÙÀ½°ú °°ÀÌ iconv(1) ÇÁ·Î±×·¥À» »ç¿ëÇÏ¿© ƯÁ¤ ¹®ÀÚÁýÇÕ + À̸§À» »ç¿ëÇÒ ¼ö ÀÖ´ÂÁö ½±°Ô ¾Ë ¼ö ÀÖ´Ù:

    + +

    + iconv -f charsetsourceenc-value -t charsetdefault-value +

    + + +

    ³»¿ë°ú º¯È¯±ÔÄ¢ÀÇ ¹®ÀÚÁýÇÕÀÌ ¼­·Î ´Ù¸§

    + +

    º¯È¯±ÔÄ¢ÀÌ »óȲ¿¡ ¸ÂÁö¾ÊÀ¸¸é ´ÙÀ½°ú °°Àº ¿©·¯ ¹æ½ÄÀ¸·Î + º¯È¯ÀÌ ½ÇÆÐÇÒ ¼ö ÀÖ´Ù:

    + +
      +
    • º¯È¯±â´ÉÀÌ ½ÇÆÐ ¹ÝȯÄڵ带 ¹ÝȯÇÏ°í ¿¬°áÀÌ ²÷¾îÁú + ¼ö ÀÖ´Ù.
    • + +
    • ÀԷ¹öÆÛ¸¦ º¯È¯ÇÏÁö ¸øÇÒ¶§ Ãâ·Â¹öÆÛ¿¡ ´ë½Å Ưº°ÇÑ + ¹®ÀÚ¸¦ (¿¹, ¹°À½Ç¥) ÀûÀ» ¼ö ÀÖ´Ù.
    • +
    + +
    +
    top
    +

    CharsetDefault Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:º¯È¯ÇÒ ¹®ÀÚÁýÇÕ
    ¹®¹ý:CharsetDefault charset
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®, directory, .htaccess
    Override ¿É¼Ç:FileInfo
    »óÅÂ:Experimental
    ¸ðµâ:mod_charset_lite
    +

    CharsetDefault Áö½Ã¾î´Â Áö½Ã¾î¸¦ + »ç¿ëÇÑ À§Ä¡¿¡ ÀÖ´Â ¿øº»À» º¯È¯ÇÒ ¹®ÀÚÁýÇÕÀ» ÁöÁ¤ÇÑ´Ù.

    + +

    charset ¾Æ±Ô¸ÕÆ®¿¡´Â APRÀÌ Áö¿øÇÏ´Â ¹®ÀÚÁýÇÕ + À̸§À» »ç¿ëÇØ¾ß ÇÑ´Ù. ÀϹÝÀûÀ¸·Î iconv°¡ Áö¿øÇÏ´Â ¹®ÀÚÁýÇÕÀ» + ÀǹÌÇÑ´Ù.

    + +

    ¿¹Á¦

    + <Directory /export/home/trawick/apacheinst/htdocs/convert>
    + + CharsetSourceEnc UTF-16BE
    + CharsetDefault ISO-8859-1
    +
    + </Directory> +

    + +
    +
    top
    +

    CharsetOptions Áö½Ã¾î

    + + + + + + + + +
    ¼³¸í:¹®ÀÚÁýÇÕ º¯È¯ ±â´ÉÀ» ¼³Á¤
    ¹®¹ý:CharsetOptions option [option] ...
    ±âº»°ª:CharsetOptions DebugLevel=0 NoImplicitAdd
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®, directory, .htaccess
    Override ¿É¼Ç:FileInfo
    »óÅÂ:Experimental
    ¸ðµâ:mod_charset_lite
    +

    CharsetOptions Áö½Ã¾î´Â + mod_charset_liteÀÇ ±â´ÉÀ» ¼³Á¤ÇÑ´Ù. + Option¿¡´Â ¾Æ·¡ Ç׸ñµéÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù

    + +
    +
    DebugLevel=n
    + +
    DebugLevel Å°¿öµå´Â + mod_charset_lite°¡ ±â·ÏÇÏ´Â µð¹ö±×¹®±¸ÀÇ + ¼öÁØÀ» ¼³Á¤ÇÑ´Ù. ±âº»ÀûÀ¸·Î ¾î¶² °Íµµ ±â·ÏÇÏÁö ¾Ê´Â´Ù. + ÀÌ´Â DebugLevel=0°ú °°´Ù. ³ôÀº ¼ýÀÚ¸¦ »ç¿ëÇÒ¼ö·Ï + ´õ ¸¹Àº µð¹ö±×¹®±¸¸¦ ±â·ÏÇÏ°ÔµÇ¾î ¼­¹ö ¼º´ÉÀÌ ¶³¾îÁø´Ù. + ¼ýÀÚ°ªÀÇ ½ÇÁ¦ Àǹ̴ mod_charset_lite.c ¾ÕºÎºÐÀÇ + DBGLVL_ »ó¼ö Á¤ÀǸ¦ Âü°íÇ϶ó.
    + +
    ImplicitAdd | NoImplicitAdd
    + +
    ImplicitAdd Å°¿öµå´Â ³»¿ëÀ» º¯È¯ÇÒ + ¹®ÀÚÁýÇÕÀ» ÁöÁ¤Çϸé ÀÚµ¿À¸·Î mod_charset_lite¸¦ + ÇÊÅÍ¿¡ Ãß°¡ÇÑ´Ù. AddOutputFilter Áö½Ã¾î·Î ÇÊÅͼø¼­¸¦ Á÷Á¢ + ÁöÁ¤ÇÑ´Ù¸é, NoImplicitAdd¸¦ »ç¿ëÇÏ¿© + mod_charset_lite°¡ ÀÚµ¿À¸·Î ÇÊÅÍ¿¡ + Ãß°¡µÇÁö¾Êµµ·Ï ÇØ¾ß ÇÑ´Ù.
    +
    + +
    +
    top
    +

    CharsetSourceEnc Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:ÆÄÀÏ ¿øº»ÀÇ ¹®ÀÚÁýÇÕ
    ¹®¹ý:CharsetSourceEnc charset
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®, directory, .htaccess
    Override ¿É¼Ç:FileInfo
    »óÅÂ:Experimental
    ¸ðµâ:mod_charset_lite
    +

    CharsetSourceEnc Áö½Ã¾î´Â Áö½Ã¾î¸¦ + »ç¿ëÇÑ À§Ä¡¿¡ ÀÖ´Â ÆÄÀÏµé ¿øº»ÀÇ ¹®ÀÚÁýÇÕÀ» ÁöÁ¤ÇÑ´Ù.

    + +

    charset ¾Æ±Ô¸ÕÆ®¿¡´Â APRÀÌ Áö¿øÇÏ´Â ¹®ÀÚÁýÇÕ + À̸§À» »ç¿ëÇØ¾ß ÇÑ´Ù. ÀϹÝÀûÀ¸·Î iconv°¡ Áö¿øÇÏ´Â ¹®ÀÚÁýÇÕÀ» + ÀǹÌÇÑ´Ù.

    + +

    ¿¹Á¦

    + <Directory /export/home/trawick/apacheinst/htdocs/convert>
    + + CharsetSourceEnc UTF-16BE
    + CharsetDefault ISO-8859-1
    +
    + </Directory> +

    + +

    Solaris 8ÀÇ iconv°¡ ÀÌ ¿¹Á¦ÀÇ ¹®ÀÚÁýÇÕÀ» Áö¿øÇÑ´Ù.

    + +
    +
    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dav.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dav.html new file mode 100644 index 00000000..5cdb02d8 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dav.html @@ -0,0 +1,13 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_dav.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: mod_dav.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: mod_dav.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dav.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dav.html.en new file mode 100644 index 00000000..60ed3155 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dav.html.en @@ -0,0 +1,268 @@ + + + +mod_dav - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_dav

    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + + + +
    Description:Distributed Authoring and Versioning +(WebDAV) functionality
    Status:Extension
    Module Identifier:dav_module
    Source File:mod_dav.c
    +

    Summary

    + +

    This module provides class 1 and class 2 WebDAV ('Web-based Distributed + Authoring and Versioning') functionality for Apache. This + extension to the HTTP protocol allows creating, moving, + copying, and deleting resources and collections on a remote web + server.

    +
    + +
    top
    +
    +

    Enabling WebDAV

    +

    To enable mod_dav, add the following to a + container in your httpd.conf file:

    + +

    Dav On

    + +

    This enables the DAV file system provider, which is implemented + by the mod_dav_fs module. Therefore, that module + must be compiled into the server or loaded at runtime using the + LoadModule directive.

    + +

    In addition, a location for the DAV lock database must be + specified in the global section of your httpd.conf + file using the DavLockDB + directive:

    + +

    + DavLockDB /usr/local/apache2/var/DavLock +

    + +

    The directory containing the lock database file must be + writable by the User + and Group under which + Apache is running.

    + +

    You may wish to add a <Limit> clause inside the <Location> directive to limit access to + DAV-enabled locations. If you want to set the maximum amount of + bytes that a DAV client can send at one request, you have to use + the LimitXMLRequestBody + directive. The "normal" LimitRequestBody directive has no effect on DAV + requests.

    + +

    Full Example

    + DavLockDB /usr/local/apache2/var/DavLock
    +
    + <Location /foo>
    + + Dav On
    +
    + AuthType Basic
    + AuthName DAV
    + AuthUserFile user.passwd
    +
    + <LimitExcept GET OPTIONS>
    + + require user admin
    +
    + </LimitExcept>
    +
    + </Location>
    +

    + +

    mod_dav is a descendent of Greg Stein's mod_dav for Apache 1.3. More + information about the module is available from that site.

    +
    top
    +
    +

    Security Issues

    + +

    Since DAV access methods allow remote clients to manipulate + files on the server, you must take particular care to assure that + your server is secure before enabling mod_dav.

    + +

    Any location on the server where DAV is enabled should be + protected by authentication. The use of HTTP Basic Authentication + is not recommended. You should use at least HTTP Digest + Authentication, which is provided by the + mod_auth_digest module. Nearly all WebDAV clients + support this authentication method. An alternative is Basic + Authentication over an SSL enabled + connection.

    + +

    In order for mod_dav to manage files, it must + be able to write to the directories and files under its control + using the User and + Group under which + Apache is running. New files created will also be owned by this + User and Group. For this reason, it is + important to control access to this account. The DAV repository + is considered private to Apache; modifying files outside of Apache + (for example using FTP or filesystem-level tools) should not be + allowed.

    + +

    mod_dav may be subject to various kinds of + denial-of-service attacks. The LimitXMLRequestBody directive can be + used to limit the amount of memory consumed in parsing large DAV + requests. The DavDepthInfinity directive can be + used to prevent PROPFIND requests on a very large + repository from consuming large amounts of memory. Another + possible denial-of-service attack involves a client simply filling + up all available disk space with many large files. There is no + direct way to prevent this in Apache, so you should avoid giving + DAV access to untrusted users.

    +
    top
    +
    +

    Complex Configurations

    + +

    One common request is to use mod_dav to + manipulate dynamic files (PHP scripts, CGI scripts, etc). This is + difficult because a GET request will always run the + script, rather than downloading its contents. One way to avoid + this is to map two different URLs to the content, one of which + will run the script, and one of which will allow it to be + downloaded and manipulated with DAV.

    + +

    +Alias /phparea /home/gstein/php_files
    +Alias /php-source /home/gstein/php_files
    +<Location /php-source> + + DAV On
    + ForceType text/plain
    +
    +</Location> +

    + +

    With this setup, http://example.com/phparea can be + used to access the output of the PHP scripts, and + http://example.com/php-source can be used with a DAV + client to manipulate them.

    +
    +
    top
    +

    Dav Directive

    + + + + + + + +
    Description:Enable WebDAV HTTP methods
    Syntax:Dav On|Off|provider-name
    Default:Dav Off
    Context:directory
    Status:Extension
    Module:mod_dav
    +

    Use the Dav directive to enable the + WebDAV HTTP methods for the given container:

    + +

    + <Location /foo>
    + + Dav On
    +
    + </Location> +

    + +

    The value On is actually an alias for the default + provider filesystem which is served by the mod_dav_fs module. Note, that once you have DAV enabled + for some location, it cannot be disabled for sublocations. + For a complete configuration example have a look at the section above.

    + +
    + Do not enable WebDAV until you have secured your server. Otherwise + everyone will be able to distribute files on your system. +
    + +
    +
    top
    +

    DavDepthInfinity Directive

    + + + + + + + +
    Description:Allow PROPFIND, Depth: Infinity requests
    Syntax:DavDepthInfinity on|off
    Default:DavDepthInfinity off
    Context:server config, virtual host, directory
    Status:Extension
    Module:mod_dav
    +

    Use the DavDepthInfinity directive to + allow the processing of PROPFIND requests containing the + header 'Depth: Infinity'. Because this type of request could constitute + a denial-of-service attack, by default it is not allowed.

    + +
    +
    top
    +

    DavMinTimeout Directive

    + + + + + + + +
    Description:Minimum amount of time the server holds a lock on +a DAV resource
    Syntax:DavMinTimeout seconds
    Default:DavMinTimeout 0
    Context:server config, virtual host, directory
    Status:Extension
    Module:mod_dav
    +

    When a client requests a DAV resource lock, it can also + specify a time when the lock will be automatically removed by + the server. This value is only a request, and the server can + ignore it or inform the client of an arbitrary value.

    + +

    Use the DavMinTimeout directive to specify, in + seconds, the minimum lock timeout to return to a client. + Microsoft Web Folders defaults to a timeout of 120 seconds; the + DavMinTimeout can override this to a higher value + (like 600 seconds) to reduce the chance of the client losing + the lock due to network latency.

    + +

    Example

    + <Location /MSWord>
    + + DavMinTimeout 600
    +
    + </Location> +

    + +
    +
    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dav.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dav.html.ja.utf8 new file mode 100644 index 00000000..b54b90c0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dav.html.ja.utf8 @@ -0,0 +1,274 @@ + + + +mod_dav - Apache HTTP サーバ + + + + + + +
    <-
    + +
    +

    Apache モジュール mod_dav

    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + + + +
    説明:分散オーサリングとバージョン管理 +(WebDAV) 機能
    ステータス:Extension
    モジュール識別子:dav_module
    ソースファイル:mod_dav.c
    +

    概要

    + +

    このモジュールはクラス 1 とクラス 2 の + WebDAV + ('ウェブベースの分散オーサリングとバージョン管理') + 機能を Apache に提供します。 + この HTTP プロトコルの拡張により、リモートのウェブサーバ上にある + リソースやコレクションを + 作成、移動、複製、削除できるようになります。

    +
    + +
    top
    +
    +

    Enabling WebDAV

    +

    mod_dav を有効にするには、httpd.conf + ファイル中のコンテナに次を加えます:

    + +

    Dav On

    + +

    これは DAV ファイルシステムプロバイダを有効にします。DAV + ファイルシステムプロバイダは mod_dav_fs + モジュールで実装されています。ですから、このモジュールはコンパイル時に + サーバに組み込まれているか、あるいは + LoadModule + を使用して実行時にロードされている必要があります。

    + +

    さらに、DAV ロックデータベースの場所が + DavLockDB ディレクティブを使って + httd.conf ファイルのグローバルセクションに指定されている + 必要があります。

    + +

    + DavLockDB /usr/local/apache2/var/DavLock +

    + +

    ロックデータベースファイルのあるディレクトリは Apache が実行されている + User と Group に書き込み権限がある必要があります。

    + +

    <Limit> + 節を <Location> + ディレクティブ内部に追加して、DAV が有効な場所への + アクセスを制限することもできます。DAV クライアントが + 一度のリクエストで送信できる最大バイト数を指定したいときは、 + LimitXMLRequestBody + ディレクティブを使用する必要があります。「通常の」 + LimitRequestBody + ディレクティブは DAV リクエストに対しては効力を持ちません。

    + +

    完全な例

    + DavLockDB /usr/local/apache2/var/DavLock
    +
    + <Location /foo>
    + + Dav On
    +
    + AuthType Basic
    + AuthName DAV
    + AuthUserFile user.passwd
    +
    + <LimitExcept GET OPTIONS>
    + + require user admin
    +
    + </LimitExcept>
    +
    + </Location>
    +

    + +

    mod_dav は Greg Stein さんの Apache 1.3 用の mod_dav に + 由来するものです。そのサイトからより多くの情報を手に入れることができます。

    +
    top
    +
    +

    セキュリティの問題

    + +

    DAV のアクセスメソッドは遠隔クライアントがサーバのファイルを + 操作することを可能にしますので、 mod_dav を使用する + 前に、サーバが安全であることを特に注意して確認しなければなりません。

    + +

    サーバ上の DAV が使用可能になっている場所はすべて認証で保護してください。 + HTTP 基本認証の使用は推奨できません。少なくとも + mod_auth_digest モジュールで提供される HTTP + ダイジェスト認証を用いるべきです。WebDAV クライアントのほとんどは + この認証方法に対応しています。代わりに、SSL が + 有効なコネクションを通した基本認証を使うこともできます。

    + +

    mod_dav がファイルを操作できるようにするためには、 + 管理下のディレクトリとファイルとに Apache が実行されている User と Group で書き込み可能である必要があります。 + 新しく作成されるファイルもこの User + と Group に所有される + ことになります。この理由から、そのアカウントへのアクセスを制御することは + 重要です。DAV リポジトリは Apache 専用のものだとみなされています。 + Apache 以外の方法でファイルを修正すること (例えば FTP やファイルシステム + 用のツールなどを使って) は許可されていません。

    + +

    mod_dav はいろいろな種類のサービス拒否攻撃にさらされる + かもしれません。LimitXMLRequestBody ディレクティブを使うと + 大きな DAV リクエストを解析するときに消費されるメモリの量を制限することが + できます。DavDepthInfinity ディレクティブは + PROPFIND リクエストが巨大リポジトリで大量のメモリを消費するのを + 防ぐことができます。他のサービス拒否攻撃には単純に使用可能なディスク領域を + 多くの大きなファイルで埋めてしまうんものがあります。これを直接防ぐ方法は + Apache にはありませんので、信用できないユーザに DAV アクセスを提供するのは + 避けた方が良いでしょう。

    +
    top
    +
    +

    複雑な設定

    + +

    よくある要求に、mod_dav を使って動的なファイル + (PHP スクリプト、CGI スクリプトなど) を操作したいというものがあります。 + これの実現は、GET リクエストはスクリプトの内容をダウンロードさせる + 代わりに、スクリプトを常に実行させてしまうので難しくなっています。 + これを回避する方法には、二つの違う URL を同じコンテンツにマップし、 + 一つはスクリプトを実行させ、もう一つはダウンロードさせたり、DAV から + 操作されたりするように設定するというものがあります。

    + +

    +Alias /phparea /home/gstein/php_files
    +Alias /php-source /home/gstein/php_files
    +<Location /php-source> + + DAV On
    + ForceType text/plain
    +
    +</Location> +

    + +

    この設定により、http://example.com/phparea を PHP スクリプトの + 出力をアクセスするために使うことができ、 + http://example.com/php-source を DAV クライアントによる + が操作のために使うことができます。

    +
    +
    top
    +

    Dav ディレクティブ

    + + + + + + + +
    説明:WebDAV HTTP メソッドを有効にします
    構文:Dav On|Off|provider-name
    デフォルト:Dav Off
    コンテキスト:ディレクトリ
    ステータス:Extension
    モジュール:mod_dav
    +

    与えられたコンテナで WebDAV HTTP メソッドが使えるようにするには + 次のようにします。

    + +

    + <Location /foo>
    + + Dav On
    +
    + </Location> +

    + +

    On という指定は実際には mod_dav_fs + で提供されているデフォルトのプロバイダ、filesystem + へのエイリアスになっています。一度あるロケーションで DAV + を有効にした後は、そのサブロケーションで無効化することはできない + ということに注意してください。完全な設定例は上記のセクション をご覧下さい。

    + +
    + サーバのセキュリティが確保できるまで WebDAV を有効にしないでください。 + そうしなければ誰でもそのサーバでファイルを配布することができるように + なってしまいます。 +
    + +
    +
    top
    +

    DavDepthInfinity ディレクティブ

    + + + + + + + +
    説明:PROPFIND, Depth: Infinity リクエストを許可します
    構文:DavDepthInfinity on|off
    デフォルト:DavDepthInfinity off
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ
    ステータス:Extension
    モジュール:mod_dav
    +

    'Depth: Infinity' を含んでいる + PROPFIND リクエストを処理できるようにするには、 + DavDepthInfinity + ディレクティブを使います。このタイプのリクエストは + denial-of-service アタックとなりうるので、 + デフォルトでは許可されていません。

    + +
    +
    top
    +

    DavMinTimeout ディレクティブ

    + + + + + + + +
    説明:サーバが DAV リソースのロックを維持する最小時間です。 +
    構文:DavMinTimeout seconds
    デフォルト:DavMinTimeout 0
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ
    ステータス:Extension
    モジュール:mod_dav
    +

    クライアントが DAV リソースロックを要求した場合、 + ロックがサーバによって自動的に解除されるまでの時間を + 同時に指定することができます。この値は単なるリクエストであって、 + サーバはこれを無視することもできますし、 + 任意の値をクライアントに通知することもできます。

    + +

    クライアントに戻すロックタイムアウトの最小時間を、 + 秒で、指定するために DavMinTimeout + ディレクティブを使います。 + マイクロソフトのウェブフォルダのデフォルトでは 120 秒ですが; + ネットワークの遅延のせいでクライアントがロックを失うのを減らすために、 + DavMinTimeout を使って + これをもっと大きな値 (例えば 600 秒) に上書きできます。

    + +

    例

    + <Location /MSWord>
    + + DavMinTimeout 600
    +
    + </Location> +

    + +
    +
    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dav.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dav.html.ko.euc-kr new file mode 100644 index 00000000..a2576195 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dav.html.ko.euc-kr @@ -0,0 +1,263 @@ + + + +mod_dav - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    ¾ÆÆÄÄ¡ ¸ðµâ mod_dav

    +
    +

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

    +
    + + + +
    ¼³¸í:Distributed Authoring and Versioning +(WebDAV) ±â´É
    »óÅÂ:Extension
    ¸ðµâ¸í:dav_module
    ¼Ò½ºÆÄÀÏ:mod_dav.c
    +

    ¿ä¾à

    + +

    ÀÌ ¸ðµâÀº ¾ÆÆÄÄ¡¿¡ WebDAV + ('Web-based Distributed Authoring and Versioning') class 1°ú + class 2 ±â´ÉÀ» Ãß°¡ÇÑ´Ù. WebDAV´Â ¿ø°Ý À¥¼­¹öÀÇ ÀÚ¿ø°ú + ÄÝ·º¼Ç(collection)À» (¿ªÁÖ; ÄÝ·º¼ÇÀº ÆÄÀϽýºÅÛÀÇ µð·ºÅ丮¿Í + °°Àº °³³äÀÌ´Ù) ¸¸µé°í, ¿Å±â°í, º¹»çÇÏ°í, Áö¿ï + ¼ö ÀÖµµ·Ï HTTP ÇÁ·ÎÅäÄÝÀ» È®ÀåÇÑ °ÍÀÌ´Ù.

    +
    + +
    top
    +
    +

    WebDAV »ç¿ëÇϱâ

    +

    mod_dav¸¦ »ç¿ëÇÏ·Á¸é httpd.conf + ÆÄÀÏ¿¡ ¾Æ·¡°ú °°ÀÌ Ãß°¡ÇÑ´Ù:

    + +

    Dav On

    + +

    ±×·¯¸é mod_dav_fs ¸ðµâÀÌ ±¸ÇöÇÏ´Â DAV + ÆÄÀϽýºÅÛ Á¦°øÀÚ(provider)¸¦ »ç¿ëÇÑ´Ù. ±×·¯¹Ç·Î ÀÌ ¸ðµâµµ + ¼­¹ö¿¡ °°ÀÌ ÄÄÆÄÀϵÇÀְųª LoadModule Áö½Ã¾î·Î ½ÇÇàÁß¿¡ + Àоîµé¿©¾ß ÇÑ´Ù.

    + +

    ¶Ç, DAV Àá±Ý(lock) µ¥ÀÌÅͺ£À̽ºÀÇ À§Ä¡¸¦ httpd.conf + ÆÄÀÏÀÇ Àü¿ª ºÎºÐ¿¡ DavLockDB Áö½Ã¾î¸¦ »ç¿ëÇÏ¿© + ÁöÁ¤ÇØ¾ß ÇÑ´Ù:

    + +

    + DavLockDB /usr/local/apache2/var/DavLock +

    + +

    ¾ÆÆÄÄ¡¸¦ ½ÇÇàÇÏ´Â User¿Í GroupÀº Àá±Ý µ¥ÀÌÅͺ£À̽º°¡ + ÀÖ´Â µð·ºÅ丮¿¡ ¾²±â ±ÇÇÑÀ» °¡Á®¾ß ÇÑ´Ù.

    + +

    DAV¸¦ »ç¿ëÇÏ´Â À§Ä¡¿¡ Á¢±ÙÀ» Á¦ÇÑÇϱâÀ§ÇØ <Location> Áö½Ã¾î + ¾È¿¡ <Limit> + Áö½Ã¾î¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. DAV Ŭ¶óÀ̾ðÆ®°¡ ÇѹøÀÇ ¿äû¿¡ + º¸³¾ ¼ö ÀÖ´Â ÃÖ´ë ¹ÙÀÌÆ®¼ö¸¦ Á¦ÇÑÇÏ·Á¸é LimitXMLRequestBody Áö½Ã¾î¸¦ »ç¿ëÇÑ´Ù. + "ÀϹÝÀûÀÎ" LimitRequestBody + Áö½Ã¾î´Â DAV ¿äû°ú °ü°è¾ø´Ù.

    + +

    Àüü ¿¹Á¦

    + DavLockDB /usr/local/apache2/var/DavLock
    +
    + <Location /foo>
    + + Dav On
    +
    + AuthType Basic
    + AuthName DAV
    + AuthUserFile user.passwd
    +
    + <LimitExcept GET OPTIONS>
    + + require user admin
    +
    + </LimitExcept>
    +
    + </Location>
    +

    + +

    mod_dav´Â Greg SteinÀÌ ¸¸µç Apache 1.3¿ë mod_dav¸¦ + ±â¹ÝÀ¸·Î ¸¸µé¾ú´Ù. ¸ðµâ¿¡ ´ëÇÑ ´õ ÀÚ¼¼ÇÑ Á¤º¸´Â ±× »çÀÌÆ®¸¦ + Âü°íÇ϶ó.

    +
    top
    +
    +

    º¸¾È ¹®Á¦

    + +

    DAV¸¦ »ç¿ëÇÏ¸é ¿ø°Ý Ŭ¶óÀ̾ðÆ®°¡ ¼­¹öÀÇ ÆÄÀÏÀ» Á¶ÀÛÇÒ + ¼ö Àֱ⶧¹®¿¡, mod_dav¸¦ »ç¿ëÇϱâ Àü¿¡ + ¼­¹ö°¡ ¾ÈÀüÇÑÁö Ưº°È÷ °ü½ÉÀ» °¡Á®¾ß ÇÑ´Ù.

    + +

    ¼­¹ö¿¡¼­ DAV°¡ °¡´ÉÇÑ À§Ä¡´Â ÀÎÁõÀ¸·Î º¸È£ÇØ¾ß ÇÑ´Ù. + HTTP Basic Authentication´Â ÃßõÇÏÁö ¾Ê´Â´Ù. ÃÖ¼ÒÇÑ + mod_auth_digest ¸ðµâÀÌ Á¦°øÇÏ´Â HTTP Digest + AuthenticationÀ» »ç¿ëÇØ¾ß ÇÑ´Ù. °ÅÀÇ ¸ðµç WebDAV Ŭ¶óÀ̾ðÆ®´Â + ÀÌ ÀÎÁõ ¹æ½ÄÀ» Áö¿øÇÑ´Ù. ¾Æ´Ï¸é SSL + ¿¬°á¿¡¼­ Basic AuthenticationÀ» »ç¿ëÇÒ ¼öµµ ÀÖ´Ù.

    + +

    mod_dav°¡ ÆÄÀÏÀ» Á¶ÀÛÇÏ·Á¸é, ¾ÆÆÄÄ¡¸¦ + ½ÇÇàÇÏ´Â User¿Í + GroupÀº ÇØ´ç + µð·ºÅ丮¿Í ÆÄÀÏ¿¡ ¾²±â ±ÇÇÑÀ» °¡Á®¾ß ÇÑ´Ù. ¶Ç, »õ·Î »ý¼ºÇÑ + ÆÄÀÏÀº User¿Í + GroupÀÌ ¼ÒÀ¯ÇÏ°Ô + µÈ´Ù. ±×·¡¼­ ¾Æ¹«³ª ÀÌ °èÁ¤¿¡ Á¢±ÙÇÒ ¼ö ¾øµµ·Ï Ç϶ó. DAV + ÀúÀå¼Ò´Â ¾ÆÆÄÄ¡¸¸ Á¢±ÙÇÒ ¼ö ÀÖ´Ù°í °¡Á¤ÇÑ´Ù. ¾ÆÆÄÄ¡¸¦ ÅëÇÏÁö¾Ê°í + (¿¹¸¦ µé¾î FTP³ª ÆÄÀϽýºÅÛ µµ±¸¸¦ »ç¿ëÇÏ¿©) ÆÄÀÏÀ» ¼öÁ¤ÇÔÀ» + Çã¿ëÇÏ¸é ¾ÈµÈ´Ù.

    + +

    mod_dav´Â ¿©·¯ ¼­ºñ½º°ÅºÎ °ø°ÝÀÇ ´ë»óÀÌ + µÉ ¼ö ÀÖ´Ù. LimitXMLRequestBody Áö½Ã¾î¸¦ + »ç¿ëÇÏ¿© Å« DAV ¿äûÀ» ÀÐÀ»¶§ ¸Þ¸ð¸®·®À» Á¦ÇÑÇÒ ¼ö ÀÖ´Ù. + DavDepthInfinity + Áö½Ã¾î¸¦ »ç¿ëÇÏ¿© ¸¹Àº ¸Þ¸ð¸®¸¦ ¼Ò¸ðÇϱâÀ§ÇÑ ¸Å¿ì Å« ÀúÀå¼ÒÀÇ + PROPFIND ¿äûÀ» ¸·À» ¼ö ÀÖ´Ù. ´Ü¼øÈ÷ Ŭ¶óÀ̾ðÆ®°¡ + ¿©·¯ Å« ÆÄÀϵé·Î µð½ºÅ©°ø°£À» ä¿ì´Â ¼­ºñ½º°ÅºÎ °ø°Ýµµ °¡´ÉÇÏ´Ù. + ¾ÆÆÄÄ¡¿¡¼­ À̸¦ ¸·À» Á÷Á¢ÀûÀÎ ¹æ¹ýÀº ¾ø´Ù. ±×·¯¹Ç·Î ½Å·ÚÇÏÁö¾Ê´Â + »ç¿ëÀÚ¿¡°Ô DAV Á¢±ÙÀ» Çã¿ëÇÏÁö ¾Êµµ·ÏÇ϶ó.

    +
    top
    +
    +

    º¹ÀâÇÑ ¼³Á¤

    + +

    ÀϹÝÀûÀÎ Áú¹®Áß Çϳª´Â (PHP ½ºÅ©¸³Æ®, CGI ½ºÅ©¸³Æ® µî) + µ¿ÀûÆÄÀÏ ÀÛ¾÷À» À§ÇØ mod_dav¸¦ »ç¿ëÇÏ´Â + ¹æ¹ýÀÌ´Ù. ÀÌ´Â GET ¿äûÀÌ ÆÄÀÏ ³»¿ëÀ» ´Ù¿î·ÎµåÇÏÁö + ¾Ê°í Ç×»ó ½ºÅ©¸³Æ®¸¦ ½ÇÇàÇϹǷΠ¾î·Æ´Ù. ÇØ°á¹æ¹ýÁß Çϳª´Â + ³»¿ë¿¡ µÎ°³ÀÇ URLÀ» ´ëÀÀÇÏ´Â °ÍÀÌ´Ù. ÇÑ URLÀº ½ºÅ©¸³Æ®¸¦ + ½ÇÇàÇÏ°í, ´Ù¸¥ URL·Î´Â ÆÄÀÏÀ» ´Ù¿î·ÎµåÇÏ¿© DAV·Î ÀÛ¾÷ÇÒ + ¼ö ÀÖ´Ù.

    + +

    +Alias /phparea /home/gstein/php_files
    +Alias /php-source /home/gstein/php_files
    +<Location /php-source> + + DAV On
    + ForceType text/plain
    +
    +</Location> +

    + +

    ÀÌ ¼³Á¤¿¡¼­ http://example.com/phparea´Â + PHP ½ºÅ©¸³Æ®ÀÇ °á°ú¸¦ º¸¿©ÁÖ°í, + http://example.com/php-source·Î´Â DAV Ŭ¶óÀ̾ðÆ®¿¡¼­ + ½ºÅ©¸³Æ®¸¦ ¼öÁ¤ÇÒ ¼ö ÀÖ´Ù.

    +
    +
    top
    +

    Dav Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:WebDAV HTTP ¸Þ½áµå¸¦ ½ÃÀÛÇÑ´Ù
    ¹®¹ý:Dav On|Off|provider-name
    ±âº»°ª:Dav Off
    »ç¿ëÀå¼Ò:directory
    »óÅÂ:Extension
    ¸ðµâ:mod_dav
    +

    ÁöÁ¤ÇÑ À§Ä¡¿¡¼­ WebDAV HTTP ¸Þ½áµå¸¦ »ç¿ëÇÏ·Á¸é + Dav Áö½Ã¾î¸¦ »ç¿ëÇÑ´Ù:

    + +

    + <Location /foo>
    + + Dav On
    +
    + </Location> +

    + +

    On °ªÀº ½ÇÁ¦·Î mod_dav_fs + ¸ðµâÀÌ Á¦°øÇÏ´Â ±âº» Á¦°øÀÚÀÎ filesystemÀÇ + º°ÄªÀÌ´Ù. ¾î¶² À§Ä¡¿¡¼­ DAV¸¦ ½ÃÀÛÇϸé ÇÏÀ§°ø°£¿¡¼­ DAV¸¦ + »ç¿ë¾ÈÇϵµ·Ï ¼³Á¤ÇÒ ¼ö ¾øÀ½À» ÁÖÀÇÇ϶ó. ¿ÏÀüÇÑ + ¼³Á¤¿¹´Â À§ÀÇ ÀýÀ» Âü°íÇ϶ó.

    + +
    + ¼­¹ö¸¦ ¾ÈÀüÇÏ°Ô ±¸¼ºÇÒ¶§±îÁö WebDAVÀ» »ç¿ëÇÏÁö ¸¶¶ó. ±×·¸Áö + ¾ÊÀ¸¸é ´©±¸¶óµµ ¼­¹ö¸¦ ÅëÇØ ÆÄÀÏÀ» ºÐ¹èÇÒ ¼ö ÀÖ°Ô µÈ´Ù. +
    + +
    +
    top
    +

    DavDepthInfinity Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:PROPFINDÀÇ Depth: Infinity ¿äûÀ» Çã°¡ÇÑ´Ù
    ¹®¹ý:DavDepthInfinity on|off
    ±âº»°ª:DavDepthInfinity off
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®, directory
    »óÅÂ:Extension
    ¸ðµâ:mod_dav
    +

    DavDepthInfinity Áö½Ã¾î¸¦ »ç¿ëÇϸé + 'Depth: Infinity' Çì´õ¸¦ °¡Áø PROPFIND ¿äûÀ» + Çã°¡ÇÑ´Ù. ÀÌ·± ¿äûÀ» »ç¿ëÇÏ¿© ¼­ºñ½º°ÅºÎ °ø°ÝÀÌ °¡´ÉÇϱâ + ¶§¹®¿¡ ±âº»ÀûÀ¸·Î Çã¿ëÇÏÁö ¾Ê´Â´Ù.

    + +
    +
    top
    +

    DavMinTimeout Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:¼­¹ö°¡ DAV ÀÚ¿ø¿¡ ´ëÇØ À¯ÁöÇÒ Àá±ÝÀÇ Ãּҽð£
    ¹®¹ý:DavMinTimeout seconds
    ±âº»°ª:DavMinTimeout 0
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®, directory
    »óÅÂ:Extension
    ¸ðµâ:mod_dav
    +

    Ŭ¶óÀ̾ðÆ®°¡ DAV ÀÚ¿ø¿¡ Àá±Ý(lock)À» ¿äûÇÒ¶§ ¼­¹ö°¡ + ¾Ë¾Æ¼­ Àá±ÝÀ» Á¦°ÅÇÒ ¼ö ÀÖ´Â ½Ã°£À» °°ÀÌ ¾Ë·ÁÁÙ ¼ö ÀÖ´Ù. ÀÌ °ªÀº + ´ÜÁö ¿äûÀÏ»ÓÀ̸ç, ¼­¹ö´Â Ŭ¶óÀ̾ðÆ®°¡ ¿äûÇÑ °ªÀ» ¹«½ÃÇÏ°í + Ŭ¶óÀ̾ðÆ®¿¡°Ô ÀÓÀÇÀÇ ½Ã°£À» ¾Ë·ÁÁÙ ¼ö ÀÖ´Ù.

    + +

    DavMinTimeout Áö½Ã¾î´Â Ŭ¶óÀ̾ðÆ®¿¡°Ô + º¸³¾ ÃÖ¼Ò Àá±Ý ½Ã°£À» (ÃÊ´ÜÀ§) ÁöÁ¤ÇÑ´Ù. Microsoft Web Folders´Â + ±âº»°ªÀ¸·Î 120 Ãʸ¦ »ç¿ëÇÑ´Ù. DavMinTimeout¿¡ + (600 ÃÊ¿Í °°ÀÌ) ´õ ³ôÀº °ªÀ» »ç¿ëÇϸé Ŭ¶óÀ̾ðÆ®°¡ ³×Æ®¿÷ + Áö¿¬¶§¹®¿¡ Àá±ÝÀ» ÀҰԵǴ °æ¿ì¸¦ ÁÙÀÏ ¼ö ÀÖ´Ù.

    + +

    ¿¹Á¦

    + <Location /MSWord>
    + + DavMinTimeout 600
    +
    + </Location> +

    + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dav_fs.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dav_fs.html new file mode 100644 index 00000000..08525a40 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dav_fs.html @@ -0,0 +1,13 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_dav_fs.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: mod_dav_fs.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: mod_dav_fs.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dav_fs.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dav_fs.html.en new file mode 100644 index 00000000..bb21d237 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dav_fs.html.en @@ -0,0 +1,97 @@ + + + +mod_dav_fs - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_dav_fs

    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + + + +
    Description:filesystem provider for mod_dav
    Status:Extension
    Module Identifier:dav_fs_module
    Source File:mod_dav_fs.c
    +

    Summary

    + +

    This module requires the service of mod_dav. It acts as a support module for mod_dav and provides access to resources located in the + server's file system. The formal name of this provider is + filesystem. mod_dav backend providers + will be invoked by using the Dav + directive:

    + +

    Example

    + Dav filesystem +

    + +

    Since filesystem is the default provider for + mod_dav, you may simply use the value + On instead.

    +
    +

    Directives

    + +

    See also

    +
    + +
    top
    +

    DavLockDB Directive

    + + + + + + +
    Description:Location of the DAV lock database
    Syntax:DavLockDB file-path
    Context:server config, virtual host
    Status:Extension
    Module:mod_dav_fs
    +

    Use the DavLockDB directive to specify + the full path to the lock database, excluding an extension. If + the path is not absolute, it will be taken relative to ServerRoot. The implementation of + mod_dav_fs uses a SDBM database to track user + locks.

    + + + +

    Example

    + DavLockDB var/DavLock +

    + +

    The directory containing the lock database file must be + writable by the User + and Group under which + Apache is running. For security reasons, you should create a + directory for this purpose rather than changing the permissions on + an existing directory. In the above example, Apache will create + files in the var/ directory under the ServerRoot with the base filename + DavLock and extension name chosen by the server.

    + + +
    +
    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dav_fs.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dav_fs.html.ja.utf8 new file mode 100644 index 00000000..217f565a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dav_fs.html.ja.utf8 @@ -0,0 +1,89 @@ + + + +mod_dav_fs - Apache HTTP サーバ + + + + + + +
    <-
    + +
    +

    Apache モジュール mod_dav_fs

    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + + + +
    説明:mod_dav のためのファイルシステムプロバイダ
    ステータス:Extension
    モジュール識別子:dav_fs_module
    ソースファイル:mod_dav_fs.c
    +

    概要

    + +

    このモジュールは mod_dav + のサービスを必要とします。mod_dav + のサポートモジュールとして動作し、サーバファイルシステム上に + 位置するリソースへのアクセスを提供します。このプロバイダの正式な名前は + filesystem です。mod_dav + バックエンドプロバイダは Dav + ディレクティブを使用して起動されます。

    + +

    例

    + Dav filesystem +

    + +

    filesystem は mod_dav + のデフォルトプロバイダになっていますから、代わりに単に + On と指定することもできます。

    +
    +

    ディレクティブ

    + +

    参照

    +
    + +
    top
    +

    DavLockDB ディレクティブ

    + + + + + + +
    説明:DAV ロックデータベースの位置
    構文:DavLockDB file-path
    コンテキスト:サーバ設定ファイル, バーチャルホスト
    ステータス:Extension
    モジュール:mod_dav_fs
    +

    ロックデータベースへのフルパスを、拡張子を除いた形で + 指定するには、DavLockDB + を使います。パスが絶対パスでなければ、ServerRoot からの相対パスと解釈されます。 + mod_dav_fs 実装では、ユーザロックを + 追跡するために SDBM データベースを使います。

    + + + +

    例

    + DavLockDB logs/DavLock +

    + +
    +
    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dav_fs.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dav_fs.html.ko.euc-kr new file mode 100644 index 00000000..d439c06d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dav_fs.html.ko.euc-kr @@ -0,0 +1,96 @@ + + + +mod_dav_fs - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    ¾ÆÆÄÄ¡ ¸ðµâ mod_dav_fs

    +
    +

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

    +
    + + + +
    ¼³¸í:mod_davÀ» À§ÇÑ ÆÄÀϽýºÅÛ Á¦°øÀÚ
    »óÅÂ:Extension
    ¸ðµâ¸í:dav_fs_module
    ¼Ò½ºÆÄÀÏ:mod_dav_fs.c
    +

    ¿ä¾à

    + +

    ÀÌ ¸ðµâÀº mod_dav ¼­ºñ½º¿¡ ÇÊ¿äÇÏ´Ù. + mod_dav¸¦ Áö¿øÇÏ´Â ¸ðµâ·Î ¼­¹öÀÇ ÆÄÀϽýºÅÛ¿¡ + ÀÖ´Â ÀÚ¿øÀ» Á¢±ÙÇÒ ¼ö ÀÖµµ·Ï ÇÑ´Ù. ÀÌ Á¦°øÀÚ(provider)ÀÇ + Á¤½Ä¸íĪÀº filesystemÀÌ´Ù. Dav Áö½Ã¾î¸¦ ÁöÁ¤ÇÏ¿© + mod_dav µÞ´Ü Á¦°øÀÚ¸¦ »ç¿ëÇÑ´Ù:

    + +

    ¿¹Á¦

    + Dav filesystem +

    + +

    filesystemÀÌ mod_davÀÇ + ±âº» Á¦°øÀÚÀ̹ǷΠ´ë½Å OnÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù.

    +
    +

    Áö½Ã¾îµé

    + +

    Âü°í

    +
    + +
    top
    +

    DavLockDB Áö½Ã¾î

    + + + + + + +
    ¼³¸í:DAV Àá±Ý µ¥ÀÌÅͺ£À̽º À§Ä¡
    ¹®¹ý:DavLockDB file-path
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®
    »óÅÂ:Extension
    ¸ðµâ:mod_dav_fs
    +

    DavLockDB Áö½Ã¾î´Â Àá±Ý µ¥ÀÌÅͺ£À̽ºÀÇ + Àüü °æ·Î¸¦ È®ÀåÀÚ¸¦ Á¦¿ÜÇÏ°í ÁöÁ¤ÇÑ´Ù. Àý´ë°æ·Î°¡ ¾Æ´Ï¸é + ServerRoot¿¡ »ó´ë°æ·Î·Î + ó¸®ÇÑ´Ù. mod_dav_fs´Â Àá±ÝÀ» SDBM µ¥ÀÌÅͺ£À̽º¿¡ + ±â·ÏÇÑ´Ù.

    + + + +

    ¿¹Á¦

    + DavLockDB var/DavLock +

    + +

    ¾ÆÆÄÄ¡¸¦ ½ÇÇàÇÏ´Â User¿Í + GroupÀº Àá±Ý + µ¥ÀÌÅͺ£À̽º°¡ ÀÖ´Â µð·ºÅ丮¿¡ ¾²±â ±ÇÇÑÀ» °¡Á®¾ß ÇÑ´Ù. + º¸¾È»ó ÀÌÀ¯·Î ±âÁ¸ µð·ºÅ丮ÀÇ ±ÇÇÑÀ» ¹Ù²Ù±âº¸´Ù´Â Àá±Ý + µ¥ÀÌÅͺ£À̽º¿ë µð·ºÅ丮¸¦ ¸¸µé¾î¾ß ÇÑ´Ù. À§ÀÇ °æ¿ì ¾ÆÆÄÄ¡´Â + ServerRoot ¾Æ·¡ + var/ µð·ºÅ丮¿¡ ¼­¹ö°¡ ¼±ÅÃÇÑ È®Àå¸íÀ» °¡Áø + DavLock ÆÄÀÏÀ» ¸¸µç´Ù.

    + + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_deflate.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_deflate.html new file mode 100644 index 00000000..9bb00b5f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_deflate.html @@ -0,0 +1,13 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_deflate.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: mod_deflate.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: mod_deflate.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_deflate.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_deflate.html.en new file mode 100644 index 00000000..c61f25a9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_deflate.html.en @@ -0,0 +1,356 @@ + + + +mod_deflate - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_deflate

    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + + + +
    Description:Compress content before it is delivered to the +client
    Status:Extension
    Module Identifier:deflate_module
    Source File:mod_deflate.c
    +

    Summary

    + +

    The mod_deflate module provides + the DEFLATE output filter that allows output from + your server to be compressed before being sent to the client over + the network.

    +
    + +
    top
    +
    +

    Sample Configurations

    +

    This is a simple sample configuration for the impatient.

    + +

    Compress only a few types

    + AddOutputFilterByType DEFLATE text/html text/plain text/xml +

    + +

    The following configuration, while resulting in more compressed content, + is also much more complicated. Do not use this unless you fully understand + all the configuration details.

    + +

    Compress everything except images

    + <Location />
    + + # Insert filter
    + SetOutputFilter DEFLATE
    +
    + # Netscape 4.x has some problems...
    + BrowserMatch ^Mozilla/4 gzip-only-text/html
    +
    + # Netscape 4.06-4.08 have some more problems
    + BrowserMatch ^Mozilla/4\.0[678] no-gzip
    +
    + # MSIE masquerades as Netscape, but it is fine
    + # BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
    +
    + # NOTE: Due to a bug in mod_setenvif up to Apache 2.0.48
    + # the above regex won't work. You can use the following
    + # workaround to get the desired effect:
    + BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
    +
    + # Don't compress images
    + SetEnvIfNoCase Request_URI \
    + + \.(?:gif|jpe?g|png)$ no-gzip dont-vary
    +
    +
    + # Make sure proxies don't deliver the wrong content
    + Header append Vary User-Agent env=!dont-vary
    +
    + </Location> +

    + +
    top
    +
    +

    Enabling Compression

    + +

    Output Compression

    +

    Compression is implemented by the DEFLATE + filter. The following directive + will enable compression for documents in the container where it + is placed:

    + +

    + SetOutputFilter DEFLATE +

    + +

    Some popular browsers cannot handle compression of all content + so you may want to set the gzip-only-text/html note to + 1 to only allow html files to be compressed (see + below). If you set this to anything but 1 it + will be ignored.

    + +

    If you want to restrict the compression to particular MIME types + in general, you may use the AddOutputFilterByType directive. Here is an example of + enabling compression only for the html files of the Apache + documentation:

    + +

    + <Directory "/your-server-root/manual">
    + + AddOutputFilterByType DEFLATE text/html
    +
    + </Directory> +

    + +

    For browsers that have problems even with compression of all file + types, use the BrowserMatch directive to set the no-gzip + note for that particular browser so that no compression will be + performed. You may combine no-gzip with gzip-only-text/html to get the best results. In that case + the former overrides the latter. Take a look at the following + excerpt from the configuration example + defined in the section above:

    + +

    + BrowserMatch ^Mozilla/4 gzip-only-text/html
    + BrowserMatch ^Mozilla/4\.0[678] no-gzip
    + BrowserMatch \bMSIE !no-gzip !gzip-only-text/html +

    + +

    At first we probe for a User-Agent string that + indicates a Netscape Navigator version of 4.x. These versions + cannot handle compression of types other than + text/html. The versions 4.06, 4.07 and 4.08 also + have problems with decompressing html files. Thus, we completely + turn off the deflate filter for them.

    + +

    The third BrowserMatch + directive fixes the guessed identity of the user agent, because + the Microsoft Internet Explorer identifies itself also as "Mozilla/4" + but is actually able to handle requested compression. Therefore we + match against the additional string "MSIE" (\b means + "word boundary") in the User-Agent Header and turn off + the restrictions defined before.

    + +

    Note

    + The DEFLATE filter is always inserted after RESOURCE + filters like PHP or SSI. It never touches internal subrequests. +
    + + +

    Input Decompression

    +

    The mod_deflate module also provides a filter for + decompressing a gzip compressed request body . In order to activate + this feature you have to insert the DEFLATE filter into + the input filter chain using SetInputFilter or AddInputFilter, for example:

    + +

    + <Location /dav-area>
    + + SetInputFilter DEFLATE
    +
    + </Location> +

    + +

    Now if a request contains a Content-Encoding: + gzip header, the body will be automatically decompressed. + Few browsers have the ability to gzip request bodies. However, + some special applications actually do support request + compression, for instance some WebDAV clients.

    + +

    Note on Content-Length

    +

    If you evaluate the request body yourself, don't trust + the Content-Length header! + The Content-Length header reflects the length of the + incoming data from the client and not the byte count of + the decompressed data stream.

    +
    + +
    top
    +
    +

    Dealing with proxy servers

    + +

    The mod_deflate module sends a Vary: + Accept-Encoding HTTP response header to alert proxies that + a cached response should be sent only to clients that send the + appropriate Accept-Encoding request header. This + prevents compressed content from being sent to a client that will + not understand it.

    + +

    If you use some special exclusions dependent + on, for example, the User-Agent header, you must + manually configure an addition to the Vary header + to alert proxies of the additional restrictions. For example, + in a typical configuration where the addition of the DEFLATE + filter depends on the User-Agent, you should add:

    + +

    + Header append Vary User-Agent +

    + +

    If your decision about compression depends on other information + than request headers (e.g. HTTP version), you have to set the + Vary header to the value *. This prevents + compliant proxies from caching entirely.

    + +

    Example

    + Header set Vary * +

    +
    +
    top
    +

    DeflateBufferSize Directive

    + + + + + + + +
    Description:Fragment size to be compressed at one time by zlib
    Syntax:DeflateBufferSize value
    Default:DeflateBufferSize 8096
    Context:server config, virtual host
    Status:Extension
    Module:mod_deflate
    +

    The DeflateBufferSize directive specifies + the size in bytes of the fragments that zlib should compress at one + time.

    + +
    +
    top
    +

    DeflateCompressionLevel Directive

    + + + + + + + + +
    Description:How much compression do we apply to the output
    Syntax:DeflateCompressionLevel value
    Default:Zlib's default
    Context:server config, virtual host
    Status:Extension
    Module:mod_deflate
    Compatibility:This directive is available since Apache 2.0.45
    +

    The DeflateCompressionLevel directive specifies + what level of compression should be used, the higher the value, + the better the compression, but the more CPU time is required to + achieve this.

    +

    The value must between 1 (less compression) and 9 (more compression).

    + +
    +
    top
    +

    DeflateFilterNote Directive

    + + + + + + + +
    Description:Places the compression ratio in a note for logging
    Syntax:DeflateFilterNote [type] notename
    Context:server config, virtual host
    Status:Extension
    Module:mod_deflate
    Compatibility:type is available since Apache 2.0.45
    +

    The DeflateFilterNote directive + specifies that a note about compression ratios should be attached + to the request. The name of the note is the value specified for + the directive. You can use that note for statistical purposes by + adding the value to your access log.

    + +

    Example

    + DeflateFilterNote ratio
    +
    + LogFormat '"%r" %b (%{ratio}n) "%{User-agent}i"' deflate
    + CustomLog logs/deflate_log deflate +

    + +

    If you want to extract more accurate values from your logs, you + can use the type argument to specify the type of data + left as note for logging. type can be one of:

    + +
    +
    Input
    +
    Store the byte count of the filter's input stream in the note.
    + +
    Output
    +
    Store the byte count of the filter's output stream in the note.
    + +
    Ratio
    +
    Store the compression ratio (output/input * 100) + in the note. This is the default, if the type argument + is omitted.
    +
    + +

    Thus you may log it this way:

    + +

    Accurate Logging

    + DeflateFilterNote Input instream
    + DeflateFilterNote Output outstream
    + DeflateFilterNote Ratio ratio
    +
    + LogFormat '"%r" %{outstream}n/%{instream}n (%{ratio}n%%)' deflate
    + CustomLog logs/deflate_log deflate +

    + +

    See also

    + +
    +
    top
    +

    DeflateMemLevel Directive

    + + + + + + + +
    Description:How much memory should be used by zlib for compression
    Syntax:DeflateMemLevel value
    Default:DeflateMemLevel 9
    Context:server config, virtual host
    Status:Extension
    Module:mod_deflate
    +

    The DeflateMemLevel directive specifies + how much memory should be used by zlib for compression + (a value between 1 and 9).

    + +
    +
    top
    +

    DeflateWindowSize Directive

    + + + + + + + +
    Description:Zlib compression window size
    Syntax:DeflateWindowSize value
    Default:DeflateWindowSize 15
    Context:server config, virtual host
    Status:Extension
    Module:mod_deflate
    +

    The DeflateWindowSize directive specifies the + zlib compression window size (a value between 1 and 15). Generally, the + higher the window size, the higher can the compression ratio be expected.

    + +
    +
    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_deflate.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_deflate.html.ja.utf8 new file mode 100644 index 00000000..03c50b8b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_deflate.html.ja.utf8 @@ -0,0 +1,357 @@ + + + +mod_deflate - Apache HTTP サーバ + + + + + + +
    <-
    + +
    +

    Apache モジュール mod_deflate

    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + + + +
    説明:クライアントへ送られる前にコンテンツを圧縮する
    ステータス:Extension
    モジュール識別子:deflate_module
    ソースファイル:mod_deflate.c
    +

    概要

    + +

    mod_deflate モジュールは DEFLATE + 出力フィルタを提供します。これはサーバからの出力を、ネットワークを + 通してクライアントに送る前に圧縮することを可能にします。

    +
    + +
    top
    +
    +

    サンプル設定

    +

    下にせっかちな人向けの簡単な設定例を示します。

    + +

    数タイプのみ圧縮する

    + AddOutputFilterByType DEFLATE text/html text/plain text/xml +

    + +

    以下の設定はコンテンツをより圧縮しますが、ずっと複雑な設定になります。 + 設定の隅々までよく理解しないで使わないでください。

    + +

    画像以外全て圧縮する

    + <Location />
    + + # Insert filter
    + SetOutputFilter DEFLATE
    +
    + # Netscape 4.x has some problems...
    + BrowserMatch ^Mozilla/4 gzip-only-text/html
    +
    + # Netscape 4.06-4.08 have some more problems
    + BrowserMatch ^Mozilla/4\.0[678] no-gzip
    +
    + # MSIE masquerades as Netscape, but it is fine
    + # BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
    +
    + # NOTE: Due to a bug in mod_setenvif up to Apache 2.0.48
    + # the above regex won't work. You can use the following
    + # workaround to get the desired effect:
    + BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
    +
    + # Don't compress images
    + SetEnvIfNoCase Request_URI \
    + + \.(?:gif|jpe?g|png)$ no-gzip dont-vary
    +
    +
    + # Make sure proxies don't deliver the wrong content
    + Header append Vary User-Agent env=!dont-vary
    +
    + </Location> +

    + +
    top
    +
    +

    圧縮を有効にする

    + +

    Output Compression

    +

    圧縮機能は DEFLATE フィルタ + により実装されています。以下のディレクティブはそのディレクティブのある + コンテナ中のドキュメントを圧縮するようにします:

    + +

    + SetOutputFilter DEFLATE +

    + +

    よく使われているブラウザでは、すべてのコンテンツに対する + 圧縮を扱えるわけではありません。ですから、gzip-only-text/html + ノートを 1 にして、html ファイルに対してのみ + 圧縮が働くようにした方がよいかもしれません (以下参照) + この値を 1 以外の値に設定した場合は無視されます。

    + +

    通常、特定のMIMEタイプについてのみ圧縮したいのであれば、 + AddOutputFilterByType + ディレクティブを使用します。次に Apache のドキュメントの html + ファイルのみの圧縮を有効にする例を示します。

    + +

    + <Directory "/your-server-root/manual">
    + + AddOutputFilterByType DEFLATE text/html
    +
    + </Directory> +

    + +

    全てのファイルタイプでの圧縮に問題を抱えているブラウザに対しては、 + BrowserMatch + ディレクティブを使用して、特定のブラウザに no-gzip + ノートをセットし、圧縮が行なわれないようにします。 + no-gzip と gzip-only-text/html + を組み合わせることで上手く対処できます。 + この場合、前者が後者をオーバーライドします。 + 上記の設定例の抜粋を + 次に示しますのでご覧下さい。

    + +

    + BrowserMatch ^Mozilla/4 gzip-only-text/html
    + BrowserMatch ^Mozilla/4\.0[678] no-gzip
    + BrowserMatch \bMSIE !no-gzip !gzip-only-text/html +

    + +

    まず始めに User-Agent 文字列から Netscape Navigator + 4.x であるかどうかを調べます。これらのバージョンでは、 + text/html 以外のタイプの圧縮を扱うことができません。 + 4.06, 4.07, 4.08 は html ファイルの伸張にも問題を抱えています。 + ですからこれらに対しては、完全に deflate フィルタをオフにします。

    + +

    3 番目の BrowserMatch + ディレクティブで、推測したユーザーエージェントを修正します。 + なぜなら Microsoft Internet Explorer も "Mozilla/4" と特定されますが、 + これらは実際には圧縮を扱うことができるからです。 + User-Agent ヘッダを "MSIE" + (\b は「単語の境界」を意味します) の追加文字で検査して、 + これ以前に設定した制限を再び解除します。

    + +

    注

    + DEFLATE フィルタは必ず、PHP や SSI といった RESOURCE + フィルタの後になります。 + DEFLATE フィルタは内部的なサブリクエストを関知しません。 +
    + + + +

    入力の伸張

    +

    mod_deflate モジュールは、gzip + で圧縮されたリクエスト本体を伸張するフィルタも提供しています。 + この機能を有効にするには、SetInputFilter + か AddInputFilter を使用して、 + DEFLATE フィルタを入力フィルタチェインに組み込みます。 + 例えば次のようになります。

    + +

    + <Location /dav-area>
    + + SetInputFilter DEFLATE
    +
    + </Location> +

    + +

    この設定であれば、Content-Encoding: gzip + ヘッダを含むリクエストが来ると、本体は自動的に伸張されます。 + gzip リクエスト本体を送信するブラウザはあまりありません。 + しかし、例えば WebDAV + クライアントの幾つかなど、特別なアプリケーションでリクエストの + 圧縮を実際にサポートしているものもあります。

    + +

    Content-Length に関する注意

    +

    リクエスト本体それ自体を評価する場合は、Content-Length + ヘッダを信用しないでください。Content-Length ヘッダは、 + クライアントから送信されるデータの長さを反映しているのであって、 + 伸張されたデータストリームのバイトカウントではありません。

    +
    + +
    top
    +
    +

    Proxy サーバでの扱い

    + +

    mod_deflate モジュールは Vary: Accept-Encoding + HTTP 応答ヘッダを送信して、適切な Accept-Encoding + リクエストヘッダを送信するクライアントに対してのみ、 + プロクシサーバがキャッシュした応答を送信するように注意を喚起します。 + このようにして、圧縮を扱うことのできないクライアントに + 圧縮された内容が送られることのないようにします。

    + +

    もし特別に何かに依存して除外したい場合、例えば User-Agent + ヘッダなどに依存している場合、手動で Vary ヘッダを設定して、 + 追加の制限についてプロクシサーバに注意を行なう必要があります。 + 例えば User-Agent に依存して DEFLATE + を追加する典型的な設定では、次のように追加することになります。

    + +

    + Header append Vary User-Agent +

    + +

    リクエストヘッダ以外の情報 (例えば HTTP バージョン) + に依存して圧縮するかどうか決める場合、 + Vary ヘッダを * に設定する必要があります。 + このようにすると、仕様に準拠したプロクシはキャッシュを全く行なわなくなります。

    + +

    例

    + Header set Vary * +

    +
    +
    top
    +

    DeflateBufferSize ディレクティブ

    + + + + + + + +
    説明:zlib が一度に圧縮する塊の大きさ
    構文:DeflateBufferSize value
    デフォルト:DeflateBufferSize 8096
    コンテキスト:サーバ設定ファイル, バーチャルホスト
    ステータス:Extension
    モジュール:mod_deflate
    +

    DeflateBufferSize ディレクティブは + zlib が一度に圧縮する塊の大きさをバイト単位で指定します。

    + +
    +
    top
    +

    DeflateCompressionLevel ディレクティブ

    + + + + + + + + +
    説明:出力に対して行なう圧縮の程度
    構文:DeflateCompressionLevel value
    デフォルト:Zlib のデフォルト
    コンテキスト:サーバ設定ファイル, バーチャルホスト
    ステータス:Extension
    モジュール:mod_deflate
    互換性:This directive is available since Apache 2.0.45
    +

    DeflateCompressionLevel ディレクティブは + 圧縮の程度を設定します。大きな値では、より圧縮が行なわれますが、 + CPU 資源を消費します。

    +

    値は 1 (低圧縮) から 9 (高圧縮) です。

    + +
    +
    top
    +

    DeflateFilterNote ディレクティブ

    + + + + + + + +
    説明:ロギング用に圧縮比をメモに追加
    構文:DeflateFilterNote [type] notename
    コンテキスト:サーバ設定ファイル, バーチャルホスト
    ステータス:Extension
    モジュール:mod_deflate
    互換性:type is available since Apache 2.0.45
    +

    DeflateFilterNote ディレクティブは + 圧縮比に関するメモがリクエストに付加されることを指定します。 + メモ (note) の名前はディレクティブに指定された値です。 + メモはアクセスログに + 値を記録し、統計を取る目的にも使えます。

    + +

    例

    + DeflateFilterNote ratio
    +
    + LogFormat '"%r" %b (%{ratio}n) "%{User-agent}i"' deflate
    + CustomLog logs/deflate_log deflate +

    + +

    ログからもっと精密な値を抽出したい場合は、type + 引数を使用して、データタイプをログのメモとして残すように指定できます。 + type は次のうちの一つです。

    + +
    +
    Input
    +
    フィルタの入力ストリームのバイトカウントをメモに保存する。
    + +
    Output
    +
    フィルタの出力ストリームのバイトカウントをメモに保存する。
    + +
    Ratio
    +
    圧縮率 (出力 / 入力 * 100) をメモに保存する。 + type 引数を省略した場合は、これがデフォルトとなります。
    +
    + +

    まとめると、次のようにログを取ることになるでしょう。

    + +

    精密なログ採取

    + DeflateFilterNote Input instream
    + DeflateFilterNote Output outstream
    + DeflateFilterNote Ratio ratio
    +
    + LogFormat '"%r" %{outstream}n/%{instream}n (%{ratio}n%%)' deflate
    + CustomLog logs/deflate_log deflate +

    + +

    参照

    + +
    +
    top
    +

    DeflateMemLevel ディレクティブ

    + + + + + + + +
    説明:zlib が圧縮に使うメモリのレベルを指定
    構文:DeflateMemLevel value
    デフォルト:DeflateMemLevel 9
    コンテキスト:サーバ設定ファイル, バーチャルホスト
    ステータス:Extension
    モジュール:mod_deflate
    +

    DeflateMemLevel ディレクティブは + zlib が圧縮に使うメモリのレベルを設定します (1 から 9 の間の値)。 + (訳注: 2 を底とする対数の値になります。 + 8 程度が良いでしょう。)

    + +
    +
    top
    +

    DeflateWindowSize ディレクティブ

    + + + + + + + +
    説明:Zlib の圧縮用ウィンドウの大きさ
    構文:DeflateWindowSize value
    デフォルト:DeflateWindowSize 15
    コンテキスト:サーバ設定ファイル, バーチャルホスト
    ステータス:Extension
    モジュール:mod_deflate
    +

    DeflateWindowSize ディレクティブは + zlib の圧縮用ウィンドウ (訳注: zlib で使用される履歴バッファ) + の大きさを指定します (1 から 15 の間の値)。 + 一般的に大きなウィンドウサイズを使用すると圧縮率が向上します。 + (訳注: 2 を底とする対数の値になります。 + 8 から 15 にするのが良いでしょう。)

    + +
    +
    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_deflate.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_deflate.html.ko.euc-kr new file mode 100644 index 00000000..f9edbe42 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_deflate.html.ko.euc-kr @@ -0,0 +1,341 @@ + + + +mod_deflate - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    ¾ÆÆÄÄ¡ ¸ðµâ mod_deflate

    +
    +

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

    +
    + + + +
    ¼³¸í:³»¿ëÀ» Ŭ¶óÀ̾ðÆ®·Î º¸³»±â Àü¿¡ ¾ÐÃàÇÑ´Ù
    »óÅÂ:Extension
    ¸ðµâ¸í:deflate_module
    ¼Ò½ºÆÄÀÏ:mod_deflate.c
    +

    ¿ä¾à

    + +

    mod_deflate ¸ðµâÀº ¼­¹öÀÇ Ãâ·ÂÀ» ³×Æ®¿÷À¸·Î + Ŭ¶óÀ̾ðÆ®¿¡ º¸³»±â Àü¿¡ ¾ÐÃàÇÏ´Â DEFLATE Ãâ·ÂÇÊÅ͸¦ + Á¦°øÇÑ´Ù.

    +
    + +
    top
    +
    +

    ±ÇÀåÇÏ´Â ¼³Á¤

    +

    ±ÞÇÑ »ç¶÷À» À§ÇÑ °ßº» ¼³Á¤ÀÌ´Ù.

    + +

    ÀϺΠtype¸¸ ¾ÐÃà

    + AddOutputFilterByType DEFLATE text/html text/plain text/xml +

    + +

    ¾Æ·¡ ¼³Á¤Àº ¿ä¾àÇÏ¿´Áö¸¸ ±×·¡µµ º¹ÀâÇÏ´Ù. ¼³Á¤À» ¿ÏÀüÈ÷ + ÀÌÇØÇÑ ÈÄ »ç¿ëÇ϶ó.

    + +

    À̹ÌÁö¸¦ Á¦¿ÜÇÑ ¸ðµç °ÍÀ» ¾ÐÃà

    + <Location />
    + + # ÇÊÅ͸¦ Ãß°¡ÇÑ´Ù
    + SetOutputFilter DEFLATE
    +
    + # Netscape 4.x¿¡ ¹®Á¦°¡ ÀÖ´Ù...
    + BrowserMatch ^Mozilla/4 gzip-only-text/html
    +
    + # Netscape 4.06-4.08¿¡ ´õ ¹®Á¦°¡ ÀÖ´Ù
    + BrowserMatch ^Mozilla/4\.0[678] no-gzip
    +
    + # MSIEÀº Netscape¶ó°í ÀÚ½ÅÀ» ¾Ë¸®Áö¸¸, ¹®Á¦°¡ ¾ø´Ù
    + # BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
    +
    + # ÁÖÀÇ: ¾ÆÆÄÄ¡ 2.0.48±îÁö mod_setenvifÀÇ ¹ö±×¶§¹®¿¡
    + # À§ÀÇ Á¤±ÔÇ¥Çö½ÄÀº µ¿ÀÛÇÏÁö ¾Ê´Â´Ù. ¿øÇÏ´Â È¿°ú¸¦
    + # ¾ò±âÀ§ÇØ ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÏ¿© »ç¿ëÇÑ´Ù:
    + BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
    +
    + # À̹ÌÁö¸¦ ¾ÐÃàÇÏÁö ¾Ê´Â´Ù
    + SetEnvIfNoCase Request_URI \
    + + \.(?:gif|jpe?g|png)$ no-gzip dont-vary
    +
    +
    + # ÇÁ·Ï½Ã°¡ À߸øµÈ ³»¿ëÀ» Àü´ÞÇÏÁö¾Êµµ·Ï ÇÑ´Ù
    + Header append Vary User-Agent env=!dont-vary
    +
    + </Location> +

    + +
    top
    +
    +

    ¾ÐÃàÇϱâ

    + +

    Ãâ·Â ¾ÐÃà

    +

    DEFLATE ÇÊÅÍ°¡ + ¾ÐÃàÀ» ÇÑ´Ù. ´ÙÀ½ Áö½Ã¾î´Â Áö½Ã¾î°¡ ÀÖ´Â À§Ä¡ÀÇ ¹®¼­¸¦ + ¾ÐÃàÇÑ´Ù:

    + +

    + SetOutputFilter DEFLATE +

    + +

    ¸ðµç ³»¿ëÀ» ¾ÐÃàÇϸé ó¸®ÇÏÁö ¸øÇÏ´Â ºê¶ó¿ìÀú°¡ Àֱ⶧¹®¿¡ + html ÆÄÀϸ¸À» ¾ÐÃàÇϱâÀ§ÇØ (¾Æ·¡ Âü°í) + gzip-only-text/htmlÀ» 1·Î ¼³Á¤ÇÒÁöµµ + ¸ð¸¥´Ù. À̸¦ 1ÀÌ ¾Æ´Ñ °ªÀ¸·Î ¼³Á¤Çϸé + ¹«½ÃÇÑ´Ù.

    + +

    º¸Åë Ưº°ÇÑ MIME type¸¸ ¾ÐÃàÇÏ·Á¸é AddOutputFilterByType Áö½Ã¾î¸¦ »ç¿ëÇÑ´Ù. + ´ÙÀ½ ¼³Á¤Àº html ÆÄÀϸ¸À» ¾ÐÃàÇÑ´Ù:

    + +

    + <Directory "/your-server-root/manual">
    + + AddOutputFilterByType DEFLATE text/html
    +
    + </Directory> +

    + +

    ¾ÐÃàÇÑ ÆÄÀÏÀ» ó¸®ÇÏÁö ¸øÇÏ´Â ºê¶ó¿ìÀú¿¡°Ô´Â ¾ÐÃàÇÏÁö¾Ê°í + º¸³»±æÀ§ÇØ BrowserMatch Áö½Ã¾î¿¡ no-gzipÀ» + ¼³Á¤ÇÑ´Ù. ÃÖÀûÀÇ °á°ú¸¦ ¾ò±âÀ§ÇØ no-gzip°ú + gzip-only-text/htmlÀ» °°ÀÌ »ç¿ëÇÒ ¼ö ÀÖ´Ù. + ÀÌ °æ¿ì ÀüÀÚ°¡ ÈÄÀÚ¸¦ ¹«½ÃÇÑ´Ù. À§ ÀýÀÇ ¼³Á¤ ¿¹Á¦ ÀϺθ¦ »ìÆ캸ÀÚ:

    + +

    + BrowserMatch ^Mozilla/4 gzip-only-text/html
    + BrowserMatch ^Mozilla/4\.0[678] no-gzip
    + BrowserMatch \bMSIE !no-gzip !gzip-only-text/html +

    + +

    ¸ÕÀú User-Agent ¹®ÀÚ¿­À» º¸°í Netscape + Navigator ¹öÀü 4.xÀÎÁö °Ë»çÇÑ´Ù. ÀÌ ¹öÀüÀº text/htmlÀÌ + ¾Æ´Ñ typeÀÇ ¾ÐÃàÀ» ó¸®ÇÏÁö ¸øÇÑ´Ù. ¹öÀü 4.06, 4.07, 4.08Àº + html ÆÄÀÏ ¾ÐÃàÀ» ó¸®Çϴ´뵵 ¹®Á¦°¡ ÀÖ´Ù. ±×·¡¼­ ¿ì¸®´Â + ÀÌ °æ¿ì deflate ÇÊÅ͸¦ ¿ÏÀüÈ÷ »ç¿ëÇÏÁö¾Ê´Â´Ù.

    + +

    ¼¼¹ø° BrowserMatch + Áö½Ã¾î´Â Microsoft Internet Explorer°¡ ÀÚ½ÅÀ» "Mozilla/4"·Î + ¾Ë¸®Áö¸¸ ¾ÐÃàµÈ ¿äûÀ» ó¸®ÇÒ ¼ö Àֱ⶧¹®¿¡ user agent + ÃßÃøÀ» ¼öÁ¤ÇÑ´Ù. User-Agent Çì´õ¿¡¼­ "MSIE" + (\b´Â "´Ü¾î °æ°è"¸¦ ¶æÇÑ´Ù) ¹®ÀÚ¿­À» ¹ß°ßÇϸé + ¾Õ¿¡¼­ ¼³Á¤ÇÑ Á¦¾àÀ» Ǭ´Ù.

    + +

    ÁÖÀÇ

    + DEFLATE ÇÊÅÍ´Â Ç×»ó PHP³ª SSI¿Í °°Àº RESOURCE + ÇÊÅÍ µÚ¿¡ µé¾î°£´Ù. ¶Ç, ³»ºÎ ÇÏÀ§¿äû(subrequest)¿¡ ¿µÇâÀ» + ÁÖÁö ¾Ê´Â´Ù. +
    + + +

    ÀÔ·Â ¾ÐÃàÇ®±â

    +

    mod_deflate ¸ðµâÀº gzipÀ¸·Î ¾ÐÃàµÈ ¿äû + ³»¿ëÀ» Ǫ´Â ÇÊÅ͵µ Á¦°øÇÑ´Ù. ÀÌ ±â´ÉÀ» »ç¿ëÇÏ·Á¸é ´ÙÀ½°ú + °°ÀÌ SetInputFilter³ª + AddInputFilter¸¦ + »ç¿ëÇÏ¿© ÀÔ·ÂÇÊÅͼø¼­¿¡ DEFLATE ÇÊÅ͸¦ + Ãß°¡ÇÑ´Ù.

    + +

    + <Location /dav-area>
    + + SetInputFilter DEFLATE
    +
    + </Location> +

    + +

    ¿äû¿¡ Content-Encoding: gzip Çì´õ°¡ ÀÖ´Ù¸é + ÀÚµ¿À¸·Î ¾ÐÃàµÈ ³»¿ëÀ» Ǭ´Ù. gzip ¿äûÀ» ÇÒ ¼ö ÀÖ´Â + ºê¶ó¿ìÀú´Â µå¹°´Ù. ±×·¯³ª ¾î¶² WebDAV Ŭ¶óÀ̾ðÆ®¿Í °°Àº + Ưº°ÇÑ ÇÁ·Î±×·¥Àº ¿äû ¾ÐÃàÀ» Áö¿øÇÑ´Ù.

    + +

    Content-Length¿¡ ´ëÇÑ ÁÖÀÇ

    +

    ¿äû ³»¿ëÀ» Á÷Á¢ »ìÆ캻´Ù¸é, Content-Length + Çì´õ¸¦ ¹ÏÁö¸¶¶ó! Content-Length Çì´õ´Â Ŭ¶óÀ̾ðÆ®°¡ + º¸³½ ³»¿ëÀÇ ±æÀÌÀÌÁö, ¾ÐÃàÀ» Ǭ °á°úÀÇ ¹ÙÀÌÆ®¼ö°¡ + ¾Æ´Ï´Ù.

    +
    + +
    top
    +
    +

    ÇÁ·Ï½Ã ¼­¹ö ´Ù·ç±â

    + +

    mod_deflate ¸ðµâÀº ÇÁ·Ï½Ã°¡ ÀÚ½ÅÀÌ Ä³½¬ÇÑ + ÀÀ´äÀ» ÀûÀýÇÑ Accept-Encoding ¿äû Çì´õ¸¦ º¸³½ + Ŭ¶óÀ̾ðÆ®¿¡°Ô¸¸ º¸³»µµ·Ï Vary: + Accept-Encoding HTTP ÀÀ´ä Çì´õ¸¦ Ãß°¡ÇÑ´Ù. ±×·¡¼­ + ¾ÐÃàµÈ ³»¿ëÀ» ÀÌÇØÇÒ ¼ö ¾ø´Â Ŭ¶óÀ̾ðÆ®¿¡ ¾ÐÃàµÈ ³»¿ëÀ» + º¸³»Áö¾Êµµ·Ï ÇÑ´Ù.

    + +

    ¿¹¸¦ µé¾î, User-Agent Çì´õ µî¿¡ µû¶ó Ưº°È÷ + ÇÊÅÍ Àû¿ëÀ» Ãë¼ÒÇÑ´Ù¸é, ÇÁ·Ï½Ã¿¡°Ô ÀÌ·¯ÇÑ Á¦ÇÑÀ» ¾Ë·ÁÁÖ±âÀ§ÇØ + Á÷Á¢ Vary Çì´õ¿¡ Ãß°¡ÇØ¾ß ÇÑ´Ù. ¿¹¸¦ µé¾î, + ¼³Á¤ÀÌ User-Agent¿¡ µû¶ó DEFLATE + ÇÊÅ͸¦ Ãß°¡ÇÑ´Ù¸é ´ÙÀ½À» »ç¿ëÇÑ´Ù:

    + +

    + Header append Vary User-Agent +

    + +

    ¿äû Çì´õ¿ÜÀÇ ´Ù¸¥ Á¤º¸¿¡ (¿¹¸¦ µé¾î, HTTP ¹öÀü) + µû¶ó ¾ÐÃà ¿©ºÎ°¡ °áÁ¤µÈ´Ù¸é, Vary Çì´õ°ªÀ» + *·Î ¼³Á¤ÇØ¾ß ÇÑ´Ù. ±×·¯¸é Ç¥ÁØÀ» µû¸£´Â ÇÁ·Ï½Ã´Â + ij½¬¸¦ ÇÏÁö ¾Ê°Ô µÈ´Ù.

    + +

    ¿¹Á¦

    + Header set Vary * +

    +
    +
    top
    +

    DeflateBufferSize Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:zlibÀÌ Çѹø¿¡ ¾ÐÃàÇÒ Å©±â
    ¹®¹ý:DeflateBufferSize value
    ±âº»°ª:DeflateBufferSize 8096
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®
    »óÅÂ:Extension
    ¸ðµâ:mod_deflate
    +

    DeflateBufferSize Áö½Ã¾î´Â zlibÀÌ + Çѹø¿¡ ¾ÐÃàÇÒ ¹ÙÀÌÆ®¼ö¸¦ ÁöÁ¤ÇÑ´Ù.

    + +
    +
    top
    +

    DeflateCompressionLevel Áö½Ã¾î

    + + + + + + + + +
    ¼³¸í:Ãâ·ÂÀ» ¾î´ÀÁ¤µµ ¾ÐÃàÇϴ°¡
    ¹®¹ý:DeflateCompressionLevel value
    ±âº»°ª:Zlib's default
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®
    »óÅÂ:Extension
    ¸ðµâ:mod_deflate
    Áö¿ø:¾ÆÆÄÄ¡ 2.0.45 ºÎÅÍ
    +

    DeflateCompressionLevel Áö½Ã¾î´Â + »ç¿ëÇÒ ¾ÐÃà¼öÁØÀ» ¼±ÅÃÇÑ´Ù. °ªÀÌ Å¬¼ö·Ï ¾ÐÃà·üÀÌ Áõ°¡ÇÏÁö¸¸, + CPU¸¦ ´õ ¸¹ÀÌ »ç¿ëÇÑ´Ù.

    +

    (°¡Àå ´ú ¾ÐÃà) 1°ú (°¡Àå ¸¹ÀÌ ¾ÐÃà) 9 »çÀÌÀÇ °ªÀ» ÁöÁ¤ÇÑ´Ù.

    + +
    +
    top
    +

    DeflateFilterNote Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:¾ÐÃà·üÀ» ·Î±×¿¡ ±â·ÏÇÑ´Ù
    ¹®¹ý:DeflateFilterNote [type] notename
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®
    »óÅÂ:Extension
    ¸ðµâ:mod_deflate
    Áö¿ø:typeÀº ¾ÆÆÄÄ¡ 2.0.45 ºÎÅÍ
    +

    DeflateFilterNote Áö½Ã¾î´Â ¿äûÀÇ + ¾ÐÃà·üÀ» ·Î±×¿¡ ±â·ÏÇÏ´Â ±âÈ£¸¦ ÁöÁ¤ÇÑ´Ù. ±âÈ£ À̸§Àº Áö½Ã¾î·Î + ÁöÁ¤ÇÑ °ªÀÌ´Ù. Åë°è¸¦ À§ÇØ Á¢±Ù + ·Î±×¿¡¼­ ±âÈ£¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù.

    + +

    ¿¹Á¦

    + DeflateFilterNote ratio
    +
    + LogFormat '"%r" %b (%{ratio}n) "%{User-agent}i"' deflate
    + CustomLog logs/deflate_log deflate +

    + +

    ·Î±×¿¡¼­ ´õ Á¤È®ÇÑ °ªÀ» ÃßÃâÇÏ·Á¸é type ¾Æ±Ô¸ÕÆ®·Î + ±â·ÏÇÒ ÀڷḦ ¼±ÅÃÇÑ´Ù. type´Â ´ÙÀ½Áß ÇϳªÀÌ´Ù:

    + +
    +
    Input
    +
    ÇÊÅÍ ÀԷ½ºÆ®¸²ÀÇ ¹ÙÀÌÆ®¼ö¸¦ ÀúÀåÇÑ´Ù.
    + +
    Output
    +
    ÇÊÅÍ Ãâ·Â½ºÆ®¸²ÀÇ ¹ÙÀÌÆ®¼ö¸¦ ÀúÀåÇÑ´Ù..
    + +
    Ratio
    +
    ¾ÐÃà·üÀ» (output/input * 100) ÀúÀåÇÑ´Ù. + type ¾Æ±Ô¸ÕÆ®¸¦ »ý·«ÇÏ¸é »ç¿ëÇÏ´Â ±âº»°ªÀÌ´Ù.
    +
    + +

    ±×·¡¼­ ÀÌ·¸°Ô ·Î±×¿¡ ±â·ÏÇÒ ¼ö ÀÖ´Ù:

    + +

    Á¤¹ÐÇÑ ·Î±×

    + DeflateFilterNote Input instream
    + DeflateFilterNote Output outstream
    + DeflateFilterNote Ratio ratio
    +
    + LogFormat '"%r" %{outstream}n/%{instream}n (%{ratio}n%%)' deflate
    + CustomLog logs/deflate_log deflate +

    + +

    Âü°í

    + +
    +
    top
    +

    DeflateMemLevel Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:zlibÀÌ ¾ÐÃàÇÒ¶§ »ç¿ëÇÏ´Â ¸Þ¸ð¸®·®
    ¹®¹ý:DeflateMemLevel value
    ±âº»°ª:DeflateMemLevel 9
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®
    »óÅÂ:Extension
    ¸ðµâ:mod_deflate
    +

    DeflateMemLevel Áö½Ã¾î´Â zlibÀÌ + ¾ÐÃàÇÒ¶§ ¾ó¸¶¸¸Å­ ¸Þ¸ð¸®¸¦ »ç¿ëÇÒÁö °áÁ¤ÇÑ´Ù. (1°ú 9 »çÀÌÀÇ + °ª)

    + +
    +
    top
    +

    DeflateWindowSize Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:Zlib ¾ÐÃà window size
    ¹®¹ý:DeflateWindowSize value
    ±âº»°ª:DeflateWindowSize 15
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®
    »óÅÂ:Extension
    ¸ðµâ:mod_deflate
    +

    DeflateWindowSize Áö½Ã¾î´Â zlib + ¾ÐÃà window size¸¦ (1°ú 15 »çÀÌÀÇ °ª) ÁöÁ¤ÇÑ´Ù. ÀϹÝÀûÀ¸·Î + window size°¡ Ŭ¼ö·Ï ¾ÐÃà·üÀÌ Áõ°¡ÇÑ´Ù.

    + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dir.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dir.html new file mode 100644 index 00000000..3daf13e1 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dir.html @@ -0,0 +1,17 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_dir.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: mod_dir.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: mod_dir.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: mod_dir.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dir.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dir.html.en new file mode 100644 index 00000000..e4f57e76 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dir.html.en @@ -0,0 +1,171 @@ + + + +mod_dir - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_dir

    +
    +

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

    +
    + + + +
    Description:Provides for "trailing slash" redirects and + serving directory index files
    Status:Base
    Module Identifier:dir_module
    Source File:mod_dir.c
    +

    Summary

    + +

    The index of a directory can come from one of two sources:

    + +
      +
    • A file written by the user, typically called + index.html. The DirectoryIndex directive sets the + name of this file. This is controlled by + mod_dir.
    • + +
    • Otherwise, a listing generated by the server. This is + provided by mod_autoindex.
    • +
    +

    The two functions are separated so that you can completely + remove (or replace) automatic index generation should you want + to.

    + +

    A "trailing slash" redirect is issued when the server + receives a request for a URL + http://servername/foo/dirname where + dirname is a directory. Directories require a + trailing slash, so mod_dir issues a redirect to + http://servername/foo/dirname/.

    +
    +

    Directives

    + +
    + +
    top
    +

    DirectoryIndex Directive

    + + + + + + + + +
    Description:List of resources to look for when the client requests +a directory
    Syntax:DirectoryIndex + local-url [local-url] ...
    Default:DirectoryIndex index.html
    Context:server config, virtual host, directory, .htaccess
    Override:Indexes
    Status:Base
    Module:mod_dir
    +

    The DirectoryIndex directive sets the + list of resources to look for, when the client requests an index + of the directory by specifying a / at the end of the directory + name. Local-url is the (%-encoded) URL of a document on + the server relative to the requested directory; it is usually the + name of a file in the directory. Several URLs may be given, in + which case the server will return the first one that it finds. If + none of the resources exist and the Indexes option is + set, the server will generate its own listing of the + directory.

    + +

    Example

    + DirectoryIndex index.html +

    + +

    then a request for http://myserver/docs/ would + return http://myserver/docs/index.html if it + exists, or would list the directory if it did not.

    + +

    Note that the documents do not need to be relative to the + directory;

    + +

    + DirectoryIndex index.html index.txt /cgi-bin/index.pl +

    + +

    would cause the CGI script /cgi-bin/index.pl to be + executed if neither index.html or index.txt + existed in a directory.

    + +
    +
    top
    +

    DirectorySlash Directive

    + + + + + + + + + +
    Description:Toggle trailing slash redirects on or off
    Syntax:DirectorySlash On|Off
    Default:DirectorySlash On
    Context:server config, virtual host, directory, .htaccess
    Override:Indexes
    Status:Base
    Module:mod_dir
    Compatibility:Available in version 2.0.51 and later
    +

    The DirectorySlash directive determines, whether + mod_dir should fixup URLs pointing to a directory or + not.

    + +

    Typically if a user requests a resource without a trailing slash, which + points to a directory, mod_dir redirects him to the same + resource, but with trailing slash for some good reasons:

    + +
      +
    • The user is finally requesting the canonical URL of the resource
    • +
    • mod_autoindex works correctly. Since it doesn't emit + the path in the link, it would point to the wrong path.
    • +
    • DirectoryIndex will be evaluated + only for directories requested with trailing slash.
    • +
    • Relative URL references inside html pages will work correctly.
    • +
    + +

    Well, if you don't want this effect and the reasons above don't + apply to you, you can turn off the redirect with:

    + +

    + # see security warning below!
    + <Location /some/path>
    + + DirectorySlash Off
    + SetHandler some-handler
    +
    + </Location> +

    + +

    Security Warning

    +

    Turning off the trailing slash redirect may result in an information + disclosure. Consider a situation where mod_autoindex is + active (Options +Indexes) and DirectoryIndex is set to a valid resource (say, + index.html) and there's no other special handler defined for + that URL. In this case a request with a trailing slash would show the + index.html file. But a request without trailing slash + would list the directory contents.

    +
    + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dir.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dir.html.ja.utf8 new file mode 100644 index 00000000..e8d61929 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dir.html.ja.utf8 @@ -0,0 +1,184 @@ + + + +mod_dir - Apache HTTP サーバ + + + + + + +
    <-
    + +
    +

    Apache モジュール mod_dir

    +
    +

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

    +
    +
    This translation may be out of date. Check the + English version for recent changes.
    + + + +
    説明:「最後のスラッシュ」のリダイレクトと、ディレクトリの +インデックスファイルを扱う機能を提供する
    ステータス:Base
    モジュール識別子:dir_module
    ソースファイル:mod_dir.c
    +

    概要

    + +

    ディレクトリインデックスは、次の二つのうちどちらかが利用されます:

    + +
      +
    • 一つ目は、ユーザが作成したファイルを用いるもので、通常 + index.html というファイル名を使います。このファイル名は、 + DirectoryIndex ディレクティブで + 指定することができます。この機能は mod_dir + モジュールで提供されます。
    • + +
    • もう一つの方法は、 + サーバによって自動的に生成されるディレクトリリストを用いる場合です。 + この機能は、mod_autoindex + モジュールにより提供されます。
    • +
    + +

    自動的なインデックス生成機能を削除 (もしくは交換) + できるように、この二つの機能は分離されています。

    + +

    なお http://servername/foo/dirname という URL + へのリクエストがあった際に、dirname + というディレクトリがあれば、「最後にスラッシュをつけた形」の URL + へのリダイレクトを送出します。 + ディレクトリへのアクセスはスラッシュで終わっている必要があり、 + mod_dir は、http://servername/foo/dirname/ + へのリダイレクトを送出することになります。

    +
    +

    ディレクティブ

    + +
    + +
    top
    +

    DirectoryIndex ディレクティブ

    + + + + + + + + +
    説明:クライアントがディレクトリをリクエストしたときに調べる +リソースのリスト
    構文:DirectoryIndex + local-url [local-url] ...
    デフォルト:DirectoryIndex index.html
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:Indexes
    ステータス:Base
    モジュール:mod_dir
    +

    + クライアントが、ディレクトリ名の最後に「/」 + を指定してディレクトリインデックスを要求する場合に探すリソースのリストを + DirectoryIndex ディレクティブで設定します。 + Local-url + は、リクエストされたディレクトリに対応する、サーバ上のドキュメントの + (% エンコードされた) URL で、普通はディレクトリ中のファイルの名前です。 + 複数の URL が設定された場合には、最初に見つかったものを返します。 + それらが見つからず、Indexes + オプションがセットされている場合、ディレクトリのリストを生成します。 +

    + +

    例

    + DirectoryIndex index.html +

    + +

    http://myserver/docs/ へのアクセスがあり、 + http://myserver/docs/index.html + が存在すれば、この URL が返されます。 + もし存在しなければ、ディレクトリのリストが返されます。

    + +

    注: ドキュメントが同じディレクトリ内に存在するは必要ありません。 +

    + +

    + DirectoryIndex index.html index.txt /cgi-bin/index.pl +

    + +

    とした場合、index.html と index.txt + のどちらもディレクトリ内に存在しない場合、CGI スクリプト + /cgi-bin/index.pl が実行されます。

    + +
    +
    top
    +

    DirectorySlash ディレクティブ

    + + + + + + + + + +
    説明:パス末尾のスラッシュでリダイレクトするかどうかのオンオフをトグルさせる
    構文:DirectorySlash On|Off
    デフォルト:DirectorySlash On
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:Indexes
    ステータス:Base
    モジュール:mod_dir
    互換性:2.0.51 以降
    +

    要求のあった URL がディレクトリを指すかどうかを、 + mod_dir が調整するべきかどうかを + DirectorySlash + ディレクティブで設定します。

    + +

    典型的には、ユーザが末尾のスラッシュ無しでリソースへのリクエストを発行し、 + そして、そのリソースがディレクトリを指していた場合、mod_dir + は、末尾にスラッシュを付加した上で同じリソースにリダイレクトさせます。 + この挙動には幾つか理由があります:

    + +
      +
    • ユーザは、最終的にはリソースの別名 URL をリクエストすることになる。
    • +
    • mod_autoindex が期待通りに動く。mod_autoindex + の生成するリンクはパスを出力しませんので、スラッシュがない場合は間違ったパスを + 指してしまうことになります。
    • +
    • DirectoryIndex は、 + 末尾にスラッシュがついているリクエストについてのみ評価される。
    • +
    • HTML ページの相対 URL 参照が正しく動作する。
    • +
    + +

    とはいえ、もしこういった効果を望まない、かつ、 + 上記のような理由が当てはまらない場合は、リダイレクトを次のようにしてオフにできます:

    + +

    + # see security warning below!
    + <Location /some/path>
    + + DirectorySlash Off
    + SetHandler some-handler
    +
    + </Location> +

    + +

    セキュリティ警告

    +

    末尾のスラッシュでのリダイレクトをオフにすると、結果的に情報漏洩を + 招くことになるかもしれません。 + mod_autoindex が有効 (Options +Indexes) で、 + DirectoryIndex が有効なリソース (例えば + index.html) を指していて、また、要求のあった URL に特別な + ハンドラが設定されていない場合を考えてみてください。 + この場合末尾にスラッシュのついているリクエストに対しては index.html + ファイルが返されます。しかしスラッシュのないリクエストに対しては、 + ディレクトリの内容一覧を返してしまいます。

    +
    + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dir.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dir.html.ko.euc-kr new file mode 100644 index 00000000..6ff50bba --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dir.html.ko.euc-kr @@ -0,0 +1,171 @@ + + + +mod_dir - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    ¾ÆÆÄÄ¡ ¸ðµâ mod_dir

    +
    +

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

    +
    +
    ÀÌ ¹®¼­´Â ÃÖ½ÅÆÇ ¹ø¿ªÀÌ ¾Æ´Õ´Ï´Ù. + ÃÖ±Ù¿¡ º¯°æµÈ ³»¿ëÀº ¿µ¾î ¹®¼­¸¦ Âü°íÇϼ¼¿ä.
    + + + +
    ¼³¸í:"¸¶Áö¸· ½½·¡½¬" ¸®´ÙÀÌ·º¼ÇÀ» Á¦°øÇÏ°í µð·ºÅ丮 +index ÆÄÀÏÀ» ¼­ºñ½ºÇÑ´Ù
    »óÅÂ:Base
    ¸ðµâ¸í:dir_module
    ¼Ò½ºÆÄÀÏ:mod_dir.c
    +

    ¿ä¾à

    + +

    µð·ºÅ丮ÀÇ index´Â ´ÙÀ½ µÑÁß ÇÑ°¡Áö ¹æ¹ýÀ¸·Î Á¦°øµÈ´Ù:

    + +
      +
    • »ç¿ëÀÚ°¡ ÀÛ¼ºÇÑ º¸Åë index.htmlÀ̶ó´Â + ÆÄÀÏ. DirectoryIndex + Áö½Ã¾î´Â ÀÌ ÆÄÀÏÀÇ À̸§À» ÁöÁ¤ÇÑ´Ù. mod_dir°¡ + ÀÌ Áö½Ã¾î¸¦ Á¦°øÇÑ´Ù.
    • + +
    • ¾Æ´Ï¶ó¸é ¼­¹ö°¡ ¸¸µç ¸ñ·Ï. mod_autoindex°¡ + ÀÌ ±â´ÉÀ» Á¦°øÇÑ´Ù.
    • +
    +

    µÎ ±â´ÉÀº ¼­·Î º°°³·Î ¿øÇÑ´Ù¸é ÀÚµ¿ index »ý¼ºÀ» ¿ÏÀüÈ÷ + ¾ø¾Ù (ȤÀº ±³Ã¼ÇÒ) ¼ö ÀÖ´Ù.

    + +

    dirnameÀÌ µð·ºÅ丮¶ó¸é ¼­¹ö´Â URL + http://servername/foo/dirname ¿äûÀ» ¹ÞÀ¸¸é + "¸¶Áö¸· ½½·¡½¬" ¸®´ÙÀÌ·º¼ÇÀ» º¸³½´Ù. µð·ºÅ丮¿¡´Â ¸¶Áö¸· + ½½·¡½¬°¡ ÇÊ¿äÇÏ´Ù. ±×·¡¼­ mod_dirÀº + http://servername/foo/dirname/·Î ¸®´ÙÀÌ·º¼ÇÀ» + º¸³½´Ù.

    +
    +

    Áö½Ã¾îµé

    + +
    + +
    top
    +

    DirectoryIndex Áö½Ã¾î

    + + + + + + + + +
    ¼³¸í:Ŭ¶óÀ̾ðÆ®°¡ µð·ºÅ丮¸¦ ¿äûÇÒ¶§ ã¾Æº¼ ÀÚ¿ø ¸ñ·Ï
    ¹®¹ý:DirectoryIndex + local-url [local-url] ...
    ±âº»°ª:DirectoryIndex index.html
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®, directory, .htaccess
    Override ¿É¼Ç:Indexes
    »óÅÂ:Base
    ¸ðµâ:mod_dir
    +

    DirectoryIndex Áö½Ã¾î´Â Ŭ¶óÀ̾ðÆ®°¡ + µð·ºÅ丮¸í ³¡¿¡ /¸¦ ºÙ¿©¼­ µð·ºÅ丮ÀÇ index¸¦ ¿äûÇÒ¶§ ã¾Æº¼ + ÀÚ¿ø ¸ñ·ÏÀ» ÁöÁ¤ÇÑ´Ù. Local-urlÀº ¿äûÇÑ µð·ºÅ丮¿¡ + »ó´ëÀûÀÎ ¹®¼­ÀÇ (%·Î ÀÎÄÚµùµÈ) URLÀÌ´Ù. º¸ÅëÀº µð·ºÅ丮¿¡ + ÀÖ´Â ÆÄÀϸíÀÌ´Ù. ¿©·¯ URLÀ» ÁöÁ¤ÇÒ ¼ö ÀÖ°í, ÀÌ °æ¿ì ¼­¹ö´Â + ù¹ø°·Î ãÀº ÆÄÀÏÀ» º¸³½´Ù. ÀÚ¿øÀ» ãÀ» ¼ö ¾ø°í + Indexes ¿É¼ÇÀ» ¼³Á¤ÇÏ¿´´Ù¸é ¼­¹ö´Â Á÷Á¢ µð·ºÅ丮 + ¸ñ·ÏÀ» ¸¸µç´Ù.

    + +

    ¿¹Á¦

    + DirectoryIndex index.html +

    + +

    ÀÌ °æ¿ì http://myserver/docs/¸¦ ¿äûÇÒ¶§ + http://myserver/docs/index.htmlÀÌ ÀÖÀ¸¸é À̸¦ + º¸³»°í, ¾ø´Ù¸é µð·ºÅ丮 ¸ñ·ÏÀ» º¸³½´Ù.

    + +

    ¹®¼­°¡ ¹Ýµå½Ã µð·ºÅ丮¿¡ »ó´ëÀûÀÏ ÇÊ¿ä´Â ¾ø´Ù.

    + +

    + DirectoryIndex index.html index.txt /cgi-bin/index.pl +

    + +

    ÀÌ °æ¿ì µð·ºÅ丮¿¡ index.htmlÀ̳ª + index.txt°¡ ¾øÀ¸¸é CGI ½ºÅ©¸³Æ® + /cgi-bin/index.plÀ» ½ÇÇàÇÑ´Ù.

    + +
    +
    top
    +

    DirectorySlash Áö½Ã¾î

    + + + + + + + + + +
    ¼³¸í:¸¶Áö¸· ½½·¡½¬ ¸®´ÙÀÌ·º¼ÇÀ» Å°°í ²ö´Ù
    ¹®¹ý:DirectorySlash On|Off
    ±âº»°ª:DirectorySlash On
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®, directory, .htaccess
    Override ¿É¼Ç:Indexes
    »óÅÂ:Base
    ¸ðµâ:mod_dir
    Áö¿ø:¾ÆÆÄÄ¡ 2.0.51 ÀÌÈĺÎÅÍ
    +

    DirectorySlash Áö½Ã¾î´Â + mod_dir°¡ µð·ºÅ丮¸¦ °¡¸®Å°´Â URLÀ» ¼öÁ¤ÇÒÁö + ¿©ºÎ¸¦ °áÁ¤ÇÑ´Ù.

    + +

    »ç¿ëÀÚ°¡ ¸¶Áö¸· ½½·¡½¬¾øÀÌ µð·ºÅ丮¿¡ ÇØ´çÇÏ´Â ÀÚ¿øÀ» + ¿äûÇϸé, mod_dir´Â º¸Åë ´ÙÀ½°ú °°Àº ÀÌÀ¯·Î + »ç¿ëÀÚ¸¦ ¸¶Áö¸· ½½·¡½¬¸¦ ºÙÀÎ µ¿ÀÏÇÑ ÀÚ¿øÀ¸·Î + ¸®´ÙÀÌ·º¼ÇÇÑ´Ù.

    + +
      +
    • »ç¿ëÀÚ´Â °á±¹ ÀÚ¿øÀÇ Á¤±Ô URLÀ» ¿äûÇÏ°Ô µÈ´Ù
    • +
    • mod_autoindex°¡ ¿Ã¹Ù·Î µ¿ÀÛÇÑ´Ù. ÀÌ + ±â´ÉÀÌ ¾ø´Ù¸é ÀÌ ¸ðµâÀº ¸µÅ©¿¡ À߸øµÈ °æ·Î¸¦ ¾²°Ô µÈ´Ù.
    • +
    • DirectoryIndex´Â + ¸¶Áö¸· ½½·¡½¬°¡ ÀÖ´Â µð·ºÅ丮 ¿äû¸¸À» ó¸®ÇÑ´Ù.
    • +
    • html ÆäÀÌÁö¿¡ ÀÖ´Â »ó´ëÀûÀÎ URL ÂüÁ¶°¡ ¿Ã¹Ù·Î µ¿ÀÛÇÑ´Ù.
    • +
    + +

    ±×·±µ¥ ÀÌ ±â´ÉÀ» ¿øÇÏÁö ¾Ê°Å³ª À§¿¡ µç ÀÌÀ¯°¡ + ´ç½Å¿¡°Ô ¾Ë¸ÂÁö ¾Ê´Ù¸é ´ÙÀ½°ú °°ÀÌ ¸®´ÙÀÌ·º¼ÇÀ» ÇÏÁö ¾ÊÀ» + ¼ö ÀÖ´Ù.

    + +

    + # ¾Æ·¡ º¸¾È °æ°í Âü°í!
    + <Location /some/path>
    + + DirectorySlash Off
    + SetHandler some-handler
    +
    + </Location> +

    + +

    º¸¾È °æ°í

    +

    ¸¶Áö¸· ½½·¡½¬ ¸®´ÙÀÌ·º¼ÇÀ» ²ô¸é Á¤º¸°¡ À¯ÃâµÉ ¼ö ÀÖ´Ù. + (Options +Indexes) mod_autoindex¸¦ + »ç¿ëÇÏ°í DirectoryIndex¸¦ + (index.html °°Àº) À¯È¿ÇÑ ÀÚ¿øÀ¸·Î ¼³Á¤ÇÏ¿´Áö¸¸ + ÇØ´ç URL¿¡ ´Ù¸¥ Ưº°ÇÑ Çڵ鷯°¡ ¾ø´Â »óȲÀ» »ó»óÇغ¸¶ó. + ÀÌ °æ¿ì ¸¶Áö¸· ½½·¡½¬°¡ ÀÖ´Â ¿äûÀº index.html + ÆÄÀÏÀ» º¸¿©ÁØ´Ù. ±×·¯³ª ¸¶Áö¸· ½½·¡½¬°¡ ¾ø´Â ¿äûÀº + µð·ºÅ丮 ³»¿ëÀ» º¸¿©ÁØ´Ù.

    +
    + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dir.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dir.html.tr.utf8 new file mode 100644 index 00000000..12f457f0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dir.html.tr.utf8 @@ -0,0 +1,170 @@ + + + +mod_dir - Apache HTTP Sunucusu + + + + + + +
    <-
    + +
    +

    Apache Modülü mod_dir

    +
    +

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

    +
    + + + +
    Açıklama:Bölü çizgisiyle biten yönlendirmeleri yapar ve dizin içeriği dosyalarını sunar.
    Durum:Temel
    Modül Betimleyici:dir_module
    Kaynak Dosyası:mod_dir.c
    +

    Özet

    + +

    Bir dizin içerik dosyası şu iki kaynaktan birinden gelebilir:

    + +
      +
    • Kullanıcı tarafından yazılmış ve ismi genellikle + index.html olan bir dosya. Dosya ismi DirectoryIndex yönergesi ile belirlenir. + Bu, mod_dir modülü tarafından denetlenir.
    • + +
    • Aksi takdirde içerik listesi sunucu tarafından üretilir. Bu, + mod_autoindex modülü tarafından sağlanır.
    • +
    +

    Bu iki işlev tamamen birbirinden ayrıdır, dolayısıyla eğer isterseniz + kendiliğinden dizin içerik listesi üretimini tamamen iptal + edebilirsiniz.

    + +

    Sunucu http://sunucum/filanca/birdizin şeklinde bir istek + aldığında birdizin bir dizinin ismiyse ‘bölü çizgisiyle + biten’ bir yönlendirme söz konusudur. Dizinler URL sonuna bir bölü + çizgisi eklenmesini gerektirir, bu bakımdan mod_dir + modülü isteği http://sunucum/filanca/birdizin/ şeklinde + yönlendirir.

    +
    +

    Yönergeler

    + +
    + +
    top
    +

    DirectoryIndex Yönergesi

    + + + + + + + + +
    Açıklama:İstemci bir dizin istediğinde dizin içeriğini listeler. +
    Sözdizimi:DirectoryIndex + yerel-url [yerel-url] ...
    Öntanımlı:DirectoryIndex index.html
    Bağlam:sunucu geneli, sanal konak, dizin, .htaccess
    Geçersizleştirme:Indexes
    Durum:Temel
    Modül:mod_dir
    +

    DirectoryIndex yönergesi, istemci, dizinin + sonuna bir bölü çizgisi ekleyerek dizin içeriğinin listelenmesini + istediğinde bakılmak üzere özkaynakları listeler. + yerel-url, sunucu üstünde istenen dizine göreli + bir belgenin URL’sidir; normal olarak dizin içindeki bir dosyanın + ismidir. Çeşitli URL’ler verilebilirse de sunucu daima ilk bulduğuyla + dönecektir. Eğer özkaynakların hiçbiri yoksa ve Indexes + seçeneği atanmışsa sunucu dizin içeriğinden bir liste üretecektir.

    + +

    Örnek:

    + DirectoryIndex index.html +

    + +

    Bu yapılandırmadan sonra yapılan bir + http://sunucum/belgeler/ isteğine karşılık, sunucu, + mevcutsa http://sunucum/belgeler/index.html dosyasını + döndürecek, değilse ürettiği dizin içerik listesini gönderecektir.

    + +

    Belgelerin dizine göreli olmasının gerekmediğine dikkat ediniz.

    + +

    + DirectoryIndex index.html index.txt /cgi-bin/index.pl +

    + +

    Bu örnekte ise dizin içinde ne index.html ne de + index.txt mevcut olduğunda /cgi-bin/index.pl + CGI betiği çalıştırılacaktır.

    + +
    +
    top
    +

    DirectorySlash Yönergesi

    + + + + + + + + + +
    Açıklama:Bölü çizgisi ile biten yönlendirmeleri açar/kapar.
    Sözdizimi:DirectorySlash On|Off
    Öntanımlı:DirectorySlash On
    Bağlam:sunucu geneli, sanal konak, dizin, .htaccess
    Geçersizleştirme:Indexes
    Durum:Temel
    Modül:mod_dir
    Uyumluluk:Apache 2.0.51 ve sonrasında mevcuttur.
    +

    DirectorySlash yönergesi, bir dizin isteğinde + bulunan URL’lerin sonuna mod_dir modülü tarafından bir + bölü çizgisi eklenip eklenmeyeceğini belirler.

    + +

    Normalde, bir kullanıcı sona bir bölü çizgisi eklemeden bir dizin için + istekte bulunursa mod_dir zaten onu aynı özkaynağa + yönlendirir, fakat isteğin sonuna bir bölü çizgisi eklenmesinin bazı iyi + sebepleri vardır:

    + +
      +
    • Kullanıcı bunun sonucunda meşru bir URL ile istekte bulunmuş olur.
    • +
    • mod_autoindex gerektiği gibi çalışır. Yoksa + bağlantıdaki yolu sunamayacağından yanlış yolu gösterirdi.
    • +
    • DirectoryIndex yönergesi + sadece bölü çizgisi ile biten dizin istekleri için değerlendirilir.
    • +
    • HTML sayfa içindeki göreli URL başvuruları gerektiği gibi + çalışacaktır.
    • +
    + +

    Siz yine de bu etkiyi istemezseniz ve yukarıdaki sebepler de size uygun + değilse yönlendirmeyi şöyle kapatabilirsiniz:

    + +

    + # Aşağıdaki güvenlik uyarısına bakınız!
    + <Location /bir/yol>
    + + DirectorySlash Off
    + SetHandler bir-eylemci
    +
    + </Location> +

    + +

    Güvenlik Uyarı

    +

    Bölü çizgisi ile biten yönlendirmelerin kapatılması bir bilginin + istemeyek açığa çıkmasına sebep olabilir. mod_autoindex + modülünün etkin olduğunu (Options +Indexes) ve DirectoryIndex ile geçerli bir özkaynağın + (index.html olsun) atandığını ama bu URL için başka hiçbir + özel eylemci tanımlanmadığını varsayalım. Bu durumda bölü çizgisi ile + biten bir istek olduğunda index.html dosyası sunulurdu. + Fakat bölü çizgisi ile bitmeyen bir istek dizin içeriğinin + listelenmesi ile sonuçlanırdı.

    +
    + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_disk_cache.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_disk_cache.html new file mode 100644 index 00000000..247749f3 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_disk_cache.html @@ -0,0 +1,9 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_disk_cache.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: mod_disk_cache.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_disk_cache.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_disk_cache.html.en new file mode 100644 index 00000000..40a88871 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_disk_cache.html.en @@ -0,0 +1,368 @@ + + + +mod_disk_cache - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_disk_cache

    +
    +

    Available Languages:  en  | + ko 

    +
    + + + +
    Description:Content cache storage manager keyed to URIs
    Status:Experimental
    Module Identifier:disk_cache_module
    Source File:mod_disk_cache.c
    +

    Summary

    + +
    + This module is experimental. Documentation is still under development... +
    + +

    mod_disk_cache implements a disk based storage + manager. It is primarily of use in conjunction with + mod_proxy.

    + +

    Content is stored in and retrieved from the cache using URI based + keys. Content with access protection is not cached.

    + +

    Note:

    +

    mod_disk_cache requires the services of + mod_cache.

    +
    +
    + + +
    top
    +

    CacheDirLength Directive

    + + + + + + + +
    Description:The number of characters in subdirectory names
    Syntax:CacheDirLength length
    Default:CacheDirLength 2
    Context:server config, virtual host
    Status:Experimental
    Module:mod_disk_cache
    +

    The CacheDirLength directive sets the number + of characters for each subdirectory name in the cache hierarchy.

    + +
    +

    The result of CacheDirLevels* CacheDirLength + must not be higher than 20.

    +
    + +

    + CacheDirLength 4 +

    + +
    +
    top
    +

    CacheDirLevels Directive

    + + + + + + + +
    Description:The number of levels of subdirectories in the +cache.
    Syntax:CacheDirLevels levels
    Default:CacheDirLevels 3
    Context:server config, virtual host
    Status:Experimental
    Module:mod_disk_cache
    +

    The CacheDirLevels directive sets the number + of subdirectory levels in the cache. Cached data will be saved this + many directory levels below the CacheRoot directory.

    + +
    +

    The result of CacheDirLevels* + CacheDirLength must + not be higher than 20.

    +
    + +

    + CacheDirLevels 5 +

    + +
    +
    top
    +

    CacheExpiryCheck Directive

    + + + + + + + +
    Description:Indicates if the cache observes Expires dates when seeking +files
    Syntax:CacheExpiryCheck On|Off
    Default:CacheExpiryCheck On
    Context:server config, virtual host
    Status:Experimental
    Module:mod_disk_cache
    +

    More detail will be added here, when the function is implemented.

    + +

    + CacheExpiryCheck Off
    +

    + +
    + The CacheExpiryCheck directive is currently + not implemented. +
    + +
    +
    top
    +

    CacheGcClean Directive

    + + + + + + + +
    Description:The time to retain unchanged cached files that match a +URL
    Syntax:CacheGcClean hours url-string
    Default:CacheGcClean ?
    Context:server config, virtual host
    Status:Experimental
    Module:mod_disk_cache
    +

    More detail will be added here, when the function is implemented.

    + +

    + CacheGcClean 12 /daily_scripts +

    + +
    + The CacheGcClean directive is currently + not implemented. +
    + +
    +
    top
    +

    CacheGcDaily Directive

    + + + + + + + +
    Description:The recurring time each day for garbage collection to be run. +(24 hour clock)
    Syntax:CacheGcDaily time
    Default:CacheGcDaily ?
    Context:server config, virtual host
    Status:Experimental
    Module:mod_disk_cache
    +

    More detail will be added here, when the function is implemented.

    + +

    + CacheGcDaily 23:59 +

    + +
    + The CacheGcDaily directive is currently + not implemented. +
    + +
    +
    top
    +

    CacheGcInterval Directive

    + + + + + + +
    Description:The interval between garbage collection attempts.
    Syntax:CacheGcInterval hours
    Context:server config, virtual host
    Status:Experimental
    Module:mod_disk_cache
    +

    The CacheGcInterval directive specifies the + number of hours to wait between attempts to free up disk space.

    +

    More detail will be added here, when the function is implemented.

    + +

    + CacheGcInterval 24
    +

    + +
    + The CacheGcInterval directive is currently + not implemented. +
    + +
    +
    top
    +

    CacheGcMemUsage Directive

    + + + + + + + +
    Description:The maximum kilobytes of memory used for garbage +collection
    Syntax:CacheGcMemUsage KBytes
    Default:CacheGcMemUsage ?
    Context:server config, virtual host
    Status:Experimental
    Module:mod_disk_cache
    +

    More detail will be added here, when the function is implemented.

    + +

    + CacheGcMemUsage 16 +

    + +
    + The CacheGcMemUsage directive is currently + not implemented. +
    + +
    +
    top
    +

    CacheGcUnused Directive

    + + + + + + + +
    Description:The time to retain unreferenced cached files that match a +URL.
    Syntax:CacheGcUnused hours url-string
    Default:CacheGcUnused ?
    Context:server config, virtual host
    Status:Experimental
    Module:mod_disk_cache
    +

    More detail will be added here, when the function is implemented.

    + +

    + CacheGcUnused 12 /local_images +

    + +
    + The CacheGcUnused directive is currently + not implemented. +
    + +
    +
    top
    +

    CacheMaxFileSize Directive

    + + + + + + + +
    Description:The maximum size (in bytes) of a document to be placed in the +cache
    Syntax:CacheMaxFileSize bytes
    Default:CacheMaxFileSize 1000000
    Context:server config, virtual host
    Status:Experimental
    Module:mod_disk_cache
    +

    The CacheMaxFileSize directive sets the + maximum size, in bytes, for a document to be considered for storage in + the cache.

    + +

    + CacheMaxFileSize 64000 +

    + +
    +
    top
    +

    CacheMinFileSize Directive

    + + + + + + + +
    Description:The minimum size (in bytes) of a document to be placed in the +cache
    Syntax:CacheMinFileSize bytes
    Default:CacheMinFileSize 1
    Context:server config, virtual host
    Status:Experimental
    Module:mod_disk_cache
    +

    The CacheMinFileSize directive sets the + minimum size, in bytes, for a document to be considered for storage + in the cache.

    + +

    + CacheMinFileSize 64 +

    + +
    +
    top
    +

    CacheRoot Directive

    + + + + + + +
    Description:The directory root under which cache files are +stored
    Syntax:CacheRoot directory
    Context:server config, virtual host
    Status:Experimental
    Module:mod_disk_cache
    +

    The CacheRoot directive defines the name of + the directory on the disk to contain cache files. If the mod_disk_cache module has been loaded or compiled in to the + Apache server, this directive must be defined. Failing to + provide a value for CacheRoot will result in + a configuration file processing error. The CacheDirLevels and CacheDirLength directives define + the structure of the directories under the specified root directory.

    + +

    + CacheRoot c:/cacheroot +

    + +
    +
    top
    +

    CacheSize Directive

    + + + + + + + +
    Description:The maximum amount of disk space that will be used by the +cache in KBytes
    Syntax:CacheSize KBytes
    Default:CacheSize 1000000
    Context:server config, virtual host
    Status:Experimental
    Module:mod_disk_cache
    +

    The CacheSize directive sets the desired + disk space usage of the cache, in KBytes (1024-byte units). This + directive does not put a hard limit on the size of the cache. The + garbage collector will delete files until the usage is at or below the + settings. Always use a value that is lower than the available disk + space.

    + +

    + CacheSize 5000000 +

    + +
    +
    top
    +

    CacheTimeMargin Directive

    + + + + + + + +
    Description:The minimum time margin to cache a document
    Syntax:CacheTimeMargin ?
    Default:CacheTimeMargin ?
    Context:server config, virtual host
    Status:Experimental
    Module:mod_disk_cache
    +

    More detail will be added here, when the function is implemented.

    + +

    + CacheTimeMargin X +

    + +
    + The CacheTimeMargin directive is currently + not implemented. +
    + +
    +
    +
    +

    Available Languages:  en  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_disk_cache.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_disk_cache.html.ko.euc-kr new file mode 100644 index 00000000..4ad81ee0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_disk_cache.html.ko.euc-kr @@ -0,0 +1,355 @@ + + + +mod_disk_cache - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    ¾ÆÆÄÄ¡ ¸ðµâ mod_disk_cache

    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + ko 

    +
    + + + +
    ¼³¸í:Content cache storage manager keyed to URIs
    »óÅÂ:Experimental
    ¸ðµâ¸í:disk_cache_module
    ¼Ò½ºÆÄÀÏ:mod_disk_cache.c
    +

    ¿ä¾à

    + +
    + ÀÌ ¸ðµâÀº ½ÇÇèÀûÀÎ »óÅÂÀÌ´Ù. ¹®¼­´Â ¾ÆÁ÷ ÀÛ¾÷ÁßÀÌ´Ù... +
    + +

    mod_disk_cache´Â µð½ºÅ©±â¹Ý ÀúÀå°ü¸®ÀÚ¸¦ + ±¸ÇöÇÑ´Ù. ÀÌ ¸ðµâÀº ±âº»ÀûÀ¸·Î mod_proxy¿Í + °°ÀÌ »ç¿ëÇÑ´Ù.

    + +

    ³»¿ëÀ» URI¸¦ Åä´ë·Î ¸¸µç Å°·Î ij½¬¿¡ ÀúÀåÇÏ°í °¡Á®¿Â´Ù. + Á¢±Ùº¸È£°¡ µÈ ³»¿ëÀº ij½¬ÇÏÁö¾Ê´Â´Ù.

    + +

    ÁÖÀÇ:

    +

    mod_disk_cache´Â + mod_cache°¡ ÇÊ¿äÇÏ´Ù.

    +
    +
    + + +
    top
    +

    CacheDirLength Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:ÇÏÀ§µð·ºÅ丮¸íÀÇ ¹®ÀÚ°³¼ö
    ¹®¹ý:CacheDirLength length
    ±âº»°ª:CacheDirLength 2
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®
    »óÅÂ:Experimental
    ¸ðµâ:mod_disk_cache
    +

    CacheDirLength Áö½Ã¾î´Â ij½¬ + °èÃþ±¸Á¶¿¡¼­ °¢ ÇÏÀ§µð·ºÅ丮¸íÀÇ ¹®ÀÚ¼ö¸¦ ÁöÁ¤ÇÑ´Ù.

    + +
    +

    CacheDirLevels¿Í + CacheDirLength¸¦ °öÇÏ¿© 20 º¸´Ù + Å©¸é ¾ÈµÈ´Ù.

    +
    + +

    + CacheDirLength 4 +

    + +
    +
    top
    +

    CacheDirLevels Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:ij½¬ÀÇ ÇÏÀ§µð·ºÅ丮 ±íÀÌ.
    ¹®¹ý:CacheDirLevels levels
    ±âº»°ª:CacheDirLevels 3
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®
    »óÅÂ:Experimental
    ¸ðµâ:mod_disk_cache
    +

    CacheDirLevels Áö½Ã¾î´Â ij½¬ÀÇ + ÇÏÀ§µð·ºÅ丮 ±íÀ̸¦ ÁöÁ¤ÇÑ´Ù. ij½¬µÈ ÀڷḦ CacheRoot µð·ºÅ丮 + ¾Æ·¡ ÀÌ ±íÀ̱îÁö ÀúÀåÇÑ´Ù.

    + +
    +

    CacheDirLevels¿Í CacheDirLength¸¦ + °öÇÏ¿© 20 º¸´Ù Å©¸é ¾ÈµÈ´Ù.

    +
    + +

    + CacheDirLevels 5 +

    + +
    +
    top
    +

    CacheExpiryCheck Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:ij½¬¿¡¼­ ÆÄÀÏÀ» ãÀ»¶§ ¸¸±â½Ã°£À» °í·ÁÇÒÁö ¿©ºÎ
    ¹®¹ý:CacheExpiryCheck On|Off
    ±âº»°ª:CacheExpiryCheck On
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®
    »óÅÂ:Experimental
    ¸ðµâ:mod_disk_cache
    +

    ÇÔ¼ö°¡ ±¸ÇöµÇ¸é ´õ ÀÚ¼¼ÇÑ ³»¿ëÀÌ ¿©±â ³ª¿Â´Ù.

    + +

    + CacheExpiryCheck Off
    +

    + +
    + CacheExpiryCheck Áö½Ã¾î´Â ÇöÀç + ±¸ÇöµÇÁö ¾Ê¾Ò´Ù. +
    + +
    +
    top
    +

    CacheGcClean Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:URL¿¡ ÇØ´çÇÏ´Â º¯ÇÏÁö¾ÊÀº ij½¬ÆÄÀÏÀ» À¯ÁöÇÒ ½Ã°£
    ¹®¹ý:CacheGcClean hours url-string
    ±âº»°ª:CacheGcClean ?
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®
    »óÅÂ:Experimental
    ¸ðµâ:mod_disk_cache
    +

    ÇÔ¼ö°¡ ±¸ÇöµÇ¸é ´õ ÀÚ¼¼ÇÑ ³»¿ëÀÌ ¿©±â ³ª¿Â´Ù.

    + +

    + CacheGcClean 12 /daily_scripts +

    + +
    + CacheGcClean Áö½Ã¾î´Â ÇöÀç ±¸ÇöµÇÁö + ¾Ê¾Ò´Ù. +
    + +
    +
    top
    +

    CacheGcDaily Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:¸ÅÀÏ °¡ºñÁöÄ÷¢Å͸¦ ½ÇÇàÇÒ ¹Ýº¹ ½Ã°£ (24½Ã ½Ã°è)
    ¹®¹ý:CacheGcDaily time
    ±âº»°ª:CacheGcDaily ?
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®
    »óÅÂ:Experimental
    ¸ðµâ:mod_disk_cache
    +

    ÇÔ¼ö°¡ ±¸ÇöµÇ¸é ´õ ÀÚ¼¼ÇÑ ³»¿ëÀÌ ¿©±â ³ª¿Â´Ù.

    + +

    + CacheGcDaily 23:59 +

    + +
    + CacheGcDaily Áö½Ã¾î´Â ÇöÀç ±¸ÇöµÇÁö + ¾Ê¾Ò´Ù. +
    + +
    +
    top
    +

    CacheGcInterval Áö½Ã¾î

    + + + + + + +
    ¼³¸í:°¡ºñÁöÄ÷¢Å͸¦ ½ÇÇàÇÏ´Â °£°Ý.
    ¹®¹ý:CacheGcInterval hours
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®
    »óÅÂ:Experimental
    ¸ðµâ:mod_disk_cache
    +

    CacheGcInterval Áö½Ã¾î´Â Ä«ºñÁöÄ÷¢ÅÍ°¡ + µð½ºÅ©°ø°£À» ºñ¿ì´Â ½Ã°£ °£°ÝÀ» ½Ã°£´ÜÀ§·Î ÁöÁ¤ÇÑ´Ù.

    +

    ÇÔ¼ö°¡ ±¸ÇöµÇ¸é ´õ ÀÚ¼¼ÇÑ ³»¿ëÀÌ ¿©±â ³ª¿Â´Ù.

    + +

    + CacheGcInterval 24
    +

    + +
    + CacheGcInterval Áö½Ã¾î´Â ÇöÀç ±¸ÇöµÇÁö + ¾Ê¾Ò´Ù. +
    + +
    +
    top
    +

    CacheGcMemUsage Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:°¡ºñÁöÄ÷¢ÅÍ°¡ »ç¿ëÇÒ ÃÖ´ë ¸Þ¸ð¸®·® (kilobyte ´ÜÀ§)
    ¹®¹ý:CacheGcMemUsage KBytes
    ±âº»°ª:CacheGcMemUsage ?
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®
    »óÅÂ:Experimental
    ¸ðµâ:mod_disk_cache
    +

    ÇÔ¼ö°¡ ±¸ÇöµÇ¸é ´õ ÀÚ¼¼ÇÑ ³»¿ëÀÌ ¿©±â ³ª¿Â´Ù.

    + +

    + CacheGcMemUsage 16 +

    + +
    + CacheGcMemUsage Áö½Ã¾î´Â ÇöÀç + ±¸ÇöµÇÁö ¾Ê¾Ò´Ù. +
    + +
    +
    top
    +

    CacheGcUnused Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:URL¿¡ ÇØ´çÇÏ´Â ÂüÁ¶µÇÁö¾ÊÀº ij½¬ÆÄÀÏÀ» À¯ÁöÇÒ ±â°£.
    ¹®¹ý:CacheGcUnused hours url-string
    ±âº»°ª:CacheGcUnused ?
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®
    »óÅÂ:Experimental
    ¸ðµâ:mod_disk_cache
    +

    ÇÔ¼ö°¡ ±¸ÇöµÇ¸é ´õ ÀÚ¼¼ÇÑ ³»¿ëÀÌ ¿©±â ³ª¿Â´Ù.

    + +

    + CacheGcUnused 12 /local_images +

    + +
    + CacheGcUnused Áö½Ã¾î´Â ÇöÀç ±¸ÇöµÇÁö + ¾Ê¾Ò´Ù. +
    + +
    +
    top
    +

    CacheMaxFileSize Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:ij½¬¿¡ ÀúÀåÇÒ ¹®¼­ÀÇ ÃÖ´ëÅ©±â (¹ÙÀÌÆ® ´ÜÀ§)
    ¹®¹ý:CacheMaxFileSize bytes
    ±âº»°ª:CacheMaxFileSize 1000000
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®
    »óÅÂ:Experimental
    ¸ðµâ:mod_disk_cache
    +

    CacheMaxFileSize Áö½Ã¾î´Â ij½¬¿¡ + ÀúÀåÇÒ ¹®¼­ÀÇ ÃÖ´ëÅ©±â¸¦ ¹ÙÀÌÆ® ´ÜÀ§·Î ÁöÁ¤ÇÑ´Ù.

    + +

    + CacheMaxFileSize 64000 +

    + +
    +
    top
    +

    CacheMinFileSize Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:ij½¬¿¡ ÀúÀåÇÒ ¹®¼­ÀÇ ÃÖ¼ÒÅ©±â (¹ÙÀÌÆ® ´ÜÀ§)
    ¹®¹ý:CacheMinFileSize bytes
    ±âº»°ª:CacheMinFileSize 1
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®
    »óÅÂ:Experimental
    ¸ðµâ:mod_disk_cache
    +

    CacheMinFileSize Áö½Ã¾î´Â ij½¬¿¡ + ÀúÀåÇÒ ¹®¼­ÀÇ ÃÖ¼ÒÅ©±â¸¦ ¹ÙÀÌÆ® ´ÜÀ§·Î ÁöÁ¤ÇÑ´Ù.

    + +

    + CacheMinFileSize 64 +

    + +
    +
    top
    +

    CacheRoot Áö½Ã¾î

    + + + + + + +
    ¼³¸í:ij½¬ ÆÄÀÏÀ» ÀúÀåÇÒ µð·ºÅ丮 root
    ¹®¹ý:CacheRoot directory
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®
    »óÅÂ:Experimental
    ¸ðµâ:mod_disk_cache
    +

    CacheRoot Áö½Ã¾î´Â µð½ºÅ©¿¡¼­ + ij½¬ ÆÄÀÏÀ» ÀúÀåÇÒ µð·ºÅ丮¸¦ ÁöÁ¤ÇÑ´Ù. mod_disk_cache ¸ðµâÀ» ¾ÆÆÄÄ¡ ¼­¹ö¿Í °°ÀÌ ÄÄÆÄÀÏÇÏ¿´°Å³ª + ÀоîµéÀÎ °æ¿ì ¹Ýµå½Ã ÀÌ Áö½Ã¾î¸¦ Á¤ÀÇÇØ¾ß ÇÑ´Ù. + CacheRoot¿¡ °ªÀÌ ¾øÀ¸¸é ¼³Á¤ÆÄÀÏÀ» + ó¸®ÇÏÁö ¾Ê´Â´Ù. CacheDirLevels¿Í CacheDirLength Áö½Ã¾î´Â + ÀÌ Áö½Ã¾î·Î ÁöÁ¤ÇÑ root µð·ºÅ丮ÀÇ ÇÏÀ§µð·ºÅ丮 ±¸Á¶¸¦ Áö½ÃÇÑ´Ù.

    + +

    + CacheRoot c:/cacheroot +

    + +
    +
    top
    +

    CacheSize Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:ij½¬·Î »ç¿ëÇÒ ÃÖ´ë µð½ºÅ©°ø°£ (KByte ´ÜÀ§)
    ¹®¹ý:CacheSize KBytes
    ±âº»°ª:CacheSize 1000000
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®
    »óÅÂ:Experimental
    ¸ðµâ:mod_disk_cache
    +

    CacheSize Áö½Ã¾î´Â ij½¬·Î »ç¿ëÇÒ + µð½ºÅ©°ø°£ Å©±â¸¦ KByte (1024 ¹ÙÀÌÆ®) ´ÜÀ§·Î ÁöÁ¤ÇÑ´Ù. ÀÌ + Áö½Ã¾î´Â ij½¬ Å©±â¸¦ Á¦ÇÑÇÏÁö ¾Ê´Â´Ù. °¡ºñÁöÄ÷¢ÅÍ°¡ ij½¬ + »ç¿ë·®ÀÌ ¼³Á¤ÇÑ °ªº¸´Ù À۰Եɶ§±îÁö ÆÄÀÏÀ» Áö¿î´Ù. Ç×»ó + »ç¿ë°¡´ÉÇÑ µð½ºÅ©°ø°£ º¸´Ù ÀÛÀº °ªÀ» »ç¿ëÇ϶ó.

    + +

    + CacheSize 5000000 +

    + +
    +
    top
    +

    CacheTimeMargin Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:¹®¼­¸¦ ij½¬ÇÒ Ãּҽð£ ÇÑ°è
    ¹®¹ý:CacheTimeMargin ?
    ±âº»°ª:CacheTimeMargin ?
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®
    »óÅÂ:Experimental
    ¸ðµâ:mod_disk_cache
    +

    ÇÔ¼ö°¡ ±¸ÇöµÇ¸é ´õ ÀÚ¼¼ÇÑ ³»¿ëÀÌ ¿©±â ³ª¿Â´Ù.

    + +

    + CacheTimeMargin X +

    + +
    + CacheTimeMargin Áö½Ã¾î´Â ÇöÀç + ±¸ÇöµÇÁö ¾Ê¾Ò´Ù. +
    + +
    +
    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dumpio.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dumpio.html new file mode 100644 index 00000000..50979675 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dumpio.html @@ -0,0 +1,5 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_dumpio.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dumpio.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dumpio.html.en new file mode 100644 index 00000000..1003f45f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_dumpio.html.en @@ -0,0 +1,106 @@ + + + +mod_dumpio - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_dumpio

    +
    +

    Available Languages:  en 

    +
    + + + +
    Description:Dumps all I/O to error log as desired.
    Status:Experimental
    Module Identifier:dumpio_module
    Source File:mod_dumpio.c
    +

    Summary

    + +

    mod_dumpio allows for the logging of + all input received by Apache and/or all output sent by + Apache to be logged (dumped) to the error.log file. +

    + +

    The data logging is done right after SSL decoding (for + input) and right before SSL encoding (for output). As can + be expected, this can produce extreme volumes of data, + and should only be used when debugging problems.

    +
    +

    Directives

    + +

    Topics

    +
    +
    top
    +
    +

    Enabling dumpio Support

    + + +

    To enable the module, it should be compiled and + loaded in to your running Apache configuration. Logging + can then be enabled or disabled via the below directives.

    + +

    In order for dumping to work LogLevel must be set to debug.

    +
    +
    top
    +

    DumpIOInput Directive

    + + + + + + + + +
    Description:Dump all input data to the error log
    Syntax:DumpIOInput On|Off
    Default:DumpIOInput Off
    Context:server config
    Status:Experimental
    Module:mod_dumpio
    Compatibility:DumpIOInput is only available in Apache 2.0.53 and +later.
    +

    Enable dumping of all input.

    + +

    Example

    + DumpIOInput On +

    + +
    +
    top
    +

    DumpIOOutput Directive

    + + + + + + + + +
    Description:Dump all output data to the error log
    Syntax:DumpIOOutput On|Off
    Default:DumpIOOutput Off
    Context:server config
    Status:Experimental
    Module:mod_dumpio
    Compatibility:DumpIOOutput is only available in Apache 2.0.53 and +later.
    +

    Enable dumping of all output.

    + +

    Example

    + DumpIOOutput On +

    + +
    +
    +
    +

    Available Languages:  en 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_echo.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_echo.html new file mode 100644 index 00000000..fb021cc7 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_echo.html @@ -0,0 +1,13 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_echo.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: mod_echo.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: mod_echo.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_echo.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_echo.html.en new file mode 100644 index 00000000..1a476635 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_echo.html.en @@ -0,0 +1,74 @@ + + + +mod_echo - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_echo

    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + + + + +
    Description:A simple echo server to illustrate protocol +modules
    Status:Experimental
    Module Identifier:echo_module
    Source File:mod_echo.c
    Compatibility:Available in Apache 2.0 and later
    +

    Summary

    + +

    This module provides an example protocol module to illustrate the + concept. It provides a simple echo server. Telnet to it and type + stuff, and it will echo it.

    +
    +

    Directives

    + +
    + +
    top
    +

    ProtocolEcho Directive

    + + + + + + + + +
    Description:Turn the echo server on or off
    Syntax:ProtocolEcho On|Off
    Default:ProtocolEcho Off
    Context:server config, virtual host
    Status:Experimental
    Module:mod_echo
    Compatibility:ProtocolEcho is only available in 2.0 and +later.
    +

    The ProtocolEcho directive enables or + disables the echo server.

    + +

    Example

    + ProtocolEcho On +

    + +
    +
    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_echo.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_echo.html.ja.utf8 new file mode 100644 index 00000000..566ca838 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_echo.html.ja.utf8 @@ -0,0 +1,74 @@ + + + +mod_echo - Apache HTTP サーバ + + + + + + +
    <-
    + +
    +

    Apache モジュール mod_echo

    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    +
    This translation may be out of date. Check the + English version for recent changes.
    + + + + +
    説明:プロトコルモジュールの概要を示すための単純なエコーサーバ +
    ステータス:Experimental
    モジュール識別子:echo_module
    ソースファイル:mod_echo.c
    互換性:Apache 2.0 以降
    +

    概要

    + +

    本モジュールはコンセプトを伝えるためのプロトコルモジュールの + 実装例となっています。単純なエコーサーバを提供します。 + Telnet で接続し、文字列を送信すると、エコーを返します。

    +
    +

    ディレクティブ

    + +
    + +
    top
    +

    ProtocolEcho ディレクティブ

    + + + + + + + +
    説明:エコーサーバの有効無効を設定します。
    構文:ProtocolEcho On|Off
    コンテキスト:サーバ設定ファイル, バーチャルホスト
    ステータス:Experimental
    モジュール:mod_echo
    互換性:Apache 2.0 以降
    +

    ProtocolEcho ディレクティブで + エコーサーバの有効無効を設定します。

    + +

    例

    + ProtocolEcho On +

    + +
    +
    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_echo.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_echo.html.ko.euc-kr new file mode 100644 index 00000000..d178fe4d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_echo.html.ko.euc-kr @@ -0,0 +1,73 @@ + + + +mod_echo - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    ¾ÆÆÄÄ¡ ¸ðµâ mod_echo

    +
    +

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

    +
    +
    ÀÌ ¹®¼­´Â ÃÖ½ÅÆÇ ¹ø¿ªÀÌ ¾Æ´Õ´Ï´Ù. + ÃÖ±Ù¿¡ º¯°æµÈ ³»¿ëÀº ¿µ¾î ¹®¼­¸¦ Âü°íÇϼ¼¿ä.
    + + + + +
    ¼³¸í:ÇÁ·ÎÅäÄÝ ¸ðµâÀ» ¼³¸íÇϱâÀ§ÇÑ °£´ÜÇÑ echo ¼­¹ö
    »óÅÂ:Experimental
    ¸ðµâ¸í:echo_module
    ¼Ò½ºÆÄÀÏ:mod_echo.c
    Áö¿ø:Apache 2.0 ÀÌÈĺÎÅÍ
    +

    ¿ä¾à

    + +

    ÀÌ ¸ðµâÀº ÇÁ·ÎÅäÄÝ ¸ðµâÀÇ °³³äÀ» ¼³¸íÇϱâÀ§ÇÑ ¿¹Á¦ÀÌ´Ù. + ÀÌ ¸ðµâÀº °£´ÜÇÑ echo ¼­¹ö¸¦ ±¸ÇöÇÑ´Ù. ÀÌ ¼­¹ö·Î telnetÇÏ¿© + ¹«¾ð°¡¸¦ ÀÔ·ÂÇϸé, ¼­¹ö´Â ÀÔ·ÂÇÑ ³»¿ëÀÌ ±×´ë·Î ¹ÝȯÇÑ´Ù.

    +
    +

    Áö½Ã¾îµé

    + +
    + +
    top
    +

    ProtocolEcho Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:echo ¼­¹ö¸¦ Å°°í ²ö´Ù
    ¹®¹ý:ProtocolEcho On|Off
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®
    »óÅÂ:Experimental
    ¸ðµâ:mod_echo
    Áö¿ø:ProtocolEcho´Â 2.0 ÀÌÈÄ¿¡¸¸ ÀÖ´Ù.
    +

    ProtocolEcho Áö½Ã¾î´Â echo ¼­¹ö¸¦ + Å°°í ²ö´Ù.

    + +

    ¿¹Á¦

    + ProtocolEcho On +

    + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_env.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_env.html new file mode 100644 index 00000000..df910311 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_env.html @@ -0,0 +1,17 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_env.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: mod_env.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: mod_env.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: mod_env.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_env.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_env.html.en new file mode 100644 index 00000000..7b1db2b3 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_env.html.en @@ -0,0 +1,119 @@ + + + +mod_env - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_env

    +
    +

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

    +
    + + + +
    Description:Modifies the environment which is passed to CGI scripts and +SSI pages
    Status:Base
    Module Identifier:env_module
    Source File:mod_env.c
    +

    Summary

    + +

    This module allows for control of the environment that will + be provided to CGI scripts and SSI pages. Environment variables + may be passed from the shell which invoked the httpd + process. Alternatively, environment variables may be set or unset within + the configuration process.

    +
    +

    Directives

    + +

    See also

    +
    + +
    top
    +

    PassEnv Directive

    + + + + + + + +
    Description:Passes environment variables from the shell
    Syntax:PassEnv env-variable [env-variable] +...
    Context:server config, virtual host, directory, .htaccess
    Override:FileInfo
    Status:Base
    Module:mod_env
    +

    Specifies one or more environment variables to pass to CGI + scripts and SSI pages from the environment of the shell which + invoked the httpd process.

    + +

    Example

    + PassEnv LD_LIBRARY_PATH +

    + +
    +
    top
    +

    SetEnv Directive

    + + + + + + + +
    Description:Sets environment variables
    Syntax:SetEnv env-variable value
    Context:server config, virtual host, directory, .htaccess
    Override:FileInfo
    Status:Base
    Module:mod_env
    +

    Sets an environment variable, which is then passed on to CGI + scripts and SSI pages.

    + +

    Example

    + SetEnv SPECIAL_PATH /foo/bin +

    + +
    +
    top
    +

    UnsetEnv Directive

    + + + + + + + +
    Description:Removes variables from the environment
    Syntax:UnsetEnv env-variable [env-variable] +...
    Context:server config, virtual host, directory, .htaccess
    Override:FileInfo
    Status:Base
    Module:mod_env
    +

    Removes one or more environment variables from those passed + on to CGI scripts and SSI pages.

    + +

    Example

    + UnsetEnv LD_LIBRARY_PATH +

    + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_env.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_env.html.ja.utf8 new file mode 100644 index 00000000..9835e866 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_env.html.ja.utf8 @@ -0,0 +1,121 @@ + + + +mod_env - Apache HTTP サーバ + + + + + + +
    <-
    + +
    +

    Apache モジュール mod_env

    +
    +

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

    +
    +
    This translation may be out of date. Check the + English version for recent changes.
    + + + +
    説明:CGI スクリプト及び SSI +ページに渡される環境変数を変更する機能を提供する
    ステータス:Base
    モジュール識別子:env_module
    ソースファイル:mod_env.c
    +

    概要

    + +

    このモジュールにより CGI スクリプトと SSI + ページに適用される環境変数を制御することができるようになります。 + 環境変数は httpd プロセスを起動したシェルから渡されます。また、 + 設定ファイルで環境変数を設定したり、削除したりすることができます。 +

    +
    +

    ディレクティブ

    + +

    参照

    +
    + +
    top
    +

    PassEnv ディレクティブ

    + + + + + + + +
    説明:シェルからの環境変数を渡す
    構文:PassEnv env-variable [env-variable] +...
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:FileInfo
    ステータス:Base
    モジュール:mod_env
    + +

    httpd プロセスを起動したシェルの環境から CGI スクリプトと + SSI ページに渡す環境変数を一つ以上指定します。

    + +

    例

    + PassEnv LD_LIBRARY_PATH +

    + +
    +
    top
    +

    SetEnv ディレクティブ

    + + + + + + + +
    説明:環境変数を設定する
    構文:SetEnv env-variable value
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:FileInfo
    ステータス:Base
    モジュール:mod_env
    +

    環境変数を設定し、それを CGI スクリプトと SSI + ページに渡すようにします。

    + +

    例

    + SetEnv SPECIAL_PATH /foo/bin +

    + +
    +
    top
    +

    UnsetEnv ディレクティブ

    + + + + + + + +
    説明:環境から変数を取り除く
    構文:UnsetEnv env-variable [env-variable] +...
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:FileInfo
    ステータス:Base
    モジュール:mod_env
    +

    CGI スクリプトと SSI + ページに渡される環境変数から指定された環境変数を取り除きます。

    + +

    例

    + UnsetEnv LD_LIBRARY_PATH +

    + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_env.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_env.html.ko.euc-kr new file mode 100644 index 00000000..e5dfdfef --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_env.html.ko.euc-kr @@ -0,0 +1,116 @@ + + + +mod_env - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    ¾ÆÆÄÄ¡ ¸ðµâ mod_env

    +
    +

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

    +
    +
    ÀÌ ¹®¼­´Â ÃÖ½ÅÆÇ ¹ø¿ªÀÌ ¾Æ´Õ´Ï´Ù. + ÃÖ±Ù¿¡ º¯°æµÈ ³»¿ëÀº ¿µ¾î ¹®¼­¸¦ Âü°íÇϼ¼¿ä.
    + + + +
    ¼³¸í:CGI ½ºÅ©¸³Æ®³ª SSI ÆäÀÌÁö¿¡ Àü´ÞÇÒ È¯°æº¯¼ö¸¦ +¼öÁ¤ÇÑ´Ù
    »óÅÂ:Base
    ¸ðµâ¸í:env_module
    ¼Ò½ºÆÄÀÏ:mod_env.c
    +

    ¿ä¾à

    + +

    ÀÌ ¸ðµâÀº CGI ½ºÅ©¸³Æ®³ª SSI ÆäÀÌÁö¿¡ Àü´ÞÇÒ È¯°æº¯¼ö¸¦ + Á¶ÀýÇÑ´Ù. À¥¼­¹ö¸¦ ½ÃÀÛÇÑ ½©¿¡¼­ ȯ°æº¯¼ö¸¦ °¡Á®¿Ã ¼ö ÀÖ´Ù. + ¾Æ´Ï¸é ¼³Á¤°úÁ¤Áß¿¡ ȯ°æº¯¼ö¸¦ ¼³Á¤ÇÏ°í Á¦°ÅÇÒ ¼ö ÀÖ´Ù.

    +
    +

    Áö½Ã¾îµé

    + +

    Âü°í

    +
    + +
    top
    +

    PassEnv Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:½©¿¡¼­ ȯ°æº¯¼ö¸¦ °¡Á®¿Â´Ù
    ¹®¹ý:PassEnv env-variable [env-variable] +...
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®, directory, .htaccess
    Override ¿É¼Ç:FileInfo
    »óÅÂ:Base
    ¸ðµâ:mod_env
    +

    À¥¼­¹ö¸¦ ½ÇÇàÇÑ ½©ÀÇ Æ¯Á¤ ȯ°æº¯¼ö¸¦ CGI ½ºÅ©¸³Æ®³ª + SSI ÆäÀÌÁö·Î Àü´ÞÇÑ´Ù.

    + +

    ¿¹Á¦

    + PassEnv LD_LIBRARY_PATH +

    + +
    +
    top
    +

    SetEnv Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:ȯ°æº¯¼ö¸¦ ¼³Á¤ÇÑ´Ù
    ¹®¹ý:SetEnv env-variable value
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®, directory, .htaccess
    Override ¿É¼Ç:FileInfo
    »óÅÂ:Base
    ¸ðµâ:mod_env
    +

    CGI ½ºÅ©¸³Æ®³ª SSI ÆäÀÌÁö¿¡ Àü´ÞÇÒ È¯°æº¯¼ö¸¦ ¼³Á¤ÇÑ´Ù.

    + +

    ¿¹Á¦

    + SetEnv SPECIAL_PATH /foo/bin +

    + +
    +
    top
    +

    UnsetEnv Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:ȯ°æº¯¼ö¸¦ Á¦°ÅÇÑ´Ù
    ¹®¹ý:UnsetEnv env-variable [env-variable] +...
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®, directory, .htaccess
    Override ¿É¼Ç:FileInfo
    »óÅÂ:Base
    ¸ðµâ:mod_env
    +

    CGI ½ºÅ©¸³Æ®³ª SSI ÆäÀÌÁö¿¡ ȯ°æº¯¼ö¸¦ Àü´ÞÇÏÁö ¾Ê´Â´Ù.

    + +

    ¿¹Á¦

    + UnsetEnv LD_LIBRARY_PATH +

    + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_env.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_env.html.tr.utf8 new file mode 100644 index 00000000..4de81ddf --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_env.html.tr.utf8 @@ -0,0 +1,117 @@ + + + +mod_env - Apache HTTP Sunucusu + + + + + + +
    <-
    + +
    +

    Apache Modülü mod_env

    +
    +

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

    +
    + + + +
    Açıklama:CGI betiklerine ve SSI sayfalarına aktarılan değişkenlere +müdahale etmek için kullanılır.
    Durum:Temel
    Modül Betimleyici:env_module
    Kaynak Dosyası:mod_env.c
    +

    Özet

    + +

    Bu modül CGI betiklerine ve SSI sayfalarına aktarılan ortama müdahale + etmeyi mümkün kılar. Ortam değişkenleri httpd süreci + başlatılırken kabuktan aktarılabilir. Bundan başka, yapılandırma + sürecinde tanımlı veya tanımsız yapılabilirler.

    +
    +

    Yönergeler

    + +

    Ayrıca bakınız:

    +
    + +
    top
    +

    PassEnv Yönergesi

    + + + + + + + +
    Açıklama:Ortam değişkenlerini kabuktan aktarır.
    Sözdizimi:PassEnv ortam-değişkeni [ortam-değişkeni] +...
    Bağlam:sunucu geneli, sanal konak, dizin, .htaccess
    Geçersizleştirme:FileInfo
    Durum:Temel
    Modül:mod_env
    +

    httpd süreci başlatılırken CGI betiklerine ve SSI + sayfalarına kabuktan aktarılabilecek ortam değişkenleri belirtilir.

    + +

    Örnek

    + PassEnv LD_LIBRARY_PATH +

    + +
    +
    top
    +

    SetEnv Yönergesi

    + + + + + + + +
    Açıklama:Ortam değişkenlerini tanımlar.
    Sözdizimi:SetEnv ortam-değişkeni değer
    Bağlam:sunucu geneli, sanal konak, dizin, .htaccess
    Geçersizleştirme:FileInfo
    Durum:Temel
    Modül:mod_env
    +

    CGI betiklerine ve SSI sayfalarına aktarılmak üzere bir ortam değişkeni + tanımlanmasını sağlar.

    + +

    Örnek

    + SetEnv SPECIAL_PATH /foo/bin +

    + +
    +
    top
    +

    UnsetEnv Yönergesi

    + + + + + + + +
    Açıklama:Ortamdaki değişkenleri tanımsız hale getirir.
    Sözdizimi:UnsetEnv ortam-değişkeni [ortam-değişkeni] +...
    Bağlam:sunucu geneli, sanal konak, dizin, .htaccess
    Geçersizleştirme:FileInfo
    Durum:Temel
    Modül:mod_env
    +

    CGI betiklerine ve SSI sayfalarına bir daha aktarılmamak üzere bir ortam + değişkenini ortamdan siler.

    + +

    Örnek

    + UnsetEnv LD_LIBRARY_PATH +

    + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_example.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_example.html new file mode 100644 index 00000000..6da80488 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_example.html @@ -0,0 +1,9 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_example.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: mod_example.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_example.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_example.html.en new file mode 100644 index 00000000..af92125a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_example.html.en @@ -0,0 +1,154 @@ + + + +mod_example - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_example

    +
    +

    Available Languages:  en  | + ko 

    +
    + + + +
    Description:Illustrates the Apache module API
    Status:Experimental
    Module Identifier:example_module
    Source File:mod_example.c
    +

    Summary

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

    The files in the src/modules/example directory + under the Apache distribution directory tree are provided as an + example to those that wish to write modules that use the Apache + API.

    + +

    The main file is mod_example.c, which + illustrates all the different callback mechanisms and call + syntaxes. By no means does an add-on module need to include + routines for all of the callbacks - quite the contrary!

    + +

    The example module is an actual working module. If you link + it into your server, enable the "example-handler" handler for a + location, and then browse to that location, you will see a + display of some of the tracing the example module did as the + various callbacks were made.

    +
    + +
    top
    +
    +

    Compiling the example module

    + +

    To include the example module in your server, follow the + steps below:

    + +
      +
    1. + Uncomment the "AddModule modules/example/mod_example" line + near the bottom of the src/Configuration file. + If there isn't one, add it; it should look like this: +

      + AddModule modules/example/mod_example.o +

      +
    2. + +
    3. Run the src/Configure script + ("cd src; ./Configure"). This will + build the Makefile for the server itself, and update the + src/modules/Makefile for any additional modules + you have requested from beneath that subdirectory.
    4. + +
    5. Make the server (run "make" in the + src directory).
    6. +
    + +

    To add another module of your own:

    + +
      +
    1. mkdir src/modules/mymodule
    2. + +
    3. cp src/modules/example/* + src/modules/mymodule
    4. + +
    5. Modify the files in the new directory.
    6. + +
    7. Follow steps [1] through [3] above, with appropriate + changes.
    8. +
    +
    top
    +
    +

    Using the mod_example Module

    + +

    To activate the example module, include a block similar to + the following in your srm.conf file:

    +

    + <Location /example-info>
    + SetHandler example-handler
    + </Location> +

    + +

    As an alternative, you can put the following into a .htaccess file + and then request the file "test.example" from that location:

    +

    + AddHandler example-handler .example +

    + +

    After reloading/restarting your server, you should be able + to browse to this location and see the brief display mentioned + earlier.

    +
    +
    top
    +

    Example Directive

    + + + + + + +
    Description:Demonstration directive to illustrate the Apache module +API
    Syntax:Example
    Context:server config, virtual host, directory, .htaccess
    Status:Experimental
    Module:mod_example
    +

    The Example directive just sets a demonstration + flag which the example module's content handler displays. It + takes no arguments. If you browse to an URL to which the + example content-handler applies, you will get a display of the + routines within the module and how and in what order they were + called to service the document request. The effect of this + directive one can observe under the point "Example + directive declared here: YES/NO".

    + +
    +
    +
    +

    Available Languages:  en  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_example.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_example.html.ko.euc-kr new file mode 100644 index 00000000..b5a7936d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_example.html.ko.euc-kr @@ -0,0 +1,145 @@ + + + +mod_example - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    ¾ÆÆÄÄ¡ ¸ðµâ mod_example

    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + ko 

    +
    + + + +
    ¼³¸í:¾ÆÆÄÄ¡ ¸ðµâ API¸¦ ¼³¸íÇÑ´Ù
    »óÅÂ:Experimental
    ¸ðµâ¸í:example_module
    ¼Ò½ºÆÄÀÏ:mod_example.c
    +

    ¿ä¾à

    + +
    + ÀÌ ¹®¼­´Â ¾ÆÆÄÄ¡ À¥¼­¹ö 2.0 ¹öÀü¿¡¼­ º¯°æµÈ ³»¿ëÀ» ´ã°í + ÀÖÁö ¾Ê´Ù. ¾ÆÁ÷µµ À¯È¿ÇÑ Á¤º¸°¡ ÀÖÁö¸¸, ÁÖÀÇÇؼ­ »ç¿ëÇϱæ + ¹Ù¶õ´Ù. +
    + +

    ¾ÆÆÄÄ¡ ¹èÆ÷º» src/modules/example µð·ºÅ丮¿¡ + ÀÖ´Â ÆÄÀϵéÀº ¾ÆÆÄÄ¡ API¸¦ »ç¿ëÇÏ¿© ¸ðµâÀ» ÀÛ¼ºÇÏ·Á´Â »ç¶÷µéÀ» + µ½±âÀ§ÇÑ ¿¹Á¦´Ù.

    + +

    mod_example.c´Â ¸ðµç Äݹé(callback) ±¸Á¶¿Í + È£Ãâ ¹®¹ýÀ» ¼³¸íÇÏ´Â ÆÄÀÏÀÌ´Ù. ´ç½ÅÀº ¸ðµâ¿¡ ÀÌ ¸ðµç ÄݹéÀ» + ±¸ÇöÇÒ ÇÊ¿ä°¡ ¾ø´Ù. »ç½Ç Á¤¹Ý´ë´Ù!

    + +

    example ¸ðµâÀº ½ÇÁ¦·Î µ¿ÀÛÇÏ´Â ¸ðµâÀÌ´Ù. ÀÌ ¸ðµâÀ» ¼­¹ö¿¡ + ¿¬°áÇÏ°í ƯÁ¤ À§Ä¡¿¡ "example-handler" Çڵ鷯¸¦ ÇÒ´çÇÏ¿© + ±×°÷À» ºê¶ó¿ì¡Çϸé example ¸ðµâÀÇ ¿©·¯ ÄݹéÀ» È®ÀÎÇÒ ¼ö + ÀÖ´Ù.

    +
    + +
    top
    +
    +

    example ¸ðµâ ÄÄÆÄÀÏÇϱâ

    + +

    ¼­¹ö¿¡ example ¸ðµâÀ» Æ÷ÇÔÇÏ·Á¸é ´ÙÀ½ °úÁ¤À» °ÅÄ£´Ù:

    + +
      +
    1. + src/Configuration ÆÄÀÏ ¾Æ·¡ ºÎºÐ¿¡ ÀÖ´Â + "AddModule modules/example/mod_example" ÁÙÀÇ ÁÖ¼®Ã³¸®¸¦ + ¾ø¾Ø´Ù. ÀÌ·± ÁÙÀÌ ¾ø´Ù¸é, ´ÙÀ½°ú °°Àº ÁÙÀ» Ãß°¡ÇÑ´Ù. +

      + AddModule modules/example/mod_example.o +

      +
    2. + +
    3. src/Configure ½ºÅ©¸³Æ®¸¦ ½ÇÇàÇÑ´Ù + ("cd src; ./Configure"). ±×·¯¸é + ¼­¹ö ÀÚü MakefileÀ» ¸¸µé°í, ÇÏÀ§µð·ºÅ丮¿¡ ÀÖ´Â ¿äûÇÑ + Ãß°¡ ¸ðµâÀ» src/modules/Makefile¿¡ Ãß°¡ÇÑ´Ù.
    4. + +
    5. ¼­¹ö¸¦ ÄÄÆÄÀÏÇÑ´Ù (src µð·ºÅ丮¿¡ ÀÖ´Â + "make"¸¦ ½ÇÇàÇÑ´Ù).
    6. +
    + +

    ÀÚ½ÅÀÌ ¸¸µç ¸ðµâÀ» Ãß°¡ÇÏ·Á¸é:

    + +
      +
    1. mkdir src/modules/mymodule
    2. + +
    3. cp src/modules/example/* + src/modules/mymodule
    4. + +
    5. »õ·Î ¸¸µç µð·ºÅ丮¿¡ ÀÖ´Â ÆÄÀÏÀ» ¼öÁ¤ÇÑ´Ù.
    6. + +
    7. ÀûÀýÈ÷ ¼öÁ¤ÇÏ¿© À§ÀÇ [1]¿¡¼­ [3]±îÁö °úÁ¤À» ÁøÇàÇÑ´Ù.
    8. +
    +
    top
    +
    +

    mod_example ¸ðµâ »ç¿ëÇϱâ

    + +

    example ¸ðµâÀ» »ç¿ëÇÏ·Á¸é srm.conf ÆÄÀÏ¿¡ + ´ÙÀ½°ú °°Àº ¼³Á¤À» Ãß°¡Ç϶ó:

    +

    + <Location /example-info>
    + SetHandler example-handler
    + </Location> +

    + +

    ¾Æ´Ï¸é .htaccess + ÆÄÀÏ¿¡ ´ÙÀ½°ú °°Àº ³»¿ëÀ» Ãß°¡ÇÏ°í, ±× À§Ä¡¿¡¼­ "test.example" + °°Àº ÆÄÀÏÀ» ¿äûÇ϶ó:

    +

    + AddHandler example-handler .example +

    + +

    ¼­¹ö¸¦ Àç½ÃÀÛÇÑ ÈÄ ÀÌ À§Ä¡¸¦ ºê¶ó¿ì¡ÇÏ¸é ¾Õ¿¡¼­ ¸»ÇÑ + ³»¿ëÀ» º¸°ÔµÉ °ÍÀÌ´Ù.

    +
    +
    top
    +

    Example Áö½Ã¾î

    + + + + + + +
    ¼³¸í:¾ÆÆÄÄ¡ ¸ðµâ API¸¦ ¼³¸íÇϱâÀ§ÇÑ ¿¹Á¦ Áö½Ã¾î
    ¹®¹ý:Example
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®, directory, .htaccess
    »óÅÂ:Experimental
    ¸ðµâ:mod_example
    +

    Example Áö½Ã¾î´Â example ¸ðµâÀÇ + ³»¿ëÇڵ鷯°¡ °£´ÜÇÑ ¹®±¸¸¦ º¸ÀÏÁö ¿©ºÎ¸¦ ¼³Á¤ÇÑ´Ù. ÀÌ Áö½Ã¾î´Â + ¾Æ±Ô¸ÕÆ®¸¦ ¹ÞÁö¾Ê´Â´Ù. example ³»¿ëÇڵ鷯¸¦ Àû¿ëÇÑ URL¿¡ + Á¢¼ÓÇÏ¸é ¹®¼­ ¿äûÀ» ¼­ºñ½ºÇϱâÀ§ÇØ ¸ðµâ¾È¿¡ ÇÔ¼öµéÀÌ ¾î¶»°Ô + ±×¸®°í ¾î¶² ¼ø¼­·Î ºÒ¸®´ÂÁö ¾Ë ¼ö ÀÖ´Ù. ÀÌ Áö½Ã¾îÀÇ È¿°ú´Â + "Example directive declared here: YES/NO"·Î + È®ÀÎÇÒ ¼ö ÀÖ´Ù.

    + +
    +
    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_expires.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_expires.html new file mode 100644 index 00000000..77b906ef --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_expires.html @@ -0,0 +1,13 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_expires.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: mod_expires.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: mod_expires.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_expires.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_expires.html.en new file mode 100644 index 00000000..638d9ad1 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_expires.html.en @@ -0,0 +1,247 @@ + + + +mod_expires - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_expires

    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + + + +
    Description:Generation of Expires and +Cache-Control HTTP headers according to user-specified +criteria
    Status:Extension
    Module Identifier:expires_module
    Source File:mod_expires.c
    +

    Summary

    + +

    This module controls the setting of the Expires + HTTP header and the max-age directive of the + Cache-Control HTTP header in server responses. The + expiration date can set to be relative to either the time the + source file was last modified, or to the time of the client + access.

    + +

    These HTTP headers are an instruction to the client about the + document's validity and persistence. If cached, the document may + be fetched from the cache rather than from the source until this + time has passed. After that, the cache copy is considered + "expired" and invalid, and a new copy must be obtained from the + source.

    + +

    To modify Cache-Control directives other than + max-age (see RFC + 2616 section 14.9), you can use the Header directive.

    + +
    + +
    top
    +
    +

    Alternate Interval Syntax

    +

    The ExpiresDefault and + ExpiresByType directives + can also be defined in a more readable syntax of the form:

    + +

    + ExpiresDefault "<base> [plus] {<num> + <type>}*"
    + ExpiresByType type/encoding "<base> [plus] + {<num> <type>}*" +

    + +

    where <base> is one of:

    + +
      +
    • access
    • + +
    • now (equivalent to + 'access')
    • + +
    • modification
    • +
    + +

    The plus keyword is optional. <num> + should be an integer value [acceptable to atoi()], + and <type> is one of:

    + +
      +
    • years
    • +
    • months
    • +
    • weeks
    • +
    • days
    • +
    • hours
    • +
    • minutes
    • +
    • seconds
    • +
    + +

    For example, any of the following directives can be used to + make documents expire 1 month after being accessed, by + default:

    + +

    + ExpiresDefault "access plus 1 month"
    + ExpiresDefault "access plus 4 weeks"
    + ExpiresDefault "access plus 30 days" +

    + +

    The expiry time can be fine-tuned by adding several + '<num> <type>' clauses:

    + +

    + ExpiresByType text/html "access plus 1 month 15 + days 2 hours"
    + ExpiresByType image/gif "modification plus 5 hours 3 + minutes" +

    + +

    Note that if you use a modification date based setting, the + Expires header will not be added to content + that does not come from a file on disk. This is due to the fact + that there is no modification time for such content.

    +
    +
    top
    +

    ExpiresActive Directive

    + + + + + + + +
    Description:Enables generation of Expires +headers
    Syntax:ExpiresActive On|Off
    Context:server config, virtual host, directory, .htaccess
    Override:Indexes
    Status:Extension
    Module:mod_expires
    +

    This directive enables or disables the generation of the + Expires and Cache-Control headers for + the document realm in question. (That is, if found in an + .htaccess file, for instance, it applies only to + documents generated from that directory.) If set to + Off, the headers will not be generated for any + document in the realm (unless overridden at a lower level, such as + an .htaccess file overriding a server config + file). If set to On, the headers will be added to + served documents according to the criteria defined by the + ExpiresByType and + ExpiresDefault + directives (q.v.).

    + +

    Note that this directive does not guarantee that an + Expires or Cache-Control header will be + generated. If the criteria aren't met, no header will be sent, and + the effect will be as though this directive wasn't even + specified.

    + +
    +
    top
    +

    ExpiresByType Directive

    + + + + + + + +
    Description:Value of the Expires header configured +by MIME type
    Syntax:ExpiresByType MIME-type +<code>seconds
    Context:server config, virtual host, directory, .htaccess
    Override:Indexes
    Status:Extension
    Module:mod_expires
    +

    This directive defines the value of the Expires + header and the max-age directive of the + Cache-Control header generated for documents of the + specified type (e.g., text/html). The second + argument sets the number of seconds that will be added to a base + time to construct the expiration date. The Cache-Control: + max-age is calculated by subtracting the request time from + the expiration date and expressing the result in seconds.

    + +

    The base time is either the last modification time of the + file, or the time of the client's access to the document. Which + should be used is specified by the + <code> field; M + means that the file's last modification time should be used as + the base time, and A means the client's access + time should be used.

    + +

    The difference in effect is subtle. If M is used, + all current copies of the document in all caches will expire at + the same time, which can be good for something like a weekly + notice that's always found at the same URL. If A is + used, the date of expiration is different for each client; this + can be good for image files that don't change very often, + particularly for a set of related documents that all refer to + the same images (i.e., the images will be accessed + repeatedly within a relatively short timespan).

    + +

    Example:

    + # enable expirations
    + ExpiresActive On
    + # expire GIF images after a month in the client's cache
    + ExpiresByType image/gif A2592000
    + # HTML documents are good for a week from the
    + # time they were changed
    + ExpiresByType text/html M604800 +

    + +

    Note that this directive only has effect if + ExpiresActive On has been specified. It overrides, + for the specified MIME type only, any expiration date + set by the ExpiresDefault + directive.

    + +

    You can also specify the expiration time calculation using + an alternate syntax, described earlier in + this document.

    + +
    +
    top
    +

    ExpiresDefault Directive

    + + + + + + + +
    Description:Default algorithm for calculating expiration time
    Syntax:ExpiresDefault <code>seconds
    Context:server config, virtual host, directory, .htaccess
    Override:Indexes
    Status:Extension
    Module:mod_expires
    +

    This directive sets the default algorithm for calculating the + expiration time for all documents in the affected realm. It can be + overridden on a type-by-type basis by the ExpiresByType directive. See the + description of that directive for details about the syntax of the + argument, and the alternate syntax + description as well.

    + +
    +
    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_expires.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_expires.html.ja.utf8 new file mode 100644 index 00000000..794b3955 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_expires.html.ja.utf8 @@ -0,0 +1,233 @@ + + + +mod_expires - Apache HTTP サーバ + + + + + + +
    <-
    + +
    +

    Apache モジュール mod_expires

    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + + + +
    説明:ユーザの指定した基準に基づいた Expires と +Cache-Control HTTP ヘッダの生成
    ステータス:Extension
    モジュール識別子:expires_module
    ソースファイル:mod_expires.c
    +

    概要

    + +

    このモジュールはサーバ応答の Expires HTTP ヘッダ + と Cache-Control ヘッダの max-age ディレクティブの + 設定を制御します。元のファイルが作成された時刻または + クライアントのアクセス時刻のどちらかに基づいて期限切れ日を + 設定することができます。

    + +

    これらのヘッダはクライアントに文書の + 有効性と継続性を指示します。文書がキャッシュされた場合には、 + 指定時刻に達するまでは、元の場所から取得する代わりに + キャッシュされているものを使うことができます。その後は、 + キャッシュにあるコピーは期限切れ (expired) で無効であるとされ、 + 元の場所から新しいものを取得する必要があります。

    + +

    max-age 以外 (RFC + 2616 section 14.9 参照) の Cache-Control のディレクティブを + 操作するには Header ディレクティブを + 使うことができます。

    +

    ディレクティブ

    + +

    トピック

    +
    +
    top
    +
    +

    代替期間指定構文

    + +

    ExpiresDefault ディレクティブと + ExpiresByType ディレクティブは + 以下のより読み易い構文を使って定義することができます:

    + +

    + ExpiresDefault "<base> [plus] {<num> + <type>}*"
    + ExpiresByType type/encoding "<base> [plus] + {<num> <type>}*" +

    + +

    <base> は以下のどれかです:

    + +
      +
    • access
    • + +
    • now ('access' と等価)
    • + +
    • modification
    • +
    + +

    plus キーワードは省略可能です。<num> + は (atoi() が受け付ける) 整数値、 + <type> は以下のどれかです:

    + +
      +
    • years
    • +
    • months
    • +
    • weeks
    • +
    • days
    • +
    • hours
    • +
    • minutes
    • +
    • seconds
    • +
    + +

    例えば、以下のディレクティブはどれもデフォルトで文書がアクセスの 1 ヶ月後に + 期限が切れるようにするために使えます:

    + +

    + ExpiresDefault "access plus 1 month"
    + ExpiresDefault "access plus 4 weeks"
    + ExpiresDefault "access plus 30 days" +

    + +

    期限切れ時刻はいくつか + '<num> <type>' 節を追加することでより細かく + 制御することができます:

    + +

    + ExpiresByType text/html "access plus 1 month 15 + days 2 hours"
    + ExpiresByType image/gif "modification plus 5 hours 3 + minutes" +

    + +

    修正時刻に基づいた設定を使用している場合、Expires ヘッダは + ディスクのファイル以外のコンテンツには追加されないことに注意 + してください。そのようなコンテンツには修正時刻は存在しないからです。

    +
    +
    top
    +

    ExpiresActive ディレクティブ

    + + + + + + + +
    説明:Expires ヘッダの生成を有効にする
    構文:ExpiresActive On|Off
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:Indexes
    ステータス:Extension
    モジュール:mod_expires
    +

    このディレクティブは対応するドキュメントの領域で + Expires と Cache-Controlヘッダを + 有効にするか無効にするかを決めます。 + (例えば、.htaccess ファイルではそのディレクトリの + 文書のみに適用されるということです。) Off に + 設定された場合は対応領域でそれらのヘッダは + 生成されません (.htaccess がサーバ設定ファイルの設定を + 上書きする、というような下位レベルでの上書きがされていなければ)。 + On に設定されていれば、ヘッダは ExpiresByType ディレクティブと + ExpiresDefault ディレクティブ + の基準に従って文書にヘッダを追加します (各ディレクティブ参照)。

    + +

    このディレクティブは Expires と + Cache-Control ヘッダの存在を + 保証するわけではないことに注意してください。基準が満たされて + いない場合はヘッダは追加されず、結果としてこのディレクティブが + 指定されていなかったかのようにさえ見えることになります。

    + +
    +
    top
    +

    ExpiresByType ディレクティブ

    + + + + + + + +
    説明:MIME タイプによって設定される Expires ヘッダの値
    構文:ExpiresByType MIME-type +<code>seconds
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:Indexes
    ステータス:Extension
    モジュール:mod_expires
    +

    このディレクティブは指定されたタイプのドキュメント + (例えば text/html) + に対して生成される Expires ヘッダと Cache-Control + ヘッダの max-age ディレクティブの値を定義します。 + 二つ目の引数は期限切れの日時を生成するための基準時刻に追加される + 秒数を設定します。Cache-Control: + max-age は期限切れの時刻からリクエスト時刻を引いたものを秒で + 表すことで生成されます。

    + +

    基準時刻はファイルの最終修正時刻か、クライアントのドキュメントへの + アクセス時刻です。どちらを使うべきかは <code> + によって指定します。M は基準時刻として + ファイルの最終修正時刻をという意味で、A はクライアントの + アクセス時刻を使うという意味になります。

    + +

    効果には微妙な違いがあります。M が使用された場合は、 + すべてのキャッシュにある現在のドキュメントキャッシュは同時に期限が + 切れます。これは同じ URL に毎週常に置かれる報せのようなものには + 非常に有効です。A が使用された場合は、期限切れの + 時間は各クライアントよって異なります。これはあまり変更されない + 画像ファイルなど、特に関連するドキュメント群がすべて同じ画像を + 参照するとき (すなわち画像が比較的短い期間内に繰り返し + アクセスされるとき) に有効です。

    + +

    例:

    + # enable expirations
    + ExpiresActive On
    + # expire GIF images after a month in the client's cache
    + ExpiresByType image/gif A2592000
    + # HTML documents are good for a week from the
    + # time they were changed
    + ExpiresByType text/html M604800 +

    + +

    このディレクティブは ExpiresActive On が指定されている + ときのみ有効であることに注意してください。これは、 + 指定された MIME タイプに対してのみ ExpiresDefault ディレクティブで + 設定された期限切れ期日を上書きします。

    + +

    この文書の前の方で説明されている代替構文を + 使って期限切れ期日の計算方法を指定することもできます。

    + +
    +
    top
    +

    ExpiresDefault ディレクティブ

    + + + + + + + +
    説明:期限切れ期日を計算するデフォルトアルゴリズム
    構文:ExpiresDefault <code>seconds
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:Indexes
    ステータス:Extension
    モジュール:mod_expires
    +

    このディレクティブは対応する範囲のすべてのドキュメントに対して + デフォルトの期限切れ期日の計算アルゴリズムを設定します。ExpiresByType ディレクティブによって + タイプ毎に上書きすることができます。引数の構文はそのディレクティブの + 説明を参照してください。また、代替構文も + 参照してください。

    + +
    +
    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_expires.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_expires.html.ko.euc-kr new file mode 100644 index 00000000..ebd26c2f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_expires.html.ko.euc-kr @@ -0,0 +1,225 @@ + + + +mod_expires - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    ¾ÆÆÄÄ¡ ¸ðµâ mod_expires

    +
    +

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

    +
    + + + +
    ¼³¸í:»ç¿ëÀÚ°¡ ÁöÁ¤ÇÑ ±âÁØ¿¡ µû¶ó Expires¿Í +Cache-Control HTTP Çì´õ¸¦ »ý¼ºÇÑ´Ù
    »óÅÂ:Extension
    ¸ðµâ¸í:expires_module
    ¼Ò½ºÆÄÀÏ:mod_expires.c
    +

    ¿ä¾à

    + +

    ÀÌ ¸ðµâÀº ¼­¹ö ÀÀ´äÀÇ Expires HTTP Çì´õ¿Í + Cache-Control HTTP Çì´õÀÇ max-age + Áö½Ã¾î ¼³Á¤À» Á¶ÀýÇÑ´Ù. ¸¸±âÀÏÀ» ÆÄÀÏÀÌ ¸¶Á÷¸· ¼öÁ¤µÈ ½Ã°£ + ȤÀº Ŭ¶óÀ̾ðÆ®°¡ Á¢¼ÓÇÑ ½Ã°£¿¡ »ó´ëÀûÀ¸·Î ¼³Á¤ÇÒ ¼ö ÀÖ´Ù.

    + +

    ÀÌ HTTP Çì´õµéÀº Ŭ¶óÀ̾ðÆ®¿¡°Ô ¹®¼­ÀÇ + À¯È¿¼º°ú Áö¼Ó¼ºÀ» ¾Ë·ÁÁØ´Ù. ÀÌ ½Ã°£ÀÌ ¾ÆÁ÷ Áö³ªÁö¾Ê¾Ò´Ù¸é, + ¹®¼­¸¦ ij½¬¿¡¼­ °¡Á®¿Íµµ µÈ´Ù. ¸¸±âÀÏÀÌ Áö³µ´Ù¸é ij½¬µÈ + °ÍÀ» "¸¸·áµÇ°í" À¯È¿ÇÏÁö ¾Ê´Ù°í °£ÁÖÇÏ¿©, ¼Ò½º¿¡¼­ ¹®¼­¸¦ + »õ·Î ¾ò¾î¿Í¾ß ÇÑ´Ù.

    + +

    Header Áö½Ã¾î¸¦ + »ç¿ëÇÏ¿© max-age ¿ÜÀÇ ´Ù¸¥ + Cache-Control Áö½Ã¾î(RFC + 2616, 14.9 Àý Âü°í)¸¦ ¼öÁ¤ÇÒ ¼ö ÀÖ´Ù.

    + +
    +

    Áö½Ã¾îµé

    + +

    ÁÖÁ¦

    +
    +
    top
    +
    +

    ´Ù¸¥ ³»ºÎ ¹®¹ý

    +

    ExpiresDefault¿Í + ExpiresByType + Áö½Ã¾î¸¦ ´õ Àбâ ÁÁÀº Çü½ÄÀ¸·Î ±â¼úÇÒ ¼ö ÀÖ´Ù:

    + +

    + ExpiresDefault "<base> [plus] {<num> + <type>}*"
    + ExpiresByType type/encoding "<base> [plus] + {<num> <type>}*" +

    + +

    <base>´Â ´ÙÀ½Áß ÇϳªÀÌ´Ù:

    + +
      +
    • access
    • + +
    • now ('access'¿Í °°À½)
    • + +
    • modification
    • +
    + +

    plus Å°¿öµå´Â ¾ø¾îµµ µÈ´Ù. <num>Àº + [atoi()¿¡ »ç¿ëÇÒ ¼ö ÀÖ´Â] Á¤¼ö°ªÀÌ´Ù. + <type>Àº ´ÙÀ½Áß ÇϳªÀÌ´Ù:

    + +
      +
    • years
    • +
    • months
    • +
    • weeks
    • +
    • days
    • +
    • hours
    • +
    • minutes
    • +
    • seconds
    • +
    + +

    ¿¹¸¦ µé¾î, ´ÙÀ½ ¸ðµÎ´Â ¹®¼­°¡ ±âº»ÀûÀ¸·Î Á¢¼ÓµÈÁö 1´ÞÈÄ¿¡ + ¸¸±âµÈ´Ù°í ¼³Á¤ÇÑ´Ù:

    + +

    + ExpiresDefault "access plus 1 month"
    + ExpiresDefault "access plus 4 weeks"
    + ExpiresDefault "access plus 30 days" +

    + +

    '<num> <type>' ±¸¹®À» ¹Ýº¹Çؼ­ »ç¿ëÇÏ¿© + ¸¸±â½Ã°£À» ÀÚ¼¼È÷ ¼³Á¤ÇÒ ¼ö ÀÖ´Ù:

    + +

    + ExpiresByType text/html "access plus 1 month 15 + days 2 hours"
    + ExpiresByType image/gif "modification plus 5 hours 3 + minutes" +

    + +

    ¸¸¾à ¼öÁ¤½Ã°£(modification)À» ±âÁØÀ¸·Î ¸¸±â½Ã°£À» ¼³Á¤ÇÏ´Â + °æ¿ì ³»¿ëÀ» µð½ºÅ©¿¡ ÀÖ´Â ÆÄÀÏ¿¡¼­ °¡Á®¿ÀÁö ¾Ê´Â´Ù¸é Expires + Çì´õ¸¦ ºÙÀÌÁö ¾Ê´Â´Ù. ÀÌ °æ¿ì ³»¿ë¿¡ ¼öÁ¤½Ã°£ÀÌ + ¾ø±â ¶§¹®ÀÌ´Ù.

    +
    +
    top
    +

    ExpiresActive Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:Expires Çì´õ¸¦ »ý¼ºÇÑ´Ù
    ¹®¹ý:ExpiresActive On|Off
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®, directory, .htaccess
    Override ¿É¼Ç:Indexes
    »óÅÂ:Extension
    ¸ðµâ:mod_expires
    +

    ÀÌ Áö½Ã¾î´Â ÇØ´ç ¿µ¿ª¿¡ ´ëÇØ (Áï, .htaccess + ÆÄÀÏ¿¡¼­ »ç¿ëÇÑ´Ù¸é ±× µð·ºÅ丮 ¾Æ·¡¿¡ ÀÖ´Â ¹®¼­µé¸¸ ÇØ´çµÈ´Ù.) + Expires¿Í Cache-Control Çì´õ¸¦ + »ý¼ºÇÒÁö À¯¹«¸¦ °áÁ¤ÇÑ´Ù. (.htaccess ÆÄÀÏ µîÀ¸·Î + ´õ ÇÏÀ§ ´Ü°è¿¡¼­ ¼­¹ö¼³Á¤À» º¯°æÇÏÁö¾Ê´Â ÇÑ) + OffÀ̸é ÇØ´ç ¿µ¿ª¿¡ ÀÖ´Â ¹®¼­¿¡ À̵é Çì´õ¸¦ + »ý¼ºÇÏÁö ¾Ê´Â´Ù. OnÀ̸é ExpiresByType°ú ExpiresDefault Áö½Ã¾î·Î + (ÇØ´ç Ç׸ñÀ» Âü°íÇ϶ó) ÁöÁ¤ÇÑ ±ÔÄ¢¿¡ µû¶ó ¼­ºñ½ºÇÏ·Á´Â + ¹®¼­¿¡ ÀÌ Çì´õµéÀ» »ý¼ºÇÑ´Ù.

    + +

    ÀÌ Áö½Ã¾î°¡ Expires³ª Cache-Control + Çì´õ¸¦ º¸ÀåÇÏÁö´Â ¾Ê´Â´Ù. ±ÔÄ¢¿¡ ÇØ´çÇÏÁö ¾Ê´Ù¸é ¸¶Ä¡ ÀÌ + Áö½Ã¾î°¡ ¾ø´Â °Íó·³ Çì´õ¸¦ ¸¸µéÁö ¾Ê´Â´Ù.

    + +
    +
    top
    +

    ExpiresByType Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:MIME typeÀ¸·Î Expires Çì´õ°ªÀ» ¼³Á¤ÇÑ´Ù
    ¹®¹ý:ExpiresByType MIME-type +<code>seconds
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®, directory, .htaccess
    Override ¿É¼Ç:Indexes
    »óÅÂ:Extension
    ¸ðµâ:mod_expires
    +

    ÀÌ Áö½Ã¾î´Â ƯÁ¤ Á¾·ùÀÇ (¿¡¸¦ µé¾î, + text/html) ¹®¼­¿¡ ´ëÇÑ Expires + Çì´õ°ª°ú Cache-Control Çì´õÀÇ max-age + Áö½Ã¾î°ªÀ» Á¤ÀÇÇÑ´Ù. µÎ¹ø° ¾Æ±Ô¸ÕÆ®´Â ¸¸±â½Ã°£À» °áÁ¤ÇÒ¶§ + ±âÁØ ½Ã°£¿¡ ´õÇÒ ÃÊ´ÜÀ§ °ªÀ» ÁöÁ¤ÇÑ´Ù. Cache-Control: + max-age´Â ¸¸±â½Ã°£¿¡¼­ ¿äûÇÑ ½Ã°£À» »©¼­ °è»êÇÏ°í, + °á°ú´Â ÃÊ´ÜÀ§·Î Ç¥½ÃÇÑ´Ù.

    + +

    ±âÁØ ½Ã°£Àº ÆÄÀÏÀÇ ÃÖ±Ù ¼öÁ¤½Ã°£ ȤÀº Ŭ¶óÀ̾ðÆ®°¡ ¹®¼­¿¡ + Á¢±ÙÇÑ ½Ã°£ÀÌ´Ù. À̶² °ÍÀ» »ç¿ëÇÒÁö´Â + <code> Çʵå·Î °áÁ¤ÇØ¾ß ÇÑ´Ù. + MÀº ±âÁØ ½Ã°£À¸·Î ÆÄÀÏÀÇ ÃÖ±Ù ¼öÁ¤½Ã°£À» + »ç¿ëÇÏ°í, A´Â Ŭ¶óÀ̾ðÆ®ÀÇ Á¢±Ù ½Ã°£À» »ç¿ëÇÑ´Ù.

    + +

    Â÷ÀÌ´Â ¹Ì¹¦ÇÏ´Ù. MÀ» »ç¿ëÇϸé ij½¬¿¡ ÀÖ´Â + ¸ðµç º¹»çº»ÀÌ °°Àº ½Ã°£¿¡ ¸¸·áµÈ´Ù. ±×·¡¼­ Ç×»ó °°Àº URL·Î + ã¾Æº¼ ¼ö ÀÖ´Â ÁÖ°£ÀÏÁ¤ °°Àº ¿ëµµ¿¡ ÁÁ´Ù. A¸¦ + »ç¿ëÇÏ¸é º¹»çº»ÀÇ ¸¸±â½Ã°£ÀÌ °¢°¢ ´Ù¸£´Ù. ÀÌ´Â ÀÚÁÖ ¼öÁ¤µÇÁö¾Ê´Â + ±×¸²ÆÄÀÏ¿¡, ƯÈ÷ ¿©·¯ ¹®¼­¿¡¼­ °°Àº ±×¸²À» ÂüÁ¶ÇÒ¶§ (¿¹¸¦ + µé¾î, À̹ÌÁö´Â »ó´ëÀûÀ¸·Î ªÀº ±â°£µ¿¾È ¹Ýº¹Çؼ­ Á¢±ÙµÈ´Ù), + À¯¿ëÇÏ´Ù.

    + +

    ¿¹Á¦:

    + # ¸¸±âÇì´õ¸¦ »ç¿ëÇÑ´Ù
    + ExpiresActive On
    + # Ŭ¶óÀ̾ðÆ® ij½¬ÀÇ GIF ±×¸²Àº ÇÑ ´ÞÈÄ¿¡ ¸¸±âÇÑ´Ù
    + ExpiresByType image/gif A2592000
    + # HTML ¹®¼­´Â º¯°æÈÄ ÀÏÁÖÀÏ°£ À¯È¿ÇÏ´Ù + ExpiresByType text/html M604800 +

    + +

    ÀÌ Áö½Ã¾î´Â ExpiresActive OnÀ» »ç¿ëÇÒ¶§¸¸ + À¯È¿ÇÔÀ» ÁÖÀÇÇ϶ó. ExpiresDefault Áö½Ã¾î¸¦ + »ç¿ëÇÏ¿© ƯÁ¤ MIME type¿¡ ´ëÇؼ­¸¸ ¸¸±â½Ã°£À» + ¼³Á¤ÇÒ ¼ö ÀÖ´Ù.

    + +

    ¾Õ¿¡¼­ ¼³¸íÇÑ ´Ù¸¥ ¹®¹ýÀ» »ç¿ëÇÏ¿© + ¸¸±â½Ã°£À» °è»êÇÒ ¼öµµ ÀÖ´Ù.

    + +
    +
    top
    +

    ExpiresDefault Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:¸¸±â½Ã°£À» °è»êÇÏ´Â ±âº» ¾Ë°í¸®Áò
    ¹®¹ý:ExpiresDefault <code>seconds
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®, directory, .htaccess
    Override ¿É¼Ç:Indexes
    »óÅÂ:Extension
    ¸ðµâ:mod_expires
    +

    ÀÌ Áö½Ã¾î´Â ÇØ´ç ¿µ¿ª¿¡ ÀÖ´Â ¸ðµç ¹®¼­ÀÇ ¸¸±â½Ã°£À» + °è»êÇÏ´Â ±âº» ¾Ë°í¸®ÁòÀ» ÁöÁ¤ÇÑ´Ù. ExpiresByType Áö½Ã¾î¸¦ + »ç¿ëÇÏ¿© Á¾·ùº°·Î ¼³Á¤ÇÒ ¼ö ÀÖ´Ù. ¾Æ±Ô¸ÕÆ® ¹®¹ý¿¡ ´ëÇÑ + ÀÚ¼¼ÇÑ ¼³¸íÀº ±× Áö½Ã¾î¿Í ´Ù¸¥ ¹®¹ýÀ» + Âü°íÇ϶ó.

    + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_ext_filter.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_ext_filter.html new file mode 100644 index 00000000..db5ac8ff --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_ext_filter.html @@ -0,0 +1,9 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_ext_filter.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: mod_ext_filter.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_ext_filter.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_ext_filter.html.en new file mode 100644 index 00000000..d57cec21 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_ext_filter.html.en @@ -0,0 +1,373 @@ + + + +mod_ext_filter - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_ext_filter

    +
    +

    Available Languages:  en  | + ko 

    +
    + + + +
    Description:Pass the response body through an external program before +delivery to the client
    Status:Extension
    Module Identifier:ext_filter_module
    Source File:mod_ext_filter.c
    +

    Summary

    + +

    mod_ext_filter presents a simple and familiar + programming model for filters. With + this module, a program which reads from stdin and writes to stdout + (i.e., a Unix-style filter command) can be a filter for + Apache. This filtering mechanism is much slower than using a + filter which is specially written for the Apache API and runs + inside of the Apache server process, but it does have the + following benefits:

    + +
      +
    • the programming model is much simpler
    • + +
    • any programming/scripting language can be used, provided + that it allows the program to read from standard input and + write to standard output
    • + +
    • existing programs can be used unmodified as Apache + filters
    • +
    + +

    Even when the performance characteristics are not suitable + for production use, mod_ext_filter can be used as + a prototype environment for filters.

    + +
    +

    Directives

    + +

    Topics

    +

    See also

    +
    +
    top
    +
    +

    Examples

    + +

    Generating HTML from some other type of response

    +

    + # mod_ext_filter directive to define a filter
    + # to HTML-ize text/c files using the external
    + # program /usr/bin/enscript, with the type of
    + # the result set to text/html
    + ExtFilterDefine c-to-html mode=output \
    + + intype=text/c outtype=text/html \
    + cmd="/usr/bin/enscript --color -W html -Ec -o - -"
    +
    +
    + <Directory "/export/home/trawick/apacheinst/htdocs/c">
    + + # core directive to cause the new filter to
    + # be run on output
    + SetOutputFilter c-to-html
    +
    + # mod_mime directive to set the type of .c
    + # files to text/c
    + AddType text/c .c
    +
    + # mod_ext_filter directive to set the debug
    + # level just high enough to see a log message
    + # per request showing the configuration in force
    + ExtFilterOptions DebugLevel=1
    +
    + </Directory> +

    + + +

    Implementing a content encoding filter

    +

    Note: this gzip example is just for the purposes of illustration. + Please refer to mod_deflate for a practical + implementation.

    + +

    + # mod_ext_filter directive to define the external filter
    + ExtFilterDefine gzip mode=output cmd=/bin/gzip
    +
    + <Location /gzipped>
    + + # core directive to cause the gzip filter to be
    + # run on output
    + SetOutputFilter gzip
    +
    + # mod_header directive to add
    + # "Content-Encoding: gzip" header field
    + Header set Content-Encoding gzip
    +
    + </Location> +

    + + +

    Slowing down the server

    +

    + # mod_ext_filter directive to define a filter
    + # which runs everything through cat; cat doesn't
    + # modify anything; it just introduces extra pathlength
    + # and consumes more resources
    + ExtFilterDefine slowdown mode=output cmd=/bin/cat \
    + + preservescontentlength
    +
    +
    + <Location />
    + + # core directive to cause the slowdown filter to
    + # be run several times on output
    + #
    + SetOutputFilter slowdown;slowdown;slowdown
    +
    + </Location> +

    + + +

    Using sed to replace text in the response

    +

    + # mod_ext_filter directive to define a filter which
    + # replaces text in the response
    + #
    + ExtFilterDefine fixtext mode=output intype=text/html \
    + + cmd="/bin/sed s/verdana/arial/g"
    +
    +
    + <Location />
    + + # core directive to cause the fixtext filter to
    + # be run on output
    + SetOutputFilter fixtext
    +
    + </Location> +

    + + +

    Tracing another filter

    +

    + # Trace the data read and written by mod_deflate
    + # for a particular client (IP 192.168.1.31)
    + # experiencing compression problems.
    + # This filter will trace what goes into mod_deflate.
    + ExtFilterDefine tracebefore \
    + + cmd="/bin/tracefilter.pl /tmp/tracebefore" \
    + EnableEnv=trace_this_client
    +
    +
    + # This filter will trace what goes after mod_deflate.
    + # Note that without the ftype parameter, the default
    + # filter type of AP_FTYPE_RESOURCE would cause the
    + # filter to be placed *before* mod_deflate in the filter
    + # chain. Giving it a numeric value slightly higher than
    + # AP_FTYPE_CONTENT_SET will ensure that it is placed
    + # after mod_deflate.
    + ExtFilterDefine traceafter \
    + + cmd="/bin/tracefilter.pl /tmp/traceafter" \
    + EnableEnv=trace_this_client ftype=21
    +
    +
    + <Directory /usr/local/docs>
    + + SetEnvIf Remote_Addr 192.168.1.31 trace_this_client
    + SetOutputFilter tracebefore;deflate;traceafter
    +
    + </Directory> +

    + +

    Here is the filter which traces the data:

    + #!/usr/local/bin/perl -w
    + use strict;
    +
    + open(SAVE, ">$ARGV[0]")
    + + or die "can't open $ARGV[0]: $?";
    +
    +
    + while (<STDIN>) {
    + + print SAVE $_;
    + print $_;
    +
    + }
    +
    + close(SAVE); +

    + +
    +
    top
    +

    ExtFilterDefine Directive

    + + + + + + +
    Description:Define an external filter
    Syntax:ExtFilterDefine filtername parameters
    Context:server config
    Status:Extension
    Module:mod_ext_filter
    +

    The ExtFilterDefine directive defines the + characteristics of an external filter, including the program to + run and its arguments.

    + +

    filtername specifies the name of the filter being + defined. This name can then be used in SetOutputFilter + directives. It must be unique among all registered filters. + At the present time, no error is reported by the + register-filter API, so a problem with duplicate names isn't + reported to the user.

    + +

    Subsequent parameters can appear in any order and define the + external command to run and certain other characteristics. The + only required parameter is cmd=. These parameters + are:

    + +
    +
    cmd=cmdline
    + +
    The cmd= keyword allows you to specify the + external command to run. If there are arguments after the + program name, the command line should be surrounded in + quotation marks (e.g., cmd="/bin/mypgm + arg1 arg2". Normal shell quoting is + not necessary since the program is run directly, bypassing the shell. + Program arguments are blank-delimited. A backslash can be used to + escape blanks which should be part of a program argument. Any + backslashes which are part of the argument must be escaped with + backslash themselves. In addition to the standard CGI environment + variables, DOCUMENT_URI, DOCUMENT_PATH_INFO, and + QUERY_STRING_UNESCAPED will also be set for the program.
    + +
    mode=mode
    + +
    mode should be output for now (the + default). In the future, mode=input will be used to + specify a filter for request bodies.
    + +
    intype=imt
    + +
    This parameter specifies the internet media type (i.e., + MIME type) of documents which should be filtered. By default, + all documents are filtered. If intype= is + specified, the filter will be disabled for documents of other + types.
    + +
    outtype=imt
    + +
    This parameter specifies the internet media type (i.e., + MIME type) of filtered documents. It is useful when the + filter changes the internet media type as part of the + filtering operation. By default, the internet media type is + unchanged.
    + +
    PreservesContentLength
    + +
    The PreservesContentLength keyword specifies + that the filter preserves the content length. This is not the + default, as most filters change the content length. In the + event that the filter doesn't modify the length, this keyword + should be specified.
    + +
    ftype=filtertype
    + +
    This parameter specifies the numeric value for filter type + that the filter should be registered as. The default value, + AP_FTYPE_RESOURCE, is sufficient in most cases. If the filter + needs to operate at a different point in the filter chain than + resource filters, then this parameter will be necessary. See + the AP_FTYPE_foo definitions in util_filter.h for appropriate + values.
    + +
    disableenv=env
    + +
    This parameter specifies the name of an environment variable + which, if set, will disable the filter.
    + +
    enableenv=env
    + +
    This parameter specifies the name of an environment variable + which must be set, or the filter will be disabled.
    +
    + +
    +
    top
    +

    ExtFilterOptions Directive

    + + + + + + + +
    Description:Configure mod_ext_filter options
    Syntax:ExtFilterOptions option [option] ...
    Default:ExtFilterOptions DebugLevel=0 NoLogStderr
    Context:directory
    Status:Extension
    Module:mod_ext_filter
    +

    The ExtFilterOptions directive specifies + special processing options for mod_ext_filter. + Option can be one of

    + +
    +
    DebugLevel=n
    + +
    + The DebugLevel keyword allows you to specify + the level of debug messages generated by + mod_ext_filter. By default, no debug messages + are generated. This is equivalent to + DebugLevel=0. With higher numbers, more debug + messages are generated, and server performance will be + degraded. The actual meanings of the numeric values are + described with the definitions of the DBGLVL_ constants + near the beginning of mod_ext_filter.c. + +

    Note: The core directive LogLevel should be used to cause debug messages to + be stored in the Apache error log.

    +
    + +
    LogStderr | NoLogStderr
    + +
    The LogStderr keyword specifies that + messages written to standard error by the external filter + program will be saved in the Apache error log. + NoLogStderr disables this feature.
    +
    + +

    Example

    + ExtFilterOptions LogStderr DebugLevel=0 +

    + +

    Messages written to the filter's standard error will be stored + in the Apache error log. No debug messages will be generated by + mod_ext_filter.

    + +
    +
    +
    +

    Available Languages:  en  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_ext_filter.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_ext_filter.html.ko.euc-kr new file mode 100644 index 00000000..b8d6ad9a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_ext_filter.html.ko.euc-kr @@ -0,0 +1,350 @@ + + + +mod_ext_filter - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    ¾ÆÆÄÄ¡ ¸ðµâ mod_ext_filter

    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + ko 

    +
    + + + +
    ¼³¸í:ÀÀ´ä ³»¿ëÀ» ¿ÜºÎ ÇÁ·Î±×·¥À¸·Î ó¸®ÇÑ ÈÄ Å¬¶óÀ̾ðÆ®·Î +º¸³½´Ù
    »óÅÂ:Extension
    ¸ðµâ¸í:ext_filter_module
    ¼Ò½ºÆÄÀÏ:mod_ext_filter.c
    +

    ¿ä¾à

    + +

    mod_ext_filter¸¦ »ç¿ëÇÏ¸é °£´ÜÇÏ°í Àͼ÷ÇÑ + ¹æ¹ýÀ¸·Î ÇÊÅ͸¦ ¸¸µé ¼ö ÀÖ´Ù. + Ç¥ÁØÀԷ¿¡¼­ Àаí Ç¥ÁØÃâ·Â¿¡ ¾²´Â ÇÁ·Î±×·¥(Áï, À¯´Ð½º½Ä + ÇÊÅÍ ¸í·É¾î)À» ¾ÆÆÄÄ¡ ÇÊÅÍ·Î »ç¿ëÇÒ ¼ö ÀÖ´Ù. ÀÌ·± ÇÊÅÍ´Â + ¾ÆÆÄÄ¡ API·Î ¾²¿©Áö°í ¾ÆÆÄÄ¡ ¼­¹ö ÇÁ·Î¼¼½º ¾È¿¡¼­ ½ÇÇàµÇ´Â + ÇÊÅÍ¿¡ ºñÇØ ¸Å¿ì ´À¸®Áö¸¸, ´ÙÀ½°ú °°Àº ÀåÁ¡ÀÌ ÀÖ´Ù:

    + +
      +
    • ÇÁ·Î±×·¡¹Ö ¸ðµ¨ÀÌ ¸Å¿ì °£´ÜÇÏ´Ù
    • + +
    • ÇÁ·Î±×·¥ÀÌ Ç¥ÁØÀԷ¿¡¼­ Àаí Ç¥ÁØÃâ·Â¿¡ ¾µ ¼ö¸¸ ÀÖ´Ù¸é + ¾î¶² ÇÁ·Î±×·¡¹Ö/½ºÅ©¸³Æ® ¾ð¾î¶óµµ »ç¿ëÇÒ ¼ö ÀÖ´Ù
    • + +
    • ÀÌ¹Ì ÀÖ´Â ÇÁ·Î±×·¥À» ¼öÁ¤¾øÀÌ ¾ÆÆÄÄ¡ ÇÊÅÍ·Î »ç¿ëÇÒ + ¼ö ÀÖ´Ù
    • +
    + +

    ½ÇÁ¦ »ç¿ëÇϱ⿡´Â ¼º´ÉÀÌ ¶³¾îÁöÁö¸¸, + mod_ext_filter¸¦ »ç¿ëÇÏ¿© ÇÊÅ͸¦ »¡¸® ¸¸µé¾îº¼ + ¼ö ÀÖ´Ù.

    + +
    +

    Áö½Ã¾îµé

    + +

    ÁÖÁ¦

    +

    Âü°í

    +
    +
    top
    +
    +

    ¿¹Á¦

    + +

    ´Ù¸¥ typeÀÇ ÀÀ´äÀ» HTML·Î ¸¸µç´Ù

    +

    + # mod_ext_filter Áö½Ã¾î¸¦ °¡Áö°í
    + # ¿ÜºÎ ÇÁ·Î±×·¥ /usr/bin/enscript¸¦ »ç¿ëÇÏ¿©
    + # ¹®¼­ÆÄÀÏ°ú text/c ÆÄÀÏÀ» HTML·Î ¸¸µé°í °á°úÀÇ
    + # typeÀ» text/html·Î º¯°æÇÏ´Â ÇÊÅ͸¦ Á¤ÀÇÇÑ´Ù
    + ExtFilterDefine c-to-html mode=output \
    + + intype=text/c outtype=text/html \
    + cmd="/usr/bin/enscript --color -W html -Ec -o - -"
    +
    +
    + <Directory "/export/home/trawick/apacheinst/htdocs/c">
    + + # Ãâ·Â¿¡ »õ·Î¿î ÇÊÅ͸¦ ½ÇÇàÇÏ´Â core Áö½Ã¾î
    + SetOutputFilter c-to-html
    +
    + # .c ÆÄÀÏÀÇ typeÀ» text/c·Î ¸¸µå´Â mod_mime
    + # Áö½Ã¾î
    + AddType text/c .c
    +
    + # µð¹ö±× ¼öÁØÀ» ³ô¿©¼­ ¿äû¸¶´Ù ÇöÀç ¼³Á¤À»
    + # ¾Ë·ÁÁÖ´Â ·Î±×¹®À» ±â·ÏÇÏ´Â mod_ext_filter
    + # Áö½Ã¾î
    + ExtFilterOptions DebugLevel=1
    +
    + </Directory> +

    + + +

    content ÀÎÄÚµù ÇÊÅÍ ±¸ÇöÇϱâ

    +

    Note: ¾Æ·¡ gzip ¿¹Á¦´Â ´ÜÁö ¼³¸íÀ» ¿¹·Î µç °ÍÀÌ´Ù. + ½ÇÁ¦ ¼­ºñ½º¿¡ »ç¿ëÇÏ·Á¸é mod_deflate¸¦ + Âü°íÇÏ±æ ¹Ù¶õ´Ù.

    + +

    + # ¿ÜºÎ ÇÊÅ͸¦ Á¤ÀÇÇÏ´Â mod_ext_filter Áö½Ã¾î
    + ExtFilterDefine gzip mode=output cmd=/bin/gzip
    +
    + <Location /gzipped>
    + + # Ãâ·ÂÇÒ¶§ gzip ÇÊÅ͸¦ ½ÇÇàÇÏ´Â core Áö½Ã¾î
    + SetOutputFilter gzip
    +
    + # "Content-Encoding: gzip" Çì´õ¸¦ Ãß°¡ÇÏ´Â
    + # mod_header Áö½Ã¾î
    + Header set Content-Encoding gzip
    +
    + </Location> +

    + + +

    ¼­¹ö¸¦ ´À¸®°Ô Çϱâ

    +

    + # catÀ¸·Î ¸ðµç ³»¿ëÀ» Åë°úÇÏ´Â ÇÊÅ͸¦ Á¤ÀÇÇÏ´Â
    + # mod_ext_filter Áö½Ã¾î; catÀº ¾Æ¹«°Íµµ ¼öÁ¤ÇÏÁö
    + # ¾Ê´Â´Ù; ´ÜÁö 󸮰æ·Î¸¦ ±æ°Ô ÇÏ¿© ÀÚ¿øÀ» ´õ ¼Ò¸ðÇÑ´Ù
    + ExtFilterDefine slowdown mode=output cmd=/bin/cat \
    + + preservescontentlength
    +
    +
    + <Location />
    + + # Ãâ·ÂÇÒ¶§ slowdown ÇÊÅ͸¦ ¿©·¯¹ø ½ÇÇàÇÏ´Â core Áö½Ã¾î
    + #
    + SetOutputFilter slowdown;slowdown;slowdown
    +
    + </Location> +

    + + +

    sed¸¦ »ç¿ëÇÏ¿© ÀÀ´ä¿¡¼­ ±ÛÀ» ´ëüÇϱâ

    +

    + # ÀÀ´ä¿¡¼­ ±ÛÀ» ´ëüÇÏ´Â ÇÊÅ͸¦ Á¤ÀÇÇÏ´Â
    + # mod_ext_filter Áö½Ã¾î
    + #
    + ExtFilterDefine fixtext mode=output intype=text/html \
    + + cmd="/bin/sed s/verdana/arial/g"
    +
    +
    + <Location />
    + + # Ãâ·ÂÇÒ¶§ fixtext ÇÊÅ͸¦ ½ÇÇàÇÏ´Â core Áö½Ã¾î
    + SetOutputFilter fixtext
    +
    + </Location> +

    + + +

    ´Ù¸¥ ÇÊÅ͸¦ ÃßÀûÇϱâ

    +

    + # ¾ÐÃà ¹®Á¦°¡ Àִ ƯÁ¤ Ŭ¶óÀ̾ðÆ®(IP 192.168.1.31)¿¡
    + # ´ëÇØ mod_deflate°¡ ÀÐ°í ¾²´Â ÀڷḦ ÃßÀûÇÑ´Ù.
    + # ÀÌ ÇÊÅÍ´Â mod_deflate·Î º¸³»±â Àü ÀڷḦ ÃßÀûÇÑ´Ù.
    + ExtFilterDefine tracebefore \
    + + cmd="/bin/tracefilter.pl /tmp/tracebefore" \
    + EnableEnv=trace_this_client
    +
    +
    + # ÀÌ ÇÊÅÍ´Â mod_deflate¿¡¼­ ³ª¿À´Â ÀڷḦ ÃßÀûÇÑ´Ù.
    + # ftype ÆĶó¹ÌÅ͸¦ »ç¿ëÇÏÁö¾Ê´Â °æ¿ì, ±âº» ÇÊÅÍÇü
    + # AP_FTYPE_RESOURCE´Â ÇÊÅÍ ¼ø¼­¸¦ mod_deflate *ÀÌÀü¿¡*
    + # µÐ´Ù. AP_FTYPE_CONTENT_SET º¸´Ù Á¶±Ý ³ôÀº ¼ýÀÚ°ªÀ»
    + # ÁöÁ¤Çϸé mod_deflate ÀÌÈÄ¿¡ ½ÇÇàÇÑ´Ù.
    + ExtFilterDefine traceafter \
    + + cmd="/bin/tracefilter.pl /tmp/traceafter" \
    + EnableEnv=trace_this_client ftype=21
    +
    +
    + <Directory /usr/local/docs>
    + + SetEnvIf Remote_Addr 192.168.1.31 trace_this_client
    + SetOutputFilter tracebefore;deflate;traceafter
    +
    + </Directory> +

    + +

    ´ÙÀ½Àº ÀڷḦ ÃßÀûÇÏ´Â ÇÊÅÍÀÌ´Ù:

    + #!/usr/local/bin/perl -w
    + use strict;
    +
    + open(SAVE, ">$ARGV[0]")
    + + or die "can't open $ARGV[0]: $?";
    +
    +
    + while (<STDIN>) {
    + + print SAVE $_;
    + print $_;
    +
    + }
    +
    + close(SAVE); +

    + +
    +
    top
    +

    ExtFilterDefine Áö½Ã¾î

    + + + + + + +
    ¼³¸í:¿ÜºÎ ÇÊÅ͸¦ Á¤ÀÇÇÑ´Ù
    ¹®¹ý:ExtFilterDefine filtername parameters
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤
    »óÅÂ:Extension
    ¸ðµâ:mod_ext_filter
    +

    ExtFilterDefine Áö½Ã¾î´Â ¿ÜºÎ + ÇÊÅÍÀÇ ¼ºÁú°ú ½ÇÇàÇÒ ÇÁ·Î±×·¥, ¾Æ±Ô¸ÕÆ®¸¦ Á¤ÀÇÇÑ´Ù.

    + +

    filternameÀº Á¤ÀÇÇÒ ÇÊÅÍ À̸§À» ÁöÁ¤ÇÑ´Ù. + ÀÌ À̸§À» SetOutputFilter Áö½Ã¾î¿¡¼­ »ç¿ëÇÑ´Ù. µî·ÏÇÑ ¸ðµç + ÇÊÅ͵鰣¿¡ À̸§ÀÌ °ãÄ¡¸é ¾ÈµÈ´Ù. ÇöÀç ÇÊÅ͵î·Ï API´Â + ¿À·ù¸¦ º¸°íÇÏÁö ¾Ê´Â´Ù. ±×·¡¼­ »ç¿ëÀÚ´Â À̸§ÀÌ °ãÄ¡´Â ¹®Á¦¸¦ + ¾ËÁö ¸øÇÑ´Ù.

    + +

    ½ÇÇàÇÒ ¿ÜºÎ ¸í·É¾î¿Í ´Ù¸¥ ¼ºÁúÀ» Á¤ÀÇÇÏ´Â ³ª¸ÓÁö ¾Æ±Ô¸ÕÆ®´Â + ¾î¶² ¼ø¼­·Î ³ª¿Íµµ °¡´ÉÇÏ´Ù. ´Ü, cmd= ÆĶó¹ÌÅÍ´Â + ¹Ýµå½Ã ÇÊ¿äÇÏ´Ù. »ç¿ëÇÒ ¼ö ÀÖ´Â ÆĶó¹ÌÅÍ´Â ´ÙÀ½°ú °°´Ù:

    + +
    +
    cmd=cmdline
    + +
    cmd= Å°¿öµå´Â ½ÇÇàÇÒ ¿ÜºÎ ¸í·É¾î¸¦ ÁöÁ¤ÇÑ´Ù. + ÇÁ·Î±×·¥¸í µÚ¿¡ ¾Æ±Ô¸ÕÆ®°¡ ÀÖ´Ù¸é ¸í·ÉÇàÀ» ½Öµû¿ÈÇ¥·Î + ¹­¾î¾ß ÇÑ´Ù (¿¹¸¦ µé¾î, + cmd="/bin/mypgm arg1 + arg2"). ½©À» °ÅÄ¡Áö¾Ê°í Á÷Á¢ ÇÁ·Î±×·¥À» + ½ÇÇàÇϱ⶧¹®¿¡ ÀϹÝÀûÀÎ ½© µû¿ÈÇ¥´Â ÇÊ¿ä¾ø´Ù. ÇÁ·Î±×·¥ + ¾Æ±Ô¸ÕÆ®µéÀº °ø¹éÀ¸·Î ±¸ºÐÇÑ´Ù. ÇÁ·Î±×·¥ ¾Æ±Ô¸ÕÆ®¿¡ °ø¹éÀÌ + ÀÖ´Ù¸é °ø¹é ¾Õ¿¡ ¹é½½·¡½¬·Î »ç¿ëÇØ¾ß ÇÑ´Ù. ¹é½½·¡½¬°¡ + ¾Æ±Ô¸ÕÆ®ÀÇ ÀϺζó¸é ¹é½½·¡½¬¸¦ µÎ¹ø »ç¿ëÇØ¾ß ÇÑ´Ù. ÇÁ·Î±×·¥À» + ½ÇÇàÇÒ¶§ Ç¥ÁØ CGI ȯ°æº¯¼ö¿Í Ãß°¡·Î DOCUMENT_URI, + DOCUMENT_PATH_INFO, QUERY_STRING_UNESCAPED º¯¼ö¸¦ ¼³Á¤ÇÑ´Ù.
    + +
    mode=mode
    + +
    mode´Â ÇöÀç (±âº»°ªÀÎ) output¸¸ + °¡´ÉÇÏ´Ù. ¹Ì·¡¿¡´Â mode=inputÀ» »ç¿ëÇÏ¿© + ¿äû ³»¿ëÀ» ó¸®ÇÏ´Â ÇÊÅ͸¦ ÁöÁ¤ÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.
    + +
    intype=imt
    + +
    ÀÌ ÆĶó¹ÌÅÍ´Â ÇÊÅͷΠó¸®ÇÒ ¹®¼­ÀÇ ÀÎÅÍ³Ý media + type(Áï, MIME type)À» ÁöÁ¤ÇÑ´Ù. ±âº»ÀûÀ¸·Î ¸ðµç + ¹®¼­¸¦ ÇÊÅͷΠó¸®ÇÑ´Ù. intype=À» ÁöÁ¤Çϸé + ´Ù¸¥ typeÀÇ ¹®¼­´Â ÇÊÅͷΠó¸®ÇÏÁö ¾Ê´Â´Ù.
    + +
    outtype=imt
    + +
    ÀÌ ÆĶó¹ÌÅÍ´Â ÇÊÅͷΠó¸®ÇÑ ¹®¼­ÀÇ ÀÎÅÍ³Ý media + type(Áï, MIME type)À» ÁöÁ¤ÇÑ´Ù. ÇÊÅÍó¸® ÀÛ¾÷Áß¿¡ + ÀÎÅÍ³Ý media typeÀ» º¯°æÇÒ¶§ À¯¿ëÇÏ´Ù. ±âº»ÀûÀ¸·Î, ÀÎÅÍ³Ý + media typeÀº º¯ÇÏÁö ¾Ê´Â´Ù.
    + +
    PreservesContentLength
    + +
    PreservesContentLength Å°¿öµå´Â ÇÊÅÍ°¡ + content length¸¦ À¯ÁöÇϵµ·Ï ÇÑ´Ù. ´ëºÎºÐÀÇ ÇÊÅÍ°¡ content + length¸¦ º¯°æÇϹǷΠÀÌ Å°¿öµå´Â ±âº»°ªÀÌ ¾Æ´Ï´Ù. ÇÊÅÍ°¡ + ±æÀ̸¦ À¯ÁöÇÒ¶§¸¸ ÀÌ Å°¿öµå¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù.
    + +
    ftype=filtertype
    + +
    ÀÌ ÆĶó¹ÌÅÍ´Â ÇÊÅÍ Á¾·ù¿¡ ´ëÇÑ ¼ýÀÚ°ªÀ» ÁöÁ¤ÇÑ´Ù. + ´ëºÎºÐÀÇ °æ¿ì ±âº»°ªÀÎ AP_FTYPE_RESOURCE°¡ Àû´çÇÏ´Ù. + ÇÊÅ͸¦ ½ÇÇàÇÏ´Â ¼ø¼­°¡ ÀÚ¿øÇÊÅÍ¿Í ´Þ¶ó¾ßÇÏ´Â °æ¿ì ÀÌ + ÆĶó¹ÌÅÍ°¡ ÇÊ¿äÇÏ´Ù. Àû´çÇÑ °ªÀ» ¾Ë·Á¸é util_filter.h¿¡ + ÀÖ´Â AP_FTYPE_* Á¤ÀǸ¦ Âü°íÇ϶ó.
    + +
    disableenv=env
    + +
    ÀÌ ÆĶó¹ÌÅÍ·Î ¼³Á¤ÇÑ È¯°æº¯¼ö°¡ Á¤ÀǵǾú´Ù¸é ÇÊÅ͸¦ + »ç¿ëÇÏÁö ¾Ê´Â´Ù.
    + +
    enableenv=env
    + +
    ÀÌ ÆĶó¹ÌÅÍ·Î ¼³Á¤ÇÑ È¯°æº¯¼ö°¡ Á¤ÀÇµÈ °æ¿ì ÇÊÅ͸¦ + »ç¿ëÇÑ´Ù.
    +
    + +
    +
    top
    +

    ExtFilterOptions Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:mod_ext_filter ¿É¼ÇÀ» ¼³Á¤ÇÑ´Ù
    ¹®¹ý:ExtFilterOptions option [option] ...
    ±âº»°ª:ExtFilterOptions DebugLevel=0 NoLogStderr
    »ç¿ëÀå¼Ò:directory
    »óÅÂ:Extension
    ¸ðµâ:mod_ext_filter
    +

    ExtFilterOptions Áö½Ã¾î´Â + mod_ext_filterÀÇ Æ¯º°ÇÑ Ã³¸®¿É¼ÇÀ» ÁöÁ¤ÇÑ´Ù. + OptionÀº ´ÙÀ½Áß Çϳª´Ù.

    + +
    +
    DebugLevel=n
    + +
    + DebugLevel Å°¿öµå´Â + mod_ext_filter°¡ ±â·ÏÇÏ´Â µð¹ö±× ¹®±¸ + ¼öÁØÀ» Á¤ÇÑ´Ù. ±âº»°ªÀº µð¹ö±×¹®À» ±â·ÏÇÏÁö ¾Ê´Â´Ù. + ÀÌ´Â DebugLevel=0°ú °°´Ù. ³ôÀº ¼ýÀÚ¸¦ + »ç¿ëÇÒ¼ö·Ï, ´õ ¸¹Àº µð¹ö±×¹®ÀÌ ±â·ÏµÇ°í ¼­¹ö ¼º´ÉÀÌ + ¶³¾îÁø´Ù. ¼ýÀÚ°ªÀÇ ½ÇÁ¦ Àǹ̴ mod_ext_filter.c + ¾ÕºÎºÐ¿¡ ÀÖ´Â DBGLVL_ »ó¼ö Á¤ÀÇ¿¡ ¼³¸íµÇÀÖ´Ù. + +

    ÁÖÀÇ: ÇÊÅÍ ·Î±×¸¦ ±â·ÏÇÏ·Á¸é core Áö½Ã¾î LogLevelÀ» »ç¿ëÇÏ¿© µð¹ö±×¹®À» + ¾ÆÆÄÄ¡ ¿À·ù·Î±×¿¡ ±â·ÏÇØ¾ß ÇÑ´Ù.

    +
    + +
    LogStderr | NoLogStderr
    + +
    LogStderr Å°¿öµå´Â ¿ÜºÎ ÇÊÅÍ ÇÁ·Î±×·¥ÀÌ + Ç¥ÁØ¿À·ù·Î Ãâ·ÂÇÏ´Â ¹®±¸¸¦ ¾ÆÆÄÄ¡ ¿À·ù·Î±×¿¡ ±â·ÏÇÑ´Ù. + NoLogStderr´Â ÀÌ ±â´ÉÀ» ÇÏÁö ¾Ê´Â´Ù.
    +
    + +

    ¿¹Á¦

    + ExtFilterOptions LogStderr DebugLevel=0 +

    + +

    À§ÀÇ ¼³Á¤À» »ç¿ëÇϸé ÇÊÅÍ°¡ Ç¥ÁØ¿À·ù·Î Ãâ·ÂÇÏ´Â ¹®±¸¸¦ + ¾ÆÆÄÄ¡ ¿À·ù·Î±×¿¡ ±â·ÏÇÏ°í, mod_ext_filter´Â + ÀÚü µð¹ö±×¹®À» ±â·ÏÇÏÁö ¾Ê´Â´Ù.

    + +
    +
    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_file_cache.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_file_cache.html new file mode 100644 index 00000000..e9da936d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_file_cache.html @@ -0,0 +1,9 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_file_cache.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: mod_file_cache.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_file_cache.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_file_cache.html.en new file mode 100644 index 00000000..7dcc1d2b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_file_cache.html.en @@ -0,0 +1,212 @@ + + + +mod_file_cache - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_file_cache

    +
    +

    Available Languages:  en  | + ko 

    +
    + + + +
    Description:Caches a static list of files in memory
    Status:Experimental
    Module Identifier:file_cache_module
    Source File:mod_file_cache.c
    +

    Summary

    + + +
    + This module should be used with care. You can easily create a broken + site using mod_file_cache, so read this document + carefully. +
    + +

    Caching frequently requested files that change very + infrequently is a technique for reducing server load. + mod_file_cache provides two techniques for caching + frequently requested static files. Through configuration + directives, you can direct mod_file_cache to either + open then mmap() a file, or to pre-open a file and save + the file's open file handle. Both techniques reduce server + load when processing requests for these files by doing part of the work + (specifically, the file I/O) for serving the file when the + server is started rather than during each request.

    + +

    Notice: You cannot use this for speeding up CGI programs or + other files which are served by special content handlers. It + can only be used for regular files which are usually served by + the Apache core content handler.

    + +

    This module is an extension of and borrows heavily from the + mod_mmap_static module in Apache 1.3.

    +
    +

    Directives

    + +

    Topics

    +
    +
    top
    +
    +

    Using mod_file_cache

    + +

    mod_file_cache caches a list of statically + configured files via MMapFile or CacheFile directives in the main server configuration.

    + +

    Not all platforms support both directives. For example, Apache + on Windows does not currently support the MMapStatic directive, while + other platforms, like AIX, support both. You will receive an error + message in the server error log if you attempt to use an + unsupported directive. If given an unsupported directive, the + server will start but the file will not be cached. On platforms + that support both directives, you should experiment with both to + see which works best for you.

    + +

    MMapFile Directive

    + +

    The MMapFile + directive of mod_file_cache maps a list of + statically configured files into memory through the system call + mmap(). This system call is available on most modern + Unix derivates, but not on all. There are sometimes system-specific + limits on the size and number of files that can be + mmap()ed, experimentation is probably the easiest way + to find out.

    + +

    This mmap()ing is done once at server start or + restart, only. So whenever one of the mapped files changes on the + filesystem you have to restart the server (see the Stopping and Restarting documentation). + To reiterate that point: if the files are modified in place + without restarting the server you may end up serving requests that + are completely bogus. You should update files by unlinking the old + copy and putting a new copy in place. Most tools such as + rdist and mv do this. The reason why this + modules doesn't take care of changes to the files is that this check + would need an extra stat() every time which is a waste + and against the intent of I/O reduction.

    + + +

    CacheFile Directive

    + +

    The CacheFile + directive of mod_file_cache opens an active + handle or file descriptor to the file (or files) + listed in the configuration directive and places these open file + handles in the cache. When the file is requested, the server + retrieves the handle from the cache and passes it to the + sendfile() (or TransmitFile() on Windows), + socket API.

    + + + +

    This file handle caching is done once at server start or + restart, only. So whenever one of the cached files changes on + the filesystem you have to restart the server (see the + Stopping and Restarting + documentation). To reiterate that point: if the files are + modified in place without restarting the server you + may end up serving requests that are completely bogus. You + should update files by unlinking the old copy and putting a new + copy in place. Most tools such as rdist and + mv do this.

    + + +

    Note

    +

    Don't bother asking for a directive which recursively + caches all the files in a directory. Try this instead... See the + Include directive, and consider + this command:

    + +

    + find /www/htdocs -type f -print \
    + | sed -e 's/.*/mmapfile &/' > /www/conf/mmap.conf +

    +
    +
    +
    top
    +

    CacheFile Directive

    + + + + + + +
    Description:Cache a list of file handles at startup time
    Syntax:CacheFile file-path [file-path] ...
    Context:server config
    Status:Experimental
    Module:mod_file_cache
    +

    The CacheFile directive opens handles to + one or more files (given as whitespace separated arguments) and + places these handles into the cache at server startup + time. Handles to cached files are automatically closed on a server + shutdown. When the files have changed on the filesystem, the + server should be restarted to to re-cache them.

    + +

    Be careful with the file-path arguments: They have + to literally match the filesystem path Apache's URL-to-filename + translation handlers create. We cannot compare inodes or other + stuff to match paths through symbolic links etc. + because that again would cost extra stat() system + calls which is not acceptable. This module may or may not work + with filenames rewritten by mod_alias or + mod_rewrite.

    + +

    Example

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

    + +
    +
    top
    +

    MMapFile Directive

    + + + + + + +
    Description:Map a list of files into memory at startup time
    Syntax:MMapFile file-path [file-path] ...
    Context:server config
    Status:Experimental
    Module:mod_file_cache
    +

    The MMapFile directive maps one or more files + (given as whitespace separated arguments) into memory at server + startup time. They are automatically unmapped on a server + shutdown. When the files have changed on the filesystem at + least a HUP or USR1 signal should be send to + the server to re-mmap() them.

    + +

    Be careful with the file-path arguments: They have + to literally match the filesystem path Apache's URL-to-filename + translation handlers create. We cannot compare inodes or other + stuff to match paths through symbolic links etc. + because that again would cost extra stat() system + calls which is not acceptable. This module may or may not work + with filenames rewritten by mod_alias or + mod_rewrite.

    + +

    Example

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

    + +
    +
    +
    +

    Available Languages:  en  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_file_cache.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_file_cache.html.ko.euc-kr new file mode 100644 index 00000000..851f202b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_file_cache.html.ko.euc-kr @@ -0,0 +1,200 @@ + + + +mod_file_cache - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    ¾ÆÆÄÄ¡ ¸ðµâ mod_file_cache

    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + ko 

    +
    + + + +
    ¼³¸í:¸Þ¸ð¸®¿¡ Á¤Àû ÆÄÀϵéÀ» ij½¬
    »óÅÂ:Experimental
    ¸ðµâ¸í:file_cache_module
    ¼Ò½ºÆÄÀÏ:mod_file_cache.c
    +

    ¿ä¾à

    + + +
    + ÀÌ ¸ðµâÀº Á¶½ÉÇؼ­ »ç¿ëÇØ¾ß ÇÑ´Ù. mod_file_cache¸¦ + »ç¿ëÇÏ¿© »çÀÌÆ®¸¦ ¾û¸ÁÀ¸·Î ¸¸µé±â ½±±â¶§¹®¿¡ ÀÌ ¹®¼­¸¦ + ²Ä²ÄÈ÷ ÀÐ±æ ¹Ù¶õ´Ù. +
    + +

    °ÅÀÇ º¯ÇÏÁö ¾Ê°í ÀÚÁÖ ¿äûµÇ´Â ÆÄÀÏÀ» ij½¬¿¡ + ÀúÀåÇÏ¿© ¼­¹ö ºÎÇϸ¦ ÁÙÀÏ ¼ö ÀÖ´Ù. mod_file_cache´Â + ÀÚÁÖ ¿äûµÇ´Â Á¤Àû ÆÄÀÏÀ» µÎ°¡Áö ¹æ½ÄÀ¸·Î ij½¬¿¡ + ÀúÀåÇÑ´Ù. ¼³Á¤ Áö½Ã¾î¸¦ »ç¿ëÇÏ¿© mod_file_cache°¡ + ÆÄÀÏÀ» ¿­°í(open) mmap()ÇÒÁö ¾Æ´Ï¸é ÆÄÀÏÀ» + ¿­°í ÆÄÀÏ ÇÚµéÀ» ÀúÀåÇÒÁö °áÁ¤ÇÑ´Ù. µÎ ¹æ½Ä ¸ðµÎ + ÆÄÀÏÀ» ¼­ºñ½ºÇϱâÀ§ÇØ ÇÊ¿äÇÑ ÀÛ¾÷ÀÇ ÀϺθ¦ (ƯÈ÷ ÆÄÀÏ ÀÔÃâ·Â + ÀÛ¾÷) ÆÄÀÏÀ» ¿äûÇÒ ¶§¸¶´Ù ¸Å¹ø ÇÏ´Â ´ë½Å ¼­¹ö°¡ ½ÃÀÛÇÒ¶§ + Çѹø¸¸ ÇÏ¿© ¼­¹ö ºÎÇÏ°¡ °¨¼ÒÇÑ´Ù.

    + +

    ÁÖÀÇ: ÀÌ ¹æ¹ýÀº CGI ÇÁ·Î±×·¥À̳ª Ưº°ÇÑ ³»¿ëÇڵ鷯¸¦ + ÅëÇØ ¼­ºñ½ºÇÏ´Â ÆÄÀÏÀÇ ¼­ºñ½º ¼Óµµ¸¦ ³ôÀÏ ¼ö ¾ø´Ù. ÀÌ ¹æ¹ýÀº + º¸Åë ¾ÆÆÄÄ¡ core ³»¿ëÇڵ鷯°¡ ¼­ºñ½ºÇÏ´Â ÀϹÝÆÄÀÏ¿¡¸¸ + Àû¿ëµÈ´Ù.

    + +

    ÀÌ ¸ðµâÀº ¾ÆÆÄÄ¡ 1.3¿¡ ÀÖ´Â mod_mmap_static + ¸ðµâÀÇ ±â´ÉÀ» È®ÀåÇÑ °á°ú´Ù.

    +
    +

    Áö½Ã¾îµé

    + +

    ÁÖÁ¦

    +
    +
    top
    +
    +

    mod_file_cache »ç¿ëÇϱâ

    + +

    mod_file_cache´Â ÁÖ¼­¹ö ¼³Á¤¿¡¼­ MMapFile°ú CacheFile Áö½Ã¾î¸¦ »ç¿ëÇÏ¿© + ¼³Á¤ÇÑ Á¤Àû ÆÄÀϵéÀ» ij½¬¿¡ ÀúÀåÇÑ´Ù.

    + +

    ¸ðµç Ç÷¡ÆûÀÌ µÎ Áö½Ã¾î¸¦ ¸ðµÎ Áö¿øÇÏ´Â °ÍÀº ¾Æ´Ï´Ù. + ¿¹¸¦ µé¾î, À©µµ¿ìÁî¿ë ¾ÆÆÄÄ¡´Â ÇöÀç MMapStatic Áö½Ã¾î¸¦ + Áö¿øÇÏÁö ¾ÊÁö¸¸, AIX °°Àº ´Ù¸¥ Ç÷¡ÆûÀº µÑ ¸ðµÎ¸¦ Áö¿øÇÑ´Ù. + Áö¿øÇÏÁö¾Ê´Â Áö½Ã¾î¸¦ »ç¿ëÇÒ °æ¿ì ¼­¹ö ¿À·ù ·Î±×¿¡ ¿À·ù¹®À» + ³²±ä´Ù. Áö¿øÇÏÁö¾Ê´Â Áö½Ã¾î¸¦ »ç¿ëÇصµ ¼­¹ö´Â µ¿ÀÛÇÏÁö¸¸ + ÆÄÀÏÀ» ij½¬¿¡ ÀúÀåÇÏÁö ¾Ê´Â´Ù. µÎ Áö½Ã¾î¸¦ ¸ðµÎ Áö¿øÇÏ´Â + Ç÷¡ÆûÀ» »ç¿ëÇÑ´Ù¸é ¾î¶² ¹æ½ÄÀÌ ´õ ÁÁÀºÁö ½ÇÇèÇغ¸¶ó.

    + +

    MMapFile Áö½Ã¾î

    + +

    mod_file_cacheÀÇ MMapFile Áö½Ã¾î´Â + ¼³Á¤ÇÑ Á¤Àû ÆÄÀϵéÀ» mmap() ½Ã½ºÅÛÈ£ÃâÀ» + »ç¿ëÇÏ¿© ¸Þ¸ð¸®¿¡ ´ëÀÀÇÑ´Ù. ÃֽŠÀ¯´Ð½º·ù ¿î¿µÃ¼Á¦¶ó¸é + º¸Åë ÀÌ ½Ã½ºÅÛÈ£ÃâÀÌ ÀÖÁö¸¸, ¾ø´Â ¿î¿µÃ¼Á¦µµ ÀÖ´Ù. ¶Ç, + mmap()ÇÒ ¼ö ÀÖ´Â ÆÄÀÏ Å©±â¿Í °³¼ö¸¦ ½Ã½ºÅÛÀÌ + Á¦ÇÑÇÒ ¼ö ÀÖÀ¸¹Ç·Î ¹Ì¸® ½ÇÇèÇغ¸´Â °ÍÀÌ ÁÁ´Ù.

    + +

    ¼­¹ö´Â ½ÃÀÛÇÒ¶§¿Í Àç½ÃÀÛÇÒ¶§¸¸ mmap()ÇÑ´Ù. + ±×·¡¼­ ÆÄÀϽýºÅÛ¿¡¼­ ÇØ´ç ÆÄÀÏÁß Çϳª¶óµµ º¯°æµÇ¸é ¼­¹ö¸¦ + Àç½ÃÀÛÇØ¾ß ÇÑ´Ù (Áß´Ü°ú + Àç½ÃÀÛ ¹®¼­ Âü°í). ´Ù½Ã ¸»Çؼ­ ÆÄÀÏÀÌ º¯°æµÇ¾ú´Âµ¥ + ¼­¹ö¸¦ Àç½ÃÀÛÇÏÁö ¾ÊÀ¸¸é ¿ÏÀüÈ÷ ÀÌ»óÇÏ°Ô ¿äûÀ» ¼­ºñ½ºÇÒÁöµµ + ¸ð¸¥´Ù. ÀÌÀü ÆÄÀÏÀ» Áö¿ì°í(unlink) ±× ÀÚ¸®¿¡ »õ·Î¿î ÆÄÀÏÀ» + ¸¸µé´Â ¹æ½ÄÀ¸·Î ÆÄÀÏÀ» ¼öÁ¤ÇØ¾ß ÇÑ´Ù. rdist³ª + mv¿Í °°Àº ´ë´Ù¼öÀÇ µµ±¸°¡ ÀÌ·± ¹æ½ÄÀ¸·Î µ¿ÀÛÇÑ´Ù. + ¸Å¹ø Ãß°¡·Î ºÒÇÊ¿äÇÑ stat() °Ë»ç°¡ ÇÊ¿äÇÏ°í + ÀÔÃâ·Â °¨¼Ò¶ó´Â ¿ø·¡ Àǵµ¿¡ ¹ÝÇϱ⶧¹®¿¡ ÀÌ ¸ðµâÀº ÆÄÀÏÀÇ + º¯È­¸¦ ¹«½ÃÇÑ´Ù.

    + + +

    CacheFile Áö½Ã¾î

    + +

    mod_file_cacheÀÇ CacheFile Áö½Ã¾î´Â + ¼³Á¤ Áö½Ã¾î¿¡ ¿­°ÅÇÑ ÆÄÀÏ(°ú ÆÄÀϵé)À» ¿­¾î¼­ ÆÄÀÏÀÇ + ÇÚµé(handle) ȤÀº ÆÄÀÏ ±â¼úÀÚ(file descriptor)¸¦ + ij½¬¿¡ ÀúÀåÇÑ´Ù. ÆÄÀÏÀ» ¿äûÇÏ¸é ¼­¹ö´Â ij½¬¿¡¼­ ÇÚµéÀ» + ã¾Æ¼­ ¼ÒÄÏ API sendfile()¿¡ (À©µµ¿ìÁî¿¡¼­´Â + TransmitFile()) ³Ñ±ä´Ù.

    + + + +

    ¼­¹ö´Â ½ÃÀÛÇÒ¶§¿Í Àç½ÃÀÛÇÒ¶§¸¸ ÆÄÀÏ ÇÚµéÀ» ij½¬ÇÑ´Ù. + ±×·¡¼­ ÆÄÀϽýºÅÛ¿¡¼­ ij½¬ÇÑ ÆÄÀÏÁß Çϳª¶óµµ º¯°æµÇ¸é + ¼­¹ö¸¦ Àç½ÃÀÛÇØ¾ß ÇÑ´Ù (Áß´Ü°ú Àç½ÃÀÛ ¹®¼­ Âü°í). + ´Ù½Ã ¸»Çؼ­ ÆÄÀÏÀÌ º¯°æµÇ¾ú´Âµ¥ ¼­¹ö¸¦ Àç½ÃÀÛÇÏÁö ¾ÊÀ¸¸é + ¿ÏÀüÈ÷ ÀÌ»óÇÏ°Ô ¿äûÀ» ¼­ºñ½ºÇÒÁöµµ ¸ð¸¥´Ù. ÀÌÀü ÆÄÀÏÀ» + Áö¿ì°í(unlink) ±× ÀÚ¸®¿¡ »õ·Î¿î ÆÄÀÏÀ» ¸¸µå´Â ¹æ½ÄÀ¸·Î + ÆÄÀÏÀ» ¼öÁ¤ÇØ¾ß ÇÑ´Ù. rdist³ª mv¿Í + °°Àº ´ë´Ù¼öÀÇ µµ±¸°¡ ÀÌ·± ¹æ½ÄÀ¸·Î µ¿ÀÛÇÑ´Ù.

    + + +

    ÁÖÀÇ

    +

    µð·ºÅ丮ÀÇ ¸ðµç ÆÄÀÏÀ» Àç±ÍÀûÀ¸·Î ij½¬¿¡ ÀúÀåÇÏ´Â Áö½Ã¾î´Â + ¾ø´Ù. ´ë½Å ´ÙÀ½°ú °°ÀÌ Çغ¸¶ó... Include Áö½Ã¾î¸¦ Âü°íÇÏ¿© ´ÙÀ½°ú + °°Àº ¸í·É¾î¸¦ ½ÇÇàÇÑ´Ù:

    + +

    + find /www/htdocs -type f -print \
    + | sed -e 's/.*/mmapfile &/' > /www/conf/mmap.conf +

    +
    +
    +
    top
    +

    CacheFile Áö½Ã¾î

    + + + + + + +
    ¼³¸í:½ÃÀ۽à ¿©·¯ ÆÄÀÏ ÇÚµéÀ» ij½¬ÇÑ´Ù
    ¹®¹ý:CacheFile file-path [file-path] ...
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤
    »óÅÂ:Experimental
    ¸ðµâ:mod_file_cache
    +

    CacheFile Áö½Ã¾î´Â ¼­¹ö°¡ ½ÃÀÛÇÒ¶§ + ¿©·¯ ÆÄÀÏÀ» ¿­°í(open) ÆÄÀϵéÀÇ ÇÚµéÀ» ij½¬¿¡ ÀúÀåÇÑ´Ù. + ¼­¹ö Á¾·á½Ã ÀÚµ¿À¸·Î ij½¬ÇÑ ÆÄÀÏÀÇ ÇÚµéÀ» ´Ý´Â´Ù(close). + ÆÄÀϽýºÅÛ¿¡¼­ ÆÄÀÏÀÌ º¯°æµÇ¸é ÆÄÀÏÀ» ´Ù½Ã ij½¬ÇϱâÀ§ÇØ + ¼­¹ö¸¦ Àç½ÃÀÛÇØ¾ß ÇÑ´Ù.

    + +

    file-path ¾Æ±Ô¸ÕÆ®¸¦ Á¶½ÉÇضó. ¾Æ±Ô¸ÕÆ®´Â + ¾ÆÆÄÄ¡ÀÇ URL-ÆÄÀÏ¸í º¯È¯ Çڵ鷯°¡ ¸¸µç ÆÄÀϽýºÅÛ °æ·Î¿Í + Á¤È®È÷ ÀÏÄ¡ÇØ¾ß ÇÑ´Ù. Çѹø ´õ ºÒÇÊ¿äÇÑ stat() + ½Ã½ºÅÛÈ£ÃâÀÌ ÇÊ¿äÇϱ⶧¹®¿¡ inode³ª ½Éº¼¸µÅ© µîÀ» + °æ·Î¸¦ ÁöÁ¤ÇÒ ¼ö ¾ø´Ù. ÀÌ ¸ðµâÀº mod_alias³ª + mod_rewrite·Î ÀçÀÛ¼ºÇÑ ÆÄÀϸíÀ» ´Ù·ê ¼ö + Àֱ⵵ ¾ø±âµµ ÇÏ´Ù.

    + +

    ¿¹Á¦

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

    + +
    +
    top
    +

    MMapFile Áö½Ã¾î

    + + + + + + +
    ¼³¸í:½ÃÀ۽à ¿©·¯ ÆÄÀÏÀ» ¸Þ¸ð¸®¿¡ ´ëÀÀÇÑ´Ù
    ¹®¹ý:MMapFile file-path [file-path] ...
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤
    »óÅÂ:Experimental
    ¸ðµâ:mod_file_cache
    +

    MMapFile Áö½Ã¾î´Â ¼­¹ö°¡ ½ÃÀÛÇÒ¶§ + (°ø¹éÀ¸·Î ±¸ºÐÇÑ ¾Æ±Ô¸ÕÆ®·Î ÁöÁ¤ÇÑ) ¿©·¯ ÆÄÀÏÀ» ¸Þ¸ð¸®¿¡ + ´ëÀÀÇÑ´Ù(map). ¼­¹ö Á¾·á½Ã ÀÚµ¿À¸·Î ´ëÀÀÀ» Ǭ´Ù(unmap). + ÆÄÀϽýºÅÛ¿¡¼­ ÆÄÀÏÀÌ º¯°æµÇ¸é ÆÄÀϵéÀ» ´Ù½Ã + mmap()ÇϱâÀ§ÇØ ÃÖ¼ÒÇÑ ¼­¹ö¿¡ HUPÀ̳ª + USR1 ½Ã±×³ÎÀ» º¸³»¾ß ÇÑ´Ù.

    + +

    file-path ¾Æ±Ô¸ÕÆ®¸¦ Á¶½ÉÇضó. ¾Æ±Ô¸ÕÆ®´Â + ¾ÆÆÄÄ¡ÀÇ URL-ÆÄÀÏ¸í º¯È¯ Çڵ鷯°¡ ¸¸µç ÆÄÀϽýºÅÛ °æ·Î¿Í + Á¤È®È÷ ÀÏÄ¡ÇØ¾ß ÇÑ´Ù. Çѹø ´õ ºÒÇÊ¿äÇÑ stat() + ½Ã½ºÅÛÈ£ÃâÀÌ ÇÊ¿äÇϱ⶧¹®¿¡ inode³ª ½Éº¼¸µÅ© µîÀ» + °æ·Î¸¦ ÁöÁ¤ÇÒ ¼ö ¾ø´Ù. ÀÌ ¸ðµâÀº mod_alias³ª + mod_rewrite·Î ÀçÀÛ¼ºÇÑ ÆÄÀϸíÀ» ´Ù·ê ¼ö + Àֱ⵵ ¾ø±âµµ ÇÏ´Ù.

    + +

    ¿¹Á¦

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

    + +
    +
    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_headers.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_headers.html new file mode 100644 index 00000000..1e425039 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_headers.html @@ -0,0 +1,9 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_headers.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: mod_headers.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_headers.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_headers.html.en new file mode 100644 index 00000000..625f3aa7 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_headers.html.en @@ -0,0 +1,323 @@ + + + +mod_headers - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_headers

    +
    +

    Available Languages:  en  | + ko 

    +
    + + + +
    Description:Customization of HTTP request and response +headers
    Status:Extension
    Module Identifier:headers_module
    Source File:mod_headers.c
    +

    Summary

    + +

    This module provides directives to control and modify HTTP + request and response headers. Headers can be merged, replaced + or removed.

    +
    +

    Directives

    + +

    Topics

    +
    +
    top
    +
    +

    Order of Processing

    + +

    The directives provided by mod_headers can occur + almost anywhere within the server configuration. They are valid in the + main server config and virtual host sections, inside + <Directory>, + <Location> and + <Files> sections, + and within .htaccess files.

    + +

    The directives are processed in the following order:

    + +
      +
    1. main server
    2. +
    3. virtual host
    4. +
    5. <Directory> sections and + .htaccess
    6. +
    7. <Files>
    8. +
    9. <Location>
    10. +
    + +

    Order is important. These two headers have a different + effect if reversed:

    + +

    + RequestHeader append MirrorID "mirror 12"
    + RequestHeader unset MirrorID +

    + +

    This way round, the MirrorID header is not set. If + reversed, the MirrorID header is set to "mirror 12".

    +
    top
    +
    +

    Examples

    + +
      +
    1. + Copy all request headers that begin with "TS" to the + response headers: + +

      + Header echo ^TS +

      +
    2. + +
    3. + Add a header, MyHeader, to the response including a + timestamp for when the request was received and how long it + took to begin serving the request. This header can be used by + the client to intuit load on the server or in isolating + bottlenecks between the client and the server. + +

      + Header add MyHeader "%D %t" +

      + +

      results in this header being added to the response:

      + +

      + MyHeader: D=3775428 t=991424704447256 +

      +
    4. + +
    5. + Say hello to Joe + +

      + Header add MyHeader "Hello Joe. It took %D microseconds \
      + for Apache to serve this request." +

      + +

      results in this header being added to the response:

      + +

      + MyHeader: Hello Joe. It took D=3775428 microseconds for Apache + to serve this request. +

      +
    6. + +
    7. + Conditionally send MyHeader on the response if and + only if header "MyRequestHeader" is present on the request. This + is useful for constructing headers in response to some client + stimulus. Note that this example requires the services of the + mod_setenvif module. + +

      + SetEnvIf MyRequestHeader value HAVE_MyRequestHeader
      + Header add MyHeader "%D %t mytext" env=HAVE_MyRequestHeader
      +

      + +

      If the header MyRequestHeader: value is present on + the HTTP request, the response will contain the following header:

      + +

      + MyHeader: D=3775428 t=991424704447256 mytext +

      +
    8. +
    +
    +
    top
    +

    Header Directive

    + + + + + + + + +
    Description:Configure HTTP response headers
    Syntax:Header [condition] set|append|add|unset|echo +header [value] [env=[!]variable]
    Context:server config, virtual host, directory, .htaccess
    Override:FileInfo
    Status:Extension
    Module:mod_headers
    Compatibility:Condition is available in version 2.0.51 and +later
    +

    This directive can replace, merge or remove HTTP response + headers. The header is modified just after the content handler + and output filters are run, allowing outgoing headers to be + modified.

    + +

    The optional condition can be either onsuccess + or always. It determines, which internal header table should be + operated on. onsuccess stands for 2xx + status codes and always for all status codes (including + 2xx). Especially if you want to unset headers + set by certain modules, you should try out, which table is affected.

    + +

    The action it performs is determined by the second + argument. This can be one of the following values:

    + +
    +
    set
    +
    The response header is set, replacing any previous header + with this name. The value may be a format string.
    + +
    append
    +
    The response header is appended to any existing header of + the same name. When a new value is merged onto an existing + header it is separated from the existing header with a comma. + This is the HTTP standard way of giving a header multiple values.
    + +
    add
    +
    The response header is added to the existing set of headers, + even if this header already exists. This can result in two + (or more) headers having the same name. This can lead to + unforeseen consequences, and in general "append" should be + used instead.
    + +
    unset
    +
    The response header of this name is removed, if it exists. + If there are multiple headers of the same name, all will be + removed.
    + +
    echo
    +
    Request headers with this name are echoed back in the + response headers. header may be a regular expression.
    +
    + +

    This argument is followed by a header name, which + can include the final colon, but it is not required. Case is + ignored for set, append, add + and unset. The header name for echo + is case sensitive and may be a regular expression.

    + +

    For add, append and set a + value is specified as the third argument. If value + contains spaces, it should be surrounded by doublequotes. + value may be a character string, a string containing format + specifiers or a combination of both. The following format specifiers + are supported in value:

    + + + + + + + + + + + +
    %tThe time the request was received in Universal Coordinated Time + since the epoch (Jan. 1, 1970) measured in microseconds. The value + is preceded by t=.
    %DThe time from when the request was received to the time the + headers are sent on the wire. This is a measure of the duration + of the request. The value is preceded by D=.
    %{FOOBAR}eThe contents of the environment + variable FOOBAR.
    + +

    When the Header directive is used with the + add, append, or set + argument, a fourth argument may be used to specify conditions + under which the action will be taken. If the environment variable specified in the + env=... argument exists (or if the environment + variable does not exist and env=!... is specified) + then the action specified by the Header directive + will take effect. Otherwise, the directive will have no effect + on the request.

    + +

    The Header directives are processed just + before the response is sent to the network. These means that it is + possible to set and/or override most headers, except for those headers + added by the header filter.

    + +
    +
    top
    +

    RequestHeader Directive

    + + + + + + + +
    Description:Configure HTTP request headers
    Syntax:RequestHeader set|append|add|unset header +[value [env=[!]variable]]
    Context:server config, virtual host, directory, .htaccess
    Override:FileInfo
    Status:Extension
    Module:mod_headers
    +

    This directive can replace, merge or remove HTTP request + headers. The header is modified just before the content handler + is run, allowing incoming headers to be modified. The action it + performs is determined by the first argument. This can be one + of the following values:

    + +
    +
    set
    +
    The request header is set, replacing any previous header + with this name
    + +
    append
    +
    The request header is appended to any existing header of the + same name. When a new value is merged onto an existing header + it is separated from the existing header with a comma. This + is the HTTP standard way of giving a header multiple + values.
    + +
    add
    +
    The request header is added to the existing set of headers, + even if this header already exists. This can result in two + (or more) headers having the same name. This can lead to + unforeseen consequences, and in general append should be + used instead.
    + +
    unset
    +
    The request header of this name is removed, if it exists. If + there are multiple headers of the same name, all will be removed.
    +
    + +

    This argument is followed by a header name, which can + include the final colon, but it is not required. Case is + ignored. For add, append and + set a value is given as the third argument. If + value contains spaces, it should be surrounded by double + quotes. For unset, no value should be given.

    + +

    When the RequestHeader directive is used with the + add, append, or set + argument, a fourth argument may be used to specify conditions + under which the action will be taken. If the environment variable specified in the + env=... argument exists (or if the environment + variable does not exist and env=!... is specified) + then the action specified by the RequestHeader directive + will take effect. Otherwise, the directive will have no effect + on the request.

    + +

    The RequestHeader directive is processed + just before the request is run by its handler in the fixup phase. + This should allow headers generated by the browser, or by Apache + input filters to be overridden or modified.

    + +
    +
    +
    +

    Available Languages:  en  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_headers.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_headers.html.ko.euc-kr new file mode 100644 index 00000000..31732bd9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_headers.html.ko.euc-kr @@ -0,0 +1,299 @@ + + + +mod_headers - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    ¾ÆÆÄÄ¡ ¸ðµâ mod_headers

    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + ko 

    +
    +
    ÀÌ ¹®¼­´Â ÃÖ½ÅÆÇ ¹ø¿ªÀÌ ¾Æ´Õ´Ï´Ù. + ÃÖ±Ù¿¡ º¯°æµÈ ³»¿ëÀº ¿µ¾î ¹®¼­¸¦ Âü°íÇϼ¼¿ä.
    + + + +
    ¼³¸í:HTTP ¿äû Çì´õ¿Í ÀÀ´ä Çì´õ ¼öÁ¤
    »óÅÂ:Extension
    ¸ðµâ¸í:headers_module
    ¼Ò½ºÆÄÀÏ:mod_headers.c
    +

    ¿ä¾à

    + +

    ÀÌ ¸ðµâÀº HTTP ¿äû Çì´õ¿Í ÀÀ´ä Çì´õ¸¦ Á¶ÀýÇÏ°í ¼öÁ¤ÇÏ´Â + Áö½Ã¾îµéÀ» Á¦°øÇÑ´Ù. Çì´õ¸¦ ÇÕÄ¡°Å³ª ´ëü, Á¦°ÅÇÒ ¼ö ÀÖ´Ù.

    +
    +

    Áö½Ã¾îµé

    + +

    ÁÖÁ¦

    +
    +
    top
    +
    +

    ó¸® ¼ø¼­

    + +

    mod_headers°¡ Á¦°øÇÏ´Â Áö½Ã¾î´Â ¼­¹ö¼³Á¤ÀÇ + °ÅÀÇ ¸ðµç Àå¼Ò¿¡¼­ »ç¿ëÇÒ ¼ö ÀÖ´Ù. Áö½Ã¾î´Â ÁÖ¼­¹ö¼³Á¤, + °¡»óÈ£½ºÆ® ¼½¼Ç, <Directory>, <Location>, <Files> ¼½¼Ç, .htaccess + ÆÄÀÏ¿¡¼­ »ç¿ëÇÒ ¼ö ÀÖ´Ù.

    + +

    Áö½Ã¾î´Â ¾Æ·¡ ¼ø¼­´ë·Î 󸮵ȴÙ.

    + +
      +
    1. ÁÖ¼­¹ö
    2. +
    3. °¡»óÈ£½ºÆ®
    4. +
    5. <Directory> ¼½¼Ç°ú + .htaccess
    6. +
    7. <Files>
    8. +
    9. <Location>
    10. +
    + +

    ¼ø¼­´Â Áß¿äÇÏ´Ù. + ´ÙÀ½ µÎ Áö½Ã¾î¸¦ ¹Ý´ë·Î ÀûÀ¸¸é È¿°ú°¡ ´Þ¶óÁø´Ù.

    + +

    + RequestHeader append MirrorID "mirror 12"
    + RequestHeader unset MirrorID +

    + +

    À§¿Í °°ÀÌ ÀûÀ¸¸é MirrorID Çì´õ°¡ ³ª¿ÀÁö + ¾Ê´Â´Ù. ¹Ý´ë·Î ÀûÀ¸¸é MirrorID Çì´õ¸¦ "mirror 12"·Î ¼³Á¤ÇÑ´Ù.

    +
    top
    +
    +

    ¿¹Á¦

    + +
      +
    1. + "TS"·Î ½ÃÀÛÇÏ´Â ¸ðµç ¿äû Çì´õ¸¦ ÀÀ´ä Çì´õ·Î º¹»çÇÑ´Ù. + +

      + Header echo ^TS +

      +
    2. + +
    3. + ÀÀ´ä¿¡ ¿äûÀ» ¹ÞÀº ½Ã°£°ú ¿äûÀ» ¼­ºñ½ºÇϴµ¥ °É¸± ½Ã°£À» + ¾Ë·ÁÁÖ´Â MyHeader Çì´õ¸¦ Ãß°¡ÇÑ´Ù. Ŭ¶óÀ̾ðÆ®´Â + ÀÌ Çì´õ¸¦ º¸°í ¼­¹öÀÇ ºÎÇϸ¦ ÃßÁ¤Çϰųª Ŭ¶óÀ̾ðÆ®¿Í + ¼­¹ö°£ÀÇ º´¸ñÁ¡À» ãÀ» ¼ö ÀÖ´Ù. + +

      + Header add MyHeader "%D %t" +

      + +

      ÀÀ´ä¿¡ ´ÙÀ½°ú °°Àº Çì´õ°¡ »ý±ä´Ù.

      + +

      + MyHeader: D=3775428 t=991424704447256 +

      +
    4. + +
    5. + Joe¿¡°Ô ¾È³ç + +

      + Header add MyHeader "Hello Joe. It took %D microseconds \
      + for Apache to serve this request." +

      + +

      ÀÀ´ä¿¡ ´ÙÀ½°ú °°Àº Çì´õ°¡ »ý±ä´Ù.

      + +

      + MyHeader: Hello Joe. It took D=3775428 microseconds for Apache + to serve this request. +

      +
    6. + +
    7. + ¿äû¿¡ "MyRequestHeader" Çì´õ°¡ ÀÖ´Â °æ¿ì¿¡¸¸ ¼±ÅÃÀûÀ¸·Î + ÀÀ´ä¿¡ MyHeader¸¦ º¸³½´Ù. ƯÁ¤ Ŭ¶óÀ̾ðÆ®¿¡°Ô¸¸ + ÀÀ´ä¿¡ Çì´õ¸¦ Ãß°¡ÇÒ¶§ À¯¿ëÇÏ´Ù. ÀÌ ¿¹Á¦°¡ µ¿ÀÛÇÏ·Á¸é + mod_setenvif ¸ðµâÀÌ ÇÊ¿äÇÏ´Ù. + +

      + SetEnvIf MyRequestHeader value HAVE_MyRequestHeader
      + Header add MyHeader "%D %t mytext" env=HAVE_MyRequestHeader
      +

      + +

      HTTP ¿äû¿¡ MyRequestHeader: value Çì´õ°¡ + ÀÖ´Ù¸é, ÀÀ´ä¿¡ ´ÙÀ½°ú °°Àº Çì´õ°¡ »ý±ä´Ù.

      + +

      + MyHeader: D=3775428 t=991424704447256 mytext +

      +
    8. +
    +
    +
    top
    +

    Header Áö½Ã¾î

    + + + + + + + + +
    ¼³¸í:HTTP ÀÀ´ä Çì´õ¸¦ ±¸¼ºÇÑ´Ù
    ¹®¹ý:Header [condition] set|append|add|unset|echo +header [value] [env=[!]variable]
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®, directory, .htaccess
    Override ¿É¼Ç:FileInfo
    »óÅÂ:Extension
    ¸ðµâ:mod_headers
    Áö¿ø:ConditionÀº ¾ÆÆÄÄ¡ 2.0.51 ºÎÅÍ
    +

    ÀÌ Áö½Ã¾î´Â HTTP ÀÀ´ä Çì´õ¸¦ ÇÕÄ¡°Å³ª ´ëü, Á¦°ÅÇÑ´Ù. + ³»¿ë Çڵ鷯¿Í Ãâ·Â ÇÊÅÍ°¡ ½ÇÇàÇÑ Á÷ÈÄ¿¡ Çì´õ¸¦ ¼öÁ¤Çϱ⶧¹®¿¡ + º¸³¾ Çì´õ¸¦ ¼öÁ¤ÇÒ ¼ö ÀÖ´Ù.

    + +

    conditionÀº ¼±ÅÃÀûÀ¸·Î »ç¿ëÇϸç, °ªÀ¸·Î + onsuccess ȤÀº always¸¦ »ç¿ëÇÑ´Ù. + ÀÌ´Â ¾î¶² ³»ºÎ Çì´õÇ¥¿¡ µ¿ÀÛÇÒÁö¸¦ °áÁ¤ÇÑ´Ù. + onsuccess´Â 2xx »óÅÂÄڵ带 + ¶æÇÏ°í, always´Â (2xx¸¦ + Æ÷ÇÔÇÑ) ¸ðµç »óÅÂÄڵ带 ¶æÇÑ´Ù. ƯÈ÷ ¾î¶² ¸ðµâÀÌ ¼³Á¤ÇÑ + Çì´õ¸¦ ÇØÁ¦ÇÏ°í ½Í´Ù¸é, µÑÁß ¾î¶² °ÍÀ» »ç¿ëÇÒÁö Àß »ìÆìºÁ¾ß + ÇÑ´Ù.

    + +

    µÎ¹ø° ¾Æ±Ô¸ÕÆ®¿¡ µû¶ó ±â´ÉÀÌ ´Ù¸£´Ù. µÎ¹ø° ¾Æ±Ô¸ÕÆ®·Î + ¾Æ·¡ °ªÁß Çϳª¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù.

    + +
    +
    set
    +
    ÀÀ´ä Çì´õ¸¦ ¼³Á¤ÇÑ´Ù. °°Àº À̸§À¸·Î ÀÌ¹Ì Çì´õ°¡ ÀÖ´Ù¸é + ´ëüÇÑ´Ù. value¿¡ Çü½Ä¹®ÀÚ¿­À» »ç¿ëÇÒ ¼ö ÀÖ´Ù.
    + +
    append
    +
    ÀÌ¹Ì Á¸ÀçÇÏ´Â °°Àº À̸§ÀÇ ÀÀ´ä Çì´õ¿¡ Ãß°¡ÇÑ´Ù. ±âÁ¸ + Çì´õ¿¡ »õ·Î¿î °ªÀ» ÇÕÄ¡¸é, ±âÁ¸ Çì´õ¿Í »õ·Î¿î °ª »çÀÌ¿¡ + ½°Ç¥¸¦ ºÙÀδÙ. ÀÌ´Â ¿©·¯ Çì´õ°ªÀ» ÁöÁ¤ÇÏ´Â HTTP Ç¥ÁØ ¹æ½ÄÀÌ´Ù.
    + +
    add
    +
    Çì´õ°¡ ÀÌ¹Ì ÀÖ´õ¶óµµ ÀÀ´ä Çì´õ¸¦ Ãß°¡ÇÑ´Ù. ±×·¡¼­ °°Àº + À̸§ÀÇ Çì´õ°¡ µÎ°³ (ȤÀº ¸¹ÀÌ) »ý±æ ¼ö ÀÖ´Ù. ÀÌ °æ¿ì ÀÇ¿ÜÀÇ + °á°ú°¡ ¹ß»ýÇÒ ¼ö Àֱ⶧¹®¿¡ º¸Åë ´ë½Å append¸¦ + »ç¿ëÇØ¾ß ÇÑ´Ù.
    + +
    unset
    +
    ÀÌ·± À̸§ÀÇ ÀÀ´ä Çì´õ°¡ ÀÖ´Ù¸é »èÁ¦ÇÑ´Ù. °°Àº À̸§À» + °¡Áø Çì´õ°¡ ¿©·¯°³ ÀÖ´Ù¸é ¸ðµÎ Á¦°ÅÇÑ´Ù.
    + +
    echo
    +
    ÀÌ·± À̸§ÀÇ ¿äû Çì´õ¸¦ ±×´ë·Î ÀÀ´ä Çì´õ·Î º¸³½´Ù. + header¿¡ Á¤±ÔÇ¥Çö½ÄÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù.
    +
    + +

    ¾Æ±Ô¸ÕÆ® µÚ¿¡ header À̸§ÀÌ ³ª¿Â´Ù. Çì´õ¸í + µÚ¿¡ ÄÝ·ÐÀ» ÀûÀ» ¼ö ÀÖÁö¸¸, ¾ø¾îµµ µÈ´Ù. set, + append, add, unset¿¡¼­ + ´ë¼Ò¹®ÀÚ´Â ¹«½ÃÇÑ´Ù. echoÀÇ header + À̸§Àº ´ë¼ö¹®ÀÚ¸¦ ±¸º°ÇÏ°í Á¤±ÔÇ¥Çö½ÄÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù.

    + +

    add, append, setÀ» + »ç¿ëÇÒ¶§´Â ¼¼¹ø° ¾Æ±Ô¸ÕÆ® value°¡ ÇÊ¿äÇÏ´Ù. + value ¾È¿¡ °ø¹éÀÌ ÀÖ´Ù¸é ½Öµû¿ÈÇ¥·Î ¹­¾î¾ß ÇÑ´Ù. + value´Â ÀÏ¹Ý ¹®ÀÚ¿­À̳ª Çü½ÄÀ» ±â¼úÇÏ´Â ¹®ÀÚ¿­À̸ç, + µÎ°¡Áö¸¦ °°ÀÌ »ç¿ëÇÒ ¼öµµ ÀÖ´Ù. value¿¡¼­ Áö¿øÇÏ´Â + Çü½Ä±â¼úÀÚ´Â ´ÙÀ½°ú °°´Ù.

    + + + + + + + + + + + +
    %t¿äûÀ» ¹ÞÀº ½Ã°£À» ±¹Á¦Ç¥Áؽ÷Πepoch (1970³â 1¿ù + 1ÀÏ) ÀÌÈÄ Áö³­ ¸¶ÀÌÅ©·ÎÃÊ ´ÜÀ§·Î. °ª ¾Õ¿¡ t=ÀÌ + ºÙ´Â´Ù.
    %D¿äûÀ» ¹ÞÀº ½Ã°£ºÎÅÍ Çì´õ¸¦ ³×Æ®¿÷¿¡ ¾µ¶§±îÁö °É¸° + ½Ã°£. ¿äûÀÇ ±â°£À» Àé´Ù. °ª ¾Õ¿¡ D=ÀÌ + ºÙ´Â´Ù.
    %{FOOBAR}eȯ°æº¯¼ö FOOBARÀÇ + ³»¿ë.
    + +

    Header Áö½Ã¾îÀÇ add, + append, set ¾Æ±Ô¸ÕÆ®¸¦ »ç¿ëÇÏ´Â + °æ¿ì ³×¹ø° ¾Æ±Ô¸ÕÆ®·Î ÀÛ¾÷¿¡ ÇÊ¿äÇÑ Á¶°ÇÀ» ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. + env=... ¾Æ±Ô¸ÕÆ®¸¦ »ç¿ëÇϸé ÇØ´ç ȯ°æº¯¼ö°¡ Á¸ÀçÇÏ´Â °æ¿ì¿¡¸¸ (¾Æ´Ï¸é + env=!...¿¡ ³ª¿Â ȯ°æº¯¼ö°¡ Á¸ÀçÇÏÁö ¾Ê´Ù¸é) + Header Áö½Ã¾î°¡ µ¿ÀÛÇÑ´Ù. + ±×·¸Áö ¾ÊÀ¸¸é Áö½Ã¾î´Â ¿äû¿¡ ¾Æ¹« ¿µÇâÀ» ¹ÌÄ¡Áö ¾Ê´Â´Ù.

    + +

    ÀÀ´äÀ» ³×Æ®¿÷À¸·Î + º¸³»±â Á÷Àü¿¡ Header Áö½Ã¾î¸¦ ó¸®ÇÑ´Ù. + ±×·¡¼­ Çì´õ ÇÊÅÍ°¡ Ãß°¡ÇÏ´Â Çì´õ¸¦ Á¦¿ÜÇÑ ´ëºÎºÐÀÇ Çì´õ¸¦ + ¼³Á¤Çϰųª µ¤¾î¾µ ¼ö ÀÖ´Ù.

    + +
    +
    top
    +

    RequestHeader Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:HTTP ¿äû Çì´õ¸¦ ±¸¼ºÇÑ´Ù
    ¹®¹ý:RequestHeader set|append|add|unset header +[value]
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®, directory, .htaccess
    Override ¿É¼Ç:FileInfo
    »óÅÂ:Extension
    ¸ðµâ:mod_headers
    +

    ÀÌ Áö½Ã¾î´Â HTTP ¿äû Çì´õ¸¦ ÇÕÄ¡°Å³ª ´ëü, Á¦°ÅÇÑ´Ù. + ³»¿ë Çڵ鷯°¡ ½ÇÇàÇϱâ Á÷Àü¿¡ Çì´õ¸¦ ¼öÁ¤Çϱ⶧¹®¿¡ ¹ÞÀº + Çì´õ¸¦ ¼öÁ¤ÇÒ ¼ö ÀÖ´Ù. ù¹ø° ¾Æ±Ô¸ÕÆ®¿¡ µû¶ó ±â´ÉÀÌ ´Ù¸£´Ù. + ù¹ø° ¾Æ±Ô¸ÕÆ®·Î ¾Æ·¡ °ªÁß Çϳª¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù.

    + +
    +
    set
    +
    ¿äû Çì´õ¸¦ ¼³Á¤ÇÑ´Ù. °°Àº À̸§À¸·Î ÀÌ¹Ì Çì´õ°¡ ÀÖ´Ù¸é + ´ëüÇÑ´Ù
    + +
    append
    +
    ÀÌ¹Ì Á¸ÀçÇÏ´Â °°Àº À̸§ÀÇ ¿äû Çì´õ¿¡ Ãß°¡ÇÑ´Ù. ±âÁ¸ + Çì´õ¿¡ »õ·Î¿î °ªÀ» ÇÕÄ¡¸é, ±âÁ¸ Çì´õ¿Í »õ·Î¿î °ª »çÀÌ¿¡ + ½°Ç¥¸¦ ºÙÀδÙ. ÀÌ´Â ¿©·¯ Çì´õ°ªÀ» ÁöÁ¤ÇÏ´Â HTTP Ç¥ÁØ ¹æ½ÄÀÌ´Ù.
    + +
    add
    +
    Çì´õ°¡ ÀÌ¹Ì ÀÖ´õ¶óµµ ¿äû Çì´õ¸¦ Ãß°¡ÇÑ´Ù. ±×·¡¼­ °°Àº + À̸§ÀÇ Çì´õ°¡ µÎ°³ (ȤÀº ¸¹ÀÌ) »ý±æ ¼ö ÀÖ´Ù. ÀÌ °æ¿ì ÀÇ¿ÜÀÇ + °á°ú°¡ ¹ß»ýÇÒ ¼ö Àֱ⶧¹®¿¡ º¸Åë ´ë½Å append¸¦ + »ç¿ëÇØ¾ß ÇÑ´Ù.
    + +
    unset
    +
    ÀÌ·± À̸§ÀÇ ¿äû Çì´õ°¡ ÀÖ´Ù¸é »èÁ¦ÇÑ´Ù. °°Àº À̸§À» + °¡Áø Çì´õ°¡ ¿©·¯°³ ÀÖ´Ù¸é ¸ðµÎ Á¦°ÅÇÑ´Ù.
    +
    + +

    ¾Æ±Ô¸ÕÆ® µÚ¿¡ Çì´õ¸íÀÌ ³ª¿Â´Ù. Çì´õ¸í µÚ¿¡ ÄÝ·ÐÀ» ÀûÀ» + ¼ö ÀÖÁö¸¸, ¾ø¾îµµ µÈ´Ù. ´ë¼Ò¹®ÀÚ´Â ¹«½ÃÇÑ´Ù. add, + append, setÀ» »ç¿ëÇÒ¶§´Â ¼¼¹ø° + ¾Æ±Ô¸ÕÆ® value°¡ ÇÊ¿äÇÏ´Ù. value ¾È¿¡ + °ø¹éÀÌ ÀÖ´Ù¸é ½Öµû¿ÈÇ¥·Î ¹­¾î¾ß ÇÑ´Ù. unsetÀ» »ç¿ëÇÒ¶§´Â + value¸¦ ÀûÀ¸¸é ¾ÈµÈ´Ù.

    + +

    fixup ´Ü°è¿¡¼­ + ¿äû¿¡ ÇØ´çÇÏ´Â Çڵ鷯¸¦ ½ÇÇàÇϱâ Á÷Àü¿¡ + RequestHeader Áö½Ã¾î¸¦ ó¸®ÇÑ´Ù. + ±×·¡¼­ ºê¶ó¿ìÀú¿¡ µû¶ó ȤÀº ¾ÆÆÄÄ¡ ÀÔ·ÂÇÊÅÍ°¡ Çì´õ¸¦ µ¤¾î¾²°Å³ª + ¼öÁ¤ÇÒ ¼ö ÀÖ´Ù.

    + +
    +
    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_imap.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_imap.html new file mode 100644 index 00000000..24d31679 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_imap.html @@ -0,0 +1,9 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_imap.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: mod_imap.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_imap.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_imap.html.en new file mode 100644 index 00000000..4348baf2 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_imap.html.en @@ -0,0 +1,382 @@ + + + +mod_imap - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_imap

    +
    +

    Available Languages:  en  | + ko 

    +
    + + + +
    Description:Server-side imagemap processing
    Status:Base
    Module Identifier:imap_module
    Source File:mod_imap.c
    +

    Summary

    + +

    This module processes .map files, thereby + replacing the functionality of the imagemap CGI + program. Any directory or document type configured to use the + handler imap-file (using either + AddHandler or + SetHandler) + will be processed by this module.

    + +

    The following directive will activate files ending with + .map as imagemap files:

    + +

    AddHandler imap-file map

    + +

    Note that the following is still supported:

    + +

    AddType application/x-httpd-imap map

    + +

    However, we are trying to phase out "magic MIME types" so we + are deprecating this method.

    +
    + +
    top
    +
    +

    New Features

    + +

    The imagemap module adds some new features that were not + possible with previously distributed imagemap programs.

    + +
      +
    • URL references relative to the Referer: information.
    • + +
    • Default <base> assignment through a new map + directive base.
    • + +
    • No need for imagemap.conf file.
    • + +
    • Point references.
    • + +
    • Configurable generation of imagemap menus.
    • +
    +
    top
    +
    +

    Imagemap File

    + +

    The lines in the imagemap files can have one of several + formats:

    + +

    + directive value [x,y ...]
    + directive value "Menu text" [x,y + ...]
    + directive value x,y ... "Menu text" +

    + +

    The directive is one of base, + default, poly, circle, + rect, or point. The value is an + absolute or relative URL, or one of the special values listed + below. The coordinates are x,y + pairs separated by whitespace. The quoted text is used as the text of + the link if a imagemap menu is generated. Lines beginning with '#' are + comments.

    + +

    Imagemap File Directives

    +

    There are six directives allowed in the imagemap file. The + directives can come in any order, but are processed in the + order they are found in the imagemap file.

    + +
    +
    base Directive
    + +

    Has the effect of <base href="value"> + . The non-absolute URLs of the map-file are taken relative + to this value. The base directive overrides + ImapBase as set in a + .htaccess file or in the server configuration files. + In the absence of an ImapBase configuration + directive, base defaults to + http://server_name/.

    +

    base_uri is synonymous with base. + Note that a trailing slash on the URL is significant.

    + +
    default Directive
    + +
    The action taken if the coordinates given do not fit any + of the poly, circle or + rect directives, and there are no + point directives. Defaults to nocontent + in the absence of an ImapDefault configuration setting, causing a status + code of 204 No Content to be returned. The client + should keep the same page displayed.
    + +
    poly Directive
    + +
    Takes three to one-hundred points, and is obeyed if the + user selected coordinates fall within the polygon defined by + these points.
    + +
    circle
    + +
    Takes the center coordinates of a circle and a point on + the circle. Is obeyed if the user selected point is with the + circle.
    + +
    rect Directive
    + +
    Takes the coordinates of two opposing corners of a + rectangle. Obeyed if the point selected is within this + rectangle.
    + +
    point Directive
    + +
    Takes a single point. The point directive closest to the + user selected point is obeyed if no other directives are + satisfied. Note that default will not be + followed if a point directive is present and + valid coordinates are given.
    +
    + + +

    Values

    + +

    The values for each of the directives can any of the following:

    + +
    +
    a URL
    + +

    The URL can be relative or absolute URL. Relative URLs + can contain '..' syntax and will be resolved relative to the + base value.

    +

    base itself will not resolved according to the + current value. A statement base mailto: will + work properly, though.

    + +
    map
    + +
    Equivalent to the URL of the imagemap file itself. No + coordinates are sent with this, so a menu will be generated + unless ImapMenu is set to + none.
    + +
    menu
    +
    Synonymous with map.
    + +
    referer
    + +
    Equivalent to the URL of the referring document. Defaults + to http://servername/ if no Referer: + header was present.
    + +
    nocontent
    + +
    Sends a status code of 204 No Content, + telling the client to keep the same page displayed. Valid for + all but base.
    + +
    error
    + +
    Fails with a 500 Server Error. Valid for all + but base, but sort of silly for anything but + default.
    +
    + + +

    Coordinates

    + +
    +
    0,0 200,200
    + +
    A coordinate consists of an x and a y + value separated by a comma. The coordinates are separated + from each other by whitespace. To accommodate the way Lynx + handles imagemaps, should a user select the coordinate + 0,0, it is as if no coordinate had been + selected.
    +
    + + + +

    Quoted Text

    + +
    +
    "Menu Text"
    + +

    After the value or after the coordinates, the line + optionally may contain text within double quotes. This string + is used as the text for the link if a menu is + generated:

    + +

    + <a href="http://foo.com/">Menu text</a> +

    + +

    If no quoted text is present, the name of the link will be + used as the text:

    + +

    + <a href="http://foo.com/">http://foo.com</a> +

    + +

    If you want to use double quotes within this text, you have to + write them as &quot;.

    +
    + + +
    top
    +
    +

    Example Mapfile

    + +

    + #Comments are printed in a 'formatted' or 'semiformatted' menu.
    + #And can contain html tags. <hr>
    + base referer
    + poly map "Could I have a menu, please?" 0,0 0,10 10,10 10,0
    + rect .. 0,0 77,27 "the directory of the referer"
    + circle http://www.inetnebr.com/lincoln/feedback/ 195,0 305,27
    + rect another_file "in same directory as referer" 306,0 419,27
    + point http://www.zyzzyva.com/ 100,100
    + point http://www.tripod.com/ 200,200
    + rect mailto:nate@tripod.com 100,150 200,0 "Bugs?"
    +

    + +
    top
    +
    +

    Referencing your mapfile

    + +

    HTML example

    + <a href="/maps/imagemap1.map">
    + + <img ismap src="/images/imagemap1.gif">
    +
    + </a> +

    + +

    XHTML example

    + <a href="/maps/imagemap1.map">
    + + <img ismap="ismap" src="/images/imagemap1.gif" />
    +
    + </a> +

    + +
    +
    top
    +

    ImapBase Directive

    + + + + + + + + +
    Description:Default base for imagemap files
    Syntax:ImapBase map|referer|URL
    Default:ImapBase http://servername/
    Context:server config, virtual host, directory, .htaccess
    Override:Indexes
    Status:Base
    Module:mod_imap
    +

    The ImapBase directive sets the default + base used in the imagemap files. Its value is + overridden by a base directive within the imagemap + file. If not present, the base defaults to + http://servername/.

    + +

    See also

    + +
    +
    top
    +

    ImapDefault Directive

    + + + + + + + + +
    Description:Default action when an imagemap is called with coordinates +that are not explicitly mapped
    Syntax:ImapDefault error|nocontent|map|referer|URL
    Default:ImapDefault nocontent
    Context:server config, virtual host, directory, .htaccess
    Override:Indexes
    Status:Base
    Module:mod_imap
    +

    The ImapDefault directive sets the default + default used in the imagemap files. Its value is + overridden by a default directive within the + imagemap file. If not present, the default action + is nocontent, which means that a 204 No + Content is sent to the client. In this case, the client + should continue to display the original page.

    + +
    +
    top
    +

    ImapMenu Directive

    + + + + + + + +
    Description:Action if no coordinates are given when calling +an imagemap
    Syntax:ImapMenu none|formatted|semiformatted|unformatted
    Context:server config, virtual host, directory, .htaccess
    Override:Indexes
    Status:Base
    Module:mod_imap
    +

    The ImapMenu directive determines the + action taken if an imagemap file is called without valid + coordinates.

    + +
    +
    none
    +
    If ImapMenu is none, no menu is generated, + and the default action is performed.
    + +
    formatted
    +
    A formatted menu is the simplest menu. + Comments in the imagemap file are ignored. A level one header + is printed, then an hrule, then the links each on a separate + line. The menu has a consistent, plain look close to that of + a directory listing.
    + +
    semiformatted
    +
    In the semiformatted menu, comments are + printed where they occur in the imagemap file. Blank lines + are turned into HTML breaks. No header or hrule is printed, + but otherwise the menu is the same as a + formatted menu.
    + +
    unformatted
    +
    Comments are printed, blank lines are ignored. Nothing is + printed that does not appear in the imagemap file. All breaks + and headers must be included as comments in the imagemap + file. This gives you the most flexibility over the appearance + of your menus, but requires you to treat your map files as + HTML instead of plaintext.
    +
    + +
    +
    +
    +

    Available Languages:  en  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_imap.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_imap.html.ko.euc-kr new file mode 100644 index 00000000..0f3d4e62 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_imap.html.ko.euc-kr @@ -0,0 +1,361 @@ + + + +mod_imap - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    ¾ÆÆÄÄ¡ ¸ðµâ mod_imap

    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + ko 

    +
    + + + +
    ¼³¸í:¼­¹öÃø À̹ÌÁö¸Ê(imagemap) ó¸®
    »óÅÂ:Base
    ¸ðµâ¸í:imap_module
    ¼Ò½ºÆÄÀÏ:mod_imap.c
    +

    ¿ä¾à

    + +

    ÀÌ ¸ðµâÀº imagemap CGI ÇÁ·Î±×·¥À» ´ë½ÅÇÏ¿© + .map ÆÄÀÏÀ» ó¸®ÇÑ´Ù. ÀÌ ¸ðµâÀº (AddHandler³ª SetHandler¸¦ »ç¿ëÇÏ¿©) + imap-file Çڵ鷯¸¦ »ç¿ëÇϵµ·Ï ¼³Á¤ÇÑ µð·ºÅ丮³ª + ¹®¼­¸¦ ó¸®ÇÑ´Ù.

    + +

    ¾Æ·¡ Áö½Ã¾î´Â .mapÀ¸·Î ³¡³ª´Â ÆÄÀÏÀ» À̹ÌÁö¸Ê + ÆÄÀÏ·Î ¼³Á¤ÇÑ´Ù.

    + +

    AddHandler imap-file map

    + +

    ¾ÆÁ÷µµ ¾Æ·¡¿Í °°Àº ¼³Á¤À» Áö¿øÇÑ´Ù.

    + +

    AddType application/x-httpd-imap map

    + +

    ±×·¯³ª ¿ì¸®´Â Á¡Â÷ "¼­¹ö¿¡°Ô Ưº°ÇÑ Àǹ̰¡ ÀÖ´Â MIME + type"À» Á¦°ÅÇÏ·Á°í Çϱ⶧¹®¿¡ ÀÌ ¹æ¹ýÀº ¾ø¾îÁú °ÍÀÌ´Ù.

    +
    + +
    top
    +
    +

    »õ·Î¿î ±â´É

    + +

    À̹ÌÁö¸Ê ¸ðµâ¿¡´Â ÀÌÀü À̹ÌÁö¸Ê ÇÁ·Î±×·¥¿¡´Â ¾ø´Â ¸î°¡Áö + »õ·Î¿î ±â´ÉÀÌ ÀÖ´Ù.

    + +
      +
    • Referer: Á¤º¸¿¡ »ó´ëÀûÀÎ URL ÂüÁ¶.
    • + +
    • »õ·Î¿î base ¸ÊÁö½Ã¾î¸¦ »ç¿ëÇÏ¿© ±âº» + <base> ÁöÁ¤.
    • + +
    • imagemap.conf ÆÄÀÏ ÇÊ¿ä¾øÀ½.
    • + +
    • Á¡(point) ÂüÁ¶.
    • + +
    • À̹ÌÁö¸Ê ¸Þ´º Á¶Á¤ °¡´É.
    • +
    +
    top
    +
    +

    À̹ÌÁö¸Ê ÆÄÀÏ

    + +

    À̹ÌÁö¸Ê ÆÄÀÏÀº ¾Æ·¡¿Í °°Àº Çü½ÄÀ¸·Î ÀÛ¼ºÇÑ´Ù.

    + +

    + directive value [x,y ...]
    + directive value "Menu text" [x,y + ...]
    + directive value x,y ... "Menu text" +

    + +

    directive´Â base, default, + poly, circle, rect, + point Áß Çϳª´Ù. value¿¡´Â Àý´ë URLÀ̳ª »ó´ë + URL ȤÀº ¾Æ·¡¿¡¼­ ¿­°ÅÇÒ Æ¯¼ö°ªÀ» »ç¿ëÇÑ´Ù. ÁÂÇ¥´Â °ø¹éÀ¸·Î + ±¸ºÐÇÑ x,y ½ÖÀÌ´Ù. µû¿ÈÇ¥·Î + ¹­Àº ¹®±¸´Â À̹ÌÁö¸Ê ¸Þ´º¸¦ ¸¸µé¶§ ¸µÅ© Á¦¸ñÀ¸·Î »ç¿ëÇÑ´Ù. + '#'·Î ½ÃÀÛÇÏ´Â ÁÙÀº ÁÖ¼®ÀÌ´Ù.

    + +

    À̹ÌÁö¸Ê ÆÄÀÏ Áö½Ã¾î

    +

    À̹ÌÁö¸Ê ÆÄÀÏ¿¡¼­ 6°¡Áö Áö½Ã¾î¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. Áö½Ã¾î´Â + Ưº°ÇÑ ¼ø¼­¾øÀÌ »ç¿ëÇÒ ¼ö ÀÖÁö¸¸, À̹ÌÁö¸Ê ÆÄÀÏ¿¡ ³ª¿Â + ¼ø¼­´ë·Î ó¸®ÇÑ´Ù.

    + +
    +
    base Áö½Ã¾î
    + +

    <base href="value"> + ±â´ÉÀ» ÇÑ´Ù. ¸ÊÆÄÀÏ¿¡¼­ ³ª¿À´Â URLÀº Àý´ë URLÀÌ ¾Æ´Ï¶ó¸é + ÀÌ °ª¿¡ »ó´ë URL·Î Ãë±ÞÇÑ´Ù. base Áö½Ã¾î´Â + .htaccess ÆÄÀÏÀ̳ª ¼­¹ö¼³Á¤ÆÄÀÏ¿¡¼­ ¼³Á¤ÇÑ + ImapBase °ªÀ» + ¹«½ÃÇÑ´Ù. ImapBase ¼³Á¤Áö½Ã¾î°¡ + ¾ø´Ù¸é ±âº» base °ªÀº + http://server_name/ÀÌ´Ù.

    +

    base_uri´Â base¿Í °°´Ù. URL¿¡¼­ + ¸¶Áö¸· ½½·¡½¬¸¦ ÀØÁö¸¶¶ó.

    + +
    default Áö½Ã¾î
    + +
    ÇØ´ç ÁÂÇ¥°¡ poly, circle, + rect Áö½Ã¾î¿¡ ÇØ´çÇÏÁö ¾Ê°í point + Áö½Ã¾î¸¦ »ç¿ëÇÏÁö ¾ÊÀº °æ¿ì ÇൿÀ» ÁöÁ¤ÇÑ´Ù. ImapDefault ¼³Á¤ÀÌ ¾ø´Ù¸é + ±âº»°ªÀº 204 No Content »óÅÂÄڵ带 ¹ÝȯÇÏ´Â + nocontentÀÌ´Ù. ÀÌ °æ¿ì Ŭ¶óÀ̾ðÆ®´Â µ¿ÀÏÇÑ + ÆäÀÌÁö¸¦ º¸¿©Áà¾ß ÇÑ´Ù.
    + +
    poly Áö½Ã¾î
    + +
    Á¡À» ¼¼°³¿¡¼­ ¹é°³±îÁö ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. »ç¿ëÀÚ°¡ ÀÌ + Á¡µé·Î ÀÌ·ç¾îÁø ´Ù°¢Çü ¾ÈÀÇ ÁÂÇ¥¸¦ ¼±ÅÃÇÑ °æ¿ì¿¡ »ç¿ëÇÑ´Ù.
    + +
    circle
    + +
    ¿øÀÇ Á߽ɰú ¿øÀ§ÀÇ ÇÑ Á¡ÀÇ ÁÂÇ¥¸¦ ¹Þ´Â´Ù. »ç¿ëÀÚ°¡ + ¿ø ¾ÈÀÇ ÁÂÇ¥¸¦ ¼±ÅÃÇÑ °æ¿ì¿¡ »ç¿ëÇÑ´Ù.
    + +
    rect Áö½Ã¾î
    + +
    »ç°¢ÇüÀÇ µÎ ¸ð¼­¸® Á¡ÀÇ ÁÂÇ¥¸¦ ¹Þ´Â´Ù. »ç°¢Çü ¾ÈÀÇ + ÁÂÇ¥¸¦ ¼±ÅÃÇÑ °æ¿ì¿¡ »ç¿ëÇÑ´Ù.
    + +
    point Áö½Ã¾î
    + +
    ÇÑ Á¡ÀÇ ÁÂÇ¥¸¦ ¹Þ´Â´Ù. ´Ù¸¥ Áö½Ã¾îµéÀ» ¸¸Á·ÇÏÁö ¾ÊÀº + °æ¿ì »ç¿ëÀÚ°¡ ¼±ÅÃÇÑ ÁÂÇ¥¿¡ °¡Àå °¡±î¿î point Áö½Ã¾î¸¦ + »ç¿ëÇÑ´Ù. point Áö½Ã¾î¸¦ »ç¿ëÇÏ°í À¯È¿ÇÑ + ÁÂÇ¥¸¦ ¼±ÅÃÇÑ °æ¿ì default´Â Àý´ë·Î »ç¿ëµÇÁö + ¾Ê´Â´Ù.
    +
    + + +

    Áö½Ã¾î¿¡ »ç¿ëÇÒ ¼ö ÀÖ´Â °ªµé

    + +

    Áö½Ã¾î¿¡ ¾Æ·¡ value¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù.

    + +
    +
    URL
    + +

    »ó´ë URLÀ̳ª Àý´ë URLÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù. »ó´ë URL¿¡ + '..'À» »ç¿ëÇÒ ¼ö ÀÖÀ¸¸ç, base °ªÀ» ±âÁØÀ¸·Î + ã´Â´Ù.

    +

    base¸¦ ¼³Á¤ÇÒ¶§´Â ÇöÀç base°ªÀº ¹«½ÃÇÑ´Ù. + ±×·¯³ª, base mailto: ¹®Àº »ç¿ëÇÒ ¼ö ÀÖ´Ù.

    + +
    map
    + +
    À̹ÌÁö¸Ê ÆÄÀÏ ÀÚü URL°ú °°´Ù. ÁÂÇ¥°¡ ¾ø°í ImapMenu°¡ noneÀÌ + ¾Æ´Ï¶ó¸é ¸Þ´º¸¦ ¸¸µç´Ù.
    + +
    menu
    +
    map°ú °°´Ù.
    + +
    referer
    + +
    ÂüÁ¶(¸µÅ©¸¦ µû¶ó¿À±â Àü) ¹®¼­ URL°ú °°´Ù. + Referer: Çì´õ°¡ ¾ø´Ù¸é ±âº»°ªÀº + http://servername/ÀÌ´Ù.
    + +
    nocontent
    + +
    Ŭ¶óÀ̾ðÆ®¿¡°Ô µ¿ÀÏÇÑ ÆäÀÌÁö¸¦ ±×´ë·Î º¸¿©ÁÖ¶ó´Â + 204 No Content »óÅÂÄڵ带 º¸³½´Ù. + base¸¦ Á¦¿ÜÇÑ ¸ðµç Áö½Ã¾î¿¡¼­ »ç¿ëÇÒ ¼ö ÀÖ´Ù.
    + +
    error
    + +
    ½ÇÆи¦ ³ªÅ¸³»´Â 500 Server Error¸¦ º¸³½´Ù. + base¸¦ Á¦¿ÜÇÑ ¸ðµç Áö½Ã¾î¿¡¼­ »ç¿ëÇÒ ¼ö ÀÖÁö¸¸, + default ¿Ü¿¡´Â »ç¿ëÇÒ ÀÏÀÌ ¾ø´Ù.
    +
    + + +

    ÁÂÇ¥

    + +
    +
    0,0 200,200
    + +
    ÁÂÇ¥´Â ½°Ç¥·Î ±¸ºÐÇÑ x¿Í y °ªÀÌ´Ù. + ÁÂÇ¥µéÀº ¼­·Î °ø¹éÀ¸·Î ±¸ºÐÇÑ´Ù. À̹ÌÁö¸ÊÀ» ´Ù·ç´Â ¹æ½Ä»ó + LynxÀÇ ÆíÀǸ¦ À§ÇØ »ç¿ëÀÚ°¡ 0,0 ÁÂÇ¥¸¦ ¼±ÅÃÇÏ¿´´Ù¸é + ÁÂÇ¥¸¦ ¼±ÅÃÇÏÁö ¾ÊÀº °Íó·³ µ¿ÀÛÇÑ´Ù.
    +
    + + + +

    µû¿ÈÇ¥·Î ¹­Àº ¹®±¸

    + +
    +
    "Menu Text"
    + +

    value µÚ³ª ÁÂÇ¥ µÚ¿¡ ½Öµû¿ÈÇ¥·Î ¹­Àº ¹®±¸¸¦ ÀûÀ» + ¼öµµ ÀÖ´Ù. ÀÌ ¹®ÀÚ¿­Àº ¸Þ´º¸¦ ¸¸µé¶§ ¸µÅ© Á¦¸ñÀ¸·Î »ç¿ëÇÑ´Ù.

    + +

    + <a href="http://foo.com/">Menu text</a> +

    + +

    µû¿ÈÇ¥·Î ¹­Àº ¹®±¸°¡ ¾ø´Ù¸é ´ÙÀ½°ú °°ÀÌ ¸µÅ©¸¦ ¸µÅ© + Á¦¸ñÀ¸·Î »ç¿ëÇÑ´Ù.

    + +

    + <a href="http://foo.com/">http://foo.com</a> +

    + +

    ¹®±¸¿¡ ½Öµû¿ÈÇ¥¸¦ ¾²·Á¸é &quot;¿Í + °°ÀÌ Àû¾î¾ß ÇÑ´Ù.

    +
    + + +
    top
    +
    +

    ¸ÊÆÄÀÏ ¿¹Á¦

    + +

    + #'formatted'³ª 'semiformatted' ¸Þ´º´Â ÁÖ¼®À» Ãâ·ÂÇÑ´Ù.
    + #±×¸®°í ÁÖ¼®¿¡ html ű׸¦ ¾µ ¼ö ÀÖ´Ù. <hr>
    + base referer
    + poly map "¸Þ´º¸¦ º¸¿©ÁÖ¼¼¿ä." 0,0 0,10 10,10 10,0
    + rect .. 0,0 77,27 "ÂüÁ¶ ¹®¼­°¡ ÀÖ´Â µð·ºÅ丮"
    + circle http://www.inetnebr.com/lincoln/feedback/ 195,0 305,27
    + rect another_file "ÂüÁ¶ ¹®¼­¿Í °°Àº µð·ºÅ丮¿¡ ÀÖ´Â" 306,0 419,27
    + point http://www.zyzzyva.com/ 100,100
    + point http://www.tripod.com/ 200,200
    + rect mailto:nate@tripod.com 100,150 200,0 "¹ö±×?"
    +

    + +
    top
    +
    +

    ¸ÊÆÄÀÏ »ç¿ëÇϱâ

    + +

    HTML ¿¡Á¦

    + <a href="/maps/imagemap1.map">
    + + <img ismap src="/images/imagemap1.gif">
    +
    + </a> +

    + +

    XHTML ¿¹Á¦

    + <a href="/maps/imagemap1.map">
    + + <img ismap="ismap" src="/images/imagemap1.gif" />
    +
    + </a> +

    + +
    +
    top
    +

    ImapBase Áö½Ã¾î

    + + + + + + + + +
    ¼³¸í:À̹ÌÁö¸Ê ÆÄÀÏ¿¡¼­ base ±âº»°ª
    ¹®¹ý:ImapBase map|referer|URL
    ±âº»°ª:ImapBase http://servername/
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®, directory, .htaccess
    Override ¿É¼Ç:Indexes
    »óÅÂ:Base
    ¸ðµâ:mod_imap
    +

    ImapBase Áö½Ã¾î´Â À̹ÌÁö¸Ê ÆÄÀÏ¿¡¼­ + »ç¿ëÇÒ base ±âº»°ªÀ» ¼³Á¤ÇÑ´Ù. À̹ÌÁö¸Ê ÆÄÀÏ + ¾È¿¡¼­ base Áö½Ã¾î¸¦ »ç¿ëÇÏ¸é ¿©±â¼­ ¼³Á¤ÇÑ + °ªÀº ¹«½ÃÇÑ´Ù. µÑ ¸ðµÎ ¾ø´Ù¸é, base ±âº»°ªÀº + http://servername/ÀÌ´Ù.

    + +

    Âü°í

    + +
    +
    top
    +

    ImapDefault Áö½Ã¾î

    + + + + + + + + +
    ¼³¸í:À̹ÌÁö¸Ê¿¡ ¾î´À ¿µ¿ª¿¡µµ ÇØ´çÇÏÁö ¾Ê´Â ÁÂÇ¥¸¦ ÁØ +°æ¿ì ±âº» Çൿ
    ¹®¹ý:ImapDefault error|nocontent|map|referer|URL
    ±âº»°ª:ImapDefault nocontent
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®, directory, .htaccess
    Override ¿É¼Ç:Indexes
    »óÅÂ:Base
    ¸ðµâ:mod_imap
    +

    ImapDefault Áö½Ã¾î´Â À̹ÌÁö¸Ê + ÆÄÀÏ¿¡¼­ »ç¿ëÇÒ default ±âº»°ªÀ» ¼³Á¤ÇÑ´Ù. + À̹ÌÁö¸Ê ÆÄÀÏ ¾È¿¡¼­ default Áö½Ã¾î¸¦ »ç¿ëÇϸé + ¿©±â¼­ ¼³Á¤ÇÑ °ªÀº ¹«½ÃÇÑ´Ù. µÑ ¸ðµÎ ¾ø´Ù¸é, default + ÇൿÀº Ŭ¶óÀ̾ðÆ®¿¡°Ô 204 No Content¸¦ º¸³»´Â + nocontentÀÌ´Ù. ÀÌ °æ¿ì Ŭ¶óÀ̾ðÆ®´Â ¿ø·¡ ÆäÀÌÁö¸¦ + ±×´ë·Î º¸¿©Áà¾ß ÇÑ´Ù.

    + +
    +
    top
    +

    ImapMenu Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:ÁÂÇ¥¾øÀÌ À̹ÌÁö¸Ê ¿äû½Ã ÃëÇÒ Çൿ
    ¹®¹ý:ImapMenu none|formatted|semiformatted|unformatted
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®, directory, .htaccess
    Override ¿É¼Ç:Indexes
    »óÅÂ:Base
    ¸ðµâ:mod_imap
    +

    ImapMenu Áö½Ã¾î´Â À̹ÌÁö¸Ê ÆÄÀÏ¿¡ + À¯È¿ÇÑ ÁÂÇ¥¸¦ ÁÖÁö ¾ÊÀº °æ¿ì ÃëÇÒ ÇൿÀ» °áÁ¤ÇÑ´Ù.

    + +
    +
    none
    +
    ImapMenu°¡ noneÀ̸é, ¸Þ´º¸¦ ¸¸µéÁö¾Ê°í + default ÇൿÀ» ÃëÇÑ´Ù.
    + +
    formatted
    +
    formatted ¸Þ´º´Â °¡Àå °£´ÜÇÑ ¸Þ´º´Ù. + À̹ÌÁö¸Ê ÆÄÀÏÀÇ ÁÖ¼®Àº ¹«½ÃÇÑ´Ù. °¡Àå Å« Ç¥Á¦¿Í ¼öÁ÷¼±À» + Ãâ·ÂÇÏ°í, ¸µÅ©¸¦ ÇÑÁÙ¾¿ Ãâ·ÂÇÑ´Ù. ¸Þ´º´Â ÀÏ°üµÇ°í ÆòÀÌÇϸç, + µð·ºÅ丮 ¸ñ·Ï°ú Èí»çÇÏ´Ù.
    + +
    semiformatted
    +
    semiformatted ¸Þ´º´Â À̹ÌÁö¸Ê ÆÄÀÏ¿¡ + ³ª¿À´Â ÁÖ¼®À» Ãâ·ÂÇÑ´Ù. ºóÁÙÀº HTML Çà¹Ù²ÞÀ¸·Î º¯È¯ÇÑ´Ù. + Ç¥Á¦³ª ¼öÁ÷¼±À» ±×¸®Áö ¾ÊÁö¸¸, ³ª¸ÓÁö´Â formatted + ¸Þ´º¿Í °°´Ù.
    + +
    unformatted
    +
    ÁÖ¼®Àº Ãâ·ÂÇÏ°í, ºóÁÙÀº ¹«½ÃÇÑ´Ù. À̹ÌÁö¸Ê ÆÄÀÏ¿¡ + ÀÖ´Â ³»¿ë¸¸ Ãâ·ÂÇÑ´Ù. À̹ÌÁö¸Ê ÆÄÀÏÀÇ ÁÖ¼®¿¡ ÇÊ¿äÇÑ ¸ðµç + Çà¹Ù²Þ°ú Ç¥Á¦¸¦ Àû¾î¾ß ÇÑ´Ù. ¸Þ´ºÀÇ ¿Ü°üÀ» °¡Àå ÀÚÀ¯ÀÚÁ¦·Î + ²Ù¹Ð ¼ö ÀÖÁö¸¸, À̹ÌÁö¸Ê ÆÄÀÏÀ» »ç½Ç»ó ÀÏ¹Ý ¹®ÀÚÆÄÀÏÀÌ + ¾Æ´Ñ HTML·Î ºÁ¾ß ÇÑ´Ù.
    +
    + +
    +
    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_include.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_include.html new file mode 100644 index 00000000..db272ac7 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_include.html @@ -0,0 +1,9 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_include.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: mod_include.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_include.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_include.html.en new file mode 100644 index 00000000..1d828132 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_include.html.en @@ -0,0 +1,785 @@ + + + +mod_include - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_include

    +
    +

    Available Languages:  en  | + ja 

    +
    + + + + +
    Description:Server-parsed html documents (Server Side Includes)
    Status:Base
    Module Identifier:include_module
    Source File:mod_include.c
    Compatibility:Implemented as an output filter since Apache +2.0
    +

    Summary

    + +

    This module provides a filter which will process files + before they are sent to the client. The processing is + controlled by specially formatted SGML comments, referred to as + elements. These elements allow conditional text, the + inclusion of other files or programs, as well as the setting and + printing of environment variables.

    +
    + +
    top
    +
    +

    Enabling Server-Side Includes

    + + +

    Server Side Includes are implemented by the + INCLUDES filter. If + documents containing server-side include directives are given + the extension .shtml, the following directives will make Apache + parse them and assign the resulting document the mime type of + text/html:

    + +

    + AddType text/html .shtml
    + AddOutputFilter INCLUDES .shtml +

    + +

    The following directive must be given for the directories + containing the shtml files (typically in a + <Directory> section, + but this directive is also valid in .htaccess files if + AllowOverride Options + is set):

    + +

    + Options +Includes +

    + +

    For backwards compatibility, the server-parsed + handler also activates the + INCLUDES filter. As well, Apache will activate the INCLUDES + filter for any document with mime type + text/x-server-parsed-html or + text/x-server-parsed-html3 (and the resulting + output will have the mime type text/html).

    + +

    For more information, see our Tutorial on Server Side Includes.

    +
    top
    +
    +

    PATH_INFO with Server Side Includes

    + + +

    Files processed for server-side includes no longer accept + requests with PATH_INFO (trailing pathname information) + by default. You can use the AcceptPathInfo directive to + configure the server to accept requests with PATH_INFO.

    +
    top
    +
    +

    Basic Elements

    +

    The document is parsed as an HTML document, with special + commands embedded as SGML comments. A command has the syntax:

    + +

    + <!--#element attribute=value + attribute=value ... --> +

    + +

    The value will often be enclosed in double quotes, but single + quotes (') and backticks (`) are also + possible. Many commands only allow a single attribute-value pair. + Note that the comment terminator (-->) should be + preceded by whitespace to ensure that it isn't considered part of + an SSI token. Note that the leading <!--# is one + token and may not contain any whitespaces.

    + +

    The allowed elements are listed in the following table:

    + + + + + + + + + + + + + + + + + + + +
    ElementDescription
    configconfigure output formats
    echoprint variables
    execexecute external programs
    fsizeprint size of a file
    flastmodprint last modification time of a file
    includeinclude a file
    printenvprint all available variables
    setset a value of a variable
    + +

    SSI elements may be defined by modules other than + mod_include. In fact, the exec element is provided by + mod_cgi, and will only be available if this + module is loaded.

    + +

    The config Element

    +

    This command controls various aspects of the parsing. The + valid attributes are:

    + +
    +
    errmsg
    +
    The value is a message that is sent back to the + client if an error occurs while parsing the + document. This overrides any SSIErrorMsg directives.
    + +
    sizefmt
    +
    The value sets the format to be used which displaying + the size of a file. Valid values are bytes + for a count in bytes, or abbrev for a count + in Kb or Mb as appropriate, for example a size of 1024 bytes + will be printed as "1K".
    + +
    timefmt
    +
    The value is a string to be used by the + strftime(3) library routine when printing + dates.
    +
    + + +

    The echo Element

    +

    This command prints one of the include + variables, defined below. If the variable is unset, the result is + determined by the SSIUndefinedEcho directive. Any dates printed are + subject to the currently configured timefmt.

    + +

    Attributes:

    + +
    +
    var
    +
    The value is the name of the variable to print.
    + +
    encoding
    +

    Specifies how Apache should encode special characters + contained in the variable before outputting them. If set + to none, no encoding will be done. If set to + url, then URL encoding (also known as %-encoding; + this is appropriate for use within URLs in links, etc.) will be + performed. At the start of an echo element, + the default is set to entity, resulting in entity + encoding (which is appropriate in the context of a block-level + HTML element, e.g. a paragraph of text). This can be + changed by adding an encoding attribute, which will + remain in effect until the next encoding attribute + is encountered or the element ends, whichever comes first.

    + +

    The encoding attribute must precede the + corresponding var attribute to be effective, and + only special characters as defined in the ISO-8859-1 character + encoding will be encoded. This encoding process may not have the + desired result if a different character encoding is in use.

    + +
    + In order to avoid cross-site scripting issues, you should + always encode user supplied data. +
    +
    +
    + + +

    The exec Element

    +

    The exec command executes a given shell command or + CGI script. It requires mod_cgi to be present + in the server. If Options + IncludesNOEXEC is set, this command is completely + disabled. The valid attributes are:

    + +
    +
    cgi
    +

    The value specifies a (%-encoded) URL-path to + the CGI script. If the path does not begin with a slash (/), + then it is taken to be relative to the current + document. The document referenced by this path is + invoked as a CGI script, even if the server would not + normally recognize it as such. However, the directory + containing the script must be enabled for CGI scripts + (with ScriptAlias + or Options + ExecCGI).

    + +

    The CGI script is given the PATH_INFO and query + string (QUERY_STRING) of the original request from the + client; these cannot be specified in the URL path. The + include variables will be available to the script in addition to + the standard CGI environment.

    + +

    Example

    + <!--#exec cgi="/cgi-bin/example.cgi" --> +

    + +

    If the script returns a Location: header instead of + output, then this will be translated into an HTML anchor.

    + +

    The include virtual + element should be used in preference to exec cgi. In + particular, if you need to pass additional arguments to a CGI program, + using the query string, this cannot be done with exec + cgi, but can be done with include virtual, as + shown here:

    + +

    + <!--#include virtual="/cgi-bin/example.cgi?argument=value" --> +

    +
    + +
    cmd
    +

    The server will execute the given string using + /bin/sh. The include variables are available to the command, in addition + to the usual set of CGI variables.

    + +

    The use of #include virtual is almost always prefered to using + either #exec cgi or #exec cmd. The former + (#include virtual) uses the standard Apache sub-request + mechanism to include files or scripts. It is much better tested and + maintained.

    + +

    In addition, on some platforms, like Win32, and on unix when + using suexec, you cannot pass arguments + to a command in an exec directive, or otherwise include + spaces in the command. Thus, while the following will work under a + non-suexec configuration on unix, it will not produce the desired + result under Win32, or when running suexec:

    + +

    + <!--#exec cmd="perl /path/to/perlscript arg1 arg2" --> +

    +
    +
    + + +

    The fsize Element

    +

    This command prints the size of the specified file, subject + to the sizefmt format specification. Attributes:

    + +
    +
    file
    +
    The value is a path relative to the directory + containing the current document being parsed.
    + +
    virtual
    +
    The value is a (%-encoded) URL-path. If it does not begin with + a slash (/) then it is taken to be relative to the current document. + Note, that this does not print the size of any CGI output, + but the size of the CGI script itself.
    +
    + + +

    The flastmod Element

    +

    This command prints the last modification date of the + specified file, subject to the timefmt format + specification. The attributes are the same as for the + fsize command.

    + + +

    The include Element

    +

    This command inserts the text of another document or file + into the parsed file. Any included file is subject to the + usual access control. If the directory containing the + parsed file has Options + IncludesNOEXEC set, then only documents with + a text MIME type (text/plain, text/html + etc.) will be included. Otherwise CGI scripts are invoked as normal + using the complete URL given in the command, including any query + string.

    + +

    An attribute defines the location of the document; the + inclusion is done for each attribute given to the include + command. The valid attributes are:

    + +
    +
    file
    +
    The value is a path relative to the directory + containing the current document being parsed. It cannot + contain ../, nor can it be an absolute path. + Therefore, you cannot include files that are outside of the + document root, or above the current document in the directory + structure. The virtual attribute should always be + used in preference to this one.
    + +
    virtual
    +

    The value is a (%-encoded) URL-path. The URL cannot contain a + scheme or hostname, only a path and an optional query string. If it + does not begin with a slash (/) then it is taken to be relative to the + current document.

    + +

    A URL is constructed from the attribute, and the output the + server would return if the URL were accessed by the client is + included in the parsed output. Thus included files can be nested.

    + +

    If the specified URL is a CGI program, the program will be + executed and its output inserted in place of the directive in the + parsed file. You may include a query string in a CGI url:

    + +

    + <!--#include virtual="/cgi-bin/example.cgi?argument=value" --> +

    + +

    include virtual should be used in preference + to exec cgi to include the output of CGI programs + into an HTML document.

    +
    +
    + + +

    The printenv Element

    +

    This prints out a listing of all existing variables and + their values. Special characters are entity encoded (see the echo element for details) + before being output. There are no attributes.

    + +

    Example

    + <!--#printenv --> +

    + + +

    The set Element

    +

    This sets the value of a variable. Attributes:

    + +
    +
    var
    +
    The name of the variable to set.
    + +
    value
    +
    The value to give a variable.
    +
    + +

    Example

    + <!--#set var="category" value="help" --> +

    + +
    top
    +
    +

    Include Variables

    + + +

    In addition to the variables in the standard CGI environment, + these are available for the echo command, for + if and elif, and to any program + invoked by the document.

    + +
    +
    DATE_GMT
    +
    The current date in Greenwich Mean Time.
    + +
    DATE_LOCAL
    +
    The current date in the local time zone.
    + +
    DOCUMENT_NAME
    +
    The filename (excluding directories) of the document + requested by the user.
    + +
    DOCUMENT_URI
    +
    The (%-decoded) URL path of the document requested by the + user. Note that in the case of nested include files, this is + not the URL for the current document. Note also that + if the URL is modified internally (e.g. by an alias or directoryindex), the modified + URL is shown.
    + +
    LAST_MODIFIED
    +
    The last modification date of the document requested by + the user.
    + +
    QUERY_STRING_UNESCAPED
    +
    If a query string is present, this variable contains the + (%-decoded) query string, which is escaped for shell + usage (special characters like & etc. are + preceded by backslashes).
    +
    +
    top
    +
    +

    Variable Substitution

    + +

    Variable substitution is done within quoted strings in most + cases where they may reasonably occur as an argument to an SSI + directive. This includes the config, + exec, flastmod, fsize, + include, echo, and set + directives, as well as the arguments to conditional operators. + You can insert a literal dollar sign into the string using backslash + quoting:

    + +

    + <!--#if expr="$a = \$test" --> +

    + +

    If a variable reference needs to be substituted in the + middle of a character sequence that might otherwise be + considered a valid identifier in its own right, it can be + disambiguated by enclosing the reference in braces, + a la shell substitution:

    + +

    + <!--#set var="Zed" value="${REMOTE_HOST}_${REQUEST_METHOD}" --> +

    + +

    This will result in the Zed variable being set + to "X_Y" if REMOTE_HOST is + "X" and REQUEST_METHOD is + "Y".

    + +

    The below example will print "in foo" if the + DOCUMENT_URI is /foo/file.html, "in bar" + if it is /bar/file.html and "in neither" otherwise:

    + +

    + <!--#if expr='"$DOCUMENT_URI" = "/foo/file.html"' -->
    + + in foo
    +
    + <!--#elif expr='"$DOCUMENT_URI" = "/bar/file.html"' -->
    + + in bar
    +
    + <!--#else -->
    + + in neither
    +
    + <!--#endif --> +

    +
    top
    +
    +

    Flow Control Elements

    + + +

    The basic flow control elements are:

    + +

    + <!--#if expr="test_condition" -->
    + <!--#elif expr="test_condition" -->
    + <!--#else -->
    + <!--#endif --> +

    + +

    The if element works like an if statement in a + programming language. The test condition is evaluated and if + the result is true, then the text until the next elif, + else or endif element is included in the + output stream.

    + +

    The elif or else statements are be used + to put text into the output stream if the original + test_condition was false. These elements are optional.

    + +

    The endif element ends the if element + and is required.

    + +

    test_condition is one of the following:

    + +
    +
    string
    +
    true if string is not empty
    + +
    string1 = string2
    + string1 != string2
    + +

    Compare string1 with string2. If + string2 has the form /string2/ + then it is treated as a regular expression. Regular expressions are + implemented by the PCRE engine and + have the same syntax as those in perl + 5.

    + +

    If you are matching positive (=), you can capture + grouped parts of the regular expression. The captured parts are + stored in the special variables $1 .. + $9.

    + +

    Example

    + <!--#if expr="$QUERY_STRING = /^sid=([a-zA-Z0-9]+)/" -->
    + + <!--#set var="session" value="$1" -->
    +
    + <!--#endif --> +

    +
    + +
    string1 < string2
    + string1 <= string2
    + string1 > string2
    + string1 >= string2
    + +
    Compare string1 with string2. Note, that + strings are compared literally (using + strcmp(3)). Therefore the string "100" is less than + "20".
    + +
    ( test_condition )
    +
    true if test_condition is true
    + +
    ! test_condition
    +
    true if test_condition is false
    + +
    test_condition1 && + test_condition2
    +
    true if both test_condition1 and + test_condition2 are true
    + +
    test_condition1 || + test_condition2
    +
    true if either test_condition1 or + test_condition2 is true
    +
    + +

    "=" and "!=" bind more tightly than + "&&" and "||". "!" binds + most tightly. Thus, the following are equivalent:

    + +

    + <!--#if expr="$a = test1 && $b = test2" -->
    + <!--#if expr="($a = test1) && ($b = test2)" --> +

    + +

    The boolean operators && and || + share the same priority. So if you want to bind such an operator more + tightly, you should use parentheses.

    + +

    Anything that's not recognized as a variable or an operator + is treated as a string. Strings can also be quoted: + 'string'. Unquoted strings can't contain whitespace + (blanks and tabs) because it is used to separate tokens such as + variables. If multiple strings are found in a row, they are + concatenated using blanks. So,

    + +

    string1    string2 results in string1 string2
    +
    + and
    +
    + 'string1    string2' results in string1    string2.

    + +

    Escaping slashes in regex strings

    +

    All slashes which are not intended to act as delimiters in your regex must + be escaped. This is regardless of their meaning to the regex engine.

    +
    + + +
    +
    top
    +

    SSIEndTag Directive

    + + + + + + + + +
    Description:String that ends an include element
    Syntax:SSIEndTag tag
    Default:SSIEndTag "-->"
    Context:server config, virtual host
    Status:Base
    Module:mod_include
    Compatibility:Available in version 2.0.30 and later.
    +

    This directive changes the string that mod_include + looks for to mark the end of an include element.

    + +

    Example

    + SSIEndTag "%>" +

    + + +

    See also

    + +
    +
    top
    +

    SSIErrorMsg Directive

    + + + + + + + + + +
    Description:Error message displayed when there is an SSI +error
    Syntax:SSIErrorMsg message
    Default:SSIErrorMsg "[an error occurred while processing this +directive]"
    Context:server config, virtual host, directory, .htaccess
    Override:All
    Status:Base
    Module:mod_include
    Compatibility:Available in version 2.0.30 and later.
    +

    The SSIErrorMsg directive changes the error + message displayed when mod_include encounters an + error. For production servers you may consider changing the default + error message to "<!-- Error -->" so that + the message is not presented to the user.

    + +

    This directive has the same effect as the <!--#config + errmsg=message --> element.

    + +

    Example

    + SSIErrorMsg "<!-- Error -->" +

    + +
    +
    top
    +

    SSIStartTag Directive

    + + + + + + + + +
    Description:String that starts an include element
    Syntax:SSIStartTag tag
    Default:SSIStartTag "<!--#"
    Context:server config, virtual host
    Status:Base
    Module:mod_include
    Compatibility:Available in version 2.0.30 and later.
    +

    This directive changes the string that mod_include + looks for to mark an include element to process.

    + +

    You may want to use this option if you have 2 servers parsing the + output of a file each processing different commands (possibly at + different times).

    + +

    Example

    + SSIStartTag "<%"
    + SSIEndTag "%>" +

    + +

    The example given above, which also specifies a matching + SSIEndTag, will + allow you to use SSI directives as shown in the example + below:

    + +

    SSI directives with alternate start and end tags

    + <%printenv %> +

    + +

    See also

    + +
    +
    top
    +

    SSITimeFormat Directive

    + + + + + + + + + +
    Description:Configures the format in which date strings are +displayed
    Syntax:SSITimeFormat formatstring
    Default:SSITimeFormat "%A, %d-%b-%Y %H:%M:%S %Z"
    Context:server config, virtual host, directory, .htaccess
    Override:All
    Status:Base
    Module:mod_include
    Compatibility:Available in version 2.0.30 and later.
    +

    This directive changes the format in which date strings are displayed + when echoing DATE environment variables. The + formatstring is as in strftime(3) from the + C standard library.

    + +

    This directive has the same effect as the <!--#config + timefmt=formatstring --> element.

    + +

    Example

    + SSITimeFormat "%R, %B %d, %Y" +

    + +

    The above directive would cause times to be displayed in the + format "22:26, June 14, 2002".

    + +
    +
    top
    +

    SSIUndefinedEcho Directive

    + + + + + + + + +
    Description:String displayed when an unset variable is echoed
    Syntax:SSIUndefinedEcho string
    Default:SSIUndefinedEcho "(none)"
    Context:server config, virtual host
    Status:Base
    Module:mod_include
    Compatibility:Available in version 2.0.34 and later.
    +

    This directive changes the string that mod_include + displays when a variable is not set and "echoed".

    + +

    Example

    + SSIUndefinedEcho "<!-- undef -->" +

    + +
    +
    top
    +

    XBitHack Directive

    + + + + + + + + +
    Description:Parse SSI directives in files with the execute bit +set
    Syntax:XBitHack on|off|full
    Default:XBitHack off
    Context:server config, virtual host, directory, .htaccess
    Override:Options
    Status:Base
    Module:mod_include
    +

    The XBitHack directive controls the parsing + of ordinary html documents. This directive only affects files associated + with the MIME type text/html. XBitHack can take on the following values:

    + +
    +
    off
    +
    No special treatment of executable files.
    + +
    on
    +
    Any text/html file that has the user-execute bit + set will be treated as a server-parsed html document.
    + +
    full
    +
    As for on but also test the group-execute bit. + If it is set, then set the Last-modified date of the + returned file to be the last modified time of the file. If + it is not set, then no last-modified date is sent. Setting + this bit allows clients and proxies to cache the result of + the request. + +

    Note

    +

    You would not want to use the full option, unless you assure the + group-execute bit is unset for every SSI script which might #include a CGI or otherwise produces different output on + each hit (or could potentially change on subsequent requests).

    +
    +
    +
    + + +
    +
    +
    +

    Available Languages:  en  | + ja 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_include.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_include.html.ja.utf8 new file mode 100644 index 00000000..5ba814a5 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_include.html.ja.utf8 @@ -0,0 +1,762 @@ + + + +mod_include - Apache HTTP サーバ + + + + + + +
    <-
    + +
    +

    Apache モジュール mod_include

    +
    +

    Available Languages:  en  | + ja 

    +
    +
    This translation may be out of date. Check the + English version for recent changes.
    + + + + +
    説明:サーバがパースする html ドキュメント (Server Side Includes)
    ステータス:Base
    モジュール識別子:include_module
    ソースファイル:mod_include.c
    互換性:Apache 2.0 から出力フィルタとして実装されました。
    +

    概要

    + +

    このモジュールはファイルがクライアントに送られる前に処理するフィルタを + 提供します。処理の内容は要素と呼ばれる特別な形式の SGML コメントにより + 制御されます。これらの要素は条件分岐や、他のファイルや + プログラムの出力の取り込み、環境変数の設定や表示を行なうことが + できます。

    +
    + +
    top
    +
    +

    Server-Side Includes を有効にする

    + + +

    Server Side Includes は INCLUDES + フィルタ により実装されています。 + Server-side include のディレクティブを含むドキュメントの拡張子が + .shtml の場合、以下のディレクティブでは Apache がそれらを + パースして、その結果できるドキュメントに text/html の + MIME タイプを割り当てます:

    + +

    + AddType text/html .shtml
    + AddOutputFilter INCLUDES .shtml +

    + +

    以下のディレクティブは shtml ファイルのあるディレクトリで指定されている + 必要があります (通常は <Directory> セクションで指定しますが、 + AllowOverride Options + が設定されていると、.htaccess ファイルに書くこともできます):

    + +

    + Options +Includes +

    + +

    互換性を保つために、server-parsed + ハンドラ も INCLUDES フィルタを + 有効にします。MIME タイプ text/x-server-parsed-html や + text/x-server-parsed-html3 のドキュメントに対しても + Apache は INCLUDES フィルタを有効にします (出力されるものは + MIME タイプ text/html になります)。

    + +

    詳しい情報は Tutorial on Server Side Includes.

    +
    top
    +
    +

    サーバサイドインクルード (SSI) での PATH_INFO

    + + +

    SSI で処理されるファイルはデフォルトでは PATH_INFO + (後続のパス名情報) + 付きのリクエストを受け入れなくなりました。AcceptPathInfo ディレクティブで + PATH_INFO 付きのリクエストを受け入れるようにサーバを + 設定できます。

    +
    top
    +
    +

    基本要素

    +

    ドキュメントは、SGML のコメントとして特別なコマンドが埋め込まれた + HTML ドキュメントとしてパースされます。コマンドの構文は次のように + なっています:

    + +

    + <!--#element attribute=value + attribute=value ... --> +

    + +

    値 (訳注: value) は二重引用符で囲むのが一般的ですが、 + シングルクオート (') とバッククオート (`) も使用できます。 + 多くのコマンドは属性-値 (訳注: attribute-value) の組を一つだけ指定できます。 + コメントの終わり (-->) + の前には、SSI の句の一部だと解釈されないようにするために空白を + 入れてください。最初の <!--# はまとめて一つの + 句で、空白をふくんではいけないこと注意してください。

    + +

    要素 (訳注: element) を以下の表に示します。

    + + + + + + + + + + + + + + + + + + + +
    要素説明
    configconfigure output formats
    echoprint variables
    execexecute external programs
    fsizeprint size of a file
    flastmodprint last modification time of a file
    includeinclude a file
    printenvprint all available variables
    setset a value of a variable
    + +

    SSI 要素は mod_include 以外のモジュールで + 定義されることもあります。実際、 + exec 要素は + mod_cgi で提供されていて、このモジュールが + ロードされる場合にのみ利用可能となります。

    + +

    config 要素

    +

    次のコマンドは解析の様々な側面を制御します。属性は次の通りです。

    + +
    +
    errmsg
    +
    この値が、ドキュメントの解析中にエラーが発生した時に + クライアントに送信されるメッセージになります。これは + SSIErrorMsg + ディレクティブを上書きします。
    + +
    sizefmt
    +
    この値は、ファイルのサイズを表示する際に使用する + フォーマットを設定します。値は バイトカウントの + bytesか、Kb や Mb を優先的に使用する + abbrec (例えば 1024 バイトは "1K" と表示されます) + です。
    + +
    timefmt
    +
    この値は strftime(3) ライブラリルーチンが + 日時をプリントする際に用いられます。
    +
    + + +

    echo 要素

    +

    このコマンドは以下で定義されている include + 変数 を表示します。変数が設定されていない場合は SSIUndefinedEcho ディレクティブで + 決定される結果となります。日付はその時点での timefmt に従って + 表示されます。属性は次の通りです。

    + +
    +
    var
    +
    値は表示する変数の名前です。
    + +
    encoding
    +

    変数を出力する前に、変数中の特別文字をどのようにエンコードするかを + 指定します。none に設定されていると、エンコードは行なわれません。 + url に設定されていると、URL エンコード (%-エンコードとも + 呼ばれています。これはリンク等の URL の使用に適切です) が + 行なわれます。echo 要素の開始時は、デフォルトは + entity に設定されています。これはエンティティエンコード + (段落やテキストなどのブロックレベルの HTML エレメントのコンテキストに + 適しています) を行ないます。これは encoding 属性 + を加えることで変更できます。変更は次の encoding 属性か、 + 要素の終了まで効力を持ちます。

    + +

    encoding 属性はエンコードの変更をしたい var + の前に ある必要があることに注意してください。 + また、ISO-8859-1 エンコーディングで + 定義されている特別な文字だけがエンコードされます。 + 別の文字のエンコーディングの場合は、このエンコーディングは + 望みの結果にならないかもしれません。

    + +
    + クロスサイトスクリプティングの問題を避けるために、 + 常にユーザからのデータをエンコードすべきです。 +
    +
    +
    + + +

    exec 要素

    +

    exec コマンドは指定されたシェルコマンドや CGI スクリプトを + 実行します。mod_cgi がサーバに組み込まれているいなければ + なりません。Option + IncludesNOEXEC はこのコマンドを無効にします。 + 使用可能な属性は次の通りです。

    + +
    +
    cgi
    +

    値は (%-エンコードされた) URL を指定します。パスが + スラッシュ (/) で始まらないときは、ドキュメントからの + 相対パスとして扱われます。このパスで参照されているドキュメントは + サーバが CGI スクリプトとして扱っていなくても CGI スクリプトとして + 起動されます。ただし、スクリプトのあるディレクトリでは + (ScriptAlias + や Option ExecCGI + によって) CGI スクリプトの使用が許可されている必要があります。

    + +

    CGI スクリプトには、クライアントからの元々のリクエストの + PATH_INFO とクエリー文字列 (QUERY_STRING) が渡されます。 + これらは URL パスとして特定できないものです。 + スクリプトは標準 CGI 環境に加えて、include 変数を + 使用することができます。

    + +

    例

    + <!--#exec cgi="/cgi-bin/example.cgi" --> +

    + +

    スクリプトが、出力の代わりに Location: ヘッダを返すと、 + HTML のアンカー (訳注:リンク) に変換されます。

    + +

    exec cgi よりも、 + include virtual + の方を使うようにしてください。特に、CGI への追加の引数を + クエリー文字列を使って渡すことは exec cgi は + できませんが、include virtual は以下のようにして + 可能です。

    + +

    + <!--#include virtual="/cgi-bin/example.cgi?argument=value" --> +

    +
    + +
    cmd
    +

    サーバは指定された文字列を /bin/sh を使って + 実行します。コマンドは通常の CGI 変数に加えて include 変数も使うことができます。

    + +

    ほとんどの場合、#include + virtual を使う方が #exec cgi や #exec + cmd を使うよりも良いです。前者 (#include virtual) + は標準の Apache のサブリクエスト機構を使ってファイルやスクリプトの + 出力を取り込みます。 + こちらの方がよくテストされメンテナンスされた方法です。

    + +

    さらに、Win32 のようないくつかのプラットフォームや、suexec を使っている unix では、 + exec ディレクティブのコマンドに + 引数を渡したり、コマンドに空白を入れることはできません。 + ですから、以下のものは unix の suexec でない設定では動作しますが、 + Win32 や suexec を使っている unix では期待した結果にはなりません:

    + +

    + <!--#exec cmd="perl /path/to/perlscript arg1 arg2" --> +

    +
    +
    + + +

    fsize 要素

    +

    このコマンドは指定されたファイルの大きさを sizefmt の + 書式指定に基づいて出力します。属性は次の通りです。

    + +
    +
    file
    +
    値は解析されているドキュメントの存在するディレクトリからの + 相対パスです。
    + +
    virtual
    +
    値は (% エンコードされた) URL-path です。スラッシュ (/) で + 始まらないときはドキュメントからの相対パスとして扱われます。 + CGI の出力のサイズはプリントされません。CGI + スクリプト自体のサイズがプリントされることに注意してください。
    +
    + + +

    flastmod 要素

    +

    このコマンドは指定されたファイルの最終修正時刻を + timefmt 書式指定に従って表示します。 + 指定可能な属性は fsize コマンドと同じです。

    + + +

    include 要素

    +

    このコマンドは別の文書やファイルのテキストを解析しているファイルに + 挿入します。挿入されるファイルはアクセス制御の管理下にあります。 + 解析しているファイルの存在するディレクトリに + Option IncludesNOEXEC + が設定されている場合、text MIME タイプ (text/plain, + text/html 等) のドキュメントのみインクルードが行なわれます。 + その他の場合は、クエリー文字列も含め、コマンドで指定された + 完全な URL を使って普通に CGI スクリプトが呼び出されます。

    + +

    属性が文書の位置を指定します。include コマンドに与えられたそれぞれの + 属性に対して挿入作業が行なわれます。有効な属性は次の通りです。

    + +
    +
    file
    +
    値は解析されているドキュメントの存在するディレクトリからの + 相対パスです。 + ../ を含んでいたり、絶対パスを指定したりはできません。 + ですから、ドキュメントルートの外にあるファイルや、ディレクトリ構造で + 上位にあるファイルを挿入することはできません。 + 常にこの属性よりは、virtual 属性を使うようにしてください。 +
    + +
    virtual
    +

    値は解析されているドキュメントからの (% エンコードされた) URL + です。URL にはスキームやホスト名を含めることはできません。パスと、 + もしあればクエリー文字列を指定できるだけです。スラッシュ (/) から + 始まらない場合は、ドキュメントからの相対パスとして扱われます。

    + +

    URL は属性から作られ、その URL をクライアントがアクセスしたときに + 出力される内容が解析後の出力に含められます。ですから、挿入される + ファイルは入れ子構造にすることができます。

    + +

    指定された URL が CGI プログラムであった場合は、 + プログラムが実行され、その出力が解析しているファイル中の + ディレクティブがあった位置に挿入されます。CGI の url に + クエリー URL を入れることもできます。

    + +

    + <!--#include virtual="/cgi-bin/example.cgi?argument=value" --> +

    + +

    HTML ドキュメントに CGI プログラムの出力を含める方法としては、 + include virtual の方が exec cgi よりも + 好ましい方法です。

    +
    +
    + + +

    printenv 要素

    +

    これは、存在するすべての変数とその値を表示します。Apache 1.3.12 から、 + 特別な文字は出力される前にエンティティエンコード (詳細は echo 要素を参照) + されるようになりました。属性はありません。

    + +

    例

    + <!--#printenv --> +

    + + +

    set 要素

    +

    これは変数の値を設定します。属性は次の通りです。

    + +
    +
    var
    +
    設定する変数の名前。
    + +
    value
    +
    変数に設定する値。
    +
    + +

    例

    + <!--#set var="category" value="help" --> +

    + +
    top
    +
    +

    Include 変数

    + + +

    標準 CGI 環境の変数に加えて、echo コマンドや、 + if や elif, それにドキュメントから呼び出される + すべてのプログラムから使用できる変数があります。

    + +
    +
    DATE_GMT
    +
    グリニッジ標準時による現在時刻。
    + +
    DATE_LOCAL
    +
    ローカルの標準時による現在時刻。
    + +
    DOCUMENT_NAME
    +
    ユーザがリクエストした (ディレクトリを除いた) ファイル名。
    + +
    DOCUMENT_URI
    +
    ユーザがリクエストした (% エンコードされた) URL-path。 + 挿入ファイルが入れ子になっている場合は、解析されている + ドキュメントの URL ではないことに注意してください。
    + +
    LAST_MODIFIED
    +
    ユーザがリクエストしたドキュメントの最終修正時刻。
    + +
    QUERY_STRING_UNESCAPED
    +
    クエリー文字列がある場合、この変数には (%-デコードされた) + クエリー文字列が代入されていて、shell で使用できるように + エスケープされています (& + といった特殊文字にはバックスラッシュが直前に置かれます)。
    +
    +
    top
    +
    +

    変数置換

    + +

    変数置換はたいていの場合 SSI ディレクティブの引数として妥当な場所にある + 引用符で囲まれた文字列中で行なわれます。これに該当するものには、 + config, + exec, flastmod, fsize, + include, echo, set の + 各ディレクティブと、条件分岐用のオペレータへの引数があります。 + ドル記号はバックスラッシュを使うことで使うことができます:

    + +

    + <!--#if expr="$a = \$test" --> +

    + +

    変数名としてみなされる文字列の中で変数への参照を置換する必要があるときは、 + シェルでの変数置換のように、中括弧で括ることで区別することができます:

    + +

    + <!--#set var="Zed" value="${REMOTE_HOST}_${REQUEST_METHOD}" --> +

    + +

    この例では、REMOTE_HOST が + "X" で REQUEST_METHOD が + "Y" のときに変数 Zed を "X_Y" + に設定します。

    + +

    以下の例では、DOCUMENT_URI が /foo/file.html + のときに "in foo" を、/bar/file.html のときに "in bar" を、 + どちらでもないときには "in neither" を表示します。

    + +

    + <!--#if expr='"$DOCUMENT_URI" = "/foo/file.html"' -->
    + + in foo
    +
    + <!--#elif expr='"$DOCUMENT_URI" = "/bar/file.html"' -->
    + + in bar
    +
    + <!--#else -->
    + + in neither
    +
    + <!--#endif --> +

    +
    top
    +
    +

    フロー制御要素

    + + +

    基本的なフローコントロール要素は次の通りです。

    + +

    + <!--#if expr="test_condition" -->
    + <!--#elif expr="test_condition" -->
    + <!--#else -->
    + <!--#endif --> +

    + +

    if 要素はプログラミング言語の + if 文と同じように動作します。条件が評価され、結果が真であれば次の + elif か else か endif + 要素までの文字列が出力に挿入されます。

    + +

    elif や else 文は test_condition + が偽のときにテキストを出力に挿入するために使われます。 + これらの要素はあってもなくても構いません。

    + +

    endif 要素は if + 要素を終了させます。この要素は必須です。

    + +

    test_condition は以下のどれかです:

    + +
    +
    string
    +
    string が空でない場合に真です
    + +
    string1 = string2
    + string1 == string2
    + string1 != string2
    + +

    string1 と string2 を比較します。 + string2 が /string/ + という形式であれば、正規表現として比較されます。正規表現は + PCRE エンジンで実装されていて、 + perl 5 と同じ構文を使用します。 + == は単に = の別名で、まったく同じ動作を + します。

    + +

    正のマッチング (= または ==) の場合は、 + 正規表現でグループ分けされたパーツをキャプチャすることができます。 + キャプチャされた部分は特殊変数 $1 .. $9 + に格納されます。

    + +

    例

    + <!--#if expr="$QUERY_STRING = /^sid=([a-zA-Z0-9]+)/" -->
    + + <!--#set var="session" value="$1" -->
    +
    + <!--#endif --> +

    +
    + +
    string1 < string2
    + string1 <= string2
    + string1 > string2
    + string1 >= string2
    + +
    string1 と string2 を比較します。 + 文字列として比較される (strcmp(3) を使用) + ことに注意してください。ですから、文字列 "100" は "20" + よりも小さいことになります。
    + +
    ( test_condition )
    +
    test_condition が真のとき、真
    + +
    ! test_condition
    +
    test_condition が偽のとき、真
    + +
    test_condition1 && + test_condition2
    +
    test_condition1 かつ + test_condition2 が真のとき、真
    + +
    test_condition1 || + test_condition2
    +
    test_condition1 または + test_condition2 が真のとき、真
    +
    + +

    "=" と "!=" の方が "&&" より + きつく束縛します。"!" の束縛が一番きつくなっています。 + ですから以下の二つは等価です:

    + +

    + <!--#if expr="$a = test1 && $b = test2" -->
    + <!--#if expr="($a = test1) && ($b = test2)" --> +

    + +

    真偽値オペレータ && と || + は同じ優先度です。 + これらのオペレータで一方により強い優先度をつけたい場合には、 + 括弧を使う必要があります。

    + +

    変数やオペレータとして認識されないものはすべて文字列として + 扱われます。文字列は引用符で囲むこともできます: 'string' + のように。引用符で囲まれていない文字列には空白 (スペースとタブ) + を含めることはできません。それらは変数などの句を分離するために + 使われているからです。複数の文字列が続いているときは、 + 空白を間に入れて一つにくっつけられます。ですから、

    + +

    string1    string2 は string1 string2 になります。
    +
    + また、
    +
    + 'string1    string2' は string1    string2 + になります。

    +
    +
    top
    +

    SSIEndTag ディレクティブ

    + + + + + + + + +
    説明:include 要素を終了させる文字列
    構文:SSIEndTag tag
    デフォルト:SSIEndTag "-->"
    コンテキスト:サーバ設定ファイル, バーチャルホスト
    ステータス:Base
    モジュール:mod_include
    互換性:2.0.30 以降で利用可能
    +

    このディレクティブは mod_include が探す、 + include 要素の終了を示す文字列を変更します。

    + +

    例

    + SSIEndTag "%>" +

    + + +

    参照

    + +
    +
    top
    +

    SSIErrorMsg ディレクティブ

    + + + + + + + + + +
    説明:SSI のエラーがあったときに表示されるエラーメッセージ
    構文:SSIErrorMsg message
    デフォルト:SSIErrorMsg "[an error occurred while processing this +directive]"
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:All
    ステータス:Base
    モジュール:mod_include
    互換性:バージョン 2.0.30 以降で使用可能
    +

    SSIErrorMsg ディレクティブは mod_include + がエラーが起こったときに表示するメッセージを変更します。プロダクションサーバでは + メッセージがユーザに表示されないようにするために + デフォルトエラーメッセージを "<!-- Error -->" + に変えるというようなことを考えるかもしれません。

    + +

    このディレクティブは <!--#config + errmsg=message --> 要素と同じ効果になります。

    + +

    例

    + SSIErrorMsg "<!-- Error -->" +

    + +
    +
    top
    +

    SSIStartTag ディレクティブ

    + + + + + + + + +
    説明:include 要素を開始する文字列
    構文:SSIStartTag tag
    デフォルト:SSIStartTag "<!--#"
    コンテキスト:サーバ設定ファイル, バーチャルホスト
    ステータス:Base
    モジュール:mod_include
    互換性:バージョン 2.0.30 以降で使用可能
    + +

    このディレクティブは mod_include が探す、include + 要素の開始を示す文字列を変更します。

    + +

    二つのサーバで (もしかすると別々の段階で) ファイルの出力を解析していて、 + それぞれに違うコマンドを処理させたい、 + というようなときにこのオプションを使います。

    + +

    例

    + SSIStartTag "<%"
    + SSIEndTag "%>" +

    + +

    上の例のように対応する + SSIEndTag を併せて使うと、 + 下に示す例のように SSI ディレクティブを使えます:

    + +

    違う開始と終了のタグを使った SSI ディレクティブ

    + <%printenv %> +

    + +

    参照

    + +
    +
    top
    +

    SSITimeFormat ディレクティブ

    + + + + + + + + + +
    説明:日付けを現す文字列の書式を設定する
    構文:SSITimeFormat formatstring
    デフォルト:SSITimeFormat "%A, %d-%b-%Y %H:%M:%S %Z"
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:All
    ステータス:Base
    モジュール:mod_include
    互換性:2.0.30 以降で使用可能
    +

    このディレクティブは DATE 環境変数を echo して日付を現す文字列が + 表示されるときの書式を変更します。formatstring は + C 標準ライブラリの strftime(3) と同じ形式です。

    + +

    このディレクティブは <!--#config + timefmt=formatstring --> 要素と同じ効果になります。

    + +

    例

    + SSITimeFormat "%R, %B %d, %Y" +

    + +

    上のディレクティブでは、日付は "22:26, June 14, 2002" という + 形式で表示されます。

    + +
    +
    top
    +

    SSIUndefinedEcho ディレクティブ

    + + + + + + + + + +
    説明:未定義の変数が echo されたときに表示される文字列
    構文:SSIUndefinedEcho string
    デフォルト:SSIUndefinedEcho "(none)"
    コンテキスト:サーバ設定ファイル, バーチャルホスト
    上書き:All
    ステータス:Base
    モジュール:mod_include
    互換性:2.0.34 以降で利用可能
    +

    このディレクティブは変数が定義されていないにも関わらず + "echo" されたときに mod_include + が表示する文字列を変更します。

    + +

    例

    + SSIUndefinedEcho "<!-- undef -->" +

    + +
    +
    top
    +

    XBitHack ディレクティブ

    + + + + + + + + +
    説明:実行ビットが設定されたファイルの SSI ディレクティブを +解析する
    構文:XBitHack on|off|full
    デフォルト:XBitHack off
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:Options
    ステータス:Base
    モジュール:mod_include
    +

    XBitHack ディレクティブは通常の HTML + ドキュメントの解析を制御します。このディレクティブは MIME タイプ + text/html と関連付けられているファイルにのみ影響します。 + XBitHack は以下の値をとることができます。

    + +
    +
    off
    +
    実行可能ファイルに対して特別な扱いをしません。
    + +
    on
    +
    ユーザの実行ビットが設定されている text/html + ファイルは全てサーバで解析する html ドキュメントとして扱われます。
    + +
    full
    +
    on と同様ですが、グループ実行ビットもテストします。 + もしそれが設定されていれば、返されるファイルの Last-modified の + 日付をファイルの最終修正時刻にします。それが設定されていないときは、 + last-modified の日付は送られません。このビットを設定すると、 + クライアントやプロキシがリクエストをキャッシュできるようになります。 + +
    注意 他の CGI を #include + するかもしれないものや、各アクセスに対して違う出力を生成する + (もしくは後のリクエストで変わるかもしれないもの) + すべての SSI スクリプトに対してグループ実行ビットが + 設定されていないことを確認できない場合は、full は使わない方が良い + でしょう。
    +
    +
    + + +
    +
    +
    +

    Available Languages:  en  | + ja 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_info.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_info.html new file mode 100644 index 00000000..2b70dae6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_info.html @@ -0,0 +1,13 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_info.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: mod_info.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: mod_info.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_info.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_info.html.en new file mode 100644 index 00000000..b7ad45a3 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_info.html.en @@ -0,0 +1,128 @@ + + + +mod_info - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_info

    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + + + +
    Description:Provides a comprehensive overview of the server +configuration
    Status:Extension
    Module Identifier:info_module
    Source File:mod_info.c
    +

    Summary

    + +

    To configure mod_info, add the following to your + httpd.conf file.

    + +

    + <Location /server-info>
    + + SetHandler server-info
    +
    + </Location> +

    + +

    You may wish to use mod_access inside the + <Location> + directive to limit access to your server configuration + information:

    + +

    + <Location /server-info>
    + + SetHandler server-info
    + Order deny,allow
    + Deny from all
    + Allow from yourcompany.com
    +
    + </Location> +

    + +

    Once configured, the server information is obtained by + accessing http://your.host.dom/server-info

    + +
    + Note that the configuration files are read by the + module at run-time, and therefore the display may + not reflect the running server's active + configuration if the files have been changed since the server + was last reloaded. Also, the configuration files must be + readable by the user as which the server is running (see the + User directive), or + else the directive settings will not be listed. + +

    It should also be noted that if + mod_info is compiled into the server, its + handler capability is available in all configuration + files, including per-directory files (e.g., + .htaccess). This may have security-related + ramifications for your site.

    + +

    In particular, this module can leak sensitive information + from the configuration directives of other Apache modules such as + system paths, usernames/passwords, database names, etc. Due to + the way this module works there is no way to block information + from it. Therefore, this module should only be + used in a controlled environment and always with caution.

    +
    +
    +

    Directives

    + +
    + +
    top
    +

    AddModuleInfo Directive

    + + + + + + + +
    Description:Adds additional information to the module +information displayed by the server-info handler
    Syntax:AddModuleInfo module-name string
    Context:server config, virtual host
    Status:Extension
    Module:mod_info
    Compatibility:Apache 1.3 and above
    +

    This allows the content of string to be shown as + HTML interpreted, Additional Information for + the module module-name. Example:

    + +

    + AddModuleInfo mod_auth.c 'See <a \
    + + href="http://www.apache.org/docs/2.0/mod/mod_auth.html">\
    + http://www.apache.org/docs/2.0/mod/mod_auth.html</a>' +
    +

    + +
    +
    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_info.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_info.html.ja.utf8 new file mode 100644 index 00000000..eeca181e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_info.html.ja.utf8 @@ -0,0 +1,118 @@ + + + +mod_info - Apache HTTP サーバ + + + + + + +
    <-
    + +
    +

    Apache モジュール mod_info

    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    +
    This translation may be out of date. Check the + English version for recent changes.
    + + + +
    説明:サーバの設定の包括的な概観を提供する
    ステータス:Extension
    モジュール識別子:info_module
    ソースファイル:mod_info.c
    +

    概要

    + + +

    mod_info を設定するには、以下を httpd.conf + ファイルに加えます。

    + +

    +<Location /server-info>
    +SetHandler server-info
    +</Location>
    +

    + +

    サーバ設定の情報へのアクセスを制限するために、 + <Location> + ディレクティブの中に <Limit> + 節を入れるとよいかもしれません。

    + +

    一旦設定すると、http://your.host.dom/server-info + をアクセスすることでサーバの情報を得られるようになります。

    + +
    +

    このモジュールは実行時に設定ファイルを読み込みます。 + サーバの設定ファイルが最後にサーバに読み込まれた後に変更されている + 場合には、表示されている内容は実行されているサーバの設定を反映して + いないかもしれないことに注意してください。 + また、設定ファイルはサーバが実行されているユーザの権限で + 読み込み許可が与えられている必要があります + (User + ディレクティブを参照してください)。 + でなければ、ディレクティブの設定は表示されません。

    + +

    mod_info + がサーバに組み込まれている場合は、ディレクトリ毎のファイル + (例えば、.htaccess) を含むすべての設定ファイルで + ハンドラを使用可能であるということにも注意してください。 + これは、あなたのサイトではセキュリティに関連した問題があるかもしれません。 +

    + +

    特に、このモジュールはシステムパス、ユーザ名/パスワード、 + データベース名など、他の Apache モジュールの設定ディレクティブから + セキュリティ上微妙な情報を漏らす可能性があります。 + このモジュールの動作方法のせいで、情報の流出を防ぐ方法はありません。 + ですから、このモジュールはちゃんとアクセスが制御された環境で、 + 注意して使ってください。

    +
    +
    +

    ディレクティブ

    + +
    + +
    top
    +

    AddModuleInfo ディレクティブ

    + + + + + + + +
    説明:server-info ハンドラにより表示されるモジュールの情報に +追加の情報を付け加える
    構文:AddModuleInfo module-name string
    コンテキスト:サーバ設定ファイル, バーチャルホスト
    ステータス:Extension
    モジュール:mod_info
    互換性:Apache 1.3 以降
    +

    これは、string の内容がモジュール module-name + の追加情報 として HTML + として解釈され、表示されるようにします。例:

    + +

    + AddModuleInfo mod_authn_file.c 'See <a \
    + + href="http://www.apache.org/docs/2.0/mod/mod_authn_file.html">\
    + http://www.apache.org/docs/2.0/mod/mod_authn_file.html</a>' +
    +

    + +
    +
    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_info.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_info.html.ko.euc-kr new file mode 100644 index 00000000..8619c013 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_info.html.ko.euc-kr @@ -0,0 +1,112 @@ + + + +mod_info - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    ¾ÆÆÄÄ¡ ¸ðµâ mod_info

    +
    +

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

    +
    +
    ÀÌ ¹®¼­´Â ÃÖ½ÅÆÇ ¹ø¿ªÀÌ ¾Æ´Õ´Ï´Ù. + ÃÖ±Ù¿¡ º¯°æµÈ ³»¿ëÀº ¿µ¾î ¹®¼­¸¦ Âü°íÇϼ¼¿ä.
    + + + +
    ¼³¸í:¼­¹ö ¼³Á¤¿¡ ´ëÇÑ Á¾ÇÕÀûÀÎ Á¤º¸¸¦ º¸¿©ÁØ´Ù
    »óÅÂ:Extension
    ¸ðµâ¸í:info_module
    ¼Ò½ºÆÄÀÏ:mod_info.c
    +

    ¿ä¾à

    + +

    mod_info¸¦ »ç¿ëÇÏ·Á¸é httpd.conf + ÆÄÀÏ¿¡ ´ÙÀ½°ú °°ÀÌ Ãß°¡ÇÑ´Ù.

    + +

    + <Location /server-info>
    + + SetHandler server-info
    +
    + </Location> +

    + +

    ¼­¹ö ¼³Á¤ Á¤º¸¸¦ ¾Æ¹«³ª º¼ ¼ö ¾øµµ·Ï <Location> Áö½Ã¾î ¾È¿¡ <Limit> ±¸¹®À» Ãß°¡ÇÒ + ¼ö ÀÖ´Ù.

    + +

    ÀÌ·¸°Ô ¼³Á¤Çϸé + http://your.host.dom/server-info¿¡ + Á¢±ÙÇÏ¿© ¼­¹ö¿¡ ´ëÇÑ Á¤º¸¸¦ º¼ ¼ö ÀÖ´Ù.

    + +
    + ¸ðµâÀº ¼­¹ö°¡ ½ÃÀÛÇÒ¶§ ¼³Á¤ÆÄÀÏÀ» Àб⶧¹®¿¡, ¼­¹ö¸¦ Àç½ÃÀÛÇÑ + ÈÄ¿¡ ÆÄÀÏÀ» ¼öÁ¤ÇÏ¿´´Ù¸é È­¸é¿¡ Ç¥½ÃµÈ Á¤º¸°¡ ½ÇÇàÁßÀÎ + ¼­¹öÀÇ ½ÇÁ¦ ¼³Á¤°ú ´Ù¸¦ ¼ö ÀÖ´Ù. ¶Ç, ¼³Á¤ÆÄÀÏÀº + ¼­¹ö¸¦ ½ÇÇàÇÏ´Â »ç¿ëÀÚ(User Áö½Ã¾î Âü°í)°¡ ÀÐÀ» + ¼ö ÀÖ¾î¾ß ÇÑ´Ù. ÀÐÀ» ¼ö ¾ø´Ù¸é Áö½Ã¾î ¼³Á¤À» º¸¿©ÁÖÁö + ¸øÇÑ´Ù. + +

    ¼­¹ö¿¡ mod_info°¡ ÄÄÆÄÀϵÇÀÖ´Ù¸é, + µð·ºÅ丮º° ¼³Á¤ÆÄÀÏ(¿¹¸¦ µé¾î, + .htaccess)À» Æ÷ÇÔÇÑ ¸ðµç ¼³Á¤ÆÄÀÏ¿¡¼­ + ÀÌ Çڵ鷯 ±â´ÉÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù. ±×·¡¼­ »çÀÌÆ®¿¡ º¸¾È°ü·Ã + ¹®Á¦°¡ µÉ ¼ö ÀÖ´Ù.

    + +

    ƯÈ÷ ÀÌ ¸ðµâÀº ½Ã½ºÅÛ °æ·Î, »ç¿ëÀÚ¸í/¾ÏÈ£, µ¥ÀÌÅͺ£À̽º + À̸§°ú °°ÀÌ ¿©·¯ ¾ÆÆÄÄ¡ ¸ðµâÀÇ ¼³Á¤Áö½Ã¾î¿¡ ±â·ÏÇÑ ¹Î°¨ÇÑ + Á¤º¸¸¦ À¯ÃâÇÒ ¼ö ÀÖ´Ù. ¸ðµâÀÌ µ¿ÀÛÇÏ´Â ¹æ½Ä»ó À̸¦ ¸·À» + ¹æ¹ýÀÌ ¾ø´Ù. ±×·¡¼­ ÀÌ ¸ðµâÀº Ç×»ó ÁÖÀÇÇØ¾ß Çϸç ÅëÁ¦µÈ + ȯ°æ¿¡¼­¸¸ »ç¿ëÇØ¾ß ÇÑ´Ù.

    +
    +
    +

    Áö½Ã¾îµé

    + +
    + +
    top
    +

    AddModuleInfo Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:¸ðµâ¿¡ ´ëÇÑ Ãß°¡ Á¤º¸¸¦ server-info Çڵ鷯°¡ º¸¿©ÁÖµµ·Ï +Ãß°¡ÇÑ´Ù
    ¹®¹ý:AddModuleInfo module-name string
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®
    »óÅÂ:Extension
    ¸ðµâ:mod_info
    Áö¿ø:¾ÆÆÄÄ¡ 1.3 ÀÌÈÄ
    +

    module-name ¸ðµâ¿¡ ´ëÇÑ Ãß°¡ Á¤º¸·Î + stringÀÇ ³»¿ëÀ» HTML·Î º¸¿©ÁØ´Ù. ¿¹¸¦ µé¾î,

    + +

    + AddModuleInfo mod_auth.c 'See <a \
    + + href="http://www.apache.org/docs/2.0/mod/mod_auth.html">\
    + http://www.apache.org/docs/2.0/mod/mod_auth.html</a>' +
    +

    + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_isapi.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_isapi.html new file mode 100644 index 00000000..d80ca339 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_isapi.html @@ -0,0 +1,9 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_isapi.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: mod_isapi.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_isapi.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_isapi.html.en new file mode 100644 index 00000000..3af3db2d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_isapi.html.en @@ -0,0 +1,343 @@ + + + +mod_isapi - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_isapi

    +
    +

    Available Languages:  en  | + ko 

    +
    + + + + +
    Description:ISAPI Extensions within Apache for Windows
    Status:Base
    Module Identifier:isapi_module
    Source File:mod_isapi.c
    Compatibility:Win32 only
    +

    Summary

    + +

    This module implements the Internet Server extension API. It + allows Internet Server extensions (e.g. ISAPI .dll + modules) to be served by Apache for Windows, subject to the + noted restrictions.

    + +

    ISAPI extension modules (.dll files) are written by third + parties. The Apache Group does not author these modules, so we + provide no support for them. Please contact the ISAPI's author + directly if you are experiencing problems running their ISAPI + extension. Please do not post such problems to + Apache's lists or bug reporting pages.

    +
    + +
    top
    +
    +

    Usage

    + +

    In the server configuration file, use + the AddHandler directive to + associate ISAPI files with the isapi-handler handler, and map + it to them with their file extensions. To enable any .dll file to be + processed as an ISAPI extension, edit the httpd.conf file and add the + following line:

    +

    + AddHandler isapi-handler .dll +

    + +
    In versions of the Apache server prior to 2.0.37, use + isapi-isa instead of isapi-handler. The new + handler name is not available prior to version 2.0.37. For compatibility, + configurations may continue using isapi-isa through all + versions of Apache prior to 2.3.0.
    + +

    There is no capability within the Apache server to leave a + requested module loaded. However, you may preload and keep a + specific module loaded by using the following syntax in your + httpd.conf:

    +

    + ISAPICacheFile c:/WebWork/Scripts/ISAPI/mytest.dll +

    + +

    Whether or not you have preloaded an ISAPI extension, all + ISAPI extensions are governed by the same permissions and + restrictions as CGI scripts. That is, Options ExecCGI must be set for the + directory that contains the ISAPI .dll file.

    + +

    Review the Additional Notes and the Programmer's Journal for additional details + and clarification of the specific ISAPI support offered by + mod_isapi.

    +
    top
    +
    +

    Additional Notes

    + +

    Apache's ISAPI implementation conforms to all of the ISAPI + 2.0 specification, except for some "Microsoft-specific" + extensions dealing with asynchronous I/O. Apache's I/O model + does not allow asynchronous reading and writing in a manner + that the ISAPI could access. If an ISA tries to access + unsupported features, including async I/O, a message is placed + in the error log to help with debugging. Since these messages + can become a flood, the directive ISAPILogNotSupported + Off exists to quiet this noise.

    + +

    Some servers, like Microsoft IIS, load the ISAPI extension + into the server and keep it loaded until memory usage is too + high, or unless configuration options are specified. Apache + currently loads and unloads the ISAPI extension each time it is + requested, unless the ISAPICacheFile directive is specified. + This is inefficient, but Apache's memory model makes this the + most effective method. Many ISAPI modules are subtly + incompatible with the Apache server, and unloading these + modules helps to ensure the stability of the server.

    + +

    Also, remember that while Apache supports ISAPI Extensions, + it does not support ISAPI Filters. Support for + filters may be added at a later date, but no support is planned + at this time.

    +
    top
    +
    +

    Programmer's Journal

    + +

    If you are programming Apache 2.0 mod_isapi + modules, you must limit your calls to ServerSupportFunction + to the following directives:

    + +
    +
    HSE_REQ_SEND_URL_REDIRECT_RESP
    +
    Redirect the user to another location.
    + This must be a fully qualified URL (e.g. + http://server/location).
    + +
    HSE_REQ_SEND_URL
    +
    Redirect the user to another location.
    + This cannot be a fully qualified URL, you are not allowed to + pass the protocol or a server name (e.g. simply + /location).
    + This redirection is handled by the server, not the + browser.
    +

    Warning

    +

    In their recent documentation, Microsoft appears to have + abandoned the distinction between the two + HSE_REQ_SEND_URL functions. Apache continues to treat + them as two distinct functions with different requirements + and behaviors.

    +
    + +
    HSE_REQ_SEND_RESPONSE_HEADER
    +
    Apache accepts a response body following the header if it + follows the blank line (two consecutive newlines) in the + headers string argument. This body cannot contain NULLs, + since the headers argument is NULL terminated.
    + +
    HSE_REQ_DONE_WITH_SESSION
    +
    Apache considers this a no-op, since the session will be + finished when the ISAPI returns from processing.
    + +
    HSE_REQ_MAP_URL_TO_PATH
    +
    Apache will translate a virtual name to a physical + name.
    + +
    HSE_APPEND_LOG_PARAMETER
    +
    + This logged message may be captured in any of the following + logs: + + + +

    The first option, the %{isapi-parameter}n component, + is always available and preferred.

    +
    + +
    HSE_REQ_IS_KEEP_CONN
    +
    Will return the negotiated Keep-Alive status.
    + +
    HSE_REQ_SEND_RESPONSE_HEADER_EX
    +
    Will behave as documented, although the fKeepConn + flag is ignored.
    + +
    HSE_REQ_IS_CONNECTED
    +
    Will report false if the request has been aborted.
    +
    + +

    Apache returns FALSE to any unsupported call to + ServerSupportFunction, and sets the + GetLastError value to + ERROR_INVALID_PARAMETER.

    + +

    ReadClient retrieves the request body exceeding the + initial buffer (defined by ISAPIReadAheadBuffer). Based on the + ISAPIReadAheadBuffer setting (number of bytes + to buffer prior to calling the ISAPI handler) shorter requests are sent + complete to the extension when it is invoked. If the request is + longer, the ISAPI extension must use ReadClient to + retrieve the remaining request body.

    + +

    WriteClient is supported, but only with the + HSE_IO_SYNC flag or no option flag (value of + 0). Any other WriteClient request + will be rejected with a return value of FALSE, and a + GetLastError value of + ERROR_INVALID_PARAMETER.

    + +

    GetServerVariable is supported, although extended server + variables do not exist (as defined by other servers.) All the + usual Apache CGI environment variables are available from + GetServerVariable, as well as the ALL_HTTP + and ALL_RAW values.

    + +

    Apache 2.0 mod_isapi supports additional + features introduced in later versions of the ISAPI specification, + as well as limited emulation of async I/O and the + TransmitFile semantics. Apache also supports preloading + ISAPI .dlls for performance, neither of which were not available under + Apache 1.3 mod_isapi.

    +
    +
    top
    +

    ISAPIAppendLogToErrors Directive

    + + + + + + + + +
    Description:Record HSE_APPEND_LOG_PARAMETER requests from +ISAPI extensions to the error log
    Syntax:ISAPIAppendLogToErrors on|off
    Default:ISAPIAppendLogToErrors off
    Context:server config, virtual host, directory, .htaccess
    Override:FileInfo
    Status:Base
    Module:mod_isapi
    +

    Record HSE_APPEND_LOG_PARAMETER requests from ISAPI + extensions to the server error log.

    + +
    +
    top
    +

    ISAPIAppendLogToQuery Directive

    + + + + + + + + +
    Description:Record HSE_APPEND_LOG_PARAMETER requests from +ISAPI extensions to the query field
    Syntax:ISAPIAppendLogToQuery on|off
    Default:ISAPIAppendLogToQuery on
    Context:server config, virtual host, directory, .htaccess
    Override:FileInfo
    Status:Base
    Module:mod_isapi
    +

    Record HSE_APPEND_LOG_PARAMETER requests from ISAPI + extensions to the query field (appended to the CustomLog %q + component).

    + +
    +
    top
    +

    ISAPICacheFile Directive

    + + + + + + +
    Description:ISAPI .dll files to be loaded at startup
    Syntax:ISAPICacheFile file-path [file-path] +...
    Context:server config, virtual host
    Status:Base
    Module:mod_isapi
    +

    Specifies a space-separated list of file names to be loaded + when the Apache server is launched, and remain loaded until the + server is shut down. This directive may be repeated for every + ISAPI .dll file desired. The full path name of each file should + be specified. If the path name is not absolute, it will be treated + relative to ServerRoot.

    + +
    +
    top
    +

    ISAPIFakeAsync Directive

    + + + + + + + + +
    Description:Fake asynchronous support for ISAPI callbacks
    Syntax:ISAPIFakeAsync on|off
    Default:ISAPIFakeAsync off
    Context:server config, virtual host, directory, .htaccess
    Override:FileInfo
    Status:Base
    Module:mod_isapi
    +

    While set to on, asynchronous support for ISAPI callbacks is + simulated.

    + +
    +
    top
    +

    ISAPILogNotSupported Directive

    + + + + + + + + +
    Description:Log unsupported feature requests from ISAPI +extensions
    Syntax:ISAPILogNotSupported on|off
    Default:ISAPILogNotSupported off
    Context:server config, virtual host, directory, .htaccess
    Override:FileInfo
    Status:Base
    Module:mod_isapi
    +

    Logs all requests for unsupported features from ISAPI + extensions in the server error log. This may help administrators + to track down problems. Once set to on and all desired ISAPI modules + are functioning, it should be set back to off.

    + +
    +
    top
    +

    ISAPIReadAheadBuffer Directive

    + + + + + + + + +
    Description:Size of the Read Ahead Buffer sent to ISAPI +extensions
    Syntax:ISAPIReadAheadBuffer size
    Default:ISAPIReadAheadBuffer 49152
    Context:server config, virtual host, directory, .htaccess
    Override:FileInfo
    Status:Base
    Module:mod_isapi
    +

    Defines the maximum size of the Read Ahead Buffer sent to + ISAPI extensions when they are initially invoked. All remaining + data must be retrieved using the ReadClient callback; some + ISAPI extensions may not support the ReadClient function. + Refer questions to the ISAPI extension's author.

    + +
    +
    +
    +

    Available Languages:  en  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_isapi.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_isapi.html.ko.euc-kr new file mode 100644 index 00000000..04ff98a1 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_isapi.html.ko.euc-kr @@ -0,0 +1,319 @@ + + + +mod_isapi - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    ¾ÆÆÄÄ¡ ¸ðµâ mod_isapi

    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + ko 

    +
    +
    ÀÌ ¹®¼­´Â ÃÖ½ÅÆÇ ¹ø¿ªÀÌ ¾Æ´Õ´Ï´Ù. + ÃÖ±Ù¿¡ º¯°æµÈ ³»¿ëÀº ¿µ¾î ¹®¼­¸¦ Âü°íÇϼ¼¿ä.
    + + + + +
    ¼³¸í:Windows¿ë ¾ÆÆÄÄ¡¿¡¼­ ISAPI Extension »ç¿ë
    »óÅÂ:Base
    ¸ðµâ¸í:isapi_module
    ¼Ò½ºÆÄÀÏ:mod_isapi.c
    Áö¿ø:Win32 only
    +

    ¿ä¾à

    + +

    ÀÌ ¸ðµâÀº Internet Server extension API¸¦ ±¸ÇöÇÑ´Ù. ±×·¡¼­ + Á¦¾àÀº ÀÖÁö¸¸ Windows¿ë ¾ÆÆÄÄ¡¿¡¼­ Internet Server extensionÀ» + (Áï, ISAPI .dll ¸ðµâ) »ç¿ëÇÒ ¼ö ÀÖ´Ù.

    + +

    ISAPI extension ¸ðµâ(.dll ÆÄÀÏ)Àº Á¦»ïÀÚ°¡ ÀÛ¼ºÇÑ´Ù. + Apache GroupÀÌ ÀÌµé ¸ðµâÀ» ¸¸µéÁö ¾Ê¾ÒÀ¸¸ç, Áö¿øµµ ÇÏÁö + ¾Ê´Â´Ù. ISAPI extension »ç¿ë¿¡ °üÇÑ ¹®Á¦´Â ISAPI Á¦ÀÛÀÚ¿¡°Ô + Á÷Á¢ ¿¬¶ôÇÏ±æ ¹Ù¶õ´Ù. Á¦¹ß ÀÌ·± ¹®Á¦¸¦ ¾ÆÆÄÄ¡ + ¸ÞÀϸµ¸®½ºÆ®³ª ¹ö±×º¸°í ÆäÀÌÁö¿¡ ¿Ã¸®Áö ¸¶¶ó.

    +
    + +
    top
    +
    +

    »ç¿ë¹ý

    + +

    ¼­¹ö¼³Á¤ÆÄÀÏ¿¡¼­ AddHandler Áö½Ã¾î¸¦ »ç¿ëÇÏ¿© + ISAPI ÆÄÀÏ È®ÀåÀÚ¿Í isapi-isa Çڵ鷯¸¦ ¿¬°áÇÑ´Ù. + .dll ÆÄÀÏÀ» ISAPI extensionÀ¸·Î ó¸®ÇÏ·Á¸é httpd.conf ÆÄÀÏ¿¡ + ´ÙÀ½°ú °°ÀÌ Ãß°¡ÇÑ´Ù.

    +

    + AddHandler isapi-isa .dll +

    + +

    ¾ÆÆÄÄ¡ ¼­¹ö´Â ¿äûÇÑ ¸ðµâÀ» ¸Þ¸ð¸®¿¡ °è¼Ó µÑ ¼ö ¾ø´Ù. + ±×·¯³ª httpd.conf¿¡¼­ ´ÙÀ½°ú °°Àº ¼³Á¤À¸·Î ƯÁ¤ ¸ðµâÀ» ¹Ì¸® + ÀоîµéÀÏ ¼ö´Â ÀÖ´Ù.

    +

    + ISAPICacheFile c:/WebWork/Scripts/ISAPI/mytest.dll +

    + +

    ISAPI extensionÀ» ¹Ì¸® ÀоîµéÀÌ´øÁö ¹Ì¸® ÀоîµéÀÌÁö ¾Ê´øÁö + °ü°è¾øÀÌ ISAPI extensionÀº CGI ½ºÅ©¸³Æ®¿Í µ¿ÀÏÇÑ ±ÇÇÑ°ú + Á¦¾àÀ» µû¸¥´Ù. Áï, ISAPI .dll ÆÄÀÏÀÌ ÀÖ´Â µð·ºÅ丮¿¡ Options ExecCGI°¡ + ÇÊ¿äÇÏ´Ù.

    + +

    mod_isapiÀÇ ISAPI Áö¿ø¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ + ³»¿ë°ú ¼³¸íÀº Ãß°¡ ¼³¸í°ú °³¹ßÀÚ Á¤º¸¸¦ Âü°íÇ϶ó.

    +
    top
    +
    +

    Ãß°¡ ¼³¸í

    + +

    ¾ÆÆÄÄ¡ ISAPI ±¸ÇöÀº ºñµ¿±â ÀÔÃâ·Â¿¡ ´ëÇÑ "¸¶ÀÌÅ©·Î¼ÒÇÁÆ® + ƯÀ¯ÀÇ" È®Àå±â´ÉÀ» Á¦¿ÜÇÑ ISAPI 2.0 ±Ô¾àÀ» ¸ðµÎ ¸¸Á·ÇÑ´Ù. + ¾ÆÆÄÄ¡ÀÇ ÀÔÃâ·Â ±¸Á¶·Î´Â ISAPI°¡ »ç¿ëÇÒ ¼ö ÀÖ´Â ¹æ½ÄÀ¸·Î + ºñµ¿±â ÀÔÃâ·ÂÀ» ÇÒ ¼ö ¾ø´Ù. ISA°¡ ºñµ¿±â ÀÔÃâ·Â°ú °°ÀÌ Áö¿øÇÏÁö + ¾Ê´Â ±â´ÉÀ» »ç¿ëÇÏ·Á ÇÑ´Ù¸é, µð¹ö±ë¿¡ µµ¿òÀ» ÁÖ±âÀ§ÇØ ¿À·ù + ·Î±×¿¡ ±â·ÏÀ» ³²±ä´Ù. ·Î±×°¡ ¸Å¿ì Ä¿Áú ¼ö Àֱ⶧¹®¿¡ + ISAPILogNotSupported Off Áö½Ã¾î¸¦ »ç¿ëÇϸé + ·Î±×¿¡ ±â·ÏÇÏÁö ¾Ê´Â´Ù.

    + +

    Microsoft IIS¿Í °°Àº ¼­¹ö´Â ISAPI extensionÀ» ¸Þ¸ð¸®·Î + Àоîµé¿©¼­ ¸Þ¸ð¸® »ç¿ë·®ÀÌ ¸Å¿ì ¸¹Áö ¾Ê°Å³ª Ưº°È÷ ¼³Á¤ÇÏÁö + ¾Ê´ÂÇÑ ±×´ë·Î ¸Þ¸ð¸®¿¡ µÐ´Ù. ¾ÆÆÄÄ¡´Â ÇöÀç ISAPICacheFile Áö½Ã¾î¸¦ »ç¿ëÇÏÁö + ¾Ê´Â´Ù¸é ¿äûÀ» ¹ÞÀ»¶§¸¶´Ù ISAPI extensionÀ» ¸Þ¸ð¸®¿¡ ÀоîµéÀÌ°í + ¹ö¸°´Ù. ºñÈ¿À²ÀûÀÌÁö¸¸, ¾ÆÆÄÄ¡ÀÇ ¸Þ¸ð¸® ±¸Á¶»ó ÀÌ°ÍÀÌ °¡Àå + È¿À²ÀûÀÎ ¹æ¹ýÀÌ´Ù. ¿©·¯ ISAPI ¸ðµâÀÌ ¾ÆÆÄÄ¡ ¼­¹ö¿Í ¾à°£ + ȣȯÀÌ ¾È¸Â±â¶§¹®¿¡ ¼­¹öÀÇ ¾ÈÁ¤¼ºÀ» À§ÇØ ¸ðµâÀ» ¸Þ¸ð¸®¿¡¼­ + ¹ö¸°´Ù.

    + +

    ¶Ç, ¾ÆÆÄÄ¡´Â ISAPI ExtensionÀ» Áö¿øÇÏÁö¸¸, ISAPI + Filter¸¦ Áö¿øÇÏÁö ¾ÊÀ½À» ±â¾ïÇ϶ó. ³ªÁß¿¡ ÇÊÅ͸¦ + Áö¿øÇÒ ¼ö ÀÖÁö¸¸, ÇöÀç´Â °èȹÀÌ ¾ø´Ù.

    +
    top
    +
    +

    °³¹ßÀÚ Á¤º¸

    + +

    ¾ÆÆÄÄ¡ 2.0 mod_isapi ¸ðµâÀ» ÇÁ·Î±×·¡¹ÖÇÑ´Ù¸é, + ServerSupportFunction È£ÃâÀ» ´ÙÀ½ Áö½Ã¾î·Î + Á¦ÇÑÇØ¾ß ÇÑ´Ù.

    + +
    +
    HSE_REQ_SEND_URL_REDIRECT_RESP
    +
    »ç¿ëÀÚ¸¦ ´Ù¸¥ À§Ä¡·Î ¸®´ÙÀÌ·º¼ÇÇÑ´Ù.
    + ¿ÏÀüÇÑ URLÀ» »ç¿ëÇØ¾ß ÇÑ´Ù (¿¹¸¦ µé¾î, + http://server/location).
    + +
    HSE_REQ_SEND_URL
    +
    »ç¿ëÀÚ¸¦ ´Ù¸¥ À§Ä¡·Î ¸®´ÙÀÌ·º¼ÇÇÑ´Ù.
    + ¿ÏÀüÇÑ URLÀÌ ¾Æ´Ï¸ç, ÇÁ·ÎÅäÄÝ°ú ¼­¹ö¸íÀ» ³Ñ±æ ¼ö ¾ø´Ù + (¿¹¸¦ µé¾î, /location°°Àº °Í¸¸ °¡´É).
    + ºê¶ó¿ìÀú°¡ ¾Æ´Ï¶ó ¼­¹ö°¡ ¸®´ÙÀÌ·º¼ÇÀ» ó¸®ÇÑ´Ù.
    +

    °æ°í

    +

    ÃÖ±Ù ¹®¼­¸¦ º¸¸é Microsoft°¡ µÎ HSE_REQ_SEND_URL + ±â´É°£ÀÇ Â÷À̸¦ ¾ø¾Ø °Íó·³ º¸ÀδÙ. ¾ÆÆÄÄ¡´Â °è¼Ó ÀÌ + µÑÀÇ ¾Æ±Ô¸ÕÆ® Á¶°Ç°ú ÇൿÀ» ´Ù¸£°Ô ó¸®ÇÒ °ÍÀÌ´Ù.

    +
    + +
    HSE_REQ_SEND_RESPONSE_HEADER
    +
    headers ¹®ÀÚ¿­ ¾Æ±Ô¸ÕÆ®¿¡ ºóÁÙÀÌ (Áٹٲ޹®ÀÚ°¡ µÎ¹ø + ¿¬¼Ó) ÀÖ´Ù¸é ¾ÆÆÄÄ¡´Â Çì´õ ´ÙÀ½ ³»¿ëÀ» ÀÀ´ä ³»¿ëÀ¸·Î »ç¿ëÇÑ´Ù. + headers ¾Æ±Ô¸ÕÆ®°¡ NULL·Î ³¡³ª±â¶§¹®¿¡, ÀÀ´ä ³»¿ë¿¡ NULLÀ» + »ç¿ëÇÒ ¼ö ¾ø´Ù.
    + +
    HSE_REQ_DONE_WITH_SESSION
    +
    ISAPI°¡ 󸮸¦ ¸¶Ä¡¸é ¼¼¼ÇÀÌ ³¡³ª±â¶§¹®¿¡ ¾ÆÆÄÄ¡´Â + ¾Æ¹« Àϵµ ÇÏÁö ¾Ê´Â´Ù.
    + +
    HSE_REQ_MAP_URL_TO_PATH
    +
    ¾ÆÆÄÄ¡´Â °¡»ó À̸§À» ¹°¸®Àû(½ÇÁ¦) À̸§À¸·Î º¯È¯ÇÑ´Ù.
    + +
    HSE_APPEND_LOG_PARAMETER
    +
    + ¹®±¸¸¦ ¾Æ·¡ ·Î±×Áß ÇÑ°÷¿¡ ³²±ä´Ù. + + + +

    ù¹ø°·Î ³ª¿Â %{isapi-parameter}n Ç׸ñÀº + ¾ðÁ¦³ª »ç¿ëÇÒ ¼ö ÀÖÀ¸¸ç ±ÇÀåÇÑ´Ù.

    +
    + +
    HSE_REQ_IS_KEEP_CONN
    +
    Çù»óµÈ Keep-Alive »óŸ¦ ¹ÝȯÇÑ´Ù.
    + +
    HSE_REQ_SEND_RESPONSE_HEADER_EX
    +
    fKeepConn ¿É¼ÇÀ» ¹«½ÃÇÏ´Â °ÍÀ» Á¦¿ÜÇÏ°í´Â + ¹®¼­¿¡ ³ª¿Âµ¥·Î µ¿ÀÛÇÑ´Ù.
    + +
    HSE_REQ_IS_CONNECTED
    +
    ¿äûÀÌ Áß°£¿¡ ²÷¾îÁ³´Ù¸é false¸¦ ¹ÝȯÇÑ´Ù.
    +
    + +

    Áö¿øÇÏÁö ¾Ê´Â ServerSupportFunction È£ÃâÀ» + ÇÏ¸é ¾ÆÆÄÄ¡´Â FALSE¸¦ ¹ÝȯÇÏ°í + GetLastError °ªÀ» + ERROR_INVALID_PARAMETER·Î ¼³Á¤ÇÑ´Ù.

    + +

    ReadClient´Â (ISAPIReadAheadBuffer·Î Á¤ÀÇÇÑ) + Ãʱâ¹öÆÛÅ©±â¸¦ ³Ñ¾î¼± ¿äû ³»¿ëÀ» °¡Á®¿Â´Ù. + ISAPIReadAheadBuffer ¼³Á¤ (ISAPI + Çڵ鷯¸¦ ºÎ¸£±âÀü ¹öÆÛÀÇ ¹ÙÀÌÆ®¼ö) º¸´Ù ªÀº ¿äûÀº extensionÀ» + ºÎ¸¦¶§ ÀüºÎ Àü´ÞµÈ´Ù. ¿äûÀÌ ±æ¸é, ISAPI extensionÀº + ReadClient·Î ³ª¸ÓÁö ¿äû ³»¿ëÀ» °¡Á®¿Í¾ß ÇÑ´Ù.

    + +

    WriteClient¸¦ Áö¿øÇÏÁö¸¸, + HSE_IO_SYNC ¿É¼Ç¸¸ »ç¿ëÇϰųª (0 + °ª) ¾Æ¹« ¿É¼Çµµ »ç¿ëÇÏÁö ¾Ê¾Æ¾ß ÇÑ´Ù. ´Ù¸¥ + WriteClient ¿äûÀº FALSE¸¦ ¹ÝȯÇϸç + ½ÇÆÐÇÏ°í, GetLastError °ªÀº + ERROR_INVALID_PARAMETER°¡ µÈ´Ù.

    + +

    GetServerVariableÀº Áö¿øÇÏÁö¸¸, (´Ù¸¥ ¼­¹ö¿¡¼­ + Á¤ÀÇÇÏ´Â) È®Àå ¼­¹öº¯¼ö´Â ¾ø´Ù. + GetServerVariable¿¡¼­ ¸ðµç ÀϹÝÀûÀÎ ¾ÆÆÄÄ¡ + CGI ȯ°æº¯¼ö¿Í ALL_HTTP, ALL_RAW + °ªÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù.

    + +

    ¾ÆÆÄÄ¡ 2.0 mod_isapi´Â ÀÌÈÄ ISAPI ±Ô¾à¿¡ + ³ª¿Â Ãß°¡ ±â´ÉÀ» Áö¿øÇÏ°í, ºñµ¿±â ÀÔÃâ·Â°ú + TransmitFile ±â´ÉÀ» Á¶±Ý Èä³»³½´Ù. ¶Ç, ISAPI + .dllÀ» ¹Ì¸® Àоîµé¿©¼­ ¼º´ÉÀ» ³ôÀÌ´Â ¾ÆÆÄÄ¡ 1.3 + mod_isapi¿¡´Â ¾ø´Â ±â´ÉÀ» Áö¿øÇÑ´Ù.

    +
    +
    top
    +

    ISAPIAppendLogToErrors Áö½Ã¾î

    + + + + + + + + +
    ¼³¸í:ISAPI exntensionÀÇ HSE_APPEND_LOG_PARAMETER +¿äûÀ» ¿À·ù ·Î±×¿¡ ±â·ÏÇÑ´Ù
    ¹®¹ý:ISAPIAppendLogToErrors on|off
    ±âº»°ª:ISAPIAppendLogToErrors off
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®, directory, .htaccess
    Override ¿É¼Ç:FileInfo
    »óÅÂ:Base
    ¸ðµâ:mod_isapi
    +

    ISAPI exntensionÀÇ HSE_APPEND_LOG_PARAMETER + ¿äûÀ» ¿À·ù ·Î±×¿¡ ±â·ÏÇÑ´Ù.

    + +
    +
    top
    +

    ISAPIAppendLogToQuery Áö½Ã¾î

    + + + + + + + + +
    ¼³¸í:ISAPI exntensionÀÇ HSE_APPEND_LOG_PARAMETER +¿äûÀ» ÁúÀǹ®ÀÚ¿­¿¡ ±â·ÏÇÑ´Ù
    ¹®¹ý:ISAPIAppendLogToQuery on|off
    ±âº»°ª:ISAPIAppendLogToQuery on
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®, directory, .htaccess
    Override ¿É¼Ç:FileInfo
    »óÅÂ:Base
    ¸ðµâ:mod_isapi
    +

    ISAPI exntensionÀÇ HSE_APPEND_LOG_PARAMETER + ¿äûÀ» ÁúÀǹ®ÀÚ¿­¿¡ ±â·ÏÇÑ´Ù (CustomLog %q + Ç׸ñ¿¡ µ¡ºÙÀδÙ).

    + +
    +
    top
    +

    ISAPICacheFile Áö½Ã¾î

    + + + + + + +
    ¼³¸í:¼­¹ö°¡ ½ÃÀÛÇÒ¶§ ¸Þ¸ð¸®·Î ÀоîµéÀÏ ISAPI .dll ÆÄÀϵé
    ¹®¹ý:ISAPICacheFile file-path [file-path] +...
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®
    »óÅÂ:Base
    ¸ðµâ:mod_isapi
    +

    ¾ÆÆÄÄ¡ ¼­¹ö°¡ ½ÃÀÛÇÒ¶§ ¸Þ¸ð¸®·Î Àоîµé¿©¼­ ¼­¹ö¸¦ Á¾·áÇÒ¶§±îÁö + ¸Þ¸ð¸®¿¡ ³²¾ÆÀÖÀ» ÆÄÀϸíÀ» °ø¹éÀ¸·Î ±¸ºÐÇÏ¿© ÁöÁ¤ÇÑ´Ù. ÀÌ + Áö½Ã¾î´Â ISAPI .dll ÆÄÀϺ°·Î ¿©·¯¹ø »ç¿ëÇÒ ¼ö ÀÖ´Ù. ÆÄÀÏÀÇ + Àüü °æ·Î¸¦ Àû´Â´Ù. Àý´ë °æ·Î°¡ ¾Æ´Ï¸é ServerRoot¿¡ »ó´ë °æ·Î·Î ¹Þ¾ÆµéÀδÙ.

    + +
    +
    top
    +

    ISAPIFakeAsync Áö½Ã¾î

    + + + + + + + + +
    ¼³¸í:ºñµ¿±â ISAPI ÄݹéÀ» Áö¿øÇϴ ôÇÑ´Ù
    ¹®¹ý:ISAPIFakeAsync on|off
    ±âº»°ª:ISAPIFakeAsync off
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®, directory, .htaccess
    Override ¿É¼Ç:FileInfo
    »óÅÂ:Base
    ¸ðµâ:mod_isapi
    +

    onÀ¸·Î ¼³Á¤ÇÏ¸é ºñµ¿±â ISAPI Äݹé Áö¿øÀ» Èä³»³½´Ù.

    + +
    +
    top
    +

    ISAPILogNotSupported Áö½Ã¾î

    + + + + + + + + +
    ¼³¸í:ISAPI extensionÀÌ Áö¿øÇÏÁö ¾Ê´Â ±â´ÉÀ» ¿äûÇϸé +·Î±×¿¡ ±â·ÏÇÑ´Ù
    ¹®¹ý:ISAPILogNotSupported on|off
    ±âº»°ª:ISAPILogNotSupported off
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®, directory, .htaccess
    Override ¿É¼Ç:FileInfo
    »óÅÂ:Base
    ¸ðµâ:mod_isapi
    +

    ISAPI extensionÀÌ Áö¿øÇÏÁö ¾Ê´Â ±â´ÉÀ» ¿äûÇÏ¸é ¼­¹ö + ¿À·ù ·Î±×¿¡ ±â·ÏÇÑ´Ù. ³ªÁß¿¡ °ü¸®ÀÚ°¡ ¹®Á¦¸¦ ÃßÀûÇϴµ¥ + µµ¿òÀÌ µÈ´Ù. ¿øÇÏ´Â ¸ðµç ISAPI ¸ðµâÀÌ Á¤»óÀûÀ¸·Î µ¿ÀÛÇϸé + ´Ù½Ã off·Î µÇµ¹·Á¾ß ÇÑ´Ù.

    + +
    +
    top
    +

    ISAPIReadAheadBuffer Áö½Ã¾î

    + + + + + + + + +
    ¼³¸í:ISAPI extensionÀÇ ¹Ì¸®Àбâ¹öÆÛ(read ahead buffer) +Å©±â
    ¹®¹ý:ISAPIReadAheadBuffer size
    ±âº»°ª:ISAPIReadAheadBuffer 49152
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®, directory, .htaccess
    Override ¿É¼Ç:FileInfo
    »óÅÂ:Base
    ¸ðµâ:mod_isapi
    +

    ISAPI extensionÀ» óÀ½ È£ÃâÇÒ¶§ ¹Ì¸®Àбâ¹öÆÛÀÇ ÃÖ´ë Å©±â¸¦ + ÁöÁ¤ÇÑ´Ù. (ÀÌ Å©±âº¸´Ù Å«) ³ª¸ÓÁö ÀÚ·á´Â ReadClient + ÄݹéÀ» »ç¿ëÇÏ¿© Àоî¾ß ÇÑ´Ù. ¾î¶² ISAPI extensionÀº + ReadClient ±â´ÉÀ» Áö¿øÇÏÁö ¾Ê´Â´Ù. ÀÌ °æ¿ì + ISAPI extension Á¦ÀÛÀÚ¿¡°Ô ¹®ÀÇÇ϶ó.

    + +
    +
    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_ldap.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_ldap.html new file mode 100644 index 00000000..5aee964c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_ldap.html @@ -0,0 +1,5 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_ldap.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_ldap.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_ldap.html.en new file mode 100644 index 00000000..2671424f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_ldap.html.en @@ -0,0 +1,390 @@ + + + +mod_ldap - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_ldap

    +
    +

    Available Languages:  en 

    +
    + + + + +
    Description:LDAP connection pooling and result caching services for use +by other LDAP modules
    Status:Experimental
    Module Identifier:ldap_module
    Source File:util_ldap.c
    Compatibility:Available in version 2.0.41 and later
    +

    Summary

    + +

    This module was created to improve the performance of + websites relying on backend connections to LDAP servers. In + addition to the functions provided by the standard LDAP + libraries, this module adds an LDAP connection pool and an LDAP + shared memory cache.

    + +

    To enable this module, LDAP support must be compiled into + apr-util. This is achieved by adding the --with-ldap + flag to the configure script when building + Apache.

    + +

    SSL support requires that mod_ldap be linked + with one of the following LDAP SDKs: + OpenLDAP SDK (both 1.x and 2.x), + Novell LDAP SDK or the + iPlanet(Netscape) SDK.

    + +
    + +
    top
    +
    +

    Example Configuration

    +

    The following is an example configuration that uses + mod_ldap to increase the performance of HTTP Basic + authentication provided by mod_auth_ldap.

    + +

    + # Enable the LDAP connection pool and shared
    + # memory cache. Enable the LDAP cache status
    + # handler. Requires that mod_ldap and mod_auth_ldap
    + # be loaded. Change the "yourdomain.example.com" to
    + # match your domain.
    +
    + LDAPSharedCacheSize 200000
    + LDAPCacheEntries 1024
    + LDAPCacheTTL 600
    + LDAPOpCacheEntries 1024
    + LDAPOpCacheTTL 600
    +
    + <Location /ldap-status>
    + + SetHandler ldap-status
    + Order deny,allow
    + Deny from all
    + Allow from yourdomain.example.com
    + AuthLDAPEnabled on
    + AuthLDAPURL ldap://127.0.0.1/dc=example,dc=com?uid?one
    + AuthLDAPAuthoritative on
    + Require valid-user
    +
    + </Location> +

    +
    top
    +
    +

    LDAP Connection Pool

    + +

    LDAP connections are pooled from request to request. This + allows the LDAP server to remain connected and bound ready for + the next request, without the need to unbind/connect/rebind. + The performance advantages are similar to the effect of HTTP + keepalives.

    + +

    On a busy server it is possible that many requests will try + and access the same LDAP server connection simultaneously. + Where an LDAP connection is in use, Apache will create a new + connection alongside the original one. This ensures that the + connection pool does not become a bottleneck.

    + +

    There is no need to manually enable connection pooling in + the Apache configuration. Any module using this module for + access to LDAP services will share the connection pool.

    +
    top
    +
    +

    LDAP Cache

    + +

    For improved performance, mod_ldap uses an aggressive + caching strategy to minimize the number of times that the LDAP + server must be contacted. Caching can easily double or triple + the throughput of Apache when it is serving pages protected + with mod_auth_ldap. In addition, the load on the LDAP server + will be significantly decreased.

    + +

    mod_ldap supports two types of LDAP caching during + the search/bind phase with a search/bind cache and + during the compare phase with two operation + caches. Each LDAP URL that is used by the server has + its own set of these three caches.

    + +

    The Search/Bind Cache

    +

    The process of doing a search and then a bind is the + most time-consuming aspect of LDAP operation, especially if + the directory is large. The search/bind cache is used to + cache all searches that resulted in successful binds. + Negative results (i.e., unsuccessful searches, or searches + that did not result in a successful bind) are not cached. + The rationale behind this decision is that connections with + invalid credentials are only a tiny percentage of the total + number of connections, so by not caching invalid + credentials, the size of the cache is reduced.

    + +

    mod_ldap stores the username, the DN + retrieved, the password used to bind, and the time of the bind + in the cache. Whenever a new connection is initiated with the + same username, mod_ldap compares the password + of the new connection with the password in the cache. If the + passwords match, and if the cached entry is not too old, + mod_ldap bypasses the search/bind phase.

    + +

    The search and bind cache is controlled with the LDAPCacheEntries and LDAPCacheTTL directives.

    + + +

    Operation Caches

    +

    During attribute and distinguished name comparison + functions, mod_ldap uses two operation caches + to cache the compare operations. The first compare cache is + used to cache the results of compares done to test for LDAP + group membership. The second compare cache is used to cache + the results of comparisons done between distinguished + names.

    + +

    The behavior of both of these caches is controlled with + the LDAPOpCacheEntries + and LDAPOpCacheTTL + directives.

    + + +

    Monitoring the Cache

    +

    mod_ldap has a content handler that allows + administrators to monitor the cache performance. The name of + the content handler is ldap-status, so the + following directives could be used to access the + mod_ldap cache information:

    + +

    + <Location /server/cache-info>
    + + SetHandler ldap-status
    +
    + </Location> +

    + +

    By fetching the URL http://servername/cache-info, + the administrator can get a status report of every cache that is used + by mod_ldap cache. Note that if Apache does not + support shared memory, then each httpd instance has its + own cache, so reloading the URL will result in different + information each time, depending on which httpd + instance processes the request.

    + +
    top
    +
    +

    Using SSL

    + +

    The ability to create an SSL connections to an LDAP server + is defined by the directives + LDAPTrustedCA and + LDAPTrustedCAType. These directives specify the certificate + file or database and the certificate type. Whenever the LDAP url + includes ldaps://, mod_ldap will establish + a secure connection to the LDAP server.

    + +

    + # Establish an SSL LDAP connection. Requires that
    + # mod_ldap and mod_auth_ldap be loaded. Change the
    + # "yourdomain.example.com" to match your domain.
    +
    + LDAPTrustedCA /certs/certfile.der
    + LDAPTrustedCAType DER_FILE
    +
    + <Location /ldap-status>
    + + SetHandler ldap-status
    + Order deny,allow
    + Deny from all
    + Allow from yourdomain.example.com
    + AuthLDAPEnabled on
    + AuthLDAPURL ldaps://127.0.0.1/dc=example,dc=com?uid?one
    + AuthLDAPAuthoritative on
    + Require valid-user
    +
    + </Location> +

    + +

    If mod_ldap is linked against the + Netscape/iPlanet LDAP SDK, it will not talk to any SSL server + unless that server has a certificate signed by a known Certificate + Authority. As part of the configuration + mod_ldap needs to be told where it can find + a database containing the known CAs. This database is in the same + format as Netscape Communicator's cert7.db + database. The easiest way to get this file is to start up a fresh + copy of Netscape, and grab the resulting + $HOME/.netscape/cert7.db file.

    + +
    +
    top
    +

    LDAPCacheEntries Directive

    + + + + + + + +
    Description:Maximum number of entries in the primary LDAP cache
    Syntax:LDAPCacheEntries number
    Default:LDAPCacheEntries 1024
    Context:server config
    Status:Experimental
    Module:mod_ldap
    +

    Specifies the maximum size of the primary LDAP cache. This + cache contains successful search/binds. Set it to 0 to turn off + search/bind caching. The default size is 1024 cached + searches.

    + +
    +
    top
    +

    LDAPCacheTTL Directive

    + + + + + + + +
    Description:Time that cached items remain valid
    Syntax:LDAPCacheTTL seconds
    Default:LDAPCacheTTL 600
    Context:server config
    Status:Experimental
    Module:mod_ldap
    +

    Specifies the time (in seconds) that an item in the + search/bind cache remains valid. The default is 600 seconds (10 + minutes).

    + +
    +
    top
    +

    LDAPConnectionTimeout Directive

    + + + + + + +
    Description:Specifies the socket connection timeout in seconds
    Syntax:LDAPConnectionTimeout seconds
    Context:server config
    Status:Experimental
    Module:mod_ldap
    +

    Specifies the timeout value (in seconds) in which the module will + attempt to connect to the LDAP server. If a connection is not + successful with the timeout period, either an error will be + returned or the module will attempt to connect to a secondary LDAP + server if one is specified. The default is 10 seconds.

    + +
    +
    top
    +

    LDAPOpCacheEntries Directive

    + + + + + + + +
    Description:Number of entries used to cache LDAP compare +operations
    Syntax:LDAPOpCacheEntries number
    Default:LDAPOpCacheEntries 1024
    Context:server config
    Status:Experimental
    Module:mod_ldap
    +

    This specifies the number of entries mod_ldap + will use to cache LDAP compare operations. The default is 1024 + entries. Setting it to 0 disables operation caching.

    + +
    +
    top
    +

    LDAPOpCacheTTL Directive

    + + + + + + + +
    Description:Time that entries in the operation cache remain +valid
    Syntax:LDAPOpCacheTTL seconds
    Default:LDAPOpCacheTTL 600
    Context:server config
    Status:Experimental
    Module:mod_ldap
    +

    Specifies the time (in seconds) that entries in the + operation cache remain valid. The default is 600 seconds.

    + +
    +
    top
    +

    LDAPSharedCacheFile Directive

    + + + + + + +
    Description:Sets the shared memory cache file
    Syntax:LDAPSharedCacheFile directory-path/filename
    Context:server config
    Status:Experimental
    Module:mod_ldap
    +

    Specifies the directory path and file name of the shared memory + cache file. If not set, anonymous shared memory will be used if the + platform supports it.

    + +
    +
    top
    +

    LDAPSharedCacheSize Directive

    + + + + + + + +
    Description:Size in bytes of the shared-memory cache
    Syntax:LDAPSharedCacheSize bytes
    Default:LDAPSharedCacheSize 102400
    Context:server config
    Status:Experimental
    Module:mod_ldap
    +

    Specifies the number of bytes to allocate for the shared + memory cache. The default is 100kb. If set to 0, shared memory + caching will not be used.

    + +
    +
    top
    +

    LDAPTrustedCA Directive

    + + + + + + +
    Description:Sets the file containing the trusted Certificate Authority certificate or database
    Syntax:LDAPTrustedCA directory-path/filename
    Context:server config
    Status:Experimental
    Module:mod_ldap
    +

    It specifies the directory path and file name of the trusted CA + mod_ldap should use when establishing an SSL + connection to an LDAP server. If using the Netscape/iPlanet Directory + SDK, the file name should be cert7.db.

    + +
    +
    top
    +

    LDAPTrustedCAType Directive

    + + + + + + +
    Description:Specifies the type of the Certificate Authority file
    Syntax:LDAPTrustedCAType type
    Context:server config
    Status:Experimental
    Module:mod_ldap
    +

    The following types are supported:
    + DER_FILE - file in binary DER format
    + BASE64_FILE - file in Base64 format
    + CERT7_DB_PATH - Netscape certificate database file ")

    + +
    +
    +
    +

    Available Languages:  en 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_log_config.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_log_config.html new file mode 100644 index 00000000..1e9233c9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_log_config.html @@ -0,0 +1,17 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_log_config.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: mod_log_config.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: mod_log_config.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: mod_log_config.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_log_config.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_log_config.html.en new file mode 100644 index 00000000..1d913406 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_log_config.html.en @@ -0,0 +1,472 @@ + + + +mod_log_config - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_log_config

    +
    +

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

    +
    + + + +
    Description:Logging of the requests made to the server
    Status:Base
    Module Identifier:log_config_module
    Source File:mod_log_config.c
    +

    Summary

    + +

    This module provides for flexible logging of client + requests. Logs are written in a customizable format, and may be + written directly to a file, or to an external program. + Conditional logging is provided so that individual requests may + be included or excluded from the logs based on characteristics + of the request.

    + +

    Three directives are provided by this module: + TransferLog to create + a log file, LogFormat + to set a custom format, and CustomLog to define a log file and format in one + step. The TransferLog and CustomLog directives can be used multiple times in each + server to cause each request to be logged to multiple files.

    +
    + +
    top
    +
    +

    Custom Log Formats

    + +

    The format argument to the LogFormat and CustomLog directives is a string. This string is + used to log each request to the log file. It can contain literal + characters copied into the log files and the C-style control + characters "\n" and "\t" to represent new-lines and tabs. + Literal quotes and backslashes should be escaped with + backslashes.

    + +

    The characteristics of the request itself are logged by + placing "%" directives in the format string, which are + replaced in the log file by the values as follows:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Format StringDescription
    %%The percent sign (Apache 2.0.44 and later)
    %...aRemote IP-address
    %...ALocal IP-address
    %...BSize of response in bytes, excluding HTTP headers.
    %...bSize of response in bytes, excluding HTTP headers. In CLF format, i.e. + a '-' rather than a 0 when no bytes are sent.
    %...{Foobar}CThe contents of cookie Foobar in the request sent + to the server.
    %...DThe time taken to serve the request, in microseconds.
    %...{FOOBAR}eThe contents of the environment variable + FOOBAR
    %...fFilename
    %...hRemote host
    %...HThe request protocol
    %...{Foobar}iThe contents of Foobar: header line(s) + in the request sent to the server. Changes made by other + modules (e.g. mod_headers) affect this. +
    %...lRemote logname (from identd, if supplied). This will return a + dash unless IdentityCheck is set + On.
    %...mThe request method
    %...{Foobar}nThe contents of note Foobar from another + module.
    %...{Foobar}oThe contents of Foobar: header line(s) + in the reply.
    %...pThe canonical port of the server serving the request
    %...PThe process ID of the child that serviced the request.
    %...{format}PThe process ID or thread id of the child that serviced the + request. Valid formats are pid and tid. + (Apache 2.0.46 and later) +
    %...qThe query string (prepended with a ? if a query + string exists, otherwise an empty string)
    %...rFirst line of request
    %...sStatus. For requests that got internally redirected, this is + the status of the *original* request --- %...>s + for the last.
    %...tTime the request was received (standard english + format)
    %...{format}tThe time, in the form given by format, which should be in + strftime(3) format. (potentially localized)
    %...TThe time taken to serve the request, in seconds.
    %...uRemote user (from auth; may be bogus if return status + (%s) is 401)
    %...UThe URL path requested, not including any query string.
    %...vThe canonical ServerName + of the server serving the request.
    %...VThe server name according to the UseCanonicalName setting.
    %...XConnection status when response is completed: + + + + + + + + + +
    X =connection aborted before the response completed.
    + =connection may be kept alive after the response is + sent.
    - = connection will be closed after the response is + sent.
    + +

    (This directive was %...c in late versions of Apache + 1.3, but this conflicted with the historical ssl + %...{var}c syntax.)

    %...IBytes received, including request and headers, cannot be zero. + You need to enable mod_logio to use this.
    %...OBytes sent, including headers, cannot be zero. You need to + enable mod_logio to use this.
    + +

    The "..." can be nothing at all (e.g., + "%h %u %r %s %b"), or it can indicate conditions for + inclusion of the item (which will cause it to be replaced with "-" if + the condition is not met). The forms of condition are a list of + HTTP status codes, which may or may not be preceded by "!". + Thus, "%400,501{User-agent}i" logs User-agent: on 400 + errors and 501 errors (Bad Request, Not Implemented) only; + "%!200,304,302{Referer}i" logs Referer: on all requests + which did not return some sort of normal status.

    + +

    The modifiers "<" and ">" can be used for requests that + have been internally redirected to choose whether the original or + final (respectively) request should be consulted. By default, the + % directives %s, %U, %T, %D, and + %r look at the original request while all others look + at the final request. So for example, %>s can be + used to record the final status of the request and + %<u can be used to record the original + authenticated user on a request that is internally redirected to an + unauthenticated resource.

    + +

    Note that in httpd 2.0 versions prior to 2.0.46, no escaping was performed + on the strings from %...r, %...i and + %...o. This was mainly to comply with the requirements of + the Common Log Format. This implied that clients could insert control + characters into the log, so you had to be quite careful when dealing + with raw log files.

    + +

    For security reasons, starting with 2.0.46, non-printable and + other special characters are escaped mostly by using + \xhh sequences, where hh stands for + the hexadecimal representation of the raw byte. Exceptions from this + rule are " and \ which are escaped by prepending + a backslash, and all whitespace characters which are written in their + C-style notation (\n, \t etc).

    + +

    Note that in httpd 2.0, unlike 1.3, the %b and + %B format strings do not represent the number of + bytes sent to the client, but simply the size in bytes of the HTTP + response (which will differ, for instance, if the connection is + aborted, or if SSL is used). The %O format provided + by mod_logio will log the actual number of bytes + sent over the network.

    + +

    Some commonly used log format strings are:

    + +
    +
    Common Log Format (CLF)
    +
    "%h %l %u %t \"%r\" %>s %b"
    + +
    Common Log Format with Virtual Host
    +
    "%v %h %l %u %t \"%r\" %>s %b"
    + +
    NCSA extended/combined log format
    +
    "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" + \"%{User-agent}i\""
    + +
    Referer log format
    +
    "%{Referer}i -> %U"
    + +
    Agent (Browser) log format
    +
    "%{User-agent}i"
    +
    + +

    Note that the canonical ServerName and Listen of the server serving the + request are used for %v and %p + respectively. This happens regardless of the UseCanonicalName setting + because otherwise log analysis programs would have to duplicate + the entire vhost matching algorithm in order to decide what + host really served the request.

    +
    top
    +
    +

    Security Considerations

    +

    See the security tips + document for details on why your security could be compromised + if the directory where logfiles are stored is writable by + anyone other than the user that starts the server.

    +
    +
    top
    +

    BufferedLogs Directive

    + + + + + + + + +
    Description:Buffer log entries in memory before writing to disk
    Syntax:BufferedLogs On|Off
    Default:BufferedLogs Off
    Context:server config
    Status:Base
    Module:mod_log_config
    Compatibility:Available in versions 2.0.41 and later.
    +

    The BufferedLogs directive causes + mod_log_config to store several log entries in + memory and write them together to disk, rather than writing them + after each request. On some systems, this may result in more + efficient disk access and hence higher performance. It may be + set only once for the entire server; it cannot be configured + per virtual-host.

    + +
    This directive is experimental and should be used with + caution.
    + +
    +
    top
    +

    CookieLog Directive

    + + + + + + + +
    Description:Sets filename for the logging of cookies
    Syntax:CookieLog filename
    Context:server config, virtual host
    Status:Base
    Module:mod_log_config
    Compatibility:This directive is deprecated.
    +

    The CookieLog directive sets the + filename for logging of cookies. The filename is relative to the + ServerRoot. This directive is + included only for compatibility with mod_cookies, + and is deprecated.

    + +
    +
    top
    +

    CustomLog Directive

    + + + + + + +
    Description:Sets filename and format of log file
    Syntax:CustomLog file|pipe +format|nickname +[env=[!]environment-variable]
    Context:server config, virtual host
    Status:Base
    Module:mod_log_config
    +

    The CustomLog directive is used to + log requests to the server. A log format is specified, and the + logging can optionally be made conditional on request + characteristics using environment variables.

    + +

    The first argument, which specifies the location to which + the logs will be written, can take one of the following two + types of values:

    + +
    +
    file
    +
    A filename, relative to the ServerRoot.
    + +
    pipe
    +
    The pipe character "|", followed by the path + to a program to receive the log information on its standard + input. + +

    Security:

    +

    If a program is used, then it will be run as the user who + started httpd. This will be root if the server was + started by root; be sure that the program is secure.

    +
    +

    Note

    +

    When entering a file path on non-Unix platforms, care should be taken + to make sure that only forward slashed are used even though the platform + may allow the use of back slashes. In general it is a good idea to always + use forward slashes throughout the configuration files.

    +
    +
    + +

    The second argument specifies what will be written to the + log file. It can specify either a nickname defined by + a previous LogFormat + directive, or it can be an explicit format string as + described in the log formats section.

    + +

    For example, the following two sets of directives have + exactly the same effect:

    + +

    + # CustomLog with format nickname
    + LogFormat "%h %l %u %t \"%r\" %>s %b" common
    + CustomLog logs/access_log common
    +
    + # CustomLog with explicit format string
    + CustomLog logs/access_log "%h %l %u %t \"%r\" %>s %b" +

    + +

    The third argument is optional and controls whether or + not to log a particular request based on the + presence or absence of a particular variable in the server + environment. If the specified environment + variable is set for the request (or is not set, in the case + of a 'env=!name' clause), then the + request will be logged.

    + +

    Environment variables can be set on a per-request + basis using the mod_setenvif + and/or mod_rewrite modules. For + example, if you want to record requests for all GIF + images on your server in a separate logfile but not in your main + log, you can use:

    + +

    + SetEnvIf Request_URI \.gif$ gif-image
    + CustomLog gif-requests.log common env=gif-image
    + CustomLog nongif-requests.log common env=!gif-image +

    + +

    Or, to reproduce the behavior of the old RefererIgnore + directive, you might use the following:

    + +

    + SetEnvIf Referer example\.com localreferer
    + CustomLog referer.log referer env=!localreferer +

    + +
    +
    top
    +

    LogFormat Directive

    + + + + + + + +
    Description:Describes a format for use in a log file
    Syntax:LogFormat format|nickname +[nickname]
    Default:LogFormat "%h %l %u %t \"%r\" %>s %b"
    Context:server config, virtual host
    Status:Base
    Module:mod_log_config
    +

    This directive specifies the format of the access log + file.

    + +

    The LogFormat directive can take one of two + forms. In the first form, where only one argument is specified, + this directive sets the log format which will be used by logs + specified in subsequent TransferLog + directives. The single argument can specify an explicit + format as discussed in the custom log + formats section above. Alternatively, it can use a + nickname to refer to a log format defined in a + previous LogFormat directive as described + below.

    + +

    The second form of the LogFormat + directive associates an explicit format with a + nickname. This nickname can then be used in + subsequent LogFormat or + CustomLog directives + rather than repeating the entire format string. A + LogFormat directive that defines a nickname + does nothing else -- that is, it only + defines the nickname, it doesn't actually apply the format and make + it the default. Therefore, it will not affect subsequent + TransferLog directives. + In addition, LogFormat cannot use one nickname + to define another nickname. Note that the nickname should not contain + percent signs (%).

    + +

    Example

    + LogFormat "%v %h %l %u %t \"%r\" %>s %b" vhost_common +

    + +
    +
    top
    +

    TransferLog Directive

    + + + + + + +
    Description:Specify location of a log file
    Syntax:TransferLog file|pipe
    Context:server config, virtual host
    Status:Base
    Module:mod_log_config
    +

    This directive has exactly the same arguments and effect as + the CustomLog + directive, with the exception that it does not allow the log format + to be specified explicitly or for conditional logging of requests. + Instead, the log format is determined by the most recently specified + LogFormat directive + which does not define a nickname. Common Log Format is used if no + other format has been specified.

    + +

    Example

    + LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\""
    + TransferLog logs/access_log +

    + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_log_config.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_log_config.html.ja.utf8 new file mode 100644 index 00000000..6a6921e6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_log_config.html.ja.utf8 @@ -0,0 +1,435 @@ + + + +mod_log_config - Apache HTTP サーバ + + + + + + +
    <-
    + +
    +

    Apache モジュール mod_log_config

    +
    +

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

    +
    +
    This translation may be out of date. Check the + English version for recent changes.
    + + + +
    説明:サーバへのリクエストのロギング
    ステータス:Base
    モジュール識別子:log_config_module
    ソースファイル:mod_log_config.c
    +

    概要

    + +

    + このモジュールはクライアントのリクエストを柔軟にログ収集する機能を + 提供します。ログはカスタマイズ可能な書式で書かれ、ファイルに直接 + 書いたり、外部プログラムに渡したりすることができます。個々のリクエストを + 特徴に応じてログに書いたり書かなかったりできるように、条件による + ログ収集も提供されています。

    + +

    このモジュールは三つのディレクティブ提供します: + ログファイルを作成するための TransferLog, + 新しい書式を 定義する LogFormat, + ログファイルと 書式を一度に定義する CustomLog です。 + 各リクエストが複数回ログ収集されるようにするために + TransferLog ディレクティブと + CustomLog + ディレクティブは複数回使用することができます。

    +
    + +
    top
    +
    +

    カスタムログ書式

    + +

    LogFormat ディレクティブと + CustomLog + ディレクティブの書式を指定する引数は文字列です。この文字列を使ってそれぞれの + リクエストがログファイルにログ収集されます。その文字列には + ログファイルにそのまま + 書かれる文字列や、それぞれ改行とタブを現す C 言語 + 形式の制御文字 "\n" と "\t" + とを含めることができます。そのまま出力させたい引用符とバックスラッシュは + バックスラッシュでエスケープする必要があります。

    + +

    リクエストの特徴そのものは "%" + ディレクティブを書式の文字列に書くことで + ログ収集されます。"%" + ディレクティブはログファイル中では以下のような + 値で置換されます:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    フォーマット文字列説明
    %%パーセント記号 (Apache 2.0.44 以降)
    %...aリモート IP アドレス
    %...Aローカル IP アドレス
    %...BHTTP ヘッダ以外の送られたバイト数
    %...bHTTP ヘッダ以外の送られたバイト数。CLF 書式。 + すなわち、1 バイトも送られなかったときは 0 ではなく、 + '-' になる
    %...{Foobar}Cサーバに送られたリクエスト中のクッキー Foobar の値
    %...Dリクエストを処理するのにかかった時間、マイクロ秒単位
    %...{FOOBAR}e環境変数 FOOBAR の内容
    %...fファイル名
    %...hリモートホスト
    %...Hリクエストプロトコル
    %...{Foobar}iサーバに送られたリクエストの Foobar: + ヘッダの内容
    %...l(identd からもし提供されていれば) リモートログ名。 + これは + IdentityCheck + ディレクティブが On に設定されていない限り、 + - になります。
    %...mリクエストメソッド
    %...{Foobar}n他のモジュールからのメモ Foobar の内容
    %...{Foobar}o応答の Foobar: ヘッダの内容
    %...pリクエストを扱っているサーバの正式なポート
    %...Pリクエストを扱った子プロセスのプロセス ID
    %...{format}Pリクエストを扱ったワーカーのプロセス ID かスレッド ID。 + format として有効な値は pid と tid + (Apache 2.0.46 以降) +
    %...q問い合せ文字列 (存在する場合は前に ? が追加される。 + そうでない場合は空文字列)
    %...rリクエストの最初の行
    %...sステータス。内部でリダイレクトされたリクエストは、元々の + リクエストのステータス --- 最後のステータスは %...>s +
    %...t時刻。CLF の時刻の書式 (標準の英語の書式)
    %...{format}tformat で与えられた書式による時刻。format は + strftime (3) の + 書式である必要がある。(地域化されている可能性がある)
    %...Tリクエストを扱うのにかかった時間、秒単位
    %...uリモートユーザ (認証によるもの。ステータス (%s) が + 401 のときは意味がないものである可能性がある) +
    %...Uリクエストされた URL パス。クエリ文字列は含まない
    %...vリクエストを扱っているサーバの正式な ServerName
    %...VUseCanonicalName の設定によるサーバ名
    %...X応答が完了したときの接続ステータス: + + + + + + + + + +
    X =応答が完了する前に接続が異常終了
    + =応答が送られた後に接続を持続することが可能
    - = 応答が送られた後に接続が切られる
    + +

    (このディレクティブは Apache + 1.3 の後期のバージョンでは %...c に割り当てられて + いましたが、これは歴史的に ssl が使用している + %...{var}c + 構文と衝突していました。)

    %...Iリクエストとヘッダを含む、受け取ったバイト数。 + 0 にはならない。 + これを使用するためには mod_logio が必要
    %...Oヘッダを含む、送信したバイト数。0 にはならない。 + これを使用するためには mod_logio が必要
    + +

    "..." は何もないか (例えば、 + "%h %u %r %s %b" のように)、 + その項目を含めるかどうかの条件 (もし条件に合わなかったときは + その項目は "-" になります) にすることができます。条件の形式は + HTTP ステータスコードのリストで、前に "!" を付けることもできます。 + ですから、"%400,501{User-agent}i" は 400 エラーと 501 エラー + (Bad Request と Not Implemented) のときのみ User-agent: + をログ収集します。 + "%!200,304,302{Referer}i" は普通のステータスを返さなかった + すべてのリクエストで Referer: をログ収集します。

    + +

    修飾子 "<" と ">" は内部リダイレクトされたリクエストのログに + 元のリクエストか最終的なリクエストのどちらを使用するかを + 指定するために使います。デフォルトでは、% ディレクティブの + %s, %U, %T, %D, %r は元のリクエストを、他は最終的なリクエストを + 使用します。例えば、リクエストの最終ステータスを記録するには + %>s を、内部的に認証されていないリソースへリダイレクトされた + リクエストで元のリクエストで認証されたユーザを記録するためには + %<u を使うことができます。

    + +

    httpd 2.0 の 1.3.25 より前のバージョンでは、 + %...r, %...i, + %...o の文字列は + エスケープされていなかったことに + 注意してください。これは主に Common Log Format からの要求によるものです。 + これは、クライアントがログに制御文字を挿入することができるということで、 + 生のログファイルを扱うときには非常に注意が必要でした。

    + +

    セキュリティ上の理由により 2.0.46 より印字不可能な文字と + 他の特別な文字は、ほとんど \xhh という + 文字列でエスケープされるようになりました。ここで、hh は + そのままのバイトの値の 16 進での値です。この規則の例外には、 + バックスラッシュを使ってエスケープされる " と \ と、 + C 形式の表記法が使われる空白文字 (\n, \t など) が + あります。

    + +

    よく使われるフォーマット文字列は:

    + +
    +
    Common Log Format (CLF)
    +
    "%h %l %u %t \"%r\" %>s %b"
    + +
    バーチャルホスト付き Common Log Format
    +
    "%v %h %l %u %t \"%r\" %>s %b"
    + +
    NCSA extended/combined ログ書式
    +
    "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" + \"%{User-agent}i\""
    + +
    Referer ログ書式
    +
    "%{Referer}i -> %U"
    + +
    Agent (ブラウザ) ログ書式
    +
    "%{User-agent}i"
    +
    + +

    %v と %p にはそれぞれ、 + リクエストを扱っているサーバの正規化された + ServerName と Listen が使われるということに注意してください。 + これは UseCanonicalName の + 設定に関わらず、常にそうなります。そうしないとどの + ホストが実際にリクエストを扱ったのかを知るために、 + ログ解析プログラムがバーチャルホストのマッチングをとるアルゴリズム全体を + 再実装しなければならなくなるからです。

    +
    top
    +
    +

    セキュリティに関して

    +

    ログファイルが保存されているディレクトリがサーバを起動した以外のユーザで + 書き込み可能なときにセキュリティの問題が発生する理由の詳細はセキュリティのこつ + を参照してください。

    +
    +
    top
    +

    CookieLog ディレクティブ

    + + + + + + + +
    説明:クッキングのロギングのためのファイル名を設定する
    構文:CookieLog filename
    コンテキスト:サーバ設定ファイル, バーチャルホスト
    ステータス:Base
    モジュール:mod_log_config
    互換性:このディレクティブは非推奨
    +

    CookieLog + ディレクティブはクッキーのロギングのためのファイル名を + 設定します。filename は ServerRoot + からの相対パスです。このディレクティブは mod_cookies との互換性のためだけに + 存在し、使用は推奨されていません。

    + +
    +
    top
    +

    CustomLog ディレクティブ

    + + + + + + +
    説明:ログファイルの名前と書式を設定する
    構文:CustomLog file|pipe +format|nickname +[env=[!]environment-variable]
    コンテキスト:サーバ設定ファイル, バーチャルホスト
    ステータス:Base
    モジュール:mod_log_config
    +

    CustomLog ディレクティブはサーバへのリクエストを + ログ収集するために使われます。ログの書式が指定され、 + 環境変数を使ってロギングが条件に応じて行なわれるようにすることもできます。

    + +

    ログが書かれる場所を指定する最初の引数は以下の二つの形式の値を + とることができます:

    + +
    +
    file
    +
    ServerRoot + からの相対パスで表されるファイル名。
    + +
    pipe
    +
    パイプ文字 "|" と、その後に標準入力からログの + 情報を受けとるプログラムへのパスが続いたもの。 + +

    セキュリティ

    +

    もしプログラムが使用された場合、 + httpd が起動されたユーザとして実行されます。これはサーバが + root によって起動された場合は root になります。プログラムが + 安全であるように留意してください。

    +
    +

    注

    +

    Unix でないプラットフォームでファイルのパスを入力しているときは、 + 使用しているプラットフォームがバックスラッシュの使用を許可していた + として、通常のスラッシュだけを使うように気をつけてください。 + 一般的に、設定ファイル中では常に普通のスラッシュのみを使うようにする + 方が良いです。

    +
    +
    + +

    二つめの引数はログファイルに何が書かれるかを指定します。 + 前にある LogFormat ディレクティブにより + 定義された nickname か、ログの書式 + のところで説明されている、明示的な format 文字列の + どちらかを指定することができます。

    + +

    例えば、以下の二つのディレクティブ群は全く同じ効果をもたらします:

    + +

    + # CustomLog with format nickname
    + LogFormat "%h %l %u %t \"%r\" %>s %b" common
    + CustomLog logs/access_log common
    +
    + # CustomLog with explicit format string
    + CustomLog logs/access_log "%h %l %u %t \"%r\" %>s %b" +

    + +

    三つ目の引数は省略可能で、サーバの環境にある変数があるかないかに + 応じてリクエストをログ収集するかどうかを制御するために使うことができます。 + 指定された環境変数がリクエストに対して + 設定されていた場合 ('env=!name' 文が使われたときは + 設定されていない場合)、リクエストがログ収集されます。

    + +

    環境変数は mod_setenvif モジュールと + mod_rewrite モジュールの両方もしくは + 片方を用いてリクエストごとに設定することができます。 + 例えば、サーバにあるすべての GIF 画像へのリクエストを別のログファイル + には記録したいけれど、メインログには記録したくない、というときは + 以下のものを使うことができます:

    + +

    + SetEnvIf Request_URI \.gif$ gif-image
    + CustomLog gif-requests.log common env=gif-image
    + CustomLog nongif-requests.log common env=!gif-image +

    + +
    +
    top
    +

    LogFormat ディレクティブ

    + + + + + + + +
    説明:ログファイルで使用する書式を設定する
    構文:LogFormat format|nickname +[nickname]
    デフォルト:LogFormat "%h %l %u %t \"%r\" %>s %b"
    コンテキスト:サーバ設定ファイル, バーチャルホスト
    ステータス:Base
    モジュール:mod_log_config
    +

    このディレクティブはアクセスログファイルの書式を指定します。

    + +

    LogFormat ディレクティブは二つの形式のどちらかを + とることができます。最初の形式では一つの引数のみが指定され、 + 続く TransferLog + で指定されたログで使われるログの書式を設定します。この単独の引数では + 上のカスタムログ書式で説明されているように + format を明示的に指定することができます。 + もしくは、下で説明されているように前に LogFormat + ディレクティブで定義されたログの書式を nicknameを使って + 参照することもできます。

    + +

    LogFormat ディレクティブの二つめの形式は + format に nickname を与えます。 + フォーマット文字列全体を再び書くかわりに、 + この nickname を続きの LogFormat ディレクティブや + CustomLog ディレクティブで使うことができます。 + Nickname を定義する LogFormat ディレクティブは + 他には何もしません -- すなわち、ニックネームを定義 + するだけで、実際に書式を適用してデフォルトにするということは行ないません。 + ですから、これは続く TransferLog + ディレクティブには影響を与えません。 + さらに、LogFormat ディレクティブは既存の nickname を + 使って別の nickname を定義することはできません。Nickname には + パーセント記号 (%) が含まれていてはいけないことにも注意 + してください。

    + +

    例

    + LogFormat "%v %h %l %u %t \"%r\" %>s %b" vhost_common +

    + +
    +
    top
    +

    TransferLog ディレクティブ

    + + + + + + +
    説明:ログファイルの位置を指定
    構文:TransferLog file|pipe
    コンテキスト:サーバ設定ファイル, バーチャルホスト
    ステータス:Base
    モジュール:mod_log_config
    +

    このディレクティブは、ログ書式を直接指定できないことと、 + 条件付きロギングが無いことを除くと、CustomLog と全く同じ引数と効果があります。 + 直接ログ書式を指定する代わりに、ログの書式はそこまでで一番最後に指定された + ニックネームを定義しない + LogFormat ディレクティブ + で定義されたものを使います。 + もし他の書式が全く指定されていないときは Common Log Format + が使われます。

    + +

    例

    + LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\""
    + TransferLog logs/access_log +

    + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_log_config.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_log_config.html.ko.euc-kr new file mode 100644 index 00000000..7bbb5fff --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_log_config.html.ko.euc-kr @@ -0,0 +1,403 @@ + + + +mod_log_config - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    ¾ÆÆÄÄ¡ ¸ðµâ mod_log_config

    +
    +

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

    +
    +
    ÀÌ ¹®¼­´Â ÃÖ½ÅÆÇ ¹ø¿ªÀÌ ¾Æ´Õ´Ï´Ù. + ÃÖ±Ù¿¡ º¯°æµÈ ³»¿ëÀº ¿µ¾î ¹®¼­¸¦ Âü°íÇϼ¼¿ä.
    + + + +
    ¼³¸í:¼­¹ö·ÎÀÇ ¿äûÀ» ·Î±×¿¡ ±â·ÏÇÑ´Ù
    »óÅÂ:Base
    ¸ðµâ¸í:log_config_module
    ¼Ò½ºÆÄÀÏ:mod_log_config.c
    +

    ¿ä¾à

    + +

    ÀÌ ¸ðµâÀº Ŭ¶óÀ̾ðÆ®ÀÇ ¿äûÀ» ·Î±×¿¡ ÀÚÀ¯·Ó°Ô ±â·ÏÇÑ´Ù. + ÀÚ½ÅÀÌ ¿øÇÏ´Â Çü½ÄÀ¸·Î ·Î±×¸¦ ±â·ÏÇÒ ¼ö ÀÖ°í, ÆÄÀÏÀ̳ª ¿ÜºÎ + ÇÁ·Î±×·¥¿¡ Á÷Á¢ ·Î±×¸¦ º¸³¾ ¼öµµ ÀÖ´Ù. Á¶°ÇÀû ·Î±×¸¦ »ç¿ëÇϸé + ¿äûÀÇ ¼º°Ý¿¡ µû¶ó ¿äûÀ» ·Î±×¿¡ Ãß°¡Çϰųª Á¦¿ÜÇÒ ¼ö ÀÖ´Ù.

    + +

    ÀÌ ¸ðµâÀº ¼¼°¡Áö Áö½Ã¾î¸¦ Á¦°øÇÑ´Ù. TransferLog´Â ·Î±×ÆÄÀÏÀ» + ¸¸µé°í, LogFormatÀº + ¿øÇÏ´Â Çü½ÄÀ» Á¤ÇÏ°í, CustomLog´Â Çѹø¿¡ ·Î±×ÆÄÀÏ°ú + Çü½ÄÀ» ¸ðµÎ ÁöÁ¤ÇÑ´Ù. TransferLog¿Í + CustomLog Áö½Ã¾î¸¦ ¿©·¯¹ø »ç¿ëÇϸé + ¿äûÀ» ¿©·¯ ÆÄÀÏ¿¡ ±â·ÏÇÒ ¼ö ÀÖ´Ù.

    +
    + +
    top
    +
    +

    ·Î±× Çü½Ä ÁöÁ¤Çϱâ

    + +

    LogFormat°ú + CustomLog + Áö½Ã¾îÀÇ Çü½Ä ¾Æ±Ô¸ÕÆ®´Â ¹®ÀÚ¿­ÀÌ´Ù. ÀÌ ¹®ÀÚ¿­¿¡ µû¶ó ¿äûÀ» + ·Î±×ÆÄÀÏ¿¡ ±â·ÏÇÑ´Ù. ¹®ÀÚ¿­¿¡´Â ·Î±×ÆÄÀÏ¿¡ ±×´ë·Î º¹»çµÇ´Â + ¹®ÀÚ¿Í Çà¹Ù²Þ°ú ÅÇÀ» ³ªÅ¸³»´Â CÀÇ "\n"°ú "\t" Á¦¾î¹®ÀÚ¸¦ + »ç¿ëÇÒ ¼ö ÀÖ´Ù. ·Î±×ÆÄÀÏ¿¡ µû¿ÈÇ¥³ª ¹é½½·¡½¬¸¦ ¾²·Á¸é ¾Õ¿¡ + ¹Ýµå½Ã ¹é½½·¡½¬¸¦ Àû¾îÁà¾ß ÇÑ´Ù.

    + +

    ¿äûÀÇ Æ¯Â¡Àº Çü½Ä ¹®ÀÚ¿­¿¡ "%" Áö½Ã¾î¸¦ + »ç¿ëÇÏ¿© ±â·ÏÇÑ´Ù. ÀÌ Áö½Ã¾î´Â ·Î±×ÆÄÀÏ¿¡¼­ ´ÙÀ½°ú °°ÀÌ + º¯°æµÈ´Ù.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Çü½Ä ¹®ÀÚ¿­¼³¸í
    %%ÆÛ¼¾Æ® ±âÈ£ (¾ÆÆÄÄ¡ 2.0.44 ÀÌÈÄ)
    %...a¿ø°Ý IP-ÁÖ¼Ò
    %...A(¼­¹ö) IP-ÁÖ¼Ò
    %...BHTTP Çì´õ¸¦ Á¦¿ÜÇÑ Àü¼Û ¹ÙÀÌÆ®¼ö.
    %...bHTTP Çì´õ¸¦ Á¦¿ÜÇÑ Àü¼Û ¹ÙÀÌÆ®¼ö. CLF Çü½Ä°ú °°ÀÌ + Àü¼ÛÇÑ ³»¿ëÀÌ ¾ø´Â °æ¿ì 0 ´ë½Å '-'°¡ ³ª¿Â´Ù.
    %...{Foobar}C¼­¹ö°¡ ¼ö½ÅÇÑ ¿äû¿¡¼­ Foobar ÄíÅ°ÀÇ + ³»¿ë.
    %...D¿äûÀ» ó¸®Çϴµ¥ °É¸° ½Ã°£ (¸¶ÀÌÅ©·ÎÃÊ ´ÜÀ§).
    %...{FOOBAR}eȯ°æº¯¼ö FOOBARÀÇ ³»¿ë
    %...fÆÄÀϸí
    %...h¿ø°Ý È£½ºÆ®
    %...H¿äû ÇÁ·ÎÅäÄÝ
    %...{Foobar}i¼­¹ö°¡ ¼ö½ÅÇÑ ¿äû¿¡¼­ Foobar: + Çì´õÀÇ ³»¿ë.
    %...l(ÀÖ´Ù¸é identd°¡ Á¦°øÇÑ) ¿ø°Ý ·Î±×Àθí. + IdentityCheck°¡ + OnÀÌ ¾Æ´Ï¸é »©±â±âÈ£¸¦ ±â·ÏÇÑ´Ù.
    %...m¿äû ¸Þ½áµå
    %...{Foobar}n´Ù¸¥ ¸ðµâÀÌ ±â·ÏÇÑ Foobar ³ëÆ®(note) + ³»¿ë.
    %...{Foobar}oÀÀ´äÀÇ Foobar: Çì´õ ³»¿ë.
    %...p¿äûÀ» ¼­ºñ½ºÇÏ´Â ¼­¹öÀÇ Á¤±Ô Æ÷Æ®
    %...P¿äûÀ» ¼­ºñ½ºÇÏ´Â ÀÚ½ÄÀÇ ÇÁ·Î¼¼½º ID.
    %...{format}P¿äûÀ» ¼­ºñ½ºÇÏ´Â ÀÚ½ÄÀÇ ÇÁ·Î¼¼½º ID ȤÀº ¾²·¹µå + ID. format¿¡´Â pid¿Í tid°¡ + °¡´ÉÇÏ´Ù. (¾ÆÆÄÄ¡ 2.0.46 ÀÌÈÄ) +
    %...qÁúÀǹ®ÀÚ¿­ (ÁúÀǹ®ÀÚ¿­ÀÌ ÀÖ´Ù¸é ¾Õ¿¡ ?¸¦ + ºÙÀÌ°í, ¾ø´Ù¸é ºó ¹®ÀÚ¿­)
    %...r¿äûÀÇ Ã¹¹ø° ÁÙ
    %...s»óÅÂ(status). ³»ºÎ ¸®´ÙÀÌ·º¼ÇµÈ ¿äûÀÇ °æ¿ì *¿ø·¡* + ¿äûÀÇ »óÅÂÀÌ´Ù. ÃÖÁ¾ ¿äûÀÇ »óÅ´ %...>s.
    %...tcommon log format ½Ã°£ Çü½Ä(Ç¥ÁØ ¿µ¾î Çü½Ä)ÀÇ ½Ã°£
    %...{format}tstrftime(3) Çü½Ä formatÀÇ ½Ã°£. (Áö¿ª½Ã°£ÀÏ + ¼ö ÀÖÀ½)
    %...T¿äûÀ» ó¸®Çϴµ¥ °É¸° ½Ã°£ (ÃÊ ´ÜÀ§).
    %...u¿ø°Ý »ç¿ëÀÚ (auth°¡ Á¦°øÇϸç, »óÅÂ(%s)°¡ + 401ÀÎ °æ¿ì ÀÌ»óÇÑ °ªÀ» ³ª¿Ã ¼ö ÀÖÀ½)
    %...UÁúÀǹ®ÀÚ¿­À» Á¦¿ÜÇÑ ¿äû URL °æ·Î.
    %...v¿äûÀ» ¼­ºñ½ºÇÑ ¼­¹öÀÇ Á¤±Ô ServerName.
    %...VUseCanonicalName + ¼³Á¤¿¡ µû¸¥ ¼­¹ö¸í.
    %...XÀÀ´äÀ» ¸¶ÃÆÀ»¶§ ¿¬°á »óÅÂ. + + + + + + + + + +
    X =ÀÀ´äÀ» ¸¶Ä¡±â Àü¿¡ ¿¬°áÀÌ ²÷¾îÁ³´Ù.
    + =ÀÀ´äÀ» º¸³½ÈÄ¿¡µµ ¿¬°áÀÌ »ì¾ÆÀÖ´Ù(keep alive).
    - = ÀÀ´äÀ» º¸³½ÈÄ ¿¬°áÀÌ ²÷¾îÁ³´Ù.
    + +

    (¾ÆÆÄÄ¡ 1.3 ÈÄ¹Ý ¹öÀü¿¡¼­ ÀÌ Áö½Ã¾î´Â + %...c¿´Áö¸¸, ÀüÅëÀûÀÎ ssl + %...{var}c ¹®¹ý°ú °ãÃļ­ + º¯°æÇß´Ù.)

    %...I¿äû°ú Çì´õ¸¦ Æ÷ÇÔÇÑ ¼ö½Å ¹ÙÀÌÆ®¼ö·Î 0ÀÏ ¼ö ¾ø´Ù. + À̸¦ »ç¿ëÇÏ·Á¸é mod_logio°¡ ÇÊ¿äÇÏ´Ù.
    %...OÇì´õ¸¦ Æ÷ÇÔÇÑ ¼Û½Å ¹ÙÀÌÆ®¼ö·Î 0ÀÏ ¼ö ¾ø´Ù. À̸¦ + »ç¿ëÇÏ·Á¸é mod_logio°¡ ÇÊ¿äÇÏ´Ù.
    + +

    "..."¿¡´Â (¿¹¸¦ µé¾î, + "%h %u %r %s %b") ¾Æ¹«°Íµµ ¾ø°Å³ª, Ç׸ñÀ» Æ÷ÇÔÇÒ + Á¶°ÇÀÌ ³ª¿Â´Ù (Á¶°ÇÀ» ¸¸Á·ÇÏÁö ¾ÊÀ¸¸é ÀÚ¸®¿¡ "-"¸¦ ±â·ÏÇÑ´Ù). + Á¶°ÇÀº ¾Õ¿¡ "!"¸¦ ºÙÀ̰ųª ¾ÈºÙÀÎ HTTP »óÅÂÄÚµå ¸ñ·ÏÀ¸·Î + ÀÛ¼ºÇÑ´Ù. ¿¹¸¦ µé¾î, "%400,501{User-agent}i"´Â 400 (Bad + Request) ¿À·ù¿Í 501 (Not Implemented) ¿À·ùÀ϶§¸¸ + User-agent:¸¦ ·Î±×¿¡ ³²±â°í, + "%!200,304,302{Referer}i"´Â Á¤»óÀûÀÎ »óÅ°¡ ¾Æ´Ñ + ¸ðµç ¿äû¿¡ ´ëÇØ Referer:¸¦ ·Î±×¿¡ ³²±ä´Ù.

    + +

    ¼öÁ¤ÀÚ "<"¿Í ">"´Â ³»ºÎ ¸®´ÙÀÌ·º¼ÇµÈ ¿äû¿¡¼­ °¢°¢ + óÀ½ ¿äûÀ» ¸»ÇÒÁö ¸¶Áö¸· ¿äûÀ» ¸»ÇÒÁö ¼±ÅÃÇÑ´Ù. ±âº»ÀûÀ¸·Î + %s, %U, %T, %D, %rÀº óÀ½ ¿äûÀ» º¸°í, ³ª¸ÓÁö + % Áö½Ã¾î´Â ¸¶Áö¸· ¿äûÀ» º»´Ù. ±×·¡¼­ + %>s´Â ¿äûÀÇ ¸¶Áö¸· »óÅÂ(status)¸¦ ±â·ÏÇÏ°í, + %<u´Â ÀÎÁõÀ¸·Î º¸È£ÇÏÁö ¾Ê´Â ÀÚ¿øÀ¸·Î ³»ºÎ + ¶ó´ÙÀÌ·º¼ÇµÈ °æ¿ì¿¡µµ óÀ½¿¡ ÀÎÁõÇÑ »ç¿ëÀÚ¸¦ ±â·ÏÇÑ´Ù.

    + +

    2.0.46 ÀÌÀüÀÇ httpd 2.0 ¹öÀüÀº %...r, + %...i, %...oÀÇ °á°ú ¹®ÀÚ¿­À» ±×´ë·Î + µÎ¾ú´Ù. ÀÌÀ¯´Â Common Log FormatÀÇ ¿ä±¸»çÇ×À» µû¸£±âÀ§Çؼ­¿´´Ù. + Áï, Ŭ¶óÀ̾ðÆ®°¡ Á¦¾î¹®ÀÚ¸¦ ·Î±×¿¡ Áý¾î³ÖÀ» ¼ö Àֱ⶧¹®¿¡ + ·Î±×ÆÄÀÏÀ» ±×´ë·Î ´Ù·ê ¶§´Â Á¶½ÉÇØ¾ß ÇÑ´Ù.

    + +

    º¸¾È»ó ÀÌÀ¯·Î 2.0.46ºÎÅÍ Ãâ·ÂÇÒ ¼ö ¾ø´Â ¹®ÀÚ³ª ´Ù¸¥ Ư¼ö¹®ÀÚ¸¦ + \xhh·Î Ç¥ÇöÇÑ´Ù. ¿©±â¼­ hh´Â + ÇØ´ç ¹ÙÀÌÆ®ÀÇ 16Áø¼ö Ç¥ÇöÀ» ³ªÅ¸³½´Ù. ÀÌ ±ÔÄ¢ÀÇ ¿¹¿Ü´Â ¹é½½·¡½¬¸¦ + ¾Õ¿¡ ºÙÀÌ´Â "¿Í \, ±×¸®°í C¾ð¾î + Çü½ÄÀÇ °ø¹é¹®ÀÚµé(\n, \t µî)ÀÌ´Ù.

    + +

    ÀϹÝÀûÀ¸·Î ¸¹ÀÌ »ç¿ëÇÏ´Â ·Î±× Çü½ÄÀº ´ÙÀ½°ú °°´Ù.

    + +
    +
    Common Log Format (CLF)
    +
    "%h %l %u %t \"%r\" %>s %b"
    + +
    °¡»óÈ£½ºÆ® Á¤º¸¸¦ Æ÷ÇÔÇÑ Common Log Format
    +
    "%v %h %l %u %t \"%r\" %>s %b"
    + +
    NCSA extended/combined ·Î±× Çü½Ä
    +
    "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" + \"%{User-agent}i\""
    + +
    Referer ·Î±× Çü½Ä
    +
    "%{Referer}i -> %U"
    + +
    Agent (ºê¶ó¿ìÀú) ·Î±× Çü½Ä
    +
    "%{User-agent}i"
    +
    + +

    ¿äûÀ» ¼­ºñ½ºÇÏ´Â ¼­¹öÀÇ Á¤±Ô ServerName°ú ListenÀº °¢°¢ %v¿Í + %p¸¦ »ç¿ëÇÑ´Ù. ·Î±×ºÐ¼® ÇÁ·Î±×·¥ÀÌ ½ÇÁ¦·Î ¿äûÀ» + ¼­ºñ½ºÇϴ ȣ½ºÆ®¸¦ ¾Ë±âÀ§ÇØ °¡»óÈ£½ºÆ® ã±â ¾Ë°í¸®ÁòÀ» + °¡Áú ÇÊ¿ä¾øµµ·Ï ÀÌµé °ªÀº UseCanonicalName ¼³Á¤°ú ¹«°üÇÏ´Ù.

    +
    top
    +
    +

    º¸¾È»ó °í·ÁÇÒ Á¡

    +

    ¼­¹ö¸¦ ½ÃÀÛÇÏ´Â »ç¿ëÀÚ¿Ü¿¡ ´Ù¸¥ »ç¿ëÀÚ°¡ ·Î±×ÆÄÀÏÀ» ÀúÀåÇÏ´Â + µð·ºÅ丮¿¡ ¾²±â ±ÇÇÑÀ» °¡Áú¶§ ¿Ö º¸¾È¿¡ ¹®Á¦°¡ »ý±â´ÂÁö + º¸¾È ÆÁ + ¹®¼­¸¦ Âü°íÇ϶ó.

    +
    +
    top
    +

    CookieLog Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:ÄíÅ°¸¦ ·Î±×¿¡ ³²±â±âÀ§ÇØ »ç¿ëÇÒ ÆÄÀϸíÀ» ¼³Á¤ÇÑ´Ù
    ¹®¹ý:CookieLog filename
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®
    »óÅÂ:Base
    ¸ðµâ:mod_log_config
    Áö¿ø:ÀÌ Áö½Ã¾î´Â »ç¿ëµÇÁö ¾Ê´Â´Ù.
    +

    CookieLog Áö½Ã¾î´Â ÄíÅ°¸¦ ·Î±×¿¡ + ³²±â±âÀ§ÇØ »ç¿ëÇÒ ÆÄÀϸíÀ» ¼³Á¤ÇÑ´Ù. ÆÄÀϸíÀº ServerRoot¿¡ »ó´ë°æ·ÎÀÌ´Ù. ÀÌ + Áö½Ã¾î´Â mod_cookies¿Í ȣȯÀ» À§ÇØ Æ÷ÇÔÇßÀ»»Ó, + ½ÇÁ¦ »ç¿ëµÇÁö ¾Ê´Â´Ù.

    + +
    +
    top
    +

    CustomLog Áö½Ã¾î

    + + + + + + +
    ¼³¸í:·Î±×ÆÄÀÏ À̸§°ú Çü½ÄÀ» ÁöÁ¤ÇÑ´Ù
    ¹®¹ý:CustomLog file|pipe +format|nickname +[env=[!]environment-variable]
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®
    »óÅÂ:Base
    ¸ðµâ:mod_log_config
    +

    ¼­¹ö°¡ ¿äûÀ» ·Î±×¿¡ ³²±æ¶§ CustomLog + Áö½Ã¾î¸¦ »ç¿ëÇÑ´Ù. ·Î±× Çü½ÄÀ» ÁöÁ¤ÇÏ°í, ȯ°æº¯¼ö¸¦ »ç¿ëÇÏ¿© + ¿äûÀÇ Æ¯Â¡¿¡ µû¶ó ¼±ÅÃÀûÀ¸·Î ·Î±×¸¦ ³²±æ ¼öµµ ÀÖ´Ù.

    + +

    ·Î±×¸¦ ±â·ÏÇÒ Àå¼Ò¸¦ ÁöÁ¤Çϴ ù¹ø° ¾Æ±Ô¸ÕÆ®¿¡´Â ´ÙÀ½ + µÑÁß Çϳª¸¦ »ç¿ëÇÑ´Ù.

    + +
    +
    file
    +
    ServerRoot¿¡ + »ó´ëÀûÀÎ ÆÄÀϸí.
    + +
    pipe
    +
    ÆÄÀÌÇÁ¹®ÀÚ "|"µÚ¿¡ ·Î±× Á¤º¸¸¦ Ç¥ÁØÀÔ·ÂÀ¸·Î + ¹ÞÀ» ÇÁ·Î±×·¥ °æ·Î¸¦ Àû´Â´Ù. + +

    º¸¾È:

    +

    ÇÁ·Î±×·¥À» »ç¿ëÇÑ´Ù¸é ÇÁ·Î±×·¥Àº À¥¼­¹ö¸¦ ½ÃÀÛÇÑ »ç¿ëÀÚ + ±ÇÇÑÀ¸·Î ½ÇÇàµÈ´Ù. ¼­¹ö¸¦ root·Î ½ÃÀÛÇÑ´Ù¸é ÇÁ·Î±×·¥µµ + root·Î ½ÇÇàÇϹǷΠÇÁ·Î±×·¥ÀÌ ¾ÈÀüÇÑÁö È®ÀÎÇ϶ó.

    +
    +

    ÁÖÀÇ

    +

    À¯´Ð½º°¡ ¾Æ´Ñ Ç÷¡Æû¿¡¼­ ÆÄÀÏ°æ·Î¸¦ ÀÔ·ÂÇÒ¶§ Ç÷¡ÆûÀÌ + ¹é½½·¡½¬¸¦ »ç¿ëÇÏ´õ¶óµµ ¹Ýµå½Ã ½½·¡½¬¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù. + ÀϹÝÀûÀ¸·Î ¼³Á¤ÆÄÀÏ¿¡¼­´Â Ç×»ó ½½·¡½¬¸¦ »ç¿ëÇÏ´Â °ÍÀÌ + ÁÁ´Ù.

    +
    +
    + +

    µÎ¹ø° ¾Æ±Ô¸ÕÆ®´Â ·Î±×ÆÄÀÏ¿¡ ±â·ÏÇÒ ³»¿ëÀ» ÁöÁ¤ÇÑ´Ù. + Àü¿¡ LogFormatÀ¸·Î + Á¤ÀÇÇÑ nicknameÀ» »ç¿ëÇϰųª Á÷Á¢ ·Î±× Çü½Ä Àý¿¡¼­ ¼³¸íÇÑ format + ¹®ÀÚ¿­À» »ç¿ëÇÒ ¼ö ÀÖ´Ù.

    + +

    ¿¹¸¦ µé¾î, ´ÙÀ½ µÎ Áö½Ã¾î´Â ¶È°°Àº ÀÏÀ» ÇÑ´Ù.

    + +

    + # Çü½Ä º°ÄªÀ» »ç¿ëÇÑ CustomLog
    + LogFormat "%h %l %u %t \"%r\" %>s %b" common
    + CustomLog logs/access_log common
    +
    + # Á÷Á¢ Çü½Ä ¹®ÀÚ¿­À» »ç¿ëÇÑ CustomLog
    + CustomLog logs/access_log "%h %l %u %t \"%r\" %>s %b" +

    + +

    ¼¼¹ø° ¾Æ±Ô¸ÕÆ®´Â ¾ø¾îµµ µÇ¸ç, ƯÁ¤ ¼­¹ö ȯ°æº¯¼ö À¯¹«¿¡ + µû¶ó ¿äûÀ» ·Î±×¿¡ ±â·ÏÇÒÁö ¿©ºÎ¸¦ °áÁ¤ÇÑ´Ù. ¿äû¿¡ ÁöÁ¤ÇÑ + ȯ°æº¯¼ö°¡ Á¤ÀǵÇÀÖ´Ù¸é (ȤÀº + 'env=!name'¸¦ »ç¿ëÇÑ °æ¿ì ¾ø´Ù¸é) + ¿äûÀ» ·Î±×¿¡ ±â·ÏÇÑ´Ù.

    + +

    mod_setenvif³ª mod_rewrite + ¸ðµâÀ» »ç¿ëÇÏ¿© ¿äûº°·Î ȯ°æº¯¼ö¸¦ ¼³Á¤ÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ + µé¾î, ¼­¹ö°¡ GIF ±×¸²¿¡ ´ëÇÑ ¸ðµç ¿äûÀ» ÁÖ¼­¹ö ·Î±×°¡ ¾Æ´Ñ + ´Ù¸¥ ·Î±×ÆÄÀÏ¿¡ ±â·ÏÇÏ·Á¸é,

    + +

    + SetEnvIf Request_URI \.gif$ gif-image
    + CustomLog gif-requests.log common env=gif-image
    + CustomLog nongif-requests.log common env=!gif-image +

    + +
    +
    top
    +

    LogFormat Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:·Î±×ÆÄÀÏ¿¡ »ç¿ëÇÒ Çü½ÄÀ» ±â¼úÇÑ´Ù
    ¹®¹ý:LogFormat format|nickname +[nickname]
    ±âº»°ª:LogFormat "%h %l %u %t \"%r\" %>s %b"
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®
    »óÅÂ:Base
    ¸ðµâ:mod_log_config
    +

    ÀÌ Áö½Ã¾î´Â Á¢±Ù ·Î±×ÆÄÀÏÀÇ Çü½ÄÀ» ÁöÁ¤ÇÑ´Ù.

    + +

    LogFormat Áö½Ã¾î´Â µÎ°¡Áö Çü½ÄÀ¸·Î + »ç¿ëÇÑ´Ù. ù¹ø° Çü½ÄÀº ¾Æ±Ô¸ÕÆ®¸¦ ÇÑ°³¸¸ »ç¿ëÇÏ¿© ´ÙÀ½ + TransferLog Áö½Ã¾îµéÀÌ »ç¿ëÇÒ ·Î±× + Çü½ÄÀ» ÁöÁ¤ÇÑ´Ù. ÀÌ ¾Æ±Ô¸ÕÆ®¿¡ À§ÀÇ ·Î±× + Çü½Ä ÁöÁ¤Çϱâ Àý¿¡¼­ ¼³¸íÇÑ formatÀ» Á÷Á¢ + »ç¿ëÇϰųª, ´ÙÀ½¿¡ ¼³¸íÇÒ LogFormat + Áö½Ã¾î·Î ¹Ì¸® Á¤ÀÇÇÑ (·Î±× Çü½ÄÀ» ÁöĪÇÏ´Â) nicknameÀ» + »ç¿ëÇÒ ¼ö ÀÖ´Ù.

    + +

    LogFormat Áö½Ã¾îÀÇ µÎ¹ø° Çü½ÄÀº + format°ú nicknameÀ» ¿¬°áÇÑ´Ù. ±×·¯¸é + µÚ¿¡¼­ »ç¿ëÇÏ´Â LogFormatÀ̳ª CustomLog Áö½Ã¾î¿¡ ¹Ýº¹Çؼ­ + Çü½Ä ¹®ÀÚ¿­À» ¸ðµÎ ÀÔ·ÂÇÏ´Â ´ë½Å nicknameÀ» »ç¿ëÇÒ + ¼ö ÀÖ´Ù. º°ÄªÀ» Á¤ÀÇÇÏ´Â LogFormat + Áö½Ã¾î´Â ÀÌ ¿Ü¿¡´Â ¾Æ¹« ±â´ÉÀ» ÇÏÁö ¾Ê´Â´Ù. + Áï, º°Äª¸¸À» Á¤ÀÇÇϸç, ½ÇÁ¦·Î Çü½ÄÀ» Àû¿ëÇϰųª + Çü½ÄÀ» ±âº»°ªÀ¸·Î ¸¸µéÁö ¾Ê´Â´Ù. ±×·¯¹Ç·Î ´ÙÀ½¿¡ ³ª¿À´Â + TransferLog + Áö½Ã¾î¿¡ ¿µÇâÀ» ÁÖÁö ¾Ê´Â´Ù. ¶Ç, + LogFormatÀº º°ÄªÀ¸·Î ´Ù¸¥ º°ÄªÀ» + Á¤ÀÇÇÒ ¼ö ÀÖ´Ù. º°Äª À̸§¿¡´Â ÆÛ¼¾Æ® ±âÈ£(%)¸¦ + »ç¿ëÇÒ ¼ö ¾øÀ½À» ÁÖÀÇÇ϶ó.

    + +

    ¿¹Á¦

    + LogFormat "%v %h %l %u %t \"%r\" %>s %b" vhost_common +

    + +
    +
    top
    +

    TransferLog Áö½Ã¾î

    + + + + + + +
    ¼³¸í:·Î±×ÆÄÀÏ À§Ä¡¸¦ ¼³Á¤ÇÑ´Ù
    ¹®¹ý:TransferLog file|pipe
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®
    »óÅÂ:Base
    ¸ðµâ:mod_log_config
    +

    ÀÌ Áö½Ã¾î´Â CustomLog Áö½Ã¾î¿Í ¾Æ±Ô¸ÕÆ®¿Í + ±â´ÉÀÌ ºñ½ÁÇÏÁö¸¸, ·Î±× Çü½ÄÀ» Á÷Á¢ ÁöÁ¤Çϰųª ¿äûÀ» Á¶°Ç¿¡ + µû¶ó ·Î±×¿¡ ³²±æ ¼ö ¾ø´Ù. ´ë½Å °¡Àå ÃÖ±Ù »ç¿ëÇÑ (º°ÄªÀ» + Á¤ÀÇÇÏÁö ¾ÊÀº) LogFormat Áö½Ã¾î°¡ ÁöÁ¤ÇÑ + ·Î±× Çü½ÄÀ» »ç¿ëÇÑ´Ù. ¹Ì¸® Çü½ÄÀ» ÁöÁ¤ÇÏÁö ¾Ê¾Ò´Ù¸é Common + Log FormatÀ» »ç¿ëÇÑ´Ù.

    + +

    ¿¹Á¦

    + LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\""
    + TransferLog logs/access_log +

    + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_log_config.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_log_config.html.tr.utf8 new file mode 100644 index 00000000..e610859f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_log_config.html.tr.utf8 @@ -0,0 +1,466 @@ + + + +mod_log_config - Apache HTTP Sunucusu + + + + + + +
    <-
    + +
    +

    Apache Modülü mod_log_config

    +
    +

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

    +
    + + + +
    Açıklama:Sunucuya yapılan isteklerin günlük kayıtlarının tutulması +
    Durum:Temel
    Modül Betimleyici:log_config_module
    Kaynak Dosyası:mod_log_config.c
    +

    Özet

    + +

    Bu modül istemci isteklerinin esnek şekilde günlüklenmesi ile + ilgilidir. Günlükler kişiselleştirilebilir biçemdedir ve doğrudan bir + dosyaya yazılabileceği gibi boru üzerinden harici bir sürece de + yazılabilir. İsteğin özelliklerine bağlı olarak bazı isteklerin + günlüklere kaydedilmesi veya kaydedilmemesi mümkün kılınmıştır.

    + +

    Bu modül üç yönerge içermektedir: Bir günlük dosyası oluşturmak için + TransferLog, günlük + biçemini kişiselleştirmek için LogFormat ve tek başına bir günlük + dosyasını hem tanımlayıp hem de biçemleyen CustomLog yönergesi. Her isteğin + çok sayıda dosyaya günlüklenmesini sağlamak için yapılandırma dosyasında + her sunucu için birden fazla TransferLog ve + CustomLog yönergesi belirtilebilir.

    +
    + +
    top
    +
    +

    Günlük Girdilerinin Kişiselleştirilmesi

    + +

    LogFormat ve CustomLog yönergelerinin biçem + argümanı bir dizgedir. Bu dizge her isteği günlük dosyasına günlüklemek + için kullanılır. Doğrudan günlük dosyalarına kopyalanmak üzere dizgesel + sabitler içerebileceği gibi satırsonu ve sekme karakterleri olarak C + tarzı "\n" ve "\t" denetim karakterlerini de içerebilir. Dizgesel sabit + olarak kullanılan tırnak ve tersbölü imlerinin tersbölü ile öncelenmesi + gerekir.

    + +

    İstek özellikleri biçem dizgesine “%” imli belirteçler + yerleştirilerek günlüklenir. Bu belirteçler ve anlamları:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    BelirteçAçıklama
    %%Yüzde imi (Apache 2.0.44 ve sonrası)
    %...aUzak IP adresi
    %...AYerel IP adresi
    %...BHTTP başlıkları hariç, yanıtın bayt cinsinden uzunluğu.
    %...bHTTP başlıkları hariç, yanıtın bayt cinsinden uzunluğu. OGB + biçeminde hiç bayt gönderilmemişse günlüğe '-' yerine + '0' çıktılanır.
    %...{Fesmekan}Cİstek içinde sunucuya gönderilen Fesmekan çerezinin + içeriği.
    %...DMikrosaniye cinsinden isteği sunmak için harcanan zaman.
    %...{FALANCA}eFALANCA ortam değişkeninin içeriği.
    %...fDosya ismi
    %...hUzak konak
    %...Hİstek Protokolü
    %...{Filanca}iİstekle birlikte sunucuya gönderilen + Filanca: başlık satır(lar)ının + içeriği. Diğer modüllerde (örn. mod_headers) + yapılan değişikliklerden etkilenir.
    %...lUzak kullanıcı kimliği (sağlanmışsa, identd üzerinden). + mod_ident modülü mevcut ve IdentityCheck yönergesine değer + olarak On atanmış olmadıkça bu belirteç için günlüğe + tire imi yazılır.
    %...mİstek yöntemi
    %...{Filanca}nDiğer modüldeki Filanca bilgisinin içeriği.
    %...{Filanca}oYanıttaki Filanca: başlık satır(lar)ının + içeriği.
    %...pSunucunun isteği sunduğu meşru port
    %...Pİsteği sunan çocuk sürecin süreç kimliği.
    %...{biçem}Pİsteği sunan çocuk sürecin süreç kimliği (pid) veya + evre kimliği (tid). Geçerli biçemler: pid + ve tid. (Apache 2.0.46 ve sonrası)
    %...qSorgu dizgesi (bir sorgu dizgesi mevcutsa önüne bir ? + eklenir yoksa hiçbir şey eklenmez).
    %...rİsteğin ilk satırı.
    %...sDurum. Dahili olarak yönlendirilen istekler için isteğin *özgün* + durumudur --- isteğin son durumu için %...>s + kullanınız.
    %...tİsteğin alındığı tarih ve saat (standart ingiliz biçemi).
    %...{biçem}tİsteğin alındığı tarih ve saat; biçem + strftime(3) biçeminde belirtilmelidir (genelde + yerelleştirme amaçlı).
    %...TSaniye cinsinden, isteği sunmak için harcanan zaman.
    %...uUzak kullanıcı (kimlik doğrulaması istenmişse vardır; durum kodu + (%s) 401 ise yanlış olabilir).
    %...UHerhangi bir sorgu dizgesi içermeksizin istenen URL yolu.
    %...vİsteği sunan sunucunun meşru sunucu ismi (ServerName).
    %...VUseCanonicalName ayarı ile + ilgili sunucu ismi.
    %...XYanıt tamamlandığında bağlantı durumu: + + + + + + + + + +
    X =Yanıt tamamlanmadan bağlantı koptu.
    + =Yanıt gönderildikten sonra bağlantı canlı kalabilir.
    - = Yanıt gönderildikten sonra bağlantı kapatılacak.
    + +

    (Apache 1.3’ün son sürümlerinde bu belirteç %...c idi + fakat geçmişe yönelik olarak %...{isim}c ssl + sözdizimi ile çelişiyordu.)

    %...Iİstek ve başlıklar dahil alınan bayt sayısı; sıfır olamaz. Bunu + kullanmak için mod_logio etkin olmalıdır.
    %...OBaşlıklar dahil gönderilen bayt sayısı; sıfır olamaz.Bunu + kullanmak için mod_logio etkin olmalıdır.
    + +

    Değiştiriciler

    + +

    "..." yerine hiçbir şey yazılmayacağı gibi (örneğin, + "%h %u %r %s %b"), belli öğelerin sadece belli durum + kodlarıyla ilgili yanıtlarla basılabilmesi için bu durum kodları + virgüllerle ayrılarak buraya yazılabilir. Örneğin, + "%400,501{User-agent}i" belirteci, + User-agent başlığını sadece 400 ve 501 hatalarında + günlüğe kaydeder. Diğer durum kodları için günlüğe "-" + yazılır. Durum kodlarını olumsuzlamak için başa bir "!" + konabilir. Örneğin, "%!200,304,302{Referer}i" belirteci, + 200,304,302 durum kodlarından biriyle dönmeyen tüm istekler için + Referer başlığını durum koduyla birlikte günlüğe + kaydedecektir.

    + +

    İsteğin dahili olarak yönlendirilmesinde özgün durumunun mu yoksa son + durumunun mu hesaba katılacağı "<" ve ">" değiştiricileri ile + belirtilebilir. Öntanımlı olarak %s, %U, %T, %D, ve + %r belirteçleri isteğin özgün durumuna bakarken diğerleri + son durumuna bakarlar. Bu bakımdan örneğin, %>s + belirteci, özgün istekteki kimliği doğrulanmış kullanıcının, dahili + olarak kimlik doğrulaması gerekmeyen bir özkaynağa yönlendirilmesi + halinde isteğin son durumunu kaydetmekte kullanılabilir.

    + +

    2.0.46 öncesi httpd 2.0 sürümlerinde %...r, + %...i ve %...o belirteçlerinin dizgelerine + önceleme uygulanmazdı. Bu esas olarak Ortak Günlük Biçeminin + gereksinimlerine uymak içindi. Bu uygulama, istemcilerin günlük + dosyalarına denetim karakterlerini yazabilmelerini mümkün kıldığı için + bu tür ham günlük dosyaları ile çalışırken dikkatli olunmalıdır.

    + +

    Güvenlik nedeniyle, 2.0.46 sürümünden itibaren basılamayan + karakterler ve diğer özel karakterler \xhh + dizilimleri biçeminde öncelenmektedir. Burada hh yerine + karakter numarasının onaltılık gösterimi yazılır. Bir tersbölü ile + öncelenmesi gereken " ve \ ile + \n, \t gibi C tarzı gösterimler bu kuralın + dışındadır.

    + +

    2.0 sürümünde 1.3 sürümünün aksine %b ve + %B biçem belirteçleri, istemciye gönderilen bayt sayısını + değil, HTTP yanıtının bayt sayısını ifade ederdi (bu yanıt, örneğin, + SSL kullanıldığında veya bağlantı koptuğunda farklı uzunlukta olur). + Artık, ağa gönderilen gerçek bayt sayısını günlüğe kaydetmek için + mod_logio modülü tarafından sağlanan %O + biçem belirteci kullanılmaktadır.

    + + +

    Örnekler

    + +

    Genelde herkesçe kullanılan günlük kaydı biçemleme dizgelerinden + bazıları:

    + +
    +
    Ortak Günlük Biçemi (OGB)
    +
    "%h %l %u %t \"%r\" %>s %b"
    + +
    Sanal Konaklı Ortak Günlük Biçemi
    +
    "%v %h %l %u %t \"%r\" %>s %b"
    + +
    NCSA uzun/birleşik günlük biçemi
    +
    "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" + \"%{User-agent}i\""
    + +
    Referer başlığını içeren günlük biçemi
    +
    "%{Referer}i -> %U"
    + +
    User-agent başlığını içeren günlük biçemi
    +
    "%{User-agent}i"
    +
    + + +

    Sunucunun isteği sunan meşru ServerName ve Listen değerlerinin sırasıyla %v ve + %p belirteçleri için kullanıldığına dikkat ediniz. Bunun + için, UseCanonicalName yönergesine + bakılmaz, çünkü aksi takdirde günlük inceleme yazılımlarının isteği + gerçekte hangi konağın sunduğuna karar verecek sankon eşleme + algoritmasının tamamı iki kere işlem yapardı.

    +
    top
    +
    +

    Güvenlik Kaygıları

    +

    Günlük dosyarının kaydedildiği dizine sunucuyu başlatan kullanıcı + dışında diğer kullanıcılar tarafından yazılabiliyor olması halinde + güvenliğinizden nasıl feragat etmiş olacağınız güvenlik ipuçları + belgesinde açıklanmıştır.

    +
    +
    top
    +

    BufferedLogs Yönergesi

    + + + + + + + + +
    Açıklama:Günlük girdilerini diske yazmadan önce bellekte tamponlar +
    Sözdizimi:BufferedLogs On|Off
    Öntanımlı:BufferedLogs Off
    Bağlam:sunucu geneli
    Durum:Temel
    Modül:mod_log_config
    Uyumluluk:2.0.41 ve sonrasında mevcuttur.
    +

    BufferedLogs yönergesi, + mod_log_config modülünün çeşitli günlük girdilerini her + isteğin hemen ardından tek tek değil, bir bütün halinde diske yazılmak + üzere bellekte saklanmasını sağlar. Bu, bazı sistemlerde daha verimli + disk erişimi, dolayısıyla daha yüksek başarım sağlayabilir. Sadece + sunucu geneli için belirtilebilir, sanal konaklar için ayrı ayrı + yapılandırılamaz.

    + +
    Bu yönerge deneyseldir ve dikkatli kullanılmalıdır.
    + +
    +
    top
    +

    CookieLog Yönergesi

    + + + + + + + +
    Açıklama:Çerezleri günlüğe kaydetmek için dosya ismi belirtmekte +kullanılır.
    Sözdizimi:CookieLog dosya-adı
    Bağlam:sunucu geneli, sanal konak
    Durum:Temel
    Modül:mod_log_config
    Uyumluluk:Bu yönergenin kullanımı önerilmemektedir.
    +

    CookieLog yönergesi çerezleri günlüğe kaydetmek + için dosya ismi belirtir. Dosya isminin ServerRoot değerine göre belirtildiği + varsayılır. Yönerge mod_cookies ile uyumluluk için vardır + ve kullanımı önerilmemektedir.

    + +
    +
    top
    +

    CustomLog Yönergesi

    + + + + + + +
    Açıklama:Günlük dosyasın ismini ve girdi biçemini belirler.
    Sözdizimi:CustomLog dosya|borulu-süreç +biçem|takma-ad +[env=[!]ortam-değişkeni]
    Bağlam:sunucu geneli, sanal konak
    Durum:Temel
    Modül:mod_log_config
    +

    CustomLog yönergesi istekleri günlüğe kaydetmek + için kullanılır. Yönerge ile bir günlük biçemi belirtilebilir ve günlük + kaydı isteğin özelliklerine bağlı olarak ortam değişkenleri vasıtasıyla + şarta bağlı kılınabilir.

    + +

    İlk argümanda günlüğün yazılacağı yer belirtilir. İki tür yer + belirtilebilir:

    + +
    +
    dosya
    +
    ServerRoot yönergesinin + değerine göreli bir dosya ismi.
    + +
    borulu-süreç
    +
    "|" boru karakteri ile öncelenmiş olarak günlük + bilgisini standart girdisinden kabul edecek sürecin ismi (veya komut + satırı). + +

    Güvenlik:

    +

    Bir borulu süreç kullanılmışsa, süreç httpd’yi + başlatan kullanıcı tarafından başlatılacaktır. Sunucu root tarafından + başlatılıyorsa bu root olacaktır; bu bakımdan günlük kaydını alacak + programın güvenilir olması önemlidir.

    +
    +

    Bilginize

    +

    Dosya yolunu belirtirken tersbölü çizgisi kullanılan Unix dışı + platformlarda bile yapılandırma dosyasında bu amaçla normal bölü + çizgilerini kullanmaya özen gösterilmelidir.

    +
    +
    + +

    İkinci argümanda günlüğe ne yazılacağı belirtilir. Ya evvelce + LogFormat yönergesi ile + tanımlanmış bir takma-ad ya da içeriği Günlük Girdilerinin Kişiselleştirilmesi bölümünde + açıklanmış bir biçem dizgesi olabilir.

    + +

    Örneğin, aşağıdaki iki yönerge kümesi aynı etkiye sahiptir:

    + +

    + # Biçem dizgesi yerine takma ad içeren CustomLog
    + LogFormat "%h %l %u %t \"%r\" %>s %b" common
    + CustomLog logs/access_log common
    +
    + # Biçem dizgesinin kendisini içeren CustomLog
    + CustomLog logs/access_log "%h %l %u %t \"%r\" %>s %b" +

    + +

    Üçüncü argüman isteğe bağlı olup, sunucu ortamında belli bir değişkenin + varlığına bağlı olarak belli bir isteğin günlüğe kaydedilip + kaydedilmeyeceğini belirler. Eğer istek için belirtilen ortam değişkeni mevcutsa (veya + 'env=!değişken' durumunda mevcut değilse) istek + günlüğe kaydedilir.

    + +

    Ortam değişkenleri mod_setenvif + ve/veya mod_rewrite modülleri kullanılarak her istek + için ayrı ayrı atanabilir. Örneğin, GIF biçemli resimler için yapılan + istekleri ana günlük dosyasına değil de başka bir dosyaya kaydetmek + isterseniz:

    + +

    + SetEnvIf Request_URI \.gif$ gif-image
    + CustomLog gif-requests.log common env=gif-image
    + CustomLog nongif-requests.log common env=!gif-image +

    + +

    Veya eski RefererIgnore yönergesinin davranışını taklit + etmek isterseniz:

    + +

    + SetEnvIf Referer example\.com yerel-atif
    + CustomLog referer.log referer env=!yerel-atif +

    + +
    +
    top
    +

    LogFormat Yönergesi

    + + + + + + + +
    Açıklama:Bir günlük dosyasında kullanılmak üzere girdi biçemi tanımlar.
    Sözdizimi:LogFormat biçem|takma-ad +[takma-ad]
    Öntanımlı:LogFormat "%h %l %u %t \"%r\" %>s %b"
    Bağlam:sunucu geneli, sanal konak
    Durum:Temel
    Modül:mod_log_config
    +

    Bu yönerge erişim günlüğü dosyasının girdi biçemini belirler.

    + +

    LogFormat yönergesi iki şekilde kullanılabilir. + Tek argüman belirtilebilen ilkinde daha sonra + TransferLog yönergelerinde belirtilen günlüklerde + kullanılmak üzere günlük biçemini belirler. Bu günlük biçemi yukarıda + açıklanan biçem belirteçlerinden + oluşur. Bu tek argüman yerine aşağıda açıklandığı gibi önceki bir + LogFormat yönergesinde tanımlanmış bir günlük + biçemine atıf yapan bir takma-ad da belirtilebilir.

    + +

    LogFormat yönergesinin ikinci kullanım şeklinde + biçem bir takma-ad için tanımlanır. Bu takma ad + daha sonraki LogFormat veya CustomLog yönergelerinde aynı biçem + dizgesini uzun uzadıya yazmamak için takma-ad olarak + kullanılır. Bir LogFormat yönergesi bir takma ad + tanımlamaktan başka bir şey yapmaz; yani, yaptığı iş + sadece bir takma ad tanımlamaktan ibarettir, biçemi uygulamaz veya + biçemi öntanımlı hale getirmez. Bu bakımdan sonraki TransferLog yönergelerini de + etkilemeyecektir. Ayrıca, LogFormat yönergesi bir + takma ada başka bir takma ad tanımlamakta da kullanılamaz. Bir takma + adın yüzde imi (%) içeremeyeceğine de dikkat ediniz.

    + +

    Örnek

    + LogFormat "%v %h %l %u %t \"%r\" %>s %b" vhost_common +

    + +
    +
    top
    +

    TransferLog Yönergesi

    + + + + + + +
    Açıklama:Bir günlük dosyasının yerini belirtir.
    Sözdizimi:TransferLog dosya|borulu-süreç +[takma-ad]
    Bağlam:sunucu geneli, sanal konak
    Durum:Temel
    Modül:mod_log_config
    +

    Bir günlük biçemi tanımlanmasını ve şarta bağlı günlük kaydını mümkün + kılmaması haricinde CustomLog yönergesi gibidir. Günlük biçemi yerine kendinden + önce yer alan bir LogFormat yönergesinde tanımlanan + bir takma ad kullanılır. Açıkça bir günlük biçemi takma adı + belirtilmedikçe Ortak Günlük Biçemi öntanımlıdır.

    + +

    Örnek

    + LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" + \"%{User-agent}i\""
    + TransferLog logs/access_log +

    + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_log_forensic.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_log_forensic.html new file mode 100644 index 00000000..0d959204 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_log_forensic.html @@ -0,0 +1,9 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_log_forensic.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: mod_log_forensic.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_log_forensic.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_log_forensic.html.en new file mode 100644 index 00000000..75a2e532 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_log_forensic.html.en @@ -0,0 +1,171 @@ + + + +mod_log_forensic - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_log_forensic

    +
    +

    Available Languages:  en  | + tr 

    +
    + + + + +
    Description:Forensic Logging of the requests made to the server
    Status:Extension
    Module Identifier:log_forensic_module
    Source File:mod_log_forensic.c
    Compatibility:Available in version 2.0.50 and later
    +

    Summary

    + +

    This module provides for forensic logging of client + requests. Logging is done before and after processing a request, so the + forensic log contains two log lines for each request. + The forensic logger is very strict, which means:

    + +
      +
    • The format is fixed. You cannot modify the logging format at + runtime.
    • +
    • If it cannot write its data, the child process + exits immediately and may dump core (depending on your + CoreDumpDirectory + configuration).
    • +
    + +

    The check_forensic script, which can be found in the + distribution's support directory, may be helpful in evaluating the + forensic log output.

    + +
    + This module was backported from version 2.1 which uses a more powerful + APR version in order to generate the forensic IDs. If you want to run + mod_log_forensic in version 2.0, you need to include + mod_unique_id as well. +
    +
    + +
    top
    +
    +

    Forensic Log Format

    +

    Each request is logged two times. The first time is before it's + processed further (that is, after receiving the headers). The second log + entry is written after the request processing at the same time + where normal logging occurs.

    + +

    In order to identify each request, a unique request ID is assigned. + This forensic ID can be cross logged in the normal transfer log using the + %{forensic-id}n format string. If you're using + mod_unique_id, its generated ID will be used.

    + +

    The first line logs the forensic ID, the request line and all received + headers, separated by pipe characters (|). A sample line + looks like the following (all on one line):

    + +

    + +yQtJf8CoAB4AAFNXBIEAAAAA|GET /manual/de/images/down.gif + HTTP/1.1|Host:localhost%3a8080|User-Agent:Mozilla/5.0 (X11; + U; Linux i686; en-US; rv%3a1.6) Gecko/20040216 + Firefox/0.8|Accept:image/png, etc... +

    + +

    The plus character at the beginning indicates that this is the first log + line of this request. The second line just contains a minus character and + the ID again:

    + +

    + -yQtJf8CoAB4AAFNXBIEAAAAA +

    + +

    The check_forensic script takes as its argument the name + of the logfile. It looks for those +/- ID pairs + and complains if a request was not completed.

    +
    top
    +
    +

    Security Considerations

    +

    See the security tips + document for details on why your security could be compromised + if the directory where logfiles are stored is writable by + anyone other than the user that starts the server.

    +
    +
    top
    +

    ForensicLog Directive

    + + + + + + +
    Description:Sets filename of the forensic log
    Syntax:ForensicLog filename|pipe
    Context:server config, virtual host
    Status:Extension
    Module:mod_log_forensic
    +

    The ForensicLog directive is used to + log requests to the server for forensic analysis. Each log entry + is assigned a unique ID which can be associated with the request + using the normal CustomLog + directive. mod_log_forensic takes the unique ID from + mod_unique_id, so you need to load this module as well. + (This requirement will not be necessary in version 2.1 and later, because + of a more powerful APR version.) The ID token is attached to the request + under the name forensic-id, which can be added to the + transfer log using the %{forensic-id}n format string.

    + +

    The argument, which specifies the location to which + the logs will be written, can take one of the following two + types of values:

    + +
    +
    filename
    +
    A filename, relative to the ServerRoot.
    + +
    pipe
    +
    The pipe character "|", followed by the path + to a program to receive the log information on its standard + input. The program name can be specified relative to the ServerRoot directive. + +

    Security:

    +

    If a program is used, then it will be run as the user who + started httpd. This will be root if the server was + started by root; be sure that the program is secure or switches to a + less privileged user.

    +
    + +

    Note

    +

    When entering a file path on non-Unix platforms, care should be taken + to make sure that only forward slashed are used even though the platform + may allow the use of back slashes. In general it is a good idea to always + use forward slashes throughout the configuration files.

    +
    +
    + +
    +
    +
    +

    Available Languages:  en  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_log_forensic.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_log_forensic.html.tr.utf8 new file mode 100644 index 00000000..01f9b364 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_log_forensic.html.tr.utf8 @@ -0,0 +1,172 @@ + + + +mod_log_forensic - Apache HTTP Sunucusu + + + + + + +
    <-
    + +
    +

    Apache Modülü mod_log_forensic

    +
    +

    Mevcut Diller:  en  | + tr 

    +
    + + + + +
    Açıklama:Sunucuya yapılan isteklerin adli günlük kayıtlarının tutulması
    Durum:Eklenti
    Modül Betimleyici:log_forensic_module
    Kaynak Dosyası:mod_log_forensic.c
    Uyumluluk:2.0.50 sürümünden beri mevcuttur.
    +

    Özet

    + +

    Bu modül istemci isteklerinin adli günlük kayıtlarının tutulmasını + sağlar. Günlük kaydı bir istek işlenmeden önce ve sonra olmak üzere iki + kere yapılır, böylece günlükte her istek için iki girdi bulunur. Adli + günlükleyici çok sıkı kurallara tabidir, yani:

    + +
      +
    • Biçem sabittir. Günlük kayıt biçemi çalışma anında değiştirilemez.
    • +
    • Veriyi yazamadığı takdirde çocuk süreç beklemeksizin çıkar ve + (CoreDumpDirectory + yapılandırmasına bağlı olarak) bir core dosyası dökümler.
    • +
    + +

    Dağıtımın support dizininde bulunan + check_forensic betiği adli günlük dosyalarının + değerlendirilmesinde yardımcı olabilir.

    + +
    Bu modül, adli kimlikleri üretebilen daha güçlü bir + APR sürümü içeren 2.1 sürümünden geriye doğru uyarlanmıştır. + mod_log_forensic modülünü 2.0 sürümlerinde kullanmak + isterseniz mod_unique_id modülünü de yüklemeniz + gerekecektir. +
    +
    + +
    top
    +
    +

    Adli Günlük Biçemi

    +

    Her istek günlüğe iki defa kaydedilir. İlki, işlemin başlangıcında + (yani, başlıklar alındıktan hemen sonra), ikincisi ise istek işlem + gördükten sonra normal günlüklemenin yapıldığı sırada yapılır.

    + +

    Her isteği betimlemek için eşsiz bir istek kimliği atanır. Bu adli + kimliğin normal günlüğe de yazılması istenirse bu + %{forensic-id}n biçem dizgesi ile yapılabilir. + mod_unique_id kullanılıyorsa, onun ürettiği kimlik + kullanılır.

    + +

    İlk satır günlüğe, adli kimliği, istek satırını ve alınan tüm + başlıkları boru karakterleri (|) ile ayrılmış olarak + kaydeder. Aşağıda bir örneğe yer verilmiştir (hepsi bir satırdadır):

    + +

    + +yQtJf8CoAB4AAFNXBIEAAAAA|GET /manual/de/images/down.gif + HTTP/1.1|Host:localhost%3a8080|User-Agent:Mozilla/5.0 (X11; + U; Linux i686; en-US; rv%3a1.6) Gecko/20040216 + Firefox/0.8|Accept:image/png, etc... +

    + +

    Başlangıçtaki artı imi bu günlük satırının istekle ilgili ilk günlük + kaydı olduğunu belirtir. İkinci satırda bunun yerini bir eksi imi + alır:

    + +

    + -yQtJf8CoAB4AAFNXBIEAAAAA +

    + +

    check_forensic betiği komut satırı argümanı olarak günlük + dosyasının ismini alır. Bu +/- kimlik + çiftlerine bakarak tamamlanmamış istekler varsa bunlar hakkında + uyarır.

    +
    top
    +
    +

    Güvenlik Kaygıları

    +

    Günlük dosyarının kaydedildiği dizine sunucuyu başlatan kullanıcı + dışında diğer kullanıcılar tarafından yazılabiliyor olması halinde + güvenliğinizden nasıl feragat etmiş olacağınız güvenlik ipuçları + belgesinde açıklanmıştır.

    +
    +
    top
    +

    ForensicLog Yönergesi

    + + + + + + +
    Açıklama:Adli günlük için dosya ismini belirler.
    Sözdizimi:ForensicLog dosya-adı|borulu-süreç
    Bağlam:sunucu geneli, sanal konak
    Durum:Eklenti
    Modül:mod_log_forensic
    +

    ForensicLog yönergesi adli inceleme için + sunucuya yapılan istekleri günlüğe kaydetmekte kullanılır. Her günlük + girdisine, normal CustomLog yönergesinde kullanılarak istekle + ilişkilendirilebilen eşsiz bir kimlik atanır. + mod_log_forensic modülü eşsiz kimliği + mod_unique_id modülünden alır, dolayısıyla bu modülü de + yüklemeniz gerekir. (Bu geresinim, daha güçlü bir APR sürümü içermesi + sebebiyle 2.1 sürümünden itibaren ortadan kalkmıştır.) İstekle ilişkili + kimlik dizgeciği forensic-id adıyla + %{forensic-id}n biçem dizgesinde kullanılarak aktarım + günlüğüne eklenebilir.

    + +

    Günlüğün yazılacağı yeri belirleyen argüman şu iki değerden birini + alabilir:

    + +
    +
    dosya-adı
    +
    ServerRoot yönergesinin + değerine göreli bir dosya ismi.
    + +
    borulu-süreç
    +
    "|" boru karakteri ile öncelenmiş olarak günlük + bilgisini standart girdisinden kabul edecek sürecin ismi (veya komut + satırı). Program adının ServerRoot yönergesinin değerine göre belirtildiği + varsayılır. + +

    Güvenlik:

    +

    Bir borulu süreç kullanılmışsa, süreç httpd’yi + başlatan kullanıcı tarafından başlatılacaktır. Sunucu root tarafından + başlatılıyorsa bu root olacaktır; bu bakımdan günlük kaydını alacak + programın güvenilir olması veya daha az yetkili bir kullanıcıya geçiş + yapması önemlidir.

    +
    + +

    Bilginize

    +

    Dosya yolunu belirtirken tersbölü çizgisi kullanılan Unix dışı + platformlarda bile yapılandırma dosyasında bu amaçla normal bölü + çizgilerini kullanmaya özen gösterilmelidir.

    +
    +
    + +
    +
    +
    +

    Mevcut Diller:  en  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_logio.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_logio.html new file mode 100644 index 00000000..0eb2b070 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_logio.html @@ -0,0 +1,17 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_logio.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: mod_logio.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: mod_logio.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: mod_logio.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_logio.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_logio.html.en new file mode 100644 index 00000000..6e442124 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_logio.html.en @@ -0,0 +1,92 @@ + + + +mod_logio - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_logio

    +
    +

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

    +
    + + + +
    Description:Logging of input and output bytes per request
    Status:Extension
    Module Identifier:logio_module
    Source File:mod_logio.c
    +

    Summary

    + + +

    This module provides the logging of input and output number of + bytes received/sent per request. The numbers reflect the actual bytes + as received on the network, which then takes into account the + headers and bodies of requests and responses. The counting is done + before SSL/TLS on input and after SSL/TLS on output, so the numbers + will correctly reflect any changes made by encryption.

    + +

    This module requires mod_log_config.

    + +
    +

    Directives

    +

    This module provides no directives.

    +

    Topics

    +

    See also

    +
    +
    top
    +
    +

    Custom Log Formats

    + + +

    This modules adds two new logging directives. The characteristics of the + request itself are logged by placing "%" directives in + the format string, which are replaced in the log file by the values as + follows:

    + + + + + + + +
    Format StringDescription
    %...IBytes received, including request and headers, cannot be + zero.
    %...OBytes sent, including headers, cannot be zero.
    + +

    Usually, the functionality is used like this:

    + +
    +
    Combined I/O log format:
    +
    "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" + \"%{User-agent}i\" %I %O"
    +
    +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_logio.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_logio.html.ja.utf8 new file mode 100644 index 00000000..8eed8b7c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_logio.html.ja.utf8 @@ -0,0 +1,93 @@ + + + +mod_logio - Apache HTTP サーバ + + + + + + +
    <-
    + +
    +

    Apache モジュール mod_logio

    +
    +

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

    +
    + + + +
    説明:リクエスト毎に入力バイト数と出力バイト数とをロギング
    ステータス:Extension
    モジュール識別子:logio_module
    ソースファイル:mod_logio.c
    +

    概要

    + + +

    このモジュールはリクエストごとに受け取ったバイト数と + 送信したバイト数のロギングを行なう機能を提供します。 + 記録される数字はリクエストのヘッダとレスポンスの本体を + 反映した、実際にネットワークで受け取ったバイト値です。 + 入力では SSL/TLS の前に、出力では SSL/TLS の後に数えるので、 + 数字は暗号による変化も正しく反映したものになります。

    + +

    このモジュールの使用には mod_log_config モジュールが + 必要です。

    + +
    +

    ディレクティブ

    +

    このモジュールにディレクティブはありません。

    +

    トピック

    +

    参照

    +
    +
    top
    +
    +

    カスタムログ書式

    + + +

    このモジュールは新しいロギング用ディレクティブを加えます。 + リクエスト自身の特徴はフォーマット文字列に、以下の様に置換される + "%" ディレクティブを + 入れることでログ収集されます:

    + + + + + + + +
    フォーマット文字列説明
    %...Iリクエストとヘッダを含む、受け取ったバイト数。 + 0 にはならない。
    %...Oヘッダを含む、送信したバイト数。0 にはならない。
    + +

    通常、この機能は以下の様に使用されます:

    + +
    +
    結合 I/O ログ書式:
    +
    "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" + \"%{User-agent}i\" %I %O"
    +
    +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_logio.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_logio.html.ko.euc-kr new file mode 100644 index 00000000..c48262d7 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_logio.html.ko.euc-kr @@ -0,0 +1,94 @@ + + + +mod_logio - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    ¾ÆÆÄÄ¡ ¸ðµâ mod_logio

    +
    +

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

    +
    + + + +
    ¼³¸í:¿äû´ç ÀÔÃâ·Â ¹ÙÀÌÆ®¼ö¸¦ ±â·Ï
    »óÅÂ:Extension
    ¸ðµâ¸í:logio_module
    ¼Ò½ºÆÄÀÏ:mod_logio.c
    +

    ¿ä¾à

    + + +

    ÀÌ ¸ðµâÀº ¿äû´ç ÀÔÃâ·Â ¹ÙÀÌÆ®¼ö¸¦ ±â·ÏÇÑ´Ù. ¼ýÀÚ´Â + ³×Æ®¿÷¿¡¼­ ½ÇÁ¦·Î ÁÖ°í¹ÞÀº ¹ÙÀÌÆ®¼ö¸¦ ³ªÅ¸³»¸ç, ¿äû°ú ÀÀ´äÀÇ + Çì´õ¿Í ³»¿ëÀ» Æ÷ÇÔÇÑ´Ù. °³¼ö´Â ÀÔ·ÂÀÇ °æ¿ì SSL/TLS ÀÌÀü¿¡, + Ãâ·ÂÀÇ °æ¿ì SSL/TLS ÀÌÈÄ¿¡ ¼¼±â¶§¹®¿¡ ¾ÏȣȭÀÇ °á°úµµ + ¿Ã¹Ù·Î ¹Ý¿µµÈ´Ù.

    + +

    ÀÌ ¸ðµâÀ» »ç¿ëÇÏ·Á¸é mod_log_configÀÌ + ÇÊ¿äÇÏ´Ù.

    + +
    +

    Áö½Ã¾îµé

    +

    ÀÌ ¸ðµâ¿¡´Â Áö½Ã¾î°¡ ¾ø½À´Ï´Ù.

    +

    ÁÖÁ¦

    +

    Âü°í

    +
    +
    top
    +
    +

    »ç¿ëÀÚÁ¤ÀÇ ·Î±× Çü½Ä

    + + +

    ÀÌ ¸ðµâÀº µÎ°¡Áö »õ·Î¿î ·Î±×Áö½Ã¾î¸¦ Ãß°¡ÇÑ´Ù. ¿äûÀÚüÀÇ + Ư¼ºÀº Çü½Ä¹®ÀÚ¿­¿¡ "%" Áö½Ã¾î¸¦ »ç¿ëÇÏ¿© ±â·ÏÇÑ´Ù. + Áö½Ã¾î´Â ·Î±×ÆÄÀÏ¿¡ ´ÙÀ½°ú °°Àº °ªÀ» ±â·ÏÇÑ´Ù:

    + + + + + + + +
    Çü½Ä¹®ÀÚ¿­¼³¸í
    %...I¿äû°ú Çì´õ¸¦ Æ÷ÇÔÇÏ¿© ¹ÞÀº ¹ÙÀÌÆ®¼ö. 0ÀÏ ¼ö ¾ø´Ù.
    %...OÇì´õ¸¦ Æ÷ÇÔÇÏ¿© º¸³½ ¹ÙÀÌÆ®¼ö. 0ÀÏ ¼ö ¾ø´Ù.
    + +

    º¸Åë ´ÙÀ½°ú °°ÀÌ »ç¿ëÇÑ´Ù:

    + +
    + +
    °áÇÕµÈ ÀÔÃâ·Â ·Î±× Çü½Ä:
    + +
    "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" + \"%{User-agent}i\" %I %O"
    + +
    + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_logio.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_logio.html.tr.utf8 new file mode 100644 index 00000000..84f86d93 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_logio.html.tr.utf8 @@ -0,0 +1,92 @@ + + + +mod_logio - Apache HTTP Sunucusu + + + + + + +
    <-
    + +
    +

    Apache Modülü mod_logio

    +
    +

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

    +
    + + + +
    Açıklama:Her isteğin girdi ve çıktı uzunluklarının günlüklenmesi. +
    Durum:Eklenti
    Modül Betimleyici:logio_module
    Kaynak Dosyası:mod_logio.c
    +

    Özet

    + + +

    Bu modül her istekte alınan ve gönderilen bayt sayısının günlüklenmesini + sağlar. Sayılar, istekte ve yanıtta yer alan başlıklar ve gövdeleri + hesaba dahil ederek ağ üzerinde gerçekte gidip gelen bayt sayısını + gösterir. Bayt sayımı, girdide SSL/TLS öncesinde ve çıktıda SSL/TLS + sonrasında yapılır, böylece sayıların, şifrelemeyle herhangi bir + değişikliği doğru olarak yansıtması sağlanmış olur.

    + +

    Bu modül mod_log_config modülünü gerektirir.

    + +
    +

    Yönergeler

    +

    Bu modül yönerge içermez.

    +

    Konular

    +

    Ayrıca bakınız:

    +
    +
    top
    +
    +

    Özel Günlük Biçemleri

    + + +

    İsteğin belirgin özellikleri için, biçem dizgesinde yer alan % imli + biçem belirteçlerinin yerine günlük dosyasında değerleri yazılır. Bu + modül iki yeni biçem belirteci ekler:

    + + + + + + + +
    Biçem BelirteciAçıklama
    %...Iİstek gövdesi ve başlıklar dahil alınan bayt sayısı; sıfır + olamaz.
    %...OBaşlıklar dahil gönderilen bayt sayısı; sıfır olamaz.
    + +

    Genel olarak, işlevsellik şöyle kullanılır:

    + +
    +
    Birleşik G/Ç günlükleme biçemi:
    +
    "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" + \"%{User-agent}i\" %I %O"
    +
    +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_mem_cache.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_mem_cache.html new file mode 100644 index 00000000..987152e8 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_mem_cache.html @@ -0,0 +1,13 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_mem_cache.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: mod_mem_cache.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: mod_mem_cache.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_mem_cache.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_mem_cache.html.en new file mode 100644 index 00000000..6cf684d6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_mem_cache.html.en @@ -0,0 +1,241 @@ + + + +mod_mem_cache - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_mem_cache

    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + + + +
    Description:Content cache keyed to URIs
    Status:Experimental
    Module Identifier:mem_cache_module
    Source File:mod_mem_cache.c
    +

    Summary

    + +
    + This module is experimental. Documentation is still under + development... +
    + +

    This module requires the service of mod_cache. It acts as a support module for mod_cache and provides a memory based storage manager. + mod_mem_cache can be configured to operate in two + modes: caching open file descriptors or caching objects in heap storage. + mod_mem_cache is most useful when used to cache locally + generated content or to cache backend server content for mod_proxy configured for ProxyPass (aka reverse proxy).

    + +

    Content is stored in and retrieved from the cache using URI based + keys. Content with access protection is not cached.

    +
    + + +
    top
    +

    MCacheMaxObjectCount Directive

    + + + + + + + +
    Description:The maximum number of objects allowed to be placed in the +cache
    Syntax:MCacheMaxObjectCount value
    Default:MCacheMaxObjectCount 1009
    Context:server config
    Status:Experimental
    Module:mod_mem_cache
    +

    The MCacheMaxObjectCount directive sets the + maximum number of objects to be cached. The value is used to create the + open hash table. If a new object needs to be inserted in the cache and + the maximum number of objects has been reached, an object will be + removed to allow the new object to be cached. The object to be removed + is selected using the algorithm specified by MCacheRemovalAlgorithm.

    + +

    Example

    + MCacheMaxObjectCount 13001 +

    + +
    +
    top
    +

    MCacheMaxObjectSize Directive

    + + + + + + + +
    Description:The maximum size (in bytes) of a document allowed in the +cache
    Syntax:MCacheMaxObjectSize bytes
    Default:MCacheMaxObjectSize 10000
    Context:server config
    Status:Experimental
    Module:mod_mem_cache
    +

    The MCacheMaxObjectSize directive sets the + maximum allowable size, in bytes, of a document for it to be considered + cacheable.

    + +

    Example

    + MCacheMaxObjectSize 6400000 +

    + +

    Note

    +

    The value of MCacheMaxObjectSize must be + greater than the value specified by the MCacheMinObjectSize directive.

    +
    + +
    +
    top
    +

    MCacheMaxStreamingBuffer Directive

    + + + + + + + +
    Description:Maximum amount of a streamed response to buffer in memory +before declaring the response uncacheable
    Syntax:MCacheMaxStreamingBuffer size_in_bytes
    Default:MCacheMaxStreamingBuffer the smaller of 100000 or MCacheMaxObjectSize
    Context:server config
    Status:Experimental
    Module:mod_mem_cache
    +

    The MCacheMaxStreamingBuffer directive + specifies the maximum number of bytes of a streamed response to + buffer before deciding that the response is too big to cache. + A streamed response is one in which the entire content is not + immediately available and in which the Content-Length + may not be known. Sources of streaming responses include proxied + responses and the output of CGI scripts. By default, a streamed + response will not be cached unless it has a + Content-Length header. The reason for this is to + avoid using a large amount of memory to buffer a partial response + that might end up being too large to fit in the cache. + The MCacheMaxStreamingBuffer directive allows + buffering of streamed responses that don't contain a + Content-Length up to the specified maximum amount of + space. If the maximum buffer space is reached, the buffered + content is discarded and the attempt to cache is abandoned.

    + +

    Note:

    +

    Using a nonzero value for MCacheMaxStreamingBuffer + will not delay the transmission of the response to the client. + As soon as mod_mem_cache copies a block of streamed + content into a buffer, it sends the block on to the next output + filter for delivery to the client.

    +
    + +

    + # Enable caching of streamed responses up to 64KB:
    + MCacheMaxStreamingBuffer 65536 +

    + +
    +
    top
    +

    MCacheMinObjectSize Directive

    + + + + + + + +
    Description:The minimum size (in bytes) of a document to be allowed in the +cache
    Syntax:MCacheMinObjectSize bytes
    Default:MCacheMinObjectSize 0
    Context:server config
    Status:Experimental
    Module:mod_mem_cache
    +

    The MCacheMinObjectSize directive sets the + minimum size in bytes of a document for it to be considered + cacheable.

    + +

    Example

    + MCacheMinObjectSize 10000 +

    + +
    +
    top
    +

    MCacheRemovalAlgorithm Directive

    + + + + + + + +
    Description:The algorithm used to select documents for removal from the +cache
    Syntax:MCacheRemovalAlgorithm LRU|GDSF
    Default:MCacheRemovalAlgorithm GDSF
    Context:server config
    Status:Experimental
    Module:mod_mem_cache
    +

    The MCacheRemovalAlgorithm directive specifies + the algorithm used to select documents for removal from the cache. + Two choices are available:

    + +
    +
    LRU (Least Recently Used)
    +
    LRU removes the documents that have not been accessed + for the longest time.
    + +
    GDSF (GreadyDual-Size)
    +
    GDSF assigns a priority to cached documents based + on the cost of a cache miss and the size of the document. Documents + with the lowest priority are removed first.
    +
    + +

    Example

    + MCacheRemovalAlgorithm GDSF
    + MCacheRemovalAlgorithm LRU +

    + +
    +
    top
    +

    MCacheSize Directive

    + + + + + + + +
    Description:The maximum amount of memory used by the cache in +KBytes
    Syntax:MCacheSize KBytes
    Default:MCacheSize 100
    Context:server config
    Status:Experimental
    Module:mod_mem_cache
    +

    The MCacheSize directive sets the maximum + amount of memory to be used by the cache, in KBytes (1024-byte units). + If a new object needs to be inserted in the cache and the size of the + object is greater than the remaining memory, objects will be removed + until the new object can be cached. The object to be removed is + selected using the algorithm specified by MCacheRemovalAlgorithm.

    + +

    Example

    + MCacheSize 700000 +

    + +

    Note

    +

    The MCacheSize value must be greater than + the value specified by the MCacheMaxObjectSize directive.

    +
    + +
    +
    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_mem_cache.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_mem_cache.html.ja.utf8 new file mode 100644 index 00000000..780f7897 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_mem_cache.html.ja.utf8 @@ -0,0 +1,238 @@ + + + +mod_mem_cache - Apache HTTP サーバ + + + + + + +
    <-
    + +
    +

    Apache モジュール mod_mem_cache

    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + + + +
    説明:URI をキーにしたコンテンツのキャッシュ
    ステータス:Experimental
    モジュール識別子:mem_cache_module
    ソースファイル:mod_mem_cache.c
    +

    概要

    + +
    + これは実験的なモジュールです。文書もまだ開発中です... +
    + +

    このモジュールは mod_cache を必要とします。 + これは mod_cache のサポートモジュールとして + 動作し、メモリを使用したストレージ管理機構を提供します。 + mod_mem_cache は二つのモードのどちらかで動作するように + 設定できます: ファイル記述子のキャッシュかヒープ中のオブジェクトの + キャッシュです。ローカルで生成されたコンテンツに対してキャッシュするときや、 + mod_proxy を使って ProxyPass (つまりリバースプロキシ向け) に設定したときのバックエンドサーバのコンテンツに対して + キャッシュをするときに、たいへん効果的です。

    + +

    コンテンツのキャッシュへの保存と取得は URI に基づいたキーが使われます。 + アクセス保護のかけられているコンテンツはキャッシュされません。

    +
    + + +
    top
    +

    MCacheMaxObjectCount ディレクティブ

    + + + + + + + +
    説明:キャッシュに保管されるオブジェクトの最大数
    構文:MCacheMaxObjectCount value
    デフォルト:MCacheMaxObjectCount 1009
    コンテキスト:サーバ設定ファイル
    ステータス:Experimental
    モジュール:mod_mem_cache
    +

    MCacheMaxObjectCount ディレクティブは + キャッシュされるオブジェクトの最大数を指定します。 + この値はハッシュテーブルを作成するときに使われます。 + 新しいオブジェクトを挿入するときに、オブジェクトの最大数に + 達してしまっているとき、新しいオブジェクトをキャッシュできるように、 + オブジェクトを一つ消去します。オブジェクトは + MCacheRemovalAlgorithm + で指定されたアルゴリズムに従って削除されます。

    + +

    例

    + MCacheMaxObjectCount 13001 +

    + +
    +
    top
    +

    MCacheMaxObjectSize ディレクティブ

    + + + + + + + +
    説明:キャッシュに保管できるドキュメントの最大サイズ (バイト)
    構文:MCacheMaxObjectSize bytes
    デフォルト:MCacheMaxObjectSize 10000
    コンテキスト:サーバ設定ファイル
    ステータス:Experimental
    モジュール:mod_mem_cache
    +

    MCacheMaxObjectSize はドキュメントを + キャッシュするかどうかを判定する、最大のサイズをバイト数で設定します。

    + +

    例

    + MCacheMaxObjectSize 6400000 +

    + +

    注

    +

    MCacheMaxObjectSize の値は MCacheMinObjectSize + で指定した値よりも大きくなければなりません。

    +
    + +
    +
    top
    +

    MCacheMaxStreamingBuffer ディレクティブ

    + + + + + + + +
    説明:ストリームされている応答をキャッシュ不能と決定するまでに +メモリにバッファする最大量
    構文:MCacheMaxStreamingBuffer size_in_bytes
    デフォルト:MCacheMaxStreamingBuffer of 100000 か MCacheMaxObjectSize の少い方
    コンテキスト:サーバ設定ファイル
    ステータス:Experimental
    モジュール:mod_mem_cache
    +

    MCacheMaxStreamingBuffer ディレクティブは、 + サイズが大きすぎてキャッシュできないと判断するまでの、 + ストリーム応答のバッファのための最大バイト数を指定します。 + ストリーム応答とは、コンテンツの全体がすぐには得られず、 + Content-Length がわからない応答を指します。 + ストリーム応答を行なうようなものにはプロキシされた応答や、 + CGI スクリプトの出力などがあります。デフォルトではストリームの応答は + Content-Length がない限りキャッシュされません。 + このような動作になっている理由は、結局キャッシュに収まりきらないと + 判断することになってしまうような、サイズの大きな応答のバッファリングに、 + 大量のメモリが消費されるのを避けるためです。 + MCacheMaxStreamingBuffer ディレクティブを使うと、 + Content-Length を含まない応答に対して指定された最大量まで + バッファするようにできます。バッファを使い切ると、バッファ中の + コンテンツは捨てられ、キャッシュ動作を中止します。

    + +

    注:

    +

    MCacheMaxStreamingBuffer に非零の値を + 使っても、クライアントへの応答の転送に特に遅延は発生しません。 + mod_mem_cache はストリームコンテンツの断片を + バッファにコピーした後、即座に、その部分をクライアントへの配送の + 次段の出力フィルタに送ります。

    +
    + +

    + # Enable caching of streamed responses up to 64KB:
    + MCacheMaxStreamingBuffer 65536 +

    + +
    +
    top
    +

    MCacheMinObjectSize ディレクティブ

    + + + + + + + +
    説明:キャッシュに保管されるドキュメントの最小サイズ (バイト)
    構文:MCacheMinObjectSize bytes
    デフォルト:MCacheMinObjectSize 0
    コンテキスト:サーバ設定ファイル
    ステータス:Experimental
    モジュール:mod_mem_cache
    +

    MCacheMinObjectSize ディレクティブは、ドキュメントを + キャッシュするかどうかを判定する、最小のサイズをバイト数で設定します。

    + +

    例

    + MCacheMinObjectSize 10000 +

    + +
    +
    top
    +

    MCacheRemovalAlgorithm ディレクティブ

    + + + + + + + +
    説明:キャッシュから削除するドキュメントを選ぶためのアルゴリズム
    構文:MCacheRemovalAlgorithm LRU|GDSF
    デフォルト:MCacheRemovalAlgorithm GDSF
    コンテキスト:サーバ設定ファイル
    ステータス:Experimental
    モジュール:mod_mem_cache
    +

    MCacheRemovalAlgorithm ディレクティブは、 + キャッシュから削除するドキュメントを選択するためのアルゴリズムを + 指定します。選択肢は二つあります:

    + +
    +
    LRU (Least Recently Used)
    +
    LRU 一番長くアクセスされていないドキュメントを削除します。 +
    + +
    GDSF (GreadyDual-Size)
    +
    GDSF はキャッシュミスのコストとドキュメントのサイズをもとに、 + ドキュメントのキャッシュに対して優先度をつけます。 + 優先度の一番低いドキュメントが最初に削除されます。
    +
    + +

    例

    + MCacheRemovalAlgorithm GDSF
    + MCacheRemovalAlgorithm LRU +

    + +
    +
    top
    +

    MCacheSize ディレクティブ

    + + + + + + + +
    説明:キャッシュに使われるメモリの最大量をキロバイト単位で指定
    構文:MCacheSize KBytes
    デフォルト:MCacheSize 100
    コンテキスト:サーバ設定ファイル
    ステータス:Experimental
    モジュール:mod_mem_cache
    +

    MCacheSize ディレクティブはキャッシュに + 使われるメモリの大きさをキロバイト (1024 バイト単位) で設定します。 + 新しいオブジェクトをキャッシュに挿入することになり、オブジェクトの + サイズが残りのメモリより大きい場合は、その新しいオブジェクトの挿入が + 可能になるまで、古いオブジェクトが削除されていきます。 + オブジェクトは MCacheRemovalAlgorithm + で指定したアルゴリズムに従って削除されます。

    + +

    例

    + MCacheSize 700000 +

    + +

    注

    +

    MCacheSize の値は MCacheMaxObjectSize ディレクティブで指定した値より + 大きくなければなりません。

    +
    + +
    +
    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_mem_cache.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_mem_cache.html.ko.euc-kr new file mode 100644 index 00000000..d392b02c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_mem_cache.html.ko.euc-kr @@ -0,0 +1,235 @@ + + + +mod_mem_cache - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    ¾ÆÆÄÄ¡ ¸ðµâ mod_mem_cache

    +
    +

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

    +
    + + + +
    ¼³¸í:URI¸¦ Å°·Î »ç¿ëÇÏ¿© ³»¿ëÀ» ij½¬ÇÑ´Ù.
    »óÅÂ:Experimental
    ¸ðµâ¸í:mem_cache_module
    ¼Ò½ºÆÄÀÏ:mod_mem_cache.c
    +

    ¿ä¾à

    + +
    + ÀÌ ¸ðµâÀº ½ÇÇèÀûÀÎ »óÅÂÀÌ´Ù. ¹®¼­´Â ¾ÆÁ÷ ÀÛ¾÷ÁßÀÌ´Ù... +
    + +

    ÀÌ ¸ðµâÀ» »ç¿ëÇÏ·Á¸é mod_cache°¡ + ÇÊ¿äÇÏ´Ù. ÀÌ ¸ðµâÀº mod_cache¸¦ + Áö¿øÇÏ¸ç ¸Þ¸ð¸®±â¹Ý ÀúÀå°ü¸®ÀÚ¸¦ Á¦°øÇÑ´Ù. + mod_mem_cache´Â ÆÄÀϱâ¼úÀÚ¸¦ ij½¬¿¡ ÀúÀåÇϰųª + °´Ã¼¸¦ Èü °ø°£¿¡ ij½¬ÇÏ´Â µÎ°¡Áö ¹æ½ÄÀ¸·Î µ¿ÀÛÇÑ´Ù. + mod_mem_cache´Â Á÷Á¢ ¼­¹ö°¡ »ý¼ºÇÑ ÆäÀÌÁö¸¦ + ij½¬Çϰųª ProxyPass·Î + ¼³Á¤ÇÑ (¿ªÇÁ·Ï½Ã(reverse proxy)) + mod_proxyÀÇ µÞ´Ü ¼­¹ö³»¿ëÀ» ij½¬ÇÒ¶§ ÁÖ·Î + »ç¿ëÇÑ´Ù.

    + +

    ³»¿ëÀº URI¸¦ Å°·Î »ç¿ëÇÏ¿© ij½¬¿¡ ÀúÀåÇÏ°í °¡Á®¿Â´Ù. + Á¢±ÙÀ» Á¦¾îÇÏ´Â ³»¿ëÀº ij½¬¿¡ ÀúÀåÇÏÁö ¾Ê´Â´Ù.

    +
    + + +
    top
    +

    MCacheMaxObjectCount Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:ij½¬¿¡ ÀúÀåÇÒ ¼ö ÀÖ´Â ÃÖ´ë °´Ã¼°³¼ö
    ¹®¹ý:MCacheMaxObjectCount value
    ±âº»°ª:MCacheMaxObjectCount 1009
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤
    »óÅÂ:Experimental
    ¸ðµâ:mod_mem_cache
    +

    MCacheMaxObjectCount Áö½Ã¾î´Â + ij½¬ÇÒ ¼ö ÀÖ´Â ÃÖ´ë °´Ã¼°³¼ö¸¦ ¼³Á¤ÇÑ´Ù. ÀÌ °ªÀº Çؽ¬Å×À̺íÀ» + ¸¸µé¶§ »ç¿ëÇÑ´Ù. »õ·Î¿î °´Ã¼¸¦ ij½¬¿¡ Ãß°¡ÇØ¾ß Çϴµ¥ ÃÖ´ë + °´Ã¼°³¼ö¿¡ µµ´ÞÇÏ¿´´Ù¸é, »õ·Î¿î °´Ã¼¸¦ ij½¬ÇÒ ¼ö ÀÖµµ·Ï + ´Ù¸¥ °´Ã¼¸¦ Á¦°ÅÇÑ´Ù. MCacheRemovalAlgorithmÀ¸·Î + ÁöÁ¤ÇÑ ¾Ë°í¸®ÁòÀ» »ç¿ëÇÏ¿© Á¦°ÅÇÒ °´Ã¼¸¦ ¼±ÅÃÇÑ´Ù.

    + +

    ¿¹Á¦

    + MCacheMaxObjectCount 13001 +

    + +
    +
    top
    +

    MCacheMaxObjectSize Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:ij½¬¿¡ ÀúÀåÇÒ ¹®¼­ÀÇ ÃÖ´ë Å©±â (¹ÙÀÌÆ® ´ÜÀ§)
    ¹®¹ý:MCacheMaxObjectSize bytes
    ±âº»°ª:MCacheMaxObjectSize 10000
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤
    »óÅÂ:Experimental
    ¸ðµâ:mod_mem_cache
    +

    MCacheMaxObjectSize Áö½Ã¾î´Â ij½¬¿¡ + ÀúÀåÇÒ ¹®¼­ÀÇ ÃÖ´ë Å©±â¸¦ ¹ÙÀÌÆ® ´ÜÀ§·Î ÁöÁ¤ÇÑ´Ù.

    + +

    ¿¹Á¦

    + MCacheMaxObjectSize 6400000 +

    + +

    Note

    +

    MCacheMaxObjectSize °ªÀº MCacheMinObjectSize + Áö½Ã¾î·Î ÁöÁ¤ÇÑ °ªº¸´Ù Ä¿¾ß ÇÑ´Ù.

    +
    + +
    +
    top
    +

    MCacheMaxStreamingBuffer Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:ÀÀ´äÀ» ij½¬¾ÈÇÑ´Ù°í °áÁ¤Çϱâ Àü±îÁö ¸Þ¸ð¸® ¹öÆÛ¿¡ +ÀúÀåÇÒ ½ºÆ®¸² ÀÀ´äÀÇ ÃÖ´ë Å©±â
    ¹®¹ý:MCacheMaxStreamingBuffer size_in_bytes
    ±âº»°ª:MCacheMaxStreamingBuffer 100000°ú MCacheMaxObjectSize +Áß¿¡ ÀÛÀº °ª
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤
    »óÅÂ:Experimental
    ¸ðµâ:mod_mem_cache
    +

    MCacheMaxStreamingBuffer Áö½Ã¾î´Â + ÀÀ´äÀÌ ³Ê¹« Ä¿¼­ ij½¬ÇÒ ¼ö ¾øÀ»¶§±îÁö ¹öÆÛ¿¡ ÀúÀåÇÒ ½ºÆ®¸² + ÀÀ´äÀÇ ÃÖ´ë ¹ÙÀÌÆ®¼ö¸¦ ¼³Á¤ÇÑ´Ù. ½ºÆ®¸² ÀÀ´ä(streamed response)Àº + Àüü ³»¿ëÀ» Áï½Ã ¾Ë ¼ö ¾ø°í Content-Lengthµµ + ¸ð¸£´Â ÀÀ´äÀÌ´Ù. ÇÁ·Ï½ÃµÈ ÀÀ´äÀ̳ª CGI ½ºÅ©¸³Æ®ÀÇ Ãâ·ÂÀÌ + ½ºÆ®¸² ÀÀ´ä¿¡ ¼ÓÇÑ´Ù. ±âº»ÀûÀ¸·Î Content-Length + Çì´õ°¡ ¾ø´Ù¸é ½ºÆ®¸² ÀÀ´äÀ» ij½¬¿¡ ÀúÀåÇÏÁö ¾Ê´Â´Ù. + ÀÌÀ¯´Â ij½¬¿¡ ÀúÀåÇϱ⿡ ³Ê¹« Å« ÀÀ´äÀÇ ÀϺθ¦ ¹öÆÛ¿¡ + ÀúÀåÇϱâÀ§ÇØ ¸¹Àº ¸Þ¸ð¸®¸¦ ³¶ºñÇÏÁö ¾Ê±âÀ§Çؼ­ÀÌ´Ù. + MCacheMaxStreamingBuffer Áö½Ã¾î¸¦ + »ç¿ëÇϸé Content-Length°¡ ¾ø´Â ½ºÆ®¸² ÀÀ´äÀ» + ÁöÁ¤ÇÑ Å©±â±îÁö¸¸ ¹öÆÛ¿¡ ÀúÀåÇÑ´Ù. ÃÖ´ë Å©±â¸¦ ³Ñ¾î¼­¸é + ¹öÆÛ ³»¿ëÀ» ¹ö¸®°í ij½¬ÇÏÁö ¾Ê´Â´Ù.

    + +

    ÁÖÀÇ:

    +

    MCacheMaxStreamingBuffer¿¡ 0ÀÌ + ¾Æ´Ñ °ªÀ» ¼³Á¤ÇÏ¿©µµ Ŭ¶óÀ̾ðÆ®·Î ÀÀ´äÀ» ´Ê°Ô º¸³»Áö ¾Ê´Â´Ù. + mod_mem_cache´Â ½ºÆ®¸² ÀÀ´äÀÇ ÀϺθ¦ + ¹öÆÛ¿¡ º¹»çÇÏÀÚ¸¶ÀÚ Å¬¶óÀ̾ðÆ®·Î º¸³»±âÀ§ÇØ ´ÙÀ½ Ãâ·ÂÇÊÅÍ·Î + º¸³½´Ù.

    +
    + +

    + # ½ºÆ®¸² ÀÀ´äÀ» 64KB±îÁö ij½¬ÇÑ´Ù:
    + MCacheMaxStreamingBuffer 65536 +

    + +
    +
    top
    +

    MCacheMinObjectSize Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:ij½¬¿¡ ÀúÀåÇÒ ¹®¼­ÀÇ ÃÖ¼Ò Å©±â (¹ÙÀÌÆ® ´ÜÀ§)
    ¹®¹ý:MCacheMinObjectSize bytes
    ±âº»°ª:MCacheMinObjectSize 0
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤
    »óÅÂ:Experimental
    ¸ðµâ:mod_mem_cache
    +

    MCacheMinObjectSize Áö½Ã¾î´Â ij½¬¿¡ + ÀúÀåÇÒ ¹®¼­ÀÇ ÃÖ¼Ò Å©±â¸¦ ¹ÙÀÌÆ® ´ÜÀ§·Î ÁöÁ¤ÇÑ´Ù.

    + +

    ¿¹Á¦

    + MCacheMinObjectSize 10000 +

    + +
    +
    top
    +

    MCacheRemovalAlgorithm Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:ij½¬¿¡¼­ Á¦°ÅÇÒ ¹®¼­¸¦ ã´Â ¾Ë°í¸®Áò
    ¹®¹ý:MCacheRemovalAlgorithm LRU|GDSF
    ±âº»°ª:MCacheRemovalAlgorithm GDSF
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤
    »óÅÂ:Experimental
    ¸ðµâ:mod_mem_cache
    +

    MCacheRemovalAlgorithm Áö½Ã¾î´Â + ij½¬¿¡¼­ Á¦°ÅÇÒ ¹®¼­¸¦ ã´Â ¾Ë°í¸®ÁòÀ» ÁöÁ¤ÇÑ´Ù.

    + +
    +
    LRU (Least Recently Used)
    +
    LRU´Â °¡Àå ¿À·¡µ¿¾È Á¢±ÙÇÏÁö ¾ÊÀº ¹®¼­¸¦ + ¸ÕÀú Á¦°ÅÇÑ´Ù.
    + +
    GDSF (GreadyDual-Size)
    +
    GDSF´Â ij½¬ ½ÇÆÐ(cache miss) ºñ¿ë°ú ¹®¼­ÀÇ + Å©±â¸¦ °¡Áö°í ij½¬ÇÑ ¹®¼­¿¡ ¿ì¼±¼øÀ§¸¦ ºÎ¿©ÇÑ´Ù. °¡Àå + ¿ì¼±¼øÀ§°¡ ³·Àº ¹®¼­¸¦ ¸ÕÀú Á¦°ÅÇÑ´Ù.
    +
    + +

    ¿¹Á¦

    + MCacheRemovalAlgorithm GDSF
    + MCacheRemovalAlgorithm LRU +

    + +
    +
    top
    +

    MCacheSize Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:ij½¬¿¡ »ç¿ëÇÒ ÃÖ´ë ¸Þ¸ð¸®·® (KByte ´ÜÀ§)
    ¹®¹ý:MCacheSize KBytes
    ±âº»°ª:MCacheSize 100
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤
    »óÅÂ:Experimental
    ¸ðµâ:mod_mem_cache
    +

    MCacheSize Áö½Ã¾î´Â ij½¬¿¡ »ç¿ëÇÒ + ÃÖ´ë ¸Þ¸ð¸®·®À» KByte ´ÜÀ§·Î (1024 ¹ÙÀÌÆ® ´ÜÀ§) ¼³Á¤ÇÑ´Ù. + »õ·Î¿î °´Ã¼À» ij½¬¿¡ Ãß°¡ÇØ¾ß Çϴµ¥ °´Ã¼ÀÇ Å©±â°¡ ³²Àº + ¸Þ¸ð¸®º¸´Ù Å©´Ù¸é »õ·Î¿î °´Ã¼À» ij½¬ÇÒ ¼ö ÀÖÀ»¶§±îÁö ´Ù¸¥ + °´Ã¼¸¦ Á¦°ÅÇÑ´Ù. MCacheRemovalAlgorithmÀ¸·Î + ÁöÁ¤ÇÑ ¾Ë°í¸®ÁòÀ» »ç¿ëÇÏ¿© Á¦°ÅÇÒ °´Ã¼¸¦ ¼±ÅÃÇÑ´Ù.

    + +

    ¿¹Á¦

    + MCacheSize 700000 +

    + +

    ÁÖÀÇ

    +

    MCacheSize °ªÀº MCacheMaxObjectSize + Áö½Ã¾î·Î ÁöÁ¤ÇÑ °ªº¸´Ù Ä¿¾ß ÇÑ´Ù.

    +
    + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_mime.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_mime.html new file mode 100644 index 00000000..942dc58a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_mime.html @@ -0,0 +1,9 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_mime.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: mod_mime.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_mime.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_mime.html.en new file mode 100644 index 00000000..d8ff2af5 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_mime.html.en @@ -0,0 +1,940 @@ + + + +mod_mime - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_mime

    +
    +

    Available Languages:  en  | + ja 

    +
    + + + +
    Description:Associates the requested filename's extensions + with the file's behavior (handlers and filters) + and content (mime-type, language, character set and + encoding)
    Status:Base
    Module Identifier:mime_module
    Source File:mod_mime.c
    +

    Summary

    + +

    This module is used to associate various bits of "meta + information" with files by their filename extensions. This + information relates the filename of the document to it's + mime-type, language, character set and encoding. This + information is sent to the browser, and participates in content + negotiation, so the user's preferences are respected when + choosing one of several possible files to serve. See + mod_negotiation for more information + about content negotiation.

    + +

    The directives AddCharset, AddEncoding, AddLanguage and AddType are all used to map file + extensions onto the meta-information for that file. Respectively + they set the character set, content-encoding, content-language, + and MIME-type (content-type) of documents. The directive TypesConfig is used to specify a + file which also maps extensions onto MIME types.

    + +

    In addition, mod_mime may define the handler and filters that originate and process + content. The directives AddHandler, AddOutputFilter, and AddInputFilter control the modules + or scripts that serve the document. The MultiviewsMatch directive allows + mod_negotiation to consider these file extensions + to be included when testing Multiviews matches.

    + +

    While mod_mime associates meta-information + with filename extensions, the core server + provides directives that are used to associate all the files in a + given container (e.g., <Location>, <Directory>, or <Files>) with particular + meta-information. These directives include ForceType, SetHandler, SetInputFilter, and SetOutputFilter. The core directives + override any filename extension mappings defined in + mod_mime.

    + +

    Note that changing the meta-information for a file does not + change the value of the Last-Modified header. + Thus, previously cached copies may still be used by a client or + proxy, with the previous headers. If you change the + meta-information (language, content type, character set or + encoding) you may need to 'touch' affected files (updating + their last modified date) to ensure that all visitors are + receive the corrected content headers.

    +
    + +
    top
    +
    +

    Files with Multiple Extensions

    +

    Files can have more than one extension, and the order of the + extensions is normally irrelevant. For example, if the + file welcome.html.fr maps onto content type + text/html and language French then the file + welcome.fr.html will map onto exactly the same information. + If more than one extension is given which maps onto the same + type of meta-information, then the one to the right will be + used, except for languages and content encodings. For example, if + .gif maps to the MIME-type image/gif and + .html maps to the MIME-type text/html, then the + file welcome.gif.html will be associated with the MIME-type + text/html.

    + +

    Languages and content encodings are treated accumulative, because one can assign + more than one language or encoding to a particular resource. For example, + the file welcome.html.en.de will be delivered with + Content-Language: en, de and Content-Type: + text/html.

    + +

    Care should be taken when a file with multiple extensions + gets associated with both a MIME-type and a handler. This will + usually result in the request being by the module associated + with the handler. For example, if the .imap + extension is mapped to the handler imap-file (from + mod_imap) and the .html extension is + mapped to the MIME-type text/html, then the file + world.imap.html will be associated with both the + imap-file handler and text/html MIME-type. + When it is processed, the imap-file handler will be used, + and so it will be treated as a mod_imap imagemap + file.

    +
    top
    +
    +

    Content encoding

    +

    A file of a particular MIME type can additionally be encoded a + particular way to simplify transmission over the Internet. + While this usually will refer to compression, such as + gzip, it can also refer to encryption, such a + pgp or to an encoding such as UUencoding, which is + designed for transmitting a binary file in an ASCII (text) + format.

    + +

    The HTTP/1.1 + RFC, section 14.11 puts it this way:

    + +
    +

    The Content-Encoding entity-header field is used as a modifier to + the media-type. When present, its value indicates what additional + content codings have been applied to the entity-body, and thus what + decoding mechanisms must be applied in order to obtain the media-type + referenced by the Content-Type header field. Content-Encoding is + primarily used to allow a document to be compressed without losing + the identity of its underlying media type.

    +
    + +

    By using more than one file extension (see section above about multiple file + extensions), you can indicate that a file is of a + particular type, and also has a particular + encoding.

    + +

    For example, you may have a file which is a Microsoft Word + document, which is pkzipped to reduce its size. If the + .doc extension is associated with the Microsoft + Word file type, and the .zip extension is + associated with the pkzip file encoding, then the file + Resume.doc.zip would be known to be a pkzip'ed Word + document.

    + +

    Apache sends a Content-encoding header with the + resource, in order to tell the client browser about the + encoding method.

    + +

    Content-encoding: pkzip

    +
    top
    +
    +

    Character sets and languages

    +

    In addition to file type and the file encoding, + another important piece of information is what language a + particular document is in, and in what character set the file + should be displayed. For example, the document might be written + in the Vietnamese alphabet, or in Cyrillic, and should be + displayed as such. This information, also, is transmitted in + HTTP headers.

    + +

    The character set, language, encoding and mime type are all + used in the process of content negotiation (See + mod_negotiation) to determine + which document to give to the client, when there are + alternative documents in more than one character set, language, + encoding or mime type. All filename extensions associations + created with AddCharset, + AddEncoding, AddLanguage and AddType directives + (and extensions listed in the MimeMagicFile) participate in this select process. + Filename extensions that are only associated using the AddHandler, AddInputFilter or AddOutputFilter directives may be included or excluded + from matching by using the MultiviewsMatch directive.

    + +

    Charset

    +

    To convey this further information, Apache optionally sends + a Content-Language header, to specify the language + that the document is in, and can append additional information + onto the Content-Type header to indicate the + particular character set that should be used to correctly + render the information.

    + +

    + Content-Language: en, fr
    + Content-Type: text/plain; charset=ISO-8859-1 +

    + +

    The language specification is the two-letter abbreviation + for the language. The charset is the name of the + particular character set which should be used.

    + +
    +
    top
    +

    AddCharset Directive

    + + + + + + + +
    Description:Maps the given filename extensions to the specified content +charset
    Syntax:AddCharset charset extension +[extension] ...
    Context:server config, virtual host, directory, .htaccess
    Override:FileInfo
    Status:Base
    Module:mod_mime
    +

    The AddCharset directive maps the given + filename extensions to the specified content charset. charset + is the MIME + charset parameter of filenames containing + extension. This mapping is added to any already in force, + overriding any mappings that already exist for the same + extension.

    + +

    Example

    + AddLanguage ja .ja
    + AddCharset EUC-JP .euc
    + AddCharset ISO-2022-JP .jis
    + AddCharset SHIFT_JIS .sjis +

    + +

    Then the document xxxx.ja.jis will be treated + as being a Japanese document whose charset is ISO-2022-JP + (as will the document xxxx.jis.ja). The + AddCharset directive is useful for both to + inform the client about the character encoding of the document so that + the document can be interpreted and displayed appropriately, and for content negotiation, + where the server returns one from several documents based on + the client's charset preference.

    + +

    The extension argument is case-insensitive, and can + be specified with or without a leading dot.

    + +

    See also

    + +
    +
    top
    +

    AddEncoding Directive

    + + + + + + + +
    Description:Maps the given filename extensions to the specified encoding +type
    Syntax:AddEncoding MIME-enc extension +[extension] ...
    Context:server config, virtual host, directory, .htaccess
    Override:FileInfo
    Status:Base
    Module:mod_mime
    +

    The AddEncoding directive maps the given + filename extensions to the specified encoding type. MIME-enc + is the MIME encoding to use for documents containing the + extension. This mapping is added to any already in force, + overriding any mappings that already exist for the same + extension.

    + +

    Example

    + AddEncoding x-gzip .gz
    + AddEncoding x-compress .Z +

    + +

    This will cause filenames containing the .gz extension + to be marked as encoded using the x-gzip encoding, and + filenames containing the .Z extension to be marked as + encoded with x-compress.

    + +

    Old clients expect x-gzip and x-compress, + however the standard dictates that they're equivalent to + gzip and compress respectively. Apache does + content encoding comparisons by ignoring any leading x-. + When responding with an encoding Apache will use whatever form + (i.e., x-foo or foo) the + client requested. If the client didn't specifically request a + particular form Apache will use the form given by the + AddEncoding directive. To make this long story + short, you should always use x-gzip and + x-compress for these two specific encodings. More + recent encodings, such as deflate should be + specified without the x-.

    + +

    The extension argument is case-insensitive, and can + be specified with or without a leading dot.

    + +
    +
    top
    +

    AddHandler Directive

    + + + + + + + +
    Description:Maps the filename extensions to the specified +handler
    Syntax:AddHandler handler-name extension +[extension] ...
    Context:server config, virtual host, directory, .htaccess
    Override:FileInfo
    Status:Base
    Module:mod_mime
    +

    Files having the name extension will be served by the + specified handler-name. This + mapping is added to any already in force, overriding any mappings that + already exist for the same extension. For example, to + activate CGI scripts with the file extension .cgi, you + might use:

    + +

    + AddHandler cgi-script .cgi +

    + +

    Once that has been put into your httpd.conf file, any file containing + the .cgi extension will be treated as a CGI program.

    + +

    The extension argument is case-insensitive, and can + be specified with or without a leading dot.

    + +

    See also

    + +
    +
    top
    +

    AddInputFilter Directive

    + + + + + + + + +
    Description:Maps filename extensions to the filters that will process +client requests
    Syntax:AddInputFilter filter[;filter...] +extension [extension] ...
    Context:server config, virtual host, directory, .htaccess
    Override:FileInfo
    Status:Base
    Module:mod_mime
    Compatibility:AddInputFilter is only available in Apache 2.0.26 and +later.
    +

    AddInputFilter maps the filename extension + extension to the filters which + will process client requests and POST input when they are received by + the server. This is in addition to any filters defined elsewhere, + including the SetInputFilter + directive. This mapping is merged over any already in force, overriding + any mappings that already exist for the same extension.

    + +

    If more than one filter is specified, they must be separated + by semicolons in the order in which they should process the + content. Both the filter and extension arguments are + case-insensitive, and the extension may be specified with or + without a leading dot.

    + +

    See also

    + +
    +
    top
    +

    AddLanguage Directive

    + + + + + + + +
    Description:Maps the given filename extension to the specified content +language
    Syntax:AddLanguage MIME-lang extension +[extension] ...
    Context:server config, virtual host, directory, .htaccess
    Override:FileInfo
    Status:Base
    Module:mod_mime
    +

    The AddLanguage directive maps the given + filename extension to the specified content language. + MIME-lang is the MIME language of filenames containing + extension. This mapping is added to any already in force, + overriding any mappings that already exist for the same + extension.

    + +

    Example

    + AddEncoding x-compress .Z
    + AddLanguage en .en
    + AddLanguage fr .fr +

    + +

    Then the document xxxx.en.Z will be treated as + being a compressed English document (as will the document + xxxx.Z.en). Although the content language is + reported to the client, the browser is unlikely to use this + information. The AddLanguage directive is + more useful for content + negotiation, where the server returns one from several documents + based on the client's language preference.

    + +

    If multiple language assignments are made for the same + extension, the last one encountered is the one that is used. + That is, for the case of:

    + +

    + AddLanguage en .en
    + AddLanguage en-gb .en
    + AddLanguage en-us .en +

    + +

    documents with the extension .en would be treated as + being en-us.

    + +

    The extension argument is case-insensitive, and can + be specified with or without a leading dot.

    + +

    See also

    + +
    +
    top
    +

    AddOutputFilter Directive

    + + + + + + + + +
    Description:Maps filename extensions to the filters that will process +responses from the server
    Syntax:AddOutputFilter filter[;filter...] +extension [extension] ...
    Context:server config, virtual host, directory, .htaccess
    Override:FileInfo
    Status:Base
    Module:mod_mime
    Compatibility:AddOutputFilter is only available in Apache 2.0.26 and +later.
    +

    The AddOutputFilter directive maps the + filename extension extension to the filters which will process responses + from the server before they are sent to the client. This is in + addition to any filters defined elsewhere, including SetOutputFilter and AddOutputFilterByType directive. This mapping is merged + over any already in force, overriding any mappings that already exist + for the same extension.

    + +

    For example, the following configuration will process all + .shtml files for server-side includes and will then + compress the output using mod_deflate.

    + +

    + AddOutputFilter INCLUDES;DEFLATE shtml +

    + +

    If more than one filter is specified, they must be separated + by semicolons in the order in which they should process the + content. Both the filter and extension arguments + are case-insensitive, and the extension may be specified with or + without a leading dot.

    + +

    See also

    + +
    +
    top
    +

    AddType Directive

    + + + + + + + +
    Description:Maps the given filename extensions onto the specified content +type
    Syntax:AddType MIME-type extension +[extension] ...
    Context:server config, virtual host, directory, .htaccess
    Override:FileInfo
    Status:Base
    Module:mod_mime
    +

    The AddType directive maps the given filename + extensions onto the specified content type. MIME-type is the + MIME type to use for filenames containing extension. This + mapping is added to any already in force, overriding any mappings that + already exist for the same extension. This directive can + be used to add mappings not listed in the MIME types file (see the + TypesConfig directive).

    + +

    Example

    + AddType image/gif .gif +

    + +
    + It is recommended that new MIME types be added using the + AddType directive rather than changing the + TypesConfig file. +
    + +

    The extension argument is case-insensitive, and can + be specified with or without a leading dot.

    + +

    See also

    + +
    +
    top
    +

    DefaultLanguage Directive

    + + + + + + + +
    Description:Sets all files in the given scope to the specified +language
    Syntax:DefaultLanguage MIME-lang
    Context:server config, virtual host, directory, .htaccess
    Override:FileInfo
    Status:Base
    Module:mod_mime
    +

    The DefaultLanguage directive tells Apache + that all files in the directive's scope (e.g., all files + covered by the current <Directory> container) that don't have an explicit language + extension (such as .fr or .de as configured + by AddLanguage) should be + considered to be in the specified MIME-lang language. This + allows entire directories to be marked as containing Dutch content, for + instance, without having to rename each file. Note that unlike using + extensions to specify languages, DefaultLanguage + can only specify a single language.

    + +

    If no DefaultLanguage directive is in force, + and a file does not have any language extensions as configured + by AddLanguage, then that file + will be considered to have no language attribute.

    + +

    Example

    + DefaultLanguage en +

    + +

    See also

    + +
    +
    top
    +

    ModMimeUsePathInfo Directive

    + + + + + + + + +
    Description:Tells mod_mime to treat path_info +components as part of the filename
    Syntax:ModMimeUsePathInfo On|Off
    Default:ModMimeUsePathInfo Off
    Context:directory
    Status:Base
    Module:mod_mime
    Compatibility:Available in Apache 2.0.41 and later
    +

    The ModMimeUsePathInfo directive is used to + combine the filename with the path_info URL component to + apply mod_mime's directives to the request. The default + value is Off - therefore, the path_info + component is ignored.

    + +

    This directive is recommended when you have a virtual filesystem.

    + +

    Example

    + ModMimeUsePathInfo On +

    + +

    If you have a request for /bar/foo.shtml where + /bar is a Location and ModMimeUsePathInfo is On, + mod_mime will treat the incoming request as + /bar/foo.shtml and directives like AddOutputFilter + INCLUDES .shtml will add the INCLUDES filter to the + request. If ModMimeUsePathInfo is not set, the + INCLUDES filter will not be added.

    + +

    See also

    + +
    +
    top
    +

    MultiviewsMatch Directive

    + + + + + + + + + +
    Description:The types of files that will be included when searching for +a matching file with MultiViews
    Syntax:MultiviewsMatch Any|NegotiatedOnly|Filters|Handlers +[Handlers|Filters]
    Default:MultiviewsMatch NegotiatedOnly
    Context:server config, virtual host, directory, .htaccess
    Override:FileInfo
    Status:Base
    Module:mod_mime
    Compatibility:Available in Apache 2.0.26 and later.
    +

    MultiviewsMatch permits three different + behaviors for mod_negotiation's + Multiviews feature. Multiviews allows a request for a file, + e.g. index.html, to match any negotiated + extensions following the base request, e.g. + index.html.en, index.html.fr, or + index.html.gz.

    + +

    The NegotiatedOnly option provides that every extension + following the base name must correlate to a recognized + mod_mime extension for content negotation, e.g. + Charset, Content-Type, Language, or Encoding. This is the strictest + implementation with the fewest unexpected side effects, and is the + default behavior.

    + +

    To include extensions associated with Handlers and/or Filters, + set the MultiviewsMatch directive to either + Handlers, Filters, or both option keywords. + If all other factors are equal, the smallest file will be served, + e.g. in deciding between index.html.cgi of 500 + bytes and index.html.pl of 1000 bytes, the .cgi + file would win in this example. Users of .asis files + might prefer to use the Handler option, if .asis files are + associated with the asis-handler.

    + +

    You may finally allow Any extensions to match, even if + mod_mime doesn't recognize the extension. This was the + behavior in Apache 1.3, and can cause unpredicatable results, such as + serving .old or .bak files the webmaster never expected to be served.

    + +

    For example, the following configuration will allow handlers + and filters to participate in Multviews, but will exclude unknown + files:

    + +

    + MultiviewsMatch Handlers Filters +

    + +

    See also

    + +
    +
    top
    +

    RemoveCharset Directive

    + + + + + + + + +
    Description:Removes any character set associations for a set of file +extensions
    Syntax:RemoveCharset extension [extension] +...
    Context:virtual host, directory, .htaccess
    Override:FileInfo
    Status:Base
    Module:mod_mime
    Compatibility:RemoveCharset is only available in Apache 2.0.24 and +later.
    +

    The RemoveCharset directive removes any + character set associations for files with the given extensions. + This allows .htaccess files in subdirectories to + undo any associations inherited from parent directories or the + server config files.

    + +

    The extension argument is case-insensitive, and can + be specified with or without a leading dot.

    + +

    Example

    + RemoveCharset .html .shtml +

    + +
    +
    top
    +

    RemoveEncoding Directive

    + + + + + + + +
    Description:Removes any content encoding associations for a set of file +extensions
    Syntax:RemoveEncoding extension [extension] +...
    Context:virtual host, directory, .htaccess
    Override:FileInfo
    Status:Base
    Module:mod_mime
    +

    The RemoveEncoding directive removes any + encoding associations for files with the given extensions. This + allows .htaccess files in subdirectories to undo + any associations inherited from parent directories or the + server config files. An example of its use might be:

    + +

    /foo/.htaccess:

    + AddEncoding x-gzip .gz
    + AddType text/plain .asc
    + <Files *.gz.asc>
    + + RemoveEncoding .gz
    +
    + </Files> +

    + +

    This will cause foo.gz to be marked as being + encoded with the gzip method, but foo.gz.asc as an + unencoded plaintext file.

    + +

    Note

    +

    RemoveEncoding directives are processed + after any AddEncoding + directives, so it is possible they may undo the effects of the latter + if both occur within the same directory configuration.

    +
    + +

    The extension argument is case-insensitive, and can + be specified with or without a leading dot.

    + +
    +
    top
    +

    RemoveHandler Directive

    + + + + + + + +
    Description:Removes any handler associations for a set of file +extensions
    Syntax:RemoveHandler extension [extension] +...
    Context:virtual host, directory, .htaccess
    Override:FileInfo
    Status:Base
    Module:mod_mime
    +

    The RemoveHandler directive removes any + handler associations for files with the given extensions. This allows + .htaccess files in subdirectories to undo any + associations inherited from parent directories or the server + config files. An example of its use might be:

    + +

    /foo/.htaccess:

    + AddHandler server-parsed .html +

    + +

    /foo/bar/.htaccess:

    + RemoveHandler .html +

    + +

    This has the effect of returning .html files in + the /foo/bar directory to being treated as normal + files, rather than as candidates for parsing (see the mod_include module).

    + +

    The extension argument is case-insensitive, and can + be specified with or without a leading dot.

    + +
    +
    top
    +

    RemoveInputFilter Directive

    + + + + + + + + +
    Description:Removes any input filter associations for a set of file +extensions
    Syntax:RemoveInputFilter extension [extension] +...
    Context:virtual host, directory, .htaccess
    Override:FileInfo
    Status:Base
    Module:mod_mime
    Compatibility:RemoveInputFilter is only available in Apache 2.0.26 and +later.
    +

    The RemoveInputFilter directive removes any + input filter associations for files with + the given extensions. + This allows .htaccess files in subdirectories to + undo any associations inherited from parent directories or the + server config files.

    + +

    The extension argument is case-insensitive, and can + be specified with or without a leading dot.

    + +

    See also

    + +
    +
    top
    +

    RemoveLanguage Directive

    + + + + + + + + +
    Description:Removes any language associations for a set of file +extensions
    Syntax:RemoveLanguage extension [extension] +...
    Context:virtual host, directory, .htaccess
    Override:FileInfo
    Status:Base
    Module:mod_mime
    Compatibility:RemoveLanguage is only available in Apache 2.0.24 and +later.
    +

    The RemoveLanguage directive removes any + language associations for files with the given extensions. This + allows .htaccess files in subdirectories to undo + any associations inherited from parent directories or the + server config files.

    + +

    The extension argument is case-insensitive, and can + be specified with or without a leading dot.

    + +
    +
    top
    +

    RemoveOutputFilter Directive

    + + + + + + + + +
    Description:Removes any output filter associations for a set of file +extensions
    Syntax:RemoveOutputFilter extension [extension] +...
    Context:virtual host, directory, .htaccess
    Override:FileInfo
    Status:Base
    Module:mod_mime
    Compatibility:RemoveOutputFilter is only available in Apache 2.0.26 and +later.
    +

    The RemoveOutputFilter directive removes any + output filter associations for files with + the given extensions. + This allows .htaccess files in subdirectories to + undo any associations inherited from parent directories or the + server config files.

    + +

    The extension argument is case-insensitive, and can + be specified with or without a leading dot.

    + +

    Example

    + RemoveOutputFilter shtml +

    + +

    See also

    + +
    +
    top
    +

    RemoveType Directive

    + + + + + + + +
    Description:Removes any content type associations for a set of file +extensions
    Syntax:RemoveType extension [extension] +...
    Context:virtual host, directory, .htaccess
    Override:FileInfo
    Status:Base
    Module:mod_mime
    +

    The RemoveType directive removes any MIME + type associations for files with the given extensions. This allows + .htaccess files in subdirectories to undo any + associations inherited from parent directories or the server + config files. An example of its use might be:

    + +

    /foo/.htaccess:

    + RemoveType .cgi +

    + +

    This will remove any special handling of .cgi + files in the /foo/ directory and any beneath it, + causing the files to be treated as being of the DefaultType.

    + +

    Note

    +

    RemoveType directives are processed + after any AddType + directives, so it is possible they may undo the effects of the + latter if both occur within the same directory configuration.

    +
    + +

    The extension argument is case-insensitive, and can + be specified with or without a leading dot.

    + +
    +
    top
    +

    TypesConfig Directive

    + + + + + + + +
    Description:The location of the mime.types file
    Syntax:TypesConfig file-path
    Default:TypesConfig conf/mime.types
    Context:server config
    Status:Base
    Module:mod_mime
    +

    The TypesConfig directive sets the location + of the MIME types configuration file. File-path is relative + to the ServerRoot. This file sets + the default list of mappings from filename extensions to content + types. Most administrators use the provided mime.types + file, which associates common filename extensions with IANA registered + content types. The current list is maintained at http://www.iana.org/assignments/media-types/index.html. + This simplifies the httpd.conf file by providing the + majority of media-type definitions, and may be overridden by + AddType directives as + needed. You should not edit the mime.types file, because + it may be replaced when you upgrade your server.

    + +

    The file contains lines in the format of the arguments to + an AddType directive:

    + +

    + MIME-type [extension] ... +

    + +

    The case of the extension does not matter. Blank lines, and lines + beginning with a hash character (#) are ignored.

    + +
    + Please do not send requests to the Apache HTTP + Server Project to add any new entries in the distributed + mime.types file unless (1) they are already + registered with IANA, and (2) they use widely accepted, + non-conflicting filename extensions across platforms. + category/x-subtype requests will be automatically + rejected, as will any new two-letter extensions as they will + likely conflict later with the already crowded language and + character set namespace. +
    + +

    See also

    + +
    +
    +
    +

    Available Languages:  en  | + ja 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_mime.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_mime.html.ja.utf8 new file mode 100644 index 00000000..c595e8da --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_mime.html.ja.utf8 @@ -0,0 +1,938 @@ + + + +mod_mime - Apache HTTP サーバ + + + + + + +
    <-
    + +
    +

    Apache モジュール mod_mime

    +
    +

    Available Languages:  en  | + ja 

    +
    +
    This translation may be out of date. Check the + English version for recent changes.
    + + + +
    説明:リクエストされたファイルの拡張子とファイルの振る舞い + (ハンドラとフィルタ)、内容 (MIME タイプ、言語、文字セット、エンコーディング) + とを関連付ける
    ステータス:Base
    モジュール識別子:mime_module
    ソースファイル:mod_mime.c
    +

    概要

    + +

    このモジュールは拡張子を使っていろいろな「メタ情報」をファイルに + 関連付けるために使用されます。この情報はドキュメントのファイル名と + MIME タイプ、言語、文字セット、エンコーディングとを関連付けます。 + この情報はブラウザに送られますし、複数のファイルの中からユーザの好みの + ものが選ばれるように、コンテントネゴシエーションでも使われます。 + コンテントネゴシエーション + に関する詳しい情報は mod_negotiation + をご覧下さい。

    + +

    AddCharset ディレクティブ、 + AddEncoding ディレクティブ、 + AddHandler ディレクティブ、 + AddLanguage ディレクティブ、 + AddType ディレクティブはすべて、 + ファイルの拡張子をメタ情報にマップするために使用されます。 + それぞれ、ドキュメントの文字セット (訳注: charset)、content-encoding, + content-language, MIME タイプ (content-type) を設定します。 + TypesConfig ディレクティブは拡張子を + MIME タイプにマップするファイルを指定するために使用されます。

    + +

    さらに、mod_mime はコンテンツを作成、処理する + ハンドラ と フィルタ + を設定することができます。AddHandler ディレクティブ、AddOutputFilter ディレクティブ、AddInputFilter ディレクティブは + ドキュメントを扱うモジュールやスクリプトを制御します。 + MultiviewsMatch ディレクティブは + これらのディレクティブが指定したファイルの拡張子を + mod_negotiation が Multiviews のマッチをとるときに + 考慮するようにできます。

    + +

    mod_mime はメタ情報をファイル名と関連付けますが、 + core サーバにはあるコンテナ + (たとえば, <Location>, <Directory>, <Files>) の中のすべてのファイルを特定の + メタ情報と関連付けるディレクティブがあります。これらのディレクティブには + ForceType, SetHandler, SetInputFilter, SetOutputFilter があります。 + コアのディレクティブは mod_mime により定義された + ファイル名の拡張子のマッピングすべてを上書きします。

    + +

    ファイルのメタ情報を変えても Last-Modified + ヘッダの値は変わらないことに注意してください。ですから、 + それらを変更した場合は、クライアントやプロキシで以前にキャッシュされた + コピーがそのときのヘッダとともに使われる可能性があります。 + メタ情報 (言語、コンテントタイプ、文字セット、エンコーディング) を + 変更したときは、すべての訪問者が正しいコンテントヘッダを + 受け取るように、影響を受けるファイルに 'touch' コマンドを実行する + (最終更新日を更新する) 必要があるかもしれません。

    +
    + +
    top
    +
    +

    複数の拡張子のあるファイル

    +

    ファイルは複数の拡張子を持つことができ、拡張子の順番は通常は関係ありません。例えば、ファイル welcome.html.fr + がコンテントタイプは text/html + に、言語はフランス語にマップされる場合、welcome.fr.html + もまったく同じ情報にマップされます。 + 同じメタ情報にマップされる拡張子が複数あるときには、言語と + コンテントエンコーディングを除いて、 + 右側にあるものが使用されます。たとえば、.gif が MIME + タイプ image/gif にマップされ、.html + が MIME タイプ text/html + にマップされる場合は、ファイル welcome.gif.html は + MIME タイプ text/html に関連付けられます。

    + +

    リソースに複数の言語やエンコーディングを関連付けること + ができるため、 + 言語とコンテントエンコーディングは前のものに追加されていきます。 + たとえば、ファイル welcome.html.en.de は + Content-Language: en, de と Content-Type: + text/html として送信されます。

    + +

    複数の拡張子のあるファイルが MIME + タイプとハンドラの両方に関連付けられているときは注意する必要があります。 + その場合、普通はリクエストがハンドラに関連付けられた + モジュールによって扱われることになります。たとえば、拡張子 + .imap が (mod_imap の) imap-file + にマップされていて、.html が MIME タイプ text/html + にマップされているときは、ファイル world.imap.html は + imap-file ハンドラと text/html MIME + タイプに関連付けられます。ファイルが処理されるときは imap-file + ハンドラが使用されますので、そのファイルは mod_imap + のイメージマップファイルとして扱われることになります。

    +
    top
    +
    +

    コンテントエンコーディング

    +

    特定の MIME タイプのファイルはインターネットでの転送を簡単にするために、 + さらに符号化することができます。これは通常は gzip の + ような圧縮のことを指しますが、pgp のような暗号化や、 + バイナリファイルを ASCII (テキスト) 形式で送るために考案された + UUencoding のことを指すこともあります。

    + +

    HTTP/1.1 RFC + 14.11 節では次のように記述されています。

    + +
    +

    Content-Encoding エンティティヘッダフィールドはメディアタイプの + 修飾子として使われます。それが存在していれば、値はエンティティボディに + どの追加の符号化が適用されたかを示し、Content-Type ヘッダフィールドに + 書かれているメディアタイプを得るためにどの復号機構を適用すべきか、も + 示していることになります。Content-Encoding は主に、元のメディアタイプの + 同一性を失うことなくドキュメントを圧縮することを可能にするために + 使用されます。

    +
    + +

    複数のファイル拡張子 (複数の拡張子については 上の節 を参照) 使うことで、 + ファイルのタイプやエンコーディングを指定することが + できます。

    + +

    たとえば、Microsoft Word のドキュメントがあり、サイズを小さくするために + pkzip されているとします。.doc 拡張子が Microsoft Word の + ファイルタイプと関連付けられていて、.zip 拡張子が + pkzip ファイルエンコーディングと関連付けられていると、ファイル + Resume.doc.zip は pkzip された Word ドキュメントである + ということがわかります。

    + +

    クライアントのブラウザにエンコーディング方法を知らせるために、 + Apache はリソースと共に Content-Encoding ヘッダを + 送ります。

    + +

    Content-encoding: pkzip

    +
    top
    +
    +

    文字セットと言語

    +

    ファイルタイプとファイルエンコーディングの他に重要な情報は + ドキュメントの書かれている言語と、どの文字セットでファイルが表示 + されるべきか、というものです。たとえば、ドキュメントはベトナムの + アルファベットやキリル文字で書かれていて、そのように表示される + 必要があるかもしれません。この情報もまた、HTTP ヘッダで + 送信されます。

    + +

    文字セット、言語、エンコーディング、mime タイプはすべて + コンテントネゴシエーション (mod_negotiation 参照) + の最中に、複数の文字セット、言語、エンコーディング、MIME タイプからなる + 代替物があるときにどのドキュメントをクライアントに送るのかを + 決定するときに使われます。AddCharset, + AddEncoding, AddLanguage, + AddType の各ディレクティブで作成された + 拡張子の関連付け (と MimeMagicFile でリストされている + 拡張子) がこの選択に参加します。AddHandler, + AddInputFilter, + AddOutputFilter の + 各ディレクティブでのみ関連付けられている拡張子は + MultiviewsMatch ディレクティブを + 使うことでマッチの + 処理に含めることも外すこともできます。

    + +

    Charset

    +

    さらに情報を伝えるために、Apache は文書の言語を + Content-Language ヘッダで送ることもあります。 + また、情報を正しく表示するために使用すべき文字セットを示すために + Conten-Type ヘッダに情報を追加することもあります。

    + +

    + Content-Language: en, fr
    + Content-Type: text/plain; charset=ISO-8859-1 +

    + +

    言語の指定は二文字の短縮形で行なわれます。charset が + 使用すべき文字セットの名前です。

    + +
    +
    top
    +

    AddCharset ディレクティブ

    + + + + + + + +
    説明:ファイル名の拡張子を指定された文字セットにマップする
    構文:AddCharset charset extension +[extension] ...
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:FileInfo
    ステータス:Base
    モジュール:mod_mime
    +

    AddCharset ディレクティブは、 + 与えられた拡張子を指定された charset にマップします。charset + は、拡張子 extension を含んでいるファイル名の MIME charset + パラメータです。新しいマッピングは既にある他のマッピングに追加され、同じ拡張子 + extension のためのマッピングを上書きします。

    + +

    例

    + AddLanguage ja .ja
    + AddCharset EUC-JP .euc
    + AddCharset ISO-2022-JP .jis
    + AddCharset SHIFT_JIS .sjis +

    + +

    この場合、ドキュメント xxxx.ja.jis は charset が + ISO-2022-JP の日本語のドキュメントとして扱われます + (xxxx.jis.ja も同様)。AddCharset + ディレクティブは、ドキュメントが適切に解釈され表示されるように、 + ドキュメントの charset の情報をクライアントに教えるために役に立ちます。 + また、サーバがクライアントの charset + の優先度に基づいて複数のドキュメントの中からドキュメントを選ぶコンテントネゴシエーションのためにも役に立ちます。

    + +

    引数 extensionは大文字小文字を区別せず、 + 最初のドットはあってもなくても構いません。

    + +

    参照

    + +
    +
    top
    +

    AddEncoding ディレクティブ

    + + + + + + + +
    説明:ファイル名の拡張子を指定されたエンコーディング +にマップする
    構文:AddEncoding MIME-enc extension +[extension] ...
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:FileInfo
    ステータス:Base
    モジュール:mod_mime
    +

    AddEncoding ディレクティブは、 + 与えられた拡張子を指定されたエンコーディングにマップします。 + MIME-enc は、拡張子 extension + を含んだドキュメントに使用する MIME エンコーディングです。 + この新しいマッピングは既にある他のマッピングに追加され、 + 同じ拡張子 extension のためのマッピングを上書きします。

    + +

    例

    + AddEncoding x-gzip .gz
    + AddEncoding x-compress .Z
    +

    + +

    これは、拡張子 .gz を含むファイル名が x-gzip + エンコーディングを使ってエンコードされていることと、拡張子 .Z + を含むファイル名が x-compress + でエンコードされていることを指定します。

    + +

    古いクライアントは x-zip と x-compress + が返ってくることを期待しますが、標準規格ではそれぞれ + gzip と compress + と等価であることになっています。Apache + は、コンテントエンコーディングの比較をするときには、先頭にある + x- を無視します。Apache + がエンコーディング付きで応答を返すときは、クライアントが要求した形式 + (すなわち、x-foo や foo) + を使用します。要するに、この二つのエンコーディングの場合は常に + x-gzip と x-compress + を使うべきである、ということです。deflate + のようなより新しいエンコーディングでは、x- + なしで指定してください。 +

    + +

    引数 extension は大文字小文字を区別せず、 + 最初のドットはあってもなくても構いません。

    + +
    +
    top
    +

    AddHandler ディレクティブ

    + + + + + + + +
    説明:ファイル名の拡張子を指定されたハンドラにマップする
    構文:AddHandler handler-name extension +[extension] ...
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:FileInfo
    ステータス:Base
    モジュール:mod_mime
    +

    拡張子 extension が名前にあるファイルは指定された handler-name に扱われます。 + この新しいマッピングは既にある他のマッピングに追加され、 + 同じ拡張子 extension + のためのマッピングを上書きします。たとえば、拡張子 + ".cgi" で終わるファイルを CGI + スクリプトとして扱いたいときは、以下の設定をします。

    + +

    + AddHandler cgi-script .cgi +

    + +

    これを httpd.conf ファイルに記述することで、拡張子 + ".cgi" のファイルは CGI プログラムとして扱われます。 +

    + +

    引数 extension は大文字小文字を区別せず、 + 最初のドットはあってもなくても構いません。

    + +

    参照

    + +
    +
    top
    +

    AddInputFilter ディレクティブ

    + + + + + + + + +
    説明:ファイルの拡張子をクライアントのリクエストを処理する + フィルタにマップする
    構文:AddInputFilter filter[;filter...] +extension [extension] ...
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:FileInfo
    ステータス:Base
    モジュール:mod_mime
    互換性:2.0.26 以降で使用可能
    +

    AddInputFilter はファイルの拡張子 + extension をクライアントのリクエストや POST がサーバに来たときに + 処理をするフィルタにマップします。 + これは、SetInputFilter ディレクティブも + 含め、他の場所で定義されているフィルタに加えられます。 + このマッピングはすでにあるものより優先されてマージされ、 + 同じ extension に対する既存のマッピングを上書きします。

    + +

    複数のフィルタを指定するときは、データを処理する順番にセミコロンで + 繋いで書く必要があります。フィルタと extension との + 両方の引数は大文字小文字を区別せず、拡張子の最初のドットは + あってもなくても構いません。

    + +

    参照

    + +
    +
    top
    +

    AddLanguage ディレクティブ

    + + + + + + + +
    説明:ファイル名を指定された言語にマップ
    構文:AddLanguage MIME-lang extension +[extension] ...
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:FileInfo
    ステータス:Base
    モジュール:mod_mime
    +

    AddLanguage ディレクティブは、与えられた拡張子を指定された + content language にマップします。MIME-lang は、拡張子 + extension を含んでいるファイル名の MIME における言語です。 + この新しいマッピングは既にあるマッピングに追加され、同じ拡張子 + extension のためのマッピングを上書きします。

    + +

    例

    + AddEncoding x-compress .Z
    + AddLanguage en .en
    + AddLanguage fr .fr +

    + +

    この場合、xxxx.en.Z ドキュメントは compress + された英語のドキュメントとして扱われます (xxxx.Z.en + も同様)。content language はクライアントに通知されますが、 + ブラウザがこの情報を使うことはおそらくありません。 + AddLanguage + ディレクティブは、サーバがクライアントの言語の優先度に基づいて複数の + ドキュメントの中からドキュメントを選ぶコンテントネゴシエーションのためにより役に立ちます。

    + +

    複数の言語が同じ拡張子に割り当てられているときは、 + 最後のものが使用されます。すなわち、次のような場合、

    + +

    + AddLanguage en .en
    + AddLanguage en-gb .en
    + AddLanguage en-us .en +

    + +

    拡張子 .en のあるドキュメントは + en-us として扱われます。

    + +

    引数 extension は大文字小文字を区別せず、 + 最初のドットはあってもなくても構いません。

    + +

    参照

    + +
    +
    top
    +

    AddOutputFilter ディレクティブ

    + + + + + + + + +
    説明:ファイル名の拡張子をサーバからの応答を処理するフィルタに + マップする
    構文:AddOutputFilter filter[;filter...] +extension [extension] ...
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:FileInfo
    ステータス:Base
    モジュール:mod_mime
    互換性:2.0.26 以降で使用可能
    +

    AddOutputFilter ディレクティブは + 拡張子 extension をサーバの応答がクライアントに送られる + 前に処理するフィルタを定義します。 + これは SetOutputFilter + ディレクティブと AddOutputFilterByType ディレクティブ + を含め、他の場所で定義されているフィルタに加えられます。 + この新しいマッピングは既にあるマッピングに追加され、同じ拡張子 + extension のためのマッピングを上書きします。

    + +

    例えば、以下の設定はすべての .shtml ファイルを SSI で処理し、 + その出力を mod_deflate を使って圧縮します。

    + +

    + AddOutputFilter INCLUDES;DEFLATE shtml +

    + +

    複数のフィルタを指定するときは、データを処理する順番にセミコロンで + 繋いで書く必要があります。filter と extension の + 両引数は大文字小文字を区別せず、拡張子の最初のドットは + あってもなくても構いません。

    + +

    参照

    + +
    +
    top
    +

    AddType ディレクティブ

    + + + + + + + +
    説明:ファイル名の拡張子を指定されたコンテントタイプにマップ
    構文:AddType MIME-type extension +[extension] ...
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:FileInfo
    ステータス:Base
    モジュール:mod_mime
    +

    AddType ディレクティブは、 + 与えられた拡張子を指定されたコンテントタイプにマップします。 + MIME-type は拡張子 extension + を含んだドキュメントに使用する MIME タイプです。 + この新しいマッピングは既にあるマッピングに追加され、同じ拡張子 + extension のためのマッピングを上書きします。 + このディレクティブは MIME タイプファイル (TypesConfig ディレクティブを参照) + に無いマッピングを追加するために使用することができます。

    + +

    例

    + AddType image/gif .gif +

    + +
    + 新しい MIME タイプは、TypesConfig + ファイルを変更するのではなく、AddType + ディレクティブを使って追加することが推奨されています。 +
    + +

    引数 extension は大文字小文字を区別せず、 + 最初のドットはあってもなくても構いません。

    + +

    参照

    + +
    +
    top
    +

    DefaultLanguage ディレクティブ

    + + + + + + + +
    説明:あるスコープのすべてのファイルを指定された言語に +設定する
    構文:DefaultLanguage MIME-lang
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:FileInfo
    ステータス:Base
    モジュール:mod_mime
    +

    DefaultLanguage ディレクティブは、Apache + がディレクティブのスコープ (例えば、その時点の + <Directory> + の範囲) にある、明示的な言語拡張子 + (AddLanguage で設定される + .fr や .de) のない全てのファイルを、指定された + MIME-lang 言語であるとみなすようにします。 + これにより、すべてのファイル名を変えることなく、 + ディレクトリがオランダ語のコンテントを含んでいる、 + というようなことを指定することができます。 + 拡張子を使用して言語を指定する方法と違い、 + DefaultLanguage + は一つの言語しか指定できないことに注意してください。

    + +

    DefaultLanguage + ディレクティブが有効でなく、ファイルに + AddLanguage + で設定された言語の拡張子がないときは、 + ファイルには言語属性がないとみなされます。

    + +

    例

    + DefaultLanguage en +

    + +

    参照

    + +
    +
    top
    +

    ModMimeUsePathInfo ディレクティブ

    + + + + + + + + +
    説明:path_info コンポーネントをファイル名の一部として扱うように +mod_mime に通知する
    構文:ModMimeUsePathInfo On|Off
    デフォルト:ModMimeUsePathInfo Off
    コンテキスト:ディレクトリ
    ステータス:Base
    モジュール:mod_mime
    互換性:Apache 2.0.41 以降
    +

    ModMimeUsePathInfo ディレクティブは、 + mod_mime の持つディレクティブを + リクエストに適用させるために、ファイル名と path_info URL + コンポーネントを結合させるために使用します。 + デフォルトでは「 Off 」で、path_info + コンポーネントは無視されます。

    + +

    このディレクティブは、バーチャルファイルシステムを使用している際に + 推奨されるディレクティブです。

    + +

    例

    + ModMimeUsePathInfo On +

    + +

    /bar が存在して (foo.shtml は存在しない) + ModMimeUsePathInfo が On であるとして、 + /bar/foo.shtml に対するリクエストを発行した場合、 + mod_mime は入ってきたリクエストを + /bar/foo.shtml として扱い、 + AddOutputFileter INCLUDES .shtml のようなディレクティブは + INCLUDES フィルタをリクエストに付加させます。 + ModMimeUsePathInfo が設定されなければ、 + INCLUDES フィルタは付加されません。

    + +

    参照

    + +
    +
    top
    +

    MultiviewsMatch ディレクティブ

    + + + + + + + + + +
    説明:MultiViews でのマッチングの検索に含ませる +ファイルのタイプを指定する
    構文:MultiviewsMatch Any|NegotiatedOnly|Filters|Handlers +[Handlers|Filters]
    デフォルト:MultiviewsMatch NegotiatedOnly
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:FileInfo
    ステータス:Base
    モジュール:mod_mime
    互換性:2.0.26 以降で使用可能
    +

    MultiviewsMatch を使用することで、 + mod_negotiation の + Multiviews に 3 種類の異なる挙動をさせることができます。 + Multiviews を使用すると、ファイル (例 index.html) + に対するリクエストに対して、ネゴシエーションする拡張子がベースに付いたもの + (index.html.en, index.html.fr や + index.html.gz) + をマッチさせることができます。

    + +

    NegotiatedOnly オプションでは、ベース名に続く拡張子全てが + コンテントネゴシエーションで mod_mime + が認識する拡張子 (例 文字セット、コンテントタイプ、言語やエンコーディング) + に関連付けられていなければなりません。これは副作用の最も少ない + 最も的確な実装で、デフォルトになっています。

    + +

    ハンドラとフィルタの両方もしくは片方と関連付けられた拡張子を含めるには、 + MultiviewsMatch ディレクティブに Handlers, + Filters またはその両方のオプションをセットします。 + もし他の条件が同じであれば、最も小さいファイルが送信されます。 + 例えば、500 文字の index.html.cgi と 1000 バイトの + index.html.pl であれば、.cgi + のファイルが優先されます。.asis ファイルを利用しているユーザは、 + .asis ファイルが asis-handler に関連付けられているときには、 + ハンドラオプションの使用を好むでしょう。

    + +

    最後に、mod_mime が認識しない拡張子であろうとも、 + どんな拡張子でもマッチさせる Any が使用できます。 + この挙動は Apache 1.3 のときと同じもので、予期しない動作、例えば .old や + .bak ファイルといったウェブマスタが送信を意図していない + ファイルを送信する、といった動作を行なう可能性があります。

    + +

    例えば次の設定では、ハンドラやフィルタが Multiviews に参加することが + できますし、未知のファイルは除外することができます。

    + +

    + MultiviewsMatch Handlers Filters +

    + + +

    参照

    + +
    +
    top
    +

    RemoveCharset ディレクティブ

    + + + + + + + + +
    説明:ファイルの拡張子に関連付けられたすべての文字セット +を解除する
    構文:RemoveCharset extension [extension] +...
    コンテキスト:バーチャルホスト, ディレクトリ, .htaccess
    上書き:FileInfo
    ステータス:Base
    モジュール:mod_mime
    互換性:2.0.24 以降で使用可能
    +

    RemoveCharset ディレクティブ + は与えられた拡張子に関連付けられた文字セットを取り消します。 + これにより、サブディレクトリにある .htaccess + ファイルが親ディレクトリやサーバの設定ファイル + から継承した関連付けを取り消すことができます。例えば:

    + +

    extension は大文字小文字を区別しません。 + また、最初のドットはあってもなくても構いません。

    + +

    例

    + RemoveCharset .html .shtml +

    + +
    +
    top
    +

    RemoveEncoding ディレクティブ

    + + + + + + + +
    説明:ファイルの拡張子に関連付けられたすべてのコンテントエンコーディング +を解除する
    構文:RemoveEncoding extension [extension] +...
    コンテキスト:バーチャルホスト, ディレクトリ, .htaccess
    上書き:FileInfo
    ステータス:Base
    モジュール:mod_mime
    +

    RemoveEncoding ディレクティブは、 + 与えられた拡張子に関連付けられたエンコーディングを取り消します。 + これにより、サブディレクトリにある .htaccess + ファイルが親ディレクトリやサーバの設定ファイルから継承した関連付けを + 取り消すことができます。

    + +

    /foo/.htaccess:

    + AddEncoding x-gzip .gz
    + AddType text/plain .asc
    + <Files *.gz.asc>
    + + RemoveEncoding .gz
    +
    + </Files> +

    + +

    これは、foo.gz は gzip + でエンコードされていることを指定しますが、foo.gz.asc + はエンコードされていないプレーンテキストの + ファイルであるということを指定します。

    + +

    注意

    +

    RemoveEncoding は + AddEncoding + ディレクティブの後で処理されますので、 + 同じディレクトリの設定中に両方が現れると、 + 後者の効果が打ち消される可能性があります。

    +
    + +

    extension は大文字小文字を区別しません。 + また、最初のドットはあってもなくても構いません。

    + +
    +
    top
    +

    RemoveHandler ディレクティブ

    + + + + + + + +
    説明:ファイルの拡張子に関連付けられたすべてのハンドラを +解除する
    構文:RemoveHandler extension [extension] +...
    コンテキスト:バーチャルホスト, ディレクトリ, .htaccess
    上書き:FileInfo
    ステータス:Base
    モジュール:mod_mime
    +

    RemoveHandler ディレクティブ + は与えられた拡張子に関連付けられたハンドラを取り消します。 + これにより、サブディレクトリにある .htaccess + ファイルが親ディレクトリやサーバの設定ファイル + から継承した関連付けを取り消すことができます。たとえば:

    + +

    /foo/.htaccess:

    + AddHandler server-parsed .html +

    + +

    /foo/bar/.htaccess:

    + RemoveHandler .html +

    + +

    これは、/foo/bar ディレクトリの .html + ファイルは SSI (mod_include モジュール参照) ではなく、 + 普通のファイルとして扱われるようにする効果があります。 +

    + +

    extension は大文字小文字を区別しません。 + また、最初のドットはあってもなくても構いません。

    + +
    +
    top
    +

    RemoveInputFilter ディレクティブ

    + + + + + + + + +
    説明:ファイル拡張子に関連付けられた入力フィルタを解除する
    構文:RemoveInputFilter extension [extension] +...
    コンテキスト:バーチャルホスト, ディレクトリ, .htaccess
    上書き:FileInfo
    ステータス:Base
    モジュール:mod_mime
    互換性:2.0.26 以降で使用可能
    +

    RemoveInputFilter ディレクティブは + 指定されたファイル拡張子に関連付けられた入力フィルタを解除します。 + これを利用することで、親ディレクトリやサーバ設定ファイルから + 継承した関連付けを サブディレクトリ内において + .htaccess ファイルで取り消すことができます。

    + +

    extension 引数は大文字小文字を区別しません。また、 + 最初のドットはあってもなくても構いません。

    + +

    参照

    + +
    +
    top
    +

    RemoveLanguage ディレクティブ

    + + + + + + + + +
    説明:ファイル拡張子に関連付けられた言語を解除する
    構文:RemoveLanguage extension [extension] +...
    コンテキスト:バーチャルホスト, ディレクトリ, .htaccess
    上書き:FileInfo
    ステータス:Base
    モジュール:mod_mime
    互換性:2.0.24 以降で使用可能
    +

    RemoveLanguage ディレクティブは + 指定されたファイル拡張子に関連付けられた言語を解除します。 + これを利用することで、親ディレクトリやサーバ設定ファイルから + 継承した関連付けを サブディレクトリ内において + .htaccess ファイルで取り消すことができます。

    + +

    extension 引数は大文字小文字を区別しません。また、 + 最初のドットはついてもつかなくても構いません。

    + +
    +
    top
    +

    RemoveOutputFilter ディレクティブ

    + + + + + + + + +
    説明:ファイル拡張子に関連付けられた出力フィルタを解除する
    構文:RemoveOutputFilter extension [extension] +...
    コンテキスト:バーチャルホスト, ディレクトリ, .htaccess
    上書き:FileInfo
    ステータス:Base
    モジュール:mod_mime
    互換性:2.0.26 以降でのみ使用可能
    +

    RemoveOutputFilter ディレクティブは + 指定されたファイル拡張子に関連付けられた出力フィルタを解除します。 + これを利用することで、親ディレクトリやサーバ設定ファイルから + 継承した関連付けを サブディレクトリ内において + .htaccess ファイルで取り消すことができます。

    + +

    extension は大文字小文字を区別しません。 + また、最初のドットはあってもなくても構いません。

    + +

    例

    + RemoveOutputFilter shtml +

    + +

    参照

    + +
    +
    top
    +

    RemoveType ディレクティブ

    + + + + + + + +
    説明:ファイルの拡張子と関連付けられたコンテントタイプを +解除する
    構文:RemoveType extension [extension] +...
    コンテキスト:バーチャルホスト, ディレクトリ, .htaccess
    上書き:FileInfo
    ステータス:Base
    モジュール:mod_mime
    +

    RemoveType ディレクティブは与えられた拡張子の + MIME タイプの関連付けを取り消します。これにより、 + サブディレクトリにある .htaccess + ファイルが親ディレクトリやサーバの設定ファイルから継承した + 関連付けを取り消すことができます。たとえば:

    + +

    /foo/.htaccess:

    + RemoveType .cgi +

    + +

    これは /foo/ ディレクトリ以下の .cgi + ファイルの特別な扱いを取り消します。ファイルは DefaultType として扱われます。

    + +

    注意

    +

    RemoveType ディレクティブは + AddType + ディレクティブの後に処理されますので、 + 両方が同じディレクトリの設定中に現れた場合、 + 後者の効果が打ち消される可能性があります。

    +
    + +

    extension は大文字小文字を区別しません。 + また、最初のドットはあってもなくても構いません。

    + +
    +
    top
    +

    TypesConfig ディレクティブ

    + + + + + + + +
    説明:mime.types ファイルの位置
    構文:TypesConfig file-path
    デフォルト:TypesConfig conf/mime.types
    コンテキスト:サーバ設定ファイル
    ステータス:Base
    モジュール:mod_mime
    +

    TypesConfig ディレクティブは、MIME + タイプ設定ファイルの位置を設定します。filename は + ServerRoot からの相対パスです。 + このファイルはファイルの拡張子からコンテントタイプへの + デフォルトのマッピングを設定します。 + ほとんどの管理者は、よく使われるファイル名の拡張子を + IANA に登録されたコンテントタイプに関連付けている、 + Apache の mime.types ファイルを使います。 + 現在の一覧は http://www.isi.edu/in-notes/iana/assignments/media-types/media-types + で管理されています。これは、主要なメディアタイプの定義を提供して、 + 必要ところを AddType で + 上書きする、という方法で httpd.conf を簡略にします。 + mime.types はサーバをアップグレードしたときに + 置き換えられるかもしれないので、そのファイルを直接 + 編集しないでください。

    + +

    ファイルは、AddType + ディレクティブの引数と同じ形式の行で構成されます。

    + +

    + MIME-type [extension] ... +

    + +

    拡張子の大文字小文字は区別されません。空行やハッシュ (`#') + で始まる行は無視されます。

    + +
    + (1) IANA に既に登録されている、あるいは (2) + 広く受け入れられていてプラットホーム間でファイル拡張子に衝突がない、 + という場合でなければ、配布中の mime.types + ファイルに新たなものを登録するように + Apache HTTP Server Project にリクエストしないでください。 + category/x-subtype のリクエストは自動的に却下されますし、 + 言語や文字セットの名前空間で既に使用されていて、衝突の可能性のある + 2 文字の拡張子も却下されます。 +
    + +

    参照

    + +
    +
    +
    +

    Available Languages:  en  | + ja 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_mime_magic.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_mime_magic.html new file mode 100644 index 00000000..fd1bb722 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_mime_magic.html @@ -0,0 +1,5 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_mime_magic.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_mime_magic.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_mime_magic.html.en new file mode 100644 index 00000000..b3e73350 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_mime_magic.html.en @@ -0,0 +1,274 @@ + + + +mod_mime_magic - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_mime_magic

    +
    +

    Available Languages:  en 

    +
    + + + +
    Description:Determines the MIME type of a file + by looking at a few bytes of its contents
    Status:Extension
    Module Identifier:mime_magic_module
    Source File:mod_mime_magic.c
    +

    Summary

    + +

    This module determines the MIME type of files in the same + way the Unix file(1) command works: it looks at the first + few bytes of the file. It is intended as a "second line of defense" + for cases that mod_mime can't resolve.

    + +

    This module is derived from a free version of the + file(1) command for Unix, which uses "magic + numbers" and other hints from a file's contents to figure out + what the contents are. This module is active only if the magic + file is specified by the MimeMagicFile directive.

    +
    + +
    top
    +
    +

    Format of the Magic File

    + +

    The contents of the file are plain ASCII text in 4-5 + columns. Blank lines are allowed but ignored. Commented lines + use a hash mark (#). The remaining lines are parsed for + the following columns:

    + + + + + + + + + + + + +
    ColumnDescription
    1byte number to begin checking from
    + ">" indicates a dependency upon the previous + non-">" line
    2

    type of data to match

    + + + + + + + + + + + + + + + + + + + + + + + + +
    bytesingle character
    shortmachine-order 16-bit integer
    longmachine-order 32-bit integer
    stringarbitrary-length string
    datelong integer date (seconds since Unix epoch/1970)
    beshortbig-endian 16-bit integer
    belongbig-endian 32-bit integer
    bedatebig-endian 32-bit integer date
    leshortlittle-endian 16-bit integer
    lelonglittle-endian 32-bit integer
    ledatelittle-endian 32-bit integer date
    3contents of data to match
    4MIME type if matched
    5MIME encoding if matched (optional)
    + +

    For example, the following magic file lines would recognize + some audio formats:

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

    Or these would recognize the difference between *.doc + files containing Microsoft Word or FrameMaker documents. (These are + incompatible file formats which use the same file suffix.)

    + +
    # Frame
    +0  string  \<MakerFile        application/x-frame
    +0  string  \<MIFFile          application/x-frame
    +0  string  \<MakerDictionary  application/x-frame
    +0  string  \<MakerScreenFon   application/x-frame
    +0  string  \<MML              application/x-frame
    +0  string  \<Book             application/x-frame
    +0  string  \<Maker            application/x-frame
    +
    +# MS-Word
    +0  string  \376\067\0\043            application/msword
    +0  string  \320\317\021\340\241\261  application/msword
    +0  string  \333\245-\0\0\0           application/msword
    + +

    An optional MIME encoding can be included as a fifth column. + For example, this can recognize gzipped files and set the + encoding for them.

    + +
    # gzip (GNU zip, not to be confused with
    +#       [Info-ZIP/PKWARE] zip archiver)
    +
    +0  string  \037\213  application/octet-stream  x-gzip
    +
    top
    +
    +

    Performance Issues

    +

    This module is not for every system. If your system is barely + keeping up with its load or if you're performing a web server + benchmark, you may not want to enable this because the + processing is not free.

    + +

    However, an effort was made to improve the performance of + the original file(1) code to make it fit in a busy web + server. It was designed for a server where there are thousands of users + who publish their own documents. This is probably very common + on intranets. Many times, it's helpful if the server can make + more intelligent decisions about a file's contents than the + file name allows ...even if just to reduce the "why doesn't my + page work" calls when users improperly name their own files. + You have to decide if the extra work suits your + environment.

    +
    top
    +
    +

    Notes

    +

    The following notes apply to the mod_mime_magic + module and are included here for compliance with contributors' + copyright restrictions that require their acknowledgment.

    + +
    +

    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. + +
    3. 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.
    4. + +
    5. 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.
    6. + +
    7. This notice may not be removed or altered.
    8. +
    +
    + +
    +

    For compliance with Mr Darwin's terms: this has been very + significantly modified from the free "file" command.

    + +
      +
    • all-in-one file for compilation convenience when moving from + one version of Apache to the next.
    • + +
    • Memory allocation is done through the Apache API's pool + structure.
    • + +
    • All functions have had necessary Apache API request or server + structures passed to them where necessary to call other Apache API + routines. (i.e., usually for logging, files, or memory + allocation in itself or a called function.)
    • + +
    • struct magic has been converted from an array to a single-ended + linked list because it only grows one record at a time, it's only + accessed sequentially, and the Apache API has no equivalent of + realloc().
    • + +
    • Functions have been changed to get their parameters from the + server configuration instead of globals. (It should be reentrant + now but has not been tested in a threaded environment.)
    • + +
    • Places where it used to print results to stdout now saves them + in a list where they're used to set the MIME type in the Apache + request record.
    • + +
    • Command-line flags have been removed since they will never be + used here.
    • +
    +
    +
    +
    top
    +

    MimeMagicFile Directive

    + + + + + + +
    Description:Enable MIME-type determination based on file contents +using the specified magic file
    Syntax:MimeMagicFile file-path
    Context:server config, virtual host
    Status:Extension
    Module:mod_mime_magic
    +

    The MimeMagicFile directive can be used to + enable this module, the default file is distributed at + conf/magic. Non-rooted paths are relative to the + ServerRoot. Virtual hosts will use + the same file as the main server unless a more specific setting is + used, in which case the more specific setting overrides the main + server's file.

    + +

    Example

    + MimeMagicFile conf/magic +

    + +
    +
    +
    +

    Available Languages:  en 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_negotiation.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_negotiation.html new file mode 100644 index 00000000..dbedc3d0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_negotiation.html @@ -0,0 +1,9 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_negotiation.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: mod_negotiation.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_negotiation.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_negotiation.html.en new file mode 100644 index 00000000..21ae9a58 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_negotiation.html.en @@ -0,0 +1,306 @@ + + + +mod_negotiation - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_negotiation

    +
    +

    Available Languages:  en  | + ja 

    +
    + + + +
    Description:Provides for content negotiation
    Status:Base
    Module Identifier:negotiation_module
    Source File:mod_negotiation.c
    +

    Summary

    + +

    Content negotiation, or more accurately content selection, is + the selection of the document that best matches the clients + capabilities, from one of several available documents. There + are two implementations of this.

    + +
      +
    • A type map (a file with the handler + type-map) which explicitly lists the files + containing the variants.
    • + +
    • A MultiViews search (enabled by the MultiViews + Options), where the server does + an implicit filename pattern match, and choose from amongst the + results.
    • +
    +
    + +
    top
    +
    +

    Type maps

    +

    A type map has a format similar to RFC822 mail headers. It + contains document descriptions separated by blank lines, with + lines beginning with a hash character ('#') treated as + comments. A document description consists of several header + records; records may be continued on multiple lines if the + continuation lines start with spaces. The leading space will be + deleted and the lines concatenated. A header record consists of + a keyword name, which always ends in a colon, followed by a + value. Whitespace is allowed between the header name and value, + and between the tokens of value. The headers allowed are:

    + +
    +
    Content-Encoding:
    +
    The encoding of the file. Apache only recognizes + encodings that are defined by an AddEncoding directive. + This normally includes the encodings x-compress + for compress'd files, and x-gzip for gzip'd + files. The x- prefix is ignored for encoding + comparisons.
    + +
    Content-Language:
    +
    The language(s) of the variant, as an Internet standard + language tag (RFC 1766). An example is en, + meaning English. If the variant contains more than one + language, they are separated by a comma.
    + +
    Content-Length:
    +
    The length of the file, in bytes. If this header is not + present, then the actual length of the file is used.
    + +
    Content-Type:
    + +
    + The MIME media type of the document, with optional + parameters. Parameters are separated from the media type + and from one another by a semi-colon, with a syntax of + name=value. Common parameters include: + +
    +
    level
    +
    an integer specifying the version of the media type. + For text/html this defaults to 2, otherwise + 0.
    + +
    qs
    +
    a floating-point number with a value in the range 0.0 + to 1.0, indicating 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 ascii art, then an ascii + file would have a higher source quality than a jpeg file. + All qs values are therefore specific to a given + resource.
    +
    + +

    Example

    + Content-Type: image/jpeg; qs=0.8 +

    +
    + +
    URI:
    +
    uri of the file containing the variant (of the given + media type, encoded with the given content encoding). These + are interpreted as URLs relative to the map file; they must + be on the same server (!), and they must refer to files to + which the client would be granted access if they were to be + requested directly.
    + +
    Body:
    +
    New in Apache 2.0, the actual content of the resource may + be included in the type-map file using the Body header. This + header must contain a string that designates a delimiter for + the body content. Then all following lines in the type map + file will be considered part of the resource body until the + delimiter string is found. + +

    Example:

    + Body:----xyz----
    + <html>
    + <body>
    + <p>Content of the page.</p>
    + </body>
    + </html>
    + ----xyz---- +

    +
    +
    +
    top
    +
    +

    MultiViews

    +

    A MultiViews search is enabled by the MultiViews + Options. If the server receives a + request for /some/dir/foo and + /some/dir/foo does not exist, then the + server reads the directory looking for all 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, and returns that document.

    + +

    The MultiViewsMatch + directive configures whether Apache will consider files + that do not have content negotiation meta-information assigned + to them when choosing files.

    +
    +
    top
    +

    CacheNegotiatedDocs Directive

    + + + + + + + + +
    Description:Allows content-negotiated documents to be +cached by proxy servers
    Syntax:CacheNegotiatedDocs On|Off
    Default:CacheNegotiatedDocs Off
    Context:server config, virtual host
    Status:Base
    Module:mod_negotiation
    Compatibility:The syntax changed in version 2.0.
    +

    If set, this directive allows content-negotiated documents + to be cached by proxy servers. This could mean that clients + behind those proxys could retrieve versions of the documents + that are not the best match for their abilities, but it will + make caching more efficient.

    + +

    This directive only applies to requests which come from + HTTP/1.0 browsers. HTTP/1.1 provides much better control over + the caching of negotiated documents, and this directive has no + effect in responses to HTTP/1.1 requests.

    + +

    Prior to version 2.0, + CacheNegotiatedDocs did not take an + argument; it was turned on by the presence of the directive by + itself.

    + +
    +
    top
    +

    ForceLanguagePriority Directive

    + + + + + + + + + +
    Description:Action to take if a single acceptable document is not +found
    Syntax:ForceLanguagePriority None|Prefer|Fallback [Prefer|Fallback]
    Default:ForceLanguagePriority Prefer
    Context:server config, virtual host, directory, .htaccess
    Override:FileInfo
    Status:Base
    Module:mod_negotiation
    Compatibility:Available in version 2.0.30 and later
    +

    The ForceLanguagePriority directive uses + the given LanguagePriority to satisfy + negotation where the server could otherwise not return a single + matching document.

    + +

    ForceLanguagePriority Prefer uses + LanguagePriority to serve a one valid result, rather + than returning an HTTP result 300 (MULTIPLE CHOICES) when there + are several equally valid choices. If the directives below were + given, and the user's Accept-Language header assigned + en and de each as quality .500 + (equally acceptable) then the first matching variant, en, + will be served.

    + +

    + LanguagePriority en fr de
    + ForceLanguagePriority Prefer +

    + +

    ForceLanguagePriority Fallback uses + LanguagePriority to + serve a valid result, rather than returning an HTTP result 406 + (NOT ACCEPTABLE). If the directives below were given, and the user's + Accept-Language only permitted an es + language response, but such a variant isn't found, then the first + variant from the LanguagePriority list below will be served.

    + +

    + LanguagePriority en fr de
    + ForceLanguagePriority Fallback +

    + +

    Both options, Prefer and Fallback, may be + specified, so either the first matching variant from LanguagePriority will be served if + more than one variant is acceptable, or first available document will + be served if none of the variants matched the client's acceptable list + of languages.

    + +

    See also

    + +
    +
    top
    +

    LanguagePriority Directive

    + + + + + + + +
    Description:The precendence of language variants for cases where +the client does not express a preference
    Syntax:LanguagePriority MIME-lang [MIME-lang] +...
    Context:server config, virtual host, directory, .htaccess
    Override:FileInfo
    Status:Base
    Module:mod_negotiation
    +

    The LanguagePriority sets the precedence + of language variants for the case where the client does not + express a preference, when handling a MultiViews request. The list + of MIME-lang are in order of decreasing preference.

    + +

    Example:

    + LanguagePriority en fr de +

    + +

    For a request for foo.html, where + foo.html.fr and foo.html.de both + existed, but the browser did not express a language preference, + then foo.html.fr would be returned.

    + +

    Note that this directive only has an effect if a 'best' + language cannot be determined by any other means or the ForceLanguagePriority directive + is not None. In general, the client determines the + language preference, not the server.

    + +

    See also

    + +
    +
    +
    +

    Available Languages:  en  | + ja 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_negotiation.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_negotiation.html.ja.utf8 new file mode 100644 index 00000000..b49c19dd --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_negotiation.html.ja.utf8 @@ -0,0 +1,302 @@ + + + +mod_negotiation - Apache HTTP サーバ + + + + + + +
    <-
    + +
    +

    Apache モジュール mod_negotiation

    +
    +

    Available Languages:  en  | + ja 

    +
    +
    This translation may be out of date. Check the + English version for recent changes.
    + + + +
    説明:コンテントネゴシエーション + 機能を提供する
    ステータス:Base
    モジュール識別子:negotiation_module
    ソースファイル:mod_negotiation.c
    +

    概要

    + +

    コンテントネゴシエーション、より正確にはコンテンツの選択機能は、 + 複数用意されているドキュメントから、クライアントの能力に一番合った + ドキュメントを選択する機能です。この実装は二つあります。

    + +
      +
    • タイプマップ (type-map + ハンドラで扱われるファイル)。これは variants + を含んでいるファイルを明示的に指定します。
    • + +
    • MultiViews の探索 (MultiViews Option で有効になります)。 + サーバが暗黙の内にファイル名のパターンマッチを行ない、 + その結果から選択します。
    • +
    +
    + +
    top
    +
    +

    タイプマップ

    +

    タイプマップは RFC 822 のメールヘッダに類似した書式です。 + ドキュメントの記述が空行で分離されて書かれていて、ハッシュ文字 + ('#') で始まる行はコメントとして扱われます。 + ドキュメントの説明は複数のヘッダレコードから構成されます。 + レコードは、続きの行が空白で始まっていると複数の行にまたがります。 + 最初の空白が消去されて、前の行とつなげて 1 行として扱われます。 + ヘッダレコードはキーワード名の後に値が続くという形式で、 + キーワード名は常にコロンで終わります。空白はヘッダ名と値の間、 + 値のトークンの間に入れることができます。 + 使用可能なヘッダは以下のとおりです:

    + +
    +
    Content-Encoding:
    +
    ファイルのエンコーディング。Apache は AddEncoding ディレクティブ + で定義されたエンコーディングだけを認識します。通常 compress + されたファイルのための x-compress と gzip + されたファイルのための x-gzip を含みます。 + エンコーディングの比較をするときは、接頭辞 x- + は無視されます。
    + +
    Content-Language:
    +
    インターネット標準の言語タグ + (RFC 1766) + で定義されている言語の種類。例えば、en + は英語を表します。 + 複数の言語が格納される場合はコンマで区切られます。
    + +
    Content-Length:
    +
    ファイルの長さ (バイト数)。 + このヘッダがない場合、ファイルの実際の長さが使用されます。
    + +
    Content-Type:
    +
    ドキュメントの MIME + メディアタイプ、オプショナルなパラメータ付き。パラメータの構文は + name=value + で、メディアタイプや他のパラメータとはセミコロンで分離されます。 + 共通のパラメータは以下のとおり: + +
    +
    level
    +
    メディアタイプのバージョンを示す整数。 + text/html では 2 がデフォルトで、その他の場合は + 0 がデフォルトです。
    + +
    qs
    +
    クライアントの能力に関係なく、variant + を他と比較したときの相対的な「品質」で、0.0 から 1.0 + の範囲の浮動点小数。 + 例えば、写真を表現しようとしているときは普通は JPEG + ファイルの方が ASCII ファイルよりも高い品質になります。 + しかし、リソースが ASCII アートで表現されているときは、ASCII + ファイルの方が JPEG + ファイルよりも高い品質になります。このように、qs + はリソース毎に特有の値を取ります。 +
    +
    + +

    例

    + Content-Type: image/jpeg; qs=0.8 +

    +
    + +
    URI:
    +
    (指定のメディアタイプ、コンテントエンコーディングの) variant の + ファイルの uri. これは、マップファイルからの相対 URL として + 解釈されます。同じサーバに存在しなければならず、クライアントが + 直接リクエストしたときにアクセスを許可されるものでなければなりません。
    + +
    Body:
    +
    Apache 2.0 で新設されたこの Body ヘッダを使って、 + リソースの実際の内容をタイプマップファイルに書くことができます。 + このヘッダは本文の内容の区切りとなる文字列で始まる必要があります。 + タイプマップファイルの続く行は、区切り文字列が見つかるまで、 + リソースの本文になります。 + +

    Example:

    + Body:----xyz----
    + <html>
    + <body>
    + <p>Content of the page.</p>
    + </body>
    + </html>
    + ----xyz---- +

    +
    +
    +
    top
    +
    +

    MultiViews

    +

    MultiViews 探索は、Multiviews Options ディレクティブにより有効になります。 + サーバが /some/dir/foo + へのリクエストを受け取り、/some/dir/foo が存在 + しない場合、サーバはディレクトリを読んで、 + foo.* にあてはまる全てのファイルを探し、 + 事実上それらのファイルをマップするタイプマップを作ります。 + そのとき、メディアタイプとコンテントエンコーディングは、 + そのファイル名を直接指定したときと同じものが割り当てられます。 + それからクライアントの要求に一番合うものを選び、 + そのドキュメントを返します。

    + +

    ファイルを選択する際に、関連するコンテントネゴシエーションの + メタ情報を持たないファイルについて、判定を行うかどうかを + MultiViewsMatch + ディレクティブで設定します。

    +
    +
    top
    +

    CacheNegotiatedDocs ディレクティブ

    + + + + + + + + +
    説明:コンテントネゴシエーションされたドキュメントをプロキシサーバが +キャッシュできるようにする
    構文:CacheNegotiatedDocs On|Off
    デフォルト:CacheNegotiatedDocs Off
    コンテキスト:サーバ設定ファイル, バーチャルホスト
    ステータス:Base
    モジュール:mod_negotiation
    互換性:バージョン 2.0で構文が変わりました
    +

    このディレクティブが設定されていると、コンテントネゴシエーション + をした結果のドキュメントのキャッシュを許可します。 + これは、プロキシの後ろにいるクライアントが能力に一番合った + ドキュメントではなく、 + キャッシュをより効果的にするものを得る可能性があるということです。

    + +

    このディレクティブは HTTP/1.0 ブラウザからのリクエスト + のみに適用されます。HTTP/1.1 は、 + 交渉されたドキュメントのキャッシュに対してずっとよい制御が可能なので、 + このディレクティブは HTTP/1.1 のリクエストには影響しません。

    +

    2.0 より前のバージョンでは、 + CacheNegotiatedDocs は引数を取らず、 + ディレクティブが存在することで on の動作をしていました。

    + +
    +
    top
    +

    ForceLanguagePriority ディレクティブ

    + + + + + + + + + +
    説明:要求に合う単独のドキュメントが見つからなかったときに行なうことを指定 +
    構文:ForceLanguagePriority None|Prefer|Fallback [Prefer|Fallback]
    デフォルト:ForceLanguagePriority Prefer
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:FileInfo
    ステータス:Base
    モジュール:mod_negotiation
    互換性:バージョン 2.0.30 以降で使用可能
    +

    ForceLanguagePriority ディレクティブは + 要求に合うドキュメントを一つだけ返すことができないときに、 + LanguagePriority + ディレクティブを使ってネゴシエーションの結果を返します。

    + +

    ForceLanguagePriority Prefer は、同等の選択肢が + いくつかあるときに、HTTP の 300 (MULTIPLE CHOICES) を返す代わりに、 + LanguagePriority を使って一つだけドキュメントを返すように + します。以下のディレクティブが指定されていて、ユーザの Accept-Language + ヘッダでは en と de の品質が共に + .500 (同じくらい許容) であるときは、 + 最初にマッチする variant の en が送られます。

    + +

    + LanguagePriority en fr de
    + ForceLanguagePriority Prefer +

    + +

    ForceLanguagePriority Fallback では、HTTP 406 + (NOT ACCEPTABLE) を送信する代わりに、 + LanguagePriority + が正しい結果を送ります。 + 以下のディレクティブが指定されていて、ユーザの Accept-Language + が es 言語のみを許可していて、さらにそのような variant がないときには、 + 以下の LanguagePriority + のリストの最初の variant が送れれます。

    + +

    + LanguagePriority en fr de
    + ForceLanguagePriority Fallback +

    + +

    Prefer と Fallback の両方のオプションを + 同時に指定することができます。 + ですから、複数の variant があるときは + LanguagePriority の最初の + variant が送られ、クライアントの許容言語に合う vaiant がないときは + 存在するドキュメントで最初のものが送られる、という様にすることができます。

    + +

    参照

    + +
    +
    top
    +

    LanguagePriority ディレクティブ

    + + + + + + + +
    説明:クライアントが優先度を示さなかったときの言語の variant の優先度を +指定
    構文:LanguagePriority MIME-lang [MIME-lang] +...
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:FileInfo
    ステータス:Base
    モジュール:mod_negotiation
    +

    LanguagePriority は、MultiViews + リクエストを扱うときに、クライアントが優先順位を提供していない場合の + 言語の優先順位を設定します。MIME-lang + のリストが優先度の降順に並びます。

    + +

    Example:

    + LanguagePriority en fr de +

    + +

    foo.html がリクエストされ、foo.html.fr + と foo.html.de が両方存在し、 + ブラウザが言語の優先順位を提供してない場合は + foo.html.fr が返されます。

    + +

    このディレクティブは他の方法で「最善」 + の言語が決定できないときか、ForceLanguagePriority ディレクティブが + None 以外のときにのみ効果があることに注意してください。 + 一般的には、サーバ側ではなくクライアント側で好みの言語を決定します。

    + +

    参照

    + +
    +
    +
    +

    Available Languages:  en  | + ja 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_nw_ssl.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_nw_ssl.html new file mode 100644 index 00000000..c1342c07 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_nw_ssl.html @@ -0,0 +1,5 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_nw_ssl.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_nw_ssl.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_nw_ssl.html.en new file mode 100644 index 00000000..f03f5fbb --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_nw_ssl.html.en @@ -0,0 +1,97 @@ + + + +mod_nw_ssl - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_nw_ssl

    +
    +

    Available Languages:  en 

    +
    + + + + +
    Description:Enable SSL encryption for NetWare
    Status:Base
    Module Identifier:nwssl_module
    Source File:mod_nw_ssl.c
    Compatibility:NetWare only
    +

    Summary

    + +

    This module enables SSL encryption for a specified port. It + takes advantage of the SSL encryption functionality that is + built into the NetWare operating system.

    +
    + + +
    top
    +

    NWSSLTrustedCerts Directive

    + + + + + + +
    Description:List of additional client certificates
    Syntax:NWSSLTrustedCerts filename [filename] ...
    Context:server config
    Status:Base
    Module:mod_nw_ssl
    +

    Specifies a list of client certificate files (DER format) + that are used when creating a proxied SSL connection. Each + client certificate used by a server must be listed separately + in its own .der file.

    + +
    +
    top
    +

    NWSSLUpgradeable Directive

    + + + + + + +
    Description:Allows a connection to be upgraded to an SSL connection upon request
    Syntax:NWSSLUpgradeable [IP-address:]portnumber
    Context:server config
    Status:Base
    Module:mod_nw_ssl
    +

    Allow a connection that was created on the specified address + and/or port to be upgraded to an SSL connection upon request from + the client. The address and/or port must have already be defined + previously with a Listen + directive.

    + +
    +
    top
    +

    SecureListen Directive

    + + + + + + +
    Description:Enables SSL encryption for the specified port
    Syntax:SecureListen [IP-address:]portnumber +Certificate-Name [MUTUAL]
    Context:server config
    Status:Base
    Module:mod_nw_ssl
    +

    Specifies the port and the eDirectory based certificate name + that will be used to enable SSL encryption. An optional third + parameter also enables mutual authentication.

    + +
    +
    +
    +

    Available Languages:  en 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_proxy.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_proxy.html new file mode 100644 index 00000000..b5f65d3f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_proxy.html @@ -0,0 +1,5 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_proxy.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_proxy.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_proxy.html.en new file mode 100644 index 00000000..df18968a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_proxy.html.en @@ -0,0 +1,1016 @@ + + + +mod_proxy - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_proxy

    +
    +

    Available Languages:  en 

    +
    + + + +
    Description:HTTP/1.1 proxy/gateway server
    Status:Extension
    Module Identifier:proxy_module
    Source File:mod_proxy.c
    +

    Summary

    + +

    Warning

    +

    Do not enable proxying with ProxyRequests until you have secured your server. Open proxy servers are dangerous both to your + network and to the Internet at large.

    +
    + +

    This module implements a proxy/gateway for Apache. It implements + proxying capability for FTP, CONNECT (for SSL), + HTTP/0.9, HTTP/1.0, and HTTP/1.1. + The module can be configured to connect to other proxy modules for these + and other protocols.

    + +

    Apache's proxy features are divided into several modules in + addition to mod_proxy: + mod_proxy_http, mod_proxy_ftp + and mod_proxy_connect. Thus, if you want to use + one or more of the particular proxy functions, load + mod_proxy and the appropriate module(s) + into the server (either statically at compile-time or dynamically + via the LoadModule + directive).

    + +

    In addition, extended features are provided by other modules. + Caching is provided by mod_cache and related + modules. The ability to contact remote servers using the SSL/TLS + protocol is provided by the SSLProxy* directives of + mod_ssl. These additional modules will need + to be loaded and configured to take advantage of these features.

    +
    + +
    top
    +
    +

    Forward and Reverse Proxies

    +

    Apache can be configured in both a forward and + reverse proxy mode.

    + +

    An ordinary forward proxy is an intermediate + server that sits between the client and the origin + server. In order to get content from the origin server, + the client sends a request to the proxy naming the origin server + as the target and the proxy then requests the content from the + origin server and returns it to the client. The client must be + specially configured to use the forward proxy to access other + sites.

    + +

    A typical usage of a forward proxy is to provide Internet + access to internal clients that are otherwise restricted by a + firewall. The forward proxy can also use caching (as provided + by mod_cache) to reduce network usage.

    + +

    The forward proxy is activated using the ProxyRequests directive. Because + forward proxys allow clients to access arbitrary sites through + your server and to hide their true origin, it is essential that + you secure your server so that only + authorized clients can access the proxy before activating a + forward proxy.

    + +

    A reverse proxy, by contrast, appears to the + client just like an ordinary web server. No special + configuration on the client is necessary. The client makes + ordinary requests for content in the name-space of the reverse + proxy. The reverse proxy then decides where to send those + requests, and returns the content as if it was itself the + origin.

    + +

    A typical usage of a reverse proxy is to provide Internet + users access to a server that is behind a firewall. Reverse + proxies can also be used to balance load among several back-end + servers, or to provide caching for a slower back-end server. + In addition, reverse proxies can be used simply to bring + several servers into the same URL space.

    + +

    A reverse proxy is activated using the ProxyPass directive or the + [P] flag to the RewriteRule directive. It is + not necessary to turn ProxyRequests on in order to + configure a reverse proxy.

    +
    top
    +
    +

    Basic Examples

    + +

    The examples below are only a very basic idea to help you + get started. Please read the documentation on the individual + directives.

    + +

    In addition, if you wish to have caching enabled, consult + the documentation from mod_cache.

    + +

    Forward Proxy

    + ProxyRequests On
    + ProxyVia On
    +
    + <Proxy *>
    + + Order deny,allow
    + Deny from all
    + Allow from internal.example.com
    +
    + </Proxy> +

    + +

    Reverse Proxy

    + ProxyRequests Off
    +
    + <Proxy *>
    + + Order deny,allow
    + Allow from all
    +
    + </Proxy>
    +
    + ProxyPass /foo http://foo.example.com/bar
    + ProxyPassReverse /foo http://foo.example.com/bar +

    +
    top
    +
    +

    Controlling access to your proxy

    +

    You can control who can access your proxy via the <Proxy> control block as in + the following example:

    + +

    + <Proxy *>
    + + Order Deny,Allow
    + Deny from all
    + Allow from 192.168.0
    +
    + </Proxy> +

    + +

    For more information on access control directives, see + mod_access.

    + +

    Strictly limiting access is essential if you are using a + forward proxy (using the ProxyRequests directive). + Otherwise, your server can be used by any client to access + arbitrary hosts while hiding his or her true identity. This is + dangerous both for your network and for the Internet at large. + When using a reverse proxy (using the ProxyPass directive with + ProxyRequests Off), access control is less + critical because clients can only contact the hosts that you + have specifically configured.

    + +
    top
    +
    +

    FTP Proxy

    + + +

    Why doesn't file type xxx + download via FTP?

    +

    You probably don't have that particular file type defined as + application/octet-stream in your proxy's mime.types + configuration file. A useful line can be

    + +
    application/octet-stream   bin dms lha lzh exe class tgz taz
    + + +

    How can I force an FTP ASCII download of + File xxx?

    +

    In the rare situation where you must download a specific file using the + FTP ASCII transfer method (while the default transfer is in + binary mode), you can override mod_proxy's + default by suffixing the request with ;type=a to force an + ASCII transfer. (FTP Directory listings are always executed in ASCII mode, + however.)

    + + +

    How can I access FTP files outside + of my home directory?

    +

    An FTP URI is interpreted relative to the home directory of the user + who is logging in. Alas, to reach higher directory levels you cannot + use /../, as the dots are interpreted by the browser and not actually + sent to the FTP server. To address this problem, the so called Squid + %2f hack was implemented in the Apache FTP proxy; it is a + solution which is also used by other popular proxy servers like the Squid Proxy Cache. By + prepending /%2f to the path of your request, you can make + such a proxy change the FTP starting directory to / (instead + of the home directory). For example, to retrieve the file + /etc/motd, you would use the URL:

    + +

    + ftp://user@host/%2f/etc/motd +

    + + +

    How can I hide the FTP cleartext password + in my browser's URL line?

    +

    To log in to an FTP server by username and password, Apache uses + different strategies. In absense of a user name and password in the URL + altogether, Apache sends an anonymous login to the FTP server, + i.e.,

    + +

    + user: anonymous
    + password: apache_proxy@ +

    + +

    This works for all popular FTP servers which are configured for + anonymous access.

    + +

    For a personal login with a specific username, you can embed the user + name into the URL, like in:

    + +

    + ftp://username@host/myfile +

    + +

    If the FTP server asks for a password when given this username (which + it should), then Apache will reply with a 401 (Authorization + required) response, which causes the Browser to pop up the + username/password dialog. Upon entering the password, the connection + attempt is retried, and if successful, the requested resource is + presented. The advantage of this procedure is that your browser does not + display the password in cleartext (which it would if you had used

    + +

    + ftp://username:password@host/myfile +

    + +

    in the first place).

    + +

    Note

    +

    The password which is transmitted in such a way is not encrypted on + its way. It travels between your browser and the Apache proxy server in + a base64-encoded cleartext string, and between the Apache proxy and the + FTP server as plaintext. You should therefore think twice before + accessing your FTP server via HTTP (or before accessing your personal + files via FTP at all!) When using unsecure channels, an eavesdropper + might intercept your password on its way.

    +
    + +
    top
    +
    +

    Slow Startup

    +

    If you're using the ProxyBlock directive, hostnames' IP addresses are looked up + and cached during startup for later match test. This may take a few + seconds (or more) depending on the speed with which the hostname lookups + occur.

    +
    top
    +
    +

    Intranet Proxy

    +

    An Apache proxy server situated in an intranet needs to forward + external requests through the company's firewall (for this, configure + the ProxyRemote directive + to forward the respective scheme to the firewall proxy). + However, when it has to + access resources within the intranet, it can bypass the firewall when + accessing hosts. The NoProxy + directive is useful for specifying which hosts belong to the intranet and + should be accessed directly.

    + +

    Users within an intranet tend to omit the local domain name from their + WWW requests, thus requesting "http://somehost/" instead of + http://somehost.example.com/. Some commercial proxy servers + let them get away with this and simply serve the request, implying a + configured local domain. When the ProxyDomain directive is used and the server is configured for proxy service, Apache can return + a redirect response and send the client to the correct, fully qualified, + server address. This is the preferred method since the user's bookmark + files will then contain fully qualified hosts.

    +
    top
    +
    +

    Protocol Adjustments

    +

    For circumstances where you have a application server which doesn't + implement keepalives or HTTP/1.1 properly, there are 2 environment + variables which when set send a HTTP/1.0 with no keepalive. These are set + via the SetEnv directive.

    + +

    These are the force-proxy-request-1.0 and + proxy-nokeepalive notes.

    + +

    + <Location /buggyappserver/>
    + + ProxyPass http://buggyappserver:7001/foo/
    + SetEnv force-proxy-request-1.0 1
    + SetEnv proxy-nokeepalive 1
    +
    + </Location> +

    +
    +
    top
    +

    AllowCONNECT Directive

    + + + + + + + +
    Description:Ports that are allowed to CONNECT through the +proxy
    Syntax:AllowCONNECT port [port] ...
    Default:AllowCONNECT 443 563
    Context:server config, virtual host
    Status:Extension
    Module:mod_proxy
    +

    The AllowCONNECT directive specifies a list + of port numbers to which the proxy CONNECT method may + connect. Today's browsers use this method when a https + connection is requested and proxy tunneling over HTTP is in effect.

    + +

    By default, only the default https port (443) and the + default snews port (563) are enabled. Use the + AllowCONNECT directive to override this default and + allow connections to the listed ports only.

    + +

    Note that you'll need to have mod_proxy_connect present + in the server in order to get the support for the CONNECT at + all.

    + +
    +
    top
    +

    NoProxy Directive

    + + + + + + +
    Description:Hosts, domains, or networks that will be connected to +directly
    Syntax:NoProxy host [host] ...
    Context:server config, virtual host
    Status:Extension
    Module:mod_proxy
    +

    This directive is only useful for Apache proxy servers within + intranets. The NoProxy directive specifies a + list of subnets, IP addresses, hosts and/or domains, separated by + spaces. A request to a host which matches one or more of these is + always served directly, without forwarding to the configured + ProxyRemote proxy server(s).

    + +

    Example

    + ProxyRemote * http://firewall.mycompany.com:81
    + NoProxy .mycompany.com 192.168.112.0/21 +

    + +

    The host arguments to the NoProxy + directive are one of the following type list:

    + +
    + +
    Domain
    +
    +

    A Domain is a partially qualified DNS domain name, preceded + by a period. It represents a list of hosts which logically belong to the + same DNS domain or zone (i.e., the suffixes of the hostnames are + all ending in Domain).

    + +

    Examples

    + .com .apache.org. +

    + +

    To distinguish Domains from Hostnames (both syntactically and semantically; a DNS domain can + have a DNS A record, too!), Domains are always written with a + leading period.

    + +

    Note

    +

    Domain name comparisons are done without regard to the case, and + Domains are always assumed to be anchored in the root of the + DNS tree, therefore two domains .MyDomain.com and + .mydomain.com. (note the trailing period) are considered + equal. Since a domain comparison does not involve a DNS lookup, it is much + more efficient than subnet comparison.

    +
    + + +
    SubNet
    +
    +

    A SubNet is a partially qualified internet address in + numeric (dotted quad) form, optionally followed by a slash and the netmask, + specified as the number of significant bits in the SubNet. It is + used to represent a subnet of hosts which can be reached over a common + network interface. In the absence of the explicit net mask it is assumed + that omitted (or zero valued) trailing digits specify the mask. (In this + case, the netmask can only be multiples of 8 bits wide.) Examples:

    + +
    +
    192.168 or 192.168.0.0
    +
    the subnet 192.168.0.0 with an implied netmask of 16 valid bits + (sometimes used in the netmask form 255.255.0.0)
    +
    192.168.112.0/21
    +
    the subnet 192.168.112.0/21 with a netmask of 21 + valid bits (also used in the form 255.255.248.0)
    +
    + +

    As a degenerate case, a SubNet with 32 valid bits is the + equivalent to an IPAddr, while a SubNet with zero + valid bits (e.g., 0.0.0.0/0) is the same as the constant + _Default_, matching any IP address.

    + + +
    IPAddr
    +
    +

    A IPAddr represents a fully qualified internet address in + numeric (dotted quad) form. Usually, this address represents a host, but + there need not necessarily be a DNS domain name connected with the + address.

    +

    Example

    + 192.168.123.7 +

    + +

    Note

    +

    An IPAddr does not need to be resolved by the DNS system, so + it can result in more effective apache performance.

    +
    + + +
    Hostname
    +
    +

    A Hostname is a fully qualified DNS domain name which can + be resolved to one or more IPAddrs via the + DNS domain name service. It represents a logical host (in contrast to + Domains, see above) and must be resolvable + to at least one IPAddr (or often to a list + of hosts with different IPAddrs).

    + +

    Examples

    + prep.ai.mit.edu
    + www.apache.org +

    + +

    Note

    +

    In many situations, it is more effective to specify an IPAddr in place of a Hostname since a + DNS lookup can be avoided. Name resolution in Apache can take a remarkable + deal of time when the connection to the name server uses a slow PPP + link.

    +

    Hostname comparisons are done without regard to the case, + and Hostnames are always assumed to be anchored in the root + of the DNS tree, therefore two hosts WWW.MyDomain.com + and www.mydomain.com. (note the trailing period) are + considered equal.

    +
    +
    + +

    See also

    + +
    +
    top
    +

    <Proxy> Directive

    + + + + + + +
    Description:Container for directives applied to proxied resources
    Syntax:<Proxy wildcard-url> ...</Proxy>
    Context:server config, virtual host
    Status:Extension
    Module:mod_proxy
    +

    Directives placed in <Proxy> + sections apply only to matching proxied content. Shell-style wildcards are + allowed.

    + +

    For example, the following will allow only hosts in + yournetwork.example.com to access content via your proxy + server:

    + +

    + <Proxy *>
    + + Order Deny,Allow
    + Deny from all
    + Allow from yournetwork.example.com
    +
    + </Proxy> +

    + +

    The following example will process all files in the foo + directory of example.com through the INCLUDES + filter when they are sent through the proxy server:

    + +

    + <Proxy http://example.com/foo/*>
    + + SetOutputFilter INCLUDES
    +
    + </Proxy> +

    + +
    +
    top
    +

    ProxyBadHeader Directive

    + + + + + + + + +
    Description:Determines how to handle bad header lines in a +response
    Syntax:ProxyBadHeader IsError|Ignore|StartBody
    Default:ProxyBadHeader IsError
    Context:server config, virtual host
    Status:Extension
    Module:mod_proxy
    Compatibility:Available in Apache 2.0.44 and later
    +

    The ProxyBadHeader directive determines the + behaviour of mod_proxy if it receives syntactically invalid + header lines (i.e. containing no colon). The following arguments + are possible:

    + +
    +
    IsError
    +
    Abort the request and end up with a 502 (Bad Gateway) response. This is + the default behaviour.
    + +
    Ignore
    +
    Treat bad header lines as if they weren't sent.
    + +
    StartBody
    +
    When receiving the first bad header line, finish reading the headers and + treat the remainder as body. This helps to work around buggy backend servers + which forget to insert an empty line between the headers and the body.
    +
    + +
    +
    top
    +

    ProxyBlock Directive

    + + + + + + +
    Description:Words, hosts, or domains that are banned from being +proxied
    Syntax:ProxyBlock *|word|host|domain +[word|host|domain] ...
    Context:server config, virtual host
    Status:Extension
    Module:mod_proxy
    +

    The ProxyBlock directive specifies a list of + words, hosts and/or domains, separated by spaces. HTTP, HTTPS, and + FTP document requests to sites whose names contain matched words, + hosts or domains are blocked by the proxy server. The proxy + module will also attempt to determine IP addresses of list items which + may be hostnames during startup, and cache them for match test as + well. That may slow down the startup time of the server.

    + +

    Example

    + ProxyBlock joes-garage.com some-host.co.uk rocky.wotsamattau.edu +

    + +

    rocky.wotsamattau.edu would also be matched if referenced by + IP address.

    + +

    Note that wotsamattau would also be sufficient to match + wotsamattau.edu.

    + +

    Note also that

    + +

    + ProxyBlock * +

    + +

    blocks connections to all sites.

    + +
    +
    top
    +

    ProxyDomain Directive

    + + + + + + +
    Description:Default domain name for proxied requests
    Syntax:ProxyDomain Domain
    Context:server config, virtual host
    Status:Extension
    Module:mod_proxy
    +

    This directive is only useful for Apache proxy servers within + intranets. The ProxyDomain directive specifies + the default domain which the apache proxy server will belong to. If a + request to a host without a domain name is encountered, a redirection + response to the same host with the configured Domain appended + will be generated.

    + +

    Example

    + ProxyRemote * http://firewall.mycompany.com:81
    + NoProxy .mycompany.com 192.168.112.0/21
    + ProxyDomain .mycompany.com +

    + +
    +
    top
    +

    ProxyErrorOverride Directive

    + + + + + + + + +
    Description:Override error pages for proxied content
    Syntax:ProxyErrorOverride On|Off
    Default:ProxyErrorOverride Off
    Context:server config, virtual host
    Status:Extension
    Module:mod_proxy
    Compatibility:Available in version 2.0 and later
    +

    This directive is useful for reverse-proxy setups, where you want to + have a common look and feel on the error pages seen by the end user. + This also allows for included files (via mod_include's SSI) to get + the error code and act accordingly (default behavior would display + the error page of the proxied server, turning this on shows the SSI + Error message).

    + +
    +
    top
    +

    ProxyFtpDirCharset Directive

    + + + + + + + + +
    Description:Define the character set for proxied FTP listings
    Syntax:ProxyFtpDirCharset character set
    Default:ProxyFtpDirCharset ISO-8859-1
    Context:server config, virtual host, directory
    Status:Extension
    Module:mod_proxy
    Compatibility:Available in Apache 2.0.62 and later
    +

    The ProxyFtpDirCharset directive defines the + character set to be set for FTP directory listings in HTML generated by + mod_proxy_ftp.

    + +
    +
    top
    +

    ProxyIOBufferSize Directive

    + + + + + + + +
    Description:Determine size of internal data throughput buffer
    Syntax:ProxyIOBufferSize bytes
    Default:ProxyIOBufferSize 8192
    Context:server config, virtual host
    Status:Extension
    Module:mod_proxy
    +

    The ProxyIOBufferSize directive adjusts the size + of the internal buffer, which is used as a scratchpad for the data between + input and output. The size must be less or equal 8192.

    + +

    In almost every case there's no reason to change that value.

    + +
    +
    top
    +

    <ProxyMatch> Directive

    + + + + + + +
    Description:Container for directives applied to regular-expression-matched +proxied resources
    Syntax:<ProxyMatch regex> ...</ProxyMatch>
    Context:server config, virtual host
    Status:Extension
    Module:mod_proxy
    +

    The <ProxyMatch> directive is + identical to the <Proxy> directive, except it matches URLs + using regular expressions.

    + +
    +
    top
    +

    ProxyMaxForwards Directive

    + + + + + + + + +
    Description:Maximium number of proxies that a request can be forwarded +through
    Syntax:ProxyMaxForwards number
    Default:ProxyMaxForwards 10
    Context:server config, virtual host
    Status:Extension
    Module:mod_proxy
    Compatibility:Available in Apache 2.0 and later
    +

    The ProxyMaxForwards directive specifies the + maximum number of proxies through which a request may pass, if there's no + Max-Forwards header supplied with the request. This is + set to prevent infinite proxy loops, or a DoS attack.

    + +

    Example

    + ProxyMaxForwards 15 +

    + +
    +
    top
    +

    ProxyPass Directive

    + + + + + + +
    Description:Maps remote servers into the local server URL-space
    Syntax:ProxyPass [path] !|url
    Context:server config, virtual host, directory
    Status:Extension
    Module:mod_proxy
    +

    This directive allows remote servers to be mapped into the space of + the local server; the local server does not act as a proxy in the + conventional sense, but appears to be a mirror of the remote + server. path is the name of a local virtual path; url + is a partial URL for the remote server and cannot include a query + string.

    + +

    Suppose the local server has address http://example.com/; + then

    + +

    + ProxyPass /mirror/foo/ http://backend.example.com/ +

    + +

    will cause a local request for + http://example.com/mirror/foo/bar to be internally converted + into a proxy request to http://backend.example.com/bar.

    + +

    The ! directive is useful in situations where you don't want + to reverse-proxy a subdirectory, e.g.

    + +

    + ProxyPass /mirror/foo/i !
    + ProxyPass /mirror/foo http://backend.example.com +

    + +

    will proxy all requests to /mirror/foo to + backend.example.com except requests made to + /mirror/foo/i.

    + +

    Note

    +

    Order is important. you need to put the exclusions before the + general proxypass directive.

    +
    + +

    When used inside a <Location> section, the first argument is omitted and the local + directory is obtained from the <Location>.

    + +
    The ProxyRequests directive should + usually be set off when using + ProxyPass.
    + +

    If you require a more flexible reverse-proxy configuration, see the + RewriteRule directive with the + [P] flag.

    + +
    +
    top
    +

    ProxyPassReverse Directive

    + + + + + + +
    Description:Adjusts the URL in HTTP response headers sent from a reverse +proxied server
    Syntax:ProxyPassReverse [path] url
    Context:server config, virtual host, directory
    Status:Extension
    Module:mod_proxy
    +

    This directive lets Apache adjust the URL in the Location, + Content-Location and URI headers on HTTP redirect + responses. This is essential when Apache is used as a reverse proxy to avoid + by-passing the reverse proxy because of HTTP redirects on the backend + servers which stay behind the reverse proxy.

    + +

    Only the HTTP response headers specifically mentioned above + will be rewritten. Apache will not rewrite other response + headers, nor will it rewrite URL references inside HTML pages. + This means that if the proxied content contains absolute URL + references, they will by-pass the proxy. A third-party module + that will look inside the HTML and rewrite URL references is Nick + Kew's mod_proxy_html.

    + +

    path is the name of a local virtual path. url is a + partial URL for the remote server - the same way they are used for the + ProxyPass directive.

    + +

    For example, suppose the local server has address + http://example.com/; then

    + +

    + ProxyPass /mirror/foo/ http://backend.example.com/
    + ProxyPassReverse /mirror/foo/ http://backend.example.com/ +

    + +

    will not only cause a local request for the + http://example.com/mirror/foo/bar to be internally converted + into a proxy request to http://backend.example.com/bar + (the functionality ProxyPass provides here). It also takes care + of redirects the server backend.example.com sends: when + http://backend.example.com/bar is redirected by him to + http://backend.example.com/quux Apache adjusts this to + http://example.com/mirror/foo/quux before forwarding the HTTP + redirect response to the client. Note that the hostname used for + constructing the URL is chosen in respect to the setting of the UseCanonicalName directive.

    + +

    Note that this ProxyPassReverse directive can + also be used in conjunction with the proxy pass-through feature + (RewriteRule ... [P]) from mod_rewrite + because its doesn't depend on a corresponding ProxyPass directive.

    + +

    When used inside a <Location> section, the first argument is omitted and the local + directory is obtained from the <Location>.

    + +
    +
    top
    +

    ProxyPreserveHost Directive

    + + + + + + + + +
    Description:Use incoming Host HTTP request header for proxy +request
    Syntax:ProxyPreserveHost On|Off
    Default:ProxyPreserveHost Off
    Context:server config, virtual host
    Status:Extension
    Module:mod_proxy
    Compatibility:Available in Apache 2.0.31 and later.
    +

    When enabled, this option will pass the Host: line from the incoming + request to the proxied host, instead of the hostname specified in the + proxypass line.

    + +

    This option should normally be turned Off. It is mostly + useful in special configurations like proxied mass name-based virtual + hosting, where the original Host header needs to be evaluated by the + backend server.

    + +
    +
    top
    +

    ProxyReceiveBufferSize Directive

    + + + + + + + +
    Description:Network buffer size for proxied HTTP and FTP +connections
    Syntax:ProxyReceiveBufferSize bytes
    Default:ProxyReceiveBufferSize 0
    Context:server config, virtual host
    Status:Extension
    Module:mod_proxy
    +

    The ProxyReceiveBufferSize directive specifies an + explicit (TCP/IP) network buffer size for proxied HTTP and FTP connections, + for increased throughput. It has to be greater than 512 or set + to 0 to indicate that the system's default buffer size should + be used.

    + +

    Example

    + ProxyReceiveBufferSize 2048 +

    + +
    +
    top
    +

    ProxyRemote Directive

    + + + + + + +
    Description:Remote proxy used to handle certain requests
    Syntax:ProxyRemote match remote-server
    Context:server config, virtual host
    Status:Extension
    Module:mod_proxy
    +

    This defines remote proxies to this proxy. match is either the + name of a URL-scheme that the remote server supports, or a partial URL + for which the remote server should be used, or * to indicate + the server should be contacted for all requests. remote-server is + a partial URL for the remote server. Syntax:

    + +

    + remote-server = + scheme://hostname[:port] +

    + +

    scheme is effectively the protocol that should be used to + communicate with the remote server; only http is supported by + this module.

    + +

    Example

    + ProxyRemote http://goodguys.com/ http://mirrorguys.com:8000
    + ProxyRemote * http://cleversite.com
    + ProxyRemote ftp http://ftpproxy.mydomain.com:8080 +

    + +

    In the last example, the proxy will forward FTP requests, encapsulated + as yet another HTTP proxy request, to another proxy which can handle + them.

    + +

    This option also supports reverse proxy configuration - a backend + webserver can be embedded within a virtualhost URL space even if that + server is hidden by another forward proxy.

    + +
    +
    top
    +

    ProxyRemoteMatch Directive

    + + + + + + +
    Description:Remote proxy used to handle requests matched by regular +expressions
    Syntax:ProxyRemoteMatch regex remote-server
    Context:server config, virtual host
    Status:Extension
    Module:mod_proxy
    +

    The ProxyRemoteMatch is identical to the + ProxyRemote directive, except the + first argument is a regular expression match against the requested URL.

    + +
    +
    top
    +

    ProxyRequests Directive

    + + + + + + + +
    Description:Enables forward (standard) proxy requests
    Syntax:ProxyRequests On|Off
    Default:ProxyRequests Off
    Context:server config, virtual host
    Status:Extension
    Module:mod_proxy
    +

    This allows or prevents Apache from functioning as a forward proxy + server. (Setting ProxyRequests to Off does not disable use of + the ProxyPass directive.)

    + +

    In a typical reverse proxy configuration, this option should be set to + Off.

    + +

    In order to get the functionality of proxying HTTP or FTP sites, you + need also mod_proxy_http or mod_proxy_ftp + (or both) present in the server.

    + +

    Warning

    +

    Do not enable proxying with ProxyRequests until you have secured your server. Open proxy servers are dangerous + both to your network and to the Internet at large.

    +
    + +
    +
    top
    +

    ProxyTimeout Directive

    + + + + + + + + +
    Description:Network timeout for proxied requests
    Syntax:ProxyTimeout seconds
    Default:ProxyTimeout 300
    Context:server config, virtual host
    Status:Extension
    Module:mod_proxy
    Compatibility:Available in Apache 2.0.31 and later
    +

    This directive allows a user to specifiy a timeout on proxy requests. + This is useful when you have a slow/buggy appserver which hangs, and you + would rather just return a timeout and fail gracefully instead of waiting + however long it takes the server to return.

    + +
    +
    top
    +

    ProxyVia Directive

    + + + + + + + +
    Description:Information provided in the Via HTTP response +header for proxied requests
    Syntax:ProxyVia On|Off|Full|Block
    Default:ProxyVia Off
    Context:server config, virtual host
    Status:Extension
    Module:mod_proxy
    +

    This directive controls the use of the Via: HTTP + header by the proxy. Its intended use is to control the flow of of + proxy requests along a chain of proxy servers. See RFC 2616 (HTTP/1.1), section + 14.45 for an explanation of Via: header lines.

    + +
      +
    • If set to Off, which is the default, no special processing + is performed. If a request or reply contains a Via: header, + it is passed through unchanged.
    • + +
    • If set to On, each request and reply will get a + Via: header line added for the current host.
    • + +
    • If set to Full, each generated Via: header + line will additionally have the Apache server version shown as a + Via: comment field.
    • + +
    • If set to Block, every proxy request will have all its + Via: header lines removed. No new Via: header will + be generated.
    • +
    + +
    +
    +
    +

    Available Languages:  en 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_proxy_connect.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_proxy_connect.html new file mode 100644 index 00000000..747c3ca5 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_proxy_connect.html @@ -0,0 +1,5 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_proxy_connect.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_proxy_connect.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_proxy_connect.html.en new file mode 100644 index 00000000..810f1435 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_proxy_connect.html.en @@ -0,0 +1,61 @@ + + + +mod_proxy_connect - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_proxy_connect

    +
    +

    Available Languages:  en 

    +
    + + + +
    Description:mod_proxy extension for +CONNECT request handling
    Status:Extension
    Module Identifier:proxy_connect_module
    Source File:proxy_connect.c
    +

    Summary

    + +

    This module requires the service of mod_proxy. It provides support for the CONNECT + HTTP method. This method is mainly used to tunnel SSL requests + through proxy servers.

    + +

    Thus, in order to get the ability of handling CONNECT + requests, mod_proxy and + mod_proxy_connect have to be present in the server.

    + +

    Warning

    +

    Do not enable proxying until you have secured your server. Open proxy + servers are dangerous both to your network and to the Internet at + large.

    +
    +
    +

    Directives

    +

    This module provides no directives.

    +

    See also

    +
    + +
    +
    +

    Available Languages:  en 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_proxy_ftp.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_proxy_ftp.html new file mode 100644 index 00000000..0cdfe603 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_proxy_ftp.html @@ -0,0 +1,5 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_proxy_ftp.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_proxy_ftp.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_proxy_ftp.html.en new file mode 100644 index 00000000..d431002f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_proxy_ftp.html.en @@ -0,0 +1,59 @@ + + + +mod_proxy_ftp - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_proxy_ftp

    +
    +

    Available Languages:  en 

    +
    + + + +
    Description:FTP support module for +mod_proxy
    Status:Extension
    Module Identifier:proxy_ftp_module
    Source File:proxy_ftp.c
    +

    Summary

    + +

    This module requires the service of mod_proxy. It provides support for the proxying + FTP sites.

    + +

    Thus, in order to get the ability of handling FTP proxy requests, + mod_proxy and mod_proxy_ftp + have to be present in the server.

    + +

    Warning

    +

    Do not enable proxying until you have secured your server. Open proxy + servers are dangerous both to your network and to the Internet at + large.

    +
    +
    +

    Directives

    +

    This module provides no directives.

    +

    See also

    +
    + +
    +
    +

    Available Languages:  en 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_proxy_http.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_proxy_http.html new file mode 100644 index 00000000..156c5d8b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_proxy_http.html @@ -0,0 +1,5 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_proxy_http.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_proxy_http.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_proxy_http.html.en new file mode 100644 index 00000000..e6197fa3 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_proxy_http.html.en @@ -0,0 +1,64 @@ + + + +mod_proxy_http - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_proxy_http

    +
    +

    Available Languages:  en 

    +
    + + + +
    Description:HTTP support module for +mod_proxy
    Status:Extension
    Module Identifier:proxy_http_module
    Source File:proxy_http.c
    +

    Summary

    + +

    This module requires the service of mod_proxy. It provides the features used for + proxying HTTP requests. mod_proxy_http + supports HTTP/0.9, HTTP/1.0 and HTTP/1.1. It does not + provide any caching abilities. If you want to set up a caching + proxy, you might want to use the additional service of the + mod_cache module.

    + +

    Thus, in order to get the ability of handling HTTP proxy requests, + mod_proxy and mod_proxy_http + have to be present in the server.

    + +

    Warning

    +

    Do not enable proxying until you have secured your server. Open proxy + servers are dangerous both to your network and to the Internet at + large.

    +
    +
    +

    Directives

    +

    This module provides no directives.

    +

    See also

    +
    + +
    +
    +

    Available Languages:  en 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_rewrite.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_rewrite.html new file mode 100644 index 00000000..1a7045b6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_rewrite.html @@ -0,0 +1,5 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_rewrite.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_rewrite.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_rewrite.html.en new file mode 100644 index 00000000..328bbf92 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_rewrite.html.en @@ -0,0 +1,1671 @@ + + + +mod_rewrite - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_rewrite

    +
    +

    Available Languages:  en 

    +
    + + + + +
    Description:Provides a rule-based rewriting engine to rewrite requested +URLs on the fly
    Status:Extension
    Module Identifier:rewrite_module
    Source File:mod_rewrite.c
    Compatibility:Available in Apache 1.3 and later
    +

    Summary

    + +

    This module uses a rule-based rewriting engine (based on a + regular-expression parser) to rewrite requested URLs on the + fly. It supports an unlimited number of rules and an + unlimited number of attached rule conditions for each rule, to + provide a really flexible and powerful URL manipulation + mechanism. The URL manipulations can depend on various tests, + of server variables, environment variables, HTTP + headers, or time stamps. Even external database lookups in + various formats can be used to achieve highly granular URL + matching.

    + +

    This module operates on the full URLs (including the + path-info part) both in per-server context + (httpd.conf) and per-directory context + (.htaccess) and can generate query-string + parts on result. The rewritten result can lead to internal + sub-processing, external request redirection or even to an + internal proxy throughput.

    + +

    Further details, discussion, and examples, are provided in the + detailed mod_rewrite documentation.

    +
    + +
    top
    +
    +

    API Phases

    + +

    Apache processes a HTTP request in several phases. + A hook for each of these + phases is provided by the Apache API. mod_rewrite uses two of + these hooks: the URL-to-filename translation hook + (used after the HTTP request has been read, but before any + authorization starts) and the Fixup hook (triggered + after the authorization phases, and after the per-directory + config files (.htaccess) have been read, but + before the content handler is activated).

    + +

    Once a request comes in, and Apache has determined the + appropriate server (or virtual server), the rewrite engine + starts the URL-to-filename translation, + processing the mod_rewrite directives from the + per-server configuration. A few + steps later, when the final data directories are found, the + per-directory configuration directives of mod_rewrite are + triggered in the Fixup phase.

    + +
    top
    +
    +

    Ruleset Processing

    + +

    When mod_rewrite is triggered during these two API phases, it + reads the relevant rulesets from its configuration + structure (which was either created on startup, for + per-server context, or during the directory traversal + for per-directory context). The URL rewriting + engine is started with the appropriate ruleset (one or more + rules together with their conditions), and its operation + is exactly the same for both + configuration contexts. Only the final result processing is + different.

    + +

    The order of rules in the ruleset is important because the + rewrite engine processes them in a particular (not always + obvious) order, as follows: The rewrite engine loops + through the rulesets (each ruleset being made up of RewriteRule directives, with or without + RewriteConds), rule by rule. + When a particular rule is matched, mod_rewrite + also checks the corresponding conditions (RewriteCond + directives). For historical reasons the conditions are given + first, making the control flow a little bit long-winded. See + Figure 1 for more details.

    +

    + [Needs graphics capability to display]
    + Figure 1:The control flow of the rewrite engine through a + rewrite ruleset +

    +

    As above, first the URL is matched against the + Pattern of a rule. If it does not match, mod_rewrite immediately stops processing that rule, + and goes on to the next rule. If the Pattern matches, + mod_rewrite checks for rule conditions. + If none are present, the URL will be replaced with a new string, + constructed from the Substitution string, and mod_rewrite goes on to the next rule.

    +

    If RewriteConds exist, an + inner loop is started, processing them in the order that they are + listed. Conditions are not matched against the current URL directly. + A TestString is constructed by expanding variables, + back-references, map lookups, etc., against which the + CondPattern is matched. If the pattern fails to match one + of the conditions, the complete set of rule and associated conditions + fails. If the pattern matches a given condition, then matching continues + to the next condition, until no more conditions are + available. If all conditions match, processing is continued + with the substitution of the Substitution string for the URL.

    + +
    top
    +
    +

    Regex Back-Reference Availability

    + +

    Using parentheses in Pattern or in one of the + CondPatterns causes back-references to be internally + created. + These can later be referenced using the strings $N and + %N (see below), for creating + the Substitution and TestString strings. + Figure 2 attempts to show how the back-references are + transferred through the process for later expansion.

    + +

    + [Needs graphics capability to display]
    + Figure 2: The back-reference flow through a rule. +

    +
    top
    +
    +

    Quoting Special Characters

    + +

    As of Apache 1.3.20, special characters in + TestString and Substitution strings can be + escaped (that is, treated as normal characters without their + usual special meaning) by prefixing them with a backslash ('\') + character. In other words, you can include an actual + dollar-sign character in a Substitution string by + using '\$'; this keeps mod_rewrite from trying + to treat it as a backreference.

    +
    top
    +
    +

    Environment Variables

    + +

    This module keeps track of two additional (non-standard) + CGI/SSI environment variables named SCRIPT_URL + and SCRIPT_URI. These contain the + logical Web-view to the current resource, while the + standard CGI/SSI variables SCRIPT_NAME and + SCRIPT_FILENAME contain the physical + System-view.

    + +

    Notice: These variables hold the URI/URL as they were + initially requested, that is, before any + rewriting. This is important to note because the rewriting process is + primarily used to rewrite logical URLs to physical + pathnames.

    + +

    Example

    +SCRIPT_NAME=/sw/lib/w3s/tree/global/u/rse/.www/index.html
    +SCRIPT_FILENAME=/u/rse/.www/index.html
    +SCRIPT_URL=/u/rse/
    +SCRIPT_URI=http://en1.engelschall.com/u/rse/
    +
    + +
    top
    +
    +

    Practical Solutions

    + +

    For numerous examples of common, and not-so-common, uses for + mod_rewrite, see the Rewrite + Guide, and the Advanced Rewrite + Guide documents.

    + +
    +
    top
    +

    RewriteBase Directive

    + + + + + + + + +
    Description:Sets the base URL for per-directory rewrites
    Syntax:RewriteBase URL-path
    Default:See usage for information.
    Context:directory, .htaccess
    Override:FileInfo
    Status:Extension
    Module:mod_rewrite
    +

    The RewriteBase directive explicitly + sets the base URL for per-directory rewrites. As you will see + below, RewriteRule + can be used in per-directory config files + (.htaccess). In such a case, it will act locally, + stripping the local directory prefix before processing, and applying + rewrite rules only to the remainder. When processing is complete, the + prefix is automatically added back to the + path. The default setting is; RewriteBase physical-directory-path

    + +

    When a substitution occurs for a new URL, this module has + to re-inject the URL into the server processing. To be able + to do this it needs to know what the corresponding URL-prefix + or URL-base is. By default this prefix is the corresponding + filepath itself. However, for most websites, URLs are NOT + directly related to physical filename paths, so this + assumption will often be wrong! Therefore, you can + use the RewriteBase directive to specify the + correct URL-prefix.

    + +
    If your webserver's URLs are not directly +related to physical file paths, you will need to use +RewriteBase in every .htaccess +file where you want to use RewriteRule directives. +
    + +

    For example, assume the following per-directory config file:

    + +
    +#
    +#  /abc/def/.htaccess -- per-dir config file for directory /abc/def
    +#  Remember: /abc/def is the physical path of /xyz, i.e., the server
    +#            has a 'Alias /xyz /abc/def' directive e.g.
    +#
    +
    +RewriteEngine On
    +
    +#  let the server know that we were reached via /xyz and not
    +#  via the physical path prefix /abc/def
    +RewriteBase   /xyz
    +
    +#  now the rewriting rules
    +RewriteRule   ^oldstuff\.html$  newstuff.html
    +
    + +

    In the above example, a request to + /xyz/oldstuff.html gets correctly rewritten to + the physical file /abc/def/newstuff.html.

    + +

    For Apache Hackers

    +

    The following list gives detailed information about + the internal processing steps:

    +
    +Request:
    +  /xyz/oldstuff.html
    +
    +Internal Processing:
    +  /xyz/oldstuff.html     -> /abc/def/oldstuff.html  (per-server Alias)
    +  /abc/def/oldstuff.html -> /abc/def/newstuff.html  (per-dir    RewriteRule)
    +  /abc/def/newstuff.html -> /xyz/newstuff.html      (per-dir    RewriteBase)
    +  /xyz/newstuff.html     -> /abc/def/newstuff.html  (per-server Alias)
    +
    +Result:
    +  /abc/def/newstuff.html
    +
    +

    This seems very complicated, but is in fact + correct Apache internal processing. Because the + per-directory rewriting comes late in the + process, the rewritten request + has to be re-injected into the Apache kernel, as if it + were a new request. (See mod_rewrite technical + details.) + This is not the serious overhead it may seem to be - + this re-injection is completely internal to the + Apache server (and the same procedure is used by + many other operations within Apache).

    +
    + + +
    +
    top
    +

    RewriteCond Directive

    + + + + + + + +
    Description:Defines a condition under which rewriting will take place +
    Syntax: RewriteCond + TestString CondPattern
    Context:server config, virtual host, directory, .htaccess
    Override:FileInfo
    Status:Extension
    Module:mod_rewrite
    +

    The RewriteCond directive defines a + rule condition. One or more RewriteCond + can precede a RewriteRule + directive. The following rule is then only used if both + the current state of the URI matches its pattern, and if these conditions are met.

    + +

    TestString is a string which can contain the + following expanded constructs in addition to plain text:

    + +
      +
    • + RewriteRule backreferences: These are + backreferences of the form $N + (0 <= N <= 9), which provide access to the grouped + parts (in parentheses) of the pattern, from the + RewriteRule which is subject to the current + set of RewriteCond conditions.. +
    • +
    • + RewriteCond backreferences: These are + backreferences of the form %N + (1 <= N <= 9), which provide access to the grouped + parts (again, in parentheses) of the pattern, from the last matched + RewriteCond in the current set + of conditions. +
    • +
    • + RewriteMap expansions: These are + expansions of the form ${mapname:key|default}. + See the documentation for + RewriteMap for more details. +
    • +
    • + Server-Variables: These are variables of + the form + %{ NAME_OF_VARIABLE + } + where NAME_OF_VARIABLE can be a string taken + from the following list: + + + + + + + + + + + + + + + + + + + + + + + + +
      HTTP headers: connection & request: +
      + HTTP_USER_AGENT
      + HTTP_REFERER
      + HTTP_COOKIE
      + HTTP_FORWARDED
      + HTTP_HOST
      + HTTP_PROXY_CONNECTION
      + HTTP_ACCEPT
      +
      + REMOTE_ADDR
      + REMOTE_HOST
      + REMOTE_PORT
      + REMOTE_USER
      + REMOTE_IDENT
      + REQUEST_METHOD
      + SCRIPT_FILENAME
      + PATH_INFO
      + QUERY_STRING
      + AUTH_TYPE
      +
      +
      server internals: system stuff: specials:
      + DOCUMENT_ROOT
      + SERVER_ADMIN
      + SERVER_NAME
      + SERVER_ADDR
      + SERVER_PORT
      + SERVER_PROTOCOL
      + SERVER_SOFTWARE
      +
      + TIME_YEAR
      + TIME_MON
      + TIME_DAY
      + TIME_HOUR
      + TIME_MIN
      + TIME_SEC
      + TIME_WDAY
      + TIME
      +
      + API_VERSION
      + THE_REQUEST
      + REQUEST_URI
      + REQUEST_FILENAME
      + IS_SUBREQ
      + HTTPS
      +
      + +

      These variables all + correspond to the similarly named HTTP + MIME-headers, C variables of the Apache server or + struct tm fields of the Unix system. + Most are documented elsewhere in the Manual or in + the CGI specification. Those that are special to + mod_rewrite include those below.

      +
      +
      +
      IS_SUBREQ
      + +
      Will contain the text "true" if the request + currently being processed is a sub-request, + "false" otherwise. Sub-requests may be generated + by modules that need to resolve additional files + or URIs in order to complete their tasks.
      + +
      API_VERSION
      + +
      This is the version of the Apache module API + (the internal interface between server and + module) in the current httpd build, as defined in + include/ap_mmn.h. The module API version + corresponds to the version of Apache in use (in + the release version of Apache 1.3.14, for + instance, it is 19990320:10), but is mainly of + interest to module authors.
      + +
      THE_REQUEST
      + +
      The full HTTP request line sent by the + browser to the server (e.g., "GET + /index.html HTTP/1.1"). This does not + include any additional headers sent by the + browser.
      + +
      REQUEST_URI
      + +
      The resource requested in the HTTP request + line. (In the example above, this would be + "/index.html".)
      + +
      REQUEST_FILENAME
      + +
      The full local filesystem path to the file or + script matching the request.
      + +
      HTTPS
      + +
      Will contain the text "on" if the connection is + using SSL/TLS, or "off" otherwise. (This variable + can be safely used regardless of whether or not + mod_ssl is loaded).
      + +
      +
      +
    • +
    + +

    Other things you should be aware of:

    + +
      +
    1. The variables SCRIPT_FILENAME and REQUEST_FILENAME + contain the same value - the value of the + filename field of the internal + request_rec structure of the Apache server. + The first name is the commonly known CGI variable name + while the second is the appropriate counterpart of + REQUEST_URI (which contains the value of the + uri field of request_rec).
    2. + +
    3. + %{ENV:variable}, where variable can be + any environment variable, is also available. + This is looked-up via internal + Apache structures and (if not found there) via + getenv() from the Apache server process.
    4. + +
    5. + %{SSL:variable}, where variable is the + name of an SSL environment + variable, can be used whether or not + mod_ssl is loaded, but will always expand to + the empty string if it is not. Example: + %{SSL:SSL_CIPHER_USEKEYSIZE} may expand to + 128.
    6. + +
    7. + %{HTTP:header}, where header can be + any HTTP MIME-header name, can always be used to obtain the + value of a header sent in the HTTP request. + Example: %{HTTP:Proxy-Connection} is + the value of the HTTP header + ``Proxy-Connection:''.
    8. + +
    9. + %{LA-U:variable} can be used for look-aheads which perform + an internal (URL-based) sub-request to determine the final + value of variable. This can be used to access + variable for rewriting which is not available at the current + stage, but will be set in a later phase. +

      For instance, to rewrite according to the + REMOTE_USER variable from within the + per-server context (httpd.conf file) you must + use %{LA-U:REMOTE_USER} - this + variable is set by the authorization phases, which come + after the URL translation phase (during which mod_rewrite + operates).

      +

      On the other hand, because mod_rewrite implements + its per-directory context (.htaccess file) via + the Fixup phase of the API and because the authorization + phases come before this phase, you just can use + %{REMOTE_USER} in that context.

    10. + +
    11. + %{LA-F:variable} can be used to perform an internal + (filename-based) sub-request, to determine the final value + of variable. Most of the time, this is the same as + LA-U above.
    12. +
    + +

    CondPattern is the condition pattern, + a regular expression which is applied to the + current instance of the TestString. + TestString is first evaluated, before being matched against + CondPattern.

    + +

    Remember: CondPattern is a + perl compatible regular expression with some + additions:

    + +
      +
    1. You can prefix the pattern string with a + '!' character (exclamation mark) to specify a + non-matching pattern.
    2. + +
    3. + There are some special variants of CondPatterns. + Instead of real regular expression strings you can also + use one of the following: + +
        + +
      • '<CondPattern' (lexicographically + precedes)
        + Treats the CondPattern as a plain string and + compares it lexicographically to TestString. True if + TestString lexicographically precedes + CondPattern.
      • + +
      • '>CondPattern' (lexicographically + follows)
        + Treats the CondPattern as a plain string and + compares it lexicographically to TestString. True if + TestString lexicographically follows + CondPattern.
      • + +
      • '=CondPattern' (lexicographically + equal)
        + Treats the CondPattern as a plain string and + compares it lexicographically to TestString. True if + TestString is lexicographically equal to + CondPattern (the two strings are exactly + equal, character for character). If CondPattern + is "" (two quotation marks) this + compares TestString to the empty string.
      • + +
      • '-d' (is + directory)
        + Treats the TestString as a pathname and tests + whether or not it exists, and is a directory.
      • + +
      • '-f' (is regular + file)
        + Treats the TestString as a pathname and tests + whether or not it exists, and is a regular file.
      • + +
      • '-s' (is regular file, with + size)
        + Treats the TestString as a pathname and tests + whether or not it exists, and is a regular file with size greater + than zero.
      • + +
      • '-l' (is symbolic + link)
        + Treats the TestString as a pathname and tests + whether or not it exists, and is a symbolic link.
      • + +
      • '-F' (is existing file, via + subrequest)
        + Checks whether or not TestString 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!
      • + +
      • '-U' (is existing URL, via + subrequest)
        + Checks whether or not TestString 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!
      • +
      + +

      Note

      + All of these tests can + also be prefixed by an exclamation mark ('!') to + negate their meaning. +
      +
    4. + +
    5. You can also set special flags for + CondPattern by appending + [flags] + as the third argument to the RewriteCond + directive, where flags is a comma-separated list of any of the + following flags: + +
        +
      • 'nocase|NC' + (no case)
        + This makes the test case-insensitive - differences + between 'A-Z' and 'a-z' are ignored, both in the + expanded TestString and the CondPattern. + This flag is effective only for comparisons between + TestString and CondPattern. It has no + effect on filesystem and subrequest checks.
      • + +
      • + 'ornext|OR' + (or next condition)
        + Use this to combine rule conditions with a local OR + instead of the implicit AND. Typical example: + +
        +RewriteCond %{REMOTE_HOST}  ^host1.*  [OR]
        +RewriteCond %{REMOTE_HOST}  ^host2.*  [OR]
        +RewriteCond %{REMOTE_HOST}  ^host3.*
        +RewriteRule ...some special stuff for any of these hosts...
        +
        + + Without this flag you would have to write the condition/rule + pair three times. +
      • +
      +
    6. +
    + +

    Example:

    + +

    To rewrite the Homepage of a site according to the + ``User-Agent:'' header of the request, you can + use the following:

    + +
    +RewriteCond  %{HTTP_USER_AGENT}  ^Mozilla.*
    +RewriteRule  ^/$                 /homepage.max.html  [L]
    +
    +RewriteCond  %{HTTP_USER_AGENT}  ^Lynx.*
    +RewriteRule  ^/$                 /homepage.min.html  [L]
    +
    +RewriteRule  ^/$                 /homepage.std.html  [L]
    +
    + +

    Explanation: If you use a browser which identifies itself + as 'Mozilla' (including Netscape Navigator, Mozilla etc), then you + get the max homepage (which could include frames, or other special + features). + If you use the Lynx browser (which is terminal-based), then + you get the min homepage (which could be a version designed for + easy, text-only browsing). + If neither of these conditions apply (you use any other browser, + or your browser identifies itself as something non-standard), you get + the std (standard) homepage.

    + + +
    +
    top
    +

    RewriteEngine Directive

    + + + + + + + + +
    Description:Enables or disables runtime rewriting engine
    Syntax:RewriteEngine on|off
    Default:RewriteEngine off
    Context:server config, virtual host, directory, .htaccess
    Override:FileInfo
    Status:Extension
    Module:mod_rewrite
    + +

    The RewriteEngine directive enables or + disables the runtime rewriting engine. If it is set to + off this module does no runtime processing at + all. It does not even update the SCRIPT_URx + environment variables.

    + +

    Use this directive to disable the module instead of + commenting out all the RewriteRule directives!

    + +

    Note that, by default, rewrite configurations are not + inherited. This means that you need to have a + RewriteEngine on directive for each virtual host + in which you wish to use it.

    + +

    RewriteMap directives of the type prg + are not started during server initialization if they're defined in a + context that does not have RewriteEngine set to + on

    + + +
    +
    top
    +

    RewriteLock Directive

    + + + + + + +
    Description:Sets the name of the lock file used for RewriteMap +synchronization
    Syntax:RewriteLock file-path
    Context:server config
    Status:Extension
    Module:mod_rewrite
    +

    This directive sets the filename for a synchronization + lockfile which mod_rewrite needs to communicate with RewriteMap + programs. Set this lockfile to a local path (not on a + NFS-mounted device) when you want to use a rewriting + map-program. It is not required for other types of rewriting + maps.

    + +
    +
    top
    +

    RewriteLog Directive

    + + + + + + +
    Description:Sets the name of the file used for logging rewrite engine +processing
    Syntax:RewriteLog file-path
    Context:server config, virtual host
    Status:Extension
    Module:mod_rewrite
    +

    The RewriteLog directive sets the name + of the file to which the server logs any rewriting actions it + performs. If the name does not begin with a slash + ('/') then it is assumed to be relative to the + Server Root. The directive should occur only once per + server config.

    + +
    To disable the logging of + rewriting actions it is not recommended to set + Filename to /dev/null, because + although the rewriting engine does not then output to a + logfile it still creates the logfile output internally. + This will slow down the server with no advantage + to the administrator! To disable logging either + remove or comment out the RewriteLog + directive or use RewriteLogLevel 0! +
    + +

    Security

    + +See the Apache Security Tips +document for details on how your security could be compromised if the +directory where logfiles are stored is writable by anyone other than +the user that starts the server. +
    + +

    Example

    +RewriteLog "/usr/local/var/apache/logs/rewrite.log" +

    + + +
    +
    top
    +

    RewriteLogLevel Directive

    + + + + + + + +
    Description:Sets the verbosity of the log file used by the rewrite +engine
    Syntax:RewriteLogLevel Level
    Default:RewriteLogLevel 0
    Context:server config, virtual host
    Status:Extension
    Module:mod_rewrite
    +

    The RewriteLogLevel directive sets the + verbosity level of the rewriting logfile. The default level 0 + means no logging, while 9 or more means that practically all + actions are logged.

    + +

    To disable the logging of rewriting actions simply set + Level to 0. This disables all rewrite action + logs.

    + +
    Using a high value for + Level will slow down your Apache server + dramatically! Use the rewriting logfile at a + Level greater than 2 only for debugging! +
    + +

    Example

    +RewriteLogLevel 3 +

    + + +
    +
    top
    +

    RewriteMap Directive

    + + + + + + + +
    Description:Defines a mapping function for key-lookup
    Syntax:RewriteMap MapName MapType:MapSource +
    Context:server config, virtual host
    Status:Extension
    Module:mod_rewrite
    Compatibility:The choice of different dbm types is available in +Apache 2.0.41 and later
    +

    The RewriteMap directive defines a + Rewriting Map which can be used inside rule + substitution strings by the mapping-functions to + insert/substitute fields through a key lookup. The source of + this lookup can be of various types.

    + +

    The MapName is + the name of the map and will be used to specify a + mapping-function for the substitution strings of a rewriting + rule via one of the following constructs:

    + +

    + ${ MapName : + LookupKey }
    + ${ MapName : + LookupKey | DefaultValue + }
    +

    + +

    When such a construct occurs, the map MapName is + consulted and the key LookupKey is looked-up. If the + key is found, the map-function construct is substituted by + SubstValue. If the key is not found then it is + substituted by DefaultValue or by the empty string + if no DefaultValue was specified.

    + +

    For example, you might define a + RewriteMap as:

    + +

    + RewriteMap examplemap txt:/path/to/file/map.txt +

    + +

    You would then be able to use this map in a + RewriteRule as follows:

    + +

    + RewriteRule ^/ex/(.*) ${examplemap:$1} +

    + +

    The following combinations for MapType and + MapSource can be used:

    + +
      +
    • + Standard Plain Text
      + MapType: txt, MapSource: Unix filesystem + path to valid regular file + +

      This is the standard rewriting map feature where the + MapSource is a plain ASCII file containing + either blank lines, comment lines (starting with a '#' + character) or pairs like the following - one per + line.

      + +

      + MatchingKey + SubstValue +

      + +

      Example

      +##
      +##  map.txt -- rewriting map
      +##
      +
      +Ralf.S.Engelschall    rse   # Bastard Operator From Hell
      +Mr.Joe.Average        joe   # Mr. Average
      +
      + +

      +RewriteMap real-to-user txt:/path/to/file/map.txt +

      +
    • + +
    • + Randomized Plain Text
      + MapType: rnd, MapSource: Unix filesystem + path to valid regular file + +

      This is identical to the Standard Plain Text variant + above but with a special post-processing feature: After + looking up a value it is parsed according to contained + ``|'' characters which have the meaning of + ``or''. In other words they indicate a set of + alternatives from which the actual returned value is + chosen randomly. For example, you might use the following map + file and directives to provide a random load balancing between + several back-end server, via a reverse-proxy. Images are sent + to one of the servers in the 'static' pool, while everything + else is sent to one of the 'dynamic' pool.

      +

      Example:

      + +

      Rewrite map file

      +##
      +##  map.txt -- rewriting map
      +##
      +
      +static   www1|www2|www3|www4
      +dynamic  www5|www6
      +
      + +

      Configuration directives

      +RewriteMap servers rnd:/path/to/file/map.txt
      +
      +RewriteRule ^/(.*\.(png|gif|jpg)) http://${servers:static}/$1 +[NC,P,L]
      +RewriteRule ^/(.*) http://${servers:dynamic}/$1 [P,L] +

      +
    • + +
    • + Hash File
      MapType: + dbm[=type], MapSource: Unix filesystem + path to valid regular file + +

      Here the source is a binary format DBM file containing + the same contents as a Plain Text format file, but + in a special representation which is optimized for really + fast lookups. The type can be sdbm, gdbm, ndbm, or + db depending on compile-time + settings. If the type is ommitted, the + compile-time default will be chosen. You can create such a + file with any DBM tool or with the following Perl + script. Be sure to adjust it to create the appropriate + type of DBM. The example creates an NDBM file.

      + +
      +#!/path/to/bin/perl
      +##
      +##  txt2dbm -- convert txt map to dbm format
      +##
      +
      +use NDBM_File;
      +use Fcntl;
      +
      +($txtmap, $dbmmap) = @ARGV;
      +
      +open(TXT, "<$txtmap") or die "Couldn't open $txtmap!\n";
      +tie (%DB, 'NDBM_File', $dbmmap,O_RDWR|O_TRUNC|O_CREAT, 0644)
      +  or die "Couldn't create $dbmmap!\n";
      +
      +while (<TXT>) {
      +  next if (/^\s*#/ or /^\s*$/);
      +  $DB{$1} = $2 if (/^\s*(\S+)\s+(\S+)/);
      +}
      +
      +untie %DB;
      +close(TXT);
      +
      + +

      +$ txt2dbm map.txt map.db +

      +
    • + +
    • + Internal Function
      + MapType: int, MapSource: Internal Apache + function + +

      Here, the source is an internal Apache function. + Currently you cannot create your own, but the following + functions already exist:

      + +
        +
      • toupper:
        + Converts the key to all upper case.
      • + +
      • tolower:
        + Converts the key to all lower case.
      • + +
      • escape:
        + Translates special characters in the key to + hex-encodings.
      • + +
      • unescape:
        + Translates hex-encodings in the key back to + special characters.
      • +
      +
    • + +
    • + External Rewriting Program
      + MapType: prg, MapSource: Unix filesystem + path to valid regular file + +

      Here the source is a program, not a map file. To + create it you can use a language of your choice, but + the result has to be an executable program (either + object-code or a script with the magic cookie trick + '#!/path/to/interpreter' as the first + line).

      + +

      This program is started once, when the Apache server + is started, and then communicates with the rewriting engine + via its stdin and stdout + file-handles. For each map-function lookup it will + receive the key to lookup as a newline-terminated string + on stdin. It then has to give back the + looked-up value as a newline-terminated string on + stdout or the four-character string + ``NULL'' if it fails (i.e., there + is no corresponding value for the given key). A trivial + program which will implement a 1:1 map (i.e., + key == value) could be:

      + +

      External rewriting programs are not started if they're defined in a + context that does not have RewriteEngine set to + on

      . + +
      +#!/usr/bin/perl
      +$| = 1;
      +while (<STDIN>) {
      +    # ...put here any transformations or lookups...
      +    print $_;
      +}
      +
      + +

      But be very careful:

      + +
        +
      1. ``Keep it simple, stupid'' (KISS). + If this program hangs, it will cause Apache to hang + when trying to use the relevant rewrite rule.
      2. + +
      3. A common mistake is to use buffered I/O on + stdout. Avoid this, as it will cause a deadloop! + ``$|=1'' is used above, to prevent this.
      4. + +
      5. The RewriteLock directive can + be used to define a lockfile which mod_rewrite can use to synchronize + communication with the mapping program. By default no such + synchronization takes place.
      6. +
      +
    • +
    +

    The RewriteMap directive can occur more than + once. For each mapping-function use one + RewriteMap directive to declare its rewriting + mapfile. While you cannot declare a map in + per-directory context it is of course possible to + use this map in per-directory context.

    + +

    Note

    For plain text and DBM format files the +looked-up keys are cached in-core until the mtime of the +mapfile changes or the server does a restart. This way you can have +map-functions in rules which are used for every +request. This is no problem, because the external lookup only happens +once! +
    + + +
    +
    top
    +

    RewriteOptions Directive

    + + + + + + + + + +
    Description:Sets some special options for the rewrite engine
    Syntax:RewriteOptions Options
    Default:RewriteOptions MaxRedirects=10
    Context:server config, virtual host, directory, .htaccess
    Override:FileInfo
    Status:Extension
    Module:mod_rewrite
    Compatibility:MaxRedirects is available in Apache 2.0.45 and +later
    + +

    The RewriteOptions directive sets some + special options for the current per-server or per-directory + configuration. The Option strings can be one of the + following:

    + +
    +
    inherit
    +
    This forces the current configuration to inherit the + configuration of the parent. In per-virtual-server context + this means that the maps, conditions and rules of the main + server are inherited. In per-directory context this means + that conditions and rules of the parent directory's + .htaccess configuration are inherited.
    + +
    MaxRedirects=number
    +
    In order to prevent endless loops of internal redirects + issued by per-directory RewriteRules, mod_rewrite aborts + the request after reaching a maximum number of such redirects and + responds with an 500 Internal Server Error. If you really need + more internal redirects than 10 per request, you may increase + the default to the desired value.
    +
    + +
    +
    top
    +

    RewriteRule Directive

    + + + + + + + + +
    Description:Defines rules for the rewriting engine
    Syntax:RewriteRule + Pattern Substitution
    Context:server config, virtual host, directory, .htaccess
    Override:FileInfo
    Status:Extension
    Module:mod_rewrite
    Compatibility:The cookie-flag is available in Apache 2.0.40 and later.
    +

    The RewriteRule directive is the real + rewriting workhorse. The directive can occur more than once, with + each instance defining a single rewrite rule. The + order in which these rules are defined is important - this is the order + in which they will be applied at run-time.

    + +

    Pattern is + a perl compatible regular + expression, which is applied to the current URL. + ``Current'' means the value of the URL when this rule is + applied. This may not be the originally requested URL, + which may already have matched a previous rule, and have + been altered.

    + +

    Some hints on the syntax of regular expressions:

    + +
    +Text:
    +  .           Any single character
    +  [chars]     Character class: Any character of the class ``chars''
    +  [^chars]    Character class: Not a character of the class ``chars''
    +  text1|text2 Alternative: text1 or text2
    +
    +Quantifiers:
    +  ?           0 or 1 occurrences of the preceding text
    +  *           0 or N occurrences of the preceding text (N > 0)
    +  +           1 or N occurrences of the preceding text (N > 1)
    +
    +Grouping:
    +  (text)      Grouping of text
    +              (used either to set the borders of an alternative as above, or
    +              to make backreferences, where the Nth group can
    +              be referred to on the RHS of a RewriteRule as $N)
    +
    +Anchors:
    +  ^           Start-of-line anchor
    +  $           End-of-line anchor
    +
    +Escaping:
    +  \char       escape the given char
    +              (for instance, to specify the chars ".[]()" etc.)
    +
    + +

    For more information about regular expressions, have a look at the + perl regular expression manpage ("perldoc + perlre"). If you are interested in more detailed + information about regular expressions and their variants + (POSIX regex etc.) the following book is dedicated to this topic:

    + +

    + Mastering Regular Expressions, 2nd Edition
    + Jeffrey E.F. Friedl
    + O'Reilly & Associates, Inc. 2002
    + ISBN 0-596-00289-0
    +

    + +

    In mod_rewrite, the NOT character + ('!') is also available as a possible pattern + prefix. This enables you to negate a pattern; to say, for instance: + ``if the current URL does NOT match this + pattern''. This can be used for exceptional cases, where + it is easier to match the negative pattern, or as a last + default rule.

    + +

    Note

    +When using the NOT character to negate a pattern, you cannot include +grouped wildcard parts in that pattern. This is because, when the +pattern does NOT match (ie, the negation matches), there are no +contents for the groups. Thus, if negated patterns are used, you +cannot use $N in the substitution string! +
    + +

    The substitution of a + rewrite rule is the string which is substituted for (or + replaces) the original URL which Pattern + matched. In addition to plain text, it can include

    + +
      +
    1. back-references ($N) to the RewriteRule + pattern
    2. + +
    3. back-references (%N) to the last matched + RewriteCond pattern
    4. + +
    5. server-variables as in rule condition test-strings + (%{VARNAME})
    6. + +
    7. mapping-function calls + (${mapname:key|default})
    8. +
    + +

    Back-references are identifiers of the form + $N + (N=0..9), which will be replaced + by the contents of the Nth group of the + matched Pattern. The server-variables are the same + as for the TestString of a RewriteCond + directive. The mapping-functions come from the + RewriteMap directive and are explained there. + These three types of variables are expanded in the order above.

    + +

    As already mentioned, all rewrite rules are + applied to the Substitution (in the order in which + they are defined + in the config file). The URL is completely + replaced by the Substitution and the + rewriting process continues until all rules have been applied, + or it is explicitly terminated by a + L flag - see below.

    + +

    There is a special substitution string named + '-' which means: NO + substitution! This is useful in providing + rewriting rules which only match + URLs but do not substitute anything for them. It is commonly used + in conjunction with the C (chain) flag, in order + to apply more than one pattern before substitution occurs.

    + +

    Additionally you can set special flags for Substitution by + appending [flags] + as the third argument to the RewriteRule + directive. Flags is a comma-separated list of any of the + following flags:

    + +
      +
    • 'chain|C' + (chained with next rule)
      + This flag chains the current rule with the next rule + (which itself can be chained with the following rule, + and so on). This has the following effect: if a rule + matches, then processing continues as usual - + the flag has no effect. If the rule does + not match, then all following chained + rules are skipped. For instance, it can be used to remove the + ``.www'' part, inside a per-directory rule set, + when you let an external redirect happen (where the + ``.www'' part should not occur!).
    • + +
    • + 'cookie|CO=NAME:VAL:domain[:lifetime[:path]]' + (set cookie)
      + This sets a cookie in the client's browser. The cookie's name + is specified by NAME and the value is + VAL. The domain field is the domain of the + cookie, such as '.apache.org', the optional lifetime + is the lifetime of the cookie in minutes, and the optional + path is the path of the cookie
    • + +
    • + 'env|E=VAR:VAL' + (set environment variable)
      + This forces an environment variable named VAR to + be set to the value VAL, where VAL can + contain regexp backreferences ($N and + %N) which will be expanded. You can use this + flag more than once, to set more than one variable. The + variables can later be dereferenced in many situations, most commonly + from within XSSI (via <!--#echo + var="VAR"-->) or CGI ($ENV{'VAR'}). + You can also dereference the variable in a later RewriteCond pattern, using + %{ENV:VAR}. Use this to strip + information from URLs, while maintaining a record of that information.
    • + +
    • 'forbidden|F' (force URL + to be forbidden)
      + This forces the current URL to be forbidden - it immediately + sends back a HTTP response of 403 (FORBIDDEN). + Use this flag in conjunction with + appropriate RewriteConds to conditionally block some + URLs.
    • + +
    • 'gone|G' (force URL to be + gone)
      + This forces the current URL to be gone - it + immediately sends back a HTTP response of 410 (GONE). Use + this flag to mark pages which no longer exist as gone.
    • + +
    • 'last|L' + (last rule)
      + Stop the rewriting process here and don't apply any more + rewrite rules. This corresponds to the Perl + last command or the break command + in C. Use this flag to prevent the currently + rewritten URL from being rewritten further by following + rules. For example, use it to rewrite the root-path URL + ('/') to a real one, e.g., + '/e/www/'.
    • + +
    • 'next|N' + (next round)
      + Re-run the rewriting process (starting again with the + first rewriting rule). This time, the URL to match is no longer + the original URL, but rather the URL returned by the last rewriting rule. + This corresponds to the Perl next command or + the continue command in C. Use + this flag to restart the rewriting process - + to immediately go to the top of the loop.
      + Be careful not to create an infinite + loop!
    • + +
    • 'nocase|NC' + (no case)
      + This makes the Pattern case-insensitive, + ignoring difference between 'A-Z' and + 'a-z' when Pattern is matched against the current + URL.
    • + +
    • + 'noescape|NE' + (no URI escaping of + output)
      + This flag prevents mod_rewrite from applying the usual URI + escaping rules to the result of a rewrite. Ordinarily, + special characters (such as '%', '$', ';', and so on) + will be escaped into their hexcode equivalents ('%25', + '%24', and '%3B', respectively); this flag prevents this + from happening. This allows percent symbols to appear in + the output, as in +

      + RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE] +

      + + which would turn '/foo/zed' into a safe + request for '/bar?arg=P1=zed'. +
    • + +
    • + 'nosubreq|NS' ( + not for internal + sub-requests)
      + This flag forces the rewrite engine to skip a + rewrite rule if the current request is an internal + sub-request. For instance, sub-requests occur internally + in Apache when mod_include tries to find out + information about possible directory default files + (index.xxx). On sub-requests it is not + always useful, and can even cause errors, if + the complete set of rules are applied. Use this flag to + exclude some rules.
      + To decide whether or not to use this rule: if you + prefix URLs with CGI-scripts, to force them to be + processed by the CGI-script, it's likely that you + will run into problems (or significant overhead) on + sub-requests. In these cases, use this flag. +
    • + +
    • + 'proxy|P' (force + proxy)
      + This flag forces the substitution part to be internally + sent as a proxy request and immediately (rewrite + processing stops here) put through the proxy module. You must make + sure that the substitution string is a valid URI + (typically starting with + http://hostname) which can be + handled by the Apache proxy module. If not, you will get an + error from the proxy module. Use this flag to achieve a + more powerful implementation of the ProxyPass directive, + to map remote content into the namespace of the local + server. + +

      Note: mod_proxy must be enabled in order + to use this flag.

      +
    • + +
    • + 'passthrough|PT' + (pass through to next + handler)
      + This flag forces the rewrite engine to set the + uri field of the internal + request_rec structure to the value of the + filename field. This flag is just a hack to + enable post-processing of the output of + RewriteRule directives, using + Alias, ScriptAlias, + Redirect, and other directives from + various URI-to-filename translators. For example, to rewrite + /abc to /def using + mod_rewrite, and then + /def to /ghi using + mod_alias: +

      + RewriteRule ^/abc(.*) /def$1 [PT]
      + Alias /def /ghi +

      + If you omit the PT flag, + mod_rewrite will rewrite + uri=/abc/... to + filename=/def/... as a full API-compliant + URI-to-filename translator should do. Then + mod_alias will try to do a + URI-to-filename transition, which will fail. + +

      Note: You must use this flag if you want to + mix directives from different modules which allow + URL-to-filename translators. The typical example + is the use of mod_alias and + mod_rewrite.

      +
    • + +
    • 'qsappend|QSA' + (query string + append)
      + This flag forces the rewrite engine to append a query + string part of the substitution string to the existing string, + instead of replacing it. Use this when you want to add more + data to the query string via a rewrite rule.
    • + +
    • 'redirect|R + [=code]' (force redirect)
      + Prefix Substitution with + http://thishost[:thisport]/ (which makes the + new URL a URI) to force a external redirection. If no + code is given, a HTTP response of 302 (MOVED + TEMPORARILY) will be returned. If you want to use other response + codes in the range 300-400, simply specify the appropriate number + or use one of the following symbolic names: + temp (default), permanent, + seeother. Use this for rules to + canonicalize the URL and return it to the client - to + translate ``/~'' into + ``/u/'', or to always append a slash to + /u/user, etc.
      + Note: When you use this flag, make + sure that the substitution field is a valid URL! Otherwise, + you will be redirecting to an invalid location. Remember + that this flag on its own will only prepend + http://thishost[:thisport]/ to the URL, and rewriting + will continue. Usually, you will want to stop rewriting at this point, + and redirect immediately. To stop rewriting, you should add + the 'L' flag. +
    • + +
    • 'skip|S=num' + (skip next rule(s))
      + This flag forces the rewriting engine to skip the next + num rules in sequence, if the current rule + matches. Use this to make pseudo if-then-else constructs: + The last rule of the then-clause becomes + skip=N, where N is the number of rules in the + else-clause. (This is not the same as the + 'chain|C' flag!)
    • + +
    • + 'type|T=MIME-type' + (force MIME type)
      + Force the MIME-type of the target file to be + MIME-type. This can be used to + set up the content-type based on some conditions. + For example, the following snippet allows .php files to + be displayed by mod_php if they are called with + the .phps extension: +

      + RewriteRule ^(.+\.php)s$ $1 [T=application/x-httpd-php-source] +

      +
    • + +
    + +

    Home directory expansion

    +

    When the substitution string begins with a string +resembling "/~user" (via explicit text or backreferences), mod_rewrite performs +home directory expansion independent of the presence or configuration +of mod_userdir.

    + +

    This expansion does not occur when the PT +flag is used on the RewriteRule +directive.

    +
    + +

    Note: Enabling rewrites in per-directory context

    + To enable the rewriting engine + for per-directory configuration files, you need to set + ``RewriteEngine On'' in these files + and ``Options + FollowSymLinks'' must be enabled. If your + administrator has disabled override of + FollowSymLinks for a user's directory, then + you cannot use the rewriting engine. This restriction is + needed for security reasons. +
    + +

    Note: Pattern matching in per-directory context

    + Never forget that Pattern is +applied to a complete URL in per-server configuration +files. However, in per-directory configuration files, the +per-directory prefix (which always is the same for a specific +directory) is automatically removed for the pattern matching +and automatically added after the substitution has been +done. This feature is essential for many sorts of rewriting - +without this, you would always have to match the parent +directory which is not always possible. + +

    There is one exception: If a substitution string + starts with ``http://'', then the directory + prefix will not be added, and an + external redirect or proxy throughput (if flag + P is used) is forced!

    +
    + + +

    Note: Substitution of Absolute URLs

    +

    When you prefix a substitution field with + http://thishost[:thisport], + mod_rewrite will automatically strip that + out. This auto-reduction on URLs with an implicit external redirect + is most useful in combination with + a mapping-function which generates the + hostname part.

    + +

    Remember: An unconditional external + redirect to your own server will not work with the prefix + http://thishost because of this feature. To + achieve such a self-redirect, you have to use the + R-flag.

    +
    + +

    Note: Query String

    +

    The Pattern will not be matched against the query string. + Instead, you must use a RewriteCond with the + %{QUERY_STRING} variable. You can, however, create + URLs in the substitution string, containing a query string + part. Simply use a question mark inside the substitution string, to + indicate that the following text should be re-injected into the + query string. When you want to erase an existing query string, + end the substitution string with just a question mark. To + combine a new query string with an old one, use the + [QSA] flag.

    +
    + +

    Here are all possible substitution combinations and their + meanings:

    + +

    Inside per-server configuration + (httpd.conf)
    + for request ``GET + /somepath/pathinfo'':

    +

    + +
    +Given Rule                                      Resulting Substitution
    +----------------------------------------------  ----------------------------------
    +^/somepath(.*) otherpath$1                      invalid, not supported
    +
    +^/somepath(.*) otherpath$1  [R]                 invalid, not supported
    +
    +^/somepath(.*) otherpath$1  [P]                 invalid, not supported
    +----------------------------------------------  ----------------------------------
    +^/somepath(.*) /otherpath$1                     /otherpath/pathinfo
    +
    +^/somepath(.*) /otherpath$1 [R]                 http://thishost/otherpath/pathinfo
    +                                                via external redirection
    +
    +^/somepath(.*) /otherpath$1 [P]                 doesn't make sense, not supported
    +----------------------------------------------  ----------------------------------
    +^/somepath(.*) http://thishost/otherpath$1      /otherpath/pathinfo
    +
    +^/somepath(.*) http://thishost/otherpath$1 [R]  http://thishost/otherpath/pathinfo
    +                                                via external redirection
    +
    +^/somepath(.*) http://thishost/otherpath$1 [P]  doesn't make sense, not supported
    +----------------------------------------------  ----------------------------------
    +^/somepath(.*) http://otherhost/otherpath$1     http://otherhost/otherpath/pathinfo
    +                                                via external redirection
    +
    +^/somepath(.*) http://otherhost/otherpath$1 [R] http://otherhost/otherpath/pathinfo
    +                                                via external redirection
    +                                                (the [R] flag is redundant)
    +
    +^/somepath(.*) http://otherhost/otherpath$1 [P] http://otherhost/otherpath/pathinfo
    +                                                via internal proxy
    +
    + +

    Inside per-directory configuration for + /somepath
    + (/physical/path/to/somepath/.htacccess, with + RewriteBase /somepath)
    + for request ``GET + /somepath/localpath/pathinfo'':

    +

    + +
    +Given Rule                                      Resulting Substitution
    +----------------------------------------------  ----------------------------------
    +^localpath(.*) otherpath$1                      /somepath/otherpath/pathinfo
    +
    +^localpath(.*) otherpath$1  [R]                 http://thishost/somepath/otherpath/pathinfo
    +                                                via external redirection
    +
    +^localpath(.*) otherpath$1  [P]                 doesn't make sense, not supported
    +----------------------------------------------  ----------------------------------
    +^localpath(.*) /otherpath$1                     /otherpath/pathinfo
    +
    +^localpath(.*) /otherpath$1 [R]                 http://thishost/otherpath/pathinfo
    +                                                via external redirection
    +
    +^localpath(.*) /otherpath$1 [P]                 doesn't make sense, not supported
    +----------------------------------------------  ----------------------------------
    +^localpath(.*) http://thishost/otherpath$1      /otherpath/pathinfo
    +
    +^localpath(.*) http://thishost/otherpath$1 [R]  http://thishost/otherpath/pathinfo
    +                                                via external redirection
    +
    +^localpath(.*) http://thishost/otherpath$1 [P]  doesn't make sense, not supported
    +----------------------------------------------  ----------------------------------
    +^localpath(.*) http://otherhost/otherpath$1     http://otherhost/otherpath/pathinfo
    +                                                via external redirection
    +
    +^localpath(.*) http://otherhost/otherpath$1 [R] http://otherhost/otherpath/pathinfo
    +                                                via external redirection
    +                                                (the [R] flag is redundant)
    +
    +^localpath(.*) http://otherhost/otherpath$1 [P] http://otherhost/otherpath/pathinfo
    +                                                via internal proxy
    +
    + +
    +
    +
    +

    Available Languages:  en 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_setenvif.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_setenvif.html new file mode 100644 index 00000000..4e52a025 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_setenvif.html @@ -0,0 +1,17 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_setenvif.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: mod_setenvif.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: mod_setenvif.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: mod_setenvif.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_setenvif.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_setenvif.html.en new file mode 100644 index 00000000..94502118 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_setenvif.html.en @@ -0,0 +1,291 @@ + + + +mod_setenvif - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_setenvif

    +
    +

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

    +
    + + + +
    Description:Allows the setting of environment variables based +on characteristics of the request
    Status:Base
    Module Identifier:setenvif_module
    Source File:mod_setenvif.c
    +

    Summary

    + + +

    The mod_setenvif module allows you to set + environment variables according to whether different aspects of + the request match regular expressions you specify. These + environment variables can be used by other parts of the server + to make decisions about actions to be taken.

    + +

    The directives are considered in the order they appear in + the configuration files. So more complex sequences can be used, + such as this example, which sets netscape if the + browser is mozilla but not MSIE.

    + +

    + BrowserMatch ^Mozilla netscape
    + BrowserMatch MSIE !netscape
    +

    +
    + + +
    top
    +

    BrowserMatch Directive

    + + + + + + + +
    Description:Sets environment variables conditional on HTTP User-Agent +
    Syntax:BrowserMatch regex [!]env-variable[=value] +[[!]env-variable[=value]] ...
    Context:server config, virtual host, directory, .htaccess
    Override:FileInfo
    Status:Base
    Module:mod_setenvif
    +

    The BrowserMatch is a special cases of the + SetEnvIf directive that + sets environment variables conditional on the + User-Agent HTTP request header. The following two + lines have the same effect:

    +

    + BrowserMatchNoCase Robot is_a_robot
    + SetEnvIfNoCase User-Agent Robot is_a_robot
    +

    + +

    Some additional examples:

    +

    + BrowserMatch ^Mozilla forms jpeg=yes browser=netscape
    + BrowserMatch "^Mozilla/[2-3]" tables agif frames javascript
    + BrowserMatch MSIE !javascript
    +

    + +
    +
    top
    +

    BrowserMatchNoCase Directive

    + + + + + + + + +
    Description:Sets environment variables conditional on User-Agent without +respect to case
    Syntax:BrowserMatchNoCase regex [!]env-variable[=value] + [[!]env-variable[=value]] ...
    Context:server config, virtual host, directory, .htaccess
    Override:FileInfo
    Status:Base
    Module:mod_setenvif
    Compatibility:Apache 1.2 and + above (in Apache 1.2 this directive was found in the + now-obsolete mod_browser module)
    + +

    The BrowserMatchNoCase directive is + semantically identical to the BrowserMatch directive. + However, it provides for case-insensitive matching. For + example:

    +

    + BrowserMatchNoCase mac platform=macintosh
    + BrowserMatchNoCase win platform=windows
    +

    + +

    The BrowserMatch and + BrowserMatchNoCase directives are special cases of + the SetEnvIf and SetEnvIfNoCase + directives. The following two lines have the same effect:

    +

    + BrowserMatchNoCase Robot is_a_robot
    + SetEnvIfNoCase User-Agent Robot is_a_robot
    +

    + +
    +
    top
    +

    SetEnvIf Directive

    + + + + + + + +
    Description:Sets environment variables based on attributes of the request +
    Syntax:SetEnvIf attribute + regex [!]env-variable[=value] + [[!]env-variable[=value]] ...
    Context:server config, virtual host, directory, .htaccess
    Override:FileInfo
    Status:Base
    Module:mod_setenvif
    +

    The SetEnvIf directive defines + environment variables based on attributes of the request. The + attribute specified in the first argument can be one of three + things:

    + +
      +
    1. An HTTP request header field (see RFC2616 + for more information about these); for example: Host, + User-Agent, Referer, and + Accept-Language. A regular expression may be + used to specify a set of request headers.
    2. + +
    3. One of the following aspects of the request: +
        +
      • Remote_Host - the hostname (if available) of + the client making the request
      • + +
      • Remote_Addr - the IP address of the client + making the request
      • + +
      • Server_Addr - the IP address of the server + on which the request was received (only with versions later + than 2.0.43)
      • + +
      • Request_Method - the name of the method + being used (GET, POST, et + cetera)
      • + +
      • Request_Protocol - the name and version of + the protocol with which the request was made (e.g., + "HTTP/0.9", "HTTP/1.1", etc.)
      • + +
      • Request_URI - the resource requested on the HTTP + request line -- generally the portion of the URL + following the scheme and host portion without the query string. See + the RewriteCond + directive of mod_rewrite for extra information on + how to match your query string.
      • +
      +
    4. + +
    5. The name of an environment variable in the list of those +associated with the request. This allows +SetEnvIf directives to test against the result +of prior matches. Only those environment variables defined by earlier +SetEnvIf[NoCase] directives are available for testing in +this manner. 'Earlier' means that they were defined at a broader scope +(such as server-wide) or previously in the current directive's scope. +Environment variables will be considered only if there was no match +among request characteristics and a regular expression was not +used for the attribute.
    6. +
    + +

    The second argument (regex) is a Perl compatible regular expression. +This is similar to a POSIX.2 egrep-style regular expression. +If the regex matches against the attribute, +then the remainder of the arguments are evaluated.

    + +

    The rest of the arguments give the names of variables to set, and +optionally values to which they should be set. These take the form +of

    + +
      +
    1. varname, or
    2. + +
    3. !varname, or
    4. + +
    5. varname=value
    6. +
    + +

    In the first form, the value will be set to "1". The second + will remove the given variable if already defined, and the + third will set the variable to the literal value given by + value. Since version 2.0.51 Apache will + recognize occurrences of $1..$9 within + value and replace them by parenthesized subexpressions + of regex.

    + +

    Example:

    + + SetEnvIf Request_URI "\.gif$" object_is_image=gif
    + SetEnvIf Request_URI "\.jpg$" object_is_image=jpg
    + SetEnvIf Request_URI "\.xbm$" object_is_image=xbm
    + :
    + SetEnvIf Referer www\.mydomain\.com intra_site_referral
    + :
    + SetEnvIf object_is_image xbm XBIT_PROCESSING=1
    + :
    + SetEnvIf ^TS* ^[a-z].* HAVE_TS
    +

    + +

    The first three will set the environment variable + object_is_image if the request was for an image + file, and the fourth sets intra_site_referral if + the referring page was somewhere on the + www.mydomain.com Web site.

    + +

    The last example will set environment variable + HAVE_TS if the request contains any headers that + begin with "TS" whose values begins with any character in the + set [a-z].

    + +

    See also

    + +
    +
    top
    +

    SetEnvIfNoCase Directive

    + + + + + + + + +
    Description:Sets environment variables based on attributes of the request +without respect to case
    Syntax:SetEnvIfNoCase attribute regex + [!]env-variable[=value] + [[!]env-variable[=value]] ...
    Context:server config, virtual host, directory, .htaccess
    Override:FileInfo
    Status:Base
    Module:mod_setenvif
    Compatibility:Apache 1.3 and above
    + +

    The SetEnvIfNoCase is semantically identical to + the SetEnvIf directive, + and differs only in that the regular expression matching is + performed in a case-insensitive manner. For example:

    +

    + SetEnvIfNoCase Host Apache\.Org site=apache +

    + +

    This will cause the site environment variable + to be set to "apache" if the HTTP request header + field Host: was included and contained + Apache.Org, apache.org, or any other + combination.

    + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_setenvif.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_setenvif.html.ja.utf8 new file mode 100644 index 00000000..148f3e2a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_setenvif.html.ja.utf8 @@ -0,0 +1,284 @@ + + + +mod_setenvif - Apache HTTP サーバ + + + + + + +
    <-
    + +
    +

    Apache モジュール mod_setenvif

    +
    +

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

    +
    +
    This translation may be out of date. Check the + English version for recent changes.
    + + + +
    説明:リクエストの特徴に基づいた環境変数の設定を可能にする
    ステータス:Base
    モジュール識別子:setenvif_module
    ソースファイル:mod_setenvif.c
    +

    概要

    + + +

    mod_setenvif + モジュールは、リクエストのある側面が指定された正規表現 + に合うかどうかによって環境変数を設定する機能を提供します。 + これらの環境変数を使用して、サーバの他の部分がどのような動作をするかを + 決定することができます。

    + +

    このモジュールが提供するディレクティブは、 + 設定ファイルに現れる順番に適用されます。 + それを使って、次の例のようにより複雑な設定をすることができます。 + これは、ブラウザが mozilla ではあるけれど、MSIE ではないときに + netscape を設定します。

    +

    + BrowserMatch ^Mozilla netscape
    + BrowserMatch MSIE !netscape
    +

    +
    +

    ディレクティブ

    + +

    参照

    +
    + +
    top
    +

    BrowserMatch ディレクティブ

    + + + + + + + +
    説明:HTTP User-Agent に基づいて環境変数を設定する +
    構文:BrowserMatch regex [!]env-variable[=value] +[[!]env-variable[=value]] ...
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:FileInfo
    ステータス:Base
    モジュール:mod_setenvif
    +

    BrowserMatch は + SetEnvIf ディレクティブの + 特例で、User-Agent HTTP リクエストヘッダに基づいて + 環境変数を設定します。以下の 2 行の効果は同じになります:

    + +

    + BrowserMatchNoCase Robot is_a_robot
    + SetEnvIfNoCase User-Agent Robot is_a_robot
    +

    + +

    その他の例:

    +

    + BrowserMatch ^Mozilla forms jpeg=yes browser=netscape
    + BrowserMatch "^Mozilla/[2-3]" tables agif frames javascript
    + BrowserMatch MSIE !javascript
    +

    + +
    +
    top
    +

    BrowserMatchNoCase ディレクティブ

    + + + + + + + + +
    説明:HTTP User-Agent に基づいて大文字小文字を区別せずに +環境変数を設定する
    構文:BrowserMatchNoCase regex [!]env-variable[=value] + [[!]env-variable[=value]] ...
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:FileInfo
    ステータス:Base
    モジュール:mod_setenvif
    互換性:Apache 1.2 以降 + (Apache 1.2 ではこのディレクティブはもう用いられていない + mod_browser モジュールにありました)
    + +

    BrowserMatchNoCase ディレクティブは + 意味的には BrowserMatch ディレクティブと + 同じです。ただし、このディレクティブは大文字小文字を区別しない + マッチングを行ないます。例えば:

    + +

    + BrowserMatchNoCase mac platform=macintosh
    + BrowserMatchNoCase win platform=windows
    +

    + +

    BrowserMatch ディレクティブと + BrowserMatchNoCase ディレクティブは + SetEnvIf ディレクティブと + SetEnvIfNoCase ディレクティブの + 特例です。以下の 2 行の効果は同じです:

    + +

    + BrowserMatchNoCase Robot is_a_robot
    + SetEnvIfNoCase User-Agent Robot is_a_robot
    +

    + +
    +
    top
    +

    SetEnvIf ディレクティブ

    + + + + + + + +
    説明:リクエストの属性に基づいて環境変数を設定する +
    構文:SetEnvIf attribute + regex [!]env-variable[=value] + [[!]env-variable[=value]] ...
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:FileInfo
    ステータス:Base
    モジュール:mod_setenvif
    +

    SetEnvIf + ディレクティブは、リクエストの属性に基づいて環境変数を定義します。 + 最初の引数で指定できる attribute は以下の三つのどれかです:

    + +
      +
    1. HTTP リクエストヘッダフィールド (詳しい情報は RFC 2616 を + 参照してください)。例えば、Host, + User-Agent, Referer, + Accept-Language です。リクエストヘッダの集合を現すために + 正規表現を使うこともできます。
    2. + +
    3. 以下のリクエストの一部分のどれか: + +
        +
      • Remote_Host - + リクエストを行なっているクライアントのホスト名 (もしあれば)
      • + +
      • Remote_Addr - + リクエストを行なっているクライアントの IP アドレス
      • + +
      • Server_Addr - + リクエストを受け取ったサーバの IP アドレス + (2.0.43 以降のみ)
      • + +
      • Request_Method - + 使用されているメソッド名 (GET, POST + など)
      • + +
      • Request_Protocol - + リクエストが行なわれたプロトコルの名前とバージョン + (例えば、"HTTP/0.9", "HTTP/1.1" など。)
      • + +
      • Request_URI - + URL のスキームとホストの後の部分
      • +
      +
    4. + +
    5. リクエストと関連付けられる環境変数のリスト。これにより +SetEnvIf ディレクティブが以前のマッチの結果を +使うことができるようになります。この方法のテストでは前の部分にある +SetEnvIf[NoCase] の結果のみを使用可能です。「前」とは、 +より広い範囲に対して定義されている (サーバ全体のように) か、現在のディレクティブの +範囲でより前の部分で定義されているか、ということです。 +環境変数である可能性は、リクエストの特性に対するマッチが存在せず、 +attribute に正規表現が使われなかったときにのみ考慮されます。
    6. +
    + +

    二つ目の引数 (regex) は Perl 互換の正規表現です。 +これは POSIX.2 の egrep 形式の正規表現と似ています。regex が +attribute にマッチする場合は、残りの引数が評価されます。

    + +

    残りの引数は設定する変数の名前で、設定される値を指定することもできます。 +これは、

    + +
      +
    1. varname
    2. + +
    3. !varname
    4. + +
    5. varname=value
    6. +
    + +

    のどれかの形式になります。

    + +

    最初の形式では、値は "1" に設定されます。 + 二つ目はもし値が定義されていればそれを取り除きます。 + 三つ目は変数を value の与えられた値に設定します。 + 2.0.51 以降では、value 内に $1..$9 + が存在すればそれを認識し、regex の対応する丸括弧で囲まれた部分で + 置換します。

    + +

    例:

    + + SetEnvIf Request_URI "\.gif$" object_is_image=gif
    + SetEnvIf Request_URI "\.jpg$" object_is_image=jpg
    + SetEnvIf Request_URI "\.xbm$" object_is_image=xbm
    + :
    + SetEnvIf Referer www\.mydomain\.com intra_site_referral
    + :
    + SetEnvIf object_is_image xbm XBIT_PROCESSING=1
    + :
    + SetEnvIf ^TS* ^[a-z].* HAVE_TS
    +

    + +

    初めの三つはリクエストが画像であるときに環境変数 + object_is_image を設定します。四つ目は + 参照元のページがウェブサイト www.mydomain.com にあるときに + intra_site_referral を設定します。

    + +

    最後の例は、リクエストに "TS" で始まり、値が集合 [a-z] のどれかで + 始まるヘッダがあるときに HAVE_TS を設定します。

    + +

    参照

    + +
    +
    top
    +

    SetEnvIfNoCase ディレクティブ

    + + + + + + + + +
    説明:リクエストの属性に基づいて大文字小文字を区別せずに環境変数を設定する
    構文:SetEnvIfNoCase attribute regex + [!]env-variable[=value] + [[!]env-variable[=value]] ...
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:FileInfo
    ステータス:Base
    モジュール:mod_setenvif
    互換性:Apache 1.3 以降
    + +

    SetEnvIfNoCase は意味的には + SetEnvIf ディレクティブと + 同じです。違いは、正規表現のマッチングが大文字小文字を区別しないで + 行なわれることです。例えば:

    + +

    + SetEnvIfNoCase Host Apache\.Org site=apache +

    + +

    これは HTTP リクエストヘッダにフィールド Host: が + あり、その値が Apache.Org や apache.org、 + その他の大文字小文字の組み合わせであったときに site + 環境変数を "apache" に設定します。

    + + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_setenvif.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_setenvif.html.ko.euc-kr new file mode 100644 index 00000000..c01234f0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_setenvif.html.ko.euc-kr @@ -0,0 +1,261 @@ + + + +mod_setenvif - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    ¾ÆÆÄÄ¡ ¸ðµâ mod_setenvif

    +
    +

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

    +
    +
    ÀÌ ¹®¼­´Â ÃÖ½ÅÆÇ ¹ø¿ªÀÌ ¾Æ´Õ´Ï´Ù. + ÃÖ±Ù¿¡ º¯°æµÈ ³»¿ëÀº ¿µ¾î ¹®¼­¸¦ Âü°íÇϼ¼¿ä.
    + + + +
    ¼³¸í:¿äûÀÇ ¼º°Ý¿¡ µû¶ó ȯ°æº¯¼ö ¼³Á¤À» º¯°æÇÑ´Ù
    »óÅÂ:Base
    ¸ðµâ¸í:setenvif_module
    ¼Ò½ºÆÄÀÏ:mod_setenvif.c
    +

    ¿ä¾à

    + + +

    mod_setenvif ¸ðµâÀº ¿äûÀÇ ¼º°ÝÀÌ + Á¤±ÔÇ¥Çö½Ä¿¡ ÇØ´çÇÏ´ÂÁö ¿©ºÎ·Î ȯ°æº¯¼ö¸¦ ¼³Á¤ÇÑ´Ù. ¼­¹öÀÇ + ´Ù¸¥ ºÎºÐÀÌ ÇൿÀ» °áÁ¤ÇÒ¶§ ÀÌ È¯°æº¯¼ö¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù.

    + +

    ¼³Á¤ÆÄÀÏ¿¡ ³ª¿À´Â ¼ø¼­´ë·Î Áö½Ã¾î¸¦ ó¸®ÇÑ´Ù. ±×·¡¼­ + ºê¶ó¿ìÀú°¡ MSIE°¡ ¾Æ´Ï¶ó mozillaÀÎ °æ¿ì netscape¸¦ + ¼³Á¤ÇÏ´Â ¾Æ·¡ ¿¹¿Í °°ÀÌ ¿©·¯ Áö½Ã¾î¸¦ ÇÔ²² »ç¿ëÇÒ ¼ö ÀÖ´Ù.

    + +

    + BrowserMatch ^Mozilla netscape
    + BrowserMatch MSIE !netscape
    +

    +
    + + +
    top
    +

    BrowserMatch Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:HTTP User-Agent¿¡ µû¶ó ȯ°æº¯¼ö¸¦ ¼³Á¤ÇÑ´Ù
    ¹®¹ý:BrowserMatch regex [!]env-variable[=value] +[[!]env-variable[=value]] ...
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®, directory, .htaccess
    Override ¿É¼Ç:FileInfo
    »óÅÂ:Base
    ¸ðµâ:mod_setenvif
    +

    BrowserMatch´Â SetEnvIf Áö½Ã¾îÀÇ Æ¯º°ÇÑ + °æ¿ì·Î, HTTP ¿äû Çì´õ User-Agent¿¡ µû¶ó ȯ°æº¯¼ö¸¦ + ¼³Á¤ÇÑ´Ù. ´ÙÀ½ µÎ ÁÙÀº °°´Ù:

    +

    + BrowserMatchNoCase Robot is_a_robot
    + SetEnvIfNoCase User-Agent Robot is_a_robot
    +

    + +

    Ãß°¡ ¿¹Á¦:

    +

    + BrowserMatch ^Mozilla forms jpeg=yes browser=netscape
    + BrowserMatch "^Mozilla/[2-3]" tables agif frames javascript
    + BrowserMatch MSIE !javascript
    +

    + +
    +
    top
    +

    BrowserMatchNoCase Áö½Ã¾î

    + + + + + + + + +
    ¼³¸í:´ë¼Ò¹®ÀÚ¸¦ ±¸º°ÇÏÁö¾Ê°í User-Agent¿¡ µû¶ó ȯ°æº¯¼ö¸¦ +¼³Á¤ÇÑ´Ù
    ¹®¹ý:BrowserMatchNoCase regex [!]env-variable[=value] + [[!]env-variable[=value]] ...
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®, directory, .htaccess
    Override ¿É¼Ç:FileInfo
    »óÅÂ:Base
    ¸ðµâ:mod_setenvif
    Áö¿ø:¾ÆÆÄÄ¡ 1.2 ÀÌ»ó (¾ÆÆÄÄ¡ 1.2¿¡¼­ ÀÌ Áö½Ã¾î´Â ÇöÀç + ¾ø¾îÁø mod_browser ¸ðµâ¿¡ ÀÖ¾ú´Ù)
    + +

    BrowserMatchNoCase Áö½Ã¾î´Â BrowserMatch Áö½Ã¾î¿Í + ÀÇ¹Ì»ó °°´Ù. ±×·¯³ª ÀÌ Áö½Ã¾î´Â ´ë¼Ò¹®ÀÚ¸¦ ±¸º°ÇÏÁö¾Ê´Â´Ù. + ¿¹¸¦ µé¾î:

    +

    + BrowserMatchNoCase mac platform=macintosh
    + BrowserMatchNoCase win platform=windows
    +

    + +

    BrowserMatch¿Í + BrowserMatchNoCase Áö½Ã¾î´Â + SetEnvIf¿Í + SetEnvIfNoCase + Áö½Ã¾îÀÇ Æ¯º°ÇÑ °æ¿ì´Ù. ´ÙÀ½ ÁÖ ÁÙÀº °°´Ù:

    +

    + BrowserMatchNoCase Robot is_a_robot
    + SetEnvIfNoCase User-Agent Robot is_a_robot
    +

    + +
    +
    top
    +

    SetEnvIf Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:¿äûÀÇ ¼ºÁú¿¡ µû¶ó ȯ°æº¯¼ö¸¦ ¼³Á¤ÇÑ´Ù
    ¹®¹ý:SetEnvIf attribute + regex [!]env-variable[=value] + [[!]env-variable[=value]] ...
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®, directory, .htaccess
    Override ¿É¼Ç:FileInfo
    »óÅÂ:Base
    ¸ðµâ:mod_setenvif
    +

    SetEnvIf Áö½Ã¾î´Â ¿äûÀÇ ¼ºÁú¿¡ + µû¶ó ȯ°æº¯¼ö¸¦ Á¤ÀÇÇÑ´Ù. ù¹ø° ¾Æ±Ô¸ÕÆ® attribute´Â + ´ÙÀ½ ¼¼°¡ÁöÁß Çϳª´Ù:

    + +
      +
    1. HTTP ¿äû Çì´õ (´õ ÀÚ¼¼ÇÑ Á¤º¸´Â RFC2616 + Âü°í); ¿¹¸¦ µé¾î: Host, User-Agent, + Referer, Accept-Language. Á¤±ÔÇ¥Çö½ÄÀ» + »ç¿ëÇÏ¿© ¿©·¯ ¿äû Çì´õ¸¦ ÁöĪÇÒ ¼ö ÀÖ´Ù.
    2. + +
    3. ¿äûÀÇ ´ÙÀ½ ¼ºÁúÁß Çϳª: +
        +
      • Remote_Host - (ÀÖ´Ù¸é) ¿äûÇϴ Ŭ¶óÀ̾ðÆ®ÀÇ + È£½ºÆ®¸í
      • + +
      • Remote_Addr - ¿äûÇϴ Ŭ¶óÀ̾ðÆ®ÀÇ IP ÁÖ¼Ò
      • + +
      • Server_Addr - ¿äûÀ» ¹Þ´Â ¼­¹öÀÇ IP ÁÖ¼Ò + (2.0.43 ¹öÀü ÀÌÈÄ¿¡¸¸)
      • + +
      • Request_Method - »ç¿ëÇÑ ¸Þ½áµå À̸§ + (GET, POST, µîµî)
      • + +
      • Request_Protocol - ¿äûÀÇ ÇÁ·ÎÅäÄÝ À̸§°ú + ¹öÀü (¿¹¸¦ µé¾î, "HTTP/0.9", "HTTP/1.1", µî.)
      • + +
      • Request_URI - HTTP ¿äû¿¡¼­ ¿äûÇÑ ÀÚ¿ø + -- ÀϹÝÀûÀ¸·Î URL¿¡¼­ ÁúÀǹ®ÀÚ¿­À» Á¦¿ÜÇÑ ½ºÅ´(scheme)°ú + È£½ºÆ® ÀÌÈÄ ºÎºÐ
      • +
      +
    4. + +
    5. ¿äû°ú ¿¬°üµÈ ȯ°æº¯¼ö À̸§. ±×·¡¼­ SetEnvIf +Áö½Ã¾î´Â ÀÌÀü Áö½Ã¾îÀÇ °á°ú¸¦ °Ë»çÇÒ ¼ö ÀÖ´Ù. ÀÌÀü¿¡ +SetEnvIf[NoCase] Áö½Ã¾î·Î Á¤ÀÇÇÑ È¯°æº¯¼ö¸¸À» +°Ë»çÇÒ ¼ö ÀÖ´Ù. 'ÀÌÀü'À̶õ (¼­¹öÀü¿ª°ú °°ÀÌ) ´õ ³ÐÀº ¿µ¿ª ȤÀº +Áö½Ã¾îÀÇ ÇöÀç ¿µ¿ª ÀÌÀüÀ» ¶æÇÑ´Ù. ¿äû ¼ºÁúÀÌ ¾Æ´Ï°í Á¤±ÔÇ¥Çö½ÄÀÌ +¾Æ´Ñ attribute´Â ȯ°æº¯¼ö·Î Ãë±ÞÇÑ´Ù.
    6. +
    + +

    µÎ¹ø° ¾Æ±Ô¸ÕÆ®´Â (regex) Perl ȣȯ Á¤±ÔÇ¥Çö½ÄÀÌ´Ù. +ÀÌ´Â POSIX.2 egrepÀÇ Á¤±ÔÇ¥Çö½Ä°ú ºñ½ÁÇÏ´Ù. regex°¡ +attribute¿¡ ´ëÀÀÇÏ¸é ³ª¸ÓÁö ¾Æ±Ô¸ÕÆ®¸¦ ó¸®ÇÑ´Ù.

    + +

    ³ª¸ÓÁö ¾Æ±Ô¸ÕÆ®´Â ¼³Á¤ÇÒ º¯¼ö¸í°ú (¼±ÅÃÀûÀÎ) ¼³Á¤°ªµéÀÌ´Ù. +´ÙÀ½°ú °°Àº Çü½ÄÀÌ´Ù

    + +
      +
    1. varname, ȤÀº
    2. + +
    3. !varname, ȤÀº
    4. + +
    5. varname=value
    6. +
    + +

    ù¹ø° ÇüÅ´ °ªÀ¸·Î "1"À» »ç¿ëÇÑ´Ù. µÎ¹ø° ÇüÅ´ º¯¼ö°¡ + ÀÌ¹Ì Á¤ÀÇµÈ °æ¿ì º¯¼ö¸¦ Á¦°ÅÇÏ°í, ¼¼¹ø°´Â º¯¼öÀÇ °ªÀ¸·Î + value¸¦ ¼³Á¤ÇÑ´Ù. ¾ÆÆÄÄ¡ 2.0.51ºÎÅÍ + value¿¡ ÀÖ´Â $1..$9¸¦ + regexÀÇ °ýȣģ ÇÏÀ§Ç¥Çö½ÄÀ¸·Î ´ëüÇÑ´Ù.

    + +

    ¿¹Á¦:

    + + SetEnvIf Request_URI "\.gif$" object_is_image=gif
    + SetEnvIf Request_URI "\.jpg$" object_is_image=jpg
    + SetEnvIf Request_URI "\.xbm$" object_is_image=xbm
    + :
    + SetEnvIf Referer www\.mydomain\.com intra_site_referral
    + :
    + SetEnvIf object_is_image xbm XBIT_PROCESSING=1
    + :
    + SetEnvIf ^TS* ^[a-z].* HAVE_TS
    +

    + +

    óÀ½ ¼¼ ÁÙÀº À̹ÌÁö ÆÄÀÏÀ» ¿äûÇÑ °æ¿ì ȯ°æº¯¼ö + object_is_image¸¦ ¼³Á¤ÇÑ´Ù. ³×¹ø° ÁÙÀº ÆäÀÌÁö¸¦ + www.mydomain.com À¥»çÀÌÆ®¿¡¼­ ÂüÁ¶ÇÑ °æ¿ì + intra_site_referralÀ» ¼³Á¤ÇÑ´Ù.

    + +

    ¸¶Áö¸· ¿¹´Â ¿äû¿¡ À̸§¿¡ "TS"·Î ½ÃÀÛÇÏ°í °ªÀÌ [a-z] + Áß Çϳª·Î ½ÃÀÛÇÏ´Â Çì´õ°¡ ÀÖ´Â °æ¿ì ȯ°æº¯¼ö + HAVE_TS¸¦ ¼³Á¤ÇÑ´Ù.

    + +

    Âü°í

    + +
    +
    top
    +

    SetEnvIfNoCase Áö½Ã¾î

    + + + + + + + + +
    ¼³¸í:´ë¼Ò¹®ÀÚ¸¦ ±¸º°ÇÏÁö¾Ê°í ¿äûÀÇ ¼ºÁú¿¡ µû¶ó ȯ°æº¯¼ö¸¦ +¼³Á¤ÇÑ´Ù
    ¹®¹ý:SetEnvIfNoCase attribute regex + [!]env-variable[=value] + [[!]env-variable[=value]] ...
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®, directory, .htaccess
    Override ¿É¼Ç:FileInfo
    »óÅÂ:Base
    ¸ðµâ:mod_setenvif
    Áö¿ø:¾ÆÆÄÄ¡ 1.3 ÀÌÈÄ
    + +

    SetEnvIfNoCase´Â Àǹ̻ó SetEnvIf Áö½Ã¾î¿Í °°Áö¸¸, + ´ë¼Ò¹®ÀÚ¸¦ ±¸º°ÇÏÁö¾Ê°í Á¤±ÔÇ¥Çö½ÄÀ» ã´Â´Ù. ¿¹¸¦ µé¾î:

    +

    + SetEnvIfNoCase Host Apache\.Org site=apache +

    + +

    ÀÌ °æ¿ì HTTP ¿äû Çì´õ Host:°¡ + Apache.Org, apache.org µîÀ» Æ÷ÇÔÇϸé + site ȯ°æº¯¼ö¸¦ "apache"·Î ¼³Á¤ÇÑ´Ù.

    + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_setenvif.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_setenvif.html.tr.utf8 new file mode 100644 index 00000000..1ff9a94c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_setenvif.html.tr.utf8 @@ -0,0 +1,278 @@ + + + +mod_setenvif - Apache HTTP Sunucusu + + + + + + +
    <-
    + +
    +

    Apache Modülü mod_setenvif

    +
    +

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

    +
    + + + +
    Açıklama:Ortam değişkenlerinin isteğin özelliklerine uygun olarak atanmasını sağlar
    Durum:Temel
    Modül Betimleyici:setenvif_module
    Kaynak Dosyası:mod_setenvif.c
    +

    Özet

    + + +

    mod_setenvif modülü ortam değişkenlerinin isteğin + farklı bileşenlerinin belirttiğiniz düzenli ifade ile eşleşmesine bağlı + olarak atanmasını mümkün kılar. Bu ortam değişkenleri sunucunun çeşitli + kısımlarında yapılacak eylemlere karar verirken kullanılır.

    + +

    Yönergeler yapılandırma dosyasında yer aldıkları sıraya göre ele + alınırlar. Böylece daha karmaşık dizilimler kullanılabilir, bu örnekteki + tarayıcı Mozilla ise netscape ortam değişkeni atanmakta, + MSIE ise atanmamaktadır.

    + +

    + BrowserMatch ^Mozilla netscape
    + BrowserMatch MSIE !netscape
    +

    +
    +

    Yönergeler

    + +

    Ayrıca bakınız:

    +
    + +
    top
    +

    BrowserMatch Yönergesi

    + + + + + + + +
    Açıklama:Ortam değişkenlerini HTTP kullanıcı arayüzüne göre belirler. +
    Sözdizimi:BrowserMatch düzifd [!]ort-değişkeni[=değer] +[[!]ort-değişkeni[=değer]] ...
    Bağlam:sunucu geneli, sanal konak, dizin, .htaccess
    Geçersizleştirme:FileInfo
    Durum:Temel
    Modül:mod_setenvif
    +

    BrowserMatch yönergesi SetEnvIf yönergesinin özel bir halidir + ve ortam değişkenlerine User-Agent HTTP istek başlığının + değerine göre atama yapar. Aşağıdaki iki satır aynı etkiye sahiptir:

    + +

    + BrowserMatchNoCase Robot is_a_robot
    + SetEnvIfNoCase User-Agent Robot is_a_robot
    +

    + +

    Başka örnekler:

    + +

    + BrowserMatch ^Mozilla forms jpeg=yes browser=netscape
    + BrowserMatch "^Mozilla/[2-3]" tables agif frames javascript
    + BrowserMatch MSIE !javascript
    +

    + +
    +
    top
    +

    BrowserMatchNoCase Yönergesi

    + + + + + + + + +
    Açıklama:Ortam değişkenlerini HTTP kullanıcı arayüzünün harf büyüklüğüne +duyarsız eşleşmelerine bağlı olarak belirler.
    Sözdizimi:BrowserMatchNoCase düzifd [!]ort-değişkeni[=değer] +[[!]ort-değişkeni[=değer]] ...
    Bağlam:sunucu geneli, sanal konak, dizin, .htaccess
    Geçersizleştirme:FileInfo
    Durum:Temel
    Modül:mod_setenvif
    Uyumluluk:Apache 1.2 ve sonrasında bulunur (Apache 1.2 sürümünde bu +yönerge artık atıl olan mod_browser modülüyle sağlanırdı).
    + +

    BrowserMatchNoCase yönergesi sözdizimsel ve + anlamsal olarak BrowserMatch yönergesinin eşdeğeridir. + Ancak, eşleşmelerde harf büyüklüğüne duyarsızdır. Örnek:

    + +

    + BrowserMatchNoCase mac platform=macintosh
    + BrowserMatchNoCase win platform=windows
    +

    + +

    BrowserMatch ve + BrowserMatchNoCase yönergeleri SetEnvIf ve SetEnvIfNoCase yönergelerinin özel + halleridir. Bu bakımda aşağıdaki iki satır aynı etkiye sahiptir:

    + +

    + BrowserMatchNoCase Robot is_a_robot
    + SetEnvIfNoCase User-Agent Robot is_a_robot
    +

    + +
    +
    top
    +

    SetEnvIf Yönergesi

    + + + + + + + +
    Açıklama:Ortam değişkenlerini isteğin özniteliklerine göre atar. +
    Sözdizimi:SetEnvIf öznitelik + düzifd [!]ort-değişkeni[=değer] + [[!]ort-değişkeni[=değer]] ...
    Bağlam:sunucu geneli, sanal konak, dizin, .htaccess
    Geçersizleştirme:FileInfo
    Durum:Temel
    Modül:mod_setenvif
    +

    SetEnvIf yönergesi ortam değişkenlerini isteğin + özniteliklerine göre tanımlar. İlk bileşen olarak belirtilen + öznitelik şu üç şeyden biri olabilir:

    + +
      +
    1. Bir HTTP istek başlığı alanı (ayrıntılı bilgi için bak: RFC2616); + örneğin: Host, User-Agent, + Referer ve Accept-Language. Bir düzenli + ifade kullanılarak birden fazla istek başlığı belirtilebilir.
    2. + +
    3. İsteğin aşağıdaki bileşenlerinden biri: +
        +
      • Remote_Host - isteği yapan istemcinin konak ismi + (varsa)
      • + +
      • Remote_Addr -isteği yapan istemcinin IP adresi
      • + +
      • Server_Addr - isteği alan sunucunun IP adresi + (sadece 2.0.43 sonrası sürümler için)
      • + +
      • Request_Method - kullanılan yöntemin ismi + (GET, POST, vs.)
      • + +
      • Request_Protocol - Ä°steğin yapıldığı protokolün + ismi ve numarası ("HTTP/0.9", "HTTP/1.1" gibi)
      • + +
      • Request_URI - HTTP istek satırında belirtilen + özkaynak; genellikle sorgu dizgesi olmaksızın şema ve konak ismini + içeren bir URL parçasıdır. Sorgu dizgeleriyle eşleşmeler hakkında + ayrıntılı bilgi edinmek için mod_rewrite + modülünün RewriteCond + yönergesinin açıklamasına bakınız.
      • +
      +
    4. + +
    5. İstek ile evvelce ilişkilendirilmiş bir ortam değişkeninin ismi. Bu + sayede önceki bir eşleşmenin sonucuna karşı yeni bir sınama yapma + imkanı ortaya çıkar. Böyle bir sınama için sadece evvelce + SetEnvIf[NoCase] yönergeleri ile yapılmış atamalardaki + ortam değişkenleri kullanılabilir. ‘Evvelce’ derken, sunucu genelinde + veya bölüm içinde bu yönergeden önce yer alan + SetEnvIf[NoCase] yönerge satırları kastedilmektedir. + Ortam değişkenlerinin dikkate alınabilmesi için istek öznitelikleri + arasında hiçbir eşleşme olmaması ve öznitelik + olarak bir düzenli ifade belirtilmemiş olması gerekir.
    6. +
    + +

    İkinci bileşen (düzifd) Perl uyumlu bir düzenli ifadedir. + Bu, POSIX.2 egrep tarzı bir düzenli ifadelerle benzerlik gösterir. + düzifd ile öznitelik + eşleştiği takdirde yönergenin kalan bileşenleri değerlendirmeye + alınır.

    + +

    Kalan bileşenler atanacak ortam değişkenlerinin isimleri ve isteğe + bağlı olarak bunlara atanacak değerlerden oluşur. Bunlar şöyle + belirtilebilir:

    + +
      +
    1. değişken-adı veya
    2. + +
    3. !değişken-adı ya da
    4. + +
    5. değişken-adı=değer
    6. +
    + +

    İlk biçemde değişkene "1" değeri atanır. İkincisinde atanmış bir + değişken atanmamış yapılır. Üçüncüsünde ise değişkene belirtilen + değer bire bir atanır. 2.0.52 sürümünden itibaren + parantezli düzenli ifadelerin sonuçları ile değiştirilmek üzere + value içinde $1..$9 + gösterimleri tanınmaktadır.

    + +

    Örnek:

    + SetEnvIf Request_URI "\.gif$" nesne_bir_resim=gif
    + SetEnvIf Request_URI "\.jpg$" nesne_bir_resim=jpg
    + SetEnvIf Request_URI "\.xbm$" nesne_bir_resim=xbm
    + :
    + SetEnvIf Referer belgeler\.alanismi\.mesela\.dom dahili_site_istendi
    + :
    + SetEnvIf object_is_image xbm XBIT_PROCESSING=1
    + :
    + SetEnvIf ^TS* ^[a-z].* TS_VAR
    +

    + +

    İlk üçünde istek bir resim dosyası için yapılmışsa + nesne_bir_resim ortam değişkeni atanmakta, dördüncüsünde + istenen sayfa belgeler.alanismi.mesela.dom adlı sitede + bulunuyorsa dahili_site_istendi ortam değişkeni + atanmaktadır.

    + +

    Son örnekte ise istekte "TS" ile başlayıp [a-z] arasındaki + karakterlerle devam eden bir başlık alanı varsa TS_VAR + ortam değişkeni atanmaktadır.

    + +

    Ayrıca bakınız:

    + +
    +
    top
    +

    SetEnvIfNoCase Yönergesi

    + + + + + + + + +
    Açıklama:Ortam değişkenlerini isteğin özniteliklerinde harf büyüklüğüne +bağlı olmaksızın yapılmış tanımlara göre atar.
    Sözdizimi:SetEnvIfNoCase öznitelik + düzifd [!]ort-değişkeni[=değer] + [[!]ort-değişkeni[=değer]] ...
    Bağlam:sunucu geneli, sanal konak, dizin, .htaccess
    Geçersizleştirme:FileInfo
    Durum:Temel
    Modül:mod_setenvif
    Uyumluluk:Apache 1.3 ve sonrasında mevcuttur.
    +

    SetEnvIfNoCase yönergesi sözdizimsel ve anlamsal + olarak SetEnvIf + yönergesinin eşdeğeridir. Ancak, eşleşmelerde harf büyüklüğüne + duyarsızdır. Örnek:

    + +

    + SetEnvIfNoCase Host Apache\.Org site=apache +

    + +

    Burada, Host: HTTP istek başlığında + Apache.Org, apache.org veya harf büyüklüğünce + farklı benzerleri belirtilmişse site ortam değişkenine + "apache" değeri atanmaktadır.

    + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_so.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_so.html new file mode 100644 index 00000000..451b67ee --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_so.html @@ -0,0 +1,17 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_so.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: mod_so.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: mod_so.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: mod_so.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_so.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_so.html.en new file mode 100644 index 00000000..d69163f0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_so.html.en @@ -0,0 +1,192 @@ + + + +mod_so - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_so

    +
    +

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

    +
    + + + + +
    Description:Loading of executable code and +modules into the server at start-up or restart time
    Status:Extension
    Module Identifier:so_module
    Source File:mod_so.c
    Compatibility:This is a Base module (always included) on +Windows
    +

    Summary

    + + +

    On selected operating systems this module can be used to + load modules into Apache at runtime via the Dynamic Shared Object (DSO) mechanism, + rather than requiring a recompilation.

    + +

    On Unix, the loaded code typically comes from shared object + files (usually with .so extension), on Windows + this may either the .so or .dll + extension.

    + +

    Warning

    +

    Apache 1.3 modules cannot be directly used + with Apache 2.0 - the module must be modified to dynamically + load or compile into Apache 2.0.

    +
    +
    + +
    top
    +
    +

    Creating Loadable Modules for Windows

    + +

    Note

    +

    The module name format changed for Windows + with Apache 1.3.15 and 2.0 - the modules are now named as + mod_foo.so

    + +

    While mod_so still loads modules with + ApacheModuleFoo.dll names, the new naming convention is + preferred; if you are converting your loadable module for 2.0, + please fix the name to this 2.0 convention.

    + +

    The Apache module API is unchanged between the Unix and + Windows versions. Many modules will run on Windows with no or + little change from Unix, although others rely on aspects of the + Unix architecture which are not present in Windows, and will + not work.

    + +

    When a module does work, it can be added to the server in + one of two ways. As with Unix, it can be compiled into the + server. Because Apache for Windows does not have the + Configure program of Apache for Unix, the module's + source file must be added to the ApacheCore project file, and + its symbols must be added to the + os\win32\modules.c file.

    + +

    The second way is to compile the module as a DLL, a shared + library that can be loaded into the server at runtime, using + the LoadModule + directive. These module DLLs can be distributed and run on any + Apache for Windows installation, without recompilation of the + server.

    + +

    To create a module DLL, a small change is necessary to the + module's source file: The module record must be exported from + the DLL (which will be created later; see below). To do this, + add the AP_MODULE_DECLARE_DATA (defined in the + Apache header files) to your module's module record definition. + For example, if your module has:

    + +

    + module foo_module; +

    + +

    Replace the above with:

    +

    + module AP_MODULE_DECLARE_DATA foo_module; +

    + +

    Note that this will only be activated on Windows, so the + module can continue to be used, unchanged, with Unix if needed. + Also, if you are familiar with .DEF files, you can + export the module record with that method instead.

    + +

    Now, create a DLL containing your module. You will need to + link this against the libhttpd.lib export library that is + created when the libhttpd.dll shared library is compiled. You + may also have to change the compiler settings to ensure that + the Apache header files are correctly located. You can find + this library in your server root's modules directory. It is + best to grab an existing module .dsp file from the tree to + assure the build environment is configured correctly, or + alternately compare the compiler and link options to your + .dsp.

    + +

    This should create a DLL version of your module. Now simply + place it in the modules directory of your server + root, and use the LoadModule + directive to load it.

    + +
    +
    top
    +

    LoadFile Directive

    + + + + + + +
    Description:Link in the named object file or library
    Syntax:LoadFile filename [filename] ...
    Context:server config
    Status:Extension
    Module:mod_so
    + +

    The LoadFile directive links in the named object files or + libraries when the server is started or restarted; this is used + to load additional code which may be required for some module + to work. Filename is either an absolute path or + relative to ServerRoot.

    + +

    For example:

    + +

    LoadFile libexec/libxmlparse.so

    + + +
    +
    top
    +

    LoadModule Directive

    + + + + + + +
    Description:Links in the object file or library, and adds to the list +of active modules
    Syntax:LoadModule module filename
    Context:server config
    Status:Extension
    Module:mod_so
    +

    The LoadModule directive links in the object file or library + filename and adds the module structure named + module to the list of active modules. Module + is the name of the external variable of type + module in the file, and is listed as the Module Identifier + in the module documentation. Example:

    + +

    + LoadModule status_module modules/mod_status.so +

    + +

    loads the named module from the modules subdirectory of the + ServerRoot.

    + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_so.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_so.html.ja.utf8 new file mode 100644 index 00000000..1d81b705 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_so.html.ja.utf8 @@ -0,0 +1,192 @@ + + + +mod_so - Apache HTTP サーバ + + + + + + +
    <-
    + +
    +

    Apache モジュール mod_so

    +
    +

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

    +
    + + + + +
    説明:起動時や再起動時に実行コードとモジュールをサーバにロードする +
    ステータス:Extension
    モジュール識別子:so_module
    ソースファイル:mod_so.c
    互換性:このモジュールは Window では (常に含まれている) Base +モジュールです
    +

    概要

    + + +

    いくつかのオペレーティングシステムでは、サーバの再コンパイルをする代わりに、 + このモジュールを使用して + 動的共有オブジェクト + (DSO) 機構により、実行時に Apache にモジュールを読み込ませることが + できます。

    + +

    Unix 上では、読み込まれるコードは通常は共有オブジェクトファイル + (普通 .so という拡張子が付いています) からです。 + Windows 上ではこのモジュールの拡張子は .so か .dll + です。

    + +

    警告

    +

    Apache 1.3 のモジュールを直接 Apache 2.0 で使うことはできません + ― モジュールは Apache 2.0 用に動的にロードされるか、 + 直接組み込まれるために修正されなければなりません。

    +
    +
    +

    ディレクティブ

    + +

    トピック

    +
      +
    • Windows 用のロード可能なモジュールを作成する
    • +
    +
    top
    +
    +

    Windows 用のロード可能なモジュールを作成する

    + +

    注

    +

    Apache 1.3.15 と 2.0 とで Windows のモジュール名の形式は変更されました + ― モジュールは mod_foo.so という名前になりました。

    + +

    まだ mod_so で ApacheModuleFoo.dll という名前のモジュールも + ロードされますが、新しい名前の付け方を使う方が好まれます。モジュールを + 2.0 用に移植しているのであれば、2.0 の習慣に合うように名前を + 修正してください。

    + +

    Apache のモジュール API は UNIX と Windows 間では変更されていません。 + 多くのモジュールは全く変更なし、もしくは簡単な変更により Windows + で実行できるようになります。ただし、それ以外の Windows には無い Unix + アーキテクチャーの機能に依存したモジュールは動作しません。

    + +

    モジュールが実際に動作するときは、 + 二つの方法のどちらかでサーバに追加することができます。まず、Unix + と同様にサーバにコンパイルして組み込むことができます。Windows + 用の Apache は Unix 用の Apache にある Configure + プログラムがありませんので、モジュールのソースファイルを + ApacheCore プロジェクトファイルに追加し、シンボルを + os\win32\modules.c ファイルに追加する必要があります。

    + +

    二つ目はモジュールを DLL としてコンパイルする方法です。 + DLL は共有ライブラリで、実行時に + LoadModule + ディレクティブによりサーバに読み込むことができます。これらのモジュール + DLL はそのまま配布することが可能で、サーバを再コンパイルすることなく、Windows + 用の Apache のすべてのインストールで実行することができます。

    + +

    モジュール DLL を作成するためには、 + モジュールの作成に小さな変更を行なう必要があります。 + つまり、モジュールのレコード (これは後で作成されます。 + 以下を参照してください) が DLL からエクスポートされなければなりません。 + これを行なうには、AP_MODULE_DECLARE_DATA (Apache + のヘッダファイルで定義されています) をモジュールのモジュールレコード + 定義の部分に追加してください。たとえば、モジュールに

    +

    + module foo_module; +

    + +

    があるとすると、それを次のもので置き換えてください。

    +

    + module AP_MODULE_DECLARE_DATA foo_module; +

    + +

    Unix 上でもこのモジュールを + 変更無しで使い続けられるように、このマクロは Windows + 上でのみ効力を持ちます。.DEF + ファイルの方を良く知っているという場合は、 + 代わりにそれを使ってモジュールレコードを + エクスポートすることもできます。

    +

    さあ、あなたのモジュールの DLL を作成しましょう。これを、 + libhttpd.lib 共有ライブラリがコンパイルされたときに作成された + ibhttpd.lib エクスポートライブラリとリンクしてください。この時に、 + Apache のヘッダファイルが正しい位置にあるように、 + コンパイラの設定を変える必要があるかもしれません。 + このライブラリはサーバルートの modules ディレクトリにあります。 + ビルド環境が正しく設定されるように、既存のモジュール用の .dsp を + 取ってくるのが一番良いでしょう。もしくは、あなたの .dsp と + コンパイラとリンクのオプションを比較する、というものでも良いです。

    + +

    これで DLL 版のモジュールが作成されているはずです。 + サーバルートの modules + ディレクトリにモジュールを置いて、 + LoadModule + ディレクティブを使って読み込んでください。

    +
    +
    top
    +

    LoadFile ディレクティブ

    + + + + + + +
    説明:指定されたオブジェクトファイルやライブラリをリンクする
    構文:LoadFile filename [filename] ...
    コンテキスト:サーバ設定ファイル
    ステータス:Extension
    モジュール:mod_so
    + +

    LoadFile ディレクティブは、サーバが起動されたときや再起動されたときに、 + 指定されたオブジェクトファイルやライブラリをリンクします。 + これはモジュールが動作するために必要になるかもしれない追加の + コードを読み込むために使用されます。Filename は絶対パスか、ServerRoot からの相対パスです。

    + +

    例:

    + +

    LoadFile libexec/libxmlparse.so

    + + +
    +
    top
    +

    LoadModule ディレクティブ

    + + + + + + +
    説明:オブジェクトファイルやライブラリをリンクし、使用モジュールの +リストに追加する
    構文:LoadModule module filename
    コンテキスト:サーバ設定ファイル
    ステータス:Extension
    モジュール:mod_so
    + +

    LoadModule ディレクティブは filename + というオブジェクトファイルおよびライブラリをリンクし、module + という名前のモジュールの構造をアクティブなモジュールのリストに追加します。 + Module はファイル中の module + 型の外部変数の名前で、モジュールのドキュメントに + モジュール識別子として書かれているものです。例 :

    + +

    + LoadModule status_module modules/mod_status.so +

    + +

    これは ServerRoot の modules サブディレクトリから指定された名前の + モジュールをロードします。

    + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_so.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_so.html.ko.euc-kr new file mode 100644 index 00000000..7506b7e7 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_so.html.ko.euc-kr @@ -0,0 +1,176 @@ + + + +mod_so - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    ¾ÆÆÄÄ¡ ¸ðµâ mod_so

    +
    +

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

    +
    + + + + +
    ¼³¸í:½ÃÀÛÇÒ¶§ ȤÀº Àç½ÃÀÛÇÒ¶§ ½ÇÇà°¡´ÉÇÑ ÄÚµå¿Í ¸ðµâÀ» +¼­¹ö·Î ÀоîµéÀδÙ
    »óÅÂ:Extension
    ¸ðµâ¸í:so_module
    ¼Ò½ºÆÄÀÏ:mod_so.c
    Áö¿ø:À©µµ¿ìÁî¿¡¼­ (Ç×»ó Æ÷ÇÔÇÏ´Â) Base ¸ðµâÀÌ´Ù.
    +

    ¿ä¾à

    + + +

    ¸î¸î ¿î¿µÃ¼Á¦¿¡¼­ ¾ÆÆÄÄ¡´Â µ¿Àû°øÀ¯°´Ã¼ + (DSO) ±â¼úÀ» »ç¿ëÇÏ¿© ¼­¹ö¸¦ ´Ù½Ã ÄÄÆÄÀÏÇÏÁö ¾Ê°íµµ ½ÇÇàÁß¿¡ + ¸ðµâÀ» ÀоîµéÀÏ ¼ö ÀÖ´Ù.

    + +

    ÀоîµéÀÏ ÄÚµå´Â, À¯´Ð½º¿¡¼­´Â (.so È®ÀåÀÚ¸¦ + °¡Áø) ÀϹÝÀûÀÎ °øÀ¯°´Ã¼ÆÄÀÏÀÌ°í, À©µµ¿ìÁî¿¡¼­´Â .so + ȤÀº .dll È®ÀåÀÚ¸¦ °¡Áø´Ù.

    + +

    °æ°í

    +

    ¾ÆÆÄÄ¡ 1.3 ¸ðµâÀ» ¾ÆÆÄÄ¡ 2.0¿¡¼­ »ç¿ëÇÒ ¼ö ¾ø´Ù. + ¾ÆÆÄÄ¡ 2.0ÀÌ µ¿ÀûÀ¸·Î ÀоîµéÀ̰ųª ¾ÆÆÄÄ¡¿Í °°ÀÌ ÄÄÆÄÀÏÇÏ·Á¸é + ¸ðµâÀ» ¼öÁ¤ÇØ¾ß ÇÑ´Ù.

    +
    +
    + +
    top
    +
    +

    À©µµ¿ìÁî¿¡¼­ ÀоîµéÀÏ ¸ðµâ ¸¸µé±â

    + +

    ÁÖÀÇ

    +

    À©µµ¿ìÁîÀÇ ¸ðµâ¸í Çü½ÄÀº ¾ÆÆÄÄ¡ 1.3.15¿Í 2.0¿¡¼­ º¯°æµÇ¾ú´Ù. + ¸ðµâ¸íÀº ÀÌÁ¦ mod_foo.so½ÄÀÌ´Ù.

    + +

    mod_so´Â ¾ÆÁ÷µµ ApacheModuleFoo.dll ½ÄÀÇ ¸ðµâÀ» ÀоîµéÀÏ + ¼ö ÀÖÁö¸¸, »õ·Î¿î À̸§ ±ÔÄ¢À» ¼±È£ÇÑ´Ù. ¸ðµâÀ» 2.0¿¡ ¸Â°Ô + ¼öÁ¤ÇÑ´Ù¸é À̸§À» 2.0 ±ÔÄ¢¿¡ ¾Ë¸Â°Ô °íÄ¡±æ ¹Ù¶õ´Ù.

    + +

    ¾ÆÆÄÄ¡ ¸ðµâ API´Â À¯´Ð½º ¹öÀüÀ̰ųª À©µµ¿ìÁî ¹öÀüÀ̰ųª + °°´Ù. ¸î¸î API´Â À©µµ¿ìÁî¿¡ ¾ø´Â À¯´Ð½º ±¸Á¶¿¡ ÀÇÁ¸Çϱ⶧¹®¿¡ + »ç¿ëÇÒ ¼ö ¾øÁö¸¸, À¯´Ð½º¿¡¼­ ½ÇÇàµÇ´Â ¸¹Àº ¸ðµâÀ» ¼öÁ¤¾øÀÌ + ȤÀº Á¶±Ý ¼öÁ¤ÇÏ¿© À©µµ¿ìÁî¿¡¼­ »ç¿ëÇÒ ¼ö ÀÖ´Ù.

    + +

    ¸ðµâÀº µÎ°¡Áö ¹æ¹ýÀ¸·Î ¼­¹ö¿¡ Ãß°¡ÇÒ ¼ö ÀÖ´Ù. À¯´Ð½º¿¡¼­´Â + ¸ðµâÀ» ¼­¹ö¿Í °°ÀÌ ÄÄÆÄÀÏÇÒ ¼ö ÀÖ´Ù. À©µµ¿ìÁî¿ë ¾ÆÆÄÄ¡´Â + À¯´Ð½º¿Í ´Þ¸® Configure ÇÁ·Î±×·¥ÀÌ ¾ø±â¶§¹®¿¡ + ¸ðµâÀÇ ¼Ò½ºÆÄÀÏÀ» ApacheCore ÇÁ·ÎÁ§Æ® ÆÄÀÏ¿¡ Ãß°¡ÇÏ°í, ½Éº¼À» + os\win32\modules.c ÆÄÀÏ¿¡ Ãß°¡ÇØ¾ß ÇÑ´Ù.

    + +

    µÎ¹ø° ¹æ¹ýÀº ¸ðµâÀ» ¼­¹ö°¡ + LoadModule Áö½Ã¾î¸¦ + »ç¿ëÇÏ¿© ½ÃÀÛÇÒ¶§ ÀоîµéÀÏ ¼ö ÀÖ´Â °øÀ¯¶óÀ̺귯¸® DLL·Î + ¸¸µå´Â °ÍÀÌ´Ù. ÀÌ ¸ðµâ DLLÀ» ¹èÆ÷ÇÏ¸é ¼­¹ö¸¦ ÀçÄÄÆÄÀÏÇÏÁö + ¾Ê°í ¾î¶² À©µµ¿ìÁî¿ë ¾ÆÆÄÄ¡¿¡¼­µµ ¸ðµâÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù.

    + +

    ¸ðµâ DLLÀ» ¸¸µé±âÀ§Çؼ­´Â ¸ðµâÀÇ ¼Ò½ºÆÄÀÏÀ» Á¶±Ý ¼öÁ¤ÇØ¾ß + ÇÑ´Ù. DLLÀº module record¸¦ exportÇØ¾ß ÇÑ´Ù. (¾Æ·¡ Âü°í) + À̸¦ À§ÇØ ¸ðµâÀÇ module record Á¤ÀÇ¿¡ (¾ÆÆÄÄ¡ Çì´õÆÄÀÏ¿¡ + Á¤ÀǵÈ) AP_MODULE_DECLARE_DATA¸¦ Ãß°¡ÇÑ´Ù. + ¿¹¸¦ µé¾î, ´ÙÀ½°ú °°Àº ¸ðµâÀÌ ÀÖ´Ù¸é:

    + +

    + module foo_module; +

    + +

    ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÑ´Ù:

    +

    + module AP_MODULE_DECLARE_DATA foo_module; +

    + +

    ÀÌ ºÎºÐÀº À©µµ¿ìÁî¿¡¼­¸¸ »ç¿ëÇϱ⶧¹®¿¡ º¯°æÇÏ¿©µµ À¯´Ð½º¿¡¼­ + ¼Ò½º¸¦ ±×´ë·Î »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¶Ç, .DEF ÆÄÀÏ¿¡ + Àͼ÷ÇÏ´Ù¸é ´ë½Å ÀÌ ÆÄÀÏÀ» »ç¿ëÇÏ¿© module record¸¦ exportÇÒ + ¼öµµ ÀÖ´Ù.

    + +

    ÀÌÁ¦ ¸ðµâÀ» Æ÷ÇÔÇÑ DLLÀ» ¸¸µç´Ù. À̸¦ °øÀ¯¶óÀ̺귯¸® + libhttpd.dllÀ» ÄÄÆÄÀÏÇÒ¶§ ¸¸µç libhttpd.lib export ¶óÀ̺귯¸®¿Í + ¸µÅ©ÇÑ´Ù. ¾ÆÆÄÄ¡ Çì´õÆÄÀÏÀ» ¿Ã¹Ù·Î ãµµ·Ï ÄÄÆÄÀÏ·¯ ¼³Á¤À» + ¼öÁ¤ÇØ¾ß ÇÒÁöµµ ¸ð¸¥´Ù. ¼­¹öÀÇ modules µð·ºÅ丮¿¡¼­ ÀÌ + ¶óÀ̺귯¸®¸¦ ãÀ» ¼ö ÀÖ´Ù. ÄÄÆÄÀÏȯ°æÀ» ¿Ã¹Ù·Î ¼³Á¤ÇϱâÀ§ÇØ + ±âÁ¸ ¸ðµâÀÇ .dsp ÆÄÀÏÀ» °¡Á®´Ù ¾²°Å³ª Á÷Á¢ ¸¸µç .dsp¿Í + ÄÄÆÄÀÏ·¯/¸µÄ¿ ¿É¼ÇÀ» ºñ±³ÇÏ´Â °ÍÀÌ ÁÁ´Ù.

    + +

    ÀÌÁ¦ ¸ðµâÀ» DLL·Î ¸¸µç´Ù. ÀÌ°ÍÀ» ¼­¹öÀÇ + modules µð·ºÅ丮¿¡ µÎ°í, + LoadModule Áö½Ã¾î¸¦ »ç¿ëÇÏ¿© ÀоîµéÀδÙ.

    + +
    +
    top
    +

    LoadFile Áö½Ã¾î

    + + + + + + +
    ¼³¸í:ÁöÁ¤ÇÑ ¸ñÀûÆÄÀÏÀ̳ª ¶óÀ̺귯¸®¸¦ ÀоîµéÀδÙ
    ¹®¹ý:LoadFile filename [filename] ...
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤
    »óÅÂ:Extension
    ¸ðµâ:mod_so
    + +

    LoadFile Áö½Ã¾î´Â ¼­¹ö°¡ ½ÃÀÛÇϰųª Àç½ÃÀÛÇÒ¶§ ÁöÁ¤ÇÑ + ¸ñÀûÆÄÀÏÀ̳ª ¶óÀ̺귯¸®¸¦ ÀоîµéÀδÙ(link in). ÀÌ Áö½Ã¾î´Â + ¾î¶² ¸ðµâÀÌ µ¿ÀÛÇϱâÀ§ÇØ ÇÊ¿äÇÑ Äڵ带 Ãß°¡·Î ÀоîµéÀ϶§ + »ç¿ëÇÑ´Ù. FilenameÀº Àý´ë°æ·ÎÀ̰ųª ServerRoot¿¡ ´ëÇÑ »ó´ë°æ·ÎÀÌ´Ù.

    + +

    ¿¹¸¦ µé¾î:

    + +

    LoadFile libexec/libxmlparse.so

    + + +
    +
    top
    +

    LoadModule Áö½Ã¾î

    + + + + + + +
    ¼³¸í:¸ñÀûÆÄÀÏÀ̳ª ¶óÀ̺귯¸®¸¦ ÀоîµéÀÌ°í, »ç¿ë°¡´ÉÇÑ +¸ðµâ ¸ñ·Ï¿¡ Ãß°¡ÇÑ´Ù
    ¹®¹ý:LoadModule module filename
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤
    »óÅÂ:Extension
    ¸ðµâ:mod_so
    +

    LoadModule Áö½Ã¾î´Â ¸ñÀûÆÄÀÏ È¤Àº ¶óÀ̺귯¸® filenameÀ» + ÀоîµéÀÌ°í, »ç¿ë°¡´ÉÇÑ ¸ðµâ ¸ñ·Ï¿¡ moduleÀ̶ó´Â + ¸ðµâ ±¸Á¶Ã¼¸¦ Ãß°¡ÇÑ´Ù. ModuleÀº ÆÄÀÏÀÇ + module ÀÚ·áÇü ¿ÜºÎº¯¼ö¸íÀ̸ç, ¸ðµâ ¹®¼­ÀÇ ¸ðµâ¸í¿¡ + ³ª¿Â´Ù. ¿¹¸¦ µé¸é:

    + +

    + LoadModule status_module modules/mod_status.so +

    + +

    ServerRootÀÇ modules ÇÏÀ§µð·ºÅ丮¿¡¼­ ÁöÁ¤ÇÑ ¸ðµâÀ» ÀоîµéÀδÙ.

    + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_so.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_so.html.tr.utf8 new file mode 100644 index 00000000..14688626 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_so.html.tr.utf8 @@ -0,0 +1,196 @@ + + + +mod_so - Apache HTTP Sunucusu + + + + + + +
    <-
    + +
    +

    Apache Modülü mod_so

    +
    +

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

    +
    + + + + +
    Açıklama:Modüllerin ve çalıştırılabilir kodun sunucunun başlatılması veya +yeniden başlatılması sırasında yüklenmesini sağlar.
    Durum:Eklenti
    Modül Betimleyici:so_module
    Kaynak Dosyası:mod_so.c
    Uyumluluk:Windows için bu bir temel modüldür (sunucu bunu daima içerir).
    +

    Özet

    + + +

    Seçilen işletim sistemleri üzerinde bu modül Apache’nin yeniden + derlenmesini gerektirmeden modüllerin Devingen + Paylaşımlı Nesne (DSO) mekanizması üzerinden kullanılabilmesini + sağlar.

    + +

    Unix’te yüklenen kod genellikle paylaşımlı nesne dosyalarından + (.so uzantılı dosyalar), Windows’ta ise ya .so + ya da .dll uzantılı dosyalardan gelir.

    + +

    Uyarı

    +

    Apache 1.3 modülleri Apache 2.0’da doğrudan kullanılamazlar - modül ya + devingen olarak yüklenecek hale getirilmeli ya da Apache 2.0’ın içinde + derlenmelidir.

    +
    +
    + +
    top
    +
    +

    Yüklenebilir Modüllerin Windows için Oluşturulması

    + + +

    Bilginize

    +

    Windows için modül isimlendirme biçemi Apache 1.3.15 ve 2.0 + sürümlerinde değişmiştir; modüllere artık mod_filanca.so biçeminde isim + verilmektedir.

    + +

    mod_so modülü ApacheModuleFoo.dll biçeminde + isimlendirilmiş modülleri hala yüklemekteyse de yeni adlandırma uzlaşımı + tercih edilmelidir. Yüklenebilir modülleri 2.0’a dönüştürüyorsanız, + lütfen isimlerini de 2.0 uzlaşımına uygun hale getiriniz.

    + +

    Apache modül programlama arayüzü Unix ve Windows sürümleri arasında + değişiklik göstermez. Unix için kullanılan çoğu modül hiç değişiklik + yapmadan ya da çok küçük bir değişiklikle Windows’ta da çalışmaktadır. + Çalışmayanlar Unix platformunun sahip olduğu ancak Windows platformunun + sahip olmadığı nitelikleri kullanan modüllerdir.

    + +

    Bir modül Windows’ta çalıştığı zaman, sunucuya iki şekilde + yüklenebilir. Unix’te olduğu gibi, doğrudan sunucunun içinde + derlenebilir. Windows için hazırlanan Apache paketi, Unix için geçerli + olan Configure betiğini içermediğinden modülün kaynak + dosyası ApacheCore proje dosyasına, sembolleri de + os\win32\modules.c dosyasına eklenmelidir.

    + +

    İkinci yol ise modülü bir paylaşımlı kütüphane olarak çalışma anında + LoadModule yönergesi ile yüklemek + için bir DLL olarak derlemektir. Bu DLL modüller dağıtılabilir ve + sunucuyu yeniden derlemek gerekmeksizin her Windows için Apache + kurulumunda çalışabilir.

    + +

    Bir modül DLL’i oluşturmak için modülün kaynak dosyasında küçük bir + değişiklik yapmak gerekir: Modül kaydının daha sonra oluşturulacak olan + DLL’den ihraç edilebilmesi gerekir (aşağıya bakınız). Bunu yapmak için + modülün modül kaydı tanımına (Apache başlık dosyalarında tanımlanmış + olan) AP_MODULE_DECLARE_DATA eklenmelidir. Örneğin, + modülünüz

    + +

    + module foo_module; +

    + +

    diye bir satır içeriyorsa bunu,

    + +

    + module AP_MODULE_DECLARE_DATA foo_module; +

    + +

    olarak değiştirmelisiniz. Bunun yalnız Windows üzerinde etkili olduğunu + ve Unix için modül kodunda bir değişiklik gerekmediğini unutmayınız. + Ayrıca, .DEF dosyaları hakkında bilgi sahibi iseniz modül + kodunda değişiklik yapmak yerine modül kaydını bu yöntemle de ihraç + edebilirsiniz.

    + +

    Artık modülü içeren bir DLL oluşturmaya hazırsınız. Bunu, libhttpd.dll + paylaşımlı kütüphanesi derlenirken oluşturulan libhttpd.lib ihraç + kütüphanesi ile ilintilemeniz gerekecektir. Ayrıca, Apache başlık + dosyalarının doğru konumlandığından emin olmak için derleyici + seçeneklerinde değişiklik yapmanız gerekebilir. Bu kütüphaneyi + sunucunuzun kök dizini altındaki modules dizininde + bulabilirsiniz. En iyisi derleme ortamının doğru yapılandırıldığından + emin olmak için ya ağaçta mevcut modüllerden birinin .dsp + dosyasını gaspedersiniz ya da kendi .dsp dosyanızın + ilintileme seçenekleriyle derleyicininkileri karşılaştırırsınız.

    + +

    Artık modülünüzün DLL sürümünü oluşturmalısınız. DLL’i sunucunuzun kök + dizininin altında bulunan modules dizinine yerleştirdikten + sonra LoadModule yönergesi ile sunucunuza + yükleyebilirsiniz.

    + +
    +
    top
    +

    LoadFile Yönergesi

    + + + + + + +
    Açıklama:Belirtilen nesne dosyasını veya kütüphaneyi sunucu ile ilintiler. +
    Sözdizimi:LoadFile dosya-ismi [dosya-ismi] ...
    Bağlam:sunucu geneli
    Durum:Eklenti
    Modül:mod_so
    + +

    LoadFile yönergesi ismi belirtilen kütüphaneleri + veya nesne dosyalarını sunucu başlatılırken veya yeniden başlatılırken + sunucu ile ilintiler. Yönerge, bazı modüllerin çalışması sırasında + gereken ek kodların yüklenmesi için kullanılır. + dosya-ismi olarak mutlak bir dosya yolu + belirtilebileceği gibi ServerRoot’a + göreli bir dosya yolu da belirtilebilir.

    + +

    Örnek:

    + +

    LoadFile libexec/libxmlparse.so

    + + +
    +
    top
    +

    LoadModule Yönergesi

    + + + + + + +
    Açıklama:Belirtilen nesne dosyasını veya kütüphaneyi sunucu ile ilintiler +ve etkin modül listesine ekler.
    Sözdizimi:LoadModule modül dosya-ismi
    Bağlam:sunucu geneli
    Durum:Eklenti
    Modül:mod_so
    +

    LoadModule yönergesi + dosya-ismi ile belirtilen nesne dosyasını veya + kütüphaneyi sunucu ile ilintiler ve etkin modül listesine belirtilen + modül ismiyle ekler. modül, + modülün kaynak dosyasında module türündeki tek harici + değişkenin ismi olup modül belgelerinde Modül Betimleyici olarak + geçer. Örneğin,

    + +

    + LoadModule status_module modules/mod_status.so +

    + +

    satırı ile ismi belirtilen dosya ServerRoot dizini altındaki + modules alt dizininden yüklenir.

    + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_speling.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_speling.html new file mode 100644 index 00000000..7cc8d4ee --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_speling.html @@ -0,0 +1,13 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_speling.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: mod_speling.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: mod_speling.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_speling.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_speling.html.en new file mode 100644 index 00000000..fccc6111 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_speling.html.en @@ -0,0 +1,121 @@ + + + +mod_speling - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_speling

    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + + + +
    Description:Attempts to correct mistaken URLs that +users might have entered by ignoring capitalization and by +allowing up to one misspelling
    Status:Extension
    Module Identifier:speling_module
    Source File:mod_speling.c
    +

    Summary

    + + +

    Requests to documents sometimes cannot be served by the core + apache server because the request was misspelled or + miscapitalized. This module addresses this problem by trying to + find a matching document, even after all other modules gave up. + It does its work by comparing each document name in the + requested directory against the requested document name + without regard to case, and allowing + up to one misspelling (character insertion / + omission / transposition or wrong character). A list is built + with all document names which were matched using this + strategy.

    + +

    If, after scanning the directory,

    + +
      +
    • no matching document was found, Apache will proceed as + usual and return a "document not found" error.
    • + +
    • only one document is found that "almost" matches the + request, then it is returned in the form of a redirection + response.
    • + +
    • more than one document with a close match was found, then + the list of the matches is returned to the client, and the + client can select the correct candidate.
    • +
    + +
    +

    Directives

    + +
    + +
    top
    +

    CheckSpelling Directive

    + + + + + + + + + +
    Description:Enables the spelling +module
    Syntax:CheckSpelling on|off
    Default:CheckSpelling Off
    Context:server config, virtual host, directory, .htaccess
    Override:Options
    Status:Extension
    Module:mod_speling
    Compatibility:CheckSpelling was available as a separately available +module for Apache 1.1, but was limited to miscapitalizations. As +of Apache 1.3, it is part of the Apache distribution. Prior to Apache +1.3.2, the CheckSpelling directive was only available in the +"server" and "virtual host" contexts.
    + +

    This directive enables or disables the spelling module. When + enabled, keep in mind that

    + +
      +
    • the directory scan which is necessary for the spelling + correction will have an impact on the server's performance + when many spelling corrections have to be performed at the + same time.
    • + +
    • the document trees should not contain sensitive files + which could be matched inadvertently by a spelling + "correction".
    • + +
    • the module is unable to correct misspelled user names (as + in http://my.host/~apahce/), just file names or + directory names.
    • + +
    • spelling corrections apply strictly to existing files, so + a request for the <Location /status> may + get incorrectly treated as the negotiated file + "/stats.html".
    • +
    + +
    +
    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_speling.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_speling.html.ja.utf8 new file mode 100644 index 00000000..e9794100 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_speling.html.ja.utf8 @@ -0,0 +1,119 @@ + + + +mod_speling - Apache HTTP サーバ + + + + + + +
    <-
    + +
    +

    Apache モジュール mod_speling

    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + + + +
    説明:ユーザが入力したであろう間違った URL を、 +大文字小文字の区別を無視することと一つ以下の綴り間違いを許容することで +修正を試みる
    ステータス:Extension
    モジュール識別子:speling_module
    ソースファイル:mod_speling.c
    +

    概要

    + + +

    リクエストの綴りが間違っていたり、 + 大文字小文字が違っていたりするために、Apache のコアサーバが + ドキュメントへのリクエストへの応答を正しく提供できないことがあります。 + このモジュールは、他のすべてのモジュールがあきらめた後であったとしても、 + リクエストに合うドキュメントを見つけようとすることによりこの問題の + 解決を試みます。このモジュールはリクエストされたディレクトリにある + それぞれのドキュメントの名前と、リクエストされたドキュメントの名前とを + 大文字小文字の区別を無視し、一文字までの + 綴りの間違い (文字の挿入/省略/隣合う文字の置換、間違った文字) + を許可して比較することにより、目的を達成しようとします。 + この方法でリクエストに合うドキュメントの一覧が作成されます。

    + +

    ディレクトリをスキャンした後に、

    + +
      +
    • 適切なドキュメントが見つからなかった場合、 + Apache はいつもと同じように処理をし、 + 「ドキュメントが見つからない」というエラーを返します。
    • + +
    • リクエストに「ほとんど」合うドキュメントが一つだけ見つかった場合、 + それがリダイレクト応答として返されます。
    • + +
    • よく似たドキュメントが複数見つかった場合、 + そのリストがクライアントに返され、 + クライアントが正しい候補を選択できるようにします。
    • +
    + +
    +

    ディレクティブ

    + +
    + +
    top
    +

    CheckSpelling ディレクティブ

    + + + + + + + + + +
    説明:spelling モジュールを使用するようにする
    構文:CheckSpelling on|off
    デフォルト:CheckSpelling Off
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:Options
    ステータス:Extension
    モジュール:mod_speling
    互換性:CheckSpelling は Apache 1.1 では別配布のモジュールで、 +大文字小文字の間違いのみの機能でした。Apache 1.3 で Apache の配布に +含まれるようになりました。Apache 1.3.2 より前では CheckSpelling +ディレクティブは「サーバ」と「バーチャルホスト」コンテキストでのみ +使用可能でした
    +

    このディレクティブは綴り用のモジュールを使用するかどうかを + 決めます。使用時には、以下のことを覚えておいてください

    + +
      +
    • 同時にたくさんの綴りの訂正を行なわなければならないときは、 + そのために行なわれるディレクトリのスキャンがサーバの性能に + 影響を与えます。
    • + +
    • ドキュメントの中に綴りの「訂正」により + 意図せず合ってしまうような重要なファイルがないようにしてください。 +
    • + +
    • モジュールはユーザ名の綴りの間違い + (http://my.host/~apahce/ のように) + を訂正することはできません。 + 訂正できるのはファイル名とディレクトリ名だけです。
    • + +
    • 綴りの訂正は存在するファイルに厳密に適用されますので、 + <Location /status> + はネゴシエーションの結果のファイル "/stats.html" + として間違って扱われるかもしれません。
    • +
    + +
    +
    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_speling.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_speling.html.ko.euc-kr new file mode 100644 index 00000000..9fa964ab --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_speling.html.ko.euc-kr @@ -0,0 +1,110 @@ + + + +mod_speling - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    ¾ÆÆÄÄ¡ ¸ðµâ mod_speling

    +
    +

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

    +
    + + + +
    ¼³¸í:»ç¿ëÀÚ°¡ ´ë¼Ò¹®ÀÚ¸¦ À߸ø »ç¿ëÇϰųª ¸ÂÃã¹ýÀÌ Æ²¸®´Â +°ÍÀ» Çѹø±îÁö Çã¿ëÇÏ¿© À߸øµÈ URLÀ» °íÄ¡·Á°í ½ÃµµÇÑ´Ù
    »óÅÂ:Extension
    ¸ðµâ¸í:speling_module
    ¼Ò½ºÆÄÀÏ:mod_speling.c
    +

    ¿ä¾à

    + + +

    Á¾Á¾ ¸ÂÃã¹ýÀÌ Æ²¸®°Å³ª ´ë¼Ò¹®ÀÚ¸¦ À߸ø »ç¿ëÇÏ¿© ¾ÆÆÄÄ¡°¡ + ¹®¼­ ¿äûÀ» ¼­ºñ½ºÇÒ ¼ö ¾ø´Â °æ¿ì°¡ ÀÖ´Ù. ÀÌ ¸ðµâÀº ´Ù¸¥ + ¸ðµç ¸ðµâµéÀÌ Æ÷±âÇÑ ¿äû¿¡ ÇØ´çÇÏ´Â ¹®¼­¸¦ ã´Â´Ù. ¸ðµâÀº + ¿äûÇÑ µð·ºÅ丮 ¾È¿¡ ÀÖ´Â ¸ðµç ¹®¼­¸¦ ¿äûÇÑ ¹®¼­À̸§°ú + ´ë¼Ò¹®ÀÚ ±¸º°¾øÀÌ (¹®ÀÚ Ã·°¡ / »ý·« / ±³Ã¼ + ȤÀº À߸øµÈ ¹®ÀÚ ) ¸ÂÃã¹ýÀÌ Çѹø±îÁö Ʋ·Áµµ + ºÁÁÖ¸ç ºñ±³ÇÑ´Ù. ÀÌ·± ¹æ¹ýÀ¸·Î ¹®¼­¸ñ·ÏÀ» ¸¸µç´Ù.

    + +

    µð·ºÅ丮¸¦ »ìÆ캻 ÈÄ¿¡,

    + +
      +
    • ¹®¼­¸¦ ãÁö¸øÇϸé, ¾ÆÆÄÄ¡´Â ÀϹÝÀûÀÎ "document not + found (¹®¼­¸¦ ãÀ» ¼ö ¾øÀ½)" ¿À·ù¸¦ ¹ÝȯÇÑ´Ù.
    • + +
    • ¿äû¿¡ "°ÅÀÇ" ÀÏÄ¡ÇÏ´Â ¹®¼­¸¦ Çϳª¸¸ ãÀº °æ¿ì, ±× + ¹®¼­·Î ¸®´ÙÀÌ·º¼Ç ÀÀ´äÀ» ÇÑ´Ù.
    • + +
    • ±ÙÁ¢ÇÑ ¹®¼­¸¦ ¿©·¯°³ ãÀº °æ¿ì, Ŭ¶óÀ̾ðÆ®°¡ ¿Ã¹Ù¸¥ + ¹®¼­¸¦ ¼±ÅÃÇÒ ¼ö ÀÖµµ·Ï ¹®¼­¸ñ·ÏÀ» º¸³½´Ù.
    • +
    + +
    +

    Áö½Ã¾îµé

    + +
    + +
    top
    +

    CheckSpelling Áö½Ã¾î

    + + + + + + + + + +
    ¼³¸í:¸ÂÃã¹ý ¸ðµâÀ» »ç¿ëÇÑ´Ù
    ¹®¹ý:CheckSpelling on|off
    ±âº»°ª:CheckSpelling Off
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®, directory, .htaccess
    Override ¿É¼Ç:Options
    »óÅÂ:Extension
    ¸ðµâ:mod_speling
    Áö¿ø:¾ÆÆÄÄ¡ 1.1Àº CheckSpellingÀ» º°µµ·Î Á¦°øÇÏ¿´Áö¸¸, +´ë¼Ò¹®ÀÚ°¡ ´Ù¸¥ °æ¿ì¸¸À» ó¸®ÇÒ ¼ö ÀÖ¾ú´Ù. ¾ÆÆÄÄ¡ 1.3¿¡¼­ ¾ÆÆÄÄ¡ +¹èÆ÷º»ÀÇ ÀϺΰ¡ µÇ¾ú´Ù. ¾ÆÆÄÄ¡ 1.3.2 ÀÌÀü¿¡´Â +CheckSpelling Áö½Ã¾î¸¦ "ÁÖ¼­¹ö"¿Í "°¡»óÈ£½ºÆ®" +»ç¿ëÀå¼Ò¿¡¼­¸¸ »ç¿ëÇÒ ¼ö ÀÖ¾ú´Ù.
    + +

    ÀÌ Áö½Ã¾î´Â ¸ÂÃã¹ý ¸ðµâÀÇ »ç¿ë¿©ºÎ¸¦ °áÁ¤ÇÑ´Ù. »ç¿ëÇÑ´Ù¸é + ´ÙÀ½À» ÁÖÀÇÇ϶ó

    + +
      +
    • ¸ÂÃã¹ý ±³Á¤À» À§ÇØ µð·ºÅ丮¸¦ »ìÆ캸´Â ÀÛ¾÷À» µ¿½Ã¿¡ + ¿©·¯¹ø ÇÒ °æ¿ì ¼­¹ö ¼º´É¿¡ ¿µÇâÀ» ÁØ´Ù.
    • + +
    • ¹®¼­Áß¿¡ ¸ÂÃã¹ý "±³Á¤"À¸·Î ¿ì¿¬È÷ º¸¿©Áú ¼ö ÀÖ´Â + ±â¹Ð¹®¼­°¡ ¾ø¾î¾ß ÇÑ´Ù.
    • + +
    • ¸ðµâÀº ÆÄÀϸí°ú µð·ºÅ丮¸í¸¸À» ±³Á¤ÇÒ ¼ö ÀÖÀ¸¸ç, + (http://my.host/~apahce/¿Í °°ÀÌ) ¸ÂÃã¹ýÀÌ + Ʋ¸° »ç¿ëÀÚ¸íÀ» ±³Á¤ÇÏÁö ¸øÇÑ´Ù.
    • + +
    • ¸ÂÃã¹ý ±³Á¤Àº Á¸ÀçÇÏ´Â ÆÄÀÏ¿¡¸¸ Àû¿ëµÈ´Ù. ±×·¡¼­ + <Location /status>¿¡ ´ëÇÑ ¿äûÀ» + ³»¿ëÇù»óÀ» °ÅÄ£ "/stats.html" ÆÄÀÏ·Î ¿ÀÀÎÇÒ + ¼ö ÀÖ´Ù.
    • +
    + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_ssl.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_ssl.html new file mode 100644 index 00000000..003e7555 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_ssl.html @@ -0,0 +1,5 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_ssl.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_ssl.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_ssl.html.en new file mode 100644 index 00000000..63c31e38 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_ssl.html.en @@ -0,0 +1,1576 @@ + + + +mod_ssl - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_ssl

    +
    +

    Available Languages:  en 

    +
    + + + +
    Description:Strong cryptography using the Secure Sockets +Layer (SSL) and Transport Layer Security (TLS) protocols
    Status:Extension
    Module Identifier:ssl_module
    Source File:mod_ssl.c
    +

    Summary

    + +

    This module provides SSL v2/v3 and TLS v1 support for the Apache +HTTP Server. It was contributed by Ralf S. Engeschall based on his +mod_ssl project and originally derived from work by Ben Laurie.

    + +

    This module relies on OpenSSL +to provide the cryptography engine.

    + +

    Further details, discussion, and examples are provided in the +SSL documentation.

    +
    + +
    top
    +
    +

    Environment Variables

    + +

    This module provides a lot of SSL information as additional environment +variables to the SSI and CGI namespace. The generated variables are listed in +the table below. For backward compatibility the information can +be made available under different names, too. Look in the Compatibility chapter for details on the +compatibility variables.

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Variable Name:Value Type:Description:
    HTTPS flag HTTPS is being used.
    SSL_PROTOCOL string The SSL protocol version (SSLv2, SSLv3, TLSv1)
    SSL_SESSION_ID string The hex-encoded SSL session id
    SSL_CIPHER string The cipher specification name
    SSL_CIPHER_EXPORT string true if cipher is an export cipher
    SSL_CIPHER_USEKEYSIZE number Number of cipher bits (actually used)
    SSL_CIPHER_ALGKEYSIZE number Number of cipher bits (possible)
    SSL_VERSION_INTERFACE string The mod_ssl program version
    SSL_VERSION_LIBRARY string The OpenSSL program version
    SSL_CLIENT_M_VERSION string The version of the client certificate
    SSL_CLIENT_M_SERIAL string The serial of the client certificate
    SSL_CLIENT_S_DN string Subject DN in client's certificate
    SSL_CLIENT_S_DN_x509 string Component of client's Subject DN
    SSL_CLIENT_I_DN string Issuer DN of client's certificate
    SSL_CLIENT_I_DN_x509 string Component of client's Issuer DN
    SSL_CLIENT_V_START string Validity of client's certificate (start time)
    SSL_CLIENT_V_END string Validity of client's certificate (end time)
    SSL_CLIENT_A_SIG string Algorithm used for the signature of client's certificate
    SSL_CLIENT_A_KEY string Algorithm used for the public key of client's certificate
    SSL_CLIENT_CERT string PEM-encoded client certificate
    SSL_CLIENT_CERT_CHAINn string PEM-encoded certificates in client certificate chain
    SSL_CLIENT_VERIFY string NONE, SUCCESS, GENEROUS or FAILED:reason
    SSL_SERVER_M_VERSION string The version of the server certificate
    SSL_SERVER_M_SERIAL string The serial of the server certificate
    SSL_SERVER_S_DN string Subject DN in server's certificate
    SSL_SERVER_S_DN_x509 string Component of server's Subject DN
    SSL_SERVER_I_DN string Issuer DN of server's certificate
    SSL_SERVER_I_DN_x509 string Component of server's Issuer DN
    SSL_SERVER_V_START string Validity of server's certificate (start time)
    SSL_SERVER_V_END string Validity of server's certificate (end time)
    SSL_SERVER_A_SIG string Algorithm used for the signature of server's certificate
    SSL_SERVER_A_KEY string Algorithm used for the public key of server's certificate
    SSL_SERVER_CERT string PEM-encoded server certificate
    +

    [ where x509 is a component of a X.509 DN: + C,ST,L,O,OU,CN,T,I,G,S,D,UID,Email ]

    +
    top
    +
    +

    Custom Log Formats

    + +

    When mod_ssl is built into Apache or at least +loaded (under DSO situation) additional functions exist for the Custom Log Format of +mod_log_config. First there is an +additional ``%{varname}x'' +eXtension format function which can be used to expand any variables +provided by any module, especially those provided by mod_ssl which can +you find in the above table.

    +

    +For backward compatibility there is additionally a special +``%{name}c'' cryptography format function +provided. Information about this function is provided in the Compatibility chapter.

    +

    +Example:

    +

    +CustomLog logs/ssl_request_log \ + "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b" +

    +
    +
    top
    +

    SSLCACertificateFile Directive

    + + + + + + +
    Description:File of concatenated PEM-encoded CA Certificates +for Client Auth
    Syntax:SSLCACertificateFile file-path
    Context:server config, virtual host
    Status:Extension
    Module:mod_ssl
    +

    +This directive sets the all-in-one file where you can assemble the +Certificates of Certification Authorities (CA) whose clients you deal +with. These are used for Client Authentication. Such a file is simply the +concatenation of the various PEM-encoded Certificate files, in order of +preference. This can be used alternatively and/or additionally to +SSLCACertificatePath.

    +

    Example

    +SSLCACertificateFile /usr/local/apache2/conf/ssl.crt/ca-bundle-client.crt +

    + +
    +
    top
    +

    SSLCACertificatePath Directive

    + + + + + + +
    Description:Directory of PEM-encoded CA Certificates for +Client Auth
    Syntax:SSLCACertificatePath directory-path
    Context:server config, virtual host
    Status:Extension
    Module:mod_ssl
    +

    +This directive sets the directory where you keep the Certificates of +Certification Authorities (CAs) whose clients you deal with. These are used to +verify the client certificate on Client Authentication.

    +

    +The files in this directory have to be PEM-encoded and are accessed through +hash filenames. So usually you can't just place the Certificate files +there: you also have to create symbolic links named +hash-value.N. And you should always make sure this directory +contains the appropriate symbolic links.

    +

    Example

    +SSLCACertificatePath /usr/local/apache2/conf/ssl.crt/ +

    + +
    +
    top
    +

    SSLCARevocationFile Directive

    + + + + + + +
    Description:File of concatenated PEM-encoded CA CRLs for +Client Auth
    Syntax:SSLCARevocationFile file-path
    Context:server config, virtual host
    Status:Extension
    Module:mod_ssl
    +

    +This directive sets the all-in-one file where you can +assemble the Certificate Revocation Lists (CRL) of Certification +Authorities (CA) whose clients you deal with. These are used +for Client Authentication. Such a file is simply the concatenation of +the various PEM-encoded CRL files, in order of preference. This can be +used alternatively and/or additionally to SSLCARevocationPath.

    +

    Example

    +SSLCARevocationFile /usr/local/apache2/conf/ssl.crl/ca-bundle-client.crl +

    + +
    +
    top
    +

    SSLCARevocationPath Directive

    + + + + + + +
    Description:Directory of PEM-encoded CA CRLs for +Client Auth
    Syntax:SSLCARevocationPath directory-path
    Context:server config, virtual host
    Status:Extension
    Module:mod_ssl
    +

    +This directive sets the directory where you keep the Certificate Revocation +Lists (CRL) of Certification Authorities (CAs) whose clients you deal with. +These are used to revoke the client certificate on Client Authentication.

    +

    +The files in this directory have to be PEM-encoded and are accessed through +hash filenames. So usually you have not only to place the CRL files there. +Additionally you have to create symbolic links named +hash-value.rN. And you should always make sure this directory +contains the appropriate symbolic links.

    +

    Example

    +SSLCARevocationPath /usr/local/apache2/conf/ssl.crl/ +

    + +
    +
    top
    +

    SSLCertificateChainFile Directive

    + + + + + + +
    Description:File of PEM-encoded Server CA Certificates
    Syntax:SSLCertificateChainFile file-path
    Context:server config, virtual host
    Status:Extension
    Module:mod_ssl
    +

    +This directive sets the optional all-in-one file where you can +assemble the certificates of Certification Authorities (CA) which form the +certificate chain of the server certificate. This starts with the issuing CA +certificate of of the server certificate and can range up to the root CA +certificate. Such a file is simply the concatenation of the various +PEM-encoded CA Certificate files, usually in certificate chain order.

    +

    +This should be used alternatively and/or additionally to SSLCACertificatePath for explicitly +constructing the server certificate chain which is sent to the browser +in addition to the server certificate. It is especially useful to +avoid conflicts with CA certificates when using client +authentication. Because although placing a CA certificate of the +server certificate chain into SSLCACertificatePath has the same effect +for the certificate chain construction, it has the side-effect that +client certificates issued by this same CA certificate are also +accepted on client authentication. That's usually not one expect.

    +

    +But be careful: Providing the certificate chain works only if you are using a +single (either RSA or DSA) based server certificate. If you are +using a coupled RSA+DSA certificate pair, this will work only if actually both +certificates use the same certificate chain. Else the browsers will be +confused in this situation.

    +

    Example

    +SSLCertificateChainFile /usr/local/apache2/conf/ssl.crt/ca.crt +

    + +
    +
    top
    +

    SSLCertificateFile Directive

    + + + + + + +
    Description:Server PEM-encoded X.509 Certificate file
    Syntax:SSLCertificateFile file-path
    Context:server config, virtual host
    Status:Extension
    Module:mod_ssl
    +

    +This directive points to the PEM-encoded Certificate file for the server and +optionally also to the corresponding RSA or DSA Private Key file for it +(contained in the same file). If the contained Private Key is encrypted the +Pass Phrase dialog is forced at startup time. This directive can be used up to +two times (referencing different filenames) when both a RSA and a DSA based +server certificate is used in parallel.

    +

    Example

    +SSLCertificateFile /usr/local/apache2/conf/ssl.crt/server.crt +

    + +
    +
    top
    +

    SSLCertificateKeyFile Directive

    + + + + + + +
    Description:Server PEM-encoded Private Key file
    Syntax:SSLCertificateKeyFile file-path
    Context:server config, virtual host
    Status:Extension
    Module:mod_ssl
    +

    +This directive points to the PEM-encoded Private Key file for the +server. If the Private Key is not combined with the Certificate in the +SSLCertificateFile, use this additional directive to +point to the file with the stand-alone Private Key. When +SSLCertificateFile is used and the file +contains both the Certificate and the Private Key this directive need +not be used. But we strongly discourage this practice. Instead we +recommend you to separate the Certificate and the Private Key. If the +contained Private Key is encrypted, the Pass Phrase dialog is forced +at startup time. This directive can be used up to two times +(referencing different filenames) when both a RSA and a DSA based +private key is used in parallel.

    +

    Example

    +SSLCertificateKeyFile /usr/local/apache2/conf/ssl.key/server.key +

    + +
    +
    top
    +

    SSLCipherSuite Directive

    + + + + + + + + +
    Description:Cipher Suite available for negotiation in SSL +handshake
    Syntax:SSLCipherSuite cipher-spec
    Default:SSLCipherSuite ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP
    Context:server config, virtual host, directory, .htaccess
    Override:AuthConfig
    Status:Extension
    Module:mod_ssl
    +

    +This complex directive uses a colon-separated cipher-spec string +consisting of OpenSSL cipher specifications to configure the Cipher Suite the +client is permitted to negotiate in the SSL handshake phase. Notice that this +directive can be used both in per-server and per-directory context. In +per-server context it applies to the standard SSL handshake when a connection +is established. In per-directory context it forces a SSL renegotation with the +reconfigured Cipher Suite after the HTTP request was read but before the HTTP +response is sent.

    +

    +An SSL cipher specification in cipher-spec is composed of 4 major +attributes plus a few extra minor ones:

    +
      +
    • Key Exchange Algorithm:
      + RSA or Diffie-Hellman variants. +
    • +
    • Authentication Algorithm:
      + RSA, Diffie-Hellman, DSS or none. +
    • +
    • Cipher/Encryption Algorithm:
      + DES, Triple-DES, RC4, RC2, IDEA or none. +
    • +
    • MAC Digest Algorithm:
      + MD5, SHA or SHA1. +
    • +
    +

    An SSL cipher can also be an export cipher and is either a SSLv2 or SSLv3/TLSv1 +cipher (here TLSv1 is equivalent to SSLv3). To specify which ciphers to use, +one can either specify all the Ciphers, one at a time, or use aliases to +specify the preference and order for the ciphers (see Table +1).

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Tag Description
    Key Exchange Algorithm:
    kRSA RSA key exchange
    kDHr Diffie-Hellman key exchange with RSA key
    kDHd Diffie-Hellman key exchange with DSA key
    kEDH Ephemeral (temp.key) Diffie-Hellman key exchange (no cert)
    Authentication Algorithm:
    aNULL No authentication
    aRSA RSA authentication
    aDSS DSS authentication
    aDH Diffie-Hellman authentication
    Cipher Encoding Algorithm:
    eNULL No encoding
    DES DES encoding
    3DES Triple-DES encoding
    RC4 RC4 encoding
    RC2 RC2 encoding
    IDEA IDEA encoding
    MAC Digest Algorithm:
    MD5 MD5 hash function
    SHA1 SHA1 hash function
    SHA SHA hash function
    Aliases:
    SSLv2 all SSL version 2.0 ciphers
    SSLv3 all SSL version 3.0 ciphers
    TLSv1 all TLS version 1.0 ciphers
    EXP all export ciphers
    EXPORT40 all 40-bit export ciphers only
    EXPORT56 all 56-bit export ciphers only
    LOW all low strength ciphers (no export, single DES)
    MEDIUM all ciphers with 128 bit encryption
    HIGH all ciphers using Triple-DES
    RSA all ciphers using RSA key exchange
    DH all ciphers using Diffie-Hellman key exchange
    EDH all ciphers using Ephemeral Diffie-Hellman key exchange
    ADH all ciphers using Anonymous Diffie-Hellman key exchange
    DSS all ciphers using DSS authentication
    NULL all ciphers using no encryption
    +

    +Now where this becomes interesting is that these can be put together +to specify the order and ciphers you wish to use. To speed this up +there are also aliases (SSLv2, SSLv3, TLSv1, EXP, LOW, MEDIUM, +HIGH) for certain groups of ciphers. These tags can be joined +together with prefixes to form the cipher-spec. Available +prefixes are:

    +
      +
    • none: add cipher to list
    • +
    • +: add ciphers to list and pull them to current location in list
    • +
    • -: remove cipher from list (can be added later again)
    • +
    • !: kill cipher from list completely (can not be added later again)
    • +
    +

    A simpler way to look at all of this is to use the ``openssl ciphers +-v'' command which provides a nice way to successively create the +correct cipher-spec string. The default cipher-spec string +is ``ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP'' which +means the following: first, remove from consideration any ciphers that do not +authenticate, i.e. for SSL only the Anonymous Diffie-Hellman ciphers. Next, +use ciphers using RC4 and RSA. Next include the high, medium and then the low +security ciphers. Finally pull all SSLv2 and export ciphers to the +end of the list.

    +
    +$ openssl ciphers -v 'ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP'
    +NULL-SHA                SSLv3 Kx=RSA      Au=RSA  Enc=None      Mac=SHA1
    +NULL-MD5                SSLv3 Kx=RSA      Au=RSA  Enc=None      Mac=MD5
    +EDH-RSA-DES-CBC3-SHA    SSLv3 Kx=DH       Au=RSA  Enc=3DES(168) Mac=SHA1
    +...                     ...               ...     ...           ...
    +EXP-RC4-MD5             SSLv3 Kx=RSA(512) Au=RSA  Enc=RC4(40)   Mac=MD5  export
    +EXP-RC2-CBC-MD5         SSLv2 Kx=RSA(512) Au=RSA  Enc=RC2(40)   Mac=MD5  export
    +EXP-RC4-MD5             SSLv2 Kx=RSA(512) Au=RSA  Enc=RC4(40)   Mac=MD5  export
    +
    +

    The complete list of particular RSA & DH ciphers for SSL is given in Table 2.

    +

    Example

    +SSLCipherSuite RSA:!EXP:!NULL:+HIGH:+MEDIUM:-LOW +

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Cipher-Tag Protocol Key Ex. Auth. Enc. MAC Type
    RSA Ciphers:
    DES-CBC3-SHA SSLv3 RSA RSA 3DES(168) SHA1
    DES-CBC3-MD5 SSLv2 RSA RSA 3DES(168) MD5
    IDEA-CBC-SHA SSLv3 RSA RSA IDEA(128) SHA1
    RC4-SHA SSLv3 RSA RSA RC4(128) SHA1
    RC4-MD5 SSLv3 RSA RSA RC4(128) MD5
    IDEA-CBC-MD5 SSLv2 RSA RSA IDEA(128) MD5
    RC2-CBC-MD5 SSLv2 RSA RSA RC2(128) MD5
    RC4-MD5 SSLv2 RSA RSA RC4(128) MD5
    DES-CBC-SHA SSLv3 RSA RSA DES(56) SHA1
    RC4-64-MD5 SSLv2 RSA RSA RC4(64) MD5
    DES-CBC-MD5 SSLv2 RSA RSA DES(56) MD5
    EXP-DES-CBC-SHA SSLv3 RSA(512) RSA DES(40) SHA1 export
    EXP-RC2-CBC-MD5 SSLv3 RSA(512) RSA RC2(40) MD5 export
    EXP-RC4-MD5 SSLv3 RSA(512) RSA RC4(40) MD5 export
    EXP-RC2-CBC-MD5 SSLv2 RSA(512) RSA RC2(40) MD5 export
    EXP-RC4-MD5 SSLv2 RSA(512) RSA RC4(40) MD5 export
    NULL-SHA SSLv3 RSA RSA None SHA1
    NULL-MD5 SSLv3 RSA RSA None MD5
    Diffie-Hellman Ciphers:
    ADH-DES-CBC3-SHA SSLv3 DH None 3DES(168) SHA1
    ADH-DES-CBC-SHA SSLv3 DH None DES(56) SHA1
    ADH-RC4-MD5 SSLv3 DH None RC4(128) MD5
    EDH-RSA-DES-CBC3-SHA SSLv3 DH RSA 3DES(168) SHA1
    EDH-DSS-DES-CBC3-SHA SSLv3 DH DSS 3DES(168) SHA1
    EDH-RSA-DES-CBC-SHA SSLv3 DH RSA DES(56) SHA1
    EDH-DSS-DES-CBC-SHA SSLv3 DH DSS DES(56) SHA1
    EXP-EDH-RSA-DES-CBC-SHA SSLv3 DH(512) RSA DES(40) SHA1 export
    EXP-EDH-DSS-DES-CBC-SHA SSLv3 DH(512) DSS DES(40) SHA1 export
    EXP-ADH-DES-CBC-SHA SSLv3 DH(512) None DES(40) SHA1 export
    EXP-ADH-RC4-MD5 SSLv3 DH(512) None RC4(40) MD5 export
    + +
    +
    top
    +

    SSLEngine Directive

    + + + + + + + +
    Description:SSL Engine Operation Switch
    Syntax:SSLEngine on|off
    Default:SSLEngine off
    Context:server config, virtual host
    Status:Extension
    Module:mod_ssl
    +

    +This directive toggles the usage of the SSL/TLS Protocol Engine. This +is usually used inside a <VirtualHost> section to enable SSL/TLS for a +particular virtual host. By default the SSL/TLS Protocol Engine is +disabled for both the main server and all configured virtual hosts.

    +

    Example

    +<VirtualHost _default_:443>
    +SSLEngine on
    +...
    +</VirtualHost> +

    + +
    +
    top
    +

    SSLInsecureRenegotiation Directive

    + + + + + + + + +
    Description:Option to enable support for insecure renegotiation
    Syntax:SSLInsecureRenegotiation flag
    Default:SSLInsecureRenegotiation off
    Context:server config, virtual host
    Status:Extension
    Module:mod_ssl
    Compatibility:Available in httpd 2.0.64 and later, if using OpenSSL 0.9.8m or later
    +

    As originally specified, all versions of the SSL and TLS protocols +(up to and including TLS/1.2) were vulnerable to a Man-in-the-Middle +attack +(CVE-2009-3555) +during a renegotiation. This vulnerability allowed an attacker to +"prefix" a chosen plaintext to the HTTP request as seen by the web +server. A protocol extension was developed which fixed this +vulnerability if supported by both client and server.

    + +

    If mod_ssl is linked against OpenSSL version 0.9.8m +or later, by default renegotiation is only supported with +clients supporting the new protocol extension. If this directive is +enabled, renegotiation will be allowed with old (unpatched) clients, +albeit insecurely.

    + +

    Security warning

    +

    If this directive is enabled, SSL connections will be vulnerable to +the Man-in-the-Middle prefix attack as described +in CVE-2009-3555.

    +
    + +

    Example

    +SSLInsecureRenegotiation on +

    + +

    The SSL_SECURE_RENEG environment variable can be used +from an SSI or CGI script to determine whether secure renegotiation is +supported for a given SSL connection.

    + + +
    +
    top
    +

    SSLMutex Directive

    + + + + + + + +
    Description:Semaphore for internal mutual exclusion of +operations
    Syntax:SSLMutex type
    Default:SSLMutex none
    Context:server config
    Status:Extension
    Module:mod_ssl
    +

    +This configures the SSL engine's semaphore (aka. lock) which is used for mutual +exclusion of operations which have to be done in a synchronized way between the +pre-forked Apache server processes. This directive can only be used in the +global server context because it's only useful to have one global mutex. +This directive is designed to closely match the +AcceptMutex directive

    +

    +The following Mutex types are available:

    +
      +
    • none | no +

      + This is the default where no Mutex is used at all. Use it at your own + risk. But because currently the Mutex is mainly used for synchronizing + write access to the SSL Session Cache you can live without it as long + as you accept a sometimes garbled Session Cache. So it's not recommended + to leave this the default. Instead configure a real Mutex.

    • +
    • posixsem +

      + This is an elegant Mutex variant where a Posix Semaphore is used when possible. + It is only available when the underlying platform + and APR supports it.

    • +
    • sysvsem +

      + This is a somewhat elegant Mutex variant where a SystemV IPC Semaphore is used when + possible. It is possible to "leak" SysV semaphores if processes crash before + the semaphore is removed. It is only available when the underlying platform + and APR supports it.

    • +
    • sem +

      + This directive tells the SSL Module to pick the "best" semaphore implementation + available to it, choosing between Posix and SystemV IPC, in that order. It is only + available when the underlying platform and APR supports at least one of the 2.

    • +
    • pthread +

      + This directive tells the SSL Module to use Posix thread mutexes. It is only available + if the underlying platform and APR supports it.

    • +
    • fcntl:/path/to/mutex +

      + This is a portable Mutex variant where a physical (lock-)file and the fcntl() + fucntion are used as the Mutex. + Always use a local disk filesystem for /path/to/mutex and never a file + residing on a NFS- or AFS-filesystem. It is only available when the underlying platform + and APR supports it. Note: Internally, the Process ID (PID) of the + Apache parent process is automatically appended to + /path/to/mutex to make it unique, so you don't have to worry + about conflicts yourself. Notice that this type of mutex is not available + under the Win32 environment. There you have to use the semaphore + mutex.

    • +
    • flock:/path/to/mutex +

      + This is similar to the fcntl:/path/to/mutex method with the + exception that the flock() function is used to provide file + locking. It is only available when the underlying platform + and APR supports it.

    • +
    • file:/path/to/mutex +

      + This directive tells the SSL Module to pick the "best" file locking implementation + available to it, choosing between fcntl and flock, + in that order. It is only available when the underlying platform and APR supports + at least one of the 2.

    • +
    • default | yes +

      + This directive tells the SSL Module to pick the default locking implementation + as determined by the platform and APR.

    • +
    +

    Example

    +SSLMutex file:/usr/local/apache/logs/ssl_mutex +

    + +
    +
    top
    +

    SSLOptions Directive

    + + + + + + + +
    Description:Configure various SSL engine run-time options
    Syntax:SSLOptions [+|-]option ...
    Context:server config, virtual host, directory, .htaccess
    Override:Options
    Status:Extension
    Module:mod_ssl
    +

    +This directive can be used to control various run-time options on a +per-directory basis. Normally, if multiple SSLOptions +could apply to a directory, then the most specific one is taken +completely; the options are not merged. However if all the +options on the SSLOptions directive are preceded by a +plus (+) or minus (-) symbol, the options +are merged. Any options preceded by a + are added to the +options currently in force, and any options preceded by a +- are removed from the options currently in force.

    +

    +The available options are:

    +
      +
    • StdEnvVars +

      + When this option is enabled, the standard set of SSL related CGI/SSI + environment variables are created. This per default is disabled for + performance reasons, because the information extraction step is a + rather expensive operation. So one usually enables this option for + CGI and SSI requests only.

      +
    • +
    • CompatEnvVars +

      + When this option is enabled, additional CGI/SSI environment variables are + created for backward compatibility to other Apache SSL solutions. Look in + the Compatibility chapter for details + on the particular variables generated.

      +
    • +
    • ExportCertData +

      + When this option is enabled, additional CGI/SSI environment variables are + created: SSL_SERVER_CERT, SSL_CLIENT_CERT and + SSL_CLIENT_CERT_CHAINn (with n = 0,1,2,..). + These contain the PEM-encoded X.509 Certificates of server and client for + the current HTTPS connection and can be used by CGI scripts for deeper + Certificate checking. Additionally all other certificates of the client + certificate chain are provided, too. This bloats up the environment a + little bit which is why you have to use this option to enable it on + demand.

      +
    • +
    • FakeBasicAuth +

      + When this option is enabled, the Subject Distinguished Name (DN) of the + Client X509 Certificate is translated into a HTTP Basic Authorization + username. This means that the standard Apache authentication methods can + be used for access control. The user name is just the Subject of the + Client's X509 Certificate (can be determined by running OpenSSL's + openssl x509 command: openssl x509 -noout -subject -in + certificate.crt). Note that no password is + obtained from the user. Every entry in the user file needs this password: + ``xxj31ZMTZzkVA'', which is the DES-encrypted version of the + word `password''. Those who live under MD5-based encryption + (for instance under FreeBSD or BSD/OS, etc.) should use the following MD5 + hash of the same word: ``$1$OXLyS...$Owx8s2/m9/gfkcRVXzgoE/''.

      +
    • +
    • StrictRequire +

      + This forces forbidden access when SSLRequireSSL or + SSLRequire successfully decided that access should be + forbidden. Usually the default is that in the case where a ``Satisfy + any'' directive is used, and other access restrictions are passed, + denial of access due to SSLRequireSSL or + SSLRequire is overridden (because that's how the Apache + Satisfy mechanism should work.) But for strict access restriction + you can use SSLRequireSSL and/or SSLRequire in + combination with an ``SSLOptions +StrictRequire''. Then an + additional ``Satisfy Any'' has no chance once mod_ssl has + decided to deny access.

      +
    • +
    • OptRenegotiate +

      + This enables optimized SSL connection renegotiation handling when SSL + directives are used in per-directory context. By default a strict + scheme is enabled where every per-directory reconfiguration of + SSL parameters causes a full SSL renegotiation handshake. When this + option is used mod_ssl tries to avoid unnecessary handshakes by doing more + granular (but still safe) parameter checks. Nevertheless these granular + checks sometimes maybe not what the user expects, so enable this on a + per-directory basis only, please.

      +
    • +
    +

    Example

    +SSLOptions +FakeBasicAuth -StrictRequire
    +<Files ~ "\.(cgi|shtml)$">
    + SSLOptions +StdEnvVars +CompatEnvVars -ExportCertData
    +<Files> +

    + +
    +
    top
    +

    SSLPassPhraseDialog Directive

    + + + + + + + +
    Description:Type of pass phrase dialog for encrypted private +keys
    Syntax:SSLPassPhraseDialog type
    Default:SSLPassPhraseDialog builtin
    Context:server config
    Status:Extension
    Module:mod_ssl
    +

    +When Apache starts up it has to read the various Certificate (see +SSLCertificateFile) and +Private Key (see SSLCertificateKeyFile) files of the +SSL-enabled virtual servers. Because for security reasons the Private +Key files are usually encrypted, mod_ssl needs to query the +administrator for a Pass Phrase in order to decrypt those files. This +query can be done in two ways which can be configured by +type:

    +
      +
    • builtin +

      + This is the default where an interactive terminal dialog occurs at startup + time just before Apache detaches from the terminal. Here the administrator + has to manually enter the Pass Phrase for each encrypted Private Key file. + Because a lot of SSL-enabled virtual hosts can be configured, the + following reuse-scheme is used to minimize the dialog: When a Private Key + file is encrypted, all known Pass Phrases (at the beginning there are + none, of course) are tried. If one of those known Pass Phrases succeeds no + dialog pops up for this particular Private Key file. If none succeeded, + another Pass Phrase is queried on the terminal and remembered for the next + round (where it perhaps can be reused).

      +

      + This scheme allows mod_ssl to be maximally flexible (because for N encrypted + Private Key files you can use N different Pass Phrases - but then + you have to enter all of them, of course) while minimizing the terminal + dialog (i.e. when you use a single Pass Phrase for all N Private Key files + this Pass Phrase is queried only once).

    • + +
    • exec:/path/to/program +

      + Here an external program is configured which is called at startup for each + encrypted Private Key file. It is called with two arguments (the first is + of the form ``servername:portnumber'', the second is either + ``RSA'' or ``DSA''), which indicate for which + server and algorithm it has to print the corresponding Pass Phrase to + stdout. The intent is that this external program first runs + security checks to make sure that the system is not compromised by an + attacker, and only when these checks were passed successfully it provides + the Pass Phrase.

      +

      + Both these security checks, and the way the Pass Phrase is determined, can + be as complex as you like. Mod_ssl just defines the interface: an + executable program which provides the Pass Phrase on stdout. + Nothing more or less! So, if you're really paranoid about security, here + is your interface. Anything else has to be left as an exercise to the + administrator, because local security requirements are so different.

      +

      + The reuse-algorithm above is used here, too. In other words: The external + program is called only once per unique Pass Phrase.

    • +
    +

    +Example:

    +

    +SSLPassPhraseDialog exec:/usr/local/apache/sbin/pp-filter +

    + +
    +
    top
    +

    SSLProtocol Directive

    + + + + + + + + +
    Description:Configure usable SSL protocol flavors
    Syntax:SSLProtocol [+|-]protocol ...
    Default:SSLProtocol all
    Context:server config, virtual host
    Override:Options
    Status:Extension
    Module:mod_ssl
    +

    +This directive can be used to control the SSL protocol flavors mod_ssl should +use when establishing its server environment. Clients then can only connect +with one of the provided protocols.

    +

    +The available (case-insensitive) protocols are:

    +
      +
    • SSLv2 +

      + This is the Secure Sockets Layer (SSL) protocol, version 2.0. It is the + original SSL protocol as designed by Netscape Corporation.

    • + +
    • SSLv3 +

      + This is the Secure Sockets Layer (SSL) protocol, version 3.0. It is the + successor to SSLv2 and the currently (as of February 1999) de-facto + standardized SSL protocol from Netscape Corporation. It's supported by + almost all popular browsers.

    • + +
    • TLSv1 +

      + This is the Transport Layer Security (TLS) protocol, version 1.0. It is the + successor to SSLv3 and currently (as of February 1999) still under + construction by the Internet Engineering Task Force (IETF). It's still + not supported by any popular browsers.

    • + +
    • All +

      + This is a shortcut for ``+SSLv2 +SSLv3 +TLSv1'' and a + convinient way for enabling all protocols except one when used in + combination with the minus sign on a protocol as the example above + shows.

    • +
    +

    Example

    +# enable SSLv3 and TLSv1, but not SSLv2
    +SSLProtocol all -SSLv2 +

    + +
    +
    top
    +

    SSLProxyCACertificateFile Directive

    + + + + + + +
    Description:File of concatenated PEM-encoded CA Certificates +for Remote Server Auth
    Syntax:SSLProxyCACertificateFile file-path
    Context:server config, virtual host
    Status:Extension
    Module:mod_ssl
    +

    +This directive sets the all-in-one file where you can assemble the +Certificates of Certification Authorities (CA) whose remote servers you deal +with. These are used for Remote Server Authentication. Such a file is simply the +concatenation of the various PEM-encoded Certificate files, in order of +preference. This can be used alternatively and/or additionally to +SSLProxyCACertificatePath.

    +

    Example

    +SSLProxyCACertificateFile /usr/local/apache2/conf/ssl.crt/ca-bundle-remote-server.crt +

    + +
    +
    top
    +

    SSLProxyCACertificatePath Directive

    + + + + + + +
    Description:Directory of PEM-encoded CA Certificates for +Remote Server Auth
    Syntax:SSLProxyCACertificatePath directory-path
    Context:server config, virtual host
    Status:Extension
    Module:mod_ssl
    +

    +This directive sets the directory where you keep the Certificates of +Certification Authorities (CAs) whose remote servers you deal with. These are used to +verify the remote server certificate on Remote Server Authentication.

    +

    +The files in this directory have to be PEM-encoded and are accessed through +hash filenames. So usually you can't just place the Certificate files +there: you also have to create symbolic links named +hash-value.N. And you should always make sure this directory +contains the appropriate symbolic links. Use the Makefile which +comes with mod_ssl to accomplish this task.

    +

    Example

    +SSLProxyCACertificatePath /usr/local/apache2/conf/ssl.crt/ +

    + +
    +
    top
    +

    SSLProxyCARevocationFile Directive

    + + + + + + +
    Description:File of concatenated PEM-encoded CA CRLs for +Remote Server Auth
    Syntax:SSLProxyCARevocationFile file-path
    Context:server config, virtual host
    Status:Extension
    Module:mod_ssl
    +

    +This directive sets the all-in-one file where you can +assemble the Certificate Revocation Lists (CRL) of Certification +Authorities (CA) whose remote servers you deal with. These are used +for Remote Server Authentication. Such a file is simply the concatenation of +the various PEM-encoded CRL files, in order of preference. This can be +used alternatively and/or additionally to SSLProxyCARevocationPath.

    +

    Example

    +SSLProxyCARevocationFile /usr/local/apache2/conf/ssl.crl/ca-bundle-remote-server.crl +

    + +
    +
    top
    +

    SSLProxyCARevocationPath Directive

    + + + + + + +
    Description:Directory of PEM-encoded CA CRLs for +Remote Server Auth
    Syntax:SSLProxyCARevocationPath directory-path
    Context:server config, virtual host
    Status:Extension
    Module:mod_ssl
    +

    +This directive sets the directory where you keep the Certificate Revocation +Lists (CRL) of Certification Authorities (CAs) whose remote servers you deal with. +These are used to revoke the remote server certificate on Remote Server Authentication.

    +

    +The files in this directory have to be PEM-encoded and are accessed through +hash filenames. So usually you have not only to place the CRL files there. +Additionally you have to create symbolic links named +hash-value.rN. And you should always make sure this directory +contains the appropriate symbolic links. Use the Makefile which +comes with mod_ssl to accomplish this task.

    +

    Example

    +SSLProxyCARevocationPath /usr/local/apache2/conf/ssl.crl/ +

    + +
    +
    top
    +

    SSLProxyCipherSuite Directive

    + + + + + + + + +
    Description:Cipher Suite available for negotiation in SSL +proxy handshake
    Syntax:SSLProxyCipherSuite cipher-spec
    Default:SSLProxyCipherSuite ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP
    Context:server config, virtual host, directory, .htaccess
    Override:AuthConfig
    Status:Extension
    Module:mod_ssl
    +

    Equivalent to SSLCipherSuite, but for the proxy connection. +Please refer to SSLCipherSuite +for additional information.

    + +
    +
    top
    +

    SSLProxyEngine Directive

    + + + + + + + +
    Description:SSL Proxy Engine Operation Switch
    Syntax:SSLProxyEngine on|off
    Default:SSLProxyEngine off
    Context:server config, virtual host
    Status:Extension
    Module:mod_ssl
    +

    +This directive toggles the usage of the SSL/TLS Protocol Engine for proxy. This +is usually used inside a <VirtualHost> section to enable SSL/TLS for proxy +usage in a particular virtual host. By default the SSL/TLS Protocol Engine is +disabled for proxy image both for the main server and all configured virtual hosts.

    +

    Example

    +<VirtualHost _default_:443>
    +SSLProxyEngine on
    +...
    +</VirtualHost> +

    + +
    +
    top
    +

    SSLProxyMachineCertificateFile Directive

    + + + + + + + +
    Description:File of concatenated PEM-encoded client certificates and keys to be used by the proxy
    Syntax:SSLProxyMachineCertificateFile filename
    Context:server config
    Override:Not applicable
    Status:Extension
    Module:mod_ssl
    +

    +This directive sets the all-in-one file where you keep the certificates and +keys used for authentication of the proxy server to remote servers. +

    +

    +This referenced file is simply the concatenation of the various PEM-encoded +certificate files, in order of preference. Use this directive alternatively +or additionally to SSLProxyMachineCertificatePath. +

    +
    +

    Currently there is no support for encrypted private keys

    +
    +

    +Example:

    +

    +SSLProxyMachineCertificateFile /usr/local/apache2/conf/ssl.crt/proxy.pem +

    + +
    +
    top
    +

    SSLProxyMachineCertificatePath Directive

    + + + + + + + +
    Description:Directory of PEM-encoded client certificates and keys to be used by the proxy
    Syntax:SSLProxyMachineCertificatePath directory
    Context:server config
    Override:Not applicable
    Status:Extension
    Module:mod_ssl
    +

    +This directive sets the directory where you keep the certificates and +keys used for authentication of the proxy server to remote servers. +

    +

    The files in this directory must be PEM-encoded and are accessed through +hash filenames. Additionally, you must create symbolic links named +hash-value.N. And you should always make sure this +directory contains the appropriate symbolic links. Use the Makefile which +comes with mod_ssl to accomplish this task. +

    +
    +

    Currently there is no support for encrypted private keys

    +
    +

    +Example:

    +

    +SSLProxyMachineCertificatePath /usr/local/apache2/conf/proxy.crt/ +

    + +
    +
    top
    +

    SSLProxyProtocol Directive

    + + + + + + + + +
    Description:Configure usable SSL protocol flavors for proxy usage
    Syntax:SSLProxyProtocol [+|-]protocol ...
    Default:SSLProxyProtocol all
    Context:server config, virtual host
    Override:Options
    Status:Extension
    Module:mod_ssl
    + +

    +This directive can be used to control the SSL protocol flavors mod_ssl should +use when establishing its server environment for proxy . It will only connect +to servers using one of the provided protocols.

    +

    Please refer to SSLProtocol +for additional information. +

    + +
    +
    top
    +

    SSLProxyVerify Directive

    + + + + + + + + +
    Description:Type of remote server Certificate verification
    Syntax:SSLProxyVerify level
    Default:SSLProxyVerify none
    Context:server config, virtual host, directory, .htaccess
    Override:AuthConfig
    Status:Extension
    Module:mod_ssl
    +

    +This directive sets the Certificate verification level for the remote server +Authentication. Notice that this directive can be used both in per-server and +per-directory context. In per-server context it applies to the remote server +authentication process used in the standard SSL handshake when a connection is +established. In per-directory context it forces a SSL renegotation with the +reconfigured remote server verification level after the HTTP request was read but +before the HTTP response is sent.

    +

    +The following levels are available for level:

    +
      +
    • none: + no remote server Certificate is required at all
    • +
    • optional: + the remote server may present a valid Certificate
    • +
    • require: + the remote server has to present a valid Certificate
    • +
    • optional_no_ca: + the remote server may present a valid Certificate
      + but it need not to be (successfully) verifiable.
    • +
    +

    In practice only levels none and +require are really interesting, because level +optional doesn't work with all servers and level +optional_no_ca is actually against the idea of +authentication (but can be used to establish SSL test pages, etc.)

    +

    Example

    +SSLProxyVerify require +

    + +
    +
    top
    +

    SSLProxyVerifyDepth Directive

    + + + + + + + + +
    Description:Maximum depth of CA Certificates in Remote Server +Certificate verification
    Syntax:SSLProxyVerifyDepth number
    Default:SSLProxyVerifyDepth 1
    Context:server config, virtual host, directory, .htaccess
    Override:AuthConfig
    Status:Extension
    Module:mod_ssl
    +

    +This directive sets how deeply mod_ssl should verify before deciding that the +remote server does not have a valid certificate. Notice that this directive can be +used both in per-server and per-directory context. In per-server context it +applies to the client authentication process used in the standard SSL +handshake when a connection is established. In per-directory context it forces +a SSL renegotation with the reconfigured remote server verification depth after the +HTTP request was read but before the HTTP response is sent.

    +

    +The depth actually is the maximum number of intermediate certificate issuers, +i.e. the number of CA certificates which are max allowed to be followed while +verifying the remote server certificate. A depth of 0 means that self-signed +remote server certificates are accepted only, the default depth of 1 means +the remote server certificate can be self-signed or has to be signed by a CA +which is directly known to the server (i.e. the CA's certificate is under +SSLProxyCACertificatePath), etc.

    +

    Example

    +SSLProxyVerifyDepth 10 +

    + +
    +
    top
    +

    SSLRandomSeed Directive

    + + + + + + +
    Description:Pseudo Random Number Generator (PRNG) seeding +source
    Syntax:SSLRandomSeed context source +[bytes]
    Context:server config
    Status:Extension
    Module:mod_ssl
    +

    +This configures one or more sources for seeding the Pseudo Random Number +Generator (PRNG) in OpenSSL at startup time (context is +startup) and/or just before a new SSL connection is established +(context is connect). This directive can only be used +in the global server context because the PRNG is a global facility.

    +

    +The following source variants are available:

    +
      +
    • builtin +

      This is the always available builtin seeding source. It's usage + consumes minimum CPU cycles under runtime and hence can be always used + without drawbacks. The source used for seeding the PRNG contains of the + current time, the current process id and (when applicable) a randomly + choosen 1KB extract of the inter-process scoreboard structure of Apache. + The drawback is that this is not really a strong source and at startup + time (where the scoreboard is still not available) this source just + produces a few bytes of entropy. So you should always, at least for the + startup, use an additional seeding source.

    • +
    • file:/path/to/source +

      + This variant uses an external file /path/to/source as the + source for seeding the PRNG. When bytes is specified, only the + first bytes number of bytes of the file form the entropy (and + bytes is given to /path/to/source as the first + argument). When bytes is not specified the whole file forms the + entropy (and 0 is given to /path/to/source as + the first argument). Use this especially at startup time, for instance + with an available /dev/random and/or + /dev/urandom devices (which usually exist on modern Unix + derivates like FreeBSD and Linux).

      +

      + But be careful: Usually /dev/random provides only as + much entropy data as it actually has, i.e. when you request 512 bytes of + entropy, but the device currently has only 100 bytes available two things + can happen: On some platforms you receive only the 100 bytes while on + other platforms the read blocks until enough bytes are available (which + can take a long time). Here using an existing /dev/urandom is + better, because it never blocks and actually gives the amount of requested + data. The drawback is just that the quality of the received data may not + be the best.

      +

      + On some platforms like FreeBSD one can even control how the entropy is + actually generated, i.e. by which system interrupts. More details one can + find under rndcontrol(8) on those platforms. Alternatively, when + your system lacks such a random device, you can use tool + like EGD + (Entropy Gathering Daemon) and run it's client program with the + exec:/path/to/program/ variant (see below) or use + egd:/path/to/egd-socket (see below).

    • + +
    • exec:/path/to/program +

      + This variant uses an external executable + /path/to/program as the source for seeding the + PRNG. When bytes is specified, only the first + bytes number of bytes of its stdout contents + form the entropy. When bytes is not specified, the + entirety of the data produced on stdout form the + entropy. Use this only at startup time when you need a very strong + seeding with the help of an external program (for instance as in + the example above with the truerand utility you can + find in the mod_ssl distribution which is based on the AT&T + truerand library). Using this in the connection context + slows down the server too dramatically, of course. So usually you + should avoid using external programs in that context.

    • +
    • egd:/path/to/egd-socket (Unix only) +

      + This variant uses the Unix domain socket of the + external Entropy Gathering Daemon (EGD) (see http://www.lothar.com/tech + /crypto/) to seed the PRNG. Use this if no random device exists + on your platform.

    • +
    +

    Example

    +SSLRandomSeed startup builtin
    +SSLRandomSeed startup file:/dev/random
    +SSLRandomSeed startup file:/dev/urandom 1024
    +SSLRandomSeed startup exec:/usr/local/bin/truerand 16
    +SSLRandomSeed connect builtin
    +SSLRandomSeed connect file:/dev/random
    +SSLRandomSeed connect file:/dev/urandom 1024
    +

    + +
    +
    top
    +

    SSLRequire Directive

    + + + + + + + +
    Description:Allow access only when an arbitrarily complex +boolean expression is true
    Syntax:SSLRequire expression
    Context:directory, .htaccess
    Override:AuthConfig
    Status:Extension
    Module:mod_ssl
    +

    +This directive specifies a general access requirement which has to be +fulfilled in order to allow access. It's a very powerful directive because the +requirement specification is an arbitrarily complex boolean expression +containing any number of access checks.

    +

    +The expression must match the following syntax (given as a BNF +grammar notation):

    +
    +
    +expr     ::= "true" | "false"
    +           | "!" expr
    +           | expr "&&" expr
    +           | expr "||" expr
    +           | "(" expr ")"
    +           | comp
    +
    +comp     ::= word "==" word | word "eq" word
    +           | word "!=" word | word "ne" word
    +           | word "<"  word | word "lt" word
    +           | word "<=" word | word "le" word
    +           | word ">"  word | word "gt" word
    +           | word ">=" word | word "ge" word
    +           | word "in" "{" wordlist "}"
    +           | word "=~" regex
    +           | word "!~" regex
    +
    +wordlist ::= word
    +           | wordlist "," word
    +
    +word     ::= digit
    +           | cstring
    +           | variable
    +           | function
    +
    +digit    ::= [0-9]+
    +cstring  ::= "..."
    +variable ::= "%{" varname "}"
    +function ::= funcname "(" funcargs ")"
    +
    +
    +

    while for varname any variable from Table 3 can be used. Finally for +funcname the following functions are available:

    +
      +
    • file(filename) +

      + This function takes one string argument and expands to the contents of the + file. This is especially useful for matching this contents against a + regular expression, etc.

      +
    • +
    +

    Notice that expression is first parsed into an internal machine +representation and then evaluated in a second step. Actually, in Global and +Per-Server Class context expression is parsed at startup time and +at runtime only the machine representation is executed. For Per-Directory +context this is different: here expression has to be parsed and +immediately executed for every request.

    +

    Example

    +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]+$/ +

    + +

    Standard CGI/1.0 and Apache variables:

    +
    +HTTP_USER_AGENT        PATH_INFO             AUTH_TYPE
    +HTTP_REFERER           QUERY_STRING          SERVER_SOFTWARE
    +HTTP_COOKIE            REMOTE_HOST           API_VERSION
    +HTTP_FORWARDED         REMOTE_IDENT          TIME_YEAR
    +HTTP_HOST              IS_SUBREQ             TIME_MON
    +HTTP_PROXY_CONNECTION  DOCUMENT_ROOT         TIME_DAY
    +HTTP_ACCEPT            SERVER_ADMIN          TIME_HOUR
    +HTTP:headername        SERVER_NAME           TIME_MIN
    +THE_REQUEST            SERVER_PORT           TIME_SEC
    +REQUEST_METHOD         SERVER_PROTOCOL       TIME_WDAY
    +REQUEST_SCHEME         REMOTE_ADDR           TIME
    +REQUEST_URI            REMOTE_USER           ENV:variablename
    +REQUEST_FILENAME
    +
    +

    SSL-related variables:

    +
    +HTTPS                  SSL_CLIENT_M_VERSION   SSL_SERVER_M_VERSION
    +                       SSL_CLIENT_M_SERIAL    SSL_SERVER_M_SERIAL
    +SSL_PROTOCOL           SSL_CLIENT_V_START     SSL_SERVER_V_START
    +SSL_SESSION_ID         SSL_CLIENT_V_END       SSL_SERVER_V_END
    +SSL_CIPHER             SSL_CLIENT_S_DN        SSL_SERVER_S_DN
    +SSL_CIPHER_EXPORT      SSL_CLIENT_S_DN_C      SSL_SERVER_S_DN_C
    +SSL_CIPHER_ALGKEYSIZE  SSL_CLIENT_S_DN_ST     SSL_SERVER_S_DN_ST
    +SSL_CIPHER_USEKEYSIZE  SSL_CLIENT_S_DN_L      SSL_SERVER_S_DN_L
    +SSL_VERSION_LIBRARY    SSL_CLIENT_S_DN_O      SSL_SERVER_S_DN_O
    +SSL_VERSION_INTERFACE  SSL_CLIENT_S_DN_OU     SSL_SERVER_S_DN_OU
    +                       SSL_CLIENT_S_DN_CN     SSL_SERVER_S_DN_CN
    +                       SSL_CLIENT_S_DN_T      SSL_SERVER_S_DN_T
    +                       SSL_CLIENT_S_DN_I      SSL_SERVER_S_DN_I
    +                       SSL_CLIENT_S_DN_G      SSL_SERVER_S_DN_G
    +                       SSL_CLIENT_S_DN_S      SSL_SERVER_S_DN_S
    +                       SSL_CLIENT_S_DN_D      SSL_SERVER_S_DN_D
    +                       SSL_CLIENT_S_DN_UID    SSL_SERVER_S_DN_UID
    +                       SSL_CLIENT_S_DN_Email  SSL_SERVER_S_DN_Email
    +                       SSL_CLIENT_I_DN        SSL_SERVER_I_DN
    +                       SSL_CLIENT_I_DN_C      SSL_SERVER_I_DN_C
    +                       SSL_CLIENT_I_DN_ST     SSL_SERVER_I_DN_ST
    +                       SSL_CLIENT_I_DN_L      SSL_SERVER_I_DN_L
    +                       SSL_CLIENT_I_DN_O      SSL_SERVER_I_DN_O
    +                       SSL_CLIENT_I_DN_OU     SSL_SERVER_I_DN_OU
    +                       SSL_CLIENT_I_DN_CN     SSL_SERVER_I_DN_CN
    +                       SSL_CLIENT_I_DN_T      SSL_SERVER_I_DN_T
    +                       SSL_CLIENT_I_DN_I      SSL_SERVER_I_DN_I
    +                       SSL_CLIENT_I_DN_G      SSL_SERVER_I_DN_G
    +                       SSL_CLIENT_I_DN_S      SSL_SERVER_I_DN_S
    +                       SSL_CLIENT_I_DN_D      SSL_SERVER_I_DN_D
    +                       SSL_CLIENT_I_DN_UID    SSL_SERVER_I_DN_UID
    +                       SSL_CLIENT_I_DN_Email  SSL_SERVER_I_DN_Email
    +                       SSL_CLIENT_A_SIG       SSL_SERVER_A_SIG
    +                       SSL_CLIENT_A_KEY       SSL_SERVER_A_KEY
    +                       SSL_CLIENT_CERT        SSL_SERVER_CERT
    +                       SSL_CLIENT_CERT_CHAINn
    +                       SSL_CLIENT_VERIFY
    +
    + +
    +
    top
    +

    SSLRequireSSL Directive

    + + + + + + + +
    Description:Deny access when SSL is not used for the +HTTP request
    Syntax:SSLRequireSSL
    Context:directory, .htaccess
    Override:AuthConfig
    Status:Extension
    Module:mod_ssl
    +

    +This directive forbids access unless HTTP over SSL (i.e. HTTPS) is enabled for +the current connection. This is very handy inside the SSL-enabled virtual +host or directories for defending against configuration errors that expose +stuff that should be protected. When this directive is present all requests +are denied which are not using SSL.

    +

    Example

    +SSLRequireSSL +

    + +
    +
    top
    +

    SSLSessionCache Directive

    + + + + + + + +
    Description:Type of the global/inter-process SSL Session +Cache
    Syntax:SSLSessionCache type
    Default:SSLSessionCache none
    Context:server config
    Status:Extension
    Module:mod_ssl
    +

    +This configures the storage type of the global/inter-process SSL Session +Cache. This cache is an optional facility which speeds up parallel request +processing. For requests to the same server process (via HTTP keep-alive), +OpenSSL already caches the SSL session information locally. But because modern +clients request inlined images and other data via parallel requests (usually +up to four parallel requests are common) those requests are served by +different pre-forked server processes. Here an inter-process cache +helps to avoid unneccessary session handshakes.

    +

    +The following two storage types are currently supported:

    +
      +
    • none +

      + This is the default and just disables the global/inter-process Session + Cache. There is no drawback in functionality, but a noticeable speed + penalty can be observed.

    • +
    • dbm:/path/to/datafile +

      + This makes use of a DBM hashfile on the local disk to synchronize the + local OpenSSL memory caches of the server processes. The slight increase + in I/O on the server results in a visible request speedup for your + clients, so this type of storage is generally recommended.

    • +
    • shm:/path/to/datafile[(size)] +

      + This makes use of a high-performance hash table (approx. size bytes + in size) inside a shared memory segment in RAM (established via + /path/to/datafile) to synchronize the local OpenSSL memory + caches of the server processes. This storage type is not available on all + platforms.

    • +
    +

    Examples

    +SSLSessionCache dbm:/usr/local/apache/logs/ssl_gcache_data
    +SSLSessionCache shm:/usr/local/apache/logs/ssl_gcache_data(512000) +

    + +
    +
    top
    +

    SSLSessionCacheTimeout Directive

    + + + + + + + +
    Description:Number of seconds before an SSL session expires +in the Session Cache
    Syntax:SSLSessionCacheTimeout seconds
    Default:SSLSessionCacheTimeout 300
    Context:server config, virtual host
    Status:Extension
    Module:mod_ssl
    +

    +This directive sets the timeout in seconds for the information stored in the +global/inter-process SSL Session Cache and the OpenSSL internal memory cache. +It can be set as low as 15 for testing, but should be set to higher +values like 300 in real life.

    +

    Example

    +SSLSessionCacheTimeout 600 +

    + +
    +
    top
    +

    SSLUserName Directive

    + + + + + + + + +
    Description:Variable name to determine user name
    Syntax:SSLUserName varname
    Context:server config, directory, .htaccess
    Override:AuthConfig
    Status:Extension
    Module:mod_ssl
    Compatibility:Available in Apache 2.0.51 and later
    +

    +This directive sets the "user" field in the Apache request object. +This is used by lower modules to identify the user with a character +string. In particular, this may cause the environment variable +REMOTE_USER to be set. The varname can be +any of the SSL environment variables.

    +

    Example

    +SSLUserName SSL_CLIENT_S_DN_CN +

    + +
    +
    top
    +

    SSLVerifyClient Directive

    + + + + + + + + +
    Description:Type of Client Certificate verification
    Syntax:SSLVerifyClient level
    Default:SSLVerifyClient none
    Context:server config, virtual host, directory, .htaccess
    Override:AuthConfig
    Status:Extension
    Module:mod_ssl
    +

    +This directive sets the Certificate verification level for the Client +Authentication. Notice that this directive can be used both in per-server and +per-directory context. In per-server context it applies to the client +authentication process used in the standard SSL handshake when a connection is +established. In per-directory context it forces a SSL renegotation with the +reconfigured client verification level after the HTTP request was read but +before the HTTP response is sent.

    +

    +The following levels are available for level:

    +
      +
    • none: + no client Certificate is required at all
    • +
    • optional: + the client may present a valid Certificate
    • +
    • require: + the client has to present a valid Certificate
    • +
    • optional_no_ca: + the client may present a valid Certificate
      + but it need not to be (successfully) verifiable.
    • +
    +

    In practice only levels none and +require are really interesting, because level +optional doesn't work with all browsers and level +optional_no_ca is actually against the idea of +authentication (but can be used to establish SSL test pages, etc.)

    +

    Example

    +SSLVerifyClient require +

    + +
    +
    top
    +

    SSLVerifyDepth Directive

    + + + + + + + + +
    Description:Maximum depth of CA Certificates in Client +Certificate verification
    Syntax:SSLVerifyDepth number
    Default:SSLVerifyDepth 1
    Context:server config, virtual host, directory, .htaccess
    Override:AuthConfig
    Status:Extension
    Module:mod_ssl
    +

    +This directive sets how deeply mod_ssl should verify before deciding that the +clients don't have a valid certificate. Notice that this directive can be +used both in per-server and per-directory context. In per-server context it +applies to the client authentication process used in the standard SSL +handshake when a connection is established. In per-directory context it forces +a SSL renegotation with the reconfigured client verification depth after the +HTTP request was read but before the HTTP response is sent.

    +

    +The depth actually is the maximum number of intermediate certificate issuers, +i.e. the number of CA certificates which are max allowed to be followed while +verifying the client certificate. A depth of 0 means that self-signed client +certificates are accepted only, the default depth of 1 means the client +certificate can be self-signed or has to be signed by a CA which is directly +known to the server (i.e. the CA's certificate is under +SSLCACertificatePath), etc.

    +

    Example

    +SSLVerifyDepth 10 +

    + +
    +
    +
    +

    Available Languages:  en 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_status.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_status.html new file mode 100644 index 00000000..065e8e12 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_status.html @@ -0,0 +1,17 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_status.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: mod_status.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: mod_status.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: mod_status.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_status.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_status.html.en new file mode 100644 index 00000000..dbba412b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_status.html.en @@ -0,0 +1,164 @@ + + + +mod_status - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_status

    +
    +

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

    +
    + + + +
    Description:Provides information on server activity and +performance
    Status:Base
    Module Identifier:status_module
    Source File:mod_status.c
    +

    Summary

    + +

    The Status module allows a server administrator to find out + how well their server is performing. A HTML page is presented + that gives the current server statistics in an easily readable + form. If required this page can be made to automatically + refresh (given a compatible browser). Another page gives a + simple machine-readable list of the current server state.

    + +

    The details given are:

    + +
      +
    • The number of worker serving requests
    • + +
    • The number of idle worker
    • + +
    • The status of each worker, the number of requests that + worker has performed and the total number of bytes served by + the worker (*)
    • + +
    • A total number of accesses and byte count served (*)
    • + +
    • The time the server was started/restarted and the time it + has been running for
    • + +
    • Averages giving the number of requests per second, the + number of bytes served per second and the average number of + bytes per request (*)
    • + +
    • The current percentage CPU used by each worker and in + total by Apache (*)
    • + +
    • The current hosts and requests being processed (*)
    • +
    + +

    The lines marked "(*)" are only available if + ExtendedStatus + is On.

    +
    + +
    top
    +
    +

    Enabling Status Support

    + + +

    To enable status reports only for browsers from the foo.com + domain add this code to your httpd.conf + configuration file

    +

    + <Location /server-status>
    + SetHandler server-status
    +
    + Order Deny,Allow
    + Deny from all
    + Allow from .foo.com
    + </Location> +

    + +

    You can now access server statistics by using a Web browser + to access the page + http://your.server.name/server-status

    +
    top
    +
    +

    Automatic Updates

    + + +

    You can get the status page to update itself automatically if + you have a browser that supports "refresh". Access the page + http://your.server.name/server-status?refresh=N to + refresh the page every N seconds.

    + +
    top
    +
    +

    Machine Readable Status File

    + + +

    A machine-readable version of the status file is available by + accessing the page + http://your.server.name/server-status?auto. This + is useful when automatically run, see the Perl program in the + /support directory of Apache, + log_server_status.

    + +
    + It should be noted that if mod_status is + compiled into the server, its handler capability is available + in all configuration files, including + per-directory files (e.g., + .htaccess). This may have security-related + ramifications for your site. +
    + +
    +
    top
    +

    ExtendedStatus Directive

    + + + + + + + + +
    Description:Keep track of extended status information for each +request
    Syntax:ExtendedStatus On|Off
    Default:ExtendedStatus Off
    Context:server config
    Status:Base
    Module:mod_status
    Compatibility:ExtendedStatus is only available in Apache 1.3.2 and +later.
    +

    This setting applies to the entire server, and cannot be + enabled or disabled on a virtualhost-by-virtualhost basis. + The collection of extended status information can slow down + the server.

    + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_status.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_status.html.ja.utf8 new file mode 100644 index 00000000..d77d93c0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_status.html.ja.utf8 @@ -0,0 +1,158 @@ + + + +mod_status - Apache HTTP サーバ + + + + + + +
    <-
    + +
    +

    Apache モジュール mod_status

    +
    +

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

    +
    +
    This translation may be out of date. Check the + English version for recent changes.
    + + + +
    説明:サーバの活動状況と性能に関する情報を提供する
    ステータス:Base
    モジュール識別子:status_module
    ソースファイル:mod_status.c
    +

    概要

    + +

    この Status モジュールによりサーバ管理者はサーバがどのくらい + の性能で動作しているかを知ることができるようになります。 + 現時点でのサーバの統計情報を読みやすい形式で現した HTML ページが + 表示されます。必要であれば、このページは自動的にリフレッシュさせる + こともできます (互換性のあるブラウザを使用している場合)。 + 別に、現時点でのサーバの状態を単純な機械読み取り可能なリストで + 現すページもあります。

    + +

    表示される情報は:

    + +
      +
    • リクエストを扱っているワーカーの数
    • + +
    • アイドル (訳注: リクエストを扱っていない) ワーカーの数
    • + +
    • 各ワーカーの状態、ワーカーが扱ったリクエストの数、 + ワーカーが送った総バイト数 (*)
    • + +
    • 総アクセス数と総バイト数 (*)
    • + +
    • サーバが起動もしくは再起動された時刻と動作している時間
    • + +
    • 平均の 1 秒あたりのリクエスト数、1 秒あたりの送られたバイト数、 + リクエストあたりのバイト数 (*)
    • + +
    • 各ワーカーと Apache 全体で使用されている CPU の割合 (*)
    • + +
    • 現時点のホストと処理されているリクエスト (*)
    • +
    + +

    "(*)" の付いている情報を表示するためにはコンパイル時のオプション + を使用する必要があります。これらの統計情報を得るために必要な + コードは標準の Apache には含まれていません。

    +
    + +
    top
    +
    +

    Status を使用可能にする

    + + +

    foo.com ドメインからのブラウザのみに対して + ステータスの報告を使用可能にするには + 以下のコードを httpd.conf 設定ファイルに追加します

    +

    + <Location /server-status>
    + SetHandler server-status
    +
    + Order Deny,Allow
    + Deny from all
    + Allow from .foo.com
    + </Location> +

    + +

    これで、サーバの統計情報をウェブブラウザを使って + http://your.server.name/server-status をアクセスすることにより + 知ることができるようになります。

    +
    top
    +
    +

    自動更新

    + + +

    ブラウザが「リフレシュ」機能をサポートしていれば、ステータスページを + 自動的に更新するようにできます。N 秒毎に更新させるためには + http://your.server.name/server-status?refresh=N + というページをアクセスしてください。

    + +
    top
    +
    +

    機械読み取り可能なステータスファイル

    + + +

    http://your.server.name/server-status?auto を + アクセスすることにより、ステータスファイルの機械読み取り可能なバージョンを + 得ることができます。これは自動的に実行されるときに便利です。 + Apache の /support ディレクトリにある + Perl プログラム log_server_status を見てください。

    + +
    + mod_status がサーバに組み込まれている + 場合、ハンドラの機能はディレクトリ毎のファイル + (すなわち、.htaccess) も含むすべての + 設定ファイルで使用可能になることには注意をしておく必要があります。 + これは、サイトによってはセキュリティに関する望ましくない結果を + もたらすことがあるかもしれません。 +
    + +
    +
    top
    +

    ExtendedStatus ディレクティブ

    + + + + + + + + +
    説明:各リクエストに対して拡張ステータス情報を保存する
    構文:ExtendedStatus On|Off
    デフォルト:ExtendedStatus Off
    コンテキスト:サーバ設定ファイル
    ステータス:Base
    モジュール:mod_status
    互換性:ExtendedStatus は Apache 1.3.2 以降でのみ使用可能
    +

    この設定はサーバ全体に対して適用され、バーチャルホスト毎に + 変更することはできません。拡張ステータス情報の収集はサーバの + 動作を遅くすることがあります。

    + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_status.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_status.html.ko.euc-kr new file mode 100644 index 00000000..1892706f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_status.html.ko.euc-kr @@ -0,0 +1,152 @@ + + + +mod_status - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    ¾ÆÆÄÄ¡ ¸ðµâ mod_status

    +
    +

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

    +
    +
    ÀÌ ¹®¼­´Â ÃÖ½ÅÆÇ ¹ø¿ªÀÌ ¾Æ´Õ´Ï´Ù. + ÃÖ±Ù¿¡ º¯°æµÈ ³»¿ëÀº ¿µ¾î ¹®¼­¸¦ Âü°íÇϼ¼¿ä.
    + + + +
    ¼³¸í:¼­¹ö È°µ¿°ú ¼º´É¿¡ ´ëÇÑ Á¤º¸¸¦ Á¦°øÇÑ´Ù
    »óÅÂ:Base
    ¸ðµâ¸í:status_module
    ¼Ò½ºÆÄÀÏ:mod_status.c
    +

    ¿ä¾à

    + +

    Status ¸ðµâÀº ¼­¹ö °ü¸®ÀÚ¿¡°Ô ¼­¹öÀÇ »óŸ¦ º¸¿©ÁØ´Ù. + ½±°Ô ÀÐÀ» ¼ö ÀÖ´Â HTML ÆäÀÌÁö·Î ÇöÀç ¼­¹öÅë°è¸¦ º¸¿©ÁØ´Ù. + ÇÊ¿äÇÏ´Ù¸é (Ç¥ÁØÀ» µû¸£´Â ºê¶ó¿ìÀú¿¡¼­) ÆäÀÌÁö¸¦ ÀÚµ¿À¸·Î + °»½ÅÇÒ ¼ö ÀÖ´Ù. ÇöÀç ¼­¹ö »óŸ¦ ÄÄÇ»ÅÍ°¡ ÀÐÀ» ¼ö ÀÖ´Â + °£´ÜÇÑ ¸ñ·ÏÀ¸·Î º¸¿©ÁÙ ¼öµµ ÀÖ´Ù.

    + +

    ¾Ë·ÁÁÖ´Â Á¤º¸´Â:

    + +
      +
    • ¿äûÀ» ¼­ºñ½ºÇÏ´Â workerÀÇ °³¼ö
    • + +
    • ½¬°í ÀÖ´Â(idle) workerÀÇ °³¼ö
    • + +
    • °¢ workerµéÀÇ »óÅÂ, worker°¡ ó¸®ÇÑ ¿äûÀÇ °³¼ö¿Í + worker°¡ ¼­ºñ½ºÇÑ Àüü ¹ÙÀÌÆ®¼ö (*)
    • + +
    • ÃÑ Á¢±Ù Ƚ¼ö¿Í ¼­ºñ½ºÇÑ ¹ÙÀÌÆ®¼ö (*)
    • + +
    • ¼­¹ö°¡ ½ÃÀÛȤÀº Àç½ÃÀÛÇÑ ½Ã°£°ú µ¿ÀÛÇÑ ½Ã°£
    • + +
    • ÃÊ´ç ¿äû¼ö Æò±Õ, ÃÊ´ç ¼­ºñ½ºÇÑ ¹ÙÀÌÆ®¼ö¿Í ¿äû´ç + ¹ÙÀÌÆ®¼ö Æò±Õ (*)
    • + +
    • ÇöÀç ¾ÆÆÄÄ¡ Àüü¿Í °¢ workerµéÀÇ CPU ºñÀ² (*)
    • + +
    • ÇöÀç ó¸®ÇÏ°í Àִ ȣ½ºÆ®¿Í ¿äû (*)
    • +
    + +

    Ç¥ÁØ ¾ÆÆÄÄ¡¿¡´Â "(*)"·Î Ç¥½ÃÇÑ Åë°è¸¦ ¾òÀ» ¼ö ¾ø´Ù. + ÀÌ Á¤º¸¸¦ º¸·Á¸é ÄÄÆÄÀϽà ¿É¼ÇÀ» »ç¿ëÇØ¾ß ÇÑ´Ù.

    +
    + +
    top
    +
    +

    Status »ç¿ëÇϱâ

    + + +

    foo.com µµ¸ÞÀο¡¼­ Á¢±ÙÇÑ ºê¶ó¿ìÀú¿¡°Ô¸¸ »óŸ¦ º¸¿©ÁÖ·Á¸é + httpd.conf ¼³Á¤ÆÄÀÏ¿¡ ´ÙÀ½°ú °°ÀÌ Ãß°¡ÇÑ´Ù

    +

    + <Location /server-status>
    + SetHandler server-status
    +
    + Order Deny,Allow
    + Deny from all
    + Allow from .foo.com
    + </Location> +

    + +

    ÀÌÁ¦ À¥ºê¶ó¿ìÀú·Î + http://your.server.name/server-status ÆäÀÌÁö¿¡ + Á¢±ÙÇÏ¸é ¼­¹ö Åë°è¸¦ º¼ ¼ö ÀÖ´Ù.

    +
    top
    +
    +

    ÀÚµ¿ °»½Å

    + + +

    ºê¶ó¿ìÀú°¡ "Àç°»½Å"À» Áö¿øÇÑ´Ù¸é status ÆäÀÌÁö¸¦ ÀÚµ¿À¸·Î + °»½ÅÇÒ ¼ö ÀÖ´Ù. N Ãʸ¶´Ù °»½ÅÇÏ·Á¸é + http://your.server.name/server-status?refresh=N + ÆäÀÌÁö¸¦ »ç¿ëÇ϶ó.

    + +
    top
    +
    +

    ÄÄÇ»ÅÍ°¡ ÀÐÀ» ¼ö ÀÖ´Â Status ÆÄÀÏ

    + + +

    http://your.server.name/server-status?auto¿¡¼­ + ÄÄÇ»ÅÍ°¡ ½±°Ô ÀÐÀ» ¼ö ÀÖ´Â status ÆÄÀÏÀ» ¾òÀ» ¼ö ÀÖ´Ù. ÀÌ + Çü½ÄÀº ¾ÆÆÄÄ¡ /support µð·ºÅ丮¿¡ ÀÖ´Â + log_server_status Perl ÇÁ·Î±×·¥°ú °°ÀÌ ÀÚµ¿À¸·Î + ½ÇÇàÇÏ´Â ÇÁ·Î±×·¥¿¡ À¯¿ëÇÏ´Ù.

    + +
    + mod_status¸¦ ¼­¹ö¿Í °°ÀÌ + ÄÄÆÄÀÏÇÏ¿´´Ù¸é µð·ºÅ丮º° ¼³Á¤ÆÄÀÏÀ» (¿¹¸¦ + µé¾î, .htaccess) Æ÷ÇÔÇÏ¿© ¸ðµç + ¼³Á¤ÆÄÀÏ¿¡¼­ Çڵ鷯¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ±×·¡¼­ »çÀÌÆ®¿¡ + º¸¾È ¹®Á¦°¡ ¹ß»ýÇÒ ¼ö ÀÖ´Ù. +
    + +
    +
    top
    +

    ExtendedStatus Áö½Ã¾î

    + + + + + + + + +
    ¼³¸í:°¢ ¿äû¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ »óÅ Á¤º¸¸¦ ±â·ÏÇÑ´Ù
    ¹®¹ý:ExtendedStatus On|Off
    ±âº»°ª:ExtendedStatus Off
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤
    »óÅÂ:Base
    ¸ðµâ:mod_status
    Áö¿ø:ExtendedStatus´Â ¾ÆÆÄÄ¡ 1.3.2 ÀÌÈÄ¿¡¸¸ ÀÖ´Ù.
    +

    ÀÌ ¼³Á¤Àº ¼­¹ö Àüü¿¡ Àû¿ëµÇ¸ç, °¡»óÈ£½ºÆ®º°·Î Å°°í ²ø + ¼ö ¾ø´Ù. ÀÚ¼¼ÇÑ »óÅ Á¤º¸¸¦ ¸ðÀ¸¸é ¼­¹ö°¡ ´À·ÁÁú ¼ö ÀÖ´Ù.

    + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_status.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_status.html.tr.utf8 new file mode 100644 index 00000000..b907a068 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_status.html.tr.utf8 @@ -0,0 +1,159 @@ + + + +mod_status - Apache HTTP Sunucusu + + + + + + +
    <-
    + +
    +

    Apache Modülü mod_status

    +
    +

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

    +
    + + + +
    Açıklama:Sunucu etkinliği ve başarımı hakkında bilgi sağlar.
    Durum:Temel
    Modül Betimleyici:status_module
    Kaynak Dosyası:mod_status.c
    +

    Özet

    + +

    mod_status modülü, sunucu yöneticisinin, HTTP sunucusunun + ne kadar başarılı olduğu hakkında bilgi edinmesini sağlar. Bilgiler, + kolayca okunabilen bir HTML sayfası olarak sunulur ve o anki sunucu + istatistiklerinden oluşur. Gerekirse sayfa kendiliğinden tazelenebilir + (uyumlu bir tarayıcı gerekir). Diğer sayfa o anki sunucu durumunu makine + tarafından okunabilen biçimde listeler.

    + +

    Sunulan bilgiler şunlardır:

    + +
      +
    • Ä°stekleri sunan çocuk süreç sayısı
    • + +
    • Boştaki çocuk süreçlerin sayısı
    • + +
    • Her çocuk sürecin durumu, çocuk sürecin işleme tabi tuttuğu istek + sayısı ve sunduğu bayt sayısı (*)
    • + +
    • Toplam erişim sayısı ve sunulan toplam bayt sayısı (*)
    • + +
    • Sunucunun kaç kere başlatıldığı/yeniden başlatıldığı ve ne kadar + zamandır çalışmakta olduğu
    • + +
    • Saniyedeki ortalama istek sayısı, saniyedeki bayt sayısı ve istek + başına ortalama bayt sayısı (*)
    • + +
    • Apache tarafınan toplamda ve her çocuk süreç tarafından ayrı ayrı + kullanılan o anki işlemci zamanı yüzdesi (*)
    • + +
    • O an işlem görmekte olan konakların ve isteklerin sayısı (*)
    • +
    + +

    "(*)" imli bilgiler sadece ExtendedStatus yönergesinin değeri On olduğu + takdirde mevcuttur.

    +
    + +
    top
    +
    +

    Durum Bilgisi Desteğinin Etkinleştirilmesi

    + + +

    Durum raporları, sadece mesela.dom alanından ve sadece tarayıcılar için + etkin kılınmak istenirse httpd.conf dosyasına şu satırlar + eklenebilir:

    + +

    + <Location /server-status>
    + + SetHandler server-status
    +
    + Order Deny,Allow
    + Deny from all
    + Allow from .mesela.dom
    +
    + </Location> +

    + +

    Sunucu istatistiklerine tarayıcınızla erişmek isterseniz, + http://sunucunuzun.ismi.buraya/server-status + şeklinde bir istek yapabilirsiniz.

    +
    top
    +
    +

    Sayfanın Tazelenmesi

    + + +

    Tarayıcınız “tazeleme” yeteneğine sahipse durum sayfası düzenli + aralıklarla güncellenecektir. Sayfanın N saniyede bir güncellenmesini + isterseniz isteği şöyle yapabilirsiniz:
    + http://sunucunuzun.ismi.buraya/server-status?refresh=N

    + +
    top
    +
    +

    Makine Tarafından Okunabilen Durum Dosyası

    + + +

    Durum dosyasının makine tarafından okunabilen sürümüne + http://sunucunuzun.ismi.buraya/server-status?auto + şeklinde bir istek yaparak erişebilirsiniz. Bu, kendiliğinden çalıştığı + takdirde yararlıdır; Apache dağıtımının /support dizininde + bulunan log_server_status isimli perl betiğine bakınız.

    + +

    Güvenlik

    + mod_status sunucu içinde derlendiği takdirde + istatistikleri raporlama yeteneği dizin içi yapılandırma dosyaları + (.htaccess gibi) dahil tüm yapılandırma dosyaları + için kullanılabilir olacaktır. Bu durum güvenlik ile ilgili olarak + siteniz için içinden çıkılması güç durumlara yol açabilir (çapanoğlu + durumu).
    + +
    +
    top
    +

    ExtendedStatus Yönergesi

    + + + + + + + + +
    Açıklama:Her istekte ek durum bilgisinin toplanmasını sağlar. +
    Sözdizimi:ExtendedStatus On|Off
    Öntanımlı:ExtendedStatus Off
    Bağlam:sunucu geneli
    Durum:Temel
    Modül:mod_status
    Uyumluluk:Apache 1.3.2 ve sonrasında mevcuttur.
    +

    Bu ayarlama sunucunun tamamını etkiler ve sanal konaklar için ayrı ayrı + etkin kılınamaz veya iptal edilemez. Ek durum bilgisinin toplanması + sunucuyu yavaşlatabilir.

    + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_suexec.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_suexec.html new file mode 100644 index 00000000..f5d06c29 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_suexec.html @@ -0,0 +1,17 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_suexec.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: mod_suexec.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: mod_suexec.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: mod_suexec.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_suexec.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_suexec.html.en new file mode 100644 index 00000000..7cd63384 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_suexec.html.en @@ -0,0 +1,82 @@ + + + +mod_suexec - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_suexec

    +
    +

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

    +
    + + + + +
    Description:Allows CGI scripts to run as a specified user +and Group
    Status:Extension
    Module Identifier:suexec_module
    Source File:mod_suexec.c
    Compatibility:Available in Apache 2.0 and later
    +

    Summary

    + +

    This module, in combination with the suexec support program allows + CGI scripts to run as a specified user and Group.

    +
    +

    Directives

    + +

    See also

    +
    + +
    top
    +

    SuexecUserGroup Directive

    + + + + + + + +
    Description:User and group for CGI programs to run as
    Syntax:SuexecUserGroup User Group
    Context:server config, virtual host
    Status:Extension
    Module:mod_suexec
    Compatibility:SuexecUserGroup is only available in 2.0 and +later.
    +

    The SuexecUserGroup directive allows you + to specify a user and group for CGI programs to run as. Non-CGI + requests are still processes with the user specified in the User directive. This directive replaces + the Apache 1.3 configuration of using the User and + Group directives inside of VirtualHosts.

    + +

    Example

    + + SuexecUserGroup nobody nogroup +

    + + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_suexec.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_suexec.html.ja.utf8 new file mode 100644 index 00000000..d4b3b68c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_suexec.html.ja.utf8 @@ -0,0 +1,83 @@ + + + +mod_suexec - Apache HTTP サーバ + + + + + + +
    <-
    + +
    +

    Apache モジュール mod_suexec

    +
    +

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

    +
    +
    This translation may be out of date. Check the + English version for recent changes.
    + + + + +
    説明:指定されたユーザとグループで CGI スクリプトを実行する
    ステータス:Extension
    モジュール識別子:suexec_module
    ソースファイル:mod_suexec.c
    互換性:Apache 2.0 以降で使用可能
    +

    概要

    + +

    このモジュールと suexec サポートプログラム + により、CGI スクリプトが指定されたユーザとグループで + 実行されるようにできます。

    +
    +

    ディレクティブ

    + +

    参照

    +
    + +
    top
    +

    SuexecUserGroup ディレクティブ

    + + + + + + + +
    説明:CGI プログラムのユーザパーミッション、グループパーミッション
    構文:SuexecUserGroup User Group
    コンテキスト:サーバ設定ファイル, バーチャルホスト
    ステータス:Extension
    モジュール:mod_suexec
    互換性:SuexecUserGroup は 2.0 以降でのみ使用可能。
    +

    SuexecUserGroup ディレクティブは CGI プログラム + が実行されるユーザとグループを指定できるようにします。CGI 以外の + リクエストは User ディレクティブで指定されたユーザのままで処理されます。 + このディレクティブは Apache 1.3 における VirtualHosts の中で + User ディレクティブと Group ディレクティブを使う用法の代わりになります。

    + +

    例

    + + SuexecUserGroup nobody nogroup +

    + + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_suexec.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_suexec.html.ko.euc-kr new file mode 100644 index 00000000..3ea7e8c0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_suexec.html.ko.euc-kr @@ -0,0 +1,83 @@ + + + +mod_suexec - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    ¾ÆÆÄÄ¡ ¸ðµâ mod_suexec

    +
    +

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

    +
    +
    ÀÌ ¹®¼­´Â ÃÖ½ÅÆÇ ¹ø¿ªÀÌ ¾Æ´Õ´Ï´Ù. + ÃÖ±Ù¿¡ º¯°æµÈ ³»¿ëÀº ¿µ¾î ¹®¼­¸¦ Âü°íÇϼ¼¿ä.
    + + + + +
    ¼³¸í:CGI ½ºÅ©¸³Æ®¸¦ ƯÁ¤ »ç¿ëÀÚ¿Í ±×·ì ±ÇÇÑÀ¸·Î ½ÇÇàÇÑ´Ù
    »óÅÂ:Extension
    ¸ðµâ¸í:suexec_module
    ¼Ò½ºÆÄÀÏ:mod_suexec.c
    Áö¿ø:¾ÆÆÄÄ¡ 2.0 ÀÌÈĺÎÅÍ
    +

    ¿ä¾à

    + +

    ÀÌ ¸ðµâÀº suexec Áö¿ø + ÇÁ·Î±×·¥À» »ç¿ëÇÏ¿© CGI ½ºÅ©¸³Æ®¸¦ ƯÁ¤ »ç¿ëÀÚ¿Í ±×·ì + ±ÇÇÑÀ¸·Î ½ÇÇàÇÑ´Ù.

    +
    +

    Áö½Ã¾îµé

    + +

    Âü°í

    +
    + +
    top
    +

    SuexecUserGroup Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:CGI ÇÁ·Î±×·¥ÀÌ »ç¿ëÇÒ »ç¿ëÀÚ¿Í ±×·ì ±ÇÇÑ
    ¹®¹ý:SuexecUserGroup User Group
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®
    »óÅÂ:Extension
    ¸ðµâ:mod_suexec
    Áö¿ø:SuexecUserGroupÀº 2.0 ÀÌÈÄ¿¡¸¸ ÀÖ´Ù.
    +

    SuexecUserGroup Áö½Ã¾î´Â CGI ÇÁ·Î±×·¥ÀÌ + »ç¿ëÇÒ »ç¿ëÀÚ¿Í ±×·ìÀ» ¼³Á¤ÇÑ´Ù. CGI°¡ ¾Æ´Ñ ¿äûÀº °è¼Ó + User Áö½Ã¾î·Î ÁöÁ¤ÇÑ »ç¿ëÀÚ°¡ ó¸®ÇÑ´Ù. ÀÌ Áö½Ã¾î´Â ¾ÆÆÄÄ¡ + 1.3¿¡¼­ VirtualHost ¾È¿¡ »ç¿ëÇÑ User¿Í Group Áö½Ã¾î¸¦ + ´ëüÇÑ´Ù.

    + +

    ¿¹Á¦

    + + SuexecUserGroup nobody nogroup +

    + + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_suexec.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_suexec.html.tr.utf8 new file mode 100644 index 00000000..e3e55255 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_suexec.html.tr.utf8 @@ -0,0 +1,84 @@ + + + +mod_suexec - Apache HTTP Sunucusu + + + + + + +
    <-
    + +
    +

    Apache Modülü mod_suexec

    +
    +

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

    +
    + + + + +
    Açıklama:CGI betiklerinin belli bir kullanıcı ve grubun aidiyetinde +çalışmasını mümkün kılar.
    Durum:Eklenti
    Modül Betimleyici:suexec_module
    Kaynak Dosyası:mod_suexec.c
    Uyumluluk:Apache 2.0 ve sonrasında mevcuttur.
    +

    Özet

    + +

    Bu modül suexec programı ile birlikte CGI + betiklerinin belli bir kullanıcı ve grubun aidiyetinde çalışmasını + mümkün kılar.

    +
    +

    Yönergeler

    + +

    Ayrıca bakınız:

    +
    + +
    top
    +

    SuexecUserGroup Yönergesi

    + + + + + + + +
    Açıklama:CGI betiklerini çalıştıracak kullanıcı ve grup belirtilir. +
    Sözdizimi:SuexecUserGroup Kullanıcı Grup
    Bağlam:sunucu geneli, sanal konak
    Durum:Eklenti
    Modül:mod_suexec
    Uyumluluk:Apache 2.0 ve sonrasında mevcuttur.
    +

    SuexecUserGroup yönergesi CGI programlarını + çalıştıracak kullanıcı ve grubu belirtmeye yarar. CGI harici istekler + hala User yönergesinde + belirtilen kullanıcı tarafından yerine getirilir. Bu yönerge, Apache + 1.3 yapılandırmasında sanal konak bölümlerindeki User ve + Group yönergelerinin yerini almak üzere tasarlanmıştır.

    + +

    Örnek

    + + SuexecUserGroup nobody nogroup +

    + + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_unique_id.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_unique_id.html new file mode 100644 index 00000000..b8be353a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_unique_id.html @@ -0,0 +1,13 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_unique_id.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: mod_unique_id.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: mod_unique_id.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_unique_id.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_unique_id.html.en new file mode 100644 index 00000000..27999b24 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_unique_id.html.en @@ -0,0 +1,215 @@ + + + +mod_unique_id - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_unique_id

    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + + + +
    Description:Provides an environment variable with a unique +identifier for each request
    Status:Extension
    Module Identifier:unique_id_module
    Source File:mod_unique_id.c
    +

    Summary

    + + +

    This module provides a magic token for each request which is + guaranteed to be unique across "all" requests under very + specific conditions. The unique identifier is even unique + across multiple machines in a properly configured cluster of + machines. The environment variable UNIQUE_ID is + set to the identifier for each request. Unique identifiers are + useful for various reasons which are beyond the scope of this + document.

    +
    +

    Directives

    +

    This module provides no directives.

    +

    Topics

    +
    +
    top
    +
    +

    Theory

    + + +

    First a brief recap of how the Apache server works on Unix + machines. This feature currently isn't supported on Windows NT. + On Unix machines, Apache creates several children, the children + process requests one at a time. Each child can serve multiple + requests in its lifetime. For the purpose of this discussion, + the children don't share any data with each other. We'll refer + to the children as httpd processes.

    + +

    Your website has one or more machines under your + administrative control, together we'll call them a cluster of + machines. Each machine can possibly run multiple instances of + Apache. All of these collectively are considered "the + universe", and with certain assumptions we'll show that in this + universe we can generate unique identifiers for each request, + without extensive communication between machines in the + cluster.

    + +

    The machines in your cluster should satisfy these + requirements. (Even if you have only one machine you should + synchronize its clock with NTP.)

    + +
      +
    • The machines' times are synchronized via NTP or other + network time protocol.
    • + +
    • The machines' hostnames all differ, such that the module + can do a hostname lookup on the hostname and receive a + different IP address for each machine in the cluster.
    • +
    + +

    As far as operating system assumptions go, we assume that + pids (process ids) fit in 32-bits. If the operating system uses + more than 32-bits for a pid, the fix is trivial but must be + performed in the code.

    + +

    Given those assumptions, at a single point in time we can + identify any httpd process on any machine in the cluster from + all other httpd processes. The machine's IP address and the pid + of the httpd process are sufficient to do this. So in order to + generate unique identifiers for requests we need only + distinguish between different points in time.

    + +

    To distinguish time we will use a Unix timestamp (seconds + since January 1, 1970 UTC), and a 16-bit counter. The timestamp + has only one second granularity, so the counter is used to + represent up to 65536 values during a single second. The + quadruple ( ip_addr, pid, time_stamp, counter ) is + sufficient to enumerate 65536 requests per second per httpd + process. There are issues however with pid reuse over time, and + the counter is used to alleviate this issue.

    + +

    When an httpd child is created, the counter is initialized + with ( current microseconds divided by 10 ) modulo 65536 (this + formula was chosen to eliminate some variance problems with the + low order bits of the microsecond timers on some systems). When + a unique identifier is generated, the time stamp used is the + time the request arrived at the web server. The counter is + incremented every time an identifier is generated (and allowed + to roll over).

    + +

    The kernel generates a pid for each process as it forks the + process, and pids are allowed to roll over (they're 16-bits on + many Unixes, but newer systems have expanded to 32-bits). So + over time the same pid will be reused. However unless it is + reused within the same second, it does not destroy the + uniqueness of our quadruple. That is, we assume the system does + not spawn 65536 processes in a one second interval (it may even + be 32768 processes on some Unixes, but even this isn't likely + to happen).

    + +

    Suppose that time repeats itself for some reason. That is, + suppose that the system's clock is screwed up and it revisits a + past time (or it is too far forward, is reset correctly, and + then revisits the future time). In this case we can easily show + that we can get pid and time stamp reuse. The choice of + initializer for the counter is intended to help defeat this. + Note that we really want a random number to initialize the + counter, but there aren't any readily available numbers on most + systems (i.e., you can't use rand() because you need + to seed the generator, and can't seed it with the time because + time, at least at one second resolution, has repeated itself). + This is not a perfect defense.

    + +

    How good a defense is it? Suppose that one of your machines + serves at most 500 requests per second (which is a very + reasonable upper bound at this writing, because systems + generally do more than just shovel out static files). To do + that it will require a number of children which depends on how + many concurrent clients you have. But we'll be pessimistic and + suppose that a single child is able to serve 500 requests per + second. There are 1000 possible starting counter values such + that two sequences of 500 requests overlap. So there is a 1.5% + chance that if time (at one second resolution) repeats itself + this child will repeat a counter value, and uniqueness will be + broken. This was a very pessimistic example, and with real + world values it's even less likely to occur. If your system is + such that it's still likely to occur, then perhaps you should + make the counter 32 bits (by editing the code).

    + +

    You may be concerned about the clock being "set back" during + summer daylight savings. However this isn't an issue because + the times used here are UTC, which "always" go forward. Note + that x86 based Unixes may need proper configuration for this to + be true -- they should be configured to assume that the + motherboard clock is on UTC and compensate appropriately. But + even still, if you're running NTP then your UTC time will be + correct very shortly after reboot.

    + +

    The UNIQUE_ID environment variable is + constructed by encoding the 112-bit (32-bit IP address, 32 bit + pid, 32 bit time stamp, 16 bit counter) quadruple using the + alphabet [A-Za-z0-9@-] in a manner similar to MIME + base64 encoding, producing 19 characters. The MIME base64 + alphabet is actually [A-Za-z0-9+/] however + + and / need to be specially encoded + in URLs, which makes them less desirable. All values are + encoded in network byte ordering so that the encoding is + comparable across architectures of different byte ordering. The + actual ordering of the encoding is: time stamp, IP address, + pid, counter. This ordering has a purpose, but it should be + emphasized that applications should not dissect the encoding. + Applications should treat the entire encoded + UNIQUE_ID as an opaque token, which can be + compared against other UNIQUE_IDs for equality + only.

    + +

    The ordering was chosen such that it's possible to change + the encoding in the future without worrying about collision + with an existing database of UNIQUE_IDs. The new + encodings should also keep the time stamp as the first element, + and can otherwise use the same alphabet and bit length. Since + the time stamps are essentially an increasing sequence, it's + sufficient to have a flag second in which all machines + in the cluster stop serving and request, and stop using the old + encoding format. Afterwards they can resume requests and begin + issuing the new encodings.

    + +

    This we believe is a relatively portable solution to this + problem. It can be extended to multithreaded systems like + Windows NT, and can grow with future needs. The identifiers + generated have essentially an infinite life-time because future + identifiers can be made longer as required. Essentially no + communication is required between machines in the cluster (only + NTP synchronization is required, which is low overhead), and no + communication between httpd processes is required (the + communication is implicit in the pid value assigned by the + kernel). In very specific situations the identifier can be + shortened, but more information needs to be assumed (for + example the 32-bit IP address is overkill for any site, but + there is no portable shorter replacement for it).

    +
    +
    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_unique_id.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_unique_id.html.ja.utf8 new file mode 100644 index 00000000..da79efd4 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_unique_id.html.ja.utf8 @@ -0,0 +1,216 @@ + + + +mod_unique_id - Apache HTTP サーバ + + + + + + +
    <-
    + +
    +

    Apache モジュール mod_unique_id

    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    +
    This translation may be out of date. Check the + English version for recent changes.
    + + + +
    説明:それぞれのリクエストに対する一意な識別子の入った環境変数を +提供する
    ステータス:Extension
    モジュール識別子:unique_id_module
    ソースファイル:mod_unique_id.c
    +

    概要

    + + +

    このモジュールは非常に制限された条件下で、 + それぞれのリクエストに「すべて」のリクエストに対して + 一意に決まることが保証されている魔法のトークンを提供します。 + この一意な識別子は、適切に設定されたクラスタでは複数の + マシンの間でさえも一意になります。それぞれのリクエストに対して環境変数 + UNIQUE_ID に識別子が設定されます。 + 一意な識別子が便利な理由はいろいろありますが、 + このドキュメントの目的からは外れるため、ここでは説明しません。

    +
    +

    ディレクティブ

    +

    このモジュールにディレクティブはありません。

    +

    トピック

    +
    +
    top
    +
    +

    理論

    + + +

    まずはじめに、Apache サーバが Unix + マシンでどのように動作をするかを簡単に説明します。 + この機能は現時点では Windows NT ではサポートされていません。 + Unix マシンでは Apache はいくつかの子プロセスを作成し、 + その子プロセスが一つずつリクエストを処理します。それぞれの子プロセスは、 + 生存期間中に複数のリクエストを扱うことができます。 + この議論では子プロセス間では一切データを共有しないことにします。 + 以後、この子プロセスのことを httpd プロセスと呼びます。

    + +

    あなたのウェブサイトにはあなたが管理するいくつかのマシンがあるとします。 + それらをまとめてクラスタと呼ぶことにします。それぞれのマシンは複数の + Apache を実行することもできます。 + これらすべてをまとめたものが「宇宙」であると考えられます。 + いくつかの仮定の下で、クラスタのマシン間がたくさん通信をすることなく、 + この宇宙の中でそれぞれのリクエストに一意な識別子を生成できることを示します。 +

    + +

    クラスタにあるマシンは以下の要求を見たさなければなりません。 + (マシンが一つだけだとしても、NTP で時計を合わせる方が良いです。)

    + +
      +
    • NTP や他のネットワーク上で時間を合わせるプロトコルによって + 各マシンの時間の同期が取られていること。
    • + +
    • モジュールがホスト名を引いて違う IP + アドレスを受け取ることができるように、 + クラスタのそれぞれのマシンのホスト名が違うこと。
    • +
    + +

    オペレーティングシステムにおいては、pid (プロセス ID) が + 32 ビットの範囲内であることを仮定します。オペレーティングシステムの + pid が 32 ビットを超える場合は、簡単な修正ではありますが、 + コードを変更する必要があります。

    + +

    これらの仮定が満たされていると、ある時点において、 + クラスタ内のどのマシンのどの httpd + プロセスでも、一意に同定することができます。これはマシンの IP + アドレスと httpd プロセスの pid で十分に行なうことができます。 + ですから、リクエストに一意な識別子を生成するためには、 + 時刻を区別する必要があるだけです。

    + +

    時刻を区別するために、Unix のタイムスタンプ (UTC の 1970 年 + 1 月 1 日からの秒数) と、16 ビットのカウンタを使います。 + タイムスタンプの粒度は一秒ですので、一秒間の 65536 + までの値を表現するためにカウンタを使用します。四つの値 + ( ip_addr, pid, time_stamp, counter ) で各 httpd + プロセスで一秒の間に 65536 リクエストを数えあげることができます。 + 時間が経つと pid が再利用されるという問題がありますが、 + この問題を解決するためにカウンタが使用されます。

    + +

    httpd の子プロセスが作成されると、カウンタは + (その時点のマイクロ秒 ÷ 10) modulo 65536 で初期化されます + (この式はいくつかのシステムにある、マイクロ秒の + タイマの下位ビットが異なるという問題を解決するために選ばれました)。 + 一意な識別子が生成されたとき、使用されるタイムスタンプは + ウェブサーバにリクエストが到着した時刻になります。 + カウンタは識別子が生成されるたびに増加します + (あふれた場合は 0 に戻ります)。

    + +

    カーネルはプロセスをフォークすると、それぞれのプロセスのために + pid を生成します。pid は繰り返されることが許可されています + (pid の値は多くの Unix では 16 ビットですが、新しいシステムでは + 32 ビットに拡張されています)。 + ですから、ある程度の時間が経過すると同じ pid が再び使用されます。 + しかし、一秒内に再使用されなければ、 + 四つの値の一意性は保たれます。つまり、我々はシステムが一秒間 + に 65536 個のプロセスを起動しないと仮定しています (いくつかの Unix + では 32768 プロセスですが、それですらほとんどあり得ないでしょう)。

    + +

    何らかの理由で、同じ時刻が繰り返されたとしましょう。 + つまり、システムの時計が狂っていて、もう一度過去の時刻になってしまった + (もしくは進みすぎていたときに、 + 正しい時刻に戻したために再び将来の時刻になってしまった) とします。 + この場合、pid とタイムスタンプが再使用されることが簡単に示されます。 + カウンタ初期化用の関数は、この問題の回避を手助けしようと選択されています。 + 本当はカウンタの初期化をするためにランダムな数字を使いたいのですが、 + ほとんどのシステムでは簡単に使用できる数は無いことに注意してください + (すなわち、rand ()は使えません。rand () には seed + を与える必要があり、seed には時刻を使えません。一秒単位では、 + その時刻はすでに繰り返されているからです)。 + これは、完璧な対策ではありません。

    + +

    この対策はどのくらい効果があるでしょうか? + ここでは、マシン群の中の一つは最大で一秒に 500 + リクエストを扱うと仮定します (これを書いている時点では妥当な上限です。 + 通常システムがすることは静的なファイルを取りだすだけではありませんから)。 + それを行なうために、そのマシンは並行して来るクライアントの数に + 応じた数の子プロセスを要求します。 + しかしながら、悲観的に考えて、一つの子プロセスが一秒に 500 + リクエストを扱えるとします。そうすると、(一秒の精度において) + 時刻が同じ時を繰り返すと、この子プロセスがカウンタの値を再び使い、 + 一意性が壊れる可能性が 1.5% あります。 + これは非常に悲観的な例で、実世界の値では、ほとんど起こりそうにありません。 + それでもこれが起こる可能性のあるようなシステムなら、 + (プログラムコードを編集して) + カウンタを 32 ビットにするのが良いでしょう。 +

    + +

    サマータイムにより時計が「戻される」ことを気にしている人が + いるかもしれません。ここで使用される時間は UTC であり、 + それは「常に」進むのでここでは問題になりません。x86 上の Unix + はこの条件を満たすために適切な設定が必要かもしれないことに + 注意してください。マザーボードの時計は UTC になっていて、 + 他の時間はそこから適切に補正されることを仮定できるように + 設定されなければなりません。そのような場合でさえ、NTP + を使っているならばリブート後にすぐ正しい UTC の時間になるでしょう。

    + +

    UNIQUE_ID 環境変数は 112 ビット (32 ビット IP + アドレス、32 ビット pid, 32 ビットタイムスタンプ、16 + ビットカウンタの四つの組) をアルファベット [A-Za-z0-9@-] + を用いて MIME の base64 符号化と同様の方法により符号化し、19 + の文字を生成することにより作成されます。MIME の base64 + のアルファベットは実際は [A-Za-z0-9+/] ですが、 + + と / とは URL + では特別な符号化が必要なので、あまり望ましくありません。 + 全ての値はネットワークバイトオーダで符号化されますので、 + 符号は違ったバイトオーダのアーキテクチャ間で比較可能です。 + 実際の符号化の順番は: タイムスタンプ、IP アドレス、pid, + カウンタです。この順には目的がありますが、 + アプリケーションは符号を解析するべきではないことを強調しておきます。 + アプリケーションは符号化された UNIQUE_ID + 全体を透過的なトークンとして扱うべきです。 + UNIQUE_ID は他の UNIQUE_ID + との等価性を調べるためだけにのみ使用できます。

    + +

    この順番は将来、既存の UNIQUE_ID + のデータベースとの衝突を心配することなく符号を変更することが + 可能になるように選択しています。 + 新しい符号はタイムスタンプを最初の要素として残すのが望ましく、 + それ以外は同じアルファベットとビット長を使うことができます。 + タイムスタンプは本質的に増加系列ですので、 + クラスタの全てのマシンがリクエストとサーバ機能を停止して、 + 古い符号化方式を使用するのをやめるフラグ秒があれば十分です。 + その後は、リクエストを再開し、 + 新しい符号を発行することができるようになります。

    + +

    我々はこれが、 + この問題に対する比較的移植性の高い解決法だと考えています。 + Windows NT のようなマルチスレッドのシステムに拡張することができますし、 + 将来必要になればさらに増やすこともできます。 + ID は必要に応じて長くすることができますので、生成された ID + は実質上、無限に有効です。また、クラスタのマシン間の通信も事実上必要なく + (NTP による同期のみが必要で、これはオーバヘッドはあまりありません)、httpd + プロセス間の通信も必要ありません (通信はカーネルにより割り当てられた + pid の値により暗黙の内に行なわています)。 + さらに限られた状況下では、ID はさらに短くすることができますが、 + より多くの情報を仮定する必要がでてきます (例えば、32 ビット + IP アドレスはどのサイトにおいても過剰な情報ですが、 + それの代わりになる移植性のあるものはありません)。

    +
    +
    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_unique_id.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_unique_id.html.ko.euc-kr new file mode 100644 index 00000000..c30114e9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_unique_id.html.ko.euc-kr @@ -0,0 +1,191 @@ + + + +mod_unique_id - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    ¾ÆÆÄÄ¡ ¸ðµâ mod_unique_id

    +
    +

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

    +
    +
    ÀÌ ¹®¼­´Â ÃÖ½ÅÆÇ ¹ø¿ªÀÌ ¾Æ´Õ´Ï´Ù. + ÃÖ±Ù¿¡ º¯°æµÈ ³»¿ëÀº ¿µ¾î ¹®¼­¸¦ Âü°íÇϼ¼¿ä.
    + + + +
    ¼³¸í:°¢ ¿äû¸¶´Ù À¯ÀÏÇÑ ½Äº°ÀÚ¸¦ °¡Áö´Â ȯ°æº¯¼ö¸¦ +Á¦°øÇÑ´Ù
    »óÅÂ:Extension
    ¸ðµâ¸í:unique_id_module
    ¼Ò½ºÆÄÀÏ:mod_unique_id.c
    +

    ¿ä¾à

    + + +

    ÀÌ ¸ðµâÀº ¾î¶² Ưº°ÇÑ »óȲ¿¡¼­µµ "¸ðµç" ¿äûÁß¿¡¼­ + À¯ÀÏÇϵµ·Ï º¸ÀåµÈ ½Äº°ÀÚ(identifier)¸¦ ¸ðµç ¿äû¿¡ Á¦°øÇÑ´Ù. + ½ÉÁö¾î ÀÌ ½Äº°Àڴ Ưº°ÇÏ°Ô ±¸¼ºÇÑ Å¬·¯½ºÅÍÀÇ ¿©·¯ ÄÄÇ»Å͵é + Áß¿¡¼­µµ À¯ÀÏÇÏ´Ù. °¢ ¿äû¸¶´Ù ȯ°æº¯¼ö + UNIQUE_ID¸¦ ¼³Á¤ÇÑ´Ù. À¯ÀÏÇÑ ½Äº°ÀÚ´Â ¿©·¯°¡Áö + ¿ëµµ·Î »ç¿ëÇÒ ¼ö ÀÖÁö¸¸, ¼³¸íÀº ÀÌ ¹®¼­ÀÇ ¹üÀ§¸¦ ³Ñ¾î¼±´Ù.

    +
    +

    Áö½Ã¾îµé

    +

    ÀÌ ¸ðµâ¿¡´Â Áö½Ã¾î°¡ ¾ø½À´Ï´Ù.

    +

    ÁÖÁ¦

    +
    +
    top
    +
    +

    ÀÌ·Ð

    + + +

    ¸ÕÀú À¯´Ð½º ½Ã½ºÅÛ¿¡¼­ ¾ÆÆÄÄ¡ ¼­¹ö°¡ ¾î¶»°Ô µ¿ÀÛÇÏ´ÂÁö + °£·«È÷ »ìÆ캸ÀÚ. Windows NT´Â ÇöÀç ÀÌ ±â´ÉÀ» Áö¿øÇÏÁö ¾Ê´Â´Ù. + À¯´Ð½º¿¡¼­ ¾ÆÆÄÄ¡´Â ¿©·¯ ÀÚ½ÄÀ» ¸¸µé°í, ÀÚ½Ä ÇÁ·Î¼¼½º´Â + Çѹø¿¡ ÇÑ ¿äû¾¿ ó¸®ÇÑ´Ù. ÀÚ½ÄÀº ½ÇÇàÁß¿¡ ¿©·¯ ¿äûÀ» + ó¸®ÇÑ´Ù. ¿©±â¼­ Áß¿äÇÑ °ÍÀº ÀڽĵéÀÌ ¼­·Î ÀڷḦ + °øÀ¯ÇÏÁö ¾Ê´Â´Ù´Â Á¡ÀÌ´Ù. ¾ÕÀ¸·Î ÀÚ½ÄÀ» httpd ÇÁ·Î¼¼½º¶ó°í + ÇÑ´Ù.

    + +

    ¿©·¯ ÄÄÇ»ÅÍ·Î À¥»çÀÌÆ®¸¦ ¼­ºñ½ºÇÑ´Ù¸é Ŭ·¯½ºÅÍ(cluster)¶ó°í + ºÎ¸¥´Ù. °¢ ÄÄÇ»ÅÍ´Â ¿©·¯ ¾ÆÆÄÄ¡¸¦ ½ÇÇàÇÒ ¼ö ÀÖ´Ù. ÀÌµé ¸ðµÎ¸¦ + "¿ìÁÖ"·Î º¸¸é, Ŭ·¯½ºÅÍ¿¡ ÀÖ´Â ÄÄÇ»Å͵鰣¿¡ ¸¹Àº Åë½Å¾øÀÌ + °¢ ¿äû¸¶´Ù ¿ìÁÖ¿¡¼­ À¯ÀÏÇÑ ½Äº°ÀÚ¸¦ ¸¸µé ¼ö ÀÖ´Ù.

    + +

    Ŭ·¯½ºÅÍ¿¡ ÀÖ´Â ÄÄÇ»ÅÍ´Â ´ÙÀ½ ¿ä±¸»çÇ×À» ¸¸Á·ÇØ¾ß ÇÑ´Ù. + (ÄÄÇ»Å͸¦ ÇѴ븸 »ç¿ëÇÏ´õ¶óµµ ÄÄÇ»ÅÍ ½Ã°£À» NTP¿Í µ¿±âÇØ¾ß + ÇÑ´Ù.)

    + +
      +
    • ÄÄÇ»ÅÍ ½Ã°£Àº NTP³ª ´Ù¸¥ ³×Æ®¿÷ ½Ã°£ ÇÁ·ÎÅäÄÝ°ú + µ¿±âÈ­µÈ´Ù.
    • + +
    • ÄÄÇ»ÅÍÀÇ È£½ºÆ®¸íÀÌ ¸ðµÎ ´Ù¸£´Ù. ±×·¡¼­ ¸ðµâÀÌ + È£½ºÆ®¸íÀ¸·Î ãÀ¸¸é Ŭ·¯½ºÅÍ¿¡ ÀÖ´Â °¢ ÄÄÇ»Å͸¶´Ù ´Ù¸¥ + IP ÁÖ¼Ò¸¦ ¾ò´Â´Ù.
    • +
    + +

    ¿î¿µÃ¼Á¦¿¡¼­ pid (ÇÁ·Î¼¼½º id)°¡ 32ºñÆ®¿¡ µé¾î°£´Ù°í + °¡Á¤ÇÑ´Ù. ¿î¿µÃ¼Á¦°¡ pid·Î 32ºñÆ® ÀÌ»óÀ» »ç¿ëÇÑ´Ù¸é °£´ÜÇÏÁö¸¸ + Äڵ带 ¼öÁ¤ÇØ¾ß ÇÑ´Ù.

    + +

    ÀÌ·± °¡Á¤ÇÏ¿¡ ¿ì¸®´Â ¾î¶² ½ÃÁ¡¿¡¼­ Ŭ·¯½ºÅÍÀÇ ¾î¶² ÄÄÇ»ÅÍ¿¡ + ÀÖ´Â ¾î¶² httpd ÇÁ·Î¼¼½º¸¦ ´Ù¸¥ ¸ðµç httpd ÇÁ·Î¼¼½ºµé°ú + ±¸º°ÇÒ ¼ö ÀÖ´Ù. ÄÄÇ»ÅÍÀÇ IP ÁÖ¼Ò¿Í httpd ÇÁ·Î¼¼½ºÀÇ pid¸¸À¸·Îµµ + ÃæºÐÈ÷ ±¸º°ÇÒ ¼ö ÀÖ´Ù. ±×·¡¼­ ¿äû¿¡ ´ëÇØ À¯ÀÏÇÑ ±¸º°ÀÚ¸¦ + ¸¸µå·Á¸é ½Ã°£Â÷¸¦ ±¸º°ÇÒ ¼ö¸¸ ÀÖÀ¸¸é µÈ´Ù.

    + +

    ½Ã°£À» ±¸º°ÇϱâÀ§ÇØ À¯´Ð½º ½Ã°£(timestamp, ¼¼°è Ç¥Áؽ÷Π+ 1970³â 1¿ù 1ÀÏ ÀÌÈÄ Áö³­ ÃÊ)°ú 16ºñÆ® Ä«¿îÅ͸¦ »ç¿ëÇÑ´Ù. + À¯´Ð½º ½Ã°£Àº ÃÊ´ÜÀ§ÀÌ°í, Ä«¿îÅÍ´Â ÀÏ Ãʵ¿¾È 65536±îÁö + Áõ°¡ÇÑ´Ù. ( ip_addr, pid, time_stamp, counter ) + ¹­À½Àº ¾î¶² httpd ÇÁ·Î¼¼½º¿¡¼­ ÀÏ Ãʵ¿¾È 65536 ¿äûÀ» ±¸º°ÇÒ + ¼ö ÀÖ´Ù. ±×·¯³ª Ä«¿îÅÍ´Â pid¸¦ Àç»ç¿ëÇÏ´Â ¹®Á¦¸¦ ÇØ°áÇØ¾ß + ÇÑ´Ù.

    + +

    httpd ÀÚ½ÄÀ» ¸¸µé¸é Ä«¿îÅÍ´Â ( ÇöÀç ¹Ð¸®ÃÊ ³ª´©±â 10 )À» + 65536À¸·Î ³ª´« ³ª¸ÓÁö°¡ µÈ´Ù. (¸î¸î ½Ã½ºÅÛÀÇ ¹Ð¸®ÃÊ ½Ã°£¿¡¼­ + ÇÏÀ§ ºñÆ®°¡ ÀÏÄ¡ÇÏÁö¾Ê´Â ¹®Á¦¶§¹®¿¡ ÀÌ °ø½ÄÀ» ¸¸µé¾ú´Ù.) + À¯ÀÏÇÑ ½Äº°ÀÚ¸¦ ¸¸µé¶§ »ç¿ëÇÏ´Â ½Ã°£Àº À¥¼­¹ö°¡ ¿äûÀ» ¹ÞÀº + ½Ã°£ÀÌ´Ù. Ä«¿îÅÍ´Â ½Äº°ÀÚ¸¦ ¸¸µé¶§¸¶´Ù Áõ°¡ÇÑ´Ù (±×¸®°í + ´Ù½Ã ½ÃÀÛÇÑ´Ù).

    + +

    Ä¿³ÎÀº ÇÁ·Î¼¼½º¸¦ Æ÷Å©ÇÒ¶§(fork) °¢ ÇÁ·Î¼¼½º¿¡ pid¸¦ + ÇÒ´çÇÏ°í, pid´Â ´Ù½Ã ½ÃÀÛÇÒ ¼ö ÀÖ´Ù. (pid´Â ¸¹Àº À¯´Ð½º¿¡¼­ + 16ºñÆ®ÀÌÁö¸¸, ÃÖ±Ù ½Ã½ºÅÛÀº 32ºñÆ®·Î È®ÀåÇß´Ù.) ±×·¡¼­ ½Ã°£ÀÌ + Áö³ª¸é °°Àº pid¸¦ Àç»ç¿ëÇÒ ¼ö ÀÖ´Ù. ±×·¯³ª °°Àº ½Ã°£¿¡ pid¸¦ + Àç»ç¿ëÇÏÁö ¾Ê´Â´Ù¸é À§ÀÇ ¹­À½Àº À¯ÀÏÇÏ´Ù. Áï, ¿ì¸®´Â ½Ã½ºÅÛÀÌ + ÀÏÃʵ¿¾È ÇÁ·Î¼¼½º¸¦ 65536°³ ÀÌ»ó ¸¸µéÁö ¾Ê´Â´Ù°í °¡Á¤ÇÑ´Ù. + (¾î¶² À¯´Ð½º¿¡¼­´Â 32768°³ ÀÌ»ó ÇÁ·Î¼¼½º¸¦ ¸¸µé¸é pid Àç»ç¿ë + ¹®Á¦°¡ ¹ß»ýÇÒ ¼ö ÀÖÁö¸¸, ÀÌ°ÍÁ¶Â÷µµ ÀϾ °Í°°Áö ¾Ê´Ù.)

    + +

    ½Ã°£ÀÌ ¾î¶² ÀÌÀ¯¿¡¼­°Ç ¹Ýº¹µÈ´Ù°í °¡Á¤Çغ¸ÀÚ. Áï, ½Ã½ºÅÛ + ½Ã°è°¡ ²¿¿©¼­ ½Ã°£ÀÌ °ú°Å·Î µ¹¾Æ°¡´Â (ȤÀº ½Ã°è°¡ ³Ê¹« ¾Õ¼­°¡¼­ + ¿Ã¹Ù·Î Àç¼³Á¤ÇÑÈÄ ¹Ì·¡¿¡ °°Àº ½Ã°£ÀÌ µÇ´Â) °æ¿ì´Ù. ÀÌ °æ¿ì + pid¿Í ½Ã°£À» ¸ðµÎ Àç»ç¿ëÇÒ ¼ö ÀÖ´Ù. Ä«¿îÅÍÀÇ ÃʱâÈ­ °ø½ÄÀº + ÀÌ ¹®Á¦¸¦ ÇØ°áÇÏ·Á°í °í¾ÈµÇ¾ú´Ù. ¿ì¸®´Â ½ÇÁ¦ ¹«ÀÛÀ§ ¼ýÀÚ·Î + Ä«¿îÅ͸¦ ÃʱâÈ­ÇÏ±æ ¿øÇÏÁö¸¸, ¸¹Àº ½Ã½ºÅÛ¿¡¼­ ÀÌ·± ¼ö¸¦ + ½±°Ô ¾òÀ» ¼ö ¾ø´Ù. (¿¹¸¦ µé¾î, seed°¡ ÇÊ¿äÇϱ⶧¹®¿¡ + rand()¸¦ »ç¿ëÇÒ ¼ö ¾ø°í, ½Ã°£Àº ÃÖ¼ÒÇÑ ÀÏÃÊ ´ÜÀ§À̱⶧¹®¿¡ + ½Ã°£À¸·Î seed·Î »ç¿ëÇÒ ¼ö ¾ø´Ù.) Áï ¿Ïº®ÇÑ ÇØ°áÃ¥ÀÌ ¾ø´Ù.

    + +

    ±×·³ ÀÌ ¹æ¹ýÀº ¾ó¸¶³ª ±¦ÂúÀ»±î? ÄÄÇ»ÅÍÁß Çϳª°¡ ¿äûÀ» + ÃÊ´ç ÃÖ´ë 500°³ (½Ã½ºÅÛÀº ÀϹÝÀûÀ¸·Î Á¤ÀûÀÎ ÆÄÀÏÀ» Àü¼ÛÇÏ´Â + °Í ÀÌ»óÀÇ ÀÛ¾÷À» ÇϹǷΠÀÌ ±ÛÀ» ¾²´Â ½ÃÁ¡¿¡¼­ »ó´çÈ÷ ³ôÀº + °ªÀÌ´Ù.) ¼­ºñ½ºÇÑ´Ù°í °¡Á¤ÇÏÀÚ. µ¿½Ã¿¡ ¾ó¸¶¸¸Å­ÀÇ Å¬¶óÀ̾ðÆ®¸¦ + ó¸®Çϴ°¡¿¡ µû¶ó ÀÚ½ÄÀÇ °³¼ö°¡ °áÁ¤µÈ´Ù. ±×·¯³ª ¿ì¸®´Â + ºñ°üÀûÀ¸·Î ÇÑ ÀÚ½ÄÀÌ ¿äûÀ» ÃÊ´ç 500°³ ó¸®ÇÒ ¼ö ÀÖ´Ù°í + °¡Á¤ÇÑ´Ù. Àç»ç¿ëÇÑ pid¸¦ °¡Áø ÀÚ½ÄÀÇ 500°³ ¿äû°ú ÀÌÀü ÀÚ½ÄÀÇ + 500°³ ¿äûÀÇ Ä«¿îÅÍ°ªÀÌ °ãÄ¥ ¼ö ÀÖ´Â Ä«¿îÅÍ ½ÃÀÛ°ª °æ¿ì¼ö´Â + 1000°³ÀÌ´Ù. ±×·¡¼­ (ÃÊ´ÜÀ§¿¡¼­) ÀÚ½ÄÀÌ Ä«¿îÅÍ°ªÀ» ¹Ýº¹ÇÏ¿© + À¯ÀϼºÀÌ ±úÁú È®·üÀº 1.5%ÀÌ´Ù. ÀÌ°ÍÀº ¸Å¿ì ºñ°üÀûÀÎ °¡Á¤À̸ç, + ½ÇÁ¦ ÀÌ·² °æ¿ì´Â »ó´çÈ÷ ´õ ³·´Ù. ±×·¡µµ ½Ã½ºÅÛ¿¡¼­ ÀÌ·± + ÀÏÀÌ ¹ß»ýÇÒ °Í °°´Ù¸é (¼Ò½º¸¦ ¼öÁ¤ÇÏ¿©) Ä«¿îÅ͸¦ 32ºñÆ®·Î + ¸¸µé¾î¶ó.

    + +

    ¼¶¸ÓŸÀÓ¶§¹®¿¡ ½Ã°è°¡ "µÚ·Î °¡´Â" °ÍÀ» °ÆÁ¤ÇÒÁöµµ ¸ð¸¥´Ù. + ±×·¯³ª ¿©±â¼­ »ç¿ëÇÏ´Â ½Ã°£Àº ±¹Á¦ Ç¥ÁؽÃ(UTC), Áï ½Ã°£ÀÌ + "Ç×»ó" ¾ÕÀ¸·Î °¡¹Ç·Î ¹®Á¦°¡ ¾ø´Ù. x86±â¹Ý À¯´Ð½º¿¡¼­´Â + ÀûÀýÇÑ ¼³Á¤ÀÌ ÇÊ¿äÇÏ´Ù. ¸ÞÀκ¸µå ½Ã°è°¡ UTC¸¦ »ç¿ëÇϵµ·Ï + ¼³Á¤ÇØ¾ß ÇÑ´Ù. ±×·¯³ª NTP¸¦ »ç¿ëÇÑ´Ù¸é Àç½ÃÀÛÈÄ Á¶±Ý Áö³ª¸é + UTC ½Ã°£¿¡ ¿Ã¹Ù·Î ¸ÂÃá´Ù.

    + +

    ȯ°æº¯¼ö UNIQUE_ID´Â MIME base64 ÀÎÄÚµù°ú + ºñ½ÁÇÑ ¹æ¹ýÀ¸·Î 112ºñÆ® (32ºñÆ® IP ÁÖ¼Ò, 32ºñÆ® pid, 32ºñÆ® + ½Ã°£, 16ºñÆ® Ä«¿îÅÍ) ¹­À½À» ¾ËÆĺª [A-Za-z0-9@-]·Î + Ç¥ÇöÇÑ´Ù. ½ÇÁ¦ MIME base64 ¾ËÆĺªÀº + [A-Za-z0-9+/]ÀÌÁö¸¸ +¿Í + /´Â URL¿¡¼­ Ưº°ÇÑ Àǹ̷Π»ç¿ëÇϹǷΠÁ¦¿ÜÇß´Ù. + ¸ðµç °ªÀ» ³×Æ®¿÷ ¹ÙÀÌÆ®¼ø¼­·Î ÀÎÄÚµùÇϱ⶧¹®¿¡ ´Ù¸¥ ¹ÙÀÌÆ®¼ø¼­¸¦ + »ç¿ëÇÏ´Â ¾ÆÅ°ÅØÃÄ°£¿¡ °ªÀÌ °°´Ù. ½ÇÁ¦ ÀÎÄÚµù ¼ø¼­´Â + ½Ã°£, IP ÁÖ¼Ò, pid, Ä«¿îÅÍ ¼ø¼­ÀÌ´Ù. ÀÌ ¼ø¼­¿¡´Â ¾î¶² ¸ñÀûÀÌ + ÀÖÁö¸¸, ÇÁ·Î±×·¥Àº ÀÎÄÚµù ¼ø¼­¿¡ ÀÇÁ¸ÇÏ¿© °ªµéÀ» ºÐ¼®Çϸé + ¾ÈµÊÀ» °­Á¶ÇÑ´Ù. ÇÁ·Î±×·¥Àº ÀÎÄÚµùµÈ UNIQUE_ID + Àüü¸¦ ÇÑ ´ÜÀ§·Î »ý°¢ÇÏ°í, ´Ù¸¥ UNIQUE_ID¿Í + µ¿ÀÏÇÑÁö¸¸ ºñ±³ÇÒ ¼ö ÀÖ´Ù.

    + +

    ¼ø¼­´Â ¾ÕÀ¸·Î ±âÁ¸ÀÇ UNIQUE_ID µ¥ÀÌÅͺ£À̽º¿Í + Ãæµ¹À» ¿°·ÁÇÏÁö¾Ê°í ÀÎÄÚµùÀ» º¯°æÇÒ ¼ö ÀÖµµ·Ï °í¾ÈÇß´Ù. + »õ·Î¿î ÀÎÄÚµùÀº ù Ç׸ñÀ¸·Î ½Ã°£À» »ç¿ëÇϰųª, °°Àº ¾ËÆĺª°ú + ºñÆ® ±æÀ̸¦ »ç¿ëÇÒ ¼öµµ ÀÖ´Ù. ½Ã°£ÀÌ ±âº»ÀûÀ¸·Î Áõ°¡ÇÏ´Â °ªÀ̹ǷΠ+ Ŭ·¯½ºÅÍ¿¡ ÀÖ´Â ¸ðµç ÄÄÇ»ÅÍ°¡ ¿äû ¼­ºñ½º¸¦ Áß´ÜÇÏ°í ÀÌÀü + ÀÎÄÚµù Çü½ÄÀ» ±×¸¸ »ç¿ëÇϱâÀ§ÇØ ±âÁØ ÃÊ(flag second)¸¸À¸·Î + ÃæºÐÇÏ´Ù. ÀÌÈÄ ¿äûÀ» Àç°ÔÇÏ°í »õ·Î¿î ÀÎÄÚµùÀ» ½ÃÀÛÇÒ ¼ö + ÀÖ´Ù.

    + +

    ¿ì¸®´Â ÀÌ ¹æ¹ýÀÌ ÀÌ ¹®Á¦¿¡ ´ëÇÏ¿© »ó´ëÀûÀ¸·Î Æ÷Æð¡´ÉÇÑ + ÇØ°áÃ¥À̶ó°í ¹Ï´Â´Ù. ÀÌ ¹æ¹ýÀº Windows NT¿Í °°Àº ¸ÖƼ¾²·¹µå + ½Ã½ºÅÛÀ¸·Î È®ÀåÇÒ ¼ö ÀÖ°í, ¾ÕÀ¸·Î ¿ëµµ¿¡ µû¶ó È®ÀåÇÒ ¼ö + ÀÖ´Ù. ¹Ì·¡¿¡ ÇÊ¿äÇѸ¸Å­ ´õ ±ä ½Äº°ÀÚ¸¦ ¸¸µé ¼ö Àֱ⶧¹®¿¡ + »ý¼ºÇÑ ½Äº°ÀÚ´Â ±âº»ÀûÀ¸·Î ¿µ¿øÇÑ ¼ö¸íÀ» °¡Áø´Ù. ±âº»ÀûÀ¸·Î + Ŭ·¯½ºÅÍÀÇ ÄÄÇ»ÅÍµé »çÀÌ¿¡ Åë½ÅÀÌ ÇÊ¿ä¾ø°í (ºÎÇÏ°¡ ÀÛÀº + NTP µ¿±â¸¸ ÇÊ¿äÇÏ´Ù), httpd ÇÁ·Î¼¼½º »çÀÌ¿¡ Åë½Åµµ ÇÊ¿ä¾ø´Ù + (Ä¿³ÎÀÌ ºÎ¿©ÇÏ´Â pid°ªÀÌ ¾Ï¹¬ÀûÀÎ Åë½ÅÀÌ´Ù). ¸Å¿ì ƯÀÌÇÑ + »óȲÀ̶ó¸é ÀνÄÀÚ Å©±â¸¦ ÁÙÀÏ ¼ö ÀÖÁö¸¸ ´õ ¸¹Àº Á¤º¸¸¦ + °¡Á¤ÇØ¾ß ÇÑ´Ù. (¿¹¸¦ µé¾î, ¾î¶² »çÀÌÆ®¿¡¼­ 32ºñÆ® IP ÁÖ¼Ò + ±¸ºÐÀº ºÒÇÊ¿äÇÏ°Ô Å©Áö¸¸, À̸¦ ÁÙÀÌ´Â ¹æ¹ýÀº »óȲ¿¡ µû¶ó + ´Ù¸£´Ù.)

    +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_userdir.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_userdir.html new file mode 100644 index 00000000..b6960e7b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_userdir.html @@ -0,0 +1,17 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_userdir.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: mod_userdir.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: mod_userdir.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: mod_userdir.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_userdir.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_userdir.html.en new file mode 100644 index 00000000..8eab30c5 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_userdir.html.en @@ -0,0 +1,173 @@ + + + +mod_userdir - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_userdir

    +
    +

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

    +
    + + + +
    Description:User-specific directories
    Status:Base
    Module Identifier:userdir_module
    Source File:mod_userdir.c
    +

    Summary

    + +

    This module allows user-specific directories to be accessed using the +http://example.com/~user/ syntax.

    +
    + + +
    top
    +

    UserDir Directive

    + + + + + + + +
    Description:Location of the user-specific directories
    Syntax:UserDir directory-filename
    Default:UserDir public_html
    Context:server config, virtual host
    Status:Base
    Module:mod_userdir
    + +

    The UserDir directive sets the real + directory in a user's home directory to use when a request for a + document for a user is received. Directory-filename is + one of the following:

    + +
      +
    • The name of a directory or a pattern such as those shown + below.
    • + +
    • The keyword disabled. This turns off + all username-to-directory translations except those + explicitly named with the enabled keyword (see + below).
    • + +
    • The keyword disabled followed by a + space-delimited list of usernames. Usernames that appear in + such a list will never have directory translation + performed, even if they appear in an enabled + clause.
    • + +
    • The keyword enabled followed by a + space-delimited list of usernames. These usernames will have + directory translation performed even if a global disable is + in effect, but not if they also appear in a + disabled clause.
    • +
    + +

    If neither the enabled nor the + disabled keywords appear in the + Userdir directive, the argument is treated as a + filename pattern, and is used to turn the name into a directory + specification. A request for + http://www.foo.com/~bob/one/two.html will be + translated to:

    + + + + + + + +
    UserDir directive usedTranslated path
    UserDir public_html~bob/public_html/one/two.html
    UserDir /usr/web/usr/web/bob/one/two.html
    UserDir /home/*/www/home/bob/www/one/two.html
    + +

    The following directives will send redirects to the client:

    + + + + + + + +
    UserDir directive usedTranslated path
    UserDir http://www.foo.com/usershttp://www.foo.com/users/bob/one/two.html
    UserDir +http://www.foo.com/*/usrhttp://www.foo.com/bob/usr/one/two.html
    UserDir +http://www.foo.com/~*/http://www.foo.com/~bob/one/two.html
    + +
    + Be careful when using this directive; for instance, + "UserDir ./" would map "/~root" to + "/" - which is probably undesirable. It is strongly + recommended that your configuration include a "UserDir + disabled root" declaration. See also the Directory directive and the Security Tips page for + more information. +
    + +

    Additional examples:

    + +

    To allow a few users to have UserDir directories, but +not anyone else, use the following:

    + +

    +UserDir disabled
    +UserDir enabled user1 user2 user3 +

    + +

    To allow most users to have UserDir directories, but +deny this to a few, use the following:

    + +

    +UserDir enabled
    +UserDir disabled user4 user5 user6 +

    + +

    It is also possible to specify alternative user directories. +If you use a command like:

    +

    +Userdir public_html /usr/web http://www.foo.com/ +

    +

    With a request for http://www.foo.com/~bob/one/two.html, will try to +find the page at ~bob/public_html/one/two.html first, then +/usr/web/bob/one/two.html, and finally it will send a redirect +to http://www.foo.com/bob/one/two.html.

    +

    If you add a redirect, it must be the last alternative in the list. +Apache cannot determine if the redirect succeeded or not, so if you have +the redirect earlier in the list, that will always be the alternative +that is used.

    + + +

    See also

    + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_userdir.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_userdir.html.ja.utf8 new file mode 100644 index 00000000..c025aafd --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_userdir.html.ja.utf8 @@ -0,0 +1,183 @@ + + + +mod_userdir - Apache HTTP サーバ + + + + + + +
    <-
    + +
    +

    Apache モジュール mod_userdir

    +
    +

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

    +
    + + + +
    説明:ユーザ専用のディレクトリを提供 +
    ステータス:Base
    モジュール識別子:userdir_module
    ソースファイル:mod_userdir.c
    +

    概要

    + +

    このモジュールは、 +http://example.com/~user/ +構文を使ってユーザ専用ディレクトリにアクセスできるようにします。

    +
    + + +
    top
    +

    UserDir ディレクティブ

    + + + + + + + +
    説明:ユーザ専用ディレクトリの位置
    構文:UserDir directory-filename
    デフォルト:UserDir public_html
    コンテキスト:サーバ設定ファイル, バーチャルホスト
    ステータス:Base
    モジュール:mod_userdir
    + +

    UserDir ディレクティブは、 + ユーザのドキュメントへのリクエストを受けた時に使う + ユーザのホームディレクトリ中の、実際のディレクトリを + 設定します。 + directory-filename には次のどれかを指定します:

    + +
      +
    • ディレクトリ名か下に示すようなパターン。
    • + +
    • disabled キーワード。 + enabled キーワード (下記参照) で明示的に + 指定されたユーザ以外の + 全てのユーザ名-ディレクトリ変換を + しないようにします。
    • + +
    • disabled キーワードと、スペース区切りのユーザ名リスト。 + このリスト中に含まれるユーザ名に対しては、たとえ + enabled 節にあったとしても、 + 決してディレクトリ変換は行われません。
    • + +
    • enebled キーワードとスペース区切りのユーザ名リスト。 + 全体では変換が無効になっていたといたとしても、 + これらのユーザ名にはディレクトリ変換が行われます。 + ただし、disabled 節にもあれば変換はされません。 +
    • +
    + +

    もし enabled も disabled + キーワードも UserDir に現われていなければ、 + 引数はファイル名パターンとして扱われ、 + 名前からディレクトリへの変換の指定を行なう時に使われます。 + http://www.foo.com/~bob/one/two.html + へのリクエストは次のように変換されます:

    + + + + + + + +
    UserDir ディレクティブ変換後のパス
    UserDir public_html~bob/public_html/one/two.html
    UserDir /usr/web/usr/web/bob/one/two.html
    UserDir /home/*/www/home/bob/www/one/two.html
    + +

    次のディレクティブはクライアントに対してリダイレクトを + 送信します:

    + + + + + + + +
    UserDir ディレクティブ変換後のパス
    UserDir http://www.foo.com/usershttp://www.foo.com/users/bob/one/two.html
    UserDir +http://www.foo.com/*/usrhttp://www.foo.com/bob/usr/one/two.html
    UserDir +http://www.foo.com/~*/http://www.foo.com/~bob/one/two.html
    + +
    + このディレクティブを使うときは注意してください; + "UserDir ./" は + "/~root" から "/" へマップしますが、 + これは望ましい動作ではないでしょう。 + "UserDir disabled root" 宣言を + 設定の中に含めておくことを強くお薦めします。 + 追加情報に Directory + ディレクティブや + セキュリティ + Tips のページもご覧下さい。 +
    + +

    追加の例:

    + +

    少数のユーザのみが UserDir +ディレクトリを利用し、それ以外には利用させたくない場合は +次を使いましょう:

    + +

    +UserDir disabled
    +UserDir enabled user1 user2 user3 +

    + +

    大部分のユーザは UserDir ディレクトリを利用するけれど、 +少数の人は不許可にしたい場合は、次を使いましょう:

    + +

    +UserDir enabled
    +UserDir disabled user4 user5 user6 +

    + +

    他のユーザディレクトリを指定することもできます。 +次のようなコマンドを使うと:

    + +

    +Userdir public_html /usr/web http://www.foo.com/ +

    + +

    http://www.foo.com/~bob/one/two.html へのリクエストはまず +~bob/public_html/one/two.html のページを調べ、その次に +/usr/web/bob/one/two.html を調べ、最後に http://www.foo.com/bob/one/two.html +へのリダイレクトを送ります。

    + +

    リダイレクトを加える場合は、リストの最後の選択肢でなければなりません。 +Apache はリダイレクトが成功するかどうかを決めることはできませんので、 +リストの前の方にリダイレクトを書くと、それが必ず使用される選択肢に +なってしまいます。

    + + +

    参照

    + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_userdir.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_userdir.html.ko.euc-kr new file mode 100644 index 00000000..0db8bb08 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_userdir.html.ko.euc-kr @@ -0,0 +1,161 @@ + + + +mod_userdir - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    ¾ÆÆÄÄ¡ ¸ðµâ mod_userdir

    +
    +

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

    +
    + + + +
    ¼³¸í:»ç¿ëÀÚº° µð·ºÅ丮
    »óÅÂ:Base
    ¸ðµâ¸í:userdir_module
    ¼Ò½ºÆÄÀÏ:mod_userdir.c
    +

    ¿ä¾à

    + +

    ÀÌ ¸ðµâÀ» »ç¿ëÇϸé http://example.com/~user/ ½ÄÀ¸·Î +»ç¿ëÀÚº° µð·ºÅ丮¿¡ Á¢±ÙÇÒ ¼ö ÀÖ´Ù.

    +
    + + +
    top
    +

    UserDir Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:»ç¿ëÀÚº° µð·ºÅ丮 À§Ä¡
    ¹®¹ý:UserDir directory-filename
    ±âº»°ª:UserDir public_html
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®
    »óÅÂ:Base
    ¸ðµâ:mod_userdir
    + +

    UserDir Áö½Ã¾î´Â »ç¿ëÀÚÀÇ ¹®¼­¿¡ ´ëÇÑ +¿äûÀ» ¹ÞÀ»¶§ »ç¿ëÀÚ È¨µð·ºÅ丮 ¾È¿¡¼­ »ç¿ëÇÒ ½ÇÁ¦ µð·ºÅ丮¸¦ +ÁöÁ¤ÇÑ´Ù. Directory-filenameÀº ´ÙÀ½ Áß ÇϳªÀÌ´Ù:

    + +
      +
    • ¾Æ·¡¿Í °°Àº µð·ºÅ丮¸í ȤÀº ÆÐÅÏ.
    • + +
    • disabled Å°¿öµå. +enabled Å°¿öµå·Î (¾Æ·¡ Âü°í) Á÷Á¢ À̸§À» ÁöÁ¤ÇÏÁö ¾Ê¾Ò´Ù¸é +¸ðµç »ç¿ëÀÚ¸í-µð·ºÅ丮 º¯È¯À» ÇÏÁö ¾Ê´Â´Ù.
    • + +
    • disabled Å°¿öµå µÚ¿¡ °ø¹éÀ¸·Î ±¸ºÐÇÑ »ç¿ëÀÚ¸í ¸ñ·Ï. +»ç¿ëÀÚ¸íÀÌ enabled ±¸¹®¿¡ ÀÖ´Ù°í ÇÏ´õ¶óµµ, ÀÌ ¸ñ·Ï¿¡ +ÀÖ´Â »ç¿ëÀÚ¸íÀº µð·ºÅ丮 º¯È¯À» ÇÏÁö ¾Ê´Â´Ù.
    • + +
    • enabled Å°¿öµå µÚ¿¡ °ø¹éÀ¸·Î ±¸ºÐÇÑ »ç¿ëÀÚ¸í ¸ñ·Ï. +Àüü disableÀ» »ç¿ëÇÏ°í »ç¿ëÀÚ¸íÀÌ disabled ±¸¹®¿¡ +¾ø´õ¶óµµ, »ç¿ëÀÚ¸íÀ» µð·ºÅ丮 º¯È¯ÇÑ´Ù.
    • +
    + +

    Userdir Áö½Ã¾î¿¡ enabled³ª +disabled Å°¿öµå¸¦ »ç¿ëÇÏÁö ¾ÊÀ¸¸é, ¾Æ±Ô¸ÕÆ®¸¦ +ÆÄÀϸí ÆÐÅÏÀ¸·Î ó¸®ÇÏ¿© µð·ºÅ丮·Î º¯È¯ÇÑ´Ù. +http://www.foo.com/~bob/one/two.html¿¡ ´ëÇÑ ¿äûÀº +´ÙÀ½°ú °°ÀÌ º¯È¯µÈ´Ù:

    + + + + + + + +
    »ç¿ëÇÑ UserDir Áö½Ã¾îº¯È¯ÇÑ °æ·Î
    UserDir public_html~bob/public_html/one/two.html
    UserDir /usr/web/usr/web/bob/one/two.html
    UserDir /home/*/www/home/bob/www/one/two.html
    + +

    ´ÙÀ½ Áö½Ã¾î´Â Ŭ¶óÀ̾ðÆ®¿¡°Ô ¸®´ÙÀÌ·º¼ÇÀ» º¸³½´Ù:

    + + + + + + + +
    »ç¿ëÇÑ UserDir Áö½Ã¾îº¯È¯ÇÑ °æ·Î
    UserDir http://www.foo.com/usershttp://www.foo.com/users/bob/one/two.html
    UserDir +http://www.foo.com/*/usrhttp://www.foo.com/bob/usr/one/two.html
    UserDir +http://www.foo.com/~*/http://www.foo.com/~bob/one/two.html
    + +
    + ÀÌ Áö½Ã¾î¸¦ »ç¿ëÇÒ¶§ ÁÖÀÇÇ϶ó; ¿¹¸¦ µé¾î, +"UserDir ./"´Â "/~root"¸¦ ¾Æ¸¶µµ ¹Ù¶÷Á÷ÇÏÁö ¾Ê°Ô +"/"·Î º¯È¯ÇÑ´Ù. ¼³Á¤¿¡ "UserDir + disabled root"¸¦ Æ÷ÇÔÇÏ±æ °­·ÂÈ÷ ±ÇÇÑ´Ù. ÀÚ¼¼ÇÑ Á¤º¸¸¦ ¾Ë·Á¸é +Directory Áö½Ã¾î¿Í º¸¾È ÆÁµµ Âü°íÇ϶ó. +
    + +

    Ãß°¡ ¿¹Á¦:

    + +

    ¸î¸î »ç¿ëÀÚ¿¡°Ô¸¸ UserDir µð·ºÅ丮¸¦ Çã¿ëÇÑ´Ù¸é, +´ÙÀ½°ú °°´Ù:

    + +

    +UserDir disabled
    +UserDir enabled user1 user2 user3 +

    + +

    ´ëºÎºÐÀÇ »ç¿ëÀÚ¿¡°Ô UserDir µð·ºÅ丮¸¦ Çã¿ëÇÏ°í +ÀϺθ¸ °ÅºÎÇÑ´Ù¸é, ´ÙÀ½°ú °°´Ù:

    + +

    +UserDir enabled
    +UserDir disabled user4 user5 user6 +

    + +

    ´Ù¸¥ »ç¿ëÀÚ µð·ºÅ丮¸¦ ÁöÁ¤ÇÒ ¼öµµ ÀÖ´Ù. +´ÙÀ½°ú °°Àº ¸í·É¾î¸¦ »ç¿ëÇÑ´Ù¸é:

    +

    +Userdir public_html /usr/web http://www.foo.com/ +

    +

    http://www.foo.com/~bob/one/two.html ¿äûÀ» Çϸé, +¸ÕÀú ~bob/public_html/one/two.html ÆäÀÌÁö¸¦ ã°í, +/usr/web/bob/one/two.htmlÀ» ãÀº ÈÄ, ¸¶Áö¸·À¸·Î +http://www.foo.com/bob/one/two.htmlÀ¸·Î ¸®´ÙÀÌ·º¼ÇÀ» º¸³½´Ù.

    +

    ¸®´ÙÀÌ·º¼ÇÀ» »ç¿ëÇÑ´Ù¸é ¸ñ·ÏÀÇ ¸¶Áö¸·¿¡ µÎ¾î¾ß ÇÑ´Ù. +¾ÆÆÄÄ¡´Â ¸®´ÙÀÌ·º¼ÇÀÌ ¼º°øÇß´ÂÁö ¾Ë ¼ö ¾ø±â¶§¹®¿¡, ¸®´ÙÀÌ·º¼ÇÀ» +¸ñ·Ï ¾Õ¿¡ µÎ¸é Ç×»ó ¸®´ÙÀÌ·º¼ÇÀ» »ç¿ëÇÏ°Ô µÈ´Ù.

    + + +

    Âü°í

    + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_userdir.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_userdir.html.tr.utf8 new file mode 100644 index 00000000..c01569ba --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_userdir.html.tr.utf8 @@ -0,0 +1,180 @@ + + + +mod_userdir - Apache HTTP Sunucusu + + + + + + +
    <-
    + +
    +

    Apache Modülü mod_userdir

    +
    +

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

    +
    + + + +
    Açıklama:Kullanıcılara özel dizinler
    Durum:Temel
    Modül Betimleyici:userdir_module
    Kaynak Dosyası:mod_userdir.c
    +

    Özet

    + +

    Bu modül kullanıcılara özel dizinlere + http://mesela.dom/~kullanıcı/ sözdizimi kullanılarak + erişilebilmesini mümkün kılar.

    +
    +

    Yönergeler

    + +

    Ayrıca bakınız:

    +
    + +
    top
    +

    UserDir Yönergesi

    + + + + + + + +
    Açıklama:Kullanıcıya özel dizinlerin yeri
    Sözdizimi:UserDir dizin
    Öntanımlı:UserDir public_html
    Bağlam:sunucu geneli, sanal konak
    Durum:Temel
    Modül:mod_userdir
    + +

    UserDir yönergesi, bir kullanıcıya ait bir + belge için bir istek yapıldığında, isteğin kullanıcının ev dizininde + bulunan belli bir dizinden karşılanmasını sağlar. + dizin olarak şunlar belirtilebilir:

    + +
      +
    • Dizinin ismi veya aşağıdakiler gibi bir kalıp.
    • + +
    • disabled anahtar sözcüğü. enabled anahtar + sözcüğü ile sonradan etkin kılınmadıkça tüm kullanıcı-dizin + dönüşümlerini iptal eder (aşağıya bakınız).
    • + +
    • disabled anahtar sözcüğünü takibeden boşluk ayraçlı + kullanıcı isimleri listesi. Bu listede yer alan kullanıcı isimlerine, + sonradan bir enabled listesinde görünse bile, dizin + dönüşümleri asla uygulanmaz.
    • + +
    • enabled anahtar sözcüğünü takibeden boşluk ayraçlı + kullanıcı isimleri listesi. Genel bir iptal sözkonusu olsa bile, + kullanıcı ismi bir disabled listesinde yer almadıkça, bu + listede yer alan dizinlere dönüşüm uygulanır.
    • +
    + +

    Userdir yönergesinde ne enabled ne de + disabled varsa, argüman bir dosya ismi kalıbı olarak ele + alınır ve kullanıcı belge kök dizininin yolunu oluşturmakta kullanılır. + http://mesela.dom/~ali/bir/iki.html şöyle dönüştürülür:

    + + + + + + + + + + +
    Kullanılan UserDir yönergesi    Elde edilen yol
    UserDir public_html~ali/public_html/bir/iki.html
    UserDir /usr/siteler/usr/siteler/ali/bir/iki.html
    UserDir /home/*/htdocs/home/ali/htdocs/bir/iki.html
    + +

    Aşağıdaki yönergelerle istemciye gönderilecek yönlendirmeler:

    + + + + + + + + + + +
    Kullanılan UserDir yönergesi    Elde edilen yönlendirme
    UserDir http://mesela.dom/usershttp://mesela.dom/users/ali/bir/iki.html
    UserDir http://mesela.dom/*/usrhttp://mesela.dom/ali/usr/bir/iki.html
    UserDir http://mesela.dom/~*/http://mesela.dom/~ali/bir/iki.html
    + +
    + Bu yönergeyi kullanırken dikkatli olun; örneğin, "UserDir + ./" şeklinde bir atama "/~root" isteklerini + "/" dizinine yönlendirir ki bu elbette istenmez. Bu + bakımdan yapılandırmanızda mutlaka bir "UserDir disabled + root" satırının yer almasını tavsiye ederiz. Daha fazla bilgi + için Directory yönergesine ve Güvenlik İpuçları sayfasına + bakınız. +
    + +

    Diğer örnekler:

    + +

    Bir kaç kullanıcı hariç kalan herkesin UserDir + dizinlerini iptal etmek için şunu yapabilirsiniz:

    + +

    + UserDir disabled
    + UserDir enabled birey1 birey2 birey3 +

    + +

    Bir kaç kullanıcı hariç kalan herkesin UserDir + dizinlerini etkin kılmak için şunu yapabilirsiniz:

    + +

    + UserDir enabled
    + UserDir disabled birey4 birey5 birey6 +

    + +

    Birden fazla dizin belirtmek de mümkündür:

    + +

    + Userdir public_html /usr/siteler http://mesela.dom/ +

    + +

    Bu örneğe göre, http://mesela.dom/~ali/bir/iki.html + şeklinde bir istek alındığında sunucu önce + http://mesela.dom/~ali/bir/iki.html yönlendirmesini + deneyecektir. Onu bulamazsa isteği + /usr/siteler/ali/bir/iki.html dosyasını arayacak onu da + bulamazsa istemciyi http://mesela.dom/ali/bir/iki.html + adresine yönlendirecektir.

    + +

    Argüman listesine bir yönlendirme ekleyecekseniz, bu, listenin son + elemanı olmalıdır. Apache yönlendirmenin başarılı sonuç verip + vermediğini bilemeyecektir. Bu bakımdan, listede bu yönlendirmeden + sonra bir yönlendirme daha bulunması daha iyi olacaktır.

    + + +

    Ayrıca bakınız:

    + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_usertrack.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_usertrack.html new file mode 100644 index 00000000..63ee8b40 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_usertrack.html @@ -0,0 +1,5 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_usertrack.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_usertrack.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_usertrack.html.en new file mode 100644 index 00000000..fdab809e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_usertrack.html.en @@ -0,0 +1,252 @@ + + + +mod_usertrack - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_usertrack

    +
    +

    Available Languages:  en 

    +
    + + + +
    Description: +Clickstream logging of user activity on a site +
    Status:Extension
    Module Identifier:usertrack_module
    Source File:mod_usertrack.c
    +

    Summary

    + +

    Previous releases of Apache have included a module which + generates a 'clickstream' log of user activity on a site using + cookies. This was called the "cookies" module, mod_cookies. In + Apache 1.2 and later this module has been renamed the "user + tracking" module, mod_usertrack. This module has been + simplified and new directives added.

    +
    + +
    top
    +
    +

    Logging

    + + +

    Previously, the cookies module (now the user tracking + module) did its own logging, using the CookieLog + directive. In this release, this module does no logging at all. + Instead, a configurable log format file should be used to log + user click-streams. This is possible because the logging module + now allows multiple log files. The cookie itself is logged by + using the text %{cookie}n in the log file format. For + example:

    +

    +CustomLog logs/clickstream "%{cookie}n %r %t" +

    + +

    For backward compatibility the configurable log module + implements the old CookieLog directive, but this + should be upgraded to the above CustomLog directive.

    +
    top
    +
    +

    2-digit or 4-digit dates for cookies?

    + + +

    (the following is from message + <022701bda43d$9d32bbb0$1201a8c0@christian.office.sane.com> + in the new-httpd archives)

    +
    +From: "Christian Allen" <christian@sane.com>
    +Subject: Re: Apache Y2K bug in mod_usertrack.c
    +Date: Tue, 30 Jun 1998 11:41:56 -0400
    +
    +Did some work with cookies and dug up some info that might be useful.
    +
    +True, Netscape claims that the correct format NOW is four digit dates, and
    +four digit dates do in fact work... for Netscape 4.x (Communicator), that
    +is.  However, 3.x and below do NOT accept them.  It seems that Netscape
    +originally had a 2-digit standard, and then with all of the Y2K hype and
    +probably a few complaints, changed to a four digit date for Communicator.
    +Fortunately, 4.x also understands the 2-digit format, and so the best way to
    +ensure that your expiration date is legible to the client's browser is to
    +use 2-digit dates.
    +
    +However, this does not limit expiration dates to the year 2000; if you use
    +an expiration year of "13", for example, it is interpreted as 2013, NOT
    +1913!  In fact, you can use an expiration year of up to "37", and it will be
    +understood as "2037" by both MSIE and Netscape versions 3.x and up (not sure
    +about versions previous to those).  Not sure why Netscape used that
    +particular year as its cut-off point, but my guess is that it was in respect
    +to UNIX's 2038 problem.  Netscape/MSIE 4.x seem to be able to understand
    +2-digit years beyond that, at least until "50" for sure (I think they
    +understand up until about "70", but not for sure).
    +
    +Summary:  Mozilla 3.x and up understands two digit dates up until "37"
    +(2037).  Mozilla 4.x understands up until at least "50" (2050) in 2-digit
    +form, but also understands 4-digit years, which can probably reach up until
    +9999.  Your best bet for sending a long-life cookie is to send it for some
    +time late in the year "37".
    +
    + +
    +
    top
    +

    CookieDomain Directive

    + + + + + + + +
    Description:The domain to which the tracking cookie applies
    Syntax:CookieDomain domain
    Context:server config, virtual host, directory, .htaccess
    Override:FileInfo
    Status:Extension
    Module:mod_usertrack
    + +

    This directive controls the setting of the domain to which + the tracking cookie applies. If not present, no domain is + included in the cookie header field.

    + +

    The domain string must begin with a dot, and + must include at least one embedded dot. That is, + .foo.com is legal, but foo.bar.com and + .com are not.

    + +
    Most browsers in use today will not allow cookies to be set + for a two-part top level domain, such as .co.uk, + although such a domain ostensibly fulfills the requirements + above.
    + + These domains are equivalent to top level domains such as + .com, and allowing such cookies may be a security + risk. Thus, if you are under a two-part top level domain, you + should still use your actual domain, as you would with any other top + level domain (for example, use .foo.co.uk). +
    + + +
    +
    top
    +

    CookieExpires Directive

    + + + + + + + +
    Description:Expiry time for the tracking cookie
    Syntax:CookieExpires expiry-period
    Context:server config, virtual host, directory, .htaccess
    Override:FileInfo
    Status:Extension
    Module:mod_usertrack
    +

    When used, this directive sets an expiry time on the cookie + generated by the usertrack module. The expiry-period + can be given either as a number of seconds, or in the format + such as "2 weeks 3 days 7 hours". Valid denominations are: + years, months, weeks, days, hours, minutes and seconds. If the expiry + time is in any format other than one number indicating the + number of seconds, it must be enclosed by double quotes.

    + +

    If this directive is not used, cookies last only for the + current browser session.

    + +
    +
    top
    +

    CookieName Directive

    + + + + + + + + +
    Description:Name of the tracking cookie
    Syntax:CookieName token
    Default:CookieName Apache
    Context:server config, virtual host, directory, .htaccess
    Override:FileInfo
    Status:Extension
    Module:mod_usertrack
    +

    This directive allows you to change the name of the cookie + this module uses for its tracking purposes. By default the + cookie is named "Apache".

    + +

    You must specify a valid cookie name; results are + unpredictable if you use a name containing unusual characters. + Valid characters include A-Z, a-z, 0-9, "_", and "-".

    + +
    +
    top
    +

    CookieStyle Directive

    + + + + + + + + +
    Description:Format of the cookie header field
    Syntax:CookieStyle + Netscape|Cookie|Cookie2|RFC2109|RFC2965
    Default:CookieStyle Netscape
    Context:server config, virtual host, directory, .htaccess
    Override:FileInfo
    Status:Extension
    Module:mod_usertrack
    +

    This directive controls the format of the cookie header + field. The three formats allowed are:

    + +
      +
    • Netscape, which is the original but now deprecated + syntax. This is the default, and the syntax Apache has + historically used.
    • + +
    • Cookie or RFC2109, which is the syntax that + superseded the Netscape syntax.
    • + +
    • Cookie2 or RFC2965, which is the most + current cookie syntax.
    • +
    + +

    Not all clients can understand all of these formats. but you + should use the newest one that is generally acceptable to your + users' browsers. At the time of writing, most browsers only fully + support CookieStyle Netscape.

    + +
    +
    top
    +

    CookieTracking Directive

    + + + + + + + + +
    Description:Enables tracking cookie
    Syntax:CookieTracking on|off
    Default:CookieTracking off
    Context:server config, virtual host, directory, .htaccess
    Override:FileInfo
    Status:Extension
    Module:mod_usertrack
    +

    When mod_usertrack is loaded, and + CookieTracking on is set, Apache will send a + user-tracking cookie for all new requests. This directive can + be used to turn this behavior on or off on a per-server or + per-directory basis. By default, enabling + mod_usertrack will not + activate cookies.

    + + +
    +
    +
    +

    Available Languages:  en 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_version.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_version.html new file mode 100644 index 00000000..03cb2547 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_version.html @@ -0,0 +1,13 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_version.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: mod_version.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: mod_version.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_version.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_version.html.en new file mode 100644 index 00000000..f884ea84 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_version.html.en @@ -0,0 +1,150 @@ + + + +mod_version - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_version

    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + + + + +
    Description:Version dependent configuration
    Status:Extension
    Module Identifier:version_module
    Source File:mod_version.c
    Compatibility:Available in version 2.0.56 and later
    +

    Summary

    + +

    This module is designed for the use in test suites and large + networks which have to deal with different httpd versions and + different configurations. It provides a new container -- <IfVersion>, which + allows a flexible version checking including numeric comparisons and + regular expressions.

    + +

    Examples

    + <IfVersion 2.1.0>
    + + # current httpd version is exactly 2.1.0
    +
    + </IfVersion>
    +
    + <IfVersion >= 2.2>
    + + # use really new features :-)
    +
    + </IfVersion> +

    + +

    See below for further possibilities.

    +
    +

    Directives

    + +
    + +
    top
    +

    <IfVersion> Directive

    + + + + + + + +
    Description:contains version dependent configuration
    Syntax:<IfVersion [[!]operator] version> ... +</IfVersion>
    Context:server config, virtual host, directory, .htaccess
    Override:All
    Status:Extension
    Module:mod_version
    +

    The <IfVersion> section encloses + configuration directives which are executed only if the + httpd version + matches the desired criteria. For normal (numeric) comparisons the + version argument has the format + major[.minor[.patch]], e.g. + 2.1.0 or 2.2. minor and + patch are optional. If these numbers are omitted, they are + assumed to be zero. The following numerical operators are + possible:

    + + + + + + + + + + + + +
    operatordescription
    = or ==httpd version is equal
    >httpd version is greater than
    >=httpd version is greater or equal
    <httpd version is less than
    <=httpd version is less or equal
    + +

    Example

    + <IfVersion >= 2.1>
    + + # this happens only in versions greater or
    + # equal 2.1.0.
    +
    + </IfVersion> +

    + +

    Besides the numerical comparison it is possible to match a regular + expression against the httpd version. There are two ways to write it:

    + + + + + + +
    operatordescription
    = or ==version has the form + /regex/
    ~version has the form + regex
    + +

    Example

    + <IfVersion = /^2.1.[01234]$/>
    + + # e.g. workaround for buggy versions + + </IfVersion> +

    + +

    In order to reverse the meaning, all operators can be preceded by an + exclamation mark (!):

    + +

    + <IfVersion !~ ^2.1.[01234]$>
    + + # not for those versions
    +
    + </IfVersion> +

    + +

    If the operator is omitted, it is assumed to be + =.

    + +
    +
    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_version.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_version.html.ja.utf8 new file mode 100644 index 00000000..5b6a39fb --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_version.html.ja.utf8 @@ -0,0 +1,150 @@ + + + +mod_version - Apache HTTP サーバ + + + + + + +
    <-
    + +
    +

    Apache モジュール mod_version

    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    +
    This translation may be out of date. Check the + English version for recent changes.
    + + + + +
    説明:バージョン依存の設定
    ステータス:Extension
    モジュール識別子:version_module
    ソースファイル:mod_version.c
    互換性:バージョン 2.0.54 以降
    +

    概要

    + +

    様々なバージョンの httpd の異なる設定を扱うことになる、 + テストスイートや大規模ネットワークでの使用のために設計されています。 + このモジュールは新しいコンテナ ― <IfVersion> を + 提供します。これを使うと、数字の比較や正規表現による柔軟な + バージョンチェックができるようになります。

    + +

    例

    + <IfVersion 2.1.0>
    + + # current httpd version is exactly 2.1.0
    +
    + </IfVersion>
    +
    + <IfVersion >= 2.2>
    + + # use really new features :-)
    +
    + </IfVersion> +

    + +

    詳細は以下を読んでください。

    +
    +

    ディレクティブ

    + +
    + +
    top
    +

    <IfVersion> ディレクティブ

    + + + + + + + +
    説明:バージョン依存の設定を入れる
    構文:<IfVersion [[!]operator] version> ... +</IfVersion>
    コンテキスト:サーバ設定ファイル, バーチャルホスト, ディレクトリ, .htaccess
    上書き:All
    ステータス:Extension
    モジュール:mod_version
    +

    <IfVersion> は httpd のバージョン + が基準を満たしたときにのみ実行させたいディレクティブを囲みます。 + 通常の (数値) 比較のときは version 引数は + major[.minor[.patch]] という + 形式、例えば、2.1.0 や 2.2 となります。 + minor と patch は省略可能です。省略された場合は、 + 0 を指定したものとみなされます。比較には次の数値 operator を + 指定できます:

    + + + + + + + + + + + + +
    operator説明
    = と ==同じ httpd バージョン
    >より大きい httpd バージョン
    >=指定以上の httpd バージョン
    <指定未満の httpd バージョン
    <=指定以下の httpd バージョン
    + +

    例

    + <IfVersion >= 2.1>
    + + # this happens only in versions greater or
    + # equal 2.1.0.
    +
    + </IfVersion> +

    + +

    数値比較に加えて、http のバージョン番号に対して正規表現による + マッチングができます。二種類の書き方があります:

    + + + + + + +
    operator説明
    = or ==version は + /regex/ 形式
    ~version は + regex 形式
    + +

    例

    + <IfVersion = /^2.1.[01234]$/>
    + + # e.g. workaround for buggy versions + + </IfVersion> +

    + +

    マッチングの否定を表現するために、すべてのオペレータは前に + 感嘆符 (!)を付けることができます:

    + +

    + <IfVersion !~ ^2.1.[01234]$>
    + + # not for those versions
    +
    + </IfVersion> +

    + +

    operator が省略されたときは = と + みなされます。

    + +
    +
    +
    +

    Available Languages:  en  | + ja  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_version.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_version.html.ko.euc-kr new file mode 100644 index 00000000..539e32a3 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_version.html.ko.euc-kr @@ -0,0 +1,150 @@ + + + +mod_version - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    ¾ÆÆÄÄ¡ ¸ðµâ mod_version

    +
    +

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

    +
    +
    ÀÌ ¹®¼­´Â ÃÖ½ÅÆÇ ¹ø¿ªÀÌ ¾Æ´Õ´Ï´Ù. + ÃÖ±Ù¿¡ º¯°æµÈ ³»¿ëÀº ¿µ¾î ¹®¼­¸¦ Âü°íÇϼ¼¿ä.
    + + + + +
    ¼³¸í:¹öÀüº° ¼³Á¤
    »óÅÂ:Extension
    ¸ðµâ¸í:version_module
    ¼Ò½ºÆÄÀÏ:mod_version.c
    Áö¿ø:¾ÆÆÄÄ¡ 2.0.54 ÀÌÈĺÎÅÍ
    +

    ¿ä¾à

    + +

    ¿©·¯ ´Ù¸¥ À¥¼­¹ö ¹öÀü°ú ±¸¼ºÀ» ´Ù·ç¾î¾ß ÇÒ Å« ³×Æ®¿÷°ú + Å×½ºÆ®¿ëÀ¸·Î »ç¿ëÇϱâÀ§ÇØ ÀÌ ¸ðµâÀ» ¸¸µé¾ú´Ù. ÀÌ ¸ðµâÀº + ¼ýÀÚ ºñ±³³ª Á¤±ÔÇ¥Çö½ÄÀ» »ç¿ëÇÏ¿© ÀÚÀ¯·Î¿î ¹öÀü °Ë»ç°¡ °¡´ÉÇÑ + <IfVersion>À» + Á¦°øÇÑ´Ù.

    + +

    ¿¹Á¦

    + <IfVersion 2.1.0>
    + + # ÇöÀç À¥¼­¹ö ¹öÀüÀº Á¤È®È÷ 2.1.0ÀÌ´Ù
    +
    + </IfVersion>
    +
    + <IfVersion >= 2.2>
    + + # ÁøÂ¥ »õ·Î¿î ±â´ÉÀ» »ç¿ëÇÑ´Ù :-)
    +
    + </IfVersion> +

    + +

    ´Ù¸¥ »ç¿ë¹ýÀº ¾Æ·¡¸¦ Âü°íÇÑ´Ù.

    +
    +

    Áö½Ã¾îµé

    + +
    + +
    top
    +

    <IfVersion> Áö½Ã¾î

    + + + + + + + +
    ¼³¸í:¹öÀüº° ¼³Á¤À» ¹­´Â´Ù
    ¹®¹ý:<IfVersion [[!]operator] version> ... +</IfVersion>
    »ç¿ëÀå¼Ò:ÁÖ¼­¹ö¼³Á¤, °¡»óÈ£½ºÆ®, directory, .htaccess
    Override ¿É¼Ç:All
    »óÅÂ:Extension
    ¸ðµâ:mod_version
    +

    <IfVersion> ¼½¼ÇÀº + À¥¼­¹ö ¹öÀüÀÌ ¿øÇÏ´Â Á¶°ÇÀ» ¸¸Á·ÇÒ¶§¸¸ ½ÇÇàÇÒ ¼³Á¤ Áö½Ã¾î¸¦ + ¹­´Â´Ù. ÀϹÝÀûÀÎ (¼ýÀÚ) ºñ±³ÀÇ °æ¿ì version ¾Æ±Ô¸ÕÆ®´Â + 2.1.0À̳ª 2.2¿Í °°ÀÌ + major[.minor[.patch]] + Çü½ÄÀÌ´Ù. minor¿Í patch´Â ¾ø¾îµµ µÈ´Ù. + ÀÌµé ¼ýÀÚ°¡ ¾ø´Ù¸é 0À̶ó°í °¡Á¤ÇÑ´Ù. ´ÙÀ½°ú °°Àº ¼ýÀÚ + operator°¡ °¡´ÉÇÏ´Ù.

    + + + + + + + + + + + + +
    operator¼³¸í
    = ȤÀº ==µ¿ÀÏÇÑ À¥¼­¹ö ¹öÀü
    >º¸´Ù Å« À¥¼­¹ö ¹öÀü
    >=Å©°Å³ª °°Àº À¥¼­¹ö ¹öÀü
    <º¸´Ù ÀÛÀº À¥¼­¹ö ¹öÀü
    <=À۰ųª °°Àº À¥¼­¹ö ¹öÀü
    + +

    ¿¹Á¦

    + <IfVersion >= 2.1>
    + + # ¹öÀüÀÌ 2.1.0 º¸´Ù Å©°Å³ª °°À»¶§¸¸
    + # ½ÇÇàÇÑ´Ù.
    +
    + </IfVersion> +

    + +

    ¼ýÀÚ ºñ±³¿Ü¿¡µµ Á¤±ÔÇ¥Çö½ÄÀ» »ç¿ëÇÏ¿© À¥¼­¹ö ¹öÀüÀ» ÁöÁ¤ÇÒ + ¼ö ÀÖ´Ù. ¿©±â¿¡´Â µÎ°¡Áö ¹æ¹ýÀÌ ÀÖ´Ù.

    + + + + + + +
    operator¼³¸í
    = ȤÀº ==versionÀº + /regex/ Çü½ÄÀÌ´Ù
    ~versionÀº + regex Çü½ÄÀÌ´Ù
    + +

    ¿¹Á¦

    + <IfVersion = /^2.1.[01234]$/>
    + + # ¿¹¸¦ µé¾î, ¿©±â¿¡ ¹ö±×°¡ Àִ ƯÁ¤ ¹öÀü¿¡ ´ëÇÑ ÇØ°áÃ¥ÀÌ ³ª¿Â´Ù + + </IfVersion> +

    + +

    ¿¬»êÀÚ ¾Õ¿¡ ´À³¦Ç¥(!)¸¦ ¾²¸é Àǹ̸¦ ¹Ý´ë·Î + Çؼ®ÇÑ´Ù.

    + +

    + <IfVersion !~ ^2.1.[01234]$>
    + + # ÀÌ ¹öÀüÀÌ ¾Æ´Ï¸é
    +
    + </IfVersion> +

    + +

    operator¸¦ »ý·«Çϸé =À̶ó°í + »ý°¢ÇÑ´Ù.

    + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_vhost_alias.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_vhost_alias.html new file mode 100644 index 00000000..62ad4bdf --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_vhost_alias.html @@ -0,0 +1,9 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mod_vhost_alias.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: mod_vhost_alias.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_vhost_alias.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_vhost_alias.html.en new file mode 100644 index 00000000..45906081 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_vhost_alias.html.en @@ -0,0 +1,314 @@ + + + +mod_vhost_alias - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache Module mod_vhost_alias

    +
    +

    Available Languages:  en  | + tr 

    +
    + + + +
    Description:Provides for dynamically configured mass virtual +hosting
    Status:Extension
    Module Identifier:vhost_alias_module
    Source File:mod_vhost_alias.c
    +

    Summary

    + +

    This module creates dynamically configured virtual hosts, by + allowing the IP address and/or the Host: header of + the HTTP request to be used as part of the pathname to + determine what files to serve. This allows for easy use of a + huge number of virtual hosts with similar configurations.

    + +

    Note

    +

    If mod_alias or mod_userdir are + used for translating URIs to filenames, they will override the + directives of mod_vhost_alias described below. For + example, the following configuration will map + /cgi-bin/script.pl to + /usr/local/apache2/cgi-bin/script.pl in all cases:

    + +

    + ScriptAlias /cgi-bin/ /usr/local/apache2/cgi-bin/
    + VirtualScriptAlias /never/found/%0/cgi-bin/ +

    +
    +
    + +
    top
    +
    +

    Directory Name Interpolation

    + + +

    All the directives in this module interpolate a string into + a pathname. The interpolated string (henceforth called the + "name") may be either the server name (see the UseCanonicalName + directive for details on how this is determined) or the IP + address of the virtual host on the server in dotted-quad + format. The interpolation is controlled by specifiers inspired + by printf which have a number of formats:

    + + + + + + + + + + + + +
    %%insert a %
    %pinsert the port number of the virtual host
    %N.Minsert (part of) the name
    + +

    N and M are used to specify + substrings of the name. N selects from the + dot-separated components of the name, and M + selects characters within whatever N has selected. + M is optional and defaults to zero if it isn't + present; the dot must be present if and only if M + is present. The interpretation is as follows:

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    0the whole name
    1the first part
    2the second part
    -1the last part
    -2the penultimate part
    2+the second and all subsequent parts
    -2+the penultimate and all preceding parts
    1+ and -1+the same as 0
    + +

    If N or M is greater than the number + of parts available a single underscore is interpolated.

    + +
    top
    +
    +

    Examples

    + + +

    For simple name-based virtual hosts you might use the + following directives in your server configuration file:

    + +

    + UseCanonicalName Off
    + VirtualDocumentRoot /usr/local/apache/vhosts/%0 +

    + +

    A request for + http://www.example.com/directory/file.html will be + satisfied by the file + /usr/local/apache/vhosts/www.example.com/directory/file.html. +

    + +

    For a very large number of virtual hosts it is a good idea + to arrange the files to reduce the size of the + vhosts directory. To do this you might use the + following in your configuration file:

    + +

    + UseCanonicalName Off
    + VirtualDocumentRoot /usr/local/apache/vhosts/%3+/%2.1/%2.2/%2.3/%2 +

    + +

    A request for + http://www.domain.example.com/directory/file.html + will be satisfied by the file + /usr/local/apache/vhosts/example.com/d/o/m/domain/directory/file.html.

    + +

    A more even spread of files can be achieved by hashing from the + end of the name, for example:

    + +

    + VirtualDocumentRoot /usr/local/apache/vhosts/%3+/%2.-1/%2.-2/%2.-3/%2 +

    + +

    The example request would come from + /usr/local/apache/vhosts/example.com/n/i/a/domain/directory/file.html.

    + +

    Alternatively you might use:

    + +

    + VirtualDocumentRoot /usr/local/apache/vhosts/%3+/%2.1/%2.2/%2.3/%2.4+ +

    + +

    The example request would come from + /usr/local/apache/vhosts/example.com/d/o/m/ain/directory/file.html.

    + +

    For IP-based virtual hosting you might use the following in + your configuration file:

    + +

    + UseCanonicalName DNS
    + VirtualDocumentRootIP /usr/local/apache/vhosts/%1/%2/%3/%4/docs
    + VirtualScriptAliasIP /usr/local/apache/vhosts/%1/%2/%3/%4/cgi-bin +

    + +

    A request for + http://www.domain.example.com/directory/file.html + would be satisfied by the file + /usr/local/apache/vhosts/10/20/30/40/docs/directory/file.html + if the IP address of www.domain.example.com were + 10.20.30.40. A request for + http://www.domain.example.com/cgi-bin/script.pl would + be satisfied by executing the program + /usr/local/apache/vhosts/10/20/30/40/cgi-bin/script.pl.

    + +

    If you want to include the . character in a + VirtualDocumentRoot directive, but it clashes with + a % directive, you can work around the problem in + the following way:

    + +

    + VirtualDocumentRoot /usr/local/apache/vhosts/%2.0.%3.0 +

    + +

    A request for + http://www.domain.example.com/directory/file.html + will be satisfied by the file + /usr/local/apache/vhosts/domain.example/directory/file.html.

    + +

    The LogFormat + directives %V and %A are useful + in conjunction with this module.

    +
    +
    top
    +

    VirtualDocumentRoot Directive

    + + + + + + + +
    Description:Dynamically configure the location of the document root +for a given virtual host
    Syntax:VirtualDocumentRoot interpolated-directory|none
    Default:VirtualDocumentRoot none
    Context:server config, virtual host
    Status:Extension
    Module:mod_vhost_alias
    + +

    The VirtualDocumentRoot directive allows you to + determine where Apache will find your documents based on the + value of the server name. The result of expanding + interpolated-directory is used as the root of the + document tree in a similar manner to the DocumentRoot directive's argument. + If interpolated-directory is none then + VirtualDocumentRoot is turned off. This directive + cannot be used in the same context as VirtualDocumentRootIP.

    + + +
    +
    top
    +

    VirtualDocumentRootIP Directive

    + + + + + + + +
    Description:Dynamically configure the location of the document root +for a given virtual host
    Syntax:VirtualDocumentRootIP interpolated-directory|none
    Default:VirtualDocumentRootIP none
    Context:server config, virtual host
    Status:Extension
    Module:mod_vhost_alias
    + +

    The VirtualDocumentRootIP directive is like the + VirtualDocumentRoot + directive, except that it uses the IP address of the server end + of the connection for directory interpolation instead of the server + name.

    + +
    +
    top
    +

    VirtualScriptAlias Directive

    + + + + + + + +
    Description:Dynamically configure the location of the CGI directory for +a given virtual host
    Syntax:VirtualScriptAlias interpolated-directory|none
    Default:VirtualScriptAlias none
    Context:server config, virtual host
    Status:Extension
    Module:mod_vhost_alias
    + +

    The VirtualScriptAlias directive allows you to + determine where Apache will find CGI scripts in a similar + manner to VirtualDocumentRoot does for other documents. It matches + requests for URIs starting /cgi-bin/, much like ScriptAlias + /cgi-bin/ would.

    + + +
    +
    top
    +

    VirtualScriptAliasIP Directive

    + + + + + + + +
    Description:Dynamically configure the location of the cgi directory for +a given virtual host
    Syntax:VirtualScriptAliasIP interpolated-directory|none
    Default:VirtualScriptAliasIP none
    Context:server config, virtual host
    Status:Extension
    Module:mod_vhost_alias
    + +

    The VirtualScriptAliasIP directive is like the + VirtualScriptAlias + directive, except that it uses the IP address of the server end + of the connection for directory interpolation instead of the server + name.

    + + +
    +
    +
    +

    Available Languages:  en  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_vhost_alias.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_vhost_alias.html.tr.utf8 new file mode 100644 index 00000000..4b07cb83 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mod_vhost_alias.html.tr.utf8 @@ -0,0 +1,305 @@ + + + +mod_vhost_alias - Apache HTTP Sunucusu + + + + + + +
    <-
    + +
    +

    Apache Modülü mod_vhost_alias

    +
    +

    Mevcut Diller:  en  | + tr 

    +
    + + + +
    Açıklama:Kitlesel sanal konakların devingen olarak yapılandırılmasını sağlar
    Durum:Eklenti
    Modül Betimleyici:vhost_alias_module
    Kaynak Dosyası:mod_vhost_alias.c
    +

    Özet

    + +

    Bu modül, hangi dosyaların sunulacağını saptamak için dosya yolunun + parçası olarak HTTP isteğinin Host: başlığının ve/veya IP + adresinin kullanılmasını mümkün kılarak devingen yapılandırmalı sanal + konaklar oluşturur. Böylece benzer yapılandırmaya sahip çok büyük sayıda + sanal konak kullanımı kolaşlaşır.

    + +

    Bilginize

    +

    URI’leri dosya isimlerine dönüştürmek için mod_alias + veya mod_userdir kullanılmışsa bunlar + mod_vhost_alias yönergeleri tarafından aşağıda + açıklandığı gibi geçersiz kılınırlar. Örneğin, aşağıdaki yapılandırma + her durumda /cgi-bin/script.pl betiğini + /usr/local/apache2/cgi-bin/script.pl betiğine eşleyecektir:

    + +

    + ScriptAlias /cgi-bin/ /usr/local/apache2/cgi-bin/
    + VirtualScriptAlias /nerede/bilinmiyor/%0/cgi-bin/ +

    +
    +
    + +
    top
    +
    +

    Dizin Ä°simlerinin Elde Edilmesi

    + + +

    Bu modüldeki tüm yönergeler bir dizgeyi bir dosya yoluna dönüştürerek + çalışırlar. Dönüşüm dizgesi (bundan sonra “isim” diyeceğiz) ya sunucu + ismi olur (bunun nasıl belirlendiğini öğrenmek için UseCanonicalName yönergesine bakınız) ya da + sunucu üzerindeki sanal konağın IP adresi olur. Dönüşümü, + printf’inkilerin benzeri birkaç biçem belirteci + denetler:

    + + + + + + + + + + + + +
    %%Bir % imi yerleştirir.
    %pSanal konağın IP adresini yerleştirir.
    %N.Mİsmin parçalarını yerleştirir.
    + +

    N ve M ismin alt dizgelerini belirtmek için + kullanılır. N, ismin noktalarla ayrılmış bileşenlerinden + seçim yaparken M, N ile seçilen parçadan + karakter seçmekte kullanılır. M isteğe bağlı olup mevcut + olmaması halinde öntanımlı olarak sıfırdır. Noktanın varlığı + M’nin varlığına bağlıdır. Dönüşüm şöyle uygulanır:

    + + + + + + + + + + + + + + + + + + + + + + + + + + +
    0ismin tamamı
    1ilk parça
    2ikinci parça
    -1son parça
    -2sondan bir önceki parça
    2+ikinci parça ve sonraki parçaların hepsi
    -2+sondan bir önceki parça ve daha önceki parçaların hepsi
    1+ ve -1+0 ile aynı
    + +

    N veya M parça sayısından büyükse dönüşüm + dizgesi sadece alt çizgi karakterini içerir.

    + +
    top
    +
    +

    Örnekler

    + + +

    Sunucu yapılandırma dosyanızda isme dayalı sanal konaklar için + aşağıdaki yönergeler kullanılıyor olsun:

    + +

    + UseCanonicalName Off
    + VirtualDocumentRoot /usr/local/apache/sankonlar/%0 +

    + +

    http://mesela.dom/dizin/dosya.html için yapılan bir istek + /usr/local/apache/sankonlar/mesela.dom/dizin/dosya.html + dosyası ile yerine getirilecektir.

    + +

    Çok büyük sayıda sanal konak için sankonlar dizininin + boyutlarını küçük tutmak amacıyla dosyalar düzenlenebilir. Bunu + yapılandırma dosyanızda şöyle yapabilirsiniz:

    + +

    + UseCanonicalName Off
    + VirtualDocumentRoot /usr/local/apache/sankonlar/%3+/%2.1/%2.2/%2.3/%2 +

    + +

    http://falan.filan.mesela.dom/dizin/dosya.html için + yapılan bir istek + /usr/local/apache/sankonlar/mesela.dom/f/i/l/filan/dizin/dosya.html + ile yerine getirilecektir.

    + +

    Bu sefer de parçaları ismin sonundan toplayalım:

    + +

    + VirtualDocumentRoot /usr/local/apache/sankonlar/%3+/%2.-1/%2.-2/%2.-3/%2 +

    + +

    Bu durumda istek + /usr/local/apache/sankonlar/mesela.dom/n/a/l/filan/dizin/dosya.html + ile karşılanırdı.

    + +

    Şöyle bir şey de yapabilirsiniz:

    + +

    + VirtualDocumentRoot /usr/local/apache/sankonlar/%3+/%2.1/%2.2/%2.3/%2.4+ +

    + +

    Bu örnek için istek + /usr/local/apache/sankonlar/mesela.dom/f/i/l/an/dizin/dosya.html + dosyasından karşılanırdı.

    + +

    IP’ye dayalı sanal konaklar için yapılandırma dosyanızda şu satırlar + olabilirdi:

    + +

    + UseCanonicalName DNS
    + VirtualDocumentRootIP + /usr/local/apache/sankonlar/%1/%2/%3/%4/belgeler
    + VirtualScriptAliasIP /usr/local/apache/sankonlar/%1/%2/%3/%4/cgi-bin +

    + +

    http://falan.filan.mesela.dom/dizin/dosya.html için + yapılan bir istek eğer falan.filan.mesela.dom’un IP adresi + 10.20.30.40 olsaydı, + /usr/local/apache/sankonlar/10/20/30/40/belgeler/dizin/dosya.html + dosyası ile karşılanırdı. + http://falan.filan.mesela.dom/cgi-bin/betik.pl için yapılan + bir istek ise + /usr/local/apache/sankonlar/10/20/30/40/cgi-bin/betik.pl + betiğinin çalıştırılması ile sağlanırdı.

    + +

    Bir VirtualDocumentRoot yönergesinin . + karakterini içermesini isterseniz, bir biçem belirteci ile karışıklığa + sebep olmaksızın bunu şöyle sağlayabilirsiniz:

    + +

    + VirtualDocumentRoot /usr/local/apache/sankonlar/%2.0.%3.0 +

    + +

    Bu durumda http://falan.filan.mesela.dom/dizin/dosya.html + için yapılan bir istek + /usr/local/apache/sankonlar/filan.mesela/dizin/dosya.html + dosyası ile karşılanacaktır.

    + +

    LogFormat yönergesinin + %V ve %A biçem belirteçleri bu modülle + birlikte kullanıldığında çok yararlı olurlar.

    +
    +
    top
    +

    VirtualDocumentRoot Yönergesi

    + + + + + + + +
    Açıklama:Bir sanal konağın belge kök dizinini devingen olarak yapılandırır. +
    Sözdizimi:VirtualDocumentRoot hesaplanan-dizin|none
    Öntanımlı:VirtualDocumentRoot none
    Bağlam:sunucu geneli, sanal konak
    Durum:Eklenti
    Modül:mod_vhost_alias
    + +

    VirtualDocumentRoot yönergesi sunucu ismine göre + belgelerin bulunacağı yeri Apache’nin saptamasını sağlar. + hesaplanan-dizin’in dönüşüm sonucu DocumentRoot yönergesinin değeriymiş gibi + belge ağacının kök dizini olarak kullanılır. + hesaplanan-dizin yerine none + belirtilmişse VirtualDocumentRoot iptal edilmiş + olur. Bu yönerge VirtualDocumentRootIP yönergesinin kullanıldığı bağlamda + yer alamaz.

    + + +
    +
    top
    +

    VirtualDocumentRootIP Yönergesi

    + + + + + + + +
    Açıklama:Bir sanal konağın belge kök dizinini devingen olarak yapılandırır. +
    Sözdizimi:VirtualDocumentRootIP hesaplanan-dizin|none
    Öntanımlı:VirtualDocumentRootIP none
    Bağlam:sunucu geneli, sanal konak
    Durum:Eklenti
    Modül:mod_vhost_alias
    + +

    VirtualDocumentRootIP yönergesi, dizinin + saptanmasında sunucu ismi yerine bağlantının sonlandığı sunucunun IP + adresini kullanması dışında VirtualDocumentRoot gibidir.

    + +
    +
    top
    +

    VirtualScriptAlias Yönergesi

    + + + + + + + +
    Açıklama:Bir sanal konağın CGI dizinini devingen olarak yapılandırır. +
    Sözdizimi:VirtualScriptAlias hesaplanan-dizin|none
    Öntanımlı:VirtualScriptAlias none
    Bağlam:sunucu geneli, sanal konak
    Durum:Eklenti
    Modül:mod_vhost_alias
    + +

    VirtualScriptAlias yönergesi, CGI betiklerinin + bulunacağı yeri Apache’nin saptamasını sağlamak bakımından VirtualDocumentRoot yönergesinin + yaptığını yapar. /cgi-bin/ ile başlayan istekler için ise + ScriptAlias yönergesinin + yaptığını yapar.

    + + +
    +
    top
    +

    VirtualScriptAliasIP Yönergesi

    + + + + + + + +
    Açıklama:Bir sanal konağın CGI dizinini devingen olarak yapılandırır. +
    Sözdizimi:VirtualScriptAliasIP hesaplanan-dizin|none
    Öntanımlı:VirtualScriptAliasIP none
    Bağlam:sunucu geneli, sanal konak
    Durum:Eklenti
    Modül:mod_vhost_alias
    + +

    VirtualScriptAliasIP yönergesi, dizinin + saptanmasında sunucu ismi yerine bağlantının sonlandığı sunucunun IP + adresini kullanması dışında VirtualScriptAlias gibidir.

    + + +
    +
    +
    +

    Mevcut Diller:  en  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/module-dict.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/module-dict.html new file mode 100644 index 00000000..d00e7b58 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/module-dict.html @@ -0,0 +1,17 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: module-dict.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: module-dict.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: module-dict.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: module-dict.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/module-dict.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/module-dict.html.en new file mode 100644 index 00000000..2985311f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/module-dict.html.en @@ -0,0 +1,119 @@ + + + +Terms Used to Describe Modules - Apache HTTP Server + + + + + +
    <-
    +

    Terms Used to Describe Modules

    +
    +

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

    +
    + +

    This document describes the terms that are used to describe + each Apache module.

    +
    + +
    top
    +
    +

    Description

    + +

    A brief description of the purpose of the module.

    +
    top
    +
    +

    Status

    + +

    This indicates how tightly bound into the Apache Web server + the module is; in other words, you may need to recompile the + server in order to gain access to the module and its + functionality. Possible values for this attribute are:

    + +
    +
    MPM
    + +
    A module with status "MPM" is a Multi-Processing Module. Unlike the + other types of modules, Apache must have one and only one MPM + in use at any time. This type of module is responsible for + basic request handling and dispatching.
    + +
    Base
    + +
    A module labeled as having "Base" status is compiled and + loaded into the server by default, and is therefore normally + available unless you have taken steps to remove the module + from your configuration.
    + +
    Extension
    + +
    A module with "Extension" status is not normally compiled + and loaded into the server. To enable the module and its + functionality, you may need to change the server build + configuration files and re-compile Apache.
    + +
    Experimental
    + +
    "Experimental" status indicates that the module is + available as part of the Apache kit, but you are on your own + if you try to use it. The module is being documented for + completeness, and is not necessarily supported.
    + +
    External
    + +
    Modules which are not included with the base Apache + distribution ("third-party modules") may use the "External" + status. We are not responsible for, nor do we support such + modules.
    +
    +
    top
    +
    +

    Source File

    + +

    This quite simply lists the name of the source file which + contains the code for the module. This is also the name used by + the <IfModule> + directive.

    +
    top
    +
    +

    Module Identifier

    + +

    This is a string which identifies the module for use in the + LoadModule directive when + dynamically loading modules. In particular, it is the name of + the external variable of type module in the source file.

    +
    top
    +
    +

    Compatibility

    + +

    If the module was not part of the original Apache version 2 + distribution, the version in which it was introduced should be + listed here. In addition, if the module is limited to + particular platforms, the details will be listed here.

    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/module-dict.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/module-dict.html.ja.utf8 new file mode 100644 index 00000000..8c8df156 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/module-dict.html.ja.utf8 @@ -0,0 +1,121 @@ + + + +Apache モジュールの解説で使用する用語 - Apache HTTP サーバ + + + + + +
    <-
    +

    Apache モジュールの解説で使用する用語

    +
    +

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

    +
    + +

    この文書は Apache の各 モジュール を説明するために + 使われている用語を説明します。

    +
    + +
    top
    +
    +

    説明

    + +

    モジュールの目的の短い説明。

    +
    top
    +
    +

    ステータス

    + +

    これは、そのモジュールが Apache + ウェブサーバにどれくらい密接に組み込まれているかを示します。 + 言い換えれば、モジュールを組み込み、その機能を利用するために、 + サーバを再コンパイルする必要があるかもしれないということを示します。 + この属性が取り得る値は以下のものです:

    +
    +
    MPM
    + +
    ステータスが "MPM" のモジュールはマルチプロセッシングモジュールです。 + 他の種類のモジュールとは違って、Apache は常に MPM を一つだけ + 使用し続けます。この種類のモジュールは基本的なリクエストの扱いと + ディスパッチを行ないます。
    + +
    Base
    + +
    ステータスが "Base" + のモジュールは、デフォルトでコンパイルされてわざわざ設定から + モジュールを削除していない限り、通常は利用可能です。 +
    + +
    Extension
    + +
    ステータスが "Extension" のモジュールは、 + デフォルトではコンパイルされず、サーバにも読み込まれません。 + そのモジュールとその機能を有効にするには、 + サーバをビルドするための設定を変更して、Apache + を再コンパイルする必要があります。
    +
    Experimental
    + +
    ステータスが "Experimental" のモジュールは、 + Apache 配布物に同梱されていますが、 + 使用する場合は自己責任で行なう必要があります。 + そのモジュールは、ドキュメントも完成に向けて作成中ですし、 + サポートされるているとは限りません。
    +
    External
    + +
    ステータスが "External" のモジュールは、基本 Apache + 配布に同梱されません ("サードパーティーモジュール")。 + そのため、我々に責任はありませんし、 + そのモジュールのサポートもしていません。
    +
    +
    top
    +
    +

    ソースファイル

    + +

    これは単純に、 + そのモジュールに必要なコードを含むソースファイルの名前を列挙したものです。 + これは、<IfModule> + ディレクティブで使用される名前でもあります。 +

    +
    top
    +
    +

    モジュール識別子

    + +

    この文字列は、モジュールの動的読み込みを行なうときに使用する LoadModule + ディレクティブにおいて使用されるモジュールの識別子です。 + 詳しく書くと、ソースファイル内の module タイプの外部変数の名前です。 +

    +
    top
    +
    +

    互換性

    + +

    あるモジュールが Apache バージョン 2 + の配布に含まれていなかった場合、 + そのモジュールが導入されたバージョンがここに書かれています。 + また、モジュールが特定のプラットフォームにのみ存在するときも + 詳細はここに書かれています。

    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/module-dict.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/mod/module-dict.html.ko.euc-kr new file mode 100644 index 00000000..5d58cfcb --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/module-dict.html.ko.euc-kr @@ -0,0 +1,111 @@ + + + +¸ðµâÀ» ¼³¸íÇϱâÀ§ÇØ »ç¿ëÇÑ ¿ë¾îµé - Apache HTTP Server + + + + + +
    <-
    +

    ¸ðµâÀ» ¼³¸íÇϱâÀ§ÇØ »ç¿ëÇÑ ¿ë¾îµé

    +
    +

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

    +
    + +

    ÀÌ ¹®¼­´Â ¾ÆÆÄÄ¡ ¸ðµâÀ» ¼³¸íÇϱâÀ§ÇØ + »ç¿ëÇÑ ¿ë¾î¸¦ ¼³¸íÇÑ´Ù.

    +
    + +
    top
    +
    +

    ¼³¸í

    + +

    ¸ðµâ ¸ñÀû¿¡ ´ëÇÑ °£´ÜÇÑ ¼³¸í.

    +
    top
    +
    +

    »óÅÂ

    + +

    ¸ðµâÀÌ ¾ÆÆÄÄ¡ À¥¼­¹ö¿Í ¾ó¸¶³ª ¹ÐÁ¢È÷ ¿¬°üµÇÀÖ´ÂÁö ³ªÅ¸³½´Ù. + Áï, ƯÁ¤ ¸ðµâ°ú ¸ðµâÀÇ ±â´ÉÀ» »ç¿ëÇϱâÀ§Çؼ­ ¼­¹ö¸¦ ´Ù½Ã + ÄÄÆÄÀÏÇØ¾ß ÇÒ °æ¿ì°¡ ÀÖ´Ù. ÀÌ ¼Ó¼ºÀÇ °ªÀº:

    + +
    +
    MPM
    + +
    »óÅ°¡ "MPM"ÀÎ ¸ðµâÀº ´ÙÁßó¸® + ¸ðµâÀÌ´Ù. ´Ù¸¥ Á¾·ùÀÇ ¸ðµâ°ú ´Þ¸® ¾ÆÆÄÄ¡´Â ¿ÀÁ÷ ÇÑ + MPM¸¸À» »ç¿ëÇÑ´Ù. ÀÌ·± Á¾·ùÀÇ ¸ðµâÀº ±âº»ÀûÀÎ ¿äû ó¸®¿Í + ºÐ¹è¸¦ ´ã´çÇÑ´Ù.
    + +
    Base
    + +
    »óÅ°¡ "Base"ÀÎ ¸ðµâÀº ±âº»ÀûÀ¸·Î ¼­¹ö¿Í °°ÀÌ ÄÄÆÄÀϵǹǷÎ, + ¼³Á¤¿¡¼­ ¸ðµâÀ» Á¦°ÅÇÏÁö ¾Ê´Â ÇÑ º¸Åë »ç¿ëÇÒ ¼ö ÀÖ´Ù.
    + +
    Extension
    + +
    »óÅ°¡ "Extension"ÀÎ ¸ðµâÀº º¸Åë ¼­¹ö¿Í °°ÀÌ ÄÄÆÄÀϵÇÁö + ¾Ê´Â´Ù. ¸ðµâ°ú ¸ðµâÀÇ ±â´ÉÀ» »ç¿ëÇÏ·Á¸é ¼­¹ö ÄÄÆÄÀÏ + ±¸¼ºÆÄÀÏÀ» º¯°æÇÏ°í ¾ÆÆÄÄ¡¸¦ ´Ù½Ã ÄÄÆÄÀÏÇØ¾ß ÇÑ´Ù.
    + +
    Experimental
    + +
    "Experimental" »óÅ´ ¸ðµâÀÌ ¾ÆÆÄÄ¡ ¹èÆ÷º»¿¡ Æ÷ÇÔµÇÀÖÁö¸¸, + »ç¿ëÇÏ·Á¸é À§ÇèÀ» °¨¼öÇØ¾ß ÇÑ´Ù. ¸ðµâ¿¡ ´ëÇÑ ¹®¼­°¡ ÀÖÁö¸¸, + ¸ðµâÀ» Áö¿øÇÑ´Ù´Â ¸»Àº ¾Æ´Ï´Ù.
    + +
    External
    + +
    "External" »óÅ´ ±âº» ¾ÆÆÄÄ¡ ¹èÆ÷º»¿¡ Æ÷ÇÔµÇÁö ¾ÊÀº + ¸ðµâ("Á¦»ïÀÚ°¡ ¸¸µç ¸ðµâ")ÀÌ´Ù. ¿ì¸®´Â ÀÌ·± ¸ðµâ¿¡ Ã¥ÀÓÀÌ + ¾ø°í Áö¿øÇÏÁöµµ ¾Ê´Â´Ù.
    +
    +
    top
    +
    +

    ¼Ò½ºÆÄÀÏ

    + +

    °£´ÜÇÏ°Ô ¸»Çؼ­ ¸ðµâ ¼Ò½ºÄڵ尡 ÀÖ´Â ¼Ò½ºÆÄÀϸíÀÌ´Ù. + <IfModule> + Áö½Ã¾î¿¡¼­ »ç¿ëÇÏ´Â À̸§À̱⵵ ÇÏ´Ù.

    +
    top
    +
    +

    ¸ðµâ¸í

    + +

    ¸ðµâÀ» ÁöĪÇÏ´Â ¹®ÀÚ¿­·Î, ¸ðµâÀ» µ¿ÀûÀ¸·Î ÀоîµéÀÌ´Â + LoadModule Áö½Ã¾î¿¡¼­ + »ç¿ëÇÑ´Ù. Á¤È®È÷ ¸»ÇÏ¸é ¼Ò½ºÆÄÀÏ¿¡¼­ module ÇüÀÇ ¿ÜºÎº¯¼ö + À̸§ÀÌ´Ù.

    +
    top
    +
    +

    Áö¿ø

    + +

    ¸ðµâÀÌ ¿ø·¡ ¾ÆÆÄÄ¡ ¹öÀü 2 ¹èÆ÷º»¿¡ Æ÷ÇÔµÇÁö ¾Ê¾Ò´Ù¸é, + ¸ðµâÀ» óÀ½ ¼Ò°³ÇÑ ¹öÀüÀ» ¾Ë·ÁÁØ´Ù. ¶Ç, ¸ðµâÀÌ Æ¯Á¤ + Ç÷¡Æû¿ëÀ̶ó¸é »ó¼¼È÷ ¼³¸íÇÑ´Ù.

    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/module-dict.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/module-dict.html.tr.utf8 new file mode 100644 index 00000000..03f7936f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/module-dict.html.tr.utf8 @@ -0,0 +1,91 @@ + + + +Modülleri Tanımlamakta Kullanılan Terimler - Apache HTTP Sunucusu + + + + + +
    <-
    +

    Modülleri Tanımlamakta Kullanılan Terimler

    +
    +

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

    +
    + +

    Bu belgede Apache modüllerini tanımlarken kullanılan terimler açıklanmıştır.

    +
    + +
    top
    +
    +

    Açıklama

    + +

    Modülün kullanım amacının kısa bir açıklaması.

    +
    top
    +
    +

    Durum

    + +

    Modülün Apache HTTP sunucusuna ne kadar sıkı bağlı olduğunu belirtir. Başka bir deyişle, modüle ve işlevselliğine erişim kazanmak için sunucuyu yeniden derlemek gerekip gerekmediği ile ilgili durumu belirtir. Bu özniteliğin olası değerleri şunlardır:

    + +
    +
    MPM
    + +
    “MPM” durumlu bir modül bir Çok Süreçlilik Modülüdür. Diğer modül türlerinin aksine, sunucunun kullandığı MPM modülü sayısı birden fazla olamaz. Bu modül türü temelde sunucuya gelen isteklerin ele alınmasından ve öldürülmesinden sorumludur.
    + +
    Temel
    + +
    “Temel” durumuyla etiketlenmiş bir modül öntanımlı olarak olarak derlenir ve sunucuya öntanımlı olarak yüklenir. Bu bakımdan derleme öncesi paket yapılandırması sırasında modülün derlenmemesi özellikle istenmedikçe bu modül derlenecek ve sunucuya yüklenecektir.
    + +
    Eklenti
    + +
    “Eklenti” durumundaki bir modül normal olarak derlenmez ve sunucuya yüklenmez. Modülü ve işlevselliğini etkin kılmak için sunucunun derleme öncesi paket yapılandırması sırasında modülün derleneceğini açıkça belirttikten sonra gerekirse yeniden derlemeniz gerekir.
    + +
    Deneysel
    + +
    “Deneysel” durumu modülün Apache sunucusunun bir parçası olarak kabul edildiğini ancak modülü denemenin tamamen sizin insiyatifinize bırakıldığı anlamına gelir. Böyle bir modül her şeyiyle belgelenmiştir fakat gerektiği gibi desteklenmemiştir.
    + +
    Harici
    + +
    “Harici” durumu temel Apache dağıtımında bulunmayan (“üçüncü parti”) modüller için kullanılır. Böyle modüller için sorumluluk kabul etmediğimiz gibi bunları desteklemiyoruz.
    +
    +
    top
    +
    +

    Kaynak Dosyası

    + +

    Karşısına modül kodunu içeren kaynak dosyasının ismi yazılır. Bu isim ayrıca <IfModule> yönergesi tarafından da kullanılır.

    +
    top
    +
    +

    Modül Betimleyici

    + +

    Modüller devingen olarak yüklenirken LoadModule yönergesinde kullanmak için modülü betimleyen dizgedir. Aslında, kaynak dosyasında module türündeki harici değişkenin ismidir.

    +
    top
    +
    +

    Uyumluluk

    + +

    Eğer modül Apache’nin 2. sürüm dağıtımının özgün parçası değilse söz konusu sürüm burada belirtilir. Ayrıca, modülün kullanımı belli platformlarla sınırlıysa bunun ayrıntıları da burada belirtilir.

    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mpm_common.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mpm_common.html new file mode 100644 index 00000000..af899fa5 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mpm_common.html @@ -0,0 +1,21 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mpm_common.html.de +Content-Language: de +Content-type: text/html; charset=ISO-8859-1 + +URI: mpm_common.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: mpm_common.html.es +Content-Language: es +Content-type: text/html; charset=ISO-8859-1 + +URI: mpm_common.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: mpm_common.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mpm_common.html.de b/rubbos/app/httpd-2.0.64/docs/manual/mod/mpm_common.html.de new file mode 100644 index 00000000..664f14c0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mpm_common.html.de @@ -0,0 +1,978 @@ + + + +mpm_common - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Allgemeine Direktiven der Apache-MPMs

    +
    +

    Verfügbare Sprachen:  de  | + en  | + es  | + ja  | + tr 

    +
    +
    Diese Übersetzung ist möglicherweise + nicht mehr aktuell. Bitte prüfen Sie die englische Version auf + die neuesten Änderungen.
    + +
    Beschreibung:Eine Sammlung von Direktiven, die in mehr als einem + Multi-Processing-Modul (MPM) implementiert sind.
    Status:MPM
    +
    + + +
    top
    +

    AcceptMutex-Direktive

    + + + + + + + +
    Beschreibung:Vom Apache verwendete Methode zur Serialisierung mehrerer + Kindprozesse, die Anfragen an Netzwerk-Sockets entgegennehmen.
    Syntax:AcceptMutex Default|Methode
    Voreinstellung:AcceptMutex Default
    Kontext:Serverkonfiguration
    Status:MPM
    Modul:leader, perchild, prefork, threadpool, worker
    +

    Die Direktive AcceptMutex bestimmt die + Methode, die der Apache zur Serialisierung mehrerer Kindprozesse + verwendet, welche Anfragen an Netzwerk-Sockets entgegennehmen. Vor + Apache 2.0 war diese Methode nur zur Kompilierungszeit einstellbar. + Die optimale Methode ist sehr stark von der Architektur und + Plattform abhängig. Lesen Sie bitte Perfomance-Hinweise für + weitere Details.

    + +

    Wenn die Direktive auf Default eingestellt ist, dann + wird die zur Kompilierungszeit gewählte Voreinstellung verwendet. + Weitere mögliche Methoden sind unten angegeben. Beachten Sie, dass + nicht alle Methoden auf allen Plattformen verfügbar sind. Wird + eine Methode angegeben, die nicht verfügbar ist, dann wird + eine Nachricht in das Fehlerprotokoll geschrieben, welche die + verfügbaren Methoden auflistet.

    + +
    +
    flock
    +
    verwendet die Systemfunktion flock(2), um die + durch die LockFile-Direktive definierte Datei zu sperren.
    + +
    fcntl
    +
    verwendet die Systemfunktion fcntl(2), um die + durch die LockFile-Direktive definierte Datei zu sperren.
    + +
    posixsem
    +
    verwendet POSIX-kompatible Semaphore, um den Mutex zu + implementieren.
    + +
    pthread
    +
    verwendet gemäß der POSIX-Thread-Spezifikation + implementierte POSIX-Mutexe.
    + +
    sysvsem
    +
    verwendet Semaphoren des SysV-Typs, um den Mutex zu + implementieren.
    +
    + +

    Um die bei der Kompilierung gewählte Voreinstellung für + Ihr System herauszufinden, können Sie Ihr LogLevel auf debug setzen. Dann wird der + voreingestellte AcceptMutex ins ErrorLog geschrieben.

    + +
    +
    top
    +

    BS2000Account-Direktive

    + + + + + + + +
    Beschreibung:Bestimmt den nicht-privilegierten Account auf +BS2000-Maschinen
    Syntax:BS2000Account Account
    Kontext:Serverkonfiguration
    Status:MPM
    Modul:perchild, prefork
    Kompatibilität:Nur für BS2000-Maschinen verfügbar
    +

    Die Direktive BS2000Account ist nur + für BS2000-Hosts verfügbar. Sie muss dazu verwendet werden, + den Account für den nicht-privilegierten Apache-Server-Benutzer + (der durch die Direktive User + eingestellt wird) zu bestimmen. Dies wird vom BS2000-POSIX-Subsystem + benötigt (um die zugrundeliegende BS2000-Anwendungsumgebung + mittels eines Sub-LOGONs zu wechseln), um zu verhindern, dass + CGI-Skripte auf Ressourcen des privilegierten Accounts zugreifen, der + den Server gestartet hat, üblicherweise SYSROOT.

    + +

    Anmerkung

    +

    Es kann nur eine BS2000Account-Direktive verwendet + werden.

    +
    + +

    Siehe auch

    + +
    +
    top
    +

    CoreDumpDirectory-Direktive

    + + + + + + + +
    Beschreibung:Verzeichnis, in das der Apache zu wechseln versucht, bevor er + einen Hauptspeicherauszug erstellt
    Syntax:CoreDumpDirectory Verzeichnis
    Voreinstellung:Für die Voreinstellung siehe Beschreibung
    Kontext:Serverkonfiguration
    Status:MPM
    Modul:beos, leader, mpm_winnt, perchild, prefork, threadpool, worker
    +

    Dies beeinflusst das Verzeichnis, in welches der Apache zu wechseln + versucht, bevor er einen Hauptspeicherauszug (Anm.d.Ü.: einen + so genannten Core-Dump) erstellt. Die Voreinstellung ist das + ServerRoot-Verzeichnis. Da dieses + jedoch nicht für den Benutzer beschreibbar sein soll, unter dem + der Server läuft, werden normalerweise keine + Hauptspeicherauszüge geschrieben. Wenn Sie zum Debuggen + einen Hauptspeicherauszug haben möchten, können Sie + ihn mit dieser Direktive an einem anderen Ort ablegen lassen.

    + +

    Hauptspeicherauszüge unter Linux

    +

    Wenn Apache als root startet und zu einem anderen Benutzer + wechselt, deaktiviert der Linux-Kernel Hauptspeicherauszüge + auch dann, wenn der Prozess in dem Verzeichnis schreiben darf. Ab Linux + 2.4 reaktiviert Apache (ab 2.0.46) Hauptspeicherauszüge wieder, + jedoch nur dann, wenn Sie explizit + CoreDumpDirectory konfigurieren.

    +
    + +
    +
    top
    +

    EnableExceptionHook-Direktive

    + + + + + + + + +
    Beschreibung:Aktiviert einen Hook, der nach einem Absturz noch +Ausnahmefehler behandeln lassen kann
    Syntax:EnableExceptionHook On|Off
    Voreinstellung:EnableExceptionHook Off
    Kontext:Serverkonfiguration
    Status:MPM
    Modul:leader, perchild, prefork, threadpool, worker
    Kompatibilität:Verfügbar seit Version 2.0.49
    +

    Diese Direktive ist aus Sicherheitsgründen nur verfügbar, + wenn der Server mit der Option --enable-exception-hook + konfiguriert wurde. Sie aktiviert einen Hook, der es externen Modulen + erlaubt, sich dort einzuhängen und nach dem Absturz eines + Kindprozesses noch Aktionen durchzuführen.

    + +

    Es existieren bereits zwei Module, mod_whatkilledus und + mod_backtrace, welche diesen Hook verwenden. Weitere + Informationen hierzu finden Sie auf Jeff Trawicks EnableExceptionHook-Seite.

    + +
    +
    top
    +

    Group-Direktive

    + + + + + + + + +
    Beschreibung:Benutzergruppe, unter welcher der Server Anfragen + beantwortet
    Syntax:Group Unix-Gruppe
    Voreinstellung:Group #-1
    Kontext:Serverkonfiguration
    Status:MPM
    Modul:beos, leader, mpmt_os2, perchild, prefork, threadpool, worker
    Kompatibilität:Seit Apache 2.0 nur in der globalen Server-Konfiguration + gültig
    +

    Die Direktive Group bestimmt die + Benutzergruppe, unter welcher der Server Anfragen beantwortet. + Um diese Direktive zu verwenden, muss der Server als root gestartet + werden. Wenn Sie den Server unter einem nicht-root-Benutzer starten, + wird er nicht zur angegebenen Gruppe wechseln können und statt + dessen weiter mit der Gruppe des ursprünglichen Benutzers + laufen. Unix-Gruppe kann sein:

    + +
    +
    Ein Gruppenname
    +
    Verweist auf die durch den Namen angegebene Gruppe.
    + +
    # gefolgt von einer Gruppennummer.
    +
    Verweist auf die durch ihre Nummer angegebene Gruppe.
    +
    + +

    Beispiel

    + Group www-group +

    + +

    Es wird empfohlen, dass Sie eine neue Gruppe speziell zum Betrieb + des Servers erstellen. Einige Administratoren verwenden den Benutzer + nobody. Dies ist jedoch nicht immer möglich + oder gewünscht.

    + +

    Sicherheit

    +

    Setzen Sie Group (oder User) nicht auf root, + solange Sie nicht ganz genau wissen, was Sie tun und welche Gefahren + Sie eingehen.

    +
    + +

    Wichtiger Hinweis: Die Verwendung der Direktive innerhalb von + <VirtualHost> + wird nicht länger unterstützt. Benutzen Sie SuexecUserGroup um Ihren Server + für suexec einzurichten.

    + +

    Anmerkung

    +

    Obwohl die Direktive Group in den MPMs + beos und mpmt_os2 existiert, ist + sie dort tatsächlich eine Leeranweisung und exisitert nur + aus Kompatibilitätsgründen.

    +
    + +
    +
    top
    +

    Listen-Direktive

    + + + + + + + +
    Beschreibung:IP-Adressen und Ports, an denen der Server lauscht
    Syntax:Listen [IP-Addresse:]Port
    Kontext:Serverkonfiguration
    Status:MPM
    Modul:beos, leader, mpm_netware, mpm_winnt, mpmt_os2, perchild, prefork, threadpool, worker
    Kompatibilität:Seit Apache 2.0 vorgeschrieben
    +

    Die Direktive Listen weist den Apache an, + nur an den angegebenen IP-Adressen oder Ports zu lauschen. + Standardmäßig antwortet er auf alle Anfragen an allen + IP-Interfaces. Listen ist nun eine notwendige + Anweisung. Wenn sie nicht in der Konfigurationsdatei enthalten ist, + wird der Server-Start fehlschlagen. Dies ist eine Änderung + gegenüber früheren Versionen des Apache.

    + +

    Die Direktive Listen weist den Server an, + ankommende Anfragen am angegebenen Port oder der + Kombination aus Adresse und Port entgegenzunehmen. Wenn nur eine Portnummer + angegeben ist, dann lauscht der Server am angegebenen Port an allen + Interfaces. Wenn sowohl eine IP-Adresse als auch ein Port angegeben + sind, dann lauscht der Server am angegeben Port und Interface.

    + +

    Es können mehrere Listen-Anweisungen + verwendet werden, um eine Reihe von Adressen und Port anzugeben, an + denen gelauscht werden soll. Der Server antwortet auf Anfragen von + jedem der aufgeführten Adressen und Ports.

    + +

    Um beispielsweise den Server Verbindungen an den beiden Ports 80 und + 8000 annehmen zu lassen, verwenden Sie:

    + +

    + Listen 80
    + Listen 8000 +

    + +

    Um den Server Verbindungen an zwei angegebenen Interfaces und Ports + annehmen zu lassen, verwenden Sie:

    + +

    + Listen 192.170.2.1:80
    + Listen 192.170.2.5:8000 +

    + +

    IPv6-Adressen müssen wie in dem folgenden Beispiel in eckige + Klammern eingeschlossen werden:

    + +

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

    + +

    Fehlermöglichkeit

    + Mehrere Listen-Direktiven für gleiche + IP-Adresse und Port führen zur Fehlermeldung + Address already in use (Anm.d.Ü.: Adresse schon in + Benutzung). +
    + +

    Siehe auch

    + +
    +
    top
    +

    ListenBackLog-Direktive

    + + + + + + + +
    Beschreibung:Maximale Länge der Warteschlange schwebender + Verbindungen
    Syntax:ListenBacklog backlog
    Voreinstellung:ListenBacklog 511
    Kontext:Serverkonfiguration
    Status:MPM
    Modul:beos, leader, mpm_netware, mpm_winnt, mpmt_os2, perchild, prefork, threadpool, worker
    +

    Die maximale Länge der Warteschlange schwebender Verbindungen. + Üblicherweise ist keine Feineinstellung notwendig oder sinnvoll, + auf einigen System kann es jedoch gewünscht sein, diesen Wert bei + TCP-SYN-Angriffen zu erhöhen. Beachten Sie auch die Beschreibung des + backlog-Parameters der Systemfunktion listen(2).

    + +

    Der Wert wird vom Betriebssystem oft auf eine niedrigere + Einstellung begrenzt. Dies variiert von Betriebssystem zu Betriebssystem. + Beachten Sie auch, dass viele Betriebssyteme nicht genau beachten, + was für backlog angegeben ist, jedoch einen Wert basierend auf der + Angabe (normalerweiseweise jedoch größer als diese) verwenden.

    + +
    +
    top
    +

    LockFile-Direktive

    + + + + + + + +
    Beschreibung:Ablageort der Lock-Datei für die Serialisierung von +entgegengenommenen Anfragen
    Syntax:LockFile Dateiname
    Voreinstellung:LockFile logs/accept.lock
    Kontext:Serverkonfiguration
    Status:MPM
    Modul:leader, perchild, prefork, threadpool, worker
    +

    Die Direktive LockFile legt den Pfad zur + Lock-Datei fest, die verwendet wird, wenn der Apache mit einer der + AcceptMutex-Einstellungen + fcntl oder flock verwendet wird. Die Anweisung + sollte normalerweise bei der Voreinstellung belassen werden. + Der Hauptgrund, sie zu ändern, ist, wenn das + logs-Verzeichnis auf einem per NFS-eingebundenen Laufwerk + liegt, da die Lock-Datei auf einer lokalen Platte abgelegt sein + muss. Die PID (Anm.d.Ü.: Prozess-ID) des + Hauptserverprozesses wird automatisch an den Dateinamen angehängt.

    + +

    Sicherheit

    +

    Es ist am besten, die Ablage in einem allgemein (Anm.d.Ü.: für + jedermann) beschreibbaren + Verzeichnis wie /var/tmp zu vermeiden, da + ein Denial-of-Servide-Angriff gestartet werden könnte und der + Server am Start gehindert werden könnte, indem eine Lock-Datei + mit dem gleichen Namen erstellt wird, wie der Server sie zu erstellen + versuchen würde.

    +
    + +

    Siehe auch

    + +
    +
    top
    +

    MaxClients-Direktive

    + + + + + + + +
    Beschreibung:Maximale Anzahl der Kindprozesse, die zur Bedienung von Anfragen + gestartet wird
    Syntax:MaxClients Anzahl
    Voreinstellung:Für Details siehe Beschreibung
    Kontext:Serverkonfiguration
    Status:MPM
    Modul:beos, leader, prefork, threadpool, worker
    +

    Die Direktive MaxClients setzt die Grenze + für die Anzahl gleichzeitig bedienter Anfragen. Jeder + Verbindungsversuch oberhalb der MaxClients-Begrenzung wird üblicherweise in eine + Warteschlange gestellt, bis zu einer Anzahl basierend auf der + ListenBacklog-Anweisung. + Sobald ein Kindprozess am Ende einer anderen Anfrage freigegeben wird, + wird die Verbindung bedient.

    + +

    Für Server ohne Thread-Unterstützung (z.B. + prefork) wird MaxClients als + maximale Anzahl der Kindprozesse verstanden, die zur Bedienung von + Anfragen gestartet werden. Die Voreinstellung ist 256. Um + diesen Wert zu erhöhen, muss auch ServerLimit angehoben werden.

    + +

    Bei Servern mit Thread-Unterstützung und bei Hybrid-Servern + (z.B. beos oder worker) + begrenzt MaxClients die Gesamtzahl der Threads, + die für die Bedienung von Anfragen verfügbar sind. + Die Voreinstellung für beos ist 50. + Bei Hybrid-MPMs ist die Voreinstellung 16 (ServerLimit) multipliziert mit + dem Wert 25 (ThreadsPerChild). Um MaxClients + auf einen Wert zu erhöhen, der mehr als 16 Prozesse erfordert, + müssen Sie daher auch ServerLimit anheben.

    + +
    +
    top
    +

    MaxMemFree-Direktive

    + + + + + + + +
    Beschreibung:Maximale Menge des Arbeitsspeichers, den die + Haupt-Zuteilungsroutine verwalten darf, ohne free() + aufzurufen
    Syntax:MaxMemFree KBytes
    Voreinstellung:MaxMemFree 0
    Kontext:Serverkonfiguration
    Status:MPM
    Modul:beos, leader, mpm_netware, prefork, threadpool, worker, mpm_winnt
    +

    Die Direktive MaxMemFree gibt die maximale + Menge freier Kilobytes an, welche die Haupt-Zuteilungsroutine verwalten + darf, ohne free() aufzurufen. Wenn keine Angabe gemacht wird, + oder Null angegeben ist, wird dieser Wert nicht eingeschränkt.

    + +
    +
    top
    +

    MaxRequestsPerChild-Direktive

    + + + + + + + +
    Beschreibung:Obergrenze für die Anzahl von Anfragen, die ein einzelner + Kindprozess während seines Lebens bearbeitet
    Syntax:MaxRequestsPerChild number
    Voreinstellung:MaxRequestsPerChild 10000
    Kontext:Serverkonfiguration
    Status:MPM
    Modul:leader, mpm_netware, mpm_winnt, mpmt_os2, perchild, prefork, threadpool, worker
    +

    Die Direktive MaxRequestsPerChild legt die + Grenze für die Anzahl von Anfragen fest, die ein einzelner + Kinprozess während seines Lebens bearbeitet. Nach + MaxRequestsPerChild Anfragen stirbt der + Kindprozess. Wenn MaxRequestsPerChild + 0 ist, endet der Prozess niemals.

    + +

    Abweichende Voreinstellungen

    +

    Die Voreinstellung für mpm_netware und + mpm_winnt ist 0.

    +
    + +

    Die Begrenzung von MaxRequestsPerChild auf einen + Wert ungleich Null hat zwei vorteilhafte Auswirkungen:

    + +
      +
    • sie begrenzt die Menge an Arbeitsspeicher, die ein Prozess + durch (versehentliche) Speicherlecks verbrauchen kann.
    • + +
    • das Festlegen einer endlichen Lebensdauer von Prozessen hilft, die + Anzahl von Prozessen zu reduzieren, wenn die Serverlast + zurückgeht.
    • +
    + +

    Anmerkung

    +

    Bei KeepAlive-Anfragen + wird nur die erste Anfrage für diese begrenzung gezählt. + Eigentlich wird nur die Begrenzung für die Anzahl der + Verbindungen pro Kindprozess geändert.

    +
    + +
    +
    top
    +

    MaxSpareThreads-Direktive

    + + + + + + + +
    Beschreibung:Maximale Anzahl unbeschäftigter Threads
    Syntax:MaxSpareThreads Anzahl
    Voreinstellung:Für Details siehe Beschreibung
    Kontext:Serverkonfiguration
    Status:MPM
    Modul:beos, leader, mpm_netware, mpmt_os2, perchild, threadpool, worker
    +

    Maximale Anzahl unbeschäftigter Threads. Die verschiedenen MPMs + behandeln diese Anweisung unterschiedlich.

    + +

    Die Voreinstellung für perchild ist + MaxSpareThreads 10. Das MPM überwacht die Anzahl der + unbeschäftigten Threads auf der Basis einzelner Kindprozesse. Wenn + zu viele unbeschäftigte Threads in einem Kindprozess existieren, + beendet der Server Threads innerhalb dieses Kindprozesses.

    + +

    Die Voreinstellung für worker, + leader und threadpool ist + MaxSpareThreads 250. Diese MPMs behandeln Threads + auf einer serverweiten Basis. Wenn zu viele unbeschäftigte Threads + im Server existieren, dann werden solange Kindprozesse beendet, bis + die Anzahl der unbeschäftigten Threads kleiner als der + angegebene Wert ist.

    + +

    Die Voreinstellung für mpm_netware ist + MaxSpareThreads 100. Da dieses MPM nur einen einzigen + Prozess ausführt, ist die Zählung überschüssiger + Threads ebenfalls serverweit.

    + +

    beos and mpmt_os2 arbeiten + ähnlich wie mpm_netware. Die Voreinstellung + für beos ist MaxSpareThreads 50. + Die Voreinstellung für mpmt_os2 ist + 10.

    + +

    Restriktionen

    +

    Der Wertebereich von MaxSpareThreads + ist eingeschränkt. Apache korrigiert den angegebenen Wert + automatisch gemäß den folgenden Regeln:

    + +
    + +

    Siehe auch

    + +
    +
    top
    +

    MinSpareThreads-Direktive

    + + + + + + + +
    Beschreibung:Minimale Anzahl unbeschäftigter Threads, die zur + Bedienung von Anfragespitzen zur Verfügung stehen
    Syntax:MinSpareThreads Anzahl
    Voreinstellung:Für Details siehe Beschreibung
    Kontext:Serverkonfiguration
    Status:MPM
    Modul:beos, leader, mpm_netware, mpmt_os2, perchild, threadpool, worker
    +

    Minimale Anzahl unbeschäftigter Threads, um Anfragespitzen + zu bedienen. Die verschiedenen MPMs behandeln die Anweisung + unterschiedlich.

    + +

    perchild verwendet die Voreinstellung + MinSpareThreads 5 und überwacht die Anzahl der + unbeschäftigten Threads auf der Basis einzelner Kindprozesse. Wenn + in einem Kindprozess nicht genügend unbeschäftigte + Threads vorhanden sind, erstellt der Server neue Threads innerhalb + dieses Kindprozesses. Wenn Sie also NumServers auf 10 und MinSpareThreads auf einen Wert von 5 setzen, + haben Sie mindestens 50 unbeschäftigte Threads auf Ihrem + System.

    + +

    worker, leader und + threadpool verwenden eine Voreinstellung von + MinSpareThreads 75 und behandeln unbeschäftigte + Threads auf serverweiter Basis. Wenn nicht genügend + unbeschäftigte Threads im Server vorhanden sind, dann + werden solange Kindprozesse erzeugt, bis die Anzahl unbeschäftigter + Threads größer als der angegebene Wert ist.

    + +

    mpm_netware verwendet die Voreinstellung + MinSpareThreads 10 und verfolgt dies serverweit, da + es ein Einzelprozess-MPM ist.

    + +

    beos und mpmt_os2 arbeiten + ähnlich wie mpm_netware. Die Voreinstellung + für beos ist MinSpareThreads 1. + Die Voreinstellung für mpmt_os2 ist + 5.

    + + +

    Siehe auch

    + +
    +
    top
    +

    PidFile-Direktive

    + + + + + + + +
    Beschreibung:Datei, in welcher der Server die Prozess-ID des Daemons +ablegt
    Syntax:PidFile Dateiname
    Voreinstellung:PidFile logs/httpd.pid
    Kontext:Serverkonfiguration
    Status:MPM
    Modul:beos, leader, mpm_winnt, mpmt_os2, perchild, prefork, threadpool, worker
    +

    Die Direktive PidFile bestimmt die Datei, + in welcher der Server die Prozess-ID des Daemons ablegt. Wenn der + Dateiname nicht absolut angegeben wird, wird er relativ zu + ServerRoot interpretiert.

    + +

    Beispiel

    + PidFile /var/run/apache.pid +

    + +

    Es ist oft hilfreich, dem Server ein Signal senden zu können, + damit er seine ErrorLogs und + TransferLogs + schließt und dann neu öffnet und seine + Konfigurationsdateien neu einliest. Dies kann durch Senden eines + SIGHUP-Signals (kill -1) an die Prozess-ID geschehen, die im + PidFile eingetragen ist.

    + +

    Die PidFile-Datei unterliegt den + gleichen Warnungen über die Ablage von Protokolldateien + und Sicherheit.

    + +

    Anmerkung

    +

    Ab Apache 2 wird empfohlen, nur das Skript apachectl zum (Neu-)Starten + und Stoppen des Servers zu verwenden.

    +
    + +
    +
    top
    +

    ReceiveBufferSize-Direktive

    + + + + + + + +
    Beschreibung:Größe des TCP-Empfangspuffers
    Syntax:ReceiveBufferSize Bytes
    Voreinstellung:ReceiveBufferSize 0
    Kontext:Serverkonfiguration
    Status:MPM
    Modul:beos, leader, mpm_netware, mpm_winnt, mpmt_os2, perchild, prefork, threadpool, worker
    +

    Der Server setzt die Größe des TCP-Empfangspuffers auf die + angegebene Anzahl Bytes.

    + +

    Wird der Wert auf 0 gesetzt, dann verwendet der Server + die Voreinstellung des Betriebssystems.

    + +
    +
    top
    +

    ScoreBoardFile-Direktive

    + + + + + + + +
    Beschreibung:Ablageort der Datei, die zur Speicherung von Daten zur + Koordinierung der Kindprozesse verwendet wird
    Syntax:ScoreBoardFile Dateipfad
    Voreinstellung:ScoreBoardFile logs/apache_status
    Kontext:Serverkonfiguration
    Status:MPM
    Modul:beos, leader, mpm_winnt, perchild, prefork, threadpool, worker
    +

    Apache verwendet ein Scoreboard zur Kommunikation zwischen + seinen Eltern- und Kindprozessen. Einige Architekturen erfordern + eine Datei zur Unterstützung der Kommunikation. Wenn die Datei + undefiniert bleibt, versucht der Apache zuerst, das Scoreboard im + Arbeitsspeicher zu erstellen (Verwendung von anonymem Shared-Memory), + und versucht bei einem Fehlschlag anschließend die Datei auf + der Festplatte zu erstellen (Verwendung von Datei-basiertem + Shared-Memory). Die Angabe dieser Direktive veranlaßt den + Apache stets, die Datei auf der Festplatte zu erstellen.

    + +

    Beispiel

    + ScoreBoardFile /var/run/apache_status +

    + +

    Datei-basiertes Shared-Memory ist für Applikationen von + Drittanbietern hilfreich, die direkten Zugriff auf das Scoreboard + benötigen.

    + +

    Wenn Sie eine ScoreBoardFile-Anweisung + verwenden, erreichen Sie eventuell eine höhere Geschwindigkeit, wenn + Sie die Datei auf einer RAM-Disk ablegen. Achten Sie darauf, die + gleichen Warnungen wie über die Ablage von Protokolldateien und + Sicherheit zu beherzigen.

    + +

    Siehe auch

    + +
    +
    top
    +

    SendBufferSize-Direktive

    + + + + + + + +
    Beschreibung:Größe des TCP-Sendepuffers
    Syntax:SendBufferSize Bytes
    Voreinstellung:SendBufferSize 0
    Kontext:Serverkonfiguration
    Status:MPM
    Modul:beos, leader, mpm_netware, mpm_winnt, mpmt_os2, perchild, prefork, threadpool, worker
    +

    Der Server setzt die Größe des TCP-Sendepuffers auf die + angegebene Anzahl Bytes. Dies ist sehr hilfreich, um Voreinstellungen + alter Standardbetriebssysteme für Hochgeschwindigkeitsverbindungen + mit hoher Latenzzeit anzuheben (d.h. 100ms oder so, wie bei + Interkontinentalverbindungen).

    + +

    Wird der Wert auf 0 gesetzt, dann verwendet der Server + die Voreinstellung des Betriebssystems.

    + +
    +
    top
    +

    ServerLimit-Direktive

    + + + + + + + +
    Beschreibung:Obergrenze für die konfigurierbare Anzahl von + Prozessen
    Syntax:ServerLimit Anzahl
    Voreinstellung:Für Details siehe Beschreibung
    Kontext:Serverkonfiguration
    Status:MPM
    Modul:leader, perchild, prefork, threadpool, worker
    +

    Bei dem MPM prefork bestimmt die Direktive + den während der Lebensdauer des Apache-Prozesses maximal + einstellbaren Wert für MaxClients. Beim MPM + worker bestimmt die Direktive in Verbindung mit + ThreadLimit den Maximalwert + für MaxClients + für die Lebensdauer des Apache-Prozesses. Jeder Versuch, diese + Anweisung während eines Neustarts zu ändern, wird ignoriert. + MaxClients kann jedoch + während eines Neustarts geändert werden.

    + +

    Lassen Sie besondere Vorsicht bei der Verwendung dieser Direktive + walten. Wenn ServerLimit auf einen Wert deutlich + höher als notwendig gesetzt wird, wird zusätzliches, + unbenutztes Shared-Memory belegt. Wenn sowohl + ServerLimit als auch MaxClients auf Werte gesetzt werden, die + größer sind, als das System sie handhaben kann, dann kann + der Apache möglicherweise nicht starten, oder das System kann + instabil werden.

    + +

    Verwenden Sie die Direktive bei dem MPM prefork + nur, wenn Sie MaxClients + auf mehr als 256 (Voreinstellung) setzen müssen. Setzen Sie den + Wert nicht höher als den Wert, den Sie für MaxClients angeben möchten.

    + +

    Verwenden Sie die Direktive bei worker, + leader und threadpool nur, wenn Ihre + MaxClients- und + ThreadsPerChild-Einstellungen + mehr als 16 Serverprozesse (Voreinstellung) erfordern. Setzen Sie den + Wert dieser Direktive nicht höher, als die Anzahl der Serverprozesse, + die dafür erforderlich ist, was Sie bei MaxClients und + ThreadsPerChild angeben + möchten.

    + +

    Verwenden Sie die Direktive beim MPM perchild nur, + wenn Sie NumServers auf einen + Wert größer als 8 (Voreinstellung) setzen müssen.

    + +

    Anmerkung

    +

    Eine feste Begrenzung von ServerLimit 20000 ist in den + Server einkompiliert. Dies soll unangenehme Effekte durch Tippfehler + verhindern.

    +
    + +

    Siehe auch

    + +
    +
    top
    +

    StartServers-Direktive

    + + + + + + + +
    Beschreibung:Anzahl der Kindprozesse des Servers, die beim Start erstellt + werden
    Syntax:StartServers Anzahl
    Voreinstellung:Für Details siehe Beschreibung
    Kontext:Serverkonfiguration
    Status:MPM
    Modul:leader, mpmt_os2, prefork, threadpool, worker
    +

    Die Direktive StartServers bestimmt + die Anzahl der Kindprozesse des Servers, die beim Start erstellt + werden. Da die Anzahl der Prozesse abhängig von der Last + dynamisch kontrolliert wird, besteht normalerweise wenig + Grund für eine Änderung dieses Parameters.

    + +

    Die Voreinstellung unterscheidet sich von MPM zu MPM. Bei + leader, threadpool und + worker ist die Voreinstellung + StartServers 3. Die Voreinstellung bei + prefork ist 5 und bei + mpmt_os2 2.

    + +
    +
    top
    +

    StartThreads-Direktive

    + + + + + + + +
    Beschreibung:Anzahl der Threads, die beim Start erstellt werden
    Syntax:StartThreads Anzahl
    Voreinstellung:Für Details siehe Beschreibung
    Kontext:Serverkonfiguration
    Status:MPM
    Modul:beos, mpm_netware, perchild
    +

    Anzahl der Threads, die beim Start erstellt werden. Da die Anzahl + der Threads abhängig von der Last dynamisch kontrolliert wird, + besteht normalerweise wenig Grund für eine Änderung + dieses Parameters.

    + +

    Die Voreinstellung für perchild ist + StartThreads 5. Die Direktive setzt während des + Starts die Anzahl der Threads pro Prozess.

    + +

    Die Voreinstellung bei mpm_netware ist + StartThreads 50. Da hier lediglich ein einzelner Prozess + existiert, ist dies die Gesamtzahl der Threads, die beim Start + erstellt wird, um Anfragen zu bedienen.

    + +

    Die Voreinstellung für beos ist StartThreads + 10. Die Einstellung reflektiert ebenfalls die Gesamtzahl der Threads, die + beim Start erstellt werden, um Anfragen zu bedienen.

    + +
    +
    top
    +

    ThreadLimit-Direktive

    + + + + + + + + +
    Beschreibung:Bestimmt die Obergrenze der konfigurierbaren Anzahl von Threads + pro Kindprozess
    Syntax:ThreadLimit Anzahl
    Voreinstellung:Für Details siehe Beschreibung
    Kontext:Serverkonfiguration
    Status:MPM
    Modul:leader, mpm_winnt, perchild, threadpool, worker
    Kompatibilität:Verfügbar für mpm_winnt ab + Apache 2.0.41
    +

    Die Direktive bestimmt den während der Lebensdauer des + Apache-Prozesses maximal einstellbaren Wert für + ThreadsPerChild. Jeder + Versuch, diese Direktive während eines Neustarts zu ändern, + wird ignoriert. ThreadsPerChild + kann jedoch während eines Neustarts modifiziert werden bis zu dem + Wert dieser Anweisung.

    + +

    Lassen Sie besondere Vorsicht bei der Verwendung dieser Direktive + walten. Wenn ThreadLimit auf einen Wert + deutlich höher als ThreadsPerChild gesetzt wird, wird + zusätzliches, ungenutztes Shared-Memory belegt. Wenn sowohl + ThreadLimit als auch ThreadsPerChild auf Werte gesetzt werden, + die größer sind, als das System sie handhaben kann, dann kann + der Apache möglicherweise nicht starten oder das System kann + instabil werden. Setzen Sie den Wert dieser Direktive nicht höher + als Ihre größte erwartete Einstellung für + ThreadsPerChild + während der aktuellen Ausführung des Apache.

    + +

    Die Voreinstellung für ThreadLimit ist + 1920 wenn sie zusammen mit mpm_winnt + verwendet wird, und 64 bei der Verwendung mit anderen + MPMs.

    + +

    Anmerkung

    +

    Eine feste Begrenzung von ThreadLimit 20000 + (oder ThreadLimit 15000 bei mpm_winnt) + ist in den Server einkompiliert. Dies soll unangenehme Effekte durch + Tippfehler verhindern.

    +
    + +
    +
    top
    +

    ThreadsPerChild-Direktive

    + + + + + + + +
    Beschreibung:Anzahl der Threads, die mit jedem Kindprozess gestartet + werden
    Syntax:ThreadsPerChild Anzahl
    Voreinstellung:Für Details siehe Beschreibung
    Kontext:Serverkonfiguration
    Status:MPM
    Modul:leader, mpm_winnt, threadpool, worker
    +

    Die Direktive legt die Anzahl der Threads fest, die mit jedem + Kindprozess gestartet werden. Der Kindprozess erstellt diese Threads + beim Start und erstellt später keine weiteren mehr. Wenn Sie ein + MPM wie mpm_winnt verwenden, wo nur ein + Kindprozess existiert, dann sollte diese Angabe hoch genug sein, + die gesamte Last des Servers zu bewältigen. Wenn Sie ein MPM + wie worker verwenden, wo mehrere Kindprozesse + existieren, dann sollte die Gesamtzahl der Thread groß + genug sein, die übliche Last auf dem Server zu bewältigen.

    + +

    Die Voreinstellung für ThreadsPerChild ist + 64, wenn mpm_winnt verwendet wird, und + 25 bei der Verwendung der anderen MPMs.

    + +
    +
    top
    +

    User-Direktive

    + + + + + + + + +
    Beschreibung:Die Benutzerkennung, unter welcher der Server Anfragen + beantwortet
    Syntax:User Unix-User-ID
    Voreinstellung:User #-1
    Kontext:Serverkonfiguration
    Status:MPM
    Modul:leader, perchild, prefork, threadpool, worker
    Kompatibilität:Seit Apache 2.0 nur in der globalen Server-Konfiguration +gültig
    +

    Die Direktive User legt die Benutzerkennung + fest, mit der der Server Anfragen beantwortet. Um diese Anweisung + zu verwenden, muss der Server als root gestartet werden. + Wenn Sie den Server unter einem nicht-root-Benutzer starten, kann + er nicht zu dem minder privilegierten Benutzer wechseln und wird statt + dessen weiter mit der ursprünglichen Benutzerkennung laufen. + Wenn Sie den Server als root starten, dann ist es normal, + dass der Elternprozess als root weiterläuft. + Unix-User-ID kann sein:

    + +
    +
    Ein Benutzername
    +
    Verweist auf den durch Namen angegebenen Benutzer.
    + +
    # gefolgt von einer Benutzernummer.
    +
    Verweist auf einen durch eine Nummer angegebenen Benutzer.
    +
    + +

    Der Benutzer sollte keine Rechte besitzen, die dazu führen, + dass er in der Lage ist, auf Dateien zuzugreifen, die nicht dafür + bestimmt sind, für die Außenwelt sichtbar zu sein. + Gleichermaßen sollte der Benutzer nicht in der Lage sein, + Code auszuführen, der nicht für HTTP-Anfragen bestimmt ist. + Es wird empfohlen, einen neuen Benutzer und eine neue Gruppe speziell + zur Ausführung des Servers zu erstellen. Einige Administratoren + verwenden den Benutzer nobody. Dies ist jedoch nicht + immer wünschenswert, da der Benuter nobody andere + Rechte auf dem System besitzen kann.

    + +

    Sicherheit

    +

    Setzen Sie User (oder Group) nicht auf root, + solange Sie nicht genau wissen, was Sie tun, und welches die Gefahren + sind.

    +
    + +

    Beim MPM perchild, das dafür gedacht ist, + virtuelle Hosts unter verschiedenen Benutzerkennungen auszuführen, + bestimmt die Direktive User die + Benutzerkennung für den Hauptserver und bildet den Rückfallwert + für <VirtualHost>-Abschnitte ohne eine + AssignUserID-Anweisung.

    + +

    Wichtiger Hinweis: Die Verwendung dieser Direktive innerhalb von + <VirtualHost> wird + nicht mehr unterstützt. Benutzen Sie SuexecUserGroup, um Ihren Server + für suexec einzurichten.

    + +

    Anmerkung

    +

    Obwohl die Direktive User in den MPMs + beos und mpmt_os2 existiert, ist + sie dort tatsächlich eine Leeranweisung und exisitert nur + aus Kompatibilitätsgründen.

    +
    + +
    +
    +
    +

    Verfügbare Sprachen:  de  | + en  | + es  | + ja  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mpm_common.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mpm_common.html.en new file mode 100644 index 00000000..5b3bbc48 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mpm_common.html.en @@ -0,0 +1,896 @@ + + + +mpm_common - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache MPM Common Directives

    +
    +

    Available Languages:  de  | + en  | + es  | + ja  | + tr 

    +
    + +
    Description:A collection of directives that are implemented by +more than one multi-processing module (MPM)
    Status:MPM
    +
    + + +
    top
    +

    AcceptMutex Directive

    + + + + + + + +
    Description:Method that Apache uses to serialize multiple children +accepting requests on network sockets
    Syntax:AcceptMutex Default|method
    Default:AcceptMutex Default
    Context:server config
    Status:MPM
    Module:leader, perchild, prefork, threadpool, worker
    +

    The AcceptMutex directives sets the + method that Apache uses to serialize multiple children accepting + requests on network sockets. Prior to Apache 2.0, the method was + selectable only at compile time. The optimal method to use is + highly architecture and platform dependent. For further details, + see the performance tuning + documentation.

    + +

    If this directive is set to Default, then the + compile-time selected default will be used. Other possible + methods are listed below. Note that not all methods are + available on all platforms. If a method is specified which is + not available, a message will be written to the error log + listing the available methods.

    + +
    +
    flock
    +
    uses the flock(2) system call to lock the + file defined by the LockFile directive.
    + +
    fcntl
    +
    uses the fcntl(2) system call to lock the + file defined by the LockFile directive.
    + +
    posixsem
    +
    uses POSIX compatible semaphores to implement the mutex.
    + +
    pthread
    +
    uses POSIX mutexes as implemented by the POSIX Threads + (PThreads) specification.
    + +
    sysvsem
    +
    uses SySV-style semaphores to implement the mutex.
    +
    + +

    If you want to find out the compile time chosen default + for your system, you may set your LogLevel to debug. Then the default AcceptMutex will be written into the ErrorLog.

    + +
    +
    top
    +

    BS2000Account Directive

    + + + + + + + +
    Description:Define the non-privileged account on BS2000 +machines
    Syntax:BS2000Account account
    Context:server config
    Status:MPM
    Module:perchild, prefork
    Compatibility:Only available for BS2000 machines
    +

    The BS2000Account directive is available for + BS2000 hosts only. It must be used to define the account number for + the non-privileged apache server user (which was configured using the + User directive). This is + required by the BS2000 POSIX subsystem (to change the underlying BS2000 + task environment by performing a sub-LOGON) to prevent CGI scripts + from accessing resources of the privileged account which started the + server, usually SYSROOT.

    + +

    Note

    +

    Only one BS2000Account directive can be used.

    +
    + +

    See also

    + +
    +
    top
    +

    CoreDumpDirectory Directive

    + + + + + + + +
    Description:Directory where Apache attempts to +switch before dumping core
    Syntax:CoreDumpDirectory directory
    Default:See usage for the default setting
    Context:server config
    Status:MPM
    Module:beos, leader, mpm_winnt, perchild, prefork, threadpool, worker
    +

    This controls the directory to which Apache attempts to + switch before dumping core. The default is in the + ServerRoot directory, however + since this should not be writable by the user the server runs + as, core dumps won't normally get written. If you want a core + dump for debugging, you can use this directive to place it in a + different location.

    + +

    Core Dumps on Linux

    +

    If Apache starts as root and switches to another user, the + Linux kernel disables core dumps even if the directory is + writable for the process. Apache (2.0.46 and later) reenables core dumps + on Linux 2.4 and beyond, but only if you explicitly configure a CoreDumpDirectory.

    +
    + +
    +
    top
    +

    EnableExceptionHook Directive

    + + + + + + + + +
    Description:Enables a hook that runs exception handlers +after a crash
    Syntax:EnableExceptionHook On|Off
    Default:EnableExceptionHook Off
    Context:server config
    Status:MPM
    Module:leader, perchild, prefork, threadpool, worker
    Compatibility:Available in version 2.0.49 and later
    +

    For safety reasons this directive is only available if the server was + configured with the --enable-exception-hook option. It + enables a hook that allows external modules to plug in and do something + after a child crashed.

    + +

    There are already two modules, mod_whatkilledus and + mod_backtrace that make use of this hook. Please have a + look at Jeff Trawick's EnableExceptionHook site for more information about these.

    + +
    +
    top
    +

    Group Directive

    + + + + + + + + +
    Description:Group under which the server will answer +requests
    Syntax:Group unix-group
    Default:Group #-1
    Context:server config
    Status:MPM
    Module:beos, leader, mpmt_os2, perchild, prefork, threadpool, worker
    Compatibility:Only valid in global server config since Apache +2.0
    +

    The Group directive sets the group under + which the server will answer requests. In order to use this + directive, the server must be run initially as root. If + you start the server as a non-root user, it will fail to change to the + specified group, and will instead continue to run as the group of the + original user. Unix-group is one of:

    + +
    +
    A group name
    +
    Refers to the given group by name.
    + +
    # followed by a group number.
    +
    Refers to a group by its number.
    +
    + +

    Example

    + Group www-group +

    + +

    It is recommended that you set up a new group specifically for + running the server. Some admins use user nobody, + but this is not always possible or desirable.

    + +

    Security

    +

    Don't set Group (or User) to root unless + you know exactly what you are doing, and what the dangers are.

    +
    + +

    Special note: Use of this directive in <VirtualHost> is no longer supported. To + configure your server for suexec use + SuexecUserGroup.

    + +

    Note

    +

    Although the Group directive is present + in the beos and mpmt_os2 MPMs, + it is actually a no-op there and only exists for compatibility + reasons.

    +
    + +
    +
    top
    +

    Listen Directive

    + + + + + + + +
    Description:IP addresses and ports that the server +listens to
    Syntax:Listen [IP-address:]portnumber
    Context:server config
    Status:MPM
    Module:beos, leader, mpm_netware, mpm_winnt, mpmt_os2, perchild, prefork, threadpool, worker
    Compatibility:Required directive since Apache 2.0
    +

    The Listen directive instructs Apache to + listen to only specific IP addresses or ports; by default it + responds to requests on all IP interfaces. Listen + is now a required directive. If it is not in the config file, the + server will fail to start. This is a change from previous versions + of Apache.

    + +

    The Listen directive tells the server to + accept incoming requests on the specified port or address-and-port + combination. If only a port number is specified, 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 to. 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, use:

    + +

    + Listen 80
    + Listen 8000 +

    + +

    To make the server accept connections on two specified + interfaces and port numbers, use

    + +

    + Listen 192.170.2.1:80
    + Listen 192.170.2.5:8000 +

    + +

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

    + +

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

    + +

    Error condition

    + Multiple Listen directives for the same ip + address and port will result in an Address already in use + error message. +
    + +

    See also

    + +
    +
    top
    +

    ListenBackLog Directive

    + + + + + + + +
    Description:Maximum length of the queue of pending connections
    Syntax:ListenBacklog backlog
    Default:ListenBacklog 511
    Context:server config
    Status:MPM
    Module:beos, leader, mpm_netware, mpm_winnt, mpmt_os2, perchild, prefork, threadpool, worker
    +

    The maximum length of the queue of pending connections. + Generally no tuning is needed or desired, however on some + systems it is desirable to increase this when under a TCP SYN + flood attack. See the backlog parameter to the + listen(2) system call.

    + +

    This will often be limited to a smaller number by the + operating system. This varies from OS to OS. Also note that + many OSes do not use exactly what is specified as the backlog, + but use a number based on (but normally larger than) what is + set.

    + +
    +
    top
    +

    LockFile Directive

    + + + + + + + +
    Description:Location of the accept serialization lock file
    Syntax:LockFile filename
    Default:LockFile logs/accept.lock
    Context:server config
    Status:MPM
    Module:leader, perchild, prefork, threadpool, worker
    +

    The LockFile directive sets the path to + the lockfile used when Apache is used with an AcceptMutex value of either + fcntl or flock. This directive should + normally be left at its default value. The main reason for changing + it is if the logs directory is NFS mounted, since + the lockfile must be stored on a local disk. The PID + of the main server process is automatically appended to the + filename.

    + +

    Security

    +

    It is best to avoid putting this file in a world writable + directory such as /var/tmp because someone could create + a denial of service attack and prevent the server from starting by + creating a lockfile with the same name as the one the server will try + to create.

    +
    + +

    See also

    + +
    +
    top
    +

    MaxClients Directive

    + + + + + + + +
    Description:Maximum number of connections that will be processed +simultaneously
    Syntax:MaxClients number
    Default:See usage for details
    Context:server config
    Status:MPM
    Module:beos, leader, prefork, threadpool, worker
    +

    The MaxClients directive sets the limit + on the number of simultaneous requests that will be served. Any + connection attempts over the MaxClients + limit will normally be queued, up to a number based on the + ListenBacklog + directive. Once a child process is freed at the end of a different + request, the connection will then be serviced.

    + +

    For non-threaded servers (i.e., prefork), + MaxClients translates into the maximum + number of child processes that will be launched to serve requests. + The default value is 256; to increase it, you must also raise + ServerLimit.

    + +

    For threaded and hybrid servers (e.g. beos + or worker) MaxClients restricts + the total number of threads that will be available to serve clients. + The default value for beos is 50. For + hybrid MPMs the default value is 16 (ServerLimit) multiplied by the value of + 25 (ThreadsPerChild). Therefore, to increase MaxClients to a value that requires more than 16 processes, + you must also raise ServerLimit.

    + +
    +
    top
    +

    MaxMemFree Directive

    + + + + + + + +
    Description:Maximum amount of memory that the main allocator is allowed +to hold without calling free()
    Syntax:MaxMemFree KBytes
    Default:MaxMemFree 0
    Context:server config
    Status:MPM
    Module:beos, leader, mpm_netware, prefork, threadpool, worker, mpm_winnt
    +

    The MaxMemFree directive sets the + maximum number of free Kbytes that the main allocator is allowed + to hold without calling free(). When not set, or when set + to zero, the threshold will be set to unlimited.

    + +
    +
    top
    +

    MaxRequestsPerChild Directive

    + + + + + + + +
    Description:Limit on the number of requests that an individual child server +will handle during its life
    Syntax:MaxRequestsPerChild number
    Default:MaxRequestsPerChild 10000
    Context:server config
    Status:MPM
    Module:leader, mpm_netware, mpm_winnt, mpmt_os2, perchild, prefork, threadpool, worker
    +

    The MaxRequestsPerChild directive sets + the limit on the number of requests that an individual child + server process will handle. After + MaxRequestsPerChild requests, the child + process will die. If MaxRequestsPerChild is + 0, then the process will never expire.

    + +

    Different default values

    +

    The default value for mpm_netware and + mpm_winnt is 0.

    +
    + +

    Setting MaxRequestsPerChild to a + non-zero value limits the amount of memory that process can consume + by (accidental) memory leakage.

    + +

    Note

    +

    For KeepAlive requests, only + the first request is counted towards this limit. In effect, it + changes the behavior to limit the number of connections per + child.

    +
    + +
    +
    top
    +

    MaxSpareThreads Directive

    + + + + + + + +
    Description:Maximum number of idle threads
    Syntax:MaxSpareThreads number
    Default:See usage for details
    Context:server config
    Status:MPM
    Module:beos, leader, mpm_netware, mpmt_os2, perchild, threadpool, worker
    +

    Maximum number of idle threads. Different MPMs deal with this + directive differently.

    + +

    For perchild the default is + MaxSpareThreads 10. This MPM monitors the number of + idle threads on a per-child basis. If there are too many idle + threads in that child, the server will begin to kill threads + within that child.

    + +

    For worker, leader and threadpool the default is MaxSpareThreads 250. + These MPMs deal with idle threads on a server-wide basis. If there + are too many idle threads in the server then child processes are + killed until the number of idle threads is less than this number.

    + +

    For mpm_netware the default is + MaxSpareThreads 100. Since this MPM runs a + single-process, the spare thread count is also server-wide.

    + +

    beos and mpmt_os2 work + similar to mpm_netware. The default for + beos is MaxSpareThreads 50. For + mpmt_os2 the default value is 10.

    + +

    Restrictions

    +

    The range of the MaxSpareThreads value + is restricted. Apache will correct the given value automatically + according to the following rules:

    + +
    + +

    See also

    + +
    +
    top
    +

    MinSpareThreads Directive

    + + + + + + + +
    Description:Minimum number of idle threads available to handle request +spikes
    Syntax:MinSpareThreads number
    Default:See usage for details
    Context:server config
    Status:MPM
    Module:beos, leader, mpm_netware, mpmt_os2, perchild, threadpool, worker
    +

    Minimum number of idle threads to handle request spikes. + Different MPMs deal with this directive + differently.

    + +

    perchild uses a default of + MinSpareThreads 5 and monitors the number of idle + threads on a per-child basis. If there aren't enough idle threads + in that child, the server will begin to create new threads within + that child. Thus, if you set NumServers to 10 and a MinSpareThreads value of 5, you'll have + at least 50 idle threads on your system.

    + +

    worker, leader and + threadpool use a default of MinSpareThreads + 75 and deal with idle threads on a server-wide basis. If + there aren't enough idle threads in the server then child + processes are created until the number of idle threads is greater + than number.

    + +

    mpm_netware uses a default of + MinSpareThreads 10 and, since it is a single-process + MPM, tracks this on a server-wide bases.

    + +

    beos and mpmt_os2 work + similar to mpm_netware. The default for + beos is MinSpareThreads 1. For + mpmt_os2 the default value is 5.

    + +

    See also

    + +
    +
    top
    +

    PidFile Directive

    + + + + + + + +
    Description:File where the server records the process ID +of the daemon
    Syntax:PidFile filename
    Default:PidFile logs/httpd.pid
    Context:server config
    Status:MPM
    Module:beos, leader, mpm_winnt, mpmt_os2, perchild, prefork, threadpool, worker
    +

    The PidFile directive sets the file to + which the server records the process id of the daemon. If the + filename is not absolute then it is assumed to be relative to the + ServerRoot.

    + +

    Example

    + PidFile /var/run/apache.pid +

    + +

    It is often useful to be able to send the server a signal, + so that it closes and then re-opens its ErrorLog and TransferLog, and + re-reads its configuration files. This is done by sending a + SIGHUP (kill -1) signal to the process id listed in the + PidFile.

    + +

    The PidFile is subject to the same + warnings about log file placement and security.

    + +

    Note

    +

    As of Apache 2 it is recommended to use only the apachectl script for (re-)starting or stopping the server.

    +
    + +
    +
    top
    +

    ReceiveBufferSize Directive

    + + + + + + + +
    Description:TCP receive buffer size
    Syntax:ReceiveBufferSize bytes
    Default:ReceiveBufferSize 0
    Context:server config
    Status:MPM
    Module:beos, leader, mpm_netware, mpm_winnt, mpmt_os2, perchild, prefork, threadpool, worker
    +

    The server will set the TCP receive buffer size to the number of + bytes specified.

    + +

    If set to the value of 0, the server will use the + OS default.

    + +
    +
    top
    +

    ScoreBoardFile Directive

    + + + + + + + +
    Description:Location of the file used to store coordination data for +the child processes
    Syntax:ScoreBoardFile file-path
    Default:ScoreBoardFile logs/apache_status
    Context:server config
    Status:MPM
    Module:beos, leader, mpm_winnt, perchild, prefork, threadpool, worker
    +

    Apache uses a scoreboard to communicate between its parent + and child processes. Some architectures require a file to facilitate + this communication. If the file is left unspecified, Apache first + attempts to create the scoreboard entirely in memory (using anonymous + shared memory) and, failing that, will attempt to create the file on + disk (using file-based shared memory). Specifying this directive causes + Apache to always create the file on the disk.

    + +

    Example

    + ScoreBoardFile /var/run/apache_status +

    + +

    File-based shared memory is useful for third-party applications + that require direct access to the scoreboard.

    + +

    If you use a ScoreBoardFile then + you may see improved speed by placing it on a RAM disk. But be + careful that you heed the same warnings about log file placement + and security.

    + +

    See also

    + +
    +
    top
    +

    SendBufferSize Directive

    + + + + + + + +
    Description:TCP buffer size
    Syntax:SendBufferSize bytes
    Default:SendBufferSize 0
    Context:server config
    Status:MPM
    Module:beos, leader, mpm_netware, mpm_winnt, mpmt_os2, perchild, prefork, threadpool, worker
    +

    The server will set the TCP send buffer size to the number of bytes + specified. Very useful to increase past standard OS defaults on + high speed high latency (i.e., 100ms or so, such as + transcontinental fast pipes).

    + +

    If set to the value of 0, the server will use the + OS default.

    + +
    +
    top
    +

    ServerLimit Directive

    + + + + + + + +
    Description:Upper limit on configurable number of processes
    Syntax:ServerLimit number
    Default:See usage for details
    Context:server config
    Status:MPM
    Module:leader, perchild, prefork, threadpool, worker
    +

    For the prefork MPM, this directive sets the + maximum configured value for MaxClients for the lifetime of the + Apache process. For the worker MPM, this directive + in combination with ThreadLimit sets + the maximum configured value for MaxClients for the lifetime of the + Apache process. Any attempts to change this directive during a + restart will be ignored, but MaxClients can be modified during + a restart.

    + +

    Special care must be taken when using this directive. If + ServerLimit is set to a value much higher + than necessary, extra, unused shared memory will be allocated. If + both ServerLimit and MaxClients are set to values + higher than the system can handle, Apache may not start or the + system may become unstable.

    + +

    With the prefork MPM, use this directive only + if you need to set MaxClients higher than 256 (default). + Do not set the value of this directive any higher than what you + might want to set MaxClients to.

    + +

    With worker, leader and + threadpool use this directive only + if your MaxClients and + ThreadsPerChild + settings require more than 16 server processes (default). Do not set + the value of this directive any higher than the number of server + processes required by what you may want for MaxClients and ThreadsPerChild.

    + +

    With the perchild MPM, use this directive only + if you need to set NumServers higher than 8 (default).

    + +

    Note

    +

    There is a hard limit of ServerLimit 20000 compiled + into the server. This is intended to avoid nasty effects caused by + typos.

    +
    + +

    See also

    + +
    +
    top
    +

    StartServers Directive

    + + + + + + + +
    Description:Number of child server processes created at startup
    Syntax:StartServers number
    Default:See usage for details
    Context:server config
    Status:MPM
    Module:leader, mpmt_os2, prefork, threadpool, worker
    +

    The StartServers directive sets the + number of child server processes created on startup. As the number + of processes is dynamically controlled depending on the load, + there is usually little reason to adjust this parameter.

    + +

    The default value differs from MPM to MPM. For + leader, threadpool and + worker the default is StartServers 3. + For prefork defaults to 5 and for + mpmt_os2 to 2.

    + +
    +
    top
    +

    StartThreads Directive

    + + + + + + + +
    Description:Number of threads created on startup
    Syntax:StartThreads number
    Default:See usage for details
    Context:server config
    Status:MPM
    Module:beos, mpm_netware, perchild
    +

    Number of threads created on startup. As the + number of threads is dynamically controlled depending on the + load, there is usually little reason to adjust this + parameter.

    + +

    For perchild the default is StartThreads + 5 and this directive tracks the number of threads per + process at startup.

    + +

    For mpm_netware the default is + StartThreads 50 and, since there is only a single + process, this is the total number of threads created at startup to + serve requests.

    + +

    For beos the default is StartThreads + 10. It also reflects the total number of threads created + at startup to serve requests.

    + +
    +
    top
    +

    ThreadLimit Directive

    + + + + + + + + +
    Description:Sets the upper limit on the configurable number of threads +per child process
    Syntax:ThreadLimit number
    Default:See usage for details
    Context:server config
    Status:MPM
    Module:leader, mpm_winnt, perchild, threadpool, worker
    Compatibility:Available for mpm_winnt in Apache 2.0.41 +and later
    +

    This directive sets the maximum configured value for ThreadsPerChild for the lifetime + of the Apache process. Any attempts to change this directive + during a restart will be ignored, but ThreadsPerChild can be modified + during a restart up to the value of this directive.

    + +

    Special care must be taken when using this directive. If + ThreadLimit is set to a value much higher + than ThreadsPerChild, + extra unused shared memory will be allocated. If both + ThreadLimit and ThreadsPerChild are set to values + higher than the system can handle, Apache may not start or the + system may become unstable. Do not set the value of this directive + any higher than your greatest predicted setting of ThreadsPerChild for the + current run of Apache.

    + +

    The default value for ThreadLimit is + 1920 when used with mpm_winnt and + 64 when used with the others.

    + +

    Note

    +

    There is a hard limit of ThreadLimit 20000 (or + ThreadLimit 15000 with mpm_winnt) + compiled into the server. This is intended to avoid nasty effects + caused by typos.

    +
    + +
    +
    top
    +

    ThreadsPerChild Directive

    + + + + + + + +
    Description:Number of threads created by each child process
    Syntax:ThreadsPerChild number
    Default:See usage for details
    Context:server config
    Status:MPM
    Module:leader, mpm_winnt, threadpool, worker
    +

    This directive sets the number of threads created by each + child process. The child creates these threads at startup and + never creates more. If using an MPM like mpm_winnt, + where there is only one child process, this number should be high + enough to handle the entire load of the server. If using an MPM + like worker, where there are multiple child processes, + the total number of threads should be high enough to handle + the common load on the server.

    + +

    The default value for ThreadsPerChild is + 64 when used with mpm_winnt and + 25 when used with the others.

    + +
    +
    top
    +

    User Directive

    + + + + + + + + +
    Description:The userid under which the server will answer +requests
    Syntax:User unix-userid
    Default:User #-1
    Context:server config
    Status:MPM
    Module:leader, perchild, prefork, threadpool, worker
    Compatibility:Only valid in global server config since Apache +2.0
    +

    The User directive sets the user ID as + which the server will answer requests. In order to use this + directive, the server must be run initially as root. + If you start the server as a non-root user, it will fail to change + to the lesser privileged user, and will instead continue to run as + that original user. If you do start the server as root, + then it is normal for the parent process to remain running as root. + Unix-userid is one of:

    + +
    +
    A username
    +
    Refers to the given user by name.
    + +
    # followed by a user number.
    +
    Refers to a user by its number.
    +
    + +

    The user should have no privileges that result in it being + able to access files that are not intended to be visible to the + outside world, and similarly, the user should not be able to + execute code that is not meant for HTTP requests. It is + recommended that you set up a new user and group specifically for + running the server. Some admins use user nobody, but + this is not always desirable, since the nobody user + can have other uses on the system.

    + +

    Security

    +

    Don't set User (or Group) to root unless + you know exactly what you are doing, and what the dangers are.

    +
    + +

    With the perchild MPM, which is intended to + server virtual hosts run under different user IDs, the + User directive defines the user ID for the + main server and the fallback for <VirtualHost> sections without an + AssignUserID directive.

    + +

    Special note: Use of this directive in <VirtualHost> is no longer supported. To + configure your server for suexec use + SuexecUserGroup.

    + +

    Note

    +

    Although the User directive is present + in the beos and mpmt_os2 MPMs, + it is actually a no-op there and only exists for compatibility + reasons.

    +
    + +
    +
    +
    +

    Available Languages:  de  | + en  | + es  | + ja  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mpm_common.html.es b/rubbos/app/httpd-2.0.64/docs/manual/mod/mpm_common.html.es new file mode 100644 index 00000000..28a738f3 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mpm_common.html.es @@ -0,0 +1,982 @@ + + + +mpm_common - Servidor HTTP Apache + + + + + + +
    <-
    + +
    +

    Directivas Comunes de los MPM de + Apache

    +
    +

    Idiomas disponibles:  de  | + en  | + es  | + ja  | + 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.
    + +
    Descripción:Es una colección de directivas que están implementadas +en más de un módulo de multiprocesamiento (MPM)
    Estado:MPM
    +
    + + +
    top
    +

    AcceptMutex Directiva

    + + + + + + + +
    Descripción:Método que usa Apache para serializar múltiples procesos +hijo que aceptan peticiones en las conexiones de red
    Sintaxis:AcceptMutex Default|method
    Valor por defecto:AcceptMutex Default
    Contexto:server config
    Estado:MPM
    Módulo:leader, perchild, prefork, threadpool, worker
    +

    Las directivas AcceptMutex determinan el + método que usa Apache para serializar múltiples procesos + hijo que aceptan peticiones en las conexiones de red. En las + versiones de Apache anteriores a la 2.0, el método era + seleccionable solo cuando se compilaba el servidor. El mejor + método a usar depende mucho de la arquitectura y de la + plataforma que use. Si desea más información, consulte + la documentanción sobre ajustes para conseguir un mejor + rendimiento.

    + +

    Si el valor especificado en esta directiva es + Default, entonces se usará el método + seleccionado cuando se compiló el servidor. Más abajo + puede encontrar una lista con otros métodos. Tenga en cuenta + que no todos los métodos están disponibles en todas las + plataformas. Si el método especificado no está + disponible, se escribirá un mensaje en el log de errores con + una lista de los métodos que puede usar.

    + +
    +
    flock
    usa la llamada al sistema + flock(2) para bloquear el fichero especificado en + la directiva LockFile.
    + +
    fcntl
    usa la llamada al sistema + fcntl(2) para bloquear el fichero especificado en + la directiva LockFile.
    + +
    posixsem
    usa semáforos + compatibles con POSIX para implementar el mutex.
    + +
    pthread
    +
    Usa mutexes POSIX implementados según la + especificación de hebras POSIX (PThreads).
    + +
    sysvsem
    +
    usa semáforos de tipo SySV para implementar el mutex.
    +
    + +

    Si quiere ver cuál es el método por defecto que se + seleccionó para usar en su sistema al compilar, especifique + el valor debug en la directiva LogLevel. El valor por defecto de la + directiva AcceptMutex aparecerá + escrito en el ErrorLog.

    + +
    +
    top
    +

    BS2000Account Directiva

    + + + + + + + +
    Descripción:Define la cuenta sin privilegios en máquinas +BS2000
    Sintaxis:BS2000Account account
    Contexto:server config
    Estado:MPM
    Módulo:perchild, prefork
    Compatibilidad:Solo disponible en máquinas BS2000
    +

    La directiva BS2000Account está + disponible solo en hosts BS2000. Debe usarse para definir el + número de cuenta del usuario sin privilegios del servidor + Apache (que se configuró usando la directiva User). Esto es un requerimiento + del subsistema POSIX BS2000 (@@@@@ para reemplazar el entorno de + tareas BS2000 subyaciente haciendo un sub-LOGON) para prevenir que + scripts CGI accedan a recursos de la cuenta con privilegios con la + que se suele iniciar el servidor, normalmente + SYSROOT.

    + +

    Nota

    +

    La directiva + BS2000Account solamente puede usarse una vez.

    +
    + +

    Consulte también

    + +
    +
    top
    +

    CoreDumpDirectory Directiva

    + + + + + + + +
    Descripción:Directorio al que Apache intenta cambiarse antes de +realizar un volcado de memoria
    Sintaxis:CoreDumpDirectory directory
    Valor por defecto:Consulte la sección de uso para ver el valor por defecto
    Contexto:server config
    Estado:MPM
    Módulo:beos, leader, mpm_winnt, perchild, prefork, threadpool, worker
    +

    Esta directiva controla el directorio al cual intenta cambiarse + Apache antes de realizar un volcado de memoria. Por defecto, el + volcado de memoria se hace en el directorio especificado en la + directiva ServerRoot, sin + embargo, como el usuario con el que se está ejecutando Apache + podría no tener permisos para escribir en ese directorio, los + volcados de memoria muchas veces no se hacen en ningún + sitio. Si quiere que el volcado se memoria se guarde para analizar + los fallos posteriormente, puede usar esta directiva para + especificar un directorio diferente.

    + +

    Volcados de memoria en Linux

    Si Apache se + inicia como usuario root y después se cambia el usuario con + el se está ejecutando, el kernel de Linux + desactiva los volcados de memoria, incluso si se ha + especificado un directorio en el que se puede escribir para + realizar este proceso. Apache (en las versiones 2.0.46 y + posteriores) reactiva los volcados de memoria en los sistemas + con versiones Linux 2.4 y posteriores, pero solamente si se ha + configurado explícitamente la directiva + CoreDumpDirectory.

    +
    + +
    +
    top
    +

    EnableExceptionHook Directiva

    + + + + + + + + +
    Descripción:Activa un hook que inicia handlers de excepción +después de un error irrecuperable
    Sintaxis:EnableExceptionHook On|Off
    Valor por defecto:EnableExceptionHook Off
    Contexto:server config
    Estado:MPM
    Módulo:leader, perchild, prefork, threadpool, worker
    Compatibilidad:Disponible en las versiones de Apache 2.0.49 y posteriores
    +

    Por razones de seguridad esta directiva está disponible + solamente si el servidor ha sido configurado con la opción + --enable-exception-hook. Esto activa un hook que + permite que se conecten módulos externos y que realicen + alguna acción después de que un proceso hijo sufra un + error irrecuperable.

    + +

    Hay otros dos módulos, mod_whatkilledus y + mod_backtrace que usan este hook. Por favor, consulte + el siguiente enlace, EnableExceptionHook perteneciente al sitio web de Jeff + Trawick para obtener más información sobre el tema.

    + +
    +
    top
    +

    Group Directiva

    + + + + + + + + +
    Descripción:Grupo con el que el servidor atenderá las +peticiones
    Sintaxis:Group unix-group
    Valor por defecto:Group #-1
    Contexto:server config
    Estado:MPM
    Módulo:beos, leader, mpmt_os2, perchild, prefork, threadpool, worker
    Compatibilidad:Solamente puede usarse en global server config a partir de la versión de Apache 2.0
    +

    La directiva Group determina el grupo + con el que el servidor atenderá las peticiones. Para usar + esta directiva, el servidor debe haber sido iniciado con el + usuario root. Si inicia el servidor con un usuario + que no sea root, el servidor no podrá cambiarse al grupo + especificado, en lugar de esto continuará ejecutándose + con el grupo del usuario que lo inició. Unix-group + debe tomar un de los siguiente valores:

    + +
    +
    El nombre de un grupo
    +
    Se refiere al grupo que lleva el nombre que se especifica.
    + +
    # seguido del número de un grupo.
    +
    Se refiere al grupo asociado a ese número.
    +
    + +

    Por ejemplo

    + Group www-group +

    + +

    Se recomienda que cree un nuevo grupo específicamente para + ejecutar el servidor. Algunos administradores usan el ususario + nobody, pero esto no es siempre posible ni + aconsejable.

    + +

    Seguridad

    No ponga el valor + root en la directiva Group + (o en la directiva User) a menos que sepa + exactamente lo que está haciendo y los peligros que + conlleva.

    +
    + +

    Importante: El uso de esta directiva en <VirtualHost> no está + permitido ya. Para configurar su servidor para + suexec use la directiva SuexecUserGroup.

    + +

    Nota

    Aunque la directiva + Group está presente en los + módulos MPM beos y + mpmt_os2, no están operativas y solamente + están presentes por razones de compatibilidad.

    +
    + +
    +
    top
    +

    Listen Directiva

    + + + + + + + +
    Descripción:Direcciones IP y puertos en los que escucha el servidor
    Sintaxis:Listen [IP-address:]portnumber
    Contexto:server config
    Estado:MPM
    Módulo:beos, leader, mpm_netware, mpm_winnt, mpmt_os2, perchild, prefork, threadpool, worker
    Compatibilidad:Directiva de uso obligatorio en Apache 2.0
    +

    La directiva Listen indica las + direcciones IP y los puertos en los que debe escuchar Apache; por + defecto, el servidor responde a las peticiones que se reciban en + cualquier dirección IP de las interfaces de red. El uso de + Listen es ahora obligatorio. Si no + está en el fichero de configuración, el servidor no + podrá iniciarse. Esto supone un cambio respecto a las + versiones anteriores de Apache.

    + +

    La directiva Listen le especifica al + servidor los puertos o las combinaciones de direcciones y puertos + cuyas peticiones debe aceptar. Si solamente se especifica un + número de puerto, el servidor escuchará en ese puerto, + en todas las interfaces de red. Si se especifica una + dirección IP y un puerto, el servidor escuchará + solamente en esa dirección IP y en ese puerto.

    + +

    Se pueden usar varias directivas Listen + para especificar varias direcciones y puertos de escucha. El + servidor responderá a peticiones de cualquiera de esas + direcciones y puertos.

    + +

    Por ejemplo, para hacer que el servidor acepte conexiones en + los puertos 80 y 8000, use:

    + +

    + Listen 80
    + Listen 8000 +

    + +

    Para hacer que el servidor acepte conexiones en dos direcciones + y puertos difrentes, use

    + +

    + Listen 192.170.2.1:80
    + Listen 192.170.2.5:8000 +

    + +

    Las direcciones IPv6 deben escribirse entre corchetes, como en + el siguiente ejemplo:

    + +

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

    + +

    Condición de error

    Varias directivas + Listen para la misma dirección IP y + el mismo puerto tendrán como resultado un mensaje de error + del tipo Dirección actualmente en uso. +
    + +

    Consulte también

    + +
    +
    top
    +

    ListenBackLog Directiva

    + + + + + + + +
    Descripción:Longitud máxima de la cola de conexiones en espera
    Sintaxis:ListenBacklog backlog
    Valor por defecto:ListenBacklog 511
    Contexto:server config
    Estado:MPM
    Módulo:beos, leader, mpm_netware, mpm_winnt, mpmt_os2, perchild, prefork, threadpool, worker
    +

    Longitud máxima de la cola de conexiones en espera. En + general, no es necesario ni deseable hacer ninguna + modificación, pero en algunos sistemas es beneficioso + incrementar esta longitud cuando se está sufriendo un ataque + TCP SYN flood. Consulte la información sobre el + parámetro backlog de la llamada al sistema + listen(2).

    + +

    Este número estará la mayor parte de las veces + limitado a un valor aún menor por el sistema operativo. Esto + varía de un sistema operativo a otro. Tenga en cuenta + también que muchos sistemas operativos no usan exactamente lo + que se especifica en el backlog, sino que usan un número + basado en el valor especificado (aunque normalmente mayor).

    + +
    +
    top
    +

    LockFile Directiva

    + + + + + + + +
    Descripción:Ubicación del fichero de lock de serialización de aceptacioón de peticiones
    Sintaxis:LockFile filename
    Valor por defecto:LockFile logs/accept.lock
    Contexto:server config
    Estado:MPM
    Módulo:leader, perchild, prefork, threadpool, worker
    +

    La directiva LockFile especifica la ruta + al archivo de lock (lockfile) que se utiliza cuando la directiva + AcceptMutex tiene valor + fcntl o flock. En principio no se debe + modificar el valor por defecto de esta directiva. La razón + principal para moficiarlo es que el directorio de + logs esté montado en NFS, porque el + archivo de lock debe almacenarse en un disco local. El + PID del proceso principal del servidor se añade + automáticamente al nombre del fichero.

    + +

    Seguridad

    Es aconsejable + no poner este fichero en un directorio en el que tenga + permisos de escritura todos los usuarios como + /var/tmp porque alguien podría provocar un + ataque de denegación de servicio y evitar que el servidor + se inicie creando un archivo de lock con el mismo nombre que el + que el servidor intentará crear.

    +
    + +

    Consulte también

    + +
    +
    top
    +

    MaxClients Directiva

    + + + + + + + +
    Descripción:Número máximo de procesos hijo que serán creados para +atender peticiones
    Sintaxis:MaxClients number
    Valor por defecto:Consulte la sección de uso para obtener más información
    Contexto:server config
    Estado:MPM
    Módulo:beos, leader, prefork, threadpool, worker
    +

    La directiva MaxClients especifica el + límite de peticiones simultáneas que serán + atendidas. Cualquier intento de conexión por encima del + límite MaxClients se pondrá en + cola, hasta llegar a un límite basado en el valor de la + directiva ListenBacklog. Una vez que un + proceso hijo termina de atender una petición y queda libre, se + atenderá una conexión en cola.

    + +

    En servidores que no usan hebras (por ejemplo, + prefork), el valor especificado en + MaxClients se traduce en el número + máximo de procesos hijo que se crearán para atender + peticiones. El valor por defecto es 256; para + incrementarlo, debe incrementar también el valor especificado + en la directiva ServerLimit.

    + +

    En servidores que usan hebras y en servidores híbridos + (por ejemplo, beos o worker) + MaxClients limita el número total de + hebras que van a estar disponibles para servir clientes. El valor + por defecto para beos es 50. Para + MPMs híbridos el valor por defecto es 16 + (ServerLimit) + multiplicado por 25 (ThreadsPerChild). Por lo tanto, si va a usar en + MaxClients un valor que requiera más + de 16 procesos deberá también incrementar el valor de la + directiva ServerLimit.

    + +
    +
    top
    +

    MaxMemFree Directiva

    + + + + + + + +
    Descripción:Cantidad máxima de memoria que el asignador principal puede tomar sin hacer una llamada a free()
    Sintaxis:MaxMemFree KBytes
    Valor por defecto:MaxMemFree 0
    Contexto:server config
    Estado:MPM
    Módulo:beos, leader, mpm_netware, prefork, threadpool, worker, mpm_winnt
    +

    La directiva MaxMemFree especifica el + número máximo de kbytes libres que el asignador de memoria + principal puede tomar sin hacer una llamada al sistema + free(). Cuando no se especifica ningún valor en esta + directiva, o cuando se especifica el valor cero, no existirá tal + límite.

    + +
    +
    top
    +

    MaxRequestsPerChild Directiva

    + + + + + + + +
    Descripción:Límite en el número de peticiones que un proceso hijo puede +atender durante su vida
    Sintaxis:MaxRequestsPerChild number
    Valor por defecto:MaxRequestsPerChild 10000
    Contexto:server config
    Estado:MPM
    Módulo:leader, mpm_netware, mpm_winnt, mpmt_os2, perchild, prefork, threadpool, worker
    +

    La directiva MaxRequestsPerChild + especifica el número máximo de peticiones que un proceso hijo + atenderá durante su existencia. Después de atender + MaxRequestsPerChild peticiones, el proceso + hijo se eliminará. Si el valor especificado en esta directiva + MaxRequestsPerChild es 0, no + habrá límite.

    + +

    Diferentes valores por defecto

    +

    El valor por defecto para los módulos + mpm_netware y mpm_winnt es + 0.

    +
    + +

    Especificar en la directiva + MaxRequestsPerChild un valor distinto de + cero tiene dos ventajas:

    + +
      +
    • limita la cantidad de memoria que un proceso puede consumir + en caso de que haya un fuga (accidental) de memoria;
    • + +
    • establece un límite finito a la vida de los procesos, lo que + ayuda a reducir el número existente de procesos cuando se reduce + la carga de trabajo en el servidor.
    • +
    + +

    Nota

    +

    Para las peticiones KeepAlive, solamente la primera petición + cuenta para este límite. De hecho, en ese caso lo que se + limita es el número de conexiones por proceso hijo.

    +
    + +
    +
    top
    +

    MaxSpareThreads Directiva

    + + + + + + + +
    Descripción:Número máximo de hebras en espera
    Sintaxis:MaxSpareThreads number
    Valor por defecto:Consulte la sección de uso para obtener más información
    Contexto:server config
    Estado:MPM
    Módulo:beos, leader, mpm_netware, mpmt_os2, perchild, threadpool, worker
    +

    Número máximo de hebras en espera. Los diferentes MPMs tienen + diferentes comportamientos respecto a esta directiva.

    + +

    En el módulo perchild el valor por + defecto usado es MaxSpareThreads 10. Este MPM + monitoriza el número de hebras en espera por proceso hijo. Si + hay demasiadas hebras en espera en un proceso hijo, el servidor + empezará a eliminar las hebras de sobra.

    + +

    En los módulos worker, + leader y threadpool el valor + por defecto usado es MaxSpareThreads 250. Estos MPMs + monitorizan el número del hebras en espera en servidor en + conjunto. Si hay demasiadas hebras en espera en el servidor, se + eliminan algunos procesos hijo hasta que el número de hebras + en espera se ajuste al límite especificado.

    + +

    En el módulo mpm_netware el valor por + defecto usado es MaxSpareThreads 100. Como este MPM + ejecuta único proceso, las hebras en espera se calculan + también en base al servidor en conjunto.

    + +

    Los módulos beos y mpmt_os2 + funcionan de manera similar a mpm_netware. El + valor por defecto para beos es + MaxSpareThreads 50. Para mpmt_os2 el + valor por defecto es 10.

    + +

    Restricciones

    +

    El rango de valores que puede tomar + MaxSpareThreads está acotado. Apache + corregirá automáticamente el valor especificado de + acuerdo con las siguientes reglas:

    + +
    + +

    Consulte también

    + +
    +
    top
    +

    MinSpareThreads Directiva

    + + + + + + + +
    Descripción:Número mínimo de hebras en espera para atender picos de +demanda en las peticiones
    Sintaxis:MinSpareThreads number
    Valor por defecto:Consulte la sección de uso para obtener más información
    Contexto:server config
    Estado:MPM
    Módulo:beos, leader, mpm_netware, mpmt_os2, perchild, threadpool, worker
    +

    Número mínimo de hebras en espera para atender picos + de demanda en las peticiones. Los diferentes MPMs tratan esta + directiva de forma diferente.

    + +

    El módulo perchild usa por defecto + MinSpareThreads 5 y calcula el número de hebras + en espera en base al número de procesos hijo. Si no hay + suficientes hebras en espera en un proceso hijo, el servidor + empezará a crear nuevas hebras dentro de ese proceso hijo. De + esta manera, si especifica en la directiva NumServers el valor 10 + y en la directiva MinSpareThreads un valor + de 5, tendrá como mínimo 50 hebras en + espera en su sistema.

    + +

    Los módulos worker, + leader y threadpool usan un + valor por defecto MinSpareThreads 75 y calculan el + número de hebras en espera en el servidor en conjunto. Si no + hay suficientes hebras en espera en el servidor, entonces se crean + procesos hijo hasta que el número de hebras en espera sea + suficiente.

    + +

    El módulo mpm_netware usa un valor por defecto + MinSpareThreads 10 y como es un MPM que trabaja con + un único proceso, calcula el número de hebras en espera en base al + número total que hay en el servidor.

    + +

    Los módulos beos y mpmt_os2 + funcionan de modo similar a como lo hace el módulo + mpm_netware. El valor por defecto que usa + beos es MinSpareThreads 1. + mpmt_os2 usa por defecto el valor + 5.

    + +

    Consulte también

    + +
    +
    top
    +

    PidFile Directiva

    + + + + + + + +
    Descripción:Fichero en el que el servidor guarda +el ID del proceso demonio de escucha (daemon)
    Sintaxis:PidFile filename
    Valor por defecto:PidFile logs/httpd.pid
    Contexto:server config
    Estado:MPM
    Módulo:beos, leader, mpm_winnt, mpmt_os2, perchild, prefork, threadpool, worker
    +

    La directiva PidFile especifica el + fichero en el que el servidor guarda el ID del proceso demonio de + escucha (daemon). Si el nombre del fichero especificado no es una + ruta absoluta, entonces se asume que es relativa al directorio + especificado en ServerRoot.

    + +

    Ejemplo

    + PidFile /var/run/apache.pid +

    + +

    Con frecuencia es útil tener la posibilidad de enviar al + servidor una señal, de manera que cierre y vuelva a abrir el + ErrorLog y el TransferLog, y vuelva a leer + los ficheros de configuración. Esto es lo que ocurre cuando + se envía la señal SIGHUP (kill -1) al ID del proceso que + aparece en PidFile.

    + +

    El PidFile está sujeto a las mismas + advertencias que se hicieron para los ficheros log sobre su + ubicación y sobre su seguridad.

    + +

    Nota

    Se recomienda que para Apache 2 se + use solamente el script apachectl para + (re-)iniciar o parar el servidor.

    +
    + +
    +
    top
    +

    ScoreBoardFile Directiva

    + + + + + + + +
    Descripción:Ubicación del fichero que almacena los datos necesarios para +coordinar el funcionamiento de los procesos hijo del servidor
    Sintaxis:ScoreBoardFile file-path
    Valor por defecto:ScoreBoardFile logs/apache_status
    Contexto:server config
    Estado:MPM
    Módulo:beos, leader, mpm_winnt, perchild, prefork, threadpool, worker
    +

    Apache usa un marcador para que los procesos hijo se + comuniquen con sus procesos padre. Algunas arquitecturas + necesitan un archivo para facilitar esta comunicación. Si no + se especifica ningún fichero, Apache intenta en primer lugar + crear el marcador en memoria (usando memoria compartida + anónima) y, si esto falla, intentará crear el fichero en + disco (usando memoria compartida basada en ficheros). Si se especifica un + valor en esta directiva, Apache creará directamente el + archivo en disco.

    + +

    Ejemplo

    + ScoreBoardFile /var/run/apache_status +

    + +

    El uso de memoria compartida basada en ficheros es útil + para aplicaciones de terceras partes que necesitan acceso directo + al marcador.

    + +

    Si usa la directiva ScoreBoardFile, + puede mejorar la velocidad del servidor poniendo el fichero en + memoria RAM. Pero tenga cuidado y siga las mismas recomendaciones + acerca del lugar donde se almacenan los ficheros log y su seguridad.

    + +

    Consulte también

    + +
    +
    top
    +

    SendBufferSize Directiva

    + + + + + + + +
    Descripción:Tamaño del buffer TCP
    Sintaxis:SendBufferSize bytes
    Valor por defecto:SendBufferSize 0
    Contexto:server config
    Estado:MPM
    Módulo:beos, leader, mpm_netware, mpm_winnt, mpmt_os2, perchild, prefork, threadpool, worker
    +

    El servidor fijará el tamaño del buffer TCP en los + bytes que se especifiquen en esta directiva. Incrementar este + valor por encima de los valores estándar del sistema + operativo es muy útil en situaciones de alta velocidad y gran + latencia (por ejemplo, 100ms o así, como en el caso de + conexiones intercontinentales de gran capacidad).

    + +

    Si se especifica el valor 0, el servidor usará el + valor por defecto del sistema operativo.

    + +
    +
    top
    +

    ServerLimit Directiva

    + + + + + + + +
    Descripción:Límite superior del número configurable de procesos
    Sintaxis:ServerLimit number
    Valor por defecto:Consulte la sección de uso para obtener más información
    Contexto:server config
    Estado:MPM
    Módulo:leader, perchild, prefork, threadpool, worker
    +

    En el módulo MPM prefork, esta directiva + significa el valor máximo que se puede especificar en la + directiva MaxClients + sobre el tiempo de vida de un proceso de Apache. En el + módulo MPM worker, esta diretiva en + combinación con la directiva ThreadLimit significa el valor + máximo que puede especificarse en la directiva MaxClients sobre el tiempo de vida + de un proceso de Apache. Los intententos de cambiar el valor de + esta directiva durante el reinicio del servidor serán + ignorados. El valor de MaxClients sí que puede + modificarse durante el reinicio.

    + +

    Cuando se usa esta directiva hay que tener especial cuidado. + Si en la directiva ServerLimit se + especifica un valor mucho más alto de lo necesario, se reservará + memoria compartida que no será usada. Si ambas directivas + ServerLimit y MaxClients tienen especificados + valores mayores que los que el sistema puede manejar, Apache puede + que no se inicie o que el sistema se vuelva inestable.

    + +

    Con el módulo MPM prefork, use esta + directiva solamente si necesita especificar en la directiva + MaxClients un valor + mayor a 256 (el valor por defecto). No especifique un valor mayor + del que vaya a especificar en la directiva MaxClients.

    + +

    Con los módulos worker, + leader y threadpool use esta + directiva solamente si los valores especificados en las directivas + MaxClients y ThreadsPerChild precisan más de 16 + procesos del servidor (valor por defecto). No especifique en esta + directiva un valor mayor que el número de procesos del servidor + requeridos por lo especificado en las directivas MaxClients y ThreadsPerChild.

    + +

    Con el MPM perchild, use esta directiva solo + si tiene que especificar en la directiva NumServers un valor mayor de 8 (el + valor por defecto).

    + +

    Nota

    +

    Existe un límite inviolable compilado en el servidor que es + ServerLimit 20000. Con este límite se intentan + evitar las consecuencias que pueden tener los errores tipográficos.

    +
    + +

    Consulte también

    + +
    +
    top
    +

    StartServers Directiva

    + + + + + + + +
    Descripción:Número de procesos hijo del servidor que se crean al +iniciar Apache
    Sintaxis:StartServers number
    Valor por defecto:Consulte la sección de uso para obtener más información
    Contexto:server config
    Estado:MPM
    Módulo:leader, mpmt_os2, prefork, threadpool, worker
    +

    La directiva StartServers especifica el + número de procesos hijo que se crean al iniciar Apache. Como + el número de procesos está controlado dinámicamente + según la carga del servidor, no hay normalmente ninguna + razón para modificar el valor de este parámetro.

    + +

    El valor por defecto cambia según el MPM de que se trate. Para + leader, threadpool y + worker el valor por defecto es StartServers + 3. Para prefork el valor por defecto es + 5 y para mpmt_os2 es + 2.

    + +
    +
    top
    +

    StartThreads Directiva

    + + + + + + + +
    Descripción:Número de hebras que se crean al iniciar Apache
    Sintaxis:StartThreads number
    Valor por defecto:Consulte la sección de uso para obtener más información
    Contexto:server config
    Estado:MPM
    Módulo:beos, mpm_netware, perchild
    +

    Número de hebras que se crean al iniciar Apache. Como el + número de procesos está controlado dinámicamente + según la carga del servidor, no hay normalmente ninguna + razón para modificar el valor de este parámetro.

    + +

    En el módulo perchild el valor por defecto es + StartThreads 5 y esta directiva controla el número de + hebras por proceso al inicio.

    + +

    En el módulo mpm_netware el valor por + defecto es StartThreads 50 y, como solamente hay un + proceso, este es el número total de hebras creadas al iniciar + el servidor para servir peticiones.

    + +

    En el módulo beos el valor usado por + defecto es StartThreads 10. En este caso también + representa el número total de hebras creadas al iniciar el + servidor para servir peticiones.

    + +
    +
    top
    +

    ThreadLimit Directiva

    + + + + + + + + +
    Descripción:Marca el límite superior del número de hebras por +proceso hijo que pueden especificarse
    Sintaxis:ThreadLimit number
    Valor por defecto:Consulte la sección de uso para obtener más información
    Contexto:server config
    Estado:MPM
    Módulo:leader, mpm_winnt, perchild, threadpool, worker
    Compatibilidad:Disponible para mpm_winnt en las versiones de Apache +2.0.41 y posteriores
    +

    Esta directiva determina el valor máximo que puede especificarse + en la directiva ThreadsPerChild para el tiempo de + vida de un proceso de Apache. Los intentos por modificar este + valor durante un reinicio serán ingnorados, pero el valor de la + directiva ThreadsPerChild puede modificarse + durante un reinicio hasta un valor igual al de esta directiva.

    + +

    Cuando se usa esta directiva hay que poner especial + atención. Si en la directiva + ThreadLimit se especifica un valor mucho + más grande que en ThreadsPerChild, se reservará + memoria compartida en exceso que no será usada. Si tanto en + ThreadLimit como en ThreadsPerChild se especifican + valores mayores de los que el sistema puede tratar, Apache + podría no iniciarse o su funcionamiento podría volverse + inestable. No especifique en esta directiva un valor mayor del + mayor valor posible que piense que va a especificar en ThreadsPerChild para la + ejecución de Apache de ese momento.

    + +

    El valor por defecto de la directiva + ThreadLimit es 1920 cuando se + usa con mpm_winnt y 64 en otro caso.

    + +

    Nota

    Hay un límite estricto compilado + en el servidor: ThreadLimit 20000 (o + ThreadLimit 15000 si usa + mpm_winnt). Este límite existe para evitar + los efectos que pueden ser provocados por errores + tipográficos.

    +
    + +
    +
    top
    +

    ThreadsPerChild Directiva

    + + + + + + + +
    Descripción:Número de hebras creadas por cada proceso +hijo
    Sintaxis:ThreadsPerChild number
    Valor por defecto:Consulte la sección de uso para obtener más información
    Contexto:server config
    Estado:MPM
    Módulo:leader, mpm_winnt, threadpool, worker
    +

    Esta directiva especifica el número de hebras creadas por + cada proceso hijo. El proceso hijo crea estas hebras al inicio y + no vuelve a crear más. Si se usa un MPM como + mpm_winnt, en el que solamente hay un proceso + hijo, este número debería ser lo suficientemente grande + como para atender toda la carga del servidor. Si se usa un + módulo MPM como worker, en el que hay + múltiples procesos hijo, el número total de + hebras debería ser lo suficientemente grande como para + atender la carga en circustancias normales del servidor.

    + +

    El valor por defecto de la directiva + ThreadsPerChild es 64 cuando + se usa mpm_winnt y 25 en otro caso.

    + +
    +
    top
    +

    User Directiva

    + + + + + + + + +
    Descripción:Nombre de usuario con el que el servidor responderá a las +peticiones
    Sintaxis:User unix-userid
    Valor por defecto:User #-1
    Contexto:server config
    Estado:MPM
    Módulo:leader, perchild, prefork, threadpool, worker
    Compatibilidad:Válida solamente en global server config a partir +de la versión de Apache 2.0
    +

    La directiva User especifica el + identificador de usuario con el que el servidor responderá a + las peticiones. Para usar esta directiva, el servidor debe haber + sido iniciado como root. Si se inicia Apache con un + usario distinto de root, no se podrá cambiar a un usuario con + menores privilegios, y el servidor continuará ejecutándose + con el usuario original. Si inicia el servidor como + root, entonces es normal que el procedimiento padre + siga ejecutándose como root. Unix-userid puede tomar + uno de los siguientes valores:

    + +
    +
    Un nombre de ususario
    +
    Se refiere al usuario dado por su nombre.
    + +
    # seguido por un número de usuario.
    +
    Se refiere al usuario que corresponde a ese número.
    +
    + +

    El usuario debe no tener privilegios suficientes para acceder a + ficheros que no deban ser visibles para el mundo exterior, y de + igual manera, el usuario no debe ser capaz de ejecutar código que + no sea susceptible de ser objeto de respuestas a peticiones + HTTP. Se recomienda que especifique un nuevo usuario y un nuevo + grupo solamente para ejecutar el servidor. Algunos + administradores usan el usuario nobody, pero esto no + es siempre deseable, porque el usuario nobody puede + tener otras funciones en su sistema.

    + +

    Seguriad

    +

    No espcifique en la directiva User (o + Group) el valor + root a no ser que sepa exactamente lo que está + haciendo, y cuáles son los peligros.

    +
    + +

    Con el MPM perchild, que está + diseñado para ejecutar hosts virtuales por diferentes ID de + usuario, la directiva User define el ID de + usuario para el servidor principal y para el resto de las + secciones <VirtualHost> sin una directiva AssignUserID.

    + +

    Nota especial: El uso de esta directiva en <VirtualHost> no está + ya soportado. Para configurar su servidor para + suexec use SuexecUserGroup.

    + +

    Nota

    +

    Aunque la directiva User está + presente en los MPMs beos y + mpmt_os2 MPMs, no está operativa y + solamente está presente por razones de compatibilidad.

    +
    + +
    +
    +
    +

    Idiomas disponibles:  de  | + en  | + es  | + ja  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mpm_common.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/mpm_common.html.ja.utf8 new file mode 100644 index 00000000..7475343e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mpm_common.html.ja.utf8 @@ -0,0 +1,956 @@ + + + +mpm_common - Apache HTTP サーバ + + + + + + +
    <-
    + +
    +

    Apache MPM 共通ディレクティブ

    +
    +

    Available Languages:  de  | + en  | + es  | + ja  | + tr 

    +
    +
    This translation may be out of date. Check the + English version for recent changes.
    + +
    説明:二つ以上のマルチプロセッシングモジュール (MPM) +で実装されているディレクティブのコレクション
    ステータス:MPM
    +
    + + +
    top
    +

    AcceptMutex ディレクティブ

    + + + + + + + +
    説明:複数の子プロセスがネットワークソケットでリクエストを +accept しようとしているときに、Apache がそれらの子プロセスを直列化するために +使う方法
    構文:AcceptMutex default|method
    デフォルト:AcceptMutex default
    コンテキスト:サーバ設定ファイル
    ステータス:MPM
    モジュール:leader, perchild, prefork, threadpool, worker
    +

    AcceptMutex ディレクティブは、 + ネットワークソケットのリクエストを accept しようとしている複数の子プロセスを + Apache が直列化するために使う方法を設定します。 + Apache 2.0 以前は、このメソッドはコンパイル時にのみ選択できました。 + 最適な方法は、アーキテクチャやプラットホームに大きく依存します。 + 詳細に関しては、性能のチューニング + ドキュメントをご覧下さい。

    + +

    このディレクティブが Default + に設定されていれば、コンパイル時に選択されたデフォルト値が使われます。 + 他の使用可能なメソッドの一覧は下にあります。 + 全てのメソッドが全てのプラットホームで使用可能であるわけではない、 + ということに注意してください。 + 使用可能でないメソッドが指定された場合は、 + 使用可能なメソッドの一覧を含んだメッセージが + エラーログに出力されます。

    + +
    +
    flock
    +
    LockFile + ディレクティブで定義したファイルのロックに、 + flock(2) システムコールを使います。
    + +
    fcntl
    +
    LockFile + ディレクティブで定義したファイルのロックに、 + fcntl(2) システムコールを使います。
    + +
    posixsem
    +
    排他処理の実装に POSIX 互換セマフォを使用します
    + +
    pthread
    +
    POSIX Threads (PThreads) 規格で実装されている + POSIX 排他処理を使います。
    + +
    sysvsem
    +
    排他処理の実装に SySV 形式のセマフォを使います。
    +
    + +

    コンパイル時にシステムのデフォルトに選ばれたものが何かを見たい場合は、 + LogLevel を debug + に設定するとよいでしょう。デフォルトの AcceptMutex + が ErrorLog に書き込まれます。

    + +
    +
    top
    +

    BS2000Account ディレクティブ

    + + + + + + + +
    説明:BS2000 での非特権アカウントを定義する
    構文:BS2000Account account
    コンテキスト:サーバ設定ファイル
    ステータス:MPM
    モジュール:perchild, prefork
    互換性:BS2000 でのみ利用可能
    +

    BS2000Account ディレクティブは + BS2000 ホストでのみ使用できます。 + 非特権の Apache サーバユーザ (Userで設定) + のためのアカウント番号を定義するのに使用します。 + BS2000 POSIX サブシステムに対して (下位層の sub-LOGON 実行時に + BS2000 タスク環境を変更するために) 必要で、 + CGI スクリプトから、特権アカウントのリソース、 + 一般的には SYSROOT にアクセスされるのを防ぎます。

    + +

    Note

    +

    使用できる BS2000Account は一つだけです。

    +
    + +

    参照

    + +
    +
    top
    +

    CoreDumpDirectory ディレクティブ

    + + + + + + + +
    説明:Apache がコアダンプする前に移動を試みるディレクトリ +
    構文:CoreDumpDirectory directory
    デフォルト:デフォルトの設定は説明文を読んでください
    コンテキスト:サーバ設定ファイル
    ステータス:MPM
    モジュール:beos, leader, mpm_winnt, perchild, prefork, threadpool, worker
    +

    Apache がコアダンプする前に移動を試みるディレクトリを制御します。 + デフォルト値は ServerRoot + ディレクトリですが、このディレクトリはサーバの実行されているユーザ権限で + 書き込み可能であるべきではないので、通常はコアダンプは書き込まれません。 + デバッグのためにコアダンプが必要であれば、 + このディレクティブを使って他の位置にコアダンプを書き出すようにできます。

    + +

    Linux でのコアダンプ

    +

    Apache が root として起動されて、別のユーザの権限に以降した場合は + Linux のカーネルはディレクトリがプロセスの権限で書き込み可能な場合でさえも + コアダンプを無効にします。Apache (2.0.46 以降) は + Linux 2.4 以降ではコアダンプを行なうように再指定しますが、それは + CoreDumpDirectory を明示的に設定したときに + 限ります。

    +
    + +
    +
    top
    +

    EnableExceptionHook ディレクティブ

    + + + + + + + + +
    説明:クラッシュの後に例外ハンドラを実行するフックを有効にする
    構文:EnableExceptionHook On|Off
    デフォルト:EnableExceptionHook Off
    コンテキスト:サーバ設定ファイル
    ステータス:MPM
    モジュール:leader, perchild, prefork, threadpool, worker
    互換性:2.0.49 以降
    +

    安全上の理由から、--enable-exception-hook configure + オプションを有効にした場合にのみ、このディレクティブを利用できます。 + 外部モジュールをプラグインして、子がクラッシュした後に何か実行できるような + フックを有効にします。

    + +

    このような外部モジュールは、既に二つ存在していて、 + mod_whatkilledus と mod_backtrace + がこのフックを活用します。これらの詳細については Jeff Trawick + さんの EnableExceptionHook site を参照してください。

    + +
    +
    top
    +

    Group ディレクティブ

    + + + + + + + + +
    説明:リクエストに応答する際に所属するグループ
    構文:Group unix-group
    デフォルト:Group #-1
    コンテキスト:サーバ設定ファイル
    ステータス:MPM
    モジュール:beos, leader, mpmt_os2, perchild, prefork, threadpool, worker
    互換性:Apache 2.0 以降で、グローバル設定でのみ有効です。
    +

    Group ディレクティブで、 + リクエストに応答する際に所属しておくグループを設定します。 + このディレクティブを使用するためには、 + サーバは最初に root 権限で起動されている必要があります。 + 非 root ユーザでサーバを起動した場合は、指定したグループに変化できずに、 + 結果的に起動したユーザの属するグループで実行されることになります。 + unix-group は次のうちのいずれかです:

    + +
    +
    グループ名
    +
    グループを名前で参照します
    + +
    # に続いてグループ番号
    +
    グループをを番号で参照します。
    +
    + +

    例

    + Group www-group +

    + +

    サーバを実行するために特定の新しいグループを設定することを + お薦めします。nobody を使用する管理者もいますが、 + 可能であったり望ましい訳では必ずしもありません。

    + +

    セキュリティ

    +

    正確にどんなことをやっているのか、その危険性を知らないで、 + Group (や User) を + root に 設定しないでください。

    +
    + +

    特記事項: このディレクティブを + <VirtualHost> + で使用することはサポートされなくなりました。Apache 2.0 で + suexec を設定したい場合は、 + SuexecUserGroup + を使用してください。

    + +

    注意

    +

    Group ディレクティブは + beos と mpmt_os2 MPM + にも存在しますが、実質的に無効で、互換性のためだけに存在します。

    +
    + +
    +
    top
    +

    Listen ディレクティブ

    + + + + + + + +
    説明:サーバが listen するIP アドレスとポート番号
    構文:Listen [IP-address:]portnumber
    コンテキスト:サーバ設定ファイル
    ステータス:MPM
    モジュール:beos, leader, mpm_netware, mpm_winnt, mpmt_os2, perchild, prefork, threadpool, worker
    互換性:Apache 2.0 から必要なディレクティブ
    +

    Listen ディレクティブは Apache + が特定の IP アドレスやポート番号だけを listen するように指定します。 + デフォルトでは全ての IP インターフェースのリクエストに応答します。 + Listen ディレクティブは + 現在は必須のディレクティブとなりました。 + もし設定ファイルになければ、サーバは起動に失敗します。 + これは以前のバージョンの Apache から変更のあった部分です。

    + +

    Listen ディレクティブでは、特定のポートあるいは + アドレスとポートの組み合わせから入ってくるリクエストに対して + 応答するように指定します。 + もしポート番号だけが指定された場合は、サーバは全インターフェースの + 指定されたポート番号に対して listen します。 + IP アドレスがポートとともに指定された場合は、 + サーバは指定されたポートとインターフェースに対して listen + します。

    + +

    複数のアドレスとポートに対して listen するように、 + 複数の Listen ディレクティブを使うこともできます。 + サーバは列挙されたアドレスとポート全てからのリクエストに対して + 応答します。

    + +

    例えば、サーバが 80 番ポートと 8000 番ポートの両方の + コネクションを受け入れる場合は、次のようにします。

    + +

    + Listen 80
    + Listen 8000 +

    + +

    二つの特定のインターフェースとポート番号からのコネクションを + 受け入れるようにするには、次のようにします。

    + +

    + Listen 192.170.2.1:80
    + Listen 192.170.2.5:8000 +

    + +

    IPv6 アドレスは角括弧で囲まなければなりません。 + 例えば次の例のようにです。

    + +

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

    + +

    エラー条件

    + 同一 IP アドレスとポートの組に、複数の Listen + ディレクティブを指定してしまうと、'Address already in use' + というエラーメッセージを受けることになります。 +
    + + +

    参照

    + +
    +
    top
    +

    ListenBackLog ディレクティブ

    + + + + + + + +
    説明:保留状態のコネクションのキューの最大長
    構文:ListenBacklog backlog
    デフォルト:ListenBacklog 511
    コンテキスト:サーバ設定ファイル
    ステータス:MPM
    モジュール:beos, leader, mpm_netware, mpm_winnt, mpmt_os2, perchild, prefork, threadpool, worker
    +

    保留状態のコネクションのキューの最大長です。 + 一般的には調整する必要はありませんし、調整は望ましくありません。 + しかし、TCP SYN フラッドアタックの状況下におかれる場合に、 + 増やした方が望ましいシステムもあります。 + listen(2) システムコールのバックログパラメータを + ご覧下さい。

    + +

    この値は OS により、小さな数に抑えられます。 + 値は OS 毎に異なっています。また多くの OS では、 + バックログとして指定されている値ちょうどまで使っているわけではなく、 + 設定されている値に基づいて (通常は設定値よりも大きな値を) + 使っていることに注意してください。

    + +
    +
    top
    +

    LockFile ディレクティブ

    + + + + + + + +
    説明:受付を直列化するためのロックファイルの位置
    構文:LockFile filename
    デフォルト:LockFile logs/accept.lock
    コンテキスト:サーバ設定ファイル
    ステータス:MPM
    モジュール:leader, perchild, prefork, threadpool, worker
    +

    AcceptMutex + が fcntl や flock + に設定されて使用されている場合に、使用されるロックファイルへのパスを + LockFile ディレクティブで設定します。 + このディレクティブは通常はそのままにしておきます。 + 主に logs ディレクトリが NFS + でマウントされている場合などに値を変えます。 + なぜならロックファイルはローカルディスクに + 保存されなければならないからです。 + メインサーバプロセスの PID がファイル名に自動的に付加されます。

    + +

    セキュリティ

    +

    /var/tmp + といった、誰でも書き込めるディレクトリにファイルを + 置かない方がよいです。なぜなら、サーバが起動時に作成する + ロックファイルの作成自体を妨害することによって、 + 誰でもサービス拒否アタックを引き起こすことができるからです。

    +
    + +

    参照

    + +
    +
    top
    +

    MaxClients ディレクティブ

    + + + + + + + +
    説明:リクエストに応答するために作成される +子プロセスの最大個数
    構文:MaxClients number
    デフォルト:詳細は使用法をご覧下さい。
    コンテキスト:サーバ設定ファイル
    ステータス:MPM
    モジュール:beos, leader, prefork, threadpool, worker
    +

    MaxClients ディレクティブは、 + 応答することのできる同時リクエスト数を設定します。 + MaxClients 制限数を越えるコネクションは通常、 + ListenBacklog + ディレクティブで設定した数までキューに入ります。 + 他のリクエストの最後まで達して子プロセスが空くと、 + 次のコネクションに応答します。

    + +

    スレッドを用いないサーバ (すなわち prefork) + では、MaxClients + は、リクエストに応答するために起動される + 子プロセスの最大数となります。 + デフォルト値は 256 で、これを増加させたい場合は、 + ServerLimit + の値も増加させる必要があります。

    + +

    スレッドを用いるサーバや、ハイブリッドサーバ (すなわち + beos worker) + では、MaxClients + は、クライアントに応答できるスレッドの総数を制限します。 + beos でのデフォルト値は 50 です。 + ハイブリッド MPM でのデフォルト値は 16 + ServerLimit + の 25 倍 (ThreadsPerChild) です。 + MaxClients + を 16 プロセス以上必要な値まで増加させたい場合は、 + ServerLimit + も増加させる必要があります。

    + +
    +
    top
    +

    MaxMemFree ディレクティブ

    + + + + + + + +
    説明:free() が呼ばれない限り、 +主メモリアロケータが保持し続けられるメモリの最大量
    構文:MaxMemFree KBytes
    デフォルト:MaxMemFree 0
    コンテキスト:サーバ設定ファイル
    ステータス:MPM
    モジュール:beos, leader, mpm_netware, prefork, threadpool, worker, mpm_winnt
    +

    MaxMemFree ディレクティブは + free() が呼ばれない限り、 + 主アロケータが保持できる空のメモリの最大値をキロバイト単位で設定します。 + 設定されていないか、零に設定されているときは、無制限になります。

    + +
    +
    top
    +

    MaxRequestsPerChild ディレクティブ

    + + + + + + + +
    説明:個々の子サーバが稼働中に扱うリクエスト数の上限
    構文:MaxRequestsPerChild number
    デフォルト:MaxRequestsPerChild 10000
    コンテキスト:サーバ設定ファイル
    ステータス:MPM
    モジュール:leader, mpm_netware, mpm_winnt, mpmt_os2, perchild, prefork, threadpool, worker
    +

    MaxRequestsPerChild ディレクティブは、 + 個々の子サーバプロセスが扱うことのできるリクエストの制限数を + 設定します。MaxRequestsPerChild + 個のリクエストの後に、子プロセスは終了します。 + MaxRequestsPerChild が 0 + に設定されている場合は、プロセスは期限切れにより終了することはありません。

    + +

    その他のデフォルト値

    +

    mpm_netware と mpm_winnt + でのデフォルト値は 0 です。

    +
    + +

    MaxRequestsPerChild + を非ゼロに制限することには、二つの利点があります:

    + +
      +
    • (偶発的な) メモリーリークが起こった場合に + プロセスが消費するメモリの総量を制限できる
    • + +
    • プロセスに有限のライフタイムを設定することで、 + サーバ負荷が下がった時にプロセス数を少なくすることができる
    • +
    + +

    注

    +

    KeepAlive リクエストの場合は、 + 一つ目のリクエストだけがこの制限に該当します。 + 実効的には、一つの子プロセスあたりのコネクション数を + 制限するように挙動が変化します。

    +
    + +
    +
    top
    +

    MaxSpareThreads ディレクティブ

    + + + + + + + +
    説明:アイドルスレッドの最大数
    構文:MaxSpareThreads number
    デフォルト:詳細は使用法をご覧下さい。
    コンテキスト:サーバ設定ファイル
    ステータス:MPM
    モジュール:beos, leader, mpm_netware, mpmt_os2, perchild, threadpool, worker
    +

    アイドルなスレッドの最大数です。異なる MPM ではそれぞれ、 + このディレクティブは異なる取り扱われ方をされます。

    + +

    perchild では、 + デフォルトは MaxSpareThreads 10 です。 + この MPM はアイドルスレッド数を、それぞれの子プロセスごとに監視します。 + 子プロセスにアイドルスレッドが多すぎる場合は、 + サーバはその子プロセスに含まれるスレッドを終了し始めます。

    + +

    worker, leader, + threadpool では、 + デフォルトは MaxSpareThreads 250 です。 + この MPM はアイドルスレッド数をサーバ全体で監視します。 + サーバでアイドルスレッド数が多すぎる場合は、 + この数字よりも少ない数になるまで子プロセスを終了します。

    + +

    mpm_netware では、 + デフォルトは MaxSpareThreads 100 です。 + この MPM はシングルプロセスで実行されますので、 + スペアスレッド数もサーバ全体で勘定します。

    + +

    beos と mpmt_os2 は + mpm_netware と似た挙動をします。 + beos でのデフォルト値は MaxSpareThreads 50 + です。mpmt_os2 でのデフォルト値は 10 + です。

    + +

    制限事項

    +

    MaxSpareThreads の取る値には制限があります。 + Apache は次の規則に従って自動的に補正します。

    +
      +
    • perchild では、 + MaxSpareThreads が + ThreadLimit + と等しいかそれ以下である必要があります。
    • + +
    • mpm_netware は + MinSpareThreads + よりも大きい必要があります。
    • + +
    • leader, threadpool, + worker では、 + MinSpareThreads と + ThreadsPerChild + で決まる総和と等しいか大きい必要があります。
    • +
    +
    + +

    参照

    + +
    +
    top
    +

    MinSpareThreads ディレクティブ

    + + + + + + + +
    説明:リクエストに応答することのできる +アイドルスレッド数の最小数
    構文:MinSpareThreads number
    デフォルト:詳細は使用方法をご覧下さい。
    コンテキスト:サーバ設定ファイル
    ステータス:MPM
    モジュール:beos, leader, mpm_netware, mpmt_os2, perchild, threadpool, worker
    +

    リクエストに応答するスレッド数の最小値です。 + 異なる MPM ではそれぞれ、 + このディレクティブは異なる取り扱われ方をします。

    + +

    perchild では、 + デフォルトは MinSpareThreads 5 で、 + アイドルスレッド数を子プロセス毎に監視します。 + もし子プロセスに十分な数のスレッドがなければ、 + サーバはその子プロセスに新しいスレッドを作り始めます。 + ですから、NumServers + を 10 に、MinSpareThreads を + 5 にした場合は、最小でも 50 のアイドルスレッドが + システム上にあることになります。

    + +

    worker, leader, + threadpool では、 + デフォルトは MinSpareThreads 75 で、 + アイドルスレッド数をサーバ全体で監視します。 + もしサーバに十分な数のアイドルスレッドがなければ、 + アイドルスレッド数がこの数よりも大きくなるまで + 新しい子プロセスが生成されます。

    + +

    mpm_netware では、 + デフォルトは MinSpareThreads 10 で、 + シングルプロセス MPM ですので、サーバ全体で管理されます。

    + +

    beos と mpmt_os2 は、 + mpm_netwareによく似ています。 + beos でのデフォルトは MinSpareThreads 1 + です。mpmt_os2 でのデフォルトは + 5 です。

    + +

    参照

    + +
    +
    top
    +

    PidFile ディレクティブ

    + + + + + + + +
    説明:デーモンのプロセス ID +をサーバが記録するためのファイル
    構文:PidFile filename
    デフォルト:PidFile logs/httpd.pid
    コンテキスト:
    ステータス:MPM
    モジュール:beos, leader, mpm_winnt, mpmt_os2, perchild, prefork, threadpool, worker
    +

    PidFile ディレクティブで、 + デーモンのプロセス ID をサーバが記録するファイルを設定します。 + ファイル名が絶対パスでない場合は、 + ServerRoot + からの相対的なものとして扱われます。

    + +

    例

    + PidFile /var/run/apache.pid +

    + +

    サーバが ErrorLog + や TransferLog + を閉じて開き直したり、設定ファイルを + 再読込したりさせるために、サーバにシグナルを送ることができると + 便利なことがあります。 + これは SIGHUP (kill -1) シグナルを PidFile + に書かれているプロセス ID に送ることでできます。

    + +

    PidFile には、ログファイルの設置位置や + セキュリティ + と全く同じ注意点があります。

    + +

    注意

    +

    Apache 2 では、 + apachectl + スクリプトのみを使用してサーバの (再) 起動や停止を + 行なうことを推奨しています。

    +
    + +
    +
    top
    +

    ScoreBoardFile ディレクティブ

    + + + + + + + +
    説明:子プロセスと連携するためのデータを保存する +ファイルの位置
    構文:ScoreBoardFile file-path
    デフォルト:ScoreBoardFile logs/apache_status
    コンテキスト:サーバ設定ファイル
    ステータス:MPM
    モジュール:beos, leader, mpm_winnt, perchild, prefork, threadpool, worker
    +

    Apache は親プロセスと子プロセス間の通信にスコアボードを用います。 + この通信機能にファイルを必要とするアーキテクチャもあります。 + ファイルが指定されていなければ、Apache はまずメモリ上 + (匿名共有メモリ) にスコアボードを作ろうとし、それが失敗すると + ディスク上にファイル (ファイルベースの共有メモリ) を作ろうとします。 + このディレクティブを指定すると、Apache + は必ずディスクにファイルを生成します。

    + +

    例

    + ScoreBoardFile /var/run/apache_status +

    + +

    ファイルベースの共有メモリは、サードパーティー製のアプリケーションで + スコアボードに直接アクセスする必要がある場合に役に立ちます。

    + +

    ScoreBoardFile を使う場合、 + RAM ディスク上に置くとスピードが向上するでしょう。 + しかし、ログファイルの設置位置や + セキュリティ + と同様の注意点があるので、注意してください。

    + +

    参照

    + +
    +
    top
    +

    SendBufferSize ディレクティブ

    + + + + + + + +
    説明:TCP バッファサイズ
    構文:SendBufferSize bytes
    デフォルト:SendBufferSize 0
    コンテキスト:サーバ設定ファイル
    ステータス:MPM
    モジュール:beos, leader, mpm_netware, mpm_winnt, mpmt_os2, perchild, prefork, threadpool, worker
    +

    サーバは TCP バッファサイズを指定されたバイト数に設定します。 + 高速で高レイテンシな環境で + (例 100ms 程度、大陸横断高速通信路など) + 古い一般的な OS のデフォルト値を増やすのに非常に便利です。

    + +

    0にした場合、OS のデフォルト値が使用されます。

    + +
    +
    top
    +

    ServerLimit ディレクティブ

    + + + + + + + +
    説明:設定可能なサーバプロセス数の上限
    構文:ServerLimit number
    デフォルト:詳細は使用法を参照
    コンテキスト:サーバ設定ファイル
    ステータス:MPM
    モジュール:leader, perchild, prefork, threadpool, worker
    +

    prefork MPM の場合は、このディレクティブは + Apache プロセス稼働中における + MaxClients + に設定可能な上限値を設定することになります + (訳注: prefork の場合は同時クライアント数 = サーバプロセス数なので) 。 + worker MPM の場合には、このディレクティブは + ThreadLimit + ディレクティブと組み合わせて、 + Apache プロセス稼働中における + MaxClients + に設定可能な上限値を設定することになります。 + 再起動中にこのディレクティブを変更しても無視されますが、 + MaxClients + は再起動中に修正することができます。

    + +

    このディレクティブを使用する際は特に注意してください。 + ServerLimit が必要以上に大きな値に + 設定された場合は、余計な未使用共有メモリが割り当てられます。 + ServerLimit と + MaxClients + がシステムの扱える範囲を越えた設定値になっていると、 + Apache は起動しないか、起動しても不安定になるでしょう。

    + +

    prefork MPM では、 + MaxClients + を 256 (デフォルト) よりも大きな値に設定する必要がある時にだけ使用してください。 + 希望の MaxClients + 数とくらべて、必要以上に大きな値を指定することは避けてください。

    + +

    worker, leader, + threadpool MPM では、 + MaxClients と + ThreadsPerChild + の設定で 16 サーバプロセス (デフォルト) + 以上必要になる場合にのみ使用してください。希望の + MaxClients と + ThreadsPerChild + とくらべて、必要となるサーバプロセス数以上に大きな値を + 設定することは避けてください。

    + +

    perchild MPM では、 + NumServers を 8 (デフォルト) + よろいも大きな値に設定する必要があるときにのみ使用してください。

    + +

    注意

    +

    ServerLimit 20000 という制限付きでコンパイルされています。 + これはスペルミスによって誤って酷い状況になるのを、 + 回避するための処置です。

    +
    + +

    参照

    + +
    +
    top
    +

    StartServers ディレクティブ

    + + + + + + + +
    説明:起動時に生成される子サーバプロセスの数
    構文:StartServers number
    デフォルト:詳細は使用方法を参照
    コンテキスト:サーバ設定ファイル
    ステータス:MPM
    モジュール:leader, mpmt_os2, prefork, threadpool, worker
    +

    StartServers ディレクティブは、 + 起動時に生成される子サーバプロセスの数を設定します。 + プロセス数は負荷に応じて動的に制御されますので、 + 通常はこの値を調整する理由はあまりないでしょう。

    + +

    デフォルト値は MPM ごとに異なります。 + leader, threadpool, + worker は StartServers 3 です。 + prefork は 5 で、 + mpmt_os2 は 2 です。

    + +
    +
    top
    +

    StartThreads ディレクティブ

    + + + + + + + +
    説明:起動時に生成されるスレッドの数
    構文:StartThreads number
    デフォルト:詳細は使用方法を参照
    コンテキスト:サーバ設定ファイル
    ステータス:MPM
    モジュール:beos, mpm_netware, perchild
    +

    起動時に生成されるスレッドの数です。 + スレッド数は負荷に応じて動的に制御されますので、 + 通常はこの値を調整する理由はあまりないでしょう。

    + +

    perchild でのデフォルトは + StartThreads 5 で、このディレクティブは起動時に + プロセス毎のスレッド数を追跡します。

    + +

    mpm_netware でのデフォルトは + StartThreads 50 で、 + この場合プロセスは一つしかないので、 + 起動時にリクエストに応答するスレッドの総数となります。

    + +

    beos でのデフォルトは StartThreads + 10 です。 + また、起動時に生成されるスレッドの総数にも反映されます。

    + +
    +
    top
    +

    ThreadLimit ディレクティブ

    + + + + + + + + +
    説明:設定可能な子プロセス毎のスレッド数の上限を +設定します
    構文:ThreadLimit number
    デフォルト:詳細は使用方法を参照
    コンテキスト:サーバ設定ファイル
    ステータス:MPM
    モジュール:leader, mpm_winnt, perchild, threadpool, worker
    互換性:Apache 2.0.41 とそれ以降の mpm_winnt +で利用可能
    +

    このディレクティブは + Apache プロセス稼働中における + ThreadsPerChild + に設定可能な上限値を設定します。再起動時にこのディレクティブの値を + 変更しても無視されますが、 + ThreadsPerChild + は再起動中に、このディレクティブで指定された上限値まで + 変更することができます。

    + +

    このディレクティブを使用する際は特に注意してください。 + ThreadLimit が + ThreadsPerChild + よりもずっと大きな値に設定された場合は、 + 余計な未使用共有メモリが割り当てられてしまいます。 + ThreadLimit が + ThreadsPerChild + の両方がシステムの扱える範囲を超えている場合は、 + Apache は起動しないか、起動したとしても不安定になるでしょう。 + このディレクティブの値は今使用している Apache の ThreadsPerChild の予想上限値を + 超えた値には設定しないでください。 +

    + +

    ThreadLimit のデフォルト値は + mpm_winnt のときは 1920 で、 + 他の場合は 64 です。

    + +

    注意

    +

    ThreadLimit 20000 (mpm_winnt + の場合は ThreadLimit 15000 ) + という制限付きでコンパイルされています。 + これはスペルミスによって誤って酷い状況になるのを、 + 回避するための処置です。

    +
    + +
    +
    top
    +

    ThreadsPerChild ディレクティブ

    + + + + + + + +
    説明:子プロセスそれぞれに生成されるスレッド数
    構文:ThreadsPerChild number
    デフォルト:詳細は使用方法を参照
    コンテキスト:サーバ設定ファイル
    ステータス:MPM
    モジュール:leader, mpm_winnt, threadpool, worker
    +

    このディレクティブは、それぞれの子プロセスで生成される + スレッド数を設定します。 + 子プロセスは開始時にこれらのスレッドを生成して、 + その後は生成しません。mpm_winnt のような、 + 子プロセスが一つしかないような MPM を利用しているのであれば、 + この値はサーバの負荷全体を十分取り扱える程度に、 + 大きくなければなりません。worker のような、 + 子プロセスが複数あるような MPM を利用しているのであれば、 + サーバの通常負荷を十分扱える程度に、 + スレッド総数が多くなければなりません。

    + +

    mpm_winntでの ThreadsPerChild + のデフォルト値は 64 で、他の場合は + 25 です。

    + +
    +
    top
    +

    User ディレクティブ

    + + + + + + + + +
    説明:リクエストに応答する際に用いるユーザ ID
    構文:User unix-userid
    デフォルト:User #-1
    コンテキスト:サーバ設定ファイル
    ステータス:MPM
    モジュール:leader, perchild, prefork, threadpool, worker
    互換性:Apache 2.0 以降で、グローバル設定でのみ有効です。 +
    +

    User ディレクティブは + サーバがリクエストに応答する際に用いるユーザ ID を設定します。 + このディレクティブを使用するためには、スタンドアロン型の + サーバは最初に root 権限で起動されている必要があります。 + 非 root ユーザでサーバを起動した場合は、 + 権限の低いユーザへと変わることができず、 + 結局元のユーザのプロセスとして実行され続けます。 + root で起動した場合に親プロセスが root + として実行されているのは正常な動作です。 + Unix-userid は次のどれかです。

    + +
    +
    ユーザ名
    +
    ユーザを名前で参照します。
    + +
    # に続いてユーザ番号
    +
    ユーザを番号で参照します。
    +
    + +

    このユーザは、外部に見せるように意図していないファイルに、 + アクセス可能になってしまうような権限を持つべきではないですし、 + 同様に HTTP リクエストに対して応答するように意図していない + 実行コードを、実行できるような権限を持つべきではないです。 + サーバを実行するために特定の新しいユーザとグループを + 設定することをお薦めいたします。 + nobody ユーザを使用する管理者もいますが、 + これが常に望ましいわけではありません。 + なぜなら nobody ユーザは、システムで + 他の役割を担っているかも知れないからです。

    + +

    セキュリティ

    +

    正確にどんなことをやっているのか、その危険性を知らないで、 + User (や Group) を root に + 設定しないでください。

    +
    + +

    perchild MPM では、異なるユーザ ID + で複数のバーチャルホストを動かすことを目的としていますが、 + User は、主サーバのユーザ ID + と、AssignUserID + ディレクティブを持たない <VirtualHost> セクションへの + フォールバックとを定義することになります。

    + +

    特記事項: このディレクティブを + <VirtualHost> + で使用することはサポートされなくなりました。 + suexec 向けにサーバを設定するのであれば、 + SuexecUserGroup + を使用してください。

    + +

    注意

    +

    User ディレクティブは + beos と mpmt_os2 MPM + にも存在しますが、実質的に無効で、互換性のためだけに存在します。

    +
    + +
    +
    +
    +

    Available Languages:  de  | + en  | + es  | + ja  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mpm_common.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/mpm_common.html.tr.utf8 new file mode 100644 index 00000000..d855d558 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mpm_common.html.tr.utf8 @@ -0,0 +1,905 @@ + + + +mpm_common - Apache HTTP Sunucusu + + + + + + +
    <-
    + +
    +

    Apache MPM Ortak Yönergeleri

    +
    +

    Mevcut Diller:  de  | + en  | + es  | + ja  | + tr 

    +
    + +
    Açıklama:Birden fazla Çok Süreçlilik Modülü (MPM) tarafından gerçeklenmiş + yönergeler bütünü.
    Durum:MPM
    +
    + + +
    top
    +

    AcceptMutex Yönergesi

    + + + + + + + +
    Açıklama:Apache HTTPd Sunucusunun ağ soketlerinden istekleri kabul eden + çok sayıda çocuk süreci sıraya sokmak için kullandığı yöntemi + belirler.
    Sözdizimi:AcceptMutex Default|yöntem
    Öntanımlı:AcceptMutex Default
    Bağlam:sunucu geneli
    Durum:MPM
    Modül:leader, perchild, prefork, threadpool, worker
    +

    AcceptMutex yönergesi Apache HTTPd Sunucusunun + ağ soketlerinden istekleri kabul eden çok sayıda çocuk süreci sıraya + sokmak için kullandığı yöntemi + belirler. Apache 2.0’dan önce, yöntem sadece derleme sırasında + seçilebiliyordu. Kullanılacak en uygun yöntem mimariye ve platforma aşırı + derecede bağımlıdır. Bu konuda daha ayrıntılı bilgi edinmek için Başarım Arttırma İpuçları belgesine + bakabilirsiniz.

    + +

    Bu yönergeye değer olarak Default belirtilmişse derleme + sırasında seçilen öntanımlı yöntem kullanılacaktır. Diğer olası yöntemler + aşağıda listelenmiştir. Tüm yöntemlerin tüm platformlarda mevcut + olmadığına dikkat ediniz. Eğer belirtilen yöntem mevcut değilse hata + günlüğüne mevcut yöntemlerin listesini içeren bir ileti yazılacaktır.

    + +
    +
    flock
    +
    LockFile yönergesi ile + belirtilen dosyayı kilitlemek için flock(2) sistem + çağrısı kullanılır.
    + +
    fcntl
    +
    LockFile yönergesi ile + belirtilen dosyayı kilitlemek için fcntl(2) sistem + çağrısı kullanılır.
    + +
    posixsem
    +
    Muteksleri gerçeklemek için POSIX uyumlu semaforlar kullanılır.
    + +
    pthread
    +
    POSIX Evreleri (PThreads) belirtimi tarafından gerçeklenen muteksler + kullanılır.
    + +
    sysvsem
    +
    Muteksleri gerçeklemek için SysV tarzı semaforlar kullanılır.
    +
    + +

    Sisteminiz için derleme sırasında seçilmiş öntanımlı yöntemi öğrenmek + isterseniz LogLevel yönergesine + debug değerini atayabilirsiniz. Öntanımlı AcceptMutex, ErrorLog + ile belirtilen günlük dosyasına yazılacaktır.

    + +
    +
    top
    +

    BS2000Account Yönergesi

    + + + + + + + +
    Açıklama:BS2000 makinelerde yetkisiz hesap tanımlar.
    Sözdizimi:BS2000Account account
    Bağlam:sunucu geneli
    Durum:MPM
    Modül:perchild, prefork
    Uyumluluk:Sadece BS2000 makineler içindir.
    +

    BS2000Account yönergesi sadece BS2000 + konaklar için kullanılabilir. User yönergesi ile belirtilen yetkisiz apache sunucu + kullanıcısı için hesap numarası tanımlamakta kullanılmalıdır. Buna, + CGI betiklerinin sunucu tarafından başlatılmış yetkili hesabın + (normal olarak SYSROOT’un) özkaynaklarına erişmesini + engellemek için BS2000 POSIX alt sistemleri tarafından gerek duyulur.

    + +

    Ek Bilgi

    +

    Sadece bir BS2000Account yönergesi kullanılabilir.

    +
    + +

    Ayrıca bakınız:

    + +
    +
    top
    +

    CoreDumpDirectory Yönergesi

    + + + + + + + +
    Açıklama:core dosyasını dökümlemek üzere Apache’nin geçmeye + çalışacağı dizin.
    Sözdizimi:CoreDumpDirectory dizin
    Öntanımlı:Öntanımlı değer için aşağıdaki açıklamaya bakınız
    Bağlam:sunucu geneli
    Durum:MPM
    Modül:beos, leader, mpm_winnt, perchild, prefork, threadpool, worker
    +

    Bu yönerge core dosyasını dökümlemek üzere Apache’nin + geçmeye çalışacağı dizini belirler. ServerRoot dizini öntanımlı dizin olmakla + birlikte, bu dizin kullanıcılar tarafından yazılabilir bir dizin + olmadığından bir core dosyası dökümlenmez. Hata ayıklama + amacıyla bir core dosyası dökümlemek isterseniz farklı bir + yer belirtmek için bu yönergeyi kullanabilirsiniz.

    + +

    Linux üzerinde core dökümlemek

    +

    Apache root olarak başlatılıp başka bir kullanıcıya geçilirse Linux + çekirdeği süreç tarafından yazılabilir olsa bile core + dökümlemeyi iptal eder. Eğer + CoreDumpDirectory yönergesi ile açıkça bir + dizin belirtirseniz, Apache (2.0.46 ve sonraki sürümleri), Linux 2.4 ve + sonrasında core dökümlemeyi yeniden + etkinleştirecektir.

    +
    + +
    +
    top
    +

    EnableExceptionHook Yönergesi

    + + + + + + + + +
    Açıklama:Bir çöküş sonrası olağandışılık eylemcilerini çalıştıracak + kancayı etkin kılar.
    Sözdizimi:EnableExceptionHook On|Off
    Öntanımlı:EnableExceptionHook Off
    Bağlam:sunucu geneli
    Durum:MPM
    Modül:leader, perchild, prefork, threadpool, worker
    Uyumluluk:Sürüm 2.0.49 ve sonrasında mevcuttur
    +

    Güvenlik sebebiyle bu yönerge sadece Apache + --enable-exception-hook seçeneği ile yapılandırılmışsa + kullanılabilir olacaktır. Bu, harici modüllerin eklenmesine ve bir çocuk + sürecin çöküşü sonrası bir şeyler yapmaya izin veren bir kancayı etkin + kılar.

    + +

    Bu kancayı kullanan iki modül (mod_whatkilledus ve + mod_backtrace) zaten vardır. bunlar hakkında daha fazla bilgi + edinmek için Jeff Trawick'in EnableExceptionHook sitesine bakabilirsiniz.

    + +
    +
    top
    +

    Group Yönergesi

    + + + + + + + + +
    Açıklama:İsteklere yanıt verecek sunucunun ait olacağı grubu belirler.
    Sözdizimi:Group unix-grubu
    Öntanımlı:Group #-1
    Bağlam:sunucu geneli
    Durum:MPM
    Modül:beos, leader, mpmt_os2, perchild, prefork, threadpool, worker
    Uyumluluk:Apache 2.0’dan itibaren sadece sunucu geneli için geçerlidir.
    +

    Group yönergesi, sunucunun hangi grup altında + isteklere yanıt vereceğini belirler. Bu yönergenin uygulanabilmesi için + sunucunun root olarak çalıştırılmış olması gerekir. + Sunucuyu root dışında bir kullanıcı başlattığı takdirde, + sunucu belirtilen gruba geçemez ve kullanıcının kendi grubunda + çalışmaya devam eder. unix-grubu şunlardan biri olabilir:

    + +
    +
    Bir grup adı
    +
    Gruba ismiyle başvurulur.
    + +
    # ardından grup numarası
    +
    Gruba numarası ile başvurulur.
    +
    + +

    Örnek

    + Group www-group +

    + +

    Çalışan sunucu için özellikle yeni bir grup atamanız önerilir. Bazı + sistem yöneticileri nobody grubunu kullanırlar fakat + bu her zaman mümkün olmadığı gibi arzulanan da değildir.

    + +

    Güvenlik

    +

    Ne yaptığınızı ve ne tehlikelere yol açacağınızı bilmiyorsanız + Group (veya User) yönergesine değer olarak + root atamayınız.

    +
    + +

    Özel bilgi: Bu yönergenin <VirtualHost> taşıyıcısı içinde kullanımı + artık desteklenmemektedir. Sunucunuzu suexec için + yapılandırırken SuexecUserGroup yönergesini + kullanınız.

    + +

    Ek Bilgi

    +

    Group yönergesi beos ve + mpmt_os2 MPM’lerinde mevcut olsa da, aslında + işlevsiz olup sadece uyumluluk adına mevcuttur.

    +
    + +
    +
    top
    +

    Listen Yönergesi

    + + + + + + + +
    Açıklama:Sunucunun dinleyeceği IP adresini ve portu belirler.
    Sözdizimi:Listen [IP-adresi:]port-numarası
    Bağlam:sunucu geneli
    Durum:MPM
    Modül:beos, leader, mpm_netware, mpm_winnt, mpmt_os2, perchild, prefork, threadpool, worker, event
    Uyumluluk:Apache 2.0’dan beri gerekli yönergelerden + biridir.
    +

    Listen yönergesi Apache’yi sadece belli IP + adreslerini ve portlarını dinlemeye sevkeder. + Listen artık belirtilmesi zorunlu yönergelerden + biridir. Yapılandırma dosyasında bulunmadığı takdirde sunucu + başlatılırken başarısız olacaktır. Bu Apache Sunucusunun önceki + sürümünde böyle değildi.

    + +

    Listen yönergesi Apache’ye, sadece belli + portlardan veya IP adresi ve port çiftlerinden gelen istekleri kabul + etmesini söyler. Eğer sadece port numarası belirtilmişse sunucu + belirtilen portu bütün ağ arabirimlerinde dinleyecektir. Eğer portla + birlikte bir IP adresi de belirtilmişse, sunucu belirtilen portu sadece + belirtilen arabirimden dinleyecektir.

    + +

    Çok sayıda IP adresi ve port belirtmek için çok sayıda + Listen yönergesi kullanılabilir. Sunucu bu + durumda belirtilen bütün IP adreslerinden ve portlardan gelecek + isteklere yanıt verecektir.

    + +

    Örneğin sunucunun hem port 80 hem de port 8000’den istek kabul etmesini + istiyorsanız bunu şöyle belirtebilirsiniz:

    + +

    + Listen 80
    + Listen 8000 +

    + +

    Sunucunun belirtilen iki ağ arabiriminden ve port numarasından gelen + bağlantıları kabul etmesi için şu yapılandırmayı kullanabilirsiniz:

    + +

    + Listen 192.170.2.1:80
    + Listen 192.170.2.5:8000 +

    + +

    IPv6 adresleri belirtilirken örnekteki gibi köşeli ayraçlar arasına + alınmalıdır:

    + +

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

    + +

    Hata durumu

    + Aynı IP adresi ve portun çok sayıda Listen + yönergesinde belirtilmesi bir "adres kullanımda" (Address already + in use) hatasına yol açar. +
    + +

    Ayrıca bakınız:

    + +
    +
    top
    +

    ListenBackLog Yönergesi

    + + + + + + + +
    Açıklama:Bekleyen bağlantılar kuyruğunun azami uzunluğunu + belirler
    Sözdizimi:ListenBacklog kuyruk-uzunluğu
    Öntanımlı:ListenBacklog 511
    Bağlam:sunucu geneli
    Durum:MPM
    Modül:beos, leader, mpm_netware, mpm_winnt, mpmt_os2, perchild, prefork, threadpool, worker
    +

    Bekleyen bağlantılar kuyruğunun azami uzunluğu. Genellikle bu ayar ne + gerekir ne de istenir. Ancak bazı sistemlerde TCP SYN yüklenme + saldırılarına karşı bu değerin arttırılması gerekebilir. + kuyruk-uzunluğu parametresi için listen(2) + işlevinin açıklamasına bakınız.

    + +

    Bu değer çoğunlukla işletim sistemi tarafından daha küçük bir sayıyla + sınırlanır. Bu, işletim sistemine bağlı olarak değişiklik gösterir. + Ayrıca, çoğu işletim sisteminin kuyruk-uzunluğu parametresi + ile ne belirttiğinize bakmaksızın kendisi için atanmış değeri (fakat + normal olarak daha büyüğünü) kullanacağına dikkat ediniz.

    + +
    +
    top
    +

    LockFile Yönergesi

    + + + + + + + +
    Açıklama:Apache HTTPd Sunucusunun ağ soketlerinden istekleri kabul eden + çok sayıda çocuk süreci sıraya sokarken kullandığı kilit dosyasının yerini + belirler.
    Sözdizimi:LockFile dosya
    Öntanımlı:LockFile logs/accept.lock
    Bağlam:sunucu geneli
    Durum:MPM
    Modül:leader, perchild, prefork, threadpool, worker
    +

    LockFile yönergesi, AcceptMutex yönergesi fcntl + veya flock değeri ile belirtildiği takdirde kullanılan + kilit dosyasının yerini belirler. Bu yönerge normalde öntanımlı + değeriyle bırakılır. Değişmesini gerektiren ana sebep, logs + dizininin ağ dosya sisteminde (NFS) yeralması halinde kilit + dosyasının bir yerel diskte saklanması gereğidir. Ana sürecin + süreç kimliği dosyaya kendiliğinden eklenir.

    + +

    Güvenlik

    +

    Bu dosyayı herkesin yazabildiği /var/tmp gibi bir dizine + koymaktan kaçınmak gerekir. Çünkü, bu takdirde, birileri sunucunun + hizmet sunmaya başlarken oluşturacağı kilit dosyası ile aynı isimde + bir dosya oluşturarak hizmet reddi saldırısı (DoS) başlatabilir.

    +
    + +

    Ayrıca bakınız:

    + +
    +
    top
    +

    MaxClients Yönergesi

    + + + + + + + +
    Açıklama:Aynı anda işleme sokulacak azami bağlantı sayısı
    Sözdizimi:MaxClients sayı
    Öntanımlı:Ayrıntılar için aşağıdaki açıklamaya bakınız.
    Bağlam:sunucu geneli
    Durum:MPM
    Modül:beos, leader, prefork, threadpool, worker
    +

    MaxClients yönergesi aynı anda işleme sokulacak + bağlantı sayısını sınırlamak için kullanılır. MaxClients bağlantı isteğinden fazlası geldiği takdirde bu + istekler normal olarak kuyruğa alınıp bekletilir. Kuyrukta bekletilecek + isteklerin azami sayısı ise ListenBacklog yönergesi ile belirlenir. İstek sunmakta olan + çocuk süreçlerden biri serbest kaldığında bekletilen bağlantılardan + birine hizmet sunulmaya başlanır.

    + +

    Evreli olmayan sunucularda (prefork gibi) + MaxClients yönergesi istekleri sunmak için + başlatılacak çocuk süreçlerin azami sayısını belirler. Öntanımlı değer + 256 olup bu değeri arttırmak isterseniz ServerLimit değerini de + arttırmalısınız.

    + +

    Çok evreli ve melez sunucularda (beos veya + worker gibi) MaxClients + yönergesi istemcilere hizmet verecek evre sayısını sınırlar. Öntanımlı + değer beos için 50 iken melez MPM’ler için + ServerLimit ile ThreadsPerChild çarpımıdır (16 x + 25). Bu bakımdan MaxClients değerini 16 + süreçten fazlasına ayarlamak için ServerLimit değerini de + arttırmalısınız.

    + +
    +
    top
    +

    MaxMemFree Yönergesi

    + + + + + + + +
    Açıklama:free() çağrılmaksızın ana bellek ayırıcının + ayırmasına izin verilen azami bellek miktarını belirler.
    Sözdizimi:MaxMemFree kB-sayısı
    Öntanımlı:MaxMemFree 0
    Bağlam:sunucu geneli
    Durum:MPM
    Modül:beos, leader, mpm_netware, prefork, threadpool, worker, mpm_winnt
    +

    MaxMemFree yönergesi, free() + çağrılmaksızın ana bellek ayırıcının ayırmasına izin verilen azami + bellek miktarını kB cinsinden belirler. Bir değerle belirtilmediğinde + veya 0 değeriyle belirtildiğinde eşik sınırsız + olacaktır.

    + +
    +
    top
    +

    MaxRequestsPerChild Yönergesi

    + + + + + + + +
    Açıklama:Tek bir çocuk sürecin ömrü boyunca işleme sokabileceği istek + sayısını sınırlamakta kullanılır.
    Sözdizimi:MaxRequestsPerChild sayı
    Öntanımlı:MaxRequestsPerChild 10000
    Bağlam:sunucu geneli
    Durum:MPM
    Modül:leader, mpm_netware, mpm_winnt, mpmt_os2, perchild, prefork, threadpool, worker
    +

    MaxRequestsPerChild yönergesi, tek bir çocuk + sürecin işleme sokabileceği istek sayısını sınırlamakta kullanılır. + MaxRequestsPerChild istekten sonra çocuk süreç + ölür. Eğer MaxRequestsPerChild için + 0 belirtilmişse sürecin ömrü sonsuz olacaktır.

    + +

    Sıfırdan farklı öntanımlı değerler

    +

    mpm_netware ve mpm_winnt için + öntanımlı değer 0’dır.

    +
    + +

    MaxRequestsPerChild için sıfırdan farklı bir + değer belirtilmesi sürecin kullanacağı bellek miktarını sınırlamak + suretiyle olası bellek sızıntılarını engeller.

    + +

    Ek Bilgi

    +

    KeepAlive isteklerinde sadece + ilk istek bu sınıra uygun sayılır. Etkisi ise, davranışın çocuk süreç + başına bağlantı sayısının sınırlanması şeklinde + değişmesidir.

    +
    + +
    +
    top
    +

    MaxSpareThreads Yönergesi

    + + + + + + + +
    Açıklama:Boştaki azami evre sayısını belirler
    Sözdizimi:MaxSpareThreads number
    Öntanımlı:Ayrıntılar için aşağıdaki açıklamaya bakınız.
    Bağlam:sunucu geneli
    Durum:MPM
    Modül:beos, leader, mpm_netware, mpmt_os2, perchild, threadpool, worker
    +

    Boştaki azami evre sayısı. Her MPM bu yönerge karşısında farklı + davranır.

    + +

    perchild için MaxSpareThreads 10 + öntanımlıdır. Bu MPM, boştaki evrelerin sayısını çocuk süreç başına + boştaki evre sayısı olarak izler. Bir çocukta çok fazla boşta evre + varsa sunucu sadece o çocuğun boştaki evrelerini öldürür.

    + +

    worker, leader ve + threadpool için MaxSpareThreads 250 + öntanımlıdır. Bu MPM’ler boştaki evreleri sunucu genelinde izler. Eğer + sunucuda çok fazla boşta evre varsa, sunucu boştaki evrelerin sayısı bu + sınırın altına inene kadar çocuk süreçleri öldürür.

    + +

    mpm_netware için MaxSpareThreads 100 + öntanımlıdır. Bu MPM tek bir süreç olarak çalıştığından boştaki evre + sayısı aynı zamanda sunucu genelinde boştaki evre sayısıdır.

    + +

    beos ve mpmt_os2 MPM’leri + mpm_netware gibidir. beos için + MaxSpareThreads 50 öntanımlıyken mpmt_os2 + için öntanımlı değer 10’dur.

    + +

    Kısıtlamalar

    +

    MaxSpareThreads için değer aralığı sınırlıdır. + Apache belirtilen değeri aşağıdaki kurallara uygun olarak + kendiliğinden düzeltecektir:

    + +
    + +

    Ayrıca bakınız:

    + +
    +
    top
    +

    MinSpareThreads Yönergesi

    + + + + + + + +
    Açıklama:İsteklerin ani artışında devreye girecek boştaki evrelerin asgari + sayısını belirler.
    Sözdizimi:MinSpareThreads number
    Öntanımlı:Ayrıntılar için aşağıdaki açıklamaya bakınız.
    Bağlam:sunucu geneli
    Durum:MPM
    Modül:beos, leader, mpm_netware, mpmt_os2, perchild, threadpool, worker
    +

    İsteklerin ani artışında devreye girecek boştaki evrelerin asgari + sayısı. Her MPM bu yönerge karşısında farklı davranır.

    + +

    perchild için MinSpareThreads 5 + öntanımlıdır ve çocuk süreç başına boştaki evre sayısını izler. Bir + çocuk için yeterince boşta evre yoksa sunucu bu çocuk için yeni evreler + oluşturmaya başlar. Nitekim, NumServers için 10 ve + MinSpareThreads için 5 atarsanız + sisteminizdeki boştaki evre sayısı en az 50 olur.

    + +

    worker, leader ve + threadpool modülleri için MinSpareThreads + 75 öntanımlıdır ve bu modüller boştaki evreleri sunucu genelinde + izler. Eğer sunucuda boştaki evre sayısı yetersizse, sunucu boştaki + evrelerin sayısı bu sınırın üstüne çıkana kadar çocuk süreç + oluşturur.

    + +

    mpm_netware için MinSpareThreads 10 + öntanımlıdır ve tek süreç kendisi olduğundan izleme sunucu genelinde + yapılır.

    + +

    beos ve mpmt_os2 modülleri + mpm_netware gibidir. beos için + MinSpareThreads 1 öntanımlı iken mpmt_os2 + için öntanımlı değer 5’tir.

    + +

    Ayrıca bakınız:

    + +
    +
    top
    +

    PidFile Yönergesi

    + + + + + + + +
    Açıklama:Ana sürecin süreç kimliğinin (PID) kaydedileceği dosyayı belirler.
    Sözdizimi:PidFile dosya
    Öntanımlı:PidFile logs/httpd.pid
    Bağlam:sunucu geneli
    Durum:MPM
    Modül:beos, leader, mpm_winnt, mpmt_os2, perchild, prefork, threadpool, worker
    +

    PidFile yönergesi, sunucunun artalan sürecinin + süreç kimliğinin kaydedileceği dosyayı belirler. Dosya ismi mutlak dosya + yoluyla belirtilmemişse dosya yolunun ServerRoot dizinine göre belirtildiği kabul + edilir.

    + +

    Örnek

    + PidFile /var/run/apache.pid +

    + +

    Sunucuya sinyal gönderebilmek çoğunlukla işe yarar. Böylece ErrorLog ve TransferLog dosyaları kapatılıp + yeniden açılır ve yapılandırma dosyaları yeniden okunur. Bu, + PidFile dosyasında belirtilen süreç kimliğine bir + SIGHUP (kill -1) sinyali gönderilerek yapılır.

    + +

    Günlük dosyasının yeri ve güvenlik ile ilgili + uyarılar PidFile dosyası içinde sözkonusu + olabilir.

    + +

    Ek Bilgi

    +

    Apache 2’de sunucuyu (yeniden) başlatırken veya durdururken sadece + apachectl betiğini kullanmanız önerilir.

    +
    + +
    +
    top
    +

    ReceiveBufferSize Yönergesi

    + + + + + + + +
    Açıklama:TCP alım tamponu boyu
    Sözdizimi:ReceiveBufferSize bayt-sayısı
    Öntanımlı:ReceiveBufferSize 0
    Bağlam:sunucu geneli
    Durum:MPM
    Modül:beos, leader, mpm_netware, mpm_winnt, mpmt_os2, perchild, prefork, threadpool, worker
    +

    Sunucu TCP alım tamponu boyunu bayt-sayısı ile belirtilen + bayta ayarlayacaktır.

    + +

    0 değeri atarsanız sunucu işletim sistemi öntanımlısını + kullanacaktır.

    + +
    +
    top
    +

    ScoreBoardFile Yönergesi

    + + + + + + + +
    Açıklama:Çocuk süreçler için eşgüdüm verisini saklamakta kullanılan + dosyanın yerini belirler.
    Sözdizimi:ScoreBoardFile dosya-yolu
    Öntanımlı:ScoreBoardFile logs/apache_status
    Bağlam:sunucu geneli
    Durum:MPM
    Modül:beos, leader, mpm_winnt, perchild, prefork, threadpool, worker
    +

    Apache ana ve çocuk süreçler arasında iletişim için bir çetele tutar. + Bazı mimariler bu iletişimi kolaylaştırmak için bir dosya gerektirir. + Eğer yönerge belirtilmezse Apache çeteleyi önce tamamen bellekte + oluşturmayı dener (anonim paylaşımlı bellek kullanarak); bunda başarılı + olamazsa dosyayı diskte oluşturmaya çalışacaktır (paylaşımlı belleğe + eşlemli dosya kullanarak). Bu yönergenin belirtilmesi Apache sunucusunun + dosyayı daima diskte oluşturmasına sebep olur.

    + +

    Örnek

    + ScoreBoardFile /var/run/apache_status +

    + +

    Paylaşımlı belleğe eşlemli dosya, çeteleye doğrudan erişmesi gereken + üçüncü parti uygulamalar için yararlıdır.

    + +

    Eğer ScoreBoardFile yönergesi ile bir dosya + belirtecekseniz, dosyayı bir RAM diske yerleştirerek hız artışı + sağlayabilirsiniz. Fakat, günlük dosyası yerleştirme ve güvenlik ile ilgili uyarılara + benzer uyarılara karşı dikkatli olunuz.

    + +

    Ayrıca bakınız:

    + +
    +
    top
    +

    SendBufferSize Yönergesi

    + + + + + + + +
    Açıklama:TCP tamponu boyu
    Sözdizimi:SendBufferSize bayt-sayısı
    Öntanımlı:SendBufferSize 0
    Bağlam:sunucu geneli
    Durum:MPM
    Modül:beos, leader, mpm_netware, mpm_winnt, mpmt_os2, perchild, prefork, threadpool, worker
    +

    Sunucu TCP gönderim tamponu boyunu bayt-sayısı ile + belirtilen bayta ayarlayacaktır. Yüksek hızlı yüksek yataklık süresi + için standart işletim sistemi öntanımlılarını arttırmak çok yararlıdır + (örneğin, kıtalar arası hızlı borularda olduğu gibi 100 ms + civarında).

    + +

    0 değeri atarsanız sunucu işletim sistemi öntanımlısını + kullanacaktır.

    + +
    +
    top
    +

    ServerLimit Yönergesi

    + + + + + + + +
    Açıklama:Ayarlanabilir süreç sayısının üst sınırını belirler.
    Sözdizimi:ServerLimit sayı
    Öntanımlı:Ayrıntılar için aşağıdaki açıklamaya bakınız.
    Bağlam:sunucu geneli
    Durum:MPM
    Modül:leader, perchild, prefork, threadpool, worker
    +

    prefork modülü söz konusu olduğunda bu yönerge, Apache + sürecinin ömrü boyunca MaxClients yönergesine atanabilecek + azami değeri belirler. worker modülü sözkonusu + olduğunda ise, Apache sürecinin ömrü boyunca MaxClients yönergesine atanabilecek + azami değeri ThreadLimit ile + birlikte belirler. Bu yönergeyi bir yeniden başlatma sırasında + değiştirirseniz bu değişiklik yok sayılır fakat MaxClients değişiklikleri dikkate + alınır.

    + +

    Bu yönergenin kullanılması özel bir dikkat gerektirir. Eğer + ServerLimit gereğinden yüksek bir değere + ayarlanırsa, gereksiz yere paylaşımlı bellek ayrılmış olur. Eğer + ServerLimit ve MaxClients değerleri sistemin + işleyebileceğinden daha yüksek değerlere ayarlanırsa Apache + başlayamayacağı gibi sistemi kararsız hale de getirebilir.

    + +

    Bu yönergeyi prefork modülü ile sadece MaxClients yönergesine 256’dan + (öntanımlı) daha büyük bir değer atayacaksanız kullanınız. Bu yönergeye + MaxClients için atamak + istediğiniz değerden fazlasını atamayınız.

    + +

    worker, leader ve + threadpool modülleri söz konusu olduğunda bu yönergeyi + MaxClients ve + ThreadsPerChild ayarları 16 + sunucu sürecinden (16 öntanımlıdır) fazlasını gerektiriyorsa + ayarlayınız. Bu yönergeye MaxClients + ve ThreadsPerChild için gerekli gördüğünüz + sunucu süreci sayısından fazlasını atamayınız.

    + +

    perchild modülüyle bu yönergeyi eğer NumServers yönergesine 8’den (öntanımlı) + büyük bir değer atayacaksanız kullanınız.

    + +

    Ek Bilgi

    +

    Sunucu içinde derlenmiş olarak ServerLimit 20000 + şeklinde bir zorlayıcı sınır vardır. Bu önlem, yazım hatalarının + istenmeyen sonuçlara yol açmasını engellemek için düşünülmüştür.

    +
    + +

    Ayrıca bakınız:

    + +
    +
    top
    +

    StartServers Yönergesi

    + + + + + + + +
    Açıklama:Sunucunun başlatılması sırasında oluşturulan çocuk süreçlerin + sayısını belirler.
    Sözdizimi:StartServers sayı
    Öntanımlı:Ayrıntılar için aşağıdaki açıklamaya bakınız.
    Bağlam:sunucu geneli
    Durum:MPM
    Modül:leader, mpmt_os2, prefork, threadpool, worker
    +

    StartServers yönergesi, sunucunun başlatılması + sırasında oluşturulan çocuk süreçlerin sayısını belirler. Süreç sayısı + normal olarak yüke bağlı olarak değişse de bu değerin ayarlanmasını + gerektirecek küçük bir sebep vardır.

    + +

    Öntanımlı değer MPM’den MPM’e fark eder. Öntanımlı değer + leader, threadpool ve + worker için 3 iken + prefork için 5 ve + mpmt_os2 için 2’dir.

    + +
    +
    top
    +

    StartThreads Yönergesi

    + + + + + + + +
    Açıklama:Sunucunun başlatılması sırasında oluşturulan evrelerin sayısını + belirler.
    Sözdizimi:StartThreads sayı
    Öntanımlı:Ayrıntılar için aşağıdaki açıklamaya bakınız.
    Bağlam:sunucu geneli
    Durum:MPM
    Modül:beos, mpm_netware, perchild
    +

    StartThreads yönergesi, sunucunun başlatılması + sırasında oluşturulan evrelerin sayısını belirler. Evre sayısı normal + olarak yüke bağlı olarak değişse de bu değerin ayarlanmasını + gerektirecek küçük bir sebep vardır.

    + +

    perchild için StartThreads 5 öntanımlı + olup bu yönerge sunucunun başlatılması sırasında oluşturulan süreç + başına evre sayısıyla bağlantısını sürdürür.

    + +

    mpm_netware için StartThreads 50 + öntanımlı olup, sadece tek bir süreç olduğundan, sunucunun başlatılması + sırasında oluşturulan evrelerin toplam sayısı 50’dir.

    + +

    beos için StartThreads 10 öntanımlı olup + sunucunun başlatılması sırasında oluşturulan evrelerin toplam sayısı + 10’dur.

    + +
    +
    top
    +

    ThreadLimit Yönergesi

    + + + + + + + + +
    Açıklama:Çocuk süreç başına ayarlanabilir evre sayısının üst sınırını + belirler.
    Sözdizimi:ThreadLimit sayı
    Öntanımlı:Ayrıntılar için aşağıdaki açıklamaya bakınız.
    Bağlam:sunucu geneli
    Durum:MPM
    Modül:leader, mpm_winnt, perchild, threadpool, worker
    Uyumluluk:mpm_winnt için Apache 2.0.41 ve sonrasında mevcuttur.
    +

    Bu yönerge, Apache sürecinin ömrü boyunca ThreadsPerChild yönergesine + atanabilecek azami değeri belirler. Bu yönergeyi bir yeniden başlatma + sırasında değiştirirseniz bu değişiklik yok sayılır fakat ThreadsPerChild değişiklikleri dikkate + alınır.

    + +

    Bu yönergenin kullanılması özel bir dikkat gerektirir. Eğer + ThreadLimit değeri ThreadsPerChild değerinden yüksek bir + değere ayarlanırsa, gereksiz yere paylaşımlı bellek ayrılmış olur. Eğer + ThreadLimit ve ThreadsPerChild değerleri sistemin + işleyebileceğinden daha yüksek değerlere ayarlanırsa Apache + başlayamayacağı gibi sistemi kararsız hale de getirebilir. Bu yönergeye + Apache sunucusunun çalışması için öngörülmüş en büyük değerden daha + yükseğini atamayınız.

    + +

    ThreadLimit yönergesinin öntanımlı değeri + mpm_winnt için 1920, diğerleri için + 64’tür.

    + +

    Ek Bilgi

    +

    Sunucu içinde derlenmiş olarak ThreadLimit 20000 + şeklinde bir zorlayıcı sınır vardır (mpm_winnt için + 15000’dir). Bu önlem, yazım hatalarının istenmeyen sonuçlara yol + açmasını engellemek için düşünülmüştür.

    +
    + +
    +
    top
    +

    ThreadsPerChild Yönergesi

    + + + + + + + +
    Açıklama:Her çocuk süreç tarafından oluşturulan evrelerin sayısını + belirler.
    Sözdizimi:ThreadsPerChild sayı
    Öntanımlı:Ayrıntılar için aşağıdaki açıklamaya bakınız.
    Bağlam:sunucu geneli
    Durum:MPM
    Modül:leader, mpm_winnt, threadpool, worker
    +

    Bu yönerge, her çocuk süreç tarafından oluşturulan evrelerin sayısını + belirler. Çocuk süreçler bu evreleri başlatıldıklarında oluştururlar ve + bundan daha fazlasını asla oluşturmazlar. mpm_winnt + gibi sadece bir çocuk sürecin bulunduğu bir MPM kullanıyorsanız, bu + sayı sunucunun tüm yükünü kaldırabilecek kadar büyük olmalıdır. + worker gibi çok çocuk süreçli bir MPM kullanıyorsanız, + toplam evre sayısı sunucunun tüm yükünü kaldırabilecek kadar + büyük olmalıdır.

    + +

    ThreadsPerChild için öntanımlı değer + mpm_winnt kullanıldığında 64 diğerleri + için 25’tir.

    + +
    +
    top
    +

    User Yönergesi

    + + + + + + + + +
    Açıklama:İsteklere yanıt verecek sunucunun ait olacağı kullanıcıyı + belirler.
    Sözdizimi:User unix-kullanıcısı
    Öntanımlı:User #-1
    Bağlam:sunucu geneli
    Durum:MPM
    Modül:leader, perchild, prefork, threadpool, worker
    Uyumluluk:Apache 2.0’dan itibaren sadece sunucu geneli için + geçerlidir.
    +

    User yönergesi, sunucunun hangi kullanıcı olarak + isteklere yanıt vereceğini belirler. Bu yönergenin uygulanabilmesi için + sunucunun root olarak çalıştırılmış olması gerekir. + Sunucuyu root dışında bir kullanıcı başlattığı takdirde, + sunucu belirtilen kullanıcıya geçemez ve mevcut kullanıcıyla çalışmaya + devam eder. Eğer sunucuyu root olarak başlatmışsanız ana + süreç root olarak çalışmaya devam edecektir. unix-kullanıcısı + şunlardan biri olabilir:

    + +
    +
    Bir kullanıcı adı
    +
    Gruba ismiyle başvurulur.
    + +
    # ardından kullanıcı numarası
    +
    Kullanıcıya numarası ile başvurulur.
    +
    + +

    Bu yönergede belirtilecek kullanıcının, başkaları tarafından üzerinde + değişiklik yapılabilecek dosyalardan başkasına erişemeyen bir kullanıcı + olmaması gerektiği gibi, HTTP isteklerini işlemek dışında işlemler de + yapabilen bir kullanıcı olmamalıdır. + Çalışan sunucu için özellikle yeni bir grup atamanız önerilir. Bazı + sistem yöneticileri nobody kullanıcısını kullanırlar fakat + nobody kullanıcısı sistemde başka amaçlarla + kullanılabildiğinden bu her zaman mümkün olmadığı gibi arzulanan da + değildir.

    + +

    Güvenlik

    +

    Ne yaptığınızı ve ne tehlikelere yol açacağınızı bilmiyorsanız + User (veya Group) yönergesine değer olarak + root atamayınız.

    +
    + +

    Sanal konakları farklı kullanıcı kimliklerle çalıştırmak üzere + tasarlanan perchild modülü kullanıldığında <VirtualHost> bölümlerinde + AssignUserID yönergesi ile + farklı bir kullanıcı kimlik tanımlanmadığı takdirde + User yönergesi ile ana sunucu için tanımlanan + kullanıcı kimlik sanal konak için de geçerli olur.

    + +

    Özel bilgi: Bu yönergenin <VirtualHost> taşıyıcısı içinde kullanımı + artık desteklenmemektedir. Sunucunuzu suexec için + yapılandırırken SuexecUserGroup yönergesini + kullanınız.

    + +

    Ek Bilgi

    +

    Useryönergesi beos ve + mpmt_os2 MPM’lerinde mevcut olsa da, aslında + işlevsiz olup sadece uyumluluk adına mevcuttur.

    +
    + +
    +
    +
    +

    Mevcut Diller:  de  | + en  | + es  | + ja  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mpm_netware.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mpm_netware.html new file mode 100644 index 00000000..4b973d16 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mpm_netware.html @@ -0,0 +1,5 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mpm_netware.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mpm_netware.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mpm_netware.html.en new file mode 100644 index 00000000..87d173b6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mpm_netware.html.en @@ -0,0 +1,125 @@ + + + +mpm_netware - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache MPM netware

    +
    +

    Available Languages:  en 

    +
    + + + +
    Description:Multi-Processing Module implementing an exclusively threaded web + server optimized for Novell NetWare
    Status:MPM
    Module Identifier:mpm_netware_module
    Source File:mpm_netware.c
    +

    Summary

    + +

    This Multi-Processing Module (MPM) implements an exclusively + threaded web server that has been optimized for Novell + NetWare.

    + +

    The main thread is responsible for launching child + worker threads which listen for connections and serve them when they + arrive. Apache always tries to maintain several spare + or idle worker threads, which stand ready to serve incoming + requests. In this way, clients do not need to wait for a new + child threads to be spawned before their requests can be + served.

    + +

    The StartThreads, + MinSpareThreads, + MaxSpareThreads, and + MaxThreads + regulate how the main thread creates worker threads to serve + requests. In general, Apache is very self-regulating, so most + sites do not need to adjust these directives from their default + values. Sites with limited memory may need to decrease MaxThreads to keep the server from + thrashing (spawning and terminating idle threads). More information + about tuning process creation is provided in the performance hints + documentation.

    + +

    MaxRequestsPerChild + controls how frequently the server recycles processes by killing old + ones and launching new ones. On the NetWare OS it is highly + recommended that this directive remain set to 0. This allows worker + threads to continue servicing requests indefinitely.

    +
    + + +
    top
    +

    MaxThreads Directive

    + + + + + + + +
    Description:Set the maximum number of worker threads
    Syntax:MaxThreads number
    Default:MaxThreads 2048
    Context:server config
    Status:MPM
    Module:mpm_netware
    +

    The MaxThreads directive sets the desired + maximum number worker threads allowable. The default value is + also the compiled in hard limit. Therefore it can only be lowered, + for example:

    + +

    + MaxThreads 512 +

    + +
    +
    top
    +

    ThreadStackSize Directive

    + + + + + + + +
    Description:Determine the stack size for each thread
    Syntax:ThreadStackSize number
    Default:ThreadStackSize 65536
    Context:server config
    Status:MPM
    Module:mpm_netware
    +

    This directive tells the server what stack size to use for + each of the running threads. If you ever get a stack overflow + you will need to bump this number to a higher setting.

    + +
    +
    +
    +

    Available Languages:  en 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mpm_winnt.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mpm_winnt.html new file mode 100644 index 00000000..319084ba --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mpm_winnt.html @@ -0,0 +1,17 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mpm_winnt.html.de +Content-Language: de +Content-type: text/html; charset=ISO-8859-1 + +URI: mpm_winnt.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: mpm_winnt.html.es +Content-Language: es +Content-type: text/html; charset=ISO-8859-1 + +URI: mpm_winnt.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mpm_winnt.html.de b/rubbos/app/httpd-2.0.64/docs/manual/mod/mpm_winnt.html.de new file mode 100644 index 00000000..4875b953 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mpm_winnt.html.de @@ -0,0 +1,95 @@ + + + +mpm_winnt - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache-MPM winnt

    +
    +

    Verfügbare Sprachen:  de  | + en  | + es  | + ja 

    +
    + + + +
    Beschreibung: Das Multi-Processing-Modul ist optimiert für + Windows NT.
    Status:MPM
    Modulbezeichner:mpm_winnt_module
    Quelltext-Datei:mpm_winnt.c
    +

    Zusammenfassung

    + +

    Dieses Multi-Processing-Modul (MPM) ist die Voreinstellung + für das Betriebssystem Windows NT. Es verwendet einen einzelnen + Steuerprozess, der einen einzelnen Kindprozess startet, welcher + wiederum Threads zur Bedienung von Anfragen erstellt.

    +
    + + +
    top
    +

    Win32DisableAcceptEx-Direktive

    + + + + + + + + +
    Beschreibung:Für die Annahme von Netzwerkverbindungen wird accept() anstelle von AcceptEx() verwendet
    Syntax:Win32DisableAcceptEx
    Voreinstellung:AcceptEx() ist standardmäßig aktiviert. Verwenden Sie diese +Direktive, um den Gebrauch von AcceptEx() zu deaktivieren.
    Kontext:Serverkonfiguration
    Status:MPM
    Modul:mpm_winnt
    Kompatibilität:Verfügbar ab Version 2.0.49
    +

    AcceptEx() ist eine Schnittstelle zu Microsoft Winsock v2, + die unter bestimmten Umständen einige Leistungsverbesserungen + gegenüber der accept()-API von BSD bietet. Einige beliebte + Windows-Produkte, typischerweise Virenscanner oder VPN-Pakete, besitzen + jedoch Fehler, welche den einwandfreien Betrieb von AcceptEx() + stören. Wenn Sie einen Fehler wie:

    + +

    + [error] (730038)An operation was attempted on something that is + not a socket.: winnt_accept: AcceptEx failed. Attempting to recover. +

    + +

    erhalten, sollten Sie diese Direktive verwenden, um den Gebrauch von + AcceptEx() zu unterbinden.

    + +
    +
    +
    +

    Verfügbare Sprachen:  de  | + en  | + es  | + ja 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mpm_winnt.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mpm_winnt.html.en new file mode 100644 index 00000000..2fe960c4 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mpm_winnt.html.en @@ -0,0 +1,95 @@ + + + +mpm_winnt - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache MPM winnt

    +
    +

    Available Languages:  de  | + en  | + es  | + ja 

    +
    + + + +
    Description:This Multi-Processing Module is optimized for Windows +NT.
    Status:MPM
    Module Identifier:mpm_winnt_module
    Source File:mpm_winnt.c
    +

    Summary

    + +

    This Multi-Processing Module (MPM) is the default for the + Windows NT operating systems. It uses a single control process + which launches a single child process which in turn creates + threads to handle requests

    +
    + + +
    top
    +

    Win32DisableAcceptEx Directive

    + + + + + + + + +
    Description:Use accept() rather than AcceptEx() to accept network connections
    Syntax:Win32DisableAcceptEx
    Default:AcceptEx() is enabled by default. Use this directive to disable use of + AcceptEx()
    Context:server config
    Status:MPM
    Module:mpm_winnt
    Compatibility:Available in Version 2.0.49 and later
    +

    AcceptEx() is a Microsoft WinSock v2 API that provides + some performance improvements over the use of the BSD style + accept() API in certain circumstances. Some popular Windows + products, typically virus scanning or virtual private network + packages, have bugs that interfere with the proper operation of + AcceptEx(). If you encounter an error condition like:

    + +

    + [error] (730038)An operation was attempted on something that is + not a socket.: winnt_accept: AcceptEx failed. Attempting to recover. +

    + +

    you should use this directive to disable the use of + AcceptEx().

    + +
    +
    +
    +

    Available Languages:  de  | + en  | + es  | + ja 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mpm_winnt.html.es b/rubbos/app/httpd-2.0.64/docs/manual/mod/mpm_winnt.html.es new file mode 100644 index 00000000..e2a0cb0a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mpm_winnt.html.es @@ -0,0 +1,99 @@ + + + +mpm_winnt - Servidor HTTP Apache + + + + + + +
    <-
    + +
    +

    MPM de Apache winnt

    +
    +

    Idiomas disponibles:  de  | + en  | + es  | + ja 

    +
    +
    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.
    + + + +
    Descripción:Módulo de multiprocesamiento optimizado para Windows +NT.
    Estado:MPM
    Identificador de Módulos:mpm_winnt_module
    Fichero de Código Fuente:mpm_winnt.c
    +

    Resumen de contenidos

    + +

    Este módulo de multiprocesamiento (MPM) es el que viene por + defecto para los sitemas operativos Windows NT. Crea un solo + proceso de control que crea un solo proceso hijo que a su vez crea + hebras para atender las peticiones que se produzcan.

    +
    + + +
    top
    +

    Win32DisableAcceptEx Directiva

    + + + + + + + + +
    Descripción:Usa accept() en lugar de AcceptEx() para aceptar +conexiones de red
    Sintaxis:Win32DisableAcceptEx
    Valor por defecto:AcceptEx() está activado por defecto. Use esta directiva para desactivarlo
    Contexto:server config
    Estado:MPM
    Módulo:mpm_winnt
    Compatibilidad:Disponible en las versiones 2.0.49 y posteriores
    +

    AcceptEx() es una API WinSock v2 de Microsoft que + ofrece algunas mejoras en el rendimiento sobre la API + accept() de tipo BSD bajo ciertas + condiciones. Algunos productos populares de Microsoft, sobre todo + antivirus o aplicaciones para implemetar redes privadas virtuales, + tienen errores de programación que interfieren con el + funcionamiento de AcceptEx(). Si se encuentra con un + mensaje de error parecido a este:

    + +

    + [error] (730038)An operation was attempted on something that is + not a socket.: winnt_accept: AcceptEx failed. Attempting to recover. +

    + +

    debe usar esta directiva para desactivar el uso de AcceptEx().

    + +
    +
    +
    +

    Idiomas disponibles:  de  | + en  | + es  | + ja 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mpm_winnt.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/mpm_winnt.html.ja.utf8 new file mode 100644 index 00000000..d232f06e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mpm_winnt.html.ja.utf8 @@ -0,0 +1,94 @@ + + + +mpm_winnt - Apache HTTP サーバ + + + + + + +
    <-
    + +
    +

    Apache MPM winnt

    +
    +

    Available Languages:  de  | + en  | + es  | + ja 

    +
    +
    This translation may be out of date. Check the + English version for recent changes.
    + + + +
    説明:Windows NT +向けに最適化されたマルチプロセッシングモジュール
    ステータス:MPM
    モジュール識別子:mpm_winnt_module
    ソースファイル:mpm_winnt.c
    +

    概要

    + +

    このマルチプロセッシングモジュール (MPM) + は Windows NT でのデフォルトになります。 + 一つの制御用プロセスを用い、これが一つの子プロセスを起動し、 + そして子プロセスがリクエストを取り扱うためにスレッドを + 起動します。

    +
    + + +
    top
    +

    Win32DisableAcceptEx ディレクティブ

    + + + + + + + + +
    説明:ネットワーク接続の受け付けに accept() をAcceptEx の代わりに使う
    構文:Win32DisableAcceptEx
    デフォルト:AcceptEx() はデフォルトで有効になっています。AcceptEx() を無効にする +ためにこのディレクティブを使います。
    コンテキスト:サーバ設定ファイル
    ステータス:MPM
    モジュール:mpm_winnt
    互換性:2.0.49 バージョン以降で使用可能
    +

    AcceptEx() は Microsoft WinSock v2 API で、場合によっては + BSD 形式の accept() API よりもよい性能を発揮します。 + よく使われている Windows 製品の中で、特にウィルススキャナや VPN パッケージ + の中には、バグが原因で AcceptEx() の適切な動作を妨げるものがあります。 + 以下のようなエラーに遭遇した場合は、このディレクティブを使用して + AcceptEx() を使用しないようにしてください。

    + +

    + [error] (730038)An operation was attempted on something that is + not a socket.: winnt_accept: AcceptEx failed. Attempting to recover. +

    + +
    +
    +
    +

    Available Languages:  de  | + en  | + es  | + ja 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mpmt_os2.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/mpmt_os2.html new file mode 100644 index 00000000..eb0b883e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mpmt_os2.html @@ -0,0 +1,5 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mpmt_os2.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/mpmt_os2.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/mpmt_os2.html.en new file mode 100644 index 00000000..49f2c47e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/mpmt_os2.html.en @@ -0,0 +1,73 @@ + + + +mpmt_os2 - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache MPM os2

    +
    +

    Available Languages:  en 

    +
    + + + +
    Description:Hybrid multi-process, multi-threaded MPM for OS/2
    Status:MPM
    Module Identifier:mpm_mpmt_os2_module
    Source File:mpmt_os2.c
    +

    Summary

    + +

    The Server consists of a main, parent process and a small, static + number of child processes.

    + +

    The parent process's job is to manage the child processes. This + involves spawning children as required to ensure there are always + StartServers processes + accepting connections.

    + +

    Each child process consists of a a pool of worker threads and a + main thread that accepts connections and passes them to the workers via + a work queue. The worker thread pool is dynamic, managed by a + maintenance thread so that the number of idle threads is kept between + MinSpareThreads and + MaxSpareThreads.

    +
    + + +
    +
    +

    Available Languages:  en 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/perchild.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/perchild.html new file mode 100644 index 00000000..97510794 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/perchild.html @@ -0,0 +1,5 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: perchild.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/perchild.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/perchild.html.en new file mode 100644 index 00000000..3d557add --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/perchild.html.en @@ -0,0 +1,266 @@ + + + +perchild - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache MPM perchild

    +
    +

    Available Languages:  en 

    +
    + + + +
    Description:Multi-Processing Module allowing for daemon processes serving +requests to be assigned a variety of different userids
    Status:MPM
    Module Identifier:mpm_perchild_module
    Source File:perchild.c
    +

    Summary

    + +
    + This module is not functional. Development of this module is not + complete and is not currently active. Do not use + perchild unless you are a programmer willing to + help fix it. +
    + +

    This Multi-Processing Module (MPM) implements a hybrid + multi-process, multi-threaded web server. A fixed number of + processes create threads to handle requests. Fluctuations in + load are handled by increasing or decreasing the number of + threads in each process.

    +
    + +
    top
    +
    +

    How it works

    +

    A single control process launches the number of child processes + indicated by the NumServers + directive at server startup. Each child process creates threads as + specified in the StartThreads directive. + The individual threads then + listen for connections and serve them when they arrive.

    + +

    Apache always tries to maintain a pool of spare or + idle server threads, which stand ready to serve incoming + requests. In this way, clients do not need to wait for new + threads to be created. For each child process, Apache assesses + the number of idle threads and creates or destroys threads to + keep this number within the boundaries specified by + MinSpareThreads + and MaxSpareThreads. + Since this process is very self-regulating, it is rarely + necessary to modify these directives from their default values. + The maximum number of clients that may be served simultaneously + is determined by multiplying the number of server processes + that will be created (NumServers) by the maximum + number of threads created in each process + (MaxThreadsPerChild).

    + +

    While the parent process is usually started as root under + Unix in order to bind to port 80, the child processes and + threads are launched by Apache as a less-privileged user. The + User and Group directives are used to + set the privileges of the Apache child processes. The child + processes must be able to read all the content that will be + served, but should have as few privileges beyond that as + possible. In addition, unless suexec is used, + these directives also set the privileges which will be inherited + by CGI scripts.

    + +

    MaxRequestsPerChild + controls how frequently the + server recycles processes by killing old ones and launching new + ones.

    + +

    Working with different user-IDs

    +

    The perchild MPM adds the extra ability to + specify that particular processes should serve requests under + different user-IDs. These user-IDs can then be associated with + specific virtual hosts. You have to use one ChildPerUserID directive for + every user/group combination you want to be run. Then you can tie + particular virtual hosts to that user and group IDs.

    + +

    The following example runs 7 child processes. Two of them are run + under user1/group1. The next four are run + under user2/group2 and the remaining + process uses the User and Group + of the main server:

    + +

    Global config

    + NumServers 7
    + ChildPerUserID user1 group1 2
    + ChildPerUserID user2 group2 4 +

    + +

    Using unbalanced numbers of processes as above is useful, if the + particular virtual hosts produce different load. The assignment to + the virtual hosts is easily done as in the example below. In + conclusion with the example above the following assumes, that + server2 has to serve about twice of the hits of + server1.

    + +

    Example

    + NameVirtualHost *
    +
    + <VirtualHost *>
    + + ServerName fallbackhost
    + # no assignment; use fallback
    +
    + </VirtualHost>
    +
    + <VirtualHost *>
    + + ServerName server1
    + AssignUserID user1 group1
    +
    + </VirtualHost>
    +
    + <VirtualHost *>
    + + ServerName server2
    + AssignUserID user2 group2
    +
    + </VirtualHost> +

    + +
    +
    top
    +

    AssignUserID Directive

    + + + + + + +
    Description:Tie a virtual host to a user and group ID
    Syntax:AssignUserID user-id group-id
    Context:virtual host
    Status:MPM
    Module:perchild
    +

    Tie a virtual host to a specific user/group combination. Requests + addressed to the virtual host where this directive appears will be + served by a process running with the specified user and group ID.

    + +

    The user and group ID has to be assigned to a number of children + in the global server config using the ChildPerUserID directive. See the section above for a + configuration example.

    + +
    +
    top
    +

    ChildPerUserID Directive

    + + + + + + +
    Description:Specify user ID and group ID for a number of child +processes
    Syntax:ChildPerUserID user-id group-id +num-children
    Context:server config
    Status:MPM
    Module:perchild
    +

    Specify a user ID and group ID for a number of child processes. + The third argument, num-children, is the number of child + processes to start with the specified user and group. It does + not represent a specific child number. In order to use this + directive, the server must be run initially as root. + If you start the server as a non-root user, it will fail to change + to the lesser privileged user.

    + +

    If the total number of child processes, found by totaling all of the + third arguments to all ChildPerUserID directives + in the config file, is less than NumServers, then all remaining children will inherit the + User and Group settings from the main server. + See the section above for a configuration + example.

    + +

    Security

    +

    Don't set user-id (or group-id) to + root unless you know exactly what you are doing, and + what the dangers are.

    +
    + +
    +
    top
    +

    MaxThreadsPerChild Directive

    + + + + + + + +
    Description:Maximum number of threads per child process
    Syntax:MaxThreadsPerChild number
    Default:MaxThreadsPerChild 64
    Context:server config
    Status:MPM
    Module:perchild
    +

    This directive sets the maximum number of threads that will be + created in each child process. To increase this value beyond its + default, it is necessary to change the value of the ThreadLimit directive and stop and + re-start the server.

    + +
    +
    top
    +

    NumServers Directive

    + + + + + + + +
    Description:Total number of children alive at the same time
    Syntax:NumServers number
    Default:NumServers 2
    Context:server config
    Status:MPM
    Module:perchild
    +

    The NumServers directive determines the number + of children alive at the same time. This number should be large enough to + handle the requests for the entire site. To increase this value beyond the + value of 8, it is necessary to change the value of the + ServerLimit directive and stop + and re-start the server. See the section above for a configuration example.

    + +
    +
    +
    +

    Available Languages:  en 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/prefork.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/prefork.html new file mode 100644 index 00000000..80d3eeb8 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/prefork.html @@ -0,0 +1,21 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: prefork.html.de +Content-Language: de +Content-type: text/html; charset=ISO-8859-1 + +URI: prefork.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: prefork.html.es +Content-Language: es +Content-type: text/html; charset=ISO-8859-1 + +URI: prefork.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: prefork.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/prefork.html.de b/rubbos/app/httpd-2.0.64/docs/manual/mod/prefork.html.de new file mode 100644 index 00000000..23ab48e4 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/prefork.html.de @@ -0,0 +1,195 @@ + + + +prefork - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache-MPM prefork

    +
    +

    Verfügbare Sprachen:  de  | + en  | + es  | + ja  | + tr 

    +
    + + + +
    Beschreibung:Implementiert einen im Voraus forkenden Webserver ohne + Thread-Unterstützung
    Status:MPM
    Modulbezeichner:mpm_prefork_module
    Quelltext-Datei:prefork.c
    +

    Zusammenfassung

    + +

    Dieses Multi-Processing-Modul (MPM) implementiert einen + im Voraus forkenden Webserver ohne Thread-Unterstützung, der Anfragen + auf ähnliche Weise behandelt wie der Apache 1.3. Es ist für + Angebote geeignet, die aus Kompatibilitätsgründen mit + nicht-Thread-sicheren Bibliotheken Threading vermeiden müssen. + Es ist außerdem das geeignetste MPM, um jede Anfrage isoliert + zu bearbeiten, so dass Probleme mit einem einzelnen Prozess keinen + anderen beeinflussen.

    + +

    Das MPM ist stark selbstregulierend, so dass es selten + notwendig ist, seine Konfigurationseinstellungen zu justieren. Das + Wichtigste ist, dass MaxClients + gross genug ist, so viele gleichzeitige Anfragen zu bedienen, wie Sie + erwarten, aber klein genug, um sicherzustellen, dass genug physischer + Arbeitsspeicher für alle Prozesse vorhanden ist.

    +
    + +
    top
    +
    +

    Arbeitsweise

    +

    Ein einzelner Steuerprozess ist für den Start von + Kindprozessen verantwortlich, die auf Verbindungen warten und diese + bedienen, sobald sie eintreffen. Der Apache versucht immer, mehrere + freie oder unbeschäftigte Serverprozesse vorzuhalten, + die zur Bedienung eingehender Anfragen bereit stehen. Auf diese Weise + müssen Clients nicht darauf warten, dass neue Kindprozesse + geforkt werden, bevor ihre Anfrage bearbeitet werden kann.

    + +

    StartServers, + MinSpareServers, + MaxSpareServers und + MaxClients regulieren, + wie der Elternprozess Kindprozesse zur Bedienung von Anfragen erstellt. + Im Allgemeinen ist der Apache sehr selbstregulierend, so dass die meisten + Angebote die Voreinstellung dieser Direktiven nicht verändern + müssen. Systeme, die mehr als 256 gleichzeitige Anfragen bedienen + müssen, können MaxClients erhöhen, während + Systeme mit begrenztem Arbeitsspeicher möglicherweise + MaxClients heruntersetzen + müssen, um den Server vor Flatterverhalten (Arbeitsspeicherinhalte auf + Platte auslagern - und zurück) zu schützen. Weitere + Informationen zur Feinabstimmung der Prozesserstellung sind in den + Performance-Hinweisen zu + finden.

    + +

    Währen der Elternprozess unter Unix normalerweise als + root gestartet wird, um sich an Port 80 binden zu können, + werden die Kindprozesse unter einem weniger privilegierten Benutzer + gestartet. Die Direktiven User + und Group werden dazu + verwendet, die Privilegien der Apache-Kindprozesse festzulegen. Die + Kindprozesse müssen in der Lage sein, alle Inhalte zu lesen, die + sie ausliefern sollen, sollten darüber hinaus jedoch so wenig wie + möglich Rechte besitzen.

    + +

    MaxRequestsPerChild + bestimmt, wie häufig der Server Prozesse erneuert, indem er alte + beendet und neue startet.

    +
    +
    top
    +

    MaxSpareServers-Direktive

    + + + + + + + +
    Beschreibung:Maximale Anzahl der unbeschäftigten Kindprozesse des + Servers
    Syntax:MaxSpareServers Anzahl
    Voreinstellung:MaxSpareServers 10
    Kontext:Serverkonfiguration
    Status:MPM
    Modul:prefork
    +

    Die Direktive MaxSpareServers bestimmt das + gewünschte Maximum an unbeschäftigten + Kindprozessen des Servers. Ein unbeschäftiger Prozess ist einer, der + keine Anfrage bedient. Wenn mehr als MaxSpareServers + Prozesse unbeschäftigt sind, wird der Elternprozess die + überschüssigen Prozesse beenden.

    + +

    Eine Feineinstellung dieses Parameters sollte nur bei sehr + beschäftigten Angeboten notwendig sein. Es ist nahezu immer eine + schlechte Idee, den Parameter auf einen hohen Wert zu setzen. Wenn Sie + versuchen, den Wert niedriger als MinSpareServers zu setzen, wird der Apache + ihn automatisch auf MinSpareServers + 1 korrigieren.

    + +

    Siehe auch

    + +
    +
    top
    +

    MinSpareServers-Direktive

    + + + + + + + +
    Beschreibung:Minimale Anzahl der unbeschäftigten Kindprozesse des + Servers
    Syntax:MinSpareServers Anzahl
    Voreinstellung:MinSpareServers 5
    Kontext:Serverkonfiguration
    Status:MPM
    Modul:prefork
    +

    Die Direktive MinSpareServers bestimmt das + gewünschte Minimum der unbeschäftigten + Kindprozesse des Servers. Ein unbeschäftigter Prozess ist einer, der + keine Anfrage bedient. Wenn weniger als + MinSpareServers Prozesse unbeschäftigt sind, + dann erstellt der Elternprozess neue mit einer maximalen Rate von 1 + pro Sekunde.

    + +

    Die Feineinstellung des Parameters sollte nur bei sehr + beschäftigten Angeboten notwendig sein. Es ist nahezu immer eine + schlechte ide, den Parameter auf einen hohen Wert zu setzen.

    + +

    Siehe auch

    + +
    +
    +
    +

    Verfügbare Sprachen:  de  | + en  | + es  | + ja  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/prefork.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/prefork.html.en new file mode 100644 index 00000000..127eb9e5 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/prefork.html.en @@ -0,0 +1,181 @@ + + + +prefork - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache MPM prefork

    +
    +

    Available Languages:  de  | + en  | + es  | + ja  | + tr 

    +
    + + + +
    Description:Implements a non-threaded, pre-forking web server
    Status:MPM
    Module Identifier:mpm_prefork_module
    Source File:prefork.c
    +

    Summary

    + +

    This Multi-Processing Module (MPM) implements a non-threaded, + pre-forking web server that handles requests in a manner similar + to Apache 1.3. It is appropriate for sites that need to avoid + threading for compatibility with non-thread-safe libraries. It + is also the best MPM for isolating each request, so that a problem + with a single request will not affect any other.

    + +

    This MPM is very self-regulating, so it is rarely necessary to + adjust its configuration directives. Most important is that + MaxClients be big enough to + handle as many simultaneous requests as you expect to receive, but + small enough to assure that there is enough physical RAM for all + processes.

    +
    + +
    top
    +
    +

    How it Works

    +

    A single control process is responsible for launching child + processes which listen for connections and serve them when they + arrive. Apache always tries to maintain several spare + or idle server processes, which stand ready to serve incoming + requests. In this way, clients do not need to wait for a new + child processes to be forked before their requests can be + served.

    + +

    The StartServers, + MinSpareServers, + MaxSpareServers, and + MaxClients regulate how + the parent process creates children to serve requests. In general, + Apache is very self-regulating, so most sites do not need to + adjust these directives from their default values. Sites which + need to serve more than 256 simultaneous requests may need to + increase MaxClients, + while sites with limited memory may need to decrease MaxClients to keep the server from + thrashing (swapping memory to disk and back). More information + about tuning process creation is provided in the performance hints + documentation.

    + +

    While the parent process is usually started as root + under Unix in order to bind to port 80, the child processes are + launched by Apache as a less-privileged user. The User and Group directives are used to set + the privileges of the Apache child processes. The child processes + must be able to read all the content that will be served, but + should have as few privileges beyond that as possible.

    + +

    MaxRequestsPerChild + controls how frequently the server recycles processes by killing + old ones and launching new ones.

    +
    +
    top
    +

    MaxSpareServers Directive

    + + + + + + + +
    Description:Maximum number of idle child server processes
    Syntax:MaxSpareServers number
    Default:MaxSpareServers 10
    Context:server config
    Status:MPM
    Module:prefork
    +

    The MaxSpareServers directive sets the + desired maximum number of idle child server processes. An + idle process is one which is not handling a request. If there are + more than MaxSpareServers idle, then the + parent process will kill off the excess processes.

    + +

    Tuning of this parameter should only be necessary on very + busy sites. Setting this parameter to a large number is almost + always a bad idea. If you are trying to set the value lower than + MinSpareServers, Apache + will automatically adjust it to MinSpareServers + 1.

    + +

    See also

    + +
    +
    top
    +

    MinSpareServers Directive

    + + + + + + + +
    Description:Minimum number of idle child server processes
    Syntax:MinSpareServers number
    Default:MinSpareServers 5
    Context:server config
    Status:MPM
    Module:prefork
    +

    The MinSpareServers directive sets the + desired minimum number of idle child server processes. An + idle process is one which is not handling a request. If there are + fewer than MinSpareServers idle, then the parent + process creates new children at a maximum rate of 1 per second.

    + +

    Tuning of this parameter should only be necessary on very + busy sites. Setting this parameter to a large number is almost + always a bad idea.

    + +

    See also

    + +
    +
    +
    +

    Available Languages:  de  | + en  | + es  | + ja  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/prefork.html.es b/rubbos/app/httpd-2.0.64/docs/manual/mod/prefork.html.es new file mode 100644 index 00000000..0ab1be81 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/prefork.html.es @@ -0,0 +1,197 @@ + + + +prefork - Servidor HTTP Apache + + + + + + +
    <-
    + +
    +

    MPM de Apache prefork

    +
    +

    Idiomas disponibles:  de  | + en  | + es  | + ja  | + 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.
    + + + +
    Descripción:Implementa un servidor web pre-forking y no +hebrado
    Estado:MPM
    Identificador de Módulos:mpm_prefork_module
    Fichero de Código Fuente:prefork.c
    +

    Resumen de contenidos

    + +

    Este Módulo de MultiProcesamiento (MPM) implementa un + servidor web pre-forking y no hebrado que trata las peticiones de + una manera similar a como lo hacía Apache 1.3. Esto es + apropiado para sitios web que necesitan evitar el hebrado para ser + compatibles con librerías que no son seguras cuado se usan + hebras. Es también el mejor MPM para aislar cada + petición, de manera que si suge un problema con una + petición, esto no afecte al resto.

    + +

    Este MPM está muy autorregulado, de manera que muy pocas + veces es necesario ajustar los valores de sus directivas de + configuración. El valor que se fije en la directiva + MaxClients debe ser lo + suficientemente grande para tratar tantas peticiones + simultáneas como espere recibir su sitio web, pero lo + suficientemente pequeño para asegurarse de que hay memoria + RAM suficiente para todos los procesos.

    +
    + +
    top
    +
    +

    Cómo funciona

    Un + solo proceso de control es el responsable de lanzar los procesos + hijo que escuchan las peticiones que se puedan producir y las + sirven cuando llegan. Apache siempre intenta mantener varios + procesos de sobra o en espera, que estén + disponibles para servir peticiones cuando lleguen. Así, los + clientes no tienen que esperar a que un nuevo proceso hijo sea + creado para ser atendidos.

    + +

    Las directivas StartServers, MinSpareServers, MaxSpareServers, y MaxClients regulan la forma en que + el proceso padre crea hijos para servir peticiones. En general, + Apache funciona bien sin hacer muchas modificaciones en los + valores por defecto de estas directivas, de manera que la mayor + parte de los sitios web no necesitan ajustar esas directivas a + valores diferentes. Los sitios web que necesiten servir más + de 256 peticiones simultáneas pueden necesitar incrementar el + valor de MaxClients, + mientras que los sitios web con memoria limitada pueden necesitar + decrementar MaxClients + para evitar que el rendimiento del servidor se degrade (pasando + los contenidos de memoria al disco y de vuelta a memoria). Puede + obtener más información sobre como mejorar el + rendimiento del proceso de creación de procesos en la + documentación sobre mejora + del rendimiento.

    + +

    El proceso padre de Apache se inicia normalmente como usuario + root en Unix para que escuche en el puerto 80, sin + embargo, los procesos hijo se crean con menores privilegios de + usuario. Las directivas User y Group se usan para determinar los + privilegios de los procesos hijo de Apache. Los procesos hijo + deben ser capaces de leer todos los contenidos que van a servir, + pero deben tener los menores privilegios posibles.

    + +

    La directiva MaxRequestsPerChild controla + cómo el servidor recicla frecuentemente los procesos + eliminando los antiguos y creando nuevos.

    +
    +
    top
    +

    MaxSpareServers Directiva

    + + + + + + + +
    Descripción:Número máximo de procesos hijo en espera que +puede tener el servdor
    Sintaxis:MaxSpareServers number
    Valor por defecto:MaxSpareServers 10
    Contexto:server config
    Estado:MPM
    Módulo:prefork
    +

    La directiva MaxSpareServers determina + el número máximo de procesos hijo en espera + deseado. Un proceso en espera es aquel que no está atendiendo + ninguna petición. Si hay más de + MaxSpareServers procesos hijo en espera, + entonces el proceso padre elimina el exceso.

    + +

    Ajustar este parámetro debe ser necesario solo en sitios + web con muchas visitas. Fijar un valor alto para este + parámetro es una mala idea casi siempre. Si fija un valor por + debajo de MinSpareServers, + Apache ajustará automáticamente el valor a MinSpareServers + 1.

    + +

    Consulte también

    + +
    +
    top
    +

    MinSpareServers Directiva

    + + + + + + + +
    Descripción:Número mínimo de procesos hijo en espera
    Sintaxis:MinSpareServers number
    Valor por defecto:MinSpareServers 5
    Contexto:server config
    Estado:MPM
    Módulo:prefork
    +

    La directiva MinSpareServers fija el + número mínimo de procesos hijo en espera. Un + proceso en espera es aquel que no está atendiendo ninguna + petición. Si hay menos procesos hijo en espera que + MinSpareServers, entonces el proceso padre + crea nuevos procesos hijo a un ritmo máximo de uno por + segundo.

    + +

    Ajustar este parámetro debe ser necesario solo en sitios + web con muchas visitas. Fijar un valor alto para este + parámetro es una mala idea casi siempre.

    + +

    Consulte también

    + +
    +
    +
    +

    Idiomas disponibles:  de  | + en  | + es  | + ja  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/prefork.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/prefork.html.ja.utf8 new file mode 100644 index 00000000..03569b7a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/prefork.html.ja.utf8 @@ -0,0 +1,194 @@ + + + +prefork - Apache HTTP サーバ + + + + + + +
    <-
    + +
    +

    Apache MPM prefork

    +
    +

    Available Languages:  de  | + en  | + es  | + ja  | + tr 

    +
    +
    This translation may be out of date. Check the + English version for recent changes.
    + + + +
    説明:スレッドを使わず、先行して fork を行なうウェブサーバを実装 +
    ステータス:MPM
    モジュール識別子:mpm_prefork_module
    ソースファイル:prefork.c
    +

    概要

    + +

    このマルチプロセッシングモジュール (MPM) は、 + Unix 上での Apache 1.3 のデフォルトの挙動と非常によく似た方法で + リクエストを処理する、スレッドを使わず、先行して fork を行なう + ウェブサーバを実装しています。 + スレッドセーフでないライブラリとの互換性をとるために、 + スレッドを避ける必要のあるサイトでは、このモジュールの使用が適切でしょう。 + あるリクエストで発生した問題が他のリクエストに影響しないように、 + 個々のリクエストを単離するのにも、最適な MPM です。

    + +

    この MPM は非常に自律的なので、この MPM の設定ディレクティブを + 調整する必要はほとんどないでしょう。もっとも重要なことは、 + MaxClients + が、予想される同時リクエスト数を十分扱えるぐらいは大きいけれども、 + 全プロセスに十分な物理メモリが確実に行き渡る程度には小さい値にする、 + ということです。

    + +
    + +
    top
    +
    +

    動作方法

    +

    一つのコントロールプロセスが、 + コネクションに対して listen して、しかるべき時に応答する + 子プロセスを起動します。Apache は常に幾つかのスペア + かアイドルなサーバプロセスを維持していて、それらは入ってきた + リクエストに応答できるように待機しています。 + このようにしてクライアントは、リクエストが応答される前に、 + 新しい子プロセスが fork されるのを待たなくてもよいように + なっています。

    + +

    親プロセスがリクエストに応答するの子プロセスを + どのように生成するかは、 + StartServers, + MinSpareServers, + MaxSpareServers, + MaxClients + で調整します。一般的に、Apache は非常に自律的なので、 + 大抵のサイトではこれらのディレクティブをデフォルト値から調整する + 必要はないでしょう。 + 同時に 256 を超えるリクエストに応答しないといけないサイトでは、 + MaxClients + を増やす必要があるでしょう。 + 一方、メモリの限られているサイトでは、スラッシング + (メモリとディスク間で何度もスワップ) が起こるのを防ぐために + MaxClients + を減らす必要があるでしょう。プロセス生成のチューニングに関する + 詳しい情報は、性能に関するヒント + にあります。

    + +

    通常 Unix では親プロセスは 80 番ポートにバインドするために + root で起動されますが、子プロセスやスレッドは + もっと低い権限のユーザで Apache によって起動されます。 + User と + Group + ディレクティブは + Apache の子プロセスの権限を設定するのに用いられます。 + 子プロセスはクライアントに送るコンテンツ全てを読めないといけませんが、 + 可能な限り必要最小限の権限のみを持っているようにするべきです。

    + +

    MaxRequestsPerChild + は、古いプロセスを停止して新しいプロセスを起動することによって、 + どの程度の頻度でサーバがプロセスをリサイクルするかを制御します。

    +
    +
    top
    +

    MaxSpareServers ディレクティブ

    + + + + + + + +
    説明:アイドルな子サーバプロセスの最大個数
    構文:MaxSpareServers number
    デフォルト:MaxSpareServers 10
    コンテキスト:サーバ設定ファイル
    ステータス:MPM
    モジュール:prefork
    +

    MaxSpareServers ディレクティブは、 + アイドルな子サーバプロセスの希望最大個数を設定します。 + アイドルプロセスとは、リクエストを扱っていないプロセスです。 + MaxSpareServers よりも多い数がアイドルであれば、 + 親プロセスは超過プロセスを kill します。

    + +

    非常に混んでいるサイトでのみ、このパラメータをチューニングするべきです。 + このパラメータを大きくするということは、大抵の場合は悪い発想です。 + MinSpareServers + よりも小さい値に設定した場合、MinSpareServers + +1 に自動調整されます。

    + +

    参照

    + +
    +
    top
    +

    MinSpareServers ディレクティブ

    + + + + + + + +
    説明:アイドルな子サーバプロセスの最小個数
    構文:MinSpareServers number
    デフォルト:MinSpareServers 5
    コンテキスト:サーバ設定ファイル
    ステータス:MPM
    モジュール:prefork
    +

    MaxSpareServers ディレクティブは、 + アイドルな子サーバプロセスの希望最小個数を設定します。 + アイドルプロセスとは、リクエストを扱っていないプロセスです。 + MinSpareServers よりも少ない数がアイドルであれば、 + 親プロセスは最高で 1 秒につき 1 個の割合で新しい子プロセスを生成します。

    + +

    非常に混んでいるサイトでのみ、このパラメータをチューニングするべきです。 + このパラメータを大きくするということは、大抵の場合は悪い発想です。

    + +

    参照

    + +
    +
    +
    +

    Available Languages:  de  | + en  | + es  | + ja  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/prefork.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/prefork.html.tr.utf8 new file mode 100644 index 00000000..6af3a62b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/prefork.html.tr.utf8 @@ -0,0 +1,180 @@ + + + +prefork - Apache HTTP Sunucusu + + + + + + +
    <-
    + +
    +

    Apache MPM prefork

    +
    +

    Mevcut Diller:  de  | + en  | + es  | + ja  | + tr 

    +
    + + + +
    Açıklama:Evresiz ön çatallamalı HTTP sunucusu oluşturur
    Durum:MPM
    Modül Betimleyici:mpm_prefork_module
    Kaynak Dosyası:prefork.c
    +

    Özet

    + +

    Bu çok süreçlilik modülü (MPM) Apache 1.3’ün yaptığı gibi evresiz ve + çocuk süreçlerin önceden çatallandığı bir HTTP sunucusu oluşturur. + Evresiz kütüphanelerle uyumluluk için evrelemeden kaçınma ihtiyacında + olan siteler için uygundur. Ayrıca istekleri birbirlerinden yalıtmak + için en iyi MPM’dir, dolayısıyla herhangi bir istekle ilgili bir sorun + diğerlerini etkilemez.

    + +

    Bu MPM kendi kendine her duruma çok iyi uyum sağladığından + yapılandırma yönergeleri ile yapılandırılmaya nadiren ihtiyaç gösterir. + Yönergelerin en önemlisi MaxClients olup, değeri aynı anda almayı umduğunuz istek + sayısını işleyebilecek kadar büyük, fiziksel belleğin tüm süreçlerin + ihtiyaçlarını karşılamasına yetecek kadar da küçük olması gerekir.

    +
    + +
    top
    +
    +

    Nasıl çalışır?

    +

    Bağlantıları dinleyip gerektiğinde onlara hizmet sunan çocuk süreçleri + devreye almak tek bir denetim sürecinin sorumluluğundadır. Apache + daima, gelen isteklere hizmet vermeye hazır bekleyen en fazla sayıda + sunucu sürecini yedekte tutmaya veya boşta bekletmeye + çalışır. Bu suretle, istemcilere isteklerinin sunulması için yeni çocuk + süreçlerin çatallanmasını beklemek gerekmez.

    + +

    Ana sürecin istekleri sunacak çocuk süreçleri oluşturma işlemini nasıl + gerçekleştireceği StartServers, MinSpareServers, MaxSpareServers ve MaxClients yönergeleri ile düzenlenir. Apache + kendiliğinden her duruma çok iyi uyum sağladığından, genelde, çoğu + sitenin bu yönergelerin öntanımlı değerlerini değiştirmesi gerekmez. + Aynı anda 256’dan fazla isteğe hizmet sunacak sitelerin MaxClients değerini arttırmaları + gerekebilir. Ancak, fiziksel belleği yeterli olmayan sitelerin de + sunucunun belleği diske takaslamasını önlemek için bu değeri + azaltmaları gerekebilir. Süreç oluşturmanın ayarlanması ile ilgili daha + fazla bilgi edinmek için başarım + arttırma ipuçları belgesine bakınız.

    + +

    Unix altında 80. portu dinleyebilmek için ana sürecin + root tarafından çalıştırılmış olması gerekirse de çocuk + süreçler Apache tarafından daha az yetkili bir kullanıcının aidiyetinde + çalıştırılırlar. Apache’nin çocuk süreçlerinin kullanıcı ve gruplarını + ayarlamak için User ve + Group yönergeleri + kullanılır. Çocuk süreçlerin sunacakları içeriği okumaya yetkili + olmaları gerekir, fakat bu yetkinin mümkün olduğunca kısıtlı + tutulmasına çalışılmalıdır.

    + +

    MaxRequestsPerChild + yönergesi ana sunucunun eski süreçleri öldürüp yenilerini oluşturmayı + ne kadar sıklıkla yapacağını denetler.

    +
    +
    top
    +

    MaxSpareServers Yönergesi

    + + + + + + + +
    Açıklama:Boştaki çocuk süreçlerin azami sayısı
    Sözdizimi:MaxSpareServers sayı
    Öntanımlı:MaxSpareServers 10
    Bağlam:sunucu geneli
    Durum:MPM
    Modül:prefork
    +

    MaxSpareServers yönergesi boştaki + çocuk sunucu süreçlerinin azami sayısını belirler. Boştaki süreç, o an + bir isteğe hizmet sunmayan süreçtir. Eğer + MaxSpareServers sayıda süreçten daha fazla boşta + süreç varsa ana süreç bu fazlalıkları öldürecektir.

    + +

    Bu parametrenin ayarlanması sadece çok meşgul siteler için gerekli + olabilir. Bu parametreye çok büyük bir değerin atanması oldukça kötü + bir fikirdir. Eğer bu değeri MinSpareServers değerinden daha küçük bir değere + ayarlarsanız, Apache bu değeri kendiliğinden MinSpareServers + 1 olarak + değiştirecektir.

    + +

    Ayrıca bakınız:

    + +
    +
    top
    +

    MinSpareServers Yönergesi

    + + + + + + + +
    Açıklama:Boştaki çocuk süreçlerin asgari sayısı
    Sözdizimi:MinSpareServers sayı
    Öntanımlı:MinSpareServers 5
    Bağlam:sunucu geneli
    Durum:MPM
    Modül:prefork
    +

    MinSpareServers yönergesi boştaki + çocuk sunucu süreçlerinin asgari sayısını belirler. Boştaki süreç, o an + bir isteğe hizmet sunmayan süreçtir. Eğer + MinSpareServers sayıda süreçten daha az boşta + süreç varsa ana süreç sayıyı tamamlamak için saniyede en fazla 1 süreç + olmak üzere yeni çocuk süreçler oluşturacaktır.

    + +

    Bu parametrenin ayarlanması sadece çok meşgul siteler için gerekli + olabilir. Bu parametreye çok büyük bir değerin atanması oldukça kötü + bir fikirdir.

    + +

    Ayrıca bakınız:

    + +
    +
    +
    +

    Mevcut Diller:  de  | + en  | + es  | + ja  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/quickreference.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/quickreference.html new file mode 100644 index 00000000..1e27a3b5 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/quickreference.html @@ -0,0 +1,29 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: quickreference.html.de +Content-Language: de +Content-type: text/html; charset=ISO-8859-1 + +URI: quickreference.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: quickreference.html.es +Content-Language: es +Content-type: text/html; charset=ISO-8859-1 + +URI: quickreference.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: quickreference.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: quickreference.html.ru.koi8-r +Content-Language: ru +Content-type: text/html; charset=KOI8-R + +URI: quickreference.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/quickreference.html.de b/rubbos/app/httpd-2.0.64/docs/manual/mod/quickreference.html.de new file mode 100644 index 00000000..bffbecbb --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/quickreference.html.de @@ -0,0 +1,743 @@ + + + +Kurzreferenz der Direktiven - Apache HTTP Server + + + + + + +
    <-
    + +

    Kurzreferenz der Direktiven

    +
    +

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

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

    Die Kurzreferenz der Direktiven zeigt die Verwendung, + Voreinstellung, den Status und den Kontext aller + Apache-Konfigurationsanweisungen. Für weitergehende Informationen + schauen Sie bitte im Verzeichnis der Direktiven.

    + +

    Die erste Spalte enthält den Namen und die Verwendung. + Die zweite Spalte zeigt die Voreinstellung der Direktive, sofern + eine Voreinstellung existiert. Wenn die Voreinstellung zu breit + für die Anzeige ist, werden die ersten Buchstaben angegeben, + gefolgt von einem "+".

    + +

    Die dritte und vierte Spalte geben den Kontext an, in dem die + Direktive erlaubt ist, sowie den Status der Direktive entsprechend + der Legende.

    +
    +
    + + + +
     A  |  B  |  C  |  D  |  E  |  F  |  G  |  H  |  I  |  K  |  L  |  M  |  N  |  O  |  P  |  R  |  S  |  T  |  U  |  V  |  W  |  X  + + + +
    sServerkonfiguration
    vVirtual Host
    dVerzeichnis
    h.htaccess
    + + + + +
    CCore
    MMPM
    BBasis
    EErweiterung
    Xexperimentell
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AcceptMutex Default|Methode Default sM
    Vom Apache verwendete Methode zur Serialisierung mehrerer + Kindprozesse, die Anfragen an Netzwerk-Sockets entgegennehmen.
    AcceptPathInfo On|Off|Default Default svdhC
    Ressourcen lassen angehängte Pfadangaben zu
    AccessFileName Dateiname [Dateiname] ... .htaccess svC
    Name der dezentralen Konfigurationsdateien
    Action action-type cgi-scriptsvdhB
    Activates a CGI script for a particular handler or +content-type
    AddAlt string file [file] ...svdhB
    Alternate text to display for a file, instead of an +icon selected by filename
    AddAltByEncoding string MIME-encoding +[MIME-encoding] ...svdhB
    Alternate text to display for a file instead of an icon +selected by MIME-encoding
    AddAltByType string MIME-type +[MIME-type] ...svdhB
    Alternate text to display for a file, instead of an +icon selected by MIME content-type
    AddCharset charset extension +[extension] ...svdhB
    Maps the given filename extensions to the specified content +charset
    AddDefaultCharset On|Off|Zeichenkodierung Off svdhC
    Standard-Charset-Parameter, der bei Antworten vom Content-Type + text/plain oder text/html hinzugefügt wird +
    AddDescription string file [file] ...svdhB
    Description to display for a file
    AddEncoding MIME-enc extension +[extension] ...svdhB
    Maps the given filename extensions to the specified encoding +type
    AddHandler handler-name extension +[extension] ...svdhB
    Maps the filename extensions to the specified +handler
    AddIcon icon name [name] +...svdhB
    Icon to display for a file selected by name
    AddIconByEncoding icon MIME-encoding +[MIME-encoding] ...svdhB
    Icon to display next to files selected by MIME +content-encoding
    AddIconByType icon MIME-type +[MIME-type] ...svdhB
    Icon to display next to files selected by MIME +content-type
    AddInputFilter filter[;filter...] +extension [extension] ...svdhB
    Maps filename extensions to the filters that will process +client requests
    AddLanguage MIME-lang extension +[extension] ...svdhB
    Maps the given filename extension to the specified content +language
    AddModuleInfo module-name stringsvE
    Adds additional information to the module +information displayed by the server-info handler
    AddOutputFilter filter[;filter...] +extension [extension] ...svdhB
    Maps filename extensions to the filters that will process +responses from the server
    AddOutputFilterByType Filter[;Filter...] +MIME-Type [MIME-Type] ...svdhC
    einen Ausgabefilter einem bestimmten MIME-Type +zuordnen
    AddType MIME-type extension +[extension] ...svdhB
    Maps the given filename extensions onto the specified content +type
    Alias URL-path +file-path|directory-pathsvB
    Maps URLs to filesystem locations
    AliasMatch regex +file-path|directory-pathsvB
    Maps URLs to filesystem locations using regular +expressions
    Allow from + all|host|env=env-variable + [host|env=env-variable] ...dhB
    Controls which hosts can access an area of the +server
    AllowCONNECT port [port] ... 443 563 svE
    Ports that are allowed to CONNECT through the +proxy
    AllowEncodedSlashes On|Off Off svC
    Legt fest, ob kodierte Pfadtrennzeichen in URLs durchgereicht +werden dürfen
    AllowOverride All|None|Direktiven-Typ +[Direktiven-Typ] ... All dC
    Direktiven-Typen, die in .htaccess-Dateien +erlaubt sind.
    Anonymous user [user] ...dhE
    Specifies userIDs that are allowed access without +password verification
    Anonymous_Authoritative On|Off Off dhE
    Configures if authorization will fall-through +to other methods
    Anonymous_LogEmail On|Off On dhE
    Sets whether the password entered will be logged in the +error log
    Anonymous_MustGiveEmail On|Off On dhE
    Specifies whether blank passwords are allowed
    Anonymous_NoUserID On|Off Off dhE
    Sets whether the userID field may be empty
    Anonymous_VerifyEmail On|Off Off dhE
    Sets whether to check the password field for a correctly +formatted email address
    AssignUserID user-id group-idvM
    Tie a virtual host to a user and group ID
    AuthAuthoritative On|Off On dhB
    Sets whether authorization and authentication are +passed to lower level modules
    AuthDBMAuthoritative On|Off On dhE
    Sets whether authentication and authorization will be +passed on to lower level modules
    AuthDBMGroupFile file-pathdhE
    Sets the name of the database file containing the list +of user groups for authentication
    AuthDBMType default|SDBM|GDBM|NDBM|DB default dhE
    Sets the type of database file that is used to +store passwords
    AuthDBMUserFile file-pathdhE
    Sets thename of a database file containing the list of users and +passwords for authentication
    AuthDigestAlgorithm MD5|MD5-sess MD5 dhX
    Selects the algorithm used to calculate the challenge and +response hases in digest authentication
    AuthDigestDomain URI [URI] ...dhX
    URIs that are in the same protection space for digest +authentication
    AuthDigestFile file-pathdhX
    Location of the text file containing the list +of users and encoded passwords for digest authentication
    AuthDigestGroupFile file-pathdhX
    Name of the text file containing the list of groups +for digest authentication
    AuthDigestNcCheck On|Off Off sX
    Enables or disables checking of the nonce-count sent by the +server
    AuthDigestNonceFormat formatdhX
    Determines how the nonce is generated
    AuthDigestNonceLifetime seconds 300 dhX
    How long the server nonce is valid
    AuthDigestQop none|auth|auth-int [auth|auth-int] auth dhX
    Determines the quality-of-protection to use in digest +authentication
    AuthDigestShmemSize size 1000 sX
    The amount of shared memory to allocate for keeping track +of clients
    AuthGroupFile file-pathdhB
    Sets the name of a text file containing the list +of user groups for authentication
    AuthLDAPAuthoritative on|off on dhX
    Prevent other authentication modules from +authenticating the user if this one fails
    AuthLDAPBindDN distinguished-namedhX
    Optional DN to use in binding to the LDAP server
    AuthLDAPBindPassword passworddhX
    Password used in conjuction with the bind DN
    AuthLDAPCharsetConfig file-pathsX
    Language to charset conversion configuration file
    AuthLDAPCompareDNOnServer on|off on dhX
    Use the LDAP server to compare the DNs
    AuthLDAPDereferenceAliases never|searching|finding|always Always dhX
    When will the module de-reference aliases
    AuthLDAPEnabled on|off on dhX
    Turn on or off LDAP authentication
    AuthLDAPFrontPageHack on|off off dhX
    Allow LDAP authentication to work with MS FrontPage
    AuthLDAPGroupAttribute attributedhX
    LDAP attributes used to check for group membership
    AuthLDAPGroupAttributeIsDN on|off on dhX
    Use the DN of the client username when checking for +group membership
    AuthLDAPRemoteUserIsDN on|off off dhX
    Use the DN of the client username to set the REMOTE_USER +environment variable
    AuthLDAPUrl urldhX
    URL specifying the LDAP search parameters
    AuthName auth-BereichdhC
    Autorisierungsbereich zur Verwendung in der +HTTP-Authentisierung
    AuthType Basic|DigestdhC
    Art der Authentisierung
    AuthUserFile file-pathdhB
    Sets the name of a text file containing the list of users and +passwords for authentication
    BrowserMatch regex [!]env-variable[=value] +[[!]env-variable[=value]] ...svdhB
    Sets environment variables conditional on HTTP User-Agent +
    BrowserMatchNoCase regex [!]env-variable[=value] + [[!]env-variable[=value]] ...svdhB
    Sets environment variables conditional on User-Agent without +respect to case
    BS2000Account AccountsM
    Bestimmt den nicht-privilegierten Account auf +BS2000-Maschinen
    BufferedLogs On|Off Off sB
    Buffer log entries in memory before writing to disk
    CacheDefaultExpire seconds 3600 (one hour) svX
    The default duration to cache a document when no expiry date is specified.
    CacheDirLength length 2 svX
    The number of characters in subdirectory names
    CacheDirLevels levels 3 svX
    The number of levels of subdirectories in the +cache.
    CacheDisable url-stringsvX
    Disable caching of specified URLs
    CacheEnable cache_type url-stringsvX
    Enable caching of specified URLs using a specified storage +manager
    CacheExpiryCheck On|Off On svX
    Indicates if the cache observes Expires dates when seeking +files
    CacheFile file-path [file-path] ...sX
    Cache a list of file handles at startup time
    CacheForceCompletion Percentage 60 svX
    Percentage of document served, after which the server +will complete caching the file even if the request is cancelled.
    CacheGcClean hours url-string ? svX
    The time to retain unchanged cached files that match a +URL
    CacheGcDaily time ? svX
    The recurring time each day for garbage collection to be run. +(24 hour clock)
    CacheGcInterval hourssvX
    The interval between garbage collection attempts.
    CacheGcMemUsage KBytes ? svX
    The maximum kilobytes of memory used for garbage +collection
    CacheGcUnused hours url-string ? svX
    The time to retain unreferenced cached files that match a +URL.
    CacheIgnoreCacheControl On|Off Off svX
    Ignore the fact that the client requested the content not be +cached.
    CacheIgnoreHeaders header-string [header-string] ... None svX
    Do not store the given HTTP header(s) in the cache. +
    CacheIgnoreNoLastMod On|Off Off svX
    Ignore the fact that a response has no Last Modified +header.
    CacheLastModifiedFactor float 0.1 svX
    The factor used to compute an expiry date based on the +LastModified date.
    CacheMaxExpire seconds 86400 (one day) svX
    The maximum time in seconds to cache a document
    CacheMaxFileSize bytes 1000000 svX
    The maximum size (in bytes) of a document to be placed in the +cache
    CacheMinFileSize bytes 1 svX
    The minimum size (in bytes) of a document to be placed in the +cache
    CacheNegotiatedDocs On|Off Off svB
    Allows content-negotiated documents to be +cached by proxy servers
    CacheRoot directorysvX
    The directory root under which cache files are +stored
    CacheSize KBytes 1000000 svX
    The maximum amount of disk space that will be used by the +cache in KBytes
    CacheTimeMargin ? ? svX
    The minimum time margin to cache a document
    CGIMapExtension CGI-Pfad .EndungdhC
    Technik zur Bestimmung des Interpreters für +CGI-Skripte
    CharsetDefault charsetsvdhX
    Charset to translate into
    CharsetOptions option [option] ... DebugLevel=0 NoImpl +svdhX
    Configures charset translation behavior
    CharsetSourceEnc charsetsvdhX
    Source charset of files
    CheckSpelling on|off Off svdhE
    Enables the spelling +module
    ChildPerUserID user-id group-id +num-childrensM
    Specify user ID and group ID for a number of child +processes
    ContentDigest On|Off Off svdhC
    Aktiviert die Generierung von Content-MD5 +HTTP-Response-Headern
    CookieDomain domainsvdhE
    The domain to which the tracking cookie applies
    CookieExpires expiry-periodsvdhE
    Expiry time for the tracking cookie
    CookieLog filenamesvB
    Sets filename for the logging of cookies
    CookieName token Apache svdhE
    Name of the tracking cookie
    CookieStyle + Netscape|Cookie|Cookie2|RFC2109|RFC2965 Netscape svdhE
    Format of the cookie header field
    CookieTracking on|off off svdhE
    Enables tracking cookie
    CoreDumpDirectory VerzeichnissM
    Verzeichnis, in das der Apache zu wechseln versucht, bevor er + einen Hauptspeicherauszug erstellt
    CustomLog file|pipe +format|nickname +[env=[!]environment-variable]svB
    Sets filename and format of log file
    Dav On|Off|provider-name Off dE
    Enable WebDAV HTTP methods
    DavDepthInfinity on|off off svdE
    Allow PROPFIND, Depth: Infinity requests
    DavLockDB file-pathsvE
    Location of the DAV lock database
    DavMinTimeout seconds 0 svdE
    Minimum amount of time the server holds a lock on +a DAV resource
    DefaultIcon url-pathsvdhB
    Icon to display for files when no specific icon is +configured
    DefaultLanguage MIME-langsvdhB
    Sets all files in the given scope to the specified +language
    DefaultType MIME-Type text/plain svdhC
    MIME-Content-Type, der gesendet wird, wenn der Server den Typ +nicht auf andere Weise ermitteln kann.
    DeflateBufferSize value 8096 svE
    Fragment size to be compressed at one time by zlib
    DeflateCompressionLevel valuesvE
    How much compression do we apply to the output
    DeflateFilterNote [type] notenamesvE
    Places the compression ratio in a note for logging
    DeflateMemLevel value 9 svE
    How much memory should be used by zlib for compression
    DeflateWindowSize value 15 svE
    Zlib compression window size
    Deny from all|host|env=env-variable +[host|env=env-variable] ...dhB
    Controls which hosts are denied access to the +server
    <Directory Verzeichnispfad> +... </Directory>svC
    Umschließt eine Gruppe von Direktiven, die nur auf +das genannte Verzeichnis des Dateisystems und Unterverzeichnisse angewendet +werden
    DirectoryIndex + local-url [local-url] ... index.html svdhB
    List of resources to look for when the client requests +a directory
    <DirectoryMatch regex> +... </DirectoryMatch>svC
    Umschließt eine Gruppe von Direktiven, die auf + Verzeichnisse des Dateisystems und ihre Unterverzeichnisse abgebildet + werden, welche auf einen regulären Ausdruck passen
    DirectorySlash On|Off On svdhB
    Toggle trailing slash redirects on or off
    DocumentRoot Verzeichnis /usr/local/apache/h +svC
    Verzeichnis, welches den Haupt-Dokumentenbaum bildet, der im +Web sichtbar ist.
    DumpIOInput On|Off Off sX
    Dump all input data to the error log
    DumpIOOutput On|Off Off sX
    Dump all output data to the error log
    EnableExceptionHook On|Off Off sM
    Aktiviert einen Hook, der nach einem Absturz noch +Ausnahmefehler behandeln lassen kann
    EnableMMAP On|Off On svdhC
    Verwende Memory-Mapping, um Dateien während der +Auslieferung zu lesen
    EnableSendfile On|Off On svdhC
    Verwende die sendfile-Unterstützung des Kernels, um +Dateien an den Client auszuliefern
    ErrorDocument Fehlercode DokumentsvdhC
    Das, was der Server im Fehlerfall an den Client +zurückgibt
    ErrorLog Dateiname|syslog[:facility] logs/error_log (Uni +svC
    Ablageort, an dem der Server Fehler protokolliert
    ExamplesvdhX
    Demonstration directive to illustrate the Apache module +API
    ExpiresActive On|OffsvdhE
    Enables generation of Expires +headers
    ExpiresByType MIME-type +<code>secondssvdhE
    Value of the Expires header configured +by MIME type
    ExpiresDefault <code>secondssvdhE
    Default algorithm for calculating expiration time
    ExtendedStatus On|Off Off sB
    Keep track of extended status information for each +request
    ExtFilterDefine filtername parameterssE
    Define an external filter
    ExtFilterOptions option [option] ... DebugLevel=0 NoLogS +dE
    Configure mod_ext_filter options
    FileETag Komponente ... INode MTime Size svdhC
    Dateiattribute, die zur Erstellung des HTTP-Response-Headers +ETag verwendet werden
    <Files Dateiname> ... </Files>svdhC
    Enthält Direktiven, die sich nur auf passende Dateinamen +beziehen
    <FilesMatch regex> ... </FilesMatch>svdhC
    Enthält Direktiven, die für Dateinamen gelten, die + auf einen regulären Ausdruck passen
    ForceLanguagePriority None|Prefer|Fallback [Prefer|Fallback] Prefer svdhB
    Action to take if a single acceptable document is not +found
    ForceType MIME-Type|NonedhC
    Erzwingt die Auslieferung aller passendenden Dateien mit dem +angegebenen MIME-Content-Type
    ForensicLog filename|pipesvE
    Sets filename of the forensic log
    Group Unix-Gruppe #-1 sM
    Benutzergruppe, unter welcher der Server Anfragen + beantwortet
    Header [condition] set|append|add|unset|echo +header [value] [env=[!]variable]svdhE
    Configure HTTP response headers
    HeaderName filenamesvdhB
    Name of the file that will be inserted at the top +of the index listing
    HostnameLookups On|Off|Double Off svdC
    Aktiviert DNS-Lookups auf Client-IP-Adressen
    IdentityCheck On|Off Off svdC
    Ermöglicht die Protokollierung der Identität des +entfernten Anwenders nach RFC1413
    <IfDefine [!]Parametername> ... + </IfDefine>svdhC
    Schließt Direktiven ein, die nur ausgeführt werden, +wenn eine Testbedingung beim Start wahr ist
    <IfModule [!]Modulname> ... + </IfModule>svdhC
    Schließt Direktiven ein, die abhängig vom +Vorhandensein oder Fehlen eines speziellen Moduls ausgeführt +werden
    <IfVersion [[!]operator] version> ... +</IfVersion>svdhE
    contains version dependent configuration
    ImapBase map|referer|URL http://servername/ svdhB
    Default base for imagemap files
    ImapDefault error|nocontent|map|referer|URL nocontent svdhB
    Default action when an imagemap is called with coordinates +that are not explicitly mapped
    ImapMenu none|formatted|semiformatted|unformattedsvdhB
    Action if no coordinates are given when calling +an imagemap
    Include Dateiname|VerzeichnissvdC
    Fügt andere Konfigurationsdateien innerhalb der +Server-Konfigurationsdatei ein
    IndexIgnore file [file] ...svdhB
    Adds to the list of files to hide when listing +a directory
    IndexOptions [+|-]option [[+|-]option] +...svdhB
    Various configuration settings for directory +indexing
    IndexOrderDefault Ascending|Descending +Name|Date|Size|Description Ascending Name svdhB
    Sets the default ordering of the directory index
    ISAPIAppendLogToErrors on|off off svdhB
    Record HSE_APPEND_LOG_PARAMETER requests from +ISAPI extensions to the error log
    ISAPIAppendLogToQuery on|off on svdhB
    Record HSE_APPEND_LOG_PARAMETER requests from +ISAPI extensions to the query field
    ISAPICacheFile file-path [file-path] +...svB
    ISAPI .dll files to be loaded at startup
    ISAPIFakeAsync on|off off svdhB
    Fake asynchronous support for ISAPI callbacks
    ISAPILogNotSupported on|off off svdhB
    Log unsupported feature requests from ISAPI +extensions
    ISAPIReadAheadBuffer size 49152 svdhB
    Size of the Read Ahead Buffer sent to ISAPI +extensions
    KeepAlive On|Off On svC
    Aktiviert persistente HTTP-Verbindungen
    KeepAliveTimeout Sekunden 15 svC
    Zeitspanne, die der Server während persistenter Verbindungen +auf nachfolgende Anfragen wartet
    LanguagePriority MIME-lang [MIME-lang] +...svdhB
    The precendence of language variants for cases where +the client does not express a preference
    LDAPCacheEntries number 1024 sX
    Maximum number of entries in the primary LDAP cache
    LDAPCacheTTL seconds 600 sX
    Time that cached items remain valid
    LDAPConnectionTimeout secondssX
    Specifies the socket connection timeout in seconds
    LDAPOpCacheEntries number 1024 sX
    Number of entries used to cache LDAP compare +operations
    LDAPOpCacheTTL seconds 600 sX
    Time that entries in the operation cache remain +valid
    LDAPSharedCacheFile directory-path/filenamesX
    Sets the shared memory cache file
    LDAPSharedCacheSize bytes 102400 sX
    Size in bytes of the shared-memory cache
    LDAPTrustedCA directory-path/filenamesX
    Sets the file containing the trusted Certificate Authority certificate or database
    LDAPTrustedCAType typesX
    Specifies the type of the Certificate Authority file
    <Limit Methode [Methode] ... > ... + </Limit>svdhC
    Beschränkt die eingeschlossenen Zugriffskontrollen auf +bestimmte HTTP-Methoden
    <LimitExcept Methode [Methode] ... > ... + </LimitExcept>svdhC
    Beschränkt Zugriffskontrollen auf alle HTTP-Methoden +außer den genannten
    LimitInternalRecursion Zahl [Zahl] 10 svC
    Bestimmt die maximale Anzahl interner Umleitungen und + verschachtelter Unteranfragen
    LimitRequestBody Bytes 0 svdhC
    Begrenzt die Gesamtgröße des vom Client gesendeten +HTTP-Request-Body
    LimitRequestFields Anzahl 100 sC
    Begrenzt die Anzahl der HTTP-Request-Header, die vom Client +entgegengenommen werden
    LimitRequestFieldsize BytessC
    Begrenzt die Länge des vom Client gesendeten +HTTP-Request-Headers
    LimitRequestLine Bytes 8190 sC
    Begrenzt die Länge der vom Client entgegengenommenen +HTTP-Anfragezeile
    LimitXMLRequestBody Bytes 1000000 svdhC
    Begrenzt die Größe eines XML-basierten +Request-Bodys
    Listen [IP-Addresse:]PortsM
    IP-Adressen und Ports, an denen der Server lauscht
    ListenBacklog backlogsM
    Maximale Länge der Warteschlange schwebender + Verbindungen
    LoadFile filename [filename] ...sE
    Link in the named object file or library
    LoadModule module filenamesE
    Links in the object file or library, and adds to the list +of active modules
    <Location + URL-Pfad|URL> ... </Location>svC
    Wendet die enthaltenen Direktiven nur auf die entsprechenden +URLs an
    <LocationMatch + regex> ... </LocationMatch>svC
    Wendet die enthaltenen Direktiven nur auf URLs an, die auf +reguläre Ausdrücke passen
    LockFile Dateiname logs/accept.lock sM
    Ablageort der Lock-Datei für die Serialisierung von +entgegengenommenen Anfragen
    LogFormat format|nickname +[nickname] "%h %l %u %t \"%r\" +svB
    Describes a format for use in a log file
    LogLevel Level warn svC
    Steuert die Ausführlichkeit des Fehlerprotokolls
    MaxClients AnzahlsM
    Maximale Anzahl der Kindprozesse, die zur Bedienung von Anfragen + gestartet wird
    MaxKeepAliveRequests Anzahl 100 svC
    Anzahl der Anfragen, die bei einer persistenten Verbindung +zulässig sind
    MaxMemFree KBytes 0 sM
    Maximale Menge des Arbeitsspeichers, den die + Haupt-Zuteilungsroutine verwalten darf, ohne free() + aufzurufen
    MaxRequestsPerChild number 10000 sM
    Obergrenze für die Anzahl von Anfragen, die ein einzelner + Kindprozess während seines Lebens bearbeitet
    MaxRequestsPerThread Anzahl 0 sM
    Die maximale Anzahl von Anfragen, die ein einzelner Thread + während seiner Lebensdauer bedient.
    MaxSpareServers Anzahl 10 sM
    Maximale Anzahl der unbeschäftigten Kindprozesse des + Servers
    MaxSpareThreads AnzahlsM
    Maximale Anzahl unbeschäftigter Threads
    MaxThreads number 2048 sM
    Set the maximum number of worker threads
    MaxThreadsPerChild number 64 sM
    Maximum number of threads per child process
    MCacheMaxObjectCount value 1009 sX
    The maximum number of objects allowed to be placed in the +cache
    MCacheMaxObjectSize bytes 10000 sX
    The maximum size (in bytes) of a document allowed in the +cache
    MCacheMaxStreamingBuffer size_in_bytes the smaller of 1000 +sX
    Maximum amount of a streamed response to buffer in memory +before declaring the response uncacheable
    MCacheMinObjectSize bytes 0 sX
    The minimum size (in bytes) of a document to be allowed in the +cache
    MCacheRemovalAlgorithm LRU|GDSF GDSF sX
    The algorithm used to select documents for removal from the +cache
    MCacheSize KBytes 100 sX
    The maximum amount of memory used by the cache in +KBytes
    MetaDir directory .web svdhE
    Name of the directory to find CERN-style meta information +files
    MetaFiles on|off off svdhE
    Activates CERN meta-file processing
    MetaSuffix suffix .meta svdhE
    File name suffix for the file containg CERN-style +meta information
    MimeMagicFile file-pathsvE
    Enable MIME-type determination based on file contents +using the specified magic file
    MinSpareServers Anzahl 5 sM
    Minimale Anzahl der unbeschäftigten Kindprozesse des + Servers
    MinSpareThreads AnzahlsM
    Minimale Anzahl unbeschäftigter Threads, die zur + Bedienung von Anfragespitzen zur Verfügung stehen
    MMapFile file-path [file-path] ...sX
    Map a list of files into memory at startup time
    ModMimeUsePathInfo On|Off Off dB
    Tells mod_mime to treat path_info +components as part of the filename
    MultiviewsMatch Any|NegotiatedOnly|Filters|Handlers +[Handlers|Filters] NegotiatedOnly svdhB
    The types of files that will be included when searching for +a matching file with MultiViews
    NameVirtualHost Adresse[:Port]sC
    Bestimmt eine IP-Adresse für den Betrieb namensbasierter +virtueller Hosts
    NoProxy host [host] ...svE
    Hosts, domains, or networks that will be connected to +directly
    NumServers number 2 sM
    Total number of children alive at the same time
    NWSSLTrustedCerts filename [filename] ...sB
    List of additional client certificates
    NWSSLUpgradeable [IP-address:]portnumbersB
    Allows a connection to be upgraded to an SSL connection upon request
    Options + [+|-]Option [[+|-]Option] ... All svdhC
    Definiert, welche Eigenschaften oder Funktionen in einem +bestimmten Verzeichnis verfügbar sind
    Order ordering Deny,Allow dhB
    Controls the default access state and the order in which +Allow and Deny are +evaluated.
    PassEnv env-variable [env-variable] +...svdhB
    Passes environment variables from the shell
    PidFile Dateiname logs/httpd.pid sM
    Datei, in welcher der Server die Prozess-ID des Daemons +ablegt
    ProtocolEcho On|Off Off svX
    Turn the echo server on or off
    <Proxy wildcard-url> ...</Proxy>svE
    Container for directives applied to proxied resources
    ProxyBadHeader IsError|Ignore|StartBody IsError svE
    Determines how to handle bad header lines in a +response
    ProxyBlock *|word|host|domain +[word|host|domain] ...svE
    Words, hosts, or domains that are banned from being +proxied
    ProxyDomain DomainsvE
    Default domain name for proxied requests
    ProxyErrorOverride On|Off Off svE
    Override error pages for proxied content
    ProxyFtpDirCharset character set ISO-8859-1 svdE
    Define the character set for proxied FTP listings
    ProxyIOBufferSize bytes 8192 svE
    Determine size of internal data throughput buffer
    <ProxyMatch regex> ...</ProxyMatch>svE
    Container for directives applied to regular-expression-matched +proxied resources
    ProxyMaxForwards number 10 svE
    Maximium number of proxies that a request can be forwarded +through
    ProxyPass [path] !|urlsvdE
    Maps remote servers into the local server URL-space
    ProxyPassReverse [path] urlsvdE
    Adjusts the URL in HTTP response headers sent from a reverse +proxied server
    ProxyPreserveHost On|Off Off svE
    Use incoming Host HTTP request header for proxy +request
    ProxyReceiveBufferSize bytes 0 svE
    Network buffer size for proxied HTTP and FTP +connections
    ProxyRemote match remote-serversvE
    Remote proxy used to handle certain requests
    ProxyRemoteMatch regex remote-serversvE
    Remote proxy used to handle requests matched by regular +expressions
    ProxyRequests On|Off Off svE
    Enables forward (standard) proxy requests
    ProxyTimeout seconds 300 svE
    Network timeout for proxied requests
    ProxyVia On|Off|Full|Block Off svE
    Information provided in the Via HTTP response +header for proxied requests
    ReadmeName filenamesvdhB
    Name of the file that will be inserted at the end +of the index listing
    ReceiveBufferSize Bytes 0 sM
    Größe des TCP-Empfangspuffers
    Redirect [status] URL-path +URLsvdhB
    Sends an external redirect asking the client to fetch +a different URL
    RedirectMatch [status] regex +URLsvdhB
    Sends an external redirect based on a regular expression match +of the current URL
    RedirectPermanent URL-path URLsvdhB
    Sends an external permanent redirect asking the client to fetch +a different URL
    RedirectTemp URL-path URLsvdhB
    Sends an external temporary redirect asking the client to fetch +a different URL
    RemoveCharset extension [extension] +...vdhB
    Removes any character set associations for a set of file +extensions
    RemoveEncoding extension [extension] +...vdhB
    Removes any content encoding associations for a set of file +extensions
    RemoveHandler extension [extension] +...vdhB
    Removes any handler associations for a set of file +extensions
    RemoveInputFilter extension [extension] +...vdhB
    Removes any input filter associations for a set of file +extensions
    RemoveLanguage extension [extension] +...vdhB
    Removes any language associations for a set of file +extensions
    RemoveOutputFilter extension [extension] +...vdhB
    Removes any output filter associations for a set of file +extensions
    RemoveType extension [extension] +...vdhB
    Removes any content type associations for a set of file +extensions
    RequestHeader set|append|add|unset header +[value [env=[!]variable]]svdhE
    Configure HTTP request headers
    Require Name [Name] ...dhC
    Wählt die authentisierten Benutzer aus, die auf eine +Ressource zugreifen können
    RewriteBase URL-pathdhE
    Sets the base URL for per-directory rewrites
    RewriteCond + TestString CondPatternsvdhE
    Defines a condition under which rewriting will take place +
    RewriteEngine on|off off svdhE
    Enables or disables runtime rewriting engine
    RewriteLock file-pathsE
    Sets the name of the lock file used for RewriteMap +synchronization
    RewriteLog file-pathsvE
    Sets the name of the file used for logging rewrite engine +processing
    RewriteLogLevel Level 0 svE
    Sets the verbosity of the log file used by the rewrite +engine
    RewriteMap MapName MapType:MapSource +svE
    Defines a mapping function for key-lookup
    RewriteOptions Options MaxRedirects=10 svdhE
    Sets some special options for the rewrite engine
    RewriteRule + Pattern SubstitutionsvdhE
    Defines rules for the rewriting engine
    RLimitCPU Sekunden|max [Sekunden|max]svdhC
    Begrenzt den CPU-Verbrauch von Prozessen, die von +Apache-Kindprozessen gestartet wurden
    RLimitMEM Bytes|max [Bytes|max]svdhC
    Begrenzt den Speicherverbrauch von Prozessen, die von +Apache-Kindprozessen gestartet wurden
    RLimitNPROC Zahl|max [Zahl|max]svdhC
    Begrenzt die Anzahl der Prozesse, die von Prozessen gestartet +werden können, der ihrerseits von Apache-Kinprozessen gestartet +wurden
    Satisfy Any|All All dhC
    Zusammenspiel von rechnerbasierter Zugriffskontrolle und +Benutzerauthentisierung
    ScoreBoardFile Dateipfad logs/apache_status sM
    Ablageort der Datei, die zur Speicherung von Daten zur + Koordinierung der Kindprozesse verwendet wird
    Script method cgi-scriptsvdB
    Activates a CGI script for a particular request +method.
    ScriptAlias URL-path +file-path|directory-pathsvB
    Maps a URL to a filesystem location and designates the +target as a CGI script
    ScriptAliasMatch regex +file-path|directory-pathsvB
    Maps a URL to a filesystem location using a regular expression +and designates the target as a CGI script
    ScriptInterpreterSource Registry|Registry-Strict|Script Script svdhC
    Methode zur Ermittlung des Interpreters von +CGI-Skripten
    ScriptLog file-pathsvB
    Location of the CGI script error logfile
    ScriptLogBuffer bytes 1024 svB
    Maximum amount of PUT or POST requests that will be recorded +in the scriptlog
    ScriptLogLength bytes 10385760 svB
    Size limit of the CGI script logfile
    ScriptSock file-path logs/cgisock svB
    The name of the socket to use for communication with +the cgi daemon
    SecureListen [IP-address:]portnumber +Certificate-Name [MUTUAL]sB
    Enables SSL encryption for the specified port
    SendBufferSize Bytes 0 sM
    Größe des TCP-Sendepuffers
    ServerAdmin E-Mail-AdressesvC
    E-Mail-Adresse, die der Server in Fehlermeldungen einfügt, +welche an den Client gesendet werden
    ServerAlias Hostname [Hostname] ...vC
    Alternativer Name für einen Host, der verwendet wird, wenn +Anfragen einem namensbasierten virtuellen Host zugeordnet werden
    ServerLimit AnzahlsM
    Obergrenze für die konfigurierbare Anzahl von + Prozessen
    ServerName +voll-qualifizierter-Domainname[:port]svC
    Rechnername und Port, die der Server dazu verwendet, sich +selbst zu identifizieren
    ServerPath URL-PfadvC
    Veralteter URL-Pfad für einen namensbasierten +virtuellen Host, auf den von einem inkompatiblen Browser zugegriffen +wird
    ServerRoot Verzeichnis /usr/local/apache sC
    Basisverzeichnis der Serverinstallation
    ServerSignature On|Off|EMail Off svdhC
    Konfiguriert die Fußzeile von servergenerierten +Dokumenten
    ServerTokens Major|Minor|Min[imal]|Prod[uctOnly]|OS|Full Full sC
    Konfiguriert den HTTP-Response-Header +Server
    SetEnv env-variable valuesvdhB
    Sets environment variables
    SetEnvIf attribute + regex [!]env-variable[=value] + [[!]env-variable[=value]] ...svdhB
    Sets environment variables based on attributes of the request +
    SetEnvIfNoCase attribute regex + [!]env-variable[=value] + [[!]env-variable[=value]] ...svdhB
    Sets environment variables based on attributes of the request +without respect to case
    SetHandler Handlername|NonesvdhC
    Erzwingt die Verarbeitung aller passenden Dateien durch +einen Handler
    SetInputFilter Filter[;Filter...]svdhC
    Bestimmt die Filter, die Client-Anfragen und POST-Eingaben +verarbeiten
    SetOutputFilter Filter[;Filter...]svdhC
    Bestimmt die Filter, die Antworten des Servers verarbeiten
    SSIEndTag tag "-->" svB
    String that ends an include element
    SSIErrorMsg message "[an error occurred +svdhB
    Error message displayed when there is an SSI +error
    SSIStartTag tag "<!--#" svB
    String that starts an include element
    SSITimeFormat formatstring "%A, %d-%b-%Y %H:%M +svdhB
    Configures the format in which date strings are +displayed
    SSIUndefinedEcho string "(none)" svB
    String displayed when an unset variable is echoed
    SSLCACertificateFile file-pathsvE
    File of concatenated PEM-encoded CA Certificates +for Client Auth
    SSLCACertificatePath directory-pathsvE
    Directory of PEM-encoded CA Certificates for +Client Auth
    SSLCARevocationFile file-pathsvE
    File of concatenated PEM-encoded CA CRLs for +Client Auth
    SSLCARevocationPath directory-pathsvE
    Directory of PEM-encoded CA CRLs for +Client Auth
    SSLCertificateChainFile file-pathsvE
    File of PEM-encoded Server CA Certificates
    SSLCertificateFile file-pathsvE
    Server PEM-encoded X.509 Certificate file
    SSLCertificateKeyFile file-pathsvE
    Server PEM-encoded Private Key file
    SSLCipherSuite cipher-spec ALL:!ADH:RC4+RSA:+H +svdhE
    Cipher Suite available for negotiation in SSL +handshake
    SSLEngine on|off off svE
    SSL Engine Operation Switch
    SSLInsecureRenegotiation flag off svE
    Option to enable support for insecure renegotiation
    SSLMutex type none sE
    Semaphore for internal mutual exclusion of +operations
    SSLOptions [+|-]option ...svdhE
    Configure various SSL engine run-time options
    SSLPassPhraseDialog type builtin sE
    Type of pass phrase dialog for encrypted private +keys
    SSLProtocol [+|-]protocol ... all svE
    Configure usable SSL protocol flavors
    SSLProxyCACertificateFile file-pathsvE
    File of concatenated PEM-encoded CA Certificates +for Remote Server Auth
    SSLProxyCACertificatePath directory-pathsvE
    Directory of PEM-encoded CA Certificates for +Remote Server Auth
    SSLProxyCARevocationFile file-pathsvE
    File of concatenated PEM-encoded CA CRLs for +Remote Server Auth
    SSLProxyCARevocationPath directory-pathsvE
    Directory of PEM-encoded CA CRLs for +Remote Server Auth
    SSLProxyCipherSuite cipher-spec ALL:!ADH:RC4+RSA:+H +svdhE
    Cipher Suite available for negotiation in SSL +proxy handshake
    SSLProxyEngine on|off off svE
    SSL Proxy Engine Operation Switch
    SSLProxyMachineCertificateFile filenamesE
    File of concatenated PEM-encoded client certificates and keys to be used by the proxy
    SSLProxyMachineCertificatePath directorysE
    Directory of PEM-encoded client certificates and keys to be used by the proxy
    SSLProxyProtocol [+|-]protocol ... all svE
    Configure usable SSL protocol flavors for proxy usage
    SSLProxyVerify level none svdhE
    Type of remote server Certificate verification
    SSLProxyVerifyDepth number 1 svdhE
    Maximum depth of CA Certificates in Remote Server +Certificate verification
    SSLRandomSeed context source +[bytes]sE
    Pseudo Random Number Generator (PRNG) seeding +source
    SSLRequire expressiondhE
    Allow access only when an arbitrarily complex +boolean expression is true
    SSLRequireSSLdhE
    Deny access when SSL is not used for the +HTTP request
    SSLSessionCache type none sE
    Type of the global/inter-process SSL Session +Cache
    SSLSessionCacheTimeout seconds 300 svE
    Number of seconds before an SSL session expires +in the Session Cache
    SSLUserName varnamesdhE
    Variable name to determine user name
    SSLVerifyClient level none svdhE
    Type of Client Certificate verification
    SSLVerifyDepth number 1 svdhE
    Maximum depth of CA Certificates in Client +Certificate verification
    StartServers AnzahlsM
    Anzahl der Kindprozesse des Servers, die beim Start erstellt + werden
    StartThreads AnzahlsM
    Anzahl der Threads, die beim Start erstellt werden
    SuexecUserGroup User GroupsvE
    User and group for CGI programs to run as
    ThreadLimit AnzahlsM
    Bestimmt die Obergrenze der konfigurierbaren Anzahl von Threads + pro Kindprozess
    ThreadsPerChild AnzahlsM
    Anzahl der Threads, die mit jedem Kindprozess gestartet + werden
    ThreadStackSize number 65536 sM
    Determine the stack size for each thread
    TimeOut Sekunden 300 sC
    Zeitspanne, die der Server auf verschiedene Ereignisse wartet, +bevor er die Anfrage abbricht
    TraceEnable [on|off|extended] on sC
    Legt das Serververhalten bei TRACE-Anfragen +fest
    TransferLog file|pipesvB
    Specify location of a log file
    TypesConfig file-path conf/mime.types sB
    The location of the mime.types file
    UnsetEnv env-variable [env-variable] +...svdhB
    Removes variables from the environment
    UseCanonicalName On|Off|DNS On svdC
    Bestimmt, wie der Server seinen eigenen Namen und Port +ermittelt
    User Unix-User-ID #-1 sM
    Die Benutzerkennung, unter welcher der Server Anfragen + beantwortet
    UserDir directory-filename public_html svB
    Location of the user-specific directories
    VirtualDocumentRoot interpolated-directory|none none svE
    Dynamically configure the location of the document root +for a given virtual host
    VirtualDocumentRootIP interpolated-directory|none none svE
    Dynamically configure the location of the document root +for a given virtual host
    <VirtualHost + Adresse[:Port] [Adresse[:Port]] + ...> ... </VirtualHost>sC
    Enthält Direktiven, die nur auf bestimmte Hostnamen oder +IP-Adressen angewendet werden
    VirtualScriptAlias interpolated-directory|none none svE
    Dynamically configure the location of the CGI directory for +a given virtual host
    VirtualScriptAliasIP interpolated-directory|none none svE
    Dynamically configure the location of the cgi directory for +a given virtual host
    Win32DisableAcceptExsM
    Für die Annahme von Netzwerkverbindungen wird accept() anstelle von AcceptEx() verwendet
    XBitHack on|off|full off svdhB
    Parse SSI directives in files with the execute bit +set
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/quickreference.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/quickreference.html.en new file mode 100644 index 00000000..5c4b9f59 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/quickreference.html.en @@ -0,0 +1,721 @@ + + + +Directive Quick Reference - Apache HTTP Server + + + + + + +
    <-
    + +

    Directive Quick Reference

    +
    +

    Available Languages:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + +

    The directive quick reference shows the usage, default, status, + and context of each Apache configuration directive. For more + information about each of these, see the Directive Dictionary.

    + +

    The first column gives the directive name and usage. The second + columns shows the default value of the directive, if a default exists. + If the default is too large to display, the first characters will be + followed by "+".

    + +

    The third and fourth columns list the contexts where the directive + is allowed and the status of the directive according to the legend + tables below.

    +
    +
    + + + +
     A  |  B  |  C  |  D  |  E  |  F  |  G  |  H  |  I  |  K  |  L  |  M  |  N  |  O  |  P  |  R  |  S  |  T  |  U  |  V  |  W  |  X  + + + +
    sserver config
    vvirtual host
    ddirectory
    h.htaccess
    + + + + +
    CCore
    MMPM
    BBase
    EExtension
    XExperimental
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AcceptMutex Default|method Default sM
    Method that Apache uses to serialize multiple children +accepting requests on network sockets
    AcceptPathInfo On|Off|Default Default svdhC
    Resources accept trailing pathname information
    AccessFileName filename [filename] ... .htaccess svC
    Name of the distributed configuration file
    Action action-type cgi-scriptsvdhB
    Activates a CGI script for a particular handler or +content-type
    AddAlt string file [file] ...svdhB
    Alternate text to display for a file, instead of an +icon selected by filename
    AddAltByEncoding string MIME-encoding +[MIME-encoding] ...svdhB
    Alternate text to display for a file instead of an icon +selected by MIME-encoding
    AddAltByType string MIME-type +[MIME-type] ...svdhB
    Alternate text to display for a file, instead of an +icon selected by MIME content-type
    AddCharset charset extension +[extension] ...svdhB
    Maps the given filename extensions to the specified content +charset
    AddDefaultCharset On|Off|charset Off svdhC
    Default charset parameter to be added when a response +content-type is text/plain or text/html
    AddDescription string file [file] ...svdhB
    Description to display for a file
    AddEncoding MIME-enc extension +[extension] ...svdhB
    Maps the given filename extensions to the specified encoding +type
    AddHandler handler-name extension +[extension] ...svdhB
    Maps the filename extensions to the specified +handler
    AddIcon icon name [name] +...svdhB
    Icon to display for a file selected by name
    AddIconByEncoding icon MIME-encoding +[MIME-encoding] ...svdhB
    Icon to display next to files selected by MIME +content-encoding
    AddIconByType icon MIME-type +[MIME-type] ...svdhB
    Icon to display next to files selected by MIME +content-type
    AddInputFilter filter[;filter...] +extension [extension] ...svdhB
    Maps filename extensions to the filters that will process +client requests
    AddLanguage MIME-lang extension +[extension] ...svdhB
    Maps the given filename extension to the specified content +language
    AddModuleInfo module-name stringsvE
    Adds additional information to the module +information displayed by the server-info handler
    AddOutputFilter filter[;filter...] +extension [extension] ...svdhB
    Maps filename extensions to the filters that will process +responses from the server
    AddOutputFilterByType filter[;filter...] +MIME-type [MIME-type] ...svdhC
    assigns an output filter to a particular MIME-type
    AddType MIME-type extension +[extension] ...svdhB
    Maps the given filename extensions onto the specified content +type
    Alias URL-path +file-path|directory-pathsvB
    Maps URLs to filesystem locations
    AliasMatch regex +file-path|directory-pathsvB
    Maps URLs to filesystem locations using regular +expressions
    Allow from + all|host|env=env-variable + [host|env=env-variable] ...dhB
    Controls which hosts can access an area of the +server
    AllowCONNECT port [port] ... 443 563 svE
    Ports that are allowed to CONNECT through the +proxy
    AllowEncodedSlashes On|Off Off svC
    Determines whether encoded path separators in URLs are allowed to +be passed through
    AllowOverride All|None|directive-type +[directive-type] ... All dC
    Types of directives that are allowed in +.htaccess files
    Anonymous user [user] ...dhE
    Specifies userIDs that are allowed access without +password verification
    Anonymous_Authoritative On|Off Off dhE
    Configures if authorization will fall-through +to other methods
    Anonymous_LogEmail On|Off On dhE
    Sets whether the password entered will be logged in the +error log
    Anonymous_MustGiveEmail On|Off On dhE
    Specifies whether blank passwords are allowed
    Anonymous_NoUserID On|Off Off dhE
    Sets whether the userID field may be empty
    Anonymous_VerifyEmail On|Off Off dhE
    Sets whether to check the password field for a correctly +formatted email address
    AssignUserID user-id group-idvM
    Tie a virtual host to a user and group ID
    AuthAuthoritative On|Off On dhB
    Sets whether authorization and authentication are +passed to lower level modules
    AuthDBMAuthoritative On|Off On dhE
    Sets whether authentication and authorization will be +passed on to lower level modules
    AuthDBMGroupFile file-pathdhE
    Sets the name of the database file containing the list +of user groups for authentication
    AuthDBMType default|SDBM|GDBM|NDBM|DB default dhE
    Sets the type of database file that is used to +store passwords
    AuthDBMUserFile file-pathdhE
    Sets thename of a database file containing the list of users and +passwords for authentication
    AuthDigestAlgorithm MD5|MD5-sess MD5 dhX
    Selects the algorithm used to calculate the challenge and +response hases in digest authentication
    AuthDigestDomain URI [URI] ...dhX
    URIs that are in the same protection space for digest +authentication
    AuthDigestFile file-pathdhX
    Location of the text file containing the list +of users and encoded passwords for digest authentication
    AuthDigestGroupFile file-pathdhX
    Name of the text file containing the list of groups +for digest authentication
    AuthDigestNcCheck On|Off Off sX
    Enables or disables checking of the nonce-count sent by the +server
    AuthDigestNonceFormat formatdhX
    Determines how the nonce is generated
    AuthDigestNonceLifetime seconds 300 dhX
    How long the server nonce is valid
    AuthDigestQop none|auth|auth-int [auth|auth-int] auth dhX
    Determines the quality-of-protection to use in digest +authentication
    AuthDigestShmemSize size 1000 sX
    The amount of shared memory to allocate for keeping track +of clients
    AuthGroupFile file-pathdhB
    Sets the name of a text file containing the list +of user groups for authentication
    AuthLDAPAuthoritative on|off on dhX
    Prevent other authentication modules from +authenticating the user if this one fails
    AuthLDAPBindDN distinguished-namedhX
    Optional DN to use in binding to the LDAP server
    AuthLDAPBindPassword passworddhX
    Password used in conjuction with the bind DN
    AuthLDAPCharsetConfig file-pathsX
    Language to charset conversion configuration file
    AuthLDAPCompareDNOnServer on|off on dhX
    Use the LDAP server to compare the DNs
    AuthLDAPDereferenceAliases never|searching|finding|always Always dhX
    When will the module de-reference aliases
    AuthLDAPEnabled on|off on dhX
    Turn on or off LDAP authentication
    AuthLDAPFrontPageHack on|off off dhX
    Allow LDAP authentication to work with MS FrontPage
    AuthLDAPGroupAttribute attributedhX
    LDAP attributes used to check for group membership
    AuthLDAPGroupAttributeIsDN on|off on dhX
    Use the DN of the client username when checking for +group membership
    AuthLDAPRemoteUserIsDN on|off off dhX
    Use the DN of the client username to set the REMOTE_USER +environment variable
    AuthLDAPUrl urldhX
    URL specifying the LDAP search parameters
    AuthName auth-domaindhC
    Authorization realm for use in HTTP +authentication
    AuthType Basic|DigestdhC
    Type of user authentication
    AuthUserFile file-pathdhB
    Sets the name of a text file containing the list of users and +passwords for authentication
    BrowserMatch regex [!]env-variable[=value] +[[!]env-variable[=value]] ...svdhB
    Sets environment variables conditional on HTTP User-Agent +
    BrowserMatchNoCase regex [!]env-variable[=value] + [[!]env-variable[=value]] ...svdhB
    Sets environment variables conditional on User-Agent without +respect to case
    BS2000Account accountsM
    Define the non-privileged account on BS2000 +machines
    BufferedLogs On|Off Off sB
    Buffer log entries in memory before writing to disk
    CacheDefaultExpire seconds 3600 (one hour) svX
    The default duration to cache a document when no expiry date is specified.
    CacheDirLength length 2 svX
    The number of characters in subdirectory names
    CacheDirLevels levels 3 svX
    The number of levels of subdirectories in the +cache.
    CacheDisable url-stringsvX
    Disable caching of specified URLs
    CacheEnable cache_type url-stringsvX
    Enable caching of specified URLs using a specified storage +manager
    CacheExpiryCheck On|Off On svX
    Indicates if the cache observes Expires dates when seeking +files
    CacheFile file-path [file-path] ...sX
    Cache a list of file handles at startup time
    CacheForceCompletion Percentage 60 svX
    Percentage of document served, after which the server +will complete caching the file even if the request is cancelled.
    CacheGcClean hours url-string ? svX
    The time to retain unchanged cached files that match a +URL
    CacheGcDaily time ? svX
    The recurring time each day for garbage collection to be run. +(24 hour clock)
    CacheGcInterval hourssvX
    The interval between garbage collection attempts.
    CacheGcMemUsage KBytes ? svX
    The maximum kilobytes of memory used for garbage +collection
    CacheGcUnused hours url-string ? svX
    The time to retain unreferenced cached files that match a +URL.
    CacheIgnoreCacheControl On|Off Off svX
    Ignore the fact that the client requested the content not be +cached.
    CacheIgnoreHeaders header-string [header-string] ... None svX
    Do not store the given HTTP header(s) in the cache. +
    CacheIgnoreNoLastMod On|Off Off svX
    Ignore the fact that a response has no Last Modified +header.
    CacheLastModifiedFactor float 0.1 svX
    The factor used to compute an expiry date based on the +LastModified date.
    CacheMaxExpire seconds 86400 (one day) svX
    The maximum time in seconds to cache a document
    CacheMaxFileSize bytes 1000000 svX
    The maximum size (in bytes) of a document to be placed in the +cache
    CacheMinFileSize bytes 1 svX
    The minimum size (in bytes) of a document to be placed in the +cache
    CacheNegotiatedDocs On|Off Off svB
    Allows content-negotiated documents to be +cached by proxy servers
    CacheRoot directorysvX
    The directory root under which cache files are +stored
    CacheSize KBytes 1000000 svX
    The maximum amount of disk space that will be used by the +cache in KBytes
    CacheTimeMargin ? ? svX
    The minimum time margin to cache a document
    CGIMapExtension cgi-path .extensiondhC
    Technique for locating the interpreter for CGI +scripts
    CharsetDefault charsetsvdhX
    Charset to translate into
    CharsetOptions option [option] ... DebugLevel=0 NoImpl +svdhX
    Configures charset translation behavior
    CharsetSourceEnc charsetsvdhX
    Source charset of files
    CheckSpelling on|off Off svdhE
    Enables the spelling +module
    ChildPerUserID user-id group-id +num-childrensM
    Specify user ID and group ID for a number of child +processes
    ContentDigest On|Off Off svdhC
    Enables the generation of Content-MD5 HTTP Response +headers
    CookieDomain domainsvdhE
    The domain to which the tracking cookie applies
    CookieExpires expiry-periodsvdhE
    Expiry time for the tracking cookie
    CookieLog filenamesvB
    Sets filename for the logging of cookies
    CookieName token Apache svdhE
    Name of the tracking cookie
    CookieStyle + Netscape|Cookie|Cookie2|RFC2109|RFC2965 Netscape svdhE
    Format of the cookie header field
    CookieTracking on|off off svdhE
    Enables tracking cookie
    CoreDumpDirectory directorysM
    Directory where Apache attempts to +switch before dumping core
    CustomLog file|pipe +format|nickname +[env=[!]environment-variable]svB
    Sets filename and format of log file
    Dav On|Off|provider-name Off dE
    Enable WebDAV HTTP methods
    DavDepthInfinity on|off off svdE
    Allow PROPFIND, Depth: Infinity requests
    DavLockDB file-pathsvE
    Location of the DAV lock database
    DavMinTimeout seconds 0 svdE
    Minimum amount of time the server holds a lock on +a DAV resource
    DefaultIcon url-pathsvdhB
    Icon to display for files when no specific icon is +configured
    DefaultLanguage MIME-langsvdhB
    Sets all files in the given scope to the specified +language
    DefaultType MIME-type text/plain svdhC
    MIME content-type that will be sent if the +server cannot determine a type in any other way
    DeflateBufferSize value 8096 svE
    Fragment size to be compressed at one time by zlib
    DeflateCompressionLevel valuesvE
    How much compression do we apply to the output
    DeflateFilterNote [type] notenamesvE
    Places the compression ratio in a note for logging
    DeflateMemLevel value 9 svE
    How much memory should be used by zlib for compression
    DeflateWindowSize value 15 svE
    Zlib compression window size
    Deny from all|host|env=env-variable +[host|env=env-variable] ...dhB
    Controls which hosts are denied access to the +server
    <Directory directory-path> +... </Directory>svC
    Enclose a group of directives that apply only to the +named file-system directory and sub-directories
    DirectoryIndex + local-url [local-url] ... index.html svdhB
    List of resources to look for when the client requests +a directory
    <DirectoryMatch regex> +... </DirectoryMatch>svC
    Enclose directives that apply to +file-system directories matching a regular expression and their +subdirectories
    DirectorySlash On|Off On svdhB
    Toggle trailing slash redirects on or off
    DocumentRoot directory-path /usr/local/apache/h +svC
    Directory that forms the main document tree visible +from the web
    DumpIOInput On|Off Off sX
    Dump all input data to the error log
    DumpIOOutput On|Off Off sX
    Dump all output data to the error log
    EnableExceptionHook On|Off Off sM
    Enables a hook that runs exception handlers +after a crash
    EnableMMAP On|Off On svdhC
    Use memory-mapping to read files during delivery
    EnableSendfile On|Off On svdhC
    Use the kernel sendfile support to deliver files to the client
    ErrorDocument error-code documentsvdhC
    What the server will return to the client +in case of an error
    ErrorLog file-path|syslog[:facility] logs/error_log (Uni +svC
    Location where the server will log errors
    ExamplesvdhX
    Demonstration directive to illustrate the Apache module +API
    ExpiresActive On|OffsvdhE
    Enables generation of Expires +headers
    ExpiresByType MIME-type +<code>secondssvdhE
    Value of the Expires header configured +by MIME type
    ExpiresDefault <code>secondssvdhE
    Default algorithm for calculating expiration time
    ExtendedStatus On|Off Off sB
    Keep track of extended status information for each +request
    ExtFilterDefine filtername parameterssE
    Define an external filter
    ExtFilterOptions option [option] ... DebugLevel=0 NoLogS +dE
    Configure mod_ext_filter options
    FileETag component ... INode MTime Size svdhC
    File attributes used to create the ETag +HTTP response header
    <Files filename> ... </Files>svdhC
    Contains directives that apply to matched +filenames
    <FilesMatch regex> ... </FilesMatch>svdhC
    Contains directives that apply to regular-expression matched +filenames
    ForceLanguagePriority None|Prefer|Fallback [Prefer|Fallback] Prefer svdhB
    Action to take if a single acceptable document is not +found
    ForceType MIME-type|NonedhC
    Forces all matching files to be served with the specified +MIME content-type
    ForensicLog filename|pipesvE
    Sets filename of the forensic log
    Group unix-group #-1 sM
    Group under which the server will answer +requests
    Header [condition] set|append|add|unset|echo +header [value] [env=[!]variable]svdhE
    Configure HTTP response headers
    HeaderName filenamesvdhB
    Name of the file that will be inserted at the top +of the index listing
    HostnameLookups On|Off|Double Off svdC
    Enables DNS lookups on client IP addresses
    IdentityCheck On|Off Off svdC
    Enables logging of the RFC1413 identity of the remote +user
    <IfDefine [!]parameter-name> ... + </IfDefine>svdhC
    Encloses directives that will be processed only +if a test is true at startup
    <IfModule [!]module-name> ... + </IfModule>svdhC
    Encloses directives that are processed conditional on the +presence or absence of a specific module
    <IfVersion [[!]operator] version> ... +</IfVersion>svdhE
    contains version dependent configuration
    ImapBase map|referer|URL http://servername/ svdhB
    Default base for imagemap files
    ImapDefault error|nocontent|map|referer|URL nocontent svdhB
    Default action when an imagemap is called with coordinates +that are not explicitly mapped
    ImapMenu none|formatted|semiformatted|unformattedsvdhB
    Action if no coordinates are given when calling +an imagemap
    Include file-path|directory-pathsvdC
    Includes other configuration files from within +the server configuration files
    IndexIgnore file [file] ...svdhB
    Adds to the list of files to hide when listing +a directory
    IndexOptions [+|-]option [[+|-]option] +...svdhB
    Various configuration settings for directory +indexing
    IndexOrderDefault Ascending|Descending +Name|Date|Size|Description Ascending Name svdhB
    Sets the default ordering of the directory index
    ISAPIAppendLogToErrors on|off off svdhB
    Record HSE_APPEND_LOG_PARAMETER requests from +ISAPI extensions to the error log
    ISAPIAppendLogToQuery on|off on svdhB
    Record HSE_APPEND_LOG_PARAMETER requests from +ISAPI extensions to the query field
    ISAPICacheFile file-path [file-path] +...svB
    ISAPI .dll files to be loaded at startup
    ISAPIFakeAsync on|off off svdhB
    Fake asynchronous support for ISAPI callbacks
    ISAPILogNotSupported on|off off svdhB
    Log unsupported feature requests from ISAPI +extensions
    ISAPIReadAheadBuffer size 49152 svdhB
    Size of the Read Ahead Buffer sent to ISAPI +extensions
    KeepAlive On|Off On svC
    Enables HTTP persistent connections
    KeepAliveTimeout seconds 15 svC
    Amount of time the server will wait for subsequent +requests on a persistent connection
    LanguagePriority MIME-lang [MIME-lang] +...svdhB
    The precendence of language variants for cases where +the client does not express a preference
    LDAPCacheEntries number 1024 sX
    Maximum number of entries in the primary LDAP cache
    LDAPCacheTTL seconds 600 sX
    Time that cached items remain valid
    LDAPConnectionTimeout secondssX
    Specifies the socket connection timeout in seconds
    LDAPOpCacheEntries number 1024 sX
    Number of entries used to cache LDAP compare +operations
    LDAPOpCacheTTL seconds 600 sX
    Time that entries in the operation cache remain +valid
    LDAPSharedCacheFile directory-path/filenamesX
    Sets the shared memory cache file
    LDAPSharedCacheSize bytes 102400 sX
    Size in bytes of the shared-memory cache
    LDAPTrustedCA directory-path/filenamesX
    Sets the file containing the trusted Certificate Authority certificate or database
    LDAPTrustedCAType typesX
    Specifies the type of the Certificate Authority file
    <Limit method [method] ... > ... + </Limit>svdhC
    Restrict enclosed access controls to only certain HTTP +methods
    <LimitExcept method [method] ... > ... + </LimitExcept>svdhC
    Restrict access controls to all HTTP methods +except the named ones
    LimitInternalRecursion number [number] 10 svC
    Determine maximum number of internal redirects and nested +subrequests
    LimitRequestBody bytes 0 svdhC
    Restricts the total size of the HTTP request body sent +from the client
    LimitRequestFields number 100 sC
    Limits the number of HTTP request header fields that +will be accepted from the client
    LimitRequestFieldsize bytessC
    Limits the size of the HTTP request header allowed from the +client
    LimitRequestLine bytes 8190 sC
    Limit the size of the HTTP request line that will be accepted +from the client
    LimitXMLRequestBody bytes 1000000 svdhC
    Limits the size of an XML-based request body
    Listen [IP-address:]portnumbersM
    IP addresses and ports that the server +listens to
    ListenBacklog backlogsM
    Maximum length of the queue of pending connections
    LoadFile filename [filename] ...sE
    Link in the named object file or library
    LoadModule module filenamesE
    Links in the object file or library, and adds to the list +of active modules
    <Location + URL-path|URL> ... </Location>svC
    Applies the enclosed directives only to matching +URLs
    <LocationMatch + regex> ... </LocationMatch>svC
    Applies the enclosed directives only to regular-expression +matching URLs
    LockFile filename logs/accept.lock sM
    Location of the accept serialization lock file
    LogFormat format|nickname +[nickname] "%h %l %u %t \"%r\" +svB
    Describes a format for use in a log file
    LogLevel level warn svC
    Controls the verbosity of the ErrorLog
    MaxClients numbersM
    Maximum number of connections that will be processed +simultaneously
    MaxKeepAliveRequests number 100 svC
    Number of requests allowed on a persistent +connection
    MaxMemFree KBytes 0 sM
    Maximum amount of memory that the main allocator is allowed +to hold without calling free()
    MaxRequestsPerChild number 10000 sM
    Limit on the number of requests that an individual child server +will handle during its life
    MaxRequestsPerThread number 0 sM
    Limit on the number of requests that an individual thread +will handle during its life
    MaxSpareServers number 10 sM
    Maximum number of idle child server processes
    MaxSpareThreads numbersM
    Maximum number of idle threads
    MaxThreads number 2048 sM
    Set the maximum number of worker threads
    MaxThreadsPerChild number 64 sM
    Maximum number of threads per child process
    MCacheMaxObjectCount value 1009 sX
    The maximum number of objects allowed to be placed in the +cache
    MCacheMaxObjectSize bytes 10000 sX
    The maximum size (in bytes) of a document allowed in the +cache
    MCacheMaxStreamingBuffer size_in_bytes the smaller of 1000 +sX
    Maximum amount of a streamed response to buffer in memory +before declaring the response uncacheable
    MCacheMinObjectSize bytes 0 sX
    The minimum size (in bytes) of a document to be allowed in the +cache
    MCacheRemovalAlgorithm LRU|GDSF GDSF sX
    The algorithm used to select documents for removal from the +cache
    MCacheSize KBytes 100 sX
    The maximum amount of memory used by the cache in +KBytes
    MetaDir directory .web svdhE
    Name of the directory to find CERN-style meta information +files
    MetaFiles on|off off svdhE
    Activates CERN meta-file processing
    MetaSuffix suffix .meta svdhE
    File name suffix for the file containg CERN-style +meta information
    MimeMagicFile file-pathsvE
    Enable MIME-type determination based on file contents +using the specified magic file
    MinSpareServers number 5 sM
    Minimum number of idle child server processes
    MinSpareThreads numbersM
    Minimum number of idle threads available to handle request +spikes
    MMapFile file-path [file-path] ...sX
    Map a list of files into memory at startup time
    ModMimeUsePathInfo On|Off Off dB
    Tells mod_mime to treat path_info +components as part of the filename
    MultiviewsMatch Any|NegotiatedOnly|Filters|Handlers +[Handlers|Filters] NegotiatedOnly svdhB
    The types of files that will be included when searching for +a matching file with MultiViews
    NameVirtualHost addr[:port]sC
    Designates an IP address for name-virtual +hosting
    NoProxy host [host] ...svE
    Hosts, domains, or networks that will be connected to +directly
    NumServers number 2 sM
    Total number of children alive at the same time
    NWSSLTrustedCerts filename [filename] ...sB
    List of additional client certificates
    NWSSLUpgradeable [IP-address:]portnumbersB
    Allows a connection to be upgraded to an SSL connection upon request
    Options + [+|-]option [[+|-]option] ... All svdhC
    Configures what features are available in a particular +directory
    Order ordering Deny,Allow dhB
    Controls the default access state and the order in which +Allow and Deny are +evaluated.
    PassEnv env-variable [env-variable] +...svdhB
    Passes environment variables from the shell
    PidFile filename logs/httpd.pid sM
    File where the server records the process ID +of the daemon
    ProtocolEcho On|Off Off svX
    Turn the echo server on or off
    <Proxy wildcard-url> ...</Proxy>svE
    Container for directives applied to proxied resources
    ProxyBadHeader IsError|Ignore|StartBody IsError svE
    Determines how to handle bad header lines in a +response
    ProxyBlock *|word|host|domain +[word|host|domain] ...svE
    Words, hosts, or domains that are banned from being +proxied
    ProxyDomain DomainsvE
    Default domain name for proxied requests
    ProxyErrorOverride On|Off Off svE
    Override error pages for proxied content
    ProxyFtpDirCharset character set ISO-8859-1 svdE
    Define the character set for proxied FTP listings
    ProxyIOBufferSize bytes 8192 svE
    Determine size of internal data throughput buffer
    <ProxyMatch regex> ...</ProxyMatch>svE
    Container for directives applied to regular-expression-matched +proxied resources
    ProxyMaxForwards number 10 svE
    Maximium number of proxies that a request can be forwarded +through
    ProxyPass [path] !|urlsvdE
    Maps remote servers into the local server URL-space
    ProxyPassReverse [path] urlsvdE
    Adjusts the URL in HTTP response headers sent from a reverse +proxied server
    ProxyPreserveHost On|Off Off svE
    Use incoming Host HTTP request header for proxy +request
    ProxyReceiveBufferSize bytes 0 svE
    Network buffer size for proxied HTTP and FTP +connections
    ProxyRemote match remote-serversvE
    Remote proxy used to handle certain requests
    ProxyRemoteMatch regex remote-serversvE
    Remote proxy used to handle requests matched by regular +expressions
    ProxyRequests On|Off Off svE
    Enables forward (standard) proxy requests
    ProxyTimeout seconds 300 svE
    Network timeout for proxied requests
    ProxyVia On|Off|Full|Block Off svE
    Information provided in the Via HTTP response +header for proxied requests
    ReadmeName filenamesvdhB
    Name of the file that will be inserted at the end +of the index listing
    ReceiveBufferSize bytes 0 sM
    TCP receive buffer size
    Redirect [status] URL-path +URLsvdhB
    Sends an external redirect asking the client to fetch +a different URL
    RedirectMatch [status] regex +URLsvdhB
    Sends an external redirect based on a regular expression match +of the current URL
    RedirectPermanent URL-path URLsvdhB
    Sends an external permanent redirect asking the client to fetch +a different URL
    RedirectTemp URL-path URLsvdhB
    Sends an external temporary redirect asking the client to fetch +a different URL
    RemoveCharset extension [extension] +...vdhB
    Removes any character set associations for a set of file +extensions
    RemoveEncoding extension [extension] +...vdhB
    Removes any content encoding associations for a set of file +extensions
    RemoveHandler extension [extension] +...vdhB
    Removes any handler associations for a set of file +extensions
    RemoveInputFilter extension [extension] +...vdhB
    Removes any input filter associations for a set of file +extensions
    RemoveLanguage extension [extension] +...vdhB
    Removes any language associations for a set of file +extensions
    RemoveOutputFilter extension [extension] +...vdhB
    Removes any output filter associations for a set of file +extensions
    RemoveType extension [extension] +...vdhB
    Removes any content type associations for a set of file +extensions
    RequestHeader set|append|add|unset header +[value [env=[!]variable]]svdhE
    Configure HTTP request headers
    Require entity-name [entity-name] ...dhC
    Selects which authenticated users can access +a resource
    RewriteBase URL-pathdhE
    Sets the base URL for per-directory rewrites
    RewriteCond + TestString CondPatternsvdhE
    Defines a condition under which rewriting will take place +
    RewriteEngine on|off off svdhE
    Enables or disables runtime rewriting engine
    RewriteLock file-pathsE
    Sets the name of the lock file used for RewriteMap +synchronization
    RewriteLog file-pathsvE
    Sets the name of the file used for logging rewrite engine +processing
    RewriteLogLevel Level 0 svE
    Sets the verbosity of the log file used by the rewrite +engine
    RewriteMap MapName MapType:MapSource +svE
    Defines a mapping function for key-lookup
    RewriteOptions Options MaxRedirects=10 svdhE
    Sets some special options for the rewrite engine
    RewriteRule + Pattern SubstitutionsvdhE
    Defines rules for the rewriting engine
    RLimitCPU seconds|max [seconds|max]svdhC
    Limits the CPU consumption of processes launched +by Apache children
    RLimitMEM bytes|max [bytes|max]svdhC
    Limits the memory consumption of processes launched +by Apache children
    RLimitNPROC number|max [number|max]svdhC
    Limits the number of processes that can be launched by +processes launched by Apache children
    Satisfy Any|All All dhC
    Interaction between host-level access control and +user authentication
    ScoreBoardFile file-path logs/apache_status sM
    Location of the file used to store coordination data for +the child processes
    Script method cgi-scriptsvdB
    Activates a CGI script for a particular request +method.
    ScriptAlias URL-path +file-path|directory-pathsvB
    Maps a URL to a filesystem location and designates the +target as a CGI script
    ScriptAliasMatch regex +file-path|directory-pathsvB
    Maps a URL to a filesystem location using a regular expression +and designates the target as a CGI script
    ScriptInterpreterSource Registry|Registry-Strict|Script Script svdhC
    Technique for locating the interpreter for CGI +scripts
    ScriptLog file-pathsvB
    Location of the CGI script error logfile
    ScriptLogBuffer bytes 1024 svB
    Maximum amount of PUT or POST requests that will be recorded +in the scriptlog
    ScriptLogLength bytes 10385760 svB
    Size limit of the CGI script logfile
    ScriptSock file-path logs/cgisock svB
    The name of the socket to use for communication with +the cgi daemon
    SecureListen [IP-address:]portnumber +Certificate-Name [MUTUAL]sB
    Enables SSL encryption for the specified port
    SendBufferSize bytes 0 sM
    TCP buffer size
    ServerAdmin email-addresssvC
    Email address that the server includes in error +messages sent to the client
    ServerAlias hostname [hostname] ...vC
    Alternate names for a host used when matching requests +to name-virtual hosts
    ServerLimit numbersM
    Upper limit on configurable number of processes
    ServerName fully-qualified-domain-name[:port]svC
    Hostname and port that the server uses to identify +itself
    ServerPath URL-pathvC
    Legacy URL pathname for a name-based virtual host that +is accessed by an incompatible browser
    ServerRoot directory-path /usr/local/apache sC
    Base directory for the server installation
    ServerSignature On|Off|EMail Off svdhC
    Configures the footer on server-generated documents
    ServerTokens Major|Minor|Min[imal]|Prod[uctOnly]|OS|Full Full sC
    Configures the Server HTTP response +header
    SetEnv env-variable valuesvdhB
    Sets environment variables
    SetEnvIf attribute + regex [!]env-variable[=value] + [[!]env-variable[=value]] ...svdhB
    Sets environment variables based on attributes of the request +
    SetEnvIfNoCase attribute regex + [!]env-variable[=value] + [[!]env-variable[=value]] ...svdhB
    Sets environment variables based on attributes of the request +without respect to case
    SetHandler handler-name|NonesvdhC
    Forces all matching files to be processed by a +handler
    SetInputFilter filter[;filter...]svdhC
    Sets the filters that will process client requests and POST +input
    SetOutputFilter filter[;filter...]svdhC
    Sets the filters that will process responses from the +server
    SSIEndTag tag "-->" svB
    String that ends an include element
    SSIErrorMsg message "[an error occurred +svdhB
    Error message displayed when there is an SSI +error
    SSIStartTag tag "<!--#" svB
    String that starts an include element
    SSITimeFormat formatstring "%A, %d-%b-%Y %H:%M +svdhB
    Configures the format in which date strings are +displayed
    SSIUndefinedEcho string "(none)" svB
    String displayed when an unset variable is echoed
    SSLCACertificateFile file-pathsvE
    File of concatenated PEM-encoded CA Certificates +for Client Auth
    SSLCACertificatePath directory-pathsvE
    Directory of PEM-encoded CA Certificates for +Client Auth
    SSLCARevocationFile file-pathsvE
    File of concatenated PEM-encoded CA CRLs for +Client Auth
    SSLCARevocationPath directory-pathsvE
    Directory of PEM-encoded CA CRLs for +Client Auth
    SSLCertificateChainFile file-pathsvE
    File of PEM-encoded Server CA Certificates
    SSLCertificateFile file-pathsvE
    Server PEM-encoded X.509 Certificate file
    SSLCertificateKeyFile file-pathsvE
    Server PEM-encoded Private Key file
    SSLCipherSuite cipher-spec ALL:!ADH:RC4+RSA:+H +svdhE
    Cipher Suite available for negotiation in SSL +handshake
    SSLEngine on|off off svE
    SSL Engine Operation Switch
    SSLInsecureRenegotiation flag off svE
    Option to enable support for insecure renegotiation
    SSLMutex type none sE
    Semaphore for internal mutual exclusion of +operations
    SSLOptions [+|-]option ...svdhE
    Configure various SSL engine run-time options
    SSLPassPhraseDialog type builtin sE
    Type of pass phrase dialog for encrypted private +keys
    SSLProtocol [+|-]protocol ... all svE
    Configure usable SSL protocol flavors
    SSLProxyCACertificateFile file-pathsvE
    File of concatenated PEM-encoded CA Certificates +for Remote Server Auth
    SSLProxyCACertificatePath directory-pathsvE
    Directory of PEM-encoded CA Certificates for +Remote Server Auth
    SSLProxyCARevocationFile file-pathsvE
    File of concatenated PEM-encoded CA CRLs for +Remote Server Auth
    SSLProxyCARevocationPath directory-pathsvE
    Directory of PEM-encoded CA CRLs for +Remote Server Auth
    SSLProxyCipherSuite cipher-spec ALL:!ADH:RC4+RSA:+H +svdhE
    Cipher Suite available for negotiation in SSL +proxy handshake
    SSLProxyEngine on|off off svE
    SSL Proxy Engine Operation Switch
    SSLProxyMachineCertificateFile filenamesE
    File of concatenated PEM-encoded client certificates and keys to be used by the proxy
    SSLProxyMachineCertificatePath directorysE
    Directory of PEM-encoded client certificates and keys to be used by the proxy
    SSLProxyProtocol [+|-]protocol ... all svE
    Configure usable SSL protocol flavors for proxy usage
    SSLProxyVerify level none svdhE
    Type of remote server Certificate verification
    SSLProxyVerifyDepth number 1 svdhE
    Maximum depth of CA Certificates in Remote Server +Certificate verification
    SSLRandomSeed context source +[bytes]sE
    Pseudo Random Number Generator (PRNG) seeding +source
    SSLRequire expressiondhE
    Allow access only when an arbitrarily complex +boolean expression is true
    SSLRequireSSLdhE
    Deny access when SSL is not used for the +HTTP request
    SSLSessionCache type none sE
    Type of the global/inter-process SSL Session +Cache
    SSLSessionCacheTimeout seconds 300 svE
    Number of seconds before an SSL session expires +in the Session Cache
    SSLUserName varnamesdhE
    Variable name to determine user name
    SSLVerifyClient level none svdhE
    Type of Client Certificate verification
    SSLVerifyDepth number 1 svdhE
    Maximum depth of CA Certificates in Client +Certificate verification
    StartServers numbersM
    Number of child server processes created at startup
    StartThreads numbersM
    Number of threads created on startup
    SuexecUserGroup User GroupsvE
    User and group for CGI programs to run as
    ThreadLimit numbersM
    Sets the upper limit on the configurable number of threads +per child process
    ThreadsPerChild numbersM
    Number of threads created by each child process
    ThreadStackSize number 65536 sM
    Determine the stack size for each thread
    TimeOut seconds 300 svC
    Amount of time the server will wait for +certain events before failing a request
    TraceEnable [on|off|extended] on sC
    Determines the behaviour on TRACE +requests
    TransferLog file|pipesvB
    Specify location of a log file
    TypesConfig file-path conf/mime.types sB
    The location of the mime.types file
    UnsetEnv env-variable [env-variable] +...svdhB
    Removes variables from the environment
    UseCanonicalName On|Off|DNS On svdC
    Configures how the server determines its own name and +port
    User unix-userid #-1 sM
    The userid under which the server will answer +requests
    UserDir directory-filename public_html svB
    Location of the user-specific directories
    VirtualDocumentRoot interpolated-directory|none none svE
    Dynamically configure the location of the document root +for a given virtual host
    VirtualDocumentRootIP interpolated-directory|none none svE
    Dynamically configure the location of the document root +for a given virtual host
    <VirtualHost + addr[:port] [addr[:port]] + ...> ... </VirtualHost>sC
    Contains directives that apply only to a specific +hostname or IP address
    VirtualScriptAlias interpolated-directory|none none svE
    Dynamically configure the location of the CGI directory for +a given virtual host
    VirtualScriptAliasIP interpolated-directory|none none svE
    Dynamically configure the location of the cgi directory for +a given virtual host
    Win32DisableAcceptExsM
    Use accept() rather than AcceptEx() to accept network connections
    XBitHack on|off|full off svdhB
    Parse SSI directives in files with the execute bit +set
    +
    +

    Available Languages:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/quickreference.html.es b/rubbos/app/httpd-2.0.64/docs/manual/mod/quickreference.html.es new file mode 100644 index 00000000..2fe3d6cf --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/quickreference.html.es @@ -0,0 +1,732 @@ + + + +Guía Rápida de Referencia de Directivas - Servidor HTTP Apache + + + + + + +
    <-
    + +

    Guía Rápida de Referencia de Directivas

    +
    +

    Idiomas disponibles:  de  | + en  | + es  | + ja  | + ko  | + ru  | + 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.
    + +

    La Guía Rápida de Referencia de Directivas muestra el uso, las + opciones por defecto, el estado y el contexto de cada directiva de + configuración de Apache. Para más información sobre cada + directiva, consulte el Diccionario + de Directivas.

    + +

    La primera columna muestra el nombre y el uso de la directiva. + La segunda columna muestra el valor por defecto de la directiva, + si existe ese valor por defecto. Si el valor por defecto es + demasiado largo para mostrarlo, el primer caracter va seguido de + un signo "+".

    + +

    La tercera y la cuarta columna listan los contextos en los que + la directiva puede funcionar y el estado de la directiva de + acuerdo con las notas que detallan más abajo.

    +
    +
    + + + +
     A  |  B  |  C  |  D  |  E  |  F  |  G  |  H  |  I  |  K  |  L  |  M  |  N  |  O  |  P  |  R  |  S  |  T  |  U  |  V  |  W  |  X  + + + +
    sserver config
    vvirtual host
    ddirectory
    h.htaccess
    + + + + +
    CCore
    MMPM
    BBase
    EExtensión
    XExperimental
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AcceptMutex Default|method Default sM
    Método que usa Apache para serializar múltiples procesos +hijo que aceptan peticiones en las conexiones de red
    AcceptPathInfo On|Off|Default Default svdhC
    Especifica si los recursos aceptan información de +path añadida (trailing pathname information)
    AccessFileName filename [filename] ... .htaccess svC
    Nombre del fichero de configuración distribuida
    Action action-type cgi-scriptsvdhB
    Activates a CGI script for a particular handler or +content-type
    AddAlt string file [file] ...svdhB
    Alternate text to display for a file, instead of an +icon selected by filename
    AddAltByEncoding string MIME-encoding +[MIME-encoding] ...svdhB
    Alternate text to display for a file instead of an icon +selected by MIME-encoding
    AddAltByType string MIME-type +[MIME-type] ...svdhB
    Alternate text to display for a file, instead of an +icon selected by MIME content-type
    AddCharset charset extension +[extension] ...svdhB
    Maps the given filename extensions to the specified content +charset
    AddDefaultCharset On|Off|charset Off svdhC
    Parámetro del conjunto de caracteres que se +añade cuando el tipo de contenido de una respuesta es +text/plain o text/html
    AddDescription string file [file] ...svdhB
    Description to display for a file
    AddEncoding MIME-enc extension +[extension] ...svdhB
    Maps the given filename extensions to the specified encoding +type
    AddHandler handler-name extension +[extension] ...svdhB
    Maps the filename extensions to the specified +handler
    AddIcon icon name [name] +...svdhB
    Icon to display for a file selected by name
    AddIconByEncoding icon MIME-encoding +[MIME-encoding] ...svdhB
    Icon to display next to files selected by MIME +content-encoding
    AddIconByType icon MIME-type +[MIME-type] ...svdhB
    Icon to display next to files selected by MIME +content-type
    AddInputFilter filter[;filter...] +extension [extension] ...svdhB
    Maps filename extensions to the filters that will process +client requests
    AddLanguage MIME-lang extension +[extension] ...svdhB
    Maps the given filename extension to the specified content +language
    AddModuleInfo module-name stringsvE
    Adds additional information to the module +information displayed by the server-info handler
    AddOutputFilter filter[;filter...] +extension [extension] ...svdhB
    Maps filename extensions to the filters that will process +responses from the server
    AddOutputFilterByType filter[;filter...] +MIME-type [MIME-type] ...svdhC
    Asigna un filtro de +salida a un tipo MIME en particular
    AddType MIME-type extension +[extension] ...svdhB
    Maps the given filename extensions onto the specified content +type
    Alias URL-path +file-path|directory-pathsvB
    Maps URLs to filesystem locations
    AliasMatch regex +file-path|directory-pathsvB
    Maps URLs to filesystem locations using regular +expressions
    Allow from + all|host|env=env-variable + [host|env=env-variable] ...dhB
    Controls which hosts can access an area of the +server
    AllowCONNECT port [port] ... 443 563 svE
    Ports that are allowed to CONNECT through the +proxy
    AllowEncodedSlashes On|Off Off svC
    Determina si se acepta el uso de separadores de +ubicación codificados en las URLs
    AllowOverride All|None|directive-type +[directive-type] ... All dC
    Tipos de directivas que cuyo uso está permitido en los ficheros .htaccess
    Anonymous user [user] ...dhE
    Specifies userIDs that are allowed access without +password verification
    Anonymous_Authoritative On|Off Off dhE
    Configures if authorization will fall-through +to other methods
    Anonymous_LogEmail On|Off On dhE
    Sets whether the password entered will be logged in the +error log
    Anonymous_MustGiveEmail On|Off On dhE
    Specifies whether blank passwords are allowed
    Anonymous_NoUserID On|Off Off dhE
    Sets whether the userID field may be empty
    Anonymous_VerifyEmail On|Off Off dhE
    Sets whether to check the password field for a correctly +formatted email address
    AssignUserID user-id group-idvM
    Tie a virtual host to a user and group ID
    AuthAuthoritative On|Off On dhB
    Sets whether authorization and authentication are +passed to lower level modules
    AuthDBMAuthoritative On|Off On dhE
    Sets whether authentication and authorization will be +passed on to lower level modules
    AuthDBMGroupFile file-pathdhE
    Sets the name of the database file containing the list +of user groups for authentication
    AuthDBMType default|SDBM|GDBM|NDBM|DB default dhE
    Sets the type of database file that is used to +store passwords
    AuthDBMUserFile file-pathdhE
    Sets thename of a database file containing the list of users and +passwords for authentication
    AuthDigestAlgorithm MD5|MD5-sess MD5 dhX
    Selects the algorithm used to calculate the challenge and +response hases in digest authentication
    AuthDigestDomain URI [URI] ...dhX
    URIs that are in the same protection space for digest +authentication
    AuthDigestFile file-pathdhX
    Location of the text file containing the list +of users and encoded passwords for digest authentication
    AuthDigestGroupFile file-pathdhX
    Name of the text file containing the list of groups +for digest authentication
    AuthDigestNcCheck On|Off Off sX
    Enables or disables checking of the nonce-count sent by the +server
    AuthDigestNonceFormat formatdhX
    Determines how the nonce is generated
    AuthDigestNonceLifetime seconds 300 dhX
    How long the server nonce is valid
    AuthDigestQop none|auth|auth-int [auth|auth-int] auth dhX
    Determines the quality-of-protection to use in digest +authentication
    AuthDigestShmemSize size 1000 sX
    The amount of shared memory to allocate for keeping track +of clients
    AuthGroupFile file-pathdhB
    Sets the name of a text file containing the list +of user groups for authentication
    AuthLDAPAuthoritative on|off on dhX
    Prevent other authentication modules from +authenticating the user if this one fails
    AuthLDAPBindDN distinguished-namedhX
    Optional DN to use in binding to the LDAP server
    AuthLDAPBindPassword passworddhX
    Password used in conjuction with the bind DN
    AuthLDAPCharsetConfig file-pathsX
    Language to charset conversion configuration file
    AuthLDAPCompareDNOnServer on|off on dhX
    Use the LDAP server to compare the DNs
    AuthLDAPDereferenceAliases never|searching|finding|always Always dhX
    When will the module de-reference aliases
    AuthLDAPEnabled on|off on dhX
    Turn on or off LDAP authentication
    AuthLDAPFrontPageHack on|off off dhX
    Allow LDAP authentication to work with MS FrontPage
    AuthLDAPGroupAttribute attributedhX
    LDAP attributes used to check for group membership
    AuthLDAPGroupAttributeIsDN on|off on dhX
    Use the DN of the client username when checking for +group membership
    AuthLDAPRemoteUserIsDN on|off off dhX
    Use the DN of the client username to set the REMOTE_USER +environment variable
    AuthLDAPUrl urldhX
    URL specifying the LDAP search parameters
    AuthName auth-domaindhC
    Ambito de autorización para su uso en +autentificación HTTP
    AuthType Basic|DigestdhC
    Tipo de autentificación de usuarios
    AuthUserFile file-pathdhB
    Sets the name of a text file containing the list of users and +passwords for authentication
    BrowserMatch regex [!]env-variable[=value] +[[!]env-variable[=value]] ...svdhB
    Sets environment variables conditional on HTTP User-Agent +
    BrowserMatchNoCase regex [!]env-variable[=value] + [[!]env-variable[=value]] ...svdhB
    Sets environment variables conditional on User-Agent without +respect to case
    BS2000Account accountsM
    Define la cuenta sin privilegios en máquinas +BS2000
    BufferedLogs On|Off Off sB
    Buffer log entries in memory before writing to disk
    CacheDefaultExpire seconds 3600 (one hour) svX
    The default duration to cache a document when no expiry date is specified.
    CacheDirLength length 2 svX
    The number of characters in subdirectory names
    CacheDirLevels levels 3 svX
    The number of levels of subdirectories in the +cache.
    CacheDisable url-stringsvX
    Disable caching of specified URLs
    CacheEnable cache_type url-stringsvX
    Enable caching of specified URLs using a specified storage +manager
    CacheExpiryCheck On|Off On svX
    Indicates if the cache observes Expires dates when seeking +files
    CacheFile file-path [file-path] ...sX
    Cache a list of file handles at startup time
    CacheForceCompletion Percentage 60 svX
    Percentage of document served, after which the server +will complete caching the file even if the request is cancelled.
    CacheGcClean hours url-string ? svX
    The time to retain unchanged cached files that match a +URL
    CacheGcDaily time ? svX
    The recurring time each day for garbage collection to be run. +(24 hour clock)
    CacheGcInterval hourssvX
    The interval between garbage collection attempts.
    CacheGcMemUsage KBytes ? svX
    The maximum kilobytes of memory used for garbage +collection
    CacheGcUnused hours url-string ? svX
    The time to retain unreferenced cached files that match a +URL.
    CacheIgnoreCacheControl On|Off Off svX
    Ignore the fact that the client requested the content not be +cached.
    CacheIgnoreHeaders header-string [header-string] ... None svX
    Do not store the given HTTP header(s) in the cache. +
    CacheIgnoreNoLastMod On|Off Off svX
    Ignore the fact that a response has no Last Modified +header.
    CacheLastModifiedFactor float 0.1 svX
    The factor used to compute an expiry date based on the +LastModified date.
    CacheMaxExpire seconds 86400 (one day) svX
    The maximum time in seconds to cache a document
    CacheMaxFileSize bytes 1000000 svX
    The maximum size (in bytes) of a document to be placed in the +cache
    CacheMinFileSize bytes 1 svX
    The minimum size (in bytes) of a document to be placed in the +cache
    CacheNegotiatedDocs On|Off Off svB
    Allows content-negotiated documents to be +cached by proxy servers
    CacheRoot directorysvX
    The directory root under which cache files are +stored
    CacheSize KBytes 1000000 svX
    The maximum amount of disk space that will be used by the +cache in KBytes
    CacheTimeMargin ? ? svX
    The minimum time margin to cache a document
    CGIMapExtension cgi-path +.extensiondhC
    Técnica para localizar +un intérprete de scripts CGI
    CharsetDefault charsetsvdhX
    Charset to translate into
    CharsetOptions option [option] ... DebugLevel=0 NoImpl +svdhX
    Configures charset translation behavior
    CharsetSourceEnc charsetsvdhX
    Source charset of files
    CheckSpelling on|off Off svdhE
    Enables the spelling +module
    ChildPerUserID user-id group-id +num-childrensM
    Specify user ID and group ID for a number of child +processes
    ContentDigest On|Off Off svdhC
    Activa la generación de cabeceras de respuesta HTTP +Content-MD5
    CookieDomain domainsvdhE
    The domain to which the tracking cookie applies
    CookieExpires expiry-periodsvdhE
    Expiry time for the tracking cookie
    CookieLog filenamesvB
    Sets filename for the logging of cookies
    CookieName token Apache svdhE
    Name of the tracking cookie
    CookieStyle + Netscape|Cookie|Cookie2|RFC2109|RFC2965 Netscape svdhE
    Format of the cookie header field
    CookieTracking on|off off svdhE
    Enables tracking cookie
    CoreDumpDirectory directorysM
    Directorio al que Apache intenta cambiarse antes de +realizar un volcado de memoria
    CustomLog file|pipe +format|nickname +[env=[!]environment-variable]svB
    Sets filename and format of log file
    Dav On|Off|provider-name Off dE
    Enable WebDAV HTTP methods
    DavDepthInfinity on|off off svdE
    Allow PROPFIND, Depth: Infinity requests
    DavLockDB file-pathsvE
    Location of the DAV lock database
    DavMinTimeout seconds 0 svdE
    Minimum amount of time the server holds a lock on +a DAV resource
    DefaultIcon url-pathsvdhB
    Icon to display for files when no specific icon is +configured
    DefaultLanguage MIME-langsvdhB
    Sets all files in the given scope to the specified +language
    DefaultType MIME-type text/plain svdhC
    Tipo de contenido MIME por defecto que usará el servidor si no +puede determinar el tipo MIME en concreto del documento a servir
    DeflateBufferSize value 8096 svE
    Fragment size to be compressed at one time by zlib
    DeflateCompressionLevel valuesvE
    How much compression do we apply to the output
    DeflateFilterNote [type] notenamesvE
    Places the compression ratio in a note for logging
    DeflateMemLevel value 9 svE
    How much memory should be used by zlib for compression
    DeflateWindowSize value 15 svE
    Zlib compression window size
    Deny from all|host|env=env-variable +[host|env=env-variable] ...dhB
    Controls which hosts are denied access to the +server
    <Directory directory-path> +... </Directory>svC
    Engloba a un grupo de directivas +que se aplicarán solamente al directorio del sistema de ficheros +especificado y a sus subdirectorios
    DirectoryIndex + local-url [local-url] ... index.html svdhB
    List of resources to look for when the client requests +a directory
    <DirectoryMatch regex> +... </DirectoryMatch>svC
    Incluye las directivas que se +aplican a los directorios y subdirectorios del sistema de ficheros que +equivalen a una expresión regular
    DirectorySlash On|Off On svdhB
    Toggle trailing slash redirects on or off
    DocumentRoot directory-path /usr/local/apache/h +svC
    Directorio principal que contiene la estructura de +directorios visible desde la web
    DumpIOInput On|Off Off sX
    Dump all input data to the error log
    DumpIOOutput On|Off Off sX
    Dump all output data to the error log
    EnableExceptionHook On|Off Off sM
    Activa un hook que inicia handlers de excepción +después de un error irrecuperable
    EnableMMAP On|Off On svdhC
    Permite el uso de mapeo de memoria para leer archivos mientras se +sirven
    EnableSendfile On|Off On svdhC
    Permite el uso del soporte de sendfile del kernel para servir ficheros @@@@@ Use the kernel sendfile support to deliver files to the client @@@@@
    ErrorDocument error-code +documentsvdhC
    Es lo que el servidor devuelve al cliente si se produce +algún error
    ErrorLog file-path|syslog[:facility] logs/error_log (Uni +svC
    Ubicación del fichero en +el que se almacenan los mensajes de error
    ExamplesvdhX
    Demonstration directive to illustrate the Apache module +API
    ExpiresActive On|OffsvdhE
    Enables generation of Expires +headers
    ExpiresByType MIME-type +<code>secondssvdhE
    Value of the Expires header configured +by MIME type
    ExpiresDefault <code>secondssvdhE
    Default algorithm for calculating expiration time
    ExtendedStatus On|Off Off sB
    Keep track of extended status information for each +request
    ExtFilterDefine filtername parameterssE
    Define an external filter
    ExtFilterOptions option [option] ... DebugLevel=0 NoLogS +dE
    Configure mod_ext_filter options
    FileETag component ... INode MTime Size svdhC
    Atributos de fichero usados para crear la ETAG de la +cabecera de respuesta HTTP
    <Files filename> ... </Files>svdhC
    Contiene directivas que se aplican a los ficheros cuyos +nombres coincidan con los que se especifiquen
    <FilesMatch regex> ... </FilesMatch>svdhC
    Contiene las directivas que se aplican a los ficheros +cuyos nombres equivalen a las expresiones regulares que se especifiquen
    ForceLanguagePriority None|Prefer|Fallback [Prefer|Fallback] Prefer svdhB
    Action to take if a single acceptable document is not +found
    ForceType MIME-type|NonedhC
    Hace que todos los ficheros cuyos nombres tengan una equivalencia con con lo que se especifique sean +servidos como contenido del tipo MIME que se establezca
    ForensicLog filename|pipesvE
    Sets filename of the forensic log
    Group unix-group #-1 sM
    Grupo con el que el servidor atenderá las +peticiones
    Header [condition] set|append|add|unset|echo +header [value] [env=[!]variable]svdhE
    Configure HTTP response headers
    HeaderName filenamesvdhB
    Name of the file that will be inserted at the top +of the index listing
    HostnameLookups On|Off|Double Off svdC
    Activa la resolución de +DNS de las direcciones IP de los clientes
    IdentityCheck On|Off Off svdC
    Activa que se registre en los archivos log la entidad RFC1413 del usuario remoto
    <IfDefine [!]parameter-name> ... + </IfDefine>svdhC
    Engloba directivas que serán procesadas solo si se +cumple una determinada condición al iniciar el servidor
    <IfModule [!]module-name> ... + </IfModule>svdhC
    Engloba directivas que se procesan de forma condicional +según esté presente o ausente un módulo específico
    <IfVersion [[!]operator] version> ... +</IfVersion>svdhE
    contains version dependent configuration
    ImapBase map|referer|URL http://servername/ svdhB
    Default base for imagemap files
    ImapDefault error|nocontent|map|referer|URL nocontent svdhB
    Default action when an imagemap is called with coordinates +that are not explicitly mapped
    ImapMenu none|formatted|semiformatted|unformattedsvdhB
    Action if no coordinates are given when calling +an imagemap
    Include file-path|directory-pathsvdC
    Incluye otros ficheros de configuración dentro de +los ficheros de configuración del servidor
    IndexIgnore file [file] ...svdhB
    Adds to the list of files to hide when listing +a directory
    IndexOptions [+|-]option [[+|-]option] +...svdhB
    Various configuration settings for directory +indexing
    IndexOrderDefault Ascending|Descending +Name|Date|Size|Description Ascending Name svdhB
    Sets the default ordering of the directory index
    ISAPIAppendLogToErrors on|off off svdhB
    Record HSE_APPEND_LOG_PARAMETER requests from +ISAPI extensions to the error log
    ISAPIAppendLogToQuery on|off on svdhB
    Record HSE_APPEND_LOG_PARAMETER requests from +ISAPI extensions to the query field
    ISAPICacheFile file-path [file-path] +...svB
    ISAPI .dll files to be loaded at startup
    ISAPIFakeAsync on|off off svdhB
    Fake asynchronous support for ISAPI callbacks
    ISAPILogNotSupported on|off off svdhB
    Log unsupported feature requests from ISAPI +extensions
    ISAPIReadAheadBuffer size 49152 svdhB
    Size of the Read Ahead Buffer sent to ISAPI +extensions
    KeepAlive On|Off On svC
    Permite que se establezcan conexiones HTTP +persistentes
    KeepAliveTimeout seconds 15 svC
    Tiempo que el servidor esperará peticiones subsiguientes +en conexiones persistentes
    LanguagePriority MIME-lang [MIME-lang] +...svdhB
    The precendence of language variants for cases where +the client does not express a preference
    LDAPCacheEntries number 1024 sX
    Maximum number of entries in the primary LDAP cache
    LDAPCacheTTL seconds 600 sX
    Time that cached items remain valid
    LDAPConnectionTimeout secondssX
    Specifies the socket connection timeout in seconds
    LDAPOpCacheEntries number 1024 sX
    Number of entries used to cache LDAP compare +operations
    LDAPOpCacheTTL seconds 600 sX
    Time that entries in the operation cache remain +valid
    LDAPSharedCacheFile directory-path/filenamesX
    Sets the shared memory cache file
    LDAPSharedCacheSize bytes 102400 sX
    Size in bytes of the shared-memory cache
    LDAPTrustedCA directory-path/filenamesX
    Sets the file containing the trusted Certificate Authority certificate or database
    LDAPTrustedCAType typesX
    Specifies the type of the Certificate Authority file
    <Limit method [method] ... > ... + </Limit>svdhC
    Restringe la aplicación de los controles de acceso incluidos a solo ciertos métodos HTTP
    <LimitExcept method [method] ... > + ... </LimitExcept>svdhC
    Restringe los controles de acceso a todos los métodos +HTTP excepto a los que se especifiquen
    LimitInternalRecursion number [number] 10 svC
    Determina el número máximo de redirecciones internas y +subpeticiones anidadas
    LimitRequestBody bytes 0 svdhC
    Restringe el tamaño total del cuerpo de las peticiones +HTTP enviadas desde el cliente
    LimitRequestFields number 100 sC
    Limita el número de campos de la cabecera de las +peticiones HTTP del cliente que serán aceptadas
    LimitRequestFieldsize bytessC
    Limita el tamaño permitido de las cabeceras de las peticiones HTTP de los clientes
    LimitRequestLine bytes 8190 sC
    Limita el tamaño la línea de petición HTTP que será +aceptada
    LimitXMLRequestBody bytes 1000000 svdhC
    Limita el tamaño del cuerpo de una petición XML
    Listen [IP-address:]portnumbersM
    Direcciones IP y puertos en los que escucha el servidor
    ListenBacklog backlogsM
    Longitud máxima de la cola de conexiones en espera
    LoadFile filename [filename] ...sE
    Link in the named object file or library
    LoadModule module filenamesE
    Links in the object file or library, and adds to the list +of active modules
    <Location + URL-path|URL> ... </Location>svC
    Aplica las directivas que contiene solo a las URLs que tengan una equivalencia con los valores que se especifiquen
    <LocationMatch + regex> ... </LocationMatch>svC
    Aplica las directiva que incluye solo a las URLs que tengan equivalencia con alguna de las expresiones regulares que se especifiquen
    LockFile filename logs/accept.lock sM
    Ubicación del fichero de lock de serialización de aceptacioón de peticiones
    LogFormat format|nickname +[nickname] "%h %l %u %t \"%r\" +svB
    Describes a format for use in a log file
    LogLevel level warn svC
    Controla la extensión de los mensajes que se almacenan +en el ErrorLog
    MaxClients numbersM
    Número máximo de procesos hijo que serán creados para +atender peticiones
    MaxKeepAliveRequests number 100 svC
    Número de peticiones permitidas en una conexión +persistente
    MaxMemFree KBytes 0 sM
    Cantidad máxima de memoria que el asignador principal puede tomar sin hacer una llamada a free()
    MaxRequestsPerChild number 10000 sM
    Límite en el número de peticiones que un proceso hijo puede +atender durante su vida
    MaxRequestsPerThread number 0 sM
    Limita el número de peticiones que una hebra (thread) puede +atender durante su vida
    MaxSpareServers number 10 sM
    Número máximo de procesos hijo en espera que +puede tener el servdor
    MaxSpareThreads numbersM
    Número máximo de hebras en espera
    MaxThreads number 2048 sM
    Set the maximum number of worker threads
    MaxThreadsPerChild number 64 sM
    Maximum number of threads per child process
    MCacheMaxObjectCount value 1009 sX
    The maximum number of objects allowed to be placed in the +cache
    MCacheMaxObjectSize bytes 10000 sX
    The maximum size (in bytes) of a document allowed in the +cache
    MCacheMaxStreamingBuffer size_in_bytes the smaller of 1000 +sX
    Maximum amount of a streamed response to buffer in memory +before declaring the response uncacheable
    MCacheMinObjectSize bytes 0 sX
    The minimum size (in bytes) of a document to be allowed in the +cache
    MCacheRemovalAlgorithm LRU|GDSF GDSF sX
    The algorithm used to select documents for removal from the +cache
    MCacheSize KBytes 100 sX
    The maximum amount of memory used by the cache in +KBytes
    MetaDir directory .web svdhE
    Name of the directory to find CERN-style meta information +files
    MetaFiles on|off off svdhE
    Activates CERN meta-file processing
    MetaSuffix suffix .meta svdhE
    File name suffix for the file containg CERN-style +meta information
    MimeMagicFile file-pathsvE
    Enable MIME-type determination based on file contents +using the specified magic file
    MinSpareServers number 5 sM
    Número mínimo de procesos hijo en espera
    MinSpareThreads numbersM
    Número mínimo de hebras en espera para atender picos de +demanda en las peticiones
    MMapFile file-path [file-path] ...sX
    Map a list of files into memory at startup time
    ModMimeUsePathInfo On|Off Off dB
    Tells mod_mime to treat path_info +components as part of the filename
    MultiviewsMatch Any|NegotiatedOnly|Filters|Handlers +[Handlers|Filters] NegotiatedOnly svdhB
    The types of files that will be included when searching for +a matching file with MultiViews
    NameVirtualHost addr[:port]sC
    Designa una dirección IP para usar hosting virtual basado en nombres
    NoProxy host [host] ...svE
    Hosts, domains, or networks that will be connected to +directly
    NumServers number 2 sM
    Total number of children alive at the same time
    NWSSLTrustedCerts filename [filename] ...sB
    List of additional client certificates
    NWSSLUpgradeable [IP-address:]portnumbersB
    Allows a connection to be upgraded to an SSL connection upon request
    Options + [+|-]option [[+|-]option] ... All svdhC
    Configura las funcionalidades disponibles en un directorio en particular
    Order ordering Deny,Allow dhB
    Controls the default access state and the order in which +Allow and Deny are +evaluated.
    PassEnv env-variable [env-variable] +...svdhB
    Passes environment variables from the shell
    PidFile filename logs/httpd.pid sM
    Fichero en el que el servidor guarda +el ID del proceso demonio de escucha (daemon)
    ProtocolEcho On|Off Off svX
    Turn the echo server on or off
    <Proxy wildcard-url> ...</Proxy>svE
    Container for directives applied to proxied resources
    ProxyBadHeader IsError|Ignore|StartBody IsError svE
    Determines how to handle bad header lines in a +response
    ProxyBlock *|word|host|domain +[word|host|domain] ...svE
    Words, hosts, or domains that are banned from being +proxied
    ProxyDomain DomainsvE
    Default domain name for proxied requests
    ProxyErrorOverride On|Off Off svE
    Override error pages for proxied content
    ProxyFtpDirCharset character set ISO-8859-1 svdE
    Define the character set for proxied FTP listings
    ProxyIOBufferSize bytes 8192 svE
    Determine size of internal data throughput buffer
    <ProxyMatch regex> ...</ProxyMatch>svE
    Container for directives applied to regular-expression-matched +proxied resources
    ProxyMaxForwards number 10 svE
    Maximium number of proxies that a request can be forwarded +through
    ProxyPass [path] !|urlsvdE
    Maps remote servers into the local server URL-space
    ProxyPassReverse [path] urlsvdE
    Adjusts the URL in HTTP response headers sent from a reverse +proxied server
    ProxyPreserveHost On|Off Off svE
    Use incoming Host HTTP request header for proxy +request
    ProxyReceiveBufferSize bytes 0 svE
    Network buffer size for proxied HTTP and FTP +connections
    ProxyRemote match remote-serversvE
    Remote proxy used to handle certain requests
    ProxyRemoteMatch regex remote-serversvE
    Remote proxy used to handle requests matched by regular +expressions
    ProxyRequests On|Off Off svE
    Enables forward (standard) proxy requests
    ProxyTimeout seconds 300 svE
    Network timeout for proxied requests
    ProxyVia On|Off|Full|Block Off svE
    Information provided in the Via HTTP response +header for proxied requests
    ReadmeName filenamesvdhB
    Name of the file that will be inserted at the end +of the index listing
    Redirect [status] URL-path +URLsvdhB
    Sends an external redirect asking the client to fetch +a different URL
    RedirectMatch [status] regex +URLsvdhB
    Sends an external redirect based on a regular expression match +of the current URL
    RedirectPermanent URL-path URLsvdhB
    Sends an external permanent redirect asking the client to fetch +a different URL
    RedirectTemp URL-path URLsvdhB
    Sends an external temporary redirect asking the client to fetch +a different URL
    RemoveCharset extension [extension] +...vdhB
    Removes any character set associations for a set of file +extensions
    RemoveEncoding extension [extension] +...vdhB
    Removes any content encoding associations for a set of file +extensions
    RemoveHandler extension [extension] +...vdhB
    Removes any handler associations for a set of file +extensions
    RemoveInputFilter extension [extension] +...vdhB
    Removes any input filter associations for a set of file +extensions
    RemoveLanguage extension [extension] +...vdhB
    Removes any language associations for a set of file +extensions
    RemoveOutputFilter extension [extension] +...vdhB
    Removes any output filter associations for a set of file +extensions
    RemoveType extension [extension] +...vdhB
    Removes any content type associations for a set of file +extensions
    RequestHeader set|append|add|unset header +[value [env=[!]variable]]svdhE
    Configure HTTP request headers
    Require entity-name [entity-name] ...dhC
    Selecciona qué usuarios autentificados pueden acceder a +un recurso
    RewriteBase URL-pathdhE
    Sets the base URL for per-directory rewrites
    RewriteCond + TestString CondPatternsvdhE
    Defines a condition under which rewriting will take place +
    RewriteEngine on|off off svdhE
    Enables or disables runtime rewriting engine
    RewriteLock file-pathsE
    Sets the name of the lock file used for RewriteMap +synchronization
    RewriteLog file-pathsvE
    Sets the name of the file used for logging rewrite engine +processing
    RewriteLogLevel Level 0 svE
    Sets the verbosity of the log file used by the rewrite +engine
    RewriteMap MapName MapType:MapSource +svE
    Defines a mapping function for key-lookup
    RewriteOptions Options MaxRedirects=10 svdhE
    Sets some special options for the rewrite engine
    RewriteRule + Pattern SubstitutionsvdhE
    Defines rules for the rewriting engine
    RLimitCPU seconds|max [seconds|max]svdhC
    Limita el consumo de tiempo de CPU que pueden hacer proceses creados +por procesos hijo de Apache
    RLimitMEM bytes|max [bytes|max]svdhC
    Limita el consumo de memoria que pueden hacer procesos creados por procesos hijo de Apache
    RLimitNPROC number|max [number|max]svdhC
    Limita el número de procesos que pueden crearse por parte de +procesos creados por procesos hijo de Apache
    Satisfy Any|All All dhC
    Interacción entre el control de acceso basado en host +y la autentificación de usuarios
    ScoreBoardFile file-path logs/apache_status sM
    Ubicación del fichero que almacena los datos necesarios para +coordinar el funcionamiento de los procesos hijo del servidor
    Script method cgi-scriptsvdB
    Activates a CGI script for a particular request +method.
    ScriptAlias URL-path +file-path|directory-pathsvB
    Maps a URL to a filesystem location and designates the +target as a CGI script
    ScriptAliasMatch regex +file-path|directory-pathsvB
    Maps a URL to a filesystem location using a regular expression +and designates the target as a CGI script
    ScriptInterpreterSource Registry|Registry-Strict|Script Script svdhC
    Técnica para ubicar el intérprete de scripts CGI's
    ScriptLog file-pathsvB
    Location of the CGI script error logfile
    ScriptLogBuffer bytes 1024 svB
    Maximum amount of PUT or POST requests that will be recorded +in the scriptlog
    ScriptLogLength bytes 10385760 svB
    Size limit of the CGI script logfile
    ScriptSock file-path logs/cgisock svB
    The name of the socket to use for communication with +the cgi daemon
    SecureListen [IP-address:]portnumber +Certificate-Name [MUTUAL]sB
    Enables SSL encryption for the specified port
    SendBufferSize bytes 0 sM
    Tamaño del buffer TCP
    ServerAdmin email-addresssvC
    Dirección de email que el servidor incluye en los +mensajes de error que se envían al cliente
    ServerAlias hostname [hostname] ...vC
    Nombres alternativos usados para un host cuando se +intentan encontrar equivalencias a hosts virtuales basados en el +nombre
    ServerLimit numbersM
    Límite superior del número configurable de procesos
    ServerName fully-qualified-domain-name[:port]svC
    Nombre de host y número de puerto que el servidor usa +para identificarse
    ServerPath URL-pathvC
    URL que se usará para hosts virtuales basados en +nombre que son accedidos con un navegador incompatible
    ServerRoot directory-path /usr/local/apache sC
    Directorio base de la instalación del servidor
    ServerSignature On|Off|EMail Off svdhC
    Configura el pie de página en documentos generados +por el servidor
    ServerTokens Major|Minor|Min[imal]|Prod[uctOnly]|OS|Full Full sC
    Configura la cabecera de respuesta HTTP +Server
    SetEnv env-variable valuesvdhB
    Sets environment variables
    SetEnvIf attribute + regex [!]env-variable[=value] + [[!]env-variable[=value]] ...svdhB
    Sets environment variables based on attributes of the request +
    SetEnvIfNoCase attribute regex + [!]env-variable[=value] + [[!]env-variable[=value]] ...svdhB
    Sets environment variables based on attributes of the request +without respect to case
    SetHandler handler-name|NonesvdhC
    Hace que todos los ficheros que correspondan con el valor +especificado sean procesados obligatoriamente por un +handler
    SetInputFilter filter[;filter...]svdhC
    Especifica los filtros que procesarán las peticiones de +los clientes y el contenido de peticiones POST
    SetOutputFilter filter[;filter...]svdhC
    Especifica los filtros que procesarán las respuestas del +servidor
    SSIEndTag tag "-->" svB
    String that ends an include element
    SSIErrorMsg message "[an error occurred +svdhB
    Error message displayed when there is an SSI +error
    SSIStartTag tag "<!--#" svB
    String that starts an include element
    SSITimeFormat formatstring "%A, %d-%b-%Y %H:%M +svdhB
    Configures the format in which date strings are +displayed
    SSIUndefinedEcho string "(none)" svB
    String displayed when an unset variable is echoed
    SSLCACertificateFile file-pathsvE
    File of concatenated PEM-encoded CA Certificates +for Client Auth
    SSLCACertificatePath directory-pathsvE
    Directory of PEM-encoded CA Certificates for +Client Auth
    SSLCARevocationFile file-pathsvE
    File of concatenated PEM-encoded CA CRLs for +Client Auth
    SSLCARevocationPath directory-pathsvE
    Directory of PEM-encoded CA CRLs for +Client Auth
    SSLCertificateChainFile file-pathsvE
    File of PEM-encoded Server CA Certificates
    SSLCertificateFile file-pathsvE
    Server PEM-encoded X.509 Certificate file
    SSLCertificateKeyFile file-pathsvE
    Server PEM-encoded Private Key file
    SSLCipherSuite cipher-spec ALL:!ADH:RC4+RSA:+H +svdhE
    Cipher Suite available for negotiation in SSL +handshake
    SSLEngine on|off off svE
    SSL Engine Operation Switch
    SSLInsecureRenegotiation flag off svE
    Option to enable support for insecure renegotiation
    SSLMutex type none sE
    Semaphore for internal mutual exclusion of +operations
    SSLOptions [+|-]option ...svdhE
    Configure various SSL engine run-time options
    SSLPassPhraseDialog type builtin sE
    Type of pass phrase dialog for encrypted private +keys
    SSLProtocol [+|-]protocol ... all svE
    Configure usable SSL protocol flavors
    SSLProxyCACertificateFile file-pathsvE
    File of concatenated PEM-encoded CA Certificates +for Remote Server Auth
    SSLProxyCACertificatePath directory-pathsvE
    Directory of PEM-encoded CA Certificates for +Remote Server Auth
    SSLProxyCARevocationFile file-pathsvE
    File of concatenated PEM-encoded CA CRLs for +Remote Server Auth
    SSLProxyCARevocationPath directory-pathsvE
    Directory of PEM-encoded CA CRLs for +Remote Server Auth
    SSLProxyCipherSuite cipher-spec ALL:!ADH:RC4+RSA:+H +svdhE
    Cipher Suite available for negotiation in SSL +proxy handshake
    SSLProxyEngine on|off off svE
    SSL Proxy Engine Operation Switch
    SSLProxyMachineCertificateFile filenamesE
    File of concatenated PEM-encoded client certificates and keys to be used by the proxy
    SSLProxyMachineCertificatePath directorysE
    Directory of PEM-encoded client certificates and keys to be used by the proxy
    SSLProxyProtocol [+|-]protocol ... all svE
    Configure usable SSL protocol flavors for proxy usage
    SSLProxyVerify level none svdhE
    Type of remote server Certificate verification
    SSLProxyVerifyDepth number 1 svdhE
    Maximum depth of CA Certificates in Remote Server +Certificate verification
    SSLRandomSeed context source +[bytes]sE
    Pseudo Random Number Generator (PRNG) seeding +source
    SSLRequire expressiondhE
    Allow access only when an arbitrarily complex +boolean expression is true
    SSLRequireSSLdhE
    Deny access when SSL is not used for the +HTTP request
    SSLSessionCache type none sE
    Type of the global/inter-process SSL Session +Cache
    SSLSessionCacheTimeout seconds 300 svE
    Number of seconds before an SSL session expires +in the Session Cache
    SSLUserName varnamesdhE
    Variable name to determine user name
    SSLVerifyClient level none svdhE
    Type of Client Certificate verification
    SSLVerifyDepth number 1 svdhE
    Maximum depth of CA Certificates in Client +Certificate verification
    StartServers numbersM
    Número de procesos hijo del servidor que se crean al +iniciar Apache
    StartThreads numbersM
    Número de hebras que se crean al iniciar Apache
    SuexecUserGroup User GroupsvE
    User and group for CGI programs to run as
    ThreadLimit numbersM
    Marca el límite superior del número de hebras por +proceso hijo que pueden especificarse
    ThreadsPerChild numbersM
    Número de hebras creadas por cada proceso +hijo
    ThreadStackSize number 65536 sM
    Determine the stack size for each thread
    TimeOut seconds 300 sC
    Cantidad de tiempo que el servidor esperará para que +ocurran determinados eventos antes de cerrar una +petición
    TransferLog file|pipesvB
    Specify location of a log file
    TypesConfig file-path conf/mime.types sB
    The location of the mime.types file
    UnsetEnv env-variable [env-variable] +...svdhB
    Removes variables from the environment
    UseCanonicalName On|Off|DNS On svdC
    Configura la forma en que el servidor determina su propio +nombre u puerto
    User unix-userid #-1 sM
    Nombre de usuario con el que el servidor responderá a las +peticiones
    UserDir directory-filename public_html svB
    Location of the user-specific directories
    VirtualDocumentRoot interpolated-directory|none none svE
    Dynamically configure the location of the document root +for a given virtual host
    VirtualDocumentRootIP interpolated-directory|none none svE
    Dynamically configure the location of the document root +for a given virtual host
    <VirtualHost + addr[:port] [addr[:port]] + ...> ... </VirtualHost>sC
    Contiene las directivas que se aplican solo a un nombre +de host específico o dirección IP
    VirtualScriptAlias interpolated-directory|none none svE
    Dynamically configure the location of the CGI directory for +a given virtual host
    VirtualScriptAliasIP interpolated-directory|none none svE
    Dynamically configure the location of the cgi directory for +a given virtual host
    Win32DisableAcceptExsM
    Usa accept() en lugar de AcceptEx() para aceptar +conexiones de red
    XBitHack on|off|full off svdhB
    Parse SSI directives in files with the execute bit +set
    +
    +

    Idiomas disponibles:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/quickreference.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/quickreference.html.ja.utf8 new file mode 100644 index 00000000..6f1a633e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/quickreference.html.ja.utf8 @@ -0,0 +1,670 @@ + + + +ディレクティブ クイックリファレンス - Apache HTTP サーバ + + + + + + +
    <-
    + +

    ディレクティブ クイックリファレンス

    +
    +

    Available Languages:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    +
    This translation may be out of date. Check the + English version for recent changes.
    + +

    ディレクティブ クイックリファレンスでは、各 Apache 設定ディレクティブの + 使用方法、デフォルト値、ステータスとコンテキストを示しています。 + 各ディレクティブの、より詳しい情報に関しては + ディレクティブ辞書を + ご覧下さい。

    + +

    第 1 列目はディレクティブの名前と使用方法です。 + 第 2 列目は (もしあれば) デフォルト値となっています。 + デフォルト値が長すぎて表示しきれない場合は、最初の文字列の後ろに + 「 + 」が続きます。

    + +

    第 3, 4 列は、下の表の注釈に従って、 + ディレクティブの使用できるコンテキストと、 + ディレクティブのステータスが示されています。

    +
    +
    + + + +
     A  |  B  |  C  |  D  |  E  |  F  |  G  |  H  |  I  |  K  |  L  |  M  |  N  |  O  |  P  |  R  |  S  |  T  |  U  |  V  |  W  |  X  + + + +
    sサーバ設定ファイル
    vバーチャルホスト
    dディレクトリ
    h.htaccess
    + + + + +
    CCore
    MMPM
    BBase
    EExtension
    XExperimental
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AcceptMutex default|method default sM
    複数の子プロセスがネットワークソケットでリクエストを +accept しようとしているときに、Apache がそれらの子プロセスを直列化するために +使う方法
    AcceptPathInfo On|Off|Default Default svdhC
    後に続くパス名情報を受け付けるリソースの指定
    AccessFileName filename [filename] ... .htaccess svC
    分散設定ファイルの名前
    Action action-type cgi-scriptsvdhB
    特定のハンドラやコンテントタイプに対して CGI を実行するように +設定
    AddAlt string file [file] ...svdhB
    アイコンの代わりに +表示される、ファイル名で選択された代替テキスト
    AddAltByEncoding string MIME-encoding +[MIME-encoding] ...svdhB
    アイコンの代わりに表示される、MIME 符号化方法で選択された +代替テキスト
    AddAltByType string MIME-type +[MIME-type] ...svdhB
    アイコンの代わりに +表示される、MIME タイプで選択された代替テキスト
    AddCharset charset extension +[extension] ...svdhB
    ファイル名の拡張子を指定された文字セットにマップする
    AddDefaultCharset On|Off|charset Off svdhC
    明示的に文字セットを指定していない応答に追加される +デフォルトの文字セット
    AddDescription string file [file] ...svdhB
    ファイルに対して表示する説明
    AddEncoding MIME-enc extension +[extension] ...svdhB
    ファイル名の拡張子を指定されたエンコーディング +にマップする
    AddHandler handler-name extension +[extension] ...svdhB
    ファイル名の拡張子を指定されたハンドラにマップする
    AddIcon icon name +[name] ...svdhB
    ファイルに表示するアイコンを名前で選択
    AddIconByEncoding icon MIME-encoding +[MIME-encoding] ...svdhB
    ファイルに表示するアイコンを MIME +符号化方法で選択
    AddIconByType icon MIME-type +[MIME-type] ...svdhB
    ファイルの隣に表示するアイコンを +MIME タイプによって選択
    AddInputFilter filter[;filter...] +extension [extension] ...svdhB
    ファイルの拡張子をクライアントのリクエストを処理する + フィルタにマップする
    AddLanguage MIME-lang extension +[extension] ...svdhB
    ファイル名を指定された言語にマップ
    AddModuleInfo module-name stringsvE
    server-info ハンドラにより表示されるモジュールの情報に +追加の情報を付け加える
    AddOutputFilter filter[;filter...] +extension [extension] ...svdhB
    ファイル名の拡張子をサーバからの応答を処理するフィルタに + マップする
    AddOutputFilterByType filter[;filter...] MIME-type +[MIME-type] ...svdhC
    MIME-type に出力フィルタを割り当てる
    AddType MIME-type extension +[extension] ...svdhB
    ファイル名の拡張子を指定されたコンテントタイプにマップ
    Alias URL-path +file-path|directory-pathsvB
    URL をファイルシステムの位置にマップする
    AliasMatch regex +file-path|directory-pathsvB
    正規表現を使って URL をファイルシステムの位置にマップする
    Allow from + all|host|env=env-variable + [host|env=env-variable] ...dhB
    サーバのある領域にアクセスできるホストを制御する
    AllowCONNECT port [port] ... 443 563 svE
    Ports that are allowed to CONNECT through the +proxy
    AllowEncodedSlashes On|Off Off svC
    URL 中の符号化されたパス分離文字が先に伝えられるのを許可するかどうかを +決定する
    AllowOverride All|None|directive-type +[directive-type] ... All dC
    .htaccess で許可されるディレクティブの種類
    Anonymous user [user] ...dhE
    Specifies userIDs that are allowed access without +password verification
    Anonymous_Authoritative On|Off Off dhE
    Configures if authorization will fall-through +to other methods
    Anonymous_LogEmail On|Off On dhE
    Sets whether the password entered will be logged in the +error log
    Anonymous_MustGiveEmail On|Off On dhE
    Specifies whether blank passwords are allowed
    Anonymous_NoUserID On|Off Off dhE
    Sets whether the userID field may be empty
    Anonymous_VerifyEmail On|Off Off dhE
    Sets whether to check the password field for a correctly +formatted email address
    AssignUserID user-id group-idvM
    Tie a virtual host to a user and group ID
    AuthAuthoritative On|Off On dhB
    認証と承認プロセスを、 +より低いレベルのモジュールに移行させるかどうかを設定する
    AuthDBMAuthoritative On|Off On dhE
    Sets whether authentication and authorization will be +passed on to lower level modules
    AuthDBMGroupFile file-pathdhE
    Sets the name of the database file containing the list +of user groups for authentication
    AuthDBMType default|SDBM|GDBM|NDBM|DB default dhE
    Sets the type of database file that is used to +store passwords
    AuthDBMUserFile file-pathdhE
    Sets thename of a database file containing the list of users and +passwords for authentication
    AuthDigestAlgorithm MD5|MD5-sess MD5 dhX
    Selects the algorithm used to calculate the challenge and +response hases in digest authentication
    AuthDigestDomain URI [URI] ...dhX
    URIs that are in the same protection space for digest +authentication
    AuthDigestFile file-pathdhX
    Location of the text file containing the list +of users and encoded passwords for digest authentication
    AuthDigestGroupFile file-pathdhX
    Name of the text file containing the list of groups +for digest authentication
    AuthDigestNcCheck On|Off Off sX
    Enables or disables checking of the nonce-count sent by the +server
    AuthDigestNonceFormat formatdhX
    Determines how the nonce is generated
    AuthDigestNonceLifetime seconds 300 dhX
    How long the server nonce is valid
    AuthDigestQop none|auth|auth-int [auth|auth-int] auth dhX
    Determines the quality-of-protection to use in digest +authentication
    AuthDigestShmemSize size 1000 sX
    The amount of shared memory to allocate for keeping track +of clients
    AuthGroupFile file-pathdhB
    認証に使用するユーザグループの一覧が格納されている、 +テキストファイルの名前を設定する
    AuthLDAPAuthoritative on|off on dhX
    Prevent other authentication modules from +authenticating the user if this one fails
    AuthLDAPBindDN distinguished-namedhX
    Optional DN to use in binding to the LDAP server
    AuthLDAPBindPassword passworddhX
    Password used in conjuction with the bind DN
    AuthLDAPCharsetConfig file-pathsX
    Language to charset conversion configuration file
    AuthLDAPCompareDNOnServer on|off on dhX
    Use the LDAP server to compare the DNs
    AuthLDAPDereferenceAliases never|searching|finding|always Always dhX
    When will the module de-reference aliases
    AuthLDAPEnabled on|off on dhX
    Turn on or off LDAP authentication
    AuthLDAPFrontPageHack on|off off dhX
    Allow LDAP authentication to work with MS FrontPage
    AuthLDAPGroupAttribute attributedhX
    LDAP attributes used to check for group membership
    AuthLDAPGroupAttributeIsDN on|off on dhX
    Use the DN of the client username when checking for +group membership
    AuthLDAPRemoteUserIsDN on|off off dhX
    Use the DN of the client username to set the REMOTE_USER +environment variable
    AuthLDAPUrl urldhX
    URL specifying the LDAP search parameters
    AuthName auth-domaindhC
    HTTP 認証の認可領域 (訳注: realm)
    AuthType Basic|DigestdhC
    ユーザ認証の種類
    AuthUserFile file-pathdhB
    認証に使用するユーザとパスワードの一覧が格納されている、 +テキストファイルの名前を設定する
    BrowserMatch regex [!]env-variable[=value] +[[!]env-variable[=value]] ...svdhB
    HTTP User-Agent に基づいて環境変数を設定する +
    BrowserMatchNoCase regex [!]env-variable[=value] + [[!]env-variable[=value]] ...svdhB
    HTTP User-Agent に基づいて大文字小文字を区別せずに +環境変数を設定する
    BS2000Account accountsM
    BS2000 での非特権アカウントを定義する
    CacheDefaultExpire seconds 3600 (one hour) svX
    The default duration to cache a document when no expiry date is specified.
    CacheDirLength length 2 svX
    The number of characters in subdirectory names
    CacheDirLevels levels 3 svX
    The number of levels of subdirectories in the +cache.
    CacheDisable url-stringsvX
    Disable caching of specified URLs
    CacheEnable cache_type url-stringsvX
    Enable caching of specified URLs using a specified storage +manager
    CacheExpiryCheck On|Off On svX
    Indicates if the cache observes Expires dates when seeking +files
    CacheFile file-path [file-path] ...sX
    Cache a list of file handles at startup time
    CacheForceCompletion Percentage 60 svX
    Percentage of document served, after which the server +will complete caching the file even if the request is cancelled.
    CacheGcClean hours url-string ? svX
    The time to retain unchanged cached files that match a +URL
    CacheGcDaily time ? svX
    The recurring time each day for garbage collection to be run. +(24 hour clock)
    CacheGcInterval hourssvX
    The interval between garbage collection attempts.
    CacheGcMemUsage KBytes ? svX
    The maximum kilobytes of memory used for garbage +collection
    CacheGcUnused hours url-string ? svX
    The time to retain unreferenced cached files that match a +URL.
    CacheIgnoreCacheControl On|Off Off svX
    Ignore the fact that the client requested the content not be +cached.
    CacheIgnoreHeaders header-string [header-string] ... None svX
    Do not store the given HTTP header(s) in the cache. +
    CacheIgnoreNoLastMod On|Off Off svX
    Ignore the fact that a response has no Last Modified +header.
    CacheLastModifiedFactor float 0.1 svX
    The factor used to compute an expiry date based on the +LastModified date.
    CacheMaxExpire seconds 86400 (one day) svX
    The maximum time in seconds to cache a document
    CacheMaxFileSize bytes 1000000 svX
    The maximum size (in bytes) of a document to be placed in the +cache
    CacheMinFileSize bytes 1 svX
    The minimum size (in bytes) of a document to be placed in the +cache
    CacheNegotiatedDocs On|Off Off svB
    コンテントネゴシエーションされたドキュメントをプロキシサーバが +キャッシュできるようにする
    CacheRoot directorysvX
    The directory root under which cache files are +stored
    CacheSize KBytes 1000000 svX
    The maximum amount of disk space that will be used by the +cache in KBytes
    CacheTimeMargin ? ? svX
    The minimum time margin to cache a document
    CGIMapExtension cgi-path .extensiondhC
    CGI スクリプトのインタープリタの位置を調べるための手法
    CharsetDefault charsetsvdhX
    Charset to translate into
    CharsetOptions option [option] ... DebugLevel=0 NoImpl +svdhX
    Configures charset translation behavior
    CharsetSourceEnc charsetsvdhX
    Source charset of files
    CheckSpelling on|off Off svdhE
    spelling モジュールを使用するようにする
    ChildPerUserID user-id group-id +num-childrensM
    Specify user ID and group ID for a number of child +processes
    ContentDigest On|Off Off svdhC
    Content-MD5 HTTP 応答ヘッダの生成を有効にする
    CookieDomain domainsvdhE
    The domain to which the tracking cookie applies
    CookieExpires expiry-periodsvdhE
    Expiry time for the tracking cookie
    CookieLog filenamesvB
    クッキングのロギングのためのファイル名を設定する
    CookieName token Apache svdhE
    Name of the tracking cookie
    CookieStyle + Netscape|Cookie|Cookie2|RFC2109|RFC2965 Netscape svdhE
    Format of the cookie header field
    CookieTracking on|off off svdhE
    Enables tracking cookie
    CoreDumpDirectory directorysM
    Apache がコアダンプする前に移動を試みるディレクトリ +
    CustomLog file|pipe +format|nickname +[env=[!]environment-variable]svB
    ログファイルの名前と書式を設定する
    Dav On|Off|provider-name Off dE
    WebDAV HTTP メソッドを有効にします
    DavDepthInfinity on|off off svdE
    PROPFIND, Depth: Infinity リクエストを許可します
    DavLockDB file-pathsvE
    DAV ロックデータベースの位置
    DavMinTimeout seconds 0 svdE
    サーバが DAV リソースのロックを維持する最小時間です。 +
    DefaultIcon url-pathsvdhB
    特定のアイコンが何も設定されていない時に +ファイルに表示するアイコン
    DefaultLanguage MIME-langsvdhB
    あるスコープのすべてのファイルを指定された言語に +設定する
    DefaultType MIME-type text/plain svdhC
    サーバがコンテントタイプを決定できないときに +送られる MIME コンテントタイプ
    DeflateBufferSize value 8096 svE
    zlib が一度に圧縮する塊の大きさ
    DeflateCompressionLevel valuesvE
    出力に対して行なう圧縮の程度
    DeflateFilterNote [type] notenamesvE
    ロギング用に圧縮比をメモに追加
    DeflateMemLevel value 9 svE
    zlib が圧縮に使うメモリのレベルを指定
    DeflateWindowSize value 15 svE
    Zlib の圧縮用ウィンドウの大きさ
    Deny from + all|host|env=env-variable + [host|env=env-variable] ...dhB
    サーバがアクセスを拒否するホストを制御する
    <Directory directory-path> +... </Directory>svC
    指定のファイルシステムのディレクトリとサブディレクトリとのみに +適用されるディレクティブを囲む
    DirectoryIndex + local-url [local-url] ... index.html svdhB
    クライアントがディレクトリをリクエストしたときに調べる +リソースのリスト
    <DirectoryMatch regex> +... </DirectoryMatch>svC
    正規表現にマッチするファイルシステムのディレクトリと +サブディレクトリとのみに適用されるディレクティブを囲む
    DirectorySlash On|Off On svdhB
    パス末尾のスラッシュでリダイレクトするかどうかのオンオフをトグルさせる
    DocumentRoot directory-path /usr/local/apache/h +svC
    ウェブから見えるメインのドキュメントツリーになる +ディレクトリ
    DumpIOInput On|Off Off sX
    Dump all input data to the error log
    DumpIOOutput On|Off Off sX
    Dump all output data to the error log
    EnableExceptionHook On|Off Off sM
    クラッシュの後に例外ハンドラを実行するフックを有効にする
    EnableMMAP On|Off On svdhC
    配送中にファイルを読み込むためにメモリマッピングを +使うかどうか
    EnableSendfile On|Off On svdhC
    ファイルのクライアントへの配送時にカーネルの sendfile サポートを +使うかどうか
    ErrorDocument error-code documentsvdhC
    エラーが発生したときにサーバがクライアントに送るもの
    ErrorLog file-path|syslog[:facility] logs/error_log (Uni +svC
    サーバがエラーをログ収集する場所
    ExamplesvdhX
    Demonstration directive to illustrate the Apache module +API
    ExpiresActive On|OffsvdhE
    Expires ヘッダの生成を有効にする
    ExpiresByType MIME-type +<code>secondssvdhE
    MIME タイプによって設定される Expires ヘッダの値
    ExpiresDefault <code>secondssvdhE
    期限切れ期日を計算するデフォルトアルゴリズム
    ExtendedStatus On|Off Off sB
    各リクエストに対して拡張ステータス情報を保存する
    ExtFilterDefine filtername parameterssE
    Define an external filter
    ExtFilterOptions option [option] ... DebugLevel=0 NoLogS +dE
    Configure mod_ext_filter options
    FileETag component ... INode MTime Size svdhC
    ETag HTTP 応答ヘッダを作成するために使用される +ファイルの属性
    <Files filename> ... </Files>svdhC
    マッチするファイル名に適用されるディレクティブを囲む
    <FilesMatch regex> ... </FilesMatch>svdhC
    正規表現にマッチするファイル名に適用される +ディレクティブを囲む
    ForceLanguagePriority None|Prefer|Fallback [Prefer|Fallback] Prefer svdhB
    要求に合う単独のドキュメントが見つからなかったときに行なうことを指定 +
    ForceType MIME-type|NonedhC
    すべてのマッチするファイルが指定の MIME コンテントタイプで +送られるようにする
    ForensicLog filename|pipesvE
    Sets filename of the forensic log
    Group unix-group #-1 sM
    リクエストに応答する際に所属するグループ
    Header [condition] set|append|add|unset|echo +header [value] [env=[!]variable]svdhE
    Configure HTTP response headers
    HeaderName filenamesvdhB
    +インデックス一覧の先頭に挿入されるファイルの名前
    HostnameLookups On|Off|Double Off svdC
    クライアントの IP アドレスの DNS ルックアップを +有効にする
    IdentityCheck On|Off Off svdC
    リモートユーザの RFC1413 によるアイデンティティのロギングを +有効にする
    <IfDefine [!]parameter-name> ... + </IfDefine>svdhC
    起動時にテストが真であるときのみに処理されるディレクティブを +囲む
    <IfModule [!]module-name> ... + </IfModule>svdhC
    モジュールの存在するかしないかに応じて処理される +ディレクティブを囲む
    <IfVersion [[!]operator] version> ... +</IfVersion>svdhE
    バージョン依存の設定を入れる
    ImapBase map|referer|URL http://servername/ svdhB
    Default base for imagemap files
    ImapDefault error|nocontent|map|referer|URL nocontent svdhB
    Default action when an imagemap is called with coordinates +that are not explicitly mapped
    ImapMenu none|formatted|semiformatted|unformattedsvdhB
    Action if no coordinates are given when calling +an imagemap
    Include file-path|directory-pathsvdC
    サーバ設定ファイル中から他の設定ファイルを取り込む
    IndexIgnore file [file] ...svdhB
    ディレクトリ一覧を行なう際に無視すべき +ファイルリストに追加
    IndexOptions [+|-]option [[+|-]option] ...svdhB
    ディレクトリインデックスの様々な設定項目 +
    IndexOrderDefault Ascending|Descending +Name|Date|Size|Description Ascending Name svdhB
    +ディレクトリインデックスの標準の順番付けを設定
    ISAPIAppendLogToErrors on|off off svdhB
    Record HSE_APPEND_LOG_PARAMETER requests from +ISAPI extensions to the error log
    ISAPIAppendLogToQuery on|off on svdhB
    Record HSE_APPEND_LOG_PARAMETER requests from +ISAPI extensions to the query field
    ISAPICacheFile file-path [file-path] +...svB
    ISAPI .dll files to be loaded at startup
    ISAPIFakeAsync on|off off svdhB
    Fake asynchronous support for ISAPI callbacks
    ISAPILogNotSupported on|off off svdhB
    Log unsupported feature requests from ISAPI +extensions
    ISAPIReadAheadBuffer size 49152 svdhB
    Size of the Read Ahead Buffer sent to ISAPI +extensions
    KeepAlive On|Off On svC
    HTTP の持続的な接続を有効にする
    KeepAliveTimeout seconds 15 svC
    持続的な接続で次のリクエストが来るまでサーバが待つ時間
    LanguagePriority MIME-lang [MIME-lang] +...svdhB
    クライアントが優先度を示さなかったときの言語の variant の優先度を +指定
    LDAPCacheEntries number 1024 sX
    Maximum number of entries in the primary LDAP cache
    LDAPCacheTTL seconds 600 sX
    Time that cached items remain valid
    LDAPConnectionTimeout secondssX
    Specifies the socket connection timeout in seconds
    LDAPOpCacheEntries number 1024 sX
    Number of entries used to cache LDAP compare +operations
    LDAPOpCacheTTL seconds 600 sX
    Time that entries in the operation cache remain +valid
    LDAPSharedCacheFile directory-path/filenamesX
    Sets the shared memory cache file
    LDAPSharedCacheSize bytes 102400 sX
    Size in bytes of the shared-memory cache
    LDAPTrustedCA directory-path/filenamesX
    Sets the file containing the trusted Certificate Authority certificate or database
    LDAPTrustedCAType typesX
    Specifies the type of the Certificate Authority file
    <Limit method [method] ... > ... + </Limit>svdhC
    囲いの中にあるアクセス制御の適用を特定の HTTP メソッドのみに +制限する
    <LimitExcept method [method] ... > ... + </LimitExcept>svdhC
    指定されたもの以外の HTTP メソッドにアクセス制御を +制限する
    LimitInternalRecursion number [number] 10 svC
    内部リダイレクトと入れ子になったサブリクエストの最大数を決定する
    LimitRequestBody bytes 0 svdhC
    クライアントから送られる HTTP リクエストのボディの +総量を制限する
    LimitRequestFields number 100 sC
    クライアントからの HTTP リクエストのヘッダフィールドの数を +制限する
    LimitRequestFieldsize bytessC
    クライアントからの HTTP リクエストのヘッダの +サイズを制限する
    LimitRequestLine bytes 8190 sC
    クライアントからの HTTP リクエスト行のサイズを制限する
    LimitXMLRequestBody bytes 1000000 svdhC
    XML 形式のリクエストのボディのサイズを制限する
    Listen [IP-address:]portnumbersM
    サーバが listen するIP アドレスとポート番号
    ListenBacklog backlogsM
    保留状態のコネクションのキューの最大長
    LoadFile filename [filename] ...sE
    指定されたオブジェクトファイルやライブラリをリンクする
    LoadModule module filenamesE
    オブジェクトファイルやライブラリをリンクし、使用モジュールの +リストに追加する
    <Location + URL-path|URL> ... </Location>svC
    囲んだディレクティブをマッチする URL のみに適用
    <LocationMatch + regex> ... </LocationMatch>svC
    囲んだディレクティブを正規表現にマッチする URL のみに +適用
    LockFile filename logs/accept.lock sM
    受付を直列化するためのロックファイルの位置
    LogFormat format|nickname +[nickname] "%h %l %u %t \"%r\" +svB
    ログファイルで使用する書式を設定する
    LogLevel level warn svC
    ErrorLog の冗長性を制御する
    MaxClients numbersM
    リクエストに応答するために作成される +子プロセスの最大個数
    MaxKeepAliveRequests number 100 svC
    持続的な接続上で許可されるリクエストの数
    MaxMemFree KBytes 0 sM
    free() が呼ばれない限り、 +主メモリアロケータが保持し続けられるメモリの最大量
    MaxRequestsPerChild number 10000 sM
    個々の子サーバが稼働中に扱うリクエスト数の上限
    MaxRequestsPerThread number 0 sM
    Limit on the number of requests that an individual thread +will handle during its life
    MaxSpareServers number 10 sM
    アイドルな子サーバプロセスの最大個数
    MaxSpareThreads numbersM
    アイドルスレッドの最大数
    MaxThreads number 2048 sM
    Set the maximum number of worker threads
    MaxThreadsPerChild number 64 sM
    Maximum number of threads per child process
    MCacheMaxObjectCount value 1009 sX
    キャッシュに保管されるオブジェクトの最大数
    MCacheMaxObjectSize bytes 10000 sX
    キャッシュに保管できるドキュメントの最大サイズ (バイト)
    MCacheMaxStreamingBuffer size_in_bytes of 100000 か MCacheM +sX
    ストリームされている応答をキャッシュ不能と決定するまでに +メモリにバッファする最大量
    MCacheMinObjectSize bytes 0 sX
    キャッシュに保管されるドキュメントの最小サイズ (バイト)
    MCacheRemovalAlgorithm LRU|GDSF GDSF sX
    キャッシュから削除するドキュメントを選ぶためのアルゴリズム
    MCacheSize KBytes 100 sX
    キャッシュに使われるメモリの最大量をキロバイト単位で指定
    MetaDir directory .web svdhE
    Name of the directory to find CERN-style meta information +files
    MetaFiles on|off off svdhE
    Activates CERN meta-file processing
    MetaSuffix suffix .meta svdhE
    File name suffix for the file containg CERN-style +meta information
    MimeMagicFile file-pathsvE
    Enable MIME-type determination based on file contents +using the specified magic file
    MinSpareServers number 5 sM
    アイドルな子サーバプロセスの最小個数
    MinSpareThreads numbersM
    リクエストに応答することのできる +アイドルスレッド数の最小数
    MMapFile file-path [file-path] ...sX
    Map a list of files into memory at startup time
    ModMimeUsePathInfo On|Off Off dB
    path_info コンポーネントをファイル名の一部として扱うように +mod_mime に通知する
    MultiviewsMatch Any|NegotiatedOnly|Filters|Handlers +[Handlers|Filters] NegotiatedOnly svdhB
    MultiViews でのマッチングの検索に含ませる +ファイルのタイプを指定する
    NameVirtualHost addr[:port]sC
    名前ベースのバーチャルホストのための IP アドレスを指定
    NoProxy host [host] ...svE
    Hosts, domains, or networks that will be connected to +directly
    NumServers number 2 sM
    Total number of children alive at the same time
    NWSSLTrustedCerts filename [filename] ...sB
    List of additional client certificates
    NWSSLUpgradeable [IP-address:]portnumbersB
    Allows a connection to be upgraded to an SSL connection upon request
    Options + [+|-]option [[+|-]option] ... All svdhC
    ディレクトリに対して使用可能な機能を設定する
    Order ordering Deny,Allow dhB
    デフォルトのアクセス可能な状態と、Allow と +Deny が評価される順番を制御する
    PassEnv env-variable [env-variable] +...svdhB
    シェルからの環境変数を渡す
    PidFile filename logs/httpd.pid M
    デーモンのプロセス ID +をサーバが記録するためのファイル
    ProtocolEcho On|OffsvX
    エコーサーバの有効無効を設定します。
    <Proxy wildcard-url> ...</Proxy>svE
    Container for directives applied to proxied resources
    ProxyBadHeader IsError|Ignore|StartBody IsError svE
    Determines how to handle bad header lines in a +response
    ProxyBlock *|word|host|domain +[word|host|domain] ...svE
    Words, hosts, or domains that are banned from being +proxied
    ProxyDomain DomainsvE
    Default domain name for proxied requests
    ProxyErrorOverride On|Off Off svE
    Override error pages for proxied content
    ProxyFtpDirCharset character set ISO-8859-1 svdE
    Define the character set for proxied FTP listings
    ProxyIOBufferSize bytes 8192 svE
    Determine size of internal data throughput buffer
    <ProxyMatch regex> ...</ProxyMatch>svE
    Container for directives applied to regular-expression-matched +proxied resources
    ProxyMaxForwards number 10 svE
    Maximium number of proxies that a request can be forwarded +through
    ProxyPass [path] !|urlsvdE
    Maps remote servers into the local server URL-space
    ProxyPassReverse [path] urlsvdE
    Adjusts the URL in HTTP response headers sent from a reverse +proxied server
    ProxyPreserveHost On|Off Off svE
    Use incoming Host HTTP request header for proxy +request
    ProxyReceiveBufferSize bytes 0 svE
    Network buffer size for proxied HTTP and FTP +connections
    ProxyRemote match remote-serversvE
    Remote proxy used to handle certain requests
    ProxyRemoteMatch regex remote-serversvE
    Remote proxy used to handle requests matched by regular +expressions
    ProxyRequests On|Off Off svE
    Enables forward (standard) proxy requests
    ProxyTimeout seconds 300 svE
    Network timeout for proxied requests
    ProxyVia On|Off|Full|Block Off svE
    Information provided in the Via HTTP response +header for proxied requests
    ReadmeName filenamesvdhB
    インデックス一覧の最後に挿入されるファイルの名前
    Redirect [status] URL-path +URLsvdhB
    クライアントが違う URL を取得するように外部へのリダイレクトを +送る
    RedirectMatch [status] regex +URLsvdhB
    現在の URL への正規表現のマッチにより +外部へのリダイレクトを送る
    RedirectPermanent URL-path URLsvdhB
    クライアントが違う URL を取得するように外部への永久的な +リダイレクトを送る
    RedirectTemp URL-path URLsvdhB
    クライアントが違う URL を取得するように外部への一時的な +リダイレクトを送る
    RemoveCharset extension [extension] +...vdhB
    ファイルの拡張子に関連付けられたすべての文字セット +を解除する
    RemoveEncoding extension [extension] +...vdhB
    ファイルの拡張子に関連付けられたすべてのコンテントエンコーディング +を解除する
    RemoveHandler extension [extension] +...vdhB
    ファイルの拡張子に関連付けられたすべてのハンドラを +解除する
    RemoveInputFilter extension [extension] +...vdhB
    ファイル拡張子に関連付けられた入力フィルタを解除する
    RemoveLanguage extension [extension] +...vdhB
    ファイル拡張子に関連付けられた言語を解除する
    RemoveOutputFilter extension [extension] +...vdhB
    ファイル拡張子に関連付けられた出力フィルタを解除する
    RemoveType extension [extension] +...vdhB
    ファイルの拡張子と関連付けられたコンテントタイプを +解除する
    RequestHeader set|append|add|unset header +[value [env=[!]variable]]svdhE
    Configure HTTP request headers
    Require entity-name [entity-name] ...dhC
    どの認証済みユーザがリソースをアクセスできるかを選択する
    RewriteBase URL-pathdhE
    Sets the base URL for per-directory rewrites
    RewriteCond + TestString CondPatternsvdhE
    Defines a condition under which rewriting will take place +
    RewriteEngine on|off off svdhE
    Enables or disables runtime rewriting engine
    RewriteLock file-pathsE
    Sets the name of the lock file used for RewriteMap +synchronization
    RewriteLog file-pathsvE
    Sets the name of the file used for logging rewrite engine +processing
    RewriteLogLevel Level 0 svE
    Sets the verbosity of the log file used by the rewrite +engine
    RewriteMap MapName MapType:MapSource +svE
    Defines a mapping function for key-lookup
    RewriteOptions Options MaxRedirects=10 svdhE
    Sets some special options for the rewrite engine
    RewriteRule + Pattern SubstitutionsvdhE
    Defines rules for the rewriting engine
    RLimitCPU seconds|max [seconds|max]svdhC
    Apache の子プロセスから起動されたプロセスの CPU 消費量を +制限する
    RLimitMEM bytes|max [bytes|max]svdhC
    Apache の子プロセスから起動されたプロセスのメモリ消費量を +制限する
    RLimitNPROC number|max [number|max]svdhC
    Apache の子プロセスから起動されたプロセスが起動するプロセスの +数を制限する
    Satisfy Any|All All dhC
    ホストレベルのアクセス制御とユーザ認証との相互作用を指定
    ScoreBoardFile file-path logs/apache_status sM
    子プロセスと連携するためのデータを保存する +ファイルの位置
    Script method cgi-scriptsvdB
    特定のリクエストメソッドに対して CGI スクリプトを +実行するように設定
    ScriptAlias URL-path +file-path|directory-pathsvB
    URL をファイルシステムの位置へマップし、マップ先を +CGI スクリプトに指定
    ScriptAliasMatch regex +file-path|directory-pathsvB
    URL を正規表現を使ってファイルシステムの位置へマップし、マップ先を +CGI スクリプトに指定
    ScriptInterpreterSource Registry|Registry-Strict|Script Script svdhC
    CGI スクリプトのインタープリタの位置を調べるための手法
    ScriptLog file-pathsvB
    CGI スクリプトのエラーログファイルの場所
    ScriptLogBuffer bytes 1024 svB
    スクリプトログに記録される PUT や POST リクエストの内容の上限
    ScriptLogLength bytes 10385760 svB
    CGI スクリプトのログファイルの大きさの上限
    ScriptSock file-path logs/cgisock svB
    CGI デーモンとの通信に使われるソケットの名前
    SecureListen [IP-address:]portnumber +Certificate-Name [MUTUAL]sB
    Enables SSL encryption for the specified port
    SendBufferSize bytes 0 sM
    TCP バッファサイズ
    ServerAdmin email-addresssvC
    サーバがクライアントに送るエラーメッセージに含める電子メールの +アドレス
    ServerAlias hostname [hostname] ...vC
    リクエストを名前ベースのバーチャルホストにマッチさせているときに +使用されるホストの別名
    ServerLimit numbersM
    設定可能なサーバプロセス数の上限
    ServerName fully-qualified-domain-name[:port]svC
    サーバが自分自身を示すときに使うホスト名とポート
    ServerPath URL-pathvC
    非互換のブラウザが名前ベースのバーチャルホストにアクセスしたときの +ための互換用 URL パス名
    ServerRoot directory-path /usr/local/apache sC
    インストールされたサーバのベースディレクトリ
    ServerSignature On|Off|EMail Off svdhC
    サーバが生成するドキュメントのフッタを設定
    ServerTokens Major|Minor|Min[imal]|Prod[uctOnly]|OS|Full Full sC
    Server HTTP 応答ヘッダを設定する
    SetEnv env-variable valuesvdhB
    環境変数を設定する
    SetEnvIf attribute + regex [!]env-variable[=value] + [[!]env-variable[=value]] ...svdhB
    リクエストの属性に基づいて環境変数を設定する +
    SetEnvIfNoCase attribute regex + [!]env-variable[=value] + [[!]env-variable[=value]] ...svdhB
    リクエストの属性に基づいて大文字小文字を区別せずに環境変数を設定する
    SetHandler handler-name|NonesvdhC
    マッチするファイルがハンドラで処理されるようにする
    SetInputFilter filter[;filter...]svdhC
    クライアントのリクエストや POST の入力を処理するフィルタを設定する
    SetOutputFilter filter[;filter...]svdhC
    サーバの応答を処理するフィルタを設定する
    SSIEndTag tag "-->" svB
    include 要素を終了させる文字列
    SSIErrorMsg message "[an error occurred +svdhB
    SSI のエラーがあったときに表示されるエラーメッセージ
    SSIStartTag tag "<!--#" svB
    include 要素を開始する文字列
    SSITimeFormat formatstring "%A, %d-%b-%Y %H:%M +svdhB
    日付けを現す文字列の書式を設定する
    SSIUndefinedEcho string "(none)" svB
    未定義の変数が echo されたときに表示される文字列
    SSLCACertificateFile file-pathsvE
    File of concatenated PEM-encoded CA Certificates +for Client Auth
    SSLCACertificatePath directory-pathsvE
    Directory of PEM-encoded CA Certificates for +Client Auth
    SSLCARevocationFile file-pathsvE
    File of concatenated PEM-encoded CA CRLs for +Client Auth
    SSLCARevocationPath directory-pathsvE
    Directory of PEM-encoded CA CRLs for +Client Auth
    SSLCertificateChainFile file-pathsvE
    File of PEM-encoded Server CA Certificates
    SSLCertificateFile file-pathsvE
    Server PEM-encoded X.509 Certificate file
    SSLCertificateKeyFile file-pathsvE
    Server PEM-encoded Private Key file
    SSLCipherSuite cipher-spec ALL:!ADH:RC4+RSA:+H +svdhE
    Cipher Suite available for negotiation in SSL +handshake
    SSLEngine on|off off svE
    SSL Engine Operation Switch
    SSLInsecureRenegotiation flag off svE
    Option to enable support for insecure renegotiation
    SSLMutex type none sE
    Semaphore for internal mutual exclusion of +operations
    SSLOptions [+|-]option ...svdhE
    Configure various SSL engine run-time options
    SSLPassPhraseDialog type builtin sE
    Type of pass phrase dialog for encrypted private +keys
    SSLProtocol [+|-]protocol ... all svE
    Configure usable SSL protocol flavors
    SSLProxyCACertificateFile file-pathsvE
    File of concatenated PEM-encoded CA Certificates +for Remote Server Auth
    SSLProxyCACertificatePath directory-pathsvE
    Directory of PEM-encoded CA Certificates for +Remote Server Auth
    SSLProxyCARevocationFile file-pathsvE
    File of concatenated PEM-encoded CA CRLs for +Remote Server Auth
    SSLProxyCARevocationPath directory-pathsvE
    Directory of PEM-encoded CA CRLs for +Remote Server Auth
    SSLProxyCipherSuite cipher-spec ALL:!ADH:RC4+RSA:+H +svdhE
    Cipher Suite available for negotiation in SSL +proxy handshake
    SSLProxyEngine on|off off svE
    SSL Proxy Engine Operation Switch
    SSLProxyMachineCertificateFile filenamesE
    File of concatenated PEM-encoded client certificates and keys to be used by the proxy
    SSLProxyMachineCertificatePath directorysE
    Directory of PEM-encoded client certificates and keys to be used by the proxy
    SSLProxyProtocol [+|-]protocol ... all svE
    Configure usable SSL protocol flavors for proxy usage
    SSLProxyVerify level none svdhE
    Type of remote server Certificate verification
    SSLProxyVerifyDepth number 1 svdhE
    Maximum depth of CA Certificates in Remote Server +Certificate verification
    SSLRandomSeed context source +[bytes]sE
    Pseudo Random Number Generator (PRNG) seeding +source
    SSLRequire expressiondhE
    Allow access only when an arbitrarily complex +boolean expression is true
    SSLRequireSSLdhE
    Deny access when SSL is not used for the +HTTP request
    SSLSessionCache type none sE
    Type of the global/inter-process SSL Session +Cache
    SSLSessionCacheTimeout seconds 300 svE
    Number of seconds before an SSL session expires +in the Session Cache
    SSLUserName varnamesdhE
    Variable name to determine user name
    SSLVerifyClient level none svdhE
    Type of Client Certificate verification
    SSLVerifyDepth number 1 svdhE
    Maximum depth of CA Certificates in Client +Certificate verification
    StartServers numbersM
    起動時に生成される子サーバプロセスの数
    StartThreads numbersM
    起動時に生成されるスレッドの数
    SuexecUserGroup User GroupsvE
    CGI プログラムのユーザパーミッション、グループパーミッション
    ThreadLimit numbersM
    設定可能な子プロセス毎のスレッド数の上限を +設定します
    ThreadsPerChild numbersM
    子プロセスそれぞれに生成されるスレッド数
    ThreadStackSize number 65536 sM
    Determine the stack size for each thread
    TimeOut seconds 300 sC
    各イベントについて、リクエストを失敗させるまでにサーバが +待つ時間を設定
    TransferLog file|pipesvB
    ログファイルの位置を指定
    TypesConfig file-path conf/mime.types sB
    mime.types ファイルの位置
    UnsetEnv env-variable [env-variable] +...svdhB
    環境から変数を取り除く
    UseCanonicalName On|Off|Dns On svdC
    サーバが自分自身の名前とポートを決定する方法を設定する
    User unix-userid #-1 sM
    リクエストに応答する際に用いるユーザ ID
    UserDir directory-filename public_html svB
    ユーザ専用ディレクトリの位置
    VirtualDocumentRoot interpolated-directory|none none svE
    Dynamically configure the location of the document root +for a given virtual host
    VirtualDocumentRootIP interpolated-directory|none none svE
    Dynamically configure the location of the document root +for a given virtual host
    <VirtualHost + addr[:port] [addr[:port]] + ...> ... </VirtualHost>sC
    特定のホスト名や IP アドレスのみに適用されるディレクティブを +囲む
    VirtualScriptAlias interpolated-directory|none none svE
    Dynamically configure the location of the CGI directory for +a given virtual host
    VirtualScriptAliasIP interpolated-directory|none none svE
    Dynamically configure the location of the cgi directory for +a given virtual host
    Win32DisableAcceptExsM
    ネットワーク接続の受け付けに accept() をAcceptEx の代わりに使う
    XBitHack on|off|full off svdhB
    実行ビットが設定されたファイルの SSI ディレクティブを +解析する
    +
    +

    Available Languages:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/quickreference.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/mod/quickreference.html.ko.euc-kr new file mode 100644 index 00000000..617e43d1 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/quickreference.html.ko.euc-kr @@ -0,0 +1,674 @@ + + + +Áö½Ã¾î ºü¸¥ÂüÁ¶ - Apache HTTP Server + + + + + + +
    <-
    + +

    Áö½Ã¾î ºü¸¥ÂüÁ¶

    +
    +

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

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

    ÀÌ ¹®¼­´Â ¾ÆÆÄÄ¡ ¼³Á¤Áö½Ã¾î °¢°¢ÀÇ ¿ëµµ, ±âº»°ª, »óÅÂ, + »ç¿ëÀå¼Ò¸¦ º¸¿©ÁØ´Ù. À̵éÀº Áö½Ã¾î »çÀü¿¡¼­ ¼³¸íÇÑ´Ù.

    + +

    ù¹ø° ¿­Àº Áö½Ã¾î À̸§°ú ¿ëµµ¸¦ ¾Ë·ÁÁØ´Ù. µÎ¹ø° ¿­Àº + Áö½Ã¾î¿¡ ±âº»°ªÀÌ ÀÖ´Ù¸é ±âº»°ªÀ» º¸¿©ÁØ´Ù. ¸¸¾à ±âº»°ªÀÌ + ³Ê¹« ±æ´Ù¸é, "+" ±âÈ£·Î »ý·«ÇßÀ½À» ¾Ë¸°´Ù.

    + +

    ¼¼¹ø°¿Í ³×¹ø° ¿­Àº °¢°¢ ¾Æ·¡ Ç¥¿¡ µû¶ó Áö½Ã¾î¸¦ »ç¿ëÇÒ + ¼ö ÀÖ´Â Àå¼Ò¿Í Áö½Ã¾îÀÇ »óŸ¦ ³ªÅ¸³½´Ù.

    +
    +
    + + + +
     A  |  B  |  C  |  D  |  E  |  F  |  G  |  H  |  I  |  K  |  L  |  M  |  N  |  O  |  P  |  R  |  S  |  T  |  U  |  V  |  W  |  X  + + + +
    sÁÖ¼­¹ö¼³Á¤
    v°¡»óÈ£½ºÆ®
    ddirectory
    h.htaccess
    + + + + +
    CCore
    MMPM
    BBase
    EExtension
    XExperimental
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AcceptMutex Default|method Default sM
    Method that Apache uses to serialize multiple children +accepting requests on network sockets
    AcceptPathInfo On|Off|Default Default svdhC
    Resources accept trailing pathname information
    AccessFileName filename [filename] ... .htaccess svC
    Name of the distributed configuration file
    Action action-type cgi-scriptsvdhB
    ƯÁ¤ Çڵ鷯³ª content-type¿¡ ´ëÇØ CGI ½ºÅ©¸³Æ®¸¦ +»ç¿ëÇÑ´Ù
    AddAlt string file [file] ...svdhB
    ÆÄÀϸíÀ¸·Î ¼±ÅÃÇÑ ¾ÆÀÌÄÜ´ë½Å »ç¿ëÇÒ ÆÄÀÏ ¼³¸í±Û
    AddAltByEncoding string MIME-encoding +[MIME-encoding] ...svdhB
    MIME-encodingÀ¸·Î ¼±ÅÃÇÑ ¾ÆÀÌÄÜ´ë½Å »ç¿ëÇÒ ÆÄÀÏ +¼³¸í±Û
    AddAltByType string MIME-type +[MIME-type] ...svdhB
    MIME content-typeÀ¸·Î ¼±ÅÃÇÑ ¾ÆÀÌÄÜ´ë½Å »ç¿ëÇÒ ÆÄÀÏ +¼³¸í±Û
    AddCharset charset extension +[extension] ...svdhB
    Maps the given filename extensions to the specified content +charset
    AddDefaultCharset On|Off|charset Off svdhC
    Default charset parameter to be added when a response +content-type is text/plain or text/html
    AddDescription string file [file] ...svdhB
    ÆÄÀÏ¿¡ ´ëÇÑ ¼³¸í
    AddEncoding MIME-enc extension +[extension] ...svdhB
    Maps the given filename extensions to the specified encoding +type
    AddHandler handler-name extension +[extension] ...svdhB
    Maps the filename extensions to the specified +handler
    AddIcon icon name [name] +...svdhB
    À̸§À¸·Î ¼±ÅÃÇÑ ÆÄÀÏ¿¡ »ç¿ëÇÒ ¾ÆÀÌÄÜ
    AddIconByEncoding icon MIME-encoding +[MIME-encoding] ...svdhB
    MIME content-encodingÀ¸·Î ¼±ÅÃÇÑ ÆÄÀÏ¿¡ »ç¿ëÇÒ ¾ÆÀÌÄÜ
    AddIconByType icon MIME-type +[MIME-type] ...svdhB
    MIME content-typeÀ¸·Î ¼±ÅÃÇÑ ÆÄÀÏ¿¡ »ç¿ëÇÒ ¾ÆÀÌÄÜ
    AddInputFilter filter[;filter...] +extension [extension] ...svdhB
    Maps filename extensions to the filters that will process +client requests
    AddLanguage MIME-lang extension +[extension] ...svdhB
    Maps the given filename extension to the specified content +language
    AddModuleInfo module-name stringsvE
    ¸ðµâ¿¡ ´ëÇÑ Ãß°¡ Á¤º¸¸¦ server-info Çڵ鷯°¡ º¸¿©ÁÖµµ·Ï +Ãß°¡ÇÑ´Ù
    AddOutputFilter filter[;filter...] +extension [extension] ...svdhB
    Maps filename extensions to the filters that will process +responses from the server
    AddOutputFilterByType filter[;filter...] +MIME-type [MIME-type] ...svdhC
    assigns an output filter to a particular MIME-type
    AddType MIME-type extension +[extension] ...svdhB
    Maps the given filename extensions onto the specified content +type
    Alias URL-path +file-path|directory-pathsvB
    URLÀ» ƯÁ¤ ÆÄÀϽýºÅÛ Àå¼Ò·Î ´ëÀÀÇÑ´Ù
    AliasMatch regex +file-path|directory-pathsvB
    Á¤±ÔÇ¥Çö½ÄÀ» »ç¿ëÇÏ¿© URLÀ» ÆÄÀϽýºÅÛ Àå¼Ò·Î +´ëÀÀÇÑ´Ù
    Allow from + all|host|env=env-variable + [host|env=env-variable] ...dhB
    Controls which hosts can access an area of the +server
    AllowCONNECT port [port] ... 443 563 svE
    Ports that are allowed to CONNECT through the +proxy
    AllowEncodedSlashes On|Off Off svC
    Determines whether encoded path separators in URLs are allowed to +be passed through
    AllowOverride All|None|directive-type +[directive-type] ... All dC
    Types of directives that are allowed in +.htaccess files
    Anonymous user [user] ...dhE
    Specifies userIDs that are allowed access without +password verification
    Anonymous_Authoritative On|Off Off dhE
    Configures if authorization will fall-through +to other methods
    Anonymous_LogEmail On|Off On dhE
    Sets whether the password entered will be logged in the +error log
    Anonymous_MustGiveEmail On|Off On dhE
    Specifies whether blank passwords are allowed
    Anonymous_NoUserID On|Off Off dhE
    Sets whether the userID field may be empty
    Anonymous_VerifyEmail On|Off Off dhE
    Sets whether to check the password field for a correctly +formatted email address
    AssignUserID user-id group-idvM
    Tie a virtual host to a user and group ID
    AuthAuthoritative On|Off On dhB
    Sets whether authorization and authentication are +passed to lower level modules
    AuthDBMAuthoritative On|Off On dhE
    Sets whether authentication and authorization will be +passed on to lower level modules
    AuthDBMGroupFile file-pathdhE
    Sets the name of the database file containing the list +of user groups for authentication
    AuthDBMType default|SDBM|GDBM|NDBM|DB default dhE
    Sets the type of database file that is used to +store passwords
    AuthDBMUserFile file-pathdhE
    Sets thename of a database file containing the list of users and +passwords for authentication
    AuthDigestAlgorithm MD5|MD5-sess MD5 dhX
    digest authentication¿¡¼­ challenge¿Í response +hash¸¦ °è»êÇÏ´Â ¾Ë°í¸®ÁòÀ» ¼±ÅÃÇÑ´Ù
    AuthDigestDomain URI [URI] ...dhX
    digest authentication¿¡¼­ °°Àº º¸È£¿µ¿ª¿¡ ¼ÓÇÏ´Â +URIµé
    AuthDigestFile file-pathdhX
    digest authentication¿¡ »ç¿ëÇÒ »ç¿ëÀÚ¸í°ú ÀÎÄÚµùµÈ +¾ÏÈ£ ¸ñ·ÏÀ» ÀúÀåÇÑ ¹®¼­ÆÄÀÏ À§Ä¡
    AuthDigestGroupFile file-pathdhX
    digest authentication¿¡ »ç¿ëÇÒ ±×·ì ¸ñ·ÏÀ» ÀúÀåÇÑ +¹®¼­ÆÄÀϸí
    AuthDigestNcCheck On|Off Off sX
    ¼­¹ö°¡ º¸³»´Â nonce-count¸¦ °Ë»çÇÒÁö ¿©ºÎ
    AuthDigestNonceFormat formatdhX
    nonce¸¦ ¸¸µå´Â ¹æ¹ýÀ» °áÁ¤ÇÑ´Ù
    AuthDigestNonceLifetime seconds 300 dhX
    ¼­¹ö nonce°¡ À¯È¿ÇÑ ±â°£
    AuthDigestQop none|auth|auth-int [auth|auth-int] auth dhX
    digest authentication°¡ »ç¿ëÇÒ +º¸È£¼öÁØ(quality-of-protection)À» ÁöÁ¤ÇÑ´Ù.
    AuthDigestShmemSize size 1000 sX
    Ŭ¶óÀ̾ðÆ®¸¦ ÃßÀûÇϱâÀ§ÇØ ÇÒ´çÇÏ´Â °øÀ¯¸Þ¸ð¸®·®
    AuthGroupFile file-pathdhB
    Sets the name of a text file containing the list +of user groups for authentication
    AuthLDAPAuthoritative on|off on dhX
    Prevent other authentication modules from +authenticating the user if this one fails
    AuthLDAPBindDN distinguished-namedhX
    Optional DN to use in binding to the LDAP server
    AuthLDAPBindPassword passworddhX
    Password used in conjuction with the bind DN
    AuthLDAPCharsetConfig file-pathsX
    Language to charset conversion configuration file
    AuthLDAPCompareDNOnServer on|off on dhX
    Use the LDAP server to compare the DNs
    AuthLDAPDereferenceAliases never|searching|finding|always Always dhX
    When will the module de-reference aliases
    AuthLDAPEnabled on|off on dhX
    Turn on or off LDAP authentication
    AuthLDAPFrontPageHack on|off off dhX
    Allow LDAP authentication to work with MS FrontPage
    AuthLDAPGroupAttribute attributedhX
    LDAP attributes used to check for group membership
    AuthLDAPGroupAttributeIsDN on|off on dhX
    Use the DN of the client username when checking for +group membership
    AuthLDAPRemoteUserIsDN on|off off dhX
    Use the DN of the client username to set the REMOTE_USER +environment variable
    AuthLDAPUrl urldhX
    URL specifying the LDAP search parameters
    AuthName auth-domaindhC
    Authorization realm for use in HTTP +authentication
    AuthType Basic|DigestdhC
    Type of user authentication
    AuthUserFile file-pathdhB
    Sets the name of a text file containing the list of users and +passwords for authentication
    BrowserMatch regex [!]env-variable[=value] +[[!]env-variable[=value]] ...svdhB
    HTTP User-Agent¿¡ µû¶ó ȯ°æº¯¼ö¸¦ ¼³Á¤ÇÑ´Ù
    BrowserMatchNoCase regex [!]env-variable[=value] + [[!]env-variable[=value]] ...svdhB
    ´ë¼Ò¹®ÀÚ¸¦ ±¸º°ÇÏÁö¾Ê°í User-Agent¿¡ µû¶ó ȯ°æº¯¼ö¸¦ +¼³Á¤ÇÑ´Ù
    BS2000Account accountsM
    Define the non-privileged account on BS2000 +machines
    CacheDefaultExpire seconds 3600 (one hour) svX
    ¸¸±â½Ã°£À» ÁöÁ¤ÇÏÁö¾ÊÀº ¹®¼­¸¦ ij½¬ÇÒ ±âº» ±â°£.
    CacheDirLength length 2 svX
    ÇÏÀ§µð·ºÅ丮¸íÀÇ ¹®ÀÚ°³¼ö
    CacheDirLevels levels 3 svX
    ij½¬ÀÇ ÇÏÀ§µð·ºÅ丮 ±íÀÌ.
    CacheDisable url-stringsvX
    ƯÁ¤ URLÀ» ij½¬ÇÏÁö ¾Ê´Â´Ù
    CacheEnable cache_type url-stringsvX
    ÁöÁ¤ÇÑ ÀúÀå°ü¸®ÀÚ¸¦ »ç¿ëÇÏ¿© ÁöÁ¤ÇÑ URLÀ» ij½¬ÇÑ´Ù
    CacheExpiryCheck On|Off On svX
    ij½¬¿¡¼­ ÆÄÀÏÀ» ãÀ»¶§ ¸¸±â½Ã°£À» °í·ÁÇÒÁö ¿©ºÎ
    CacheFile file-path [file-path] ...sX
    ½ÃÀ۽à ¿©·¯ ÆÄÀÏ ÇÚµéÀ» ij½¬ÇÑ´Ù
    CacheForceCompletion Percentage 60 svX
    ¿äûÀÌ Ãë¼ÒµÇ´õ¶óµµ ¼­¹ö°¡ ÆÄÀÏÀ» °è¼Ó ij½¬ÇϱâÀ§ÇØ +ÇÊ¿äÇÑ ¹®¼­ÀÇ ¼­ºñ½º·ü.
    CacheGcClean hours url-string ? svX
    URL¿¡ ÇØ´çÇÏ´Â º¯ÇÏÁö¾ÊÀº ij½¬ÆÄÀÏÀ» À¯ÁöÇÒ ½Ã°£
    CacheGcDaily time ? svX
    ¸ÅÀÏ °¡ºñÁöÄ÷¢Å͸¦ ½ÇÇàÇÒ ¹Ýº¹ ½Ã°£ (24½Ã ½Ã°è)
    CacheGcInterval hourssvX
    °¡ºñÁöÄ÷¢Å͸¦ ½ÇÇàÇÏ´Â °£°Ý.
    CacheGcMemUsage KBytes ? svX
    °¡ºñÁöÄ÷¢ÅÍ°¡ »ç¿ëÇÒ ÃÖ´ë ¸Þ¸ð¸®·® (kilobyte ´ÜÀ§)
    CacheGcUnused hours url-string ? svX
    URL¿¡ ÇØ´çÇÏ´Â ÂüÁ¶µÇÁö¾ÊÀº ij½¬ÆÄÀÏÀ» À¯ÁöÇÒ ±â°£.
    CacheIgnoreCacheControl On|Off Off svX
    Ŭ¶óÀ̾ðÆ®°¡ ij½¬ÇÏÁö¾Ê´Â ³»¿ëÀ» ¿äûÇÔÀ» ¹«½ÃÇÑ´Ù.
    CacheIgnoreNoLastMod On|Off Off svX
    ÀÀ´ä¿¡ Last Modified Çì´õ°¡ ¾ø´Ù´Â »ç½ÇÀ» ¹«½ÃÇÑ´Ù.
    CacheLastModifiedFactor float 0.1 svX
    LastModified ½Ã°£À¸·Î ¸¸±â½Ã°£À» °è»êÇϴµ¥ »ç¿ëÇÏ´Â +°è¼ö.
    CacheMaxExpire seconds 86400 (ÇÏ·ç) svX
    ¹®¼­¸¦ ij½¬ÇÏ´Â ÃÊ´ÜÀ§ ÃÖ´ë½Ã°£
    CacheMaxFileSize bytes 1000000 svX
    ij½¬¿¡ ÀúÀåÇÒ ¹®¼­ÀÇ ÃÖ´ëÅ©±â (¹ÙÀÌÆ® ´ÜÀ§)
    CacheMinFileSize bytes 1 svX
    ij½¬¿¡ ÀúÀåÇÒ ¹®¼­ÀÇ ÃÖ¼ÒÅ©±â (¹ÙÀÌÆ® ´ÜÀ§)
    CacheNegotiatedDocs On|Off Off svB
    Allows content-negotiated documents to be +cached by proxy servers
    CacheRoot directorysvX
    ij½¬ ÆÄÀÏÀ» ÀúÀåÇÒ µð·ºÅ丮 root
    CacheSize KBytes 1000000 svX
    ij½¬·Î »ç¿ëÇÒ ÃÖ´ë µð½ºÅ©°ø°£ (KByte ´ÜÀ§)
    CacheTimeMargin ? ? svX
    ¹®¼­¸¦ ij½¬ÇÒ Ãּҽð£ ÇÑ°è
    CGIMapExtension cgi-path .extensiondhC
    Technique for locating the interpreter for CGI +scripts
    CharsetDefault charsetsvdhX
    º¯È¯ÇÒ ¹®ÀÚÁýÇÕ
    CharsetOptions option [option] ... DebugLevel=0 NoImpl +svdhX
    ¹®ÀÚÁýÇÕ º¯È¯ ±â´ÉÀ» ¼³Á¤
    CharsetSourceEnc charsetsvdhX
    ÆÄÀÏ ¿øº»ÀÇ ¹®ÀÚÁýÇÕ
    CheckSpelling on|off Off svdhE
    ¸ÂÃã¹ý ¸ðµâÀ» »ç¿ëÇÑ´Ù
    ChildPerUserID user-id group-id +num-childrensM
    Specify user ID and group ID for a number of child +processes
    ContentDigest On|Off Off svdhC
    Enables the generation of Content-MD5 HTTP Response +headers
    CookieDomain domainsvdhE
    The domain to which the tracking cookie applies
    CookieExpires expiry-periodsvdhE
    Expiry time for the tracking cookie
    CookieLog filenamesvB
    ÄíÅ°¸¦ ·Î±×¿¡ ³²±â±âÀ§ÇØ »ç¿ëÇÒ ÆÄÀϸíÀ» ¼³Á¤ÇÑ´Ù
    CookieName token Apache svdhE
    Name of the tracking cookie
    CookieStyle + Netscape|Cookie|Cookie2|RFC2109|RFC2965 Netscape svdhE
    Format of the cookie header field
    CookieTracking on|off off svdhE
    Enables tracking cookie
    CoreDumpDirectory directorysM
    Directory where Apache attempts to +switch before dumping core
    CustomLog file|pipe +format|nickname +[env=[!]environment-variable]svB
    ·Î±×ÆÄÀÏ À̸§°ú Çü½ÄÀ» ÁöÁ¤ÇÑ´Ù
    Dav On|Off|provider-name Off dE
    WebDAV HTTP ¸Þ½áµå¸¦ ½ÃÀÛÇÑ´Ù
    DavDepthInfinity on|off off svdE
    PROPFINDÀÇ Depth: Infinity ¿äûÀ» Çã°¡ÇÑ´Ù
    DavLockDB file-pathsvE
    DAV Àá±Ý µ¥ÀÌÅͺ£À̽º À§Ä¡
    DavMinTimeout seconds 0 svdE
    ¼­¹ö°¡ DAV ÀÚ¿ø¿¡ ´ëÇØ À¯ÁöÇÒ Àá±ÝÀÇ Ãּҽð£
    DefaultIcon url-pathsvdhB
    ƯÁ¤ ¾ÆÀÌÄÜÀ» ¼³Á¤ÇÏÁö¾ÊÀº ÆÄÀÏ¿¡ »ç¿ëÇÒ ¾ÆÀÌÄÜ
    DefaultLanguage MIME-langsvdhB
    Sets all files in the given scope to the specified +language
    DefaultType MIME-type text/plain svdhC
    MIME content-type that will be sent if the +server cannot determine a type in any other way
    DeflateBufferSize value 8096 svE
    zlibÀÌ Çѹø¿¡ ¾ÐÃàÇÒ Å©±â
    DeflateCompressionLevel valuesvE
    Ãâ·ÂÀ» ¾î´ÀÁ¤µµ ¾ÐÃàÇϴ°¡
    DeflateFilterNote [type] notenamesvE
    ¾ÐÃà·üÀ» ·Î±×¿¡ ±â·ÏÇÑ´Ù
    DeflateMemLevel value 9 svE
    zlibÀÌ ¾ÐÃàÇÒ¶§ »ç¿ëÇÏ´Â ¸Þ¸ð¸®·®
    DeflateWindowSize value 15 svE
    Zlib ¾ÐÃà window size
    Deny from all|host|env=env-variable +[host|env=env-variable] ...dhB
    Controls which hosts are denied access to the +server
    <Directory directory-path> +... </Directory>svC
    Enclose a group of directives that apply only to the +named file-system directory and sub-directories
    DirectoryIndex + local-url [local-url] ... index.html svdhB
    Ŭ¶óÀ̾ðÆ®°¡ µð·ºÅ丮¸¦ ¿äûÇÒ¶§ ã¾Æº¼ ÀÚ¿ø ¸ñ·Ï
    <DirectoryMatch regex> +... </DirectoryMatch>svC
    Enclose directives that apply to +file-system directories matching a regular expression and their +subdirectories
    DirectorySlash On|Off On svdhB
    ¸¶Áö¸· ½½·¡½¬ ¸®´ÙÀÌ·º¼ÇÀ» Å°°í ²ö´Ù
    DocumentRoot directory-path /usr/local/apache/h +svC
    Directory that forms the main document tree visible +from the web
    DumpIOInput On|Off Off sX
    Dump all input data to the error log
    DumpIOOutput On|Off Off sX
    Dump all output data to the error log
    EnableExceptionHook On|Off Off sM
    Enables a hook that runs exception handlers +after a crash
    EnableMMAP On|Off On svdhC
    Use memory-mapping to read files during delivery
    EnableSendfile On|Off On svdhC
    Use the kernel sendfile support to deliver files to the client
    ErrorDocument error-code documentsvdhC
    What the server will return to the client +in case of an error
    ErrorLog file-path|syslog[:facility] logs/error_log (Uni +svC
    Location where the server will log errors
    ExamplesvdhX
    ¾ÆÆÄÄ¡ ¸ðµâ API¸¦ ¼³¸íÇϱâÀ§ÇÑ ¿¹Á¦ Áö½Ã¾î
    ExpiresActive On|OffsvdhE
    Expires Çì´õ¸¦ »ý¼ºÇÑ´Ù
    ExpiresByType MIME-type +<code>secondssvdhE
    MIME typeÀ¸·Î Expires Çì´õ°ªÀ» ¼³Á¤ÇÑ´Ù
    ExpiresDefault <code>secondssvdhE
    ¸¸±â½Ã°£À» °è»êÇÏ´Â ±âº» ¾Ë°í¸®Áò
    ExtendedStatus On|Off Off sB
    °¢ ¿äû¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ »óÅ Á¤º¸¸¦ ±â·ÏÇÑ´Ù
    ExtFilterDefine filtername parameterssE
    ¿ÜºÎ ÇÊÅ͸¦ Á¤ÀÇÇÑ´Ù
    ExtFilterOptions option [option] ... DebugLevel=0 NoLogS +dE
    mod_ext_filter ¿É¼ÇÀ» ¼³Á¤ÇÑ´Ù
    FileETag component ... INode MTime Size svdhC
    File attributes used to create the ETag +HTTP response header
    <Files filename> ... </Files>svdhC
    Contains directives that apply to matched +filenames
    <FilesMatch regex> ... </FilesMatch>svdhC
    Contains directives that apply to regular-expression matched +filenames
    ForceLanguagePriority None|Prefer|Fallback [Prefer|Fallback] Prefer svdhB
    Action to take if a single acceptable document is not +found
    ForceType MIME-type|NonedhC
    Forces all matching files to be served with the specified +MIME content-type
    ForensicLog filename|pipesvE
    Sets filename of the forensic log
    Group unix-group #-1 sM
    Group under which the server will answer +requests
    Header [condition] set|append|add|unset|echo +header [value] [env=[!]variable]svdhE
    HTTP ÀÀ´ä Çì´õ¸¦ ±¸¼ºÇÑ´Ù
    HeaderName filenamesvdhB
    ÆÄÀϸñ·Ï À§¿¡ »ðÀÔÇÒ ÆÄÀÏÀÇ À̸§
    HostnameLookups On|Off|Double Off svdC
    Enables DNS lookups on client IP addresses
    IdentityCheck On|Off Off svdC
    Enables logging of the RFC1413 identity of the remote +user
    <IfDefine [!]parameter-name> ... + </IfDefine>svdhC
    Encloses directives that will be processed only +if a test is true at startup
    <IfModule [!]module-name> ... + </IfModule>svdhC
    Encloses directives that are processed conditional on the +presence or absence of a specific module
    <IfVersion [[!]operator] version> ... +</IfVersion>svdhE
    ¹öÀüº° ¼³Á¤À» ¹­´Â´Ù
    ImapBase map|referer|URL http://servername/ svdhB
    À̹ÌÁö¸Ê ÆÄÀÏ¿¡¼­ base ±âº»°ª
    ImapDefault error|nocontent|map|referer|URL nocontent svdhB
    À̹ÌÁö¸Ê¿¡ ¾î´À ¿µ¿ª¿¡µµ ÇØ´çÇÏÁö ¾Ê´Â ÁÂÇ¥¸¦ ÁØ +°æ¿ì ±âº» Çൿ
    ImapMenu none|formatted|semiformatted|unformattedsvdhB
    ÁÂÇ¥¾øÀÌ À̹ÌÁö¸Ê ¿äû½Ã ÃëÇÒ Çൿ
    Include file-path|directory-pathsvdC
    Includes other configuration files from within +the server configuration files
    IndexIgnore file [file] ...svdhB
    µð·ºÅ丮 ¸ñ·Ï¿¡¼­ ¼û±æ ÆÄÀϸñ·ÏÀ» Ãß°¡ÇÑ´Ù
    IndexOptions [+|-]option [[+|-]option] +...svdhB
    µð·ºÅ丮 ¸ñ·ÏÀÇ ¿©·¯ ¼³Á¤µé
    IndexOrderDefault Ascending|Descending +Name|Date|Size|Description Ascending Name svdhB
    µð·ºÅ丮 ¸ñ·ÏÀÇ ±âº» ¼ø¼­¸¦ ¼³Á¤ÇÑ´Ù
    ISAPIAppendLogToErrors on|off off svdhB
    ISAPI exntensionÀÇ HSE_APPEND_LOG_PARAMETER +¿äûÀ» ¿À·ù ·Î±×¿¡ ±â·ÏÇÑ´Ù
    ISAPIAppendLogToQuery on|off on svdhB
    ISAPI exntensionÀÇ HSE_APPEND_LOG_PARAMETER +¿äûÀ» ÁúÀǹ®ÀÚ¿­¿¡ ±â·ÏÇÑ´Ù
    ISAPICacheFile file-path [file-path] +...svB
    ¼­¹ö°¡ ½ÃÀÛÇÒ¶§ ¸Þ¸ð¸®·Î ÀоîµéÀÏ ISAPI .dll ÆÄÀϵé
    ISAPIFakeAsync on|off off svdhB
    ºñµ¿±â ISAPI ÄݹéÀ» Áö¿øÇϴ ôÇÑ´Ù
    ISAPILogNotSupported on|off off svdhB
    ISAPI extensionÀÌ Áö¿øÇÏÁö ¾Ê´Â ±â´ÉÀ» ¿äûÇϸé +·Î±×¿¡ ±â·ÏÇÑ´Ù
    ISAPIReadAheadBuffer size 49152 svdhB
    ISAPI extensionÀÇ ¹Ì¸®Àбâ¹öÆÛ(read ahead buffer) +Å©±â
    KeepAlive On|Off On svC
    Enables HTTP persistent connections
    KeepAliveTimeout seconds 15 svC
    Amount of time the server will wait for subsequent +requests on a persistent connection
    LanguagePriority MIME-lang [MIME-lang] +...svdhB
    The precendence of language variants for cases where +the client does not express a preference
    LDAPCacheEntries number 1024 sX
    Maximum number of entries in the primary LDAP cache
    LDAPCacheTTL seconds 600 sX
    Time that cached items remain valid
    LDAPConnectionTimeout secondssX
    Specifies the socket connection timeout in seconds
    LDAPOpCacheEntries number 1024 sX
    Number of entries used to cache LDAP compare +operations
    LDAPOpCacheTTL seconds 600 sX
    Time that entries in the operation cache remain +valid
    LDAPSharedCacheFile directory-path/filenamesX
    Sets the shared memory cache file
    LDAPSharedCacheSize bytes 102400 sX
    Size in bytes of the shared-memory cache
    LDAPTrustedCA directory-path/filenamesX
    Sets the file containing the trusted Certificate Authority certificate or database
    LDAPTrustedCAType typesX
    Specifies the type of the Certificate Authority file
    <Limit method [method] ... > ... + </Limit>svdhC
    Restrict enclosed access controls to only certain HTTP +methods
    <LimitExcept method [method] ... > ... + </LimitExcept>svdhC
    Restrict access controls to all HTTP methods +except the named ones
    LimitInternalRecursion number [number] 10 svC
    Determine maximum number of internal redirects and nested +subrequests
    LimitRequestBody bytes 0 svdhC
    Restricts the total size of the HTTP request body sent +from the client
    LimitRequestFields number 100 sC
    Limits the number of HTTP request header fields that +will be accepted from the client
    LimitRequestFieldsize bytessC
    Limits the size of the HTTP request header allowed from the +client
    LimitRequestLine bytes 8190 sC
    Limit the size of the HTTP request line that will be accepted +from the client
    LimitXMLRequestBody bytes 1000000 svdhC
    Limits the size of an XML-based request body
    Listen [IP-address:]portnumbersM
    IP addresses and ports that the server +listens to
    ListenBacklog backlogsM
    Maximum length of the queue of pending connections
    LoadFile filename [filename] ...sE
    ÁöÁ¤ÇÑ ¸ñÀûÆÄÀÏÀ̳ª ¶óÀ̺귯¸®¸¦ ÀоîµéÀδÙ
    LoadModule module filenamesE
    ¸ñÀûÆÄÀÏÀ̳ª ¶óÀ̺귯¸®¸¦ ÀоîµéÀÌ°í, »ç¿ë°¡´ÉÇÑ +¸ðµâ ¸ñ·Ï¿¡ Ãß°¡ÇÑ´Ù
    <Location + URL-path|URL> ... </Location>svC
    Applies the enclosed directives only to matching +URLs
    <LocationMatch + regex> ... </LocationMatch>svC
    Applies the enclosed directives only to regular-expression +matching URLs
    LockFile filename logs/accept.lock sM
    Location of the accept serialization lock file
    LogFormat format|nickname +[nickname] "%h %l %u %t \"%r\" +svB
    ·Î±×ÆÄÀÏ¿¡ »ç¿ëÇÒ Çü½ÄÀ» ±â¼úÇÑ´Ù
    LogLevel level warn svC
    Controls the verbosity of the ErrorLog
    MaxClients numbersM
    Maximum number of connections that will be processed +simultaneously
    MaxKeepAliveRequests number 100 svC
    Number of requests allowed on a persistent +connection
    MaxMemFree KBytes 0 sM
    Maximum amount of memory that the main allocator is allowed +to hold without calling free()
    MaxRequestsPerChild number 10000 sM
    Limit on the number of requests that an individual child server +will handle during its life
    MaxRequestsPerThread number 0 sM
    ÇÑ ¾²·¹µå°¡ ½ÇÇàÇÏ´Â µ¿¾È ó¸®ÇÒ ¿äû°³¼ö ÇÑ°è
    MaxSpareServers number 10 sM
    Maximum number of idle child server processes
    MaxSpareThreads numbersM
    Maximum number of idle threads
    MaxThreads number 2048 sM
    Set the maximum number of worker threads
    MaxThreadsPerChild number 64 sM
    Maximum number of threads per child process
    MCacheMaxObjectCount value 1009 sX
    ij½¬¿¡ ÀúÀåÇÒ ¼ö ÀÖ´Â ÃÖ´ë °´Ã¼°³¼ö
    MCacheMaxObjectSize bytes 10000 sX
    ij½¬¿¡ ÀúÀåÇÒ ¹®¼­ÀÇ ÃÖ´ë Å©±â (¹ÙÀÌÆ® ´ÜÀ§)
    MCacheMaxStreamingBuffer size_in_bytes 100000°ú MCacheMaxOb +sX
    ÀÀ´äÀ» ij½¬¾ÈÇÑ´Ù°í °áÁ¤Çϱâ Àü±îÁö ¸Þ¸ð¸® ¹öÆÛ¿¡ +ÀúÀåÇÒ ½ºÆ®¸² ÀÀ´äÀÇ ÃÖ´ë Å©±â
    MCacheMinObjectSize bytes 0 sX
    ij½¬¿¡ ÀúÀåÇÒ ¹®¼­ÀÇ ÃÖ¼Ò Å©±â (¹ÙÀÌÆ® ´ÜÀ§)
    MCacheRemovalAlgorithm LRU|GDSF GDSF sX
    ij½¬¿¡¼­ Á¦°ÅÇÒ ¹®¼­¸¦ ã´Â ¾Ë°í¸®Áò
    MCacheSize KBytes 100 sX
    ij½¬¿¡ »ç¿ëÇÒ ÃÖ´ë ¸Þ¸ð¸®·® (KByte ´ÜÀ§)
    MetaDir directory .web svdhE
    CERN ¸ÞŸÁ¤º¸¸¦ ãÀ» µð·ºÅ丮 À̸§
    MetaFiles on|off off svdhE
    CERN ¸ÞŸÆÄÀÏÀ» ó¸®ÇÑ´Ù
    MetaSuffix suffix .meta svdhE
    CERN ¸ÞŸÁ¤º¸¸¦ ÀúÀåÇÏ´Â ÆÄÀÏÀÇ Á¢¹Ì»ç
    MimeMagicFile file-pathsvE
    Enable MIME-type determination based on file contents +using the specified magic file
    MinSpareServers number 5 sM
    Minimum number of idle child server processes
    MinSpareThreads numbersM
    Minimum number of idle threads available to handle request +spikes
    MMapFile file-path [file-path] ...sX
    ½ÃÀ۽à ¿©·¯ ÆÄÀÏÀ» ¸Þ¸ð¸®¿¡ ´ëÀÀÇÑ´Ù
    ModMimeUsePathInfo On|Off Off dB
    Tells mod_mime to treat path_info +components as part of the filename
    MultiviewsMatch Any|NegotiatedOnly|Filters|Handlers +[Handlers|Filters] NegotiatedOnly svdhB
    The types of files that will be included when searching for +a matching file with MultiViews
    NameVirtualHost addr[:port]sC
    Designates an IP address for name-virtual +hosting
    NoProxy host [host] ...svE
    Hosts, domains, or networks that will be connected to +directly
    NumServers number 2 sM
    Total number of children alive at the same time
    NWSSLTrustedCerts filename [filename] ...sB
    List of additional client certificates
    NWSSLUpgradeable [IP-address:]portnumbersB
    Allows a connection to be upgraded to an SSL connection upon request
    Options + [+|-]option [[+|-]option] ... All svdhC
    Configures what features are available in a particular +directory
    Order ordering Deny,Allow dhB
    Controls the default access state and the order in which +Allow and Deny are +evaluated.
    PassEnv env-variable [env-variable] +...svdhB
    ½©¿¡¼­ ȯ°æº¯¼ö¸¦ °¡Á®¿Â´Ù
    PidFile filename logs/httpd.pid sM
    File where the server records the process ID +of the daemon
    ProtocolEcho On|OffsvX
    echo ¼­¹ö¸¦ Å°°í ²ö´Ù
    <Proxy wildcard-url> ...</Proxy>svE
    Container for directives applied to proxied resources
    ProxyBadHeader IsError|Ignore|StartBody IsError svE
    Determines how to handle bad header lines in a +response
    ProxyBlock *|word|host|domain +[word|host|domain] ...svE
    Words, hosts, or domains that are banned from being +proxied
    ProxyDomain DomainsvE
    Default domain name for proxied requests
    ProxyErrorOverride On|Off Off svE
    Override error pages for proxied content
    ProxyFtpDirCharset character set ISO-8859-1 svdE
    Define the character set for proxied FTP listings
    ProxyIOBufferSize bytes 8192 svE
    Determine size of internal data throughput buffer
    <ProxyMatch regex> ...</ProxyMatch>svE
    Container for directives applied to regular-expression-matched +proxied resources
    ProxyMaxForwards number 10 svE
    Maximium number of proxies that a request can be forwarded +through
    ProxyPass [path] !|urlsvdE
    Maps remote servers into the local server URL-space
    ProxyPassReverse [path] urlsvdE
    Adjusts the URL in HTTP response headers sent from a reverse +proxied server
    ProxyPreserveHost On|Off Off svE
    Use incoming Host HTTP request header for proxy +request
    ProxyReceiveBufferSize bytes 0 svE
    Network buffer size for proxied HTTP and FTP +connections
    ProxyRemote match remote-serversvE
    Remote proxy used to handle certain requests
    ProxyRemoteMatch regex remote-serversvE
    Remote proxy used to handle requests matched by regular +expressions
    ProxyRequests On|Off Off svE
    Enables forward (standard) proxy requests
    ProxyTimeout seconds 300 svE
    Network timeout for proxied requests
    ProxyVia On|Off|Full|Block Off svE
    Information provided in the Via HTTP response +header for proxied requests
    ReadmeName filenamesvdhB
    ÆÄÀϸñ·Ï ¸¶Áö¸·¿¡ »ðÀÔÇÒ ÆÄÀÏÀÇ À̸§
    ReceiveBufferSize bytes 0 sM
    TCP receive buffer size
    Redirect [status] URL-path +URLsvdhB
    Ŭ¶óÀ̾ðÆ®°¡ ´Ù¸¥ URL¿¡ Á¢¼ÓÇϵµ·Ï ¿äûÇÏ´Â ¿ÜºÎ +¸®´ÙÀÌ·º¼ÇÀ» º¸³½´Ù
    RedirectMatch [status] regex +URLsvdhB
    ÇöÀç URLÀÌ Á¤±ÔÇ¥Çö½Ä¿¡ ÇØ´çÇÏ¸é ¿ÜºÎ ¸®´ÙÀÌ·º¼ÇÀ» +º¸³½´Ù
    RedirectPermanent URL-path URLsvdhB
    Ŭ¶óÀ̾ðÆ®°¡ ´Ù¸¥ URL¿¡ Á¢¼ÓÇϵµ·Ï ¿äûÇÏ´Â ¿ÜºÎ +¿µ±¸ ¸®´ÙÀÌ·º¼ÇÀ» º¸³½´Ù
    RedirectTemp URL-path URLsvdhB
    Ŭ¶óÀ̾ðÆ®°¡ ´Ù¸¥ URL¿¡ Á¢¼ÓÇϵµ·Ï ¿äûÇÏ´Â ¿ÜºÎ +Àӽà ¸®´ÙÀÌ·º¼ÇÀ» º¸³½´Ù
    RemoveCharset extension [extension] +...vdhB
    Removes any character set associations for a set of file +extensions
    RemoveEncoding extension [extension] +...vdhB
    Removes any content encoding associations for a set of file +extensions
    RemoveHandler extension [extension] +...vdhB
    Removes any handler associations for a set of file +extensions
    RemoveInputFilter extension [extension] +...vdhB
    Removes any input filter associations for a set of file +extensions
    RemoveLanguage extension [extension] +...vdhB
    Removes any language associations for a set of file +extensions
    RemoveOutputFilter extension [extension] +...vdhB
    Removes any output filter associations for a set of file +extensions
    RemoveType extension [extension] +...vdhB
    Removes any content type associations for a set of file +extensions
    RequestHeader set|append|add|unset header +[value]svdhE
    HTTP ¿äû Çì´õ¸¦ ±¸¼ºÇÑ´Ù
    Require entity-name [entity-name] ...dhC
    Selects which authenticated users can access +a resource
    RewriteBase URL-pathdhE
    Sets the base URL for per-directory rewrites
    RewriteCond + TestString CondPatternsvdhE
    Defines a condition under which rewriting will take place +
    RewriteEngine on|off off svdhE
    Enables or disables runtime rewriting engine
    RewriteLock file-pathsE
    Sets the name of the lock file used for RewriteMap +synchronization
    RewriteLog file-pathsvE
    Sets the name of the file used for logging rewrite engine +processing
    RewriteLogLevel Level 0 svE
    Sets the verbosity of the log file used by the rewrite +engine
    RewriteMap MapName MapType:MapSource +svE
    Defines a mapping function for key-lookup
    RewriteOptions Options MaxRedirects=10 svdhE
    Sets some special options for the rewrite engine
    RewriteRule + Pattern SubstitutionsvdhE
    Defines rules for the rewriting engine
    RLimitCPU seconds|max [seconds|max]svdhC
    Limits the CPU consumption of processes launched +by Apache children
    RLimitMEM bytes|max [bytes|max]svdhC
    Limits the memory consumption of processes launched +by Apache children
    RLimitNPROC number|max [number|max]svdhC
    Limits the number of processes that can be launched by +processes launched by Apache children
    Satisfy Any|All All dhC
    Interaction between host-level access control and +user authentication
    ScoreBoardFile file-path logs/apache_status sM
    Location of the file used to store coordination data for +the child processes
    Script method cgi-scriptsvdB
    ƯÁ¤ ¿äû¸Þ¼­µå¿¡ ´ëÇØ CGI ½ºÅ©¸³Æ®¸¦ +»ç¿ëÇÑ´Ù.
    ScriptAlias URL-path +file-path|directory-pathsvB
    URLÀ» ƯÁ¤ ÆÄÀϽýºÅÛ Àå¼Ò·Î ´ëÀÀÇÏ°í ´ë»óÀÌ CGI +½ºÅ©¸³Æ®¶ó°í ¾Ë¸°´Ù
    ScriptAliasMatch regex +file-path|directory-pathsvB
    Á¤±ÔÇ¥Çö½ÄÀ» »ç¿ëÇÏ¿© URLÀ» ƯÁ¤ ÆÄÀϽýºÅÛ Àå¼Ò·Î +´ëÀÀÇÏ°í ´ë»óÀÌ CGI ½ºÅ©¸³Æ®¶ó°í ¾Ë¸°´Ù
    ScriptInterpreterSource Registry|Registry-Strict|Script Script svdhC
    Technique for locating the interpreter for CGI +scripts
    ScriptLog file-pathsvB
    CGI ½ºÅ©¸³Æ® ¿À·ù·Î±×ÆÄÀÏÀÇ À§Ä¡
    ScriptLogBuffer bytes 1024 svB
    ½ºÅ©¸³Æ® ·Î±×¿¡ ±â·ÏÇÒ PUT ȤÀº POST ¿äûÀÇ ÃÖ´ë·®
    ScriptLogLength bytes 10385760 svB
    CGI ½ºÅ©¸³Æ® ·Î±×ÆÄÀÏÀÇ Å©±â Á¦ÇÑ
    ScriptSock file-path logs/cgisock svB
    cgi µ¥¸ó°ú Åë½ÅÀ» À§ÇØ »ç¿ëÇÒ ¼ÒÄÏÀÇ À̸§
    SecureListen [IP-address:]portnumber +Certificate-Name [MUTUAL]sB
    Enables SSL encryption for the specified port
    SendBufferSize bytes 0 sM
    TCP buffer size
    ServerAdmin email-addresssvC
    Email address that the server includes in error +messages sent to the client
    ServerAlias hostname [hostname] ...vC
    Alternate names for a host used when matching requests +to name-virtual hosts
    ServerLimit numbersM
    Upper limit on configurable number of processes
    ServerName fully-qualified-domain-name[:port]svC
    Hostname and port that the server uses to identify +itself
    ServerPath URL-pathvC
    Legacy URL pathname for a name-based virtual host that +is accessed by an incompatible browser
    ServerRoot directory-path /usr/local/apache sC
    Base directory for the server installation
    ServerSignature On|Off|EMail Off svdhC
    Configures the footer on server-generated documents
    ServerTokens Major|Minor|Min[imal]|Prod[uctOnly]|OS|Full Full sC
    Configures the Server HTTP response +header
    SetEnv env-variable valuesvdhB
    ȯ°æº¯¼ö¸¦ ¼³Á¤ÇÑ´Ù
    SetEnvIf attribute + regex [!]env-variable[=value] + [[!]env-variable[=value]] ...svdhB
    ¿äûÀÇ ¼ºÁú¿¡ µû¶ó ȯ°æº¯¼ö¸¦ ¼³Á¤ÇÑ´Ù
    SetEnvIfNoCase attribute regex + [!]env-variable[=value] + [[!]env-variable[=value]] ...svdhB
    ´ë¼Ò¹®ÀÚ¸¦ ±¸º°ÇÏÁö¾Ê°í ¿äûÀÇ ¼ºÁú¿¡ µû¶ó ȯ°æº¯¼ö¸¦ +¼³Á¤ÇÑ´Ù
    SetHandler handler-name|NonesvdhC
    Forces all matching files to be processed by a +handler
    SetInputFilter filter[;filter...]svdhC
    Sets the filters that will process client requests and POST +input
    SetOutputFilter filter[;filter...]svdhC
    Sets the filters that will process responses from the +server
    SSIEndTag tag "-->" svB
    String that ends an include element
    SSIErrorMsg message "[an error occurred +svdhB
    Error message displayed when there is an SSI +error
    SSIStartTag tag "<!--#" svB
    String that starts an include element
    SSITimeFormat formatstring "%A, %d-%b-%Y %H:%M +svdhB
    Configures the format in which date strings are +displayed
    SSIUndefinedEcho string "(none)" svB
    String displayed when an unset variable is echoed
    SSLCACertificateFile file-pathsvE
    File of concatenated PEM-encoded CA Certificates +for Client Auth
    SSLCACertificatePath directory-pathsvE
    Directory of PEM-encoded CA Certificates for +Client Auth
    SSLCARevocationFile file-pathsvE
    File of concatenated PEM-encoded CA CRLs for +Client Auth
    SSLCARevocationPath directory-pathsvE
    Directory of PEM-encoded CA CRLs for +Client Auth
    SSLCertificateChainFile file-pathsvE
    File of PEM-encoded Server CA Certificates
    SSLCertificateFile file-pathsvE
    Server PEM-encoded X.509 Certificate file
    SSLCertificateKeyFile file-pathsvE
    Server PEM-encoded Private Key file
    SSLCipherSuite cipher-spec ALL:!ADH:RC4+RSA:+H +svdhE
    Cipher Suite available for negotiation in SSL +handshake
    SSLEngine on|off off svE
    SSL Engine Operation Switch
    SSLInsecureRenegotiation flag off svE
    Option to enable support for insecure renegotiation
    SSLMutex type none sE
    Semaphore for internal mutual exclusion of +operations
    SSLOptions [+|-]option ...svdhE
    Configure various SSL engine run-time options
    SSLPassPhraseDialog type builtin sE
    Type of pass phrase dialog for encrypted private +keys
    SSLProtocol [+|-]protocol ... all svE
    Configure usable SSL protocol flavors
    SSLProxyCACertificateFile file-pathsvE
    File of concatenated PEM-encoded CA Certificates +for Remote Server Auth
    SSLProxyCACertificatePath directory-pathsvE
    Directory of PEM-encoded CA Certificates for +Remote Server Auth
    SSLProxyCARevocationFile file-pathsvE
    File of concatenated PEM-encoded CA CRLs for +Remote Server Auth
    SSLProxyCARevocationPath directory-pathsvE
    Directory of PEM-encoded CA CRLs for +Remote Server Auth
    SSLProxyCipherSuite cipher-spec ALL:!ADH:RC4+RSA:+H +svdhE
    Cipher Suite available for negotiation in SSL +proxy handshake
    SSLProxyEngine on|off off svE
    SSL Proxy Engine Operation Switch
    SSLProxyMachineCertificateFile filenamesE
    File of concatenated PEM-encoded client certificates and keys to be used by the proxy
    SSLProxyMachineCertificatePath directorysE
    Directory of PEM-encoded client certificates and keys to be used by the proxy
    SSLProxyProtocol [+|-]protocol ... all svE
    Configure usable SSL protocol flavors for proxy usage
    SSLProxyVerify level none svdhE
    Type of remote server Certificate verification
    SSLProxyVerifyDepth number 1 svdhE
    Maximum depth of CA Certificates in Remote Server +Certificate verification
    SSLRandomSeed context source +[bytes]sE
    Pseudo Random Number Generator (PRNG) seeding +source
    SSLRequire expressiondhE
    Allow access only when an arbitrarily complex +boolean expression is true
    SSLRequireSSLdhE
    Deny access when SSL is not used for the +HTTP request
    SSLSessionCache type none sE
    Type of the global/inter-process SSL Session +Cache
    SSLSessionCacheTimeout seconds 300 svE
    Number of seconds before an SSL session expires +in the Session Cache
    SSLUserName varnamesdhE
    Variable name to determine user name
    SSLVerifyClient level none svdhE
    Type of Client Certificate verification
    SSLVerifyDepth number 1 svdhE
    Maximum depth of CA Certificates in Client +Certificate verification
    StartServers numbersM
    Number of child server processes created at startup
    StartThreads numbersM
    Number of threads created on startup
    SuexecUserGroup User GroupsvE
    CGI ÇÁ·Î±×·¥ÀÌ »ç¿ëÇÒ »ç¿ëÀÚ¿Í ±×·ì ±ÇÇÑ
    ThreadLimit numbersM
    Sets the upper limit on the configurable number of threads +per child process
    ThreadsPerChild numbersM
    Number of threads created by each child process
    ThreadStackSize number 65536 sM
    Determine the stack size for each thread
    TimeOut seconds 300 svC
    Amount of time the server will wait for +certain events before failing a request
    TraceEnable [on|off|extended] on sC
    Determines the behaviour on TRACE +requests
    TransferLog file|pipesvB
    ·Î±×ÆÄÀÏ À§Ä¡¸¦ ¼³Á¤ÇÑ´Ù
    TypesConfig file-path conf/mime.types sB
    The location of the mime.types file
    UnsetEnv env-variable [env-variable] +...svdhB
    ȯ°æº¯¼ö¸¦ Á¦°ÅÇÑ´Ù
    UseCanonicalName On|Off|DNS On svdC
    Configures how the server determines its own name and +port
    User unix-userid #-1 sM
    The userid under which the server will answer +requests
    UserDir directory-filename public_html svB
    »ç¿ëÀÚº° µð·ºÅ丮 À§Ä¡
    VirtualDocumentRoot interpolated-directory|none none svE
    Dynamically configure the location of the document root +for a given virtual host
    VirtualDocumentRootIP interpolated-directory|none none svE
    Dynamically configure the location of the document root +for a given virtual host
    <VirtualHost + addr[:port] [addr[:port]] + ...> ... </VirtualHost>sC
    Contains directives that apply only to a specific +hostname or IP address
    VirtualScriptAlias interpolated-directory|none none svE
    Dynamically configure the location of the CGI directory for +a given virtual host
    VirtualScriptAliasIP interpolated-directory|none none svE
    Dynamically configure the location of the cgi directory for +a given virtual host
    Win32DisableAcceptExsM
    Use accept() rather than AcceptEx() to accept network connections
    XBitHack on|off|full off svdhB
    Parse SSI directives in files with the execute bit +set
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/quickreference.html.ru.koi8-r b/rubbos/app/httpd-2.0.64/docs/manual/mod/quickreference.html.ru.koi8-r new file mode 100644 index 00000000..924715e0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/quickreference.html.ru.koi8-r @@ -0,0 +1,726 @@ + + + +ëÒÁÔËÉÊ ÓÐÒÁ×ÏÞÎÉË ÐÏ ÄÉÒÅËÔÉ×ÁÍ - HTTP ÓÅÒ×ÅÒ Apache + + + + + + +
    <-
    + +

    ëÒÁÔËÉÊ ÓÐÒÁ×ÏÞÎÉË ÐÏ ÄÉÒÅËÔÉ×ÁÍ

    +
    +

    äÏÓÔÕÐÎÙÅ ÑÚÙËÉ:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    +
    üÔÏÔ ÐÅÒÅ×ÏÄ ÍÏÖÅÔ ÂÙÔØ ÕÓÔÁÒÅ×ÛÉÍ. óÍÏÔÒÉÔÅ + ÁÎÇÌÉÊÓËÕÀ ×ÅÒÓÉÀ ÄÌÑ ÏÚÎÁËÏÍÌÅÎÉÑ ÓÏ ×ÓÅÍÉ ÐÏÓÌÅÄÎÉÍÉ ÉÚÍÅÎÅÎÉÑÍÉ + × ÄÏËÕÍÅÎÔÅ.
    + +

    ÷ ËÒÁÔËÏÍ ÓÐÒÁ×ÏÞÎÉËÅ ÐÏ ÄÉÒÅËÔÉ×ÁÍ ×Ù ÎÁÊÄ£ÔÅ ÉÎÆÏÒÍÁÃÉÀ + Ï ÔÏÍ, ËÁË ÉÓÐÏÌØÚÏ×ÁÔØ ÔÕ ÉÌÉ ÉÎÕÀ ÄÉÒÅËÔÉ×Õ, Å£ ÚÎÁÞÅÎÉÅ ÐÏ ÕÍÏÌÞÁÎÉÀ, ÓÔÁÔÕÓ + É ËÏÎÔÅËÓÔ. äÌÑ ÒÁÓÛÉÆÒÏ×ËÉ ÐÏÎÑÔÉÊ «ÓÔÁÔÕÓ» É «ËÏÎÔÅËÓÔ», ÏÂÒÁÔÉÔÅÓØ + Ë óÌÏ×ÁÒÀ.

    + +

    ÷ ÐÅÒ×ÏÊ ËÏÌÏÎËÅ ÐÒÉ×ÏÄÉÔÓÑ ÎÁÚ×ÁÎÉÅ ÄÉÒÅËÔÉ×Ù É ÏÐÉÓÁÎÉŠţ + ÉÓÐÏÌØÚÏ×ÁÎÉÑ. ÷Ï ×ÔÏÒÏÊ - ÚÎÁÞÅÎÉÅ ÐÏ ÕÍÏÌÞÁÎÉÀ, ÅÓÌÉ ÔÁËÏ×ÏÅ + ÅÓÔØ Õ ÄÉÒÅËÔÉ×Ù. åÓÌÉ ÜÔÏ ÚÎÁÞÅÎÉÅ ÓÌÉÛËÏÍ ×ÅÌÉËÏ, ÔÏ ÐÏÓÌÅ + ÐÅÒ×ÙÈ ÂÕË× ÉÄÅÔ ÚÎÁÞ£Ë «+».

    + +

    ÷ ÔÒÅÔØÅÊ É ÞÅÔ×£ÒÔÏÊ ËÏÌÏÎËÁÈ ÄÁÀÔÓÑ ÚÎÁÞÅÎÉÑ ËÏÎÔÅËÓÔÁ, × + ËÏÔÏÒÏÍ ÄÁÎÎÁÑ ÄÉÒÅËÔÉ×Á ÉÍÅÅÔ ÓÍÙÓÌ (ÍÏÖÅÔ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ), É + Å£ ÓÔÁÔÕÓ. ÷ÓÅ ÓÏËÒÁÝÅÎÉÑ, ÉÓÐÏÌØÚÕÅÍÙÅ ÐÒÉ ÜÔÏÍ, ÒÁÓÛÉÆÒÏ×Ù×ÁÀÔÓÑ + × ÓÌÅÄÕÀÝÅÊ ÔÁÂÌÉÃÅ.

    +
    +
    + + + +
     A  |  B  |  C  |  D  |  E  |  F  |  G  |  H  |  I  |  K  |  L  |  M  |  N  |  O  |  P  |  R  |  S  |  T  |  U  |  V  |  W  |  X  + + + +
    sserver config
    vvirtual host
    ddirectory
    h.htaccess
    + + + + +
    CCore
    MMPM
    BBase
    EExtension
    XExperimental
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AcceptMutex Default|method Default sM
    Method that Apache uses to serialize multiple children +accepting requests on network sockets
    AcceptPathInfo On|Off|Default Default svdhC
    Resources accept trailing pathname information
    AccessFileName filename [filename] ... .htaccess svC
    Name of the distributed configuration file
    Action action-type cgi-scriptsvdhB
    Activates a CGI script for a particular handler or +content-type
    AddAlt string file [file] ...svdhB
    Alternate text to display for a file, instead of an +icon selected by filename
    AddAltByEncoding string MIME-encoding +[MIME-encoding] ...svdhB
    Alternate text to display for a file instead of an icon +selected by MIME-encoding
    AddAltByType string MIME-type +[MIME-type] ...svdhB
    Alternate text to display for a file, instead of an +icon selected by MIME content-type
    AddCharset charset extension +[extension] ...svdhB
    Maps the given filename extensions to the specified content +charset
    AddDefaultCharset On|Off|charset Off svdhC
    Default charset parameter to be added when a response +content-type is text/plain or text/html
    AddDescription string file [file] ...svdhB
    Description to display for a file
    AddEncoding MIME-enc extension +[extension] ...svdhB
    Maps the given filename extensions to the specified encoding +type
    AddHandler handler-name extension +[extension] ...svdhB
    Maps the filename extensions to the specified +handler
    AddIcon icon name [name] +...svdhB
    Icon to display for a file selected by name
    AddIconByEncoding icon MIME-encoding +[MIME-encoding] ...svdhB
    Icon to display next to files selected by MIME +content-encoding
    AddIconByType icon MIME-type +[MIME-type] ...svdhB
    Icon to display next to files selected by MIME +content-type
    AddInputFilter filter[;filter...] +extension [extension] ...svdhB
    Maps filename extensions to the filters that will process +client requests
    AddLanguage MIME-lang extension +[extension] ...svdhB
    Maps the given filename extension to the specified content +language
    AddModuleInfo module-name stringsvE
    Adds additional information to the module +information displayed by the server-info handler
    AddOutputFilter filter[;filter...] +extension [extension] ...svdhB
    Maps filename extensions to the filters that will process +responses from the server
    AddOutputFilterByType filter[;filter...] +MIME-type [MIME-type] ...svdhC
    assigns an output filter to a particular MIME-type
    AddType MIME-type extension +[extension] ...svdhB
    Maps the given filename extensions onto the specified content +type
    Alias URL-path +file-path|directory-pathsvB
    Maps URLs to filesystem locations
    AliasMatch regex +file-path|directory-pathsvB
    Maps URLs to filesystem locations using regular +expressions
    Allow from + all|host|env=env-variable + [host|env=env-variable] ...dhB
    Controls which hosts can access an area of the +server
    AllowCONNECT port [port] ... 443 563 svE
    Ports that are allowed to CONNECT through the +proxy
    AllowEncodedSlashes On|Off Off svC
    Determines whether encoded path separators in URLs are allowed to +be passed through
    AllowOverride All|None|directive-type +[directive-type] ... All dC
    Types of directives that are allowed in +.htaccess files
    Anonymous user [user] ...dhE
    Specifies userIDs that are allowed access without +password verification
    Anonymous_Authoritative On|Off Off dhE
    Configures if authorization will fall-through +to other methods
    Anonymous_LogEmail On|Off On dhE
    Sets whether the password entered will be logged in the +error log
    Anonymous_MustGiveEmail On|Off On dhE
    Specifies whether blank passwords are allowed
    Anonymous_NoUserID On|Off Off dhE
    Sets whether the userID field may be empty
    Anonymous_VerifyEmail On|Off Off dhE
    Sets whether to check the password field for a correctly +formatted email address
    AssignUserID user-id group-idvM
    Tie a virtual host to a user and group ID
    AuthAuthoritative On|Off On dhB
    Sets whether authorization and authentication are +passed to lower level modules
    AuthDBMAuthoritative On|Off On dhE
    Sets whether authentication and authorization will be +passed on to lower level modules
    AuthDBMGroupFile file-pathdhE
    Sets the name of the database file containing the list +of user groups for authentication
    AuthDBMType default|SDBM|GDBM|NDBM|DB default dhE
    Sets the type of database file that is used to +store passwords
    AuthDBMUserFile file-pathdhE
    Sets thename of a database file containing the list of users and +passwords for authentication
    AuthDigestAlgorithm MD5|MD5-sess MD5 dhX
    Selects the algorithm used to calculate the challenge and +response hases in digest authentication
    AuthDigestDomain URI [URI] ...dhX
    URIs that are in the same protection space for digest +authentication
    AuthDigestFile file-pathdhX
    Location of the text file containing the list +of users and encoded passwords for digest authentication
    AuthDigestGroupFile file-pathdhX
    Name of the text file containing the list of groups +for digest authentication
    AuthDigestNcCheck On|Off Off sX
    Enables or disables checking of the nonce-count sent by the +server
    AuthDigestNonceFormat formatdhX
    Determines how the nonce is generated
    AuthDigestNonceLifetime seconds 300 dhX
    How long the server nonce is valid
    AuthDigestQop none|auth|auth-int [auth|auth-int] auth dhX
    Determines the quality-of-protection to use in digest +authentication
    AuthDigestShmemSize size 1000 sX
    The amount of shared memory to allocate for keeping track +of clients
    AuthGroupFile file-pathdhB
    Sets the name of a text file containing the list +of user groups for authentication
    AuthLDAPAuthoritative on|off on dhX
    Prevent other authentication modules from +authenticating the user if this one fails
    AuthLDAPBindDN distinguished-namedhX
    Optional DN to use in binding to the LDAP server
    AuthLDAPBindPassword passworddhX
    Password used in conjuction with the bind DN
    AuthLDAPCharsetConfig file-pathsX
    Language to charset conversion configuration file
    AuthLDAPCompareDNOnServer on|off on dhX
    Use the LDAP server to compare the DNs
    AuthLDAPDereferenceAliases never|searching|finding|always Always dhX
    When will the module de-reference aliases
    AuthLDAPEnabled on|off on dhX
    Turn on or off LDAP authentication
    AuthLDAPFrontPageHack on|off off dhX
    Allow LDAP authentication to work with MS FrontPage
    AuthLDAPGroupAttribute attributedhX
    LDAP attributes used to check for group membership
    AuthLDAPGroupAttributeIsDN on|off on dhX
    Use the DN of the client username when checking for +group membership
    AuthLDAPRemoteUserIsDN on|off off dhX
    Use the DN of the client username to set the REMOTE_USER +environment variable
    AuthLDAPUrl urldhX
    URL specifying the LDAP search parameters
    AuthName auth-domaindhC
    Authorization realm for use in HTTP +authentication
    AuthType Basic|DigestdhC
    Type of user authentication
    AuthUserFile file-pathdhB
    Sets the name of a text file containing the list of users and +passwords for authentication
    BrowserMatch regex [!]env-variable[=value] +[[!]env-variable[=value]] ...svdhB
    Sets environment variables conditional on HTTP User-Agent +
    BrowserMatchNoCase regex [!]env-variable[=value] + [[!]env-variable[=value]] ...svdhB
    Sets environment variables conditional on User-Agent without +respect to case
    BS2000Account accountsM
    Define the non-privileged account on BS2000 +machines
    BufferedLogs On|Off Off sB
    Buffer log entries in memory before writing to disk
    CacheDefaultExpire seconds 3600 (one hour) svX
    The default duration to cache a document when no expiry date is specified.
    CacheDirLength length 2 svX
    The number of characters in subdirectory names
    CacheDirLevels levels 3 svX
    The number of levels of subdirectories in the +cache.
    CacheDisable url-stringsvX
    Disable caching of specified URLs
    CacheEnable cache_type url-stringsvX
    Enable caching of specified URLs using a specified storage +manager
    CacheExpiryCheck On|Off On svX
    Indicates if the cache observes Expires dates when seeking +files
    CacheFile file-path [file-path] ...sX
    Cache a list of file handles at startup time
    CacheForceCompletion Percentage 60 svX
    Percentage of document served, after which the server +will complete caching the file even if the request is cancelled.
    CacheGcClean hours url-string ? svX
    The time to retain unchanged cached files that match a +URL
    CacheGcDaily time ? svX
    The recurring time each day for garbage collection to be run. +(24 hour clock)
    CacheGcInterval hourssvX
    The interval between garbage collection attempts.
    CacheGcMemUsage KBytes ? svX
    The maximum kilobytes of memory used for garbage +collection
    CacheGcUnused hours url-string ? svX
    The time to retain unreferenced cached files that match a +URL.
    CacheIgnoreCacheControl On|Off Off svX
    Ignore the fact that the client requested the content not be +cached.
    CacheIgnoreHeaders header-string [header-string] ... None svX
    Do not store the given HTTP header(s) in the cache. +
    CacheIgnoreNoLastMod On|Off Off svX
    Ignore the fact that a response has no Last Modified +header.
    CacheLastModifiedFactor float 0.1 svX
    The factor used to compute an expiry date based on the +LastModified date.
    CacheMaxExpire seconds 86400 (one day) svX
    The maximum time in seconds to cache a document
    CacheMaxFileSize bytes 1000000 svX
    The maximum size (in bytes) of a document to be placed in the +cache
    CacheMinFileSize bytes 1 svX
    The minimum size (in bytes) of a document to be placed in the +cache
    CacheNegotiatedDocs On|Off Off svB
    Allows content-negotiated documents to be +cached by proxy servers
    CacheRoot directorysvX
    The directory root under which cache files are +stored
    CacheSize KBytes 1000000 svX
    The maximum amount of disk space that will be used by the +cache in KBytes
    CacheTimeMargin ? ? svX
    The minimum time margin to cache a document
    CGIMapExtension cgi-path .extensiondhC
    Technique for locating the interpreter for CGI +scripts
    CharsetDefault charsetsvdhX
    Charset to translate into
    CharsetOptions option [option] ... DebugLevel=0 NoImpl +svdhX
    Configures charset translation behavior
    CharsetSourceEnc charsetsvdhX
    Source charset of files
    CheckSpelling on|off Off svdhE
    Enables the spelling +module
    ChildPerUserID user-id group-id +num-childrensM
    Specify user ID and group ID for a number of child +processes
    ContentDigest On|Off Off svdhC
    Enables the generation of Content-MD5 HTTP Response +headers
    CookieDomain domainsvdhE
    The domain to which the tracking cookie applies
    CookieExpires expiry-periodsvdhE
    Expiry time for the tracking cookie
    CookieLog filenamesvB
    Sets filename for the logging of cookies
    CookieName token Apache svdhE
    Name of the tracking cookie
    CookieStyle + Netscape|Cookie|Cookie2|RFC2109|RFC2965 Netscape svdhE
    Format of the cookie header field
    CookieTracking on|off off svdhE
    Enables tracking cookie
    CoreDumpDirectory directorysM
    Directory where Apache attempts to +switch before dumping core
    CustomLog file|pipe +format|nickname +[env=[!]environment-variable]svB
    Sets filename and format of log file
    Dav On|Off|provider-name Off dE
    Enable WebDAV HTTP methods
    DavDepthInfinity on|off off svdE
    Allow PROPFIND, Depth: Infinity requests
    DavLockDB file-pathsvE
    Location of the DAV lock database
    DavMinTimeout seconds 0 svdE
    Minimum amount of time the server holds a lock on +a DAV resource
    DefaultIcon url-pathsvdhB
    Icon to display for files when no specific icon is +configured
    DefaultLanguage MIME-langsvdhB
    Sets all files in the given scope to the specified +language
    DefaultType MIME-type text/plain svdhC
    MIME content-type that will be sent if the +server cannot determine a type in any other way
    DeflateBufferSize value 8096 svE
    Fragment size to be compressed at one time by zlib
    DeflateCompressionLevel valuesvE
    How much compression do we apply to the output
    DeflateFilterNote [type] notenamesvE
    Places the compression ratio in a note for logging
    DeflateMemLevel value 9 svE
    How much memory should be used by zlib for compression
    DeflateWindowSize value 15 svE
    Zlib compression window size
    Deny from all|host|env=env-variable +[host|env=env-variable] ...dhB
    Controls which hosts are denied access to the +server
    <Directory directory-path> +... </Directory>svC
    Enclose a group of directives that apply only to the +named file-system directory and sub-directories
    DirectoryIndex + local-url [local-url] ... index.html svdhB
    List of resources to look for when the client requests +a directory
    <DirectoryMatch regex> +... </DirectoryMatch>svC
    Enclose directives that apply to +file-system directories matching a regular expression and their +subdirectories
    DirectorySlash On|Off On svdhB
    Toggle trailing slash redirects on or off
    DocumentRoot directory-path /usr/local/apache/h +svC
    Directory that forms the main document tree visible +from the web
    DumpIOInput On|Off Off sX
    Dump all input data to the error log
    DumpIOOutput On|Off Off sX
    Dump all output data to the error log
    EnableExceptionHook On|Off Off sM
    Enables a hook that runs exception handlers +after a crash
    EnableMMAP On|Off On svdhC
    Use memory-mapping to read files during delivery
    EnableSendfile On|Off On svdhC
    Use the kernel sendfile support to deliver files to the client
    ErrorDocument error-code documentsvdhC
    What the server will return to the client +in case of an error
    ErrorLog file-path|syslog[:facility] logs/error_log (Uni +svC
    Location where the server will log errors
    ExamplesvdhX
    Demonstration directive to illustrate the Apache module +API
    ExpiresActive On|OffsvdhE
    Enables generation of Expires +headers
    ExpiresByType MIME-type +<code>secondssvdhE
    Value of the Expires header configured +by MIME type
    ExpiresDefault <code>secondssvdhE
    Default algorithm for calculating expiration time
    ExtendedStatus On|Off Off sB
    Keep track of extended status information for each +request
    ExtFilterDefine filtername parameterssE
    Define an external filter
    ExtFilterOptions option [option] ... DebugLevel=0 NoLogS +dE
    Configure mod_ext_filter options
    FileETag component ... INode MTime Size svdhC
    File attributes used to create the ETag +HTTP response header
    <Files filename> ... </Files>svdhC
    Contains directives that apply to matched +filenames
    <FilesMatch regex> ... </FilesMatch>svdhC
    Contains directives that apply to regular-expression matched +filenames
    ForceLanguagePriority None|Prefer|Fallback [Prefer|Fallback] Prefer svdhB
    Action to take if a single acceptable document is not +found
    ForceType MIME-type|NonedhC
    Forces all matching files to be served with the specified +MIME content-type
    ForensicLog filename|pipesvE
    Sets filename of the forensic log
    Group unix-group #-1 sM
    Group under which the server will answer +requests
    Header [condition] set|append|add|unset|echo +header [value] [env=[!]variable]svdhE
    Configure HTTP response headers
    HeaderName filenamesvdhB
    Name of the file that will be inserted at the top +of the index listing
    HostnameLookups On|Off|Double Off svdC
    Enables DNS lookups on client IP addresses
    IdentityCheck On|Off Off svdC
    Enables logging of the RFC1413 identity of the remote +user
    <IfDefine [!]parameter-name> ... + </IfDefine>svdhC
    Encloses directives that will be processed only +if a test is true at startup
    <IfModule [!]module-name> ... + </IfModule>svdhC
    Encloses directives that are processed conditional on the +presence or absence of a specific module
    <IfVersion [[!]operator] version> ... +</IfVersion>svdhE
    contains version dependent configuration
    ImapBase map|referer|URL http://servername/ svdhB
    Default base for imagemap files
    ImapDefault error|nocontent|map|referer|URL nocontent svdhB
    Default action when an imagemap is called with coordinates +that are not explicitly mapped
    ImapMenu none|formatted|semiformatted|unformattedsvdhB
    Action if no coordinates are given when calling +an imagemap
    Include file-path|directory-pathsvdC
    Includes other configuration files from within +the server configuration files
    IndexIgnore file [file] ...svdhB
    Adds to the list of files to hide when listing +a directory
    IndexOptions [+|-]option [[+|-]option] +...svdhB
    Various configuration settings for directory +indexing
    IndexOrderDefault Ascending|Descending +Name|Date|Size|Description Ascending Name svdhB
    Sets the default ordering of the directory index
    ISAPIAppendLogToErrors on|off off svdhB
    Record HSE_APPEND_LOG_PARAMETER requests from +ISAPI extensions to the error log
    ISAPIAppendLogToQuery on|off on svdhB
    Record HSE_APPEND_LOG_PARAMETER requests from +ISAPI extensions to the query field
    ISAPICacheFile file-path [file-path] +...svB
    ISAPI .dll files to be loaded at startup
    ISAPIFakeAsync on|off off svdhB
    Fake asynchronous support for ISAPI callbacks
    ISAPILogNotSupported on|off off svdhB
    Log unsupported feature requests from ISAPI +extensions
    ISAPIReadAheadBuffer size 49152 svdhB
    Size of the Read Ahead Buffer sent to ISAPI +extensions
    KeepAlive On|Off On svC
    Enables HTTP persistent connections
    KeepAliveTimeout seconds 15 svC
    Amount of time the server will wait for subsequent +requests on a persistent connection
    LanguagePriority MIME-lang [MIME-lang] +...svdhB
    The precendence of language variants for cases where +the client does not express a preference
    LDAPCacheEntries number 1024 sX
    Maximum number of entries in the primary LDAP cache
    LDAPCacheTTL seconds 600 sX
    Time that cached items remain valid
    LDAPConnectionTimeout secondssX
    Specifies the socket connection timeout in seconds
    LDAPOpCacheEntries number 1024 sX
    Number of entries used to cache LDAP compare +operations
    LDAPOpCacheTTL seconds 600 sX
    Time that entries in the operation cache remain +valid
    LDAPSharedCacheFile directory-path/filenamesX
    Sets the shared memory cache file
    LDAPSharedCacheSize bytes 102400 sX
    Size in bytes of the shared-memory cache
    LDAPTrustedCA directory-path/filenamesX
    Sets the file containing the trusted Certificate Authority certificate or database
    LDAPTrustedCAType typesX
    Specifies the type of the Certificate Authority file
    <Limit method [method] ... > ... + </Limit>svdhC
    Restrict enclosed access controls to only certain HTTP +methods
    <LimitExcept method [method] ... > ... + </LimitExcept>svdhC
    Restrict access controls to all HTTP methods +except the named ones
    LimitInternalRecursion number [number] 10 svC
    Determine maximum number of internal redirects and nested +subrequests
    LimitRequestBody bytes 0 svdhC
    Restricts the total size of the HTTP request body sent +from the client
    LimitRequestFields number 100 sC
    Limits the number of HTTP request header fields that +will be accepted from the client
    LimitRequestFieldsize bytessC
    Limits the size of the HTTP request header allowed from the +client
    LimitRequestLine bytes 8190 sC
    Limit the size of the HTTP request line that will be accepted +from the client
    LimitXMLRequestBody bytes 1000000 svdhC
    Limits the size of an XML-based request body
    Listen [IP-address:]portnumbersM
    IP addresses and ports that the server +listens to
    ListenBacklog backlogsM
    Maximum length of the queue of pending connections
    LoadFile filename [filename] ...sE
    Link in the named object file or library
    LoadModule module filenamesE
    Links in the object file or library, and adds to the list +of active modules
    <Location + URL-path|URL> ... </Location>svC
    Applies the enclosed directives only to matching +URLs
    <LocationMatch + regex> ... </LocationMatch>svC
    Applies the enclosed directives only to regular-expression +matching URLs
    LockFile filename logs/accept.lock sM
    Location of the accept serialization lock file
    LogFormat format|nickname +[nickname] "%h %l %u %t \"%r\" +svB
    Describes a format for use in a log file
    LogLevel level warn svC
    Controls the verbosity of the ErrorLog
    MaxClients numbersM
    Maximum number of connections that will be processed +simultaneously
    MaxKeepAliveRequests number 100 svC
    Number of requests allowed on a persistent +connection
    MaxMemFree KBytes 0 sM
    Maximum amount of memory that the main allocator is allowed +to hold without calling free()
    MaxRequestsPerChild number 10000 sM
    Limit on the number of requests that an individual child server +will handle during its life
    MaxRequestsPerThread number 0 sM
    Limit on the number of requests that an individual thread +will handle during its life
    MaxSpareServers number 10 sM
    Maximum number of idle child server processes
    MaxSpareThreads numbersM
    Maximum number of idle threads
    MaxThreads number 2048 sM
    Set the maximum number of worker threads
    MaxThreadsPerChild number 64 sM
    Maximum number of threads per child process
    MCacheMaxObjectCount value 1009 sX
    The maximum number of objects allowed to be placed in the +cache
    MCacheMaxObjectSize bytes 10000 sX
    The maximum size (in bytes) of a document allowed in the +cache
    MCacheMaxStreamingBuffer size_in_bytes the smaller of 1000 +sX
    Maximum amount of a streamed response to buffer in memory +before declaring the response uncacheable
    MCacheMinObjectSize bytes 0 sX
    The minimum size (in bytes) of a document to be allowed in the +cache
    MCacheRemovalAlgorithm LRU|GDSF GDSF sX
    The algorithm used to select documents for removal from the +cache
    MCacheSize KBytes 100 sX
    The maximum amount of memory used by the cache in +KBytes
    MetaDir directory .web svdhE
    Name of the directory to find CERN-style meta information +files
    MetaFiles on|off off svdhE
    Activates CERN meta-file processing
    MetaSuffix suffix .meta svdhE
    File name suffix for the file containg CERN-style +meta information
    MimeMagicFile file-pathsvE
    Enable MIME-type determination based on file contents +using the specified magic file
    MinSpareServers number 5 sM
    Minimum number of idle child server processes
    MinSpareThreads numbersM
    Minimum number of idle threads available to handle request +spikes
    MMapFile file-path [file-path] ...sX
    Map a list of files into memory at startup time
    ModMimeUsePathInfo On|Off Off dB
    Tells mod_mime to treat path_info +components as part of the filename
    MultiviewsMatch Any|NegotiatedOnly|Filters|Handlers +[Handlers|Filters] NegotiatedOnly svdhB
    The types of files that will be included when searching for +a matching file with MultiViews
    NameVirtualHost addr[:port]sC
    Designates an IP address for name-virtual +hosting
    NoProxy host [host] ...svE
    Hosts, domains, or networks that will be connected to +directly
    NumServers number 2 sM
    Total number of children alive at the same time
    NWSSLTrustedCerts filename [filename] ...sB
    List of additional client certificates
    NWSSLUpgradeable [IP-address:]portnumbersB
    Allows a connection to be upgraded to an SSL connection upon request
    Options + [+|-]option [[+|-]option] ... All svdhC
    Configures what features are available in a particular +directory
    Order ordering Deny,Allow dhB
    Controls the default access state and the order in which +Allow and Deny are +evaluated.
    PassEnv env-variable [env-variable] +...svdhB
    Passes environment variables from the shell
    PidFile filename logs/httpd.pid sM
    File where the server records the process ID +of the daemon
    ProtocolEcho On|Off Off svX
    Turn the echo server on or off
    <Proxy wildcard-url> ...</Proxy>svE
    Container for directives applied to proxied resources
    ProxyBadHeader IsError|Ignore|StartBody IsError svE
    Determines how to handle bad header lines in a +response
    ProxyBlock *|word|host|domain +[word|host|domain] ...svE
    Words, hosts, or domains that are banned from being +proxied
    ProxyDomain DomainsvE
    Default domain name for proxied requests
    ProxyErrorOverride On|Off Off svE
    Override error pages for proxied content
    ProxyFtpDirCharset character set ISO-8859-1 svdE
    Define the character set for proxied FTP listings
    ProxyIOBufferSize bytes 8192 svE
    Determine size of internal data throughput buffer
    <ProxyMatch regex> ...</ProxyMatch>svE
    Container for directives applied to regular-expression-matched +proxied resources
    ProxyMaxForwards number 10 svE
    Maximium number of proxies that a request can be forwarded +through
    ProxyPass [path] !|urlsvdE
    Maps remote servers into the local server URL-space
    ProxyPassReverse [path] urlsvdE
    Adjusts the URL in HTTP response headers sent from a reverse +proxied server
    ProxyPreserveHost On|Off Off svE
    Use incoming Host HTTP request header for proxy +request
    ProxyReceiveBufferSize bytes 0 svE
    Network buffer size for proxied HTTP and FTP +connections
    ProxyRemote match remote-serversvE
    Remote proxy used to handle certain requests
    ProxyRemoteMatch regex remote-serversvE
    Remote proxy used to handle requests matched by regular +expressions
    ProxyRequests On|Off Off svE
    Enables forward (standard) proxy requests
    ProxyTimeout seconds 300 svE
    Network timeout for proxied requests
    ProxyVia On|Off|Full|Block Off svE
    Information provided in the Via HTTP response +header for proxied requests
    ReadmeName filenamesvdhB
    Name of the file that will be inserted at the end +of the index listing
    ReceiveBufferSize bytes 0 sM
    TCP receive buffer size
    Redirect [status] URL-path +URLsvdhB
    Sends an external redirect asking the client to fetch +a different URL
    RedirectMatch [status] regex +URLsvdhB
    Sends an external redirect based on a regular expression match +of the current URL
    RedirectPermanent URL-path URLsvdhB
    Sends an external permanent redirect asking the client to fetch +a different URL
    RedirectTemp URL-path URLsvdhB
    Sends an external temporary redirect asking the client to fetch +a different URL
    RemoveCharset extension [extension] +...vdhB
    Removes any character set associations for a set of file +extensions
    RemoveEncoding extension [extension] +...vdhB
    Removes any content encoding associations for a set of file +extensions
    RemoveHandler extension [extension] +...vdhB
    Removes any handler associations for a set of file +extensions
    RemoveInputFilter extension [extension] +...vdhB
    Removes any input filter associations for a set of file +extensions
    RemoveLanguage extension [extension] +...vdhB
    Removes any language associations for a set of file +extensions
    RemoveOutputFilter extension [extension] +...vdhB
    Removes any output filter associations for a set of file +extensions
    RemoveType extension [extension] +...vdhB
    Removes any content type associations for a set of file +extensions
    RequestHeader set|append|add|unset header +[value [env=[!]variable]]svdhE
    Configure HTTP request headers
    Require entity-name [entity-name] ...dhC
    Selects which authenticated users can access +a resource
    RewriteBase URL-pathdhE
    Sets the base URL for per-directory rewrites
    RewriteCond + TestString CondPatternsvdhE
    Defines a condition under which rewriting will take place +
    RewriteEngine on|off off svdhE
    Enables or disables runtime rewriting engine
    RewriteLock file-pathsE
    Sets the name of the lock file used for RewriteMap +synchronization
    RewriteLog file-pathsvE
    Sets the name of the file used for logging rewrite engine +processing
    RewriteLogLevel Level 0 svE
    Sets the verbosity of the log file used by the rewrite +engine
    RewriteMap MapName MapType:MapSource +svE
    Defines a mapping function for key-lookup
    RewriteOptions Options MaxRedirects=10 svdhE
    Sets some special options for the rewrite engine
    RewriteRule + Pattern SubstitutionsvdhE
    Defines rules for the rewriting engine
    RLimitCPU seconds|max [seconds|max]svdhC
    Limits the CPU consumption of processes launched +by Apache children
    RLimitMEM bytes|max [bytes|max]svdhC
    Limits the memory consumption of processes launched +by Apache children
    RLimitNPROC number|max [number|max]svdhC
    Limits the number of processes that can be launched by +processes launched by Apache children
    Satisfy Any|All All dhC
    Interaction between host-level access control and +user authentication
    ScoreBoardFile file-path logs/apache_status sM
    Location of the file used to store coordination data for +the child processes
    Script method cgi-scriptsvdB
    Activates a CGI script for a particular request +method.
    ScriptAlias URL-path +file-path|directory-pathsvB
    Maps a URL to a filesystem location and designates the +target as a CGI script
    ScriptAliasMatch regex +file-path|directory-pathsvB
    Maps a URL to a filesystem location using a regular expression +and designates the target as a CGI script
    ScriptInterpreterSource Registry|Registry-Strict|Script Script svdhC
    Technique for locating the interpreter for CGI +scripts
    ScriptLog file-pathsvB
    Location of the CGI script error logfile
    ScriptLogBuffer bytes 1024 svB
    Maximum amount of PUT or POST requests that will be recorded +in the scriptlog
    ScriptLogLength bytes 10385760 svB
    Size limit of the CGI script logfile
    ScriptSock file-path logs/cgisock svB
    The name of the socket to use for communication with +the cgi daemon
    SecureListen [IP-address:]portnumber +Certificate-Name [MUTUAL]sB
    Enables SSL encryption for the specified port
    SendBufferSize bytes 0 sM
    TCP buffer size
    ServerAdmin email-addresssvC
    Email address that the server includes in error +messages sent to the client
    ServerAlias hostname [hostname] ...vC
    Alternate names for a host used when matching requests +to name-virtual hosts
    ServerLimit numbersM
    Upper limit on configurable number of processes
    ServerName fully-qualified-domain-name[:port]svC
    Hostname and port that the server uses to identify +itself
    ServerPath URL-pathvC
    Legacy URL pathname for a name-based virtual host that +is accessed by an incompatible browser
    ServerRoot directory-path /usr/local/apache sC
    Base directory for the server installation
    ServerSignature On|Off|EMail Off svdhC
    Configures the footer on server-generated documents
    ServerTokens Major|Minor|Min[imal]|Prod[uctOnly]|OS|Full Full sC
    Configures the Server HTTP response +header
    SetEnv env-variable valuesvdhB
    Sets environment variables
    SetEnvIf attribute + regex [!]env-variable[=value] + [[!]env-variable[=value]] ...svdhB
    Sets environment variables based on attributes of the request +
    SetEnvIfNoCase attribute regex + [!]env-variable[=value] + [[!]env-variable[=value]] ...svdhB
    Sets environment variables based on attributes of the request +without respect to case
    SetHandler handler-name|NonesvdhC
    Forces all matching files to be processed by a +handler
    SetInputFilter filter[;filter...]svdhC
    Sets the filters that will process client requests and POST +input
    SetOutputFilter filter[;filter...]svdhC
    Sets the filters that will process responses from the +server
    SSIEndTag tag "-->" svB
    String that ends an include element
    SSIErrorMsg message "[an error occurred +svdhB
    Error message displayed when there is an SSI +error
    SSIStartTag tag "<!--#" svB
    String that starts an include element
    SSITimeFormat formatstring "%A, %d-%b-%Y %H:%M +svdhB
    Configures the format in which date strings are +displayed
    SSIUndefinedEcho string "(none)" svB
    String displayed when an unset variable is echoed
    SSLCACertificateFile file-pathsvE
    File of concatenated PEM-encoded CA Certificates +for Client Auth
    SSLCACertificatePath directory-pathsvE
    Directory of PEM-encoded CA Certificates for +Client Auth
    SSLCARevocationFile file-pathsvE
    File of concatenated PEM-encoded CA CRLs for +Client Auth
    SSLCARevocationPath directory-pathsvE
    Directory of PEM-encoded CA CRLs for +Client Auth
    SSLCertificateChainFile file-pathsvE
    File of PEM-encoded Server CA Certificates
    SSLCertificateFile file-pathsvE
    Server PEM-encoded X.509 Certificate file
    SSLCertificateKeyFile file-pathsvE
    Server PEM-encoded Private Key file
    SSLCipherSuite cipher-spec ALL:!ADH:RC4+RSA:+H +svdhE
    Cipher Suite available for negotiation in SSL +handshake
    SSLEngine on|off off svE
    SSL Engine Operation Switch
    SSLInsecureRenegotiation flag off svE
    Option to enable support for insecure renegotiation
    SSLMutex type none sE
    Semaphore for internal mutual exclusion of +operations
    SSLOptions [+|-]option ...svdhE
    Configure various SSL engine run-time options
    SSLPassPhraseDialog type builtin sE
    Type of pass phrase dialog for encrypted private +keys
    SSLProtocol [+|-]protocol ... all svE
    Configure usable SSL protocol flavors
    SSLProxyCACertificateFile file-pathsvE
    File of concatenated PEM-encoded CA Certificates +for Remote Server Auth
    SSLProxyCACertificatePath directory-pathsvE
    Directory of PEM-encoded CA Certificates for +Remote Server Auth
    SSLProxyCARevocationFile file-pathsvE
    File of concatenated PEM-encoded CA CRLs for +Remote Server Auth
    SSLProxyCARevocationPath directory-pathsvE
    Directory of PEM-encoded CA CRLs for +Remote Server Auth
    SSLProxyCipherSuite cipher-spec ALL:!ADH:RC4+RSA:+H +svdhE
    Cipher Suite available for negotiation in SSL +proxy handshake
    SSLProxyEngine on|off off svE
    SSL Proxy Engine Operation Switch
    SSLProxyMachineCertificateFile filenamesE
    File of concatenated PEM-encoded client certificates and keys to be used by the proxy
    SSLProxyMachineCertificatePath directorysE
    Directory of PEM-encoded client certificates and keys to be used by the proxy
    SSLProxyProtocol [+|-]protocol ... all svE
    Configure usable SSL protocol flavors for proxy usage
    SSLProxyVerify level none svdhE
    Type of remote server Certificate verification
    SSLProxyVerifyDepth number 1 svdhE
    Maximum depth of CA Certificates in Remote Server +Certificate verification
    SSLRandomSeed context source +[bytes]sE
    Pseudo Random Number Generator (PRNG) seeding +source
    SSLRequire expressiondhE
    Allow access only when an arbitrarily complex +boolean expression is true
    SSLRequireSSLdhE
    Deny access when SSL is not used for the +HTTP request
    SSLSessionCache type none sE
    Type of the global/inter-process SSL Session +Cache
    SSLSessionCacheTimeout seconds 300 svE
    Number of seconds before an SSL session expires +in the Session Cache
    SSLUserName varnamesdhE
    Variable name to determine user name
    SSLVerifyClient level none svdhE
    Type of Client Certificate verification
    SSLVerifyDepth number 1 svdhE
    Maximum depth of CA Certificates in Client +Certificate verification
    StartServers numbersM
    Number of child server processes created at startup
    StartThreads numbersM
    Number of threads created on startup
    SuexecUserGroup User GroupsvE
    User and group for CGI programs to run as
    ThreadLimit numbersM
    Sets the upper limit on the configurable number of threads +per child process
    ThreadsPerChild numbersM
    Number of threads created by each child process
    ThreadStackSize number 65536 sM
    Determine the stack size for each thread
    TimeOut seconds 300 svC
    Amount of time the server will wait for +certain events before failing a request
    TraceEnable [on|off|extended] on sC
    Determines the behaviour on TRACE +requests
    TransferLog file|pipesvB
    Specify location of a log file
    TypesConfig file-path conf/mime.types sB
    The location of the mime.types file
    UnsetEnv env-variable [env-variable] +...svdhB
    Removes variables from the environment
    UseCanonicalName On|Off|DNS On svdC
    Configures how the server determines its own name and +port
    User unix-userid #-1 sM
    The userid under which the server will answer +requests
    UserDir directory-filename public_html svB
    Location of the user-specific directories
    VirtualDocumentRoot interpolated-directory|none none svE
    Dynamically configure the location of the document root +for a given virtual host
    VirtualDocumentRootIP interpolated-directory|none none svE
    Dynamically configure the location of the document root +for a given virtual host
    <VirtualHost + addr[:port] [addr[:port]] + ...> ... </VirtualHost>sC
    Contains directives that apply only to a specific +hostname or IP address
    VirtualScriptAlias interpolated-directory|none none svE
    Dynamically configure the location of the CGI directory for +a given virtual host
    VirtualScriptAliasIP interpolated-directory|none none svE
    Dynamically configure the location of the cgi directory for +a given virtual host
    Win32DisableAcceptExsM
    Use accept() rather than AcceptEx() to accept network connections
    XBitHack on|off|full off svdhB
    Parse SSI directives in files with the execute bit +set
    +
    +

    äÏÓÔÕÐÎÙÅ ÑÚÙËÉ:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/quickreference.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/quickreference.html.tr.utf8 new file mode 100644 index 00000000..512004ee --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/quickreference.html.tr.utf8 @@ -0,0 +1,723 @@ + + + +Hızlı Yönerge Kılavuzu - Apache HTTP Sunucusu + + + + + + +
    <-
    + +

    Hızlı Yönerge Kılavuzu

    +
    +

    Mevcut Diller:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + +

    Bu hızlı yönerge kılavuzunda Apache yapılandırma yönergelerinin kullanımı, öntanımlı değerleri, durumu ve bağlamı gösterilmiştir. Bunların her biri hakkında ayrıntılı bilgi almak için Yönerge Sözlüğüne bakınız.

    + +

    İlk sütunda yönergenin ismi ve kullanımı belirtilmiştir. İkinci sütunda yönergenin varsa öntanımlı değeri gösterilmiştir. Eğer öntanımlı değer sütuna sığmayacak kadar uzunsa sığmayan kısmın yerine “+” imi konmuştur.

    + +

    Aşağıda sağdaki gösterge tablolarına uygun olarak, üçüncü sütunda yönergenin kullanımına izin verilen bağlamlar, dördüncü sütunda ise yönergenin durumu gösterilmiştir.

    +
    +
    + + + +
     A  |  B  |  C  |  D  |  E  |  F  |  G  |  H  |  I  |  K  |  L  |  M  |  N  |  O  |  P  |  R  |  S  |  T  |  U  |  V  |  W  |  X  + + + +
    ssunucu geneli
    ksanal konak
    ddizin
    h.htaccess
    + + + + +
    ÇÇekirdek
    MMPM
    TTemel
    EEklenti
    DDeneysel
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    AcceptMutex Default|yöntem Default sM
    Apache HTTPd Sunucusunun ağ soketlerinden istekleri kabul eden + çok sayıda çocuk süreci sıraya sokmak için kullandığı yöntemi + belirler.
    AcceptPathInfo On|Off|Default Default skdhÇ
    Dosya isminden sonra belirtilen yol verisini kabul veya + reddeder.
    AccessFileName filename [filename] ... .htaccess skÇ
    Dağıtık yapılandırma dosyasının ismi belirtilir.
    Action action-type cgi-scriptskdhT
    Activates a CGI script for a particular handler or +content-type
    AddAlt metin dosya [dosya] ...skdhT
    Dosyaya göre seçilen simgenin yerinde gösterilecek metni belirler. +
    AddAltByEncoding metin MIME-kodlaması +[MIME-kodlaması] ...skdhT
    Dosyanın MIME kodlamasına göre seçilen simgenin yerinde +gösterilecek metni belirler.
    AddAltByType metin MIME-türü +[MIME-türü] ...skdhT
    Dosyanın MIME türüne göre seçilen simgenin yerinde gösterilecek +metni belirler.
    AddCharset charset extension +[extension] ...skdhT
    Maps the given filename extensions to the specified content +charset
    AddDefaultCharset On|Off|karküm Off skdhÇ
    Bir yanıtın içerik türü text/plain veya + text/html olduğunda eklenecek öntanımlı karakter kümesi + parametresini belirler.
    AddDescription metin dosya [dosya] ...skdhT
    Bir dosya için gösterilecek açıklama belirtilir.
    AddEncoding MIME-enc extension +[extension] ...skdhT
    Maps the given filename extensions to the specified encoding +type
    AddHandler handler-name extension +[extension] ...skdhT
    Maps the filename extensions to the specified +handler
    AddIcon simge isim [isim] +...skdhT
    Bir dosya için gösterilecek simgeyi dosya adına göre belirler. +
    AddIconByEncoding simge MIME-kodlaması +[MIME-kodlaması] ...skdhT
    Bir dosya için gösterilecek simgeyi dosyanın MIME kodlamasına +göre belirler.
    AddIconByType simge MIME-türü +[MIME-türü] ...skdhT
    Bir dosya için gösterilecek simgeyi dosyanın MIME türüne göre +belirler.
    AddInputFilter filter[;filter...] +extension [extension] ...skdhT
    Maps filename extensions to the filters that will process +client requests
    AddLanguage MIME-lang extension +[extension] ...skdhT
    Maps the given filename extension to the specified content +language
    AddModuleInfo module-name stringskE
    Adds additional information to the module +information displayed by the server-info handler
    AddOutputFilter filter[;filter...] +extension [extension] ...skdhT
    Maps filename extensions to the filters that will process +responses from the server
    AddOutputFilterByType süzgeç[;süzgeç...] +MIME-türü [MIME-türü] ...skdhÇ
    Belli bir MIME türüne bir çıktı süzgeci atar.
    AddType MIME-type extension +[extension] ...skdhT
    Maps the given filename extensions onto the specified content +type
    Alias URL-yolu +dosya-yolu|dizin-yoluskT
    URL’leri dosya sistemi konumlarıyla eşler.
    AliasMatch düzenli-ifade +dosya-yolu|dizin-yoluskT
    URL’leri dosya sistemi konumlarıyla düzenli ifadeleri kullanarak +eşler.
    Allow from + all|host|env=env-variable + [host|env=env-variable] ...dhT
    Controls which hosts can access an area of the +server
    AllowCONNECT port [port] ... 443 563 skE
    Ports that are allowed to CONNECT through the +proxy
    AllowEncodedSlashes On|Off Off skÇ
    Kodlanmış dosya yolu ayracı içeren URL’lere izin verilip + verilmeyeceğini belirler.
    AllowOverride All|None|yönerge-türü +[yönerge-türü] ... All dÇ
    .htaccess dosyalarında bulunmasına izin verilen + yönerge türleri belirtilir.
    Anonymous user [user] ...dhE
    Specifies userIDs that are allowed access without +password verification
    Anonymous_Authoritative On|Off Off dhE
    Configures if authorization will fall-through +to other methods
    Anonymous_LogEmail On|Off On dhE
    Sets whether the password entered will be logged in the +error log
    Anonymous_MustGiveEmail On|Off On dhE
    Specifies whether blank passwords are allowed
    Anonymous_NoUserID On|Off Off dhE
    Sets whether the userID field may be empty
    Anonymous_VerifyEmail On|Off Off dhE
    Sets whether to check the password field for a correctly +formatted email address
    AssignUserID user-id group-idkM
    Tie a virtual host to a user and group ID
    AuthAuthoritative On|Off On dhT
    Sets whether authorization and authentication are +passed to lower level modules
    AuthDBMAuthoritative On|Off On dhE
    Sets whether authentication and authorization will be +passed on to lower level modules
    AuthDBMGroupFile file-pathdhE
    Sets the name of the database file containing the list +of user groups for authentication
    AuthDBMType default|SDBM|GDBM|NDBM|DB default dhE
    Sets the type of database file that is used to +store passwords
    AuthDBMUserFile file-pathdhE
    Sets thename of a database file containing the list of users and +passwords for authentication
    AuthDigestAlgorithm MD5|MD5-sess MD5 dhD
    Selects the algorithm used to calculate the challenge and +response hases in digest authentication
    AuthDigestDomain URI [URI] ...dhD
    URIs that are in the same protection space for digest +authentication
    AuthDigestFile file-pathdhD
    Location of the text file containing the list +of users and encoded passwords for digest authentication
    AuthDigestGroupFile file-pathdhD
    Name of the text file containing the list of groups +for digest authentication
    AuthDigestNcCheck On|Off Off sD
    Enables or disables checking of the nonce-count sent by the +server
    AuthDigestNonceFormat formatdhD
    Determines how the nonce is generated
    AuthDigestNonceLifetime seconds 300 dhD
    How long the server nonce is valid
    AuthDigestQop none|auth|auth-int [auth|auth-int] auth dhD
    Determines the quality-of-protection to use in digest +authentication
    AuthDigestShmemSize size 1000 sD
    The amount of shared memory to allocate for keeping track +of clients
    AuthGroupFile file-pathdhT
    Sets the name of a text file containing the list +of user groups for authentication
    AuthLDAPAuthoritative on|off on dhD
    Prevent other authentication modules from +authenticating the user if this one fails
    AuthLDAPBindDN distinguished-namedhD
    Optional DN to use in binding to the LDAP server
    AuthLDAPBindPassword passworddhD
    Password used in conjuction with the bind DN
    AuthLDAPCharsetConfig file-pathsD
    Language to charset conversion configuration file
    AuthLDAPCompareDNOnServer on|off on dhD
    Use the LDAP server to compare the DNs
    AuthLDAPDereferenceAliases never|searching|finding|always Always dhD
    When will the module de-reference aliases
    AuthLDAPEnabled on|off on dhD
    Turn on or off LDAP authentication
    AuthLDAPFrontPageHack on|off off dhD
    Allow LDAP authentication to work with MS FrontPage
    AuthLDAPGroupAttribute attributedhD
    LDAP attributes used to check for group membership
    AuthLDAPGroupAttributeIsDN on|off on dhD
    Use the DN of the client username when checking for +group membership
    AuthLDAPRemoteUserIsDN on|off off dhD
    Use the DN of the client username to set the REMOTE_USER +environment variable
    AuthLDAPUrl urldhD
    URL specifying the LDAP search parameters
    AuthName yetki-alanıdhÇ
    HTTP kimlik doğrulamasında kullanmak için yetki alanı ismi
    AuthType Basic|DigestdhÇ
    Kullanıcı kimlik doğrulaması türü
    AuthUserFile file-pathdhT
    Sets the name of a text file containing the list of users and +passwords for authentication
    BrowserMatch düzifd [!]ort-değişkeni[=değer] +[[!]ort-değişkeni[=değer]] ...skdhT
    Ortam değişkenlerini HTTP kullanıcı arayüzüne göre belirler. +
    BrowserMatchNoCase düzifd [!]ort-değişkeni[=değer] +[[!]ort-değişkeni[=değer]] ...skdhT
    Ortam değişkenlerini HTTP kullanıcı arayüzünün harf büyüklüğüne +duyarsız eşleşmelerine bağlı olarak belirler.
    BS2000Account accountsM
    BS2000 makinelerde yetkisiz hesap tanımlar.
    BufferedLogs On|Off Off sT
    Günlük girdilerini diske yazmadan önce bellekte tamponlar +
    CacheDefaultExpire seconds 3600 (one hour) skD
    The default duration to cache a document when no expiry date is specified.
    CacheDirLength length 2 skD
    The number of characters in subdirectory names
    CacheDirLevels levels 3 skD
    The number of levels of subdirectories in the +cache.
    CacheDisable url-stringskD
    Disable caching of specified URLs
    CacheEnable cache_type url-stringskD
    Enable caching of specified URLs using a specified storage +manager
    CacheExpiryCheck On|Off On skD
    Indicates if the cache observes Expires dates when seeking +files
    CacheFile file-path [file-path] ...sD
    Cache a list of file handles at startup time
    CacheForceCompletion Percentage 60 skD
    Percentage of document served, after which the server +will complete caching the file even if the request is cancelled.
    CacheGcClean hours url-string ? skD
    The time to retain unchanged cached files that match a +URL
    CacheGcDaily time ? skD
    The recurring time each day for garbage collection to be run. +(24 hour clock)
    CacheGcInterval hoursskD
    The interval between garbage collection attempts.
    CacheGcMemUsage KBytes ? skD
    The maximum kilobytes of memory used for garbage +collection
    CacheGcUnused hours url-string ? skD
    The time to retain unreferenced cached files that match a +URL.
    CacheIgnoreCacheControl On|Off Off skD
    Ignore the fact that the client requested the content not be +cached.
    CacheIgnoreHeaders header-string [header-string] ... None skD
    Do not store the given HTTP header(s) in the cache. +
    CacheIgnoreNoLastMod On|Off Off skD
    Ignore the fact that a response has no Last Modified +header.
    CacheLastModifiedFactor float 0.1 skD
    The factor used to compute an expiry date based on the +LastModified date.
    CacheMaxExpire seconds 86400 (one day) skD
    The maximum time in seconds to cache a document
    CacheMaxFileSize bytes 1000000 skD
    The maximum size (in bytes) of a document to be placed in the +cache
    CacheMinFileSize bytes 1 skD
    The minimum size (in bytes) of a document to be placed in the +cache
    CacheNegotiatedDocs On|Off Off skT
    Allows content-negotiated documents to be +cached by proxy servers
    CacheRoot directoryskD
    The directory root under which cache files are +stored
    CacheSize KBytes 1000000 skD
    The maximum amount of disk space that will be used by the +cache in KBytes
    CacheTimeMargin ? ? skD
    The minimum time margin to cache a document
    CGIMapExtension cgi-yolu .uzantıdhÇ
    CGI betik yorumlayıcısını saptama tekniğini belirler. +
    CharsetDefault charsetskdhD
    Charset to translate into
    CharsetOptions option [option] ... DebugLevel=0 NoImpl +skdhD
    Configures charset translation behavior
    CharsetSourceEnc charsetskdhD
    Source charset of files
    CheckSpelling on|off Off skdhE
    Enables the spelling +module
    ChildPerUserID user-id group-id +num-childrensM
    Specify user ID and group ID for a number of child +processes
    ContentDigest On|Off Off skdhÇ
    Content-MD5 HTTP yanıt başlıklarının üretimini + etkin kılar.
    CookieDomain domainskdhE
    The domain to which the tracking cookie applies
    CookieExpires expiry-periodskdhE
    Expiry time for the tracking cookie
    CookieLog dosya-adıskT
    Çerezleri günlüğe kaydetmek için dosya ismi belirtmekte +kullanılır.
    CookieName token Apache skdhE
    Name of the tracking cookie
    CookieStyle + Netscape|Cookie|Cookie2|RFC2109|RFC2965 Netscape skdhE
    Format of the cookie header field
    CookieTracking on|off off skdhE
    Enables tracking cookie
    CoreDumpDirectory dizinsM
    core dosyasını dökümlemek üzere Apache’nin geçmeye + çalışacağı dizin.
    CustomLog dosya|borulu-süreç +biçem|takma-ad +[env=[!]ortam-değişkeni]skT
    Günlük dosyasın ismini ve girdi biçemini belirler.
    Dav On|Off|provider-name Off dE
    Enable WebDAV HTTP methods
    DavDepthInfinity on|off off skdE
    Allow PROPFIND, Depth: Infinity requests
    DavLockDB file-pathskE
    Location of the DAV lock database
    DavMinTimeout seconds 0 skdE
    Minimum amount of time the server holds a lock on +a DAV resource
    DefaultIcon URL-yoluskdhT
    Özel bir simge atanmamış dosyalar için gösterilecek simgeyi +belirler.
    DefaultLanguage MIME-langskdhT
    Sets all files in the given scope to the specified +language
    DefaultType MIME-türü text/plain skdhÇ
    Sunucunun MIME türünü saptayamadığı durumda göndereceği MIME + içerik türünü belirler.
    DeflateBufferSize value 8096 skE
    Fragment size to be compressed at one time by zlib
    DeflateCompressionLevel valueskE
    How much compression do we apply to the output
    DeflateFilterNote [type] notenameskE
    Places the compression ratio in a note for logging
    DeflateMemLevel value 9 skE
    How much memory should be used by zlib for compression
    DeflateWindowSize value 15 skE
    Zlib compression window size
    Deny from all|host|env=env-variable +[host|env=env-variable] ...dhT
    Controls which hosts are denied access to the +server
    <Directory dizin-yolu> +... </Directory>skÇ
    Sadece ismi belirtilen dosya sistemi dizininde ve bunun + altdizinlerinde uygulanacak bir yönerge grubunu sarmalar.
    DirectoryIndex + yerel-url [yerel-url] ... index.html skdhT
    İstemci bir dizin istediğinde dizin içeriğini listeler. +
    <DirectoryMatch düzifd> +... </DirectoryMatch>skÇ
    Bir düzenli ifade ile eşleşen dosya sistemi dizininde ve bunun + altdizinlerinde uygulanacak bir yönerge grubunu sarmalar.
    DirectorySlash On|Off On skdhT
    Bölü çizgisi ile biten yönlendirmeleri açar/kapar.
    DocumentRoot dizin-yolu /usr/local/apache/h +skÇ
    İstemciye görünür olan ana belge ağacının kök dizinini belirler.
    DumpIOInput On|Off Off sD
    Dump all input data to the error log
    DumpIOOutput On|Off Off sD
    Dump all output data to the error log
    EnableExceptionHook On|Off Off sM
    Bir çöküş sonrası olağandışılık eylemcilerini çalıştıracak + kancayı etkin kılar.
    EnableMMAP On|Off On skdhÇ
    Teslimat sırasında okunacak dosyalar için bellek eşlemeyi etkin + kılar.
    EnableSendfile On|Off On skdhÇ
    Dosyaların istemciye tesliminde çekirdeğin dosya gönderme + desteğinin kullanımını etkin kılar.
    ErrorDocument hata-kodu belgeskdhÇ
    Bir hata durumunda sunucunun istemciye ne döndüreceğini + belirler.
    ErrorLog dosya-yolu|syslog[:oluşum] logs/error_log (Uni +skÇ
    Sunucunun hata günlüğünü tutacağı yeri belirler.
    ExampleskdhD
    Demonstration directive to illustrate the Apache module +API
    ExpiresActive On|OffskdhE
    Enables generation of Expires +headers
    ExpiresByType MIME-type +<code>secondsskdhE
    Value of the Expires header configured +by MIME type
    ExpiresDefault <code>secondsskdhE
    Default algorithm for calculating expiration time
    ExtendedStatus On|Off Off sT
    Her istekte ek durum bilgisinin toplanmasını sağlar. +
    ExtFilterDefine filtername parameterssE
    Define an external filter
    ExtFilterOptions option [option] ... DebugLevel=0 NoLogS +dE
    Configure mod_ext_filter options
    FileETag bileşen ... INode MTime Size skdhÇ
    ETag HTTP yanıt başlığını oluşturmakta kullanılacak + dosya özniteliklerini belirler.
    <Files dosya-adı> ... </Files>skdhÇ
    Dosya isimleriyle eşleşme halinde uygulanacak yönergeleri + içerir.
    <FilesMatch düzifd> ... </FilesMatch>skdhÇ
    Düzenli ifadelerin dosya isimleriyle eşleşmesi halinde + uygulanacak yönergeleri içerir.
    ForceLanguagePriority None|Prefer|Fallback [Prefer|Fallback] Prefer skdhT
    Action to take if a single acceptable document is not +found
    ForceType MIME-türü|NonedhÇ
    Bütün dosyaların belirtilen MIME içerik türüyle sunulmasına + sebep olur.
    ForensicLog dosya-adı|borulu-süreçskE
    Adli günlük için dosya ismini belirler.
    Group unix-grubu #-1 sM
    İsteklere yanıt verecek sunucunun ait olacağı grubu belirler.
    Header [condition] set|append|add|unset|echo +header [value] [env=[!]variable]skdhE
    Configure HTTP response headers
    HeaderName dosya-ismiskdhT
    Dizin listesinin tepesine yerleştirilecek dosyanın ismini +belirler.
    HostnameLookups On|Off|Double Off skdÇ
    İstemci IP adresleri üzerinde DNS sorgularını etkin kılar. +
    IdentityCheck On|Off Off skdÇ
    Uzak kullanıcıların RFC 1413’e göre kimlik bilgilerinin günlük +kayıtlarını etkin kılar.
    <IfDefine [!]parametre-adı> ... + </IfDefine>skdhÇ
    Başlatma sırasında bir doğruluk sınamasından sonra işleme +sokulacak yönergeleri sarmalar.
    <IfModule [!]modül-ismi ... + </IfModule>skdhÇ
    Belli bir modülün varlığına veya yokluğuna göre işleme sokulacak +yönergeleri sarmalar.
    <IfVersion [[!]operator] version> ... +</IfVersion>skdhE
    contains version dependent configuration
    ImapBase map|referer|URL http://servername/ skdhT
    Default base for imagemap files
    ImapDefault error|nocontent|map|referer|URL nocontent skdhT
    Default action when an imagemap is called with coordinates +that are not explicitly mapped
    ImapMenu none|formatted|semiformatted|unformattedskdhT
    Action if no coordinates are given when calling +an imagemap
    Include dosya-yolu|dizin-yoluskdÇ
    Sunucu yapılandırma dosyalarının başka dosyaları içermesini sağlar. +
    IndexIgnore dosya [dosya] ...skdhT
    Dizin içerik listesinden gizlenecek dosyaların listesi belirtilir. +
    IndexOptions [+|-]seçenek [[+|-]seçenek] +...skdhT
    Dizin içerik listesini yapılandıracak seçenekler belirtilir. +
    IndexOrderDefault Ascending|Descending +Name|Date|Size|Description Ascending Name skdhT
    Dizin içerik listesinin öntanımlı sıralamasını belirler. +
    ISAPIAppendLogToErrors on|off off skdhT
    Record HSE_APPEND_LOG_PARAMETER requests from +ISAPI extensions to the error log
    ISAPIAppendLogToQuery on|off on skdhT
    Record HSE_APPEND_LOG_PARAMETER requests from +ISAPI extensions to the query field
    ISAPICacheFile file-path [file-path] +...skT
    ISAPI .dll files to be loaded at startup
    ISAPIFakeAsync on|off off skdhT
    Fake asynchronous support for ISAPI callbacks
    ISAPILogNotSupported on|off off skdhT
    Log unsupported feature requests from ISAPI +extensions
    ISAPIReadAheadBuffer size 49152 skdhT
    Size of the Read Ahead Buffer sent to ISAPI +extensions
    KeepAlive On|Off On skÇ
    HTTP kalıcı bağlantılarını etkin kılar
    KeepAliveTimeout saniye 15 skÇ
    Bir kalıcı bağlantıda sunucunun bir sonraki isteği bekleme süresi +
    LanguagePriority MIME-lang [MIME-lang] +...skdhT
    The precendence of language variants for cases where +the client does not express a preference
    LDAPCacheEntries number 1024 sD
    Maximum number of entries in the primary LDAP cache
    LDAPCacheTTL seconds 600 sD
    Time that cached items remain valid
    LDAPConnectionTimeout secondssD
    Specifies the socket connection timeout in seconds
    LDAPOpCacheEntries number 1024 sD
    Number of entries used to cache LDAP compare +operations
    LDAPOpCacheTTL seconds 600 sD
    Time that entries in the operation cache remain +valid
    LDAPSharedCacheFile directory-path/filenamesD
    Sets the shared memory cache file
    LDAPSharedCacheSize bytes 102400 sD
    Size in bytes of the shared-memory cache
    LDAPTrustedCA directory-path/filenamesD
    Sets the file containing the trusted Certificate Authority certificate or database
    LDAPTrustedCAType typesD
    Specifies the type of the Certificate Authority file
    <Limit yöntem [yöntem] ... > ... + </Limit>skdhÇ
    Erişimi sınırlanacak HTTP yöntemleri için erişim sınırlayıcıları +sarmalar.
    <LimitExcept yöntem [yöntem] ... > ... + </LimitExcept>skdhÇ
    İsimleri belirtilenler dışında kalan HTTP yöntemleri için +kullanılacak erişim sınırlayıcıları sarmalar.
    LimitInternalRecursion sayı [sayı] 10 skÇ
    Dahili yönlendirmelerin ve istek içi isteklerin azami sayısını +belirler.
    LimitRequestBody bayt-sayısı 0 skdhÇ
    İstemci tarafından gönderilen HTTP istek gövdesinin toplam +uzunluğunu sınırlar.
    LimitRequestFields sayı 100 sÇ
    İstemciden kabul edilecek HTTP isteği başlık alanlarının sayısını +sınırlar.
    LimitRequestFieldSize bayt-sayısı 8190 sÇ
    İstemciden kabul edilecek HTTP isteği başlık uzunluğunu sınırlar. +
    LimitRequestLine bayt-sayısı 8190 sÇ
    İstemciden kabul edilecek HTTP istek satırının uzunluğunu sınırlar. +
    LimitXMLRequestBody bayt-sayısı 1000000 skdhÇ
    Bir XML temelli istek gövdesinin uzunluğunu sınırlar.
    Listen [IP-adresi:]port-numarasısM
    Sunucunun dinleyeceği IP adresini ve portu belirler.
    ListenBacklog kuyruk-uzunluğusM
    Bekleyen bağlantılar kuyruğunun azami uzunluğunu + belirler
    LoadFile dosya-ismi [dosya-ismi] ...sE
    Belirtilen nesne dosyasını veya kütüphaneyi sunucu ile ilintiler. +
    LoadModule modül dosya-ismisE
    Belirtilen nesne dosyasını veya kütüphaneyi sunucu ile ilintiler +ve etkin modül listesine ekler.
    <Location URL-yolu|URL> ... +</Location>skÇ
    İçerdiği yönergeler sadece eşleşen URL’lere uygulanır. +
    <LocationMatch + düzifade> ... </LocationMatch>skÇ
    İçerdiği yönergeler sadece düzenli ifadelerle eşleşen URL’lere +uygulanır.
    LockFile dosya logs/accept.lock sM
    Apache HTTPd Sunucusunun ağ soketlerinden istekleri kabul eden + çok sayıda çocuk süreci sıraya sokarken kullandığı kilit dosyasının yerini + belirler.
    LogFormat biçem|takma-ad +[takma-ad] "%h %l %u %t \"%r\" +skT
    Bir günlük dosyasında kullanılmak üzere girdi biçemi tanımlar.
    LogLevel seviye warn skÇ
    Hata günlüklerinin ayrıntı seviyesini belirler.
    MaxClients sayısM
    Aynı anda işleme sokulacak azami bağlantı sayısı
    MaxKeepAliveRequests sayı 100 skÇ
    Bir kalıcı bağlantıda izin verilen istek sayısı
    MaxMemFree kB-sayısı 0 sM
    free() çağrılmaksızın ana bellek ayırıcının + ayırmasına izin verilen azami bellek miktarını belirler.
    MaxRequestsPerChild sayı 10000 sM
    Tek bir çocuk sürecin ömrü boyunca işleme sokabileceği istek + sayısını sınırlamakta kullanılır.
    MaxRequestsPerThread number 0 sM
    Limit on the number of requests that an individual thread +will handle during its life
    MaxSpareServers sayı 10 sM
    Boştaki çocuk süreçlerin azami sayısı
    MaxSpareThreads numbersM
    Boştaki azami evre sayısını belirler
    MaxThreads number 2048 sM
    Set the maximum number of worker threads
    MaxThreadsPerChild number 64 sM
    Maximum number of threads per child process
    MCacheMaxObjectCount value 1009 sD
    The maximum number of objects allowed to be placed in the +cache
    MCacheMaxObjectSize bytes 10000 sD
    The maximum size (in bytes) of a document allowed in the +cache
    MCacheMaxStreamingBuffer size_in_bytes the smaller of 1000 +sD
    Maximum amount of a streamed response to buffer in memory +before declaring the response uncacheable
    MCacheMinObjectSize bytes 0 sD
    The minimum size (in bytes) of a document to be allowed in the +cache
    MCacheRemovalAlgorithm LRU|GDSF GDSF sD
    The algorithm used to select documents for removal from the +cache
    MCacheSize KBytes 100 sD
    The maximum amount of memory used by the cache in +KBytes
    MetaDir directory .web skdhE
    Name of the directory to find CERN-style meta information +files
    MetaFiles on|off off skdhE
    Activates CERN meta-file processing
    MetaSuffix suffix .meta skdhE
    File name suffix for the file containg CERN-style +meta information
    MimeMagicFile file-pathskE
    Enable MIME-type determination based on file contents +using the specified magic file
    MinSpareServers sayı 5 sM
    Boştaki çocuk süreçlerin asgari sayısı
    MinSpareThreads numbersM
    İsteklerin ani artışında devreye girecek boştaki evrelerin asgari + sayısını belirler.
    MMapFile file-path [file-path] ...sD
    Map a list of files into memory at startup time
    ModMimeUsePathInfo On|Off Off dT
    Tells mod_mime to treat path_info +components as part of the filename
    MultiviewsMatch Any|NegotiatedOnly|Filters|Handlers +[Handlers|Filters] NegotiatedOnly skdhT
    The types of files that will be included when searching for +a matching file with MultiViews
    NameVirtualHost adres[:port]sÇ
    İsme dayalı sanal konaklar için IP adresi belirtir
    NoProxy host [host] ...skE
    Hosts, domains, or networks that will be connected to +directly
    NumServers number 2 sM
    Total number of children alive at the same time
    NWSSLTrustedCerts filename [filename] ...sT
    List of additional client certificates
    NWSSLUpgradeable [IP-address:]portnumbersT
    Allows a connection to be upgraded to an SSL connection upon request
    Options + [+|-]seçenek [[+|-]seçenek] ... All skdhÇ
    Belli bir dizinde geçerli olacak özellikleri yapılandırır. +
    Order ordering Deny,Allow dhT
    Controls the default access state and the order in which +Allow and Deny are +evaluated.
    PassEnv ortam-değişkeni [ortam-değişkeni] +...skdhT
    Ortam değişkenlerini kabuktan aktarır.
    PidFile dosya logs/httpd.pid sM
    Ana sürecin süreç kimliğinin (PID) kaydedileceği dosyayı belirler.
    ProtocolEcho On|Off Off skD
    Turn the echo server on or off
    <Proxy wildcard-url> ...</Proxy>skE
    Container for directives applied to proxied resources
    ProxyBadHeader IsError|Ignore|StartBody IsError skE
    Determines how to handle bad header lines in a +response
    ProxyBlock *|word|host|domain +[word|host|domain] ...skE
    Words, hosts, or domains that are banned from being +proxied
    ProxyDomain DomainskE
    Default domain name for proxied requests
    ProxyErrorOverride On|Off Off skE
    Override error pages for proxied content
    ProxyFtpDirCharset character set ISO-8859-1 skdE
    Define the character set for proxied FTP listings
    ProxyIOBufferSize bytes 8192 skE
    Determine size of internal data throughput buffer
    <ProxyMatch regex> ...</ProxyMatch>skE
    Container for directives applied to regular-expression-matched +proxied resources
    ProxyMaxForwards number 10 skE
    Maximium number of proxies that a request can be forwarded +through
    ProxyPass [path] !|urlskdE
    Maps remote servers into the local server URL-space
    ProxyPassReverse [path] urlskdE
    Adjusts the URL in HTTP response headers sent from a reverse +proxied server
    ProxyPreserveHost On|Off Off skE
    Use incoming Host HTTP request header for proxy +request
    ProxyReceiveBufferSize bytes 0 skE
    Network buffer size for proxied HTTP and FTP +connections
    ProxyRemote match remote-serverskE
    Remote proxy used to handle certain requests
    ProxyRemoteMatch regex remote-serverskE
    Remote proxy used to handle requests matched by regular +expressions
    ProxyRequests On|Off Off skE
    Enables forward (standard) proxy requests
    ProxyTimeout seconds 300 skE
    Network timeout for proxied requests
    ProxyVia On|Off|Full|Block Off skE
    Information provided in the Via HTTP response +header for proxied requests
    ReadmeName dosya-ismiskdhT
    Dizin listesinin sonuna yerleştirilecek dosyanın ismini +belirler.
    ReceiveBufferSize bayt-sayısı 0 sM
    TCP alım tamponu boyu
    Redirect [durum] URL-yolu +URLskdhT
    İstemciyi, bir yönlendirme isteği döndürerek farklı bir URL’ye +yönlendirir.
    RedirectMatch [durum] düzenli-ifade +URLskdhT
    Geçerli URL ile eşleşen bir düzenli ifadeye dayanarak bir harici +yönlendirme gönderir.
    RedirectPermanent URL-yolu URLskdhT
    İstemciyi, kalıcı bir yönlendirme isteği döndürerek farklı bir +URL’ye yönlendirir.
    RedirectTemp URL-yolu URLskdhT
    İstemciyi, geçici bir yönlendirme isteği döndürerek farklı bir +URL’ye yönlendirir.
    RemoveCharset extension [extension] +...kdhT
    Removes any character set associations for a set of file +extensions
    RemoveEncoding extension [extension] +...kdhT
    Removes any content encoding associations for a set of file +extensions
    RemoveHandler extension [extension] +...kdhT
    Removes any handler associations for a set of file +extensions
    RemoveInputFilter extension [extension] +...kdhT
    Removes any input filter associations for a set of file +extensions
    RemoveLanguage extension [extension] +...kdhT
    Removes any language associations for a set of file +extensions
    RemoveOutputFilter extension [extension] +...kdhT
    Removes any output filter associations for a set of file +extensions
    RemoveType extension [extension] +...kdhT
    Removes any content type associations for a set of file +extensions
    RequestHeader set|append|add|unset header +[value [env=[!]variable]]skdhE
    Configure HTTP request headers
    Require öğe-adı [öğe-adı] ...dhÇ
    Bir özkaynağa erişebilecek kimliği doğrulanmış kullanıcıları +belirler
    RewriteBase URL-pathdhE
    Sets the base URL for per-directory rewrites
    RewriteCond + TestString CondPatternskdhE
    Defines a condition under which rewriting will take place +
    RewriteEngine on|off off skdhE
    Enables or disables runtime rewriting engine
    RewriteLock file-pathsE
    Sets the name of the lock file used for RewriteMap +synchronization
    RewriteLog file-pathskE
    Sets the name of the file used for logging rewrite engine +processing
    RewriteLogLevel Level 0 skE
    Sets the verbosity of the log file used by the rewrite +engine
    RewriteMap MapName MapType:MapSource +skE
    Defines a mapping function for key-lookup
    RewriteOptions Options MaxRedirects=10 skdhE
    Sets some special options for the rewrite engine
    RewriteRule + Pattern SubstitutionskdhE
    Defines rules for the rewriting engine
    RLimitCPU saniye|max [saniye|max]skdhÇ
    Apache alt süreçleri tarafından çalıştırılan süreçlerin işlemci +tüketimine sınırlama getirir.
    RLimitMEM bayt-sayısı|max [bayt-sayısı|max] +skdhÇ
    Apache alt süreçleri tarafından çalıştırılan süreçlerin bellek +tüketimine sınırlama getirir.
    RLimitNPROC sayı|max [sayı|max]skdhÇ
    Apache alt süreçleri tarafından çalıştırılabilecek süreç sayısına +sınırlama getirir.
    Satisfy Any|All All dhÇ
    Konak seviyesinde erişim denetimi ile kullanıcı kimlik doğrulaması +arasındaki etkileşim
    ScoreBoardFile dosya-yolu logs/apache_status sM
    Çocuk süreçler için eşgüdüm verisini saklamakta kullanılan + dosyanın yerini belirler.
    Script method cgi-scriptskdT
    Activates a CGI script for a particular request +method.
    ScriptAlias URL-yolu +dosya-yolu|dizin-yoluskT
    Bir URL’yi dosya sistemindeki bir yere eşler ve hedefi bir CGI betiği olarak çalıştırır.
    ScriptAliasMatch düzenli-ifade +dosya-yolu|dizin-yoluskT
    Bir URL’yi dosya sistemindeki bir yere düzenli ifade kullanarak +eşler ve hedefi bir CGI betiği olarak çalıştırır.
    ScriptInterpreterSource Registry|Registry-Strict|Script Script skdhÇ
    CGI betikleri için yorumlayıcı belirleme tekniği
    ScriptLog file-pathskT
    Location of the CGI script error logfile
    ScriptLogBuffer bytes 1024 skT
    Maximum amount of PUT or POST requests that will be recorded +in the scriptlog
    ScriptLogLength bytes 10385760 skT
    Size limit of the CGI script logfile
    ScriptSock file-path logs/cgisock skT
    The name of the socket to use for communication with +the cgi daemon
    SecureListen [IP-address:]portnumber +Certificate-Name [MUTUAL]sT
    Enables SSL encryption for the specified port
    SendBufferSize bayt-sayısı 0 sM
    TCP tamponu boyu
    ServerAdmin eposta-adresiskÇ
    Sunucunun hata iletilerinde istemciye göstereceği eposta adresi +
    ServerAlias konakadı [konakadı] ...kÇ
    İstekleri isme dayalı sanal konaklarla eşleştirilirken +kullanılacak konak adları için başka isimler belirtebilmeyi sağlar. +
    ServerLimit sayısM
    Ayarlanabilir süreç sayısının üst sınırını belirler.
    ServerName tam-nitelenmiş-alan-adı[:port] +skÇ
    Sunucunun özdeşleşeceği konak ismi ve port.
    ServerPath URL-yolukÇ
    Uyumsuz bir tarayıcı tarafından erişilmesi için bir isme dayalı +sanal konak için meşru URL yolu
    ServerRoot dizin-yolu /usr/local/apache sÇ
    Sunucu yapılandırması için kök dizin
    ServerSignature On|Off|EMail Off skdhÇ
    Sunucu tarafından üretilen belgelerin dipnotunu ayarlar. +
    ServerTokens Major|Minor|Min[imal]|Prod[uctOnly]|OS|Full Full sÇ
    Server HTTP yanıt başlığını yapılandırır. +
    SetEnv ortam-değişkeni değerskdhT
    Ortam değişkenlerini tanımlar.
    SetEnvIf öznitelik + düzifd [!]ort-değişkeni[=değer] + [[!]ort-değişkeni[=değer]] ...skdhT
    Ortam değişkenlerini isteğin özniteliklerine göre atar. +
    SetEnvIfNoCase öznitelik + düzifd [!]ort-değişkeni[=değer] + [[!]ort-değişkeni[=değer]] ...skdhT
    Ortam değişkenlerini isteğin özniteliklerinde harf büyüklüğüne +bağlı olmaksızın yapılmış tanımlara göre atar.
    SetHandler eylemci-ismi|NoneskdhÇ
    Eşleşen tüm dosyaların belli bir eylemci tarafından işlenmesine +sebep olur.
    SetInputFilter süzgeç[;süzgeç...]skdhÇ
    POST girdilerini ve istemci isteklerini işleyecek süzgeçleri +belirler.
    SetOutputFilter süzgeç[;süzgeç...]skdhÇ
    Sunucunun yanıtlarını işleyecek süzgeçleri belirler.
    SSIEndTag tag "-->" skT
    String that ends an include element
    SSIErrorMsg message "[an error occurred +skdhT
    Error message displayed when there is an SSI +error
    SSIStartTag tag "<!--#" skT
    String that starts an include element
    SSITimeFormat formatstring "%A, %d-%b-%Y %H:%M +skdhT
    Configures the format in which date strings are +displayed
    SSIUndefinedEcho string "(none)" skT
    String displayed when an unset variable is echoed
    SSLCACertificateFile file-pathskE
    File of concatenated PEM-encoded CA Certificates +for Client Auth
    SSLCACertificatePath directory-pathskE
    Directory of PEM-encoded CA Certificates for +Client Auth
    SSLCARevocationFile file-pathskE
    File of concatenated PEM-encoded CA CRLs for +Client Auth
    SSLCARevocationPath directory-pathskE
    Directory of PEM-encoded CA CRLs for +Client Auth
    SSLCertificateChainFile file-pathskE
    File of PEM-encoded Server CA Certificates
    SSLCertificateFile file-pathskE
    Server PEM-encoded X.509 Certificate file
    SSLCertificateKeyFile file-pathskE
    Server PEM-encoded Private Key file
    SSLCipherSuite cipher-spec ALL:!ADH:RC4+RSA:+H +skdhE
    Cipher Suite available for negotiation in SSL +handshake
    SSLEngine on|off off skE
    SSL Engine Operation Switch
    SSLInsecureRenegotiation flag off skE
    Option to enable support for insecure renegotiation
    SSLMutex type none sE
    Semaphore for internal mutual exclusion of +operations
    SSLOptions [+|-]option ...skdhE
    Configure various SSL engine run-time options
    SSLPassPhraseDialog type builtin sE
    Type of pass phrase dialog for encrypted private +keys
    SSLProtocol [+|-]protocol ... all skE
    Configure usable SSL protocol flavors
    SSLProxyCACertificateFile file-pathskE
    File of concatenated PEM-encoded CA Certificates +for Remote Server Auth
    SSLProxyCACertificatePath directory-pathskE
    Directory of PEM-encoded CA Certificates for +Remote Server Auth
    SSLProxyCARevocationFile file-pathskE
    File of concatenated PEM-encoded CA CRLs for +Remote Server Auth
    SSLProxyCARevocationPath directory-pathskE
    Directory of PEM-encoded CA CRLs for +Remote Server Auth
    SSLProxyCipherSuite cipher-spec ALL:!ADH:RC4+RSA:+H +skdhE
    Cipher Suite available for negotiation in SSL +proxy handshake
    SSLProxyEngine on|off off skE
    SSL Proxy Engine Operation Switch
    SSLProxyMachineCertificateFile filenamesE
    File of concatenated PEM-encoded client certificates and keys to be used by the proxy
    SSLProxyMachineCertificatePath directorysE
    Directory of PEM-encoded client certificates and keys to be used by the proxy
    SSLProxyProtocol [+|-]protocol ... all skE
    Configure usable SSL protocol flavors for proxy usage
    SSLProxyVerify level none skdhE
    Type of remote server Certificate verification
    SSLProxyVerifyDepth number 1 skdhE
    Maximum depth of CA Certificates in Remote Server +Certificate verification
    SSLRandomSeed context source +[bytes]sE
    Pseudo Random Number Generator (PRNG) seeding +source
    SSLRequire expressiondhE
    Allow access only when an arbitrarily complex +boolean expression is true
    SSLRequireSSLdhE
    Deny access when SSL is not used for the +HTTP request
    SSLSessionCache type none sE
    Type of the global/inter-process SSL Session +Cache
    SSLSessionCacheTimeout seconds 300 skE
    Number of seconds before an SSL session expires +in the Session Cache
    SSLUserName varnamesdhE
    Variable name to determine user name
    SSLVerifyClient level none skdhE
    Type of Client Certificate verification
    SSLVerifyDepth number 1 skdhE
    Maximum depth of CA Certificates in Client +Certificate verification
    StartServers sayısM
    Sunucunun başlatılması sırasında oluşturulan çocuk süreçlerin + sayısını belirler.
    StartThreads sayısM
    Sunucunun başlatılması sırasında oluşturulan evrelerin sayısını + belirler.
    SuexecUserGroup Kullanıcı GrupskE
    CGI betiklerini çalıştıracak kullanıcı ve grup belirtilir. +
    ThreadLimit sayısM
    Çocuk süreç başına ayarlanabilir evre sayısının üst sınırını + belirler.
    ThreadsPerChild sayısM
    Her çocuk süreç tarafından oluşturulan evrelerin sayısını + belirler.
    ThreadStackSize number 65536 sM
    Determine the stack size for each thread
    TimeOut saniye 300 skÇ
    Bir istek için başarısız olmadan önce belirli olayların +gerçekleşmesi için sunucunun geçmesini bekleyeceği süre.
    TraceEnable [on|off|extended] on sÇ
    TRACE isteklerinde davranış şeklini belirler +
    TransferLog dosya|borulu-süreç +[takma-ad]skT
    Bir günlük dosyasının yerini belirtir.
    TypesConfig file-path conf/mime.types sT
    The location of the mime.types file
    UnsetEnv ortam-değişkeni [ortam-değişkeni] +...skdhT
    Ortamdaki değişkenleri tanımsız hale getirir.
    UseCanonicalName On|Off|DNS On skdÇ
    Sunucunun kendi adını ve portunu nasıl belirleyeceğini ayarlar +
    User unix-kullanıcısı #-1 sM
    İsteklere yanıt verecek sunucunun ait olacağı kullanıcıyı + belirler.
    UserDir dizin public_html skT
    Kullanıcıya özel dizinlerin yeri
    VirtualDocumentRoot hesaplanan-dizin|none none skE
    Bir sanal konağın belge kök dizinini devingen olarak yapılandırır. +
    VirtualDocumentRootIP hesaplanan-dizin|none none skE
    Bir sanal konağın belge kök dizinini devingen olarak yapılandırır. +
    <VirtualHost + adres[:port] [adres[:port]] + ...> ... </VirtualHost>sÇ
    Sadece belli bir konak ismine ve porta uygulanacak yönergeleri +barındırır.
    VirtualScriptAlias hesaplanan-dizin|none none skE
    Bir sanal konağın CGI dizinini devingen olarak yapılandırır. +
    VirtualScriptAliasIP hesaplanan-dizin|none none skE
    Bir sanal konağın CGI dizinini devingen olarak yapılandırır. +
    Win32DisableAcceptExsM
    Use accept() rather than AcceptEx() to accept network connections
    XBitHack on|off|full off skdhT
    Parse SSI directives in files with the execute bit +set
    +
    +

    Mevcut Diller:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/threadpool.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/threadpool.html new file mode 100644 index 00000000..80593756 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/threadpool.html @@ -0,0 +1,5 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: threadpool.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/threadpool.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/threadpool.html.en new file mode 100644 index 00000000..9cff4706 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/threadpool.html.en @@ -0,0 +1,81 @@ + + + +threadpool - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache MPM threadpool

    +
    +

    Available Languages:  en 

    +
    + + + +
    Description:Yet another experimental variant of the standard +worker MPM
    Status:MPM
    Module Identifier:mpm_threadpool_module
    Source File:threadpool.c
    +

    Summary

    + +

    Warning

    +

    This MPM is a developer playground and highly experimental, so it + may or may not work as expected.

    +
    + +

    This is an experimental variant of the standard worker MPM. + Rather than queuing connections like the worker MPM, the + threadpool MPM queues idle worker threads and + hands each accepted connection to the next available worker.

    + +

    The threadpool MPM can't match the performance of + the worker MPM in benchmark testing. As of 2.0.39, + some of the key load-throtting concepts from the threadpool MPM have been incorporated into the worker MPM. The threadpool code is useful + primarily as a research platform. For general-purpose use and for any + production environments, use worker instead.

    +
    + + +
    +
    +

    Available Languages:  en 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/worker.html b/rubbos/app/httpd-2.0.64/docs/manual/mod/worker.html new file mode 100644 index 00000000..f3d38e58 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/worker.html @@ -0,0 +1,21 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: worker.html.de +Content-Language: de +Content-type: text/html; charset=ISO-8859-1 + +URI: worker.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: worker.html.es +Content-Language: es +Content-type: text/html; charset=ISO-8859-1 + +URI: worker.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: worker.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/worker.html.de b/rubbos/app/httpd-2.0.64/docs/manual/mod/worker.html.de new file mode 100644 index 00000000..823e16d2 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/worker.html.de @@ -0,0 +1,173 @@ + + + +worker - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache-MPM worker

    +
    +

    Verfügbare Sprachen:  de  | + en  | + es  | + ja  | + tr 

    +
    + + + +
    Beschreibung:Multi-Processing-Modul, das einen Hybrid-Webserver mit + Multi-Thread und Multi-Prozess-Unterstützung implementiert
    Status:MPM
    Modulbezeichner:mpm_worker_module
    Quelltext-Datei:worker.c
    +

    Zusammenfassung

    + +

    Dieses Multi-Processing-Modul (MPM) implementiert einen Hybrid-Server + mit Multi-Thread und Multi-Prozess-Unterstützung. Durch die Verwendung + von Threads für die Bedienung von Anfragen ist er in der Lage, + eine große Anzahl von Anfragen mit weniger Systemressourcen als + ein Prozess-basierter Server zu bedienen. Er behält jedoch viel von + der Stabilität eines Prozess-basierten Servers bei, indem er + mehrere Prozesse verfügbar hält, jeden mit etlichen Threads.

    + +

    Die wichtigsten Direktiven zur Steuerung des MPMs sind ThreadsPerChild, welche die Anzahl + der Threads beeinflusst, die von jedem Kindprozess verwendet werden, und + MaxClients, welche die + maximale Gesamtzahl an Threads regelt, die gestartet werden + können.

    +
    + +
    top
    +
    +

    Arbeitsweise

    +

    Ein einzelner Steuerprozess (der Elternprozess) ist für den + Start der Kindprozesse verantwortlich. Jeder Kindprozess erstellt eine + feste Anzahl von Server-Threads, wie durch die ThreadsPerChild-Direktive + angegeben, sowie einen "Listener-Thread", der auf Verbindungen wartet und + diese an einen Server-Thread zur Bearbeitung weiterreicht, sobald sie + eintreffen.

    + +

    Der Apache versucht immer, einen Vorrat von freien oder + unbeschäftigten Threads zu verwalten, die zur Bedienung + hereinkommender Anfragen bereit stehen. Auf diese Weise brauchen + Clients nicht auf die Erstellung eines neuen Threads oder Prozesses + zu warten, bevor ihre Anfrage bedient werden kann. Die Anzahl der + Prozesse, die anfangs gestartet wird, wird mit der Direktive + StartServers festgelegt. + Dann, während des Betriebes, berechnet der Apache die Gesamtzahl + der unbeschäftigten Threads und forkt oder beendet Prozesse, um diese + Anzahl innerhalb der durch MinSpareThreads und MaxSpareThreads angegebenen Grenzen + zu halten. Da dieser Prozess sehr selbstregulierend ist, ist es nur selten + notwendig, die Voreinstellung dieser Direktiven zu ändern. Die + maximale Anzahl Clients, die gleichzeitig bedient werden kann (d.h. + die maximale Gesamtzahl der Threads in allen Prozessen), wird mit der + Direktive MaxClients + festgelegt. Die maximale Anzahl der aktiven Kindprozesse ergibt sich aus + MaxClients dividiert durch + ThreadsPerChild.

    + +

    Zwei Direktiven legen harte Limits für die Anzahl der aktiven + Kindprozesse fest und können nur geändert werden, indem der Server + komplett gestoppt und dann wieder neu gestartet wird. ServerLimit stellt die obere Grenze für + die Anzahl der aktiven Kindprozesse dar und muss größer oder + gleich dem Quotienten aus MaxClients und ThreadsPerChild sein. ThreadLimit ist die obere Grenze für + die Anzahl der Server-Threads und muss größer oder gleich + ThreadsPerChild sein. Sofern für + diese Direktiven keine Voreinstellungen verwendet werden, sollten sie vor + allen anderen worker-Direktiven platziert werden.

    + +

    Neben den normalen aktiven Kindprozessen gibt es möglicherweise noch + zusätzliche Kindprozesse, welche gerade beendet werden, wo allerdings + zumindest noch ein Server-Thread eine existierende Verbindung bearbeitet. + Obwohl die tatsächlich zu erwartende Anzahl deutlich kleiner ist, + können bis zu MaxClients + solcher Prozesse auftreten. Dieses Verhalten können Sie vermeiden, + indem Sie die Terminierung einzelner Kindprozesse wie folgt abschalten:

    + + + +

    Eine typische Konfiguration der Prozess-Thread-Steuerung für + das MPM worker könnte wie folgt aussehen:

    + +

    + ServerLimit 16
    + StartServers 2
    + MaxClients 150
    + MinSpareThreads 25
    + MaxSpareThreads 75
    + ThreadsPerChild 25 +

    + +

    Während der Elternprozess unter Unix normalerweise als + root gestartet wird, um sich an Port 80 binden zu können, + werden die Kindprozesse und Threads unter einem weniger privilegierten + Benutzer gestartet. Die Direktiven User und Group werden dazu verwendet, die + Privilegien der Apache-Kindprozesse festzulegen. Die Kindprozesse + müssen in der Lage sein, alle Inhalte zu lesen, die sie ausliefern + sollen, sollten darüber hinaus jedoch so wenig wie möglich Rechte + besitzen. Zusätzlich, solange nicht suexec verwendet wird, legen diese + Direktiven auch die Privilegien fest, die von CGI-Skripts + geerbt werden.

    + +

    MaxRequestsPerChild + bestimmt, wie häufig der Server Prozesse erneuert, indem er alte + beendet und neue startet.

    +
    +
    +
    +

    Verfügbare Sprachen:  de  | + en  | + es  | + ja  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/worker.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mod/worker.html.en new file mode 100644 index 00000000..e38e1a03 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/worker.html.en @@ -0,0 +1,180 @@ + + + +worker - Apache HTTP Server + + + + + + +
    <-
    + +
    +

    Apache MPM worker

    +
    +

    Available Languages:  de  | + en  | + es  | + ja  | + tr 

    +
    + + + +
    Description:Multi-Processing Module implementing a hybrid + multi-threaded multi-process web server
    Status:MPM
    Module Identifier:mpm_worker_module
    Source File:worker.c
    +

    Summary

    + +

    This Multi-Processing Module (MPM) implements a hybrid + multi-process multi-threaded server. By using threads to serve + requests, it is able to serve a large number of requests with + less system resources than a process-based server. Yet it + retains much of the stability of a process-based server by + keeping multiple processes available, each with many threads.

    + +

    The most important directives used to control this MPM are + ThreadsPerChild, which + controls the number of threads deployed by each child process and + MaxClients, which + controls the maximum total number of threads that may be + launched.

    +
    + +
    top
    +
    +

    How it Works

    +

    A single control process (the parent) is responsible for launching + child processes. Each child process creates a fixed number of server + threads as specified in the ThreadsPerChild directive, as well + as a listener thread which listens for connections and passes them + to a server thread for processing when they arrive.

    + +

    Apache always tries to maintain a pool of spare or + idle server threads, which stand ready to serve incoming + requests. In this way, clients do not need to wait for a new + threads or processes to be created before their requests can be + served. The number of processes that will initially launched is + set by the StartServers + directive. Then during operation, Apache assesses the total number + of idle threads in all processes, and forks or kills processes to + keep this number within the boundaries specified by MinSpareThreads and MaxSpareThreads. Since this + process is very self-regulating, it is rarely necessary to modify + these directives from their default values. The maximum number of + clients that may be served simultaneously (i.e., the maximum total + number of threads in all processes) is determined by the + MaxClients directive. + The maximum number of active child processes is determined by + the MaxClients + directive divided by the + ThreadsPerChild directive.

    + +

    Two directives set hard limits on the number of active child + processes and the number of server threads in a child process, + and can only be changed by fully stopping the server and then + starting it again. ServerLimit + is a hard limit on the number of active child + processes, and must be greater than or equal to the + MaxClients + directive divided by the + ThreadsPerChild directive. + ThreadLimit is a hard + limit of the number of server threads, and must be greater than + or equal to the ThreadsPerChild directive. If + non-default values are specified for these directives, they + should appear before other worker directives.

    + +

    In addition to the set of active child processes, there may + be additional child processes which are terminating but where at + least one server thread is still handling an existing client + connection. Up to MaxClients terminating processes + may be present, though the actual number can be expected to be + much smaller. This behavior can be avoided by disabling the + termination of individual child processes, which is achieved by + the following:

    + + + +

    A typical configuration of the process-thread controls in + the worker MPM could look as follows:

    + +

    + ServerLimit 16
    + StartServers 2
    + MaxClients 150
    + MinSpareThreads 25
    + MaxSpareThreads 75
    + ThreadsPerChild 25 +

    + +

    While the parent process is usually started as root + under Unix in order to bind to port 80, the child processes and threads + are launched by Apache as a less-privileged user. The User and Group directives are used to set + the privileges of the Apache child processes. The child processes + must be able to read all the content that will be served, but + should have as few privileges beyond that as possible. In + addition, unless suexec is used, + these directives also set the privileges which will be inherited + by CGI scripts.

    + +

    MaxRequestsPerChild + controls how frequently the server recycles processes by killing + old ones and launching new ones.

    +
    +
    +
    +

    Available Languages:  de  | + en  | + es  | + ja  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/worker.html.es b/rubbos/app/httpd-2.0.64/docs/manual/mod/worker.html.es new file mode 100644 index 00000000..3dcd5a29 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/worker.html.es @@ -0,0 +1,188 @@ + + + +worker - Servidor HTTP Apache + + + + + + +
    <-
    + +
    +

    MPM de Apache worker

    +
    +

    Idiomas disponibles:  de  | + en  | + es  | + ja  | + 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.
    + + + +
    Descripción:Módulo de MultiProcesamiento que implementa un +servidor web híbrido multihebra-multiproceso
    Estado:MPM
    Identificador de Módulos:mpm_worker_module
    Fichero de Código Fuente:worker.c
    +

    Resumen de contenidos

    + +

    Este Módulo de MultiProcesamiento (MPM) implementa un + servidor híbrido multiproceso-multihebra. Usando hebras para + atender peticiones, el servidor puede servir un mayor número + de peticiones con menos recursos de sistema que un servidor basado + únicamente en procesos. No obtante, se mantiene casi por + completo la estabilidad de un servidor basado en procesos + manteniendo la capacidad multiproceso, pudiendo cada proceso tener + muchas hebras.

    + +

    Las directivas más importantes que se usan para controlar + este MPM son ThreadsPerChild, que controla el + número de hebras que tiene cada proceso hijo y MaxClients, que controla el + número máximo de hebras que pueden crearse.

    +
    + +
    top
    +
    +

    Cómo funciona

    Un + solo proceso de control (el padre) es el responsable de crear los + procesos hijo. Cada proceso hijo crea un número fijo de + hebras del servidor de la forma que se especifica en la directiva + ThreadsPerChild, + así como una hebra de escucha que escuchará si se + producen peticiones y las pasará a una hebra del servidor + para que la procese.

    + +

    Apache siempre intenta mantener en reserva cierto número + de hebras de sobra o en espera, que están + preparadas para servir peticiones en el momento en que + lleguen. Así, los clientes no tienen que esperar a que se + creen nuevas hebras o procesos para que sean atendidas sus + peticiones. El número de procesos que se crean al principio + está determinado por la directiva StartServers. Después durante + el funcionamiento del servidor, Apache calcula el número + total de hebras en espera entre todos los procesos, y crea o + elimina procesos para mantener ese número dentro de los + límites especificados en las directivas MinSpareThreads y MaxSpareThreads. Como este proceso + está bastante autorregulado, no es muy habitual que sea + necesario modificar los valores que estas directivas traen por + defecto. El número máximo de clientes que pueden ser + servidos simultáneamente (por ejemplo, el número + máximo de hebras entre todos los procesos) está + determinado por la directiva MaxClients. El número + máximo de procesos hijo activos está determinado por el + valor especificado en la directiva MaxClients dividido por el valor + especificado en la directiva + ThreadsPerChild.

    + +

    Hay dos directivas que establecen límites estrictos al + número de procesos hijo activos y al número de hebras + del servidor en un proceso hijo, y puede cambiarse solo parando + completamente el servidor y volviendo a iniciarlo. La directiva + ServerLimit marca el + límite estricto de procesos hijo activos posibles, y debe ser + mayor o igual al valor de la directiva MaxClients dividido por el valor + de la directiva + ThreadsPerChild. El valor de la directiva ThreadLimit es el límite + estricto del número de hebras del servidor, y debe ser mayor + o igual al valor de la directiva ThreadsPerChild. Si los valores + de esas directivas no son los que vienen por defecto, deben + aparecer antes que el resto de directivas del módulo + worker.

    + +

    Además del conjunto de procesos hijo activos, puede haber + otros procesos hijo que están terminando pero en los que al + menos una hebra del servidor está todavía tratando una + conexión con un cliente. Puede haber hasta MaxClients procesos terminando, + aunque el número real de estos procesos que puede esperarse + es mucho menor. Este comportamiento puede evitarse desactivando la + eliminación individual de procesos hijo, lo que se hace de la + siguiente manera:

    + + + +

    Una configuración típica del sistema de control de + procesos y hebras del módulo de MPM worker + prodría ser como sigue:

    + +

    + ServerLimit 16
    + StartServers 2
    + MaxClients 150
    + MinSpareThreads 25
    + MaxSpareThreads 75
    + ThreadsPerChild 25 +

    + +

    Mientras que el proceso padre se inicia con privilegios de + usuario root en Unix para usar el puerto de escucha + 80, los procesos hijo y las hebras se inician con menores + privilegios de usuario. Las directivas User y Group se usan para determinar los + privilegios con los que se iniciarán los procesos hijo. Los + procesos hijo deben ser capaces de leer los contenidos que van a + servir, pero solo los permisos extrictamente necesarios para + cumplir su tarea. Además. a menos que se use suexec, los privilegios fijados en estas + directivas son los que que van a heredar los scripts CGI.

    + +

    La directiva MaxRequestsPerChild controla con + qué frecuencia el servidor recicla los procesos eliminando + los antiguos y creando nuevos.

    +
    +
    +
    +

    Idiomas disponibles:  de  | + en  | + es  | + ja  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/worker.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/worker.html.ja.utf8 new file mode 100644 index 00000000..d9ebd661 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/worker.html.ja.utf8 @@ -0,0 +1,190 @@ + + + +worker - Apache HTTP サーバ + + + + + + +
    <-
    + +
    +

    Apache MPM worker

    +
    +

    Available Languages:  de  | + en  | + es  | + ja  | + tr 

    +
    +
    This translation may be out of date. Check the + English version for recent changes.
    + + + +
    説明:マルチスレッドとマルチプロセスのハイブリッド型 +ウェブサーバを実装したマルチプロセッシングモジュール
    ステータス:MPM
    モジュール識別子:mpm_worker_module
    ソースファイル:worker.c
    +

    概要

    + +

    このマルチプロセッシングモジュール (MPM) + は、マルチスレッドとマルチプロセスのハイブリッド型サーバを + 実装しています。リクエストの応答にスレッドを使うと、 + プロセスベースのサーバよりも少ないシステム資源で、 + 多くのリクエストに応答することができます。 + さらに、多くのスレッドを持った複数のプロセスを維持することで、 + プロセスベースのサーバの持つ安定性を保持しています。

    + +

    この MPM を制御するのに使われる最も重要なディレクティブは、 + ThreadsPerChild と + MaxClients です。 + ThreadsPerChild は + 各子プロセスで用意されるスレッド数を制御して、 + MaxClients は + 起動されるスレッドの総数の最大値を制限します。

    +
    + +
    top
    +
    +

    動作方法

    +

    一つの制御用プロセス (親) が子プロセスを起動します。 + 子プロセスは + ThreadsPerChild + ディレクティブで指定された一定数のサーバスレッドと接続を + listen するスレッドを一つ作ります。 + Listener スレッドは接続が来たときにサーバプロセスに渡します。

    + +

    Apache はスペアの、つまりアイドルなサーバスレッドの + プールを常に維持していて、それらは入ってくるリクエストに + 答えられるように待機しています。 + このようにして、クライアントはリクエストの応答が得られるようになるために + 新しいスレッドやプロセスが生成されるのを + 待たなくてもよいようになっています。 + 起動初期時のプロセス総数は、 + StartServers + ディレクティブで設定されます。その後の稼働中に、 + Apache は全プロセスのアイドルスレッドの合計数を見積もって、 + MinSpareThreads と + MaxSpareThreads + で指定された範囲の中にこの数が収まるように fork したり + kill したりします。この操作は非常に自律的なので、 + これらのディレクティブをデフォルト値から変更する必要は + めったにないでしょう。 + 同時に応答することのできるクライアント数の最大数 + (つまり全プロセス中の総スレッド数の最大値) は + MaxClients + ディレクティブで決定されます。 + 活動中の子プロセス数の最大値は + MaxClients を + ThreadsPerChild で割った + ものになります。

    + +

    活動中の子プロセスの数と子プロセス中のサーバスレッドの数の越えられない + 上限を設定するディレクティブが二つあります。これらはサーバを + 完全に停止して、再起動することでしか変更することはできません。 + ServerLimit + は活動中の子プロセスの越えられない上限を設定し、 + MaxClients ディレクティブ + の値を + ThreadsPerChild の値で割った値以上である + 必要があります。ThreadLimit は + サーバスレッドの越えられない上限で、ThreadsPerChild ディレクティブの + 値以上である必要があります。デフォルト以外の値を指定する場合は + 他の worker ディレクティブよりも前に書かれている + 必要があります。

    + +

    活動中の子プロセス群に加えて、少なくとも一つのサーバスレッドが + 既存のクライアントからの接続を扱っている終了しようとしている + 子プロセスがある可能性があります。終了中のプロセスは MaxClients で指定された数まで + 存在できますが、実際に期待される数はずっと少なくなります。この + 振舞いは各子プロセスを終了させないようにすることで回避できます。 + これは以下の様にして実現できます。

    + + + +

    worker MPM の典型的なプロセス・スレッド制御の + 設定では、次のようになります。

    + +

    + ServerLimit 16
    + StartServers 2
    + MaxClients 150
    + MinSpareThreads 25
    + MaxSpareThreads 75
    + ThreadsPerChild 25 +

    + +

    通常 Unix では親プロセスは 80 番ポートにバインドするために + root で起動されますが、子プロセスやスレッドは + もっと低い権限のユーザで Apache によって起動されます。 + User と + Group ディレクティブは + Apache の子プロセスの権限を設定するのに用いられます。 + 子プロセスはクライアントに送るコンテンツ全てを読めないといけませんが、 + 可能な限り必要最小限の権限のみを持っているようにするべきです。 + さらに、suexec + が使用されていない限り、これらのディレクティブは + CGI スクリプトで継承される権限も設定します。

    + +

    MaxRequestsPerChild + は、古いプロセスを停止して新しいプロセスを起動することによって、 + どの程度の頻度でサーバがプロセスをリサイクルするかを制御します。

    +
    +
    +
    +

    Available Languages:  de  | + en  | + es  | + ja  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mod/worker.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mod/worker.html.tr.utf8 new file mode 100644 index 00000000..0f72e03a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mod/worker.html.tr.utf8 @@ -0,0 +1,170 @@ + + + +worker - Apache HTTP Sunucusu + + + + + + +
    <-
    + +
    +

    Apache MPM worker

    +
    +

    Mevcut Diller:  de  | + en  | + es  | + ja  | + tr 

    +
    + + + +
    Açıklama:Çok evreli ve çok süreçli melez bir HTTP sunucusu oluşturan çok +süreçlilik modülü.
    Durum:MPM
    Modül Betimleyici:mpm_worker_module
    Kaynak Dosyası:worker.c
    +

    Özet

    + +

    Bu çok süreçlilik modülü (MPM) hem çok süreçli hem de çok evreli + olabilen melez bir sunucu oluşturur. İstekleri sunmak için evreleri + kullanması sebebiyle çok süreçli bir sunucudan daha az sistem kaynağı + harcayarak daha çok isteğe hizmet sunabilir. Bununla birlikte, herbiri + çok sayıda evreye sahip çok sayıda süreci canlı tutarak bir çok süreçli + sunucu kadar kararlı olur.

    + +

    Bu MPM’i denetim altında tutmakta kullanılan en önemli yönergeler, her + çocuk süreç için konuşlandırılacak evre sayısını belirleyen ThreadsPerChild yönergesi ile devreye + sokulacak toplam evre sayısının azamisini belirleyen MaxClients yönergesidir.

    +
    + +
    top
    +
    +

    Nasıl çalışır?

    +

    Çocuk süreçleri devreye almaktan tek bir süreç (ana süreç) sorumludur. + Her çocuk süreç ThreadsPerChild yönergesinde belirtilen sayıda evre + konuşlandırır. Bunlardan ayrı olarak, bir dinleyici evre bağlantıları + dinleyip gelenleri işlenmek üzere bu sunucu evrelerinden birine + aktarır.

    + +

    Apache daima, gelen isteklere hizmet sunmaya hazır yedek + veya boştaki sunucu evrelerinden oluşan bir havuzu canlı tutmaya + çalışır. Bu suretle, istemcilere isteklerinin sunulması için yeni çocuk + süreçlerin çatallanmasını, dolayısıyla yeni evrelerin + konuşlandırılmasını beklemek gerekmez. Başlangıçta çalıştırılacak çocuk + süreçlerin sayısı StartServers yönergesinde belirtilir. + Apache, çalışma süresi boyunca MinSpareThreads ve MaxSpareThreads yönergeleri ile belirtilen sınırlar + dahilinde kalmak üzere gerektiğinde süreçleri öldürerek gerektiğinde + yenilerini devreye alarak tüm süreçlerdeki toplam evre sayısını sabit + tutmaya çalışır. Bu işlem kendiliğinden çok iyi yürüdüğünden bu + yönergelere öntanımlı değerlerinden farklı değerlerin atanması nadiren + gerekli olur. Aynı anda hizmet sunulabilecek istemcilerin sayısı (yani, + tüm süreçlerin toplam evre sayısı) MaxClients yönergesi ile belirlenir. Etkin çocuk + süreçlerin sayısı ise MaxClients yönergesindeki değerin ThreadsPerChild yönergesindeki değere + bölünmesi ile elde edilir.

    + +

    Bu iki yönerge aynı anda etkin olabilecek çocuk süreçlerin ve her + çocuk süreçteki sunucu evreleri sayısının üst sınırını belirler ve bu + sınır sadece ana sunucu tamamen durdurulup yeniden başlatılarak + değiştirilebilir. ServerLimit yönergesinin değeri etkin çocuk süreç + sayısının üst sınırı olup MaxClients yönergesindeki değerin ThreadsPerChild yönergesindeki değere + bölünmesi ile elde değere eşit veya bundan küçük olması gerekir. + ThreadLimit yönergesinin + değeri ise sunucu evreleri sayısının üst sınırını belirler ve ThreadsPerChild yönergesindeki değerden + büyük veya ona eşit olması gerekir. Eğer bu yönergelere öntanımlı + değerlerinden farklı bir değer atanacaksa bu atamaların diğer + worker yönergelerinden önce yapılması gerekir.

    + +

    Sonlandırma sırasında etkin çocuk süreçlere ek olarak mevcut istemci + bağlantılarını işleme sokmaya çalışan tek bir sunucu evresinden başka + fazladan bir çocuk süreç etkin kalabileceği gibi sonlandırılacak süreç + sayısının en fazla MaxClients olması gerekirse de gerçekte sayı bundan küçük + olabilir. Şöyle bir işlemle tek bir çocuk sürecin sonlandırılması + iptal edilerek bu gibi durumlara karşı önlem alınabilir:

    + + + +

    worker modülünün öntanımlı süreç-evre yapılandırması + genelde şöyledir:

    + +

    + ServerLimit 16
    + StartServers 2
    + MaxClients 150
    + MinSpareThreads 25
    + MaxSpareThreads 75
    + ThreadsPerChild 25 +

    + +

    Unix altında 80. portu dinleyebilmek için ana sürecin root tarafından + çalıştırılmış olması gerekirse de çocuk süreçler ve evreler Apache + tarafından daha az yetkili bir kullanıcının aidiyetinde + çalıştırılırlar. Apache’nin çocuk süreçlerinin kullanıcı ve gruplarını + ayarlamak için User ve Group yönergeleri kullanılır. Çocuk süreçlerin + sunacakları içeriği okumaya yetkili olmaları gerekir, fakat bu yetkinin + mümkün olduğunca kısıtlı tutulmasına çalışılmalıdır. Bundan başka, + suexec kullanılmadığı takdirde, bu yönergeler CGI + betikleri tarafından miras alınacak yetkili kullanıcı ve grubu da + ayarlarlar.

    + +

    MaxRequestsPerChild + yönergesi ana sunucunun eski süreçleri öldürüp yenilerini oluşturmayı + ne kadar sıklıkla yapacağını denetler.

    +
    +
    +
    +

    Mevcut Diller:  de  | + en  | + es  | + ja  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mpm.html b/rubbos/app/httpd-2.0.64/docs/manual/mpm.html new file mode 100644 index 00000000..8b03fb60 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mpm.html @@ -0,0 +1,29 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mpm.html.de +Content-Language: de +Content-type: text/html; charset=ISO-8859-1 + +URI: mpm.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: mpm.html.es +Content-Language: es +Content-type: text/html; charset=ISO-8859-1 + +URI: mpm.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: mpm.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: mpm.html.ru.koi8-r +Content-Language: ru +Content-type: text/html; charset=KOI8-R + +URI: mpm.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mpm.html.de b/rubbos/app/httpd-2.0.64/docs/manual/mpm.html.de new file mode 100644 index 00000000..4e81d36b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mpm.html.de @@ -0,0 +1,131 @@ + + + +Multi-Processing-Module (MPMs) - Apache HTTP Server + + + + + +
    <-
    +

    Multi-Processing-Module (MPMs)

    +
    +

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

    +
    + +

    Das Dokument beschreibt, was ein Multi-Processing-Modul ist und wie solche + Module beim Apache HTTP Server verwendet werden.

    +
    + +
    top
    +
    +

    Einführung

    + +

    Der Apache HTTP Server wurde als leistungsfähiger und flexibler Webserver + konzipiert, der auf einer Vielzahl von Plattformen in einer + Reihe unterschiedlicher Umgebungen arbeiten kann. Unterschiedliche + Plattformen und unterschiedliche Umgebungen verlangen oftmals verschiedene + Fähigkeiten oder kennen verschiedene Wege, die gleiche + Funktionaltät sehr effizient zu implementieren. Der Apache hat durch + seinen modularen Aufbau schon immer eine breite Auswahl von Umgebungen + unterstützt. Dieses Design erlaubt es dem Webmaster, durch Auswahl der + Module, die zur Kompilierungszeit oder zur Laufzeit geladen werden, die + Features auszuwählen, die in den Server intregiert werden.

    + +

    Der Apache 2.0 erweitert dieses modulare Design auf die grundlegenden + Funktionen eines Webservers. Der Server wird mit einer Auswahl von + Multi-Processing-Modulen (MPMs) ausgeliefert, die für die Bindung an + Netzwerkports der Maschine, die Annahme von Anfragen und die Abfertigung von + Kindprozessen zur Behandlung der Anfragen zuständig sind.

    + +

    Die Erweiterung des modularen Aufbaus auf diese Ebene des Servers + bringt zwei wesentliche Vorteile:

    + +
      +
    • Der Apache kann nun eine Vielfalt von Betriebssystemen sauberer und + effizienter unterstützen. Insbesondere die Windows-Version des Apache + ist jetzt deutlich effizienter, da mpm_winnt native + Netzwerkfähigkeiten anstelle der im Apache 1.3 verwendeten + POSIX-Schicht benutzen kann. Dieser Vorteil gilt auch für andere + Betriebssysteme, für die spezielle MPMs implementiert sind.
    • + +
    • Der Server läßt sich besser auf die Bedürfnisse der + jeweiligen Website anpassen. Sites beispielsweise, die eine hohe + Skalierbarkeit benötigen, können ein Threaded-MPM wie + worker wählen, während Sites, die + Stabilität oder Kompatibilität mit älterer Software + erfordern, prefork wählen können. Darüber + hinaus können Spezialfähigkeiten wie die Bedienung verschiedener + Hosts unter unterschiedlichen User-IDs (perchild) + angeboten werden.
    • +
    + +

    Auf Anwenderebene erscheinen MPMs fast wie andere Apache-Module. Der + Hauptunterschied ist, dass jeweils nur ein einziges MPM in den Server + geladen werden kann. Die Liste der verfügbaren MPMs finden Sie im Modul-Index.

    + +
    top
    +
    +

    Auswahl eines MPMs

    + +

    MPMs müssen während der + (Anm.d.Ü.: Quelltext-)Konfiguration ausgewählt und in den + Server einkompiliert werden. Compiler sind in der Lage eine Reihe von + Funktionen zu optimieren, wenn Threads verwendet werden. Sie können + dies allerdings nur, wenn sie wissen, dass Threads benutzt werden.

    + +

    Um das gewünschte MPM tatsächlich auszuwählen, verwenden Sie + beim configure-Skript das Argument + --with-mpm=NAME. NAME ist der Name des + gewünschten MPMs.

    + +

    Ist der Server kompiliert, so ist es mittels ./httpd -l + möglich, das ausgewählte MPM zu ermitteln. Dieser Befehl listet + alle in den Server einkompilierten Module auf, einschließlich des + MPM.

    +
    top
    +
    +

    MPM-Voreinstellungen

    + +

    Die folgende Tabelle gibt die voreingestellten MPMs für verschiedene + Betriebssysteme an. Wenn Sie während der Kompilierung keine andere + Auswahl treffen, wird dieses MPM gewählt.

    + + + + + + + + +
    BeOSbeos
    Netwarempm_netware
    OS/2mpmt_os2
    Unixprefork
    Windowsmpm_winnt
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mpm.html.en b/rubbos/app/httpd-2.0.64/docs/manual/mpm.html.en new file mode 100644 index 00000000..012906f1 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mpm.html.en @@ -0,0 +1,132 @@ + + + +Multi-Processing Modules (MPMs) - Apache HTTP Server + + + + + +
    <-
    +

    Multi-Processing Modules (MPMs)

    +
    +

    Available Languages:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + +

    This document describes what a Multi-Processing Module is and +how they are used by the Apache HTTP Server.

    +
    + +
    top
    +
    +

    Introduction

    + +

    The Apache HTTP Server is designed to be a powerful and + flexible web server that can work on a very wide variety of + platforms in a range of different environments. Different + platforms and different environments often require different + features, or may have different ways of implementing the same + feature most efficiently. Apache has always accommodated a wide + variety of environments through its modular design. This design + allows the webmaster to choose which features will be included + in the server by selecting which modules to load either at + compile-time or at run-time.

    + +

    Apache 2.0 extends this modular design to the most basic + functions of a web server. The server ships with a selection of + Multi-Processing Modules (MPMs) which are responsible for + binding to network ports on the machine, accepting requests, + and dispatching children to handle the requests.

    + +

    Extending the modular design to this level of the server + allows two important benefits:

    + +
      +
    • Apache can more cleanly and efficiently support a wide + variety of operating systems. In particular, the Windows + version of Apache is now much more efficient, since + mpm_winnt can use native + networking features in place of the POSIX layer used in + Apache 1.3. This benefit also extends to other operating + systems that implement specialized MPMs.
    • + +
    • The server can be better customized for the needs of the + particular site. For example, sites that need a great deal of + scalability can choose to use a threaded MPM like + worker, while sites requiring + stability or compatibility with older software can use a + prefork. In addition, + special features like serving different hosts under different + userids (perchild) can be + provided.
    • +
    + +

    At the user level, MPMs appear much like other Apache + modules. The main difference is that one and only one MPM must + be loaded into the server at any time. The list of available + MPMs appears on the module index page.

    + +
    top
    +
    +

    Choosing an MPM

    + +

    MPMs must be chosen during configuration, and compiled into + the server. Compilers are capable of optimizing a lot of + functions if threads are used, but only if they know that + threads are being used.

    + +

    To actually choose the desired MPM, use the argument + --with-mpm=NAME with the + configure script. NAME is the name of the + desired MPM.

    + +

    Once the server has been compiled, it is possible to + determine which MPM was chosen by using ./httpd + -l. This command will list every module that is compiled + into the server, including the MPM.

    +
    top
    +
    +

    MPM Defaults

    + +

    The following table lists the default MPMs for various operating +systems. This will be the MPM selected if you do not make another +choice at compile-time.

    + + + + + + + + +
    BeOSbeos
    Netwarempm_netware
    OS/2mpmt_os2
    Unixprefork
    Windowsmpm_winnt
    +
    +
    +

    Available Languages:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mpm.html.es b/rubbos/app/httpd-2.0.64/docs/manual/mpm.html.es new file mode 100644 index 00000000..eb050a16 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mpm.html.es @@ -0,0 +1,141 @@ + + + +Módulos de MultiProcesamiento (MPMs) - Servidor HTTP Apache + + + + + +
    <-
    +

    Módulos de MultiProcesamiento (MPMs)

    +
    +

    Idiomas disponibles:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + +

    Este documento explica que son los Módulos de +Multiprocesamiento y como los usa Apache.

    +
    + +
    top
    +
    +

    Introducción

    + +

    Apache está diseñado para ser un servidor web potente + y flexible que pueda funcionar en la más amplia variedad de + plataformas y entornos. Las diferentes plataformas y los + diferentes entornos, hacen que a menudo sean necesarias diferentes + características o funcionalidades, o que una misma + característica o funcionalidad sea implementada de diferente + manera para obtener una mayor eficiencia. Apache se ha adaptado + siempre a una gran variedad de entornos a través de su + diseño modular. Este diseño permite a los + administradores de sitios web elegir que funcionalidades van a ser + incluidas en el servidor seleccionando que módulos se van a + usar, ya sea al compilar o al ejecutar el servidor.

    + +

    Apache 2.0 extiende este diseño modular hasta las + funcionalidades más básicas de un servidor web. El + servidor viene con una serie de Módulos de MultiProcesamiento + que son los responsables de conectar con los puertos de red de la + máquina, acceptar las peticiones, y generar los procesos hijo + que se encargan de servirlas.

    + +

    La extensión del diseño modular a este nivel del + servidor ofrece dos beneficios importantes:

    + +
      +
    • Apache puede soportar de una forma más fácil y + eficiente una amplia variedad de sistemas operativos. En + concreto, la versión de Windows de Apache es mucho más + eficiente, porque el módulo mpm_winnt + puede usar funcionalidades nativas de red en lugar de usar la + capa POSIX como hace Apache 1.3. Este beneficio se extiende + también a otros sistemas operativos que implementan sus + respectivos MPMs.
    • + +
    • El servidor puede personalizarse mejor para las necesidades + de cada sitio web. Por ejemplo, los sitios web que necesitan + más que nada escalibildad pueden usar un MPM hebrado como + worker, mientras que los sitios web que + requieran por encima de otras cosas estabilidad o compatibilidad + con software antiguo pueden usar + prefork. Además, se pueden configurar + funcionalidades especiales como servir diferentes hosts con + diferentes identificadores de usuario + (perchild).
    • +
    + +

    A nivel de usuario, los módulos de multiprocesamiento + (MPMs) son como cualquier otro módulo de Apache. La + diferencia más importante es que solo un MPM puede estar + cargado en el servidor en un determinado momento. La lista de MPMs + disponibles está en la sección de + índice de módulos.

    + +
    top
    +
    +

    Cómo Elegir un MPM

    + +

    Los módulos de multiprocesamiento que se van a usar + posteriormente deben elegirse durante el proceso de + configuración, y deben ser compilados en el servidor. Los + compiladores son capaces de optimizar muchas funciones si se usan + hebras, pero solo si se sabe que se están usando hebras.

    + +

    Para elegir el módulo de multiprocesamiento deseado, use + el argumento --with-mpm= NAME con el script + configure. NAME es el nombre del MPM + deseado.

    + +

    Una vez que el servidor ha sido compilado, es posible + determinar que módulos de multiprocesamiento ha sido elegido + usando ./httpd -l. Este comando lista todos los + módulos compilados en el servidor, incluido en MPM.

    +
    top
    +
    +

    MPM por defecto

    + +

    En la siguiente tabla se muestran los módulos de +multiprocesamiento por defecto para varios sistemas operativos. Estos +serán los módulos de multiprocesamiento seleccionados si no +se especifica lo contrario al compilar.

    + + + + + + + + +
    BeOSbeos
    Netwarempm_netware
    OS/2mpmt_os2
    Unixprefork
    Windowsmpm_winnt
    +
    +
    +

    Idiomas disponibles:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mpm.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mpm.html.ja.utf8 new file mode 100644 index 00000000..1f6e9caa --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mpm.html.ja.utf8 @@ -0,0 +1,143 @@ + + + +マルチプロセッシングモジュール (MPM) - Apache HTTP サーバ + + + + + +
    <-
    +

    マルチプロセッシングモジュール (MPM)

    +
    +

    Available Languages:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    +
    This translation may be out of date. Check the + English version for recent changes.
    + +

    この文書ではマルチプロセッシングモジュールがどのようなもので、 +Apache HTTP サーバでどのように使用されるかについて解説しています。

    +
    + +
    top
    +
    +

    はじめに

    + +

    Apache HTTP サーバは異なる幅広い環境、多種多様なプラットホームで + 動作するように、パワフルで柔軟性に富んだ設計になっています。 + 異なるプラットホーム・異なる環境ではしばしば、 + 異なる機能が必要になったり、 + 同じ機能でも効率のために異なる実装が必要になったりします。 + Apache ではモジュール化された設計により幅広い環境に適応してきました。 + この設計のおかげで、管理者は + コンパイル時または実行時にどのモジュールをロードするか選ぶことによって、 + どの機能をサーバに取り込むか選択することがができます。

    + +

    Apache 2.0 では、 + このモジュール化された設計をサーバの基本機能にまで拡張しました。 + サーバには精選されたマルチプロセッシングモジュール (MPM) + が付いてきて、これらはマシンのネットワークポートをバインドしたり、 + リクエストを受け付けたり、リクエストを扱うよう子プロセスに割り当てたり、 + といった役割を持ちます。

    + +

    モジュール化された設計をサーバのこのレベルまで拡張することで + 二つの重要な利点が生まれます:

    + +
      +
    • Apache は幅広いオペレーティングシステムを + より美しく効率的にサポートできます。 + 特に Windows 版の Apache は随分効率的になりました。 + なぜなら mpm_winnt + によって、Apache 1.3 で用いられていた POSIX + レイヤの代わりにネイティブのネットワーク機能を + 利用できるからです。 + 特別化された MPM + を実装した他のオペレーティングシステムでも、 + 同様にこの利点は生まれます。
    • + +
    • サーバは特定のサイト向けに、より上手にカスタマイズできます。 + 例えば、非常に大きなスケーラビリティを必要とするサイトでは、 + worker といったスレッド化された + MPM を利用できる一方で、安定性や古いソフトウェアとの互換性を + 必要とするサイトでは prefork + が利用できます。また、 + 異なるホストを異なるユーザ ID で動作させる + (perchild) といった + 特別な機能も提供できます。
    • +
    + +

    ユーザレベルでは、MPM は他の Apache + モジュールと同等に見えます。 + 主な違いは、いつでも唯一の MPM + がロードされなければならないという点です。 + 利用可能な MPM は + module インデックスにあります。

    + +
    top
    +
    +

    MPM を選ぶ

    + +

    MPM は設定中に選択して、サーバ内部にコンパイルされなければ + なりません。 + コンパイラは、スレッドが使用されていれば様々な機能を最適化できますが、 + そもそもスレッドが使われているということを知る必要があります。 + MPM には Unix 上でスレッドを用いるものや、スレッドをまったく + 使わないものがあるので、 + Apache は、MPM が設定中に選択されて Apache 内部に組み込まれた場合の方が + 常により良いパフォーマンスを発揮します。

    + +

    望みの MPM を実際に選ぶためには、./configure スクリプトで + --with-mpm= NAME 引数を用いてください。 + NAME は望みの MPM の名前です。

    + +

    サーバコンパイル後は、どの MPM が選択されたかを + ./httpd -l で確かめることができます。 + このコマンドは、MPM + を含め、サーバにコンパイルで組み込まれたモジュール全てを + 列挙します。

    +
    top
    +
    +

    MPM デフォルト値

    + +

    次表に様々な OS 向けのデフォルトの MPM 一覧を掲載しています。 +コンパイル時に意図的に他を選択しなければ、自動的にこれらの MPM +が選択されます。

    + + + + + + + + +
    BeOSbeos
    Netwarempm_netware
    OS/2mpmt_os2
    Unixprefork
    Windowsmpm_winnt
    +
    +
    +

    Available Languages:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mpm.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/mpm.html.ko.euc-kr new file mode 100644 index 00000000..b8ce714e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mpm.html.ko.euc-kr @@ -0,0 +1,126 @@ + + + +´ÙÁßó¸® ¸ðµâ (MPM) - Apache HTTP Server + + + + + +
    <-
    +

    ´ÙÁßó¸® ¸ðµâ (MPM)

    +
    +

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

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

    ÀÌ ¹®¼­´Â ´ÙÁßó¸® ¸ðµâ (Multi-Processing Module)ÀÌ ¹«¾ùÀ̸ç, +¾ÆÆÄÄ¡ À¥¼­¹ö°¡ À̸¦ ¾î¶»°Ô »ç¿ëÇÏ´ÂÁö ¼³¸íÇÑ´Ù.

    +
    + +
    top
    +
    +

    ¼Ò°³

    + +

    ¾ÆÆÄÄ¡ À¥¼­¹ö´Â ´Ù¾çÇÑ È¯°æÀÇ ´Ù¾çÇÑ Ç÷¡Æû¿¡¼­ µ¿ÀÛÇÒ + ¼ö ÀÖµµ·Ï °­·ÂÇÏ°í À¯¿¬ÇÏ°Ô ¼³°èµÇ¾ú´Ù. ´Ù¸¥ Ç÷¡Æû°ú ´Ù¸¥ + ȯ°æÀº º¸Åë ´Ù¸¥ ±â´ÉÀ» ¿ä±¸Çϸç, ¾î¶² ±â´ÉÀ» °¡Àå È¿À²ÀûÀ¸·Î + ±¸ÇöÇÏ´Â ¹æ¹ýÀÌ ´Ù¸¦ ¼ö ÀÖ´Ù. ¾ÆÆÄÄ¡´Â ¸ðµâÈ­µÈ ¼³°è·Î ÀÌ·± + ´Ù¾çÇÑ È¯°æ¿¡ Ç×»ó ÀûÀÀÇØ¿Ô´Ù. ±×·¡¼­ À¥¸¶½ºÅÍ´Â ÄÄÆÄÀϽà + ȤÀº ½ÇÇà½Ã ¾î¶² ¸ðµâÀ» ÀоîµéÀÏÁö ¼±ÅÃÇÏ¿© ¼­¹ö¿¡ Æ÷ÇÔÇÒ + ±â´ÉÀ» °áÁ¤ÇÒ ¼ö ÀÖ´Ù.

    + +

    Apache 2.0Àº ÀÌ·± ¸ðµâÈ­µÈ ¼³°è¸¦ À¥¼­¹öÀÇ °¡Àå ±âº»ÀûÀÎ + ºÎºÐ¿¡±îÁö È®ÀåÇß´Ù. ¼­¹ö´Â ½Ã½ºÅÛÀÇ ³×Æ®¿÷ Æ÷Æ®¿¡ ¿¬°áÇÏ°í, + ¿äûÀ» ¹Þ¾ÆµéÀ̸ç, ¹Þ¾ÆµéÀÎ ¿äûÀ» ó¸®ÇϱâÀ§ÇØ Àڽĵ鿡°Ô + ºÐ¹èÇÏ´Â ´ÙÁßó¸® ¸ðµâ (Multi-Processing Modules, MPMs)À» + ¼±ÅÃÇÒ ¼ö ÀÖ´Ù.

    + +

    ¼­¹ö¸¦ ÀÌ Á¤µµ·Î ¸ðµâÈ­ÇÏ¸é µÎ°¡Áö Áß¿äÇÑ ÀåÁ¡ÀÌ + ÀÖ´Ù:

    + +
      +
    • mpm_winnt°¡ Apache 1.3¿¡¼­ »ç¿ëÇÑ + POSIXÃþ ´ë½Å ÀÚü ³×Æ®¿÷ ±â´ÉÀ» »ç¿ëÇÒ ¼ö ÀÖ´Â µî, + ¾ÆÆÄÄ¡´Â ¿©·¯ ´Ù¾çÇÑ ¿î¿µÃ¼Á¦¸¦ ´õ ±ò²ûÇÏ°í È¿À²ÀûÀ¸·Î + Áö¿øÇÒ ¼ö ÀÖ´Ù. ÀÌ ÀåÁ¡Àº ƯȭµÈ MPMÀ» ±¸ÇöÇÑ ´Ù¸¥ + ¿î¿µÃ¼Á¦¿¡µµ Àû¿ëµÈ´Ù.
    • + +
    • ¼­¹ö´Â ƯÁ¤ »çÀÌÆ®ÀÇ ¿ä±¸Á¶°Ç¿¡ ´õ ƯȭµÉ ¼ö ÀÖ´Ù. + ¿¹¸¦ µé¾î ³ôÀº È®Àå°¡´É¼º(scalability)ÀÌ ÇÊ¿äÇÑ »çÀÌÆ®´Â + worker¿Í °°Àº ¾²·¹µå MPMÀ» »ç¿ëÇÏ°í, + ¾ÈÁ¤¼º°ú ¿À·¡µÈ ¼ÒÇÁÆ®¿þ¾î¿ÍÀÇ È£È¯¼ºÀÌ ÇÊ¿äÇÑ »çÀÌÆ®´Â + preforking MPMÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù. + Ãß°¡·Î ´Ù¸¥ »ç¿ëÀÚ¾ÆÀ̵ð·Î ¿©·¯ È£½ºÆ®¸¦ ¼­ºñ½ºÇÏ´Â + °Í(perchild)°ú °°Àº Ưº°ÇÑ ±â´Éµµ + Á¦°øµÈ´Ù.
    • +
    + +

    »ç¿ëÀÚ°¡ º¸±â¿¡ MPMÀº ´Ù¸¥ ¾ÆÆÄÄ¡ ¸ðµâ°ú °ÅÀÇ ºñ½ÁÇØ + º¸ÀδÙ. ÁÖµÈ Â÷ÀÌ´Â ¼­¹ö´Â Çѹø¿¡ ¿ÀÁ÷ ÇÑ MPM¸¸À» »ç¿ëÇØ¾ß + ÇÑ´Ù´Â Á¡ÀÌ´Ù. »ç¿ë°¡´ÉÇÑ MPM ¸ñ·ÏÀº ¸ðµâ + ¸ñ·Ï ÆäÀÌÁö¿¡ ÀÖ´Ù.

    + +
    top
    +
    +

    MPM ¼±ÅÃÇϱâ

    + +

    MPMs´Â ±¸¼ºÁß¿¡ ¼±ÅÃÇÏ¿© ¼­¹ö¿¡ ÄÄÆÄÀÏµÇ¾ß ÇÑ´Ù. + ¾²·¹µå¸¦ »ç¿ëÇÏ´Â °ÍÀ» ÄÄÆÄÀÏ·¯°¡ ¾Ë¸é ¸¹Àº ÇÔ¼ö¸¦ + ÃÖÀûÈ­ÇÒ ¼ö ÀÖ´Ù. À¯´Ð½º¿¡¼­ ¸î¸î MPMÀº ¾²·¹µå¸¦ ¾²°í + ³ª¸ÓÁö´Â ¾Æ´Ï¹Ç·Î, MPMÀÌ ±¸¼ºÁß¿¡ ¼±ÅÃµÇ¾î ¾ÆÆÄÄ¡¿¡ + ÄÄÆÄÀϵɶ§ ¾ÆÆÄÄ¡´Â ´õ ºü¸¥ ¼Óµµ¸¦ ³½´Ù.

    + +

    ¿øÇÏ´Â MPMÀ» ¼±ÅÃÇÏ·Á¸é ./configure ½ºÅ©¸³Æ®¿¡ + with-mpm= NAME ¾Æ±Ô¸ÕÆ®¸¦ »ç¿ëÇ϶ó. NAMEÀº + ¿øÇÏ´Â MPM À̸§ÀÌ´Ù.

    + +

    ¼­¹ö¸¦ ÄÄÆÄÀÏÇÑÈÄ ./httpd -l ¸í·É¾î·Î ¼±ÅÃÇÑ + MPMÀ» ¾Ë ¼ö ÀÖ´Ù. ÀÌ ¸í·É¾î´Â MPMÀ» Æ÷ÇÔÇÏ¿© ¼­¹ö¿¡ ÄÄÆÄÀÏµÈ + ¸ðµç ¸ðµâÀ» ¾Ë·ÁÁØ´Ù.

    +
    top
    +
    +

    MPM ±âº»°ª

    + +

    ´ÙÀ½ Ç¥´Â ¿©·¯ ¿î¿µÃ¼Á¦ÀÇ ±âº» MPMÀ» º¸¿©ÁØ´Ù. ÄÄÆÄÀϽà +´Ù¸£°Ô ¼±ÅÃÇÏÁö ¾ÊÀ¸¸é ÀÌ MPMÀÌ ¼±ÅõȴÙ.

    + + + + + + + + +
    BeOSbeos
    Netwarempm_netware
    OS/2mpmt_os2
    À¯´Ð½ºprefork
    À©µµ¿ìÁîmpm_winnt
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mpm.html.ru.koi8-r b/rubbos/app/httpd-2.0.64/docs/manual/mpm.html.ru.koi8-r new file mode 100644 index 00000000..a63a669d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mpm.html.ru.koi8-r @@ -0,0 +1,138 @@ + + + +íÕÌØÔÉ-ÐÒÏÃÅÓÓÎÙÅ ÍÏÄÕÌÉ (íð-ÍÏÄÕÌÉ) - HTTP ÓÅÒ×ÅÒ Apache + + + + + +
    <-
    +

    íÕÌØÔÉ-ÐÒÏÃÅÓÓÎÙÅ ÍÏÄÕÌÉ (íð-ÍÏÄÕÌÉ)

    +
    +

    äÏÓÔÕÐÎÙÅ ÑÚÙËÉ:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + +

    üÔÏÔ ÄÏËÕÍÅÎÔ ÏÐÉÓÙ×ÁÅÔ, ÞÔÏ ÔÁËÏÅ ÍÕÌØÔÉ-ÐÒÏÃÅÓÓÎÙÅ ÍÏÄÕÌÉ +É ËÁË ÏÎÉ ÉÓÐÏÌØÚÕÀÔÓÑ × HTTP-ÓÅÒ×ÅÒÅ Apache.

    +
    + +
    top
    +
    +

    ÷×ÅÄÅÎÉÅ

    + +

    HTTP-ÓÅÒ×ÅÒ Apache ÂÙÌ ÒÁÚÒÁÂÏÔÁÎ ËÁË ÍÏÝÎÙÊ É ÇÉÂËÉÊ ×ÅÂ-ÓÅÒ×ÅÒ, + ËÏÔÏÒÙÊ ÍÏÖÅÔ ÒÁÂÏÔÁÔØ ÎÁ ÓÁÍÙÈ ÒÁÚÎÙÈ ÐÌÁÔÆÏÒÍÁÈ É × ÒÁÍËÁÈ + ÒÁÚÌÉÞÎÏÇÏ ÏËÒÕÖÅÎÉÑ. òÁÚÌÉÞÎÙÅ ÐÌÁÔÆÏÒÍÙ É ÏËÒÕÖÅÎÉÑ ÞÁÓÔÏ + ÔÒÅÂÕÀÔ É ÒÁÚÌÉÞÎÙÈ ×ÏÚÍÏÖÎÏÓÔÅÊ ÉÌÉ ÍÏÇÕÔ ÐÒÅÄÏÓÔÁ×ÌÑÔØ + ÒÁÚÌÉÞÎÙÅ ÐÕÔÉ ÒÅÁÌÉÚÁÃÉÉ ÏÄÎÏÊ É ÔÏÊ ÖÅ ×ÏÚÍÏÖÎÏÓÔÉ ÎÁÉÂÏÌÅÅ + ÜÆÆÅËÔÉ×ÎÏ. Apache ×ÓÅÇÄÁ ÍÏÇ ÒÁÂÏÔÁÔØ × ÒÁÚÌÉÞÎÙÈ + ÓÒÅÄÁÈ ÏËÒÕÖÅÎÉÑ ÚÁ ÓÞ£Ô Ó×ÏÅÊ ÍÏÄÕÌØÎÏÊ ÁÒÈÉÔÅËÔÕÒÙ, + ÐÏÚ×ÏÌÑÀÝÅÊ ×ÅÂÍÁÓÔÅÒÕ ×ÙÂÒÁÔØ ×ÓÀ ÎÅÏÂÈÏÄÉÍÕÀ ÆÕÎËÃÉÏÎÁÌØÎÏÓÔØ, + ËÏÔÏÒÁÑ ÂÕÄÅÔ ÒÅÁÌÉÚÏ×Ù×ÁÔØÓÑ ÓÅÒ×ÅÒÏÍ ÐÏÓÌÅ ËÏÍÐÉÌÑÃÉÉ, ÐÒÉ + ÐÏÍÏÝÉ ËÏÍÐÉÌÉÒÕÅÍÙÈ ÉÌÉ ÐÏÄËÌÀÞÁÅÍÙÈ ÍÏÄÕÌÅÊ.

    + +

    ÷ Apache 2.0 ÍÏÄÕÌØÎÁÑ ÁÒÈÉÔÅËÔÕÒÁ ÂÙÌÁ ÒÁÓÛÉÒÅÎÁ ÎÁÉÂÏÌÅÅ + ÏÂÝÉÍÉ ÆÕÎËÃÉÑÍÉ ×ÅÂ-ÓÅÒ×ÅÒÁ. ôÅÐÅÒØ ÓÅÒ×ÅÒ ÐÏÓÔÁ×ÌÑÅÔÓÑ Ó + ÎÁÂÏÒÏÍ ÍÕÌØÔÉ-ÐÒÏÃÅÓÓÎÙÈ ÍÏÄÕÌÅÊ (íð-ÍÏÄÕÌÅÊ), ÏÔ×ÅÔÓÔ×ÅÎÎÙÈ + ÚÁ ÓÏÅÄÉÎÅÎÉÅ Ó ÓÅÔÅ×ÙÍÉ ÐÏÒÔÁÍÉ ËÏÍÐØÀÔÅÒÁ, ÚÁ ÐÒÉ£Í ÚÁÐÒÏÓÏ× + É ÚÁ ËÏÏÒÄÉÎÁÃÉÀ ÉÈ ÏÂÒÁÂÏÔËÉ ÄÏÞÅÒÎÉÍÉ ÐÒÏÃÅÓÓÁÍÉ.

    + +

    òÁÓÛÉÒÅÎÉÅ ÍÏÄÕÌØÎÏÊ ÁÒÈÉÔÅËÔÕÒÙ ÄÏ ÜÔÏÇÏ ÕÒÏ×ÎÑ ÄÁ£Ô + Ä×Á ×ÁÖÎÙÈ ÐÒÅÉÍÕÝÅÓÔ×Á:

    + +
      +
    • Apache ÍÏÖÅÔ ÂÏÌÅÅ ÁËËÕÒÁÔÎÏ É ÜÆÆÅËÔÉ×ÎÏ ÒÁÂÏÔÁÔØ + × ÓÁÍÙÈ ÒÁÚÎÙÈ ÏÐÅÒÁÃÉÏÎÎÙÈ ÓÉÓÔÅÍÁÈ. ÷ ÞÁÓÔÎÏÓÔÉ, + ×ÅÒÓÉÑ Apache ÄÌÑ Windows ÔÅÐÅÒØ ÒÁÂÏÔÁÅÔ ÎÁÍÎÏÇÏ ÂÏÌÅÅ + ÜÆÆÅËÔÉ×ÎÏ, ÂÌÁÇÏÄÁÒÑ ÔÏÍÕ, ÞÔÏ íð-ÍÏÄÕÌØ + mpm_winnt ÍÏÖÅÔ ÉÓÐÏÌØÚÏ×ÁÔØ ÓÏÂÓÔ×ÅÎÎÙÅ + ÓÅÔÅ×ÙÅ ÆÕÎËÃÉÉ Windows ×ÚÁÍÅÎ ÓÅÔÅ×ÙÈ ÆÕÎËÃÉÊ ÕÒÏ×ÎÑ POSIX. + üÔÏ ËÁÓÁÅÔÓÑ É ÄÒÕÇÉÈ ÏÐÅÒÁÃÉÏÎÎÙÈ ÓÉÓÔÅÍ, ÄÌÑ ËÏÔÏÒÙÈ + ÒÁÚÒÁÂÏÔÁÎÙ ÓÐÅÃÉÁÌØÎÙÅ íð-ÍÏÄÕÌÉ.
    • + +
    • óÅÒ×ÅÒ ÍÏÖÅÔ ÂÙÔØ ÎÁÓÔÒÅÎ ÂÏÌÅÅ ÏÐÔÉÍÁÌØÎÏ ÄÌÑ ÎÕÖÄ ËÏÎËÒÅÔÎÏÇÏ + ÓÁÊÔÁ. îÁÐÒÉÍÅÒ, ÄÌÑ ÓÁÊÔÏ×, ÔÒÅÂÕÀÝÉÈ ÚÎÁÞÉÔÅÌØÎÏÊ + ÍÁÓÛÔÁÂÉÒÕÅÍÏÓÔÉ, ÍÏÖÅÔ ÂÙÔØ ×ÙÂÒÁÎ ÍÎÏÇÏÐÏÔÏÞÎÙÊ íð-ÍÏÄÕÌØ, + ÔÁËÏÊ ËÁË worker, Á ÄÌÑ ÓÁÊÔÏ×, ÔÒÅÂÕÀÝÉÈ + ÂÏÌØÛÅÊ ÓÔÁÂÉÌØÎÏÓÔÉ ÉÌÉ ÓÏ×ÍÅÓÔÉÍÏÓÔÉ ÓÏ ÓÔÁÒÙÍ ðï, ÍÏÖÅÔ + ÂÙÔØ ÉÓÐÏÌØÚÏ×ÁÎ prefork. ëÒÏÍÅ ÔÏÇÏ, + ÔÁËÖÅ ÐÒÅÄÏÓÔÁ×ÌÑÀÔÓÑ ÓÐÅÃÉÁÌØÎÙÅ ×ÏÚÍÏÖÎÏÓÔÉ, ÔÁËÉÅ ËÁË + ÏÂÓÌÕÖÉ×ÁÎÉÅ ÒÁÚÌÉÞÎÙÈ ÈÏÓÔÏ× ÐÒÏÃÅÓÓÁÍÍÉ Ó ÐÒÉ×ÉÌÅÇÉÑÍÉ + ÒÁÚÌÉÞÎÙÈ ÐÏÌØÚÏ×ÁÔÅÌÅÊ (perchild).
    • +
    + +

    îÁ ÕÒÏ×ÎÅ ÐÏÌØÚÏ×ÁÔÅÌÑ íð-ÍÏÄÕÌÉ ÐÏÞÔÉ ÎÅ ÏÔÌÉÞÁÀÔÓÑ ÏÔ + ×ÓÅÈ ÏÓÔÁÌØÎÙÈ ÍÏÄÕÌÅÊ Apache. ïÓÎÏ×ÎÏÅ ÒÁÚÌÉÞÉÅ ÓÏÓÔÏÉÔ + × ÔÏÍ, ÞÔÏ Ó ÓÅÒ×ÅÒÏÍ ÍÏÖÅÔ ÂÙÔØ ÓËÏÍÐÉÌÉÒÏ×ÁÎ ÏÄÉÎ É ÔÏÌØËÏ + ÏÄÉÎ íð-ÍÏÄÕÌØ. óÐÉÓÏË ÄÏÓÔÕÐÎÙÈ íð-ÍÏÄÕÌÅÊ ÍÏÖÎÏ ÐÏÓÍÏÔÒÅÔØ + × ËÁÔÁÌÏÇÅ ÍÏÄÕÌÅÊ.

    + +
    top
    +
    +

    ÷ÙÂÏÒ íð-ÍÏÄÕÌÑ

    + +

    íð-ÍÏÄÕÌØ ÄÏÌÖÅÎ ÂÙÔØ ×ÙÂÒÁÎ ÎÁ ÜÔÁÐÅ ËÏÎÆÉÇÕÒÁÃÉÉ, + Á ÚÁÔÅÍ ÓËÏÍÐÉÌÉÒÏ×ÁÎ ×ÍÅÓÔÅ Ó ÓÅÒ×ÅÒÏÍ, ÞÔÏÂÙ ÓÔÁÔØ + ÅÇÏ ÞÁÓÔØÀ. ëÏÍÐÉÌÑÔÏÒÙ ÓÐÏÓÏÂÎÙ ÏÐÔÉÍÉÚÉÒÏ×ÁÔØ + ÍÎÏÇÉÅ ÆÕÎËÃÉÉ ÐÒÉ ÕÓÌÏ×ÉÉ, ÞÔÏ ÉÓÐÏÌØÚÕÀÔÓÑ ÐÏÔÏËÉ, + ÏÄÎÁËÏ ÏÎÉ ÄÏÌÖÎÙ ÚÎÁÔØ ÅÝÅ ÎÁ ÜÔÁÐÅ ËÏÍÐÉÌÑÃÉÉ, ÉÓÐÏÌØÚÕÀÔÓÑ + ÐÏÔÏËÉ ÉÌÉ ÎÅÔ.

    + +

    þÔÏÂÙ ÐÏÄËÌÀÞÉÔØ ÖÅÌÁÅÍÙÊ íð-ÍÏÄÕÌØ Ë Apache, + ÉÓÐÏÌØÚÕÊÔÅ ÁÒÇÕÍÅÎÔ --with-mpm=MPM + ÓËÒÉÐÔÁ configure, ÇÄÅ MPM - + ÜÔÏ ÎÁÚ×ÁÎÉÅ ÖÅÌÁÅÍÏÇÏ íð-ÍÏÄÕÌÑ.

    + +

    ðÏÓÌÅ ÔÏÇÏ, ËÁË ÓÅÒ×ÅÒ ÓËÏÍÐÉÌÉÒÏ×ÁÎ, ×ÓÅÇÄÁ ÍÏÖÎÏ + ÏÐÒÅÄÅÌÉÔØ, ËÁËÏÊ íð-ÍÏÄÕÌØ ÂÙÌ ×ÙÂÒÁÎ, ÉÓÐÏÌØÚÕÑ ËÏÍÁÎÄÕ + ./httpd -l, ËÏÔÏÒÁÑ ×Ù×ÅÄÅÔ ÓÐÉÓÏË + ×ÓÅÈ ÍÏÄÕÌÅÊ, ÓÏÂÒÁÎÎÙÈ ×ÍÅÓÔÅ Ó ÓÅÒ×ÅÒÏÍ, + × ÔÏÍ ÞÉÓÌÅ É ÎÁÚ×ÁÎÉÅ íð-ÍÏÄÕÌÑ.

    +
    top
    +
    +

    íð-ÍÏÄÕÌÉ ÐÏ ÕÍÏÌÞÁÎÉÀ

    + +

    ðÒÉ×ÅÄ£ÎÎÁÑ ÎÉÖÅ ÔÁÂÌÉÃÁ ÐÏËÁÚÙ×ÁÅÔ, ËÁËÉÅ íð-ÍÏÄÕÌÉ ÐÏÄËÌÀÞÅÎÙ +ÐÏ ÕÍÏÌÞÁÎÉÀ × ÒÁÚÌÉÞÎÙÈ ÏÐÅÒÁÃÉÏÎÎÙÈ ÓÉÓÔÅÍÁÈ. ÷ ÎÅÊ ÕËÁÚÁÎ ÔÏÔ +íð-ÍÏÄÕÌØ, ËÏÔÏÒÙÊ ÂÕÄÅÔ ×ÙÂÒÁÎ, ÅÓÌÉ ×Ù ÎÁ ÜÔÁÐÅ ËÏÍÐÉÌÑÃÉÉ Ñ×ÎÏ ÎÅ +ÕËÁÚÁÌÉ ÄÒÕÇÏÊ íð-ÍÏÄÕÌØ.

    + + + + + + + + +
    BeOSbeos
    Netwarempm_netware
    OS/2mpmt_os2
    Unixprefork
    Windowsmpm_winnt
    +
    +
    +

    äÏÓÔÕÐÎÙÅ ÑÚÙËÉ:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/mpm.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/mpm.html.tr.utf8 new file mode 100644 index 00000000..d197c484 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/mpm.html.tr.utf8 @@ -0,0 +1,128 @@ + + + +Çok Süreçlilik Modülleri (MPM’ler) - Apache HTTP Sunucusu + + + + + +
    <-
    +

    Çok Süreçlilik Modülleri (MPM’ler)

    +
    +

    Mevcut Diller:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + +

    Bu belgede Çok Süreçlilik Modülü denince ne anlaşıldığı ve bunların + Apache HTTP Sunucusu tarafından nasıl kullanıldıkları açıklanmıştır.

    +
    + +
    top
    +
    +

    Giriş

    + +

    Apache HTTP Sunucusu çok çeşitli platformlar üstünde farklı ortamlarda + çalışabilen güçlü ve esnek bir HTTP sunucusu olarak tasarlanmıştır. + Farklı platformlar ve farklı ortamlar çoğunlukla farklı özellikler veya + aynı özelliğin en yüksek verimlilikle gerçeklenmesi için farklı yöntemler + gerektirir. Apache, geniş ortam çeşitliliğini daima modüler tasarımı + sayesinde uzlaştırmıştır. Bu tasarım, site yöneticilerine, sunucularında + bulunmasını istedikleri özellikleri derleme sırasında veya çalışma anında + gerekli modülleri yüklemek suretiyle seçebilme imkanı verir.

    + +

    Apache 2.0, bu modüler tasarımı sunucunun en temel işlevlerine kadar + indirmiştir. Sunucu, Çok Süreçlilik Modülleri adı verilen ve makine + üzerindeki ağ portlarının bağlanmasından, isteklerin kabul edilmesinden + ve bu istekleri yanıtlayacak çocuklara dağıtmaktan sorumlu olan + modüllerin seçimine imkan verecek bir yapılanma ile gelir.

    + +

    Sunucunun modüler tasarımının bu seviyede genişletilmesi iki önemli + yarar sağlar:

    + +
      +
    • Apache geniş çeşitlilikteki işletim sistemlerini daha temiz ve daha + verimli bir şekilde destekleyebilmektedir. Özellikle, + mpm_winnt modülü, Apache 1.3’te kullanılan POSIX + katmanının yerine işletim sistemine özgü özellikleri + kullanabildiğinden, Apache HTTP Sunucusunun Windows sürümü artık çok + daha verimli bir duruma gelmiştir. Aynı fayda özelleştirilmiş MPM’lerle + diğer işletim sistemlerine de sağlanmıştır.
    • + +
    • Sunucu, belli bir sitenin ihtiyaçlarına uygun olarak daha iyi + kişiselleştirilebilmektedir. Örneğin, eski yazılım ile uyumluluk ve + kararlılığa önem veren siteler prefork modülünü + kullanabilirken, daha geniş ölçeklenebilirlik gerektiren siteler + worker gibi evreli bir MPM modülünü + seçebilmektedir. Ek olarak, farklı konakların farklı kullanıcı + kimlikleri ile sunulması gibi özel oluşumlar da + (perchild) sağlanabilmektedir.
    • +
    + +

    Kullanıcı açısından MPM’lerin diğer Apache modüllerinden görünüşte bir + farkı yoktur. Asıl fark sunucuya yüklenebilecek azami MPM modülü + sayısının bir ve yalnız bir olarak sınırlanmış olmasıdır. Mevcut MPM + modülleri modül dizini sayfasında listelenmiştir..

    + +
    top
    +
    +

    MPM Seçimi

    + +

    MPM’ler paket yapılandırması sırasında seçilmeli ve sunucu içinde + derlenmelidir. Derleyiciler evrelerin kullanılacağını bildikleri + takdirde çoğu işlevi evreleri kullanacak şekilde + en iyileyebilmektedir.

    + +

    Kullanmak istediğiniz MPM’yi kendiniz seçmek istediğiniz takdirde + configure betiğini + --with-mpm=AD seçeneği ile kullanınız. Burada + AD istenen MPM’nin adıdır.

    + +

    Sunucu derlendikten sonra hangi MPM’nin seçilmiş olduğunu ./httpd + -l komutuyla saptamak mümkündür. Bu komut, MPM de dahil omak + üzere sunucuyla birlikte derlenmiş tüm modülleri listeleyecektir.

    +
    top
    +
    +

    Öntanımlı MPM’ler

    + +

    Aşağıdaki tabloda çeşitli işletim sistemlerinde öntanımlı olan MPM’ler + listelenmiştir. Derleme sırasında başka bir seçim yapmadığınız takdirde + bu işletim sistemlerinde bu MPM’ler seçilmiş olacaktır.

    + + + + + + + + +
    BeOSbeos
    Netwarempm_netware
    OS/2mpmt_os2
    Unixprefork
    Windowsmpm_winnt
    +
    +
    +

    Mevcut Diller:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/new_features_2_0.html b/rubbos/app/httpd-2.0.64/docs/manual/new_features_2_0.html new file mode 100644 index 00000000..dbf31509 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/new_features_2_0.html @@ -0,0 +1,33 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: new_features_2_0.html.de +Content-Language: de +Content-type: text/html; charset=ISO-8859-1 + +URI: new_features_2_0.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: new_features_2_0.html.es +Content-Language: es +Content-type: text/html; charset=ISO-8859-1 + +URI: new_features_2_0.html.fr +Content-Language: fr +Content-type: text/html; charset=ISO-8859-1 + +URI: new_features_2_0.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: new_features_2_0.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: new_features_2_0.html.ru.koi8-r +Content-Language: ru +Content-type: text/html; charset=KOI8-R + +URI: new_features_2_0.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/new_features_2_0.html.de b/rubbos/app/httpd-2.0.64/docs/manual/new_features_2_0.html.de new file mode 100644 index 00000000..3e6924d7 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/new_features_2_0.html.de @@ -0,0 +1,265 @@ + + + +Übersicht der neuen Funktionen in Apache 2.0 - Apache HTTP Server + + + + + +
    <-
    +

    Übersicht der neuen Funktionen in Apache 2.0

    +
    +

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

    +
    + +

    Dieses Dokument beschreibt einige der wichtigsten Änderungen + des Apache HTTP Servers 2.0 gegenüber der Version 1.3.

    +
    + +
    top
    +
    +

    Core-Erweiterungen

    + + +
    +
    Unix-Threading
    + +
    Auf Unix-Systemen mit Unterstützung für POSIX-Threads, + kann Apache jetzt in einem Multi-Process, Multi-Threaded Hybrid-Mode + gestartet werden. Dies verbessert die Skalierfähigkeit für + viele, jedoch nicht unbedingt alle Konfigurationen.
    + +
    Neues Build-System
    + +
    Das Build-System wurde komplett auf der Basis von + autoconf und libtool neu geschrieben. Dadurch + wird das Apache-Konfigurationssystem dem vieler anderer Packages + ähnlicher.
    + +
    Multi-Protokoll-Unterstützung
    + +
    Apache stellt jetzt die notwendigen Grundfunktionalitäten + bereit, um mehrere Protokolle unterstützen und verarbeiten zu + können. mod_echo wurde hierfür als + Beispiel geschrieben.
    + +
    Bessere Unterstützung von + Nicht-Unix-Plattformen
    + +
    Apache 2.0 ist schneller und stabiler auf Nicht-Unix-Plattformen + wie BeOS, OS/2 und Windows. Mit der Einführung von + Plattform-spezifischen Multi-Processing Modulen + (MPMs) und der Apache Portable Runtime (APR), sind diese Plattformen + jetzt in ihrem nativen API implementiert, wodurch die Verwendung der + häufig fehlerbehafteten und schlecht funktionierenden + POSIX-Emulation-Layer vermieden wird.
    + +
    Neues Apache API
    + +
    Das API für Module hat sich in 2.0 stark verändert. + Die meisten der Sortierungs-/Prioritätsprobleme von Modulen bei + 1.3 sollten nun verschwunden sein. In 2.0 wird hiervon vieles + automatisch durchgeführt. Die Modulsortierung wird jetzt + über einen pre-hook vorgenommen, um mehr Flexibilität + zu bieten. Außerdem wurden neue API-Calls hinzugefügt, + die zusätzliche Modulfähigkeiten zur Verfügung stellen, + ohne den Apache-Kern anpassen zu müssen.
    + +
    IPv6-Unterstützung
    + +
    Auf Systemen, bei denen die zugrundeliegende Apache Portable + Runtime-Bibliothek IPv6 unterstützt, bekommt Apache + standarmäßig IPv6 Listening Sockets. Zusätzlich + unterstützen die Konfigurationsanweisungen Listen, NameVirtualHost und VirtualHost numerische IPv6-Adressangaben + (z.B., "Listen [2001:db8::1]:8080").
    + +
    Filterung
    + +
    Apache-Module können jetzt als Filter entwickelt und zur + Filterung des rein- und rausgehenden Datenstroms des Servers + eingesetzt werden. Hierdurch kann beispielsweise die Ausgabe von + CGI-Skripten durch den INCLUDES-Filter von + mod_include bearbeitet werden und so Server-Side + Include-Anweisungen ausgeführt werden. Das Modul + mod_ext_filter erlaubt externen Programmen + als Filter zu agieren, in der gleichen Weise wie CGI-Programme als + Eingabe dienen können.
    + +
    Mehrsprachige Fehlermeldungen
    + +
    Fehlermeldungen die an den Browser rausgehen, stehen jetzt als + SSI-Dokumente in verschiedenen Sprachen zur Verfügung. Sie + können bei Bedarf durch den Administrator angepasst werden, + um ein einheitliches Design zu erreichen.
    + +
    Vereinfachte Konfiguration
    + +
    Viele der verwirrenden Konfigurationsanweisungen wurden vereinfacht. + Die oft für Verwirrung sorgenden Port- und + BindAddress-Anweisungen wurden entfernt. + Ausschließlich die Listen-Anweisung wird nun zum + Setzen von IP-Addressen und Portnummern benutzt. + Der Servername und die Portnummer, die für Weiterleitungen und + zur Erkennung virtueller Server verwendet werden, werden über + die ServerName-Anweisung + konfiguriert.
    + +
    Native Windows NT Unicode-Unterstützung
    + +
    Apache 2.0 auf Windows NT benutzt jetzt utf-8 für alle + Dateinamen-Kodierungen. Diese werden direkt auf das zugrundeliegende + Unicode-Dateisystem abgebildet, wodurch Mehrsprach-Unterstützung + für alle Windows NT-basierten Installationen, inklusive Windows + 2000 und Windows XP, zur Verfügung gestellt wird. + Diese Unterstützung ist nicht auf Windows 95, 98 oder ME + verfügbar. Hier wird weiterhin die jeweils lokale Codepage des + Rechners für den Zugriff auf das Dateisystem verwendet.
    + +
    Bibliothek für reguläre Ausdrücke aktualisiert
    + +
    Apache 2.0 enthält die "Perl Compatible + Regular Expression Library" (PCRE). + Bei der Auswertung aller regulären Ausdrücke wird nun + die leistungsfähigere Syntax von Perl 5 verwendet.
    + +
    +
    top
    +
    +

    Modul-Erweiterungen

    + + +
    +
    mod_ssl
    + +
    Neues Modul in Apache 2.0. Dieses Modul ist ein Interface + zu den von OpenSSL bereitgestellten SSL/TLS + Verschlüsselungs-Protokollen.
    + +
    mod_dav
    + +
    Neues Modul in Apache 2.0. Dieses Modul implementiert die HTTP + Distributed Authoring and Versioning (DAV) Spezifikation zur + Erzeugung und Pflege von Web-Inhalten.
    + +
    mod_deflate
    + +
    Neues Modul in Apache 2.0. Dieses Modul erlaubt es Browsern, die + dies unterstützen, eine Komprimierung des Inhaltes vor der + Auslieferung anzufordern, um so Netzwerk-Bandbreite zu sparen.
    + +
    mod_auth_ldap
    + +
    Neues Modul in Apache 2.0.41. Diese Modul ermöglicht + die Verwendung einer LDAP-Datenbank zur Speicherung von + Berechtigungsdaten für die HTTP-Basic-Authentication. + Ein Begleitmodul, mod_ldap, stellt einen + Verbindungs-Pool und die Pufferung von Abfrageergebnissen zur + Verfügung. +
    + +
    mod_auth_digest
    + +
    Zusätzliche Unterstützung für + prozessübergreifendes Session-Caching mittels Shared-Memory. +
    + +
    mod_charset_lite
    + +
    Neues Modul in Apache 2.0. + Dieses experimentelle Modul erlaubt Zeichensatz-Übersetzungen oder + -Umschlüsselung.
    + +
    mod_file_cache
    + +
    Neues Modul in Apache 2.0. Dieses Modul beinhaltet die + Funktionalität von mod_mmap_static aus Apache 1.3, + plus einige weitere Caching-Funktionen.
    + +
    mod_headers
    + +
    Dieses Modul ist in Apache 2.0 deutlich flexibler geworden. Es + kann jetzt die von mod_proxy genutzten Request-Header + manipulieren und es ist möglich Response-Header auf Basis von + definierten Bedingungen zu verändern.
    + +
    mod_proxy
    + +
    Das Proxy Modul wurde komplett neu geschrieben um die + Möglichkeiten der neuen Filter-Funktionalität + auszuschöpfen und um einen zuverlässigen Proxy zu haben, der + den HTTP/1.1-Spezifikationen entspricht. Neue <Proxy> + -Konfigurationsabschnitte bieten eine besser lesbare (und intern + schnellere) Kontrolle der vermittelten Seiten. + Die überladenen <Directory + "proxy:...">-Konfigurationen werden nicht + mehr unterstützt. Das Modul ist nun in mehrere Module + unterteilt, die jeweils ein bestimmtes Übertragungsprotokoll + unterstützen, wie proxy_connect, + proxy_ftp und proxy_http.
    + +
    mod_negotiation
    + +
    Die neue Konfigurationsanweisung ForceLanguagePriority + kann benutzt werden, um sicherzustellen, dass ein Client auf jeden + Fall ein einzelnes Dokument, anstatt einer NOT ACCEPTABLE- oder + MULTIPLE CHOICES-Antwort, bekommt. Zusätzlich wurden die + Negotiation- und Multiview-Algorithmen angepasst um einheitlichere + Ergebnisse zu liefern. Außerdem wird ein neues + Type-Map-Format bereitgestellt, das Dokumenteninhalte direkt + enthalten kann.
    + +
    mod_autoindex
    + +
    Automatisch erzeugte Verzeichnisindizes können zur besseren + Übersichtlichkeit durch HTML-Tabellen dargestellt werden. + Genauere Sortierungen, wie Sortierung nach Versionsnummer und + Wildcard-Filterung des Verzeichnisindizes werden unterstützt.
    + +
    mod_include
    + +
    Neue Anweisungen erlauben es, die Standard Start- und Endtags von + SSI-Elementen zu ändern. Zudem können die Default-Formate + für Fehlermeldungen und Zeitangaben nun ebenfalls in der + Serverkonfiguration vorgenommen werden. Auf die Ergebnisse der + Auswertung und Gruppierung von regulären Ausdrücken (jetzt + auf Basis der Perl-Syntax für reguläre Ausdrücke) kann + über die mod_include Variablen $0 + bis $9 zugegriffen werden.
    + +
    mod_auth_dbm
    + +
    DBM-ähnliche Datenbanken werden jetzt durch die + Konfigurationsaweisung AuthDBMType unterstützt.
    +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/new_features_2_0.html.en b/rubbos/app/httpd-2.0.64/docs/manual/new_features_2_0.html.en new file mode 100644 index 00000000..a248f752 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/new_features_2_0.html.en @@ -0,0 +1,245 @@ + + + +Overview of new features in Apache 2.0 - Apache HTTP Server + + + + + +
    <-
    +

    Overview of new features in Apache 2.0

    +
    +

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

    +
    + +

    This document describes some of the major changes between the + 1.3 and 2.0 versions of the Apache HTTP Server.

    +
    + +
    top
    +
    +

    Core Enhancements

    + + +
    +
    Unix Threading
    + +
    On Unix systems with POSIX threads support, Apache can + now run in a hybrid multiprocess, multithreaded mode. This + improves scalability for many, but not all configurations.
    + +
    New Build System
    + +
    The build system has been rewritten from scratch to be + based on autoconf and libtool. + This makes Apache's configuration system more similar to + that of other packages.
    + +
    Multiprotocol Support
    + +
    Apache now has some of the infrastructure in place to + support serving multiple protocols. mod_echo has + been written as an example.
    + +
    Better support for non-Unix + platforms
    + +
    Apache 2.0 is faster and more stable on non-Unix + platforms such as BeOS, OS/2, and Windows. With the + introduction of platform-specific multi-processing modules (MPMs) and the + Apache Portable Runtime (APR), these platforms are now + implemented in their native API, avoiding the often buggy and + poorly performing POSIX-emulation layers.
    + +
    New Apache API
    + +
    The API for modules has changed significantly for 2.0. + Many of the module-ordering/-priority problems from 1.3 should + be gone. 2.0 does much of this automatically, and module ordering + is now done per-hook to allow more flexibility. Also, new calls + have been added that provide additional module capabilities + without patching the core Apache server.
    + +
    IPv6 Support
    + +
    On systems where IPv6 is supported by the underlying + Apache Portable Runtime library, Apache gets IPv6 listening + sockets by default. Additionally, the Listen, NameVirtualHost, and VirtualHost directives support + IPv6 numeric address strings (e.g., "Listen + [2001:db8::1]:8080").
    + +
    Filtering
    + +
    Apache modules may now be written as filters which act on + the stream of content as it is delivered to or from the + server. This allows, for example, the output of CGI scripts to + be parsed for Server Side Include directives using the + INCLUDES filter in mod_include. The + module mod_ext_filter allows external programs to + act as filters in much the same way that CGI programs can act as + handlers.
    + +
    Multilanguage Error Responses
    + +
    Error response messages to the browser are now provided in + several languages, using SSI documents. They may be customized + by the administrator to achieve a consistent look and feel.
    + +
    Simplified configuration
    + +
    Many confusing directives have been simplified. The often + confusing Port and BindAddress directives + are gone; only the Listen + directive is used for IP address binding; the ServerName directive specifies the + server name and port number only for redirection and vhost + recognition.
    + +
    Native Windows NT Unicode Support
    + +
    Apache 2.0 on Windows NT now uses utf-8 for all filename + encodings. These directly translate to the underlying Unicode + file system, providing multilanguage support for all Windows + NT-based installations, including Windows 2000 and Windows XP. + This support does not extend to Windows 95, 98 or ME, which + continue to use the machine's local codepage for filesystem + access.
    + +
    Regular Expression Library Updated
    + +
    Apache 2.0 includes the Perl + Compatible Regular Expression Library (PCRE). All regular + expression evaluation now uses the more powerful Perl 5 + syntax.
    + +
    +
    top
    +
    +

    Module Enhancements

    + + +
    +
    mod_ssl
    + +
    New module in Apache 2.0. This module is an interface + to the SSL/TLS encryption protocols provided by + OpenSSL.
    + +
    mod_dav
    + +
    New module in Apache 2.0. This module implements the HTTP + Distributed Authoring and Versioning (DAV) specification for + posting and maintaining web content.
    + +
    mod_deflate
    + +
    New module in Apache 2.0. This module allows supporting + browsers to request that content be compressed before delivery, + saving network bandwidth.
    + +
    mod_auth_ldap
    + +
    New module in Apache 2.0.41. This module allows an LDAP + database to be used to store credentials for HTTP Basic + Authentication. A companion module, mod_ldap + provides connection pooling and results caching.
    + +
    mod_auth_digest
    + +
    Includes additional support for session caching across + processes using shared memory.
    + +
    mod_charset_lite
    + +
    New module in Apache 2.0. This experimental module allows + for character set translation or recoding.
    + +
    mod_file_cache
    + +
    New module in Apache 2.0. This module includes the + functionality of mod_mmap_static in Apache 1.3, + plus adds further caching abilities.
    + +
    mod_headers
    + +
    This module is much more flexible in Apache 2.0. It can now + modify request headers used by mod_proxy, and + it can conditionally set response headers.
    + +
    mod_proxy
    + +
    The proxy module has been completely rewritten to take + advantage of the new filter infrastructure and to implement a + more reliable, HTTP/1.1 compliant proxy. In addition, new + <Proxy> + configuration sections provide more readable (and internally + faster) control of proxied sites; overloaded <Directory + "proxy:..."> configuration are not supported. The module + is now divided into specific protocol support modules including + proxy_connect, proxy_ftp and + proxy_http.
    + +
    mod_negotiation
    + +
    A new ForceLanguagePriority directive can be used to assure that + the client receives a single document in all cases, rather than + NOT ACCEPTABLE or MULTIPLE CHOICES responses. In addition, the + negotiation and MultiViews algorithms have been cleaned up to + provide more consistent results and a new form of type map that + can include document content is provided.
    + +
    mod_autoindex
    + +
    Autoindex'ed directory listings can now be configured to + use HTML tables for cleaner formatting, and allow finer-grained + control of sorting, including version-sorting, and wildcard + filtering of the directory listing.
    + +
    mod_include
    + +
    New directives allow the default start and end tags for SSI elements + to be changed and allow for error and time format configuration + to take place in the main configuration file rather than in the + SSI document. Results from regular expression parsing and grouping + (now based on Perl's regular expression syntax) can be retrieved + using mod_include's variables $0 + .. $9.
    + +
    mod_auth_dbm
    + +
    Now supports multiple types of DBM-like databases using the + AuthDBMType + directive.
    + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/new_features_2_0.html.es b/rubbos/app/httpd-2.0.64/docs/manual/new_features_2_0.html.es new file mode 100644 index 00000000..fac3f6e1 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/new_features_2_0.html.es @@ -0,0 +1,274 @@ + + + +Visión general de las nuevas funcionalidades de Apache +2.0 - Servidor HTTP Apache + + + + + +
    <-
    +

    Visión general de las nuevas funcionalidades de Apache +2.0

    +
    +

    Idiomas disponibles:  de  | + en  | + es  | + fr  | + ja  | + ko  | + ru  | + tr 

    +
    + +

    Este documento describe algunas de las diferencias más + importantes que existen entre las versiones 1.3 y 2.0 del Servidor + HTTP Apache.

    +
    + +
    top
    +
    +

    Principales Mejoras

    + + +
    +
    Hebrado en Unix
    + +
    En los sistemas Unix que soportan hebras POSIX, la nueva + versión de Apache puede ejecutarse en modo híbrido + multiproceso-multihebra. Esto mejora la escalabilidad para + muchas aunque no para todas las configuraciones.
    + +
    Nuevo sistema de configuración y compilación
    + +
    El sistema de configuración y compilación ha sido + escrito de nuevo desde cero para basarlo en + autoconf y libtool. Esto hace que el + sistema de configuración de Apache se parezca ahora + más al de otros proyectos Open Source.
    + +
    Soporte Multiprotocolo
    + +
    La nueva versión tiene la infraestructura necesaria + para servir distintos protocolos. Por ejemplo, se ha escrito el + módulo mod_echo.
    + +
    Soporte mejorado para las plataformas que no son tipo Unix
    + +
    La versión 2.0 de Apache es más rápida y + más estable en sistemas que no son tipo Unix, tales como + BeOS, OS/2 y Windows, que la versión antigua. Con la + introducción de módulos de + multiprocesamiento (MPMs) específicos para cada + plataforma y del Apache Portable Runtime (APR), estas + plataformas tienen ahora implementada su propia API nativa, + evitando las capas de emulación POSIX que provocan + problemas y un bajo rendimiento.
    + +
    Nueva interfaz de programación (API) de Apache
    + +
    La API para los módulos ha cambiado significativamente + en la nueva versión. Muchos de los problemas de + ordención y prioridad de módulos de la versión + 1.3 deben haber desaparecido. Apache 2.0 hace automaticamente + mucho de lo que es necesario, y la ordenación de + módulos se hace ahora por hooks, lo que ofrece una mayor + flexibilidad. También se han añadido nuevas llamadas + que ofrecen capacidades adicionales sin tener que parchear el + núcleo del servidor Apache.
    + +
    Soporte de IPv6
    + +
    En los sitemas que soportan IPv6 con la libreria Apache + Portable Runtime, Apache soporta IPv6 listening sockets por + defecto. Además, las directivas Listen, NameVirtualHost, y VirtualHost soportan direcciones IPv6 + numéricas (por ejemplo, "Listen + [2001:db8::1]:8080").
    + +
    Filtros
    + +
    Los módulos de Apache pueden ahora escribirse para que + se comporten como filtros que actúan sobre el flujo de + contenidos tal y como salen del servidor o tal y como son + recibidos por el servidor. Esto permite, por ejemplo, que el + resultado de un script CGI sea analizado por las directivas + Server Side Include usando el filtro INCLUDES del + módulo mod_include. El módulo + mod_ext_filter permite que programas externos + actúen como filtros casi del mismo modo que los CGIs pueden + actuar como handlers.
    + +
    Mensajes de error en diferentes idiomas
    + +
    Los mensajes de error que se envían a los navegadores + están ahora disponibles en diferentes idiomas, usando + documentos SSI. Estos mensajes pueden personalizarse por el + administrador del sitio web para conseguir un look and feel + coherente con el resto de los contenidos.
    + +
    Configuración simplificada
    + +
    Muchas directivas que podían inducir a confusión + han sido simplificadas. Las directivas Port y + BindAddress han desaparecido; para configurar la + dirección IP en la que escucha el servidor ahora se usa + únicamente la directiva Listen; la directiva ServerName especifica el nombre del + servidor y el número del puerto solo para redirecionamiento + y reconocimento de host virtual.
    + +
    Soporte de Unicode Nativo para Windows NT
    + +
    Apache 2.0 en Windows NT usa ahora utf-8 para la + codificación de los nombres de fichero. Estos se mapean + directamente al sistema de ficheros Unicode subyanciente, + suministrando soporte para diferentes idiomas para todas + instalaciones en Windows NT, includidos Windows 2000 y Windows + XP. Este soporte no se extiende a Windows 95, 98 o ME, que + continúan usando la codificación que tenga la + máquina local para el acceso al sistema de + archivos.
    + +
    Actulización de la librería de expresiones + regulares (regular expressions)
    + +
    Apache 2.0 incluye la Librería de expresiones + regulares compatibles de/con Perl (PCRE). Ahora, cuando se + evalúan las expresiones tipo, se usa siempre la potente + sintaxis de Perl 5.
    + +
    +
    top
    +
    +

    Mejoras en los módulos

    + + +
    +
    mod_ssl
    + +
    Módulo nuevo en Apache 2.0. Este módulo es una + interfaz para los protocolos de encriptado SSL/TLS de + OpenSSL.
    + +
    mod_dav
    + +
    Módulo nuevo en Apache 2.0. Este módulo implementa + la especificación del HTTP Distributed Authoring and + Versioning (DAV) para colgar y mantener contenidos web.
    + +
    mod_deflate
    + +
    Módulo nuevo en Apache 2.0. Este módulo permite + soportar nevagadores que requieren que el contenido sea + comprimido antes de ser servido, ahorrando ancho de banda.
    + +
    mod_auth_ldap
    + +
    Módulo nuevo en Apache 2.0.41. Este módulo permite + que se pueda usar una base de datos LDAP para almacenar las + credenciales en la autentificación básica HTTP. El + módulo de acompañamiento, mod_ldap + ofrece connection pooling y cache de resultados.
    + +
    mod_auth_digest
    + +
    Incluye soporte adicional para cache de sesiones entre + procesos usando memoria compartida.
    + +
    mod_charset_lite
    + +
    Módulo nuevo en Apache 2.0. Este módulo + experimental permite for traducción o recodificación + de sets de caracteres.
    + +
    mod_file_cache
    + +
    Módulo nuevo en Apache 2.0. Este módulo incluye la + funcionalidad que mod_mmap_static tenía en + Apache 1.3, e incorpora nuevas capacidades de cacheado.
    + +
    mod_headers
    + +
    Este módulo es mucho más flexible en Apache + 2.0. Ahora puede modificar las cabeceras de las peticiones + usadas por mod_proxy, y puede fijar + condicionalmente cabeceras de respuesta.
    + +
    mod_proxy
    + +
    El módulo proxy ha sido completamente reescrito para + aprovechar la nueva infraestructura de filtros y para + implementar de una manera más fiable un proxy que cumpla + con requerimientos de la especificación + HTTTP/1.1. Además, se han incorporado nuevas secciones de + configuración a la directiva <Proxy> que hacen mas fácil (e + internamente más rápido) el control de los sitios web + que usan proxys; las configuraciones de sobrecarga + <Directory "proxy:..."> no se soportan. El + módulo está ahora dividido en módulos + específicos para cada protocolo, incluidos + proxy_connect, proxy_ftp y + proxy_http.
    + +
    mod_negotiation
    + +
    La nueva directiva ForceLanguagePriority se puede usar para asegurarse + de que el cliente recibe siempre solo un documento, en lugar de + obtener una respuesta de tipo NOT ACCEPTABLE o MULTIPLE + CHOICES. Además, los algoritmos de negociación y + MultiView han sido modificados para ofrecer resultados más + consistentes y se ha incluido a nuevo tipo de correspondecia de + tipos (type map).
    + +
    mod_autoindex
    + +
    Ahora pueden configurarse listados de directorios + autoindexados para usar tablas HTML, darles formato de forma + más sencilla, y permitir control detallado del + ordenamiento, incluidos ordenamiento por versión, y + filtrado usando caracteres comodines de los listados de + directorios.
    + +
    mod_include
    + +
    Estas nuevas directivas permiten cambiar las etiquetas por + defecto de comienzo y final para elementos SSI y permiten que la + configuración de errores y el formato de la hora y la fecha + se hagan en el fichero de configuración pricipal en lugar + de en el documento SSI. Los resultados del análisis y la + agrupación de las expresiones tipo (ahora basadas en la + sintaxis de Perl 5) pueden ser devueltos usando las variables + $0 .. $9 del módulo + mod_include.
    + +
    mod_auth_dbm
    + +
    Ahora se soportan varias clases de bases de datos de tipo + DBM usando la directiva AuthDBMType.
    + +
    +
    +
    +

    Idiomas disponibles:  de  | + en  | + es  | + fr  | + ja  | + ko  | + ru  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/new_features_2_0.html.fr b/rubbos/app/httpd-2.0.64/docs/manual/new_features_2_0.html.fr new file mode 100644 index 00000000..71e7178e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/new_features_2_0.html.fr @@ -0,0 +1,124 @@ + + + + + + + + Nouvelles fonctionnalités d'Apache 2.0 + + + + +
    + [APACHE DOCUMENTATION] + +

    Apache HTTP Server Version 2.0

    +
    + + + + +

    Aperçu des nouvelles + fonctionnalités d'Apache 2.0

    + +

    Améliorations : Noyau | Module

    +
    + +

    Améliorations du noyau +  :

    + +
    +
    Threads sur Unix
    + +
    Sur les systèmes Unix, Apache peut + s'exécuter selon un modèle hybride + multi-processus et multi-threads, en employant les threads + selon la norme POSIX. Ceci devrait améliorer les + performances.
    + +
    Nouveau système de + construction
    + +
    Le système de construction a été + entièrement réécrit et repose sur + autoconf et libtool. Cela rend le système de + configuration plus semblable aux autres paquetages.
    + +
    Support multiprotocole
    + +
    Apache possède maintenant une infrastructure afin + de servir de multiples protocoles. mod_echo a + été écrit comme exemple de ces nouvelles + fonctions.
    + +
    Meilleur support des plates-formes autres + qu'Unix
    + +
    Apache 2.0 est plus rapide et plus stable sur les + plates-formes non Unix telles que BeOS, OS/2, et Windows. + Avec l'introduction des modules multi + traitements (MPMs) spécifiques aux plates-formes + et l'exécuteur portable Apache (APR), le code pour ces + plates-formes est réalisé en employant leurs + API natives, permettant ainsi d'éviter les couches + d'émulation POSIX souvent boguées et peu + performantes.
    + +
    Nouvelle API Apache
    + +
    L'API pour les modules de la version 2.0 a changé + de manière importante. Beaucoup de problèmes + d'ordonnancement des modules existants dans la version 1.3 + devraient disparaître. La version 2.0 gère ceci + de manière automatique, et l'ordonnancement des + modules s'effectue selon une fonction d'accrochage afin de + permettre une plus grande flexibilité.
    +
    +
    + +

    Améliorations + concernant les modules :

    + +
    +
    mod_auth_digest
    + +
    Il inclut une nouvelle gestion des sessions en utilisant + un cache commun aux processus grâce à une + mémoire partagée.
    + +
    mod_charset_lite
    + +
    Nouveau module dans Apache 2.0. Ce module + expérimental permet la traduction des pages de + caractères ou leur recodage.
    + +
    mod_dav
    + +
    Nouveau module dans Apache 2.0. Ce module met en œuvre + la spécification "HTTP Distributed Authoring and + Versioning (DAV)" permettant de distribuer et maintenir le + contenu d'un site web.
    + +
    mod_file_cache
    + +
    Nouveau module dans Apache 2.0. Ce module inclut les + fonctionnalités du module mod_mmap_static existant + dans la version d'Apache 1.3, en ajoutant davantage de + possibilités de cache.
    +
    +
    + +

    Apache HTTP Server Version 2.0

    + Index + + + + + + diff --git a/rubbos/app/httpd-2.0.64/docs/manual/new_features_2_0.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/new_features_2_0.html.ja.utf8 new file mode 100644 index 00000000..49355a9b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/new_features_2_0.html.ja.utf8 @@ -0,0 +1,255 @@ + + + +Apache 2.0 の新機能の概要 - Apache HTTP サーバ + + + + + +
    <-
    +

    Apache 2.0 の新機能の概要

    +
    +

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

    +
    + +

    この文書では、Apache HTTP サーババージョン 1.3 と 2.0 + の主な違いについて記述しています。

    +
    + +
    top
    +
    +

    コア機能の拡張

    + + +
    +
    Unix のスレッド
    + +
    POSIX スレッドをサポートしている Unix システム上では、 + Apache はマルチプロセス、マルチスレッドのハイブリッドモードで + 実行できるようになりました。これにより + 多くの設定においてスケーラビリティが向上します。
    + +
    新しいビルドシステム
    + +
    ビルドシステムは autoconf と libtool + に基づいたものになるように、 + 新しく書き直されました。これにより、Apache の configure のシステムは + 他のパッケージと似たものになりました。
    + +
    マルチプロトコルサポート
    + +
    Apache に複数のプロトコルを扱うための機構が備わりました。 + 例として mod_echo が書かれています。
    + +
    Unix 以外のプラットフォームのサポートの改善
    + +
    Apache 2.0 は BeOS、OS/2、Windows などの Unix 以外の + プラットフォームで、より速く、より安定して動作するようになりました。 + プラットフォーム特有の マルチプロセッシングモジュール (MPM) と + Apache Portable Runtime (APR) の導入により、 + ネイティヴの API で実装されるようになり、 + バグが多く、性能の悪いことが多い POSIX エミュレーションレイヤの使用を + 回避することができました。
    + +
    新しい Apache API
    + +
    2.0 ではモジュールの API が大きく変わりました。 + 1.3 にあったモジュールの順番/優先度の問題の多くは + なくなっているはずです。2.0 は優先度の選択をほとんどを自動的に行ない、 + モジュールの順番はより柔軟性を高めるためにフック毎に行なわれるように + なりました。また、コア Apache サーバにパッチをあてることなく + 追加のモジュール機能を提供することができるように新しい関数が + 追加されました。
    + +
    IPv6 サポート
    + +
    Apache が使用している Apache Portable Runtime library が + IPv6 をサポートしているシステムでは Apache は デフォルトで + IPv6 のソケットを listen します。さらに、 + Listen, + NameVirtualHost, + VirtualHost + の各ディレクティブが IPv6 のアドレスを + サポートするようになりました (例えば、 + "Listen [2001:db8::1]:8080")。
    + +
    フィルタ
    + +
    Apache のモジュールはサーバから送られてきたり、サーバへ + 送るストリームに対して動作するフィルタとして書くことができるように + なりました。これにより、例えば CGI スクリプトの出力を + mod_include の INCLUDES フィルタを使って + Server Side Include のディレクティブを解析する、 + というようなことが可能になりました。mod_ext_filter + で外部プログラムをフィルタとして動作させることができます。 + これは CGI プログラムをハンドラとして動作させるのと + よく似た方法でできます。
    + +
    多言語エラー応答
    + +
    ブラウザへのエラー応答のメッセージが、SSI の文書を使って + 複数の言語で提供されるようになりました。見ための一貫性を保つために + 管理者がカスタマイズすることもできます。
    + +
    設定の簡素化
    + +
    多くの混乱を招きがちなディレクティブが簡素化されました。 + よく混乱を引き起こしていた Port ディレクティブと + Bind ディレクティブは + なくなりました。Listen + ディレクティブのみが IP アドレスのバインドに使われます。 + ServerName ディレクティブでは + リダイレクトと vhost の認識のためだけにサーバの名前とポート番号を + 指定します。
    + +
    Windows NT のネイティヴ Unicode サポート
    + +
    Windows NT 上の Apache 2.0 はファイル名の文字エンコード全てに + utf-8 を使うようになりました。これらは Unicode ファイルシステムに + 直接変換されるので、Windows 2000 と Windows XP を含む、全ての + Windows NT 系で多言語サポートが提供されます。 + このサポートは、ファイルシステムのアクセス時にローカルの + コードページを使う Windows 95, 98, ME には適用されません。
    + +
    正規表現ライブラリのアップデート
    + +
    Apache 2.0 は Perl + 互換正規表現ライブラリ (PCRE) を含んでいます。 + 正規表現の評価には、より強力になった Perl 5 + 構文を使用します。
    + +
    +
    top
    +
    +

    モジュールの拡張

    + + +
    +
    mod_ssl
    + +
    Apache 2.0 の新モジュール。このモジュールは OpenSSL が + 提供する SSL/TLS 暗号プロトコルへのインタフェースです。
    + +
    mod_dav
    + +
    Apache 2.0 の新モジュール。このモジュールはウェブコンテンツを + 送り、維持するための規格 + HTTP Distributed Authoring and Versioning (DAV) を実装しています。
    + +
    mod_deflate
    + +
    Apache 2.0 の新モジュール。送信前に送信内容を圧縮して + ネットワーク帯域を節約する、というリクエストをブラウザが + 要求できるようにします。
    + +
    mod_auth_ldap
    + +
    Apache 2.0.41 の新モジュール。HTTP 基本認証の証明書を保存するのに、 + LDAP データベースを使用できるようになります。 + 関連モジュールの mod_ldap で、 + コネクションのプール機能と結果のキャッシュ機能が提供されます。
    + +
    mod_auth_digest
    + +
    このモジュールは共有メモリを使うことにより、プロセスをまたいだ + セッションのキャッシュをサポートするようになりました。
    + +
    mod_charset_lite
    + +
    Apache 2.0 の新モジュール。この実験的なモジュールは + キャラクタセットの変換や再符号化を可能にします。
    + +
    mod_file_cache
    + +
    Apache 2.0 の新モジュール。このモジュールには、 + Apache 1.3 における mod_mmap_static 機能が含まれ、 + また、追加のキャッシュ機能が加わっています。
    + +
    mod_headers
    + +
    このモジュールは Apache 2.0 で非常に柔軟性が + 高くなりました。mod_proxy + で使われるリクエストのヘッダを変更できるようになりましたし、 + 応答ヘッダを条件に応じて設定できるようになりました。
    + +
    mod_proxy
    + +
    proxy モジュールは新しいフィルタの機構を利用するためと、 + より信頼できる、HTTP/1.1 に準拠した proxy を実装するために + 完全に書き直されました。さらに、新しい + <Proxy> + 設定セクションがproxy されるサイトのより読みやすく (内部的にもより速い) + 設定を提供します。オーバーロードされた + <Directory "proxy:... > + 設定はサポートされていません。このモジュールは proxy_connect, + proxy_ftp, proxy_http + といった、特定のプロトコルをサポートする + モジュールに分割されるようになりました。
    + +
    mod_negotiation
    + +
    クライアントが NOT ACCEPTABLE や MULTIPLE CHOICES 応答の + 代わりに常に単独の文書を受けとるようにするために、新しいディレクティブ + ForceLanguagePriority + を使うことができるようになりました。 + さらに、より一貫性のある結果を提供するために + ネゴシエーションと MultiViews のアルゴリズムが改善され、 + 文書の内容を含めることのできる、新しい形式のタイプマップが + 提供されるようになりました。
    + +
    mod_autoindex
    + +
    Autoindex されるディレクトリの内容一覧が、 + きれいに表示されるために HTML のテーブルを使うように + 設定できるようになりました。また、バージョンによるソーティングなど、 + より細かいソーティングの制御ができるようになり、ディレクトリ + の内容一覧をワイルドカードにより選別することができるようにもなりました。
    + +
    mod_include
    + +
    新しいディレクティブにより、SSI のデフォルトの開始タグと終了タグを + 変更できるようになりました。また、エラーと時刻の形式の設定が SSI の + 文書中ではなく、主設定ファイル中で行なえるようになりました。 + 正規表現の解析とグループ化の結果 (Perl の正規表現の構文に + 基づいたものになりました) を mod_include + の変数 $0 .. $9 により取得できるようになりました。
    + +
    mod_auth_dbm
    + +
    AuthDBMType + ディレクティブにより、複数の DBM 型のデータベースをサポートする + ようになりました。
    + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/new_features_2_0.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/new_features_2_0.html.ko.euc-kr new file mode 100644 index 00000000..208c557d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/new_features_2_0.html.ko.euc-kr @@ -0,0 +1,235 @@ + + + +Apache 2.0ÀÇ »õ·Î¿î ±â´É °³¿ä - Apache HTTP Server + + + + + +
    <-
    +

    Apache 2.0ÀÇ »õ·Î¿î ±â´É °³¿ä

    +
    +

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

    +
    + +

    ÀÌ ¹®¼­´Â ¾ÆÆÄÄ¡ À¥¼­¹ö 1.3 ¹öÀü°ú 2.0¹öÀü°£ÀÇ ÁÖµÈ Â÷ÀÌÁ¡À» + ¼³¸íÇÑ´Ù.

    +
    + +
    top
    +
    +

    ÇÙ½É ºÎºÐ¿¡¼­ ³ª¾ÆÁø Á¡

    + + +
    +
    À¯´Ð½º ¾²·¹µå
    + +
    POSIX ¾²·¹µå¸¦ Áö¿øÇÏ´Â À¯´Ð½º ½Ã½ºÅÛ¿¡¼­ ¾ÆÆÄÄ¡¸¦ + ¿©·¯ ÇÁ·Î¼¼½º¿Í ¿©·¯ ¾²·¹µå·Î È¥ÇÕÇؼ­ ½ÇÇàÇÒ ¼ö ÀÖ´Ù. + ÀüºÎ´Â ¾Æ´ÏÁö¸¸ ¸¹Àº °æ¿ì È®Àå°¡´É¼º(scalability)À» ³ôÀδÙ.
    + +
    »õ·Î¿î ÄÄÆÄÀÏ ½Ã½ºÅÛ
    + +
    ÄÄÆÄÀÏ ½Ã½ºÅÛÀÌ autoconf¿Í libtoolÀ» + »ç¿ëÇϵµ·Ï ÀçÀÛ¼ºµÇ¾ú´Ù. ±×·¡¼­ ¾ÆÆÄÄ¡ ±¸¼º ½Ã½ºÅÛÀÌ ´Ù¸¥ + ÆÐÅ°Áöµé°ú Á»´õ ºñ½ÁÇØÁ³´Ù.
    + +
    ¿©·¯ ÇÁ·ÎÅäÄÝ Áö¿ø
    + +
    ÀÌÁ¦ ¾ÆÆÄÄ¡´Â ¿©·¯ ÇÁ·ÎÅäÄÝÀ» ¼­ºñ½ºÇÒ ¼ö ÀÖ´Â ±¸Á¶¸¦ + °®Ãè´Ù. mod_echo°¡ ±× ¿¹·Î ÀÛ¼ºµÇ¾ú´Ù.
    + +
    ºñÀ¯´Ð½º Ç÷¡Æû¿¡ ´ëÇÑ ´õ ³ªÀº Áö¿ø
    + +
    Apache 2.0´Â BeOS, OS/2, À©µµ¿ìÁî¿Í °°Àº ºñÀ¯´Ð½º + Ç÷¡Æû¿¡¼­ ´õ ºü¸£°í ¾ÈÁ¤È­µÇ¾ú´Ù. ÀÌÁ¦ ¾ÆÆÄÄ¡´Â À̵é + Ç÷¡Æû¿¡¼­ ¹ö±×°¡ ¸¹°í ¼º´ÉÀÌ ´À·È´ø POSIX ȣȯÃþ ´ë½Å + ÀÚü API·Î ±¸ÇöµÈ Ç÷¡Æû ƯÀ¯ÀÇ ´ÙÁßó¸® ¸ðµâ + (MPM)°ú Apache Portable Runtime (APR)À» »ç¿ëÇÏ¿© ±¸ÇöµÈ´Ù.
    + +
    »õ·Î¿î ¾ÆÆÄÄ¡ API
    + +
    ¸ðµâ API°¡ 2.0¿¡¼­ »ó´çÈ÷ º¯Çß´Ù. 1.3ÀÇ ¿©·¯ ¸ðµâ + ¼ø¼­¿Í ¿ì¼±¼øÀ§ ¹®Á¦°¡ »ç¶óÁ³´Ù. 2.0Àº À̸¦ ´ëºÎºÐ ÀÚµ¿À¸·Î + ó¸®Çϸç, ¸ðµâ ¼ø¼­´Â ÀÌÁ¦ ´õ À¯¿¬ÇÑ ÈÅ(hook) ´ÜÀ§·Î ÁöÁ¤ÇÑ´Ù. + ¶Ç, ¾ÆÆÄÄ¡ ¼­¹ö ÇÙ½É ºÎºÐÀ» ¼öÁ¤ÇÏÁö ¾Ê°í »õ·Î¿î ¸ðµâ ±â´ÉÀ» + Á¦°øÇÏ´Â ÇÔ¼ö°¡ Ãß°¡µÇ¾ú´Ù.
    + +
    IPv6 Áö¿ø
    + +
    ÇÏÀ§ Apache Portable Runtine ¶óÀ̺귯¸®°¡ IPv6¸¦ Áö¿øÇÏ´Â + ½Ã½ºÅÛ¿¡¼­ ¾ÆÆÄÄ¡´Â ±âº»ÀûÀ¸·Î IPv6 ¼ÒÄÏÀ» ±â´Ù¸°´Ù. ¶Ç, + Listen, + NameVirtualHost, + VirtualHost Áö½Ã¾î°¡ + IPv6 ¼ýÀÚ ÁÖ¼Ò¸¦ Áö¿øÇÑ´Ù. (¿¹, + "Listen [2001:db8::1]:8080").
    + +
    ÇÊÅ͸µ
    + +
    ÀÌÁ¦ ¾ÆÆÄÄ¡ ¸ðµâÀ» ¼­¹ö·Î ¿À°í°¡´Â È帧¿¡ ´ëÇÑ + ÇÊÅÍ·Î »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î mod_includeÀÇ + INCLUDES ÇÊÅ͸¦ »ç¿ëÇÏ¿© CGI ½ºÅ©¸³Æ® Ãâ·Â¿¡¼­ + Server Side Include Áö½Ã¾î¸¦ ó¸®ÇÒ ¼ö ÀÖ´Ù. + mod_ext_filter ¸ðµâÀº CGI ÇÁ·Î±×·¥À» + Çڵ鷯·Î »ç¿ëÇÏ´Â °Í°ú °°ÀÌ ¿ÜºÎ ÇÁ·Î±×·¥À» ÇÊÅÍ·Î + »ç¿ëÇÒ ¼ö ÀÖ°Ô ÇÑ´Ù.
    + +
    ´Ù±¹¾î ¿À·ù ÀÀ´ä
    + +
    ºê¶ó¿ìÀú·Î º¸³»´Â ¿À·ù ÀÀ´ä¹®ÀÌ ÀÌÁ¦ SSI ¹®¼­¸¦ + »ç¿ëÇÏ¿© ´Ù±¹¾î·Î Á¦°øµÈ´Ù. °ü¸®ÀÚ´Â ÅëÀÏµÈ ¿Ü°üÀ» À§ÇØ + ÀÌ ¹®¼­¸¦ ¼öÁ¤ÇÒ ¼ö ÀÖ´Ù.
    + +
    °£´ÜÇØÁø ¼³Á¤
    + +
    È¥¶õÀ» ÁÖ´ø ¸¹Àº Áö½Ã¾îµéÀÌ °£´ÜÇØÁ³´Ù. ÀÚÁÖ È¥¶õÀ» + ÁÖ´ø Port¿Í BindAddress Áö½Ã¾î´Â + ¾ø¾îÁö°í IP ÁÖ¼Ò ¿¬°á¿¡ + Listen Áö½Ã¾î¸¸À» + »ç¿ëÇÑ´Ù. ServerName + Áö½Ã¾î´Â ¸®´ÙÀÌ·º¼Ç°ú °¡»óÈ£½ºÆ® ÀνĿ¡¸¸ »ç¿ëµÉ ¼­¹ö¸í°ú + Æ÷Æ®¸¦ ÁöÁ¤ÇÑ´Ù.
    + +
    Windows NT À¯´ÏÄÚµå ÀÚü Áö¿ø
    + +
    Windows NT¿¡¼­ Apache 2.0Àº ÀÌÁ¦ ¸ðµç ÆÄÀϸí ÀÎÄÚµù¿¡ + utf-8À» »ç¿ëÇÑ´Ù. ÆÄÀϸíÀº ÇÏÀ§ À¯´ÏÄÚµå ÆÄÀϽýºÅÛÀ¸·Î Á÷Á¢ + º¯¿ªµÇ¾î, Windows 2000°ú Windows XP¸¦ Æ÷ÇÔÇÑ ¸ðµç Windows NT±â¹Ý + ½Ã½ºÅÛ¿¡ ´Ù±¹¾î Áö¿øÀ» Á¦°øÇÑ´Ù. ÀÌ ±â´ÉÀº Windows 95, + 98, ME¿¡´Â Áö¿øµÇÁö¾Ê°í, ÆÄÀϽýºÅÛ Á¢±Ù¿¡ Àü°ú °°ÀÌ ½Ã½ºÅÛÀÇ + Áö¿ª ÄÚµåÆäÀÌÁö¸¦ »ç¿ëÇÑ´Ù.
    + +
    Á¤±ÔÇ¥Çö½Ä ¶óÀ̺귯¸® Updated
    + +
    Apache 2.0Àº Perlȣȯ + Á¤±ÔÇ¥Çö½Ä ¶óÀ̺귯¸® (Perl Compatible Regular Expression + Library) (PCRE)¸¦ Æ÷ÇÔÇÑ´Ù. ÀÌÁ¦ ¸ðµç Á¤±ÔÇ¥Çö½Ä¿¡ + ´õ °­·ÂÇÑ Perl 5 ¹®¹ýÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù.
    + +
    +
    top
    +
    +

    ¸ðµâ¿¡¼­ ³ª¾ÆÁø Á¡

    + + +
    +
    mod_ssl
    + +
    Apache 2.0¿¡¼­ »õ·Î Ãß°¡µÇ¾ú´Ù. ÀÌ ¸ðµâÀº OpenSSLÀÌ + Á¦°øÇÏ´Â SSL/TLS ¾Ïȣȭ ÇÁ·ÎÅäÄÝÀÇ ÀÎÅ×ÆäÀ̽º´Ù.
    + +
    mod_dav
    + +
    Apache 2.0¿¡¼­ »õ·Î Ãß°¡µÇ¾ú´Ù. ÀÌ ¸ðµâÀº À¥ÄÁÅÙÃ÷¸¦ + ¿Ã¸®°í °ü¸®ÇϱâÀ§ÇÑ HTTP Distributed Authoring and Versioning + (DAV) Ç¥ÁØÀ» ±¸ÇöÇÑ´Ù.
    + +
    mod_deflate
    + +
    Apache 2.0¿¡¼­ »õ·Î Ãß°¡µÇ¾ú´Ù. ³×Æ®¿÷ »ç¿ë·®À» + ÁÙÀ̱âÀ§ÇØ ºê¶ó¿ìÀú¿¡°Ô ÄÁÅÙÃ÷¸¦ ¾ÐÃàÇؼ­ º¸³»¶ó°í ¿äûÇÒ + ¼ö ÀÖ´Ù.
    + +
    mod_auth_ldap
    + +
    Apache 2.0.41¿¡¼­ »õ·Î Ãß°¡µÇ¾ú´Ù. ÀÌ ¸ðµâÀº HTTP + Basic Authentication¿¡ »ç¿ëÇÏ´Â Á¤º¸¸¦ LDAP µ¥ÀÌÅͺ£À̽º¿¡ + ÀúÀåÇÑ´Ù. °ü·ÃµÈ mod_ldap ¸ðµâÀº + ¿¬°áÇ®(connection pool)À» Á¦°øÇÏ°í, °á°ú¸¦ ij½ÌÇÑ´Ù.
    + +
    mod_auth_digest
    + +
    °øÀ¯¸Þ¸ð¸®¸¦ »ç¿ëÇÏ¿© ÇÁ·Î¼¼½º°£ ¼¼¼Ç ij½ÌÀ» Áö¿øÇÑ´Ù.
    + +
    mod_charset_lite
    + +
    Apache 2.0¿¡¼­ »õ·Î Ãß°¡µÇ¾ú´Ù. ÀÌ ½ÇÇèÀûÀÎ ¸ðµâÀº + ¹®ÀÚÁýÇÕ º¯È¯°ú ¹®ÀÚÁýÇÕ ÀçÀÛ¼º ±â´ÉÀ» Á¦°øÇÑ´Ù.
    + +
    mod_file_cache
    + +
    Apache 2.0¿¡¼­ »õ·Î Ãß°¡µÇ¾ú´Ù. ÀÌ ¸ðµâÀº Apache 1.3ÀÇ + mod_mmap_static ±â´É¿¡ ´õ ³ªÀº ij½¬ ±â´ÉÀ» + Ãß°¡Çß´Ù.
    + +
    mod_headers
    + +
    ÀÌ ¸ðµâÀº Apache 2.0¿¡¼­ ´õ À¯¿¬ÇØÁ³´Ù. ÀÌÁ¦ + mod_proxy°¡ »ç¿ëÇÏ´Â ¿äû Çì´õ¸¦ ¼öÁ¤ÇÒ + ¼ö ÀÖ°í, °æ¿ì¿¡ µû¶ó¼­ ÀÀ´ä Çì´õ¸¦ ¼³Á¤ÇÒ ¼öµµ ÀÖ´Ù.
    + +
    mod_proxy
    + +
    ÀÌ ÇÁ·Ï½Ã ¸ðµâÀº »õ·Î¿î ÇÊÅÍ ±¸Á¶¸¦ ÀÌ¿ëÇÏ°í ´õ ¹ÏÀ»¸¸ÇÑ + HTTP/1.1 ÇÁ·Ï½Ã¸¦ ±¸ÇöÇϱâÀ§ÇØ ¿ÏÀüÈ÷ ÀçÀÛ¼ºµÇ¾ú´Ù. Ãß°¡·Î + »õ·Î¿î <Proxy> + ¼³Á¤ ¼½¼ÇÀº ÇÁ·Ï½Ã ¼³Á¤À» ´õ ½±°Ô (±×¸®°í ³»ºÎÀûÀ¸·Î ´õ + ºü¸£°Ô) ¸¸µç´Ù. °ú°Å <Directory "proxy:..."> + ¼³Á¤Àº ÀÌÁ¦ Áö¿øÇÏÁö ¾Ê´Â´Ù. ¸ðµâÀº proxy_connect, + proxy_ftp, proxy_http¿Í °°ÀÌ + Áö¿øÇÏ´Â ÇÁ·ÎÅäÄÝ º°·Î ³ª´²Á³´Ù.
    + +
    mod_negotiation
    + +
    »õ·Î¿î ForceLanguagePriority + Áö½Ã¾î´Â Ŭ¶óÀ̾ðÆ®°¡ NOT ACCEPTABLEÀ̳ª MULTIPLE CHOICES + ÀÀ´ä ´ë½Å ¸ðµç °æ¿ì ÇÑ ¹®¼­¸¦ ¹ÞÀ½À» º¸ÀåÇÑ´Ù. Ãß°¡·Î + Çù»ó ¾Ë°í¸®Áò°ú MultiViews ¾Ë°í¸®ÁòÀÌ ´õ ÀÏ°üµÈ °á°ú¸¦ + ³»µµ·Ï ¼öÁ¤µÇ¾ú°í, ¹®¼­ ³»¿ëÀ» Æ÷ÇÔÇÒ ¼ö ÀÖ´Â »õ·Î¿î Çü½ÄÀÇ + type mapÀÌ Ãß°¡µÇ¾ú´Ù.
    + +
    mod_autoindex
    + +
    ÀÚµ¿À¸·Î »ý¼ºµÈ µð·ºÅ丮 ¸ñ·ÏÀÌ ÀÌÁ¦ ´õ ±ò²ûÇÑ Çü½ÄÀ» + À§ÇØ HTML Ç¥¸¦ »ç¿ëÇÒ ¼ö ÀÖ°Ô µÇ¾ú°í, ¹öÀü Á¤·ÄÀ» Æ÷ÇÔÇÏ¿© + Á¤·Ä¼ø¼­¸¦ ÀÚ¼¼È÷ Á¶ÀýÇÒ ¼ö ÀÖÀ¸¸ç, µð·ºÅ丮 ¸ñ·ÏÀ» ¿ÍÀϵåÄ«µå·Î + °É·¯³¾ ¼ö ÀÖ´Ù.
    + +
    mod_include
    + +
    »õ·Î¿î Áö½Ã¾î¸¦ »ç¿ëÇÏ¿© SSI ¿ä¼ÒÀÇ ±âº» ½ÃÀÛ ÅÂ±×¿Í + ¸¶Ä§ ű׸¦ º¯°æÇÒ ¼ö ÀÖ°í, ¿À·ù¿Í ½Ã°£Çü½ÄÀ» SSI ¹®¼­¿Ü¿¡ + ÁÖ ¼³Á¤ÆÄÀÏ¿¡¼­µµ ¼³Á¤ÇÒ ¼ö ÀÖ°Ô µÇ¾ú´Ù. mod_include¿¡¼­ (ÀÌÁ¦ + Perl Á¤±ÔÇ¥Çö½Ä ¹®¹ýÀ¸·Î) Á¤±ÔÇ¥Çö½Ä ÆĽ̰ú ±×·ìÀÇ + °á°ú¸¦ mod_includeÀÇ $0 + ... $9 º¯¼ö·Î ¾òÀ» ¼ö ÀÖ´Ù.
    + +
    mod_auth_dbm
    + +
    ÀÌÁ¦ AuthDBMType + Áö½Ã¾î¸¦ »ç¿ëÇÏ¿© ¿©·¯ DBM·ù µ¥ÀÌÅͺ£À̽º¸¦ Áö¿øÇÑ´Ù.
    + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/new_features_2_0.html.ru.koi8-r b/rubbos/app/httpd-2.0.64/docs/manual/new_features_2_0.html.ru.koi8-r new file mode 100644 index 00000000..b6b743d3 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/new_features_2_0.html.ru.koi8-r @@ -0,0 +1,252 @@ + + + +ïÂÚÏÒ ÎÏ×ÙÈ ×ÏÚÍÏÖÎÏÓÔÅÊ × Apache 2.0 - HTTP ÓÅÒ×ÅÒ Apache + + + + + +
    <-
    +

    ïÂÚÏÒ ÎÏ×ÙÈ ×ÏÚÍÏÖÎÏÓÔÅÊ × Apache 2.0

    +
    +

    äÏÓÔÕÐÎÙÅ ÑÚÙËÉ:  de  | + en  | + es  | + fr  | + ja  | + ko  | + ru  | + tr 

    +
    + +

    üÔÏÔ ÄÏËÕÍÅÎÔ ÏÐÉÓÙ×ÁÅÔ ÏÓÎÏ×ÎÙÅ ÒÁÚÌÉÞÉÑ ÍÅÖÄÕ ×ÅÒÓÉÑÍÉ 1.3 É 2.0 HTTP ÓÅÒ×ÅÒÁ Apache

    +
    + +
    top
    +
    +

    õÌÕÞÛÅÎÉÑ × ÑÄÒÅ ÓÅÒ×ÅÒÁ

    + + +
    +
    íÎÏÇÏÐÏÔÏÞÎÏÓÔØ × UNIX
    + +
    îÁ UNIX ÓÉÓÔÅÍÁÈ, ËÏÔÏÒÙÅ ÐÏÄÄÅÒÖÉ×ÁÀÔ ÐÏÔÏËÉ (ÎÉÔÉ) ÓÔÁÎÄÁÒÔÁ POSIX, + Apache ÔÅÐÅÒØ ÍÏÖÅÔ ×ÙÐÏÌÎÑÔØÓÑ × ÇÉÂÒÉÄÎÏÍ ÍÎÏÇÏÐÒÏÃÅÓÓÏ×Ï-ÍÎÏÇÏÐÏÔÏÞÎÏÍ ÒÅÖÉÍÅ. + üÔÏ ÓÐÏÓÏÂÓÔ×ÕÅÔ ÒÁÓÛÉÒÑÅÍÏÓÔÉ + ÓÉÓÔÅÍÙ ÄÌÑ ÍÎÏÇÉÈ, ÎÏ ÎÅ ÄÌÑ ×ÓÅÈ ËÏÎÆÉÇÕÒÁÃÉÊ.
    + +
    îÏ×ÁÑ ÓÉÓÔÅÍÁ ÓÂÏÒËÉ
    + +
    óÉÓÔÅÍÁ ÓÂÏÒËÉ ÂÙÌÁ ÐÏÌÎÏÓÔØÀ ÉÚÍÅÎÅÎÁ, É ÔÅÐÅÒØ ÏÓÎÏ×Ù×ÁÅÔÓÑ ÎÁ autoconf É libtool. + üÔÏ ÄÅÌÁÅÔ ÐÒÏÃÅÓÓ ËÏÎÆÉÇÕÒÉÒÏ×ÁÎÉÑ Apache ÂÏÌÅÅ ÐÏÈÏÖÉÍ ÎÁ ÁÎÁÌÏÇÉÞÎÙÊ ÐÒÏÃÅÓÓ × ÄÒÕÇÉÈ ÐÒÏÇÒÁÍÍÎÙÈ + ÐÒÏÄÕËÔÁÈ.
    + +
    ðÏÄÄÅÒÖËÁ ÒÁÚÌÉÞÎÙÈ ÐÒÏÔÏËÏÌÏ×
    + +
    Apache ÔÅÐÅÒØ ÉÍÅÅÔ ÓÐÅÃÉÁÌØÎÕÀ ÉÎÆÒÁÓÔÒÕËÔÕÒÕ, + ÓÐÏÓÏÂÎÕÀ ÏÂÓÌÕÖÉ×ÁÔØ ÒÁÚÌÉÞÎÙÅ ÐÒÏÔÏËÏÌÙ. + íÏÄÕÌØ mod_echo ÂÙÌ ÎÁÐÉÓÁÎ × ËÁÞÅÓÔ×Å + ÐÒÉÍÅÒÁ ÜÔÏÍÕ.
    + +
    õÌÕÞÛÅÎÎÁÑ ÐÏÄÄÅÒÖËÁ ÏÔÌÉÞÎÙÈ ÏÔ UNIX + ÐÌÁÔÆÏÒÍ
    + +
    Apache 2.0 ÓÔÁÌ ÒÁÂÏÔÁÔØ ÂÙÓÔÒÅÅ É ÎÁÄÅÖÎÅÅ + ÎÁ ÏÔÌÉÞÎÙÈ ÏÔ UNIX ÐÌÁÔÆÏÒÍÁÈ, ÔÁËÉÈ ËÁË: BeOS, + OS/2 É Windows. ó ××ÅÄÅÎÉÅÍ ÎÏ×ÙÈ ÓÐÅÃÉÆÉÞÎÙÈ + ÄÌÑ ËÁÖÄÏÊ ÐÌÁÔÆÏÒÍÙ ÍÕÌØÔÉ-ÐÒÏÃÅÓÓÎÙÈ ÍÏÄÕÌÅÊ (MPMs) É + ÂÉÂÌÉÏÔÅËÉ Apache Portable Runtime (APR), ÜÔÉ ÐÌÁÔÆÏÒÍÙ + ÔÅÐÅÒØ ÐÏÄÄÅÒÖÉ×ÁÀÔÓÑ Ó ÐÏÍÏÝØÀ ÉÈ ÓÏÂÓÔ×ÅÎÎÙÈ API, ÞÔÏ + ÐÏÚ×ÏÌÑÅÔÓÑ ÉÚÂÅÖÁÔØ ××ÅÄÅÎÉÑ ÚÁÞÁÓÔÕÀ ÎÅÐÒÁ×ÉÌØÎÏ ÒÁÂÏÔÁÀÝÉÈ + ÉÚ-ÚÁ ÂÏÌØÛÏÇÏ ËÏÌÉÞÅÓÔ×Á ÏÛÉÂÏË POSIX - ÜÍÕÌÉÒÕÀÝÉÈ ÓÌÏÅ×.
    + +
    îÏ×ÙÊ API ÄÌÑ Apache
    + +
    API ÄÌÑ ÎÁÐÉÓÁÎÉÑ ÍÏÄÕÌÅÊ ÚÎÁÞÉÔÅÌØÎÏ ÉÚÍÅÎÉÌÓÑ × ×ÅÒÓÉÉ 2.0. + íÎÏÇÉÅ ÉÚ ÐÒÏÂÌÅÍ ×ÅÒÓÉÉ 1.3, Ó×ÑÚÁÎÎÙÅ Ó ÐÏÒÑÄËÏÍ ÓÌÅÄÏ×ÁÎÉÑ + ÍÏÄÕÌÅÊ É ÉÈ ÐÒÉÏÒÉÔÅÔÁÍÉ, ÄÏÌÖÎÙ ÉÓÞÅÚÎÕÔØ. ÷ ×ÅÒÓÉÉ 2.0 + ÂÏÌØÛÁÑ ÞÁÓÔØ ÄÁÎÎÏÊ ÒÁÂÏÔÙ ÔÅÐÅÒØ ÄÅÌÁÅÔÓÑ ÓÅÒ×ÅÒÏÍ Á×ÔÏÍÁÔÉÞÅÓËÉ, + Á ÐÏÒÑÄÏË ÓÌÅÄÏ×ÁÎÉÑ ÍÏÄÕÌÅÊ ÏÐÒÅÄÅÌÑÅÔÓÑ ÏÔÄÅÌØÎÏ × ËÁÖÄÏÍ + ÈÕËÅ (hook), ÞÔÏ ÄÅÌÁÅÔ ÐÒÏÃÅÓÓ ÂÏÌÅÅ ÇÉÂËÉÍ É ËÏÎÆÉÇÕÒÉÒÕÅÍÙÍ. + ôÁËÖÅ ÂÙÌÉ ÄÏÂÁ×ÌÅÎÙ ÎÏ×ÙÅ ÆÕÎËÃÉÉ, ËÏÔÏÒÙÅ + ÐÒÅÄÏÓÔÁ×ÌÑÀÔ ÄÏÐÏÌÎÉÔÅÌØÎÙÅ ×ÏÚÍÏÖÎÏÓÔÉ ÉÓÐÏÌØÚÏ×ÁÎÉÑ ÍÏÄÕÌÅÊ, + ÉÚÂÁ×ÌÑÑ ÏÔ ÎÅÏÂÈÏÄÉÍÏÓÔÉ ×ÎÅÓÅÎÉÑ ËÁËÉÈ-ÌÉÂÏ ÉÚÍÅÎÅÎÉÊ × ÑÄÒÏ + ÓÅÒ×ÅÒÁ.
    + +
    ðÏÄÄÅÒÖËÁ ÐÒÏÔÏËÏÌÁ IPv6
    + +
    ÷ ÓÉÓÔÅÍÁÈ, ÇÄÅ ÐÒÏÔÏËÏÌ IPv6 ÐÏÄÄÅÒÖÉ×ÁÅÔÓÑ + ÎÉÖÅÌÅÖÁÝÅÊ ÂÉÂÌÉÏÔÅËÏÊ Apache Portable Runtime, Apache + ÐÏ ÕÍÏÌÞÁÎÉÀ ÐÏÌÕÞÁÅÔ ×ÏÚÍÏÖÎÏÓÔØ ÓÌÕÛÁÔØ IPv6 ÓÏËÅÔÙ. + ÷ ÄÏÂÁ×ÏË Ë ÜÔÏÍÕ ÄÉÒÅËÔÉ×Ù Listen, NameVirtualHost É VirtualHost ÍÏÇÕÔ ÒÁÂÏÔÁÔØ Ó ÁÄÒÅÓÎÙÍÉ ÓÔÒÏËÁÍÉ, + ÚÁÄÁÎÎÙÍÉ × ÆÏÒÍÁÔÅ IPv6 (Ô.Å. ÎÁÐÒÉÍÅÒ "Listen [2001:db8::1]:8080").
    + +
    éÓÐÏÌØÚÏ×ÁÎÉÅ ÆÉÌØÔÒÏ×
    + +
    íÏÄÕÌÉ Apache ÔÅÐÅÒØ ÍÏÖÎÏ ÎÁÐÉÓÁÔØ ÔÁË, ÞÔÏ + ÏÎÉ ÂÕÄÕÔ ÉÓÐÏÌÎÑÔØ ÒÏÌØ ÆÉÌØÔÒÏ×, + ÏÂÒÁÂÁÔÙ×ÁÀÝÉÈ ÐÏÔÏËÉ ÄÁÎÎÙÈ, ËÏÔÏÒÙÅ ÐÒÉÈÏÄÑÔ ÉÌÉ ÕÈÏÄÑÔ + ÉÚ ÓÅÒ×ÅÒÁ. üÔÏ ÐÏÚ×ÏÌÑÅÔ, Ë ÐÒÉÍÅÒÕ, ÄÁÎÎÙÍ, Ñ×ÌÑÀÝÉÍÓÑ + ÒÅÚÕÌØÔÁÔÏÍ ÒÁÂÏÔÙ CGI-ÓËÒÉÐÔÁ, ÂÙÔØ ÏÂÒÁÂÏÔÁÎÎÙÍÉ SSI + ÆÉÌØÔÒÏÍ INCLUDES, ÐÒÅÄÏÓÔÁ×ÌÑÅÍÙÍ ÍÏÄÕÌÅÍ + mod_include. íÏÄÕÌØ mod_ext_filter + ÐÏÚ×ÏÌÑÅÔ ×ÎÅÛÎÉÍ ÐÒÏÇÒÁÍÍÁÍ ÉÓÐÏÌÎÑÔØ ÒÏÌØ ÆÉÌØÔÒÏ× ÔÏÞÎÏ ÔÁËÉÍ ÖÅ ÏÂÒÁÚÏÍ, + ËÁËÉÍ CGI ÐÒÏÇÒÁÍÍÙ ÄÅÊÓÔ×ÕÀÔ × ËÁÞÅÓÔ×Å ÏÂÒÁÂÏÔÞÉËÏ× (handlers).
    + +
    óÏÏÂÝÅÎÉÑ ÏÂ ÏÛÉÂËÁÈ ÎÁ ÒÁÚÎÙÈ ÑÚÙËÁÈ
    + +
    óÏÏÂÝÅÎÉÑ Ï ÏÛÉÂËÁÈ, ÐÏÓÙÌÁÅÍÙÅ ÂÒÁÕÚÅÒÕ, ÔÅÐÅÒØ + ÐÒÅÄÓÔÁ×ÌÅÎÙ ÎÁ ÎÅÓËÏÌØËÉÈ ÑÚÙËÁÈ É ÉÓÐÏÌØÚÕÀÔ SSI + ÔÅÈÎÏÌÏÇÉÀ. ïÎÉ ÍÏÇÕÔ ÂÙÔØ ÌÅÇËÏ ÏÔÒÅÄÁËÔÉÒÏ×ÁÎÙ + ÁÄÍÉÎÉÓÔÒÁÔÏÒÏÍ ÐÏÄ Ó×ÏÉ ÎÕÖÄÙ.
    + +
    õÐÒÏÝÅÎÎÁÑ ËÏÎÆÉÇÕÒÁÃÉÑ
    + +
    íÎÏÇÉÅ ÚÁÐÕÔÁÎÎÙÅ ÄÉÒÅËÔÉ×Ù ÂÙÌÉ ÕÐÒÏÝÅÎÙ. îÁÉÂÏÌÅÅ + ÓÂÉ×ÁÀÝÉÅ Ó ÔÏÌËÕ Port É BindAddress ÂÙÌÉ ÕÂÒÁÎÙ; + ÄÌÑ ÐÒÉ×ÑÚËÉ Ë IP ÁÄÒÅÓÕ ÉÓÐÏÌØÚÕÅÔÓÑ ÔÏÌØËÏ ÄÉÒÅËÔÉ×Á + Listen; ÄÉÒÅËÔÉ×Á + ServerName ÏÐÒÅÄÅÌÑÅÔ ÉÍÑ ÓÅÒ×ÅÒÁ É ÎÏÍÅÒ ÐÏÒÔÁ + ÔÅÐÅÒØ ÔÏÌØËÏ ÄÌÑ ÐÅÒÅÎÁÐÒÁ×ÌÅÎÉÊ É ÒÁÂÏÔÙ Ó ×ÉÒÔÕÁÌØÎÙÍÉ ÈÏÓÔÁÍÉ.
    + +
    ðÏÄÄÅÒÖËÁ ÀÎÉËÏÄÁ Windows NT
    + +
    Apache 2.0 ÎÁ Windows NT ÔÅÐÅÒØ ÉÓÐÏÌØÚÕÅÔ ËÏÄÉÒÏ×ËÕ utf-8 + ÄÌÑ ÒÁÂÏÔÙ Ó ÉÍÅÎÁÍÉ ÆÁÊÌÏ×. üÔÏ ÐÏÚ×ÏÌÑÅÔ ÉÓÐÏÌØÚÏ×ÁÔØ + ÎÉÖÅÌÅÖÁÝÕÀ ÆÁÊÌÏ×ÕÀ ÓÉÓÔÅÍÕ, ÒÁÂÏÔÁÀÝÕÀ × ÆÏÒÍÁÔÅ Unicode, + ÞÔÏ ÐÒÅÄÏÓÔÁ×ÌÑÅÔ ÐÏÄÄÅÒÖËÕ ÓÅÒ×ÅÒÏÍ ÍÎÏÇÏÑÚÙÞÎÏÓÔÉ ÄÌÑ ×ÓÅÈ NT- + ÓÉÓÔÅÍ, ×ËÌÀÞÁÑ Windows 2000 É Windows XP. + üÔÏ ÎÅ ÒÁÓÐÒÏÓÔÒÁÎÑÅÔÓÑ ÎÁ ÔÁËÉÅ ÏÐÅÒÁÃÉÏÎÎÙÅ ÓÉÓÔÅÍÙ, ËÁË + Windows 95, 98 ÉÌÉ ME, ËÏÔÏÒÙÅ ÄÌÑ ÏÂÒÁÝÅÎÉÑ Ë ÆÁÊÌÏ×ÏÊ ÓÉÓÔÅÍÅ + ÉÓÐÏÌØÚÕÀÔ ÌÏËÁÌØÎÙÅ ËÏÄÏ×ÙÅ ÓÔÒÁÎÉÃÙ.
    + +
    îÏ×ÁÑ ÂÉÂÌÉÏÔÅËÁ ÄÌÑ ÒÁÂÏÔÙ Ó ÒÅÇÕÌÑÒÎÙÍÉ ×ÙÒÁÖÅÎÉÑÍÉ
    + +
    ÷ ÓÏÓÔÁ× Apache 2.0 ÂÙÌÁ ×ËÌÀÞÅÎÁ + ÂÉÂÌÉÏÔÅËÁ ÄÌÑ ÒÁÂÏÔÙ Ó Perl-ÓÏ×ÍÅÓÔÉÍÙÍÉ ÒÅÇÕÌÑÒÎÙÍÉ ×ÙÒÁÖÅÎÑÍÉ (PCRE). + ÷ÓÅ ÒÅÇÕÌÑÒÎÙÅ ×ÙÒÁÖÅÎÉÑ ÔÅÐÅÒØ ÉÓÐÏÌØÚÕÀÔ ÂÏÌÅÅ ÍÏÝÎÙÊ ÓÉÎÔÁËÓÉÓ Perl 5.
    + +
    +
    top
    +
    +

    õÌÕÞÛÅÎÉÑ × ÍÏÄÕÌÑÈ ÓÅÒ×ÅÒÁ

    + + +
    +
    mod_ssl
    + +
    îÏ×ÙÊ ÍÏÄÕÌØ × Apache 2.0. üÔÏÔ ÍÏÄÕÌØ Ñ×ÌÑÅÔÓÑ ÉÎÔÅÒÆÅÊÓÏÍ + Ë ÐÒÏÔÏËÏÌÁÍ ÛÉÆÒÏ×ÁÎÉÑ SSL/TLS, ÐÒÅÄÏÓÔÁ×ÌÑÅÍÙÍÉ OpenSSL.
    + +
    mod_dav
    + +
    îÏ×ÙÊ ÍÏÄÕÌØ × Apache 2.0. üÔÏÔ ÍÏÄÕÌØ ×ÎÅÄÒÑÅÔ ÓÐÅÃÉÆÉËÁÃÉÀ + Distributed Authoring and Versioning (DAV), ÐÏÚ×ÏÌÑÀÝÕÀ ÕÐÒÁ×ÌÑÔØ + ÓÏÄÅÒÖÉÍÙÍ ÓÁÊÔÁ ÐÏÓÒÅÄÓÔ×ÏÍ ÒÁÓÛÉÒÅÎÎÏÇÏ ÐÒÏÔÏËÏÌÁ HTTP.
    + +
    mod_deflate
    + +
    îÏ×ÙÊ ÍÏÄÕÌØ × Apache 2.0. üÔÏÔ ÍÏÄÕÌØ ÐÏÚ×ÏÌÑÅÔ ÂÒÁÕÚÅÒÁÍ, ÐÏÄÄÅÒÖÉ×ÁÀÝÉÍ + ÄÁÎÎÕÀ ÔÅÈÎÏÌÏÇÉÀ, ÚÁÐÒÁÛÉ×ÁÔØ ÄÁÎÎÙÅ × ÓÖÁÔÏÍ ×ÉÄÅ, ÞÔÏ ÓÏËÒÁÝÁÅÔ ÎÁÇÒÕÚËÕ ÎÁ + ÓÅÔØ.
    + +
    mod_auth_ldap
    + +
    îÏ×ÙÊ ÍÏÄÕÌØ × Apache 2.0.41. üÔÏÔ ÍÏÄÕÌØ ÐÏÚ×ÏÌÑÅÔ ÉÓÐÏÌØÚÏ×ÁÔØ ÂÁÚÕ ÄÁÎÎÙÈ LDAP + ÄÌÑ ÈÒÁÎÅÎÉÑ ÉÍÅÎ É ÐÁÒÏÌÅÊ ÐÏÌØÚÏ×ÁÔÅÌÅÊ, ÎÅÏÂÈÏÄÉÍÙÈ ÐÒÉ ÁÕÔÅÎÔÉÆÉËÁÃÉÉ ÐÏ ÍÅÔÏÄÕ + Basic. óÏÐÕÔÓÔ×ÕÀÝÉÊ ÅÍÕ ÍÏÄÕÌØ mod_ldap ÏÂÅÓÐÅÞÉ×ÁÅÔ ×ÏÚÍÏÖÎÏÓÔØ + ÓÏÚÄÁÎÉÑ ÏÞÅÒÅÄÅÊ ÐÏÄËÌÀÞÅÎÉÊ (connection pools) É ËÜÛÉÒÏ×ÁÎÉÑ ÒÅÚÕÌØÔÁÔÏ×.
    + +
    mod_auth_digest
    + +
    ÷ËÌÀÞÁÅÔ ÄÏÐÏÌÎÉÔÅÌØÎÕÀ ÐÏÄÄÅÒÖËÕ ËÜÛÉÒÏ×ÁÎÉÑ ÓÅÓÓÉÊ + ÐÒÏÃÅÓÓÁÍÉ, ÂÌÁÇÏÄÁÒÑ ÉÓÐÏÌØÚÏ×ÁÎÉÀ ÏÂÝÅÊ ÏÂÌÁÓÔÉ ÐÁÍÑÔÉ (ÒÁÚÄÅÌÅÎÉÀ + ÐÁÍÑÔÉ).
    + +
    mod_charset_lite
    + +
    îÏ×ÙÊ ÍÏÄÕÌØ × Apache 2.0. üÔÏÔ ÜËÓÐÅÒÉÍÅÎÔÁÌØÎÙÊ ÍÏÄÕÌØ ÐÏÚ×ÏÌÑÅÔ + ÏÓÕÝÅÓÔ×ÌÑÔØ ÐÅÒÅ×ÏÄ ÉÚ ÏÄÎÏÇÏ ÎÁÂÏÒÁ ÓÉÍ×ÏÌÏ× (character set) × ÄÒÕÇÏÊ É ÉÚ ÏÄÎÏÊ + ËÏÄÉÒÏ×ËÉ × ÄÒÕÇÕÀ.
    + +
    mod_file_cache
    + +
    îÏ×ÙÊ ÍÏÄÕÌØ × Apache 2.0. üÔÏÔ ÍÏÄÕÌØ ×ËÌÀÞÁÅÔ × ÓÅÂÑ + ÆÕÎËÃÉÏÎÁÌØÎÏÓÔØ ÍÏÄÕÌÑ mod_mmap_static ÉÚ Apache 1.3 + ÐÌÀÓ ÎÏ×ÙÅ ×ÏÚÍÏÖÎÏÓÔÉ ËÜÛÉÒÏ×ÁÎÉÑ.
    + +
    mod_headers
    + +
    üÔÏÔ ÍÏÄÕÌØ ÓÔÁÌ ÂÏÌÅÅ ÇÉÂËÉÍ × Apache 2.0. ïÎ ÐÏÚ×ÏÌÑÅÔ + ÍÏÄÉÆÉÃÉÒÏ×ÁÔØ ÚÁÇÏÌÏ×ËÉ ÚÁÐÒÏÓÏ×, ÉÓÐÏÌØÚÕÅÍÙÈ ÍÏÄÕÌÅÍ + mod_proxy, É ÍÏÖÅÔ ×ËÌÀÞÁÔØ × ÏÔ×ÅÔ ÓÅÒ×ÅÒÁ ÚÁÇÏÌÏ×ËÉ × + ÚÁ×ÉÓÉÍÏÓÔÉ ÏÔ ÒÁÚÌÉÞÎÙÈ ÕÓÌÏ×ÉÊ.
    + +
    mod_proxy
    + +
    ðÒÏËÓÉ ÍÏÄÕÌØ ÂÙÌ ÐÏÌÎÏÓÔØÀ ÐÅÒÅÐÉÓÁÎ, É ÔÅÐÅÒØ ×ËÌÀÞÁÅÔ + × ÓÅÂÑ ÐÒÅÉÍÕÝÅÓÔ×Á ÎÏ×ÏÊ ÆÉÌØÔÒÏ×ÏÊ ÉÎÆÒÁÓÔÒÕËÔÕÒÙ É ÉÓÐÏÌØÚÕÅÔ + ÂÏÌÅÅ ÎÁÄÅÖÎÕÀ, ÓÏ×ÍÅÓÔÉÍÕÀ Ó HTTP/1.1 ÐÒÏËÓÉ-ÔÅÈÎÏÌÏÇÉÀ. ÷ ÄÏÂÁ×ÏË + Ë ÜÔÏÍÕ ÂÙÌÁ ××ÅÄÅÎÁ ÎÏ×ÁÑ ÓÅËÃÉÑ <Proxy>, ËÏÔÏÒÕÀ ÍÏÖÎÏ ÉÓÐÏÌØÚÏ×ÁÔØ × ËÏÎÆÉÇÕÒÁÃÉÏÎÎÙÈ ÆÁÊÌÁÈ, ÞÔÏ + ÏÂÅÓÐÅÞÉ×ÁÅÔ ÂÏÌÅÅ ÕÄÏÂÎÙÊ (É ÂÏÌÅÅ ÂÙÓÔÒÙÊ ÄÌÑ ÑÄÒÁ ÓÅÒ×ÅÒÁ) ËÏÎÔÒÏÌØ ÎÁÄ ÓÁÊÔÁÍÉ, + ÉÓÐÏÌØÚÕÀÝÉÍÉ proxy-ÔÅÈÎÏÌÏÇÉÀ. ðÅÒÅÇÒÕÖÅÎÎÁÑ ËÏÎÆÉÇÕÒÁÃÉÑ <Directory "proxy:..."> + ÂÏÌÅÅ ÎÅ ÐÏÄÄÅÒÖÉ×ÁÅÔÓÑ. íÏÄÕÌØ ÔÅÐÅÒØ ÒÁÚÄÅÌÅÎ ÎÁ ÏÔÄÅÌØÎÙÅ ÓÐÅÃÉÆÉÞÎÙÅ ÍÏÄÕÌÉ, + ÐÏÄÄÅÒÖÉ×ÁÀÝÉÅ ÒÁÚÌÉÞÎÙÅ ÐÒÏÔÏËÏÌÙ. üÔÉ ÍÏÄÕÌÉ ×ËÌÀÞÁÀÔ × ÓÅÂÑ proxy_connect, proxy_ftp + É proxy_http.
    + +
    mod_negotiation
    + +
    äÏÂÁ×ÌÅÎÁ ÎÏ×ÁÑ ÄÉÒÅËÔÉ×Á ForceLanguagePriority, ÄÌÑ ÔÏÇÏ ÞÔÏÂÙ ×ÍÅÓÔÏ ÏÔ×ÅÔÏ× ÓÅÒ×ÅÒÁ + NOT ACCEPTABLE ÉÌÉ MULTIPLE CHOICES ×ÓÅÇÄÁ ÐÒÅÄÏÓÔÁ×ÌÑÔØ ÐÏÌØÚÏ×ÁÔÅÌÀ + ÏÐÒÅÄÅÌÅÎÎÙÊ ÄÏËÕÍÅÎÔ. ÷ ÄÏÐÏÌÎÅÎÉÅ Ë ÜÔÏÍÕ ÁÌÇÏÒÉÔÍÙ + ÎÅÇÏÃÉÁÃÉÉ (negotiation) É MultiViews ÂÙÌÉ ×ÙÞÉÝÅÎÙ É ÉÓÐÒÁ×ÌÅÎÙ, ÄÌÑ + ÏÂÅÓÐÅÞÅÎÉÑ ÂÏÌÅÅ ÐÏÓÌÅÄÏ×ÁÔÅÌØÎÏÇÏ ÒÅÚÕÌØÔÁÔÁ, Á ÔÁËÖÅ ÐÏÑ×ÉÌÁÓØ ×ÏÚÍÏÖÎÏÓÔØ + ×ËÌÀÞÅÎÉÑ ÎÅÐÏÓÒÅÄÓÔ×ÅÎÎÏ ÓÏÄÅÒÖÉÍÏÇÏ ÄÏËÕÍÅÎÔÏ× × ËÁÒÔÕ ÔÉÐÏ× (type map).
    + +
    mod_autoindex
    + +
    ìÉÓÔÉÎÇÉ Á×ÔÏÉÎÄÅËÓÉÒÕÅÍÙÈ ËÁÔÁÌÏÇÏ× ÔÅÐÅÒØ ÍÏÇÕÔ ×ÙÄÁ×ÁÔØÓÑ × ×ÉÄÅ + HTML-ÔÁÂÌÉÃ. ðÏÑ×ÉÌÁÓØ ×ÏÚÍÏÖÎÏÓÔØ ÂÏÌÅÅ ÇÉÂËÏÊ ÓÏÒÔÉÒÏ×ËÉ, ×ËÌÀÞÁÑ ÓÏÒÔÉÒÏ×ËÕ ÐÏ ×ÅÒÓÉÑÍ É + ÓÏÒÔÉÒÏ×ËÕ Ó ÉÓÐÏÌØÚÏ×ÁÎÉÅÍ ÛÁÂÌÏÎÎÙÈ ÓÉÍ×ÏÌÏ× (wildcard).
    + +
    mod_include
    + +
    ÷×ÅÄÅÎÙ ÎÏ×ÙÅ ÄÉÒÅËÔÉ×Ù, ËÏÔÏÒÙÅ ÐÏÚ×ÏÌÑÀÔ ÉÚÍÅÎÉÔØ ÎÁÞÁÌØÎÙÊ É ËÏÎÅÞÎÙÊ + ÔÅÇÉ SSI ÜÌÅÍÅÎÔÏ×, ÚÁÄÁ×ÁÅÍÙÅ ÐÏ ÕÍÏÌÞÁÎÉÀ, Á ÔÁËÖÅ ÐÒÅÄÏÓÔÁ×ÌÑÀÔ ×ÏÚÍÏÖÎÏÓÔØ + ËÏÎÆÉÇÕÒÉÒÏ×ÁÎÉÑ ÆÏÒÍÁÔÁ ÓÏÏÂÝÅÎÉÊ Ï ÏÛÉÂËÁÈ É ×ÒÅÍÅÎÉ ÎÅÐÏÓÒÅÄÓÔ×ÅÎÎÏ + × ÇÌÁ×ÎÏÍ ËÏÎÆÉÇÕÒÁÃÉÏÎÎÏÍ ÆÁÊÌÅ, Á ÎÅ × SSI ÄÏËÕÍÅÎÔÅ. òÅÚÕÌØÔÁÔÙ + ÏÂÒÁÂÏÔËÉ ÒÅÇÕÌÑÒÎÙÈ ×ÙÒÁÖÅÎÉÊ (ÔÅÐÅÒØ ÏÓÎÏ×Ù×ÁÀÝÉÈÓÑ ÎÁ ÓÉÎÔÁËÓÉÓÅ + ÒÅÇÕÌÑÒÎÙÈ ×ÙÒÁÖÅÎÉÊ ÑÚÙËÁ Perl) ÍÏÇÕÔ ÂÙÔØ ÐÏÌÕÞÅÎÙ ÐÒÉ ÐÏÍÏÝÉ ÐÅÒÅÍÅÎÎÙÈ + $0 .. $9 ÍÏÄÕÌÑ mod_include.
    + +
    mod_auth_dbm
    + +
    ôÅÐÅÒØ ÐÏÄÄÅÒÖÉ×ÁÅÔ ÍÎÏÇÏÞÉÓÌÅÎÎÙÅ ÔÉÐÙ DBM-ÐÏÄÏÂÎÙÈ ÂÁÚ ÄÁÎÎÙÈ ÐÏÓÒÅÄÓÔ×ÏÍ + ÄÉÒÅËÔÉ×Ù AuthDBMType.
    + +
    +
    +
    +

    äÏÓÔÕÐÎÙÅ ÑÚÙËÉ:  de  | + en  | + es  | + fr  | + ja  | + ko  | + ru  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/new_features_2_0.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/new_features_2_0.html.tr.utf8 new file mode 100644 index 00000000..177421a0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/new_features_2_0.html.tr.utf8 @@ -0,0 +1,251 @@ + + + +Apache 2.0’da Yeni olan Özellikler - Apache HTTP Sunucusu + + + + + +
    <-
    +

    Apache 2.0’da Yeni olan Özellikler

    +
    +

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

    +
    + +

    Bu belgede Apache HTTP Sunucusunun 1.3 ve 2.0 sürümleri arasındaki + başlıca değişikliklerin bazılarına değinilmiştir.

    +
    + +
    top
    +
    +

    Çekirdekteki Gelişmeler

    + + +
    +
    Unix Evreleri
    + +
    POSIX evreleri desteği olan Unix sistemlerinde Apache, çok evreli + kipte çok süreçlilik şeklinde melez bir yapıda çalışır. Bu bir çok + bakımdan ölçeklenebilirliği arttırsa da bütün yapılandırmalarda + sağlanamaz.
    + +
    Yeni Paket Derleme Sistemi
    + +
    Yeni kaynak paketi derleme sistemi autoconf ve + libtool’a dayalı olarak sıfırdan, yeni baştan yazıldı. + Böylece Apache’nin paket yapılandırma sistemi diğer paketlerinkiyle + benzerlik kazanmış oldu.
    + +
    Çok Sayıda Protokol Desteği
    + +
    Apache artık çok sayıda protokol ile hizmet sunacak bir alt yapıya + sahiptir. Örneğin, mod_echo modülü bu amaçla + yazılmıştır.
    + +
    Unix dışı platformalara daha iyi destek
    + +
    Apache 2.0 sürümleri, BeOS, OS/2, Windows gibi Unix olmayan + platformlarda daha hızlı ve daha kararlı çalışacak duruma + getirilmiştir. Genelde iyi geliştirilmemiş olan dolayısıyla istenen + başarımı sağlayamayan POSIX taklit katmanlarının kullanımından + vazgeçilmiş, platforma özgü çok süreçlilik + modülleri (MPM) ve Apache Taşınabilirlik Arayüzü (APR) sayesinde + bu platformlar artık kendi doğal programlama arayüzleriyle + gerçeklenir olmuştur.
    + +
    Yeni Apache Programlama Arayüzü
    + +
    Modüller için kullanılan programlama arayüzü 2.0 sürümüyle önemli + değişikliklere uğramıştır. 1.3 sürümünde görülen modüllerle ilgili + sıralama/öncelik sorunlarının çoğu giderilmiştir. 2.0 sürümü bu + işlemleri daha bir özdevimli yapar olmuştur; daha fazla esneklik + sağlamak için artık kancalı modül sıralaması kullanılabilmektedir. + Ayrıca, arayüze, Apache sunucu çekirdeğini yamamaya gerek kalmadan + modüllerle sunucu yeteneklerinin arttırılabilmesini sağlayan yeni + çağrılar eklenmiştir.
    + +
    IPv6 Desteği
    + +
    IPv6’nın Apache Taşınabilirlik Arayüzü kütüphanesi tarafından + desteklendiği sistemlerde Apache öntanımlı olarak IPv6 soketlerini + dinler. Bundan başka, Listen, NameVirtualHost ve VirtualHost yönergelerinin IPv6 sayısal adres + dizgelerini desteklemesi sağlanmıştır.
    Örnek: Listen + [2001:db8::1]:8080
    + +
    Süzme
    + +
    Apache modülleri, artık, sunucuya teslim edilen veya sunucudan + teslim alınan içerik akımları üzerinde süzgeç gibi davranacak şekilde + yazılabilmektedir. Bu sayede, örneğin CGI betiklerinin çıktılarının + mod_include modülünün INCLUDES süzgeci + kullanılarak SSI yönergeleri için çözümlenmesi mümkündür. CGI + programlarının birer eylemci olarak davranması gibi, + mod_ext_filter modülü de harici programların birer + süzgeç olarak davranabilmesini mümkün kılar.
    + +
    Çok Dilli Hata Yanıtları
    + +
    Hata yanıtlarının tarayıcılara yönelik iletileri artık SSI + belgeleri kullanılarak çeşitli dillerde sağlanabilmektedir. Bunlar + ayrıca yönetici tarafından görünüş ve kullanışlılık tutarlılığı + bakımından kişiselleştirilebilmektedir.
    + +
    Basitleştirilmiş Yapılandırma
    + +
    Bazı yönergelerle ilgili kafa karışıklıkları giderilmiştir. + Bilhassa belli bir IP adresini dinlemek için kullanılan + Port ve BindAddress yönergeleri ile ilgili + karışıklığın önüne geçmek için sadece Listen yönergesi yeterli olmaktadır. ServerName yönergesi ise sadece yönlendirme + ve sanal konak tanıma amacıyla sunucu ismi ve port belirtiminde + kullanılmaktadır.
    + +
    Doğal Windows NT Unicode Desteği
    + +
    Apache 2.0, Windows NT üzerinde artık tüm dosya sistemi + kodlamalarında utf-8 kullanmaktadır. Bu destek, Windows 2000 ve + Windows XP dahil tüm Windows NT temelli sistemlere çok dillilik + desteğini sağlamak üzere mevcut Unicode dosya sistemine doğrudan + uyarlanır. Dosya sisteminde makinenin yerel karakter kodlamasını + kullanan kullanan Windows 95, 98 ve ME için bu destek + yoktur.
    + +
    Düzenli İfade Kütüphanesi Güncellemesi
    + +
    Apache 2.0’da Perl uyumlu düzenli + ifade kütüphanesi bulunur. Tüm düzenli ifadelerde artık çok daha + güçlü olan Perl 5 sözdizimi kullanılmaktadır.
    + +
    +
    top
    +
    +

    Modüllerdeki Gelişmeler

    + + +
    +
    mod_ssl
    + +
    Apache 2.0’da yeni olan bu modül, OpenSSL tarafından sağlanan + SSL/TLS şifreleme protokollerine bir arayüzdür.
    + +
    mod_dav
    + +
    Apache 2.0’da yeni olan bu modül, site içeriğinin destek ve bakımı + için HTTP dağıtık yazım ve sürüm yönetimi (DAV - Distributed + Authoring and Versioning) belirtimini gerçekler.
    + +
    mod_deflate
    + +
    Apache 2.0’da yeni olan bu modül sayesinde ağ band genişliğinden + daha verimli yararlanabilmek için içeriğin sıkıştırılarak + gönderilmesini talep eden tarayıcıların desteklenmesi mümkün + olmuştur.
    + +
    mod_auth_ldap
    + +
    Apache 2.0.41’de yeni olan bu modül, HTTP temel kimlik + doğrulamasında kullanılan delillerin saklanması için LDAP + veritabanının kullanılabilmesini mümkün kılar. Kardeş modülü olan + mod_ldap ise bağlantı havuzlaması ve sonuçların + önbelleğe alınması ile ilgilenir.
    + +
    mod_auth_digest
    + +
    Paylaşımlı belleği kullanan süreçlere karşı oturum önbelleklemesi + için ek destek içerir.
    + +
    mod_charset_lite
    + +
    Apache 2.0’da yeni olan bu deneysel modül, karakter kümesi + dönüşümleri veya kaydı için destek sağlar.
    + +
    mod_file_cache
    + +
    Apache 2.0’da yeni olan bu modül, Apache 1.3’teki + mod_mmap_static modülünün işlevselliğini içermenin + yanında buna önbellekleme yetenekleri de ekler.
    + +
    mod_headers
    + +
    Bu modül Apache 2.0’da daha esnek hale getirilmiştir. Artık + mod_proxy tarafından kullanılan istek başlıkları + değiştirilebilmekte ve bunlar yanıt başlıklarına şartlı olarak + atanabilmektedir.
    + +
    mod_proxy
    + +
    Bu modül HTTP/1.1 uyumlu vekaleti daha güvenilir kılmak ve yeni + süzgeç alt yapısının getirilerinden de yararlanmak amacıyla yeni + baştan yazılmıştır. Bunun yanında, <Proxy> bölümünün yeni hali vekil siteleri + desteklemek bakımından daha okunabilir (ve kendi içinde daha hızlı) + olması sağlanmıştır; <Directory "proxy:..."> + yapılandırması artık desteklenmemektedir. Modül, + proxy_connect, proxy_ftp ve + proxy_http şeklinde her biri belli bir protokolü + destekleyen ayrı modüllere bölünmüştür.
    + +
    mod_negotiation
    + +
    Yeni ForceLanguagePriority yönergesi sayesinde istemciye + “Kabul edilebilir bir gösterim çeşidi yok” ya da “Çok sayıda seçim + belirtilmiş” yanıtını döndürmek yerine tüm durumlara uyan bir + sayfanın gönderilebilmesi sağlanmıştır. Bundan başka, uzlaşım ve + MultiViews algoritmaları daha tutarlı sonuçlar elde + etmek amacıyla elden geçirilmiş ve belge içeriği ile daha iyi eşleşen + yeni bir tür eşlem yapısı sağlanmıştır.
    + +
    mod_autoindex
    + +
    Dizin içeriklerinin özdevimli listelenmesi artık HTML tabloları + kullanılacak şekilde yapılandırılabilmektedir. Böylece sayfa daha iyi + biçemlenebilmekte, içerik daha hassas sıralanabilmekte, sürüm + numarasına göre sıralama yapılabilmekte ve dosya ismi kalıpları + kullanılarak sadece istenen içerik listelenebilmektedir.
    + +
    mod_include
    + +
    Yeni yönergeler, değiştirilecek SSI elemanları için öntanımlı + başlangıç ve bitiş etiketlerine izin vermekte, hataların ve zaman + biçemleme yapılandırmalarının SSI belgesinde değil ana yapılandırma + dosyasında bulunması mümkün olmaktadır. Düzenli ifadelerin gruplanmış + sonuçları (Perl düzenli ifade sözdizimi kullanılmaktadır) + mod_include modülünün $0 .. + $9 değişkenleri sayesinde kullanılabilmektedir.
    + +
    mod_auth_dbm
    + +
    AuthDBMType yönergesi + sayesinde artık çok sayıda DBM tarzı veritabanı türü + desteklenmektedir.
    +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/platform/ebcdic.html b/rubbos/app/httpd-2.0.64/docs/manual/platform/ebcdic.html new file mode 100644 index 00000000..a48afa88 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/platform/ebcdic.html @@ -0,0 +1,9 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: ebcdic.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: ebcdic.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR diff --git a/rubbos/app/httpd-2.0.64/docs/manual/platform/ebcdic.html.en b/rubbos/app/httpd-2.0.64/docs/manual/platform/ebcdic.html.en new file mode 100644 index 00000000..9fd5da46 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/platform/ebcdic.html.en @@ -0,0 +1,584 @@ + + + +The Apache EBCDIC Port - Apache HTTP Server + + + + + +
    <-
    +

    The Apache EBCDIC Port

    +
    +

    Available Languages:  en  | + ko 

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

    Overview of the Apache EBCDIC Port

    + + + +

    Version 1.3 of the Apache HTTP Server is the first version + which includes a port to a (non-ASCII) mainframe machine which + uses the EBCDIC character set as its native codeset.

    + +

    (It is the SIEMENS family of mainframes running the BS2000/OSD + operating system. This mainframe OS nowadays features a + SVR4-derived POSIX subsystem).

    + +

    The port was started initially to

    + +
      +
    • prove the feasibility of porting the Apache HTTP server to + this platform
    • + +
    • find a "worthy and capable" successor for the venerable + CERN-3.0 daemon + (which was ported a couple of years ago), and to
    • + +
    • prove that Apache's preforking process model can on this + platform easily outperform the accept-fork-serve model used + by CERN by a factor of 5 or more.
    • +
    + +

    This document serves as a rationale to describe some of the + design decisions of the port to this machine.

    + +
    top
    +
    +

    Design Goals

    + + + +

    One objective of the EBCDIC port was to maintain enough + backwards compatibility with the (EBCDIC) CERN server to make + the transition to the new server attractive and easy. This + required the addition of a configurable method to define + whether a HTML document was stored in ASCII (the only format + accepted by the old server) or in EBCDIC (the native document + format in the POSIX subsystem, and therefore the only realistic + format in which the other POSIX tools like grep or + sed could operate on the documents). The current + solution to this is a "pseudo-MIME-format" which is intercepted + and interpreted by the Apache server (see below). Future versions + might solve the problem by defining an "ebcdic-handler" for all + documents which must be converted.

    + +
    top
    +
    +

    Technical Solution

    + + + +

    Since all Apache input and output is based upon the BUFF + data type and its methods, the easiest solution was to add the + conversion to the BUFF handling routines. The conversion must + be settable at any time, so a BUFF flag was added which defines + whether a BUFF object has currently enabled conversion or not. + This flag is modified at several points in the HTTP + protocol:

    + +
      +
    • set before a request is received + (because the request and the request header lines are always + in ASCII format)
    • + +
    • set/unset when the request body is + received - depending on the content type of the request body + (because the request body may contain ASCII text or a binary + file)
    • + +
    • set before a reply header is sent + (because the response header lines are always in ASCII + format)
    • + +
    • set/unset when the response body is sent + - depending on the content type of the response body (because + the response body may contain text or a binary file)
    • +
    + +
    top
    +
    +

    Porting Notes

    + + + +
      +
    1. +

      The relevant changes in the source are #ifdef'ed + into two categories:

      + +
      +
      #ifdef + CHARSET_EBCDIC
      + +
      +

      Code which is needed for any EBCDIC based machine. + This includes character translations, differences in + contiguity of the two character sets, flags which + indicate which part of the HTTP protocol has to be + converted and which part doesn't etc.

      +
      + +
      #ifdef _OSD_POSIX
      + +
      +

      Code which is needed for the SIEMENS BS2000/OSD + mainframe platform only. This deals with include file + differences and socket implementation topics which are + only required on the BS2000/OSD platform.

      +
      +
      +
    2. + +
    3. +

      The possibility to translate between ASCII and EBCDIC at + the socket level (on BS2000 POSIX, there is a socket option + which supports this) was intentionally not chosen, + because the byte stream at the HTTP protocol level consists + of a mixture of protocol related strings and non-protocol + related raw file data. HTTP protocol strings are always + encoded in ASCII (the GET request, any Header: lines, + the chunking information etc.) whereas the file transfer + parts (i.e., GIF images, CGI output etc.) + should usually be just "passed through" by the server. This + separation between "protocol string" and "raw data" is + reflected in the server code by functions like bgets() + or rvputs() for strings, and functions like + bwrite() for binary data. A global translation + of everything would therefore be inadequate.

      + +

      (In the case of text files of course, provisions must be + made so that EBCDIC documents are always served in + ASCII)

      +
    4. + +
    5. +

      This port therefore features a built-in protocol level + conversion for the server-internal strings (which the + compiler translated to EBCDIC strings) and thus for all + server-generated documents. The hard coded ASCII escapes + \012 and \015 which are ubiquitous + in the server code are an exception: they are already the binary + encoding of the ASCII \n and \r and + must not be converted to ASCII a second time. + This exception is only relevant for server-generated strings; + and external EBCDIC documents are not expected to + contain ASCII newline characters.

      +
    6. + +
    7. +

      By examining the call hierarchy for the BUFF management + routines, I added an "ebcdic/ascii conversion layer" which + would be crossed on every puts/write/get/gets, and a + conversion flag which allowed enabling/disabling the + conversions on-the-fly. Usually, a document crosses this + layer twice from its origin source (a file or CGI output) to + its destination (the requesting client): file -> + Apache, and Apache -> client.

      + +

      The server can now read the header lines of a CGI-script + output in EBCDIC format, and then find out that the remainder + of the script's output is in ASCII (like in the case of the + output of a WWW Counter program: the document body contains a + GIF image). All header processing is done in the native + EBCDIC format; the server then determines, based on the type + of document being served, whether the document body (except + for the chunking information, of course) is in ASCII already + or must be converted from EBCDIC.

      +
    8. + +
    9. +

      For Text documents (MIME types text/plain, text/html + etc.), an implicit translation to ASCII can be + used, or (if the users prefer to store some documents in + raw ASCII form for faster serving, or because the files + reside on a NFS-mounted directory tree) can be served + without conversion.

      + +

      Example:

      + +

      to serve files with the suffix .ahtml as a + raw ASCII text/html document without implicit + conversion (and suffix .ascii as ASCII + text/plain), use the directives:

      + +

      + AddType text/x-ascii-html .ahtml
      + AddType text/x-ascii-plain .ascii +

      + +

      Similarly, any text/foo MIME type can be + served as "raw ASCII" by configuring a MIME type + "text/x-ascii-foo" for it using + AddType.

      +
    10. + +
    11. +

      Non-text documents are always served "binary" without + conversion. This seems to be the most sensible choice for, + .e.g., GIF/ZIP/AU file types. This of course + requires the user to copy them to the mainframe host using + the "rcp -b" binary switch.

      +
    12. + +
    13. +

      Server parsed files are always assumed to be in native + (i.e., EBCDIC) format as used on the machine, and + are converted after processing.

      +
    14. + +
    15. +

      For CGI output, the CGI script determines whether a + conversion is needed or not: by setting the appropriate + Content-Type, text files can be converted, or GIF output can + be passed through unmodified. An example for the latter case + is the wwwcount program which we ported as well.

      +
    16. + +
    + +
    top
    +
    +

    Document Storage Notes

    + + + +

    Binary Files

    + + + +

    All files with a Content-Type: which does not + start with text/ are regarded as binary + files by the server and are not subject to any conversion. + Examples for binary files are GIF images, gzip-compressed files + and the like.

    + +

    When exchanging binary files between the mainframe host and + a Unix machine or Windows PC, be sure to use the ftp "binary" + (TYPE I) command, or use the + rcp -b command from the mainframe host (the + -b switch is not supported in unix + rcp's).

    + + + +

    Text Documents

    + + + +

    The default assumption of the server is that Text Files + (i.e., all files whose Content-Type: + starts with text/) are stored in the native + character set of the host, EBCDIC.

    + + + +

    Server Side Included Documents

    + + + +

    SSI documents must currently be stored in EBCDIC only. + No provision is made to convert it from ASCII before + processing.

    + + + +
    top
    +
    +

    Apache Modules' Status

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ModuleStatusNotes
    core+ +
    mod_access+ +
    mod_actions+ +
    mod_alias+ +
    mod_asis+ +
    mod_auth+ +
    mod_auth_anon+ +
    mod_auth_dbm?with own libdb.a
    mod_autoindex+ +
    mod_cern_meta? +
    mod_cgi+ +
    mod_digest+ +
    mod_dir+ +
    mod_so-no shared libs
    mod_env+ +
    mod_example-(test bed only)
    mod_expires+ +
    mod_headers+ +
    mod_imap+ +
    mod_include+ +
    mod_info+ +
    mod_log_agent+ +
    mod_log_config+ +
    mod_log_referer+ +
    mod_mime+ +
    mod_mime_magic?not ported yet
    mod_negotiation+ +
    mod_proxy+ +
    mod_rewrite+untested
    mod_setenvif+ +
    mod_speling+ +
    mod_status+ +
    mod_unique_id+ +
    mod_userdir+ +
    mod_usertrack?untested
    + +
    top
    +
    +

    Third Party Modules' Status

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ModuleStatusNotes
    mod_jserv + -JAVA still being ported.
    mod_php3+mod_php3 runs fine, with LDAP and GD + and FreeType libraries.
    mod_put?untested
    mod_session-untested
    + +
    +
    +

    Available Languages:  en  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/platform/ebcdic.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/platform/ebcdic.html.ko.euc-kr new file mode 100644 index 00000000..44526cf8 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/platform/ebcdic.html.ko.euc-kr @@ -0,0 +1,557 @@ + + + +¾ÆÆÄÄ¡ EBCDIC Æ÷Æà - Apache HTTP Server + + + + + +
    <-
    +

    ¾ÆÆÄÄ¡ EBCDIC Æ÷ÆÃ

    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + ko 

    +
    + + +
    ÀÌ ¹®¼­´Â ¾ÆÆÄÄ¡ À¥¼­¹ö 2.0 ¹öÀü¿¡¼­ + º¯°æµÈ ³»¿ëÀ» ´ã°íÀÖÁö ¾Ê´Ù. ¾ÆÁ÷µµ À¯È¿ÇÑ Á¤º¸°¡ ÀÖÁö¸¸, + ÁÖÀÇÇؼ­ »ç¿ëÇÏ±æ ¹Ù¶õ´Ù. +
    + +
    + +
    top
    +
    +

    ¾ÆÆÄÄ¡ EBCDIC Æ÷Æà °³¿ä

    + + + +

    ¾ÆÆÄÄ¡ À¥¼­¹ö´Â 1.3 ¹öÀü¶§ óÀ½À¸·Î EBCDIC ¹®ÀÚÁýÇÕÀ» + ±âº» ¹®ÀÚÁýÇÕÀ¸·Î »ç¿ëÇÏ´Â (ºñ-ASCII) ¸ÞÀÎÇ÷¹ÀÓ ÄÄÇ»ÅÍ·Î + Æ÷ÆõǾú´Ù.

    + +

    (BS2000/OSD + ¿î¿µÃ¼Á¦¸¦ »ç¿ëÇÏ´Â SIEMENS °è¿­ ¸ÞÀÎÇ÷¹ÀÓÀ» ¸»ÇÑ´Ù. + ÀÌ ¸ÞÀÎÇ÷¹ÀÓ ¿î¿µÃ¼Á¦¿¡´Â ÇöÀç SVR4°è¿­ÀÇ POSIX ÇÏÀ§½Ã½ºÅÛÀÌ + ÀÖ´Ù).

    + +

    Æ÷ÆÃÀº óÀ½¿¡ ´ÙÀ½°ú °°Àº ¸ñÀû¿¡¼­ ½ÃÀ۵Ǿú´Ù

    + +
      +
    • ÀÌ Ç÷¹ÆûÀ¸·Îµµ ¾ÆÆÄÄ¡ + À¥¼­¹ö¸¦ Æ÷ÆÃÇÒ ¼ö ÀÖ´Ù´Â °¡´É¼ºÀ» º¸À̱âÀ§Çؼ­
    • + +
    • (¸î³â Àü¿¡ Æ÷ÆõÈ) ¿À·¡µÈ CERN-3.0 ¼­¹ö¸¦ ´ëüÇÒ + "¾µ¸¸ÇÏ°í À¯´ÉÇÑ" ÈÄ°èÀÚ¸¦ ã±âÀ§ÇØ
    • + +
    • ÀÌ Ç÷¹Æû¿¡¼­ ¾ÆÆÄÄ¡ÀÇ prefork ÇÁ·Î¼¼½º ¹æ½ÄÀÌ CERNÀÇ + accept-fork-serve ¹æ½Ä º¸´Ù 5¹è ÀÌ»ó ¼º´ÉÀÌ ÁÁÀ½À» + º¸À̱âÀ§Çؼ­.
    • +
    + +

    ÀÌ ¹®¼­´Â Æ÷Æýà ¿©·¯ ¼³°è»ó °áÁ¤ÀÇ ÀÌÀ¯¸¦ ¼³¸íÇÑ´Ù.

    + +
    top
    +
    +

    ¼³°è ¸ñÇ¥

    + + + +

    EBCDIC Æ÷ÆÃÀÇ ¸ñÀûÁß Çϳª´Â »õ·Î¿î ¼­¹ö·Î ÀüȯÀ» À¯µµÇÏ°í + ½±°Ô ÀüȯÇÒ ¼ö ÀÖµµ·Ï °¡´ÉÇÑ (EBCDIC) CERN ¼­¹ö¿Í ȣȯ¼ºÀ» + À¯ÁöÇÏ´Â °ÍÀÌ´Ù. ±×·¡¼­ HTML ¹®¼­°¡ (ÀÌÀü CERN ¼­¹ö°¡ ÀνÄÇÏ´Â + À¯ÀÏÇÑ Çü½ÄÀÎ) ASCII¿Í (POSIX ÇÏÀ§½Ã½ºÅÛÀÇ ±âº» ¹®¼­ Çü½Ä. + ±×·¯¹Ç·Î grepÀ̳ª sed °°Àº POSIX + µµ±¸¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Â Çö½ÇÀûÀÎ Çü½ÄÀÎ) EBCDIC Áß ¾î´À Çü½ÄÀÎÁö + ¼³Á¤ÇÒ ¼ö ÀÖ¾î¾ß ÇÑ´Ù. ÇöÀç ÇØ°áÃ¥Àº ¾ÆÆÄÄ¡ ¼­¹ö°¡ Áß°£¿¡¼­ + ¹®¼­¸¦ °¡·Îä¼­ ¹®¼­ÀÇ Çü½ÄÀ» ÆľÇÇÏ´Â "°¡»ó MIME Çü½Ä"ÀÌ´Ù + (¾Æ·¡ Âü°í). ´ÙÀ½ ¹öÀü¿¡¼­´Â º¯È¯ÇؾßÇÒ ¸ðµç ¹®¼­¿¡ + "ebcdic-handler"¸¦ Á¤ÀÇÇÏ´Â ¹æ¹ýÀ¸·Î ¹®Á¦¸¦ ÇØ°áÇÒ °ÍÀÌ´Ù.

    + +
    top
    +
    +

    ±â¼úÀû ÇØ°áÃ¥

    + + + +

    ¾ÆÆÄÄ¡°¡ BUFF ÀÚ·áÇü°ú ¸Þ½áµå¸¦ »ç¿ëÇÏ¿© ¸ðµç ÀÔÃâ·ÂÀ» + ÇϹǷΠ°¡Àå ½¬¿î ¹æ¹ýÀº BUFF ó¸® ÇÔ¼ö¿¡ º¯È¯±â´ÉÀ» Ãß°¡ÇÏ´Â + °ÍÀÌ´Ù. ¾ðÁ¦µçÁö º¯È¯ÇÒ ¼ö ÀÖ¾î¾ß Çϱ⶧¹®¿¡ BUFF °´Ã¼¸¦ + º¯È¯ÇØ¾ß ÇÏ´ÂÁö ¾Ë·ÁÁÖ´Â BUFF Ç¥½Ã¸¦ Ãß°¡Çß´Ù. ÀÌ Ç¥½Ã´Â + HTTP ÇÁ·ÎÅäÄÝÀÇ ¿©·¯ ´Ü°è¿¡¼­ º¯°æµÉ ¼ö ÀÖ´Ù:

    + +
      +
    • ¿äûÀ» ¹Þ±â Àü¿¡ º¯È¯ (¿äû°ú ¿äûÇì´õ°¡ + Ç×»ó ASCII Çü½ÄÀ̱⠶§¹®¿¡)
    • + +
    • ¿äû ³»¿ëÀ» ¹Þ¾ÒÀ»¶§ content type¿¡ µû¶ó + º¯È¯/º¯È¯¾ÈÇÔ (¿äû ³»¿ëÀÌ ASCII ¹®ÀÚ³ª + ¹ÙÀ̳ʸ® ÆÄÀÏÀÎ °æ¿ì º¯È¯ÇØ¾ß Çϱ⶧¹®¿¡)
    • + +
    • ÀÀ´äÇì´õ¸¦ º¸³»±â Àü¿¡ º¯È¯ (ÀÀ´äÇì´õ´Â + Ç×»ó ASCII Çü½ÄÀ̱⶧¹®¿¡)
    • + +
    • ÀÀ´ä ³»¿ëÀ» º¸³¾¶§ content type¿¡ µû¶ó + º¯È¯/º¯È¯¾ÈÇÔ (ÀÀ´ä ³»¿ëÀÌ ¹®ÀÚ ÆÄÀÏÀ̰ųª + ¹ÙÀ̳ʸ® ÆÄÀÏÀ̱⶧¹®¿¡)
    • +
    + +
    top
    +
    +

    Æ÷Æÿ¡ ´ëÇؼ­

    + + + +
      +
    1. +

      ¼Ò½ºÀÇ º¯È­´Â µÎ°¡Áö #ifdef·Î ±¸ºÐÇÒ + ¼ö ÀÖ´Ù:

      + +
      +
      #ifdef + CHARSET_EBCDIC
      + +
      +

      ¸ðµç EBCDIC±â¹Ý ÄÄÇ»ÅÍ¿¡ ÇÊ¿äÇÑ ÄÚµå. ¹®ÀÚº¯È¯, + µÎ ¹®ÀÚÁýÇÕ°£ÀÇ ¿¬¼ÓµÈ ¹®ÀÚ°ª Â÷ÀÌ, ¾î¶² HTTP ÇÁ·ÎÅäÄÝ + ºÎºÐÀÌ º¯È¯µÇ¾ß ÇÏ´ÂÁö¸¦ ¾Ë·ÁÁִ ǥ½Ã µî.

      +
      + +
      #ifdef _OSD_POSIX
      + +
      +

      SIEMENS BS2000/OSD ¸ÞÀÎÇ÷¹ÀÓ Ç÷¹Æû¿¡¸¸ ÇÊ¿äÇÑ + ÄÚµå. BS2000/OSD Ç÷¹Æû¿¡¸¸ ÇÊ¿äÇÑ Çì´õÆÄÀÏ Â÷ÀÌ¿Í + ¼ÒÄÏ ±¸Çö ¹®Á¦¸¦ ´Ù·é´Ù.

      +
      +
      +
    2. + +
    3. +

      ¼ÒÄÏ ¼öÁØ¿¡¼­ ASCII¿Í EBCDIC°£ º¯È­´Â (BS2000 POSIX¿¡´Â + ÀÌ ±â´ÉÀ» Áö¿øÇÏ´Â ¼ÒÄÏ ¿É¼ÇÀÌ ÀÖ´Ù) HTTP ÇÁ·ÎÅäÄÝ ¼öÁØ¿¡¼­ + Àü¼ÛµÇ´Â ÀÚ·á¿¡ ÇÁ·ÎÅäÄÝ°ü·Ã ¹®ÀÚ¿­°ú ÇÁ·ÎÅäÄÝ°ú ¹«°üÇÑ + ÀϹÝÆÄÀÏÀÌ ¼¯¿©Àֱ⶧¹®¿¡ ÀǵµÀûÀ¸·Î »ç¿ëÇÏÁö + ¾Ê¾Ò´Ù. HTTP ÇÁ·ÎÅäÄÝ ¹®ÀÚ¿­Àº (GET + ¿äû, Header: ÁÙ, ±âŸ Á¤º¸ µî.) Ç×»ó ASCII + Çü½ÄÀÌ°í, ÆÄÀÏÀü¼Û ºÎºÐÀº (Áï, GIF ±×¸², CGI + Ãâ·Â µî.) ¼­¹ö°¡ Ç×»ó "º¯È¯ÇÏÁö¾Ê°í ±×³É" º¸³»¾ß + ÇÑ´Ù. ¼­¹ö ÄÚµå´Â "ÇÁ·ÎÅäÄÝ ¹®ÀÚ¿­"°ú "ÀÏ¹Ý ÀÚ·á"¸¦, + ¹®ÀÚ¿­¿¡´Â bgets()³ª rvputs(), + ¹ÙÀ̳ʸ® ÀÚ·á¿¡´Â bgets()³ª + rvputs() ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© ±¸º°ÇÑ´Ù. ±×·¯¹Ç·Î + ¹«Á¶°Ç ¸ðµç °ÍÀ» º¯È¯ÇÏ´Â °ÍÀº ÀûÀýÇÏÁö ¾Ê´Ù.

      + +

      (¹°·Ð ¹®ÀÚÆÄÀÏÀÇ °æ¿ì EBCDIC ¹®¼­¸¦ Ç×»ó ASCII·Î + ¼­ºñ½ºÇϵµ·Ï ÁغñÇØ¾ß ÇÑ´Ù)

      +
    4. + +
    5. +

      ±×·¡¼­ Æ÷Æÿ¡´Â (ÄÄÆÄÀÏ·¯°¡ EBCDIC ¹®ÀÚ¿­·Î º¯È¯ÇÑ) + ¼­¹ö ³»ºÎ ¹®ÀÚ¿­°ú ¼­¹ö°¡ »ý¼ºÇÑ ¹®¼­¸¦ ±âº» ÇÁ·ÎÅäÄÝ + ¼öÁØ¿¡¼­ º¯È¯ÇÏ´Â ±â´ÉÀÌ ÀÖ´Ù. ¼­¹ö Äڵ忡 »êÀçµÈ ASCII + escape¹®ÀÚ \012¿Í \015´Â ¿¹¿Ü´Ù: + À̵éÀÌ ÀÌ¹Ì ASCII \n°ú \rÀÇ + ¹ÙÀ̳ʸ® °ªÀ̱⶧¹®¿¡ ASCII·Î µÎ¹ø º¯È¯ÇÏ¸é ¾ÈµÈ´Ù. + ÀÌ ¿¹¿Ü´Â ¼­¹ö°¡ »ý¼ºÇÑ ¹®ÀÚ¿­¿¡¸¸ Àû¿ëµÈ´Ù; ¿ÜºÎ + EBCDIC ¹®¼­´Â ASCII Áٹٲ޹®ÀÚ¸¦ Æ÷ÇÔÇÏ¸é ¾ÈµÈ´Ù.

      +
    6. + +
    7. +

      BUFF °ü¸®ÇÔ¼ö¸¦ »ç¿ëÇÏ´Â ¹æ¹ýÀ» »ìÆ캻 ÈÄ ³ª´Â ¸ðµç + puts/write/get/gets°¡ °ÅÄ¡°ÔµÇ´Â "ebcdic/ascii º¯È¯ + °èÃþ"À» Ãß°¡ÇÏ°í, µ¿ÀûÀ¸·Î º¯È¯À¯¹«¸¦ ¼³Á¤ÇÒ ¼ö ÀÖ´Â + º¯È¯ Ç¥½Ã¸¦ Ãß°¡Çß´Ù. ¹®¼­°¡ ¿øº»(ÆÄÀÏÀ̳ª CGI Ãâ·Â)¿¡¼­ + ´ë»ó(¿äûÇÑ Å¬¶óÀ̾ðÆ®)À¸·Î À̵¿ÇÒ¶§ Ç×»ó ÀÌ °èÃþÀ» + µÎ¹ø Áö³­´Ù: ÆÄÀÏ -> ¾ÆÆÄÄ¡, ¾ÆÆÄÄ¡ + -> Ŭ¶óÀ̾ðÆ®.

      + +

      ¼­¹ö´Â ÀÌÁ¦ EBCDIC Çü½ÄÀ¸·Î µÈ CGI ½ºÅ©¸³Æ® Ãâ·ÂÀÇ + Çì´õÁÙÀ» Àаí, ³ª¸ÓÁö ½ºÅ©¸³Æ® Ãâ·ÂÀÌ ASCIIÀÓÀ» ¾Ë¾Æ³¾ + ¼ö ÀÖ´Ù (WWW ¹æ¹®ÀÚ¼ö¸¦ ¼¼´Â ÇÁ·Î±×·¥°ú °°Àº °æ¿ì: ¹®¼­ + ³»¿ëÀº GIF ±×¸²ÀÌ´Ù). ±âº» EBCDIC Çü½ÄÀ¸·Î ¸ðµç Çì´õ¸¦ + ó¸®ÇÑ´Ù; ±×·± ´ÙÀ½ ¼­ºñ½ºÇÒ ¹®¼­ÀÇ type¿¡ µû¶ó ¼­¹ö´Â + ¹®¼­ ³»¿ëÀÌ ÀÌ¹Ì ASCIIÀÎÁö ȤÀº EBCDIC¿¡¼­ º¯È¯À» ÇØ¾ß + ÇÏ´ÂÁö °áÁ¤ÇÑ´Ù.

      +
    8. + +
    9. +

      (MIME typeÀÌ text/plain, text/html µî) ³»¿ëÀÌ + ÀÏ¹Ý ¹®ÀÚÀÎ ¹®¼­¸¦ ¾Ï¹¬ÀûÀ¸·Î ASCII·Î º¯È¯Çϰųª, (»ç¿ëÀÚ¿¡°Ô + ºü¸£°Ô ¼­ºñ½ºÇϱâÀ§ÇØ ¹Ì¸® ¹®¼­¸¦ ASCII Çü½ÄÀ¸·Î ÀúÀåÇÏ¿´°Å³ª + NFS·Î ¸¶¿îÆ®ÇÑ µð·ºÅ丮¿¡ ÆÄÀÏÀÌ ÀÖ´Â °æ¿ì) º¯È¯¾øÀÌ + ¼­ºñ½ºÇÒ ¼ö ÀÖ´Ù.

      + +

      ¿¹:

      + +

      À̸§ÀÌ .ahtml·Î ³¡³ª´Â ÆÄÀÏÀ» ¾Ï¹¬ÀûÀÎ + º¯È¯¾øÀÌ ASCII text/html ¹®¼­·Î (±×¸®°í + .ascii È®ÀåÀÚ´Â ASCII + text/plainÀ¸·Î) ¼­ºñ½ºÇÏ·Á¸é ´ÙÀ½ Áö½Ã¾î¸¦ + »ç¿ëÇÑ´Ù:

      + +

      + AddType text/x-ascii-html .ahtml
      + AddType text/x-ascii-plain .ascii +

      + +

      ¶Ç, text/foo ½ÄÀÇ MIME typeÀ» + AddType "text/x-ascii-foo" + ¼³Á¤ÇÏ¿© "ÀÏ¹Ý ASCII"·Î ¼­ºñ½ºÇÒ ¼ö ÀÖ´Ù.

      +
    10. + +
    11. +

      ³»¿ëÀÌ ÀÏ¹Ý ¹®ÀÚ°¡ ¾Æ´Ñ ¹®¼­´Â º¯È¯¾øÀÌ Ç×»ó "¹ÙÀ̳ʸ®"·Î + ¼­ºñ½ºÇÑ´Ù. ¿¹¸¦ µé¾î, GIF/ZIP/AU ÆÄÀÏÇü½Ä¿¡ + °¡Àå ÀûÇÕÇÑ ¼±ÅÃÀÌ´Ù. ¹°·Ð »ç¿ëÀÚ´Â "rcp -b" + ¹ÙÀ̳ʸ® ¿É¼ÇÀ» »ç¿ëÇÏ¿© ÆÄÀÏÀ» ¸ÞÀÎÇ÷¹ÀÓ È£½ºÆ®·Î + º¹»çÇß¾î¾ß ÇÑ´Ù.

      +
    12. + +
    13. +

      ¼­¹öÆÄ½Ì ÆÄÀÏÀº Ç×»ó ÄÄÇ»ÅÍ°¡ »ç¿ëÇÏ´Â ±âº» Çü½ÄÀ¸·Î + (Áï, EBCDIC) ÀúÀåµÇ¾ú´Ù°í °¡Á¤ÇÏ°í, ó¸®ÈÄ¿¡ + º¯È¯ÇÑ´Ù.

      +
    14. + +
    15. +

      CGI Ãâ·ÂÀÇ °æ¿ì CGI ½ºÅ©¸³Æ®°¡ º¯È¯ÀÌ ÇÊ¿äÇÑÁö °áÁ¤ÇÑ´Ù: + ÀûÀýÇÑ Content-TypeÀ» ¼³Á¤ÇÏ¿©, ¹®ÀÚÆÄÀÏÀº º¯È¯ÇÏ°í, + GIF Ãâ·ÂÀº º¯È¯¾øÀÌ º¸³¾ ¼ö ÀÖ´Ù. ¿ì¸®°¡ Æ÷ÆÃÇÑ wwwcount + ÇÁ·Î±×·¥ÀÌ ÈÄÀÚÀÇ °æ¿ì´Ù.

      +
    16. + +
    + +
    top
    +
    +

    ¹®¼­ ÀúÀå¿¡ ´ëÇؼ­

    + + + +

    ¹ÙÀ̳ʸ® ÆÄÀÏ

    + + + +

    ¼­¹ö´Â Content-Type:ÀÌ text/·Î + ½ÃÀÛÇÏ´Â ¾Ê´Â ÆÄÀÏÀ» ¹ÙÀ̳ʸ® ÆÄÀÏ·Î °£ÁÖÇÏ¿© + ¾î¶² º¯È¯µµ ÇÏÁö ¾Ê´Â´Ù. ¹ÙÀ̳ʸ® ÆÄÀÏ¿¡´Â GIF ±×¸², gzipÀ¸·Î + ¾ÐÃàÇÑ ÆÄÀÏ µîÀÌ ÀÖ´Ù.

    + +

    ¸ÞÀÎÇ÷¹ÀÓ È£½ºÆ®¿Í À¯´Ð½º ȤÀº À©µµ¿ìÁî PC°£¿¡ ¹ÙÀ̳ʸ® + ÆÄÀÏÀ» Àü¼ÛÇÒ ¶§´Â ftp "binary" (TYPE I) ¸í·É¾î³ª + ¸ÞÀÎÇ÷¹ÀÓ È£½ºÆ®¿¡¼­ (À¯´Ð½º rcp´Â + -b ¿É¼ÇÀ» Áö¿øÇÏÁö ¾Ê´Â´Ù) rcp -b + ¸í·É¾î¸¦ ¹Ýµå½Ã »ç¿ëÇ϶ó.

    + + + +

    ¹®ÀÚ ¹®¼­

    + + + +

    ±âº»ÀûÀ¸·Î ¼­¹ö´Â ¹®ÀÚÆÄÀÏÀÌ (Áï, + Content-Type:ÀÌ text/·Î ½ÃÀÛÇÏ´Â + ¸ðµç ÆÄÀÏ) È£½ºÆ®ÀÇ ±âº» ¹®ÀÚÁýÇÕÀÎ EBCDICÀ¸·Î ÀúÀåµÇ¾ú´Ù°í + °¡Á¤ÇÑ´Ù.

    + + + +

    Server Side Include ¹®¼­

    + + + +

    SSI ¹®¼­´Â ÇöÀç EBCDIC Çü½ÄÀ¸·Î¸¸ ÀúÀåÇØ¾ß ÇÑ´Ù. ó¸®Çϱâ + Àü¿¡ ASCII¸¦ º¯È¯ÇÏÁö ¾Ê´Â´Ù.

    + + + +
    top
    +
    +

    ¾ÆÆÄÄ¡ ¸ðµâÀÇ »óÅÂ

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ¸ðµâ»óźñ°í
    core+ +
    mod_access+ +
    mod_actions+ +
    mod_alias+ +
    mod_asis+ +
    mod_auth+ +
    mod_auth_anon+ +
    mod_auth_dbm?ÀÚü libdb.a¸¦ »ç¿ëÇÏ¿©
    mod_autoindex+ +
    mod_cern_meta? +
    mod_cgi+ +
    mod_digest+ +
    mod_dir+ +
    mod_so-°øÀ¯¶óÀ̺귯¸®°¡ ¾øÀ½
    mod_env+ +
    mod_example-(½ÃÇè ´Ü°è)
    mod_expires+ +
    mod_headers+ +
    mod_imap+ +
    mod_include+ +
    mod_info+ +
    mod_log_agent+ +
    mod_log_config+ +
    mod_log_referer+ +
    mod_mime+ +
    mod_mime_magic?¾ÆÁ÷ Æ÷ÆþȵÊ
    mod_negotiation+ +
    mod_proxy+ +
    mod_rewrite+Å×½ºÆ®¾ÈµÊ
    mod_setenvif+ +
    mod_speling+ +
    mod_status+ +
    mod_unique_id+ +
    mod_userdir+ +
    mod_usertrack?Å×½ºÆ®¾ÈµÊ
    + +
    top
    +
    +

    Á¦»ïÀÚ°¡ ¸¸µç ¸ðµâÀÇ »óÅÂ

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ¸ðµâ»óźñ°í
    mod_jserv + -JAVA´Â Æ÷ÆÃÁßÀÌ´Ù.
    mod_php3+mod_php3´Â LDAP, GD, FreeType ¶óÀ̺귯¸®¿Í + ÇÔ²² Àß µ¿ÀÛÇÑ´Ù.
    mod_put?Å×½ºÆ®¾ÈµÊ
    mod_session-Å×½ºÆ®¾ÈµÊ
    + +
    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/platform/index.html b/rubbos/app/httpd-2.0.64/docs/manual/platform/index.html new file mode 100644 index 00000000..df57cd0f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/platform/index.html @@ -0,0 +1,9 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: index.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: index.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR diff --git a/rubbos/app/httpd-2.0.64/docs/manual/platform/index.html.en b/rubbos/app/httpd-2.0.64/docs/manual/platform/index.html.en new file mode 100644 index 00000000..a8870ebf --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/platform/index.html.en @@ -0,0 +1,94 @@ + + + +Platform Specific Notes - Apache HTTP Server + + + + + +
    <-
    +

    Platform Specific Notes

    +
    +

    Available Languages:  en  | + ko 

    +
    +
    + +
    top
    +
    +

    Microsoft Windows

    + + + +
    +
    Using Apache
    +
    +

    This document explains how to install, configure and run Apache 2.0 + under Microsoft Windows.

    + +

    See: Using Apache with Microsoft Windows

    +
    +
    + +
    +
    Compiling Apache
    +
    +

    There are many important points before you begin compiling Apache. + This document explain them.

    + +

    See: Compiling Apache for Microsoft Windows

    +
    +
    + +
    top
    +
    +

    Other Platforms

    + + + +
    +
    Novell NetWare
    +
    +

    This document explains how to install, configure and run Apache 2.0 + under Novell NetWare 5.1 and above.

    + +

    See: Using Apache With Novell NetWare

    +
    +
    + +
    +
    EBCDIC
    +
    +

    Version 1.3 of the Apache HTTP Server is the first version which + includes a port to a (non-ASCII) mainframe machine which uses the + EBCDIC character set as its native codeset.

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

    See: The Apache EBCDIC Port

    +
    +
    + +
    +
    +

    Available Languages:  en  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/platform/index.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/platform/index.html.ko.euc-kr new file mode 100644 index 00000000..0486d8fb --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/platform/index.html.ko.euc-kr @@ -0,0 +1,94 @@ + + + +Ç÷¡Æûº° ¼³¸í - Apache HTTP Server + + + + + +
    <-
    +

    Ç÷¡Æûº° ¼³¸í

    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + ko 

    +
    +
    + +
    top
    +
    +

    Microsoft Windows

    + + + +
    +
    ¾ÆÆÄÄ¡ »ç¿ë¹ý
    +
    +

    ÀÌ ¹®¼­´Â Microsoft Windows¿¡¼­ ¾ÆÆÄÄ¡ 2.0À» ¼³Ä¡, + ¼³Á¤, ½ÇÇàÇÏ´Â ¹æ¹ýÀ» ¼³¸íÇÑ´Ù.

    + +

    ¹®¼­: Microsoft Windows¿¡¼­ + ¾ÆÆÄÄ¡ »ç¿ë¹ý

    +
    +
    + +
    +
    ¾ÆÆÄÄ¡ ÄÄÆÄÀÏ
    +
    +

    ¾ÆÆÄÄ¡¸¦ ÄÄÆÄÀÏÇϱâ Àü¿¡ ÁÖÀÇÇÒ Á¡ÀÌ ¸¹´Ù. ÀÌ ¹®¼­´Â + ÀÌÁ¡À» ¼³¸íÇÑ´Ù.

    + +

    ¹®¼­: Microsoft Windows¿ë ¾ÆÆÄÄ¡ ÄÄÆÄÀÏ

    +
    +
    + +
    top
    +
    +

    ±âŸ Ç÷¡Æû

    + + + +
    +
    Novell NetWare
    +
    +

    ÀÌ ¹®¼­´Â Novell NetWare 5.1 À̻󿡼­ ¾ÆÆÄÄ¡ 2.0À» + ¼³Ä¡, ¼³Á¤, ½ÇÇàÇÏ´Â ¹æ¹ýÀ» ¼³¸íÇÑ´Ù.

    + +

    ¹®¼­: Novell NetWare¿¡¼­ ¾ÆÆÄÄ¡ + »ç¿ëÇϱâ

    +
    +
    + +
    +
    EBCDIC
    +
    +

    ¾ÆÆÄÄ¡ À¥¼­¹ö´Â 1.3 ¹öÀü¶§ óÀ½À¸·Î EBCDIC ¹®ÀÚÁýÇÕÀ» + ±âº» ¹®ÀÚÁýÇÕÀ¸·Î »ç¿ëÇÏ´Â (ºñ-ASCII) ¸ÞÀÎÇ÷¹ÀÓ ÄÄÇ»ÅÍ·Î + Æ÷ÆõǾú´Ù.

    + +
    °æ°í: ÀÌ ¹®¼­´Â + ¾ÆÆÄÄ¡ À¥¼­¹ö 2.0 ¹öÀü¿¡¼­ º¯°æµÈ ³»¿ëÀ» ´ã°íÀÖÁö ¾Ê´Ù. + ¾ÆÁ÷µµ À¯È¿ÇÑ Á¤º¸°¡ ÀÖÁö¸¸, ÁÖÀÇÇؼ­ »ç¿ëÇÏ±æ ¹Ù¶õ´Ù.
    + +

    ¹®¼­: ¾ÆÆÄÄ¡ EBCDIC Æ÷ÆÃ

    +
    +
    + +
    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/platform/netware.html b/rubbos/app/httpd-2.0.64/docs/manual/platform/netware.html new file mode 100644 index 00000000..953689aa --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/platform/netware.html @@ -0,0 +1,9 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: netware.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: netware.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR diff --git a/rubbos/app/httpd-2.0.64/docs/manual/platform/netware.html.en b/rubbos/app/httpd-2.0.64/docs/manual/platform/netware.html.en new file mode 100644 index 00000000..b304f348 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/platform/netware.html.en @@ -0,0 +1,589 @@ + + + +Using Apache With Novell NetWare - Apache HTTP Server + + + + + +
    <-
    +

    Using Apache With Novell NetWare

    +
    +

    Available Languages:  en  | + ko 

    +
    + + +

    This document explains how to install, configure and run + Apache 2.0 under Novell NetWare 6.0 and above. If you find any bugs, + or wish to contribute in other ways, please use our + bug reporting + page.

    + +

    The bug reporting page and dev-httpd mailing list are not + provided to answer questions about configuration or running Apache. + Before you submit a bug report or request, first consult this document, the + Frequently Asked Questions page and the other + relevant documentation topics. If you still have a question or problem, + post it to the + novell.devsup.webserver newsgroup, where many Apache users are more than + willing to answer new and obscure questions about using Apache on NetWare.

    + +

    Most of this document assumes that you are installing Apache + from a binary distribution. If you want to compile Apache + yourself (possibly to help with development, or to track down + bugs), see the section on Compiling Apache for + NetWare below.

    + +
    + +
    top
    +
    +

    Requirements

    + + + +

    Apache 2.0 is designed to run on NetWare 6.0 service pack 3 + and above. If you are running a service pack less + than SP3, you must install the latest + NetWare Libraries + for C (LibC).

    + +

    NetWare service packs are available here.

    + +

    Apache 2.0 for NetWare can also be run in a NetWare 5.1 environment + as long as the latest service pack or the latest version + of the NetWare Libraries + for C (LibC) has been installed . WARNING: Apache 2.0 + for NetWare has not been targeted for or tested in this environment.

    + +
    top
    +
    +

    Downloading Apache for NetWare

    + + + +

    Information on the latest version of Apache can be found on + the Apache web server at http://www.apache.org/. This + will list the current release, any more recent alpha or + beta-test releases, together with details of mirror web and + anonymous ftp sites. Binary builds of the latest releases of + Apache 2.0 for NetWare can be downloaded from + here.

    + +
    top
    +
    +

    Installing Apache for NetWare

    + + + +

    There is no Apache install program for NetWare currently. If you + are building Apache 2.0 for NetWare from source, you will need to + copy the files over to the server manually.

    + +

    Follow these steps to install Apache on NetWare from the + binary download (assuming you will install to + sys:/apache2):

    + +
      +
    • Unzip the binary download file to the root of the SYS: + volume (may be installed to any volume)
    • + +
    • Edit the httpd.conf file setting ServerRoot and ServerName along with any file path values + to reflect your correct server settings
    • + +
    • Add SYS:/APACHE2 to the search path, for example: +

      SEARCH ADD SYS:\APACHE2

      +
    • + +
    + +

    Follow these steps to install Apache on NetWare manually + from your own build source (assuming you will install to + sys:/apache2):

    + +
      +
    • Create a directory called Apache2 on a + NetWare volume
    • + +
    • Copy APACHE2.NLM, APRLIB.NLM + to SYS:/APACHE2
    • + +
    • Create a directory under SYS:/APACHE2 + called BIN
    • + +
    • Copy HTDIGEST.NLM, HTPASSWD.NLM, + HTDBM.NLM, LOGRES.NLM, ROTLOGS.NLM + to SYS:/APACHE2/BIN
    • + +
    • Create a directory under SYS:/APACHE2 + called CONF
    • + +
    • Copy the HTTPD-STD.CONF file to the + SYS:/APACHE2/CONF directory and rename to + HTTPD.CONF
    • + +
    • Copy the MIME.TYPES, CHARSET.CONV and + MAGIC files to SYS:/APACHE2/CONF directory
    • + +
    • Copy all files and subdirectories in \HTTPD-2.0\DOCS\ICONS + to SYS:/APACHE2/ICONS
    • + +
    • Copy all files and subdirectories in \HTTPD-2.0\DOCS\MANUAL + to SYS:/APACHE2/MANUAL
    • + +
    • Copy all files and subdirectories in \HTTPD-2.0\DOCS\ERROR + to SYS:/APACHE2/ERROR
    • + +
    • Copy all files and subdirectories in \HTTPD-2.0\DOCS\DOCROOT + to SYS:/APACHE2/HTDOCS
    • + +
    • Create the directory SYS:/APACHE2/LOGS + on the server
    • + +
    • Create the directory SYS:/APACHE2/CGI-BIN + on the server
    • + +
    • Create the directory SYS:/APACHE2/MODULES + and copy all nlm modules into the modules directory
    • + +
    • Edit the HTTPD.CONF file searching for all + @@Value@@ markers and replacing them with the + appropriate setting
    • + +
    • Add SYS:/APACHE2 to the search path, for example: +

      SEARCH ADD SYS:\APACHE2

      +
    • +
    + +

    Apache may be installed to other volumes besides the default SYS volume.

    + +

    During the build process, adding the keyword "install" to the makefile command line + will automatically produce a complete distribution package under the subdirectory + DIST. Install Apache by simply copying the distribution that was produced + by the makfiles to the root of a NetWare volume (see: Compiling Apache for + NetWare below).

    + +
    top
    +
    +

    Running Apache for NetWare

    + + + +

    To start Apache just type apache at the + console. This will load apache in the OS address space. If you + prefer to load Apache in a protected address space you may + specify the address space with the load statement as follows:

    + +

    + load address space = apache2 apache2 +

    + +

    This will load Apache into an address space called apache2. + Running multiple instances of Apache concurrently on NetWare is + possible by loading each instance into its own protected + address space.

    + +

    After starting Apache, it will be listening to port 80 + (unless you changed the Listen + directive in the configuration files). + To connect to the server and access the default page, + launch a browser and enter the server's name or address. This + should respond with a welcome page, and a link to the Apache + manual. If nothing happens or you get an error, look in the + error_log file in the logs + directory.

    + +

    Once your basic installation is working, you should + configure it properly by editing the files in the + conf directory.

    + +

    To unload Apache running in the OS address space just type + the following at the console:

    + +

    + unload apache2 +

    + +

    or

    + +

    + apache2 shutdown +

    + +

    If apache is running in a protected address space specify the + address space in the unload statement:

    + +

    + unload address space = apache2 apache2 +

    + +

    When working with Apache it is important to know how it will + find the configuration files. You can specify a configuration + file on the command line in two ways:

    + +
      +
    • -f specifies a path to a particular + configuration file
    • +
    + +

    + apache2 -f "vol:/my server/conf/my.conf" +

    + +

    + apache -f test/test.conf +

    + +

    In these cases, the proper ServerRoot + should be set in the configuration file.

    + +

    If you don't specify a configuration file name with -f, + Apache will use the file name compiled into the server, usually + conf/httpd.conf. Invoking Apache with the -V + switch will display this value labeled as SERVER_CONFIG_FILE. + Apache will then determine its ServerRoot + by trying the following, in this order:

    + +
      +
    • A ServerRoot directive via a + -C switch.
    • + +
    • The -d switch on the command line.
    • + +
    • Current working directory
    • + +
    • The server root compiled into the server.
    • +
    + +

    The server root compiled into the server is usually sys:/apache2. + invoking apache with the -V switch will display this value labeled as + HTTPD_ROOT.

    + +

    Apache 2.0 for NetWare includes a set of command line directives that can + be used to modify or display information about the running instance of the + web server. These directives are only available while Apache is running. Each + of these directives must be preceded by the keyword APACHE2.

    + +
    +
    RESTART
    +
    Instructs Apache to terminate all running worker + threads as they become idle, reread the configuration file and restart each + worker thread based on the new configuration.
    + +
    VERSION
    +
    Displays version information about the currently + running instance of Apache.
    + +
    MODULES
    +
    Displays a list of loaded modules both built-in + and external.
    + +
    DIRECTIVES
    +
    Displays a list of all available directives.
    + +
    SETTINGS
    +
    Enables or disables the thread status display + on the console. When enabled, the state of each running threads is displayed + on the Apache console screen.
    + +
    SHUTDOWN
    +
    Terminates the running instance of the Apache + web server.
    + +
    HELP
    +
    Describes each of the runtime directives.
    +
    + +

    By default these directives are issued against the instance of Apache running + in the OS address space. To issue a directive against a specific instance running + in a protected address space, include the -p parameter along with the name of the + address space. For more information type "apache2 Help" on the command line.

    + +
    top
    +
    +

    Configuring Apache for NetWare

    + + + +

    Apache is configured by reading configuration files usually stored + in the conf directory. These are the same as files used + to configure the Unix version, but there are a few different directives for + Apache on NetWare. See the Apache + documentation for all the available directives.

    + +

    The main differences in Apache for NetWare are:

    + +
      +
    • +

      Because Apache for NetWare is multithreaded, it does not + use a separate process for each request, as Apache does on some Unix + implementations. Instead there are only threads running: a parent + thread, and multiple child or worker threads which handle the requests.

      + +

      Therefore the "process"-management directives are different:

      + +

      MaxRequestsPerChild - + Like the Unix directive, this controls how many requests + a worker thread will serve before exiting. The recommended default, + MaxRequestsPerChild 0, causes the thread to continue servicing + request indefinitely. It is recommended on NetWare, unless there is some + specific reason, that this directive always remain set to 0.

      + +

      StartThreads - + This directive tells the server how many threads it should start initially. + The recommended default is StartThreads 50.

      + +

      MinSpareThreads - + This directive instructs the server to spawn additional worker threads + if the number of idle threads ever falls below this value. The recommended + default is MinSpareThreads 10.

      + +

      MaxSpareThreads - + This directive instructs the server to begin terminating worker threads + if the number of idle threads ever exceeds this value. The recommended + default is MaxSpareThreads 100.

      + +

      MaxThreads - + This directive limits the total number of work threads to a maximum + value. The recommended default is ThreadsPerChild 250.

      + +

      ThreadStackSize - + This directive tells the server what size of stack to use + for the individual worker thread. The recommended default + is ThreadStackSize 65536.

      +
    • + +
    • +

      The directives that accept filenames as arguments must use + NetWare filenames instead of Unix names. However, because Apache + uses Unix-style names internally, forward slashes must be used + rather than backslashes. It is recommended that all rooted file paths + begin with a volume name. If omitted, Apache will assume the + SYS: volume which may not be correct.

      +
    • + +
    • +

      Apache for NetWare has the ability to load modules at + runtime, without recompiling the server. If Apache is + compiled normally, it will install a number of optional + modules in the \Apache2\modules directory. + To activate these, or other modules, the LoadModule directive + must be used. For example, to active the status module, use + the following:

      + +

      + LoadModule status_module modules/status.nlm +

      + +

      Information on creating loadable + modules is also available.

      +
    • +
    + +

    Additional NetWare specific directives:

    + + + +
      +
    • CGIMapExtension - + This directive maps a CGI file extension to a script interpreter.
    • +
    +
      +
    • SecureListen - + Enables SSL encryption for a specified port.
    • +
    +
      +
    • NWSSLTrustedCerts - + Adds trusted certificates that are used to create secure connections to proxied servers.
    • +
    +
      +
    • NWSSLUpgradeable - + Allow a connection created on the specified address/port to be upgraded to an SSL connection.
    • +
    + + + +
    top
    +
    +

    Compiling Apache for NetWare

    + + + +

    Compiling Apache requires MetroWerks CodeWarrior 6.x or higher. Once + Apache has been built, it can be installed to the root of any NetWare + volume. The default is the sys:/Apache2 directory.

    + +

    Before running the server you must fill out the conf + directory. Copy the file HTTPD-STD.CONF from the distribution + conf directory and rename it to HTTPD.CONF. + Edit the HTTPD.CONF file searching for all @@Value@@ + markers and replacing them with the appropriate setting. Copy over + the conf/magic and conf/mime.types files as well. + Alternatively, a complete distribution can be built by including the keyword + install when invoking the makefiles.

    + +

    Requirements:

    + + + +

    The following development tools are required to build + Apache 2.0 for NetWare:

    + + + + + +

    Building Apache using the NetWare makefiles:

    + + + +
      +
    • Set the environment variable NOVELLLIBC to the + location of the NetWare Libraries for C SDK, for example: +

      Set NOVELLLIBC=c:\novell\ndk\libc

      +
    • + +
    • Set the environment variable METROWERKS to the + location where you installed the Metrowerks CodeWarrior compiler, + for example: +

      Set METROWERKS=C:\Program Files\Metrowerks\CodeWarrior

      + If you installed to the default location C:\Program + Files\Metrowerks\CodeWarrior, you don't need to set this.
    • + +
    • Set the environment variable LDAPSDK to the + location where you installed the LDAP Libraries for C, for example: +

      Set LDAPSDK=c:\Novell\NDK\cldapsdk\NetWare\libc

      +
    • + +
    • Set the environment variable ZLIBSDK to the + location where you installed the source code for the ZLib Library, + for example: +

      Set ZLIBSDK=D:\NOVELL\zlib

      +
    • + +
    • Set the environment variable AP_WORK to the full path of + the \httpd-2.0 directory.
    • + +
    • Set the environment variable APR_WORK to the full path of + the \httpd-2.0\srclib\apr directory.
    • + +
    • Make sure that the path to the AWK utility and the GNU make utility + (gmake.exe) have been included in the system's + PATH environment variable.
    • + +
    • Download the source code and unzip to an appropriate directory on + your workstation.
    • + +
    • Change directory to \httpd-2.0\srclib\apr-util\uri and build + GENURI.nlm by running "gmake -f nwgnumakefile".
    • + +
    • Copy the file GENURI.nlm to the SYS: volume + of a NetWare server and run using the following command: +

      SYS:\genuri > sys:\uri_delims.h

      +
    • + +
    • Copy the file uri_delims.h to the directory + \httpd-2.0\srclib\apr-util\uri on the build machine.
    • + +
    • Change directory to \httpd-2.0\srclib\apr and build APR + by running "gmake -f nwgnumakefile"
    • + +
    • Change directory to \httpd-2.0\srclib\pcre and build + DFTABLES.nlm by running "gmake -f nwgnumakefile"
    • + +
    • Change directory to \httpd-2.0\server and build + GENCHARS.nlm by running "gmake -f nwgnumakefile"
    • + +
    • Copy the files GENCHARS.nlm and DFTABLES.nlm + from their respective directories to the SYS: volume of a + NetWare server and run them using the following commands: +

      + SYS:\genchars > sys:\test_char.h
      + SYS:\dftables > sys:\chartables.c
      +

      +
    • + +
    • Copy the files test_char.h and chartables.c + to the directory \httpd-2.0\os\netware on the build machine.
    • + +
    • Change directory to \httpd-2.0 and build Apache by running + "gmake -f nwgnumakefile". You can create a distribution directory by + adding an install parameter to the command, for example: +

      gmake -f nwgnumakefile install

      +
    • +
    + + + +

    Additional make options

    + + + +
      +
    • gmake -f nwgnumakefile

      Builds release versions of all of the + binaries and copies them to a \release destination directory.

    • + +
    • gmake -f nwgnumakefile DEBUG=1

      Builds debug versions of all of the + binaries and copies them to a \debug destination directory.

    • + +
    • gmake -f nwgnumakefile install

      Creates a complete Apache + distribution with binaries, docs and additional support files in a + \dist\Apache2 directory.

    • + +
    • gmake -f nwgnumakefile installdev

      Same as install but also creates a + \lib and \include directory in the destination directory + and copies headers and import files.

    • + +
    • gmake -f nwgnumakefile clean

      Cleans all object files and binaries + from the \release or \debug build areas depending on whether + DEBUG has been defined.

    • + +
    • gmake -f nwgnumakefile clobber_all

      Same as clean and also deletes + the distribution directory if it exists.

    • +
    + + + +
    +
    +

    Available Languages:  en  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/platform/netware.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/platform/netware.html.ko.euc-kr new file mode 100644 index 00000000..fa57fc44 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/platform/netware.html.ko.euc-kr @@ -0,0 +1,579 @@ + + + +Novell NetWare¿¡¼­ ¾ÆÆÄÄ¡ »ç¿ëÇϱâ - Apache HTTP Server + + + + + +
    <-
    +

    Novell NetWare¿¡¼­ ¾ÆÆÄÄ¡ »ç¿ëÇϱâ

    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + ko 

    +
    + + +

    ÀÌ ¹®¼­´Â Novell NetWare 6.0 À̻󿡼­ ¾ÆÆÄÄ¡ 2.0À» ¼³Ä¡, + ¼³Á¤, ½ÇÇàÇÏ´Â ¹æ¹ýÀ» ¼³¸íÇÑ´Ù. ¹ö±×¸¦ ã¾Ò°Å³ª ´Ù¸¥ ¹æ¹ýÀ¸·Î + µ½°í½Í´Ù¸é, ¹ö±× + º¸°í ÆäÀÌÁö¸¦ ÀÌ¿ëÇÏ±æ ¹Ù¶õ´Ù.

    + +

    ¹ö±× º¸°í ÆäÀÌÁö³ª dev-httpd ¸ÞÀϸµ¸®½ºÆ®´Â ¾ÆÆÄÄ¡ ¼³Á¤°ú + ½ÇÇà¿¡ ´ëÇÑ Áú¹®À» ´äÇÏÁö ¾Ê´Â´Ù. ¹ö±×¸¦ º¸°íÇϱâ + Àü¿¡ ¸ÕÀú ÀÌ ¹®¼­¿Í ÀÚÁÖ ¹°¾îº¸´Â Áú¹® + (FAQ) ÆäÀÌÁö, ´Ù¸¥ °ü·Ã¹®¼­¸¦ »ìÆìºÁ¶ó. ±×·¡µµ ±Ã±ÝÇÑ + Á¡À̳ª ¹®Á¦°¡ ÀÖ´Ù¸é, NetWare¿¡¼­ ¾ÆÆÄÄ¡ »ç¿ë¿¡ ´ëÇÑ ¾î·Æ°í + »õ·Î¿î Áú¹®À» ´äÇØÁÙ ¸¹Àº ¾ÆÆÄÄ¡ »ç¿ëÀÚ°¡ ÀÖ´Â + novell.devsup.webserver ´º½º±×·ì¿¡ ±ÛÀ» ¿Ã¸®±æ ¹Ù¶õ´Ù.

    + +

    ÀÌ ¹®¼­´Â ¹ÙÀ̳ʸ® ¹èÆ÷º»À¸·Î ¾ÆÆÄÄ¡¸¦ ¼³Ä¡Çß´Ù°í °¡Á¤ÇÑ´Ù. + (¾Æ¸¶µµ °³¹ß¿¡ µµ¿òÀ» Áְųª ¹ö±×¸¦ ã±âÀ§ÇØ) Á÷Á¢ ¾ÆÆÄÄ¡¸¦ + ÄÄÆÄÀÏÇÏ·Á¸é ¾Æ·¡ NetWare¿¡¼­ ¾ÆÆÄÄ¡ + ÄÄÆÄÀÏÇϱâ ÀýÀ» Âü°íÇ϶ó.

    + +
    + +
    top
    +
    +

    ¿ä±¸Á¶°Ç

    + + + +

    ¾ÆÆÄÄ¡ 2.0Àº NetWare 6.0 service pack 3 À̻󿡼­ µ¿ÀÛÇϵµ·Ï + ¼³°èµÇ¾ú´Ù. SP3º¸´Ù ³·Àº service packÀ» »ç¿ëÇÑ´Ù¸é ÃֽŠ+ NetWare + Libraries for C (LibC)¸¦ ¼³Ä¡ÇØ¾ß ÇÑ´Ù.

    + +

    NetWare service packÀº ¿©±â¿¡ + ÀÖ´Ù.

    + +

    ÃֽŠservice packÀ̳ª ÃֽŠ¹öÀü NetWare + Libraries for C (LibC)¸¦ ¼³Ä¡Çß´Ù¸é NetWare 5.1 ȯ°æ¿¡¼­µµ + NetWare¿ë ¾ÆÆÄÄ¡ 2.0À» ½ÇÇàÇÒ ¼ö ÀÖ´Ù. °æ°í: + NetWare¿ë ¾ÆÆÄÄ¡ 2.0Àº ÀÌ È¯°æÀ» °í·ÁÇÏÁö ¾Ê¾Ò°í Å×½ºÆ®ÇÏÁö + ¾Ê¾Ò´Ù.

    + +
    top
    +
    +

    NetWare¿ë ¾ÆÆÄÄ¡ ´Ù¿î¹Þ±â

    + + + +

    ¾ÆÆÄÄ¡ ÃֽŠ¹öÀü¿¡ ´ëÇÑ Á¤º¸´Â http://www.apache.org/¿¡¼­ + (¾ÆÆÄÄ¡ À¥¼­¹ö) ãÀ» ¼ö ÀÖ´Ù. ¿©±â¿¡´Â ÇöÀç ¹öÀü°ú ÃÖ±Ù + ¾ËÆÄ/º£Å¸Å×½ºÆ® ¹öÀü, ¹Ì·¯ À¥»çÀÌÆ®¿Í ftp »çÀÌÆ® Á¤º¸°¡ + ÀÖ´Ù. NetWare¿ë ¾ÆÆÄÄ¡ 2.0ÀÇ ÃֽŠ¹ÙÀ̳ʸ® ¹èÆ÷º»Àº ¿©±â¿¡¼­ + ´Ù¿î¹ÞÀ» ¼ö ÀÖ´Ù.

    + +
    top
    +
    +

    NetWare¿ë ¾ÆÆÄÄ¡ ¼³Ä¡Çϱâ

    + + + +

    ÇöÀç NetWare¿ë ¾ÆÆÄÄ¡ ¼³Ä¡ÇÁ·Î±×·¥Àº ¾ø´Ù. NetWare¿ë + ¾ÆÆÄÄ¡ 2.0 ¼Ò½º¸¦ Á÷Á¢ ÄÄÆÄÀÏÇÑ´Ù¸é ÆÄÀÏÀ» ¼­¹ö·Î Á÷Á¢ + º¹»çÇØÁà¾ß ÇÑ´Ù.

    + +

    ¹ÙÀ̳ʸ®·Î ´Ù¿î¹ÞÀº NetWare¿ë ¾ÆÆÄÄ¡¸¦ ¼³Ä¡ÇÏ´Â °úÁ¤Àº + ´ÙÀ½°ú °°´Ù (sys:/apache2¿¡ ¼³Ä¡ÇÑ´Ù°í °¡Á¤ÇÑ´Ù):

    + +
      +
    • ¹ÙÀ̳ʸ®·Î ´Ù¿î¹ÞÀº ¾ÐÃàÆÄÀÏÀ» SYS: º¼·ý + ÃÖ»óÀ§ µð·ºÅ丮¿¡ Ǭ´Ù (´Ù¸¥ º¼·ý¿¡ ¼³Ä¡Çصµ µÈ´Ù)
    • + +
    • httpd.conf ÆÄÀÏÀ» ¼öÁ¤ÇÏ¿© ServerRoot¿Í ServerName°ú ÆÄÀÏ°æ·Î °ªÀ» ¼­¹ö¿¡ + ¾Ë¸Â°Ô ÁöÁ¤ÇÑ´Ù
    • + +
    • ¿¹¸¦ µé¾î

      SEARCH ADD SYS:\APACHE2

      ¿Í + °°ÀÌ °Ë»ö°æ·Î¿¡ SYS:/APACHE2¸¦ Ãß°¡ÇÑ´Ù +
    • + +
    + +

    Á÷Á¢ ¼Ò½º¸¦ ÄÄÆÄÀÏÇÑ °æ¿ì NetWare¿¡ ¾ÆÆÄÄ¡¸¦ ¼³Ä¡ÇÏ´Â + ¹æ¹ýÀº ´ÙÀ½°ú °°´Ù (sys:/apache2¿¡ ¼³Ä¡ÇÑ´Ù°í + °¡Á¤ÇÑ´Ù):

    + +
      +
    • NetWare º¼·ý¿¡ Apache2¶ó´Â µð·ºÅ丮¸¦ + ¸¸µç´Ù
    • + +
    • APACHE2.NLM°ú APRLIB.NLMÀ» + SYS:/APACHE2¿¡ º¹»çÇÑ´Ù
    • + +
    • SYS:/APACHE2 ¾Æ·¡¿¡ BINÀ̶ó´Â + µð·ºÅ丮¸¦ ¸¸µç´Ù
    • + +
    • HTDIGEST.NLM, HTPASSWD.NLM, + HTDBM.NLM, LOGRES.NLM, + ROTLOGS.NLMÀ» SYS:/APACHE2/BIN¿¡ + º¹»çÇÑ´Ù
    • + +
    • SYS:/APACHE2 ¾Æ·¡¿¡ CONF¶ó´Â + µð·ºÅ丮¸¦ ¸¸µç´Ù
    • + +
    • HTTPD-STD.CONF ÆÄÀÏÀ» + SYS:/APACHE2/CONF¿¡ º¹»çÇÏ°í ÆÄÀϸíÀ» + HTTPD.CONF·Î º¯°æÇÑ´Ù
    • + +
    • MIME.TYPES, CHARSET.CONV, + MAGIC ÆÄÀÏÀ» SYS:/APACHE2/CONF + µð·ºÅ丮¿¡ º¹»çÇÑ´Ù
    • + +
    • \HTTPD-2.0\DOCS\ICONS¿¡ ÀÖ´Â ¸ðµç ÆÄÀÏ°ú + ÇÏÀ§µð·ºÅ丮¸¦ SYS:/APACHE2/ICONS·Î º¹»çÇÑ´Ù
    • + +
    • \HTTPD-2.0\DOCS\MANUAL¿¡ ÀÖ´Â ¸ðµç ÆÄÀÏ°ú + ÇÏÀ§µð·ºÅ丮¸¦ SYS:/APACHE2/MANUAL·Î º¹»çÇÑ´Ù
    • + +
    • \HTTPD-2.0\DOCS\ERROR¿¡ ÀÖ´Â ¸ðµç ÆÄÀÏ°ú + ÇÏÀ§µð·ºÅ丮¸¦ SYS:/APACHE2/ERROR·Î º¹»çÇÑ´Ù
    • + +
    • \HTTPD-2.0\DOCS\DICROOT¿¡ ÀÖ´Â ¸ðµç ÆÄÀÏ°ú + ÇÏÀ§µð·ºÅ丮¸¦ SYS:/APACHE2/HTDOCS·Î º¹»çÇÑ´Ù
    • + +
    • ¼­¹ö¿¡ SYS:/APACHE2/LOGS µð·ºÅ丮¸¦ ¸¸µç´Ù
    • + +
    • ¼­¹ö¿¡ SYS:/APACHE2/APACHE2/CGI-BINÀ̶õ + µð·ºÅ丮¸¦ ¸¸µç´Ù
    • + +
    • SYS:/APACHE2/MODULES µð·ºÅ丮¸¦ ¸¸µé°í + ¸ðµç nlm ¸ðµâÀ» modules µð·ºÅ丮·Î º¹»çÇÑ´Ù
    • + +
    • HTTPD.CONF ÆÄÀÏÀÇ ¸ðµç @@Value@@ + Ç¥½Ã¸¦ ÀûÀýÇÑ ¼³Á¤À¸·Î ´ëüÇÑ´Ù
    • + +
    • SEARCH ADD SYS:\APACHE2

      °°ÀÌ °Ë»ö°æ·Î¿¡ + SYS:/APACHE2¸¦ Ãß°¡ÇÑ´Ù +
    • +
    + +

    ±âº» SYS º¼·ýÀÌ ¾Æ´Ñ ´Ù¸¥ º¼·ý¿¡µµ ¾ÆÆÄÄ¡¸¦ + ¼³Ä¡ÇÒ ¼ö ÀÖ´Ù.

    + +

    makefile ¸í·É¾î¿¡ "install" Å°¿öµå¸¦ »ç¿ëÇϸé ÄÄÆÄÀϽà + ÀÚµ¿À¸·Î DIST ÇÏÀ§µð·ºÅ丮¿¡ ¿ÏÀüÇÑ ¹èÆ÷º»À» + ¸¸µç´Ù. makefile·Î ¸¸µç ¹èÆ÷º»À» NetWare º¼·ý ÃÖ»óÀ§ µð·ºÅ丮·Î + º¹»çÇÏ¸é ¾ÆÆÄÄ¡°¡ ¼³Ä¡µÈ´Ù (¾Æ·¡ NetWare¿ë + ¾ÆÆÄÄ¡ ÄÄÆÄÀÏÇϱâ Âü°í).

    + +
    top
    +
    +

    NetWare¿ë ¾ÆÆÄÄ¡ ½ÇÇàÇϱâ

    + + + +

    ¾ÆÆÄÄ¡¸¦ ½ÃÀÛÇÏ·Á¸é Äֿܼ¡¼­ apache¸¦ ÀÔ·ÂÇϸé + µÈ´Ù. ±×·¯¸é ¿î¿µÃ¼Á¦ ÁÖ¼Ò¿µ¿ª¿¡ ¾ÆÆÄÄ¡¸¦ ÀоîµéÀδÙ. + º¸È£ÁÖ¼Ò¿µ¿ª¿¡ ¾ÆÆÄÄ¡¸¦ ÀоîµéÀÌ·Á¸é ´ÙÀ½°ú °°ÀÌ load ¸í·É¾î·Î + ÁÖ¼Ò¿µ¿ªÀ» ÁöÁ¤ÇÑ´Ù:

    + +

    + load address space = apache2 apache2 +

    + +

    ±×·¯¸é ¾ÆÆÄÄ¡¸¦ apache2¶ó´Â ÁÖ¼Ò¿µ¿ª¿¡ ÀоîµéÀδÙ. + NetWare´Â ¿©·¯ ¾ÆÆÄÄ¡¸¦ °¢°¢ ´Ù¸¥ º¸È£ÁÖ¼Ò¿µ¿ª¿¡ Àоîµé¿©¼­ + ¿©·¯ ¾ÆÆÄÄ¡¸¦ µ¿½Ã¿¡ ½ÇÇàÇÒ ¼ö ÀÖ´Ù.

    + +

    ¾ÆÆÄÄ¡°¡ ½ÃÀÛÇϸé (¼³Á¤ÆÄÀÏ¿¡¼­ Listen Áö½Ã¾î¸¦ ¼öÁ¤ÇÏÁö + ¾Ê´ÂÇÑ) Æ÷Æ® 80¹øÀ» ±â´Ù¸°´Ù. ºê¶ó¿ìÀú¸¦ ½ÃÀÛÇÏ¿© ¼­¹ö¸í + ȤÀº ¼­¹ö ÁÖ¼Ò¸¦ ÀÔ·ÂÇÏ¸é ¼­¹ö¿¡ Á¢¼ÓÇÏ¿© ±âº»ÆäÀÌÁö¿¡ + Á¢±ÙÇÑ´Ù. ¾ÆÆÄÄ¡ ¼³¸í¼­ ¸µÅ©°¡ Àִ ȯ¿µÆäÀÌÁö°¡ ³ª¿Í¾ß + ÇÑ´Ù. ¾Æ¹« Àϵµ ¾ø°Å³ª ¿À·ù°¡ ¹ß»ýÇϸé logs + µð·ºÅ丮¿¡ ÀÖ´Â error_log ÆÄÀÏÀ» »ìÆìºÁ¶ó.

    + +

    ±âº» ¼³Ä¡°¡ µ¿ÀÛÇϸé conf µð·ºÅ丮¿¡ ÀÖ´Â + ÆÄÀÏÀ» ÀûÀýÈ÷ ¼³Á¤ÇÑ´Ù.

    + +

    ¿î¿µÃ¼Á¦ ÁÖ¼Ò¿µ¿ª¿¡¼­ ½ÇÇàÁßÀÎ ¾ÆÆÄÄ¡¸¦ ³»¸±·Á¸é Äֿܼ¡ + ´ÙÀ½°ú °°ÀÌ ÀÔ·ÂÇÑ´Ù:

    + +

    + unload apache2 +

    + +

    ȤÀº

    + +

    + apache2 shutdown +

    + +

    º¸È£ÁÖ¼Ò¿µ¿ª¿¡¼­ ¾ÆÆÄÄ¡¸¦ ½ÇÇàÇß´Ù¸é unload ¸í·É¾î¿¡ + ÁÖ¼Ò¿µ¿ªÀ» ÁöÁ¤ÇÑ´Ù:

    + +

    + unload address space = apache2 apache2 +

    + +

    ¾ÆÆÄÄ¡°¡ ¼³Á¤ÆÄÀÏ À§Ä¡¸¦ ã´Â ¹æ¹ýÀ» ¾Ë¾ÆµÎ¾î¾ß ÇÑ´Ù. + ¸í·ÉÇà¿¡¼­ ¼³Á¤ÆÄÀÏÀ» ÁöÁ¤ÇÏ´Â ¹æ¹ýÀº µÎ°¡Áö´Ù:

    + +
      +
    • -f´Â ƯÁ¤ ¼³Á¤ÆÄÀÏ °æ·Î¸¦ ÁöÁ¤ÇÑ´Ù
    • +
    + +

    + apache2 -f "vol:/my server/conf/my.conf" +

    + +

    + apache -f test/test.conf +

    + +

    ÀÌ °æ¿ì ¼³Á¤ÆÄÀÏÀº ¿Ã¹Ù¸¥ ServerRoot¸¦ ¼³Á¤ÇØ¾ß ÇÑ´Ù.

    + +

    -f·Î ¼³Á¤ÆÄÀϸíÀ» ÁöÁ¤ÇÏÁö ¾ÊÀ¸¸é, ¾ÆÆÄÄ¡´Â + ¼­¹ö¿¡ ÄÄÆÄÀÏµÈ ÆÄÀϸíÀ» (º¸Åë conf/httpd.conf) + »ç¿ëÇÑ´Ù. -V ¿É¼ÇÀ¸·Î ¾ÆÆÄÄ¡¸¦ ½ÃÀÛÇϸé + SERVER_CONFIG_FILEÀ̶ó´Â Ç׸ñÀ» º¸¿©ÁØ´Ù. + ¾ÆÆÄÄ¡´Â ´ÙÀ½ ¼ø¼­´ë·Î ServerRoot¸¦ ã´Â´Ù:

    + +
      +
    • -C ¿É¼ÇÀÇ ServerRoot Áö½Ã¾î.
    • + +
    • ¸í·ÉÇàÀÇ -d ¿É¼Ç.
    • + +
    • ÇöÀç µð·ºÅ丮
    • + +
    • ¼­¹ö¿¡ ÄÄÆÄÀÏµÈ server root.
    • +
    + +

    ¼­¹ö¿¡ ÄÄÆÄÀÏµÈ server root´Â º¸Åë + sys:/apache2ÀÌ´Ù. -V ¿É¼ÇÀ¸·Î + ¾ÆÆÄÄ¡¸¦ ½ÃÀÛÇϸé HTTPD_ROOT¶ó´Â Ç׸ñÀ» º¸¿©ÁØ´Ù.

    + +

    NetWare¿ë ¾ÆÆÄÄ¡ 2.0¿¡´Â ½ÇÇàÁßÀÎ À¥¼­¹ö¸¦ Á×À̰ųª Á¤º¸¸¦ + ¾Ë·ÁÁÖ´Â ¸í·ÉÇà Áö½Ã¾î°¡ ÀÖ´Ù. À̵é Áö½Ã¾î´Â ¾ÆÆÄÄ¡ µ¿ÀÛÁß¿¡¸¸ + »ç¿ëÇÒ ¼ö ÀÖ´Ù. Áö½Ã¾î ¾Õ¿¡´Â APACHE2 Å°¿öµå¸¦ + ºÙ¿©¾ß ÇÑ´Ù.

    + +
    +
    RESTART
    +
    ¸ðµç ¾²·¹µå°¡ ½¬´Â »óÅÂÀ϶§ ¾ÆÆÄÄ¡¸¦ Á×ÀÌ°í, ¼³Á¤ÆÄÀÏÀ» + ´Ù½Ã ÀÐÀºÈÄ »õ·Î¿î ¼³Á¤¿¡ µû¶ó worker ¾²·¹µåµéÀ» Àç½ÃÀÛÇÑ´Ù.
    + +
    VERSION
    +
    ÇöÀç ½ÇÇàÁßÀÎ ¾ÆÆÄÄ¡ ¹öÀü Á¤º¸¸¦ Ãâ·ÂÇÑ´Ù.
    + +
    MODULES
    +
    ±âº» ¸ðµâ°ú ¿ÜºÎ ¸ðµâ ¸ñ·ÏÀ» Ãâ·ÂÇÑ´Ù.
    + +
    DIRECTIVES
    +
    ¸ðµç Áö½Ã¾î ¸ñ·ÏÀ» Ãâ·ÂÇÑ´Ù.
    + +
    SETTINGS
    +
    Äֿܼ¡ ¾²·¹µå »óÅ ǥ½Ã¸¦ º¸À̰ųª ¾ø¾Ø´Ù. »óŸ¦ + º¸À̸é, ¾ÆÆÄÄ¡ ÄܼÖâ¿¡ µ¿ÀÛÇÏ´Â ¾²·¹µåµéÀÇ »óÅ°¡ ³ª¿Â´Ù.
    + +
    SHUTDOWN
    +
    ½ÇÇàÁßÀÎ ¾ÆÆÄÄ¡ À¥¼­¹ö¸¦ Á×ÀδÙ.
    + +
    HELP
    +
    ½ÇÇà ¿É¼ÇµéÀ» ¼³¸íÇÑ´Ù.
    +
    + +

    ±âº»ÀûÀ¸·Î ÀÌ Áö½Ã¾îµéÀº ¿î¿µÃ¼Á¦ ÁÖ¼Ò¿µ¿ª¿¡¼­ ½ÇÇàÁßÀÎ + ¾ÆÆÄÄ¡¸¦ ´ë»óÀ¸·Î ÇÑ´Ù. ¾ÆÆÄÄ¡°¡ º¸È£ÁÖ¼Ò¿µ¿ª¿¡¼­ ½ÇÇàÁßÀ̶ó¸é, + -p¿Í ÁÖ¼Ò¿µ¿ª À̸§À» Ãß°¡ÇÑ´Ù. ´õ ¸¹Àº Á¤º¸¸¦ º¸·Á¸é ¸í·ÉÇà¿¡ + "apache2 Help"¸¦ ÀÔ·ÂÇÑ´Ù.

    + +
    top
    +
    +

    NetWare¿ë ¾ÆÆÄÄ¡ ¼³Á¤Çϱâ

    + + + +

    ¾ÆÆÄÄ¡´Â º¸Åë conf µð·ºÅ丮¿¡ ÀÖ´Â ¼³Á¤ÆÄÀÏ·Î + ¼³Á¤ÇÑ´Ù. ÀÌ ÆÄÀÏÀº À¯´Ð½º¿ë°ú °°Áö¸¸, NetWare¿ë ¾ÆÆÄÄ¡¿¡´Â + Á¶±Ý ´Ù¸¥ Áö½Ã¾îµéÀÌ ÀÖ´Ù. »ç¿ë°¡´ÉÇÑ ¸ðµç Áö½Ã¾î¿¡ ´ëÇؼ­´Â + ¾ÆÆÄÄ¡ ¹®¼­¸¦ Âü°íÇ϶ó.

    + +

    NetWare¿ë ¾ÆÆÄÄ¡ÀÇ ÁÖµÈ Â÷ÀÌÁ¡Àº:

    + +
      +
    • +

      NetWare¿ë ¾ÆÆÄÄ¡´Â ´ÙÁß¾²·¹µå ¹æ½ÄÀ» »ç¿ëÇϱ⶧¹®¿¡, + À¯´Ð½º¿Í °°ÀÌ ¿äû¸¶´Ù ´Ù¸¥ ÇÁ·Î¼¼½º¸¦ »ç¿ëÇÏÁö ¾Ê´Â´Ù. + ´ë½Å ¿©·¯ ¾²·¹µå¸¦ ½ÇÇàÇÑ´Ù: ºÎ¸ð ¾²·¹µå¿Í ¿äûÀ» ó¸®ÇÏ´Â + ¿©·¯ ÀÚ½Ä È¤Àº worker ¾²·¹µåµé.

      + +

      ±×·¯¹Ç·Î "ÇÁ·Î¼¼½º"-°ü¸® Áö½Ã¾î°¡ ´Ù¸£´Ù:

      + +

      MaxRequestsPerChild - + À¯´Ð½º¿Í °°ÀÌ worker ¾²·¹µå°¡ ¿äûÀ» ¾ó¸¶¸¸Å­ ó¸®ÇÏ°í + Á×À»Áö¸¦ Á¶Á¤ÇÑ´Ù. ±ÇÀåÇÏ´Â ±âº»°ª + MaxRequestsPerChild 0À» »ç¿ëÇÏ¸é ¾²·¹µå´Â + Á×Áö¾Ê°í ¿µ¿øÈ÷ ¿äûÀ» ¼­ºñ½ºÇÑ´Ù. Ưº°ÇÑ ÀÌÀ¯°¡ ¾ø´Ù¸é + NetWare¿¡¼­´Â ÀÌ Áö½Ã¾î¸¦ 0À¸·Î ¼³Á¤Çϱæ + ±ÇÇÑ´Ù.

      + +

      StartThreads - + ÀÌ Áö½Ã¾î´Â ¼­¹ö°¡ óÀ½¿¡ ½ÃÀÛÇÒ ¾²·¹µå °³¼ö¸¦ °áÁ¤ÇÑ´Ù. + ±ÇÀåÇÏ´Â ±âº»°ªÀº StartThreads 50ÀÌ´Ù.

      + +

      MinSpareThreads - + ¼­¹ö´Â ½¬´Â(idle) ¾²·¹µå °³¼ö°¡ ÀÌ °ªº¸´Ù ÀûÀ¸¸é worker + ¾²·¹µå¸¦ ´õ ¸¸µç´Ù. ±ÇÀåÇÏ´Â ±âº»°ªÀº + MinSpareThreads 10ÀÌ´Ù.

      + +

      MaxSpareThreads - + ¼­¹ö´Â ½¬´Â ¾²·¹µå °³¼ö°¡ ÀÌ °ªº¸´Ù ¸¹À¸¸é worker ¾²·¹µå¸¦ + Á×À̱⠽ÃÀÛÇÑ´Ù. ±ÇÀåÇÏ´Â ±âº»°ªÀº + MaxSpareThreads 100ÀÌ´Ù.

      + +

      MaxThreads - + ÀÌ Áö½Ã¾î´Â worker ¾²·¹µåÀÇ ÃÖ´ë °³¼ö¸¦ Á¦ÇÑÇÑ´Ù. ±ÇÀåÇÏ´Â + ±âº»°ªÀº ThreadsPerChild 250ÀÌ´Ù.

      + +

      ThreadStackSize - + ÇÑ worker ¾²·¹µå°¡ »ç¿ëÇÒ ½ºÅà ũ±â¸¦ Áö½ÃÇÑ´Ù. ±ÇÀåÇÏ´Â + ±âº»°ªÀº ThreadStackSize 65536ÀÌ´Ù.

      +
    • + +
    • +

      ¾Æ±Ô¸ÕÆ®·Î ÆÄÀϸíÀ» ¹Þ´Â Áö½Ã¾î¿¡´Â À¯´Ð½º ÆÄÀϸíÀÌ + ¾Æ´Ñ NetWare ÆÄÀϸíÀ» »ç¿ëÇØ¾ß ÇÑ´Ù. ±×·¯³ª ¾ÆÆÄÄ¡°¡ + ³»ºÎÀûÀ¸·Î À¯´Ð½º½Ä ÆÄÀϸíÀ» »ç¿ëÇϱ⶧¹®¿¡ ¹é½½·¡½¬ + ´ë½Å ½½·¡½¬¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù. ¸ðµç Àý´ë°æ·Î¿¡ º¼·ý¸íÀ» + Æ÷ÇÔÇÏ±æ ¹Ù¶õ´Ù. º¼·ý¸íÀ» »ý·«ÇÏ¸é ¾ÆÆÄÄ¡´Â + SYS: º¼·ýÀ̶ó°í À߸ø °¡Á¤ÇÒ ¼ö ÀÖ´Ù.

      +
    • + +
    • +

      NetWare¿ë ¾ÆÆÄÄ¡´Â ¼­¹ö¸¦ ´Ù½Ã ÄÄÆÄÀÏÇÏÁö ¾Ê°í ½ÇÇàÇÒ¶§ + ¸ðµâÀ» ÀоîµéÀÏ ¼ö ÀÖ´Ù. º¸Åë ¾ÆÆÄÄ¡¸¦ ÄÄÆÄÀÏÇϸé + \Apache2\modules µð·ºÅ丮¿¡ ¿©·¯ Ãß°¡ ¸ðµâÀ» + ¼³Ä¡ÇÑ´Ù. À̵é ȤÀº ´Ù¸¥ ¸ðµâÀ» »ç¿ëÇÏ·Á¸é LoadModule Áö½Ã¾î¸¦ »ç¿ëÇÑ´Ù. + ¿¹¸¦ µé¾î status ¸ðµâÀ» »ç¿ëÇÑ´Ù¸é:

      + +

      + LoadModule status_module modules/status.nlm +

      + +

      ÀоîµéÀÏ ¼ö + ÀÖ´Â ¸ðµâ ¸¸µé±â¿¡ ´ëÇÑ Á¤º¸µµ ÀÖ´Ù.

      +
    • +
    + +

    ÀÌ¿ÜÀÇ NetWare Àü¿ë Áö½Ã¾îµé:

    + + + +
      +
    • CGIMapExtension - + CGI ÆÄÀÏ È®ÀåÀÚ¸¦ ½ºÅ©¸³Æ® ÀÎÅÍÇÁ¸®ÅÍ¿Í ¿¬°áÇÑ´Ù.
    • +
    +
      +
    • SecureListen - + ƯÁ¤ Æ÷Æ®¸¦ SSL ¾ÏȣȭÇÑ´Ù.
    • +
    +
      +
    • NWSSLTrustedCerts - + ÇÁ·Ï½ÃÇÏ´Â ¼­¹ö¿¡ º¸¾È¿¬°áÇÒ¶§ »ç¿ëÇÒ ½Å·ÚÇÏ´Â + ÀÎÁõ¼­(certificate)¸¦ Ãß°¡ÇÑ´Ù.
    • +
    +
      +
    • NWSSLUpgradeable - + ƯÁ¤ ÁÖ¼Ò/Æ÷Æ®·Î ¸Î¾îÁø ¿¬°áÀ» SSL ¿¬°á·Î º¯°æÇÒ ¼ö + ÀÖ´Ù.
    • +
    + + + +
    top
    +
    +

    Netware¿ë ¾ÆÆÄÄ¡ ÄÄÆÄÀÏÇϱâ

    + + + +

    ¾ÆÆÄÄ¡¸¦ ÄÄÆÄÀÏÇÏ·Á¸é MetroWerks CodeWarrior 6.x ÀÌ»óÀÌ + ÇÊ¿äÇÏ´Ù. ¾ÆÆÄÄ¡¸¦ ÄÄÆÄÀÏÇÏ¸é ¾î¶² Netware º¼·ý¿¡¶óµµ ¼³Ä¡ÇÒ + ¼ö ÀÖ´Ù. ±âº»°ªÀº sys:/Apache2 µð·ºÅ丮´Ù.

    + +

    ¼­¹ö¸¦ ½ÇÇàÇϱâ Àü¿¡ conf µð·ºÅ丮¸¦ ÀÛ¼ºÇØ¾ß + ÇÑ´Ù. ¹èÆ÷º»ÀÇ conf µð·ºÅ丮¿¡ ÀÖ´Â + HTTPD-STD.CONF ÆÄÀϸíÀ» HTTPD.CONF·Î + º¯°æÇÑ´Ù. HTTPD.CONF ÆÄÀÏ¿¡¼­ @@Value@@ + Ç¥½Ã¸¦ ã¾Æ¼­ ÀûÀýÇÑ ¼³Á¤À¸·Î ´ëüÇÑ´Ù. conf/magic°ú + conf/mime.types ÆÄÀϵµ º¹»çÇÑ´Ù. ¾Æ´Ï¸é makefileÀ» + ½ÇÇàÇÒ¶§ install Å°¿öµå¸¦ »ç¿ëÇÏ¸é ¿ÏÀüÇÑ ¹èÆ÷º»À» + ¸¸µç´Ù.

    + +

    ¿ä±¸»çÇ×:

    + + + +

    NetWare¿ë ¾ÆÆÄÄ¡ 2.0À» ÄÄÆÄÀÏÇÏ·Á¸é ´ÙÀ½ °³¹ßµµ±¸°¡ + ÇÊ¿äÇÏ´Ù:

    + + + + + +

    NetWare makefileÀ» »ç¿ëÇÏ¿© ¾ÆÆÄÄ¡ ÄÄÆÄÀÏÇϱâ:

    + + + +
      +
    • NOVELLLIBC ȯ°æº¯¼ö¸¦ +

      Set NOVELLLIBC=c:\novell\ndk\libc

      ¿Í + °°ÀÌ NetWare Libraries for C SDK À§Ä¡·Î ¼³Á¤ÇÑ´Ù. +
    • + +
    • METROWERKS ȯ°æº¯¼ö¸¦ +

      Set METROWERKS=C:\Program Files\Metrowerks\CodeWarrior

      ¿Í + °°ÀÌ Metrowerks CodeWarrior ÄÄÆÄÀÏ·¯¸¦ ¼³Ä¡ÇÑ À§Ä¡·Î + ¼³Á¤ÇÑ´Ù. ±âº» À§Ä¡ÀÎ + C:\Program Files\Metrowerks\CodeWarrior¿¡ + ¼³Ä¡ÇÏ¿´´Ù¸é, ȯ°æº¯¼ö¸¦ ¼³Á¤ÇÒ ÇÊ¿ä´Â ¾ø´Ù.
    • + +
    • LDAPSDK ȯ°æº¯¼ö¸¦ +

      Set LDAPSDK=c:\Novell\NDK\cldapsdk\NetWare\libc

      ¿Í + °°ÀÌ LDAP Libraries for C¸¦ ¼³Ä¡ÇÑ À§Ä¡·Î ¼³Á¤ÇÑ´Ù. +
    • + +
    • ZLIBSDK ȯ°æº¯¼ö¸¦ +

      Set ZLIBSDK=D:\NOVELL\zlib

      °ú °°ÀÌ + ZLib ¶óÀ̺귯¸® ¼Ò½ºÄÚµå À§Ä¡·Î ¼³Á¤ÇÑ´Ù. +
    • + +
    • AP_WORK ȯ°æº¯¼ö¸¦ \httpd-2.0 + µð·ºÅ丮ÀÇ Àüü °æ·Î·Î ¼³Á¤ÇÑ´Ù.
    • + +
    • APR_WORK ȯ°æº¯¼ö¸¦ + \httpd-2.0\srclib\apr µð·ºÅ丮ÀÇ Àüü °æ·Î·Î + ¼³Á¤ÇÑ´Ù.
    • + +
    • AWK µµ±¸¿Í GNU make (gmake.exe) µµ±¸°¡ + ½Ã½ºÅÛÀÇ PATH ȯ°æº¯¼ö¿¡ Æ÷ÇÔµÇÀÖ´ÂÁö + È®ÀÎÇÑ´Ù.
    • + +
    • ¼Ò½ºÄڵ带 ´Ù¿î¹Þ¾Æ Àû´çÇÑ µð·ºÅ丮¿¡ ¾ÐÃàÀ» Ǭ´Ù.
    • + +
    • \httpd-2.0\srclib\apr-util\uri µð·ºÅ丮¿¡¼­ + "gmake -f nwgnumakefile"À» ½ÇÇàÇÏ¿© + GENURI.nlmÀ» ÄÄÆÄÀÏÇÑ´Ù.
    • + +
    • GENURI.nlm ÆÄÀÏÀ» NetWare ¼­¹öÀÇ + SYS: º¼·ýÀ¸·Î º¹»çÇÏ°í +

      SYS:\genuri > sys:\uri_delims.h

      + ¸í·ÉÀ» ½ÇÇàÇÑ´Ù. +
    • + +
    • uri_delims.h ÆÄÀÏÀ» ÄÄÆÄÀÏÇÏ´Â ÄÄÇ»ÅÍÀÇ + \httpd-2.0\srclib\apr-util\uri µð·ºÅ丮·Î + º¹»çÇÑ´Ù.
    • + +
    • \httpd-2.0\srclib\apr µð·ºÅ丮¿¡¼­ + "gmake -f nwgnumakefile"À» ½ÇÇàÇÏ¿© APRÀ» + ÄÄÆÄÀÏÇÑ´Ù.
    • + +
    • \httpd-2.0\srclib\pcre µð·ºÅ丮¿¡¼­ + "gmake -f nwgnumakefile"À» ½ÇÇàÇÏ¿© + DFTABLES.nlmÀ» ÄÄÆÄÀÏÇÑ´Ù.
    • + +
    • \httpd-2.0\server µð·ºÅ丮¿¡¼­ + "gmake -f nwgnumakefile"À» ½ÇÇàÇÏ¿© + GENCHARS.nlmÀ» ÄÄÆÄÀÏÇÑ´Ù.
    • + +
    • °¢ µð·ºÅ丮ÀÇ GENCHARS.nlm°ú + DFTABLES.nlm ÆÄÀÏÀ» NetWare ¼­¹öÀÇ + SYS: º¼·ýÀ¸·Î º¹»çÇÏ°í ´ÙÀ½°ú °°ÀÌ ½ÇÇàÇÑ´Ù: +

      + SYS:\genchars > sys:\test_char.h
      + SYS:\dftables > sys:\chartables.c
      +

      +
    • + +
    • test_char.h¿Í chartables.c + ÆÄÀÏÀ» ÄÄÆÄÀÏÇÏ´Â ÄÄÇ»ÅÍÀÇ \httpd-2.0\os\netware + µð·ºÅ丮·Î º¹»çÇÑ´Ù.
    • + +
    • \httpd-2.0 µð·ºÅ丮¿¡¼­ + "gmake -f nwgnumakefile"À» ½ÇÇàÇÏ¿© ¾ÆÆÄÄ¡¸¦ + ÄÄÆÄÀÏÇÑ´Ù. +

      gmake -f nwgnumakefile install

      °ú + °°ÀÌ install ÆĶó¹ÌÅ͸¦ Ãß°¡ÇÏ¸é ¹èÆ÷¿ë µð·ºÅ丮¸¦ ¸¸µé + ¼ö ÀÖ´Ù. +
    • +
    + + + +

    Ãß°¡ make ¿É¼Ç

    + + + +
      +
    • gmake -f nwgnumakefile

      ÀÏ¹Ý ½ÇÇàÆÄÀÏÀ» + ÄÄÆÄÀÏÇÏ¿© \release µð·ºÅ丮·Î º¹»çÇÑ´Ù.

    • + +
    • gmake -f nwgnumakefile DEBUG=1

      µð¹ö±×¿ë + ½ÇÇàÆÄÀÏÀ» ÄÄÆÄÀÏÇÏ¿© \debug µð·ºÅ丮·Î + º¹»çÇÑ´Ù.

    • + +
    • gmake -f nwgnumakefile install +

      \dist\Apache2 µð·ºÅ丮¿¡ ½ÇÇàÆÄÀÏ, ¹®¼­, + Ãß°¡ Áö¿øÆÄÀÏÀ» Æ÷ÇÔÇÑ ¿ÏÀüÇÑ ¾ÆÆÄÄ¡ ¹èÆ÷º»À» ¸¸µç´Ù.

    • + +
    • gmake -f nwgnumakefile installdev +

      install°ú ºñ½ÁÇÏÁö¸¸, \lib°ú + \include µð·ºÅ丮¸¦ ¸¸µé°í Çì´õÆÄÀÏ°ú import + ÆÄÀÏÀ» º¹»çÇÑ´Ù.

    • + +
    • gmake -f nwgnumakefile clean +

      DEBUG Á¤ÀÇ À¯¹«¿¡ µû¶ó \release³ª + \debug¿¡ ÀÖ´Â ¿ÀºêÁ§Æ®ÆÄÀÏ°ú ½ÇÇàÆÄÀÏÀ» + ¸ðµÎ Áö¿î´Ù.

    • + +
    • gmake -f nwgnumakefile clobber_all

      clean°ú + ºñ½ÁÇÏÁö¸¸ µð·ºÅ丮µµ Áö¿î´Ù.

    • +
    + + + +
    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/platform/perf-hp.html b/rubbos/app/httpd-2.0.64/docs/manual/platform/perf-hp.html new file mode 100644 index 00000000..951a04bd --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/platform/perf-hp.html @@ -0,0 +1,9 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: perf-hp.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: perf-hp.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR diff --git a/rubbos/app/httpd-2.0.64/docs/manual/platform/perf-hp.html.en b/rubbos/app/httpd-2.0.64/docs/manual/platform/perf-hp.html.en new file mode 100644 index 00000000..8ff50e52 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/platform/perf-hp.html.en @@ -0,0 +1,105 @@ + + + +Running a High-Performance Web Server on HPUX - Apache HTTP Server + + + + + +
    <-
    +

    Running a High-Performance Web Server on HPUX

    +
    +

    Available Languages:  en  | + ko 

    +
    + + +
    +Date: Wed, 05 Nov 1997 16:59:34 -0800
    +From: Rick Jones <raj@cup.hp.com>
    +Reply-To: raj@cup.hp.com
    +Organization: Network Performance
    +Subject: HP-UX tuning tips
    +
    + +

    Here are some tuning tips for HP-UX to add to the tuning page.

    + +

    For HP-UX 9.X: Upgrade to 10.20
    + For HP-UX 10.[00|01|10]: Upgrade to 10.20

    + +

    For HP-UX 10.20:

    + +

    Install the latest cumulative ARPA Transport Patch. This + will allow you to configure the size of the TCP connection + lookup hash table. The default is 256 buckets and must be set + to a power of two. This is accomplished with adb against the + *disc* image of the kernel. The variable name is tcp_hash_size. + Notice that it's critically important that you use "W" + to write a 32 bit quantity, not "w" to write a 16 bit + value when patching the disc image because the tcp_hash_size + variable is a 32 bit quantity.

    + +

    How to pick the value? Examine the output of ftp://ftp.cup.hp.com/dist/networking/tools/connhist + and see how many total TCP connections exist on the system. You + probably want that number divided by the hash table size to be + reasonably small, say less than 10. Folks can look at HP's + SPECweb96 disclosures for some common settings. These can be + found at http://www.specbench.org/. + If an HP-UX system was performing at 1000 SPECweb96 connections + per second, the TIME_WAIT time of 60 seconds would mean + 60,000 TCP "connections" being tracked.

    + +

    Folks can check their listen queue depths with ftp://ftp.cup.hp.com/dist/networking/misc/listenq.

    + +

    If folks are running Apache on a PA-8000 based system, they + should consider "chatr'ing" the Apache executable to have a + large page size. This would be "chatr +pi L <BINARY>". + The GID of the running executable must have MLOCK privileges. + Setprivgrp(1m) should be consulted for assigning + MLOCK. The change can be validated by running Glance + and examining the memory regions of the server(s) to make sure that + they show a non-trivial fraction of the text segment being locked.

    + +

    If folks are running Apache on MP systems, they might + consider writing a small program that uses mpctl() + to bind processes to processors. A simple pid % numcpu + algorithm is probably sufficient. This might even go into the + source code.

    + +

    If folks are concerned about the number of FIN_WAIT_2 + connections, they can use nettune to shrink the value of + tcp_keepstart. However, they should be careful there - + certainly do not make it less than oh two to four minutes. If + tcp_hash_size has been set well, it is probably OK to + let the FIN_WAIT_2's take longer to timeout (perhaps + even the default two hours) - they will not on average have a big + impact on performance.

    + +

    There are other things that could go into the code base, but + that might be left for another email. Feel free to drop me a + message if you or others are interested.

    + +

    sincerely,

    + +

    rick jones

    + +

    http://www.cup.hp.com/netperf/NetperfPage.html

    + +
    +
    +
    +

    Available Languages:  en  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/platform/perf-hp.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/platform/perf-hp.html.ko.euc-kr new file mode 100644 index 00000000..fa1568e2 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/platform/perf-hp.html.ko.euc-kr @@ -0,0 +1,100 @@ + + + +HPUX¿¡¼­ °í¼º´É À¥¼­¹ö ½ÇÇàÇϱâ - Apache HTTP Server + + + + + +
    <-
    +

    HPUX¿¡¼­ °í¼º´É À¥¼­¹ö ½ÇÇàÇϱâ

    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + ko 

    +
    + + +
    +Date: Wed, 05 Nov 1997 16:59:34 -0800
    +From: Rick Jones <raj@cup.hp.com>
    +Reply-To: raj@cup.hp.com
    +Organization: Network Performance
    +Subject: HP-UX tuning tips
    +
    + +

    ÀÌ ±ÛÀº ¼º´ÉÇâ»ó ÆäÀÌÁö¿¡ Ãß°¡ÇÒ HP-UX ¼º´ÉÇâ»ó ÆÁÀÌ´Ù.

    + +

    HP-UX 9.X´Â: 10.20À¸·Î ¾÷±×·¹À̵åÇ϶ó
    + HP-UX 10.[00|01|10]Àº: 10.20À¸·Î ¾÷±×·¹À̵åÇ϶ó

    + +

    HP-UX 10.20˼:

    + +

    ÃÖ±Ù ARPA Transport ÆÐÄ¡ ¸ðÀ½À» ¼³Ä¡ÇÑ´Ù. ±×·¯¸é TCP + ¿¬°áã±â Çؽ¬Å×À̺í Å©±â¸¦ ¼³Á¤ÇÒ ¼ö ÀÖ´Ù. ±âº»°ªÀº + 256 °³ÀÌ°í, 2ÀÇ °ÅµìÁ¦°ö°ªÀ¸·Î ÁöÁ¤ÇØ¾ß ÇÑ´Ù. adb·Î Ä¿³ÎÀÇ + *disc* À̹ÌÁö¸¦ ¼öÁ¤ÇÏ¿© ¼³Á¤ÇÑ´Ù. º¯¼ö¸íÀº + tcp_hash_sizeÀÌ´Ù. tcp_hash_size + º¯¼ö°ªÀÌ 32ºñÆ®À̹ǷΠdisc À̹ÌÁö¸¦ ¼öÁ¤ÇÒ¶§ ¹Ýµå½Ã 16ºñÆ® + °ªÀ» ±â·ÏÇÏ´Â "w" ´ë½Å 32ºñÆ® °ªÀ» ±â·ÏÇÏ´Â + "W"¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù.

    + +

    ¾î¶² °ªÀ» °í¸¦±î? ftp://ftp.cup.hp.com/dist/networking/tools/connhistÀÇ + °á°ú¸¦ º¸°í, ½Ã½ºÅÛ¿¡ Á¸ÀçÇÏ´Â TCP ¿¬°á ÃÑ°³¼ö¸¦ »ìÆìºÁ¶ó. + ÀÌ ¼ýÀÚ¸¦ Çؽ¬Å×À̺í Å©±â·Î ³ª´« °ªÀÌ »ó´çÈ÷ (10 ÀÌÇÏ) ÀÛÀ¸¸é + ÁÁ´Ù. HPÀÇ SPECweb96 °á°ú¿¡¼­ ÀϹÝÀûÀÎ ¼³Á¤À» º¼ ¼ö ÀÖ´Ù. + °á°ú´Â http://www.specbench.org/¿¡ + ÀÖ´Ù. HP-UX ½Ã½ºÅÛÀÌ ÃÊ´ç 1000¹ø SPECweb96 ¿¬°áÀ» ÇÏ´Â °æ¿ì + TIME_WAIT°¡ 60Ãʶó¸é 60,000°³ÀÇ TCP "¿¬°á"À» + ÃßÀûÇÑ´Ù´Â ¶æÀÌ´Ù.

    + +

    ftp://ftp.cup.hp.com/dist/networking/misc/listenq¸¦ + ½ÇÇàÇÏ¿© ½Ã½ºÅÛÀÇ ¿¬°á´ë±âÇà·Ä ±íÀ̸¦ ¾Ë ¼ö ÀÖ´Ù.

    + +

    PA-8000±â¹Ý ½Ã½ºÅÛ¿¡¼­ ¾ÆÆÄÄ¡¸¦ ½ÇÇàÇÑ´Ù¸é, ¾ÆÆÄÄ¡ + ½ÇÇàÆÄÀÏÀÌ Å« ÆäÀÌÁöÅ©±â¸¦ »ç¿ëÇϵµ·Ï "chatr"ÇÑ´Ù. ¸í·ÉÀº + "chatr +pi L <½ÇÇàÆÄÀÏ>"ÀÌ´Ù. ½ÇÇàÆÄÀÏÀ» + ½ÇÇàÇÏ´Â GID¿¡ MLOCK ±ÇÇÑÀÌ ¹Ýµå½Ã ÇÊ¿äÇÏ´Ù. + MLOCK ºÎ¿©¿¡ ´ëÇؼ­´Â Setprivgrp(1m)¸¦ + Âü°íÇ϶ó. ¼öÁ¤ÈÄ Glance¸¦ ½ÇÇàÇÏ¿© ¼­¹öÀÇ ¸Þ¸ð¸®¿µ¿ªÀ» »ìÆ캸¸é + »ó´çÇÑ text ¼¼±×¸ÕÆ®°¡ Àá°ÜÀÖÀ½À» È®ÀÎÇÒ ¼ö ÀÖ´Ù.

    + +

    ´ÙÁßÇÁ·Î¼¼½º ½Ã½ºÅÛ¿¡¼­ ¾ÆÆÄÄ¡¸¦ ½ÇÇàÇÑ´Ù¸é, ÇÁ·Î¼¼½º¸¦ + ÇÁ·Î¼¼½º¿¡ ¹èÁ¤ÇÏ´Â mpctl()¸¦ »ç¿ëÇÑ ÀÛÀº + ÇÁ·Î±×·¥À» ÀÛ¼ºÇغÁ¶ó. ´Ü¼øÇÑ pid % numcpu + ¾Ë°í¸®ÁòÀ¸·Îµµ ÃæºÐÇÒ °ÍÀÌ´Ù. ÀÌ ºÎºÐÀº ¾ÕÀ¸·Î ¼Ò½ºÄڵ忡 + Æ÷Ç﵃ ¼ö ÀÖ´Ù.

    + +

    FIN_WAIT_2 ¿¬°áÀÇ °³¼ö°¡ °ÆÁ¤½º·´´Ù¸é, + nettuneÀ» »ç¿ëÇÏ¿© tcp_keepstart °ªÀ» ÁÙÀÏ + ¼ö ÀÖ´Ù. ±×·¯³ª Á¶½ÉÇØ¾ß ÇÑ´Ù - 4ºÐ º¸´Ù ÀÛ°Ô ¼³Á¤ÇÏÁö ¸¶¶ó. + tcp_hash_size¸¦ Àß ¼³Á¤ÇÏ¿´´Ù¸é, + FIN_WAIT_2 °ªÀÌ Ä¿µµ (½ÉÁö¾î ±âº»°ªÀÎ 2½Ã°£µµ) + ¹®Á¦¾ø´Ù - º¸Åë ¼º´É¿¡ Å« ¿µÇâÀ» ÁÖÁö ¾Ê´Â´Ù.

    + +

    ¾ÕÀ¸·Î ¼Ò½ºÄڵ忡 Æ÷Ç﵃ ºÎºÐÀÌ ´õ ÀÖÁö¸¸, ¿©±â¼­ ÁÙÀδÙ. + °ü½ÉÀÌ ÀÖ´Ù¸é ¸ÞÀÏÀ» ÁÖ±æ ¹Ù¶õ´Ù.

    + +

    ±×·³ À̸¸,

    + +

    rick jones

    + +

    http://www.cup.hp.com/netperf/NetperfPage.html

    + +
    +
    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/platform/win_compiling.html b/rubbos/app/httpd-2.0.64/docs/manual/platform/win_compiling.html new file mode 100644 index 00000000..2ac828ca --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/platform/win_compiling.html @@ -0,0 +1,9 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: win_compiling.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: win_compiling.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR diff --git a/rubbos/app/httpd-2.0.64/docs/manual/platform/win_compiling.html.en b/rubbos/app/httpd-2.0.64/docs/manual/platform/win_compiling.html.en new file mode 100644 index 00000000..96a130a7 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/platform/win_compiling.html.en @@ -0,0 +1,431 @@ + + + +Compiling Apache for Microsoft Windows - Apache HTTP Server + + + + + +
    <-
    +

    Compiling Apache for Microsoft Windows

    +
    +

    Available Languages:  en  | + ko 

    +
    + + +

    There are many important points before you begin compiling + Apache. See Using Apache with Microsoft + Windows before you begin.

    + +
    + +
    top
    +
    +

    Requirements

    + + + +

    Compiling Apache requires the following environment to be + properly installed:

    + +
      +
    • +

      Disk Space

      +

      Make sure you have at least 50 MB of free disk space + available. After installation Apache requires approximately + 10 MB of disk space, plus space for log and cache files, + which can grow rapidly. The actual disk space requirements + will vary considerably based on your chosen configuration and + any third-party modules or libraries.

      +
    • + +
    • +

      Microsoft Visual C++ 5.0 or higher.

      +

      Apache can be built using the command line tools, or from + within the Visual Studio IDE Workbench. The command line + build requires the environment to reflect the PATH, + INCLUDE, LIB and other variables + that can be configured with the vcvars32 batch file:

      + +

      + "c:\Program Files\DevStudio\VC\Bin\vcvars32.bat" +

      +
    • + +
    • +

      The Windows Platform SDK.

      +

      Visual C++ 5.0 builds require an updated Microsoft Windows + Platform SDK to enable some Apache features. For command line + builds, the Platform SDK environment is prepared by the + setenv batch file:

      + +

      + "c:\Program Files\Platform SDK\setenv.bat" +

      + +

      The Platform SDK files distributed with Visual C++ 6.0 and + later are sufficient, so users of later version may skip + this requirement.

      + +
      Note that the Windows Platform SDK update is required + to enable all supported mod_isapi features. + Without a recent update, Apache will issue warnings under + MSVC++ 5.0 that some mod_isapi features + will be disabled. Look for the update at http://msdn.microsoft.com/downloads/sdks/platform/platform.asp.
      +
    • + +
    • +

      The awk utility (awk, gawk or similar).

      +

      To install Apache within the build system, several files are + modified using the awk.exe utility. awk was chosen since it + is a very small download (compared with Perl or WSH/VB) and + accomplishes the task of generating files. Brian Kernighan's + http://cm.bell-labs.com/cm/cs/who/bwk/ + site has a compiled native Win32 binary, + http://cm.bell-labs.com/cm/cs/who/bwk/awk95.exe which + you must save with the name awk.exe rather than + awk95.exe.

      + +
      Note that Developer Studio IDE will only find + awk.exe from the Tools menu Options... Directories + tab (the Projects - VC++ Directories pane in Developer Studio 7.0) + listing Executable file paths. Add the path for awk.exe + to this list, and your system PATH environment variable, + as needed.
      + +
      Also note that if you are using Cygwin (http://www.cygwin.com/) the awk utility is named gawk.exe and + that the file awk.exe is really a symlink to the gawk.exe + file. The Windows command shell does not recognize symlinks, and because of that + building InstallBin will fail. A workaround is to delete awk.exe from + the cygwin installation and rename gawk.exe to awk.exe.
      +
    • + +
    • +

      [Optional] OpenSSL libraries (for mod_ssl + and ab.exe with ssl support)

      +

      Caution: there are significant restrictions and + prohibitions on the use and distribution of strong cryptography + and patented intellectual property throughout the world. + OpenSSL includes strong cryptography controlled by both export + regulations and domestic law, as well as intellectual property + protected by patent, in the United States and elsewhere. Neither + the Apache Software Foundation nor the OpenSSL project can provide + legal advise regarding possession, use, or distribution of the code + provided by the OpenSSL project. Consult your own legal + counsel, you are responsible for your own actions.

      + +

      OpenSSL must be installed into a srclib subdirectory named + openssl, obtained from http://www.openssl.org/source/, in order to compile mod_ssl + or the abs project (ab.exe with SSL support.) To prepare OpenSSL + for both release and debug builds of Apache, and + disable the patent protected features in OpenSSL, you might use the following + build commands:

      + +

      + perl Configure VC-WIN32
      + perl util\mkfiles.pl >MINFO
      + perl util\mk1mf.pl dll no-asm no-mdc2 no-rc5 no-idea VC-WIN32 >makefile.rel
      + perl util\mk1mf.pl dll debug no-asm no-mdc2 no-rc5 no-idea VC-WIN32 >makefile.dbg
      + perl util\mkdef.pl 32 libeay no-asm no-mdc2 no-rc5 no-idea >ms\libeay32.def
      + perl util\mkdef.pl 32 ssleay no-asm no-mdc2 no-rc5 no-idea >ms\ssleay32.def
      + nmake -f makefile.rel
      + nmake -f makefile.dbg +

      + +

      Note; you can use the scripts in the ms\ subdirectory, however, + it's rather tricky to force ms\do_masm.bat, for example, to perform + the patent encumberances as mentioned above. Patches to add the $* argument list + to the appropriate .bat lines in these scripts aren't incorporated, thus far.

      +
    • + +
    • +

      [Optional] zlib sources (for mod_deflate)

      +

      Zlib must be installed into a srclib subdirectory named + zlib, however those sources need not be compiled. The build system + will compile the compression sources directly into the mod_deflate + module. Zlib can be obtained from http://www.zlib.net/ -- mod_deflate is confirmed to build + correctly with version 1.1.4. To use a later version of zlib, upgrade to + Apache HTTP Server release 2.2 or later.

      +
    • + +
    + +
    top
    +
    +

    Command-Line Build

    + + + +

    First, unpack the Apache distribution into an appropriate + directory. Open a command-line prompt and cd to that + directory.

    + +

    The master Apache makefile instructions are contained in the + Makefile.win file. To compile Apache on Windows + NT, simply use one of the following commands to compiled the + release or debug build, respectively:

    + +
    +nmake /f Makefile.win _apacher
    +
    +nmake /f Makefile.win _apached
    +    
    + +

    Either command will compile Apache. The latter will include + debugging information in the resulting files, making it easier + to find bugs and track down problems.

    + +
    top
    +
    +

    Developer Studio Workspace IDE Build

    + + + +

    Apache can also be compiled using VC++'s Visual Studio + development environment. To simplify this process, a + Visual Studio workspace, Apache.dsw, is provided. + This workspace exposes the entire list of working .dsp + projects that are required for the complete Apache binary release. + It includes dependencies between the projects to assure that they + are built in the appropriate order.

    + +

    Open the Apache.dsw workspace, and select + InstallBin (Release or Debug build, + as desired) as the Active Project. InstallBin causes all + related project to be built, and then invokes Makefile.win to + move the compiled executables and dlls. You may personalize the + INSTDIR= choice by changing InstallBin's Settings, + General tab, Build command line entry. INSTDIR defaults to the + /Apache2 directory. If you only want a test compile (without + installing) you may build the BuildBin project instead.

    + +

    The .dsp project files are distributed in Visual + C++ 6.0 format. Visual C++ 5.0 (97) will recognize them. Visual C++ + 7.0 (.net) must convert Apache.dsw plus the .dsp + files into an Apache.sln plus .msproj files, + be sure you reconvert the .msproj file if any of the source + .dsp files change! This is really trivial, just open + Apache.dsw in the VC++ 7.0 IDE once again.

    + +

    Visual C++ 7.0 (.net) users should also use the Build + menu, Configuration Manager dialog to uncheck both the Debug + and Release Solution modules abs, mod_ssl + and mod_deflate. + These modules are built by invoking nmake or the IDE directly + with the BinBuild target to build those modules explicitly, + only if the srclib directories openssl + and/or zlib exist.

    + +

    Exported .mak files pose a greater hassle, but they are + required for Visual C++ 5.0 users to build mod_ssl, + abs (ab with SSL support) and/or + mod_deflate. + VC++ 7.0 (.net) users also benefit, nmake builds + are faster than binenv builds. + Build the entire project from within the VC++ 5.0 or 6.0 IDE, + then use the Project Menu Export for all makefiles. + You must build the projects first in order to create all dynamic + auto-generated targets, so that dependencies can be parsed + correctly. Run the following command to fix the paths so they + will build anywhere:

    + +

    + perl srclib\apr\build\fixwin32mak.pl +

    + +

    You must type this command from the top level + directory of the httpd source tree. Every + .mak and .dep project file within + the current directory and below will be corrected, and the + timestamps adjusted to reflect the .dsp.

    + +

    If you contribute back a patch that revises project files, we + must commit project files in Visual Studio 6.0 format. Changes + should be simple, with minimal compilation and linkage flags that + will be recognized by all VC++ 5.0 through 7.0 environments.

    + +
    top
    +
    +

    Project Components

    + + + +

    The Apache.dsw workspace and makefile.win + nmake script both build the .dsp projects + of the Apache server in the following sequence:

    + +
      +
    1. srclib\apr\apr.dsp
    2. + +
    3. srclib\apr\libapr.dsp
    4. + +
    5. srclib\apr-util\uri\gen_uri_delims.dsp
    6. + +
    7. srclib\apr-util\xml\expat\lib\xml.dsp
    8. + +
    9. srclib\apr-util\aprutil.dsp
    10. + +
    11. srclib\apr-util\libaprutil.dsp
    12. + +
    13. srclib\pcre\dftables.dsp
    14. + +
    15. srclib\pcre\pcre.dsp
    16. + +
    17. srclib\pcre\pcreposix.dsp
    18. + +
    19. server\gen_test_char.dsp
    20. + +
    21. libhttpd.dsp
    22. + +
    23. Apache.dsp
    24. +
    + +

    In addition, the modules\ subdirectory tree contains + project files for the majority of the modules.

    + +

    The support\ directory contains project files for + additional programs that are not part of the Apache runtime, + but are used by the administrator to test Apache and maintain + password and log files. Windows-specific support projects are + broken out in the support\win32\ directory.

    + +
      +
    1. support\ab.dsp
    2. + +
    3. support\htdigest.dsp
    4. + +
    5. support\htpasswd.dsp
    6. + +
    7. support\logresolve.dsp
    8. + +
    9. support\rotatelogs.dsp
    10. + +
    11. support\win32\ApacheMonitor.dsp
    12. + +
    13. support\win32\wintty.dsp
    14. +
    + +

    Once Apache has been compiled, it needs to be installed in + its server root directory. The default is the + \Apache2 directory, of the same drive.

    + +

    To build and install all the files into the desired folder + dir automatically, use one of the following + nmake commands:

    + +
    +nmake /f Makefile.win installr INSTDIR=dir
    +
    +nmake /f Makefile.win installd INSTDIR=dir
    +    
    + +

    The dir argument to INSTDIR gives + the installation directory; it can be omitted if Apache is + to be installed into \Apache2.

    + +

    This will install the following:

    + +
      +
    • dir\bin\Apache.exe - Apache + executable
    • + +
    • dir\bin\ApacheMonitor.exe - Service + monitor taskbar icon utility
    • + +
    • dir\bin\htdigest.exe - Digest auth + password file utility
    • + +
    • dir\bin\htdbm.exe - SDBM auth + database password file utility
    • + +
    • dir\bin\htpasswd.exe - Basic auth + password file utility
    • + +
    • dir\bin\logresolve.exe - Log file + dns name lookup utility
    • + +
    • dir\bin\rotatelogs.exe - Log file + cycling utility
    • + +
    • dir\bin\wintty.exe - Console window + utility
    • + +
    • dir\bin\libapr.dll - Apache + Portable Runtime shared library
    • + +
    • dir\bin\libaprutil.dll - Apache + Utility Runtime shared library
    • + +
    • dir\bin\libhttpd.dll - Apache Core + library
    • + +
    • dir\modules\mod_*.so - Loadable + Apache modules
    • + +
    • dir\conf - Configuration + directory
    • + +
    • dir\logs - Empty logging + directory
    • + +
    • dir\include - C language header + files
    • + +
    • dir\lib - Link library files
    • +
    + +

    Warning about building Apache from the development tree

    + + + +
    Note only the .dsp files are maintained between release + builds. The .mak files are NOT regenerated, due to the tremendous + waste of reviewer's time. Therefore, you cannot rely on the NMAKE + commands above to build revised .dsp project files unless you + then export all .mak files yourself from the project. This is + unnecessary if you build from within the Microsoft + Developer Studio environment.
    + +
    Also note it is very worthwhile to build the BuildBin + target project (or the command line _apacher or + _apached target) prior to exporting the make files. + Many files are autogenerated in the build process. Only a full + build provides all of the dependent files required to build proper + dependency trees for correct build behavior.
    + +

    In order to create distribution .mak files, always review + the generated .mak (or .dep) dependencies for + Platform SDK or other garbage includes. The DevStudio\SharedIDE\bin\ + (VC5) or DevStudio\Common\MSDev98\bin\ (VC6) directory contains + the sysincl.dat file, which must list all exceptions. Update this + file (including both forward and backslashed paths, such as both + sys/time.h and sys\time.h) to include such dependencies. + Including local-install paths in a distributed .mak file will + cause the build to fail completely. And don't forget to run + srclib/apr/build/fixwin32mak.pl in order to fix absolute + paths within the .mak files.

    + + + +
    +
    +

    Available Languages:  en  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/platform/win_compiling.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/platform/win_compiling.html.ko.euc-kr new file mode 100644 index 00000000..fccb14b6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/platform/win_compiling.html.ko.euc-kr @@ -0,0 +1,423 @@ + + + +Microsoft Windows¿ë ¾ÆÆÄÄ¡ ÄÄÆÄÀÏ - Apache HTTP Server + + + + + +
    <-
    +

    Microsoft Windows¿ë ¾ÆÆÄÄ¡ ÄÄÆÄÀÏ

    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + ko 

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

    ¾ÆÆÄÄ¡¸¦ ÄÄÆÄÀÏÇϱâ Àü¿¡ ÁÖÀÇÇÒ Á¡ÀÌ ¸¹´Ù. ¹Ì¸® Microsoft Windows¿¡¼­ ¾ÆÆÄÄ¡ »ç¿ë¹ýÀ» + Âü°íÇ϶ó.

    + +
    + +
    top
    +
    +

    ¿ä±¸»çÇ×

    + + + +

    ¾ÆÆÄÄ¡¸¦ ÄÄÆÄÀÏÇÏ·Á¸é ´ÙÀ½ÀÌ Á¤»óÀûÀ¸·Î ¼³Ä¡µÇ¾ß ÇÑ´Ù:

    + +
      +
    • +

      µð½ºÅ© °ø°£

      +

      ³²Àº µð½ºÅ© °ø°£ÀÌ ÃÖ¼ÒÇÑ 50 MB´Â µÇ¾ß ÇÑ´Ù. ¾ÆÆÄÄ¡ + ¼³Ä¡ÈÄ¿¡´Â »¡¸® Áõ°¡ÇÏ´Â ·Î±×¿Í ij½¬ÆÄÀÏÀ» Á¦¿ÜÇÏ°í + ¾à 10 MB Á¤µµ°¡ ÇÊ¿äÇÏ´Ù. ½ÇÁ¦ µð½ºÅ© »ç¿ë·®Àº ¼±ÅÃÇÑ + ±¸¼º°ú Á¦»ïÀÚ°¡ ¸¸µç ¸ðµâ ȤÀº ¶óÀ̺귯¸®¿¡ µû¶ó Å©°Ô + ´Ù¸£´Ù.

      +
    • + +
    • +

      Microsoft Visual C++ 5.0 ÀÌ»ó.

      +

      ¾ÆÆÄÄ¡´Â ¸í·ÉÇà µµ±¸¸¦ »ç¿ëÇϰųª Visual Studio IDE + Workbench ¾È¿¡¼­ ÄÄÆÄÀÏÇÒ ¼ö ÀÖ´Ù. ¸í·ÉÇà¿¡¼­ ÄÄÆÄÀÏÇÑ´Ù¸é + vcvars32 ¹èÄ¡ÆÄÀÏÀÌ ¼³Á¤ÇÏ´Â PATH, + INCLUDE, LIB µî ȯ°æº¯¼ö°¡ + ÇÊ¿äÇÏ´Ù:

      + +

      + "c:\Program Files\DevStudio\VC\Bin\vcvars32.bat" +

      +
    • + +
    • +

      Windows Platform SDK.

      +

      ¾î¶² ¾ÆÆÄÄ¡ ±â´ÉÀ» »ç¿ëÇÏ·Á¸é Visual C++ 5.0¿¡ Ãß°¡·Î + ÃֽŠMicrosoft Windows Platform SDK°¡ ÇÊ¿äÇÏ´Ù. ¸í·ÉÇà¿¡¼­ + ÄÄÆÄÀÏÇÑ´Ù¸é setenv ¹èÄ¡ÆÄÀÏÀÌ Platform + SDK ȯ°æÀ» ¸¸µç´Ù:

      + +

      + "c:\Program Files\Platform SDK\setenv.bat" +

      + +

      Visual C++ 6.0 ÀÌ»ó¿¡ Æ÷ÇÔµÈ Platform SDK ÆÄÀÏÀº + ÃæºÐÇÏ´Ù. ÀÌ ¹öÀüÀ» »ç¿ëÇÏ´Â »ç¿ëÀÚ´Â ÀÌ °úÁ¤À» »ý·«Çصµ + µÈ´Ù.

      + +
      ¸ðµç mod_isapi ±â´ÉÀ» »ç¿ëÇÏ·Á¸é + ÃֽŠWindows Platform SDK°¡ ÇÊ¿äÇÏ´Ù. ÃֽŠ¹öÀüÀÌ ¾Æ´Ï¸é + MSVC++ 5.0Àº mod_isapi ±â´ÉÀÇ ÀϺθ¦ + »ç¿ëÇÒ ¼ö ¾ø´Ù°í °æ°íÇÑ´Ù. http://msdn.microsoft.com/downloads/sdks/platform/platform.asp¿¡ + ÃֽŠ¹öÀüÀÌ ÀÖ´Ù.
      +
    • + +
    • +

      awk µµ±¸ (awk, gawk µî).

      +

      ÄÄÆÄÀÏÇÑ ½Ã½ºÅÛ¿¡ ¾ÆÆÄÄ¡¸¦ ¼³Ä¡ÇÏ·Á¸é + awk.exe µµ±¸¸¦ »ç¿ëÇÏ¿© ¿©·¯ ÆÄÀÏÀ» ¼öÁ¤ÇØ¾ß + ÇÑ´Ù. (PerlÀ̳ª WSH/VB°ú ºñ±³ÇÏ¿©) ´Ù¿î¹Þ±â¿¡ ¸Å¿ì ÀÛ°í + ÆÄÀÏ »ý¼º ÀÛ¾÷ÀÌ °¡´ÉÇÏ¿© awk¸¦ ¼±ÅÃÇß´Ù. Brian KernighanÀÇ + http://cm.bell-labs.com/cm/cs/who/bwk/ »çÀÌÆ®¿¡ + ÄÄÆÄÀÏµÈ Win32 ½ÇÇàÆÄÀÏ http://cm.bell-labs.com/cm/cs/who/bwk/awk95.exeÀÌ + ÀÖ´Ù. À̸§À» awk95.exe ´ë½Å + awk.exe·Î º¯°æÇØ¾ß ÇÑ´Ù.

      + +
      Developer Studio IDE´Â Tools ¸Þ´º Options... + Directories ÅÇÀÇ (Developer Studio 7.0À̶ó¸é Projects + - VC++ Directories pane) Executable files °æ·Î ¸ñ·Ï¿¡¼­¸¸ + awk.exe¸¦ ã´Â´Ù. ÀÌ ¸ñ·Ï¿¡ awk.exe + °æ·Î¸¦ Ãß°¡ÇÏ°í, ÇÊ¿äÇÏ´Ù¸é PATH ȯ°æº¯¼ö¿¡µµ + Ãß°¡ÇÑ´Ù.
      + +
      CygwinÀ» (http://www.cygwin.com/) »ç¿ëÇÑ´Ù¸é + gawk.exe¶ó´Â À̸§À¸·Î awk µµ±¸°¡ ÀÖÀ¸¸ç, + awk.exe ÆÄÀÏÀº gawk.exe ÆÄÀÏÀÇ + ½Éº¼¸µÅ©ÀÓÀ» ÁÖÀÇÇ϶ó. Windows ¸í·É ÇÁ·ÒÇÁÆ®°¡ ½Éº¼¸µÅ©¸¦ + ÀνÄÇÏÁö ¸øÇϱ⶧¹®¿¡ InstallBinÀ» ÄÄÆÄÀÏÇÒ¶§ ½ÇÆÐÇÑ´Ù. + ÇØ°áÃ¥Àº cygwin¿¡¼­ awk.exe¸¦ »èÁ¦ÇÏ°í + gawk.exe À̸§À» awk.exe·Î + ¹Ù²Û´Ù.
      +
    • + +
    • +

      [¼±ÅÃÀûÀÎ] OpenSSL ¶óÀ̺귯¸® (mod_ssl°ú + ab.exeÀÇ ssl Áö¿ø¿¡ »ç¿ë)

      +

      ÁÖÀÇ: °­·ÂÇÑ ¾Ïȣȭ¿Í ƯÇã°¡ °É¸° ÁöÀûÀç»ê±ÇÀ» + Àü¼¼°è¿¡ ¹èÆ÷Çϴµ¥´Â »ó´çÇÑ Á¦¾àÀÌ ÀÖ´Ù. + OpenSSLÀº ¹Ì±¹ ¼öÃâ±ÔÁ¦¹ýÀÌ ±ÔÁ¦ÇÏ¸ç ¹Ì±¹°ú ±âŸ Áö¿ª¿¡¼­ + ƯÇã·Î º¸È£µÇ´Â ÁöÀûÀç»ê±ÇÀÎ °­·ÂÇÑ ¾Ïȣȭ¸¦ Æ÷ÇÔÇÑ´Ù. + Apache Software Foundation°ú OpenSSL ÇÁ·ÎÁ§Æ®´Â OpenSSL + ÇÁ·ÎÁ§Æ®°¡ Á¦°øÇÏ´Â Äڵ带 ¼ÒÀ¯, »ç¿ë, ¹èÆ÷Çϴµ¥ µû¸¥ + ¹ýÀû ÀÚ¹®À» Á¦°øÇÏÁö ¾Ê´Â´Ù. Á÷Á¢ ¹ý·ü »ó´ãÀ» + ¹Þ±æ ¹Ù¶õ´Ù. ´ç½Å ÇൿÀÇ Ã¥ÀÓÀº ´ç½Å¿¡°Ô ÀÖ´Ù.

      + +

      mod_sslÀ̳ª (SSLÀ» Áö¿øÇÏ´Â + ab.exe) abs ÇÁ·ÎÁ§Æ®¸¦ ÄÄÆÄÀÏÇÏ·Á¸é, OpenSSLÀ» + http://www.openssl.org/source/¿¡¼­ ´Ù¿î¹Þ¾Æ¼­ + srclibÀÇ opensslÀ̶ó´Â + ÇÏÀ§µð·ºÅ丮¿¡ ¼³Ä¡ÇØ¾ß ÇÑ´Ù. release¿Í + debug·Î ¾ÆÆÄÄ¡¸¦ ÄÄÆÄÀÏÇÒ¶§ »ç¿ëÇϸç 0.9.7 + ¹öÀü¿¡ Àִ ƯÇã°¡ °É¸° ±â´ÉÀ» »ç¿ëÇÏÁö ¾Ê´Â´Ù¸é, ¾Æ·¡ + ÄÄÆÄÀÏ ¸í·É¾î¸¦ »ç¿ëÇÑ´Ù:

      + +

      + perl Configure VC-WIN32
      + perl util\mkfiles.pl >MINFO
      + perl util\mk1mf.pl dll no-asm no-mdc2 no-rc5 no-idea VC-WIN32 >makefile
      + perl util\mk1mf.pl dll debug no-asm no-mdc2 no-rc5 no-idea VC-WIN32 >makefile.dbg
      + perl util\mkdef.pl 32 libeay no-asm no-mdc2 no-rc5 no-idea >ms\libeay32.def
      + perl util\mkdef.pl 32 ssleay no-asm no-mdc2 no-rc5 no-idea >ms\ssleay32.def
      + nmake
      + nmake -f makefile.dbg +

      + +
    • + +
    • +

      [¼±ÅÃÀûÀÎ] zlib ¼Ò½º (mod_deflate¿¡ + »ç¿ë)

      +

      ZlibÀ» srclibÀÇ zlib¶ó´Â + ÇÏÀ§µð·ºÅ丮¿¡ ¼³Ä¡ÇØ¾ß ÇÏÁö¸¸, ¼Ò½º¸¦ ¹Ì¸® ÄÄÆÄÀÏÇÒ + ÇÊ¿ä´Â ¾ø´Ù. ÄÄÆÄÀÏ ½Ã½ºÅÛÀº ÀÌ ¾ÐÃà¼Ò½º¸¦ + mod_deflate ¸ðµâ°ú °°ÀÌ ÄÄÆÄÀÏÇÑ´Ù. + ZlibÀº http://www.gzip.org/zlib/¿¡¼­ ±¸ÇÒ ¼ö ÀÖ´Ù -- + mod_deflate´Â 1.1.4 ¹öÀü°ú Á¤»óÀûÀ¸·Î + ÄÄÆÄÀϵǾú´Ù.

      +
    • + +
    + +
    top
    +
    +

    ¸í·ÉÇà¿¡¼­ ÄÄÆÄÀÏÇϱâ

    + + + +

    ¸ÕÀú Àû´çÇÑ µð·ºÅ丮¿¡ ¾ÆÆÄÄ¡ ¹èÆ÷º» ¾ÐÃàÀ» Ǭ´Ù. ¸í·ÉÇà + ÇÁ·ÒÇÁÆ®¸¦ ¿­°í ±× µð·ºÅ丮·Î cdÇÑ´Ù.

    + +

    Makefile.win ÆÄÀÏ¿¡ ¾ÆÆÄÄ¡ makefile ¸í·ÉÀÌ + ÀÖ´Ù. Windows NT¿¡¼­ release¿Í debug + ÄÄÆÄÀÏÇÏ´Â ¸í·É¾î´Â °¢°¢ ´ÙÀ½°ú °°´Ù:

    + +
    +nmake /f Makefile.win _apacher
    +
    +nmake /f Makefile.win _apached
    +    
    + +

    µÎ ¸í·É¾î ¸ðµÎ ¾ÆÆÄÄ¡¸¦ ÄÄÆÄÀÏÇÑ´Ù. ÈÄÀÚ´Â °á°úÆÄÀÏ¿¡ + µð¹ö±ë Á¤º¸¸¦ Æ÷ÇÔÇÏ¿© ¹ö±×¸¦ ã°í ¹®Á¦¸¦ ÃßÀûÇϱ⠽±°Ô + ÇÑ´Ù.

    + +
    top
    +
    +

    Developer Studio Workspace IDE¿¡¼­ ÄÄÆÄÀÏÇϱâ

    + + + +

    VC++ÀÇ Visual Studio °³¹ß ȯ°æÀ» »ç¿ëÇÏ¿© ¾ÆÆÄÄ¡¸¦ ÄÄÆÄÀÏÇÒ + ¼öµµ ÀÖ´Ù. °úÁ¤À» ½±°Ô ÇÏ·Á°í Visual Studio workspace + Apache.dsw¸¦ Á¦°øÇÑ´Ù. ÀÌ workspace´Â ¿ÏÀüÇÑ + ¾ÆÆÄÄ¡ ¹ÙÀ̳ʸ® ¹èÆ÷º»¿¡ ÇÊ¿äÇÑ .dsp ÇÁ·ÎÁ§Æ® + ¸ñ·ÏÀ» ´ã°íÀÖ´Ù. ¶Ç, ¾Ë¸ÂÀº ¼ø¼­·Î ÄÄÆÄÀÏÇϱâÀ§ÇÑ ÇÁ·ÎÁ§Æ®°£ + ÀÇÁ¸¼º Á¤º¸µµ Æ÷ÇÔÇÑ´Ù.

    + +

    Apache.dsw workspace¸¦ ¿­°í + InstallBinÀ» (Release³ª + Debug Áß ¿øÇÏ´Â °ÍÀ») Active Project·Î ¼±ÅÃÇÑ´Ù. + InstallBinÀº °ü·ÃµÈ ¸ðµç ÇÁ·ÎÁ§Æ®¸¦ ÄÄÆÄÀÏÇÏ°í, + ÄÄÆÄÀÏµÈ ½ÇÇàÆÄÀÏ°ú dllÀ» ¿Å±â´Â Makefile.winÀ» + È£ÃâÇÑ´Ù. InstallBinÀÇ Settings, General ÅÇ, + Build command line Ç׸ñÀ» ¼öÁ¤ÇÏ¿© INSTDIR=À» + º¯°æÇÒ ¼ö ÀÖ´Ù. INSTDIR= ±âº»°ªÀº + /Apache2 µð·ºÅ丮ÀÌ´Ù. (¼³Ä¡ÇÏÁö¾Ê°í) Å×½ºÆ®·Î + ÄÄÆÄÀϸ¸ Çغ¸·Á¸é ´ë½Å BuildBin ÇÁ·ÎÁ§Æ®¸¦ + »ç¿ëÇÑ´Ù.

    + +

    .dsp ÇÁ·ÎÁ§Æ® ÆÄÀÏÀº Visual C++ 6.0 Çü½ÄÀÌ´Ù. + Visual C++ 5.0 (97)¿¡¼­µµ ÀÌ ÆÄÀÏÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù. Visual + C++ 7.0 (.net)Àº Apache.dsw¿Í .dsp + ÆÄÀϵéÀ» Apache.sln°ú .msproj + ÆÄÀϵé·Î º¯È¯ÇÑ´Ù. .dsp ¼Ò½ºÆÄÀÏÀ» ¼öÁ¤Çϸé + ¹Ýµå½Ã .msproj ÆÄÀÏ·Î ´Ù½Ã º¯È¯Ç϶ó! ±×³É VC++ + 7.0 IDE¿¡¼­ Apache.dsw¸¦ ´Ù½Ã ¿­±â¸¸ ÇÏ¸é µÈ´Ù.

    + +

    ¶Ç, Visual C++ 7.0 (.net) »ç¿ëÀÚ´Â Build ¸Þ´º, Configuration + Manager ´ëȭâ¿¡¼­ Debug¿Í ReleaseÀÇ + abs, mod_ssl, mod_deflate + Solution modules ¼±ÅÃÀ» ÇØÁ¦ÇØ¾ß ÇÑ´Ù. srclib¿¡ + opensslÀ̳ª zlib µð·ºÅ丮°¡ ÀÖ´Â + °æ¿ì¿¡¸¸ nmake¸¦ ½ÇÇàÇϰųª (ÀÌ ¸ðµâÀ» ¸í½ÃÀûÀ¸·Î + ÄÄÆÄÀÏÇÏ´Â) IDE BinBuild ´ë»óÀ» »ç¿ëÇÏ¿© ¸ðµâÀ» + ÄÄÆÄÀÏ ÇÒ ¼ö ÀÖ´Ù.

    + +

    ExportÇÑ .mak ÆÄÀϵéÀÌ È¥¶õ½º·´Áö¸¸, Visual + C++ 5.0 »ç¿ëÀÚ°¡ mod_ssl, abs (SSLÀ» Áö¿øÇÏ´Â + ab), mod_deflate¸¦ ÄÄÆÄÀÏÇÒ¶§ ÇÊ¿äÇÏ´Ù. + VC++ 7.0 (.net) »ç¿ëÀÚ¿¡°Ôµµ binenv º¸´Ù + nmake¸¦ »ç¿ëÇϸé ÄÄÆÄÀÏÀÌ ´õ ºü¸£´Ù. VC++ 5.0À̳ª + 6.0 IDE¿¡¼­ Àüü ÇÁ·ÎÁ§Æ®¸¦ ÄÄÆÄÀÏÇÏ°í, Project ¸Þ´ºÀÇ Export + for all makefiles¸¦ »ç¿ëÇ϶ó. µ¿ÀûÀ¸·Î ÀÚµ¿ »ý¼ºÇÏ´Â ´ë»óÀ» + ¸ðµÎ ÄÄÆÄÀÏÇÏ°í ¿Ã¹Ù¸¥ ÀÇÁ¸¼º Á¤º¸¸¦ ¾ò±âÀ§Çؼ­´Â ¸ÕÀú + ÇÁ·ÎÁ§Æ®¸¦ ÄÄÆÄÀÏÇØ¾ß ÇÑ´Ù. ´ÙÀ½ ¸í·É¾î¸¦ »ç¿ëÇÏ¿© °æ·Î¸¦ + ¼öÁ¤ÇÏ¸é ¾î¶² °æ·Î¿¡¼­µµ ÄÄÆÄÀÏÇÒ ¼ö ÀÖ´Ù:

    + +

    + perl srclib\apr\build\fixwin32mak.pl +

    + +

    httpd ¼Ò½º ÃÖ»óÀ§ µð·ºÅ丮¿¡¼­ + ¸í·É¾î¸¦ ½ÇÇàÇØ¾ß ÇÑ´Ù. ÇöÀç µð·ºÅ丮¿Í ÇÏÀ§µð·ºÅ丮¿¡ ÀÖ´Â + ¸ðµç .mak¿Í .dep ÇÁ·ÎÁ§Æ®ÆÄÀÏÀ» + ¼öÁ¤ÇÏ°í, .dsp¸¦ °í·ÁÇÏ¿© ÆÄÀϽð£À» ¼öÁ¤ÇÑ´Ù.

    + +

    ÇÁ·ÎÁ§Æ®ÆÄÀÏÀ» ´Ùµë¾î¼­ ÆÐÄ¡¸¦ º¸³½´Ù¸é, ÇÁ·ÎÁ§Æ®ÆÄÀÏÀ» + Visual Studio 6.0 Çü½ÄÀ¸·Î ¸¸µé¾î¾ß ÇÑ´Ù. º¯°æÀº °£´ÜÇÏ°í, + VC++ 5.0¿¡¼­ 7.0±îÁö ¸ðµç ȯ°æ¿¡¼­ ÀνÄÇÏ´Â ÃÖ¼ÒÇÑÀÇ ÄÄÆÄÀÏ + ¿É¼Ç°ú ¸µÄ¿ ¿É¼ÇÀ» »ç¿ëÇØ¾ß ÇÑ´Ù.

    + +
    top
    +
    +

    ÇÁ·ÎÁ§Æ® ±¸¼º¿ä¼Ò

    + + + +

    Apache.dsw workspace¿Í makefile.win + nmake ½ºÅ©¸³Æ®´Â ´ÙÀ½ ¼ø¼­´ë·Î ¾ÆÆÄÄ¡ ¼­¹ö + .dsp ÇÁ·ÎÁ§Æ®¸¦ ÄÄÆÄÀÏÇÑ´Ù:

    + +
      +
    1. srclib\apr\apr.dsp
    2. + +
    3. srclib\apr\libapr.dsp
    4. + +
    5. srclib\apr-util\uri\gen_uri_delims.dsp
    6. + +
    7. srclib\apr-util\xml\expat\lib\xml.dsp
    8. + +
    9. srclib\apr-util\aprutil.dsp
    10. + +
    11. srclib\apr-util\libaprutil.dsp
    12. + +
    13. srclib\pcre\dftables.dsp
    14. + +
    15. srclib\pcre\pcre.dsp
    16. + +
    17. srclib\pcre\pcreposix.dsp
    18. + +
    19. server\gen_test_char.dsp
    20. + +
    21. libhttpd.dsp
    22. + +
    23. Apache.dsp
    24. +
    + +

    ¶Ç, modules\ ÇÏÀ§µð·ºÅ丮 ¾Æ·¡ ´ëºÎºÐÀÇ + ¸ðµâ¿¡´Â ÇÁ·ÎÁ§Æ®ÆÄÀÏÀÌ ÀÖ´Ù.

    + +

    support\ µð·ºÅ丮¿¡´Â ¾ÆÆÄÄ¡¸¦ ½ÇÇàÇϴµ¥ + ÇÊ¿äÇÏÁö´Â ¾ÊÁö¸¸, °ü¸®ÀÚ°¡ ¾ÆÆÄÄ¡¸¦ °Ë»çÇϰųª ¾ÏÈ£ÆÄÀÏ°ú + ·Î±×ÆÄÀÏÀ» °ü¸®Çϴµ¥ »ç¿ëÇÒ Ãß°¡ ÇÁ·Î±×·¥µéÀÇ ÇÁ·ÎÁ§Æ®ÆÄÀÏÀÌ + ÀÖ´Ù. Windows Àü¿ë Áö¿ø ÇÁ·Î±×·¥Àº support\win32\ + µð·ºÅ丮¿¡ µû·Î ÀÖ´Ù.

    + +
      +
    1. support\ab.dsp
    2. + +
    3. support\htdigest.dsp
    4. + +
    5. support\htpasswd.dsp
    6. + +
    7. support\logresolve.dsp
    8. + +
    9. support\rotatelogs.dsp
    10. + +
    11. support\win32\ApacheMonitor.dsp
    12. + +
    13. support\win32\wintty.dsp
    14. +
    + +

    ¾ÆÆÄÄ¡¸¦ ÄÄÆÄÀÏÇϸé server root µð·ºÅ丮¿¡ ¼³Ä¡ÇØ¾ß ÇÑ´Ù. + ±âº»°ªÀº °°Àº µð½ºÅ©ÀÇ \Apache2 µð·ºÅ丮ÀÌ´Ù.

    + +

    ÄÄÆÄÀÏÇÏ°í ¸ðµç ÆÄÀÏÀ» ¿øÇÏ´Â Æú´õ dir¿¡ ÀÚµ¿À¸·Î + ¼³Ä¡ÇÏ·Á¸é ´ÙÀ½ nmake ¸í·É¾îÁß Çϳª¸¦ »ç¿ëÇÑ´Ù:

    + +
    +nmake /f Makefile.win installr INSTDIR=dir
    +
    +nmake /f Makefile.win installd INSTDIR=dir
    +    
    + +

    INSTDIRÀÇ dir ¾Æ±Ô¸ÕÆ®´Â ¼³Ä¡µð·ºÅ丮¸¦ + ¶æÇÑ´Ù. »ý¶ôÇϸé \Apache2¿¡ ¾ÆÆÄÄ¡¸¦ ¼³Ä¡ÇÑ´Ù.

    + +

    ´ÙÀ½°ú °°ÀÌ ¼³Ä¡ÇÑ´Ù:

    + +
      +
    • dir\bin\Apache.exe - ¾ÆÆÄÄ¡ + ½ÇÇàÆÄÀÏ
    • + +
    • dir\bin\ApacheMonitor.exe - + ¼­ºñ½º °¨½Ã¿ë ÀÛ¾÷Ç¥½ÃÁÙ ¾ÆÀÌÄÜ µµ±¸
    • + +
    • dir\bin\htdigest.exe - Digest + auth ¾ÏÈ£ÆÄÀÏ µµ±¸
    • + +
    • dir\bin\htdbm.exe - SDBM auth + µ¥ÀÌÅͺ£À̽º ¾ÏÈ£ÆÄÀÏ µµ±¸
    • + +
    • dir\bin\htpasswd.exe - Basic + auth ¾ÏÈ£ÆÄÀÏ µµ±¸
    • + +
    • dir\bin\logresolve.exe - ·Î±×ÆÄÀÏ¿¡¼­ + dns À̸§À» ã´Â µµ±¸
    • + +
    • dir\bin\rotatelogs.exe - ·Î±×ÆÄÀÏ + ¼øȯ µµ±¸
    • + +
    • dir\bin\wintty.exe - ÄܼÖâ + µµ±¸
    • + +
    • dir\bin\libapr.dll - Apache + Portable Runtime °øÀ¯ ¶óÀ̺귯¸®
    • + +
    • dir\bin\libaprutil.dll - Apache + Utility Runtime °øÀ¯ ¶óÀ̺귯¸®
    • + +
    • dir\bin\libhttpd.dll - Apache + Core ¶óÀ̺귯¸®
    • + +
    • dir\modules\mod_*.so - ÀоîµéÀÏ + ¼ö ÀÖ´Â ¾ÆÆÄÄ¡ ¸ðµâ
    • + +
    • dir\conf - ¼³Á¤ µð·ºÅ丮
    • + +
    • dir\logs - ºñ¾îÀÖ´Â ·Î±× + µð·ºÅ丮
    • + +
    • dir\include - C ¾ð¾î Çì´õÆÄÀÏ
    • + +
    • dir\lib - ¸µÅ© ¶óÀ̺귯¸®ÆÄÀÏ
    • +
    + +

    °³¹ßÁßÀÎ ¾ÆÆÄÄ¡ ¹öÀüÀ» ÄÄÆÄÀÏÇÒ¶§ °æ°í

    + + + +
    .dsp ÆÄÀÏÀº release¸¶´Ù + »õ·Î ¸¸µé¾îÁø´Ù. °³¹ßÀÚÀÇ ½Ã°£³¶ºñ¸¦ ¸·±âÀ§ÇØ + .mak ÆÄÀÏÀº »õ·Î ¸¸µéÁö ¾Ê´Â´Ù. ±×·¯¹Ç·Î + NMAKE ¸í·É¾î¸¦ »ç¿ëÇÏ¿© »õ·Î¿î .dsp + ÇÁ·ÎÁ§Æ®ÆÄÀÏÀ» ÄÄÆÄÀÏÇÒ ¼ö ¾ø´Ù. ÇÁ·ÎÁ§Æ®¿¡¼­ Á÷Á¢ ¸ðµç + .mak ÆÄÀÏÀ» exportÇØ¾ß ÇÑ´Ù. Microsoft Developer + Studio ȯ°æ¿¡¼­ ÄÄÆÄÀÏÇÑ´Ù¸é ÀÌ ÀÛ¾÷ÀÌ ÇÊ¿ä¾ø´Ù.
    + +
    ¶Ç, makefileÀ» exportÇϱâ Àü¿¡ BuildBin + ÇÁ·ÎÁ§Æ®¸¦ (ȤÀº _apacher³ª _apached + ¸í·ÉÇà ´ë»ó) ÄÄÆÄÀÏÇÏ¸é ¸Å¿ì µµ¿òÀÌ µÈ´Ù. ÄÄÆÄÀÏÁß¿¡ ¸¹Àº + ÆÄÀÏÀÌ ÀÚµ¿À¸·Î ¸¸µé¾îÁø´Ù. Àüü¸¦ ÄÄÆÄÀÏÇؾ߸¸ Á¤»óÀûÀ¸·Î + ÄÄÆÄÀÏÇÒ¶§ ÇÊ¿äÇÑ ÀÇÁ¸ÆÄÀÏÀ» ¸ðµÎ ¸¸µç´Ù.
    + +

    ¹èÆ÷¿ë .mak ÆÄÀÏÀ» ¸¸µå·Á¸é Ç×»ó + .mak (ȤÀº .dep)¿¡¼­ Platform + SDK µîÀÇ ÀÇÁ¸¼ºÀ» Á¡°ËÇ϶ó. + DevStudio\SharedIDE\bin\ (VC5)³ª + DevStudio\Common\MSDev98\bin\ (VC6) µð·ºÅ丮¿¡´Â + ¸ðµç ¿¹¿Ü ¸ñ·ÏÀÌ ´ã±ä sysincl.dat ÆÄÀÏÀÌ + ÀÖ´Ù. ÀÌ ÆÄÀÏ¿¡ ÀÇÁ¸¼º Á¤º¸¸¦ Ãß°¡ÇÑ´Ù + (sys/time.h¿Í sys\time.h¿Í °°ÀÌ, + °æ·Î´Â ½½·¡½¬¸¦ »ç¿ëÇÑ °Í°ú ¹é½½·¡½¬¸¦ »ç¿ëÇÑ °Í ¸ðµÎ¸¦ + Ãß°¡ÇÑ´Ù). ¹èÆ÷ÇÒ .mak ÆÄÀÏ¿¡ ÇöÀç ÄÄÇ»ÅÍ¿¡¸¸ + ÇØ´çÇÏ´Â ¼³Ä¡°æ·Î°¡ ÀÖ´Ù¸é ÄÄÆÄÀÏÀÌ ¿ÏÀüÈ÷ ½ÇÆÐÇÑ´Ù. + ±×·¯¹Ç·Î srclib/apr/build/fixwin32mak.plÀ» + ½ÇÇàÇØÇÏ¿© .mak ÆÄÀÏ¿¡ ÀÖ´Â Àý´ë°æ·Î¸¦ ¾ø¾Ö¾ß + ÇÑ´Ù.

    + + + +
    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/platform/windows.html b/rubbos/app/httpd-2.0.64/docs/manual/platform/windows.html new file mode 100644 index 00000000..a4e6fa16 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/platform/windows.html @@ -0,0 +1,9 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: windows.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: windows.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR diff --git a/rubbos/app/httpd-2.0.64/docs/manual/platform/windows.html.en b/rubbos/app/httpd-2.0.64/docs/manual/platform/windows.html.en new file mode 100644 index 00000000..8508075e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/platform/windows.html.en @@ -0,0 +1,754 @@ + + + +Using Apache with Microsoft Windows - Apache HTTP Server + + + + + +
    <-
    +

    Using Apache with Microsoft Windows

    +
    +

    Available Languages:  en  | + ko 

    +
    + + +

    This document explains how to install, configure and run + Apache 2.0 under Microsoft Windows. If you find any bugs, or + wish to contribute in other ways, please use our bug reporting + page.

    + +

    This document assumes that you are installing a binary + distribution of Apache. If you want to compile Apache yourself + (possibly to help with development or tracking down bugs), + see Compiling Apache for Microsoft + Windows.

    + +

    Because of the current versioning policies on Microsoft + Windows operating system families, this document assumes the + following:

    +
      +
    • Windows NT: This means all versions of + Windows that are based on the Windows NT kernel. Includes Windows + NT, Windows 2000, Windows XP and Windows .Net Server 2003.
    • +
    • Windows 9x: This means older, + consumer-oriented versions of Windows. Includes Windows 95 (also + OSR2), Windows 98 and Windows ME.
    • +
    + +
    + +
    top
    +
    +

    Operating System Requirements

    + + +

    The primary Windows platform for running Apache 2.0 is Windows + NT. The binary installer only works with the x86 family of + processors, such as Intel and AMD processors. Running Apache on + Windows 9x is not thoroughly tested, and it is never recommended on + production systems. +

    + +

    On all operating systems, TCP/IP networking must be installed + and working. If running on Windows 95, the Winsock 2 upgrade must + be installed. Winsock 2 for Windows 95 can be downloaded from here. +

    + +

    On Windows NT 4.0, installing Service Pack 6 is strongly + recommended, as Service Pack 4 created known issues with TCP/IP + and Winsock integrity that were resolved in later Service Packs.

    +
    top
    +
    +

    Downloading Apache for Windows

    + + +

    Information on the latest versions of Apache can be found on the + web site of the Apache web server at + http://httpd.apache.org/download.cgi. + There you will find the current release, as well as more recent alpha + or beta test versions, and a list of HTTP and FTP mirrors from which + you can download the Apache web server. Please use a mirror near to + you for a fast and reliable download.

    + +

    For Windows installations you should download the version of + Apache for Windows with the .msi extension. This is a + single Microsoft Installer file, which contains a ready-to-run + version of Apache. There is a separate .zip file, + which contains only the source code. You can compile Apache + yourself with the Microsoft Visual C++ (Visual Studio) tools.

    +
    top
    +
    +

    Installing Apache for Windows

    + + +

    You need Microsoft Installer 1.2 or above for the installation + to work. On Windows 9x you can update your Microsoft Installer to + version 2.0 here + and on Windows NT 4.0 and 2000 the version 2.0 update can be found + here. + Windows XP does not need this update.

    + +

    Note that you cannot install two versions of Apache 2.0 on the + same computer with the binary installer. You can, however, install + a version of the 1.3 series and a version of the + 2.0 series on the same computer without problems. If you need to + have two different 2.0 versions on the same computer, you have to + compile and install Apache from the + source.

    + +

    Run the Apache .msi file you downloaded above. The + installation will ask you for these things:

    + +
      +
    1. Network Domain. Enter the DNS domain in which + your server is or will be registered in. For example, if your + server's full DNS name is server.mydomain.net, you would + type mydomain.net here.

    2. + +
    3. Server Name. Your server's full DNS name. + From the example above, you would type server.mydomain.net + here.

    4. + +
    5. Administrator's Email Address. Enter the + server administrator's or webmaster's email address here. This + address will be displayed along with error messages to the client + by default.

    6. + +
    7. For whom to install Apache Select for + All Users, on Port 80, as a Service - Recommended if you'd + like your new Apache to listen at port 80 for incoming traffic. + It will run as a service (that is, Apache will run even if no one + is logged in on the server at the moment) Select only for + the Current User, on Port 8080, when started Manually if + you'd like to install Apache for your personal experimenting or + if you already have another WWW server running on port 80.

    8. + +
    9. The installation type. Select Typical + for everything except the source code and libraries for module + development. With Custom you can specify what to + install. A full install will require about 13 megabytes of free + disk space. This does not include the size of your web + site(s).

    10. + +
    11. Where to install. The default path is + C:\Program Files\Apache Group under which a directory + called Apache2 will be created by default.

    12. +
    + +

    During the installation, Apache will configure the files in the + conf subdirectory to reflect the chosen installation + directory. However, if any of the configuration files in this + directory already exist, they will not be overwritten. Instead, the + new copy of the corresponding file will be left with the extension + .default. So, for example, if conf\httpd.conf + already exists, it will be renamed as conf\httpd.conf.default. + After the installation you should manually check to see what new + settings are in the .default file, and if necessary, + update your existing configuration file.

    + +

    Also, if you already have a file called htdocs\index.html, + it will not be overwritten (and no index.html.default + will be installed either). This means it should be safe to install + Apache over an existing installation, although you would have to + stop the existing running server before doing the installation, and + then start the new one after the installation is finished.

    + +

    After installing Apache, you must edit the configuration files + in the conf subdirectory as required. These files + will be configured during the installation so that Apache is ready + to be run from the directory it was installed into, with the + documents server from the subdirectory htdocs. There + are lots of other options which you should set before you really + start using Apache. However, to get started quickly, the files + should work as installed.

    +
    top
    +
    +

    Customizing Apache for Windows

    + + +

    Apache is configured by the files in the conf + subdirectory. These are the same files used to configure the Unix + version, but there are a few different directives for Apache on + Windows. See the directive index + for all the available directives.

    + +

    The main differences in Apache for Windows are:

    +
      +
    • Because Apache for Windows is multithreaded, it does not + use a separate process for each request, as Apache does on Unix. + Instead there are usually only two Apache processes running: a + parent process, and a child which handles the requests. Within + the child process each request is handled by a separate thread. +

      + +

      The process management directives are also different:

      + +

      MaxRequestsPerChild: + Like the Unix directive, this controls how many requests a single + child process will serve before exiting. However, unlike on Unix, + a single process serves all the requests at once, not just one. + If this is set, it is recommended that a very high number is + used. The recommended default, MaxRequestsPerChild 0, + causes the child process to never exit.

      + +
      Warning: The server configuration + file is reread when a new child process is started. If you have + modified httpd.conf, the new child may not start or + you may receive unexpected results.
      + +

      ThreadsPerChild: + This directive is new. It tells the server how many threads it + should use. This is the maximum number of connections the server + can handle at once, so be sure to set this number high enough for + your site if you get a lot of hits. The recommended default is + ThreadsPerChild 50.

    • + +
    • The directives that accept filenames as arguments must use + Windows filenames instead of Unix ones. However, because Apache + uses Unix-style names internally, you must use forward slashes, + not backslashes. Drive letters can be used; if omitted, the drive + with the Apache executable will be assumed.

    • + +
    • While filenames are generally case-insensitive on + Windows, URLs are still treated internally as case-sensitive + before they are mapped to the filesystem. For example, the + <Location>, + Alias, and ProxyPass directives all use + case-sensitive arguments. For this reason, it is particularly + important to use the <Directory> directive when attempting + to limit access to content in the filesystem, since this + directive applies to any content in a directory, regardless of + how it is accessed. If you wish to assure that only lowercase + is used in URLs, you can use something like:

      + +

      + RewriteEngine On
      + RewriteMap lowercase int:tolower
      + RewriteCond %{REQUEST_URI} [A-Z]
      + RewriteRule (.*) ${lowercase:$1} [R,L] +

    • + +
    • Apache for Windows contains the ability to load modules at + runtime, without recompiling the server. If Apache is compiled + normally, it will install a number of optional modules in the + \Apache2\modules directory. To activate these or + other modules, the new LoadModule + directive must be used. For example, to activate the status + module, use the following (in addition to the status-activating + directives in access.conf):

      + +

      + LoadModule status_module modules/mod_status.so +

      + +

      Information on creating + loadable modules is also available.

    • + +
    • Apache can also load ISAPI (Internet Server Application + Programming Interface) extensions (i.e. internet server + applications), such as those used by Microsoft IIS and other + Windows servers. More information + is available. Note that Apache cannot load + ISAPI Filters.

    • + +
    • When running CGI scripts, the method Apache uses to find + the interpreter for the script is configurable using the + ScriptInterpreterSource + directive.

    • + +
    • Since it is often difficult to manage files with names + like .htaccess in Windows, you may find it useful to + change the name of this per-directory configuration file using + the AccessFilename + directive.

    • + +
    • Any errors during Apache startup are logged into the + Windows event log when running on Windows NT. This mechanism + acts as a backup for those situations where Apache cannot even + access the normally used error.log file. You can + view the Windows event log by using the Event Viewer application + on Windows NT 4.0, and the Event Viewer MMC snap-in on newer + versions of Windows.

      + +
      Note that there is no startup error logging on + Windows 9x because no Windows event log exists on those operating + systems.
    • +
    + +
    top
    +
    +

    Running Apache as a Service

    + + +

    Apache can be run as a service on Windows NT. There is some + highly experimental support for similar behavior on Windows 9x.

    + +

    You can install Apache as a service automatically during the + installation. If you chose to install for all users, the + installation will create an Apache service for you. If you specify + to install for yourself only, you can manually register Apache as a + service after the installation. You have to be a member of the + Administrators group for the service installation to succeed.

    + +

    Apache comes with a utility called the Apache Service Monitor. + With it you can see and manage the state of all installed Apache + services on any machine on your network. To be able to manage an + Apache service with the monitor, you have to first install the + service (either automatically via the installation or manually). +

    + +

    You can install Apache as a Windows NT service as follows from + the command prompt at the Apache bin subdirectory:

    + +

    + httpd -k install +

    + +

    If you need to specify the name of the service you want to + install, use the following command. You have to do this if you + have several different service installations of Apache on your + computer.

    + +

    + httpd -k install -n "MyServiceName" +

    + +

    If you need to have specifically named configuration files for + different services, you must use this:

    + +

    + httpd -k install -n "MyServiceName" -f "c:\files\my.conf" +

    + +

    If you use the first command without any special parameters except + -k install, the service will be called Apache2 + and the configuration will be assumed to be conf\httpd.conf. +

    + +

    Removing an Apache service is easy. Just use:

    + +

    + httpd -k uninstall +

    + +

    The specific Apache service to be uninstalled can be specified by using:

    + +

    + httpd -k uninstall -n "MyServiceName" +

    + +

    Normal starting, restarting and shutting down of an Apache + service is usually done via the Apache Service Monitor, by using + commands like NET START Apache2 and NET STOP + Apache2 or via normal Windows service management. Before + starting Apache as a service by any means, you should test the + service's configuration file by using:

    + +

    + httpd -n "MyServiceName" -t +

    + +

    You can control an Apache service by its command line switches, + too. To start an installed Apache service you'll use this:

    + +

    + httpd -k start +

    + +

    To stop an Apache service via the command line switches, use + this:

    + +

    + httpd -k stop +

    + +

    or

    + +

    + httpd -k shutdown +

    + +

    You can also restart a running service and force it to reread + its configuration file by using:

    + +

    + httpd -k restart +

    + +

    By default, all Apache services are registered to run as the + system user (the LocalSystem account). The + LocalSystem account has no privileges to your network + via any Windows-secured mechanism, including the file system, named + pipes, DCOM, or secure RPC. It has, however, wide privileges locally. +

    + +
    Never grant any network privileges to + the LocalSystem account! If you need Apache to be able + to access network resources, create a separate account for Apache as + noted below.
    + +

    You may want to create a separate account for running Apache + service(s). Especially, if you have to access network resources + via Apache, this is strongly recommended.

    + +
      +
    1. Create a normal domain user account, and be sure to + memorize its password.
    2. + +
    3. Grant the newly-created user a privilege of Log on + as a service and Act as part of the operating + system. On Windows NT 4.0 these privileges are granted via + User Manager for Domains, but on Windows 2000 and XP you probably + want to use Group Policy for propagating these settings. You can + also manually set these via the Local Security Policy MMC snap-in. +
    4. + +
    5. Confirm that the created account is a member of the Users + group.
    6. + +
    7. Grant the account read and execute (RX) rights to all document + and script folders (htdocs and cgi-bin + for example).
    8. + +
    9. Grant the account change (RWXD) rights to the + Apache logs directory.
    10. + +
    11. Grant the account read and execute (RX) rights to the + Apache.exe binary executable.
    12. +
    + +
    It is usually a good practice to grant the user the Apache + service runs as read and execute (RX) access to the whole Apache2 + directory, except the logs subdirectory, where the + user has to have at least change (RWXD) rights.
    + +

    If you allow the account to log in as a user and as a service, + then you can log on with that account and test that the account has the + privileges to execute the scripts, read the web pages, and that + you can start Apache in a console window. If this works, and you + have followed the steps above, Apache should execute as a service + with no problems.

    + +
    Error code 2186 is a good indication that + you need to review the "Log On As" configuration for the service, + since Apache cannot access a required network resource. Also, pay + close attention to the privileges of the user Apache is + configured to run as.
    + +

    When starting Apache as a service you may encounter an error + message from the Windows Service Control Manager. For example, + if you try to start Apache by using the Services applet in the + Windows Control Panel, you may get the following message:

    + +

    + Could not start the Apache2 service on \\COMPUTER
    + Error 1067; The process terminated unexpectedly. +

    + +

    You will get this generic error if there is any problem with + starting the Apache service. In order to see what is really causing + the problem you should follow the instructions for Running Apache + for Windows from the Command Prompt.

    + +

    There is some support for Apache on Windows 9x to behave in a + similar manner as a service on Windows NT. It is highly + experimental. It is not of production-class reliability, + and its future is not guaranteed. It can be mostly regarded as + a risky thing to play with - proceed with caution!

    + +

    There are some differences between the two kinds of services + you should be aware of:

    + +
      +
    • Apache will attempt to start and if successful it will run + in the background. If you run the command

      + +

      + httpd -n "MyServiceName" -k start +

      + +

      via a shortcut on your desktop, for example, then if the + service starts successfully, a console window will flash up but + it immediately disappears. If Apache detects any errors on startup + such as incorrect entries in the httpd.conf configuration file, + the console window will remain visible. This will display an error + message which will be useful in tracking down the cause of the + problem.

    • + +
    • Windows 9x does not support NET START or + NET STOP commands. You must control the Apache + service on the command prompt via the -k switches. +

    • + +
    • Apache and Windows 9x offer no support for running Apache + as a specific user with network privileges. In fact, Windows 9x + offers no security on the local machine, either. This is the + simple reason because of which the Apache Software Foundation + never endorses use of a Windows 9x -based system as a public + Apache server. The primitive support for Windows 9x exists only + to assist the user in developing web content and learning the + Apache server, and perhaps as an intranet server on a secured, + private network.

    • + +
    + +

    Once you have confirmed that Apache runs correctly as a + console application you can install, control and uninstall the + pseudo-service with the same commands as on Windows NT. You can + also use the Apache Service Monitor to manage Windows 9x + pseudo-services.

    + +
    top
    +
    +

    Running Apache as a Console Application

    + + +

    Running Apache as a service is usually the recommended way to + use it, but it is sometimes easier to work from the command line + (on Windows 9x running Apache from the command line is the + recommended way due to the lack of reliable service support.)

    + +

    To run Apache from the command line as a console application, + use the following command:

    + +

    + httpd +

    + +

    Apache will execute, and will remain running until it is stopped + by pressing Control-C.

    + +

    You can also run Apache via the shortcut Start Apache in Console + placed to Start Menu --> Programs --> Apache HTTP Server + 2.0.xx --> Control Apache Server during the installation. + This will open a console window and start Apache inside it. If you + don't have Apache installed as a service, the window will remain + visible until you stop Apache by pressing Control-C in the console + window where Apache is running in. The server will exit in a few + seconds. However, if you do have Apache installed as a service, the + shortcut starts the service. If the Apache service is running + already, the shortcut doesn't do anything.

    + +

    You can tell a running Apache to stop by opening another console + window and entering:

    + +

    + httpd -k shutdown +

    + +

    This should be preferred over pressing Control-C because this + lets Apache end any current operations and clean up gracefully.

    + +

    You can also tell Apache to restart. This forces it to reread + the configuration file. Any operations in progress are allowed to + complete without interruption. To restart Apache, use:

    + +

    + httpd -k restart +

    + +
    Note for people familiar with the Unix version of Apache: + these commands provide a Windows equivalent to kill -TERM + pid and kill -USR1 pid. The + command line option used, -k, was chosen as a reminder + of the kill command used on Unix.
    + +

    If the Apache console window closes immediately or unexpectedly + after startup, open the Command Prompt from the Start Menu --> + Programs. Change to the folder to which you installed Apache, type + the command apache, and read the error message. Then + change to the logs folder, and review the error.log + file for configuration mistakes. If you accepted the defaults when + you installed Apache, the commands would be:

    + +

    + c:
    + cd "\Program Files\Apache Group\Apache2\bin"
    + httpd +

    + +

    Then wait for Apache to stop, or press Control-C. Then enter the + following:

    + +

    + cd ..\logs
    + more < error.log +

    + +

    When working with Apache it is important to know how it will + find the configuration file. You can specify a configuration file + on the command line in two ways:

    + +
      +
    • -f specifies an absolute or relative path to + a particular configuration file:

      + +

      + httpd -f "c:\my server files\anotherconfig.conf" +

      + +

      or

      + +

      + httpd -f files\anotherconfig.conf +

    • + +
    • -n specifies the installed Apache service + whose configuration file is to be used:

      + +

      + httpd -n "MyServiceName" +

      +
    • +
    + +

    In both of these cases, the proper + ServerRoot should be set in + the configuration file.

    + +

    If you don't specify a configuration file with -f + or -n, Apache will use the file name compiled into the + server, such as conf\httpd.conf. This built-in path + is relative to the installation directory. You can verify the compiled + file name from a value labelled as SERVER_CONFIG_FILE when + invoking Apache with the -V switch, like this:

    + +

    + httpd -V +

    + +

    Apache will then try to determine its ServerRoot by trying the following, in this order:

    + +
      +
    1. A ServerRoot directive + via the -C command line switch.
    2. + +
    3. The -d switch on the command line.
    4. + +
    5. Current working directory.
    6. + +
    7. A registry entry which was created if you did a binary + installation.
    8. + +
    9. The server root compiled into the server. This is + /apache by default, you can verify it by using + apache -V and looking for a value labelled as + HTTPD_ROOT.
    10. +
    + +

    During the installation, a version-specific registry key is + created in the Windows registry. The location of this key depends + on the type of the installation. If you chose to install Apache + for all users, the key is located under the + HKEY_LOCAL_MACHINE hive, like this (the version + numbers will of course vary between different versions of Apache: +

    + +

    + HKEY_LOCAL_MACHINE\SOFTWARE\Apache Group\Apache\2.0.43 +

    + +

    Correspondingly, if you chose to install Apache for the current + user only, the key is located under the HKEY_CURRENT_USER + hive, the contents of which are dependent of the user currently + logged on:

    + +

    + HKEY_CURRENT_USER\SOFTWARE\Apache Group\Apache\2.0.43 +

    + +

    This key is compiled into the server and can enable you to test + new versions without affecting the current version. Of course, you + must take care not to install the new version in the same + directory as another version.

    + +

    If you did not do a binary install, Apache will in some + scenarios complain about the missing registry key. This warning can + be ignored if the server was otherwise able to find its + configuration file.

    + +

    The value of this key is the + ServerRoot directory which + contains the conf subdirectory. When Apache starts it + reads the httpd.conf file from that directory. If + this file contains a ServerRoot + directive which contains a different directory from the one + obtained from the registry key above, Apache will forget the + registry key and use the directory from the configuration file. If + you copy the Apache directory or configuration files to a new + location it is vital that you update the + ServerRoot directive in the + httpd.conf file to reflect the new location.

    + +
    top
    +
    +

    Testing the Installation

    + + +

    After starting Apache (either in a console window or as a + service) it will be listening on port 80 (unless you changed the + Listen directive in the + configuration files or installed Apache only for the current user). + To connect to the server and access the default page, launch a + browser and enter this URL:

    + +

    + http://localhost/ +

    + +

    Apache should respond with a welcome page and a link to the + Apache manual. If nothing happens or you get an error, look in the + error.log file in the logs subdirectory. + If your host is not connected to the net, or if you have serious + problems with your DNS (Domain Name Service) configuration, you + may have to use this URL:

    + +

    + http://127.0.0.1/ +

    + +

    If you happen to be running Apache on an alternate port, you need + to explicitly put that in the URL:

    + +

    + http://127.0.0.1:8080/ +

    + +

    Once your basic installation is working, you should configure it + properly by editing the files in the conf subdirectory. + Again, if you change the configuration of the Windows NT service + for Apache, first attempt to start it from the command line to + make sure that the service starts with no errors.

    + +

    Because Apache cannot share the same port with + another TCP/IP application, you may need to stop, uninstall or reconfigure + certain other services before running Apache. These conflicting + services include other WWW servers and some firewall implementations. +

    + +
    +
    +

    Available Languages:  en  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/platform/windows.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/platform/windows.html.ko.euc-kr new file mode 100644 index 00000000..cc46d62f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/platform/windows.html.ko.euc-kr @@ -0,0 +1,688 @@ + + + +Microsoft Windows¿¡¼­ ¾ÆÆÄÄ¡ »ç¿ë¹ý - Apache HTTP Server + + + + + +
    <-
    +

    Microsoft Windows¿¡¼­ ¾ÆÆÄÄ¡ »ç¿ë¹ý

    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + ko 

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

    ÀÌ ¹®¼­´Â Microsoft Windows¿¡¼­ ¾ÆÆÄÄ¡ 2.0À» ¼³Ä¡, ¼³Á¤, + ½ÇÇàÇÏ´Â ¹æ¹ýÀ» ¼³¸íÇÑ´Ù. À߸øµÈ ºÎºÐÀÌ Àְųª ´Ù¸¥ ¹æ¹ýÀ¸·Î + µµ¿òÀ» ÁÖ·Á¸é, ¹ö±× º¸°í + ÆäÀÌÁö¸¦ »ç¿ëÇÏ±æ ¹Ù¶õ´Ù.

    + +

    ÀÌ ¹®¼­´Â ¾ÆÆÄÄ¡ ¹ÙÀ̳ʸ® ¹èÆ÷º»À» ¼³Ä¡ÇÑ´Ù°í °¡Á¤ÇÑ´Ù. + (¾Æ¸¶µµ °³¹ß ȤÀº ¹ö±×¸¦ ã±âÀ§ÇØ) Á÷Á¢ ¾ÆÆÄÄ¡¸¦ ÄÄÆÄÀÏÇÏ·Á¸é + Microsoft Windows¿ë ¾ÆÆÄÄ¡ + ÄÄÆÄÀÏÀ» Âü°íÇ϶ó.

    + +

    ÇöÀç Microsoft Windows ¿î¿µÃ¼Á¦±ºÀÇ ¹öÀü Á¤Ã¥»ó + ÀÌ ¹®¼­´Â ´ÙÀ½°ú °°ÀÌ ±¸ºÐÇÑ´Ù:

    +
      +
    • Windows NT: Windows NT Ä¿³ÎÀ» ±â¹ÝÀ¸·Î + ÇÏ´Â ¸ðµç Windows ¹öÀüÀ» ÀǹÌÇÑ´Ù. Windows NT, Windows + 2000, Windows XP, Windows .Net Server 2003À» ÁöĪÇÑ´Ù.
    • +
    • Windows 9x: ¼ÒºñÀÚ Áß½ÉÀÇ ¿À·¡µÈ + Windows ¹öÀüÀ» ¶æÇÑ´Ù. Windows 95 (OSR2 Æ÷ÇÔ), Windows + 98, Windows ME¸¦ ÁöĪÇÑ´Ù.
    • +
    + +
    + +
    top
    +
    +

    ¿î¿µÃ¼Á¦ ¿ä±¸Á¶°Ç

    + + +

    ¾ÆÆÄÄ¡ 2.0À» ½ÇÇàÇϱâÀ§ÇÑ ±âº» Windows Ç÷¡ÆûÀº Windows + NTÀÌ´Ù. ¹ÙÀ̳ʸ® ¼³Ä¡ÇÁ·Î±×·¥Àº Intel°ú AMD¿Í °°Àº x86 °³¿­ + ÇÁ·Î¼¼¼­¿¡¼­¸¸ µ¿ÀÛÇÑ´Ù. ¾ÆÆÄÄ¡´Â Windows 9x¿¡¼­ ÃæºÐÈ÷ + °Ë»çÇÏÁö ¾Ê¾Ò±â¶§¹®¿¡ Àý´ë·Î ½ÇÁ¦ ¼­ºñ½º¿¡ »ç¿ëÇÏÁö ¾Ê±æ + ¹Ù¶õ´Ù. +

    + +

    ¿î¿µÃ¼Á¦¿¡ ¼³Ä¡ÇÑ TCP/IP ³×Æ®¿öÅ©°¡ µ¿ÀÛÇØ¾ß ÇÑ´Ù. Windows + 95¿¡¼­ ½ÇÇàÇÑ´Ù¸é, Winsock 2 ¾÷±×·¹À̵带 ¼³Ä¡ÇØ¾ß ÇÑ´Ù. + Windows 95¿ë Winsock 2´Â ¿©±â¿¡¼­ + ´Ù¿î¹ÞÀ» ¼ö ÀÖ´Ù. +

    + +

    Windows NT 4.0À» »ç¿ëÇÑ´Ù¸é ¼­ºñ½ºÆÑ 4ÀÇ TCP/IP ¹®Á¦¿Í + Winsock ¹®Á¦°¡ ´ÙÀ½ ¼­ºñ½ºÆÑ¿¡¼­ ÇØ°áµÇ¾ú±â¶§¹®¿¡, ¼­ºñ½ºÆÑ + 6À» ¼³Ä¡Çϱæ Àû±Ø ±ÇÇÑ´Ù.

    +
    top
    +
    +

    Windows¿ë ¾ÆÆÄÄ¡ ´Ù¿î·Îµå

    + + +

    ¾ÆÆÄÄ¡ À¥¼­¹ö http://httpd.apache.org/download.cgi¿¡¼­ + ¾ÆÆÄÄ¡ ÃֽŠ¹öÀü¿¡ ´ëÇÑ Á¤º¸¸¦ ¾òÀ» ¼ö ÀÖ´Ù. ¿©±â¿¡´Â ÃֽŠ+ ¹ßÇ¥ÆÇ°ú ¾ËÆÄ È¤Àº º£Å¸ Å×½ºÆ®¹öÀü°ú, ¾ÆÆÄÄ¡ À¥¼­¹ö¸¦ ´Ù¿î·ÎµåÇÒ + ¼ö ÀÖ´Â HTTP ¹Ì·¯¿Í FTP ¹Ì·¯ ¸ñ·ÏÀÌ ÀÖ´Ù. ºü¸£°í ¾ÈÁ¤ÇÏ°Ô + ´Ù¿î¹ÞÀ¸·Á¸é °¡±î¿î ¹Ì·¯¸¦ »ç¿ëÇÏ±æ ¹Ù¶õ´Ù.

    + +

    Windows¿¡ ¼³Ä¡ÇÏ·Á¸é È®ÀåÀÚ°¡ .msiÀÎ Windows¿ë + ¾ÆÆÄÄ¡ ¹öÀüÀ» ´Ù¿î¹Þ¾Æ¾ß ÇÑ´Ù. ÀÌ ÆÄÀÏÀº ¸·¹Ù·Î ½ÇÇàÇÒ ¼ö + ÀÖ´Â ¾ÆÆÄÄ¡¸¦ ÀúÀåÇÑ Microsoft ¼³Ä¡ÆÄÀÏÀÌ´Ù. µû·Î ¼Ò½ºÄڵ常 + ¹­¾îµÐ .zip ÆÄÀÏÀÌ ÀÖ´Ù. Microsoft Visual C++ + (Visual Studio)À» »ç¿ëÇÏ¿© Á÷Á¢ ¾ÆÆÄÄ¡¸¦ ÄÄÆÄÀÏÇÒ ¼öµµ ÀÖ´Ù.

    +
    top
    +
    +

    Windows¿ë ¾ÆÆÄÄ¡ ¼³Ä¡Çϱâ

    + + +

    ¼³Ä¡ÇÏ·Á¸é Microsoft Installer 1.2 ÀÌ»ó ¹öÀüÀÌ ÇÊ¿äÇÏ´Ù. + Windows 9x¸¦ »ç¿ëÇÑ´Ù¸é ¿©±â¿¡¼­ + Microsoft Installer¸¦ 2.0 ¹öÀüÀ¸·Î ¾÷±×·¹À̵åÇÒ ¼ö ÀÖ°í, + Windows NT 4.0°ú 2000À» »ç¿ëÇÑ´Ù¸é ¿©±â¿¡¼­ + 2.0 ¹öÀü ¾÷µ¥ÀÌÆ®¸¦ ±¸ÇÒ ¼ö ÀÖ´Ù. Windows XP´Â ¾÷µ¥ÀÌÆ®ÇÒ + ÇÊ¿ä°¡ ¾ø´Ù.

    + +

    ¹ÙÀ̳ʸ® ¼³Ä¡ÆÄÀϷδ °°Àº ÄÄÇ»ÅÍ¿¡ ¼­·Î ´Ù¸¥ ¾ÆÆÄÄ¡ + 2.0 ¹öÀüÀ» ¼³Ä¡ÇÒ ¼ö ¾øÀ½À» ÁÖÀÇÇ϶ó. ±×·¯³ª 1.3 + ¹öÀü°ú 2.0 ¹öÀüÀº °°Àº ÄÄÇ»ÅÍ¿¡ ¾Æ¹« ¹®Á¦¾øÀÌ + ¼³Ä¡ÇÒ ¼ö ÀÖ´Ù. °°Àº ÄÄÇ»ÅÍ¿¡ µÎ°¡Áö ´Ù¸¥ 2.0 ¹öÀüÀ» ¼³Ä¡ÇÏ·Á¸é + ¼Ò½º¸¦ ÄÄÆÄÀÏÇÏ¿© ¾ÆÆÄÄ¡¸¦ + ¼³Ä¡ÇØ¾ß ÇÑ´Ù.

    + +

    À§¿¡¼­ ´Ù¿î¹ÞÀº ¾ÆÆÄÄ¡ .msi ÆÄÀÏÀ» ½ÇÇàÇÑ´Ù. + ¼³Ä¡ÇÒ¶§ ´ÙÀ½°ú °°Àº °ÍÀ» ¹°¾îº»´Ù:

    + +
      +
    1. ³×Æ®¿öÅ© µµ¸ÞÀÎ (Network Domain). + µî·ÏµÈ ¼­¹öÀÇ DNS µµ¸ÞÀÎÀ» ÀÔ·ÂÇÑ´Ù. ¿¹¸¦ µé¾î, ¼­¹öÀÇ + Àüü DNS À̸§ÀÌ server.mydomain.netÀ̶ó¸é + ¿©±â¿¡ mydomain.netÀ» ÀÔ·ÂÇÑ´Ù.

    2. + +
    3. ¼­¹ö¸í (Server Name). ¼­¹öÀÇ Àüü + DNS À̸§. À§ÀÇ °æ¿ì ¿©±â¿¡ server.mydomain.netÀ» + ÀÔ·ÂÇÑ´Ù.

    4. + +
    5. °ü¸®ÀÚ ÀüÀÚ¿ìÆí ÁÖ¼Ò (Administrator's Email + Address). ¿©±â¿¡ ¼­¹ö °ü¸®ÀÚ³ª À¥¸¶½ºÅÍÀÇ ÀüÀÚ¿ìÆí + ÁÖ¼Ò¸¦ ÀÔ·ÂÇÑ´Ù. ±âº»ÀûÀ¸·Î Ŭ¶óÀ̾ðÆ®¿¡°Ô º¸³»´Â ¿À·ù¹®¿¡ + ÀÌ ÁÖ¼Ò¸¦ ±â·ÏÇÑ´Ù.

    6. + +
    7. »ç¿ëÀÚ ´ë»ó (For whom to install + Apache) »õ·Î ¼³Ä¡ÇÏ´Â ¾ÆÆÄÄ¡°¡ 80¹ø Æ÷Æ®¿¡¼­ + ¿äûÀ» ±â´Ù¸®°Ô ÇÏ·Á¸é for All Users, on Port 80, + as a Service - Recommended (¸ðµç »ç¿ëÀÚ, 80¹ø Æ÷Æ®, + service·Î - Ãßõ)¸¦ ¼±ÅÃÇÑ´Ù. ¾ÆÆÄÄ¡¸¦ service·Î ½ÇÇàÇÑ´Ù + (Áï, ¾ÆÆÄÄ¡´Â ¼­¹ö¿¡ ·Î±×ÀÎÇÑ »ç¶÷ÀÌ ¾ø¾îµµ ½ÇÇàµÈ´Ù). + °³ÀÎÀûÀ¸·Î Å×½ºÆ®Çغ¸°Å³ª ÀÌ¹Ì 80¹ø Æ÷Æ®¸¦ »ç¿ëÇÏ´Â ´Ù¸¥ + À¥¼­¹ö°¡ ÀÖ´Ù¸é only for the Current User, on Port + 8080, when started Manually (ÇöÀç »ç¿ëÀÚ¸¸, 8080¹ø + Æ÷Æ®, Á÷Á¢ ½ÃÀÛ)¸¦ ¼±ÅÃÇÑ´Ù.

    8. + +
    9. ¼³Ä¡ Á¾·ù (The installation type). + ¸ðµâ °³¹ß¿¡ ÇÊ¿äÇÑ ¼Ò½ºÄÚµå¿Í ¶óÀ̺귯¸®¸¦ Á¦¿ÜÇÑ ¸ðµç + °ÍÀ» ¼³Ä¡ÇÏ·Á¸é TypicalÀ» ¼±ÅÃÇÑ´Ù. + CustomÀ» ¼±ÅÃÇÏ¸é ¼³Ä¡ÇÒ ³»¿ëÀ» ÁöÁ¤ÇÒ ¼ö + ÀÖ´Ù. Àüü ¼³Ä¡½Ã µð½ºÅ©¿¡ ºó °ø°£ÀÌ ¾à 13 ¸Þ°¡¹ÙÀÌÆ® + Á¤µµ ÇÊ¿äÇÏ´Ù. ÀÌ ¼öÄ¡´Â À¥»çÀÌÆ® Å©±â¸¦ Á¦¿ÜÇÑ + °ÍÀÌ´Ù.

    10. + +
    11. ¼³Ä¡ Àå¼Ò (Where to install). + ±âº» °æ·Î´Â C:\Program Files\Apache GroupÀÌ°í, + ÀÌ°÷¿¡ Apache2¶ó´Â µð·ºÅ丮¸¦ ¸¸µç´Ù.

    12. +
    + +

    ¼³Ä¡ÇÒ µ¿¾È ¾ÆÆÄÄ¡´Â conf ÇÏÀ§µð·ºÅ丮¿¡ + ÀÖ´Â ÆÄÀϵéÀ» ¼±ÅÃÇÑ ¼³Ä¡ µð·ºÅ丮¿¡ ¸Â°Ô ±¸¼ºÇÑ´Ù. ±×·¯³ª + ÀÌ µð·ºÅ丮¿¡ ¼³Á¤ÆÄÀÏÀÌ ÀÌ¹Ì ÀÖ´Ù¸é ±×´ë·Î µÐ´Ù. ´ë½Å, + ÇØ´ç ÆÄÀÏÀÇ »õ·Î¿î º¹»çº»¿¡ È®ÀåÀÚ .default¸¦ + ºÙÀδÙ. ¿¹¸¦ µé¾î, conf\httpd.conf°¡ ÀÌ¹Ì ÀÖ´Ù¸é + conf\httpd.conf.default·Î À̸§À» º¯°æÇÑ´Ù. + ¼³Ä¡ÈÄ .default ÆÄÀÏÀÇ ¼³Á¤À» Á÷Á¢ »ìÆ캸°í, + ÇÊ¿äÇÏ´Ù¸é ±âÁ¸ ¼³Á¤ÆÄÀÏÀ» ¼öÁ¤ÇØ¾ß ÇÑ´Ù.

    + +

    ¶Ç, ÀÌ¹Ì htdocs\index.htmlÀ̶ó´Â ÆÄÀÏÀÌ + ÀÖ´Ù¸é ±×´ë·Î µÐ´Ù (index.html.default¶ó°í + º¹»çÇÏÁöµµ ¾Ê´Â´Ù). Áï, ±âÁ¸¿¡ ¾ÆÆÄÄ¡°¡ ¼³Ä¡µÇÀÖ´õ¶óµµ ¾ÈÀüÇÏ°Ô + ¾ÆÆÄÄ¡¸¦ »õ·Î ¼³Ä¡ÇÒ ¼ö ÀÖ´Ù. ¹°·Ð ¼³Ä¡Çϱâ Àü¿¡ ¼­¹ö¸¦ + Áß´ÜÇÏ°í, ¼³Ä¡ÈÄ »õ·Î¿î ¼­¹ö¸¦ ½ÃÀÛÇØ¾ß ÇÑ´Ù.

    + +

    ¾ÆÆÄÄ¡ ¼³Ä¡ÈÄ ÇÊ¿äÇÏ´Ù¸é conf ÇÏÀ§µð·ºÅ丮¿¡ + ÀÖ´Â ¼³Á¤ÆÄÀÏÀ» ¼öÁ¤ÇØ¾ß ÇÑ´Ù. ÆÄÀÏÀº ¾ÆÆÄÄ¡¸¦ ¼³Ä¡ÇÑ µð·ºÅ丮ÀÇ + htdocs ÇÏÀ§µð·ºÅ丮¿¡ ÀÖ´Â ¹®¼­¸¦ ¼­ºñ½ºÇϵµ·Ï + ¼³Á¤µÇÀÖ´Ù. ½ÇÁ¦·Î ¾ÆÆÄÄ¡¸¦ »ç¿ëÇϱâ Àü¿¡ ¼³Á¤ÇØ¾ß ÇÒ ¿É¼ÇÀÌ + ¸¹´Ù. ±×·¯³ª »¡¸® ½ÇÇàÇغ¼ ¼ö ÀÖµµ·Ï ±âº» ¼³Á¤ÆÄÀϷεµ µ¿ÀÛÇÑ´Ù.

    +
    top
    +
    +

    Windows¿ë ¾ÆÆÄÄ¡ ¼³Á¤Çϱâ

    + + +

    ¾ÆÆÄÄ¡´Â conf ÇÏÀ§µð·ºÅ丮¿¡ ÀÖ´Â ÆÄÀÏ·Î + ¼³Á¤ÇÑ´Ù. ÀÌ ÆÄÀÏÀº À¯´Ð½º¿ë°ú °°Áö¸¸, Windows¿ë ¾ÆÆÄÄ¡ + ƯÀ¯ÀÇ Áö½Ã¾î°¡ ¸î°³ ÀÖ´Ù. »ç¿ë°¡´ÉÇÑ ¸ðµç Áö½Ã¾î¸¦ º¸·Á¸é + Áö½Ã¾î ¸ñ·ÏÀ» Âü°íÇ϶ó.

    + +

    Windows¿ë ¾ÆÆÄÄ¡ÀÇ ÁÖµÈ Â÷ÀÌÁ¡Àº:

    +
      +
    • Windows¿ë ¾ÆÆÄÄ¡´Â ´ÙÁß¾²·¹µå ¹æ½ÄÀ» »ç¿ëÇϱ⶧¹®¿¡, + À¯´Ð½º¿Í ´Þ¸® ¿äû¸¶´Ù ´Ù¸¥ ÇÁ·Î¼¼½º¸¦ »ç¿ëÇÏÁö ¾Ê´Â´Ù. + ´ë½Å ¾ÆÆÄÄ¡ ÇÁ·Î¼¼½º´Â Ç×»ó, ºÎ¸ð ÇÁ·Î¼¼½º¿Í ¿äûÀ» ó¸®ÇÏ´Â + ÀÚ½Ä ÇÁ·Î¼¼½º, 2°³ÀÌ´Ù. ÀÚ½Ä ÇÁ·Î¼¼½º¿¡ ÀÖ´Â ¿©·¯ ¾²·¹µåµéÀÌ + ¿äûµéÀ» ó¸®ÇÑ´Ù. +

      + +

      ÇÁ·Î¼¼½º °ü¸® Áö½Ã¾îµµ ´Ù¸£´Ù:

      + +

      MaxRequestsPerChild: À¯´Ð½º¿Í + °°ÀÌ, ÀÚ½Ä ÇÁ·Î¼¼½º°¡ ¿äûÀ» ¾ó¸¶¸¸Å­ ó¸®ÇÏ°í Á×À»Áö¸¦ + Á¶Á¤ÇÑ´Ù. ±×·¯³ª À¯´Ð½º¿Í ´Þ¸® ÇÁ·Î¼¼½º°¡ Çѹø¿¡ ÇÑ ¿äû¸¸À» + ó¸®ÇÏÁö¾Ê°í Çѹø¿¡ ¸ðµç ¿äûÀ» ¼­ºñ½ºÇϱ⶧¹®¿¡, ¼³Á¤ÇÑ´Ù¸é + ¸Å¿ì Å« °ªÀ» ¼³Á¤ÇÏ±æ ±ÇÇÑ´Ù. ±ÇÀåÇÏ´Â ±âº»°ª + MaxRequestsPerChild 0À» »ç¿ëÇϸé ÀÚ½Ä ÇÁ·Î¼¼½º´Â + Á×Áö¾Ê°í ¿µ¿øÈ÷ ¿äûÀ» ¼­ºñ½ºÇÑ´Ù.

      + +
      °æ°í: ÀÚ½Ä ÇÁ·Î¼¼½º´Â »õ·Î + ½ÃÀÛÇÒ ¶§¸¶´Ù ¼­¹ö¼³Á¤ÆÄÀÏÀ» »õ·Î Àд´Ù. + httpd.conf¸¦ ¼öÁ¤Çß´Ù¸é, ÀÚ½Ä ÇÁ·Î¼¼½º°¡ + ½ÃÀÛÇÏÁö ¾Ê°Å³ª ¿¹±âÄ¡¾ÊÀº °á°ú°¡ ¹ß»ýÇÒ ¼ö ÀÖ´Ù.
      + +

      ThreadsPerChild: + ÀÌ Áö½Ã¾î´Â »õ·Î Ãß°¡µÇ¾ú´Ù. ÀÌ Áö½Ã¾î´Â ¼­¹ö°¡ »ç¿ëÇÒ + ¾²·¹µå °³¼ö¸¦ ÁöÁ¤ÇÑ´Ù. ÀÌ °ªÀÌ ¼­¹ö°¡ Çѹø¿¡ ó¸®ÇÒ ¼ö + ÀÖ´Â ÃÖ´ë ¿¬°á°³¼öÀ̱⶧¹®¿¡, »çÀÌÆ®¿¡ Á¢¼Ó·®ÀÌ ¸¹´Ù¸é + ÃæºÐÈ÷ Å« °ªÀ» ¼³Á¤ÇØ¾ß ÇÑ´Ù. ±ÇÀåÇÏ´Â ±âº»°ªÀº + ThreadsPerChild 50ÀÌ´Ù.

    • + +
    • ÆÄÀϸíÀ» ¾Æ±Ô¸ÕÆ®·Î ¹Þ´Â Áö½Ã¾î´Â À¯´Ð½º ÆÄÀϸíÀÌ + ¾Æ´Ñ Windows ÆÄÀϸíÀ» »ç¿ëÇØ¾ß ÇÑ´Ù. ±×·¯³ª ¾ÆÆÄÄ¡ ³»ºÎ¿¡¼­ + À¯´Ð½º½Ä À̸§À» »ç¿ëÇϱ⶧¹®¿¡ ¹é½½·¡½¬°¡ ¾Æ´Ñ ½½·¡½¬¸¦ + »ç¿ëÇØ¾ß ÇÑ´Ù. µå¶óÀÌºê ¹®ÀÚ¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. µå¶óÀ̺긦 + ÁöÁ¤ÇÏÁö ¾ÊÀ¸¸é ¾ÆÆÄÄ¡ ½ÇÇàÆÄÀÏÀÌ ÀÖ´Â µå¶óÀ̺긦 + »ç¿ëÇÑ´Ù.

    • + +
    • Windows¿ë ¾ÆÆÄÄ¡´Â ¼­¹ö¸¦ ´Ù½Ã ÄÄÆÄÀÏÇÏÁö ¾Ê°í + ½ÇÇàÁß¿¡ ¸ðµâÀ» ÀоîµéÀÏ ¼ö ÀÖ´Ù. ±âº»°ªÀ¸·Î ¾ÆÆÄÄ¡¸¦ + ÄÄÆÄÀÏÇϸé \Apache2\modules µð·ºÅ丮¿¡ ¿©·¯ + ¼±Åð¡´ÉÇÑ ¸ðµâÀ» ¼³Ä¡ÇÑ´Ù. ÀÌ ¸ðµâ ȤÀº ´Ù¸¥ ¸ðµâÀ» + »ç¿ëÇÏ·Á¸é »õ·Î »ý±ä LoadModule Áö½Ã¾î¸¦ »ç¿ëÇÑ´Ù. + ¿¹¸¦ µé¾î, status ¸ðµâÀ» »ç¿ëÇÑ´Ù¸é + (access.conf¿¡ status°ü·Ã Áö½Ã¾î¿Í ÇÔ²²) + ¾Æ·¡¿Í °°ÀÌ ¼³Á¤ÇÑ´Ù:

      + +

      + LoadModule status_module modules/mod_status.so +

      + +

      ÀоîµéÀÏ ¼ö ÀÖ´Â + ¸ðµâ ¸¸µé±â¿¡ ´ëÇÑ Á¤º¸µµ ÀÖ´Ù.

    • + +
    • ¾ÆÆÄÄ¡´Â Microsoft IIS¿Í ´Ù¸¥ Windows ¼­¹ö°¡ »ç¿ëÇÏ´Â + ISAPI (Internet Server Application Programming Interface) + È®ÀåÀ» (Áï, ÀÎÅÍ³Ý ¼­¹ö ÇÁ·Î±×·¥) ÀоîµéÀÏ ¼öµµ ÀÖ´Ù. + ´õ ÀÚ¼¼ÇÑ Á¤º¸°¡ ÀÖ´Ù. + ¾ÆÆÄÄ¡´Â ISAPI ÇÊÅ͸¦ ÀоîµéÀÏ ¼ö ¾øÀ½À» + ÁÖÀÇÇ϶ó.

    • + +
    • CGI ½ºÅ©¸³Æ®¸¦ »ç¿ëÇÑ´Ù¸é ScriptInterpreterSource Áö½Ã¾î¸¦ + »ç¿ëÇÏ¿© ¾ÆÆÄÄ¡°¡ ½ºÅ©¸³Æ®ÀÇ ÀÎÅÍÇÁ¸®Å͸¦ ã´Â ¹æ¹ýÀ» + ¼³Á¤ÇÒ ¼ö ÀÖ´Ù.

    • + +
    • Windows¿¡¼­ .htaccess¿Í °°Àº ÆÄÀϸíÀ» + ´Ù·ç±â Èûµå¹Ç·Î, AccessFilename Áö½Ã¾î¸¦ »ç¿ëÇÏ¿© + µð·ºÅ丮º° ¼³Á¤ÆÄÀÏ À̸§À» º¯°æÇϸé ÆíÇÏ´Ù.

    • + +
    • Windows NT¶ó¸é ¾ÆÆÄÄ¡ ½ÃÀ۽à ¹ß»ýÇÑ ¿À·ù¸¦ Windows + À̺¥Æ® ·Î±×¿¡ ±â·ÏÇÑ´Ù. ±×·¡¼­ ¾ÆÆÄÄ¡°¡ º¸Åë »ç¿ëÇÏ´Â + error.log ÆÄÀÏÀ» »ç¿ëÇÒ ¼ö ¾ø´Â °æ¿ì¿¡ ´ëºñÇÑ´Ù. + Windows À̺¥Æ® ·Î±×´Â Windows NT 4.0¿¡¼­´Â À̺¥Æ® ºä¾î + ÇÁ·Î±×·¥À¸·Î, ÃֽŠWindows ¹öÀü¿¡¼­´Â À̺¥Æ® ºä¾î MMC + ½º³ÀÀο¡¼­ º¼ ¼ö ÀÖ´Ù.

      + +
      Windows 9x¿¡´Â Windows À̺¥Æ® ·Î±×°¡ ¾ø±â¶§¹®¿¡ + ½ÃÀ۽à ¹ß»ýÇÑ ¿À·ù¸¦ ±â·ÏÇÏÁö ¾Ê´Â´Ù.
    • +
    + +
    top
    +
    +

    ¾ÆÆÄÄ¡¸¦ Service·Î ½ÇÇàÇϱâ

    + + +

    Windows NT¿¡¼­´Â ¾ÆÆÄÄ¡¸¦ service·Î ½ÇÇàÇÒ ¼ö ÀÖ´Ù. Windows + 9x¿¡´Â ¸Å¿ì ½ÇÇèÀûÀÎ ¹æ¹ýÀ¸·Î ºñ½ÁÇÑ ±â´ÉÀ» Áö¿øÇÑ´Ù.

    + +

    ¼³Ä¡½Ã ÀÚµ¿À¸·Î ¾ÆÆÄÄ¡¸¦ service·Î ¼³Ä¡ÇÒ ¼ö ÀÖ´Ù. "¸ðµç + »ç¿ëÀÚ"¸¦ ¼±ÅÃÇϸé, ¾ÆÆÄÄ¡ service°¡ ¸¸µé¾îÁø´Ù. "ÇöÀç + »ç¿ëÀÚ¸¸"À» ¼±ÅÃÇÏ´õ¶óµµ ¼³Ä¡ÈÄ Á÷Á¢ ¾ÆÆÄÄ¡¸¦ service·Î + µî·ÏÇÒ ¼ö ÀÖ´Ù. service¸¦ ¼³Ä¡ÇÏ·Á¸é Administrators ±×·ìÀÇ + ±¸¼º¿øÀ̾î¾ß ÇÑ´Ù.

    + +

    ¾ÆÆÄÄ¡¿¡´Â Apache Service Monitor¶ó´Â µµ±¸°¡ ÀÖ´Ù. ÀÌ + µµ±¸¸¦ »ç¿ëÇÏ¸é ³×Æ®¿÷¿¡ ÀÖ´Â ´Ù¸¥ ÄÄÇ»ÅÍ¿¡ ¼³Ä¡µÈ ¾ÆÆÄÄ¡ + »óŵµ È®ÀÎÇÏ°í °ü¸®ÇÒ ¼ö ÀÖ´Ù. monitor·Î ¾ÆÆÄÄ¡ service¸¦ + °ü¸®ÇÏ·Á¸é ¸ÕÀú service¸¦ (¼³Ä¡½Ã ÀÚµ¿À¸·Î ȤÀº Á÷Á¢) ¼³Ä¡ÇØ¾ß + ÇÑ´Ù. +

    + +

    ¾ÆÆÄÄ¡ bin ÇÏÀ§µð·ºÅ丮¿¡¼­ ¸í·ÉÇà ÇÁ·ÒÇÁÆ®¿¡ + ´ÙÀ½°ú °°ÀÌ ÀÔ·ÂÇÏ¸é ¾ÆÆÄÄ¡¸¦ Windows NT service·Î ¼³Ä¡ÇÑ´Ù:

    + +

    + apache -k install +

    + +

    ¼³Ä¡ÇÒ service À̸§À» ÁöÁ¤ÇÏ°í ½Í´Ù¸é ´ÙÀ½ ¸í·É¾î¸¦ »ç¿ëÇÑ´Ù. + ÄÄÇ»ÅÍ¿¡ ¾ÆÆÄÄ¡°¡ ¿©·¯°³ ¼³Ä¡µÇÀÖ´Ù¸é À̸§À» ´Ù¸£°Ô ÁÖ¾î¾ß + ÇÑ´Ù.

    + +

    + apache -k install -n "MyServiceName" +

    + +

    service°¡ »ç¿ëÇÒ ¼³Á¤ÆÄÀÏÀ» Á÷Á¢ ÁöÁ¤ÇÏ·Á¸é ´ÙÀ½°ú °°ÀÌ + ÇÑ´Ù:

    + +

    + apache -k install -n "MyServiceName" -f "c:\files\my.conf" +

    + +

    -k install ¿Ü¿¡ ´Ù¸¥ ÆĶó¹ÌÅ͸¦ »ç¿ëÇÏÁö + ¾ÊÀ¸¸é, service À̸§Àº Apache2°¡ µÇ°í ¼³Á¤ÆÄÀÏÀº + conf\httpd.conf°¡ µÈ´Ù. +

    + +

    ¾ÆÆÄÄ¡ service¸¦ Á¦°ÅÇϱ⠽±´Ù. °£´ÜÈ÷:

    + +

    + apache -k uninstall +

    + +

    ´ÙÀ½°ú °°ÀÌ Á¦°ÅÇÒ ¾ÆÆÄÄ¡ service¸¦ ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù:

    + +

    + apache -k uninstall -n "MyServiceName" +

    + +

    º¸Åë ¾ÆÆÄÄ¡ service ½ÃÀÛ, Àç½ÃÀÛ, Á¾·á´Â Apache Service + Monitor³ª NET START Apache2, NET STOP + Apache2 °°Àº ¸í·É¾î ȤÀº Windows ¼­ºñ½º °ü¸®Ã¢¿¡¼­ + ÇÑ´Ù. ¾î¶² ¹æ¹ýÀ» »ç¿ëÇϵçÁö ¾ÆÆÄÄ¡ service¸¦ ½ÃÀÛÇϱâ Àü¿¡ + ¼³Á¤ÆÄÀÏÀ» °Ë»çÇغÁ¾ß ÇÑ´Ù:

    + +

    + apache -n "MyServiceName" -t +

    + +

    ¸í·ÉÇà ¿É¼ÇÀ¸·Îµµ ¾ÆÆÄÄ¡ service¸¦ Á¶Á¤ÇÒ ¼ö ÀÖ´Ù. ¼³Ä¡ÇÑ + ¾ÆÆÄÄ¡ serivce¸¦ ½ÃÀÛÇÏ·Á¸é:

    + +

    + apache -k start +

    + +

    ¸í·ÉÇà ¿É¼ÇÀ¸·Î ¾ÆÆÄÄ¡ service¸¦ Á¾·áÇÏ·Á¸é:

    + +

    + apache -k stop +

    + +

    ȤÀº

    + +

    + apache -k shutdown +

    + +

    ½ÇÇàÁßÀÎ service¸¦ Àç½ÃÀÛÇÏ¿© ¼³Á¤ÆÄÀÏÀ» ´Ù½Ã Àеµ·Ï + ÇÒ ¼ö ÀÖ´Ù:

    + +

    + apache -k restart +

    + +

    ±âº»ÀûÀ¸·Î ¸ðµç ¾ÆÆÄÄ¡ service´Â ½Ã½ºÅÛ »ç¿ëÀÚ + (LocalSystem °èÁ¤) ±ÇÇÑÀ¸·Î ½ÇÇàÇϵµ·Ï µî·ÏµÈ´Ù. + Windows º¸¾È±¸Á¶»ó LocalSystem °èÁ¤Àº ÆÄÀϽýºÅÛ, + named pipes, DCOM, secure RPC µî ¾î¶² ¹æ¹ýÀ» »ç¿ëÇϵçÁö + ³×Æ®¿÷¿¡ Á¢±ÙÇÒ ¼ö ¾ø´Ù. ±×·¯³ª ÇØ´ç ÄÄÇ»ÅÍ¿¡¼­´Â ¸¹Àº ±ÇÇÑÀ» + °¡Áø´Ù. +

    + +
    LocalSystem °èÁ¤¿¡°Ô + ³×Æ®¿÷ ±ÇÇÑÀ» Àý´ë·Î ÁÖÁö ¸¶¶ó! ¾ÆÆÄÄ¡°¡ ³×Æ®¿÷ ÀÚ¿ø¿¡ Á¢±ÙÇØ¾ß + ÇÑ´Ù¸é, ¾Æ·¡¿¡¼­ ¼³¸íÇÏ´Â ¹æ¹ýÀ¸·Î ¾ÆÆÄÄ¡¸¦ À§ÇÑ º°µµÀÇ + °èÁ¤À» ¸¸µé¾î¶ó.
    + +

    ¾ÆÆÄÄ¡ service¸¦ ½ÇÇàÇϱâÀ§ÇÑ º°µµÀÇ °èÁ¤À» ¸¸µé ¼öµµ + ÀÖ´Ù. ƯÈ÷ ¾ÆÆÄÄ¡°¡ ³×Æ®¿÷ ÀÚ¿ø¿¡ Á¢±ÙÇØ¾ß ÇÑ´Ù¸é ÀÌ ¹æ¹ýÀ» + °­·ÂÈ÷ ±ÇÇÑ´Ù.

    + +
      +
    1. ÀÏ¹Ý µµ¸ÞÀÎ »ç¿ëÀÚ °èÁ¤À» ¸¸µé°í ¾ÏÈ£¸¦ ±â¾ïÇ϶ó.
    2. + +
    3. »õ·Î ¸¸µç °èÁ¤¿¡ ¼­ºñ½º·Î ·Î±×¿Â¿Í + ¿î¿µ üÁ¦ÀÇ ÀϺηΠȰµ¿ ±ÇÇÑÀ» + ºÎ¿©ÇÑ´Ù. Windows NT 4.0¿¡¼­´Â User Manager for Domains¿¡¼­ + ±ÇÇÑÀ» ºÎ¿©ÇÒ ¼ö ÀÖ°í, Windows 2000°ú XP¿¡¼­´Â ¾Æ¸¶µµ + "±×·ì Á¤Ã¥"À» »ç¿ëÇØ¾ß ÇÑ´Ù. "·ÎÄà º¸¾È ¼³Á¤" MMC + ½º³ÀÀο¡¼­ Á÷Á¢ ¼³Á¤ÇØÁÙ ¼öµµ ÀÖ´Ù. +
    4. + +
    5. »õ·Î ¸¸µç °èÁ¤ÀÌ Users ±×·ì¿¡ ¼ÓÇÏ´ÂÁö È®ÀÎÇÑ´Ù.
    6. + +
    7. ¸ðµç ¹®¼­¿Í ½ºÅ©¸³Æ® Æú´õ¿¡ (¿¹¸¦ µé¾î + htdocs¿Í cgi-bin) ´ëÇØ ÀÐ±â ¹× + ½ÇÇà (RX) ±ÇÇÑÀ» ºÎ¿©ÇÑ´Ù.
    8. + +
    9. ¾ÆÆÄÄ¡ logs µð·ºÅ丮¿¡ ¼öÁ¤ (RWXD) ±ÇÇÑÀ» + ºÎ¿©ÇÑ´Ù.
    10. + +
    11. Apache.exe ½ÇÇàÆÄÀÏ¿¡ ÀÐ±â ¹× ½ÇÇà (RX) + ±ÇÇÑÀ» ºÎ¿©ÇÑ´Ù.
    12. +
    + +
    ¾ÆÆÄÄ¡ service¸¦ ½ÇÇàÇÏ´Â »ç¿ëÀÚ¿¡°Ô ÃÖ¼ÒÇÑ ¼öÁ¤ (RWXD) + ±ÇÇÑÀÌ ÇÊ¿äÇÑ logs ÇÏÀ§µð·ºÅ丮¸¦ Á¦¿ÜÇÏ°í + Apache2 µð·ºÅ丮 Àüü¿¡ ÀÐ±â ¹× ½ÇÇà (RX) ±ÇÇÑÀ» ºÎ¿©ÇÏ´Â + °ÍÀÌ ÁÁ´Ù.
    + +

    °èÁ¤¿¡ "·ÎÄà ·Î±×¿Â"°ú "¼­ºñ½º·Î ·Î±×¿Â" ±ÇÇÑÀÌ ÀÖ´Ù¸é, + ±× °èÁ¤À¸·Î ·Î±×¿ÂÇÏ¿© °èÁ¤ÀÌ ½ºÅ©¸³Æ®¸¦ ½ÇÇàÇÏ°í À¥ÆäÀÌÁö¸¦ + ÀÐÀ¸¸ç ÄܼÖâ¿¡¼­ ¾ÆÆÄÄ¡¸¦ ½ÃÀÛÇÒ ¼ö ÀÖ´ÂÁö °Ë»çÇغ¼ ¼ö + ÀÖ´Ù. ¿©±â¼­ ¹®Á¦°¡ ¾ø´Ù¸é ¾ÆÆÄÄ¡¸¦ service·Î ½ÇÇàÇصµ ¹®Á¦°¡ + ¾ø´Ù.

    + +
    Error code 2186Àº ¾ÆÆÄÄ¡°¡ ÇÊ¿äÇÑ + ³×Æ®¿÷ ÀÚ¿ø¿¡ Á¢±ÙÇÒ ¼ö ¾ø´Ù´Â ¸»·Î serviceÀÇ "·Î±×¿Â" + ¼³Á¤À» È®ÀÎÇ϶ó. ¶Ç, ¾ÆÆÄÄ¡¸¦ ½ÇÇàÇÏ´Â °èÁ¤ÀÇ ±ÇÇÑÀ» + »ìÆìºÁ¶ó.
    + +

    ¾ÆÆÄÄ¡¸¦ service·Î ½ÇÇàÇϸé Windows Service Control + Manager¿¡¼­ ¿À·ù¹®À» º¼ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î, Á¦¾îÆÇ¿¡¼­ + "¼­ºñ½º"¸¦ »ç¿ëÇÏ¿© ¾ÆÆÄÄ¡¸¦ ½ÃÀÛÇÏ´Â °æ¿ì ´ÙÀ½°ú °°Àº ¹®±¸°¡ + ³ª¿Ã ¼ö ÀÖ´Ù:

    + +

    + Could not start the Apache2 service on \\COMPUTER
    + Error 1067; The process terminated unexpectedly. +

    + +

    ¾ÆÆÄÄ¡ service¸¦ ½ÃÀÛÇÒ¶§ ¹®Á¦°¡ ÀÖÀ¸¸é ÀϹÝÀûÀÎ ÀÌ·± + ¿À·ù°¡ ³ª¿Â´Ù. ½ÇÁ¦ ¾îµð°¡ ¹®Á¦ÀÎÁö ¾Ë·Á¸é ¾ÆÆÄÄ¡¸¦ ÄÜ¼Ö + ÇÁ·Î±×·¥À¸·Î ½ÇÇàÇغ¸¶ó.

    + +

    Windows 9x¿¡¼­ ¾ÆÆÄÄ¡´Â Windows NTÀÇ service¿Í ºñ½ÁÇÑ + ¹æ¹ýÀ» Áö¿øÇÑ´Ù. ±×·¯³ª ¸Å¿ì ½ÇÇèÀûÀÎ ±â´ÉÀÌ´Ù. + ½ÇÁ¦ ¼­ºñ½º¿¡ »ç¿ëÇÒ¸¸Å­ ¾ÈÁ¤ÀûÀÌÁö ¾Ê°í ¾ÕÀ¸·Î °³¼±µÉÁö + º¸ÀåÇÒ ¼öµµ ¾ø´Ù. À§ÇèÇϹǷΠȤ½Ã³ª »ç¿ëÇÑ´Ù¸é ÁÖÀÇÇؼ­ + »ç¿ëÇØ¾ß ÇÑ´Ù!

    + +

    µÎ°¡Áö serviceÀÇ Áß¿äÇÑ Â÷ÀÌÁ¡Àº ´ÙÀ½°ú °°´Ù:

    + +
      +
    • ¾ÆÆÄÄ¡°¡ ¼º°øÀûÀ¸·Î ½ÃÀÛÇÏ¸é ¹è°æ¿¡¼­ ½ÇÇàÇÑ´Ù. + ¿¹¸¦ µé¾î, µ¥½ºÅ©Å¾¿¡ ¹Ù·Î°¡±â¸¦ ¸¸µé¾î¼­ ´ÙÀ½ ¸í·ÉÀ» + ½ÇÇàÇÏ´Â °æ¿ì,

      + +

      + apache -n "MyServiceName" -k start +

      + +

      service°¡ ¼º°øÀûÀ¸·Î ½ÃÀÛÇϸé ÄܼÖâÀÌ »ý°å´Ù°¡ ±Ý¹æ + »ç¶óÁø´Ù. httpd.conf ¼³Á¤ÆÄÀÏ¿¡ À߸øµÈ ³»¿ëÀÌ ÀÖ´Â µî + ¾ÆÆÄÄ¡ ½ÃÀ۽à ¿À·ù°¡ ¹ß»ýÇϸé ÄܼÖâÀ» °è¼Ó º¸ÀδÙ. ÄܼÖâÀº + ¹®Á¦ÀÇ ¿øÀÎÀ» ÆľÇÇϴµ¥ µµ¿òÀ» ÁÖ´Â ¿À·ù¹®À» º¸¿©ÁØ´Ù.

    • + +
    • Windows 9x´Â NET START¿Í NET + STOP ¸í·É¾î¸¦ Áö¿øÇÏÁö ¾Ê´Â´Ù. ¸í·ÉÇÁ·ÒÇÁÆ®¿¡¼­ + -k ¿É¼ÇÀ» »ç¿ëÇÏ¿© ¾ÆÆÄÄ¡ service¸¦ Á¶Á¤ÇØ¾ß + ÇÑ´Ù. +

    • + +
    • + ¾ÆÆÄÄ¡¿Í Windows 9x´Â ³×Æ®¿÷ ±ÇÇÑÀ» °¡Áø ƯÁ¤ »ç¿ëÀÚ·Î + ¾ÆÆÄÄ¡¸¦ ½ÇÇàÇÏÁö ¸øÇÑ´Ù. »ç½Ç Windows 9x´Â º¸¾ÈÀ» Á¦°øÇÏÁöµµ + ¾Ê´Â´Ù. ÀÌ°ÍÀÌ ¹Ù·Î Apache Software FoundationÀÌ Windows + 9x ½Ã½ºÅÛÀ» °ø°³ À¥¼­¹ö·Î »ç¿ëÇÏ±æ ±ÇÇÏÁö ¾Ê´Â ÀÌÀ¯´Ù. + »ç¿ëÀÚ°¡ À¥ ÄÁÅÙÃ÷¸¦ °³¹ßÇÏ°í ¾ÆÆÄÄ¡ ¼­¹ö ÇнÀÀ» µ½±âÀ§ÇØ, + ¾Æ´Ï¸é ¾ÈÀüÇÑ »ç¼³ ³×Æ®¿÷¿¡ À§Ä¡ÇÒ ÀÎÆ®¶ó³Ý ¼­¹ö¸¦ À§ÇØ, + Windows 9x¸¦ Áö¿øÇÒ »ÓÀÌ´Ù.

    • + +
    + +

    ¾ÆÆÄÄ¡°¡ ÄÜ¼Ö ÇÁ·Î±×·¥À¸·Î µ¿ÀÛÇÔÀ» È®ÀÎÇÏ¿´´Ù¸é Windows + NT¿¡¼­¿Í °°Àº ¸í·É¾î·Î °¡»ó service¸¦ ¼³Ä¡, Á¶Àý, Á¦°ÅÇÒ + ¼ö ÀÖ´Ù. ¶Ç, Apache Service Monitor¸¦ »ç¿ëÇÏ¿© Windows 9x + °¡»ó service¸¦ °ü¸®ÇÒ ¼ö ÀÖ´Ù.

    + +
    top
    +
    +

    ¾ÆÆÄÄ¡¸¦ ÄÜ¼Ö ÇÁ·Î±×·¥À¸·Î ½ÇÇàÇϱâ

    + + +

    ÀϹÝÀûÀ¸·Î ¾ÆÆÄÄ¡¸¦ service·Î ½ÇÇàÇÏ±æ ±ÇÇÑ´Ù. ±×·¯³ª + ¸í·ÉÇà¿¡¼­ ½ÇÇàÇÏ´Â°Ô ÆíÇÑ °æ¿ì°¡ ÀÖ´Ù (Windows 9x¿¡¼­´Â + service¸¦ ¾ÈÁ¤ÀûÀ¸·Î Áö¿øÇÏÁö ¾Ê±â¶§¹®¿¡ ¸í·ÉÇà¿¡¼­ ¾ÆÆÄÄ¡¸¦ + ½ÇÇàÇÏ´Â ¹æ¹ýÀ» ±ÇÇÑ´Ù).

    + +

    ¾ÆÆÄÄ¡¸¦ ÄÜ¼Ö ÇÁ·Î±×·¥À¸·Î ½ÇÇàÇÏ·Á¸é, ¸í·ÉÇà¿¡¼­ ´ÙÀ½ + ¸í·É¾î¸¦ »ç¿ëÇÑ´Ù:

    + +

    + apache +

    + +

    ¾ÆÆÄÄ¡´Â Control-C¸¦ ´­·¯¼­ Á¤ÁöÇÒ ¶§±îÁö ½ÇÇàµÈ´Ù.

    + +

    ¶Ç, ½ÃÀÛ ¸Þ´º --> ÇÁ·Î±×·¥ --> Apache HTTP + Server 2.0.xx --> Control Apache Server¿¡ ¼³Ä¡µÈ + Start Apache in Console ¹Ù·Î°¡±â·Î ¾ÆÆÄÄ¡¸¦ ½ÇÇàÇÒ ¼ö ÀÖ´Ù. + ¹Ù·Î°¡±â¸¦ ½ÇÇàÇϸé ÄܼÖâÀ» ¿­°í ±× ¾È¿¡¼­ ¾ÆÆÄÄ¡¸¦ ½ÇÇàÇÑ´Ù. + ¾ÆÆÄÄ¡¸¦ service·Î ¼³Ä¡ÇÏÁö ¾Ê¾Ò´Ù¸é, ¾ÆÆÄÄ¡¸¦ ½ÇÇàÇÏ´Â + ÄܼÖâ¿¡¼­ Control-C¸¦ ´­·¯ ¾ÆÆÄÄ¡¸¦ Áß´ÜÇÒ¶§±îÁö âÀÌ ¶°ÀÖ´Ù. + ÀÌ °æ¿ì ¼­¹ö´Â ¸îÃʾȿ¡ Á¾·áÇÑ´Ù. ±×·¯³ª, ¾ÆÆÄÄ¡¸¦ service·Î + ¼³Ä¡ÇÏ¿´´Ù¸é ¹Ù·Î°¡±â´Â service¸¦ ½ÃÀÛÇÑ´Ù. ¾ÆÆÄÄ¡ service°¡ + ÀÌ¹Ì ½ÇÇàÁßÀ̶ó¸é ¹Ù·Î°¡±â´Â ¾Æ¹«Àϵµ ÇÏÁö ¾Ê´Â´Ù.

    + +

    ´Ù¸¥ ÄܼÖâÀ» ¿­°í ´ÙÀ½°ú °°ÀÌ ÀÔ·ÂÇÏ¿© ½ÇÇàÁßÀÎ ¾ÆÆÄÄ¡¸¦ + Á¾·áÇÒ ¼ö ÀÖ´Ù:

    + +

    + apache -k shutdown +

    + +

    ÀÌ ¹æ¹ýÀº ¾ÆÆÄÄ¡°¡ ÇöÀç ÀÛ¾÷À» ¸¶Ä¡°í Á¡ÀÝ°Ô Á¾·áÇÒ ¼ö + Àֱ⶧¹®¿¡ Control-C º¸´Ù ³´´Ù.

    + +

    ¶Ç, ¾ÆÆÄÄ¡¸¦ Àç½ÃÀÛÇÒ ¼ö ÀÖ´Ù. ÀÌ °æ¿ì ¼³Á¤ÆÄÀÏÀ» ´Ù½Ã + Àд´Ù. ÁøÇàÁßÀÎ ÀÛ¾÷À» Áß°£¿¡ ²÷Áö¾Ê°í ¿Ï·áÇÑ´Ù. ¾ÆÆÄÄ¡¸¦ + Àç½ÃÀÛÇÏ·Á¸é:

    + +

    + apache -k restart +

    + +
    À¯´Ð½º¿ë ¾ÆÆÄÄ¡¿¡ Àͼ÷ÇÑ »ç¶÷À» À§ÇØ: ÀÌ ¸í·É¾î´Â + kill -TERM pid³ª kill -USR1 + pidÀÇ WindowsÆÇÀÌ´Ù. ¸í·ÉÇà ¿É¼Ç + -k´Â À¯´Ð½º kill ¸í·É¾î À̸§À» + º»µû Áö¾ú´Ù.
    + +

    ¾ÆÆÄÄ¡ ÄܼÖâÀÌ Áï½Ã ȤÀº ½ÃÀÛÈÄ °©Àڱ⠴ÝÄ¡¸é ½ÃÀÛ ¸Þ´º + --> ÇÁ·Î±×·¥ÀÇ ¸í·É ÇÁ·ÒÇÁÆ®¸¦ ½ÇÇàÇÑ´Ù. ¾ÆÆÄÄ¡¸¦ ¼³Ä¡ÇÑ + Æú´õ·Î °¡¼­ apache ¸í·É¾î¸¦ ½ÇÇàÇغ¸°í ¹ß»ýÇÑ + ¿À·ù¹®À» »ìÆ캻´Ù. ±×¸®°í logs Æú´õ·Î °¡¼­, ¼³Á¤ÆÄÀÏÀÌ + À߸øµÇ¾ú´ÂÁö error.log ÆÄÀÏÀ» »ìÆ캻´Ù. ¾ÆÆÄÄ¡¸¦ + ¼³Ä¡ÇÒ¶§ ±âº»°ªÀ» »ç¿ëÇß´Ù¸é ´ÙÀ½°ú °°´Ù:

    + +

    + c:
    + cd "\Program Files\Apache Group\Apache2\bin"
    + apache +

    + +

    ¾ÆÆÄÄ¡°¡ Á¤ÁöÇÒ ¶§±îÁö ±â´Ù¸®°Å³ª Control-C¸¦ ´©¸¥´Ù. + ±×¸®°í ´ÙÀ½°ú °°ÀÌ ÀÔ·ÂÇÑ´Ù:

    + +

    + cd ..\logs
    + more < error.log +

    + +

    ¾ÆÆÄÄ¡¸¦ ´Ù·ê¶§ ¾ÆÆÄÄ¡°¡ ¾î¶»°Ô ¼³Á¤ÆÄÀÏÀ» ã´ÂÁö ¾Æ´Â + °ÍÀÌ Áß¿äÇÏ´Ù. µÎ°¡Áö ¹æ¹ýÀ¸·Î ¸í·ÉÇà¿¡¼­ ¼³Á¤ÆÄÀÏÀ» ÁöÁ¤ÇÒ + ¼ö ÀÖ´Ù:

    + +
      +
    • -f´Â ¼³Á¤ÆÄÀÏÀÇ Àý´ë°æ·Î ȤÀº »ó´ë°æ·Î¸¦ + ÁöÁ¤ÇÑ´Ù:

      + +

      + apache -f "c:\my server files\anotherconfig.conf" +

      + +

      ȤÀº

      + +

      + apache -f files\anotherconfig.conf +

    • + +
    • -nÀº ¾ÆÆÄÄ¡ service¸¦ ¼±ÅÃÇÏ°í, ÇØ´ç + serviceÀÇ ¼³Á¤ÆÄÀÏÀ» »ç¿ëÇÑ´Ù:

      + +

      + apache -n "MyServiceName" +

      +
    • +
    + +

    µÎ °æ¿ì ¸ðµÎ ¼³Á¤ÆÄÀÏÀÌ ÀûÀýÇÑ ServerRoot¸¦ ÁöÁ¤ÇØ¾ß ÇÑ´Ù.

    + +

    -f³ª -nÀ¸·Î ¼³Á¤ÆÄÀÏÀ» ÁöÁ¤ÇÏÁö + ¾ÊÀ¸¸é, ¾ÆÆÄÄ¡´Â conf\httpd.conf¿Í °°ÀÌ ¼­¹ö¿¡ + ÄÄÆÄÀÏµÈ ÆÄÀϸíÀ» »ç¿ëÇÑ´Ù. ÀÌ ±âº» °æ·Î´Â ¼³Ä¡ µð·ºÅ丮¿¡ + »ó´ëÀûÀÌ´Ù. ´ÙÀ½°ú °°ÀÌ -V ¿É¼ÇÀ¸·Î ¾ÆÆÄÄ¡¸¦ + ½ÇÇàÇϸé SERVER_CONFIG_FILEÀ̶õ Ç׸ñ¿¡¼­ ¼­¹ö°¡ + »ç¿ëÇÒ ¼³Á¤ÆÄÀÏÀ» ¾Ë ¼ö ÀÖ´Ù:

    + +

    + apache -V +

    + +

    ¾ÆÆÄÄ¡´Â ´ÙÀ½ ¼ø¼­´ë·Î ServerRoot¸¦ ã´Â´Ù:

    + +
      +
    1. -C ¸í·ÉÇà ¿É¼Ç¿¡ »ç¿ëÇÑ ServerRoot Áö½Ã¾î.
    2. + +
    3. -d ¸í·ÉÇà ¿É¼Ç.
    4. + +
    5. ÇöÀç ÀÛ¾÷ µð·ºÅ丮.
    6. + +
    7. ¹ÙÀ̳ʸ® ¼³Ä¡¸¦ Çß´Ù¸é ¼³Ä¡ÇÒ¶§ ¸¸µç registry Ç׸ñ.
    8. + +
    9. ¼­¹ö¿¡ ÄÄÆÄÀÏµÈ server root. ±âº»°ªÀº + /apacheÀÌ°í, apache -V¸¦ ½ÇÇàÇϸé + HTTPD_ROOT¶ó´Â Ç׸ñ¿¡¼­ È®ÀÎÇÒ ¼ö ÀÖ´Ù.
    10. +
    + +

    ¼³Ä¡ÇÒ¶§ À©µµ¿ìÁî ·¹Áö½ºÆ®¸®¿¡ ¹öÀü ƯÀ¯ÀÇ ·¹Áö½ºÆ®¸® + Å°¸¦ ¸¸µç´Ù. Å°ÀÇ À§Ä¡´Â ¼³Ä¡ Á¾·ù¿¡ µû¶ó ´Ù¸£´Ù. install + Apache for all users¸¦ ¼±ÅÃÇÏ¿´´Ù¸é + HKEY_LOCAL_MACHINE ¾Æ·¡¿¡ ´ÙÀ½°ú °°Àº Å°¸¦ + ¸¸µç´Ù (¹°·Ð ¹öÀü¹øÈ£´Â ¾ÆÆÄÄ¡ ¹öÀü¸¶´Ù ´Ù¸£´Ù): +

    + +

    + HKEY_LOCAL_MACHINE\SOFTWARE\Apache Group\Apache\2.0.43 +

    + +

    "¸ðµç »ç¿ëÀÚ"¸¦ ´ë»óÀ¸·Î ¾ÆÆÄÄ¡¸¦ ¼³Ä¡ÇÏ¿´´Ù¸é + HKEY_CURRENT_USER ¾Æ·¡ Å°°¡ »ý±ä´Ù. ³»¿ëÀº + ÇöÀç ·Î±×¿ÂÇÑ »ç¿ëÀÚ¿¡ µû¶ó ´Ù¸£´Ù:

    + +

    + HKEY_CURRENT_USER\SOFTWARE\Apache Group\Apache\2.0.43 +

    + +

    Å° À̸§ÀÌ ¼­¹ö¿¡ ÄÄÆÄÀϵDZ⶧¹®¿¡ ÇöÀç ¹öÀüÀ» °Çµå¸®Áö¾Ê°í + »õ·Î¿î ¹öÀüÀ» ¼³Ä¡ÇÏ¿© Å×½ºÆ®Çغ¼ ¼ö ÀÖ´Ù. ¹°·Ð »õ ¹öÀüÀ» + ´Ù¸¥ ¹öÀü°ú °°Àº µð·ºÅ丮¿¡ ¼³Ä¡ÇÏÁö¾Êµµ·Ï ÁÖÀÇÇØ¾ß ÇÑ´Ù.

    + +

    ¹ÙÀ̳ʸ® ¼³Ä¡¸¦ ÇÏÁö ¾ÊÀº °æ¿ì ¾ÆÆÄÄ¡´Â ·¹Áö½ºÆ®¸® Å°°¡ + ¾ø´Ù°í ºÒÆòÇÒ ¼ö ÀÖ´Ù. ¼­¹ö°¡ ´Ù¸¥ ¹æ¹ýÀ¸·Î ¼³Á¤ÆÄÀÏÀ» ãÀ» + ¼ö ÀÖ´Ù¸é ÀÌ °æ°í¸¦ ¹«½ÃÇصµ µÈ´Ù.

    + +

    Å°ÀÇ °ªÀº ServerRoot + µð·ºÅ丮À̸ç, ÀÌ µð·ºÅ丮¿¡ conf¶ó´Â ÇÏÀ§µð·ºÅ丮°¡ + ÀÖ´Ù. ¾ÆÆÄÄ¡¸¦ ½ÃÀÛÇϸé ÀÌ ÇÏÀ§µð·ºÅ丮¿¡¼­ + httpd.conf ÆÄÀÏÀ» Àд´Ù. ÀÌ ÆÄÀÏ¿¡ ³ª¿À´Â + ServerRoot Áö½Ã¾î°¡ + ·¹Áö½ºÆ®¸® Å°¿¡ ³ª¿Â µð·ºÅ丮¿Í ´Ù¸£´Ù¸é, ¾ÆÆÄÄ¡´Â ·¹Áö½ºÆ®¸®¿¡¼­ + ¾òÀº °ªÀ» ¹«½ÃÇÏ°í ¾ÕÀ¸·Î ¼³Á¤ÆÄÀÏ¿¡ ³ª¿Â µð·ºÅ丮¸¦ »ç¿ëÇÑ´Ù. + ¾ÆÆÄÄ¡ µð·ºÅ丮³ª ¼³Á¤ÆÄÀÏÀ» ´Ù¸¥ Àå¼Ò·Î º¹»çÇÏ¸é ¹Ýµå½Ã + httpd.conf ÆÄÀÏ¿¡ ÀÖ´Â ServerRoot Áö½Ã¾î¸¦ ±× À§Ä¡·Î + ¼öÁ¤Ç϶ó.

    + +
    top
    +
    +

    Á¤»óÀûÀ¸·Î ¼³Ä¡µÇ¾ú´ÂÁö °Ë»çÇϱâ

    + + +

    (ÄܼÖâÀ̳ª service¸¦ ÅëÇØ) ¾ÆÆÄÄ¡¸¦ ½ÃÀÛÇϸé (¼³Á¤ÆÄÀÏÀÇ + Listen Áö½Ã¾î¸¦ + ¼öÁ¤Çϰųª ¾ÆÆÄÄ¡¸¦ "ÇöÀç »ç¿ëÀÚ¸¸" ´ë»óÀ¸·Î ¼³Ä¡ÇÏÁö ¾Ê´Â + °æ¿ì) 80¹ø Æ÷Æ®¸¦ ±â´Ù¸°´Ù. ºê¶ó¿ìÀú¸¦ ½ÃÀÛÇÏ°í URLÀ» ÀÔ·ÂÇÏ¿© + ¼­¹öÀÇ ±âº» ÆäÀÌÁö¿¡ Á¢±ÙÇÏ´Ù:

    + +

    + http://localhost/ +

    + +

    ¾ÆÆÄÄ¡´Â ¾ÆÆÄÄ¡ ¼³¸í¼­ ¸µÅ©°¡ Àִ ȯ¿µÆäÀÌÁö¸¦ º¸¿©Áà¾ß + ÇÑ´Ù. ¾Æ¹« Àϵµ ÀϾÁö ¾Ê°Å³ª ¿À·ù°¡ ³ª¿À¸é, logs + ÇÏÀ§µð·ºÅ丮¿¡ ÀÖ´Â error.log ÆÄÀÏÀ» »ìÆìºÁ¶ó. + È£½ºÆ®°¡ ³×Æ®¿÷¿¡ ¿¬°áµÇÀÖÁö ¾Ê°Å³ª DNS (Domain Name Service) + ¼³Á¤¿¡ ¹®Á¦°¡ ÀÖ´Ù¸é ´ÙÀ½ URLÀ» »ç¿ëÇØ¾ß ÇÑ´Ù:

    + +

    + http://127.0.0.1/ +

    + +

    ±âº» ¼³Ä¡°¡ µ¿ÀÛÇϸé conf ÇÏÀ§µð·ºÅ丮¿¡ + ÀÖ´Â ÆÄÀÏÀ» ÀûÀýÈ÷ ¼³Á¤ÇÑ´Ù. ¶Ç, Windows NT ¾ÆÆÄÄ¡ service + ¼³Á¤À» ¼öÁ¤ÇÑ °æ¿ì ¸ÕÀú ¸í·ÉÇà¿¡¼­ ¾ÆÆÄÄ¡¸¦ ½ÃÀÛÇÏ¿© ¿À·ù°¡ + ¹ß»ýÇÏÁö¾Ê´ÂÁö È®ÀÎÇØ¾ß ÇÑ´Ù.

    + +

    ¾ÆÆÄÄ¡°¡ ´Ù¸¥ TCP/IP ÇÁ·Î±×·¥°ú °°Àº Æ÷Æ®¸¦ °øÀ¯ÇÒ ¼ö + ¾ø±â¶§¹®¿¡ ¾ÆÆÄÄ¡¸¦ ½ÃÀÛÇϱâ Àü¿¡ ´Ù¸¥ + ¼­ºñ½º¸¦ Áß´Ü, Á¦°Å, Àç¼³Á¤ÇØ¾ß ÇÒÁöµµ ¸ð¸¥´Ù. ´Ù¸¥ À¥¼­¹ö³ª + ƯÁ¤ ¹æÈ­º® ¼­¹ö½º¿Í Ãæµ¹ÇÒ ¼ö ÀÖ´Ù. +

    + +
    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + ko 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/ab.html b/rubbos/app/httpd-2.0.64/docs/manual/programs/ab.html new file mode 100644 index 00000000..f5a9c816 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/ab.html @@ -0,0 +1,13 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: ab.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: ab.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: ab.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/ab.html.en b/rubbos/app/httpd-2.0.64/docs/manual/programs/ab.html.en new file mode 100644 index 00000000..9ce30ca7 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/ab.html.en @@ -0,0 +1,200 @@ + + + +ab - Apache HTTP server benchmarking tool - Apache HTTP Server + + + + + +
    <-
    +

    ab - Apache HTTP server benchmarking tool

    +
    +

    Available Languages:  en  | + ko  | + tr 

    +
    + +

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

    +
    +

    See also

    +
    top
    +
    +

    Synopsis

    +

    ab + [ -A auth-username:password ] + [ -c concurrency ] + [ -C cookie-name=value ] + [ -d ] + [ -e csv-file ] + [ -g gnuplot-file ] + [ -h ] + [ -H custom-header ] + [ -i ] + [ -k ] + [ -n requests ] + [ -p POST-file ] + [ -P proxy-auth-username:password ] + [ -q ] + [ -s ] + [ -S ] + [ -t timelimit ] + [ -T content-type ] + [ -v verbosity] + [ -V ] + [ -w ] + [ -x <table>-attributes ] + [ -X proxy[:port] ] + [ -y <tr>-attributes ] + [ -z <td>-attributes ] + [http://]hostname[:port]/path

    +
    top
    +
    +

    Options

    +
    +
    -A auth-username:password
    +
    Supply BASIC Authentication credentials to the server. The username and + password are separated by a single : and sent on the wire + base64 encoded. The string is sent regardless of whether the server needs + it (i.e., has sent an 401 authentication needed).
    + +
    -c concurrency
    +
    Number of multiple requests to perform at a time. Default is one + request at a time.
    + +
    -C cookie-name=value
    +
    Add a Cookie: line to the request. The argument is + typically in the form of a name=value + pair. This field is repeatable.
    + +
    -d
    +
    Do not display the "percentage served within XX [ms] table". (legacy + support).
    + +
    -e csv-file
    +
    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'.
    + +
    -g gnuplot-file
    +
    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.
    + +
    -h
    +
    Display usage information.
    + +
    -H custom-header
    +
    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 (i.e., "Accept-Encoding: zip/zop;8bit").
    + +
    -i
    +
    Do HEAD requests instead of GET.
    + +
    -k
    +
    Enable the HTTP KeepAlive feature, i.e., perform multiple + requests within one HTTP session. Default is no KeepAlive.
    + +
    -n requests
    +
    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.
    + +
    -p POST-file
    +
    File containing data to POST.
    + +
    -P proxy-auth-username:password
    +
    Supply BASIC Authentication credentials to a proxy en-route. The + username and password are separated by a single : and sent on + the wire base64 encoded. The string is sent regardless of whether the + proxy needs it (i.e., has sent an 407 proxy authentication + needed).
    + +
    -q
    +
    When processing more than 150 requests, ab outputs a + progress count on stderr every 10% or 100 requests or so. The + -q flag will suppress these messages.
    + +
    -s
    +
    When compiled in (ab -h will show you) use the SSL + protected https rather than the http protocol. + This feature is experimental and very rudimentary. You probably + do not want to use it.
    + +
    -S
    +
    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).
    + +
    -t timelimit
    +
    Maximum number of seconds to spend for benchmarking. This implies a + -n 50000 internally. Use this to benchmark the server within a + fixed total amount of time. Per default there is no timelimit.
    + +
    -T content-type
    +
    Content-type header to use for POST data.
    + +
    -v verbosity
    +
    Set verbosity level - 4 and above prints information on + headers, 3 and above prints response codes (404, 200, etc.), + 2 and above prints warnings and info.
    + +
    -V
    +
    Display version number and exit.
    + +
    -w
    +
    Print out results in HTML tables. Default table is two columns wide, + with a white background.
    + +
    -x <table>-attributes
    +
    String to use as attributes for <table>. Attributes + are inserted <table here >.
    + +
    -X proxy[:port]
    +
    Use a proxy server for the requests.
    + +
    -y <tr>-attributes
    +
    String to use as attributes for <tr>.
    + +
    -z <td>-attributes
    +
    String to use as attributes for <td>.
    +
    +
    top
    +
    +

    Bugs

    +

    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.

    + +

    It does not implement HTTP/1.x fully; only accepts some 'expected' forms + of responses. The rather heavy use of strstr(3) shows up top + in profile, which might indicate a performance problem; i.e., you + would measure the ab performance rather than the server's.

    +
    +
    +

    Available Languages:  en  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/ab.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/programs/ab.html.ko.euc-kr new file mode 100644 index 00000000..8292de2f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/ab.html.ko.euc-kr @@ -0,0 +1,203 @@ + + + +ab - ¾ÆÆÄÄ¡ À¥¼­¹ö ¼º´É°Ë»ç µµ±¸ - Apache HTTP Server + + + + + +
    <-
    +

    ab - ¾ÆÆÄÄ¡ À¥¼­¹ö ¼º´É°Ë»ç µµ±¸

    +
    +

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

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

    ab´Â ¾ÆÆÄÄ¡ ÇÏÀÌÆÛÅؽºÆ® Àü¼Û ÇÁ·ÎÅäÄÝ (HTTP) + ¼­¹öÀÇ ¼º´ÉÀ» °Ë»çÇÏ´Â(benchmarking) µµ±¸ÀÌ´Ù. ÇöÀç ¾ÆÆÄÄ¡°¡ + ¾î¶»°Ô µ¿ÀÛÇÏ´ÂÁö ¾Ë·ÁÁØ´Ù. ƯÈ÷ ¾ÆÆÄÄ¡°¡ ÇöÀç ÃÊ´ç ¸î°³ÀÇ + ¿äûÀ» ¼­ºñ½ºÇÏ´ÂÁö ¾Ë·ÁÁØ´Ù.

    +
    + +
    top
    +
    +

    °³¿ä

    +

    ab + [ -A auth-username:password ] + [ -c concurrency ] + [ -C cookie-name=value ] + [ -d ] + [ -e csv-file ] + [ -g gnuplot-file ] + [ -h ] + [ -H custom-header ] + [ -i ] + [ -k ] + [ -n requests ] + [ -p POST-file ] + [ -P proxy-auth-username:password ] + [ -q ] + [ -s ] + [ -S ] + [ -t timelimit ] + [ -T content-type ] + [ -v verbosity] + [ -V ] + [ -w ] + [ -x <table>-attributes ] + [ -X proxy[:port] ] + [ -y <tr>-attributes ] + [ -z <td>-attributes ] + [http://]hostname[:port]/path

    +
    top
    +
    +

    ¿É¼Ç

    +
    +
    -A auth-username:password
    +
    ¼­¹ö¿¡°Ô BASIC Authentication Á¤º¸¸¦ Á¦°øÇÑ´Ù. + :À¸·Î ±¸ºÐÇÑ »ç¿ëÀÚ¸í°ú ¾ÏÈ£¸¦ base64 ÀÎÄÚµùÇÏ¿© + Àü¼ÛÇÑ´Ù. ¼­¹ö°¡ Á¤º¸¸¦ ¿ä±¸ÇÏ´ÂÁö (¿¹¸¦ µé¾î, + 401 ÀÎÁõ Çʿ並 º¸³»´ÂÁö) °ü°è¾øÀÌ ¹®ÀÚ¿­À» Àü¼ÛÇÑ´Ù.
    + +
    -c concurrency
    +
    µ¿½Ã¿¡ ¿äûÇÏ´Â ¿äû¼ö. ±âº»ÀûÀ¸·Î Çѹø¿¡ ÇÑ ¿äû¸¸À» + º¸³½´Ù.
    + +
    -C cookie-name=value
    +
    ¿äû¿¡ Cookie: Çì´õ¸¦ Ãß°¡ÇÑ´Ù. ¾Æ±Ô¸ÕÆ®´Â + º¸Åë name=value¿Í °°Àº + ½ÖÀÌ´Ù. ÀÌ ¿É¼ÇÀº ¿©·¯¹ø »ç¿ëÇÒ ¼ö ÀÖ´Ù.
    + +
    -d
    +
    "percentage served within XX [ms] table"À» Ãâ·ÂÇÏÁö + ¾Ê´Â´Ù. (ȣȯ¼ºÀ» À§ÇØ).
    + +
    -e csv-file
    +
    ¿äûÀ» ó¸®Çϴµ¥ °É¸° (¹Ð¸®ÃÊ ´ÜÀ§) ½Ã°£µéÀÇ (1%¿¡¼­ + 100%) ´©Àû¹éºÐÀ²À» ½°Ç¥·Î ±¸ºÐÇÑ Çü½Ä(CSV)À¸·Î Ãâ·ÂÇÑ´Ù. + °á°ú¸¦ ÀÌ¹Ì 'Á¤¸®'ÇÏ¿´±â¶§¹®¿¡ 'gnuplot' ÆÄÀϺ¸´Ù º¸Åë ´õ + À¯¿ëÇÏ´Ù.
    + +
    -g gnuplot-file
    +
    ÃøÁ¤ÇÑ ¸ðµç °ªÀ» 'gnuplot' ȤÀº TSV (Tab separate values, + ÅÇÀ¸·Î ±¸ºÐÇÑ °ª) ÆÄÀÏ¿¡ ±â·ÏÇÑ´Ù. Gnuplot, IDL, Mathematica, + Igor, ½ÉÁö¾î Excel °°Àº ÇÁ·Î±×·¥¿¡¼­µµ ÀÌ·± ÆÄÀÏÀ» ½±°Ô + ÀÐÀ» ¼ö ÀÖ´Ù. ÆÄÀÏÀÇ Ã¹¹ø° ÁÙ¿¡ Ç׸ñÀ̸§ÀÌ ³ª¿Â´Ù.
    + +
    -h
    +
    »ç¿ë¹ýÀ» Ãâ·ÂÇÑ´Ù.
    + +
    -H custom-header
    +
    ¿äû¿¡ Çì´õ¸¦ Ãß°¡ÇÑ´Ù. ¾Æ±Ô¸ÕÆ®´Â º¸Åë ÄÝ·ÐÀ¸·Î ±¸ºÐÇÑ + ½ÖÀÎ (¿¹¸¦ µé¾î, + "Accept-Encoding: zip/zop;8bit") À¯È¿ÇÑ + Çì´õÁÙÀÌ´Ù.
    + +
    -i
    +
    GET ´ë½Å HEAD ¿äûÀ» ÇÑ´Ù.
    + +
    -k
    +
    HTTP KeepAlive ±â´ÉÀ» »ç¿ëÇÑ´Ù. ¿¹¸¦ µé¾î, + ÇÑ HTTP ¼¼¼Ç¿¡¼­ ¿©·¯ ¿äûÀ» ÇÑ´Ù. ±âº»ÀûÀ¸·Î KeepAlive¸¦ + »ç¿ëÇÏÁö ¾Ê´Â´Ù.
    + +
    -n requests
    +
    ¼º´ÉÀ» °Ë»çÇϱâÀ§ÇØ º¸³»´Â ¿äû¼ö. ±âº»°ªÀ¸·Î ¿äûÀ» + Çѹø¸¸ º¸³»±â¶§¹®¿¡ ÀϹÝÀûÀÎ ¼º´É°Ë»ç °á°ú¸¦ ¾òÀ» ¼ö ¾ø´Ù.
    + +
    -p POST-file
    +
    POST ÀÚ·á ÆÄÀÏ.
    + +
    -P proxy-auth-username:password
    +
    ÇÁ·Ï½Ã¸¦ ÅëÇØ BASIC Authentication Á¤º¸¸¦ Á¦°øÇÑ´Ù. + :·Î ±¸ºÐÇÑ »ç¿ëÀÚ¸í°ú ¾ÏÈ£¸¦ base64 ÀÎÄÚµùÇÏ¿© + Àü¼ÛÇÑ´Ù. ÇÁ·Ï½Ã°¡ Á¤º¸¸¦ ¿ä±¸ÇÏ´ÂÁö (¿¹¸¦ µé¾î, + 401 ÀÎÁõ Çʿ並 º¸³»´ÂÁö) °ü°è¾øÀÌ ¹®ÀÚ¿­À» Àü¼ÛÇÑ´Ù.
    + +
    -q
    +
    150°³ ÀÌ»ó ¿äûÀ» º¸³¾¶§ ab´Â 10% ȤÀº + ¸Å 100 ¿äû´ç Ç¥ÁØ¿À·ù¿¡ ÁøÇà»óȲÀ» Ãâ·ÂÇÑ´Ù. + -q ¿É¼ÇÀº ÀÌ ¹®±¸¸¦ Ãâ·ÂÇÏÁö ¾Ê´Â´Ù.
    + +
    -s
    +
    ±â´ÉÀ» Ãß°¡ÇÏ¿© ÄÄÆÄÀÏÇÏ¿´´Ù¸é (ab -h·Î + È®ÀÎÇÒ ¼ö ÀÖ´Ù) http ÇÁ·ÎÅäÄÝ ´ë½Å SSLÀ» »ç¿ëÇÑ + https ÇÁ·ÎÅäÄÝÀ» »ç¿ëÇÑ´Ù. ÀÌ ±â´ÉÀº ½ÇÇèÀûÀÌ°í + ¸Å¿ì ±âÃÊÀûÀÌ´Ù. ¾Æ¸¶µµ »ç¿ëÀ» ²¨·ÁÇÒ °ÍÀÌ´Ù.
    + +
    -S
    +
    Áß°£°ª°ú Ç¥ÁØÆíÂ÷¸¦ Ãâ·ÂÇÏÁö ¾Ê°í, Æò±Õ°ú Áß°£°ªÀÇ Â÷ÀÌ°¡ + Ç¥ÁØÆíÂ÷º¸´Ù Å©´õ¶óµµ °æ°í/¿À·ù¸¦ Ãâ·ÂÇÏÁö ¾Ê´Â´Ù. + ÃÖ¼Ò/Æò±Õ/ÃÖ´ë °ªÀ» Ãâ·ÂÇÑ´Ù. (ȣȯ¼ºÀ» À§ÇØ).
    + +
    -t timelimit
    +
    ¼º´ÉÀ» °Ë»çÇÏ´Â ÃÖ´ë ÃÊ´ÜÀ§ ½Ã°£. ³»ºÎÀûÀ¸·Î + -n 50000À» °¡Á¤ÇÑ´Ù. Á¤ÇØÁø ½Ã°£µ¿¾È ¼­¹ö ¼º´ÉÀ» + °Ë»çÇÒ¶§ »ç¿ëÇÑ´Ù. ±âº»ÀûÀ¸·Î ½Ã°£Á¦ÇÑ ¾øÀÌ °Ë»çÇÑ´Ù.
    + +
    -T content-type
    +
    POST ÀÚ·áÀÇ Content-type Çì´õ.
    + +
    -v verbosity
    +
    Ãâ·ÂÀÇ ÀÚ¼¼ÇÔ ¼öÁØÀ» ÁöÁ¤ÇÑ´Ù. 4 ÀÌ»óÀ̸é + Çì´õ¿¡ ´ëÇÑ Á¤º¸¸¦, 3 ÀÌ»óÀ̸é (404, 202, µî) + ÀÀ´äÄڵ带, 2 ÀÌ»óÀÌ¸é °æ°í(warning)¿Í + Á¤º¸(info)¸¦ Ãâ·ÂÇÑ´Ù.
    + +
    -V
    +
    ¹öÀüÀ» Ãâ·ÂÇÏ°í Á¾·áÇÑ´Ù.
    + +
    -w
    +
    °á°ú¸¦ HTML Ç¥·Î Ãâ·ÂÇÑ´Ù. ±âº»ÀûÀ¸·Î Ç¥¸¦ Èò ¹è°æ¿¡ + µÎ ¿­·Î ÀÛ¼ºÇÑ´Ù.
    + +
    -x <table>-attributes
    +
    <table>ÀÇ ¼Ó¼ºÀ¸·Î »ç¿ëÇÒ ¹®ÀÚ¿­. + ¼Ó¼ºÀ» <table ¿©±â¿¡ > + Ãß°¡ÇÑ´Ù.
    + +
    -X proxy[:port]
    +
    ÇÁ·Ï½Ã ¼­¹ö¸¦ »ç¿ëÇÏ¿© ¿äûÇÑ´Ù.
    + +
    -y <tr>-attributes
    +
    <tr>ÀÇ ¼Ó¼ºÀ¸·Î »ç¿ëÇÒ ¹®ÀÚ¿­.
    + +
    -z <td>-attributes
    +
    <td>ÀÇ ¼Ó¼ºÀ¸·Î »ç¿ëÇÒ ¹®ÀÚ¿­.
    +
    +
    top
    +
    +

    ¹ö±×

    +

    Á¤ÀûÀ¸·Î ±æÀÌ°¡ °íÁ¤µÈ ¹öÆÛ¸¦ ¸¹ÀÌ »ç¿ëÇÑ´Ù. ¸í·ÉÇà + ¾Æ±Ô¸ÕÆ®, ¼­¹öÀÇ ÀÀ´ä Çì´õ, ´Ù¸¥ ¿ÜºÎ ÀԷµéÀ» °°ÀÌ + ÀоîµéÀ̸鼭 ¹®Á¦°¡ ¹ß»ýÇÒ ¼ö ÀÖ´Ù.

    + +

    ÀÌ ÇÁ·Î±×·¥Àº HTTP/1.x¸¦ ¿ÏÀüÈ÷ ±¸ÇöÇÏÁö ¾Ê´Â´Ù; ´ÜÁö + '±â´ëÇÏ´Â' Çü½ÄÀÇ ÀÀ´ä¸¸À» ¹Þ´Â´Ù. strstr(3)À» + ¸Å¿ì ¸¹ÀÌ »ç¿ë±â¶§¹®¿¡ ¼Óµµ°¡ ¹®Á¦°¡ µÉ ¼ö ÀÖ´Ù; Áï, + ¼­¹ö ¼º´Éº¸´Ù´Â ab ¼º´ÉÀ» ÃøÁ¤ÇÏ°Ô µÉ ¼öµµ + ÀÖ´Ù.

    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/ab.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/programs/ab.html.tr.utf8 new file mode 100644 index 00000000..c0465f58 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/ab.html.tr.utf8 @@ -0,0 +1,224 @@ + + + +ab - Apache HTTP sunucusu başarım ölçme aracı - Apache HTTP Sunucusu + + + + + +
    <-
    +

    ab - Apache HTTP sunucusu başarım ölçme aracı

    +
    +

    Mevcut Diller:  en  | + ko  | + tr 

    +
    + +

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

    +
    +

    Ayrıca bakınız:

    +
    top
    +
    +

    Kullanım

    +

    ab + [ -A yetkili-kullanıcı:parola ] + [ -b tampon-boyu ] + [ -c bağlantı-sayısı ] + [ -C çerez-ismi=değer ] + [ -d ] + [ -e csv-dosyası ] + [ -g gnuplot-dosyası ] + [ -h ] + [ -H özel-başlık ] + [ -i ] + [ -k ] + [ -n istek-sayısı ] + [ -p POST-dosyası ] + [ -P vekil-yetkilisi:parola ] + [ -q ] + [ -s ] + [ -S ] + [ -t saniye ] + [ -T içerik-türü ] + [ -v ayrıntı-düzeyi] + [ -V ] + [ -w ] + [ -x <table>-öznitelikleri ] + [ -X vekil[:port] ] + [ -y <tr>-öznitelikleri ] + [ -z <td>-öznitelikleri ] + [http://]konakadı[:port]/dizin

    +
    top
    +
    +

    Seçenekler

    +
    +
    -A + yetkili-kullanıcı:parola
    +
    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.
    + +
    -c bağlantı-sayısı
    +
    Aynı anda işleme sokulacak bağlantı sayısı. Aynı anda bir bağlantı + öntanımlı değerdir.
    + +
    -C + çerez-ismi=değer
    +
    İsteğe bir Cookie: satırı ekler. Argüman olarak + genellikle bir isim=değer çifti kullanılır. Bu + çiftler birden fazla olabilir.
    + +
    -d
    +
    "percentage served within XX [ms] table" iletisi gösterilmez. (Geriye + uyumluluk için vardır).
    + +
    -e csv-dosyası
    +
    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.
    + +
    -g gnuplot-dosyası
    +
    Ö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.
    + +
    -h
    +
    Kullanım bilgisi gösterir.
    + +
    -H özel-başlık
    +
    İsteğe fazladan başlık ekler. özel-başlık, aralarında iki + nokta imi bulunan bir isim-değer çifti olarak belirtilir. Örnek: + "Accept-Encoding: zip/zop;8bit"
    + +
    -i
    +
    GET istekleri yerine HEAD istekleri + yapılır.
    + +
    -k
    +
    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.
    + +
    -n istek-sayısı
    +
    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.
    + +
    -p POST-dosyası
    +
    POST isteği ile ilgili verileri içeren dosya. Ayrıca + -T seçeneğini de belirtmeyi + unutmayın..
    + +
    -P + vekil-yetkilisi:parola
    +
    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.
    + +
    -q
    +
    İstek sayısı 150'den fazla olduğunda, + ab her 100 veya %10 istekte bir, standart + hataya bir işlenen istek sayacı çıktılar. + -q seçeneği bu çıktının üretilmemesini + sağlar.
    + +
    -s
    +
    Derlendiği takdirde (ab -h bunu + gösterir) http protokolü yerine SSL korumalı + https protokolü kullanılır. Bu özellik henüz + emekleme aşamasında olup geliştirilmeye devam edilmektedir. Bu + bakımdan kullanımı önerilmez.
    + +
    -S
    +
    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).
    + +
    -t saniye
    +
    Ölçümleme işleminin ne kadar süreyle uygulanacağı belirtilir. Dahili + olarak -n 50000 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.
    + +
    -T içerik-türü
    +
    POST verisi için kullanılacak içerik türü belirtilir.
    + +
    -v ayrıntı-düzeyi
    +
    Çı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.
    + +
    -V
    +
    Sürüm bilgilerini gösterir ve çıkar.
    + +
    -w
    +
    Sonuçları HTML tabloları olarak basar. Öntanımlı tablo, beyaz + artalanlı ve iki sütunludur.
    + +
    -x + <table>-öznitelikleri
    +
    <table> etiketinde kullanılacak öznitelikler + belirtilir. Belirtilen öznitelikler etiket içine <table + buraya > biçeminde yerleştirilir.
    + +
    -X + vekil[:port]
    +
    İstekler için bir vekil sunucu kullanılır.
    + +
    -y + <tr>-öznitelikleri
    +
    <tr> etiketinde kullanılacak öznitelikler + belirtilir.
    + +
    -z + <td>-öznitelikleri
    +
    <td> etiketinde kullanılacak öznitelikler + belirtilir.
    +
    +
    top
    +
    +

    Börtü böcek

    +

    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.

    + +

    HTTP/1.x protokolünü tamamen gerçeklemez; sadece yanıtların 'belli + başlı' bazı biçimlerini kabul eder. Aksi takdirde, + strstr(3) işlevinin yoğun kullanımı + nedeniyle sunucu yerine ab'nin başarımını + ölçerdiniz.

    +
    +
    +

    Mevcut Diller:  en  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/apachectl.html b/rubbos/app/httpd-2.0.64/docs/manual/programs/apachectl.html new file mode 100644 index 00000000..7e1885c8 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/apachectl.html @@ -0,0 +1,13 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: apachectl.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: apachectl.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: apachectl.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/apachectl.html.en b/rubbos/app/httpd-2.0.64/docs/manual/programs/apachectl.html.en new file mode 100644 index 00000000..4ae4dcc1 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/apachectl.html.en @@ -0,0 +1,154 @@ + + + +apachectl - Apache HTTP Server Control Interface - Apache HTTP Server + + + + + +
    <-
    +

    apachectl - Apache HTTP Server Control Interface

    +
    +

    Available Languages:  en  | + ko  | + tr 

    +
    + +

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

    + +

    The apachectl 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, apachectl can act as a SysV init + script, taking simple one-word arguments like start, + restart, and stop, and translating them + into appropriate signals to httpd.

    + +

    If your Apache installation uses non-standard paths, you will + need to edit the apachectl 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.

    + +

    The apachectl script returns a 0 exit value on + success, and >0 if an error occurs. For more details, view + the comments in the script.

    +
    + +
    top
    +
    +

    Synopsis

    + +

    When acting in pass-through mode, apachectl can take +all the arguments available for the httpd +binary.

    + +

    apachectl [ httpd-argument ]

    + +

    When acting in SysV init mode, apachectl takes simple, +one-word commands, defined below.

    + +

    apachectl command

    + +
    top
    +
    +

    Options

    + +

    Only the SysV init-style options are defined here. Other arguments +are defined on the httpd manual page.

    + +
    + +
    start
    + +
    Start the Apache httpd daemon. Gives an error if it +is already running. This is equivalent to apachectl -k +start.
    + +
    stop
    + +
    Stops the Apache httpd daemon. This is equivalent to +apachectl -k stop.
    + +
    restart
    + +
    Restarts the Apache httpd daemon. If the daemon is +not running, it is started. This command automatically checks the +configuration files as in configtest before initiating +the restart to make sure the daemon doesn't die. This is equivalent +to apachectl -k restart.
    + +
    fullstatus
    + +
    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 lynx +available on your system. The URL used to access the status report +can be set by editing the STATUSURL variable in the +script.
    + +
    status
    + +
    Displays a brief status report. Similar to the +fullstatus option, except that the list of requests +currently being served is omitted.
    + +
    graceful
    + +
    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 configtest before initiating the +restart to make sure Apache doesn't die. This is equivalent to +apachectl -k graceful.
    + +
    configtest
    + +
    Run a configuration file syntax test. It parses the configuration +files and either reports Syntax Ok +or detailed information about the particular syntax error. This is +equivalent to apachectl -t.
    + +
    + +

    The following additional option is available, but deprecated.

    + +
    + +
    startssl
    + +
    This is equivalent to apachectl -k start -DSSL. We +recommend that you use that command explicitly, or you adjust your +httpd.conf to remove the <IfDefine> section so that SSL will always be +available.
    + +
    + +
    +
    +

    Available Languages:  en  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/apachectl.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/programs/apachectl.html.ko.euc-kr new file mode 100644 index 00000000..564912c7 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/apachectl.html.ko.euc-kr @@ -0,0 +1,146 @@ + + + +apachectl - ¾ÆÆÄÄ¡ À¥¼­¹ö Á¶Àý ÀÎÅÍÆäÀ̽º - Apache HTTP Server + + + + + +
    <-
    +

    apachectl - ¾ÆÆÄÄ¡ À¥¼­¹ö Á¶Àý ÀÎÅÍÆäÀ̽º

    +
    +

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

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

    apachectlÀº ¾ÆÆÄÄ¡ ÇÏÀÌÆÛÅؽºÆ® Àü¼Û + ÇÁ·ÎÅäÄÝ (HTTP) ¼­¹öÀÇ ¾Õ´ÜÀÌ´Ù. ÀÌ ÇÁ·Î±×·¥Àº °ü¸®ÀÚ°¡ + ¾ÆÆÄÄ¡ httpd µ¥¸óÀ» Á¶Á¤Çϵµ·Ï + µ½´Â´Ù.

    + +

    apachectl ½ºÅ©¸³Æ®´Â µÎ°¡Áö ¹æ¹ýÀ¸·Î ½ÇÇàÇÑ´Ù. + ù¹ø° ¹æ¹ýÀº httpdÀ» ºÎ¸£´Â °£´ÜÇÑ ½ºÅ©¸³Æ® + ¿ªÇÒÀ» ÇÏ¿©, ÇÊ¿äÇÑ È¯°æº¯¼ö¸¦ ¼³Á¤ÇÏ°í ¹ÞÀº ¸í·ÉÇà ¾Æ±Ô¸ÕÆ®¸¦ + °¡Áö°í httpd¸¦ ½ÇÇàÇÑ´Ù. µÎ¹ø° ¹æ¹ýÀº + apachectl¸¦ SysV init ½ºÅ©¸³Æ®·Î »ç¿ëÇÏ¿©, + start, restart, stop + °°Àº ÇÑ´Ü¾î ¾Æ±Ô¸ÕÆ®¸¦ ¹Þ¾Æ¼­ httpd¿¡°Ô + ÀûÀýÇÑ ½ÅÈ£¸¦ º¸³½´Ù.

    + +

    ¾ÆÆÄÄ¡¸¦ ÀϹÝÀûÀÎ °æ·Î¿¡ ¼³Ä¡ÇÏÁö ¾Ê¾Ò´Ù¸é, ÀûÀýÇÑ + httpd °æ·Î·Î apachectl ½ºÅ©¸³Æ®¸¦ + ¼öÁ¤ÇØ¾ß ÇÑ´Ù. ¶Ç, httpd ¸í·ÉÇà ¾Æ±Ô¸ÕÆ®¸¦ + Ãß°¡·Î ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. ÀÚ¼¼ÇÑ ³»¿ëÀº ½ºÅ©¸³Æ®ÀÇ ÁÖ¼®À» + Âü°íÇ϶ó.

    + +

    apachectl ½ºÅ©¸³Æ®´Â ¼º°ø½Ã Á¾·áÄÚµå 0À», + ¿À·ù½Ã >0À» ¹ÝȯÇÑ´Ù. ÀÚ¼¼ÇÑ ³»¿ëÀº ½ºÅ©¸³Æ®ÀÇ ÁÖ¼®À» + Âü°íÇ϶ó.

    +
    + +
    top
    +
    +

    °³¿ä

    + +

    °£´ÜÇÑ ½ÇÇà ½ºÅ©¸³Æ®·Î µ¿ÀÛÇϸé, apachectlÀº +httpd ½ÇÇàÆÄÀÏÀÇ ¸ðµç ¾Æ±Ô¸ÕÆ®¸¦ ¹Þ´Â´Ù.

    + +

    apachectl [ httpd-argument ]

    + +

    SysV init ¹æ½ÄÀ¸·Î µ¿ÀÛÇϸé, apachectlÀº ¾Æ·¡¼­ +¼³¸íÇÒ °£´ÜÇÑ ÇÑ´Ü¾î ¸í·É¾î¸¦ ¹Þ´Â´Ù.

    + +

    apachectl command

    + +
    top
    +
    +

    ¿É¼Ç

    + +

    ¿©±â¼­´Â SysV init-½Ä ¿É¼Ç¸¸ ¼³¸íÇÑ´Ù. ´Ù¸¥ ¿É¼ÇÀº httpd manpage¿¡¼­ ¼³¸íÇÑ´Ù.

    + +
    + +
    start
    + +
    ¾ÆÆÄÄ¡ httpd µ¥¸óÀ» ½ÃÀÛÇÑ´Ù. ÀÌ¹Ì ½ÇÇàÁßÀ̶ó¸é +¿À·ù¸¦ ³½´Ù. apachectl -k start¿Í °°´Ù.
    + +
    stop
    + +
    ¾ÆÆÄÄ¡ httpd µ¥¸óÀ» Áß´ÜÇÑ´Ù. apachectl +-k stop°ú °°´Ù.
    + +
    restart
    + +
    ¾ÆÆÄÄ¡ httpd µ¥¸óÀ» Àç½ÃÀÛÇÑ´Ù. µ¥¸óÀÌ ½ÇÇàÁßÀÌ +¾Æ´Ï¶ó¸é, ½ÃÀÛÇÑ´Ù. µ¥¸óÀÌ Àç½ÃÀ۽à ½ÇÆÐÇÏÁö ¾ÊÀ½À» È®ÀÎÇϱâÀ§ÇØ +Àç½ÃÀÛ Àü¿¡ ÀÚµ¿À¸·Î configtest ¸í·É°ú °°ÀÌ ¼³Á¤ÆÄÀÏÀ» +°Ë»çÇÑ´Ù. apachectl -k restart¿Í °°´Ù.
    + +
    fullstatus
    + +
    mod_statusÀÇ ¸ðµç »óÅ Á¤º¸¸¦ Ãâ·ÂÇÑ´Ù. +ÀÌ ¸í·ÉÀ» »ç¿ëÇϱâÀ§Çؼ­´Â ¼­¹ö°¡ mod_status¸¦ +»ç¿ëÇÏ°í, ½Ã½ºÅÛ¿¡ lynx °°Àº ¹®ÀÚ±â¹Ý ºê¶ó¿ìÀú°¡ +ÇÊ¿äÇÏ´Ù. »óÅ Á¤º¸¿¡ Á¢±ÙÇÏ´Â URLÀº ½ºÅ©¸³Æ®ÀÇ +STATUSURL º¯¼ö¸¦ ¼öÁ¤ÇÏ¿© ¼³Á¤ÇÒ ¼ö ÀÖ´Ù.
    + +
    status
    + +
    °£´ÜÇÑ »óÅ Á¤º¸¸¦ Ãâ·ÂÇÑ´Ù. fullstatus ¿É¼Ç°ú +ºñ½ÁÇÏÁö¸¸, ÇöÀç ¼­ºñ½ºÁßÀÎ ¿äû ¸ñ·ÏÀ» Ãâ·ÂÇÏÁö ¾Ê´Â´Ù.
    + +
    graceful
    + +
    ¾ÆÆÄÄ¡ httpd µ¥¸óÀ» Á¡ÀÝ°Ô(gracefully) Àç½ÃÀÛÇÑ´Ù. +µ¥¸óÀÌ ½ÇÇàÁßÀÌ ¾Æ´Ï¶ó¸é, ½ÃÀÛÇÑ´Ù. ÀϹÝÀûÀÎ Àç½ÃÀÛ°ú ´Þ¸® ÇöÀç +¿­·ÁÀÖ´Â ¿¬°áÀ» ²÷Áö¾Ê´Â´Ù. ¶Ç, ÀÌÀü ·Î±×ÆÄÀÏÀ» Áï½Ã ´ÝÁö ¾Ê´Â´Ù. +Áï, ·Î±×¼øȯ ½ºÅ©¸³Æ®¿¡¼­ ÀÌ ¸í·ÉÀ» »ç¿ëÇÑ´Ù¸é, ÀÌÀü ·Î±×ÆÄÀÏÀ» +ó¸®ÇϱâÀü¿¡ ·Î±×ÆÄÀÏÀ» ´ÝÇûÀ½À» º¸ÀåÇϱâÀ§ÇØ »ó´çÈ÷ ±â´Ù·Á¾ß +ÇÑ´Ù. ¾ÆÆÄÄ¡°¡ Àç½ÃÀ۽à ½ÇÆÐÇÏÁö ¾ÊÀ½À» È®ÀÎÇϱâÀ§ÇØ Àç½ÃÀÛ +Àü¿¡ ÀÚµ¿À¸·Î configtest ¸í·É°ú °°ÀÌ ¼³Á¤ÆÄÀÏÀ» +°Ë»çÇÑ´Ù. apachectl -k graceful°ú °°´Ù.
    + +
    configtest
    + +
    ¼³Á¤ÆÄÀÏÀÇ ¹®¹ýÀ» °Ë»çÇÑ´Ù. ¼³Á¤ÆÄÀÏÀ» Àаí Syntax +Ok ȤÀº ƯÁ¤ ¼³Á¤¿À·ù¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ Á¤º¸¸¦ ¾Ë·ÁÁØ´Ù. +apachectl -t¿Í °°´Ù.
    + +
    + +

    ¾Æ·¡ ¿É¼ÇÀ» »ç¿ëÇÒ ¼ö ÀÖÁö¸¸, ¾ÕÀ¸·Î »ç¶óÁú °ÍÀÌ´Ù.

    + +
    + +
    startssl
    + +
    apachectl -k start -DSSL°ú °°´Ù. ¿ì¸®´Â Á÷Á¢ +¾ÕÀÇ ¸í·É¾î¸¦ »ç¿ëÇϰųª Ç×»ó SSLÀ» »ç¿ëÇϵµ·Ï +httpd.conf¿¡¼­ <IfDefine> ¼½¼ÇÀ» Á¦°ÅÇÏ±æ ±ÇÇÑ´Ù.
    + +
    + +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/apachectl.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/programs/apachectl.html.tr.utf8 new file mode 100644 index 00000000..594cf1c5 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/apachectl.html.tr.utf8 @@ -0,0 +1,160 @@ + + + +apachectl - Apache HTTP Sunucusu Denetim Arayüzü - Apache HTTP Sunucusu + + + + + +
    <-
    +

    apachectl - Apache HTTP Sunucusu Denetim Arayüzü

    +
    +

    Mevcut Diller:  en  | + ko  | + tr 

    +
    + +

    apachectl Apache Hiper Metin Aktarım + Protokolü (HTTP) sunucusu için bir denetim aracıdır. Sistem + yöneticisinin Apache httpd artalan + sürecini denetimi altında tutabilmesine yardımcı olmak amacıyla + tasarlanmıştır.

    + +

    apachectl iki kipte işleyebilir. + İlkinde, httpd komutu için basit + bir önyüz gibi davranarak, gerekli ortam değişkenlerini atar ve + belirtilen komut satırı seçenekleriyle + httpd sürecini başlatır. İkinci + kipte ise, apachectl bir SysV başlatma + betiği olarak start, + restart, + stop gibi tek sözcüklük basit argümanlar + alır ve bunları uygun sinyallere dönüştürerek + httpd'ye gönderir.

    + +

    Eğer Apache kurulumunuzda standart dışı dosya yolları kullanmışsanız, + httpd programına uygun yolları + atamak için apachectl betiğini elden + geçirmelisiniz. Bu arada gerek gördüğünüz + httpd komut satırı argümanlarını da + belirtebilirsiniz. Ayrıntılar için betik içindeki açıklamalara + bakınız.

    + +

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

    +
    + +
    top
    +
    +

    Kullanım

    + +

    apachectl önyüz kipinde çalıştığında + httpd programının bütün komut + satırı argümanlarını kabul edebilir.

    + +

    apachectl [ httpd-argümanları ] +

    + +

    SysV başlatma betiği kipinde ise, + apachectl aşağıda tanımlanan basit, tek + sözcüklük komutları kabul eder.

    + +

    apachectl komut

    + +
    top
    +
    +

    Seçenekler

    + +

    Burada sadece SysV başlatma betiğine özgü seçeneklere yer verilmiştir. + Diğer argümanlar için httpd kılavuz + sayfasına bakınız.

    + +
    +
    start
    +
    Apache httpd artalan sürecini + başlatır. Zaten çalışmaktaysa bir hata verir. apachectl + -k start komutuna eşdeğerdir.
    + +
    stop
    +
    Apache httpd artalan sürecini + durdurur. apachectl -k stop komutuna + eşdeğerdir.
    + +
    restart
    +
    Apache httpd 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 + configtest seçeneği verilmiş gibi + yapılandırma dosyaları sınanır. apachectl -k + restart komutuna eşdeğerdir.
    + +
    fullstatus
    +
    mod_status üzerinden tam bir + durum raporu gösterir. Bunun çalışması için sunucuda + mod_status etkinleştirilmiş olmalı + ve sisteminizde lynx 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.
    + +
    status
    +
    Özet halinde bir durum raporu gösterir. O an sunulmakta olan + isteklerin gösterilmemesi dışında + fullstatus seçeneği gibidir.
    + +
    graceful
    +
    Apache httpd artalan sürecini + nazikçe 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 configtest + seçeneği verilmiş gibi yapılandırma dosyaları sınanır. + apachectl -k graceful komutuna + eşdeğerdir.
    + +
    configtest
    +
    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. apachectl -t + komutuna eşdeğerdir.
    + +
    + +

    Aşağıdaki seçenek eski sürümlerde kullanılmaktaydı, fakat artık + kullanımı önerilmemektedir.

    + +
    +
    startssl
    +
    apachectl -k start -DSSL komutuna + eşdeğerdir; doğrudan doğruya bu komutu kullanmanızı öneriyoruz. Veya + httpd.conf dosyanızdan <IfDefine> bölümünü silmek suretiyle SSL’nin + daima etkin olmasını sağlayabilir ve normal apachectl + start komutunu da kullanabirsiniz.
    +
    +
    +
    +

    Mevcut Diller:  en  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/apxs.html b/rubbos/app/httpd-2.0.64/docs/manual/programs/apxs.html new file mode 100644 index 00000000..bcf33408 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/apxs.html @@ -0,0 +1,13 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: apxs.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: apxs.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: apxs.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/apxs.html.en b/rubbos/app/httpd-2.0.64/docs/manual/programs/apxs.html.en new file mode 100644 index 00000000..d8ebfd2a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/apxs.html.en @@ -0,0 +1,339 @@ + + + +apxs - APache eXtenSion tool - Apache HTTP Server + + + + + +
    <-
    +

    apxs - APache eXtenSion tool

    +
    +

    Available Languages:  en  | + ko  | + tr 

    +
    + +

    apxs 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 files which then can be loaded into the Apache server + under runtime via the LoadModule + directive from mod_so.

    + +

    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 apxs tool automatically + complains if this is not the case. You can check this yourself by manually + running the command

    + +

    + $ httpd -l +

    + +

    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 apxs tool:

    + +

    + $ 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
    + $ _ +

    + +

    The arguments files can be any C source file (.c), a object + file (.o) or even a library archive (.a). The apxs 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 -fpic. For other C compilers consult its + manual page or at watch for the flags apxs uses to compile the + object files.

    + +

    For more details about DSO support in Apache read the documentation of + mod_so or perhaps even read the + src/modules/standard/mod_so.c source file.

    +
    + +
    top
    +
    +

    Synopsis

    +

    apxs -g + [ -S name=value ] + -n modname

    + +

    apxs -q + [ -S name=value ] + query ...

    + +

    apxs -c + [ -S name=value ] + [ -o dsofile ] + [ -I incdir ] + [ -D name=value ] + [ -L libdir ] + [ -l libname ] + [ -Wc,compiler-flags ] + [ -Wl,linker-flags ] + files ...

    + +

    apxs -i + [ -S name=value ] + [ -n modname ] + [ -a ] + [ -A ] + dso-file ...

    + +

    apxs -e + [ -S name=value ] + [ -n modname ] + [ -a ] + [ -A ] + dso-file ...

    +
    top
    +
    +

    Options

    +

    Common Options

    +
    +
    -n modname
    +
    This explicitly sets the module name for the -i (install) + and -g (template generation) option. Use this to explicitly + specify the module name. For option -g this is required, for + option -i the apxs tool tries to determine the + name from the source or (as a fallback) at least by guessing it from the + filename.
    +
    + + +

    Query Options

    +
    +
    -q
    +
    Performs a query for apxs's knowledge about certain + settings. The query parameters can be one or more of the + following strings: CC, CFLAGS, + CFLAGS_SHLIB, INCLUDEDIR, LD_SHLIB, + LDFLAGS_SHLIB, LIBEXECDIR, + LIBS_SHLIB, SBINDIR, SYSCONFDIR, + TARGET. + +

    Use this for manually determining settings. For instance use

    +

    + INC=-I`apxs -q INCLUDEDIR` +

    + +

    inside your own Makefiles if you need manual access to Apache's C + header files.

    +
    + + +

    Configuration Options

    +
    +
    -S name=value
    +
    This option changes the apxs settings described above.
    +
    + + +

    Template Generation Options

    +
    +
    -g
    +
    This generates a subdirectory name (see option + -n) and there two files: A sample module source file named + mod_name.c 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 Makefile for even easier + build and installing of this module.
    +
    + + +

    DSO Compilation Options

    +
    +
    -c
    +
    This indicates the compilation operation. It first compiles the C + source files (.c) of files into corresponding object files (.o) + and then builds a dynamically shared object in dsofile by + linking these object files plus the remaining object files (.o and .a) of + files. If no -o option is specified the output + file is guessed from the first filename in files and thus + usually defaults to mod_name.so.
    + +
    -o dsofile
    +
    Explicitly specifies the filename of the created dynamically shared + object. If not specified and the name cannot be guessed from the + files list, the fallback name mod_unknown.so is + used.
    + +
    -D name=value
    +
    This option is directly passed through to the compilation command(s). + Use this to add your own defines to the build process.
    + +
    -I incdir
    +
    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.
    + +
    -L libdir
    +
    This option is directly passed through to the linker command. Use this + to add your own library directories to search to the build process.
    + +
    -l libname
    +
    This option is directly passed through to the linker command. Use this + to add your own libraries to search to the build process.
    + +
    -Wc,compiler-flags
    +
    This option passes compiler-flags as additional flags to + the compiler command. Use this to add local compiler-specific options.
    + +
    -Wl,linker-flags
    +
    This option passes linker-flags as additional flags to + the linker command. Use this to add local linker-specific options.
    +
    + + +

    DSO Installation and Configuration Options

    + +
    +
    -i
    +
    This indicates the installation operation and installs one or more + dynamically shared objects into the server's modules + directory.
    + +
    -a
    +
    This activates the module by automatically adding a corresponding + LoadModule line to Apache's + httpd.conf configuration file, or by enabling it if it + already exists.
    + +
    -A
    +
    Same as option -a but the created LoadModule directive is prefixed with a hash + sign (#), i.e., the module is just prepared for + later activation but initially disabled.
    + +
    -e
    +
    This indicates the editing operation, which can be used with the + -a and -A options similarly to the + -i operation to edit Apache's httpd.conf + configuration file without attempting to install the module.
    +
    + +
    top
    +
    +

    Examples

    +

    Assume you have an Apache module named mod_foo.c 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:

    + +

    + $ apxs -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
    + $ _ +

    + +

    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 apxs provides + an automatic way to install the shared object in its "modules" directory + and updating the httpd.conf file accordingly. This can be + achieved by running:

    + +

    + $ apxs -i -a mod_foo.c
    + 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]
    + $ _ +

    + +

    This way a line named

    + +

    + LoadModule foo_module modules/mod_foo.so +

    + +

    is added to the configuration file if still not present. If you want to + have this disabled per default use the -A option, + i.e.

    + +

    + $ apxs -i -A mod_foo.c +

    + +

    For a quick test of the apxs mechanism you can create a sample Apache + module template plus a corresponding Makefile via:

    + +

    + $ apxs -g -n foo
    + Creating [DIR] foo
    + Creating [FILE] foo/Makefile
    + Creating [FILE] foo/mod_foo.c
    + $ _ +

    + +

    Then you can immediately compile this sample module into a shared object + and load it into the Apache server:

    + +

    + $ cd foo
    + $ make all reload
    + apxs -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
    + apxs -i -a -n "foo" mod_foo.so
    + 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
    + $ _ +

    + +

    You can even use apxs to compile complex modules outside the + Apache source tree, like PHP3:

    + +

    + $ cd php3
    + $ ./configure --with-shared-apache=../apache-1.3
    + $ apxs -c -o libphp3.so mod_php3.c libmodphp3-so.a
    + gcc -fpic -DSHARED_MODULE -I/tmp/apache/include -c mod_php3.c
    + ld -Bshareable -o libphp3.so mod_php3.o libmodphp3-so.a
    + $ _ +

    + +

    because apxs automatically recognized C source files and + object files. Only C source files are compiled while remaining object + files are used for the linking phase.

    +
    +
    +

    Available Languages:  en  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/apxs.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/programs/apxs.html.ko.euc-kr new file mode 100644 index 00000000..b5d83921 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/apxs.html.ko.euc-kr @@ -0,0 +1,335 @@ + + + +apxs - APache eXtenSion µµ±¸ - Apache HTTP Server + + + + + +
    <-
    +

    apxs - APache eXtenSion µµ±¸

    +
    +

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

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

    apxs´Â ¾ÆÆÄÄ¡ ÇÏÀÌÆÛÅؽºÆ® Àü¼Û ÇÁ·ÎÅäÄÝ + (HTTP) ¼­¹öÀÇ È®Àå¸ðµâÀ» ÄÄÆÄÀÏÇÏ°í ¼³Ä¡ÇÏ´Â µµ±¸ÀÌ´Ù. ÀÌ + µµ±¸´Â ¿©·¯ ¼Ò½º¿Í ¿ÀºêÁ§Æ®ÆÄÀÏÀ» °¡Áö°í, + mod_soÀÇ LoadModule Áö½Ã¾î·Î ½ÇÇàÁß¿¡ + ¾ÆÆÄÄ¡ ¼­¹ö·Î ÀоîµéÀÏ ¼ö ÀÖ´Â µ¿Àû°øÀ¯°´Ã¼(DSO)¸¦ ¸¸µç´Ù.

    + +

    ±×·¡¼­ ÀÌ·± È®Àå¹æ½ÄÀ» »ç¿ëÇÏ·Á¸é Ç÷¡ÆûÀÌ DSO ±â´ÉÀ» + Áö¿øÇÏ°í ¾ÆÆÄÄ¡ httpd ½ÇÇàÆÄÀÏÀ» + mod_so ¸ðµâ°ú °°ÀÌ ÄÄÆÄÀÏÇØ¾ß ÇÑ´Ù. + apxs µµ±¸´Â ÀÌ Á¶°ÇÀÌ ¸¸Á·ÇÏÁö¾ÊÀ¸¸é ½ÇÇàÇÏÁö + ¾Ê´Â´Ù. Á÷Á¢ ¸í·É¾î¸¦ ½ÇÇàÇÏ¿© Á¶°ÇÀÌ ¸¸Á·ÇÏ´ÂÁö ¾Ë¾Æº¼ + ¼ö ÀÖ´Ù

    + +

    + $ httpd -l +

    + +

    ¸ñ·Ï¿¡ mod_so ¸ðµâÀÌ ³ª¿Í¾ß ÇÑ´Ù. Á¶°ÇÀ» + ¸¸Á·Çϸé apxs µµ±¸·Î DSO ¸ðµâÀ» ¼³Ä¡ÇÏ¿© + ¾ÆÆÄÄ¡¼­¹öÀÇ ±â´ÉÀ» ½±°Ô È®ÀåÇÒ ¼ö ÀÖ´Ù:

    + +

    + $ 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
    + $ _ +

    + +

    ¾Æ±Ô¸ÕÆ® files¿¡´Â C ¼Ò½ºÆÄÀÏ (.c) À̳ª + ¿ÀºêÁ§Æ®ÆÄÀÏ (.o), ¶óÀ̺귯¸®¸ðÀ½ (.a)À» »ç¿ëÇÒ ¼ö ÀÖ´Ù. + apxs µµ±¸´Â È®ÀåÀÚ¸¦ º¸°í ÀÚµ¿À¸·Î C ¼Ò½ºÆÄÀÏÀº + ÄÄÆÄÀÏÇÏ°í, ¿ÀºêÁ§Æ®¿Í ¸ðÀ½ÆÄÀÏÀº ¸µÅ©¿¡¸¸ »ç¿ëÇÑ´Ù. ±×·¯³ª + ÄÄÆÄÀÏÇÑ ¿ÀºêÁ§Æ®¸¦ »ç¿ëÇÏ·Á¸é µ¿ÀûÀ¸·Î ÀоîµéÀÏ ¼ö ÀÖ´Â + °øÀ¯°´Ã¼·Î »ç¿ëÇϱâÀ§ÇØ ¹Ýµå½Ã ¿ÀºêÁ§Æ®¸¦ À§Ä¡µ¶¸³ÄÚµå(PIC, + position independent code)·Î ÄÄÆÄÀÏÇØ¾ß ÇÑ´Ù. GCCÀÇ °æ¿ì + -fpicÀ» »ç¿ëÇÏ¸é µÈ´Ù. ´Ù¸¥ C ÄÄÆÄÀÏ·¯´Â ¼³¸í¼­¸¦ + Âü°íÇϰųª apxs°¡ ¿ÀºêÁ§Æ®ÆÄÀÏÀ» ÄÄÆÄÀÏÇÒ¶§ + »ç¿ëÇÏ´Â ¿É¼ÇÀ» Âü°íÇ϶ó.

    + +

    ¾ÆÆÄÄ¡ÀÇ DSO Áö¿ø¿¡ ´ëÇÑ ´õ ÀÚ¼¼ÇÑ ³»¿ëÀº + mod_so ¹®¼­¸¦ Âü°íÇϰųª + src/modules/standard/mod_so.c ¼Ò½ºÆÄÀÏÀ» ÀоîºÁ¶ó.

    +
    + +
    top
    +
    +

    °³¿ä

    +

    apxs -g + [ -S name=value ] + -n modname

    + +

    apxs -q + [ -S name=value ] + query ...

    + +

    apxs -c + [ -S name=value ] + [ -o dsofile ] + [ -I incdir ] + [ -D name=value ] + [ -L libdir ] + [ -l libname ] + [ -Wc,compiler-flags ] + [ -Wl,linker-flags ] + files ...

    + +

    apxs -i + [ -S name=value ] + [ -n modname ] + [ -a ] + [ -A ] + dso-file ...

    + +

    apxs -e + [ -S name=value ] + [ -n modname ] + [ -a ] + [ -A ] + dso-file ...

    +
    top
    +
    +

    ¿É¼Ç

    +

    °øÅë ¿É¼Ç

    +
    +
    -n modname
    +
    -i (install)°ú -g (template + generation) ¿É¼ÇÀ» »ç¿ëÇÒ¶§ Á÷Á¢ ¸ðµâ¸íÀ» ÁöÁ¤ÇÑ´Ù. ÀÌ + ¿É¼ÇÀ» »ç¿ëÇÏ¿© ¸ðµâ¸íÀ» Á÷Á¢ ÁöÁ¤ÇÑ´Ù. -g + ¿É¼ÇÀ» »ç¿ëÇÑ´Ù¸é ÀÌ ¿É¼ÇÀ» ¹Ýµå½Ã »ç¿ëÇؾßÇÏ°í, + -i ¿É¼ÇÀ» »ç¿ëÇÑ´Ù¸é apxs µµ±¸´Â + ¼Ò½º³ª (¸¶Áö¸· ½Ãµµ·Î) ÆÄÀϸíÀ» °¡Áö°í À̸§À» ÃßÃøÇÑ´Ù.
    +
    + + +

    ÁúÀÇ ¿É¼Ç

    +
    +
    -q
    +
    apxsÀÇ ¼³Á¤°ªÀ» ¾Ë¾Æ³½´Ù. query¿¡´Â + ´ÙÀ½À» »ç¿ëÇÒ ¼ö ÀÖ´Ù: CC, CFLAGS, + CFLAGS_SHLIB, INCLUDEDIR, + LD_SHLIB, LDFLAGS_SHLIB, + LIBEXECDIR, LIBS_SHLIB, + SBINDIR, SYSCONFDIR, TARGET. + +

    ¼³Á¤À» Á÷Á¢ ¾Ë¾Æ³¾¶§ »ç¿ëÇÑ´Ù.

    +

    + INC=-I`apxs -q INCLUDEDIR` +

    + +

    ¿¹¸¦ µé¾î, ¾ÆÆÄÄ¡ C Çì´õÆÄÀÏÀ» Á÷Á¢ Á¢±ÙÇÑ´Ù¸é + Makefile¿¡¼­ À§¿Í °°ÀÌ »ç¿ëÇÑ´Ù.

    +
    + + +

    ¼³Á¤ ¿É¼Ç

    +
    +
    -S name=value
    +
    ÀÌ ¿É¼ÇÀº À§¿¡¼­ ¼³¸íÇÑ apxs ¼³Á¤À» º¯°æÇÑ´Ù.
    +
    + + +

    °ßº»(template) »ý¼º ¿É¼Ç

    +
    +
    -g
    +
    ÇÏÀ§µð·ºÅ丮 nameÀ» ¸¸µé°í (-n + ¿É¼Ç Âü°í) ±×°÷¿¡ ÆÄÀÏ µÎ°³¸¦ ¸¸µç´Ù: ÇÑ ÆÄÀÏÀº + mod_name.c¶ó´Â °ßº» ¸ðµâ¼Ò½ºÆÄÀÏ·Î, + ÀÚ½ÅÀÇ ¸ðµâÀ» ¸¸µé¶§ °ßº»À¸·Î »ç¿ëÇϰųª apxs ±â´ÉÀ» + ½ÃÇèÇغ¼¶§ »ç¿ëÇÑ´Ù. ´Ù¸¥ ÆÄÀÏÀº ÀÌ ¸ðµâÀ» ½±°Ô ÄÄÆÄÀÏÇÏ°í + ¼³Ä¡ÇϱâÀ§ÇÑ MakefileÀÌ´Ù.
    +
    + + +

    DSO ÄÄÆÄÀÏ ¿É¼Ç

    +
    +
    -c
    +
    ÄÄÆÄÀÏÀ» Áö½ÃÇÑ´Ù. ¸ÕÀú files¿¡¼­ C + ¼Ò½ºÆÄÀϵé(.c)À» ¿ÀºêÁ§Æ®ÆÄÀÏ(.o)·Î ÄÄÆÄÀÏÇÏ°í, + filesÀÇ ³ª¸ÓÁö ¿ÀºêÁ§Æ®ÆÄÀϵé(.o°ú .a)°ú + ¸µÅ©ÇÏ¿© µ¿Àû°øÀ¯°´Ã¼ dsofileÀ» ¸¸µç´Ù. + -o ¿É¼ÇÀ» »ç¿ëÇÏÁö¾ÊÀ¸¸é filesÀÇ + ù¹ø° ÆÄÀÏ¸í¿¡¼­ À̸§À» ÃßÃøÇÏ¿© º¸Åë + mod_name.so¸¦ »ç¿ëÇÑ´Ù.
    + +
    -o dsofile
    +
    »ý¼ºÇÒ µ¿Àû°øÀ¯°´Ã¼ ÆÄÀϸíÀ» Á÷Á¢ ÁöÁ¤ÇÑ´Ù. À̸§À» + ÁöÁ¤ÇÏÁö¾Ê°í files ¸ñ·Ï¿¡¼­ À̸§À» ÃßÃøÇÏÁö + ¸øÇÏ¸é ¸¶Áö¸·À¸·Î mod_unknown.so¸¦ À̸§À¸·Î + »ç¿ëÇÑ´Ù.
    + +
    -D name=value
    +
    ÀÌ ¿É¼ÇÀ» ÄÄÆÄÀÏ ¸í·É¾î·Î Á÷Á¢ Àü´ÞÇÑ´Ù. + ÄÄÆÄÀ϶§ ÀÚ½ÅÀÇ defineÀ» Ãß°¡ÇÑ´Ù.
    + +
    -I incdir
    +
    ÀÌ ¿É¼ÇÀ» ÄÄÆÄÀÏ ¸í·É¾î·Î Á÷Á¢ Àü´ÞÇÑ´Ù. + ÄÄÆÄÀ϶§ include¸¦ ãÀ» µð·ºÅ丮¸¦ Ãß°¡ÇÑ´Ù.
    + +
    -L libdir
    +
    ÀÌ ¿É¼ÇÀ» ¸µÄ¿ ¸í·É¾î·Î Á÷Á¢ Àü´ÞÇÑ´Ù. + ÄÄÆÄÀ϶§ ¶óÀ̺귯¸®¸¦ ãÀ» µð·ºÅ丮¸¦ Ãß°¡ÇÑ´Ù.
    + +
    -l libname
    +
    ÀÌ ¿É¼ÇÀ» ¸µÄ¿ ¸í·É¾î·Î Á÷Á¢ Àü´ÞÇÑ´Ù. + ÄÄÆÄÀ϶§ »ç¿ëÇÒ ¶óÀ̺귯¸®¸¦ Ãß°¡ÇÑ´Ù.
    + +
    -Wc,compiler-flags
    +
    ÀÌ ¿É¼ÇÀº Ãß°¡ ¿É¼Ç compiler-flags¸¦ + ÄÄÆÄÀÏ ¸í·É¾î·Î Àü´ÞÇÑ´Ù. ÄÄÆÄÀÏ·¯ ƯÀ¯ÀÇ ¿É¼ÇÀ» Ãß°¡ÇÒ¶§ + »ç¿ëÇÑ´Ù.
    + +
    -Wl,linker-flags
    +
    ÀÌ ¿É¼ÇÀº Ãß°¡ ¿É¼Ç linker-flags¸¦ + ¸µÄ¿ ¸í·É¾î·Î Àü´ÞÇÑ´Ù. ¸µÄ¿ ƯÀ¯ÀÇ ¿É¼ÇÀ» Ãß°¡ÇÒ¶§ + »ç¿ëÇÑ´Ù.
    +
    + + +

    DSO ¼³Ä¡°ú ¼³Á¤ ¿É¼Ç

    + +
    +
    -i
    +
    ¼³Ä¡¸¦ Áö½ÃÇÑ´Ù. ¿©·¯ µ¿Àû°øÀ¯°´Ã¼¸¦ ¼­¹öÀÇ + modules µð·ºÅ丮¿¡ ¼³Ä¡ÇÑ´Ù.
    + +
    -a
    +
    ¾ÆÆÄÄ¡ httpd.conf ¼³Á¤ÆÄÀÏ¿¡ ÀûÀýÇÑ + LoadModule ÁÙÀ» + Ãß°¡Çϰųª ÀÌ¹Ì ÀÖ´Ù¸é È°¼ºÈ­ÇÏ¿© ¸ðµâÀ» »ç¿ëÇϵµ·Ï + ¸¸µç´Ù.
    + +
    -A
    +
    -a¿Í ºñ½ÁÇÏÁö¸¸, LoadModule Áö½Ã¾î ¾Õ¿¡ + ¿ì¹°Á¤ÀÚ(#)¸¦ ºÙÀδÙ. Áï, ÇöÀç´Â + »ç¿ëÇÏÁö¾ÊÁö¸¸ ³ªÁß¿¡ »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ¸ðµâÀ» ÁغñÇÑ´Ù.
    + +
    -e
    +
    ÆíÁýÀ» Áö½ÃÇÑ´Ù. -a ȤÀº -A + ¿É¼Ç°ú °°ÀÌ »ç¿ëÇÒ ¼ö ÀÖÀ¸¸ç, -i ¸í·É°ú + ºñ½ÁÇÏÁö¸¸ ¸ðµâÀ» ¼³Ä¡ÇÏÁö¾Ê°í ¾ÆÆÄÄ¡ + httpd.conf ¼³Á¤ÆÄÀϸ¸ ÆíÁýÇÑ´Ù.
    +
    + +
    top
    +
    +

    ¿¹Á¦

    +

    ¾ÆÆÄÄ¡¼­¹öÀÇ ±â´ÉÀ» È®ÀåÇÏ´Â mod_foo.c¶ó´Â + ¾ÆÆÄÄ¡ ¸ðµâÀÌ ÀÖ´Ù°í °¡Á¤ÇÏÀÚ. ¸ÕÀú ´ÙÀ½ ¸í·É¾î¸¦ »ç¿ëÇÏ¿© + C ¼Ò½º¸¦ ¾ÆÆÄÄ¡ ¼­¹ö°¡ ÀоîµéÀÏ °øÀ¯°´Ã¼·Î ÄÄÆÄÀÏÇÑ´Ù:

    + +

    + $ apxs -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
    + $ _ +

    + +

    ±×¸®°í ÀÌ °øÀ¯°´Ã¼¸¦ ÀоîµéÀÌ´Â LoadModule Áö½Ã¾î¸¦ ¾ÆÆÄÄ¡ + ¼³Á¤¿¡ Ãß°¡ÇÑ´Ù. apxs´Â ÀÚµ¿À¸·Î °øÀ¯°´Ã¼¸¦ + "modules" µð·ºÅ丮¿¡ ¼³Ä¡ÇÏ°í httpd.conf ÆÄÀÏÀ» + ¾Ë¸Â°Ô ¼öÁ¤ÇÏ¿© °£´ÜÈ÷ ÀÛ¾÷À» ¸¶Ä£´Ù. ´ÙÀ½ °°ÀÌ ½ÇÇàÇÑ´Ù:

    + +

    + $ apxs -i -a mod_foo.c
    + 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]
    + $ _ +

    + +

    ±×·¯¸é ´ÙÀ½°ú °°Àº ÁÙÀ»

    + +

    + LoadModule foo_module modules/mod_foo.so +

    + +

    ¼³Á¤ÆÄÀÏ¿¡ ¾ø´Ù¸é Ãß°¡ÇÑ´Ù. ÀÌ ¼³Á¤À» ±âº»ÀûÀ¸·Î »ç¿ëÇÏÁö + ¾Ê´Â´Ù¸é -A ¿É¼ÇÀ» »ç¿ëÇÑ´Ù. Áï

    + +

    + $ apxs -i -A mod_foo.c +

    + +

    apxs¸¦ ½±°Ô »ç¿ëÇÏ·Á°í ´ÙÀ½°ú °°ÀÌ ¾ÆÆÄÄ¡ ¸ðµâ °ßº»°ú + MakefileÀ» ¸¸µé ¼ö ÀÖ´Ù:

    + +

    + $ apxs -g -n foo
    + Creating [DIR] foo
    + Creating [FILE] foo/Makefile
    + Creating [FILE] foo/mod_foo.c
    + $ _ +

    + +

    ±×·±ÈÄ ¹Ù·Î °ßº» ¸ðµâÀ» °øÀ¯°´Ã¼·Î ÄÄÆÄÀÏÇÏ¿© ¾ÆÆÄÄ¡ + ¼­¹ö°¡ Àеµ·ÏÇÑ´Ù:

    + +

    + $ cd foo
    + $ make all reload
    + apxs -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
    + apxs -i -a -n "foo" mod_foo.so
    + 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
    + $ _ +

    + +

    ½ÉÁö¾î ¾ÆÆÄÄ¡ ¼Ò½º ¹Û¿¡¼­ apxs¸¦ »ç¿ëÇÏ¿© + PHP3¿Í °°ÀÌ º¹ÀâÇÑ ¸ðµâÀ» ÄÄÆÄÀÏÇÒ ¼ö ÀÖ´Ù:

    + +

    + $ cd php3
    + $ ./configure --with-shared-apache=../apache-1.3
    + $ apxs -c -o libphp3.so mod_php3.c libmodphp3-so.a
    + gcc -fpic -DSHARED_MODULE -I/tmp/apache/include -c mod_php3.c
    + ld -Bshareable -o libphp3.so mod_php3.o libmodphp3-so.a
    + $ _ +

    + +

    apxs´Â ÀÚµ¿À¸·Î C ¼Ò½ºÆÄÀÏ°ú ¿ÀºêÁ§Æ®ÆÄÀÏÀ» + ±¸º°ÇÑ´Ù. C ¼Ò½ºÆÄÀϸ¸ ÄÄÆÄÀÏÇÏ°í ³ª¸ÓÁö ¿ÀºêÁ§Æ®ÆÄÀÏÀº + ¸µÅ©ÇÒ¶§ »ç¿ëÇÑ´Ù.

    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/apxs.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/programs/apxs.html.tr.utf8 new file mode 100644 index 00000000..a751af4e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/apxs.html.tr.utf8 @@ -0,0 +1,360 @@ + + + +apxs - Apache Eklenti Aracı - Apache HTTP Sunucusu + + + + + +
    <-
    +

    apxs - Apache Eklenti Aracı

    +
    +

    Mevcut Diller:  en  | + ko  | + tr 

    +
    + +

    apxs, 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 + dosyasından bir devingen paylaşımlı nesne (DSO - "Dynamic + Shared Object" kısaltması) derlemek ve bu nesneyi (modülü) Apache + sunucusuna çalışma anında mod_so + modülünün LoadModule yönergesi üzerinden yüklemek mümkün + olmaktadır.

    + +

    Bu eklenti mekanizmasını platformunuzda kullanmak için DSO desteğinin + olması ve httpd programının + mod_so modülünü içerecek şekilde + derlenmiş olması gerekir. Eğer bunlar mevcut değilse + apxs aracı durumu size bildirecektir. Bunu + aşağıdaki komutla kendiniz de sınayabilirsiniz:

    + +

    + $ httpd -l +

    + +

    mod_so modülü gösterilen listede yer + almalıdır. Bu gereksinimler sağlandığı takdirde + apxs aracı sayesinde DSO mekanizması + üzerinden kendi modüllerinizi kurmak suretiyle Apache sunucunuzun + işlevselliğini kolayca arttırabilirsiniz. Örnek bir uygulama:

    + +

    + $ 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
    + $ _ +

    + +

    dosya olarak bir C kaynak dosyası (.c), bir nesne dosyası + (.o) ve hatta bir kütüphane arşivi archive (.a) belirtebilirsiniz. + apxs 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 -fpic seçeneği ile + kullanmalısınız. Diğer C derleyiciler için, + apxs'in nesne dosyalarını derlerken + kullanacağı seçenekleri öğrenmek için o derleyicilerin kılavuz + sayfalarına bakınız.

    + +

    Apache'deki DSO desteği ile ilgili daha ayrıntılı bilgi edinmek için + mod_so belgesini okumakla yetinmeyip + src/modules/standard/mod_so.c kaynak dosyasını da + okuyunuz.

    +
    +

    Ayrıca bakınız:

    +
    top
    +
    +

    Kullanım

    +

    apxs -g + [ -S isim=değer ] + -n modüladı

    + +

    apxs -q + [ -S isim=değer ] + sorgu ...

    + +

    apxs -c + [ -S isim=değer ] + [ -o dso-dosyası ] + [ -I include-dizini ] + [ -D isim=değer ] + [ -L lib-dizini ] + [ -l kütüphane-adı ] + [ -Wc,derleyici-seçenekleri ] + [ -Wl,ilintileyici-seçenekleri ] + dosya ...

    + +

    apxs -i + [ -S isim=değer ] + [ -n modüladı ] + [ -a ] + [ -A ] + dso-dosyası ...

    + +

    apxs -e + [ -S isim=değer ] + [ -n modüladı ] + [ -a ] + [ -A ] + dso-dosyası ...

    +
    top
    +
    +

    Seçenekler

    +

    Ortak Seçenekler

    +
    +
    -n modüladı
    +
    -i (kurulum) ve -g (ş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. + -g seçeneği için bu gereklidir. + -i 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.
    +
    + + +

    Sorgu Seçenekleri

    +
    +
    -q sorgu
    +
    apxs'in belli ayarlar hakkında + bilgisine başvurmak için bir sorgu gerçekleştirir. + sorgu olarak şu dizgelerden biri veya + birkaçı belirtilebilir: CC, CFLAGS, + CFLAGS_SHLIB, INCLUDEDIR, + LD_SHLIB, LDFLAGS_SHLIB, + LIBEXECDIR, LIBS_SHLIB, + SBINDIR, SYSCONFDIR, TARGET. + +

    Bu seçeneği ayarları öğrenmek için kullanın. Ö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` +

    +
    + + +

    Yapılandırma Seçenekleri

    +
    +
    -S isim=değer
    +
    Bu seçenek yukarıda açıklanan apxs + ayarlarını değiştirir.
    +
    + + +

    Şablon Üretme Seçenekleri

    +
    +
    -g
    +
    modüladı (-n seçeneğihe + 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 + apxs mekanizmaları ile hemen oynamaya + başlayabilmeniz için mod_modüladı.c adında bir + modül kaynak dosyası örneği ve bu modülü derleyip kurmayı + kolaylaştırmak için bir Makefile dosyası.
    +
    + + +

    DSO Derleme Seçenekleri

    +
    +
    -c
    +
    Bu seçenek derleme yapılacağını belirtir. Önce belirtilen C kaynak + dosyalarını (.c), nesne dosyalarını (.o) elde etmek için + derler. Sonra bunları kalan nesne dosyaları (.o ve .a) ile + ilintileyerek dso-dosyası adında bir devingen paylaşımlı + nesne oluşturur. Eğer -o seçeneği ile + modül ismi belirtilmemişse dosyalar arasındaki ilk dosyanın + ismine bakarak dosya ismi tahmin edilmeye çalışılır ve + mod_isim.so dosya adı bu isimden elde + edilir.
    + +
    -o dso-dosyası
    +
    Oluşturulacak devingen paylaşımlı nesnenin ismini belirtmek için + kullanılır. Modül ismi bu seçenekle belirtilmez ve dosya + listesinden bir isim tahmini de yapılamazsa son çare olarak + mod_unknown.so ismi kullanılır.
    + +
    -D isim=değer
    +
    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.
    + +
    -I include-dizini
    +
    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.
    + +
    -L lib-dizini
    +
    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.
    + +
    -l kütüphane-adı
    +
    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.
    + +
    -Wc,derleyici-seçenekleri
    +
    Bu seçenek derleme 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.
    + +
    -Wl,ilintileyici-seçenekleri
    +
    Bu seçenek nesne ilintileme 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.
    +
    + + +

    DSO Kurulum ve Yapılandırma Seçenekleri

    + +
    +
    -i
    +
    Kurulum işlemini belirtir ve devingen olarak paylaşımlı nesneleri + sunucunun modules dizinine kurar.
    + +
    -a
    +
    İ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.
    + +
    -A
    +
    LoadModule + yönergesini daha sonra etkinleştirmek üzere satırın başına bir diyez + imi (#) yerleştirmesi dışında + -a seçeneği ile aynıdır.
    + +
    -e
    +
    Modülü kurmaya çalışmaksızın Apache'nin httpd.conf + yapılandırma dosyasını -i işlemine + benzer şekilde -a ve + -A seçenekleri ile düzenleme işlemini + belirtir.
    +
    + +
    top
    +
    +

    Örnekler

    +

    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:

    + +

    + $ apxs -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
    + $ _ +

    + +

    Bundan sonra, Apache yapılandırmanızın bu paylaşımlı nesneyi yüklemek + için bir LoadModule yönergesi içermesini + sağlamalısınız. apxs bu adımı + basitleştirmek amacıyla, paylaşımlı nesneyi sunucunun modules + 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:

    + +

    + $ apxs -i -a mod_foo.c
    + 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'da etkinleştiriliyor]
    + $ _ +

    + +

    Yapılandıma dosyasına (eğer yoksa) şu satır eklenir:

    + +

    + LoadModule foo_module modules/mod_foo.so +

    + +

    Bunu öntanımlı olarak iptal etmek isterseniz + -A seçeneğini kullanmanız gerekir:

    + +

    + $ apxs -i -A mod_foo.c +

    + +

    apxs mekanizmalarını hızlıca denemek + için örnek bir Apache modül şablonunu ve bir Makefile dosyasını şöyle + oluşturabilirsiniz:

    + +

    + $ apxs -g -n foo
    + Creating [DIR] foo
    + Creating [FILE] foo/Makefile
    + Creating [FILE] foo/mod_foo.c
    + $ _ +

    + +

    Ardından bu örnek modülü bir paylaşımlı nesne olarak derleyip Apache + sunucusuna yükleyebilirsiniz:

    + +

    + $ cd foo
    + $ make all reload
    + apxs -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
    + apxs -i -a -n "foo" mod_foo.so
    + 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
    + $ _ +

    + +

    apxs C kaynak dosyalarını va nesne + dosyalarını özdevinimli olarak tanıdığından, + apxs'yi PHP3 gibi karmaşık modülleri + Apache kaynak ağacının dışında derlemek için de kullanabilirsiniz:

    + +

    + $ cd php3
    + $ ./configure --with-shared-apache=../apache-1.3
    + $ apxs -c -o libphp3.so mod_php3.c libmodphp3-so.a
    + gcc -fpic -DSHARED_MODULE -I/tmp/apache/include -c mod_php3.c
    + ld -Bshareable -o libphp3.so mod_php3.o libmodphp3-so.a
    + $ _ +

    + +

    Sadece C kaynak dosyaları derlenir ve diğer nesne dosyaları ile + ilintilenir.

    +
    +
    +

    Mevcut Diller:  en  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/configure.html b/rubbos/app/httpd-2.0.64/docs/manual/programs/configure.html new file mode 100644 index 00000000..a8bdca0c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/configure.html @@ -0,0 +1,13 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: configure.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: configure.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: configure.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/configure.html.en b/rubbos/app/httpd-2.0.64/docs/manual/programs/configure.html.en new file mode 100644 index 00000000..55a5c7d3 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/configure.html.en @@ -0,0 +1,916 @@ + + + +configure - Configure the source tree - Apache HTTP Server + + + + + +
    <-
    +

    configure - Configure the source tree

    +
    +

    Available Languages:  en  | + ko  | + tr 

    +
    + +

    The configure script configures the source tree + for compiling and installing the Apache HTTP Server on your + particular platform. Various options allow the compilation of a + server corresponding to your personal requirements.

    + +

    This script, included in the root directory of the source + distribution, is for compilation on Unix and Unix-like systems + only. For other platforms, see the platform documentation.

    +
    + +
    top
    +
    +

    Synopsis

    +

    You should call the configure script from within the + root directory of the distribution.

    + +

    ./configure [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.

    +
    top
    +
    +

    Options

    + + +

    Configuration options

    + +

    The following options influence the behavior of + configure itself.

    + +
    +
    -C
    +
    --config-cache
    +
    This is an alias for --cache-file=config.cache
    + +
    --cache-file=FILE
    +
    The test results will be cached in file FILE. + This option is disabled by default.
    + +
    -h
    +
    --help [short|recursive]
    +
    Output the help and exit. With the argument short only + options specific to this package will displayed. The argument + recursive displays the short help of all the included + packages.
    + +
    -n
    +
    --no-create
    +
    The configure script is run normally but does + not create output files. This is useful to check the test results + before generating makefiles for compilation.
    + +
    -q
    +
    --quiet
    +
    Do not print checking ... messages during the + configure process.
    + +
    --srcdir=DIR
    +
    Defines directory DIR to be the source file directory. + Default is the directory, where configure is located, or the parent + directory ...
    + +
    --silent
    +
    Same as --quiet
    + +
    -V
    +
    --version
    +
    Display copyright information and exit.
    +
    + + +

    Installation + directories

    + +

    These options define the installation directory. The installation + tree depends on the selected layout.

    + +
    +
    --prefix=PREFIX
    +
    Install architecture-independent files in PREFIX. + By default the installation directory is set to + /usr/local/apache2.
    + +
    --exec-prefix=EPREFIX
    +
    Install architecture-dependent files in EPREFIX. + By default the installation directory is set to the + PREFIX directory.
    +
    + +

    By default, make install will install all the files in + /usr/local/apache2/bin, /usr/local/apache2/lib + etc. You can specify an installation prefix other than + /usr/local/apache2 using --prefix, + for instance --prefix=$HOME.

    + +

    Define a directory layout

    +
    +
    --enable-layout=LAYOUT
    +
    Configure the source code and build scripts to assume an + installation tree based on the layout LAYOUT. This allows + you to separately specify the locations for each type of file within + the Apache HTTP Server installation. The config.layout + file contains several example configurations, and you can also create + your own custom configuration following the examples. The different + layouts in this file are grouped into <Layout + FOO>...</Layout> sections and referred to by name as + in FOO. The default layout is Apache.
    +
    + + +

    Fine tuning of the installation + directories

    + +

    For better control of the installation directories, use the options + below. Please note that the directory defaults are set by + autoconf and be overwritten by the corresponding layout + setting.

    + +
    + +
    --bindir=DIR
    +
    Install user executables in DIR. The user executables + are supporting programs like htpasswd, + dbmmanage, etc. which are useful for site + administrators. By default DIR is set to + EPREFIX/bin.
    + +
    --datadir=DIR
    +
    Install read-only architecture-independent data in DIR. + By default datadir is set to + PREFIX/share. This option is offered by + autoconf and currently unused.
    + +
    --includedir=DIR
    +
    Install C header files in DIR. By default + includedir is set to + EPREFIX/include.
    + +
    --infodir=DIR
    +
    Install info documentation in DIR. + By default infodir is set to + PREFIX/info. This option is currently + unused.
    + +
    --libdir=DIR
    +
    Install object code libraries in DIR. By default + libdir is set to + EPREFIX/lib.
    + +
    --libexecdir=DIR
    +
    Install the program executables (i.e., shared modules) in + DIR. By default libexecdir is set to + EPREFIX/libexec.
    + +
    --localstatedir=DIR
    +
    Install modifiable single-machine data in DIR. + By default localstatedir is set to + PREFIX/var. This option is offered by + autoconf and currently unused.
    + +
    --mandir=DIR
    +
    Install the man documentation in DIR. By default + mandir is set to + EPREFIX/man.
    + +
    --oldincludedir=DIR
    +
    Install C header files for non-gcc in DIR. + By default oldincludedir is set to + /usr/include. This option is offered by + autoconf and currently unused.
    + +
    --sbindir=DIR
    +
    Install the system administrator executables in DIR. + Those are server programs like httpd, + apachectl, suexec, etc. which + are neccessary to run the Apache HTTP Server. By default + sbindir is set to + EPREFIX/sbin.
    + +
    --sharedstatedir=DIR
    +
    Install modifiable architecture-independent data in DIR. + By default sharedstatedir is set to + PREFIX/com. This option is offered by + autoconf and currently unused.
    + +
    --sysconfdir=DIR
    +
    Install read-only single-machine data like the server configuration + files httpd.conf, mime.types, etc. in + DIR. By default sysconfdir is set to + PREFIX/conf.
    +
    + + + +

    System types

    + +

    These options are used to cross-compile the Apache HTTP Server to run on + another system. In normal cases, when building and running the server on + the same system, these options are not used.

    + +
    +
    --build=BUILD
    +
    Defines the system type of the system on which the tools are being + built. It defaults to the result of the script + config.guess.
    + +
    --host=HOST
    +
    Defines the system type of the system on which the server will run. + HOST defaults to BUILD.
    + +
    --target=TARGET
    +
    Configure for building compilers for the system type + TARGET. It defaults to HOST. This option is + offered by autoconf and not necessary for the Apache HTTP + Server.
    +
    + + +

    Optional Features

    + +

    These options are used to fine tune the features your HTTP server will + have.

    + +

    General syntax

    +

    Generally you can use the following syntax to enable or disable a + feature:

    + +
    +
    --disable-FEATURE
    +
    Do not include FEATURE. This is the same as + --enable-FEATURE=no.
    + +
    --enable-FEATURE[=ARG]
    +
    Include FEATURE. The default value for ARG + is yes.
    + +
    --enable-MODULE=shared
    +
    The corresponding module will be build as DSO module.
    + +
    --enable-MODULE=static
    +
    By default enabled modules are linked statically. You can force + this explicitly.
    +
    + +

    Note

    + configure will not complain about + --enable-foo even if foo doesn't + exist, so you need to type carefully. +
    + + + +

    Modules enabled by default

    +

    Some modules are compiled by default and have to be disabled + explicitly. Use the following options to remove discrete modules from + the compilation process.

    + +
    +
    --disable-actions
    +
    Disable action triggering on requests, which is provided by + mod_actions.
    + +
    --disable-alias
    +
    Disable the mapping of requests to different parts of the + filesystem, which is provided by mod_alias.
    + +
    --disable-asis
    +
    Disable support for as-is filetypes, which is provided by + mod_asis.
    + +
    --disable-auth
    +
    Disable user-based access control provided by + mod_auth. This module provides for HTTP Basic + Authentication, where the usernames and passwords are stored in + plain text files.
    + +
    --disable-autoindex
    +
    Disable the directory listing functionality provided by + mod_autoindex.
    + +
    --disable-access
    +
    Disable host-based access control provided by + mod_access.
    + +
    --disable-cgi
    +
    mod_cgi, which provides support for CGI scripts, + is enabled by default when using a non-threaded MPM. Use this + option to disable CGI support.
    + +
    --disable-cgid
    +
    When using the threaded MPMs worker or + perchild support for CGI scripts is provided by + mod_cgid by default. To disable CGI support use + this option.
    + +
    --disable-charset-lite
    +
    Disable character set translation provided by + mod_charset_lite. This module will be installed by + default only on EBCDIC systems.
    + +
    --disable-dir
    +
    Disable directory request handling provided by + mod_dir.
    + +
    --disable-env
    +
    Disable setting and clearing of environment variables, which is + provided by mod_env.
    + + +
    --disable-http
    +
    Disable the HTTP protocol handling. The http + module is a basic one, enabling 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-imap
    +
    Disable support for server based imagemaps, which provided by + mod_imap.
    + +
    --disable-include
    +
    Disable Server Side Includes provided by + mod_include.
    + +
    --disable-log-config
    +
    Disable the logging configuration provided by + mod_log_config. You won't be able to log requests + to the server without this module.
    + +
    --disable-mime
    +
    mod_mime associates the requested filename's + extensions with the file's behavior and content (mime-type, + language, character set and encoding). Disabling the mapping of + file-extensions to MIME is normally not recommended.
    + +
    --disable-negotiation
    +
    Disable content negotiation provided by + mod_negotiation.
    + +
    --disable-setenvif
    +
    Disable support for basing environment variables on headers, + which is provided by mod_setenvif.
    + +
    --disable-status
    +
    Disable the process/thread monitoring, which is provided by + mod_status.
    + +
    --disable-userdir
    +
    Disable the mapping of requests to user-specific directories, + which is provided by mod_userdir.
    +
    + + +

    Modules, disabled by default

    +

    Some modules are compiled by default and have to be enabled + explicitly or by using the keywords most or + all (see --enable-mods-shared below for + further explanation) to be available. Therefore use the options + below.

    + +
    +
    --enable-auth-anon
    +
    Enable anonymous user access provided by + mod_auth_anon.
    + +
    --enable-auth-dbm
    +
    mod_auth_dbm provides for HTTP Basic + Authentication, where the usernames and passwords are stored in DBM + type database files. Use this option to enable the module.
    + +
    --enable-auth-digest
    +
    Enable RFC2617 Digest authentication provided by + mod_auth_digest. This module uses plain text files + to store the credentials.
    + +
    --enable-auth-ldap
    +
    Enable LDAP based authentication provided by + mod_auth_ldap.
    + +
    --enable-cache
    +
    Enable dynamic file caching provided by + mod_cache. This experimental module may be + interesting for servers with high load or caching proxy servers. At + least one storage management module (e.g. + mod_disk_cache or mod_mem_cache) + is also necessary.
    + +
    --enable-cern-meta
    +
    Enable the CERN-type meta files support provided by + mod_cern_meta.
    + +
    --enable-charset-lite
    +
    Enable character set translation provided by + mod_charset_lite. This module will be installed by + default only on EBCDIC systems. On other systems, you have to enable + it.
    + +
    --enable-dav
    +
    Enable the WebDAV protocol handling provided by + mod_dav. Support for filesystem resources is + provided by the seperate module mod_dav_fs. This + module is also automatically enabled with + --enable-dav.
    + Note: mod_dav can only be used together with the + http protocol module.
    + +
    --enable-dav-fs
    +
    Enable DAV support for filesystem resources, which is provided by + mod_dav_fs. This module is a provider for the + mod_dav module, so you should also use + --enable-dav.
    + +
    --enable-deflate
    +
    Enable deflate transfer encoding provided by + mod_deflate.
    + +
    --enable-disk-cache
    +
    Enable disk caching provided by + mod_disk_cache.
    + +
    --enable-expires
    +
    Enable Expires header control provided by + mod_expires.
    + +
    --enable-ext-filter
    +
    Enable the external filter support provided by + mod_ext_filter.
    + +
    --enable-file-cache
    +
    Enable the file cache provided by + mod_file_cache.
    + +
    --enable-headers
    +
    Enable control of HTTP headers provided by + mod_headers.
    + +
    --enable-info
    +
    Enable the server information provided by + mod_info.
    + +
    --enable-ldap
    +
    Enable LDAP caching and connection pooling services provided by + mod_ldap.
    + +
    --enable-logio
    +
    Enable logging of input and output bytes including headers provided + by mod_logio.
    + +
    --enable-mem-cache
    +
    Enable memory caching provided by + mod_mem_cache.
    + +
    --enable-mime-magic
    +
    Enable automatical determining of MIME types, which is provided by + mod_mime_magic.
    + +
    --enable-isapi
    +
    Enable the isapi extension support provided by + mod_isapi.
    + +
    --enable-proxy
    +
    Enable the proxy/gateway functionality provided by + mod_proxy. The proxying capabilities for + CONNECT, FTP and HTTP are + provided by the seperate modules mod_proxy_connect, + mod_proxy_ftp and mod_proxy_http. + These three modules are also automatically enabled with + --enable-proxy.
    + +
    --enable-proxy-connect
    +
    Enable proxy support for CONNECT request handling, + which is provided by mod_proxy_connect. This module + is an extension for the mod_proxy module, so you + should also use --enable-proxy.
    + +
    --enable-proxy-ftp
    +
    Enable proxy support for FTP requests, which is + provided by mod_proxy_ftp.. This module + is an extension for the mod_proxy module, so you + should also use --enable-proxy.
    + +
    --enable-proxy-http
    +
    Enable proxy support for HTTP requests, which is + provided by mod_proxy_http. This module + is an extension for the mod_proxy module, so you + should also use --enable-proxy.
    + +
    --enable-rewrite
    +
    Enable rule based URL manipulation provided by + mod_rewrite.
    + +
    --enable-so
    +
    Enable DSO capability provided by mod_so. This + module will be automatically enabled if you use the + --enable-mods-shared option.
    + +
    --enable-speling
    +
    Enable the functionality to correct common URL misspellings, which + is provided by mod_speling.
    + +
    --enable-ssl
    +
    Enable support for SSL/TLS provided by + mod_ssl.
    + +
    --enable-unique-id
    +
    Enable the generation of per-request unique ids, which is provided + by mod_unique_id.
    + +
    --enable-usertrack
    +
    Enable user-session tracking provided by + mod_usertrack.
    + +
    --enable-vhost-alias
    +
    Enable mass virtual hosting provided by + mod_vhost_alias.
    +
    + + +

    Modules for developers

    +

    The following modules are useful only for developers and testing + purposes and are disabled by default. Use the following options to + enable them. If you are not sure whether you need one of these + modules, omit them.

    + +
    + +
    --enable-bucketeer
    +
    Enable the manipulation filter for buckets, which is provided by + mod_bucketeer.
    + + +
    --enable-case-filter
    +
    Enable the example uppercase conversion output filter support of + mod_case_filter.
    + + +
    --enable-case-filter-in
    +
    Enable the example uppercase conversion input filter support of + mod_case_filter_in.
    + +
    --enable-echo
    +
    Enable the ECHO server provided by + mod_echo.
    + +
    --enable-example
    +
    Enable the example and demo module + mod_example.
    + + +
    --enable-optional-fn-export
    +
    Enable the example for an optional function exporter, which is + provided by mod_optional_fn_export.
    + + +
    --enable-optional-fn-import
    +
    Enable the example for an optional function importer, which is + provided by mod_optional_fn_import.
    + + +
    --enable-optional-hook-export
    +
    Enable the example for an optional hook exporter, which is provided + by mod_optional_hook_export.
    + + +
    --enable-optional-hook-import
    +
    Enable the example optional hook importer, which is provided by + mod_optional_hook_import.
    +
    + + +

    MPMs and third-party modules

    +

    To add the necessary Multi Processing Module and additional third-party + modules use the following options:

    + +
    +
    --with-module=module-type:module-file[, + module-type:module-file]
    +

    Add one or more third-party modules to the list of statically linked + modules. The module source file module-file + will be searched in the modules/module-type + subdirectory of your Apache HTTP server source tree. If it is not found + there configure is considering module-file to be + an absolute file path and tries to copy the source file into the + module-type subdirectory. If the subdirectory doesn't + exist it will be created and populated with a standard + Makefile.in.

    +

    This option is useful to add small external modules consisting of + one source file. For more complex modules you should read the + vendor's documentation.

    +

    Note

    + If you want to build a DSO module instead of a statically linked + use apxs.
    +
    + +
    --with-mpm=MPM
    +
    Choose the process model for your server. You have to select + exactly one Multi-Processing Module. + Otherwise the default MPM for + your operating system will be taken. Possible MPMs are + beos, leader, + mpmt_os2, perchild, + prefork, threadpool and + worker.
    +
    + + +

    Cumulative and other options

    +
    +
    --enable-maintainer-mode
    +
    Turn on debugging and compile time warnings.
    + +
    --enable-mods-shared=MODULE-LIST
    +
    +

    Defines a list of modules to be enabled and build as dynamic + shared modules. This mean, these module have to be loaded + dynamically by using the LoadModule directive.

    +

    MODULE-LIST is a space separated list of modulenames + enclosed by quotation marks. The module names are given without the + preceding mod_. For example:

    +

    + --enable-mods-shared='headers rewrite dav' +

    +

    Additionally you can use the special keywords all and + most. For example,

    +

    + --enable-mods-shared=most +

    +

    will compile most modules and build them as DSO modules. +

    +
    + +
    --enable-modules=MODULE-LIST
    +
    This option behaves similar to --enable-mods-shared, + but will link the given modules statically. This mean, these modules + will always be present while running httpd. They need + not be loaded with LoadModule.
    + +
    --enable-v4-mapped
    +
    Allow IPv6 sockets to handle IPv4 connections.
    + +
    --with-port=PORT
    +
    This defines the port on which httpd will listen. + This port number is used when generating the configuration file + httpd.conf. The default is 80.
    + +
    --with-program-name
    +
    Define an alternative executable name. The default is + httpd.
    +
    + + + +

    Optional packages

    +

    These options are used to define optional packages.

    + +

    General syntax

    +

    Generally you can use the following syntax to define an optional + package:

    + +
    +
    --with-PACKAGE[=ARG]
    +
    Use the package PACKAGE. The default value for + ARG is yes.
    + +
    --without-PACKAGE
    +
    Do not use the package PACKAGE. This is the same as + --with-PACKAGE=no. This option is provided by + autoconf but not very useful for the Apache HTTP + Server.
    +
    + + + + +

    Specific packages

    +
    +
    --with-apr=DIR|FILE
    +
    The Apache Portable Runtime (APR) is part of the httpd + source distribution and will automatically be build together with the + HTTP server. If you want to use an already installed APR instead you + have to tell configure the path to the + apr-config script. You may set the absolute path and name + or the directory to the installed APR. apr-config must + exist within this directory or the subdirectory + bin.
    + +
    --with-apr-util=DIR|FILE
    +
    The Apache Portable Runtime Utilities (APU) are part of the + httpd source distribution and will automatically be build + together with the HTTP server. If you want to use an already installed + APU instead you have to tell configure the path to the + apu-config script. You may set the absolute path and name + or the directory to the installed APU. apu-config must + exist within this directory or the subdirectory + bin.
    + +
    --with-ssl=DIR
    +
    If mod_ssl has been enabled configure + searches for an installed OpenSSL. You can set the directory path + to the SSL/TLS toolkit instead.
    + +
    --with-z=DIR
    +
    configure searches automatically for an installed + zlib library if your source configuration requires one + (e.g., when mod_deflate is enabled). You can set the + directory path to the compression library instead.
    +
    + +

    Several features of the Apache HTTP Server, including + mod_authn_dbm and mod_rewrite's DBM + RewriteMap use simple + key/value databases for quick lookups of information. SDBM is included + in the APU, so this database is always available. If you would like to + use other database types, use the following options to enable + them:

    + +
    +
    --with-gdbm[=path]
    +
    If no path is specified, configure will + search for the include files and libraries of a GNU DBM + installation in the usual search paths. An explicit + path will cause configure to look in + path/lib and + path/include for the relevant files. + Finally, the path may specify specific include and + library paths separated by a colon.
    + +
    --with-ndbm[=path]
    +
    Like --with-gdbm, bur searches for a New DBM + installation.
    + +
    --with-berkeley-db[=path]
    +
    Like --with-gdbm, but searches for a Berkeley DB + installation.
    +
    + +

    Note

    +

    The DBM options are provided by the APU and passed through to its + configuration script. They are useless when using an already + installed APU defined by --with-apr-util.

    +

    You may use more then one DBM implementation together with your + HTTP server. The appropriated DBM type will be configured within + the runtime configuration at each time.

    +
    + + + +

    Options for support programs

    +
    +
    --enable-static-support
    +
    Build a statically linked version of the support binaries. This + means, a stand-alone executable will be built with all the necessary + libraries integrated. Otherwise the support binaries are linked + dynamically by default.
    + +
    --enable-suexec
    +
    Use this option to enable suexec, which allows you to set + uid and gid for spawned processes. Do not use this + option unless you understand all the security implications of + running a suid binary on your server. Further options + to configure suexec are described below.
    +
    + +

    It is possible to create a statically linked binary of a single + support program by using the following options:

    + +
    +
    --enable-static-ab
    +
    Build a statically linked version of ab.
    + + +
    --enable-static-checkgid
    +
    Build a statically linked version of checkgid.
    + +
    --enable-static-htdbm
    +
    Build a statically linked version of htdbm.
    + +
    --enable-static-htdigest
    +
    Build a statically linked version of htdigest.
    + +
    --enable-static-htpasswd
    +
    Build a statically linked version of htpasswd.
    + +
    --enable-static-logresolve
    +
    Build a statically linked version of logresolve.
    + +
    --enable-static-rotatelogs
    +
    Build a statically linked version of rotatelogs.
    +
    + +

    suexec configuration options

    + +

    The following options are used to fine tune the behavior of + suexec. See Configuring and installing suEXEC or further information.

    + +
    +
    --with-suexec-bin
    +
    This defines the path to suexec binary. + Default is --sbindir (see Fine tuning of installation + directories).
    + +
    --with-suexec-caller
    +
    This defines the user allowed to call suexec. + It should be the same as the user under which + httpd normally runs.
    + +
    --with-suexec-docroot
    +
    This defines the directory tree under which suexec access is allowed for executables. Default value is + --datadir/htdocs.
    + +
    --with-suexec-gidmin
    +
    Define this as the lowest GID allowed to be a target user for + suexec. The default value is 100.
    + +
    --with-suexec-logfile
    +
    This defines the filename of the suexec logfile. + By default the logfile is named suexec_log and located in + --logfiledir.
    + +
    --with-suexec-safepath
    +
    Define the value of the environment variable PATH to + be set for processes started by suexec. Default + value is /usr/local/bin:/usr/bin:/bin.
    + +
    --with-suexec-userdir
    +
    This defines the subdirectory under the user's directory that + contains all executables for which suexec access + is allowed. This setting is necessary when you want to use + suexec together with user-specific directories (as + provided by mod_userdir). The default is + public_html.
    + +
    --with-suexec-uidmin
    +
    Define this as the lowest UID allowed to be a target user for + suexec. The default value is 100.
    + +
    --with-suexec-umask
    +
    Set umask for processes started by + suexec. It defaults to your system settings.
    +
    + + +
    top
    +
    +

    Environment variables

    +

    There are some useful environment variables to override the choices made by + configure or to help it to find libraries and programs with + nonstandard names or locations.

    + + +
    +
    CC
    +
    Define the C compiler command to be used for compilation.
    + +
    CFLAGS
    +
    Set C compiler flags you want to use for compilation.
    + +
    CPP
    +
    Define the C preprocessor command to be used.
    + +
    CPPFLAGS
    +
    Set C/C++ preprocessor flags, e.g. -Iincludedir + if you have headers in a nonstandard directory includedir.
    + +
    LDFLAGS
    +
    Set linker flags, e.g. -Llibdir if you have + libraries in a nonstandard directory libdir.
    +
    +
    +
    +

    Available Languages:  en  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/configure.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/programs/configure.html.ko.euc-kr new file mode 100644 index 00000000..6d1ed229 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/configure.html.ko.euc-kr @@ -0,0 +1,932 @@ + + + +configure - ¼Ò½º Æ®¸®¸¦ ±¸¼ºÇÑ´Ù - Apache HTTP Server + + + + + +
    <-
    +

    configure - ¼Ò½º Æ®¸®¸¦ ±¸¼ºÇÑ´Ù

    +
    +

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

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

    configure ½ºÅ©¸³Æ®´Â ƯÁ¤ Ç÷¡Æû¿¡¼­ ¾ÆÆÄÄ¡ + À¥¼­¹ö¸¦ ÄÄÆÄÀÏÇÏ°í ¼³Ä¡ÇϱâÀ§ÇØ ¼Ò½º Æ®¸®¸¦ ±¸¼ºÇÑ´Ù. ¿©·¯ + ¿É¼ÇÀ» »ç¿ëÇÏ¿© ¿øÇÏ´Â ¿ä±¸Á¶°Ç¿¡ ¸Â°Ô ¼­¹ö¸¦ ÄÄÆÄÀÏÇÒ ¼ö + ÀÖ´Ù.

    + +

    ¼Ò½º ¹èÆ÷º»ÀÇ ÃÖ»óÀ§ µð·ºÅ丮¿¡ ÀÖ´Â ÀÌ ½ºÅ©¸³Æ®´Â À¯´Ð½º¿Í + À¯´Ð½º·ù ½Ã½ºÅÛ¿¡¼­¸¸ »ç¿ëÇÑ´Ù. ´Ù¸¥ Ç÷¡ÆûÀ» »ç¿ëÇÑ´Ù¸é + Ç÷¡Æû ¹®¼­¸¦ Âü°íÇ϶ó.

    +
    + +
    top
    +
    +

    °³¿ä

    +

    configure ½ºÅ©¸³Æ®´Â ¹èÆ÷º»ÀÇ ÃÖ»óÀ§ + µð·ºÅ丮¿¡¼­ ½ÇÇàÇØ¾ß ÇÑ´Ù.

    + +

    ./configure [OPTION]... + [VAR=VALUE]...

    + +

    ȯ°æº¯¼ö¸¦ (¿¹¸¦ µé¾î, CC, CFLAGS, + ...) ÁöÁ¤ÇÏ·Á¸é, VAR=VALUE¿Í + °°ÀÌ Áö½ÃÇÑ´Ù. ¾Æ·¡¿¡¼­ À¯¿ëÇÑ È¯°æº¯¼öµéÀ» + ¼³¸íÇÑ´Ù.

    +
    top
    +
    +

    ¿É¼Ç

    + + +

    ±¸¼º ¿É¼Ç

    + +

    ÀÌ ¿É¼ÇµéÀº configure ÀÚü Çൿ¿¡ ¿µÇâÀ» + ÁØ´Ù.

    + +
    +
    -C
    +
    --config-cache
    +
    --cache-file=config.cache¿Í °°´Ù.
    + +
    --cache-file=FILE
    +
    °Ë»ç °á°ú¸¦ FILE ÆÄÀÏ¿¡ ij½ÌÇÑ´Ù. + ±âº»°ªÀº °Ë»ç °á°ú¸¦ ±â·ÏÇÏÁö ¾Ê´Â´Ù.
    + +
    -h
    +
    --help [short|recursive]
    +
    µµ¿ò¸»À» Ãâ·ÂÇÏ°í Á¾·áÇÑ´Ù. short ¾Æ±Ô¸ÕÆ®´Â + ÀÌ ÆÐÅ°Áö ƯÀ¯ÀÇ ¿É¼Ç¸¸À» Ãâ·ÂÇÑ´Ù. recursive + ¾Æ±Ô¸ÕÆ®´Â Æ÷ÇÔµÈ ¸ðµç ÆÐÅ°Áö¿¡ ´ëÇÑ ÂªÀº µµ¿ò¸»À» + º¸¿©ÁØ´Ù.
    + +
    -n
    +
    --no-create
    +
    configure ½ºÅ©¸³Æ®¸¦ Á¤»óÀûÀ¸·Î ½ÇÇàÇÏÁö¸¸, + Ãâ·ÂÆÄÀÏÀ» ¸¸µéÁö ¾Ê´Â´Ù. ÀÌ ¿É¼ÇÀº ÄÄÆÄÀÏÀ» À§ÇÑ makefileÀ» + ¸¸µé±â ÀÌÀü¿¡ °Ë»ç °á°ú¸¦ È®ÀÎÇغ¼¶§ À¯¿ëÇÏ´Ù.
    + +
    -q
    +
    --quiet
    +
    ½ÇÇàÁß¿¡ checking ... ¹®±¸¸¦ Ãâ·ÂÇÏÁö + ¾Ê´Â´Ù.
    + +
    --srcdir=DIR
    +
    DIR µð·ºÅ丮¸¦ ¼Ò½ºÆÄÀÏ µð·ºÅ丮·Î ÁöÁ¤ÇÑ´Ù. + ±âº»°ªÀº configure°¡ ÀÖ´Â µð·ºÅ丮 ȤÀº »óÀ§µð·ºÅ丮 + ..ÀÌ´Ù.
    + +
    --silent
    +
    --quiet¿Í °°´Ù.
    + +
    -V
    +
    --version
    +
    ÀúÀÛ±Ç Á¤º¸¸¦ Ãâ·ÂÇÏ°í Á¾·áÇÑ´Ù.
    +
    + + +

    ¼³Ä¡ µð·ºÅ丮

    + +

    ÀÌ ¿É¼ÇµéÀº ¼³Ä¡ µð·ºÅ丮¸¦ ÁöÁ¤ÇÑ´Ù. ¼³Ä¡ À§Ä¡´Â + ¼±ÅÃÇÑ ±¸Á¶(layout)¿¡ µû¶ó ´Ù¸£´Ù.

    + +
    +
    --prefix=PREFIX
    +
    ¾ÆÅ°ÅØÃÄ¿¡ µ¶¸³ÀûÀÎ ÆÄÀÏÀ» PREFIX¿¡ ¼³Ä¡ÇÑ´Ù. + ±âº»°ªÀº /usr/local/apache2ÀÌ´Ù.
    + +
    --exec-prefix=EPREFIX
    +
    ¾ÆÅ°ÅØÃÄ¿¡ ÀÇÁ¸ÀûÀÎ ÆÄÀÏÀ» EPREFIX¿¡ ¼³Ä¡ÇÑ´Ù. + ±âº»°ªÀº PREFIX µð·ºÅ丮ÀÌ´Ù.
    +
    + +

    ±âº»ÀûÀ¸·Î make installÀº + /usr/local/apache2/bin, + /usr/local/apache2/lib¿Í °°Àº À§Ä¡¿¡ ¸ðµç + ÆÄÀÏÀ» ¼³Ä¡ÇÑ´Ù. --prefix=$HOME°ú °°ÀÌ + --prefix ¿É¼ÇÀ» »ç¿ëÇÏ¿© + /usr/local/apache2 ÀÌ¿ÜÀÇ ¼³Ä¡ »óÀ§µð·ºÅ丮¸¦ + ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù.

    + +

    µð·ºÅ丮 ±¸Á¶ ÁöÁ¤

    +
    +
    --enable-layout=LAYOUT
    +
    ¼³Ä¡ À§Ä¡¸¦ LAYOUT ±¸Á¶¿¡ µû¸£µµ·Ï + ¼Ò½ºÄÚµå¿Í ÄÄÆÄÀÏ ½ºÅ©¸³Æ®¸¦ ±¸¼ºÇÑ´Ù. ±¸Á¶¸¦ »ç¿ëÇϸé + ÆÄÀÏ Á¾·ù¿¡ µû¶ó ¼³Ä¡ À§Ä¡¸¦ µû·Î ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. + config.layout ÆÄÀÏ¿¡ ¿©·¯ ¼³Á¤ ¿¹°¡ ÀÖ°í, + À̸¦ Âü°íÇÏ¿© Á÷Á¢ ¼³Á¤À» ¸¸µé ¼öµµ ÀÖ´Ù. ÆÄÀÏ¿¡¼­ + °¢ ±¸Á¶´Â <Layout + FOO>...</Layout>·Î ±¸ºÐµÇ¸ç, ÀÌ + ºÎºÐÀº FOO¶ó´Â À̸§ÀÇ ±¸Á¶¸¦ ³ªÅ¸³½´Ù. + ±¸Á¶ÀÇ ±âº»°ªÀº ApacheÀÌ´Ù.
    +
    + + +

    ¼³Ä¡ µð·ºÅ丮ÀÇ + ÀÚ¼¼ÇÑ Á¶Á¤

    + +

    ¼³Ä¡ µð·ºÅ丮¸¦ ´õ ¼öÁ¤ÇÑ´Ù¸é ¾Æ·¡ ¿É¼ÇÀ» »ç¿ëÇÑ´Ù. + °¢ µð·ºÅ丮ÀÇ ±âº»°ªÀº autoconf°¡ ÁöÁ¤Çϸç, + ¼±ÅÃÇÑ ±¸Á¶¿¡ µû¶ó ´Ù¸§À» ÁÖÀÇÇ϶ó.

    + +
    + +
    --bindir=DIR
    +
    »ç¿ëÀÚ ½ÇÇàÆÄÀÏÀ» DIR¿¡ ¼³Ä¡ÇÑ´Ù. »ç¿ëÀÚ + ½ÇÇàÆÄÀÏ¿¡´Â »çÀÌÆ® °ü¸®ÀÚ¿¡°Ô À¯¿ëÇÑ + htpasswd¿Í dbmmanage °°Àº + Áö¿ø ÇÁ·Î±×·¥µµ Æ÷ÇԵȴÙ. DIRÀÇ ±âº»°ªÀº + EPREFIX/binÀÌ´Ù.
    + +
    --datadir=DIR
    +
    ¾ÆÅ°ÅØÃÄ µ¶¸³ÀûÀÎ ÀбâÀü¿ë ÀڷḦ DIR¿¡ + ¼³Ä¡ÇÑ´Ù. datadirÀÇ ±âº»°ªÀº + PREFIX/shareÀÌ´Ù. + autoconf¿¡ ÀÌ ¿É¼ÇÀÌ ÀÖÁö¸¸ ÇöÀç »ç¿ëÇÏÁö + ¾Ê´Â´Ù.
    + +
    --includedir=DIR
    +
    C Çì´õÆÄÀÏÀ» DIR¿¡ ¼³Ä¡ÇÑ´Ù. + includedirÀÇ ±âº»°ªÀº + EPREFIX/includeÀÌ´Ù.
    + +
    --infodir=DIR
    +
    info ¹®¼­¸¦ DIR¿¡ ¼³Ä¡ÇÑ´Ù. + infodirÀÇ ±âº»°ªÀº + PREFIX/infoÀÌ´Ù. ÇöÀç ÀÌ ¿É¼ÇÀº + »ç¿ëÇÏÁö ¾Ê´Â´Ù.
    + +
    --libdir=DIR
    +
    ¿ÀºêÁ§Æ®ÄÚµå ¶óÀ̺귯¸®¸¦ DIR¿¡ ¼³Ä¡ÇÑ´Ù. + libdirÀÇ ±âº»°ªÀº + EPREFIX/libÀÌ´Ù.
    + +
    --libexecdir=DIR
    +
    ÇÁ·Î±×·¥ ½ÇÇàÆÄÀÏÀ» (Áï, °øÀ¯¸ðµâ) DIR¿¡ + ¼³Ä¡ÇÑ´Ù. libexecdirÀÇ ±âº»°ªÀº + EPREFIX/libexecÀÌ´Ù.
    + +
    --localstatedir=DIR
    +
    º¯°æµÇ´Â ¸Ó½®º° Á¤º¸¸¦ DIR¿¡ ¼³Ä¡ÇÑ´Ù. + localstatedirÀÇ ±âº»°ªÀº + PREFIX/varÀÌ´Ù. + autoconf¿¡ ÀÌ ¿É¼ÇÀÌ ÀÖÁö¸¸ ÇöÀç »ç¿ëÇÏÁö + ¾Ê´Â´Ù.
    + +
    --mandir=DIR
    +
    man ¹®¼­¸¦ DIR¿¡ ¼³Ä¡ÇÑ´Ù. + mandirÀÇ ±âº»°ªÀº + EPREFIX/manÀÌ´Ù.
    + +
    --oldincludedir=DIR
    +
    gcc°¡ ¾Æ´Ñ ÄÄÆÄÀÏ·¯¸¦ À§ÇÑ C Çì´õÆÄÀÏÀ» DIR¿¡ + ¼³Ä¡ÇÑ´Ù. oldincludedirÀÇ ±âº»°ªÀº + /usr/includeÀÌ´Ù. autoconf¿¡ + ÀÌ ¿É¼ÇÀÌ ÀÖÁö¸¸ ÇöÀç »ç¿ëÇÏÁö ¾Ê´Â´Ù.
    + +
    --sbindir=DIR
    +
    ½Ã½ºÅÛ °ü¸®ÀÚ¿ë ½ÇÇàÆÄÀÏÀ» DIR¿¡ ¼³Ä¡ÇÑ´Ù. + ½Ã½ºÅÛ °ü¸®ÀÚ¿ë ½ÇÇàÆÄÀÏÀ̶õ ¾ÆÆÄÄ¡ À¥¼­¹ö¸¦ ½ÇÇàÇϴµ¥ + ÇÊ¿äÇÑ httpd, apachectl, + suexec µî ¼­¹ö ÇÁ·Î±×·¥À» ¸»ÇÑ´Ù. + sbindirÀÇ ±âº»°ªÀº + EPREFIX/sbinÀÌ´Ù.
    + +
    --sharedstatedir=DIR
    +
    º¯°æµÇ´Â ¾ÆÅ°ÅØÃÄ µ¶¸³ÀûÀÎ ÀڷḦ DIR¿¡ + ¼³Ä¡ÇÑ´Ù. sharedstatedirÀÇ ±âº»°ªÀº + PREFIX/comÀÌ´Ù. + autoconf¿¡ ÀÌ ¿É¼ÇÀÌ ÀÖÁö¸¸ ÇöÀç »ç¿ëÇÏÁö + ¾Ê´Â´Ù.
    + +
    --sysconfdir=DIR
    +
    ¼­¹ö ¼³Á¤ÆÄÀÏ httpd.conf, + mime.types¿Í °°Àº ÀбâÀü¿ë ¸Ó½®º° ÀڷḦ + DIR¿¡ ¼³Ä¡ÇÑ´Ù. sysconfdirÀÇ + ±âº»°ªÀº PREFIX/etcÀÌ´Ù.
    +
    + + + +

    ½Ã½ºÅÛ Á¾·ù

    + +

    ´Ù¸¥ ½Ã½ºÅÛ¿¡¼­ ½ÇÇàÇÒ ¾ÆÆÄÄ¡ À¥¼­¹ö¸¦ + ±³Â÷ÄÄÆÄÀÏÇϱâ(cross-compile)Çϱâ À§ÇÑ ¿É¼ÇµéÀÌ´Ù. ¼­¹ö¸¦ + ÄÄÆÄÀÏÇÑ ½Ã½ºÅÛ¿¡¼­ ¼­¹ö¸¦ ½ÇÇàÇÏ´Â ÀϹÝÀûÀÎ °æ¿ì, ÀÌ + ¿É¼ÇÀ» »ç¿ëÇÏÁö ¾Ê´Â´Ù.

    + +
    +
    --build=BUILD
    +
    µµ±¸¸¦ ÄÄÆÄÀÏÇÏ´Â ½Ã½ºÅÛÀÇ Á¾·ù¸¦ ÁöÁ¤ÇÑ´Ù. ±âº»°ªÀº + config.guess ½ºÅ©¸³Æ®ÀÇ °á°úÀÌ´Ù.
    + +
    --host=HOST
    +
    ¼­¹ö¸¦ ½ÇÇàÇÒ ½Ã½ºÅÛÀÇ Á¾·ù¸¦ ÁöÁ¤ÇÑ´Ù. HOSTÀÇ + ±âº»°ªÀº BUILDÀÌ´Ù.
    + +
    --target=TARGET
    +
    TARGET ½Ã½ºÅÛ Á¾·ù¸¦ À§ÇÑ ÄÄÆÄÀÏ·¯¸¦ ¸¸µé¶§ + »ç¿ëÇÑ´Ù. ±âº»°ªÀº HOSTÀÌ´Ù. + autoconf¿¡ ÀÌ ¿É¼ÇÀÌ ÀÖÁö¸¸ ¾ÆÆÄÄ¡ À¥¼­¹ö¿Í´Â + °ü·ÃÀÌ ¾ø´Ù.
    +
    + + +

    ±â´É ¼±ÅÃ

    + +

    ÀÌ ¿É¼ÇÀº À¥¼­¹öÀÇ ¼¼ºÎ ±â´ÉÀ» Á¶ÀýÇÑ´Ù.

    + +

    ÀϹÝÀûÀÎ ¹®¹ý

    +

    ÀϹÝÀûÀ¸·Î ´ÙÀ½ ¹®¹ýÀ» »ç¿ëÇÏ¿© ±â´ÉÀ» Æ÷ÇÔÇÏ°í »«´Ù:

    + +
    +
    --disable-FEATURE
    +
    FEATURE ±â´ÉÀ» »«´Ù. + --enable-FEATURE=no¿Í °°´Ù.
    + +
    --enable-FEATURE[=ARG]
    +
    FEATURE ±â´ÉÀ» Æ÷ÇÔÇÑ´Ù. ARGÀÇ + ±âº»°ªÀº yesÀÌ´Ù.
    + +
    --enable-MODULE=shared
    +
    ÇØ´ç ¸ðµâÀ» DSO ¸ðµâ·Î ÄÄÆÄÀÏÇÑ´Ù.
    + +
    --enable-MODULE=static
    +
    Æ÷ÇÔÇÏ´Â ¸ðµâÀº ±âº»ÀûÀ¸·Î Á¤ÀûÀ¸·Î ¸µÅ©µÈ´Ù. ÀÌ + ¿É¼ÇÀº ¸í½ÃÀûÀ¸·Î Á¤Àû ¸µÅ©¸¦ °­Á¦ÇÑ´Ù.
    +
    + +

    ÁÖÀÇ

    + configure´Â foo°¡ ¾ø´Â °æ¿ì + --enable-foo¸¦ »ç¿ëÇصµ ÀÌ »ç½ÇÀ» + ¾Ë·ÁÁÖÁö ¾ÊÀ¸¹Ç·Î ÁÖÀÇÇؼ­ ÀÔ·ÂÇØ¾ß ÇÑ´Ù. +
    + + + +

    ±âº»ÀûÀ¸·Î Æ÷ÇÔÇÏ´Â ¸ðµâ

    +

    ¾î¶² ¸ðµâÀº ±âº»ÀûÀ¸·Î ÄÄÆÄÀϵDZ⶧¹®¿¡ »ç¿ëÇÏÁö ¾Ê´Â´Ù¸é + ¸í½ÃÀûÀ¸·Î »©Áà¾ß ÇÑ´Ù. ´ÙÀ½ ¿É¼ÇÀº ƯÁ¤ ¸ðµâÀ» ÄÄÆÄÀÏ + °úÁ¤¿¡¼­ Á¦¿ÜÇÑ´Ù.

    + +
    +
    --disable-actions
    +
    mod_actions°¡ Á¦°øÇÏ´Â ¿äû¿¡ ´ëÇÑ + Çൿ ±â´ÉÀ» »ç¿ëÇÏÁö ¾Ê´Â´Ù.
    + +
    --disable-alias
    +
    mod_alias°¡ Á¦°øÇÏ´Â ¿äûÀ» + ÆÄÀϽýºÅÛÀÇ ´Ù¸¥ ºÎºÐÀ¸·Î ´ëÀÀÇÏ´Â ±â´ÉÀ» »ç¿ëÇÏÁö + ¾Ê´Â´Ù.
    + +
    --disable-asis
    +
    mod_asis°¡ Á¦°øÇÏ´Â as-is ÆÄÀÏÇüÀ» + Áö¿øÇÏÁö ¾Ê´Â´Ù.
    + +
    --disable-auth
    +
    mod_auth°¡ Á¦°øÇÏ´Â »ç¿ëÀÚº° Á¢±ÙÁ¦¾î + ±â´ÉÀ» »ç¿ëÇÏÁö ¾Ê´Â´Ù. ÀÌ ¸ðµâÀº »ç¿ëÀÚ¸í°ú ¾ÏÈ£¸¦ + ÀÏ¹Ý ¹®ÀÚÆÄÀÏ¿¡ ÀúÀåÇÏ´Â HTTP Basic Authentication¿¡¼­ + »ç¿ëÇÑ´Ù.
    + +
    --disable-autoindex
    +
    mod_autoindex°¡ Á¦°øÇÏ´Â µð·ºÅ丮 + ¸ñ·Ï ±â´ÉÀ» »ç¿ëÇÏÁö ¾Ê´Â´Ù.
    + +
    --disable-access
    +
    mod_access°¡ Á¦°øÇϴ ȣ½ºÆ®º° + Á¢±ÙÁ¦¾î ±â´ÉÀ» »ç¿ëÇÏÁö ¾Ê´Â´Ù.
    + +
    --disable-cgi
    +
    ºñ¾²·¹µå MPMÀ» »ç¿ëÇÏ´Â °æ¿ì CGI ½ºÅ©¸³Æ®¸¦ Áö¿øÇÏ´Â + mod_cgi¸¦ ±âº»ÀûÀ¸·Î Æ÷ÇÔÇÑ´Ù. ÀÌ + ¿É¼ÇÀ» »ç¿ëÇϸé CGI¸¦ Áö¿øÇÏÁö ¾Ê´Â´Ù.
    + +
    --disable-cgid
    +
    ¾²·¹µå MPMÀÎ worker³ª + perchild¸¦ »ç¿ëÇÏ´Â °æ¿ì ±âº»ÀûÀ¸·Î + mod_cgid°¡ CGI ½ºÅ©¸³Æ®¸¦ Áö¿øÇÑ´Ù. + ÀÌ ¿É¼ÇÀ» »ç¿ëÇϸé CGI¸¦ Áö¿øÇÏÁö ¾Ê´Â´Ù.
    + +
    --disable-charset-lite
    +
    mod_charset_lite°¡ Á¦°øÇÏ´Â ¹®ÀÚÁýÇÕ + º¯È¯ ±â´ÉÀ» »ç¿ëÇÏÁö ¾Ê´Â´Ù. ÀÌ ¸ðµâÀº EBCDIC ½Ã½ºÅÛ¿¡¼­¸¸ + ±âº»ÀûÀ¸·Î Æ÷ÇÔÇÑ´Ù.
    + +
    --disable-dir
    +
    mod_dirÀÌ Á¦°øÇÏ´Â µð·ºÅ丮 ¿äû + ó¸® ±â´ÉÀ» »ç¿ëÇÏÁö ¾Ê´Â´Ù.
    + +
    --disable-env
    +
    mod_env°¡ Á¦°øÇϴ ȯ°æº¯¼ö ¼³Á¤/ÇØÁ¦ + ±â´ÉÀ» »ç¿ëÇÏÁö ¾Ê´Â´Ù.
    + + +
    --disable-http
    +
    HTTP ÇÁ·ÎÅäÄÝÀ» ó¸®ÇÏÁö ¾Ê´Â´Ù. http + ¸ðµâÀº ¼­¹ö°¡ À¥¼­¹ö·Î µ¿ÀÛÇϴµ¥ ±âº»ÀûÀÎ ¸ðµâÀÌ´Ù. + ´ë½Å ´Ù¸¥ ÇÁ·ÎÅäÄÝ ¸ðµâÀ» »ç¿ëÇÒ °æ¿ì¿¡¸¸ ÀÌ ¸ðµâÀÌ + À¯¿ëÇÏ´Ù. ÀÚ½ÅÀÌ ¹«¾ùÀ» ÇÏ´ÂÁö È®½ÇÈ÷ ¾ËÁö + ¸øÇÑ´Ù¸é ÀÌ ¿É¼ÇÀ» »©Áö ¸¶¶ó +
    + ÁÖÀÇ: ÀÌ ¸ðµâÀº Ç×»ó Á¤ÀûÀ¸·Î ¸µÅ©µÈ´Ù.
    + +
    --disable-imap
    +
    mod_imapÀÌ Á¦°øÇÏ´Â ¼­¹ö±â¹Ý imagemap + ±â´ÉÀ» »ç¿ëÇÏÁö ¾Ê´Â´Ù.
    + +
    --disable-include
    +
    mod_include°¡ Á¦°øÇÏ´Â Server Side + Includes ±â´ÉÀ» »ç¿ëÇÏÁö ¾Ê´Â´Ù.
    + +
    --disable-log-config
    +
    mod_log_config°¡ Á¦°øÇÏ´Â ·Î±× + ¼³Á¤À» »ç¿ëÇÏÁö ¾Ê´Â´Ù. ÀÌ ¸ðµâÀÌ ¾øÀ¸¸é ¼­¹öÀÇ ¿äûÀ» + ·Î±×¿¡ ±â·ÏÇÒ ¼ö ¾ø´Ù.
    + +
    --disable-mime
    +
    mod_mimeÀº ¿äûÇÑ ÆÄÀϸíÀÇ È®ÀåÀÚ¿¡ + µû¶ó ÆÄÀÏÀÇ Çൿ°ú ³»¿ë(mime-type, ¾ð¾î, ¹®ÀÚÁýÇÕ, + ÀÎÄÚµù)À» °áÁ¤ÇÑ´Ù. (ÀÌ ¸ðµâÀ» Á¦°ÅÇÏ¿©) ÆÄÀÏ È®ÀåÀÚ¸¦ + MIME°ú ¿¬°üÇÏÁö ¾Ê´Â °ÍÀ» ÀϹÝÀûÀ¸·Î ÃßõÇÏÁö ¾Ê´Â´Ù.
    + +
    --disable-negotiation
    +
    mod_negotiationÀÌ Á¦°øÇÏ´Â ³»¿ëÇù»ó + ±â´ÉÀ» »ç¿ëÇÏÁö ¾Ê´Â´Ù.
    + +
    --disable-setenvif
    +
    mod_setenvif°¡ Á¦°øÇÏ´Â Çì´õ¿¡ + µû¶ó ȯ°æº¯¼ö¸¦ ¼³Á¤ÇÏ´Â ±â´ÉÀ» »ç¿ëÇÏÁö ¾Ê´Â´Ù.
    + +
    --disable-status
    +
    mod_status°¡ Á¦°øÇÏ´Â ÇÁ·Î¼¼½º/¾²·¹µå + °¨½Ã ±â´ÉÀ» »ç¿ëÇÏÁö ¾Ê´Â´Ù.
    + +
    --disable-userdir
    +
    mod_userdirÀÌ Á¦°øÇÏ´Â ¿äûÀ» »ç¿ëÀÚº° + µð·ºÅ丮¿¡ ´ëÀÀÇÏ´Â ±â´ÉÀ» »ç¿ëÇÏÁö ¾Ê´Â´Ù.
    +
    + + +

    ±âº»ÀûÀ¸·Î Æ÷ÇÔÇÏÁö ¾Ê´Â ¸ðµâ

    +

    ±âº»ÀûÀ¸·Î ÄÄÆÄÀϵǴ ¸ðµâµµ ÀÖÁö¸¸, ¸ðµâÀ» »ç¿ëÇÏ·Á¸é + Á÷Á¢ ȤÀº most³ª all Å°¿öµå¸¦ + »ç¿ëÇÏ¿© ¸í½ÃÀûÀ¸·Î Æ÷ÇÔÇØ¾ß ÇÏ´Â ¸ðµâÀÌ ÀÖ´Ù. ±×·¡¼­ + ¾Æ·¡ ¿É¼ÇµéÀ» »ç¿ëÇÑ´Ù.

    + +
    +
    --enable-auth-anon
    +
    mod_auth_anonÀÌ Á¦°øÇÏ´Â À͸í»ç¿ëÀÚ + Á¢±Ù ±â´ÉÀ» »ç¿ëÇÑ´Ù.
    + +
    --enable-auth-dbm
    +
    mod_auth_dbmÀº »ç¿ëÀÚ¸í°ú ¾ÏÈ£¸¦ + DBMÇü½ÄÀÇ µ¥ÀÌÅͺ£À̽º ÆÄÀÏ¿¡ ÀúÀåÇÏ´Â HTTP Basic + Authentication¿¡¼­ »ç¿ëÇÑ´Ù. ¸ðµâÀ» »ç¿ëÇÏ·Á¸é ÀÌ + ¿É¼ÇÀ» »ç¿ëÇÑ´Ù.
    + +
    --enable-auth-digest
    +
    mod_auth_digest°¡ Á¦°øÇÏ´Â RFC2617 + Digest authenticationÀ» »ç¿ëÇÑ´Ù. ÀÌ ¸ðµâÀº Á¤º¸¸¦ + ÀÏ¹Ý ¹®ÀÚÆÄÀÏ¿¡ ÀúÀåÇÑ´Ù.
    + +
    --enable-auth-ldap
    +
    mod_auth_ldapÀÌ Á¦°øÇÏ´Â LDAP±â¹Ý + ÀÎÁõ ±â´ÉÀ» »ç¿ëÇÑ´Ù.
    + +
    --enable-cache
    +
    mod_cache°¡ Á¦°øÇÏ´Â µ¿ÀûÀ¸·Î »ý¼ºÇÏ´Â + ÆÄÀÏÀÇ Ä³½Ì ±â´ÉÀ» »ç¿ëÇÑ´Ù. ¸Å¿ì ºÎÇÏ°¡ ¸¹°Å³ª ÇÁ·Ï½Ã + ¼­¹ö¸¦ ij½ÌÇÏ´Â ¼­¹ö¿¡°Ô ÀÌ ½ÇÇèÀûÀÎ ¸ðµâÀÌ À¯¿ëÇÒ + ¼ö ÀÖ´Ù. ÃÖ¼ÒÇÑ ÇÑ°¡Áö ÀúÀå°ü¸®¸ðµâ(storage management + module)À» (¿¹¸¦ µé¾î, mod_disk_cache³ª + mod_mem_cache) °°ÀÌ »ç¿ëÇØ¾ß ÇÑ´Ù.
    + +
    --enable-cern-meta
    +
    mod_cern_meta°¡ Á¦°øÇÏ´Â CERN ¸ÞŸÆÄÀÏ + Áö¿ø ±â´ÉÀ» »ç¿ëÇÑ´Ù.
    + +
    --enable-charset-lite
    +
    mod_charset_lite°¡ Á¦°øÇÏ´Â ¹®ÀÚÁýÇÕ + º¯È¯ ±â´ÉÀ» »ç¿ëÇÑ´Ù. ÀÌ ¸ðµâÀº EBCDIC ½Ã½ºÅÛ¿¡¼­¸¸ + ±âº»ÀûÀ¸·Î Æ÷ÇԵȴÙ. ´Ù¸¥ ½Ã½ºÅÛ¿¡¼­´Â Á÷Á¢ Æ÷ÇÔ½ÃÄÑÁà¾ß + ÇÑ´Ù.
    + +
    --enable-dav
    +
    mod_dav°¡ Á¦°øÇÏ´Â WebDAV ÇÁ·ÎÅäÄÝ + ó¸® ±â´ÉÀ» »ç¿ëÇÑ´Ù. µ¶¸³µÈ mod_dav_fs + ¸ðµâÀÌ ÆÄÀϽýºÅÛ ÀÚ¿øÀ» Áö¿øÇÑ´Ù. ÀÌ ¸ðµâÀº + --enable-dav¸¦ »ç¿ëÇϸé ÀÚµ¿À¸·Î Æ÷ÇÔÇÑ´Ù.
    + ÁÖÀÇ: mod_dav´Â http + ÇÁ·ÎÅäÄÝ ¸ðµâ°ú °°ÀÌ »ç¿ëÇØ¾ß ÇÑ´Ù.
    + +
    --enable-dav-fs
    +
    mod_dav_fs°¡ Á¦°øÇÏ´Â DAVÀÇ ÆÄÀϽýºÅÛ + ÀÚ¿ø Áö¿ø ±â´ÉÀ» »ç¿ëÇÑ´Ù. ÀÌ ¸ðµâÀº + mod_dav ¸ðµâÀ» À§ÇÑ Á¦°øÀÚÀ̱⠶§¹®¿¡ + --enable-davµµ »ç¿ëÇØ¾ß ÇÑ´Ù.
    + +
    --enable-deflate
    +
    mod_deflate°¡ Á¦°øÇÏ´Â ¾ÐÃàÀü¼Û + ÀÎÄÚµù ±â´ÉÀ» »ç¿ëÇÑ´Ù.
    + +
    --enable-disk-cache
    +
    mod_disk_cache°¡ Á¦°øÇÏ´Â µð½ºÅ© + ij½Ì ±â´ÉÀ» »ç¿ëÇÑ´Ù.
    + +
    --enable-expires
    +
    mod_expires°¡ Á¦°øÇÏ´Â Expires + Çì´õ Á¶Àý ±â´ÉÀ» »ç¿ëÇÑ´Ù.
    + +
    --enable-ext-filter
    +
    mod_ext_filter°¡ Á¦°øÇÏ´Â ¿ÜºÎ + ÇÊÅÍ Áö¿ø ±â´ÉÀ» »ç¿ëÇÑ´Ù.
    + +
    --enable-file-cache
    +
    mod_file_cache°¡ Á¦°øÇÏ´Â ÆÄÀÏ + ij½Ì ±â´ÉÀ» »ç¿ëÇÑ´Ù.
    + +
    --enable-headers
    +
    mod_headers°¡ Á¦°øÇÏ´Â HTTP Çì´õ + Á¶Àý ±â´ÉÀ» »ç¿ëÇÑ´Ù.
    + +
    --enable-info
    +
    mod_info°¡ Á¦°øÇÏ´Â ¼­¹öÁ¤º¸ ±â´ÉÀ» + »ç¿ëÇÑ´Ù.
    + +
    --enable-ldap
    +
    mod_ldapÀÌ Á¦°øÇÏ´Â LDAP ij½Ì°ú + ¿¬°áÇ® ±â´ÉÀ» »ç¿ëÇÑ´Ù.
    + +
    --enable-logio
    +
    mod_logio°¡ Á¦°øÇÏ´Â ·Î±×¿¡ Çì´õ¿Í + ÀÔÃâ·Â ¹ÙÀÌÆ®¼ö¸¦ ±â·ÏÇÏ´Â ±â´ÉÀ» »ç¿ëÇÑ´Ù.
    + +
    --enable-mem-cache
    +
    mod_mem_cache°¡ Á¦°øÇÏ´Â ¸Þ¸ð¸® + ij½Ì ±â´ÉÀ» »ç¿ëÇÑ´Ù.
    + +
    --enable-mime-magic
    +
    mod_mime_magicÀÌ Á¦°øÇÏ´Â MIME + type ÀÚµ¿ ÀÎ½Ä ±â´ÉÀ» »ç¿ëÇÑ´Ù.
    + +
    --enable-isapi
    +
    mod_isapi°¡ Á¦°øÇÏ´Â isapi È®ÀåÀ» + Áö¿øÇÑ´Ù.
    + +
    --enable-proxy
    +
    mod_proxy°¡ Á¦°øÇÏ´Â ÇÁ·Ï½Ã/°ÔÀÌÆ®¿þÀÌ + ±â´ÉÀ» »ç¿ëÇÑ´Ù. CONNECT, FTP, + HTTP¿¡ ´ëÇÑ ÇÁ·Ï½Ã ±â´ÉÀ» °¢°¢ + mod_proxy_connect, + mod_proxy_ftp, + mod_proxy_http + ¸ðµâÀÌ Á¦°øÇÑ´Ù. --enable-proxy¸¦ »ç¿ëÇϸé + ÀÌ ¼¼ ¸ðµâÀ» ÀÚµ¿À¸·Î Æ÷ÇÔÇÑ´Ù.
    + +
    --enable-proxy-connect
    +
    mod_proxy_connect°¡ Á¦°øÇÏ´Â + CONNECT ¿äû¿¡ ´ëÇÑ ÇÁ·Ï½Ã Áö¿ø ±â´ÉÀ» + »ç¿ëÇÑ´Ù. ÀÌ ¸ðµâÀº mod_proxy ¸ðµâÀÇ + È®ÀåÀ̹ǷÎ, --enable-proxyµµ °°ÀÌ »ç¿ëÇØ¾ß + ÇÑ´Ù.
    + +
    --enable-proxy-ftp
    +
    mod_proxy_ftp°¡ Á¦°øÇÏ´Â + FTP ¿äû¿¡ ´ëÇÑ ÇÁ·Ï½Ã Áö¿ø ±â´ÉÀ» »ç¿ëÇÑ´Ù. + ÀÌ ¸ðµâÀº mod_proxy ¸ðµâÀÇ È®ÀåÀ̹ǷÎ, + --enable-proxyµµ °°ÀÌ »ç¿ëÇØ¾ß ÇÑ´Ù.
    + +
    --enable-proxy-http
    +
    mod_proxy_http°¡ Á¦°øÇÏ´Â + HTTP ¿äû¿¡ ´ëÇÑ ÇÁ·Ï½Ã Áö¿ø ±â´ÉÀ» »ç¿ëÇÑ´Ù. + ÀÌ ¸ðµâÀº mod_proxy ¸ðµâÀÇ È®ÀåÀ̹ǷÎ, + --enable-proxyµµ °°ÀÌ »ç¿ëÇØ¾ß ÇÑ´Ù.
    + +
    --enable-rewrite
    +
    mod_rewrite°¡ Á¦°øÇÏ´Â ±ÔÄ¢±â¹Ý + URL Á¶ÀÛ ±â´ÉÀ» »ç¿ëÇÑ´Ù.
    + +
    --enable-so
    +
    mod_so°¡ Á¦°øÇÏ´Â DSO ±â´ÉÀ» »ç¿ëÇÑ´Ù. + --enable-mods-shared ¿É¼ÇÀ» »ç¿ëÇϸé + ÀÚµ¿À¸·Î ÀÌ ¸ðµâÀ» Æ÷ÇÔÇÑ´Ù.
    + +
    --enable-speling
    +
    mod_spellingÀÌ Á¦°øÇÏ´Â URL¿¡¼­ + ÀϹÝÀûÀÎ ¸ÂÃã¹ý ½Ç¼ö¸¦ °íÄ¡´Â ±â´ÉÀ» »ç¿ëÇÑ´Ù.
    + +
    --enable-ssl
    +
    mod_sslÀÌ Á¦°øÇÏ´Â SSL/TLS ±â´ÉÀ» + »ç¿ëÇÑ´Ù.
    + +
    --enable-unique-id
    +
    mod_unique_id°¡ Á¦°øÇÏ´Â ¿äû¸¶´Ù + À¯ÀÏÇÑ ½Äº°ÀÚ¸¦ ¸¸µå´Â ±â´ÉÀ» »ç¿ëÇÑ´Ù.
    + +
    --enable-usertrack
    +
    mod_usertrackÀÌ Á¦°øÇÏ´Â »ç¿ëÀÚ¼¼¼Ç + ÃßÀû ±â´ÉÀ» »ç¿ëÇÑ´Ù.
    + +
    --enable-vhost-alias
    +
    mod_vhost_alias°¡ Á¦°øÇÏ´Â ´ë·® + °¡»óÈ£½ºÆ® ±â´ÉÀ» »ç¿ëÇÑ´Ù.
    +
    + + +

    °³¹ßÀÚ¸¦ À§ÇÑ ¸ðµâ

    +

    ´ÙÀ½ ¸ðµâÀº Å×½ºÆ®¿ëÀ¸·Î °³¹ßÀÚ¿¡°Ô¸¸ À¯¿ëÇϸç, ±âº»ÀûÀ¸·Î + Æ÷ÇÔÇÏÁö ¾Ê´Â´Ù. ÀÌ ¸ðµâÀ» »ç¿ëÇÏ·Á¸é ´ÙÀ½ ¿É¼ÇÀ» »ç¿ëÇÑ´Ù. + ÀÌ ¸ðµâÀÌ ÇÊ¿äÇÑÁö È®½ÇÄ¡¾Ê´Ù¸é »ç¿ëÇÏÁö ¸¶¶ó.

    + +
    + +
    --enable-bucketeer
    +
    mod_bucketeer°¡ Á¦°øÇÏ´Â ¹öŶ(bucket) + Á¶ÀÛ ÇÊÅ͸¦ »ç¿ëÇÑ´Ù.
    + + +
    --enable-case-filter
    +
    mod_case_filterÀÇ ´ë¹®ÀÚº¯È¯ Ãâ·ÂÇÊÅÍ + °ßº»À» »ç¿ëÇÑ´Ù.
    + + +
    --enable-case-filter-in
    +
    mod_case_filter_inÀÇ ´ë¹®ÀÚº¯È¯ ÀÔ·ÂÇÊÅÍ + °ßº»À» »ç¿ëÇÑ´Ù.
    + +
    --enable-echo
    +
    mod_echo°¡ Á¦°øÇÏ´Â ECHO ¼­¹ö¸¦ + »ç¿ëÇÑ´Ù.
    + +
    --enable-example
    +
    °ßº» ¿¹Á¦¸ðµâÀÎ mod_exampleÀ» + »ç¿ëÇÑ´Ù.
    + + +
    --enable-optional-fn-export
    +
    mod_optional_fn_export°¡ Á¦°øÇÏ´Â ¼±ÅÃÀûÀÎ + ÇÔ¼ö ¿¢½ºÆ÷Æ®(exporter)ÀÇ ¿¹¸¦ »ç¿ëÇÑ´Ù.
    + + +
    --enable-optional-fn-import
    +
    mod_optional_fn_import°¡ Á¦°øÇÏ´Â ¼±ÅÃÀûÀÎ + ÇÔ¼ö ÀÓÆ÷Æ®(importer)ÀÇ ¿¹¸¦ »ç¿ëÇÑ´Ù.
    + + +
    --enable-optional-hook-export
    +
    mod_optional_hook_export°¡ Á¦°øÇÏ´Â + ¼±ÅÃÀûÀÎ ÈÅ(hook) ¿¢½ºÆ÷Æ®ÀÇ ¿¹¸¦ »ç¿ëÇÑ´Ù.
    + + +
    --enable-optional-hook-import
    +
    mod_optional_hook_import°¡ Á¦°øÇÏ´Â + ¼±ÅÃÀûÀÎ ÈÅ ÀÓÆ÷Æ®ÀÇ ¿¹¸¦ »ç¿ëÇÑ´Ù.
    +
    + + +

    MPM°ú Á¦»ïÀÚ°¡ ¸¸µç ¸ðµâ

    +

    ´ÙÀ½ ¿É¼ÇÀ» »ç¿ëÇÏ¿© ÇÊ¿äÇÑ ´ÙÁß󸮸ðµâ°ú Á¦»ïÀÚ°¡ + ¸¸µç ¸ðµâÀ» Ãß°¡ÇÑ´Ù:

    + +
    +
    --with-module=module-type:module-file +
    +

    Á¦»ïÀÚ°¡ ¸¸µç ¸ðµâÀ» Á¤ÀûÀ¸·Î ¸µÅ©ÇÒ ¸ðµâ ¸ñ·Ï¿¡ + Ãß°¡ÇÑ´Ù. ¾ÆÆÄÄ¡ À¥¼­¹ö ¼Ò½º Æ®¸®ÀÇ + modules/module-type¿¡¼­ ¸ðµâÀÇ + ¼Ò½ºÆÄÀÏ module-fileÀ» ã±â¶§¹®¿¡ + ±×°÷¿¡ ¼Ò½ºÆÄÀÏÀÌ ÀÖ¾î¾ß ÇÑ´Ù. ±×°÷¿¡ ÆÄÀÏÀÌ ¾ø´Ù¸é + configure´Â module-fileÀÌ + Àý´ëÆÄÀÏ°æ·Î¶ó°í °¡Á¤ÇÏ°í ¼Ò½ºÆÄÀÏÀ» + module-type ÇÏÀ§µð·ºÅ丮¿¡ º¹»çÇÏ·Á°í + ½ÃµµÇÑ´Ù.

    +

    ÀÌ ¿É¼ÇÀº ¼Ò½ºÆÄÀÏÀÌ ÇÑ°³ÀÎ ÀÛÀº ¿ÜºÎ ¸ðµâÀ» Ãß°¡Çϴµ¥ + À¯¿ëÇÏ´Ù. ´õ º¹ÀâÇÑ ¸ðµâÀº °³¹ß»ç°¡ Á¦°øÇÑ ¹®¼­¸¦ + Âü°íÇØ¾ß ÇÑ´Ù.

    +

    ÁÖÀÇ

    + Á¤ÀûÀ¸·Î ¸µÅ©µÈ ¸ðµâÀÌ ¾Æ´Ñ DSO ¸ðµâÀ» ¿øÇÑ´Ù¸é + apxs¸¦ »ç¿ëÇ϶ó.
    +
    + +
    --with-mpm=MPM
    +
    ¼­¹öÀÇ µ¿ÀÛ¹æ½ÄÀ» ¼±ÅÃÇÑ´Ù. Á¤È®È÷ ÇÑ°¡Áö ´ÙÁß󸮸ðµâ¸¸À» ¼±ÅÃÇØ¾ß ÇÑ´Ù. + ¼±ÅÃÇÏÁö ¾ÊÀ¸¸é »ç¿ëÇÏ´Â ¿î¿µÃ¼Á¦ÀÇ ±âº» MPMÀ» »ç¿ëÇÑ´Ù. + »ç¿ëÇÒ ¼ö ÀÖ´Â MPM¿¡´Â beos, + leader, mpmt_os2, + perchild, prefork, + threadpool, worker°¡ + ÀÖ´Ù.
    +
    + + +

    ±âŸ ¿É¼Ç

    +
    +
    --enable-maintainer-mode
    +
    µð¹ö±ë ¸ðµå¿Í ÄÄÆÄÀϽà °æ°í¸¦ ÀÛµ¿ÇÑ´Ù.
    + +
    --enable-mods-shared=MODULE-LIST
    +
    +

    µ¿Àû°øÀ¯¸ðµâ·Î ÄÄÆÄÀÏÇÒ ¸ðµâ ¸ñ·ÏÀ» ÁöÁ¤ÇÑ´Ù. Áï, + ÀÌ ¸ðµâµéÀº LoadModule Áö½Ã¾î¸¦ + »ç¿ëÇÏ¿© µ¿ÀûÀ¸·Î Àоîµé¿©¾ß ÇÑ´Ù.

    +

    MODULE-LIST´Â °ø¹éÀ¸·Î ±¸ºÐÇÑ ¸ðµâ¸íµéÀ» + µû¿ÈÇ¥·Î ¹­Àº ¸ñ·ÏÀÌ´Ù. ¸ðµâ¸í¿¡¼­ ¾Õ¿¡ + mod_´Â »«´Ù. ¿¹¸¦ µé¾î:

    +

    + --enable-mods-shared='headers rewrite dav' +

    +

    ¶Ç, Ưº°ÇÑ Å°¿öµå all°ú most¸¦ + »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î,

    +

    + --enable-mods-shared=most +

    +

    ´Â ´ëºÎºÐÀÇ ¸ðµâÀ» DSO ¸ðµâ·Î ÄÄÆÄÀÏÇÑ´Ù. +

    +
    + +
    --enable-modules=MODULE-LIST
    +
    --enable-mods-shared¿Í ºñ½ÁÇÏÁö¸¸, + ÀÌ ¿É¼ÇÀº ¿­°ÅÇÑ ¸ðµâµéÀ» Á¤ÀûÀ¸·Î ¸µÅ©ÇÑ´Ù. Áï, ÀÌ + ¸ðµâµéÀº httpd ½ÇÇàÇÏ¸é ¾ðÁ¦³ª »ç¿ëÇÒ + ¼ö ÀÖ´Ù. LoadModule·Î ÀоîµéÀÏ + ÇÊ¿ä°¡ ¾ø´Ù.
    + +
    --enable-v4-mapped
    +
    IPv6 ¼ÒÄÏÀÌ IPv4 ¿¬°áÀ» ó¸®ÇÒ ¼ö ÀÖµµ·Ï ÇÑ´Ù.
    + +
    --with-port=PORT
    +
    httpd°¡ ±â´Ù¸± Æ÷Æ®¸¦ ÁöÁ¤ÇÑ´Ù. ÀÌ + Æ÷Æ®¹øÈ£´Â ¼³Á¤ÆÄÀÏ httpd.conf¸¦ ¸¸µé¶§ + ¾²ÀδÙ. ±âº»°ªÀº 80ÀÌ´Ù.
    + +
    --with-program-name
    +
    ´Ù¸¥ ½ÇÇàÆÄÀϸíÀ» ÁöÁ¤ÇÑ´Ù. ±âº»°ªÀº + httpdÀÌ´Ù.
    +
    + + + +

    Ãß°¡ ÆÐÅ°Áö ¼±ÅÃ

    +

    ´ÙÀ½ ¿É¼ÇÀº Ãß°¡ ÆÐÅ°Áö¸¦ ¼±ÅÃÇÑ´Ù.

    + +

    ÀϹÝÀûÀÎ ¹®¹ý

    +

    ÀϹÝÀûÀ¸·Î ´ÙÀ½°ú °°Àº ¹®¹ýÀ» »ç¿ëÇÏ¿© Ãß°¡ ÆÐÅ°Áö¸¦ + ´Ù·é´Ù:

    + +
    +
    --with-PACKAGE[=ARG]
    +
    ÆÐÅ°Áö PACKAGE¸¦ »ç¿ëÇÑ´Ù. + ARGÀÇ ±âº»°ªÀº yesÀÌ´Ù.
    + +
    --without-PACKAGE
    +
    ÆÐÅ°Áö PACKAGE¸¦ »ç¿ëÇÏÁö ¾Ê´Â´Ù. + --with-PACKAGE=no¿Í °°´Ù. + autoconf¿¡ ÀÌ ¿É¼ÇÀÌ ÀÖÁö¸¸ ¾ÆÆÄÄ¡ À¥¼­¹ö¿Í´Â + °ü°è°¡ ¾ø´Ù.
    +
    + + + + +

    ƯÁ¤ ÆÐÅ°Áö

    +
    +
    --with-apr=DIR|FILE
    +
    httpd ¼Ò½º ¹èÆ÷º»¿¡ Æ÷ÇÔµÈ Apache Portable + Runtime (APR)Àº ÀÚµ¿À¸·Î À¥¼­¹ö¿Í °°ÀÌ ÄÄÆÄÀϵȴÙ. + ¸¸¾à ÀÌ¹Ì ¼³Ä¡µÈ APRÀ» ´ë½Å »ç¿ëÇÏ°í ½Í´Ù¸é + configure¿¡°Ô apr-config + ½ºÅ©¸³Æ®ÀÇ °æ·Î¸¦ ¾Ë·ÁÁÖ¾î¾ß ÇÑ´Ù. APR°¡ ¼³Ä¡µÈ Àý´ë°æ·Î, + ÆÄÀϸí, µð·ºÅ丮¸íÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù. ÁöÁ¤ÇÑ µð·ºÅ丮³ª + ±× µð·ºÅ丮ÀÇ ÇÏÀ§µð·ºÅ丮 bin¿¡ + apr-config°¡ ÀÖ¾î¾ß ÇÑ´Ù.
    + +
    --with-apr-util=DIR|FILE
    +
    httpd ¼Ò½º ¹èÆ÷º»¿¡ Æ÷ÇÔµÈ Apache Portable + Runtime Utilities (APU)´Â ÀÚµ¿À¸·Î À¥¼­¹ö¿Í °°ÀÌ + ÄÄÆÄÀϵȴÙ. ¸¸¾à ÀÌ¹Ì ¼³Ä¡µÈ APUÀ» ´ë½Å »ç¿ëÇÏ°í ½Í´Ù¸é + configure¿¡°Ô apu-config + ½ºÅ©¸³Æ®ÀÇ °æ·Î¸¦ ¾Ë·ÁÁÖ¾î¾ß ÇÑ´Ù. APU°¡ ¼³Ä¡µÈ Àý´ë°æ·Î, + ÆÄÀϸí, µð·ºÅ丮¸íÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù. ÁöÁ¤ÇÑ µð·ºÅ丮³ª + ±× µð·ºÅ丮ÀÇ ÇÏÀ§µð·ºÅ丮 bin¿¡ + apu-config°¡ ÀÖ¾î¾ß ÇÑ´Ù.
    + +
    --with-ssl=DIR
    +
    mod_sslÀ» »ç¿ëÇÏ´Â °æ¿ì + configure´Â ¼³Ä¡µÈ OpenSSLÀ» ã´Â´Ù. + ´ë½Å ÀÌ ¿É¼ÇÀ» »ç¿ëÇÏ¿© SSL/TLS µµ±¸ÀÇ µð·ºÅ丮°æ·Î¸¦ + ¾Ë·ÁÁÙ ¼ö ÀÖ´Ù.
    + +
    --with-z=DIR
    +
    (mod_deflate¸¦ »ç¿ëÇÏ´Â °æ¿ì¿Í + °°ÀÌ) ±¸¼º¿¡ ÇÊ¿äÇÏ´Ù¸é ÀÚµ¿À¸·Î configure´Â + ¼³Ä¡µÈ zlib ¶óÀ̺귯¸®¸¦ ã´Â´Ù. ´ë½Å + ÀÌ ¿É¼ÇÀ» »ç¿ëÇÏ¿© ¾ÐÃà ¶óÀ̺귯¸®ÀÇ µð·ºÅ丮°æ·Î¸¦ + ¾Ë·ÁÁÙ ¼ö ÀÖ´Ù.
    +
    + +

    mod_authn_dbm°ú + mod_rewriteÀÇ DBM RewriteMap °°Àº ¾ÆÆÄÄ¡ + À¥¼­¹öÀÇ ÀϺΠ±â´ÉÀº Á¤º¸¸¦ »¡¸® ã±âÀ§ÇØ °£´ÜÇÑ Å°/°ª + µ¥ÀÌÅͺ£À̽º¸¦ »ç¿ëÇÑ´Ù. APU¿¡ SDBMÀÌ µé¾îÀ־ ¾ðÁ¦³ª + ÃÖ¼ÒÇÑ ÀÌ µ¥ÀÌÅͺ£À̽º´Â »ç¿ëÇÒ ¼ö ÀÖ´Ù. ´Ù¸¥ Á¾·ùÀÇ + µ¥ÀÌÅͺ£À̽º¸¦ »ç¿ëÇÏ°í ½Í´Ù¸é ¾Æ·¡ ¿É¼ÇÀ» »ç¿ëÇÑ´Ù:

    + +
    +
    --with-gdbm[=path]
    +
    path¸¦ ÁöÁ¤ÇÏÁö ¾ÊÀ¸¸é, + configure´Â ÀϹÝÀûÀÎ °Ë»ö°æ·Î¿¡¼­ ¼³Ä¡µÈ + GNU DBM Çì´õÆÄÀÏ°ú ¶óÀ̺귯¸®¸¦ ã´Â´Ù. Á÷Á¢ + path¸¦ ÁöÁ¤Çϸé configure´Â + path/lib°ú + path/include¿¡¼­ ÇÊ¿äÇÑ ÆÄÀÏÀ» + ã´Â´Ù. ¸¶Áö¸·À¸·Î path¿¡ Çì´õÆÄÀÏ °æ·Î¿Í + ¶óÀ̺귯¸® °æ·Î¸¦ ÄÝ·ÐÀ» »çÀÌ¿¡ µÎ°í °°ÀÌ ÀûÀ» ¼ö + ÀÖ´Ù.
    + +
    --with-ndbm[=path]
    +
    --with-gdbm°ú °°Áö¸¸ ¼³Ä¡µÈ New DBMÀ» + ã´Â´Ù.
    + +
    --with-berkeley-db[=path]
    +
    --with-gdbm°ú °°Áö¸¸ ¼³Ä¡µÈ Berkeley + DB¸¦ ã´Â´Ù.
    +
    + +

    ÁÖÀÇ

    +

    DBM ¿É¼ÇÀº APU°¡ Á¦°øÇϸç APU ±¸¼º½ºÅ©¸³Æ®·Î Á÷Á¢ + Àü´ÞµÈ´Ù. ±×·¡¼­ --with-apr-utilÀ» »ç¿ëÇÏ¿© + ÀÌ¹Ì ¼³Ä¡µÈ APU¸¦ »ç¿ëÇÑ´Ù¸é DBM ¿É¼ÇÀº ¼Ò¿ëÀÌ ¾ø´Ù.

    +

    À¥¼­¹ö´Â ¿©·¯ DBM ±¸ÇöÀ» °°ÀÌ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ½ÇÇà½Ã + ÀûÀýÇÑ DBM Á¾·ù¸¦ ¼³Á¤ÇÒ ¼ö ÀÖ´Ù.

    +
    + + + +

    Áö¿ø ÇÁ·Î±×·¥À» À§ÇÑ ¿É¼Ç

    +
    +
    --enable-static-support
    +
    Áö¿ø ÇÁ·Î±×·¥À» Á¤ÀûÀ¸·Î ¸µÅ©µÈ ½ÇÇàÆÄÀÏ·Î ¸¸µç´Ù. + Áï, ÇÊ¿äÇÑ ¶óÀ̺귯¸®¸¦ ¸ðµÎ Æ÷ÇÔÇϵµ·Ï ½ÇÇàÆÄÀÏÀ» + ÄÄÆÄÀÏÇÑ´Ù. ÀÌ ¿É¼ÇÀ» »ç¿ëÇÏÁö ¾ÊÀ¸¸é ±âº»°ªÀ¸·Î Áö¿ø + ÇÁ·Î±×·¥À» µ¿ÀûÀ¸·Î ¸µÅ©ÇÑ´Ù.
    + +
    --enable-suexec
    +
    À¥¼­¹ö°¡ ½ÇÇàÇÏ´Â ÇÁ·Î¼¼½ºÀÇ uid¿Í gid¸¦ ¼³Á¤ÇÏ´Â + suexec¸¦ »ç¿ëÇÏ·Á¸é + ÀÌ ¿É¼ÇÀ» »ç¿ëÇÑ´Ù. suid ½ÇÇàÆÄÀÏÀÇ º¸¾È»ó À§ÇèÀ» + ¸ðµÎ ¾ËÁö ¸øÇÑ´Ù¸é ÀÌ ¿É¼ÇÀ» »ç¿ëÇÏÁö ¸¶¶ó. + suexec¸¦ ±¸¼ºÇÏ´Â ¿É¼ÇÀº + ¾Æ·¡¿¡¼­ ¼³¸íÇÑ´Ù.
    +
    + +

    ´ÙÀ½ ¿É¼ÇÀ» »ç¿ëÇÏ¿© Áö¿ø ÇÁ·Î±×·¥º°·Î Á¤ÀûÀ¸·Î ¸µÅ©µÈ + ½ÇÇàÆÄÀÏÀ» ¸¸µé ¼ö ÀÖ´Ù:

    + +
    +
    --enable-static-ab
    +
    ab¸¦ Á¤ÀûÀ¸·Î ¸µÅ©µÈ + ½ÇÇàÆÄÀÏ·Î ÄÄÆÄÀÏÇÑ´Ù.
    + + +
    --enable-static-checkgid
    +
    checkgid¸¦ Á¤ÀûÀ¸·Î ¸µÅ©µÈ ½ÇÇàÆÄÀÏ·Î + ÄÄÆÄÀÏÇÑ´Ù.
    + + +
    --enable-static-htdbm
    +
    htdbmÀ» Á¤ÀûÀ¸·Î ¸µÅ©µÈ ½ÇÇàÆÄÀÏ·Î + ÄÄÆÄÀÏÇÑ´Ù.
    + +
    --enable-static-htdigest
    +
    htdigest¸¦ + Á¤ÀûÀ¸·Î ¸µÅ©µÈ ½ÇÇàÆÄÀÏ·Î ÄÄÆÄÀÏÇÑ´Ù.
    + +
    --enable-static-htpasswd
    +
    htpasswd¸¦ + Á¤ÀûÀ¸·Î ¸µÅ©µÈ ½ÇÇàÆÄÀÏ·Î ÄÄÆÄÀÏÇÑ´Ù.
    + +
    --enable-static-logresolve
    +
    logresolve¸¦ + Á¤ÀûÀ¸·Î ¸µÅ©µÈ ½ÇÇàÆÄÀÏ·Î ÄÄÆÄÀÏÇÑ´Ù.
    + +
    --enable-static-rotatelogs
    +
    rotatelogs¸¦ + Á¤ÀûÀ¸·Î ¸µÅ©µÈ ½ÇÇàÆÄÀÏ·Î ÄÄÆÄÀÏÇÑ´Ù.
    +
    + +

    suexec ¼³Á¤ ¿É¼Ç

    +

    ¾Æ·¡ ¿É¼ÇÀº suexec¸¦ ÀÚ¼¼È÷ ¼³Á¤ÇÑ´Ù. + ´õ ÀÚ¼¼ÇÑ Á¤º¸´Â suEXEC + ±¸¼º°ú ¼³Ä¡¸¦ Âü°íÇ϶ó.

    + +
    +
    --with-suexec-bin
    +
    suexec ½ÇÇàÆÄÀÏÀÇ °æ·Î¸¦ ÁöÁ¤ÇÑ´Ù. ±âº»°ªÀº + --sbindirÀÌ´Ù (¼³Ä¡ µð·ºÅ丮ÀÇ ÀÚ¼¼ÇÑ + Á¶Á¤ Âü°í).
    + +
    --with-suexec-caller
    +
    suexec¸¦ ½ÇÇàÇÒ »ç¿ëÀÚ¸¦ ÁöÁ¤ÇÑ´Ù. + ÀÌ »ç¿ëÀÚ´Â º¸Åë httpd¸¦ ½ÇÇàÇÏ´Â »ç¿ëÀÚ¿Í + °°¾Æ¾ß ÇÑ´Ù.
    + +
    --with-suexec-docroot
    +
    suexec´Â ÀÌ ¿É¼ÇÀ¸·Î ÁöÁ¤ÇÑ µð·ºÅ丮 + ¾Æ·¡¿¡ ÀÖ´Â ½ÇÇàÆÄÀϸ¸À» ½ÇÇàÇÒ ¼ö ÀÖ´Ù. ±âº»°ªÀº + --datadir/htdocs´Ù.
    + +
    --with-suexec-gidmin
    +
    suexec¿¡¼­ ÁöÁ¤°¡´ÉÇÑ ÃÖ¼Ò GID¸¦ ¼³Á¤ÇÑ´Ù. + ±âº»°ªÀº 100ÀÌ´Ù.
    + +
    --with-suexec-logfile
    +
    suexec ·Î±×ÆÄÀϸíÀ» ÁöÁ¤ÇÑ´Ù. ·Î±×ÆÄÀϸíÀÇ + ±âº»°ªÀº suexec_logÀÌ°í, + --logfiledir¿¡ À§Ä¡ÇÑ´Ù.
    + +
    --with-suexec-safepath
    +
    suexec°¡ ½ÃÀÛÇÏ´Â ÇÁ·Î¼¼½ºÀÇ + PATH ȯ°æº¯¼ö°ªÀ» ÁöÁ¤ÇÑ´Ù. ±âº»°ªÀº + /usr/local/bin:/usr/bin:/binÀÌ´Ù.
    + +
    --with-suexec-userdir
    +
    »ç¿ëÀÚ µð·ºÅ丮¿¡¼­ suexec°¡ Á¢±ÙÇÒ + ¼ö ÀÖ´Â (½ÇÇàÆÄÀÏÀÌ ÀÖ´Â) ÇÏÀ§µð·ºÅ丮¸¦ ÁöÁ¤ÇÑ´Ù. + ÀÌ ¼³Á¤Àº suexec¿Í + (mod_userdirÀÌ Á¦°øÇÏ´Â) »ç¿ëÀÚº° + µð·ºÅ丮¸¦ °°ÀÌ »ç¿ëÇÒ¶§ ÇÊ¿äÇÏ´Ù. ±âº»°ªÀº + public_htmlÀÌ´Ù.
    + +
    --with-suexec-uidmin
    +
    suexec¿¡¼­ ÁöÁ¤°¡´ÉÇÑ ÃÖ¼Ò UID¸¦ ¼³Á¤ÇÑ´Ù. + ±âº»°ªÀº 100ÀÌ´Ù.
    + +
    --with-suexec-umask
    +
    suexec°¡ ½ÇÇàÇÏ´Â ÇÁ·Î¼¼½ºÀÇ + umask¸¦ ÁöÁ¤ÇÑ´Ù. ±âº»°ªÀº »ç¿ëÇÏ´Â ½Ã½ºÅÛÀÇ + ±âº» ¼³Á¤°ú °°´Ù.
    +
    + + +
    top
    +
    +

    ȯ°æº¯¼ö

    +

    configureÀÇ ¼±ÅÃÀ» ¹«½ÃÇϰųª °ü·Ê¿Í ´Ù¸¥ + À̸§À̳ª À§Ä¡¿¡ ÀÖ´Â ¶óÀ̺귯¸®¿Í ÇÁ·Î±×·¥À» ãµµ·Ï µµ¿ÍÁÖ´Â + À¯¿ëÇÑ È¯°æº¯¼öµéÀÌ ÀÖ´Ù.

    + + +
    +
    CC
    +
    ÄÄÆÄÀÏ¿¡ »ç¿ëÇÒ C ÄÄÆÄÀÏ·¯ ¸í·É¾î¸¦ ÁöÁ¤ÇÑ´Ù.
    + +
    CFLAGS
    +
    ÄÄÆÄÀ϶§ »ç¿ëÇÏ±æ ¹Ù¶ó´Â C ÄÄÆÄÀÏ·¯ ¿É¼ÇÀ» ÁöÁ¤ÇÑ´Ù.
    + +
    CPP
    +
    »ç¿ëÇÒ C ¼±Ã³¸®±â ¸í·É¾î¸¦ ÁöÁ¤ÇÑ´Ù.
    + +
    CPPFLAGS
    +
    C/C++ ¼±Ã³¸®±â ¿É¼Ç. ¿¹¸¦ µé¾î, Çì´õÆÄÀÏÀÌ °ü·Ê¿Í ´Þ¸® + includedir µð·ºÅ丮¿¡ ÀÖ´Ù¸é + -IincludedirÀ» »ç¿ëÇÑ´Ù.
    + +
    LDFLAGS
    +
    ¸µÄ¿ ¿É¼Ç. ¿¹¸¦ µé¾î, ¶óÀ̺귯¸®°¡ °ü·Ê¿Í ´Þ¸® + libdir µð·ºÅ丮¿¡ ÀÖ´Ù¸é + -LlibdirÀ» »ç¿ëÇÑ´Ù.
    +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/configure.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/programs/configure.html.tr.utf8 new file mode 100644 index 00000000..39b48f5c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/configure.html.tr.utf8 @@ -0,0 +1,989 @@ + + + +configure - kaynak ağacını yapılandırır - Apache HTTP Sunucusu + + + + + +
    <-
    +

    configure - kaynak ağacını yapılandırır

    +
    +

    Mevcut Diller:  en  | + ko  | + tr 

    +
    + +

    configure betiği, Apache HTTP Sunucusunun kaynak kodlarını + belli bir platform için yapılandırmakta ve derlemekte kullanılır. + Sunucuyu kişisel gereksinimlerinize uygun şekilde derlemek için çeşitli + seçeneklere sahiptir.

    + +

    Bu betik Apache HTTP Sunucusu kaynak paketinin kök dizininde bulunur ve + sadece Unix ve benzeri sistemlerde kullanılabilir. Kaynak paketinin + diğer platformalarda yapılandırılması ve derlenmesi hakkında bilgi + edinmek için platform belgelerine bakınız.

    +
    + +
    top
    +
    +

    Komut Satırı

    +

    configure betiğini kaynak paketinin kök dizininden başka + bir yere kopyalayıp çalıştırmamalısınız.

    + +

    ./configure [seçenek]... + [değişken=değer]...

    + +

    CC, CFLAGS gibi ortam değişkenlerini + değişken=değer atamaları biçiminde + kullanabilirsiniz. Kullanışlı değişkenlerin bazıları aşağıda açıklanmıştır.

    +
    top
    +
    +

    Seçenekler

    + + +

    Yapılandırma seçenekleri

    + +

    Aşağıdaki seçenekler configure betiğinin kendi davranışını + belirlemekte kullanılır.

    + +
    +
    -C
    +
    --config-cache
    +
    --cache-file=config.cache için bir kısaltmadır.
    + +
    --cache-file=dosya
    +
    Sınama sonuçları dosya dosyasında saklanır. + Bu seçenek açıkça belirtilmedikçe işlevsizdir.
    + +
    -h
    +
    --help [short|recursive]
    +
    Yardım metnini basar ve çıkar. short değeriyle sadece + bu pakete özgü seçenekler listelenir. recursive değeriyle + ise paketin içindeki tüm paketler için kısa bir yardım metni + basılır.
    + +
    -n
    +
    --no-create
    +
    configure betiği normal olarak çalışır fakat herhangi + bir çıktı dosyası üretmez. Derleme için Makefile + dosyalarını üretmeksizin sınamaların sonuçlarını görmek için + yararlıdır.
    + +
    -q
    +
    --quiet
    +
    Yapılandırma sürecinde checking ... iletilerini basmaz. +
    + +
    --srcdir=dizin
    +
    dizin dizinini kaynak dosyaları dizini olarak + tanımlar. configure betiğinin bulunduğu dizin veya bir + üst dizin öntanımlıdır.
    + +
    --silent
    +
    --quiet ile aynı.
    + +
    -V
    +
    --version
    +
    Telif hakkı bilgilerini gösterir ve çıkar.
    +
    + + +

    Kurulum dizinleri

    + +

    Bu seçenekler kurulum dizinlerini tanımlar. Kurulum dizinleri seçilmiş + yerleşime bağımlıdır.

    + +
    +
    --prefix=PREFIX
    +
    Mimariden bağımsız dosyalar PREFIX dizininin + altına kurulur. /usr/local/apache2 öntanımlı kurulum + dizinidir.
    + +
    --exec-prefix=EPREFIX
    +
    Mimariye bağımlı dosyalar EPREFIX dizininin + altına kurulur. Bunun için PREFIX dizini + öntanımlı kurulum dizinidir.
    +
    + +

    Öntanımlı olarak, make install tüm dosyaların + /usr/local/apache2/bin, /usr/local/apache2/lib + gibi dizinlere kurulmasını sağlar. Kurulum dizini önekini örneğin, + --prefix=$HOME şeklinde belirterek kurulumun başka bir yere + yapılmasını sağlayabilirsiniz.

    + +

    Bir dizin yerleşimi tanımlamak

    +
    +
    --enable-layout=LAYOUT
    +
    Kaynak kodu ve derleme betikleri kurulum ağacının + LAYOUT yerleşimine dayalı olduğu varsayımıyla + yapılandırılır. Bu seçenek sayesinde Apache HTTP Sunucusu kurulumu + içinde her dosya türü için farklı bir yer belirleyebilirsiniz. + config.layout dosyasında böyle yapılandırma örnekleri + vardır. Örnekleri izleyerek kendi yapılandırmanızı + oluşturabilirsiniz. Bu dosyada örneğin FOO isimli + yerleşim <Layout FOO>...</Layout> bölümü + içinde düzenlenmiştir ve her yerleşim için böyle ayrı bir bölüm + vardır. Öntanımlı yerleşim Apache’dir.
    +
    + + +

    Kurulum dizinlerinde ince ayar

    + + +

    Kurulum dizinlerini daha iyi denetim altında tutmak için aşağıdaki + seçenekler kullanılır. Lütfen, dizin öntanımlılarının + autoconf tarafından tanımlandığına ve seçilen yerleşim + ayarlarının bunları yerini aldığına dikkat ediniz.

    + +
    + +
    --bindir=dizin
    +
    Kullanıcı tarafından çalıştırılabilen dosyalar + dizin dizinine kurulur. Bunlar + htpasswd, dbmmanage gibi site + yönetimi için yararlı destek programlarıdır. Öntanımlı olarak bu + dosyalar EPREFIX/bin dizinine kurulur.
    + +
    --datadir=dizin
    +
    Mimariden bağımsız salt okunur veriler dizin + dizinine kurulur. Bunların öntanımlı kurulum dizini + PREFIX/share dizinidir. Bu seçenek + autoconf tarafından atanır ve şimdilik + kullanılmamıştır.
    + +
    --includedir=dizin
    +
    C başlık dosyaları dizin dizinine kurulur. + Bunların öntanımlı kurulum dizini + PREFIX/include dizinidir.
    + +
    --infodir=dizin
    +
    Info belgeleri dizin dizinine kurulur. + Bunların öntanımlı kurulum dizini + PREFIX/info dizinidir. Bu seçenek şimdilik + kullanılmamıştır.
    + +
    --libdir=dizin
    +
    Nesne kod kütüphaneleri dizin dizinine + kurulur. Bunların öntanımlı kurulum dizini + PREFIX/lib dizinidir.
    + +
    --libexecdir=dizin
    +
    Paylaşımlı modüller gibi program dosyaları + dizin dizinine kurulur. Öntanımlı olarak + libexecdir bu dizini + EPREFIX/libexec olarak tanımlar.
    + +
    --localstatedir=dizin
    +
    Düzenlenebilir tek makinelik veri dizin + dizinine kurulur. Öntanımlı olarak localstatedir bu + dizini PREFIX/var olarak tanımlar. Bu + seçenek autoconf tarafından atanır ve şimdilik + kullanılmamıştır.
    + +
    --mandir=dizin
    +
    Kılavuz sayfaları dizin dizinine kurulur. + Öntanımlı olarak mandir bu dizini + EPREFIX/man olarak tanımlar.
    + +
    --oldincludedir=dizin
    +
    GCC harici C başlık dosyaları dizin dizinine + kurulur. Öntanımlı olarak oldincludedir bu dizini + /usr/include olarak tanımlar. Bu seçenek + autoconf tarafından atanır ve şimdilik + kullanılmamıştır.
    + +
    --sbindir=dizin
    +
    Sistem yöneticisi tarafından kullanılabilen programlar + dizin dizinine kurulur. Bunlar + httpd, apachectl, + suexec gibi Apache HTTP Sunucusunu çalıştırmak + için gereken programlardır. Öntanımlı olarak sbindir bu + dizini EPREFIX/sbin olarak tanımlar.
    + +
    --sharedstatedir=dizin
    +
    Mimariye bağımlı düzenlenebilir veriler + dizin dizinine kurulur. Öntanımlı olarak + sharedstatedir bu dizini + PREFIX/com olarak tanımlar. Bu seçenek + autoconf tarafından atanır ve şimdilik + kullanılmamıştır.
    + +
    --sysconfdir=dizin
    +
    httpd.conf, mime.types gibi tek + makinelik salt okunur sunucu yapılandırma dosyaları + dizin dizinine kurulur. + sysconfdir için PREFIX/conf + öntanımlı dizindir.
    +
    + + + +

    Sistem türleri

    + +

    Bu seçenekleri Apache HTTP Sunucusunu başka bir platformda çalıştırmak + üzere çapraz derleme yaparken kullanılır. Normal durumlarda sunucu + derlendiği platformda çalıştırıldığından bu seçenekler kullanılmaz.

    + +
    +
    --build=derleme-ortamı
    +
    Derleme araçlarının derleneceği sistemin sistem türünü tanımlar. + config.guess betiği ile elde edilen sonuç + öntanımlıdır.
    + +
    --host=çalışma-ortamı
    +
    Sunucunun çalışacağı sistemin sistem türünü tanımlar. Öntanımlı + sistem türü derleme-ortamı’dır.
    + +
    --target=hedef-ortam
    +
    Derleyicileri hedef-ortam sistem türü için + yapılandırır. Öntanımlı sistem türü + çalışma-ortamı’dır. Bu seçenek + autoconf tarafından atanır ve Apache HTTP Sunucusu için + gerekli değildir.
    +
    + + +

    Seçimlik özellikler

    + +

    Bu seçenekler HTTP sunucunuzun sahip olmasını istediğiniz özelliklerin + hassas olarak ayarlanmasını sağlar.

    + +

    Genel sözdizimi

    +

    Bir özelliği etkin kılmak veya iptal etmek için genellikle şu + sözdizimi kullanılır:

    + +
    +
    --disable-özellik
    +
    Sunucu özellik özelliğine sahip olmaz. Bu + seçenek--enable-özellik=no seçeneğine + eşdeğerdir.
    + +
    --enable-özellik[=değer]
    +
    Sunucu özellik özelliğine sahip olur. + değer belirtilmediği takdirde + yes (evet) öntanımlıdır.
    + +
    --enable-modül=shared
    +
    Belirtilen modül DSO modülü olarak derlenir.
    + +
    --enable-modül=static
    +
    Öntanımlı olarak etkin olan modüller durağan ilintilenir. Bunu bu + seçenekle alenen zorlayabilirsiniz.
    +
    + +

    Bilginize

    +

    --enable-filanca seçeneğinin varlığı + configure betiğinin filanca diye + bir modül var olmasa bile bundan şikayetçi olmasına sebep olmaz. Bu + bakımdan dikkatli olunuz.

    +
    + + + +

    Öntanımlı olarak etkin modüller

    +

    Bazı modüller öntanımlı olarak derlendiğinden iptal edilmek istenirse + bunun açıkça belirtilmesi gerekir. Aşağıdaki seçenekler bu tür + modüllerin diğerlerinden bağımsız olarak derlenmemesini sağlar.

    + +
    +
    --disable-actions
    +
    mod_actions modülü tarafından sağlanan ve + isteklerle tetiklenen eylemleri iptal eder.
    + +
    --disable-alias
    +
    mod_alias modülü tarafından sağlanan, isteklerin + farklı dosya sistemi bölümleriyle eşlenmesi iptal edilir.
    + +
    --disable-asis
    +
    mod_asis modülü tarafından sağlanan kendinden + HTTP başlıklı dosya türü desteğini iptal eder.
    + +
    --disable-auth
    +
    mod_auth modülü tarafından sağlanan kullanıcıya + dayalı erişim denetimi iptal edilir. Bu modül, kullanıcı isminin ve + parolasının salt metin dosyalarda saklandığı Temel HTTP Kimlik + Doğrulaması için kullanılır.
    + +
    --disable-autoindex
    +
    mod_autoindex modülü tarafından sağlanan dizin + içerik listelemesini iptal eder.
    + +
    --disable-access
    +
    mod_access modülü tarafından sağlanan konağa + dayalı erişim denetimi iptal edilir.
    + +
    --disable-cgi
    +
    CGI betiklerine destek sağlayan mod_cgi, çok + evreli olmayan MPM kullanıldığında öntanımlı olarak etkin kılınır. + CGI desteğini iptal etmek için bu seçeneği kullanın.
    + +
    --disable-cgid
    +
    worker veya perchild çok + evreli MPM’leri kullanılırken CGI betikleri için desteği öntanımlı + olarak mod_cgid modülü sağlar. CGI desteğini iptal + etmek için bu seçeneği kullanın.
    + +
    --disable-charset-lite
    +
    mod_charset_lite modülü tarafından sağlanan + karakter kümesi dönüşümleri iptal edilir. Bu modül sadece EBCDIC + sistemlerinde öntanımlı olarak kurulur.
    + +
    --disable-dir
    +
    mod_dir modülü tarafından sağlanan dizin + isteklerine destek iptal edilir.
    + +
    --disable-env
    +
    mod_env modülü tarafından sağlanan ortam + değişkenlerine destek iptal edilir.
    + + +
    --disable-http
    +
    HTTP protokolüne destek iptal edilir. http modülü + en temel modüldür ve sunucunun bir HTTP sunucusu olarak çalışmasını + sağlar. Sadece, HTTP protokolü yerine başka bir protokol kullanmak + isterseniz bu seçeneği kullunın. Ne yaptığınızdan gerçekten + emin olamıyorsanız bu desteği asla iptal etmeyin. +
    + Dikkat: Bu modül ana kodla daima durağan ilintilidir.
    + +
    --disable-imap
    +
    mod_imap modülü tarafından sağlanan resim + eşlemlerine destek iptal edilir.
    + +
    --disable-include
    +
    mod_include modülü tarafından sağlanan SSI + sayfaları desteği iptal edilir.
    + +
    --disable-log-config
    +
    mod_log_config modülü tarafından sağlanan günlük + kayıtları yapılandırması iptal edilir. Bu modül olmaksızın sunucu + yapılan isteklerin günlük kayıtlarını tutamaz.
    + +
    --disable-mime
    +
    mod_mime modülü istenen dosyanın uzantısına + bakarak dosya içeriğinin (→ MIME + türü, dil, karakter kümesi ve kodlama) nasıl ele + alınacağını belirler. Bu modülün iptal edilmesi önerilmez.
    + +
    --disable-negotiation
    +
    mod_negotiation modülü tarafından sağlanan içerik + dili uzlaşımı iptal edilir.
    + +
    --disable-setenvif
    +
    mod_setenvif modülü tarafından sağlanan + başlıklarla ilgili ortam değişkenlerine dayalı destek iptal + edilir.
    + +
    --disable-status
    +
    mod_status modülü tarafından sağlanan süreç/evre + izleme iptal edilir.
    + +
    --disable-userdir
    +
    mod_userdir modülü tarafından sağlanan, + isteklerin kullanıcıya özel dizinlere eşlenmesi iptal edilir.
    +
    + + +

    Öntanımlı olarak etkin olmayan modüller

    + + +

    Bazı modüller öntanımlı olarak derlendiği halde açıkça istenmedikçe + veya most ya da all anahtar sözcükleri + kullanılmadıkça etkin kılınmazlar (bu konu, aşağıda --enable-mods-shared + seçeneğinde daha ayrıntılı ele alınmıştır). Bu modülleri + etkinleştirmek için aşağıdaki seçenekleri kullanabilirsiniz.

    + +
    +
    --enable-auth-anon
    +
    mod_auth_anon modülünün sağladığı anonim + kullanıcı erişimi etkin kılınır.
    + +
    --enable-auth-dbm
    +
    mod_auth_dbm modülü kullanıcı isimlerinin ve + parolalarının DBM türü veritabanı dosyalarında saklandığı HTTP Temel + Kimlik Kanıtlaması için destek sağlar. Bu seçeneği bu modülü etkin + kılmak için kullanabilirsiniz.
    + +
    --enable-auth-digest
    +
    mod_auth_digest modülü tarafından sağlanan + RFC2617 Özet Kimlik Kanıtlaması etkin kılınır. Bu modül delilleri + salt metin dosyalarda saklar.
    + +
    --enable-auth-ldap
    +
    mod_auth_ldap modülü tarafından sağlanan LDAP’a + Dayalı Kimlik Kanıtlaması etkin kılınır.
    + +
    --enable-cache
    +
    mod_cache modülü tarafından sağlanan devingen + dosya önbelleklemesi etkin kılınır. Bu deneysel modülün kullanımı, + aşırı yüklü sunucularda ya da önbellekli vekillerde ilginç sonuçlar + verebilir. Bunun yanında en azından bir saklama alanı yönetim modülü + (örn, mod_disk_cache veya + mod_mem_cache) gerekebilir.
    + +
    --enable-cern-meta
    +
    mod_cern_meta modülü tarafından sağlanan CERN + türü temel veri dosyalarına destek etkin kılınır.
    + +
    --enable-charset-lite
    +
    mod_charset_lite modülü tarafından sağlanan + karakter kümesi dönüşümleri etkin kılınır. Bu modül sadece EBCDIC + sistemlerinde öntanımlı olarak etkindir. Diğer sistemlerde gerekirse + alenen etkin kılınması gerekir.
    + +
    --enable-dav
    +
    mod_dav modülü tarafından sağlanan WebDAV + protokolü desteği etkin kılınır. Dosya sistemi özkaynaklarına destek + için mod_dav_fs modülü de gerekir ve bu seçenekle o + da etkin kılınır.
    + Dikkat: mod_dav sadece http protokolü + modülü ile birlikte kullanılabilir.
    + +
    --enable-dav-fs
    +
    mod_dav_fs modülü tarafından sağlanan WebDAV + protokolünün dosya sistemi özkaynaklarına erişim desteği etkin + kılınır. Bu modül mod_dav modülü için destek + sağlar. Bu bakımdan, mod_dav modülünü de etkin + kılmak için --enable-dav seçeneğini de + kullanmalısınız.
    + +
    --enable-dav-lock
    +
    mod_dav_lock modülü tarafından sağlanan geri + destek modüllerine temel DAV kilitleme desteği etkin kılınır. Bu + modülün işlevsel olabilmesi için en azından mod_dav + modülünün etkin olması gerekir, dolayısıyla bu seçeneği + --enable-dav ile birlikte kullanmalısınız.
    + +
    --enable-deflate
    +
    mod_deflate modülü tarafından sağlanan + sıkıştırılmış aktarım kodlaması etkin kılınır.
    + +
    --enable-disk-cache
    +
    mod_disk_cache modülü tarafından sağlanan diskte + önbellekleme etkin kılınır.
    + +
    --enable-expires
    +
    mod_expires modülü tarafından sağlanan + Expires başlığıyla denetim etkin kılınır.
    + +
    --enable-ext-filter
    +
    mod_ext_filter modülü tarafından sağlanan harici + süzgeç desteği etkin kılınır.
    + +
    --enable-file-cache
    +
    mod_file_cache modülü tarafından sağlanan dosya + önbelleklemesi etkin kılınır.
    + +
    --enable-headers
    +
    mod_headers modülü tarafından sağlanan HTTP + başlıkları denetimi etkin kılınır.
    + +
    --enable-info
    +
    mod_info modülü tarafından sağlanan sunucu + bilgileri etkin kılınır.
    + +
    --enable-ldap
    +
    mod_ldap modülü tarafından sağlanan LDAP + önbelleklemesi ve bağlantı havuzu hizmetleri etkin kılınır.
    + +
    --enable-logio
    +
    mod_logio modülü tarafından sağlanan başlıklarda + bulunan girdi ve çıktı bayt sayılarının günlüklenmesi etkin + kılınır.
    + +
    --enable-mem-cache
    +
    mod_mem_cache modülü tarafından sağlanan bellekte + önbellekleme etkin kılınır.
    + +
    --enable-mime-magic
    +
    mod_mime_magic modülü tarafından sağlanan + → MIME türlerinin kendiliğinden + belirlenmesi desteği etkin kılınır.
    + +
    --enable-isapi
    +
    mod_isapi modülü tarafından sağlanan isapi + eklenti desteği etkin kılınır.
    + +
    --enable-proxy
    +
    mod_proxy modülü tarafından sağlanan + vekil/ağ-geçidi işlevselliği etkin kılınır. CONNECT, + FTP ve HTTP yetenekleri ayrı olarak + mod_proxy_connect, mod_proxy_ftp + ve mod_proxy_http modülleri tarafından sağlanır. + Bu üç modül bu seçenekle kendiliğinden etkin olur.
    + +
    --enable-proxy-connect
    +
    mod_proxy_connect modülü tarafından sağlanan + CONNECT isteklerine vekil desteği etkin kılınır. Bu + modül mod_proxy modülünün bir eklentisidir, + dolayısıyla bu seçeneği --enable-proxy seçeneği ile + birlikte kullanmalısınız.
    + +
    --enable-proxy-ftp
    +
    mod_proxy_ftp modülü tarafından sağlanan + FTP isteklerine vekil desteği etkin kılınır. Bu modül + mod_proxy modülünün bir eklentisidir, dolayısıyla + bu seçeneği --enable-proxy seçeneği ile birlikte + kullanmalısınız.
    + +
    --enable-proxy-http
    +
    mod_proxy_http modülü tarafından sağlanan + HTTP isteklerine vekil desteği etkin kılınır. Bu modül + mod_proxy modülünün bir eklentisidir, dolayısıyla + bu seçeneği --enable-proxy seçeneği ile birlikte + kullanmalısınız.
    + +
    --enable-rewrite
    +
    mod_rewrite modülü tarafından sağlanan kurallara + dayalı URL kurgulaması etkin kılınır.
    + +
    --enable-so
    +
    mod_so modülü tarafından sağlanan DSO yeteneği + etkin kılınır. --enable-mods-shared seçeneği bu + seçeneği de etkin kılar.
    + +
    --enable-speling
    +
    mod_speling modülü tarafından sağlanan URL + yanlışlarını düzeltme desteği etkin kılınır.
    + +
    --enable-ssl
    +
    mod_ssl modülü tarafından sağlanan SSL/TLS + şifreleme desteği etkin kılınır.
    + +
    --enable-unique-id
    +
    mod_unique_id modülü tarafından sağlanan her + isteğe bir eşsiz kimlik atama desteği etkin kılınır.
    + +
    --enable-usertrack
    +
    mod_usertrack modülü tarafından sağlanan + kullanıcı oturumunu izleme desteği etkin kılınır.
    + +
    --enable-vhost-alias
    +
    mod_vhost_alias modülü tarafından sağlanan + kitlesel sanal barındırma desteği etkin kılınır.
    +
    + + +

    Geliştiriciler için modüller

    + + +

    Aşağıdakiler geliştiricilerin yaptıklarını sınamalar için yararlı + modülleri etkinleştiren seçeneklerdir. Bu seçenekler öntanımlı olarak + etkin değildir. Bu modüllere ihtiyacınız olup olmadığı konusunda bir + fikriniz yoksa bu bölümü atlayabilirsiniz.

    + +
    + +
    --enable-bucketeer
    +
    mod_bucketeer modülü tarafından sağlanan veri + kümelerine müdahale süzgeci etkin kılınır.
    + + +
    --enable-case-filter
    +
    mod_case_filter modülünün sağladığı çıktıda büyük + harfe dönüşüm süzgeci örneği etkin kılınır.
    + + +
    --enable-case-filter-in
    +
    mod_case_filter_in modülünün sağladığı girdide büyük + harfe dönüşüm süzgeci örneği etkin kılınır.
    + +
    --enable-echo
    +
    mod_echo modülünün sağladığı ECHO sunucusu etkin + kılınır.
    + +
    --enable-example
    +
    Örnek ve demo modülü mod_example etkin + kılınır.
    + + +
    --enable-optional-fn-export
    +
    mod_optional_fn_export modülünün sağladığı seçimlik + işlev ihraç örneği etkin kılınır.
    + + +
    --enable-optional-fn-import
    +
    mod_optional_fn_import modülünün sağladığı seçimlik + işlev ithal örneği etkin kılınır.
    + + +
    --enable-optional-hook-export
    +
    mod_optional_hook_export modülünün sağladığı seçimlik + kanca işlev ihraç örneği etkin kılınır.
    + + +
    --enable-optional-hook-import
    +
    mod_optional_hook_import modülünün sağladığı seçimlik + kanca işlev ithal örneği etkin kılınır.
    +
    + + +

    MPM'ler ve üçüncü parti modüller

    +

    Gereken çok süreçlilik modüllerini ve üçüncü parti modülleri etkin + kılmak için şu seçenekler kullanılır:

    + +
    +
    --with-module=modül-türü:modül-dosyası[,modül-türü:modül-dosyası]
    +

    Durağan ilintili modüller listesine belirtilen modülleri ekler. + Modül kaynak dosyası modül-dosyası, önce + Apache HTTP Sunucusu kaynak ağacı altında + modules/modül-türü alt dizininde aranır. + Modül orada değilse configure betiği + modül-dosyası ile bir mutlak dosya yolu + belirtildiği varsayımıyla kaynak dosyasını + modül-türü alt dizinine kopyalamaya çalışır. + Alt dizin mevcut değilse oluşturulur ve içine standart bir + Makefile.in yerleştirilir.

    + +

    Bu seçenek tek kaynak dosyasından oluşan küçük harici modülleri + eklemek için yararlıdır. Daha karmaşık modüller için modül üreticisi + tarafından sağlanan belgelere bakınız.

    + +

    Bilginize

    +

    Durağan ilintili modüller yerine bir DSO modülü derlemek + isterseniz apxs programını kullanınız.

    +
    +
    + +
    --with-mpm=MPM
    +
    Sunucu süreç modeli seçilir. Bu seçenekte çok süreçlilik modüllerinden sadece biri + belirtilebilir. Bu seçenek kullanılmadığı takdirde işletim + sisteminiz için öntanımlı MPM + etkin olur. Bu seçenekte belirtilebilecek MPM isimleri: + beos, leader, + mpmt_os2, perchild, + prefork, threadpool ve + worker.
    +
    + + +

    Kümeleme seçenekleri ve diğerleri

    +
    +
    --enable-maintainer-mode
    +
    Hata ayıklama iletileri ve derleme sırasındaki uyarıların + gösterilmesi etkin kılınır.
    + +
    --enable-mods-shared=modül-listesi
    +
    +

    Etkinleştirilip devingen paylaşımlı modül olarak derlenecek + modüllerin listesi belirtilir. Yani, bu modüller LoadModule yönergesi kullanılarak + devingen olarak yüklenir.

    + +

    modül-listesi tırnak içine alınmış boşluk + ayraçlı modül isimleri listesidir. Modül isimleri önlerindeki + mod_ öneki olmaksızın belirtilirler. Örnek:

    + +

    + --enable-mods-shared='headers rewrite dav' +

    + +

    modül-listesi yerine all ve + most anahtar sözcükleri de belirtilebilir. + Örneğin,

    + +

    + --enable-mods-shared=most +

    + +

    seçeneği ile çoğu modül DSO modülü olarak derlenecektir.

    +
    + +
    --enable-modules=modül-listesi
    +
    Bu seçenek modülleri devingen değil de durağan ilintilemek dışında + --enable-mods-shared seçeneğine benzer. Yani bu + modüller httpd çalıştırılır çalıştırılmaz etkin + olurlar. Yüklenmeleri için LoadModule yönergesine ihtiyaçları + yoktur.
    + +
    --enable-v4-mapped
    +
    IPv6 soketlierinin IPv4 bağlantılar üzerinde kullanılması mümkün + olur.
    + +
    --with-port=port
    +
    Bu seçenek httpd'nin dinleyeceği portu + belirler. Bu port httpd.conf yapılandırma dosyası + üretilirken kullanılır. 80. port öntanımlıdır.
    + +
    --with-program-name
    +
    Öntanımlı olan httpd yerine başka bir çalıştırabilir + ismi tanımlar.
    +
    + + + +

    Seçimlik paketler

    +

    Buradaki seçenekler seçimlik paketleri tanımlamak için kullanılır.

    + +

    Genel sözdizimi

    +

    Bir seçimlik paketi tanımlamak için genellikle şöyle bir sözdizimi + kullanılır:

    + +
    +
    --with-paket[=değer]
    +
    paket paketi kullanılır. Öntanımlı + değer yes’tir.
    + +
    --without-paket
    +
    paket paketi kullanılmaz. Öntanımlı + değer no’dur. Bu seçenek + autoconf tarafından sağlanmıştır ve Apache HTTP + Sunucusu için pek yararlı değildir.
    +
    + + + + +

    Özel paketler

    +
    +
    --with-apr=dizin|dosya
    +
    → Apache Taşınabilir Arayüzü (APR) + httpd kaynak paketinin bir parçası olup HTTP Sunucu ile birlikte + derlenir. Eğer kendi kurulu APR’nizi kullanmak isterseniz bunu + configure betiğine apr-config betiğinin + yolunu belirterek ifade edebilirsiniz. Kurulu APR için bid dizin, + dosya ismi veya mutlak dosya yolu belirtebilirsiniz. + apr-config ya belirttiğiniz dizinde ya da + bin alt dizininde bulunmalıdır.
    + +
    --with-apr-util=dizin|dosya
    +
    Apache Taşınabilir Arayüzü Araçları (APU) httpd kaynak paketinin + bir parçası olup HTTP Sunucu ile birlikte derlenir. Eğer kendi + kurulu APU’nuzu kullanmak isterseniz bunu configure + betiğine apu-config betiğinin yolunu belirterek ifade + edebilirsiniz. Kurulu APR için bir dizin, dosya ismi veya mutlak + dosya yolu belirtebilirsiniz. apr-config ya + belirttiğiniz dizinde ya da bin alt dizininde + bulunmalıdır.
    + +
    --with-ssl=dizin
    +
    mod_ssl modülü etkinse configure + betiği kurulu bir OpenSSL arayacaktır. Kendi SSL/TLS kurulumunuzun + yolunu bu seçenekle belirtebilirsiniz.
    + +
    --with-z=dizin
    +
    Yapılandırmanız gerektirdiği takdirde (örneğin, + mod_deflate etkinse) configure betiği + kurulu zlib kütüphanesinin yerini tespit etmeye + çalışacaktır. Kendi sıkıştırma kütüphanenizin yerini bu seçenekle + belirtebilirsiniz.
    +
    + +

    Apache HTTP Sunucusunun çeşitli bölümleri, + mod_authn_dbm modülü ve mod_rewrite + modülünün RewriteMap + yönergesi bilgilere erişimi hızlandırmak için basit anahtar/değer + veritabanları kullanırlar. SDBM, APU içinde mevcut olduğundan bu + veritabanı her zaman kullanılabilir durumdadır. Eğer başka veritabanı + türleri kullanmak isterseniz aşağıdaki seçeneklerle bunları etkin + kılabilirsiniz:

    + +
    +
    --with-gdbm[=dizin-yolu]
    +
    Bir dizin-yolu belirtilmemişse + configure betiği GNU DBM kurulumunun kütüphanelerini ve + başlık dosyalarını bulunması olası yerlerde arar. Bir + dizin-yolu belirtilmişse + configure betiği kurulumun kütüphanelerini + dizin-yolu/lib altında, başlık dosyalarını + ise dizin-yolu/include altında arayacaktır. + Bundan başka, başlık ve kütüphane dosyalarının bulundukları yerler + iki nokta imi ile ayrılarak dizin-yolu + olarak belirtilebilir.
    + +
    --with-ndbm[=dizin-yolu]
    +
    New DBM kurulumunu araştırması dışında --with-gdbm + seçeneği gibidir.
    + +
    --with-berkeley-db[=dizin-yolu]
    +
    Berkeley DB kurulumunu araştırması dışında + --with-gdbm seçeneği gibidir.
    +
    + +

    Bilginize

    +

    DBM seçenekleri APU tarafından sağlanmış olup onun yapılandırma + betiğine aktarılır. Bu seçenekler --with-apr-util + seçeneği ile tanımlanmış bir kurulu APU varsa kullanışlı olur.

    +

    HTTP sunucunuz ile birlikte birden fazla DBM gerçeklenimi + kullanabilirsiniz. Kullanılacak DBM türünü her zaman çalışma anı + yapılandırmanızla yapılandırabilirsiniz.

    +
    + + + +

    Destek programları için seçenekler

    +
    +
    --enable-static-support
    +
    Destek programlarını durağan ilintili olarak derler. Yani + çalıştırılabilirin kullandığı bütün kütüphaneler kodla + bütünleştirilir. Bu seçenek belirtilmedikçe destek programları daima + devingen ilintili olarak derlenir.
    + +
    --enable-suexec
    +
    Çatallanan sürecin kullanıcı ve grup kimliklerinin + değiştirilebilmesini sağlayan suexec programının + kullanımını etkinleştirir. Sunucunuz üzerinde suid biti + etkinleştirilmiş bir program çalıştırmanın sistem güvenliğinde + yaratacağı sorunlar hakkında bir fikriniz yoksa bu seçeneği + etkinleştirmeyin. suexec yapılandırma + seçenekleri aşağıda açıklanmıştır.
    +
    + +

    Tek bir destek programını aşağıdaki seçenekleri kullanarak bir durağan + ilintili çalıştırılabilir olarak derleyebilirsiniz:

    + +
    +
    --enable-static-ab
    +
    ab programının durağan ilintili sürümü + derlenir.
    + + +
    --enable-static-checkgid
    +
    checkgid programının durağan ilintili sürümü + derlenir.
    + +
    --enable-static-htdbm
    +
    htdbm programının durağan ilintili sürümü + derlenir.
    + +
    --enable-static-htdigest
    +
    htdigest programının durağan ilintili sürümü + derlenir.
    + +
    --enable-static-htpasswd
    +
    htpasswd programının durağan ilintili sürümü + derlenir.
    + +
    --enable-static-logresolve
    +
    logresolve programının durağan ilintili sürümü + derlenir.
    + +
    --enable-static-rotatelogs
    +
    rotatelogs programının durağan ilintili sürümü + derlenir.
    +
    + +

    suexec yapılandırma seçenekleri

    + + +

    Aşağıdaki seçeneklerle suexec programının + davranışı hassas bir şekilde ayarlanabilir. Daha ayrıntılı bilgi için + suEXEC yapılandırması ve kurulumuna + bakınız.

    + +
    +
    --with-suexec-bin
    +
    Bu seçenek ile suexec çalıştırılabilirinin yeri + belirtilir. Öntanımlı olarak --sbindir ile belirtilen + dizine kurulur (Kurulum dizinlerinde + ince ayar konusuna bakınız).
    + +
    --with-suexec-caller
    +
    Bu seçenek ile suexec’i çalıştırabilecek + kullanıcı belirtilir. Normalde httpd programını + çalıştıran kullanıcı olmalıdır.
    + +
    --with-suexec-docroot
    +
    Bu seçenek ile suexec'e erişebilecek + çalıştırılabilirlerin altında bulunacağı dizin belirtilir. + --datadir/htdocs öntanımlıdır.
    + +
    --with-suexec-gidmin
    +
    suexec için hedef kullanıcı olmasına izin + verilen en küçük grup kimliğini tanımlamak için kullanılır. 100 + öntanımlıdır.
    + +
    --with-suexec-logfile
    +
    suexec günlük dosyasının ismi belirtilir. + Öntanımlı olarak bu dosyanın ismi suexec_log olup + --logfiledir seçeneği ile belirtilen dizin altında + bulunur.
    + +
    --with-suexec-safepath
    +
    suexec tarafından çalıştırılacak süreçlerin + çalıştırılabilirlerinin bulunabileceği dizinleri PATH + ortam değişkenine tanımlamak için kullanılır. + /usr/local/bin:/usr/bin:/bin öntanımlıdır.
    + +
    --with-suexec-userdir
    +
    Bu seçenek, kullanıcı dizinleri altında suexec + tarafından çalıştırılacak süreçlerin çalıştırılabilirlerinin + bulunabileceği alt dizini tanımlar. suexec + programını (mod_userdir tarafından sağlanan) + kullanıcıya özel dizinlerde kullanmak istediğinizde bu gereklidir. + public_html alt dizini öntanımlıdır.
    + +
    --with-suexec-uidmin
    +
    suexec için hedef kullanıcı olmasına izin + verilen en küçük kullanıcı kimliğini tanımlamak için kullanılır. + 100 öntanımlıdır.
    + +
    --with-suexec-umask
    +
    suexec tarafından çalıştırılacak süreçler için + umask tanımlar. Sisteminiz için geçerli ayarlar + öntanımlıdır.
    +
    + + +
    top
    +
    +

    Ortam Değişkenleri

    +

    configure betiğinin yerleri ve isimleri standartlara uygun + olmayan kütüphaneleri ve programları bulmasını yardımcı olan veya + configure betiği tarafından yapılan bazı seçimleri + değiştirmenizi sağlayacak bazı ortam değişkenleri vardır.

    + + +
    +
    CC
    +
    Bu değişkenle derleme sırasında kullanılacak C derleyici komutu + tanımlanır.
    + +
    CFLAGS
    +
    Bu değişkenle derleme sırasında kullanılacak C derleyici seçenekleri + tanımlanır.
    + +
    CPP
    +
    Bu değişkenle derleme sırasında kullanılacak C önişlemci komutu + tanımlanır.
    + +
    CPPFLAGS
    +
    C/C++ önişlemci seçenekleri tanımlanır. Örneğin, eğer başlık + dosyaları standart yerlerinde değil de + includedir dizinindeyse bunu + -Iincludedir seçeneği olarak + belirtebilirsiniz.
    + +
    LDFLAGS
    +
    İlintileyici seçenekleri tanımlanır. Örneğin, eğer kütüphane + dosyalarınız standart yerlerinde değil de + libdir dizinindeyse bunu + -Llibdir seçeneği olarak belirtebilirsiniz.
    +
    +
    +
    +

    Mevcut Diller:  en  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/dbmmanage.html b/rubbos/app/httpd-2.0.64/docs/manual/programs/dbmmanage.html new file mode 100644 index 00000000..dcbee7ab --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/dbmmanage.html @@ -0,0 +1,13 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: dbmmanage.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: dbmmanage.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: dbmmanage.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/dbmmanage.html.en b/rubbos/app/httpd-2.0.64/docs/manual/programs/dbmmanage.html.en new file mode 100644 index 00000000..bd533d1f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/dbmmanage.html.en @@ -0,0 +1,193 @@ + + + +dbmmanage - Manage user authentication files in DBM format - Apache HTTP Server + + + + + +
    <-
    +

    dbmmanage - Manage user authentication files in DBM format

    +
    +

    Available Languages:  en  | + ko  | + tr 

    +
    + +

    dbmmanage is used to create and update the DBM format files + used to store usernames and password for basic authentication of HTTP users + via mod_auth_dbm. + Resources available from the Apache HTTP server can be restricted to just + the users listed in the files created by dbmmanage. This + program can only be used when the usernames are stored in a DBM file. To + use a flat-file database see htpasswd.

    + +

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

    +
    + +
    top
    +
    +

    Synopsis

    +

    dbmmanage [ encoding ] + filename add|adduser|check|delete|update + username + [ encpasswd + [ group[,group...] + [ comment ] ] ]

    + +

    dbmmanage filename + view [ username ]

    + +

    dbmmanage filename import

    +
    top
    +
    +

    Options

    +
    +
    filename
    +
    The filename of the DBM format file. Usually without the extension + .db, .pag, or .dir.
    + +
    username
    +
    The user for which the operations are performed. The username + may not contain a colon (:).
    + +
    encpasswd
    +
    This is the already encrypted password to use for the + update and add commands. You may use a hyphen + (-) if you want to get prompted for the password, but fill + in the fields afterwards. Additionally when using the update + command, a period (.) keeps the original password + untouched.
    + +
    group
    +
    A group, which the user is member of. A groupname may not contain a + colon (:). You may use a hyphen (-) if you don't + want to assign the user to a group, but fill in the comment field. + Additionally when using the update command, a period + (.) keeps the original groups untouched.
    + +
    comment
    +
    This is the place for your opaque comments about the user, like + realname, mailaddress or such things. The server will ignore this + field.
    +
    + +

    Encodings

    +
    +
    -d
    +
    crypt encryption (default, except on Win32, Netware)
    + +
    -m
    +
    MD5 encryption (default on Win32, Netware)
    + +
    -s
    +
    SHA1 encryption
    + +
    -p
    +
    plaintext (not recommended)
    +
    + + +

    Commands

    +
    +
    add
    +
    Adds an entry for username to filename using the + encrypted password encpasswd. + +

    dbmmanage passwords.dat add rbowen foKntnEF3KSXA

    +
    + +
    adduser
    +
    Asks for a password and then adds an entry for username to + filename. + +

    dbmmanage passwords.dat adduser krietz

    +
    + +
    check
    +
    Asks for a password and then checks if username is in + filename and if it's password matches the specified one. + +

    dbmmanage passwords.dat check rbowen

    +
    + +
    delete
    +
    Deletes the username entry from filename. + +

    dbmmanage passwords.dat delete rbowen

    +
    + +
    import
    +
    Reads username:password entries + (one per line) from STDIN and adds them to + filename. The passwords already have to be crypted.
    + +
    update
    +
    Same as the adduser command, except that it makes + sure username already exists in filename. + +

    dbmmanage passwords.dat update rbowen

    +
    + +
    view
    +
    Just displays the contents of the DBM file. If you specify a + username, it displays the particular record only. + +

    dbmmanage passwords.dat view

    +
    +
    + +
    top
    +
    +

    Bugs

    +

    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 filename is the same format that dbmmanage + expects to see. dbmmanage 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.

    + +

    dbmmanage has a list of DBM format preferences, defined by + the @AnyDBM::ISA array near the beginning of the program. Since + we prefer the Berkeley DB 2 file format, the order in which + dbmmanage will look for system libraries is Berkeley DB 2, + then NDBM, then GDBM and then SDBM. The first library found will be the + library dbmmanage will attempt to use for all DBM file + transactions. This ordering is slightly different than the standard + @AnyDBM::ISA ordering in Perl, as well as the ordering used by + the simple dbmopen() 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.

    + +

    One can usually use the file program supplied with most + Unix systems to see what format a DBM file is in.

    +
    +
    +

    Available Languages:  en  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/dbmmanage.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/programs/dbmmanage.html.ko.euc-kr new file mode 100644 index 00000000..ce51e388 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/dbmmanage.html.ko.euc-kr @@ -0,0 +1,174 @@ + + + +dbmmanage - DBM Çü½ÄÀÇ »ç¿ëÀÚÀÎÁõ ÆÄÀÏÀ» °ü¸®ÇÑ´Ù - Apache HTTP Server + + + + + +
    <-
    +

    dbmmanage - DBM Çü½ÄÀÇ »ç¿ëÀÚÀÎÁõ ÆÄÀÏÀ» °ü¸®ÇÑ´Ù

    +
    +

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

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

    dbmmanage´Â HTTP basic authentication¿¡ + »ç¿ëÇÒ »ç¿ëÀÚ¸í°ú ¾ÏÈ£¸¦ ÀúÀåÇÏ´Â DBMÇü½ÄÀÇ ÆÄÀÏÀ» ¸¸µé°í + ¼öÁ¤ÇÑ´Ù. ¾ÆÆÄÄ¡ À¥¼­¹ö´Â ÀÚ¿øÀ» dbmmanage·Î + ¸¸µç ÆÄÀÏ¿¡ ±â·ÏÇÑ »ç¿ëÀÚ¿¡°Ô¸¸ º¸¿©ÁÙ ¼ö ÀÖ´Ù. »ç¿ëÀÚ¸íÀÌ + DBM ÆÄÀÏ¿¡ ±â·ÏµÇÀÖÀ»¶§¸¸ ÀÌ ÇÁ·Î±×·¥À» »ç¿ëÇÒ ¼ö ÀÖ´Ù. + ÀϹÝÆÄÀÏÀ» µ¥ÀÌÅͺ£À̽º·Î »ç¿ëÇÏ·Á¸é htpasswd¸¦ Âü°íÇ϶ó.

    + +

    ÀÌ manpage´Â ¸í·ÉÇà ¿É¼Ç¸¸À» ¼³¸íÇÑ´Ù. httpd¿¡¼­ »ç¿ëÀÚÀÎÁõÀ» ¼³Á¤ÇÏ´Â Áö½Ã¾î¿¡ + ´ëÇÑ ¼³¸íÀº ¾ÆÆÄÄ¡ ¹èÆ÷º»¿¡ Æ÷ÇÔµÇÀÖ°í http://httpd.apache.org/¿¡¼­µµ + º¼ ¼ö ÀÖ´Â ¾ÆÆÄÄ¡ ¼³¸í¼­¸¦ Âü°íÇ϶ó.

    +
    + +
    top
    +
    +

    °³¿ä

    +

    dbmmanage [ encoding ] + filename add|adduser|check|delete|update + username + [ encpasswd + [ group[,group...] + [ comment ] ] ]

    + +

    dbmmanage filename + view [ username ]

    + +

    dbmmanage filename import

    +
    top
    +
    +

    ¿É¼Ç

    +
    +
    filename
    +
    DBMÇü½Ä ÆÄÀÏÀÇ ÆÄÀϸí. º¸Åë .db, + .pag, .dir È®ÀåÀÚ¸¦ »«´Ù.
    + +
    username
    +
    ÀÛ¾÷ÇÒ »ç¿ëÀÚ¸í. username¿¡ ÄÝ·Ð(:)À» + »ç¿ëÇÒ ¼ö ¾ø´Ù.
    + +
    encpasswd
    +
    update³ª add ¸í·É¿¡ »ç¿ëÇÒ + ÀÌ¹Ì ¾ÏȣȭµÈ ¾ÏÈ£ÀÌ´Ù. ¾ÏÈ£¸¦ ³ªÁß¿¡ ÁöÁ¤ÇÏ°í ½ÍÀº °æ¿ì + »©±â±âÈ£(-)¸¦ »ç¿ëÇÑ´Ù. ¶Ç, update + ¸í·ÉÀ» »ç¿ëÇÒ¶§ ¸¶Ä§Ç¥(.)¸¦ »ç¿ëÇÏ¸é ¿ø·¡ + ¾ÏÈ£¸¦ ±×´ë·Î µÐ´Ù.
    + +
    group
    +
    »ç¿ëÀÚ°¡ ¼ÓÇÑ ±×·ì. ±×·ì¸í¿¡ ÄÝ·Ð(:)À» + »ç¿ëÇÒ ¼ö ¾ø´Ù. »ç¿ëÀÚ¸¦ ±×·ì¿¡ Ãß°¡ÇÏÁö´Â ¾ÊÁö¸¸ ¼³¸í¶õÀ» + ä¿ì°í ½Í´Ù¸é »©±â±âÈ£(-)¸¦ »ç¿ëÇÑ´Ù. ¶Ç, + update ¸í·ÉÀ» »ç¿ëÇÒ¶§ ¸¶Ä§Ç¥(.)¸¦ + »ç¿ëÇÑ´Ù¸é ¿ø·¡ ±×·ìÀ» ±×´ë·Î µÐ´Ù.
    + +
    comment
    +
    ½ÇÁ¦ À̸§, ¸ÞÀÏ ÁÖ¼Ò µî »ç¿ëÀÚ¿¡ ´ëÇÑ ¼³¸íÀ» Àû´Â ¶õÀÌ´Ù. + ¼­¹ö´Â ÀÌ Ç׸ñÀ» ¹«½ÃÇÑ´Ù.
    +
    + +

    ÀÎÄÚµù

    +
    +
    -d
    +
    crypt ¾Ïȣȭ (Win32³ª Netware°¡ ¾Æ´Ï¶ó¸é ±âº»°ª)
    + +
    -m
    +
    MD5 ¾Ïȣȭ (Win32°ú Netware¿¡¼­ ±âº»°ª)
    + +
    -s
    +
    SHA1 ¾Ïȣȭ
    + +
    -p
    +
    ¾ÏÈ£¸¦ ±×´ë·Î ±â·Ï (ÃßõÇÏÁö ¾ÊÀ½)
    +
    + + +

    ¸í·É

    +
    +
    add
    +
    ¾ÏȣȭµÈ ¾ÏÈ£ encpasswd¸¦ »ç¿ëÇÏ¿© + filename¿¡ username Ç׸ñÀ» Ãß°¡ÇÑ´Ù.
    + +
    adduser
    +
    ¾ÏÈ£¸¦ ¹°¾îº¸°í filename¿¡ + username Ç׸ñÀ» Ãß°¡ÇÑ´Ù.
    + +
    check
    +
    ¾ÏÈ£¸¦ ¹°¾îº»ÈÄ filename¿¡ + usernameÀÌ ÀÖ°í ¾ÏÈ£°¡ ÀÏÄ¡ÇÏ´ÂÁö °Ë»çÇÑ´Ù.
    + +
    delete
    +
    filename¿¡¼­ username Ç׸ñÀ» + »èÁ¦ÇÑ´Ù.
    + +
    import
    +
    STDIN¿¡¼­ + username:password Ç׸ñÀ» + (ÇÑÁÙ¿¡ Çϳª¾¿) Àо filename¿¡ Ãß°¡ÇÑ´Ù. + ¾ÏÈ£´Â ÀÌ¹Ì ¾ÏȣȭµÇÀÖ¾î¾ß ÇÑ´Ù.
    + +
    update
    +
    adduser ¸í·É°ú ºñ½ÁÇÏÁö¸¸, + filename¿¡ ÀÌ¹Ì usernameÀÌ ÀÖ´ÂÁö + È®ÀÎÇÑ´Ù.
    + +
    view
    +
    DBM ÆÄÀÏ ³»¿ëÀ» Ãâ·ÂÇÑ´Ù. usernameÀ» + ÁöÁ¤Çϸé ƯÁ¤ Ç׸ñ¸¸À» Ãâ·ÂÇÑ´Ù.
    +
    + +
    top
    +
    +

    ¹ö±×

    +

    ¿©·¯ ´Ù¸¥ DBM ÆÄÀÏÇü½ÄµéÀÌ ÀÖ°í ´ç½ÅÀÇ ½Ã½ºÅÛ¿¡ ¿©·¯ + Çü½Ä¿¡ ´ëÇÑ ºñ½ÁÇÑ ¶óÀ̺귯¸®µéÀÌ ÀÖÀ½À» ÁÖÀÇÇØ¾ß ÇÑ´Ù. + °¡Àå ´ëÇ¥ÀûÀÎ ³×°¡Áö°¡ SDBM, NDBM, GNU ÇÁ·ÎÁ§Æ®ÀÇ GDBM, + Berkeley DB 2ÀÌ´Ù. ºÒÇàÈ÷µµ ÀÌ ¶óÀ̺귯¸®µéÀº ¸ðµÎ ´Ù¸¥ + ÆÄÀÏÇü½ÄÀ» »ç¿ëÇÑ´Ù. ±×·¡¼­ filenameÀÌ »ç¿ëÇÏ´Â + ÆÄÀÏÇü½ÄÀÌ dbmmanage°¡ ¿øÇÏ´Â Çü½Ä°ú °°ÀºÁö + È®ÀÎÇØ¾ß ÇÑ´Ù. dbmmanage´Â DBM ÆÄÀÏÀÇ Çü½ÄÀ» + ¾Ë¾Æ³»Áö ¸øÇÑ´Ù. ´Ù¸¥ Çü½ÄÀ» »ç¿ëÇÏ¸é ¾Æ¹«Àϵµ ÇÏÁö ¾Ê°Å³ª, + ´Ù¸§ À̸§ÀÇ DBM ÆÄÀÏÀ» ¸¸µé°Å³ª, ÃÖ¾ÇÀÇ °æ¿ì ÆÄÀÏÀ» ±â·ÏÇÏ¿© + DBM ÆÄÀÏÀ» ¸ÁÄ¥ ¼ö ÀÖ´Ù.

    + +

    dbmmanage ÇÁ·Î±×·¥ ¾ÕºÎºÐ¿¡ ÀÖ´Â + @AnyDBM::ISA ¹è¿­ÀÌ DBMÇü½Ä ¼±È£¼ø¼­ÀÌ´Ù. + ¿ì¸®´Â Berkeley DB 2 ÆÄÀÏÇü½ÄÀ» ¼±È£ÇϹǷΠ+ dbmmanage°¡ ½Ã½ºÅÛ ¶óÀ̺귯¸®¸¦ ã´Â ¼ø¼­´Â + Berkeley DB 2, NDBM, GDBM, SDBM ¼øÀÌ´Ù. dbmmanage´Â + Á¦ÀÏ ¸ÕÀú ãÀº ¶óÀ̺귯¸®¸¦ »ç¿ëÇÏ¿© ¸ðµç DBM ÆÄÀÏ ÀÛ¾÷À» + ÇÑ´Ù. ÀÌ ¼ø¼­´Â PerlÀÇ °£´ÜÇÑ dbmopen() È£ÃâÀÌ + »ç¿ëÇÏ´Â ¼ø¼­³ª PerlÀÇ Ç¥ÁØ @AnyDBM::ISA ¼ø¼­¿Í + Á¶±Ý ´Ù¸£´Ù. ±×·¡¼­ ´Ù¸¥ µµ±¸¸¦ »ç¿ëÇÏ¿© DBM ÆÄÀÏÀ» °ü¸®ÇÑ´Ù¸é + ÀÌ ¼ø¼­¸¦ µû¶ó¾ß ÇÑ´Ù. C¿Í °°ÀÌ ´Ù¸¥ ¾ð¾î·Î ÀÛ¼ºÇÑ ÇÁ·Î±×·¥À» + »ç¿ëÇÏ¿© ÆÄÀÏÀ» ´Ù·ç´Â °æ¿ì¿¡µµ ¸¶Âù°¡Áö´Ù.

    + +

    ´ëºÎºÐÀÇ À¯´Ð½º ½Ã½ºÅÛ¿¡¼­ file ÇÁ·Î±×·¥À¸·Î + DBM ÆÄÀÏÇü½ÄÀ» È®ÀÎÇÒ ¼ö ÀÖ´Ù.

    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/dbmmanage.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/programs/dbmmanage.html.tr.utf8 new file mode 100644 index 00000000..76168af2 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/dbmmanage.html.tr.utf8 @@ -0,0 +1,209 @@ + + + +dbmmanage - DBM biçemli kullanıcı kimlik doğrulama dosyalarını yönetir - Apache HTTP Sunucusu + + + + + +
    <-
    +

    dbmmanage - DBM biçemli kullanıcı kimlik doğrulama dosyalarını yönetir

    +
    +

    Mevcut Diller:  en  | + ko  | + tr 

    +
    + +

    dbmmanage, + mod_auth_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 dbmmanage 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 + htpasswd sayfasına bakınız.

    + +

    Bu kılavuz sayfası sadece komut satırı değiştirgelerini listeler. + Kullanıcı kimlik doğrulamasını + httpd'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.

    +
    +

    Ayrıca bakınız:

    +
    top
    +
    +

    Kullanım

    +

    dbmmanage [ kodlama ] + dosyaismi add|adduser|check|delete|update + kullanıcı + [ şifreli_parola + [ grup[,grup...] + [ açıklama ] ] ]

    + +

    dbmmanage dosyaismi + view [ kullanıcı ]

    + +

    dbmmanage dosyaismi import

    +
    top
    +
    +

    Seçenekler

    +
    +
    dosyaismi
    +
    DBM dosyasının ismi. Genellikle, .db, .pag + veya .dir eklentisi olmaksızın belirtilir.
    + +
    kullanıcı
    +
    İşlemleri gerçekleştirecek kullanıcı ismi. + kullanıcı ismi ikinokta imi (:) + içeremez.
    + +
    şifreli_parola
    +
    update ve + add 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, update komutunu kullanırken özgün + parolaya dokunulmaması için bir nokta imi (.) + kullanabilirsiniz.
    + +
    grup
    +
    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, update komutunu kullanırken + özgün gruba dokunulmaması için bir nokta imi (.) + kullanabilirsiniz.
    + +
    açıklama
    +
    Adı ve soyadı, eposta adresi gibi kullanıcıyla ilgili bir takım + bilgiler buraya yazılır. Sunucu bu alanı gözardı eder.
    +
    + +

    Kodlamalar

    +
    +
    -d
    +
    CRYPT şifrelemesi (Win32 ve Netware hariç, öntanımlı)
    + +
    -m
    +
    MD5 şifrelemesi (Win32 ve Netware için öntanımlı)
    + +
    -s
    +
    SHA1 şifrelemesi
    + +
    -p
    +
    düz metin (önerilmez)
    +
    + + +

    Komutlar

    +
    +
    add
    +
    şifreli_parola'yı kullanarak + dosyaismi dosyasına + kullanıcı için bir girdi ekler. + +

    dbmmanage passwords.dat add rbowen foKntnEF3KSXA

    +
    + +
    adduser
    +
    Parola sorduktan sonra dosyaismi + dosyasına kullanıcı için bir girdi ekler. + +

    dbmmanage passwords.dat adduser krietz

    +
    + +
    check
    +
    Parola sorduktan sonra belirtilen kullanıcı, + dosyaismi dosyasında var mı diye bakar; varsa + belirtilen parolayı kullanıcınınkiyle eşleştirmeye çalışır. + +

    dbmmanage passwords.dat check rbowen

    +
    + +
    delete
    +
    dosyaismi dosyasından + kullanıcı girdisini siler. + +

    dbmmanage passwords.dat delete rbowen

    +
    + +
    import
    +
    Standart girdiden + kullanıcı:parola satırlarını (her + satırda bir tane) okur ve bunları dosyaismi + dosyasına ekler. Parola şifrelenmiş olmalıdır.
    + +
    update
    +
    Belirtilen kullanıcı'nın + dosyaismi dosyasında mevcut olması dışında + adduser komutu gibidir. + +

    dbmmanage passwords.dat update rbowen

    +
    + +
    view
    +
    Sadece, DBM dosyasının içeriğini gösterir. Bir + kullanıcı belirtirseniz sadece o kaydı + gösterir. + +

    dbmmanage passwords.dat view

    +
    +
    + +
    top
    +
    +

    Hatalar

    +

    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, dosyaismi dosyasında kullanılan dosya + biçeminin dbmmanage tarafından kullanılanla + aynı biçemde olduğundan emin olmalısınız. + dbmmanage 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.

    + +

    dbmmanage 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 dbmmanage sistem + kütüphanelerini şu sıraya göre arar: Berkeley DB 2, NDBM, GDBM ve SDBM. + dbmmanage 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.

    + +

    Unix sistemlerinde, kullanılan DBM dosyasının biçemini öğrenmek için + file programı kullanılabilir.

    +
    +
    +

    Mevcut Diller:  en  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/htdbm.html b/rubbos/app/httpd-2.0.64/docs/manual/programs/htdbm.html new file mode 100644 index 00000000..9adf3229 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/htdbm.html @@ -0,0 +1,9 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: htdbm.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: htdbm.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/htdbm.html.en b/rubbos/app/httpd-2.0.64/docs/manual/programs/htdbm.html.en new file mode 100644 index 00000000..08d9e536 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/htdbm.html.en @@ -0,0 +1,283 @@ + + + +htdbm - Manipulate DBM password databases - Apache HTTP Server + + + + + +
    <-
    +

    htdbm - Manipulate DBM password databases

    +
    +

    Available Languages:  en  | + tr 

    +
    + +

    htdbm is used to manipulate the DBM format files used to + store usernames and password for basic authentication of HTTP users via + mod_auth_dbm. See the dbmmanage + documentation for more information about these DBM files.

    +
    + +
    top
    +
    +

    Synopsis

    +

    htdbm + [ -TDBTYPE ] + [ -c ] + [ -m | + -d | + -p | + -s ] + [ -t ] + [ -v ] + [ -x ] + filename username

    + +

    htdbm -b + [ -TDBTYPE ] + [ -c ] + [ -m | + -d | + -p | + -s ] + [ -t ] + [ -v ] + filename username password

    + +

    htdbm -n + [ -c ] + [ -m | + -d | + -p | + -s ] + [ -t ] + [ -v ] + username

    + +

    htdbm -nb + [ -c ] + [ -m | + -d | + -p | + -s ] + [ -t ] + [ -v ] + username password

    + +

    htdbm -v + [ -TDBTYPE ] + [ -c ] + [ -m | + -d | + -p | + -s ] + [ -t ] + [ -v ] + filename username

    + +

    htdbm -vb + [ -TDBTYPE ] + [ -c ] + [ -m | + -d | + -p | + -s ] + [ -t ] + [ -v ] + filename username password

    + +

    htdbm -x + [ -TDBTYPE ] + [ -m | + -d | + -p | + -s ] + filename username

    + +

    htdbm -l + [ -TDBTYPE ] +

    +
    top
    +
    +

    Options

    +
    +
    -b
    +
    Use batch mode; i.e., get the password from the command line + rather than prompting for it. This option should be used with extreme care, + since the password is clearly visible on the command + line.
    + +
    -c
    +
    Create the passwdfile. If passwdfile already + exists, it is rewritten and truncated. This option cannot be combined with + the -n option.
    + +
    -n
    +
    Display the results on standard output rather than updating a + database. This option changes the syntax of the command line, since the + passwdfile argument (usually the first one) is omitted. It + cannot be combined with the -c option.
    + +
    -m
    +
    Use MD5 encryption for passwords. On Windows, Netware and TPF, this is + the default.
    + +
    -d
    +
    Use crypt() encryption for passwords. The default on all + platforms but Windows, Netware and TPF. Though possibly supported by + htdbm on all platforms, it is not supported by the + httpd server on Windows, Netware and TPF.
    + +
    -s
    +
    Use SHA encryption for passwords. Facilitates migration from/to Netscape + servers using the LDAP Directory Interchange Format (ldif).
    + +
    -p
    +
    Use plaintext passwords. Though htdbm will support + creation on all platforms, the httpd daemon will + only accept plain text passwords on Windows, Netware and TPF.
    + +
    -l
    +
    Print each of the usernames and comments from the database on + stdout.
    + +
    -t
    +
    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.
    + +
    -v
    +
    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.
    + +
    -x
    +
    Delete user. If the username exists in the specified DBM file, it + will be deleted.
    + +
    filename
    +
    The filename of the DBM format file. Usually without the extension + .db, .pag, or .dir. If + -c is given, the DBM file is created if it does not already + exist, or updated if it does exist.
    + +
    username
    +
    The username to create or update in passwdfile. If + username does not exist in this file, an entry is added. If it + does exist, the password is changed.
    + +
    password
    +
    The plaintext password to be encrypted and stored in the DBM file. + Used only with the -b flag.
    + +
    -TDBTYPE
    +
    Type of DBM file (SDBM, GDBM, DB, or "default").
    +
    +
    top
    +
    +

    Bugs

    +

    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 filename is the same format that + htdbm expects to see. htdbm 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.

    + +

    One can usually use the file program supplied with most + Unix systems to see what format a DBM file is in.

    +
    top
    +
    +

    Exit Status

    +

    htdbm returns a zero status ("true") if the username and + password have been successfully added or updated in the DBM File. + htdbm returns 1 if it encounters some problem + accessing files, 2 if there was a syntax problem with the + command line, 3 if the password was entered interactively and + the verification entry didn't match, 4 if its operation was + interrupted, 5 if a value is too long (username, filename, + password, or final computed record), 6 if the username + contains illegal characters (see the Restrictions + section), and 7 if the file is not a valid DBM password + file.

    +
    top
    +
    +

    Examples

    +

    + htdbm /usr/local/etc/apache/.htdbm-users jsmith +

    + +

    Adds or modifies the password for user jsmith. The user + is prompted for the password. If executed on a Windows system, the password + will be encrypted using the modified Apache MD5 algorithm; otherwise, the + system's crypt() routine will be used. If the file does not + exist, htdbm will do nothing except return an error.

    + +

    + htdbm -c /home/doe/public_html/.htdbm jane +

    + +

    Creates a new file and stores a record in it for user jane. + The user is prompted for the password. If the file exists and cannot be + read, or cannot be written, it is not altered and htdbm + will display a message and return an error status.

    + +

    + htdbm -mb /usr/web/.htdbm-all jones Pwd4Steve +

    + +

    Encrypts the password from the command line (Pwd4Steve) + using the MD5 algorithm, and stores it in the specified file.

    +
    top
    +
    +

    Security Considerations

    +

    Web password files such as those managed by htdbm should + not be within the Web server's URI space -- that is, they should + not be fetchable with a browser.

    + +

    The use of the -b option is discouraged, since when it is + used the unencrypted password appears on the command line.

    +
    top
    +
    +

    Restrictions

    +

    On the Windows and MPE platforms, passwords encrypted with + htdbm are limited to no more than 255 + characters in length. Longer passwords will be truncated to 255 + characters.

    + +

    The MD5 algorithm used by htdbm is specific to the Apache + software; passwords encrypted using it will not be usable with other Web + servers.

    + +

    Usernames are limited to 255 bytes and may not include the + character :.

    +
    +
    +

    Available Languages:  en  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/htdbm.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/programs/htdbm.html.tr.utf8 new file mode 100644 index 00000000..1819a437 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/htdbm.html.tr.utf8 @@ -0,0 +1,290 @@ + + + +htdbm - DBM parola veritabanlarını yönetir - Apache HTTP Sunucusu + + + + + +
    <-
    +

    htdbm - DBM parola veritabanlarını yönetir

    +
    +

    Mevcut Diller:  en  | + tr 

    +
    + +

    htdbm, + mod_auth_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 + dbmmanage sayfasına bakınız.

    +
    + +
    top
    +
    +

    Kullanım

    +

    htdbm + [ -TVTtürü ] + [ -c ] + [ -m | + -d | + -p | + -s ] + [ -t ] + [ -v ] + [ -x ] + parola-dosyası kullanıcı

    + +

    htdbm -b + [ -TVTtürü ] + [ -c ] + [ -m | + -d | + -p | + -s ] + [ -t ] + [ -v ] + parola-dosyası kullanıcı parola

    + +

    htdbm -n + [ -c ] + [ -m | + -d | + -p | + -s ] + [ -t ] + [ -v ] + kullanıcı

    + +

    htdbm -nb + [ -c ] + [ -m | + -d | + -p | + -s ] + [ -t ] + [ -v ] + kullanıcı parola

    + +

    htdbm -v + [ -TVTtürü ] + [ -c ] + [ -m | + -d | + -p | + -s ] + [ -t ] + [ -v ] + parola-dosyası kullanıcı

    + +

    htdbm -vb + [ -TVTtürü ] + [ -c ] + [ -m | + -d | + -p | + -s ] + [ -t ] + [ -v ] + parola-dosyası kullanıcı parola

    + +

    htdbm -x + [ -TVTtürü ] + [ -m | + -d | + -p | + -s ] + parola-dosyası kullanıcı

    + +

    htdbm -l + [ -TVTtürü ] +

    +
    top
    +
    +

    Seçenekler

    +
    +
    -b
    +
    Betik kipi; parola için istek yapmak yerine parola komut satırından + verilir. Parola komut satırında görünür olacağından çok + dikkatli kullanmak gerekir.
    + +
    -c
    +
    parola-dosyası oluşturur. Dosya mevcutsa, + dosya silinip yeniden yazılır. Bu seçenek + -n seçeneği ile birlikte kullanılamaz.
    + +
    -n
    +
    Sonuçları veritabanında güncellemek yerine standart çıktıya gönderir. + parola-dosyası belirtilmediğinden, bu seçenek + komut satırı sözdizimini değiştirir. Bu seçenek + -c seçeneği ile birlikte kullanılamaz.
    + +
    -m
    +
    Parolalar için MD5 şifrelemesi kullanılır. Windows, Netware ve TPF + için öntanımlıdır.
    + +
    -d
    +
    Parolaları şifrelemek için crypt() kullanılır. Windows, + Netware ve TPF dışında öntanımlıdır. + htdbm tarafından tüm platformlarda + destekleniyor olsa da Windows, Netware ve TPF üzerinde + httpd sunucusu tarafından desteklenmez.
    + +
    -s
    +
    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.
    + +
    -p
    +
    Düz metin parolalar kullanılır. htdbm + tarafından tüm platformlarda destekleniyor olsa da Windows, Netware ve + TPF üzerinde httpd sunucusu tarafından sadece düz + metin parolalar kabul edilir.
    + +
    -l
    +
    Veritabanındaki kullanıcıları açıklamalarıyla birlikte standart + çıktıya gönderir.
    + +
    -t
    +
    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.
    + +
    -v
    +
    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.
    + +
    -x
    +
    Kullanıcıyı siler. Kullanıcı belirtilen DBM dosyasında mevcutsa + silinir.
    + +
    parola-dosyası
    +
    DBM dosyasının ismi. Genellikle, .db, .pag + veya .dir eklentisi olmaksızın belirtilir. + -c seçeneği ile birlikte verilmişse ve DBM + dosyası mevcut değilse dosya oluşturulur, mevcutsa dosya güncellenir.
    + +
    kullanıcı
    +
    parola-dosyası'nda oluşturulacak veya + güncellenecek kullanıcı ismi. kullanıcı bu + dosyada mevcut değilse yeni bir girdi eklenir. Girdi mevcutsa parolası + değiştirilir.
    + +
    parola
    +
    Şifrelenip DBM dosyasında saklanacak düz metin parola. Sadece + -b seçeneği ile kullanılır.
    + +
    -T VTtürü
    +
    DBM dosyasının türü; SDBM, GDBM, DB, veya "default" olabilir.
    +
    +
    top
    +
    +

    Hatalar

    +

    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, dosyaismi + dosyasında kullanılan dosya biçeminin htdbm + tarafından kullanılanla aynı biçemde olduğundan emin olmalısınız. + htdbm 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.

    + +

    Unix sistemlerinde, kullanılan DBM dosyasının biçemini öğrenmek için + file programı kullanılabilir.

    +
    top
    +
    +

    Çıkış Durumu

    +

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

    +
    top
    +
    +

    Örnekler

    +

    + htdbm /usr/local/etc/apache/.htdbm-users jsmith +

    + +

    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 htdbm beklenen hiçbir işlemi + yapmadan bir hata vererek çıkar.

    + +

    + htdbm -c /home/doe/public_html/.htdbm jane +

    + +

    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 + htdbm bir ileti gösterip bir hata durumu + ile çıkar.

    + +

    + htdbm -mb /usr/web/.htdbm-all jones Pwd4Steve +

    + +

    Komut satırından verilen parolayı (Pwd4Steve) MD5 + algoritmasıyla şifreler ve bunu belirtilen dosyada saklar.

    +
    top
    +
    +

    Güvenlik Değerlendirmeleri

    +

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

    + +

    Komut satırında parolanın şifrelenmemiş olarak görünmesi sebebiyle + -b seçeneğinin kullanımından kaçınılmasını + öneriyoruz.

    +
    top
    +
    +

    Kısıtlamalar

    +

    Windows ve MPE platformlarında, htdbm + ile şifrelenen parolalar 255 karakterden daha uzun olamaz. + 255 karakterden sonrası kırpılır.

    + +

    htdbm tarafından kullanılan MD5 + algoritması Apache yazılımına özeldir; bu algoritma ile şifrelenen + parolalar başka HTTP sunucularında kullanılamayabilir.

    + +

    Kullanıcı isimleri 255 bayttan uzun olamaz ve iki nokta + imi (:) içeremez.

    +
    +
    +

    Mevcut Diller:  en  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/htdigest.html b/rubbos/app/httpd-2.0.64/docs/manual/programs/htdigest.html new file mode 100644 index 00000000..f2c56799 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/htdigest.html @@ -0,0 +1,13 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: htdigest.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: htdigest.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: htdigest.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/htdigest.html.en b/rubbos/app/httpd-2.0.64/docs/manual/programs/htdigest.html.en new file mode 100644 index 00000000..297fcc1d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/htdigest.html.en @@ -0,0 +1,74 @@ + + + +htdigest - manage user files for digest authentication - Apache HTTP Server + + + + + +
    <-
    +

    htdigest - manage user files for digest authentication

    +
    +

    Available Languages:  en  | + ko  | + tr 

    +
    + +

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

    + +

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

    +
    + +
    top
    +
    +

    Synopsis

    +

    htdigest [ -c ] + passwdfile realm username

    +
    top
    +
    +

    Options

    +
    +
    -c
    +
    Create the passwdfile. If passwdfile already + exists, it is deleted first.
    + +
    passwdfile
    +
    Name of the file to contain the username, realm and password. If + -c is given, this file is created if it does not already + exist, or deleted and recreated if it does exist.
    + +
    realm
    +
    The realm name to which the user name belongs.
    + +
    username
    +
    The user name to create or update in passwdfile. If + username does not exist is this file, an entry is added. If it + does exist, the password is changed.
    +
    +
    +
    +

    Available Languages:  en  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/htdigest.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/programs/htdigest.html.ko.euc-kr new file mode 100644 index 00000000..529dc662 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/htdigest.html.ko.euc-kr @@ -0,0 +1,77 @@ + + + +htdigest - digest authentication¿¡ »ç¿ëÇÒ »ç¿ëÀÚÆÄÀÏÀ» +°ü¸®ÇÑ´Ù - Apache HTTP Server + + + + + +
    <-
    +

    htdigest - digest authentication¿¡ »ç¿ëÇÒ »ç¿ëÀÚÆÄÀÏÀ» +°ü¸®ÇÑ´Ù

    +
    +

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

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

    htdigest´Â HTTP »ç¿ëÀÚÀÇ digest authentication¿¡ + »ç¿ëÇÒ »ç¿ëÀÚ¸í, ¿µ¿ª, ¾ÏÈ£¸¦ ÀúÀåÇÏ´Â ÀϹÝÆÄÀÏÀ» ¸¸µé°í + ¼öÁ¤ÇÑ´Ù. ¾ÆÆÄÄ¡ À¥¼­¹ö´Â ÀÚ¿øÀ» htdigest·Î + ¸¸µç ÆÄÀÏ¿¡ ±â·ÏÇÑ »ç¿ëÀÚ¿¡°Ô¸¸ º¸¿©ÁÙ ¼ö ÀÖ´Ù.

    + +

    ÀÌ manpage´Â ¸í·ÉÇà ¿É¼Ç¸¸À» ¼³¸íÇÑ´Ù. httpd¿¡¼­ digest authenticationÀ» + ¼³Á¤ÇÏ´Â Áö½Ã¾î¿¡ ´ëÇÑ ¼³¸íÀº ¾ÆÆÄÄ¡ ¹èÆ÷º»¿¡ Æ÷ÇÔµÇÀÖ°í + http://httpd.apache.org/¿¡¼­µµ + º¼ ¼ö ÀÖ´Â ¾ÆÆÄÄ¡ ¼³¸í¼­¸¦ Âü°íÇ϶ó.

    +
    + +
    top
    +
    +

    °³¿ä

    +

    htdigest [ -c ] + passwdfile realm username

    +
    top
    +
    +

    ¿É¼Ç

    +
    +
    -c
    +
    passwdfileÀ» ¸¸µç´Ù. passwdfileÀÌ + ÀÌ¹Ì ÀÖ´Ù¸é ¸ÕÀú Áö¿ì°í ¸¸µç´Ù.
    + +
    passwdfile
    +
    »ç¿ëÀÚ¸í, ¿µ¿ª, ¾ÏÈ£¸¦ ÀúÀåÇÒ ÆÄÀϸí. -c¸¦ + °°ÀÌ »ç¿ëÇÑ °æ¿ì ÆÄÀÏÀÌ ¾ø´Ù¸é ¸¸µé°í, ÀÖ´Ù¸é ÆÄÀÏÀ» Áö¿ì°í + ´Ù½Ã ¸¸µç´Ù.
    + +
    realm
    +
    »ç¿ëÀÚ¸íÀÌ ¼ÓÇÑ ¿µ¿ªÀ̸§.
    + +
    username
    +
    passwdfile¿¡ ¸¸µé°Å³ª ¼öÁ¤ÇÒ »ç¿ëÀÚ¸í. ÆÄÀÏ¿¡ + usernameÀÌ ¾ø´Ù¸é Ç׸ñÀ» Ãß°¡ÇÑ´Ù. ÀÖ´Ù¸é ¾ÏÈ£¸¦ + ¼öÁ¤ÇÑ´Ù.
    +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/htdigest.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/programs/htdigest.html.tr.utf8 new file mode 100644 index 00000000..d18ca6d6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/htdigest.html.tr.utf8 @@ -0,0 +1,78 @@ + + + +htdigest - Özet kimlik doğrulama dosyalarını yönetir - Apache HTTP Sunucusu + + + + + +
    <-
    +

    htdigest - Özet kimlik doğrulama dosyalarını yönetir

    +
    +

    Mevcut Diller:  en  | + ko  | + tr 

    +
    + +

    htdigest, 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 htdigest tarafından oluşturulan + dosyalarda listelenmiş kullanıcılara tahsis edilebilir.

    + +

    Bu kılavuz sayfası sadece komut satırı değiştirgelerini listeler. + Kullanıcı kimlik doğrulamasını + httpd'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.

    +
    +

    Ayrıca bakınız:

    +
    top
    +
    +

    Kullanım

    +

    htdigest [ -c ] + parola-dosyası bölge kullanıcı

    +
    top
    +
    +

    Seçenekler

    +
    +
    -c
    +
    parola-dosyası oluşturur. Dosya mevcutsa, + dosya silinip yeniden yazılır.
    + +
    parola-dosyası
    +
    Kullanıcı ismi, parola ve bölge bilgilerini içeren dosyanın ismi. + -c seçeneği verilmişse ve dosya mevcut + değilse oluşturulur, dosya mevcutsa silinip yeniden oluşturulur.
    + +
    bölge
    +
    Kullanıcının mensup olduğu bölge ismi.
    + +
    kullanıcı
    +
    parola-dosyası'nda oluşturulacak veya + güncellenecek kullanıcı ismi. kullanıcı bu + dosyada mevcut değilse yeni bir girdi eklenir. Girdi mevcutsa parolası + değiştirilir.
    +
    +
    +
    +

    Mevcut Diller:  en  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/htpasswd.html b/rubbos/app/httpd-2.0.64/docs/manual/programs/htpasswd.html new file mode 100644 index 00000000..919ac18a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/htpasswd.html @@ -0,0 +1,13 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: htpasswd.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: htpasswd.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: htpasswd.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/htpasswd.html.en b/rubbos/app/httpd-2.0.64/docs/manual/programs/htpasswd.html.en new file mode 100644 index 00000000..8da06909 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/htpasswd.html.en @@ -0,0 +1,217 @@ + + + +htpasswd - Manage user files for basic authentication - Apache HTTP Server + + + + + +
    <-
    +

    htpasswd - Manage user files for basic authentication

    +
    +

    Available Languages:  en  | + ko  | + tr 

    +
    + +

    htpasswd is used to create and update the flat-files used to + store usernames and password for basic authentication of HTTP users. If + htpasswd 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.

    + +

    Resources available from the Apache HTTP server can be restricted to + just the users listed in the files created by htpasswd. This + program can only manage usernames and passwords stored in a flat-file. It + can encrypt and display password information for use in other types of data + stores, though. To use a DBM database see dbmmanage.

    + +

    htpasswd encrypts passwords using either a version of MD5 + modified for Apache, or the system's crypt() routine. Files + managed by htpasswd may contain both types of passwords; some + user records may have MD5-encrypted passwords while others in the same file + may have passwords encrypted with crypt().

    + +

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

    +
    +

    See also

    • httpd
    • The scripts in support/SHA1 which come with the +distribution.
    +
    top
    +
    +

    Synopsis

    +

    htpasswd + [ -c ] + [ -m ] + [ -D ] passwdfile username

    + +

    htpasswd -b + [ -c ] + [ -m | + -d | + -p | + -s ] + [ -D ] passwdfile username + password

    + +

    htpasswd -n + [ -m | + -d | + -s | + -p ] username

    + +

    htpasswd -nb + [ -m | + -d | + -s | + -p ] username password

    +
    top
    +
    +

    Options

    +
    +
    -b
    +
    Use batch mode; i.e., get the password from the command line + rather than prompting for it. This option should be used with extreme care, + since the password is clearly visible on the command + line.
    + +
    -c
    +
    Create the passwdfile. If passwdfile already + exists, it is rewritten and truncated. This option cannot be combined with + the -n option.
    + +
    -n
    +
    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 passwdfile argument (usually the first + one) is omitted. It cannot be combined with the -c option.
    + +
    -m
    +
    Use MD5 encryption for passwords. On Windows, Netware and TPF, this is + the default.
    + +
    -d
    +
    Use crypt() encryption for passwords. The default on all + platforms but Windows, Netware and TPF. Though possibly supported by + htpasswd on all platforms, it is not supported by the + httpd server on Windows, Netware and TPF.
    + +
    -s
    +
    Use SHA encryption for passwords. Facilitates migration from/to Netscape + servers using the LDAP Directory Interchange Format (ldif).
    + +
    -p
    +
    Use plaintext passwords. Though htpasswd will support + creation on all platforms, the httpd daemon will + only accept plain text passwords on Windows, Netware and TPF.
    + +
    -D
    +
    Delete user. If the username exists in the specified htpasswd file, it + will be deleted.
    + +
    passwdfile
    +
    Name of the file to contain the user name and password. If + -c is given, this file is created if it does not already exist, + or rewritten and truncated if it does exist.
    + +
    username
    +
    The username to create or update in passwdfile. If + username does not exist in this file, an entry is added. If it + does exist, the password is changed.
    + +
    password
    +
    The plaintext password to be encrypted and stored in the file. Only + used with the -b flag.
    +
    +
    top
    +
    +

    Exit Status

    +

    htpasswd returns a zero status ("true") if the username and + password have been successfully added or updated in the + passwdfile. htpasswd returns 1 if it + encounters some problem accessing files, 2 if there was a + syntax problem with the command line, 3 if the password was + entered interactively and the verification entry didn't match, + 4 if its operation was interrupted, 5 if a value + is too long (username, filename, password, or final computed record), + 6 if the username contains illegal characters (see the + Restrictions section), and 7 + if the file is not a valid password file.

    +
    top
    +
    +

    Examples

    +

    + htpasswd /usr/local/etc/apache/.htpasswd-users jsmith +

    + +

    Adds or modifies the password for user jsmith. The user + is prompted for the password. If executed on a Windows system, the password + will be encrypted using the modified Apache MD5 algorithm; otherwise, the + system's crypt() routine will be used. If the file does not + exist, htpasswd will do nothing except return an error.

    + +

    + htpasswd -c /home/doe/public_html/.htpasswd jane +

    + +

    Creates a new file and stores a record in it for user jane. + The user is prompted for the password. If the file exists and cannot be + read, or cannot be written, it is not altered and htpasswd + will display a message and return an error status.

    + +

    + htpasswd -mb /usr/web/.htpasswd-all jones Pwd4Steve +

    + +

    Encrypts the password from the command line (Pwd4Steve) + using the MD5 algorithm, and stores it in the specified file.

    +
    top
    +
    +

    Security Considerations

    +

    Web password files such as those managed by htpasswd should + not be within the Web server's URI space -- that is, they should + not be fetchable with a browser.

    + +

    The use of the -b option is discouraged, since when it is + used the unencrypted password appears on the command line.

    +
    top
    +
    +

    Restrictions

    +

    On the Windows and MPE platforms, passwords encrypted with + htpasswd are limited to no more than 255 + characters in length. Longer passwords will be truncated to 255 + characters.

    + +

    The MD5 algorithm used by htpasswd is specific to the Apache + software; passwords encrypted using it will not be usable with other Web + servers.

    + +

    Usernames are limited to 255 bytes and may not include the + character :.

    +
    +
    +

    Available Languages:  en  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/htpasswd.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/programs/htpasswd.html.ko.euc-kr new file mode 100644 index 00000000..22f49f86 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/htpasswd.html.ko.euc-kr @@ -0,0 +1,219 @@ + + + +htpasswd - basic authentication¿¡ »ç¿ëÇÒ »ç¿ëÀÚÆÄÀÏÀ» + °ü¸®ÇÑ´Ù - Apache HTTP Server + + + + + +
    <-
    +

    htpasswd - basic authentication¿¡ »ç¿ëÇÒ »ç¿ëÀÚÆÄÀÏÀ» + °ü¸®ÇÑ´Ù

    +
    +

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

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

    htpasswd´Â HTTP basic authentication¿¡ »ç¿ëÇÒ + »ç¿ëÀÚ¸í°ú ¾ÏÈ£¸¦ ÀúÀåÇÏ´Â ÀϹÝÆÄÀÏÀ» »ý¼ºÇÏ°í ¼öÁ¤ÇÑ´Ù. + htpasswd°¡ ÆÄÀÏÀ» ¾²°Å³ª ÀÐÀ» ¼ö ¾ø´Ù¸é, + ¿À·ù»óŸ¦ ¹ÝȯÇÏ°í ¾Æ¹«°Íµµ ¼öÁ¤ÇÏÁö ¾Ê´Â´Ù.

    + +

    ¾ÆÆÄÄ¡ À¥¼­¹ö´Â ÀÚ¿øÀ» htpasswd·Î ¸¸µç ÆÄÀÏ¿¡ + ±â·ÏÇÑ »ç¿ëÀÚ¿¡°Ô¸¸ º¸¿©ÁÙ ¼ö ÀÖ´Ù. ÀÌ ÇÁ·Î±×·¥Àº »ç¿ëÀÚ¸í°ú + ¾ÏÈ£¸¦ ÀúÀåÇÏ´Â ÀÏ¹Ý ÆÄÀÏÀ» °ü¸®ÇÑ´Ù. ±×·¯³ª ´Ù¸¥ ÀÚ·áÀúÀå + ¹æ½ÄÀ» À§ÇØ ¾ÏÈ£ Á¤º¸¸¦ ¾ÏȣȭÇÏ¿© ÀúÀåÇÒ ¼ö ÀÖ´Ù. DBM + µ¥ÀÌÅͺ£À̽º¸¦ »ç¿ëÇÏ·Á¸é dbmmanage¸¦ Âü°íÇ϶ó.

    + +

    htpasswd´Â ¾ÆÆÄÄ¡ ƯÀ¯ÀÇ MD5 ȤÀº ½Ã½ºÅÛÀÇ + crypt()¸¦ »ç¿ëÇÏ¿© ¾ÏÈ£¸¦ ¾ÏȣȭÇÑ´Ù. + htpasswd°¡ °ü¸®ÇÏ´Â ÆÄÀÏÀº µÎ Á¾·ùÀÇ ¾ÏÈ£¸¦ + ¸ðµÎ ÀúÀåÇÒ ¼ö ÀÖ´Ù. Áï, °°Àº ÆÄÀÏ¿¡ MD5·Î ¾ÏȣȭÇÑ ¾ÏÈ£¸¦ + »ç¿ëÇÏ´Â »ç¿ëÀÚ¿Í crypt()·Î ¾ÏȣȭÇÑ ¾ÏÈ£¸¦ + »ç¿ëÇÏ´Â »ç¿ëÀÚ Á¤º¸ ¸ðµÎ ³ª¿Ã ¼ö ÀÖ´Ù.

    + +

    ÀÌ manpage´Â ¸í·ÉÇà ¿É¼Ç¸¸À» ¼³¸íÇÑ´Ù. httpd¿¡¼­ »ç¿ëÀÚÀÎÁõÀ» ¼³Á¤ÇÏ´Â Áö½Ã¾î¿¡ + ´ëÇÑ ¼³¸íÀº ¾ÆÆÄÄ¡ ¹èÆ÷º»¿¡ Æ÷ÇÔµÇÀÖ°í http://httpd.apache.org/¿¡¼­µµ + º¼ ¼ö ÀÖ´Â ¾ÆÆÄÄ¡ ¼³¸í¼­¸¦ Âü°íÇ϶ó.

    +
    +

    Âü°í

    • httpd
    • ¹èÆ÷º»¿¡´Â SHA1À» Áö¿øÇÏ´Â ½ºÅ©¸³Æ®µµ ÀÖ´Ù.
    +
    top
    +
    +

    °³¿ä

    +

    htpasswd + [ -c ] + [ -m ] + [ -D ] passwdfile username

    + +

    htpasswd -b + [ -c ] + [ -m | + -d | + -p | + -s ] + [ -D ] passwdfile username + password

    + +

    htpasswd -n + [ -m | + -d | + -s | + -p ] username

    + +

    htpasswd -nb + [ -m | + -d | + -s | + -p ] username password

    +
    top
    +
    +

    ¿É¼Ç

    +
    +
    -b
    +
    ¹èÄ¡(batch) ¸ðµå¸¦ »ç¿ëÇÑ´Ù. ¿¹¸¦ µé¾î, ¾ÏÈ£¸¦ + ¹°¾îº¸Áö¾Ê°í ¸í·ÉÇà¿¡¼­ ¹Þ´Â´Ù. ¸í·ÉÇà¿¡ ¾ÏÈ£°¡ + Á÷Á¢ µå·¯³ª¹Ç·Î, ÀÌ ¿É¼ÇÀº ¸Å¿ì Á¶½ÉÇؼ­ »ç¿ëÇØ¾ß + ÇÑ´Ù.
    + +
    -c
    +
    passwdfileÀ» ¸¸µç´Ù. passwdfileÀÌ + ÀÌ¹Ì Á¸ÀçÇÑ´Ù¸é, µ¤¾î¾´´Ù. ÀÌ ¿É¼ÇÀ» -n ¿É¼Ç°ú + °°ÀÌ »ç¿ëÇÒ ¼ö ¾ø´Ù.
    + +
    -n
    +
    ÆÄÀÏÀ» ¼öÁ¤ÇÏÁö¾Ê°í °á°ú¸¦ Ç¥ÁØÃâ·ÂÀ¸·Î Ãâ·ÂÇÑ´Ù. + ¾ÆÆÄÄ¡°¡ ¹®¼­ÀÌ¿ÜÀÇ °÷¿¡ »ý¼ºÇÑ ¾ÏÈ£¸¦ ÀúÀåÇÒ¶§ À¯¿ëÇÏ´Ù. + (Ç×»ó ù¹ø° ¾Æ±Ô¸ÕÆ®ÀÎ) passwdfile ¾Æ±Ô¸ÕÆ®°¡ + ¾ø±â¶§¹®¿¡ ¸í·ÉÇà ¹®¹ýÀÌ ´Ù¸£´Ù. -c ¿É¼Ç°ú + °°ÀÌ »ç¿ëÇÒ ¼ö ¾ø´Ù.
    + +
    -m
    +
    MD5¸¦ »ç¿ëÇÏ¿© ¾ÏÈ£¸¦ ¾ÏȣȭÇÑ´Ù. Windows, Netware, + TPF¿¡¼­ ±âº»°ªÀÌ´Ù.
    + +
    -d
    +
    crypt()¸¦ »ç¿ëÇÏ¿© ¾ÏÈ£¸¦ ¾ÏȣȭÇÑ´Ù. + Windows, Netware, TPF¸¦ Á¦¿ÜÇÑ ¸ðµç Ç÷¡Æû¿¡¼­ ±âº»°ªÀÌ´Ù. + ¸ðµç Ç÷¡ÆûÀÇ htpasswd°¡ ÀÌ Çü½ÄÀ» Áö¿øÇÒ ¼ö´Â + ÀÖÁö¸¸, Windows, Netware, TPFÀÇ httpd + ¼­¹ö´Â ÀÌ Çü½ÄÀ» Áö¿øÇÏÁö ¾Ê´Â´Ù.
    + +
    -s
    +
    ¾ÏÈ£¸¦ SHA ¾ÏȣȭÇÑ´Ù. LDAP µð·ºÅ丮±³È¯Çü½Ä(ldif)À» + »ç¿ëÇÏ¿© Netscape ¼­¹ö·Î Á¤º¸¸¦ º¸³»°Å³ª °ÅÁ®¿Ã¶§ À¯¿ëÇÏ´Ù.
    + +
    -p
    +
    ¾ÏÈ£¸¦ ±×´ë·Î »ç¿ëÇÑ´Ù. ¸ðµç Ç÷¡ÆûÀÇ htpasswd°¡ + Áö¿øÇÏÁö¸¸, Windows, Netware, TPFÀÇ httpd + µ¥¸ó¸¸ÀÌ ÀÏ¹Ý ¾ÏÈ£¸¦ ¹Þ´Â´Ù.
    + +
    -D
    +
    »ç¿ëÀÚ¸¦ »èÁ¦ÇÑ´Ù. htpasswd ÆÄÀÏ¿¡ »ç¿ëÀÚ¸íÀÌ ÀÖ´Ù¸é + »èÁ¦ÇÑ´Ù.
    + +
    passwdfile
    +
    »ç¿ëÀÚ¸í°ú ¾ÏÈ£¸¦ ÀúÀåÇÏ´Â ÆÄÀϸí. -c¸¦ + »ç¿ëÇÑ °æ¿ì ÆÄÀÏÀÌ ¾ø´Ù¸é »õ·Î ¸¸µé°í, ÀÖ´Ù¸é µ¤¾î¾´´Ù.
    + +
    username
    +
    passwdfile¿¡ ¸¸µé°Å³ª ¼öÁ¤ÇÒ »ç¿ëÀÚ¸í. + usernameÀÌ ÀÌ ÆÄÀÏ¿¡ ¾ø´Ù¸é Ç׸ñÀ» Ãß°¡ÇÑ´Ù. + ÀÖ´Ù¸é ¾ÏÈ£¸¦ ¼öÁ¤ÇÑ´Ù.
    + +
    password
    +
    ¾ÏȣȭÇÏ¿© ÆÄÀÏ¿¡ ÀúÀåÇÒ ¾ÏÈ£. ¿ÀÁ÷ -b + ¿É¼Ç°ú °°ÀÌ »ç¿ëÇÒ ¼ö ÀÖ´Ù.
    +
    +
    top
    +
    +

    Á¾·áÄÚµå

    +

    htpasswd´Â passwdfile¿¡ »ç¿ëÀÚ¸í°ú + ¾ÏÈ£¸¦ ¼º°øÀûÀ¸·Î Ãß°¡Çϰųª ¼öÁ¤ÇÑ °æ¿ì ("Âü") Á¾·áÄÚµå + 0À» ¹ÝȯÇÑ´Ù. htpasswd´Â ÆÄÀÏ¿¡ Á¢±ÙÇÒ¶§ ¹®Á¦°¡ + ¹ß»ýÇÑ °æ¿ì 1À», ¸í·ÉÇà Çü½ÄÀÌ À߸øµÈ °æ¿ì + 2¸¦, ÀÔ·ÂÇÑ ¾ÏÈ£¿Í È®ÀÎÂ÷ ´Ù½Ã ÀÔ·ÂÇÑ °ªÀÌ + ÀÏÄ¡ÇÏÁö ¾ÊÀº °æ¿ì 3À», ¸í·ÉÀÌ Áß´ÜµÈ °æ¿ì + 4¸¦, (»ç¿ëÀÚ¸í, ÆÄÀϸí, ¾ÏÈ£, ÃÖÁ¾ °è»ê°á°ú) + °ªÀÌ ³Ê¹« ±ä °æ¿ì 5¸¦, »ç¿ëÀÚ¸í¿¡ Çã¿ëÇÏÁö¾Ê´Â + ¹®ÀÚ°¡ Æ÷ÇÔµÈ °æ¿ì Á¦ÇÑ Àý Âü°í) + 6¸¦, ÆÄÀÏÀÌ ¿Ã¹Ù¸¥ ¾ÏÈ£ÆÄÀÏÀÌ ¾Æ´Ñ °æ¿ì + 7À» ¹ÝȯÇÑ´Ù.

    +
    top
    +
    +

    ¿¹Á¦

    +

    + htpasswd /usr/local/etc/apache/.htpasswd-users jsmith +

    + +

    »ç¿ëÀÚ jsmithÀÇ ¾ÏÈ£¸¦ Ãß°¡Çϰųª ¼öÁ¤ÇÑ´Ù. + »ç¿ëÀÚ¿¡°Ô ¾ÏÈ£¸¦ ¹°¾îº»´Ù. Windows ½Ã½ºÅÛ¿¡¼­ ½ÇÇàÇϸé + ¾ÏÈ£¸¦ ¾ÆÆÄÄ¡ ƯÀ¯ÀÇ MD5 ¾Ë°í¸®ÁòÀ» »ç¿ëÇÏ¿© ¾ÏȣȭÇÏ°í, + ¾Æ´Ï¸é ½Ã½ºÅÛÀÇ crypt() ÇÔ¼ö¸¦ »ç¿ëÇÑ´Ù. ÆÄÀÏÀÌ + ¾ø´Ù¸é htpasswd´Â ¾Æ¹« Àϵµ ÇÏÁö¾Ê°í ¿À·ù¸¦ + ³½´Ù.

    + +

    + htpasswd -c /home/doe/public_html/.htpasswd jane +

    + +

    »õ·Î ÆÄÀÏÀ» ¸¸µé°í ±× ÆÄÀÏ¿¡ »ç¿ëÀÚ janeÀ» + Ãß°¡ÇÑ´Ù. »ç¿ëÀÚ¿¡°Ô ¾ÏÈ£¸¦ ¹°¾îº»´Ù. ÆÄÀÏÀÌ ÀÖÁö¸¸ Àаųª + ¾µ ¼ö ¾ø´Ù¸é, htpasswd´Â ÆÄÀÏÀ» ¼öÁ¤ÇÏÁö¾Ê°í + ¹®±¸¸¦ Ãâ·ÂÇÑÈÄ ¿À·ù»óŸ¦ ¹ÝȯÇÑ´Ù.

    + +

    + htpasswd -mb /usr/web/.htpasswd-all jones Pwd4Steve +

    + +

    ¸í·ÉÇàÀÇ ¾ÏÈ£(Pwd4Steve)¸¦ MD5 ¾Ë°í¸®ÁòÀ¸·Î + ¾ÏȣȭÇÏ¿© ÁöÁ¤ÇÑ ÆÄÀÏ¿¡ ÀúÀåÇÑ´Ù.

    +
    top
    +
    +

    º¸¾È»ó °í·ÁÇÒ Á¡

    +

    htpasswd µîÀÌ °ü¸®ÇÏ´Â À¥ ¾ÏÈ£ÆÄÀÏÀÌ À¥¼­¹öÀÇ + URI °ø°£¿¡ ÀÖÀ¸¸é ¾ÈµÈ´Ù. Áï, ºê¶ó¿ìÀú°¡ ÀÌ ÆÄÀÏÀ» + º¼ ¼ö ¾ø¾î¾ß ÇÑ´Ù.

    + +

    ¸í·ÉÇà¿¡ ¾ÏȣȭÇÏÁö¾ÊÀº ¾ÏÈ£¸¦ »ç¿ëÇϱ⶧¹®¿¡ -b + ¿É¼ÇÀ» ÃßõÇÏÁö ¾Ê´Â´Ù.

    +
    top
    +
    +

    Á¦ÇÑ

    +

    Windows¿Í MPE Ç÷¡ÆûÀº htpasswd°¡ ¾ÏȣȭÇÏ´Â + ¾ÏÈ£ÀÇ ±æÀ̸¦ 255 ¹®ÀÚ·Î Á¦ÇÑÇÑ´Ù. ´õ ±ä ¾ÏÈ£´Â + 255ÀÚ¿¡¼­ ©¸°´Ù.

    + +

    htpasswd°¡ »ç¿ëÇÏ´Â MD5 ¾Ë°í¸®ÁòÀº ¾ÆÆÄÄ¡ + ¼ÒÇÁÆ®¿þ¾î ƯÀ¯ÀÇ °ÍÀÌ´Ù. À̸¦ »ç¿ëÇÏ¿© ¾ÏȣȭÇÑ ¾ÏÈ£¸¦ + ´Ù¸¥ À¥¼­¹ö¿¡¼­ »ç¿ëÇÒ ¼ö ¾ø´Ù.

    + +

    »ç¿ëÀÚ¸íÀº 255 ¹ÙÀÌÆ®·Î Á¦Çѵǰí : + ¹®ÀÚ¸¦ Æ÷ÇÔÇÒ ¼ö ¾ø´Ù.

    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/htpasswd.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/programs/htpasswd.html.tr.utf8 new file mode 100644 index 00000000..c63796a4 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/htpasswd.html.tr.utf8 @@ -0,0 +1,224 @@ + + + +htpasswd - Temel kimlik doğrulama dosyalarını yönetir - Apache HTTP Sunucusu + + + + + +
    <-
    +

    htpasswd - Temel kimlik doğrulama dosyalarını yönetir

    +
    +

    Mevcut Diller:  en  | + ko  | + tr 

    +
    + +

    htpasswd, 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. htpasswd, güncelleme + sırasında yazmak veya okumak için bir dosyaya erişemezse beklenen hiçbir + işlemi yapmaz ve hata vererek çıkar.

    + +

    Apache HTTP sunucusunun mevcut özkaynaklarının kullanımı + sadece htpasswd tarafından oluşturulan + dosyalarda listelenmiş kullanıcılara tahsis edilebilir. + htpasswd 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 dbmmanage + sayfasına bakınız.

    + +

    htpasswd, parolaları şifrelemek için ya + Apache'nin kendine özgü MD5 algoritmasını ya da sistemin + crypt() yordamını kullanır. Bazı kullanıcılar MD5 şifreli + parolalara, bazıları da crypt() ile şifrelenmiş parolalara + sahip olabileceğinden htpasswd tarafından + yönetilen dosyalar her iki tür parolayı da içerebilir.

    + +

    Bu kılavuz sayfası sadece komut satırı değiştirgelerini listeler. + Kullanıcı kimlik doğrulamasını + httpd'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.

    +
    +

    Ayrıca bakınız:

    • httpd
    • Kaynak paketinin support/SHA1 dizinindeki betikler.
    +
    top
    +
    +

    Kullanım

    +

    htpasswd + [ -c ] + [ -m ] + [ -D ] parola-dosyası kullanıcı

    + +

    htpasswd -b + [ -c ] + [ -m | + -d | + -p | + -s ] + [ -D ] parola-dosyası kullanıcı + parola

    + +

    htpasswd -n + [ -m | + -d | + -s | + -p ] kullanıcı

    + +

    htpasswd -nb + [ -m | + -d | + -s | + -p ] kullanıcı parola

    +
    top
    +
    +

    Seçenekler

    +
    +
    -b
    +
    Betik kipi; parola için istek yapmak yerine parola komut satırından + verilir. Parola komut satırında görünür olacağından çok + dikkatli kullanmak gerekir.
    + +
    -c
    +
    parola-dosyası oluşturur. Dosya mevcutsa, + dosya silinip yeniden yazılır. Bu seçenek + -n seçeneği ile birlikte kullanılamaz.
    + +
    -n
    +
    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. + parola-dosyası belirtilmediğinden, bu seçenek + komut satırı sözdizimini değiştirir. Bu seçenek + -c seçeneği ile birlikte kullanılamaz.
    + +
    -m
    +
    Parolalar için MD5 şifrelemesi kullanılır. Windows, Netware ve TPF + için öntanımlıdır.
    + +
    -d
    +
    Parolaları şifrelemek için crypt() kullanılır. Windows, + Netware ve TPF dışında öntanımlıdır. + htpasswd tarafından tüm platformlarda + destekleniyor olsa da Windows, Netware ve TPF üzerinde + httpd sunucusu tarafından desteklenmez.
    + +
    -s
    +
    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.
    + +
    -p
    +
    Düz metin parolalar kullanılır. htpasswd + tarafından tüm platformlarda destekleniyor olsa da Windows, Netware ve + TPF üzerinde httpd sunucusu tarafından sadece düz + metin parolalar kabul edilir.
    + +
    -D
    +
    Kullanıcıyı siler. Kullanıcı belirtilen dosyada mevcutsa + silinir.
    + +
    parola-dosyası
    +
    Kullanıcı ismini ve parolasını içeren dosyanın ismi. + -c seçeneği verilmişse ve dosya mevcut + değilse oluşturulur, dosya mevcutsa silinip yeniden oluşturulur.
    + +
    kullanıcı
    +
    parola-dosyası'nda oluşturulacak veya + güncellenecek kullanıcı ismi. kullanıcı bu + dosyada mevcut değilse yeni bir girdi eklenir. Girdi mevcutsa parolası + değiştirilir.
    + +
    parola
    +
    Şifrelenip dosyada saklanacak düz metin parola. Sadece + -b seçeneği ile kullanılır.
    +
    +
    top
    +
    +

    Çıkış Durumu

    +

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

    +
    top
    +
    +

    Örnekler

    +

    + htpasswd /usr/local/etc/apache/.htpasswd-users jsmith +

    + +

    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 htpasswd beklenen hiçbir işlemi + yapmadan bir hata vererek çıkar.

    + +

    + htpasswd -c /home/doe/public_html/.htpasswd jane +

    + +

    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 + htpasswd bir ileti gösterip bir hata durumu + ile çıkar.

    + +

    + htpasswd -mb /usr/web/.htpasswd-all jones Pwd4Steve +

    + +

    Komut satırından verilen parolayı (Pwd4Steve) MD5 + algoritmasıyla şifreler ve bunu belirtilen dosyada saklar.

    +
    top
    +
    +

    Güvenlik Değerlendirmeleri

    +

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

    +
    top
    +
    +

    Kısıtlamalar

    +

    Windows ve MPE platformlarında, htpasswd + ile şifrelenen parolalar 255 karakterden daha uzun olamaz. + 255 karakterden sonrası kırpılır.

    + +

    htpasswd tarafından kullanılan MD5 + algoritması Apache yazılımına özeldir; bu algoritma ile şifrelenen + parolalar başka HTTP sunucularında kullanılamayabilir.

    + +

    Kullanıcı isimleri 255 bayttan uzun olamaz ve iki nokta + imi (:) içeremez.

    +
    +
    +

    Mevcut Diller:  en  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/httpd.html b/rubbos/app/httpd-2.0.64/docs/manual/programs/httpd.html new file mode 100644 index 00000000..9ef8b2b7 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/httpd.html @@ -0,0 +1,13 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: httpd.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: httpd.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: httpd.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/httpd.html.en b/rubbos/app/httpd-2.0.64/docs/manual/programs/httpd.html.en new file mode 100644 index 00000000..e45ae42a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/httpd.html.en @@ -0,0 +1,189 @@ + + + +httpd - Apache Hypertext Transfer Protocol Server - Apache HTTP Server + + + + + +
    <-
    +

    httpd - Apache Hypertext Transfer Protocol Server

    +
    +

    Available Languages:  en  | + ko  | + tr 

    +
    + +

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

    + +

    In general, httpd 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.

    +
    + +
    top
    +
    +

    Synopsis

    +

    httpd [ -d + serverroot ] [ -f config ] + [ -C directive ] [ -c + directive ] [ -D parameter ] + [ -e level ] [ -E + file ] [ -k start|restart|graceful|stop ] + [ -R directory ] [ -h ] + [ -l ] [ -L ] [ -S ] + [ -t ] [ -v ] [ -V ] + [ -X ]

    + +

    On Windows systems, the + following additional arguments are available:

    + +

    httpd [ -k + install|config|uninstall ] [ -n name ] + [ -w ]

    +
    top
    +
    +

    Options

    + +
    +
    -d serverroot
    + +
    Set the initial value for the ServerRoot directive to +serverroot. This can be overridden by the ServerRoot +directive in the configuration file. The default is +/usr/local/apache2.
    + +
    -f config
    + +
    Uses the directives in the file config on startup. If +config does not begin with a /, then it is taken to be a +path relative to the ServerRoot. The default is +conf/httpd.conf.
    + +
    -k start|restart|graceful|stop
    + +
    Signals httpd to start, restart, or stop. See Stopping Apache for more information.
    + +
    -C directive
    + +
    Process the configuration directive before reading +config files.
    + +
    -c directive
    + +
    Process the configuration directive after reading config +files.
    + + +
    -D parameter
    + +
    Sets a configuration parameter which can be used with +<IfDefine> sections +in the configuration files to conditionally skip or process +commands at server startup and restart.
    + +
    -e level
    + +
    Sets the LogLevel to +level during server startup. This is useful for +temporarily increasing the verbosity of the error messages to find +problems during startup.
    + +
    -E file
    + +
    Send error messages during server startup to file.
    + +
    -R directory
    + +
    When the server is compiled using the SHARED_CORE +rule, this specifies the directory for the shared +object files.
    + +
    -h
    + +
    Output a short summary of available command line options.
    + +
    -l
    + +
    Output a list of modules compiled into the server. This will +not list dynamically loaded modules included using +the LoadModule directive.
    + +
    -L
    + +
    Output a list of directives together with expected arguments and +places where the directive is valid.
    + +
    -S
    + +
    Show the settings as parsed from the config file (currently only +shows the virtualhost settings).
    + +
    -t
    + +
    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 +DUMP_VHOSTS is also set, details of the virtual host +configuration will be printed.
    + +
    -v
    + +
    Print the version of httpd, and then exit.
    + +
    -V
    + +
    Print the version and build parameters of httpd, and +then exit.
    + +
    -X
    + +
    Run httpd in debug mode. Only one worker will be started and the +server will not detach from the console.
    + +
    + +

    The following arguments are available only on the Windows platform:

    + +
    + +
    -k install|config|uninstall
    + +
    Install Apache as a Windows NT service; change startup options for +the Apache service; and uninstall the Apache service.
    + +
    -n name
    + +
    The name of the Apache service to signal.
    + +
    -w
    + +
    Keep the console window open on error so that the error message can +be read.
    + +
    + +
    +
    +

    Available Languages:  en  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/httpd.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/programs/httpd.html.ko.euc-kr new file mode 100644 index 00000000..df591e8b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/httpd.html.ko.euc-kr @@ -0,0 +1,184 @@ + + + +httpd - ¾ÆÆÄÄ¡ ÇÏÀÌÆÛÅؽºÆ® Àü¼Û ÇÁ·ÎÅäÄÝ ¼­¹ö - Apache HTTP Server + + + + + +
    <-
    +

    httpd - ¾ÆÆÄÄ¡ ÇÏÀÌÆÛÅؽºÆ® Àü¼Û ÇÁ·ÎÅäÄÝ ¼­¹ö

    +
    +

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

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

    httpd´Â ¾ÆÆÄÄ¡ ÇÏÀÌÆÛÅؽºÆ® Àü¼Û ÇÁ·ÎÅäÄÝ + (HTTP) ¼­¹ö ÇÁ·Î±×·¥ÀÌ´Ù. ÀÚü(standalone) µ¥¸ó ÇÁ·Î¼¼½º·Î + ½ÇÇàÇϵµ·Ï ¼³°èµÇ¾ú´Ù. ¿øÇÑ´Ù¸é ¿äûÀ» ó¸®ÇϱâÀ§ÇØ ÀÚ½Ä + ÇÁ·Î¼¼½º¿Í ¾²·¹µåµéÀ» ¸¸µç´Ù.

    + +

    ÀϹÝÀûÀ¸·Î httpd¸¦ Á÷Á¢ ½ÇÇàÇϱ⺸´Ù´Â + À¯´Ð½º±â¹Ý ½Ã½ºÅÛ¿¡¼­´Â apachectlÀ» ÅëÇØ, 2000, XP¿¡¼­´Â + ¼­ºñ½º·Î, Windows + 9x¿Í ME¿¡¼­´Â ÄÝ¼Ö ÇÁ·Î±×·¥À¸·Î ½ÇÇàÇØ¾ß ÇÑ´Ù.

    +
    + +
    top
    +
    +

    °³¿ä

    +

    httpd [ -d + serverroot ] [ -f config ] + [ -C directive ] [ -c + directive ] [ -D parameter ] + [ -e level ] [ -E + file ] [ -k start|restart|graceful|stop ] + [ -R directory ] [ -h ] + [ -l ] [ -L ] [ -S ] + [ -t ] [ -v ] [ -V ] + [ -X ]

    + +

    Windows ½Ã½ºÅÛ¿¡¼­´Â + ´ÙÀ½ ¾Æ±Ô¸ÕÆ®¸¦ Ãß°¡·Î »ç¿ëÇÒ ¼ö ÀÖ´Ù:

    + +

    httpd [ -k + install|config|uninstall ] [ -n name ] + [ -w ]

    +
    top
    +
    +

    ¿É¼Ç

    + +
    +
    -d serverroot
    + +
    ServerRoot Áö½Ã¾îÀÇ +±âº»°ªÀ» serverroot·Î ¼³Á¤ÇÑ´Ù. ¼³Á¤ÆÄÀÏ¿¡¼­ ServerRoot +Áö½Ã¾î¸¦ »ç¿ëÇÏ¿© ÀÌ °ªÀ» ¼öÁ¤ÇÒ ¼ö ÀÖ´Ù. ±âº»°ªÀº +/usr/local/apache2ÀÌ´Ù.
    + +
    -f config
    + +
    ½ÃÀÛÇÒ¶§ config ÆÄÀÏ¿¡ ÀÖ´Â Áö½Ã¾î¸¦ »ç¿ëÇÑ´Ù. +config°¡ /·Î ½ÃÀÛÇÏÁö ¾ÊÀ¸¸é ServerRoot¿¡ »ó´ë°æ·ÎÀÌ´Ù. ±âº»°ªÀº +conf/httpd.confÀÌ´Ù.
    + +
    -k start|restart|graceful|stop
    + +
    httpd¸¦ ½ÃÀÛ, Àç½ÃÀÛ, Áß´ÜÇÑ´Ù. ´õ ÀÚ¼¼ÇÑ Á¤º¸´Â +¾ÆÆÄÄ¡ Áß´ÜÇϱ⸦ Âü°íÇ϶ó.
    + +
    -C directive
    + +
    ¼³Á¤ÆÄÀÏÀ» ÀбâÀü¿¡ directive Áö½Ã¾î¸¦ ó¸®ÇÑ´Ù.
    + +
    -c directive
    + +
    ¼³Á¤ÆÄÀÏÀ» ÀбâÀü¿¡ directive Áö½Ã¾î¸¦ ó¸®ÇÑ´Ù.
    + + +
    -D parameter
    + +
    ¼­¹ö ½ÃÀÛ È¤Àº Àç½ÃÀ۽à ¼±ÅÃÀûÀ¸·Î ¸í·É¾î¸¦ ó¸®ÇϱâÀ§ÇØ +¼³Á¤ÆÄÀÏÀÇ <IfDefine> +¼½¼Ç¿¡ »ç¿ëÇÒ parameter¸¦ ¼³Á¤ÇÑ´Ù.
    + +
    -e level
    + +
    ¼­¹ö°¡ ½ÃÀÛÇϴµ¿¾È LogLevelÀ» +level·Î ¼³Á¤ÇÑ´Ù. ÀÌ´Â ½ÃÀÛÁß ¹®Á¦¸¦ ã±âÀ§ÇØ Àá½Ã +´õ ÀÚ¼¼ÇÑ ¿À·ù¹®À» ¾òÀ»¶§ À¯¿ëÇÏ´Ù.
    + +
    -E file
    + +
    ¼­¹ö°¡ ½ÃÀÛÇϴµ¿¾È file·Î ¿À·ù¹®À» º¸³½´Ù.
    + +
    -R directory
    + +
    ¼­¹ö¸¦ SHARED_CORE ±ÔÄ¢À» »ç¿ëÇÏ¿© ÄÄÆÄÀÏÇÑ +°æ¿ì °øÀ¯¿ÀºêÁ§Æ®ÆÄÀÏ directory¸¦ ÁöÁ¤ÇÑ´Ù.
    + +
    -h
    + +
    »ç¿ëÇÒ ¼ö ÀÖ´Â ¸í·ÉÇà ¿É¼ÇµéÀÇ ÂªÀº ¿ä¾àÀ» Ãâ·ÂÇÑ´Ù.
    + +
    -l
    + +
    ¼­¹ö¿¡ °°ÀÌ ÄÄÆÄÀÏÇÑ ¸ðµâ ¸ñ·ÏÀ» Ãâ·ÂÇÑ´Ù. LoadModule Áö½Ã¾î¸¦ »ç¿ëÇÏ¿© µ¿ÀûÀ¸·Î +ÀоîµéÀÌ´Â ¸ðµâÀº Ãâ·ÂÇÏÁö ¾Ê´Â´Ù.
    + +
    -L
    + +
    Áö½Ã¾î ¸ñ·ÏÀ» Áö½Ã¾î°¡ ¹Þ´Â ¾Æ±Ô¸ÕÆ®¿Í Áö½Ã¾î »ç¿ëÀå¼Ò¿Í +°°ÀÌ Ãâ·ÂÇÑ´Ù.
    + +
    -S
    + +
    ¼³Á¤ÆÄÀÏ¿¡¼­ ÀоîµéÀÎ ¼³Á¤À» º¸¿©ÁØ´Ù (ÇöÀç´Â °¡»óÈ£½ºÆ® +¼³Á¤¸¸À» º¸¿©ÁØ´Ù).
    + +
    -t
    + +
    ¼³Á¤ÆÄÀÏÀÇ ¹®¹ý°Ë»ç¸¸ ÇÑ´Ù. ÇÁ·Î±×·¥Àº ¹®¹ýÀ» °Ë»çÇÑÈÄ +(¹®¹ýÀÌ ¿Ã¹Ù¸¥ °æ¿ì) 0À̳ª (¹®¹ý¿¡ ¹®Á¦°¡ ÀÖ´Â °æ¿ì) 0ÀÌ ¾Æ´Ñ +Á¾·áÄÚµå·Î Áï½Ã Á¾·áÇÑ´Ù. -D DUMP_VHOSTSÀ» +»ç¿ëÇÏ¸é °¡»óÈ£½ºÆ® ¼³Á¤À» ÀÚ¼¼È÷ Ãâ·ÂÇÑ´Ù.
    + +
    -v
    + +
    httpdÀÇ ¹öÀüÀ» Ãâ·ÂÇÏ°í Á¾·áÇÑ´Ù.
    + +
    -V
    + +
    httpdÀÇ ¹öÀü°ú ÄÄÆÄÀÏ ÆĶó¹ÌÅ͸¦ Ãâ·ÂÇÏ°í +Á¾·áÇÑ´Ù.
    + +
    -X
    + +
    µð¹ö±× »óÅ·ΠÀ¥¼­¹ö¸¦ ½ÇÇàÇÑ´Ù. ¿ÀÁ÷ ÇÑ ÇÁ·Î¼¼½º³ª ¾²·¹µå·Î¸¸ +¼­ºñ½ºÇÏ°í, ¼­¹ö´Â Äֿܼ¡¼­ ¶³¾îÁöÁö ¾Ê´Â´Ù.
    + +
    + +

    ´ÙÀ½ ¾Æ±Ô¸ÕÆ®´Â Windows +Ç÷¡Æû¿¡¼­¸¸ »ç¿ëÇÒ ¼ö ÀÖ´Ù:

    + +
    + +
    -k install|config|uninstall
    + +
    ¾ÆÆÄÄ¡¸¦ Windows NT ¼­ºñ½º·Î ¼³Ä¡ÇÑ´Ù; ¾ÆÆÄÄ¡ ¼­ºñ½ºÀÇ ½ÃÀÛ +¿É¼ÇÀ» ¼öÁ¤ÇÑ´Ù; ¾ÆÆÄÄ¡ ¼­ºñ½º ¼³Ä¡¸¦ Áö¿î´Ù.
    + +
    -n name
    + +
    ¾ÆÆÄÄ¡ ¼­ºñ½ºÀÇ name.
    + +
    -w
    + +
    ¿À·ù°¡ ¹ß»ýÇϸé ÄܼÖâÀ» ¿­¾î¼­ ¿À·ù¹®À» º¸¿©ÁØ´Ù.
    + +
    + +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/httpd.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/programs/httpd.html.tr.utf8 new file mode 100644 index 00000000..a33f1a94 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/httpd.html.tr.utf8 @@ -0,0 +1,175 @@ + + + +httpd - Apache Hiper Metin Aktarım Protokolü Sunucusu - Apache HTTP Sunucusu + + + + + +
    <-
    +

    httpd - Apache Hiper Metin Aktarım Protokolü Sunucusu

    +
    +

    Mevcut Diller:  en  | + ko  | + tr 

    +
    + +

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

    + +

    Genelde, httpd'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.

    +
    + +
    top
    +
    +

    Kullanım

    +

    httpd [ -d + sunucu-kök-dizini ] [ -f + yapılandırma-dosyası ] + [ -C yönerge ] [ -c + yönerge ] [ -D parametre ] + [ -e seviye ] [ -E + dosya ] + [ -k start | restart | graceful | stop ] + [ -R dizin ] [ -h ] + [ -l ] [ -L ] [ -S ] + [ -t ] [ -v ] [ -V ] + [ -X ]

    + +

    Windows sistemlerinde, ek + olarak şunlar vardır:

    + +

    httpd [ -k install | config | + uninstall ] [ -n isim ] + [ -w ]

    +
    top
    +
    +

    Seçenekler

    + +
    +
    -d sunucu-kök-dizini
    +
    sunucu-kök-dizini'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.
    + +
    -f yapılandırma-dosyası
    +
    Başlatma sırasında yapılandırma-dosyası'ndaki yönergeler + kullanılır. Eğer yapılandırma-dosyası 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.
    + +
    -k start | restart | graceful | stop
    +
    httpd'yi başlatmak, durdurmak ve yeniden + başlatmak için sinyal gönderir. Daha ayrıntılı bilgi edinmek için Apache'nin Durdurulması belgesine + bakınız.
    + +
    -C yönerge
    +
    Yapılandırma yönerge'sini yapılandırma dosyalarını okumadan + önce işleme sokar.
    + +
    -c yönerge
    +
    Yapılandırma yönerge'sini yapılandırma dosyalarını + okuduktan sonra işleme sokar.
    + +
    -D parametre
    +
    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 <IfDefine> + bölümlerinde kullanılmak üzere bir yapılandırma parametre'si + tanımlar.
    + +
    -e seviye
    +
    Hata günlüğü seviyesi olarak LogLevel yönergesine sunucu başlatılırken seviye + 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.
    + +
    -E dosya
    +
    Sunucunun başlatılması sırasında hata iletilerinin belirtilen + dosya'ya gönderilmesini sağlar.
    + +
    -h
    +
    Mevcut komut satırı seçeneklerinin kısa bir özetini çıktılar.
    + +
    -l
    +
    Sunucunun içinde derlenmiş modüllerin listesini çıktılar. Bu liste + LoadModule yönergesi kullanılarak + devingen olarak yüklenen modülleri içermez.
    + +
    -L
    +
    Durağan modüllerce sağlanmış yönergeleri olası değerleriyle geçerli + konumlarına yerleştirerek listeler.
    + +
    -R dizin
    +
    Sunucu SHARED_CORE kullanılarak derlendiği takdirde bu + seçenek paylaşımlı nesne dosyaları için dizin belirtir.
    + +
    -S
    +
    Yapılandırma dosyasından çözümlenmiş haliyle ayarları gösterir (şu an + sadece sanal konak ayarları gösterilmektedir).
    + +
    -t
    +
    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. + -DDUMP_VHOSTS seçeneği ile birlikte + kullanılmışsa ek olarak sanal konak ayrıntıları da basılır.
    + +
    -v
    +
    httpd sürümünü basar ve çıkar.
    + +
    -V
    +
    Sürümü ve httpd kurulum parametrelerini + basar ve çıkar.
    + +
    -X
    +
    httpd hata ayıklama kipinde çalışır. Tek + çocuk süreç başlatılır ve sunucu konsolu terketmez.
    +
    + +

    Aşağıdaki seçenekler sadece Windows + platformunda geçerlidir:

    + +
    +
    -k install | config | uninstall
    +
    Parametreler bakımından sırasıyla: Apache bir Windows NT hizmeti + haline getirilir; başlatma seçenekleri Apache hizmeti için değiştirilir; + ve Apache hizmeti sistemden kaldırılır.
    + +
    -n isim
    +
    Sinyal gönderilecek Apache hizmetinin ismi.
    + +
    -w
    +
    Hata durumunda konsol penceresi açık tutularak hata iletilerinin + okunması sağlanır.
    +
    + +
    +
    +

    Mevcut Diller:  en  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/index.html b/rubbos/app/httpd-2.0.64/docs/manual/programs/index.html new file mode 100644 index 00000000..2f5b561b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/index.html @@ -0,0 +1,21 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: index.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: index.html.es +Content-Language: es +Content-type: text/html; charset=ISO-8859-1 + +URI: index.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: index.html.ru.koi8-r +Content-Language: ru +Content-type: text/html; charset=KOI8-R + +URI: index.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/index.html.en b/rubbos/app/httpd-2.0.64/docs/manual/programs/index.html.en new file mode 100644 index 00000000..47210441 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/index.html.en @@ -0,0 +1,101 @@ + + + +Server and Supporting Programs - Apache HTTP Server + + + + + +
    <-
    +

    Server and Supporting Programs

    +
    +

    Available Languages:  en  | + es  | + ko  | + ru  | + tr 

    +
    + +

    This page documents all the executable programs included + with the Apache HTTP Server.

    +
    +
    top
    +
    +

    Index

    + +
    +
    httpd
    + +
    Apache hypertext transfer protocol server
    + +
    apachectl
    + +
    Apache HTTP server control interface
    + +
    ab
    + +
    Apache HTTP server benchmarking tool
    + +
    apxs
    + +
    APache eXtenSion tool
    + +
    configure
    + +
    Configure the source tree
    + +
    dbmmanage
    + +
    Create and update user authentication files in DBM format + for basic authentication
    + +
    htdigest
    + +
    Create and update user authentication files for digest + authentication
    + +
    htdbm
    + +
    Manipulate DBM password databases.
    + +
    htpasswd
    + +
    Create and update user authentication files for basic + authentication
    + +
    logresolve
    + +
    Resolve hostnames for IP-addresses in Apache + logfiles
    + +
    rotatelogs
    + +
    Rotate Apache logs without having to kill the server
    + +
    suexec
    + +
    Switch User For Exec
    + +
    Other Programs
    +
    Support tools with no own manual page.
    +
    +
    +
    +

    Available Languages:  en  | + es  | + ko  | + ru  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/index.html.es b/rubbos/app/httpd-2.0.64/docs/manual/programs/index.html.es new file mode 100644 index 00000000..7166789e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/index.html.es @@ -0,0 +1,104 @@ + + + +El Servidor Apache y Programas de Soporte - Servidor HTTP Apache + + + + + +
    <-
    +

    El Servidor Apache y Programas de Soporte

    +
    +

    Idiomas disponibles:  en  | + es  | + ko  | + ru  | + 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.
    + +

    Esta página contiene toda la documentación sobre los programas + ejecutables incluidos en el servidor Apache.

    +
    +
    top
    +
    +

    Índice

    + +
    +
    httpd
    + +
    Servidor Apache del Protocolo de Transmisión de + Hipertexto (HTTP)
    + +
    apachectl
    + +
    Interfaz de control del servidor HTTP Apache
    + +
    ab
    + +
    Herramienta de benchmarking del Servidor HTTP Apache
    + +
    apxs
    + +
    Herramienta de Extensión de Apache
    + +
    configure
    + +
    Configuración de la estructura de directorios de Apache
    + +
    dbmmanage
    + +
    Crea y actualiza los archivos de autentificación de usuarios + en formato DBM para autentificación básica
    + +
    htdigest
    + +
    Crea y actualiza los ficheros de autentificación de usuarios + para autentificación tipo digest
    + +
    htpasswd
    + +
    Crea y actualiza los ficheros de autentificación de usuarios + para autentificación básica
    + +
    logresolve
    + +
    Resuelve los nombres de host para direcciones IP que estén + en los ficheros log de Apache
    + +
    rotatelogs
    + +
    Renueva los logs de Apache sin parar el servidor
    + +
    suexec
    + +
    Switch User For Exec. Programa para cambiar la identidad de + usuario con la que se ejecuta un CGI
    + +
    Otros Programas
    +
    Herramientas de soporte sin sección propia en la + documentación.
    +
    +
    +
    +

    Idiomas disponibles:  en  | + es  | + ko  | + ru  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/index.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/programs/index.html.ko.euc-kr new file mode 100644 index 00000000..b0445c6e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/index.html.ko.euc-kr @@ -0,0 +1,97 @@ + + + +¼­¹ö¿Í Áö¿ø ÇÁ·Î±×·¥ - Apache HTTP Server + + + + + +
    <-
    +

    ¼­¹ö¿Í Áö¿ø ÇÁ·Î±×·¥

    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + es  | + ko  | + ru  | + tr 

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

    ¾ÆÆÄÄ¡ À¥¼­¹ö¿¡ Æ÷ÇÔµÈ ÇÁ·Î±×·¥µéÀÌ´Ù.

    +
    +
    top
    +
    +

    ¸ñ·Ï

    + +
    +
    httpd
    + +
    ¾ÆÆÄÄ¡ ÇÏÀÌÆÛÅؽºÆ® Àü¼Û ÇÁ·ÎÅäÄÝ ¼­¹ö
    + +
    apachectl
    + +
    ¾ÆÆÄÄ¡ À¥¼­¹ö Á¶Àý ÀÎÅÍÆäÀ̽º
    + +
    ab
    + +
    ¾ÆÆÄÄ¡ À¥¼­¹ö ¼º´É°Ë»ç µµ±¸
    + +
    apxs
    + +
    ¾ÆÆÄÄ¡ È®Àå µµ±¸ (APache eXtenSion tool)
    + +
    configure
    + +
    ¼Ò½º Æ®¸®¸¦ ±¸¼ºÇÑ´Ù
    + +
    dbmmanage
    + +
    basic authentication¿¡ »ç¿ëÇÒ DBM Çü½ÄÀÇ »ç¿ëÀÚ + ÀÎÁõÆÄÀÏÀ» ¸¸µé°í ¼öÁ¤ÇÑ´Ù
    + +
    htdigest
    + +
    digest authentication¿¡ »ç¿ëÇÒ »ç¿ëÀÚ ÀÎÁõÆÄÀÏÀ» + ¸¸µé°í ¼öÁ¤ÇÑ´Ù
    + +
    htpasswd
    + +
    basic authentication¿¡ »ç¿ëÇÒ »ç¿ëÀÚ ÀÎÁõÆÄÀÏÀ» ¸¸µé°í + ¼öÁ¤ÇÑ´Ù
    + +
    logresolve
    + +
    ¾ÆÆÄÄ¡ ·Î±×ÆÄÀÏÀÇ IP-ÁÖ¼Ò¸¦ È£½ºÆ®¸íÀ¸·Î º¯È¯ÇÑ´Ù
    + +
    rotatelogs
    + +
    ¼­¹ö¸¦ Á×ÀÌÁö¾Ê°í ¾ÆÆÄÄ¡ ·Î±×¸¦ ¼øȯÇÑ´Ù
    + +
    suexec
    + +
    ½ÇÇàÀ» À§ÇØ »ç¿ëÀÚ¸¦ º¯°æÇÑ´Ù (Switch User For Exec)
    + +
    ´Ù¸¥ ÇÁ·Î±×·¥µé
    +
    manpage°¡ ¾ø´Â Áö¿ø µµ±¸µé.
    +
    +
    +
    +

    °¡´ÉÇÑ ¾ð¾î:  en  | + es  | + ko  | + ru  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/index.html.ru.koi8-r b/rubbos/app/httpd-2.0.64/docs/manual/programs/index.html.ru.koi8-r new file mode 100644 index 00000000..76f565cd --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/index.html.ru.koi8-r @@ -0,0 +1,95 @@ + + + +óÅÒ×ÅÒ É ×ÓÐÏÍÏÇÁÔÅÌØÎÙÅ ÐÒÏÇÒÁÍÍÙ - HTTP ÓÅÒ×ÅÒ Apache + + + + + +
    <-
    +

    óÅÒ×ÅÒ É ×ÓÐÏÍÏÇÁÔÅÌØÎÙÅ ÐÒÏÇÒÁÍÍÙ

    +
    +

    äÏÓÔÕÐÎÙÅ ÑÚÙËÉ:  en  | + es  | + ko  | + ru  | + tr 

    +
    + +

    üÔÏÔ ÄÏËÕÍÅÎÔ ÏÐÉÓÙ×ÁÅÔ ÎÁÚÎÁÞÅÎÉÅ É ÉÐÏÌØÚÏ×ÁÎÉÅ + ×ÓÅÈ ÉÓÐÏÌÎÑÅÍÙÈ ÆÁÊÌÏ× HTTP ÓÅÒ×ÅÒÁ Apache.

    +
    +
    top
    +
    +

    õËÁÚÁÔÅÌØ

    + +
    +
    httpd
    + +
    HTTP ÓÅÒ×ÅÒ Apache
    + +
    apachectl
    + +
    éÎÔÅÒÆÅÊÓ ÕÐÒÁ×ÌÅÎÉÑ HTTP ÓÅÒ×ÅÒÏÍ Apache
    + +
    ab
    + +
    õÔÉÌÉÔÁ ÄÌÑ ÔÅÓÔÉÒÏ×ÁÎÉÑ HTTP ÓÅÒ×ÅÒÁ Apache
    + +
    apxs
    + +
    õÔÉÌÉÔÁ APache eXtenSion
    + +
    dbmmanage
    + +
    óÏÚÄÁÎÉÅ É ÏÂÎÏ×ÌÅÎÉÅ ÆÁÊÌÏ× ÐÁÒÏÌÅÊ ÐÏÌØÚÏ×ÁÔÅÌÅÊ × ÆÏÒÍÁÔÅ DBM, + ÎÅÏÂÈÏÄÉÍÙÈ ÄÌÑ ÂÁÚÏ×ÏÊ ÁÕÔÅÎÔÉÆÉËÁÃÉÉ (basic authentification)
    + +
    htdigest
    + +
    óÏÚÄÁÎÉÅ É ÏÂÎÏ×ÌÅÎÉÅ ÆÁÊÌÏ× ÐÁÒÏÌÅÊ ÐÏÌØÚÏ×ÁÔÅÌÅÊ ÄÌÑ + ÄÁÊÄÖÅÓÔÎÏÊ ÁÕÔÅÎÔÉÆÉËÁÃÉÉ (digest authentification)
    + +
    htpasswd
    + +
    óÏÚÄÁÎÉÅ É ÏÂÎÏ×ÌÅÎÉÅ ÆÁÊÌÏ× ÐÁÒÏÌÅÊ ÐÏÌØÚÏ×ÁÔÅÌÅÊ + ÄÌÑ ÂÁÚÏ×ÏÊ ÁÕÔÅÎÔÉÆÉËÁÃÉÉ (basic authentification)
    + +
    logresolve
    + +
    õÔÉÌÉÔÁ ÄÌÑ ÐÒÅÏÂÒÁÚÏ×ÁÎÉÑ IP-ÁÄÒÅÓÏ× × ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÉÅ + ÉÍ ÉÍÅÎÁ ÈÏÓÔÏ× × ÌÏÇ-ÆÁÊÌÁÈ Apache
    + +
    rotatelogs
    + +
    õÔÉÌÉÔÁ, ÐÏÚ×ÏÌÑÀÝÁÑ ÐÒÏÉÚ×ÏÄÉÔØ ÒÏÔÁÃÉÀ ÌÏÇ-ÆÁÊÌÏ× Apache ÂÅÚ + ÏÓÔÁÎÏ×ËÉ ÓÅÒ×ÅÒÁ
    + +
    suexec
    + +
    Switch User For Exec - ÕÔÉÌÉÔÁ, ÐÏÚ×ÏÌÑÀÝÁÑ ×ÙÐÏÌÎÑÔØ CGI-ÓËÒÉÐÔ ÏÔ ÉÍÅÎÉ + ÄÒÕÇÏÇÏ ÐÏÌØÚÏ×ÁÔÅÌÑ
    + +
    äÒÕÇÉÅ ÐÒÏÇÒÁÍÍÙ
    +
    ÷ÓÐÏÍÏÇÁÔÅÌØÎÙÅ ÕÔÉÌÉÔÙ, ÎÅ ÉÍÅÀÝÉÅ Ó×ÏÉÈ ÓÏÂÓÔ×ÅÎÎÙÈ ÓÐÒÁ×ÏÞÎÙÈ ÒÕËÏ×ÏÄÓÔ×
    +
    +
    +
    +

    äÏÓÔÕÐÎÙÅ ÑÚÙËÉ:  en  | + es  | + ko  | + ru  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/index.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/programs/index.html.tr.utf8 new file mode 100644 index 00000000..390411d3 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/index.html.tr.utf8 @@ -0,0 +1,90 @@ + + + +Sunucu ve Destek Programları - Apache HTTP Sunucusu + + + + + +
    <-
    +

    Sunucu ve Destek Programları

    +
    +

    Mevcut Diller:  en  | + es  | + ko  | + ru  | + tr 

    +
    + +

    Bu sayfada Apache HTTP Sunucusuna dahil tüm çalıştırılabilir programlar + tanıtılmıştır.

    +
    +
    top
    +
    +

    Dizin

    + +
    +
    httpd
    +
    Apache hiper metin aktarım protokolü sunucusu.
    + +
    apachectl
    +
    Apache HTTP Sunucusu denetim arayüzü.
    + +
    ab
    +
    Apache HTTP Sunucusu başarım ölçme aracı.
    + +
    apxs
    +
    Apache HTTP Sunucusu eklenti aracı (APache eXtenSion tool).
    + +
    configure
    +
    Kaynak ağacını yapılandırır.
    + +
    dbmmanage
    +
    Kullanıcı kimlik doğrulama dosyalarını temel kimlik doğrulaması için + DBM biçeminde oluşturur ve günceller.
    + +
    htdigest
    +
    Kullanıcı kimlik doğrulama dosyalarını özet kimlik doğrulaması için + oluşturur ve günceller.
    + +
    htdbm
    +
    DBM parola veritabanlarını idare eder.
    + +
    htpasswd
    +
    Kullanıcı kimlik doğrulama dosyalarını temel kimlik doğrulaması için + oluşturur ve günceller.
    + +
    logresolve
    +
    Apache günlük dosyalarındaki IP adreslerini konak isimlerine + dönüştürür.
    + +
    rotatelogs
    +
    Sunucuyu öldürmek gerekmeksizin günlük dosyalarının döndürülmesini + sağlar.
    + +
    suexec
    +
    Bir dosyayı belli bir kullanıcı adına çalıştırır.
    + +
    Diğer Programlar
    +
    Kendi kılavuz sayfası bulunmayan destek araçları.
    +
    +
    +
    +

    Mevcut Diller:  en  | + es  | + ko  | + ru  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/logresolve.html b/rubbos/app/httpd-2.0.64/docs/manual/programs/logresolve.html new file mode 100644 index 00000000..a8958c83 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/logresolve.html @@ -0,0 +1,13 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: logresolve.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: logresolve.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: logresolve.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/logresolve.html.en b/rubbos/app/httpd-2.0.64/docs/manual/programs/logresolve.html.en new file mode 100644 index 00000000..419791f7 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/logresolve.html.en @@ -0,0 +1,74 @@ + + + +logresolve - Resolve IP-addresses to hostnames in Apache + log files - Apache HTTP Server + + + + + +
    <-
    +

    logresolve - Resolve IP-addresses to hostnames in Apache + log files

    +
    +

    Available Languages:  en  | + ko  | + tr 

    +
    + +

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

    + +

    Takes an Apache log file on standard input. The IP addresses + must be the first thing on each line and must be seperated from + the remainder of the line by a space.

    +
    + +
    top
    +
    +

    Synopsis

    + +

    logresolve [ -s + filename ] [ -c ] < + access_log > access_log.new

    +
    top
    +
    +

    Options

    + +
    + +
    -s filename
    + +
    Specifies a filename to record statistics.
    + +
    -c
    + +
    This causes logresolve 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.
    + +
    +
    +
    +

    Available Languages:  en  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/logresolve.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/programs/logresolve.html.ko.euc-kr new file mode 100644 index 00000000..622db237 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/logresolve.html.ko.euc-kr @@ -0,0 +1,71 @@ + + + +logresolve - ¾ÆÆÄÄ¡ ·Î±×ÆÄÀÏÀÇ IP-ÁÖ¼Ò¸¦ È£½ºÆ®¸íÀ¸·Î + º¯È¯ÇÑ´Ù - Apache HTTP Server + + + + + +
    <-
    +

    logresolve - ¾ÆÆÄÄ¡ ·Î±×ÆÄÀÏÀÇ IP-ÁÖ¼Ò¸¦ È£½ºÆ®¸íÀ¸·Î + º¯È¯ÇÑ´Ù

    +
    +

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

    +
    + +

    logresolve´Â ¾ÆÆÄÄ¡ Á¢±Ù·Î±×ÆÄÀÏ¿¡ ÀÖ´Â + IP-ÁÖ¼Ò¸¦ ã´Â ÈÄó¸® ÇÁ·Î±×·¥ÀÌ´Ù. ³×ÀÓ¼­¹öÀÇ ºÎÇϸ¦ + ÃÖ¼ÒÈ­ÇϱâÀ§ÇØ logresolve´Â ³»ºÎÀûÀ¸·Î Çؽ¬Å×À̺í ij½¬¸¦ + »ç¿ëÇÑ´Ù. Áï, IP ÁÖ¼Ò°¡ ·Î±×ÆÄÀÏ¿¡ óÀ½ ³ª¿Ã¶§¸¸ ã´Â´Ù.

    + +

    Ç¥ÁØÀÔ·ÂÀ¸·Î ¾ÆÆÄÄ¡ ·Î±×ÆÄÀÏÀ» Àд´Ù. °¢ ÁÙÀÇ Ã¹¹ø° + Ç׸ñÀÌ IP ÁÖ¼ÒÀÌ°í, ³ª¸ÓÁö ºÎºÐ°ú °ø¹éÀ¸·Î ±¸ºÐµÇ¾ß ÇÑ´Ù.

    +
    + +
    top
    +
    +

    °³¿ä

    + +

    logresolve [ -s + filename ] [ -c ] < + access_log > access_log.new

    +
    top
    +
    +

    ¿É¼Ç

    + +
    + +
    -s filename
    + +
    Åë°è¸¦ ±â·ÏÇÒ ÆÄÀϸíÀ» ÁöÁ¤ÇÑ´Ù.
    + +
    -c
    + +
    logresolve°¡ ¸î°¡Áö DNS °Ë»ç¸¦ Çϵµ·Ï ÇÑ´Ù: +IP ÁּҷΠȣ½ºÆ®¸íÀ» ãÀºÈÄ ±× È£½ºÆ®¸íÀ¸·Î ´Ù½Ã IP ÁÖ¼ÒµéÀ» +ã¾Æ¼­ ±×Áß Çϳª°¡ ¿ø·¡ ÁÖ¼Ò¿Í ÀÏÄ¡ÇÏ´ÂÁö °Ë»çÇÑ´Ù.
    + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/logresolve.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/programs/logresolve.html.tr.utf8 new file mode 100644 index 00000000..0f11eae8 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/logresolve.html.tr.utf8 @@ -0,0 +1,71 @@ + + + +logresolve - Apache günlük dosyalarındaki IP adreslerini konak + isimlerine dönüştürür - Apache HTTP Sunucusu + + + + + +
    <-
    +

    logresolve - Apache günlük dosyalarındaki IP adreslerini konak + isimlerine dönüştürür

    +
    +

    Mevcut Diller:  en  | + ko  | + tr 

    +
    + +

    logresolve, 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 + logresolve kendi arabelleğinde oluşturduğu + eşleme tablosunu kullanır.

    + +

    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.

    +
    + +
    top
    +
    +

    Kullanım

    + +

    logresolve [ -s + dosyaismi ] [ -c ] < + günlük_dosyası > yeni_günlük_dosyası

    +
    top
    +
    +

    Seçenekler

    + +
    +
    -s dosyaismi
    +
    İstatistiklerin kaydedileceği dosyanın ismi belirtilir.
    + +
    -c
    +
    logresolve 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.
    + +
    +
    +
    +

    Mevcut Diller:  en  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/other.html b/rubbos/app/httpd-2.0.64/docs/manual/programs/other.html new file mode 100644 index 00000000..d9c31cd3 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/other.html @@ -0,0 +1,13 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: other.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: other.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: other.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/other.html.en b/rubbos/app/httpd-2.0.64/docs/manual/programs/other.html.en new file mode 100644 index 00000000..d4114ddb --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/other.html.en @@ -0,0 +1,61 @@ + + + +Other Programs - Apache HTTP Server + + + + + +
    <-
    +

    Other Programs

    +
    +

    Available Languages:  en  | + ko  | + tr 

    +
    + +

    The following programs are simple support programs included with the + Apache HTTP Server which do not have their own manual pages. They are not + installed automatically. You can find them after the configuration process + in the support/ directory.

    +
    + +
    top
    +
    +

    log_server_status

    +

    This perl script is designed to be run at a frequent interval by + something like cron. It connects to the server and downloads the status + information. It reformats the information to a single line and logs it to + a file. Adjust the variables at the top of the script to specify the + location of the resulting logfile.

    +
    top
    +
    +

    split-logfile

    +

    This perl script will take a combined Web server access log file and + break its contents into separate files. It assumes that the first field of + each line is the virtual host identity (put there by "%v"), and + that the logfiles should be named that + ".log" in the current + directory.

    + +

    The combined log file is read from stdin. Records read will be appended + to any existing log files.

    +
    +
    +

    Available Languages:  en  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/other.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/programs/other.html.ko.euc-kr new file mode 100644 index 00000000..113ecd8a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/other.html.ko.euc-kr @@ -0,0 +1,59 @@ + + + +Other Programs - Apache HTTP Server + + + + + +
    <-
    +

    Other Programs

    +
    +

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

    +
    + +

    ´ÙÀ½Àº °£´ÜÇÏ¿© manpage°¡ ¾ø´Â, ¾ÆÆÄÄ¡ À¥¼­¹ö¿¡ Æ÷ÇÔµÈ + Áö¿ø ÇÁ·Î±×·¥µéÀÌ´Ù. ÀÚµ¿À¸·Î À̵éÀ» ¼³Ä¡ÇÏÁö ¾Ê´Â´Ù. + ±¸¼º°úÁ¤ÈÄ support/ µð·ºÅ丮¿¡¼­ ÀÌ ÇÁ·Î±×·¥µéÀ» + ãÀ» ¼ö ÀÖ´Ù.

    +
    + +
    top
    +
    +

    log_server_status

    +

    ÀÌ perl ½ºÅ©¸³Æ®´Â cron µî¿¡¼­ ÀÚÁÖ ½ÇÇàÇϵµ·Ï ¼³°èµÇ¾ú´Ù. + ÀÌ ½ºÅ©¸³Æ®¸¦ ¼­¹ö¿¡ ¿¬°áÇÏ¿© »óÅ Á¤º¸¸¦ ´Ù¿î·ÎµåÇÑ´Ù. + ±×·±ÈÄ ÀÌ Á¤º¸¸¦ ÇÑÁÙ·Î Á¤¸®ÇÏ¿© ÆÄÀÏ¿¡ ±â·ÏÇÑ´Ù. ·Î±×ÆÄÀÏÀÇ + À§Ä¡¸¦ ÁöÁ¤ÇÏ·Á¸é ½ºÅ©¸³Æ® ¾ÕºÎºÐÀÇ º¯¼ö¸¦ ¼öÁ¤ÇÑ´Ù.

    +
    top
    +
    +

    split-logfile

    +

    ÀÌ perl ½ºÅ©¸³Æ®´Â °áÇÕµÈ À¥¼­¹ö Á¢±Ù·Î±×ÆÄÀÏÀÇ ³»¿ëÀ» + ¿©·¯ ÆÄÀÏ·Î ³ª´«´Ù. °¢ ÁÙÀÇ Ã¹¹ø° Ç׸ñÀÌ ("%v"·Î + Ãß°¡ÇÑ) °¡»óÈ£½ºÆ® Á¤º¸ÀÌ°í, ·Î±×ÆÄÀϸíÀº ÇöÀç µð·ºÅ丮¿¡ + °¡»óÈ£½ºÆ®¸í + ".log"¶ó°í °¡Á¤ÇÑ´Ù.

    + +

    °áÇÕµÈ ·Î±×ÆÄÀÏÀ» Ç¥ÁØÀÔ·ÂÀ¸·Î Àд´Ù. ÀÐÀº ³»¿ëÀ» ±âÁ¸ÀÇ + ·Î±×ÆÄÀϵ鿡 Ãß°¡ÇÑ´Ù.

    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/other.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/programs/other.html.tr.utf8 new file mode 100644 index 00000000..c0cce4c2 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/other.html.tr.utf8 @@ -0,0 +1,64 @@ + + + +Diğer Programlar - Apache HTTP Sunucusu + + + + + +
    <-
    +

    Diğer Programlar

    +
    +

    Mevcut Diller:  en  | + ko  | + tr 

    +
    + +

    Aşağıdaki programlar Apache HTTP Sunucusu ile gelen basit destek + programları olup kendilerine ait kılavuz sayfaları yoktur. Bunlar + özdevinimli olarak kurulmazlar. Derleme işleminden sonra bunları + support/ dizininde bulabilirsiniz.

    +
    + +
    top
    +
    +

    log_server_status

    +

    Bu perl betiği cron gibi bir şeyleri belli aralıklarla çalıştırmak için + tasarlanmıştır. Sunucuya bağlanıp durum bilgisini indirdikten sonra bunları + tek bir satır haline getirip bir günlük dosyasına kaydeder. Sonuçların + kaydedileceği günlük dosyasını betiğin başlangıcındaki değişkenlerde + değişiklik yaparak belirtebilirsiniz.

    +
    top
    +
    +

    split-logfile

    +

    Bu perl betiği sanal konaklı bir birleşik günlük dosyasını girdi olarak + alır ve içeriğini ayrı dosyalara böler. Günlük dosyaları isimlendirilirken + sanal konak isimlerinin sonlarına .log uzantısı getirilir. + Günlük dosyasındaki her kaydın ilk bileşeninin, LogFormat yönergesinde + "%v" belirteci ile ifade edilen sanal konak adı olduğu + varsayılır.

    + +

    Birleşik günlük dosyası standart girdiden okunur. Kayıtlar okundukça + her biri kendi günlük dosyasına kaydedilir.

    + +

    split-logfile < access_log

    +
    +
    +

    Mevcut Diller:  en  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/rotatelogs.html b/rubbos/app/httpd-2.0.64/docs/manual/programs/rotatelogs.html new file mode 100644 index 00000000..3879fb33 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/rotatelogs.html @@ -0,0 +1,13 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: rotatelogs.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: rotatelogs.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: rotatelogs.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/rotatelogs.html.en b/rubbos/app/httpd-2.0.64/docs/manual/programs/rotatelogs.html.en new file mode 100644 index 00000000..6bcf7a83 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/rotatelogs.html.en @@ -0,0 +1,148 @@ + + + +rotatelogs - Piped logging program to rotate Apache logs - Apache HTTP Server + + + + + +
    <-
    +

    rotatelogs - Piped logging program to rotate Apache logs

    +
    +

    Available Languages:  en  | + ko  | + tr 

    +
    + +

    rotatelogs is a simple program for use in + conjunction with Apache's piped logfile feature. For example:

    + +

    + CustomLog "|bin/rotatelogs /var/logs/logfile 86400" common +

    + +

    This creates the files /var/logs/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.

    + +

    + CustomLog "|bin/rotatelogs /var/logs/logfile 5M" common +

    + +

    This configuration will rotate the logfile whenever it reaches + a size of 5 megabytes.

    + +

    + ErrorLog "|bin/rotatelogs /var/logs/errorlog.%Y-%m-%d-%H_%M_%S 5M" +

    +

    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 + errorlog.YYYY-mm-dd-HH_MM_SS.

    + +
    + +
    top
    +
    +

    Synopsis

    + +

    rotatelogs + [ -l ] + logfile + [ rotationtime [ offset ]] | + [ filesizeM ]

    +
    top
    +
    +

    Options

    + +
    + +
    -l (2.0.51 and later)
    +
    Causes the use of local time rather than GMT as the base for the +interval. Note that using -l in an environment which changes the +GMT offset (such as for BST or DST) can lead to unpredictable results!
    + +
    logfile
    + +
    The path plus basename of the logfile. If logfile +includes any '%' characters, it is treated as a format string for +strftime(3). Otherwise, the suffix +.nnnnnnnnnn is automatically added and is the time in +seconds. Both formats compute the start time from the beginning of +the current period.
    + +
    rotationtime
    + +
    The time between log file rotations in seconds.
    + +
    offset
    + +
    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 -300 for this argument.
    + +
    filesizeM
    + +
    The maximum file size in megabytes followed by the letter +M to specify size rather than time. Use this parameter +in place of both rotationtime and offset.
    +
    +
    top
    +
    +

    Portability

    + +

    The following logfile format string substitutions should be +supported by all strftime(3) implementations, see +the strftime(3) man page for library-specific +extensions.

    + + + + + + + + + + + + + + + + + + + + + + + +
    %Afull weekday name (localized)
    %a3-character weekday name (localized)
    %Bfull month name (localized)
    %b3-character month name (localized)
    %cdate and time (localized)
    %d2-digit day of month
    %H2-digit hour (24 hour clock)
    %I2-digit hour (12 hour clock)
    %j3-digit day of year
    %M2-digit minute
    %m2-digit month
    %pam/pm of 12 hour clock (localized)
    %S2-digit second
    %U2-digit week of year +(Sunday first day of week)
    %W2-digit week of year +(Monday first day of week)
    %w1-digit weekday +(Sunday first day of week)
    %Xtime (localized)
    %xdate (localized)
    %Y4-digit year
    %y2-digit year
    %Ztime zone name
    %%literal `%'
    + +
    +
    +

    Available Languages:  en  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/rotatelogs.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/programs/rotatelogs.html.ko.euc-kr new file mode 100644 index 00000000..fdf9cac8 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/rotatelogs.html.ko.euc-kr @@ -0,0 +1,147 @@ + + + +rotatelogs - ¾ÆÆÄÄ¡ ·Î±×¸¦ ¼øȯÇϱâÀ§ÇØ ÆÄÀÌÇÁ·Î ¿¬°áÇÒ + ·Î±× ÇÁ·Î±×·¥ - Apache HTTP Server + + + + + +
    <-
    +

    rotatelogs - ¾ÆÆÄÄ¡ ·Î±×¸¦ ¼øȯÇϱâÀ§ÇØ ÆÄÀÌÇÁ·Î ¿¬°áÇÒ + ·Î±× ÇÁ·Î±×·¥

    +
    +

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

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

    rotatelogs´Â ¾ÆÆÄÄ¡ÀÇ ÆÄÀÌÇÁ ·Î±×ÆÄÀÏ ±â´ÉÀ» + À§ÇÑ °£´ÜÇÑ ÇÁ·Î±×·¥ÀÌ´Ù. ¿¹¸¦ µé¾î:

    + +

    + CustomLog "|bin/rotatelogs /var/logs/logfile 86400" common +

    + +

    ±×·¯¸é /var/logs/logfile.nnnn ÆÄÀÏÀ» ¸¸µç´Ù. nnnnÀº + ·Î±×¸¦ ½ÃÀÛÇÑ ½Ã½ºÅ۽ð£ÀÌ´Ù (ÀÌ ½Ã°£Àº Ç×»ó ¼øȯ±â°£ÀÇ + ¹è¼öÀÌ´Ù. ±×·¡¼­ cron ½ºÅ©¸³Æ®·Î ó¸®Çϱ⠽±´Ù). ¼øȯ±â°£ + (¿©±â¼­´Â 24 ½Ã°£) ¸¶´Ù »õ·Î¿î ·Î±×¸¦ ½ÃÀÛÇÑ´Ù.

    + +

    + CustomLog "|bin/rotatelogs /var/logs/logfile 5M" common +

    + +

    ÀÌ ¼³Á¤Àº ·Î±×ÆÄÀÏ Å©±â°¡ 5 ¸Þ°¡¹ÙÀÌÆ®°¡ µÉ¶§¸¶´Ù + ¼øȯÇÑ´Ù.

    + +

    + ErrorLog "|bin/rotatelogs /var/logs/errorlog.%Y-%m-%d-%H_%M_%S 5M" +

    +

    ÀÌ ¼³Á¤Àº ¿À·ù·Î±× ÆÄÀÏ Å©±â°¡ 5 ¸Þ°¡¹ÙÀÌÆ®°¡ µÉ¶§¸¶´Ù + errorlog.YYYY-mm-dd-HH_MM_SS¿Í °°Àº ÆÄÀÏÀ» + ¸¸µé¾î¼­ ¿À·ù·Î±× ÆÄÀÏÀ» ¼øȯÇÑ´Ù.

    + +
    + +
    top
    +
    +

    °³¿ä

    + +

    rotatelogs + [ -l ] + logfile + [ rotationtime [ offset ]] | + [ filesizeM ]

    +
    top
    +
    +

    ¿É¼Ç

    + +
    + +
    -l (2.0.51 ÀÌÈÄ)
    +
    ¼øȯÁÖ±â·Î GMT ´ë½Å Áö¿ª½Ã°£À» »ç¿ëÇÑ´Ù. (BST³ª DST¿Í °°ÀÌ) +GMT ½Ã°£Â÷°¡ º¯Çϴ ȯ°æ¿¡¼­ -lÀ» »ç¿ëÇÏ¸é ¿¹±âÄ¡ +¾ÊÀº °á°ú°¡ ¹ß»ýÇÒ ¼ö ÀÖ´Ù!
    + +
    logfile
    + +
    ·Î±×ÆÄÀÏÀÇ °æ·Î¿Í À̸§. logfile¿¡ '%' ¹®ÀÚ°¡ +ÀÖ´Ù¸é strftime(3)ÀÇ Çü½Ä¹®ÀÚ¿­°ú °°ÀÌ Ã³¸®ÇÑ´Ù. +'%' ¹®ÀÚ°¡ ¾ø´Ù¸é µÚ¿¡ ÃÊ´ÜÀ§ ½Ã°£ .nnnnnnnnnnÀ» +ÀÚµ¿À¸·Î ºÙÀδÙ. µÎ Çü½Ä ¸ðµÎ ÇöÀç ±â°£ºÎÅÍ ½ÃÀ۽ð£À» °è»êÇÑ´Ù.
    + +
    rotationtime
    + +
    ·Î±×ÆÄÀÏÀ» ¼øȯÇÒ ÃÊ´ÜÀ§ ½Ã°£.
    + +
    offset
    + +
    UTC¿¡¼­ ºÐ´ÜÀ§ ½Ã°£Â÷ÀÌ. »ý·«Çϸé 0À¸·Î °¡Á¤ÇÏ¿© UTC¸¦ +»ç¿ëÇÑ´Ù. ¿¹¸¦ µé¾î, UTC -5 ½Ã°£´ëÀÇ Áö¿ª½Ã°£À» »ç¿ëÇÑ´Ù¸é +¾Æ±Ô¸ÕÆ®·Î -300À» ÁöÁ¤ÇÑ´Ù.
    + +
    filesizeM
    + +
    ½Ã°£ÀÌ ¾Æ´Ñ Å©±â¸¦ ÁöÁ¤ÇÒ¶§ ¸Þ°¡¹ÙÀÌÆ®´ÜÀ§ ÃÖ´ë ÆÄÀÏÅ©±â +µÚ¿¡ MÀ» ºÙÀδÙ. rotationtime°ú offset ´ë½Å ÀÌ +ÆĶó¹ÌÅ͸¦ »ç¿ëÇÑ´Ù.
    +
    +
    top
    +
    +

    Æ÷Æð¡´É¼º

    + +

    ´ÙÀ½ ·Î±×ÆÄÀÏ Çü½Ä¹®ÀÚ¿­ Ç¥ÇöÀº ¸ðµç strftime(3) +±¸ÇöÀÌ Áö¿øÇØ¾ß ÇÑ´Ù. ¶óÀ̺귯¸® ƯÀ¯ÀÇ È®ÀåÀº +strftime(3) manpage¸¦ Âü°íÇ϶ó.

    + + + + + + + + + + + + + + + + + + + + + + + +
    %A(Áö¿ªÈ­µÈ) ¿ÏÀüÇÑ ¿äÀÏ À̸§
    %a(Áö¿ªÈ­µÈ) 3-¹®ÀÚ ¿äÀÏ À̸§
    %B(Áö¿ªÈ­µÈ) ¿ÏÀüÇÑ ´Þ À̸§
    %b(Áö¿ªÈ­µÈ) 3-¹®ÀÚ ´Þ À̸§
    %c(Áö¿ªÈ­µÈ) ³¯Â¥¿Í ½Ã°£
    %d2-ÀÚ¸® ÀÏ
    %H2-ÀÚ¸® ½Ã°£ (24 ½Ã°£ ½Ã°è)
    %I2-ÀÚ¸® ½Ã°£ (12 ½Ã°£ ½Ã°è)
    %j3-ÀÚ¸® ³¯Â¥¼ö
    %M2-ÀÚ¸® ºÐ
    %m2-ÀÚ¸® ´Þ
    %p(Áö¿ªÈ­µÈ) 12 ½Ã°£ ½Ã°èÀÇ am/pm
    %S2-ÀÚ¸® ÃÊ
    %U2-ÀÚ¸® ÁÖÀϼö (ÁÖÀÇ Ã¹¹øÀç ³¯Àº +ÀÏ¿äÀÏ)
    %W2-ÀÚ¸® ÁÖÀϼö (ÁÖÀÇ Ã¹¹øÀç ³¯Àº +¿ù¿äÀÏ)
    %w1-ÀÚ¸® ¿äÀϼö (ÁÖÀÇ Ã¹¹ø° ³¯Àº +ÀÏ¿äÀÏ)
    %X(Áö¿ªÈ­µÈ) ½Ã°£
    %x(Áö¿ªÈ­µÈ) ³¯Â¥
    %Y4-ÀÚ¸® ¿¬µµ
    %y2-ÀÚ¸® ¿¬µµ
    %Z½Ã°£´ë À̸§
    %%¹®ÀÚ±×´ë·Î `%'
    + +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/rotatelogs.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/programs/rotatelogs.html.tr.utf8 new file mode 100644 index 00000000..d272fd0f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/rotatelogs.html.tr.utf8 @@ -0,0 +1,172 @@ + + + +rotatelogs - Apache günlüklerini döndürmek için borulu günlük kayıt + programı - Apache HTTP Sunucusu + + + + + +
    <-
    +

    rotatelogs - Apache günlüklerini döndürmek için borulu günlük kayıt + programı

    +
    +

    Mevcut Diller:  en  | + ko  | + tr 

    +
    + +

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

    +
    + +
    top
    +
    +

    Kullanım

    + +

    rotatelogs + [ -l ] + dosyaismi + [ süre [ saat_farkı ]] | + [ boyutM ]

    +
    top
    +
    +

    Seçenekler

    + +
    +
    -l (2.0.51 ve sonrası)
    +
    GMT yerine yerel zamanın kullanılmasını sağlar. Zaman dilimi değişik + olan ortamlarda (BST, DST gibi) bu seçeneğin kullanımı beklenmedik + sonuçlar verebilir!
    + +
    dosyaismi
    +
    Günlük dosyasının ismi yoluyla birlikte belirtilir. + dosyaismi '%' karakterleri içeriyorsa bunlar + strftime(3) biçem belirteçleri olarak ele alınır. Aksi + takdirde, özdevinimli olarak .nnnnnnnnnn uzantısı üretilir. + 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.
    + +
    süre
    +
    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.)
    + +
    boyutM
    +
    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 + M (megabayt) harfi konmalıdır. + +

    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.

    + +
    saat_farkı
    +
    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 + -l seçeneğini kullanmak gerekir.
    + +
    +
    top
    +
    +

    Örnekler

    + +

    + CustomLog "|bin/rotatelogs /var/logs/logfile 86400" common +

    + +

    nnnn, günlük kaydının başladığı sistem zamanı olmak üzere + /var/logs/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.

    + +

    + CustomLog "|bin/rotatelogs -l /var/logs/logfile.%Y.%m.%d 86400" common +

    + +

    yyyy, yıl; mm, ay; dd, ayın gününü belirtmek üzere + /var/logs/logfile.yyyy.mm.dd dosyası oluşturulur. Her gün yerel zamanla + geceyarısı yeni bir günlük dosyasına geçilecektir.

    + +

    + CustomLog "|bin/rotatelogs /var/logs/logfile 5M" common +

    + +

    Günlük dosyası 5 megabaytlık olunca yenisinin oluşturulmasını sağlar. +

    + +

    + ErrorLog "|bin/rotatelogs /var/logs/errorlog.%Y-%m-%d-%H_%M_%S 5M" +

    +

    Hata günlüğünün 5 megabaytta bir + errorlog.YYYY-mm-dd-HH_MM_SS biçemli bir isimle + oluşturulmasını sağlar.

    + +
    top
    +
    +

    Taşınabilirlik

    + +

    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.

    + + + + + + + + + + + + + + + + + + + + + + + +
    %Atam gün ismi (yerelleştirilmiş)
    %a3 harflik gün ismi +(yerelleştirilmiş)
    %Btam ay ismi (yerelleştirilmiş)
    %b3 harflik ay ismi (yerelleştirilmiş)
    %ctarih ve saat (yerelleştirilmiş)
    %d2 haneli ay günü numarası
    %H2 haneli saat (24 saatlik)
    %I2 haneli saat (12 saatlik)
    %j3 hanelik yıl günü numarası
    %M2 haneli dakika
    %m2 haneli ay
    %p12 saatlik kip için öö/ös +(yerelleştirilmiş)
    %S2 haneli saniye
    %U2 haneli yılın hafta numarası +(Haftanın ilk gününün Pazar olduğu varsayımıyla)
    %W2 haneli yılın hafta numarası +(Haftanın ilk gününün Pazartesi olduğu varsayımıyla)
    %w1 hanelik haftanın gün numarası +(Haftanın ilk gününün Pazar olduğu varsayımıyla)
    %Xsaat (yerelleştirilmiş)
    %xtarih (yerelleştirilmiş)
    %Y4 hanelik yıl
    %y2 hanelik yıl
    %Zzaman dilimi ismi
    %%`%' iminin kendisi
    + +
    +
    +

    Mevcut Diller:  en  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/suexec.html b/rubbos/app/httpd-2.0.64/docs/manual/programs/suexec.html new file mode 100644 index 00000000..439a0689 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/suexec.html @@ -0,0 +1,13 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: suexec.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: suexec.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: suexec.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/suexec.html.en b/rubbos/app/httpd-2.0.64/docs/manual/programs/suexec.html.en new file mode 100644 index 00000000..1e233439 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/suexec.html.en @@ -0,0 +1,63 @@ + + + +suexec - Switch user before executing external programs - Apache HTTP Server + + + + + +
    <-
    +

    suexec - Switch user before executing external programs

    +
    +

    Available Languages:  en  | + ko  | + tr 

    +
    + +

    suexec 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 root. Since the HTTP daemon normally doesn't + run as root, the suexec executable needs the + setuid bit set and must be owned by root. It should never be + writable for any other person than root.

    + +

    For further information about the concepts and and the security model + of suexec please refer to the suexec documentation (http://httpd.apache.org/docs/2.0/suexec.html).

    +
    + +
    top
    +
    +

    Synopsis

    +

    suexec -V

    +
    top
    +
    +

    Options

    + +
    +
    -V
    + +
    If you are root, this option displays the compile options of +suexec. For security reasons all configuration options are +changeable only at compile time.
    + +
    +
    +
    +

    Available Languages:  en  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/suexec.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/programs/suexec.html.ko.euc-kr new file mode 100644 index 00000000..e2b9c5a9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/suexec.html.ko.euc-kr @@ -0,0 +1,64 @@ + + + +suexec - ¿ÜºÎ ÇÁ·Î±×·¥À» ½ÇÇàÇϱâ Àü¿¡ »ç¿ëÀÚ¸¦ º¯°æÇÑ´Ù - Apache HTTP Server + + + + + +
    <-
    +

    suexec - ¿ÜºÎ ÇÁ·Î±×·¥À» ½ÇÇàÇϱâ Àü¿¡ »ç¿ëÀÚ¸¦ º¯°æÇÑ´Ù

    +
    +

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

    +
    + +

    ¾ÆÆÄÄ¡ À¥¼­¹ö´Â CGI ÇÁ·Î±×·¥À» ½ÇÇàÇϱâ Àü¿¡ ´Ù¸¥ »ç¿ëÀÚ·Î + ÀüȯÇϱâÀ§ÇØ suexec¸¦ »ç¿ëÇÑ´Ù. À̸¦ »ç¿ëÇÏ·Á¸é + ¼­¹ö¸¦ root °èÁ¤À¸·Î ½ÇÇàÇØ¾ß ÇÑ´Ù. º¸Åë À¥ + µ¥¸óÀ» root °èÁ¤À¸·Î ½ÇÇàÇÏÁö ¾Ê±â¶§¹®¿¡ + suexec ½ÇÇàÆÄÀÏ¿¡ setuid ºñÆ®¸¦ ¼³Á¤ÇÏ°í + root°¡ ¼ÒÀ¯ÁÖÀ̾î¾ß ÇÑ´Ù. rootÀÌ¿ÜÀÇ + ´Ù¸¥ »ç¿ëÀÚ°¡ ¾²±â±ÇÇÑÀ» °¡Áö¸é ¾ÈµÈ´Ù.

    + +

    suexecÀÇ °³³ä°ú º¸¾È¸ðµ¨¿¡ ´ëÇÑ Á¤º¸´Â suexec ¹®¼­¸¦ + (http://httpd.apache.org/docs/2.0/suexec.html) Âü°íÇ϶ó.

    +
    + +
    top
    +
    +

    °³¿ä

    +

    suexec -V

    +
    top
    +
    +

    ¿É¼Ç

    + +
    +
    -V
    + +
    root°¡ ½ÇÇàÇϸé suexecÀÇ ÄÄÆÄÀÏ +¿É¼ÇÀ» Ãâ·ÂÇÑ´Ù. º¸¾È»ó ÀÌÀ¯·Î ¸ðµç ¼³Á¤¿É¼ÇÀº ÄÄÆÄÀÏÇÒ ¶§¸¸ +ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù.
    + +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/programs/suexec.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/programs/suexec.html.tr.utf8 new file mode 100644 index 00000000..3c4bae81 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/programs/suexec.html.tr.utf8 @@ -0,0 +1,63 @@ + + + +suexec - harici programları çalıştırmadan önce kullanıcıyı değiştirir - Apache HTTP Sunucusu + + + + + +
    <-
    +

    suexec - harici programları çalıştırmadan önce kullanıcıyı değiştirir

    +
    +

    Mevcut Diller:  en  | + ko  | + tr 

    +
    + +

    suexec, 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 suexec'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.

    + +

    suexec güvenlik modeli ve kavramlar + hakkında bilgi edinmek için suexec belgesine (http://httpd.apache.org/docs/2.0/suexec.html) bakınız.

    +
    + +
    top
    +
    +

    Kullanım

    +

    suexec -V

    +
    top
    +
    +

    Seçenekler

    +
    +
    -V
    +
    root iseniz, bu seçenek + suexec + derleme seçeneklerini gösterir. Güvenlik sebebiyle tüm yapılandırma + seçenekleri sadece derleme sırasında değiştirilebilir.
    +
    +
    +
    +

    Mevcut Diller:  en  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/rewrite/index.html b/rubbos/app/httpd-2.0.64/docs/manual/rewrite/index.html new file mode 100644 index 00000000..23ec1ec0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/rewrite/index.html @@ -0,0 +1,9 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: index.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: index.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/rewrite/index.html.en b/rubbos/app/httpd-2.0.64/docs/manual/rewrite/index.html.en new file mode 100644 index 00000000..a442b2e8 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/rewrite/index.html.en @@ -0,0 +1,99 @@ + + + +Apache mod_rewrite - Apache HTTP Server + + + + + +
    <-
    +

    Apache mod_rewrite

    +
    +

    Available Languages:  en  | + tr 

    +
    + +
    +

    ``The great thing about mod_rewrite is it gives you + all the configurability and flexibility of Sendmail. + The downside to mod_rewrite is that it gives you all + the configurability and flexibility of Sendmail.''

    + +

    -- Brian Behlendorf
    + Apache Group

    + +
    + +
    +

    `` Despite the tons of examples and docs, + mod_rewrite is voodoo. Damned cool voodoo, but still + voodoo. ''

    + +

    -- Brian Moore
    + bem@news.cmc.net

    + +
    + +

    Welcome to mod_rewrite, the Swiss Army Knife of URL + manipulation!

    + +

    This module uses a rule-based rewriting engine (based on a + regular-expression parser) to rewrite requested URLs on the + fly. It supports an unlimited number of rules and an + unlimited number of attached rule conditions for each rule to + provide a really flexible and powerful URL manipulation + mechanism. The URL manipulations can depend on various tests, + for instance server variables, environment variables, HTTP + headers, time stamps and even external database lookups in + various formats can be used to achieve granular URL + matching.

    + +

    This module operates on the full URLs (including the + path-info part) both in per-server context + (httpd.conf) and per-directory context + (.htaccess) and can even generate query-string + parts on result. The rewritten result can lead to internal + sub-processing, external request redirection or even to an + internal proxy throughput.

    + +

    But all this functionality and flexibility has its + drawback: complexity. So don't expect to understand this + entire module in just one day.

    + +
    + +
    top
    +
    top
    +
    +

    mod_rewrite

    +

    Extensive documentation on the directives +provided by this module is provided in the mod_rewrite reference documentation. +

    +
    +
    +

    Available Languages:  en  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/rewrite/index.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/rewrite/index.html.tr.utf8 new file mode 100644 index 00000000..d9fd5806 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/rewrite/index.html.tr.utf8 @@ -0,0 +1,91 @@ + + + +Apache mod_rewrite - Apache HTTP Sunucusu + + + + + +
    <-
    +

    Apache mod_rewrite

    +
    +

    Mevcut Diller:  en  | + tr 

    +
    + +
    +

    ``mod_rewrite’ı harika yapan şey, Sendmail’ın tüm yapılandırma + kolaylığı ve esnekliğine sahip olmasıdır. mod_rewrite’ı kötü yapan + şey ise Sendmail’ın tüm yapılandırma kolaylığı ve esnekliğine sahip + olmasıdır.''

    + +

    -- Brian Behlendorf
    + Apache Group

    +
    + +
    +

    ``Hakkında tonlarca örnek ve belge olmasına rağmen mod_rewrite kara + büyüdür. Müthiş güzel bir kara büyü ama yine de kara büyü.''

    + +

    -- Brian Moore
    + bem@news.cmc.net

    +
    + +

    URL kurgulamasının İsviçre Çakısı olan mod_rewrite + modülünün belgelerine hoşgeldiniz!

    + +

    Bu modül istenen URL’leri çalışma anında yeniden yazmak için (düzenli + ifade çözümleyiciden yararlanan) kurallara dayalı bir yeniden yazma + motoru kullanır. Gerçekten esnek ve güçlü bir URL kurgulama + mekanizması oluşturmak için sınısız sayıda kural ve her kural için de + sınırsız sayıda koşul destekler. URL değişiklikleri çeşitli sınamalara + dayanır; sunucu değişkenleri, HTTP başlıkları, ortam değişkenleri, + zaman damgaları hatta çeşitli biçimlerde harici veritabanı sorguları + bile bu amaçla kullanılabilir.

    + +

    Bu modül URL’lerin tamamında (path-info kısmı dahil) hem sunucu + bağlamında (httpd.conf) hem de dizin bağlamında + (.htaccess) çalışır ve URL üzerinde sorgu dizgesi bölümleri + bile oluşturabilir. Yeniden yazılan URL sonuçta dahili işlemlerde, harici + yönlendirmelerde ve hatta dahili vekalet işlemlerinde kullanılabilir.

    + +

    Fakat tüm bu işlevsellik ve esnekliğin bir bedeli vardır: karmaşıklık. + Bu yüzden bu modülün yapabildiklerini bir günde anlayabilmeyi + beklemeyin.

    + +
    + +
    top
    +
    top
    +
    +

    mod_rewrite Modülü

    +

    Bu modülce sağlanan yönergeler ve ortam değişkenleri + mod_rewrite başvuru kılavuzunda ayrıntılı olarak + açıklanmıştır.

    +
    +
    +

    Mevcut Diller:  en  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/rewrite/rewrite_guide.html b/rubbos/app/httpd-2.0.64/docs/manual/rewrite/rewrite_guide.html new file mode 100644 index 00000000..69c288c8 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/rewrite/rewrite_guide.html @@ -0,0 +1,5 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: rewrite_guide.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/rewrite/rewrite_guide.html.en b/rubbos/app/httpd-2.0.64/docs/manual/rewrite/rewrite_guide.html.en new file mode 100644 index 00000000..527cdac2 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/rewrite/rewrite_guide.html.en @@ -0,0 +1,788 @@ + + + +URL Rewriting Guide - Apache HTTP Server + + + + + +
    <-
    +

    URL Rewriting Guide

    +
    +

    Available Languages:  en 

    +
    + + +

    This document supplements the mod_rewrite + reference documentation. + It describes how one can use Apache's mod_rewrite + to solve typical URL-based problems with which webmasters are + commonony confronted. We give detailed descriptions on how to + solve each problem by configuring URL rewriting rulesets.

    + +
    ATTENTION: Depending on your server configuration + it may be necessary to slightly change the examples for your + situation, e.g. adding the [PT] flag when + additionally using mod_alias and + mod_userdir, etc. Or rewriting a ruleset + to fit in .htaccess context instead + of per-server context. Always try to understand what a + particular ruleset really does before you use it. This + avoids many problems.
    + +
    + +
    top
    +
    +

    Canonical URLs

    + + + +
    +
    Description:
    + +
    +

    On some webservers there are more than one URL for a + resource. Usually there are canonical URLs (which should be + actually used and distributed) and those which are just + shortcuts, internal ones, etc. Independent of which URL the + user supplied with the request he should finally see the + canonical one only.

    +
    + +
    Solution:
    + +
    +

    We do an external HTTP redirect for all non-canonical + URLs to fix them in the location view of the Browser and + for all subsequent requests. In the example ruleset below + we replace /~user by the canonical + /u/user and fix a missing trailing slash for + /u/user.

    + +
    +RewriteRule   ^/~([^/]+)/?(.*)    /u/$1/$2  [R]
    +RewriteRule   ^/([uge])/([^/]+)$  /$1/$2/   [R]
    +
    +
    +
    + +
    top
    +
    +

    Canonical Hostnames

    + +
    +
    Description:
    + +
    The goal of this rule is to force the use of a particular + hostname, in preference to other hostnames which may be used to + reach the same site. For example, if you wish to force the use + of www.example.com instead of + example.com, you might use a variant of the + following recipe.
    + +
    Solution:
    + +
    +

    For sites running on a port other than 80:

    +
    +RewriteCond %{HTTP_HOST}   !^fully\.qualified\.domain\.name [NC]
    +RewriteCond %{HTTP_HOST}   !^$
    +RewriteCond %{SERVER_PORT} !^80$
    +RewriteRule ^/(.*)         http://fully.qualified.domain.name:%{SERVER_PORT}/$1 [L,R]
    +
    + +

    And for a site running on port 80

    +
    +RewriteCond %{HTTP_HOST}   !^fully\.qualified\.domain\.name [NC]
    +RewriteCond %{HTTP_HOST}   !^$
    +RewriteRule ^/(.*)         http://fully.qualified.domain.name/$1 [L,R]
    +
    +
    +
    + +
    top
    +
    +

    Moved DocumentRoot

    + + + +
    +
    Description:
    + +
    +

    Usually the DocumentRoot +of the webserver directly relates to the URL "/". +But often this data is not really of top-level priority. For example, +you may wish for visitors, on first entering a site, to go to a +particular subdirectory /about/. This may be accomplished +using the following ruleset:

    +
    + +
    Solution:
    + +
    +

    We redirect the URL / to + /about/: +

    + +
    +RewriteEngine on
    +RewriteRule   ^/$  /about/  [R]
    +
    + +

    Note that this can also be handled using the RedirectMatch directive:

    + +

    +RedirectMatch ^/$ http://example.com/e/www/ +

    +
    +
    + +
    top
    +
    +

    Trailing Slash Problem

    + + + +
    +
    Description:
    + +

    The vast majority of "trailing slash" problems can be dealt + with using the techniques discussed in the FAQ + entry. However, occasionally, there is a need to use mod_rewrite + to handle a case where a missing trailing slash causes a URL to + fail. This can happen, for example, after a series of complex + rewrite rules.

    +
    + +
    Solution:
    + +
    +

    The solution to this subtle problem is to let the server + add the trailing slash automatically. To do this + correctly we have to use an external redirect, so the + browser correctly requests subsequent images etc. If we + only did a internal rewrite, this would only work for the + directory page, but would go wrong when any images are + included into this page with relative URLs, because the + browser would request an in-lined object. For instance, a + request for image.gif in + /~quux/foo/index.html would become + /~quux/image.gif without the external + redirect!

    + +

    So, to do this trick we write:

    + +
    +RewriteEngine  on
    +RewriteBase    /~quux/
    +RewriteRule    ^foo$  foo/  [R]
    +
    + +

    Alternately, you can put the following in a + top-level .htaccess file in the content directory. + But note that this creates some processing overhead.

    + +
    +RewriteEngine  on
    +RewriteBase    /~quux/
    +RewriteCond    %{REQUEST_FILENAME}  -d
    +RewriteRule    ^(.+[^/])$           $1/  [R]
    +
    +
    +
    + +
    top
    +
    +

    Move Homedirs to Different Webserver

    + + + +
    +
    Description:
    + +
    +

    Many webmasters have asked for a solution to the + following situation: They wanted to redirect just all + homedirs on a webserver to another webserver. They usually + need such things when establishing a newer webserver which + will replace the old one over time.

    +
    + +
    Solution:
    + +
    +

    The solution is trivial with mod_rewrite. + On the old webserver we just redirect all + /~user/anypath URLs to + http://newserver/~user/anypath.

    + +
    +RewriteEngine on
    +RewriteRule   ^/~(.+)  http://newserver/~$1  [R,L]
    +
    +
    +
    + +
    top
    +
    +

    Search pages in more than one directory

    + + + +
    +
    Description:
    + +
    +

    Sometimes it is necessary to let the webserver search + for pages in more than one directory. Here MultiViews or + other techniques cannot help.

    +
    + +
    Solution:
    + +
    +

    We program a explicit ruleset which searches for the + files in the directories.

    + +
    +RewriteEngine on
    +
    +#   first try to find it in custom/...
    +#   ...and if found stop and be happy:
    +RewriteCond         /your/docroot/dir1/%{REQUEST_FILENAME}  -f
    +RewriteRule  ^(.+)  /your/docroot/dir1/$1  [L]
    +
    +#   second try to find it in pub/...
    +#   ...and if found stop and be happy:
    +RewriteCond         /your/docroot/dir2/%{REQUEST_FILENAME}  -f
    +RewriteRule  ^(.+)  /your/docroot/dir2/$1  [L]
    +
    +#   else go on for other Alias or ScriptAlias directives,
    +#   etc.
    +RewriteRule   ^(.+)  -  [PT]
    +
    +
    +
    + +
    top
    +
    +

    Set Environment Variables According To URL Parts

    + + + +
    +
    Description:
    + +
    +

    Perhaps you want to keep status information between + requests and use the URL to encode it. But you don't want + to use a CGI wrapper for all pages just to strip out this + information.

    +
    + +
    Solution:
    + +
    +

    We use a rewrite rule to strip out the status information + and remember it via an environment variable which can be + later dereferenced from within XSSI or CGI. This way a + URL /foo/S=java/bar/ gets translated to + /foo/bar/ and the environment variable named + STATUS is set to the value "java".

    + +
    +RewriteEngine on
    +RewriteRule   ^(.*)/S=([^/]+)/(.*)    $1/$3 [E=STATUS:$2]
    +
    +
    +
    + +
    top
    +
    +

    Virtual User Hosts

    + + + +
    +
    Description:
    + +
    +

    Assume that you want to provide + www.username.host.domain.com + for the homepage of username via just DNS A records to the + same machine and without any virtualhosts on this + machine.

    +
    + +
    Solution:
    + +
    +

    For HTTP/1.0 requests there is no solution, but for + HTTP/1.1 requests which contain a Host: HTTP header we + can use the following ruleset to rewrite + http://www.username.host.com/anypath + internally to /home/username/anypath:

    + +
    +RewriteEngine on
    +RewriteCond   %{HTTP_HOST}                 ^www\.[^.]+\.host\.com$
    +RewriteRule   ^(.+)                        %{HTTP_HOST}$1          [C]
    +RewriteRule   ^www\.([^.]+)\.host\.com(.*) /home/$1$2
    +
    +
    +
    + +
    top
    +
    +

    Redirect Homedirs For Foreigners

    + + + +
    +
    Description:
    + +
    +

    We want to redirect homedir URLs to another webserver + www.somewhere.com when the requesting user + does not stay in the local domain + ourdomain.com. This is sometimes used in + virtual host contexts.

    +
    + +
    Solution:
    + +
    +

    Just a rewrite condition:

    + +
    +RewriteEngine on
    +RewriteCond   %{REMOTE_HOST}  !^.+\.ourdomain\.com$
    +RewriteRule   ^(/~.+)         http://www.somewhere.com/$1 [R,L]
    +
    +
    +
    + +
    top
    +
    +

    Redirecting Anchors

    + + + +
    +
    Description:
    + +
    +

    By default, redirecting to an HTML anchor doesn't work, + because mod_rewrite escapes the # character, + turning it into %23. This, in turn, breaks the + redirection.

    +
    + +
    Solution:
    + +
    +

    Use the [NE] flag on the + RewriteRule. NE stands for No Escape. +

    +
    +
    + +
    top
    +
    +

    Time-Dependent Rewriting

    + + + +
    +
    Description:
    + +
    +

    When tricks like time-dependent content should happen a + lot of webmasters still use CGI scripts which do for + instance redirects to specialized pages. How can it be done + via mod_rewrite?

    +
    + +
    Solution:
    + +
    +

    There are a lot of variables named TIME_xxx + for rewrite conditions. In conjunction with the special + lexicographic comparison patterns <STRING, + >STRING and =STRING we can + do time-dependent redirects:

    + +
    +RewriteEngine on
    +RewriteCond   %{TIME_HOUR}%{TIME_MIN} >0700
    +RewriteCond   %{TIME_HOUR}%{TIME_MIN} <1900
    +RewriteRule   ^foo\.html$             foo.day.html
    +RewriteRule   ^foo\.html$             foo.night.html
    +
    + +

    This provides the content of foo.day.html + under the URL foo.html from + 07:00-19:00 and at the remaining time the + contents of foo.night.html. Just a nice + feature for a homepage...

    +
    +
    + +
    top
    +
    +

    Backward Compatibility for YYYY to XXXX migration

    + + + +
    +
    Description:
    + +
    +

    How can we make URLs backward compatible (still + existing virtually) after migrating document.YYYY + to document.XXXX, e.g. after translating a + bunch of .html files to .phtml?

    +
    + +
    Solution:
    + +
    +

    We just rewrite the name to its basename and test for + existence of the new extension. If it exists, we take + that name, else we rewrite the URL to its original state.

    + + +
    +#   backward compatibility ruleset for
    +#   rewriting document.html to document.phtml
    +#   when and only when document.phtml exists
    +#   but no longer document.html
    +RewriteEngine on
    +RewriteBase   /~quux/
    +#   parse out basename, but remember the fact
    +RewriteRule   ^(.*)\.html$              $1      [C,E=WasHTML:yes]
    +#   rewrite to document.phtml if exists
    +RewriteCond   %{REQUEST_FILENAME}.phtml -f
    +RewriteRule   ^(.*)$ $1.phtml                   [S=1]
    +#   else reverse the previous basename cutout
    +RewriteCond   %{ENV:WasHTML}            ^yes$
    +RewriteRule   ^(.*)$ $1.html
    +
    +
    +
    + +
    top
    +
    +

    Content Handling

    + + + +

    From Old to New (intern)

    + + + +
    +
    Description:
    + +
    +

    Assume we have recently renamed the page + foo.html to bar.html and now want + to provide the old URL for backward compatibility. Actually + we want that users of the old URL even not recognize that + the pages was renamed.

    +
    + +
    Solution:
    + +
    +

    We rewrite the old URL to the new one internally via the + following rule:

    + +
    +RewriteEngine  on
    +RewriteBase    /~quux/
    +RewriteRule    ^foo\.html$  bar.html
    +
    +
    +
    + + + +

    From Old to New (extern)

    + + + +
    +
    Description:
    + +
    +

    Assume again that we have recently renamed the page + foo.html to bar.html and now want + to provide the old URL for backward compatibility. But this + time we want that the users of the old URL get hinted to + the new one, i.e. their browsers Location field should + change, too.

    +
    + +
    Solution:
    + +
    +

    We force a HTTP redirect to the new URL which leads to a + change of the browsers and thus the users view:

    + +
    +RewriteEngine  on
    +RewriteBase    /~quux/
    +RewriteRule    ^foo\.html$  bar.html  [R]
    +
    +
    +
    + + + +

    From Static to Dynamic

    + + + +
    +
    Description:
    + +
    +

    How can we transform a static page + foo.html into a dynamic variant + foo.cgi in a seamless way, i.e. without notice + by the browser/user.

    +
    + +
    Solution:
    + +
    +

    We just rewrite the URL to the CGI-script and force the + correct MIME-type so it gets really run as a CGI-script. + This way a request to /~quux/foo.html + internally leads to the invocation of + /~quux/foo.cgi.

    + +
    +RewriteEngine  on
    +RewriteBase    /~quux/
    +RewriteRule    ^foo\.html$  foo.cgi  [T=application/x-httpd-cgi]
    +
    +
    +
    + + +
    top
    +
    +

    Access Restriction

    + + + +

    Blocking of Robots

    + + + +
    +
    Description:
    + +
    +

    How can we block a really annoying robot from + retrieving pages of a specific webarea? A + /robots.txt file containing entries of the + "Robot Exclusion Protocol" is typically not enough to get + rid of such a robot.

    +
    + +
    Solution:
    + +
    +

    We use a ruleset which forbids the URLs of the webarea + /~quux/foo/arc/ (perhaps a very deep + directory indexed area where the robot traversal would + create big server load). We have to make sure that we + forbid access only to the particular robot, i.e. just + forbidding the host where the robot runs is not enough. + This would block users from this host, too. We accomplish + this by also matching the User-Agent HTTP header + information.

    + +
    +RewriteCond %{HTTP_USER_AGENT}   ^NameOfBadRobot.*
    +RewriteCond %{REMOTE_ADDR}       ^123\.45\.67\.[8-9]$
    +RewriteRule ^/~quux/foo/arc/.+   -   [F]
    +
    +
    +
    + + + +

    Blocked Inline-Images

    + + + +
    +
    Description:
    + +
    +

    Assume we have under http://www.quux-corp.de/~quux/ + some pages with inlined GIF graphics. These graphics are + nice, so others directly incorporate them via hyperlinks to + their pages. We don't like this practice because it adds + useless traffic to our server.

    +
    + +
    Solution:
    + +
    +

    While we cannot 100% protect the images from inclusion, + we can at least restrict the cases where the browser + sends a HTTP Referer header.

    + +
    +RewriteCond %{HTTP_REFERER} !^$
    +RewriteCond %{HTTP_REFERER} !^http://www.quux-corp.de/~quux/.*$ [NC]
    +RewriteRule .*\.gif$        -                                    [F]
    +
    + +
    +RewriteCond %{HTTP_REFERER}         !^$
    +RewriteCond %{HTTP_REFERER}         !.*/foo-with-gif\.html$
    +RewriteRule ^inlined-in-foo\.gif$   -                        [F]
    +
    +
    +
    + + + +

    Proxy Deny

    + + + +
    +
    Description:
    + +
    +

    How can we forbid a certain host or even a user of a + special host from using the Apache proxy?

    +
    + +
    Solution:
    + +
    +

    We first have to make sure mod_rewrite + is below(!) mod_proxy in the Configuration + file when compiling the Apache webserver. This way it gets + called before mod_proxy. Then we + configure the following for a host-dependent deny...

    + +
    +RewriteCond %{REMOTE_HOST} ^badhost\.mydomain\.com$
    +RewriteRule !^http://[^/.]\.mydomain.com.*  - [F]
    +
    + +

    ...and this one for a user@host-dependent deny:

    + +
    +RewriteCond %{REMOTE_IDENT}@%{REMOTE_HOST}  ^badguy@badhost\.mydomain\.com$
    +RewriteRule !^http://[^/.]\.mydomain.com.*  - [F]
    +
    +
    +
    + + + +
    top
    +
    +

    Other

    + + + +

    External Rewriting Engine

    + + + +
    +
    Description:
    + +
    +

    A FAQ: How can we solve the FOO/BAR/QUUX/etc. + problem? There seems no solution by the use of + mod_rewrite...

    +
    + +
    Solution:
    + +
    +

    Use an external RewriteMap, i.e. a program which acts + like a RewriteMap. It is run once on startup of Apache + receives the requested URLs on STDIN and has + to put the resulting (usually rewritten) URL on + STDOUT (same order!).

    + +
    +RewriteEngine on
    +RewriteMap    quux-map       prg:/path/to/map.quux.pl
    +RewriteRule   ^/~quux/(.*)$  /~quux/${quux-map:$1}
    +
    + +
    +#!/path/to/perl
    +
    +#   disable buffered I/O which would lead
    +#   to deadloops for the Apache server
    +$| = 1;
    +
    +#   read URLs one per line from stdin and
    +#   generate substitution URL on stdout
    +while (<>) {
    +    s|^foo/|bar/|;
    +    print $_;
    +}
    +
    + +

    This is a demonstration-only example and just rewrites + all URLs /~quux/foo/... to + /~quux/bar/.... Actually you can program + whatever you like. But notice that while such maps can be + used also by an average user, only the + system administrator can define it.

    +
    +
    + + + +
    +
    +

    Available Languages:  en 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/rewrite/rewrite_guide_advanced.html b/rubbos/app/httpd-2.0.64/docs/manual/rewrite/rewrite_guide_advanced.html new file mode 100644 index 00000000..d08ed10d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/rewrite/rewrite_guide_advanced.html @@ -0,0 +1,5 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: rewrite_guide_advanced.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/rewrite/rewrite_guide_advanced.html.en b/rubbos/app/httpd-2.0.64/docs/manual/rewrite/rewrite_guide_advanced.html.en new file mode 100644 index 00000000..c457e5af --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/rewrite/rewrite_guide_advanced.html.en @@ -0,0 +1,1289 @@ + + + +URL Rewriting Guide - Advanced topics - Apache HTTP Server + + + + + +
    <-
    +

    URL Rewriting Guide - Advanced topics

    +
    +

    Available Languages:  en 

    +
    + + +

    This document supplements the mod_rewrite + reference documentation. + It describes how one can use Apache's mod_rewrite + to solve typical URL-based problems with which webmasters are + commonly confronted. We give detailed descriptions on how to + solve each problem by configuring URL rewriting rulesets.

    + +
    ATTENTION: Depending on your server configuration + it may be necessary to adjust the examples for your + situation, e.g., adding the [PT] flag if + using mod_alias and + mod_userdir, etc. Or rewriting a ruleset + to work in .htaccess context instead + of per-server context. Always try to understand what a + particular ruleset really does before you use it; this + avoids many problems.
    + +
    + +
    top
    +
    +

    Web Cluster with Consistent URL Space

    + + + +
    +
    Description:
    + +
    +

    We want to create a homogeneous and consistent URL + layout across all WWW servers on an Intranet web cluster, i.e., + all URLs (by definition server-local and thus + server-dependent!) become server independent! + What we want is to give the WWW namespace a single consistent + layout: no URL should refer to + any particular target server. The cluster itself + should connect users automatically to a physical target + host as needed, invisibly.

    +
    + +
    Solution:
    + +
    +

    First, the knowledge of the target servers comes from + (distributed) external maps which contain information on + where our users, groups, and entities reside. They have the + form:

    + +
    +user1  server_of_user1
    +user2  server_of_user2
    +:      :
    +
    + +

    We put them into files map.xxx-to-host. + Second we need to instruct all servers to redirect URLs + of the forms:

    + +
    +/u/user/anypath
    +/g/group/anypath
    +/e/entity/anypath
    +
    + +

    to

    + +
    +http://physical-host/u/user/anypath
    +http://physical-host/g/group/anypath
    +http://physical-host/e/entity/anypath
    +
    + +

    when any URL path need not be valid on every server. The + following ruleset does this for us with the help of the map + files (assuming that server0 is a default server which + will be used if a user has no entry in the map):

    + +
    +RewriteEngine on
    +
    +RewriteMap      user-to-host   txt:/path/to/map.user-to-host
    +RewriteMap     group-to-host   txt:/path/to/map.group-to-host
    +RewriteMap    entity-to-host   txt:/path/to/map.entity-to-host
    +
    +RewriteRule   ^/u/([^/]+)/?(.*)   http://${user-to-host:$1|server0}/u/$1/$2
    +RewriteRule   ^/g/([^/]+)/?(.*)  http://${group-to-host:$1|server0}/g/$1/$2
    +RewriteRule   ^/e/([^/]+)/?(.*) http://${entity-to-host:$1|server0}/e/$1/$2
    +
    +RewriteRule   ^/([uge])/([^/]+)/?$          /$1/$2/.www/
    +RewriteRule   ^/([uge])/([^/]+)/([^.]+.+)   /$1/$2/.www/$3\
    +
    +
    +
    + +
    top
    +
    +

    Structured Homedirs

    + + + +
    +
    Description:
    + +
    +

    Some sites with thousands of users use a + structured homedir layout, i.e. each homedir is in a + subdirectory which begins (for instance) with the first + character of the username. So, /~foo/anypath + is /home/f/foo/.www/anypath + while /~bar/anypath is + /home/b/bar/.www/anypath.

    +
    + +
    Solution:
    + +
    +

    We use the following ruleset to expand the tilde URLs + into the above layout.

    + +
    +RewriteEngine on
    +RewriteRule   ^/~(([a-z])[a-z0-9]+)(.*)  /home/$2/$1/.www$3
    +
    +
    +
    + +
    top
    +
    +

    Filesystem Reorganization

    + + + +
    +
    Description:
    + +
    +

    This really is a hardcore example: a killer application + which heavily uses per-directory + RewriteRules to get a smooth look and feel + on the Web while its data structure is never touched or + adjusted. Background: net.sw is + my archive of freely available Unix software packages, + which I started to collect in 1992. It is both my hobby + and job to do this, because while I'm studying computer + science I have also worked for many years as a system and + network administrator in my spare time. Every week I need + some sort of software so I created a deep hierarchy of + directories where I stored the packages:

    + +
    +drwxrwxr-x   2 netsw  users    512 Aug  3 18:39 Audio/
    +drwxrwxr-x   2 netsw  users    512 Jul  9 14:37 Benchmark/
    +drwxrwxr-x  12 netsw  users    512 Jul  9 00:34 Crypto/
    +drwxrwxr-x   5 netsw  users    512 Jul  9 00:41 Database/
    +drwxrwxr-x   4 netsw  users    512 Jul 30 19:25 Dicts/
    +drwxrwxr-x  10 netsw  users    512 Jul  9 01:54 Graphic/
    +drwxrwxr-x   5 netsw  users    512 Jul  9 01:58 Hackers/
    +drwxrwxr-x   8 netsw  users    512 Jul  9 03:19 InfoSys/
    +drwxrwxr-x   3 netsw  users    512 Jul  9 03:21 Math/
    +drwxrwxr-x   3 netsw  users    512 Jul  9 03:24 Misc/
    +drwxrwxr-x   9 netsw  users    512 Aug  1 16:33 Network/
    +drwxrwxr-x   2 netsw  users    512 Jul  9 05:53 Office/
    +drwxrwxr-x   7 netsw  users    512 Jul  9 09:24 SoftEng/
    +drwxrwxr-x   7 netsw  users    512 Jul  9 12:17 System/
    +drwxrwxr-x  12 netsw  users    512 Aug  3 20:15 Typesetting/
    +drwxrwxr-x  10 netsw  users    512 Jul  9 14:08 X11/
    +
    + +

    In July 1996 I decided to make this archive public to + the world via a nice Web interface. "Nice" means that I + wanted to offer an interface where you can browse + directly through the archive hierarchy. And "nice" means + that I didn't want to change anything inside this + hierarchy - not even by putting some CGI scripts at the + top of it. Why? Because the above structure should later be + accessible via FTP as well, and I didn't want any + Web or CGI stuff mixed in there.

    +
    + +
    Solution:
    + +
    +

    The solution has two parts: The first is a set of CGI + scripts which create all the pages at all directory + levels on-the-fly. I put them under + /e/netsw/.www/ as follows:

    + +
    +-rw-r--r--   1 netsw  users    1318 Aug  1 18:10 .wwwacl
    +drwxr-xr-x  18 netsw  users     512 Aug  5 15:51 DATA/
    +-rw-rw-rw-   1 netsw  users  372982 Aug  5 16:35 LOGFILE
    +-rw-r--r--   1 netsw  users     659 Aug  4 09:27 TODO
    +-rw-r--r--   1 netsw  users    5697 Aug  1 18:01 netsw-about.html
    +-rwxr-xr-x   1 netsw  users     579 Aug  2 10:33 netsw-access.pl
    +-rwxr-xr-x   1 netsw  users    1532 Aug  1 17:35 netsw-changes.cgi
    +-rwxr-xr-x   1 netsw  users    2866 Aug  5 14:49 netsw-home.cgi
    +drwxr-xr-x   2 netsw  users     512 Jul  8 23:47 netsw-img/
    +-rwxr-xr-x   1 netsw  users   24050 Aug  5 15:49 netsw-lsdir.cgi
    +-rwxr-xr-x   1 netsw  users    1589 Aug  3 18:43 netsw-search.cgi
    +-rwxr-xr-x   1 netsw  users    1885 Aug  1 17:41 netsw-tree.cgi
    +-rw-r--r--   1 netsw  users     234 Jul 30 16:35 netsw-unlimit.lst
    +
    + +

    The DATA/ subdirectory holds the above + directory structure, i.e. the real + net.sw stuff, and gets + automatically updated via rdist from time to + time. The second part of the problem remains: how to link + these two structures together into one smooth-looking URL + tree? We want to hide the DATA/ directory + from the user while running the appropriate CGI scripts + for the various URLs. Here is the solution: first I put + the following into the per-directory configuration file + in the DocumentRoot + of the server to rewrite the public URL path + /net.sw/ to the internal path + /e/netsw:

    + +
    +RewriteRule  ^net.sw$       net.sw/        [R]
    +RewriteRule  ^net.sw/(.*)$  e/netsw/$1
    +
    + +

    The first rule is for requests which miss the trailing + slash! The second rule does the real thing. And then + comes the killer configuration which stays in the + per-directory config file + /e/netsw/.www/.wwwacl:

    + +
    +Options       ExecCGI FollowSymLinks Includes MultiViews
    +
    +RewriteEngine on
    +
    +#  we are reached via /net.sw/ prefix
    +RewriteBase   /net.sw/
    +
    +#  first we rewrite the root dir to
    +#  the handling cgi script
    +RewriteRule   ^$                       netsw-home.cgi     [L]
    +RewriteRule   ^index\.html$            netsw-home.cgi     [L]
    +
    +#  strip out the subdirs when
    +#  the browser requests us from perdir pages
    +RewriteRule   ^.+/(netsw-[^/]+/.+)$    $1                 [L]
    +
    +#  and now break the rewriting for local files
    +RewriteRule   ^netsw-home\.cgi.*       -                  [L]
    +RewriteRule   ^netsw-changes\.cgi.*    -                  [L]
    +RewriteRule   ^netsw-search\.cgi.*     -                  [L]
    +RewriteRule   ^netsw-tree\.cgi$        -                  [L]
    +RewriteRule   ^netsw-about\.html$      -                  [L]
    +RewriteRule   ^netsw-img/.*$           -                  [L]
    +
    +#  anything else is a subdir which gets handled
    +#  by another cgi script
    +RewriteRule   !^netsw-lsdir\.cgi.*     -                  [C]
    +RewriteRule   (.*)                     netsw-lsdir.cgi/$1
    +
    + +

    Some hints for interpretation:

    + +
      +
    1. Notice the L (last) flag and no + substitution field ('-') in the fourth part
    2. + +
    3. Notice the ! (not) character and + the C (chain) flag at the first rule + in the last part
    4. + +
    5. Notice the catch-all pattern in the last rule
    6. +
    +
    +
    + +
    top
    +
    +

    Redirect Failing URLs to Another Web Server

    + + + +
    +
    Description:
    + +
    +

    A typical FAQ about URL rewriting is how to redirect + failing requests on webserver A to webserver B. Usually + this is done via ErrorDocument CGI scripts in Perl, but + there is also a mod_rewrite solution. + But note that this performs more poorly than using an + ErrorDocument + CGI script!

    +
    + +
    Solution:
    + +
    +

    The first solution has the best performance but less + flexibility, and is less safe:

    + +
    +RewriteEngine on
    +RewriteCond   /your/docroot/%{REQUEST_FILENAME} !-f
    +RewriteRule   ^(.+)                             http://webserverB.dom/$1
    +
    + +

    The problem here is that this will only work for pages + inside the DocumentRoot. While you can add more + Conditions (for instance to also handle homedirs, etc.) + there is a better variant:

    + +
    +RewriteEngine on
    +RewriteCond   %{REQUEST_URI} !-U
    +RewriteRule   ^(.+)          http://webserverB.dom/$1
    +
    + +

    This uses the URL look-ahead feature of mod_rewrite. + The result is that this will work for all types of URLs + and is safe. But it does have a performance impact on + the web server, because for every request there is one + more internal subrequest. So, if your web server runs on a + powerful CPU, use this one. If it is a slow machine, use + the first approach or better an ErrorDocument CGI script.

    +
    +
    + +
    top
    +
    +

    Archive Access Multiplexer

    + + + +
    +
    Description:
    + +
    +

    Do you know the great CPAN (Comprehensive Perl Archive + Network) under http://www.perl.com/CPAN? + CPAN automatically redirects browsers to one of many FTP + servers around the world (generally one near the requesting + client); each server carries a full CPAN mirror. This is + effectively an FTP access multiplexing service. + CPAN runs via CGI scripts, but how could a similar approach + be implemented via mod_rewrite?

    +
    + +
    Solution:
    + +
    +

    First we notice that as of version 3.0.0, + mod_rewrite can + also use the "ftp:" scheme on redirects. + And second, the location approximation can be done by a + RewriteMap + over the top-level domain of the client. + With a tricky chained ruleset we can use this top-level + domain as a key to our multiplexing map.

    + +
    +RewriteEngine on
    +RewriteMap    multiplex                txt:/path/to/map.cxan
    +RewriteRule   ^/CxAN/(.*)              %{REMOTE_HOST}::$1                 [C]
    +RewriteRule   ^.+\.([a-zA-Z]+)::(.*)$  ${multiplex:$1|ftp.default.dom}$2  [R,L]
    +
    + +
    +##
    +##  map.cxan -- Multiplexing Map for CxAN
    +##
    +
    +de        ftp://ftp.cxan.de/CxAN/
    +uk        ftp://ftp.cxan.uk/CxAN/
    +com       ftp://ftp.cxan.com/CxAN/
    + :
    +##EOF##
    +
    +
    +
    + +
    top
    +
    +

    Content Handling

    + + + +

    Browser Dependent Content

    + + + +
    +
    Description:
    + +
    +

    At least for important top-level pages it is sometimes + necessary to provide the optimum of browser dependent + content, i.e., one has to provide one version for + current browsers, a different version for the Lynx and text-mode + browsers, and another for other browsers.

    +
    + +
    Solution:
    + +
    +

    We cannot use content negotiation because the browsers do + not provide their type in that form. Instead we have to + act on the HTTP header "User-Agent". The following config + does the following: If the HTTP header "User-Agent" + begins with "Mozilla/3", the page foo.html + is rewritten to foo.NS.html and the + rewriting stops. If the browser is "Lynx" or "Mozilla" of + version 1 or 2, the URL becomes foo.20.html. + All other browsers receive page foo.32.html. + This is done with the following ruleset:

    + +
    +RewriteCond %{HTTP_USER_AGENT}  ^Mozilla/3.*
    +RewriteRule ^foo\.html$         foo.NS.html          [L]
    +
    +RewriteCond %{HTTP_USER_AGENT}  ^Lynx/.*         [OR]
    +RewriteCond %{HTTP_USER_AGENT}  ^Mozilla/[12].*
    +RewriteRule ^foo\.html$         foo.20.html          [L]
    +
    +RewriteRule ^foo\.html$         foo.32.html          [L]
    +
    +
    +
    + + + +

    Dynamic Mirror

    + + + +
    +
    Description:
    + +
    +

    Assume there are nice web pages on remote hosts we want + to bring into our namespace. For FTP servers we would use + the mirror program which actually maintains an + explicit up-to-date copy of the remote data on the local + machine. For a web server we could use the program + webcopy which runs via HTTP. But both + techniques have a major drawback: The local copy is + always only as up-to-date as the last time we ran the program. It + would be much better if the mirror was not a static one we + have to establish explicitly. Instead we want a dynamic + mirror with data which gets updated automatically + as needed on the remote host(s).

    +
    + +
    Solution:
    + +
    +

    To provide this feature we map the remote web page or even + the complete remote web area to our namespace by the use + of the Proxy Throughput feature + (flag [P]):

    + +
    +RewriteEngine  on
    +RewriteBase    /~quux/
    +RewriteRule    ^hotsheet/(.*)$  http://www.tstimpreso.com/hotsheet/$1  [P]
    +
    + +
    +RewriteEngine  on
    +RewriteBase    /~quux/
    +RewriteRule    ^usa-news\.html$   http://www.quux-corp.com/news/index.html  [P]
    +
    +
    +
    + + + +

    Reverse Dynamic Mirror

    + + + +
    +
    Description:
    + +
    ...
    + +
    Solution:
    + +
    +
    +RewriteEngine on
    +RewriteCond   /mirror/of/remotesite/$1           -U
    +RewriteRule   ^http://www\.remotesite\.com/(.*)$ /mirror/of/remotesite/$1
    +
    +
    +
    + + + +

    Retrieve Missing Data from Intranet

    + + + +
    +
    Description:
    + +
    +

    This is a tricky way of virtually running a corporate + (external) Internet web server + (www.quux-corp.dom), while actually keeping + and maintaining its data on an (internal) Intranet web server + (www2.quux-corp.dom) which is protected by a + firewall. The trick is that the external web server retrieves + the requested data on-the-fly from the internal + one.

    +
    + +
    Solution:
    + +
    +

    First, we must make sure that our firewall still + protects the internal web server and only the + external web server is allowed to retrieve data from it. + On a packet-filtering firewall, for instance, we could + configure a firewall ruleset like the following:

    + +
    +ALLOW Host www.quux-corp.dom Port >1024 --> Host www2.quux-corp.dom Port 80
    +DENY  Host *                 Port *     --> Host www2.quux-corp.dom Port 80
    +
    + +

    Just adjust it to your actual configuration syntax. + Now we can establish the mod_rewrite + rules which request the missing data in the background + through the proxy throughput feature:

    + +
    +RewriteRule ^/~([^/]+)/?(.*)          /home/$1/.www/$2
    +RewriteCond %{REQUEST_FILENAME}       !-f
    +RewriteCond %{REQUEST_FILENAME}       !-d
    +RewriteRule ^/home/([^/]+)/.www/?(.*) http://www2.quux-corp.dom/~$1/pub/$2 [P]
    +
    +
    +
    + + + +

    Load Balancing

    + + + +
    +
    Description:
    + +
    +

    Suppose we want to load balance the traffic to + www.foo.com over www[0-5].foo.com + (a total of 6 servers). How can this be done?

    +
    + +
    Solution:
    + +
    +

    There are many possible solutions for this problem. + We will first discuss a common DNS-based method, + and then one based on mod_rewrite:

    + +
      +
    1. + DNS Round-Robin + +

      The simplest method for load-balancing is to use + DNS round-robin. + Here you just configure www[0-9].foo.com + as usual in your DNS with A (address) records, e.g.,

      + +
      +www0   IN  A       1.2.3.1
      +www1   IN  A       1.2.3.2
      +www2   IN  A       1.2.3.3
      +www3   IN  A       1.2.3.4
      +www4   IN  A       1.2.3.5
      +www5   IN  A       1.2.3.6
      +
      + +

      Then you additionally add the following entries:

      + +
      +www   IN  A       1.2.3.1
      +www   IN  A       1.2.3.2
      +www   IN  A       1.2.3.3
      +www   IN  A       1.2.3.4
      +www   IN  A       1.2.3.5
      +
      + +

      Now when www.foo.com gets + resolved, BIND gives out www0-www5 + - but in a permutated (rotated) order every time. + This way the clients are spread over the various + servers. But notice that this is not a perfect load + balancing scheme, because DNS resolutions are + cached by clients and other nameservers, so + once a client has resolved www.foo.com + to a particular wwwN.foo.com, all its + subsequent requests will continue to go to the same + IP (and thus a single server), rather than being + distributed across the other available servers. But the + overall result is + okay because the requests are collectively + spread over the various web servers.

      +
    2. + +
    3. + DNS Load-Balancing + +

      A sophisticated DNS-based method for + load-balancing is to use the program + lbnamed which can be found at + http://www.stanford.edu/~schemers/docs/lbnamed/lbnamed.html. + It is a Perl 5 program which, in conjunction with auxilliary + tools, provides real load-balancing via + DNS.

      +
    4. + +
    5. + Proxy Throughput Round-Robin + +

      In this variant we use mod_rewrite + and its proxy throughput feature. First we dedicate + www0.foo.com to be actually + www.foo.com by using a single

      + +
      +www    IN  CNAME   www0.foo.com.
      +
      + +

      entry in the DNS. Then we convert + www0.foo.com to a proxy-only server, + i.e., we configure this machine so all arriving URLs + are simply passed through its internal proxy to one of + the 5 other servers (www1-www5). To + accomplish this we first establish a ruleset which + contacts a load balancing script lb.pl + for all URLs.

      + +
      +RewriteEngine on
      +RewriteMap    lb      prg:/path/to/lb.pl
      +RewriteRule   ^/(.+)$ ${lb:$1}           [P,L]
      +
      + +

      Then we write lb.pl:

      + +
      +#!/path/to/perl
      +##
      +##  lb.pl -- load balancing script
      +##
      +
      +$| = 1;
      +
      +$name   = "www";     # the hostname base
      +$first  = 1;         # the first server (not 0 here, because 0 is myself)
      +$last   = 5;         # the last server in the round-robin
      +$domain = "foo.dom"; # the domainname
      +
      +$cnt = 0;
      +while (<STDIN>) {
      +    $cnt = (($cnt+1) % ($last+1-$first));
      +    $server = sprintf("%s%d.%s", $name, $cnt+$first, $domain);
      +    print "http://$server/$_";
      +}
      +
      +##EOF##
      +
      + +
      A last notice: Why is this useful? Seems like + www0.foo.com still is overloaded? The + answer is yes, it is overloaded, but with plain proxy + throughput requests, only! All SSI, CGI, ePerl, etc. + processing is handled done on the other machines. + For a complicated site, this may work well. The biggest + risk here is that www0 is now a single point of failure -- + if it crashes, the other servers are inaccessible.
      +
    6. + +
    7. + Dedicated Load Balancers + +

      There are more sophisticated solutions, as well. Cisco, + F5, and several other companies sell hardware load + balancers (typically used in pairs for redundancy), which + offer sophisticated load balancing and auto-failover + features. There are software packages which offer similar + features on commodity hardware, as well. If you have + enough money or need, check these out. The lb-l mailing list is a + good place to research.

      +
    8. +
    +
    +
    + + + +

    New MIME-type, New Service

    + + + +
    +
    Description:
    + +
    +

    On the net there are many nifty CGI programs. But + their usage is usually boring, so a lot of webmasters + don't use them. Even Apache's Action handler feature for + MIME-types is only appropriate when the CGI programs + don't need special URLs (actually PATH_INFO + and QUERY_STRINGS) as their input. First, + let us configure a new file type with extension + .scgi (for secure CGI) which will be processed + by the popular cgiwrap program. The problem + here is that for instance if we use a Homogeneous URL Layout + (see above) a file inside the user homedirs might have a URL + like /u/user/foo/bar.scgi, but + cgiwrap needs URLs in the form + /~user/foo/bar.scgi/. The following rule + solves the problem:

    + +
    +RewriteRule ^/[uge]/([^/]+)/\.www/(.+)\.scgi(.*) ...
    +... /internal/cgi/user/cgiwrap/~$1/$2.scgi$3  [NS,T=application/x-http-cgi]
    +
    + +

    Or assume we have some more nifty programs: + wwwlog (which displays the + access.log for a URL subtree) and + wwwidx (which runs Glimpse on a URL + subtree). We have to provide the URL area to these + programs so they know which area they are really working with. + But usually this is complicated, because they may still be + requested by the alternate URL form, i.e., typically we would + run the swwidx program from within + /u/user/foo/ via hyperlink to

    + +
    +/internal/cgi/user/swwidx?i=/u/user/foo/
    +
    + +

    which is ugly, because we have to hard-code + both the location of the area + and the location of the CGI inside the + hyperlink. When we have to reorganize, we spend a + lot of time changing the various hyperlinks.

    +
    + +
    Solution:
    + +
    +

    The solution here is to provide a special new URL format + which automatically leads to the proper CGI invocation. + We configure the following:

    + +
    +RewriteRule   ^/([uge])/([^/]+)(/?.*)/\*  /internal/cgi/user/wwwidx?i=/$1/$2$3/
    +RewriteRule   ^/([uge])/([^/]+)(/?.*):log /internal/cgi/user/wwwlog?f=/$1/$2$3
    +
    + +

    Now the hyperlink to search at + /u/user/foo/ reads only

    + +
    +HREF="*"
    +
    + +

    which internally gets automatically transformed to

    + +
    +/internal/cgi/user/wwwidx?i=/u/user/foo/
    +
    + +

    The same approach leads to an invocation for the + access log CGI program when the hyperlink + :log gets used.

    +
    +
    + + + +

    On-the-fly Content-Regeneration

    + + + +
    +
    Description:
    + +
    +

    Here comes a really esoteric feature: Dynamically + generated but statically served pages, i.e., pages should be + delivered as pure static pages (read from the filesystem + and just passed through), but they have to be generated + dynamically by the web server if missing. This way you can + have CGI-generated pages which are statically served unless an + admin (or a cron job) removes the static contents. Then the + contents gets refreshed.

    +
    + +
    Solution:
    + +
    + This is done via the following ruleset: + +
    +RewriteCond %{REQUEST_FILENAME}   !-s
    +RewriteRule ^page\.html$          page.cgi   [T=application/x-httpd-cgi,L]
    +
    + +

    Here a request for page.html leads to an + internal run of a corresponding page.cgi if + page.html is missing or has filesize + null. The trick here is that page.cgi is a + CGI script which (additionally to its STDOUT) + writes its output to the file page.html. + Once it has completed, the server sends out + page.html. When the webmaster wants to force + a refresh of the contents, he just removes + page.html (typically from cron).

    +
    +
    + + + +

    Document With Autorefresh

    + + + +
    +
    Description:
    + +
    +

    Wouldn't it be nice, while creating a complex web page, if + the web browser would automatically refresh the page every + time we save a new version from within our editor? + Impossible?

    +
    + +
    Solution:
    + +
    +

    No! We just combine the MIME multipart feature, the + web server NPH feature, and the URL manipulation power of + mod_rewrite. First, we establish a new + URL feature: Adding just :refresh to any + URL causes the 'page' to be refreshed every time it is + updated on the filesystem.

    + +
    +RewriteRule   ^(/[uge]/[^/]+/?.*):refresh  /internal/cgi/apache/nph-refresh?f=$1
    +
    + +

    Now when we reference the URL

    + +
    +/u/foo/bar/page.html:refresh
    +
    + +

    this leads to the internal invocation of the URL

    + +
    +/internal/cgi/apache/nph-refresh?f=/u/foo/bar/page.html
    +
    + +

    The only missing part is the NPH-CGI script. Although + one would usually say "left as an exercise to the reader" + ;-) I will provide this, too.

    + +
    +#!/sw/bin/perl
    +##
    +##  nph-refresh -- NPH/CGI script for auto refreshing pages
    +##  Copyright (c) 1997 Ralf S. Engelschall, All Rights Reserved.
    +##
    +$| = 1;
    +
    +#   split the QUERY_STRING variable
    +@pairs = split(/&/, $ENV{'QUERY_STRING'});
    +foreach $pair (@pairs) {
    +    ($name, $value) = split(/=/, $pair);
    +    $name =~ tr/A-Z/a-z/;
    +    $name = 'QS_' . $name;
    +    $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
    +    eval "\$$name = \"$value\"";
    +}
    +$QS_s = 1 if ($QS_s eq '');
    +$QS_n = 3600 if ($QS_n eq '');
    +if ($QS_f eq '') {
    +    print "HTTP/1.0 200 OK\n";
    +    print "Content-type: text/html\n\n";
    +    print "&lt;b&gt;ERROR&lt;/b&gt;: No file given\n";
    +    exit(0);
    +}
    +if (! -f $QS_f) {
    +    print "HTTP/1.0 200 OK\n";
    +    print "Content-type: text/html\n\n";
    +    print "&lt;b&gt;ERROR&lt;/b&gt;: File $QS_f not found\n";
    +    exit(0);
    +}
    +
    +sub print_http_headers_multipart_begin {
    +    print "HTTP/1.0 200 OK\n";
    +    $bound = "ThisRandomString12345";
    +    print "Content-type: multipart/x-mixed-replace;boundary=$bound\n";
    +    &print_http_headers_multipart_next;
    +}
    +
    +sub print_http_headers_multipart_next {
    +    print "\n--$bound\n";
    +}
    +
    +sub print_http_headers_multipart_end {
    +    print "\n--$bound--\n";
    +}
    +
    +sub displayhtml {
    +    local($buffer) = @_;
    +    $len = length($buffer);
    +    print "Content-type: text/html\n";
    +    print "Content-length: $len\n\n";
    +    print $buffer;
    +}
    +
    +sub readfile {
    +    local($file) = @_;
    +    local(*FP, $size, $buffer, $bytes);
    +    ($x, $x, $x, $x, $x, $x, $x, $size) = stat($file);
    +    $size = sprintf("%d", $size);
    +    open(FP, "&lt;$file");
    +    $bytes = sysread(FP, $buffer, $size);
    +    close(FP);
    +    return $buffer;
    +}
    +
    +$buffer = &readfile($QS_f);
    +&print_http_headers_multipart_begin;
    +&displayhtml($buffer);
    +
    +sub mystat {
    +    local($file) = $_[0];
    +    local($time);
    +
    +    ($x, $x, $x, $x, $x, $x, $x, $x, $x, $mtime) = stat($file);
    +    return $mtime;
    +}
    +
    +$mtimeL = &mystat($QS_f);
    +$mtime = $mtime;
    +for ($n = 0; $n &lt; $QS_n; $n++) {
    +    while (1) {
    +        $mtime = &mystat($QS_f);
    +        if ($mtime ne $mtimeL) {
    +            $mtimeL = $mtime;
    +            sleep(2);
    +            $buffer = &readfile($QS_f);
    +            &print_http_headers_multipart_next;
    +            &displayhtml($buffer);
    +            sleep(5);
    +            $mtimeL = &mystat($QS_f);
    +            last;
    +        }
    +        sleep($QS_s);
    +    }
    +}
    +
    +&print_http_headers_multipart_end;
    +
    +exit(0);
    +
    +##EOF##
    +
    +
    +
    + + + +

    Mass Virtual Hosting

    + + + +
    +
    Description:
    + +
    +

    The <VirtualHost> feature of Apache is nice + and works great when you just have a few dozen + virtual hosts. But when you are an ISP and have hundreds of + virtual hosts, this feature is suboptimal.

    +
    + +
    Solution:
    + +
    +

    To provide this feature we map the remote web page or even + the complete remote web area to our namespace using the + Proxy Throughput feature (flag [P]):

    + +
    +##
    +##  vhost.map
    +##
    +www.vhost1.dom:80  /path/to/docroot/vhost1
    +www.vhost2.dom:80  /path/to/docroot/vhost2
    +     :
    +www.vhostN.dom:80  /path/to/docroot/vhostN
    +
    + +
    +##
    +##  httpd.conf
    +##
    +    :
    +#   use the canonical hostname on redirects, etc.
    +UseCanonicalName on
    +
    +    :
    +#   add the virtual host in front of the CLF-format
    +CustomLog  /path/to/access_log  "%{VHOST}e %h %l %u %t \"%r\" %>s %b"
    +    :
    +
    +#   enable the rewriting engine in the main server
    +RewriteEngine on
    +
    +#   define two maps: one for fixing the URL and one which defines
    +#   the available virtual hosts with their corresponding
    +#   DocumentRoot.
    +RewriteMap    lowercase    int:tolower
    +RewriteMap    vhost        txt:/path/to/vhost.map
    +
    +#   Now do the actual virtual host mapping
    +#   via a huge and complicated single rule:
    +#
    +#   1. make sure we don't map for common locations
    +RewriteCond   %{REQUEST_URI}  !^/commonurl1/.*
    +RewriteCond   %{REQUEST_URI}  !^/commonurl2/.*
    +    :
    +RewriteCond   %{REQUEST_URI}  !^/commonurlN/.*
    +#
    +#   2. make sure we have a Host header, because
    +#      currently our approach only supports
    +#      virtual hosting through this header
    +RewriteCond   %{HTTP_HOST}  !^$
    +#
    +#   3. lowercase the hostname
    +RewriteCond   ${lowercase:%{HTTP_HOST}|NONE}  ^(.+)$
    +#
    +#   4. lookup this hostname in vhost.map and
    +#      remember it only when it is a path
    +#      (and not "NONE" from above)
    +RewriteCond   ${vhost:%1}  ^(/.*)$
    +#
    +#   5. finally we can map the URL to its docroot location
    +#      and remember the virtual host for logging purposes
    +RewriteRule   ^/(.*)$   %1/$1  [E=VHOST:${lowercase:%{HTTP_HOST}}]
    +    :
    +
    +
    +
    + + + +
    top
    +
    +

    Access Restriction

    + + + +

    Host Deny

    + + + +
    +
    Description:
    + +
    +

    How can we forbid a list of externally configured hosts + from using our server?

    +
    + +
    Solution:
    + +
    +

    For Apache >= 1.3b6:

    + +
    +RewriteEngine on
    +RewriteMap    hosts-deny  txt:/path/to/hosts.deny
    +RewriteCond   ${hosts-deny:%{REMOTE_HOST}|NOT-FOUND} !=NOT-FOUND [OR]
    +RewriteCond   ${hosts-deny:%{REMOTE_ADDR}|NOT-FOUND} !=NOT-FOUND
    +RewriteRule   ^/.*  -  [F]
    +
    + +

    For Apache <= 1.3b6:

    + +
    +RewriteEngine on
    +RewriteMap    hosts-deny  txt:/path/to/hosts.deny
    +RewriteRule   ^/(.*)$ ${hosts-deny:%{REMOTE_HOST}|NOT-FOUND}/$1
    +RewriteRule   !^NOT-FOUND/.* - [F]
    +RewriteRule   ^NOT-FOUND/(.*)$ ${hosts-deny:%{REMOTE_ADDR}|NOT-FOUND}/$1
    +RewriteRule   !^NOT-FOUND/.* - [F]
    +RewriteRule   ^NOT-FOUND/(.*)$ /$1
    +
    + +
    +##
    +##  hosts.deny
    +##
    +##  ATTENTION! This is a map, not a list, even when we treat it as such.
    +##             mod_rewrite parses it for key/value pairs, so at least a
    +##             dummy value "-" must be present for each entry.
    +##
    +
    +193.102.180.41 -
    +bsdti1.sdm.de  -
    +192.76.162.40  -
    +
    +
    +
    + + + +

    Proxy Deny

    + + + +
    +
    Description:
    + +
    +

    How can we forbid a certain host or even a user of a + special host from using the Apache proxy?

    +
    + +
    Solution:
    + +
    +

    We first have to make sure mod_rewrite + is below(!) mod_proxy in the Configuration + file when compiling the Apache web server. This way it gets + called before mod_proxy. Then we + configure the following for a host-dependent deny...

    + +
    +RewriteCond %{REMOTE_HOST} ^badhost\.mydomain\.com$
    +RewriteRule !^http://[^/.]\.mydomain.com.*  - [F]
    +
    + +

    ...and this one for a user@host-dependent deny:

    + +
    +RewriteCond %{REMOTE_IDENT}@%{REMOTE_HOST}  ^badguy@badhost\.mydomain\.com$
    +RewriteRule !^http://[^/.]\.mydomain.com.*  - [F]
    +
    +
    +
    + + + +

    Special Authentication Variant

    + + + +
    +
    Description:
    + +
    +

    Sometimes very special authentication is needed, for + instance authentication which checks for a set of + explicitly configured users. Only these should receive + access and without explicit prompting (which would occur + when using Basic Auth via mod_auth).

    +
    + +
    Solution:
    + +
    +

    We use a list of rewrite conditions to exclude all except + our friends:

    + +
    +RewriteCond %{REMOTE_IDENT}@%{REMOTE_HOST} !^friend1@client1.quux-corp\.com$
    +RewriteCond %{REMOTE_IDENT}@%{REMOTE_HOST} !^friend2@client2.quux-corp\.com$
    +RewriteCond %{REMOTE_IDENT}@%{REMOTE_HOST} !^friend3@client3.quux-corp\.com$
    +RewriteRule ^/~quux/only-for-friends/      -                                 [F]
    +
    +
    +
    + + + +

    Referer-based Deflector

    + + + +
    +
    Description:
    + +
    +

    How can we program a flexible URL Deflector which acts + on the "Referer" HTTP header and can be configured with as + many referring pages as we like?

    +
    + +
    Solution:
    + +
    +

    Use the following really tricky ruleset...

    + +
    +RewriteMap  deflector txt:/path/to/deflector.map
    +
    +RewriteCond %{HTTP_REFERER} !=""
    +RewriteCond ${deflector:%{HTTP_REFERER}} ^-$
    +RewriteRule ^.* %{HTTP_REFERER} [R,L]
    +
    +RewriteCond %{HTTP_REFERER} !=""
    +RewriteCond ${deflector:%{HTTP_REFERER}|NOT-FOUND} !=NOT-FOUND
    +RewriteRule ^.* ${deflector:%{HTTP_REFERER}} [R,L]
    +
    + +

    ... in conjunction with a corresponding rewrite + map:

    + +
    +##
    +##  deflector.map
    +##
    +
    +http://www.badguys.com/bad/index.html    -
    +http://www.badguys.com/bad/index2.html   -
    +http://www.badguys.com/bad/index3.html   http://somewhere.com/
    +
    + +

    This automatically redirects the request back to the + referring page (when "-" is used as the value + in the map) or to a specific URL (when an URL is specified + in the map as the second argument).

    +
    +
    + + + +
    +
    +

    Available Languages:  en 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/rewrite/rewrite_intro.html b/rubbos/app/httpd-2.0.64/docs/manual/rewrite/rewrite_intro.html new file mode 100644 index 00000000..e6e697d2 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/rewrite/rewrite_intro.html @@ -0,0 +1,5 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: rewrite_intro.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/rewrite/rewrite_intro.html.en b/rubbos/app/httpd-2.0.64/docs/manual/rewrite/rewrite_intro.html.en new file mode 100644 index 00000000..32f666e1 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/rewrite/rewrite_intro.html.en @@ -0,0 +1,117 @@ + + + +Apache mod_rewrite Introduction - Apache HTTP Server + + + + + +
    <-
    +

    Apache mod_rewrite Introduction

    +
    +

    Available Languages:  en 

    +
    + +

    This document supplements the mod_rewrite +reference documentation. It +describes the basic concepts necessary for use of +mod_rewrite. Other documents go into greater detail, +but this doc should help the beginner get their feet wet. +

    +
    + +
    top
    +
    +

    Introduction

    +

    The Apache module mod_rewrite is a very powerful and +sophisticated module which provides a way to do URL manipulations. With +it, you can do nearly all types of URL rewriting that you may need. It +is, however, somewhat complex, and may be intimidating to the beginner. +There is also a tendency to treat rewrite rules as magic incantation, +using them without actually understanding what they do.

    + +

    This document attempts to give sufficient background so that what +follows is understood, rather than just copied blindly. +

    +
    top
    +
    +

    Regular Expressions

    +

    Basic regex building blocks

    +
    top
    +
    +

    RewriteRule basics

    +

    +Basic anatomy of a RewriteRule, with exhaustively annotated simple +examples. +

    +
    top
    +
    +

    Rewrite Flags

    +

    Discussion of the flags to RewriteRule, and when and why one might +use them.

    +
    top
    +
    +

    Rewrite conditions

    +

    Discussion of RewriteCond, looping, and other related concepts. +

    +
    top
    +
    +

    Rewrite maps

    +

    Discussion of RewriteMap, including simple, but heavily annotated, +examples.

    +
    top
    +
    +

    .htaccess files

    +

    Discussion of the differences between rewrite rules in httpd.conf and +in .htaccess files.

    +
    top
    +
    +

    Environment Variables

    + +

    This module keeps track of two additional (non-standard) +CGI/SSI environment variables named SCRIPT_URL +and SCRIPT_URI. These contain the +logical Web-view to the current resource, while the +standard CGI/SSI variables SCRIPT_NAME and +SCRIPT_FILENAME contain the physical +System-view.

    + +

    Notice: These variables hold the URI/URL as they were +initially requested, i.e., before any +rewriting. This is important because the rewriting process is +primarily used to rewrite logical URLs to physical +pathnames.

    + +

    Example

    +SCRIPT_NAME=/sw/lib/w3s/tree/global/u/rse/.www/index.html
    +SCRIPT_FILENAME=/u/rse/.www/index.html
    +SCRIPT_URL=/u/rse/
    +SCRIPT_URI=http://en1.engelschall.com/u/rse/
    +
    + +
    +
    +

    Available Languages:  en 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/rewrite/rewrite_tech.html b/rubbos/app/httpd-2.0.64/docs/manual/rewrite/rewrite_tech.html new file mode 100644 index 00000000..18b37ed7 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/rewrite/rewrite_tech.html @@ -0,0 +1,5 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: rewrite_tech.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/rewrite/rewrite_tech.html.en b/rubbos/app/httpd-2.0.64/docs/manual/rewrite/rewrite_tech.html.en new file mode 100644 index 00000000..20c83e6c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/rewrite/rewrite_tech.html.en @@ -0,0 +1,166 @@ + + + +Apache mod_rewrite Technical Details - Apache HTTP Server + + + + + +
    <-
    +

    Apache mod_rewrite Technical Details

    +
    +

    Available Languages:  en 

    +
    + +

    This document discusses some of the technical details of mod_rewrite +and URL matching.

    +
    + +
    top
    +
    +

    Internal Processing

    + +

    The internal processing of this module is very complex but + needs to be explained once even to the average user to avoid + common mistakes and to let you exploit its full + functionality.

    +
    top
    +
    +

    API Phases

    + +

    First you have to understand that when Apache processes a + HTTP request it does this in phases. A hook for each of these + phases is provided by the Apache API. Mod_rewrite uses two of + these hooks: the URL-to-filename translation hook which is + used after the HTTP request has been read but before any + authorization starts and the Fixup hook which is triggered + after the authorization phases and after the per-directory + config files (.htaccess) have been read, but + before the content handler is activated.

    + +

    So, after a request comes in and Apache has determined the + corresponding server (or virtual server) the rewriting engine + starts processing of all mod_rewrite directives from the + per-server configuration in the URL-to-filename phase. A few + steps later when the final data directories are found, the + per-directory configuration directives of mod_rewrite are + triggered in the Fixup phase. In both situations mod_rewrite + rewrites URLs either to new URLs or to filenames, although + there is no obvious distinction between them. This is a usage + of the API which was not intended to be this way when the API + was designed, but as of Apache 1.x this is the only way + mod_rewrite can operate. To make this point more clear + remember the following two points:

    + +
      +
    1. Although mod_rewrite rewrites URLs to URLs, URLs to + filenames and even filenames to filenames, the API + currently provides only a URL-to-filename hook. In Apache + 2.0 the two missing hooks will be added to make the + processing more clear. But this point has no drawbacks for + the user, it is just a fact which should be remembered: + Apache does more in the URL-to-filename hook than the API + intends for it.
    2. + +
    3. + Unbelievably mod_rewrite provides URL manipulations in + per-directory context, i.e., within + .htaccess files, although these are reached + a very long time after the URLs have been translated to + filenames. It has to be this way because + .htaccess files live in the filesystem, so + processing has already reached this stage. In other + words: According to the API phases at this time it is too + late for any URL manipulations. To overcome this chicken + and egg problem mod_rewrite uses a trick: When you + manipulate a URL/filename in per-directory context + mod_rewrite first rewrites the filename back to its + corresponding URL (which is usually impossible, but see + the RewriteBase directive below for the + trick to achieve this) and then initiates a new internal + sub-request with the new URL. This restarts processing of + the API phases. + +

      Again mod_rewrite tries hard to make this complicated + step totally transparent to the user, but you should + remember here: While URL manipulations in per-server + context are really fast and efficient, per-directory + rewrites are slow and inefficient due to this chicken and + egg problem. But on the other hand this is the only way + mod_rewrite can provide (locally restricted) URL + manipulations to the average user.

      +
    4. +
    + +

    Don't forget these two points!

    +
    top
    +
    +

    Ruleset Processing

    + +

    Now when mod_rewrite is triggered in these two API phases, it + reads the configured rulesets from its configuration + structure (which itself was either created on startup for + per-server context or during the directory walk of the Apache + kernel for per-directory context). Then the URL rewriting + engine is started with the contained ruleset (one or more + rules together with their conditions). The operation of the + URL rewriting engine itself is exactly the same for both + configuration contexts. Only the final result processing is + different.

    + +

    The order of rules in the ruleset is important because the + rewriting engine processes them in a special (and not very + obvious) order. The rule is this: The rewriting engine loops + through the ruleset rule by rule (RewriteRule directives) and + when a particular rule matches it optionally loops through + existing corresponding conditions (RewriteCond + directives). For historical reasons the conditions are given + first, and so the control flow is a little bit long-winded. See + Figure 1 for more details.

    +

    + [Needs graphics capability to display]
    + Figure 1:The control flow through the rewriting ruleset +

    +

    As you can see, first the URL is matched against the + Pattern of each rule. When it fails mod_rewrite + immediately stops processing this rule and continues with the + next rule. If the Pattern matches, mod_rewrite looks + for corresponding rule conditions. If none are present, it + just substitutes the URL with a new value which is + constructed from the string Substitution and goes on + with its rule-looping. But if conditions exist, it starts an + inner loop for processing them in the order that they are + listed. For conditions the logic is different: we don't match + a pattern against the current URL. Instead we first create a + string TestString by expanding variables, + back-references, map lookups, etc. and then we try + to match CondPattern against it. If the pattern + doesn't match, the complete set of conditions and the + corresponding rule fails. If the pattern matches, then the + next condition is processed until no more conditions are + available. If all conditions match, processing is continued + with the substitution of the URL with + Substitution.

    + +
    +
    +

    Available Languages:  en 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/sections.html b/rubbos/app/httpd-2.0.64/docs/manual/sections.html new file mode 100644 index 00000000..eee94821 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/sections.html @@ -0,0 +1,21 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: sections.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: sections.html.es +Content-Language: es +Content-type: text/html; charset=ISO-8859-1 + +URI: sections.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: sections.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: sections.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/sections.html.en b/rubbos/app/httpd-2.0.64/docs/manual/sections.html.en new file mode 100644 index 00000000..a17c7918 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/sections.html.en @@ -0,0 +1,457 @@ + + + +Configuration Sections - Apache HTTP Server + + + + + +
    <-
    +

    Configuration Sections

    +
    +

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

    +
    +

    Directives in the configuration files may apply to the +entire server, or they may be restricted to apply only to particular +directories, files, hosts, or URLs. This document describes how to +use configuration section containers or .htaccess files +to change the scope of other configuration directives.

    +
    + +
    top
    +
    +

    Types of Configuration Section Containers

    + + + +

    There are two basic types of containers. Most containers are +evaluated for each request. The enclosed directives are applied only +for those requests that match the containers. The <IfDefine> and <IfModule> containers, on the +other hand, are evaluated only at server startup and restart. If +their conditions are true at startup, then the enclosed directives +will apply to all requests. If the conditions are not true, the +enclosed directives will be ignored.

    + +

    The <IfDefine> directive +encloses directives that will only be applied if an appropriate +parameter is defined on the httpd command line. For example, +with the following configuration, all requests will be redirected +to another site only if the server is started using +httpd -DClosedForNow:

    + +

    +<IfDefine ClosedForNow>
    +Redirect / http://otherserver.example.com/
    +</IfDefine> +

    + +

    The <IfModule> +directive is very similar, except it encloses directives that will +only be applied if a particular module is available in the server. +The module must either be statically compiled in the server, or it +must be dynamically compiled and its LoadModule line must be earlier in the +configuration file. This directive should only be used if you need +your configuration file to work whether or not certain modules are +installed. It should not be used to enclose directives that you want +to work all the time, because it can suppress useful error messages +about missing modules.

    + +

    In the following example, the MimeMagicFiles directive will be +applied only if mod_mime_magic is available.

    + +

    +<IfModule mod_mime_magic.c>
    +MimeMagicFile conf/magic
    +</IfModule> +

    + +

    Both <IfDefine> +and <IfModule> +can apply negative conditions by preceding their test with "!". +Also, these sections can be nested to achieve more complex +restrictions.

    +
    top
    +
    +

    Filesystem and Webspace

    + +

    The most commonly used configuration section containers are the +ones that change the configuration of particular places in the +filesystem or webspace. First, it is important to understand the +difference between the two. The filesystem is the view of your disks +as seen by your operating system. For example, in a default install, +Apache resides at /usr/local/apache2 in the Unix +filesystem or "c:/Program Files/Apache Group/Apache2" in +the Windows filesystem. (Note that forward slashes should always be +used as the path separator in Apache, even for Windows.) In contrast, +the webspace is the view of your site as delivered by the web server +and seen by the client. So the path /dir/ in the +webspace corresponds to the path +/usr/local/apache2/htdocs/dir/ in the filesystem of a +default Apache install on Unix. The webspace need not map directly to +the filesystem, since webpages may be generated dynamically +from databases or other locations.

    + +

    Filesystem Containers

    + +

    The <Directory> +and <Files> +directives, along with their regex counterparts, apply directives to +parts of the filesystem. Directives enclosed in a <Directory> section apply to +the named filesystem directory and all subdirectories of that +directory. The same effect can be obtained using .htaccess files. For example, in the +following configuration, directory indexes will be enabled for the +/var/web/dir1 directory and all subdirectories.

    + +

    +<Directory /var/web/dir1>
    +Options +Indexes
    +</Directory> +

    + +

    Directives enclosed in a <Files> section apply to any file with +the specified name, regardless of what directory it lies in. +So for example, the following configuration directives will, +when placed in the main section of the configuration file, +deny access to any file named private.html regardless +of where it is found.

    + +

    +<Files private.html>
    +Order allow,deny
    +Deny from all
    +</Files> +

    + +

    To address files found in a particular part of the filesystem, the +<Files> and +<Directory> sections +can be combined. For example, the following configuration will deny +access to /var/web/dir1/private.html, +/var/web/dir1/subdir2/private.html, +/var/web/dir1/subdir3/private.html, and any other instance +of private.html found under the /var/web/dir1/ +directory.

    + +

    +<Directory /var/web/dir1>
    +<Files private.html>
    +Order allow,deny
    +Deny from all
    +</Files>
    +</Directory> +

    + + +

    Webspace Containers

    + +

    The <Location> +directive and its regex counterpart, on the other hand, change the +configuration for content in the webspace. For example, the following +configuration prevents access to any URL-path that begins in /private. +In particular, it will apply to requests for +http://yoursite.example.com/private, +http://yoursite.example.com/private123, and +http://yoursite.example.com/private/dir/file.html as well +as any other requests starting with the /private string.

    + +

    +<Location /private>
    +Order Allow,Deny
    +Deny from all
    +</Location> +

    + +

    The <Location> +directive need not have anything to do with the filesystem. +For example, the following example shows how to map a particular +URL to an internal Apache handler provided by mod_status. +No file called server-status needs to exist in the +filesystem.

    + +

    +<Location /server-status>
    +SetHandler server-status
    +</Location> +

    + + +

    Wildcards and Regular Expressions

    + +

    The <Directory>, +<Files>, and +<Location> +directives can each use shell-style wildcard characters as in +fnmatch from the C standard library. The character "*" +matches any sequence of characters, "?" matches any single character, +and "[seq]" matches any character in seq. The "/" +character will not be matched by any wildcard; it must be specified +explicitly.

    + +

    If even more flexible matching is required, each +container has a regular-expression (regex) counterpart <DirectoryMatch>, <FilesMatch>, and <LocationMatch> that allow +perl-compatible +regular expressions +to be used in choosing the matches. But see the section below on +configuration merging to find out how using regex sections will change +how directives are applied.

    + +

    A non-regex wildcard section that changes the configuration of +all user directories could look as follows:

    + +

    +<Directory /home/*/public_html>
    +Options Indexes
    +</Directory> +

    + +

    Using regex sections, we can deny access to many types of image files +at once:

    +

    +<FilesMatch \.(?i:gif|jpe?g|png)$>
    +Order allow,deny
    +Deny from all
    +</FilesMatch> +

    + + + +

    What to use When

    + +

    Choosing between filesystem containers and webspace containers is +actually quite easy. When applying directives to objects that reside +in the filesystem always use <Directory> or <Files>. When applying directives to objects +that do not reside in the filesystem (such as a webpage generated from +a database), use <Location>.

    + +

    It is important to never use <Location> when trying to restrict +access to objects in the filesystem. This is because many +different webspace locations (URLs) could map to the same filesystem +location, allowing your restrictions to be circumvented. +For example, consider the following configuration:

    + +

    +<Location /dir/>
    +Order allow,deny
    +Deny from all
    +</Location> +

    + +

    This works fine if the request is for +http://yoursite.example.com/dir/. But what if you are on +a case-insensitive filesystem? Then your restriction could be easily +circumvented by requesting +http://yoursite.example.com/DIR/. The <Directory> directive, in +contrast, will apply to any content served from that location, +regardless of how it is called. (An exception is filesystem links. +The same directory can be placed in more than one part of the +filesystem using symbolic links. The <Directory> directive will follow the symbolic +link without resetting the pathname. Therefore, for the highest level +of security, symbolic links should be disabled with the appropriate +Options directive.)

    + +

    If you are, perhaps, thinking that none of this applies to you +because you use a case-sensitive filesystem, remember that there are +many other ways to map multiple webspace locations to the same +filesystem location. Therefore you should always use the filesystem +containers when you can. There is, however, one exception to this +rule. Putting configuration restrictions in a <Location +/> section is perfectly safe because this section will apply +to all requests regardless of the specific URL.

    + + +
    top
    +
    +

    Virtual Hosts

    + +

    The <VirtualHost> +container encloses directives that apply to specific hosts. +This is useful when serving multiple hosts from the same machine +with a different configuration for each. For more information, +see the Virtual Host Documentation.

    +
    top
    +
    +

    Proxy

    + +

    The <Proxy> +and <ProxyMatch> +containers apply enclosed configuration directives only +to sites accessed through mod_proxy's proxy server +that match the specified URL. For example, the following configuration +will prevent the proxy server from being used to access the +cnn.com website.

    + +

    +<Proxy http://cnn.com/*>
    +Order allow,deny
    +Deny from all
    +</Proxy> +

    +
    top
    +
    +

    What Directives are Allowed?

    + +

    To find out what directives are allowed in what types of +configuration sections, check the Context of the directive. +Everything that is allowed in +<Directory> +sections is also syntactically allowed in +<DirectoryMatch>, +<Files>, +<FilesMatch>, +<Location>, +<LocationMatch>, +<Proxy>, +and <ProxyMatch> +sections. There are some exceptions, however:

    + + +
    top
    +
    +

    How the sections are merged

    + +

    The configuration sections are applied in a very particular order. +Since this can have important effects on how configuration directives +are interpreted, it is important to understand how this works.

    + +

    The order of merging is:

    + +
      +
    1. <Directory> (except regular expressions) + and .htaccess done simultaneously (with + .htaccess, if allowed, overriding + <Directory>)
    2. + +
    3. <DirectoryMatch> + (and <Directory ~>)
    4. + +
    5. <Files> and <FilesMatch> done + simultaneously
    6. + +
    7. <Location> + and <LocationMatch> done simultaneously
    8. +
    + +

    Apart from <Directory>, each group is processed in + the order that they appear in the configuration files. <Directory> (group 1 above) + is processed in the order shortest directory component to longest. + So for example, <Directory /var/web/dir> will + be processed before <Directory + /var/web/dir/subdir>. If multiple <Directory> sections apply + to the same directory they are processed in the configuration file + order. Configurations included via the Include directive will be treated as if + they were inside the including file at the location of the + Include directive.

    + +

    Sections inside <VirtualHost> sections + are applied after the corresponding sections outside + the virtual host definition. This allows virtual hosts to + override the main server configuration.

    + +

    Later sections override earlier ones.

    + +

    Technical Note

    + There is actually a + <Location>/<LocationMatch> + sequence performed just before the name translation phase + (where Aliases and DocumentRoots + are used to map URLs to filenames). The results of this + sequence are completely thrown away after the translation has + completed. +
    + +

    Some Examples

    + +

    Below is an artificial example to show the order of +merging. Assuming they all apply to the request, the directives in +this example will be applied in the order A > B > C > D > +E.

    + +

    +<Location />
    +E
    +</Location>
    +
    +<Files f.html>
    +D
    +</Files>
    +
    +<VirtualHost *>
    +<Directory /a/b>
    +B
    +</Directory>
    +</VirtualHost>
    +
    +<DirectoryMatch "^.*b$">
    +C
    +</DirectoryMatch>
    +
    +<Directory /a/b>
    +A
    +</Directory>
    +
    +

    + +

    For a more concrete example, consider the following. Regardless of +any access restrictions placed in <Directory> sections, the <Location> section will be +evaluated last and will allow unrestricted access to the server. In +other words, order of merging is important, so be careful!

    + +

    +<Location />
    +Order deny,allow
    +Allow from all
    +</Location>
    +
    +# Woops! This <Directory> section will have no effect
    +<Directory />
    +Order allow,deny
    +Allow from all
    +Deny from badguy.example.com
    +</Directory> +

    + + + +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/sections.html.es b/rubbos/app/httpd-2.0.64/docs/manual/sections.html.es new file mode 100644 index 00000000..0b7fecb6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/sections.html.es @@ -0,0 +1,492 @@ + + + +Secciones de configuración - Servidor HTTP Apache + + + + + +
    <-
    +

    Secciones de configuración

    +
    +

    Idiomas disponibles:  en  | + es  | + ja  | + ko  | + tr 

    +
    +

    Las directivas presentes en los ficheros de configuración pueden ser +de aplicación para todo el servidor, o puede que su +aplicación se limite solamente a determinados directorios, +ficheros, hosts, o URLs. Este documento explica cómo usar las +secciones de configuración y los ficheros .htaccess +para modificar el ámbito de aplicación de las directivas de +configuración.

    + +
    top
    +
    +

    Tipos de secciones de +configuración

    + + + +

    Exiten dos tipos básicos de secciones de +configuración. Por un lado, la mayoría de las secciones de +configuración se evalúan para cada petición que se +recibe y se aplican las directivas que se incluyen en las distintas +secciones solamente a las peticiones que se adecúan a +determinadas características. Por otro lado, las secciones de tipo +<IfDefine> e +<IfModule>, se +evalúan solamente al inicio o reinicio del servidor. Si al +iniciar el servidor las condiciones son las adecuadas, las directivas +que incluyen estas secciones se aplicarán a todas las peticiones +que se reciban. Es caso contrario, esas directivas que incluyen se +ignoran completamente.

    + +

    Las secciones <IfDefine> incluyen directivas que se +aplicarán solamente si se pasa un determinado parámetro por +línea de comandos al ejecutar httpd. Por +ejemplo, con la siguiente configuración, todas las peticiones +serán redireccionadas a otro sitio web solamente si el servidor +se inició usando httpd -DClosedForNow:

    + +

    +<IfDefine ClosedForNow>
    +Redirect / http://otherserver.example.com/
    +</IfDefine> +

    + +

    La sección <IfModule> es muy parecida. La diferencia +respecto a <IfDefine> está en que incluye directivas +que se aplicarán solamente si un determinado módulo en +particular está disponible en el servidor. El módulo debe +estar compilado estáticamente en el servidor, o si está +compilado de forma dinámica ha de ponerse antes una línea +LoadModule en el fichero de +configuración. Esta directiva debe usarla solamente si necesita +que su fichero de configuración funcione estén o no +instalados determinados módulos. No debe usarla para incluir +directivas que quiera que se apliquen siempre, porque puede suprimir +mensajes de error que pueden ser de mucha utilidad para detectar la +falta de algún módulo.

    + +

    En el siguiente ejemplo, la directiva MimeMagicFiles se aplicará +solamente si el módulo mod_mime_magic está +disponible.

    + +

    +<IfModule mod_mime_magic.c>
    +MimeMagicFile conf/magic
    +</IfModule> +

    + +

    Tanto <IfDefine> +como <IfModule> +pueder usarse con condiones negativas anteponiendo al test el +carácter "!". Estas secciones también pueden anidarse para +establecer restricciones más complejas.

    + +
    top
    +
    +

    Sistemas de ficheros y espacio +web

    + +

    Las secciones de configuración usadas con más frecuencia +son las que cambian la configuración de áreas del sistema de +ficheros o del espacio web. En primer lugar, es importante comprender +la diferencia que existe entre estos dos conceptos. El sistema de +ficheros es la visión de sus discos desde el punto de vista del +sistema operativo. Por ejemplo, en una instalación estándar, +Apache estará en /usr/local/apache2 en un sistema +Unix o en "c:/Program Files/Apache Group/Apache2" en un +sistema Windows. (Tenga en cuenta que con Apache debe usar siempre +barras /, incluso en Windows.) Por el contrario, el espacio web lo +que presenta el servidor web y que visualiza el cliente. De manera que +la ruta /dir/ en el espacio web se corresponde con la +ruta /usr/local/apache2/htdocs/dir/ en el sistema de +ficheros de una instalación estándar en Unix. El espacio +web no tiene que tener correspondencia directa con el sistema de +ficheros, porque las páginas web pueden generarse de forma +dinámica a partir de bases de datos o partiendo de otras +ubicaciones.

    + +

    Secciones relacionadas con el sistema +de ficheros

    + +

    Las secciones <Directory> y <Files>, junto con sus contrapartes que usan +expresiones regulares, aplican sus directivas a áreas del sistema de +ficheros. Las directivas incluidas en una sección <Directory> se aplican al +directorio del sistema de ficheros especificado y a sus +subdirectorios. El mismo resultado puede obtenerse usando ficheros .htaccess. Por ejemplo, en la +siguiente configuración, se activarán los índices de +directorio para el directorio /var/web/dir1 y sus +subdirectorios.

    + +

    +<Directory /var/web/dir1>
    +Options +Indexes
    +</Directory> +

    + +

    Las directivas incluidas en una sección <Files> se aplicarán a +cualquier fichero cuyo nombre se especifique, sin tener en cuenta en +que directorio se encuentra. Por ejemplo, las siguientes directivas de +configuración, cuando se colocan en la sección principal del +fichero de configuración, deniegan el acceso a cualquier fichero +llamado private.html sin tener en cuenta de donde se +encuentre.

    + +

    +<Files private.html>
    +Order allow,deny
    +Deny from all
    +</Files> +

    + +

    Para referirse a archivos que se encuentren en un determinado lugar +del sistema de ficheros, se pueden combinar las secciones <Files> y <Directory>. Por ejemplo, la +siguiente configuración denegará el acceso a +/var/web/dir1/private.html, +/var/web/dir1/subdir2/private.html, +/var/web/dir1/subdir3/private.html, y cualquier otra +aparición de private.html que se encuentre en +/var/web/dir1/ o cualquiera de sus subdirectorios.

    + +

    +<Directory /var/web/dir1>
    +<Files private.html>
    +Order allow,deny
    +Deny from all
    +</Files>
    +</Directory> +

    + + +

    Secciones relacionadas con el espacio +web

    + +

    La sección <Location> y su contraparte que usa + expresiones regulares, cambian + la configuración para el contenido del espacio web. Por ejemplo, + la siguiente configuración evita que se acceda a cualquier URL + que empiece por /private. En concreto, se aplicará a + peticiones que vayan dirigidas a + http://yoursite.example.com/private, + http://yoursite.example.com/private123, y a + http://yoursite.example.com/private/dir/file.html + así como + también a cualquier otra petición que comience por + /private.

    + +

    +<Location /private>
    +Order Allow,Deny
    +Deny from all
    +</Location> +

    + +

    La sección <Location> puede no tener nada que ver con el +sistema de ficheros. Por ejemplo, el siguiente ejemplo muestra como +asociar una determinada URL a un handler interno de Apache del +módulo mod_status. No tiene por qué +existir ningún fichero server-status en el sistema +de ficheros.

    + +

    +<Location /server-status>
    +SetHandler server-status
    +</Location> +

    + + +

    Caracteres comodín y expresiones +regulares

    + +

    Las secciones <Directory>, <Files>, y <Location> pueden usar caracteres comodín +del tipo fnmatch de la librería estándar de C. +El carácter "*" equivale a cualquier secuencia de caracteres, "?" +equivale a cualquier carácter individual, y "[seq]" +equivale a cualquier carácter en seq. Ningún +carácter comodín equivale a"/", que debe siempre +especificarse explícitamente.

    + +

    Si necesita un sistema de equivalencias más flexible, cada +sección tiene una contraparte que acepta expresiones regulares compatibles con +Perl: <DirectoryMatch>, <FilesMatch>, y <LocationMatch>. Consulte la sección +sobre la fusión de secciones de configuración para ver la +forma en que las secciones expresiones regulares cambian el modo en +que se aplican las directivas.

    + +

    Abajo se muestra un ejemplo en el que una sección de +configuración que usa caracteres comodín en lugar de una +expresión regular modifica la configuración de todos los +directorios de usuario:

    + +

    +<Directory /home/*/public_html>
    +Options Indexes
    +</Directory> +

    + +

    Usando expresiones regulares, podemos denegar el acceso a muchos +tipos ficheros de imágenes de una sola vez:

    + +

    +<FilesMatch \.(?i:gif|jpe?g|png)$>
    +Order allow,deny
    +Deny from all
    +</FilesMatch> +

    + + + +

    Qué usar en cada momento

    + +

    Decidir cuando hay que usar secciones que se apliquen sobre el +sistema de ficheros y cuando usar secciones que se apliquen sobre el +espacio web es bastante fácil. Cuando se trata de directivas que +se aplican a objetos que residen en el sistema de ficheros, siempre se +deben usar <Directory> o <Files>. Cuando se trata de directivas que se +aplican a objetos que no residen en el sistema de ficheros (por +ejemplo una página web generada a partir de una base de datos), +se usa <Location>.

    + +

    Es importante no usar nunca <Location> cuando se trata de restringir el +acceso a objetos en el sistema de ficheros. Esto se debe a que varias +URLs diferentes pueden corresponderse con una misma ubicación en +el sistema de ficheros, haciendo que la restricción pueda ser +evitada. Por ejemplo, considere la siguiente configuración:

    + +

    +<Location /dir/>
    +Order allow,deny
    +Deny from all
    +</Location> +

    + +

    La restricción funciona si se produce una petición a +http://yoursite.example.com/dir/. Pero, ¿qué +ocurriría si se trata de un sistema de ficheros que no distingue +mayúsculas de minúsculas? Entonces, la restricción que +ha establecido podría evitarse fácilmente haciendo una +peticion a http://yoursite.example.com/DIR/. Una +sección <Directory> por el contrario, se aplicará +a cualquier contenido servido desde esa ubicación, +independientemente de cómo se llame. (Una excepción son los +enlaces del sistema de ficheros. El mismo directorio puede ser +colocado en más de una ubicación del sistema de ficheros +usando enlaces simbólicos. La sección <Directory> seguirá los +enlaces simbólicos sin resetear la ruta de fichero (resetting the +pathname). Por tanto, para conseguir el mayor nivel de seguridad, los +enlaces simbólicos deben desactivarse con la directiva Options correspondiente.)

    + +

    En el caso de que piense que nada de esto le afecta porque usa un +sistema de ficheros que distingue mayúsculas de minúsculas, +recuerde que hay muchas otras maneras de hacer corresponder +múltiples direcciones del espacio web con una misma +ubicación del sistema de ficheros. Por tanto, use las secciones +de configuración que se aplican al sistema de ficheros siempre +que sea posible. Hay, sin embargo, una excepción a esta +regla. Poner restricciones de configuración en una sección +<Location /> es completamente seguro porque estas +secciones se aplicarán a todas las peticiones independientemente +de la URL específica que se solicite.

    + +
    top
    +
    +

    Hosts virtuales

    + +

    El contenedor <VirtualHost> agrupa directivas que se +aplicarán a hosts específicos. Esto es útil cuando se +sirven varios hosts con una misma máquina y con una +configuración diferente cada uno. Para más información, +consulte la documentación sobre hosts +virtuales.

    top
    +
    +

    Proxy

    + +

    Las secciones <Proxy> y <ProxyMatch> aplican las directivas de +configuración que engloban solo a los sitios accedidos a +través del servidor proxy del módulo +mod_proxy que tengan equivalencia con la URL +especificada. Por ejemplo, la siguiente configuración +evitará que se use el servidor proxy para acceder al sitio web +cnn.com.

    + +

    +<Proxy http://cnn.com/*>
    +Order allow,deny
    +Deny from all
    +</Proxy> +

    +
    top
    +
    +

    ¿Qué directivas se pueden +usar?

    + +

    Para ver que directivas son las que se pueden usar en cada +sección de configuración, consulte el Context de la directiva. +Todas las directivas que está permitido usar en las secciones +<Directory> se +pueden usar también en las secciones <DirectoryMatch>, <Files>, <FilesMatch>, <Location>, <LocationMatch>, <Proxy>, y <ProxyMatch>. Sin embargo, hay algunas +excepciones:

    + + +
    top
    +
    +

    ¿Cómo se fusionan las distintas +secciones?

    + +

    Las secciones de configuración se aplican en un determinado +orden. Como este orden puede tener efectos significativos en como se +interpretan las directivas de configuración, es importante +entender cómo funciona este proceso.

    + +

    El orden de fusión es el siguiente:

    + +
      +
    1. <Directory> (excepto expresiones + regulares) y .htaccess simultáneamente (si el + uso de .htaccess está permitido, prevaleciendo + sobre <Directory>)
    2. + +
    3. <DirectoryMatch> + (y <Directory ~>)
    4. + +
    5. <Files> y + <FilesMatch> + simultáneamente
    6. + +
    7. <Location> + y <LocationMatch> + simultáneamente
    8. +
    + +

    Aparte de <Directory>, cada grupo se procesa en el + orden en que aparezca en los ficheros de configuración. + <Directory> + (grupo 1 arriba) se procesa empezando por los componentes de la + ruta al directorio más cortos. Por ejemplo, + <Directory + /var/web/dir> se procesará antes de + <Directory /var/web/dir/subdir>. Si hay que + aplicar varias secciones <Directory> a un mismo directorio, se + aplican en el orden en que aparezcan en el fichero de + configuración. Las configuraciones incluidas mediante la + directiva Include se + tratarán como si estuvieran dentro del fichero de + configuración principal en lugar de la sección + Include.

    + +

    Las secciones incluidas dentro de secciones <VirtualHost> se aplican + después de las correspondientes secciones fuera + de la definición del host virtual. Esto permite que la + configuración especificada para los hosts virtuales pueda + prevalecer sobre la configuración del servidor principal.

    + +

    Las secciones que aparecen después prevalecen sobre las + que aparecen antes.

    + +

    Nota técnica.

    Previamente a la fase de + traducción de nombres (en la que se analizan los + Aliases y DocumentRoots para calcular + las correspondencias entre URLs y nombres de ficheros) se + ejecuta una secuencia + <Location>/<LocationMatch>. Los + resultados de esta secuencia se desechan después de + ejecutar la traducción.
    + +

    Algunos ejemplos

    + +

    Abajo se muestra un ejemplo para que se vea claramente cuál es +el orden de fusión. Asumiendo que todas las secciones se aplican +a la petición, las de este ejemplo se aplicarían en el orden +A > B > C > D > E.

    + +

    +<Location />
    +E
    +</Location>
    +
    +<Files f.html>
    +D
    +</Files>
    +
    +<VirtualHost *>
    +<Directory /a/b>
    +B
    +</Directory>
    +</VirtualHost>
    +
    +<DirectoryMatch "^.*b$">
    +C
    +</DirectoryMatch>
    +
    +<Directory /a/b>
    +A
    +</Directory>
    +
    +

    + +

    A continuación se muestra un ejemplo más concreto. +Independientemente de las restricciones de acceso que se hayan +establecido en las secciones <Directory>, la sección <Location> será evaluada +al final y se permitirá acceso sin restricciones al servidor. En +otras palabras, el orden de fusión es importante, de modo que +ponga atención.

    + +

    +<Location />
    Order deny,allow
    Allow from all
    +</Location>

    +# Esta sección <Directory> no tendrá efecto
    +<Directory />
    +Order allow,deny
    +Allow from all
    +Deny from badguy.example.com
    +</Directory> +

    + + + +
    +
    +

    Idiomas disponibles:  en  | + es  | + ja  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/sections.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/sections.html.ja.utf8 new file mode 100644 index 00000000..d5a9bc3d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/sections.html.ja.utf8 @@ -0,0 +1,467 @@ + + + +セクションの設定 - Apache HTTP サーバ + + + + + +
    <-
    +

    セクションの設定

    +
    +

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

    +
    +
    This translation may be out of date. Check the + English version for recent changes.
    +

    設定ファイル中のディレクティブは +サーバ全体に適用されたり、特定のディレクトリやファイル、ホスト、URL にのみ +適用されるように制限したりすることができます。この文書は設定用のセクションの +コンテナや .htaccess ファイルを使って他の設定ディレクティブの +スコープを変更する方法を説明します。

    +
    + +
    top
    +
    +

    設定用セクションコンテナの種類

    + + + +

    コンテナには二つの基本となる種類があります。ほとんどのコンテナは +各リクエストに対して評価されます。その場合、コンテナ中のディレクティブは +コンテナにマッチするリクエストにのみ適用されます。 +一方、<IfDefine> コンテナと <IfModule> コンテナは +サーバの起動時と再起動時にのみ評価されます。起動時に条件が真であれば、 +コンテナ中のディレクティブはすべてのリクエストに適用されます。条件が +偽であれば、コンテナ中のディレクティブは無視されます。

    + +

    <IfDefine> ディレクティブは +httpd コマンドラインで適切なパラメータが定義されたときにのみ +適用されるディレクティブを囲います。例えば次の設定では、サーバが +httpd -DClosedForNow を使って起動されたときだけすべての +リクエストを別のサイトにリダイレクトします:

    + +

    +<IfDefine ClosedForNow>
    +Redirect / http://otherserver.example.com/
    +</IfDefine> +

    + +

    <IfModule> は +非常に似ていますが、代わりにサーバ上でモジュールが使用可能な場合にのみ +適用可能なディレクティブを囲います。モジュールはサーバに +静的に組み込まれているか、動的に組み込むようになっていて、設定ファイル中で +LoadModule の行がより前の +部分に書かれている必要があります。このディレクティブは特定のモジュールの +存在に関わらず設定ファイルが動作する必要がある場合にのみ使ってください。 +常に動作して欲しいディレクティブを囲むために使うべきではありません。 +存在しないモジュールに関する有用なエラーメッセージの発生を抑制してしまいますので。 +

    + +

    次の例では、mod_mime_magic があるときにのみ MimeMagicFiles ディレクティブが +適用されます。

    + +

    +<IfModule mod_mime_magic.c>
    +MimeMagicFile conf/magic
    +</IfModule> +

    + +

    <IfDefine> ディレクティブと +<IfModule> ディレクティブは +テストの前に "!" を付けることで否定の条件を適用することができます。 +また、これらのセクションはより複雑な制限を課すために入れ子にすることができます。 +

    +
    top
    +
    +

    ファイルシステムとウェブ空間

    + +

    最もよく使われる設定のセクションコンテナはファイルシステムやウェブ空間の +特定の場所の設定を変更するものです。まず、この二つの違いを理解することが +大切です。ファイルシステムはオペレーティングシステムから見たディスクの内容です。 +たとえば、デフォルトのインストールでは Apache は Unix ファイルシステムでは +/usr/local/apache2 に、Windows ファイルシステムでは +"c:/Program Files/Apache Group/Apache2" に存在します。 +(Apache では Windows でもパスセパレータとしてスラッシュを使うことに +気をつけてください。) 対照的に、ウェブ空間はあなたのサイトを +ウェブサーバから配信されるものとして見たもので、クライアントに見えるものです。 +デフォルトの Unix 上の Apache のインストールではウェブ空間の +/dir/ というパスはファイルシステムの +/usr/local/apache2/htdocs/dir/ というパスに対応します。 +ウェブページはデータベースや他の場所から動的に生成することもできますので、 +ウェブ空間はファイルシステムに直接マップする必要はありません。

    + +

    ファイルシステムコンテナ

    + +

    <Directory> ディレクティブと +<Files> ディレクティブ、それと +それらの正規表現版はディレクティブをファイルシステムの一部分に対して適用します。 +<Directory> セクションの +中のディレクティブは指定されたディレクトリとそのすべてのサブディレクトリに +適用されます。.htaccess ファイルを +使うことでも同じ効果を得ることができます。例えば、次の設定では +/var/web/dir1 とすべてのサブディレクトリに対して +ディレクトリインデックスを行ないます。

    + +

    +<Directory /var/web/dir1>
    +Options +Indexes
    +</Directory> +

    + +

    <Files> セクションの +中にあるディレクティブはどのディレクトリにあるかに関わらず、指定された名前の +すべてのファイルに適用されます。ですから例えば以下の設定ディレクティブが +設定ファイルの主セクションに書かれたときには、すべての場所の +private.html という名前のファイルへのアクセスを拒否します。

    + +

    +<Files private.html>
    +Order allow,deny
    +Deny from all
    +</Files> +

    + +

    ファイルシステムの特定の場所にあるファイルを指定するために、 +<Files> セクションと +<Directory> セクションを +組み合わせることができます。例えば、次の設定では +/var/web/dir1/private.html, +/var/web/dir1/subdir2/private.html, +/var/web/dir1/subdir3/private.html など、 +/var/web/dir1/ ディレクトリの下にあるすべての +private.html へのアクセスを拒否します。

    + +

    +<Directory /var/web/dir1>
    +<Files private.html>
    +Order allow,deny
    +Deny from all
    +</Files>
    +</Directory> +

    + + +

    ウェブ空間コンテナ

    + +

    一方、<Location> +ディレクティブとその正規表現版はウェブ空間上の内容に対して設定を変更します。 +たとえば、次の設定では /private で始まる URL パスへのアクセスを制限します。 +具体的には、 +http://yoursite.example.com/private, +http://yoursite.example.com/private123, +http://yoursite.example.com/private/dir/file.html +へのリクエストや、 +他の同様に /private 文字列で始まるリクエストに +適用されます。

    + +

    +<Location /private>
    +Order Allow,Deny
    +Deny from all
    +</Location> +

    + +

    <Location> +ディレクティブはファイルシステムと関係ある必要が全くありません。 +たとえば次の例では、どのようにして特定の URL を +mod_statusで提供されている Apache +内部ハンドラにマップするかを示しています。ファイルシステムに +server-status というファイルが存在する必要はありません。

    + +

    +<Location /server-status>
    +SetHandler server-status
    +</Location> +

    + + +

    ワイルドカードと正規表現

    + +

    <Directory>, +<Files>, +<Location> +ディレクティブでは、 C 標準ライブラリの fnmatch のように +shell スタイルのワイルドカードキャラクタが使用できます。 +"*" 文字は任意の文字列にマッチし、"?" 文字は任意の 1 文字にマッチし、 +"[seq]" は seq の任意の文字にマッチします。 +"/" 文字はどのワイルドカードでもマッチされません。 +明示的に指定する必要があります。

    + +

    これより柔軟なマッチングが必要な場合は、これらのコンテナに正規表現 +(regex) 版である +<DirectoryMatch>, +<FilesMatch>, +<LocationMatch> +があり、マッチを選択するのに perl 互換正規表現を使用できます。しかし、次の設定のマージに目を通して、 +regex セクションを使用することで、ディレクティブの適用がどのように +変化するか把握しておいてください。

    + +

    全ユーザディレクトリの設定を変更する、非 regex +ワイルドカードセクションは次のようになります。

    + +

    +<Directory /home/*/public_html>
    +Options Indexes
    +</Directory> +

    + +

    regex セクションを使用することで、画像ファイルの多くのタイプに対する +アクセスを一度に拒否できます。

    +

    +<FilesMatch \.(?i:gif|jpe?g|png)$>
    +Order allow,deny
    +Deny from all
    +</FilesMatch> +

    + + + +

    いつ何を使うか

    + +

    ファイルシステムコンテナとウェブ空間コンテナを使い分けるのは、 +実際には非常に簡単です。ファイルシステムに依存する +オブジェクトにディレクティブを適応する場合は、必ず +<Directory> か +<Files> +を使用します。ファイルシステムに依存しないオブジェクト +(データベースから生成されるウェブページなど) +にディレクティブを適用する際には、 +<Location> +を使用します。

    + +

    ファイルシステム上のオブジェクトへのアクセスを制限するために、 +<Location> +を決して使用ないようにしましょう。 +同一のファイルシステム位置にマップしている、ウェブ空間位置 (URL) +が多数あって、設定した制限を迂回されてしまうかもしれないからです。 +例えば次の設定を考えてみましょう。

    + +

    +<Location /dir/>
    +Order allow,deny
    +Deny from all
    +</Location> +

    + +

    http://yoursite.example.com/dir/ +へのリクエストでは上手く動作します。しかし大文字小文字を区別しない +ファイルシステムを使っていたらどうなるでしょう? +http://yoursite.example.com/DIR/ +へのリクエストで簡単にアクセス制限を迂回されてしまいます。これに対して +<Directory> +ディレクティブを使用すると、どのように呼び出されたかに関わらず +その場所から提供される内容に適用されます。 +(例外はファイルシステムのリンクです。シンボリックリンクを使って、 +同一のディレクトリを複数のファイルシステムに設置できます。 +<Directory> +ディレクティブはパス名をリセットすることなくシンボリックリンクを +辿ります。ですから、高度なセキュリティが要求される場合は、 +適切に Options +ディレクティブを使用してシンボリックリンクを無効にするべきです。)

    + +

    大文字小文字を区別するファイルシステムを使用しているから上記のことは +無関係だと思われるかもしれませんが、 +同一のファイルシステム位置に複数のウェブ空間位置をマップする方法は、 +他にいくらでもあるということを覚えていてください。 +ですからできる限りファイルシステムコンテナを使用してください。 +しかしながら一つだけ例外があります。 +<Location /> セクションはどんな URL +にも関わらず適用されるので、完全に安全です。

    + + +
    top
    +
    +

    バーチャルホスト

    + +

    <VirtualHost> +コンテナは特定のホストに適用するディレクティブを格納します。 +一台のマシンで複数のホストを異なる設定で提供したいときに有用です。 +詳細に関してはバーチャルホストドキュメントを +ご覧下さい。

    +
    top
    +
    +

    プロクシ

    + +

    <Proxy> +と <ProxyMatch> +コンテナは、特定の URL にマッチする mod_proxy +プロクシサーバを経由してアクセスしたサイトに対してのみ適用される +設定ディレクティブを格納します。例えば次の設定は、cnn.com +ウェブサイトにアクセスするために用いられるプロクシサーバを +制限します。

    + +

    +<Proxy http://cnn.com/*>
    +Order allow,deny
    +Deny from all
    +</Proxy> +

    +
    top
    +
    +

    どのディレクティブが使えるの?

    + +

    どのタイプの設定セクションでどのディレクティブが使用できるかは、 +ディレクティブの Context +を見てください。 +<Directory> +で使用可能なものは全て、同様に +<DirectoryMatch>, +<Files>, +<FilesMatch>, +<Location>, +<LocationMatch>, +<Proxy>, +<ProxyMatch> +セクションで使用可能です。しかしながら幾つか例外も存在します。

    + +
      +
    • AllowOverride ディレクティブは +<Directory> +セクションでのみ使用可能です。
    • + +
    • FollowSymLinks と SymLinksIfOwnerMatch の +Options は、 +<Directory> +セクションか .htaccess ファイルでのみ使用可能です。
    • + +
    • Options ディレクティブは、 +<Files> +と <FilesMatch> +セクションでは使用できません。
    • +
    +
    top
    +
    +

    セクションのマージ方法

    + +

    マージの順番は以下のようになっています:

    + +
      +
    1. <Directory> (正規表現無し) と + .htaccess を同時に (.htaccess が許可されていれば、それが + <Directory> を上書きします) +
    2. + +
    3. <DirectoryMatch> + (と <Directory ~>
    4. + +
    5. <Files> と + <FilesMatch> を同時に
    6. + +
    7. <Location> と + <LocationMatch> を同時に
    8. +
    + +

    <Directory> + 以外は、それぞれのグループは設定ファイルに現れた順番に処理されます。 + <Directory> (上のグループ 1) + はディレクトリが短いものから長いものへと処理されます。ですから、 + 例えば <Directory /var/web/dir1> は + <Directory /var/web/dir/subdir> の前に処理されます。複数の + <Directory> セクションが + 同じディレクトリに + 適用される場合は、設定ファイル中の順番に従って処理されます。 + Include + によって挿入された設定は 挿入しているファイルの + Include + ディレクティブの位置にあったかのように扱われます。

    + +

    <VirtualHost> セクション中のセクションは + バーチャルホストの定義の外側の対応するセクションの + 後に適用されます。これによりバーチャルホストが + メインのサーバ設定を上書きできるようなります。

    + +

    後のセクションのディレクティブが前のセクションのものを上書きします。

    + + +

    技術メモ

    + 実際には、名前を変換する段階 (URL + をファイル名にマップするために Alias や + DocumentRoot が使用されるところ) の直前に + <Location>/<LocationMatch> + が行なわれます。 + これらを適用した結果は変換が終わった後に完全に捨てられます。 +
    +

    例

    + +

    次はマージの順番を示すための恣意的な例になっています。 +リクエスト全てに適用されるとして、本例のディレクティブは +A > B > C > D > E の順番に適用されます。

    + +

    +<Location />
    +E
    +</Location>
    +
    +<Files f.html>
    +D
    +</Files>
    +
    +<VirtualHost *>
    +<Directory /a/b>
    +B
    +</Directory>
    +</VirtualHost>
    +
    +<DirectoryMatch "^.*b$">
    +C
    +</DirectoryMatch>
    +
    +<Directory /a/b>
    +A
    +</Directory>
    +
    +

    + +

    もっと具体的な、次の例を考えてみましょう。 +<Directory> +セクションに設置されたアクセス制限に関わらず、 +<Location> +セクションが最後に評価されて、サーバへのアクセスは制限されません。 +言い換えれば、マージの順番は重要で、注意して使用してください!

    + +

    +<Location />
    +Order deny,allow
    +Allow from all
    +</Location>
    +
    +# Woops! This <Directory> section will have no effect
    +<Directory />
    +Order allow,deny
    +Allow from all
    +Deny from badguy.example.com
    +</Directory> +

    + + + +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/sections.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/sections.html.ko.euc-kr new file mode 100644 index 00000000..cf8c9ae8 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/sections.html.ko.euc-kr @@ -0,0 +1,423 @@ + + + +¼½¼Ç ¼³Á¤ - Apache HTTP Server + + + + + +
    <-
    +

    ¼½¼Ç ¼³Á¤

    +
    +

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

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

    ¼³Á¤ÆÄÀÏ¿¡ ÀÖ´Â +Áö½Ã¾î´Â ¼­¹ö Àüü¿¡ Àû¿ëµÇ°Å³ª, ƯÁ¤ µð·ºÅ丮, ÆÄÀÏ, È£½ºÆ®, +URL¿¡¸¸ Àû¿ëµÉ ¼ö ÀÖ´Ù. ÀÌ ¹®¼­´Â ´Ù¸¥ Áö½Ã¾îÀÇ Àû¿ë¹üÀ§¸¦ +Á¦ÇÑÇϱâÀ§ÇØ ¼³Á¤ ¼½¼ÇÀ̳ª .htaccess ÆÄÀÏÀ» +»ç¿ëÇÏ´Â ¹æ¹ýÀ» ¼³¸íÇÑ´Ù.

    +
    + +
    top
    +
    +

    ¼³Á¤ ¼½¼ÇÀÇ Á¾·ù

    + + + +

    ¼½¼Ç¿¡´Â µÎ°¡Áö Á¾·ù°¡ ÀÖ´Ù. ´ëºÎºÐÀº ¸Å¿äû¸¶´Ù 󸮵ȴÙ. +ÇØ´çÇÏ´Â ¿äû¿¡¸¸ ¾È¿¡ Æ÷ÇÔÇÑ Áö½Ã¾î¸¦ Àû¿ëÇÑ´Ù. ¹Ý´ë·Î, <IfDefine>°ú <IfModule>Àº ¼­¹ö°¡ +½ÃÀÛÇÒ¶§¿Í ²¨Áú¶§¸¸ ó¸®ÇÑ´Ù. ½ÃÀÛÇÒ¶§ »óÅ°¡ ÂüÀÌ¸é ¾È¿¡ ÀÖ´Â +Áö½Ã¾î°¡ ¸ðµç ¿äû¿¡ Àû¿ëµÈ´Ù. ÂüÀÌ ¾Æ´Ï¸é ¾È¿¡ ÀÖ´Â Áö½Ã¾î´Â +¹«½ÃÇÑ´Ù.

    + +

    <IfDefine> +Áö½Ã¾î´Â httpd ¸í·ÉÇà¿¡ ÀûÀýÇÑ ÆĶó¹ÌÅÍ°¡ ÀÖ´Â +°æ¿ì¿¡¸¸ ¾È¿¡ Æ÷ÇÔÇÑ Áö½Ã¾î¸¦ Àû¿ëÇÑ´Ù. ´ÙÀ½ ¼³Á¤À» ¿¹·Î µé¸é, +¼­¹ö¸¦ httpd -DClosedForNow·Î ½ÃÀÛÇÒ °æ¿ì¿¡¸¸ +¸ðµç ¿äûÀÌ ´Ù¸¥ »çÀÌÆ®·Î ¸®´ÙÀÌ·º¼ÇµÈ´Ù:

    + +

    +<IfDefine ClosedForNow>
    +Redirect / http://otherserver.example.com/
    +</IfDefine> +

    + +

    <IfModule> +Áö½Ã¾îµµ ƯÁ¤ ¸ðµâÀÌ ¼­¹ö¿¡ Æ÷ÇÔµÈ °æ¿ì¿¡¸¸ ¾È¿¡ µç Áö½Ã¾î¸¦ +Àû¿ëÇÑ´Ù´Â Á¡À» Á¦¿ÜÇÏ°í´Â ¸Å¿ì ºñ½ÁÇÏ´Ù. ¸ðµâÀ» ¼­¹ö¿¡ Á¤ÀûÀ¸·Î +ÄÄÆÄÀÏÇϰųª µ¿ÀûÀ¸·Î ÄÄÆÄÀÏÇÑÈÄ ¼³Á¤ÆÄÀÏ ¾Õ¿¡ LoadModule ÁÙÀÌ ÀÖ¾î¾ß ÇÑ´Ù. ÀÌ +Áö½Ã¾î´Â ƯÁ¤ ¸ðµâÀÇ ¼³Ä¡À¯¹«¿¡ µû¶ó ¼³Á¤ÆÄÀÏÀÌ ´Ù¸¦ ÇÊ¿ä°¡ +ÀÖÀ»¶§¸¸ »ç¿ëÇØ¾ß ÇÑ´Ù. ¸ðµâÀÌ ¾ø´Â °æ¿ì À¯¿ëÇÑ ¿À·ù¹®ÀÌ ³ª¿ÀÁö¾ÊÀ» +¼ö Àֱ⠶§¹®¿¡ ¾ðÁ¦³ª »ç¿ëÇÏ±æ ¿øÇÏ´Â Áö½Ã¾î¸¦ ¾È¿¡ µÎ¸é ¾ÈµÈ´Ù.

    + +

    ´ÙÀ½ ¿¹¿¡¼­ mod_mime_magicÀÌ ÀÖÀ»¶§¸¸ MimeMagicFiles Áö½Ã¾î¸¦ +ó¸®ÇÑ´Ù.

    + +

    +<IfModule mod_mime_magic.c>
    +MimeMagicFile conf/magic
    +</IfModule> +

    + +

    <IfDefine>°ú +<IfModule>ÀÇ +°Ë»ç ¾Õ¿¡ "!"À» ºÙ¿© Á¶°ÇÀ» ¿ªÀ¸·Î ÇÒ ¼ö ÀÖ´Ù. ¶Ç, ¿©·¯ ¼½¼ÇµéÀ» +°ãÃļ­ »ç¿ëÇÏ¿© ´õ º¹ÀâÇÑ È¿°ú¸¦ ¾òÀ» ¼ö ÀÖ´Ù.

    +
    top
    +
    +

    ÆÄÀϽýºÅÛ°ú À¥°ø°£

    + +

    °¡Àå ÀÚÁÖ »ç¿ëµÇ´Â ¼³Á¤ ¼½¼ÇÀº ÆÄÀϽýºÅÛ°ú À¥°ø°£(webspace)ÀÇ +ƯÁ¤ Àå¼Ò¿¡ ´ëÇÑ ¼³Á¤À» º¯°æÇÏ´Â °ÍµéÀÌ´Ù. ¸ÕÀú ÀÌ µÑÀÇ Â÷À̸¦ +ÀÌÇØÇÏ´Â °ÍÀÌ Áß¿äÇÏ´Ù. ÆÄÀϽýºÅÛÀº ¿î¿µÃ¼Á¦ ÀÔÀå¿¡¼­ µð½ºÅ©¸¦ +º¸´Â °üÁ¡ÀÌ´Ù. ¿¹¸¦ µé¾î, ±âº»°ªÀ¸·Î ¾ÆÆÄÄ¡¸¦ ¼³Ä¡¸¦ Çϸé À¯´Ð½º +ÆÄÀϽýºÅÛÀÇ °æ¿ì /usr/local/apache2, À©µµ¿ìÁî +ÆÄÀϽýºÅÛÀÇ °æ¿ì "c:/Program Files/Apache +Group/Apache2"¿¡ ¼³Ä¡µÈ´Ù. (¾ÆÆÄÄ¡´Â À©µµ¿ìÁî¿¡¼­ Á¶Â÷ +Ç×»ó, ¿ª½½·¡½¬°¡ ¾Æ´Ñ, ½½·¡½¬¸¦ »ç¿ëÇÔÀ» ÁÖÀÇÇ϶ó.) ¹Ý´ë·Î +À¥°ø°£Àº À¥¼­¹ö°¡ Á¦°øÇÏ°í Ŭ¶óÀ̾ðÆ®°¡ º¸°ÔµÉ »çÀÌÆ®ÀÇ °üÁ¡ÀÌ´Ù. +±×·¡¼­ À¯´Ð½º¿¡¼­ ±âº» ¾ÆÆÄÄ¡ ¼³Ä¡¸¦ ÇÑ °æ¿ì À¥°æ·ÎÀÇ °æ·Î +/dir/Àº ÆÄÀϽýºÅÛ °æ·Î +/usr/local/apache2/htdocs/dir/¿¡ ÇØ´çÇÑ´Ù. À¥°ø°£Àº +µ¥ÀÌŸº£À̽º µî¿¡¼­ µ¿ÀûÀ¸·Î »ý¼ºµÉ ¼ö Àֱ⶧¹®¿¡ ¹Ýµå½Ã +ÆÄÀϽýºÅÛ¿¡ Á÷Á¢ ´ëÀÀµÉ ÇÊ¿ä´Â ¾ø´Ù.

    + +

    ÆÄÀϽýºÅÛ ¼½¼Ç

    + +

    <Directory>¿Í +<Files> Áö½Ã¾î¿Í +Á¤±ÔÇ¥Çö½ÄÀ» »ç¿ëÇÏ´Â Áö½Ã¾î´Â ÆÄÀϽýºÅÛÀÇ Æ¯Á¤ ºÎºÐ¿¡ Áö½Ã¾î¸¦ +Àû¿ëÇÑ´Ù. <Directory> Áö½Ã¾î¿¡ Æ÷ÇÔµÈ Áö½Ã¾îµéÀº +ÁöÁ¤ÇÑ ÆÄÀϽýºÅÛ µð·ºÅ丮¿Í ±× ÇÏÀ§ µð·ºÅ丮¿¡ Àû¿ëµÈ´Ù. .htaccess ÆÄÀÏÀ» »ç¿ëÇصµ °á°ú´Â +°°´Ù. ´ÙÀ½ ¼³Á¤À» ¿¹·Î µé¸é, µð·ºÅ丮 ¸ñ·Ï(index)ÀÌ +/var/web/dir1 ÀÌÇÏ µð·ºÅ丮¿¡¼­ µð·ºÅ丮 ¸ñ·Ï(index)ÀÌ +°¡´ÉÇÏ´Ù.

    + +

    +<Directory /var/web/dir1>
    +Options +Indexes
    +</Directory> +

    + +

    <Files> ¼½¼Ç¿¡ Æ÷ÇÔµÈ Áö½Ã¾îµéÀº ¾î¶² +µð·ºÅ丮¿¡ ÀÖ´ÂÁö °ü°è¾øÀÌ ÁöÁ¤ÇÑ À̸§À» °¡Áø ÆÄÀÏ¿¡ Àû¿ëµÈ´Ù. +¼³Á¤ÆÄÀÏÀÇ ÁÖ¼³Á¤ºÎºÐ¿¡ ÀÖ´Â ´ÙÀ½ ¼³Á¤À» ¿¹·Î µé¸é, Àå¼Ò¿Í +°ü°è¾øÀÌ private.htmlÀ̶õ À̸§À» ÇÑ ÆÄÀÏÀÇ Á¢±ÙÀ» +°ÅºÎÇÑ´Ù.

    + +

    +<Files private.html>
    +Order allow,deny
    +Deny from all
    +</Files> +

    + +

    ÆÄÀϽýºÅÛÀÇ Æ¯Á¤ ºÎºÐ¿¡ ÀÖ´Â ÆÄÀÏÀ» ÁöĪÇϱâÀ§ÇØ <Files>¿Í <Directory> ¼½¼ÇÀ» °°ÀÌ +»ç¿ëÇÑ´Ù. ´ÙÀ½ ¼³Á¤À» ¿¹·Î µé¸é, +/var/web/dir1/private.html, +/var/web/dir1/subdir2/private.html, +/var/web/dir1/subdir3/private.html °°ÀÌ +/var/web/dir1/ µð·ºÅ丮 ¾Æ·¡¿¡ ÀÖ´Â À̸§ÀÌ +private.htmlÀÎ ÆÄÀÏÀÇ Á¢±ÙÀ» °ÅºÎÇÑ´Ù.

    + +

    +<Directory /var/web/dir1>
    +<Files private.html>
    +Order allow,deny
    +Deny from all
    +</Files>
    +</Directory> +

    + + +

    À¥°ø°£ ¼½¼Ç

    + +

    <Location> +Áö½Ã¾î¿Í ÀÌ¿¡ ÇØ´çÇÏ´Â Á¤±ÔÇ¥Çö½ÄÀ» »ç¿ëÇÏ´Â Áö½Ã¾î´Â ¹Ý´ë·Î +ƯÁ¤ À¥°ø°£ÀÇ ¼³Á¤À» ¹Ù²Û´Ù. ´ÙÀ½ ¼³Á¤À» ¿¹·Î µé¸é, /privateÀ¸·Î +½ÃÀÛÇÏ´Â URL-°æ·ÎÀÇ Á¢±ÙÀÌ °ÅºÎµÈ´Ù. ¿©±â¿¡´Â +http://yoursite.example.com/private, +http://yoursite.example.com/private123, +http://yoursite.example.com/private/dir/file.html +°°ÀÌ /private ¹®ÀÚ¿­·Î ½ÃÀÛÇÏ´Â ¿äûÀÌ ÇØ´çµÈ´Ù.

    + +

    +<Location /private>
    +Order Allow,Deny
    +Deny from all
    +</Location> +

    + +

    <Location> +Áö½Ã¾î´Â ÆÄÀϽýºÅÛ¿¡ ´ëÀÀÇÒ ÇÊ¿ä°¡ ¾ø´Ù. ´ÙÀ½ ¿¹´Â ¾î¶»°Ô ƯÁ¤ +URLÀ» mod_status°¡ Á¦°øÇÏ´Â ¾ÆÆÄÄ¡ ³»ºÎ Çڵ鷯·Î +´ëÀÀ½ÃÅ°´ÂÁö¸¦ º¸¿©ÁØ´Ù. ÆÄÀϽýºÅÛ¿¡ server-status¶ó´Â +ÆÄÀÏÀº ÇÊ¿ä¾ø´Ù.

    + +

    +<Location /server-status>
    +SetHandler server-status
    +</Location> +

    + + +

    ¿ÍÀϵåÄ«µå¿Í Á¤±ÔÇ¥Çö½Ä

    + +

    <Directory>, +<Files>, +<Location> +Áö½Ã¾î¿¡¼­ C Ç¥ÁØ ÆÄÀ̺귯¸®ÀÇ fnmatch¿Í °°Àº +½©¿¡¼­ »ç¿ëÇÏ´Â ¿ÍÀϵåÄ«µå ¹®ÀÚ¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. +"*" ¹®ÀÚ´Â ¾î¶² ¹®ÀÚ¿­ÀÌ¶óµµ ³ªÅ¸³»°í, "?" ¹®ÀÚ´Â ¾î¶² ¹®ÀÚ ÇÑ°³¸¦ +³ªÅ¸³»¸ç, "[seq]"´Â seq Áß¿¡ ÇÑ ¹®ÀÚ¸¦ ³ªÅ¸³½´Ù. +¾î¶² ¿ÍÀϵåÄ«µåµµ "/" ¹®ÀÚ¸¦ ³ªÅ¸³»Áö´Â ¸øÇÑ´Ù. ±×·¡¼­ ÀÌ ¹®ÀÚ´Â +Á÷Á¢ »ç¿ëÇØ¾ß ÇÑ´Ù.

    + +

    ´õ À¯¿¬ÇÑ ¼³Á¤ÀÌ ÇÊ¿äÇϸé perlȣȯ Á¤±ÔÇ¥Çö½ÄÀ» »ç¿ëÇÏ´Â <DirectoryMatch>, <FilesMatch>, <LocationMatch>¸¦ »ç¿ëÇÒ +¼ö ÀÖ´Ù. ±×·¯³ª ¾Æ·¡ ¼³Á¤ÀÇ °áÇÕ¿¡ °üÇÑ Àý¿¡¼­ Á¤±ÔÇ¥Çö½Ä ¼½¼ÇÀ» +»ç¿ëÇϸé Áö½Ã¾î°¡ Àû¿ëµÇ´Â ¹æ¹ýÀÌ ¾î¶»°Ô º¯ÇÏ´ÂÁö »ìÆìºÁ¶ó.

    + +

    ¸ðµç »ç¿ëÀÚ µð·ºÅ丮 ¼³Á¤À» º¯°æÇÏ´Â ºñÁ¤±ÔÇ¥Çö½Ä ¿ÍÀϵåÄ«µå +¼½¼ÇÀº ´ÙÀ½°ú °°´Ù:

    + +

    +<Directory /home/*/public_html>
    +Options Indexes
    +</Directory> +

    + +

    Á¤±ÔÇ¥Çö½Ä ¼½¼ÇÀ» »ç¿ëÇÏ¿© Çѹø¿¡ ¿©·¯ Á¾·ùÀÇ ±×¸²ÆÄÀÏ¿¡ +´ëÇÑ Á¢±ÙÀ» °ÅºÎÇÒ ¼ö ÀÖ´Ù:

    +

    +<FilesMatch \.(?i:gif|jpe?g|png)$>
    +Order allow,deny
    +Deny from all
    +</FilesMatch> +

    + + + +

    ¹«¾ùÀ» »ç¿ëÇϳª

    + +

    ÆÄÀϽýºÅÛ ¼½¼Ç°ú À¥°ø°£ ¼½¼Ç Áß Çϳª¸¦ ¼±ÅÃÇÏ´Â °ÍÀº ½ÇÁ¦·Î +¸Å¿ì ½±´Ù. ÆÄÀϽýºÅÛ¿¡ ÀÖ´Â °´Ã¼¿¡ Áö½Ã¾î¸¦ Àû¿ëÇÒ¶§´Â Ç×»ó +<Directory>³ª +<Files>¸¦ +»ç¿ëÇÑ´Ù. (µ¥ÀÌŸº£À̽º¿¡¼­ »ý¼ºÇÑ À¥ÆäÀÌÁö¿Í °°ÀÌ) ÆÄÀϽýºÅÛ¿¡ +ÀÖÁö ¾Ê´Â °´Ã¼¿¡ Áö½Ã¾î¸¦ Àû¿ëÇÒ¶§´Â <Location>À» »ç¿ëÇÑ´Ù.

    + +

    ÆÄÀϽýºÅÛ¿¡ ÀÖ´Â °´Ã¼ÀÇ Á¢±ÙÀ» Á¦ÇÑÇϱâÀ§ÇØ <Location>À» »ç¿ëÇϸé +Àý´ë ¾ÈµÈ´Ù. ¿©·¯ ´Ù¸¥ À¥°ø°£ Àå¼Ò(URL)°¡ °°Àº ÆÄÀϽýºÅÛ Àå¼Ò¿¡ +´ëÀÀµÉ ¼ö ÀÖÀ¸¹Ç·Î, °É¾îµÐ Á¦ÇÑÀ» ¿ìȸÇÒ ¼ö Àֱ⠶§¹®ÀÌ´Ù. ´ÙÀ½ +¼³Á¤ÀÇ ¿¹¸¦ »ìÆ캸ÀÚ:

    + +

    +<Location /dir/>
    +Order allow,deny
    +Deny from all
    +</Location> +

    + +

    ÀÌ ¼³Á¤Àº http://yoursite.example.com/dir/À» +¿äûÇÑ´Ù¸é Àß ÀÛµ¿ÇÑ´Ù. ±×·¯³ª ´ë¼Ò¹®ÀÚ¸¦ ±¸º°ÇÏÁö¾Ê´Â ÆÄÀϽýºÅÛÀ» +»ç¿ëÇÑ´Ù¸é ¾î¶»°ÔµÇ³ª? +http://yoursite.example.com/DIR/À» ¿äûÇÏ¿© ½±°Ô +Á¦ÇÑÀ» ¿ìȸÇÒ ¼ö ÀÖ´Ù. ¹Ý´ë·Î <Directory> Áö½Ã¾î´Â ¾î¶»°Ô ¿äûÇÏ¿´´ÂÁö +°ü°è¾øÀÌ ±× Àå¼Ò¿¡¼­ ¼­ºñ½ºµÇ´Â ³»¿ë¿¡ Àû¿ëµÈ´Ù. (¿¹¿Ü´Â ÆÄÀϽýºÅÛ +¸µÅ©¸¦ »ç¿ëÇÏ´Â °æ¿ì´Ù. ½Éº¼¸µÅ©¸¦ »ç¿ëÇÏ¿© ÇÑ µð·ºÅ丮¸¦ +ÆÄÀϽýºÅÛÀÇ ¿©·¯ Àå¼Ò¿¡ µÑ ¼ö ÀÖ´Ù. <Directory> Áö½Ã¾î´Â ½Éº¼¸µÅ©¸¦ µû¶ó°£´Ù. +±×·¯¹Ç·Î ³ôÀº ¼öÁØÀÇ º¸¾ÈÀ» À§Çؼ­´Â ÀûÀýÇÑ Options Áö½Ã¾î¸¦ »ç¿ëÇÏ¿© ½Éº¼¸µÅ©¸¦ +¹«½ÃÇØ¾ß ÇÑ´Ù.)

    + +

    ¾Æ¸¶µµ ´ç½ÅÀº ´ë¼Ò¹®ÀÚ¸¦ ±¸º°ÇÏ´Â ÆÄÀϽýºÅÛÀ» »ç¿ëÇϹǷΠ+ÀÌ·± ÀÏÀÌ ÀϾÁö ¾Ê´Â´Ù°í »ý°¢ÇÒÁöµµ ¸ð¸¥´Ù. ±×·¯³ª ´Ù¸¥ +¹æ¹ýÀ¸·Îµµ ¿©·¯ À¥°ø°£ À§Ä¡°¡ ÇÑ ÆÄÀϽýºÅÛ À§Ä¡¿¡ ´ëÀÀµÉ ¼ö +ÀÖÀ½À» ±â¾ïÇ϶ó. ±×·¡¼­ °¡´ÉÇϸé Ç×»ó ÆÄÀϽýºÅÛ ¼½¼ÇÀ» »ç¿ëÇØ¾ß +ÇÑ´Ù. ±×·¯³ª ÀÌ ±ÔÄ¢¿¡ ¿¹¿Ü°¡ Çϳª ÀÖ´Ù. ¼³Á¤ Á¦ÇÑÀ» +<Location /> ¼½¼Ç¿¡ µÎ¸é ÀÌ ¼½¼ÇÀÌ Æ¯Á¤ +URLÀÌ ¾Æ´Ñ ¸ðµç ¿äû¿¡ Àû¿ëµÇ¹Ç·Î ¿Ïº®ÇÏ°Ô ¾ÈÀüÇÏ´Ù.

    + + +
    top
    +
    +

    °¡»óÈ£½ºÆ®

    + +

    <VirtualHost> +¼½¼ÇÀº ƯÁ¤ È£½ºÆ®¿¡ Àû¿ëµÇ´Â Áö½Ã¾îµéÀ» Æ÷ÇÔÇÑ´Ù. ÀÌ´Â ÇÑ +ÄÄÇ»ÅÍ¿¡¼­ °¢°¢ ´Ù¸¥ ¼³Á¤À» »ç¿ëÇÑ ¿©·¯ È£½ºÆ®¸¦ ¼­ºñ½ºÇÒ¶§ +À¯¿ëÇÏ´Ù. ´õ ÀÚ¼¼ÇÑ Á¤º¸´Â °¡»óÈ£½ºÆ® ¹®¼­¸¦ +Âü°íÇ϶ó.

    +
    top
    +
    +

    ÇÁ·Ï½Ã

    + +

    <Proxy>¿Í +<ProxyMatch> +¼½¼ÇÀº ÁöÁ¤ÇÑ URL¿¡ ´ëÇØ mod_proxy ÇÁ·Ï½Ã ¼­¹ö¸¦ +°ÅÃÄ Á¢±ÙÇÏ´Â °æ¿ì¿¡¸¸ Àû¿ëµÈ´Ù. ´ÙÀ½ ¼³Á¤À» ¿¹·Î µé¸é, ÇÁ·Ï½Ã +¼­¹ö¸¦ ÅëÇØ cnn.com À¥»çÀÌÆ®¿¡ Á¢±ÙÇÒ ¼ö ¾ø´Ù.

    + +

    +<Proxy http://cnn.com/*>
    +Order allow,deny
    +Deny from all
    +</Proxy> +

    +
    top
    +
    +

    ¾È¿¡ ¾î¶² Áö½Ã¾î¸¦ »ç¿ëÇÒ ¼ö +ÀÖ³ª?

    + +

    ¾î¶² ¼³Á¤ ¼½¼Ç¾È¿¡ »ç¿ëÇÒ ¼ö ÀÖ´Â Áö½Ã¾î¸¦ ¾Ë·Á¸é Áö½Ã¾îÀÇ +»ç¿ëÀå¼Ò¸¦ È®ÀÎÇ϶ó. +<Directory>¿¡¼­ +»ç¿ë°¡´ÉÇÑ Áö½Ã¾î´Â <DirectoryMatch>, <Files>, <FilesMatch>, <Location>, <LocationMatch>, <Proxy>, <ProxyMatch> ¼½¼Ç¿¡¼­µµ »ç¿ë°¡´ÉÇÏ´Ù. +±×·¯³ª, ¿¹¿Ü°¡ ÀÖ´Ù.

    + +
      +
    • AllowOverride Áö½Ã¾î´Â +<Directory> +¼½¼Ç¿¡¼­¸¸ »ç¿ëÇÒ ¼ö ÀÖ´Ù.
    • + +
    • FollowSymLinks, SymLinksIfOwnerMatch, +Options´Â <Directory> ¼½¼ÇÀ̳ª +.htaccess ÆÄÀÏ¿¡¼­¸¸ »ç¿ëÇÒ ¼ö ÀÖ´Ù.
    • + +
    • Options Áö½Ã¾î´Â +<Files>°ú +<FilesMatch> +¼½¼Ç¿¡¼­ »ç¿ëÇÒ ¼ö ¾ø´Ù.
    • +
    +
    top
    +
    +

    ¼½¼ÇµéÀÌ °áÇÕÇÏ´Â ¹æ¹ý

    + +

    ¼³Á¤ ¼½¼ÇÀº ¸Å¿ì Ưº°ÇÑ ¹æ¹ýÀ¸·Î Àû¿ëµÈ´Ù. ÀÌ ¼ø¼­°¡ ¼³Á¤ +Áö½Ã¾î¸¦ Çؼ®ÇÏ´Â ¹æ¹ý¿¡ Áß¿äÇÑ ¿µÇâÀ» Áֱ⶧¹®¿¡ ÀÌ ¹æ¹ýÀ» +ÀÌÇØÇÏ´Â °ÍÀÌ Áß¿äÇÏ´Ù.

    + +

    °áÇÕÇÏ´Â ¼ø¼­´Â:

    + +
      +
    1. (Á¤±ÔÇ¥Çö½ÄÀ» »ç¿ëÇÏÁö¾Ê´Â) <Directory>¿Í .htaccess´Â + µ¿½Ã¿¡ ÀϾ´Ù (°æ¿ì¿¡ µû¶ó .htaccessÀÌ + <Directory>¸¦ + ¹«½ÃÇϵµ·Ï ¼³Á¤ÇÒ ¼ö ÀÖ´Ù)
    2. + +
    3. <DirectoryMatch> (±×¸®°í + <Directory ~>)
    4. + +
    5. <Files>¿Í <FilesMatch>´Â µ¿½Ã¿¡ ÀϾ´Ù
    6. + +
    7. <Location>°ú <LocationMatch>´Â µ¿½Ã¿¡ ÀϾ´Ù
    8. +
    + +

    <Directory>¸¦ Á¦¿ÜÇÏ°í °¢ ¼½¼ÇµéÀ» + ¼³Á¤ÆÄÀÏ¿¡ ³ª¿Â ¼ø¼­´ë·Î 󸮵ȴÙ. (À§ÀÇ ¼ø¼­ 1) <Directory>´Â µð·ºÅ丮 + ³»¿ëÀÌ °¡Àå ªÀº °Í¿¡¼­ ±äÂÊÀ¸·Î 󸮵ȴÙ. ±×·¡¼­ ¿¹¸¦ µé¾î, + <Directory /var/web/dir>À» + <Directory /var/web/dir/subdir> ÀÌÀü¿¡ + ó¸®ÇÑ´Ù. °°Àº µð·ºÅ丮¸¦ ÁöĪÇÏ´Â ¿©·¯ <Directory> ¼½¼ÇÀÌ + ÀÖ´Ù¸é À̵éÀ» ¼³Á¤ÆÄÀÏ ¼ø¼­´ë·Î ó¸®ÇÑ´Ù. Include Áö½Ã¾î·Î Æ÷ÇÔÇÑ ¼³Á¤Àº + Include Áö½Ã¾î À§Ä¡¿¡ + Æ÷ÇÔÇÑ ÆÄÀÏ ³»¿ëÀÌ ÀÖ´Â °Íó·³ ó¸®ÇÑ´Ù.

    + +

    <VirtualHost> ¼½¼Ç ¾È¿¡ Æ÷ÇÔµÈ ¼½¼ÇÀº + °¡»óÈ£½ºÆ® Á¤ÀÇ ¹Û¿¡ ÀÖ´Â ÇØ´ç ¼½¼Ç ÀÌÈÄ¿¡ Àû¿ëµÈ´Ù. + ±×·¡¼­ °¡»óÈ£½ºÆ® ¾È¿¡¼­ ÁÖ¼­¹öÀÇ ¼³Á¤»çÇ×À» ¼öÁ¤ÇÒ ¼ö ÀÖ´Ù.

    + +

    ´ÙÀ½¿¡ ³ª¿À´Â ¼½¼ÇÀº ÀÌÀü ¼½¼ÇÀÇ °á°ú¸¦ ¼öÁ¤ÇÑ´Ù.

    + +

    ±â¼úÀû ÁÖÀÇ

    + ½ÇÁ¦·Î + <Location>/<LocationMatch>´Â + (Aliases¿Í DocumentRoot¸¦ »ç¿ëÇÏ¿© + URLÀ» ÆÄÀϸíÀ¸·Î º¯È¯ÇÏ´Â) À̸§¹ø¿ª ´Ü°è ÀÌÀü¿¡ 󸮵ȴÙ. + º¯¿ªÀÌ ³¡³­ ÀÌÈÄ¿¡´Â ¿ÏÀüÈ÷ ¹«½ÃÇÑ´Ù. +
    + +

    ¿¹Á¦

    + +

    ´ÙÀ½Àº °ãÇÕÇÏ´Â ¼ø¼­¸¦ ¼³¸íÇÏ´Â ¿¹´Ù. ÀÌµé ¸ðµÎ ¿äû¿¡ +Àû¿ëµÈ´Ù°í °¡Á¤Çϸé Áö½Ã¾î´Â A > B > C > D > E +¼ø¼­·Î 󸮵ȴÙ.

    + +

    +<Location />
    +E
    +</Location>
    +
    +<Files f.html>
    +D
    +</Files>
    +
    +<VirtualHost *>
    +<Directory /a/b>
    +B
    +</Directory>
    +</VirtualHost>
    +
    +<DirectoryMatch "^.*b$">
    +C
    +</DirectoryMatch>
    +
    +<Directory /a/b>
    +A
    +</Directory>
    +
    +

    + +

    ´õ Çö½ÇÀûÀÎ ¿¹´Â ´ÙÀ½°ú °°´Ù. <Location> ¼½¼ÇÀ» ³ªÁß¿¡ ó¸®ÇϹǷΠ+<Directory> +¼½¼Ç¿¡ ÀÖ´Â Á¢±ÙÁ¦ÇÑ°ú °ü°è¾øÀÌ ¼­¹ö¿¡ ¹«Á¦ÇÑ Á¢±ÙÀ» °¡´ÉÇÏ´Ù. +Áï, °áÇÕÇÏ´Â ¼ø¼­´Â Áß¿äÇϹǷΠÁÖÀÇÇ϶ó!

    + +

    +<Location />
    +Order deny,allow
    +Allow from all
    +</Location>
    +
    +# ¾Ç! ÀÌ <Directory> ¼½¼ÇÀº ¾Æ¹«·± È¿°ú°¡ ¾ø´Ù
    +<Directory />
    +Order allow,deny
    +Allow from all
    +Deny from badguy.example.com
    +</Directory> +

    + + + +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/sections.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/sections.html.tr.utf8 new file mode 100644 index 00000000..c8dbec32 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/sections.html.tr.utf8 @@ -0,0 +1,472 @@ + + + +Yapılandırma Bölümleri - Apache HTTP Sunucusu + + + + + +
    <-
    +

    Yapılandırma Bölümleri

    +
    +

    Mevcut Diller:  en  | + es  | + ja  | + ko  | + tr 

    +
    +

    Yapılandırma dosyalarındaki +yönergeler sunucunun tamamına uygulanacağı gibi sadece belli dizinler, +dosyalar, konaklar veya URL’lere uygulanmakla sınırlanabilir. Bu belgede, +yapılandırma bölümü taşıyıcılarınının veya .htaccess dosyalarının, +yapılandırma dosyalarındaki diğer yönergelerin etki alanlarını değiştirtirmek +için nasıl kullanılacağı açıklanmıştır.

    +
    + +
    top
    +
    +

    Yapılandırma Bölümü Taşıyıcılarının Türleri

    + + + +

    İki temel taşıyıcı türü vardır. Taşıyıcıların çoğu her istek için +değerlendirmeye alınır. Taşıyıcılardaki yönergeler ise sadece bu taşıyıcılarla +eşleşen istekler için uygulanır. Diğer yandan, <IfDefine> ve <IfModule> taşıyıcıları sadece sunucu başlatılırken veya yeniden +başlatılırken değerlendirmeye alınır. Başlatma sırasında gerektirdikleri +koşullar sağlanıyorsa içerdikleri yönergeler tüm isteklere uygulanır. Aksi +takdirde, içerdikleri yönergeler yok sayılır.

    + +

    <IfDefine> yönergesi +sadece httpd komut satırında uygun parametreler +tanımlanmışsa uygulanabilecek yönergeleri içerir. Örneğin, aşağıdaki +yapılandırma ile tüm isteklerin diğer siteye yönlendirilebilmesi sadece +sunucu httpd -DClosedForNow komut satırı ile başlatıldığı +takdirde mümkün olur:

    + +

    +<IfDefine ClosedForNow>
    + + Redirect / http://otherserver.example.com/
    +
    +</IfDefine> +

    + +

    <IfModule> yönergesi +sadece belli bir modülün sunucuda kullanılabilir durumda olması halinde +uygulanabilecek yönergeleri içerir. Modülün ya sunucuyla birlikte durağan +olarak derlenmiş olması ya da devingen olarak derlenmiş ve yapılandırma +dosyasında yönergeden önce o modüle ilişkin bir LoadModule satırının bulunması gerekir. Bu yönergeyi sadece +belli bir modülün varlığının veya yokluğunun yapılandırma dosyanızın +çalışmasını etkilememesini istediğiniz durumlarda kullanmalısınız. +Eksik modüllerle ilgili hata iletilerini engellediğinden, taşıyıcı içine, +her zaman çalışması istenen yönergeler konulmamalıdır.

    + +

    Aşağıdaki örnekte, MimeMagicFiles yönergesi sadece mod_mime_magic +modülü mevcutsa uygulanacaktır.

    + +

    +<IfModule mod_mime_magic.c>
    + + MimeMagicFile conf/magic
    +
    +</IfModule> +

    + +

    <IfDefine> ve +<IfModule> yönergelerinin her +ikisi de önüne "!" konularak olumsuz koşullar için uygulanabilir. Ayrıca, bu +bölümler daha karmaşık sınırlamalar elde etmek amacıyla bir diğerinin içinde +kullanılabilirler.

    +
    top
    +
    +

    Dosya Sistemi ve Site Alanı

    + +

    En sık kullanılan yapılandırma bölümü taşıyıcıları dosya sistemindeki +veya site alanındaki belli yerlerin yapılandırmalarını değiştirmekte +kullanılanlardır. Öncelikle, bu ikisi arasındaki farkları bilmek önemlidir. +Dosya sistemi disklerinizin işletim sistemi tarafından size gösterilen halidir. +Örneğin, öntanımlı kurulumda Apache, Unix sistemlerinde +/usr/local/apache2 altındayken Windows sistemlerinde +"c:/Program Files/Apache Group/Apache2" altındadır. +(Bilgi: Windows için bile, Apache’de dosya yolu belirtilirken tersbölü değil +normal bölü karakterleri kullanılır.) Site alanı ise sunucu tarafından +istemciye sunulan dizin ağacıdır. Yani, site alanı içindeki /dir/ +dizini, Apache’nin Unix üzerinde dosya sistemine öntanımlı olarak kurulduğu +yer göz önüne alınarak, dosya sistemindeki +/usr/local/apache2/htdocs/dir/ dizinine karşılıktır. Site +sayfaları veritabanlarından veya başka yerlerden devingen olarak +üretilebildiğinden site alanlarının doğrudan dosya sistemine eşlenmesi gerekli +değildir.

    + +

    Dosya Sistemi Taşıyıcıları

    + +

    <Directory> +ve <Files> taşıyıcıları, +düzenli ifade karşılıkları ile beraber, yönergeleri dosya sisteminin +parçalarına uygularlar. Bir <Directory> bölümü içindeki yönergeler belli bir dosya sistemi +dizinine ve onun alt dizinlerine uygulanır. Aynı etki .htaccess dosyaları kullanılarak da +sağlanabilir. Örneğin aşağıdaki yapılandırmada, /var/web/dir1 +dizini ve alt dizinlerinde dizin içeriğinin listelenmesi etkin kılınmaktadır.

    + +

    +<Directory /var/web/dir1>
    + + Options +Indexes
    +
    +</Directory> +

    + +

    Bir <Files> bölümü içindeki +yönergeler, hangi dizinde bulunduğuna bakılmaksızın ismi belirtilen dosyalara +uygulanır. Örneğin, aşağıdaki yapılandırma yönergeleri yapılandırma dosyasının +ana bölümüne yerleştirildiği takdirde gizli.html isimli dosyalara +nerede bulunursa bulunsun erişime izin vermeyecektir.

    + +

    +<Files gizli.html>
    + +Order allow,deny
    +Deny from all
    +
    +</Files> +

    + +

    Dosya sisteminin belli bir yerindeki belli dosyalarla ilgili yaptırımlar +için <Files> ve +<Directory> bölümleri +birlikte kullanılabilir. Örneğin, aşağıdaki yapılandırma +/var/web/dir1/gizli.html, +/var/web/dir1/subdir2/gizli.html, +/var/web/dir1/subdir3/gizli.html ve +/var/web/dir1/ altında bulunabilecek diğer tüm +gizli.html dosyalarına erişimi yasaklar.

    + +

    +<Directory /var/web/dir1>
    + +<Files gizli.html>
    + +Order allow,deny
    +Deny from all
    +
    +</Files>
    +
    +</Directory> +

    + + +

    Site Alanı Taşıyıcıları

    + +

    <Location> yönergesi ve +yönergenin düzenli ifade karşılığı site alanındaki içerik için yapılandırmayı +değiştirir. Örneğin aşağıdaki yapılandırma, /gizli ile başlayan +URL yollarına erişimi engeller. Özellikle, +http://siteniz.mesela.dom/gizli, +http://siteniz.mesela.dom/gizli123 ve +http://siteniz.mesela.dom/gizli/dir/dosya.html istekleri yanında +/gizli ile başlayan diğer isteklere de uygulanır.

    + +

    +<Location /gizli>
    + +Order Allow,Deny
    +Deny from all
    +
    +</Location> +

    + +

    Dosya sistemi ile etkileşime girmeyen herşey için <Location> yönergesi gerekir. +Aşağıdaki örnekte, belli bir URL’nin mod_status modülü +tarafından sağlanan bir dahili Apache eylemcisine nasıl eşlenebileceği +gösterilmiştir. Bu örnek için dosya sisteminde server-status +adında bir dosya veya dizin bulunması gerekli değildir.

    + +

    +<Location /server-status>
    + +SetHandler server-status
    +
    +</Location> +

    + + +

    Dosya Adı Şablonları ve Düzenli İfadeler

    + +

    <Directory>, +<Files> ve +<Location> yönergelerinde, +Standart C kütüphanesindeki fnmatch işlevindeki gibi kabuk tarzı +dosya ismi kalıpları kullanılabilir. "*" karakteri herhangi bir karakter dizisi +ile eşleşirken "?" karakteri tek tek karakterlerle ve "[seq]" kalıbı +ise seq içindeki her karakterle eşleşir. "/" karakteri her hangi bir +kalıp karakteri ile eşleşmez; açıkça belirtilmesi gerekir.

    + +

    Daha esnek bir eşleşmenin gerekli olduğu durumlar için her taşıyıcının bir +düzenli ifade karşılığı vardır. <DirectoryMatch>, <FilesMatch> ve <LocationMatch> yönergelerinde gerekli eşleşmeleri seçmek için perl +uyumlu düzenli ifadelerin kullanımına izin +verilir. Ayrıca, yönergelerin uygulanışının düzenli ifade bölümleri +kullanılarak nasıl değiştirileceğini öğrenmek için, aşağıda, yapılandırmanın +katıştırılmasıyla ilgili bölüme de bakınız.

    + +

    Tüm kullanıcı dizinlerine ilişkin yapılandırmayı değiştirmek için dosya ismi +kalıpları şöyle kullanılabilirdi:

    + +

    +<Directory /home/*/public_html>
    + +Options Indexes
    +
    +</Directory> +

    + +

    Düzenli ifade bölümleri kullanarak çeşitli türlerdeki resim dosyalarına +erişimi bir defada yasaklayabiliriz:

    +

    +<FilesMatch \.(?i:gif|jpe?g|png)$>
    + +Order allow,deny
    +Deny from all
    +
    +</FilesMatch> +

    + + + +

    Ne, Ne Zaman Kullanılır?

    + +

    Dosya sistemi taşıyıcıları ile site alanı taşıyıcıları arasında seçim +yapmak aslında oldukça kolaydır. Dosya sisteminde bulunan nesnelere +uygulanacak yönergeler için daima <Directory> veya <Files> kullanılır. Dosya sisteminde bulunmayan +nesnelere (bir sayfanın bir veritabanı tarafından üretilmesi gibi) +uygulanacak yönergeler için ise <Location> kullanılır.

    + +

    Dosya sistemindeki nesnelere erişimi kısıtlarken asla <Location> kullanmamak önemlidir. +Bunun sebebi farklı site alanı konumlarının (URL’ler) aynı dosya sistemi +konumuna eşlenebilmesi dolayısıyla kısıtlamalarınızın etrafından +dolaşılabilmesine izin vermesidir. Örneğin, aşağıdaki yapılandırmayı +ele alalım:

    + +

    +<Location /dir/>
    + +Order allow,deny
    +Deny from all
    +
    +</Location> +

    + +

    http://siteniz.mesela.dom/dir/ için bir istek yapılmışsa +bu doğru çalışacaktır. Fakat dosya sistemi harf büyüklüğüne duyarsızsa +ne olacak? Kısıtlamanız, istek http://siteniz.mesela.dom/DIR/ +şeklinde yapılarak kolayca geçersiz kılınabilir. Halbuki <Directory> yönergesi isteğin nasıl +yapıldığına bakılmaksızın bu konumdan sunulan her türlü içeriğe uygulanacaktı. +(Dosya sistemi bağlarıyla bu da aşılabilir. Sembolik bağlar kullanılarak aynı +dizin dosya sisteminin bir çok yerine yerleştirilebilir. <Directory> yönergesi dosya yolunu +sıfırlamaksızın sembolik bağları izleyecektir. Bu bakımdan, en yüksek seviyede +güvenlik için uygun Options yönergesi ile +sembolik bağların izlenmesi devredışı bırakılabilir.)

    + +

    Belki de siz sırf harf büyüklüğüne duyarlı bir dosya sistemi +kullanıyorsunuz diye böyle uygulamalara ihtiyacınız olmadığını düşünüyor +olabilirsiniz, fakat aynı site alanını çok sayıda dosya sistemi konumuna +eşleyecek daha bir sürü yol bulunduğunu unutmayınız. Bu bakımdan dosya +sisteminde yapacağınız kısıtlamalarda daima dosya sistemi taşıyıcılarını +kullanmalısınız. Bununla birlikte bu kuralın da bir istisnası vardır. +Yapılandırma kısıtlamalarının bir <Location/> bölümü +içine koyulması, bu bölüme konan yönergelerin etki alanının belli bir URL +ile sınırlı olmaması nedeniyle mükemmelen güvenlidir.

    + + +
    top
    +
    +

    Sanal Konaklar

    + +

    <VirtualHost> +taşıyıcısının içinde belli bir konağa uygulanan yönergeler bulunur. +Aynı makinede çok sayıda konağı farklı yapılandırmalarla sunuyorsanız +bu taşıyıcı çok işinize yarar. Daha fazla bilgi için Sanal Konak Belgeleri bölümüne bakınız.

    +
    top
    +
    +

    Vekil

    + +

    <Proxy> +ve <ProxyMatch> +taşıyıcıları, sadece belli bir URL ile eşleşen mod_proxy +vekil sunucusu üzerinden erişilen sitelere uygulanan yapılandırma +yönergelerini bulundururlar. Örneğin aşağıdaki yapılandırma +cnn.com sitesine erişim için vekil sunucunun kullanılmasını +engelleyecektir.

    + +

    +<Proxy http://cnn.com/*>
    + +Order allow,deny
    +Deny from all
    +
    +</Proxy> +

    +
    top
    +
    +

    Hangi Yönergelere İzin Veriliyor?

    + +

    Hangi yönergelere hangi yapılandırma bölümlerinde izin verildiğini öğrenmek +için yönerge bağlamına bakınız. +<Directory> bölümlerinde +izin verilen herşeye sözdizimsel olarak ayrıca +<DirectoryMatch>, +<Files>, +<FilesMatch>, +<Location>, +<LocationMatch>, +<Proxy> +ve <ProxyMatch> +bölümlerinde de izin verilir. Yine de bazı istisnai durumlar mevcuttur:

    + +
      +
    • AllowOverride yönergesi sadece +<Directory> bölümlerinde çalışır.
    • + +
    • Options yönergesinin +FollowSymLinks ve SymLinksIfOwnerMatch seçenekleri +sadece <Directory> +bölümlerinde veya .htaccess dosyalarında çalışır.
    • + +
    • Options yönergesi +<Files> ve +<FilesMatch> +bölümlerinde kullanılamaz.
    • +
    +
    top
    +
    +

    Bölümler Nasıl Katıştırılır?

    + +

    Yapılandırma bölümleri belli bir sıra ile uygulanır. Yapılandırma +yönergelerinin yorumlanışı üzerinde önemli etkilere sahip olabilmesi +nedeniyle neyin ne zaman çalıştığını anlamak çok önemlidir.

    + +

    Yapılandırma bölümlerinin katıştırılma sırası şöyledir:

    + +
      +
    1. <Directory> (düzenli ifadeler hariç) + ve .htaccess aynı anda işleme sokulur + (.htaccess ile eğer izin verilmişse <Directory> içindeki bazı + yönergeler geçersiz kılınabileceği için).
    2. + +
    3. <DirectoryMatch> + (ve <Directory ~>).
    4. + +
    5. <Files> ve <FilesMatch> aynı anda işleme sokulur.
    6. + +
    7. <Location> + ve <LocationMatch> + aynı anda işleme sokulur.
    8. +
    + +

    <Directory> + bölümündekiler hariç, her grup, yapılandırma dosyasında bulundukları + sıraya göre işleme sokulurlar. Yukarıda 1. grup olan <Directory> bölümü en kısa dizin + elemanından en uzun dizin elemanına doğru işleme sokulur. Yani, örneğin, + <Directory /var/web/dir> bölümü <Directory + /var/web/dir/subdir> bölümünden önce işleme sokulacaktır. + Eğer aynı uzunlukta çok sayıda dizin varsa <Directory> bölümleri yapılandırma dosyasında + bulundukları sıraya göre işleme sokulurlar. Include yönergeleri ile yapılandırmaya dahil + edilen dosyaların içerikleri Include + yönergesinin bulunduğu yere konulduktan sonra işleme sokulurlar.

    + +

    <VirtualHost> + bölümlerinin içindeki bölümler, sanal konak tanımı dışındaki + karşılıklarından sonra uygulanırlar.

    + +

    Sonraki bölümler öncekileri geçersiz kılmak üzere işleme alınırlar.

    + +

    Bazı Teknik Bilgiler

    + Aslında, isim dönüşüm aşamasından (Aliases ve + DocumentRoots, URL’leri dosya isimlerine eşlemek için + kullanılırken) hemen önce uygulanan bir + <Location>/<LocationMatch> + dizisi vardır. Bu dizinin sonuçları isim dönüşüm aşaması tamamlandıktan + sonra tamamen elden çıkarılır. +
    + +

    Bazı Örnekler

    + +

    Aşağıdaki yapay örnekte katıştırma sırası gösterilmiştir. Hepsinin aynı +isteğe uygulandığı varsayımıyla, bu örnekteki yönergeler A > B > C > D > +E sırasıyla uygulanacaktır.

    + +

    +<Location />
    +E
    +</Location>
    +
    +<Files f.html>
    +D
    +</Files>
    +
    +<VirtualHost *>
    +<Directory /a/b>
    +B
    +</Directory>
    +</VirtualHost>
    +
    +<DirectoryMatch "^.*b$">
    +C
    +</DirectoryMatch>
    +
    +<Directory /a/b>
    +A
    +</Directory>
    +
    +

    + +

    Daha somut bir örnek olarak aşağıdakini ele alalım. <Directory> bölümlerindeki erişim sınırlamaları ne +olursa olsun <Location> +bölümü son olarak değerlendirmeye alınacak ve sunucuya sınırsız erişim verecektir. +Başka bir deyişle, katıştırma sırası önemlidir, bu nedenle dikkatli olmalısınız!

    + +

    +<Location />
    + + Order deny,allow
    + Allow from all
    +
    +</Location>
    +
    +# Alooo! Bu <Directory> bölümünün hiçbir hükmü yok.
    +<Directory />
    + + Order allow,deny
    + Allow from all
    + Deny from kkadam.mesela.dom
    +
    +</Directory> +

    + + + +
    +
    +

    Mevcut Diller:  en  | + es  | + ja  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/server-wide.html b/rubbos/app/httpd-2.0.64/docs/manual/server-wide.html new file mode 100644 index 00000000..e1728d78 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/server-wide.html @@ -0,0 +1,21 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: server-wide.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: server-wide.html.es +Content-Language: es +Content-type: text/html; charset=ISO-8859-1 + +URI: server-wide.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: server-wide.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: server-wide.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/server-wide.html.en b/rubbos/app/httpd-2.0.64/docs/manual/server-wide.html.en new file mode 100644 index 00000000..8013f744 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/server-wide.html.en @@ -0,0 +1,103 @@ + + + +Server-Wide Configuration - Apache HTTP Server + + + + + +
    <-
    +

    Server-Wide Configuration

    +
    +

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

    +
    + +

    This document explains some of the directives provided by +the core server which are used to configure +the basic operations of the server.

    +
    + +
    top
    +
    +

    Server Identification

    + + + + +

    The ServerAdmin and + ServerTokens directives + control what information about the server will be presented + in server-generated documents such as error messages. The + ServerTokens directive + sets the value of the Server HTTP response header field.

    + +

    The ServerName and + UseCanonicalName + directives are used by the server to determine how to construct + self-referential URLs. For example, when a client requests a + directory, but does not include the trailing slash in the + directory name, Apache must redirect the client to the full + name including the trailing slash so that the client will + correctly resolve relative references in the document.

    +
    top
    +
    +

    File Locations

    + + + + +

    These directives control the locations of the various files + that Apache needs for proper operation. When the pathname used + does not begin with a slash (/), the files are located relative + to the ServerRoot. Be careful + about locating files in paths which are writable by non-root users. + See the security tips + documentation for more details.

    +
    top
    +
    +

    Limiting Resource Usage

    + + + + +

    The LimitRequest* + directives are used to place limits on the amount of resources + Apache will use in reading requests from clients. By limiting + these values, some kinds of denial of service attacks can be + mitigated.

    + +

    The RLimit* directives + are used to limit the amount of resources which can be used by + processes forked off from the Apache children. In particular, + this will control resources used by CGI scripts and SSI exec + commands.

    + +

    The ThreadStackSize directive + is used only on Netware to control the stack size.

    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/server-wide.html.es b/rubbos/app/httpd-2.0.64/docs/manual/server-wide.html.es new file mode 100644 index 00000000..1e737ba5 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/server-wide.html.es @@ -0,0 +1,107 @@ + + + +Configuración global del servidor - Servidor HTTP Apache + + + + + +
    <-
    +

    Configuración global del servidor

    +
    +

    Idiomas disponibles:  en  | + es  | + ja  | + ko  | + tr 

    +
    + +

    Este documento explica algunas directivas del core +(núcleo) de Apache que se usan para configurar las operaciones +básicas del servidor.

    +
    + +
    top
    +
    +

    Identificación del Servidor

    + + + + +

    Las directivas ServerAdmin + y ServerTokens controlan + qué información relativa al servidor que se está + ejecutando será incluida en los documentos generados por el + servidor, por ejemplo en los mensajes de error. La directiva + ServerTokens especifica el + valor del campo cabecera de las respuestas HTTP del servidor.

    + +

    Las directivas ServerName + y UseCanonicalName las usa el + servidor para determinar cómo construir URLs + autorreferenciadas. Por ejemplo, cuando un cliente hace una + petición a un directorio, pero no incluye una barra final + después del nombre del directorio, Apache debe redirigir al + cliente a la ubicación que corresponda con el nombre completo + del directorio incluyendo la barra que debería haber puesto + al final. De esta manera el cliente puede resolver correctamente + las referencias relativas en el documento.

    +
    top
    +
    +

    Ubicación de ficheros

    + + + + +

    Estas directivas controlan las ubicaciones de varios ficheros + que Apache necesita para funcionar correctamente. Cuando se + especifica una ruta que no empieza por una barra (/), se asume que + la ruta usada es relativa al directorio especificado en ServerRoot. Tenga cuidado con poner + ficheros en rutas en las que tengan permisos de escritura usuarios + que no sean root. Consulte la documentación sobre consejos de + seguridad para obtener más información.

    +
    top
    +
    +

    Límite en el uso de recursos

    + + + + +

    Las directivas LimitRequest* se usan + para poner límites en la cantidad de recursos que Apache + utilizará leyendo peticiones de clientes. Limitando esos + valores, se pueden evitar algunos tipos de ataque de + denegación de servicio.

    + +

    Las directivas RLimit* se usan para + limitar la cantidad de recursos que pueden utilizarse por procesos + nacidos de la clonación de procesos hijo de Apache. En + particular, esto controlará los recursos usados por los + script CGI y por los comandos de ejecución SSI.

    + +

    La directiva ThreadStackSize se usa solamente + en Netware para controlar el tamaño de la pila de + ejecución.

    +
    +
    +

    Idiomas disponibles:  en  | + es  | + ja  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/server-wide.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/server-wide.html.ja.utf8 new file mode 100644 index 00000000..b9de1209 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/server-wide.html.ja.utf8 @@ -0,0 +1,103 @@ + + + +サーバ全体の設定 - Apache HTTP サーバ + + + + + +
    <-
    +

    サーバ全体の設定

    +
    +

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

    +
    + +

    このドキュメントではcore +サーバのディレクティブの中で、 +基本動作を設定するためのものを説明します。

    +
    + +
    top
    +
    +

    サーバ ID

    + + + + +

    ServerAdmin ディレクティブと + ServerTokens + ディレクティブは、エラーメッセージなどのサーバが作るドキュメントに、 + どのようなサーバの情報を表示するかを制御します。 + ServerTokens ディレクティブは、Server HTTP + レスポンスヘッダフィールドの値を設定します。

    + +

    ServerName ディレクティブと + UseCanonicalName + ディレクティブは、サーバが自分自身を参照する URL + を作るときに使われます。 + たとえば、クライアントがディレクトリを要求して、 + そのディレクトリ名の最後にスラッシュが付いていないような場合には、 + ドキュメントの相対的な参照を正しく解決できるようにするために、 + Apache は最後のスラッシュを含んだ完全なパスにクライアントを + リダイレクトさせる必要があります。

    +
    top
    +
    +

    ファイルの位置

    + + + + +

    これらのディレクティブは Apache + が適切な動作をするために必要な各種ファイルの位置を制御します。 + パスがスラッシュ (/) で始まっていないときは、ファイルは + ServerRoot からの相対パスとして + 探されます。root + 以外のユーザが書き込み可能なパスにファイルを置く場合は注意が必要です。 + 詳細は「セキュリティ情報」 + を参照してください。

    +
    top
    +
    +

    リソースの制限

    + + + + +

    LimitRequest* ディレクティブは Apache + がクライアントからのリクエスト読み込みで使う + リソースを制限するために使われます。これらの値を制限することで、 + いくつかのサービス拒否攻撃は影響を和らげることができます。

    + +

    RLimit* ディレクティブは、Apache の子プロセスから + fork されたプロセスが使用するリソースを制限するために使われます。 + 特に、これは CGI スクリプトと SSI exec + コマンドで使われるリソースを制御します。

    + +

    ThreadStackSize は Netware + でのみ、スタックの大きさを制御するために使われます。

    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/server-wide.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/server-wide.html.ko.euc-kr new file mode 100644 index 00000000..8086fea9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/server-wide.html.ko.euc-kr @@ -0,0 +1,97 @@ + + + +¼­¹ö Àü¿ª ¼³Á¤ - Apache HTTP Server + + + + + +
    <-
    +

    ¼­¹ö Àü¿ª ¼³Á¤

    +
    +

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

    +
    + +

    ÀÌ ¹®¼­´Â core ¼­¹ö°¡ ¼­¹öÀÇ ±âº» ÇൿÀ» +¼³Á¤ÇϱâÀ§ÇØ Á¦°øÇÏ´Â Áö½Ã¾îÁß ÀϺθ¦ ¼³¸íÇÑ´Ù.

    +
    + +
    top
    +
    +

    ¼­¹ö ½Äº°

    + + + + +

    ServerAdmin°ú + ServerTokens Áö½Ã¾î´Â + ¿À·ù¹® µî ¼­¹ö°¡ »ý¼ºÇÏ´Â ¹®¼­¿¡ ³ª¿Ã ¼­¹ö¿¡ ´ëÇÑ Á¤º¸¸¦ + ¼³Á¤ÇÑ´Ù. ServerTokens + Áö½Ã¾î´Â ¼­¹ö HTTP ÀÀ´ä Çì´õ¸¦ ¼³Á¤ÇÑ´Ù.

    + +

    ¼­¹ö´Â ServerName°ú + UseCanonicalName + Áö½Ã¾î¸¦ »ç¿ëÇÏ¿© ÀÚ±âÂüÁ¶ URLÀ» ¸¸µç´Ù. ¿¹¸¦ µé¾î, + Ŭ¶óÀ̾ðÆ®°¡ µð·ºÅ丮¸¦ ¿äûÇßÁö¸¸ µð·ºÅ丮¸í µÚ¿¡ ½½·¡½¬¸¦ + ºÙÀÌÁö¾ÊÀº °æ¿ì ¾ÆÆÄÄ¡´Â µÚ¿¡ ½½·¡½¬¸¦ ºÙÀÎ Àüü À̸§À» + Ŭ¶óÀ̾ðÆ®¿¡°Ô ¸®´ÙÀÌ·ºÆ®ÇÏ¿©, Ŭ¶óÀ̾ðÆ®°¡ ¹®¼­ÀÇ »ó´ëÂüÁ¶¸¦ + ¿Ã¹Ù·Î ã°Ô ÇÑ´Ù.

    +
    top
    +
    +

    ÆÄÀÏ À§Ä¡

    + + + + +

    ÀÌ Áö½Ã¾îµéÀº ¾ÆÆÄÄ¡°¡ Á¤»óÀûÀ¸·Î µ¿ÀÛÇϱâÀ§ÇØ ÇÊ¿äÇÑ + ¿©·¯ ÆÄÀϵéÀÇ À§Ä¡¸¦ ¼³Á¤ÇÑ´Ù. °æ·Î¸íÀÌ ½½·¡½¬(/)·Î ½ÃÀÛÇÏÁö + ¾ÊÀ¸¸é, ServerRoot¿¡ + »ó´ëÀûÀÎ ÆÄÀÏÀ» ã´Â´Ù. root°¡ ¾Æ´Ñ »ç¿ëÀÚ¿¡°Ô ¾²±â±ÇÇÑÀÌ + ÀÖ´Â °æ·Î¿¡ ÆÄÀÏÀ» µÎÁö¾Êµµ·Ï Á¶½ÉÇضó. ´õ ÀÚ¼¼ÇÑ Á¤º¸´Â + º¸¾È ÆÁ + ¹®¼­¸¦ Âü°íÇ϶ó.

    +
    top
    +
    +

    ÀÚ¿ø»ç¿ë Á¦ÇÑ

    + + + + +

    LimitRequest* Áö½Ã¾î´Â ¾ÆÆÄÄ¡°¡ + Ŭ¶óÀ̾ðÆ®ÀÇ ¿äûÀ» ÀÐÀ» ¶§ »ç¿ëÇÒ ÀÚ¿ø·®À» Á¦ÇÑÇÑ´Ù. ÀÌ·± + °ªµéÀ» Á¦ÇÑÇÏ¿© ¼­ºñ½º°ÅºÎ(denial of service)·ù °ø°ÝÀ» + ÁÙÀÏ ¼ö ÀÖ´Ù.

    + +

    RLimit* Áö½Ã¾î´Â ¾ÆÆÄÄ¡ ÀÚ½ÄÀÌ + »ý¼ºÇÏ´Â ÇÁ·Î¼¼½º°¡ »ç¿ëÇÒ ÀÚ¿ø·®À» Á¦ÇÑÇÑ´Ù. ƯÈ÷ CGI + ½ºÅ©¸³Æ®³ª SSI exec ¸í·É¾î°¡ »ç¿ëÇÒ ÀÚ¿øÀ» Á¦ÇÑÇÑ´Ù.

    + +

    ThreadStackSize + Áö½Ã¾î´Â ½ºÅà ũ±â¸¦ Á¶ÀýÇϱâÀ§ÇØ Netware¿¡¼­¸¸ »ç¿ëÇÑ´Ù.

    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/server-wide.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/server-wide.html.tr.utf8 new file mode 100644 index 00000000..aae279ff --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/server-wide.html.tr.utf8 @@ -0,0 +1,100 @@ + + + +Sunucu Genelinde Yapılandırma - Apache HTTP Sunucusu + + + + + +
    <-
    +

    Sunucu Genelinde Yapılandırma

    +
    +

    Mevcut Diller:  en  | + es  | + ja  | + ko  | + tr 

    +
    + +

    Bu belgede core modülü ile sağlanan ve sunucunun temel +işlemlerini yapılandırmakta kullanılan yönergelerden bazıları açıklanmıştır.

    +
    + +
    top
    +
    +

    Sunucu Kimliği

    + + + + +

    ServerAdmin ve ServerTokens yönergeleri, hata iletileri gibi + sunucu tarafından üretilen belgelerde sunucu ile ilgili hangi bilgilerin + sunulacağını belirlerler. ServerTokens yönergesi sunucunun HTTP yanıt başlığı + alanının değerini belirler.

    + +

    ServerName ve + UseCanonicalName + yönergeleri, sunucu tarafından, özüne yönelik URL’leri nasıl + oluşturacağını saptamak için kullanılır. Örneğin bir istemci bir dizin + isteğinde bulunurken URL’nin sonuna bölü çizgisi eklemese bile + Apache’nin istemciyi bölü çizgisi ile bitirilmiş URL yoluna + yönlendirmesi gerekir; böylece istemci belge içindeki göreli + bağlantıları doğru şekilde çözümleyebilir.

    +
    top
    +
    +

    Dosyaların Yerleri

    + + + + +

    Bu yönergeler Apache’nin doğru işlem yapması için gereksinim duyduğu + çeşitli dosyaların yerlerini belirlerler. Bölü çizgisi (/) ile + başlamayan dosya yolları kullanıldığında bu dosyaların yerlerinin + ServerRoot yönergesinde belirtilen + dizine göre belirtildiği varsayılır; root olmayan kullanıcılar + tarafından yazılabilen dosya yollarına dosya yerleştirmemeye dikkat + ediniz. Bu konuda daha ayrıntılı bilgi edinmek için güvenlik ipuçları + belgesine bakınız.

    +
    top
    +
    +

    Özkaynak Kullanımının Sınırlanması

    + + + + +

    LimitRequest* yönergeleri, Apache’nin istemcilerden gelen + istekleri okumak için kullanacağı özkaynakların miktarları ile ilgili + sınırlamalar koymak için kullanılırlar. Bu değerleri sınırlamak + suretiyle bazı hizmet reddi saldırılarının etkileri azaltılabilir.

    + +

    RLimit* yönergeleri ise Apache’nin çocuk süreçleri + tarafından çatallanabilen özkaynakların miktarlarını sınırlamakta + kullanılırlar. Özellikle de CGI betikleri ve SSI çalıştırma komutları + tarafından kullanılan özkaynakları denetlemekte kullanılırlar.

    + +

    ThreadStackSize yönergesi + bazı platformlarda yığıt boyutunu denetim altında tutmak için + kullanılır.

    +
    +
    +

    Mevcut Diller:  en  | + es  | + ja  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/sitemap.html b/rubbos/app/httpd-2.0.64/docs/manual/sitemap.html new file mode 100644 index 00000000..33ee329a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/sitemap.html @@ -0,0 +1,25 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: sitemap.html.de +Content-Language: de +Content-type: text/html; charset=ISO-8859-1 + +URI: sitemap.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: sitemap.html.es +Content-Language: es +Content-type: text/html; charset=ISO-8859-1 + +URI: sitemap.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: sitemap.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: sitemap.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/sitemap.html.de b/rubbos/app/httpd-2.0.64/docs/manual/sitemap.html.de new file mode 100644 index 00000000..0d7afb7d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/sitemap.html.de @@ -0,0 +1,256 @@ + + + +Seitenindex - Apache HTTP Server + + + + + + +
    <-
    + +

    Seitenindex

    +
    +

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

    +
    + +

    Diese Seite verzeichnet die zur Zeit verfügbaren Dokumente der +Dokumentation zum Apache HTTP Server Version +2.0.

    +
    + +
    top
    +
    top
    +
    top
    +
    top
    +
    top
    +
    top
    +
    top
    +
    top
    +
    top
    +
    top
    +

    Apache-Module

    + +
    top
    +
    top
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/sitemap.html.en b/rubbos/app/httpd-2.0.64/docs/manual/sitemap.html.en new file mode 100644 index 00000000..b5344073 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/sitemap.html.en @@ -0,0 +1,254 @@ + + + +Sitemap - Apache HTTP Server + + + + + + +
    <-
    + +

    Sitemap

    +
    +

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

    +
    + +

    This page lists the currently available documents of the +Apache HTTP Server Version 2.0 +Documentation.

    +
    + +
    top
    +
    top
    +
    top
    +
    top
    +
    top
    +
    top
    +
    top
    +
    top
    +
    top
    +
    top
    +

    Apache modules

    + +
    top
    +
    top
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/sitemap.html.es b/rubbos/app/httpd-2.0.64/docs/manual/sitemap.html.es new file mode 100644 index 00000000..adef69c9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/sitemap.html.es @@ -0,0 +1,262 @@ + + + +Mapa de este sitio web - Servidor HTTP Apache + + + + + + +
    <-
    + +

    Mapa de este sitio web

    +
    +

    Idiomas disponibles:  de  | + en  | + es  | + 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.
    + +

    Esta página contiene la lista con los documentos actualmente +disponibles de la Versión 2.0 de la +Documentación del Servidor HTTP Apache.

    +
    + +
    top
    +
    top
    +
    top
    +
    top
    +
    top
    +
    top
    +
    top
    +
    top
    +
    top
    +
    top
    +

    Módulos de Apache

    + +
    top
    +
    top
    +
    +
    +

    Idiomas disponibles:  de  | + en  | + es  | + ja  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/sitemap.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/sitemap.html.ja.utf8 new file mode 100644 index 00000000..5513d2f8 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/sitemap.html.ja.utf8 @@ -0,0 +1,256 @@ + + + +Site Map - Apache HTTP サーバ + + + + + + +
    <-
    + +

    Site Map

    +
    +

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

    +
    +
    This translation may be out of date. Check the + English version for recent changes.
    + +

    このページは現時点で利用可能な +Apache HTTP サーババージョン 2.0 のドキュメンテーション +の一覧です。

    +
    + +
    top
    +
    top
    +
    top
    +
    top
    +
    top
    +
    top
    +
    top
    +
    top
    +
    top
    +
    top
    +

    Apache モジュール

    + +
    top
    +
    top
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/sitemap.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/sitemap.html.ko.euc-kr new file mode 100644 index 00000000..68d9d44a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/sitemap.html.ko.euc-kr @@ -0,0 +1,261 @@ + + + +»çÀÌÆ®¸Ê - Apache HTTP Server + + + + + + +
    <-
    + +

    »çÀÌÆ®¸Ê

    +
    +

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

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

    ÀÌ ÆäÀÌÁö´Â ÇöÀç +Apache HTTP Server Version 2.0 ¹®¼­ ¸ñ·ÏÀ» +º¸¿©ÁØ´Ù.

    +
    + +
    top
    +
    top
    +
    top
    +
    top
    +
    top
    +
    top
    +
    top
    +
    top
    +
    top
    +
    top
    +

    ¾ÆÆÄÄ¡ ¸ðµâ

    + +
    top
    +
    top
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/sitemap.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/sitemap.html.tr.utf8 new file mode 100644 index 00000000..0dee65b7 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/sitemap.html.tr.utf8 @@ -0,0 +1,251 @@ + + + +Site Haritası - Apache HTTP Sunucusu + + + + + + +
    <-
    + +

    Site Haritası

    +
    +

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

    +
    + +

    Bu sayfada Apache HTTP Sunucusu Sürüm 2.0 +Belgelerinin tamamı listelenmiştir.

    +
    + +
    top
    +
    top
    +
    top
    +
    top
    +
    top
    +
    top
    +
    top
    +
    top
    +
    top
    +
    top
    +

    Apache Modülleri

    + +
    top
    +
    top
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/ssl/index.html b/rubbos/app/httpd-2.0.64/docs/manual/ssl/index.html new file mode 100644 index 00000000..d6ccf929 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/ssl/index.html @@ -0,0 +1,13 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: index.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: index.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: index.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/ssl/index.html.en b/rubbos/app/httpd-2.0.64/docs/manual/ssl/index.html.en new file mode 100644 index 00000000..1577c57d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/ssl/index.html.en @@ -0,0 +1,59 @@ + + + +Apache SSL/TLS Encryption - Apache HTTP Server + + + + + +
    <-
    +

    Apache SSL/TLS Encryption

    +
    +

    Available Languages:  en  | + ja  | + tr 

    +
    + +

    The Apache HTTP Server module mod_ssl +provides an interface to the OpenSSL library, which provides +Strong Encryption using the Secure Sockets Layer and Transport Layer +Security protocols. The module and this documentation are based on +Ralf S. Engelschall's mod_ssl project.

    +
    + +
    top
    +
    top
    +
    +

    mod_ssl

    +

    Extensive documentation on the directives and environment variables +provided by this module is provided in the mod_ssl reference documentation. +

    +
    +
    +

    Available Languages:  en  | + ja  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/ssl/index.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/ssl/index.html.ja.utf8 new file mode 100644 index 00000000..f8d893b8 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/ssl/index.html.ja.utf8 @@ -0,0 +1,61 @@ + + + +Apache の SSL/TLS 暗号化 - Apache HTTP サーバ + + + + + +
    <-
    +

    Apache の SSL/TLS 暗号化

    +
    +

    Available Languages:  en  | + ja  | + tr 

    +
    + +

    Apache HTTP サーバモジュール mod_ssl が +OpenSSL +ライブラリへのインターフェースを提供していますが、これは +Secure Sockts Layer と Transport Layer Security +プロトコルを用いた強力な暗号化を提供します。 +このモジュールやこの文書は Ralf S. Engelschall の mod_ssl +プロジェクトに基づいています。

    +
    + +
    top
    +
    top
    +
    +

    mod_ssl

    +

    このモジュールで提供されるディレクティブや環境変数に関する +詳しい文書は、mod_ssl +リファレンスをご覧下さい。

    +
    +
    +

    Available Languages:  en  | + ja  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/ssl/index.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/ssl/index.html.tr.utf8 new file mode 100644 index 00000000..1f673957 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/ssl/index.html.tr.utf8 @@ -0,0 +1,59 @@ + + + +Apache SSL/TLS Şifrelemesi - Apache HTTP Sunucusu + + + + + +
    <-
    +

    Apache SSL/TLS Şifrelemesi

    +
    +

    Mevcut Diller:  en  | + ja  | + tr 

    +
    + +

    Apache HTTP Sunucusunun mod_ssl modülü, Güvenli Soketler + Katmanı (SSL) ve Aktarım Katmanı Güvenliği (TLS) protokollerinin + kullanıldığı Sağlam Şifreleme desteğini sağlayan OpenSSL kütüphanesine bir arayüz + içerir. Bu modül ve belgeler Ralf S. Engelschall’ın mod_ssl projesine + dayanmaktadır.

    +
    + +
    top
    +
    top
    +
    +

    mod_ssl Modülü

    +

    Bu modülce sağlanan yönergeler ve ortam değişkenleri + mod_ssl başvuru kılavuzunda ayrıntılı olarak + açıklanmıştır.

    +
    +
    +

    Mevcut Diller:  en  | + ja  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/ssl/ssl_compat.html b/rubbos/app/httpd-2.0.64/docs/manual/ssl/ssl_compat.html new file mode 100644 index 00000000..eb43a0be --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/ssl/ssl_compat.html @@ -0,0 +1,5 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: ssl_compat.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/ssl/ssl_compat.html.en b/rubbos/app/httpd-2.0.64/docs/manual/ssl/ssl_compat.html.en new file mode 100644 index 00000000..9a0dbfcf --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/ssl/ssl_compat.html.en @@ -0,0 +1,233 @@ + + + +SSL/TLS Strong Encryption: Compatibility - Apache HTTP Server + + + + + +
    <-
    +

    SSL/TLS Strong Encryption: Compatibility

    +
    +

    Available Languages:  en 

    +
    + +
    +

    All PCs are compatible. But some of +them are more compatible than others.

    +

    -- Unknown

    +
    + +

    +Here we talk about backward compatibility to other SSL solutions. As you +perhaps know, mod_ssl is not the only existing SSL solution for Apache. +Actually there are four additional major products available on the market: Ben +Laurie's freely available Apache-SSL +(from where mod_ssl were originally derived in 1998), Red Hat's commercial Secure Web +Server (which is based on mod_ssl), Covalent's commercial Raven SSL Module (also based on mod_ssl) +and finally C2Net's commercial product Stronghold (based on a +different evolution branch named Sioux up to Stronghold 2.x and based on +mod_ssl since Stronghold 3.x).

    + +

    +The idea in mod_ssl is mainly the following: because mod_ssl provides mostly a +superset of the functionality of all other solutions we can easily provide +backward compatibility for most of the cases. Actually there are three +compatibility areas we currently address: configuration directives, +environment variables and custom log functions.

    +
    + +
    top
    +
    +

    Configuration Directives

    +

    For backward compatibility to the configuration directives of other SSL +solutions we do an on-the-fly mapping: directives which have a direct +counterpart in mod_ssl are mapped silently while other directives lead to a +warning message in the logfiles. The currently implemented directive mapping +is listed in Table 1. Currently full backward +compatibility is provided only for Apache-SSL 1.x and mod_ssl 2.0.x. +Compatibility to Sioux 1.x and Stronghold 2.x is only partial because of +special functionality in these interfaces which mod_ssl (still) doesn't +provide.

    + + +

    Table 1: Configuration Directive Mapping

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Old Directivemod_ssl DirectiveComment
    Apache-SSL 1.x & mod_ssl 2.0.x compatibility:
    SSLEnableSSLEngine oncompactified
    SSLDisableSSLEngine offcompactified
    SSLLogFile fileSSLLog filecompactified
    SSLRequiredCiphers specSSLCipherSuite specrenamed
    SSLRequireCipher c1 ...SSLRequire %{SSL_CIPHER} in {"c1", +...}generalized
    SSLBanCipher c1 ...SSLRequire not (%{SSL_CIPHER} in {"c1", +...})generalized
    SSLFakeBasicAuthSSLOptions +FakeBasicAuthmerged
    SSLCacheServerPath dir-functionality removed
    SSLCacheServerPort integer-functionality removed
    Apache-SSL 1.x compatibility:
    SSLExportClientCertificatesSSLOptions +ExportCertDatamerged
    SSLCacheServerRunDir dir-functionality not supported
    Sioux 1.x compatibility:
    SSL_CertFile fileSSLCertificateFile filerenamed
    SSL_KeyFile fileSSLCertificateKeyFile filerenamed
    SSL_CipherSuite argSSLCipherSuite argrenamed
    SSL_X509VerifyDir argSSLCACertificatePath argrenamed
    SSL_Log fileSSLLogFile filerenamed
    SSL_Connect flagSSLEngine flagrenamed
    SSL_ClientAuth argSSLVerifyClient argrenamed
    SSL_X509VerifyDepth argSSLVerifyDepth argrenamed
    SSL_FetchKeyPhraseFrom arg-not directly mappable; use SSLPassPhraseDialog
    SSL_SessionDir dir-not directly mappable; use SSLSessionCache
    SSL_Require expr-not directly mappable; use SSLRequire
    SSL_CertFileType arg-functionality not supported
    SSL_KeyFileType arg-functionality not supported
    SSL_X509VerifyPolicy arg-functionality not supported
    SSL_LogX509Attributes arg-functionality not supported
    Stronghold 2.x compatibility:
    StrongholdAccelerator dir-functionality not supported
    StrongholdKey dir-functionality not supported
    StrongholdLicenseFile dir-functionality not supported
    SSLFlag flagSSLEngine flagrenamed
    SSLSessionLockFile fileSSLMutex filerenamed
    SSLCipherList specSSLCipherSuite specrenamed
    RequireSSLSSLRequireSSLrenamed
    SSLErrorFile file-functionality not supported
    SSLRoot dir-functionality not supported
    SSL_CertificateLogDir dir-functionality not supported
    AuthCertDir dir-functionality not supported
    SSL_Group name-functionality not supported
    SSLProxyMachineCertPath dir-functionality not supported
    SSLProxyMachineCertFile file-functionality not supported
    SSLProxyCACertificatePath dir-functionality not supported
    SSLProxyCACertificateFile file-functionality not supported
    SSLProxyVerifyDepth number-functionality not supported
    SSLProxyCipherList spec-functionality not supported
    + +
    top
    +
    +

    Environment Variables

    +

    When you use ``SSLOptions +CompatEnvVars'' additional environment +variables are generated. They all correspond to existing official mod_ssl +variables. The currently implemented variable derivation is listed in Table 2.

    + +

    Table 2: Environment Variable Derivation

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Old Variablemod_ssl VariableComment
    SSL_PROTOCOL_VERSIONSSL_PROTOCOLrenamed
    SSLEAY_VERSIONSSL_VERSION_LIBRARYrenamed
    HTTPS_SECRETKEYSIZESSL_CIPHER_USEKEYSIZErenamed
    HTTPS_KEYSIZESSL_CIPHER_ALGKEYSIZErenamed
    HTTPS_CIPHERSSL_CIPHERrenamed
    HTTPS_EXPORTSSL_CIPHER_EXPORTrenamed
    SSL_SERVER_KEY_SIZESSL_CIPHER_ALGKEYSIZErenamed
    SSL_SERVER_CERTIFICATESSL_SERVER_CERTrenamed
    SSL_SERVER_CERT_STARTSSL_SERVER_V_STARTrenamed
    SSL_SERVER_CERT_ENDSSL_SERVER_V_ENDrenamed
    SSL_SERVER_CERT_SERIALSSL_SERVER_M_SERIALrenamed
    SSL_SERVER_SIGNATURE_ALGORITHMSSL_SERVER_A_SIGrenamed
    SSL_SERVER_DNSSL_SERVER_S_DNrenamed
    SSL_SERVER_CNSSL_SERVER_S_DN_CNrenamed
    SSL_SERVER_EMAILSSL_SERVER_S_DN_Emailrenamed
    SSL_SERVER_OSSL_SERVER_S_DN_Orenamed
    SSL_SERVER_OUSSL_SERVER_S_DN_OUrenamed
    SSL_SERVER_CSSL_SERVER_S_DN_Crenamed
    SSL_SERVER_SPSSL_SERVER_S_DN_SPrenamed
    SSL_SERVER_LSSL_SERVER_S_DN_Lrenamed
    SSL_SERVER_IDNSSL_SERVER_I_DNrenamed
    SSL_SERVER_ICNSSL_SERVER_I_DN_CNrenamed
    SSL_SERVER_IEMAILSSL_SERVER_I_DN_Emailrenamed
    SSL_SERVER_IOSSL_SERVER_I_DN_Orenamed
    SSL_SERVER_IOUSSL_SERVER_I_DN_OUrenamed
    SSL_SERVER_ICSSL_SERVER_I_DN_Crenamed
    SSL_SERVER_ISPSSL_SERVER_I_DN_SPrenamed
    SSL_SERVER_ILSSL_SERVER_I_DN_Lrenamed
    SSL_CLIENT_CERTIFICATESSL_CLIENT_CERTrenamed
    SSL_CLIENT_CERT_STARTSSL_CLIENT_V_STARTrenamed
    SSL_CLIENT_CERT_ENDSSL_CLIENT_V_ENDrenamed
    SSL_CLIENT_CERT_SERIALSSL_CLIENT_M_SERIALrenamed
    SSL_CLIENT_SIGNATURE_ALGORITHMSSL_CLIENT_A_SIGrenamed
    SSL_CLIENT_DNSSL_CLIENT_S_DNrenamed
    SSL_CLIENT_CNSSL_CLIENT_S_DN_CNrenamed
    SSL_CLIENT_EMAILSSL_CLIENT_S_DN_Emailrenamed
    SSL_CLIENT_OSSL_CLIENT_S_DN_Orenamed
    SSL_CLIENT_OUSSL_CLIENT_S_DN_OUrenamed
    SSL_CLIENT_CSSL_CLIENT_S_DN_Crenamed
    SSL_CLIENT_SPSSL_CLIENT_S_DN_SPrenamed
    SSL_CLIENT_LSSL_CLIENT_S_DN_Lrenamed
    SSL_CLIENT_IDNSSL_CLIENT_I_DNrenamed
    SSL_CLIENT_ICNSSL_CLIENT_I_DN_CNrenamed
    SSL_CLIENT_IEMAILSSL_CLIENT_I_DN_Emailrenamed
    SSL_CLIENT_IOSSL_CLIENT_I_DN_Orenamed
    SSL_CLIENT_IOUSSL_CLIENT_I_DN_OUrenamed
    SSL_CLIENT_ICSSL_CLIENT_I_DN_Crenamed
    SSL_CLIENT_ISPSSL_CLIENT_I_DN_SPrenamed
    SSL_CLIENT_ILSSL_CLIENT_I_DN_Lrenamed
    SSL_EXPORTSSL_CIPHER_EXPORTrenamed
    SSL_KEYSIZESSL_CIPHER_ALGKEYSIZErenamed
    SSL_SECKEYSIZESSL_CIPHER_USEKEYSIZErenamed
    SSL_SSLEAY_VERSIONSSL_VERSION_LIBRARYrenamed
    SSL_STRONG_CRYPTO-Not supported by mod_ssl
    SSL_SERVER_KEY_EXP-Not supported by mod_ssl
    SSL_SERVER_KEY_ALGORITHM-Not supported by mod_ssl
    SSL_SERVER_KEY_SIZE-Not supported by mod_ssl
    SSL_SERVER_SESSIONDIR-Not supported by mod_ssl
    SSL_SERVER_CERTIFICATELOGDIR-Not supported by mod_ssl
    SSL_SERVER_CERTFILE-Not supported by mod_ssl
    SSL_SERVER_KEYFILE-Not supported by mod_ssl
    SSL_SERVER_KEYFILETYPE-Not supported by mod_ssl
    SSL_CLIENT_KEY_EXP-Not supported by mod_ssl
    SSL_CLIENT_KEY_ALGORITHM-Not supported by mod_ssl
    SSL_CLIENT_KEY_SIZE-Not supported by mod_ssl
    + +
    top
    +
    +

    Custom Log Functions

    +

    +When mod_ssl is built into Apache or at least loaded (under DSO situation) +additional functions exist for the Custom Log Format of +mod_log_config as documented in the Reference +Chapter. Beside the ``%{varname}x'' +eXtension format function which can be used to expand any variables provided +by any module, an additional Cryptography +``%{name}c'' cryptography format function +exists for backward compatibility. The currently implemented function calls +are listed in Table 3.

    + +

    Table 3: Custom Log Cryptography Function

    + + + + + + + + + + + + +
    Function CallDescription
    %...{version}c SSL protocol version
    %...{cipher}c SSL cipher
    %...{subjectdn}c Client Certificate Subject Distinguished Name
    %...{issuerdn}c Client Certificate Issuer Distinguished Name
    %...{errcode}c Certificate Verification Error (numerical)
    %...{errstr}c Certificate Verification Error (string)
    + +
    +
    +

    Available Languages:  en 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/ssl/ssl_faq.html b/rubbos/app/httpd-2.0.64/docs/manual/ssl/ssl_faq.html new file mode 100644 index 00000000..ce1cf81d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/ssl/ssl_faq.html @@ -0,0 +1,5 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: ssl_faq.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/ssl/ssl_faq.html.en b/rubbos/app/httpd-2.0.64/docs/manual/ssl/ssl_faq.html.en new file mode 100644 index 00000000..16801dd6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/ssl/ssl_faq.html.en @@ -0,0 +1,1043 @@ + + + +SSL/TLS Strong Encryption: FAQ - Apache HTTP Server + + + + + +
    <-
    +

    SSL/TLS Strong Encryption: FAQ

    +
    +

    Available Languages:  en 

    +
    + +
    +

    The wise man doesn't give the right answers, +he poses the right questions.

    +

    -- Claude Levi-Strauss

    + +
    +

    This chapter is a collection of frequently asked questions (FAQ) and +corresponding answers following the popular USENET tradition. Most of these +questions occurred on the Newsgroup comp.infosystems.www.servers.unix or the mod_ssl Support +Mailing List modssl-users@modssl.org. They are collected at this place +to avoid answering the same questions over and over.

    + +

    Please read this chapter at least once when installing mod_ssl or at least +search for your problem here before submitting a problem report to the +author.

    +
    + +
    top
    +
    +

    About The Module

    + + +

    What is the history of mod_ssl?

    +

    The mod_ssl v1 package was initially created in April 1998 by Ralf S. Engelschall via porting Ben Laurie's Apache-SSL 1.17 source patches for + Apache 1.2.6 to Apache 1.3b6. Because of conflicts with Ben + Laurie's development cycle it then was re-assembled from scratch for + Apache 1.3.0 by merging the old mod_ssl 1.x with the newer Apache-SSL + 1.18. From this point on mod_ssl lived its own life as mod_ssl v2. The + first publicly released version was mod_ssl 2.0.0 from August 10th, + 1998.

    + +

    After US export restrictions on cryptographic software were + loosened, mod_ssl became part of the Apache HTTP + Server with the release of Apache httpd 2.

    + + +

    Is mod_ssl affected by the Wassenaar Arrangement?

    +

    First, let us explain what Wassenaar and its Arrangement on + Export Controls for Conventional Arms and Dual-Use Goods and + Technologies is: This is a international regime, established in 1995, to + control trade in conventional arms and dual-use goods and technology. It + replaced the previous CoCom regime. Further details on + both the Arrangement and its signatories are available at http://www.wassenaar.org/.

    + +

    In short, the aim of the Wassenaar Arrangement is to prevent the build up + of military capabilities that threaten regional and international security + and stability. The Wassenaar Arrangement controls the export of + cryptography as a dual-use good, that is, something that has both military and + civilian applications. However, the Wassenaar Arrangement also provides an + exemption from export controls for mass-market software and free software.

    + +

    In the current Wassenaar List of Dual Use Goods and Technologies And + Munitions, under GENERAL SOFTWARE NOTE (GSN) it says + The Lists do not control "software" which is either: 1. [...] 2. "in + the public domain". And under DEFINITIONS OF TERMS USED IN + THESE LISTS we find In the public + domain defined as "technology" or "software" which has been made + available without restrictions upon its further dissemination. Note: + Copyright restrictions do not remove "technology" or "software" from being + "in the public domain".

    + +

    So, both mod_ssl and OpenSSL are in the public domain for the purposes + of the Wassenaar Arrangement and its List of Dual Use Goods and + Technologies And Munitions List, and thus not affected by its provisions.

    + + +
    top
    +
    +

    Installation

    + + +

    Why do I get permission errors related to + SSLMutex when I start Apache?

    +

    Errors such as ``mod_ssl: Child could not open + SSLMutex lockfile /opt/apache/logs/ssl_mutex.18332 (System error follows) + [...] System: Permission denied (errno: 13)'' are usually + caused by overly restrictive permissions on the parent directories. + Make sure that all parent directories (here /opt, + /opt/apache and /opt/apache/logs) have the x-bit + set for, at minimum, the UID under which Apache's children are running (see + the User directive).

    + + +

    Why does mod_ssl stop with the error + "Failed to generate temporary 512 bit RSA private key" when I start + Apache?

    +

    Cryptographic software needs a source of unpredictable data + to work correctly. Many open source operating systems provide + a "randomness device" that serves this purpose (usually named + /dev/random). On other systems, applications have to + seed the OpenSSL Pseudo Random Number Generator (PRNG) manually with + appropriate data before generating keys or performing public key + encryption. As of version 0.9.5, the OpenSSL functions that need + randomness report an error if the PRNG has not been seeded with + at least 128 bits of randomness.

    +

    To prevent this error, mod_ssl has to provide + enough entropy to the PRNG to allow it to work correctly. This can + be done via the SSLRandomSeed + directive.

    + +
    top
    +
    +

    Configuration

    + + +

    Is it possible to provide HTTP and HTTPS + from the same server?

    +

    Yes. HTTP and HTTPS use different server ports (HTTP binds to + port 80, HTTPS to port 443), so there is no direct conflict between + them. You can either run two separate server instances bound to + these ports, or use Apache's elegant virtual hosting facility to + create two virtual servers, both served by the same instance of Apache + - one responding over HTTP to requests on port 80, and the other + responding over HTTPS to requests on port 443.

    + + +

    Which port does HTTPS use?

    +

    You can run HTTPS on any port, but the standards specify port 443, which + is where any HTTPS compliant browser will look by default. You can force + your browser to look on a different port by specifying it in the URL. For + example, if your server is set up to serve pages over HTTPS on port 8080, + you can access them at https://example.com:8080/

    + + +

    How do I speak HTTPS manually for testing purposes?

    +

    While you usually just use

    + +

    $ telnet localhost 80
    + GET / HTTP/1.0

    + +

    for simple testing of Apache via HTTP, it's not so easy for + HTTPS because of the SSL protocol between TCP and HTTP. With the + help of OpenSSL's s_client command, however, you can + do a similar check via HTTPS:

    + +

    $ openssl s_client -connect localhost:443 -state -debug
    + GET / HTTP/1.0

    + +

    Before the actual HTTP response you will receive detailed + information about the SSL handshake. For a more general command + line client which directly understands both HTTP and HTTPS, can + perform GET and POST operations, can use a proxy, supports byte + ranges, etc. you should have a look at the nifty + cURL tool. Using this, you can + check that Apache is responding correctly to requests via HTTP and + HTTPS as follows:

    + +

    $ curl http://localhost/
    + $ curl https://localhost/

    + + +

    Why does the connection hang when I connect + to my SSL-aware Apache server?

    + +

    This can happen when you try to connect to a HTTPS server (or virtual + server) via HTTP (eg, using http://example.com/ instead of + https://example.com). It can also happen when trying to + connect via HTTPS to a HTTP server (eg, using + https://example.com/ on a server which doesn't support HTTPS, + or which supports it on a non-standard port). Make sure that you're + connecting to a (virtual) server that supports SSL.

    + +

    Why do I get ``Connection Refused'' messages, + when trying to access my newly installed Apache+mod_ssl server via HTTPS?

    +

    + This error can be caused by an incorrect configuration. + Please make sure that your Listen directives match your + <VirtualHost> + directives. If all else fails, please start afresh, using the default + configuration provided by mod_ssl.

    + + +

    Why are the SSL_XXX variables + not available to my CGI & SSI scripts?

    +

    Please make sure you have ``SSLOptions +StdEnvVars'' + enabled for the context of your CGI/SSI requests.

    + + +

    How can I switch between HTTP and HTTPS in relative + hyperlinks?

    + +

    Usually, to switch between HTTP and HTTPS, you have to use + fully-qualified hyperlinks (because you have to change the URL + scheme). Using mod_rewrite however, you can + manipulate relative hyperlinks, to achieve the same effect.

    +

    + RewriteEngine on
    + RewriteRule ^/(.*):SSL$ https://%{SERVER_NAME}/$1 [R,L]
    + RewriteRule ^/(.*):NOSSL$ http://%{SERVER_NAME}/$1 [R,L] +

    + +

    This rewrite ruleset lets you use hyperlinks of the form + <a href="document.html:SSL">, to switch to HTTPS + in a relative link. (Replace SSL with NOSSL to switch to HTTP.)

    + +
    top
    +
    +

    Certificates

    + + +

    What are RSA Private Keys, CSRs and Certificates?

    +

    An RSA private key file is a digital file that you can use to decrypt + messages sent to you. It has a public component which you distribute (via + your Certificate file) which allows people to encrypt those messages to + you.

    +

    A Certificate Signing Request (CSR) is a digital file which contains + your public key and your name. You send the CSR to a Certifying Authority + (CA), who will convert it into a real Certificate, by signing it.

    +

    A Certificate contains your + RSA public key, your name, the name of the CA, and is digitally signed by + the CA. Browsers that know the CA can verify the signature on that + Certificate, thereby obtaining your RSA public key. That enables them to + send messages which only you can decrypt.

    +

    See the Introduction chapter for a general + description of the SSL protocol.

    + + +

    Is there a difference on startup between + a non-SSL-aware Apache and an SSL-aware Apache?

    +

    Yes. In general, starting Apache with + mod_ssl built-in is just like starting Apache + without it. However, if you have a passphrase on your SSL private + key file, a startup dialog will pop up which asks you to enter the + pass phrase.

    + +

    Having to manually enter the passphrase when starting the server + can be problematic - for example, when starting the server from the + system boot scripts. In this case, you can follow the steps + below to remove the passphrase from + your private key. Bear in mind that doing so brings additional security + risks - proceed with caution!

    + + +

    How do I create a self-signed SSL +Certificate for testing purposes?

    +
      +
    1. Make sure OpenSSL is installed and in your PATH.
      +
      +
    2. +
    3. Run the following command, to create server.key and + server.crt files:
      + $ openssl req -new -x509 -nodes -out server.crt + -keyout server.key
      + These can be used as follows in your httpd.conf + file: +
      +             SSLCertificateFile    /path/to/this/server.crt
      +             SSLCertificateKeyFile /path/to/this/server.key
      +	
      +
    4. +
    5. It is important that you are aware that this + server.key does not have any passphrase. + To add a passphrase to the key, you should run the following + command, and enter & verify the passphrase as requested.
      +

      $ openssl rsa -des3 -in server.key -out + server.key.new
      + $ mv server.key.new server.key

      + Please backup the server.key file, and the passphrase + you entered, in a secure location. +
    6. +
    + + +

    How do I create a real SSL Certificate?

    +

    Here is a step-by-step description:

    +
      +
    1. Make sure OpenSSL is installed and in your PATH. +
      +
      +
    2. +
    3. Create a RSA private key for your Apache server + (will be Triple-DES encrypted and PEM formatted):
      +
      + $ openssl genrsa -des3 -out server.key 1024
      +
      + Please backup this server.key file and the + pass-phrase you entered in a secure location. + You can see the details of this RSA private key by using the command:
      + +
      + $ openssl rsa -noout -text -in server.key
      +
      + If necessary, you can also create a decrypted PEM version (not + recommended) of this RSA private key with:
      +
      + $ openssl rsa -in server.key -out server.key.unsecure
      +
      + +
    4. +
    5. Create a Certificate Signing Request (CSR) with the server RSA private + key (output will be PEM formatted):
      +
      + $ openssl req -new -key server.key -out server.csr
      +
      + Make sure you enter the FQDN ("Fully Qualified Domain Name") of the + server when OpenSSL prompts you for the "CommonName", i.e. when you + generate a CSR for a website which will be later accessed via + https://www.foo.dom/, enter "www.foo.dom" here. + You can see the details of this CSR by using
      + +
      + $ openssl req -noout -text -in server.csr
      +
      +
    6. +
    7. You now have to send this Certificate Signing Request (CSR) to + a Certifying Authority (CA) to be signed. Once the CSR has been + signed, you will have a real Certificate, which can be used by + Apache. You can have a CSR signed by a commercial CA, or you can + create your own CA to sign it.
      + Commercial CAs usually ask you to post the CSR into a web form, + pay for the signing, and then send a signed Certificate, which + you can store in a server.crt file. For more information about + commercial CAs see the following locations:
      +
      +
        +
      1. Verisign
        + + http://digitalid.verisign.com/server/apacheNotice.htm + +
      2. +
      3. Thawte
        + http://www.thawte.com/ +
      4. +
      5. CertiSign Certificadora Digital Ltda.
        + + http://www.certisign.com.br + +
      6. +
      7. IKS GmbH
        + + http://www.iks-jena.de/leistungen/ca/ + +
      8. +
      9. Uptime Commerce Ltd.
        + + http://www.uptimecommerce.com + +
      10. +
      11. BelSign NV/SA
        + + http://www.belsign.be + +
      12. +
      + + For details on how to create your own CA, and use this to sign + a CSR, see below.
      + + Once your CSR has been signed, you can see the details of the + Certificate as follows:
      +
      + $ openssl x509 -noout -text -in server.crt
      + +
    8. +
    9. You should now have two files: server.key and + server.crt. These can be used as follows in your + httpd.conf file: +
      +       SSLCertificateFile    /path/to/this/server.crt
      +       SSLCertificateKeyFile /path/to/this/server.key
      +       
      + The server.csr file is no longer needed. +
    10. + +
    + + +

    How do I create and use my own Certificate Authority (CA)?

    +

    The short answer is to use the CA.sh or CA.pl + script provided by OpenSSL. Unless you have a good reason not to, + you should use these for preference. If you cannot, you can create a + self-signed Certificate as follows:

    + +
      +
    1. Create a RSA private key for your server + (will be Triple-DES encrypted and PEM formatted):
      +
      + $ openssl genrsa -des3 -out server.key 1024
      +
      + Please backup this host.key file and the + pass-phrase you entered in a secure location. + You can see the details of this RSA private key by using the + command:
      + $ openssl rsa -noout -text -in server.key
      +
      + If necessary, you can also create a decrypted PEM version (not + recommended) of this RSA private key with:
      +
      + $ openssl rsa -in server.key -out server.key.unsecure
      +
      +
    2. +
    3. Create a self-signed Certificate (X509 structure) + with the RSA key you just created (output will be PEM formatted):
      +
      + $ openssl req -new -x509 -nodes -sha1 -days 365 + -key server.key -out server.crt
      +
      + This signs the server CSR and results in a server.crt file.
      + You can see the details of this Certificate using:
      +
      + $ openssl x509 -noout -text -in server.crt
      +
      +
    4. +
    + + +

    How can I change the pass-phrase on my private key file?

    +

    You simply have to read it with the old pass-phrase and write it again, + specifying the new pass-phrase. You can accomplish this with the following + commands:

    + + +

    $ openssl rsa -des3 -in server.key -out server.key.new
    + $ mv server.key.new server.key

    + +

    The first time you're asked for a PEM pass-phrase, you should + enter the old pass-phrase. After that, you'll be asked again to + enter a pass-phrase - this time, use the new pass-phrase. If you + are asked to verify the pass-phrase, you'll need to enter the new + pass-phrase a second time.

    + + +

    How can I get rid of the pass-phrase dialog at Apache startup time?

    +

    The reason this dialog pops up at startup and every re-start + is that the RSA private key inside your server.key file is stored in + encrypted format for security reasons. The pass-phrase is needed to decrypt + this file, so it can be read and parsed. Removing the pass-phrase + removes a layer of security from your server - proceed with caution!

    +
      +
    1. Remove the encryption from the RSA private key (while + keeping a backup copy of the original file):
      +
      + $ cp server.key server.key.org
      + $ openssl rsa -in server.key.org -out server.key
      + +
      +
    2. +
    3. Make sure the server.key file is only readable by root:
      +
      + $ chmod 400 server.key
      +
      +
    4. +
    + +

    Now server.key contains an unencrypted copy of the key. + If you point your server at this file, it will not prompt you for a + pass-phrase. HOWEVER, if anyone gets this key they will be able to + impersonate you on the net. PLEASE make sure that the permissions on this + file are such that only root or the web server user can read it + (preferably get your web server to start as root but run as another + user, and have the key readable only by root).

    + +

    As an alternative approach you can use the ``SSLPassPhraseDialog + exec:/path/to/program'' facility. Bear in mind that this is + neither more nor less secure, of course.

    + + +

    How do I verify that a private key matches its Certificate?

    +

    A private key contains a series of numbers. Two of these numbers form + the "public key", the others are part of the "private key". The "public + key" bits are included when you generate a CSR, and subsequently form + part of the associated Certificate.

    +

    To check that the public key in your Certificate matches the public + portion of your private key, you simply need to compare these numbers. + To view the Certificate and the key run the commands:

    + +

    $ openssl x509 -noout -text -in server.crt
    + $ openssl rsa -noout -text -in server.key

    + +

    The `modulus' and the `public exponent' portions in the key and the + Certificate must match. As the public exponent is usually 65537 + and it's difficult to visually check that the long modulus numbers + are the same, you can use the following approach:

    + +

    $ openssl x509 -noout -modulus -in server.crt | openssl md5
    + $ openssl rsa -noout -modulus -in server.key | openssl md5

    + +

    This leaves you with two rather shorter numbers to compare. It is, + in theory, possible that these numbers may be the same, without the + modulus numbers being the same, but the chances of this are + overwhelmingly remote.

    +

    Should you wish to check to which key or certificate a particular + CSR belongs you can perform the same calculation on the CSR as + follows:

    + +

    $ openssl req -noout -modulus -in server.csr | openssl md5

    + + +

    Why do connections fail with an "alert +bad certificate" error?

    +

    Errors such as OpenSSL: error:14094412: SSL + routines:SSL3_READ_BYTES:sslv3 alert bad certificate in the SSL + logfile, are usually caused by a browser which is unable to handle the server + certificate/private-key. For example, Netscape Navigator 3.x is + unable to handle RSA key lengths not equal to 1024 bits.

    + + +

    Why does my 2048-bit private key not work?

    +

    The private key sizes for SSL must be either 512 or 1024 bits, for compatibility + with certain web browsers. A keysize of 1024 bits is recommended because + keys larger than 1024 bits are incompatible with some versions of Netscape + Navigator and Microsoft Internet Explorer, and with other browsers that + use RSA's BSAFE cryptography toolkit.

    + + +

    Why is client authentication broken after upgrading from +SSLeay version 0.8 to 0.9?

    +

    The CA certificates under the path you configured with + SSLCACertificatePath are found by SSLeay through hash + symlinks. These hash values are generated by the `openssl x509 -noout + -hash' command. However, the algorithm used to calculate the hash for a + certificate changed between SSLeay 0.8 and 0.9. You will need to remove + all old hash symlinks and create new ones after upgrading. Use the + Makefile provided by mod_ssl.

    + + +

    How can I convert a certificate from PEM to DER format?

    +

    The default certificate format for SSLeay/OpenSSL is PEM, which is simply + Base64 encoded DER, with header and footer lines. For some applications + (e.g. Microsoft Internet Explorer) you need the certificate in plain DER + format. You can convert a PEM file cert.pem into the + corresponding DER file cert.der using the following command: + $ openssl x509 -in cert.pem -out cert.der -outform DER

    + + +

    Why can't I find the +getca or getverisign programs mentioned by +Verisign, for installing my Verisign certificate?

    +

    Verisign has never provided specific instructions + for Apache+mod_ssl. The instructions provided are for C2Net's + Stronghold (a commercial Apache based server with SSL support).

    +

    To install your certificate, all you need to do is to save the + certificate to a file, and give the name of that file to the + SSLCertificateFile directive. + You will also need to give it the key file. For more information, + see the SSLCertificateKeyFile + directive.

    + + +

    Can I use the Server Gated Cryptography (SGC) +facility (aka Verisign Global ID) with mod_ssl?

    +

    Yes. mod_ssl has included support for the SGC + facility since version 2.1. No special configuration is required - + just use the Global ID as your server certificate. The + step up of the clients is then automatically handled by + mod_ssl at run-time.

    + + +

    Why do browsers complain that they cannot +verify my Verisign Global ID server certificate?

    +

    Verisign uses an intermediate CA certificate between the root CA + certificate (which is installed in the browsers) and the server + certificate (which you installed on the server). You should have + received this additional CA certificate from Verisign. + If not, complain to them. Then, configure this certificate with the + SSLCertificateChainFile + directive. This ensures that the intermediate CA certificate is + sent to the browser, filling the gap in the certificate chain.

    + +
    top
    +
    +

    The SSL Protocol

    + + +

    Why do I get lots of random SSL protocol +errors under heavy server load?

    +

    There can be a number of reasons for this, but the main one + is problems with the SSL session Cache specified by the + SSLSessionCache directive. The DBM session + cache is the most likely source of the problem, so using the SHM session cache (or + no cache at all) may help.

    + + +

    Why does my webserver have a higher load, now +that it serves SSL encrypted traffic?

    +

    SSL uses strong cryptographic encryption, which necessitates a lot of + number crunching. When you request a webpage via HTTPS, everything (even + the images) is encrypted before it is transferred. So increased HTTPS + traffic leads to load increases.

    + + +

    Why do HTTPS connections to my server +sometimes take up to 30 seconds to establish a connection?

    +

    This is usually caused by a /dev/random device for + SSLRandomSeed which blocks the + read(2) call until enough entropy is available to service the + request. More information is available in the reference + manual for the SSLRandomSeed + directive.

    + + +

    What SSL Ciphers are supported by mod_ssl?

    +

    Usually, any SSL ciphers supported by the version of OpenSSL in use, + are also supported by mod_ssl. Which ciphers are + available can depend on the way you built OpenSSL. Typically, at + least the following ciphers are supported:

    + +
      +
    1. RC4 with MD5
    2. +
    3. RC4 with MD5 (export version restricted to 40-bit key)
    4. +
    5. RC2 with MD5
    6. +
    7. RC2 with MD5 (export version restricted to 40-bit key)
    8. +
    9. IDEA with MD5
    10. +
    11. DES with MD5
    12. +
    13. Triple-DES with MD5
    14. +
    + +

    To determine the actual list of ciphers available, you should run + the following:

    +

    $ openssl ciphers -v

    + + +

    Why do I get ``no shared cipher'' errors, when +trying to use Anonymous Diffie-Hellman (ADH) ciphers?

    +

    By default, OpenSSL does not allow ADH ciphers, for security + reasons. Please be sure you are aware of the potential side-effects + if you choose to enable these ciphers.

    +

    In order to use Anonymous Diffie-Hellman (ADH) ciphers, you must + build OpenSSL with ``-DSSL_ALLOW_ADH'', and then add + ``ADH'' into your SSLCipherSuite.

    + + +

    Why do I get a 'no shared ciphers' +error when connecting to my newly installed server?

    +

    Either you have made a mistake with your + SSLCipherSuite + directive (compare it with the pre-configured example in + httpd.conf-dist) or you chose to use DSA/DH + algorithms instead of RSA when you generated your private key + and ignored or overlooked the warnings. If you have chosen + DSA/DH, then your server cannot communicate using RSA-based SSL + ciphers (at least until you configure an additional RSA-based + certificate/key pair). Modern browsers like NS or IE can only + communicate over SSL using RSA ciphers. The result is the + "no shared ciphers" error. To fix this, regenerate your server + certificate/key pair, using the RSA algorithm.

    + + +

    Why can't I use SSL with name-based/non-IP-based virtual hosts?

    +

    The reason is very technical, and a somewhat "chicken and egg" problem. + The SSL protocol layer stays below the HTTP protocol layer and + encapsulates HTTP. When an SSL connection (HTTPS) is established + Apache/mod_ssl has to negotiate the SSL protocol parameters with the + client. For this, mod_ssl has to consult the configuration of the virtual + server (for instance it has to look for the cipher suite, the server + certificate, etc.). But in order to go to the correct virtual server + Apache has to know the Host HTTP header field. To do this, the + HTTP request header has to be read. This cannot be done before the SSL + handshake is finished, but the information is needed in order to + complete the SSL handshake phase. Bingo!

    + + +

    Why is it not possible to use Name-Based +Virtual Hosting to identify different SSL virtual hosts?

    +

    Name-Based Virtual Hosting is a very popular method of identifying + different virtual hosts. It allows you to use the same IP address and + the same port number for many different sites. When people move on to + SSL, it seems natural to assume that the same method can be used to have + lots of different SSL virtual hosts on the same server.

    + +

    It comes as rather a shock to learn that it is impossible.

    + +

    The reason is that the SSL protocol is a separate layer which + encapsulates the HTTP protocol. So the SSL session is a separate + transaction, that takes place before the HTTP session has begun. + The server receives an SSL request on IP address X and port Y + (usually 443). Since the SSL request does not contain any Host: + field, the server has no way to decide which SSL virtual host to use. + Usually, it will just use the first one it finds, which matches the + port and IP address specified.

    + +

    You can, of course, use Name-Based Virtual Hosting to identify many + non-SSL virtual hosts (all on port 80, for example) and then + have a single SSL virtual host (on port 443). But if you do this, + you must make sure to put the non-SSL port number on the NameVirtualHost + directive, e.g.

    + +

    + NameVirtualHost 192.168.1.1:80 +

    + +

    Other workaround solutions include:

    + +

    Using separate IP addresses for different SSL hosts. + Using different port numbers for different SSL hosts.

    + + +

    How do I get SSL compression working?

    +

    Although SSL compression negotiation was defined in the specification +of SSLv2 and TLS, it took until May 2004 for RFC 3749 to define DEFLATE as +a negotiable standard compression method. +

    +

    OpenSSL 0.9.8 started to support this by default when compiled with the +zlib option. If both the client and the server support compression, +it will be used. However, most clients still try to initially connect with an +SSLv2 Hello. As SSLv2 did not include an array of prefered compression algorithms +in its handshake, compression cannot be negotiated with these clients. +If the client disables support for SSLv2, either an SSLv3 or TLS Hello +may be sent, depending on which SSL library is used, and compression may +be set up. You can verify whether clients make use of SSL compression by +logging the %{SSL_COMPRESS_METHOD}x variable. +

    + + +

    When I use Basic Authentication over HTTPS +the lock icon in Netscape browsers stays unlocked when the dialog pops up. +Does this mean the username/password is being sent unencrypted?

    +

    No, the username/password is transmitted encrypted. The icon in + Netscape browsers is not actually synchronized with the SSL/TLS layer. + It only toggles to the locked state when the first part of the actual + webpage data is transferred, which may confuse people. The Basic + Authentication facility is part of the HTTP layer, which is above + the SSL/TLS layer in HTTPS. Before any HTTP data communication takes + place in HTTPS, the SSL/TLS layer has already completed its handshake + phase, and switched to encrypted communication. So don't be + confused by this icon.

    + + +

    Why do I get I/O errors when connecting via +HTTPS to an Apache+mod_ssl server with Microsoft Internet Explorer (MSIE)?

    +

    The first reason is that the SSL implementation in some MSIE versions has + some subtle bugs related to the HTTP keep-alive facility and the SSL close + notify alerts on socket connection close. Additionally the interaction + between SSL and HTTP/1.1 features are problematic in some MSIE versions. + You can work around these problems by forcing Apache not to use HTTP/1.1, + keep-alive connections or send the SSL close notify messages to MSIE clients. + This can be done by using the following directive in your SSL-aware + virtual host section:

    +

    + SetEnvIf User-Agent ".*MSIE.*" \
    + nokeepalive ssl-unclean-shutdown \
    + downgrade-1.0 force-response-1.0 +

    +

    Further, some MSIE versions have problems with particular ciphers. + Unfortunately, it is not possible to implement a MSIE-specific + workaround for this, because the ciphers are needed as early as the + SSL handshake phase. So a MSIE-specific + SetEnvIf won't solve these + problems. Instead, you will have to make more drastic + adjustments to the global parameters. Before you decide to do + this, make sure your clients really have problems. If not, do not + make these changes - they will affect all your clients, MSIE + or otherwise.

    + +

    The next problem is that 56bit export versions of MSIE 5.x + browsers have a broken SSLv3 implementation, which interacts badly + with OpenSSL versions greater than 0.9.4. You can accept this and + require your clients to upgrade their browsers, you can downgrade to + OpenSSL 0.9.4 (not advised), or you can work around this, accepting + that your workaround will affect other browsers too:

    +

    SSLProtocol all -SSLv3

    +

    will completely disables the SSLv3 protocol and allow those + browsers to work. A better workaround is to disable only those + ciphers which cause trouble.

    +

    SSLCipherSuite + ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP +

    + +

    This also allows the broken MSIE versions to work, but only removes the + newer 56bit TLS ciphers.

    + +

    Another problem with MSIE 5.x clients is that they refuse to connect to + URLs of the form https://12.34.56.78/ (where IP-addresses are used + instead of the hostname), if the server is using the Server Gated + Cryptography (SGC) facility. This can only be avoided by using the fully + qualified domain name (FQDN) of the website in hyperlinks instead, because + MSIE 5.x has an error in the way it handles the SGC negotiation.

    + +

    And finally there are versions of MSIE which seem to require that + an SSL session can be reused (a totally non standard-conforming + behaviour, of course). Connecting with those MSIE versions only work + if a SSL session cache is used. So, as a work-around, make sure you + are using a session cache (see the SSLSessionCache directive).

    + + +

    Why do I get I/O errors, or the message "Netscape has +encountered bad data from the server", when connecting via +HTTPS to an Apache+mod_ssl server with Netscape Navigator?

    +

    + This usually occurs when you have created a new server certificate for + a given domain, but had previously told your browser to always accept + the old server certificate. Once you clear the entry for the old + certificate from your browser, everything should be fine. Netscape's SSL + implementation is correct, so when you encounter I/O errors with Netscape + Navigator it is usually caused by the configured certificates.

    + +
    top
    +
    +

    mod_ssl Support

    + + +

    What information resources are available in case of mod_ssl problems?

    +

    The following information resources are available. + In case of problems you should search here first.

    + +
    +
    Answers in the User Manual's F.A.Q. List (this)
    +
    + http://httpd.apache.org/docs/2.0/ssl/ssl_faq.html
    + First check the F.A.Q. (this text). If your problem is a common + one, it may have been answered several times before, and been included + in this doc. +
    +
    Postings from the modssl-users Support Mailing List + http://www.modssl.org/support/
    +
    Search for your problem in the archives of the modssl-users mailing list. + You're probably not the first person to have had this problem! +
    +
    + + +

    What support contacts are available in case +of mod_ssl problems?

    +

    The following lists all support possibilities for mod_ssl, in order of + preference. Please go through these possibilities + in this order - don't just pick the one you like the look of.

    +
      +
    1. Send a Problem Report to the modssl-users Support Mailing List
      + + modssl-users@modssl.org
      + This is the preferred way of submitting your problem report, because this way, + others can see the problem, and learn from any answers. You must subscribe to + the list first, but you can then easily discuss your problem with both the + author and the whole mod_ssl user community. +
    2. + +
    3. Send a Problem Report to the Apache httpd Users Support Mailing List
      + + users@httpd.apache.org
      + This is the second way of submitting your problem report. Again, you must + subscribe to the list first, but you can then easily discuss your problem + with the whole Apache httpd user community. +
    4. + +
    5. Write a Problem Report in the Bug Database
      + + http://httpd.apache.org/bug_report.html
      + This is the last way of submitting your problem report. You should only + do this if you've already posted to the mailing lists, and had no success. + Please follow the instructions on the above page carefully. +
    6. +
    + + +

    What information should I +provide when writing a bug report?

    +

    You should always provide at least the following information:

    + +
    +
    Apache and OpenSSL version information
    +
    The Apache version can be determined + by running httpd -v. The OpenSSL version can be + determined by running openssl version. Alternatively, if + you have Lynx installed, you can run the command lynx -mime_header + http://localhost/ | grep Server to gather this information in a + single step. +
    + +
    The details on how you built and installed Apache+mod_ssl+OpenSSL
    +
    For this you can provide a logfile of your terminal session which shows + the configuration and install steps. If this is not possible, you + should at least provide the configure command line you used. +
    + +
    In case of core dumps please include a Backtrace
    +
    If your Apache+mod_ssl+OpenSSL dumps its core, please attach + a stack-frame ``backtrace'' (see below + for information on how to get this). This information is required + in order to find a reason for your core dump. +
    + +
    A detailed description of your problem
    +
    Don't laugh, we really mean it! Many problem reports don't + include a description of what the actual problem is. Without this, + it's very difficult for anyone to help you. So, it's in your own + interest (you want the problem be solved, don't you?) to include as + much detail as possible, please. Of course, you should still include + all the essentials above too. +
    +
    + + +

    I had a core dump, can you help me?

    +

    In general no, at least not unless you provide more details about the code + location where Apache dumped core. What is usually always required in + order to help you is a backtrace (see next question). Without this + information it is mostly impossible to find the problem and help you in + fixing it.

    + + +

    How do I get a backtrace, to help find +the reason for my core dump?

    +

    Following are the steps you will need to complete, to get a backtrace:

    +
      +
    1. Make sure you have debugging symbols available, at least + in Apache. On platforms where you use GCC/GDB, you will have to build + Apache+mod_ssl with ``OPTIM="-g -ggdb3"'' to get this. On + other platforms at least ``OPTIM="-g"'' is needed. +
    2. + +
    3. Start the server and try to reproduce the core-dump. For this you may + want to use a directive like ``CoreDumpDirectory /tmp'' to + make sure that the core-dump file can be written. This should result + in a /tmp/core or /tmp/httpd.core file. If you + don't get one of these, try running your server under a non-root UID. + Many modern kernels do not allow a process to dump core after it has + done a setuid() (unless it does an exec()) for + security reasons (there can be privileged information left over in + memory). If necessary, you can run /path/to/httpd -X + manually to force Apache to not fork. +
    4. + +
    5. Analyze the core-dump. For this, run gdb /path/to/httpd + /tmp/httpd.core or a similar command. In GDB, all you + have to do then is to enter bt, and voila, you get the + backtrace. For other debuggers consult your local debugger manual. +
    6. +
    + +
    +
    +

    Available Languages:  en 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/ssl/ssl_howto.html b/rubbos/app/httpd-2.0.64/docs/manual/ssl/ssl_howto.html new file mode 100644 index 00000000..9f06e018 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/ssl/ssl_howto.html @@ -0,0 +1,5 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: ssl_howto.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/ssl/ssl_howto.html.en b/rubbos/app/httpd-2.0.64/docs/manual/ssl/ssl_howto.html.en new file mode 100644 index 00000000..f09492d6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/ssl/ssl_howto.html.en @@ -0,0 +1,284 @@ + + + +SSL/TLS Strong Encryption: How-To - Apache HTTP Server + + + + + +
    <-
    +

    SSL/TLS Strong Encryption: How-To

    +
    +

    Available Languages:  en 

    +
    + +
    +

    The solution of this problem is trivial +and is left as an exercise for the reader.

    + +

    -- Standard textbook cookie

    +
    + +

    How to solve particular security constraints for an SSL-aware +webserver is not always obvious because of the coherences between SSL, +HTTP and Apache's way of processing requests. This chapter gives +instructions on how to solve such typical situations. Treat it as a first +step to find out the final solution, but always try to understand the +stuff before you use it. Nothing is worse than using a security solution +without knowing its restrictions and coherences.

    +
    + +
    top
    +
    +

    Cipher Suites and Enforced Strong Security

    + + + +

    How can I create a real SSLv2-only server?

    + +

    The following creates an SSL server which speaks only the SSLv2 protocol and + its ciphers.

    + +

    httpd.conf

    + SSLProtocol -all +SSLv2
    + SSLCipherSuite SSLv2:+HIGH:+MEDIUM:+LOW:+EXP
    +

    + + +

    How can I create an SSL server which accepts strong encryption +only?

    + +

    The following enables only the seven strongest ciphers:

    +

    httpd.conf

    + SSLProtocol all
    + SSLCipherSuite HIGH:MEDIUM
    +

    + + +

    How can I create an SSL server which accepts strong encryption +only, but allows export browsers to upgrade to stronger encryption?

    + +

    This facility is called Server Gated Cryptography (SGC) and details + you can find in the README.GlobalID document in the + mod_ssl distribution. In short: The server has a Global ID server + certificate, signed by a special CA certificate from Verisign which + enables strong encryption in export browsers. This works as following: + The browser connects with an export cipher, the server sends its Global + ID certificate, the browser verifies it and subsequently upgrades the + cipher suite before any HTTP communication takes place. The question + now is: How can we allow this upgrade, but enforce strong encryption. + Or in other words: Browser either have to initially connect with + strong encryption or have to upgrade to strong encryption, but are + not allowed to keep the export ciphers. The following does the trick:

    +

    httpd.conf

    + # allow all ciphers for the initial handshake,
    + # so export browsers can upgrade via SGC facility
    + SSLCipherSuite ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
    +
    + <Directory /usr/local/apache2/htdocs>
    + # but finally deny all browsers which haven't upgraded
    + SSLRequire %{SSL_CIPHER_USEKEYSIZE} >= 128
    + </Directory> +

    + + +

    How can I create an SSL server which accepts all types of ciphers +in general, but requires a strong ciphers for access to a particular +URL?

    + +

    Obviously you cannot just use a server-wide SSLCipherSuite which restricts the + ciphers to the strong variants. But mod_ssl allows you to reconfigure + the cipher suite in per-directory context and automatically forces + a renegotiation of the SSL parameters to meet the new configuration. + So, the solution is:

    +

    + # be liberal in general
    + SSLCipherSuite ALL:!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
    +
    + <Location /strong/area>
    + # but https://hostname/strong/area/ and below
    + # requires strong ciphers
    + SSLCipherSuite HIGH:MEDIUM
    + </Location> +

    + +
    top
    +
    +

    Client Authentication and Access Control

    + + + +

    How can I authenticate clients based on certificates when I know +all my clients?

    + +

    When you know your user community (i.e. a closed user group + situation), as it's the case for instance in an Intranet, you can + use plain certificate authentication. All you have to do is to + create client certificates signed by your own CA certificate + ca.crt and then verify the clients against this + certificate.

    +

    httpd.conf

    + # require a client certificate which has to be directly
    + # signed by our CA certificate in ca.crt
    + SSLVerifyClient require
    + SSLVerifyDepth 1
    + SSLCACertificateFile conf/ssl.crt/ca.crt +

    + + +

    How can I authenticate my clients for a particular URL based on +certificates but still allow arbitrary clients to access the remaining +parts of the server?

    + +

    For this we again use the per-directory reconfiguration feature + of mod_ssl:

    + +

    httpd.conf

    + SSLVerifyClient none
    + SSLCACertificateFile conf/ssl.crt/ca.crt
    +
    + <Location /secure/area>
    + SSLVerifyClient require
    + SSLVerifyDepth 1
    + </Location>
    +

    + + +

    How can I authenticate only particular clients for a some URLs based +on certificates but still allow arbitrary clients to access the remaining +parts of the server?

    + +

    The key is to check for various ingredients of the client certificate. + Usually this means to check the whole or part of the Distinguished + Name (DN) of the Subject. For this two methods exists: The mod_auth based variant and the SSLRequire variant. The first method is + good when the clients are of totally different type, i.e. when their + DNs have no common fields (usually the organisation, etc.). In this + case you've to establish a password database containing all + clients. The second method is better when your clients are all part of + a common hierarchy which is encoded into the DN. Then you can match + them more easily.

    + +

    The first method:

    +

    httpd.conf

    +SSLVerifyClient      none
    +<Directory /usr/local/apache2/htdocs/secure/area>
    +
    +SSLVerifyClient      require
    +SSLVerifyDepth       5
    +SSLCACertificateFile conf/ssl.crt/ca.crt
    +SSLCACertificatePath conf/ssl.crt
    +SSLOptions           +FakeBasicAuth
    +SSLRequireSSL
    +AuthName             "Snake Oil Authentication"
    +AuthType             Basic
    +AuthUserFile         /usr/local/apache2/conf/httpd.passwd
    +require              valid-user
    +</Directory>
    + +

    The password used in this example is the DES encrypted string "password". + See the SSLOptions docs for more + information.

    + +

    httpd.passwd

    +/C=DE/L=Munich/O=Snake Oil, Ltd./OU=Staff/CN=Foo:xxj31ZMTZzkVA
    +/C=US/L=S.F./O=Snake Oil, Ltd./OU=CA/CN=Bar:xxj31ZMTZzkVA
    +/C=US/L=L.A./O=Snake Oil, Ltd./OU=Dev/CN=Quux:xxj31ZMTZzkVA
    + +

    The second method:

    + +

    httpd.conf

    +SSLVerifyClient      none
    +<Directory /usr/local/apache2/htdocs/secure/area>
    +
    +  SSLVerifyClient      require
    +  SSLVerifyDepth       5
    +  SSLCACertificateFile conf/ssl.crt/ca.crt
    +  SSLCACertificatePath conf/ssl.crt
    +  SSLOptions           +FakeBasicAuth
    +  SSLRequireSSL
    +  SSLRequire       %{SSL_CLIENT_S_DN_O}  eq "Snake Oil, Ltd." \
    +               and %{SSL_CLIENT_S_DN_OU} in {"Staff", "CA", "Dev"}
    +</Directory>
    + + +

    How can I require HTTPS with strong ciphers and either basic +authentication or client certificates for access to a subarea on the +Intranet website for clients coming from the Internet but still allow +plain HTTP access for clients on the Intranet?

    + +

    Let us assume the Intranet can be distinguished through the IP + network 192.168.1.0/24 and the subarea on the Intranet website has + the URL /subarea. Then configure the following outside + your HTTPS virtual host (so it applies to both HTTPS and HTTP):

    + +

    httpd.conf

    +SSLCACertificateFile conf/ssl.crt/company-ca.crt
    +
    +<Directory /usr/local/apache2/htdocs>
    +#   Outside the subarea only Intranet access is granted
    +Order                deny,allow
    +Deny                 from all
    +Allow                from 192.168.1.0/24
    +</Directory>
    +
    +<Directory /usr/local/apache2/htdocs/subarea>
    +#   Inside the subarea any Intranet access is allowed
    +#   but from the Internet only HTTPS + Strong-Cipher + Password
    +#   or the alternative HTTPS + Strong-Cipher + Client-Certificate
    +
    +#   If HTTPS is used, make sure a strong cipher is used.
    +#   Additionally allow client certs as alternative to basic auth.
    +SSLVerifyClient      optional
    +SSLVerifyDepth       1
    +SSLOptions           +FakeBasicAuth +StrictRequire
    +SSLRequire           %{SSL_CIPHER_USEKEYSIZE} >= 128
    +
    +#   Force clients from the Internet to use HTTPS
    +RewriteEngine        on
    +RewriteCond          %{REMOTE_ADDR} !^192\.168\.1\.[0-9]+$
    +RewriteCond          %{HTTPS} !=on
    +RewriteRule          .* - [F]
    +
    +#   Allow Network Access and/or Basic Auth
    +Satisfy              any
    +
    +#   Network Access Control
    +Order                deny,allow
    +Deny                 from all
    +Allow                192.168.1.0/24
    +
    +#   HTTP Basic Authentication
    +AuthType             basic
    +AuthName             "Protected Intranet Area"
    +AuthUserFile         conf/protected.passwd
    +Require              valid-user
    +</Directory>
    + +
    +
    +

    Available Languages:  en 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/ssl/ssl_intro.html b/rubbos/app/httpd-2.0.64/docs/manual/ssl/ssl_intro.html new file mode 100644 index 00000000..0163b215 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/ssl/ssl_intro.html @@ -0,0 +1,9 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: ssl_intro.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: ssl_intro.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/ssl/ssl_intro.html.en b/rubbos/app/httpd-2.0.64/docs/manual/ssl/ssl_intro.html.en new file mode 100644 index 00000000..c3079d4e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/ssl/ssl_intro.html.en @@ -0,0 +1,641 @@ + + + +SSL/TLS Strong Encryption: An Introduction - Apache HTTP Server + + + + + +
    <-
    +

    SSL/TLS Strong Encryption: An Introduction

    +
    +

    Available Languages:  en  | + ja 

    +
    + +
    +

    The nice thing about standards is that there are so many to choose +from. And if you really don't like all the standards you just have to +wait another year until the one arises you are looking for.

    + +

    -- A. Tanenbaum, "Introduction to +Computer Networks"

    +
    + +

    As an introduction this chapter is aimed at readers who are familiar +with the Web, HTTP, and Apache, but are not security experts. It is not +intended to be a definitive guide to the SSL protocol, nor does it discuss +specific techniques for managing certificates in an organization, or the +important legal issues of patents and import and export restrictions. +Rather, it is intended to provide a common background to mod_ssl users by +pulling together various concepts, definitions, and examples as a starting +point for further exploration.

    + +

    The presented content is mainly derived, with permission by the author, +from the article Introducing +SSL and Certificates using SSLeay from Frederick J. Hirsch, of The +Open Group Research Institute, which was published in Web Security: A Matter of +Trust, World Wide Web Journal, Volume 2, Issue 3, Summer 1997. +Please send any positive feedback to Frederick Hirsch (the original +article author) and all negative feedback to Ralf S. Engelschall (the +mod_ssl author).

    +
    + +
    top
    +
    +

    Cryptographic Techniques

    + +

    Understanding SSL requires an understanding of cryptographic +algorithms, message digest functions (aka. one-way or hash functions), and +digital signatures. These techniques are the subject of entire books (see +for instance [AC96]) and provide the basis for privacy, +integrity, and authentication.

    + +

    Cryptographic Algorithms

    + +

    Suppose Alice wants to send a message to her bank to transfer some + money. Alice would like the message to be private, since it will + include information such as her account number and transfer amount. One + solution is to use a cryptographic algorithm, a technique that would + transform her message into an encrypted form, unreadable except by + those it is intended for. Once in this form, the message may only be + interpreted through the use of a secret key. Without the key the + message is useless: good cryptographic algorithms make it so difficult + for intruders to decode the original text that it isn't worth their + effort.

    + +

    There are two categories of cryptographic algorithms: conventional + and public key.

    + +
    +
    Conventional cryptography
    +
    also known as symmetric cryptography, requires the sender and + receiver to share a key: a secret piece of information that may be + used to encrypt or decrypt a message. If this key is secret, then + nobody other than the sender or receiver may read the message. If + Alice and the bank know a secret key, then they may send each other + private messages. The task of privately choosing a key before + communicating, however, can be problematic.
    + +
    Public key cryptography
    +
    also known as asymmetric cryptography, solves the key exchange + problem by defining an algorithm which uses two keys, each of which + may be used to encrypt a message. If one key is used to encrypt a + message then the other must be used to decrypt it. This makes it + possible to receive secure messages by simply publishing one key + (the public key) and keeping the other secret (the private key).
    +
    + +

    Anyone may encrypt a message using the public key, but only the + owner of the private key will be able to read it. In this way, Alice + may send private messages to the owner of a key-pair (the bank), by + encrypting it using their public key. Only the bank will be able to + decrypt it.

    + + +

    Message Digests

    + +

    Although Alice may encrypt her message to make it private, there + is still a concern that someone might modify her original message or + substitute it with a different one, in order to transfer the money + to themselves, for instance. One way of guaranteeing the integrity + of Alice's message is to create a concise summary of her message and + send this to the bank as well. Upon receipt of the message, the bank + creates its own summary and compares it with the one Alice sent. If + they agree then the message was received intact.

    + +

    A summary such as this is called a message digest, one-way +function or hash function. Message digests are used to create +short, fixed-length representations of longer, variable-length messages. +Digest algorithms are designed to produce unique digests for different +messages. Message digests are designed to make it too difficult to determine +the message from the digest, and also impossible to find two different +messages which create the same digest -- thus eliminating the possibility of +substituting one message for another while maintaining the same digest.

    +

    Another challenge that Alice faces is finding a way to send the digest to the +bank securely; when this is achieved, the integrity of the associated message +is assured. One way to do this is to include the digest in a digital +signature.

    + + +

    Digital Signatures

    +

    When Alice sends a message to the bank, the bank needs to ensure that the +message is really from her, so an intruder does not request a transaction +involving her account. A digital signature, created by Alice and +included with the message, serves this purpose.

    + +

    Digital signatures are created by encrypting a digest of the message, +and other information (such as a sequence number) with the sender's +private key. Though anyone may decrypt the signature using the public +key, only the signer knows the private key. This means that only they may +have signed it. Including the digest in the signature means the signature is +only good for that message; it also ensures the integrity of the message since +no one can change the digest and still sign it.

    +

    To guard against interception and reuse of the signature by an intruder at a +later date, the signature contains a unique sequence number. This protects +the bank from a fraudulent claim from Alice that she did not send the message +-- only she could have signed it (non-repudiation).

    + +
    top
    +
    +

    Certificates

    + +

    Although Alice could have sent a private message to the bank, signed +it, and ensured the integrity of the message, she still needs to be sure +that she is really communicating with the bank. This means that she needs +to be sure that the public key she is using corresponds to the bank's +private key. Similarly, the bank also needs to verify that the message +signature really corresponds to Alice's signature.

    + +

    If each party has a certificate which validates the other's identity, +confirms the public key, and is signed by a trusted agency, then they both +will be assured that they are communicating with whom they think they are. +Such a trusted agency is called a Certificate Authority, and +certificates are used for authentication.

    + +

    Certificate Contents

    + +

    A certificate associates a public key with the real identity of + an individual, server, or other entity, known as the subject. As + shown in Table 1, information about the subject + includes identifying information (the distinguished name), and the + public key. It also includes the identification and signature of the + Certificate Authority that issued the certificate, and the period of + time during which the certificate is valid. It may have additional + information (or extensions) as well as administrative information + for the Certificate Authority's use, such as a serial number.

    + +

    Table 1: Certificate Information

    + + + + + + + + + + + + + +
    SubjectDistinguished Name, Public Key
    IssuerDistinguished Name, Signature
    Period of ValidityNot Before Date, Not After Date
    Administrative InformationVersion, Serial Number
    Extended InformationBasic Constraints, Netscape Flags, etc.
    + + +

    A distinguished name is used to provide an identity in a specific + context -- for instance, an individual might have a personal + certificate as well as one for their identity as an employee. + Distinguished names are defined by the X.509 standard [X509], which defines the fields, field names, and + abbreviations used to refer to the fields (see Table + 2).

    + +

    Table 2: Distinguished Name Information

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    DN FieldAbbrev.DescriptionExample
    Common NameCNName being certifiedCN=Joe Average
    Organization or CompanyOName is associated with this
    organization
    O=Snake Oil, Ltd.
    Organizational UnitOUName is associated with this
    organization unit, such + as a department
    OU=Research Institute
    City/LocalityLName is located in this CityL=Snake City
    State/ProvinceSTName is located in this State/ProvinceST=Desert
    CountryCName is located in this Country (ISO code)C=XZ
    + + +

    A Certificate Authority may define a policy specifying which + distinguished field names are optional, and which are required. It + may also place requirements upon the field contents, as may users of + certificates. As an example, a Netscape browser requires that the + Common Name for a certificate representing a server has a name which + matches a wildcard pattern for the domain name of that server, such + as *.snakeoil.com.

    + +

    The binary format of a certificate is defined using the ASN.1 + notation [X208] [PKCS]. This + notation defines how to specify the contents, and encoding rules + define how this information is translated into binary form. The binary + encoding of the certificate is defined using Distinguished Encoding + Rules (DER), which are based on the more general Basic Encoding Rules + (BER). For those transmissions which cannot handle binary, the binary + form may be translated into an ASCII form by using Base64 encoding + [MIME]. This encoded version is called PEM encoded + (the name comes from "Privacy Enhanced Mail"), when placed between + begin and end delimiter lines as illustrated in the following + example.

    + +

    Example of a PEM-encoded certificate (snakeoil.crt)

    -----BEGIN CERTIFICATE-----
    +MIIC7jCCAlegAwIBAgIBATANBgkqhkiG9w0BAQQFADCBqTELMAkGA1UEBhMCWFkx
    +FTATBgNVBAgTDFNuYWtlIERlc2VydDETMBEGA1UEBxMKU25ha2UgVG93bjEXMBUG
    +A1UEChMOU25ha2UgT2lsLCBMdGQxHjAcBgNVBAsTFUNlcnRpZmljYXRlIEF1dGhv
    +cml0eTEVMBMGA1UEAxMMU25ha2UgT2lsIENBMR4wHAYJKoZIhvcNAQkBFg9jYUBz
    +bmFrZW9pbC5kb20wHhcNOTgxMDIxMDg1ODM2WhcNOTkxMDIxMDg1ODM2WjCBpzEL
    +MAkGA1UEBhMCWFkxFTATBgNVBAgTDFNuYWtlIERlc2VydDETMBEGA1UEBxMKU25h
    +a2UgVG93bjEXMBUGA1UEChMOU25ha2UgT2lsLCBMdGQxFzAVBgNVBAsTDldlYnNl
    +cnZlciBUZWFtMRkwFwYDVQQDExB3d3cuc25ha2VvaWwuZG9tMR8wHQYJKoZIhvcN
    +AQkBFhB3d3dAc25ha2VvaWwuZG9tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB
    +gQDH9Ge/s2zcH+da+rPTx/DPRp3xGjHZ4GG6pCmvADIEtBtKBFAcZ64n+Dy7Np8b
    +vKR+yy5DGQiijsH1D/j8HlGE+q4TZ8OFk7BNBFazHxFbYI4OKMiCxdKzdif1yfaa
    +lWoANFlAzlSdbxeGVHoT0K+gT5w3UxwZKv2DLbCTzLZyPwIDAQABoyYwJDAPBgNV
    +HRMECDAGAQH/AgEAMBEGCWCGSAGG+EIBAQQEAwIAQDANBgkqhkiG9w0BAQQFAAOB
    +gQAZUIHAL4D09oE6Lv2k56Gp38OBDuILvwLg1v1KL8mQR+KFjghCrtpqaztZqcDt
    +2q2QoyulCgSzHbEGmi0EsdkPfg6mp0penssIFePYNI+/8u9HT4LuKMJX15hxBam7
    +dUHzICxBVC1lnHyYGjDuAMhe396lYAn8bCld1/L4NMGBCQ==
    +-----END CERTIFICATE-----
    + + +

    Certificate Authorities

    + +

    By first verifying the information in a certificate request + before granting the certificate, the Certificate Authority assures + the identity of the private key owner of a key-pair. For instance, + if Alice requests a personal certificate, the Certificate Authority + must first make sure that Alice really is the person the certificate + request claims.

    + +

    Certificate Chains

    + +

    A Certificate Authority may also issue a certificate for + another Certificate Authority. When examining a certificate, + Alice may need to examine the certificate of the issuer, for each + parent Certificate Authority, until reaching one which she has + confidence in. She may decide to trust only certificates with a + limited chain of issuers, to reduce her risk of a "bad" certificate + in the chain.

    + + +

    Creating a Root-Level CA

    + +

    As noted earlier, each certificate requires an issuer to assert + the validity of the identity of the certificate subject, up to + the top-level Certificate Authority (CA). This presents a problem: + Since this is who vouches for the certificate of the top-level + authority, which has no issuer? In this unique case, the + certificate is "self-signed", so the issuer of the certificate is + the same as the subject. As a result, one must exercise extra care + in trusting a self-signed certificate. The wide publication of a + public key by the root authority reduces the risk in trusting this + key -- it would be obvious if someone else publicized a key + claiming to be the authority. Browsers are preconfigured to trust + well-known certificate authorities.

    + +

    A number of companies, such as Thawte and VeriSign + have established themselves as Certificate Authorities. These + companies provide the following services:

    + +
      +
    • Verifying certificate requests
    • +
    • Processing certificate requests
    • +
    • Issuing and managing certificates
    • +
    + +

    It is also possible to create your own Certificate Authority. + Although risky in the Internet environment, it may be useful + within an Intranet where the organization can easily verify the + identities of individuals and servers.

    + + +

    Certificate Management

    + +

    Establishing a Certificate Authority is a responsibility which + requires a solid administrative, technical, and management + framework. Certificate Authorities not only issue certificates, + they also manage them -- that is, they determine how long + certificates are valid, they renew them, and they keep lists of + certificates that have already been issued but are no longer valid + (Certificate Revocation Lists, or CRLs). Say Alice is entitled to + a certificate as an employee of a company. Say too, that the + certificate needs to be revoked when Alice leaves the company. Since + certificates are objects that get passed around, it is impossible + to tell from the certificate alone that it has been revoked. When + examining certificates for validity, therefore, it is necessary to + contact the issuing Certificate Authority to check CRLs -- this + is not usually an automated part of the process.

    + +

    Note

    +

    If you use a Certificate Authority that is not configured into + browsers by default, it is necessary to load the Certificate + Authority certificate into the browser, enabling the browser to + validate server certificates signed by that Certificate Authority. + Doing so may be dangerous, since once loaded, the browser will + accept all certificates signed by that Certificate Authority.

    +
    + + + +
    top
    +
    +

    Secure Sockets Layer (SSL)

    + +

    The Secure Sockets Layer protocol is a protocol layer which may be +placed between a reliable connection-oriented network layer protocol +(e.g. TCP/IP) and the application protocol layer (e.g. HTTP). SSL provides +for secure communication between client and server by allowing mutual +authentication, the use of digital signatures for integrity, and encryption +for privacy.

    + +

    The protocol is designed to support a range of choices for specific +algorithms used for cryptography, digests, and signatures. This allows +algorithm selection for specific servers to be made based on legal, export +or other concerns, and also enables the protocol to take advantage of new +algorithms. Choices are negotiated between client and server at the start +of establishing a protocol session.

    + +

    Table 4: Versions of the SSL protocol

    + + + + + + + + + + + + + + + + + + + +
    VersionSourceDescriptionBrowser Support
    SSL v2.0Vendor Standard (from Netscape Corp.) [SSL2]First SSL protocol for which implementations exists- NS Navigator 1.x/2.x
    + - MS IE 3.x
    + - Lynx/2.8+OpenSSL
    SSL v3.0Expired Internet Draft (from Netscape Corp.) [SSL3]Revisions to prevent specific security attacks, add non-RSA + ciphers, and support for certificate chains- NS Navigator 2.x/3.x/4.x
    + - MS IE 3.x/4.x
    + - Lynx/2.8+OpenSSL
    TLS v1.0Proposed Internet Standard (from IETF) [TLS1]Revision of SSL 3.0 to update the MAC layer to HMAC, add block + padding for block ciphers, message order standardization and more + alert messages.- Lynx/2.8+OpenSSL
    + + +

    There are a number of versions of the SSL protocol, as shown in +Table 4. As noted there, one of the benefits in +SSL 3.0 is that it adds support of certificate chain loading. This feature +allows a server to pass a server certificate along with issuer certificates +to the browser. Chain loading also permits the browser to validate the +server certificate, even if Certificate Authority certificates are not +installed for the intermediate issuers, since they are included in the +certificate chain. SSL 3.0 is the basis for the Transport Layer Security +[TLS] protocol standard, currently in development by +the Internet Engineering Task Force (IETF).

    + +

    Session Establishment

    + +

    The SSL session is established by following a handshake sequence + between client and server, as shown in Figure 1. This sequence may vary, depending on whether the server + is configured to provide a server certificate or request a client + certificate. Though cases exist where additional handshake steps + are required for management of cipher information, this article + summarizes one common scenario: see the SSL specification for the full + range of possibilities.

    + +

    Note

    +

    Once an SSL session has been established it may be reused, thus + avoiding the performance penalty of repeating the many steps needed + to start a session. For this the server assigns each SSL session a + unique session identifier which is cached in the server and which the + client can use on forthcoming connections to reduce the handshake + (until the session identifer expires in the cache of the server).

    +
    + +

    +
    + Figure 1: Simplified SSL + Handshake Sequence

    + +

    The elements of the handshake sequence, as used by the client and + server, are listed below:

    + +
      +
    1. Negotiate the Cipher Suite to be used during data transfer
    2. +
    3. Establish and share a session key between client and server
    4. +
    5. Optionally authenticate the server to the client
    6. +
    7. Optionally authenticate the client to the server
    8. +
    + +

    The first step, Cipher Suite Negotiation, allows the client and + server to choose a Cipher Suite supportable by both of them. The SSL3.0 + protocol specification defines 31 Cipher Suites. A Cipher Suite is + defined by the following components:

    + +
      +
    • Key Exchange Method
    • +
    • Cipher for Data Transfer
    • +
    • Message Digest for creating the Message Authentication Code (MAC)
    • +
    + +

    These three elements are described in the sections that follow.

    + + +

    Key Exchange Method

    + +

    The key exchange method defines how the shared secret symmetric + cryptography key used for application data transfer will be agreed + upon by client and server. SSL 2.0 uses RSA key exchange only, while + SSL 3.0 supports a choice of key exchange algorithms including the + RSA key exchange when certificates are used, and Diffie-Hellman key + exchange for exchanging keys without certificates and without prior + communication between client and server.

    + +

    One variable in the choice of key exchange methods is digital + signatures -- whether or not to use them, and if so, what kind of + signatures to use. Signing with a private key provides assurance + against a man-in-the-middle-attack during the information exchange + used in generating the shared key [AC96, p516].

    + + +

    Cipher for Data Transfer

    + +

    SSL uses the conventional cryptography algorithm (symmetric + cryptography) described earlier for encrypting messages in a session. + There are nine choices, including the choice to perform no + encryption:

    + +
      +
    • No encryption
    • +
    • Stream Ciphers +
        +
      • RC4 with 40-bit keys
      • +
      • RC4 with 128-bit keys
      • +
    • +
    • CBC Block Ciphers +
      • RC2 with 40 bit key
      • +
      • DES with 40 bit key
      • +
      • DES with 56 bit key
      • +
      • Triple-DES with 168 bit key
      • +
      • Idea (128 bit key)
      • +
      • Fortezza (96 bit key)
      • +
    • +
    + +

    Here "CBC" refers to Cipher Block Chaining, which means that a + portion of the previously encrypted cipher text is used in the + encryption of the current block. "DES" refers to the Data Encryption + Standard [AC96, ch12], which has a number of + variants (including DES40 and 3DES_EDE). "Idea" is one of the best + and cryptographically strongest available algorithms, and "RC2" is + a proprietary algorithm from RSA DSI [AC96, + ch13].

    + + +

    Digest Function

    + +

    The choice of digest function determines how a digest is created + from a record unit. SSL supports the following:

    + +
      +
    • No digest (Null choice)
    • +
    • MD5, a 128-bit hash
    • +
    • Secure Hash Algorithm (SHA-1), a 160-bit hash
    • +
    + +

    The message digest is used to create a Message Authentication Code + (MAC) which is encrypted with the message to provide integrity and to + prevent against replay attacks.

    + + +

    Handshake Sequence Protocol

    + +

    The handshake sequence uses three protocols:

    + +
      +
    • The SSL Handshake Protocol + for performing the client and server SSL session establishment.
    • +
    • The SSL Change Cipher Spec Protocol for actually + establishing agreement on the Cipher Suite for the session.
    • +
    • The SSL Alert Protocol for conveying SSL error + messages between client and server.
    • +
    + +

    These protocols, as well as application protocol data, are + encapsulated in the SSL Record Protocol, as shown in + Figure 2. An encapsulated protocol is + transferred as data by the lower layer protocol, which does not + examine the data. The encapsulated protocol has no knowledge of the + underlying protocol.

    + +

    +
    + Figure 2: SSL Protocol Stack +

    + +

    The encapsulation of SSL control protocols by the record protocol + means that if an active session is renegotiated the control protocols + will be transmitted securely. If there were no session before, then + the Null cipher suite is used, which means there is no encryption and + messages have no integrity digests until the session has been + established.

    + + +

    Data Transfer

    + +

    The SSL Record Protocol, shown in Figure 3, + is used to transfer application and SSL Control data between the + client and server, possibly fragmenting this data into smaller units, + or combining multiple higher level protocol data messages into single + units. It may compress, attach digest signatures, and encrypt these + units before transmitting them using the underlying reliable transport + protocol (Note: currently all major SSL implementations lack support + for compression).

    + +

    +
    + Figure 3: SSL Record Protocol +

    + + +

    Securing HTTP Communication

    + +

    One common use of SSL is to secure Web HTTP communication between + a browser and a webserver. This case does not preclude the use of + non-secured HTTP. The secure version is mainly plain HTTP over SSL + (named HTTPS), but with one major difference: it uses the URL scheme + https rather than http and a different + server port (by default 443). This mainly is what mod_ssl provides to you for the Apache webserver...

    + +
    top
    +
    +

    References

    + +
    +
    [AC96]
    +
    Bruce Schneier, Applied Cryptography, 2nd Edition, Wiley, +1996. See http://www.counterpane.com/ for various other materials by Bruce +Schneier.
    + +
    [X208]
    +
    ITU-T Recommendation X.208, Specification of Abstract Syntax Notation +One (ASN.1), 1988. See for instance http://www.itu.int/rec/recommendation.asp?type=items&lang=e&parent=T-REC-X.208-198811-I. +
    + +
    [X509]
    +
    ITU-T Recommendation X.509, The Directory - Authentication +Framework. See for instance http://www.itu.int/rec/recommendation.asp?type=folders&lang=e&parent=T-REC-X.509. +
    + +
    [PKCS]
    +
    Public Key Cryptography Standards (PKCS), +RSA Laboratories Technical Notes, See http://www.rsasecurity.com/rsalabs/pkcs/.
    + +
    [MIME]
    +
    N. Freed, N. Borenstein, Multipurpose Internet Mail Extensions +(MIME) Part One: Format of Internet Message Bodies, RFC2045. +See for instance http://ietf.org/rfc/rfc2045.txt.
    + +
    [SSL2]
    +
    Kipp E.B. Hickman, The SSL Protocol, 1995. See http://www.netscape.com/eng/security/SSL_2.html.
    + +
    [SSL3]
    +
    Alan O. Freier, Philip Karlton, Paul C. Kocher, The SSL Protocol +Version 3.0, 1996. See http://www.netscape.com/eng/ssl3/draft302.txt.
    + +
    [TLS1]
    +
    Tim Dierks, Christopher Allen, The TLS Protocol Version 1.0, +1999. See http://ietf.org/rfc/rfc2246.txt.
    +
    +
    +
    +

    Available Languages:  en  | + ja 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/ssl/ssl_intro.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/ssl/ssl_intro.html.ja.utf8 new file mode 100644 index 00000000..eb497b47 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/ssl/ssl_intro.html.ja.utf8 @@ -0,0 +1,695 @@ + + + +SSL/TLS 暗号化: はじめに - Apache HTTP サーバ + + + + + +
    <-
    +

    SSL/TLS 暗号化: はじめに

    +
    +

    Available Languages:  en  | + ja 

    +
    + +
    +

    標準規格の良い所は、たくさんの規格から選べるということだ。 +そして、もし本当にどの規格も気に入らなければ、 +一年待つだけで探していた規格が現れる。

    + +

    -- A. Tanenbaum, "Introduction to +Computer Networks"

    +
    + +

    +入門ということで、この章は Web、HTTP、Apache に通じている +読者向けですが、セキュリティ専門家向けではありません。 +SSL プロトコルの決定的な手引きであるつもりはありません。 +また、組織内の認証管理のための特定のテクニックや、 +特許や輸出規制などの重要な法的な問題についても扱いません。 +むしろ、更なる研究への出発点として色々な概念、定義、例を並べることで + mod_ssl のユーザに基礎知識を提供する事を目的としています。

    + +

    ここに示された内容は主に、原著者の許可の下 +The Open Group Research Institute の Frederick J. Hirsch + 氏の記事 +Introducing SSL and Certificates using SSLeay を基にしています。 +氏の記事は Web Security: A Matter of +Trust, World Wide Web Journal, Volume 2, Issue 3, Summer 1997 +に掲載されました。 +肯定的な意見は Frederick Hirsch 氏 + (元記事の著者) へ全ての苦情は Ralf S. Engelschall ( +mod_ssl の作者) へお願いします。 +[訳注: 訳については +Apache ドキュメント翻訳プロジェクト +へお願いします。]

    +
    + +
    top
    +
    +

    暗号化技術

    + +

    SSL を理解するには、暗号アルゴリズム、 +メッセージダイジェスト関数(別名: 一方向関数、ハッシュ関数)、 +電子署名などへの理解が必要です。 +これらの技術は本が丸ごと必要な題目で +(例えば [AC96] を参照)、 +プライバシー、信用、認証などの技術の基礎となっています。

    + +

    暗号アルゴリズム

    + +

    例えば、アリスが送金のために銀行にメッセージを送りたいとします。 + 口座番号や送金の金額が含まれるため、 + アリスはそのメッセージを秘密にしたいと思います。 + 解決方法の一つは暗号アルゴリズムを使って、メッセージを + 読ませたい人以外は読むことができない暗号化された + 形態に変えてしまうことです。 + その形態になると、 + メッセージは秘密の鍵によってのみ解釈することができます。 + 鍵なしでは、メッセージは役に立ちません。 + 良い暗号アルゴリズムは、侵入者が元のテキストを解読することを + 非常に難しくするため、努力が割に合わなくさせます。

    + +

    暗号アルゴリズムには + 従来型と公開鍵の二つの種類があります。

    + +
    +
    従来型暗号
    +
    対称暗号としても知られ、 + 送信者と受信者が鍵を共有することが必要です。 + 鍵とは、メッセージを暗号化したり復号するのに使われる秘密 + の情報のことです。 + もし、この鍵が秘密なら、送信者と受信者以外は誰もメッセージを読 + むことができません。 + もしも、アリスと銀行が秘密の鍵を知っているなら、 + 彼らはお互いに秘密のメッセージを送ることができるでしょう。 + ただし、事前に内密に鍵を選ぶという仕事は問題を含んでいます。
    + +
    公開鍵暗号
    +
    非対称暗号としても知られ、 + メッセージを暗号化することのできる二つの鍵 + を使用するアルゴリズムを定義することで鍵のやり取りの問題を解決 + します。 + もし、ある鍵が暗号化に使われたなら、 + もう片方の鍵で復号しなければいけません。 + この方式によって、一つの鍵を公表して(公開鍵)、 + もう片方を秘密にしておく(秘密鍵)だけで、 + 安全なメッセージを受け取ることができます。
    +
    + +

    誰もが暗号化されたメッセージを公開鍵によって暗号化 + することができますが、秘密鍵の持ち主だけがそれを読むことが + できます。 + この方法で、銀行の公開鍵を使って暗号化することで、 + アリスは秘密のメッセージを送ることができます。 + 銀行のみが復号することができます。

    + + +

    メッセージダイジェスト

    + +

    アリスはメッセージを秘密にすることができますが、 + 誰かが例えば自分に送金するようにメッセージを変更したり、 + 別のものに置き換えてしまうかもしれないという問題があります。 + アリスのメッセージの信用を保証する方法の一つは、 + メッセージの簡潔なダイジェストを作って、それも銀行に送るというものです。 + メッセージを受け取ると銀行もダイジェストを作成し、 + アリスが送ったものと比べます。もし一致したなら、 + 受け取ったメッセージは無傷だということになります。

    + +

    このような要約はメッセージダイジェスト、 + 一方行関数、またはハッシュ関数と呼ばれます。 + メッセージダイジェストは長い可変長のメッセージから + 短い固定長の表現を作るのに使われます。 + ダイジェストアルゴリズムはメッセージから + 一意なダイジェストを生成するように作られています。 + メッセージダイジェストはダイジェストから元のメッセージを + 判定するのがとても難しいようにできています。 + また、同じ要約を作成する二つのメッセージを探すのは不可能です。 + よって、同じ要約を使ってメッセージを置き換えるという + 可能性を排除しています。

    + +

    アリスへのもう一つの問題は、このダイジェストを安全に送る方法を探すことです。 +これができれば、メッセージの信用が保証されます。 +一つの方法はこのダイジェストに電子署名を含むことです。

    + + +

    電子署名

    +

    アリスが銀行にメッセージを送ったとき、銀行は、 +侵入者が彼女になりすまして彼女の口座への取引を申請していないか、 +メッセージが本当に彼女からのものか確実に分からなければいけません。 +アリスによって作成され、メッセージに含まれた +電子署名がここで役に立ちます。

    + +

    電子署名はメッセージのダイジェストやその他の情報(処理番号など)を +送信者の秘密鍵で暗号化することで作られます。 +誰もが公開鍵を使って署名を復号することができますが、 +署名者のみが秘密鍵を知っています。 +これは、彼らのみが署名しえたことを意味します。 +ダイジェストを電子署名に含むことは、 +その署名がそのメッセージのみに有効であることを意味します。 +これは、誰もダイジェストを変えて署名をすることができないため、 +メッセージの信用も保証します。

    + +

    侵入者が署名を傍受して後日に再利用するのを防ぐため +電子署名には一意な処理番号が含まれます。 +これは、アリスがそんなメッセージは送っていないと言う詐欺 +から銀行を守ります。 +彼女だけが署名しえたからです。(否認防止)

    + +
    top
    +
    +

    証明書

    + +

    アリスは秘密のメッセージを銀行に送り、 +署名をして、メッセージの信用を保証することができるおうになりましたが、 +通信している相手が本当に銀行なのか確かめなくてはいけません。 +これは、彼女が使う公開鍵が銀行の秘密鍵と対になっているものか、 +彼女は確かめなくてはいけないということを意味します。 +同様に、銀行はメッセージの署名が本当にアリスの署名か確認する必要が +あります。

    + +

    もし両者に身元を証明し、公開鍵を確認し、また信頼された機関が署名 +した証明書があれば、両者とも通信相手について正しい相手だと +確信することができます。 +そのような信頼された機関は認証局 + (Certificate Authority または CA) と呼ばれ、 +証明書 (certificate) が認証 (authentication) に使われます。

    + +

    証明書の内容

    + +

    証明書は公開鍵と個人、サーバ、その他の主体の実在の身元を + 関連付けます。 + 表1に示されるように証明対象の情報は + 身元証明の情報(識別名)と公開鍵が含まれます。 + 証明書はまた、認証局の身元証明と署名、そして証明書の有効期間を + 含みます。 + シリアルナンバーなどの認証局の管理上の情報や + その他の追加の情報が含まれているかもしれません。

    + +

    表1: 証明書情報

    + + + + + + + + + + + + + +
    証明対象識別名、公開鍵
    発行者識別名、公開鍵
    有効期間開始日、失効日
    管理情報バージョン、シリアルナンバー
    拡張情報基本的な制約、ネットスケープフラッグ、その他
    + + +

    識別名(ディスティングイッシュ・ネーム)は特定の状況における + 身分証明を提供するのに使われています。例えば、ある人は + 私用と会社とで別々の身分証明を持つかもしれません。 + + 識別名は X.509 標準規格 [X509] で定義されています。 + X.509 標準規格は、項目、項目名、そして項目の略称を定義しています。(表 + 2 参照)

    + +

    表 2: 識別名情報

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    識別名項目略称説明例
    Common Name (コモンネーム)CN認証される名前
    + SSL接続するURL
    CN=www.example.com
    Organization or Company (組織名)O団体の正式英語組織名O=Example Japan K.K.
    Organizational Unit (部門名)OU部署名などOU=Customer Service
    City/Locality (市区町村)L所在してる市区町村L=Sapporo
    State/Province (都道府県)ST所在してる都道府県ST=Hokkaido
    Country(国)C所在している国名の ISO コード
    + 日本の場合 JP +
    C=JP
    + + +

    認証局はどの項目が省略可能でどれが必須かの方針を定義する + かもしれません。項目の内容についても認証局や証明書のユーザからの + 要件があるかもしれません。 + 例えば、ネットスケープのブラウザはサーバの証明書の + Common Name (コモンネーム)がサーバのドメイン名の + *.example.com + というようなワイルドカードのパターンにマッチすること + を要求します。

    + +

    バイナリ形式の証明書は ASN.1 表記法 + [X208] [PKCS] で + 定義されています。 + この表記法は内容をどのように記述するかを定義し、 + 符号化の規定がこの情報がどのようにバイナリ形式に変換されるかを + 定義します。 + 証明書のバイナリ符号化は Distinguished Encoding + Rules (DER) で定義され、それはより一般的な Basic Encoding Rules + (BER) に基づいています。 + バイナリ形式を扱うことのできない送信では、 + バイナリ形式は Base64 符号化 [MIME] で + ASCII 形式に変換されることがあります。 + このように符号化され、以下の例に示されるように区切り行に + 挟まれたものは PEM 符号化されたと言います。 + (PEM の名前は "Privacy Enhanced Mail" に由来します)

    + +

    PEM 符号化された証明書の例 (example.crt)

    -----BEGIN CERTIFICATE-----
    +MIIC7jCCAlegAwIBAgIBATANBgkqhkiG9w0BAQQFADCBqTELMAkGA1UEBhMCWFkx
    +FTATBgNVBAgTDFNuYWtlIERlc2VydDETMBEGA1UEBxMKU25ha2UgVG93bjEXMBUG
    +A1UEChMOU25ha2UgT2lsLCBMdGQxHjAcBgNVBAsTFUNlcnRpZmljYXRlIEF1dGhv
    +cml0eTEVMBMGA1UEAxMMU25ha2UgT2lsIENBMR4wHAYJKoZIhvcNAQkBFg9jYUBz
    +bmFrZW9pbC5kb20wHhcNOTgxMDIxMDg1ODM2WhcNOTkxMDIxMDg1ODM2WjCBpzEL
    +MAkGA1UEBhMCWFkxFTATBgNVBAgTDFNuYWtlIERlc2VydDETMBEGA1UEBxMKU25h
    +a2UgVG93bjEXMBUGA1UEChMOU25ha2UgT2lsLCBMdGQxFzAVBgNVBAsTDldlYnNl
    +cnZlciBUZWFtMRkwFwYDVQQDExB3d3cuc25ha2VvaWwuZG9tMR8wHQYJKoZIhvcN
    +AQkBFhB3d3dAc25ha2VvaWwuZG9tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB
    +gQDH9Ge/s2zcH+da+rPTx/DPRp3xGjHZ4GG6pCmvADIEtBtKBFAcZ64n+Dy7Np8b
    +vKR+yy5DGQiijsH1D/j8HlGE+q4TZ8OFk7BNBFazHxFbYI4OKMiCxdKzdif1yfaa
    +lWoANFlAzlSdbxeGVHoT0K+gT5w3UxwZKv2DLbCTzLZyPwIDAQABoyYwJDAPBgNV
    +HRMECDAGAQH/AgEAMBEGCWCGSAGG+EIBAQQEAwIAQDANBgkqhkiG9w0BAQQFAAOB
    +gQAZUIHAL4D09oE6Lv2k56Gp38OBDuILvwLg1v1KL8mQR+KFjghCrtpqaztZqcDt
    +2q2QoyulCgSzHbEGmi0EsdkPfg6mp0penssIFePYNI+/8u9HT4LuKMJX15hxBam7
    +dUHzICxBVC1lnHyYGjDuAMhe396lYAn8bCld1/L4NMGBCQ==
    +-----END CERTIFICATE-----
    + + +

    認証局

    + +

    まず証明書の申請の情報を確認することで、 + 認証局は秘密鍵の持ち主の身元を保証します。 + 例えば、アリスが個人証明書を申請したとすると、 + 認証局はアリスが証明書の申請が主張する通りの + 人物だということを確認しなくてはいけません。

    + +

    証明書階層構造

    + +

    認証局は他の認証局への証明書を発行することができます。 + 未知の証明書を調べる時に、アリスはその証明書の発行者 + に自信が持てるまで、発行者の証明書を + その上位階層の認証局をたどって調べる必要があります。 + 「悪質な」証明書の危険性を減らすため、 + 彼女は限られた連鎖の発行者のみ信頼するように + 決めることもできます。

    + + +

    最上位認証局の作成

    + +

    前に述べたように、全ての証明書について、 + 最上位の認証局(CA)までそれぞれの発行者が + 対象の身元証明の有効性を明らかにする必要があります。 + 問題は、誰がその最上位の認証機関の証明書を保証するのか、 + ということです。 + このような場合に限り、証明書は「自己署名」されます。 + つまり、証明書の発行者と証明対象が同じということになります。 + その結果、自己署名された証明書を信用するには + 細心の注意が必要です。 + 最上位認証局が公開鍵を広く公表することで、 + その鍵を信頼するリスクを低くすることができます。 + もし、他人がその認証局になりすました時に、それが露見しや + すいからです。 + 多くのブラウザは有名な認証局を信頼するように + 設定されています。

    + +

    Thawte + や VeriSign + のような多くの会社が認証局として開設しました。 + このような会社は以下のサービスを提供します:

    + +
      +
    • 証明書申請の確認
    • +
    • 証明書申請の処理
    • +
    • 証明書の発行と管理
    • +
    + +

    自分で認証局を作ることも可能です。 + インターネット環境では危険ですが、 + 個人やサーバの身元証明が簡単に行える組織の + イントラネット内では役に立つかもしれません。

    + + +

    証明書管理

    + +

    認証局の開設は徹底した管理、技術、運用の体制を必要とする + 責任のある仕事です。 + 認証局は証明書を発行するだけでなく、 + 管理もしなければなりません。 + 具体的には、証明書がいつまで有効かを決定し、更新し、 + また既に発行されたが失効した証明書のリスト + (Certificate Revocation Lists または CRL) + を管理しなければいけません。 + 例えば、アリスが会社から社員として証明書を与えられたとします。 + そして、アリスが会社を辞めるときには証明書を取り消さなければ + いけないとします。 + 証明書は次々と人に渡されていくものなので、 + 証明書そのものから、それが取り消されたか判断することは + 不可能です。 + よって、証明書の有効性を調べるときには、 + 認証局に連絡して CRL を照合する必要があります。 + 普通この過程は自動化されているものではありません。

    + +

    注意

    +

    デフォルトでブラウザに設定されていない認証局を使った場合、 + 認証局の証明書をブラウザに読み込んで、 + ブラウザがその認証局によって署名されたサーバの証明書を + 有効化する必要があります。 + 一度読み込まれると、その認証局によって署名された全ての + 証明書を受け入れるため、危険を伴います。

    +
    + + + +
    top
    +
    +

    Secure Sockets Layer (SSL)

    + +

    Secure Sockets Layer プロトコルは信頼性のあるコネクション型の +ネットワーク層のプロトコル(例えば、TCP/IP)と +アプリケーション層のプロトコル(例えば、HTTP) +の間に置くことができます。 +SSL は、相互認証によってサーバとクライアント間の安全な通信を、 +電子署名によってデータの完全性を、 +そして暗号化によってプライバシを提供します。

    + +

    SSL プロトコルは暗号化、ダイジェスト、電子署名について、 +様々なアルゴリズムをサポートするようにできています。 +こうすることで、法や輸出の規制を考慮に入れて、サーバに合わせた +アルゴリズムを選ぶことができ、また、新しいアルゴリズムを +利用していくことも可能にしています。 +アルゴリズムの選択はプロトコルセッション開始時に +サーバとクライアント間で取り決められます。

    + +

    表4: SSL プロトコルのバージョン

    + + + + + + + + + + + + + + + + + + + +
    バージョン出典説明ブラウザのサポート
    SSL v2.0Vendor Standard (Netscape Corp. より) [SSL2]実装が現存する初めての SSL プロトコル- NS Navigator 1.x/2.x
    + - MS IE 3.x
    + - Lynx/2.8+OpenSSL
    SSL v3.0Expired Internet Draft (Netscape Corp. より) [SSL3]特定のセキュリティ攻撃を防ぐための改訂、 + 非RSA 暗号の追加、証明書階層構造のサポート- NS Navigator 2.x/3.x/4.x
    + - MS IE 3.x/4.x
    + - Lynx/2.8+OpenSSL
    TLS v1.0Proposed Internet Standard (IETF より) [TLS1]MAC レイヤを HMAC へ更新、ブロック暗号の block + padding、メッセージ順序の標準化、警告文の充実などのため + SSL 3.0 を改訂。- Lynx/2.8+OpenSSL
    + + +

    表4に示されるとおり、SSL プロトコルには +いくつものバージョンがあります。 +表にも書かれているように、SSL 3.0 の利点の一つは +証明書階層構造をサポートすることです。 +この機能によって、サーバは自分の証明書に加えて、 +発行者の証明書をブラウザに渡すことができます。 +証明書階層構造によって、 +ブラウザに発行者の証明書が直接登録されていなくても、 +階層の中に含まれていれば、 +ブラウザはサーバの証明書を有効化することができます。 +SSL 3.0 は現在 Internet Engineering Task Force (IETF) +によって開発されている Transport Layer Security +[TLS] プロトコル標準規格の基礎となっています。

    + +

    セッションの確立

    + +

    図1で示されるように、 + セッションの確立はクライアントとサーバ間の + ハンドシェークシークエンスによって行なわれます。 + サーバが証明書を提供するか、クライアントの証明書をリクエストするか + というサーバの設定により、このシークエンスは異なるものとなります。 + 暗号情報の管理のために、追加のハンドシェーク過程が必要になる + 場合もありますが、この記事では + よくあるシナリオを手短に説明します。 + 全ての可能性についは、SSL 仕様書を参照してください。

    + +

    注意

    +

    一度 SSL セッションが確立すると、セッションを再利用することで、 + セッションを開始するための多くの過程を繰り返すという + パフォーマンスの損失を防ぎます。 + そのため、サーバは全てのセッションに一意なセッション識別名を + 割り当て、サーバにキャッシュし、クライアントは次回から + (識別名がサーバのキャッシュで期限切れになるまでは) + ハンドシェークなしで接続することができます。

    +
    + +

    +
    + 図1: SSL + ハンドシェークシークエンス概略

    + +

    サーバとクライアントで使われる + ハンドシェークシークエンスの要素を以下に示します:

    + +
      +
    1. データ通信に使われる暗号スイートの取り決め
    2. +
    3. クライアントとサーバ間でのセッション鍵の確立と共有
    4. +
    5. オプションとして、クライアントに対するサーバの認証
    6. +
    7. オプションとして、サーバに対するクライアントの認証
    8. +
    + +

    第一ステップの暗号スイート取り決めによって、 + サーバとクライアントはそれぞれにあった + 暗号スイートを選ぶことができます。 + SSL3.0 プロトコルの仕様書は 31 の暗号スイートを定義しています。 + 暗号スイートは以下のコンポーネントにより定義されています:

    + +
      +
    • 鍵の交換手段
    • +
    • データ通信の暗号術
    • +
    • Message Authentication Code (MAC) 作成のための + メッセージダイジェスト
    • +
    + +

    これらの三つの要素は以下のセクションで説明されています。

    + + +

    鍵の交換手段

    + +

    鍵の交換手段はアプリケーションのデータ通信に使われ、 + 共有される対称暗号鍵をどのようにがクライアントとサーバで + 取り決めるかを定義します。 + SSL 2.0 は RSA 鍵交換しか使いませんが、 + SSL 3.0 は証明書が使われるときは RSA 鍵交換を使い、 + 証明書が無く、クライアントとサーバの事前の通信が無い場合は + Diffie-Hellman 鍵交換を使う + など様々な鍵交換アルゴリズムをサポートします。

    + +

    鍵の交換方法における一つの選択肢は電子署名です。 + 電子署名を使うかどうか、また、 + どの種類の署名を使うかという選択があります。 + 秘密鍵で署名することで共有鍵を生成すし、情報交換する時の + マン・イン・ザ・ミドル攻撃を防ぐことができます。 + [AC96, p516]

    + + +

    データ通信の暗号術

    + +

    SSL はセッションのメッセージの暗号化に前述した + 従来型暗号(対称暗号)を用います。 + 暗号化しないという選択肢も含め九つの選択肢があります:

    + +
      +
    • 暗号化なし
    • +
    • ストリーム暗号 +
        +
      • 40-bit 鍵での RC4
      • +
      • 128-bit 鍵での RC4
      • +
    • +
    • CBC ブロック暗号 +
      • 40 bit 鍵での RC2
      • +
      • 40 bit 鍵での DES
      • +
      • 56 bit 鍵での DES
      • +
      • 168 bit 鍵での Triple-DES
      • +
      • Idea (128 bit 鍵)
      • +
      • Fortezza (96 bit 鍵)
      • +
    • +
    + +

    ここでの CBC とは暗号ブロック連鎖 (Cipher Block Chaining) + の略で、一つ前の暗号化された暗号文の一部が + ブロックの暗号化に使われることを意味します。 + DES はデータ暗号化標準規格 (Data Encryption Standard) + [AC96, ch12] の略で、 + DES40 や 3DES_EDE を含むいくつもの種類があります。 + Idea は最高なものの一つで、暗号術的には現在ある中で + 最も強力なものです。 + RC2 は RSA DSI による独占的なアルゴリズムです。 + [AC96, + ch13]

    + + +

    ダイジェスト関数

    + +

    + ダイジェスト関数の選択はレコードユニットからどのようにダイジェストが生成されるかを決定します。 + SSL は以下をサポートします:

    + +
      +
    • ダイジェストなし
    • +
    • MD5 (128-bit ハッシュ)
    • +
    • Secure Hash Algorithm (SHA-1) (160-bit ハッシュ)
    • +
    + +

    メッセージダイジェストは Message Authentication Code (MAC) + の生成に使われ、メッセージと共に暗号化され、メッセージの信用を + 提供し、リプレイ攻撃を防ぎます。

    + + +

    ハンドシェークシークエンスプロトコル

    + +

    ハンドシェークシークエンスは三つのプロトコルを使います:

    + +
      +
    • SSL ハンドシェークプロトコルは + クライアントとサーバ間での SSL セッションの確立に使われます。
    • +
    • SSL 暗号仕様変更プロトコルは + セッションでの暗号スイートの取り決めに使われます。
    • +
    • SSL 警告プロトコルは + クライアントサーバ間で SSL エラーを伝達するのに使われます。
    • +
    + +

    三つのプロトコルは、アプリケーションプロトコルデータとともに、 + 図2に示すとおり SSL レコードプロトコル + でカプセル化されます。 + カプセル化されたプロトコルはデータを検査しない + 下層のプロトコルによってデータとして伝達されます。 + カプセル化されたプロトコルは下層のプロトコルに関して一切関知しません。

    + +

    +
    + 図2: SSL プロトコルスタック +

    + +

    + レコードプロトコルによる SSL コントロールプロトコルのカプセル化は、 + アクティブなセッションの二回目の通信があった場合、 + コントロールプロトコルが安全であることを意味します。 + 既にセッションが無い場合は、Null 暗号スイートが使われ、 + 暗号化は行なわれず、セッションが確立するまでは + ダイジェストも無い状態となります。

    + + +

    データ通信

    + +

    図3に示される SSL レコードプロトコル + はクライアントとサーバ間のアプリケーションや + SSL コントロールデータの通信に使われます。 + このデータはより小さいユニットに分けられたり、 + いくつかの高級プロトコルをまとめて一ユニットとして通信が + 行なわれることもあります。 + データを圧縮し、ダイジェスト署名を添付して、 + これらのユニットを暗号化したのち、ベースとなっている + 信頼性のあるトランスポートプロトコルを用いるかもしれません。 + (注意: 現在メジャーな SLL 実装で圧縮をサポートしているものはありません)

    + +

    +
    + 図 3: SSL レコードプロトコル +

    + + +

    HTTP 通信の安全化

    + +

    よくある SSL の使い方はブラウザとウェブサーバ間の HTTP 通信 + の安全化です。 + これは、従来の安全ではない HTTP の使用を除外するものではありません。 + 安全化されたものは主に SSH 上の普通の HTTP で、HTTPS と呼ばれます。 + 大きな違いは、URL スキームに http の代わりに https + を用い、サーバが別のポートを使うことです (デフォルトでは443)。 + これが主に mod_ssl が Apache ウェブサーバに提供する機能です。

    + +
    top
    +
    +

    参考文献

    + +
    +
    [AC96]
    +
    Bruce Schneier, Applied Cryptography, 2nd Edition, Wiley, +1996. See http://www.counterpane.com/ for various other materials by Bruce +Schneier.
    + +
    [X208]
    +
    ITU-T Recommendation X.208, Specification of Abstract Syntax Notation +One (ASN.1), 1988. See for instance http://www.itu.int/rec/recommendation.asp?type=items&lang=e&parent=T-REC-X.208-198811-I. +
    + +
    [X509]
    +
    ITU-T Recommendation X.509, The Directory - Authentication +Framework. See for instance http://www.itu.int/rec/recommendation.asp?type=folders&lang=e&parent=T-REC-X.509. +
    + +
    [PKCS]
    +
    Public Key Cryptography Standards (PKCS), +RSA Laboratories Technical Notes, See http://www.rsasecurity.com/rsalabs/pkcs/.
    + +
    [MIME]
    +
    N. Freed, N. Borenstein, Multipurpose Internet Mail Extensions +(MIME) Part One: Format of Internet Message Bodies, RFC2045. +See for instance http://ietf.org/rfc/rfc2045.txt.
    + +
    [SSL2]
    +
    Kipp E.B. Hickman, The SSL Protocol, 1995. See http://www.netscape.com/eng/security/SSL_2.html.
    + +
    [SSL3]
    +
    Alan O. Freier, Philip Karlton, Paul C. Kocher, The SSL Protocol +Version 3.0, 1996. See http://www.netscape.com/eng/ssl3/draft302.txt.
    + +
    [TLS1]
    +
    Tim Dierks, Christopher Allen, The TLS Protocol Version 1.0, +1999. See http://ietf.org/rfc/rfc2246.txt.
    +
    +
    +
    +

    Available Languages:  en  | + ja 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/stopping.html b/rubbos/app/httpd-2.0.64/docs/manual/stopping.html new file mode 100644 index 00000000..df0155fb --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/stopping.html @@ -0,0 +1,29 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: stopping.html.de +Content-Language: de +Content-type: text/html; charset=ISO-8859-1 + +URI: stopping.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: stopping.html.es +Content-Language: es +Content-type: text/html; charset=ISO-8859-1 + +URI: stopping.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: stopping.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: stopping.html.ru.koi8-r +Content-Language: ru +Content-type: text/html; charset=KOI8-R + +URI: stopping.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/stopping.html.de b/rubbos/app/httpd-2.0.64/docs/manual/stopping.html.de new file mode 100644 index 00000000..9d8ee010 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/stopping.html.de @@ -0,0 +1,262 @@ + + + +Beenden und Neustarten - Apache HTTP Server + + + + + +
    <-
    +

    Beenden und Neustarten

    +
    +

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

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

    Dieses Dokument umfasst das Beenden und Neustarten des + Apache auf Unix-ähnlichen Systemen. Anwender von Windows NT, 2000 + und XP sollten Betreiben + des Apache als Dienst lesen, während hingegen Anwender von + Windows 9x sowie ME Betreiben + des Apache als Konsolenanwendung lesen sollten, um mehr Informationen + zur Handhabung des Apache auf diesen Systemen zu erhalten.

    +
    + +
    top
    +
    +

    Einleitung

    + +

    Um den Apache zu stoppen oder neu zu starten, müssen Sie + ein Signal an den laufenden httpd-Prozess senden. Es gibt + zwei Möglichkeiten, diese Signale zu senden. Zum einen können + Sie den Unix-Befehl kill verwenden, um den Prozessen + direkt Signale zu senden. Sie werden feststellen, dass auf Ihrem + System mehrere httpd-Programme laufen. Sie sollten + jedoch nicht jedem dieser Prozesse ein Signal senden, sondern nur dem + Elternprozess, dessen PID im PidFile steht. Das heißt, Sie + sollten es niemals nötig haben, einem anderen Prozess, als dem + Elternprozess, ein Signal zu senden. Es gibt drei Signale, die Sie an den + Elternprozess senden können: TERM, + HUP und + USR1, die nachfolgend beschrieben + werden.

    + +

    Um dem Elternprozess ein Signal zu senden, verwenden Sie einen + Befehl wie z.B.:

    + +

    kill -TERM `cat /usr/local/apache2/logs/httpd.pid`

    + +

    Die zweite Methode, dem httpd-Prozess zu + signalisieren, ist die Verwendung der -k-Befehlszeilenoptionen + stop, restart und graceful, wie + unten beschrieben. Dies sind Argumente des httpd-Programms, es wird jedoch + empfohlen, sie unter Verwendung des Steuerskripts apachectl zu senden, welches diese + an httpd durchreicht.

    + +

    Nachdem Sie httpd signalisiert haben, können Sie + dessen Fortschritt beobachten, indem Sie eingeben:

    + +

    tail -f /usr/local/apache2/logs/error_log

    + +

    Passen Sie diese Beispiele entsprechend Ihren ServerRoot- und PidFile-Einstellungen an.

    +
    top
    +
    +

    Beenden

    + +
    Signal: TERM
    +
    apachectl -k stop
    +
    + +

    Das Senden des TERM- oder stop-Signals an + den Elternprozess veranlasst diesen, sofort zu versuchen, alle seine + Kindprozesse zu beenden. Es kann einige Sekunden dauern, bis alle + Kindprozesse komplett beendet sind. Danach beendet sich der Elternprozess + selbst. Alle gerade bearbeiteten Anfragen werden abgebrochen. + Es werden keine weiteren Anfragen mehr bedient.

    +
    top
    +
    +

    Unterbrechungsfreier Neustart

    + +
    Signal: USR1
    +
    apachectl -k graceful
    +
    + +

    Das USR1- oder graceful-Signal + veranlasst den Elternprozess, die Kinder anzuweisen, sich + nach Abschluß ihrer momentanen bearbeiteten Anfrage zu beenden + (oder sich sofort zu beenden, wenn sie gerade keine Anfrage bedienen). + Der Elternprozess liest seine Konfigurationsdateien erneut ein und + öffnet seine Logdateien neu. Wenn ein Kindprozess stirbt, + ersetzt der Elternprozess ihn durch ein Kind der neuen + Konfigurations-Generation. Dieses beginnt sofort damit, + neue Anfragen zu bedienen.

    + +
    Auf bestimmten Plattformen, welche kein USR1 + für einen unterbrechungsfreien Neustart erlauben, kann ein + alternatives Signal verwendet werden (wie z.B. + WINCH). Der Befehl apachectl graceful + sendet das jeweils richtige Signal für Ihre Platform.
    + +

    Der Code ist dafür ausgelegt, stets die MPM-Direktiven + zur Prozesssteuerung zu beachten, so dass die Anzahl der Prozesse + und Threads, die zur Bedienung der Clients bereitstehen, während + des Neustarts auf die entsprechenden Werte gesetzt werden. + Weiterhin wird StartServers + auf folgende Art und Weise interpretiert: Wenn nach einer Sekunde + nicht mindestens StartServers + neue Kindprozesse erstellt wurden, dann werden, um den Durchsatz zu + beschleunigen, entsprechend weitere erstellt. Auf diese Weise versucht + der Code sowohl die Anzahl der Kinder entsprechend der Serverlast + anzupassen als auch Ihre Wünsche hinsichtlich des Parameters + StartServers zu + berücksichtigen.

    + +

    Benutzer von mod_status werden feststellen, + dass die Serverstatistiken nicht auf Null + zurückgesetzt werden, wenn ein USR1 gesendet + wurde. Der Code wurde so geschrieben, dass sowohl die Zeit minimiert + wird, in der der Server nicht in der Lage ist, neue Anfragen zu + bedienen (diese werden vom Betriebssystem in eine Warteschlange + gestellt, so dass sie auf keinen Fall verloren gehen) als auch + Ihre Parameter zur Feinabstimmung berücksichtigt werden. + Um dies zu erreichen, muss die Statustabelle (Scoreboard), + die dazu verwendet wird, alle Kinder über mehrere Generationen + zu verfolgen, erhalten bleiben.

    + +

    Das Statusmodul benutzt außerdem ein G, um + diejenigen Kinder zu kennzeichen, die noch immer Anfragen bedienen, + welche gestartet wurden, bevor ein unterbrechungsfreier Neustart + veranlaßt wurde.

    + +

    Derzeit gibt es keine Möglichkeit für ein + Log-Rotationsskript, das USR1 verwendet, sicher + festzustellen, dass alle Kinder, die in ein vor dem Neustart + geöffnetes Log schreiben, beendet sind. Wir schlagen vor, dass + Sie nach dem Senden des Signals USR1 eine angemessene + Zeitspanne warten, bevor Sie das alte Log anfassen. Wenn beispielsweise + die meisten Ihrer Zugriffe bei Benutzern mit niedriger Bandbreite + weniger als 10 Minuten für eine vollständige Antwort + benötigen, dann könnten Sie 15 Minuten warten, bevor Sie auf + das alte Log zugreifen.

    + +
    Wenn Ihre Konfigurationsdatei Fehler enthält, während + Sie einen Neustart anweisen, dann wird Ihr Elternprozess nicht neu starten, + sondern sich mit einem Fehler beenden. Im Falle eines unterbrechungsfreien + Neustarts läßt er die Kinder weiterlaufen, wenn er sich beendet. + (Dies sind die Kinder, die sich "sanft beenden", indem sie ihre letzte + Anfrage erledigen.) Das verursacht Probleme, wenn Sie versuchen, + den Server neu zu starten -- er ist nicht in der Lage, sich an die Ports zu + binden, an denen er lauschen soll. Bevor Sie einen Neustart + durchführen, können Sie die Syntax der Konfigurationsdateien + mit dem Befehlszeilenargument -t überprüfen + (siehe auch httpd). Das garantiert + allerdings nicht, dass der Server korrekt starten wird. Um sowohl die + Syntax als auch die Semantik der Konfigurationsdateien zu prüfen, + können Sie versuchen, httpd als nicht-root-Benutzer + zu starten. Wenn dabei keine Fehler auftreten, wird er versuchen, seine + Sockets und Logdateien zu öffnen und fehlschlagen, da er nicht root + ist (oder weil sich der gegenwärtig laufende httpd + bereits diese Ports gebunden hat). Wenn er aus einem anderen Grund + fehlschlägt, dann liegt wahrscheinlich ein Konfigurationsfehler vor. + Der Fehler sollte behoben werden, bevor der unterbrechungsfreie Neustart + angewiesen wird.
    +
    top
    +
    +

    Neustarten

    + +
    Signal: HUP
    +
    apachectl -k restart
    +
    + +

    Das Senden des Signals HUP oder restart + veranlaßt den Elternprozess, wie bei TERM alle seine + Kinder zu beenden. Der Elternprozess beendet sich jedoch nicht. Er liest + seine Konfigurationsdateien neu ein und öffnet alle Logdateien + erneut. Dann erzeugt er einen neuen Satz Kindprozesse und setzt die + Bedienung von Zugriffen fort.

    + +

    Benutzer von mod_status werden feststellen, dass + die Serverstatistiken auf Null gesetzt werden, wenn ein HUP + gesendet wurde.

    + +
    Wenn Ihre Konfigurationsdatei einen Fehler enthält, + während Sie einen Neustart anweisen, dann wird Ihr Elternprozess + nicht neu starten, sondern sich mit einem Fehler beenden. Lesen Sie oben, + wie Sie das vermeiden können.
    +
    top
    +
    +

    Anhang: Signale und Wettkampfsituationen

    + +

    Vor der Version 1.2b9 des Apache existierten verschiedene + Wettkampfsituationen (race conditions), die den Neustart und + die Signale beeinflußt haben. (Einfach erklärt ist eine + Wettkampfsituation ein zeitabhängiges Problem - wenn + etwas zum falschen Zeitpunkt erfolgt oder Dinge in der falschen + Reihenfolge passieren, ist unerwartetes Verhalten die Folge. Wenn die + gleichen Dinge zur richtigen Zeit geschehen, funktioniert alles korrekt.) + Bei Architekturen mit dem "richtigen" Funktionsumfang + haben wir so viele eliminiert wie wir nur konnten. Dennoch + sollte beachtet werden, dass noch immer Wettkampfsituationen auf + bestimmten Architekturen existieren.

    + +

    Bei Architekturen, die ein ScoreBoardFile auf Platte verwenden, + besteht die Gefahr, dass die Statustabelle beschädigt wird. + Das kann zu "bind: Address already in use" ("bind: Adresse wird + bereits verwendet", nach einem HUP) oder "long lost + child came home!" ("Der verlorene Sohn ist heimgekehrt", nach einem + USR1) führen. Ersteres ist ein schwerer Fehler, + wärend letzteres lediglich bewirkt, dass der Server einen Eintrag + in der Statustabelle verliert. So kann es ratsam sein, unterbrechungsfreie + Neustarts zusammen mit einem gelegentlichen harten Neustart zu verwenden. + Diese Probleme lassen sich nur sehr schwer umgehen, aber + glücklicherweise benötigen die meisten Architekturen keine + Statustabelle in Form einer Datei. Bitte lesen Sie für Architekturen, + die sie benötigen, die Dokumentation zu ScoreBoardFile.

    + +

    Alle Architekturen haben in jedem Kindprozess eine kleine + Wettkampfsituation, welche die zweite und nachfolgende Anfragen + einer persistenten HTTP-Verbindung (KeepAlive) umfaßt. Der Prozess + kann nach dem Lesen der Anfragezeile aber vor dem Lesen der Anfrage-Header + enden. Es existiert eine Korrektur, die für 1.2 zu spät kam. + Theoretisch sollte das kein Problem darstellen, da + der KeepAlive-Client derartige Ereignisse aufgrund von + Netzwerk-Latenzzeiten und Auszeiten des Servers erwarten sollte. + In der Praxis scheint keiner von beiden beeinflußt zu werden + -- in einem Testfall wurde der Server zwanzig mal + pro Sekunde neu gestartet, während Clients das Angebot abgegrast + haben, ohne kaputte Bilder oder leere Dokumente zu erhalten.

    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/stopping.html.en b/rubbos/app/httpd-2.0.64/docs/manual/stopping.html.en new file mode 100644 index 00000000..3fb04a00 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/stopping.html.en @@ -0,0 +1,235 @@ + + + +Stopping and Restarting - Apache HTTP Server + + + + + +
    <-
    +

    Stopping and Restarting

    +
    +

    Available Languages:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + +

    This document covers stopping and restarting Apache on + Unix-like systems. Windows NT, 2000 and XP users should see + Running Apache as a + Service and Windows 9x and ME users should see Running Apache as a + Console Application for information on how to control + Apache on those platforms.

    +
    + +
    top
    +
    +

    Introduction

    + +

    In order to stop or restart Apache, you must send a signal to + the running httpd processes. There are two ways to + send the signals. First, you can use the unix kill + command to directly send signals to the processes. You will + notice many httpd executables running on your system, + but you should not send signals to any of them except the parent, + whose pid is in the PidFile. That is to say you + shouldn't ever need to send signals to any process except the + parent. There are three signals that you can send the parent: + TERM, + HUP, and + USR1, which + will be described in a moment.

    + +

    To send a signal to the parent you should issue a command + such as:

    + +

    kill -TERM `cat /usr/local/apache2/logs/httpd.pid`

    + +

    The second method of signaling the httpd processes + is to use the -k command line options: stop, + restart, and graceful, + as described below. These are arguments to the httpd binary, but we recommend that + you send them using the apachectl control script, which + will pass them through to httpd.

    + +

    After you have signaled httpd, you can read about + its progress by issuing:

    + +

    tail -f /usr/local/apache2/logs/error_log

    + +

    Modify those examples to match your ServerRoot and PidFile settings.

    +
    top
    +
    +

    Stop Now

    + +
    Signal: TERM
    +
    apachectl -k stop
    +
    + +

    Sending the TERM or stop signal to + the parent causes it to immediately attempt to kill off all of its + children. It may take it several seconds to complete killing off + its children. Then the parent itself exits. Any requests in + progress are terminated, and no further requests are served.

    +
    top
    +
    +

    Graceful Restart

    + +
    Signal: USR1
    +
    apachectl -k graceful
    +
    + +

    The USR1 or graceful signal causes + the parent process to advise the children to exit after + their current request (or to exit immediately if they're not + serving anything). The parent re-reads its configuration files and + re-opens its log files. As each child dies off the parent replaces + it with a child from the new generation of the + configuration, which begins serving new requests immediately.

    + +
    On certain platforms that do not allow USR1 to + be used for a graceful restart, an alternative signal may be used (such + as WINCH). The command apachectl graceful + will send the right signal for your platform.
    + +

    This code is designed to always respect the process control + directive of the MPMs, so the number of processes and threads + available to serve clients will be maintained at the appropriate + values throughout the restart process. Furthermore, it respects + StartServers in the + following manner: if after one second at least StartServers new children have not + been created, then create enough to pick up the slack. Hence the + code tries to maintain both the number of children appropriate for + the current load on the server, and respect your wishes with the + StartServers + parameter.

    + +

    Users of mod_status + will notice that the server statistics are not + set to zero when a USR1 is sent. The code was + written to both minimize the time in which the server is unable + to serve new requests (they will be queued up by the operating + system, so they're not lost in any event) and to respect your + tuning parameters. In order to do this it has to keep the + scoreboard used to keep track of all children across + generations.

    + +

    The status module will also use a G to indicate + those children which are still serving requests started before + the graceful restart was given.

    + +

    At present there is no way for a log rotation script using + USR1 to know for certain that all children writing + the pre-restart log have finished. We suggest that you use a + suitable delay after sending the USR1 signal + before you do anything with the old log. For example if most of + your hits take less than 10 minutes to complete for users on + low bandwidth links then you could wait 15 minutes before doing + anything with the old log.

    + +
    If your configuration file has errors + in it when you issue a restart then your parent will not + restart, it will exit with an error. In the case of graceful + restarts it will also leave children running when it exits. + (These are the children which are "gracefully exiting" by + handling their last request.) This will cause problems if you + attempt to restart the server -- it will not be able to bind to + its listening ports. Before doing a restart, you can check the + syntax of the configuration files with the -t + command line argument (see httpd). This still will not + guarantee that the server will restart correctly. To check the + semantics of the configuration files as well as the syntax, you + can try starting httpd as a non-root user. If there + are no errors it will attempt to open its sockets and logs and fail + because it's not root (or because the currently running + httpd already has those ports bound). If it fails + for any other reason then it's probably a config file error and the error + should be fixed before issuing the graceful restart.
    +
    top
    +
    +

    Restart Now

    + +
    Signal: HUP
    +
    apachectl -k restart
    +
    + +

    Sending the HUP or restart signal to + the parent causes it to kill off its children like in + TERM, but the parent doesn't exit. It re-reads its + configuration files, and re-opens any log files. Then it spawns a + new set of children and continues serving hits.

    + +

    Users of mod_status + will notice that the server statistics are set to zero when a + HUP is sent.

    + +
    If your configuration file has errors in it when you issue a +restart then your parent will not restart, it will exit with an +error. See above for a method of avoiding this.
    +
    top
    +
    +

    Appendix: signals and race conditions

    + +

    Prior to Apache 1.2b9 there were several race + conditions involving the restart and die signals (a simply put, + a race condition is a time-sensitive problem - if something happens + at just the wrong time or things happen in the wrong order, + undesired behaviour will result. If the same thing happens at the right + time, all will be well). For those architectures that have the "right" + feature set we have eliminated as many as we can. But it should + be noted that race conditions do still exist on certain + architectures.

    + +

    Architectures that use an on-disk ScoreBoardFile can potentially have + their scoreboards corrupted. This can result in the "bind: + Address already in use" (after HUP) or "long lost + child came home!" (after USR1). The former is a fatal + error, while the latter just causes the server to lose a + scoreboard slot. So it may be advisable to use graceful + restarts, with an occasional hard restart. These problems are very + difficult to work around, but fortunately most architectures do + not require a scoreboard file. See the ScoreBoardFile documentation for + architecture which uses it.

    + +

    All architectures have a small race condition in each child + involving the second and subsequent requests on a persistent + HTTP connection (KeepAlive). It may exit after reading the + request line but before reading any of the request headers. + There is a fix that was discovered too late to make 1.2. In + theory this isn't an issue because the KeepAlive client has to + expect these events because of network latencies and server + timeouts. In practice it doesn't seem to affect anything either + -- in a test case the server was restarted twenty times per + second and clients successfully browsed the site without + getting broken images or empty documents.

    +
    +
    +

    Available Languages:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/stopping.html.es b/rubbos/app/httpd-2.0.64/docs/manual/stopping.html.es new file mode 100644 index 00000000..9971b830 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/stopping.html.es @@ -0,0 +1,272 @@ + + + +Iniciar y Parar el servidor Apache - Servidor HTTP Apache + + + + + +
    <-
    +

    Iniciar y Parar el servidor Apache

    +
    +

    Idiomas disponibles:  de  | + en  | + es  | + ja  | + ko  | + ru  | + 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 explica como iniciar y parar el servidor Apache + en sistemas tipo Unix. Los usuarios de Windows NT, 2000 y XP + deben consultar la sección Ejecutar Apache como un + servicio y los usuario de Windows 9x y ME deben consultar Ejecutar Apache como una + Aplicación de Consola para obtener información + sobre como controlar Apache en esas plataformas.

    +
    + +
    top
    +
    +

    Introducción

    + +

    Para parar y reiniciar Apache, hay que enviar la señal + apropiada al proceso padre httpd que se esté + ejecutando. Hay dos maneras de enviar estas señales. En + primer lugar, puede usar el comando de Unix kill que + envía señales directamente a los procesos. Puede que + tenga varios procesos httpd ejecutandose en su + sistema, pero las señales deben enviarse solamente al proceso + padre, cuyo pid está especificado en la directiva PidFile. Esto quiere decir que no + debe necesitar enviar señales a ningún proceso excepto + al proceso padre. Hay tres señales que puede enviar al + proceso padre: TERM, HUP, y USR1, que van a ser descritas a + continuación.

    + +

    Para enviar una señal al proceso padre debe escribir un + comando como el que se muestra en el ejemplo:

    + +

    kill -TERM `cat /usr/local/apache2/logs/httpd.pid`

    + +

    La segunda manera de enviar señales a los procesos + httpd es usando las opciones de línea de + comandos -k: stop, restart, + y graceful, como se muestra más abajo. Estas + opciones se le pueden pasar al binario httpd, + pero se recomienda que se pasen al script de control + apachectl, que a su vez los pasará a + httpd.

    + +

    Después de haber enviado las señales que desee a + httpd, puede ver cómo progresa el proceso + escribiendo:

    + +

    tail -f /usr/local/apache2/logs/error_log

    + +

    Modifique estos ejemplos para que coincidan con la + configuración que tenga especificada en las directivas + ServerRoot y PidFile en su fichero principal de + configuración.

    +
    top
    +
    +

    Parar Apache

    + +
    Señal: TERM
    +
    apachectl -k stop
    +
    + +

    Enviar las señales TERM o stop + al proceso padre hace que se intenten eliminar todos los procesos + hijo inmediatamente. Esto puede tardar algunos minutos. Una vez + que hayan terminado todos los procesos hijo, terminará el + proceso padre. Cualquier petición en proceso terminará + inmediatanmente, y ninguna petición posterior será + atendida.

    +
    top
    +
    +

    Reinicio Graceful

    + +
    Señal: USR1
    +
    apachectl -k graceful
    +
    + +

    Las señales USR1 o graceful + hacen que el proceso padre indique a sus hijos que + terminen después de servir la petición que estén + atendiendo en ese momento (o de inmediato si no están + sirviendo ninguna petición). El proceso padre lee de nuevo + sus ficheros de configuración y vuelve a abrir sus ficheros + log. Conforme cada hijo va terminando, el proceso padre lo va + sustituyendo con un hijo de una nueva generación con + la nueva configuración, que empeciezan a servir peticiones + inmediatamente.

    + +
    En algunas plataformas que no permiten usar + USR1 para reinicios graceful, puede usarse una + señal alternativa (como WINCH). Tambien puede + usar apachectl graceful y el script de control + enviará la señal adecuada para su plataforma.
    + +

    Apache está diseñado para respetar en todo momento la + directiva de control de procesos de los MPM, así como para + que el número de procesos y hebras disponibles para servir a + los clientes se mantenga en los valores adecuados durante el + proceso de reinicio. Aún más, está diseñado + para respetar la directiva StartServers de la siguiente + manera: si después de al menos un segundo el nuevo hijo de la + directiva StartServers + no ha sido creado, entonces crea los suficientes para se atienda + el trabajo que queda por hacer. Así, se intenta mantener + tanto el número de hijos adecuado para el trabajo que el + servidor tenga en ese momento, como respetar la configuración + determinada por los parámetros de la directiva + StartServers.

    + +

    Los usuarios del módulo mod_status + notarán que las estadísticas del servidor + no se ponen a cero cuando se usa la señal + USR1. Apache fue escrito tanto para minimizar el + tiempo en el que el servidor no puede servir nuevas peticiones + (que se pondrán en cola por el sistema operativo, de modo que + se no se pierda ningún evento), como para respetar sus + parámetros de ajuste. Para hacer esto, tiene que guardar el + scoreboard usado para llevar el registro de los procesos + hijo a través de las distintas generaciones.

    + +

    El mod_status también usa una G para indicar + que esos hijos están todavía sirviendo peticiones + previas al reinicio graceful.

    + +

    Actualmente no existe ninguna manera de que un script con un + log de rotación usando USR1 sepa con seguridad + que todos los hijos que se registraron en el log con anterioridad + al reinicio han terminado. Se aconseja que se use un retardo + adecuado después de enviar la señal USR1 + antes de hacer nada con el log antiguo. Por ejemplo, si la mayor + parte las visitas que recibe de usuarios que tienen conexiones de + baja velocidad tardan menos de 10 minutos en completarse, entoces + espere 15 minutos antes de hacer nada con el log antiguo.

    + +
    Si su fichero de configuración tiene errores cuando + haga el reinicio, entonces el proceso padre no se reinciciará + y terminará con un error. En caso de un reinicio graceful, + también dejará a los procesos hijo ejecutandose mientras + existan. (Estos son los hijos de los que se está saliendo de + forma graceful y que están sirviendo sus últimas + peticiones.) Esto provocará problemas si intenta reiniciar el + servidor -- no será posible conectarse a la lista de puertos + de escucha. Antes de reiniciar, puede comprobar que la sintaxis de + sus ficheros de configuracion es correcta con la opción de + línea de comandos -t (consulte + httpd). No obstante, esto no garantiza que el + servidor se reinicie correctamente. Para comprobar que no hay + errores en los ficheros de configuración, puede intentar + iniciar httpd con un usuario diferente a root. Si no + hay errores, intentará abrir sus sockets y logs y + fallará porque el usuario no es root (o porque el + httpd que se está ejecutando en ese momento ya + está conectado a esos puertos). Si falla por cualquier otra + razón, entonces casi seguro que hay algún error en + alguno de los ficheros de configuración y debe corregir ese o + esos errores antes de hacer un reinicio graceful.
    +
    top
    +
    +

    Reiniciar Apache

    + +
    Señal: HUP
    +
    apachectl -k restart
    +
    + +

    El envío de las señales HUP o + restart al proceso padre hace que los procesos hijo + terminen como si le enviá ramos la señal + TERM, para eliminar el proceso padre. La diferencia + está en que estas señales vuelven a leer los archivos de + configuración y vuelven a abrir los ficheros log. Se genera + un nuevo conjunto de hijos y se continúa sirviendo + peticiones.

    + +

    Los usuarios del módulo mod_status + notarán que las estadísticas del servidor se ponen a + cero cuando se envía la señal HUP.

    + +
    Si su fichero de configuración contiene errores, cuando +intente reiniciar, el proceso padre del servidor no se +reiniciará, sino que terminará con un error. Consulte +más arriba cómo puede solucionar este problema.
    +
    top
    +
    +

    Apéndice: señales y race conditions

    + +

    Con anterioridad a la versión de Apache 1.2b9 había + varias race conditions implicadas en las señales + para parar y reiniciar procesos (una descripción sencilla de + una race condition es: un problema relacionado con el momento en + que suceden las cosas, como si algo sucediera en momento en que no + debe, y entonces el resultado esperado no se corresponde con el + obtenido). Para aquellas arquitecturas que tienen el conjunto de + características "adecuadas", se han eliminado tantas race + conditions como ha sido posible. Pero hay que tener en cuenta que + todavía existen race conditions en algunas arquitecturas.

    + +

    En las arquitecturas que usan un ScoreBoardFile en disco, existe la + posibilidad de que se corrompan los scoreboards. Esto puede hacer + que se produzca el error "bind: Address already in use" + (después de usarHUP) o el error "long lost child + came home!" (después de usar USR1). En el + primer caso se trata de un error irrecuperable, mientras que en el + segundo, solo ocurre que el servidor pierde un slot del + scoreboard. Por lo tanto, sería aconsejable usar reinicios + graceful, y solo hacer reinicios normales de forma + ocasional. Estos problemas son bastante complicados de solucionar, + pero afortunadamente casi ninguna arquitectura necesita un fichero + scoreboard. Consulte la documentación de la directiva + ScoreBoardFile para ver + las arquitecturas que la usan.

    + +

    Todas las arquitecturas tienen una pequeña race condition + en cada proceso hijo implicada en la segunda y subsiguientes + peticiones en una conexión HTTP persistente + (KeepAlive). Puede ser que el servidor termine después de + leer la línea de petición pero antes de leer cualquiera + de las cebeceras de petición. Hay una solución que fue + descubierta demasiado tarde para la incluirla en versión + 1.2. En teoria esto no debe suponer ningún problema porque el + cliente KeepAlive ha de esperar que estas cosas pasen debido a los + retardos de red y a los timeouts que a veces dan los + servidores. En la practica, parece que no afecta a nada más + -- en una sesión de pruebas, un servidor se reinició + veinte veces por segundo y los clientes pudieron navegar sin + problemas por el sitio web sin encontrar problemas ni para + descargar una sola imagen ni encontrar un solo enlace roto.

    +
    +
    +

    Idiomas disponibles:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/stopping.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/stopping.html.ja.utf8 new file mode 100644 index 00000000..5229e1b8 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/stopping.html.ja.utf8 @@ -0,0 +1,261 @@ + + + +停止と再起動 - Apache HTTP サーバ + + + + + +
    <-
    +

    停止と再起動

    +
    +

    Available Languages:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    +
    This translation may be out of date. Check the + English version for recent changes.
    + +

    この文書では Unix に類似したシステムでの + Apache の停止と再起動について扱っています。 + Windows NT, 2000, XP ユーザはサービスとして + Apache を実行するで、Windows 9x, MEユーザはコンソールアプリケーションとして + Apache を実行するで、 + これらのプラットホームでの使用方法をご覧下さい。

    +
    + +
    top
    +
    +

    イントロダクション

    + +

    Apache を停止したり再起動したりするためには、実行されている + httpd プロセスにシグナルを送る必要があります。 + シグナルを送るには二つの方法があります。 + 一つ目はプロセスに直接シグナルを送る unix の kill + コマンドを使用する方法です。 + システムを見ればたくさんの httpd が + 実行されているのに気が付くでしょうが、シグナルを送るのは + 親プロセスだけで、それ以外の個々のプロセスには + シグナルを送らないで下さい。その親プロセスの pid は + PidFile + に書かれています。これはつまり、親以外のプロセスに + シグナルを送る必要すらない、ということです。 + 親プロセスに送ることができる 3 種類のシグナルがあります: + TERM, + HUP, + USR1 + です。これらの説明については続きをご覧下さい。

    + +

    親プロセスにシグナルを送るには、 + 次のようなコマンドを発行して下さい:

    + +

    kill -TERM `cat /usr/local/apache2/logs/httpd.pid`

    + +

    httpd プロセスにシグナルを送る 2 番目の方法は + -k というコマンドライン引数を使用することです。 + 下で説明されているように、stop, restart, + graceful を指定できます。 + これらは httpd の引数ですが、 + 制御用のスクリプト apachectl を + 使うことをお薦めします。apachectl はそれらの引数をそのまま + httpd に渡します。

    + +

    httpd にシグナルを送った後、 + 実行状況を次のコマンドで読むことができます:

    + +

    tail -f /usr/local/apache2/logs/error_log

    +

    ここに挙げた例は、各自の + ServerRoot + と + PidFile + の設定に適合するように適宜修正して下さい。

    +
    top
    +
    +

    急な停止

    + +
    シグナル: TERM
    +
    apachectl -k stop
    +
    + +

    TERM あるいは stop + シグナルを親プロセスに送ると、即座に子プロセス全てを kill しようとします。 + 子プロセスを完全に kill し終わるまでに数秒かかるかもしれません。 + その後、親プロセス自身が終了します。 + 処理中のリクエストは全て停止され、もはやリクエストに対する + 応答はされません。

    +
    top
    +
    +

    緩やかな再起動

    + +
    シグナル: USR1
    +
    apachectl -k graceful
    +
    + +

    親プロセスは USR1 あるいは graceful + シグナルを受け取ると、子プロセスに現在のリクエストの処理の後に終了する + (あるいは何もしていなければすぐに終了する) + ように助言します。 + 親プロセスは設定ファイルを再読込して、ログファイルを開き直します。 + 子プロセスが徐々になくなるに従って、 + 新しい世代の設定による子プロセスに置き換えていきます。 + そして、これらが新たなリクエストに即座に応答し始めます。

    + +
    特定のプラットホームでは USR1 + を緩やかな再起動のために使うことができませんが、代わりのシグナル + (例えば WINCH) が使用できるでしょう。 + apachectl graceful + というコマンドはプラットホームに合ったシグナルを送ります。
    + +

    このコードは常に + MPM のプロセス制御ディレクティブの設定を重視しますので、 + クライアントのリクエストを扱うプロセスとスレッドの数を再起動の処理中も + 適切な値に維持されます。。また、次のようにして + StartServers + を守ります: + 少なくとも 1 秒後に StartServers 個の新しい子プロセスが + 生成されていなければ、その数になるように適宜プロセスを生成します。 + この挙動は現在の負荷に対して適切な子プロセスの数と + StartServers パラメータでの + 希望の数の両方を維持しようとしています。

    + +

    mod_status を + 使用している場合は、USR1 シグナルが送られた際に + サーバ統計がゼロに設定されないことに + 注意してください。 + サーバが新しいリクエストに応答不能な時間を最小にするように + (リクエストは OS によってキューに追加されるので絶対に紛失はしません)、 + また同時に、希望のチューニングパラメータを守るように + コードは書かれています。 + このようにするために、世代をまたがった全子プロセスの追跡に使われている + スコアボードを維持しなければなりません。

    + +

    status モジュールは、緩やかな再起動以前から開始して + リクエストに応答し続けている子プロセスを特定するために、 + G を使うこともします。

    + +

    現在、USR1 を使うログ移動スクリプトでは、 + 再起動前の子プロセスがログを書き終わったことを確証する方法が + ありません。古いログに対して何かする前に、 + USR1 シグナルを送った後いくらか適当な時間待つことを + 提案します。例えば、帯域の狭い通信路のユーザのリクエストのほとんどが 10 + 分以下で完了しているということが分かっていれば、 + 古いログに何かする前に 15 分待つということです。

    + +
    再起動時に設定ファイルに誤りがあると、 + 親プロセスは再起動せずにエラーとともに終了します。 + 緩やかな再起動の場合は、親プロセスが終了した後でも子プロセスが + 実行されたまま放置されたりもします。 + (最後のリクエストを処理した後「緩やかに終了」する + 子プロセスとなります。) + サーバを再起動する際に、これが問題になるかもしれません + -- サーバは listen するポートにバインドできないかもしれません。 + 再起動する前に、設定ファイルの構文を -t + コマンドライン引数 + (httpd をご覧下さい) + を使って検証することができます。 + 設定ファイルの意味的な内容を構文と同様に検証したい場合は、 + 非 root ユーザで httpd を起動しようとすればわかります。 + もしエラーがなければ、ソケットやログを開こうとして + root でないため + (もしくは実行中の httpd + が既に必要なポートにバインドしているため) + に失敗するでしょう。 + これ以外の理由で起動に失敗したのであれば、 + それは設定ファイルのエラーで、 + 緩やかな再起動を行う前にその誤りを修正しなければなりません。
    +
    top
    +
    +

    急な再起動

    + +
    シグナル: HUP
    +
    apachectl -k restart
    +
    + +

    HUP あるいは restart シグナルを親プロセスに送ると、 + TERM と同様に子プロセスを kill しますが、 + 親プロセスは終了しません。 + 設定ファイルを再読込して、ログファイル全てを開き直します。 + その後、新しい子プロセスを起動して応答を続けます。

    + +

    mod_status + を使っている場合は、HUP が送られた場合に + サーバ統計がゼロに設定されることに注意してください。

    + +
    再起動時に設定ファイルに誤りがあると、 + 親プロセスは再起動せずにエラーとともに終了します。 + これを避けるには次の方法をご覧下さい。
    +
    top
    +
    +

    付録: シグナルと競合状態

    + +

    Apache 1.2b9 以前は、再起動や停止のシグナルを含む競合状態 + (競合状態を簡単に説明すると: タイミンにグよる問題で、 + 具合の悪い時間帯にちょうど何かが起こると予想外の動作をする + ようなことを指します) がありました。 + 「正しい」機能を持っているアーキテクチャでは、できるだけ + このようなことが起こらないようにしています。 + しかし、ある種のアーキテクチャでは競合状態は未だ確実に起こりえる + ということに注意してください。

    + +

    ディスク上で + ScoreBoardFile + を使用しているアーキテクチャでは、 + 潜在的にスコアボードが壊れる可能性があります。 + スコアボードが壊れた場合は、 + "bind: Address already in use" (HUP 後) や + "long lost child came home!" (USR1 後) + といった結果になります。 + 前者は致命的なエラーですが、 + 後者はスコアボードスロットを失うだけです。 + ですから緩やかな再起動は、たまに確実な再起動 (HUP) + も併用して使った方が良いでしょう。 + これらの問題を克服するのは非常に難しいのですが、 + 幸いなことに大部分のアーキテクチャではスコアボードのファイルは必要ありません。 + これを使用するアーキテクチャは、 + ScoreBoardFile + をご覧下さい。

    + +

    全てのアーキテクチャにおいて、個々の子プロセスで + 継続的な HTTP コネクション (KeepAlive) + に関する小さな競合状態が起こりえます。 + リクエスト行を読んだ後、そしてリクエストヘッダを読む前に + 子プロセスは終了するかも知れません。 + これに対する修正がありますが 1.2 で修正するには発見が遅すぎました。 + 理論的には、これは問題ではありません。 + なぜなら KeepAlive のクライアントは、ネットワーク遅延や + サーバのタイムアウトなどに備えていなければならないからです。 + 実際にも何か影響があるようには見えません + -- テストケースでサーバを 1 秒間に 20 回再起動しても + クライアントは壊れた画像や空のドキュメントを受け取ることなく + 正常に閲覧できています。

    +
    +
    +

    Available Languages:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/stopping.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/stopping.html.ko.euc-kr new file mode 100644 index 00000000..6c9ef12d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/stopping.html.ko.euc-kr @@ -0,0 +1,209 @@ + + + +Áß´Ü°ú Àç½ÃÀÛ - Apache HTTP Server + + + + + +
    <-
    +

    Áß´Ü°ú Àç½ÃÀÛ

    +
    +

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

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

    ÀÌ ¹®¼­´Â À¯´Ð½º·ù ½Ã½ºÅÛ¿¡¼­ ¾ÆÆÄÄ¡¸¦ Áß´ÜÇÏ°í Àç½ÃÀÛÇÏ´Â + ³»¿ëÀ» ´ã°íÀÖ´Ù. À©µµ¿ìÁî NT, 2000, XP »ç¿ëÀÚ´Â ¼­ºñ½º·Î ¾ÆÆÄÄ¡ + ½ÇÇàÇϱ⿡¼­, À©µµ¿ìÁî 9x¿Í ME »ç¿ëÀÚ´Â ÄÝ¼Ö ÇÁ·Î±×·¥À¸·Î + ¾ÆÆÄÄ¡ ½ÇÇàÇϱ⿡¼­ Ç÷¡Æûº° ¾ÆÆÄÄ¡ Á¶ÀÛ¹ýÀ» ¾Ë ¼ö ÀÖ´Ù.

    +
    + +
    top
    +
    +

    ¼Ò°³

    + +

    ¾ÆÆÄÄ¡¸¦ Áß´ÜÇÏ°í Àç½ÃÀÛÇÏ·Á¸é ½ÇÇàÇÏ°í ÀÖ´Â + httpd ÇÁ·Î¼¼½º¿¡ ½Ã±×³ÎÀ» º¸³»¾ß ÇÑ´Ù. ½Ã±×³ÎÀ» + º¸³»´Â ¹æ¹ýÀº µÎ°¡Áö´Ù. Çϳª´Â À¯´Ð½º kill + ¸í·É¾î¸¦ »ç¿ëÇÏ¿© ÇÁ·Î¼¼½º¿¡ Á÷Á¢ ½Ã±×³ÎÀ» º¸³»´Â ¹æ¹ýÀÌ´Ù. + ½Ã½ºÅÛ¿¡ ¸¹Àº httpd°¡ ½ÇÇàµÇÁö¸¸, PidFile¿¡ pid°¡ ±â·ÏµÈ ºÎ¸ð¿Ü¿¡ + ´Ù¸¥ ÇÁ·Î¼¼½º¿¡ ½Ã±×³Î(signal)À» º¸³»¸é ¾ÈµÈ´Ù. Áï, ºÎ¸ðÀÌ¿Ü¿¡ + ´Ù¸¥ ÇÁ·Î¼¼½º¿¡ ½Ã±×³ÎÀ» º¸³¾ ÇÊ¿ä°¡ ¾ø´Ù´Â ¸»ÀÌ´Ù. ºÎ¸ð¿¡°Ô + º¸³¾ ¼ö ÀÖ´Â ½Ã±×³ÎÀº ¼¼°¡Áö·Î, ÀÌÁ¦ ¼³¸íÇÒ TERM, HUP, USR1ÀÌ´Ù.

    + +

    ´ÙÀ½°ú °°ÀÌ ºÎ¸ð¿¡°Ô ½Ã±×³ÎÀ» º¸³½´Ù:

    + +

    kill -TERM `cat /usr/local/apache2/logs/httpd.pid`

    + +

    httpd ÇÁ·Î¼¼½º¿¡°Ô ½Ã±×³ÎÀ» º¸³»´Â ´Ù¸¥ ¹æ¹ýÀº + ¸í·ÉÇà ¿É¼Ç -k¸¦ »ç¿ëÇÏ´Â °ÍÀÌ´Ù. ¾Æ·¡¼­ ¼³¸íÇÒ + stop, restart, gracefulÀº + httpd ½ÇÇàÆÄÀÏÀÇ ¾Æ±Ô¸ÕÆ®µéÀÌ´Ù. + ±×·¯³ª ÀÌ ¾Æ±Ô¸ÕÆ®µé·Î httpd¸¦ ½ÇÇàÇÏ´Â, apachectl ½ºÅ©¸³Æ®¸¦ + »ç¿ëÇÏ±æ ±ÇÇÑ´Ù.

    + +

    httpd¿¡ ½Ã±×³ÎÀ» º¸³½ÈÄ, ´ÙÀ½ ¸í·É¾î·Î + ÁøÇà»óȲÀ» ¾Ë ¼ö ÀÖ´Ù:

    + +

    tail -f /usr/local/apache2/logs/error_log

    + +

    À§ ¿¹¸¦ ´ç½ÅÀÇ ServerRoot¿Í PidFile ¼³Á¤¿¡ ¾Ë¸Â°Ô ¼öÁ¤Ç϶ó.

    +
    top
    +
    +

    ´çÀå Áß´Ü

    + +
    ½Ã±×³Î: TERM
    +
    apachectl -k stop
    +
    + +

    TERMÀ̳ª stop ½Ã±×³ÎÀ» ºÎ¸ð¿¡°Ô + º¸³»¸é Áï½Ã ¸ðµç ÀÚ½ÄÀ» Á×ÀδÙ. ÀÚ½ÄÀ» ¿ÏÀüÈ÷ Á×À̴µ¥´Â + ¸î ÃÊ°¡ °É¸± ¼ö ÀÖ´Ù. ±×·±ÈÄ ºÎ¸ð°¡ Á¾·áÇÑ´Ù. ó¸®ÁßÀÎ ¿äûÀº + Áߴܵǰí, ´õ ÀÌ»ó ¿äûÀ» ¹ÞÁö¾Ê´Â´Ù.

    +
    top
    +
    +

    Á¡ÀÝÀº Àç½ÃÀÛ

    + +
    ½Ã±×³Î: USR1
    +
    apachectl -k graceful
    +
    + +

    USR1À̳ª graceful ½Ã±×³ÎÀ» + ºÎ¸ð¿¡°Ô º¸³»¸é ºÎ¸ð ÇÁ·Î¼¼½º´Â Àڽĵ鿡°Ô ÇöÀç ¿äûÀ» + ó¸®ÇÑÈÄ Á¾·áÇ϶ó°í (ȤÀº ÇöÀç ¾Æ¹«°Íµµ ó¸®ÇÏÁö ¾Ê´Ù¸é + Áï½Ã Á¾·áÇ϶ó°í) Á¶¾ðÇÑ´Ù. ºÎ¸ð´Â ¼³Á¤ÆÄÀÏÀ» + ´Ù½ÃÀÐ°í ·Î±×ÆÄÀϵµ ´Ù½Ã ¿¬´Ù. ÀÚ½ÄÀÌ Á×À»¶§¸¶´Ù ºÎ¸ð´Â + Á×Àº ÀڽĴë½Å »õ·Î¿î ¼³Á¤ ¼¼´ë¿¡ ±âÃÊÇÑ ÀÚ½ÄÀ» + ½ÇÇàÇÏ¿© Áï½Ã ¿äûÀ» ó¸®ÇÏ°Ô ÇÑ´Ù.

    + +
    Á¡ÀÝÀº Àç½ÃÀÛ(graceful restart)À¸·Î USR1À» + »ç¿ëÇÒ ¼ö ¾ø´Â Ç÷¡Æû¿¡¼­´Â ´ë½Å (WINCH¿Í °°Àº) + ´Ù¸¥ ½Ã±×³ÎÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù. apachectl gracefulÀº + Ç÷¡Æû¿¡ ¾Ë¸ÂÀº ½Ã±×³ÎÀ» º¸³½´Ù.
    + +

    Á¡ÀÝÀº Àç½ÃÀÛÀº Ç×»ó MPMÀÇ ÇÁ·Î¼¼½º Á¶Àý Áö½Ã¾î ¼³Á¤À» + °í·ÁÇÏ¿©, Àç½ÃÀÛµ¿¾È Ŭ¶óÀ̾ðÆ®¸¦ ¼­ºñ½ºÇÏ´Â ÇÁ·Î¼¼½º³ª ¾²·¹µå°¡ + Àû´çÇÑ ¼ö¸¦ À¯ÁöÇϵµ·Ï ¼³°èµÇ¾ú´Ù. °Ô´Ù°¡ StartServers´Â, ÀÏÃÊ ÈÄ + ÃÖ¼ÒÇÑ StartServers¸¸Å­ »õ·Î¿î ÀÚ½ÄÀÌ ¾È¸¸µé¾îÁö¸é ÀÚ½ÄÀÌ + StartServers °³°¡ µÇµµ·Ï »õ·Î ¸¸µç´Ù. Áï, ÇÁ·Î±×·¥Àº ¼­¹öÀÇ + ÇöÀç ºÎÇÏ¿¡ ¾Ë¸ÂÀº ÀÚ½ÄÀÇ °³¼ö¸¦ À¯ÁöÇϸç, + StartServers ÆĶó¹ÌÅÍ·Î ÁöÁ¤ÇÑ ´ç½ÅÀÇ + ±â´ë¸¦ Á¸ÁßÇÑ´Ù.

    + +

    mod_status »ç¿ëÀÚ´Â USR1À» + ¹ÞÀ»¶§ ¼­¹ö Åë°è°¡ 0ÀÌ µÇÁö ¾ÊÀ½À» ºÃÀ» + °ÍÀÌ´Ù. ¼­¹ö´Â »õ·Î¿î ¿äûÀ» (¿î¿µÃ¼Á¦´Â À̵éÀ» Å¥¿¡ ´ã¾Æ¼­ + ¾î¶² °æ¿ì¿¡µµ ÀÒ¾î¹ö¸®Áö ¾Ê´Â´Ù) ó¸®ÇÏÁö ¸øÇÏ´Â ½Ã°£À» + ÃÖ¼ÒÈ­ÇÏ°í ´ç½ÅÀÇ Æ©´× ÆĶó¹ÌÅ͸¦ Á¸ÁßÇϵµ·Ï ¸¸µé¾îÁ³´Ù. + À̸¦ À§ÇØ ¼¼´ë°£ ¸ðµç ÀÚ½ÄÀ» ±â·ÏÇÏ´Â scoreboard¸¦ + À¯ÁöÇÑ´Ù.

    + +

    status ¸ðµâÀº ¶ÇÇÑ Á¡ÀÝÀº Àç½ÃÀÛ Àü¿¡ ½ÃÀÛÇÏ¿© ¾ÆÁ÷µµ + ¿äûÀ» ó¸®ÇÏ°í ÀÖ´Â ÀÚ½ÄÀ» G·Î ¾Ë·ÁÁØ´Ù.

    + +

    ÇöÀç·Î´Â USR1À» »ç¿ëÇÏ´Â ·Î±×¼øȯ ½ºÅ©¸³Æ®°¡ + Àç½ÃÀÛÀü¿¡ ¸ðµç ÀÚ½ÄÀÌ ·Î±×ÀÛ¼ºÀ» ¸¶ÃÆ´ÂÁö ¾Ë ¼ö ÀÖ´Â + ¹æ¹ýÀÌ ¾ø´Ù. ¿ì¸®´Â USR1 ½Ã±×³ÎÀ» º¸³»°í + Àû´çÇÑ ½Ã°£ÀÌ Áö³­ÈÄ ÀÌÀü ·Î±×¸¦ ´Ù·çµµ·Ï Á¦¾ÈÇÑ´Ù. ¿¹¸¦ + µé¾î ³·Àº ´ë¿ªÆø »ç¿ëÀÚÀÇ °æ¿ì Á¢¼Ó ´ëºÎºÐÀÌ ¸¶Ä¡´Âµ¥ 10ºÐÀÌ + ¾È°É¸°´Ù¸é, ÀÌÀü ·Î±×¸¦ ´Ù·ç±âÀü¿¡ 15ºÐ ±â´Ù¸°´Ù.

    + +
    ¼³Á¤ÆÄÀÏ¿¡ ¿À·ù°¡ ÀÖ´Ù¸é Àç½ÃÀ۽à ºÎ¸ð´Â Àç½ÃÀÛÇÏÁö + ¾Ê°í ¿À·ù¸¦ ³»¸ç Á¾·áÇÑ´Ù. ¶Ç, Á¡ÀÝÀº Àç½ÃÀÛÀÇ °æ¿ì Á¾·áÇÒ¶§ + ÀÚ½ÄÀÌ ½ÇÇàµÇµµ·Ï ³öµÐ´Ù. (ÀڽĵéÀº ÀÚ½ÅÀÇ ¸¶Áö¸· ¿äûÀ» + ó¸®ÇÏ°í "Á¡ÀÝ°Ô Á¾·áÇÑ´Ù".) ÀÌ´Â ¼­¹ö¸¦ Àç½ÃÀÛÇÒ¶§ + ¹®Á¦°¡ µÈ´Ù. ¼­¹ö´Â ÀÚ½ÅÀÌ ±â´Ù¸± Æ÷Æ®¿¡ ¿¬°áÇÏÁö ¸øÇÑ´Ù. + Àç½ÃÀÛÀü¿¡ -t ¸í·ÉÇà ¿É¼Ç(httpd Âü°í)À¸·Î ¼³Á¤ÆÄÀÏ + ¹®¹ýÀ» °Ë»çÇÒ ¼ö ÀÖ´Ù. ±×·¯³ª ÀÌ·± °Ë»çµµ ¼­¹ö°¡ ¿Ã¹Ù·Î + Àç½ÃÀÛÇÒÁö¸¦ º¸ÀåÇÏÁö ¸øÇÑ´Ù. ¼³Á¤ÆÄÀÏÀÇ ¹®¹ýÀÌ ¾Æ´Ñ Àǹ̸¦ + °Ë»çÇÏ·Á¸é root°¡ ¾Æ´Ñ »ç¿ëÀÚ·Î httpd¸¦ ½ÃÀÛÇغ¼ ¼ö ÀÖ´Ù. + root°¡ ¾Æ´Ï±â¶§¹®¿¡ (¾Æ´Ï¸é ÇöÀç ±× Æ÷Æ®¸¦ »ç¿ëÇÏ´Â + httpd°¡ ½ÇÇàµÇ±â¶§¹®¿¡) ¿À·ù°¡ ¾ø´Ù¸é ¼ÒÄÏ°ú + ·Î±×ÆÄÀÏÀ» ¿­·Á°í ½ÃµµÇÏ´Â °úÁ¤¿¡¼­ ½ÇÆÐÇÒ °ÍÀÌ´Ù. ´Ù¸¥ + ÀÌÀ¯¶§¹®¿¡ ½ÇÆÐÇÑ´Ù¸é ¾Æ¸¶µµ ¼³Á¤ÆÄÀÏ¿¡ ¿À·ù°¡ ÀÖÀ» °ÍÀÌ´Ù. + Á¡ÀÝÀº Àç½ÃÀÛÀ» ÇϱâÀü¿¡ ¿À·ù¸¦ °íÃľßÇÑ´Ù.
    +
    top
    +
    +

    ´çÀå Àç½ÃÀÛ

    + +
    ½Ã±×³Î: HUP
    +
    apachectl -k restart
    +
    + +

    HUPÀ̳ª restart ½Ã±×³ÎÀ» + ºÎ¸ð¿¡°Ô º¸³»¸é TERM°ú °°ÀÌ ¸ðµç ÀÚ½ÄÀ» + Á×ÀÌÁö¸¸ ºÎ¸ð´Â Á¾·áÇÏÁö ¾Ê´Â´Ù. ºÎ¸ð´Â ¼³Á¤ÆÄÀÏÀ» ´Ù½ÃÀаí + ·Î±×ÆÄÀÏÀ» ´Ù½Ã ¿¬´Ù. ±×¸®°í »õ·Î¿î ÀڽĵéÀ» ¸¸µé°í ¼­ºñ½º¸¦ + °è¼ÓÇÑ´Ù.

    + +

    mod_status »ç¿ëÀÚ´Â HUP¸¦ + º¸³»¸é ¼­¹ö Åë°è°¡ 0ÀÌ µÊÀ» ¾Ë ¼ö ÀÖ´Ù.

    + +
    ¼³Á¤ÆÄÀÏ¿¡ ¿À·ù°¡ ÀÖ´Ù¸é Àç½ÃÀÛÀ» Çصµ ºÎ¸ð´Â Àç½ÃÀÛÇÏÁö +¾Ê°í ¿À·ù¸¦ ³»¸ç Á¾·áÇÒ °ÍÀÌ´Ù. À̸¦ ÇÇÇÏ´Â ¹æ¹ýÀº À§¸¦ Âü°íÇ϶ó.
    +
    top
    +
    +

    ºÎ·Ï: ½Ã±×³Î°ú ·¹À̽º ÄÁµð¼Ç

    + +

    Apache 1.2b9 ÀÌÀü¿¡´Â Àç½ÃÀÛ°ú Á¾·á ½Ã±×³Î¿¡ °ü°èµÈ + ·¹À̽º ÄÁµð¼Ç(race condition)ÀÌ ÀÖ¾ú´Ù. (·¹À̽º + ÄÁµð¼ÇÀº °£´ÜÇÑ ¼³¸íÇÏÀÚ¸é, ¾î¶² ÀÏÀÌ À߸øµÈ¶§ ÀϾ¼­ + ±â´ëÇÑ´ë·Î µ¿ÀÛÇÏÁö ¾Ê´Â ½Ã°£¿¡ ¹Î°¨ÇÑ ¹®Á¦´Ù.) "¿Ã¹Ù¸¥" + ±â´ÉÀÌ ÀÖ´Â ¾ÆÅ°ÅØÃÄ¿¡¼­ ¿ì¸®´Â ÀÌ·± ¹®Á¦¸¦ ÃÖ´ëÇÑ ÇØ°áÇß´Ù. + ±×·¯³ª ¾î¶² ¾ÆÅ°ÅØÃÄ¿¡´Â ¾ÆÁ÷µµ ·¹À̽º ÄÁµð¼ÇÀÌ Á¸ÀçÇÔÀ» + ÁÖÀÇÇ϶ó.

    + +

    ScoreBoardFileÀ» + µð½ºÅ©¿¡ ÀúÀåÇÏ´Â ¾ÆÅ°ÅØÃÄ´Â scoreboard¸¦ ¸Á°¡Æ®¸± °¡´É¼ºÀÌ + ÀÖ´Ù. ±×·¯¸é (HUPÈÄ) "bind: Address already in use" + ȤÀº (USR1 ÈÄ) "long lost child came home!"ÀÌ + ¹ß»ýÇÒ ¼ö ÀÖ´Ù. ÀüÀÚ´Â ½É°¢ÇÑ ¿À·ùÀÌ°í, ÈÄÀÚ´Â ´ÜÁö ¼­¹ö°¡ + scoreboard slotÀ» ÀÒ°Ô ¸¸µç´Ù. ±×·¡¼­ °­Á¦ Àç½ÃÀÛÀ» ÁÙÀÌ°í + Á¡ÀÝÀº Àç½ÃÀÛÀ» »ç¿ëÇϱæ ÃßõÇÑ´Ù. ÀÌ ¹®Á¦´Â ÇØ°áÇϱ⠸ſì + Èûµé´Ù. ±×·¯³ª ´ÙÇàÈ÷µµ ´ëºÎºÐÀÇ ¾ÆÅ°ÅØÃÄ´Â scoreboard·Î ÆÄÀÏÀ» + »ç¿ëÇÏÁö ¾Ê´Â´Ù. ÆÄÀÏÀ» »ç¿ëÇÏ´Â ¾ÆÅ°ÅØÃĶó¸é ScoreBoardFile ¹®¼­¸¦ Âü°íÇ϶ó.

    + +

    ¸ðµç ¾ÆÅ°ÅØÃÄ¿¡´Â Áö¼ÓµÇ´Â HTTP ¿¬°á (KeepAlive)¿¡¼­ + µÎ¹ø° ÀÌÈÄ ¿äûÀ» ó¸®ÇÏ´Â ÀڽĿ¡ ¾à°£ÀÇ ·¹À̽º ÄÁµð¼ÇÀÌ + ÀÖ´Ù. ÀÚ½ÄÀº ¿äûÁÙÀ» ÀÐÀº ÈÄ ¿äû Çì´õ¸¦ ÀбâÀü¿¡ Á¾·áÇÒ ¼ö + ÀÖ´Ù. ÀÌ ¹®Á¦´Â ³Ê¹« ´Ê°Ô ¹ß°ßÇÏ¿© 1.2 ¹öÀüÀÌ ³ª¿ÂÈÄ¿¡¾ß + ¼öÁ¤µÇ¾ú´Ù. ±×·¯³ª ³×Æ®¿÷ Áö¿¬À̳ª ¼­¹ö ½Ã°£Á¦ÇѶ§¹®¿¡ KeepAlive + Ŭ¶óÀ̾ðÆ®´Â ÀÌ·± °æ¿ì¸¦ ¿¹»óÇؾßÇϱ⠶§¹®¿¡ ÀÌ·Ð»ó ¹®Á¦´Â + ¾ÈµÈ´Ù. ½ÇÁ¦·Î ¼­¹ö¸¦ °Ë»çÇϱâÀ§ÇØ ÀÏÃÊ¿¡ 20¹ø Àç½ÃÀÛÇÏ´Â µ¿¾È + Ŭ¶óÀ̾ðÆ®°¡ ±úÁø ±×¸²À̳ª ºó ¹®¼­¾øÀÌ »çÀÌÆ®¸¦ ¼º°øÀûÀ¸·Î + ÀоîµéÀÌ±æ ±â´ëÇÏÁö ¾Ê´Â´Ù¸é ¹®Á¦°¡ ¾ÈµÈ´Ù.

    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/stopping.html.ru.koi8-r b/rubbos/app/httpd-2.0.64/docs/manual/stopping.html.ru.koi8-r new file mode 100644 index 00000000..8d40cfc0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/stopping.html.ru.koi8-r @@ -0,0 +1,251 @@ + + + +ïÓÔÁÎÏ× É ÐÅÒÅÚÁÐÕÓË - HTTP ÓÅÒ×ÅÒ Apache + + + + + +
    <-
    +

    ïÓÔÁÎÏ× É ÐÅÒÅÚÁÐÕÓË

    +
    +

    äÏÓÔÕÐÎÙÅ ÑÚÙËÉ:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    +
    üÔÏÔ ÐÅÒÅ×ÏÄ ÍÏÖÅÔ ÂÙÔØ ÕÓÔÁÒÅ×ÛÉÍ. óÍÏÔÒÉÔÅ + ÁÎÇÌÉÊÓËÕÀ ×ÅÒÓÉÀ ÄÌÑ ÏÚÎÁËÏÍÌÅÎÉÑ ÓÏ ×ÓÅÍÉ ÐÏÓÌÅÄÎÉÍÉ ÉÚÍÅÎÅÎÉÑÍÉ + × ÄÏËÕÍÅÎÔÅ.
    + +

    üÔÏÔ ÄÏËÕÍÅÎÔ ÒÁÓÓÍÁÔÒÉ×ÁÅÔ ×ÏÐÒÏÓÙ ÏÓÔÁÎÏ×ËÉ É ÐÅÒÅÚÁÐÕÓËÁ Apache ÎÁ + Unix-ÐÏÄÏÂÎÙÈ ÓÉÓÔÅÍÁÈ. ðÏÌØÚÏ×ÁÔÅÌÑÍ Windows NT, 2000 É XP ÓÌÅÄÕÅÔ ÞÉÔÁÔØ ÒÁÚÄÅÌ + "òÁÂÏÔÁ Apache ËÁË ÓÅÒ×ÉÓÁ", + Á ÐÏÌØÚÏ×ÁÔÅÌÑÍ Windows 9x É ME - "òÁÂÏÔÁ + Apache ËÁË ËÏÎÓÏÌØÎÏÇÏ ÐÒÉÌÏÖÅÎÉÑ", ÄÌÑ ÐÏÌÕÞÅÎÉÑ ÉÎÆÏÒÍÁÃÉÉ Ï + ÕÐÒÁ×ÌÅÎÉÉ ÓÅÒ×ÅÒÏÍ ÎÁ ÜÔÉÈ ÐÌÁÔÆÏÒÍÁÈ.

    +
    + +
    top
    +
    +

    ÷×ÅÄÅÎÉÅ

    + +

    äÌÑ ÔÏÇÏ, ÞÔÏÂÙ ÏÓÔÁÎÏ×ÉÔØ ÉÌÉ ÐÅÒÅÚÁÐÕÓÔÉÔØ Apache, ÎÅÏÂÈÏÄÉÍÏ ÐÏÓÌÁÔØ + ÓÉÇÎÁÌ ÚÁÐÕÝÅÎÎÙÍ ÐÒÏÃÅÓÓÁÍ httpd. óÕÝÅÓÔ×ÕÅÔ Ä×Á ÓÐÏÓÏÂÁ + ÏÔÐÒÁ×ÉÔØ ÐÏÄÏÂÎÙÅ ÓÉÇÎÁÌÙ. ÷Ï-ÐÅÒ×ÙÈ, ×Ù ÍÏÖÅÔÅ ÐÏÓÌÁÔØ ÓÉÇÎÁÌÙ ÎÅÐÏÓÒÅÄÓÔ×ÅÎÎÏ + ÐÒÏÃÅÓÓÁÍ, ÉÓÐÏÌØÚÕÑ ËÏÍÁÎÄÕ unix kill. ïÂÒÁÔÉÔÅ ×ÎÉÍÁÎÉÅ, + ÞÔÏ ÐÒÏÃÅÓÓÏ× httpd × ÓÉÓÔÅÍÅ ×ÙÐÏÌÎÑÅÔÓÑ ÎÅÓËÏÌØËÏ, + ÏÄÎÁËÏ ×Ù ÎÅ ÄÏÌÖÎÙ ÏÔÓÙÌÁÔØ ÓÉÇÎÁÌÙ ÎÉ ÏÄÎÏÍÕ ÉÚ ÎÉÈ, ËÒÏÍÅ ÒÏÄÉÔÅÌØÓËÏÇÏ - + ÅÇÏ pid (ÉÄÅÎÔÉÆÉËÁÔÏÒ ÐÒÏÃÅÓÓÁ) ÚÁÐÉÓÙ×ÁÅÔÓÑ × ÆÁÊÌ, ÐÕÔØ Ë ËÏÔÏÒÏÍÕ ÚÁÄÁÅÔÓÑ + ÄÉÒÅËÔÉ×ÏÊ PidFile. óÕÝÅÓÔ×ÕÀÔ ÔÒÉ + ÓÉÇÎÁÌÁ, ËÏÔÏÒÙÅ ×Ù ÍÏÖÅÔÅ ÏÔÐÒÁ×ÉÔØ ÒÏÄÉÔÅÌØÓËÏÍÕ ÐÒÏÃÅÓÓÕ: + TERM, + HUP, É + USR1 - ÉÈ ÚÎÁÞÅÎÉÅ ÂÕÄÅÔ ÏÂßÑÓÎÅÎÏ ÎÉÖÅ.

    + +

    þÔÏÂÙ ÏÔÐÒÁ×ÉÔØ ÓÉÇÎÁÌ ÒÏÄÉÔÅÌØÓËÏÍÕ ÐÒÏÃÅÓÓÕ, ×ÁÍ ÓÌÅÄÕÅÔ ÎÁÂÒÁÔØ ÓÌÅÄÕÀÝÕÀ ËÏÍÁÎÄÕ:

    + +

    kill -TERM `cat /usr/local/apache2/logs/httpd.pid`

    + +

    ÷ÔÏÒÏÊ ÓÐÏÓÏ ÐÅÒÅÄÁÔØ ÓÉÇÎÁÌÙ ÐÒÏÃÅÓÓÁÍ httpd - ÜÔÏ + ÉÓÐÏÌØÚÏ×ÁÎÉÅ ÏÐÃÉÉ -k × ËÏÍÁÎÄÎÏÊ ÓÔÒÏËÅ Ó ÁÒÇÕÍÅÎÔÁÍÉ: stop, + restart É graceful, ËÁË ÂÕÄÅÔ ÏÐÉÓÁÎÏ ÎÉÖÅ. + üÔÏ ÐÁÒÁÍÅÔÒÙ ËÏÍÁÎÄÎÏÊ ÓÔÒÏËÉ ÄÌÑ ÉÓÐÏÌÎÑÅÍÏÇÏ ÆÁÊÌÁ httpd, + ÏÄÎÁËÏ ÍÙ ÒÅËÏÍÅÎÄÕÅÍ ÐÅÒÅÄÁ×ÁÔØ ÉÈ, ÉÓÐÏÌØÚÕÑ ÓËÒÉÐÔ apachectl, + ËÏÔÏÒÙÊ ÐÅÒÅÄÁÓÔ ÜÔÉ ÐÁÒÁÍÅÔÒÙ ÐÒÏÇÒÁÍÍÅ httpd.

    + +

    ðÏÓÌÅ ÔÏÇÏ, ËÁË ÂÕÄÕÔ ÏÔÐÒÁ×ÌÅÎÙ ÓÉÇÎÁÌÙ ÐÒÏÃÅÓÓÕ httpd, ×Ù ÍÏÖÅÔÅ + ÕÚÎÁÔØ Ï ÓÏÓÔÏÑÎÉÉ ÓÅÒ×ÅÒÁ, ÎÁÂÒÁ×:

    + +

    tail -f /usr/local/apache2/logs/error_log

    + +

    ÷ÎÅÓÉÔÅ ÎÅÏÂÈÏÄÉÍÙÅ ÉÚÍÅÎÅÎÉÑ × ÜÔÉ ÐÒÉÍÅÒÙ Ó ÕÞ£ÔÏÍ + ÚÎÁÞÅÎÉÑ ÄÉÒÅËÔÉ× ServerRoot + É PidFile × ËÏÎÆÉÇÕÒÁÃÉÉ + Apache.

    +
    top
    +
    +

    îÅÍÅÄÌÅÎÎÁÑ ÏÓÔÁÎÏ×ËÁ

    + +
    óÉÇÎÁÌ: TERM
    +
    apachectl -k stop
    +
    + +

    ðÏÓÌÅ ÐÏÌÕÞÅÎÉÑ ÓÉÇÎÁÌÁ TERM ÉÌÉ stop, + ÒÏÄÉÔÅÌØÓËÉÊ ÐÒÏÃÅÓÓ ÐÙÔÁÅÔÓÑ ÎÅÍÅÄÌÅÎÎÏ ÕÎÉÞÔÏÖÉÔØ ×ÓÅ ÄÏÞÅÒÎÉÅ ÐÒÏÃÅÓÓÙ. + üÔÏ ÍÏÖÅÔ ÚÁÎÑÔØ ÎÅÓËÏÌØËÏ ÓÅËÕÎÄ. úÁÔÅÍ ÒÏÄÉÔÅÌØÓËÉÊ ÐÒÏÃÅÓÓ ÓÁÍ ÚÁ×ÅÒÛÁÅÔ ÒÁÂÏÔÕ, + ÐÒÉ ÜÔÏÍ ×ÓÅ ÔÅËÕÝÉÅ ÚÁÐÒÏÓÙ ÐÒÅËÒÁÝÁÀÔ ÏÂÒÁÂÁÔÙ×ÁÔØÓÑ, Á ÎÏ×ÙÅ ÚÁÐÒÏÓÙ ÉÇÎÏÒÉÒÕÀÔÓÑ.

    + +
    top
    +
    +

    íÑÇËÉÊ ÐÅÒÅÚÁÐÕÓË

    + +
    óÉÇÎÁÌ: USR1
    +
    apachectl -k graceful
    +
    + +

    ðÒÉ ÐÏÌÕÞÅÎÉÉ ÓÉÇÎÁÌÁ USR1 ÉÌÉ graceful, + ÒÏÄÉÔÅÌØÓËÉÊ ÐÒÏÃÅÓÓ ÐÒÉÚÙ×ÁÅÔ ÄÏÞÅÒÎÉÅ ÐÒÏÃÅÓÓÙ Ë ÚÁ×ÅÒÛÅÎÉÀ ÒÁÂÏÔÙ + ÓÒÁÚÕ ÖÅ ÐÏÓÌÅ ÏÂÒÁÂÏÔËÉ Ó×ÏÅÇÏ ÔÅËÕÝÅÇÏ ÚÁÐÒÏÓÁ (ÉÌÉ Ë ÎÅÚÁÍÅÄÌÉÔÅÌØÎÏÊ ÏÓÔÁÎÏ×ËÅ, + ÅÓÌÉ ÄÏÞÅÒÎÉÊ ÐÒÏÃÅÓÓ ÎÉÞÅÇÏ ÎÅ ÏÂÒÁÂÁÔÙ×ÁÅÔ). òÏÄÉÔÅÌØÓËÉÊ ÐÒÏÃÅÓÓ + ÐÅÒÅÞÉÔÙ×ÁÅÔ ËÏÎÆÉÇÕÒÁÃÉÏÎÎÙÅ ÆÁÊÌÙ, ÏÔËÒÙ×ÁÅÔ ÚÁÎÏ×Ï log-ÆÁÊÌÙ + (ÆÁÊÌÙ, ÓÏÄÅÒÖÁÝÉÅ ÖÕÒÎÁÌ ÒÁÂÏÔÙ ÓÅÒ×ÅÒÁ). ðÏÓÌÅ ÔÏÇÏ, ËÁË ËÁËÏÊ-ÔÏ ÉÚ + ÄÏÞÅÒÎÉÈ ÐÒÏÃÅÓÓÏ× ÚÁ×ÅÒÛÁÅÔ ÒÁÂÏÔÕ, ÒÏÄÉÔÅÌØÓËÉÊ ÐÒÏÃÅÓÓ ÚÁÍÅÎÑÅÔ ÅÇÏ + ÄÏÞÅÒÎÉÍ ÐÒÏÃÅÓÓÏÍ ÎÏ×ÏÇÏ ÐÏËÏÌÅÎÉÑ, Ô.Å. Ó ÎÏ×ÏÊ ËÏÎÆÉÇÕÒÁÃÉÅÊ, + ËÏÔÏÒÙÊ ÎÁÞÉÎÁÅÔ ÏÂÒÁÂÁÔÙ×ÁÔØ ÎÏ×ÙÅ ÚÁÐÒÏÓÙ ÎÅÚÁÍÅÄÌÉÔÅÌØÎÏ.

    + +
    îÁ ÎÅËÏÔÏÒÙÈ ÐÌÁÔÆÏÒÍÁÈ, ÎÅ ÐÏÄÄÅÒÖÉ×ÁÀÝÉÈ ÐÅÒÅÄÁÞÕ ÓÉÇÎÁÌÁ USR1 + ËÁË ÓÉÇÎÁÌÁ ÄÌÑ ÉÎÉÃÉÁÃÉÉ ÍÑÇËÏÇÏ ÐÅÒÅÚÁÐÕÓËÁ, ÍÏÇÕÔ + ÉÓÐÏÌØÚÏ×ÁÔØÓÑ ÄÒÕÇÉÅ ÓÉÇÎÁÌÙ (ÔÁËÉÅ ËÁË WINCH). + ëÏÍÁÎÄÁ apachectl graceful ÏÔÐÒÁ×ÉÔ ËÏÒÒÅËÔÎÙÊ ÓÉÇÎÁÌ + ÎÁ ÌÀÂÏÊ ÐÌÁÔÆÏÒÍÅ.
    + +

    ðÒÏÇÒÁÍÍÁ ÒÁÚÒÁÂÏÔÁÎÁ ÔÁËÉÍ ÏÂÒÁÚÏÍ, ÞÔÏ ËÏÌÉÞÅÓÔ×Ï ÐÒÏÃÅÓÓÏ× É ÐÏÔÏËÏ×, + ÏÐÒÅÄÅÌ£ÎÎÏÅ ÄÉÒÅËÔÉ×ÁÍÉ íð-ÍÏÄÕÌÑ (ÍÕÌØÔÉ-ÐÒÏÃÅÓÓÎÏÇÏ ÍÏÄÕÌÑ), + ÏÓÔÁ×ÁÌÏÓØ ÎÅÉÚÍÅÎÎÙÍ ÎÁ ÐÒÏÔÑÖÅÎÉÅ ×ÓÅÇÏ ÐÒÏÃÅÓÓÁ ÐÅÒÅÚÁÐÕÓËÁ. + ëÒÏÍÅ ÔÏÇÏ, ÄÌÑ ÐÏÄÄÅÒÖÁÎÉÑ ÞÉÓÌÁ ÚÁÐÕÝÅÎÎÙÈ ÐÒÏÃÅÓÓÏ×, ÏÐÒÅÄÅÌ£ÎÎÏÇÏ + ÄÉÒÅËÔÉ×ÏÊ StartServers, + ÉÓÐÏÌØÚÕÅÔÓÑ ÓÌÅÄÕÀÝÉÊ ÓÐÏÓÏÂ: ÅÓÌÉ ÓÐÕÓÔÑ ÏÄÎÕ ÓÅËÕÎÄÕ ÎÅ ÂÙÌÏ + ÓÏÚÄÁÎÏ ÐÏ ËÒÁÊÎÅÊ ÍÅÒÅ ÔÁËÏÅ ËÏÌÉÞÅÓÔ×Ï ÄÏÞÅÒÎÉÈ ÐÒÏÃÅÓÓÏ×, ËÁËÏÅ + ÏÐÒÅÄÅÌÅÎÏ ÄÉÒÅËÔÉ×ÏÊ StartServers, + ÔÏÇÄÁ ÓÏÚÄÁ£ÔÓÑ ÔÁËÏÅ ËÏÌÉÞÅÓÔ×Ï ÄÏÞÅÒÎÉÈ ÐÒÏÃÅÓÓÏ×, ËÏÔÏÒÏÅ ÐÏÌÎÏÓÔØÀ + ×ÏÓÐÏÌÎÉÌÏ ÂÙ ÎÅÄÏÓÔÁÔÏË. ôÁËÉÍ ÏÂÒÁÚÏÍ ÓÅÒ×ÅÒ ÐÙÔÁÅÔÓÑ ÏÄÎÏ×ÒÅÍÅÎÎÏ É ÓÏÈÒÁÎÉÔØ + ËÏÌÉÞÅÓÔ×Ï ÕÖÅ ÓÕÝÅÓÔ×ÕÀÝÉÈ ÄÏÞÅÒÎÉÈ ÐÒÏÃÅÓÓÏ× ÎÅÉÚÍÅÎÎÙÍ, É ÕÞÅÓÔØ ×ÁÛÉ + ÔÒÅÂÏ×ÁÎÉÑ, ÕËÁÚÁÎÎÙÅ × ÄÉÒÅËÔÉ×Å StartServers.

    + +

    ðÏÌØÚÏ×ÁÔÅÌÉ, ÉÓÐÏÌØÚÕÀÝÉÅ ÍÏÄÕÌØ mod_status, + ÍÏÇÕÔ ÏÂÒÁÔÉÔØ ×ÎÉÍÁÎÉÅ, ÞÔÏ ÓÔÁÔÉÓÔÉËÁ ÓÅÒ×ÅÒÁ ÐÒÉ ÐÏÌÕÞÅÎÉÉ ÓÉÇÎÁÌÁ + USR1 ÎÅ ÏÂÎÕÌÑÅÔÓÑ. ôÁË ÂÙÌÏ ÓÄÅÌÁÎÏ ÄÌÑ ÔÏÇÏ, ÞÔÏÂÙ ÕÍÅÎØÛÉÔØ + ÐÒÏÍÅÖÕÔÏË ×ÒÅÍÅÎÉ, × ÔÅÞÅÎÉÅ ËÏÔÏÒÏÇÏ ÓÅÒ×ÅÒ ÎÅ ÍÏÖÅÔ ÏÂÒÁÂÁÔÙ×ÁÔØ + ÎÏ×ÙÅ ÚÁÐÒÏÓÙ (ËÏÔÏÒÙÅ ÏÐÅÒÁÃÉÏÎÎÁÑ ÓÉÓÔÅÍÁ ÂÕÄÅÔ ÓÔÁ×ÉÔØ × ÏÞÅÒÅÄØ, + Ô.Å. ÏÎÉ ÎÅ ÐÒÏÐÁÄÕÔ × ÌÀÂÏÍ ÓÌÕÞÁÅ), Á ÔÁËÖÅ ÄÌÑ ÔÏÇÏ, ÞÔÏÂÙ ÕÞÉÔÙ×ÁÔØ + ×ÁÛÉ ÎÁÓÔÒÏÊËÉ. äÌÑ ÜÔÏÇÏ ÓÅÒ×ÅÒ ÈÒÁÎÉÔ ÔÁÂÌÉÃÕ ÓÔÁÔÉÓÔÉËÉ, + × ËÏÔÏÒÕÀ ÚÁÐÉÓÙ×ÁÀÔÓÑ ÒÅÚÕÌØÔÁÔÙ ÒÁÂÏÔÙ ×ÓÅÈ ÄÏÞÅÒÎÉÈ ÐÒÏÃÅÓÓÏ×, ×ÎÅ ÚÁ×ÉÓÉÍÏÓÔÉ ÏÔ ÉÈ ÐÏËÏÌÅÎÉÑ.

    + +

    íÏÄÕÌØ mod_status ÔÁËÖÅ ÉÓÐÏÌØÚÕÅÔ ÓÉÍ×ÏÌ G, ÞÔÏÂÙ + ÏÂÏÚÎÁÞÉÔØ ÔÅ ÄÏÞÅÒÎÉÅ ÐÒÏÃÅÓÓÙ, ËÏÔÏÒÙÅ ×Ó£ ÅÝ£ ÏÂÒÁÂÁÔÙ×ÁÀÔ ÚÁÐÒÏÓÙ É ËÏÔÏÒÙÅ ÂÙÌÉ + ÓÏÚÄÁÎÙ ÄÏ ÓÉÇÎÁÌÁ Ë ÍÑÇËÏÍÕ ÐÅÒÅÚÁÐÕÓËÕ.

    + +

    ÷ ÎÁÓÔÏÑÝÅÅ ×ÒÅÍÑ ÎÅÔ ÓÐÏÓÏÂÁ ÏÐÒÅÄÅÌÉÔØ, + ÞÔÏ ×ÓÅ ÄÏÞÅÒÎÉÅ ÐÒÏÃÅÓÓÙ ÚÁËÏÎÞÉÌÉ ÚÁÐÉÓØ × ÓÔÁÒÙÊ log-ÆÁÊÌ (Ô.Å. + log-ÆÁÊÌ, × ËÏÔÏÒÙÊ ÐÒÏÉÚ×ÏÄÉÌÁÓØ ÚÁÐÉÓØ ÄÏ ÐÅÒÅÚÁÐÕÓËÁ). íÙ + ÐÒÅÄÌÁÇÁÅÍ ×ÁÍ ÐÏÄÏÖÄÁÔØ ÎÅËÏÔÏÒÏÅ ×ÒÅÍÑ, ÐÏÓÌÅ ÔÏÇÏ ËÁË ÂÕÄÅÔ + ÐÏÓÌÁÎ ÓÉÇÎÁÌ USR1, ÐÒÅÖÄÅ ÞÅÍ ÄÅÌÁÔØ ÞÔÏ-ÌÉÂÏ + ÓÏ ÓÔÁÒÙÍ log-ÆÁÊÌÏÍ. îÁÐÒÉÍÅÒ, ÅÓÌÉ ÎÁ ×ÙÐÏÌÎÅÎÉÅ ÚÁÐÒÏÓÏ× + ÐÏÌØÚÏ×ÁÔÅÌÅÊ, ÐÏÄËÌÀÞ£ÎÎÙÈ ÞÅÒÅÚ ÏÞÅÎØ ÍÅÄÌÅÎÎÙÊ ËÁÎÁÌ, ÕÈÏÄÉÔ + ÎÅ ÂÏÌÅÅ 10 ÍÉÎÕÔ, ÔÏÇÄÁ ÌÏÇÉÞÎÏ ÂÕÄÅÔ ÐÏÄÏÖÄÁÔØ 15 ÍÉÎÕÔ, ÐÒÅÖÄÅ ÞÅÍ + ÄÅÌÁÔØ ÞÔÏ-ÌÉÂÏ ÓÏ ÓÔÁÒÙÍ log-ÆÁÊÌÏÍ.

    + +
    åÓÌÉ ÷ÁÛ ËÏÎÆÉÇÕÒÁÃÉÏÎÎÙÊ ÆÁÊÌ ÓÏÄÅÒÖÉÔ ÏÛÉÂËÉ, ÔÏ ÐÏÐÙÔËÁ + ÐÅÒÅÚÁÐÕÓÔÉÔØ ÓÅÒ×ÅÒ ×ÙÚÏ×ÅÔ ÎÅÍÅÄÌÅÎÎÏÅ ÐÒÅËÒÁÝÅÎÉÅ ÒÁÂÏÔÙ ÒÏÄÉÔÅÌØÓËÏÇÏ + ÐÒÏÃÅÓÓÁ Ó ÓÏÏÂÝÅÎÉÅÍ Ï ÏÛÉÂËÅ. ÷ ÓÌÕÞÁÅ ÍÑÇËÏÇÏ ÐÅÒÅÚÁÐÕÓËÁ + ÄÏÞÅÒÎÉÅ ÐÒÏÃÅÓÓÙ ÐÒÏÄÏÌÖÁÀÔ ÏÂÒÁÂÁÔÙ×ÁÔØ Ó×ÏÉ ÚÁÐÒÏÓÙ, ÐÏÓÌÅ ÞÅÇÏ + ÏÎÉ ÚÁ×ÅÒÛÁÔ Ó×ÏÀ ÒÁÂÏÔÕ. üÔÏ ÍÏÖÅÔ ×ÙÚ×ÁÔØ ÐÒÏÂÌÅÍÙ, + ÔÁË ËÁË ÓÅÒ×ÅÒ ÎÅ ÂÕÄÅÔ × ÓÏÓÔÏÑÎÉÉ ÕÓÔÁÎÏ×ÉÔØ ÓÏÅÄÉÎÅÎÉÅ Ó ÎÅÏÂÈÏÄÉÍÙÍÉ + ÐÏÒÔÁÍÉ. ðÅÒÅÄ ×ÙÐÏÌÎÅÎÉÅÍ ÐÅÒÅÚÁÐÕÓËÁ, ×Ù ÄÏÌÖÎÙ + ÐÒÏ×ÅÒÉÔØ ÓÉÎÔÁËÓÉÓ ËÏÎÆÉÇÕÒÁÃÉÏÎÎÙÈ ÆÁÊÌÏ× Ó ÐÏÍÏÝØÀ ÐÁÒÁÍÅÔÒÁ + -t ËÏÍÁÎÄÎÏÊ ÓÔÒÏËÉ (ÓÍ. ÏÐÉÓÁÎÉÅ httpd). + ïÄÎÁËÏ ÜÔÏ ×Ó£ ÅÝ£ ÎÅ ÇÁÒÁÎÔÉÒÕÅÔ, ÞÔÏ ÓÅÒ×ÅÒ ÐÅÒÅÚÁÐÕÓÔÉÔÓÑ ËÏÒÒÅËÔÎÏ. + þÔÏÂÙ ÐÒÏ×ÅÒÉÔØ ÓÅÍÁÎÔÉËÕ ËÏÎÆÉÇÕÒÁÃÉÏÎÎÙÈ ÆÁÊÌÏ×, ÒÁ×ÎÏ ËÁË É ÉÈ ÓÉÎÔÁËÓÉÓ, + ×Ù ÍÏÖÅÔÅ ÐÏÐÒÏÂÏ×ÁÔØ ÚÁÐÕÓÔÉÔØ httpd, ÂÕÄÕÞÉ ÎÅÐÒÉ×ÉÌÅÇÉÒÏ×ÁÎÎÙÍ ÐÏÌØÚÏ×ÁÔÅÌÅÍ. + åÓÌÉ ÏÛÉÂËÉ ÏÔÓÕÔÓÔ×ÕÀÔ, ÔÏ httpd ÐÏÐÙÔÁÅÔÓÑ ÏÔËÒÙÔØ + ÓÏËÅÔÙ É log-ÆÁÊÌÙ, ÎÏ ÎÅ ÓÍÏÖÅÔ ÜÔÏÇÏ ÓÄÅÌÁÔØ, ÐÏÔÏÍÕ ÞÔÏ Õ ÎÅÇÏ ÏÔÓÕÔÓÔ×ÕÀÔ + ÎÅÏÂÈÏÄÉÍÙÅ ÄÌÑ ÜÔÏÇÏ ÐÒÁ×Á (ÉÌÉ ÐÏÔÏÍÕ ÞÔÏ × ÔÅËÕÝÅÅ ×ÒÅÍÑ ÒÁÂÏÔÁÀÝÉÊ httpd ÕÖÅ + ÕÓÔÁÎÏ×ÉÌ ÓÏÅÄÉÎÅÎÉÅ Ó ÎÕÖÎÙÍÉ ÐÏÒÔÁÍÉ, ÚÁÎÑ× ÉÈ). åÓÌÉ ÓÂÏÊ + ÐÒÏÉÓÈÏÄÉÔ ÐÏ ÌÀÂÏÊ ÄÒÕÇÏÊ ÐÒÉÞÉÎÅ - ÚÎÁÞÉÔ, ÓËÏÒÅÅ ×ÓÅÇÏ, + ÓÕÝÅÓÔ×ÕÅÔ ÏÛÉÂËÁ × ËÏÎÆÉÇÕÒÁÃÉÏÎÎÏÍ ÆÁÊÌÅ, ËÏÔÏÒÁÑ ÄÏÌÖÎÁ ÂÙÔØ + ÉÓÐÒÁ×ÌÅÎÁ ÐÅÒÅÄ ÎÁÞÁÌÏÍ ÍÑÇËÏÇÏ ÐÅÒÅÚÁÐÕÓËÁ.
    +
    top
    +
    +

    îÅÍÅÄÌÅÎÎÙÊ ÐÅÒÅÚÁÐÕÓË

    + +
    óÉÇÎÁÌ: HUP
    +
    apachectl -k restart
    +
    + +

    ïÔÐÒÁ×ÌÅÎÎÙÊ ÒÏÄÉÔÅÌØÓËÏÍÕ ÐÒÏÃÅÓÓÕ ÓÉÇÎÁÌ HUP + ÉÌÉ restart ×ÙÚÙ×ÁÅÔ ÎÅÍÅÄÌÅÎÎÏÅ ÕÎÉÞÔÏÖÅÎÉÅ + ×ÓÅÈ ÄÏÞÅÒÎÉÈ ÐÒÏÃÅÓÓÏ×, ÔÁËÖÅ ËÁË É ÐÒÉ ÏÂÒÁÂÏÔËÅ ÓÉÇÎÁÌÁ + TERM, ÏÄÎÁËÏ ÒÏÄÉÔÅÌØÓËÉÊ ÐÒÏÃÅÓÓ ÎÅ ÚÁ×ÅÒÛÁÅÔ ÒÁÂÏÔÕ. + ïÎ ÐÅÒÅÞÉÔÙ×ÁÅÔ ËÏÎÆÉÇÕÒÁÃÉÏÎÎÙÅ ÆÁÊÌÙ É ÏÔËÒÙ×ÁÅÔ ÚÁÎÏ×Ï log-ÆÁÊÌÙ + (ÆÁÊÌÙ, ÓÏÄÅÒÖÁÝÉÅ ÖÕÒÎÁÌ ÒÁÂÏÔÙ ÓÅÒ×ÅÒÁ). úÁÔÅÍ ÏÎ ÐÏÒÏÖÄÁÅÔ + ÎÏ×ÙÈ ÐÏÔÏÍËÏ× É ÐÒÏÄÏÌÖÁÅÔ ÏÂÒÁÂÏÔËÕ ÚÁÐÒÏÓÏ×.

    + +

    ðÏÌØÚÏ×ÁÔÅÌÉ, ÉÓÐÏÌØÚÕÀÝÉÅ ÍÏÄÕÌØ mod_status, + ÍÏÇÕÔ ÏÂÒÁÔÉÔØ ×ÎÉÍÁÎÉÅ, ÞÔÏ ÓÔÁÔÉÓÔÉËÁ ÓÅÒ×ÅÒÁ ÐÒÉ ÐÏÌÕÞÅÎÉÉ ÓÉÇÎÁÌÁ + HUP ÐÏÌÎÏÓÔØÀ ÏÂÎÕÌÑÅÔÓÑ.

    + +
    åÓÌÉ ÷ÁÛ ËÏÎÆÉÇÕÒÁÃÉÏÎÎÙÊ ÆÁÊÌ ÓÏÄÅÒÖÉÔ ÏÛÉÂËÉ, ÔÏ ÐÏÐÙÔËÁ +ÐÅÒÅÚÁÐÕÓÔÉÔØ ÓÅÒ×ÅÒ ×ÙÚÏ×ÅÔ ÎÅÍÅÄÌÅÎÎÏÅ ÐÒÅËÒÁÝÅÎÉÅ ÅÇÏ ÒÁÂÏÔÙ +Ó ÓÏÏÂÝÅÎÉÅÍ Ï ÏÛÉÂËÅ. óÐÏÓÏÂÙ ÉÚÂÅÖÁÔØ ÜÔÏÇÏ ÓÍÏÔÒÉÔÅ ×ÙÛÅ. +
    +
    top
    +
    +

    ðÒÉÌÏÖÅÎÉÅ: ÓÉÇÎÁÌÙ É ÓÉÔÕÁÃÉÉ ÇÏÎËÉ (race conditions)

    + +

    ÷ Apache ÄÏ ×ÅÒÓÉÉ 1.2b9 ÓÕÝÅÓÔ×Ï×ÁÌÏ ÎÅÓËÏÌØËÏ ÓÉÔÕÁÃÉÊ ÇÏÎËÉ, + ×ÏÚÎÉËÁÀÝÉÈ ÐÒÉ ÐÏÌÕÞÅÎÉÉ ÓÉÇÎÁÌÏ× Ë ÐÅÒÅÚÁÐÕÓËÕ ÉÌÉ ÏÓÔÁÎÏ×Õ + (ÐÒÏÝÅ ÇÏ×ÏÒÑ, ÓÉÔÕÁÃÉÑ ÇÏÎËÉ - ÞÕ×ÓÔ×ÉÔÅÌØÎÁÑ ËÏ ×ÒÅÍÅÎÉ ÐÒÏÂÌÅÍÁ, + ×ÏÚÎÉËÁÀÝÁÑ, + ËÏÇÄÁ ÞÔÏ-ÔÏ ÐÒÏÉÓÈÏÄÉÔ × ÎÅÐÏÄÈÏÄÑÝÅÅ ×ÒÅÍÑ ÉÌÉ × ÎÅÐÒÁ×ÉÌØÎÏÍ ÐÏÒÑÄËÅ. + åÓÌÉ ÔÏ ÖÅ ÓÁÍÏÅ ÐÒÏÉÓÈÏÄÉÔ × ÐÏÄÈÏÄÑÝÅÅ ×ÒÅÍÑ, ÎÉËÁËÉÈ ÐÒÏÂÌÅÍ ÎÅ ×ÏÚÎÉËÁÅÔ). + äÌÑ ËÏÍÐØÀÔÅÒÏ× Ó ÁÒÈÉÔÅËÔÕÒÁÍÉ, ÉÍÅÀÝÉÍÉ "ÐÒÁ×ÉÌØÎÙÊ", "ÈÏÒÏÛÉÊ" ÎÁÂÏÒ + ×ÏÚÍÏÖÎÏÓÔÅÊ, ÐÏÄÏÂÎÙÅ ÐÒÏÂÌÅÍÙ ÂÙÌÉ ÕÓÔÒÁÎÅÎÙ ×ÅÚÄÅ, ÇÄÅ ÜÔÏ ×ÏÚÍÏÖÎÏ. + ïÄÎÁËÏ ÓÌÅÄÕÅÔ ÐÏÍÎÉÔØ, ÞÔÏ ÎÁ ËÏÍÐØÀÔÅÒÁÈ Ó ÎÅËÏÔÏÒÙÍÉ ÁÒÈÉÔÅËÔÕÒÁÍÉ + ×Ó£ ÅÝ£ ÓÕÝÅÓÔ×ÕÅÔ ×ÏÚÍÏÖÎÏÓÔØ ×ÏÚÎÉËÎÏ×ÅÎÉÑ ÓÉÔÕÁÃÉÊ ÇÏÎËÉ.

    + +

    ëÏÍÐØÀÔÅÒÙ Ó ÁÒÈÉÔÅËÔÕÒÁÍÉ, ÎÁ ËÏÔÏÒÙÈ ÔÁÂÌÉÃÁ ÓÔÁÔÉÓÔÉËÉ ÈÒÁÎÉÔÓÑ + × ÆÁÊÌÅ, ÚÁÄÁÎÎÏÍ ÄÉÒÅËÔÉ×ÏÊ ScoreBoardFile, + ÉÍÅÀÔ ÐÏÔÅÎÃÉÁÌØÎÕÀ ×ÏÚÍÏÖÎÏÓÔØ ÐÏ×ÒÅÖÄÅÎÉÑ ÉÈ ÔÁÂÌÉà ÓÔÁÔÉÓÔÉËÉ. + üÔÏ ÍÏÖÅÔ ×ÙÚ×ÁÔØ ÏÛÉÂËÕ "bind: Address already in use" + (ÐÏÓÌÅ ÓÉÇÎÁÌÁ HUP) + ÉÌÉ "long lost child came home!" + (ÐÏÓÌÅ ÓÉÇÎÁÌÁ USR1). ðÏÓÌÅÄÎÅÅ ÓÏÏÂÝÅÎÉÅ - ÆÁÔÁÌØÎÁÑ ÏÛÉÂËÁ, + × ÔÏ ×ÒÅÍÑ ËÁË ÐÒÅÄÙÄÕÝÅÅ ÓÉÇÎÁÌÉÚÉÒÕÅÔ ÔÏÌØËÏ Ï ÐÏÔÅÒÅ Ó×ÑÚÉ Ó ÔÁÂÌÉÃÅÊ ÓÔÁÔÉÓÔÉËÉ. + ðÏÜÔÏÍÕ ÍÏÖÎÏ ÐÏÒÅËÏÍÅÎÄÏ×ÁÔØ ÉÓÐÏÌØÚÏ×ÁÔØ ÍÑÇËÉÊ ÐÅÒÅÚÁÐÕÓË, É ÌÉÛØ ×ÒÅÍÑ ÏÔ ×ÒÅÍÅÎÉ + ÄÅÌÁÔØ ÖÅÓÔËÉÊ ÐÅÒÅÚÁÐÕÓË. ó ÜÔÉÍÉ ÐÒÏÂÌÅÍÁÍÉ ÏÞÅÎØ ÓÌÏÖÎÏ ÂÏÒÏÔØÓÑ, + ÏÄÎÁËÏ, Ë ÓÞÁÓÔØÀ, ÂÏÌØÛÉÎÓÔ×Ï ÁÒÈÉÔÅËÔÕÒ ÎÅ ÔÒÅÂÕÀÔ ÈÒÁÎÉÔØ ÔÁÂÌÉÃÕ ÓÔÁÔÉÓÔÉËÉ + ÎÁ ÄÉÓËÅ. óÍÏÔÒÉÔÅ ÄÏËÕÍÅÎÔÁÃÉÀ Ë ÄÉÒÅËÔÉ×Å ScoreBoardFile, ÞÔÏÂÙ ÕÚÎÁÔØ, ÎÁ ËÁËÉÈ ÁÒÈÉÔÅËÔÕÒÁÈ + ÉÓÐÏÌØÚÕÅÔÓÑ ÜÔÏÔ ÆÁÊÌ.

    + +

    ÷Ï ×ÓÅÈ ÁÒÈÉÔÅËÔÕÒÁÈ ÓÕÝÅÓÔ×ÕÀÔ ÎÅÂÏÌØÛÉÅ ÓÉÔÕÁÃÉÉ ÇÏÎËÉ + × ËÁÖÄÏÍ ÄÏÞÅÒÎÅÍ ÐÒÏÃÅÓÓÅ, ÎÁÞÉÎÁÑ ÓÏ ×ÔÏÒÏÇÏ ÚÁÐÒÏÓÁ ÐÒÉ ÐÏÓÔÏÑÎÎÏÍ + HTTP ÓÏÅÄÉÎÅÎÉÉ (KeepAlive). ðÒÏÃÅÓÓ ÍÏÖÅÔ ÚÁ×ÅÒÛÉÔØÓÑ ÐÏÓÌÅ ÞÔÅÎÉÑ + ÓÔÒÏËÉ ÚÁÐÒÏÓÁ, ÎÏ ÐÅÒÅÄ ÞÔÅÎÉÅÍ ÚÁÇÏÌÏ×ËÏ× ÚÁÐÒÏÓÁ. éÓÐÒÁ×ÌÅÎÉÅ + ÐÏÑ×ÉÌÏÓØ ÐÏÚÖÅ ×ÙÐÕÓËÁ ×ÅÒÓÉÉ 1.2, Á ÐÏÔÏÍÕ ÎÅ ×ËÌÀÞÅÎÏ × ÎÅÇÏ. ôÅÏÒÅÔÉÞÅÓËÉ ÜÔÏ + ÎÅ ÐÒÏÂÌÅÍÁ, ÐÏÔÏÍÕ ÞÔÏ KeepAlive-ËÌÉÅÎÔ ÄÏÌÖÅÎ ÏÖÉÄÁÔØ ÔÁËÉÈ ÓÏÂÙÔÉÊ + ÉÚ-ÚÁ ÚÁÄÅÒÖÅË ÓÅÔÉ É ×ÒÅÍÅÎÉ ÏÖÉÄÁÎÉÑ ÓÅÒ×ÅÒÁ. ðÒÁËÔÉÞÅÓËÉ + ÓËÌÁÄÙ×ÁÅÔÓÑ ×ÐÅÞÁÔÌÅÎÉÅ, ÞÔÏ ÜÔÏ ÔÁËÖÅ ÎÅ ÏËÁÚÙ×ÁÅÔ ÎÉËÁËÏÇÏ + ×ÌÉÑÎÉÑ - ×Ï ×ÒÅÍÑ ÔÅÓÔÏ× ÓÅÒ×ÅÒ ÐÅÒÅÚÁÐÕÓËÁÌÓÑ Ó ÞÁÓÔÏÔÏÊ 20 ÒÁÚ + × ÓÅËÕÎÄÕ, Á ËÌÉÅÎÔÙ ÕÓÐÅÛÎÏ ÐÒÏÓÍÁÔÒÉ×ÁÌÉ ÓÁÊÔ, ÎÅ ÐÏÌÕÞÁÑ + ÐÕÓÔÙÈ ÄÏËÕÍÅÎÔÏ× É ÐÏ×ÒÅÖÄ£ÎÎÙÈ ËÁÒÔÉÎÏË.

    +
    +
    +

    äÏÓÔÕÐÎÙÅ ÑÚÙËÉ:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/stopping.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/stopping.html.tr.utf8 new file mode 100644 index 00000000..3f26aedb --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/stopping.html.tr.utf8 @@ -0,0 +1,243 @@ + + + +Durdurma ve Yeniden Başlatma - Apache HTTP Sunucusu + + + + + +
    <-
    +

    Durdurma ve Yeniden Başlatma

    +
    +

    Mevcut Diller:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + +

    Bu belge Apache HTTPd’nin Unix benzeri sistemlerde durdurulması ve + yeniden başlatılması konularını kapsar. Windows NT, 2000 ve XP + kullanıcıları Apache HTTPd’yi bu platformlarda nasıl denetimlerine + alacaklarını öğrenmek için Apache + HTTPd’nin Bir Hizmet Olarak Çalıştırılması sayfasına, Windows 9x ve + ME kullanıcıları ise Apache + HTTPd’nin Bir Konsol Uygulaması Olarak Çalıştırılması sayfasına + bakabilirler.

    +
    + +
    top
    +
    +

    Giriş

    + +

    Apache HTTPd’yi durdurmak ve yeniden başlatmak için çalışan + httpd süreçlerine bir sinyal göndermeniz gerekir. + Sinyal göndermek için iki yol vardır. İlki, süreçlere doğrudan sinyal + göndermek için unix kill komutunun kullanımıdır. Bu + suretle, sisteminizde çalışmakta olan bir çok httpd + sürecini uyarabilirsiniz ama süreç kimliği PidFile yönergesi ile belirtilen dosyada + tutulan ana süreç dışında hiçbirine sinyal göndermemelisiniz. Başka + bir deyişle, ana süreç haricinde hiçbir sürece sinyal göndermeye normal + olarak ihtiyacınız olmaması gerekir. Ana sürece gönderebileceğiniz + üç çeşit sinyal vardır: + TERM, + HUP ve + USR1. Bunlar yeri geldikçe + açıklanacaktır.

    + +

    Ana sürece kill ile sinyal göndermek için şöyle bir + komut verebilirsiniz:

    + +

    kill -TERM `cat /usr/local/apache2/logs/httpd.pid`

    + +

    httpd süreçlerine sinyal göndermenin ikinci yolu + -k komut satırı seçeneğini şu değerlerden biri ile + kullanmaktır: stop, restart ve + graceful. Bunlar aşağıda açıklanacaktır. + -k komut satırı seçeneği + httpd’ye ait olsa da ana sürece bu sinyalleri + göndermek için apachectl betiğini kullanmanızı + öneririz. apachectl, komut satırı seçeneklerini + httpd’ye aktaracaktır.

    + +

    httpd’ye sinyal gönderdikten sonra olup biteni şu + komutla izleyebilirsiniz:

    + +

    tail -f /usr/local/apache2/logs/error_log

    + +

    Bu örnekleri, kendi ServerRoot ve + PidFile yönergelerinizdeki + ayarlara uygun olarak değiştirdikten sonra kullanınız.

    +
    top
    +
    +

    Hemen Durdur

    + +
    Sinyal: TERM
    +
    apachectl -k stop
    +
    + +

    Ana sürece TERM veya stop sinyali + göndererek tüm çocukların bir an önce öldürülmeye çalışılmasını sağlamış + olursunuz. Tüm çocukların öldürülmesi bir kaç saniye sürebilir. Son + olarak ana süreç çıkacaktır. Yanıtlanmakta olan istekler hemen + sonlandırılacak ve artık isteklere yanıt verilmeyecektir.

    +
    top
    +
    +

    Nazikçe Yeniden Başlat

    + +
    Sinyal: USR1
    +
    apachectl -k graceful
    +
    + +

    Ana sürece USR1 veya graceful sinyalinin + gönderilmesi, çocuklara ellerindeki mevcut işleri bitirdikten sonra + (veya sundukları bir şey yoksa hemen) çıkmalarının önerilmesi + demektir. Ana süreç kendi yapılandırma dosyalarını yeniden okur ve + kendi günlük dosyalarını yeniden açar. Ana sürecin öldürdüğü her sürecin + yerine yeni yapılandırma kuşağından bir süreç başlatır ve hemen + yeni isteklere hizmet sunulmaya başlanır.

    + +
    Belli platformlarda, nazikçe yeniden başlatma için + USR1 sinyalinin kullanılmasına izin verilmez. Bu gibi + durumlarda, WINCH gibi başka bir sinyal kullanılabilir. + apachectl graceful komutu platformunuz için doğru sinyali + gönderecektir.
    + +

    Bu kod MPM’lerin süreçleri denetleyen yönergelerine daima uyacak + şekilde tasarlanmıştır. Bu suretle, istemcilere hizmet sunacak çocuk + süreçler ve evreler, yeniden başlatma işleminde de uygun sayıda + sağlanmış olur. Bununla birlikte, StartServers yönergesinde şöyle + davranılır: İlk saniye içinde en azından StartServers sayıda yeni çocuk + oluşturulmamışsa iş olmayan bir devreyi geçiştirecek kadarı oluşturulur. + Ardından sunucunun mevcut yükünü karşılamak için gereken sayıda çocuk + süreç oluşturulur. Bu suretle, kod her ikisi için de gereğini yerine + getirmeye çalışmış olur.

    + +

    mod_status kullanıcıları USR1 + gönderildiği zaman sunucu istatistiklerinin sıfırlanmadığı konusunda + uyarılacaktır. Kod, sunucunun yeni isteklere yanıt veremediği zamanı en + aza indirmenin yanısıra ayar parametrelerinize de uymak üzere + tasarlanmıştır (yeni istekler işletim sistemi tarafından kuyruğa + alınacağından bir istek kaybı olayı yaşanmaz). Bunu sağlamak için, her + iki kuşağın çocuklarının izini sürecek bir çetele tutulur.

    + +

    mod_status modülü, nazikçe yeniden başlat komutunun + verilmesinden önce başlamış ve sunulmaya devam eden isteklere bakan + çocukları imlemek için ayrıca bir G (Graceful’un baş harfi) + kullanır.

    + +

    Günlük dosyası döndürme betiğine, yeniden başlatma öncesi günlüğe yazan + tüm çocukların işini bitirdiğini USR1 kullanarak + bildirmenin bir yolu yoktur. Önerimiz, eski günlük kaydı üzerinde bir + işlem yapmaya başlamadan önce USR1 sinyali gönderilmesinin + ardından belli bir süre beklenilmesi olacaktır. Örneğin, düşük band + genişliğine sahip istemcilere hizmet sunan çoğu sürecin işinin 10 + dakikadan önce bitmeyeceğini gözönüne alarak eski günlük üzerinde işlem + yapmaya başlamak için 15 dakika beklenebilir.

    + +
    Bir yeniden başlatma isteğinde, eğer yapılandırma dosyalarınızda bir + hata varsa sunucu yeniden başlamaz ve bir hata ile çıkar. Nazikçe + yeniden başlatma durumunda ana süreç çıkarken çocuklarını çalışır durumda + bırakır. (Bunlar, ellerindeki istekler bitince ‘nazikçe çıkacak’ olan + çocuk süreçlerdir.) Eğer sunucuyu yeniden başlatmaya çalışırsanız bu + sorunlara yol açar; örneğin, dinleyeceği portları bağlayamayabilir. Bir + yeniden başlatma öncesinde yapılandırma dosyalarınızın sözdizimini + -t komut satırı seçeneği ile sınayabilirsiniz (bkz, + httpd). Ancak, bu hala sunucunuzun düzgünce yeniden + başlatılmasını garanti etmeyecektir. Yapılandırma dosyalarınızı + sözdizimi denetiminin yanında anlamlandırılması bakımından da sınamak + için httpd’nin root olmayan bir kullanıcı tarafından + çalıştırılmasını deneyebilirsiniz. Eğer yapılandırma dosyalarında bir + hata yoksa soketleri ve günlük dosyalarını açmaya çalışırken root + aidiyetinde çalışmadığından veya çalışmakta olan asıl sunucu bu portları + zaten dinlediğinden başarısız olacaktır. Eğer başka bir sebeple + başarısız olursa olası sebep bir yapılandırma dosyası hatasıdır ve asıl + sunucuya ‘nazikçe yeniden başla’ komutunu vermeden önce bu hatayı + düzeltmeniz gerekir.
    +
    top
    +
    +

    Hemen Yeniden Başlat

    + +
    Sinyal: HUP
    +
    apachectl -k restart
    +
    + +

    Ana sürece HUP veya restart sinyalinin + gönderilmesi tüm çocukların TERM sinyali gönderilmiş gibi + öldürülmesine sebep olur fakat ana sürecin çıkmasını sağlamaz. + Ana süreç yapılandırma dosyalarını yeniden okur ve günlük kayıt + dosyalarını yeniden açar. Bunların ardından isteklere yanıt verecek yeni + kuşak çocukları oluşturmaya başlar.

    + +

    mod_status kullanıcıları bir HUP sinyali + gönderildiğinde sunucu istatistiklerinin sıfırlandığı konusunda + uyarılırlar.

    + +
    Eğer yapılandırma dosyalarınızda sözdizimi hatası varsa yeniden + başlatma işlemi gerçekleşmez ve ana süreç bir hata vererek çıkar. + Bundan kaçınmak için önceki yönteme bakınız.
    +
    top
    +
    +

    Ek: Sinyaller ve yarış koşulları

    + +

    Apache 1.2b9 sürümü öncesinde, yeniden başlatma ve ölüm sinyalleri ile + ilgili olarak ortaya çıkan çeşitli yarış koşulları vardı. (Basitçe, bir + yarış koşulu zamanlama ile ilgili bir sorundur; yanlış zamanda veya + yanlış sırada oluşan bir şey istenmeyen sonuçlara yol açarken, aynı şey + doğru zaman ve doğru sırada oluştuğunda herşey yolunda gider.) Bu tür + mimarilerde elimizden geldiği kadar bu sorunları giderecek doğru + özellikleri kullanmaya gayret etsek de belli mimarilerde hala yarış + koşullarının ortaya çıkma olasılığı bulunduğunu belirtmek gerekir.

    + +

    Disk üzerinde ScoreBoardFile dosyası tutan mimarilerde + çetele bozulması olasılığı gündeme gelebilir. Bu durum, "bind: + Address already in use" (HUP sonrası) veya "long lost + child came home!" (USR1 sonrası) iletileriyle + sonuçlanabilir. İkincisi sadece çetele kaybına sebep olurken birincisi + ölümcül bir hatadır. Bu bakımdan, normalde nazikçe yeniden başlatma + kullanıp ara sıra normal yeniden başlatma yapılması önerilebilir. Bu + sorunları kitabına uydurmak çok zordur fakat şans eseri çoğu mimari bir + çetele dosyası gerektirmemektedir. Çetele dosyası kullanan mimariler + için ScoreBoardFile belgesine + bakınız.

    + +

    Kalıcı HTTP bağlantısı (KeepAlive) üzerinden ikinci ve sonraki + isteklerle ilgili olarak her çocuk süreçte bir yarış koşulu oluşma + olasılığı küçük de olsa bütün mimarilerde vardır. İstek satırı + okunduktan sonra hiçbir istek başlığı okunmadan çıkabilir. Bu durum 1.2 + sürümünde geç de olsa farkedilmiş ve düzeltme yoluna gidilmiştir. Teorik + olarak, ağ gecikmeleri ve sunucu zaman aşımları nedeniyle KeepAlive + istemcisi açısından bu olaylar beklenmediğinden, bu önemli bir konu + değildir. Uygulamada ise, ne sunucuyu ne de istemciyi etkilediği + görülmez; bir deneme ortamında sunucu saniyede 20 kere yeniden + başlatılmış ve istemciler boş belge veya bozuk resim almadan siteyi + başarıyla gezmişlerdir.

    +
    +
    +

    Mevcut Diller:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/style/build.properties b/rubbos/app/httpd-2.0.64/docs/manual/style/build.properties new file mode 100644 index 00000000..6a050061 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/style/build.properties @@ -0,0 +1,4 @@ +# This file contains version specific properties + +# No xml files yet +noxml.fr = new_features_2_0.html.fr upgrading.html.fr diff --git a/rubbos/app/httpd-2.0.64/docs/manual/style/common.dtd b/rubbos/app/httpd-2.0.64/docs/manual/style/common.dtd new file mode 100644 index 00000000..8bc6de73 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/style/common.dtd @@ -0,0 +1,191 @@ + + + + + + + +%HTMLlat1; + + +%HTMLsymbol; + + +%HTMLspecial; + + + + +%HTTPD-VERSION; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rubbos/app/httpd-2.0.64/docs/manual/style/css/manual-chm.css b/rubbos/app/httpd-2.0.64/docs/manual/style/css/manual-chm.css new file mode 100644 index 00000000..8471411b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/style/css/manual-chm.css @@ -0,0 +1,27 @@ +@import url(manual-loose-100pc.css); + +/* 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. + */ + +html { + font-size: 95%; +} + +h1 { + margin: 0 0 0.5em 0; +} + +/* the end */ diff --git a/rubbos/app/httpd-2.0.64/docs/manual/style/css/manual-loose-100pc.css b/rubbos/app/httpd-2.0.64/docs/manual/style/css/manual-loose-100pc.css new file mode 100644 index 00000000..ffea7de6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/style/css/manual-loose-100pc.css @@ -0,0 +1,155 @@ +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * manual.css - no sidebar, 100% normal font height + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +/* 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. + */ + +/* import the main CSS, so we + * have to adjust only a few things + */ +@import url(manual.css); + +html { + font-size: 100%; +} + +/* "sidebar" background is white here */ +div#quickview a:hover, +div#quickview a:active { + background-color: #f0f0f0; + color: #0073c7; +} + +div#quickview code.module a:hover, +div#quickview code.module a:active { + background-color: #f0f0f0; + color: #8b4513; +} + +div#quickview code.directive a:hover, +div#quickview code.directive a:active { + background-color: #f0f0f0; + color: #287f00; +} + +h1 { + font-size: 1.5em; +} + +h2 { + font-size: 1.2em; +} + +.category h2 { + font-size: 1em; +} + +h3 { + font-size: 1.1em; +} + +h4 { + font-size: 1em; +} + +div.example h3, +div.note h3, +div.warning h3 { + font-size: 1em; +} + +div#quickview h3, +div#quickview h3.directives { + margin: 1em 0 0.3em 0; + font-size: 1.1em; +} + +div#quickview h3.directives { + margin-top: 0; +} + +div#quickview li { + font-size: 1em; +} + +div#quickview ul { + margin-bottom: 1em; +} + +div#quickview ul#toc { + margin-left: 0; +} + +div#quickview li img { + display: inline; + margin-right: 19px; +} + +#module-index div#quickview ul#toc, +#manual-page div#quickview ul#toc, +div#quickview #topics { + padding-left: 0; +} + +div#quickview .seealso { + padding-left: 34px; +} + +#module-index div#quickview ul#toc li, +#manual-page div#quickview ul#toc li, +div#quickview #topics li, +div#quickview .seealso li { + margin: 0; + list-style-type: none; +} + +div#page-header p.menu, +div#path, +div#footer { + font-size: smaller; +} + +div#quickview { + position: static; + margin: 0 0 1em 30px; + padding: 0; + width: auto; + background-color: #fff; +} + +div#page-content { + margin-right: 0; + padding-right: 0; +} + +div.example pre, +div.example p > code { + font-size: 0.9em; +} + +div.note pre, +div.warning pre { + font-size: 0.9em; +} + +table.qref td.descr { + font-size: 0.9em; +} + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * -> The End <- + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ diff --git a/rubbos/app/httpd-2.0.64/docs/manual/style/css/manual-print.css b/rubbos/app/httpd-2.0.64/docs/manual/style/css/manual-print.css new file mode 100644 index 00000000..0d0695d2 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/style/css/manual-print.css @@ -0,0 +1,717 @@ +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * manual.css for printers + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +/* 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. + */ + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * mainframe ;-) + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ +html { + font-size: 11pt; +} + +body { + background-color: #fff; + color: #000; + padding: 0 0 0 0; + margin: 0; + font-family: "Times New Roman", serif; + font-weight: normal; +} + +pre, code { + font-family: "Courier New", Courier, monospace; +} + +strong { + font-weight: bold; +} + +q, em, var { + font-style: italic; +} + +span.transnote, span.phonetic { + font-weight: normal; + background-color: inherit; + color: #888; +} + +/* fixup IE & Opera + * otherwise they forget to inherit + * the computed font-size value + */ +table, code { + font-size: 1em; +} + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * Links + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +/* normal links */ +/* ====================== */ +a:link, +a:visited, +a:hover, +a:active { + color: #000; + background-color: inherit; + text-decoration: none; +} + +/* sidebar */ +div#quickview a:hover, +div#quickview a:active { + background-color: #fff; + color: #000; +} + +/* EXPERIMENTAL! I'm waiting for complaints... */ +#page-content p > a[href]:after { + content: " (\002197\0000A0" attr(href) ") "; + color: #036; +} + +/* code.module [links] */ +/* ====================== */ +code.module, +code.module a:link, +code.module a:visited, +code.module a:hover, +code.module a:active { + color: #8b4513; + background-color: inherit; + text-decoration: none; +} + +/* code.directive [links] */ +/* ====================== */ +code.directive, +code.directive a:link, +code.directive a:visited, +code.directive a:hover, +code.directive a:active { + color: #287f00; + background-color: inherit; + text-decoration: none; +} + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * Headings + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +/* h1 */ +/* ====================== */ +h1 { + padding: 0 0 0.2em 0; + margin: 1em 0 0.5em 0; + border-style: none none solid none; + border-bottom-width: 1px; + border-bottom-color: #405871; + background-color: inherit; + color: #000; + text-decoration: none; + font-size: 17pt; + font-weight: bold; + text-align: center; +} + +/* h2 */ +/* ====================== */ +h2 { + padding: 0.2em 0 0.2em 0.2em; + margin: 0 0 0.5em 0; + width: 80%; + text-decoration: none; + font-size: 15pt; + font-weight: bold; + border-bottom: 1px solid #000; + text-align: left; +} + +.section h2, +.directive-section h2, +.category h2 { + background-color: #fff; + color: #000; +} + +/* take care of s inside */ +h2 a, +h2 a:hover, +h2 a:active { + color: inherit; + background-color: inherit; + text-decoration: none; +} + +/* h3, h4 */ +/* ====================== */ +h3 { + background-color: inherit; + color: #000; + text-decoration: none; + font-weight: bold; + font-size: 13pt; + margin: 1.3em 0 0.4em 0; + padding: 0 0 0 0.2em; +} + +h4 { + background-color: inherit; + color: #000; + text-decoration: none; + font-weight: bold; + font-size: 11pt; + margin: 1.3em 0 0.2em 0; + padding: 0 0 0 0.2em; +} + +/* margin adjustment */ +h3 + *, h4 + * { + margin-top: 0; +} + +/* IE confuses the + * :-( + * so reset some things + */ +ul, .section table, .directive-section table { + margin-bottom: 1em; +} + +/* titles for + * examples, notes and warnings + */ +div.example h3, +div.note h3, +div.warning h3 { + margin: 0 0 0.5em 0; + text-align: left; + font-size: 11pt; +} + +/* sidebar */ +div#quickview h3 { + margin: 1em 0 0.3em 0; + font-size: 13pt; +} + +div#quickview h3.directives { + margin-top: 0; +} + +/* take care of s inside */ +h3 a, +h3 a:hover, +h3 a:active, +h4 a, +h4 a:hover, +h4 a:active { + color: inherit; + background-color: inherit; + text-decoration: none; +} + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * Up & Top helper images + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +div.up, +div.top { + display: none; +} + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * Tables + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +/* general */ +/* ====================== */ +table { + border: 1px solid #000; + border-collapse: collapse; + padding: 2px; + margin-top: 0.5em; + margin-bottom: 0; + margin-left: 1px; /* border-width == 1px */ +} + +td, th { + empty-cells: show; /* show border around empty cells */ + padding: 0.1em 0.2em; + vertical-align: top; + text-align: left; + line-height: 1.1em; +} + +th { + font-weight: bold; +} + +td.centered { + text-align: center; +} + +tr.header, tr.header th { + border-top: 1px solid #000; + border-bottom: 1px solid #000; +} + +/* bordered table cells */ +/* ====================== */ + +/* turn off borders in tables nested in + * bordered tables per default + */ +table.bordered table td, +table.bordered table th { + border-style: none; +} + +table.bordered td, +table.bordered th, +table table.bordered td, +table table.bordered th { + border: 1px solid #000; +} + +/* mod/dir. overview table and quick reference */ +/* ============================================ */ +table.module th, +table.directive th { + white-space: nowrap; +} + +table.qref { + border-collapse: collapse; + width: auto; +} + +table.qref td { + border-style: none solid; + border-color: #000; + border-width: 1px; +} + +table.qref td.descr { + padding-left: 1em; + font-size: 11pt; +} + +table#legend { + width: 100%; + border-style: none; + border-width: 0; + vertical-align: bottom; + padding: 0; + margin: 0; +} + +table#legend td { + vertical-align: bottom; + margin: 0; + padding: 0; +} + +table#legend table { + vertical-align: bottom; + margin: 0 0 0 0.4em; + padding: 0; + height: 7.5em; +} + +table#legend td.letters span { + display: none; +} + +table#legend table td, +table#legend table th { + vertical-align: middle; + padding: 0.1ex 0.2em; + line-height: 1em; +} + +/* related modules & dir. */ +/* ====================== */ + +/* assuming, all links are enclosed by + * or + * + */ + +table.related { + border-collapse: collapse; +} + +table.related th, +table.related td { + background-color: #fff; + color: #000; + padding: 0.2ex 0.4em; + border: 1px solid #000; +} + +table.related th { + vertical-align: middle; +} + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * Lists + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +/* list default values */ +/* ====================== */ +ul { + list-style-type: disc; +} + +ul ul { + list-style-type: square; +} + +ul ul ul { + list-style-type: circle; +} + +li, dt, dd { + line-height: 1.1em; +} + +dt { + margin-top: 0.5em; + font-weight: bold; +} + +ol li { + margin-top: 0.5em; +} + +ol.up-A { + list-style-type: upper-alpha; +} + +/* table of contents */ +/* ====================== */ +#toc, +#topics { + margin: 0; + padding: 0; +} + +#toc li, +#topics li { + list-style-type: square; + margin: 0 0 1em 0; + padding: 0; +} + +#toc li img, +#topics li img { + margin-right: 19px; +} + +/* see also */ +/* ====================== */ +.seealso { + margin: 0; + padding: 0; +} + +.seealso li { + list-style-type: square; + margin: 0 0 1em 0; + padding: 0 0 0 34px; +} + +/* related modules & dir. */ +/* ====================== */ +table.related td ul, +table.related td li { + list-style-type: none; + margin: 0; + padding: 0; +} + +/* list of all directives */ +/* ====================== */ +div#directive-list ul { + margin: 0; + padding: 0; +} + +/* quickview */ +/* ====================== */ +div#quickview li { + font-size: 11pt; +} + +div#quickview ul { + margin: 0; + padding: 0; +} + +div#quickview ul#toc { + margin: 0; + padding: 0; +} + +div#quickview ul#toc li { + margin: 0 0 0 1em; + padding: 0; + list-style-type: square; + list-style-position: outside; +} + +div#quickview li img { + display: none; +} + +#module-index div#quickview ul#toc, +#manual-page div#quickview ul#toc, +div#quickview #topics, +div#quickview .seealso { + padding-left: 0; +} + +#module-index div#quickview ul#toc li, +#manual-page div#quickview ul#toc li, +div#quickview #topics li, +div#quickview .seealso li { + margin: 0 0 2px 1em; + padding: 0; + list-style-type: square; + list-style-position: outside; +} + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * main page sections + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +/* page header */ +/* ====================== */ +div#page-header { + margin-left: 0; +} + +div#page-header img { + display: none; +} + +div#page-header p.apache { + background-color: #fff; + color: #000; + padding: 0; + margin: 0; + text-align: center; + vertical-align: middle; + font-size: 20pt; + font-weight: bold; + line-height: 20pt; +} + +div#page-header p.menu { + display: none; +} + +/* breadcrumb navigation */ +div#path { + display: none; +} + +/* content sections */ +/* ====================== */ +div#preamble { + padding-bottom: 1em; + margin-left: 0; +} + +div.section, +div.directive-section { + margin: 0; + padding: 0; +} + +.section p, +.directive-section p { + margin: 0 0 1em 0; + padding: 0; +} + +/* look for this on directive + * list pages + */ +div#directive-list { + margin-left: 0; + padding: 0 0 1em 1em; +} + +div#directive-ref { + margin: -1em 0 0 1px; + padding: 0 0 1em 0; + width: auto; +} + +/* no sidebar */ +div#quickview { + position: static; + margin: 0 0 1em 0; + padding: 0; + width: auto; + background-color: #fff; + color: inherit; +} + +/* -> keep content wide */ +div#page-content { + padding-top: 0; + margin-right: 0; + padding-right: 0; +} + +/* in general */ +p { + line-height: 1.1em; +} + +/* page footer */ +/* ====================== */ +div#footer { + margin-left: 0; + font-size: 11pt; + border-top: 1px solid #000; + padding-top: 0.2em; +} + +div#footer p.apache { + float: none; + text-align: center; + padding: 0 0 1em 0; + margin-top: 0; + font-weight: bold; +} + +div.toplang, +div.bottomlang, +div#footer p.menu { + display: none; +} + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * subsections (examples, notes, warnings) + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +/* examples */ +/* ====================== */ +div.example, +div.note div.example { + background-color: #fff; + color: #000; + padding: 0.5em; + margin: 1em; + border: 1px dotted #000; +} + +/* the following [block] elements + * may appear inside example... + */ +div.example p, +div.example pre, +div.example table { + padding: 0; + margin: 0; +} + +div.example p { + line-height: 1em; +} + +div.example pre, +div.example p > code { + font-size: 10pt; +} + +/* notes & warnings */ +/* ====================== */ +div.note, +div.warning { + background-color: #fff; + color: #000; + border: 1px solid #000; + padding: 0.5em; + margin: 1em; +} + +div.note p, +div.warning p { + margin: 0; + padding: 0; +} + +div.note pre, +div.warning pre { + font-size: 10pt; +} + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * quotations, indented paragraphs and figures + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ +p.letters { + display: none; +} + +blockquote p { + font-style: italic; + margin: 0; +} + +blockquote p.cite { + font-style: normal; + margin-top: 0; + margin-left: 2em; +} + +blockquote p.cite cite { + font-style: normal; +} + +p.indent { + margin-left: 2em; + margin-top: 1em; +} + +#index-page form { + display: none; +} + +p.figure { + margin-left: 2em; + font-style: italic; +} + +p.figure img { + border: 1px solid #000; +} + +p.figure dfn { + font-weight: bold; +} + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * -> The End <- + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ diff --git a/rubbos/app/httpd-2.0.64/docs/manual/style/css/manual-zip-100pc.css b/rubbos/app/httpd-2.0.64/docs/manual/style/css/manual-zip-100pc.css new file mode 100644 index 00000000..488d4600 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/style/css/manual-zip-100pc.css @@ -0,0 +1,23 @@ +@import url(manual-loose-100pc.css); + +/* 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. + */ + +h1 { + margin: 0 0 0.5em 0; +} + +/* the end */ diff --git a/rubbos/app/httpd-2.0.64/docs/manual/style/css/manual-zip.css b/rubbos/app/httpd-2.0.64/docs/manual/style/css/manual-zip.css new file mode 100644 index 00000000..3dd237cc --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/style/css/manual-zip.css @@ -0,0 +1,23 @@ +@import url(manual.css); + +/* 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. + */ + +h1 { + margin: 0 0 0.5em 0; +} + +/* the end */ diff --git a/rubbos/app/httpd-2.0.64/docs/manual/style/css/manual.css b/rubbos/app/httpd-2.0.64/docs/manual/style/css/manual.css new file mode 100644 index 00000000..68505c1e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/style/css/manual.css @@ -0,0 +1,1017 @@ +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * manual.css + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +/* 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. + */ + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * mainframe ;-) + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ +html { + font-size: 14px; +} + +body { + background-color: #fff; + color: #036; + padding: 0 1em 0 0; + margin: 0; + font-family: Arial, Helvetica, sans-serif; + font-weight: normal; +} + +pre, code { + font-family: "Courier New", Courier, monospace; +} + +strong { + font-weight: bold; +} + +q, em, var { + font-style: italic; +} + +span.transnote, span.phonetic { + font-weight: normal; + background-color: inherit; + color: #888; +} + +/* fixup IE & Opera + * otherwise they forget to inherit + * the computed font-size value + */ +table, code { + font-size: 1em; +} + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * Links + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +/* normal links */ +/* ====================== */ +a:link { + color: #0073c7; + background-color: inherit; +} + +a:visited { + color: #5A88B5; + background-color: inherit; +} + +a:link:hover, +a:link:active, +a:visited:hover, +a:visited:active { + color: #0073c7; + background-color: #f0f0f0; +} + +/* hover on non-white backgrounds */ +tr.odd a:hover, +tr.odd a:active, +tr.header a:hover, +tr.header a:active, +div.note a:hover, +div.note a:active, +div.example a:hover, +div.example a:active, +div.warning a:hover, +div.warning a:active, +div#quickview a:hover, +div#quickview a:active { + background-color: #fff; + color: #0073c7; +} + +/* code.module [links] */ +/* ====================== */ +code.module, +code.module a:link { + color: #8b4513; + background-color: inherit; +} + +code.module a:visited { + color: #bc8f8f; + background-color: inherit; +} + +code.module a:hover, +code.module a:active { + color: #8b4513; + background-color: #f0f0f0; +} + +/* hover on non-white backgrounds */ +tr.odd code.module a:hover, +tr.odd code.module a:active, +tr.header code.module a:hover, +tr.header code.module a:active, +div.note code.module a:hover, +div.note code.module a:active, +div.example code.module a:hover, +div.example code.module a:active, +div.warning code.module a:hover, +div.warning code.module a:active, +div#quickview code.module a:hover, +div#quickview code.module a:active { + background-color: #fff; + color: #8b4513; +} + +/* code.directive [links] */ +/* ====================== */ +code.directive, +code.directive a:link { + color: #287f00; + background-color: inherit; +} + +code.directive a:visited { + color: #35a500; + background-color: inherit; +} + +code.directive a:hover, +code.directive a:active { + color: #287f00; + background-color: #f0f0f0; +} + +/* hover on non-white backgrounds */ +tr.odd code.directive a:hover, +tr.odd code.directive a:active, +tr.header code.directive a:hover, +tr.header code.directive a:active, +div.note code.directive a:hover, +div.note code.directive a:active, +div.example code.directive a:hover, +div.example code.directive a:active, +div.warning code.directive a:hover, +div.warning code.directive a:active, +div#quickview code.directive a:hover, +div#quickview code.directive a:active { + background-color: #fff; + color: #287f00; +} + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * Headings + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +/* h1 */ +/* ====================== */ +h1 { + padding: 0.2em; + margin: 0; + border: 1px solid #405871; + background-color: inherit; + color: #036; + text-decoration: none; + font-size: 22px; + font-weight: bold; +} + +/* h2 */ +/* ====================== */ +h2 { + padding: 0.2em 0 0.2em 0.7em; + margin: 0 0 0.5em 0; + text-decoration: none; + font-size: 18px; + font-weight: bold; +} + +.section h2 { + background-color: #405871; + color: #fff; +} + +.directive-section h2 { + background-color: #557697; + color: #fff; +} + +.category h2 { + background-color: #e5ecf3; + color: #405871; + font-size: 14px; +} + +/* take care of s inside */ +h2 a, +h2 a:hover, +h2 a:active { + color: inherit; + background-color: inherit; + text-decoration: none; +} + +/* h3, h4 */ +/* ====================== */ +h3 { + background-color: inherit; + color: #036; + text-decoration: none; + font-weight: bold; + font-size: 16px; + margin: 1.3em 0 0.4em 0; + padding: 0; +} + +h4 { + background-color: inherit; + color: #036; + text-decoration: none; + font-weight: bold; + font-size: 14px; + margin: 1.3em 0 0.2em 0; + padding: 0; +} + +/* margin adjustment */ +h3 + *, h4 + * { + margin-top: 0; +} + +/* IE confuses the + * :-( + * so reset some things + */ +ul, .section table, .directive-section table { + margin-bottom: 1em; +} + +/* titles for + * examples, notes and warnings + */ +div.example h3, +div.note h3, +div.warning h3 { + margin: 0 0 0.5em 0; + text-align: left; + font-size: 14px; +} + +/* sidebar */ +div#quickview h3 { + margin: 1em 0 0.3em 0.5em; + font-size: 15px; +} + +div#quickview h3.directives { + margin-top: 0.3em; +} + +/* take care of s inside */ +h3 a, +h3 a:hover, +h3 a:active, +h4 a, +h4 a:hover, +h4 a:active { + color: inherit; + background-color: inherit; + text-decoration: none; +} + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * Up & Top helper images + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +/* arrow left */ +/* ====================== */ +div.up { + width: 30px; + height: 20px; + padding: 0; + margin: -20px 0 1px 0; + text-align: center; + vertical-align: top; +} + +div.up img { + vertical-align: top; + width: 11px; + height: 11px; + border-style: none; +} + +/* arrow up (to page top) */ +/* ====================== */ +div.top { + width: 30px; + padding: 0 0 0 30px; + margin: 0; +} + +div.top img { + margin-top: 0.5em; + vertical-align: bottom; + width: 11px; + height: 11px; + border-style: none; +} + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * Tables + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +/* general */ +/* ====================== */ +table { + border: 1px solid #aaa; + border-collapse: collapse; + padding: 2px; + margin-top: 0.5em; + margin-bottom: 0; +} + +td, th { + empty-cells: show; /* show border around empty cells */ + padding: 0.1em 0.2em; + vertical-align: top; + text-align: left; + line-height: 1.3em; +} + +th { + font-weight: bold; +} + +td.centered { + text-align: center; +} + +td.data { + font-family: monospace; + text-align: right; + padding-left: 1em; +} + +th.data { + text-align: right; +} + +tr.odd { /* for large tables alternating colors */ + background-color: #f2f2f2; +} + +tr.header, tr.header th { + background-color: #e2e2e2; + border-top: 1px solid #aaa; + border-bottom: 1px solid #aaa; +} + +/* bordered table cells */ +/* ====================== */ + +/* turn off borders in tables nested in + * bordered tables per default + */ +table.bordered table td, +table.bordered table th { + border-style: none; +} + +table.bordered td, +table.bordered th, +table table.bordered td, +table table.bordered th { + border: 1px solid #aaa; +} + +/* index page layout table */ +/* ======================= */ +body#index-page div#page-content { + width: 100%; /* IE fun */ +} + +body[id]#index-page div#page-content { + width: auto; /* reasonable browsers. */ +} + +table#indextable { + width: 100%; + border-collapse: collapse; + border: 0 none; +} + +table#indextable td { + width: 33.3%; + border-left: 1px solid #aaa; + padding-top: 0; + padding-bottom: 0; +} + +table#indextable td.col1 { + border-left: 0 none; + padding-left: 0; +} + +table#indextable td.col3 { + padding-right: 0; +} + +/* mod/dir. overview table and quick reference */ +/* ============================================ */ +table.module th, +table.directive th { + white-space: nowrap; +} + +table.qref { + border-collapse: collapse; + width: 100%; +} + +table.qref td { + border-style: none solid; + border-color: #aaa; + border-width: 1px; +} + +table.qref td.descr { + padding-left: 1em; + font-size: 13px; +} + +table#legend { + width: 100%; + border-style: none; + border-width: 0; + vertical-align: bottom; + padding: 0; + margin: 0; +} + +table#legend td { + vertical-align: bottom; + margin: 0; + padding: 0; +} + +table#legend td.letters { + width: 100%; + padding-bottom: 0.5em; +} + +table#legend table { + vertical-align: bottom; + margin: 0 0 0 0.4em; + padding: 0; + height: 7.5em; +} + +table#legend table td, +table#legend table th { + vertical-align: middle; + padding: 0.1ex 0.2em; + line-height: 1em; + white-space: nowrap; +} + +/* related modules & dir. */ +/* ====================== */ + +/* assuming, all links are enclosed by + * or + * + */ + +table.related { + border-collapse: separate; +} + +table.related th { + padding: 0.2ex 0.3em; + background-color: #e5ecf3; + color: #405871; + vertical-align: middle; +} + +table.related td { + padding: 0.2ex 0.3em; +} + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * Lists + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +/* list default values */ +/* ====================== */ +ul { + list-style-type: disc; +} + +ul ul { + list-style-type: square; +} + +ul ul ul { + list-style-type: circle; +} + +li, dt, dd { + line-height: 1.3em; +} + +dt { + margin-top: 0.5em; + font-weight: bold; +} + +ol li { + margin-top: 0.5em; +} + +ol.up-A { + list-style-type: upper-alpha; +} + +ol.lo-A { + list-style-type: lower-alpha; +} + +dd.separate { + margin-bottom: 2em; +} + +li.separate { + margin-bottom: 1em; +} + +/* table of contents */ +/* ====================== */ +#toc, +#topics { + margin: 0 0 1em 0; + padding: 0; +} + +#toc li, +#topics li { + list-style-type: none; + margin: 0; + padding: 0; +} + +/* see also */ +/* ====================== */ +.seealso { + margin: 0 0 1em 0; + padding: 0; +} + +.seealso li { + list-style-type: none; + margin: 0; + padding: 0 0 0 34px; +} + +/* related modules & dir. */ +/* ====================== */ +table.related td ul, +table.related td li { + list-style-type: none; + margin: 0; + padding: 0; +} + +/* list of all directives */ +/* ====================== */ +div#directive-list ul { + margin: 0; + padding: 0; +} + +/* indextable */ +/* ========== */ +table#indextable td ul { + list-style-type: none; + margin: 0 0 1em 0.5em; + padding: 0 0 0 0; +} + +table#indextable td ul li { + margin-top: 0.3em; +} + +/* sidebar */ +/* ====================== */ +div#quickview li { + font-size: 13px; +} + +div#quickview ul { + margin: 0 0 15px 0; + padding: 0; +} + +div#quickview ul#toc { + margin: 0 0 0 0.5em; + padding: 0; +} + +#module-index div#quickview ul#toc, +#manual-page div#quickview ul#toc { + margin-left: 0; +} + +div#quickview ul#toc li { + margin: 0; + padding: 0; + list-style-type: none; +} + +div#quickview li img { + display: none; +} + +#module-index div#quickview ul#toc, +#manual-page div#quickview ul#toc, +div#quickview #topics, +div#quickview .seealso { + padding-left: 15px; +} + +#module-index div#quickview ul#toc li, +#manual-page div#quickview ul#toc li, +div#quickview #topics li, +div#quickview .seealso li { + margin: 0.4em 0 2px 0; + padding: 0; + list-style-type: square; + list-style-position: outside; +} + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * main page sections + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +/* page header */ +/* ====================== */ +div#page-header { + margin-left: 30px; +} + +div#page-header img { + padding: 0; + display: block; + margin: -70px 0 1px 2em; + width: 248px; + height: 70px; +} + +div#page-header p.apache { + background-color: #405871; + color: #fff; + padding: 0 0 0 248px; + margin: 0; + text-align: center; + vertical-align: middle; + font-size: 16px; + font-weight: bold; + line-height: 29px; +} + +div#page-header p.menu { + text-align: right; + font-size: 13px; + margin: 30px 0 0.5em 0; + padding: 0; +} + +/* breadcrumb navigation */ +div#path { + margin: 0.2em 0 1.2em 30px; + padding: 0; + font-size: 13px; +} + +/* content sections */ +/* ====================== */ +div#preamble { + padding-bottom: 1em; + margin-left: 30px; +} + +div.section, +div.directive-section { + margin: -1.2em 0 0 60px; + padding: 0; +} + +.section p, +.directive-section p { + margin: 0 0 1em 0; + padding: 0; +} + +/* look for this on directive + * list pages + */ +div#directive-list { + margin-left: 30px; + padding: 0 0 1em 1em; +} + +div#directive-ref { + margin: -1em 0 0 0; + padding: 0 0 1em 30px; + width: 100%; /* IE is BAD (broken as designed) */ +} + +div[id]#directive-ref { /* a big sorry to ICab, Amaya (and old Konquerors?) */ + width: auto; /* other browsers are fine ;-) */ +} + +/* sidebar position: right */ +div#quickview { + position: absolute; + top: 5.5em; + right: 1em; + margin-left: 0; + margin-top: 40px; + padding: 4px; + width: 13.5em; + background-color: #f0f0f0; + color: inherit; +} + +/* -> move content left */ +div#page-content { + padding-top: 0; + margin-right: 13em; + padding-right: 30px; +} + +/* unsqueeze on some pages... */ +body.no-sidebar div#page-content, +body#index-page div#page-content { + margin-right: 0; + padding-right: 0; +} + +body#index-page div#page-content { + margin-left: 30px; + padding-bottom: 1em; +} + +/* in general */ +p { + line-height: 1.3em; +} + +/* translations */ +/* ====================== */ +.toplang { + padding: 0; + margin: 0.2em 0.2em 1em 0; +} + +.bottomlang { + padding: 0; + margin: 0 0.2em 0.2em 0; +} + +.toplang p, +.bottomlang p { + font-size: 13px; + text-align: right; + background-color: inherit; + color: #ccc; + margin: 0; + padding: 0; +} + +.toplang p span, +.bottomlang p span { + background-color: inherit; + color: #036; +} + +.toplang p a:link, +.toplang p a:visited, +.bottomlang p a:link, +.bottomlang p a:visited { + text-decoration: none; + font-weight: bold; +} + +.toplang p a:hover, +.toplang p a:active, +.bottomlang p a:hover, +.bottomlang p a:active { + font-weight: bold; +} + +/* page footer */ +/* ====================== */ +div#footer { + margin-left: 30px; + font-size: 13px; + border-top: 1px solid #405871; + padding-top: 0.2em; +} + +div#footer p.apache { + float: left; + text-align: left; + padding: 0 0 1em 0; + margin-top: 0; +} + +div#footer p.menu { + float: right; + text-align: right; + margin-top: 0; + padding: 0 0 1em 0; +} + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * subsections (examples, notes, warnings) + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +/* examples */ +/* ====================== */ +div.example { + background-color: #e5ecf3; + color: #000; + padding: 0.5em; + margin: 1em 2em 1em 1em; +} + +/* example inside a note: + * blue in gray doesn't look good + * so simply draw a border around + * and keep it gray + */ +div.note div.example, +div.warning div.example { + border: 1px solid #aaa; + background-color: transparent; + color: inherit; + margin-right: 1em; +} + +/* example inside table */ +table div.example { + margin-right: 1em; +} + +/* the following [block] elements + * may appear inside example... + */ +div.example p, +div.example pre, +div.example table { + padding: 0; + margin: 0; +} + +div.example p { + line-height: 1em; +} + +div.example pre, +div.example p > code { + font-size: 13px; +} + +/* notes & warnings */ +/* ====================== */ +div.note, +div.warning { + background-color: #eee; + color: #036; + padding: 0.5em; + margin: 1em 2em 1em 1em; +} + +div.warning { + border: 1px solid #f00; +} + +div.note p, +div.warning p { + margin: 0.5em 0 0 0; + padding: 0; +} + +div.note pre, +div.warning pre { + font-size: 13px; +} + +/* inside table */ +table div.note, +table div.warning { + margin-right: 1em; +} + +div.outofdate { + background-color: #ffffe0; + color: #036; + padding: 0.5em; + margin: 1em 2em 1em 1em; +} + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * quotations, indented paragraphs, forms and figures + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ +p.letters { + margin: 1em 0 0 0; +} + +p.centered { + text-align: center; +} + +.letters { + text-align: center; + background-color: inherit; + color: #ccc; +} + +.letters a:link, +.letters a:visited { + text-decoration: none; + font-weight: bold; +} + +.letters a:hover, +.letters a:active { + font-weight: bold; +} + +blockquote p { + font-style: italic; + margin: 0; +} + +blockquote p.cite { + font-style: normal; + margin-top: 0; + margin-left: 2em; +} + +blockquote p.cite cite { + font-style: normal; +} + +p.indent { + margin-left: 2em; + margin-top: 1em; +} + +span.indent { + padding-left: 1.5em; + display: block; +} + +#index-page form { + text-align: center; +} + +#index-page form p { + line-height: 1.1em; +} + +#index-page form input { + font-size: 1em; +} + +p.figure { + margin-left: 2em; + font-style: italic; +} + +p.figure img { + border: 1px solid #aaa; +} + +p.figure dfn { + font-weight: bold; +} + +/* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + * -> The End <- + * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ diff --git a/rubbos/app/httpd-2.0.64/docs/manual/style/faq.dtd b/rubbos/app/httpd-2.0.64/docs/manual/style/faq.dtd new file mode 100644 index 00000000..9af4f113 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/style/faq.dtd @@ -0,0 +1,35 @@ + + + + + +%common; + + + + + + + + + + + diff --git a/rubbos/app/httpd-2.0.64/docs/manual/style/lang.dtd b/rubbos/app/httpd-2.0.64/docs/manual/style/lang.dtd new file mode 100644 index 00000000..422313c9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/style/lang.dtd @@ -0,0 +1,24 @@ + + + + + +%HTTPD-VERSION; + + + diff --git a/rubbos/app/httpd-2.0.64/docs/manual/style/latex/atbeginend.sty b/rubbos/app/httpd-2.0.64/docs/manual/style/latex/atbeginend.sty new file mode 100644 index 00000000..8729fa6c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/style/latex/atbeginend.sty @@ -0,0 +1,65 @@ +% atbeginend.sty +% +% defines +% \BeforeBegin{environment}{code-to-execute} +% \BeforeEnd {environment}{code-to-execute} +% \AfterBegin {environment}{code-to-execute} +% \AfterEnd {environment}{code-to-execute} +% +% Save \begin and \end to \BeginEnvironment and \EndEnvironment +\let\BeginEnvironment=\begin +\let\EndEnvironment=\end + +\def\IfUnDef#1{\expandafter\ifx\csname#1\endcsname\relax} + +% Null command needed to for \nothing{something}=.nothing. +\def\NullCom#1{} + +\def\begin#1{% +% +% if defined \BeforeBeg for this environment, execute it +\IfUnDef{BeforeBeg#1}\else\csname BeforeBeg#1\endcsname\fi% +% +% +% +\IfUnDef{AfterBeg#1}% This is done to skip the command for environments + % which can take arguments, like multicols; YOU MUST NOT + % USE \AfterBegin{...}{...} for such environments! + \let\SaveBegEng=\BeginEnvironment% +\else% + % Start this environment + \BeginEnvironment{#1}% + % and execute code after \begin{environment} + \csname AfterBeg#1\endcsname% + % + \let\SaveBegEng=\NullCom% +\fi% +\SaveBegEng{#1}% +} + + +\def\end#1{% +% +% execute code before \end{environment} +\IfUnDef{BeforeEnd#1}\else\csname BeforeEnd#1\endcsname\fi% +% +% close this environment +\EndEnvironment{#1}% +% +% and execute code after \begin{environment} +\IfUnDef{AfterEnd#1}\else\csname AfterEnd#1\endcsname\fi% +} + + +%% Now, define commands +% \BeforeBegin{environment}{code-to-execute} +% \BeforeEnd {environment}{code-to-execute} +% \AfterBegin {environment}{code-to-execute} +% \AfterEnd {environment}{code-to-execute} + +\def\BeforeBegin#1#2{\expandafter\gdef\csname BeforeBeg#1\endcsname +{#2}} +\def\BeforeEnd #1#2{\expandafter\gdef\csname BeforeEnd#1\endcsname +{#2}} +\def\AfterBegin #1#2{\expandafter\gdef\csname AfterBeg#1\endcsname {#2}} +\def\AfterEnd #1#2{\expandafter\gdef\csname AfterEnd#1\endcsname{#2}} diff --git a/rubbos/app/httpd-2.0.64/docs/manual/style/manualpage.dtd b/rubbos/app/httpd-2.0.64/docs/manual/style/manualpage.dtd new file mode 100644 index 00000000..17742548 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/style/manualpage.dtd @@ -0,0 +1,27 @@ + + + + + +%common; + + + + + diff --git a/rubbos/app/httpd-2.0.64/docs/manual/style/modulesynopsis.dtd b/rubbos/app/httpd-2.0.64/docs/manual/style/modulesynopsis.dtd new file mode 100644 index 00000000..14f947a5 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/style/modulesynopsis.dtd @@ -0,0 +1,76 @@ + + + + + +%sitemap; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rubbos/app/httpd-2.0.64/docs/manual/style/sitemap.dtd b/rubbos/app/httpd-2.0.64/docs/manual/style/sitemap.dtd new file mode 100644 index 00000000..e47e8a9d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/style/sitemap.dtd @@ -0,0 +1,38 @@ + + + + + +%common; + + + + + + + + + + + + + + + + diff --git a/rubbos/app/httpd-2.0.64/docs/manual/style/version.ent b/rubbos/app/httpd-2.0.64/docs/manual/style/version.ent new file mode 100644 index 00000000..ae00eba1 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/style/version.ent @@ -0,0 +1,24 @@ + + + + + + + + + diff --git a/rubbos/app/httpd-2.0.64/docs/manual/suexec.html b/rubbos/app/httpd-2.0.64/docs/manual/suexec.html new file mode 100644 index 00000000..9c833c98 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/suexec.html @@ -0,0 +1,17 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: suexec.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: suexec.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: suexec.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: suexec.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/suexec.html.en b/rubbos/app/httpd-2.0.64/docs/manual/suexec.html.en new file mode 100644 index 00000000..cb50bd9a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/suexec.html.en @@ -0,0 +1,617 @@ + + + +suEXEC Support - Apache HTTP Server + + + + + +
    <-
    +

    suEXEC Support

    +
    +

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

    +
    + +

    The suEXEC feature provides + Apache users the ability + to run CGI and SSI programs + under user IDs different from the user ID of the calling + web server. Normally, when a CGI or SSI program executes, it + runs as the same user who is running the web server.

    + +

    Used properly, this feature can reduce + considerably the security risks involved with allowing users to + develop and run private CGI or SSI programs. However, if suEXEC + is improperly configured, it can cause any number of problems + and possibly create new holes in your computer's security. If + you aren't familiar with managing setuid root programs + and the security issues they present, we highly recommend that + you not consider using suEXEC.

    +
    + +
    top
    +
    +

    Before we begin

    + +

    Before jumping head-first into this document, + you should be aware of the assumptions made on the part of the + Apache Group and this document.

    + +

    First, it is assumed that you are using a UNIX + derivative operating system that is capable of + setuid and setgid operations. + All command examples are given in this regard. Other platforms, + if they are capable of supporting suEXEC, may differ in their + configuration.

    + +

    Second, it is assumed you are familiar with + some basic concepts of your computer's security and its + administration. This involves an understanding of + setuid/setgid operations and the various + effects they may have on your system and its level of + security.

    + +

    Third, it is assumed that you are using an + unmodified version of suEXEC code. All code + for suEXEC has been carefully scrutinized and tested by the + developers as well as numerous beta testers. Every precaution + has been taken to ensure a simple yet solidly safe base of + code. Altering this code can cause unexpected problems and new + security risks. It is highly recommended you + not alter the suEXEC code unless you are well versed in the + particulars of security programming and are willing to share + your work with the Apache Group for consideration.

    + +

    Fourth, and last, it has been the decision of + the Apache Group to NOT make suEXEC part of + the default installation of Apache. To this end, suEXEC + configuration requires of the administrator careful attention + to details. After due consideration has been given to the + various settings for suEXEC, the administrator may install + suEXEC through normal installation methods. The values for + these settings need to be carefully determined and specified by + the administrator to properly maintain system security during + the use of suEXEC functionality. It is through this detailed + process that the Apache Group hopes to limit suEXEC + installation only to those who are careful and determined + enough to use it.

    + +

    Still with us? Yes? Good. Let's move on!

    +
    top
    +
    +

    suEXEC Security Model

    + +

    Before we begin configuring and installing + suEXEC, we will first discuss the security model you are about + to implement. By doing so, you may better understand what + exactly is going on inside suEXEC and what precautions are + taken to ensure your system's security.

    + +

    suEXEC is based on a setuid + "wrapper" program that is called by the main Apache web server. + This wrapper is called when an HTTP request is made for a CGI + or SSI program that the administrator has designated to run as + a userid other than that of the main server. When such a + request is made, Apache provides the suEXEC wrapper with the + program's name and the user and group IDs under which the + program is to execute.

    + +

    The wrapper then employs the following process + to determine success or failure -- if any one of these + conditions fail, the program logs the failure and exits with an + error, otherwise it will continue:

    + +
      +
    1. + Is the user executing this wrapper a valid user of + this system? + +

      + This is to ensure that the user executing the wrapper is + truly a user of the system. +

      +
    2. + +
    3. + Was the wrapper called with the proper number of + arguments? + +

      + The wrapper will only execute if it is given the proper + number of arguments. The proper argument format is known + to the Apache web server. If the wrapper is not receiving + the proper number of arguments, it is either being + hacked, or there is something wrong with the suEXEC + portion of your Apache binary. +

      +
    4. + +
    5. + Is this valid user allowed to run the + wrapper? + +

      + Is this user the user allowed to run this wrapper? Only + one user (the Apache user) is allowed to execute this + program. +

      +
    6. + +
    7. + Does the target CGI or SSI program have an unsafe + hierarchical reference? + +

      + Does the target CGI or SSI program's path contain a leading + '/' or have a '..' backreference? These are not allowed; the + target CGI/SSI program must reside within suEXEC's document + root (see --with-suexec-docroot=DIR + below). +

      +
    8. + +
    9. + Is the target user name valid? + +

      + Does the target user exist? +

      +
    10. + +
    11. + Is the target group name valid? + +

      + Does the target group exist? +

      +
    12. + +
    13. + Is the target user NOT superuser? + + +

      + Presently, suEXEC does not allow root + to execute CGI/SSI programs. +

      +
    14. + +
    15. + Is the target userid ABOVE the minimum ID + number? + +

      + The minimum user ID number is specified during + configuration. This allows you to set the lowest possible + userid that will be allowed to execute CGI/SSI programs. + This is useful to block out "system" accounts. +

      +
    16. + +
    17. + Is the target group NOT the superuser + group? + +

      + Presently, suEXEC does not allow the root + group to execute CGI/SSI programs. +

      +
    18. + +
    19. + Is the target groupid ABOVE the minimum ID + number? + +

      + The minimum group ID number is specified during + configuration. This allows you to set the lowest possible + groupid that will be allowed to execute CGI/SSI programs. + This is useful to block out "system" groups. +

      +
    20. + +
    21. + Can the wrapper successfully become the target user + and group? + +

      + Here is where the program becomes the target user and + group via setuid and setgid calls. The group access list + is also initialized with all of the groups of which the + user is a member. +

      +
    22. + +
    23. + Can we change directory to the one in which the target + CGI/SSI program resides? + +

      + If it doesn't exist, it can't very well contain files. If we + can't change directory to it, it might aswell not exist. +

      +
    24. + +
    25. + Is the directory within the Apache + webspace? + +

      + If the request is for a regular portion of the server, is + the requested directory within suEXEC's document root? If + the request is for a UserDir, is the requested directory + within the directory configured as suEXEC's userdir (see + suEXEC's configuration options)? +

      +
    26. + +
    27. + Is the directory NOT writable by anyone + else? + +

      + We don't want to open up the directory to others; only + the owner user may be able to alter this directories + contents. +

      +
    28. + +
    29. + Does the target CGI/SSI program exist? + +

      + If it doesn't exists, it can't very well be executed. +

      +
    30. + +
    31. + Is the target CGI/SSI program NOT writable + by anyone else? + +

      + We don't want to give anyone other than the owner the + ability to change the CGI/SSI program. +

      +
    32. + +
    33. + Is the target CGI/SSI program NOT setuid or + setgid? + +

      + We do not want to execute programs that will then change + our UID/GID again. +

      +
    34. + +
    35. + Is the target user/group the same as the program's + user/group? + +

      + Is the user the owner of the file? +

      +
    36. + +
    37. + Can we successfully clean the process environment + to ensure safe operations? + +

      + suEXEC cleans the process' environment by establishing a + safe execution PATH (defined during configuration), as + well as only passing through those variables whose names + are listed in the safe environment list (also created + during configuration). +

      +
    38. + +
    39. + Can we successfully become the target CGI/SSI program + and execute? + +

      + Here is where suEXEC ends and the target CGI/SSI program begins. +

      +
    40. +
    + +

    This is the standard operation of the + suEXEC wrapper's security model. It is somewhat stringent and + can impose new limitations and guidelines for CGI/SSI design, + but it was developed carefully step-by-step with security in + mind.

    + +

    For more information as to how this security + model can limit your possibilities in regards to server + configuration, as well as what security risks can be avoided + with a proper suEXEC setup, see the "Beware the Jabberwock" section of this + document.

    +
    top
    +
    +

    Configuring & Installing + suEXEC

    + +

    Here's where we begin the fun.

    + +

    suEXEC configuration + options
    +

    + +
    +
    --enable-suexec
    + +
    This option enables the suEXEC feature which is never + installed or activated by default. At least one + --with-suexec-xxxxx option has to be provided + together with the --enable-suexec option to let + APACI accept your request for using the suEXEC feature.
    + +
    --with-suexec-bin=PATH
    + +
    The path to the suexec binary must be hard-coded + in the server for security reasons. Use this option to override + the default path. e.g. + --with-suexec-bin=/usr/bin/suexec
    + +
    --with-suexec-caller=UID
    + +
    The username under which + Apache normally runs. This is the only user allowed to + execute this program.
    + +
    --with-suexec-userdir=DIR
    + +
    Define to be the subdirectory under users' home + directories where suEXEC access should be allowed. All + executables under this directory will be executable by suEXEC + as the user so they should be "safe" programs. If you are + using a "simple" UserDir + directive (ie. one without a "*" in it) this should be set to the same + value. suEXEC will not work properly in cases where the UserDir directive points to + a location that is not the same as the user's home directory + as referenced in the passwd file. Default value is + "public_html".
    + If you have virtual hosts with a different UserDir for each, + you will need to define them to all reside in one parent + directory; then name that parent directory here. If + this is not defined properly, "~userdir" cgi requests will + not work!
    + +
    --with-suexec-docroot=DIR
    + +
    Define as the DocumentRoot set for Apache. This will be + the only hierarchy (aside from UserDirs) that can be used for suEXEC behavior. The + default directory is the --datadir value with the suffix + "/htdocs", e.g. if you configure with + "--datadir=/home/apache" the directory + "/home/apache/htdocs" is used as document root for the + suEXEC wrapper.
    + +
    --with-suexec-uidmin=UID
    + +
    Define this as the lowest UID allowed to be a target user + for suEXEC. For most systems, 500 or 100 is common. Default + value is 100.
    + +
    --with-suexec-gidmin=GID
    + +
    Define this as the lowest GID allowed to be a target + group for suEXEC. For most systems, 100 is common and + therefore used as default value.
    + +
    --with-suexec-logfile=FILE
    + +
    This defines the filename to which all suEXEC + transactions and errors are logged (useful for auditing and + debugging purposes). By default the logfile is named + "suexec_log" and located in your standard logfile + directory (--logfiledir).
    + +
    --with-suexec-safepath=PATH
    + +
    Define a safe PATH environment to pass to CGI + executables. Default value is + "/usr/local/bin:/usr/bin:/bin".
    +
    + +

    Compiling and installing the suEXEC wrapper

    + + +

    If you have enabled the suEXEC feature with the + --enable-suexec option the suexec binary + (together with Apache itself) is automatically built if you execute + the make command.

    + +

    After all components have been built you can execute the + command make install to install them. The binary image + suexec is installed in the directory defined by the + --sbindir option. The default location is + "/usr/local/apache2/bin/suexec".

    + +

    Please note that you need root + privileges for the installation step. In order + for the wrapper to set the user ID, it must be installed as + owner root and must have the setuserid + execution bit set for file modes.

    + + +

    Setting paranoid permissions

    + + +

    Although the suEXEC wrapper will check to ensure that its + caller is the correct user as specified with the + --with-suexec-caller configure + option, there is + always the possibility that a system or library call suEXEC uses + before this check may be exploitable on your system. To counter + this, and because it is best-practise in general, you should use + filesystem permissions to ensure that only the group Apache + runs as may execute suEXEC.

    + +

    If for example, your web server is configured to run as:

    + +

    + User www
    + Group webgroup
    +

    + +

    and suexec is installed at + "/usr/local/apache2/bin/suexec", you should run:

    + +

    + chgrp webgroup /usr/local/apache2/bin/suexec
    + chmod 4750 /usr/local/apache2/bin/suexec
    +

    + +

    This will ensure that only the group Apache runs as can even + execute the suEXEC wrapper.

    + +
    top
    +
    +

    Enabling & Disabling + suEXEC

    + +

    Upon startup of Apache, it looks for the file + suexec in the directory defined by the + --sbindir option (default is + "/usr/local/apache/bin/suexec"). If Apache finds a properly + configured suEXEC wrapper, it will print the following message + to the error log:

    + +

    + [notice] suEXEC mechanism enabled (wrapper: /path/to/suexec) +

    + +

    If you don't see this message at server startup, the server is + most likely not finding the wrapper program where it expects + it, or the executable is not installed setuid root.

    + +

    If you want to enable the suEXEC mechanism for the first time + and an Apache server is already running you must kill and + restart Apache. Restarting it with a simple HUP or USR1 signal + will not be enough.

    +

    If you want to disable suEXEC you should kill and restart + Apache after you have removed the suexec file.

    +
    top
    +
    +

    Using suEXEC

    + +

    Requests for CGI programs will call the suEXEC wrapper only if + they are for a virtual host containing a SuexecUserGroup directive or if + they are processed by mod_userdir.

    + +

    Virtual Hosts:
    One way to use the suEXEC + wrapper is through the SuexecUserGroup directive in + VirtualHost definitions. By + setting this directive to values different from the main server + user ID, all requests for CGI resources will be executed as the + User and Group defined for that <VirtualHost>. If this + directive is not specified for a <VirtualHost> then the main server userid + is assumed.

    + +

    User directories:
    Requests that are + processed by mod_userdir will call the suEXEC + wrapper to execute CGI programs under the userid of the requested + user directory. The only requirement needed for this feature to + work is for CGI execution to be enabled for the user and that the + script must meet the scrutiny of the security + checks above. See also the + --with-suexec-userdir compile + time option.

    top
    +
    +

    Debugging suEXEC

    + +

    The suEXEC wrapper will write log information + to the file defined with the --with-suexec-logfile + option as indicated above. If you feel you have configured and + installed the wrapper properly, have a look at this log and the + error_log for the server to see where you may have gone astray.

    + +
    top
    +
    +

    Beware the Jabberwock: + Warnings & Examples

    + +

    NOTE! This section may not be + complete. For the latest revision of this section of the + documentation, see the Apache Group's Online + Documentation version.

    + +

    There are a few points of interest regarding + the wrapper that can cause limitations on server setup. Please + review these before submitting any "bugs" regarding suEXEC.

    + +
      +
    • suEXEC Points Of Interest
    • + +
    • + Hierarchy limitations + +

      + For security and efficiency reasons, all suEXEC requests + must remain within either a top-level document root for + virtual host requests, or one top-level personal document + root for userdir requests. For example, if you have four + VirtualHosts configured, you would need to structure all + of your VHosts' document roots off of one main Apache + document hierarchy to take advantage of suEXEC for + VirtualHosts. (Example forthcoming.) +

      +
    • + +
    • + suEXEC's PATH environment variable + +

      + This can be a dangerous thing to change. Make certain + every path you include in this define is a + trusted directory. You don't want to + open people up to having someone from across the world + running a trojan horse on them. +

      +
    • + +
    • + Altering the suEXEC code + +

      + Again, this can cause Big Trouble if you + try this without knowing what you are doing. Stay away + from it if at all possible. +

      +
    • +
    + +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/suexec.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/suexec.html.ja.utf8 new file mode 100644 index 00000000..3d533b35 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/suexec.html.ja.utf8 @@ -0,0 +1,613 @@ + + + +suEXEC サポート - Apache HTTP サーバ + + + + + +
    <-
    +

    suEXEC サポート

    +
    +

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

    +
    +
    This translation may be out of date. Check the + English version for recent changes.
    + +

    suEXEC + 機能により、Apache ユーザは Web サーバを実行しているユーザ ID とは + 異なるユーザ ID で CGI プログラムや SSI + プログラムを実行することができます。CGI プログラムまたは SSI + プログラムを実行する場合、通常は web サーバと同じユーザで実行されます。 +

    + +

    適切に使用すると、この機能によりユーザが個別の CGI + や SSI プログラムを開発し実行することで生じるセキュリティ上の危険を、 + かなり減らすことができます。しかし、suEXEC の設定が不適切だと、 + 多くの問題が生じ、あなたのコンピュータに新しいセキュリティホールを + 作ってしまう可能性があります。あなたが setuid root + されたプログラムと、それらから生じるセキュリティ上の問題の管理に + 詳しくないようなら、suEXEC の使用を検討しないように強く推奨します。 +

    +
    + +
    top
    +
    +

    始める前に

    + +

    この文書の先頭に飛ぶ前に、Apache + グループとこの文書での仮定を知っておくべきでしょう。 +

    + +

    第 1 に、あなたが setuid と + setgid 操作が可能な UNIX + 由来のオペレーティングシステムを使っていることを想定しています。 + これは、すべてのコマンド例にあてはまります。 + その他のプラットホームでは、もし suEXEC + がサポートされていたとしても設定は異なるかもしれません。

    + +

    第 2 に、あなたが使用中のコンピュータの + セキュリティに関する基本的な概念と、それらの管理について詳しいことを + 想定しています。これは、setuid/setgid + 操作、あなたのシステム上でのその操作による様々な効果、 + セキュリティレベルについてあなたが理解しているということを含みます。 +

    + +

    第 3 に、改造されていない suEXEC + コードの使用を想定しています。suEXEC のコードは、 + 多くのベータテスタだけでなく、開発者によっても注意深く精査され + テストされています。それらの注意により、簡潔で信頼できる安全な + コードの基盤が保証されます。このコードを改変することで、 + 予期されない問題や新しいセキュリティ上の危険が生じることがあります。 + セキュリティプログラミングの詳細に通じていて、 + 今後の検討のために成果を Apache + グループと共有しようと思うのでなければ、suEXEC + コードは変えないことを 強く推奨します。

    + +

    第 4 に、これが最後ですが、suEXEC を Apache + のデフォルトインストールには含めないことが + Apache グループで決定されています。これは、suEXEC + の設定には管理者の詳細にわたる慎重な注意が必要だからです。 + suEXEC の様々な設定について検討が終われば、管理者は suEXEC + を通常のインストール方法でインストールすることができます。 + これらの設定値は、suEXEC + 機能の使用中にシステムセキュリティを適切に保つために、 + 管理者によって慎重に決定され指定されることが必要です。 + この詳細な手順により、Apache グループは、suEXEC + のインストールについて、注意深く十分に検討してそれを使用することを + 決定した場合に限っていただきたいと考えています。 +

    + +

    それでも進みますか? よろしい。では、先へ進みましょう!

    +
    top
    +
    +

    suEXEC セキュリティモデル

    + +

    suEXEC の設定とインストールを始める前に、 + まず実装しようとしているセキュリティモデルについて論じておきます。 + それには、suEXEC の内部で行なわれていること、 + システムのセキュリティを保証するために警告されることを + よく理解しておいた方がよいでしょう。

    + +

    suEXEC は、Apache web + サーバから呼び出される setuid された "wrapper" + プログラムが基本となっています。設計した CGI、または SSI + プログラムへの HTTP リクエストがあると、この wrapper + が呼び出されます。このようなリクエストがあると、Apache + はそのプログラムが実行される際のプログラム名とユーザ ID とグループ + ID を指定して suEXEC wrapper を実行します。 +

    + +

    それから、wrapper は成功または失敗を決定するため + 以下の処理を行ないます。これらの状態のうち一つでも失敗した場合、 + プログラムは失敗をログに記録してエラーで終了します。 + そうでなければ、後の処理が続けられます。

    + +
      +
    1. + wrapper + を実行しているユーザはこのシステムの正当なユーザか? + +

      + これは、wrapper を実行しているユーザが + 本当にシステムの利用者であることを保証するためです。 +

      +
    2. + + +
    3. + wrapper が適切な数の引数で呼び出されたか? + + +

      + wrapper は適切な数の引数が与えられた場合にのみ実行されます。 + 適切な引数のフォーマットは Apache Web サーバに解釈されます。 + 適切な数の引数を受け取らなければ、攻撃をされたか + あなたの Apache バイナリの suEXEC の部分が + どこかおかしい可能性があります。 +

      +
    4. + +
    5. + この正当なユーザは wrapper + の実行を許可されているか? + +

      + このユーザは wrapper 実行を許可されたユーザですか? + ただ一人のユーザ (Apache ユーザ) だけが、 + このプログラムの実行を許可されます。 +

      +
    6. + +
    7. + 対象の CGI, SSI プログラムが安全でない階層の参照をしているか? + + +

      + 対象の CGI, SSI プログラムが '/' から始まる、または + '..' による参照を行なっていますか? これらは許可されません。 + 対象のプログラムは suEXEC のドキュメントルート + (下記の --with-suexec-docroot=DIR を参照) + 内に存在しなければなりません。 +

      +
    8. + +
    9. + 対象となるユーザ名は正当なものか? + +

      + 対象となるユーザ名は存在していますか? +

      +
    10. + +
    11. + 対象となるグループ名は正当なものか? + +

      + 対象となるグループ名は存在していますか? +

      +
    12. + +
    13. + 目的のユーザはスーパーユーザではないか? + + +

      + 今のところ、suEXEC は root による CGI/SSI + プログラムの実行を許可していません。 +

      +
    14. + +
    15. + 対象となるユーザ ID は、最小の ID + 番号よりも大きいか? + +

      + 最小ユーザ ID 番号は設定時に指定されます。これは、 + CGI/SSI プログラム実行を許可されるユーザ ID + のとりうる最小値です。これは + "system" 用のアカウントを閉め出すのに有効です。 +

      +
    16. + +
    17. + 対象となるグループはスーパーユーザのグループでは + ないか? + +

      + 今のところ、suEXEC は 'root' グループによる CGI/SSI + プログラムの実行を許可していません。 +

      +
    18. + +
    19. + 対象となるグループ ID は最小の ID + 番号よりも大きいか? + +

      + 最小グループ ID 番号は設定時に指定されます。これは、 + CGI/SSI プログラム実行を許可されるグループ + ID のとりうる最小値です。 + これは "system" 用のグループを閉め出すのに有効です。 +

      +
    20. + +
    21. + wrapper が正常に対象となるユーザとグループになれるか? + + +

      + ここで、setuid と setgid + の起動によりプログラムは対象となるユーザとグループになります。 + グループアクセスリストは、 + ユーザが属しているすべてのグループで初期化されます。 +

      +
    22. + +
    23. + CGI/SSI プログラムが置かれているディレクトリに移動 + (change directory) できるか? + +

      + ディレクトリが存在しないなら、そのファイルも存在しないかもしれません。 + ディレクトリに移動できないのであれば、おそらく存在もしないでしょう。 +

      +
    24. + +
    25. + ディレクトリが Apache のドキュメントツリー内にあるか? + + +

      + リクエストがサーバ内のものであれば、 + 要求されたディレクトリが suEXEC のドキュメントルート配下にありますか? + リクエストが UserDir のものであれば、要求されたディレクトリが suEXEC + のユーザのドキュメントルート配下にありますか? + (suEXEC 設定オプション 参照) +

      +
    26. + +
    27. + ディレクトリを他のユーザが書き込めるようになって + いないか? + +

      + ディレクトリを他ユーザに開放しないようにします。 + 所有ユーザだけがこのディレクトリの内容を改変できるようにします。 +

      +
    28. + + +
    29. + 対象となる CGI/SSI プログラムは存在するか? + +

      + 存在しなければ実行できません。 +

      +
    30. + +
    31. + 対象となる CGI/SSI プログラムファイルが他アカウントから + 書き込めるようになっていないか? + +

      + 所有者以外には CGI/SSI プログラムを変更する権限は与えられません。 +

      +
    32. + + +
    33. + 対象となる CGI/SSI プログラムが setuid または setgid + されていないか? + +

      + UID/GID を再度変更してのプログラム実行はしません +

      +
    34. + + +
    35. + 対象となるユーザ/グループがプログラムの + ユーザ/グループと同じか? + +

      + ユーザがそのファイルの所有者ですか? +

      +
    36. + +
    37. + 安全な動作を保証するための環境変数クリアが可能か? + + +

      + suEXEC は、安全な環境変数のリスト + (これらは設定時に作成されます) 内の変数として渡される安全な + PATH 変数 (設定時に指定されます) を設定することで、 + プロセスの環境変数をクリアします。 +

      +
    38. + + +
    39. + 対象となる CGI/SSI プログラムを exec して実行できるか? + + +

      + ここで suEXEC が終了し、対象となるプログラムが開始されます。 +

      +
    40. +
    + +

    ここまでが suEXEC の wrapper + におけるセキュリティモデルの標準的な動作です。もう少し厳重に + CGI/SSI 設計についての新しい制限や規定を取り入れることもできますが、 + suEXEC はセキュリティに注意して慎重に少しずつ開発されてきました。 +

    + +

    このセキュリティモデルを用いて + サーバ設定時にどのように許すことを制限するか、また、suEXEC + を適切に設定するとどのようなセキュリティ上の危険を避けられるかに + 関するより詳しい情報については、"とかげに注意" + (Beware the Jabberwock) の章を参照してください。 +

    +
    top
    +
    +

    suEXEC + の設定とインストール

    + +

    ここから楽しくなります。

    + +

    suEXEC + 設定オプション
    +

    + +
    +
    --enable-suexec
    + +
    このオプションは、デフォルトではインストールされず、 + 有効にはならない suEXEC 機能を有効にします。 + suEXEC を使うように APACI に要求するには、--enable-suexec + オプションにあわせて少なくとも一つは --with-suexec-xxxxx + オプションが指定されなければなりません。
    + +
    --with-suexec-bin=PATH
    + +
    セキュリティ上の理由により、suexec バイナリのパスはサーバに + ハードコードされている必要があります。デフォルトのパスを + 変えたいときはこのオプションを使ってください。例えば、 + --with-suexec-bin=/usr/sbin/suexec のように。
    + +
    --with-suexec-caller=UID
    + +
    Apache を通常動作させるユーザ名を指定します。 + このユーザだけが suexec の実行を許可されたユーザになります。
    + +
    --with-suexec-userdir=DIR
    + +
    suEXEC がアクセスを許されるユーザホームディレクトリ配下の + サブディレクトリを指定します。 + このディレクトリ以下の全実行ファイルは、"安全な"プログラムになるよう、 + suEXEC がそのユーザとして実行できるようにします。 + "単純な" UserDir ディレクティブを使っている場合 + (すなわち "*" を含まないもの)、これと同じ値を設定すべきです。 + Userdir ディレクティブがそのユーザのパスワードファイル内の + ホームディレクトリと同じ場所を指していなければ、 + suEXEC は適切に動作しません。デフォルトは "public_html" です。 +
    + 各 UserDir が異なった仮想ホストを設定している場合、 + それらを全て一つの親ディレクトリに含めて、 + その親ディレクトリの名前をここで指定する必要があります。 + このように指定されなければ "~userdir" cgi + へのリクエストが動作しません。
    + +
    --with-suexec-docroot=DIR
    + +
    Apache のドキュメントルートを設定します。これが suEXEC + の動作で使用する唯一のディレクトリ階層になります (UserDir + の指定は別)。デフォルトでは --datedir に "/htdocs" + というサフィックスをつけたものです。 + "--datadir=/home/apache" として設定すると、 + suEXEC wrapper にとって "/home/apache/htdocs" + がドキュメントルートとして使われます。
    + +
    --with-suexec-uidmin=UID
    + +
    suEXEC の対象ユーザとして許される UID の最小値を指定します。 + 大抵のシステムでは 500 か 100 が一般的です。 + デフォルト値は 100 です。
    + +
    --with-suexec-gidmin=GID
    + +
    suEXEC の対象グループとして許される GID + の最小値を指定します。大抵のシステムでは 100 が一般的なので、 + デフォルト値としても 100 が使われています。
    + +
    --with-suexec-logfile=FILE
    + +
    suEXEC の処理とエラーが記録されるファイル名を指定します。 + (監査やデバッグ目的に有用) + デフォルトではログファイルは "suexec_log" という名前で、 + 標準のログファイルディレクトリ (--logfiledir) に置かれます。 +
    + +
    --with-suexec-safepath=PATH
    + +
    CGI 実行ファイルに渡される安全な PATH 環境変数です。 + デフォルト値は "/usr/local/bin:/usr/bin:/bin" です。 +
    +
    + +

    suEXEC wrapper + のコンパイルとインストール
    + --enable-suexec オプションで suEXEC 機能を有効にすると、 + "make" コマンドを実行した時に suexec のバイナリ (Apache 自体も) + が自動的に作成されます。 +
    + すべての構成要素が作成されると、それらのインストールには + make install コマンドが実行できます。バイナリイメージの suexec + は --sbindir オプションで指定されたディレクトリにインストールされます。 + デフォルトの場所は "/usr/local/apache/sbin/suexec" です。
    + インストール時には root + 権限が必要なので注意してください。wrapper がユーザ ID + を設定するために、所有者 root + でのセットユーザ ID + ビットをそのファイルのモードに設定しなければなりません。 +

    + +

    安全なパーミッションを設定する
    + suEXEC ラッパーは、--with-suexec-caller configure + オプションで指定した正しいユーザで起動されていることを確認しますが、 + システム上でこのチェックが行なわれる前に、 + suEXEC が呼ぶシステムやライブラリが脆弱である可能性は残ります。対抗策として、 + 一般に良い習慣ともされいますが、 + ファイルシステムパーミッションを使って + Apache の実行時のグループのみが suEXEC を実行できるように + するのが良いでしょう。

    + +

    たとえば、次のようにサーバが設定されていたとします。

    + +

    + User www
    + Group webgroup
    +

    + +

    suexec が "/usr/local/apache2/sbin/suexec" + にインストールされていた場合、次のように設定する必要があります。

    + +

    + chgrp webgroup /usr/local/apache2/bin/suexec
    + chmod 4750 /usr/local/apache2/bin/suexec
    +

    + +

    これで Apache が実行されるグループのみが + suEXEC ラッパーを実行できるということを + 確証します。

    +
    top
    +
    +

    suEXEC + の有効化と無効化

    + +

    起動時に、Apache は --sbindir + オプションで設定されたディレクトリで + suexec を探します + (デフォルトは "/usr/local/apache/sbin/suexec") 。 + 適切に設定された suEXEC がみつかると、 + エラーログに以下のメッセージが出力されます。

    + +

    + [notice] suEXEC mechanism enabled (wrapper: /path/to/suexec) +

    + +

    サーバ起動時にこのメッセージが出ない場合、 + 大抵はサーバが想定した場所で wrapper プログラムが見つからなかったか、 + setuid root としてインストールされていないかです。

    + +

    suEXEC の仕組みを使用するのが初めてで、Apache が既に動作中であれば、 + Apache を kill して、再起動しなければなりません。HUP シグナルや + USR1 シグナルによる単純な再起動では不十分です。

    +

    suEXEC を無効にする場合は、suexec ファイルを削除してから + Apache を kill して再起動します。 +

    +
    top
    +
    +

    suEXEC の使用

    + +

    CGI プログラムへのリクエストが suEXEC ラッパーを呼ぶのは、 + SuexecUserGroup ディレクティブを + 含むバーチャルホストへのリクエストか、mod_userdir により + 処理されたリクエストの場合に限ります。

    + +

    仮想ホスト:
    + suEXEC wrapper の使い方として、 + VirtualHost 設定での + SuexecUserGroup + ディレクティブを通したものがあります。 + このディレクティブをメインサーバのユーザ ID + と異なるものにすると、CGI リソースへのすべてのリクエストは、その + <VirtualHost> で指定された User と + Group として実行されます。<VirtualHost> + でこのディレクティブが指定されていない場合、 + メインサーバのユーザ ID が想定されます。

    + +

    ユーザディレクトリ:
    + mod_userdir により処理されたリクエストは + リクエストされたユーザディレクトリのユーザ ID で CGI プログラムを + 実行するために suEXEC ラッパーを呼びます。 + この機能を動作させるために必要なことは、CGI + をそのユーザで実行できること、そのスクリプトが上記のセキュリティ検査をパスできることです。 + コンパイル + 時のオプション --with-suexec-userdir も参照してください。

    +
    top
    +
    +

    suEXEC のデバッグ

    + +

    suEXEC wrapper は、上記で述べた --with-suexec-logfile + オプションで指定されたファイルにログ情報を記録します。 + wrapper を適切に設定、インストールできていると思う場合、 + どこで迷っているか見ようとするならこのログとサーバの + エラーログを見るとよいでしょう。

    +
    top
    +
    +

    とかげに注意: 警告と事例

    + +

    注意! + この章は完全ではありません。この章の最新改訂版については、 + Apache グループの + オンラインドキュメント版を参照してください。 +

    + +

    サーバの設定に制限をもうける wrapper について、 + いくつか興味深い点があります。suEXEC に関する "バグ" + を報告する前にこれらを確認してください。

    + +
      +
    • suEXEC の興味深い点
    • + +
    • 階層構造の制限 + + +

      + セキュリティと効率の理由から、suEXEC の全てのリクエストは + 仮想ホストへのリクエストにおける最上位のドキュメントルート内か、 + ユーザディレクトリへのリクエストにおける個々のユーザの最上位の + ドキュメントルート内に残らなければなりません。 + 例えば、四つの仮想ホストを設定している場合、 + 仮想ホストの suEXEC に有利なように、メインの Apache + ドキュメント階層の外側に全ての仮想ホストのドキュメントルートを + 構築する必要があります。(例は後日記載) +

      +
    • + +
    • suEXEC の PATH 環境変数 + + +

      + これを変更するのは危険です。この指定に含まれる各パスが + 信頼できる + ディレクトリであることを確認してください。 + 世界からのアクセスにより、誰かがホスト上でトロイの木馬 + を実行できるようにはしたくないでしょう。 +

      +
    • + +
    • suEXEC コードの改造 + + +

      + 繰り返しますが、何をやろうとしているか把握せずにこれをやると + 大きな問題を引き起こしかねません。 + 可能な限り避けてください。 +

      +
    • +
    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/suexec.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/suexec.html.ko.euc-kr new file mode 100644 index 00000000..89b9119c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/suexec.html.ko.euc-kr @@ -0,0 +1,536 @@ + + + +suEXEC Áö¿ø - Apache HTTP Server + + + + + +
    <-
    +

    suEXEC Áö¿ø

    +
    +

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

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

    suEXEC ±â´ÉÀº ¾ÆÆÄÄ¡°¡ CGI¿Í + SSI ÇÁ·Î±×·¥À» À¥¼­¹ö¸¦ ½ÇÇàÇÑ »ç¿ëÀÚ ID°¡ + ¾Æ´Ñ ´Ù¸¥ »ç¿ëÀÚ ID·Î ½ÇÇàÇϵµ·Ï ÇÑ´Ù. º¸Åë CGI³ª SSI ÇÁ·Î±×·¥À» + ½ÇÇàÇϸé À¥¼­¹ö¸¦ ½ÇÇàÇÑ »ç¿ëÀÚ¿Í °°Àº »ç¿ëÀÚ·Î ½ÇÇàÇÑ´Ù.

    + +

    ÀÌ ±â´ÉÀ» ÀûÀýÈ÷ »ç¿ëÇÏ¸é »ç¿ëÀÚ°¡ Á÷Á¢ CGI³ª SSI ÇÁ·Î±×·¥À» + °³¹ßÇÏ°í ½ÇÇàÇÒ¶§ ¹ß»ýÇÒ ¼ö ÀÖ´Â º¸¾ÈÀ§ÇèÀ» »ó´çÈ÷ ÁÙÀÏ + ¼ö ÀÖ´Ù. ±×·¯³ª suEXEC°¡ ºÎÀûÀýÇÏ°Ô ¼³Á¤µÇ¸é ¸¹Àº ¹®Á¦¿Í + ÄÄÇ»ÅÍ¿¡ »õ·Î¿î º¸¾È ÇãÁ¡À» ¸¸µé ¼ö ÀÖ´Ù. ¸¸¾à setuid root + ÇÁ·Î±×·¥°ú ÀÌ·± ÇÁ·Î±×·¥ÀÇ º¸¾È ¹®Á¦¿¡ »ý¼ÒÇÏ´Ù¸é suEXEC¸¦ + »ç¿ëÇÏÁö¾Ê±æ Áø½ÉÀ¸·Î ¹Ù¶õ´Ù.

    +
    + +
    top
    +
    +

    ½ÃÀÛÇϱâ Àü¿¡

    + +

    ½ÃÀÛÇϱâ Àü¿¡ ¿ì¼± ¾ÆÆÄÄ¡±×·ì°ú ÀÌ ¹®¼­ÀÇ °¡Á¤À» ¹àÈù´Ù.

    + +

    ¸ÕÀú setuid¿Í setgid + ±â´ÉÀÌ °¡´ÉÇÑ À¯´Ð½º·ù ¿î¿µÃ¼Á¦¸¦ »ç¿ëÇÑ´Ù°í °¡Á¤ÇÑ´Ù. ¸ðµç + ¸í·É¾î ¿¹µéµµ °°Àº °¡Á¤À» ÇÑ´Ù. suEXEC¸¦ Áö¿øÇÏ´Â ´Ù¸¥ Ç÷¡ÆûÀ» + »ç¿ëÇÏ´Ù¸é ¼³Á¤ÀÌ ´Ù¸¦ ¼ö ÀÖ´Ù.

    + +

    µÎ¹ø°, ´ç½ÅÀÌ ÄÄÇ»ÅÍ º¸¾ÈÀÇ ±âº» °³³ä°ú °ü¸®¿¡ Àͼ÷ÇÏ´Ù°í + °¡Á¤ÇÑ´Ù. ¿©±â¿¡´Â setuid/setgid ±â´É°ú + À̵éÀÌ ½Ã½ºÅÛ°ú º¸¾È¿¡ ¹ÌÄ¡´Â ¿©·¯ ¿µÇâ¿¡ ´ëÇÑ ÀÌÇØ°¡ Æ÷ÇԵȴÙ.

    + +

    ¼¼¹ø°, suEXEC ÄÚµåÀÇ ¼öÁ¤ÇÏÁö¾ÊÀº + ¹öÀüÀ» »ç¿ëÇÑ´Ù°í °¡Á¤ÇÑ´Ù. °³¹ßÀÚ¿Í ¿©·¯ º£Å¸Å×½ºÅ͵éÀº + suEXEC¿Í °ü·ÃµÈ ¸ðµç Äڵ带 Á¶½É½º·´°Ô Á¶»çÇÏ°í °Ë»çÇß´Ù. + Äڵ带 °£´ÜÇÏ°Ô ÇÏ°í È®½ÇÇÑ ¾ÈÀüÀ» º¸ÀåÇϱâÀ§ÇØ ¸ðµç ÁÖÀǸ¦ + ±â¿ï¿´´Ù. ÀÌ Äڵ带 ¼öÁ¤ÇÏ¸é ¿¹»óÄ¡¸øÇÑ ¹®Á¦¿Í »õ·Î¿î º¸¾È + À§ÇèÀÌ ¹ß»ýÇÒ ¼ö ÀÖ´Ù. º¸¾È ÇÁ·Î±×·¡¹Ö¿¡ ´ëÇØ ¸Å¿ì Àß ¾Ë°í + Äڵ带 »ìÆ캸±âÀ§ÇØ ¾ÆÆÄÄ¡±×·ì°ú ÀÛ¾÷À» °øÀ¯ÇÒ Àǻ簡 ¾ø´Ù¸é + suEXEC Äڵ带 ¼öÁ¤ÇÏÁö¾Ê±æ °­·ÂÈ÷ ±ÇÇÑ´Ù.

    + +

    ³×¹ø°ÀÌÀÚ ¸¶Áö¸·À¸·Î, ¾ÆÆÄÄ¡±×·ìÀº suEXEC¸¦ ¾ÆÆÄÄ¡ + ±âº»¼³Ä¡¿¡ Æ÷ÇÔÇÏÁö ¾Ê±â·Î °áÁ¤Çß´Ù. °á±¹ + °ü¸®ÀÚ°¡ ÁÖÀǸ¦ ±â¿ï¿©¼­ suEXEC¸¦ ¼³Á¤ÇØ¾ß ÇÑ´Ù. suEXECÀÇ + ¿©·¯ ¼³Á¤À» Àß °í·ÁÇÑÈÄ °ü¸®ÀÚ´Â ÀϹÝÀûÀÎ ¼³Ä¡¹æ¹ýÀ» suEXEC¸¦ + ¼³Ä¡ÇÒ ¼ö ÀÖ´Ù. suEXEC ±â´ÉÀ» »ç¿ëÇÏ´Â ½Ã½ºÅÛÀÇ º¸¾ÈÀ» Ã¥ÀÓÁö´Â + °ü¸®ÀÚ´Â ÀÌ ¼³Á¤°ªµéÀ» ÁÖÀÇÀÖ°Ô »ìÆ캸°í ÁöÁ¤ÇØ¾ß ÇÑ´Ù. + ÀÌ·± »ó¼¼ÇÑ °úÁ¤Àº suEXEC¸¦ »ç¿ëÇÒ¸¸Å­ ÁÖÀÇÀÖ°í ´ÜÈ£ÇÑ + »ç¶÷¸¸ÀÌ suEXEC¸¦ »ç¿ëÇϵµ·Ï ¾ÆÆÄÄ¡±×·ìÀÌ ¿øÇϱ⠶§¹®ÀÌ´Ù.

    + +

    ¾ÆÁ÷µµ »ç¿ëÇÏ±æ ¿øÇϴ°¡? ±×·±°¡? ÁÁ´Ù. ÀÌÁ¦ ½ÃÀÛÇÏÀÚ!

    +
    top
    +
    +

    suEXEC º¸¾È¸ðµ¨

    + +

    suEXEC¸¦ ±¸¼ºÇÏ°í ¼³Ä¡Çϱâ Àü¿¡ ¿ì¸®´Â º¸¾È¸ðµ¨À» ¸ÕÀú + ¼³¸íÇÑ´Ù. À̸¦ ÅëÇØ Á¤È®È÷ suEXEC ¾È¿¡¼­´Â ¹«½¼ ÀÏÀÌ ÀϾ¸ç + ½Ã½ºÅÛÀÇ º¸¾ÈÀ» À§ÇØ ¹«¾ùÀ» Á¶½ÉÇØ¾ß ÇÒÁö ´õ Àß ÀÌÇØÇÒ ¼ö + ÀÖ´Ù.

    + +

    suEXEC´Â ¾ÆÆÄÄ¡ À¥¼­¹ö°¡ ºÎ¸£´Â setuid + "wrapper" ÇÁ·Î±×·¥À» ±â¹ÝÀ¸·Î ÇÑ´Ù. ÀÌ wrapper´Â °ü¸®ÀÚ°¡ + ÁÖ¼­¹ö¿Í ´Ù¸¥ userid·Î ½ÇÇàÇϵµ·Ï ¼³Á¤ÇÑ CGI³ª SSI ÇÁ·Î±×·¥¿¡ + HTTP ¿äûÀÌ ¿À¸é ºÒ¸°´Ù. ÀÌ·± ¿äûÀÌ ¿À¸é ¾ÆÆÄÄ¡´Â suEXEC + wrapper¿¡°Ô ÇÁ·Î±×·¥¸í°ú ÇÁ·Î±×·¥À» ½ÇÇàÇÒ »ç¿ëÀÚ¿Í ±×·ì + ID¸¦ Á¦°øÇÑ´Ù.

    + +

    ±×·¯¸é wrapper´Â ´ÙÀ½ °úÁ¤À» ÅëÇØ ¼º°ø°ú ½ÇÆи¦ °áÁ¤ÇÑ´Ù. + ÀÌ Á¶°ÇÁß Çϳª¶óµµ ½ÇÆÐÇϸé ÇÁ·Î±×·¥Àº ½ÇÆзΠ±â·ÏµÇ°í ¿À·ù¸¦ + ³»¸ç Á¾·áÇÑ´Ù. ½ÇÆÐÇÏÁö ¾ÊÀ¸¸é °úÁ¤À» °è¼ÓÇÑ´Ù:

    + +
      +
    1. + wrapper¸¦ ½ÇÇàÇÏ´Â »ç¿ëÀÚ°¡ ½Ã½ºÅÛÀÇ Á¤»óÀûÀÎ + »ç¿ëÀÚÀΰ¡? + +

      + wrapper¸¦ ½ÇÇàÇÏ´Â »ç¿ëÀÚ°¡ ½ÇÁ¦·Î ½Ã½ºÅÛÀÇ »ç¿ëÀÚÀÎÁö + È®ÀÎÇÑ´Ù. +

      +
    2. + +
    3. + ÀûÀýÇÑ ¼öÀÇ ¾Æ±Ô¸ÕÆ®·Î wrapper¸¦ ½ÇÇàÇϴ°¡? + +

      + wrapper´Â ÀûÀýÇÑ ¼öÀÇ ¾Æ±Ô¸ÕÆ®°¡ ÀÖ¾î¾ß¸¸ ½ÇÇàµÈ´Ù. + ¾ÆÆÄÄ¡ À¥¼­¹ö°¡ ÀÌ °³¼ö¸¦ ¾È´Ù. wrapper°¡ ÀûÀýÇÑ ¼öÀÇ + ¾Æ±Ô¸ÕÆ®¸¦ ¹ÞÁö¸øÇϸé ÇØÅ·µÇ¾ú°Å³ª ¾ÆÆÄÄ¡ÀÇ suEXEC¿¡ + ¹º°¡ ¹®Á¦°¡ ÀÖ´Â °ÍÀÌ´Ù. +

      +
    4. + +
    5. + ÀÌ »ç¿ëÀÚ°¡ wrapper¸¦ ½ÇÇàÇϵµ·Ï Çã¿ëµÇ¾ú³ª? + +

      + ÀÌ »ç¿ëÀÚ°¡ wrapper¸¦ ½ÇÇàÇϵµ·Ï Çã¿ëµÇ¾ú³ª? ¿ÀÁ÷ + ÇÑ »ç¿ëÀÚ(¾ÆÆÄÄ¡ »ç¿ëÀÚ)¸¸ÀÌ ÀÌ ÇÁ·Î±×·¥À» ½ÇÇàÇÒ + ¼ö ÀÖ´Ù. +

      +
    6. + +
    7. + ÁöÁ¤ÇÑ CGI³ª SSI ÇÁ·Î±×·¥ÀÌ ¾ÈÀüÇÏÁö¾ÊÀº °èÃþÂüÁ¶¸¦ + °¡Áö´Â°¡? + +

      + ÁöÁ¤ÇÑ CGI³ª SSI ÇÁ·Î±×·¥ÀÌ '/'·Î ½ÃÀÛÇϰųª µÞÂüÁ¶ + '..'À» °¡Áö´Â°¡? À̵éÀ» »ç¿ëÇÒ ¼ö ¾ø´Ù. ÁöÁ¤ÇÑ CGI/SSI + ÇÁ·Î±×·¥Àº suEXEC ¹®¼­ root (¾Æ·¡ + --with-suexec-docroot=DIR Âü°í) + ³»¿¡ ÀÖ¾î¾ß ÇÑ´Ù. +

      +
    8. + +
    9. + ÁöÁ¤ÇÑ »ç¿ëÀÚ¸íÀÌ À¯È¿ÇÑ°¡? + +

      + ÁöÁ¤ÇÑ »ç¿ëÀÚ°¡ Á¸ÀçÇϴ°¡? +

      +
    10. + +
    11. + ÁöÁ¤ÇÑ ±×·ì¸íÀÌ À¯È¿ÇÑ°¡? + +

      + ÁöÁ¤ÇÑ ±×·ìÀÌ Á¸ÀçÇϴ°¡? +

      +
    12. + +
    13. + ÁöÁ¤ÇÑ »ç¿ëÀÚ°¡ superuser°¡ ¾Æ´Ñ°¡? + + +

      + ÇöÀç suEXEC´Â root°¡ CGI/SSI + ÇÁ·Î±×·¥À» ½ÇÇàÇÒ ¼ö ¾øµµ·Ï ÇÑ´Ù. +

      +
    14. + +
    15. + ÁöÁ¤ÇÑ userid°¡ ÃÖ¼Ò ID ¼ýÀÚº¸´Ù Å«°¡? + +

      + ¼³Á¤¿¡¼­ ÃÖ¼Ò »ç¿ëÀÚ ID ¼ýÀÚ¸¦ ÁöÁ¤ÇÑ´Ù. ±×·¡¼­ CGI/SSI + ÇÁ·Î±×·¥À» ½ÇÇàÇÒ ¼ö ÀÖ´Â useridÀÇ ÃÖ¼ÒÄ¡¸¦ ÁöÁ¤ÇÒ + ¼ö ÀÖ´Ù. "½Ã½ºÅÛ¿ë" °èÁ¤À» Á¦¿ÜÇÒ¶§ À¯¿ëÇÏ´Ù. +

      +
    16. + +
    17. + ÁöÁ¤ÇÑ ±×·ìÀÌ superuser ±×·ìÀÌ ¾Æ´Ñ°¡? + +

      + ÇöÀç suEXEC´Â root ±×·ìÀÌ CGI/SSI + ÇÁ·Î±×·¥À» ½ÇÇàÇÒ ¼ö ¾øµµ·Ï ÇÑ´Ù. +

      +
    18. + +
    19. + ÁöÁ¤ÇÑ groupid°¡ ÃÖ¼Ò ID ¼ýÀÚº¸´Ù Å«°¡? + +

      + ¼³Á¤¿¡¼­ ÃÖ¼Ò ±×·ì ID ¼ýÀÚ¸¦ ÁöÁ¤ÇÑ´Ù. ±×·¡¼­ CGI/SSI + ÇÁ·Î±×·¥À» ½ÇÇàÇÒ ¼ö ÀÖ´Â groupidÀÇ ÃÖ¼ÒÄ¡¸¦ ÁöÁ¤ÇÒ + ¼ö ÀÖ´Ù. "½Ã½ºÅÛ¿ë" ±×·ìÀ» Á¦¿ÜÇÒ¶§ À¯¿ëÇÏ´Ù. +

      +
    20. + +
    21. + wrapper°¡ ¼º°øÀûÀ¸·Î ÁöÁ¤ÇÑ »ç¿ëÀÚ¿Í ±×·ìÀÌ + µÉ ¼ö Àִ°¡? + +

      + ÀÌ ´Ü°è¿¡¼­ ÇÁ·Î±×·¥Àº setuid¿Í setgid È£ÃâÀ» ÇÏ¿© + ÁöÁ¤ÇÑ »ç¿ëÀÚ¿Í ±×·ìÀÌ µÈ´Ù. ¶Ç, ±×·ì Á¢±Ù¸ñ·ÏÀº + »ç¿ëÀÚ°¡ ÇØ´çµÈ ¸ðµç ±×·ìÀ¸·Î ÃʱâÈ­µÈ´Ù. +

      +
    22. + +
    23. + CGI/SSI ÇÁ·Î±×·¥ÀÌ ÀÖ´Â µð·ºÅ丮·Î µð·ºÅ丮¸¦ + º¯°æÇÒ ¼ö Àִ°¡? + +

      + µð·ºÅ丮°¡ Á¸ÀçÇÏÁö ¾Ê´Ù¸é ÆÄÀÏÀÌ ÀÖÀ» ¼ö ¾ø´Ù. ÀÌ°÷À¸·Î + µð·ºÅ丮¸¦ º¯°æÇÒ ¼ö ¾ø´Ù¸é µð·ºÅ丮´Â Á¸ÀçÇÏÁö ¾ÊÀ» + °ÍÀÌ´Ù. +

      +
    24. + +
    25. + µð·ºÅ丮°¡ ¾ÆÆÄÄ¡ À¥°ø°£ ¾È¿¡ Àִ°¡? + +

      + ¼­¹öÀÇ ÀϹÝÀûÀÎ ºÎºÐÀ» ¿äûÇÒ °æ¿ì ¿äûÇÏ´Â µð·ºÅ丮°¡ + suEXEC ¹®¼­ root ¾Æ·¡ Àִ°¡? UserDirÀ» ¿äûÇÒ °æ¿ì + ¿äûÇÏ´Â µð·ºÅ丮°¡ suEXEC userdir·Î ¼³Á¤ÇÑ (suEXEC ¼³Á¤ ¿É¼Ç Âü°í) µð·ºÅ丮 + ¾Æ·¡¿¡ Àִ°¡? +

      +
    26. + +
    27. + ´Ù¸¥ ´©±¸µµ µð·ºÅ丮¿¡ ¾²±â±ÇÇÑÀÌ ¾ø´Â°¡? + +

      + µð·ºÅ丮¸¦ ´Ù¸¥ »ç¶÷¿¡°Ô ¿­¾îµÎ±æ ¿øÇÏÁö¾Ê´Â´Ù. ¿ÀÁ÷ + ¼ÒÀ¯ÀÚ¸¸ÀÌ µð·ºÅ丮 ³»¿ëÀ» º¯°æÇÒ ¼ö ÀÖ´Ù. +

      +
    28. + +
    29. + ÁöÁ¤ÇÑ CGI/SSI ÇÁ·Î±×·¥ÀÌ Á¸ÀçÇϴ°¡? + +

      + Á¸ÀçÇÏÁö¾Ê´Ù¸é ½ÇÇàÇÒ ¼öµµ ¾ø´Ù. +

      +
    30. + +
    31. + ´Ù¸¥ ´©±¸µµ ÁöÁ¤ÇÑ CGI/SSI ÇÁ·Î±×·¥¿¡ ¾²±â±ÇÇÑÀÌ + ¾ø´Â°¡? + +

      + ¼ÒÀ¯ÀÚ¿Ü ´©±¸µµ CGI/SSI ÇÁ·Î±×·¥À» º¯°æÇÏ±æ ¿øÇÏÁö¾Ê´Â´Ù. +

      +
    32. + +
    33. + ÁöÁ¤ÇÑ CGI/SSI ÇÁ·Î±×·¥ÀÌ setuid³ª setgid°¡ + ¾Æ´Ñ°¡? + +

      + ¿ì¸®´Â ÇÁ·Î±×·¥ÀÌ ´Ù½Ã UID/GID¸¦ º¯°æÇÏ±æ ¿øÇÏÁö¾Ê´Â´Ù. +

      +
    34. + +
    35. + ÁöÁ¤ÇÑ »ç¿ëÀÚ/±×·ìÀÌ ÇÁ·Î±×·¥ÀÇ »ç¿ëÀÚ/±×·ì°ú °°Àº°¡? + +

      + »ç¿ëÀÚ°¡ ÆÄÀÏÀÇ ¼ÒÀ¯ÀÚÀΰ¡? +

      +
    36. + +
    37. + ¾ÈÀüÇÑ µ¿ÀÛÀ» À§ÇØ ÇÁ·Î¼¼½ºÀÇ È¯°æº¯¼ö¸¦ û¼ÒÇÒ + ¼ö Àִ°¡? + +

      + suEXEC´Â (¼³Á¤¿¡¼­ Á¤ÀÇÇÑ) ¾ÈÀüÇÑ ½ÇÇà PATH¸¦ Àâ°í, + (À̰͵µ ¼³Á¤¿¡¼­ Á¤ÀÇ) ¾ÈÀüÇÑ È¯°æº¯¼ö ¸ñ·Ï¿¡ ¿­°ÅµÈ + º¯¼ö¸¸ ³²±â°í ÇÁ·Î¼¼½ºÀÇ È¯°æº¯¼ö¸¦ Áö¿î´Ù. +

      +
    38. + +
    39. + ¼º°øÀûÀ¸·Î ÁöÁ¤ÇÑ CGI/SSI ÇÁ·Î±×·¥À» ½ÇÇàÇÒ + ¼ö Àִ°¡? + +

      + ¿©±â¼­ suEXEC°¡ ³¡³ª°í ÁöÁ¤ÇÑ CGI/SSI ÇÁ·Î±×·¥ÀÌ ½ÃÀÛÇÑ´Ù. +

      +
    40. +
    + +

    ÀÌ°ÍÀÌ suEXEC wrapper º¸¾È¸ðµ¨ÀÇ Ç¥ÁØ µ¿ÀÛÀÌ´Ù. ´Ù¼Ò + ¾ö°ÝÇÏ°í CGI/SSI ¼³°è¿¡ »õ·Î¿î Á¦ÇÑÀÌ µÇÁö¸¸, º¸¾ÈÀ» ¿°µÎ¿¡ + µÎ°í ÇѴܰ辿 Á¶½É½º·´°Ô ¸¸µé¾îÁ³´Ù.

    + +

    ÀÌ º¸¾È ¸ðµ¨ÀÌ ¼­¹ö ¼³Á¤¿¡ ¾î¶² Á¦ÇÑÀ» ÁÖ´ÂÁö¿Í ÀûÀýÇÑ + suEXEC ¼³Á¤À¸·Î ¾î¶² º¸¾È À§ÇèÀ» ÇÇÇÒ ¼ö ÀÖ´ÂÁö¿¡ ´ëÇØ ÀÌ + ¹®¼­ÀÇ "´Ù½Ã Çѹø Á¶½ÉÇ϶ó" ÀýÀ» + Âü°íÇ϶ó.

    +
    top
    +
    +

    suEXEC ±¸¼º°ú ¼³Ä¡

    + +

    ÀÌÁ¦ Àç¹ÌÀÖ´Â ³»¿ëÀÌ ½ÃÀÛÇÑ´Ù.

    + +

    suEXEC ±¸¼º ¿É¼Ç
    +

    + +
    +
    --enable-suexec
    + +
    ÀÌ ¿É¼ÇÀº ±âº»ÀûÀ¸·Î ¼³Ä¡µÇ°Å³ª È°¼ºÈ­µÇÁö¾Ê´Â suEXEC + ±â´ÉÀ» È°¼ºÈ­ÇÑ´Ù. APACI°¡ suEXEC¸¦ ¹Þ¾ÆµéÀÌ·Á¸é + --enable-suexec ¿É¼Ç¿Ü¿¡ + --with-suexec-xxxxx ¿É¼ÇÀÌ ÃÖ¼ÒÇÑ ÇÑ°³ + ÇÊ¿äÇÏ´Ù.
    + +
    --with-suexec-bin=PATH
    + +
    suexec ¹ÙÀ̳ʸ® °æ·Î´Â º¸¾È»ó ÀÌÀ¯·Î + ¼­¹ö¿¡ ±â·ÏµÇ¾ß ÇÑ´Ù. °æ·Î ±âº»°ªÀ» ¹«½ÃÇÏ·Á¸é ÀÌ ¿É¼ÇÀ» + »ç¿ëÇÑ´Ù. ¿¹¸¦ µé¾î + --with-suexec-bin=/usr/sbin/suexec
    + +
    --with-suexec-caller=UID
    + +
    º¸Åë ¾ÆÆÄÄ¡¸¦ ½ÇÇàÇÏ´Â »ç¿ëÀÚ¸í. ÇÁ·Î±×·¥À» + ½ÇÇàÇÒ ¼ö ÀÖ´Â À¯ÀÏÇÑ »ç¿ëÀÚ´Ù.
    + +
    --with-suexec-userdir=DIR
    + +
    suEXEC Á¢±ÙÀÌ Çã¿ëµÇ´Â »ç¿ëÀÚ È¨µð·ºÅ丮ÀÇ ÇÏÀ§µð·ºÅ丮¸¦ + ÁöÁ¤ÇÑ´Ù. ÀÌ µð·ºÅ丮¿¡ ÀÖ´Â ¸ðµç ½ÇÇàÆÄÀÏÀ» »ç¿ëÀÚÀÇ + suEXEC·Î ½ÇÇà¹Ç·Î, ¸ðµç ÇÁ·Î±×·¥ÀÌ "¾ÈÀüÇؾß" ÇÑ´Ù. (¿¹¸¦ + µé¾î, °ª¿¡ "*"ÀÌ ¾ø´Â) "°£´ÜÇÑ" UserDir Áö½Ã¾î¸¦ »ç¿ëÇÑ´Ù¸é + °°Àº °ªÀ» ¼³Á¤ÇØ¾ß ÇÑ´Ù. UserDir Áö½Ã¾î°¡ passwd ÆÄÀÏ¿¡ + ³ª¿Â »ç¿ëÀÚ È¨µð·ºÅ丮¿Í ´Ù¸£¸é suEXEC´Â Á¤»óÀûÀ¸·Î + ÀÛµ¿ÇÏÁö ¾Ê´Â´Ù. ±âº»°ªÀº "public_html"ÀÌ´Ù.
    + °¡»óÈ£½ºÆ®µéÀÌ °¢°¢ ´Ù¸¥ UserDirÀ» »ç¿ëÇÑ´Ù¸é ¸ðµÎ ÇÑ + ºÎ¸ð µð·ºÅ丮 ¾È¿¡ ÀÖµµ·Ï Á¤ÀÇÇØ¾ß ÇÏ°í, ±× ºÎ¸ð µð·ºÅ丮¸íÀ» + ¿©±â Àû´Â´Ù. ÀÌ·¸°Ô Á¤ÀÇÇÏÁö ¾ÊÀ¸¸é, "~userdir" + cgi ¿äûÀÌ ÀÛµ¿ÇÏÁö ¾Ê´Â´Ù!
    + +
    --with-suexec-docroot=DIR
    + +
    ¾ÆÆÄÄ¡ÀÇ DocumentRoot¸¦ Á¤ÀÇÇÑ´Ù. ÀÌ´Â suEXEC°¡ »ç¿ëÇÒ + ¼ö ÀÖ´Â (UserDirsÀ» Á¦¿ÜÇÑ) À¯ÀÏÇÑ °ø°£ÀÌ´Ù. ±âº» µð·ºÅ丮´Â + --datadir °ª¿¡ "/htdocs"À» ºÙÀÎ °ÍÀÌ´Ù. + ¿¹¸¦ µé¾î "--datadir=/home/apache"·Î + ±¸¼ºÇß´Ù¸é suEXEC wrapper´Â document root·Î + "/home/apache/htdocs" µð·ºÅ丮¸¦ »ç¿ëÇÑ´Ù.
    + +
    --with-suexec-uidmin=UID
    + +
    suEXEC¿¡¼­ ÁöÁ¤°¡´ÉÇÑ »ç¿ëÀÚÀÇ ÃÖ¼Ò UID¸¦ Á¤ÀÇÇÑ´Ù. + ´ëºÎºÐÀÇ ½Ã½ºÅÛ¿¡¼­ 500À̳ª 100ÀÌ ÀûÀýÇÏ´Ù. ±âº»°ªÀº + 100ÀÌ´Ù.
    + +
    --with-suexec-gidmin=GID
    + +
    suEXEC¿¡¼­ ÁöÁ¤°¡´ÉÇÑ ±×·ìÀÇ ÃÖ¼Ò GID¸¦ Á¤ÀÇÇÑ´Ù. + ´ëºÎºÐÀÇ ½Ã½ºÅÛ¿¡¼­ 100ÀÌ ÀûÀýÇϹǷΠÀÌ °ªÀÌ ±âº»°ªÀÌ´Ù.
    + +
    --with-suexec-logfile=FILE
    + +
    ¸ðµç suEXEC ÀÛµ¿°ú ¿À·ù¸¦ (°¨½Ã³ª µð¹ö±ë ¸ñÀû¿¡ À¯¿ëÇÑ) + ±â·ÏÇÒ ·Î±×ÆÄÀϸíÀ» ÁöÁ¤ÇÑ´Ù. ±âº»ÀûÀ¸·Î ·Î±×ÆÄÀÏÀÇ À̸§Àº + "suexec_log"ÀÌ°í Ç¥ÁØ ·Î±×ÆÄÀÏ µð·ºÅ丮¿¡ + (--logfiledir) À§Ä¡ÇÑ´Ù.
    + +
    --with-suexec-safepath=PATH
    + +
    CGI ½ÇÇàÆÄÀÏ¿¡ ³Ñ°ÜÁú ¾ÈÀüÇÑ PATH ȯ°æº¯¼ö¸¦ Á¤ÀÇÇÑ´Ù. + ±âº»°ªÀº "/usr/local/bin:/usr/bin:/bin"ÀÌ´Ù.
    +
    + +

    suEXEC wrapper¸¦ ÄÄÆÄÀÏÇÏ°í ¼³Ä¡Çϱâ
    + --enable-suexec ¿É¼ÇÀ¸·Î suEXEC ±â´ÉÀ» °¡´ÉÇÏ°ÔÇÑ + °æ¿ì make ¸í·É¾î¸¦ ½ÇÇàÇϸé suexec + ½ÇÇàÆÄÀÏÀÌ (¾ÆÆÄÄ¡¿Í ÇÔ²²) ÀÚµ¿À¸·Î ¸¸µé¾îÁø´Ù.
    + ¸ðµç°ÍÀ» ÄÄÆÄÀÏÇÑ ÈÄ make install ¸í·É¾î¸¦ + ½ÇÇàÇÏ¿© ¼³Ä¡ÇÒ ¼ö ÀÖ´Ù. ¹ÙÀ̳ʸ®ÆÄÀÏ suexec´Â + --sbindir ¿É¼ÇÀ¸·Î ÁöÁ¤ÇÑ µð·ºÅ丮¿¡ ¼³Ä¡µÈ´Ù. + ±âº» À§Ä¡´Â "/usr/local/apache2/sbin/suexec"ÀÌ´Ù.
    + ¼³Ä¡ °úÁ¤¿¡ root ±ÇÇÑÀÌ ÇÊ¿äÇÔÀ» + ÁÖÀÇÇ϶ó. wrapper°¡ »ç¿ëÀÚ ID¸¦ ¼³Á¤ÇϱâÀ§Çؼ­´Â ¼ÒÀ¯ÀÚ°¡ + rootÀÌ°í ÆÄÀϸðµå·Î setuserid ½ÇÇàºñÆ®°¡ + ¼³Á¤µÇ¾ß ÇÑ´Ù.

    + +

    ÆíÁýÁõÀûÀÎ ±ÇÇѼ³Á¤
    + suEXEC wrapper´Â ÀÚ½ÅÀ» ½ÇÇàÇÑ »ç¿ëÀÚ°¡ ±¸¼º ¿É¼Ç + --with-suexec-caller·Î ÁöÁ¤ÇÑ ¿Ã¹Ù¸¥ »ç¿ëÀÚÀÎÁö + È®ÀÎÀ» ÇÏÁö¸¸, ÀÌ °Ë»ç ÀÌÀü¿¡ suEXEC°¡ »ç¿ëÇÏ´Â ½Ã½ºÅÛÈ£Ãâ + ȤÀº ¶óÀ̺귯¸® ÇÔ¼ö°¡ Á¶À۵ǾúÀ» ¼ö ÀÖ´Ù. À̸¦ ´ëºñÇϸç + ÀϹÝÀûÀ¸·Î ÁÁÀº ½À°üÀ̹ǷΠ¿ÀÁ÷ ¾ÆÆÄÄ¡¸¦ ½ÇÇàÇÏ´Â ±×·ì¸¸ÀÌ + suEXEC¸¦ ½ÇÇàÇÒ ¼ö ÀÖµµ·Ï ÆÄÀϽýºÅÛ ±ÇÇÑÀ» ÁöÁ¤ÇØ¾ß ÇÑ´Ù.

    + +

    ¿¹¸¦ µé¾î, À¥¼­¹ö¸¦ ´ÙÀ½°ú °°ÀÌ ¼³Á¤ÇÏ°í:

    + +

    + User www
    + Group webgroup
    +

    + +

    suexec¸¦ "/usr/local/apache2/sbin/suexec"¿¡ + ¼³Ä¡ÇÏ¿´´Ù¸é, ´ÙÀ½À» ½ÇÇàÇØ¾ß ÇÑ´Ù:

    + +

    + chgrp webgroup /usr/local/apache2/bin/suexec
    + chmod 4750 /usr/local/apache2/bin/suexec
    +

    + +

    ±×·¯¸é ¿ÀÁ÷ ¾ÆÆÄÄ¡¸¦ ½ÇÇàÇÏ´Â ±×·ì¸¸ÀÌ suEXEC wrapper¸¦ + ½ÇÇàÇÒ ¼ö ÀÖ´Ù.

    +
    top
    +
    +

    suEXEC Å°°í ²ô±â

    + +

    ¾ÆÆÄÄ¡´Â ½ÃÀÛÇÒ¶§ --sbindir ¿É¼ÇÀ¸·Î ÁöÁ¤ÇÑ + µð·ºÅ丮¿¡¼­ suexec ÆÄÀÏÀ» (±âº»°ª + "/usr/local/apache2/sbin/suexec") ã´Â´Ù. ¾ÆÆÄÄ¡°¡ + Á¤»óÀûÀ¸·Î ±¸¼ºµÈ suEXEC wrapper¸¦ ¹ß°ßÇÏ¸é ¿À·ù ·Î±×(error + log)¿¡ ´ÙÀ½°ú °°ÀÌ Ãâ·ÂÇÑ´Ù:

    + +

    + [notice] suEXEC mechanism enabled (wrapper: /path/to/suexec) +

    + +

    ¼­¹ö ½ÃÀÛÁß¿¡ ÀÌ·± ¹®±¸¸¦ ¾ø´Ù¸é ¼­¹ö´Â ±â´ëÇÑ Àå¼Ò¿¡¼­ + wrapper ÇÁ·Î±×·¥À» ãÁö ¸øÇ߰ųª, ½ÇÇàÆÄÀÏÀÌ setuid + root·Î ¼³Ä¡µÇÁö¾Ê¾Ò±â ¶§¹®ÀÏ °ÍÀÌ´Ù.

    + +

    óÀ½À¸·Î suEXEC ±â´ÉÀ» »ç¿ëÇÏ°í ½Í°í ÀÌ¹Ì ¾ÆÆÄÄ¡ ¼­¹ö°¡ + ½ÇÇàÁßÀ̶ó¸é, ¾ÆÆÄÄ¡¸¦ Á×ÀÌ°í ´Ù½Ã ½ÃÀÛÇØ¾ß ÇÑ´Ù. °£´ÜÈ÷ + HUPÀ̳ª USR1 ½Ã±×³Î·Î Àç½ÃÀÛÇÏ´Â °ÍÀ¸·Î´Â ÃæºÐÇÏÁö ¾Ê´Ù.

    +

    suEXEC¸¦ ¾È»ç¿ëÇÏ·Á¸é suexec ÆÄÀÏÀ» Áö¿îÈÄ + ¾ÆÆÄÄ¡¸¦ Á×ÀÌ°í Àç½ÃÀÛÇØ¾ß ÇÑ´Ù.

    +
    top
    +
    +

    suEXEC »ç¿ëÇϱâ

    + +

    CGI ÇÁ·Î±×·¥ ¿äûÀÇ °æ¿ì SuexecUserGroup Áö½Ã¾î¸¦ + »ç¿ëÇÑ °¡»óÈ£½ºÆ®¿¡ ¿äûÀ» ÇÏ¿´°Å³ª mod_userdirÀÌ + ¿äûÀ» ó¸®ÇÏ´Â °æ¿ì¿¡¸¸ suEXEC wrapper¸¦ È£ÃâÇÑ´Ù.

    + +

    °¡»óÈ£½ºÆ®:
    suEXEC wrapper¸¦ + »ç¿ëÇÏ´Â ÇÑ°¡Áö ¹æ¹ýÀº VirtualHost Á¤ÀÇ¿¡ SuexecUserGroup Áö½Ã¾î¸¦ + »ç¿ëÇÏ´Â °ÍÀÌ´Ù. ÀÌ Áö½Ã¾î¸¦ ÁÖ¼­¹ö »ç¿ëÀÚ ID¿Í ´Ù¸£°Ô + ¼³Á¤Çϸé CGI ÀÚ¿øÀÇ ¸ðµç ¿äûÀÌ <VirtualHost>¿¡¼­ + ÁöÁ¤ÇÑ User¿Í GroupÀ¸·Î ½ÇÇàµÈ´Ù. ÀÌ + Áö½Ã¾îµéÀÌ <VirtualHost>¿¡ ¾øÀ¸¸é ÁÖ¼­¹ö + userid¸¦ »ç¿ëÇÑ´Ù.

    + +

    »ç¿ëÀÚ µð·ºÅ丮:
    + mod_userdirÀÌ ¿äûÀ» ó¸®ÇÑ´Ù¸é suEXEC + wrapper¸¦ È£ÃâÇÏ¿©, ¿äûÇÑ »ç¿ëÀÚ µð·ºÅ丮¿¡ ÇØ´çÇÏ´Â »ç¿ëÀÚ + ID·Î CGI ÇÁ·Î±×·¥À» ½ÇÇàÇÑ´Ù. ÀÌ ±â´ÉÀÌ µ¿ÀÛÇÏ·Á¸é »ç¿ëÀÚ + ID·Î CGI¸¦ ½ÇÇàÇÒ ¼ö ÀÖ°í ½ºÅ©¸³Æ®°¡ À§ÀÇ º¸¾È + °Ë»ç Ç׸ñÀ» ¸¸Á·ÇØ¾ß ÇÑ´Ù. ±¸¼º + ¿É¼Ç --with-suexec-userdirÀ» Âü°íÇ϶ó.

    top
    +
    +

    suEXEC µð¹ö±ëÇϱâ

    + +

    suEXEC wrapper´Â ·Î±× Á¤º¸¸¦ À§¿¡¼­ ´Ù·é + --with-suexec-logfile ¿É¼ÇÀ¸·Î ÁöÁ¤ÇÑ ÆÄÀÏ¿¡ + ¾´´Ù. wrapper¸¦ ¿Ã¹Ù·Î ±¸¼ºÇÏ°í ¼³Ä¡Çß´Ù¸é ¾îµð¼­ À߸øµÇ¾ú´ÂÁö + ÀÌ ·Î±×ÆÄÀÏ¿Í ¼­¹öÀÇ error_log¸¦ »ìÆìºÁ¶ó.

    + +
    top
    +
    +

    ´Ù½Ã Çѹø Á¶½ÉÇ϶ó: °æ°í¿Í ¿¹Á¦

    + +

    ÁÖÀÇ! ÀÌ ¼½¼ÇÀº ¿ÏÀüÇÏÁö ¾ÊÀ» ¼ö ÀÖ´Ù. + ¾ÆÆÄÄ¡±×·ìÀÇ ¿Â¶óÀÎ + ¹®¼­¿¡¼­ ÀÌ ¹®¼­ÀÇ ÃÖ½ÅÆÇÀ» Âü°íÇ϶ó.

    + +

    wrapper°¡ ¼­¹ö ¼³Á¤À» Á¦¾àÇÏ´Â ¸î°¡Áö Èï¹Ì·Î¿î Á¡ÀÌ ÀÖ´Ù. + suEXEC¿Í °ü·ÃµÈ "¹ö±×"¸¦ º¸°íÇϱâ Àü¿¡ À̵éÀ» »ìÆ캸±æ ¹Ù¶õ´Ù.

    + +
      +
    • suEXEC Á¦¾à »çÇ×
    • + +
    • + µð·ºÅ丮 ±¸Á¶ Á¦ÇÑ + +

      + º¸¾È°ú È¿À²¼ºÀ» À§ÇØ ¸ðµç suEXEC ¿äûÀº °¡»óÈ£½ºÆ®ÀÇ + °æ¿ì ÃÖ»óÀ§ document root ȤÀº userdir ¿äûÀÇ °æ¿ì + ÃÖ»óÀ§ °³ÀÎ document root ¾È¿¡¼­ ¹ß»ýÇØ¾ß ÇÑ´Ù. ¿¹¸¦ + µé¾î, °¡»óÈ£½ºÆ® ³×°³¸¦ ¼³Á¤Çß´Ù¸é °¡»óÈ£½ºÆ®¿¡¼­ + suEXEC¸¦ ÀÌ¿ëÇϱâÀ§ÇØ °¡»óÈ£½ºÆ®ÀÇ document root¸¦ + ÁÖ ¾ÆÆÄÄ¡ ¹®¼­ °èÃþ±¸Á¶ ¹Û¿¡ ¼³Á¤ÇÒ ÇÊ¿ä°¡ ÀÖ´Ù. + (¿¹Á¦´Â ´ÙÀ½¿¡.) +

      +
    • + +
    • + suEXECÀÇ PATH ȯ°æº¯¼ö + +

      + º¯°æÇϸé À§ÇèÇÒ ¼ö ÀÖ´Ù. ¿©±â¿¡ Æ÷ÇÔÇÏ´Â ¸ðµç °æ·Î°¡ + ¹ÏÀ» ¼ö ÀÖ´Â µð·ºÅ丮ÀÎÁö È®ÀÎÇ϶ó. + ÀÌ Áö±¸»óÀÇ ´©±º°¡°¡ ±×°÷¿¡ ÀÖ´Â Æ®·ÎÀ̸ñ¸¶¸¦ ½ÇÇàÇϱæ + ¿øÇÏÁö ¾ÊÀ» °ÍÀÌ´Ù. +

      +
    • + +
    • + suEXEC ÄÚµå ¼öÁ¤Çϱâ + +

      + ¹Ýº¹Çؼ­ ¸»ÇÏÁö¸¸, ´ç½ÅÀÌ ¹«¾ùÀ» ÇÏ´ÂÁö ¸ð¸£°í ½ÃµµÇÑ´Ù¸é + Å« ¹®Á¦°¡ ¹ß»ýÇÒ ¼ö ÀÖ´Ù. ¾î¶² °æ¿ì¿¡µµ + ¼öÁ¤ÇÏÁö¸¶¶ó. +

      +
    • +
    + +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/suexec.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/suexec.html.tr.utf8 new file mode 100644 index 00000000..4664aea2 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/suexec.html.tr.utf8 @@ -0,0 +1,556 @@ + + + +SuEXEC Desteği - Apache HTTP Sunucusu + + + + + +
    <-
    +

    SuEXEC Desteği

    +
    +

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

    +
    + +

    SuEXEC özelliği, Apache kullanıcılarına + CGI ve SSI programlarını sunucunun + aidiyetinde çalıştığı kullanıcıdan farklı bir kullanıcının aidiyetinde + çalıştırma olanağı verir. Normalde, CGI ve + SSI programlarını çalıştıranla sunucuyu çalıştıran + aynı kullanıcıdır.

    + +

    Gerektiği gibi kullanıldığında bu özellik, kullanıcılara + CGI ve SSI programlarını çalıştırma + ve geliştirmeye izin vermekle ortaya çıkan güvenlik risklerini azaltır. + Bununla birlikte, suEXEC gerektiği gibi + yapılandırılmadığı takdirde bazı sorunlara yol açabilir ve bilgisayar + güvenliğinizde yeni delikler ortaya çıkmasına sebep olabilir. + Güvenlikle ilgili mevcut sorunlarla başa çıkmada ve setuid + root programları yönetmekte bilgi ve deneyim sahibi değilseniz + suEXEC kullanmayı kesinlikle düşünmemenizi + öneririz.

    +
    + +
    top
    +
    +

    Başlamadan önce

    + +

    Belgeye balıklama dalmadan önce, Apache Grubu ve bu belge ile ilgili + kabuller hakkında bilgi sahibi olmalısınız.

    + +

    Öncelikle, üzerinde setuid va setgid + işlemlerinin yapılabildiği Unix türevi bir işletim sistemi + kullandığınızı varsayıyoruz. Tüm komut örnekleri buna dayanarak + verilmiştir. Bu desteğe sahip başka platformlar varsa onlardaki + yapılandırma burada anlattığımız yapılandırmadan farklı olabilir.

    + +

    İkinci olarak, bilgisayarınızın güvenliği ve yönetimi ile ilgili bazı + temel kavramları bildiğinizi kabul ediyoruz. Buna + setuid/setgid işlemlerinin sisteminiz ve güvenlik + seviyesi üzerindeki etkilerini bilmek dahildir.

    + +

    Üçüncü olarak, suEXEC kodunun + değiştirilmemiş bir sürümünü kullandığınızı + varsayıyoruz. Tüm suEXEC kodu, geliştiricilerin yanında sayısız beta + kullanıcısı tarafından dikkatle incelenmiş ve denenmiştir. Kodların hem + basit hem de sağlam bir şekilde güvenli olması için gerekli tüm + önlemler alınmıştır. Bu kodun değiştirilmesi beklenmedik sorunlara ve + yeni güvenlik risklerine yol açabilir. Özellikle güvenlikle ilgili + programlarda deneyimli değilseniz suEXEC kodunda kesinlikle bir + değişiklik yapmamalısınız. Değişiklik yaparsanız kodlarınızı gözden + geçirmek ve tartışmak üzere Apache Grubu ile paylaşmanızı öneririz.

    + +

    Dördüncü ve son olarak, Apache Grubunun suEXEC’i öntanımlı Apache + kurulumunun bir parçası yapmama kararından bahsetmek gerekir. Bunun + sonucu olarak, suEXEC yapılandırması sistem yöneticisinin ayrıntılı bir + incelemesini gerektirir. Gerekli incelemeden sonra yönetici tarafından + suEXEC yapılandırma seçeneklerine karar verilip, normal yollardan + sisteme kurulumu yapılır. Bu seçeneklerin belirlenmesi, suEXEC + işlevselliğinin kullanımı sırasında sistem güvenliğini gerektiği gibi + sağlamak için yönetici tarafından dikkatle saptanmayı gerektirir. Bu + sürecin ayrıntılarının yöneticiye bırakılma sebebi, Apache Grubunun + suEXEC kurulumunu, suEXEC’i dikkatle kullanacak yeterliliğe sahip + olanlarla sınırlama beklentisidir.

    + +

    Hala bizimle misiniz? Evet mi? Pekala, o halde devam!

    +
    top
    +
    +

    SuEXEC Güvenlik Modeli

    + +

    SuEXEC yapılandırması ve kurulumuna girişmeden önce biraz da + gerçekleşmesini istediğiniz güvenlik modelinin ayrıntıları üzerinde + duralım. Böylece, suEXEC’in içinde olup bitenleri ve sisteminizin + güvenliği için alınacak önlemleri daha iyi anlayabilirsiniz.

    + +

    suEXEC işlevselliği, Apache HTTP Sunucusu tarafından + gerektiği takdirde artalanda çalıştırılan bir setuid programa dayanır. + Bu program, bir CGI veya SSI betiğine bir HTTP isteği yapıldığı zaman, + bu betiği, yöneticinin ana sunucunun aidiyetinde çalıştığı kullanıcıdan + farklı olarak seçtiği bir kullanıcının aidiyetinde çalıştırmak için + çağrılır. Böyle bir istek geldiğinde, Apache artalandaki setuid + programına, HTTP isteği yapılan programın ismiyle beraber aidiyetinde + çalışacağı kullanıcı ve grup kimliklerini de aktarır.

    + +

    Artalanda çalıştırılan setuid program başarıyı ve başarısızlığı + aşağıdaki süreci izleyerek saptar. Bunlardan herhangi biri başarısız + olursa program başarısızlık durumunu günlüğe kaydeder ve bir hata + vererek çıkar. Aksi takdirde çalışmaya devam eder.

    + +
      +
    1. + Setuid programı çalıştıran kullanıcı sistemin geçerli + kullanıcılarından biri mi? + +

      Bu, setuid programı çalıştıran kullanıcının + sistemin gerçek bir kullanıcısı olduğunudan emin olunmasını sağlar. +

      +
    2. + +
    3. + Setuid program yeterli sayıda argümanla çağrılmış mı? + + +

      Apache’nin artalanda çağırdığı setuid program + ancak yeterli sayıda argüman sağlandığı takdirde çalışacaktır. + Argümanların sayısını ve sırasını Apache HTTP sunucusu bilir. Eğer + setuid program yeterli sayıda argümanla çağrılmamışsa ya + kendisinde bir değişiklik yapılmıştır ya da kurulu Apache + çalıştırılabilirinin suEXEC ile ilgili kısmında yanlış giden bir + şeyler vardır.

      +
    4. + +
    5. + Bu geçerli kullanıcının bu setuid programı çalıştırma + yetkisi var mı? + +

      Sadece tek bir kullanıcı (Apache’nin aidiyetinde + çalıştığı kullanıcı) bu programı çalıştırmaya yetkilidir.

      +
    6. + +
    7. + Hedef CGI veya SSI programı hiyerarşik olarak güvenliği + bozacak bir dosya yolu üzerinde mi? + +

      Hedef CGI veya SSI programının dosya yolu '/' veya + '..' ile başlıyor mu? Buna izin verilmez. Hedef CGI veya SSI + programı suEXEC’in belge kök dizininde yer almalıdır (aşağıda + --with-suexec-docroot=DİZİN seçeneğine + bakınız).

      +
    8. + +
    9. + Hedef kullanıcı ismi geçerli mi? + +

      Hedef kullanıcı mevcut mu?

      +
    10. + +
    11. + Hedef grup ismi geçerli mi? + +

      Hedef grup mevcut mu?

      +
    12. + +
    13. + Hedef kullanıcı root değil, değil mi? + +

      Mevcut durumda, root kullanıcısının + CGI/SSI programlarını çalıştırmasına izin verilmemektedir.

      +
    14. + +
    15. + Hedef kullanıcı kimliği asgari kullanıcı numarasından + BÜYÜK mü? + +

      Asgari kullanıcı numarası yapılandırma sırasında + belirtilir. Böylece CGI/SSI programlarını çalıştırmasına izin + verilecek olası en düşük kullanıcı numarasını belirlemeniz mümkün + kılınmıştır. Bu bazı “sistem” hesaplarını devreden çıkarmak için + yararlıdır.

      +
    16. + +
    17. + Hedef grup root değil, değil mi? + +

      Mevcut durumda, root grubunun CGI/SSI + programlarını çalıştırmasına izin verilmemektedir.

      +
    18. + +
    19. + Hedef grup numarası asgari grup numarasından + BÜYÜK mü? + +

      Asgari grup numarası yapılandırma sırasında + belirtilir. Böylece CGI/SSI programlarını çalıştırmasına izin + verilecek olası en düşük grup numarasını belirlemeniz mümkün + kılınmıştır. Bu bazı “sistem” hesaplarını devreden çıkarmak için + yararlıdır.

      +
    20. + +
    21. + Apache’nin artalanda çağırdığı setuid program hedef + kullanıcı ve grubun aidiyetine geçebildi mi? + +

      Bu noktadan itibaren program setuid ve setgid + çağrıları üzerinden hedef kullanıcı ve grubun aidiyetine geçer. + Erişim grubu listesi de ayrıca kullanıcının üyesi olduğu tüm + gruplara genişletilir.

      +
    22. + +
    23. + Hedef CGI/SSI programının bulunduğu dizine geçebildik mi? + + +

      Dizin mevcut değilse dosyaları da içeremez. Hedef + dizine geçemiyorsak bu, dizin mevcut olmadığından olabilir.

      +
    24. + +
    25. + Hedef dizin Apache için izin verilen yerlerden biri mi? + + +

      İstek sunucunun normal bir bölümü için yapılmış + olsa da istenen dizin acaba suEXEC’in belge kök dizini altında mı? + Yani, istenen dizin, suEXEC’in aidiyetinde çalıştığı kullanıcının + ev dizini altında bulunan, UserDir ile belirtilen dizinin altında mı? (suEXEC’in yapılandırma seçeneklerine + bakınız).

      +
    26. + +
    27. + Hedef dizin başkaları tarafından yazılabilen bir dizin değil, + değil mi? + +

      Başkaları da yazabilsin diye bir dizin açmıyoruz; + dizin içeriğini sadece sahibi değiştirebilmelidir.

      +
    28. + +
    29. + Hedef CGI/SSI programı mevcut mu? + +

      Mevcut değilse çalıştırılamaz.

      +
    30. + +
    31. + Hedef CGI/SSI program dosyasına başkaları tarafından + yazılamıyor, değil mi? + +

      Hedef CGI/SSI programının dosyasına sahibinden + başka kimsenin bir şeyler yazmasını istemeyiz.

      +
    32. + +
    33. + Hedef CGI/SSI program setuid veya setgid değil, + değil mi? + +

      UID/GID‘i tekrar değiştirecek programlar + çalıştırmayı istemeyiz.

      +
    34. + +
    35. + Hedef kullanıcı/grup, programın kullanıcı/grubu ile aynı mı? + + +

      Hedef kullanıcı dosyanın sahibi mi?

      +
    36. + +
    37. + İşlemlerin güvenle yapılabilmesi için süreç ortamını + başarıyla temizleyebildik mi? + +

      suEXEC, sürecin çalışacağı ortama güvenli bir + program çalıştırma yolu sağlamaktan başka, yapılandırma sırasında + oluşturulan güvenli ortam değişkenleri listesinde isimleri bulunan + ortam değişkenlerinden başkasını aktarmayacaktır.

      +
    38. + +
    39. + Hedef CGI/SSI programı haline gelip çalışabildik mi? + +

      Burası suEXEC’in bitip CGI/SSI programının + başladığı yerdir.

      +
    40. +
    + +

    Bu süreç suEXEC güvenlik modelinin standart işlemlerini oluşturur. + Biraz zorlayıcı ve CGI/SSI tasarımına yeni kurallar ve sınırlamalar + getiriyor olsa da düşünülen güvenliği adım adım sağlayacak şekilde + tasarlanmıştır.

    + +

    Düzgün bir suEXEC yapılandırmasının hangi güvenlik risklerinden + kurtulmayı sağladığı ve bu güvenlik modelinin sunucu yapılandırmasıyla + ilgili sorumluluklarınızı nasıl sınırlayabildiği hakkında daha + ayrıntılı bilgi edinmek için bu belgenin "Uyarılar ve Örnekler" bölümüne bakınız.

    +
    top
    +
    +

    suEXEC’in Yapılandırılması ve Kurulumu

    + +

    Eğlence başlıyor.

    + +

    suEXEC yapılandırma seçenekleri
    +

    + +
    +
    --enable-suexec
    + +
    Bu seçenek, hiçbir zaman öntanımlı olarak kurulmayan ve + etkinleştirilmeyen suEXEC özelliğini etkin kılar. suEXEC özelliğini + kullanma isteğinizi Apache’nin kabul edebilmesi için + --enable-suexec seçeneğinin yanında en azından bir tane + de --with-suexec-xxxxx seçeneği belirtilmiş + olmalıdır.
    + +
    --with-suexec-bin=YOL
    + +
    Güvenlik sebebiyle suexec çalıştırılabilirinin + bulunduğu yer sunucu koduna yazılır. Bu seçenekle öntanımlı yol + değiştirilmiş olur. Örnek:
    + --with-suexec-bin=/usr/bin/suexec
    + +
    --with-suexec-caller=KULLANICI
    + +
    Normalde Apache’nin aidiyetinde çalıştığı kullanıcıdır. Bu, bu programı + çalıştırmasına izin verilen tek kullanıcıdır.
    + +
    --with-suexec-userdir=DÄ°ZÄ°N
    + +

    Kullanıcıların ev dizinleri altında suEXEC’in erişmesine izin + verilen alt dizinin yerini tanımlar. Bu dizin altında suEXEC + kullanıcısı tarafından çalıştırılacak tüm programlar "güvenilir" + olmalıdır. Eğer “basit” bir UserDir yönergesi kullanıyorsanız ( içinde “*” + bulunmayan), bunun aynı dizin olması gerekir. Eğer burada belirtilen + dizin, passwd dosyasında kullanıcı için belirtilmiş + dizinin altında UserDir + yönergesinde belirtilen dizin olmadığı takdirde suEXEC işini + gerektiği gibi yapmayacaktır. Öntanımlı değer + public_html’dir.

    + +

    Eğer, sanal konaklarınızın herbiri farklı UserDir yönergeleri içeriyorsa + burada belirtilecek dizinin üst dizininin hepsinde aynı olması + gerekir. Aksi takdirde, "~kullanıcı" + istekleri düzgün çalışmayacaktır.

    + +
    --with-suexec-docroot=DÄ°ZÄ°N
    + +
    Apache için belge kök dizinini belirler. Bu, (UserDir’lardan başka) suEXEC için + kullanılacak tek hiyerarşi olacaktır. Öntanımlı dizin sonuna + "/htdocs" eklenmiş --datadir dizinidir. + Yani, seçeneği "--datadir=/home/apache" olarak + belirtmişseniz suEXEC çalıştırıcısı için belge kök dizini + "/home/apache/htdocs" olur.
    + +
    --with-suexec-uidmin=UID
    + +
    suEXEC kullanıcısının kullanıcı kimliği olarak izin verilen en + düşük değeri belirler. Çoğu sistemde bu ya 500’dür ya da 100; 100 + öntanımlıdır.
    + +
    --with-suexec-gidmin=GID
    + +
    suEXEC kullanıcısının grup kimliği olarak izin verilen en düşük + değeri belirler. Çoğu sistemde bu 100 olup, seçeneğin de öntanımlı + değeridir.
    + +
    --with-suexec-logfile=DOSYA
    + +
    suEXEC hareketlerinin ve hatalarının kaydedileceği günlük + dosyasının adını belirler (denetim ve hata ayıklama için + kullanışlıdır). Öntanımlı günlük dosyası ismi + "suexec_log" olup yeri (--logfiledir + seçeneği ile belirtilen) günlük dosyaları dizinidir.
    + +
    --with-suexec-safepath=YOL
    + +
    CGI çalıştırılabilirlerine aktarılacak güvenilir PATH + ortam değişkeninin değerini tanımlar. + "/usr/local/bin:/usr/bin:/bin" öntanımlıdır.
    +
    + +

    SuEXEC çalıştırıcısının derlenmesi ve kurulumu

    + + +

    SuEXEC özelliğini --enable-suexec seçeneği ile + etkinleştirdiyseniz make komutunu verdiğinizde Apache + ile birlikte suexec çalıştırılabilir dosyası da + derlenecektir.

    + +

    Tüm bileşenler derlendikten sonra make install komutunu + vererek kurulumu tamamlayabilirsiniz. suexec + çalıştırılabilir dosyası --sbindir seçeneği ile + tanımlanan dizine kurulacaktır; öntanımlı yeri + /usr/local/apache2/bin/ dizinidir.

    + +

    Kurulum adımında root yetkisine sahip + olmanız gerektiğini unutmayın. Çalıştırıcıya kullanıcı kimliğinin + atanabilmesi ve dosyanın sahibi olan kullanıcı kimliği ile + çalıştırılabilmesini mümkün kılan bitinin etkin kılınabilmesi için + kurulumun root tarafından yapılması + önemlidir.

    + + +

    Paranoyak yetkilendirme

    + + +

    SuEXEC çalıştırıcısı kendini çalıştıran kullanıcının + configure betiğine + --with-suexec-caller seçeneği ile belirtilen kullanıcı + olup olmadığına bakacaksa da, bu sınamanın da bir sistem veya + kütüphane çağrısı ile istismar edilmiş olma ihtimali gözardı + edilmemelidir. Bunun meydana gelmesini önlemek için ve genelde + yapıldığı gibi dosyanın izinlerini suEXEC çalıştırıcısı sadece Apache + sunucusunun aidiyetinde çalıştığı kullanıcı tarafından çalıştırılacak + şekilde ayarlayınız.

    + +

    Örneğin, sunucunuz şöyle yapılandırılmışsa:

    + +

    + User apache
    + Group apache-grup
    +

    + +

    Ve suexec çalıştırılabilir de + /usr/local/apache2/bin/ dizinine kurulmuşsa şu komutları + vermelisiniz:

    + +

    + chgrp apache-grup /usr/local/apache2/bin/suexec
    + chmod 4750 /usr/local/apache2/bin/suexec
    +

    + +

    Böylece suEXEC çalıştırıcısını Apache’yi çalıştıran grubun + üyelerinden başkasının çalıştıramayacağından emin olabilirsiniz.

    + +
    top
    +
    +

    suEXEC’in etkin kılınması ve iptal edilmesi

    + + +

    Apache başlatıldığı sırada suexec çalıştırıcısı + için --sbindir seçeneği ile tanımlanan dizine bakar + (seçeneğin öntanımlı değeri + /usr/local/apache/bin/suexec’tir). Apache düzgün + yapılandırılmış bir suEXEC çalıştırıcısı bulduğu takdirde hata + günlüğüne şöyle bir ileti yazacaktır:

    + +

    + [notice] suEXEC mechanism enabled (wrapper: /dosya/yolu/suexec) +

    + +

    Sunucu başlatıldığında bu ileti yazılmazsa sunucu ya çalıştırıcı + programı umduğu yerde bulamamıştır ya da dosyanın setuid biti + root tarafından etkin kılınmamıştır.

    + +

    SuEXEC mekanizmasını etkin kılmak istediğiniz sunucu çalışmaktaysa + sunucuyu önce öldürmeli sonra yeniden başlatmalısınız. Basit bir + HUP veya USR1 sinyali ile yeniden başlamasını + sağlamak yeterli olmayacaktır.

    + +

    SuEXEC mekanizmasını iptal etmek için ise suexec + dosyasını sildikten sonra Apache sunucusunu öldürüp yeniden + başlamalısınız.

    +
    top
    +
    +

    SuEXEC’in kullanımı

    + +

    CGI programlarına yapılan isteklerin suEXEC çalıştırıcısı tarafından + yerine getirilebilmesi için sanal konağın bir SuexecUserGroup yönergesi içermesi veya + isteğin mod_userdir tarafından işleme konulması + gerekir.

    + +

    Sanal Konaklar:
    SuEXEC çalıştırıcısını farklı + bir kullanıcı ile etkin kılmanın tek yolu VirtualHost bölümleri içinde SuexecUserGroup yönergesini + kullanmaktır. Bu yönergede ana sunucuyu çalıştıran kullanıcıdan farklı + bir kullanıcı belirterek ilgili sanal konak üzerinden CGI kaynakları + için yapılan tüm isteklerin belirtilen kullanıcı ve + grup tarafından çalıştırılması sağlanır. Bu yönergeyi + içermeyen sanal konaklar için ana sunucunun kullanıcısı + öntanımlıdır.

    + +

    Kullanıcı dizinleri:
    + mod_userdir tarafından işleme sokulan tüm istekler için + suEXEC çalıştırıcısı istek yapılan kullanıcı dizininin sahibinin + aidiyetinde çalıştırılacaktır. Bu özelliğin çalışması için tek + gereklilik, kullanıcının SuEXEC çalıştırıcısı için etkin kılınmış olması + ve çalıştırıcının yukarıdaki güvenlik sınamalarından + geçebilmesidir. Ayrıca, --with-suexec-userdir derleme seçeneğinin açıklamasına da bakınız.

    +
    top
    +
    +

    SuEXEC ve hata ayıklama

    + +

    SuEXEC çalıştırıcısı yukarıda değinildiği gibi günlük bilgilerini + --with-suexec-logfile seçeneği ile belirtilen dosyaya + yazacaktır. Çalıştırıcıyı doğru yapılandırarak kurduğunuzdan emin olmak + istiyorsanız, yolunda gitmeyen şeyler var mı diye bu günlük dosyasına + bakmayı ihmal etmeyin.

    + +
    top
    +
    +

    Uyarılar ve Örnekler

    + + +

    UYARI! Bu bölüm henüz bitmedi. Bu bölümün son hali + için çevrimiçi + belgelere bakınız.

    + +

    SuEXEC çalıştırıcısından dolayı sunucu ayarlarına bazı sınırlamalar + getiren bir kaç önemli nokta mevcuttur. SuEXEC ile ilgili hata + bildiriminde bulunmadan önce bunlara bir göz atmalısınız.

    + +
      +
    • suEXEC ile ilgili önemli noktalar
    • + +
    • Hiyerarşik sınırlamalar + +

      Güvenlik ve verimlilik adına, tüm suEXEC + isteklerinin sanal konaklar için üst düzey belge kökünün altındaki + dosyalarla, kullanıcı dizinleri için ise üst düzey bireysel belge + köklerinin altındaki dosyalarla sınırlı kalması gerekir. Örneğin, + dört sanal konağınız varsa ve suEXEC çalıştırıcısının + getirilerinden faydalanmak istiyorsanız, sanal konaklarınızın belge + kök dizinlerini ana sunucunun belge kök dizininin altında kalacak + şekilde yapılandırmanız gerekir (örnek yolda).

      +
    • + +
    • SuEXEC'in PATH ortam değişkeni + +

      Bunu değiştirmek tehlikeli olabilir. Bu değişkende + tanımladığınız her yolun güvenli bir dizini işaret + ettiğinden emin olmalısınız. Başkalarının oralarda bir truva atı + çalıştırmasını istemiyorsanız buna çok dikkat ediniz.

      +
    • + +
    • SuEXEC kodunda değişiklik + +

      Gerçekte ne yaptığınızı bilmiyorsanız bu, + büyük bir sorun olabilir. Böyle şeyler yapmaktan + mümkün olduğunca uzak durmalısınız.

      +
    • +
    + +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/upgrading.html b/rubbos/app/httpd-2.0.64/docs/manual/upgrading.html new file mode 100644 index 00000000..cdfa384d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/upgrading.html @@ -0,0 +1,29 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: upgrading.html.de +Content-Language: de +Content-type: text/html; charset=ISO-8859-1 + +URI: upgrading.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: upgrading.html.es +Content-Language: es +Content-type: text/html; charset=ISO-8859-1 + +URI: upgrading.html.fr +Content-Language: fr +Content-type: text/html; charset=ISO-8859-1 + +URI: upgrading.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: upgrading.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: upgrading.html.ru.koi8-r +Content-Language: ru +Content-type: text/html; charset=KOI8-R diff --git a/rubbos/app/httpd-2.0.64/docs/manual/upgrading.html.de b/rubbos/app/httpd-2.0.64/docs/manual/upgrading.html.de new file mode 100644 index 00000000..dab326bd --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/upgrading.html.de @@ -0,0 +1,228 @@ + + + +Upgrade von 1.3 auf 2.0 - Apache HTTP Server + + + + + +
    <-
    +

    Upgrade von 1.3 auf 2.0

    +
    +

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

    +
    + +

    Dieses Dokument dient der Unterstützung beim Upgrade. Es + enthält die entscheidenden Informationen für bisherige + Apache-Nutzer. Diese sind als kurze Anmerkungen + gedacht. Weitere Informationen finden Sie entweder unter + Neue Funktionen oder in + den src/CHANGES-Dateien.

    +
    + +
    top
    +
    +

    Änderungen der Konfiguration bei der Kompilierung

    + + +
      +
    • Der Apache benutzt jetzt ein autoconf- und + libtool-System zur Konfiguration des + Erstellungsverfahrens. Die Verwendung dieses Systems ist + ähnlich, aber nicht identisch mit dem APACI-System des + Apache 1.3.
    • + +
    • Zusätzlich zu der üblichen Auswahl von Modulen, die + kompiliert werden sollen, wurde der Hauptteil der + Request-Verarbeitung im Apache 2.0 in die + Multi-Processing-Module (MPMs) verschoben.
    • +
    +
    top
    +
    +

    Änderungen der Laufzeit-Konfiguration

    + + +
      +
    • Viele Anweisungen aus dem Serverkern des Apache 1.3 sind + jetzt in den MPMs enthalten. Wenn Sie ein Serververhalten + wünschen, das demjenigen des Apache 1.3 möglichst + ähnlich ist, sollten Sie das prefork-MPM + auswählen. Andere MPMs verwenden abweichende Anweisungen + für die Prozess-Erstellung und Request-Verarbeitung.
    • + +
    • Das Proxy-Modul wurde + umgearbeitet, um es auf den Stand von HTTP/1.1 zu bringen. Eine + der bedeutendsten Änderungen ist die Platzierung der + Proxy-Zugriffskontrolle innerhalb eines <Proxy>-Blocks, statt innerhalb eines + <Directory proxy:>-Blocks.
    • + +
    • Die Behandlung von PATH_INFO (hinter dem + tatsächlichen Dateinamen angefügte Pfadangaben) wurde + für einige Module geändert. Module, die bisher als Handler + implementiert waren, jetzt aber als Filter implementiert sind, + akzeptieren möglicherweise keine Requests mit + PATH_INFO mehr. Filter wie INCLUDES oder PHP sind gleich oben im + Core-Handler implementiert und weisen deshalb Requests mit + PATH_INFO ab. Sie können die AcceptPathInfo-Direktive + verwenden, um den Core-Handler zu zwingen, Requests mit + PATH_INFO zu akzeptieren, und dadurch die Fähigkeit + wiederherstellen, PATH_INFO in Server Side Includes zu + benutzen.
    • + +
    • Die CacheNegotiatedDocs-Direktive + hat jetzt das Argument an (on) oder aus + (off). Die vorhandenen Anweisungen CacheNegotiatedDocs sollten durch + CacheNegotiatedDocs on ersetzt werden.
    • + +
    • + Die ErrorDocument-Direktive + verwendet kein Anführungszeichen mehr am Anfang des + Arguments, um eine + Textnachricht anzuzeigen. Stattdessen sollten Sie die + Nachricht in doppelte Anführungszeichen einschließen. + Zum Beispiel sollten existierende Angaben wie + +

      + ErrorDocument 403 "Eine Nachricht +

      + durch + +

      + ErrorDocument 403 "Eine Nachricht" +

      + + ersetzt werden. + Solange das zweite Argument kein gültiger URL oder + Pfadname ist, wird es als Textnachricht behandelt. +
    • + +
    • Die Direktiven AccessConfig und + ResourceConfig sind entfallen. + Diese Direktiven können durch die Include-Direktive + ersetzt werden, die eine äquivalente Funktionalität besitzt. + Wenn Sie die Defaultwerte dieser Direktiven verwendet haben, + ohne sie in die Konfigurationsdateien einzufügen, müssen Sie + möglicherweise Include conf/access.conf und + Include conf/srm.conf zu Ihrer httpd.conf + hinzufügen. Um sicherzustellen, daß der Apache die + Konfigurationsdateien in der gleichen Reihenfolge liest, wie sie von + den älteren Direktiven impliziert wurde, sollten die Include-Direktiven ans Ende der + httpd.conf gestellt werden, wobei die Direktive für + srm.conf derjenigen für access.conf + vorangeht.
    • + +
    • Die Direktiven BindAddress und Port + sind entfallen. Eine äquivalente Funktionalität wird von der + flexibleren Direktive Listen bereitgestellt.
    • + +
    • Im Apache 1.3 wurde die Port-Direktive außerdem + dazu verwendet, die Portnummer für + selbstreferenzierende URLs festzulegen. + Die neue ServerName-Syntax + stellt das Apache-2.0-Äquivalent dar: + sie wurde dahingehend verändert, sowohl den Hostnamen + als auch die Portnummer für selbstreferenzierende URLs + in einer Direktive angeben zu können.
    • + +
    • Die ServerType-Direktive entfällt. + Die Methode zum Bedienen der Requests wird nun durch die Auswahl + des MPM ermittelt. Derzeit ist kein MPM dafür bestimmt, von inetd + gestartet zu werden.
    • + +
    • Die Module mod_log_agent und + mod_log_referer, welche die Direktiven AgentLog, + RefererLog und RefererIgnore bereitgestellt + hatten, wurden entfernt. Durch Verwendung der Direktive CustomLog aus mod_log_config + sind die Agent- und Refererlogs auch weiterhin verfügbar.
    • + +
    • Die Direktiven AddModule und + ClearModuleList sind entfallen. + Diese Direktiven wurden benutzt, um sicherzustellen, daß die + Module in der richtigen Reihenfolge aktiviert werden können. + Die neue Apache 2.0 API erlaubt es Modulen, ihre Reihenfolge + explizit anzugeben, und macht diese Direktiven damit + überflüssig.
    • + +
    • Die Direktive FancyIndexing wurde entfernt. + Die gleiche Funktionalität ist nun mit der Option + FancyIndexing der Direktive IndexOptions verfügbar.
    • + +
    • Die von mod_negotiation bereitgestellte + Content-Negotiation-Technik MultiViews führt nun eine strengere + Dateierkennung durch. Es wird ausschließlich unter den + aushandelbaren Dateien gewählt. Das bisherige Verhalten + kann jedoch mit der Direktive MultiviewsMatch wiederhergestellt + werden.
    • + +
    • (Ab Version 2.0.51) +

      ErrorHeader war eine Fehlbenennung, weshalb die + Funktionalität dieser Direktive mit der + Header-Anweisung + zusammengelegt wurde. Verwenden Sie stattdessen

      + +

      + Header always set foo bar +

      + +

      um den gleichen Effekt zu erzielen.

    • +
    +
    top
    +
    +

    Sonstige Änderungen

    + + +
      +
    • Das Modul mod_auth_digest, das im Apache 1.3 + experimentellen Status hatte, ist nun ein Standardmodul.
    • + +
    • Das Modul mod_mmap_static, das im Apache 1.3 + experimentellen Status hatte, wurde durch das Modul mod_file_cache ersetzt.
    • + +
    • Die Distribution wurde komplett reorganisiert und enthält kein + unabhängiges src-Verzeichnis mehr. Stattdessen wurden + die Quellcodes logisch unterhalb des Hauptverzeichnisses der + Distribution angeordnet. Installationen des kompilierten Servers + sollten in ein separates Verzeichnis erfolgen.
    • +
    +
    top
    +
    +

    Module von Drittanbietern

    + + +

    An der API des Apache 2.0 wurden umfassende Änderungen + vorgenommen. Bestehende Module, die für die Apache 1.3 API + entwickelt wurden, werden nicht ohne Modifikationen mit + der Version 2.0 des Apache zusammenarbeiten. Details sind in der Dokumentation für Entwickler beschrieben.

    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/upgrading.html.en b/rubbos/app/httpd-2.0.64/docs/manual/upgrading.html.en new file mode 100644 index 00000000..79b99edd --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/upgrading.html.en @@ -0,0 +1,221 @@ + + + +Upgrading to 2.0 from 1.3 - Apache HTTP Server + + + + + +
    <-
    +

    Upgrading to 2.0 from 1.3

    +
    +

    Available Languages:  de  | + en  | + es  | + fr  | + ja  | + ko  | + ru 

    +
    + +

    In order to assist folks upgrading, we maintain a document + describing information critical to existing Apache users. These + are intended to be brief notes, and you should be able to find + more information in either the New Features document, or in + the src/CHANGES file.

    +
    + +
    top
    +
    +

    Compile-Time Configuration Changes

    + + +
      +
    • Apache now uses an autoconf and + libtool system for configuring the build processes. + Using this system is similar to, but not the same as, using + the APACI system in Apache 1.3.
    • + +
    • In addition to the usual selection of modules which you + can choose to compile, Apache 2.0 has moved the main part of + request processing into Multi-Processing + Modules (MPMs).
    • +
    +
    top
    +
    +

    Run-Time Configuration Changes

    + + +
      +
    • Many directives that were in the core server in Apache + 1.3 are now in the MPMs. If you wish the behavior of the + server to be as similar as possible to the behavior of Apache + 1.3, you should select the prefork MPM. Other MPMs + will have different directives to control process creation and request + processing.
    • + +
    • The proxy module has been + revamped to bring it up to HTTP/1.1. Among the important changes, + proxy access control is now placed inside a <Proxy> block rather than a + <Directory proxy:> block.
    • + +
    • The handling of PATH_INFO (trailing path information + after the true filename) has changed for some modules. Modules + that were previously implemented as a handler but are now + implemented as a filter may no longer accept requests with + PATH_INFO. Filters such as INCLUDES or PHP are implemented on top + of the core handler, and therefore reject requests with + PATH_INFO. You can use the AcceptPathInfo directive to + force the core handler to accept requests with PATH_INFO + and thereby restore the ability to use PATH_INFO in + server-side includes.
    • + +
    • The CacheNegotiatedDocs + directive now takes the argument on or + off. Existing instances of CacheNegotiatedDocs should be + replaced with CacheNegotiatedDocs on.
    • + +
    • + The ErrorDocument + directive no longer uses a quote at the beginning of the + argument to indicate a text message. Instead, you should + enclose the message in double quotes. For example, existing + instances of + +

      + ErrorDocument 403 "Some Message +

      + should be replaced with + +

      + ErrorDocument 403 "Some Message" +

      + + As long as the second argument is not a valid URL or + pathname, it will be treated as a text message. +
    • + +
    • The AccessConfig and + ResourceConfig directives no longer exist. + Existing instances of these directives can be replaced with + the Include + directive which has equivalent functionality. If you were + making use of the default values of these directives without + including them in the configuration files, you may need to + add Include conf/access.conf and Include + conf/srm.conf to your httpd.conf. In order to + assure that Apache reads the configuration files in the same order + as was implied by the older directives, the Include directives should be placed at the end + of httpd.conf, with the one for srm.conf + preceding the one for access.conf.
    • + +
    • The BindAddress and Port + directives no longer exist. Equivalent functionality is + provided with the more flexible + Listen + directive.
    • + +
    • Another use of the Port + directive in Apache-1.3 was setting the port number to be used + in self-referential URL's. The Apache-2.0 equivalent is + the new ServerName + syntax: it has been changed to allow specifying both the + hostname and the port number for self-referential URL's + in one directive.
    • + +
    • The ServerType directive no longer exists. + The method used to serve requests is now determined by the + selection of MPM. There is currently no MPM designed to be + launched by inetd.
    • + +
    • The mod_log_agent and mod_log_referer + modules which provided the AgentLog, + RefererLog and RefererIgnore directives have + been removed. Agent and referer logs are still available using the + CustomLog + directive of mod_log_config.
    • + +
    • The AddModule and + ClearModuleList directives no longer exist. + These directives were used to ensure that modules could be + enabled in the correct order. The new Apache 2.0 API allows + modules to explicitly specify their ordering, eliminating the + need for these directives.
    • + +
    • The FancyIndexing directive has been removed. + The same functionality is available through the + FancyIndexing option to the IndexOptions + directive.
    • + +
    • The MultiViews content-negotiation technique provided by + mod_negotiation has become more strict in its + default file matching. It will select only from negotiable + files. The old behavior can be restored using the MultiviewsMatch directive.
    • + +
    • (since version 2.0.51) +

      The functionality of the ErrorHeader directive was + put together with the Header + directive, since it was a misnomer. Use

      + +

      + Header always set foo bar +

      + +

      instead to get the desired behaviour.

    • +
    +
    top
    +
    +

    Misc Changes

    + + +
      +
    • The module mod_auth_digest, which was + experimental in Apache 1.3, is now a standard module.
    • + +
    • The mod_mmap_static module, which was experimental in + Apache 1.3, has been replaced with mod_file_cache.
    • + +
    • The distribution has been completely reorganized so that + it no longer contains an independent src + directory. Instead, the sources are logically organized under + the main distribution directory, and installations of the + compiled server should be directed to a separate + directory.
    • +
    +
    top
    +
    +

    Third Party Modules

    + + +

    Extensive changes were made to the server API in Apache 2.0. + Existing modules designed for the Apache 1.3 API will + not work in Apache 2.0 without modification. + Details are provided in the developer + documentation.

    +
    +
    +

    Available Languages:  de  | + en  | + es  | + fr  | + ja  | + ko  | + ru 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/upgrading.html.es b/rubbos/app/httpd-2.0.64/docs/manual/upgrading.html.es new file mode 100644 index 00000000..9cea410f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/upgrading.html.es @@ -0,0 +1,246 @@ + + + +Pasar a usar Apache 2.0 si ahora usa Apache 1.3 - Servidor HTTP Apache + + + + + +
    <-
    +

    Pasar a usar Apache 2.0 si ahora usa Apache 1.3

    +
    +

    Idiomas disponibles:  de  | + en  | + es  | + fr  | + ja  | + ko  | + ru 

    +
    + +

    Este documento recoge infomación crítica sobre el + proceso de actulización de la versión de Apache que + usa. Se trata de pequeños comentarios. Puede encontrar más + información tanto en Nuevas + funcionalidades, como en el archivo + src/CHANGES.

    +
    + +
    top
    +
    +

    Cambios en el proceso de configuración y + compilación

    + + +
      +
    • Apache usa ahora autoconf y + libtool en el proceso de + compilación. Este sistema es parecido aunque no igual + al sistema APACI de Apache 1.3.
    • + +
    • Además de la selección de módulos habitual + que puede hacer al compilar, en Apache 2.0 la mayor parte del + procesamiento de las petición es llevada a cabo por módulos de multiprocesamiento + (MPMs).
    • +
    +
    top
    +
    +

    Cambios en el proceso de configuración inicial del + servidor

    + + +
      +
    • Muchas directivas que pertenecían al core (núcleo) + del servidor en Apache 1.3 se encuentran ahora en distintos + módulos de multiprocesamiento. Si desea que el nuevo + servidor de comporte de la forma más parecida posible a + como lo hacía Apache 1.3, debe usar el módulo de + multiprocesamiento prefork. Otros módulos + de multiprocesamiento tienen diferentes directivas para + controlar la creación de procesos y el procesamiento de + peticiones.
    • + +
    • El módulo proxy ha + sido remodelado para ponerlo al día con la + especificación HTTP/1.1. Entre los cambios más + importantes está el que ahora el control de acceso al proxy + está dentro de un bloque <Proxy> en lugar de en un bloque + <Directory proxy:>.
    • + +
    • El procesamiento de PATH_INFO (la + información que aparece detrás de un nombre de fichero + válido) ha cambiado en algunos módulos. Los + módulos que fueron previamente implementados como un handler + pero que ahora son implementados como un filtro puede que no + acepten peticiones que incluyan PATH_INFO. Filtros + como INCLUDES o PHP están implementados + sobre el handler principal (core handler), y por tanto + rechazarán peticiones con PATH_INFO. Puede + usar la directiva AcceptPathInfo para forzar al handler + principal a aceptar peticiones con PATH_INFO y por + tanto restaurar la posibilidad de usar PATH_INFO en + server-side includes.
    • + +
    • La directiva CacheNegotiatedDocs toma + ahora como argumento on u off. Las + instancias existentes de CacheNegotiatedDocs deben reemplazarse por + CacheNegotiatedDocs on.
    • + +
    • + La directiva ErrorDocument no usa ya dobles + comillas al principio del argumento para indicar el mensaje de + texto a mostrar. En lugar de esto, ponga entre comillas todo + el mensaje. Por ejemplo, + +

      + ErrorDocument 403 "Mensaje +

      + debe sustituirse por + +

      + ErrorDocument 403 "Mensaje" +

      + + Si el segundo argumento no es una URL o una ruta válida a + un archivo, será tratado como un mensaje de texto. +
    • + +
    • Las directivas AccessConfig y + ResourceConfig han desaparecido. Las instancias + existentes de estas directivas pueden ser sustituidas por + directivas Include que + tienen una funcionalidad equivalente. Si hacía uso de los + valores por defecto de esas directivas sin incluirlas en los + ficheros de configuración, puede que necesite añadir + Include conf/access.conf e Include + conf/srm.conf a su fichero httpd.conf. Para + asegurar que Apache lee el fichero de configuración en el + mismo orden que asumían las antiguas directivas, las + directivas Include deben + ser reemplazadas al final del fichero httpd.conf, + con la de srm.conf precediendo a la de + access.conf.
    • + +
    • Las directivas BindAddress y Port + no existen ya. Las funcionalidades que ofrecían esas + directivas están ahora cubiertas por la directiva + Listen, que es mucho + más flexible.
    • + +
    • Otro uso de la directiva Port en Apache 1.3 era + fijar el número de puerto que se usaba para URLs + autoreferenciadas. La directiva equivalente en Apache 2.0 es la + nueva directiva ServerName: + este cambio se ha introducido para permitir la + especificación del nombre de host y del + número de puerto para URLs autorreferenciadas en una sola + directiva.
    • + +
    • La directiva ServerType ha dejado de existir. + El método usado para servir peticiones está ahora + determinado por la selección del módulo de + multiprocesamiento. Actualmente no hay diseñado un + módulo de multiprocesamiento que pueda ser ejecutado por + inetd.
    • + +
    • Los módulos mod_log_agent y + mod_log_referer que contenían las directivas + AgentLog, RefererLog y + RefererIgnore han desaparecido. Los registros de + "agente" y de "referer" están disponibles todavía + usando la directiva CustomLog del módulo + mod_log_config.
    • + +
    • Las directivas AddModule y + ClearModuleList no están presentes en la nueva + versión de Apache. Estas directivas se usaban para + asegurar que los módulos pudieran activarse en el orden + correcto. La nueva API de Apache 2.0 permite a los módulos + especificar explícitamente su orden de activación, + eliminando la necesidad de las antiguas directivas.
    • + +
    • La directiva FancyIndexing se ha eliminado. La + funcionalidad que cubría está ahora disponible a + través de la opción FancyIndexing de la + directiva IndexOptions.
    • + +
    • La técnica de negociación de contenido MultiViews + ofrecida por mod_negotiation es ahora más + estricta en su algoritmo de selección de ficheros y solo + seleccionará ficheros negociables. El antiguo + comportamiento puede restaurarse usando la directiva MultiviewsMatch.
    • + +
    • (a partir de la versión 2.0.51)

      La + funcionalidad de la directiva ErrorHeader se ha + unido con la de la directiva Header, porque se estaba usando + un término equivocado. Use

      + +

      + Header always set foo bar +

      + +

      en lugar de conseguir el comportamiento deseado.

    • + +
    +
    top
    +
    +

    Cambios de menor importancia

    + + +
      +
    • El módulo mod_auth_digest, que era + experimental en Apache 1.3, es ahora un módulo + estándar.
    • + +
    • El módulo mod_mmap_static, que era + experimental en Apache 1.3, ha sido sustituido por el + módulo mod_file_cache.
    • + +
    • La distribución de Apache ha sido reorganizada por + completo para que no contenga a partir de ahora el directorio + independiente src. En su lugar, el código + fuente se ha organizado a partir del directorio principal de la + distribución, y las intalaciones del servidor compilado + deben hacerse en un directorio diferente.
    • +
    +
    top
    +
    +

    Módulos de terceras partes

    + + +

    La API de Apache 2.0 ha sufrido grandes cambios respecto a la + versión 1.3. Los módulos que se diseñaron para la + API de Apache 1.3 no funcionarán si no se + hacen las modificaciones necasarias para adaptarlos a Apache 2.0. + En la documentación para + desarrolladores puede encontrar información detallada + sobre este asunto.

    +
    +
    +

    Idiomas disponibles:  de  | + en  | + es  | + fr  | + ja  | + ko  | + ru 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/upgrading.html.fr b/rubbos/app/httpd-2.0.64/docs/manual/upgrading.html.fr new file mode 100644 index 00000000..6c9ad7ea --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/upgrading.html.fr @@ -0,0 +1,164 @@ + + + + + + + + Mise à jour de la version 1.3 à la version + 2.0 + + + + +
    + [APACHE DOCUMENTATION] + +

    Apache HTTP Server Version 2.0

    +
    + + + + +

    Mise à de la version 1.3 à la + version 2.0

    + +

    Afin d'aider les personnes souhaitant se mettre à + jour, nous maintenons un document décrivant les + informations critiques concernant les utilisateurs d'Apache. + Ces informations sont sous la forme de brèves notes, et + vous pouvez trouver plus d'informations dans le document Nouvelles + fonctionnalités ou dans le fichier + src/CHANGES.

    + +

    Changement de la configuration à la compilation

    + +
      +
    • Apache utilise maintenant autoconf et + libtool afin de configurer la compilation. + L'utilisation de ces outils est similaire, mais pas tout + à fait identique, au système APACI de + configuration existant dans la version 1.3 d'Apache.
    • + +
    • En plus de l'habituelle sélection de modules que + vous pouvez choisir de compiler, Apache 2.0 a + déplacé la majeure partie du traitement des + requêtes dans les modules + multi-traitements (MPMs).
    • +
    + +

    Changement de la configuration à + l'exécution

    + +
      +
    • La directive CacheNegotiatedDocs prend + maintenant un paramètre qui est soit on + soit off. Les configurations existantes + utilisant la directive CacheNegotiatedDocs + doivent la remplacer par CacheNegotiatedDocs + on.
    • + +
    • + La directive ErrorDocument n'utilise plus de + guillemets ou d'apostrophes au début du + paramètre indiquant le message. Dorénavant, + le message devra être entre guillemets. Par exemple, + la directive + +
      + ErrorDocument 403 "Some Message +
      + devra être remplacé par + +
      + ErrorDocument 403 "Some Message" +
      + Si le second argument n'est pas une URL ou un chemin + valide, il sera traité comme un message. +
    • + +
    • Les directives AccessConfig et + ResourceConfig n'existent plus. Ces directives + peuvent être remplacées de manière + équivalente par la directive Include. Si + vous utilisiez ces directives en utilisant les valeurs par + défaut sans les définir explicitement, vous + devez ajouter les lignes Include + conf/access.conf et Include conf/srm.conf + dans votre fichier httpd.conf. Afin de garantir qu'Apache lit + les différents fichiers de configuration dans le + même ordre que celui pour les anciennes directives, Les + directives Include doivent être + situées à la fin du fichier httpd.conf, celle + représentant srm.conf avant celle pour + access.conf.
    • + +
    • La directive BindAddress n'existe plus. La + même fonctionnalité est fournie par la directive + Listen.
    • + +
    • La directive ExtendedStatus n'existe plus. + Le suivi des statuts a été entièrement + réécrit afin de bénéficier du + nouveau système MPM.
    • + +
    • La directive ServerType n'existe plus. La + méthode utilisée pour servir les requêtes + est déterminée maintenant par la + sélection d'un MPM. Il n'existe pas actuellement de + MPM conçu pour être lancé par inetd.
    • + +
    • Beaucoup de directives qui étaient situées + dans le noyau du serveur pour la version 1.3 se trouvent + maintenant dans les MPMs.
    • + +
    • Les modules mod_log_agent et mod_log_referer qui + traitaient les directives AgentLog, + RefererLog et RefererIgnore ont + été supprimés. Le traçage des + agents et référants et toujours disponible en + utilisant la directive CustomLog du + module mod_log_config.
    • +
    + +

    Changements divers

    + +
      +
    • L'option -S du programme httpd + qui servait à afficher la configuration des + hôtes virtuels est remplacé par -t -D + DUMP_VHOSTS.
    • + +
    • Le module mod_auth_digest, qui était + expérimental dans la version 1.3, est maintenant un + module standard.
    • + +
    • Le module mod_mmap_static, qui était + expérimental dans la version 1.3 a été + remplacé par le module mod_file_cache.
    • +
    + +

    Modules tiers

    + +

    D'énormes changements ont été + réalisés sur l'API du serveur Apache 2.0. Les + modules conçus à l'aide de l'API Apache 1.3 + ne fonctionneront pas sur Apache 2.0 sans + modifications. Plus de détails sont fournis dans la documentation du développeur.

    +
    + +

    Apache HTTP Server Version 2.0

    + Index + + + + + + diff --git a/rubbos/app/httpd-2.0.64/docs/manual/upgrading.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/upgrading.html.ja.utf8 new file mode 100644 index 00000000..70831acb --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/upgrading.html.ja.utf8 @@ -0,0 +1,222 @@ + + + +1.3 から 2.0 へのアップグレード - Apache HTTP サーバ + + + + + +
    <-
    +

    1.3 から 2.0 へのアップグレード

    +
    +

    Available Languages:  de  | + en  | + es  | + fr  | + ja  | + ko  | + ru 

    +
    + +

    アップグレードを簡単にするために、既存の Apache ユーザに + 非常に重要な情報をこの文書にまとめています。これは短い + 注意書きとして書かれています。より詳しい情報は + 新機能の文書や + src/CHANGES ファイルで見つけられると思います。

    +
    + +
    top
    +
    +

    コンパイル時の設定の変更

    + + +
      +
    • Apache は ビルド処理の設定 + に autoconf と libtool を使うようになりました。 + このシステムは Apache 1.3 の APACI システムと似ていますが、 + まったく同じというわけではありません。
    • + +
    • 通常のコンパイルするかどうかを選択できるモジュール群に加えて、 + Apache 2.0 は + リクエスト処理の主な部分を マルチプロセッシング + モジュール (MPM) に移動しました。
    • +
    +
    top
    +
    +

    実行時の設定の変更

    + + +
      +
    • Apache 1.3 の時にコアサーバにあった多くのディレクティブは + MPM に移動しました。サーバに Apache 1.3 とできるだけ同じ振る舞いを + させたい場合は、prefork MPM を + 選んでください。他の MPM はプロセスの作成やリクエストの処理の + 制御に異なったディレクティブを使います。
    • + +
    • Proxy モジュール は + HTTP/1.1 に対応するために再構成されました。重要な変更点としては、 + プロキシのアクセス制御が <Directory proxy:> ブロックの + 代わりに <Proxy> + ブロックに置かれるようになった、というものがあります。
    • + +
    • モジュールの中には、PATH_INFO (本当のファイル名の後に続く + パス情報) の扱いが変わったものがあります。以前はハンドラとして + 実装されていたものがフィルタとして実装されるようになったものは + PATH_INFO のあるリクエストを受け付けません。INCLUDES や + PHP などのフィルタは + コアハンドラの上に実装されていますので、PATH_INFO + 付きのリクエストを拒否します。 + AcceptPathInfo + ディレクティブを使ってコアハンドラが PATH_INFO + 付きのリクエストを受け付けるようにでき、それによって SSI 等で + PATH_INFO を使う機能を復活させることができます。
    • + +
    • CacheNegotiatedDocs + ディレクティブは on もしくは off という引数を + 取るようになりました。既に存在している + CacheNegotiatedDocs は + CacheNegotiatedDocs on + に置き換えてください。
    • + +
    • + ErrorDocument + ディレクティブはテキストメッセージを + 示すために引数の最初に使われていた引用符を使わないようになりました。 + 代わりに、メッセージを二重引用符で囲むようになっています。 + 例えば、既存の + +

      + ErrorDocument 403 "Some Message +

      + は + +

      + ErrorDocument 403 "Some Message" +

      + + に置き換える必要があります。 + 二番目の引数は、有効な URL やパス名でない限り + テキストメッセージとして扱われます。 +
    • + +
    • AccessConfig ディレクティブと + ResourceConfig ディレクティブは削除されました。 + これらのディレクティブは同等の機能を持つ + Include で + 置き換えることができます。設定ファイルに取り込む代わりに、 + 上のディレクティブのデフォルト値を使っていた場合は、 + httpd.conf に Include conf/access.conf と + Include conf/srm.conf を追加する必要があるでしょう。 + 以前のディレクティブによる順番のように Apache が設定ファイルを + 読み込むようにするためには、httpd.conf の最後に + srm.conf、access.conf の順にそれぞれ + Include + ディレクティブを書いてください。
    • + +
    • BindAddress ディレクティブと Port + ディレクティブは削除されました。同等の機能はより柔軟な + Listen + ディレクティブにより提供されています。
    • + +
    • Port ディレクティブは Apache-1.3 には自己参照 URL で + 使われるポート番号を設定する、という使用法もありました。 + これは Apache-2.0 では新しい + ServerName + 構文によって行ないます。一つのディレクティブでホスト名と + 自己参照 URL の両方を設定できるように構文が変更されました。
    • + +
    • ServerName ディレクティブは削除されました。 + リクエストを扱う方法は MPM の選択により決定されるようになりました。 + 現時点では inetd から起動されるように設計された MPM はありません。
    • + +
    • AgentLog ディレクティブ、 + RefererLog ディレクティブ、 + RefererIgnore ディレクティブを提供していた + mod_log_agent と mod_log_referer + モジュールは削除されました。 + Agent ログと refere ログは mod_log_config の + CustomLog + ディレクティブにより実現可能です。
    • + +
    • AddModule ディレクティブと ClearModuleList + ディレクティブは削除されました。これらのディレクティブは、 + モジュールが正しい順番で呼ばれるようにするために使われていました。 + Apache 2.0 の新 API はモジュールが明示的に順番を指定できるように + なっており、これらのディレクティブは必要なくなりました。
    • + +
    • FancyIndexing ディレクティブは削除されました。 + 同じ機能は IndexOptions + ディレクティブの FancyIndexing オプションで + 実現できます。
    • + +
    • mod_negotiation による MultiViews + コンテントネゴシエーション技術は、 + デフォルトのファイルマッチングがより厳密なものに変更されました。 + ネゴシエート可能なファイルの場合にのみ選択されます。 + 以前の挙動は、MultiviewsMatch + ディレクティブを使用することで復活できます。
    • + +
    • (バージョン 2.0.51 から) +

      ErrorHeader ディレクティブは不適切な名前 + だったために廃止され、その機能は Header ディレクティブに統合されました。 + 望みの動作を得るためには ErrorHeader の代わりに

      + +

      + Header always set foo bar +

      + +

      を使ってください。

    • +
    +
    top
    +
    +

    その他の変更

    + + +
      +
    • Apache 1.3 で実験的なモジュールだった + mod_auth_digest は + 標準モジュールになりました。
    • + +
    • Apache 1.3 で実験的なモジュールだった mod_mmap_static は + mod_file_cache で置き換えられました。
    • + +
    • Apache の配布は独立した src ディレクトリが + なくなるように、完全に再構成されました。その代わりに、 + ソースは主ディレクトリに論理的に配置されるようになり、 + コンパイルされたサーバのインストールは別ディレクトリへ + 行なうようになりました。
    • +
    +
    top
    +
    +

    サードパーティモジュール

    + + +

    Apache 2.0 のサーバ API には多くの変更が加えられました。 + Apache 1.3 用の既存のモジュールは Apache 2.0 では修正なしでは + 動きません。詳細は 開発者向け文書 にあります。

    +
    +
    +

    Available Languages:  de  | + en  | + es  | + fr  | + ja  | + ko  | + ru 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/upgrading.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/upgrading.html.ko.euc-kr new file mode 100644 index 00000000..4a1535f9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/upgrading.html.ko.euc-kr @@ -0,0 +1,204 @@ + + + +1.3¿¡¼­ 2.0À¸·Î ¾÷±×·¹À̵å - Apache HTTP Server + + + + + +
    <-
    +

    1.3¿¡¼­ 2.0À¸·Î ¾÷±×·¹À̵å

    +
    +

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

    +
    + +

    ¿ì¸®´Â ±âÁ¸ ¾ÆÆÄÄ¡ »ç¿ëÀÚ°¡ ¾÷±×·¹À̵åÇÏ´Â °ÍÀ» µ½±âÀ§ÇØ + Áß¿äÇÑ Á¤º¸¸¦ ¾Ë·ÁÁÖ´Â ¹®¼­¸¦ Á¦°øÇÑ´Ù. ÀÌ ¹®¼­´Â °£´ÜÇÑ + ¿ä¾àÀ̹ǷÎ, »õ·Î¿î ±â´É + ¹®¼­³ª src/CHANGES ÆÄÀÏ¿¡¼­ Á¤º¸¸¦ ã¾ÆºÁ¾ß + ÇÑ´Ù.

    +
    + +
    top
    +
    +

    ÄÄÆÄÀϽà ±¸¼º º¯È­

    + + +
      +
    • ¾ÆÆÄÄ¡´Â ÀÌÁ¦ ¾ÆÆÄÄ¡ ÄÄÆÄÀÏ°ú ¼³Ä¡¸¦ À§ÇØ + autoconf¿Í libtool ½Ã½ºÅÛÀ» + »ç¿ëÇÑ´Ù. ÀÌ ½Ã½ºÅÛÀÇ »ç¿ë¹ýÀº Apache 1.3ÀÇ APACI ½Ã½ºÅÛ°ú + °°Áö´Â ¾ÊÁö¸¸ ºñ½ÁÇÏ´Ù.
    • + +
    • ÄÄÆÄÀÏ ¿©ºÎ¸¦ ¼±ÅÃÇÒ ¸ðµâ¿Ü¿¡ Apache 2.0Àº ¿äûÀ» + ó¸®ÇÏ´Â ÁÖ¿ä ºÎºÐÀ» ´ÙÁßó¸® ¸ðµâ + (Multi-Processing Modules) (MPM)·Î ¿Å°å´Ù.
    • +
    +
    top
    +
    +

    ½ÇÇà½Ã ¼³Á¤ º¯È­

    + + +
      +
    • Apache 1.3¿¡¼­ ¼­¹ö Çٽɿ¡ ÀÖ¾ú´ø ¸¹Àº Áö½Ã¾îµéÀÌ + ÀÌÁ¦´Â MPM¿¡ ÀÖ´Ù. ¼­¹ö°¡ Apache 1.3°ú ÃÖ´ëÇÑ ºñ½ÁÇÏ°Ô + µ¿ÀÛÇÏ±æ ¹Ù¶õ´Ù¸é prefork MPMÀ» ¼±ÅÃÇØ¾ß + ÇÑ´Ù. ´Ù¸¥ MPMÀº ´Ù¸¥ Áö½Ã¾î¸¦ »ç¿ëÇÏ¿© ÇÁ·Î¼¼½º »ý¼º°ú + ¿äûÀÇ Ã³¸®¸¦ Á¶ÀýÇÑ´Ù.
    • + +
    • proxy ¸ðµâÀº HTTP/1.1¿¡ + ¸ÂÃß¾î ¼öÁ¤µÇ¾ú´Ù. Áß¿äÇÑ º¯È­Áß Çϳª´Â ÀÌÁ¦ ÇÁ·Ï½Ã Á¢±ÙÁ¦¾î°¡ + <Directory proxy:> ºí·ÏÀÌ ¾Æ´Ï¶ó + <Proxy> + ºí·Ï¿¡ À§Ä¡ÇÏ´Â Á¡ÀÌ´Ù.
    • + +
    • ¸î¸î ¸ðµâ¿¡¼­ PATH_INFO (ÁøÂ¥ °æ·Î¸í + µÚ¿¡ ³ª¿À´Â °æ·Î Á¤º¸) ó¸® ¹æ½ÄÀÌ º¯°æµÇ¾ú´Ù. Àü¿¡ + Çڵ鷯¿´Áö¸¸ ÀÌÁ¦ ÇÊÅÍ·Î ±¸ÇöµÇ´Â ¸ðµâÀº ´õ ÀÌ»ó + PATH_INFO°¡ ÀÖ´Â ¿äûÀ» ¹Þ¾ÆµéÀÌÁö ¸øÇÑ´Ù. + INCLUDES³ª PHP¿Í °°Àº ÇÊÅÍ´Â + core Çڵ鷯 À§¿¡ ±¸ÇöµÇ±â¶§¹®¿¡ PATH_INFO°¡ + ÀÖ´Â ¿äûÀ» °ÅºÎÇÑ´Ù. core Çڵ鷯°¡ PATH_INFO°¡ + ÀÖ´Â ¿äûÀ» ¹Þ¾ÆµéÀÌ°í server-side include¿¡¼­ + PATH_INFO¸¦ »ç¿ëÇÏ°Ô ÇÏ·Á¸é, AcceptPathInfo Áö½Ã¾î¸¦ »ç¿ëÇØ¾ß + ÇÑ´Ù.
    • + +
    • CacheNegotiatedDocs + Áö½Ã¾î´Â ÀÌÁ¦ ¾Æ±Ô¸ÕÆ®·Î on°ú off¸¦ + ¹Þ´Â´Ù. ±âÁ¸ÀÇ CacheNegotiatedDocs´Â + CacheNegotiatedDocs onÀ¸·Î ¼öÁ¤ÇØ¾ß ÇÑ´Ù.
    • + +
    • + ErrorDocument Áö½Ã¾î´Â + ´õÀÌ»ó ¸Þ¼¼Áö¸¦ ³ªÅ¸³»´Â ¾Æ±Ô¸ÕÆ® ¾Õ¿¡ µû¿ÈÇ¥¸¦ »ç¿ëÇÏÁö + ¾Ê´Â´Ù. ´ë½Å ½Öµû¿ÈÇ¥·Î ¸Þ¼¼Áö¸¦ ¹­¾î¾ß ÇÑ´Ù. ¿¹¸¦ µé¾î °ú°Å + +

      + ErrorDocument 403 "Some Message +

      + ´Â ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇØ¾ß ÇÑ´Ù. + +

      + ErrorDocument 403 "Some Message" +

      + µÎ¹ø° ¾Æ±Ô¸ÕÆ®°¡ À¯È¿ÇÑ URLÀ̳ª °æ·Î¸íÀÌ ¾Æ´Ï¶ó¸é ¸Þ¼¼Áö·Î + °£ÁÖÇÑ´Ù. +
    • + +
    • AccessConfig¿Í ResourceConfig + Áö½Ã¾î´Â »ç¶óÁ³´Ù. ±âÁ¸¿¡ »ç¿ëÇÏ´ø Áö½Ã¾î´Â °°Àº ±â´ÉÀ» + ÇÏ´Â Include Áö½Ã¾î·Î + ´ëüÇÒ ¼ö ÀÖ´Ù. °ú°Å¿¡ ¼³Á¤ÆÄÀÏ¿¡¼­ ÀÌ Áö½Ã¾îµéÀ» »ç¿ëÇÏÁö¾Ê°í + ÀÌ Áö½Ã¾îµéÀÇ ±âº»°ªÀ» »ç¿ëÇß´Ù¸é, http.conf¿¡ + Include conf/access.conf¿Í Include + conf/srm.conf¸¦ Ãß°¡ÇÒ ÇÊ¿ä°¡ ÀÖ´Ù. ¾ÆÆÄÄ¡°¡ ÀÌÀü + Áö½Ã¾î¿Í °°Àº ¼ø¼­·Î ¼³Á¤ÆÄÀÏÀ» ÀаÔÇÏ·Á¸é + Include Áö½Ã¾î¸¦ + httpd.conf ³¡¿¡ µÎ°í, srm.confÀÌ + access.conf ¾Õ¿¡ ³ª¿Í¾ß ÇÑ´Ù.
    • + +
    • BindAddress¿Í Port Áö½Ã¾î´Â + »ç¶óÁ³´Ù. ´õ À¯¿¬ÇÑ Listen + Áö½Ã¾î°¡ °°Àº ±â´ÉÀ» ÇÑ´Ù.
    • + +
    • Apache-1.3¿¡¼­ Port´Â ÀÚ±âÂüÁ¶ + URLÀÇ Æ÷Æ® ¹øÈ£¸¦ ¼³Á¤ÇÏ´Â Àϵµ Çß´Ù. Apache-2.0¿¡¼­ ÀÌ + ±â´ÉÀº »õ·Î¿î ServerNameÀ¸·Î + ÇÑ´Ù. ÇÑ Áö½Ã¾î¿¡ È£½ºÆ®¸í°ú ÀÚ±âÂüÁ¶ URLÀ» À§ÇÑ + Æ÷Æ® ¹øÈ£¸¦ °°ÀÌ ¼³Á¤ÇÒ ¼ö ÀÖ´Ù.
    • + +
    • ServerType Áö½Ã¾î´Â »ç¶óÁ³´Ù. ¿äûÀ» + ¼­ºñ½ºÇÏ´Â ¹æ¹ýÀº ÀÌÁ¦ MPM ¼±Åÿ¡ ´Þ·È´Ù. ÇöÀç inetd¿¡¼­ + ½ÃÀÛÇϵµ·Ï ¼³°èµÈ MPMÀº ¾ø´Ù.
    • + +
    • AgentLog, RefererLog, + RefererIgnore Áö½Ã¾î¸¦ Á¦°øÇÑ + mod_log_agent¿Í mod_log_referer + ¸ðµâÀÌ ¾ø¾îÁ³´Ù. agent ·Î±×¿Í referer ·Î±×´Â + mod_log_configÀÇ CustomLog Áö½Ã¾î¸¦ + »ç¿ëÇÏ¿© °è¼Ó Á¦°øµÈ´Ù.
    • + +
    • AddModule°ú ClearModuleList + Áö½Ã¾î´Â »ç¶óÁ³´Ù. ÀÌ Áö½Ã¾îµéÀº ¸ðµâÀ» ¿Ã¹Ù¸¥ ¼ø¼­·Î + È°¼ºÈ­ÇÏ·Á°í »ç¿ëÇß´Ù. »õ·Î¿î Apache 2.0 API´Â ¸ðµâÀÌ + È°¼ºÈ­µÇ´Â ¼ø¼­¸¦ ¸í½ÃÀûÀ¸·Î ÁöÁ¤ÇÒ ¼ö À־, ÀÌ Áö½Ã¾îµéÀÌ + ÇÊ¿ä¾ø°Ô µÇ¾ú´Ù.
    • + +
    • FancyIndexing Áö½Ã¾î°¡ ¾ø¾îÁ³´Ù. + IndexOptions + Áö½Ã¾îÀÇ FancyIndexing ¿É¼ÇÀÌ °°Àº ±â´ÉÀ» ÇÑ´Ù.
    • + +
    • mod_negotiationÀÇ MultiViews ³»¿ëÇù»óÀÌ + ´õ ¾ö°ÝÇÏ°Ô ±âº»ÆÄÀÏÀ» ã´Â´Ù. ³»¿ëÇù»óÀº Çù»ó°¡´ÉÇÑ + ÆÄÀÏ Áß¿¡¼­¸¸ ¼±ÅÃÇÑ´Ù. MultiviewsMatch Áö½Ã¾î¸¦ + »ç¿ëÇÏ¿© ÀÌÀü°ú °°ÀÌ µ¿ÀÛÇÏ°Ô ÇÒ ¼ö ÀÖ´Ù.
    • + +
    • (2.0.51 ¹öÀü ÀÌÈÄ) +

      ErrorHeader Áö½Ã¾î´Â À߸øµÈ ¸íĪÀ¸·Î, + ÀÌ Áö½Ã¾î°¡ ´ã´çÇÑ ±â´ÉÀº Header Áö½Ã¾î·Îµµ °¡´ÉÇÏ´Ù. + ¿øÇÏ´Â ±â´ÉÀ» À§ÇØ,

      + +

      + Header always set ¾î¼°í Àú¼°í +

      + +

      ¿Í °°ÀÌ ¼³Á¤ÇÑ´Ù.

    • +
    +
    top
    +
    +

    ±âŸ º¯È­

    + + +
      +
    • Apache 1.3¿¡¼­ ½ÇÇèÀûÀÌ¿´´ø mod_auth_digest + ¸ðµâÀÌ ÀÌÁ¦ Ç¥ÁØ ¸ðµâÀÌ µÇ¾ú´Ù.
    • + +
    • Apache 1.3¿¡¼­ ½ÇÇèÀûÀÌ¿´´ø mod_mmap_static + ¸ðµâÀÌ mod_file_cache·Î ´ëüµÇ¾ú´Ù.
    • + +
    • ¹èÆ÷º»ÀÌ ¿ÏÀüÈ÷ »õ·Î ±¸¼ºµÇ¾î ´õÀÌ»ó µ¶¸³µÈ src + µð·ºÅ丮°¡ ¾ø´Ù. ´ë½Å ¼Ò½º´Â ÁÖ ¹èÆ÷º» µð·ºÅ丮 ¾Æ·¡ ³í¸®ÀûÀ¸·Î + ±¸¼ºµÇÀÖ°í, ÄÄÆÄÀÏÇÑ ¼­¹ö´Â ´Ù¸¥ µð·ºÅ丮·Î ¼³Ä¡µÈ´Ù.
    • +
    +
    top
    +
    +

    Á¦»ïÀÚ°¡ ¸¸µç ¸ðµâ

    + + +

    Apache 2.0¿¡¼­ ¼­¹ö API°¡ ¸¹ÀÌ º¯°æµÇ¾ú´Ù. Apache 1.3 API¿¡ + ¸ÂÃçÁø ±âÁ¸ ¸ðµâÀ» ¼öÁ¤¾øÀÌ Apache 2.0¿¡¼­ »ç¿ëÇÒ ¼ö + ¾ø´Ù. ÀÚ¼¼ÇÑ Á¤º¸´Â °³¹ßÀÚ + ¹®¼­¸¦ Âü°íÇ϶ó.

    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/upgrading.html.ru.koi8-r b/rubbos/app/httpd-2.0.64/docs/manual/upgrading.html.ru.koi8-r new file mode 100644 index 00000000..7dac1cd9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/upgrading.html.ru.koi8-r @@ -0,0 +1,218 @@ + + + +ðÅÒÅÈÏÄ ÏÔ ×ÅÒÓÉÉ 1.3 Ë ×ÅÒÓÉÉ 2.0 - HTTP ÓÅÒ×ÅÒ Apache + + + + + +
    <-
    +

    ðÅÒÅÈÏÄ ÏÔ ×ÅÒÓÉÉ 1.3 Ë ×ÅÒÓÉÉ 2.0

    +
    +

    äÏÓÔÕÐÎÙÅ ÑÚÙËÉ:  de  | + en  | + es  | + fr  | + ja  | + ko  | + ru 

    +
    + +

    üÔÏÔ ÄÏËÕÍÅÎÔ ÎÅÏÂÈÏÄÉÍ ÄÌÑ ÔÏÇÏ, ÞÔÏÂÙ ÐÏÍÏÞØ ÐÏÌØÚÏ×ÁÔÅÌÑÍ + ÐÅÒÅÊÔÉ Ë ÉÓÐÏÌØÚÏ×ÁÎÉÀ ÓÅÒ×ÅÒÁ ×ÅÒÓÉÉ 2.0. úÄÅÓØ ×Ù ÎÁÊÄ£ÔÅ ÌÉÛØ + ËÒÁÔËÉÅ ÚÁÍÅÞÁÎÉÑ; ÂÏÌÅÅ ÐÏÄÒÏÂÎÕÀ ÉÎÆÏÒÍÁÃÉÀ Ï ÎÏ×Ï××ÅÄÅÎÉÑÈ ÍÏÖÎÏ + ÎÁÊÔÉ ÌÉÂÏ × ÄÏËÕÍÅÎÔÅ îÏ×ÙÅ ×ÏÚÍÏÖÎÏÓÔÉ, ÌÉÂÏ × ÆÁÊÌÅ src/CHANGES.

    +
    + +
    top
    +
    +

    éÚÍÅÎÅÎÉÑ × ËÏÎÆÉÇÕÒÉÒÏ×ÁÎÉÉ ÐÒÏÃÅÓÓÁ ÓÂÏÒËÉ ÓÅÒ×ÅÒÁ

    + + +
      +
    • Apache ÔÅÐÅÒØ ÉÓÐÏÌØÚÕÅÔ ÓÉÓÔÅÍÕ autoconf É + libtool ÄÌÑ ËÏÎÆÉÇÕÒÉÒÏ×ÁÎÉÑ ÐÒÏÃÅÓÓÁ ÓÂÏÒËÉ. + éÓÐÏÌØÚÏ×ÁÎÉÅ ÜÔÏÊ ÓÉÓÔÅÍÙ ÐÏÈÏÖÅ ÎÁ ÉÓÐÏÌØÚÏ×ÁÎÉÅ + APACI × Apache 1.3, ÈÏÔÑ É ÎÅ Ñ×ÌÑÅÔÓÑ ÁÂÓÏÌÀÔÎÏ ÔÅÍ ÖÅ ÓÁÍÙÍ.
    • + +
    • ÷ ÄÏÂÁ×ÏË Ë ÏÂÙÞÎÏÍÕ ÓÐÉÓËÕ ÍÏÄÕÌÅÊ, ËÏÔÏÒÙÅ ×Ù ÍÏÖÅÔÅ + ×ÙÂÒÁÔØ ÐÒÉ ÓÂÏÒËÅ ÓÅÒ×ÅÒÁ, × Apache 2.0 ÐÏÑ×ÉÌÉÓØ ÍÕÌØÔÉ - ÐÒÏÃÅÓÓÎÙÅ ÍÏÄÕÌÉ (íð - ÍÏÄÕÌÉ), × ËÏÔÏÒÙÈ ÔÅÐÅÒØ + ÓËÏÎÃÅÎÔÒÉÒÏ×ÁÎÁ ÏÓÎÏ×ÎÁÑ ÞÁÓÔØ ËÏÄÁ, ÏÔ×ÅÞÁÀÝÅÇÏ ÚÁ ÏÂÒÁÂÏÔËÕ + ÚÁÐÒÏÓÏ×.
    • +
    +
    top
    +
    +

    éÚÍÅÎÅÎÉÑ × ËÏÎÆÉÇÕÒÉÒÏ×ÁÎÉÉ ÒÁÂÏÔÙ ÓÅÒ×ÅÒÁ

    + + +
      +
    • íÎÏÇÉÅ ÉÚ ÔÅÈ ÄÉÒÅËÔÉ×, ËÏÔÏÒÙÅ ÏÂÓÌÕÖÉ×ÁÌÉÓØ ÑÄÒÏÍ ÓÅÒ×ÅÒÁ + Apache 1.3, ÔÅÐÅÒØ ÐÅÒÅÎÅÓÅÎÙ × ÍÕÌØÔÉ - ÐÒÏÃÅÓÓÎÙÅ ÍÏÄÕÌÉ. åÓÌÉ ×Ù + ÈÏÔÉÔÅ, ÞÔÏÂÙ ÐÏ×ÅÄÅÎÉÅ ÓÅÒ×ÅÒÁ ÂÙÌÏ ÎÁÉÂÏÌÅÅ ÐÒÉÂÌÉÖÅÎÏ Ë ÐÏ×ÅÄÅÎÉÀ + Apache 1.3, ÔÏ ÐÒÉ ÓÂÏÒËÅ ×Ù ÄÏÌÖÎÙ ×ÙÂÒÁÔØ íð-ÍÏÄÕÌØ + prefork. äÒÕÇÉÅ íð-ÍÏÄÕÌÉ ÐÒÅÄÏÓÔÁ×ÌÑÀÔ + ÉÎÙÅ ÄÉÒÅËÔÉ×Ù, ÏÔ×ÅÞÁÀÝÉÅ ÚÁ ÒÁÂÏÔÕ ÐÒÏÃÅÓÓÏ× ÓÅÒ×ÅÒÁ É ÏÂÒÁÂÏÔËÕ + ÚÁÐÒÏÓÏ×.
    • + +
    • ðÒÏËÓÉ ÍÏÄÕÌØ ÂÙÌ ÐÅÒÅÐÉÓÁÎ, + É ÔÅÐÅÒØ ÐÏÄÄÅÒÖÉ×ÁÅÔ ÓÐÅÃÉÆÉËÁÃÉÀ HTTP/1.1. ïÄÎÉÍ ÉÚ ÎÁÉÂÏÌÅÅ + ×ÁÖÎÙÈ ÉÚÍÅÎÅÎÉÊ Ñ×ÌÑÅÔÓÑ ÔÏ, ÞÔÏ ÄÉÒÅËÔÉ×Ù, ËÏÎÔÒÏÌÉÒÕÀÝÉÅ ÒÁÂÏÔÕ + ÍÏÄÕÌÑ, ÔÅÐÅÒØ ÒÁÓÐÏÌÁÇÁÀÔÓÑ × ÓÅËÃÉÉ <Proxy>, Á ÎÅ × + <Directory proxy:>, ËÁË ÜÔÏ ÂÙÌÏ ÒÁÎÅÅ.
    • + +
    • ïÂÒÁÂÏÔËÁ PATH_INFO (ÐÕÔÅ×ÏÊ ÉÎÆÏÒÍÁÃÉÉ, ÓÌÅÄÕÀÝÅÊ ÚÁ + ÉÍÅÎÅÍ ÚÁÐÒÁÛÉ×ÁÅÍÏÇÏ ÄÏËÕÍÅÎÔÁ) ÉÚÍÅÎÉÌÁÓØ ÄÌÑ ÎÅËÏÔÏÒÙÈ ÍÏÄÕÌÅÊ. + íÏÄÕÌÉ, ËÏÔÏÒÙÅ ÒÁÎØÛÅ ÂÙÌÉ ÎÁÐÉÓÁÎÙ ËÁË ÏÂÒÁÂÏÔÞÉËÉ (handler), Á + ÔÅÐÅÒØ ×ÙÐÏÌÎÑÀÔ ÒÏÌØ ÆÉÌØÔÒÏ×, ÍÏÇÕÔ ÂÏÌÅÅ ÎÅ ÐÒÉÎÉÍÁÔØ ÚÁÐÒÏÓÙ, + ÓÏÄÅÒÖÁÝÉÅ PATH_INFO. ôÁËÉÅ ÆÉÌØÔÒÙ, ËÁË INCLUDES ÉÌÉ PHP ÒÅÁÌÉÚÏ×ÁÎÙ ÐÅÒ×ÙÍÉ × ÂÁÚÏ×ÏÍ + ÏÂÒÁÂÏÔÞÉËÅ, ÔÁËÉÍ ÏÂÒÁÚÏÍ ÏÎÉ ÎÅ ÍÏÇÕÔ ÐÒÉÎÉÍÁÔØ ÚÁÐÒÏÓÙ, ÓÏÄÅÒÖÁÝÉÅ + PATH_INFO. ÷Ù ÍÏÖÅÔÅ ÉÓÐÏÌØÚÏ×ÁÔØ ÄÉÒÅËÔÉ×Õ AcceptPathInfo, ÞÔÏÂÙ ÚÁÓÔÁ×ÉÔØ ÂÁÚÏ×ÙÊ + ÏÂÒÁÂÏÔÞÉË ÐÒÉÎÉÍÁÔØ ÐÏÄÏÂÎÙÅ ÚÁÐÒÏÓÙ, É ÔÁËÉÍ ÏÂÒÁÚÏÍ ×ÏÓÓÔÁÎÏ×ÉÔØ + ×ÏÚÍÏÖÎÏÓÔØ ÉÓÐÏÌØÚÏ×ÁÎÉÑ PATH_INFO × ÄÏËÕÍÅÎÔÁÈ, + ÉÓÐÏÌØÚÕÀÝÉÈ ×ËÌÀÞÅÎÉÑ ÎÁ ÓÔÏÒÏÎÅ ÓÅÒ×ÅÒÁ (SSI).
    • + +
    • äÉÒÅËÔÉ×Á CacheNegotiatedDocs + ÔÅÐÅÒØ ÍÏÖÅÔ ÐÒÉÎÉÍÁÔØ ÁÒÇÕÍÅÎÔÙ on É + off. õÖÅ ÓÕÝÅÓÔ×ÕÀÝÉÅ ÜËÚÅÍÐÌÑÒÙ ÄÉÒÅËÔÉ×Ù + CacheNegotiatedDocs ÄÏÌÖÎÙ ÂÙÔØ ÚÁÍÅÎÅÎÙ ÎÁ + CacheNegotiatedDocs on.
    • + +
    • + äÉÒÅËÔÉ×Á ErrorDocument + ÂÏÌÅÅ ÎÅ ÉÓÐÏÌØÚÕÅÔ ÏÔËÒÙ×ÁÀÝÕÀ ËÁ×ÙÞËÕ × ÎÁÞÁÌÅ ÁÒÇÕÍÅÎÔÁ + ÄÌÑ ÏÂÏÚÎÁÞÅÎÉÑ ÔÏÇÏ, ÞÔÏ ÁÒÇÕÍÅÎÔ Ñ×ÌÑÅÔÓÑ ÔÅËÓÔÏ×ÙÍ ÓÏÏÂÝÅÎÉÅÍ. + ÷ÍÅÓÔÏ ÜÔÏÇÏ ×ÁÍ ÎÅÏÂÈÏÄÉÍÏ ÚÁËÌÀÞÁÔØ ×ÅÓØ ÔÅËÓÔ ÓÏÏÂÝÅÎÉÑ + × Ä×ÏÊÎÙÅ ËÁ×ÙÞËÉ. îÁÐÒÉÍÅÒ, ÓÕÝÅÓÔ×ÕÀÝÉÅ ÄÉÒÅËÔÉ×Ù + +

      + ErrorDocument 403 "îÅËÏÔÏÒÏÅ ÓÏÏÂÝÅÎÉÅ +

      + ÄÏÌÖÎÙ ÂÙÔØ ÚÁÍÅÎÅÎÙ ÎÁ + +

      + ErrorDocument 403 "îÅËÏÔÏÒÏÅ ÓÏÏÂÝÅÎÉÅ" +

      + åÓÌÉ ×ÔÏÒÏÊ ÁÒÇÕÍÅÎÔ ÎÅ Ñ×ÌÑÅÔÓÑ ÐÒÁ×ÉÌØÎÏ ÏÆÏÒÍÌÅÎÎÙÍ + ÉÄÅÎÔÉÆÉËÁÔÏÒÏÍ ÒÅÓÕÒÓÁ (URL) ÉÌÉ ÐÕÔÅ×ÙÍ ÉÍÅÎÅÍ, ÔÏ ÏÎ + ÂÕÄÅÔ ÉÎÔÅÒÐÒÅÔÉÒÏ×ÁÔØÓÑ ËÁË ÔÅËÓÔÏ×ÏÅ ÓÏÏÂÝÅÎÉÅ. +
    • + +
    • äÉÒÅËÔÉ×Ù AccessConfig É + ResourceConfig ÂÏÌÅÅ ÎÅ ÓÕÝÅÓÔ×ÕÀÔ. + éÍÅÀÝÉÅÓÑ ÉÈ ËÏÐÉÉ ÍÏÇÕÔ ÂÙÔØ ÚÁÍÅÎÅÎÙ ÄÉÒÅËÔÉ×ÏÊ + Include, ËÏÔÏÒÁÑ ÉÍÅÅÔ + ÔÕ ÖÅ ÆÕÎËÃÉÏÎÁÌØÎÏÓÔØ. åÓÌÉ ÐÒÅÖÄÅ ×Ù ÎÅ ×ËÌÀÞÁÌÉ ÉÈ × ËÏÎÆÉÇÕÒÁÃÉÏÎÎÙÅ + ÆÁÊÌÙ, ÔÅÍ ÓÁÍÙÍ ÉÓÐÏÌØÚÕÑ ÉÈ ÚÎÁÞÅÎÉÑ ÐÏ ÕÍÏÌÞÁÎÉÀ, ÔÏ ÓÅÊÞÁÓ, + ÄÌÑ ÄÏÓÔÉÖÅÎÉÑ ÔÏÇÏ ÖÅ ÒÅÚÕÌØÔÁÔÁ, ×ÁÍ ÎÁÄÏ + ÄÏÂÁ×ÉÔØ ÓÌÅÄÕÀÝÉÅ ÓÔÒÏËÉ × ÆÁÊÌ httpd.conf: Include conf/access.conf É Include + conf/srm.conf. äÌÑ ÔÏÇÏ ÞÔÏÂÙ ÂÙÔØ Õ×ÅÒÅÎÎÙÍ × ÔÏÍ, ÞÔÏ + Apache ÓÞÉÔÙ×ÁÅÔ ËÏÎÆÉÇÕÒÁÃÉÏÎÎÙÅ ÆÁÊÌÙ ÉÍÅÎÎÏ × ÔÏÍ ÐÏÒÑÄËÅ, + ËÏÔÏÒÙÊ ÂÙÌ ÐÒÅÄÕÓÍÏÔÒÅÎ ÓÔÁÒÙÍÉ ÄÉÒÅËÔÉ×ÁÍÉ, ÎÁÄÏ ÐÏÍÅÓÔÉÔØ + ÄÉÒÅËÔÉ×Ù Include × ËÏÎÃÅ ÆÁÊÌÁ httpd.conf, ÐÒÉÞ£Í + ÓÐÅÒ×Á ÔÕ, ÞÔÏ ×ËÌÀÞÁÅÔ srm.conf, Á ÚÁÔÅÍ ÔÕ, ÞÔÏ + ×ËÌÀÞÁÅÔ access.conf.
    • + +
    • äÉÒÅËÔÉ×Ù BindAddress É Port + ÂÏÌÅÅ ÎÅ ÓÕÝÅÓÔ×ÕÀÔ. üË×É×ÁÌÅÎÔÎÁÑ ÆÕÎËÃÉÏÎÁÌØÎÏÓÔØ ÐÒÅÄÏÓÔÁ×ÌÑÅÔÓÑ + ÂÏÌÅÅ ÇÉÂËÏÊ ÄÉÒÅËÔÉ×ÏÊ Listen. +
    • + +
    • ÷ Apache 1.3 ÄÉÒÅËÔÉ×Á Port + ÉÓÐÏÌØÚÏ×ÁÌÁÓØ, ËÒÏÍÅ ×ÓÅÇÏ ÐÒÏÞÅÇÏ, ÄÌÑ ÔÏÇÏ ÞÔÏÂÙ ÓÅÒ×ÅÒ + ÍÏÇ ÆÏÒÍÉÒÏ×ÁÔØ ÐÒÁ×ÉÌØÎÙÅ ÓÓÙÌËÉ ÎÁ ÓÁÍÏÇÏ ÓÅÂÑ. ÷ Apache 2.0 ÄÌÑ + ÔÅÈ ÖÅ ÃÅÌÅÊ ÓÌÕÖÉÔ ÎÏ×ÙÊ ÓÉÎÔÁËÓÉÓ ÄÉÒÅËÔÉ×Ù ServerName: ÏÎ ÂÙÌ ÉÚÍÅΣΠÔÁËÉÍ ÏÂÒÁÚÏÍ, ÞÔÏ ÔÅÐÅÒØ + ÉÍÑ ÈÏÓÔÁ É ÎÏÍÅÒ ÐÏÒÔÁ ÍÏÖÎÏ ÕËÁÚÙ×ÁÔØ × ÏÄÎÏÊ ÜÔÏÊ ÄÉÒÅËÔÉ×Å.
    • + +
    • äÉÒÅËÔÉ×Á ServerType ÂÏÌÅÅ ÎÅ ÓÕÝÅÓÔ×ÕÅÔ. + íÅÔÏÄ ÏÂÒÁÂÏÔËÉ ÚÁÐÒÏÓÏ× ÔÅÐÅÒØ ÏÐÒÅÄÅÌÑÅÔÓÑ ÐÏÓÒÅÄÓÔ×ÏÍ + ×ÙÂÏÒÁ íð-ÍÏÄÕÌÑ. ÷ ÎÁÓÔÏÑÝÅÅ ×ÒÅÍÑ ÎÅÔ ÔÁËÏÇÏ íð-ÍÏÄÕÌÑ, + ËÏÔÏÒÙÊ ÍÏÇ ÂÙ ÚÁÐÕÓËÁÔØÓÑ ÐÏÓÒÅÄÓÔ×ÏÍ ÄÅÍÏÎÁ inetd.
    • + +
    • íÏÄÕÌÉ mod_log_agent É mod_log_referer, ËÏÔÏÒÙÅ ÐÒÅÄÏÓÔÁ×ÌÑÌÉ + ÔÁËÉÅ ÄÉÒÅËÔÉ×Ù, ËÁË AgentLog, RefererLog + É RefererIgnore, ÂÙÌÉ ÕÂÒÁÎÙ. ÷ÅÄÅÎÉÅ ÖÕÒÎÁÌÁ ÁÇÅÎÔÏ× + ÐÏÌØÚÏ×ÁÔÅÌÅÊ (agent logs) É ÏÔÐÒÁ×ÉÔÅÌÅÊ (referer logs) ÐÏ-ÐÒÅÖÎÅÍÕ + ×ÏÚÍÏÖÎÏ ÐÏÓÒÅÄÓÔ×ÏÍ ÉÓÐÏÌØÚÏ×ÁÎÉÑ ÄÉÒÅËÔÉ×Ù CustomLog ÍÏÄÕÌÑ mod_log_config.
    • + +
    • äÉÒÅËÔÉ×Ù AddModule É + ClearModuleList ÂÏÌÅÅ ÎÅ ÓÕÝÅÓÔ×ÕÀÔ. ïÎÉ ÉÓÐÏÌØÚÏ×ÁÌÉÓØ + ÄÌÑ ÏÂÅÓÐÅÞÅÎÉÑ ÐÒÁ×ÉÌØÎÏÇÏ ÐÏÒÑÄËÁ ÚÁÇÒÕÚËÉ ÍÏÄÕÌÅÊ. îÏ×ÙÊ API ÄÌÑ + Apache 2.0 ÐÏÚ×ÏÌÑÅÔ ÍÏÄÕÌÑÍ ÓÁÍÉÍ ÕËÁÚÙ×ÁÔØ ÐÏÒÑÄÏË ÉÈ ÚÁÇÒÕÚËÉ, ÞÔÏ + ÄÅÌÁÅÔ ÜÔÉ ÄÉÒÅËÔÉ×Ù ÎÅÎÕÖÎÙÍÉ.
    • + +
    • äÉÒÅËÔÉ×Á FancyIndexing ÂÙÌÁ ÕÂÒÁÎÁ. åÅ ÆÕÎËÃÉÏÎÁÌØÎÏÓÔØ + ÔÅÐÅÒØ ÏÂÅÓÐÅÞÉ×ÁÅÔÓÑ ÏÐÃÉÅÊ FancyIndexing × ÄÉÒÅËÔÉ×Å IndexOptions
    • + +
    • áÌÇÏÒÉÔÍÙ ËÏÎÔÅÎÔÎÏÊ ÎÅÇÏÃÉÁÃÉÉ (content-negotiation), + ÒÅÁÌÉÚÕÅÍÙÅ ÍÏÄÕÌÅÍ mod_negotiation, + ÓÔÁÌÉ ÂÏÌÅÅ ÓÔÒÏÇÉÍÉ × ÔÏÊ ÞÁÓÔÉ, ÇÄÅ ÏÐÒÅÄÅÌÑÀÔÓÑ ÆÁÊÌÙ ÐÏ ÕÍÏÌÞÁÎÉÀ. + ôÅÐÅÒØ ÜÔÉ ÁÌÇÏÒÉÔÍÙ ÂÕÄÕÔ ×ÙÂÉÒÁÔØ ÆÁÊÌÙ ÔÏÌØËÏ ÉÚ ÓÐÉÓËÁ + ÄÏÓÔÕÐÎÙÈ (negotiable) ÆÁÊÌÏ×. óÔÁÒÏÅ ÐÏ×ÅÄÅÎÉÅ ÍÏÖÅÔ + ÂÙÔØ ×ÏÓÓÔÁÎÏ×ÌÅÎÏ ÄÉÒÅËÔÉ×ÏÊ MultiviewsMatch.
    • + +
    • (ÎÁÞÉÎÁÑ Ó ×ÅÒÓÉÉ 2.0.51) +

      æÕÎËÃÉÏÎÁÌØÎÏÓÔØ ÄÉÒÅËÔÉ×Ù ErrorHeader ÂÙÌÁ + ÐÅÒÅÄÁÎÁ ÄÉÒÅËÔÉ×Å Header, + ÐÏÔÏÍÕ ÞÔÏ ÐÒÅÖÎÅÅ ÎÁÚ×ÁÎÉÅ ÄÉÒÅËÔÉ×Ù ÂÙÌÏ ÎÅËÏÒÒÅËÔÎÏ. + ôÅÐÅÒØ ÎÅÏÂÈÏÄÉÍÏ ÐÉÓÁÔØ

      + +

      + Header always set foo bar +

      + +

      ÞÔÏÂÙ ÐÏÌÕÞÉÔØ ÖÅÌÁÅÍÙÊ ÒÅÚÕÌØÔÁÔ.

    • +
    +
    top
    +
    +

    äÒÕÇÉÅ ÉÚÍÅÎÅÎÉÑ

    + + +
      +
    • íÏÄÕÌØ mod_auth_digest, ËÏÔÏÒÙÊ ÉÍÅÌ ÜËÓÐÅÒÉÍÅÎÔÁÌØÎÙÊ ÓÔÁÔÕÓ × + Apache 1.3, ÔÅÐÅÒØ Ñ×ÌÑÅÔÓÑ ÓÔÁÎÄÁÒÔÎÙÍ ÍÏÄÕÌÅÍ.
    • + +
    • íÏÄÕÌØ mod_mmap_static, ËÏÔÏÒÙÊ ÉÍÅÌ ÜËÓÐÅÒÉÍÅÎÔÁÌØÎÙÊ ÓÔÁÔÕÓ × + Apache 1.3, ÚÁÍÅΣΠÍÏÄÕÌÅÍ mod_file_cache.
    • + +
    • ïÒÇÁÎÉÚÁÃÉÑ ÄÉÓÔÒÉÂÕÔÉ×Á ÐÏÌÎÏÓÔØÀ ÉÚÍÅÎÅÎÁ É ÔÅÐÅÒØ + ÂÏÌÅÅ ÎÅ ÓÏÄÅÒÖÉÔ ÎÅÚÁ×ÉÓÉÍÏÇÏ ËÁÔÁÌÏÇÁ src. ÷ÍÅÓÔÏ ÜÔÏÇÏ + ÉÓÈÏÄÎÙÅ ËÏÄÙ ÌÏÇÉÞÅÓËÉ ÏÒÇÁÎÉÚÏ×ÁÎÙ × ÏÓÎÏ×ÎÏÍ ËÁÔÁÌÏÇÅ ÄÉÓÔÒÉÂÕÔÉ×Á, Á + ÕÓÔÁÎÏ×ËÁ ÓËÏÍÐÉÌÉÒÏ×ÁÎÎÏÇÏ ÓÅÒ×ÅÒÁ ÐÒÏÉÚ×ÏÄÉÔÓÑ × ÏÔÄÅÌØÎÙÊ ËÁÔÁÌÏÇ.
    • +
    +
    top
    +
    +

    íÏÄÕÌÉ ÓÔÏÒÏÎÎÉÈ ÒÁÚÒÁÂÏÔÞÉËÏ×

    + + +

    úÎÁÞÉÔÅÌØÎÙÅ ÉÚÍÅÎÅÎÉÑ ÂÙÌÉ ×ÎÅÓÅÎÙ × API ÄÌÑ Apache 2.0. + óÕÝÅÓÔ×ÕÀÝÉÅ ÍÏÄÕÌÉ, ÎÁÐÉÓÁÎÎÙÅ Ó ÉÓÐÏÌØÚÏ×ÁÎÉÅÍ Apache 1.3 API, + ÎÅ ÂÕÄÕÔ ÒÁÂÏÔÁÔØ ÐÏÄ Apache 2.0, ÅÓÌÉ ÎÅ ×ÎÅÓÔÉ + × ÎÉÈ ÎÅÏÂÈÏÄÉÍÙÅ ÉÚÍÅÎÅÎÉÑ. âÏÌÅÅ ÐÏÄÒÏÂÎÁÑ ÉÎÆÏÒÍÁÃÉÑ ÐÏ ÜÔÏÍÕ ÐÏ×ÏÄÕ + ÄÏÓÔÕÐÎÁ × ÄÏËÕÍÅÎÔÁÃÉÉ ÄÌÑ ÒÁÚÒÁÂÏÔÞÉËÏ×.

    +
    +
    +

    äÏÓÔÕÐÎÙÅ ÑÚÙËÉ:  de  | + en  | + es  | + fr  | + ja  | + ko  | + ru 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/urlmapping.html b/rubbos/app/httpd-2.0.64/docs/manual/urlmapping.html new file mode 100644 index 00000000..d5b6507f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/urlmapping.html @@ -0,0 +1,17 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: urlmapping.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: urlmapping.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: urlmapping.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: urlmapping.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/urlmapping.html.en b/rubbos/app/httpd-2.0.64/docs/manual/urlmapping.html.en new file mode 100644 index 00000000..c989e4b3 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/urlmapping.html.en @@ -0,0 +1,279 @@ + + + +Mapping URLs to Filesystem Locations - Apache HTTP Server + + + + + +
    <-
    +

    Mapping URLs to Filesystem Locations

    +
    +

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

    +
    + +

    This document explains how Apache uses the URL of a request + to determine the filesystem location from which to serve a + file.

    +
    + +
    top
    +
    top
    +
    +

    DocumentRoot

    + +

    In deciding what file to serve for a given request, Apache's + default behavior is to take the URL-Path for the request (the part + of the URL following the hostname and port) and add it to the end + of the DocumentRoot specified + in your configuration files. Therefore, the files and directories + underneath the DocumentRoot + make up the basic document tree which will be visible from the + web.

    + +

    Apache is also capable of Virtual + Hosting, where the server receives requests for more than one + host. In this case, a different DocumentRoot can be specified for each + virtual host, or alternatively, the directives provided by the + module mod_vhost_alias can + be used to dynamically determine the appropriate place from which + to serve content based on the requested IP address or + hostname.

    +
    top
    +
    +

    Files Outside the DocumentRoot

    + +

    There are frequently circumstances where it is necessary to + allow web access to parts of the filesystem that are not strictly + underneath the DocumentRoot. Apache offers several + different ways to accomplish this. On Unix systems, symbolic links + can bring other parts of the filesystem under the DocumentRoot. For security reasons, + Apache will follow symbolic links only if the Options setting for the relevant + directory includes FollowSymLinks or + SymLinksIfOwnerMatch.

    + +

    Alternatively, the Alias directive will map any part + of the filesystem into the web space. For example, with

    + +

    Alias /docs /var/web

    + +

    the URL http://www.example.com/docs/dir/file.html + will be served from /var/web/dir/file.html. The + ScriptAlias directive + works the same way, with the additional effect that all content + located at the target path is treated as CGI scripts.

    + +

    For situations where you require additional flexibility, you + can use the AliasMatch and + ScriptAliasMatch + directives to do powerful regular-expression based matching and + substitution. For example,

    + +

    ScriptAliasMatch ^/~([a-zA-Z0-9]+)/cgi-bin/(.+) + /home/$1/cgi-bin/$2

    + +

    will map a request to + http://example.com/~user/cgi-bin/script.cgi to the + path /home/user/cgi-bin/script.cgi and will treat + the resulting file as a CGI script.

    +
    top
    +
    +

    User Directories

    + +

    Traditionally on Unix systems, the home directory of a + particular user can be referred to as + ~user/. The module mod_userdir + extends this idea to the web by allowing files under each user's + home directory to be accessed using URLs such as the + following.

    + +

    http://www.example.com/~user/file.html

    + +

    For security reasons, it is inappropriate to give direct + access to a user's home directory from the web. Therefore, the + UserDir directive + specifies a directory underneath the user's home directory + where web files are located. Using the default setting of + Userdir public_html, the above URL maps to a file + at a directory like + /home/user/public_html/file.html where + /home/user/ is the user's home directory as + specified in /etc/passwd.

    + +

    There are also several other forms of the + Userdir directive which you can use on systems + where /etc/passwd does not contain the location of + the home directory.

    + +

    Some people find the "~" symbol (which is often encoded on the + web as %7e) to be awkward and prefer to use an + alternate string to represent user directories. This functionality + is not supported by mod_userdir. However, if users' home + directories are structured in a regular way, then it is possible + to use the AliasMatch + directive to achieve the desired effect. For example, to make + http://www.example.com/upages/user/file.html map to + /home/user/public_html/file.html, use the following + AliasMatch directive:

    + +

    AliasMatch ^/upages/([a-zA-Z0-9]+)/?(.*) + /home/$1/public_html/$2

    +
    top
    +
    +

    URL Redirection

    + +

    The configuration directives discussed in the above sections + tell Apache to get content from a specific place in the filesystem + and return it to the client. Sometimes, it is desirable instead to + inform the client that the requested content is located at a + different URL, and instruct the client to make a new request with + the new URL. This is called redirection and is + implemented by the Redirect directive. For example, if + the contents of the directory /foo/ under the + DocumentRoot are moved + to the new directory /bar/, you can instruct clients + to request the content at the new location as follows:

    + +

    Redirect permanent /foo/ + http://www.example.com/bar/

    + +

    This will redirect any URL-Path starting in + /foo/ to the same URL path on the + www.example.com server with /bar/ + substituted for /foo/. You can redirect clients to + any server, not only the origin server.

    + +

    Apache also provides a RedirectMatch directive for more + complicated rewriting problems. For example, to redirect requests + for the site home page to a different site, but leave all other + requests alone, use the following configuration:

    + +

    RedirectMatch permanent ^/$ + http://www.example.com/startpage.html

    + +

    Alternatively, to temporarily redirect all pages on one site + to a particular page on another site, use the following:

    + +

    RedirectMatch temp .* + http://othersite.example.com/startpage.html

    +
    top
    +
    +

    Reverse Proxy

    + +

    Apache also allows you to bring remote documents into the URL space +of the local server. This technique is called reverse +proxying because the web server acts like a proxy server by +fetching the documents from a remote server and returning them to the +client. It is different from normal proxying because, to the client, +it appears the documents originate at the reverse proxy server.

    + +

    In the following example, when clients request documents under the +/foo/ directory, the server fetches those documents from +the /bar/ directory on internal.example.com +and returns them to the client as if they were from the local +server.

    + +

    +ProxyPass /foo/ http://internal.example.com/bar/
    +ProxyPassReverse /foo/ http://internal.example.com/bar/ +

    + +

    The ProxyPass configures +the server to fetch the appropriate documents, while the +ProxyPassReverse +directive rewrites redirects originating at +internal.example.com so that they target the appropriate +directory on the local server. It is important to note, however, that +links inside the documents will not be rewritten. So any absolute +links on internal.example.com will result in the client +breaking out of the proxy server and requesting directly from +internal.example.com.

    +
    top
    +
    +

    Rewriting Engine

    + +

    When even more powerful substitution is required, the rewriting + engine provided by mod_rewrite + can be useful. The directives provided by this module use + characteristics of the request such as browser type or source IP + address in deciding from where to serve content. In addition, + mod_rewrite can use external database files or programs to + determine how to handle a request. The rewriting engine is capable + of performing all three types of mappings discussed above: + internal redirects (aliases), external redirects, and proxying. + Many practical examples employing mod_rewrite are discussed in the + URL Rewriting Guide.

    +
    top
    +
    +

    File Not Found

    + +

    Inevitably, URLs will be requested for which no matching + file can be found in the filesystem. This can happen for + several reasons. In some cases, it can be a result of moving + documents from one location to another. In this case, it is + best to use URL redirection to inform + clients of the new location of the resource. In this way, you + can assure that old bookmarks and links will continue to work, + even though the resource is at a new location.

    + +

    Another common cause of "File Not Found" errors is + accidental mistyping of URLs, either directly in the browser, + or in HTML links. Apache provides the module + mod_speling (sic) to help with + this problem. When this module is activated, it will intercept + "File Not Found" errors and look for a resource with a similar + filename. If one such file is found, mod_speling will send an + HTTP redirect to the client informing it of the correct + location. If several "close" files are found, a list of + available alternatives will be presented to the client.

    + +

    An especially useful feature of mod_speling, is that it will + compare filenames without respect to case. This can help + systems where users are unaware of the case-sensitive nature of + URLs and the unix filesystem. But using mod_speling for + anything more than the occasional URL correction can place + additional load on the server, since each "incorrect" request + is followed by a URL redirection and a new request from the + client.

    + +

    If all attempts to locate the content fail, Apache returns + an error page with HTTP status code 404 (file not found). The + appearance of this page is controlled with the + ErrorDocument directive + and can be customized in a flexible manner as discussed in the + Custom error responses and International Server Error + Responses documents.

    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/urlmapping.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/urlmapping.html.ja.utf8 new file mode 100644 index 00000000..f241e254 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/urlmapping.html.ja.utf8 @@ -0,0 +1,279 @@ + + + +URL からファイルシステム上の位置へのマップ - Apache HTTP サーバ + + + + + +
    <-
    +

    URL からファイルシステム上の位置へのマップ

    +
    +

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

    +
    + +

    この文書は Apache がリクエストの URL から送信するファイルの + ファイルシステム上の位置を決定する方法を説明します。

    +
    + +
    top
    +
    top
    +
    +

    DocumentRoot

    + +

    リクエストに対してどのファイルを送信するかを決定するときの + Apache のデフォルトの動作は、リクエストの URL-Path (URL のホスト名と + ポート番号の後に続く部分) を取り出して設定ファイルで指定されている + DocumentRoot + の最後に追加する、というものです。ですから、 + DocumentRoot + の下のディレクトリやファイルがウェブから見える基本のドキュメントの木構造を + なします。

    + +

    Apache にはサーバが複数のホストへのリクエストを受け取る + バーチャルホスト の機能もあります。 + この場合、それぞれのバーチャルホストに対して違う + DocumentRoot + を指定することができます。また、mod_vhost_alias + モジュールにより提供されるディレクティブを使って、 + 送信するためのコンテンツの場所をリクエストされた IP + アドレスやホスト名から動的に決めることもできます。

    +
    top
    +
    +

    DocumentRoot 外のファイル

    + +

    ファイルシステム上の、 + 厳密には DocumentRoot + の下にはない部分へのウェブアクセスを許可する必要がある + 場合がよくあります。Apache はこのために複数の方法を用意しています。 + Unix システムでは、ファイルシステムの他の部分をシンボリックリンクを + 使って DocumentRoot + の下に持ってくることができます。セキュリティ上の理由により、 + Apache は該当するディレクトリの + Options の設定に + FollowSymLinks か SymLinksIfOwnerMatch が + ある場合にのみシンボリックリンクをたどります。

    + +

    代わりの方法として、Alias + ディレクティブを使ってファイルシステムの任意の部分をウェブの空間に + マップできます。たとえば、

    + +

    Alias /docs /var/web

    + +

    という設定のときは、URL + http://www.example.com/docs/dir/file.html には + /var/web/dir/file.html が送信されます。 + ScriptAlias も、 + 対象となっているパスが CGI スクリプトとして扱われるという追加の + 効果以外は同じように動作します。

    + +

    もっと柔軟な設定が必要な状況では、 + AliasMatch ディレクティブや + ScriptAliasMatch ディレクティブ + を使って強力な正規表現に基づいたマッチと置換を行なうことができます。 + たとえば、

    + +

    ScriptAliasMatch ^/~([a-zA-Z0-9]+)/cgi-bin/(.+) + /home/$1/cgi-bin/$2

    + +

    は http://example.com/~user/cgi-bin/script.cgi への + リクエストを /home/user/cgi-bin/script.cgi というパスへ + マップし、このマップの結果としてのファイルを CGI スクリプトとして + 扱います。

    +
    top
    +
    +

    ユーザディレクトリ

    + +

    伝統的に Unix システムではユーザ user のホームディレクトリを + ~user/ として参照できます。mod_userdir + モジュールはこの概念をウェブに拡張して、 + それぞれのユーザのホームディレクトリのファイルを + 以下のような URL を使ってアクセスできるようにします。

    + +

    http://www.example.com/~user/file.html

    + +

    セキュリティの観点から、ウェブからユーザのホームディレクトリへ + 直接アクセスできるようにすることは適切ではありません。ですから、 + UserDir ディレクティブには + ユーザのホームディレクトリの下の、ウェブファイルの + 置かれているディレクトリを指定します。デフォルトの設定の + Userdir public_html を使うと、上の URL は + /home/user/public_html/file.html というようなファイルに + マップされます。ここで、/home/user/ は + /etc/passwd で指定されているユーザのホームディレクトリです。

    + +

    Userdir には、 + /etc/passwd にホームディレクトリの位置が書かれていない + システムでも使うことのできる他の形式もあります。

    + +

    中にはシンボル "~" (%7e のように符号化されることが多い) + を格好が悪いと思って、ユーザのディレクトリを表すために別の文字列の + 使用を好む人がいます。mod_userdir はこの機能をサポートしていません。 + しかし、ユーザのホームディレクトリが規則的な構成のときは、 + AliasMatch を使って望みの + 効果を達成することができます。たとえば、 + http://www.example.com/upages/user/file.html が + /home/user/public_html/file.html にマップされるようにするには、 + 以下のように AliasMatch ディレクティブを使います:

    + +

    AliasMatch ^/upages/([a-zA-Z0-9]+)/?(.*) + /home/$1/public_html/$2

    +
    top
    +
    +

    URL リダイレクション

    + +

    上の節で説明した設定用のディレクティブは Apache に + ファイルシステムの特定の場所からコンテンツを取ってきて + クライアントに送り返すようにします。ときには、その代わりに + クライアントにリクエストされたコンテンツは別の URL にあることを + 知らせて、クライアントが新しい URL へ新しいリクエストを行なうように + する方が望ましいことがあります。これはリダイレクションと + 呼ばれていて、Redirect + ディレクティブにより実装されています。たとえば、 + DocumentRoot の下のディレクトリ + /foo/ が新しいディレクトリ /bar/ に移動したときは、 + 以下のようにしてクライアントが新しい場所のコンテンツをリクエストするように + 指示することができます:

    + +

    Redirect permanent /foo/ + http://www.example.com/bar/

    + +

    これは、/foo/ で始まるすべての URL-Path を、 + www.example.com サーバの /bar/ が + /foo/ に置換されたものにリダイレクトします。 + サーバは自分自身のサーバだけでなく、どのサーバにでもクライアントを + リダイレクトすることができます。

    + +

    Apache はより複雑な書き換えの問題のために、 + RedirectMatch ディレクティブを + 提供しています。たとえば、サイトのホームページを違うサイトにリダイレクト + するけれど、他のリクエストはそのまま扱う、というときは以下の設定を + 使います:

    + +

    RedirectMatch permanent ^/$ + http://www.example.com/startpage.html

    + +

    あるいは、一時的にサイトのすべてのページを他のサイトの特定の + ページへリダイレクトするときは、以下を使います:

    + +

    RedirectMatch temp .* + http://othersite.example.com/startpage.html

    +
    top
    +
    +

    リバースプロキシ

    + +

    Apache は遠隔地にあるドキュメントをローカルのサーバの URL 空間に +持ってくることもできます。この手法はリバースプロキシと呼ばれています。 +ウェブサーバが遠隔地のドキュメントを取得してクライアントに送り返すのが +プロキシサーバの動作のように見えるからです。クライアントにはドキュメントが +リバースプロキシサーバから送られてきているように見える点が通常の +プロキシとは異なります。

    + +

    次の例では、クライアントが /foo/ ディレクトリの下にある +ドキュメントをリクエストすると、サーバが internal.example.com の +/bar/ ディレクトリから取得して、さもローカルサーバからの +ドキュメントのようにしてクライアントに返します。

    + +

    +ProxyPass /foo/ http://internal.example.com/bar/
    +ProxyPassReverse /foo/ http://internal.example.com/bar/ +

    + +

    ProxyPass ディレクティブは +サーバが適切なドキュメントを取得するように設定し、 +ProxyPassReverse ディレクティブは +internal.example.com からのリダイレクトがローカルサーバの +適切なディレクトリを指すように書き換えます。ただし、ドキュメントの中の +リンクは書き換えられない、ということは知っておいてください。 +ですから、internal.example.com への絶対パスによるリンクでは、 +クライアントがプロキシサーバを抜け出して internal.example.com に +直接リクエストを送る、ということになります。

    +
    top
    +
    +

    リライトエンジン

    + +

    より一層強力な置換が必要なときは、mod_rewrite + が提供するリライトエンジンが役に立つでしょう。 + このモジュールにより提供されるディレクティブは + ブラウザの種類、リクエスト元の IP アドレスなどのリクエストの特徴を + 使って送り返すコンテンツの場所を決めます。さらに、mod_rewrite + は外部のデータベースファイルやプログラムを使ってリクエストの扱い方を + 決めることもできます。リライトエンジンは上で挙げられている三つのマッピング + すべてを行なうことができます: 内部のリダイレクト (エイリアス)、 + 外部のリダイレクト、プロキシです。mod_rewrite を使う多くの実用的な例は + URL リライトガイド + で説明されています。

    +
    top
    +
    +

    File Not Found

    + +

    必ず、リクエストされた URL に対応するファイルがファイルシステムに + 無いという場合が発生します。これが起こるのにはいくつかの理由があります。 + 場合によっては、ドキュメントを別の場所に移動した結果であることがあります。 + この場合は、クライアントにリソースの新しい位置を知らせるために + URL リダイレクションを使うのが最善の方法です。 + そうすることによって、リソースは新しい位置に移動しているけれども、 + 古いブックマークやリンクが動作し続けるようにすることができます。

    + +

    "File Not Found" エラーのもう一つのよくある理由は、 + ブラウザへの直接入力や HTML リンクからの偶発的な URL の入力間違いです。 + Apache はこの問題を改善するために、mod_speling + モジュール (意図的な綴り間違い) + (訳注: 正しくは spelling) を提供しています。このモジュールが + 使用されているときは、"File Not Found" エラーを横取りして、 + 似たファイル名のリソースを探します。もし一つだけ見つかった場合は + mod_speling はクライアントに正しい位置を知らせるために HTTP リダイレクトを + 送ります。もし複数の「近い」ファイルが見つかった場合は、それら + 代替となりえるもののリストがクライアントに表示されます。

    + +

    mod_speling の非常に有用な機能は、大文字小文字を区別せずに + ファイル名を比較するものです。これは URL と unix の + ファイルシステムが両方とも大文字小文字を区別するものである、 + ということをユーザが知らないシステムで役に立ちます。ただし、 + 時折の URL 訂正程度で済まず、mod_speling をより多く使用すると、サーバに + さらなる負荷がかかります。すべての「正しくない」リクエストの後に + URL のリダイレクトとクライアントからの新しいリクエストがくることに + なりますから。

    + +

    コンテンツの位置を決めようとするすべての試みが失敗すると、 + Apache は、HTTP ステータスコード 404 (file not found) と共に + エラーページを返します。このエラーページの外観は + ErrorDocument + ディレクティブで制御され、 + カスタムエラーレスポンス と + 国際化サーバエラーレスポンス で + 説明されているように、柔軟な設定を行なうことができます。

    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/urlmapping.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/urlmapping.html.ko.euc-kr new file mode 100644 index 00000000..28c524ee --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/urlmapping.html.ko.euc-kr @@ -0,0 +1,244 @@ + + + +URLÀ» ÆÄÀϽýºÅÛ À§Ä¡·Î ´ëÀÀÇϱâ - Apache HTTP Server + + + + + +
    <-
    +

    URLÀ» ÆÄÀϽýºÅÛ À§Ä¡·Î ´ëÀÀÇϱâ

    +
    +

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

    +
    + +

    ÀÌ ¹®¼­´Â ¿äûÀÇ URLÀ» °¡Áö°í ¾ÆÆÄÄ¡°¡ ¾î¶»°Ô ¼­ºñ½ºÇÒ + ÆÄÀÏÀÇ ÆÄÀϽýºÅÛ»ó À§Ä¡¸¦ ã´ÂÁö ¼³¸íÇÑ´Ù.

    +
    + +
    top
    +
    top
    +
    +

    DocumentRoot

    + +

    ¿äûÀ» ¹ÞÀº ¾ÆÆÄÄ¡´Â ¾î¶² ÆÄÀÏÀ» ¼­ºñ½ºÇÒÁö °áÁ¤ÇϱâÀ§ÇØ + ±âº»ÀûÀ¸·Î ¿äûÀÇ URL-°æ·Î(URL¿¡¼­ È£½ºÆ®¸í°ú Æ÷Æ® µÚ¿¡ + ³ª¿À´Â ºÎºÐ)¸¦ ¼³Á¤ÆÄÀÏ¿¡¼­ ÁöÁ¤ÇÑ DocumentRoot µÚ¿¡ ºÙÀδÙ. ±×·¡¼­ + DocumentRoot ¾Æ·¡ÀÖ´Â + ÆÄÀÏ°ú µð·ºÅ丮µéÀº À¥¿¡¼­ º¸°ÔµÉ ±âº»ÀûÀÎ ³»¿ëÀÌ´Ù.

    +
    top
    +
    +

    DocumentRoot ¹Û¿¡ ÀÖ´Â ÆÄÀϵé

    + +

    Á¾Á¾ ÆÄÀϽýºÅÛ¿¡¼­ DocumentRoot ¾Æ·¡ ÀÖÁö¾ÊÀº ºÎºÐÀ» + À¥¿¡¼­ Á¢±ÙÇÒ ÇÊ¿ä°¡ ÀÖ´Ù. ¾ÆÆÄÄ¡´Â ÀÌ °æ¿ì ¿©·¯°¡Áö ¹æ¹ýÀ» + »ç¿ëÇÒ ¼ö ÀÖ´Ù. À¯´Ð½º ½Ã½ºÅÛ¿¡¼­ ½Éº¼¸µÅ©¸¦ »ç¿ëÇÏ¿© + ÆÄÀϽýºÅÛÀÇ ´Ù¸¥ ºÎºÐÀ» DocumentRoot ¾Æ·¡¿¡ µÑ ¼ö ÀÖ´Ù. + º¸¾ÈÀ» À§ÇØ ¾ÆÆÄÄ¡´Â ÇØ´ç µð·ºÅ丮ÀÇ Options ¼³Á¤¿¡ + FollowSymLinks³ª + SymLinksIfOwnerMatch°¡ ÀÖ´Â °æ¿ì¿¡¸¸ ½Éº¼¸µÅ©¸¦ + µû¶ó°£´Ù.

    + +

    ¶Ç, Alias + Áö½Ã¾î´Â ÆÄÀϽýºÅÛÀÇ Æ¯Á¤ ºÎºÐÀ» À¥°ø°£¿¡ ´ëÀÀÇÑ´Ù. ¿¹¸¦ + µé¾î ´ÙÀ½°ú °°´Ù¸é

    + +

    Alias /docs /var/web

    + +

    URL http://www.example.com/docs/dir/file.htmlÀº + /var/web/dir/file.htmlÀ» °¡Áö°í ¼­ºñ½ºÇÑ´Ù. + ÁöÁ¤ÇÑ °æ·Î¿¡ ÀÖ´Â ¸ðµç ³»¿ëÀ» CGI ½ºÅ©¸³Æ®·Î Ãë±ÞÇÏ´Â °ÍÀ» + Á¦¿ÜÇÏ°í´Â ScriptAlias + Áö½Ã¾îµµ °°Àº ÀÏÀ» ÇÑ´Ù.

    + +

    AliasMatch¿Í + ScriptAliasMatch + Áö½Ã¾îÀÇ °­·ÂÇÑ Á¤±ÔÇ¥Çö½Ä±â¹Ý ´ëÀÀ°ú ´ëÄ¡¸¦ »ç¿ëÇÏ¿© ´õ + À¯¿¬ÇÑ ¼³Á¤ÀÌ °¡´ÉÇÏ´Ù. ¿¹¸¦ µé¾î,

    + +

    ScriptAliasMatch ^/~([a-zA-Z0-9]+)/cgi-bin/(.+) + /home/$1/cgi-bin/$2

    + +

    ´Â http://example.com/~user/cgi-bin/script.cgi·ÎÀÇ + ¿äûÀ» °æ·Î /home/user/cgi-bin/script.cgi·Î + ´ëÀÀÇÏ°í, ÇØ´ç ÆÄÀÏÀ» CGI ½ºÅ©¸³Æ®·Î Ãë±ÞÇÑ´Ù.

    +
    top
    +
    +

    »ç¿ëÀÚ µð·ºÅ丮

    + +

    À¯´Ð½º ½Ã½ºÅÛÀº ÀüÅëÀûÀ¸·Î ƯÁ¤ »ç¿ëÀÚ userÀÇ + Ȩµð·ºÅ丮¸¦ ~user/·Î ÁöĪÇÑ´Ù. + mod_userdir ¸ðµâÀº ÀÌ °³³äÀ» À¥¿¡±îÁö + È®ÀåÇÏ¿©, ´ÙÀ½°ú °°Àº URLÀ» °¡Áö°í °¢ »ç¿ëÀÚ È¨µð·ºÅ丮 + ¾È¿¡ ÀÖ´Â ÆÄÀÏÀ» ¼­ºñ½ºÇÑ´Ù.

    + +

    http://www.example.com/~user/file.html

    + +

    º¸¾È»ó À¥¿¡¼­ »ç¿ëÀÚ È¨µð·ºÅ丮·Î Á÷Á¢ Á¢±ÙÇÒ ¼ö ÀÖÀ¸¸é + ¾ÈµÈ´Ù. ±×·¡¼­ UserDir + Áö½Ã¾î´Â »ç¿ëÀÚ È¨µð·ºÅ丮¿¡¼­ À¥¿ë ÆÄÀϵéÀÌ ÀÖÀ» µð·ºÅ丮¸¦ + ÁöÁ¤ÇÑ´Ù. ±âº» ¼³Á¤ Userdir public_htmlÀ» »ç¿ëÇÏ°í + /home/user/°¡ /etc/passwd¿¡ ÁöÁ¤µÈ + »ç¿ëÀÚ È¨µð·ºÅ丮¶ó¸é, À§ÀÇ URLÀº ÆÄÀÏ + /home/user/public_html/file.html¿¡ ´ëÀÀÇÑ´Ù.

    + +

    ¶Ç, Userdir Áö½Ã¾î´Â /etc/passwd¿¡ + Ȩµð·ºÅ丮ÀÇ À§Ä¡°¡ ÀúÀåµÇÁö¾Ê´Â ½Ã½ºÅÛÀ» À§ÇØ ¿©·¯ ´Ù¸¥ + ÇüŸ¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù.

    + +

    ¾î¶² »ç¶÷Àº (º¸Åë À¥¿¡¼­ %7e·Î ÀÎÄÚµùµÇ´Â) + "~" ±âÈ£°¡ ÀÌ»óÇÏ¿© ´Ù¸¥ ¹æ½ÄÀ¸·Î »ç¿ëÀÚ µð·ºÅ丮¸¦ ³ªÅ¸³»°í + ½Í¾îÇÑ´Ù. ÀÌ ±â´ÉÀº mod_userdirÀÌ Á¦°øÇÏÁö¾Ê´Â´Ù. ±×·¯³ª + »ç¿ëÀÚ È¨µð·ºÅ丮°¡ ±ÔÄ¢ÀûÀÎ ¹æ¹ýÀ¸·Î ±¸¼ºµÇÀÖ´Ù¸é, AliasMatch Áö½Ã¾î¸¦ »ç¿ëÇÏ¿© + ¿øÇÏ´Â È¿°ú¸¦ ¾òÀ» ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î, ´ÙÀ½ÀÇ + AliasMatch Áö½Ã¾î¸¦ »ç¿ëÇϸé + http://www.example.com/upages/user/file.htmlÀÌ + /home/user/public_html/file.html¿¡ ´ëÀÀÇÑ´Ù:

    + +

    AliasMatch ^/upages/([a-zA-Z0-9]+)/?(.*) + /home/$1/public_html/$2

    +
    top
    +
    +

    URL ¸®´ÙÀÌ·º¼Ç(Redirection)

    + +

    ¾Õ¿¡¼­ ¼³¸íÇÑ ¼³Á¤ Áö½Ã¾îµéÀº ¾ÆÆÄÄ¡°¡ ÆÄÀϽýºÅÛÀÇ Æ¯Á¤ + Àå¼Ò¿¡ ÀÖ´Â ³»¿ëÀ» Ŭ¶óÀ̾ðÆ®¿¡°Ô º¸³»°Ô ¸¸µç´Ù. ±×·¯³ª + ¶§¶§·Î ¿äûÇÑ ³»¿ëÀÌ ´Ù¸¥ URL¿¡ ÀÖ´Ù°í Ŭ¶óÀ̾ðÆ®¿¡°Ô ¾Ë·ÁÁÖ¾î, + Ŭ¶óÀ̾ðÆ®°¡ »õ·Î ±× URLÀ» ¿äûÇϵµ·Ï ¸¸µå´Â °ÍÀÌ ÁÁÀ» ¶§°¡ + ÀÖ´Ù. À̸¦ ¸®´ÙÀÌ·º¼Ç(redirection)À̶ó°í Çϸç, + Redirect Áö½Ã¾î¸¦ + »ç¿ëÇÑ´Ù. ¿¹¸¦ µé¾î, DocumentRoot ¾Æ·¡ /foo/ + µð·ºÅ丮ÀÇ ³»¿ëÀ» »õ·Î /bar/ µð·ºÅ丮·Î ¿Å°å´Ù¸é + ´ÙÀ½°ú °°ÀÌ Å¬¶óÀ̾ðÆ®°¡ »õ·Î¿î À§Ä¡¸¦ ¿äûÇϵµ·Ï ÇÑ´Ù:

    + +

    Redirect permanent /foo/ + http://www.example.com/bar/

    + +

    ±×·¯¸é www.example.com ¼­¹öÀÇ /foo/·Î + ½ÃÀÛÇÏ´Â URL-°æ·Î´Â /foo/¸¦ /bar/·Î + ¹Ù²Û URL·Î ¸®´ÙÀÌ·º¼ÇµÈ´Ù. Ŭ¶óÀ̾ðÆ®¸¦ ¿ø·¡ ¼­¹ö¿Ü¿¡ ¾î¶² + ´Ù¸¥ ¼­¹ö·Îµµ ¸®´ÙÀÌ·º¼ÇÇÒ ¼ö ÀÖ´Ù.

    + +

    ¶Ç, ¾ÆÆÄÄ¡´Â ´õ º¹ÀâÇÑ ÀçÀÛ¼º ¹®Á¦¸¦ À§ÇØ + RedirectMatch + Áö½Ã¾î¸¦ Á¦°øÇÑ´Ù. ¿¹¸¦ µé¾î, ´Ù¸¥ ¿äûÀº ±×´ë·Î µÎ°í »çÀÌÆ® + ȨÆäÀÌÁö¿¡ ´ëÇÑ ¿äû¸¸À» ´Ù¸¥ »çÀÌÆ®·Î ¸®´ÙÀÌ·º¼ÇÇÏ·Á¸é:

    + +

    RedirectMatch permanent ^/$ + http://www.example.com/startpage.html

    + +

    Àӽ÷Π»çÀÌÆ®ÀÇ ¸ðµç ÆäÀÌÁö¸¦ ´Ù¸¥ »çÀÌÆ®ÀÇ Æ¯Á¤ ÆäÀÌÁö·Î + ¸®´ÙÀÌ·º¼ÇÇÏ·Á¸é:

    + +

    RedirectMatch temp .* + http://othersite.example.com/startpage.html

    +
    top
    +
    +

    ¿ªÇÁ·Ï½Ã(Reverse Proxy)

    + +

    ¾ÆÆÄÄ¡´Â ´Ù¸¥ ¼­¹ö¿¡ ÀÖ´Â ¹®¼­¸¦ ¼­¹öÀÇ URL °ø°£À¸·Î °¡Á®¿Ã +¼ö ÀÖ´Ù. ÀÌ °æ¿ì À¥¼­¹ö°¡ ¿ø°Ý ¼­¹ö¿¡¼­ ¹®¼­¸¦ °¡Á®¿Í¼­ +Ŭ¶óÀ̾ðÆ®¿¡°Ô Àü´ÞÇÏ´Â ÇÁ·Ï½Ã ¼­¹ö¿Í °°ÀÌ µ¿ÀÛÇϱ⶧¹®¿¡ ÀÌ·± +¹æ¹ýÀ» ¿ªÇÁ·Ï½Ã(reverse proxying)¶ó°í ÇÑ´Ù. Ŭ¶óÀ̾ðÆ®ÀÇ +ÀÔÀå¿¡¼­ ¿ªÇÁ·Ï½Ã ¼­¹ö°¡ ¹®¼­¸¦ º¸³»ÁÖ´Â °Íó·³ º¸À̹ǷΠÀÏ¹Ý +ÇÁ·Ï½Ã¿Í´Â ´Ù¸£´Ù.

    + +

    ¾Æ·¡ ¼³Á¤¿¡¼­ Ŭ¶óÀ̾ðÆ®°¡ /foo/¿¡ ÀÖ´Â ¹®¼­¸¦ +¿äûÇϸé, ¼­¹ö´Â internal.example.comÀÇ +/bar/ µð·ºÅ丮¿¡¼­ ¹®¼­¸¦ °¡Á®¿Í¼­ ¹®¼­°¡ ¸¶Ä¡ +¼­¹ö¿¡ ÀÖ¾ú´ø °Íó·³ Ŭ¶óÀ̾ðÆ®¿¡°Ô º¸³½´Ù.

    + +

    +ProxyPass /foo/ http://internal.example.com/bar/
    +ProxyPassReverse /foo/ http://internal.example.com/bar/ +

    + +

    ProxyPass´Â ¼­¹ö°¡ +ÀûÀýÇÑ ¹®¼­¸¦ °¡Á®¿Àµµ·Ï ¼³Á¤Çϸç, ProxyPassReverse Áö½Ã¾î´Â +internal.example.comÀÌ º¸³»´Â ¸®´ÙÀÌ·º¼ÇÀ» ÀçÀÛ¼ºÇÏ¿© +¸®´ÙÀÌ·º¼ÇÀÌ ÇöÀç ¼­¹öÀÇ ÀûÀýÇÑ µð·ºÅ丮¸¦ °¡¸®Å°µµ·Ï ÇÑ´Ù. +±×·¯³ª ¹®¼­ ¾È¿¡ ÀÖ´Â ¸µÅ©´Â ÀçÀÛ¼ºÇÏÁö ¾ÊÀ½À» ÁÖÀÇÇ϶ó. +internal.example.com¿¡ ´ëÇÑ Àý´ë¸µÅ©´Â Ŭ¶óÀ̾ðÆ®°¡ +ÇÁ·Ï½Ã¼­¹ö°¡ ¾Æ´Ï¶ó internal.example.comÀ¸·Î Á÷Á¢ +¿äûÇÏ°Ô ÇÑ´Ù.

    +
    top
    +
    +

    ÀçÀÛ¼º ¿£Áø (Rewriting Engine)

    + +

    ´õ °­·ÂÇÑ Ä¡È¯ÀÌ ÇÊ¿äÇÒ¶§ mod_rewriteÀÇ + ÀçÀÛ¼º ¿£ÁøÀÌ µµ¿òÀÌ µÈ´Ù. ÀÌ ¸ðµâÀÇ Áö½Ã¾î´Â ºê¶ó¿ìÀú Á¾·ù³ª + Ŭ¶óÀ̾ðÆ®ÀÇ IP ÁÖ¼Ò µî ¿äûÀÇ Æ¯Â¡À» °¡Áö°í ¾îµð¿¡ ÀÖ´Â + ³»¿ëÀ» ¼­ºñ½ºÇÒÁö °áÁ¤ÇÒ ¼ö ÀÖ´Ù. ¶Ç, mod_rewrite´Â ¿äûÀ» + ¾î¶»°Ô ó¸®ÇÒÁö °áÁ¤ÇϱâÀ§ÇØ ¿ÜºÎ µ¥ÀÌÅͺ£À̽º ÆÄÀÏÀ̳ª + ÇÁ·Î±×·¥À» »ç¿ëÇÒ ¼ö ÀÖ´Ù. ÀçÀÛ¼º ¿£ÁøÀº À§¿¡¼­ ´Ù·é ¼¼ + Á¾·ù ´ëÀÀ, Áï, ³»ºÎ ¸®´ÙÀÌ·º¼Ç (alias), ¿ÜºÎ ¸®´ÙÀÌ·º¼Ç, + ÇÁ·Ï½Ã, ¸ðµÎ¸¦ Áö¿øÇÑ´Ù. mod_rewrite¸¦ »ç¿ëÇÏ´Â ½ÇÁ¦ ¿¹´Â + URL Á¦ÀÛ¼º Áöħ¼­¿¡¼­ + ¼³¸íÇÑ´Ù.

    +
    top
    +
    +

    File Not Found

    + +

    °á±¹ ¿äûÇÑ URL¿¡ ´ëÀÀÇÏ´Â ÆÄÀÏÀ» ÆÄÀϽýºÅÛ¿¡¼­ ãÁö + ¸øÇÑ °æ¿ìÀÌ´Ù. ¿©·¯ °¡Áö ÀÌÀ¯°¡ ÀÖ´Ù. ¾î¶² °æ¿ì ¹®¼­¸¦ + ´Ù¸¥ °÷À¸·Î ¿Å°å±â ¶§¹®ÀÏ ¼ö ÀÖ´Ù. ÀÌ °æ¿ì Ŭ¶óÀ̾ðÆ®¿¡°Ô + URL ¸®´ÙÀÌ·º¼ÇÀ¸·Î ÀÚ¿øÀÇ »õ·Î¿î + À§Ä¡¸¦ ¾Ë·ÁÁÖ´Â ¹æ¹ýÀÌ Á¦ÀÏ ÁÁ´Ù. ±×·¯¸é ÀÚ¿øÀ» ¿Å°Üµµ + ¿À·¡µÈ ºÏ¸¶Å©³ª ¸µÅ©°¡ °è¼Ó À¯È¿ÇÏ´Ù.

    + +

    "File Not Found" ¿À·ùÀÇ ´Ù¸¥ ÀϹÝÀûÀÎ ¿øÀÎÀº ºê¶ó¿ìÀú¿¡ + Á÷Á¢ ȤÀº HTML ¸µÅ©¿¡ URLÀÌ À߸ø ÀÔ·ÂµÈ °æ¿ìÀÌ´Ù. ¾ÆÆÄÄ¡´Â + mod_speling (¸ÂÃã¹ýÀÌ Æ²¸®Áö ¾Ê¾ÒÀ½) ¸ðµâ·Î + ÀÌ¿Í °°Àº ¹®Á¦¸¦ µ½´Â´Ù. ÀÌ ¸ðµâÀ» »ç¿ëÇϸé "File Not Found" + ¿À·ù°¡ ¹ß»ýÇÏ´Â °æ¿ì ºñ½ÁÇÑ ÆÄÀϸíÀ» °¡Áø ÀÚ¿øÀ» ã´Â´Ù. + ¸¸¾à ¹ß°ßÇϸé mod_spelingÀº Ŭ¶óÀ̾ðÆ®¸¦ ¿Ã¹Ù¸¥ À§Ä¡·Î + HTTP ¸®´ÙÀÌ·º¼ÇÇÑ´Ù. "ºñ½ÁÇÑ" ÆÄÀÏÀÌ ¿©·¯°³ ÀÖ´Ù¸é + Ŭ¶óÀ̾ðÆ®¿¡°Ô ¸ñ·ÏÀ» º¸³½´Ù.

    + +

    mod_spelingÀÇ Æ¯È÷ À¯¿ëÇÑ ÀåÁ¡Àº ´ë¼Ò¹®ÀÚ¸¦ ±¸º°ÇÏÁö¾Ê°í + ÆÄÀϸíÀ» ºñ±³ÇÏ´Â ±â´ÉÀÌ´Ù. ±×·¡¼­ À¯´Ð½º ÆÄÀϽýºÅÛ°ú URLÀÇ + ´ë¼Ò¹®ÀÚ ¼ºÁúÀ» ¾ËÁö¸øÇÏ´Â »ç¿ëÀÚ°¡ ÀÖ´Â ½Ã½ºÅÛ¿¡ µµ¿òÀÌ + µÈ´Ù. ±×·¯³ª mod_spelingÀÌ ÀÚÁÖ URLÀ» °íÃľßÇÑ´Ù¸é, "À߸øµÈ" + ¿äû¶§¸¶´Ù URL ¸®´ÙÀÌ·º¼Ç°ú Ŭ¶óÀ̾ðÆ®ÀÇ »õ·Î¿î ¿äûÀÌ + ÀϾ¹Ç·Î ¼­¹ö¿¡ ºÎ´ãÀÌ µÈ´Ù.

    + +

    ã´Â ½Ãµµ°¡ ¸ðµÎ ½ÇÆÐÇÏ¸é ¾ÆÆÄÄ¡´Â HTTP status code 404 + (file not found) ¿À·ùÆäÀÌÁö¸¦ º¸³½´Ù. ÀÌ ÆäÀÌÁöÀÇ ³»¿ëÀº + ErrorDocument Áö½Ã¾î·Î + Á¶ÀýÇϸç, »ç¿ëÀÚÁ¤ÀÇ ¿À·ù + ÀÀ´ä°ú ´Ù±¹¾î + ¼­¹ö ¿À·ù¹® ¹®¼­¸¦ Âü°íÇÏ¿© »ç¿ëÀÚÁ¤ÀÇÇÒ ¼ö ÀÖ´Ù.

    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/urlmapping.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/urlmapping.html.tr.utf8 new file mode 100644 index 00000000..15b08299 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/urlmapping.html.tr.utf8 @@ -0,0 +1,270 @@ + + + +URL’lerin Dosya Sistemi ile Eşleştirilmesi - Apache HTTP Sunucusu + + + + + +
    <-
    +

    URL’lerin Dosya Sistemi ile Eşleştirilmesi

    +
    +

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

    +
    + +

    Bu belgede, bir istekte belirtilen URL’nin sunulacak dosyanın dosya + sistemindeki yerini bulmak için Apache tarafından nasıl kullanıldığı + açıklanmaktadır.

    +
    + +
    top
    +
    top
    +
    +

    DocumentRoot

    + +

    Yapılan bir isteğe hangi dosyanın sunulacağına karar verirken + Apache’nin öntanımlı davranışı istek için URL yolunu (URL’den konak ismi + ve port ayrıldıktan sonra kalan kısım) alıp bunu yapılandırma dosyasında + DocumentRoot yönergesi ile + belirtilen dizinin sonuna eklemektir. Bu nedenle, DocumentRoot altındaki dizinler ve dosyalar + sitenin dışardan görünen temel belge ağacını oluştururlar.

    + +

    Örneğin, DocumentRoot yönergesine + /var/http/html atanmış olsun. + http://mesela.dom/balıklar/zargana.html şeklindeki bir + istek için istemciye /var/http/html/balıklar/zargana.html + dosyası sunulur.

    + +

    Apache ayrıca, sunucunun birden fazla konak için istek kabul etmesini + sağlayan sanal barındırmaya da muktedirdir. Bu + durumda her sanal konak için ayrı bir DocumentRoot belirtilebileceği gibi sunulacak içeriğin + istekte bulunulan IP adresi veya konak ismine dayanarak devingen olarak + saptanmasını sağlayabilen mod_vhost_alias modülüyle + gelen yönergeler de kullanılabilir.

    +
    top
    +
    +

    Belge Kök Dizini Dışındaki Dosyalar

    + +

    Bazen dosya sisteminde doğrudan DocumentRoot altında bulunmayan dosyalara da erişim izni + vermek gerekir. Apache’de bunu sağlamanın çeşitli yolları vardır. Unix + sistemlerinde sembolik bağlar sayesinde dosya sisteminin farklı + yerlerindeki dosyaları ve dizinleri DocumentRoot altındaymış gibi göstermek mümkündür. + Options yönergesine değer olarak + FollowSymLinks veya SymLinksIfOwnerMatch + atanmadıkça Apache olası güvenlik açıklarına karşı öntanımlı olarak + sembolik bağları izlemez.

    + +

    Bundan başka, dosya sisteminin farklı parçalarını belge kök dizini + altında göstermek için Alias + yönergesi de kullanılabilir. Örneğin,

    + +

    Alias /belgeler /var/http

    + +

    yapılandırması ile + http://mesela.dom/belgeler/dizin/dosya.html URL’si için + dosya sistemindeki /var/http/dizin/dosya.html dosyası + sunulacaktır. Hedef dizindeki dosyaları birer → CGI betiği olarak imlemesi dışında ScriptAlias yönergesi de aynı şekilde + çalışır.

    + +

    Biraz daha fazla esnekliğin gerektiği durumlarda → düzenli ifadelere dayalı eşleşmeler sağlamak + üzere AliasMatch ve ScriptAliasMatch yönergelerinin gücünden + yararlanılabilir. Örneğin,

    + +

    ScriptAliasMatch ^/~([a-zA-Z0-9]+)/cgi-bin/(.+) + /home/$1/cgi-bin/$2

    + +

    satırı sayesinde http://mesela.dom/~user/cgi-bin/betik.cgi + URL’si /home/user/cgi-bin/betik.cgi dosyası ile + eşleştirilir ve dosya bir CGI betiği olarak çalıştırılırdı.

    +
    top
    +
    +

    Kullanıcı Dizinleri

    + +

    Geleneksel olarak Unix sistemlerinde belli bir kullanıcının (örn, + birisi) ev dizinine ~birisi/ şeklinde atıfta + bulunulabilir. mod_userdir modülü bu özelliği site + üzerinden kullanıcıların ev dizinlerindeki dosyaları kişisel sayfalar + olarak sunmalarını sağlamak üzere kullanır. Örnek:

    + +

    http://mesela.dom/~birisi/dosya.html

    + +

    Güvenlik sebebiyle kullanıcıların ev dizinlerine doğrudan HTTP erişimi + vermek uygun olmaz. Bu bakımdan, kullanıcının ev dizini altında HTTP + erişimi verilecek dosyaların bulunduğu dizini belirtmek için UserDir yönergesi sağlanmıştır. + Öntanımlı olan Userdir public_html yapılandırması ile + yukarıdaki gibi bir URL kullanıcının ev dizini (/etc/passwd + dosyasında belirtilir) /home/birisi/ altında yer alan + /home/birisi/public_html/dosya.html dosyası ile + eşleşirdi.

    + +

    Ev dizininin yerinin /etc/passwd dosyasında belirtilmediği + sistemlerde kullanılmak üzere Userdir yönergesinin başka + kullanım şekilleri de vardır.

    + +

    Bazı kişiler (genellikle URL üzerinde %7e olarak + kodlanması sebebiyle) "~" simgesini biçimsiz bulabilir ve kullanıcı + dizinlerini imlemek için başka bir karakter kullanmayı tercih + edebilirler. Bu işlevsellik mod_userdir tarafından + desteklenmemektedir. Ancak, kullanıcı dizinleri düzgün şekilde + yapılandırılmışsa istenen etki AliasMatch yönergesi ile sağlanabilir. + Örneğin, http://mesela.dom/sayfalar/birisi/dosya.html + URL’si ile /home/birisi/public_html/dosya.html dosyasını + eşlemek için AliasMatch yönergesi şöyle + kullanılabilirdi:

    + +

    AliasMatch ^/sayfalar/([a-zA-Z0-9]+)/?(.*) + /home/$1/public_html/$2

    +
    top
    +
    +

    URL Yönlendirme

    + +

    Yukarıdaki bölümlerde açıklanan yapılandırma yönergeleri Apache’ye + içeriği dosya sisteminin belli bir yerinden alıp istemciye göndermesini + söyler. Bazen istemciye, istediği içeriğe farklı bir URL ile + erişebileceğini ve bu URL için ayrı bir istek yapması gerektiğini + bildirmek gerekir. Bu işleme yönlendirme adı verilir ve bu + işlevsellik Redirect yönergesi + ile sağlanır. Örneğin, DocumentRoot + altındaki /foo/ dizininin içeriğinin /bar/ + adında yeni bir dizine taşınması halinde istemciye yeni konumun + bildirilmesi şöyle sağlanabilirdi:

    + +

    Redirect permanent /foo/ + http://mesela.dom/bar/

    + +

    Bu atama sayesinde /foo/ ile başlayan URL yolları + mesela.dom sunucundaki /bar/ dizini altındaki + içeriğe yönlendirilmektedir. Yönlendirmeyi aynı sunucu üzerinde yapmak + zorunda değilsiniz, bu yönerge ile başka bir sunucuya da yönlendirme + yapabilirsiniz.

    + +

    Apache ayrıca, yeniden yazma ile ilgili daha karmaşık sorunlara çözüm + olarak RedirectMatch diye bir + yönerge daha sağlar. Örneğin bir sitenin baş sayfasını diğer isteklerden + ayrı olarak farklı bir siteye yönlendirmek için yönergeyi şöyle + kullanabilirsiniz:

    + +

    RedirectMatch permanent ^/$ + http://misal.dom/ilksayfa.html

    + +

    Bundan başka, bir sitedeki tüm sayfalara yapılan istekleri başka bir + siteye geçici olarak yönlendirmek için şöyle bir şey yapabilirsiniz:

    + +

    RedirectMatch temp .* + http://mesela.misal.dom/ilksayfa.html

    +
    top
    +
    +

    Karşı Vekil

    + +

    Apache ayrıca, uzak sunuculardaki belgelerin yerel sunucunun URL + alanına getirilmesini de mümkün kılar. Bu tekniğe HTTP sunucunun + belgeleri uzak bir sunucudan alıp istemciye sunmasını sağlayarak bir + vekil sunucu gibi davranması nedeniyle ters vekalet adı + verilir. Belgelerin istemciye özkaynağın bulunduğu sunucudan + geliyormuş gibi değilde doğrudan isteği yaptığı sunucudan geliyormuş + gibi sunulması nedeniyle bu işlem normal vekaletten farklıdır.

    + +

    Aşağıdaki örnekte, istemci /foo/ dizini altından bir belge + istemekte, sunucu ise bu belgeyi dahili.mesela.dom + üzerindeki /bar/ dizininden alıp istemciye yerel sunucudan + geliyormuş gibi sunmaktadır:

    + +

    + ProxyPass /foo/ http://dahili.mesela.dom/bar/
    + ProxyPassReverse /foo/ http://dahili.mesela.dom/bar/
    +

    + +

    ProxyPass sunucuyu uygun + belgeleri alması için yapılandırırken ProxyPassReverse yönergesi dahili.mesela.dom + sunucusundan kaynaklanan yönlendirmeleri yeniden yazar. Yalnız, + belgelerin içindeki hiperbağların yeniden yazılmayacağına dikkat ediniz. + Dolayısıyla, belge içinde dahili.mesela.dom’u ismiyle hedef + alan mutlak hiperbağlar varsa bunlar istemci tarafından vekil sunucudan + değil doğrudan dahili.mesela.dom’dan istenecektir.

    +
    top
    +
    +

    Yeniden Yazma Motoru

    + +

    Daha güçlü ikameler gerektiğinde mod_rewrite modülü + tarafından sağlanan yeniden yazma motoru işe yarayabilir. Bu modüldeki + yönergeler sunulacak içeriğin yerine karar vermek için kaynak IP adresi, + tarayıcı türü gibi isteğe özgü özellikleri kullanırlar. + mod_rewrite modülü buna ek olarak isteğin nasıl ele + alınacağına karar vermek için harici yazılımları ve veritabanlarını + kullanabilir. Yeniden yazma motoru yukarıda değinilen üç eşleşme türünü + de uygulayabilecek yetenektedir: Dahili yönlendirmeler (rumuzlar), + harici yönlendirmeler ve vekalet. mod_rewrite modülü + tarafından sağlanan yeteneklerin ayrıntılı açıklamaları ve bunların + kullanım örnekleri URL Yeniden Yazma + Rehberinde bulunmaktadır.

    +
    top
    +
    +

    Dosya orada yok

    + +

    Kaçınılmaz olarak, dosya sisteminde mevcut olmayan dosyalar için de + istek yapılacaktır. Bunun çeşitli sebepleri olabilir. Bazı durumlarda + bu, belgelerin yerlerininin değiştirilmesinin bir sonucu olabilir. Bu + durumda yapılacak en iyi şey, istemciyi belgeyi yeni yerinden istemesi + için bilgilendirmek amacıyla URL yönlendirmesi + kullanmaktır. Bu şekilde, içeriğin yeri değişse bile eski yer imlerinin + ve hiperbağların çalışmaya devam edeceklerinden emin olabilirsiniz.

    + +

    "Dosya orada yok" ("File Not Found") hatalarının diğer bir bildik + sebebi de URL’lerin hiperbağlarda veya doğrudan tarayıcıda kasıtlı ya da + kasıtsız, yanlış yazılmasıdır. Bu tür sorunlarda yardımcı olması için + Apache mod_speling (sic) adında bir modülle gelir. Bu + modül etkin kılındığında Apache, "Dosya orada yok" ("File Not Found") + hatalarının önünü kesip başka bir yerde benzer isimde bir dosya var mı + diye bakar. Böyle bir dosya varsa, mod_speling + istemciye dosyanın doğru yerini bildiren bir HTTP yönlendirmesi yollar. + Benzer çok sayıda dosya varsa bunlar istemciye bir liste halinde + sunulur.

    + +

    mod_speling modülünün en yararlı özelliklerinden biri + de dosya isimlerini harf büyüklüğüne duyarsız olarak arayabilmesidir. + Dosya isimlerinde harf büyüklüğünün önemli olduğu Unix benzeri sistemler + hakkında bilgisi olmayan kullanıcılara sahip sistemlerin kullanıcılarına + bu büyük yarar sağlar. Fakat modülün URL düzeltmekten başka şeyler için + de kullanılması, istemcilerden gelen neredeyse her isteğin URL + yönlendirmesine konu olmasına sebep olarak sunucunun yükünü + arttırabilir.

    + +

    Yerinde bulunmayan içeriğin bulunması çabalarının tümü Apache’nin 404 + (Dosya orada yok) HTTP durum kodlu bir hata sayfası döndürmesine yol + açar. Bu sayfanın içeriği ErrorDocument yönergesi ile denetlenebilir ve Hata Yanıtlarının Kişiselleştirilmesi ve Uluslararası Hata Yanıtları + belgelerinde anlatıldığı gibi oldukça esnek bir şekilde + kişiselleştirilebilir.

    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/vhosts/details.html b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/details.html new file mode 100644 index 00000000..1ccf806c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/details.html @@ -0,0 +1,13 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: details.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: details.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: details.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/vhosts/details.html.en b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/details.html.en new file mode 100644 index 00000000..14ad0dac --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/details.html.en @@ -0,0 +1,440 @@ + + + +An In-Depth Discussion of Virtual Host Matching - Apache HTTP Server + + + + + +
    <-
    +

    An In-Depth Discussion of Virtual Host Matching

    +
    +

    Available Languages:  en  | + ko  | + tr 

    +
    + + +

    The virtual host code was completely rewritten in + Apache 1.3. This document attempts to explain + exactly what Apache does when deciding what virtual host to + serve a hit from. With the help of the new + NameVirtualHost + directive virtual host configuration should be a lot easier and + safer than with versions prior to 1.3.

    + +

    If you just want to make it work without + understanding how, here are some + examples.

    + +
    + +
    top
    +
    +

    Config File Parsing

    + +

    There is a main_server which consists of all the + definitions appearing outside of + <VirtualHost> sections. There are virtual + servers, called vhosts, which are defined by + <VirtualHost> + sections.

    + +

    The directives + Listen, + ServerName, + ServerPath, + and ServerAlias + can appear anywhere within the definition of a server. However, + each appearance overrides the previous appearance (within that + server).

    + +

    The default value of the Listen field for + main_server is 80. The main_server has no default + ServerPath, or ServerAlias. The + default ServerName is deduced from the server's IP + address.

    + +

    The main_server Listen directive has two functions. One + function is to determine the default network port Apache will + bind to. The second function is to specify the port number + which is used in absolute URIs during redirects.

    + +

    Unlike the main_server, vhost ports do not affect + what ports Apache listens for connections on.

    + +

    Each address appearing in the VirtualHost + directive can have an optional port. If the port is unspecified + it defaults to the value of the main_server's most recent + Listen statement. The special port * + indicates a wildcard that matches any port. Collectively the + entire set of addresses (including multiple A + record results from DNS lookups) are called the vhost's + address set.

    + +

    Unless a NameVirtualHost + directive is used for a specific IP address the first vhost + with that address is treated as an IP-based vhost. The IP + address can also be the wildcard *.

    + +

    If name-based vhosts should be used a + NameVirtualHost directive must appear + with the IP address set to be used for the name-based vhosts. + In other words, you must specify the IP address that holds the + hostname aliases (CNAMEs) for your name-based vhosts via a + NameVirtualHost directive in your configuration + file.

    + +

    Multiple NameVirtualHost directives can be used + each with a set of VirtualHost directives but only + one NameVirtualHost directive should be used for + each specific IP:port pair.

    + +

    The ordering of NameVirtualHost and + VirtualHost directives is not important which + makes the following two examples identical (only the order of + the VirtualHost directives for one + address set is important, see below):

    + + + + +

    + NameVirtualHost 111.22.33.44
    + <VirtualHost 111.22.33.44>
    + # server A
    + ...
    + </VirtualHost>
    + <VirtualHost 111.22.33.44>
    + # server B
    + ...
    + </VirtualHost>
    +
    + NameVirtualHost 111.22.33.55
    + <VirtualHost 111.22.33.55>
    + # server C
    + ...
    + </VirtualHost>
    + <VirtualHost 111.22.33.55>
    + # server D
    + ...
    + </VirtualHost> +

    + <VirtualHost 111.22.33.44>
    + # server A
    + </VirtualHost>
    + <VirtualHost 111.22.33.55>
    + # server C
    + ...
    + </VirtualHost>
    + <VirtualHost 111.22.33.44>
    + # server B
    + ...
    + </VirtualHost>
    + <VirtualHost 111.22.33.55>
    + # server D
    + ...
    + </VirtualHost>
    +
    + NameVirtualHost 111.22.33.44
    + NameVirtualHost 111.22.33.55
    +
    +

    + + +

    (To aid the readability of your configuration you should + prefer the left variant.)

    + +

    After parsing the VirtualHost directive, the + vhost server is given a default Listen equal to the + port assigned to the first name in its VirtualHost + directive.

    + +

    The complete list of names in the VirtualHost + directive are treated just like a ServerAlias (but + are not overridden by any ServerAlias statement) + if all names resolve to the same address set. Note that + subsequent Listen statements for this vhost will not + affect the ports assigned in the address set.

    + +

    During initialization a list for each IP address is + generated and inserted into an hash table. If the IP address is + used in a NameVirtualHost directive the list + contains all name-based vhosts for the given IP address. If + there are no vhosts defined for that address the + NameVirtualHost directive is ignored and an error + is logged. For an IP-based vhost the list in the hash table is + empty.

    + +

    Due to a fast hashing function the overhead of hashing an IP + address during a request is minimal and almost not existent. + Additionally the table is optimized for IP addresses which vary + in the last octet.

    + +

    For every vhost various default values are set. In + particular:

    + +
      +
    1. If a vhost has no ServerAdmin, + Timeout, + KeepAliveTimeout, + KeepAlive, + MaxKeepAliveRequests, + ReceiveBufferSize, + or SendBufferSize + directive then the respective value is inherited from the + main_server. (That is, inherited from whatever the final + setting of that value is in the main_server.)
    2. + +
    3. The "lookup defaults" that define the default directory + permissions for a vhost are merged with those of the + main_server. This includes any per-directory configuration + information for any module.
    4. + +
    5. The per-server configs for each module from the + main_server are merged into the vhost server.
    6. +
    + +

    Essentially, the main_server is treated as "defaults" or a + "base" on which to build each vhost. But the positioning of + these main_server definitions in the config file is largely + irrelevant -- the entire config of the main_server has been + parsed when this final merging occurs. So even if a main_server + definition appears after a vhost definition it might affect the + vhost definition.

    + +

    If the main_server has no ServerName at this + point, then the hostname of the machine that httpd + is running on is used instead. We will call the main_server address + set those IP addresses returned by a DNS lookup on the + ServerName of the main_server.

    + +

    For any undefined ServerName fields, a + name-based vhost defaults to the address given first in the + VirtualHost statement defining the vhost.

    + +

    Any vhost that includes the magic _default_ + wildcard is given the same ServerName as the + main_server.

    + +
    top
    +
    +

    Virtual Host Matching

    + +

    The server determines which vhost to use for a request as + follows:

    + +

    Hash table lookup

    + +

    When the connection is first made by a client, the IP + address to which the client connected is looked up in the + internal IP hash table.

    + +

    If the lookup fails (the IP address wasn't found) the + request is served from the _default_ vhost if + there is such a vhost for the port to which the client sent the + request. If there is no matching _default_ vhost + the request is served from the main_server.

    + +

    If the IP address is not found in the hash table then the + match against the port number may also result in an entry + corresponding to a NameVirtualHost *, which is + subsequently handled like other name-based vhosts.

    + +

    If the lookup succeeded (a corresponding list for the IP + address was found) the next step is to decide if we have to + deal with an IP-based or a name-base vhost.

    + + + +

    IP-based vhost

    + +

    If the entry we found has an empty name list then we have + found an IP-based vhost, no further actions are performed and + the request is served from that vhost.

    + + + +

    Name-based vhost

    + +

    If the entry corresponds to a name-based vhost the name list + contains one or more vhost structures. This list contains the + vhosts in the same order as the VirtualHost + directives appear in the config file.

    + +

    The first vhost on this list (the first vhost in the config + file with the specified IP address) has the highest priority + and catches any request to an unknown server name or a request + without a Host: header field.

    + +

    If the client provided a Host: header field the + list is searched for a matching vhost and the first hit on a + ServerName or ServerAlias is taken + and the request is served from that vhost. A Host: + header field can contain a port number, but Apache always + matches against the real port to which the client sent the + request.

    + +

    If the client submitted a HTTP/1.0 request without + Host: header field we don't know to what server + the client tried to connect and any existing + ServerPath is matched against the URI from the + request. The first matching path on the list is used and the + request is served from that vhost.

    + +

    If no matching vhost could be found the request is served + from the first vhost with a matching port number that is on the + list for the IP to which the client connected (as already + mentioned before).

    + + + +

    Persistent connections

    + +

    The IP lookup described above is only done once for a + particular TCP/IP session while the name lookup is done on + every request during a KeepAlive/persistent + connection. In other words a client may request pages from + different name-based vhosts during a single persistent + connection.

    + + + +

    Absolute URI

    + +

    If the URI from the request is an absolute URI, and its + hostname and port match the main server or one of the + configured virtual hosts and match the address and + port to which the client sent the request, then the + scheme/hostname/port prefix is stripped off and the remaining + relative URI is served by the corresponding main server or + virtual host. If it does not match, then the URI remains + untouched and the request is taken to be a proxy request.

    + + +

    Observations

    + +
      +
    • A name-based vhost can never interfere with an IP-base + vhost and vice versa. IP-based vhosts can only be reached + through an IP address of its own address set and never + through any other address. The same applies to name-based + vhosts, they can only be reached through an IP address of the + corresponding address set which must be defined with a + NameVirtualHost directive.
    • + +
    • ServerAlias and ServerPath + checks are never performed for an IP-based vhost.
    • + +
    • The order of name-/IP-based, the _default_ + vhost and the NameVirtualHost directive within + the config file is not important. Only the ordering of + name-based vhosts for a specific address set is significant. + The one name-based vhosts that comes first in the + configuration file has the highest priority for its + corresponding address set.
    • + +
    • For security reasons the port number given in a + Host: header field is never used during the + matching process. Apache always uses the real port to which + the client sent the request.
    • + +
    • If a ServerPath directive exists which is a + prefix of another ServerPath directive that + appears later in the configuration file, then the former will + always be matched and the latter will never be matched. (That + is assuming that no Host: header field was + available to disambiguate the two.)
    • + +
    • If two IP-based vhosts have an address in common, the + vhost appearing first in the config file is always matched. + Such a thing might happen inadvertently. The server will give + a warning in the error logfile when it detects this.
    • + +
    • A _default_ vhost catches a request only if + there is no other vhost with a matching IP address + and a matching port number for the request. The + request is only caught if the port number to which the client + sent the request matches the port number of your + _default_ vhost which is your standard + Listen by default. A wildcard port can be + specified (i.e., _default_:*) to catch + requests to any available port. This also applies to + NameVirtualHost * vhosts.
    • + +
    • The main_server is only used to serve a request if the IP + address and port number to which the client connected is + unspecified and does not match any other vhost (including a + _default_ vhost). In other words the main_server + only catches a request for an unspecified address/port + combination (unless there is a _default_ vhost + which matches that port).
    • + +
    • A _default_ vhost or the main_server is + never matched for a request with an unknown or + missing Host: header field if the client + connected to an address (and port) which is used for + name-based vhosts, e.g., in a + NameVirtualHost directive.
    • + +
    • You should never specify DNS names in + VirtualHost directives because it will force + your server to rely on DNS to boot. Furthermore it poses a + security threat if you do not control the DNS for all the + domains listed. There's more + information available on this and the next two + topics.
    • + +
    • ServerName should always be set for each + vhost. Otherwise A DNS lookup is required for each + vhost.
    • +
    + + +
    top
    +
    +

    Tips

    + +

    In addition to the tips on the DNS Issues page, here are + some further tips:

    + +
      +
    • Place all main_server definitions before any + VirtualHost definitions. (This is to aid the + readability of the configuration -- the post-config merging + process makes it non-obvious that definitions mixed in around + virtual hosts might affect all virtual hosts.)
    • + +
    • Group corresponding NameVirtualHost and + VirtualHost definitions in your configuration to + ensure better readability.
    • + +
    • Avoid ServerPaths which are prefixes of + other ServerPaths. If you cannot avoid this then + you have to ensure that the longer (more specific) prefix + vhost appears earlier in the configuration file than the + shorter (less specific) prefix (i.e., "ServerPath + /abc" should appear after "ServerPath /abc/def").
    • +
    + +
    +
    +

    Available Languages:  en  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/vhosts/details.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/details.html.ko.euc-kr new file mode 100644 index 00000000..1ba167ee --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/details.html.ko.euc-kr @@ -0,0 +1,384 @@ + + + +°¡»óÈ£½ºÆ® ã±â¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ¼³¸í - Apache HTTP Server + + + + + +
    <-
    +

    °¡»óÈ£½ºÆ® ã±â¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ¼³¸í

    +
    +

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

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

    °¡»óÈ£½ºÆ® ÄÚµå´Â ¾ÆÆÄÄ¡ 1.3¿¡¼­ °ÅÀÇ ´Ù½Ã + ÀÛ¼ºµÇ¾ú´Ù. ÀÌ ¹®¼­´Â ¾ÆÆÄÄ¡°¡ ¿äûÀ» ¹ÞÀ¸¸é ¾î¶² °¡»óÈ£½ºÆ®°¡ + ¼­ºñ½ºÇÒÁö °áÁ¤ÇÏ´Â ¹æ¹ýÀ» ¼³¸íÇÑ´Ù. »õ·Î¿î NameVirtualHost Áö½Ã¾î¸¦ »ç¿ëÇÏ¿© + °¡»óÈ£½ºÆ® ¼³Á¤ÀÌ 1.3 ¹öÀü ÀÌÀüº¸´Ù ´õ ½±°í ¾ÈÀüÇØÁ³´Ù.

    + +

    ¾î¶»°Ô µ¿ÀÛÇÏ´ÂÁö ÀÌÇØÇÏÁö¾Ê°í ´ÜÁö µ¿ÀÛÇÏ°Ô¸¸ + ÇÏ°í ½Í´Ù¸é, ¿¹Á¦µéÀ» Âü°íÇ϶ó.

    + +
    + +
    top
    +
    +

    ¼³Á¤ÆÄÀÏ Àбâ

    + +

    <VirtualHost> ¼³Á¤À» Á¦¿ÜÇÑ ¼³Á¤ÀÌ + ÁÖ¼­¹ö¸¦ ¸¸µç´Ù. <VirtualHost> ¼½¼ÇÀ¸·Î Á¤ÀÇÇÑ + ºÎºÐÀ» °¡»óÈ£½ºÆ®¶ó°í ºÎ¸¥´Ù.

    + +

    Listen, + ServerName, + ServerPath, + ServerAlias Áö½Ã¾î´Â + ¼­¹ö Á¤ÀÇ ¾î´À°÷¿¡¼­µµ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ±×·¯³ª °°Àº Áö½Ã¾î°¡ + ¿©·¯¹ø ³ª¿À¸é (±× ¼­¹ö¿¡¼­) ¸¶Áö¸· Áö½Ã¾î¸¸ÀÌ À¯È¿ÇÏ´Ù.

    + +

    ÁÖ¼­¹ö ListenÀÇ ±âº»°ªÀº 80ÀÌ´Ù. ÁÖ¼­¹öÀÇ + ServerPath³ª ServerAlias¿¡´Â + ±âº»°ªÀº ¾ø´Ù. ServerNameÀÇ ±âº»°ªÀº ¼­¹öÀÇ + IP ÁÖ¼ÒÀÌ´Ù.

    + +

    ÁÖ¼­¹öÀÇ Listen Áö½Ã¾î´Â µÎ°¡Áö ±â´ÉÀ» ÇÑ´Ù. ù°´Â + ¾ÆÆÄÄ¡°¡ ¿¬°áÇÒ ±âº» ³×Æ®¿÷ Æ÷Æ®¸¦ ÁöÁ¤ÇÏ´Â ÀÏÀÌ´Ù. µÑ°´Â + ¸®´ÙÀÌ·º¼ÇÇÒ Àý´ë URI¿¡ »ç¿ëÇÒ Æ÷Æ® ¹øÈ£¸¦ ÁöÁ¤ÇÏ´Â ÀÏÀÌ´Ù.

    + +

    ÁÖ¼­¹ö¿Í ´Þ¸® °¡»óÈ£½ºÆ®ÀÇ Æ÷Æ®´Â ¾ÆÆÄÄ¡°¡ ¿¬°áÀ» ±â´Ù¸®´Â + Æ÷Æ®¿¡ ¿µÇâÀ» ÁÖÁö ¾Ê´Â´Ù.

    + +

    VirtualHost Áö½Ã¾î¿¡ Æ÷Æ®¸¦ ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. + Æ÷Æ®¸¦ ÁöÁ¤ÇÏÁö¾ÊÀ¸¸é ÁÖ¼­¹öÀÇ °¡Àå ÃÖ±Ù Listen + °ªÀ» »ç¿ëÇÑ´Ù. Ưº°ÇÑ Æ÷Æ® *´Â ¾î¶² Æ÷Æ®¶óµµ + ÁöĪÇÏ´Â ¿ÍÀϵåÄ«µåÀÌ´Ù. (DNS °Ë»ö °á°úÀÇ ¿©·¯ A + ·¹Äڵ带 Æ÷ÇÔÇÏ¿©) °¡»óÈ£½ºÆ®ÀÇ ÁÖ¼Ò¸¦ ¸ðµÎ ÃÑĪÇÏ¿© °¡»óÈ£½ºÆ®ÀÇ + ÁÖ¼ÒÁýÇÕ(address set)À̶ó°í ºÎ¸¥´Ù.

    + +

    ƯÁ¤ IP ÁÖ¼Ò¿¡ ´ëÇÑ NameVirtualHost Áö½Ã¾î°¡ ¾ø´Ù¸é + ±× ÁÖ¼Ò¸¦ Æ÷ÇÔÇϴ ù¹ø° °¡»óÈ£½ºÆ®¸¦ IP±â¹Ý °¡»óÈ£½ºÆ®·Î Ãë±ÞÇÑ´Ù. + IP ÁÖ¼Ò¿¡ ¿ÍÀϵåÄ«µå *¸¦ »ç¿ëÇÒ ¼öµµ ÀÖ´Ù.

    + +

    À̸§±â¹Ý °¡»óÈ£½ºÆ®¸¦ »ç¿ëÇÑ´Ù¸é À̸§±â¹Ý °¡»óÈ£½ºÆ®¿¡ + »ç¿ëÇÒ IP ÁÖ¼Ò¸¦ NameVirtualHost Áö½Ã¾î¿¡ + »ç¿ëÇØ¾ß ÇÑ´Ù. Áï, ¼³Á¤ÆÄÀÏÀÇ NameVirtualHost + Áö½Ã¾î¿¡ À̸§±â¹Ý °¡»óÈ£½ºÆ®ÀÇ È£½ºÆ®º°¸í(CNAME)¿¡ ÇØ´çÇÏ´Â + IP ÁÖ¼Ò¸¦ ÁöÁ¤ÇØ¾ß ÇÑ´Ù.

    + +

    ƯÁ¤ IP:Æ÷Æ® ½Ö¿¡ ´ëÇØ ¿ÀÁ÷ ÇÑ NameVirtualHost + Áö½Ã¾î¸¸À» »ç¿ëÇÑ´Ù¸é, ¿©·¯ NameVirtualHost Áö½Ã¾î¿Í + VirtualHost Áö½Ã¾î¸¦ ¼¯¾î¼­ »ç¿ëÇÒ ¼ö ÀÖ´Ù.

    + +

    NameVirtualHost¿Í VirtualHost + Áö½Ã¾îÀÇ ¼ø¼­´Â Áß¿äÇÏÁö ¾Ê±â¶§¹®¿¡ ´ÙÀ½ µÎ ¿¹´Â °°´Ù (¿ÀÁ÷ + ÇÑ ÁÖ¼ÒÁýÇÕ¿¡ ´ëÇÑ VirtualHostÀÇ + ¼ø¼­°¡ Áß¿äÇÏ´Ù. ¾Æ·¡ Âü°í):

    + + + + +

    + NameVirtualHost 111.22.33.44
    + <VirtualHost 111.22.33.44>
    + # ¼­¹ö A
    + ...
    + </VirtualHost>
    + <VirtualHost 111.22.33.44>
    + # ¼­¹ö B
    + ...
    + </VirtualHost>
    +
    + NameVirtualHost 111.22.33.55
    + <VirtualHost 111.22.33.55>
    + # ¼­¹ö C
    + ...
    + </VirtualHost>
    + <VirtualHost 111.22.33.55>
    + # ¼­¹ö D
    + ...
    + </VirtualHost> +

    + <VirtualHost 111.22.33.44>
    + # ¼­¹ö A
    + </VirtualHost>
    + <VirtualHost 111.22.33.55>
    + # ¼­¹ö C
    + ...
    + </VirtualHost>
    + <VirtualHost 111.22.33.44>
    + # ¼­¹ö B
    + ...
    + </VirtualHost>
    + <VirtualHost 111.22.33.55>
    + # ¼­¹ö D
    + ...
    + </VirtualHost>
    +
    + NameVirtualHost 111.22.33.44
    + NameVirtualHost 111.22.33.55
    +
    +

    + + +

    (¿ÞÂÊ ¼³Á¤ÀÌ ´õ Àбâ ÆíÇÏ´Ù.)

    + +

    VirtualHost Áö½Ã¾î¸¦ ÀÐÀ» ´ÙÀ½, °¡»óÈ£½ºÆ® + ¼­¹ö´Â VirtualHost Áö½Ã¾î¿¡ ÁöÁ¤ÇÑ Æ÷Æ®¸¦ ±âº» + ListenÀ¸·Î ÇÑ´Ù.

    + +

    VirtualHost Áö½Ã¾îÀÇ À̸§ÀÌ ¸ðµÎ °°Àº + ÁÖ¼ÒÁýÇÕ¿¡ ¼ÓÇÑ´Ù¸é ServerAlias¿Í °°ÀÌ Ãë±ÞÇÑ´Ù + (±×·¯³ª ´Ù¸¥ ServerAliasÀÇ ¿µÇâÀ» ¹ÞÁö ¾Ê´Â´Ù). + °¡»óÈ£½ºÆ®¿¡ Ãß°¡·Î »ç¿ëÇÑ ListenÀº ÁÖ¼ÒÁýÇÕÀÌ + ÁöÁ¤ÇÑ Æ÷Æ®¿¡ ¿µÇâÀ» ÁÖÁö ¾ÊÀ½À» ÁÖÀÇÇ϶ó.

    + +

    ½ÃÀÛÇÒ¶§ IP ÁÖ¼Ò ¸ñ·ÏÀ» ¸¸µé¾î Çؽ¬Å×ÀÌºí¿¡ Ãß°¡ÇÑ´Ù. + NameVirtualHost Áö½Ã¾î¿¡ IP ÁÖ¼Ò¸¦ »ç¿ëÇϸé + ¸ñ·ÏÀº ±× IP ÁÖ¼Ò¿¡ ´ëÇÑ ¸ðµç À̸§±â¹Ý °¡»óÈ£½ºÆ®¸¦ Æ÷ÇÔÇÑ´Ù. + ±× ÁÖ¼Ò¿¡ ´ëÇÑ °¡»óÈ£½ºÆ®°¡ ¾ø´Ù¸é NameVirtualHost + Áö½Ã¾î¸¦ ¹«½ÃÇÏ°í ·Î±×¿¡ ¿À·ù¸¦ ±â·ÏÇÑ´Ù. IP±â¹Ý °¡»óÈ£½ºÆ®´Â + Çؽ¬Å×ÀÌºí¿¡ ¸ñ·ÏÀ» Ãß°¡ÇÏÁö ¾Ê´Â´Ù.

    + +

    ºü¸¥ Çؽ¬ÇÔ¼ö¸¦ »ç¿ëÇϱ⶧¹®¿¡ ¿äû½Ã IP ÁÖ¼Ò¸¦ ÇؽÌÇÏ´Â + ºÎ´ãÀº °ÅÀÇ ¾ø´Ù. ¶Ç Çؽ¬Å×À̺íÀº IP ÁÖ¼ÒÀÇ ¸¶Áö¸· ºÎºÐÀÇ + Â÷ÀÌ¿¡ ÃÖÀûÈ­µÇÀÖ´Ù.

    + +

    °¡»óÈ£½ºÆ®¿¡ ¿©·¯ ±âº»°ªÀÌ ¼³Á¤µÈ´Ù. ƯÈ÷:

    + +
      +
    1. °¡»óÈ£½ºÆ®¿¡ ServerAdmin, + ResourceConfig, + AccessConfig, + Timeout, + KeepAliveTimeout, + KeepAlive, + MaxKeepAliveRequests, + SendBufferSize + Áö½Ã¾î°¡ ¾ø´Ù¸é ÁÖ¼­¹ö¿¡¼­ ÇØ´ç °ªÀ» °¡Á®¿Â´Ù. (Áï, + ÁÖ¼­¹öÀÇ ¼³Á¤°ªÀ» »ç¿ëÇÑ´Ù.)
    2. + +
    3. °¡»óÈ£½ºÆ®ÀÇ µð·ºÅ丮 ±âº»±ÇÇÑÀ» Á¤ÀÇÇÏ´Â "ÂüÁ¶ + ±âº»°ª(lookup defaults)"Àº ÁÖ¼­¹öÀÇ ¼³Á¤°ú ÇÕÃÄÁø´Ù. + ¸ðµâÀÇ µð·ºÅ丮´ç ¼³Á¤(per-directory configuration)µµ + ¿©±â¿¡ ÇØ´çµÈ´Ù.
    4. + +
    5. °¢ ¸ðµâÀÇ ¼­¹ö´ç ¼³Á¤(per-server config)Àº ÁÖ¼­¹öÀÇ + ¼³Á¤°ú °¡»óÈ£½ºÆ®ÀÇ ¼³Á¤À» ÇÕÄ£´Ù.
    6. +
    + +

    ±âº»ÀûÀ¸·Î ÁÖ¼­¹ö´Â °¡»óÈ£½ºÆ®¸¦ ¸¸µå´Â "±âº»" ȤÀº "±â¹Ý"ÀÌ + µÈ´Ù. ±×·¯³ª ¼³Á¤ÆÄÀÏ¿¡¼­ ÁÖ¼­¹ö¸¦ Á¤ÀÇÇÏ´Â À§Ä¡´Â °ü°è¾ø´Ù. + ¸¶Áö¸·À¸·Î ¼³Á¤À» ÇÕÄ¡±â Àü¿¡ ÁÖ¼­¹öÀÇ ¸ðµç ¼³Á¤À» ÀоîµéÀδÙ. + ±×·¡¼­ ÁÖ¼­¹ö Á¤ÀÇ°¡ °¡»óÈ£½ºÆ® Á¤ÀÇ µÚ¿¡ ³ª¿Íµµ °¡»óÈ£½ºÆ® + Á¤ÀÇ¿¡ ¿µÇâÀ» ÁØ´Ù.

    + +

    ÁÖ¼­¹ö¿¡ ServerNameÀÌ ¾ø´Ù¸é À¥¼­¹ö¸¦ ½ÇÇàÇÏ´Â + ÄÄÇ»ÅÍÀÇ È£½ºÆ®¸íÀ» ´ë½Å »ç¿ëÇÑ´Ù. ÁÖ¼­¹öÀÇ + ServerNameÀ» DNS °Ì»öÇÏ¿© ¾òÀº IP ÁÖ¼ÒµéÀ» + ÁÖ¼­¹ö ÁÖ¼ÒÁýÇÕÀ̶ó°í ºÎ¸¥´Ù.

    + +

    À̸§±â¹Ý °¡»óÈ£½ºÆ®ÀÇ ServerNameÀ» Á¤ÀÇÇÏÁö + ¾ÊÀ¸¸é °¡»óÈ£½ºÆ®¸¦ Á¤ÀÇÇÏ´Â VirtualHost¿¡¼­ + óÀ½À¸·Î ³ª¿Â ÁÖ¼Ò¸¦ ±âº»°ªÀ¸·Î »ç¿ëÇÑ´Ù.

    + +

    Ưº°ÇÑ _default_ ¿ÍÀÏƮīµå¸¦ Æ÷ÇÔÇÏ´Â + °¡»óÈ£½ºÆ®´Â ÁÖ¼­¹ö¿Í °°Àº ServerNameÀ» °¡Áø´Ù.

    + +
    top
    +
    +

    °¡»óÈ£½ºÆ® ã±â

    + +

    ¼­¹ö´Â ¾Æ·¡¿Í °°Àº ¹æ¹ýÀ¸·Î ¾î¶² °¡»óÈ£½ºÆ®°¡ ¿äûÀ» + ó¸®ÇÒÁö °áÁ¤ÇÑ´Ù:

    + +

    Çؽ¬Å×À̺í ã±â

    + +

    Ŭ¶óÀ̾ðÆ®°¡ óÀ½ ¿¬°áÇÏ¸é ¿¬°áÇÑ IP ÁÖ¼Ò¸¦ ³»ºÎ IP + Çؽ¬Å×ÀÌºí¿¡¼­ ã´Â´Ù.

    + +

    IP ÁÖ¼Ò¸¦ ãÀ» ¼ö ¾ø°í Ŭ¶óÀ̾ðÆ®°¡ ¿äûÀ» º¸³½ Æ÷Æ®¿¡ + ÇØ´çÇÏ´Â °¡»óÈ£½ºÆ®°¡ ÀÖ´Ù¸é, _default_ °¡»óÈ£½ºÆ®°¡ + ¿äûÀ» ¼­ºñ½ºÇÑ´Ù. _default_ °¡»óÈ£½ºÆ®°¡ + ¾ø´Ù¸é ÁÖ¼­¹ö°¡ ¿äûÀ» ¼­ºñ½ºÇÑ´Ù.

    + +

    Çؽ¬Å×ÀÌºí¿¡ IP ÁÖ¼Ò°¡ ¾øÁö¸¸ Æ÷Æ® ¹øÈ£°¡ + NameVirtualHost *¿¡ ÇØ´çÇÒ ¼ö ÀÖ´Ù. ÀÌ °æ¿ì + À̸§±â¹Ý °¡»óÈ£½ºÆ®Ã³·³ ó¸®ÇÑ´Ù.

    + +

    ã¾Ò´Ù¸é (¸ñ·Ï¿¡¼­ IP ÁÖ¼Ò¿¡ ÇØ´çÇÏ´Â Ç׸ñÀ» ãÀ¸¸é), + IP±â¹Ý °¡»óÈ£½ºÆ®ÀÎÁö À̸§±â¹Ý °¡»óÈ£½ºÆ®ÀÎÁö °áÁ¤ÇÑ´Ù.

    + + + +

    IP±â¹Ý °¡»óÈ£½ºÆ®

    + +

    ãÀº Ç׸ñ¿¡ À̸§ ¸ñ·ÏÀÌ ¾ø´Ù¸é IP±â¹Ý °¡»óÈ£½ºÆ®ÀÌ´Ù. + ´õ ÀÌ»ó ÀÛ¾÷ÀÌ ÇÊ¿ä¾ø°í, ±× °¡»óÈ£½ºÆ®°¡ ¿äûÀ» ó¸®ÇÑ´Ù.

    + + + +

    À̸§±â¹Ý °¡»óÈ£½ºÆ®

    + +

    À̸§ ¸ñ·Ï¿¡ ÇÑ°³ ÀÌ»óÀÇ °¡»óÈ£½ºÆ® ±¸Á¶°¡ Æ÷ÇԵǸé + À̸§±â¹Ý °¡»óÈ£½ºÆ®ÀÌ´Ù. ÀÌ ¸ñ·Ï¿¡¼­ °¡»óÈ£½ºÆ®µéÀº ¼³Á¤ÆÄÀÏÀÇ + VirtualHost ¼ø¼­´ë·Î À§Ä¡ÇÑ´Ù.

    + +

    ¸ñ·Ï¿¡¼­ ù¹ø° °¡»óÈ£½ºÆ®(¼³Á¤ÆÄÀÏ¿¡¼­ ÇØ´ç IP ÁÖ¼Ò¸¦ + Æ÷ÇÔÇϴ ù¹ø° °¡»óÈ£½ºÆ®)´Â °¡Àå ³ôÀº ¿ì¼±¼øÀ§¸¦ °¡Áö¸ç, + ¼­¹ö¸íÀ» ¾Ë ¼ö ¾ø°Å³ª Host: Çì´õ°¡ ¾ø´Â ¿äûÀ» + ó¸®ÇÑ´Ù.

    + +

    Ŭ¶óÀ̾ðÆ®°¡ Host: Çì´õ¸¦ ÁÖ¸é, ¸ñ·Ï¿¡¼­ + ù¹ø°·Î ServerNameÀ̳ª + ServerAlias°¡ ´ëÀÀÇÏ´Â °¡»óÈ£½ºÆ®°¡ ¿äûÀ» + ¼­ºñ½ºÇÑ´Ù. Host: Çì´õ¿¡ Æ÷Æ® ¹øÈ£°¡ ³ª¿Ã ¼ö + ÀÖÁö¸¸, ¾ÆÆÄÄ¡´Â Ç×»ó Ŭ¶óÀ̾ðÆ®°¡ ¿äûÀ» º¸³½ ½ÇÁ¦ Æ÷Æ®¸¦ + ã´Â´Ù.

    + +

    Ŭ¶óÀ̾ðÆ®°¡ Host: Çì´õ¾øÀÌ HTTP/1.0 ¿äûÀ» + Çϸé Ŭ¶óÀ̾ðÆ®°¡ ¾î¶² ¼­¹ö¿¡ ¿¬°áÇÏ·Á´ÂÁö ¾Ë ¼ö ¾ø±â¶§¹®¿¡ + ¿äûÀÇ URI¿¡ ÇØ´çÇÏ´Â ServerPath°¡ ÀÖ´ÂÁö ã´Â´Ù. + ¸ñ·Ï¿¡¼­ Á¦ÀÏ ¸ÕÀú ãÀº °æ·Î¸¦ »ç¿ëÇÏ°í, ±× °¡»óÈ£½ºÆ®°¡ + ¿äûÀ» ¼­ºñ½ºÇÑ´Ù.

    + +

    ´ëÀÀÇÏ´Â °¡»óÈ£½ºÆ®¸¦ ãÀ» ¼ö ¾ø´Ù¸é, (ÀÌ¹Ì ¾Õ¿¡ ¸»ÇßµíÀÌ) + Ŭ¶óÀ̾ðÆ®°¡ ¿¬°áÇÑ IP¿¡ ´ëÇÑ ¸ñ·Ï¿¡¼­ ÀÏÄ¡ÇÏ´Â Æ÷Æ® ¹øÈ£¸¦ + Æ÷ÇÔÇϴ ù¹ø° °¡»óÈ£½ºÆ®°¡ ¿äûÀ» ¼­ºñ½ºÇÑ´Ù.

    + + + +

    Áö¼Ó ¿¬°á

    + +

    IP´Â À§¿¡¼­ ¼³¸íÇѵ¥·Î ƯÁ¤ TCP/IP ¼¼¼Ç´ç Çѹø¸¸ + ãÁö¸¸, À̸§Àº KeepAlive/Áö¼Ó ¿¬°áµ¿¾È ¸Å ¿äû¶§¸¶´Ù + ã´Â´Ù. Áï, Ŭ¶óÀ̾ðÆ®´Â Áö¼Ó ¿¬°áµ¿¾È ¿©·¯ À̸§±â¹Ý + °¡»óÈ£½ºÆ®ÀÇ ÆäÀÌÁö¸¦ ¿äûÇÒ ¼ö ÀÖ´Ù.

    + + + +

    Àý´ë URI

    + +

    ¿äûÀÇ URI°¡ Àý´ë URIÀÌ°í Ŭ¶óÀ̾ðÆ®°¡ º¸³½ ¿äûÀÇ + È£½ºÆ®¸í°ú Æ÷Æ®°¡ ÁÖ¼­¹ö³ª ƯÁ¤ °¡»óÈ£½ºÆ®¿¡ ÇØ´çÇϸé, + ±× ÁÖ¼­¹ö ȤÀº °¡»óÈ£½ºÆ®´Â URI ¾ÕÀÇ ½ºÅ´/È£½ºÆ®¸í/Æ÷Æ® + ºÎºÐÀ» Á¦¿ÜÇÑ ³ª¸ÓÁö »ó´ë URI¸¦ ¼­ºñ½ºÇÑ´Ù. ÇØ´çÇÏ´Â + ÁÖ¼­¹ö³ª °¡»óÈ£½ºÆ®°¡ ¾ø´Ù¸é URI¸¦ ±×´ë·Î µÎ°í ¿äûÀ» + ÇÁ·Ï½Ã ¿äûÀ¸·Î ó¸®ÇÑ´Ù.

    + + +

    ÁÖÀÇ

    + +
      +
    • À̸§±â¹Ý °¡»óÈ£½ºÆ®¿Í IP±â¹Ý °¡»óÈ£½ºÆ®´Â ¼­·Î¿¡°Ô + ¿µÇâÀ» ÁÖÁö ¾Ê´Â´Ù. IP±â¹Ý °¡»óÈ£½ºÆ®¸¦ ÀÚ½ÅÀÇ À̸§ÁýÇÕ + IP ÁÖ¼Ò¿Ü¿¡ ¾î¶² Áּҷεµ Á¢±ÙÇÒ ¼ö ¾ø´Ù. À̸§±â¹Ý + °¡»óÈ£½ºÆ®µµ ¸¶Âù°¡Áö´Ù. À̸§±â¹Ý °¡»óÈ£½ºÆ®´Â + NameVirtualHost Áö½Ã¾î·Î Á¤ÀÇÇÑ ÁÖ¼ÒÁýÇÕÀÇ + IP ÁÖ¼Ò¸¦ ÅëÇؼ­¸¸ Á¢±ÙÇÒ ¼ö ÀÖ´Ù.
    • + +
    • IP±â¹Ý °¡»óÈ£½ºÆ®´Â ServerAlias¿Í + ServerPath¸¦ Àý´ë·Î °Ë»çÇÏÁö ¾Ê´Â´Ù.
    • + +
    • ¼³Á¤ÆÄÀÏ¿¡¼­ À̸§±â¹Ý °¡»óÈ£½ºÆ®, IP±â¹Ý °¡»óÈ£½ºÆ®, + _default_ °¡»óÈ£½ºÆ®, NameVirtualHost + Áö½Ã¾îÀÇ ¼ø¼­´Â Áß¿äÇÏÁö ¾Ê´Ù. ƯÁ¤ ÁÖ¼ÒÁýÇÕ¿¡ ´ëÇÑ + À̸§±â¹Ý °¡»óÈ£½ºÆ®µéÀÇ ¼ø¼­¸¸ÀÌ Áß¿äÇÏ´Ù. ¼³Á¤ÆÄÀÏ¿¡¼­ + ¾Õ¿¡ ³ª¿À´Â À̸§±â¹Ý °¡»óÈ£½ºÆ®´Â ÀÚ½ÅÀÌ ¼ÓÇÑ ÁÖ¼ÒÁýÇÕ¿¡¼­ + °¡Àå ³ôÀº ¿ì¼±¼øÀ§¸¦ °¡Áø´Ù.
    • + +
    • º¸¾ÈÀ» À§ÇØ Host: Çì´õ¿¡ Æ÷ÇÔµÈ Æ÷Æ® + ¹øÈ£´Â Àý´ë·Î »ç¿ëÇÏÁö ¾Ê´Â´Ù. ¾ÆÆÄÄ¡´Â Ç×»ó Ŭ¶óÀ̾ðÆ®°¡ + ¿äûÀ» º¸³½ ½ÇÁ¦ Æ÷Æ®¸¦ »ç¿ëÇÑ´Ù.
    • + +
    • (µÑ »çÀ̸¦ ±¸º°ÇÒ Host: Çì´õ°¡ ¾ø´Ù°í + °¡Á¤Çϸé,) ServerPath Áö½Ã¾î°¡ ¼³Á¤ÆÄÀÏ¿¡¼­ + µÚ¿¡ ³ª¿À´Â ´Ù¸¥ ServerPath Áö½Ã¾îÀÇ ¾ÕºÎºÐÀ» + ÁöĪÇÏ´Â °æ¿ì Ç×»ó ¾Õ¿¡ ³ª¿Â Áö½Ã¾î¸¦ »ç¿ëÇÑ´Ù.
    • + +
    • µÎ IP±â¹Ý °¡»óÈ£½ºÆ®°¡ °°Àº ÁÖ¼Ò¸¦ °¡Áö¸é, Ç×»ó + ¼³Á¤ÆÄÀÏ¿¡¼­ ¾Õ¿¡ ³ª¿À´Â °¡»óÈ£½ºÆ®¸¦ »ç¿ëÇÑ´Ù. ÀÌ·± ÀÏÀº + ¾Æ¹«µµ ¸ð¸£°Ô ÀϾ ¼ö ÀÖ´Ù. ¼­¹ö°¡ ÀÌ·± »óȲÀ» ¹ß°ßÇϸé + ¿À·ù ·Î±×ÆÄÀÏ¿¡ °æ°í¸¦ ±â·ÏÇÑ´Ù.
    • + +
    • _default_ °¡»óÈ£½ºÆ®´Â ¿äûÀÇ IP ÁÖ¼Ò¿Í + Æ÷Æ® ¹øÈ£¿¡ ÇØ´çÇÏ´Â °¡»óÈ£½ºÆ®°¡ ¾øÀ»¶§¸¸ ¿äûÀ» ó¸®ÇÑ´Ù. + Ŭ¶óÀ̾ðÆ®°¡ ¿äûÀ» º¸³½ Æ÷Æ® ¹øÈ£°¡ _default_ + °¡»óÈ£½ºÆ®ÀÇ Æ÷Æ® ¹øÈ£(±âº»°ªÀº Listen)¿Í + °°À»¶§¸¸ ¿äûÀ» ó¸®ÇÑ´Ù. ¾î¶² Æ÷Æ®ÀÇ ¿äûÀÌ¶óµµ Àâ±âÀ§ÇØ + (¿¹¸¦ µé¾î, _default_:*) ¿ÍÀϵåÄ«µå + Æ÷Æ®¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. NameVirtualHost * + °¡»óÈ£½ºÆ®µµ ¸¶Âù°¡Áö´Ù.
    • + +
    • ÁÖ¼­¹ö´Â Ŭ¶óÀ̾ðÆ®°¡ ¿¬°áÇÑ IP ÁÖ¼Ò¿Í Æ÷Æ® ¹øÈ£¿¡ + ÇØ´çÇÏ´Â (_default_ °¡»óÈ£½ºÆ®¸¦ Æ÷ÇÔÇÏ¿©) + °¡»óÈ£½ºÆ®°¡ ¾øÀ»¶§¸¸ ¿äûÀ» ¼­ºñ½ºÇÑ´Ù. Áï, ÁÖ¼­¹ö´Â + (±× Æ÷Æ®¿¡ ÇØ´çÇÏ´Â _default_ °¡»óÈ£½ºÆ®°¡ + ¾ø´Ù¸é) ÁöÁ¤ÇÏÁö¾ÊÀº ÁÖ¼Ò/Æ÷Æ® ½Ö¿¡ ´ëÇÑ ¿äû¸¸À» ó¸®ÇÑ´Ù.
    • + +
    • Ŭ¶óÀ̾ðÆ®°¡ (¿¹¸¦ µé¾î, NameVirtualHost + Áö½Ã¾î¿¡¼­) À̸§±â¹Ý °¡»óÈ£½ºÆ® ÁÖ¼Ò(¿Í Æ÷Æ®)¿¡ ¿¬°áÇÑ + °æ¿ì Host: Çì´õ¸¦ ¾Ë ¼ö ¾ø°Å³ª Çì´õ°¡ ¾ø´Â + ¿äûÀ» º¸³»¸é ¿äûÀº Àý´ë·Î _default_ + °¡»óÈ£½ºÆ®³ª ÁÖ¼­¹ö¿¡¼­ ó¸®ÇÏÁö ¾Ê´Â´Ù.
    • + +
    • ½ÃÀÛÇÒ¶§ ¼­¹ö°¡ DNS¸¦ ÀÇÁ¸ÇÏÁö ¾ÊÀ¸·Á¸é Àý´ë·Î + VirtualHost Áö½Ã¾î¿¡ DNS À̸§À» »ç¿ëÇÏÁö¸¶¶ó. + °Ô´Ù°¡ ¿­°ÅÇÑ ¸ðµç µµ¸ÞÀÎÀÇ DNS¸¦ ÅëÁ¦ÇÏÁö ¾Ê´Â´Ù¸é + º¸¾È»ó À§Çèµµ ÀÖ´Ù. ÀÌ¿¡ ´ëÇÑ Á¤º¸°¡ ÀÖ´Ù.
    • + +
    • °¢ °¡»óÈ£½ºÆ®¸¶´Ù ServerName¸¦ Ç×»ó + Á¤ÀÇÇØ¾ß ÇÑ´Ù. ¾È±×·¯¸é °¡»óÈ£½ºÆ®¸¶´Ù DNS¸¦ ã°Ô µÈ´Ù.
    • +
    + + +
    top
    +
    +

    ÆÁ

    + +

    DNS ¹®Á¦ ÆäÀÌÁöÀÇ + ÆÁ¿¡ Ãß°¡·Î ¾Æ·¡¿¡ ÆÁÀÌ ÀÖ´Ù:

    + +
      +
    • ¸ðµç ÁÖ¼­¹ö Á¤ÀǸ¦ VirtualHost Á¤ÀÇ ¾Õ¿¡ + µÎ¾î¶ó. (±×·¯¸é ¼³Á¤À» Àбâ ÆíÇÏ´Ù. ¾È±×·¯¸é ³ªÁß¿¡ ¼³Á¤ÀÌ + ÇÕÃÄÁú¶§ °¡»óÈ£½ºÆ®µé »çÀÌ¿¡ ¼¯ÀÎ Á¤ÀÇ°¡ ¸ðµç °¡»óÈ£½ºÆ®¿¡ + ¿µÇâÀ» ÁÙ ¼ö Àֱ⶧¹®¿¡ È¥¶õ½º·´´Ù.)
    • + +
    • Àбâ ÆíÇϵµ·Ï ¼³Á¤¿¡¼­ ÇØ´çÇÏ´Â NameVirtualHost°ú + VirtualHost Á¤ÀǵéÀ» ¹­¾î¶ó.
    • + +
    • ServerPath°¡ ´Ù¸¥ ServerPathÀÇ + ¾ÕºÎºÐÀ» ÁöĪÇÏ´Â °æ¿ì¸¦ ÇÇÇ϶ó. ÇÇÇÒ ¼ö ¾ø´Ù¸é ¼³Á¤ÆÄÀÏ¿¡¼­ + ¾ÕºÎºÐÀÌ ´õ ±ä (´õ ÀÚ¼¼ÇÑ) °¡»óÈ£½ºÆ®¸¦ ªÀº (´ú ÀÚ¼¼ÇÑ) + °¡»óÈ£½ºÆ®º¸´Ù ¾Õ¿¡ µÎ¾î¶ó. (¿¹¸¦ µé¾î, + "ServerPath /abc"´Â "ServerPath /abc/def" ´ÙÀ½¿¡ µÎ¾î¾ß + ÇÑ´Ù.
    • +
    + +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/vhosts/details.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/details.html.tr.utf8 new file mode 100644 index 00000000..0049164b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/details.html.tr.utf8 @@ -0,0 +1,401 @@ + + + +Sanal Konak Eşlemenin Derinliğine İncelenmesi - Apache HTTP Sunucusu + + + + + +
    <-
    +

    Sanal Konak Eşlemenin Derinliğine İncelenmesi

    +
    +

    Mevcut Diller:  en  | + ko  | + tr 

    +
    + + +

    Sanal konak kodu Apache 1.3 sürümünde baştan yeniden + yazıldı. Bu belgede, bir istek aldığında Apache’nin hangi sanal konak + ile hizmet sunacağına nasıl karar verdiği açıklanmaya çalışılmıştır. + NameVirtualHost yönergesi sayesinde + sanal konak yapılandırması 1.3 sürümünün öncesine göre daha kolay ve + daha güvenilir hale gelmiştir.

    + +

    Sanal konakların nasıl çalıştığını öğrenmeden sadece çalıştırmak + isterseniz doğrudan örneklerin bulunduğu + sayfaya bakabilirsiniz.

    + +
    + +
    top
    +
    +

    Yapılandırma Dosyasının Çözümlenmesi

    + +

    Bu belgede <VirtualHost> bölümleri dışında kalan + tanımlardan bahsederken ana_sunucu, <VirtualHost> bölümlerindeki tanımlamalardan + bahsederken sankonlar diyeceğiz.

    + +

    Listen, + ServerName, + ServerPath ve + ServerAlias yönergeleri bir sunucu + yapılandırmasının her yerinde karşımıza çıkabilir. Bununla birlikte, + sunucu dahilinde son göründükleri yerlerde önceki eşdeğerlerini geçersiz + kılarlar.

    + +

    Listen yönergesinin ana_sunucu için öntanımlı değeri + 80’dir. ServerPath ve ServerAlias + yönergelerinin ana_sunucu için öntanımlı değerleri yoktur. Öntanımlı + ServerName değeri ise sunucunun IP adresinden elde + edilir.

    + +

    Ana_sunucu Listen yönergesinin iki işlevi vardır. Biri + Apache’nin dinleyeceği öntanımlı ağ portunu belirlemek, diğeri ise + yönlendirmeler sırasında mutlak URI’lerde kullanılan port numarasını + belirlemektir.

    + +

    Ana_sunucunun aksine sankonların portları Apache‘nin dinleyeceği + portlar üzerinde etkili değildir.

    + +

    VirtualHost yönergesinde görünen her adresin seçimlik bir + portu olabilir. Eğer bir port belirtilmemişse öntanımlı olarak + ana_sunucunun son Listen yönergesinin değeri kullanılır. + Port olarak * belirtildiği takdirde bütün portlar dinlenir. + Adreslerin tamamını (DNS sorgularındaki çoklu A kayıtları dahil) içeren + kümeye sankonların adres kümesi denir.

    + +

    NameVirtualHost yönergesi ilk + sankonun IP adresi için kullanılmadığı takdirde bu IP adresine sahip ilk + sankon IP’ye dayalı sankon olarak ele alınır. IP adresi olarak + * belirtmek de mümkündür.

    + +

    Eğer isme dayalı sankonlar kullanılacaksa NameVirtualHost + yönergesinin bu isme dayalı sankonların IP adresi kümesini içermesi + gerekir. Başka bir deyişle, yapılandırma dosyanızın + NameVirtualHost yönergesine sankonların sunucu isimlerinin + karşı düştüğü IP adresini yazmalısınız.

    + +

    Çok sayıda NameVirtualHost yönergesi belirtebilirse de her + IP:port çifti için birden fazla NameVirtualHost yönergesi + belirtilmemelidir.

    + +

    Aşağıdaki iki örneğin eşdeğer olması için NameVirtualHost + ve VirtualHost yönergelerinin sıralamasının bir önemi + yoktur. (Sadece tek adreslik küme içindeki + VirtualHost yönergelerinin sırası önemlidir; aşağıya + bakınız:)

    + + + + +

    + NameVirtualHost 111.22.33.44
    + <VirtualHost 111.22.33.44>
    + # sunucu A
    + ...
    + </VirtualHost>
    + <VirtualHost 111.22.33.44>
    + # sunucu B
    + ...
    + </VirtualHost>
    +
    + NameVirtualHost 111.22.33.55
    + <VirtualHost 111.22.33.55>
    + # sunucu C
    + ...
    + </VirtualHost>
    + <VirtualHost 111.22.33.55>
    + # sunucu D
    + ...
    + </VirtualHost> +

    + <VirtualHost 111.22.33.44>
    + # sunucu A
    + </VirtualHost>
    + <VirtualHost 111.22.33.55>
    + # sunucu C
    + ...
    + </VirtualHost>
    + <VirtualHost 111.22.33.44>
    + # sunucu B
    + ...
    + </VirtualHost>
    + <VirtualHost 111.22.33.55>
    + # sunucu D
    + ...
    + </VirtualHost>
    +
    + NameVirtualHost 111.22.33.44
    + NameVirtualHost 111.22.33.55
    +
    +

    + + +

    (Okuma kolaylığı bakımından soldaki sürümü tercih etmenizi öneririz.) +

    + +

    VirtualHost yönergesi çözümlendikten sonra sankon + sunucusuna yönergedeki ilk isme atanmış portun öntanımlı olduğu bir + Listen verilir.

    + +

    Eğer tüm VirtualHost isimlerinin listesi aynı adres + kümesine çözümleniyorsa bu isimler birer ServerAlias gibi + ele alınırlar (bir ServerAlias yönergesi ile geçersiz + kılınmadıkça). Bir sankon tanımından sonra gelen Listen + satırlarının o sankonun adres kümesine atanmış portlara bir etkisinin + olmayacağına dikkat ediniz.

    + +

    İsim listeleri IP adreslerine göre gruplanır ve bir çiftler tablosuna + kaydedilir. Eğer IP adresi bir NameVirtualHost yönergesinde + kullanılmışsa, liste bu IP adresi için tanımlanmış tüm sankonları + içerir. Eğer bu IP adresinin tanımlandığı bir sankon yoksa o + NameVirtualHost yönergesi yoksayılır ve günlüğe bir hata + kaydı düşülür. IP’ye dayalı sankonlar için çiftler listesinde isim + alanları boştur.

    + +

    Çiftler listesini işleyen işlevin hızı nedeniyle bir istek sırasında IP + adresine göre gruplama yaparken kaynak harcaması en düşük düzeyde olur + hatta neredeyse hiç olmaz. Ek olarak, tablo, IP adresinin son + sekizlisindeki değişikliklere göre de en iyilenir.

    + +

    Her sankon için bazı değerler öntanımlı olarak atanır. Bunların + başlıcaları:

    + +
      +
    1. Sankon bir ServerAdmin + yönergesi içermiyorsa, + Timeout, + KeepAliveTimeout, + KeepAlive, + MaxKeepAliveRequests, + ReceiveBufferSize ve + SendBufferSize yönergeleri için + öntanımlı değerler ana_sunucudaki eşdeğerlerinden miras alınır. (Yani, + bu yönergeler için ana_sunucudaki son değerler miras alınır.)
    2. + +
    3. Sankon için öntanımlı dizin erişim izinlerinin tanımlandığı "arama + öntanımlıları" ana_sunucununkilere katılır. Buna her modülün dizinlere + özgü yapılandırma bilgileri dahildir.
    4. + +
    5. Her modülün ana_sunucudaki sunuculara özgü yapılandırmaları sankon + sunucusununkilerle katıştırılır.
    6. +
    + +

    Esasen, ana_sunucu, sankon sunucularını oluştururken bir öntanımlılar + listesi veya öntanımlı değerlere dayanak noktası olarak ele alınır. + Fakat bu ana_sunucu tanımlarının yapılandırma dosyasındaki yerlerinin + saptanmasının konumuzla ilgisi yoktur; ana_sunucu yapılandırmasının + tamamı son katıştırma yapılacağı zaman çözümlenir. Bu bakımdan, + ana_sunucu tanımlarından bir kısmı sankon tanımlarından sonra yer alsa + bile sankon tanımlarında etkili olabilir.

    + +

    Eğer, bu noktada ana_sunucu hiçbir ServerName satırı + içermiyorsa httpd programının çalıştığı makinenin + konak ismi öntanımlıdır. Ana_sunucunun ServerName için + yaptığı DNS sorgusundan dönen IP adreslerine ana_sunucu adres + kümesi diyoruz.

    + +

    Tanımsız ServerName alanları için bir isme dayalı sankon, sankonu tanımlayan VirtualHost yönergesinde belirtilen ilk adresi öntanımlı değer kabul eder.

    + +

    Sihirli _default_ sankonları için ana_sunucunun ServerName değeri kullanılır.

    + +
    top
    +
    +

    Sanal Konağın Belirlenmesi

    + +

    Sunucu bir istek durumunda hangi sankonun kullanılacağını şöyle + belirler:

    + +

    Değer çiftleri tablosu aranır

    + +

    Bir istemci tarafından bağlantı ilk yapıldığında önce IP-isim çiftleri + tablosunda istemcinin bağlandığı IP adresi için bir arama yapılır.

    + +

    Arama başarısız olursa (IP adresi yoksa) hizmet, istekte belirtilen + port için bir _default_ sankon varsa, o sankondan, yoksa + ana_sunucudan sunulur.

    + +

    Eğer çiftler tablosunda IP adresi yoksa port numarası ile eşleştirme + çabası ayrıca, diğer isme dayalı sanal konaklardaki gibi ard arda ele + alınmayı gerektiren NameVirtualHost * durumundaki bir + girdiyle sonuçlanabilir.

    + +

    Arama sonucunda tabloda IP adresi bulunursa sonraki adım hizmetin bir + IP’ye dayalı sankondan mı yoksa isme dayalı bir sankondan mı + sunulacağına karar vermektir.

    + + + +

    IP’ye dayalı sankon

    + +

    Eğer tabloda bulduğumuz girdinin isim alanları boşsa bir IP’ye dayalı + sanal konak bulmuşuz demektir. Artık karar vermek için başka bir şey + yapmaya gerek yoktur ve istek bu sankondan sunulur.

    + + + +

    İsme dayalı sankon

    + +

    Tabloda bulduğumuz girdi için bir isim listesi varsa bir isme dayalı + sankon sözkonusudur. Bu isim listesi, sankonları, ilgili + VirtualHost bölümlerinin yapılandırma dosyasında yer alış + sırasına göre içerir.

    + +

    Bu listedeki ilk sankon (yapılandırma dosyasında belirtilen IP adresine + sahip ilk sankon) en yüksek önceliğe sahiptir ve sunucu ismi + belirtilmeyen veya Host: başlık alanı olmayan istekleri bu + sankon karşılar.

    + +

    Eğer istemci bir Host: başlık alanı ile istek yapmışsa + liste bu sankon için aranır ve hizmet ServerName veya + ServerAlias ile ilk eşleşmenin sağlandığı sankondan + sunulur. Host: alanında bir port belirtilebilirse de Apache + daima istemcinin isteği gönderdiği portu gerçek port kabul eder.

    + +

    Eğer istemci Host: başlık alanı bulunmayan bir HTTP/1.0 + isteği yapmışsa istemcinin hangi sankona bağlanmayı denediğini bilemeyiz + ve istekteki URI ile mevcut ServerPath değerini + eşleştirmeye çalışırız. Listedekilerden ilk eşleşen yola sahip sankondan + hizmeti sunarız.

    + +

    İstekle eşleşen bir sankon bulunamazsa IP listesinde istemcinin + bağlandığı portla eşleşen ilk sankondan hizmeti sunarız.

    + + + +

    Kalıcı bağlantılar

    + +

    Yukarıda açıklanan IP araması belli bir TCP/IP oturumunda bir defaya + mahsus yapıldığı halde bir kalıcı/KeepAlive bağlantı sırasında her istek + için ayrı bir arama yapılır. Başka bir deyişle, bir istemci tek bir + kalıcı bağlantı üzerinde farklı isme dayalı sankonlardan sayfa talebinde + bulunabilir.

    + + + +

    Mutlak URI

    + +

    Eğer istekte belirtilen URI bir mutlak URI ise ve istek yapılan konak + ismi ve port ana sunucuyla veya sankonlardan biriyle eşleşiyorsa, + şema/konakadı/port öneki ayrılır ve elde edilen göreli URI ilgili + sankondan veya ana sunucudan sunulur. Eğer bir eşleşme sağlanamazsa + URI’ye dokunulmaz ve istek bir vekil isteği olarak ele alınır.

    + + +

    Ä°zlenimler

    + +
      +
    • Bir isme dayalı sankon asla bir IP’ye dayalı sankon ile (veya tersi) + etkileşime girmez. IP’ye dayalı sankonlara sadece kendi adres + kümesindeki bir IP adresi üzerinden erişilebilir, asla başka bir + adresten erişilemez. Aynısı isme dayalı sankonlara da uygulanır; + onlara sadece bir NameVirtualHost yönergesi ile + tanımlanmış adres kümesindeki bir IP adresi üzerinden + erişilebilir.
    • + +
    • Bir IP’ye dayalı sankon için asla ServerAlias ve + ServerPath değerine bakılmaz.
    • + +
    • Yapılandırma dosyası içinde isme/IP’ye dayalı ve + _default_ sankonlar ile NameVirtualHost + yönergelerinin yer alış sırasının birbirlerine göre bir önemi yoktur. + Sıralama sadece aynı IP adresine sahip isme dayalı sankonlar arasında + önemlidir. Aynı adres kümesine mensup isme dayalı sankonlardan + yapılandırma dosyasında ilk sırada yer alanı en yüksek önceliğe + sahiptir.
    • + +
    • Güvenlik saikiyle, eşleştirme işlemi sırasında Host: + başlık alanında belirtilen port asla kullanılmaz. Apache daima + istemcinin bağlantı kurduğu gerçek portu kullanır.
    • + +
    • Değeri başka bir ServerPath yönergesinin değeri için + önek olan bir ServerPath yönergesi yapılandırma + dosyasında daha önce yer alıyorsa sonrakiyle eşleşme asla + gerçekleşmez. (Bu belirsizliği giderecek bir Host: başlık + alanının mümkün olmadığı varsayılır.)
    • + +
    • Eğer tek bir IP adresine sahip IP’ye dayalı iki sankon varsa eşleşme + daima yapılandırma dosyasında ilk yer alanla gerçekleşir. Böyle bir + şey kasten yapılmaz. Sunucu böyle bir durumu saptadığında hata + günlüğünde bir uyarı verecektir.
    • + +
    • Bir _default_ sankon sadece istekle eşleşen bir IP + adresi bulunamadığında port numarası eşleştiği takdirde isteğe hizmet + sunabilir. Port düzeyinde eşleşmenin olabilmesi için isteğin geldiği + port ile sankon için belirtilen port eşleşmelidir. Olası tüm portlarla + eşleşmeyi sağlamak üzere yıldız imi (_default_:* + şeklinde) kullanılabilir. Aynı şey NameVirtualHost * + sankonlarına da uygulanır.
    • + +
    • Ana_sunucunun bir isteğe hizmet sunabilmesi için istemcinin + bağlandığı IP adresi ve port hiçbir yerde belirtilmemiş ve + _default_ dahil hiçbir sankon ile eşleşme sağlanamamış + olmalıdır. Başka bir deyişle, istemcinin bağlandığı port ile eşleşen + bir _default_ sankon olmadıkça adres ve port belirtmeyen + bir isteğe ana_sunucu yanıt verecektir.
    • + +
    • Host: başlık alanı içermeyen veya hedefi bilinmeyen bir + istek geldiği takdirde, eğer bu istemcinin bağlandığı adres ve port + için (örneğin, NameVirtualHost ile) tanımlanmış bir isme + dayalı sankon varsa bu isteğe ne ana_sunucu ne de bir + _default_ sankon hizmet sunabilir.
    • + +
    • VirtualHost yönergelerinde asla DNS isimleri + belirtmemelisiniz. Aksi takdirde sunucuyu başlatma sırasında DNS + sorgusu yapmaya zorlamış olursunuz. Listelenen tüm alanlar için DNS + üzerinde tam denetime sahip değilseniz bu ayrıca bir güvenlik + tehdidine yol açar. Bu konuda daha ayrıntılı bilgi edinmek için DNS ile ilgili konular ve Apache + belgesine bakınız.
    • + +
    • ServerName her sankon için ayrı ayrı belirlenmiş + olmalıdır. Aksi takdirde her sankon için bir DNS sorgusu gerekir.
    • +
    + + +
    top
    +
    +

    İpuçları

    + +

    DNS konuları sayfasındaki + ipuçlarına ilaveten burada da bazı ipuçları bulacaksınız:

    + +
      +
    • Ana_sunucu tanımlarının hepsini VirtualHost + tanımlarının öncesinde bitirin. Bu ayrıca yapılandırmanızın + okunabilirliğini de arttırır; VirtualHost tanımlarının + sonrasına sarkan yapılandırmaların katıştırılması işlemi tüm sanal + konakları etkileyebilen tanımlar bakımından bir + karışıklığa/belirsizliğe sebep olabilir.)
    • + +
    • Birbirleriyle ilgili NameVirtualHost ve + VirtualHost tanımlarını okunabilirliği arttırmak için + gruplayın.
    • + +
    • Değeri başka bir ServerPath için önek olan tanımlamalar + yapmaktan kaçının. Bundan kaçınamıyorsanız, yolu uzun olanı yolu kısa + olanın öncesine yerleştirin. Örneğin, "ServerPath /abc/def" önce + "ServerPath /abc" sonra yer alsın.
    • +
    + +
    +
    +

    Mevcut Diller:  en  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/vhosts/examples.html b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/examples.html new file mode 100644 index 00000000..ae55ad07 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/examples.html @@ -0,0 +1,13 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: examples.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: examples.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: examples.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/vhosts/examples.html.en b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/examples.html.en new file mode 100644 index 00000000..317294dc --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/examples.html.en @@ -0,0 +1,654 @@ + + + +VirtualHost Examples - Apache HTTP Server + + + + + +
    <-
    +

    VirtualHost Examples

    +
    +

    Available Languages:  en  | + ko  | + tr 

    +
    + + +

    This document attempts to answer the commonly-asked questions about + setting up virtual hosts. These scenarios are those involving multiple + web sites running on a single server, via name-based or IP-based virtual hosts. +

    + +
    + +
    top
    +
    +

    Running several name-based web + sites on a single IP address.

    + +

    Your server has a single IP address, and multiple aliases (CNAMES) + point to this machine in DNS. You want to run a web server for + www.example1.com and www.example2.org on this + machine.

    + +

    Note

    Creating virtual + host configurations on your Apache server does not magically + cause DNS entries to be created for those host names. You + must have the names in DNS, resolving to your IP + address, or nobody else will be able to see your web site. You + can put entries in your hosts file for local + testing, but that will work only from the machine with those + hosts entries.

    +
    + +

    Server configuration

    + + + # Ensure that Apache listens on port 80
    + Listen 80
    +
    + # Listen for virtual host requests on all IP addresses
    + NameVirtualHost *:80
    +
    + <VirtualHost *:80>
    + + DocumentRoot /www/example1
    + ServerName www.example1.com
    +
    + # Other directives here
    +
    +
    + </VirtualHost>
    +
    + <VirtualHost *:80>
    + + DocumentRoot /www/example2
    + ServerName www.example2.org
    +
    + # Other directives here
    +
    +
    + </VirtualHost> +

    + +

    The asterisks match all addresses, so the main server serves no + requests. Due to the fact that www.example1.com is first + in the configuration file, it has the highest priority and can be seen + as the default or primary server. That means + that if a request is received that does not match one of the specified + ServerName directives, it will be served by this first + VirtualHost.

    + +
    +

    Note

    + +

    You can, if you wish, replace * with the actual + IP address of the system. In that case, the argument to + VirtualHost must match the argument to + NameVirtualHost:

    + +

    + NameVirtualHost 172.20.30.40
    +
    + <VirtualHost 172.20.30.40>
    + # etc ... +

    + +

    However, it is additionally useful to use * + on systems where the IP address is not predictable - for + example if you have a dynamic IP address with your ISP, and + you are using some variety of dynamic DNS solution. Since + * matches any IP address, this configuration + would work without changes whenever your IP address + changes.

    +
    + +

    The above configuration is what you will want to use in almost + all name-based virtual hosting situations. The only thing that this + configuration will not work for, in fact, is when you are serving + different content based on differing IP addresses or ports.

    + +
    top
    +
    +

    Name-based hosts on more than one + IP address.

    + +
    +

    Note

    Any of the + techniques discussed here can be extended to any number of IP + addresses.

    +
    + +

    The server has two IP addresses. On one (172.20.30.40), we + will serve the "main" server, server.domain.com and on the + other (172.20.30.50), we will serve two or more virtual hosts.

    + +

    Server configuration

    + + + Listen 80
    +
    + # This is the "main" server running on 172.20.30.40
    + ServerName server.domain.com
    + DocumentRoot /www/mainserver
    +
    + # This is the other address
    + NameVirtualHost 172.20.30.50
    +
    + <VirtualHost 172.20.30.50>
    + + DocumentRoot /www/example1
    + ServerName www.example1.com
    +
    + # Other directives here ...
    +
    +
    + </VirtualHost>
    +
    + <VirtualHost 172.20.30.50>
    + + DocumentRoot /www/example2
    + ServerName www.example2.org
    +
    + # Other directives here ...
    +
    +
    + </VirtualHost> +

    + +

    Any request to an address other than 172.20.30.50 will be + served from the main server. A request to 172.20.30.50 with an + unknown hostname, or no Host: header, will be served from + www.example1.com.

    + +
    top
    +
    +

    Serving the same content on + different IP addresses (such as an internal and external + address).

    + +

    The server machine has two IP addresses (192.168.1.1 + and 172.20.30.40). The machine is sitting between an + internal (intranet) network and an external (internet) network. Outside + of the network, the name server.example.com resolves to + the external address (172.20.30.40), but inside the + network, that same name resolves to the internal address + (192.168.1.1).

    + +

    The server can be made to respond to internal and external requests + with the same content, with just one VirtualHost + section.

    + +

    Server configuration

    + + + NameVirtualHost 192.168.1.1
    + NameVirtualHost 172.20.30.40
    +
    + <VirtualHost 192.168.1.1 172.20.30.40>
    + + DocumentRoot /www/server1
    + ServerName server.example.com
    + ServerAlias server
    +
    + </VirtualHost> +

    + +

    Now requests from both networks will be served from the same + VirtualHost.

    + +
    +

    Note:

    On the internal + network, one can just use the name server rather + than the fully qualified host name + server.example.com.

    + +

    Note also that, in the above example, you can replace the list + of IP addresses with *, which will cause the server to + respond the same on all addresses.

    +
    + +
    top
    +
    +

    Running different sites on different + ports.

    + +

    You have multiple domains going to the same IP and also want to + serve multiple ports. By defining the ports in the "NameVirtualHost" + tag, you can allow this to work. If you try using <VirtualHost + name:port> without the NameVirtualHost name:port or you try to use + the Listen directive, your configuration will not work.

    + +

    Server configuration

    + + + Listen 80
    + Listen 8080
    +
    + NameVirtualHost 172.20.30.40:80
    + NameVirtualHost 172.20.30.40:8080
    +
    + <VirtualHost 172.20.30.40:80>
    + + ServerName www.example1.com
    + DocumentRoot /www/domain-80
    +
    + </VirtualHost>
    +
    + <VirtualHost 172.20.30.40:8080>
    + + ServerName www.example1.com
    + DocumentRoot /www/domain-8080
    +
    + </VirtualHost>
    +
    + <VirtualHost 172.20.30.40:80>
    + + ServerName www.example2.org
    + DocumentRoot /www/otherdomain-80
    +
    + </VirtualHost>
    +
    + <VirtualHost 172.20.30.40:8080>
    + + ServerName www.example2.org
    + DocumentRoot /www/otherdomain-8080
    +
    + </VirtualHost> +

    + +
    top
    +
    +

    IP-based virtual hosting

    + +

    The server has two IP addresses (172.20.30.40 and + 172.20.30.50) which resolve to the names + www.example1.com and www.example2.org + respectively.

    + +

    Server configuration

    + + + Listen 80
    +
    + <VirtualHost 172.20.30.40>
    + + DocumentRoot /www/example1
    + ServerName www.example1.com
    +
    + </VirtualHost>
    +
    + <VirtualHost 172.20.30.50>
    + + DocumentRoot /www/example2
    + ServerName www.example2.org
    +
    + </VirtualHost> +

    + +

    Requests for any address not specified in one of the + <VirtualHost> directives (such as + localhost, for example) will go to the main server, if + there is one.

    + +
    top
    +
    +

    Mixed port-based and ip-based virtual + hosts

    + +

    The server machine has two IP addresses (172.20.30.40 and + 172.20.30.50) which resolve to the names + www.example1.com and www.example2.org + respectively. In each case, we want to run hosts on ports 80 and + 8080.

    + +

    Server configuration

    + + + Listen 172.20.30.40:80
    + Listen 172.20.30.40:8080
    + Listen 172.20.30.50:80
    + Listen 172.20.30.50:8080
    +
    + <VirtualHost 172.20.30.40:80>
    + + DocumentRoot /www/example1-80
    + ServerName www.example1.com
    +
    + </VirtualHost>
    +
    + <VirtualHost 172.20.30.40:8080>
    + + DocumentRoot /www/example1-8080
    + ServerName www.example1.com
    +
    + </VirtualHost>
    +
    + <VirtualHost 172.20.30.50:80>
    + + DocumentRoot /www/example2-80
    + ServerName www.example1.org
    +
    + </VirtualHost>
    +
    + <VirtualHost 172.20.30.50:8080>
    + + DocumentRoot /www/example2-8080
    + ServerName www.example2.org
    +
    + </VirtualHost> +

    + +
    top
    +
    +

    Mixed name-based and IP-based + vhosts

    + +

    On some of my addresses, I want to do name-based virtual hosts, and + on others, IP-based hosts.

    + +

    Server configuration

    + + + Listen 80
    +
    + NameVirtualHost 172.20.30.40
    +
    + <VirtualHost 172.20.30.40>
    + + DocumentRoot /www/example1
    + ServerName www.example1.com
    +
    + </VirtualHost>
    +
    + <VirtualHost 172.20.30.40>
    + + DocumentRoot /www/example2
    + ServerName www.example2.org
    +
    + </VirtualHost>
    +
    + <VirtualHost 172.20.30.40>
    + + DocumentRoot /www/example3
    + ServerName www.example3.net
    +
    + </VirtualHost>
    +
    + # IP-based
    + <VirtualHost 172.20.30.50>
    + + DocumentRoot /www/example4
    + ServerName www.example4.edu
    +
    + </VirtualHost>
    +
    + <VirtualHost 172.20.30.60>
    + + DocumentRoot /www/example5
    + ServerName www.example5.gov
    +
    + </VirtualHost> +

    + +
    top
    +
    +

    Using Virtual_host and + mod_proxy together

    + +

    The following example allows a front-end machine to proxy a + virtual host through to a server running on another machine. In the + example, a virtual host of the same name is configured on a machine + at 192.168.111.2. The ProxyPreserveHost On directive is + used so that the desired hostname is passed through, in case we are + proxying multiple hostnames to a single machine.

    + +

    + <VirtualHost *:*>
    + ProxyPreserveHost On
    + ProxyPass / http://192.168.111.2/
    + ProxyPassReverse / http://192.168.111.2/
    + ServerName hostname.example.com
    + </VirtualHost> +

    + +
    top
    +
    +

    Using _default_ + vhosts

    + +

    _default_ vhosts + for all ports

    + +

    Catching every request to any unspecified IP address and + port, i.e., an address/port combination that is not used for + any other virtual host.

    + +

    Server configuration

    + + + <VirtualHost _default_:*>
    + + DocumentRoot /www/default
    +
    + </VirtualHost> +

    + +

    Using such a default vhost with a wildcard port effectively prevents + any request going to the main server.

    + +

    A default vhost never serves a request that was sent to an + address/port that is used for name-based vhosts. If the request + contained an unknown or no Host: header it is always + served from the primary name-based vhost (the vhost for that + address/port appearing first in the configuration file).

    + +

    You can use AliasMatch or + RewriteRule to rewrite any + request to a single information page (or script).

    + + +

    _default_ vhosts + for different ports

    + +

    Same as setup 1, but the server listens on several ports and we want + to use a second _default_ vhost for port 80.

    + +

    Server configuration

    + + + <VirtualHost _default_:80>
    + + DocumentRoot /www/default80
    + # ...
    +
    + </VirtualHost>
    +
    + <VirtualHost _default_:*>
    + + DocumentRoot /www/default
    + # ...
    +
    + </VirtualHost> +

    + +

    The default vhost for port 80 (which must appear before any + default vhost with a wildcard port) catches all requests that were sent + to an unspecified IP address. The main server is never used to serve a + request.

    + + +

    _default_ vhosts + for one port

    + +

    We want to have a default vhost for port 80, but no other default + vhosts.

    + +

    Server configuration

    + + + <VirtualHost _default_:80>
    + DocumentRoot /www/default
    + ...
    + </VirtualHost> +

    + +

    A request to an unspecified address on port 80 is served from the + default vhost any other request to an unspecified address and port is + served from the main server.

    + + +
    top
    +
    +

    Migrating a name-based vhost to an + IP-based vhost

    + +

    The name-based vhost with the hostname + www.example2.org (from our name-based example, setup 2) should get its own IP + address. To avoid problems with name servers or proxies who cached the + old IP address for the name-based vhost we want to provide both + variants during a migration phase.
    + The solution is easy, because we can simply add the new IP address + (172.20.30.50) to the VirtualHost + directive.

    + +

    Server configuration

    + + + Listen 80
    + ServerName www.example1.com
    + DocumentRoot /www/example1
    +
    + NameVirtualHost 172.20.30.40
    +
    + <VirtualHost 172.20.30.40 172.20.30.50>
    + + DocumentRoot /www/example2
    + ServerName www.example2.org
    + # ...
    +
    + </VirtualHost>
    +
    + <VirtualHost 172.20.30.40>
    + + DocumentRoot /www/example3
    + ServerName www.example3.net
    + ServerAlias *.example3.net
    + # ...
    +
    + </VirtualHost> +

    + +

    The vhost can now be accessed through the new address (as an + IP-based vhost) and through the old address (as a name-based + vhost).

    + +
    top
    +
    +

    Using the ServerPath + directive

    + +

    We have a server with two name-based vhosts. In order to match the + correct virtual host a client must send the correct Host: + header. Old HTTP/1.0 clients do not send such a header and Apache has + no clue what vhost the client tried to reach (and serves the request + from the primary vhost). To provide as much backward compatibility as + possible we create a primary vhost which returns a single page + containing links with an URL prefix to the name-based virtual + hosts.

    + +

    Server configuration

    + + + NameVirtualHost 172.20.30.40
    +
    + <VirtualHost 172.20.30.40>
    + + # primary vhost
    + DocumentRoot /www/subdomain
    + RewriteEngine On
    + RewriteRule ^/.* /www/subdomain/index.html
    + # ...
    +
    + </VirtualHost>
    +
    + <VirtualHost 172.20.30.40>
    + DocumentRoot /www/subdomain/sub1
    + + ServerName www.sub1.domain.tld
    + ServerPath /sub1/
    + RewriteEngine On
    + RewriteRule ^(/sub1/.*) /www/subdomain$1
    + # ...
    +
    + </VirtualHost>
    +
    + <VirtualHost 172.20.30.40>
    + + DocumentRoot /www/subdomain/sub2
    + ServerName www.sub2.domain.tld
    + ServerPath /sub2/
    + RewriteEngine On
    + RewriteRule ^(/sub2/.*) /www/subdomain$1
    + # ...
    +
    + </VirtualHost> +

    + +

    Due to the ServerPath + directive a request to the URL + http://www.sub1.domain.tld/sub1/ is always served + from the sub1-vhost.
    A request to the URL + http://www.sub1.domain.tld/ is only + served from the sub1-vhost if the client sent a correct + Host: header. If no Host: header is sent the + client gets the information page from the primary host.
    + Please note that there is one oddity: A request to + http://www.sub2.domain.tld/sub1/ is also served from the + sub1-vhost if the client sent no Host: header.
    + The RewriteRule directives + are used to make sure that a client which sent a correct + Host: header can use both URL variants, i.e., + with or without URL prefix.

    + +
    +
    +

    Available Languages:  en  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/vhosts/examples.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/examples.html.ko.euc-kr new file mode 100644 index 00000000..553a9d4a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/examples.html.ko.euc-kr @@ -0,0 +1,622 @@ + + + +°¡»óÈ£½ºÆ® ¿¹ - Apache HTTP Server + + + + + +
    <-
    +

    °¡»óÈ£½ºÆ® ¿¹

    +
    +

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

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

    ÀÌ ¹®¼­´Â ÀÚÁÖ ¹®ÀǵǴ °¡»óÈ£½ºÆ® + Áú¹®¿¡ ´äÀ» ÇÏ·Á°í ¾²¿©Á³´Ù. »óȲÀº À̸§±â¹ÝÀ̳ª IP±â¹Ý °¡»óÈ£½ºÆ®¸¦ ÅëÇØ ÇÑ ¼­¹ö¿¡¼­ + ¿©·¯ À¥»çÀÌÆ®¸¦ ¼­ºñ½ºÇÏ·Á´Â °æ¿ìÀÌ´Ù. ÇÑ ÇÁ·Ï½Ã ¼­¹ö µÚ¿¡¼­ + ¿©·¯ ¼­¹ö¸¦ »ç¿ëÇÏ¿© »çÀÌÆ®¸¦ ¿î¿µÇÏ´Â °æ¿ì¸¦ ´Ù·é ¹®¼­µµ + °ð ³ª¿Ã °ÍÀÌ´Ù.

    + +
    + +
    top
    +
    +

    IP ÁÖ¼Ò ÇÑ°³¿¡ ¿©·¯ À̸§±â¹Ý + À¥»çÀÌÆ® ¿î¿µÇϱâ.

    + +

    ¼­¹ö¿¡ IP ÁÖ¼Ò°¡ ÇÑ°³ ÀÖ°í, DNS¿¡¼­ ¿©·¯ ÁÖ¼Ò(CNAMES)°¡ + ÀÌ ÄÄÇ»Å͸¦ °¡¸®Å²´Ù. ÀÌ ÄÄÇ»ÅÍ¿¡¼­ www.example1.com°ú + www.example2.orgÀÇ À¥¼­¹ö¸¦ ½ÇÇàÇÏ°í ½Í´Ù.

    + +

    Note

    ¾ÆÆÄÄ¡ ¼­¹ö¿¡ °¡»óÈ£½ºÆ® ¼³Á¤À» + ÇÑ´Ù°í ±× È£½ºÆ®¸í¿¡ ´ëÇÑ DNS Ç׸ñÀÌ ÀÚµ¿ÀÌ·Î »ý¼ºµÇÁö + ¾Ê´Â´Ù. ¹Ýµå½Ã DNS¿¡ IP ÁÖ¼Ò¸¦ °¡¸®Å°´Â + À̸§ÀÌ ÀÖ¾î¾ß ÇÑ´Ù. ¾È±×·¯¸é ¾Æ¹«µµ À¥»çÀÌÆ®¸¦ º¼ + ¼ö ¾ø´Ù. °Ë»çÇغ¸±â À§ÇØ hosts ÆÄÀÏ¿¡ Ç׸ñÀ» + Ãß°¡ÇÒ ¼ö ÀÖÁö¸¸, ÀÌ´Â hosts Ç׸ñÀ» °¡Áø ÄÄÇ»ÅÍ¿¡¸¸ + ¹Ý¿µµÈ´Ù.

    +
    + +

    ¼­¹ö ¼³Á¤

    + + + # ¾ÆÆÄÄ¡°¡ Æ÷Æ® 80À» ±â´Ù¸°´Ù
    + Listen 80
    +
    + # ¸ðµç IP ÁÖ¼Ò¿¡¼­ °¡»óÈ£½ºÆ® ¿äûÀ» ±â´Ù¸°´Ù
    + NameVirtualHost *:80
    +
    + <VirtualHost *:80>
    + + DocumentRoot /www/example1
    + ServerName www.example1.com
    +
    + # ´Ù¸¥ Áö½Ã¾îµéµµ ÀÖ´Ù
    +
    +
    + </VirtualHost>
    +
    + <VirtualHost *:80>
    + + DocumentRoot /www/example2
    + ServerName www.example2.org
    +
    + # ´Ù¸¥ Áö½Ã¾îµéµµ ÀÖ´Ù
    +
    +
    + </VirtualHost> +

    + +

    º°Ç¥´Â ¸ðµç ÁÖ¼Ò¸¦ °¡¸®Å°¹Ç·Î, ÁÖ¼­¹ö´Â ¾î¶² ¿äûµµ + ¼­ºñ½ºÇÏÁö ¾Ê´Â´Ù. www.example1.comÀÌ + ¼³Á¤ÆÄÀÏ¿¡ óÀ½À¸·Î ³ª¿À¹Ç·Î °¡Àå ³ôÀº ¿ì¼±¼øÀ§¸¦ °¡Áö¸ç, + ±âº»È¤Àº Ãʱ⠼­¹ö°¡ µÈ´Ù. + ¾î¶² ServerName Áö½Ã¾î¿¡µµ ÇØ´çµÇÁö¾Ê´Â ¿äûÀº + ù¹ø° VirtualHost°¡ ¼­ºñ½ºÇÑ´Ù.

    + +
    +

    ÁÖÀÇ

    + +

    ¿øÇÑ´Ù¸é * ´ë½Å ½Ã½ºÅÛÀÇ ½ÇÁ¦ IP + ÁÖ¼Ò¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Ù. ÀÌ °æ¿ì + VirtualHostÀÇ ¾Æ±Ô¸ÕÆ®´Â + NameVirtualHostÀÇ ¾Æ±Ô¸ÕÆ®¿Í ÀÏÄ¡ÇØ¾ß + ÇÑ´Ù:

    + +

    + NameVirtualHost 172.20.30.40
    +
    + <VirtualHost 172.20.30.40>
    + # »ý·« ... +

    + +

    ±×·¯³ª ISP¿¡¼­ µ¿ÀûÀ¸·Î IP ÁÖ¼Ò¸¦ °¡Á®¿À´Â µî + IP ÁÖ¼Ò¸¦ ¸ð¸£´Â °æ¿ì¿¡´Â *¸¦ »ç¿ëÇÏ´Â + °ÍÀÌ À¯¿ëÇÏ´Ù. *´Â ¸ðµç IP ÁÖ¼Ò¿¡ + ÇØ´çÇϹǷÎ, IP ÁÖ¼Ò°¡ º¯°æµÇ¾îµµ ¼³Á¤À» º¯°æÇÒ + ÇÊ¿ä°¡ ¾ø´Ù.

    +
    + +

    °ÅÀÇ ´ëºÎºÐÀÇ À̸§±â¹Ý °¡»óÈ£½ºÆ® ¼³Á¤Àº À§¿Í °°´Ù. + ¿¹¿Ü´Â ´Ù¸¥ IP ÁÖ¼Ò³ª Æ÷Æ®·Î ´Ù¸¥ ³»¿ëÀ» ¼­ºñ½ºÇÏ·Á´Â + °æ¿ìÀÌ´Ù.

    + +
    top
    +
    +

    ¿©·¯ IP ÁÖ¼Ò¿¡¼­ À̸§±â¹Ý + È£½ºÆ®.

    + +
    +

    ÁÖÀÇ

    ¿©±â¼­ ¼³¸íÇÑ ¹æ¹ýÀº IP ÁÖ¼Ò°¡ + ¸î°³¶óµµ Àû¿ë°¡´ÉÇÏ´Ù.

    +
    + +

    ¼­¹ö´Â IP ÁÖ¼Ò°¡ µÎ°³ÀÖ´Ù. Çϳª¿¡¼­ + (172.20.30.40) "ÁÖ" ¼­¹ö + server.domain.comÀ» ¼­ºñ½ºÇÏ°í, ´Ù¸¥ Çϳª¿¡¼­ + (172.20.30.50) ¿©·¯ °¡»óÈ£½ºÆ®¸¦ ¼­ºñ½ºÇÒ + °ÍÀÌ´Ù.

    + +

    ¼­¹ö ¼³Á¤

    + + + Listen 80
    +
    + # 172.20.30.40¿¡¼­ ½ÇÇàÇÏ´Â "ÁÖ"¼­¹öÀÌ´Ù
    + ServerName server.domain.com
    + DocumentRoot /www/mainserver
    +
    + # ´Ù¸¥ ÁÖ¼Ò´Ù
    + NameVirtualHost 172.20.30.50
    +
    + <VirtualHost 172.20.30.50>
    + + DocumentRoot /www/example1
    + ServerName www.example1.com
    +
    + # ´Ù¸¥ Áö½Ã¾îµéµµ ÀÖ´Ù ...
    +
    +
    + </VirtualHost>
    +
    + <VirtualHost 172.20.30.50>
    + + DocumentRoot /www/example2
    + ServerName www.example2.org
    +
    + # ´Ù¸¥ Áö½Ã¾îµéµµ ÀÖ´Ù ...
    +
    +
    + </VirtualHost> +

    + +

    172.20.30.50ÀÌ ¾Æ´Ñ ÁÖ¼Ò¿¡ ´ëÇÑ ¿äûÀº + ÁÖ¼­¹ö°¡ ¼­ºñ½ºÇÑ´Ù. È£½ºÆ®¸í ¾øÀÌ, Áï Host: + Çì´õ¾øÀÌ 172.20.30.50·Î ¿äûÇϸé + www.example1.comÀÌ ¼­ºñ½ºÇÑ´Ù.

    + +
    top
    +
    +

    (³»ºÎ¿Í ¿ÜºÎ ÁÖ¼Ò¿Í °°ÀÌ) + ´Ù¸¥ IP ÁÖ¼Ò·Î °°Àº ³»¿ëÀ» ¼­ºñ½ºÇϱâ.

    + +

    ¼­¹ö ÄÄÇ»ÅÍ¿¡ IP ÁÖ¼Ò°¡ µÎ°³ (192.168.1.1°ú + 172.20.30.40) ÀÖ´Ù. ÄÄÇ»ÅÍ´Â ³»ºÎ (ÀÎÆ®¶ó³Ý) + ³×Æ®¿÷°ú ¿ÜºÎ (ÀÎÅͳÝ) ³×Æ®¿÷ »çÀÌ¿¡ À§Ä¡ÇÑ´Ù. ³×Æ®¿÷ ¹Û¿¡¼­ + server.example.comÀº ¿ÜºÎ ÁÖ¼Ò¸¦ + (172.20.30.40) ÀǹÌÇÏ°í, ³×Æ®¿÷ ³»ºÎ¿¡¼­ °°Àº + À̸§À» ³»ºÎ ÁÖ¼Ò·Î (192.168.1.1) »ç¿ëÇÑ´Ù.

    + +

    ¼­¹ö´Â VirtualHost ¼½¼Ç ÇÑ°³·Î ³»ºÎ¿Í ¿ÜºÎ + ÀÀ´ä¿¡ °°Àº ³»¿ëÀ» ¼­ºñ½ºÇÒ ¼ö ÀÖ´Ù.

    + +

    ¼­¹ö ¼³Á¤

    + + + NameVirtualHost 192.168.1.1
    + NameVirtualHost 172.20.30.40
    +
    + <VirtualHost 192.168.1.1 172.20.30.40>
    + + DocumentRoot /www/server1
    + ServerName server.example.com
    + ServerAlias server
    +
    + </VirtualHost> +

    + +

    ÀÌÁ¦ µÎ ³×Æ®¿÷¿¡¼­ µé¾î¿Â ¿äûÀ» °°Àº + VirtualHost¿¡¼­ ¼­ºñ½ºÇÑ´Ù.

    + +
    +

    ÁÖÀÇ:

    ³»ºÎ ³×Æ®¿÷¿¡¼­´Â ¿ÏÀüÇÑ È£½ºÆ®¸í + server.example.com ´ë½Å À̸§ + serverµµ °¡´ÉÇÏ´Ù.

    + +

    ¶ÇÇÑ À§ÀÇ ¿¹¿¡¼­ IP ÁÖ¼Ò ´ë½Å *À» + »ç¿ëÇÏ¿© ¼­¹ö°¡ ¸ðµç ÁÖ¼Ò¿¡ µ¿ÀÏÇÏ°Ô µ¿ÀÛÇÒ ¼ö + ÀÖ´Ù.

    +
    + +
    top
    +
    +

    ¿©·¯ Æ÷Æ®¿¡¼­ ¼­·Î ´Ù¸¥ »çÀÌÆ® + ¿î¿µÇϱâ.

    + +

    °°Àº IPÀÇ ¿©·¯ Æ÷Æ®¿¡¼­ ¼­·Î ´Ù¸¥ µµ¸ÞÀÎÀ» ¼­ºñ½ºÇÑ´Ù°í + °¡Á¤ÇÏÀÚ. ÀÌ´Â "NameVirtualHost" ű׿¡ Æ÷Æ®¸¦ Á¤ÀÇÇϸé + °¡´ÉÇÏ´Ù. NameVirtualHost name:port¾øÀÌ <VirtualHost + name:port>¸¸ ȤÀº Listen Áö½Ã¾î¸¸ »ç¿ëÇÏ¸é ¾ÈµÈ´Ù.

    + +

    ¼­¹ö ¼³Á¤

    + + + Listen 80
    + Listen 8080
    +
    + NameVirtualHost 172.20.30.40:80
    + NameVirtualHost 172.20.30.40:8080
    +
    + <VirtualHost 172.20.30.40:80>
    + + ServerName www.example1.com
    + DocumentRoot /www/domain-80
    +
    + </VirtualHost>
    +
    + <VirtualHost 172.20.30.40:8080>
    + + ServerName www.example1.com
    + DocumentRoot /www/domain-8080
    +
    + </VirtualHost>
    +
    + <VirtualHost 172.20.30.40:80>
    + + ServerName www.example2.org
    + DocumentRoot /www/otherdomain-80
    +
    + </VirtualHost>
    +
    + <VirtualHost 172.20.30.40:8080>
    + + ServerName www.example2.org
    + DocumentRoot /www/otherdomain-8080
    +
    + </VirtualHost> +

    + +
    top
    +
    +

    IP±â¹Ý °¡»óÈ£½ºÆ®

    + +

    ¼­¹ö´Â °¢°¢ www.example1.com°ú + www.example2.org¿¡ ÇØ´çÇÏ´Â µÎ IP ÁÖ¼Ò¸¦ + (172.20.30.40°ú 172.20.30.50) + °¡Áø´Ù.

    + +

    ¼­¹ö ¼³Á¤

    + + + Listen 80
    +
    + <VirtualHost 172.20.30.40>
    + + DocumentRoot /www/example1
    + ServerName www.example1.com
    +
    + </VirtualHost>
    +
    + <VirtualHost 172.20.30.50>
    + + DocumentRoot /www/example2
    + ServerName www.example2.org
    +
    + </VirtualHost> +

    + +

    <VirtualHost> Áö½Ã¾î·Î ÁöÁ¤ÇÑ ÁÖ¼Ò¿¡ + ÇØ´çÇÏÁö¾Ê´Â ÁÖ¼Ò·Î (¿¹¸¦ µé¾î, localhost) + ¿äûÀÌ µé¾î¿À¸é ÁÖ¼­¹ö°¡ ÀÖ´Â °æ¿ì ÁÖ¼­¹ö°¡ ¼­ºñ½ºÇÑ´Ù.

    + +
    top
    +
    +

    Æ÷Æ®±â¹Ý°ú ip±â¹ÝÀÌ È¥ÇÕµÈ + °¡»óÈ£½ºÆ®

    + +

    ¼­¹ö´Â °¢°¢ www.example1.com°ú + www.example2.org¿¡ ÇØ´çÇÏ´Â µÎ IP ÁÖ¼Ò¸¦ + (172.20.30.40°ú 172.20.30.50) + °¡Áø´Ù. °¢ IPÀÇ 80¹ø°ú 8080¹ø Æ÷Æ®¿¡ °¡»óÈ£½ºÆ®¸¦ µ¹¸°´Ù.

    + +

    ¼­¹ö ¼³Á¤

    + + + Listen 172.20.30.40:80
    + Listen 172.20.30.40:8080
    + Listen 172.20.30.50:80
    + Listen 172.20.30.50:8080
    +
    + <VirtualHost 172.20.30.40:80>
    + + DocumentRoot /www/example1-80
    + ServerName www.example1.com
    +
    + </VirtualHost>
    +
    + <VirtualHost 172.20.30.40:8080>
    + + DocumentRoot /www/example1-8080
    + ServerName www.example1.com
    +
    + </VirtualHost>
    +
    + <VirtualHost 172.20.30.50:80>
    + + DocumentRoot /www/example2-80
    + ServerName www.example1.org
    +
    + </VirtualHost>
    +
    + <VirtualHost 172.20.30.50:8080>
    + + DocumentRoot /www/example2-8080
    + ServerName www.example2.org
    +
    + </VirtualHost> +

    + +
    top
    +
    +

    À̸§±â¹Ý°ú IP±â¹ÝÀÌ È¥ÇÕµÈ + °¡»óÈ£½ºÆ®

    + +

    ÁÖ¼ÒÁß ¸î¸îÀº À̸§±â¹Ý °¡»óÈ£½ºÆ®·Î, ´Ù¸¥ °ÍÀº IP±â¹Ý + °¡»óÈ£½ºÆ®·Î ¼­ºñ½ºÇÏ°í ½Í´Ù.

    + +

    ¼­¹ö ¼³Á¤

    + + + Listen 80
    +
    + NameVirtualHost 172.20.30.40
    +
    + <VirtualHost 172.20.30.40>
    + + DocumentRoot /www/example1
    + ServerName www.example1.com
    +
    + </VirtualHost>
    +
    + <VirtualHost 172.20.30.40>
    + + DocumentRoot /www/example2
    + ServerName www.example2.org
    +
    + </VirtualHost>
    +
    + <VirtualHost 172.20.30.40>
    + + DocumentRoot /www/example3
    + ServerName www.example3.net
    +
    + </VirtualHost>
    +
    + # IP-±â¹Ý
    + <VirtualHost 172.20.30.50>
    + + DocumentRoot /www/example4
    + ServerName www.example4.edu
    +
    + </VirtualHost>
    +
    + <VirtualHost 172.20.30.60>
    + + DocumentRoot /www/example5
    + ServerName www.example5.gov
    +
    + </VirtualHost> +

    + +
    top
    +
    +

    _default_ °¡»óÈ£½ºÆ® + »ç¿ëÇϱâ

    + +

    ¸ðµç Æ÷Æ®¿¡ ´ëÇÑ + _default_ °¡»óÈ£½ºÆ®

    + +

    ¾î¶² °¡»óÈ£½ºÆ®¿¡µµ ÇØ´çÇÏÁö¾ÊÀº IP ÁÖ¼Ò¿Í Æ÷Æ®¿¡ ´ëÇÑ + ¸ðµç ¿äûÀ» ó¸®Çϱâ.

    + +

    ¼­¹ö ¼³Á¤

    + + + <VirtualHost _default_:*>
    + + DocumentRoot /www/default
    +
    + </VirtualHost> +

    + +

    default(±âº») °¡»óÈ£½ºÆ®ÀÇ Æ÷Æ®·Î ¿ÍÀϵåÄ«µå¸¦ »ç¿ëÇÏ¿© ¾î¶² ¿äûµµ + ÁÖ¼­¹ö·Î ¸ø°¡µµ·Ï ¸¸µç´Ù.

    + +

    default °¡»óÈ£½ºÆ®´Â Àý´ë·Î À̸§±â¹Ý °¡»óÈ£½ºÆ®°¡ »ç¿ëÇÏ´Â + ÁÖ¼Ò/Æ÷Æ®·ÎÀÇ ¿äûÀ» ¼­ºñ½ºÇÏÁö ¾Ê´Â´Ù. ¾Ë ¼ö ¾ø°Å³ª + Host: Çì´õ°¡ »ý·«µÈ ¿äûÀº Ç×»ó ÃÖÃÊÀÇ À̸§±â¹Ý + °¡»óÈ£½ºÆ®(¼³Á¤ÆÄÀÏ¿¡¼­ + ÁÖ¼Ò/Æ÷Æ®°¡ óÀ½À¸·Î ³ª¿Â °¡»óÈ£½ºÆ®)°¡ ¼­ºñ½ºÇÑ´Ù.

    + +

    AliasMatch³ª + RewriteRuleÀ» + »ç¿ëÇÏ¿© ¾î¶² ¿äûÀ» ƯÁ¤ ÆäÀÌÁö(ȤÀº ½ºÅ©¸³Æ®)·Î + ÀçÀÛ¼ºÇÒ(rewrite) ¼ö ÀÖ´Ù.

    + + +

    ¿©·¯ Æ÷Æ®¿¡ ´ëÇÑ + _default_ °¡»óÈ£½ºÆ®

    + +

    À§ÀÇ °æ¿ì¿Í °°Áö¸¸, ¼­¹ö´Â ¿©·¯ Æ÷Æ®¸¦ ±â´Ù¸®°í 80¹ø + Æ÷Æ®¿¡ ´ëÇؼ­ Ãß°¡·Î _default_ °¡»óÈ£½ºÆ®¸¦ + »ç¿ëÇÏ°í ½Í´Ù.

    + +

    ¼­¹ö ¼³Á¤

    + + + <VirtualHost _default_:80>
    + + DocumentRoot /www/default80
    + # ...
    +
    + </VirtualHost>
    +
    + <VirtualHost _default_:*>
    + + DocumentRoot /www/default
    + # ...
    +
    + </VirtualHost> +

    + +

    80¹ø Æ÷Æ®¿¡ ´ëÇÑ default °¡»óÈ£½ºÆ®´Â (¹Ýµå½Ã + ¿ÍÀϵåÄ«µå Æ÷Æ®¸¦ °¡Áø ±âº» °¡»óÈ£½ºÆ® ÀÌÀü¿¡ ³ª¿Í¾ß ÇÑ´Ù) + ÁöÁ¤ÇÏÁö¾ÊÀº IP ÁÖ¼Ò·Î º¸³»Áø ¸ðµç ¿äûÀ» ¼­ºñ½ºÇÑ´Ù. + ÁÖ¼­¹ö´Â Àý´ë·Î ¿äûÀ» ¼­ºñ½ºÇÏÁö ¸øÇÑ´Ù.

    + + +

    ÇÑ Æ÷Æ®¿¡ ´ëÇÑ + _default_ °¡»óÈ£½ºÆ®

    + +

    80¹ø Æ÷Æ®¿¡ ´ëÇؼ­¸¸ default °¡»óÈ£½ºÆ®¸¦ ¸¸µé°í ½Í´Ù.

    + +

    ¼­¹ö ¼³Á¤

    + + + <VirtualHost _default_:80>
    + DocumentRoot /www/default
    + ...
    + </VirtualHost> +

    + +

    Æ÷Æ® 80¹ø¿¡ ÁöÁ¤ÇÏÁö¾ÊÀº ÁÖ¼Ò¿¡ ´ëÇÑ ¿äûÀº ±âº» + °¡»óÈ£½ºÆ®°¡ ¼­ºñ½ºÇÏ°í, ´Ù¸¥ ÁöÁ¤ÇÏÁö¾ÊÀº ÁÖ¼Ò¿Í Æ÷Æ®¸¦ + °¡Áø ¿äûÀº ÁÖ ¼­¹ö°¡ ¼­ºñ½ºÇÑ´Ù.

    + + +
    top
    +
    +

    À̸§±â¹Ý °¡»óÈ£½ºÆ®¸¦ IP±â¹Ý + °¡»óÈ£½ºÆ®·Î ¿Å±â±â

    + +

    (À̸§±â¹ÝÀÇ Ã¹¹ø° ¿¹¿¡¼­) È£½ºÆ®¸í + www.example2.org¿¡ ´ëÇÑ À̸§±â¹Ý °¡»óÈ£½ºÆ®´Â + ÀÚ½ÅÀÇ IP ÁÖ¼Ò¸¦ °¡Á®¾ß ÇÑ´Ù. À̸§±â¹Ý °¡»óÈ£½ºÆ®ÀÇ ÀÌÀü + IP ÁÖ¼Ò¸¦ ij½ÌÇÏ´Â ³×ÀÓ¼­¹ö³ª ÇÁ·Ï½Ã¿ÍÀÇ ¹®Á¦¸¦ ÇÇÇϱâÀ§ÇØ + ¿Å±â´Â µ¿¾È µÑ ¸ðµÎ¸¦ ¼­ºñ½ºÇÏ°í ½Í´Ù.
    ¹æ¹ýÀº + VirtualHost Áö½Ã¾î¿¡ »õ IP ÁÖ¼Ò¸¸À» + (172.20.30.50) Ãß°¡ÇϸéµÇ¹Ç·Î ½±´Ù.

    + +

    ¼­¹ö ¼³Á¤

    + + + Listen 80
    + ServerName www.example1.com
    + DocumentRoot /www/example1
    +
    + NameVirtualHost 172.20.30.40
    +
    + <VirtualHost 172.20.30.40 172.20.30.50>
    + + DocumentRoot /www/example2
    + ServerName www.example2.org
    + # ...
    +
    + </VirtualHost>
    +
    + <VirtualHost 172.20.30.40>
    + + DocumentRoot /www/example3
    + ServerName www.example3.net
    + ServerAlias *.example3.net
    + # ...
    +
    + </VirtualHost> +

    + +

    ÀÌÁ¦ (IP±â¹Ý °¡»óÈ£½ºÆ®¸¦ ÅëÇÑ) »õ·Î¿î ÁÖ¼Ò¿Í (À̸§±â¹Ý + °¡»óÈ£½ºÆ®¸¦ ÅëÇÑ) ÀÌÀü ÁÖ¼Ò ¸ðµÎ °¡»óÈ£½ºÆ®¿¡ Á¢±ÙÇÒ + ¼ö ÀÖ´Ù.

    + +
    top
    +
    +

    ServerPath + Áö½Ã¾î »ç¿ëÇϱâ

    + +

    µÎ À̸§±â¹Ý °¡»óÈ£½ºÆ®¸¦ °¡Áø ¼­¹ö°¡ ÀÖ´Ù. ¿Ã¹Ù¸¥ + °¡»óÈ£½ºÆ®¸¦ ¼±ÅÃÇϱâÀ§ÇØ Å¬¶óÀ̾ðÆ®´Â ¿Ã¹Ù¸¥ + Host: Çì´õ¸¦ º¸³»¾ß ÇÑ´Ù. ¿À·¡µÈ HTTP/1.0 + Ŭ¶óÀ̾ðÆ®°¡ ÀÌ Çì´õ¸¦ º¸³»Áö ¸øÇÏ¸é ¾ÆÆÄÄ¡´Â Ŭ¶óÀ̾ðÆ®°¡ + ¾î¶² °¡»óÈ£½ºÆ®¸¦ º¸·Á°íÇÏ´ÂÁö ¾Ë ¼ö ¾ø´Ù (±×·¡¼­ ÃÖÃÊÀÇ + °¡»óÈ£½ºÆ®°¡ ¿äûÀ» ¼­ºñ½ºÇÑ´Ù). ¿À·¡µÈ ºê¶ó¿ìÀú¿Í °¡´ÉÇÑ È£È¯À» + À¯ÁöÇϱâÀ§ÇØ ÃÖÃÊÀÇ °¡»óÈ£½ºÆ®¸¦ ¸¸µé°í, ¿©±â¿¡ À̸§±â¹Ý + °¡»óÈ£½ºÆ®ÀÇ URL Á¢µÎ»ç¸¦ Æ÷ÇÔÇÏ´Â ¸µÅ© ¸ñ·Ï ÆäÀÌÁö¸¦ + µÐ´Ù.

    + +

    ¼­¹ö ¼³Á¤

    + + + NameVirtualHost 172.20.30.40
    +
    + <VirtualHost 172.20.30.40>
    + + # primary vhost
    + DocumentRoot /www/subdomain
    + RewriteEngine On
    + RewriteRule ^/.* /www/subdomain/index.html
    + # ...
    +
    + </VirtualHost>
    +
    + <VirtualHost 172.20.30.40>
    + DocumentRoot /www/subdomain/sub1
    + + ServerName www.sub1.domain.tld
    + ServerPath /sub1/
    + RewriteEngine On
    + RewriteRule ^(/sub1/.*) /www/subdomain$1
    + # ...
    +
    + </VirtualHost>
    +
    + <VirtualHost 172.20.30.40>
    + + DocumentRoot /www/subdomain/sub2
    + ServerName www.sub2.domain.tld
    + ServerPath /sub2/
    + RewriteEngine On
    + RewriteRule ^(/sub2/.*) /www/subdomain$1
    + # ...
    +
    + </VirtualHost> +

    + +

    ServerPath Áö½Ã¾î¶§¹®¿¡ + URL http://www.sub1.domain.tld/sub1/¿¡ ´ëÇÑ + ¿äûÀº Ç×»ó subl-°¡»óÈ£½ºÆ®°¡ ¼­ºñ½ºÇÑ´Ù.
    + Ŭ¶óÀ̾ðÆ®°¡ ¿Ã¹Ù¸¥ Host: Çì´õ¸¦ º¸³½´Ù¸é, + URL http://www.sub1.domain.tld/¿¡ ´ëÇÑ ¿äûÀº + subl-°¡»óÈ£½ºÆ®¿¡¼­¸¸ ¼­ºñ½ºÇÑ´Ù. ¸¸¾à Host: Çì´õ¸¦ + º¸³»Áö¾ÊÀ¸¸é Ŭ¶óÀ̾ðÆ®´Â ÃÖÃÊÀÇ È£½ºÆ®¿¡ ÀÖ´Â Á¤º¸ÆäÀÌÁö¸¦ + º¸°ÔµÈ´Ù.
    ¿©±â¿¡ ¹®Á¦°¡ ÀÖÀ½À» ÁÖÀÇÇ϶ó: Ŭ¶óÀ̾ðÆ®°¡ + Host: Çì´õ¸¦ º¸³»Áö¾ÊÀ¸¸é + http://www.sub2.domain.tld/sub1/¿¡ ´ëÇÑ ¿äûµµ + subl-°¡»óÈ£½ºÆ®°¡ ¼­ºñ½ºÇÑ´Ù.
    + RewriteRule + Áö½Ã¾î¸¦ »ç¿ëÇÏ¿© ¿Ã¹Ù¸¥ Host: Çì´õ¸¦ º¸³»´Â + Ŭ¶óÀ̾ðÆ®´Â (¿¹¸¦ µé¾î, URL ÀüÄ¡»ç°¡ Àְųª ¾ø´Â) + µÎ URLÀ» ¸ðµÎ »ç¿ëÇÒ ¼ö ÀÖ´Ù.

    + +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/vhosts/examples.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/examples.html.tr.utf8 new file mode 100644 index 00000000..044bf8e6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/examples.html.tr.utf8 @@ -0,0 +1,641 @@ + + + +Sanal Konak Örnekleri - Apache HTTP Sunucusu + + + + + +
    <-
    +

    Sanal Konak Örnekleri

    +
    +

    Mevcut Diller:  en  | + ko  | + tr 

    +
    + + +

    Bu belgede sanal konaklarla ile ilgili olarak karşılaşılması olası tüm + senaryolara yer verilmeye çalışılmıştır. Buradaki senaryolar, tek bir + sunucu üzerinde isme dayalı veya IP’ye dayalı sanal konaklar aracılığıyla çok + sayıda sitenin sunumu ile ilgilidir. +

    + +
    + +
    top
    +
    +

    Tek bir IP ile çok sayıda isme dayalı site

    + + +

    Bu örnekte, makinenizin tek bir IP adresine sahip olduğunu ve bu + makineye mesela.dom ve faraza.dom şeklinde + (DNS A kayıtları sayesinde) farklı isimlerle erişilebildiğini + varsayalım.

    + +

    Bilginize

    Apache sunucusu üzerinde sanal konakları + yapılandırmakla bu konak isimleri için sihirli bir şekilde DNS + kayıtlarının da oluşturulmasını sağlamış olmazsınız. Bu isimler için + ilgili DNS kayıtlarında sizin IP adresinize çözümlenen A kayıtlarının + olması gerekir, yoksa sitenize kimse erişemez. Sitelere erişimi yerel + olarak denemek isterseniz, bu girdileri hosts dosyanıza + yazabilirsiniz. Fakat bu sadece sizin makinenizde çalışır. Yerel + ağınızdaki her makinenin hosts dosyasına bu girdileri + yazarak yerel ağdan erişimi bu yolla sağlayabilirsiniz ama dış ağdan + gelecek ziyaretçileriniz için DNS kayıtlarınızın olması şarttır.

    +
    + +

    Sunucu yapılandırması

    + + # Apache’nin 80. portu dinlediğinden emin olalım
    + Listen 80
    +
    + # Sanal konak istekleri için bütün IP adresleri dinlensin.
    + NameVirtualHost *:80
    +
    + <VirtualHost *:80>
    + + DocumentRoot /siteler/mesela
    + ServerName mesela.dom
    +
    + # Diğer yönergeler, burada ...
    +
    +
    + </VirtualHost>
    +
    + <VirtualHost *:80>
    + + DocumentRoot /siteler/faraza
    + ServerName faraza.dom
    +
    + # Diğer yönergeler, burada ...
    +
    +
    + </VirtualHost> +

    + +

    Yıldız imleri tüm adreslerle eşleşmeyi sağladığından ana sunucu + (yapılandırma dosyası genelindeki yapılandırma - sunucu geneli) + erişilebilir olmayacaktır. mesela.dom yapılandırma + dosyasındaki ilk sanal konak olduğundan en yüksek önceliğe sahiptir ve + öntanımlı veya baskın site olarak davranır. + Yani, hiçbir ServerName yönergesi ile eşleşmeyen bir istek + alındığında bu istek ilk VirtualHost yapılandırması ile + karşılanır.

    + +

    Bilginize

    +

    İsterseniz, * yerine kendi IP adresinizi yazabilirsiniz. + Ancak bu durumda bunu hem VirtualHost hem de + NameVirtualHost için yapmalısınız:

    + +

    + NameVirtualHost 192.168.1.22
    +
    + <VirtualHost 192.168.1.22>
    + # vs. ... +

    + +

    Bununla birlikte, IP adresinin önceden kestirilebilir olmadığı + sistemlerde, örneğin, hizmet sağlayıcınıza çevirmeli ağ ile bağlanıyor + ve onun rasgele atadığı bir IP adresi için bir devingen DNS çözümü + kullanıyorsanız, IP adresi değil de * kullanmak daha çok + işinize yarayacaktır. Yıldız imi her IP adresi ile eşleşeceğinden IP + adresiniz değişse bile bu yapılandırmayı değiştirmeden + kullanabilirsiniz.

    +
    + +

    Yukarıdaki yapılandırmayı hemen hemen tüm isme dayalı sanal konaklar + için kullanabilirsiniz. Bu yapılandırmanın çalışmayacağı tek durum, + farklı içerikleri farklı IP adreslerinden sunma gereğiyle + karşılaşmaktır.

    + +
    top
    +
    +

    IP adresleri farklı çok sayıda isme dayalı site

    + + +

    Bilginize

    +

    Burada açıklanan teknikler istendiği kadar çok IP adresine + genişletilebilir.

    +
    + +

    Sunucunun iki IP adresi olsun. Birinden "ana sunucu" + (192.168.1.2) diğerinden mesela.dom + 192.168.2.2 hizmet versin. Bu arada başka sanal konakları + da sunabilelim istiyoruz.

    + +

    Sunucu yapılandırması

    + + Listen 80
    +
    + # Bu, 192.168.1.2 adresindeki "ana sunucu" olsun
    + ServerName sunucu.faraza.dom
    + DocumentRoot /siteler/anasunucu
    +
    + # Burası da diğer adres için
    + NameVirtualHost 192.168.2.2
    +
    + <VirtualHost 192.168.2.2>
    + + DocumentRoot /siteler/mesela
    + ServerName mesela.dom
    +
    + # Diğer yönergeler, burada ...
    +
    +
    + </VirtualHost>
    +
    + <VirtualHost 192.168.2.2>
    + + DocumentRoot /siteler/falanca
    + ServerName falanca.dom
    +
    + # Diğer yönergeler, burada ...
    +
    +
    + </VirtualHost> +

    + +

    192.168.2.2 adresinden gelmeyen tüm isteklere ana sunucu + (sunucu.faraza.dom), 192.168.2.2 adresinden + gelen sunucu ismi belirtmeyenler ile Host: başlığı + belirtmeyenlere ise mesela.dom hizmet verecektir.

    + +
    top
    +
    +

    Aynı içeriği farklı IP adresleriyle sunmak + (örn., dahili ve harici ağlara)

    + +

    Sunucu makine iki IP adresine sahip olsun. Biri iç ağa + (192.168.1.1) diğeri dış ağa (172.20.30.40) + bakıyor olsun. sunucu.mesela.dom ismi dış ağda dış ağa + bakan IP’ye, iç ağda ise iç ağa bakan IP’ye çözümleniyor olsun.

    + +

    Bu durumda, sunucu hem iç hem de dış ağdan gelen isteklere aynı içerik, + dolayısıyla aynı VirtualHost bölümü ile hizmet + verebilir.

    + +

    Sunucu yapılandırması

    + + NameVirtualHost 192.168.1.1
    + NameVirtualHost 172.20.30.40
    +
    + <VirtualHost 192.168.1.1 172.20.30.40>
    + + DocumentRoot /siteler/sunucu
    + ServerName sunucu.mesela.dom
    + ServerAlias sunucu
    +
    + </VirtualHost> +

    + +

    Artık, hem iç hem de dış ağdan gelen isteklere aynı + VirtualHost bölümünden hizmet sunulacaktır.

    + +

    Bilginize:

    +

    İç ağdan istek yapan biri, tam nitelenmiş konak ismi + sunucu.mesela.dom yerine makine ismini + (sunucu) kullanabilir (ServerAlias sunucu + satırına dikkat).

    + +

    Ayrıca, yukarıdaki gibi iki ayrı IP adresi belirtmek yerine sadece + * belirtmekle sunucunun tüm IP adreslerine yine aynı + içerikle yanıt vereceğine dikkat ediniz.

    +
    + +
    top
    +
    +

    Farklı portlarla farklı siteler

    + +

    Aynı IP adresine sahip çok sayıda konak ismine sahip olduğunuzu ve + bunların bazılarının farklı portları kullanmasını istediğinizi + varsayalım. NameVirtualHost + yönergesi ile port tanımlamak suretiyle bunu mümkün kılabilirsiniz. + NameVirtualHost isim:port tanımı yapmadan + veya bunun yerine Listen + kullanarak VirtualHost isim:port kullanmaya + kalkışırsanız, yapılandırmanız çalışmayacaktır.

    + +

    Sunucu yapılandırması

    + + Listen 80
    + Listen 8080
    +
    + NameVirtualHost 172.20.30.40:80
    + NameVirtualHost 172.20.30.40:8080
    +
    + <VirtualHost 172.20.30.40:80>
    + + ServerName mesela.dom
    + DocumentRoot /siteler/mesela-80
    +
    + </VirtualHost>
    +
    + <VirtualHost 172.20.30.40:8080>
    + + ServerName mesela.dom
    + DocumentRoot /siteler/mesela-8080
    +
    + </VirtualHost>
    +
    + <VirtualHost 172.20.30.40:80>
    + + ServerName faraza.dom
    + DocumentRoot /siteler/faraza-80
    +
    + </VirtualHost>
    +
    + <VirtualHost 172.20.30.40:8080>
    + + ServerName faraza.dom
    + DocumentRoot /siteler/faraza-8080
    +
    + </VirtualHost> +

    + +
    top
    +
    +

    IP’ye dayalı sanal konaklar

    + +

    Sunucu makinenin, biri mesela.dom adından çözümlenen + 172.20.30.40, diğeri faraza.dom adından + çözümlenen 172.20.30.50 diye iki IP adresi olsun.

    + +

    Sunucu yapılandırması

    + + Listen 80
    +
    + <VirtualHost 172.20.30.40>
    + + DocumentRoot /siteler/mesela
    + ServerName mesela.dom
    +
    + </VirtualHost>
    +
    + <VirtualHost 172.20.30.50>
    + + DocumentRoot /siteler/faraza
    + ServerName faraza.dom
    +
    + </VirtualHost> +

    + +

    <VirtualHost> yönergelerinde belirtilmeyen + adreslerle yapılan isteklere (örneğin, localhost) sunucu + genelindeki yapılandırma ile ana sunucu yanıt verecektir.

    +
    top
    +
    +

    Hem IP’ye hem de porta dayalı sanal konaklar

    + + +

    Sunucu makinenin, biri mesela.dom adından çözümlenen + 172.20.30.40, diğeri faraza.dom adından + çözümlenen 172.20.30.50 diye iki IP adresi olsun ve iki + konak da hem 80 hem de 8080 portlarında çalışsınlar istiyoruz.

    + +

    Sunucu yapılandırması

    + + Listen 172.20.30.40:80
    + Listen 172.20.30.40:8080
    + Listen 172.20.30.50:80
    + Listen 172.20.30.50:8080
    +
    + <VirtualHost 172.20.30.40:80>
    + + DocumentRoot /siteler/mesela-80
    + ServerName mesela.dom
    +
    + </VirtualHost>
    +
    + <VirtualHost 172.20.30.40:8080>
    + + DocumentRoot /siteler/mesela-8080
    + ServerName mesela.dom
    +
    + </VirtualHost>
    +
    + <VirtualHost 172.20.30.50:80>
    + + DocumentRoot /siteler/faraza-80
    + ServerName faraza.dom
    +
    + </VirtualHost>
    +
    + <VirtualHost 172.20.30.50:8080>
    + + DocumentRoot /siteler/faraza-8080
    + ServerName faraza.dom
    +
    + </VirtualHost> +

    + +
    top
    +
    +

    Hem isme hem de IP‘ye dayalı sanal konaklar

    + + +

    Bazı adreslerde isme dayalı, bazılarında da IP’ye dayalı sanal konaklar + çalışsın istersek...

    + +

    Sunucu yapılandırması

    + + Listen 80
    +
    + NameVirtualHost 172.20.30.40
    +
    + <VirtualHost 172.20.30.40>
    + + DocumentRoot /siteler/mesela
    + ServerName mesela.dom
    +
    + </VirtualHost>
    +
    + <VirtualHost 172.20.30.40>
    + + DocumentRoot /siteler/faraza
    + ServerName faraza.dom
    +
    + </VirtualHost>
    +
    + <VirtualHost 172.20.30.40>
    + + DocumentRoot /siteler/falanca
    + ServerName falanca.dom
    +
    + </VirtualHost>
    +
    + # IP-based
    + <VirtualHost 172.20.30.50>
    + + DocumentRoot /siteler/filanca
    + ServerName filanca.dom
    +
    + </VirtualHost>
    +
    + <VirtualHost 172.20.30.60>
    + + DocumentRoot /siteler/fesmekan
    + ServerName fesmekan.dom
    +
    + </VirtualHost> +

    + +
    top
    +
    +

    Virtualhost ve + mod_proxy’nin birlikte kullanımı

    + +

    Bu örnekte bir arabirimi dışarıya bakan bir makinede, başka bir + makinede çalışan bir sunucuya sanal konak olarak, bir vekil sunucu + çalıştırmak istediğimizi varsayıyoruz. 192.168.111.2 IP + adresli bir makinede aynı isimde bir sanal konak yapılandırılmış olsun. + Çok sayıda konak ismi için vekil olarak tek bir makine kullandığımızdan + ve konak isminin de aktarılmasını arzuladığımızdan ProxyPreserveHost On yönergesini + kullandık.

    + +

    + <VirtualHost *:*>
    + + ProxyPreserveHost On
    + ProxyPass / http://192.168.111.2/
    + ProxyPassReverse / http://192.168.111.2/
    + ServerName konak.mesela.dom
    +
    + </VirtualHost> +

    + +
    top
    +
    +

    _default_ sanal konakları

    + +

    Tüm portlar için _default_

    + + +

    Bir IP adresi ve port belirtilmeyen veya hiçbir sanal konağın hiçbir + adresi/portu ile eşleşmeyen istekleri yakalamak istersek...

    + +

    Sunucu yapılandırması

    + + + <VirtualHost _default_:*>
    + + DocumentRoot /siteler/default
    +
    + </VirtualHost> +

    + +

    Bütün portlarla eşleşen böyle bir öntanımlı sanal konağın kullanımı + hiçbir isteğin ana sunucuya gitmemesi sonucunu doğurur.

    + +

    Bir öntanımlı sanal konak, asla, isme dayalı sanal konaklar için + kullanılmış bir adrese/porta gönderilmiş bir isteğe hizmet sunmaz. Eğer + istek bilinmeyen bir Host: başlığına sahipse veya hiç + Host: başlığı içermiyorsa isteğe daima ilk (yapılandırma + dosyasındaki ilk) isme dayalı sanal konak hizmet sunar.

    + +

    Her isteği tek bir bilgilendirme sayfasına (veya betiğe) yönlendirmek + isterseniz AliasMatch veya + RewriteRule yönergesini + kullanabilirsiniz.

    + + +

    Farklı portlardan _default_

    + + +

    Önceki yapılandırmaya ek olarak 80. portta ayrı bir + _default_ sanal konağı kullanmak istersek...

    + +

    Sunucu yapılandırması

    + + + <VirtualHost _default_:80>
    + + DocumentRoot /siteler/default80
    + # ...
    +
    + </VirtualHost>
    +
    + <VirtualHost _default_:*>
    + + DocumentRoot /siteler/default
    + # ...
    +
    + </VirtualHost> +

    + +

    80. porttan hizmet sunan _default_ sanal konağı IP adresi + belirtilmeyen tüm istekleri yakalar, bunu yapabilmesi için yapılandırma + dosyasında tüm portlara hizmet sunan benzerinden önce yer almalıdır. Bu + durumda ana sunucu hiçbir isteğe yanıt vermeyecektir.

    + + +

    Tek portluk _default_

    + + +

    _default_ sanal konağının sadece 80. porttan hizmet + sunmasını istersek...

    + +

    Sunucu yapılandırması

    + + + <VirtualHost _default_:80>
    + DocumentRoot /siteler/default
    + ...
    + </VirtualHost> +

    + +

    80. porttan gelen IP adresi belirtilmemiş isteklere + _default_ sanal konağı, diğer portlardan gelen adres + belirtilmemiş isteklere ise ana sunucu hizmet verecektir.

    + + +
    top
    +
    +

    Bir isme dayalı sanal konağı bir IP’ye dayalı + sanal konakla yansılamak

    + +

    İsme dayalı sanal konak örneklerinin 2. sinde adı + geçen falanca.dom bu örnekte kendi IP adresinden hizmet + veriyor olsun. İsme dayalı sanal konağı eski IP adresiyle kaydetmiş + vekiller ve isim sunucularından kaynaklanacak olası sorunlardan kaçınmak + için yansılama sırasında sanal konağı hem eski hem de yeni IP adresiyle + sunmamız lazım.

    + +

    Çözüm kolay, çünkü yapacağımız sadece VirtualHost + yönergesine yeni IP adresini (192.168.2.2) eklemek olacak.

    + +

    Sunucu yapılandırması

    + + + Listen 80
    + ServerName mesela.dom
    + DocumentRoot /siteler/mesela
    +
    + <VirtualHost 192.168.1.2>
    +
    + <VirtualHost 192.168.1.2 192.168.2.2>
    + + DocumentRoot /siteler/falanca
    + ServerName falanca.dom
    + # ...
    +
    + </VirtualHost>
    +
    + <VirtualHost 192.168.1.2>
    + + DocumentRoot /siteler/faraza
    + ServerName faraza.dom
    + ServerAlias *.faraza.dom
    + # ...
    +
    + </VirtualHost> +

    + +

    Böylece sanal konağa hem yeni (bir IP’ye dayalı sanal konak olarak) + hem de eski adresinden (bir isme dayalı sanal konak olarak) + erişilebilecektir.

    + +
    top
    +
    +

    ServerPath yönergesinin kullanımı

    + + +

    İsme dayalı iki sanal konağı olan bir sunucumuz olsun. Doğru sanal + konağa erişebilmek için istemcinin doğru Host: başlığı + göndermesi gerekir. Eski HTTP/1.0 istemcileri böyle bir başlık + göndermedikleri için Apache istemcinin hangi sanal konağa erişmek + istediğini bilemez (ve isteğe ilk sanal konaktan hizmet sunar). Daha iyi + bir geriye uyumluluk sağlamak için isme dayalı sanal konağa bir önek + bağlantısı içeren bir bilgilendirme sayfası sunmak üzere yeni bir sanal + konak oluşturabiliriz.

    + +

    Sunucu yapılandırması

    + + + NameVirtualHost 172.20.30.40
    +
    + <VirtualHost 172.20.30.40>
    + + # ilk sanal konak
    + DocumentRoot /siteler/baska
    + RewriteEngine On
    + RewriteRule ^/.* /siteler/baska/index.html
    + # ...
    +
    + </VirtualHost>
    +
    + <VirtualHost 172.20.30.40>
    + DocumentRoot /siteler/baska/bir
    + + ServerName bir.baska.tld
    + ServerPath /bir/
    + RewriteEngine On
    + RewriteRule ^(/bir/.*) /siteler/baska$1
    + # ...
    +
    + </VirtualHost>
    +
    + <VirtualHost 172.20.30.40>
    + + DocumentRoot /siteler/baska/iki
    + ServerName iki.baska.tld
    + ServerPath /iki/
    + RewriteEngine On
    + RewriteRule ^(/iki/.*) /siteler/baska$1
    + # ...
    +
    + </VirtualHost> +

    + +

    ServerPath yönergesinden dolayı + http://bir.baska.tld/bir/ şeklinde yapılan isteklere + daima “bir” sanal konağı hizmet sunacaktır.

    + +

    http://bir.baska.tld/ şeklinde yapılan isteklere ise + istemcinin doğru Host: başlığı göndermesi şartıyla + “bir” sanal konağı hizmet sunacaktır. İstemci, bir + Host: başlığı göndermediği takdirde ilk konaktan bir + bilgilendirme sayfası alacaktır.

    + +

    Yalnız buradaki bir tuhaflığa dikkat edin: Eğer istemci bir + Host: başlığı göndermeden + http://iki.baska.tld/bir/ şeklinde bir istek yaparsa bu + isteğe de “bir” sanal konağı hizmet sunacaktır.

    + +

    RewriteRule yönergesi, bir + istemcinin, bir URL öneki belirtsin ya da belirtmesin doğru + Host: başlığı gönderdiğinden emin olmak için + kullanılmıştır.

    + +
    +
    +

    Mevcut Diller:  en  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/vhosts/fd-limits.html b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/fd-limits.html new file mode 100644 index 00000000..9dc971e1 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/fd-limits.html @@ -0,0 +1,17 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: fd-limits.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: fd-limits.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: fd-limits.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: fd-limits.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/vhosts/fd-limits.html.en b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/fd-limits.html.en new file mode 100644 index 00000000..4649f65f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/fd-limits.html.en @@ -0,0 +1,133 @@ + + + +File Descriptor Limits - Apache HTTP Server + + + + + +
    <-
    +

    File Descriptor Limits

    +
    +

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

    +
    + + +

    When using a large number of Virtual Hosts, Apache may run + out of available file descriptors (sometimes called file + handles) if each Virtual Host specifies different log + files. The total number of file descriptors used by Apache is + one for each distinct error log file, one for every other log + file directive, plus 10-20 for internal use. Unix operating + systems limit the number of file descriptors that may be used + by a process; the limit is typically 64, and may usually be + increased up to a large hard-limit.

    + +

    Although Apache attempts to increase the limit as required, + this may not work if:

    + +
      +
    1. Your system does not provide the setrlimit() + system call.
    2. + +
    3. The setrlimit(RLIMIT_NOFILE) call does not + function on your system (such as Solaris 2.3)
    4. + +
    5. The number of file descriptors required exceeds the hard + limit.
    6. + +
    7. Your system imposes other limits on file descriptors, + such as a limit on stdio streams only using file descriptors + below 256. (Solaris 2)
    8. +
    + +

    In the event of problems you can:

    + +
      +
    • Reduce the number of log files; don't specify log files + in the <VirtualHost> + sections, but only log to the main log files. (See Splitting up your log files, below, for more + information on doing this.)
    • + +
    • + If you system falls into 1 or 2 (above), then increase the + file descriptor limit before starting Apache, using a + script like + +

      + #!/bin/sh
      + ulimit -S -n 100
      + exec httpd
      +

      +
    • +
    + +

    Please see the Descriptors and Apache + document containing further details about file descriptor + problems and how they can be solved on your operating + system.

    + +
    +
    top
    +
    +

    Splitting up your log files

    + +

    If you want to log multiple virtual hosts to the same log file, you +may want to split up the log files afterwards in order to run +statistical analysis of the various virtual hosts. This can be +accomplished in the following manner.

    + +

    First, you will need to add the virtual host information to the log +entries. This can be done using the +LogFormat +directive, and the %v variable. Add this to the beginning +of your log format string:

    + +

    +LogFormat "%v %h %l %u %t \"%r\" %>s %b" vhost
    +CustomLog logs/multiple_vhost_log vhost +

    + +

    This will create a log file in the common log format, but with the +canonical virtual host (whatever appears in the +ServerName directive) prepended to +each line. (See Custom Log Formats for +more about customizing your log files.)

    + +

    When you wish to split your log file into its component parts (one +file per virtual host) you can use the program split-logfile to accomplish +this. You'll find this program in the support directory +of the Apache distribution.

    + +

    Run this program with the command:

    + +

    +split-logfile < /logs/multiple_vhost_log +

    + +

    This program, when run with the name of your vhost log file, will +generate one file for each virtual host that appears in your log file. +Each file will be called hostname.log.

    + +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/vhosts/fd-limits.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/fd-limits.html.ja.utf8 new file mode 100644 index 00000000..91682507 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/fd-limits.html.ja.utf8 @@ -0,0 +1,131 @@ + + + +ファイル記述子の限界 - Apache HTTP サーバ + + + + + +
    <-
    +

    ファイル記述子の限界

    +
    +

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

    +
    + + +

    たくさんのバーチャルホストを運用する場合、もし、 + 各バーチャルホストごとに異なるログファイルが指定してあると、 + Apache がファイル記述子 (ファイルハンドルとも呼ばれます) + を使い切ってしまうことがあります。Apache が使用するファイル + 記述子の数は、各エラーログファイルにつき 1 つ、他のログファイルの + ディレクティブにつき 1 つ、さらに内部で使用する 10 から 20、 + の合計になります。Unix オペレーティングシステムではプロセスごとに + 使用可能なファイル記述子の数を制限しています。たいていの場合は 64 で、 + 普通は大きな値のハードリミットまで増やすことができます。

    + +

    Apache は必要に応じて上限を拡大しようと試みますが、 + 以下のような場合にはうまくいかないかもしれません。

    + +
      +
    1. 利用しているシステムで setrlimit() + システムコールが提供されていない。
    2. + +
    3. システム上で setrlimit(RLIMIT_NOFILE) が動作しない + (たとえば Solaris 2.3 のように)。
    4. + +
    5. 要求されるファイル記述子の数が + ハードリミットを超えてしまう。
    6. + +
    7. システムにファイル記述子に関して別の制限が存在してしまっている。 + たとえば、stdio ストリームではファイル記述子を 256 以上使えない + (Solaris 2)、など。
    8. +
    + +

    問題が発生した時に取り得る対処方法は次のとおり:

    + +
      +
    • ログファイルの数を減らす。<VirtualHost> + セクションでログファイルを指定せず、メインのログファイルにのみ記録する。 + (これに関する詳しい情報は以下のログファイルの分割を読んでください。)
    • + +
    • + もし、前述の 1 または 2 の場合であれば、 + Apache を起動する前にファイル記述子を増やします。 + たとえば次のようなスクリプトを使います。 + +

      + #!/bin/sh
      + ulimit -S -n 100
      + exec httpd
      +

      +
    • +
    + +

    ファイル記述子の問題についての詳細や、 + オペレーティングシステムごとの解決方法については「ファイル記述子と + Apache」の文書を参照してください。 +

    + +
    +
    top
    +
    +

    ログファイルの分割

    + +

    複数のバーチャルホストのログを同じログファイルに収集しようとしているときには、 +各バーチャルホストについて統計的な解析を実行するために後でログファイルを +分割したくなるかもしれません。これは以下のようにして実現できます。

    + +

    まず、バーチャルホストの情報をログのエントリに追加する必要があります。 +これは LogFormat +ディレクティブの %v 変数を使うことでできます。 +これをログのフォーマット文字列の先頭に追加します:

    + +

    +LogFormat "%v %h %l %u %t \"%r\" %>s %b" vhost
    +CustomLog logs/multiple_vhost_log vhost +

    + +

    これは common log format のログを作成しますが、それぞれの行の先頭に +正規化されたバーチャルホストの名前 +(ServerName +ディレクティブに書かれているもの) が付加されます。 +(ログファイルのカスタマイズの詳細については Custom Log Formats を +読んでください。)

    + +

    ログファイルを各部分 (バーチャルホスト毎に 1 ファイル) に分けたいときは、 +split-logfile +を使って行なうことができます。プログラムは Apache 配布の +support ディレクトリにあります。

    + +

    以下のようなコマンドでこのプログラムを実行します:

    + +

    +split-logfile < /logs/multiple_vhost_log +

    + +

    このプログラムはバーチャルホストのログファイルの名前とともに実行され、 +ログファイルに現れるそれぞれのバーチャルホスト毎に一つのファイルを作成します。 +それぞれのファイルは ホスト名.log という名前になります。

    + +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/vhosts/fd-limits.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/fd-limits.html.ko.euc-kr new file mode 100644 index 00000000..fc23ee20 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/fd-limits.html.ko.euc-kr @@ -0,0 +1,126 @@ + + + +ÆÄÀϱâ¼úÀÚ(file descriptor) ÇÑ°è - Apache HTTP Server + + + + + +
    <-
    +

    ÆÄÀϱâ¼úÀÚ(file descriptor) ÇÑ°è

    +
    +

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

    +
    + + +

    °¡»óÈ£½ºÆ®¸¦ ¸¹ÀÌ »ç¿ëÇÏ°í °¢ °¡»óÈ£½ºÆ®¿¡ ¼­·Î ´Ù¸¥ + ·Î±×ÆÄÀÏÀ» ÁöÁ¤Çϸé, ¾ÆÆÄÄ¡°¡ »ç¿ë°¡´ÉÇÑ ÆÄÀϱâ¼úÀÚ(file + descriptor, ÈçÈ÷ ÆÄÀÏÇÚµé(file handle)À̶ó°í + ºÎ¸§)¸¦ ´Ù ½á¹ö¸± ¼ö ÀÖ´Ù. ¾ÆÆÄÄ¡°¡ »ç¿ëÇÏ´Â ÆÄÀϱâ¼úÀÚÀÇ + ÃÑ °³¼ö´Â ¿À·ù ·Î±×ÆÄÀÏ´ç ÇÑ°³, ´Ù¸¥ ·Î±×ÆÄÀÏ Áö½Ã¾î´ç + ÇÑ°³, Ãß°¡·Î ³»ºÎ¿ëµµ·Î 10-20°³¸¦ ´õÇÑ ¼ö´Ù. À¯´Ð½º ¿î¿µÃ¼Á¦´Â + ÇÁ·Î¼¼½º°¡ »ç¿ëÇÒ ¼ö ÀÖ´Â ÆÄÀϱâ¼úÀÚ °³¼ö¸¦ Á¦ÇÑÇÑ´Ù. ÀÌ ÇÑ°è´Â + º¸Åë 64°³·Î, º¸Åë À̺¸´Ù Å« hard-limit±îÁö ´Ã¸± ¼ö ÀÖ´Ù.

    + +

    ¾ÆÆÄÄ¡´Â ÀÌ ÇѰ踦 ÇÊ¿äÇѸ¸Å­ ´Ã¸®·Á°í ÇÏÁö¸¸, ½ÇÆÐÇÏ´Â + °æ¿ì°¡ ÀÖ´Ù:

    + +
      +
    1. ½Ã½ºÅÛÀÌ setrlimit() ½Ã½ºÅÛÈ£ÃâÀ» + Á¦°øÇÏÁö ¾Ê´Â´Ù.
    2. + +
    3. (Solaris 2.3°ú °°ÀÌ) ½Ã½ºÅÛ¿¡¼­ + setrlimit(RLIMIT_NOFILE) ÇÔ¼ö°¡ µ¿ÀÛÇÏÁö + ¾Ê´Â´Ù.
    4. + +
    5. ÇÊ¿äÇÑ ÆÄÀϱâ¼úÀÚ °³¼ö°¡ hard limit º¸´Ù ¸¹´Ù.
    6. + +
    7. (Solaris 2) ½Ã½ºÅÛÀÌ stdio ½ºÆ®¸²À» 256ÀÌÇÏÀÇ + ÆÄÀϱâ¼úÀÚ¸¸À» »ç¿ëÇϵµ·Ï Á¦ÇÑÇÏ´Â µî ÆÄÀϱâ¼úÀÚ¿¡ + Á¦¾àÀ» °¡ÇÑ´Ù.
    8. +
    + +

    ÀÌ °æ¿ì ÇØ°áÃ¥Àº:

    + +
      +
    • ·Î±×ÆÄÀÏ °³¼ö¸¦ ÁÙÀδÙ. <VirtualHost> ¼½¼Ç¿¡¼­ ·Î±×ÆÄÀÏÀ» + ÁöÁ¤ÇÏÁö ¾Ê°í ÁÖ ·Î±×ÆÄÀÏÀ» »ç¿ëÇÑ´Ù. (´õ ÀÚ¼¼ÇÑ ¹æ¹ýÀº + ¾Æ·¡ ·Î±×ÆÄÀÏ ³ª´©±â¸¦ Âü°íÇ϶ó.)
    • + +
    • + »ç¿ëÇÏ´Â ½Ã½ºÅÛÀÌ (À§ÀÇ) 1¹ø°³ª 2¹ø° °æ¿ì¿¡ ÇØ´çÇÑ´Ù¸é, + ´ÙÀ½°ú °°Àº ½ºÅ©¸³Æ®·Î ¾ÆÆÄÄ¡¸¦ ½ÃÀÛÇϱâ Àü¿¡ ÆÄÀϱâ¼úÀÚ + ÇѰ踦 ´Ã¸°´Ù. + +

      + #!/bin/sh
      + ulimit -S -n 100
      + exec httpd
      +

      +
    • +
    + +

    ÆÄÀϱâ¼úÀÚ ¹®Á¦¿Í °¢ ¿î¿µÃ¼Á¦¿¡¼­ÀÇ ÇØ°á¹æ¹ý¿¡ ´ëÇÑ + ÀÚ¼¼ÇÑ ³»¿ëÀº ÆÄÀϱâ¼úÀÚ¿Í + ¾ÆÆÄÄ¡ ¹®¼­¸¦ Âü°íÇ϶ó.

    + +
    +
    top
    +
    +

    ·Î±×ÆÄÀÏ ³ª´©±â

    + +

    ¿©·¯ °¡»óÈ£½ºÆ®°¡ °°Àº ·Î±×ÆÄÀÏÀ» »ç¿ëÇÑ´Ù¸é ³ªÁß¿¡ °¢ +°¡»óÈ£½ºÆ®ÀÇ Åë°èºÐ¼®À» À§ÇØ ·Î±×ÆÄÀÏÀ» ³ª´©°í ½ÍÀ» °ÍÀÌ´Ù. +ÀÌ ÀÛ¾÷Àº ´ÙÀ½°ú °°ÀÌ ÇÒ ¼ö ÀÖ´Ù.

    + +

    ¸ÕÀú ·Î±× Ç׸ñ¿¡ °¡»óÈ£½ºÆ® Á¤º¸¸¦ Ãß°¡ÇÑ´Ù. À̸¦ À§ÇØ +LogFormat +Áö½Ã¾î¿Í %v º¯¼ö¸¦ »ç¿ëÇÑ´Ù. ÀÌ º¯¼ö¸¦ ·Î±× +Çü½Ä¹®ÀÚ¿­ ¾Õ¿¡ Ãß°¡ÇÑ´Ù:

    + +

    +LogFormat "%v %h %l %u %t \"%r\" %>s %b" vhost
    +CustomLog logs/multiple_vhost_log vhost +

    + +

    ±×·¯¸é common ·Î±×Çü½Ä ¾Õ¿¡ (ServerName Áö½Ã¾î¿¡ ³ª¿À´Â) Á¤±Ô +°¡»óÈ£½ºÆ®¸¦ Æ÷ÇÔÇÏ¿© ·Î±×ÆÄÀÏÀ» ±â·ÏÇÑ´Ù. (·Î±×ÆÄÀÏ +»ç¿ëÀÚÁ¤ÀÇ¿¡ °üÇÑ ³»¿ëÀº »ç¿ëÀÚÁ¤ÀÇ ·Î±×Çü½ÄÀ» +Âü°íÇ϶ó.)

    + +

    ·Î±×ÆÄÀÏÀ» (°¡»óÈ£½ºÆ®´ç ÇÑ ÆÄÀϾ¿) ³ª´©°í ½Í´Ù¸é split-logfile ÇÁ·Î±×·¥À» +»ç¿ëÇÑ´Ù. ÀÌ ÇÁ·Î±×·¥Àº ¾ÆÆÄÄ¡ ¹èÆ÷º»ÀÇ support +µð·ºÅ丮¿¡ ÀÖ´Ù.

    + +

    ´ÙÀ½°ú °°ÀÌ ÇÁ·Î±×·¥À» ½ÇÇàÇÑ´Ù:

    + +

    +split-logfile < /logs/multiple_vhost_log +

    + +

    °¡»óÈ£½ºÆ® ·Î±×ÆÄÀÏÀ» °¡Áö°í ÀÌ ÇÁ·Î±×·¥À» ½ÇÇàÇÏ¸é ·Î±×ÆÄÀÏ¿¡ +³ª¿À´Â °¢ °¡»óÈ£½ºÆ®´ç ÆÄÀÏÀ» Çϳª¾¿ ¸¸µç´Ù. °¢°¢ÀÇ ÆÄÀϸíÀº +hostname.logÀÌ´Ù.

    + +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/vhosts/fd-limits.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/fd-limits.html.tr.utf8 new file mode 100644 index 00000000..d6024726 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/fd-limits.html.tr.utf8 @@ -0,0 +1,128 @@ + + + +Dosya Tanıtıcı Sınırları - Apache HTTP Sunucusu + + + + + +
    <-
    +

    Dosya Tanıtıcı Sınırları

    +
    +

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

    +
    + + +

    Çok büyük sayıda sanal konak kullanıyorsanız ve bunların her biri için + ayrı günlük kayıtları tutuyorsanız, Apache dosya tanıtıcılarını + tüketebilir. Apache tarafından, dahili olarak 10-20 dosya tanıtıcıya ek + olarak her hata günlüğü için bir ve her diğer günlük kaydı için bir dosya + tanıcı kullanılır. Unix işletim sisteminde dosya tanıtıcıların sayısı + süreç başına 64 taneyle sınırlıdır ve gerekirse donanıma bağlı olarak + arttırılabilir.

    + +

    Apache gerektiğinde bu sınırı kendisi arttırmaya çalışırsa da bu her + zaman mümkün olmaz. Şöyle ki:

    + +
      +
    1. Sisteminiz setrlimit() sistem çağrısını + sağlamıyordur.
    2. + +
    3. Sisteminizde setrlimit(RLIMIT_NOFILE) çağrısı hiçbir işe + yaramıyordur (örneğin, Solaris 2.3).
    4. + +
    5. Dosya tanıtıcılarının sayısı donanıma bağlı olarak daha fazla + arttırılamıyordur.
    6. + +
    7. Sisteminiz dosya tanıtıcı sayısını başka sınırlara bağlı kılmıştır: + örneğin stdio akımları ile ilgili sınır, dosya tanıtıcı sayısının + 256’nın altında ollmasını gerektiriyordur (Solaris 2).
    8. +
    + +

    Böyle sorunlar karşısında yapabilecekleriniz:

    + +
    • Ana günlük dosyaları hariç, <VirtualHost> bölümlerinde günlük dosyası + belirtmeyerek günlük dosyası sayısını düşürürsünüz. (Bunun nasıl + yapılacağını öğrenmek için Günlük kayıtlarının + ayrıştırılması bölümüne bakınız.)
    • + +
    • Sisteminizde serbest dosya tanıtıcı sayısı 1-2 civarına düşerse + Apache’yi aşağıdaki gibi bir betikle yeniden çalıştırarak dosya + tanıtıcı sayısını arttırabilirsiniz: + +

      + #!/bin/sh
      + ulimit -S -n 100
      + exec httpd
      +

      +
    • +
    + +

    Dosya tanıtıcılarla ilgili sorunlar ve bunların işletim sisteminizde + nasıl çözülebileceğiyle ilgili bilgi edinmek için Dosya Tanıtıcılar ve Apache + belgesine bakınız.

    + +
    +
    top
    +
    +

    Günlük kayıtlarının ayrıştırılması

    + +

    Günlük dosyalarını çok sayıda sanal konak için ortak olarak + kullanıyorsanız, sanal konaklar için istatistiksel çözümlemeler yapmak + amacıyla sırası geldiğinde bunları ayrıştırabilirsiniz. Bu işlem aşağıda + anlatıldığı gibi yapılabilir.

    + +

    İlk iş olarak, sanal konak bilgilerini günlük girdilerine eklemeniz + gerekir. Bu işlem, LogFormat yönergesi ve + %v biçem değişkeni ile yapılabilir. Günlük girdisi biçem + dizgesinin başına bunu ekleyiniz:

    + +

    + LogFormat "%v %h %l %u %t \"%r\" %>s %b" vhost
    + CustomLog logs/multiple_vhost_log vhost +

    + +

    Bu yapılandırma ile her günlük kaydının başında sanal konağın + ServerName yönergesine belirtilen + ismi eklenir. (Günlük dosyalarınızın kişiselleştirilmesi ile ilgili daha + fazla bilgi için Günlük + Girdilerinin Kişiselleştirilmesi konusuna bakınız.)

    + +

    Günlük dosyanızdaki kayıtları bileşenlere göre gruplamak isterseniz + split-logfile + programını kullanabilirsiniz. Bu programı Apache dağıtımının + support dizininde bulabilirsiniz.

    + +

    Programı aşağıdaki gibi çalıştırın:

    + +

    + split-logfile < /logs/multiple_vhost_log +

    + +

    Bu programı sanal konaklar için tuttuğunuz günlük dosyasının ismini + argüman olarak belirterek çalıştırdığınızda o dosyadaki kayıtlardan her + sanal konak için ayrı bir günlük dosyası + (konakadı.log) üretilir.

    + +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/vhosts/index.html b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/index.html new file mode 100644 index 00000000..b2002505 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/index.html @@ -0,0 +1,29 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: index.html.de +Content-Language: de +Content-type: text/html; charset=ISO-8859-1 + +URI: index.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: index.html.es +Content-Language: es +Content-type: text/html; charset=ISO-8859-1 + +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.ru.koi8-r +Content-Language: ru +Content-type: text/html; charset=KOI8-R + +URI: index.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/vhosts/index.html.de b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/index.html.de new file mode 100644 index 00000000..fcceffa5 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/index.html.de @@ -0,0 +1,112 @@ + + + +Apache-Dokumentation zu virtuellen Hosts - Apache HTTP Server + + + + + +
    <-
    +

    Apache-Dokumentation zu virtuellen Hosts

    +
    +

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

    +
    + +

    Der Begriff virtueller Host (Anm.d.Ü.: engl. 'virtual + host') bezieht sich auf die Praxis, mehr als ein Webangebot + (z.B. www.company1.com und www.company2.com) + auf einer einzigen Maschine zu betreiben. Virtuelle Hosts können + "IP-basiert" sein, was bedeutet, dass jedes + Webangebot eine andere IP besitzt, oder "Namens-basiert", was bedeutet, dass + unter jeder IP-Adresse mehrere Namen laufen. Die Tatsache, dass sie + auf dem gleichen physischen Server laufen, ist für den Endbenutzer + nicht offensichtlich.

    + +

    Der Apache war einer der ersten Server, der IP-basierte + virtuelle Hosts von Haus aus direkt unterstützt hat. Seit Version 1.1 + unterstützt der Apache sowohl IP-basierte als auch namensbasierte + virtuelle Hosts (vhosts). Letzteres wird zuweilen auch + Host-basiert oder non-IP-Virtual-Host genannt.

    + +

    Nachfolgend finden Sie eine Liste von Dokumenten, die alle Details + der Unterstützung von virtuellen Hosts ab Apache Version 1.3 + beschreiben.

    + +
    + +
    top
    +
    top
    +
    +

    Konfigurationsdirektiven

    + + + +

    Bei der Suche von Fehlern in Ihrer Virtual-Host-Konfiguration ist + die Apache-Befehlszeilenoption -S möglicherweise + hilfreich. Geben Sie dazu den folgenden Befehl ein:

    + +

    + /usr/local/apache2/bin/httpd -S +

    + +

    Diese Anweisung gibt eine Beschreibung aus, wie der Apache die + Konfigurationsdatei analysiert hat. Eine sorgfältige + Überprüfung der IP-Adressen und Servernamen kann helfen, + Konfigurationsfehler aufzudecken. (Lesen Sie die Dokumentation zum + httpd-Programm für weitere + Befehlszeilenoptionen.)

    +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/vhosts/index.html.en b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/index.html.en new file mode 100644 index 00000000..31b11b4c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/index.html.en @@ -0,0 +1,112 @@ + + + +Apache Virtual Host documentation - Apache HTTP Server + + + + + +
    <-
    +

    Apache Virtual Host documentation

    +
    +

    Available Languages:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + + +

    The term Virtual Host refers to the practice of + running more than one web site (such as + www.company1.com and www.company2.com) + on a single machine. Virtual hosts can be "IP-based", meaning that you have a + different IP address for every web site, or "name-based", meaning that you have + multiple names running on each IP address. The fact that they + are running on the same physical server is not apparent to the + end user.

    + +

    Apache was one of the first servers to support IP-based + virtual hosts right out of the box. Versions 1.1 and later of + Apache support both IP-based and name-based virtual hosts + (vhosts). The latter variant of virtual hosts is sometimes also + called host-based or non-IP virtual hosts.

    + +

    Below is a list of documentation pages which explain all + details of virtual host support in Apache version 1.3 and + later.

    + +
    + +
    top
    +
    top
    +
    +

    Configuration directives

    + + + +

    If you are trying to debug your virtual host configuration, you + may find the Apache -S command line switch + useful. That is, type the following command:

    + +

    + /usr/local/apache2/bin/httpd -S +

    + +

    This command will dump out a description of how Apache parsed + the configuration file. Careful examination of the IP addresses and + server names may help uncover configuration mistakes. (See + the docs for the httpd program for + other command line options)

    + +
    +
    +

    Available Languages:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/vhosts/index.html.es b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/index.html.es new file mode 100644 index 00000000..449b8005 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/index.html.es @@ -0,0 +1,119 @@ + + + +Documentación sobre Hosting Virtual en Apache - Servidor HTTP Apache + + + + + +
    <-
    +

    Documentación sobre Hosting Virtual en Apache

    +
    +

    Idiomas disponibles:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + + +

    El término Hosting Virtual se refiere a hacer + funcionar más de un sitio web (tales como + www.company1.com y www.company2.com) en + una sola máquina. Los sitios web virtuales pueden estar "basados en direcciones IP", lo que + significa que cada sitio web tiene una dirección IP diferente, o + "basados en nombres diferentes", lo + que significa que con una sola dirección IP están funcionando + sitios web con diferentes nombres (de dominio). El hecho de que estén + funcionando en la misma máquina física pasa completamente + desapercibido para el usuario que visita esos sitios web.

    + +

    Apache fue uno de los primeros servidores web en soportar + hosting virtual basado en direcciones IP. Las versiones 1.1 y + posteriores de Apache soportan hosting virtual (vhost) basado tanto + en direcciones IP como basado en nombres. Ésta última variante de + hosting virtual se llama algunas veces basada en host o + hosting virtual no basado en IP.

    + +

    Más abajo se muestra un listado de documentos que explican en + detalle cómo funciona el hosting virtual en las versiones de + Apache 1.3 y posteriores.

    + +
    + +
    top
    +
    top
    +
    +

    Directivas de configuración

    + + + +

    Si está tratando de solucionar problemas de + configuración de su hosting virtual, puede que le sea de + utilidad usar la opción de línea de comandos de Apache + -S. Es decir, el siguiente comando:

    + +

    + /usr/local/apache2/bin/httpd -S +

    + +

    Este comando le devolverá una descripción de + cómo Apache analiza e interpreta el fichero de + configuración. Para saber si contiene errores de + configuración, es conveniente que examine con atención + las direcciones IP y los nombres de servidor que está + usando. (Consulte la documentación sobre el programa + httpd para obtener información sobre otras + opciones de línea de comandos)

    + +
    +
    +

    Idiomas disponibles:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/vhosts/index.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/index.html.ja.utf8 new file mode 100644 index 00000000..dd975d2e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/index.html.ja.utf8 @@ -0,0 +1,108 @@ + + + +Apache バーチャルホスト説明書 - Apache HTTP サーバ + + + + + +
    <-
    +

    Apache バーチャルホスト説明書

    +
    +

    Available Languages:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    +
    This translation may be out of date. Check the + English version for recent changes.
    + + +

    バーチャルホストという用語は、1 台のマシン上で + (www.company1.com and www.company2.com のような) + 二つ以上のウェブサイトを扱う運用方法のことを指します。 + バーチャルホストには、各ウェブサイトに違う IP アドレスがある + 「IP ベース」と、それぞれの IP アドレスに + 複数の名前がある「名前ベース」とがあります。 + 複数のサイトが物理的に同じサーバで扱われている、ということはエンドユーザには + 明らかではありません。

    + +

    Apache は、特に手を入れない状態で IP ベースのバーチャルホスト + をサポートした最初のサーバの一つです。バージョン 1.1 以降の Apache + では、IP ベースとネームベースのバーチャルホストの両方をサポート + しています。ネームベースのバーチャルホストは、ホストベースあるいは + 非 IP ベースのバーチャルホストと呼ばれることもあります。

    + +

    以下のページでは、Apache バージョン 1.3 + 以降でのバーチャルホストのサポートについての詳細を説明します。

    + +
    + +
    top
    +
    top
    +
    +

    設定ディレクティブ

    + + + +

    バーチャルホストの設定のデバッグをするには + Apache のコマンドラインスイッチ -S が便利です。 + つまり、以下のコマンドを入力します:

    + +

    + /usr/local/apache2/bin/httpd -S +

    + +

    このコマンドは Apache が設定ファイルをどう解析したかについて出力します。 + IP アドレスとサーバ名を注意深く調べれば、 + 設定の間違いを見つける助けになるでしょう。 + (他のコマンドラインのオプションは httpd プログラムの説明文書を見てください)

    + +
    +
    +

    Available Languages:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/vhosts/index.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/index.html.ko.euc-kr new file mode 100644 index 00000000..fe4fb775 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/index.html.ko.euc-kr @@ -0,0 +1,110 @@ + + + +¾ÆÆÄÄ¡ °¡»óÈ£½ºÆ® ¹®¼­ - Apache HTTP Server + + + + + +
    <-
    +

    ¾ÆÆÄÄ¡ °¡»óÈ£½ºÆ® ¹®¼­

    +
    +

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

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

    °¡»óÈ£½ºÆ® (Virtual Host)´Â ÇÑ ÄÄÇ»ÅÍ¿¡¼­ + ¿©·¯ À¥»çÀÌÆ®¸¦ (¿¹¸¦ µé¾î, www.company1.com°ú + www.company2.com) ¼­ºñ½ºÇÔÀ» ¶æÇÑ´Ù. + °¡»óÈ£½ºÆ®¿¡´Â °¢ À¥»çÀÌÆ®¸¶´Ù ´Ù¸¥ IP ÁÖ¼Ò¸¦ »ç¿ëÇÏ´Â + "IP±â¹Ý (IP-based)" ¹æ½Ä°ú ÇÑ + IP ÁÖ¼Ò´ç ¿©·¯ À̸§À» °¡Áö´Â "À̸§±â¹Ý (name-based)" ¹æ½ÄÀÌ + ÀÖ´Ù. ¿©·¯ »çÀÌÆ®µéÀÌ °°Àº ¼­¹ö¿¡¼­ µ¹°íÀÖ´Ù´Â »ç½ÇÀ» À¥»ç¿ëÀÚ´Â + ´«Ä¡Ã¤Áö ¸øÇÑ´Ù.

    + +

    ¾ÆÆÄÄ¡´Â ±âº»À¸·Î IP±â¹Ý °¡»óÈ£½ºÆ®¸¦ Áö¿øÇÑ ÃÊâ±â + ¼­¹öµéÁß Çϳª´Ù. ¾ÆÆÄÄ¡ ¹öÀü 1.1 ÀÌ»óÀº IP±â¹Ý°ú À̸§±â¹Ý + °¡»óÈ£½ºÆ®¸¦ ¸ðµÎ Áö¿øÇÑ´Ù. À̸§±â¹Ý °¡»óÈ£½ºÆ®¸¦ + È£½ºÆ®±â¹Ý (host-based) ¶Ç´Â ºñIP °¡»óÈ£½ºÆ® + (non-IP virtual hosts)¶ó°íµµ ºÎ¸¥´Ù.

    + +

    ´ÙÀ½Àº ¾ÆÆÄÄ¡ ¹öÀü 1.3 ÀÌ»óÀÇ °¡»óÈ£½ºÆ® Áö¿øÀ» ÀÚ¼¼È÷ + ¼³¸íÇÑ ¹®¼­µéÀÌ´Ù.

    + +
    + +
    top
    +
    top
    +
    +

    ¼³Á¤ Áö½Ã¾î

    + + + +

    °¡»óÈ£½ºÆ® ¼³Á¤À» Å×½ºÆ®ÇÒ¶§ ¾ÆÆÄÄ¡ÀÇ -S + ¸í·ÉÇà ¿É¼ÇÀÌ À¯¿ëÇÏ´Ù. Áï, ´ÙÀ½°ú °°ÀÌ ½ÇÇàÇÑ´Ù:

    + +

    + /usr/local/apache2/bin/httpd -S +

    + +

    ÀÌ ¸í·É¾î´Â ¾ÆÆÄÄ¡°¡ ÀÐÀº ¼³Á¤ÆÄÀÏ¿¡ ´ëÇÑ + Á¤º¸¸¦ Ãâ·ÂÇÑ´Ù. IP ÁÖ¼Ò¿Í ¼­¹ö¸íÀ» ÀÚ¼¼È÷ »ìÆ캸¸é ¼³Á¤¿¡¼­ + ½Ç¼ö¸¦ ¹ß°ßÇϴµ¥ µµ¿òÀÌ µÉ °ÍÀÌ´Ù. (´Ù¸¥ ¸í·ÉÇà ¿É¼ÇµéÀº + httpd ÇÁ·Î±×·¥ ¹®¼­¸¦ + Âü°íÇ϶ó.)

    + +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/vhosts/index.html.ru.koi8-r b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/index.html.ru.koi8-r new file mode 100644 index 00000000..da6f38a5 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/index.html.ru.koi8-r @@ -0,0 +1,107 @@ + + + +äÏËÕÍÅÎÔÁÃÉÑ ÐÏ ×ÉÒÔÕÁÌØÎÙÍ ÈÏÓÔÁÍ × Apache - HTTP ÓÅÒ×ÅÒ Apache + + + + + +
    <-
    +

    äÏËÕÍÅÎÔÁÃÉÑ ÐÏ ×ÉÒÔÕÁÌØÎÙÍ ÈÏÓÔÁÍ × Apache

    +
    +

    äÏÓÔÕÐÎÙÅ ÑÚÙËÉ:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + + +

    ôÅÒÍÉÎ ×ÉÒÔÕÁÌØÎÙÊ ÈÏÓÔ ÏÔÎÏÓÉÔÓÑ Ë ÐÒÁËÔÉËÅ + ÒÁÚÍÅÝÅÎÉÑ ÂÏÌÅÅ ÞÅÍ ÏÄÎÏÇÏ ×ÅÂ-ÓÁÊÔÁ (ÎÁÐÒÉÍÅÒ, + www.company1.com É www.company2.com) + ÎÁ ÏÄÎÏÊ ÍÁÛÉÎÅ. ÷ÉÒÔÕÁÌØÎÙÊ ÈÏÓÔ ÍÏÖÅÔ ÂÙÔØ ËÁË «ÐÒÉ×ÑÚÁÎÎÙÍ Ë IP-ÁÄÒÅÓÕ», ÞÔÏ ÏÚÎÁÞÁÅÔ + ÉÓÐÏÌØÚÏ×ÁÎÉÅ ÏÔÄÅÌØÎÏÇÏ IP ÁÄÒÅÓÁ ÄÌÑ ËÁÖÄÏÇÏ ÓÁÊÔÁ, ÌÉÂÏ «ÐÒÉ×ÑÚÁÎÎÙÍ Ë ÉÍÅÎÉ», ÐÏÚ×ÏÌÑÑ ×ÁÍ + ÉÍÅÔØ ÎÅÓËÏÌØËÏ ÒÁÚÌÉÞÎÙÈ ÉͣΠÄÌÑ ËÁÖÄÏÇÏ IP-ÁÄÒÅÓÁ. æÁËÔ ÔÏÇÏ, + ÞÔÏ ÜÔÉ ÓÁÊÔÙ ÒÁÂÏÔÁÀÔ ÎÁ ÏÄÎÏÍ É ÔÏÍ ÖÅ ÆÉÚÉÞÅÓËÏÍ ÓÅÒ×ÅÒÅ, + ÎÅ ÏÞÅ×ÉÄÅÎ ËÏÎÅÞÎÙÍ ÐÏÌØÚÏ×ÁÔÅÌÑÍ.

    + +

    Apache ÂÙÌ ÏÄÎÉÍ ÉÚ ÐÅÒ×ÙÈ ÓÅÒ×ÅÒÏ×, ËÏÔÏÒÙÊ ÐÏÄÄÅÒÖÉ×ÁÌ IP-ÐÒÉ×ÑÚÁÎÎÙÅ + ×ÉÒÔÕÁÌØÎÙÅ ÈÏÓÔÙ. ÷ÅÒÓÉÉ Apache 1.1 É ÂÏÌÅÅ ÎÏ×ÙÅ ÐÏÄÄÅÒÖÉ×ÁÀÔ ËÁË + IP-ÐÒÉ×ÑÚÁÎÎÙÅ, ÔÁË É ×ÉÒÔÕÁÌØÎÙÅ ÈÏÓÔÙ, ÏÐÒÅÄÅÌÑÅÍÙÅ ÐÏ ÉÍÅÎÉ. + ðÏÓÌÅÄÎÉÊ ×ÁÒÉÁÎÔ ×ÉÒÔÕÁÌØÎÙÈ ÈÏÓÔÏ× ÔÁËÖÅ ÉÎÏÇÄÁ + ÎÁÚÙ×ÁÀÔ ÈÏÓÔ-ÐÒÉ×ÑÚÁÎÎÙÍÉ ÉÌÉ ÎÅ-IP ×ÉÒÔÕÁÌØÎÙÍÉ ÈÏÓÔÁÍÉ.

    + +

    îÉÖÅ ×Ù ×ÉÄÉÔÅ ÓÐÉÓÏË ÄÏËÕÍÅÎÔÏ×, ËÏÔÏÒÙÅ ÄÅÔÁÌØÎÏ ÏÂßÑÓÎÑÀÔ + ÐÏÄÄÅÒÖËÕ ×ÉÒÔÕÁÌØÎÙÈ ÈÏÓÔÏ× × Apache 1.3 É ×ÙÛÅ.

    + +
    + +
    top
    +
    top
    +
    +

    ëÏÎÆÉÇÕÒÁÃÉÏÎÎÙÅ ÄÉÒÅËÔÉ×Ù

    + + + +

    åÓÌÉ ×Ù ÐÙÔÁÅÔÅÓØ ÏÔÌÁÖÉ×ÁÔØ ×ÁÛÕ ËÏÎÆÉÇÕÒÁÃÉÀ Ó ×ÉÒÔÕÁÌØÎÙÍÉ ÈÏÓÔÁÍÉ, ÔÏ + ËÌÀÞ ÄÌÑ ÚÁÐÕÓËÁ Apache ÉÚ ËÏÍÁÎÄÎÏÊ ÓÔÒÏËÉ -S ÂÕÄÅÔ ËÒÁÊÎÅ ÐÏÌÅÚÅÎ. + ôÏ ÅÓÔØ, ÓÌÕÄÅÔ ÉÓÐÏÌØÚÏ×ÁÔØ ÓÌÅÄÕÀÝÕÀ ËÏÍÁÎÄÕ:

    + +

    + /usr/local/apache2/bin/httpd -S +

    + +

    üÔÁ ËÏÍÁÎÄÁ ÒÁÓÐÅÞÁÔÁÅÔ ÏÐÉÓÁÎÉÅ ÔÏÇÏ, ËÁË Apache ÒÁÚÏÂÒÁÌ + ÆÁÊÌ ËÏÎÆÉÇÕÒÁÃÉÉ. ôÝÁÔÅÌØÎÏÅ ÉÚÕÞÅÎÉÅ IP ÁÄÒÅÓÏ× É ÉͣΠÓÅÒ×ÅÒÏ× + ÐÏÍÏÖÅÔ ÎÁÊÔÉ ÏÛÉÂËÉ ËÏÎÆÉÇÕÒÁÃÉÉ. (óÍÏÔÒÉÔÅ ÔÁËÖÅ + ÄÏËÕÍÅÎÔÁÃÉÀ Ë ÐÒÏÇÒÁÍÍÅ httpd ÄÌÑ + ÉÚÕÞÅÎÉÑ ÄÒÕÇÉÈ ÐÁÒÁÍÅÔÒÏ× ÄÌÑ ÚÁÐÕÓËÁ ÉÚ ËÏÍÁÎÄÎÏÊ ÓÔÒÏËÉ.)

    + +
    +
    +

    äÏÓÔÕÐÎÙÅ ÑÚÙËÉ:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/vhosts/index.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/index.html.tr.utf8 new file mode 100644 index 00000000..c9c54a51 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/index.html.tr.utf8 @@ -0,0 +1,107 @@ + + + +Apache Sanal Konak Belgeleri - Apache HTTP Sunucusu + + + + + +
    <-
    +

    Apache Sanal Konak Belgeleri

    +
    +

    Mevcut Diller:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + + +

    Sanal Konak (Virtual Host) terimi tek bir makine üzerinde + birden fazla sitenin (www.sirket1.dom, www.sirket2.dom gibi) barındırılma + uygulamasını betimler. Sanal konaklar, "IP’ye dayalı" veya "isme dayalı" olabilir; birincisinde, her site + ayrı bir IP adresinden sunulurken, ikincisinde her IP adresinde birden + fazla site sunulur. Olayda aynı fiziksel sunucu kullanıldığı halde bu + sunucu son kullanıcıya görünür değildir.

    + +

    Apache yazılımsal olarak IP’ye dayalı sanal konakları destekleyen ilk + sunuculardan biridir. 1.1 sürümünden itibaren Apache hem IP’ye dayalı hem + de isme dayalı sanal konakları desteklemektedir. İsme dayalı sanal + konaklara bazen konağa dayalı sanal konaklar veya IP’ye + dayanmayan sanal konaklar da denmektedir.

    + +

    Aşağıda, Apache’nin 1.3 sürümü ve sonrası için sanal konak desteğini bütün + ayrıntıları ile açıklayan belgeler listelenmiştir.

    + +
    + +
    top
    +
    top
    +
    +

    Yapılandırma Yönergeleri

    + + + +

    Sanal konak yapılandırmanız üzerinde hata ayıklamaya çalışıyorsanız + Apache’nin -S komut satırı seçeneği şu şekilde çok işinize + yarayabilir:

    + +

    + /usr/local/apache2/bin/httpd -S +

    + +

    Bu komut, yapılandırma dosyasının Apache yorumunu dökümler. IP + adreslerinin ve sunucu isimlerinin dikkatli bir incelemesi, yapılandırma + yanlışlarınızı keşfetmenize yardımcı olabilir. (Diğer komut satırı + seçenekleri için httpd programının belgelerine + bakınız.)

    + +
    +
    +

    Mevcut Diller:  de  | + en  | + es  | + ja  | + ko  | + ru  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/vhosts/ip-based.html b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/ip-based.html new file mode 100644 index 00000000..f2417b60 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/ip-based.html @@ -0,0 +1,13 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: ip-based.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: ip-based.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: ip-based.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/vhosts/ip-based.html.en b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/ip-based.html.en new file mode 100644 index 00000000..51fa0b07 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/ip-based.html.en @@ -0,0 +1,160 @@ + + + +Apache IP-based Virtual Host Support - Apache HTTP Server + + + + + +
    <-
    +

    Apache IP-based Virtual Host Support

    +
    +

    Available Languages:  en  | + ko  | + tr 

    +
    +
    + +
    top
    +
    +

    System requirements

    + +

    As the term IP-based indicates, the server + must have a different IP address for each IP-based + virtual host. This can be achieved by the machine + having several physical network connections, or by use of + virtual interfaces which are supported by most modern operating + systems (see system documentation for details, these are + frequently called "ip aliases", and the "ifconfig" command is + most commonly used to set them up).

    + +
    top
    +
    +

    How to set up Apache

    + +

    There are two ways of configuring apache to support multiple + hosts. Either by running a separate httpd daemon for + each hostname, or by running a single daemon which supports all the + virtual hosts.

    + +

    Use multiple daemons when:

    + +
      +
    • There are security partitioning issues, such as company1 + does not want anyone at company2 to be able to read their + data except via the web. In this case you would need two + daemons, each running with different User, Group, Listen, and ServerRoot settings.
    • + +
    • You can afford the memory and file descriptor + requirements of listening to every IP alias on the + machine. It's only possible to Listen to the "wildcard" + address, or to specific addresses. So if you have a need to + listen to a specific address for whatever reason, then you + will need to listen to all specific addresses. (Although one + httpd could listen to N-1 of the addresses, and another could + listen to the remaining address.)
    • +
    + +

    Use a single daemon when:

    + +
      +
    • Sharing of the httpd configuration between virtual hosts + is acceptable.
    • + +
    • The machine services a large number of requests, and so + the performance loss in running separate daemons may be + significant.
    • +
    + +
    top
    +
    +

    Setting up multiple daemons

    + +

    Create a separate httpd installation for each + virtual host. For each installation, use the Listen directive in the + configuration file to select which IP address (or virtual host) + that daemon services. e.g.

    + +

    + Listen www.smallco.com:80 +

    + +

    It is recommended that you use an IP address instead of a + hostname (see DNS caveats).

    + +
    top
    +
    +

    Setting up a single daemon + with virtual hosts

    + +

    For this case, a single httpd will service requests for the + main server and all the virtual hosts. The VirtualHost directive + in the configuration file is used to set the values of ServerAdmin, ServerName, DocumentRoot, ErrorLog and TransferLog + or CustomLog + configuration directives to different values for each virtual + host. e.g.

    + +

    + <VirtualHost www.smallco.com>
    + ServerAdmin webmaster@mail.smallco.com
    + DocumentRoot /groups/smallco/www
    + ServerName www.smallco.com
    + ErrorLog /groups/smallco/logs/error_log
    + TransferLog /groups/smallco/logs/access_log
    + </VirtualHost>
    +
    + <VirtualHost www.baygroup.org>
    + ServerAdmin webmaster@mail.baygroup.org
    + DocumentRoot /groups/baygroup/www
    + ServerName www.baygroup.org
    + ErrorLog /groups/baygroup/logs/error_log
    + TransferLog /groups/baygroup/logs/access_log
    + </VirtualHost> +

    + +

    It is recommended that you use an IP address instead of a + hostname (see DNS caveats).

    + +

    Almost any configuration directive can be + put in the VirtualHost directive, with the exception of + directives that control process creation and a few other + directives. To find out if a directive can be used in the + VirtualHost directive, check the Context using the + directive index.

    + +

    SuexecUserGroup + may be used inside a + VirtualHost directive if the suEXEC + wrapper is used.

    + +

    SECURITY: When specifying where to write log files, + be aware of some security risks which are present if anyone + other than the user that starts Apache has write access to the + directory where they are written. See the security tips document + for details.

    + +
    +
    +

    Available Languages:  en  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/vhosts/ip-based.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/ip-based.html.ko.euc-kr new file mode 100644 index 00000000..96fd784b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/ip-based.html.ko.euc-kr @@ -0,0 +1,150 @@ + + + +¾ÆÆÄÄ¡ IP±â¹Ý °¡»óÈ£½ºÆ® Áö¿ø - Apache HTTP Server + + + + + +
    <-
    +

    ¾ÆÆÄÄ¡ IP±â¹Ý °¡»óÈ£½ºÆ® Áö¿ø

    +
    +

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

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

    ½Ã½ºÅÛ ¿ä±¸»çÇ×

    + +

    IP±â¹ÝÀ̶õ ¸»ÀÌ ÀǹÌÇϵíÀÌ ¼­¹ö´Â + IP±â¹Ý °¡»óÈ£½ºÆ® °¢°¢¿¡ ´ëÇØ ´Ù¸¥ IP ÁÖ¼Ò¸¦ + °¡Á®¾ßÇÑ´Ù. ÀÌ´Â ÄÄÇ»Å͸¦ ¹°¸®ÀûÀ¸·Î ¿©·¯ ³×Æ®¿÷¿¡ + ¿¬°áÇϰųª, ÃÖ±Ù ¿î¿µÃ¼Á¦¿¡¼­ Áö¿øÇÏ´Â °¡»ó ÀÎÅÍÆäÀ̽º¸¦ + (ÀÚ¼¼ÇÑ ³»¿ëÀº ½Ã½ºÅÛ ¹®¼­¸¦ Âü°íÇ϶ó. ÈçÈ÷ "ip aliases"¶ó°í + Çϸç, º¸Åë "ifconfig" ¸í·É¾î·Î ¸¸µç´Ù) »ç¿ëÇÏ¿© °¡´ÉÇÏ´Ù.

    + +
    top
    +
    +

    ¾ÆÆÄÄ¡ ¼³Á¤¹æ¹ý

    + +

    ¿©·¯ È£½ºÆ®¸¦ Áö¿øÇϵµ·Ï ¾ÆÆÄÄ¡¸¦ ¼³Á¤ÇÏ´Â ¹æ¹ýÀº µÎ°¡Áö´Ù. + Çϳª´Â °¢ È£½ºÆ®¸¶´Ù º°µµÀÇ À¥¼­¹ö¸¦ ½ÇÇàÇÏ´Â + ¹ýÀÌ°í, ´Ù¸¥ Çϳª´Â ¸ðµç °¡»óÈ£½ºÆ®¸¦ Áö¿øÇÏ´Â ¼­¹ö ÇÑ°³¸¦ + ½ÇÇàÇÏ´Â ¹æ¹ýÀÌ´Ù.

    + +

    ¾ðÁ¦ ¿©·¯ ¼­¹ö¸¦ »ç¿ëÇϳª:

    + +
      +
    • ȸ»ç2ÀÇ »ç¿ëÀÚ°¡ À¥ÀÌ¿ÜÀÇ ¹æ¹ýÀ¸·Î ȸ»ç1ÀÇ ÀڷḦ ÀÐÀ» + ¼ö ¾ø°Ô ÇÏ´Â µî º¸¾È»ó ±¸ºÐÀÌ ÇÊ¿äÇÑ °æ¿ì. ÀÌ °æ¿ì + µÎ ¼­¹ö¸¦ °¢°¢ ´Ù¸¥ User, Group, Listen, ServerRoot ¼³Á¤À¸·Î ½ÇÇàÇØ¾ß ÇÑ´Ù.
    • + +
    • ÃæºÐÇÑ ¸Þ¸ð¸®°¡ ÀÖ°í, ÄÄÇ»ÅÍÀÇ ¸ðµç IP¸¦ ±â´Ù¸®±âÀ§ÇÑ + ÆÄÀϱâ¼úÀÚ(file descriptor) + ¿ä±¸»çÇ×µµ ¸¸Á·ÇÑ´Ù. "¿ÍÀϵåÄ«µå"³ª ƯÁ¤ ÁÖ¼Ò¸¦ ListenÇÒ ¼ö¸¸ ÀÖ´Ù. ±×·¡¼­ + ¾î¶² ÀÌÀ¯¿¡¼­°Ç ƯÁ¤ ÁÖ¼Ò¸¦ ±â´Ù¸± ÇÊ¿ä°¡ ÀÖ´Ù¸é, (ÇÑ + À¥¼­¹ö°¡ ÇÑ ÁÖ¼Ò¸¦ Á¦¿ÜÇÑ ¸ðµç ÁÖ¼Ò¸¦ ±â´Ù¸®°í ´Ù¸¥ ÇÑ + À¥¼­¹ö°¡ Á¦¿ÜÇÑ ÁÖ¼Ò¸¦ ±â´Ù¸± ¼ö ÀÖÁö¸¸) ÁöÁ¤ÇÑ ÁÖ¼Ò + ¸ðµÎ¸¦ ±â´Ù·Á¾ß ÇÑ´Ù.
    • +
    + +

    ¾ðÁ¦ ¼­¹ö ÇÑ°³¸¦ »ç¿ëÇϳª:

    + +
      +
    • °¡»óÈ£½ºÆ®µéÀÇ À¥¼­¹ö ¼³Á¤À» °øÀ¯ÇÒ ¼ö ÀÖ´Â °æ¿ì.
    • + +
    • ÄÄÇ»ÅÍ°¡ ¸Å¿ì ¸¹Àº ¿äûÀ» ¼­ºñ½ºÇÑ´Ù¸é ¿©·¯ ¼­¹ö¸¦ + ½ÇÇàÇϱ⿡ ¼Óµµ ¼Õ½ÇÀÌ Å¬ ¼ö ÀÖ´Ù.
    • +
    + +
    top
    +
    +

    ¿©·¯ ¼­¹ö¸¦ ½ÇÇàÇϱâ

    + +

    °¢ °¡»óÈ£½ºÆ®º°·Î À¥¼­¹ö¸¦ ¼³Ä¡ÇÑ´Ù. ¼³Á¤ÆÄÀÏÀÇ + Listen Áö½Ã¾î¿¡ + ¼­¹ö°¡ ¼­ºñ½ºÇÒ IP ÁÖ¼Ò(ȤÀº °¡»óÈ£½ºÆ®)¸¦ Àû¾îÁØ´Ù. ¿¹¸¦ + µé¸é,

    + +

    + Listen www.smallco.com:80 +

    + +

    È£½ºÆ®¸í º¸´Ù´Â IP ÁÖ¼Ò¸¦ »ç¿ëÇÏ±æ ¹Ù¶õ´Ù. + (DNS ¹®Á¦ Âü°í)

    + +
    top
    +
    +

    ¼­¹ö Çϳª·Î °¡»óÈ£½ºÆ® ½ÇÇàÇϱâ

    + +

    ÀÌ °æ¿ì À¥¼­¹ö ÇÑ°³·Î ÁÖ¼­¹ö¿Í ¸ðµç °¡»óÈ£½ºÆ®¿¡ ´ëÇÑ + ¿äûÀ» ¼­ºñ½ºÇÑ´Ù. ¼³Á¤ÆÄÀÏÀÇ VirtualHost Áö½Ã¾î¿¡ °¡»óÈ£½ºÆ®¸¶´Ù + ´Ù¸¥ ServerAdmin, + ServerName, DocumentRoot, ErrorLog, TransferLog, + CustomLog + Áö½Ã¾î °ªÀ» ¼³Á¤ÇÑ´Ù. ¿¹¸¦ µé¸é,

    + +

    + <VirtualHost www.smallco.com>
    + ServerAdmin webmaster@mail.smallco.com
    + DocumentRoot /groups/smallco/www
    + ServerName www.smallco.com
    + ErrorLog /groups/smallco/logs/error_log
    + TransferLog /groups/smallco/logs/access_log
    + </VirtualHost>
    +
    + <VirtualHost www.baygroup.org>
    + ServerAdmin webmaster@mail.baygroup.org
    + DocumentRoot /groups/baygroup/www
    + ServerName www.baygroup.org
    + ErrorLog /groups/baygroup/logs/error_log
    + TransferLog /groups/baygroup/logs/access_log
    + </VirtualHost> +

    + +

    È£½ºÆ®¸í º¸´Ù´Â IP ÁÖ¼Ò¸¦ »ç¿ëÇÏ±æ ¹Ù¶õ´Ù. + (DNS ¹®Á¦ Âü°í)

    + +

    VirtualHost Áö½Ã¾î ¾È¿¡¼­´Â ÇÁ·Î¼¼½º »ý¼º°ú ±âŸ ¸î¸î Áö½Ã¾î¸¦ + Á¦¿ÜÇÏ°í °ÅÀÇ ¸ðµç ¼³Á¤Áö½Ã¾î¸¦ »ç¿ëÇÒ + ¼ö ÀÖ´Ù. VirtualHost Áö½Ã¾î ¾È¿¡¼­ Áö½Ã¾î¸¦ »ç¿ëÇÒ ¼ö ÀÖ´ÂÁö + ¾Ë·Á¸é Áö½Ã¾î ¸ñ·Ï¿¡¼­ + »ç¿ëÀå¼Ò¸¦ + È®ÀÎÇ϶ó.

    + +

    suEXEC ÇÁ·Î±×·¥À» + »ç¿ëÇÑ´Ù¸é VirtualHost Áö½Ã¾î ¾È¿¡ User¿Í GroupÀ» »ç¿ëÇÒ ¼ö ÀÖ´Ù.

    + +

    º¸¾È: ¼­¹ö¸¦ ½ÇÇàÇÏ´Â »ç¿ëÀÚ¿Ü¿¡ ´Ù¸¥ »ç¶÷¿¡°Ô + ·Î±×ÆÄÀÏÀÌ ÀÖ´Â µð·ºÅ丮ÀÇ ¾²±â±ÇÇÑÀÌ ÀÖ´Ù¸é º¸¾È + ¹®Á¦¸¦ Á¶½ÉÇ϶ó. ÀÚ¼¼ÇÑ ³»¿ëÀº º¸¾È ÆÁÀ» Âü°íÇ϶ó.

    + +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/vhosts/ip-based.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/ip-based.html.tr.utf8 new file mode 100644 index 00000000..78bf8a49 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/ip-based.html.tr.utf8 @@ -0,0 +1,165 @@ + + + +Apache’de IP’ye Dayalı Sanal Konak Desteği - Apache HTTP Sunucusu + + + + + +
    <-
    +

    Apache’de IP’ye Dayalı Sanal Konak Desteği

    +
    +

    Mevcut Diller:  en  | + ko  | + tr 

    +
    +
    + +
    top
    +
    +

    Sistem gereksinimleri

    + +

    IP’ye dayalı deyince, sunucunun her IP’ye dayalı + sanal konak için ayrı bir IP adresine sahip olduğunu anlıyoruz. + Bunun olması için, makine ya çok sayıda ağ bağlantısına sahiptir ya da + makinede, günümüzde çoğu işletim sistemi tarafından desteklenen sanal + arabirimler kullanılıyordur. (Sanal arabirimlerle ilgili ayrıntılar için + sistem belgelerinize bakınız; bu konu genellikle IP rumuzları (ip aliases) + olarak geçer ve ayarlamak için genellikle "ifconfig" komutu + kullanılır.)

    + +
    top
    +
    +

    Apache nasıl ayarlanır?

    + +

    Çok sayıda konağı desteklemek üzere Apache iki şekilde + yapılandırılabilir. Ya her konak için ayrı bir httpd + süreci çalıştırırsınız ya da tüm sanal konakları destekleyen tek bir + süreciniz olur.

    + +

    Çok sayıda süreç kullanıyorsanız:

    + +
      +
    • Güvenli bölgeler oluşturmanız gerekiyordur. Örneğin, şirket2’deki hiç + kimse dosya sistemi üzerinden şirket1’e ait verileri okuyamasın, sadece + herkes gibi tarayıcı kullanarak okuyabilsin istenebilir. Bu durumda, + User, + Group, + Listen ve + ServerRoot yönergeleri farklı + değerlerle yapılandırılmış iki ayrı süreç çalıştırmanız gerekir.
    • + +
    • Makine üzerindeki her IP adresini dinlemek için gereken + dosya tanıtıcı + ve bellek miktarını makul bir seviyede tutabilirsiniz. Bu sadece belli + adresleri dinleyerek veya çok sayıda adresle eşleşen adres kalıpları + kullanarak mümükün olabilir. Zaten, bir sebeple belli bir adresi dinleme + ihtiyacı duyarsanız, diğer tüm adresleri de ayrı ayrı dinlemeniz + gerekir. (Bir httpd programı N-1 adresi dinlerken + diğerleri kalan adresleri dinleyebilir.)
    • +
    + +

    Tek bir süreç kullanıyorsanız:

    + +
      +
    • httpd yapılandırmasının sanal konaklar arasında + paylaşılmasına izin veriliyor demektir.
    • + +
    • Makine çok büyük miktarda isteği karşılayabilir ve ayrı ayrı + süreçlerin çalışmasından kaynaklanan önemli başarım kayıpları + yaşanmaz.
    • +
    + +
    top
    +
    +

    Çok sayıda sürecin yapılandırılması

    + +

    Her sanal konak için ayrı bir httpd yapılandırması + oluşturulur. Her yapılandırmada, o süreç tarafından sunulacak IP adresi + (veya sanal konak) için Listen + yönergesi kullanılır. Örnek:

    + +

    + Listen www.birkobi.dom:80 +

    + +

    Burada konak ismi yerine IP adresi kullanmanız önerilir (ayrıntılar için + DNS ile ilgili konular belgesine + bakınız).

    + +
    top
    +
    +

    Sanal konaklar tek bir sürecin yapılandırılması

    + +

    Bu durum için, ana sunucu ve sanal konakların tümüne gelen istekler tek + bir httpd süreci tarafından karşılanır. Yapılandırma + dosyasında, her sanal konak için, farklı değerlere sahip ServerAdmin, ServerName, DocumentRoot, ErrorLogveTransferLog + veya CustomLog yönergeleri + içeren ayrı birer VirtualHost bölümü + oluşturulur. Örnek:

    + +

    + <VirtualHost www.birkobi.dom> + + ServerAdmin bilgi@posta.birkobi.dom
    + DocumentRoot /gruplar/birkobi/belgeler
    + ServerName www.birkobi.dom
    + ErrorLog /gruplar/birkobi/günlükler/hatalar.log
    + TransferLog /gruplar/birkobi/günlükler/erisim.log +
    + </VirtualHost>
    +
    + <VirtualHost www.digerkobi.dom> + + ServerAdmin bilgi@posta.digerkobi.dom
    + DocumentRoot /gruplar/digerkobi/belgeler
    + ServerName www.digerkobi.dom
    + ErrorLog /gruplar/digerkobi/günlükler/hatalar.log
    + TransferLog /gruplar/digerkobi/günlükler/erisim.log +
    + </VirtualHost> +

    + +

    Burada konak isimlerinin yerlerine IP adreslerini kullanmanız önerilir + (ayrıntılar için DNS ile ilgili konular + belgesine bakınız).

    + +

    Süreç oluşturmayı denetleyen yönergeler ve bir kaç başka yönerge dışında + hemen hemen tüm yapılandırma yönergeleri VirtualHost bölümleri içinde kullanılabilir. Bir + yönergenin VirtualHost bölümlerinde + kullanılıp kullanılmayacağını öğrenmek için yönerge dizinini kullanarak yönergenin Bağlam’ına bakınız.

    + +

    suEXEC sarmalayıcısı kullanıldığı takdirde + SuexecUserGroup yönergesi de + bir VirtualHost bölümü içinde + kullanılabilir.

    + +

    GÜVENLİK:Günlük dosyalarının yazılacağı yeri belirlerken, + Apache’yi başlatan kullanıcıdan başka kimsenin yazamayacağı bir yerin + seçilmesi bazı güvenlik risklerini ortadan kaldırmak bakımından önemlidir. + Ayrıntılar için güvenlik ipuçları + belgesine bakınız.

    +
    +
    +

    Mevcut Diller:  en  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/vhosts/mass.html b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/mass.html new file mode 100644 index 00000000..408420d1 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/mass.html @@ -0,0 +1,13 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: mass.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: mass.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: mass.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/vhosts/mass.html.en b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/mass.html.en new file mode 100644 index 00000000..ee0f0f1d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/mass.html.en @@ -0,0 +1,419 @@ + + + +Dynamically Configured Mass Virtual Hosting - Apache HTTP Server + + + + + +
    <-
    +

    Dynamically Configured Mass Virtual Hosting

    +
    +

    Available Languages:  en  | + ko  | + tr 

    +
    + + +

    This document describes how to efficiently serve an + arbitrary number of virtual hosts with the Apache httpd webserver. +

    + +
    + +
    top
    +
    +

    Motivation

    + +

    The techniques described here are of interest if your + httpd.conf contains many + <VirtualHost> sections that are + substantially the same, for example:

    + +

    +NameVirtualHost 111.22.33.44
    +<VirtualHost 111.22.33.44>
    + + ServerName www.customer-1.com
    + DocumentRoot /www/hosts/www.customer-1.com/docs
    + ScriptAlias /cgi-bin/ /www/hosts/www.customer-1.com/cgi-bin
    +
    +</VirtualHost>
    +<VirtualHost 111.22.33.44>
    + + ServerName www.customer-2.com
    + DocumentRoot /www/hosts/www.customer-2.com/docs
    + ScriptAlias /cgi-bin/ /www/hosts/www.customer-2.com/cgi-bin
    +
    +</VirtualHost>
    +# blah blah blah
    +<VirtualHost 111.22.33.44>
    + + ServerName www.customer-N.com
    + DocumentRoot /www/hosts/www.customer-N.com/docs
    + ScriptAlias /cgi-bin/ /www/hosts/www.customer-N.com/cgi-bin
    +
    +</VirtualHost> +

    + +

    The basic idea is to replace all of the static + <VirtualHost> configurations with a mechanism + that works them out dynamically. This has a number of + advantages:

    + +
      +
    1. Your configuration file is smaller, so Apache starts + more quickly and uses less memory.
    2. + +
    3. Adding virtual hosts is simply a matter of creating the + appropriate directories in the filesystem and entries in the + DNS - you don't need to reconfigure or restart Apache.
    4. +
    + +

    The main disadvantage is that you cannot have a different log file for + each virtual host; however, if you have many virtual hosts, doing + this can be a bad idea anyway, because of the number of file + descriptors needed. It is better to log to a pipe or a fifo, and arrange for + the process at the other end to distribute the logs to the customers. + (This can also be used to accumulate statistics, etc.).

    + +
    top
    +
    +

    Overview

    + +

    A virtual host is defined by two pieces of information: its + IP address, and the contents of the Host: header + in the HTTP request. The dynamic mass virtual hosting technique + used here is based on automatically inserting this information into the + pathname of the file that is used to satisfy the request. This + can be most easily done by using mod_vhost_alias + with Apache 2.0. Alternatively, mod_rewrite can be used. + Both of these modules are disabled by default; you must enable + one of them when configuring and building Apache if you want to + use this technique.

    + +

    A couple of things need to be `faked' to make the dynamic + virtual host look like a normal one. The most important is the + server name, which is used by Apache to generate + self-referential URLs etc. It is configured with the + ServerName directive, and it is available to CGIs + via the SERVER_NAME environment variable. The + actual value used at run time is controlled by the UseCanonicalName + setting. With UseCanonicalName Off, the server name + is taken from the contents of the Host: header in the + request. With UseCanonicalName DNS, it is taken from a + reverse DNS lookup of the virtual host's IP address. The former + setting is used for name-based dynamic virtual hosting, and the + latter is used for IP-based hosting. If Apache cannot work out + the server name because there is no Host: header, + or the DNS lookup fails, then the value configured with + ServerName is used instead.

    + +

    The other thing to `fake' is the document root (configured + with DocumentRoot and available to CGIs via the + DOCUMENT_ROOT environment variable). In a normal + configuration, this is used by the core module when + mapping URIs to filenames, but when the server is configured to + do dynamic virtual hosting, that job must be taken over by another + module (either mod_vhost_alias or + mod_rewrite), which has a different way of doing + the mapping. Neither of these modules is responsible for + setting the DOCUMENT_ROOT environment variable so + if any CGIs or SSI documents make use of it, they will get a + misleading value.

    + +
    top
    +
    +

    Simple Dynamic Virtual Hosts

    + +

    This extract from httpd.conf implements the + virtual host arrangement outlined in the Motivation section above, but in a + generic fashion using mod_vhost_alias.

    + +

    +# get the server name from the Host: header
    +UseCanonicalName Off
    +
    +# this log format can be split per-virtual-host based on the first field
    +LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon
    +CustomLog logs/access_log vcommon
    +
    +# include the server name in the filenames used to satisfy requests
    +VirtualDocumentRoot /www/hosts/%0/docs
    +VirtualScriptAlias /www/hosts/%0/cgi-bin +

    + +

    This configuration can be changed into an IP-based virtual + hosting solution by just turning UseCanonicalName + Off into UseCanonicalName DNS. The server + name that is inserted into the filename is then derived from + the IP address of the virtual host.

    + +
    top
    +
    +

    A Virtually Hosted Homepages System

    + +

    This is an adjustment of the above system, tailored for an + ISP's homepages server. Using a slightly more complicated + configuration, we can select substrings of the server name to + use in the filename so that, for example, the documents for + www.user.isp.com are found in + /home/user/. It uses a single cgi-bin + directory instead of one per virtual host.

    + +

    +# all the preliminary stuff is the same as above, then
    +
    +# include part of the server name in the filenames
    +VirtualDocumentRoot /www/hosts/%2/docs
    +
    +# single cgi-bin directory
    +ScriptAlias /cgi-bin/ /www/std-cgi/
    +

    + +

    There are examples of more complicated + VirtualDocumentRoot settings in the + mod_vhost_alias documentation.

    + +
    top
    +
    +

    Using Multiple Virtual + Hosting Systems on the Same Server

    + +

    With more complicated setups, you can use Apache's normal + <VirtualHost> directives to control the + scope of the various virtual hosting configurations. For + example, you could have one IP address for general customers' homepages, + and another for commercial customers, with the following setup. + This can, of course, be combined with conventional + <VirtualHost> configuration sections.

    + +

    +UseCanonicalName Off
    +
    +LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon
    +
    +<Directory /www/commercial>
    + + Options FollowSymLinks
    + AllowOverride All
    +
    +</Directory>
    +
    +<Directory /www/homepages>
    + + Options FollowSymLinks
    + AllowOverride None
    +
    +</Directory>
    +
    +<VirtualHost 111.22.33.44>
    + + ServerName www.commercial.isp.com
    +
    + CustomLog logs/access_log.commercial vcommon
    +
    + VirtualDocumentRoot /www/commercial/%0/docs
    + VirtualScriptAlias /www/commercial/%0/cgi-bin
    +
    +</VirtualHost>
    +
    +<VirtualHost 111.22.33.45>
    + + ServerName www.homepages.isp.com
    +
    + CustomLog logs/access_log.homepages vcommon
    +
    + VirtualDocumentRoot /www/homepages/%0/docs
    + ScriptAlias /cgi-bin/ /www/std-cgi/
    +
    +</VirtualHost> +

    + +
    top
    +
    +

    More Efficient IP-Based Virtual Hosting

    + +

    The configuration changes suggested to turn the first + example into an IP-based virtual hosting setup result in + a rather inefficient setup. A new DNS lookup is required for every + request. To avoid this overhead, the filesystem can be arranged to + correspond to the IP addresses, instead of to the host names, thereby + negating the need for a DNS lookup. Logging will also have to be adjusted + to fit this system.

    + +

    +# get the server name from the reverse DNS of the IP address
    +UseCanonicalName DNS
    +
    +# include the IP address in the logs so they may be split
    +LogFormat "%A %h %l %u %t \"%r\" %s %b" vcommon
    +CustomLog logs/access_log vcommon
    +
    +# include the IP address in the filenames
    +VirtualDocumentRootIP /www/hosts/%0/docs
    +VirtualScriptAliasIP /www/hosts/%0/cgi-bin
    +

    + +
    top
    +
    +

    Simple Dynamic + Virtual Hosts Using mod_rewrite

    + +

    This extract from httpd.conf does the same + thing as the first example. The first + half is very similar to the corresponding part above, except for + some changes, required for backward compatibility and to make the + mod_rewrite part work properly; the second half + configures mod_rewrite to do the actual work.

    + +

    There are a couple of especially tricky bits: by default, + mod_rewrite runs before other URI translation + modules (mod_alias etc.) - so if you wish to use these modules, mod_rewrite must be configured to accommodate + them. Also, some magic is required to do a + per-dynamic-virtual-host equivalent of + ScriptAlias.

    + +

    +# get the server name from the Host: header
    +UseCanonicalName Off
    +
    +# splittable logs
    +LogFormat "%{Host}i %h %l %u %t \"%r\" %s %b" vcommon
    +CustomLog logs/access_log vcommon
    +
    +<Directory /www/hosts>
    + + # ExecCGI is needed here because we can't force
    + # CGI execution in the way that ScriptAlias does
    + Options FollowSymLinks ExecCGI
    +
    +</Directory>
    +
    +# now for the hard bit
    +
    +RewriteEngine On
    +
    +# a ServerName derived from a Host: header may be any case at all
    +RewriteMap lowercase int:tolower
    +
    +## deal with normal documents first:
    +# allow Alias /icons/ to work - repeat for other aliases
    +RewriteCond %{REQUEST_URI} !^/icons/
    +# allow CGIs to work
    +RewriteCond %{REQUEST_URI} !^/cgi-bin/
    +# do the magic
    +RewriteRule ^/(.*)$ /www/hosts/${lowercase:%{SERVER_NAME}}/docs/$1
    +
    +## and now deal with CGIs - we have to force a MIME type
    +RewriteCond %{REQUEST_URI} ^/cgi-bin/
    +RewriteRule ^/(.*)$ /www/hosts/${lowercase:%{SERVER_NAME}}/cgi-bin/$1 [T=application/x-httpd-cgi]
    +
    +# that's it! +

    + +
    top
    +
    +

    A + Homepages System Using mod_rewrite

    + +

    This does the same thing as the second + example.

    + +

    +RewriteEngine on
    +
    +RewriteMap lowercase int:tolower
    +
    +# allow CGIs to work
    +RewriteCond %{REQUEST_URI} !^/cgi-bin/
    +
    +# check the hostname is right so that the RewriteRule works
    +RewriteCond ${lowercase:%{SERVER_NAME}} ^www\.[a-z-]+\.isp\.com$
    +
    +# concatenate the virtual host name onto the start of the URI
    +# the [C] means do the next rewrite on the result of this one
    +RewriteRule ^(.+) ${lowercase:%{SERVER_NAME}}$1 [C]
    +
    +# now create the real file name
    +RewriteRule ^www\.([a-z-]+)\.isp\.com/(.*) /home/$1/$2
    +
    +# define the global CGI directory
    +ScriptAlias /cgi-bin/ /www/std-cgi/ +

    + +
    top
    +
    +

    Using a Separate Virtual + Host Configuration File

    + +

    This arrangement uses more advanced mod_rewrite + features to work out the translation from virtual host to document + root, from a separate configuration file. This provides more + flexibility, but requires more complicated configuration.

    + +

    The vhost.map file should look something like + this:

    + +

    +www.customer-1.com /www/customers/1
    +www.customer-2.com /www/customers/2
    +# ...
    +www.customer-N.com /www/customers/N
    +

    + +

    The httpd.conf should contain the following:

    + +

    +RewriteEngine on
    +
    +RewriteMap lowercase int:tolower
    +
    +# define the map file
    +RewriteMap vhost txt:/www/conf/vhost.map
    +
    +# deal with aliases as above
    +RewriteCond %{REQUEST_URI} !^/icons/
    +RewriteCond %{REQUEST_URI} !^/cgi-bin/
    +RewriteCond ${lowercase:%{SERVER_NAME}} ^(.+)$
    +# this does the file-based remap
    +RewriteCond ${vhost:%1} ^(/.*)$
    +RewriteRule ^/(.*)$ %1/docs/$1
    +
    +RewriteCond %{REQUEST_URI} ^/cgi-bin/
    +RewriteCond ${lowercase:%{SERVER_NAME}} ^(.+)$
    +RewriteCond ${vhost:%1} ^(/.*)$
    +RewriteRule ^/(.*)$ %1/cgi-bin/$1 [T=application/x-httpd-cgi] +

    + +
    +
    +

    Available Languages:  en  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/vhosts/mass.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/mass.html.ko.euc-kr new file mode 100644 index 00000000..060c69b1 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/mass.html.ko.euc-kr @@ -0,0 +1,425 @@ + + + +´ë·®ÀÇ °¡»óÈ£½ºÆ®¸¦ µ¿ÀûÀ¸·Î ¼³Á¤Çϱâ - Apache HTTP Server + + + + + +
    <-
    +

    ´ë·®ÀÇ °¡»óÈ£½ºÆ®¸¦ µ¿ÀûÀ¸·Î ¼³Á¤Çϱâ

    +
    +

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

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

    ÀÌ ¹®¼­´Â ¾ÆÆÄÄ¡ 1.3¿¡¼­ ´ë·®ÀÇ °¡»óÈ£½ºÆ®¸¦ È¿À²ÀûÀ¸·Î + ¼­ºñ½ºÇÏ´Â ¹æ¹ýÀ» ¼³¸íÇÑ´Ù. +

    + +
    + +
    top
    +
    +

    µ¿±â

    + +

    ´ç½ÅÀÇ httpd.conf¿¡ ´ÙÀ½°ú °°ÀÌ ¼­·Î ºñ½ÁÇÑ + <VirtualHost> ¼½¼ÇµéÀ» ¸¹ÀÌ ÀÖ´Ù¸é ¿©±â¼­ + ¼³¸íÇÏ´Â ¹æ¹ýÀÌ µµ¿òÀÌ µÉ °ÍÀÌ´Ù:

    + +

    +NameVirtualHost 111.22.33.44
    +<VirtualHost 111.22.33.44>
    + + ServerName www.customer-1.com
    + DocumentRoot /www/hosts/www.customer-1.com/docs
    + ScriptAlias /cgi-bin/ /www/hosts/www.customer-1.com/cgi-bin
    +
    +</VirtualHost>
    +<VirtualHost 111.22.33.44>
    + + ServerName www.customer-2.com
    + DocumentRoot /www/hosts/www.customer-2.com/docs
    + ScriptAlias /cgi-bin/ /www/hosts/www.customer-2.com/cgi-bin
    +
    +</VirtualHost>
    +# ¹Ùº¸ ¹Ùº¸ ¹Ùº¸
    +<VirtualHost 111.22.33.44>
    + + ServerName www.customer-N.com
    + DocumentRoot /www/hosts/www.customer-N.com/docs
    + ScriptAlias /cgi-bin/ /www/hosts/www.customer-N.com/cgi-bin
    +
    +</VirtualHost> +

    + +

    ±âº» °³³äÀº Á¤ÀûÀÎ <VirtualHost> + ¼³Á¤ ¸ðµÎ¸¦ µ¿ÀûÀ¸·Î ó¸®Çϵµ·Ï ´ëüÇÏ´Â °ÍÀÌ´Ù. + ±×·¯¸é ¸¹Àº ÀåÁ¡ÀÌ ÀÖ´Ù:

    + +
      +
    1. ¼³Á¤ÆÄÀÏÀÌ ÀÛ¾ÆÁ®¼­ ¾ÆÆÄÄ¡°¡ »¡¸® ½ÃÀÛÇÏ°í ¸Þ¸ð¸®¸¦ + Àû°Ô »ç¿ëÇÑ´Ù.
    2. + +
    3. °¡»óÈ£½ºÆ®¸¦ Ãß°¡ÇϱâÀ§ÇØ ÆÄÀϽýºÅÛ¿¡ Àû´çÇÑ + µð·ºÅ丮¸¦ ¸¸µé°í DNS¿¡ Ç׸ñÀ» Ãß°¡Çϱ⸸ ÇϸéµÈ´Ù. Áï, + ¾ÆÆÄÄ¡¸¦ Àç¼³Á¤ÇÏ°í Àç½ÃÀÛÇÒ ÇÊ¿ä°¡ ¾ø´Ù.
    4. +
    + +

    ´ÜÁ¡Àº °¢ °¡»óÈ£½ºÆ®º°·Î ´Ù¸¥ ·Î±×ÆÄÀÏÀ» »ç¿ëÇÒ ¼ö ¾ø´Ù´Â + Á¡ÀÌ´Ù. ±×·¯³ª ¸Å¿ì ¸¹Àº °¡»óÈ£½ºÆ®¸¦ »ç¿ëÇÑ´Ù¸é ÆÄÀϱâ¼úÀÚ¸¦ + ´Ù ½á¹ö¸®±â¶§¹®¿¡ ¼­·Î ´Ù¸¥ ·Î±×ÆÄÀÏÀ» »ç¿ëÇÒ ¼ö ¾ø´Ù. ÆÄÀÌÇÁ³ª + fifo·Î ·Î±×¸¦ º¸³»°í, ¹Þ´Â Æí¿¡¼­ ·Î±×¸¦ ó¸®ÇÏ¿© ³ª´©´Â + ¹æ¹ýÀÌ (Åë°è µîÀ» ¸ðÀ» ¼öµµ ÀÖ´Ù) ´õ ³´´Ù.

    + +
    top
    +
    +

    °³¿ä

    + +

    °¡»óÈ£½ºÆ®´Â IP ÁÖ¼Ò¿Í HTTP ¿äûÀÇ Host: + Çì´õ Á¤º¸·Î Á¤ÀÇÇÑ´Ù. ±âº»ÀûÀ¸·Î ´ë·®ÀÇ + µ¿Àû °¡»óÈ£½ºÆ® ±â¼úÀº ÀÚµ¿À¸·Î °¡»óÈ£½ºÆ® Á¤º¸¸¦ ¿äûÀÇ + ÆÄÀÏ°æ·Î¿¡ Æ÷ÇÔÇÑ´Ù. ÀÌ´Â ´ëºÎºÐ mod_vhost_alias¸¦ + »ç¿ëÇÏ¿© ½±°Ô ÇØ°áÇÒ ¼ö ÀÖÁö¸¸, ¾ÆÆÄÄ¡ 1.3.6 ÀÌÇϸ¦ »ç¿ëÇÑ´Ù¸é + mod_rewrite¸¦ »ç¿ëÇØ¾ß ÇÑ´Ù. ÀÌ µÎ ¸ðµâ + ¸ðµÎ ±âº»ÀûÀ¸·Î ¼­¹ö¿¡ Æ÷ÇÔµÇÁö ¾Ê´Â´Ù. ÀÌ ¹æ¹ýÀ» »ç¿ëÇÏ·Á¸é + ¾ÆÆÄÄ¡¸¦ ±¸¼ºÇÏ°í ÄÄÆÄÀÏÇÒ¶§ Æ÷ÇÔÇØ¾ß ÇÑ´Ù.

    + +

    µ¿Àû °¡»óÈ£½ºÆ®¸¦ ÀϹÝÀûÀÎ °¡»óÈ£½ºÆ®Ã³·³ º¸ÀÌ°ÔÇÏ·Á¸é + ¿©·¯°¡Áö¸¦ `¼Ó¿©¾ß' ÇÑ´Ù. °¡Àå Áß¿äÇÑ °ÍÀº ¾ÆÆÄÄ¡°¡ ÀÚ±âÂüÁ¶ + URL µîÀ» ¸¸µé¶§ »ç¿ëÇÒ ¼­¹ö¸íÀÌ´Ù. ¼­¹ö¸íÀº + ServerName Áö½Ã¾î·Î ¼³Á¤Çϸç, CGI¿¡´Â + SERVER_NAME ȯ°æº¯¼ö·Î ÁÖ¾îÁø´Ù. ½ÇÇàÁß ½ÇÁ¦ + ¼­¹ö¸íÀº UseCanonicalName ¼³Á¤¿¡ ´Þ·È´Ù. + UseCanonicalName OffÀÌ¸é ¿äûÀÇ Host: + Çì´õ ³»¿ëÀÌ ¼­¹ö¸íÀÌ µÈ´Ù. UseCanonicalName DNSÀ̸é + °¡»óÈ£½ºÆ®ÀÇ IP ÁÖ¼Ò¸¦ ¿ªDNS °Ë»öÇÏ¿© ¼­¹ö¸íÀ» ¾Ë¾Æ³½´Ù. + ÀüÀÚ´Â À̸§±â¹Ý µ¿Àû °¡»óÈ£½ºÆ®¿¡¼­ »ç¿ëÇÏ°í, ÈÄÀÚ´Â IP±â¹Ý + °¡»óÈ£½ºÆ®¿¡¼­ »ç¿ëÇÑ´Ù. Host: Çì´õ°¡ ¾ø°Å³ª + DNS °Ë»öÀÌ ½ÇÆÐÇÏ¿© ¾ÆÆÄÄ¡°¡ ¼­¹ö¸íÀ» ¾Ë¾Æ³»Áö ¸øÇϸé + ServerNameÀ¸·Î ¼³Á¤ÇÑ °ªÀ» ´ë½Å »ç¿ëÇÑ´Ù.

    + +

    ´Ù¸¥ `¼ÓÀÏ' °ÍÀº (DocumentRoot·Î ¼³Á¤Çϸç, + CGI¿¡´Â DOCUMENT_ROOT ȯ°æº¯¼ö·Î ÁÖ¾îÁö´Â) + ¹®¼­·çÆ®ÀÌ´Ù. ÀϹÝÀûÀÎ °æ¿ì core ¸ðµâÀÌ ÀÌ ¼³Á¤À» »ç¿ëÇÏ¿© + URI¿¡ ÇØ´çÇÏ´Â ÆÄÀϸíÀ» ãÁö¸¸, ¼­¹ö¸¦ µ¿Àû °¡»óÈ£½ºÆÃÀ» ÇÒ¶§´Â ´Ù¸¥ + ¸ðµâÀÌ (mod_vhost_alias³ª mod_rewrite) + ´Ù¸¥ ¹æ¹ýÀ¸·Î ÀÌ·± ÀÛ¾÷À» ÇÑ´Ù. µÎ ¸ðµâ ¸ðµÎ + DOCUMENT_ROOT ȯ°æº¯¼ö¸¦ »ç¿ëÇÏÁö ¾ÊÀ¸¹Ç·Î + CGI³ª SSI ¹®¼­°¡ ÀÌ °ªÀ» »ç¿ëÇÑ´Ù¸é À߸øµÈ °á°ú¸¦ ¾òÀ» ¼ö + ÀÖ´Ù.

    + +
    top
    +
    +

    °£´ÜÇÑ µ¿Àû °¡»óÈ£½ºÆ®

    + +

    À§ µ¿±â ÀýÀÇ °¡»óÈ£½ºÆ® + ¼³Á¤À» mod_vhost_alias¸¦ »ç¿ëÇÏ¿© ´õ ÀϹÝÀûÀ¸·Î + ±¸ÇöÇß´Ù.

    + +

    +# Host: Çì´õ¿¡¼­ ¼­¹ö¸íÀ» ¾Ë¾Æ³½´Ù
    +UseCanonicalName Off
    +
    +# ù¹ø° Çʵ带 »ç¿ëÇÏ¿© ÀÌ ·Î±×¸¦ °¡»óÈ£½ºÆ®º°·Î ³ª´­ ¼ö ÀÖ´Ù
    +LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon
    +CustomLog logs/access_log vcommon
    +
    +# ¿äûÀ» ó¸®ÇϱâÀ§ÇØ ÆÄÀÏ¸í¿¡ ¼­¹ö¸íÀ» Æ÷ÇÔÇÑ´Ù
    +VirtualDocumentRoot /www/hosts/%0/docs
    +VirtualScriptAlias /www/hosts/%0/cgi-bin +

    + +

    ÀÌ ¼³Á¤¿¡¼­ UseCanonicalName Off¸¦ + UseCanonicalName DNS·Î º¯°æÇϱ⸸ Çϸé IP±â¹Ý + °¡»óÈ£½ºÆ®°¡ µÈ´Ù. °¡»óÈ£½ºÆ®ÀÇ IP ÁÖ¼Ò¸¦ °¡Áö°í + ÆÄÀÏ¸í¿¡ Ãß°¡ÇÒ ¼­¹ö¸íÀ» ¾Ë ¼ö ÀÖ´Ù.

    + +
    top
    +
    +

    °¡»óÀ¸·Î È£½ºÆ®Çϴ ȨÆäÀÌÁö ½Ã½ºÅÛ

    + +

    ISP ȨÆäÀÌÁö ¼­¹ö¸¦ À§ÇØ À§ÀÇ ¼³Á¤À» ¼öÁ¤Çß´Ù. Á¶±Ý ´õ + º¹ÀâÇÑ ¼³Á¤À» »ç¿ëÇϸé www.user.isp.comÀÇ ¹®¼­¸¦ + /home/user/¿¡ µÎ´Â ½ÄÀ¸·Î ¼­¹ö¸íÀÇ ÀϺθ¦ °¡Áö°í + ÆÄÀϸíÀ» ¸¸µé ¼ö ÀÖ´Ù. ÀÌ ¼³Á¤Àº + cgi-binÀ» °¢ °¡»óÈ£½ºÆ®°¡ µû·Î °¡ÁöÁö¾Ê°í + ¸ðµç °¡»óÈ£½ºÆ®°¡ °°ÀÌ »ç¿ëÇÑ´Ù.

    + +

    +# ±âº»ÀûÀÎ ³»¿ëÀº À§¿Í °°´Ù. ±×¸®°í
    +
    +# ÆÄÀÏ¸í¿¡ ¼­¹ö¸íÀÇ ÀϺθ¦ Æ÷ÇÔÇÑ´Ù
    +VirtualDocumentRoot /www/hosts/%2/docs
    +
    +# ÇϳªÀÇ cgi-bin µð·ºÅ丮
    +ScriptAlias /cgi-bin/ /www/std-cgi/
    +

    + +

    mod_vhost_alias ¹®¼­¿¡´Â ´õ º¹ÀâÇÑ + VirtualDocumentRoot ¼³Á¤ÀÇ ¿¹°¡ ÀÖ´Ù.

    + +
    top
    +
    +

    ÇÑ ¼­¹ö¿¡ ¿©·¯ °¡»óÈ£½ºÆ® + ½Ã½ºÅÛ »ç¿ëÇϱâ

    + +

    ´õ º¹ÀâÇÑ ¼³Á¤ÀÇ ¿¹·Î ¾ÆÆÄÄ¡ÀÇ ÀϹÝÀûÀÎ + <VirtualHost> Áö½Ã¾î¸¦ »ç¿ëÇÏ¿© ¿©·¯ + °¡»óÈ£½ºÆ® ¼³Á¤ÀÇ ¹üÀ§¸¦ Á¶ÀýÇÒ ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î, ´ÙÀ½°ú + °°Àº ¼³Á¤Àº ȨÆäÀÌÁö °í°´¿¡ IP ÁÖ¼Ò ÇÑ°³, »ó¾÷ÀûÀÎ + °í°´¿¡°Ô ´Ù¸¥ IP ÁÖ¼Ò ÇÑ°³¸¦ ºÎ¿©ÇÑ´Ù. ¹°·Ð ÀÌÀüó·³ + <VirtualHost> ¼³Á¤ ¼½¼Ç¿¡ ¸ðµÎ ¹­À» ¼öµµ + ÀÖ´Ù.

    + +

    +UseCanonicalName Off
    +
    +LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon
    +
    +<Directory /www/commercial>
    + + Options FollowSymLinks
    + AllowOverride All
    +
    +</Directory>
    +
    +<Directory /www/homepages>
    + + Options FollowSymLinks
    + AllowOverride None
    +
    +</Directory>
    +
    +<VirtualHost 111.22.33.44>
    + + ServerName www.commercial.isp.com
    +
    + CustomLog logs/access_log.commercial vcommon
    +
    + VirtualDocumentRoot /www/commercial/%0/docs
    + VirtualScriptAlias /www/commercial/%0/cgi-bin
    +
    +</VirtualHost>
    +
    +<VirtualHost 111.22.33.45>
    + + ServerName www.homepages.isp.com
    +
    + CustomLog logs/access_log.homepages vcommon
    +
    + VirtualDocumentRoot /www/homepages/%0/docs
    + ScriptAlias /cgi-bin/ /www/std-cgi/
    +
    +</VirtualHost> +

    + +
    top
    +
    +

    ´õ È¿À²ÀûÀÎ IP±â¹Ý °¡»óÈ£½ºÆ®

    + +

    ù¹ø° ¿¹¿¡¼­ ³ª´Â ¼³Á¤À» °£´ÜÈ÷ + IP±â¹Ý °¡»óÈ£½ºÆ®·Î ¹Ù²Ü ¼ö ÀÖ´Ù°í ¸»Çß´Ù. ºÒÇàÈ÷µµ + ±×·± ¼³Á¤Àº ¸Å ¿äû¸¶´Ù DNS¸¦ ã¾Æ¾ßÇϹǷΠ¸Å¿ì ºñÈ¿À²ÀûÀÌ´Ù. + À̸§´ë½Å IP ÁÖ¼Ò·Î ÆÄÀϽýºÅÛÀ» ±¸¼ºÇÏ°í °°Àº ¹æ½ÄÀ¸·Î + ·Î±×¸¦ ¼öÁ¤ÇÏ¸é ¹®Á¦¸¦ ÇØ°áÇÒ ¼ö ÀÖ´Ù. ¾ÆÆÄÄ¡´Â ¼­¹ö¸íÀ» + ´Ù·ê ÇÊ¿ä°¡ ¾ø¾îÁö°í, DNS °Ë»öµµ ÇÏÁö ¾Ê°Ô µÈ´Ù.

    + +

    +# IP ÁÖ¼Ò¸¦ ¿ªDNS °Ë»öÇÏ¿© ¼­¹ö¸íÀ» ¾Ë¾Æ³½´Ù
    +UseCanonicalName DNS
    +
    +# ·Î±×¸¦ ³ª´­ ¼ö ÀÖµµ·Ï IP ÁÖ¼Ò¸¦ Æ÷ÇÔÇÑ´Ù
    +LogFormat "%A %h %l %u %t \"%r\" %s %b" vcommon
    +CustomLog logs/access_log vcommon
    +
    +# ÆÄÀÏ¸í¿¡ IP ÁÖ¼Ò¸¦ Æ÷ÇÔÇÑ´Ù
    +VirtualDocumentRootIP /www/hosts/%0/docs
    +VirtualScriptAliasIP /www/hosts/%0/cgi-bin
    +

    + +
    top
    +
    +

    ¾ÆÆÄÄ¡ ÀÌÀü ¹öÀü »ç¿ëÇϱâ

    + +

    À§ ¿¹µéÀº ¾ÆÆÄÄ¡ ¹öÀü 1.3.6 ÀÌÈÄ¿¡ Æ÷ÇÔµÈ + mod_vhost_aliasÀ» »ç¿ëÇÑ´Ù. + mod_vhost_alias°¡ ¾ø´Â ¾ÆÆÄÄ¡ ¹öÀüÀ» »ç¿ëÇÑ´Ù¸é + ÀÌ¹Ì ¸»ÇßµíÀÌ mod_rewrite¸¦ »ç¿ëÇÏ¿©, ´Ü + Host:-Çì´õ±â¹Ý °¡»óÈ£½ºÆ®¸¸À», ±¸ÇöÇÒ ¼ö ÀÖ´Ù.

    + +

    ¶Ç ·Î±×¿¡ °üÇÏ¿© ÁÖÀÇÇÒ Á¡ÀÌ ÀÖ´Ù. ¾ÆÆÄÄ¡ 1.3.6¿¡¼­ + ·Î±×Çü½Ä Áö½Ã¾î %V°¡ Æ÷ÇԵǾú°í, ¹öÀü 1.3.0 + - 1.3.3¿¡¼­ ÀÌ ±â´ÉÀ» %v ¿É¼ÇÀÌ ´ë½Å Çß´Ù. ±×·¯³ª + ¹öÀü 1.3.4¿¡´Â ÀÌ·± ±â´ÉÀÌ ¾ø´Ù. ¾î¶² ¾ÆÆÄÄ¡ ¹öÀü¿¡¼­µµ + .htaccess ÆÄÀÏ¿¡¼­ UseCanonicalName + Áö½Ã¾î¸¦ »ç¿ëÇÒ ¼ö ÀÖÀ¸¹Ç·Î ·Î±×¿¡ ÀÌ»óÇÑ ³»¿ëÀÌ ±â·ÏµÉ ¼ö ÀÖ´Ù. + ±×·¯¹Ç·Î °¡Àå ÁÁÀº ¹æ¹ýÀº %{Host}i Áö½Ã¾î¸¦ + »ç¿ëÇÏ¿© Host: Çì´õ¸¦ Á÷Á¢ ·Î±×¿¡ ³²±â´Â °ÍÀÌ´Ù. + ¶Ç, ÀÌ ¹æ¹ýÀº %V´Â Æ÷ÇÔÇÏÁö¾Ê´Â :port¸¦ + µÚ¿¡ Ãß°¡ÇÒ ¼ö ÀÖ´Ù.

    + +
    top
    +
    +

    mod_rewrite¸¦ + »ç¿ëÇÑ °£´ÜÇÑ µ¿Àû °¡»óÈ£½ºÆ®

    + +

    ´ÙÀ½Àº ù¹ø° ¿¹¿Í °°Àº ÀÏÀ» ÇÏ´Â + httpd.conf ¿¹ÀÌ´Ù. óÀ½ Àý¹ÝÀº ù¹ø° ¿¹¿Í + °ÅÀÇ ºñ½ÁÇÏÁö¸¸, ÀÌÀü ¹öÀü°úÀÇ È£È¯¼º°ú mod_rewriteÀÇ + ÀûÀýÇÑ µ¿ÀÛÀ» À§ÇØ ¼öÁ¤µÇ¾ú´Ù. ³ª¸ÓÁö Àý¹ÝÀº ½ÇÁ¦ ÀÛ¾÷À» + ÇÏ´Â mod_rewrite¸¦ ¼³Á¤ÇÑ´Ù.

    + +

    Ưº°È÷ ÁÖÀÇÇØ¾ß ÇÒ »çÇ×ÀÌ ÀÖ´Ù. ±âº»ÀûÀ¸·Î + mod_rewrite´Â (mod_alias µî) ´Ù¸¥ + URI ¹ø¿ª ¸ðµâ ÀÌÀü¿¡ ½ÇÇàµÈ´Ù. ±×·¡¼­ ´Ù¸¥ URI ¹ø¿ª ¸ðµâµé°ú + °°ÀÌ µ¿ÀÛÇÒ °ÍÀ» °í·ÁÇÏ¿© mod_rewrite¸¦ ¼³Á¤ÇØ¾ß ÇÑ´Ù. + ¶Ç, µ¿Àû °¡»óÈ£½ºÆ®¿¡¼­ ScriptAlias°ú °°Àº + ±â´ÉÀ» À§Çؼ­´Â Ưº°ÇÑ ÀÛ¾÷ÀÌ ÇÊ¿äÇÏ´Ù.

    + +

    +# Host: Çì´õ¿¡¼­ ¼­¹ö¸íÀ» ¾ò´Â´Ù
    +UseCanonicalName Off
    +
    +# splittable logs
    +LogFormat "%{Host}i %h %l %u %t \"%r\" %s %b" vcommon
    +CustomLog logs/access_log vcommon
    +
    +<Directory /www/hosts>
    + + # ScriptAlias ½ÄÀ¸·Î CGI ½ÇÇàÀ» °­Á¦ÇÒ ¼ö ¾ø±â¶§¹®¿¡
    + # ¿©±â¿¡ ExecCGI¸¦ »ç¿ëÇÑ´Ù
    + Options FollowSymLinks ExecCGI
    +
    +</Directory>
    +
    +# ÀÌÁ¦ ¾î·Á¿î ºÎºÐÀÌ´Ù
    +
    +RewriteEngine On
    +
    +# Host: Çì´õ¿¡¼­ °¡Á®¿Â ¼­¹ö¸í¿¡´Â ´ë¼Ò¹®ÀÚ°¡ µÚ¼¯¿©ÀÖÀ» ¼ö ÀÖ´Ù
    +RewriteMap lowercase int:tolower
    +
    +## ÀÏ¹Ý ¹®¼­¸¦ ¸ÕÀú ó¸®ÇÑ´Ù:
    +# Alias /icons/ °¡ µ¿ÀÛÇϵµ·Ï - ´Ù¸¥ alias¿¡ ´ëÇؼ­µµ ¹Ýº¹
    +RewriteCond %{REQUEST_URI} !^/icons/
    +# CGI°¡ µ¿ÀÛÇϵµ·Ï
    +RewriteCond %{REQUEST_URI} !^/cgi-bin/
    +# Ưº°ÇÑ ÀÛ¾÷
    +RewriteRule ^/(.*)$ /www/hosts/${lowercase:%{SERVER_NAME}}/docs/$1
    +
    +## ÀÌÁ¦ CGI¸¦ ó¸®ÇÑ´Ù - MIME typeÀ» °­Á¦ÇØ¾ß ÇÑ´Ù
    +RewriteCond %{REQUEST_URI} ^/cgi-bin/
    +RewriteRule ^/(.*)$ /www/hosts/${lowercase:%{SERVER_NAME}}/cgi-bin/$1 [T=application/x-httpd-cgi]
    +
    +# ³¡! +

    + +
    top
    +
    +

    mod_rewrite¸¦ + »ç¿ëÇÑ È¨ÆäÀÌÁö ½Ã½ºÅÛ

    + +

    ´ÙÀ½Àº µÎ¹ø° ¿¹¿Í °°Àº ÀÏÀ» + ÇÑ´Ù.

    + +

    +RewriteEngine on
    +
    +RewriteMap lowercase int:tolower
    +
    +# CGI°¡ µ¿ÀÛÇϵµ·Ï
    +RewriteCond %{REQUEST_URI} !^/cgi-bin/
    +
    +# RewriteRuleÀÌ µ¿ÀÛÇϵµ·Ï È£½ºÆ®¸íÀÌ ¿Ã¹Ù¸¥Áö °Ë»çÇÑ´Ù
    +RewriteCond ${lowercase:%{SERVER_NAME}} ^www\.[a-z-]+\.isp\.com$
    +
    +# °¡»óÈ£½ºÆ®¸íÀ» URI ¾Õ¿¡ ºÙÀδÙ
    +# [C]´Â ÀÌ °á°ú¸¦ °¡Áö°í ´ÙÀ½ ÀçÀÛ¼ºÀ» ¼öÇàÇÔÀ» ¶æÇÑ´Ù
    +RewriteRule ^(.+) ${lowercase:%{SERVER_NAME}}$1 [C]
    +
    +# ÀÌÁ¦ ½ÇÁ¦ ÆÄÀϸíÀ» ¸¸µç´Ù
    +RewriteRule ^www\.([a-z-]+)\.isp\.com/(.*) /home/$1/$2
    +
    +# Àüü CGI µð·ºÅ丮¸¦ Á¤ÀÇÇÑ´Ù
    +ScriptAlias /cgi-bin/ /www/std-cgi/ +

    + +
    top
    +
    +

    º°µµÀÇ °¡»óÈ£½ºÆ® ¼³Á¤ÆÄÀÏ + »ç¿ëÇϱâ

    + +

    ´ÙÀ½Àº mod_rewriteÀÇ °í±Þ ±â´ÉÀ» »ç¿ëÇÏ¿© + º°µµÀÇ ¼³Á¤ÆÄÀÏÀ» °¡Áö°í °¡»óÈ£½ºÆ®ÀÇ ¹®¼­·çÆ®¸¦ ¾Ë¾Æ³½´Ù. + ´õ À¯¿¬ÇÏÁö¸¸ ´õ º¹ÀâÇÑ ¼³Á¤ÀÌ ÇÊ¿äÇÏ´Ù.

    + +

    vhost.map ÆÄÀÏÀº ´ÙÀ½°ú °°´Ù:

    + +

    +www.customer-1.com /www/customers/1
    +www.customer-2.com /www/customers/2
    +# ...
    +www.customer-N.com /www/customers/N
    +

    + +

    http.conf´Â ´ÙÀ½°ú °°´Ù:

    + +

    +RewriteEngine on
    +
    +RewriteMap lowercase int:tolower
    +
    +# ´ëÀÀÆÄÀÏÀ» Á¤ÀÇÇÑ´Ù
    +RewriteMap vhost txt:/www/conf/vhost.map
    +
    +# À§¿Í °°ÀÌ aliasµéÀ» ó¸®ÇÑ´Ù
    +RewriteCond %{REQUEST_URI} !^/icons/
    +RewriteCond %{REQUEST_URI} !^/cgi-bin/
    +RewriteCond ${lowercase:%{SERVER_NAME}} ^(.+)$
    +# ÆÄÀÏ ³»¿ëÀ» °¡Áö°í ã´Â´Ù
    +RewriteCond ${vhost:%1} ^(/.*)$
    +RewriteRule ^/(.*)$ %1/docs/$1
    +
    +RewriteCond %{REQUEST_URI} ^/cgi-bin/
    +RewriteCond ${lowercase:%{SERVER_NAME}} ^(.+)$
    +RewriteCond ${vhost:%1} ^(/.*)$
    +RewriteRule ^/(.*)$ %1/cgi-bin/$1 +

    + +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/vhosts/mass.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/mass.html.tr.utf8 new file mode 100644 index 00000000..ff3f9990 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/mass.html.tr.utf8 @@ -0,0 +1,406 @@ + + + +Devingen olarak Yapılandırılan Kitlesel Sanal Barındırma - Apache HTTP Sunucusu + + + + + +
    <-
    +

    Devingen olarak Yapılandırılan Kitlesel Sanal Barındırma

    +
    +

    Mevcut Diller:  en  | + ko  | + tr 

    +
    + + +

    Bu belgede sanal konakların sonu belirsiz bir şekilde artışı karşısında + Apache httpd sunucusunun nasıl daha verimli kullanılacağı açıklanmıştır. +

    + +
    + +
    top
    +
    +

    Amaç

    + +

    Burada açıklanan teknikler, httpd.conf dosyanızın + örnekteki gibi, aslında hemen hemen birbirinin aynı çok sayıda + <VirtualHost> bölümü içereceği zaman yapılacaklar ile + ilgilidir.

    + +

    +NameVirtualHost 111.22.33.44
    +<VirtualHost 111.22.33.44>
    + + ServerName musteri-1.dom
    + DocumentRoot /siteler/musteri-1.dom/belgeler
    + ScriptAlias /cgi-bin/ /siteler/musteri-1.dom/cgi-bin
    +
    +</VirtualHost>
    +<VirtualHost 111.22.33.44>
    + + ServerName musteri-2.dom
    + DocumentRoot /siteler/musteri-2.dom/belgeler
    + ScriptAlias /cgi-bin/ /siteler/musteri-2.dom/cgi-bin
    +
    +</VirtualHost>
    +# blah blah blah
    +<VirtualHost 111.22.33.44>
    + + ServerName musteri-N.dom
    + DocumentRoot /siteler/musteri-N.dom/belgeler
    + ScriptAlias /cgi-bin/ /siteler/musteri-N.dom/cgi-bin
    +
    +</VirtualHost> +

    + +

    Ana fikir, tüm durağan <VirtualHost> + yapılandırmalarını devingen olarak çalışan tek bir + <VirtualHost> bölümüyle değiştirmektir. Bunun elbette + bazı getirileri olacaktır:

    + +
      +
    1. Yapılandırma dosyanız küçüleceği için Apache daha çabuk + başlatılabilecek ve daha az bellek harcayacaktır.
    2. + +
    3. Yeni sanal konakların eklenmesi, DNS’de yeni girdiler oluşturmak ve + dosya sisteminde bununla ilgili dizinleri açmak dışında biraz daha + basit olacaktır; en azından Apache’yi yeniden yapılandırmak ve yeniden + başlatmak zorunda kalmayacaksınız.
    4. +
    + +

    Ana götürüsü ise her sanal konak için ayrı birer günlük dosyasına sahip + olamayacak olmanızdır. Öte yandan, dosya tanıtıcılarının sınırlı olması + nedeniyle bunu yapmayı zaten istemezsiniz. Günlük kayıtları için bir + fifo veya bir boru hattı oluşturmak ve diğer uçta çalışan bir süreç + vasıtasıyla günlükleri müşterilere paylaştırmak daha iyidir (ayrıca, bu, + istatistikleri toplamanızı da kolaylaştırır).

    + +
    top
    +
    +

    Genel Bakış

    + +

    Bir sanal konak iki bilgiye bakarak belirlenir: IP adresi ve HTTP + isteğindeki Host: başlığının içeriği. Devingen sanal + barındırma tekniği, isteği yerine getirmek için kullanılacak dosya + yoluna bu bilgiyi kendiliğinden girmek esasına dayanır. Bu, Apache 2.0 + ile mod_vhost_alias kullanarak oldukça kolay + yapılabileceği gibi mod_rewrite da kullanılabilir. Bu + modüllerin her ikisi de öntanımlı olarak devre dışıdır. Bu tekniği + kullanmak isterseniz Apache’yi yeniden yapılandırıp derleyerek bu iki + modülü etkin duruma getirmeniz gerekir.

    + +

    Devingen sanal konağı normal bir sanal konak gibi göstermek için bazı + şeyleri ’göstermelik’ olarak yapmak gerekir. Bunlardan en önemlisi, + Apache tarafından göreli URL’lerden normal URL’leri ve benzerlerini + üretmek için kullanılan sunucu ismidir. Sunucu ismi + ServerName yönergesi ile yapılandırılır ve CGI’ler + tarafından SERVER_NAME ortam değişkeni üzerinden + kullanılır. Çalışma anındaki asıl değer UseCanonicalName yönergesi tarafından denetlenir. + UseCanonicalName Off olduğunda sunucu ismi isteğin + Host: başlık alanından elde edilir. UseCanonicalName + DNS belirtilmişse, sunucu ismi, sanal konağın IP adresinden + tersine DNS sorgusu yapılarak elde edilir. Birincisi isme dayalı sanal + konaklar tarafından ikincisi ise IP’ye dayalı sanal konaklar tarafından + kullanılır. Eğer Apache, istekte Host: başlığının olmayışı + veya DNS sorgusunun başarısız olması sebebiyle sunucu ismini elde + edemezse son çare olarak ServerName yönergesinde yazılı + değeri kullanır.

    + +

    ‘Göstermelik’ yapılan şeylerden biri de DocumentRoot + yönergesi ile yapılandırılan belge kök dizini olup CGI’ler tarafından + DOCUMENT_ROOT ortam değişkeni üzerinden kullanılır. Normal + yapılandırmada core modülü tarafından dosya isimlerini + URI’lere eşlerken kullanılır. Fakat sunucu devingen sanal konakları + kullanmak üzere yapılandırıldığında, eşleştirmeyi farklı yollardan yapan + başka bir modül devreye girer (mod_vhost_alias veya + mod_rewrite). DOCUMENT_ROOT ortam değişkenine + değerini atamaktan sorumlu olan bu iki modülden biri kullanılmazsa CGI + veya SSI belgeleri yanlış değerlerle üretilirler.

    + +
    top
    +
    +

    Basit Devingen Sanal Konaklar

    + +

    Yukarıda Amaç bölümünde özetlenen sanal konak + düzenlemesinin mod_vhost_alias kullanarak daha soysal bir + tarzda gerçekleştirilmiş halini içeren httpd.conf bölümü + aşağıdadır.

    + +

    +# sunucu ismini Host: başlığından elde edelim
    +UseCanonicalName Off
    +
    +# Bu günlükleme biçiminde ilk alana bakarak
    +# sanal konak günlükleri ayrıştırılabilir
    +LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon
    +CustomLog logs/access_log vcommon
    +
    +# istekleri yerine getirmek için kullanılacak
    +# dosya isimlerine sunucu ismini ekleyelim
    +VirtualDocumentRoot /siteler/%0/belgeler
    +VirtualScriptAlias /siteler/%0/cgi-bin +

    + +

    Bu yapılandırmayı IP’ye dayalı sanal konaklar için kullanmak isterseniz + UseCanonicalName Off yerine UseCanonicalName + DNS yazmanız yeterlidir. Böylece dosya ismine eklenecek konak + ismi sanal konağın IP adresinden türetilir.

    + +
    top
    +
    +

    Sanal Kişisel Sayfalar Sistemi

    + +

    Bu sistem, yukarıdaki yapılandırmanın bir ISS’nin kişisel sayfalar + sunucusuna uyarlanmasından başka bir şey değildir. Biraz daha karmaşık + bir yapılandırma ile dosya isimlerine /home/kullanıcı/ + dizinlerini ekleyebiliriz. Farklı olarak her sanal konak için bir tane + değil hepsi için bir tane cgi-bin olacaktır.

    + +

    +# Son bölüm hariç yukarıdaki yapılandırma, burada...
    +
    +# sunucu ismine eklenecek dosya isimlerini oluşturalım
    +VirtualDocumentRoot /siteler/%2/belgeler
    +
    +# ortak cgi-bin dizini
    +ScriptAlias /cgi-bin/ /siteler/std-cgi/
    +

    + +

    mod_vhost_alias belgesinde daha karmaşık + VirtualDocumentRoot örnekleri vardır.

    + +
    top
    +
    +

    Aynı Sunucuda Kişisel ve Kurumsal Sanal Konaklar

    + +

    Daha karmaşık ayarlamalar yaparak Apache’inin normal + <VirtualHost> bölümlerini farklı kitlesel sanal konak + yapılandırmaları için kullanabilirsiniz. Örneğin, bireysel + müşterileriniz için bir IP adresiniz, kurumsal müşterileriniz için de + başka bir IP adresiniz olsun. Her biri için ayrı ayrı sanal konaklar + ayarlamak yerine aşağıdaki gibi bir yapılandırma kullanabilirsiniz:

    + +

    +UseCanonicalName Off
    +
    +LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon
    +
    +<Directory /siteler/kurumsal>
    + + Options FollowSymLinks
    + AllowOverride All
    +
    +</Directory>
    +
    +<Directory /siteler/bireysel>
    + + Options FollowSymLinks
    + AllowOverride None
    +
    +</Directory>
    +
    +<VirtualHost 111.22.33.44>
    + + ServerName kurumsal.iss.dom
    +
    + CustomLog logs/access_log.kurumsal vcommon
    +
    + VirtualDocumentRoot /siteler/kurumsal/%0/belgeler
    + VirtualScriptAlias /siteler/kurumsal/%0/cgi-bin
    +
    +</VirtualHost>
    +
    +<VirtualHost 111.22.33.45>
    + + ServerName bireysel.iss.dom
    +
    + CustomLog logs/access_log.bireysel vcommon
    +
    + VirtualDocumentRoot /siteler/bireysel/%0/belgeler
    + ScriptAlias /cgi-bin/ /siteler/std-cgi/
    +
    +</VirtualHost> +

    +
    top
    +
    +

    IP’ye dayalı sanal konakları daha verimli kılmak

    + +

    İlk örnekte IP’ye dayalı sanal konaklar için + kullanılmak istenirse yapılandırmada neyin nasıl değiştirileceği + belirtilmişti. Her istek için ayrı bir DNS sorgusu gerekeceğinden bu + başarım düşmesine yol açar. DNS sorgusu ihtiyacını ortadan kaldırmak + için, bir çözüm olarak dosya sistemi, konak isimleri yerine IP + adreslerine göre düzenlenebilir. Günlük kayıtları da IP adreslerine göre + ayrıştırılacak şekilde ayarlanabilir.

    + +

    +# Sunucu ismini IP adresinden ters DNS sorgusu ile elde edelim
    +UseCanonicalName DNS
    +
    +# Günlük kayıtları IP adreslerine göre ayrıştırılabilsin
    +LogFormat "%A %h %l %u %t \"%r\" %s %b" vcommon
    +CustomLog logs/access_log vcommon
    +
    +# dosya isimleri IP adreslerini içersin
    +VirtualDocumentRootIP /siteler/%0/belgeler
    +VirtualScriptAliasIP /siteler/%0/cgi-bin
    +

    + +
    top
    +
    +

    mod_rewrite ile Kurumsal Müşteriler Sistemi

    + +

    Buradaki httpd.conf bölümü de ilk + örnekteki gibi elde edilmiştir. İlk yarı, bazı değişiklikler dışında + yukarıdaki örneğe çok benzer. Bu değişiklikler yapılandırmanın + mod_rewrite bölümünün düzgün çalışması ve geriye doğru + uyumluluk için gereklidir. İkinci yarı, asıl işi yapan + mod_rewrite yapılandırmasını içerir.

    + +

    Biraz uzmanlık gerektiren bazı kısımlar var: Öntanımlı olarak + mod_rewrite diğer (mod_alias, vs. gibi) URI + dönüşüm modüllerinden önce çalışır. Dolayısıyla bu modülleri kullanmak + isterseniz, mod_rewrite’ı bunlara izin verecek şekilde + yapılandırmalısınız. Ayrıca her devingen sanal konağa eşdeğer bir + ScriptAlias yapmak için de biraz büyü yapmak gerekir.

    + +

    +# Sunucu ismini Host: başlığınıdan alalım.
    +UseCanonicalName Off
    +
    +# Günlük dosyasından bilgileri ayıklayabilelim.
    +LogFormat "%{Host}i %h %l %u %t \"%r\" %s %b" vcommon
    +CustomLog logs/access_log vcommon
    +
    +<Directory /siteler/hosts>
    + + # ScriptAlias için yaptıklarımızla CGI betiklerini
    + # çalışmaya zorlayamayacağımızdan ExecCGI burada gerekli.
    + Options FollowSymLinks ExecCGI
    +
    +</Directory>
    +
    +# İşin zor yanına geldik.
    +
    +RewriteEngine On
    +
    +# Host: başlığından elde edilen sunucu isminde harf
    +# büyüklükleri çeşitli olabilir. Hepsini küçük harf yapalım.
    +RewriteMap lowercase int:tolower
    +
    +## önce normal belgelerle anlaşalım:
    +# Alias /icons/ çalışsın - diğer rumuzlar için yineleyelim
    +RewriteCond %{REQUEST_URI} !^/icons/
    +# CGI’ler de çalışsın.
    +RewriteCond %{REQUEST_URI} !^/cgi-bin/
    +# Biraz da büyü yapalım.
    +RewriteRule ^/(.*)$ /siteler/${lowercase:%{SERVER_NAME}}/belgeler/$1
    +
    +## Artık CGI’lerle anlaşabiliriz. - Bir MIME türü isteyelim.
    +RewriteCond %{REQUEST_URI} ^/cgi-bin/
    +RewriteRule ^/(.*)$ /siteler/${lowercase:%{SERVER_NAME}}/cgi-bin/$1 [T=application/x-httpd-cgi]
    +
    +# Bu kadar! +

    + +
    top
    +
    +

    mod_rewrite ile Kişisel Sayfalar Sistemi

    + +

    Burada da ikinci örnekte yaptıklarımızı + yapıyoruz.

    + +

    +RewriteEngine on
    +
    +RewriteMap lowercase int:tolower
    +
    +# CGI’ler çalışsın.
    +RewriteCond %{REQUEST_URI} !^/cgi-bin/
    +
    +# konak ismi doğru mu bakalım yoksa RewriteRule çalışmaz.
    +RewriteCond ${lowercase:%{SERVER_NAME}} ^www\.[a-z-]+\.isp\.dom$
    +
    +# URI’nin başına sanal konak ismini ekleyelim.
    +# [C], bunu bitirdikten sonra, sonraki rewrite ile devam et demek.
    +RewriteRule ^(.+) ${lowercase:%{SERVER_NAME}}$1 [C]
    +
    +# Artık asıl dosya ismini oluşturabiliriz.
    +RewriteRule ^www\.([a-z-]+)\.isp\.dom/(.*) /home/$1/$2
    +
    +# Ortak CGI dizinini tanımlayalım.
    +ScriptAlias /cgi-bin/ /siteler/std-cgi/ +

    + +
    top
    +
    +

    Sanal konaklar için ayrı bir yapılandırma dosyası kullanmak

    + +

    Burada, sanal konak isimlerinden belge kök dizini elde ederken + mod_rewrite modülünün daha gelişkin özelliklerinden + yararlanarak isimleri ayrı bir dosyadan okutacağız. Bu, esnekliği + artırır ama daha karmaşık bir yapılandırma gerekir.

    + +

    Aşağıdaki içeriğe sahip bir vhost.mapdosyamız olsun:

    + +

    +musteri-1.dom /siteler/kurumsal/1
    +musteri-2.dom /siteler/kurumsal/2
    +# ...
    +musteri-N.dom /siteler/kurumsal/N
    +

    + +

    httpd.conf dosyamız da şunları içerecektir:

    + +

    +RewriteEngine on
    +
    +RewriteMap lowercase int:tolower
    +
    +# Eşlem dosyasını tanımlayalım
    +RewriteMap vhost txt:/siteler/conf/vhost.map
    +
    +# Rumuzları yukarıdaki gibi halledelim.
    +RewriteCond %{REQUEST_URI} !^/icons/
    +RewriteCond %{REQUEST_URI} !^/cgi-bin/
    +RewriteCond ${lowercase:%{SERVER_NAME}} ^(.+)$
    +# Eşlemeyi dosyalar için de yapalım.
    +RewriteCond ${vhost:%1} ^(/.*)$
    +RewriteRule ^/(.*)$ %1/belgeler/$1
    +
    +RewriteCond %{REQUEST_URI} ^/cgi-bin/
    +RewriteCond ${lowercase:%{SERVER_NAME}} ^(.+)$
    +RewriteCond ${vhost:%1} ^(/.*)$
    +RewriteRule ^/(.*)$ %1/cgi-bin/$1 +

    + +
    +
    +

    Mevcut Diller:  en  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/vhosts/name-based.html b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/name-based.html new file mode 100644 index 00000000..10fcbf0e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/name-based.html @@ -0,0 +1,25 @@ +# GENERATED FROM XML -- DO NOT EDIT + +URI: name-based.html.de +Content-Language: de +Content-type: text/html; charset=ISO-8859-1 + +URI: name-based.html.en +Content-Language: en +Content-type: text/html; charset=ISO-8859-1 + +URI: name-based.html.es +Content-Language: es +Content-type: text/html; charset=ISO-8859-1 + +URI: name-based.html.ja.utf8 +Content-Language: ja +Content-type: text/html; charset=UTF-8 + +URI: name-based.html.ko.euc-kr +Content-Language: ko +Content-type: text/html; charset=EUC-KR + +URI: name-based.html.tr.utf8 +Content-Language: tr +Content-type: text/html; charset=UTF-8 diff --git a/rubbos/app/httpd-2.0.64/docs/manual/vhosts/name-based.html.de b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/name-based.html.de new file mode 100644 index 00000000..2799aa23 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/name-based.html.de @@ -0,0 +1,270 @@ + + + +Unterstützung namensbasierter virtueller Hosts - Apache HTTP Server + + + + + +
    <-
    +

    Unterstützung namensbasierter virtueller Hosts

    +
    +

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

    +
    + +

    Das Dokument beschreibt, wann und wie namensbasierte virtuelle Hosts zu + verwenden sind.

    +
    + +
    top
    +
    +

    Namensbasierte gegenüber IP-basierten + virtuellen Hosts

    + +

    IP-basierte virtuelle Hosts verwenden die IP-Adresse der Verbindung, um den + korrekten virtuellen Host zur Bedienung einer Anfrage zu ermitteln. Folglich + benötigen Sie eine IP-Adresse für jeden virtuellen Host. Bei der + Verwendung von namensbasierten virtuellen Hosts verläßt sich der + Server darauf, dass der Client den Hostnamen als Bestandteil der HTTP-Header + angibt. Durch Anwendung dieser Technik können sich mehrere verschiedene + Hosts die gleiche IP-Adresse teilen.

    + +

    Die Verwendung von namensbasierten virtuellen Hosts ist gewöhnlich + einfacher. Sie müssen lediglich Ihren DNS-Server darauf einstellen, + jeden Hostnamen auf die richtige IP-Adresse abzubilden, und dann den Apache + HTTP Server so konfigurieren, dass er die verschiedenen Hostnamen erkennt. + Namensbasierte virtuelle Hosts entschärfen auch den Bedarf an + knappen IP-Adressen. Daher sollten Sie namensbasierte virtuelle Hosts + verwenden, sofern kein besonderer Grund dafür existiert, IP-basierte + virtuelle Hosts zu wählen. Mögliche Gründe für die + Verwendung IP-basierter virtueller Hosts sind:

    + +
      +
    • Einige antike Clients sind nicht kompatibel zu namensbasierten + virtuellen Hosts. Damit namensbasierte virtuelle Hosts funktionieren, + muss der Client den HTTP-Host-Header senden. Dies ist bei HTTP/1.1 + vorgeschrieben und in allen modernen HTTP/1.0-Browsern als Erweiterung + implementiert. Wenn Sie Unterstützung für veraltete Clients + benötigen und dennoch namensbasierte virtuelle Hosts verwenden, + dann finden Sie eine mögliche Lösung dafür am Ende des + Dokuments.
    • + +
    • Namensbasierte virtuelle Hosts können aufgrund der Natur des + SSL-Protokolls nicht mit SSL-gesicherten Servern verwendet werden.
    • + +
    • Einige Betriebssysteme und Netzwerkanlagen setzen Techniken zum + Bandbreiten-Management ein, die nicht zwischen Hosts unterscheiden + können, wenn diese nicht auf verschiedenen IP-Adressen liegen.
    • +
    + +
    top
    +
    +

    Die Verwendung von namensbasierten virtuellen Hosts

    + + + +

    Um namensbasierte virtuelle Hosts zu verwenden, müssen Sie die + IP-Adresse (und möglicherweise den Port) des Servers benennen, an + der Anfragen für die Hosts entgegengenommen werden. Dies wird mit + der Direktive NameVirtualHost + eingestellt. Im Normalfall, wenn alle IP-Adressen des Server verwendet + werden sollen, können Sie * als Argument für + NameVirtualHost verwenden. Wenn Sie + vorhaben, mehrere Ports zu nutzen (etwa wenn SSL läuft), sollten + Sie dem Argument einen Port hinzufügen, wie zum Beispiel + *:80. Beachten Sie, + dass die Angabe einer IP-Adresse in einer NameVirtualHost-Anweisung den Server nicht + automatisch an dieser Adresse lauschen läßt. Lesen Sie bitte "Bestimmen der vom Apache verwendeten Adressen und + Ports" für weitere Details. Zusätzlich muss jede hier + angegebene IP-Adresse einer Netzwerkkarte des Servers zugeordnet sein.

    + +

    Der nächste Schritt ist die Erstellung eines <VirtualHost>-Blocks für jeden einzelnen + Host, den Sie bedienen wollen. Das Argument der Direktive <VirtualHost> sollte das gleiche + sein wie das Argument der NameVirtualHost-Anweisung (d.h. eine IP-Adresse + oder * für alle Adressen). Innerhalb jedes <VirtualHost>-Blocks benötigen + Sie zumindestens eine ServerName-Anweisung, um zu bestimmen, welcher + Host bedient wird, und eine DocumentRoot-Anweisung, um anzugeben, wo im + Dateisystem der Inhalt des Hosts abgelegt ist.

    + +

    Der Hauptserver verschwindet

    + Wenn Sie virtuelle Hosts zu einem bestehenden Webserver hinzufügen, + müssen Sie auch einen <VirtualHost>-Block für den bestehenden Host + (Anm.d.Ü.: und bisherigen Hauptserver) erstellen. + Die ServerName- und + DocumentRoot-Anweisungen zu diesem + virtuellen Host sollten die gleichen sein wie die globalen ServerName- und DocumentRoot-Anweisungen. Führen Sie diesen + virtuellen Host als erstes in der Konfigurationsdatei auf, so dass er als + Standard-Host fungiert. +
    + +

    Vorausgesetzt, Sie bedienen z.B. die Domain + www.domain.tld und möchten den virtuellen Host + www.otherdomain.tld hinzufügen, welcher auf + die gleiche IP-Adresse zeigt. Dann fügen Sie einfach Folgendes der + httpd.conf hinzu:

    + +

    + NameVirtualHost *:80
    +
    + <VirtualHost *:80>
    + + ServerName www.domain.tld
    + ServerAlias domain.tld *.domain.tld
    + DocumentRoot /www/domain
    +
    + </VirtualHost>
    +
    + <VirtualHost *:80>
    + ServerName www.otherdomain.tld
    + DocumentRoot /www/otherdomain
    +
    + </VirtualHost>
    +

    + +

    Sie können anstelle des * bei den beiden Anweisungen + NameVirtualHost und <VirtualHost> alternativ eine + eindeutige IP-Adresse angeben. Das kann man beispielsweise machen, um + einige namensbasierte virtuelle Hosts auf einer IP-Adresse zu betreiben und + entweder IP-basierte oder ein anderes Set von namensbasierten virtuellen + Hosts auf einer anderen Adresse.

    + +

    Viele Server wollen unter mehr als einem Namen erreichbar sein. Die + Direktive ServerAlias, die innerhalb + des <VirtualHost>-Abschnittes angegeben wird, + ermöglicht dies. Zum Beispiel zeigt die ServerAlias-Anweisung in dem ersten <VirtualHost>-Block oben an, dass die + aufgeführten Namen alternative Namen sind, die man verwenden kann, um + das gleiche Webangebot zu erreichen:

    + +

    + ServerAlias domain.tld *.domain.tld +

    + +

    Anfragen für alle Hosts der Domain domain.tld werden + von dem virtuellen Host www.domain.tld bedient. Die + Platzhalter * und ? können anstelle + entsprechender Namen verwendet werden. Natürlich können Sie nicht + einfach Namen erfinden und diese bei ServerName oder ServerAlias + angeben, Sie müssen zunächst Ihren DNS Server entsprechend + konfigurieren, dass er diese Namen auf die mit Ihrem Server verknüpfte + IP-Adresse abbildet.

    + +

    Und schlußendlich können Sie die Konfiguration der virtuellen + Hosts mittels Angabe weiterer Direktiven innherhalb der <VirtualHost>-Container + feineinstellen. Die meisten Direktiven können in diesen Containern + angegeben werden und verändern dann ausschließlich die + Konfiguration des entsprechenden virtuellen Hosts. Prüfen Sie den Kontext einer Direktive, um + herauszufinden, ob eine bestimmte Direktive zulässig ist. + Im Hauptserver-Kontext (außerhalb der <VirtualHost>-Container) definierte + Konfigurationsanweisungen werden nur dann angewendet, wenn sie nicht durch + Einstellungen des virtuellen Hosts außer Kraft gesetzt wurden.

    + +

    Wenn nun eine Anfrage eintrifft, prüft der Server zuerst, ob sie eine + IP-Adresse verwendet, die der NameVirtualHost-Anweisung entspricht. Ist dies der + Fall, dann sieht er sich jeden <VirtualHost>-Abschnitt mit einer passenden + IP-Adresse an und versucht den einen zu finden, dessen ServerName- oder ServerAlias-Anweisung mit dem gewünschten + Hostnamen übereinstimmt. Findet er einen, dann verwendet er die + Konfiguration dieses Servers. Wird kein passender virtueller Host gefunden, + dann wird der erste angegeben virtuelle Host verwendet, + dessen IP-Adresse paßt.

    + +

    Die Folge davon ist, dass der erste aufgeführte virtuelle Host der + Standard-Virtual-Host ist. Die DocumentRoot-Anweisung des Hauptservers + wird niemals verwendet, wenn eine IP-Adresse mit einer + NameVirtualHost-Anweisung + übereinstimmt. Wenn Sie eine spezielle Konfiguration für Anfragen + angeben möchten, die keinem bestimmten virtuellen Host entsprechen, + packen Sie diese Konfiguration einfach in einen <VirtualHost>-Container und führen diesen als + erstes in der Konfigurationsdatei auf.

    + +
    top
    +
    +

    Kompatibilität mit älteren Browsern

    + +

    Wie zuvor erwähnt gibt es einige Clients, die nicht die notwendigen + Daten senden, mit denen namensbasierte virtuelle Hosts korrekt + funktionieren. Diesen Clients werden stets die Seiten des ersten, für + diese IP-Adresse aufgeführten virtuellen Hosts gesendet werden (des + primären namensbasierten virtuellen Hosts).

    + +

    Was bedeutet älter?

    +

    Beachten Sie bitte, wenn wir von älter sprechen, meinen wir auch + älter. Es ist sehr unwahrscheinlich, dass sie einen dieser Browser + heutzutage in Verwendung finden werden. Alle aktuellen Browser-Versionen + senden den Host-Header, so wie er für namensbasierte + virtuelle Hosts benäötigt wird.

    +
    + +

    Mit der Direktive ServerPath existiert + eine mögliche Behelfskonstruktion, obgleich sie etwas schwerfällig + ist:

    + +

    Beispielkonfiguration:

    + +

    + NameVirtualHost 111.22.33.44
    +
    + <VirtualHost 111.22.33.44>
    + + ServerName www.domain.tld
    + ServerPath /domain
    + DocumentRoot /web/domain
    +
    + </VirtualHost>
    +

    + +

    Was bedeutet das? Es bedeutet, dass eine Anfrage für eine mit + "/domain" beginnende URI von dem virtuellen Host + www.domain.tld bedient wird. Dies heißt, dass die Seiten + für alle Clients unter http://www.domain.tld/domain/ + abrufbar sind, wenngleich Clients, die den Header Host: + senden, auch über http://www.domain.tld/ auf sie zugreifen + können.

    + +

    Legen Sie einen Link auf der Seite Ihres primären virtuellen Hosts zu + http://www.domain.tld/domain/, um die Behelfslösung + verfügbar zu machen. Bei den Seiten der virtuellen Hosts müssen + Sie dann sicherstellen, entweder außschließlich relative Links + (z.B. "file.html" oder + "../icons/image.gif") zu verwenden oder Links, die das + einleitende /domain/ enthalten (z.B., + "http://www.domain.tld/domain/misc/file.html" oder + "/domain/misc/file.html").

    + +

    Dies erfordert etwas Disziplin, die Befolgung dieser Richtlinien stellt + jedoch größtenteils sicher, dass Ihre Seiten mit allen Browsern + funktionieren, alten wie neuen.

    + +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/vhosts/name-based.html.en b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/name-based.html.en new file mode 100644 index 00000000..837739a0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/name-based.html.en @@ -0,0 +1,248 @@ + + + +Name-based Virtual Host Support - Apache HTTP Server + + + + + +
    <-
    +

    Name-based Virtual Host Support

    +
    +

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

    +
    + +

    This document describes when and how to use name-based virtual hosts.

    +
    + +
    top
    +
    +

    Name-based vs. IP-based Virtual Hosts

    + +

    IP-based virtual hosts use the IP address of the connection to + determine the correct virtual host to serve. Therefore you need to + have a separate IP address for each host. With name-based virtual + hosting, the server relies on the client to report the hostname as + part of the HTTP headers. Using this technique, many different hosts + can share the same IP address.

    + +

    Name-based virtual hosting is usually simpler, since you need + only configure your DNS server to map each hostname to the correct + IP address and then configure the Apache HTTP Server to recognize + the different hostnames. Name-based virtual hosting also eases + the demand for scarce IP addresses. Therefore you should use + name-based virtual hosting unless there is a specific reason to + choose IP-based virtual hosting. Some reasons why you might consider + using IP-based virtual hosting:

    + +
      +
    • Some ancient clients are not compatible with name-based virtual + hosting. For name-based virtual hosting to work, the client must send + the HTTP Host header. This is required by HTTP/1.1, and is + implemented by all modern HTTP/1.0 browsers as an extension. If you + need to support obsolete clients and still use name-based virtual + hosting, a possible technique is discussed at the end of this + document.
    • + +
    • Name-based virtual hosting cannot be used with SSL secure servers + because of the nature of the SSL protocol.
    • + +
    • Some operating systems and network equipment implement bandwidth + management techniques that cannot differentiate between hosts unless + they are on separate IP addresses.
    • +
    + +
    top
    +
    +

    Using Name-based Virtual Hosts

    + + + +

    To use name-based virtual hosting, you must designate the IP + address (and possibly port) on the server that will be accepting + requests for the hosts. This is configured using the NameVirtualHost directive. + In the normal case where any and all IP addresses on the server should + be used, you can use * as the argument to NameVirtualHost. If you're planning to use + multiple ports (e.g. running SSL) you should add a Port to the argument, + such as *:80. Note that mentioning an IP address in a + NameVirtualHost directive does not + automatically make the server listen to that IP address. See + Setting which addresses and ports Apache uses + for more details. In addition, any IP address specified here must be + associated with a network interface on the server.

    + +

    The next step is to create a <VirtualHost> block for + each different host that you would like to serve. The argument to the + <VirtualHost> directive + should be the same as the argument to the NameVirtualHost directive (ie, an IP address, + or * for all addresses). Inside each <VirtualHost> block, you will need at minimum a + ServerName directive to designate + which host is served and a DocumentRoot + directive to show where in the filesystem the content for that host + lives.

    + +

    Main host goes away

    +

    If you are adding virtual hosts to an existing web server, you + must also create a <VirtualHost> block for the existing host. The ServerName and DocumentRoot included in this virtual host should be the + same as the global ServerName and + DocumentRoot. List this virtual + host first in the configuration file so that it will act as the default + host.

    +
    + +

    For example, suppose that you are serving the domain + www.domain.tld and you wish to add the virtual host + www.otherdomain.tld, which points at the same IP address. + Then you simply add the following to httpd.conf:

    + +

    + NameVirtualHost *:80
    +
    + <VirtualHost *:80>
    + + ServerName www.domain.tld
    + ServerAlias domain.tld *.domain.tld
    + DocumentRoot /www/domain
    +
    + </VirtualHost>
    +
    + <VirtualHost *:80>
    + ServerName www.otherdomain.tld
    + DocumentRoot /www/otherdomain
    +
    + </VirtualHost>
    +

    + +

    You can alternatively specify an explicit IP address in place of the + * in both the NameVirtualHost and <VirtualHost> directives. For example, you might want to do this + in order to run some name-based virtual hosts on one IP address, and either + IP-based, or another set of name-based virtual hosts on another address.

    + +

    Many servers want to be accessible by more than one name. This is + possible with the ServerAlias + directive, placed inside the <VirtualHost> section. For example in the first <VirtualHost> block above, the + ServerAlias directive indicates that + the listed names are other names which people can use to see that same + web site:

    + +

    + ServerAlias domain.tld *.domain.tld +

    + +

    then requests for all hosts in the domain.tld domain will + be served by the www.domain.tld virtual host. The wildcard + characters * and ? can be used to match names. + Of course, you can't just make up names and place them in ServerName or ServerAlias. You must + first have your DNS server properly configured to map those names to an IP + address associated with your server.

    + +

    Finally, you can fine-tune the configuration of the virtual hosts + by placing other directives inside the <VirtualHost> containers. Most directives can be + placed in these containers and will then change the configuration only of + the relevant virtual host. To find out if a particular directive is allowed, + check the Context of the + directive. Configuration directives set in the main server context + (outside any <VirtualHost> + container) will be used only if they are not overridden by the virtual host + settings.

    + +

    Now when a request arrives, the server will first check if it is using + an IP address that matches the NameVirtualHost. If it is, then it will look at each <VirtualHost> section with a matching + IP address and try to find one where the ServerName or ServerAlias matches the requested + hostname. If it finds one, then it uses the configuration for that server. + If no matching virtual host is found, then the first listed virtual + host that matches the IP address will be used.

    + +

    As a consequence, the first listed virtual host is the default + virtual host. The DocumentRoot from + the main server will never be used when an IP + address matches the NameVirtualHost + directive. If you would like to have a special configuration for requests + that do not match any particular virtual host, simply put that configuration + in a <VirtualHost> + container and list it first in the configuration file.

    + +
    top
    +
    +

    Compatibility with Older Browsers

    + +

    As mentioned earlier, there are some clients + who do not send the required data for the name-based virtual + hosts to work properly. These clients will always be sent the + pages from the first virtual host listed for that IP address + (the primary name-based virtual host).

    + +

    How much older?

    +

    Please note that when we say older, we really do mean older. You are + very unlikely to encounter one of these browsers in use today. All + current versions of any browser send the Host header as + required for name-based virtual hosts.

    +
    + +

    There is a possible workaround with the ServerPath + directive, albeit a slightly cumbersome one:

    + +

    Example configuration:

    + +

    + NameVirtualHost 111.22.33.44
    +
    + <VirtualHost 111.22.33.44>
    + + ServerName www.domain.tld
    + ServerPath /domain
    + DocumentRoot /web/domain
    +
    + </VirtualHost>
    +

    + +

    What does this mean? It means that a request for any URI + beginning with "/domain" will be served from the + virtual host www.domain.tld. This means that the + pages can be accessed as http://www.domain.tld/domain/ + for all clients, although clients sending a Host: header + can also access it as http://www.domain.tld/.

    + +

    In order to make this work, put a link on your primary + virtual host's page to + http://www.domain.tld/domain/. Then, in the virtual + host's pages, be sure to use either purely relative links + (e.g., "file.html" or + "../icons/image.gif") or links containing the + prefacing /domain/ (e.g., + "http://www.domain.tld/domain/misc/file.html" or + "/domain/misc/file.html").

    + +

    This requires a bit of discipline, but adherence to these + guidelines will, for the most part, ensure that your pages will + work with all browsers, new and old.

    + +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/vhosts/name-based.html.es b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/name-based.html.es new file mode 100644 index 00000000..a3b31d36 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/name-based.html.es @@ -0,0 +1,292 @@ + + + +Soporte de Hosting Virtual basado en nombres - Servidor HTTP Apache + + + + + +
    <-
    +

    Soporte de Hosting Virtual basado en nombres

    +
    +

    Idiomas disponibles:  de  | + en  | + es  | + ja  | + ko  | + tr 

    +
    + +

    Este documento describe cómo y cuándo debe usarse hosting virtual + basado en nombres.

    +
    + +
    top
    +
    +

    Diferencias entre el hosting vitual +basado en nombres y el basado en IPs

    + +

    El hosting virtual basado en IPs usa la dirección IP de la + conexión para determinar qué host virtual es el que tiene que + servir. Por lo tanto, necesitará tener diferentes direcciones IP + para cada host. Si usa hosting virtual basado en nombres, el + servidor atiende al nombre de host que especifica el cliente en + las cabeceras de HTTP. Usando esta técnica, una sola dirección IP + puede ser compartida por muchos sitios web diferentes.

    + +

    El hosting virtual basado en nombres es normalmente más + sencillo, porque solo necesita configurar su servidor de DNS para + que localice la dirección IP correcta y entonces configurar Apache + para que reconozca los diferentes nombres de host. Usando hosting + virtual basado en nombres también se reduce la demanda de + direcciones IP, que empieza a ser un bien escaso. Por lo tanto, + debe usar hosting virtual basado en nombres a no ser que haya + alguna razón especial por la cual tenga que elegir usar hosting + vitual basado en direcciones IP. Algunas de éstas razones pueden + ser:

    + +
      +
    • Algunos clientes antiguos no son compatibles con el + hosting virtual basado en nombres. Para que el hosting + virtual basado en nombres funcione, el cliente debe enviar la + cabecera de Host HTTP. Esto es necesario para HTTP/1.1, y está + implementado como extensión en casi todos los navegadores + actuales. Si necesita dar soporte a clientes obsoletos y usar + hosting virtual basado en nombres, al final de este documento + se describe una técnica para que pueda hacerlo.
    • + +
    • El hosting virtual basado en nombres no se puede usar + junto con SSL por la naturaleza del protocolo SSL.
    • + +
    • Algunos sistemas operativos y algunos elementos de red + tienen implementadas técnicas de gestión de ancho de banda que + no pueden diferenciar entre hosts a no ser que no estén en + diferentes direcciones IP.
    • +
    + +
    top
    +
    +

    Cómo usar hosting vitual basado en +nombres

    + + + +

    Para usar hosting virtual basado en nombres, debe especificar + en el servidor qué dirección IP (y posiblemente qué puerto) se va + a usar para atender las peticiones a los diferentes hosts. Esto + se hace con la directiva NameVirtualHost. Normalmente, cualquiera + o todas las direcciones IP del servidor pueden usarse, también + puede usar * como argumento para la directiva + NameVirtualHost. Si va a usar + más de un puerto (por ejemplo si va usar SSL) debe añadir un + puerto a cada argumento, por ejemplo *:80. Tenga en + cuenta que especificando una dirección IP en la directiva + NameVirtualHost no hace que + el servidor escuche automáticamente en esa dirección IP. Consulte + la sección Especificar las direcciones y + puertos que usa Apache para obtener más información. Además, + cualquier dirección IP especificada debe asociarse con un + dispositivo de red del servidor.

    + +

    El siguiente paso es crear un bloque <VirtualHost> para cada host diferente que + quiera alojar en el servidor. El argumento de la directiva + <VirtualHost> + debe ser el mismo que el argumento de la directiva NameVirtualHost (por ejemplo, una + dirección IP, o un * para usar todas las direcciones + que tenga el servidor). Dentro de cada bloque <VirtualHost>, necesitará + como mínimo una directiva ServerName para designar qué host se + sirve y una directiva DocumentRoot para indicar dónde están + los contenidos a servir dentro del sistema de ficheros.

    + +

    Añadir hosts vituales a un servidor web ya existente

    +

    Si está añadiendo hosts virtuales a un servidor web ya + existente, debe crear también un bloque <VirtualHost> para el + host que ya tenga funcionando. Los valores de las directivas + ServerName y DocumentRoot desde este nuevo host + virtual deben tener los mismos valores que los de las + directivas ServerName + DocumentRoot + globales. Ponga este host virtual como el primero en el + archivo de configuración para que sea el que actúe como host + por defecto.

    +
    + +

    Por ejemplo, suponga que está sirviendo el dominio + www.domain.tld y quiere añadir el host virtual + www.otherdomain.tld, que apunta a la misma dirección + IP. Entonces, lo único que tiene que hacer es añadir lo siguiente + al fichero httpd.conf:

    + +

    + NameVirtualHost *:80
    +
    + <VirtualHost *:80>
    + + ServerName www.domain.tld
    + ServerAlias domain.tld *.domain.tld
    + DocumentRoot /www/domain
    +
    + </VirtualHost>
    +
    + <VirtualHost *:80>
    + ServerName www.otherdomain.tld
    + DocumentRoot /www/otherdomain
    +
    + </VirtualHost>
    +

    + +

    También puede optar por especificar una dirección IP + explícitamente en lugar de usar un * en las + directivas NameVirtualHost y + <VirtualHost>. Por ejemplo, puede hacer esto + para hacer funcionar diferentes hosts virtuales basados en nombres + en una dirección IP, o basados en IPs, o un conjunto de hosts + virtuales basados en nombres en otra dirección.

    + +

    También puede que quiera que se acceda a un determinado sitio + web usando diferentes nombres. Esto es posible con la directiva + ServerAlias, puesta dentro de + la sección <VirtualHost>. Por ejemplo, en el primer bloque + <VirtualHost> de + arriba, la directiva ServerAlias indica la lista de nombres + que pueden usarse para acceder a un mismo sitio web:

    + +

    + ServerAlias domain.tld *.domain.tld +

    + +

    entonces las peticiones para todos los hosts en el dominio + domain.tld serán servidas por el host virtual + www.domain.tld. Los carácteres comodines + * y ? pueden usarse para encontrar + equivalencias con los nombres. Por supuesto, no puede inventarse + nombres y ponerlos en la directiva ServerName o + ServerAlias. Primero debe tener su servidor de DNS + debidamente configurado para que pueda hacer corresponder esos + nombres con una dirección IP de su servidor.

    + +

    Para terminar, puede mejorar el rendimiento de la configuración + de los hosts virtuales poniendo otras directivas dentro de las + secciones <VirtualHost>. La mayor parte de las + directivas pueden ponerse en esos containers y cambiarán solo la + configuración del host virtual al que se refieran. Para ver si una + directiva en particualar puede usarse así, consulte el Contexto de la + directiva. Las directivas de configuración especificadas en el + contexto del servidor principal (fuera de + cualquier sección <VirtualHost>) se usan única y + exclusivamente si sus valores no son sustituidos por alguno de los + parámetros de configuración del host virtual.

    + +

    Cuando llega una petición, el servidor primero verifica si se + está usando una dirección IP que coincide con el valor de la + directiva NameVirtualHost. Si es el caso, mirará en cada + sección <VirtualHost> cuya IP coincida e intentará + encontrar si el valor de la directiva ServerName o de la directiva ServerAlias + coincide con el nombre del sitio web de la petición. Si encuentra + una coincidencia, usa la configuración de ese servidor. Si no la + encuentra, usa el primer host virtual de la lista + cuya dirección IP coincida con el de la petición.

    + +

    Como consecuencia, el primer host virtual de la lista es el que + se usa por defecto. La directiva DocumentRoot del servidor + principal no se usará nunca cuando una + dirección IP coincida con el valor de la directiva NameVirtualHost. Si quiere usar una + configuración especial para peticiones que no coinciden con ningún + host virtual en concreto, ponga esa configuración en una sección + <VirtualHost> y + póngala la primera en el fichero de configuración.

    + +
    top
    +
    +

    Compatibilidad con navegadores +antiguos

    + +

    Como se dijo antes, hay algunos clientes que no envían los + datos necesarios para que funcione correctamente el hosting + virtual basado en nombres. Estos clientes van a recibir siempre + como respuesta a sus peticiones, páginas del primer host virtual + que haya en la lista para esa dirección IP (el host virtual + primario basado en nombres).

    + +

    ¿Cómo de antiguo?

    +

    Tenga en cuenta que cuando decimos antiguo, queremos decir + realmente antiguo. Es muy poco probable que encuentre uno de esos + navegadores en uso todavía. Todas las versiones actuales de + cualquier navegador envían la cabecera Host que se + necesita para que el hosting virtual basado en nombres + funcione.

    +
    + +

    Existe una manera de evitar este problema con la directiva + ServerPath, aunque es un poco + complicada:

    + +

    Ejemplo de configuración:

    + +

    + NameVirtualHost 111.22.33.44
    +
    + <VirtualHost 111.22.33.44>
    + + ServerName www.domain.tld
    + ServerPath /domain
    + DocumentRoot /web/domain
    +
    + </VirtualHost>
    +

    + +

    ¿Qué significa esto? Esto significa que una petición de + cualquier URI que empiece por "/domain" será servida + por el host virtual www.domain.tld. Esto significa + que las páginas pueden accederse como + http://www.domain.tld/domain/ por todos los clientes, + aunque los clientes que envíen una cabecera Host: + pueden también acceder con + http://www.domain.tld/.

    + +

    Para hacer que esto funcione, ponga un enlace en la página de + su host virtual primario a + http://www.domain.tld/domain/. Entonces, en las + páginas del host virtual, asegúrese de que usa o enlaces relativos + (por ejemplo, "file.html" o + "../icons/image.gif") o enlaces que contengan el + /domain/ anterior (por ejemplo, + "http://www.domain.tld/domain/misc/file.html" o + "/domain/misc/file.html").

    + +

    Esto requiere un poco de disciplina, pero siguiendo estas + reglas, puede asegurarse, casi en todos los casos, de que las + páginas de su sitio web podrán ser accedidas desde cualquier + navegador, ya sea nuevo o antiguo.

    + +
    +
    +

    Idiomas disponibles:  de  | + en  | + es  | + ja  | + ko  | + tr 

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/vhosts/name-based.html.ja.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/name-based.html.ja.utf8 new file mode 100644 index 00000000..c106bfc0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/name-based.html.ja.utf8 @@ -0,0 +1,273 @@ + + + +名前ベースのバーチャルホスト - Apache HTTP サーバ + + + + + +
    <-
    +

    名前ベースのバーチャルホスト

    +
    +

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

    +
    + +

    この文書では名前ベースのバーチャルホストをどんなとき、 + どうやって使うかを説明します。

    +
    + +
    top
    +
    +

    名前ベースと IP ベースのバーチャルホストの比較

    + +

    IP ベースのバーチャルホストでは、応答する + バーチャルホストへのコネクションを決定するために IP + アドレスを使用します。ですから、それぞれのホストに個々に IP + アドレスが必要になります。これに対して名前ベースのバーチャルホストでは、 + クライアントが HTTP ヘッダの一部としてホスト名を告げる、 + ということに依存します。この技術で同一 IP + アドレスを異なる多数のホストで共有しています。

    + +

    名前ベースのバーチャルホストは通常単純で、それぞれのホスト名と + それに対応する正確な IP アドレスを DNS で設定し、異なる + ホスト名を区別するように Apache HTTP サーバを設定するだけです。 + さらに、名前ベースのバーチャルホストは不足する IP + アドレスの需要を緩和します。したがって、IP ベースのバーチャルホストを + 選択すべき特定の理由がなければ名前ベースのバーチャルホストを使うべきです。 + IP ベースのバーチャルホストを使用することを考慮する理由として、

    + +
      +
    • 名前ベースのバーチャルホストに対応していない古いクライアントがある + 名前ベースのバーチャルホストが働くためには、クライアントは + HTTP ホストヘッダを送ってこなければなりません。 + これは HTTP/1.1 の仕様で要求されていて、すべての現代的な + HTTP/1.0 ブラウザでも拡張として実装されています。 + とても古いクライアントをサポートしつつ、名前ベースの + バーチャルホストを行いたい場合は、この文書の最後の方に + 書かれている解決策になるかもしれない方法を見てください。
    • + +
    • 名前ベースのバーチャルホストは SSL プロトコルの特徴により、 + SSL セキュアサーバには使えません。
    • + +
    • オペレーティングシステムやネットワーク装置のなかには、 + 別の IP アドレス上でない場合、複数のホストを別扱いできないような + 帯域管理の方法を実装しているものがあります。
    • +
    + +
    top
    +
    +

    名前ベースのバーチャルホストを利用する

    + + + +

    名前ベースのバーチャルホストを使うには、そのホストへの + リクエストを受け付けるサーバの IP アドレス (もしかしたらポートも) + を指定する必要があります。 + これは NameVirtualHost + ディレクティブで設定します。通常、NameVirtualHost で + * の属性を使ってサーバの全ての IP アドレスを使います。 + (例えば SSL の使用などで) 複数のポートを使うことを計画しているのであれば、 + 引数に *:80 のようにポートも含めるようにしてください。 + NameVirtualHost ディレクティブで + IP アドレスを書いても、 + 自動的にサーバがその IP アドレスをリッスンするということはないことに + 注意してください。詳細は「Apache の使うアドレスと + ポートを設定する」を読んでください。さらに、ここで指定された + IP アドレスは全てサーバのネットワークインターフェースと関連付けられて + いなければなりません。

    + +

    次は、扱うホストそれぞれに対して <VirtualHost> ブロックを + 作成してください。<VirtualHost> + ディレクティブの引数は NameVirtualHost + ディレクティブの引数と同じにしてください (すなわち、IP アドレスか、全てのアドレスを意味する + *)。それぞれの <VirtualHost> + ディレクティブの中には、最低限、どのホストが扱われるかを示す ServerName ディレクティブと、 + そのホスト用のコンテンツがファイルシステム上のどこにあるかを示す + DocumentRoot ディレクティブを + 書く必要があります。

    + +

    メインホストはなくなります

    +

    既にあるウェブサーバにバーチャルホストを追加する場合、 + 既存のウェブサーバに対しても <VirtualHost> + ブロックを作らなければなりません。このバーチャルホストの + ServerName と + DocumentRoot + は、グローバルな ServerName と + DocumentRoot + と同じものにします。また、このバーチャルホストを設定ファイルの中で + 先頭に置いて、デフォルトホストとして動作するようにします。

    +
    + +

    たとえば、www.domain.tld を動かしていて、 + さらにバーチャルホスト www.otherdomain.tld + を追加するとしましょう。このバーチャルホストは同一 IP を指しているとします。 + そのような場合は、httpd.conf + に以下のようなコードを追加するだけです

    + +

    + NameVirtualHost *:80
    +
    + <VirtualHost *:80>
    + + ServerName www.domain.tld
    + ServerAlias domain.tld *.domain.tld
    + DocumentRoot /www/domain
    +
    + </VirtualHost>
    +
    + <VirtualHost *:80>
    + ServerName www.otherdomain.tld
    + DocumentRoot /www/otherdomain
    +
    + </VirtualHost>
    +

    + +

    NameVirtualHost 及び + VirtualHost のどちらの場合も、 + * の部分には明示的に IP アドレスを指定することができます。 + 例えば、ある IP アドレスでは名前ベースのバーチャルホストを使いたい一方で、 + 別の IP アドレスでは、他の IP ベースのバーチャルホストや + 別組の名前ベースのバーチャルホストを使いたい場合、 + そう設定することになるでしょう。

    + +

    複数の名前でサーバアクセスができるようにしたいことも多いでしょう。 + このようなことは、ServerAlias ディレクティブを <VirtualHost> + セクションに記述することで実現できます。 + 例えば上記の <VirtualHost> の例であれば、 + 次のように一覧に挙げられた名前が、 + ユーザが同一のウェブサイトとして目にして使用できるサーバ名である、 + と ServerAlias + ディレクティブで指定できます。

    + +

    + ServerAlias domain.tld *.domain.tld +

    + +

    domain.tld ドメインへの全てのホストへのリクエストは + www.domain.tld のバーチャルホストが処理します。 + 名前をマッチさせるために、ワイルドカード文字 * や ? + を使用することもできます。もちろん思いつきの名前を作って、 + ServerName や + ServerAlias + にその名前を書くといったことはできません。まずは、 + これらの名前が サーバに付けられた IP アドレスにマップされるように + DNS サーバを適切に設定しなければなりません。

    + +

    最後に、<VirtualHost> コンテナの中に + 他のディレクティブを書くことで、バーチャルホストの設定を細かく調整 + することができます。 + ほとんどのディレクティブはこれらのコンテナに設置することができて、 + 変更点はそのバーチャルホストに対してのみ有効になります。 + どのディレクティブを書くことができるかは、ディレクティブの コンテキスト を + 調べてください。主サーバコンテキスト + (<VirtualHost> + コンテナの外) の設定用ディレクティブはバーチャルホストでの設定で + 上書きされない場合のみ使用されます。

    + +

    リクエストが来ると、サーバはまず最初に <NameVirtualHost> + にマッチする IP アドレスかどうかをチェックします。マッチすれば + マッチした IP アドレスの <VirtualHost> + のそれぞれのセクションの中から + ServerName か + ServerAlias + に要求されたホスト名があるか探します。 + 見つかればそのサーバ用の設定を使います。マッチするバーチャルホスト + が見つからなければ、マッチした IP アドレスの + リストの最初にあるバーチャルホスト が使われます。

    + +

    結果として、リストの最初のバーチャルホストが デフォルト の + バーチャルホストになります。IP アドレスが NameVirtualHost + ディレクティブにマッチした場合は、メインのサーバ の + DocumentRoot + は決して使われません + どのバーチャルホストにもマッチしないリクエストに対して、 + 特別な設定をしたいのであれば、設定ファイル中の最初の + <VirtualHost> コンテナにそれを記述してください。

    + +
    top
    +
    +

    古いブラウザとの互換性

    + +

    以前述べたように、名前ベースのバーチャルホストが正しく動作する + ために必要な情報を送ってこないクライアントが依然として存在しています。 + そのようなクライアントに対しては、該当する IP アドレスについて、 + 一番最初に設定されているバーチャルホスト + (プライマリの名前ベースのバーチャルホスト) + からページが送り返されます。

    + +

    どのぐらい古いの ?

    +

    「古い」と表現している場合、本当に古いことを意味して使っています。 + 不幸にして今現在でもこのような古いブラウザに遭遇することがあります。 + 現在のブラウザは全て、名前ベースのバーチャルホストに必要な + Host ヘッダを送ります。

    +
    + +

    ServerPath + ディレクティブで対処が可能です。ちょっと不格好ですけれども。

    + +

    設定例

    + +

    + NameVirtualHost 111.22.33.44
    +
    + <VirtualHost 111.22.33.44>
    + + ServerName www.domain.tld
    + ServerPath /domain
    + DocumentRoot /web/domain
    +
    + </VirtualHost>
    +

    + +

    この例にはどういう意味があるでしょうか? これは + "/domain" で始まる URI へのリクエストはすべて、 + バーチャルホスト www.domain.tld で処理される、 + という意味です。つまり、すべてのクライアントで + http://www.domain.tld/domain/ でアクセスできるページが、 + Host: ヘッダを送ってくるクライアントであれば + http://www.domain.tld/ としてもアクセスできる、 + という意味です。

    + +

    これが動作するようにするには、 + プライマリのバーチャルホストのページに + http://www.domain.tld/domain/ へのリンクを設置します。 + そして、バーチャルホストのページでは、純粋な相対リンク (例: + "file.html" や "../icons/image.gif")、 + あるいは /domain/ で始まるリンク (例: + "http://www.domain.tld/domain/misc/file.html" や + "/domain/misc/file.html") だけを設置します。

    + +

    これには、幾分かの規律が必要となりますが、 + このようなガイドラインを忠実に守ることにより、たいていの場合、 + すべてのブラウザで ― 新しいブラウザでも古いものでも ― + 作成したページが見えるということを保証します。

    + +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/vhosts/name-based.html.ko.euc-kr b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/name-based.html.ko.euc-kr new file mode 100644 index 00000000..47527a79 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/name-based.html.ko.euc-kr @@ -0,0 +1,238 @@ + + + +À̸§±â¹Ý °¡»óÈ£½ºÆ® Áö¿ø - Apache HTTP Server + + + + + +
    <-
    +

    À̸§±â¹Ý °¡»óÈ£½ºÆ® Áö¿ø

    +
    +

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

    +
    + +

    ÀÌ ¹®¼­´Â À̸§±â¹Ý °¡»óÈ£½ºÆ®¸¦ »ç¿ëÇÏ´Â °æ¿ì¿Í ¹æ¹ýÀ» + ¼³¸íÇÑ´Ù.

    +
    + +
    top
    +
    +

    À̸§±â¹Ý ´ë IP±â¹Ý °¡»óÈ£½ºÆ®

    + +

    IP±â¹Ý °¡»óÈ£½ºÆ®´Â ¿¬°áÇÑ IP ÁÖ¼Ò¸¦ °¡Áö°í ¼­ºñ½ºÇÒ + °¡»óÈ£½ºÆ®¸¦ °áÁ¤ÇÑ´Ù. ±×·¡¼­ °¢ È£½ºÆ®´Â ¼­·Î ´Ù¸¥ IP ÁÖ¼Ò¸¦ + °¡Á®¾ß ÇÑ´Ù. À̸§±â¹Ý °¡»óÈ£½ºÆ®ÀÇ °æ¿ì ¼­¹ö´Â Ŭ¶óÀ̾ðÆ®°¡ + HTTP Çì´õ·Î È£½ºÆ®¸íÀ» ¾Ë·ÁÁÖ±æ ¹Ù¶õ´Ù. ÀÌ·± ¹æ¹ýÀ¸·Î ÇÑ + IP ÁÖ¼Ò·Î ¿©·¯ ´Ù¸¥ È£½ºÆ®¸¦ ¼­ºñ½ºÇÒ ¼ö ÀÖ´Ù.

    + +

    À̸§±â¹Ý °¡»óÈ£½ºÆ®´Â DNS ¼­¹ö°¡ °¢ È£½ºÆ®¸íÀÌ ¿Ã¹Ù¸¥ + IP ÁÖ¼Ò·Î ´ëÀÀÇϵµ·Ï °¡»óÈ£½ºÆ®¸¦ ¼³Á¤ÇÏ°í, ´Ù¸¥ È£½ºÆ®¸íÀ» ±¸º°ÇÒ + ¼ö ÀÖµµ·Ï ¾ÆÆÄÄ¡ À¥¼­¹ö¸¦ ¼³Á¤Çϱ⸸ ÇϸéµÇ¹Ç·Î ´õ °£´ÜÇÏ´Ù. À̸§±â¹Ý + °¡»óÈ£½ºÆ®´Â ¶Ç ¿©·¯ IP ÁÖ¼Ò°¡ ÇÊ¿ä¾ø´Ù. ±×·¯¹Ç·Î Ưº°È÷ + IP±â¹Ý °¡»óÈ£½ºÆ®¸¦ ¼±ÅÃÇÒ ÀÌÀ¯°¡ ¾ø´Ù¸é À̸§±â¹Ý °¡»óÈ£½ºÆ®¸¦ + »ç¿ëÇØ¾ß ÇÑ´Ù. IP±â¹Ý °¡»óÈ£½ºÆ®¸¦ »ç¿ëÇؾßÇÒ ÀÌÀ¯·Î´Â:

    + +
      +
    • À̸§±â¹Ý °¡»óÈ£½ºÆ®¸¦ Áö¿øÇÏÁö¾Ê´Â ¿À·¡µÈ + Ŭ¶óÀ̾ðÆ®µéÀÌ ÀÖ´Ù. À̸§±â¹Ý °¡»óÈ£½ºÆ®¸¦ »ç¿ëÇÏ·Á¸é + Ŭ¶óÀ̾ðÆ®°¡ HTTP Host Çì´õ¸¦ º¸³»¾ß ÇÑ´Ù. ÀÌ´Â + HTTP/1.1¿¡¼­´Â ÇʼöÀÌ°í, ÃÖ±Ù ¸ðµç HTTP/1.0 ºê¶ó¿ìÀúµéµµ + È®ÀåÀ¸·Î Áö¿øÇÑ´Ù. ¸¸¾à À̸§±â¹Ý °¡»óÈ£½ºÆ®¸¦ »ç¿ëÇϸ鼭 + ¿À·¡µÈ Ŭ¶óÀ̾ðÆ®¸¦ Áö¿øÇØ¾ß ÇÑ´Ù¸é ÀÌ ¹®¼­ ³¡¿¡ ÀÖ´Â + ¹æ¹ýÀ» »ìÆìºÁ¶ó.
    • + +
    • SSL ÇÁ·ÎÅäÄÝÀÇ ¼º°Ý»ó SSL º¸¾È¼­¹ö¿¡¼­ À̸§±â¹Ý + °¡»óÈ£½ºÆ®¸¦ »ç¿ëÇÒ ¼ö ¾ø´Ù.
    • + +
    • ¾î¶² ¿î¿µÃ¼Á¦³ª ³×Æ®¿÷ ÀåÄ¡´Â ´Ù¸¥ IP ÁÖ¼Ò¸¦ »ç¿ëÇÏÁö + ¾ÊÀ¸¸é È£½ºÆ®¸¦ ±¸º°ÇÏÁö ¸øÇÏ´Â ³×Æ®¿÷ »ç¿ë·®(bandwidth) + °ü¸®±â¼úÀ» »ç¿ëÇÑ´Ù.
    • +
    + +
    top
    +
    +

    À̸§±â¹Ý °¡»óÈ£½ºÆ® »ç¿ëÇϱâ

    + + + +

    À̸§±â¹Ý °¡»óÈ£½ºÆ®¸¦ »ç¿ëÇÏ·Á¸é ¼­¹ö´Â ¿¬°áÀ» ¹ÞÀ» + IP ÁÖ¼Ò¸¦ (¾Æ¸¶ Æ÷Æ®µµ) Á¤ÇØ¾ß ÇÑ´Ù. ÀÌ´Â NameVirtualHost Áö½Ã¾î·Î °¡´ÉÇÏ´Ù. + ÀϹÝÀûÀ¸·Î ¼­¹öÀÇ ¸ðµç IP ÁÖ¼Ò¸¦ »ç¿ëÇÑ´Ù¸é + NameVirtualHostÀÇ + ¾Æ±Ô¸ÕÆ®·Î *¸¦ »ç¿ëÇÑ´Ù. ¿©·¯ Æ÷Æ®¸¦ »ç¿ëÇÒ + (¿¹¸¦ µé¾î, SSLÀ» »ç¿ëÇÒ) °èȹÀ̶ó¸é *:80°ú + °°ÀÌ ¾Æ±Ô¸ÕÆ®¿¡ Æ÷Æ®¸¦ Ãß°¡ÇØ¾ß ÇÑ´Ù. NameVirtualHost Áö½Ã¾î¿¡ IP ÁÖ¼Ò¸¦ + Àû¾îÁÖ¾ú´Ù°í ¼­¹ö°¡ ÀÚµ¿À¸·Î ±× IP ÁÖ¼Ò¸¦ ±â´Ù¸®Áö ¾ÊÀ½À» + ÁÖÀÇÇ϶ó. ÀÚ¼¼ÇÑ ³»¿ëÀº ¾ÆÆÄÄ¡°¡ + »ç¿ëÇÒ ÁÖ¼Ò¿Í Æ÷Æ® ¼³Á¤Çϱ⸦ Âü°íÇ϶ó. ¶Ç, ¿©±â¼­ + ÁöÁ¤ÇÑ IP ÁÖ¼Ò´Â ¼­¹öÀÇ ³×Æ®¿÷ ÀÎÅÍÆäÀ̽ºÀ̾î¾ß ÇÑ´Ù.

    + +

    ´ÙÀ½ ´Ü°è´Â ¼­ºñ½ºÇÏ·Á´Â È£½ºÆ®º°·Î <VirtualHost> ºí·ÏÀ» + ¸¸µå´Â ÀÏÀÌ´Ù. <VirtualHost>> Áö½Ã¾îÀÇ ¾Æ±Ô¸ÕÆ®´Â + NameVirtualHost Áö½Ã¾îÀÇ + ¾Æ±Ô¸ÕÆ®(¿¹¸¦ µé¾î, IP ÁÖ¼Ò³ª ¸ðµç ÁÖ¼Ò¸¦ ¶æÇÏ´Â *)¿Í + °°¾Æ¾ß ÇÑ´Ù. <VirtualHost>> ºí·Ï ¾È¿¡´Â + ÃÖ¼ÒÇÑ ¼­ºñ½ºÇÒ È£½ºÆ®¸¦ ÁöÁ¤ÇÏ´Â ServerName Áö½Ã¾î¿Í È£½ºÆ®ÀÇ + ³»¿ëÀÌ ÆÄÀϽýºÅÛ ¾îµð¿¡ ÀÖ´ÂÁö¸¦ ÁöÁ¤ÇÏ´Â DocumentRoot Áö½Ã¾î°¡ ÇÊ¿äÇÏ´Ù.

    + +

    ÁÖ È£½ºÆ®°¡ ¾ø¾îÁø´Ù

    +

    ±âÁ¸¿¡ »ç¿ëÇÏ´ø À¥¼­¹ö¿¡ °¡»óÈ£½ºÆ®¸¦ Ãß°¡ÇÑ´Ù¸é + ±âÁ¸¿¡ »ç¿ëÇÏ´ø È£½ºÆ®¿¡ ´ëÇÑ <VirtualHost> ºí·Ïµµ Ãß°¡ÇØ¾ß + ÇÑ´Ù. ÀÌ ºí·Ï¿¡ Æ÷ÇÔÇÏ´Â ServerName°ú DocumentRoot´Â Àüü ServerName°ú DocumentRoot¿Í °°¾Æ¾ß ÇÑ´Ù. + ¼³Á¤ÆÄÀÏ¿¡¼­ ÀÌ °¡»óÈ£½ºÆ®¸¦ °¡Àå ¸ÕÀú ÀûÀ¸¸é ±âº» È£½ºÆ®°¡ + µÈ´Ù.

    +
    + +

    ¿¹¸¦ µé¾î www.domain.tld µµ¸ÞÀÎÀ» ¼­ºñ½ºÇÏ°í + ÀÖ¾ú´Âµ¥ °°Àº IP ÁÖ¼Ò¿¡ + www.otherdomain.tld¶õ °¡»óÈ£½ºÆ®¸¦ Ãß°¡ÇÏ°í + ½Í´Ù°í °¡Á¤ÇÏÀÚ. httpd.conf¿¡ ´ÙÀ½°ú °°ÀÌ + Ãß°¡ÇÏ¸é µÈ´Ù:

    + +

    + NameVirtualHost *:80
    +
    + <VirtualHost *:80>
    + + ServerName www.domain.tld
    + ServerAlias domain.tld *.domain.tld
    + DocumentRoot /www/domain
    +
    + </VirtualHost>
    +
    + <VirtualHost *:80>
    + ServerName www.otherdomain.tld
    + DocumentRoot /www/otherdomain
    +
    + </VirtualHost>
    +

    + +

    NameVirtualHost¿Í + <VirtualHost> + Áö½Ã¾î µÑ ¸ðµÎ * ´ë½Å Á÷Á¢ IP ÁÖ¼Ò¸¦ ÁöÁ¤ÇÒ + ¼öµµ ÀÖ´Ù. ¿¹¸¦ µé¾î, ÀÌ·±½ÄÀ¸·Î ÇÑ IP ÁÖ¼Ò¿¡ ¿©·¯ À̸§±â¹Ý + °¡»óÈ£½ºÆ®µéÀ» µ¹¸®°í, ´Ù¸¥ ÁÖ¼Ò¿¡ IP±â¹Ý ȤÀº À̸§±â¹Ý + °¡»óÈ£½ºÆ®µéÀ» µ¹¸± ¼ö ÀÖ´Ù.

    + +

    ¾î¶² ¼­¹ö´Â ¿©·¯ À̸§À¸·Î Á¢¼ÓÇÒ ¼ö ÀÖ±æ ¹Ù¶õ´Ù. ÀÌ´Â + <VirtualHost> + ¼½¼Ç ¾È¿¡ ServerAlias + Áö½Ã¾î¸¦ »ç¿ëÇÏ¿© °¡´ÉÇÏ´Ù. ¿¹¸¦ µé¾î À§ÀÇ Ã¹¹ø° <VirtualHost> ºí·Ï¿¡¼­ + ServerAlias Áö½Ã¾î¸¦ + »ç¿ëÇÏ¸é ¿­°ÅÇÑ À̸§À¸·Î °°Àº À¥»çÀÌÆ®¸¦ º¼ ¼ö ÀÖ´Ù:

    + +

    + ServerAlias domain.tld *.domain.tld +

    + +

    domain.tld µµ¸ÞÀο¡ ÀÖ´Â ¸ðµç È£½ºÆ®¿¡ ´ëÇÑ + ¿äûÀ» www.domain.tld °¡»óÈ£½ºÆ®°¡ ¼­ºñ½ºÇÑ´Ù. + À̸§À» ÁÙ¶§ ¿ÍÀϵåÄ«µå ¹®ÀÚ *¿Í ?¸¦ + »ç¿ëÇÒ ¼ö ÀÖ´Ù. ¹°·Ð ServerNameÀ̳ª ServerAlias¿¡ + À̸§À» Àû¾îÁÖ¾ú´Ù°í ³¡ÀÌ ¾Æ´Ï´Ù. ¸ÕÀú ÀÌ À̸§µéÀÌ ¼­¹öÀÇ + IP ÁÖ¼Ò·Î ´ëÀÀÇϵµ·Ï DNS ¼­¹ö¸¦ ¾Ë¸Â°Ô ¼³Á¤ÇØ¾ß ÇÑ´Ù.

    + +

    ¸¶Áö¸·À¸·Î <<VirtualHost>> ¾È¿¡ ´Ù¸¥ + Áö½Ã¾îµéÀ» »ç¿ëÇÏ¿© °¡»óÈ£½ºÆ®¸¦ ÀÚ¼¼È÷ ¼³Á¤ÇÒ ¼ö ÀÖ´Ù. + ´ëºÎºÐÀÇ Áö½Ã¾î¸¦ »ç¿ëÇÒ ¼ö ÀÖÀ¸¸ç, °ü·ÃµÈ °¡»óÈ£½ºÆ®ÀÇ ¼³Á¤¸¸À» + º¯°æÇÑ´Ù. ¾î¶² Áö½Ã¾î°¡ »ç¿ë°¡´ÉÇÑÁö ¾Ë·Á¸é Áö½Ã¾îÀÇ »ç¿ëÀå¼Ò¸¦ + È®ÀÎÇ϶ó. (<<VirtualHost>> ¾ÈÀÌ ¾Æ´Ñ) + ÁÖ¼­¹ö¼³Á¤¿¡¼­ ÁöÁ¤ÇÑ ¼³Á¤ Áö½Ã¾î´Â °¡»óÈ£½ºÆ®¿¡ + °°Àº ¼³Á¤ Áö½Ã¾î°¡ ¾ø´Â °æ¿ì¿¡¸¸ »ç¿ëµÈ´Ù.

    + +

    ¿äûÀ» ¹ÞÀ¸¸é ¼­¹ö´Â ¸ÕÀú NameVirtualHost¿¡¼­ ÁöÁ¤ÇÑ IP + ÁÖ¼ÒÀÎÁö °Ë»çÇÑ´Ù. ±×·¸´Ù¸é ±× IP ÁÖ¼Ò¸¦ °¡Áø <VirtualHost> + ¼½¼Çµé¿¡¼­ ¿äûÇÑ È£½ºÆ®¸í°ú ÀÏÄ¡ÇÏ´Â ServerNameÀ̳ª + ServerAlias¸¦ ã´Â´Ù. ãÀ¸¸é ±× ¼³Á¤À» »ç¿ëÇÑ´Ù. + ÀûÀýÇÑ °¡»óÈ£½ºÆ®¸¦ ãÁö¸øÇϸé, IP ÁÖ¼Ò¿¡ ÇØ´çÇÏ´Â + °¡»óÈ£½ºÆ®µéÁß Ã¹¹ø° °ÍÀ» »ç¿ëÇÑ´Ù.

    + +

    °á°úÀûÀ¸·Î óÀ½¿¡ ³ª¿Â °¡»óÈ£½ºÆ®°¡ ±âº» + °¡»óÈ£½ºÆ®°¡ µÈ´Ù. IP ÁÖ¼Ò°¡ NameVirtualHost Áö½Ã¾î¿¡ ÇØ´çÇϸé, + ÁÖ¼­¹öÀÇ DocumentRoot´Â + Àý´ë·Î »ç¿ëÇÏÁö ¾Ê´Â´Ù. ƯÁ¤ °¡»óÈ£½ºÆ®¿¡ + ÇØ´çÇÏÁö¾Ê´Â ¿äûÀ» ¼³Á¤ÇÏ·Á¸é ¼³Á¤À» <VirtualHost>¿¡ ´ã°í ¼³Á¤ÆÄÀÏ¿¡¼­ + ¸ÕÀú ³ª¿Àµµ·Ï ÇÏ¸é µÈ´Ù.

    + +
    top
    +
    +

    ¿À·¡µÈ ºê¶ó¿ìÀú¿Í ȣȯ

    + +

    ÀÌ¹Ì Àû¾úµíÀÌ À̸§±â¹Ý °¡»óÈ£½ºÆ®°¡ ¿Ã¹Ù·Î µ¿ÀÛÇϱâÀ§ÇØ + ÇÊ¿äÇÑ Á¤º¸¸¦ º¸³»Áö¾Ê´Â Ŭ¶óÀ̾ðÆ®°¡ ÀÖ´Ù. ÀÌ·± Ŭ¶óÀ̾ðÆ®´Â + Ç×»ó ¿äûÇÑ IP ÁÖ¼Ò¿¡ ´ëÇØ Ã¹¹ø°·Î ³ª¿À´Â °¡»óÈ£½ºÆ® + (ÃÖÃÊÀÇ À̸§±â¹Ý °¡»óÈ£½ºÆ®)°¡ + ¼­ºñ½ºÇÑ´Ù.

    + +

    ¾ó¸¶³ª ¿À·¡µÈ °ÍÀ» ¸»Çϴ°¡?

    +

    ¿©±â¼­ ¿À·¡µÇ¾úÀ½Àº ½ÇÁ¦·Î »ó´çÈ÷ ¿À·¡µÈ °ÍÀ» ¶æÇÑ´Ù. + ¿À´Ã³¯ ÀÌ·± ºê¶ó¿ìÀú¸¦ »ç¿ëÇÒ ÀÏÀº °ÅÀǾø´Ù. ¿äÁò + ºê¶ó¿ìÀú´Â ¸ðµÎ À̸§±â¹Ý °¡»óÈ£½ºÆ®¿¡ ÇÊ¿äÇÑ Host + Çì´õ¸¦ º¸³½´Ù.

    +
    + +

    ÀÌ ¹®Á¦´Â ¾à°£ °ÅÃßÀ彺·´Áö¸¸ ServerPath Áö½Ã¾î·Î ÇØ°áÇÒ ¼ö ÀÖ´Ù:

    + +

    ¼³Á¤ ¿¹:

    + +

    + NameVirtualHost 111.22.33.44
    +
    + <VirtualHost 111.22.33.44>
    + + ServerName www.domain.tld
    + ServerPath /domain
    + DocumentRoot /web/domain
    +
    + </VirtualHost>
    +

    + +

    ÀÌ°Ô ¹«½¼ ¶æÀΰ¡? "/domain"·Î ½ÃÀÛÇÏ´Â + URI¿¡ ´ëÇÑ ¿äûÀº °¡»óÈ£½ºÆ® www.domain.tld°¡ + ¼­ºñ½ºÇÑ´Ù. Áï, Host: Çì´õ¸¦ º¸³»´Â Ŭ¶óÀ̾ðÆ®´Â + http://www.domain.tld/¸¸À¸·Îµµ Á¢±ÙÇÒ ¼ö ÀÖÁö¸¸, + http://www.domain.tld/domain/À¸·Î´Â ¸ðµç + Ŭ¶óÀ̾ðÆ®°¡ ÆäÀÌÁö¿¡ Á¢±ÙÇÒ ¼ö ÀÖ´Ù.

    + +

    À̸¦ À§ÇØ ÃÖÃÊÀÇ °¡»óÈ£½ºÆ®¿¡ ÀÖ´Â ÆäÀÌÁö¿¡ + http://www.domain.tld/domain/À¸·Î °¡´Â ¸µÅ©¸¦ + ³Ö´Â´Ù. ±×¸®°í °¡»óÈ£½ºÆ® ÆäÀÌÁö¿¡¼­´Â »ó´ë¸µÅ© (¿¹¸¦ µé¾î, + "file.html" À̳ª "../icons/image.gif") + ȤÀº ("http://www.domain.tld/domain/misc/file.html"À̳ª + "/domain/misc/file.html"°ú °°ÀÌ) ¾Õ¿¡ + /domain/ÀÌ ºÙÀº ¸µÅ©¸¸À» »ç¿ëÇÑ´Ù.

    + +

    Á¶±Ý ±ÔÄ¢ÀÌ ÇÊ¿äÇÏÁö¸¸ ÀÌ ±ÔÄ¢À» µû¸£¸é ´ëºÎºÐÀÇ °æ¿ì + ¿äÁò °ÍÀ̳ª ¿À·¡µÈ °ÍÀ̳ª °ü°è¾øÀÌ ¸ðµç ºê¶ó¿ìÀú·Î ÆäÀÌÁö¸¦ + º¼ ¼ö ÀÖ´Ù.

    + +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/docs/manual/vhosts/name-based.html.tr.utf8 b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/name-based.html.tr.utf8 new file mode 100644 index 00000000..7fef092a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/docs/manual/vhosts/name-based.html.tr.utf8 @@ -0,0 +1,256 @@ + + + +İsme Dayalı Sanal Konaklar - Apache HTTP Sunucusu + + + + + +
    <-
    +

    İsme Dayalı Sanal Konaklar

    +
    +

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

    +
    + +

    Bu belgede isme dayalı sanal konakların ne zaman, nasıl kullanılacakları + açıklanmıştır.

    +
    + +
    top
    +
    +

    İsme dayalı ve IP’ye dayalı Sanal Konaklar

    + +

    IP’ye dayalı sanal konaklarda sunulacak sanal konağı doğru tespit + edebilmek için bağlantının yapıldığı IP adresine bakılır. Bu bakımdan her + konak için ayrı bir IP adresine gereksinim vardır. İsme dayalı sanal + konaklarda ise sunucu, istemcinin HTTP başlığının bir parçası olarak + gönderdiği konak adını kullanır. Bu teknikte aynı IP adresini çok sayıda + farklı konak kullanabilir.

    + +

    İsme dayalı sanal barındırma nispeten daha kolaydır, çünkü her konak + ismini doğru IP adresiyle eşlemek için DNS sunucunuzu yapılandırdıktan + sonra Apache HTTP sunucusunu farklı konak isimlerini tanıyacak şekilde + yapılandırmanız yeterli olur. İsme dayalı sanal barındırma ayrıca zaten + kıt olan IP adreslerine talebi de azaltır. Bu nedenle, IP’ye dayalı sanal + konakları kullanmanızı gerektirecek çok özel bir sebep olmadıkça isme + dayalı sanal konaklar kullanmalısınız. IP’ye dayalı sanal konakların + kullanımını gerektirebilecek bazı durumlar:

    + +
      +
    • Bazı tarihi istemciler isme dayalı sanal konaklarla uyumlu değildir. + Ä°sme dayalı sanal konakların çalışması için istemcinin HTTP Host + başlığı göndermesi gerekir. Bu da HTTP/1.1 desteği gerektirir. + Günümüzdeki HTTP/1.0 istemcileri bir eklenti olarak HTTP/1.1’i de + desteklemektedir. Tarihi eser haline gelmiş HTTP/1.1 desteği + bulurmayan eski istemcileri hala isme dayalı sanal konaklarla + desteklemek isterseniz bu belgenin sonunda bunu mümkün kılabilecek bir + tekniğe yer verilmiştir.
    • + +
    • Ä°sme dayalı sanal konaklar SSL portokolünün doğası gereğince SSL’li + güvenli sunucular için kullanılamazlar.
    • + +
    • Bazı işletim sistemlerinin ve ağ donanımlarının gerçekleştirdiği + band genişliği yönetim teknikleri IP adresleri farklı olmadığı sürece + konaklar arasında ayrım yapamazlar.
    • +
    + +
    top
    +
    +

    İsme Dayalı Sanal Konakların Kullanımı

    + + + +

    İsme dayalı sanal konakları kullanmak için, bu konaklar için istekleri + kabul edecek sunucuya IP adresini (ve muhtemelen portu da) + belirtmelisiniz. Bu işlem NameVirtualHost yönergesiyle yapılır. Normal + şartlar altında sunucu üzerinde bütün IP adreslerinin kullanılması + gerekir; bunun için NameVirtualHost + yönergesine argüman olarak * belirtebilirsiniz. Çok sayıda + port kullanmayı planlıyorsanız (SSL çalıştırmak gibi), argümana + *:80 şeklinde port ekleyebilirsiniz. Yalnız, NameVirtualHost yönergesinde bir IP adresi + belirtmiş olmakla sunucunun kendiliğinden o IP adresini dinlemeyeceğine + dikkat ediniz. Bu konuda ayrıntılı bilgi edinmek için Apache’nin kullanacağı adreslerin ve portların + ayarlanması belgesine bakınız. Ayrıca, sunucuda, burada belirttiğiniz + IP adresine sahip bir ağ arabirimi olmalıdır.

    + +

    Sonraki adım sunacağınız her konak için ayrı bir <VirtualHost> bölümü oluşturmaktır. + <VirtualHost> + yönergesinin argümanı ile eşleşen bir NameVirtualHost yönergesi tanımlanmış olmalıdır + (bu değer normalde ya bir IP adresidir ya da *’dır). Her + <VirtualHost> bölümü + içinde sunulan konağı belirtmek üzere en azından bir adet ServerName yönergesine ve konak içeriğinin dosya + sisteminde bulunduğu yeri gösteren bir DocumentRoot yönergesine ihtiyacınız olacaktır.

    + +

    Ana konağı unutmayın

    +

    Mevcut sitenize sanal konaklar eklerseniz, mevcut siteniz için de bir + <VirtualHost> bölümü + oluşturmalısınız. Bu sanal konak bölümü içinde kullanacağınız + ServerName ve DocumentRoot yönergelerinin argümanları, bu + yönergelerin sunucu geneli için belirttiğiniz değerlerini + içermelidir. Bu sanal konağı yapılandırma dosyanızdaki ilk sanal konak + yapın ki, öntanımlı konak olsun.

    +
    + +

    Örnek olarak, www.biralan.tld adresinden sitenizi sunmakta + olduğunuzu ve bunun yanına aynı IP adresini kullanan + www.digeralan.tld sanal konağını eklemek istediğinizi + varsayalım. Bunun için httpd.conf dosyanıza basitçe şu + satırları ekleyebilirsiniz:

    + +

    + NameVirtualHost *:80
    +
    + <VirtualHost *:80>
    + + ServerName www.biralan.tld
    + ServerAlias biralan.tld *.biralan.tld
    + DocumentRoot /siteler/biralan
    +
    + </VirtualHost>
    +
    + <VirtualHost *:80>
    + ServerName www.digeralan.tld
    + DocumentRoot /siteler/digeralan
    +
    + </VirtualHost>
    +

    + +

    İsterseniz, NameVirtualHost ve + <VirtualHost> + yönergelerinde argüman olarak * yerine doğrudan bir IP adresi + belirtebilirsiniz. Hatta, daha sonra, isme dayalı sanal konakları bir IP + adresinden ve IP’ye dayalı olanları veya isme dayalı diğer bir sanal konak + grubunu diğer IP adreslerinden sunmak isteyebilirsiniz.

    + +

    Çoğu sunucunun birden fazla isim ile erişilebilir olması istenir. Bu, + <VirtualHost> bölümü + içine bir ServerAlias yönergesi + yerleştirmek suretiyle mümkün olur. Örneğin yukarıdaki örnekte, + kullanıcıların aynı siteye farklı isimlerle erişmelerini mümkün kılmak + için bölüm içine şu satırı ekleyebilirsiniz:

    + +

    + ServerAlias biralan.tld *.biralan.tld +

    + +

    Böylece biralan.tld alanındaki tüm konaklar için gelen + isteklere www.biralan.tld sanal konağından hizmet sunulmuş + olur. Konak isimleriyle eşleşmek üzere dosya ismi kalıp karakterleri + * ve ? kullanılabilir. Şüphesiz bu isimleri sırf + ServerName veya + ServerAlias yönergesinde belirtmiş olmakla bu isimleri + erişilebilir kılamazsınız. Öncelikle, bu isimleri sunucunuzdaki IP + adresleriyle eşlemek üzere yapılandıracağınız bir DNS sunucunuz + olmalıdır.

    + +

    Son olarak, sanal konak yapılandırmanıza, <VirtualHost> bölümlerinin içine başka yönergeler + yerleştirerek ince ayar çekebilirsiniz. Çoğu yönerge bu bölümlere + yerleştirilebilir ve sadece o sanal konakla ilgili yapılandırmayı + değiştirmek için kullanılabilir. Belli bir yönergenin sanal konak + bölümlerinde kullanılıp kullanılmayacağını yönergenin açıklamasında Bağlam satırına bakarak + öğrenebilirsiniz. Ana sunucu bağlamındaki (<VirtualHost> bölümleri dışındaki) + yapılandırma yönergelerinden sadece sanal konak bölümlerinde geçersiz + kılınmamış olanlar kullanılacaktır.

    + +

    Sunucuya bir istek geldiğinde, sunucu önce IP adresiyle eşleşmesi olası + NameVirtualHost bölümleri var mı diye + bakar. Varsa, IP adresini eşleştirmek için NameVirtualHost bölümlerine tek tek bakar ve + istenen konak ismi ile eşleşen bir ServerName veya ServerAlias yönergesi bulmaya + çalışır. Bir tane bulduğunda, sunucu için onun yapılandırmasını kullanır. + İsimle eşleşen bir sanal konak bulamazsa IP adresiyle eşleşen ilk + sanal konağın yapılandırmasını kullanır.

    + +

    Bir önkabul olarak yapılandırma dosyasında rastlanan ilk sanal konak + öntanımlı sanal konaktır. IP adresi bir sanal konakla eşleştiği + takdirde ana sunucunun DocumentRoot değeri asla kullanılmayacaktır. + Sanal konaklardan hiçbiriyle eşleşmeyen istekler için özel bir + yapılandırmanız olsun isterseniz, bu yapılandırmayı yapılandırma + dosyanızdaki ilk <VirtualHost> bölümüne yerleştirmeniz + yetecektir.

    + +
    top
    +
    +

    Artık Tarihe Karışmış Tarayıcılarla Uyumluluk

    + +

    Evvelce de bahsedildiği gibi, isme dayalı sanal konakların gerektiği gibi + çalışması için gerekli veriyi göndermeyen bazı istemciler vardır. Bu + istemcilere daima o IP adresinin yapılandırma dosyasındaki ilk sanal + konağının (isme dayalı başat sanal konak) sayfaları + gönderilir.

    + +

    Ne kadar eski?

    +

    Lütfen dikkat edin, eski deyince gerçekten de antika demek istiyoruz. + Günümüzde bu tür tarayıcılara rastlamanız neredeyse imkansızdır. Günümüz + tarayıcılarının hepsi isme dayalı sanal konakların gerektirdiği + Host başlığını gönderirler.

    +
    + +

    Olayı fazla germeden ServerPath + yönergesini kullanarak sorunun çevresinden dolanmak mümkündür:

    + +

    Örnek yapılandırma:

    + +

    + NameVirtualHost 111.22.33.44
    +
    + <VirtualHost 111.22.33.44>
    + + ServerName www.biralan.tld
    + ServerPath /biralan
    + DocumentRoot /siteler/biralan
    +
    + </VirtualHost>
    +

    + +

    Bu ne anlama geliyor? Anlamı, "/biralan" ile başlayan her + URI isteği www.biralan.tld sanal konağı tarafından sunulacak, + demektir. Yani, tüm istemcilerin + http://www.biralan.tld/biralan/ olarak eriştiği yere + Host: başlığı gönderen istemciler + http://www.biralan.tld/ olarak erişirler.

    + +

    Bunu gerçekleştirebilmek için başat sanal konağın baş sayfasına + http://www.biralan.tld/biralan/ için bir bağ koyduktan sonra + sanal konağın sayfalarında ya tamamen göreli bağlar + ("dosya.html", "../simgeler/resim.png" gibi) + veya /biralan/ ile öncelenmiş bağlar + ("http://www.biralan.tld/biralan/muht/dosya.html" veya + "/biralan/muht/dosya.html" gibi) kullanın.

    + +

    Bu işlem biraz disiplin gerektirse de bu yazılanlara sıkı sıkıya bağlı + kalarak hem eski hem de yeni tarayıcıların sayfalarınızı doğru + görüntülemesini sağlamış olursunuz.

    + +
    +
    +

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

    +
    + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/emacs-style b/rubbos/app/httpd-2.0.64/emacs-style new file mode 100644 index 00000000..d66f865a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/emacs-style @@ -0,0 +1,11 @@ +(add-hook 'c-mode-hook + (function (lambda () + (c-set-offset 'inclass' ++) + (c-set-offset 'defun-block-intro' ++) + (c-set-offset 'statement-block-intro' ++) + (c-set-offset 'substatement' ++) + (c-set-offset 'brace-list-intro' ++) + (c-set-offset 'statement-case-intro' ++) + (c-set-offset 'inextern-lang' 0) + ))) +(setq c++-mode-hook c-mode-hook) diff --git a/rubbos/app/httpd-2.0.64/httpd b/rubbos/app/httpd-2.0.64/httpd new file mode 100755 index 00000000..1a1bc437 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/httpd @@ -0,0 +1,131 @@ +#! /bin/bash + +# httpd - temporary wrapper script for .libs/httpd +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# The httpd program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='/bin/sed -e 1s/^X//' +sed_quote_subst='s/\([\\`\\"$\\\\]\)/\\\1/g' + +# Be Bourne compatible (taken from Autoconf:_AS_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="(cd /bottlenecks/rubbos/app/httpd-2.0.64; { test -z \"\${LIBRARY_PATH+set}\" || unset LIBRARY_PATH || { LIBRARY_PATH=; export LIBRARY_PATH; }; }; { test -z \"\${COMPILER_PATH+set}\" || unset COMPILER_PATH || { COMPILER_PATH=; export COMPILER_PATH; }; }; { test -z \"\${GCC_EXEC_PREFIX+set}\" || unset GCC_EXEC_PREFIX || { GCC_EXEC_PREFIX=; export GCC_EXEC_PREFIX; }; }; { test -z \"\${LD_RUN_PATH+set}\" || unset LD_RUN_PATH || { LD_RUN_PATH=; export LD_RUN_PATH; }; }; { test -z \"\${LD_LIBRARY_PATH+set}\" || unset LD_LIBRARY_PATH || { LD_LIBRARY_PATH=; export LD_LIBRARY_PATH; }; }; PATH=\"/bottlenecks/rubbos/app/jdk1.6.0_27/bin:/bin/unix:/bottlenecks/rubbos/app/apache-ant-1.6.5/bin:/bottlenecks/rubbos/app/apache-tomcat-5.5.17/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games\"; export PATH; gcc -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE -DAP_HAVE_DESIGNATED_INITIALIZER -I/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include -I/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include -I/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib -I. -I/bottlenecks/rubbos/app/httpd-2.0.64/os/unix -I/bottlenecks/rubbos/app/httpd-2.0.64/server/mpm/worker -I/bottlenecks/rubbos/app/httpd-2.0.64/modules/http -I/bottlenecks/rubbos/app/httpd-2.0.64/modules/filters -I/bottlenecks/rubbos/app/httpd-2.0.64/modules/proxy -I/bottlenecks/rubbos/app/httpd-2.0.64/include -I/bottlenecks/rubbos/app/httpd-2.0.64/modules/generators -I/bottlenecks/rubbos/app/httpd-2.0.64/modules/dav/main -o \$progdir/\$file .libs/modules.o -Wl,--export-dynamic -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib modules/aaa/.libs/mod_access.a modules/aaa/.libs/mod_auth.a modules/filters/.libs/mod_include.a modules/loggers/.libs/mod_log_config.a modules/metadata/.libs/mod_env.a modules/metadata/.libs/mod_setenvif.a modules/http/.libs/mod_http.a modules/http/.libs/mod_mime.a modules/generators/.libs/mod_status.a modules/generators/.libs/mod_autoindex.a modules/generators/.libs/mod_asis.a modules/generators/.libs/mod_cgid.a modules/mappers/.libs/mod_negotiation.a modules/mappers/.libs/mod_dir.a modules/mappers/.libs/mod_imap.a modules/mappers/.libs/mod_actions.a modules/mappers/.libs/mod_userdir.a modules/mappers/.libs/mod_alias.a modules/mappers/.libs/mod_so.a server/mpm/worker/.libs/libworker.a server/.libs/libmain.a os/unix/.libs/libos.a /bottlenecks/rubbos/app/httpd-2.0.64/srclib/pcre/.libs/libpcre.a /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/.libs/libaprutil-0.so /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/.libs/libexpat.so /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/.libs/libapr-0.so -lrt -lm -lcrypt -lnsl -lpthread -ldl -Wl,--rpath -Wl,/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/.libs -Wl,--rpath -Wl,/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/.libs -Wl,--rpath -Wl,/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/.libs -Wl,--rpath -Wl,/bottlenecks/rubbos/app/apache2/lib ) " + +# This environment variable determines our operation mode. +if test "$libtool_install_magic" = "%%%MAGIC variable%%%"; then + # install mode needs the following variable: + notinst_deplibs=' /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/libaprutil-0.la /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/libexpat.la /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/libapr-0.la' +else + # When we are sourced in execute mode, $file and $echo are already set. + if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then + echo="echo" + file="$0" + # Make sure echo works. + if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift + elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then + # Yippee, $echo works! + : + else + # Restart under the correct shell, and then maybe $echo will work. + exec /bin/bash "$0" --no-reexec ${1+"$@"} + fi + fi + + # Find the directory that this script lives in. + thisdir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "x$thisdir" = "x$file" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=`ls -ld "$file" | /bin/sed -n 's/.*-> //p'` + while test -n "$file"; do + destdir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + + # If there was a directory component, then change thisdir. + if test "x$destdir" != "x$file"; then + case "$destdir" in + [\\/]* | [A-Za-z]:[\\/]*) thisdir="$destdir" ;; + *) thisdir="$thisdir/$destdir" ;; + esac + fi + + file=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + file=`ls -ld "$thisdir/$file" | /bin/sed -n 's/.*-> //p'` + done + + # Try to get the absolute directory name. + absdir=`cd "$thisdir" && pwd` + test -n "$absdir" && thisdir="$absdir" + + program=lt-'httpd' + progdir="$thisdir/.libs" + + if test ! -f "$progdir/$program" || \ + { file=`ls -1dt "$progdir/$program" "$progdir/../$program" 2>/dev/null | /bin/sed 1q`; \ + test "X$file" != "X$progdir/$program"; }; then + + file="$$-$program" + + if test ! -d "$progdir"; then + mkdir "$progdir" + else + rm -f "$progdir/$file" + fi + + # 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 -f "$progdir/$file" + exit 1 + fi + fi + + mv -f "$progdir/$file" "$progdir/$program" 2>/dev/null || + { rm -f "$progdir/$program"; + mv -f "$progdir/$file" "$progdir/$program"; } + rm -f "$progdir/$file" + fi + + if test -f "$progdir/$program"; then + if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then + # Run the actual program with our arguments. + + exec "$progdir/$program" ${1+"$@"} + + $echo "$0: cannot exec $program $*" + exit 1 + fi + else + # The program doesn't exist. + $echo "$0: error: \`$progdir/$program' does not exist" 1>&2 + $echo "This script is just a wrapper for $program." 1>&2 + echo "See the libtool documentation for more information." 1>&2 + exit 1 + fi +fi diff --git a/rubbos/app/httpd-2.0.64/httpd.spec b/rubbos/app/httpd-2.0.64/httpd.spec new file mode 100644 index 00000000..f1999578 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/httpd.spec @@ -0,0 +1,514 @@ +%define contentdir /var/www +%define suexec_caller apache +%define mmn 20020903 + +%ifarch ia64 +# disable debuginfo on IA64 +%define debug_package %{nil} +%endif + +Summary: Apache HTTP Server +Name: httpd +Version: 2.0.64 +Release: 1 +URL: http://httpd.apache.org/ +Vendor: Apache Software Foundation +Source0: http://www.apache.org/dist/httpd/httpd-%{version}.tar.gz +License: Apache License, Version 2.0 +Group: System Environment/Daemons +BuildRoot: %{_tmppath}/%{name}-root +BuildPrereq: apr-devel, apr-util-devel, openldap-devel, db4-devel, expat-devel, findutils, perl, pkgconfig +BuildPrereq: /usr/bin/apr-config, /usr/bin/apu-config +Requires: apr >= 0.9.7, apr-util >= 0.9.7, gawk, /usr/share/magic.mime, /usr/bin/find, openldap +Prereq: /sbin/chkconfig, /bin/mktemp, /bin/rm, /bin/mv +Prereq: sh-utils, textutils, /usr/sbin/useradd +Provides: webserver +Provides: httpd-mmn = %{mmn} +Conflicts: thttpd +Obsoletes: apache, secureweb, mod_dav + +%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: libtool, httpd = %{version} +Requires: apr-devel >= 0.9.7, apr-util-devel >= 0.9.7 + +%description devel +The httpd-devel package contains the APXS binary and other files +that you need to build Dynamic Shared Objects (DSOs) for Apache. + +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. +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 -n mod_ssl +Group: System Environment/Daemons +Summary: SSL/TLS module for the Apache HTTP server +Serial: 1 +BuildPrereq: openssl-devel +Prereq: openssl, dev, /bin/cat +Requires: httpd, make, 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 \`pwd\`/include/ap_mmn.h | grep -e '^[0-9]'` +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 + +# regenerate configure scripts +./buildconf + +# Before configure; fix location of build dir in generated apxs +%{__perl} -pi -e "s:\@exp_installbuilddir\@:%{_libdir}/httpd/build:g" \ + support/apxs.in + +%build + +if pkg-config openssl ; then + # configure -C barfs with trailing spaces in CFLAGS + CFLAGS="$RPM_OPT_FLAGS `pkg-config --cflags openssl | sed 's/ *$//'`" + AP_LIBS="$AP_LIBS `pkg-config --libs openssl`" +else + CFLAGS="$RPM_OPT_FLAGS" + AP_LIBS="-lssl -lcrypto" +fi +export CFLAGS +export AP_LIBS + +function mpmbuild() +{ +mpm=$1; shift +mkdir $mpm; pushd $mpm +cat > config.cache < prefork.mods +./worker/httpd -l | grep -v worker > worker.mods +if ! diff -u prefork.mods worker.mods; then + : Different modules built into httpd binaries, will not proceed + exit 1 +fi + +%install +rm -rf $RPM_BUILD_ROOT + +pushd prefork +make DESTDIR=$RPM_BUILD_ROOT install +popd +# install worker binary +install -m 755 worker/httpd $RPM_BUILD_ROOT%{_sbindir}/httpd.worker + +# mod_ssl bits +for suffix in crl crt csr key prm; do + mkdir $RPM_BUILD_ROOT%{_sysconfdir}/httpd/conf/ssl.${suffix} +done + +# Makefiles for certificate management +#for ext in crt crl; do +# install -m 644 ./build/rpm/mod_ssl-Makefile.${ext} \ +# $RPM_BUILD_ROOT%{_sysconfdir}/httpd/conf/ssl.${ext}/Makefile.${ext} +#done +#ln -s ../../../usr/share/ssl/certs/Makefile $RPM_BUILD_ROOT/etc/httpd/conf + +# 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} + +# move the build directory to within the library directory +mv $RPM_BUILD_ROOT%{contentdir}/build $RPM_BUILD_ROOT%{_libdir}/httpd/build + +# fix up config_vars file: relocate the build directory into libdir; +# reference correct libtool from apr; remove references to RPM build root. +sed -e "s|%{contentdir}/build|%{_libdir}/httpd/build|g" \ + -e "/AP_LIBS/d" -e "/abs_srcdir/d" \ + -e "/^LIBTOOL/s|/[^ ]*/libtool|`apr-config --apr-libtool`|" \ + -e "/^EXTRA_INCLUDES/s|-I$RPM_BUILD_DIR[^ ]* ||g" \ + < prefork/build/config_vars.mk \ + > $RPM_BUILD_ROOT%{_libdir}/httpd/build/config_vars.mk + +# Make the MMN accessible to module packages +echo %{mmn} > $RPM_BUILD_ROOT%{_includedir}/httpd/.mmn + +# docroot +mkdir $RPM_BUILD_ROOT%{contentdir}/html +rm -r $RPM_BUILD_ROOT%{contentdir}/manual/style + +# logs +rmdir $RPM_BUILD_ROOT%{_sysconfdir}/httpd/logs +mkdir -p $RPM_BUILD_ROOT%{_localstatedir}/log/httpd + +# 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 +ln -s ../..%{_libdir}/httpd/build $RPM_BUILD_ROOT/etc/httpd/build + +# 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 +%{__perl} -pi -e "s:\@docdir\@:%{_docdir}/%{name}-%{version}:g" \ + $RPM_BUILD_ROOT/etc/rc.d/init.d/httpd + +# 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}/htdocs/* \ + $RPM_BUILD_ROOT%{contentdir}/cgi-bin/* + +%pre +# Add the "apache" user +/usr/sbin/useradd -c "Apache" -u 48 \ + -s /sbin/nologin -r -d %{contentdir} apache 2> /dev/null || : + +%triggerpostun -- apache < 2.0 +/sbin/chkconfig --add httpd + +%post +# Register the httpd service +/sbin/chkconfig --add httpd + +%preun +if [ $1 = 0 ]; then + /sbin/service httpd stop > /dev/null 2>&1 + /sbin/chkconfig --del httpd +fi + +%post -n mod_ssl +/sbin/ldconfig ### is this needed? +umask 077 + +if [ ! -f %{_sysconfdir}/httpd/conf/ssl.key/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/ssl.key/server.key 2> /dev/null +fi + +FQDN=`hostname` +if [ "x${FQDN}" = "x" ]; then + FQDN=localhost.localdomain +fi + +if [ ! -f %{_sysconfdir}/httpd/conf/ssl.crt/server.crt ] ; then +cat << EOF | %{_bindir}/openssl req -new -key %{_sysconfdir}/httpd/conf/ssl.key/server.key -x509 -days 365 -out %{_sysconfdir}/httpd/conf/ssl.crt/server.crt 2>/dev/null +-- +SomeState +SomeCity +SomeOrganization +SomeOrganizationalUnit +${FQDN} +root@${FQDN} +EOF +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 +%config(noreplace) %{_sysconfdir}/httpd/conf/*.conf +%config(noreplace) %{_sysconfdir}/httpd/conf/magic +%config(noreplace) %{_sysconfdir}/httpd/conf/mime.types + +%config %{_sysconfdir}/logrotate.d/httpd +%config %{_sysconfdir}/rc.d/init.d/httpd + +#%dir %{_sysconfdir}/httpd/conf + +%{_sbindir}/ab +%{_sbindir}/htdbm +%{_sbindir}/htdigest +%{_sbindir}/htpasswd +%{_sbindir}/httxt2dbm +%{_sbindir}/logresolve +%{_sbindir}/httpd +%{_sbindir}/httpd.worker +%{_sbindir}/apachectl +%{_sbindir}/rotatelogs +%attr(4510,root,%{suexec_caller}) %{_sbindir}/suexec + +%dir %{_libdir}/httpd +%dir %{_libdir}/httpd/modules +# everything but mod_ssl.so: +%{_libdir}/httpd/modules/mod_[a-r]*.so +%{_libdir}/httpd/modules/mod_s[petu]*.so +%{_libdir}/httpd/modules/mod_[t-z]*.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 +%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 + +%{_mandir}/man1/* +%{_mandir}/man8/ab* +%{_mandir}/man8/apachectl* +%{_mandir}/man8/httpd* +%{_mandir}/man8/logresolve* +%{_mandir}/man8/rotatelogs* +%{_mandir}/man8/suexec* + +%files manual +%defattr(-,root,root) +%{contentdir}/manual + +%files -n mod_ssl +%defattr(-,root,root) +%{_libdir}/httpd/modules/mod_ssl.so +%config(noreplace) %{_sysconfdir}/httpd/conf/ssl.conf +%attr(0700,root,root) %dir %{_sysconfdir}/httpd/conf/ssl.* +#%config %{_sysconfdir}/httpd/conf/Makefile +#%dir %{_sysconfdir}/httpd/conf/ssl.* +%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 +%{_sysconfdir}/httpd/build +%{_sbindir}/apxs +%{_sbindir}/checkgid +%{_sbindir}/dbmmanage +%{_sbindir}/envvars* +%{_mandir}/man8/apxs.8* +%dir %{_libdir}/httpd/build +%{_libdir}/httpd/build/*.mk +%{_libdir}/httpd/build/config.nice +%{_libdir}/httpd/build/instdso.sh + +%changelog +* Mon Mar 27 2006 Graham Leggett 2.0.56-dev +- Add the missing file-cache module to the cache family of modules in + the RPM. + +* Tue Oct 11 2005 Graham Leggett 2.0.56-dev +- Updated the apr and apr-util dependencies to require at least v0.9.7 +- Stop trying to remove *.xml doc files, the httpd build does that already. + +* Thu Dec 16 2004 Graham Leggett 2.0.53-dev +- Changed build to use external apr and apr-util + +* Sat Apr 5 2003 Graham Leggett 2.0.46-dev +- Moved mime.types back to the default location. +- Added mod_ldap and friends, mod_cache and friends. +- Added openldap dependancy. + +* Sun Mar 30 2003 Graham Leggett 2.0.45-1 +- Created generic Apache rpm spec file from that donated by Redhat. +- Removed Redhat specific patches and boilerplate files. +- Removed SSL related Makefiles. + +* Mon Feb 24 2003 Joe Orton 2.0.40-21 +- add security fix for CAN-2003-0020; replace non-printable characters + with '!' when printing to error log. +- disable debuginfo on IA64. + +* Tue Feb 11 2003 Joe Orton 2.0.40-20 +- disable POSIX semaphores to support 2.4.18 kernel (#83324) + +* Wed Jan 29 2003 Joe Orton 2.0.40-19 +- require xmlto 0.0.11 or later +- fix apr_strerror on glibc2.3 + +* Wed Jan 22 2003 Tim Powers 2.0.40-18 +- rebuilt + +* Thu Jan 16 2003 Joe Orton 2.0.40-17 +- add mod_cgid and httpd binary built with worker MPM (#75496) +- allow choice of httpd binary in init script +- pick appropriate CGI module based on loaded MPM in httpd.conf +- source /etc/sysconfig/httpd in apachectl to get httpd choice +- make "apachectl status" fail gracefully when links isn't found (#78159) + +* Mon Jan 13 2003 Joe Orton 2.0.40-16 +- rebuild for OpenSSL 0.9.7 + +* Fri Jan 3 2003 Joe Orton 2.0.40-15 +- fix possible infinite recursion in config dir processing (#77206) +- fix memory leaks in request body processing (#79282) + +* Thu Dec 12 2002 Joe Orton 2.0.40-14 +- remove unstable shmht session cache from mod_ssl +- get SSL libs from pkg-config if available (Nalin Dahyabhai) +- stop "apxs -a -i" from inserting AddModule into httpd.conf (#78676) + +* Wed Nov 6 2002 Joe Orton 2.0.40-13 +- fix location of installbuilddir in apxs when libdir!=/usr/lib + +* Wed Nov 6 2002 Joe Orton 2.0.40-12 +- pass libdir to configure; clean up config_vars.mk +- package instdso.sh, fixing apxs -i (#73428) +- prevent build if upstream MMN differs from mmn macro +- remove installed but unpackaged files + +* Wed Oct 9 2002 Joe Orton 2.0.40-11 +- correct SERVER_NAME encoding in i18n error pages (thanks to Andre Malo) + +* Wed Oct 9 2002 Joe Orton 2.0.40-10 +- fix patch for CAN-2002-0840 to also cover i18n error pages + +* Wed Oct 2 2002 Joe Orton 2.0.40-9 +- security fixes for CAN-2002-0840 and CAN-2002-0843 +- fix for possible mod_dav segfault for certain requests + +* Tue Sep 24 2002 Gary Benson +- updates to the migration guide + +* Wed Sep 4 2002 Nalin Dahyabhai 2.0.40-8 +- link httpd with libssl to avoid library loading/unloading weirdness + +* Tue Sep 3 2002 Joe Orton 2.0.40-7 +- add LoadModule lines for proxy modules in httpd.conf (#73349) +- fix permissions of conf/ssl.*/ directories; add Makefiles for + certificate management (#73352) + +* Mon Sep 2 2002 Joe Orton 2.0.40-6 +- provide "httpd-mmn" to manage module ABI compatibility + +* Sun Sep 1 2002 Joe Orton 2.0.40-5 +- fix SSL session cache (#69699) +- revert addition of LDAP support to apr-util + +* Mon Aug 26 2002 Joe Orton 2.0.40-4 +- set SIGXFSZ disposition to "ignored" (#69520) +- make dummy connections to the first listener in config (#72692) + +* Mon Aug 26 2002 Joe Orton 2.0.40-3 +- allow "apachectl configtest" on a 1.3 httpd.conf +- add mod_deflate +- enable LDAP support in apr-util +- don't package everything in /var/www/error as config(noreplace) + +* Wed Aug 21 2002 Bill Nottingham 2.0.40-2 +- add trigger (#68657) + +* Mon Aug 12 2002 Joe Orton 2.0.40-1 +- update to 2.0.40 + +* Wed Jul 24 2002 Joe Orton 2.0.36-8 +- improve comment on use of UserDir in default config (#66886) + +* Wed Jul 10 2002 Joe Orton 2.0.36-7 +- use /sbin/nologin as shell for apache user (#68371) +- add patch from CVS to fix possible infinite loop when processing + internal redirects + +* Wed Jun 26 2002 Gary Benson 2.0.36-6 +- modify init script to detect 1.3.x httpd.conf's and direct users + to the migration guide + +* Tue Jun 25 2002 Gary Benson 2.0.36-5 +- patch apachectl to detect 1.3.x httpd.conf's and direct users + to the migration guide +- ship the migration guide + +* Fri Jun 21 2002 Joe Orton +- move /etc/httpd2 back to /etc/httpd +- add noindex.html page and poweredby logo; tweak default config + to load noindex.html if no default "/" page is present. +- add patch to prevent mutex errors on graceful restart + +* Fri Jun 21 2002 Tim Powers 2.0.36-4 +- automated rebuild + +* Wed Jun 12 2002 Joe Orton 2.0.36-3 +- add patch to fix SSL mutex handling + +* Wed Jun 12 2002 Joe Orton 2.0.36-2 +- improved config directory patch + +* Mon May 20 2002 Joe Orton +- initial build; based heavily on apache.spec and mod_ssl.spec +- fixes: #65214, #58490, #57376, #61265, #65518, #58177, #57245 diff --git a/rubbos/app/httpd-2.0.64/include/.indent.pro b/rubbos/app/httpd-2.0.64/include/.indent.pro new file mode 100644 index 00000000..a9fbe9f9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/include/.indent.pro @@ -0,0 +1,54 @@ +-i4 -npsl -di0 -br -nce -d0 -cli0 -npcs -nfc1 +-TBUFF +-TFILE +-TTRANS +-TUINT4 +-T_trans +-Tallow_options_t +-Tapache_sfio +-Tarray_header +-Tbool_int +-Tbuf_area +-Tbuff_struct +-Tbuffy +-Tcmd_how +-Tcmd_parms +-Tcommand_rec +-Tcommand_struct +-Tconn_rec +-Tcore_dir_config +-Tcore_server_config +-Tdir_maker_func +-Tevent +-Tglobals_s +-Thandler_func +-Thandler_rec +-Tjoblist_s +-Tlisten_rec +-Tmerger_func +-Tmode_t +-Tmodule +-Tmodule_struct +-Tmutex +-Tn_long +-Tother_child_rec +-Toverrides_t +-Tparent_score +-Tpid_t +-Tpiped_log +-Tpool +-Trequest_rec +-Trequire_line +-Trlim_t +-Tscoreboard +-Tsemaphore +-Tserver_addr_rec +-Tserver_rec +-Tserver_rec_chain +-Tshort_score +-Ttable +-Ttable_entry +-Tthread +-Tu_wide_int +-Tvtime_t +-Twide_int diff --git a/rubbos/app/httpd-2.0.64/include/ap_compat.h b/rubbos/app/httpd-2.0.64/include/ap_compat.h new file mode 100644 index 00000000..4985bc4d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/include/ap_compat.h @@ -0,0 +1,28 @@ +/* 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. + */ + +#ifndef AP_COMPAT_H +#define AP_COMPAT_H + +/* Drag in apu (and therefore apr) renamed symbols */ +#include "apu_compat.h" + +/* redefine 1.3.x symbols to the new symbol names */ + +#define MODULE_VAR_EXPORT AP_MODULE_DECLARE_DATA +#define ap_send_http_header(r) ; + +#endif /* AP_COMPAT_H */ diff --git a/rubbos/app/httpd-2.0.64/include/ap_config.h b/rubbos/app/httpd-2.0.64/include/ap_config.h new file mode 100644 index 00000000..9d8db24b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/include/ap_config.h @@ -0,0 +1,256 @@ +/* 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. + */ + +#ifndef AP_CONFIG_H +#define AP_CONFIG_H + +#include "apr.h" +#include "apr_hooks.h" +#include "apr_optional_hooks.h" + +/** + * @file ap_config.h + * @brief Symbol export macros and hook functions + */ + +/* Although this file doesn't declare any hooks, declare the hook group here */ +/** @defgroup hooks Apache Hooks */ + +#ifdef DOXYGEN +/* define these just so doxygen documents them */ + +/** + * AP_DECLARE_STATIC is defined when including Apache's Core headers, + * to provide static linkage when the dynamic library may be unavailable. + * + * @see AP_DECLARE_EXPORT + * + * AP_DECLARE_STATIC and AP_DECLARE_EXPORT are left undefined when + * including Apache's Core headers, to import and link the symbols from the + * dynamic Apache Core library and assure appropriate indirection and calling + * conventions at compile time. + */ +# define AP_DECLARE_STATIC +/** + * AP_DECLARE_EXPORT is defined when building the Apache Core dynamic + * library, so that all public symbols are exported. + * + * @see AP_DECLARE_STATIC + */ +# define AP_DECLARE_EXPORT + +#endif /* def DOXYGEN */ + +#if !defined(WIN32) +/** + * Apache Core dso functions are declared with AP_DECLARE(), so they may + * use the most appropriate calling convention. Hook functions and other + * Core functions with variable arguments must use AP_DECLARE_NONSTD(). + * @code + * AP_DECLARE(rettype) ap_func(args) + * @endcode + */ +#define AP_DECLARE(type) type + +/** + * Apache Core dso variable argument and hook functions are declared with + * AP_DECLARE_NONSTD(), as they must use the C language calling convention. + * @see AP_DECLARE + * @code + * AP_DECLARE_NONSTD(rettype) ap_func(args [...]) + * @endcode + */ +#define AP_DECLARE_NONSTD(type) type + +/** + * Apache Core dso variables are declared with AP_MODULE_DECLARE_DATA. + * This assures the appropriate indirection is invoked at compile time. + * + * @note AP_DECLARE_DATA extern type apr_variable; syntax is required for + * declarations within headers to properly import the variable. + * @code + * AP_DECLARE_DATA type apr_variable + * @endcode + */ +#define AP_DECLARE_DATA + +#elif defined(AP_DECLARE_STATIC) +#define AP_DECLARE(type) type __stdcall +#define AP_DECLARE_NONSTD(type) type +#define AP_DECLARE_DATA +#elif defined(AP_DECLARE_EXPORT) +#define AP_DECLARE(type) __declspec(dllexport) type __stdcall +#define AP_DECLARE_NONSTD(type) __declspec(dllexport) type +#define AP_DECLARE_DATA __declspec(dllexport) +#else +#define AP_DECLARE(type) __declspec(dllimport) type __stdcall +#define AP_DECLARE_NONSTD(type) __declspec(dllimport) type +#define AP_DECLARE_DATA __declspec(dllimport) +#endif + +#if !defined(WIN32) || defined(AP_MODULE_DECLARE_STATIC) +/** + * Declare a dso module's exported module structure as AP_MODULE_DECLARE_DATA. + * + * Unless AP_MODULE_DECLARE_STATIC is defined at compile time, symbols + * declared with AP_MODULE_DECLARE_DATA are always exported. + * @code + * module AP_MODULE_DECLARE_DATA mod_tag + * @endcode + */ +#if defined(WIN32) +#define AP_MODULE_DECLARE(type) type __stdcall +#else +#define AP_MODULE_DECLARE(type) type +#endif +#define AP_MODULE_DECLARE_NONSTD(type) type +#define AP_MODULE_DECLARE_DATA +#else +/** + * AP_MODULE_DECLARE_EXPORT is a no-op. Unless contradicted by the + * AP_MODULE_DECLARE_STATIC compile-time symbol, it is assumed and defined. + * + * The old SHARED_MODULE compile-time symbol is now the default behavior, + * so it is no longer referenced anywhere with Apache 2.0. + */ +#define AP_MODULE_DECLARE_EXPORT +#define AP_MODULE_DECLARE(type) __declspec(dllexport) type __stdcall +#define AP_MODULE_DECLARE_NONSTD(type) __declspec(dllexport) type +#define AP_MODULE_DECLARE_DATA __declspec(dllexport) +#endif + +/** + * Declare a hook function + * @param ret The return type of the hook + * @param name The hook's name (as a literal) + * @param args The arguments the hook function takes, in brackets. + */ +#define AP_DECLARE_HOOK(ret,name,args) \ + APR_DECLARE_EXTERNAL_HOOK(ap,AP,ret,name,args) + +/** @internal */ +#define AP_IMPLEMENT_HOOK_BASE(name) \ + APR_IMPLEMENT_EXTERNAL_HOOK_BASE(ap,AP,name) + +/** + * Implement an Apache core hook that has no return code, and + * therefore runs all of the registered functions. The implementation + * is called ap_run_name. + * + * @param name The name of the hook + * @param args_decl The declaration of the arguments for the hook, for example + * "(int x,void *y)" + * @param args_use The arguments for the hook as used in a call, for example + * "(x,y)" + * @note If IMPLEMENTing a hook that is not linked into the Apache core, + * (e.g. within a dso) see APR_IMPLEMENT_EXTERNAL_HOOK_VOID. + */ +#define AP_IMPLEMENT_HOOK_VOID(name,args_decl,args_use) \ + APR_IMPLEMENT_EXTERNAL_HOOK_VOID(ap,AP,name,args_decl,args_use) + +/** + * Implement an Apache core hook that runs until one of the functions + * returns something other than ok or decline. That return value is + * then returned from the hook runner. If the hooks run to completion, + * then ok is returned. Note that if no hook runs it would probably be + * more correct to return decline, but this currently does not do + * so. The implementation is called ap_run_name. + * + * @param ret The return type of the hook (and the hook runner) + * @param name The name of the hook + * @param args_decl The declaration of the arguments for the hook, for example + * "(int x,void *y)" + * @param args_use The arguments for the hook as used in a call, for example + * "(x,y)" + * @param ok The "ok" return value + * @param decline The "decline" return value + * @return ok, decline or an error. + * @note If IMPLEMENTing a hook that is not linked into the Apache core, + * (e.g. within a dso) see APR_IMPLEMENT_EXTERNAL_HOOK_RUN_ALL. + */ +#define AP_IMPLEMENT_HOOK_RUN_ALL(ret,name,args_decl,args_use,ok,decline) \ + APR_IMPLEMENT_EXTERNAL_HOOK_RUN_ALL(ap,AP,ret,name,args_decl, \ + args_use,ok,decline) + +/** + * Implement a hook that runs until a function returns something other than + * decline. If all functions return decline, the hook runner returns decline. + * The implementation is called ap_run_name. + * + * @param ret The return type of the hook (and the hook runner) + * @param name The name of the hook + * @param args_decl The declaration of the arguments for the hook, for example + * "(int x,void *y)" + * @param args_use The arguments for the hook as used in a call, for example + * "(x,y)" + * @param decline The "decline" return value + * @return decline or an error. + * @note If IMPLEMENTing a hook that is not linked into the Apache core + * (e.g. within a dso) see APR_IMPLEMENT_EXTERNAL_HOOK_RUN_FIRST. + */ +#define AP_IMPLEMENT_HOOK_RUN_FIRST(ret,name,args_decl,args_use,decline) \ + APR_IMPLEMENT_EXTERNAL_HOOK_RUN_FIRST(ap,AP,ret,name,args_decl, \ + args_use,decline) + +/* Note that the other optional hook implementations are straightforward but + * have not yet been needed + */ + +/** + * Implement an optional hook. This is exactly the same as a standard hook + * implementation, except the hook is optional. + * @see AP_IMPLEMENT_HOOK_RUN_ALL + */ +#define AP_IMPLEMENT_OPTIONAL_HOOK_RUN_ALL(ret,name,args_decl,args_use,ok, \ + decline) \ + APR_IMPLEMENT_OPTIONAL_HOOK_RUN_ALL(ap,AP,ret,name,args_decl, \ + args_use,ok,decline) + +/** + * Hook an optional hook. Unlike static hooks, this uses a macro instead of a + * function. + */ +#define AP_OPTIONAL_HOOK(name,fn,pre,succ,order) \ + APR_OPTIONAL_HOOK(ap,name,fn,pre,succ,order) + +#include "os.h" +#if !defined(WIN32) && !defined(NETWARE) +#include "ap_config_auto.h" +#include "ap_config_layout.h" +#endif +#if defined(NETWARE) +#define AP_NONBLOCK_WHEN_MULTI_LISTEN 1 +#endif + +/* TODO - We need to put OS detection back to make all the following work */ + +#if defined(SUNOS4) || defined(IRIX) || defined(NEXT) || defined(AUX3) \ + || defined (UW) || defined(LYNXOS) || defined(TPF) +/* These systems don't do well with any lingering close code; I don't know + * why -- manoj */ +#define NO_LINGCLOSE +#endif + +/* If APR has OTHER_CHILD logic, use reliable piped logs. */ +#if APR_HAS_OTHER_CHILD +#define AP_HAVE_RELIABLE_PIPED_LOGS TRUE +#endif + +#if APR_CHARSET_EBCDIC && !defined(APACHE_XLATE) +#define APACHE_XLATE +#endif + +#endif /* AP_CONFIG_H */ diff --git a/rubbos/app/httpd-2.0.64/include/ap_config_auto.h b/rubbos/app/httpd-2.0.64/include/ap_config_auto.h new file mode 100644 index 00000000..701a99e1 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/include/ap_config_auto.h @@ -0,0 +1,250 @@ +/* include/ap_config_auto.h. Generated from ap_config_auto.h.in by configure. */ +/* include/ap_config_auto.h.in. Generated from configure.in by autoheader. */ +/* Define this if struct tm has a field tm_gmtoff */ +#define HAVE_GMTOFF 1 + +/* Define if building universal (internal helper macro) */ +/* #undef AC_APPLE_UNIVERSAL_BUILD */ + +/* Location of the source for the current MPM */ +#define APACHE_MPM_DIR "server/mpm/worker" + +/* SuExec root directory */ +/* #undef AP_DOC_ROOT */ + +/* Allow modules to run hook after a fatal exception */ +/* #undef AP_ENABLE_EXCEPTION_HOOK */ + +/* Allow IPv4 connections on IPv6 listening sockets */ +#define AP_ENABLE_V4_MAPPED 1 + +/* Minimum allowed GID */ +/* #undef AP_GID_MIN */ + +/* User allowed to call SuExec */ +/* #undef AP_HTTPD_USER */ + +/* SuExec log file */ +/* #undef AP_LOG_EXEC */ + +/* Listening sockets are non-blocking when there are more than 1 */ +#define AP_NONBLOCK_WHEN_MULTI_LISTEN 1 + +/* safe shell path for SuExec */ +/* #undef AP_SAFE_PATH */ + +/* Signal used to gracefully restart */ +#define AP_SIG_GRACEFUL SIGUSR1 + +/* Signal used to gracefully restart (without SIG prefix) */ +#define AP_SIG_GRACEFUL_SHORT USR1 + +/* Signal used to gracefully restart (as a quoted string) */ +#define AP_SIG_GRACEFUL_STRING "SIGUSR1" + +/* umask for suexec'd process */ +/* #undef AP_SUEXEC_UMASK */ + +/* Location of the MIME types config file, relative to the Apache root + directory */ +#define AP_TYPES_CONFIG_FILE "conf/mime.types" + +/* Minimum allowed UID */ +/* #undef AP_UID_MIN */ + +/* byte order is unknown due to cross-compilation */ +/* #undef AP_UNKNOWN_BYTE_ORDER */ + +/* User subdirectory */ +/* #undef AP_USERDIR_SUFFIX */ + +/* Using autoconf to configure Apache */ +#define AP_USING_AUTOCONF 1 + +/* Define to 1 if you have the `bindprocessor' function. */ +/* #undef HAVE_BINDPROCESSOR */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_BSTRING_H */ + +/* Define to 1 if you have the `getgrnam' function. */ +#define HAVE_GETGRNAM 1 + +/* Define to 1 if you have the `getpwnam' function. */ +#define HAVE_GETPWNAM 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_GRP_H 1 + +/* Define to 1 if you have the `initgroups' function. */ +#define HAVE_INITGROUPS 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define to 1 if you have the `killpg' function. */ +#define HAVE_KILLPG 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_LIMITS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the `prctl' function. */ +#define HAVE_PRCTL 1 + +/* Define to 1 if you have the `pthread_kill' function. */ +#define HAVE_PTHREAD_KILL 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_PWD_H 1 + +/* Define to 1 if you have the `setsid' function. */ +#define HAVE_SETSID 1 + +/* Define to 1 if you have the `SSL_set_cert_store' function. */ +/* #undef HAVE_SSL_SET_CERT_STORE */ + +/* Define to 1 if you have the `SSL_set_state' function. */ +/* #undef HAVE_SSL_SET_STATE */ + +/* Define to 1 if you have the header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the `syslog' function. */ +#define HAVE_SYSLOG 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_IPC_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_PRCTL_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_PROCESSOR_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_RESOURCE_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_SEM_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_SOCKET_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TIMES_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TIME_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have that is POSIX.1 compatible. */ +#define HAVE_SYS_WAIT_H 1 + +/* Define to 1 if you have the `timegm' function. */ +#define HAVE_TIMEGM 1 + +/* Define to 1 if you have the `times' function. */ +#define HAVE_TIMES 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_ZUTIL_H */ + +/* Root directory of the Apache install area */ +#define HTTPD_ROOT "/bottlenecks/rubbos/app/apache2" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "" + +/* Location of the config file, relative to the Apache root directory */ +#define SERVER_CONFIG_FILE "conf/httpd.conf" + +/* This platform doesn't suffer from the thundering herd problem */ +/* #undef SINGLE_LISTEN_UNSERIALIZED_ACCEPT */ + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Path to suexec binary */ +/* #undef SUEXEC_BIN */ + +/* Enable extensions on AIX 3, Interix. */ +#ifndef _ALL_SOURCE +# define _ALL_SOURCE 1 +#endif +/* Enable GNU extensions on systems that have them. */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif +/* Enable threading extensions on Solaris. */ +#ifndef _POSIX_PTHREAD_SEMANTICS +# define _POSIX_PTHREAD_SEMANTICS 1 +#endif +/* Enable extensions on HP NonStop. */ +#ifndef _TANDEM_SOURCE +# define _TANDEM_SOURCE 1 +#endif +/* Enable general extensions on Solaris. */ +#ifndef __EXTENSIONS__ +# define __EXTENSIONS__ 1 +#endif + + +/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most + significant byte first (like Motorola and SPARC, unlike Intel). */ +#if defined AC_APPLE_UNIVERSAL_BUILD +# if defined __BIG_ENDIAN__ +# define WORDS_BIGENDIAN 1 +# endif +#else +# ifndef WORDS_BIGENDIAN +/* # undef WORDS_BIGENDIAN */ +# endif +#endif + +/* Define to 1 if on MINIX. */ +/* #undef _MINIX */ + +/* Define to 2 if the system does not provide POSIX.1 features except with + this defined. */ +/* #undef _POSIX_1_SOURCE */ + +/* Define to 1 if you need to in order for `stat' and other things to work. */ +/* #undef _POSIX_SOURCE */ + +/* Define to empty if `const' does not conform to ANSI C. */ +/* #undef const */ + +/* Define to 'int' if doesn't define it for us */ +/* #undef rlim_t */ diff --git a/rubbos/app/httpd-2.0.64/include/ap_config_auto.h.in b/rubbos/app/httpd-2.0.64/include/ap_config_auto.h.in new file mode 100644 index 00000000..0b069a29 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/include/ap_config_auto.h.in @@ -0,0 +1,249 @@ +/* include/ap_config_auto.h.in. Generated from configure.in by autoheader. */ +/* Define this if struct tm has a field tm_gmtoff */ +#undef HAVE_GMTOFF + +/* Define if building universal (internal helper macro) */ +#undef AC_APPLE_UNIVERSAL_BUILD + +/* Location of the source for the current MPM */ +#undef APACHE_MPM_DIR + +/* SuExec root directory */ +#undef AP_DOC_ROOT + +/* Allow modules to run hook after a fatal exception */ +#undef AP_ENABLE_EXCEPTION_HOOK + +/* Allow IPv4 connections on IPv6 listening sockets */ +#undef AP_ENABLE_V4_MAPPED + +/* Minimum allowed GID */ +#undef AP_GID_MIN + +/* User allowed to call SuExec */ +#undef AP_HTTPD_USER + +/* SuExec log file */ +#undef AP_LOG_EXEC + +/* Listening sockets are non-blocking when there are more than 1 */ +#undef AP_NONBLOCK_WHEN_MULTI_LISTEN + +/* safe shell path for SuExec */ +#undef AP_SAFE_PATH + +/* Signal used to gracefully restart */ +#undef AP_SIG_GRACEFUL + +/* Signal used to gracefully restart (without SIG prefix) */ +#undef AP_SIG_GRACEFUL_SHORT + +/* Signal used to gracefully restart (as a quoted string) */ +#undef AP_SIG_GRACEFUL_STRING + +/* umask for suexec'd process */ +#undef AP_SUEXEC_UMASK + +/* Location of the MIME types config file, relative to the Apache root + directory */ +#undef AP_TYPES_CONFIG_FILE + +/* Minimum allowed UID */ +#undef AP_UID_MIN + +/* byte order is unknown due to cross-compilation */ +#undef AP_UNKNOWN_BYTE_ORDER + +/* User subdirectory */ +#undef AP_USERDIR_SUFFIX + +/* Using autoconf to configure Apache */ +#undef AP_USING_AUTOCONF + +/* Define to 1 if you have the `bindprocessor' function. */ +#undef HAVE_BINDPROCESSOR + +/* Define to 1 if you have the header file. */ +#undef HAVE_BSTRING_H + +/* Define to 1 if you have the `getgrnam' function. */ +#undef HAVE_GETGRNAM + +/* Define to 1 if you have the `getpwnam' function. */ +#undef HAVE_GETPWNAM + +/* Define to 1 if you have the header file. */ +#undef HAVE_GRP_H + +/* Define to 1 if you have the `initgroups' function. */ +#undef HAVE_INITGROUPS + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the `killpg' function. */ +#undef HAVE_KILLPG + +/* Define to 1 if you have the header file. */ +#undef HAVE_LIMITS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the `prctl' function. */ +#undef HAVE_PRCTL + +/* Define to 1 if you have the `pthread_kill' function. */ +#undef HAVE_PTHREAD_KILL + +/* Define to 1 if you have the header file. */ +#undef HAVE_PWD_H + +/* Define to 1 if you have the `setsid' function. */ +#undef HAVE_SETSID + +/* Define to 1 if you have the `SSL_set_cert_store' function. */ +#undef HAVE_SSL_SET_CERT_STORE + +/* Define to 1 if you have the `SSL_set_state' function. */ +#undef HAVE_SSL_SET_STATE + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the `syslog' function. */ +#undef HAVE_SYSLOG + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_IPC_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_PRCTL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_PROCESSOR_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_RESOURCE_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SEM_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SOCKET_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TIMES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TIME_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have that is POSIX.1 compatible. */ +#undef HAVE_SYS_WAIT_H + +/* Define to 1 if you have the `timegm' function. */ +#undef HAVE_TIMEGM + +/* Define to 1 if you have the `times' function. */ +#undef HAVE_TIMES + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_ZUTIL_H + +/* Root directory of the Apache install area */ +#undef HTTPD_ROOT + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* Location of the config file, relative to the Apache root directory */ +#undef SERVER_CONFIG_FILE + +/* This platform doesn't suffer from the thundering herd problem */ +#undef SINGLE_LISTEN_UNSERIALIZED_ACCEPT + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Path to suexec binary */ +#undef SUEXEC_BIN + +/* Enable extensions on AIX 3, Interix. */ +#ifndef _ALL_SOURCE +# undef _ALL_SOURCE +#endif +/* Enable GNU extensions on systems that have them. */ +#ifndef _GNU_SOURCE +# undef _GNU_SOURCE +#endif +/* Enable threading extensions on Solaris. */ +#ifndef _POSIX_PTHREAD_SEMANTICS +# undef _POSIX_PTHREAD_SEMANTICS +#endif +/* Enable extensions on HP NonStop. */ +#ifndef _TANDEM_SOURCE +# undef _TANDEM_SOURCE +#endif +/* Enable general extensions on Solaris. */ +#ifndef __EXTENSIONS__ +# undef __EXTENSIONS__ +#endif + + +/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most + significant byte first (like Motorola and SPARC, unlike Intel). */ +#if defined AC_APPLE_UNIVERSAL_BUILD +# if defined __BIG_ENDIAN__ +# define WORDS_BIGENDIAN 1 +# endif +#else +# ifndef WORDS_BIGENDIAN +# undef WORDS_BIGENDIAN +# endif +#endif + +/* Define to 1 if on MINIX. */ +#undef _MINIX + +/* Define to 2 if the system does not provide POSIX.1 features except with + this defined. */ +#undef _POSIX_1_SOURCE + +/* Define to 1 if you need to in order for `stat' and other things to work. */ +#undef _POSIX_SOURCE + +/* Define to empty if `const' does not conform to ANSI C. */ +#undef const + +/* Define to 'int' if doesn't define it for us */ +#undef rlim_t diff --git a/rubbos/app/httpd-2.0.64/include/ap_config_layout.h b/rubbos/app/httpd-2.0.64/include/ap_config_layout.h new file mode 100644 index 00000000..968d8f34 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/include/ap_config_layout.h @@ -0,0 +1,59 @@ +/* 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. + */ + +#ifndef AP_CONFIG_LAYOUT_H +#define AP_CONFIG_LAYOUT_H + +/* Configured Apache directory layout */ +#define DEFAULT_PREFIX "/bottlenecks/rubbos/app/apache2" +#define DEFAULT_EXP_EXEC_PREFIX "/bottlenecks/rubbos/app/apache2" +#define DEFAULT_REL_EXEC_PREFIX "" +#define DEFAULT_EXP_BINDIR "/bottlenecks/rubbos/app/apache2/bin" +#define DEFAULT_REL_BINDIR "bin" +#define DEFAULT_EXP_SBINDIR "/bottlenecks/rubbos/app/apache2/bin" +#define DEFAULT_REL_SBINDIR "bin" +#define DEFAULT_EXP_LIBEXECDIR "/bottlenecks/rubbos/app/apache2/modules" +#define DEFAULT_REL_LIBEXECDIR "modules" +#define DEFAULT_EXP_MANDIR "/bottlenecks/rubbos/app/apache2/man" +#define DEFAULT_REL_MANDIR "man" +#define DEFAULT_EXP_SYSCONFDIR "/bottlenecks/rubbos/app/apache2/conf" +#define DEFAULT_REL_SYSCONFDIR "conf" +#define DEFAULT_EXP_DATADIR "/bottlenecks/rubbos/app/apache2" +#define DEFAULT_REL_DATADIR "" +#define DEFAULT_EXP_INSTALLBUILDDIR "/bottlenecks/rubbos/app/apache2/build" +#define DEFAULT_REL_INSTALLBUILDDIR "build" +#define DEFAULT_EXP_ERRORDIR "/bottlenecks/rubbos/app/apache2/error" +#define DEFAULT_REL_ERRORDIR "error" +#define DEFAULT_EXP_ICONSDIR "/bottlenecks/rubbos/app/apache2/icons" +#define DEFAULT_REL_ICONSDIR "icons" +#define DEFAULT_EXP_HTDOCSDIR "/bottlenecks/rubbos/app/apache2/htdocs" +#define DEFAULT_REL_HTDOCSDIR "htdocs" +#define DEFAULT_EXP_MANUALDIR "/bottlenecks/rubbos/app/apache2/manual" +#define DEFAULT_REL_MANUALDIR "manual" +#define DEFAULT_EXP_CGIDIR "/bottlenecks/rubbos/app/apache2/cgi-bin" +#define DEFAULT_REL_CGIDIR "cgi-bin" +#define DEFAULT_EXP_INCLUDEDIR "/bottlenecks/rubbos/app/apache2/include" +#define DEFAULT_REL_INCLUDEDIR "include" +#define DEFAULT_EXP_LOCALSTATEDIR "/bottlenecks/rubbos/app/apache2" +#define DEFAULT_REL_LOCALSTATEDIR "" +#define DEFAULT_EXP_RUNTIMEDIR "/bottlenecks/rubbos/app/apache2/logs" +#define DEFAULT_REL_RUNTIMEDIR "logs" +#define DEFAULT_EXP_LOGFILEDIR "/bottlenecks/rubbos/app/apache2/logs" +#define DEFAULT_REL_LOGFILEDIR "logs" +#define DEFAULT_EXP_PROXYCACHEDIR "/bottlenecks/rubbos/app/apache2/proxy" +#define DEFAULT_REL_PROXYCACHEDIR "proxy" + +#endif /* AP_CONFIG_LAYOUT_H */ diff --git a/rubbos/app/httpd-2.0.64/include/ap_config_layout.h.in b/rubbos/app/httpd-2.0.64/include/ap_config_layout.h.in new file mode 100644 index 00000000..5f936a23 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/include/ap_config_layout.h.in @@ -0,0 +1,59 @@ +/* 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. + */ + +#ifndef AP_CONFIG_LAYOUT_H +#define AP_CONFIG_LAYOUT_H + +/* Configured Apache directory layout */ +#define DEFAULT_PREFIX "@prefix@" +#define DEFAULT_EXP_EXEC_PREFIX "@exp_exec_prefix@" +#define DEFAULT_REL_EXEC_PREFIX "@rel_exec_prefix@" +#define DEFAULT_EXP_BINDIR "@exp_bindir@" +#define DEFAULT_REL_BINDIR "@rel_bindir@" +#define DEFAULT_EXP_SBINDIR "@exp_sbindir@" +#define DEFAULT_REL_SBINDIR "@rel_sbindir@" +#define DEFAULT_EXP_LIBEXECDIR "@exp_libexecdir@" +#define DEFAULT_REL_LIBEXECDIR "@rel_libexecdir@" +#define DEFAULT_EXP_MANDIR "@exp_mandir@" +#define DEFAULT_REL_MANDIR "@rel_mandir@" +#define DEFAULT_EXP_SYSCONFDIR "@exp_sysconfdir@" +#define DEFAULT_REL_SYSCONFDIR "@rel_sysconfdir@" +#define DEFAULT_EXP_DATADIR "@exp_datadir@" +#define DEFAULT_REL_DATADIR "@rel_datadir@" +#define DEFAULT_EXP_INSTALLBUILDDIR "@exp_installbuilddir@" +#define DEFAULT_REL_INSTALLBUILDDIR "@rel_installbuilddir@" +#define DEFAULT_EXP_ERRORDIR "@exp_errordir@" +#define DEFAULT_REL_ERRORDIR "@rel_errordir@" +#define DEFAULT_EXP_ICONSDIR "@exp_iconsdir@" +#define DEFAULT_REL_ICONSDIR "@rel_iconsdir@" +#define DEFAULT_EXP_HTDOCSDIR "@exp_htdocsdir@" +#define DEFAULT_REL_HTDOCSDIR "@rel_htdocsdir@" +#define DEFAULT_EXP_MANUALDIR "@exp_manualdir@" +#define DEFAULT_REL_MANUALDIR "@rel_manualdir@" +#define DEFAULT_EXP_CGIDIR "@exp_cgidir@" +#define DEFAULT_REL_CGIDIR "@rel_cgidir@" +#define DEFAULT_EXP_INCLUDEDIR "@exp_includedir@" +#define DEFAULT_REL_INCLUDEDIR "@rel_includedir@" +#define DEFAULT_EXP_LOCALSTATEDIR "@exp_localstatedir@" +#define DEFAULT_REL_LOCALSTATEDIR "@rel_localstatedir@" +#define DEFAULT_EXP_RUNTIMEDIR "@exp_runtimedir@" +#define DEFAULT_REL_RUNTIMEDIR "@rel_runtimedir@" +#define DEFAULT_EXP_LOGFILEDIR "@exp_logfiledir@" +#define DEFAULT_REL_LOGFILEDIR "@rel_logfiledir@" +#define DEFAULT_EXP_PROXYCACHEDIR "@exp_proxycachedir@" +#define DEFAULT_REL_PROXYCACHEDIR "@rel_proxycachedir@" + +#endif /* AP_CONFIG_LAYOUT_H */ diff --git a/rubbos/app/httpd-2.0.64/include/ap_listen.h b/rubbos/app/httpd-2.0.64/include/ap_listen.h new file mode 100644 index 00000000..291b8266 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/include/ap_listen.h @@ -0,0 +1,119 @@ +/* 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. + */ + +#ifndef AP_LISTEN_H +#define AP_LISTEN_H + +#include "apr_network_io.h" +#include "httpd.h" +#include "http_config.h" + +/** + * @package Apache Listeners Library + */ + +typedef struct ap_listen_rec ap_listen_rec; +typedef apr_status_t (*accept_function)(void **csd, ap_listen_rec *lr, apr_pool_t *ptrans); + +/** + * Apache's listeners record. These are used in the Multi-Processing Modules + * to setup all of the sockets for the MPM to listen to and accept on. + */ +struct ap_listen_rec { + /** + * The next listener in the list + */ + ap_listen_rec *next; + /** + * The actual socket + */ + apr_socket_t *sd; + /** + * The sockaddr the socket should bind to + */ + apr_sockaddr_t *bind_addr; + /** + * The accept function for this socket + */ + accept_function accept_func; + /** + * Is this socket currently active + */ + int active; +/* more stuff here, like which protocol is bound to the port */ +}; + +/** + * The global list of ap_listen_rec structures + */ +AP_DECLARE_DATA extern ap_listen_rec *ap_listeners; + +/** + * Setup all of the defaults for the listener list + */ +void ap_listen_pre_config(void); +#if !defined(SPMT_OS2_MPM) +/** + * Loop through the global ap_listen_rec list and create all of the required + * sockets. This executes the listen and bind on the sockets. + * @param s The global server_rec + * @return The number of open sockets. + * @warning This function is not available to Windows platforms, or the + * Prefork or SPMT_OS2 MPMs. + */ +int ap_setup_listeners(server_rec *s); +#endif +/* Split into two #if's to make the exports scripts easier. + */ +#if defined(SPMT_OS2_MPM) +/** + * Create and open a socket on the specified port. This includes listening + * and binding the socket. + * @param process The process record for the currently running server + * @param port The port to open a socket on. + * @return The number of open sockets + * @warning This function is only available to Windows platforms, or the + * Prefork or SPMT_OS2 MPMs. + */ +int ap_listen_open(process_rec *process, apr_port_t port); +#endif + +/* Although these functions are exported from libmain, they are not really + * public functions. These functions are actually called while parsing the + * config file, when one of the LISTEN_COMMANDS directives is read. These + * should not ever be called by external modules. ALL MPMs should include + * LISTEN_COMMANDS in their command_rec table so that these functions are + * called. + */ +const char *ap_set_listenbacklog(cmd_parms *cmd, void *dummy, const char *arg); +const char *ap_set_listener(cmd_parms *cmd, void *dummy, const char *ips); +const char *ap_set_send_buffer_size(cmd_parms *cmd, void *dummy, + const char *arg); +AP_DECLARE_NONSTD(const char *) ap_set_receive_buffer_size(cmd_parms *cmd, + void *dummy, + const char *arg); + +#define LISTEN_COMMANDS \ +AP_INIT_TAKE1("ListenBacklog", ap_set_listenbacklog, NULL, RSRC_CONF, \ + "Maximum length of the queue of pending connections, as used by listen(2)"), \ +AP_INIT_TAKE1("Listen", ap_set_listener, NULL, RSRC_CONF, \ + "A port number or a numeric IP address and a port number"), \ +AP_INIT_TAKE1("SendBufferSize", ap_set_send_buffer_size, NULL, RSRC_CONF, \ + "Send buffer size in bytes"), \ +AP_INIT_TAKE1("ReceiveBufferSize", ap_set_receive_buffer_size, NULL, \ + RSRC_CONF, "Receive buffer size in bytes") + +#endif diff --git a/rubbos/app/httpd-2.0.64/include/ap_mmn.h b/rubbos/app/httpd-2.0.64/include/ap_mmn.h new file mode 100644 index 00000000..a3704803 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/include/ap_mmn.h @@ -0,0 +1,127 @@ +/* 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. + */ + +#ifndef APACHE_AP_MMN_H +#define APACHE_AP_MMN_H + +/** + * @package Module Magic Number + */ + +/* + * MODULE_MAGIC_NUMBER_MAJOR + * Major API changes that could cause compatibility problems for older modules + * such as structure size changes. No binary compatibility is possible across + * a change in the major version. + * + * MODULE_MAGIC_NUMBER_MINOR + * Minor API changes that do not cause binary compatibility problems. + * Should be reset to 0 when upgrading MODULE_MAGIC_NUMBER_MAJOR. + * + * See the MODULE_MAGIC_AT_LEAST macro below for an example. + */ + +/* + * 20010224 (2.0.13-dev) MODULE_MAGIC_COOKIE reset to "AP20" + * 20010523 (2.0.19-dev) bump for scoreboard structure reordering + * 20010627 (2.0.19-dev) more API changes than I can count + * 20010726 (2.0.22-dev) more big API changes + * 20010808 (2.0.23-dev) dir d_is_absolute bit introduced, bucket changes, etc + * 20010825 (2.0.25-dev) removed d_is_absolute, introduced map_to_storage hook + * 20011002 (2.0.26-dev) removed 1.3-depreciated request_rec.content_language + * 20011127 (2.0.29-dev) bump for postconfig hook change, and removal of socket + * from connection record + * 20011212 (2.0.30-dev) bump for new used_path_info member of request_rec + * 20011218 (2.0.30-dev) bump for new sbh member of conn_rec, different + * declarations for scoreboard, new parameter to + * create_connection hook + * 20020102 (2.0.30-dev) bump for changed type of limit_req_body in + * core_dir_config + * 20020109 (2.0.31-dev) bump for changed shm and scoreboard declarations + * 20020111 (2.0.31-dev) bump for ETag fields added at end of cor_dir_config + * 20020114 (2.0.31-dev) mod_dav changed how it asks its provider to fulfill + * a GET request + * 20020118 (2.0.31-dev) Input filtering split of blocking and mode + * 20020127 (2.0.31-dev) bump for pre_mpm hook change + * 20020128 (2.0.31-dev) bump for pre_config hook change + * 20020218 (2.0.33-dev) bump for AddOutputFilterByType directive + * 20020220 (2.0.33-dev) bump for scoreboard.h structure change + * 20020302 (2.0.33-dev) bump for protocol_filter additions. + * 20020306 (2.0.34-dev) bump for filter type renames. + * 20020318 (2.0.34-dev) mod_dav's API for REPORT generation changed + * 20020319 (2.0.34-dev) M_INVALID changed, plus new M_* methods for RFC 3253 + * 20020327 (2.0.35-dev) Add parameter to quick_handler hook + * 20020329 (2.0.35-dev) bump for addition of freelists to bucket API + * 20020329.1 (2.0.36) minor bump for new arg to opt fn ap_cgi_build_command + * 20020506 (2.0.37-dev) Removed r->boundary in request_rec. + * 20020529 (2.0.37-dev) Standardized the names of some apr_pool_*_set funcs + * 20020602 (2.0.37-dev) Bucket API change (metadata buckets) + * 20020612 (2.0.38-dev) Changed server_rec->[keep_alive_]timeout to apr time + * 20020625 (2.0.40-dev) Changed conn_rec->keepalive to an enumeration + * 20020628 (2.0.40-dev) Added filter_init to filter registration functions + * 20020903 (2.0.41-dev) APR's error constants changed + * 20020903.2 (2.0.46-dev) add ap_escape_logitem + * 20020903.3 (2.0.46-dev) allow_encoded_slashes added to core_dir_config + * 20020903.4 (2.0.47-dev) add ap_is_recursion_limit_exceeded() + * 20020903.5 (2.0.49-dev) add ap_escape_errorlog_item() + * 20020903.6 (2.0.49-dev) add insert_error_filter hook + * 20020903.7 (2.0.49-dev) added XHTML Doctypes + * 20020903.8 (2.0.50-dev) export ap_set_sub_req_protocol and + * ap_finalize_sub_req_protocol on Win32 and NetWare + * 20020903.9 (2.0.51-dev) create pcommands and initialize arrays before + * calling ap_setup_prelinked_modules + * 20020903.10 (2.0.55-dev) add ap_log_cerror() + * 20020903.11 (2.0.55-dev) added trace_enable to core_server_config + * 20020903.12 (2.0.56-dev) added ap_get_server_revision / ap_version_t + * 20020903.13 (2.0.62-dev) Add *ftp_directory_charset to proxy_dir_conf + * 20020903.14 (2.0.64-dev) added ap_vhost_iterate_given_conn + */ + +#define MODULE_MAGIC_COOKIE 0x41503230UL /* "AP20" */ + +#ifndef MODULE_MAGIC_NUMBER_MAJOR +#define MODULE_MAGIC_NUMBER_MAJOR 20020903 +#endif +#define MODULE_MAGIC_NUMBER_MINOR 14 /* 0...n */ + +/** + * Determine if the server's current MODULE_MAGIC_NUMBER is at least a + * specified value. + *
    + * Useful for testing for features.
    + * For example, suppose you wish to use the apr_table_overlap
    + *    function.  You can do this:
    + * 
    + * #if AP_MODULE_MAGIC_AT_LEAST(19980812,2)
    + *     ... use apr_table_overlap()
    + * #else
    + *     ... alternative code which doesn't use apr_table_overlap()
    + * #endif
    + * 
    + * @param major The major module magic number + * @param minor The minor module magic number + * @deffunc AP_MODULE_MAGIC_AT_LEAST(int major, int minor) + */ +#define AP_MODULE_MAGIC_AT_LEAST(major,minor) \ + ((major) < MODULE_MAGIC_NUMBER_MAJOR \ + || ((major) == MODULE_MAGIC_NUMBER_MAJOR \ + && (minor) <= MODULE_MAGIC_NUMBER_MINOR)) + +/** @deprecated present for backwards compatibility */ +#define MODULE_MAGIC_NUMBER MODULE_MAGIC_NUMBER_MAJOR +#define MODULE_MAGIC_AT_LEAST old_broken_macro_we_hope_you_are_not_using + +#endif /* !APACHE_AP_MMN_H */ diff --git a/rubbos/app/httpd-2.0.64/include/ap_mpm.h b/rubbos/app/httpd-2.0.64/include/ap_mpm.h new file mode 100644 index 00000000..9e41e904 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/include/ap_mpm.h @@ -0,0 +1,176 @@ +/* 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. + */ + +#ifndef AP_MPM_H +#define AP_MPM_H + +#include "apr_thread_proc.h" + +/** + * @package Multi-Processing Module library + */ + +/* + The MPM, "multi-processing model" provides an abstraction of the + interface with the OS for distributing incoming connections to + threads/process for processing. http_main invokes the MPM, and + the MPM runs until a shutdown/restart has been indicated. + The MPM calls out to the apache core via the ap_process_connection + function when a connection arrives. + + The MPM may or may not be multithreaded. In the event that it is + multithreaded, at any instant it guarantees a 1:1 mapping of threads + ap_process_connection invocations. + + Note: In the future it will be possible for ap_process_connection + to return to the MPM prior to finishing the entire connection; and + the MPM will proceed with asynchronous handling for the connection; + in the future the MPM may call ap_process_connection again -- but + does not guarantee it will occur on the same thread as the first call. + + The MPM further guarantees that no asynchronous behaviour such as + longjmps and signals will interfere with the user code that is + invoked through ap_process_connection. The MPM may reserve some + signals for its use (i.e. SIGUSR1), but guarantees that these signals + are ignored when executing outside the MPM code itself. (This + allows broken user code that does not handle EINTR to function + properly.) + + The suggested server restart and stop behaviour will be "graceful". + However the MPM may choose to terminate processes when the user + requests a non-graceful restart/stop. When this occurs, the MPM kills + all threads with extreme prejudice, and destroys the pchild pool. + User cleanups registered in the pchild apr_pool_t will be invoked at + this point. (This can pose some complications, the user cleanups + are asynchronous behaviour not unlike longjmp/signal... but if the + admin is asking for a non-graceful shutdown, how much effort should + we put into doing it in a nice way?) + + unix/posix notes: + - The MPM does not set a SIGALRM handler, user code may use SIGALRM. + But the preferred method of handling timeouts is to use the + timeouts provided by the BUFF abstraction. + - The proper setting for SIGPIPE is SIG_IGN, if user code changes it + for any of their own processing, it must be restored to SIG_IGN + prior to executing or returning to any apache code. + TODO: add SIGPIPE debugging check somewhere to make sure it's SIG_IGN +*/ + +/** + * This is the function that MPMs must create. This function is responsible + * for controlling the parent and child processes. It will run until a + * restart/shutdown is indicated. + * @param pconf the configuration pool, reset before the config file is read + * @param plog the log pool, reset after the config file is read + * @param server_conf the global server config. + * @return 1 for shutdown 0 otherwise. + * @deffunc int ap_mpm_run(apr_pool_t *pconf, apr_pool_t *plog, server_rec *server_conf) + */ +AP_DECLARE(int) ap_mpm_run(apr_pool_t *pconf, apr_pool_t *plog, server_rec *server_conf); + +/** + * predicate indicating if a graceful stop has been requested ... + * used by the connection loop + * @return 1 if a graceful stop has been requested, 0 otherwise + * @deffunc int ap_graceful_stop_signalled(*void) + */ +AP_DECLARE(int) ap_graceful_stop_signalled(void); + +/** + * Spawn a process with privileges that another module has requested + * @param r The request_rec of the current request + * @param newproc The resulting process handle. + * @param progname The program to run + * @param const_args the arguments to pass to the new program. The first + * one should be the program name. + * @param env The new environment apr_table_t for the new process. This + * should be a list of NULL-terminated strings. + * @param attr the procattr we should use to determine how to create the new + * process + * @param p The pool to use. + */ +AP_DECLARE(apr_status_t) ap_os_create_privileged_process( + const request_rec *r, + apr_proc_t *newproc, + const char *progname, + const char * const *args, + const char * const *env, + apr_procattr_t *attr, + apr_pool_t *p); + +/* Subtypes/Values for AP_MPMQ_IS_THREADED and AP_MPMQ_IS_FORKED */ +#define AP_MPMQ_NOT_SUPPORTED 0 /* This value specifies whether */ + /* an MPM is capable of */ + /* threading or forking. */ +#define AP_MPMQ_STATIC 1 /* This value specifies whether */ + /* an MPM is using a static # */ + /* threads or daemons. */ +#define AP_MPMQ_DYNAMIC 2 /* This value specifies whether */ + /* an MPM is using a dynamic # */ + /* threads or daemons. */ + +/* Values returned for AP_MPMQ_MPM_STATE */ +#define AP_MPMQ_STARTING 0 +#define AP_MPMQ_RUNNING 1 +#define AP_MPMQ_STOPPING 2 + +#define AP_MPMQ_MAX_DAEMON_USED 1 /* Max # of daemons used so far */ +#define AP_MPMQ_IS_THREADED 2 /* MPM can do threading */ +#define AP_MPMQ_IS_FORKED 3 /* MPM can do forking */ +#define AP_MPMQ_HARD_LIMIT_DAEMONS 4 /* The compiled max # daemons */ +#define AP_MPMQ_HARD_LIMIT_THREADS 5 /* The compiled max # threads */ +#define AP_MPMQ_MAX_THREADS 6 /* # of threads/child by config */ +#define AP_MPMQ_MIN_SPARE_DAEMONS 7 /* Min # of spare daemons */ +#define AP_MPMQ_MIN_SPARE_THREADS 8 /* Min # of spare threads */ +#define AP_MPMQ_MAX_SPARE_DAEMONS 9 /* Max # of spare daemons */ +#define AP_MPMQ_MAX_SPARE_THREADS 10 /* Max # of spare threads */ +#define AP_MPMQ_MAX_REQUESTS_DAEMON 11 /* Max # of requests per daemon */ +#define AP_MPMQ_MAX_DAEMONS 12 /* Max # of daemons by config */ +#define AP_MPMQ_MPM_STATE 13 /* starting, running, stopping */ + +/** + * Query a property of the current MPM. + * @param query_code One of APM_MPMQ_* + * @param result A location to place the result of the query + * @return APR_SUCCESS or APR_ENOTIMPL + * @deffunc int ap_mpm_query(int query_code, int *result) + */ +AP_DECLARE(apr_status_t) ap_mpm_query(int query_code, int *result); + +/* Defining GPROF when compiling uses the moncontrol() function to + * disable gprof profiling in the parent, and enable it only for + * request processing in children (or in one_process mode). It's + * absolutely required to get useful gprof results under linux + * because the profile itimers and such are disabled across a + * fork(). It's probably useful elsewhere as well. + */ +#ifdef GPROF +extern void moncontrol(int); +#define AP_MONCONTROL(x) moncontrol(x) +#else +#define AP_MONCONTROL(x) +#endif + +#if AP_ENABLE_EXCEPTION_HOOK +typedef struct ap_exception_info_t { + int sig; + pid_t pid; +} ap_exception_info_t; + +AP_DECLARE_HOOK(int,fatal_exception,(ap_exception_info_t *ei)) +#endif /*AP_ENABLE_EXCEPTION_HOOK*/ + +#endif diff --git a/rubbos/app/httpd-2.0.64/include/ap_provider.h b/rubbos/app/httpd-2.0.64/include/ap_provider.h new file mode 100644 index 00000000..e9045bae --- /dev/null +++ b/rubbos/app/httpd-2.0.64/include/ap_provider.h @@ -0,0 +1,54 @@ +/* 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. + */ + +#ifndef AP_PROVIDER_H +#define AP_PROVIDER_H + +#include "ap_config.h" + +/** + * @package Provider API + */ + +/** + * This function is used to register a provider with the global + * provider pool. + * @param pool The pool to create any storage from + * @param provider_group The group to store the provider in + * @param provider_name The name for this provider + * @param provider_version The version for this provider + * @param provider Opaque structure for this provider + * @return APR_SUCCESS if all went well + */ +AP_DECLARE(apr_status_t) ap_register_provider(apr_pool_t *pool, + const char *provider_group, + const char *provider_name, + const char *provider_version, + const void *provider); + +/** + * This function is used to retrieve a provider from the global + * provider pool. + * @param provider_group The group to look for this provider in + * @param provider_name The name for the provider + * @param provider_version The version for the provider + * @return provider pointer to provider if found, NULL otherwise + */ +AP_DECLARE(void *) ap_lookup_provider(const char *provider_group, + const char *provider_name, + const char *provider_version); + +#endif diff --git a/rubbos/app/httpd-2.0.64/include/ap_regkey.h b/rubbos/app/httpd-2.0.64/include/ap_regkey.h new file mode 100644 index 00000000..d3f41297 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/include/ap_regkey.h @@ -0,0 +1,218 @@ +/* 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. + */ + +#ifndef AP_REGKEY_H +#define AP_REGKEY_H + +#if defined(WIN32) || defined(DOXYGEN) + +#include "apr.h" +#include "apr_pools.h" +#include "ap_config.h" /* Just for AP_DECLARE */ + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct ap_regkey_t ap_regkey_t; + +/* Used to recover AP_REGKEY_* constants + */ +AP_DECLARE(const ap_regkey_t *) ap_regkey_const(int i); + +/** + * @file ap_regkey.h + * @brief APR-style Win32 Registry Manipulation + */ + +/** + * Win32 Only: Constants for ap_regkey_open() + */ +#define AP_REGKEY_CLASSES_ROOT ap_regkey_const(0) +#define AP_REGKEY_CURRENT_CONFIG ap_regkey_const(1) +#define AP_REGKEY_CURRENT_USER ap_regkey_const(2) +#define AP_REGKEY_LOCAL_MACHINE ap_regkey_const(3) +#define AP_REGKEY_USERS ap_regkey_const(4) +#define AP_REGKEY_PERFORMANCE_DATA ap_regkey_const(5) +#define AP_REGKEY_DYN_DATA ap_regkey_const(6) + +/** + * Win32 Only: Flags for ap_regkey_value_set() + */ +#define AP_REGKEY_EXPAND 0x0001 + +/** + * Win32 Only: Open the specified registry key. + * @param newkey The opened registry key + * @param parentkey The open registry key of the parent, or one of + *
    + *           AP_REGKEY_CLASSES_ROOT
    + *           AP_REGKEY_CURRENT_CONFIG
    + *           AP_REGKEY_CURRENT_USER
    + *           AP_REGKEY_LOCAL_MACHINE
    + *           AP_REGKEY_USERS
    + *           AP_REGKEY_PERFORMANCE_DATA 
    + *           AP_REGKEY_DYN_DATA 
    + * 
    + * @param keyname The path of the key relative to the parent key + * @param flags Or'ed value of: + *
    + *           APR_READ             open key for reading
    + *           APR_WRITE            open key for writing
    + *           APR_CREATE           create the key if it doesn't exist
    + *           APR_EXCL             return error if APR_CREATE and key exists
    + * 
    + * @param pool The pool in which newkey is allocated + */ +AP_DECLARE(apr_status_t) ap_regkey_open(ap_regkey_t **newkey, + const ap_regkey_t *parentkey, + const char *keyname, + apr_int32_t flags, + apr_pool_t *pool); + +/** + * Win32 Only: Close the registry key opened or created by ap_regkey_open(). + * @param key The registry key to close + */ +AP_DECLARE(apr_status_t) ap_regkey_close(ap_regkey_t *key); + +/** + * Win32 Only: Remove the given registry key. + * @param parentkey The open registry key of the parent, or one of + *
    + *           AP_REGKEY_CLASSES_ROOT
    + *           AP_REGKEY_CURRENT_CONFIG
    + *           AP_REGKEY_CURRENT_USER
    + *           AP_REGKEY_LOCAL_MACHINE
    + *           AP_REGKEY_USERS
    + *           AP_REGKEY_PERFORMANCE_DATA 
    + *           AP_REGKEY_DYN_DATA 
    + * 
    + * @param keyname The path of the key relative to the parent key + * @param pool The pool used for temp allocations + * @remark ap_regkey_remove() is not recursive, although it removes + * all values within the given keyname, it will not remove a key + * containing subkeys. + */ +AP_DECLARE(apr_status_t) ap_regkey_remove(const ap_regkey_t *parent, + const char *keyname, + apr_pool_t *pool); + +/** + * Win32 Only: Retrieve a registry value string from an open key. + * @param result The string value retrieved + * @param key The registry key to retrieve the value from + * @param valuename The named value to retrieve (pass "" for the default) + * @param pool The pool used to store the result + * @remark There is no toggle to prevent environment variable expansion + * if the registry value is set with AP_REG_EXPAND (REG_EXPAND_SZ), such + * expansions are always performed. + */ +AP_DECLARE(apr_status_t) ap_regkey_value_get(char **result, + ap_regkey_t *key, + const char *valuename, + apr_pool_t *pool); + +/** + * Win32 Only: Store a registry value string into an open key. + * @param key The registry key to store the value into + * @param valuename The named value to store (pass "" for the default) + * @param value The string to store for the named value + * @param flags The option AP_REGKEY_EXPAND or 0, where AP_REGKEY_EXPAND + * values will find all %foo% variables expanded from the environment. + * @param pool The pool used for temp allocations + */ +AP_DECLARE(apr_status_t) ap_regkey_value_set(ap_regkey_t *key, + const char *valuename, + const char *value, + apr_int32_t flags, + apr_pool_t *pool); + +/** + * Win32 Only: Retrieve a raw byte value from an open key. + * @param result The raw bytes value retrieved + * @param resultsize Pointer to a variable to store the number raw bytes retrieved + * @param key The registry key to retrieve the value from + * @param valuename The named value to retrieve (pass "" for the default) + * @param pool The pool used to store the result + */ +AP_DECLARE(apr_status_t) ap_regkey_value_raw_get(void **result, + apr_size_t *resultsize, + apr_int32_t *resulttype, + ap_regkey_t *key, + const char *valuename, + apr_pool_t *pool); + +/** + * Win32 Only: Store a raw bytes value into an open key. + * @param key The registry key to store the value into + * @param valuename The named value to store (pass "" for the default) + * @param value The bytes to store for the named value + * @param valuesize The number of bytes for value + * @param valuetype The + * values will find all %foo% variables expanded from the environment. + * @param pool The pool used for temp allocations + */ +AP_DECLARE(apr_status_t) ap_regkey_value_raw_set(ap_regkey_t *key, + const char *valuename, + const void *value, + apr_size_t valuesize, + apr_int32_t valuetype, + apr_pool_t *pool); + +/** + * Win32 Only: Retrieve a registry value string from an open key. + * @param result The string elements retrieved from a REG_MULTI_SZ string array + * @param key The registry key to retrieve the value from + * @param valuename The named value to retrieve (pass "" for the default) + * @param pool The pool used to store the result + */ +AP_DECLARE(apr_status_t) ap_regkey_value_array_get(apr_array_header_t **result, + ap_regkey_t *key, + const char *valuename, + apr_pool_t *pool); + +/** + * Win32 Only: Store a registry value string array into an open key. + * @param key The registry key to store the value into + * @param valuename The named value to store (pass "" for the default) + * @param nelts The string elements to store in a REG_MULTI_SZ string array + * @param elts The number of elements in the elts string array + * @param pool The pool used for temp allocations + */ +AP_DECLARE(apr_status_t) ap_regkey_value_array_set(ap_regkey_t *key, + const char *valuename, + int nelts, + const char * const * elts, + apr_pool_t *pool); + +/** + * Win32 Only: Remove a registry value from an open key. + * @param key The registry key to remove the value from + * @param valuename The named value to remove (pass "" for the default) + * @param pool The pool used for temp allocations + */ +AP_DECLARE(apr_status_t) ap_regkey_value_remove(const ap_regkey_t *key, + const char *valuename, + apr_pool_t *pool); + +#ifdef __cplusplus +} +#endif + +#endif /* def WIN32 || def DOXYGEN */ + +#endif /* AP_REGKEY_H */ diff --git a/rubbos/app/httpd-2.0.64/include/ap_release.h b/rubbos/app/httpd-2.0.64/include/ap_release.h new file mode 100644 index 00000000..9fee3f4f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/include/ap_release.h @@ -0,0 +1,56 @@ +/* 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. + */ + +#ifndef AP_RELEASE_H +#define AP_RELEASE_H + +#include "apr_general.h" /* stringify */ + +#define AP_SERVER_COPYRIGHT \ + "Copyright 2009 The Apache Software Foundation." + +/* + * The below defines the base string of the Server: header. Additional + * tokens can be added via the ap_add_version_component() API call. + * + * The tokens are listed in order of their significance for identifying the + * application. + * + * "Product tokens should be short and to the point -- use of them for + * advertizing or other non-essential information is explicitly forbidden." + * + * Example: "Apache/1.1.0 MrWidget/0.1-alpha" + */ +#define AP_SERVER_BASEVENDOR "Apache Software Foundation" +#define AP_SERVER_BASEPRODUCT "Apache" + +#define AP_SERVER_MAJORVERSION_NUMBER 2 +#define AP_SERVER_MINORVERSION_NUMBER 0 +#define AP_SERVER_PATCHLEVEL_NUMBER 64 +#define AP_SERVER_ADD_STRING "" + +/* keep old macros as well */ +#define AP_SERVER_MAJORVERSION APR_STRINGIFY(AP_SERVER_MAJORVERSION_NUMBER) +#define AP_SERVER_MINORVERSION APR_STRINGIFY(AP_SERVER_MINORVERSION_NUMBER) +#define AP_SERVER_PATCHLEVEL APR_STRINGIFY(AP_SERVER_PATCHLEVEL_NUMBER) \ + AP_SERVER_ADD_STRING + +#define AP_SERVER_MINORREVISION AP_SERVER_MAJORVERSION "." AP_SERVER_MINORVERSION +#define AP_SERVER_BASEREVISION AP_SERVER_MINORREVISION "." AP_SERVER_PATCHLEVEL +#define AP_SERVER_BASEVERSION AP_SERVER_BASEPRODUCT "/" AP_SERVER_BASEREVISION +#define AP_SERVER_VERSION AP_SERVER_BASEVERSION + +#endif diff --git a/rubbos/app/httpd-2.0.64/include/http_config.h b/rubbos/app/httpd-2.0.64/include/http_config.h new file mode 100644 index 00000000..783e44b4 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/include/http_config.h @@ -0,0 +1,1018 @@ +/* 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. + */ + +#ifndef APACHE_HTTP_CONFIG_H +#define APACHE_HTTP_CONFIG_H + +#include "apr_hooks.h" +#include "util_cfgtree.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @file http_config.h + * @brief Apache Configuration + */ + +/* + * The central data structures around here... + */ + +/* Command dispatch structures... */ + +/** + * How the directives arguments should be parsed. + * @remark Note that for all of these except RAW_ARGS, the config routine is + * passed a freshly allocated string which can be modified or stored + * or whatever... + */ +enum cmd_how { + RAW_ARGS, /**< cmd_func parses command line itself */ + TAKE1, /**< one argument only */ + TAKE2, /**< two arguments only */ + ITERATE, /**< one argument, occuring multiple times + * (e.g., IndexIgnore) + */ + ITERATE2, /**< two arguments, 2nd occurs multiple times + * (e.g., AddIcon) + */ + FLAG, /**< One of 'On' or 'Off' */ + NO_ARGS, /**< No args at all, e.g. */ + TAKE12, /**< one or two arguments */ + TAKE3, /**< three arguments only */ + TAKE23, /**< two or three arguments */ + TAKE123, /**< one, two or three arguments */ + TAKE13 /**< one or three arguments */ +}; +/** + * This structure is passed to a command which is being invoked, + * to carry a large variety of miscellaneous data which is all of + * use to *somebody*... + */ +typedef struct cmd_parms_struct cmd_parms; + +#if defined(AP_HAVE_DESIGNATED_INITIALIZER) || defined(DOXYGEN) + +/** + * All the types of functions that can be used in directives + * @internal + */ +typedef union { + /** function to call for a no-args */ + const char *(*no_args) (cmd_parms *parms, void *mconfig); + /** function to call for a raw-args */ + const char *(*raw_args) (cmd_parms *parms, void *mconfig, + const char *args); + /** function to call for a take1 */ + const char *(*take1) (cmd_parms *parms, void *mconfig, const char *w); + /** function to call for a take2 */ + const char *(*take2) (cmd_parms *parms, void *mconfig, const char *w, + const char *w2); + /** function to call for a take3 */ + const char *(*take3) (cmd_parms *parms, void *mconfig, const char *w, + const char *w2, const char *w3); + /** function to call for a flag */ + const char *(*flag) (cmd_parms *parms, void *mconfig, int on); +} cmd_func; + +/** This configuration directive does not take any arguments */ +# define AP_NO_ARGS func.no_args +/** This configuration directive will handle it's own parsing of arguments*/ +# define AP_RAW_ARGS func.raw_args +/** This configuration directive takes 1 argument*/ +# define AP_TAKE1 func.take1 +/** This configuration directive takes 2 arguments */ +# define AP_TAKE2 func.take2 +/** This configuration directive takes 3 arguments */ +# define AP_TAKE3 func.take3 +/** This configuration directive takes a flag (on/off) as a argument*/ +# define AP_FLAG func.flag + +/** method of declaring a directive with no arguments */ +# define AP_INIT_NO_ARGS(directive, func, mconfig, where, help) \ + { directive, { .no_args=func }, mconfig, where, RAW_ARGS, help } +/** method of declaring a directive with raw argument parsing */ +# define AP_INIT_RAW_ARGS(directive, func, mconfig, where, help) \ + { directive, { .raw_args=func }, mconfig, where, RAW_ARGS, help } +/** method of declaring a directive which takes 1 argument */ +# define AP_INIT_TAKE1(directive, func, mconfig, where, help) \ + { directive, { .take1=func }, mconfig, where, TAKE1, help } +/** method of declaring a directive which takes multiple arguments */ +# define AP_INIT_ITERATE(directive, func, mconfig, where, help) \ + { directive, { .take1=func }, mconfig, where, ITERATE, help } +/** method of declaring a directive which takes 2 arguments */ +# define AP_INIT_TAKE2(directive, func, mconfig, where, help) \ + { directive, { .take2=func }, mconfig, where, TAKE2, help } +/** method of declaring a directive which takes 1 or 2 arguments */ +# define AP_INIT_TAKE12(directive, func, mconfig, where, help) \ + { directive, { .take2=func }, mconfig, where, TAKE12, help } +/** method of declaring a directive which takes multiple 2 arguments */ +# define AP_INIT_ITERATE2(directive, func, mconfig, where, help) \ + { directive, { .take2=func }, mconfig, where, ITERATE2, help } +/** method of declaring a directive which takes 1 or 3 arguments */ +# define AP_INIT_TAKE13(directive, func, mconfig, where, help) \ + { directive, { .take3=func }, mconfig, where, TAKE13, help } +/** method of declaring a directive which takes 2 or 3 arguments */ +# define AP_INIT_TAKE23(directive, func, mconfig, where, help) \ + { directive, { .take3=func }, mconfig, where, TAKE23, help } +/** method of declaring a directive which takes 1 to 3 arguments */ +# define AP_INIT_TAKE123(directive, func, mconfig, where, help) \ + { directive, { .take3=func }, mconfig, where, TAKE123, help } +/** method of declaring a directive which takes 3 arguments */ +# define AP_INIT_TAKE3(directive, func, mconfig, where, help) \ + { directive, { .take3=func }, mconfig, where, TAKE3, help } +/** method of declaring a directive which takes a flag (on/off) as a argument*/ +# define AP_INIT_FLAG(directive, func, mconfig, where, help) \ + { directive, { .flag=func }, mconfig, where, FLAG, help } + +#else /* AP_HAVE_DESIGNATED_INITIALIZER */ + +typedef const char *(*cmd_func) (); + +# define AP_NO_ARGS func +# define AP_RAW_ARGS func +# define AP_TAKE1 func +# define AP_TAKE2 func +# define AP_TAKE3 func +# define AP_FLAG func + +# define AP_INIT_NO_ARGS(directive, func, mconfig, where, help) \ + { directive, func, mconfig, where, RAW_ARGS, help } +# define AP_INIT_RAW_ARGS(directive, func, mconfig, where, help) \ + { directive, func, mconfig, where, RAW_ARGS, help } +# define AP_INIT_TAKE1(directive, func, mconfig, where, help) \ + { directive, func, mconfig, where, TAKE1, help } +# define AP_INIT_ITERATE(directive, func, mconfig, where, help) \ + { directive, func, mconfig, where, ITERATE, help } +# define AP_INIT_TAKE2(directive, func, mconfig, where, help) \ + { directive, func, mconfig, where, TAKE2, help } +# define AP_INIT_TAKE12(directive, func, mconfig, where, help) \ + { directive, func, mconfig, where, TAKE12, help } +# define AP_INIT_ITERATE2(directive, func, mconfig, where, help) \ + { directive, func, mconfig, where, ITERATE2, help } +# define AP_INIT_TAKE13(directive, func, mconfig, where, help) \ + { directive, func, mconfig, where, TAKE13, help } +# define AP_INIT_TAKE23(directive, func, mconfig, where, help) \ + { directive, func, mconfig, where, TAKE23, help } +# define AP_INIT_TAKE123(directive, func, mconfig, where, help) \ + { directive, func, mconfig, where, TAKE123, help } +# define AP_INIT_TAKE3(directive, func, mconfig, where, help) \ + { directive, func, mconfig, where, TAKE3, help } +# define AP_INIT_FLAG(directive, func, mconfig, where, help) \ + { directive, func, mconfig, where, FLAG, help } + +#endif /* AP_HAVE_DESIGNATED_INITIALIZER */ + +/** + * The command record structure. Each modules can define a table of these + * to define the directives it will implement. + */ +typedef struct command_struct command_rec; +struct command_struct { + /** Name of this command */ + const char *name; + /** The function to be called when this directive is parsed */ + cmd_func func; + /** Extra data, for functions which implement multiple commands... */ + void *cmd_data; + /** What overrides need to be allowed to enable this command. */ + int req_override; + /** What the command expects as arguments + * @defvar cmd_how args_how*/ + enum cmd_how args_how; + + /** 'usage' message, in case of syntax errors */ + const char *errmsg; +}; + +/** + * @defgroup ConfigDirectives Allowed locations for configuration directives. + * + * The allowed locations for a configuration directive are the union of + * those indicated by each set bit in the req_override mask. + * + * @{ + */ +#define OR_NONE 0 /**< *.conf is not available anywhere in this override */ +#define OR_LIMIT 1 /**< *.conf inside or + and .htaccess when AllowOverride Limit */ +#define OR_OPTIONS 2 /**< *.conf anywhere + and .htaccess when AllowOverride Options */ +#define OR_FILEINFO 4 /**< *.conf anywhere + and .htaccess when AllowOverride FileInfo */ +#define OR_AUTHCFG 8 /**< *.conf inside or + and .htaccess when AllowOverride AuthConfig */ +#define OR_INDEXES 16 /**< *.conf anywhere + and .htaccess when AllowOverride Indexes */ +#define OR_UNSET 32 /**< unset a directive (in Allow) */ +#define ACCESS_CONF 64 /**< *.conf inside or */ +#define RSRC_CONF 128 /**< *.conf outside or */ +#define EXEC_ON_READ 256 /**< force directive to execute a command + which would modify the configuration (like including another + file, or IFModule */ +/** this directive can be placed anywhere */ +#define OR_ALL (OR_LIMIT|OR_OPTIONS|OR_FILEINFO|OR_AUTHCFG|OR_INDEXES) + +/** @} */ + +/** + * This can be returned by a function if they don't wish to handle + * a command. Make it something not likely someone will actually use + * as an error code. + */ +#define DECLINE_CMD "\a\b" + +/** Common structure for reading of config files / passwd files etc. */ +typedef struct ap_configfile_t ap_configfile_t; +struct ap_configfile_t { + int (*getch) (void *param); /**< a getc()-like function */ + void *(*getstr) (void *buf, size_t bufsiz, void *param); + /**< a fgets()-like function */ + int (*close) (void *param); /**< a close handler function */ + void *param; /**< the argument passed to getch/getstr/close */ + const char *name; /**< the filename / description */ + unsigned line_number; /**< current line number, starting at 1 */ +}; + +/** + * This structure is passed to a command which is being invoked, + * to carry a large variety of miscellaneous data which is all of + * use to *somebody*... + */ +struct cmd_parms_struct { + /** Argument to command from cmd_table */ + void *info; + /** Which allow-override bits are set */ + int override; + /** Which methods are ed */ + apr_int64_t limited; + /** methods which are limited */ + apr_array_header_t *limited_xmethods; + /** methods which are xlimited */ + ap_method_list_t *xlimited; + + /** Config file structure. */ + ap_configfile_t *config_file; + /** the directive specifying this command */ + ap_directive_t *directive; + + /** Pool to allocate new storage in */ + apr_pool_t *pool; + /** Pool for scratch memory; persists during configuration, but + * wiped before the first request is served... */ + apr_pool_t *temp_pool; + /** Server_rec being configured for */ + server_rec *server; + /** If configuring for a directory, pathname of that directory. + * NOPE! That's what it meant previous to the existance of , + * and regex matching. Now the only usefulness that can be + * derived from this field is whether a command is being called in a + * server context (path == NULL) or being called in a dir context + * (path != NULL). */ + char *path; + /** configuration command */ + const command_rec *cmd; + + /** per_dir_config vector passed to handle_command */ + struct ap_conf_vector_t *context; + /** directive with syntax error */ + const ap_directive_t *err_directive; +}; + +/** + * Module structures. Just about everything is dispatched through + * these, directly or indirectly (through the command and handler + * tables). + */ +typedef struct module_struct module; +struct module_struct { + /** API version, *not* module version; check that module is + * compatible with this version of the server. + */ + int version; + /** API minor version. Provides API feature milestones. Not checked + * during module init */ + int minor_version; + /** Index to this modules structures in config vectors. */ + int module_index; + + /** The name of the module's C file */ + const char *name; + /** The handle for the DSO. Internal use only */ + void *dynamic_load_handle; + + /** A pointer to the next module in the list + * @defvar module_struct *next */ + struct module_struct *next; + + /** Magic Cookie to identify a module structure; It's mainly + * important for the DSO facility (see also mod_so). */ + unsigned long magic; + + /** Function to allow MPMs to re-write command line arguments. This + * hook is only available to MPMs. + * @param The process that the server is running in. + */ + void (*rewrite_args) (process_rec *process); + /** Function to allow all modules to create per directory configuration + * structures. + * @param p The pool to use for all allocations. + * @param dir The directory currently being processed. + * @return The per-directory structure created + */ + void *(*create_dir_config) (apr_pool_t *p, char *dir); + /** Function to allow all modules to merge the per directory configuration + * structures for two directories. + * @param p The pool to use for all allocations. + * @param base_conf The directory structure created for the parent directory. + * @param new_conf The directory structure currently being processed. + * @return The new per-directory structure created + */ + void *(*merge_dir_config) (apr_pool_t *p, void *base_conf, void *new_conf); + /** Function to allow all modules to create per server configuration + * structures. + * @param p The pool to use for all allocations. + * @param s The server currently being processed. + * @return The per-server structure created + */ + void *(*create_server_config) (apr_pool_t *p, server_rec *s); + /** Function to allow all modules to merge the per server configuration + * structures for two servers. + * @param p The pool to use for all allocations. + * @param base_conf The directory structure created for the parent directory. + * @param new_conf The directory structure currently being processed. + * @return The new per-directory structure created + */ + void *(*merge_server_config) (apr_pool_t *p, void *base_conf, + void *new_conf); + + /** A command_rec table that describes all of the directives this module + * defines. */ + const command_rec *cmds; + + /** A hook to allow modules to hook other points in the request processing. + * In this function, modules should call the ap_hook_*() functions to + * register an interest in a specific step in processing the current + * request. + * @param p the pool to use for all allocations + */ + void (*register_hooks) (apr_pool_t *p); +}; + +/** + * @defgroup ModuleInit Module structure initializers + * + * Initializer for the first few module slots, which are only + * really set up once we start running. Note that the first two slots + * provide a version check; this should allow us to deal with changes to + * the API. The major number should reflect changes to the API handler table + * itself or removal of functionality. The minor number should reflect + * additions of functionality to the existing API. (the server can detect + * an old-format module, and either handle it back-compatibly, or at least + * signal an error). See src/include/ap_mmn.h for MMN version history. + * @{ + */ + +/** The one used in Apache 1.3, which will deliberately cause an error */ +#define STANDARD_MODULE_STUFF this_module_needs_to_be_ported_to_apache_2_0 + +/** Use this in all standard modules */ +#define STANDARD20_MODULE_STUFF MODULE_MAGIC_NUMBER_MAJOR, \ + MODULE_MAGIC_NUMBER_MINOR, \ + -1, \ + __FILE__, \ + NULL, \ + NULL, \ + MODULE_MAGIC_COOKIE, \ + NULL /* rewrite args spot */ + +/** Use this only in MPMs */ +#define MPM20_MODULE_STUFF MODULE_MAGIC_NUMBER_MAJOR, \ + MODULE_MAGIC_NUMBER_MINOR, \ + -1, \ + __FILE__, \ + NULL, \ + NULL, \ + MODULE_MAGIC_COOKIE + +/** @} */ + +/* CONFIGURATION VECTOR FUNCTIONS */ + +/** configuration vector structure */ +typedef struct ap_conf_vector_t ap_conf_vector_t; + +/** + * Generic accessors for other modules to get at their own module-specific + * data + * @param conf_vector The vector in which the modules configuration is stored. + * usually r->per_dir_config or s->module_config + * @param m The module to get the data for. + * @return The module-specific data + */ +AP_DECLARE(void *) ap_get_module_config(const ap_conf_vector_t *cv, + const module *m); + +/** + * Generic accessors for other modules to set at their own module-specific + * data + * @param conf_vector The vector in which the modules configuration is stored. + * usually r->per_dir_config or s->module_config + * @param m The module to set the data for. + * @param val The module-specific data to set + */ +AP_DECLARE(void) ap_set_module_config(ap_conf_vector_t *cv, const module *m, + void *val); + +#if !defined(AP_DEBUG) + +#define ap_get_module_config(v,m) \ + (((void **)(v))[(m)->module_index]) +#define ap_set_module_config(v,m,val) \ + ((((void **)(v))[(m)->module_index]) = (val)) + +#endif /* AP_DEBUG */ + + +/** + * Generic command handling function for strings + * @param cmd The command parameters for this directive + * @param struct_ptr pointer into a given type + * @param arg The argument to the directive + * @return An error string or NULL on success + */ +AP_DECLARE_NONSTD(const char *) ap_set_string_slot(cmd_parms *cmd, + void *struct_ptr, + const char *arg); + +/** + * Generic command handling function for integers + * @param cmd The command parameters for this directive + * @param struct_ptr pointer into a given type + * @param arg The argument to the directive + * @return An error string or NULL on success + */ +AP_DECLARE_NONSTD(const char *) ap_set_int_slot(cmd_parms *cmd, + void *struct_ptr, + const char *arg); + +/** + * Return true if the specified method is limited by being listed in + * a container, or by *not* being listed in a + * container. + * + * @param method Pointer to a string specifying the method to check. + * @param cmd Pointer to the cmd_parms structure passed to the + * directive handler. + * @return 0 if the method is not limited in the current scope + */ +AP_DECLARE(int) ap_method_is_limited(cmd_parms *cmd, const char *method); + +/** + * Generic command handling function for strings, always sets the value + * to a lowercase string + * @param cmd The command parameters for this directive + * @param struct_ptr pointer into a given type + * @param arg The argument to the directive + * @return An error string or NULL on success + */ +AP_DECLARE_NONSTD(const char *) ap_set_string_slot_lower(cmd_parms *cmd, + void *struct_ptr, + const char *arg); +/** + * Generic command handling function for flags + * @param cmd The command parameters for this directive + * @param struct_ptr pointer into a given type + * @param arg The argument to the directive (either 1 or 0) + * @return An error string or NULL on success + */ +AP_DECLARE_NONSTD(const char *) ap_set_flag_slot(cmd_parms *cmd, + void *struct_ptr, + int arg); +/** + * Generic command handling function for files + * @param cmd The command parameters for this directive + * @param struct_ptr pointer into a given type + * @param arg The argument to the directive + * @return An error string or NULL on success + */ +AP_DECLARE_NONSTD(const char *) ap_set_file_slot(cmd_parms *cmd, + void *struct_ptr, + const char *arg); +/** + * Generic command handling function to respond with cmd->help as an error + * @param cmd The command parameters for this directive + * @param struct_ptr pointer into a given type + * @param arg The argument to the directive + * @return The cmd->help value as the error string + * @tip This allows simple declarations such as; + *
    + *     AP_INIT_RAW_ARGS("Foo", ap_set_deprecated, NULL, OR_ALL, 
    + *         "The Foo directive is no longer supported, use Bar"),
    + * 
    + */ +AP_DECLARE_NONSTD(const char *) ap_set_deprecated(cmd_parms *cmd, + void *struct_ptr, + const char *arg); +/** + * For modules which need to read config files, open logs, etc. this returns + * the canonical form of fname made absolute to ap_server_root. + * @param p pool to allocate data from + * @param fname The file name + */ +AP_DECLARE(char *) ap_server_root_relative(apr_pool_t *p, const char *fname); + +/* Finally, the hook for dynamically loading modules in... */ + +/** + * Add a module to the server + * @param m The module structure of the module to add + * @param p The pool of the same lifetime as the module + */ +AP_DECLARE(void) ap_add_module(module *m, apr_pool_t *p); + +/** + * Remove a module from the server. There are some caveats: + * when the module is removed, its slot is lost so all the current + * per-dir and per-server configurations are invalid. So we should + * only ever call this function when you are invalidating almost + * all our current data. I.e. when doing a restart. + * @param m the module structure of the module to remove + */ +AP_DECLARE(void) ap_remove_module(module *m); +/** + * Add a module to the chained modules list and the list of loaded modules + * @param m The module structure of the module to add + * @param p The pool with the same lifetime as the module + */ +AP_DECLARE(void) ap_add_loaded_module(module *mod, apr_pool_t *p); +/** + * Remove a module fromthe chained modules list and the list of loaded modules + * @param m the module structure of the module to remove + */ +AP_DECLARE(void) ap_remove_loaded_module(module *mod); +/** + * Add a module to the list of loaded module based on the name of the + * module + * @param name The name of the module + * @param p The pool valid for the lifetime of the module + * @return 1 on success, 0 on failure + */ +AP_DECLARE(int) ap_add_named_module(const char *name, apr_pool_t *p); +/** + * Find the name of the specified module + * @param m The module to get the name for + * @return the name of the module + */ +AP_DECLARE(const char *) ap_find_module_name(module *m); +/** + * Find a module based on the name of the module + * @param name the name of the module + * @return the module structure if found, NULL otherwise + */ +AP_DECLARE(module *) ap_find_linked_module(const char *name); + +/** + * Open a ap_configfile_t as apr_file_t + * @param ret_cfg open ap_configfile_t struct pointer + * @param p The pool to allocate the structure from + * @param name the name of the file to open + */ +AP_DECLARE(apr_status_t) ap_pcfg_openfile(ap_configfile_t **ret_cfg, + apr_pool_t *p, const char *name); + +/** + * Allocate a ap_configfile_t handle with user defined functions and params + * @param p The pool to allocate from + * @param descr The name of the file + * @param param The argument passed to getch/getstr/close + * @param getc_func The getch function + * @param gets_func The getstr function + * @param close_func The close function + */ +AP_DECLARE(ap_configfile_t *) ap_pcfg_open_custom(apr_pool_t *p, + const char *descr, + void *param, + int(*getc_func)(void*), + void *(*gets_func) (void *buf, size_t bufsiz, void *param), + int(*close_func)(void *param)); + +/** + * Read one line from open ap_configfile_t, strip LF, increase line number + * @param buf place to store the line read + * @param bufsize size of the buffer + * @param cfp File to read from + * @return 1 on success, 0 on failure + */ +AP_DECLARE(int) ap_cfg_getline(char *buf, size_t bufsize, ap_configfile_t *cfp); + +/** + * Read one char from open configfile_t, increase line number upon LF + * @param cfp The file to read from + * @return the character read + */ +AP_DECLARE(int) ap_cfg_getc(ap_configfile_t *cfp); + +/** + * Detach from open ap_configfile_t, calling the close handler + * @param cfp The file to close + * @return 1 on sucess, 0 on failure + */ +AP_DECLARE(int) ap_cfg_closefile(ap_configfile_t *cfp); + +/** + * Read all data between the current and the matching . All + * of this data is forgotten immediately. + * @param cmd The cmd_parms to pass to the directives inside the container + * @param directive The directive name to read until + * @return Error string on failure, NULL on success + */ +AP_DECLARE(const char *) ap_soak_end_container(cmd_parms *cmd, char *directive); + +/** + * Read all data between the current and the matching and build + * a config tree from it + * @param p pool to allocate from + * @param temp_pool Temporary pool to allocate from + * @param parms The cmd_parms to pass to all directives read + * @param current The current node in the tree + * @param curr_parent The current parent node + * @param orig_directive The directive to read until hit. + * @return Error string on failure, NULL on success +*/ +AP_DECLARE(const char *) ap_build_cont_config(apr_pool_t *p, + apr_pool_t *temp_pool, + cmd_parms *parms, + ap_directive_t **current, + ap_directive_t **curr_parent, + char *orig_directive); + +/** + * Build a config tree from a config file + * @param parms The cmd_parms to pass to all of the directives in the file + * @param conf_pool The pconf pool + * @param temp_pool The temporary pool + * @param conftree Place to store the root node of the config tree + * @return Error string on erro, NULL otherwise + */ +AP_DECLARE(const char *) ap_build_config(cmd_parms *parms, + apr_pool_t *conf_pool, + apr_pool_t *temp_pool, + ap_directive_t **conftree); + +/** + * Walk a config tree and setup the server's internal structures + * @param conftree The config tree to walk + * @param parms The cmd_parms to pass to all functions + * @param section_vector The per-section config vector. + * @return Error string on error, NULL otherwise + */ +AP_DECLARE(const char *) ap_walk_config(ap_directive_t *conftree, + cmd_parms *parms, + ap_conf_vector_t *section_vector); + +/** + * @defgroup ap_check_cmd_context ap_check_cmd_context + * @{ + */ +/** + * Check the context a command is used in. + * @param cmd The command to check + * @param forbidden Where the command is forbidden. + * @return Error string on error, NULL on success + */ +AP_DECLARE(const char *) ap_check_cmd_context(cmd_parms *cmd, + unsigned forbidden); + +#define NOT_IN_VIRTUALHOST 0x01 /**< Forbidden in */ +#define NOT_IN_LIMIT 0x02 /**< Forbidden in */ +#define NOT_IN_DIRECTORY 0x04 /**< Forbidden in */ +#define NOT_IN_LOCATION 0x08 /**< Forbidden in */ +#define NOT_IN_FILES 0x10 /**< Forbidden in */ +/** Forbidden in //*/ +#define NOT_IN_DIR_LOC_FILE (NOT_IN_DIRECTORY|NOT_IN_LOCATION|NOT_IN_FILES) +/** Forbidden in //// */ +#define GLOBAL_ONLY (NOT_IN_VIRTUALHOST|NOT_IN_LIMIT|NOT_IN_DIR_LOC_FILE) + +/** @} */ + +#ifdef CORE_PRIVATE + +/** + * The topmost module in the list + * @defvar module *ap_top_module + */ +AP_DECLARE_DATA extern module *ap_top_module; + +/** + * Array of all statically linked modules + * @defvar module *ap_prelinked_modules[] + */ +AP_DECLARE_DATA extern module *ap_prelinked_modules[]; +/** + * Array of all preloaded modules + * @defvar module *ap_preloaded_modules[] + */ +AP_DECLARE_DATA extern module *ap_preloaded_modules[]; +/** + * Array of all loaded modules + * @defvar module **ap_loaded_modules + */ +AP_DECLARE_DATA extern module **ap_loaded_modules; + +/* For mod_so.c... */ +/** Run a single module's two create_config hooks + * @param p the pool to allocate from + * @param s The server to configure for. + * @param m The module to configure + */ +AP_DECLARE(void) ap_single_module_configure(apr_pool_t *p, server_rec *s, + module *m); + +/* For http_main.c... */ +/** + * Add all of the prelinked modules into the loaded module list + * @param process The process that is currently running the server + */ +AP_DECLARE(void) ap_setup_prelinked_modules(process_rec *process); + +/** + * Show the preloaded configuration directives, the help string explaining + * the directive arguments, in what module they are handled, and in + * what parts of the configuration they are allowed. Used for httpd -h. + */ +AP_DECLARE(void) ap_show_directives(void); + +/** + * Show the preloaded module names. Used for httpd -l. + */ +AP_DECLARE(void) ap_show_modules(void); + +/** + * Show the MPM name. Used in reporting modules such as mod_info to + * provide extra information to the user + */ +AP_DECLARE(const char *) ap_show_mpm(void); + +/** + * Read all config files and setup the server + * @param process The process running the server + * @param temp_pool A pool to allocate temporary data from. + * @param config_name The name of the config file + * @param conftree Place to store the root of the config tree + * @return The setup server_rec list. + */ +AP_DECLARE(server_rec *) ap_read_config(process_rec *process, + apr_pool_t *temp_pool, + const char *config_name, + ap_directive_t **conftree); + +/** + * Run all rewrite args hooks for loaded modules + * @param process The process currently running the server + */ +AP_DECLARE(void) ap_run_rewrite_args(process_rec *process); + +/** + * Run the register hooks function for a specified module + * @param m The module to run the register hooks function fo + * @param p The pool valid for the lifetime of the module + */ +AP_DECLARE(void) ap_register_hooks(module *m, apr_pool_t *p); + +/** + * Setup all virtual hosts + * @param p The pool to allocate from + * @param main_server The head of the server_rec list + */ +AP_DECLARE(void) ap_fixup_virtual_hosts(apr_pool_t *p, + server_rec *main_server); + +/* For http_request.c... */ + +/** + * Setup the config vector for a request_rec + * @param p The pool to allocate the config vector from + * @return The config vector + */ +AP_CORE_DECLARE(ap_conf_vector_t*) ap_create_request_config(apr_pool_t *p); + +/** + * Setup the config vector for per dir module configs + * @param p The pool to allocate the config vector from + * @return The config vector + */ +AP_CORE_DECLARE(ap_conf_vector_t *) ap_create_per_dir_config(apr_pool_t *p); + +/** + * Run all of the modules merge per dir config functions + * @param p The pool to pass to the merge functions + * @param base The base directory config structure + * @param new_conf The new directory config structure + */ +AP_CORE_DECLARE(ap_conf_vector_t*) ap_merge_per_dir_configs(apr_pool_t *p, + ap_conf_vector_t *base, + ap_conf_vector_t *new_conf); + +/* For http_connection.c... */ +/** + * Setup the config vector for a connection_rec + * @param p The pool to allocate the config vector from + * @return The config vector + */ +AP_CORE_DECLARE(ap_conf_vector_t*) ap_create_conn_config(apr_pool_t *p); + +/* For http_core.c... ( command and virtual hosts) */ + +/** + * parse an htaccess file + * @param resulting htaccess_result + * @param r The request currently being served + * @param override Which overrides are active + * @param path The path to the htaccess file + * @param access_name The list of possible names for .htaccess files + * int The status of the current request + */ +AP_CORE_DECLARE(int) ap_parse_htaccess(ap_conf_vector_t **result, + request_rec *r, int override, + const char *path, + const char *access_name); + +/** + * Setup a virtual host + * @param p The pool to allocate all memory from + * @param hostname The hostname of the virtual hsot + * @param main_server The main server for this Apache configuration + * @param ps Place to store the new server_rec + * return Error string on error, NULL on success + */ +AP_CORE_DECLARE(const char *) ap_init_virtual_host(apr_pool_t *p, + const char *hostname, + server_rec *main_server, + server_rec **); + +/** + * Process the config file for Apache + * @param s The server rec to use for the command parms + * @param fname The name of the config file + * @param conftree The root node of the created config tree + * @param p Pool for general allocation + * @param ptem Pool for temporary allocation + */ +AP_DECLARE(void) ap_process_resource_config(server_rec *s, const char *fname, + ap_directive_t **conftree, + apr_pool_t *p, apr_pool_t *ptemp); + +/** + * Process all directives in the config tree + * @param s The server rec to use in the command parms + * @param conftree The config tree to process + * @param p The pool for general allocation + * @param ptemp The pool for temporary allocations + */ +AP_DECLARE(void) ap_process_config_tree(server_rec *s, ap_directive_t *conftree, + apr_pool_t *p, apr_pool_t *ptemp); + +/* Module-method dispatchers, also for http_request.c */ +/** + * Run the handler phase of each module until a module accepts the + * responsibility of serving the request + * @param r The current request + * @return The status of the current request + */ +AP_CORE_DECLARE(int) ap_invoke_handler(request_rec *r); + +/* for mod_perl */ + +/** + * Find a given directive in a command_rec table + * @param name The directive to search for + * @param cmds The table to search + * @return The directive definition of the specified directive + */ +AP_CORE_DECLARE(const command_rec *) ap_find_command(const char *name, + const command_rec *cmds); + +/** + * Find a given directive in a list module + * @param cmd_name The directive to search for + * @param mod The module list to search + * @return The directive definition of the specified directive + */ +AP_CORE_DECLARE(const command_rec *) ap_find_command_in_modules(const char *cmd_name, + module **mod); + +/** + * Ask a module to create per-server and per-section (dir/loc/file) configs + * (if it hasn't happened already). The results are stored in the server's + * config, and the specified per-section config vector. + * @param server The server to operate upon. + * @param section_vector The per-section config vector. + * @param section Which section to create a config for. + * @param mod The module which is defining the config data. + * @param pconf A pool for all configuration allocations. + * @return The (new) per-section config data. + */ +AP_CORE_DECLARE(void *) ap_set_config_vectors(server_rec *server, + ap_conf_vector_t *section_vector, + const char *section, + module *mod, apr_pool_t *pconf); + +#endif + + /* Hooks */ + +/** + * Run the header parser functions for each module + * @param r The current request + * @return OK or DECLINED + */ +AP_DECLARE_HOOK(int,header_parser,(request_rec *r)) + +/** + * Run the pre_config function for each module + * @param pconf The config pool + * @param plog The logging streams pool + * @param ptemp The temporary pool + * @return OK or DECLINED on success anything else is a error + */ +AP_DECLARE_HOOK(int,pre_config,(apr_pool_t *pconf,apr_pool_t *plog, + apr_pool_t *ptemp)) + + +/** + * Run the post_config function for each module + * @param pconf The config pool + * @param plog The logging streams pool + * @param ptemp The temporary pool + * @param s The list of server_recs + * @return OK or DECLINED on success anything else is a error + */ +AP_DECLARE_HOOK(int,post_config,(apr_pool_t *pconf,apr_pool_t *plog, + apr_pool_t *ptemp,server_rec *s)) + +/** + * Run the open_logs functions for each module + * @param pconf The config pool + * @param plog The logging streams pool + * @param ptemp The temporary pool + * @param s The list of server_recs + * @return OK or DECLINED on success anything else is a error + */ +AP_DECLARE_HOOK(int,open_logs,(apr_pool_t *pconf,apr_pool_t *plog, + apr_pool_t *ptemp,server_rec *s)) + +/** + * Run the child_init functions for each module + * @param pchild The child pool + * @param s The list of server_recs in this server + */ +AP_DECLARE_HOOK(void,child_init,(apr_pool_t *pchild, server_rec *s)) + +/** + * Run the handler functions for each module + * @param r The request_rec + * @remark non-wildcard handlers should HOOK_MIDDLE, wildcard HOOK_LAST + */ +AP_DECLARE_HOOK(int,handler,(request_rec *r)) + +/** + * Run the quick handler functions for each module. The quick_handler + * is run before any other requests hooks are called (location_walk, + * directory_walk, access checking, et. al.). This hook was added + * to provide a quick way to serve content from a URI keyed cache. + * + * @param r The request_rec + * @param lookup_uri Controls whether the caller actually wants content or not. + * lookup is set when the quick_handler is called out of + * ap_sub_req_lookup_uri() + */ +AP_DECLARE_HOOK(int,quick_handler,(request_rec *r, int lookup_uri)) + +/** + * Retrieve the optional functions for each module. + * This is run immediately before the server starts. Optional functions should + * be registered during the hook registration phase. + */ +AP_DECLARE_HOOK(void,optional_fn_retrieve,(void)) + +#ifdef __cplusplus +} +#endif + +#endif /* !APACHE_HTTP_CONFIG_H */ diff --git a/rubbos/app/httpd-2.0.64/include/http_connection.h b/rubbos/app/httpd-2.0.64/include/http_connection.h new file mode 100644 index 00000000..2b7d379f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/include/http_connection.h @@ -0,0 +1,139 @@ +/* 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. + */ + +#ifndef APACHE_HTTP_CONNECTION_H +#define APACHE_HTTP_CONNECTION_H + +#include "apr_hooks.h" +#include "apr_network_io.h" +#include "apr_buckets.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @package Apache connection library + */ +#ifdef CORE_PRIVATE +/** + * This is the protocol module driver. This calls all of the + * pre-connection and connection hooks for all protocol modules. + * @param c The connection on which the request is read + * @param csd The mechanism on which this connection is to be read. + * Most times this will be a socket, but it is up to the module + * that accepts the request to determine the exact type. + * @deffunc void ap_process_connection(conn_rec *c, void *csd) + */ +AP_CORE_DECLARE(void) ap_process_connection(conn_rec *c, void *csd); + +AP_CORE_DECLARE(void) ap_flush_conn(conn_rec *c); + +/** + * This function is responsible for the following cases: + *
    + * we now proceed to read from the client until we get EOF, or until
    + * MAX_SECS_TO_LINGER has passed.  the reasons for doing this are
    + * documented in a draft:
    + *
    + * http://www.ics.uci.edu/pub/ietf/http/draft-ietf-http-connection-00.txt
    + *
    + * in a nutshell -- if we don't make this effort we risk causing
    + * TCP RST packets to be sent which can tear down a connection before
    + * all the response data has been sent to the client.
    + * 
    + * @param c The connection we are closing + */ +AP_DECLARE(void) ap_lingering_close(conn_rec *c); +#endif + + /* Hooks */ +/** + * create_connection is a RUN_FIRST hook which allows modules to create + * connections. In general, you should not install filters with the + * create_connection hook. If you require vhost configuration information + * to make filter installation decisions, you must use the pre_connection + * or install_network_transport hook. This hook should close the connection + * if it encounters a fatal error condition. + * + * @param p The pool from which to allocate the connection record + * @param csd The socket that has been accepted + * @param conn_id A unique identifier for this connection. The ID only + * needs to be unique at that time, not forever. + * @param sbh A handle to scoreboard information for this connection. + * @return An allocated connection record or NULL. + */ +AP_DECLARE_HOOK(conn_rec *, create_connection, + (apr_pool_t *p, server_rec *server, apr_socket_t *csd, + long conn_id, void *sbh, apr_bucket_alloc_t *alloc)) + +/** + * This hook gives protocol modules an opportunity to set everything up + * before calling the protocol handler. All pre-connection hooks are + * run until one returns something other than ok or decline + * @param c The connection on which the request has been received. + * @param csd The mechanism on which this connection is to be read. + * Most times this will be a socket, but it is up to the module + * that accepts the request to determine the exact type. + * @return OK or DECLINED + * @deffunc int ap_run_pre_connection(conn_rec *c, void *csd) + */ +AP_DECLARE_HOOK(int,pre_connection,(conn_rec *c, void *csd)) + +/** + * This hook implements different protocols. After a connection has been + * established, the protocol module must read and serve the request. This + * function does that for each protocol module. The first protocol module + * to handle the request is the last module run. + * @param c The connection on which the request has been received. + * @return OK or DECLINED + * @deffunc int ap_run_process_connection(conn_rec *c) + */ +AP_DECLARE_HOOK(int,process_connection,(conn_rec *c)) + +/* End Of Connection (EOC) bucket */ + +AP_DECLARE_DATA extern const apr_bucket_type_t ap_bucket_type_eoc; + +/** + * Determine if a bucket is an End Of Connection (EOC) bucket + * @param e The bucket to inspect + * @return true or false + */ +#define AP_BUCKET_IS_EOC(e) (e->type == &ap_bucket_type_eoc) + +/** + * Make the bucket passed in an End Of Connection (EOC) bucket + * @param b The bucket to make into an EOC bucket + * @return The new bucket, or NULL if allocation failed + * @deffunc apr_bucket *ap_bucket_eoc_make(apr_bucket *b) + */ +AP_DECLARE(apr_bucket *) ap_bucket_eoc_make(apr_bucket *b); + +/** + * Create a bucket referring to an End Of Connection (EOC). This indicates + * that the connection will be closed. + * @param list The freelist from which this bucket should be allocated + * @return The new bucket, or NULL if allocation failed + * @deffunc apr_bucket *ap_bucket_eoc_create(apr_bucket_alloc_t *list) + */ +AP_DECLARE(apr_bucket *) ap_bucket_eoc_create(apr_bucket_alloc_t *list); + +#ifdef __cplusplus +} +#endif + +#endif /* !APACHE_HTTP_REQUEST_H */ diff --git a/rubbos/app/httpd-2.0.64/include/http_core.h b/rubbos/app/httpd-2.0.64/include/http_core.h new file mode 100644 index 00000000..99b17a90 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/include/http_core.h @@ -0,0 +1,640 @@ +/* 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. + */ + +#ifndef APACHE_HTTP_CORE_H +#define APACHE_HTTP_CORE_H + +#include "apr.h" +#include "apr_hash.h" +#include "apr_optional.h" +#include "util_filter.h" + +#if APR_HAVE_STRUCT_RLIMIT +#include +#include +#endif + + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @package CORE HTTP Daemon + */ + +/* **************************************************************** + * + * The most basic server code is encapsulated in a single module + * known as the core, which is just *barely* functional enough to + * serve documents, though not terribly well. + * + * Largely for NCSA back-compatibility reasons, the core needs to + * make pieces of its config structures available to other modules. + * The accessors are declared here, along with the interpretation + * of one of them (allow_options). + */ + +#define OPT_NONE 0 +#define OPT_INDEXES 1 +#define OPT_INCLUDES 2 +#define OPT_SYM_LINKS 4 +#define OPT_EXECCGI 8 +#define OPT_UNSET 16 +#define OPT_INCNOEXEC 32 +#define OPT_SYM_OWNER 64 +#define OPT_MULTI 128 +#define OPT_ALL (OPT_INDEXES|OPT_INCLUDES|OPT_SYM_LINKS|OPT_EXECCGI) + +/* options for get_remote_host() */ +/* REMOTE_HOST returns the hostname, or NULL if the hostname + * lookup fails. It will force a DNS lookup according to the + * HostnameLookups setting. + */ +#define REMOTE_HOST (0) + +/* REMOTE_NAME returns the hostname, or the dotted quad if the + * hostname lookup fails. It will force a DNS lookup according + * to the HostnameLookups setting. + */ +#define REMOTE_NAME (1) + +/* REMOTE_NOLOOKUP is like REMOTE_NAME except that a DNS lookup is + * never forced. + */ +#define REMOTE_NOLOOKUP (2) + +/* REMOTE_DOUBLE_REV will always force a DNS lookup, and also force + * a double reverse lookup, regardless of the HostnameLookups + * setting. The result is the (double reverse checked) hostname, + * or NULL if any of the lookups fail. + */ +#define REMOTE_DOUBLE_REV (3) + +#define SATISFY_ALL 0 +#define SATISFY_ANY 1 +#define SATISFY_NOSPEC 2 + +/* Make sure we don't write less than 8000 bytes at any one time. + */ +#define AP_MIN_BYTES_TO_WRITE 8000 + +/* default maximum of internal redirects */ +# define AP_DEFAULT_MAX_INTERNAL_REDIRECTS 10 + +/* default maximum subrequest nesting level */ +# define AP_DEFAULT_MAX_SUBREQ_DEPTH 10 + +/** + * Retrieve the value of Options for this request + * @param r The current request + * @return the Options bitmask + * @deffunc int ap_allow_options(request_rec *r) + */ +AP_DECLARE(int) ap_allow_options(request_rec *r); + +/** + * Retrieve the value of the AllowOverride for this request + * @param r The current request + * @return the overrides bitmask + * @deffunc int ap_allow_overrides(request_rec *r) + */ +AP_DECLARE(int) ap_allow_overrides(request_rec *r); + +/** + * Retrieve the value of the DefaultType directive, or text/plain if not set + * @param r The current request + * @return The default type + * @deffunc const char *ap_default_type(request_rec *r) + */ +AP_DECLARE(const char *) ap_default_type(request_rec *r); + +/** + * Retrieve the document root for this server + * @param r The current request + * @warning Don't use this! If your request went through a Userdir, or + * something like that, it'll screw you. But it's back-compatible... + * @return The document root + * @deffunc const char *ap_document_root(request_rec *r) + */ +AP_DECLARE(const char *) ap_document_root(request_rec *r); + +/** + * Lookup the remote client's DNS name or IP address + * @param conn The current connection + * @param dir_config The directory config vector from the request + * @param type The type of lookup to perform. One of: + *
    + *     REMOTE_HOST returns the hostname, or NULL if the hostname
    + *                 lookup fails.  It will force a DNS lookup according to the
    + *                 HostnameLookups setting.
    + *     REMOTE_NAME returns the hostname, or the dotted quad if the
    + *                 hostname lookup fails.  It will force a DNS lookup according
    + *                 to the HostnameLookups setting.
    + *     REMOTE_NOLOOKUP is like REMOTE_NAME except that a DNS lookup is
    + *                     never forced.
    + *     REMOTE_DOUBLE_REV will always force a DNS lookup, and also force
    + *                   a double reverse lookup, regardless of the HostnameLookups
    + *                   setting.  The result is the (double reverse checked) 
    + *                   hostname, or NULL if any of the lookups fail.
    + * 
    + * @param str_is_ip unless NULL is passed, this will be set to non-zero on output when an IP address + * string is returned + * @return The remote hostname + * @deffunc const char *ap_get_remote_host(conn_rec *conn, void *dir_config, int type, int *str_is_ip) + */ +AP_DECLARE(const char *) ap_get_remote_host(conn_rec *conn, void *dir_config, int type, int *str_is_ip); + +/** + * Retrieve the login name of the remote user. Undef if it could not be + * determined + * @param r The current request + * @return The user logged in to the client machine + * @deffunc const char *ap_get_remote_logname(request_rec *r) + */ +AP_DECLARE(const char *) ap_get_remote_logname(request_rec *r); + +/* Used for constructing self-referencing URLs, and things like SERVER_PORT, + * and SERVER_NAME. + */ +/** + * build a fully qualified URL from the uri and information in the request rec + * @param p The pool to allocate the URL from + * @param uri The path to the requested file + * @param r The current request + * @return A fully qualified URL + * @deffunc char *ap_construct_url(apr_pool_t *p, const char *uri, request_rec *r) + */ +AP_DECLARE(char *) ap_construct_url(apr_pool_t *p, const char *uri, request_rec *r); + +/** + * Get the current server name from the request + * @param r The current request + * @return the server name + * @deffunc const char *ap_get_server_name(request_rec *r) + */ +AP_DECLARE(const char *) ap_get_server_name(request_rec *r); + +/** + * Get the current server port + * @param The current request + * @return The server's port + * @deffunc apr_port_t ap_get_server_port(const request_rec *r) + */ +AP_DECLARE(apr_port_t) ap_get_server_port(const request_rec *r); + +/** + * Return the limit on bytes in request msg body + * @param r The current request + * @return the maximum number of bytes in the request msg body + * @deffunc apr_off_t ap_get_limit_req_body(const request_rec *r) + */ +AP_DECLARE(apr_off_t) ap_get_limit_req_body(const request_rec *r); + +/** + * Return the limit on bytes in XML request msg body + * @param r The current request + * @return the maximum number of bytes in XML request msg body + * @deffunc size_t ap_get_limit_xml_body(const request_rec *r) + */ +AP_DECLARE(size_t) ap_get_limit_xml_body(const request_rec *r); + +/** + * Install a custom response handler for a given status + * @param r The current request + * @param status The status for which the custom response should be used + * @param string The custom response. This can be a static string, a file + * or a URL + */ +AP_DECLARE(void) ap_custom_response(request_rec *r, int status, const char *string); + +/** + * Check if the current request is beyond the configured max. number of redirects or subrequests + * @param r The current request + * @return true (is exceeded) or false + * @deffunc int ap_is_recursion_limit_exceeded(const request_rec *r) + */ +AP_DECLARE(int) ap_is_recursion_limit_exceeded(const request_rec *r); + +/** + * Check for a definition from the server command line + * @param name The define to check for + * @return 1 if defined, 0 otherwise + * @deffunc int ap_exists_config_define(const char *name) + */ +AP_DECLARE(int) ap_exists_config_define(const char *name); +/* FIXME! See STATUS about how */ +AP_DECLARE_NONSTD(int) ap_core_translate(request_rec *r); + +/* Authentication stuff. This is one of the places where compatibility + * with the old config files *really* hurts; they don't discriminate at + * all between different authentication schemes, meaning that we need + * to maintain common state for all of them in the core, and make it + * available to the other modules through interfaces. + */ +typedef struct require_line require_line; + +/** A structure to keep track of authorization requirements */ +struct require_line { + /** Where the require line is in the config file. */ + apr_int64_t method_mask; + /** The complete string from the command line */ + char *requirement; +}; + +/** + * Return the type of authorization required for this request + * @param r The current request + * @return The authorization required + * @deffunc const char *ap_auth_type(request_rec *r) + */ +AP_DECLARE(const char *) ap_auth_type(request_rec *r); + +/** + * Return the current Authorization realm + * @param r The current request + * @return The current authorization realm + * @deffunc const char *ap_auth_name(request_rec *r) + */ +AP_DECLARE(const char *) ap_auth_name(request_rec *r); + +/** + * How the requires lines must be met. + * @param r The current request + * @return How the requirements must be met. One of: + *
    + *      SATISFY_ANY    -- any of the requirements must be met.
    + *      SATISFY_ALL    -- all of the requirements must be met.
    + *      SATISFY_NOSPEC -- There are no applicable satisfy lines
    + * 
    + * @deffunc int ap_satisfies(request_rec *r) + */ +AP_DECLARE(int) ap_satisfies(request_rec *r); + +/** + * Retrieve information about all of the requires directives for this request + * @param r The current request + * @return An array of all requires directives for this request + * @deffunc const apr_array_header_t *ap_requires(request_rec *r) + */ +AP_DECLARE(const apr_array_header_t *) ap_requires(request_rec *r); + +#ifdef CORE_PRIVATE + +/* + * Core is also unlike other modules in being implemented in more than + * one file... so, data structures are declared here, even though most of + * the code that cares really is in http_core.c. Also, another accessor. + */ + +AP_DECLARE_DATA extern module core_module; + +/* Per-request configuration */ + +typedef struct { + /* bucket brigade used by getline for look-ahead and + * ap_get_client_block for holding left-over request body */ + struct apr_bucket_brigade *bb; + + /* an array of per-request working data elements, accessed + * by ID using ap_get_request_note() + * (Use ap_register_request_note() during initialization + * to add elements) + */ + void **notes; + + /* There is a script processor installed on the output filter chain, + * so it needs the default_handler to deliver a (script) file into + * the chain so it can process it. Normally, default_handler only + * serves files on a GET request (assuming the file is actual content), + * since other methods are not content-retrieval. This flag overrides + * that behavior, stating that the "content" is actually a script and + * won't actually be delivered as the response for the non-GET method. + */ + int deliver_script; + + /* Custom response strings registered via ap_custom_response(), + * or NULL; check per-dir config if nothing found here + */ + char **response_code_strings; /* from ap_custom_response(), not from + * ErrorDocument + */ + /* Should addition of charset= be suppressed for this request? + */ + int suppress_charset; +} core_request_config; + +/* Standard entries that are guaranteed to be accessible via + * ap_get_request_note() for each request (additional entries + * can be added with ap_register_request_note()) + */ +#define AP_NOTE_DIRECTORY_WALK 0 +#define AP_NOTE_LOCATION_WALK 1 +#define AP_NOTE_FILE_WALK 2 +#define AP_NUM_STD_NOTES 3 + +/** + * Reserve an element in the core_request_config->notes array + * for some application-specific data + * @return An integer key that can be passed to ap_get_request_note() + * during request processing to access this element for the + * current request. + */ +AP_DECLARE(apr_size_t) ap_register_request_note(void); + +/** + * Retrieve a pointer to an element in the core_request_config->notes array + * @param r The request + * @param note_num A key for the element: either a value obtained from + * ap_register_request_note() or one of the predefined AP_NOTE_* + * values. + * @return NULL if the note_num is invalid, otherwise a pointer to the + * requested note element. + * @remark At the start of a request, each note element is NULL. The + * handle provided by ap_get_request_note() is a pointer-to-pointer + * so that the caller can point the element to some app-specific + * data structure. The caller should guarantee that any such + * structure will last as long as the request itself. + */ +AP_DECLARE(void **) ap_get_request_note(request_rec *r, apr_size_t note_num); + +/* Per-directory configuration */ + +typedef unsigned char allow_options_t; +typedef unsigned char overrides_t; + +/* + * Bits of info that go into making an ETag for a file + * document. Why a long? Because char historically + * proved too short for Options, and int can be different + * sizes on different platforms. + */ +typedef unsigned long etag_components_t; + +#define ETAG_UNSET 0 +#define ETAG_NONE (1 << 0) +#define ETAG_MTIME (1 << 1) +#define ETAG_INODE (1 << 2) +#define ETAG_SIZE (1 << 3) +#define ETAG_BACKWARD (ETAG_MTIME | ETAG_INODE | ETAG_SIZE) +#define ETAG_ALL (ETAG_MTIME | ETAG_INODE | ETAG_SIZE) + +typedef enum { + srv_sig_unset, + srv_sig_off, + srv_sig_on, + srv_sig_withmail +} server_signature_e; + +typedef struct { + /* path of the directory/regex/etc. see also d_is_fnmatch/absolute below */ + char *d; + /* the number of slashes in d */ + unsigned d_components; + + /* If (opts & OPT_UNSET) then no absolute assignment to options has + * been made. + * invariant: (opts_add & opts_remove) == 0 + * Which said another way means that the last relative (options + or -) + * assignment made to each bit is recorded in exactly one of opts_add + * or opts_remove. + */ + allow_options_t opts; + allow_options_t opts_add; + allow_options_t opts_remove; + overrides_t override; + + /* MIME typing --- the core doesn't do anything at all with this, + * but it does know what to slap on a request for a document which + * goes untyped by other mechanisms before it slips out the door... + */ + + char *ap_default_type; + + /* Authentication stuff. Groan... */ + + int *satisfy; /* for every method one */ + char *ap_auth_type; + char *ap_auth_name; + apr_array_header_t *ap_requires; + + /* Custom response config. These can contain text or a URL to redirect to. + * if response_code_strings is NULL then there are none in the config, + * if it's not null then it's allocated to sizeof(char*)*RESPONSE_CODES. + * This lets us do quick merges in merge_core_dir_configs(). + */ + + char **response_code_strings; /* from ErrorDocument, not from + * ap_custom_response() */ + + /* Hostname resolution etc */ +#define HOSTNAME_LOOKUP_OFF 0 +#define HOSTNAME_LOOKUP_ON 1 +#define HOSTNAME_LOOKUP_DOUBLE 2 +#define HOSTNAME_LOOKUP_UNSET 3 + unsigned int hostname_lookups : 4; + + signed int do_rfc1413 : 2; /* See if client is advertising a username? */ + + signed int content_md5 : 2; /* calculate Content-MD5? */ + +#define USE_CANONICAL_NAME_OFF (0) +#define USE_CANONICAL_NAME_ON (1) +#define USE_CANONICAL_NAME_DNS (2) +#define USE_CANONICAL_NAME_UNSET (3) + unsigned use_canonical_name : 2; + + /* since is_fnmatch(conf->d) was being called so frequently in + * directory_walk() and its relatives, this field was created and + * is set to the result of that call. + */ + unsigned d_is_fnmatch : 1; + + /* should we force a charset on any outgoing parameterless content-type? + * if so, which charset? + */ +#define ADD_DEFAULT_CHARSET_OFF (0) +#define ADD_DEFAULT_CHARSET_ON (1) +#define ADD_DEFAULT_CHARSET_UNSET (2) + unsigned add_default_charset : 2; + const char *add_default_charset_name; + + /* System Resource Control */ +#ifdef RLIMIT_CPU + struct rlimit *limit_cpu; +#endif +#if defined (RLIMIT_DATA) || defined (RLIMIT_VMEM) || defined(RLIMIT_AS) + struct rlimit *limit_mem; +#endif +#ifdef RLIMIT_NPROC + struct rlimit *limit_nproc; +#endif + apr_off_t limit_req_body; /* limit on bytes in request msg body */ + long limit_xml_body; /* limit on bytes in XML request msg body */ + + /* logging options */ + + server_signature_e server_signature; + + int loglevel; + + /* Access control */ + apr_array_header_t *sec_file; + regex_t *r; + + const char *mime_type; /* forced with ForceType */ + const char *handler; /* forced with SetHandler */ + const char *output_filters; /* forced with SetOutputFilters */ + const char *input_filters; /* forced with SetInputFilters */ + int accept_path_info; /* forced with AcceptPathInfo */ + + apr_hash_t *ct_output_filters; /* added with AddOutputFilterByType */ + + /* + * What attributes/data should be included in ETag generation? + */ + etag_components_t etag_bits; + etag_components_t etag_add; + etag_components_t etag_remove; + + /* + * Run-time performance tuning + */ +#define ENABLE_MMAP_OFF (0) +#define ENABLE_MMAP_ON (1) +#define ENABLE_MMAP_UNSET (2) + unsigned int enable_mmap : 2; /* whether files in this dir can be mmap'ed */ + +#define ENABLE_SENDFILE_OFF (0) +#define ENABLE_SENDFILE_ON (1) +#define ENABLE_SENDFILE_UNSET (2) + unsigned int enable_sendfile : 2; /* files in this dir can be mmap'ed */ + unsigned int allow_encoded_slashes : 1; /* URLs may contain %2f w/o being + * pitched indiscriminately */ +} core_dir_config; + +/* Per-server core configuration */ + +typedef struct { + +#ifdef GPROF + char *gprof_dir; +#endif + + /* Name translations --- we want the core to be able to do *something* + * so it's at least a minimally functional web server on its own (and + * can be tested that way). But let's keep it to the bare minimum: + */ + const char *ap_document_root; + + /* Access control */ + + char *access_name; + apr_array_header_t *sec_dir; + apr_array_header_t *sec_url; + + /* recursion backstopper */ + int redirect_limit; /* maximum number of internal redirects */ + int subreq_limit; /* maximum nesting level of subrequests */ + + /* TRACE control */ +#define AP_TRACE_UNSET -1 +#define AP_TRACE_DISABLE 0 +#define AP_TRACE_ENABLE 1 +#define AP_TRACE_EXTENDED 2 + int trace_enable; + +} core_server_config; + +/* for AddOutputFiltersByType in core.c */ +void ap_add_output_filters_by_type(request_rec *r); + +/* for http_config.c */ +void ap_core_reorder_directories(apr_pool_t *, server_rec *); + +/* for mod_perl */ +AP_CORE_DECLARE(void) ap_add_per_dir_conf(server_rec *s, void *dir_config); +AP_CORE_DECLARE(void) ap_add_per_url_conf(server_rec *s, void *url_config); +AP_CORE_DECLARE(void) ap_add_file_conf(core_dir_config *conf, void *url_config); +AP_CORE_DECLARE_NONSTD(const char *) ap_limit_section(cmd_parms *cmd, void *dummy, const char *arg); + +#endif + + +/* ---------------------------------------------------------------------- + * + * Runtime status/management + */ + +typedef enum { + ap_mgmt_type_string, + ap_mgmt_type_long, + ap_mgmt_type_hash +} ap_mgmt_type_e; + +typedef union { + const char *s_value; + long i_value; + apr_hash_t *h_value; +} ap_mgmt_value; + +typedef struct { + const char *description; + const char *name; + ap_mgmt_type_e vtype; + ap_mgmt_value v; +} ap_mgmt_item_t; + +/* Handles for core filters */ +extern AP_DECLARE_DATA ap_filter_rec_t *ap_subreq_core_filter_handle; +extern AP_DECLARE_DATA ap_filter_rec_t *ap_core_output_filter_handle; +extern AP_DECLARE_DATA ap_filter_rec_t *ap_content_length_filter_handle; +extern AP_DECLARE_DATA ap_filter_rec_t *ap_net_time_filter_handle; +extern AP_DECLARE_DATA ap_filter_rec_t *ap_core_input_filter_handle; + +/** + * This hook provdes a way for modules to provide metrics/statistics about + * their operational status. + * + * @param p A pool to use to create entries in the hash table + * @param val The name of the parameter(s) that is wanted. This is + * tree-structured would be in the form ('*' is all the tree, + * 'module.*' all of the module , 'module.foo.*', or + * 'module.foo.bar' ) + * @param ht The hash table to store the results. Keys are item names, and + * the values point to ap_mgmt_item_t structures. + * @ingroup hooks + */ +AP_DECLARE_HOOK(int, get_mgmt_items, + (apr_pool_t *p, const char * val, apr_hash_t *ht)) + +/* ---------------------------------------------------------------------- */ + +/* ---------------------------------------------------------------------- + * + * I/O logging with mod_logio + */ + +APR_DECLARE_OPTIONAL_FN(void, ap_logio_add_bytes_out, + (conn_rec *c, apr_off_t bytes)); + +/* ---------------------------------------------------------------------- */ + +#ifdef __cplusplus +} +#endif + +#endif /* !APACHE_HTTP_CORE_H */ diff --git a/rubbos/app/httpd-2.0.64/include/http_log.h b/rubbos/app/httpd-2.0.64/include/http_log.h new file mode 100644 index 00000000..52880585 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/include/http_log.h @@ -0,0 +1,334 @@ +/* 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. + */ + +#ifndef APACHE_HTTP_LOG_H +#define APACHE_HTTP_LOG_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "apr_thread_proc.h" + +/** + * @package Apache logging library + */ + +#ifdef HAVE_SYSLOG +#include + +#ifndef LOG_PRIMASK +#define LOG_PRIMASK 7 +#endif + +#define APLOG_EMERG LOG_EMERG /* system is unusable */ +#define APLOG_ALERT LOG_ALERT /* action must be taken immediately */ +#define APLOG_CRIT LOG_CRIT /* critical conditions */ +#define APLOG_ERR LOG_ERR /* error conditions */ +#define APLOG_WARNING LOG_WARNING /* warning conditions */ +#define APLOG_NOTICE LOG_NOTICE /* normal but significant condition */ +#define APLOG_INFO LOG_INFO /* informational */ +#define APLOG_DEBUG LOG_DEBUG /* debug-level messages */ + +#define APLOG_LEVELMASK LOG_PRIMASK /* mask off the level value */ + +#else + +#define APLOG_EMERG 0 /* system is unusable */ +#define APLOG_ALERT 1 /* action must be taken immediately */ +#define APLOG_CRIT 2 /* critical conditions */ +#define APLOG_ERR 3 /* error conditions */ +#define APLOG_WARNING 4 /* warning conditions */ +#define APLOG_NOTICE 5 /* normal but significant condition */ +#define APLOG_INFO 6 /* informational */ +#define APLOG_DEBUG 7 /* debug-level messages */ + +#define APLOG_LEVELMASK 7 /* mask off the level value */ + +#endif + +/* APLOG_NOERRNO is ignored and should not be used. It will be + * removed in a future release of Apache. + */ +#define APLOG_NOERRNO (APLOG_LEVELMASK + 1) + +/* Use APLOG_TOCLIENT on ap_log_rerror() to give content + * handlers the option of including the error text in the + * ErrorDocument sent back to the client. Setting APLOG_TOCLIENT + * will cause the error text to be saved in the request_rec->notes + * table, keyed to the string "error-notes", if and only if: + * - the severity level of the message is APLOG_WARNING or greater + * - there are no other "error-notes" set in request_rec->notes + * Once error-notes is set, it is up to the content handler to + * determine whether this text should be sent back to the client. + * Note: Client generated text streams sent back to the client MUST + * be escaped to prevent CSS attacks. + */ +#define APLOG_TOCLIENT ((APLOG_LEVELMASK + 1) * 2) + +/* normal but significant condition on startup, usually printed to stderr */ +#define APLOG_STARTUP ((APLOG_LEVELMASK + 1) * 4) + +#ifndef DEFAULT_LOGLEVEL +#define DEFAULT_LOGLEVEL APLOG_WARNING +#endif + +extern int AP_DECLARE_DATA ap_default_loglevel; + +#define APLOG_MARK __FILE__,__LINE__ + +/** + * Set up for logging to stderr. + * @param p The pool to allocate out of + */ +AP_DECLARE(void) ap_open_stderr_log(apr_pool_t *p); + +/** + * Replace logging to stderr with logging to the given file. + * @param p The pool to allocate out of + * @param file Name of the file to log stderr output + */ +AP_DECLARE(apr_status_t) ap_replace_stderr_log(apr_pool_t *p, + const char *file); + +/** + * Open the error log and replace stderr with it. + * @param pconf Not used + * @param plog The pool to allocate the logs from + * @param ptemp Pool used for temporary allocations + * @param s_main The main server + * @tip ap_open_logs isn't expected to be used by modules, it is + * an internal core function + */ +int ap_open_logs(apr_pool_t *pconf, apr_pool_t *plog, + apr_pool_t *ptemp, server_rec *s_main); + +#ifdef CORE_PRIVATE + +/** + * Perform special processing for piped loggers in MPM child + * processes. + * @param p Not used + * @param s Not used + * @tip ap_logs_child_init is not for use by modules; it is an + * internal core function + */ +void ap_logs_child_init(apr_pool_t *p, server_rec *s); + +#endif /* CORE_PRIVATE */ + +/* + * The primary logging functions, ap_log_error, ap_log_rerror, ap_log_cerror, + * and ap_log_perror use a printf style format string to build the log message. + * It is VERY IMPORTANT that you not include any raw data from the network, + * such as the request-URI or request header fields, within the format + * string. Doing so makes the server vulnerable to a denial-of-service + * attack and other messy behavior. Instead, use a simple format string + * like "%s", followed by the string containing the untrusted data. + */ + +/** + * ap_log_error() - log messages which are not related to a particular + * request or connection. This uses a printf-like format to log messages + * to the error_log. + * @param file The file in which this function is called + * @param line The line number on which this function is called + * @param level The level of this error message + * @param status The status code from the previous command + * @param s The server on which we are logging + * @param fmt The format string + * @param ... The arguments to use to fill out fmt. + * @tip Use APLOG_MARK to fill out file and line + * @tip If a request_rec is available, use that with ap_log_rerror() + * in preference to calling this function. Otherwise, if a conn_rec is + * available, use that with ap_log_cerror() in preference to calling + * this function. + * @warning It is VERY IMPORTANT that you not include any raw data from + * the network, such as the request-URI or request header fields, within + * the format string. Doing so makes the server vulnerable to a + * denial-of-service attack and other messy behavior. Instead, use a + * simple format string like "%s", followed by the string containing the + * untrusted data. + * @deffunc void ap_log_error(const char *file, int line, int level, apr_status_t status, const server_rec *s, const char *fmt, ...) + */ +AP_DECLARE(void) ap_log_error(const char *file, int line, int level, + apr_status_t status, const server_rec *s, + const char *fmt, ...) + __attribute__((format(printf,6,7))); + +/** + * ap_log_perror() - log messages which are not related to a particular + * request, connection, or virtual server. This uses a printf-like + * format to log messages to the error_log. + * @param file The file in which this function is called + * @param line The line number on which this function is called + * @param level The level of this error message + * @param status The status code from the previous command + * @param p The pool which we are logging for + * @param fmt The format string + * @param ... The arguments to use to fill out fmt. + * @tip Use APLOG_MARK to fill out file and line + * @warning It is VERY IMPORTANT that you not include any raw data from + * the network, such as the request-URI or request header fields, within + * the format string. Doing so makes the server vulnerable to a + * denial-of-service attack and other messy behavior. Instead, use a + * simple format string like "%s", followed by the string containing the + * untrusted data. + * @deffunc void ap_log_perror(const char *file, int line, int level, apr_status_t status, apr_pool_t *p, const char *fmt, ...) + */ +AP_DECLARE(void) ap_log_perror(const char *file, int line, int level, + apr_status_t status, apr_pool_t *p, + const char *fmt, ...) + __attribute__((format(printf,6,7))); + +/** + * ap_log_rerror() - log messages which are related to a particular + * request. This uses a a printf-like format to log messages to the + * error_log. + * @param file The file in which this function is called + * @param line The line number on which this function is called + * @param level The level of this error message + * @param status The status code from the previous command + * @param r The request which we are logging for + * @param fmt The format string + * @param ... The arguments to use to fill out fmt. + * @tip Use APLOG_MARK to fill out file and line + * @warning It is VERY IMPORTANT that you not include any raw data from + * the network, such as the request-URI or request header fields, within + * the format string. Doing so makes the server vulnerable to a + * denial-of-service attack and other messy behavior. Instead, use a + * simple format string like "%s", followed by the string containing the + * untrusted data. + * @deffunc void ap_log_rerror(const char *file, int line, int level, apr_status_t status, const request_rec *r, const char *fmt, ...) + */ +AP_DECLARE(void) ap_log_rerror(const char *file, int line, int level, + apr_status_t status, const request_rec *r, + const char *fmt, ...) + __attribute__((format(printf,6,7))); + +/** + * ap_log_cerror() - log messages which are related to a particular + * connection. This uses a a printf-like format to log messages to the + * error_log. + * @param file The file in which this function is called + * @param line The line number on which this function is called + * @param level The level of this error message + * @param status The status code from the previous command + * @param c The connection which we are logging for + * @param fmt The format string + * @param ... The arguments to use to fill out fmt. + * @tip Use APLOG_MARK to fill out file and line + * @tip If a request_rec is available, use that with ap_log_rerror() + * in preference to calling this function. + * @warning It is VERY IMPORTANT that you not include any raw data from + * the network, such as the request-URI or request header fields, within + * the format string. Doing so makes the server vulnerable to a + * denial-of-service attack and other messy behavior. Instead, use a + * simple format string like "%s", followed by the string containing the + * untrusted data. + * @note ap_log_cerror() is available starting with Apache 2.0.55. + * @deffunc void ap_log_cerror(const char *file, int line, int level, apr_status_t status, const conn_rec *c, const char *fmt, ...) + */ +AP_DECLARE(void) ap_log_cerror(const char *file, int line, int level, + apr_status_t status, const conn_rec *c, + const char *fmt, ...) + __attribute__((format(printf,6,7))); + +/** + * Convert stderr to the error log + * @param s The current server + * @deffunc void ap_error_log2stderr(server_rec *s) + */ +AP_DECLARE(void) ap_error_log2stderr(server_rec *s); + +/** + * Log the current pid of the parent process + * @param p The pool to use for logging + * @param fname The name of the file to log to + */ +AP_DECLARE(void) ap_log_pid(apr_pool_t *p, const char *fname); + +/** + * Retrieve the pid from a pidfile. + * @param p The pool to use for logging + * @param filename The name of the file containing the pid + * @param mypid Pointer to pid_t (valid only if return APR_SUCCESS) + */ +AP_DECLARE(apr_status_t) ap_read_pid(apr_pool_t *p, const char *filename, pid_t *mypid); + +typedef struct piped_log piped_log; + +/** + * The piped logging structure. Piped logs are used to move functionality + * out of the main server. For example, log rotation is done with piped logs. + */ +struct piped_log { + /** The pool to use for the piped log */ + apr_pool_t *p; + /** The pipe between the server and the logging process */ + apr_file_t *fds[2]; + /* XXX - an #ifdef that needs to be eliminated from public view. Shouldn't + * be hard */ +#ifdef AP_HAVE_RELIABLE_PIPED_LOGS + /** The name of the program the logging process is running */ + char *program; + /** The pid of the logging process */ + apr_proc_t *pid; +#endif +}; + +/** + * Open the piped log process + * @param p The pool to allocate out of + * @param program The program to run in the logging process + * @return The piped log structure + * @deffunc piped_log *ap_open_piped_log(apr_pool_t *p, const char *program) + */ +AP_DECLARE(piped_log *) ap_open_piped_log(apr_pool_t *p, const char *program); + +/** + * Close the piped log and kill the logging process + * @param pl The piped log structure + * @deffunc void ap_close_piped_log(piped_log *pl) + */ +AP_DECLARE(void) ap_close_piped_log(piped_log *pl); + +/** + * A macro to access the read side of the piped log pipe + * @param pl The piped log structure + * @return The native file descriptor + * @deffunc ap_piped_log_read_fd(pl) + */ +#define ap_piped_log_read_fd(pl) ((pl)->fds[0]) + +/** + * A macro to access the write side of the piped log pipe + * @param pl The piped log structure + * @return The native file descriptor + * @deffunc ap_piped_log_read_fd(pl) + */ +#define ap_piped_log_write_fd(pl) ((pl)->fds[1]) + +AP_DECLARE_HOOK(void, error_log, (const char *file, int line, int level, + apr_status_t status, const server_rec *s, + const request_rec *r, apr_pool_t *pool, + const char *errstr)) + +#ifdef __cplusplus +} +#endif + +#endif /* !APACHE_HTTP_LOG_H */ diff --git a/rubbos/app/httpd-2.0.64/include/http_main.h b/rubbos/app/httpd-2.0.64/include/http_main.h new file mode 100644 index 00000000..cc4ce59d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/include/http_main.h @@ -0,0 +1,58 @@ +/* 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. + */ + +#ifndef APACHE_HTTP_MAIN_H +#define APACHE_HTTP_MAIN_H + +#include "apr_optional.h" + +/* AP_SERVER_BASEARGS is the command argument list parsed by http_main.c + * in apr_getopt() format. Use this for default'ing args that the MPM + * can safely ignore and pass on from its rewrite_args() handler. + */ +#define AP_SERVER_BASEARGS "C:c:D:d:E:e:f:vVlLtSh?X" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @package Command line options + */ + +/** The name of the Apache executable */ +AP_DECLARE_DATA extern const char *ap_server_argv0; +/** The global server's ServerRoot */ +AP_DECLARE_DATA extern const char *ap_server_root; + +/* for -C, -c and -D switches */ +/** An array of all -C directives. These are processed before the server's + * config file */ +AP_DECLARE_DATA extern apr_array_header_t *ap_server_pre_read_config; +/** An array of all -c directives. These are processed after the server's + * config file */ +AP_DECLARE_DATA extern apr_array_header_t *ap_server_post_read_config; +/** An array of all -D defines on the command line. This allows people to + * effect the server based on command line options */ +AP_DECLARE_DATA extern apr_array_header_t *ap_server_config_defines; + +APR_DECLARE_OPTIONAL_FN(int, ap_signal_server, (int *, apr_pool_t *)); + +#ifdef __cplusplus +} +#endif + +#endif /* !APACHE_HTTP_MAIN_H */ diff --git a/rubbos/app/httpd-2.0.64/include/http_protocol.h b/rubbos/app/httpd-2.0.64/include/http_protocol.h new file mode 100644 index 00000000..6287589f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/include/http_protocol.h @@ -0,0 +1,697 @@ +/* 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. + */ + +#ifndef APACHE_HTTP_PROTOCOL_H +#define APACHE_HTTP_PROTOCOL_H + +#include "httpd.h" +#include "apr_hooks.h" +#include "apr_portable.h" +#include "apr_mmap.h" +#include "apr_buckets.h" +#include "util_filter.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @package HTTP protocol handling + */ + +/** + * This hook allows modules to insert filters for the current error response + * @param r the current request + * @ingroup hooks + */ +AP_DECLARE_HOOK(void,insert_error_filter,(request_rec *r)) + +/* This is an optimization. We keep a record of the filter_rec that + * stores the old_write filter, so that we can avoid strcmp's later. + */ +AP_DECLARE_DATA extern ap_filter_rec_t *ap_old_write_func; + +/* + * Prototypes for routines which either talk directly back to the user, + * or control the ones that eventually do. + */ + +/** + * Read a request and fill in the fields. + * @param c The current connection + * @return The new request_rec + */ +request_rec *ap_read_request(conn_rec *c); + +/** + * Read the mime-encoded headers. + * @param r The current request + */ +AP_DECLARE(void) ap_get_mime_headers(request_rec *r); + +/** + * Optimized version of ap_get_mime_headers() that requires a + * temporary brigade to work with + * @param r The current request + * @param bb temp brigade + */ +AP_DECLARE(void) ap_get_mime_headers_core(request_rec *r, + apr_bucket_brigade *bb); + +/* Finish up stuff after a request */ + +/** + * Called at completion of sending the response. It sends the terminating + * protocol information. + * @param r The current request + * @deffunc void ap_finalize_request_protocol(request_rec *r) + */ +AP_DECLARE(void) ap_finalize_request_protocol(request_rec *r); + +/** + * Send error back to client. + * @param r The current request + * @param recursive_error last arg indicates error status in case we get + * an error in the process of trying to deal with an ErrorDocument + * to handle some other error. In that case, we print the default + * report for the first thing that went wrong, and more briefly report + * on the problem with the ErrorDocument. + * @deffunc void ap_send_error_response(request_rec *r, int recursive_error) + */ +AP_DECLARE(void) ap_send_error_response(request_rec *r, int recursive_error); + +/* Set last modified header line from the lastmod date of the associated file. + * Also, set content length. + * + * May return an error status, typically HTTP_NOT_MODIFIED (that when the + * permit_cache argument is set to one). + */ + +/** + * Set the content length for this request + * @param r The current request + * @param length The new content length + * @deffunc void ap_set_content_length(request_rec *r, apr_off_t length) + */ +AP_DECLARE(void) ap_set_content_length(request_rec *r, apr_off_t length); + +/** + * Set the keepalive status for this request + * @param r The current request + * @return 1 if keepalive can be set, 0 otherwise + * @deffunc int ap_set_keepalive(request_rec *r) + */ +AP_DECLARE(int) ap_set_keepalive(request_rec *r); + +/** + * Return the latest rational time from a request/mtime pair. Mtime is + * returned unless it's in the future, in which case we return the current time. + * @param r The current request + * @param mtime The last modified time + * @return the latest rational time. + * @deffunc apr_time_t ap_rationalize_mtime(request_rec *r, apr_time_t mtime) + */ +AP_DECLARE(apr_time_t) ap_rationalize_mtime(request_rec *r, apr_time_t mtime); + +/** + * Build the content-type that should be sent to the client from the + * content-type specified. The following rules are followed: + * - if type is NULL, type is set to ap_default_type(r) + * - if charset adding is disabled, stop processing and return type. + * - then, if there are no parameters on type, add the default charset + * - return type + * @param r The current request + * @return The content-type + * @deffunc const char *ap_make_content_type(request_rec *r, const char *type); + */ +AP_DECLARE(const char *) ap_make_content_type(request_rec *r, + const char *type); + +#ifdef CORE_PRIVATE +/** + * Precompile metadata structures used by ap_make_content_type() + * @param r The pool to use for allocations + * @deffunc void ap_setup_make_content_type(apr_pool_t *pool) + */ +AP_DECLARE(void) ap_setup_make_content_type(apr_pool_t *pool); +#endif /* CORE_PRIVATE */ + +/** + * Construct an entity tag from the resource information. If it's a real + * file, build in some of the file characteristics. + * @param r The current request + * @param force_weak Force the entity tag to be weak - it could be modified + * again in as short an interval. + * @return The entity tag + * @deffunc char *ap_make_etag(request_rec *r, int force_weak) + */ +AP_DECLARE(char *) ap_make_etag(request_rec *r, int force_weak); + +/** + * Set the E-tag outgoing header + * @param The current request + * @deffunc void ap_set_etag(request_rec *r) + */ +AP_DECLARE(void) ap_set_etag(request_rec *r); + +/** + * Set the last modified time for the file being sent + * @param r The current request + * @deffunc void ap_set_last_modified(request_rec *r) + */ +AP_DECLARE(void) ap_set_last_modified(request_rec *r); + +/** + * Implements condition GET rules for HTTP/1.1 specification. This function + * inspects the client headers and determines if the response fulfills + * the requirements specified. + * @param r The current request + * @return OK if the response fulfills the condition GET rules, some + * other status code otherwise + * @deffunc int ap_meets_conditions(request_rec *r) + */ +AP_DECLARE(int) ap_meets_conditions(request_rec *r); + +/* Other ways to send stuff at the client. All of these keep track + * of bytes_sent automatically. This indirection is intended to make + * it a little more painless to slide things like HTTP-NG packetization + * underneath the main body of the code later. In the meantime, it lets + * us centralize a bit of accounting (bytes_sent). + * + * These also return the number of bytes written by the call. + * They should only be called with a timeout registered, for obvious reaasons. + * (Ditto the send_header stuff). + */ + +/** + * Send an entire file to the client, using sendfile if supported by the + * current platform + * @param fd The file to send. + * @param r The current request + * @param offset Offset into the file to start sending. + * @param length Amount of data to send + * @param nbytes Amount of data actually sent + * @deffunc apr_status_t ap_send_fd(apr_file_t *fd, request_rec *r, apr_off_t offset, apr_size_t length, apr_size_t *nbytes); + */ +AP_DECLARE(apr_status_t) ap_send_fd(apr_file_t *fd, request_rec *r, apr_off_t offset, + apr_size_t length, apr_size_t *nbytes); + +#if APR_HAS_MMAP +/** + * Send an MMAP'ed file to the client + * @param mm The MMAP'ed file to send + * @param r The current request + * @param offset The offset into the MMAP to start sending + * @param length The amount of data to send + * @return The number of bytes sent + * @deffunc size_t ap_send_mmap(apr_mmap_t *mm, request_rec *r, size_t offset, size_t length) + */ +AP_DECLARE(size_t) ap_send_mmap(apr_mmap_t *mm, request_rec *r, size_t offset, + size_t length); +#endif + + +/** + * Register a new request method, and return the offset that will be + * associated with that method. + * + * @param p The pool to create registered method numbers from. + * @param methname The name of the new method to register. + * @return Ab int value representing an offset into a bitmask. + */ +AP_DECLARE(int) ap_method_register(apr_pool_t *p, const char *methname); + +/** + * Initialize the method_registry and allocate memory for it. + * + * @param p Pool to allocate memory for the registry from. + */ +AP_DECLARE(void) ap_method_registry_init(apr_pool_t *p); + +/* + * This is a convenience macro to ease with checking a mask + * against a method name. + */ +#define AP_METHOD_CHECK_ALLOWED(mask, methname) \ + ((mask) & (AP_METHOD_BIT << ap_method_number_of((methname)))) + +/** + * Create a new method list with the specified number of preallocated + * slots for extension methods. + * + * @param p Pointer to a pool in which the structure should be + * allocated. + * @param nelts Number of preallocated extension slots + * @return Pointer to the newly created structure. + * @deffunc ap_method_list_t ap_make_method_list(apr_pool_t *p, int nelts) + */ +AP_DECLARE(ap_method_list_t *) ap_make_method_list(apr_pool_t *p, int nelts); +AP_DECLARE(void) ap_copy_method_list(ap_method_list_t *dest, + ap_method_list_t *src); +AP_DECLARE_NONSTD(void) ap_method_list_do(int (*comp) (void *urec, const char *mname, + int mnum), + void *rec, + const ap_method_list_t *ml, ...); +AP_DECLARE(void) ap_method_list_vdo(int (*comp) (void *urec, const char *mname, + int mnum), + void *rec, const ap_method_list_t *ml, + va_list vp); +/** + * Search for an HTTP method name in an ap_method_list_t structure, and + * return true if found. + * + * @param method String containing the name of the method to check. + * @param l Pointer to a method list, such as cmd->methods_limited. + * @return 1 if method is in the list, otherwise 0 + * @deffunc int ap_method_in_list(const char *method, ap_method_list_t *l) + */ +AP_DECLARE(int) ap_method_in_list(ap_method_list_t *l, const char *method); + +/** + * Add an HTTP method name to an ap_method_list_t structure if it isn't + * already listed. + * + * @param method String containing the name of the method to check. + * @param l Pointer to a method list, such as cmd->methods_limited. + * @return None. + * @deffunc void ap_method_in_list(ap_method_list_t *l, const char *method) + */ +AP_DECLARE(void) ap_method_list_add(ap_method_list_t *l, const char *method); + +/** + * Remove an HTTP method name from an ap_method_list_t structure. + * + * @param l Pointer to a method list, such as cmd->methods_limited. + * @param method String containing the name of the method to remove. + * @return None. + * @deffunc void ap_method_list_remove(ap_method_list_t *l, const char *method) + */ +AP_DECLARE(void) ap_method_list_remove(ap_method_list_t *l, + const char *method); + +/** + * Reset a method list to be completely empty. + * + * @param l Pointer to a method list, such as cmd->methods_limited. + * @return None. + * @deffunc void ap_clear_method_list(ap_method_list_t *l) + */ +AP_DECLARE(void) ap_clear_method_list(ap_method_list_t *l); + +/** + * Set the content type for this request (r->content_type). + * @param r The current request + * @param ct The new content type + * @deffunc void ap_set_content_type(request_rec *r, const char* ct) + * @warning This function must be called to set r->content_type in order + * for the AddOutputFilterByType directive to work correctly. + */ +AP_DECLARE(void) ap_set_content_type(request_rec *r, const char *ct); + +/* Hmmm... could macrofy these for now, and maybe forever, though the + * definitions of the macros would get a whole lot hairier. + */ + +/** + * Output one character for this request + * @param c the character to output + * @param r the current request + * @return The number of bytes sent + * @deffunc int ap_rputc(int c, request_rec *r) + */ +AP_DECLARE(int) ap_rputc(int c, request_rec *r); + +/** + * Output a string for the current request + * @param str The string to output + * @param r The current request + * @return The number of bytes sent + * @deffunc int ap_rputs(const char *str, request_rec *r) + */ +AP_DECLARE(int) ap_rputs(const char *str, request_rec *r); + +/** + * Write a buffer for the current request + * @param buf The buffer to write + * @param nbyte The number of bytes to send from the buffer + * @param r The current request + * @return The number of bytes sent + * @deffunc int ap_rwrite(const void *buf, int nbyte, request_rec *r) + */ +AP_DECLARE(int) ap_rwrite(const void *buf, int nbyte, request_rec *r); + +/** + * Write an unspecified number of strings to the request + * @param r The current request + * @param ... The strings to write + * @return The number of bytes sent + * @deffunc int ap_rvputs(request_rec *r, ...) + */ +AP_DECLARE_NONSTD(int) ap_rvputs(request_rec *r,...); + +/** + * Output data to the client in a printf format + * @param r The current request + * @param fmt The format string + * @param vlist The arguments to use to fill out the format string + * @return The number of bytes sent + * @deffunc int ap_vrprintf(request_rec *r, const char *fmt, va_list vlist) + */ +AP_DECLARE(int) ap_vrprintf(request_rec *r, const char *fmt, va_list vlist); + +/** + * Output data to the client in a printf format + * @param r The current request + * @param fmt The format string + * @param ... The arguments to use to fill out the format string + * @return The number of bytes sent + * @deffunc int ap_rprintf(request_rec *r, const char *fmt, ...) + */ +AP_DECLARE_NONSTD(int) ap_rprintf(request_rec *r, const char *fmt,...) + __attribute__((format(printf,2,3))); +/** + * Flush all of the data for the current request to the client + * @param r The current request + * @return The number of bytes sent + * @deffunc int ap_rflush(request_rec *r) + */ +AP_DECLARE(int) ap_rflush(request_rec *r); + +/** + * Index used in custom_responses array for a specific error code + * (only use outside protocol.c is in getting them configured). + * @param status HTTP status code + * @return The index of the response + * @deffunc int ap_index_of_response(int status) + */ +AP_DECLARE(int) ap_index_of_response(int status); + +/** + * Return the Status-Line for a given status code (excluding the + * HTTP-Version field). If an invalid or unknown status code is + * passed, "500 Internal Server Error" will be returned. + * @param status The HTTP status code + * @return The Status-Line + * @deffunc const char *ap_get_status_line(int status) + */ +AP_DECLARE(const char *) ap_get_status_line(int status); + +/* Reading a block of data from the client connection (e.g., POST arg) */ + +/** + * Setup the client to allow Apache to read the request body. + * @param r The current request + * @param read_policy How the server should interpret a chunked + * transfer-encoding. One of:
    + *    REQUEST_NO_BODY          Send 413 error if message has any body
    + *    REQUEST_CHUNKED_ERROR    Send 411 error if body without Content-Length
    + *    REQUEST_CHUNKED_DECHUNK  If chunked, remove the chunks for me.
    + * 
    + * @return either OK or an error code + * @deffunc int ap_setup_client_block(request_rec *r, int read_policy) + */ +AP_DECLARE(int) ap_setup_client_block(request_rec *r, int read_policy); + +/** + * Determine if the client has sent any data. This also sends a + * 100 Continue response to HTTP/1.1 clients, so modules should not be called + * until the module is ready to read content. + * @warning Never call this function more than once. + * @param r The current request + * @return 0 if there is no message to read, 1 otherwise + * @deffunc int ap_should_client_block(request_rec *r) + */ +AP_DECLARE(int) ap_should_client_block(request_rec *r); + +/** + * Call this in a loop. It will put data into a buffer and return the length + * of the input block + * @param r The current request + * @param buffer The buffer in which to store the data + * @param bufsiz The size of the buffer + * @return Number of bytes inserted into the buffer. When done reading, 0 + * if EOF, or -1 if there was an error + * @deffunc long ap_get_client_block(request_rec *r, char *buffer, apr_size_t bufsiz) + */ +AP_DECLARE(long) ap_get_client_block(request_rec *r, char *buffer, apr_size_t bufsiz); + +/** + * In HTTP/1.1, any method can have a body. However, most GET handlers + * wouldn't know what to do with a request body if they received one. + * This helper routine tests for and reads any message body in the request, + * simply discarding whatever it receives. We need to do this because + * failing to read the request body would cause it to be interpreted + * as the next request on a persistent connection. + * @param r The current request + * @return error status if request is malformed, OK otherwise + * @deffunc int ap_discard_request_body(request_rec *r) + */ +AP_DECLARE(int) ap_discard_request_body(request_rec *r); + + +/** + * Setup the output headers so that the client knows how to authenticate + * itself the next time, if an authentication request failed. This function + * works for both basic and digest authentication + * @param r The current request + * @deffunc void ap_note_auth_failure(request_rec *r) + */ +AP_DECLARE(void) ap_note_auth_failure(request_rec *r); + +/** + * Setup the output headers so that the client knows how to authenticate + * itself the next time, if an authentication request failed. This function + * works only for basic authentication + * @param r The current request + * @deffunc void ap_note_basic_auth_failure(request_rec *r) + */ +AP_DECLARE(void) ap_note_basic_auth_failure(request_rec *r); + +/** + * Setup the output headers so that the client knows how to authenticate + * itself the next time, if an authentication request failed. This function + * works only for digest authentication + * @param r The current request + * @deffunc void ap_note_digest_auth_failure(request_rec *r) + */ +AP_DECLARE(void) ap_note_digest_auth_failure(request_rec *r); + +/** + * Get the password from the request headers + * @param r The current request + * @param pw The password as set in the headers + * @return 0 (OK) if it set the 'pw' argument (and assured + * a correct value in r->user); otherwise it returns + * an error code, either HTTP_INTERNAL_SERVER_ERROR if things are + * really confused, HTTP_UNAUTHORIZED if no authentication at all + * seemed to be in use, or DECLINED if there was authentication but + * it wasn't Basic (in which case, the caller should presumably + * decline as well). + * @deffunc int ap_get_basic_auth_pw(request_rec *r, const char **pw) + */ +AP_DECLARE(int) ap_get_basic_auth_pw(request_rec *r, const char **pw); + +/** + * parse_uri: break apart the uri + * @warning Side Effects:
    + *    - sets r->args to rest after '?' (or NULL if no '?')
    + *    - sets r->uri to request uri (without r->args part)
    + *    - sets r->hostname (if not set already) from request (scheme://host:port)
    + * 
    + * @param r The current request + * @param uri The uri to break apart + * @deffunc void ap_parse_uri(request_rec *r, const char *uri) + */ +AP_CORE_DECLARE(void) ap_parse_uri(request_rec *r, const char *uri); + +/** + * Get the next line of input for the request + * @param s The buffer into which to read the line + * @param n The size of the buffer + * @param r The request + * @param fold Whether to merge continuation lines + * @return The length of the line, if successful + * n, if the line is too big to fit in the buffer + * -1 for miscellaneous errors + * @deffunc int ap_method_number_of(const char *method) + */ +AP_DECLARE(int) ap_getline(char *s, int n, request_rec *r, int fold); + +/** + * Get the next line of input for the request + * + * Note: on ASCII boxes, ap_rgetline is a macro which simply calls + * ap_rgetline_core to get the line of input. + * + * on EBCDIC boxes, ap_rgetline is a wrapper function which + * translates ASCII protocol lines to the local EBCDIC code page + * after getting the line of input. + * + * @param s Pointer to the pointer to the buffer into which the line + * should be read; if *s==NULL, a buffer of the necessary size + * to hold the data will be allocated from the request pool + * @param n The size of the buffer + * @param read The length of the line. + * @param r The request + * @param fold Whether to merge continuation lines + * @param bb Working brigade to use when reading buckets + * @return APR_SUCCESS, if successful + * APR_ENOSPC, if the line is too big to fit in the buffer + * Other errors where appropriate + */ +#if APR_CHARSET_EBCDIC +AP_DECLARE(apr_status_t) ap_rgetline(char **s, apr_size_t n, + apr_size_t *read, + request_rec *r, int fold, + apr_bucket_brigade *bb); +#else /* ASCII box */ +#define ap_rgetline(s, n, read, r, fold, bb) \ + ap_rgetline_core((s), (n), (read), (r), (fold), (bb)) +#endif +AP_DECLARE(apr_status_t) ap_rgetline_core(char **s, apr_size_t n, + apr_size_t *read, + request_rec *r, int fold, + apr_bucket_brigade *bb); + +/** + * Get the method number associated with the given string, assumed to + * contain an HTTP method. Returns M_INVALID if not recognized. + * @param method A string containing a valid HTTP method + * @return The method number + */ +AP_DECLARE(int) ap_method_number_of(const char *method); + +/** + * Get the method name associated with the given internal method + * number. Returns NULL if not recognized. + * @param p A pool to use for temporary allocations. + * @param methnum An integer value corresponding to an internal method number + * @return The name corresponding to the method number + */ +AP_DECLARE(const char *) ap_method_name_of(apr_pool_t *p, int methnum); + + + /* Hooks */ + /* + * post_read_request --- run right after read_request or internal_redirect, + * and not run during any subrequests. + */ +/** + * This hook allows modules to affect the request immediately after the request + * has been read, and before any other phases have been processes. This allows + * modules to make decisions based upon the input header fields + * @param r The current request + * @return OK or DECLINED + * @deffunc ap_run_post_read_request(request_rec *r) + */ +AP_DECLARE_HOOK(int,post_read_request,(request_rec *r)) + +/** + * This hook allows modules to perform any module-specific logging activities + * over and above the normal server things. + * @param r The current request + * @return OK, DECLINED, or HTTP_... + * @deffunc int ap_run_log_transaction(request_rec *r) + */ +AP_DECLARE_HOOK(int,log_transaction,(request_rec *r)) + +/** + * This hook allows modules to retrieve the http method from a request. This + * allows Apache modules to easily extend the methods that Apache understands + * @param r The current request + * @return The http method from the request + * @deffunc const char *ap_run_http_method(const request_rec *r) + */ +AP_DECLARE_HOOK(const char *,http_method,(const request_rec *r)) + +/** + * Return the default port from the current request + * @param r The current request + * @return The current port + * @deffunc apr_port_t ap_run_default_port(const request_rec *r) + */ +AP_DECLARE_HOOK(apr_port_t,default_port,(const request_rec *r)) + +typedef struct ap_bucket_error ap_bucket_error; + +/** + * A bucket referring to an HTTP error + * This bucket can be passed down the filter stack to indicate that an + * HTTP error occurred while running a filter. In order for this bucket + * to be used successfully, it MUST be sent as the first bucket in the + * first brigade to be sent from a given filter. + */ +struct ap_bucket_error { + /** Number of buckets using this memory */ + apr_bucket_refcount refcount; + /** The error code */ + int status; + /** The error string */ + const char *data; +}; + +AP_DECLARE_DATA extern const apr_bucket_type_t ap_bucket_type_error; + +/** + * Determine if a bucket is an error bucket + * @param e The bucket to inspect + * @return true or false + */ +#define AP_BUCKET_IS_ERROR(e) (e->type == &ap_bucket_type_error) + +/** + * Make the bucket passed in an error bucket + * @param b The bucket to make into an error bucket + * @param error The HTTP error code to put in the bucket. + * @param buf An optional error string to put in the bucket. + * @param p A pool to allocate out of. + * @return The new bucket, or NULL if allocation failed + * @deffunc apr_bucket *ap_bucket_error_make(apr_bucket *b, int error, const char *buf, apr_pool_t *p) + */ +AP_DECLARE(apr_bucket *) ap_bucket_error_make(apr_bucket *b, int error, + const char *buf, apr_pool_t *p); + +/** + * Create a bucket referring to an HTTP error. + * @param error The HTTP error code to put in the bucket. + * @param buf An optional error string to put in the bucket. + * @param p A pool to allocate the error string out of. + * @param list The bucket allocator from which to allocate the bucket + * @return The new bucket, or NULL if allocation failed + * @deffunc apr_bucket *ap_bucket_error_create(int error, const char *buf, apr_pool_t *p, apr_bucket_alloc_t *list) + */ +AP_DECLARE(apr_bucket *) ap_bucket_error_create(int error, const char *buf, + apr_pool_t *p, + apr_bucket_alloc_t *list); + +AP_DECLARE_NONSTD(apr_status_t) ap_byterange_filter(ap_filter_t *f, apr_bucket_brigade *b); +AP_DECLARE_NONSTD(apr_status_t) ap_http_header_filter(ap_filter_t *f, apr_bucket_brigade *b); +AP_DECLARE_NONSTD(apr_status_t) ap_content_length_filter(ap_filter_t *, + apr_bucket_brigade *); +AP_DECLARE_NONSTD(apr_status_t) ap_old_write_filter(ap_filter_t *f, apr_bucket_brigade *b); + +/* + * Setting up the protocol fields for subsidiary requests... + * Also, a wrapup function to keep the internal accounting straight. + */ +AP_DECLARE(void) ap_set_sub_req_protocol(request_rec *rnew, const request_rec *r); +AP_DECLARE(void) ap_finalize_sub_req_protocol(request_rec *sub_r); + +#ifdef __cplusplus +} +#endif + +#endif /* !APACHE_HTTP_PROTOCOL_H */ diff --git a/rubbos/app/httpd-2.0.64/include/http_request.h b/rubbos/app/httpd-2.0.64/include/http_request.h new file mode 100644 index 00000000..c10e44db --- /dev/null +++ b/rubbos/app/httpd-2.0.64/include/http_request.h @@ -0,0 +1,373 @@ +/* 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. + */ + +#ifndef APACHE_HTTP_REQUEST_H +#define APACHE_HTTP_REQUEST_H + +#include "apr_hooks.h" +#include "util_filter.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define AP_SUBREQ_NO_ARGS 0 +#define AP_SUBREQ_MERGE_ARGS 1 + +/** + * @file http_request.h + * @brief Apache Request library + */ + +/* http_request.c is the code which handles the main line of request + * processing, once a request has been read in (finding the right per- + * directory configuration, building it if necessary, and calling all + * the module dispatch functions in the right order). + * + * The pieces here which are public to the modules, allow them to learn + * how the server would handle some other file or URI, or perhaps even + * direct the server to serve that other file instead of the one the + * client requested directly. + * + * There are two ways to do that. The first is the sub_request mechanism, + * which handles looking up files and URIs as adjuncts to some other + * request (e.g., directory entries for multiviews and directory listings); + * the lookup functions stop short of actually running the request, but + * (e.g., for includes), a module may call for the request to be run + * by calling run_sub_req. The space allocated to create sub_reqs can be + * reclaimed by calling destroy_sub_req --- be sure to copy anything you care + * about which was allocated in its apr_pool_t elsewhere before doing this. + */ + +/** + * An internal handler used by the ap_process_request, all subrequest mechanisms + * and the redirect mechanism. + * @param r The request, subrequest or internal redirect to pre-process + * @return The return code for the request + */ +AP_DECLARE(int) ap_process_request_internal(request_rec *r); + +/** + * Create a subrequest from the given URI. This subrequest can be + * inspected to find information about the requested URI + * @param new_uri The URI to lookup + * @param r The current request + * @param next_filter The first filter the sub_request should use. If this is + * NULL, it defaults to the first filter for the main request + * @return The new request record + * @deffunc request_rec * ap_sub_req_lookup_uri(const char *new_uri, const request_rec *r) + */ +AP_DECLARE(request_rec *) ap_sub_req_lookup_uri(const char *new_uri, + const request_rec *r, + ap_filter_t *next_filter); + +/** + * Create a subrequest for the given file. This subrequest can be + * inspected to find information about the requested file + * @param new_file The file to lookup + * @param r The current request + * @param next_filter The first filter the sub_request should use. If this is + * NULL, it defaults to the first filter for the main request + * @return The new request record + * @deffunc request_rec * ap_sub_req_lookup_file(const char *new_file, const request_rec *r) + */ +AP_DECLARE(request_rec *) ap_sub_req_lookup_file(const char *new_file, + const request_rec *r, + ap_filter_t *next_filter); +/** + * Create a subrequest for the given apr_dir_read result. This subrequest + * can be inspected to find information about the requested file + * @param finfo The apr_dir_read result to lookup + * @param r The current request + * @param subtype What type of subrequest to perform, one of; + *
    + *      AP_SUBREQ_NO_ARGS     ignore r->args and r->path_info
    + *      AP_SUBREQ_MERGE_ARGS  merge r->args and r->path_info
    + * 
    + * @param next_filter The first filter the sub_request should use. If this is + * NULL, it defaults to the first filter for the main request + * @return The new request record + * @deffunc request_rec * ap_sub_req_lookup_dirent(apr_finfo_t *finfo, int subtype, const request_rec *r) + * @tip The apr_dir_read flags value APR_FINFO_MIN|APR_FINFO_NAME flag is the + * minimum recommended query if the results will be passed to apr_dir_read. + * The file info passed must include the name, and must have the same relative + * directory as the current request. + */ +AP_DECLARE(request_rec *) ap_sub_req_lookup_dirent(const apr_finfo_t *finfo, + const request_rec *r, + int subtype, + ap_filter_t *next_filter); +/** + * Create a subrequest for the given URI using a specific method. This + * subrequest can be inspected to find information about the requested URI + * @param method The method to use in the new subrequest + * @param new_uri The URI to lookup + * @param r The current request + * @param next_filter The first filter the sub_request should use. If this is + * NULL, it defaults to the first filter for the main request + * @return The new request record + * @deffunc request_rec * ap_sub_req_method_uri(const char *method, const char *new_uri, const request_rec *r) + */ +AP_DECLARE(request_rec *) ap_sub_req_method_uri(const char *method, + const char *new_uri, + const request_rec *r, + ap_filter_t *next_filter); +/** + * An output filter to strip EOS buckets from sub-requests. This always + * has to be inserted at the end of a sub-requests filter stack. + * @param f The current filter + * @param bb The brigade to filter + * @deffunc apr_status_t ap_sub_req_output_filter(ap_filter_t *f, apr_bucket_brigade *bb) + */ +AP_CORE_DECLARE_NONSTD(apr_status_t) ap_sub_req_output_filter(ap_filter_t *f, + apr_bucket_brigade *bb); + +/** + * Run the handler for the subrequest + * @param r The subrequest to run + * @return The return code for the subrequest + * @deffunc int ap_run_sub_req(request_rec *r) + */ +AP_DECLARE(int) ap_run_sub_req(request_rec *r); + +/** + * Free the memory associated with a subrequest + * @param r The subrequest to finish + * @deffunc void ap_destroy_sub_req(request_rec *r) + */ +AP_DECLARE(void) ap_destroy_sub_req(request_rec *r); + +/* + * Then there's the case that you want some other request to be served + * as the top-level request INSTEAD of what the client requested directly. + * If so, call this from a handler, and then immediately return OK. + */ + +/** + * Redirect the current request to some other uri + * @param new_uri The URI to replace the current request with + * @param r The current request + * @deffunc void ap_internal_redirect(const char *new_uri, request_rec *r) + */ +AP_DECLARE(void) ap_internal_redirect(const char *new_uri, request_rec *r); + +/** + * This function is designed for things like actions or CGI scripts, when + * using AddHandler, and you want to preserve the content type across + * an internal redirect. + * @param new_uri The URI to replace the current request with. + * @param r The current request + * @deffunc void ap_internal_redirect_handler(const char *new_uri, request_rec *r) + */ +AP_DECLARE(void) ap_internal_redirect_handler(const char *new_uri, request_rec *r); + +/** + * Redirect the current request to a sub_req, merging the pools + * @param sub_req A subrequest created from this request + * @param r The current request + * @deffunc void ap_internal_fast_redirect(request_rec *sub_req, request_rec *r) + * @tip the sub_req's pool will be merged into r's pool, be very careful + * not to destroy this subrequest, it will be destroyed with the main request! + */ +AP_DECLARE(void) ap_internal_fast_redirect(request_rec *sub_req, request_rec *r); + +/** + * Can be used within any handler to determine if any authentication + * is required for the current request + * @param r The current request + * @return 1 if authentication is required, 0 otherwise + * @deffunc int ap_some_auth_required(request_rec *r) + */ +AP_DECLARE(int) ap_some_auth_required(request_rec *r); + +/** + * Determine if the current request is the main request or a subrequest + * @param r The current request + * @return 1 if this is the main request, 0 otherwise + * @deffunc int ap_is_initial_req(request_rec *r) + */ +AP_DECLARE(int) ap_is_initial_req(request_rec *r); + +/** + * Function to set the r->mtime field to the specified value if it's later + * than what's already there. + * @param r The current request + * @param dependency_time Time to set the mtime to + * @deffunc void ap_update_mtime(request_rec *r, apr_time_t dependency_mtime) + */ +AP_DECLARE(void) ap_update_mtime(request_rec *r, apr_time_t dependency_mtime); + +/** + * Add one or more methods to the list permitted to access the resource. + * Usually executed by the content handler before the response header is + * sent, but sometimes invoked at an earlier phase if a module knows it + * can set the list authoritatively. Note that the methods are ADDED + * to any already permitted unless the reset flag is non-zero. The + * list is used to generate the Allow response header field when it + * is needed. + * @param r The pointer to the request identifying the resource. + * @param reset Boolean flag indicating whether this list should + * completely replace any current settings. + * @param ... A NULL-terminated list of strings, each identifying a + * method name to add. + * @return None. + * @deffunc void ap_allow_methods(request_rec *r, int reset, ...) + */ +AP_DECLARE(void) ap_allow_methods(request_rec *r, int reset, ...); + +/** + * Add one or more methods to the list permitted to access the resource. + * Usually executed by the content handler before the response header is + * sent, but sometimes invoked at an earlier phase if a module knows it + * can set the list authoritatively. Note that the methods are ADDED + * to any already permitted unless the reset flag is non-zero. The + * list is used to generate the Allow response header field when it + * is needed. + * @param r The pointer to the request identifying the resource. + * @param reset Boolean flag indicating whether this list should + * completely replace any current settings. + * @param ... A list of method identifiers, from the "M_" series + * defined in httpd.h, terminated with a value of -1 + * (e.g., "M_GET, M_POST, M_OPTIONS, -1") + * @return None. + * @deffunc void ap_allow_standard_methods(request_rec *r, int reset, ...) + */ +AP_DECLARE(void) ap_allow_standard_methods(request_rec *r, int reset, ...); + +#define MERGE_ALLOW 0 +#define REPLACE_ALLOW 1 + +#ifdef CORE_PRIVATE +/* Function called by main.c to handle first-level request */ +void ap_process_request(request_rec *); +/** + * Kill the current request + * @param type Why the request is dieing + * @param r The current request + * @deffunc void ap_die(int type, request_rec *r) + */ +AP_DECLARE(void) ap_die(int type, request_rec *r); +#endif + +/* Hooks */ + +/** + * Gives modules a chance to create their request_config entry when the + * request is created. + * @param r The current request + * @ingroup hooks + */ +AP_DECLARE_HOOK(int,create_request,(request_rec *r)) + +/** + * This hook allow modules an opportunity to translate the URI into an + * actual filename. If no modules do anything special, the server's default + * rules will be followed. + * @param r The current request + * @return OK, DECLINED, or HTTP_... + * @ingroup hooks + */ +AP_DECLARE_HOOK(int,translate_name,(request_rec *r)) + +/** + * This hook allow modules to set the per_dir_config based on their own + * context (such as sections) and responds to contextless requests + * such as TRACE that need no security or filesystem mapping. + * based on the filesystem. + * @param r The current request + * @return DONE (or HTTP_) if this contextless request was just fulfilled + * (such as TRACE), OK if this is not a file, and DECLINED if this is a file. + * The core map_to_storage (HOOK_RUN_REALLY_LAST) will directory_walk + * and file_walk the r->filename. + * + * @ingroup hooks + */ +AP_DECLARE_HOOK(int,map_to_storage,(request_rec *r)) + +/** + * This hook is used to analyze the request headers, authenticate the user, + * and set the user information in the request record (r->user and + * r->ap_auth_type). This hook is only run when Apache determines that + * authentication/authorization is required for this resource (as determined + * by the 'Require' directive). It runs after the access_checker hook, and + * before the auth_checker hook. + * + * @param r The current request + * @return OK, DECLINED, or HTTP_... + * @ingroup hooks + */ +AP_DECLARE_HOOK(int,check_user_id,(request_rec *r)) + +/** + * Allows modules to perform module-specific fixing of header fields. This + * is invoked just before any content-handler + * @param r The current request + * @return OK, DECLINED, or HTTP_... + * @ingroup hooks + */ +AP_DECLARE_HOOK(int,fixups,(request_rec *r)) + +/** + * This routine is called to determine and/or set the various document type + * information bits, like Content-type (via r->content_type), language, et + * cetera. + * @param r the current request + * @return OK, DECLINED, or HTTP_... + * @ingroup hooks + */ +AP_DECLARE_HOOK(int,type_checker,(request_rec *r)) + +/** + * This hook is used to apply additional access control to this resource. + * It runs *before* a user is authenticated, so this hook is really to + * apply additional restrictions independent of a user. It also runs + * independent of 'Require' directive usage. + * + * @param r the current request + * @return OK, DECLINED, or HTTP_... + * @ingroup hooks + */ +AP_DECLARE_HOOK(int,access_checker,(request_rec *r)) + +/** + * This hook is used to check to see if the resource being requested + * is available for the authenticated user (r->user and r->ap_auth_type). + * It runs after the access_checker and check_user_id hooks. Note that + * it will *only* be called if Apache determines that access control has + * been applied to this resource (through a 'Require' directive). + * + * @param r the current request + * @return OK, DECLINED, or HTTP_... + * @ingroup hooks + */ +AP_DECLARE_HOOK(int,auth_checker,(request_rec *r)) + +/** + * This hook allows modules to insert filters for the current request + * @param r the current request + * @ingroup hooks + */ +AP_DECLARE_HOOK(void,insert_filter,(request_rec *r)) + +AP_DECLARE(int) ap_location_walk(request_rec *r); +AP_DECLARE(int) ap_directory_walk(request_rec *r); +AP_DECLARE(int) ap_file_walk(request_rec *r); + +#ifdef __cplusplus +} +#endif + +#endif /* !APACHE_HTTP_REQUEST_H */ diff --git a/rubbos/app/httpd-2.0.64/include/http_vhost.h b/rubbos/app/httpd-2.0.64/include/http_vhost.h new file mode 100644 index 00000000..1acfd95f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/include/http_vhost.h @@ -0,0 +1,109 @@ +/* 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. + */ + +#ifndef APACHE_HTTP_VHOST_H +#define APACHE_HTTP_VHOST_H + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @package Virtual Host package + */ + +/** + * called before any config is read + * @param p Pool to allocate out of + */ +AP_DECLARE(void) ap_init_vhost_config(apr_pool_t *p); + +/** + * called after the config has been read to compile the tables needed to do + * the run-time vhost lookups + * @param p The pool to allocate out of + * @param main_server The start of the virtual host list + * @deffunc ap_fini_vhost_config(apr_pool_t *p, server_rec *main_server) + */ +AP_DECLARE(void) ap_fini_vhost_config(apr_pool_t *p, server_rec *main_server); + +/** + * handle addresses in statement + * @param p The pool to allocate out of + * @param hostname The hostname in the VirtualHost statement + * @param s The list of Virtual Hosts. + */ +const char *ap_parse_vhost_addrs(apr_pool_t *p, const char *hostname, server_rec *s); + +/* handle NameVirtualHost directive */ +const char *ap_set_name_virtual_host (cmd_parms *cmd, void *dummy, + const char *arg); + +/** + * Callback function for every Name Based Virtual Host. + * @param baton Opaque user object + * @param conn The current Connection + * @param s The current Server + * @see ap_vhost_iterate_given_conn + * @return 0 on success, any non-zero return will stop the iteration. + */ +typedef int(*ap_vhost_iterate_conn_cb)(void* baton, conn_rec* conn, server_rec* s); + +/** + * For every virtual host on this connection, call func_cb. + * @param conn The current connection + * @param func_cb Function called for every Name Based Virtual Host for this + * connection. + * @param baton Opaque object passed to func_cb. + * @return The return value from func_cb. + * @note If func_cb returns non-zero, the function will return at this point, + * and not continue iterating the virtual hosts. + */ +AP_DECLARE(int) ap_vhost_iterate_given_conn(conn_rec *conn, + ap_vhost_iterate_conn_cb func_cb, + void* baton); + +/** + * given an ip address only, give our best guess as to what vhost it is + * @param conn The current connection + */ +AP_DECLARE(void) ap_update_vhost_given_ip(conn_rec *conn); + +/** + * ap_update_vhost_given_ip is never enough, and this is always called after + * the headers have been read. It may change r->server. + * @param r The current request + */ +AP_DECLARE(void) ap_update_vhost_from_headers(request_rec *r); + +/** + * Match the host in the header with the hostname of the server for this + * request. + * @param r The current request + * @param host The hostname in the headers + * @param port The port from the headers + * @return return 1 if the host:port matches any of the aliases of r->server, + * return 0 otherwise + * @deffunc int ap_matches_request_vhost(request_rec *r, const char *host, apr_port_t port) + */ +AP_DECLARE(int) ap_matches_request_vhost(request_rec *r, const char *host, + apr_port_t port); + +#ifdef __cplusplus +} +#endif + +#endif /* !APACHE_HTTP_VHOST_H */ diff --git a/rubbos/app/httpd-2.0.64/include/httpd.h b/rubbos/app/httpd-2.0.64/include/httpd.h new file mode 100644 index 00000000..4ad2df22 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/include/httpd.h @@ -0,0 +1,1760 @@ +/* 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. + */ + +#ifndef APACHE_HTTPD_H +#define APACHE_HTTPD_H + +/** + * @file httpd.h + * @brief HTTP Daemon routines + */ + +/* XXX - We need to push more stuff to other .h files, or even .c files, to + * make this file smaller + */ + +/* Headers in which EVERYONE has an interest... */ +#include "ap_config.h" +#include "ap_mmn.h" + +#include "ap_release.h" + +#include "apr_general.h" +#include "apr_tables.h" +#include "apr_pools.h" +#include "apr_time.h" +#include "apr_network_io.h" +#include "apr_buckets.h" + +#include "os.h" + +#include "pcreposix.h" + +/* Note: util_uri.h is also included, see below */ + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef CORE_PRIVATE + +/* ----------------------------- config dir ------------------------------ */ + +/* Define this to be the default server home dir. Most things later in this + * file with a relative pathname will have this added. + */ +#ifndef HTTPD_ROOT +#ifdef OS2 +/* Set default for OS/2 file system */ +#define HTTPD_ROOT "/os2httpd" +#elif defined(WIN32) +/* Set default for Windows file system */ +#define HTTPD_ROOT "/apache" +#elif defined (BEOS) +/* Set the default for BeOS */ +#define HTTPD_ROOT "/boot/home/apache" +#elif defined (NETWARE) +/* Set the default for NetWare */ +#define HTTPD_ROOT "/apache" +#else +#define HTTPD_ROOT "/usr/local/apache" +#endif +#endif /* HTTPD_ROOT */ + +/* + * --------- You shouldn't have to edit anything below this line ---------- + * + * Any modifications to any defaults not defined above should be done in the + * respective configuration file. + * + */ + +/* Default location of documents. Can be overridden by the DocumentRoot + * directive. + */ +#ifndef DOCUMENT_LOCATION +#ifdef OS2 +/* Set default for OS/2 file system */ +#define DOCUMENT_LOCATION HTTPD_ROOT "/docs" +#else +#define DOCUMENT_LOCATION HTTPD_ROOT "/htdocs" +#endif +#endif /* DOCUMENT_LOCATION */ + +/* Maximum number of dynamically loaded modules */ +#ifndef DYNAMIC_MODULE_LIMIT +#define DYNAMIC_MODULE_LIMIT 64 +#endif + +/* Default administrator's address */ +#define DEFAULT_ADMIN "[no address given]" + +/* The name of the log files */ +#ifndef DEFAULT_ERRORLOG +#if defined(OS2) || defined(WIN32) +#define DEFAULT_ERRORLOG "logs/error.log" +#else +#define DEFAULT_ERRORLOG "logs/error_log" +#endif +#endif /* DEFAULT_ERRORLOG */ + +/* Define this to be what your per-directory security files are called */ +#ifndef DEFAULT_ACCESS_FNAME +#ifdef OS2 +/* Set default for OS/2 file system */ +#define DEFAULT_ACCESS_FNAME "htaccess" +#else +#define DEFAULT_ACCESS_FNAME ".htaccess" +#endif +#endif /* DEFAULT_ACCESS_FNAME */ + +/* The name of the server config file */ +#ifndef SERVER_CONFIG_FILE +#define SERVER_CONFIG_FILE "conf/httpd.conf" +#endif + +/* Whether we should enable rfc1413 identity checking */ +#ifndef DEFAULT_RFC1413 +#define DEFAULT_RFC1413 0 +#endif + +/* The default path for CGI scripts if none is currently set */ +#ifndef DEFAULT_PATH +#define DEFAULT_PATH "/bin:/usr/bin:/usr/ucb:/usr/bsd:/usr/local/bin" +#endif + +/* The path to the suExec wrapper, can be overridden in Configuration */ +#ifndef SUEXEC_BIN +#define SUEXEC_BIN HTTPD_ROOT "/bin/suexec" +#endif + +/* The timeout for waiting for messages */ +#ifndef DEFAULT_TIMEOUT +#define DEFAULT_TIMEOUT 300 +#endif + +/* The timeout for waiting for keepalive timeout until next request */ +#ifndef DEFAULT_KEEPALIVE_TIMEOUT +#define DEFAULT_KEEPALIVE_TIMEOUT 15 +#endif + +/* The number of requests to entertain per connection */ +#ifndef DEFAULT_KEEPALIVE +#define DEFAULT_KEEPALIVE 100 +#endif + +/* Limits on the size of various request items. These limits primarily + * exist to prevent simple denial-of-service attacks on a server based + * on misuse of the protocol. The recommended values will depend on the + * nature of the server resources -- CGI scripts and database backends + * might require large values, but most servers could get by with much + * smaller limits than we use below. The request message body size can + * be limited by the per-dir config directive LimitRequestBody. + * + * Internal buffer sizes are two bytes more than the DEFAULT_LIMIT_REQUEST_LINE + * and DEFAULT_LIMIT_REQUEST_FIELDSIZE below, which explains the 8190. + * These two limits can be lowered (but not raised) by the server config + * directives LimitRequestLine and LimitRequestFieldsize, respectively. + * + * DEFAULT_LIMIT_REQUEST_FIELDS can be modified or disabled (set = 0) by + * the server config directive LimitRequestFields. + */ +#ifndef DEFAULT_LIMIT_REQUEST_LINE +#define DEFAULT_LIMIT_REQUEST_LINE 8190 +#endif /* default limit on bytes in Request-Line (Method+URI+HTTP-version) */ +#ifndef DEFAULT_LIMIT_REQUEST_FIELDSIZE +#define DEFAULT_LIMIT_REQUEST_FIELDSIZE 8190 +#endif /* default limit on bytes in any one header field */ +#ifndef DEFAULT_LIMIT_REQUEST_FIELDS +#define DEFAULT_LIMIT_REQUEST_FIELDS 100 +#endif /* default limit on number of request header fields */ + + +/** + * The default default character set name to add if AddDefaultCharset is + * enabled. Overridden with AddDefaultCharsetName. + */ +#define DEFAULT_ADD_DEFAULT_CHARSET_NAME "iso-8859-1" + +#endif /* CORE_PRIVATE */ + +/** default HTTP Server protocol */ +#define AP_SERVER_PROTOCOL "HTTP/1.1" + + +/* ------------------ stuff that modules are allowed to look at ----------- */ + +/** Define this to be what your HTML directory content files are called */ +#ifndef AP_DEFAULT_INDEX +#define AP_DEFAULT_INDEX "index.html" +#endif + + +/** + * Define this to be what type you'd like returned for files with unknown + * suffixes. + * @warning MUST be all lower case. + */ +#ifndef DEFAULT_CONTENT_TYPE +#define DEFAULT_CONTENT_TYPE "text/plain" +#endif + +/** The name of the MIME types file */ +#ifndef AP_TYPES_CONFIG_FILE +#define AP_TYPES_CONFIG_FILE "conf/mime.types" +#endif + +/* + * Define the HTML doctype strings centrally. + */ +/** HTML 2.0 Doctype */ +#define DOCTYPE_HTML_2_0 "\n" +/** HTML 3.2 Doctype */ +#define DOCTYPE_HTML_3_2 "\n" +/** HTML 4.0 Strict Doctype */ +#define DOCTYPE_HTML_4_0S "\n" +/** HTML 4.0 Transitional Doctype */ +#define DOCTYPE_HTML_4_0T "\n" +/** HTML 4.0 Frameset Doctype */ +#define DOCTYPE_HTML_4_0F "\n" +/** XHTML 1.0 Strict Doctype */ +#define DOCTYPE_XHTML_1_0S "\n" +/** XHTML 1.0 Transitional Doctype */ +#define DOCTYPE_XHTML_1_0T "\n" +/** XHTML 1.0 Frameset Doctype */ +#define DOCTYPE_XHTML_1_0F "" + +/** Internal representation for a HTTP protocol number, e.g., HTTP/1.1 */ + +#define HTTP_VERSION(major,minor) (1000*(major)+(minor)) +/** Major part of HTTP protocol */ +#define HTTP_VERSION_MAJOR(number) ((number)/1000) +/** Minor part of HTTP protocol */ +#define HTTP_VERSION_MINOR(number) ((number)%1000) + +/* -------------- Port number for server running standalone --------------- */ + +/** default HTTP Port */ +#define DEFAULT_HTTP_PORT 80 +/** default HTTPS Port */ +#define DEFAULT_HTTPS_PORT 443 +/** + * Check whether @a port is the default port for the request @a r. + * @param port The port number + * @param r The request + * @see #ap_default_port + */ +#define ap_is_default_port(port,r) ((port) == ap_default_port(r)) +/** + * Get the default port for a request (which depends on the scheme). + * @param r The request + */ +#define ap_default_port(r) ap_run_default_port(r) +/** + * Get the scheme for a request. + * @param r The request + * @bug This should be called ap_http_scheme! + */ +#define ap_http_method(r) ap_run_http_method(r) + +/** The default string lengths */ +#define MAX_STRING_LEN HUGE_STRING_LEN +#define HUGE_STRING_LEN 8192 + +/** The size of the server's internal read-write buffers */ +#define AP_IOBUFSIZE 8192 + +/** The max number of regex captures that can be expanded by ap_pregsub */ +#define AP_MAX_REG_MATCH 10 + +/** + * APR_HAS_LARGE_FILES introduces the problem of spliting sendfile into + * mutiple buckets, no greater than MAX(apr_size_t), and more granular + * than that in case the brigade code/filters attempt to read it directly. + * ### 16mb is an invention, no idea if it is reasonable. + */ +#define AP_MAX_SENDFILE 16777216 /* 2^24 */ + +/** + * Special Apache error codes. These are basically used + * in http_main.c so we can keep track of various errors. + * + */ +/** a normal exit */ +#define APEXIT_OK 0x0 +/** A fatal error arising during the server's init sequence */ +#define APEXIT_INIT 0x2 +/** The child died during its init sequence */ +#define APEXIT_CHILDINIT 0x3 +/** + * The child exited due to a resource shortage. + * The parent should limit the rate of forking until + * the situation is resolved. + */ +#define APEXIT_CHILDSICK 0x7 +/** + * A fatal error, resulting in the whole server aborting. + * If a child exits with this error, the parent process + * considers this a server-wide fatal error and aborts. + */ +#define APEXIT_CHILDFATAL 0xf + +#ifndef AP_DECLARE +/** + * Stuff marked #AP_DECLARE is part of the API, and intended for use + * by modules. Its purpose is to allow us to add attributes that + * particular platforms or compilers require to every exported function. + */ +# define AP_DECLARE(type) type +#endif + +#ifndef AP_DECLARE_NONSTD +/** + * Stuff marked #AP_DECLARE_NONSTD is part of the API, and intended for + * use by modules. The difference between #AP_DECLARE and + * #AP_DECLARE_NONSTD is that the latter is required for any functions + * which use varargs or are used via indirect function call. This + * is to accomodate the two calling conventions in windows dlls. + */ +# define AP_DECLARE_NONSTD(type) type +#endif +#ifndef AP_DECLARE_DATA +# define AP_DECLARE_DATA +#endif + +#ifndef AP_MODULE_DECLARE +# define AP_MODULE_DECLARE(type) type +#endif +#ifndef AP_MODULE_DECLARE_NONSTD +# define AP_MODULE_DECLARE_NONSTD(type) type +#endif +#ifndef AP_MODULE_DECLARE_DATA +# define AP_MODULE_DECLARE_DATA +#endif + +/** + * @internal + * modules should not used functions marked AP_CORE_DECLARE + */ +#ifndef AP_CORE_DECLARE +# define AP_CORE_DECLARE AP_DECLARE +#endif +/** + * @internal + * modules should not used functions marked AP_CORE_DECLARE_NONSTD + */ + +#ifndef AP_CORE_DECLARE_NONSTD +# define AP_CORE_DECLARE_NONSTD AP_DECLARE_NONSTD +#endif + +/** + * The numeric version information is broken out into fields within this + * structure. + */ +typedef struct { + int major; /**< major number */ + int minor; /**< minor number */ + int patch; /**< patch number */ + const char *add_string; /**< additional string like "-dev" */ +} ap_version_t; + +/** + * Return httpd's version information in a numeric form. + * + * @param version Pointer to a version structure for returning the version + * information. + */ +AP_DECLARE(void) ap_get_server_revision(ap_version_t *version); + +/** + * Get the server version string + * @return The server version string + */ +AP_DECLARE(const char *) ap_get_server_version(void); + +/** + * Add a component to the version string + * @param pconf The pool to allocate the component from + * @param component The string to add + */ +AP_DECLARE(void) ap_add_version_component(apr_pool_t *pconf, const char *component); + +/** + * Get the date a time that the server was built + * @return The server build time string + */ +AP_DECLARE(const char *) ap_get_server_built(void); + +#define DECLINED -1 /**< Module declines to handle */ +#define DONE -2 /**< Module has served the response completely + * - it's safe to die() with no more output + */ +#define OK 0 /**< Module has handled this stage. */ + + +/** + * @defgroup HTTP_Status HTTP Status Codes + * @{ + */ +/** + * The size of the static array in http_protocol.c for storing + * all of the potential response status-lines (a sparse table). + * A future version should dynamically generate the apr_table_t at startup. + */ +#define RESPONSE_CODES 57 + +#define HTTP_CONTINUE 100 +#define HTTP_SWITCHING_PROTOCOLS 101 +#define HTTP_PROCESSING 102 +#define HTTP_OK 200 +#define HTTP_CREATED 201 +#define HTTP_ACCEPTED 202 +#define HTTP_NON_AUTHORITATIVE 203 +#define HTTP_NO_CONTENT 204 +#define HTTP_RESET_CONTENT 205 +#define HTTP_PARTIAL_CONTENT 206 +#define HTTP_MULTI_STATUS 207 +#define HTTP_MULTIPLE_CHOICES 300 +#define HTTP_MOVED_PERMANENTLY 301 +#define HTTP_MOVED_TEMPORARILY 302 +#define HTTP_SEE_OTHER 303 +#define HTTP_NOT_MODIFIED 304 +#define HTTP_USE_PROXY 305 +#define HTTP_TEMPORARY_REDIRECT 307 +#define HTTP_BAD_REQUEST 400 +#define HTTP_UNAUTHORIZED 401 +#define HTTP_PAYMENT_REQUIRED 402 +#define HTTP_FORBIDDEN 403 +#define HTTP_NOT_FOUND 404 +#define HTTP_METHOD_NOT_ALLOWED 405 +#define HTTP_NOT_ACCEPTABLE 406 +#define HTTP_PROXY_AUTHENTICATION_REQUIRED 407 +#define HTTP_REQUEST_TIME_OUT 408 +#define HTTP_CONFLICT 409 +#define HTTP_GONE 410 +#define HTTP_LENGTH_REQUIRED 411 +#define HTTP_PRECONDITION_FAILED 412 +#define HTTP_REQUEST_ENTITY_TOO_LARGE 413 +#define HTTP_REQUEST_URI_TOO_LARGE 414 +#define HTTP_UNSUPPORTED_MEDIA_TYPE 415 +#define HTTP_RANGE_NOT_SATISFIABLE 416 +#define HTTP_EXPECTATION_FAILED 417 +#define HTTP_UNPROCESSABLE_ENTITY 422 +#define HTTP_LOCKED 423 +#define HTTP_FAILED_DEPENDENCY 424 +#define HTTP_UPGRADE_REQUIRED 426 +#define HTTP_INTERNAL_SERVER_ERROR 500 +#define HTTP_NOT_IMPLEMENTED 501 +#define HTTP_BAD_GATEWAY 502 +#define HTTP_SERVICE_UNAVAILABLE 503 +#define HTTP_GATEWAY_TIME_OUT 504 +#define HTTP_VERSION_NOT_SUPPORTED 505 +#define HTTP_VARIANT_ALSO_VARIES 506 +#define HTTP_INSUFFICIENT_STORAGE 507 +#define HTTP_NOT_EXTENDED 510 + +/** is the status code informational */ +#define ap_is_HTTP_INFO(x) (((x) >= 100)&&((x) < 200)) +/** is the status code OK ?*/ +#define ap_is_HTTP_SUCCESS(x) (((x) >= 200)&&((x) < 300)) +/** is the status code a redirect */ +#define ap_is_HTTP_REDIRECT(x) (((x) >= 300)&&((x) < 400)) +/** is the status code a error (client or server) */ +#define ap_is_HTTP_ERROR(x) (((x) >= 400)&&((x) < 600)) +/** is the status code a client error */ +#define ap_is_HTTP_CLIENT_ERROR(x) (((x) >= 400)&&((x) < 500)) +/** is the status code a server error */ +#define ap_is_HTTP_SERVER_ERROR(x) (((x) >= 500)&&((x) < 600)) + +/** should the status code drop the connection */ +#define ap_status_drops_connection(x) \ + (((x) == HTTP_BAD_REQUEST) || \ + ((x) == HTTP_REQUEST_TIME_OUT) || \ + ((x) == HTTP_LENGTH_REQUIRED) || \ + ((x) == HTTP_REQUEST_ENTITY_TOO_LARGE) || \ + ((x) == HTTP_REQUEST_URI_TOO_LARGE) || \ + ((x) == HTTP_INTERNAL_SERVER_ERROR) || \ + ((x) == HTTP_SERVICE_UNAVAILABLE) || \ + ((x) == HTTP_NOT_IMPLEMENTED)) +/** @} */ +/** + * @defgroup Methods List of Methods recognized by the server + * @{ + */ +/** + * Methods recognized (but not necessarily handled) by the server. + * These constants are used in bit shifting masks of size int, so it is + * unsafe to have more methods than bits in an int. HEAD == M_GET. + * This list must be tracked by the list in http_protocol.c in routine + * ap_method_name_of(). + */ +#define M_GET 0 /* RFC 2616: HTTP */ +#define M_PUT 1 /* : */ +#define M_POST 2 +#define M_DELETE 3 +#define M_CONNECT 4 +#define M_OPTIONS 5 +#define M_TRACE 6 /* RFC 2616: HTTP */ +#define M_PATCH 7 /* no rfc(!) ### remove this one? */ +#define M_PROPFIND 8 /* RFC 2518: WebDAV */ +#define M_PROPPATCH 9 /* : */ +#define M_MKCOL 10 +#define M_COPY 11 +#define M_MOVE 12 +#define M_LOCK 13 +#define M_UNLOCK 14 /* RFC 2518: WebDAV */ +#define M_VERSION_CONTROL 15 /* RFC 3253: WebDAV Versioning */ +#define M_CHECKOUT 16 /* : */ +#define M_UNCHECKOUT 17 +#define M_CHECKIN 18 +#define M_UPDATE 19 +#define M_LABEL 20 +#define M_REPORT 21 +#define M_MKWORKSPACE 22 +#define M_MKACTIVITY 23 +#define M_BASELINE_CONTROL 24 +#define M_MERGE 25 +#define M_INVALID 26 /* RFC 3253: WebDAV Versioning */ + +/** + * METHODS needs to be equal to the number of bits + * we are using for limit masks. + */ +#define METHODS 64 + +/** + * The method mask bit to shift for anding with a bitmask. + */ +#define AP_METHOD_BIT ((apr_int64_t)1) +/** @} */ + + +/** + * Structure for handling HTTP methods. Methods known to the server are + * accessed via a bitmask shortcut; extension methods are handled by + * an array. + */ +typedef struct ap_method_list_t ap_method_list_t; +struct ap_method_list_t { + /* The bitmask used for known methods */ + apr_int64_t method_mask; + /* the array used for extension methods */ + apr_array_header_t *method_list; +}; +/** + * @defgroup module_magic Module Magic mime types + * @{ + */ +/** Magic for mod_cgi[d] */ +#define CGI_MAGIC_TYPE "application/x-httpd-cgi" +/** Magic for mod_include */ +#define INCLUDES_MAGIC_TYPE "text/x-server-parsed-html" +/** Magic for mod_include */ +#define INCLUDES_MAGIC_TYPE3 "text/x-server-parsed-html3" +/** Magic for mod_dir */ +#define DIR_MAGIC_TYPE "httpd/unix-directory" + +/** @} */ +/* Just in case your linefeed isn't the one the other end is expecting. */ +#if !APR_CHARSET_EBCDIC +/** linefeed */ +#define LF 10 +/** carrige return */ +#define CR 13 +/** carrige return /Line Feed Combo */ +#define CRLF "\015\012" +#else /* APR_CHARSET_EBCDIC */ +/* For platforms using the EBCDIC charset, the transition ASCII->EBCDIC is done + * in the buff package (bread/bputs/bwrite). Everywhere else, we use + * "native EBCDIC" CR and NL characters. These are therefore + * defined as + * '\r' and '\n'. + */ +#define CR '\r' +#define LF '\n' +#define CRLF "\r\n" +#endif /* APR_CHARSET_EBCDIC */ + +/** + * @defgroup values_request_rec_body Possible values for request_rec.read_body + * @{ + * Possible values for request_rec.read_body (set by handling module): + */ + +/** Send 413 error if message has any body */ +#define REQUEST_NO_BODY 0 +/** Send 411 error if body without Content-Length */ +#define REQUEST_CHUNKED_ERROR 1 +/** If chunked, remove the chunks for me. */ +#define REQUEST_CHUNKED_DECHUNK 2 +/** @} */ + +/** + * @defgroup values_request_rec_used_path_info Possible values for request_rec.used_path_info + * @{ + * Possible values for request_rec.used_path_info: + */ + +/** Accept the path_info from the request */ +#define AP_REQ_ACCEPT_PATH_INFO 0 +/** Return a 404 error if path_info was given */ +#define AP_REQ_REJECT_PATH_INFO 1 +/** Module may chose to use the given path_info */ +#define AP_REQ_DEFAULT_PATH_INFO 2 +/** @} */ + +/* + * Things which may vary per file-lookup WITHIN a request --- + * e.g., state of MIME config. Basically, the name of an object, info + * about the object, and any other info we may ahve which may need to + * change as we go poking around looking for it (e.g., overridden by + * .htaccess files). + * + * Note how the default state of almost all these things is properly + * zero, so that allocating it with pcalloc does the right thing without + * a whole lot of hairy initialization... so long as we are willing to + * make the (fairly) portable assumption that the bit pattern of a NULL + * pointer is, in fact, zero. + */ + +/** + * This represents the result of calling htaccess; these are cached for + * each request. + */ +struct htaccess_result { + /** the directory to which this applies */ + const char *dir; + /** the overrides allowed for the .htaccess file */ + int override; + /** the configuration directives */ + struct ap_conf_vector_t *htaccess; + /** the next one, or NULL if no more; N.B. never change this */ + const struct htaccess_result *next; +}; + +/* The following four types define a hierarchy of activities, so that + * given a request_rec r you can write r->connection->server->process + * to get to the process_rec. While this reduces substantially the + * number of arguments that various hooks require beware that in + * threaded versions of the server you must consider multiplexing + * issues. */ + + +/** A structure that represents one process */ +typedef struct process_rec process_rec; +/** A structure that represents a virtual server */ +typedef struct server_rec server_rec; +/** A structure that represents one connection */ +typedef struct conn_rec conn_rec; +/** A structure that represents the current request */ +typedef struct request_rec request_rec; + +/* ### would be nice to not include this from httpd.h ... */ +/* This comes after we have defined the request_rec type */ +#include "apr_uri.h" + +/** A structure that represents one process */ +struct process_rec { + /** Global pool. Cleared upon normal exit */ + apr_pool_t *pool; + /** Configuration pool. Cleared upon restart */ + apr_pool_t *pconf; + /** Number of command line arguments passed to the program */ + int argc; + /** The command line arguments */ + const char * const *argv; + /** The program name used to execute the program */ + const char *short_name; +}; + +/** A structure that represents the current request */ +struct request_rec { + /** The pool associated with the request */ + apr_pool_t *pool; + /** The connection to the client */ + conn_rec *connection; + /** The virtual host for this request */ + server_rec *server; + + /** Pointer to the redirected request if this is an external redirect */ + request_rec *next; + /** Pointer to the previous request if this is an internal redirect */ + request_rec *prev; + + /** Pointer to the main request if this is a sub-request + * (see http_request.h) */ + request_rec *main; + + /* Info about the request itself... we begin with stuff that only + * protocol.c should ever touch... + */ + /** First line of request */ + char *the_request; + /** HTTP/0.9, "simple" request (e.g. GET /foo\n w/no headers) */ + int assbackwards; + /** A proxy request (calculated during post_read_request/translate_name) + * possible values PROXYREQ_NONE, PROXYREQ_PROXY, PROXYREQ_REVERSE, + * PROXYREQ_RESPONSE + */ + int proxyreq; + /** HEAD request, as opposed to GET */ + int header_only; + /** Protocol string, as given to us, or HTTP/0.9 */ + char *protocol; + /** Protocol version number of protocol; 1.1 = 1001 */ + int proto_num; + /** Host, as set by full URI or Host: */ + const char *hostname; + + /** Time when the request started */ + apr_time_t request_time; + + /** Status line, if set by script */ + const char *status_line; + /** Status line */ + int status; + + /* Request method, two ways; also, protocol, etc.. Outside of protocol.c, + * look, but don't touch. + */ + + /** Request method (eg. GET, HEAD, POST, etc.) */ + const char *method; + /** M_GET, M_POST, etc. */ + int method_number; + + /** + * 'allowed' is a bitvector of the allowed methods. + * + * A handler must ensure that the request method is one that + * it is capable of handling. Generally modules should DECLINE + * any request methods they do not handle. Prior to aborting the + * handler like this the handler should set r->allowed to the list + * of methods that it is willing to handle. This bitvector is used + * to construct the "Allow:" header required for OPTIONS requests, + * and HTTP_METHOD_NOT_ALLOWED and HTTP_NOT_IMPLEMENTED status codes. + * + * Since the default_handler deals with OPTIONS, all modules can + * usually decline to deal with OPTIONS. TRACE is always allowed, + * modules don't need to set it explicitly. + * + * Since the default_handler will always handle a GET, a + * module which does *not* implement GET should probably return + * HTTP_METHOD_NOT_ALLOWED. Unfortunately this means that a Script GET + * handler can't be installed by mod_actions. + */ + apr_int64_t allowed; + /** Array of extension methods */ + apr_array_header_t *allowed_xmethods; + /** List of allowed methods */ + ap_method_list_t *allowed_methods; + + /** byte count in stream is for body */ + apr_off_t sent_bodyct; + /** body byte count, for easy access */ + apr_off_t bytes_sent; + /** Last modified time of the requested resource */ + apr_time_t mtime; + + /* HTTP/1.1 connection-level features */ + + /** sending chunked transfer-coding */ + int chunked; + /** The Range: header */ + const char *range; + /** The "real" content length */ + apr_off_t clength; + + /** Remaining bytes left to read from the request body */ + apr_off_t remaining; + /** Number of bytes that have been read from the request body */ + apr_off_t read_length; + /** Method for reading the request body + * (eg. REQUEST_CHUNKED_ERROR, REQUEST_NO_BODY, + * REQUEST_CHUNKED_DECHUNK, etc...) */ + int read_body; + /** reading chunked transfer-coding */ + int read_chunked; + /** is client waiting for a 100 response? */ + unsigned expecting_100; + + /* 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). + * + * The 'notes' apr_table_t is for notes from one module to another, with no + * other set purpose in mind... + */ + + /** MIME header environment from the request */ + apr_table_t *headers_in; + /** MIME header environment for the response */ + apr_table_t *headers_out; + /** MIME header environment for the response, printed even on errors and + * persist across internal redirects */ + apr_table_t *err_headers_out; + /** Array of environment variables to be used for sub processes */ + apr_table_t *subprocess_env; + /** Notes from one module to another */ + apr_table_t *notes; + + /* content_type, handler, content_encoding, and all content_languages + * MUST be lowercased strings. They may be pointers to static strings; + * they should not be modified in place. + */ + /** The content-type for the current request */ + const char *content_type; /* Break these out --- we dispatch on 'em */ + /** The handler string that we use to call a handler function */ + const char *handler; /* What we *really* dispatch on */ + + /** How to encode the data */ + const char *content_encoding; + /** Array of strings representing the content languages */ + apr_array_header_t *content_languages; + + /** variant list validator (if negotiated) */ + char *vlist_validator; + + /** If an authentication check was made, this gets set to the user name. */ + char *user; + /** If an authentication check was made, this gets set to the auth type. */ + char *ap_auth_type; + + /** This response can not be cached */ + int no_cache; + /** There is no local copy of this response */ + int no_local_copy; + + /* What object is being requested (either directly, or via include + * or content-negotiation mapping). + */ + + /** The URI without any parsing performed */ + char *unparsed_uri; + /** The path portion of the URI, or "/" if no path provided */ + char *uri; + /** The filename on disk corresponding to this response */ + char *filename; + /* XXX: What does this mean? Please define "canonicalize" -aaron */ + /** The true filename, we canonicalize r->filename if these don't match */ + char *canonical_filename; + /** The PATH_INFO extracted from this request */ + char *path_info; + /** The QUERY_ARGS extracted from this request */ + char *args; + /** finfo.protection (st_mode) set to zero if no such file */ + apr_finfo_t finfo; + /** A struct containing the components of URI */ + apr_uri_t parsed_uri; + + /** + * Flag for the handler to accept or reject path_info on + * the current request. All modules should respect the + * AP_REQ_ACCEPT_PATH_INFO and AP_REQ_REJECT_PATH_INFO + * values, while AP_REQ_DEFAULT_PATH_INFO indicates they + * may follow existing conventions. This is set to the + * user's preference upon HOOK_VERY_FIRST of the fixups. + */ + int used_path_info; + + /* 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). + */ + + /** Options set in config files, etc. */ + struct ap_conf_vector_t *per_dir_config; + /** Notes on *this* request */ + struct ap_conf_vector_t *request_config; + + /** + * A linked list of the .htaccess configuration directives + * accessed by this request. + * N.B. always add to the head of the list, _never_ to the end. + * that way, a sub request's list can (temporarily) point to a parent's list + */ + const struct htaccess_result *htaccess; + + /** A list of output filters to be used for this request */ + struct ap_filter_t *output_filters; + /** A list of input filters to be used for this request */ + struct ap_filter_t *input_filters; + + /** A list of protocol level output filters to be used for this + * request */ + struct ap_filter_t *proto_output_filters; + /** A list of protocol level input filters to be used for this + * request */ + struct ap_filter_t *proto_input_filters; + + /** A flag to determine if the eos bucket has been sent yet */ + int eos_sent; + +/* Things placed at the end of the record to avoid breaking binary + * compatibility. It would be nice to remember to reorder the entire + * record to improve 64bit alignment the next time we need to break + * binary compatibility for some other reason. + */ +}; + +/** + * @defgroup ProxyReq Proxy request types + * + * Possible values of request_rec->proxyreq. A request could be normal, + * proxied or reverse proxied. Normally proxied and reverse proxied are + * grouped together as just "proxied", but sometimes it's necessary to + * tell the difference between the two, such as for authentication. + * @{ + */ + +#define PROXYREQ_NONE 0 /**< No proxy */ +#define PROXYREQ_PROXY 1 /**< Standard proxy */ +#define PROXYREQ_REVERSE 2 /**< Reverse proxy */ +#define PROXYREQ_RESPONSE 3 /**< Origin response */ + +/* @} */ + +typedef enum { + AP_CONN_UNKNOWN, + AP_CONN_CLOSE, + AP_CONN_KEEPALIVE +} ap_conn_keepalive_e; + +/** Structure to store things which are per connection */ +struct conn_rec { + /** Pool associated with this connection */ + apr_pool_t *pool; + /** Physical vhost this conn came in on */ + server_rec *base_server; + /** used by http_vhost.c */ + void *vhost_lookup_data; + + /* Information about the connection itself */ + /** local address */ + apr_sockaddr_t *local_addr; + /** remote address */ + apr_sockaddr_t *remote_addr; + + /** Client's IP address */ + char *remote_ip; + /** Client's DNS name, if known. NULL if DNS hasn't been checked, + * "" if it has and no address was found. N.B. Only access this though + * get_remote_host() */ + char *remote_host; + /** Only ever set if doing rfc1413 lookups. N.B. Only access this through + * get_remote_logname() */ + char *remote_logname; + + /** Are we still talking? */ + unsigned aborted:1; + + /** Are we going to keep the connection alive for another request? + * @see ap_conn_keepalive_e */ + ap_conn_keepalive_e keepalive; + + /** have we done double-reverse DNS? -1 yes/failure, 0 not yet, + * 1 yes/success */ + signed int double_reverse:2; + + /** How many times have we used it? */ + int keepalives; + /** server IP address */ + char *local_ip; + /** used for ap_get_server_name when UseCanonicalName is set to DNS + * (ignores setting of HostnameLookups) */ + char *local_host; + + /** ID of this connection; unique at any point in time */ + long id; + /** Config vector containing pointers to connections per-server + * config structures. */ + struct ap_conf_vector_t *conn_config; + /** Notes on *this* connection: send note from one module to + * another. must remain valid for all requests on this conn */ + apr_table_t *notes; + /** A list of input filters to be used for this connection */ + struct ap_filter_t *input_filters; + /** A list of output filters to be used for this connection */ + struct ap_filter_t *output_filters; + /** handle to scoreboard information for this connection */ + void *sbh; + /** The bucket allocator to use for all bucket/brigade creations */ + struct apr_bucket_alloc_t *bucket_alloc; +}; + +/* Per-vhost config... */ + +/** + * The address 255.255.255.255, when used as a virtualhost address, + * will become the "default" server when the ip doesn't match other vhosts. + */ +#define DEFAULT_VHOST_ADDR 0xfffffffful + + +/** A structure to be used for Per-vhost config */ +typedef struct server_addr_rec server_addr_rec; +struct server_addr_rec { + /** The next server in the list */ + server_addr_rec *next; + /** The bound address, for this server */ + apr_sockaddr_t *host_addr; + /** The bound port, for this server */ + apr_port_t host_port; + /** The name given in */ + char *virthost; +}; + +/** A structure to store information for each virtual server */ +struct server_rec { + /** The process this server is running in */ + process_rec *process; + /** The next server in the list */ + server_rec *next; + + /** The name of the server */ + const char *defn_name; + /** The line of the config file that the server was defined on */ + unsigned defn_line_number; + + /* Contact information */ + + /** The admin's contact information */ + char *server_admin; + /** The server hostname */ + char *server_hostname; + /** for redirects, etc. */ + apr_port_t port; + + /* Log files --- note that transfer log is now in the modules... */ + + /** The name of the error log */ + char *error_fname; + /** A file descriptor that references the error log */ + apr_file_t *error_log; + /** The log level for this server */ + int loglevel; + + /* Module-specific configuration for server, and defaults... */ + + /** true if this is the virtual server */ + int is_virtual; + /** Config vector containing pointers to modules' per-server config + * structures. */ + struct ap_conf_vector_t *module_config; + /** MIME type info, etc., before we start checking per-directory info */ + struct ap_conf_vector_t *lookup_defaults; + + /* Transaction handling */ + + /** I haven't got a clue */ + server_addr_rec *addrs; + /** Timeout, as an apr interval, before we give up */ + apr_interval_time_t timeout; + /** The apr interval we will wait for another request */ + apr_interval_time_t keep_alive_timeout; + /** Maximum requests per connection */ + int keep_alive_max; + /** Use persistent connections? */ + int keep_alive; + + /** Pathname for ServerPath */ + const char *path; + /** Length of path */ + int pathlen; + + /** Normal names for ServerAlias servers */ + apr_array_header_t *names; + /** Wildcarded names for ServerAlias servers */ + apr_array_header_t *wild_names; + + /** limit on size of the HTTP request line */ + int limit_req_line; + /** limit on size of any request header field */ + int limit_req_fieldsize; + /** limit on number of request header fields */ + int limit_req_fields; +}; + +typedef struct core_output_filter_ctx { + apr_bucket_brigade *b; + apr_pool_t *deferred_write_pool; /* subpool of c->pool used for resources + * which may outlive the request + */ +} core_output_filter_ctx_t; + +typedef struct core_filter_ctx { + apr_bucket_brigade *b; + apr_bucket_brigade *tmpbb; +} core_ctx_t; + +typedef struct core_net_rec { + /** Connection to the client */ + apr_socket_t *client_socket; + + /** connection record */ + conn_rec *c; + + core_output_filter_ctx_t *out_ctx; + core_ctx_t *in_ctx; +} core_net_rec; + +/** + * Examine a field value (such as a media-/content-type) string and return + * it sans any parameters; e.g., strip off any ';charset=foo' and the like. + * @param p Pool to allocate memory from + * @param intype The field to examine + * @return A copy of the field minus any parameters + */ +AP_DECLARE(char *) ap_field_noparam(apr_pool_t *p, const char *intype); + +/** + * Convert a time from an integer into a string in a specified format + * @param p The pool to allocate memory from + * @param t The time to convert + * @param fmt The format to use for the conversion + * @param gmt Convert the time for GMT? + * @return The string that represents the specified time + */ +AP_DECLARE(char *) ap_ht_time(apr_pool_t *p, apr_time_t t, const char *fmt, int gmt); + +/* String handling. The *_nc variants allow you to use non-const char **s as + arguments (unfortunately C won't automatically convert a char ** to a const + char **) */ + +/** + * Get the characters until the first occurance of a specified character + * @param p The pool to allocate memory from + * @param line The string to get the characters from + * @param stop The character to stop at + * @return A copy of the characters up to the first stop character + */ +AP_DECLARE(char *) ap_getword(apr_pool_t *p, const char **line, char stop); +/** + * Get the characters until the first occurance of a specified character + * @param p The pool to allocate memory from + * @param line The string to get the characters from + * @param stop The character to stop at + * @return A copy of the characters up to the first stop character + * @note This is the same as ap_getword(), except it doesn't use const char **. + */ +AP_DECLARE(char *) ap_getword_nc(apr_pool_t *p, char **line, char stop); + +/** + * Get the first word from a given string. A word is defined as all characters + * up to the first whitespace. + * @param p The pool to allocate memory from + * @param line The string to traverse + * @return The first word in the line + */ +AP_DECLARE(char *) ap_getword_white(apr_pool_t *p, const char **line); +/** + * Get the first word from a given string. A word is defined as all characters + * up to the first whitespace. + * @param p The pool to allocate memory from + * @param line The string to traverse + * @return The first word in the line + * @note The same as ap_getword_white(), except it doesn't use const char **. + */ +AP_DECLARE(char *) ap_getword_white_nc(apr_pool_t *p, char **line); + +/** + * Get all characters from the first occurance of @a stop to the first '\0' + * @param p The pool to allocate memory from + * @param line The line to traverse + * @param stop The character to start at + * @return A copy of all caracters after the first occurance of the specified + * character + */ +AP_DECLARE(char *) ap_getword_nulls(apr_pool_t *p, const char **line, + char stop); +/** + * Get all characters from the first occurance of @a stop to the first '\0' + * @param p The pool to allocate memory from + * @param line The line to traverse + * @param stop The character to start at + * @return A copy of all caracters after the first occurance of the specified + * character + * @note The same as ap_getword_nulls(), except it doesn't use const char **. + */ +AP_DECLARE(char *) ap_getword_nulls_nc(apr_pool_t *p, char **line, char stop); + +/** + * Get the second word in the string paying attention to quoting + * @param p The pool to allocate from + * @param line The line to traverse + * @return A copy of the string + */ +AP_DECLARE(char *) ap_getword_conf(apr_pool_t *p, const char **line); +/** + * Get the second word in the string paying attention to quoting + * @param p The pool to allocate from + * @param line The line to traverse + * @return A copy of the string + * @note The same as ap_getword_conf(), except it doesn't use const char **. + */ +AP_DECLARE(char *) ap_getword_conf_nc(apr_pool_t *p, char **line); + +/** + * Check a string for any ${ENV} environment variable construct and replace + * each them by the value of that environment variable, if it exists. If the + * environment value does not exist, leave the ${ENV} construct alone; it + * means something else. + * @param p The pool to allocate from + * @param word The string to check + * @return The string with the replaced environment variables + */ +AP_DECLARE(const char *) ap_resolve_env(apr_pool_t *p, const char * word); + +/** + * Size an HTTP header field list item, as separated by a comma. + * @param field The field to size + * @param len The length of the field + * @return The return value is a pointer to the beginning of the non-empty + * list item within the original string (or NULL if there is none) and the + * address of field is shifted to the next non-comma, non-whitespace + * character. len is the length of the item excluding any beginning whitespace. + */ +AP_DECLARE(const char *) ap_size_list_item(const char **field, int *len); + +/** + * Retrieve an HTTP header field list item, as separated by a comma, + * while stripping insignificant whitespace and lowercasing anything not in + * a quoted string or comment. + * @param p The pool to allocate from + * @param field The field to retrieve + * @return The return value is a new string containing the converted list + * item (or NULL if none) and the address pointed to by field is + * shifted to the next non-comma, non-whitespace. + */ +AP_DECLARE(char *) ap_get_list_item(apr_pool_t *p, const char **field); + +/** + * Find an item in canonical form (lowercase, no extra spaces) within + * an HTTP field value list. + * @param p The pool to allocate from + * @param line The field value list to search + * @param tok The token to search for + * @return 1 if found, 0 if not found. + */ +AP_DECLARE(int) ap_find_list_item(apr_pool_t *p, const char *line, const char *tok); + +/** + * Retrieve a token, spacing over it and returning a pointer to + * the first non-white byte afterwards. Note that these tokens + * are delimited by semis and commas and can also be delimited + * by whitespace at the caller's option. + * @param p The pool to allocate from + * @param accept_line The line to retrieve the token from + * @param accept_white Is it delimited by whitespace + * @return the first non-white byte after the token + */ +AP_DECLARE(char *) ap_get_token(apr_pool_t *p, const char **accept_line, int accept_white); + +/** + * Find http tokens, see the definition of token from RFC2068 + * @param p The pool to allocate from + * @param line The line to find the token + * @param tok The token to find + * @return 1 if the token is found, 0 otherwise + */ +AP_DECLARE(int) ap_find_token(apr_pool_t *p, const char *line, const char *tok); + +/** + * find http tokens from the end of the line + * @param p The pool to allocate from + * @param line The line to find the token + * @param tok The token to find + * @return 1 if the token is found, 0 otherwise + */ +AP_DECLARE(int) ap_find_last_token(apr_pool_t *p, const char *line, const char *tok); + +/** + * Check for an Absolute URI syntax + * @param u The string to check + * @return 1 if URI, 0 otherwise + */ +AP_DECLARE(int) ap_is_url(const char *u); + +/** + * Unescape a URL + * @param url The url to unescape + * @return 0 on success, non-zero otherwise + */ +AP_DECLARE(int) ap_unescape_url(char *url); +/** + * Unescape a URL, but leaving %2f (slashes) escaped + * @param url The url to unescape + * @return 0 on success, non-zero otherwise + */ +AP_DECLARE(int) ap_unescape_url_keep2f(char *url); +/** + * Convert all double slashes to single slashes + * @param name The string to convert + */ +AP_DECLARE(void) ap_no2slash(char *name); + +/** + * Remove all ./ and xx/../ substrings from a file name. Also remove + * any leading ../ or /../ substrings. + * @param name the file name to parse + */ +AP_DECLARE(void) ap_getparents(char *name); + +/** + * Escape a path segment, as defined in RFC 1808 + * @param p The pool to allocate from + * @param s The path to convert + * @return The converted URL + */ +AP_DECLARE(char *) ap_escape_path_segment(apr_pool_t *p, const char *s); +/** + * convert an OS path to a URL in an OS dependant way. + * @param p The pool to allocate from + * @param path The path to convert + * @param partial if set, assume that the path will be appended to something + * with a '/' in it (and thus does not prefix "./") + * @return The converted URL + */ +AP_DECLARE(char *) ap_os_escape_path(apr_pool_t *p, const char *path, int partial); +/** @see ap_os_escape_path */ +#define ap_escape_uri(ppool,path) ap_os_escape_path(ppool,path,1) + +/** + * Escape an html string + * @param p The pool to allocate from + * @param s The html to escape + * @return The escaped string + */ +AP_DECLARE(char *) ap_escape_html(apr_pool_t *p, const char *s); + +/** + * Escape a string for logging + * @param p The pool to allocate from + * @param str The string to escape + * @return The escaped string + */ +AP_DECLARE(char *) ap_escape_logitem(apr_pool_t *p, const char *str); + +/** + * Escape a string for logging into the error log (without a pool) + * @param dest The buffer to write to + * @param source The string to escape + * @param buflen The buffer size for the escaped string (including \0) + * @return The len of the escaped string (always < maxlen) + */ +AP_DECLARE(apr_size_t) ap_escape_errorlog_item(char *dest, const char *source, + apr_size_t buflen); + +/** + * Construct a full hostname + * @param p The pool to allocate from + * @param hostname The hostname of the server + * @param port The port the server is running on + * @param r The current request + * @return The server's hostname + */ +AP_DECLARE(char *) ap_construct_server(apr_pool_t *p, const char *hostname, + apr_port_t port, const request_rec *r); +/** + * Escape a shell command + * @param p The pool to allocate from + * @param s The command to escape + * @return The escaped shell command + */ +AP_DECLARE(char *) ap_escape_shell_cmd(apr_pool_t *p, const char *s); + +/** + * Count the number of directories in a path + * @param path The path to count + * @return The number of directories + */ +AP_DECLARE(int) ap_count_dirs(const char *path); + +/** + * Copy at most @a n leading directories of @a s into @a d. @a d + * should be at least as large as @a s plus 1 extra byte + * + * @param d The location to copy to + * @param s The location to copy from + * @param n The number of directories to copy + * @return value is the ever useful pointer to the trailing \0 of d + * @note on platforms with drive letters, n = 0 returns the "/" root, + * whereas n = 1 returns the "d:/" root. On all other platforms, n = 0 + * returns the empty string. */ +AP_DECLARE(char *) ap_make_dirstr_prefix(char *d, const char *s, int n); + +/** + * Return the parent directory name (including trailing /) of the file + * @a s + * @param p The pool to allocate from + * @param s The file to get the parent of + * @return A copy of the file's parent directory + */ +AP_DECLARE(char *) ap_make_dirstr_parent(apr_pool_t *p, const char *s); + +/** + * Given a directory and filename, create a single path from them. This + * function is smart enough to ensure that there is a sinlge '/' between the + * directory and file names + * @param a The pool to allocate from + * @param dir The directory name + * @param f The filename + * @return A copy of the full path + * @tip Never consider using this function if you are dealing with filesystem + * names that need to remain canonical, unless you are merging an apr_dir_read + * path and returned filename. Otherwise, the result is not canonical. + */ +AP_DECLARE(char *) ap_make_full_path(apr_pool_t *a, const char *dir, const char *f); + +/** + * Test if the given path has an an absolute path. + * @param p The pool to allocate from + * @param dir The directory name + * @tip The converse is not necessarily true, some OS's (Win32/OS2/Netware) have + * multiple forms of absolute paths. This only reports if the path is absolute + * in a canonical sense. + */ +AP_DECLARE(int) ap_os_is_path_absolute(apr_pool_t *p, const char *dir); + +/** + * Does the provided string contain wildcard characters? This is useful + * for determining if the string should be passed to strcmp_match or to strcmp. + * The only wildcard characters recognized are '?' and '*' + * @param str The string to check + * @return 1 if the string has wildcards, 0 otherwise + */ +AP_DECLARE(int) ap_is_matchexp(const char *str); + +/** + * Determine if a string matches a patterm containing the wildcards '?' or '*' + * @param str The string to check + * @param expected The pattern to match against + * @return 1 if the two strings match, 0 otherwise + */ +AP_DECLARE(int) ap_strcmp_match(const char *str, const char *expected); +/** + * Determine if a string matches a patterm containing the wildcards '?' or '*', + * ignoring case + * @param str The string to check + * @param expected The pattern to match against + * @return 1 if the two strings match, 0 otherwise + */ +AP_DECLARE(int) ap_strcasecmp_match(const char *str, const char *expected); + +/** + * Find the first occurrence of the substring s2 in s1, regardless of case + * @param s1 The string to search + * @param s2 The substring to search for + * @return A pointer to the beginning of the substring + * @remark See apr_strmatch() for a faster alternative + */ +AP_DECLARE(char *) ap_strcasestr(const char *s1, const char *s2); + +/** + * Return a pointer to the location inside of bigstring immediately after prefix + * @param bigstring The input string + * @param prefix The prefix to strip away + * @return A pointer relative to bigstring after prefix + */ +AP_DECLARE(const char *) ap_stripprefix(const char *bigstring, + const char *prefix); + +/** + * Decode a base64 encoded string into memory allocated from a pool + * @param p The pool to allocate from + * @param bufcoded The encoded string + * @return The decoded string + */ +AP_DECLARE(char *) ap_pbase64decode(apr_pool_t *p, const char *bufcoded); + +/** + * Encode a string into memory allocated from a pool in base 64 format + * @param p The pool to allocate from + * @param strin The plaintext string + * @return The encoded string + */ +AP_DECLARE(char *) ap_pbase64encode(apr_pool_t *p, char *string); + + +/** + * Compile a regular expression to be used later + * @param p The pool to allocate from + * @param pattern the regular expression to compile + * @param cflags The bitwise or of one or more of the following: + * @li #REG_EXTENDED - Use POSIX extended Regular Expressions + * @li #REG_ICASE - Ignore case + * @li #REG_NOSUB - Support for substring addressing of matches + * not required + * @li #REG_NEWLINE - Match-any-character operators don't match new-line + * @return The compiled regular expression + */ +AP_DECLARE(regex_t *) ap_pregcomp(apr_pool_t *p, const char *pattern, + int cflags); + +/** + * Free the memory associated with a compiled regular expression + * @param p The pool the regex was allocated from + * @param reg The regular expression to free + */ +AP_DECLARE(void) ap_pregfree(apr_pool_t *p, regex_t *reg); + +/** + * Match a null-terminated string against a pre-compiled regex. + * @param preg The pre-compiled regex + * @param string The string to match + * @param nmatch Provide information regarding the location of any matches + * @param pmatch Provide information regarding the location of any matches + * @param eflags Bitwise or of any of: + * @li #REG_NOTBOL - match-beginning-of-line operator always + * fails to match + * @li #REG_NOTEOL - match-end-of-line operator always fails to match + * @return 0 for successful match, #REG_NOMATCH otherwise + */ +AP_DECLARE(int) ap_regexec(regex_t *preg, const char *string, + size_t nmatch, regmatch_t pmatch[], int eflags); + +/** + * Return the error code returned by regcomp or regexec into error messages + * @param errcode the error code returned by regexec or regcomp + * @param preg The precompiled regex + * @param errbuf A buffer to store the error in + * @param errbuf_size The size of the buffer + */ +AP_DECLARE(size_t) ap_regerror(int errcode, const regex_t *preg, + char *errbuf, size_t errbuf_size); + +/** + * After performing a successful regex match, you may use this function to + * perform a series of string substitutions based on subexpressions that were + * matched during the call to ap_regexec + * @param p The pool to allocate from + * @param input An arbitrary string containing $1 through $9. These are + * replaced with the corresponding matched sub-expressions + * @param source The string that was originally matched to the regex + * @param nmatch the nmatch returned from ap_pregex + * @param pmatch the pmatch array returned from ap_pregex + */ +AP_DECLARE(char *) ap_pregsub(apr_pool_t *p, const char *input, const char *source, + size_t nmatch, regmatch_t pmatch[]); + +/** + * We want to downcase the type/subtype for comparison purposes + * but nothing else because ;parameter=foo values are case sensitive. + * @param s The content-type to convert to lowercase + */ +AP_DECLARE(void) ap_content_type_tolower(char *s); + +/** + * convert a string to all lowercase + * @param s The string to convert to lowercase + */ +AP_DECLARE(void) ap_str_tolower(char *s); + +/** + * Search a string from left to right for the first occurrence of a + * specific character + * @param str The string to search + * @param c The character to search for + * @return The index of the first occurrence of c in str + */ +AP_DECLARE(int) ap_ind(const char *str, char c); /* Sigh... */ + +/** + * Search a string from right to left for the first occurrence of a + * specific character + * @param str The string to search + * @param c The character to search for + * @return The index of the first occurrence of c in str + */ +AP_DECLARE(int) ap_rind(const char *str, char c); + +/** + * Given a string, replace any bare " with \" . + * @param p The pool to allocate memory from + * @param instring The string to search for " + * @return A copy of the string with escaped quotes + */ +AP_DECLARE(char *) ap_escape_quotes(apr_pool_t *p, const char *instring); + +/* Misc system hackery */ +/** + * Given the name of an object in the file system determine if it is a directory + * @param p The pool to allocate from + * @param name The name of the object to check + * @return 1 if it is a directory, 0 otherwise + */ +AP_DECLARE(int) ap_is_rdirectory(apr_pool_t *p, const char *name); + +/** + * Given the name of an object in the file system determine if it is a directory - this version is symlink aware + * @param p The pool to allocate from + * @param name The name of the object to check + * @return 1 if it is a directory, 0 otherwise + */ +AP_DECLARE(int) ap_is_directory(apr_pool_t *p, const char *name); + +#ifdef _OSD_POSIX +extern const char *os_set_account(apr_pool_t *p, const char *account); +extern int os_init_job_environment(server_rec *s, const char *user_name, int one_process); +#endif /* _OSD_POSIX */ + +/** + * Determine the local host name for the current machine + * @param p The pool to allocate from + * @return A copy of the local host name + */ +char *ap_get_local_host(apr_pool_t *p); + +/** + * Log an assertion to the error log + * @param szExp The assertion that failed + * @param szFile The file the assertion is in + * @param nLine The line the assertion is defined on + */ +AP_DECLARE(void) ap_log_assert(const char *szExp, const char *szFile, int nLine) + __attribute__((noreturn)); + +/** @internal */ +#define ap_assert(exp) ((exp) ? (void)0 : ap_log_assert(#exp,__FILE__,__LINE__)) + +/** + * Redefine assert() to something more useful for an Apache... + * + * Use ap_assert() if the condition should always be checked. + * Use AP_DEBUG_ASSERT() if the condition should only be checked when AP_DEBUG + * is defined. + */ + +#ifdef AP_DEBUG +#define AP_DEBUG_ASSERT(exp) ap_assert(exp) +#else +#define AP_DEBUG_ASSERT(exp) ((void)0) +#endif + +/** + * @defgroup stopsignal flags which indicate places where the sever should stop for debugging. + * @{ + * A set of flags which indicate places where the server should raise(SIGSTOP). + * This is useful for debugging, because you can then attach to that process + * with gdb and continue. This is important in cases where one_process + * debugging isn't possible. + */ +/** stop on a Detach */ +#define SIGSTOP_DETACH 1 +/** stop making a child process */ +#define SIGSTOP_MAKE_CHILD 2 +/** stop spawning a child process */ +#define SIGSTOP_SPAWN_CHILD 4 +/** stop spawning a child process with a piped log */ +#define SIGSTOP_PIPED_LOG_SPAWN 8 +/** stop spawning a CGI child process */ +#define SIGSTOP_CGI_CHILD 16 + +/** Macro to get GDB started */ +#ifdef DEBUG_SIGSTOP +extern int raise_sigstop_flags; +#define RAISE_SIGSTOP(x) do { \ + if (raise_sigstop_flags & SIGSTOP_##x) raise(SIGSTOP);\ + } while (0) +#else +#define RAISE_SIGSTOP(x) +#endif +/** @} */ +/** + * Get HTML describing the address and (optionally) admin of the server. + * @param prefix Text which is prepended to the return value + * @param r The request_rec + * @return HTML describing the server, allocated in @a r's pool. + */ +AP_DECLARE(const char *) ap_psignature(const char *prefix, request_rec *r); + +/** strtoul does not exist on sunos4. */ +#ifdef strtoul +#undef strtoul +#endif +#define strtoul strtoul_is_not_a_portable_function_use_strtol_instead + + /* The C library has functions that allow const to be silently dropped ... + these macros detect the drop in maintainer mode, but use the native + methods for normal builds + + Note that on some platforms (e.g., AIX with gcc, Solaris with gcc), string.h needs + to be included before the macros are defined or compilation will fail. + */ +#include + +AP_DECLARE(char *) ap_strchr(char *s, int c); +AP_DECLARE(const char *) ap_strchr_c(const char *s, int c); +AP_DECLARE(char *) ap_strrchr(char *s, int c); +AP_DECLARE(const char *) ap_strrchr_c(const char *s, int c); +AP_DECLARE(char *) ap_strstr(char *s, const char *c); +AP_DECLARE(const char *) ap_strstr_c(const char *s, const char *c); + +#ifdef AP_DEBUG + +#undef strchr +# define strchr(s, c) ap_strchr(s,c) +#undef strrchr +# define strrchr(s, c) ap_strrchr(s,c) +#undef strstr +# define strstr(s, c) ap_strstr(s,c) + +#else + +/** use this instead of strchr */ +# define ap_strchr(s, c) strchr(s, c) +/** use this instead of strchr */ +# define ap_strchr_c(s, c) strchr(s, c) +/** use this instead of strrchr */ +# define ap_strrchr(s, c) strrchr(s, c) +/** use this instead of strrchr */ +# define ap_strrchr_c(s, c) strrchr(s, c) +/** use this instead of strrstr*/ +# define ap_strstr(s, c) strstr(s, c) +/** use this instead of strrstr*/ +# define ap_strstr_c(s, c) strstr(s, c) + +#endif + +#define AP_NORESTART APR_OS_START_USEERR + 1 + +#ifdef __cplusplus +} +#endif + +#endif /* !APACHE_HTTPD_H */ diff --git a/rubbos/app/httpd-2.0.64/include/mpm_common.h b/rubbos/app/httpd-2.0.64/include/mpm_common.h new file mode 100644 index 00000000..68ead5f7 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/include/mpm_common.h @@ -0,0 +1,298 @@ +/* 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 purpose of this file is to store the code that MOST mpm's will need + * this does not mean a function only goes into this file if every MPM needs + * it. It means that if a function is needed by more than one MPM, and + * future maintenance would be served by making the code common, then the + * function belongs here. + * + * This is going in src/main because it is not platform specific, it is + * specific to multi-process servers, but NOT to Unix. Which is why it + * does not belong in src/os/unix + */ + +#ifndef APACHE_MPM_COMMON_H +#define APACHE_MPM_COMMON_H + +#include "ap_config.h" + +#if APR_HAVE_NETINET_TCP_H +#include /* for TCP_NODELAY */ +#endif + +#include "mpm.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @package Multi-Processing Modules functions + */ + +/* The maximum length of the queue of pending connections, as defined + * by listen(2). Under some systems, it should be increased if you + * are experiencing a heavy TCP SYN flood attack. + * + * It defaults to 511 instead of 512 because some systems store it + * as an 8-bit datatype; 512 truncated to 8-bits is 0, while 511 is + * 255 when truncated. + */ +#ifndef DEFAULT_LISTENBACKLOG +#define DEFAULT_LISTENBACKLOG 511 +#endif + +/** + * Make sure all child processes that have been spawned by the parent process + * have died. This includes process registered as "other_children". + * @warning This is only defined if the MPM defines + * AP_MPM_WANT_RECLAIM_CHILD_PROCESSES + * @param terminate Either 1 or 0. If 1, send the child processes SIGTERM + * each time through the loop. If 0, give the process time to die + * on its own before signalling it. + * @tip This function requires that some macros are defined by the MPM:
    + *  MPM_CHILD_PID -- Get the pid from the specified spot in the scoreboard
    + *  MPM_NOTE_CHILD_KILLED -- Note the child died in the scoreboard
    + * 
    + * @tip The MPM child processes which are reclaimed are those listed + * in the scoreboard as well as those currently registered via + * ap_register_extra_mpm_process(). + */ +#ifdef AP_MPM_WANT_RECLAIM_CHILD_PROCESSES +void ap_reclaim_child_processes(int terminate); +#endif + +/** + * Tell ap_reclaim_child_processes() about an MPM child process which has no + * entry in the scoreboard. + * @warning This is only defined if the MPM defines + * AP_MPM_WANT_RECLAIM_CHILD_PROCESSES + * @param pid The process id of an MPM child process which should be + * reclaimed when ap_reclaim_child_processes() is called. + * @tip If an extra MPM child process terminates prior to calling + * ap_reclaim_child_processes(), remove it from the list of such processes + * by calling ap_unregister_extra_mpm_process(). + */ +#ifdef AP_MPM_WANT_RECLAIM_CHILD_PROCESSES +void ap_register_extra_mpm_process(pid_t pid); +#endif + +/** + * Unregister an MPM child process which was previously registered by a + * call to ap_register_extra_mpm_process(). + * @warning This is only defined if the MPM defines + * AP_MPM_WANT_RECLAIM_CHILD_PROCESSES + * @param pid The process id of an MPM child process which no longer needs to + * be reclaimed. + * @return 1 if the process was found and removed, 0 otherwise + */ +#ifdef AP_MPM_WANT_RECLAIM_CHILD_PROCESSES +int ap_unregister_extra_mpm_process(pid_t pid); +#endif + +/** + * Determine if any child process has died. If no child process died, then + * this process sleeps for the amount of time specified by the MPM defined + * macro SCOREBOARD_MAINTENANCE_INTERVAL. + * @param status The return code if a process has died + * @param ret The process id of the process that died + * @param p The pool to allocate out of + */ +#ifdef AP_MPM_WANT_WAIT_OR_TIMEOUT +void ap_wait_or_timeout(apr_exit_why_e *status, int *exitcode, apr_proc_t *ret, + apr_pool_t *p); +#endif + +/** + * Log why a child died to the error log, if the child died without the + * parent signalling it. + * @param pid The child that has died + * @param status The status returned from ap_wait_or_timeout + * @return 0 on success, APEXIT_CHILDFATAL if MPM should terminate + */ +#ifdef AP_MPM_WANT_PROCESS_CHILD_STATUS +int ap_process_child_status(apr_proc_t *pid, apr_exit_why_e why, int status); +#endif + +#if defined(TCP_NODELAY) && !defined(MPE) && !defined(TPF) +/** + * Turn off the nagle algorithm for the specified socket. The nagle algorithm + * says that we should delay sending partial packets in the hopes of getting + * more data. There are bad interactions between persistent connections and + * Nagle's algorithm that have severe performance penalties. + * @param s The socket to disable nagle for. + */ +void ap_sock_disable_nagle(apr_socket_t *s); +#else +#define ap_sock_disable_nagle(s) /* NOOP */ +#endif + +#ifdef HAVE_GETPWNAM +/** + * Convert a username to a numeric ID + * @param name The name to convert + * @return The user id corresponding to a name + * @deffunc uid_t ap_uname2id(const char *name) + */ +AP_DECLARE(uid_t) ap_uname2id(const char *name); +#endif + +#ifdef HAVE_GETGRNAM +/** + * Convert a group name to a numeric ID + * @param name The name to convert + * @return The group id corresponding to a name + * @deffunc gid_t ap_gname2id(const char *name) + */ +AP_DECLARE(gid_t) ap_gname2id(const char *name); +#endif + +#define AP_MPM_HARD_LIMITS_FILE APACHE_MPM_DIR "/mpm_default.h" + +#ifdef AP_MPM_USES_POD + +typedef struct ap_pod_t ap_pod_t; + +struct ap_pod_t { + apr_file_t *pod_in; + apr_file_t *pod_out; + apr_pool_t *p; + apr_sockaddr_t *sa; +}; + +/** + * Open the pipe-of-death. The pipe of death is used to tell all child + * processes that it is time to die gracefully. + * @param p The pool to use for allocating the pipe + */ +AP_DECLARE(apr_status_t) ap_mpm_pod_open(apr_pool_t *p, ap_pod_t **pod); + +/** + * Check the pipe to determine if the process has been signalled to die. + */ +AP_DECLARE(apr_status_t) ap_mpm_pod_check(ap_pod_t *pod); + +/** + * Close the pipe-of-death + */ +AP_DECLARE(apr_status_t) ap_mpm_pod_close(ap_pod_t *pod); + +/** + * Write data to the pipe-of-death, signalling that one child process + * should die. + * @param p The pool to use when allocating any required structures. + */ +AP_DECLARE(apr_status_t) ap_mpm_pod_signal(ap_pod_t *pod); + +/** + * Write data to the pipe-of-death, signalling that all child process + * should die. + * @param p The pool to use when allocating any required structures. + * @param num The number of child processes to kill + */ +AP_DECLARE(void) ap_mpm_pod_killpg(ap_pod_t *pod, int num); +#endif + +/* + * These data members are common to all mpms. Each new mpm + * should either use the appropriate ap_mpm_set_* function + * in their command table or create their own for custom or + * OS specific needs. These should work for most. + */ + +/** + * The maximum number of requests each child thread or + * process handles before dying off + */ +#ifdef AP_MPM_WANT_SET_MAX_REQUESTS +extern int ap_max_requests_per_child; +const char *ap_mpm_set_max_requests(cmd_parms *cmd, void *dummy, + const char *arg); +#endif + +/** + * The filename used to store the process id. + */ +#ifdef AP_MPM_WANT_SET_PIDFILE +extern const char *ap_pid_fname; +const char *ap_mpm_set_pidfile(cmd_parms *cmd, void *dummy, + const char *arg); +#endif + +/** + * The name of lockfile used when Apache needs to lock the accept() call. + */ +#ifdef AP_MPM_WANT_SET_LOCKFILE +extern const char *ap_lock_fname; +const char *ap_mpm_set_lockfile(cmd_parms *cmd, void *dummy, + const char *arg); +#endif + +/** + * The system mutex implementation to use for the accept mutex. + */ +#ifdef AP_MPM_WANT_SET_ACCEPT_LOCK_MECH +extern apr_lockmech_e ap_accept_lock_mech; +extern const char ap_valid_accept_mutex_string[]; +const char *ap_mpm_set_accept_lock_mech(cmd_parms *cmd, void *dummy, + const char *arg); +#endif + +/* + * Set the scorboard file. + */ +#ifdef AP_MPM_WANT_SET_SCOREBOARD +const char *ap_mpm_set_scoreboard(cmd_parms *cmd, void *dummy, + const char *arg); +#endif + +/* + * The directory that the server changes directory to dump core. + */ +#ifdef AP_MPM_WANT_SET_COREDUMPDIR +extern char ap_coredump_dir[MAX_STRING_LEN]; +extern int ap_coredumpdir_configured; +const char *ap_mpm_set_coredumpdir(cmd_parms *cmd, void *dummy, + const char *arg); +#endif + +#ifdef AP_MPM_WANT_SIGNAL_SERVER +int ap_signal_server(int *, apr_pool_t *); +void ap_mpm_rewrite_args(process_rec *); +#endif + +#ifdef AP_MPM_WANT_SET_MAX_MEM_FREE +extern apr_uint32_t ap_max_mem_free; +extern const char *ap_mpm_set_max_mem_free(cmd_parms *cmd, void *dummy, + const char *arg); +#endif + +#ifdef AP_MPM_WANT_FATAL_SIGNAL_HANDLER +extern apr_status_t ap_fatal_signal_setup(server_rec *s, apr_pool_t *pconf); +extern apr_status_t ap_fatal_signal_child_setup(server_rec *s); +#endif + +#if AP_ENABLE_EXCEPTION_HOOK +extern const char *ap_mpm_set_exception_hook(cmd_parms *cmd, void *dummy, + const char *arg); +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* !APACHE_MPM_COMMON_H */ diff --git a/rubbos/app/httpd-2.0.64/include/pcreposix.h b/rubbos/app/httpd-2.0.64/include/pcreposix.h new file mode 100644 index 00000000..a847421f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/include/pcreposix.h @@ -0,0 +1,99 @@ +/************************************************* +* Perl-Compatible Regular Expressions * +*************************************************/ + +/* Copyright (c) 1997-2000 University of Cambridge */ + +/** + * @file include/pcreposix.h + * @brief PCRE definitions + */ + +#ifndef _PCREPOSIX_H +#define _PCREPOSIX_H + +/* This is the header for the POSIX wrapper interface to the PCRE Perl- +Compatible Regular Expression library. It defines the things POSIX says should +be there. I hope. */ + +/* Have to include stdlib.h in order to ensure that size_t is defined. */ + +#include + +/* Allow for C++ users */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Options defined by POSIX. */ + + /** Ignore case */ +#define REG_ICASE 0x01 + /** Don't match newlines with wildcards */ +#define REG_NEWLINE 0x02 + /** Don't match BOL */ +#define REG_NOTBOL 0x04 + /** Don't match EOL */ +#define REG_NOTEOL 0x08 + +/* These are not used by PCRE, but by defining them we make it easier +to slot PCRE into existing programs that make POSIX calls. */ + + /** UNUSED! */ +#define REG_EXTENDED 0 + /** UNUSED! */ +#define REG_NOSUB 0 + +/* Error values. Not all these are relevant or used by the wrapper. */ + +enum { + REG_ASSERT = 1, /* internal error ? */ + REG_BADBR, /* invalid repeat counts in {} */ + REG_BADPAT, /* pattern error */ + REG_BADRPT, /* ? * + invalid */ + REG_EBRACE, /* unbalanced {} */ + REG_EBRACK, /* unbalanced [] */ + REG_ECOLLATE, /* collation error - not relevant */ + REG_ECTYPE, /* bad class */ + REG_EESCAPE, /* bad escape sequence */ + REG_EMPTY, /* empty expression */ + REG_EPAREN, /* unbalanced () */ + REG_ERANGE, /* bad range inside [] */ + REG_ESIZE, /* expression too big */ + REG_ESPACE, /* failed to get memory */ + REG_ESUBREG, /* bad back reference */ + REG_INVARG, /* bad argument */ + REG_NOMATCH /* match failed */ +}; + + +/* The structure representing a compiled regular expression. */ + +typedef struct { + void *re_pcre; + size_t re_nsub; + size_t re_erroffset; +} regex_t; + +/* The structure in which a captured offset is returned. */ + +typedef int regoff_t; + +typedef struct { + regoff_t rm_so; + regoff_t rm_eo; +} regmatch_t; + +/* The functions */ + +extern int regcomp(regex_t *, const char *, int); +extern int regexec(regex_t *, const char *, size_t, regmatch_t *, int); +extern size_t regerror(int, const regex_t *, char *, size_t); +extern void regfree(regex_t *); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif /* End of pcreposix.h */ diff --git a/rubbos/app/httpd-2.0.64/include/rfc1413.h b/rubbos/app/httpd-2.0.64/include/rfc1413.h new file mode 100644 index 00000000..a4ffdf11 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/include/rfc1413.h @@ -0,0 +1,42 @@ +/* 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. + */ + +#ifndef APACHE_RFC1413_H +#define APACHE_RFC1413_H + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @package RFC1413 package + */ + +/** + * Retrieve the remote user name, given socket structures. This implements + * RFC1413, which involves querying the client's identd or auth daemon. + * @param conn The current connection + * @param srv The current server + * @return The remote user name + * @deffunc char *ap_rfc1413(conn_rec *conn, server_rec *srv) + */ +extern char *ap_rfc1413(conn_rec *conn, server_rec *srv); + +#ifdef __cplusplus +} +#endif + +#endif /* !APACHE_RFC1413_H */ diff --git a/rubbos/app/httpd-2.0.64/include/scoreboard.h b/rubbos/app/httpd-2.0.64/include/scoreboard.h new file mode 100644 index 00000000..6ca18582 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/include/scoreboard.h @@ -0,0 +1,197 @@ +/* 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. + */ + +#ifndef APACHE_SCOREBOARD_H +#define APACHE_SCOREBOARD_H + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef HAVE_SYS_TIMES_H +#include +#include +#elif defined(TPF) +#include +#endif + +#include "ap_config.h" +#include "apr_hooks.h" +#include "apr_thread_proc.h" +#include "apr_portable.h" +#include "apr_shm.h" + +/* Scoreboard file, if there is one */ +#ifndef DEFAULT_SCOREBOARD +#define DEFAULT_SCOREBOARD "logs/apache_runtime_status" +#endif + +/* Scoreboard info on a process is, for now, kept very brief --- + * just status value and pid (the latter so that the caretaker process + * can properly update the scoreboard when a process dies). We may want + * to eventually add a separate set of long_score structures which would + * give, for each process, the number of requests serviced, and info on + * the current, or most recent, request. + * + * Status values: + */ + +#define SERVER_DEAD 0 +#define SERVER_STARTING 1 /* Server Starting up */ +#define SERVER_READY 2 /* Waiting for connection (or accept() lock) */ +#define SERVER_BUSY_READ 3 /* Reading a client request */ +#define SERVER_BUSY_WRITE 4 /* Processing a client request */ +#define SERVER_BUSY_KEEPALIVE 5 /* Waiting for more requests via keepalive */ +#define SERVER_BUSY_LOG 6 /* Logging the request */ +#define SERVER_BUSY_DNS 7 /* Looking up a hostname */ +#define SERVER_CLOSING 8 /* Closing the connection */ +#define SERVER_GRACEFUL 9 /* server is gracefully finishing request */ +#define SERVER_IDLE_KILL 10 /* Server is cleaning up idle children. */ +#define SERVER_NUM_STATUS 11 /* number of status settings */ + +/* Type used for generation indicies. Startup and every restart cause a + * new generation of children to be spawned. Children within the same + * generation share the same configuration information -- pointers to stuff + * created at config time in the parent are valid across children. However, + * this can't work effectively with non-forked architectures. So while the + * arrays in the scoreboard never change between the parent and forked + * children, so they do not require shm storage, the contents of the shm + * may contain no pointers. + */ +typedef int ap_generation_t; + +/* Is the scoreboard shared between processes or not? + * Set by the MPM when the scoreboard is created. + */ +typedef enum { + SB_NOT_SHARED = 1, + SB_SHARED = 2 +} ap_scoreboard_e; + +#define SB_WORKING 0 /* The server is busy and the child is useful. */ +#define SB_IDLE_DIE 1 /* The server is idle and the child is superfluous. */ + /* The child should check for this and exit gracefully. */ + +/* stuff which is worker specific */ +/***********************WARNING***************************************/ +/* These are things that are used by mod_status. Do not put anything */ +/* in here that you cannot live without. This structure will not */ +/* be available if mod_status is not loaded. */ +/*********************************************************************/ +typedef struct worker_score worker_score; + +struct worker_score { + int thread_num; +#if APR_HAS_THREADS + apr_os_thread_t tid; +#endif + unsigned char status; + unsigned long access_count; + apr_off_t bytes_served; + unsigned long my_access_count; + apr_off_t my_bytes_served; + apr_off_t conn_bytes; + unsigned short conn_count; + apr_time_t start_time; + apr_time_t stop_time; +#ifdef HAVE_TIMES + struct tms times; +#endif + apr_time_t last_used; + char client[32]; /* Keep 'em small... */ + char request[64]; /* We just want an idea... */ + char vhost[32]; /* What virtual host is being accessed? */ +}; + +typedef struct { + int server_limit; + int thread_limit; + ap_scoreboard_e sb_type; + ap_generation_t running_generation; /* the generation of children which + * should still be serving requests. */ + apr_time_t restart_time; +} global_score; + +/* stuff which the parent generally writes and the children rarely read */ +typedef struct process_score process_score; +struct process_score{ + pid_t pid; + ap_generation_t generation; /* generation of this child */ + ap_scoreboard_e sb_type; + int quiescing; /* the process whose pid is stored above is + * going down gracefully + */ +}; + +/* Scoreboard is now in 'local' memory, since it isn't updated once created, + * even in forked architectures. Child created-processes (non-fork) will + * set up these indicies into the (possibly relocated) shmem records. + */ +typedef struct { + global_score *global; + process_score *parent; + worker_score **servers; +} scoreboard; + +typedef struct ap_sb_handle_t ap_sb_handle_t; + +AP_DECLARE(int) ap_exists_scoreboard_image(void); +AP_DECLARE(void) ap_increment_counts(ap_sb_handle_t *sbh, request_rec *r); + +int ap_create_scoreboard(apr_pool_t *p, ap_scoreboard_e t); +apr_status_t ap_reopen_scoreboard(apr_pool_t *p, apr_shm_t **shm, int detached); +void ap_init_scoreboard(void *shared_score); +AP_DECLARE(int) ap_calc_scoreboard_size(void); +apr_status_t ap_cleanup_scoreboard(void *d); + +AP_DECLARE(void) ap_create_sb_handle(ap_sb_handle_t **new_sbh, apr_pool_t *p, + int child_num, int thread_num); + +AP_DECLARE(int) find_child_by_pid(apr_proc_t *pid); +AP_DECLARE(int) ap_update_child_status(ap_sb_handle_t *sbh, int status, request_rec *r); +AP_DECLARE(int) ap_update_child_status_from_indexes(int child_num, int thread_num, + int status, request_rec *r); +void ap_time_process_request(ap_sb_handle_t *sbh, int status); + +AP_DECLARE(worker_score *) ap_get_scoreboard_worker(int x, int y); +AP_DECLARE(process_score *) ap_get_scoreboard_process(int x); +AP_DECLARE(global_score *) ap_get_scoreboard_global(void); + +AP_DECLARE_DATA extern scoreboard *ap_scoreboard_image; +AP_DECLARE_DATA extern const char *ap_scoreboard_fname; +AP_DECLARE_DATA extern int ap_extended_status; + +AP_DECLARE_DATA extern ap_generation_t volatile ap_my_generation; + +/* Hooks */ +/** + * Hook for post scoreboard creation, pre mpm. + * @param p Apache pool to allocate from. + * @param sb_type + * @ingroup hooks + * @return OK or DECLINE on success; anything else is a error + */ +AP_DECLARE_HOOK(int, pre_mpm, (apr_pool_t *p, ap_scoreboard_e sb_type)) + +/* for time_process_request() in http_main.c */ +#define START_PREQUEST 1 +#define STOP_PREQUEST 2 + +#ifdef __cplusplus +} +#endif + +#endif /* !APACHE_SCOREBOARD_H */ diff --git a/rubbos/app/httpd-2.0.64/include/util_cfgtree.h b/rubbos/app/httpd-2.0.64/include/util_cfgtree.h new file mode 100644 index 00000000..a23330bc --- /dev/null +++ b/rubbos/app/httpd-2.0.64/include/util_cfgtree.h @@ -0,0 +1,79 @@ +/* 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. + */ + +#ifndef AP_CONFTREE_H +#define AP_CONFTREE_H + +#include "ap_config.h" + +/** + * @package Config Tree Package + */ + +typedef struct ap_directive_t ap_directive_t; + +/** + * Structure used to build the config tree. The config tree only stores + * the directives that will be active in the running server. Directives + * that contain other directions, such as cause a sub-level + * to be created, where the included directives are stored. The closing + * directive () is not stored in the tree. + */ +struct ap_directive_t { + /** The current directive */ + const char *directive; + /** The arguments for the current directive, stored as a space + * separated list */ + const char *args; + /** The next directive node in the tree + * @defvar ap_directive_t *next */ + struct ap_directive_t *next; + /** The first child node of this directive + * @defvar ap_directive_t *first_child */ + struct ap_directive_t *first_child; + /** The parent node of this directive + * @defvar ap_directive_t *parent */ + struct ap_directive_t *parent; + + /** directive's module can store add'l data here */ + void *data; + + /* ### these may go away in the future, but are needed for now */ + /** The name of the file this directive was found in */ + const char *filename; + /** The line number the directive was on */ + int line_num; +}; + +/** + * The root of the configuration tree + * @defvar ap_directive_t *conftree + */ +AP_DECLARE_DATA extern ap_directive_t *ap_conftree; + +/** + * Add a node to the configuration tree. + * @param parent The current parent node. If the added node is a first_child, + then this is changed to the current node + * @param current The current node + * @param toadd The node to add to the tree + * @param child Is the node to add a child node + * @return the added node + */ +ap_directive_t *ap_add_node(ap_directive_t **parent, ap_directive_t *current, + ap_directive_t *toadd, int child); + +#endif diff --git a/rubbos/app/httpd-2.0.64/include/util_charset.h b/rubbos/app/httpd-2.0.64/include/util_charset.h new file mode 100644 index 00000000..449a8700 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/include/util_charset.h @@ -0,0 +1,54 @@ +/* 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. + */ + +#ifndef APACHE_UTIL_CHARSET_H +#define APACHE_UTIL_CHARSET_H + +#ifdef APACHE_XLATE + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @package charset conversion + */ +#include "apr_xlate.h" + +/** On EBCDIC machine this is a translation handle used to translate the + * headers from the local machine format to ASCII for network transmission. + * On an ASCII machine this is NULL */ +extern apr_xlate_t *ap_hdrs_to_ascii; +/** On EBCDIC machine this is a translation handle used to translate the + * headers from ASCII to the local machine format after network transmission. + * On an ASCII machine this is NULL */ +extern apr_xlate_t *ap_hdrs_from_ascii; +/** On EBCDIC machine this is a translation handle used to translate the + * content from the local machine format to ASCII for network transmission. + * On an ASCII machine this is NULL */ +extern apr_xlate_t *ap_locale_to_ascii; +/** On EBCDIC machine this is a translation handle used to translate the + * content from ASCII to the local machine format after network transmission. + * On an ASCII machine this is NULL */ +extern apr_xlate_t *ap_locale_from_ascii; + +#ifdef __cplusplus +} +#endif + +#endif /* APACHE_XLATE */ + +#endif /* !APACHE_UTIL_CHARSET_H */ diff --git a/rubbos/app/httpd-2.0.64/include/util_ebcdic.h b/rubbos/app/httpd-2.0.64/include/util_ebcdic.h new file mode 100644 index 00000000..0cd54cee --- /dev/null +++ b/rubbos/app/httpd-2.0.64/include/util_ebcdic.h @@ -0,0 +1,78 @@ +/* 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. + */ + +#ifndef APACHE_UTIL_EBCDIC_H +#define APACHE_UTIL_EBCDIC_H + + +#ifdef __cplusplus +extern "C" { +#endif + +#include "apr_xlate.h" +#include "httpd.h" +#include "util_charset.h" + +/** + * @package Utilities for EBCDIC conversion + */ + +#if APR_CHARSET_EBCDIC + +/** + * Setup all of the global translation handlers + * @param pool pool to allocate out of + */ +apr_status_t ap_init_ebcdic(apr_pool_t *pool); + +/** + * Convert protocol data from the implementation character + * set to ASCII. + * @param buffer buffer to translate + * @param len number of bytes to translate + */ +void ap_xlate_proto_to_ascii(char *buffer, apr_size_t len); + +/** + * Convert protocol data to the implementation character + * set from ASCII. + * @param buffer buffer to translate + * @param len number of bytes to translate + */ +void ap_xlate_proto_from_ascii(char *buffer, apr_size_t len); + +/** + * Convert protocol data from the implementation charater + * set to ASCII, then send it. + * @param r the current request + * @param ... the strings to write, followed by a NULL pointer + */ +int ap_rvputs_proto_in_ascii(request_rec *r, ...); + +#else /* APR_CHARSET_EBCDIC */ + +#define ap_xlate_proto_to_ascii(x,y) /* NOOP */ +#define ap_xlate_proto_from_ascii(x,y) /* NOOP */ + +#define ap_rvputs_proto_in_ascii ap_rvputs + +#endif /* APR_CHARSET_EBCDIC */ + +#ifdef __cplusplus +} +#endif + +#endif /* !APACHE_UTIL_EBCDIC_H */ diff --git a/rubbos/app/httpd-2.0.64/include/util_filter.h b/rubbos/app/httpd-2.0.64/include/util_filter.h new file mode 100644 index 00000000..a5c9802a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/include/util_filter.h @@ -0,0 +1,516 @@ +/* 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. + */ + +#ifndef AP_FILTER_H +#define AP_FILTER_H + +#include "apr.h" +#include "apr_buckets.h" + +#include "httpd.h" + +#if APR_HAVE_STDARG_H +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @file util_filter.h + * @brief Apache filter library + */ + +/** Returned by the bottom-most filter if no data was written. + * @see ap_pass_brigade(). */ +#define AP_NOBODY_WROTE -1 +/** Returned by the bottom-most filter if no data was read. + * @see ap_get_brigade(). */ +#define AP_NOBODY_READ -2 +/** Returned when?? @bug find out when! */ +#define AP_FILTER_ERROR -3 + +/** + * input filtering modes + */ +typedef enum { + /** The filter should return at most readbytes data. */ + AP_MODE_READBYTES, + /** The filter should return at most one line of CRLF data. + * (If a potential line is too long or no CRLF is found, the + * filter may return partial data). + */ + AP_MODE_GETLINE, + /** The filter should implicitly eat any CRLF pairs that it sees. */ + AP_MODE_EATCRLF, + /** The filter read should be treated as speculative and any returned + * data should be stored for later retrieval in another mode. */ + AP_MODE_SPECULATIVE, + /** The filter read should be exhaustive and read until it can not + * read any more. + * Use this mode with extreme caution. + */ + AP_MODE_EXHAUSTIVE, + /** The filter should initialize the connection if needed, + * NNTP or FTP over SSL for example. + */ + AP_MODE_INIT +} ap_input_mode_t; + +/** + * @defgroup filter FILTER CHAIN + * + * Filters operate using a "chaining" mechanism. The filters are chained + * together into a sequence. When output is generated, it is passed through + * each of the filters on this chain, until it reaches the end (or "bottom") + * and is placed onto the network. + * + * The top of the chain, the code generating the output, is typically called + * a "content generator." The content generator's output is fed into the + * filter chain using the standard Apache output mechanisms: ap_rputs(), + * ap_rprintf(), ap_rwrite(), etc. + * + * Each filter is defined by a callback. This callback takes the output from + * the previous filter (or the content generator if there is no previous + * filter), operates on it, and passes the result to the next filter in the + * chain. This pass-off is performed using the ap_fc_* functions, such as + * ap_fc_puts(), ap_fc_printf(), ap_fc_write(), etc. + * + * When content generation is complete, the system will pass an "end of + * stream" marker into the filter chain. The filters will use this to flush + * out any internal state and to detect incomplete syntax (for example, an + * unterminated SSI directive). + */ + +/* forward declare the filter type */ +typedef struct ap_filter_t ap_filter_t; + +/** + * @name Filter callbacks + * + * This function type is used for filter callbacks. It will be passed a + * pointer to "this" filter, and a "bucket" containing the content to be + * filtered. + * + * In filter->ctx, the callback will find its context. This context is + * provided here, so that a filter may be installed multiple times, each + * receiving its own per-install context pointer. + * + * Callbacks are associated with a filter definition, which is specified + * by name. See ap_register_input_filter() and ap_register_output_filter() + * for setting the association between a name for a filter and its + * associated callback (and other information). + * + * If the initialization function argument passed to the registration + * functions is non-NULL, it will be called iff the filter is in the input + * or output filter chains and before any data is generated to allow the + * filter to prepare for processing. + * + * The *bucket structure (and all those referenced by ->next and ->prev) + * should be considered "const". The filter is allowed to modify the + * next/prev to insert/remove/replace elements in the bucket list, but + * the types and values of the individual buckets should not be altered. + * + * For the input and output filters, the return value of a filter should be + * an APR status value. For the init function, the return value should + * be an HTTP error code or OK if it was successful. + * + * @ingroup filter + * @{ + */ +typedef apr_status_t (*ap_out_filter_func)(ap_filter_t *f, + apr_bucket_brigade *b); +typedef apr_status_t (*ap_in_filter_func)(ap_filter_t *f, + apr_bucket_brigade *b, + ap_input_mode_t mode, + apr_read_type_e block, + apr_off_t readbytes); +typedef int (*ap_init_filter_func)(ap_filter_t *f); + +typedef union ap_filter_func { + ap_out_filter_func out_func; + ap_in_filter_func in_func; +} ap_filter_func; + +/** @} */ + +/** + * Filters have different types/classifications. These are used to group + * and sort the filters to properly sequence their operation. + * + * The types have a particular sort order, which allows us to insert them + * into the filter chain in a determistic order. Within a particular grouping, + * the ordering is equivalent to the order of calls to ap_add_*_filter(). + */ +typedef enum { + /** These filters are used to alter the content that is passed through + * them. Examples are SSI or PHP. */ + AP_FTYPE_RESOURCE = 10, + /** These filters are used to alter the content as a whole, but after all + * AP_FTYPE_RESOURCE filters are executed. These filters should not + * change the content-type. An example is deflate. */ + AP_FTYPE_CONTENT_SET = 20, + /** These filters are used to handle the protocol between server and + * client. Examples are HTTP and POP. */ + AP_FTYPE_PROTOCOL = 30, + /** These filters implement transport encodings (e.g., chunking). */ + AP_FTYPE_TRANSCODE = 40, + /** These filters will alter the content, but in ways that are + * more strongly associated with the connection. Examples are + * splitting an HTTP connection into multiple requests and + * buffering HTTP responses across multiple requests. + * + * It is important to note that these types of filters are not + * allowed in a sub-request. A sub-request's output can certainly + * be filtered by ::AP_FTYPE_RESOURCE filters, but all of the "final + * processing" is determined by the main request. */ + AP_FTYPE_CONNECTION = 50, + /** These filters don't alter the content. They are responsible for + * sending/receiving data to/from the client. */ + AP_FTYPE_NETWORK = 60 +} ap_filter_type; + +/** + * This is the request-time context structure for an installed filter (in + * the output filter chain). It provides the callback to use for filtering, + * the request this filter is associated with (which is important when + * an output chain also includes sub-request filters), the context for this + * installed filter, and the filter ordering/chaining fields. + * + * Filter callbacks are free to use ->ctx as they please, to store context + * during the filter process. Generally, this is superior over associating + * the state directly with the request. A callback should not change any of + * the other fields. + */ + +typedef struct ap_filter_rec_t ap_filter_rec_t; + +/** + * This structure is used for recording information about the + * registered filters. It associates a name with the filter's callback + * and filter type. + * + * At the moment, these are simply linked in a chain, so a ->next pointer + * is available. + */ +struct ap_filter_rec_t { + /** The registered name for this filter */ + const char *name; + /** The function to call when this filter is invoked. */ + ap_filter_func filter_func; + /** The function to call before the handlers are invoked. Notice + * that this function is called only for filters participating in + * the http protocol. Filters for other protocols are to be + * initiliazed by the protocols themselves. */ + ap_init_filter_func filter_init_func; + /** The type of filter, either AP_FTYPE_CONTENT or AP_FTYPE_CONNECTION. + * An AP_FTYPE_CONTENT filter modifies the data based on information + * found in the content. An AP_FTYPE_CONNECTION filter modifies the + * data based on the type of connection. + */ + ap_filter_type ftype; + + /** The next filter_rec in the list */ + struct ap_filter_rec_t *next; +}; + +/** + * The representation of a filter chain. Each request has a list + * of these structures which are called in turn to filter the data. Sub + * requests get an exact copy of the main requests filter chain. + */ +struct ap_filter_t { + /** The internal representation of this filter. This includes + * the filter's name, type, and the actual function pointer. + */ + ap_filter_rec_t *frec; + + /** A place to store any data associated with the current filter */ + void *ctx; + + /** The next filter in the chain */ + ap_filter_t *next; + + /** The request_rec associated with the current filter. If a sub-request + * adds filters, then the sub-request is the request associated with the + * filter. + */ + request_rec *r; + + /** The conn_rec associated with the current filter. This is analogous + * to the request_rec, except that it is used for input filtering. + */ + conn_rec *c; +}; + +/** + * Get the current bucket brigade from the next filter on the filter + * stack. The filter returns an apr_status_t value. If the bottom-most + * filter doesn't read from the network, then ::AP_NOBODY_READ is returned. + * The bucket brigade will be empty when there is nothing left to get. + * @param filter The next filter in the chain + * @param bucket The current bucket brigade. The original brigade passed + * to ap_get_brigade() must be empty. + * @param mode The way in which the data should be read + * @param block How the operations should be performed + * ::APR_BLOCK_READ, ::APR_NONBLOCK_READ + * @param readbytes How many bytes to read from the next filter. + */ +AP_DECLARE(apr_status_t) ap_get_brigade(ap_filter_t *filter, + apr_bucket_brigade *bucket, + ap_input_mode_t mode, + apr_read_type_e block, + apr_off_t readbytes); + +/** + * Pass the current bucket brigade down to the next filter on the filter + * stack. The filter returns an apr_status_t value. If the bottom-most + * filter doesn't write to the network, then ::AP_NOBODY_WROTE is returned. + * The caller relinquishes ownership of the brigade. + * @param filter The next filter in the chain + * @param bucket The current bucket brigade + */ +AP_DECLARE(apr_status_t) ap_pass_brigade(ap_filter_t *filter, + apr_bucket_brigade *bucket); + +/** + * This function is used to register an input filter with the system. + * After this registration is performed, then a filter may be added + * into the filter chain by using ap_add_input_filter() and simply + * specifying the name. + * + * @param name The name to attach to the filter function + * @param filter_func The filter function to name + * @param filter_init The function to call before the filter handlers + are invoked + * @param ftype The type of filter function, either ::AP_FTYPE_CONTENT or + * ::AP_FTYPE_CONNECTION + * @see add_input_filter() + */ +AP_DECLARE(ap_filter_rec_t *) ap_register_input_filter(const char *name, + ap_in_filter_func filter_func, + ap_init_filter_func filter_init, + ap_filter_type ftype); +/** + * This function is used to register an output filter with the system. + * After this registration is performed, then a filter may be added + * into the filter chain by using ap_add_output_filter() and simply + * specifying the name. + * + * @param name The name to attach to the filter function + * @param filter_func The filter function to name + * @param filter_init The function to call before the filter handlers + * are invoked + * @param ftype The type of filter function, either ::AP_FTYPE_CONTENT or + * ::AP_FTYPE_CONNECTION + * @see ap_add_output_filter() + */ +AP_DECLARE(ap_filter_rec_t *) ap_register_output_filter(const char *name, + ap_out_filter_func filter_func, + ap_init_filter_func filter_init, + ap_filter_type ftype); + +/** + * Adds a named filter into the filter chain on the specified request record. + * The filter will be installed with the specified context pointer. + * + * Filters added in this way will always be placed at the end of the filters + * that have the same type (thus, the filters have the same order as the + * calls to ap_add_filter). If the current filter chain contains filters + * from another request, then this filter will be added before those other + * filters. + * + * To re-iterate that last comment. This function is building a FIFO + * list of filters. Take note of that when adding your filter to the chain. + * + * @param name The name of the filter to add + * @param ctx Context data to provide to the filter + * @param r The request to add this filter for (or NULL if it isn't associated with a request) + * @param c The connection to add the fillter for + */ +AP_DECLARE(ap_filter_t *) ap_add_input_filter(const char *name, void *ctx, + request_rec *r, conn_rec *c); + +/** + * Variant of ap_add_input_filter() that accepts a registered filter handle + * (as returned by ap_register_input_filter()) rather than a filter name + * + * @param f The filter handle to add + * @param ctx Context data to provide to the filter + * @param r The request to add this filter for (or NULL if it isn't associated with a request) + * @param c The connection to add the fillter for + */ +AP_DECLARE(ap_filter_t *) ap_add_input_filter_handle(ap_filter_rec_t *f, + void *ctx, + request_rec *r, + conn_rec *c); + +/** + * Returns the filter handle for use with ap_add_input_filter_handle. + * + * @param name The filter name to look up + */ +AP_DECLARE(ap_filter_rec_t *) ap_get_input_filter_handle(const char *name); + +/** + * Add a filter to the current request. Filters are added in a FIFO manner. + * The first filter added will be the first filter called. + * @param name The name of the filter to add + * @param ctx Context data to set in the filter + * @param r The request to add this filter for (or NULL if it isn't associated with a request) + * @param c The connection to add this filter for + */ +AP_DECLARE(ap_filter_t *) ap_add_output_filter(const char *name, void *ctx, + request_rec *r, conn_rec *c); + +/** + * Variant of ap_add_output_filter() that accepts a registered filter handle + * (as returned by ap_register_output_filter()) rather than a filter name + * + * @param f The filter handle to add + * @param r The request to add this filter for (or NULL if it isn't associated with a request) + * @param c The connection to add the fillter for + */ +AP_DECLARE(ap_filter_t *) ap_add_output_filter_handle(ap_filter_rec_t *f, + void *ctx, + request_rec *r, + conn_rec *c); + +/** + * Returns the filter handle for use with ap_add_output_filter_handle. + * + * @param name The filter name to look up + */ +AP_DECLARE(ap_filter_rec_t *) ap_get_output_filter_handle(const char *name); + +/** + * Remove an input filter from either the request or connection stack + * it is associated with. + * @param f The filter to remove + */ + +AP_DECLARE(void) ap_remove_input_filter(ap_filter_t *f); + +/** + * Remove an output filter from either the request or connection stack + * it is associated with. + * @param f The filter to remove + */ + +AP_DECLARE(void) ap_remove_output_filter(ap_filter_t *f); + +/* The next two filters are for abstraction purposes only. They could be + * done away with, but that would require that we break modules if we ever + * want to change our filter registration method. The basic idea, is that + * all filters have a place to store data, the ctx pointer. These functions + * fill out that pointer with a bucket brigade, and retrieve that data on + * the next call. The nice thing about these functions, is that they + * automatically concatenate the bucket brigades together for you. This means + * that if you have already stored a brigade in the filters ctx pointer, then + * when you add more it will be tacked onto the end of that brigade. When + * you retrieve data, if you pass in a bucket brigade to the get function, + * it will append the current brigade onto the one that you are retrieving. + */ + +/** + * prepare a bucket brigade to be setaside. If a different brigade was + * set-aside earlier, then the two brigades are concatenated together. + * @param f The current filter + * @param save_to The brigade that was previously set-aside. Regardless, the + * new bucket brigade is returned in this location. + * @param b The bucket brigade to save aside. This brigade is always empty + * on return + * @param p Ensure that all data in the brigade lives as long as this pool + */ +AP_DECLARE(apr_status_t) ap_save_brigade(ap_filter_t *f, + apr_bucket_brigade **save_to, + apr_bucket_brigade **b, apr_pool_t *p); + +/** + * Flush function for apr_brigade_* calls. This calls ap_pass_brigade + * to flush the brigade if the brigade buffer overflows. + * @param bb The brigade to flush + * @param ctx The filter to pass the brigade to + * @note this function has nothing to do with FLUSH buckets. It is simply + * a way to flush content out of a brigade and down a filter stack. + */ +AP_DECLARE_NONSTD(apr_status_t) ap_filter_flush(apr_bucket_brigade *bb, + void *ctx); + +/** + * Flush the current brigade down the filter stack. + * @param f The current filter + * @param bb The brigade to flush + */ +AP_DECLARE(apr_status_t) ap_fflush(ap_filter_t *f, apr_bucket_brigade *bb); + +/** + * Write a buffer for the current filter, buffering if possible. + * @param f the filter doing the writing + * @param bb The brigade to buffer into + * @param data The data to write + * @param nbyte The number of bytes in the data + */ +#define ap_fwrite(f, bb, data, nbyte) \ + apr_brigade_write(bb, ap_filter_flush, f, data, nbyte) + +/** + * Write a buffer for the current filter, buffering if possible. + * @param f the filter doing the writing + * @param bb The brigade to buffer into + * @param str The string to write + */ +#define ap_fputs(f, bb, str) \ + apr_brigade_puts(bb, ap_filter_flush, f, str) + +/** + * Write a character for the current filter, buffering if possible. + * @param f the filter doing the writing + * @param bb The brigade to buffer into + * @param c The character to write + */ +#define ap_fputc(f, bb, c) \ + apr_brigade_putc(bb, ap_filter_flush, f, c) + +/** + * Write an unspecified number of strings to the current filter + * @param f the filter doing the writing + * @param bb The brigade to buffer into + * @param ... The strings to write + */ +AP_DECLARE_NONSTD(apr_status_t) ap_fputstrs(ap_filter_t *f, + apr_bucket_brigade *bb, + ...); + +/** + * Output data to the filter in printf format + * @param f the filter doing the writing + * @param bb The brigade to buffer into + * @param fmt The format string + * @param ... The argumets to use to fill out the format string + */ +AP_DECLARE_NONSTD(apr_status_t) ap_fprintf(ap_filter_t *f, + apr_bucket_brigade *bb, + const char *fmt, + ...) + __attribute__((format(printf,3,4))); + +#ifdef __cplusplus +} +#endif + +#endif /* !AP_FILTER_H */ diff --git a/rubbos/app/httpd-2.0.64/include/util_ldap.h b/rubbos/app/httpd-2.0.64/include/util_ldap.h new file mode 100644 index 00000000..605f3b72 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/include/util_ldap.h @@ -0,0 +1,318 @@ +/* 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. + */ + +#ifndef UTIL_LDAP_H +#define UTIL_LDAP_H + +#include + +/* this whole thing disappears if LDAP is not enabled */ +#ifdef APU_HAS_LDAP + +/* APR header files */ +#include +#include +#include +#include + +/* Apache header files */ +#include "ap_config.h" +#include "httpd.h" +#include "http_config.h" +#include "http_core.h" +#include "http_log.h" +#include "http_protocol.h" +#include "http_request.h" + +#if APR_HAS_SHARED_MEMORY +#include "apr_rmm.h" +#include "apr_shm.h" +#endif + +/* Create a set of LDAP_DECLARE(type), LDLDAP_DECLARE(type) and + * LDAP_DECLARE_DATA with appropriate export and import tags for the platform + */ +#if !defined(WIN32) +#define LDAP_DECLARE(type) type +#define LDAP_DECLARE_NONSTD(type) type +#define LDAP_DECLARE_DATA +#elif defined(LDAP_DECLARE_STATIC) +#define LDAP_DECLARE(type) type __stdcall +#define LDAP_DECLARE_NONSTD(type) type +#define LDAP_DECLARE_DATA +#elif defined(LDAP_DECLARE_EXPORT) +#define LDAP_DECLARE(type) __declspec(dllexport) type __stdcall +#define LDAP_DECLARE_NONSTD(type) __declspec(dllexport) type +#define LDAP_DECLARE_DATA __declspec(dllexport) +#else +#define LDAP_DECLARE(type) __declspec(dllimport) type __stdcall +#define LDAP_DECLARE_NONSTD(type) __declspec(dllimport) type +#define LDAP_DECLARE_DATA __declspec(dllimport) +#endif + +/* + * LDAP Connections + */ + +/* Values that the deref member can have */ +typedef enum { + never=LDAP_DEREF_NEVER, + searching=LDAP_DEREF_SEARCHING, + finding=LDAP_DEREF_FINDING, + always=LDAP_DEREF_ALWAYS +} deref_options; + +/* Structure representing an LDAP connection */ +typedef struct util_ldap_connection_t { + LDAP *ldap; + apr_pool_t *pool; /* Pool from which this connection is created */ +#if APR_HAS_THREADS + apr_thread_mutex_t *lock; /* Lock to indicate this connection is in use */ +#endif + int bound; /* Flag to indicate whether this connection is bound yet */ + + const char *host; /* Name of the LDAP server (or space separated list) */ + int port; /* Port of the LDAP server */ + deref_options deref; /* how to handle alias dereferening */ + + const char *binddn; /* DN to bind to server (can be NULL) */ + const char *bindpw; /* Password to bind to server (can be NULL) */ + + int secure; /* True if use SSL connection */ + + const char *reason; /* Reason for an error failure */ + + struct util_ldap_connection_t *next; +} util_ldap_connection_t; + +/* LDAP cache state information */ +typedef struct util_ldap_state_t { + apr_pool_t *pool; /* pool from which this state is allocated */ +#if APR_HAS_THREADS + apr_thread_mutex_t *mutex; /* mutex lock for the connection list */ +#endif + apr_global_mutex_t *util_ldap_cache_lock; + + apr_size_t cache_bytes; /* Size (in bytes) of shared memory cache */ + char *cache_file; /* filename for shm */ + long search_cache_ttl; /* TTL for search cache */ + long search_cache_size; /* Size (in entries) of search cache */ + long compare_cache_ttl; /* TTL for compare cache */ + long compare_cache_size; /* Size (in entries) of compare cache */ + + struct util_ldap_connection_t *connections; + char *cert_auth_file; + int cert_file_type; + int ssl_support; + +#if APR_HAS_SHARED_MEMORY + apr_shm_t *cache_shm; + apr_rmm_t *cache_rmm; +#endif + + /* cache ald */ + void *util_ldap_cache; + char *lock_file; /* filename for shm lock mutex */ + int connectionTimeout; + +} util_ldap_state_t; + + +/** + * Open a connection to an LDAP server + * @param ldc A structure containing the expanded details of the server + * to connect to. The handle to the LDAP connection is returned + * as ldc->ldap. + * @tip This function connects to the LDAP server and binds. It does not + * connect if already connected (ldc->ldap != NULL). Does not bind + * if already bound. + * @return If successful LDAP_SUCCESS is returned. + * @deffunc int util_ldap_connection_open(request_rec *r, + * util_ldap_connection_t *ldc) + */ +LDAP_DECLARE(int) util_ldap_connection_open(request_rec *r, + util_ldap_connection_t *ldc); + +/** + * Close a connection to an LDAP server + * @param ldc A structure containing the expanded details of the server + * that was connected. + * @tip This function unbinds from the LDAP server, and clears ldc->ldap. + * It is possible to rebind to this server again using the same ldc + * structure, using apr_ldap_open_connection(). + * @deffunc util_ldap_close_connection(util_ldap_connection_t *ldc) + */ +LDAP_DECLARE(void) util_ldap_connection_close(util_ldap_connection_t *ldc); + +/** + * Unbind a connection to an LDAP server + * @param ldc A structure containing the expanded details of the server + * that was connected. + * @tip This function unbinds the LDAP connection, and disconnects from + * the server. It is used during error conditions, to bring the LDAP + * connection back to a known state. + * @deffunc apr_status_t util_ldap_connection_unbind(util_ldap_connection_t *ldc) + */ +LDAP_DECLARE_NONSTD(apr_status_t) util_ldap_connection_unbind(void *param); + +/** + * Cleanup a connection to an LDAP server + * @param ldc A structure containing the expanded details of the server + * that was connected. + * @tip This function is registered with the pool cleanup to close down the + * LDAP connections when the server is finished with them. + * @deffunc apr_status_t util_ldap_connection_cleanup(util_ldap_connection_t *ldc) + */ +LDAP_DECLARE_NONSTD(apr_status_t) util_ldap_connection_cleanup(void *param); + +/** + * Find a connection in a list of connections + * @param r The request record + * @param host The hostname to connect to (multiple hosts space separated) + * @param port The port to connect to + * @param binddn The DN to bind with + * @param bindpw The password to bind with + * @param deref The dereferencing behavior + * @param secure use SSL on the connection + * @tip Once a connection is found and returned, a lock will be acquired to + * lock that particular connection, so that another thread does not try and + * use this connection while it is busy. Once you are finished with a connection, + * apr_ldap_connection_close() must be called to release this connection. + * @deffunc util_ldap_connection_t *util_ldap_connection_find(request_rec *r, const char *host, int port, + * const char *binddn, const char *bindpw, deref_options deref, + * int netscapessl, int starttls) + */ +LDAP_DECLARE(util_ldap_connection_t *) util_ldap_connection_find(request_rec *r, const char *host, int port, + const char *binddn, const char *bindpw, deref_options deref, + int secure); + + +/** + * Compare two DNs for sameness + * @param r The request record + * @param ldc The LDAP connection being used. + * @param url The URL of the LDAP connection - used for deciding which cache to use. + * @param dn The first DN to compare. + * @param reqdn The DN to compare the first DN to. + * @param compare_dn_on_server Flag to determine whether the DNs should be checked using + * LDAP calls or with a direct string comparision. A direct + * string comparison is faster, but not as accurate - false + * negative comparisons are possible. + * @tip Two DNs can be equal and still fail a string comparison. Eg "dc=example,dc=com" + * and "dc=example, dc=com". Use the compare_dn_on_server unless there are serious + * performance issues. + * @deffunc int util_ldap_cache_comparedn(request_rec *r, util_ldap_connection_t *ldc, + * const char *url, const char *dn, const char *reqdn, + * int compare_dn_on_server) + */ +LDAP_DECLARE(int) util_ldap_cache_comparedn(request_rec *r, util_ldap_connection_t *ldc, + const char *url, const char *dn, const char *reqdn, + int compare_dn_on_server); + +/** + * A generic LDAP compare function + * @param r The request record + * @param ldc The LDAP connection being used. + * @param url The URL of the LDAP connection - used for deciding which cache to use. + * @param dn The DN of the object in which we do the compare. + * @param attrib The attribute within the object we are comparing for. + * @param value The value of the attribute we are trying to compare for. + * @tip Use this function to determine whether an attribute/value pair exists within an + * object. Typically this would be used to determine LDAP group membership. + * @deffunc int util_ldap_cache_compare(request_rec *r, util_ldap_connection_t *ldc, + * const char *url, const char *dn, const char *attrib, const char *value) + */ +LDAP_DECLARE(int) util_ldap_cache_compare(request_rec *r, util_ldap_connection_t *ldc, + const char *url, const char *dn, const char *attrib, const char *value); + +/** + * Checks a username/password combination by binding to the LDAP server + * @param r The request record + * @param ldc The LDAP connection being used. + * @param url The URL of the LDAP connection - used for deciding which cache to use. + * @param basedn The Base DN to search for the user in. + * @param scope LDAP scope of the search. + * @param attrs LDAP attributes to return in search. + * @param filter The user to search for in the form of an LDAP filter. This filter must return + * exactly one user for the check to be successful. + * @param bindpw The user password to bind as. + * @param binddn The DN of the user will be returned in this variable. + * @param retvals The values corresponding to the attributes requested in the attrs array. + * @tip The filter supplied will be searched for. If a single entry is returned, an attempt + * is made to bind as that user. If this bind succeeds, the user is not validated. + * @deffunc int util_ldap_cache_checkuserid(request_rec *r, util_ldap_connection_t *ldc, + * char *url, const char *basedn, int scope, char **attrs, + * char *filter, char *bindpw, char **binddn, char ***retvals) + */ +LDAP_DECLARE(int) util_ldap_cache_checkuserid(request_rec *r, util_ldap_connection_t *ldc, + const char *url, const char *basedn, int scope, char **attrs, + const char *filter, const char *bindpw, const char **binddn, const char ***retvals); + +/** + * Retrieves the LDAP DN of the user without the need to know user password + * @param r The request record + * @param ldc The LDAP connection being used. + * @param url The URL of the LDAP connection - used for deciding which cache to use. + * @param basedn The Base DN to search for the user in. + * @param scope LDAP scope of the search. + * @param attrs LDAP attributes to return in search. + * @param filter The user to search for in the form of an LDAP filter. This filter must return + * exactly one user for the check to be successful. + * @param binddn The DN of the user will be returned in this variable. + * @param retvals The values corresponding to the attributes requested in the attrs array. + * @tip The filter supplied will be searched for. A single entry matching the search is returned. + * @deffunc int util_ldap_cache_getuserdn(request_rec *r, util_ldap_connection_t *ldc, + * char *url, const char *basedn, int scope, char **attrs, + * char *filter, char **binddn, char ***retvals) + */ +LDAP_DECLARE(int) util_ldap_cache_getuserdn(request_rec *r, util_ldap_connection_t *ldc, + const char *url, const char *basedn, int scope, char **attrs, + const char *filter, const char **binddn, const char ***retvals); + +/** + * Checks if SSL support is available in mod_ldap + * @deffunc int util_ldap_ssl_supported(request_rec *r) + */ +LDAP_DECLARE(int) util_ldap_ssl_supported(request_rec *r); + +/* from apr_ldap_cache.c */ + +/** + * Init the LDAP cache + * @param pool The pool to use to initialise the cache + * @param reqsize The size of the shared memory segement to request. A size + * of zero requests the max size possible from + * apr_shmem_init() + * @deffunc void util_ldap_cache_init(apr_pool_t *p, util_ldap_state_t *st) + * @return The status code returned is the status code of the + * apr_smmem_init() call. Regardless of the status, the cache + * will be set up at least for in-process or in-thread operation. + */ +apr_status_t util_ldap_cache_init(apr_pool_t *pool, util_ldap_state_t *st); + +/* from apr_ldap_cache_mgr.c */ + +/** + * Display formatted stats for cache + * @param The pool to allocate the returned string from + * @tip This function returns a string allocated from the provided pool that describes + * various stats about the cache. + * @deffunc char *util_ald_cache_display(apr_pool_t *pool, util_ldap_state_t *st) + */ +char *util_ald_cache_display(request_rec *r, util_ldap_state_t *st); + +#endif /* APU_HAS_LDAP */ +#endif /* UTIL_LDAP_H */ diff --git a/rubbos/app/httpd-2.0.64/include/util_md5.h b/rubbos/app/httpd-2.0.64/include/util_md5.h new file mode 100644 index 00000000..6c5299de --- /dev/null +++ b/rubbos/app/httpd-2.0.64/include/util_md5.h @@ -0,0 +1,70 @@ +/* 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. + */ + +#ifndef APACHE_UTIL_MD5_H +#define APACHE_UTIL_MD5_H + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @package Apache MD5 library + */ + +#include "apr_md5.h" + +/** + * Create an MD5 checksum of a given string + * @param a Pool to allocate out of + * @param string String to get the checksum of + * @return The checksum + * @deffunc char *ap_md5(apr_pool_t *a, const unsigned char *string) + */ +AP_DECLARE(char *) ap_md5(apr_pool_t *a, const unsigned char *string); + +/** + * Create an MD5 checksum of a string of binary data + * @param a Pool to allocate out of + * @param buf Buffer to generate checksum for + * @param len The length of the buffer + * @return The checksum + * @deffunc char *ap_md5_binary(apr_pool_t *a, const unsigned char *buf, int len) + */ +AP_DECLARE(char *) ap_md5_binary(apr_pool_t *a, const unsigned char *buf, int len); + +/** + * Convert an MD5 checksum into a base64 encoding + * @param p The pool to allocate out of + * @param context The context to convert + * @return The converted encoding + * @deffunc char *ap_md5contextTo64(apr_pool_t *p, apr_md5_ctx_t *context) + */ +AP_DECLARE(char *) ap_md5contextTo64(apr_pool_t *p, apr_md5_ctx_t *context); + +/** + * Create an MD5 Digest for a given file + * @param p The pool to allocate out of + * @param infile The file to create the digest for + * @deffunc char *ap_md5digest(apr_pool_t *p, apr_file_t *infile) + */ +AP_DECLARE(char *) ap_md5digest(apr_pool_t *p, apr_file_t *infile); + +#ifdef __cplusplus +} +#endif + +#endif /* !APACHE_UTIL_MD5_H */ diff --git a/rubbos/app/httpd-2.0.64/include/util_script.h b/rubbos/app/httpd-2.0.64/include/util_script.h new file mode 100644 index 00000000..c68b81d9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/include/util_script.h @@ -0,0 +1,142 @@ +/* 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. + */ + +#ifndef APACHE_UTIL_SCRIPT_H +#define APACHE_UTIL_SCRIPT_H + +#include "apr_buckets.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @package Apache script tools + */ + +#ifndef APACHE_ARG_MAX +#ifdef _POSIX_ARG_MAX +#define APACHE_ARG_MAX _POSIX_ARG_MAX +#else +#define APACHE_ARG_MAX 512 +#endif +#endif + +/** + * Create an environment variable out of an Apache table of key-value pairs + * @param p pool to allocate out of + * @param t Apache table of key-value pairs + * @return An array containing the same key-value pairs suitable for + * use with an exec call. + * @deffunc char **ap_create_environment(apr_pool_t *p, apr_table_t *t) + */ +AP_DECLARE(char **) ap_create_environment(apr_pool_t *p, apr_table_t *t); + +/** + * This "cute" little function comes about because the path info on + * filenames and URLs aren't always the same. So we take the two, + * and find as much of the two that match as possible. + * @param uri The uri we are currently parsing + * @param path_info The current path info + * @return The length of the path info + * @deffunc int ap_find_path_info(const char *uri, const char *path_info) + */ +AP_DECLARE(int) ap_find_path_info(const char *uri, const char *path_info); + +/** + * Add CGI environment variables required by HTTP/1.1 to the request's + * environment table + * @param r the current request + * @deffunc void ap_add_cgi_vars(request_rec *r) + */ +AP_DECLARE(void) ap_add_cgi_vars(request_rec *r); + +/** + * Add common CGI environment variables to the requests environment table + * @param r The current request + * @deffunc void ap_add_common_vars(request_rec *r) + */ +AP_DECLARE(void) ap_add_common_vars(request_rec *r); + +/** + * Read headers output from a script, ensuring that the output is valid. If + * the output is valid, then the headers are added to the headers out of the + * current request + * @param r The current request + * @param f The file to read from + * @param buffer Empty when calling the function. On output, if there was an + * error, the string that cause the error is stored here. + * @return HTTP_OK on success, HTTP_INTERNAL_SERVER_ERROR otherwise + * @deffunc int ap_scan_script_header_err(request_rec *r, apr_file_t *f, char *buffer) + */ +AP_DECLARE(int) ap_scan_script_header_err(request_rec *r, apr_file_t *f, char *buffer); + +/** + * Read headers output from a script, ensuring that the output is valid. If + * the output is valid, then the headers are added to the headers out of the + * current request + * @param r The current request + * @param bb The brigade from which to read + * @param buffer Empty when calling the function. On output, if there was an + * error, the string that cause the error is stored here. + * @return HTTP_OK on success, HTTP_INTERNAL_SERVER_ERROR otherwise + * @deffunc int ap_scan_script_header_err_brigade(request_rec *r, apr_bucket_brigade *bb, char *buffer) + */ +AP_DECLARE(int) ap_scan_script_header_err_brigade(request_rec *r, + apr_bucket_brigade *bb, + char *buffer); + +/** + * Read headers strings from a script, ensuring that the output is valid. If + * the output is valid, then the headers are added to the headers out of the + * current request + * @param r The current request + * @param buffer Empty when calling the function. On output, if there was an + * error, the string that cause the error is stored here. + * @param termch Pointer to the last character parsed. + * @param termarg Pointer to an int to capture the last argument parsed. + * @param args String arguments to parse consecutively for headers, + * a NULL argument terminates the list. + * @return HTTP_OK on success, HTTP_INTERNAL_SERVER_ERROR otherwise + * @deffunc int ap_scan_script_header_err_core(request_rec *r, char *buffer, int (*getsfunc)(char *, int, void *), void *getsfunc_data) + */ +AP_DECLARE_NONSTD(int) ap_scan_script_header_err_strs(request_rec *r, + char *buffer, + const char **termch, + int *termarg, ...); + +/** + * Read headers output from a script, ensuring that the output is valid. If + * the output is valid, then the headers are added to the headers out of the + * current request + * @param r The current request + * @param buffer Empty when calling the function. On output, if there was an + * error, the string that cause the error is stored here. + * @param getsfunc Function to read the headers from. This function should + act like gets() + * @param getsfunc_data The place to read from + * @return HTTP_OK on success, HTTP_INTERNAL_SERVER_ERROR otherwise + * @deffunc int ap_scan_script_header_err_core(request_rec *r, char *buffer, int (*getsfunc)(char *, int, void *), void *getsfunc_data) + */ +AP_DECLARE(int) ap_scan_script_header_err_core(request_rec *r, char *buffer, + int (*getsfunc) (char *, int, void *), + void *getsfunc_data); + +#ifdef __cplusplus +} +#endif + +#endif /* !APACHE_UTIL_SCRIPT_H */ diff --git a/rubbos/app/httpd-2.0.64/include/util_time.h b/rubbos/app/httpd-2.0.64/include/util_time.h new file mode 100644 index 00000000..5e8e394f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/include/util_time.h @@ -0,0 +1,85 @@ +/* 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. + */ + +#ifndef APACHE_UTIL_TIME_H +#define APACHE_UTIL_TIME_H + +#include "apr.h" +#include "apr_time.h" +#include "httpd.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @package Apache date-time handling functions + */ + +/* Maximum delta from the current time, in seconds, for a past time + * to qualify as "recent" for use in the ap_explode_recent_*() functions: + * (Must be a power of two minus one!) + */ +#define AP_TIME_RECENT_THRESHOLD 15 + +/** + * convert a recent time to its human readable components in local timezone + * @param tm the exploded time + * @param t the time to explode: MUST be within the last + * AP_TIME_RECENT_THRESHOLD seconds + * @note This is a faster alternative to apr_explode_localtime that uses + * a cache of pre-exploded time structures. It is useful for things + * that need to explode the current time multiple times per second, + * like loggers. + * @return APR_SUCCESS iff successful + */ +AP_DECLARE(apr_status_t) ap_explode_recent_localtime(apr_time_exp_t *tm, + apr_time_t t); + +/** + * convert a recent time to its human readable components in GMT timezone + * @param tm the exploded time + * @param t the time to explode: MUST be within the last + * AP_TIME_RECENT_THRESHOLD seconds + * @note This is a faster alternative to apr_time_exp_gmt that uses + * a cache of pre-exploded time structures. It is useful for things + * that need to explode the current time multiple times per second, + * like loggers. + * @return APR_SUCCESS iff successful + */ +AP_DECLARE(apr_status_t) ap_explode_recent_gmt(apr_time_exp_t *tm, + apr_time_t t); + + +/** + * format a recent timestamp in the ctime() format. + * @param date_str String to write to. + * @param t the time to convert + */ +AP_DECLARE(apr_status_t) ap_recent_ctime(char *date_str, apr_time_t t); + +/** + * format a recent timestamp in the RFC822 format + * @param date_str String to write to (must have length >= APR_RFC822_DATE_LEN) + * @param t the time to convert + */ +AP_DECLARE(apr_status_t) ap_recent_rfc822_date(char *date_str, apr_time_t t); + +#ifdef __cplusplus +} +#endif + +#endif /* !APACHE_UTIL_TIME_H */ diff --git a/rubbos/app/httpd-2.0.64/include/util_xml.h b/rubbos/app/httpd-2.0.64/include/util_xml.h new file mode 100644 index 00000000..4965b14e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/include/util_xml.h @@ -0,0 +1,46 @@ +/* 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. + */ + +#ifndef UTIL_XML_H +#define UTIL_XML_H + +#include "apr_xml.h" + +#include "httpd.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @package Apache XML library + */ + +/** + * Get XML post data and parse it + * @param r The current request + * @param pdoc The XML post data + * @return HTTP status code + * @deffunc int ap_xml_parse_input(request_rec *r, apr_xml_doc **pdoc) + */ +AP_DECLARE(int) ap_xml_parse_input(request_rec *r, apr_xml_doc **pdoc); + + +#ifdef __cplusplus +} +#endif + +#endif /* UTIL_XML_H */ diff --git a/rubbos/app/httpd-2.0.64/libhttpd.dsp b/rubbos/app/httpd-2.0.64/libhttpd.dsp new file mode 100644 index 00000000..ccfef0ec --- /dev/null +++ b/rubbos/app/httpd-2.0.64/libhttpd.dsp @@ -0,0 +1,666 @@ +# Microsoft Developer Studio Project File - Name="libhttpd" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=libhttpd - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "libhttpd.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 "libhttpd.mak" CFG="libhttpd - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "libhttpd - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "libhttpd - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "libhttpd - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "AP_DECLARE_EXPORT" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "./include" /I "./srclib/apr/include" /I "./srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "AP_DECLARE_EXPORT" /Fd"Release\libhttpd_src" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib ws2_32.lib mswsock.lib /nologo /subsystem:windows /dll +# ADD LINK32 kernel32.lib user32.lib advapi32.lib ws2_32.lib mswsock.lib "Release\buildmark.obj" /nologo /subsystem:windows /dll /incremental:no /debug /base:@"os\win32\BaseAddr.ref",libhttpd.dll /opt:ref +# Begin Special Build Tool +SOURCE="$(InputPath)" +PreLink_Desc=Compiling buildmark +PreLink_Cmds=cl.exe /nologo /MD /W3 /O2 /Zi /I "./include" /I "./srclib/apr/include" /I "./srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "AP_DECLARE_EXPORT" /Fd"Release\libhttpd_src" /FD /c server\buildmark.c /Fo"Release\buildmark.obj" +# End Special Build Tool + +!ELSEIF "$(CFG)" == "libhttpd - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "AP_DECLARE_EXPORT" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "./include" /I "./srclib/apr/include" /I "./srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "AP_DECLARE_EXPORT" /Fd"Debug\libhttpd_src" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib ws2_32.lib mswsock.lib /nologo /subsystem:windows /dll /incremental:no /debug +# ADD LINK32 kernel32.lib user32.lib advapi32.lib ws2_32.lib mswsock.lib "Debug\buildmark.obj" /nologo /subsystem:windows /dll /incremental:no /debug /base:@"os\win32\BaseAddr.ref",libhttpd.dll +# Begin Special Build Tool +SOURCE="$(InputPath)" +PreLink_Desc=Compiling buildmark +PreLink_Cmds=cl.exe /nologo /MDd /W3 /GX /Zi /Od /I "./include" /I "./srclib/apr/include" /I "./srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "AP_DECLARE_EXPORT" /Fd"Debug\libhttpd_src" /FD /c server\buildmark.c /Fo"Debug\buildmark.obj" +# End Special Build Tool + +!ENDIF + +# Begin Target + +# Name "libhttpd - Win32 Release" +# Name "libhttpd - Win32 Debug" +# Begin Group "headers" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;hpj;bat;for;f90" +# Begin Source File + +SOURCE=.\include\ap_compat.h +# End Source File +# Begin Source File + +SOURCE=.\include\ap_config.h +# End Source File +# Begin Source File + +SOURCE=.\include\ap_mmn.h +# End Source File +# Begin Source File + +SOURCE=.\include\ap_release.h +# End Source File +# Begin Source File + +SOURCE=.\include\http_config.h +# End Source File +# Begin Source File + +SOURCE=.\include\http_connection.h +# End Source File +# Begin Source File + +SOURCE=.\include\http_core.h +# End Source File +# Begin Source File + +SOURCE=.\include\http_log.h +# End Source File +# Begin Source File + +SOURCE=.\include\http_main.h +# End Source File +# Begin Source File + +SOURCE=.\include\http_protocol.h +# End Source File +# Begin Source File + +SOURCE=.\include\http_request.h +# End Source File +# Begin Source File + +SOURCE=.\include\http_vhost.h +# End Source File +# Begin Source File + +SOURCE=.\include\httpd.h +# End Source File +# Begin Source File + +SOURCE=.\modules\generators\mod_cgi.h + +!IF "$(CFG)" == "libhttpd - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating include/mod_cgi.h +InputPath=.\modules\generators\mod_cgi.h + +".\include\mod_cgi.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + type .\modules\generators\mod_cgi.h > .\include\mod_cgi.h + +# End Custom Build + +!ELSEIF "$(CFG)" == "libhttpd - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating include/mod_cgi.h +InputPath=.\modules\generators\mod_cgi.h + +".\include\mod_cgi.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + type .\modules\generators\mod_cgi.h > .\include\mod_cgi.h + +# End Custom Build + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\modules\http\mod_core.h + +!IF "$(CFG)" == "libhttpd - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating include/mod_core.h +InputPath=.\modules\http\mod_core.h + +".\include\mod_core.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + type .\modules\http\mod_core.h > .\include\mod_core.h + +# End Custom Build + +!ELSEIF "$(CFG)" == "libhttpd - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating include/mod_core.h +InputPath=.\modules\http\mod_core.h + +".\include\mod_core.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + type .\modules\http\mod_core.h > .\include\mod_core.h + +# End Custom Build + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\modules\dav\main\mod_dav.h + +!IF "$(CFG)" == "libhttpd - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating include/mod_dav.h +InputPath=.\modules\dav\main\mod_dav.h + +".\include\mod_dav.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + type .\modules\dav\main\mod_dav.h > .\include\mod_dav.h + +# End Custom Build + +!ELSEIF "$(CFG)" == "libhttpd - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating include/mod_dav.h +InputPath=.\modules\dav\main\mod_dav.h + +".\include\mod_dav.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + type .\modules\dav\main\mod_dav.h > .\include\mod_dav.h + +# End Custom Build + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\modules\filters\mod_include.h + +!IF "$(CFG)" == "libhttpd - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating include/mod_include.h +InputPath=.\modules\filters\mod_include.h + +".\include\mod_include.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + type .\modules\filters\mod_include.h > .\include\mod_include.h + +# End Custom Build + +!ELSEIF "$(CFG)" == "libhttpd - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating include/mod_include.h +InputPath=.\modules\filters\mod_include.h + +".\include\mod_include.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + type .\modules\filters\mod_include.h > .\include\mod_include.h + +# End Custom Build + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\modules\proxy\mod_proxy.h + +!IF "$(CFG)" == "libhttpd - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating include/mod_proxy.h +InputPath=.\modules\proxy\mod_proxy.h + +".\include\mod_proxy.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + type .\modules\proxy\mod_proxy.h > .\include\mod_proxy.h + +# End Custom Build + +!ELSEIF "$(CFG)" == "libhttpd - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating include/mod_proxy.h +InputPath=.\modules\proxy\mod_proxy.h + +".\include\mod_proxy.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + type .\modules\proxy\mod_proxy.h > .\include\mod_proxy.h + +# End Custom Build + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\os\win32\os.h + +!IF "$(CFG)" == "libhttpd - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating include/os.h +InputPath=.\os\win32\os.h + +".\include\os.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + type .\os\win32\os.h > .\include\os.h + +# End Custom Build + +!ELSEIF "$(CFG)" == "libhttpd - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating include/os.h +InputPath=.\os\win32\os.h + +".\include\os.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + type .\os\win32\os.h > .\include\os.h + +# End Custom Build + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\server\test_char.h +# End Source File +# End Group +# Begin Group "httpd" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\server\buildmark.c +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File + +SOURCE=.\server\config.c +# End Source File +# Begin Source File + +SOURCE=.\server\connection.c +# End Source File +# Begin Source File + +SOURCE=.\server\core.c +# End Source File +# Begin Source File + +SOURCE=.\modules\http\http_core.c +# End Source File +# Begin Source File + +SOURCE=.\modules\http\http_protocol.c +# End Source File +# Begin Source File + +SOURCE=.\modules\http\http_request.c +# End Source File +# Begin Source File + +SOURCE=.\server\log.c +# End Source File +# Begin Source File + +SOURCE=.\server\protocol.c +# End Source File +# Begin Source File + +SOURCE=.\server\request.c +# End Source File +# Begin Source File + +SOURCE=.\server\vhost.c +# End Source File +# End Group +# Begin Group "modules" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\modules\mappers\mod_so.c +# End Source File +# Begin Source File + +SOURCE=.\modules\arch\win32\mod_win32.c +# End Source File +# Begin Source File + +SOURCE=.\os\win32\modules.c +# End Source File +# End Group +# Begin Group "util" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\server\eoc_bucket.c +# End Source File +# Begin Source File + +SOURCE=.\server\error_bucket.c +# End Source File +# Begin Source File + +SOURCE=.\server\rfc1413.c +# End Source File +# Begin Source File + +SOURCE=.\include\rfc1413.h +# End Source File +# Begin Source File + +SOURCE=.\server\util.c +# End Source File +# Begin Source File + +SOURCE=.\server\util_cfgtree.c +# End Source File +# Begin Source File + +SOURCE=.\include\util_cfgtree.h +# End Source File +# Begin Source File + +SOURCE=.\include\util_charset.h +# End Source File +# Begin Source File + +SOURCE=.\include\util_ebcdic.h +# End Source File +# Begin Source File + +SOURCE=.\server\util_filter.c +# End Source File +# Begin Source File + +SOURCE=.\include\util_filter.h +# End Source File +# Begin Source File + +SOURCE=.\server\util_md5.c +# End Source File +# Begin Source File + +SOURCE=.\include\util_md5.h +# End Source File +# Begin Source File + +SOURCE=.\server\util_script.c +# End Source File +# Begin Source File + +SOURCE=.\include\util_script.h +# End Source File +# Begin Source File + +SOURCE=.\server\util_time.c +# End Source File +# Begin Source File + +SOURCE=.\os\win32\util_win32.c +# End Source File +# Begin Source File + +SOURCE=.\server\util_xml.c +# End Source File +# Begin Source File + +SOURCE=.\include\util_xml.h +# End Source File +# End Group +# Begin Group "mpm_winnt" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\include\ap_listen.h +# End Source File +# Begin Source File + +SOURCE=.\include\ap_mpm.h +# End Source File +# Begin Source File + +SOURCE=.\os\win32\ap_regkey.c +# End Source File +# Begin Source File + +SOURCE=.\include\ap_regkey.h +# End Source File +# Begin Source File + +SOURCE=.\server\mpm\winnt\child.c +# End Source File +# Begin Source File + +SOURCE=.\server\listen.c +# End Source File +# Begin Source File + +SOURCE=.\server\mpm\winnt\mpm.h + +!IF "$(CFG)" == "libhttpd - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating include/mpm.h +InputPath=.\server\mpm\winnt\mpm.h + +".\include\mpm.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + type .\server\mpm\winnt\mpm.h > .\include\mpm.h + +# End Custom Build + +!ELSEIF "$(CFG)" == "libhttpd - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating include/mpm.h +InputPath=.\server\mpm\winnt\mpm.h + +".\include\mpm.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + type .\server\mpm\winnt\mpm.h > .\include\mpm.h + +# End Custom Build + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\server\mpm_common.c +# End Source File +# Begin Source File + +SOURCE=.\include\mpm_common.h +# End Source File +# Begin Source File + +SOURCE=.\server\mpm\winnt\mpm_default.h + +!IF "$(CFG)" == "libhttpd - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating include/mpm_default.h +InputPath=.\server\mpm\winnt\mpm_default.h + +".\include\mpm_default.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + type .\server\mpm\winnt\mpm_default.h > .\include\mpm_default.h + +# End Custom Build + +!ELSEIF "$(CFG)" == "libhttpd - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating include/mpm_default.h +InputPath=.\server\mpm\winnt\mpm_default.h + +".\include\mpm_default.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + type .\server\mpm\winnt\mpm_default.h > .\include\mpm_default.h + +# End Custom Build + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\server\mpm\winnt\mpm_winnt.c +# End Source File +# Begin Source File + +SOURCE=.\server\mpm\winnt\mpm_winnt.h +# End Source File +# Begin Source File + +SOURCE=.\server\mpm\winnt\nt_eventlog.c +# End Source File +# Begin Source File + +SOURCE=.\server\provider.c +# End Source File +# Begin Source File + +SOURCE=.\server\scoreboard.c +# End Source File +# Begin Source File + +SOURCE=.\include\scoreboard.h +# End Source File +# Begin Source File + +SOURCE=.\server\mpm\winnt\service.c +# End Source File +# End Group +# Begin Source File + +SOURCE=.\server\gen_test_char.exe + +!IF "$(CFG)" == "libhttpd - Win32 Release" + +# PROP Ignore_Default_Tool 1 +USERDEP__GEN_T=".\include\os.h" +# Begin Custom Build - Generating test_char.h from gen_test_char.exe +InputPath=.\server\gen_test_char.exe + +".\server\test_char.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + .\server\gen_test_char.exe >.\server\test_char.h + +# End Custom Build + +!ELSEIF "$(CFG)" == "libhttpd - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +USERDEP__GEN_T=".\include\os.h" +# Begin Custom Build - Generating test_char.h from gen_test_char.exe +InputPath=.\server\gen_test_char.exe + +".\server\test_char.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + .\server\gen_test_char.exe >.\server\test_char.h + +# End Custom Build + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\build\win32\libhttpd.rc +# End Source File +# Begin Source File + +SOURCE=.\build\win32\win32ver.awk + +!IF "$(CFG)" == "libhttpd - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=.\build\win32\win32ver.awk + +".\build\win32\libhttpd.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ./build/win32/win32ver.awk libhttpd.dll "Apache HTTP Server Core" ./include/ap_release.h > .\build\win32\libhttpd.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "libhttpd - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=.\build\win32\win32ver.awk + +".\build\win32\libhttpd.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ./build/win32/win32ver.awk libhttpd.dll "Apache HTTP Server Core" ./include/ap_release.h > .\build\win32\libhttpd.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/modules.c b/rubbos/app/httpd-2.0.64/modules.c new file mode 100644 index 00000000..838cf38b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules.c @@ -0,0 +1,95 @@ +/* + * modules.c --- automatically generated by Apache + * configuration script. DO NOT HAND EDIT!!!!! + */ + +#include "ap_config.h" +#include "httpd.h" +#include "http_config.h" + +extern module core_module; +extern module access_module; +extern module auth_module; +extern module include_module; +extern module log_config_module; +extern module env_module; +extern module setenvif_module; +extern module mpm_worker_module; +extern module http_module; +extern module mime_module; +extern module status_module; +extern module autoindex_module; +extern module asis_module; +extern module cgid_module; +extern module negotiation_module; +extern module dir_module; +extern module imap_module; +extern module actions_module; +extern module userdir_module; +extern module alias_module; +extern module so_module; + +/* + * Modules which implicitly form the + * list of activated modules on startup, + * i.e. these are the modules which are + * initially linked into the Apache processing + * [extendable under run-time via AddModule] + */ +module *ap_prelinked_modules[] = { + &core_module, + &access_module, + &auth_module, + &include_module, + &log_config_module, + &env_module, + &setenvif_module, + &mpm_worker_module, + &http_module, + &mime_module, + &status_module, + &autoindex_module, + &asis_module, + &cgid_module, + &negotiation_module, + &dir_module, + &imap_module, + &actions_module, + &userdir_module, + &alias_module, + &so_module, + NULL +}; + +/* + * Modules which initially form the + * list of available modules on startup, + * i.e. these are the modules which are + * initially loaded into the Apache process + * [extendable under run-time via LoadModule] + */ +module *ap_preloaded_modules[] = { + &core_module, + &access_module, + &auth_module, + &include_module, + &log_config_module, + &env_module, + &setenvif_module, + &mpm_worker_module, + &http_module, + &mime_module, + &status_module, + &autoindex_module, + &asis_module, + &cgid_module, + &negotiation_module, + &dir_module, + &imap_module, + &actions_module, + &userdir_module, + &alias_module, + &so_module, + NULL +}; + diff --git a/rubbos/app/httpd-2.0.64/modules.lo b/rubbos/app/httpd-2.0.64/modules.lo new file mode 100644 index 00000000..4e8e8c9b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules.lo @@ -0,0 +1,12 @@ +# modules.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/modules.o' + +# Name of the non-PIC object. +non_pic_object='modules.o' + diff --git a/rubbos/app/httpd-2.0.64/modules.o b/rubbos/app/httpd-2.0.64/modules.o new file mode 100644 index 0000000000000000000000000000000000000000..c16cf99e87e089da719249ffa2761f0d6ec7c0ad GIT binary patch literal 17240 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 WcS~L!8L*d>q*~Hl+J7Vj#Qzs2p0ED^ literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/modules/.deps b/rubbos/app/httpd-2.0.64/modules/.deps new file mode 100644 index 00000000..e69de29b diff --git a/rubbos/app/httpd-2.0.64/modules/Makefile b/rubbos/app/httpd-2.0.64/modules/Makefile new file mode 100644 index 00000000..3ca7d787 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/Makefile @@ -0,0 +1,11 @@ +top_srcdir = /bottlenecks/rubbos/app/httpd-2.0.64 +top_builddir = /bottlenecks/rubbos/app/httpd-2.0.64 +srcdir = /bottlenecks/rubbos/app/httpd-2.0.64/modules +builddir = /bottlenecks/rubbos/app/httpd-2.0.64/modules +VPATH = /bottlenecks/rubbos/app/httpd-2.0.64/modules + +SUBDIRS = $(MODULE_DIRS) +CLEAN_SUBDIRS = $(MODULE_CLEANDIRS) + +include $(top_builddir)/build/rules.mk + diff --git a/rubbos/app/httpd-2.0.64/modules/Makefile.in b/rubbos/app/httpd-2.0.64/modules/Makefile.in new file mode 100644 index 00000000..1320ec26 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/Makefile.in @@ -0,0 +1,6 @@ + +SUBDIRS = $(MODULE_DIRS) +CLEAN_SUBDIRS = $(MODULE_CLEANDIRS) + +include $(top_builddir)/build/rules.mk + diff --git a/rubbos/app/httpd-2.0.64/modules/NWGNUmakefile b/rubbos/app/httpd-2.0.64/modules/NWGNUmakefile new file mode 100644 index 00000000..fd795a4b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/NWGNUmakefile @@ -0,0 +1,52 @@ +# +# Declare the sub-directories to be built here +# +# To build with exerimental modules set the environment +# variable EXPERIMENTAL=1 + +SUBDIRS = \ + aaa \ + dav\main \ + dav\fs \ + echo \ + generators \ + loggers \ + mappers \ + metadata \ + proxy \ + filters \ + $(EOLIST) + +#If the mod_edir directory exists then build the mod_edir module +ifeq "$(wildcard $(AP_WORK)\modules\mod_edir)" "$(AP_WORK)\modules\mod_edir" +SUBDIRS += mod_edir \ + $(EOLIST) +endif + +# Allow the experimental modules to be built if EXPERIMENTAL is defined +ifdef EXPERIMENTAL +SUBDIRS += experimental \ + $(EOLIST) +endif + + +# +# 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 + +ifeq "$(wildcard NWGNUmakefile.mak)" "NWGNUmakefile.mak" +include NWGNUmakefile.mak +endif + +# +# You can use this target if all that is needed is to copy files to the +# installation area +# +install :: nlms FORCE + diff --git a/rubbos/app/httpd-2.0.64/modules/README b/rubbos/app/httpd-2.0.64/modules/README new file mode 100644 index 00000000..eab7067e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/README @@ -0,0 +1,54 @@ +The directory structure for this level is as follows: + +aaa/ + This directory contains modules dealing with authorization and + authentication. + +arch/ + +cache/ + This directory houses modules that implement file and data caching + capability. + +dav/ + This directory houses modules that implement WebDAV functionality. + +echo/ + +experimental/ + In this directory we've placed some modules which we think + provide some pretty interesting functionality, but which + are still in the early stages of development and could + evolve radically in the future. This code isn't supported + officially. + +filters/ + This directory houses modules that perform general inline data filtering. + +generators/ + This directory houses modules that perform data generation functions. + +http/ + This directory houses modules that basic HTTP protocol implementation. + +loggers/ + This directory houses modules that handle logging functions. + +mappers/ + This directory houses modules that handle URL mapping and + rewriting. + +metadata/ + This directory houses modules that deal with Header metadata. + +proxy/ + This houses the code for the proxy module for Apache. + +ssl/ + This directory houses code for OpenSSL functionality. + +test/ + This directory houses modules which test various components + of Apache. You should not compile these into a production + server. + diff --git a/rubbos/app/httpd-2.0.64/modules/aaa/.deps b/rubbos/app/httpd-2.0.64/modules/aaa/.deps new file mode 100644 index 00000000..e69de29b diff --git a/rubbos/app/httpd-2.0.64/modules/aaa/.indent.pro b/rubbos/app/httpd-2.0.64/modules/aaa/.indent.pro new file mode 100644 index 00000000..a9fbe9f9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/aaa/.indent.pro @@ -0,0 +1,54 @@ +-i4 -npsl -di0 -br -nce -d0 -cli0 -npcs -nfc1 +-TBUFF +-TFILE +-TTRANS +-TUINT4 +-T_trans +-Tallow_options_t +-Tapache_sfio +-Tarray_header +-Tbool_int +-Tbuf_area +-Tbuff_struct +-Tbuffy +-Tcmd_how +-Tcmd_parms +-Tcommand_rec +-Tcommand_struct +-Tconn_rec +-Tcore_dir_config +-Tcore_server_config +-Tdir_maker_func +-Tevent +-Tglobals_s +-Thandler_func +-Thandler_rec +-Tjoblist_s +-Tlisten_rec +-Tmerger_func +-Tmode_t +-Tmodule +-Tmodule_struct +-Tmutex +-Tn_long +-Tother_child_rec +-Toverrides_t +-Tparent_score +-Tpid_t +-Tpiped_log +-Tpool +-Trequest_rec +-Trequire_line +-Trlim_t +-Tscoreboard +-Tsemaphore +-Tserver_addr_rec +-Tserver_rec +-Tserver_rec_chain +-Tshort_score +-Ttable +-Ttable_entry +-Tthread +-Tu_wide_int +-Tvtime_t +-Twide_int diff --git a/rubbos/app/httpd-2.0.64/modules/aaa/.libs/mod_access.a b/rubbos/app/httpd-2.0.64/modules/aaa/.libs/mod_access.a new file mode 100644 index 0000000000000000000000000000000000000000..a27c9f74f1e7aba8dc9bb3d242ce4c0b968cdf3e GIT binary patch literal 42550 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 z�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 CBMtHZ literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/modules/aaa/Makefile b/rubbos/app/httpd-2.0.64/modules/aaa/Makefile new file mode 100644 index 00000000..e6fa8f2f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/aaa/Makefile @@ -0,0 +1,8 @@ +top_srcdir = /bottlenecks/rubbos/app/httpd-2.0.64 +top_builddir = /bottlenecks/rubbos/app/httpd-2.0.64 +srcdir = /bottlenecks/rubbos/app/httpd-2.0.64/modules/aaa +builddir = /bottlenecks/rubbos/app/httpd-2.0.64/modules/aaa +VPATH = /bottlenecks/rubbos/app/httpd-2.0.64/modules/aaa + +include $(top_srcdir)/build/special.mk + diff --git a/rubbos/app/httpd-2.0.64/modules/aaa/Makefile.in b/rubbos/app/httpd-2.0.64/modules/aaa/Makefile.in new file mode 100644 index 00000000..167b343d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/aaa/Makefile.in @@ -0,0 +1,3 @@ + +include $(top_srcdir)/build/special.mk + diff --git a/rubbos/app/httpd-2.0.64/modules/aaa/NWGNUauthanon b/rubbos/app/httpd-2.0.64/modules/aaa/NWGNUauthanon new file mode 100644 index 00000000..6881d8a6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/aaa/NWGNUauthanon @@ -0,0 +1,248 @@ +# +# Make sure all needed macro's are defined +# + +# +# Get the 'head' of the build environment if necessary. This includes default +# targets and paths to tools +# + +ifndef EnvironmentDefined +include $(AP_WORK)\build\NWGNUhead.inc +endif + +# +# These directories will be at the beginning of the include list, followed by +# INCDIRS +# +XINCDIRS += \ + $(APR)/include \ + $(APRUTIL)/include \ + $(AP_WORK)/include \ + $(NWOS) \ + $(EOLIST) + +# +# These flags will come after CFLAGS +# +XCFLAGS += \ + $(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 = authanon + +# +# This is used by the link '-desc ' directive. +# If left blank, NLM_NAME will be used. +# +NLM_DESCRIPTION = Authentication Anonymous Module + +# +# This is used by the '-threadname' directive. If left blank, +# NLM_NAME Thread will be used. +# +NLM_THREAD_NAME = AuthAnon Module + +# +# 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 = 8192 + + +# +# If this is specified it will be used by the link '-entry' directive +# +NLM_ENTRY_SYM = _LibCPrelude + +# +# If this is specified it will be used by the link '-exit' directive +# +NLM_EXIT_SYM = _LibCPostlude + +# +# If this is specified it will be used by the link '-check' directive +# +NLM_CHECK_SYM = + +# +# If these are specified it will be used by the link '-flags' directive +# +NLM_FLAGS = AUTOUNLOAD, 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)/authanon.nlm \ + $(EOLIST) + +# +# If there is an LIB target, put it here +# +TARGET_lib = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the NLM target above. +# Paths must all use the '/' character +# +FILES_nlm_objs = \ + $(OBJDIR)/mod_auth_anon.o \ + $(EOLIST) + +# +# 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 = \ + libcpre.o \ + $(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 = \ + @$(APR)/aprlib.imp \ + @$(NWOS)/httpd.imp \ + @libc.imp \ + $(EOLIST) + +# +# Any symbols exported to here +# +FILES_nlm_exports = \ + auth_anon_module \ + $(EOLIST) + +# +# These are the OBJ files needed to create the LIB target above. +# Paths must all use the '/' character +# +FILES_lib_objs = \ + $(EOLIST) + +# +# 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) +# +install :: nlms FORCE + +# +# Any specialized rules here +# + +# +# Include the 'tail' makefile that has targets that depend on variables defined +# in this makefile +# + +include $(AP_WORK)\build\NWGNUtail.inc + + diff --git a/rubbos/app/httpd-2.0.64/modules/aaa/NWGNUauthdbm b/rubbos/app/httpd-2.0.64/modules/aaa/NWGNUauthdbm new file mode 100644 index 00000000..fe05c3d1 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/aaa/NWGNUauthdbm @@ -0,0 +1,248 @@ +# +# Make sure all needed macro's are defined +# + +# +# Get the 'head' of the build environment if necessary. This includes default +# targets and paths to tools +# + +ifndef EnvironmentDefined +include $(AP_WORK)\build\NWGNUhead.inc +endif + +# +# These directories will be at the beginning of the include list, followed by +# INCDIRS +# +XINCDIRS += \ + $(APR)/include \ + $(APRUTIL)/include \ + $(AP_WORK)/include \ + $(NWOS) \ + $(EOLIST) + +# +# These flags will come after CFLAGS +# +XCFLAGS += \ + $(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 = authdbm + +# +# This is used by the link '-desc ' directive. +# If left blank, NLM_NAME will be used. +# +NLM_DESCRIPTION = Database Authentication Module + +# +# This is used by the '-threadname' directive. If left blank, +# NLM_NAME Thread will be used. +# +NLM_THREAD_NAME = AuthDBM Module + +# +# 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 = 8192 + + +# +# If this is specified it will be used by the link '-entry' directive +# +NLM_ENTRY_SYM = _LibCPrelude + +# +# If this is specified it will be used by the link '-exit' directive +# +NLM_EXIT_SYM = _LibCPostlude + +# +# If this is specified it will be used by the link '-check' directive +# +NLM_CHECK_SYM = + +# +# If these are specified it will be used by the link '-flags' directive +# +NLM_FLAGS = AUTOUNLOAD, 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)/authdbm.nlm \ + $(EOLIST) + +# +# If there is an LIB target, put it here +# +TARGET_lib = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the NLM target above. +# Paths must all use the '/' character +# +FILES_nlm_objs = \ + $(OBJDIR)/mod_auth_dbm.o \ + $(EOLIST) + +# +# 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 = \ + libcpre.o \ + $(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 = \ + @$(APR)/aprlib.imp \ + @$(NWOS)/httpd.imp \ + @libc.imp \ + $(EOLIST) + +# +# Any symbols exported to here +# +FILES_nlm_exports = \ + auth_dbm_module \ + $(EOLIST) + +# +# These are the OBJ files needed to create the LIB target above. +# Paths must all use the '/' character +# +FILES_lib_objs = \ + $(EOLIST) + +# +# 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) +# +install :: nlms FORCE + +# +# Any specialized rules here +# + +# +# Include the 'tail' makefile that has targets that depend on variables defined +# in this makefile +# + +include $(AP_WORK)\build\NWGNUtail.inc + + diff --git a/rubbos/app/httpd-2.0.64/modules/aaa/NWGNUdigest b/rubbos/app/httpd-2.0.64/modules/aaa/NWGNUdigest new file mode 100644 index 00000000..cf41db72 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/aaa/NWGNUdigest @@ -0,0 +1,248 @@ +# +# Make sure all needed macro's are defined +# + +# +# Get the 'head' of the build environment if necessary. This includes default +# targets and paths to tools +# + +ifndef EnvironmentDefined +include $(AP_WORK)\build\NWGNUhead.inc +endif + +# +# These directories will be at the beginning of the include list, followed by +# INCDIRS +# +XINCDIRS += \ + $(APR)/include \ + $(APRUTIL)/include \ + $(AP_WORK)/include \ + $(NWOS) \ + $(EOLIST) + +# +# These flags will come after CFLAGS +# +XCFLAGS += \ + $(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 = digest + +# +# This is used by the link '-desc ' directive. +# If left blank, NLM_NAME will be used. +# +NLM_DESCRIPTION = Digest Authentication Module + +# +# This is used by the '-threadname' directive. If left blank, +# NLM_NAME Thread will be used. +# +NLM_THREAD_NAME = Digest Module + +# +# 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 = 8192 + + +# +# If this is specified it will be used by the link '-entry' directive +# +NLM_ENTRY_SYM = _LibCPrelude + +# +# If this is specified it will be used by the link '-exit' directive +# +NLM_EXIT_SYM = _LibCPostlude + +# +# If this is specified it will be used by the link '-check' directive +# +NLM_CHECK_SYM = + +# +# If these are specified it will be used by the link '-flags' directive +# +NLM_FLAGS = AUTOUNLOAD, 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)/digest.nlm \ + $(EOLIST) + +# +# If there is an LIB target, put it here +# +TARGET_lib = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the NLM target above. +# Paths must all use the '/' character +# +FILES_nlm_objs = \ + $(OBJDIR)/mod_auth_digest.o \ + $(EOLIST) + +# +# 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 = \ + libcpre.o \ + $(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 = \ + @$(APR)/aprlib.imp \ + @$(NWOS)/httpd.imp \ + @libc.imp \ + $(EOLIST) + +# +# Any symbols exported to here +# +FILES_nlm_exports = \ + auth_digest_module \ + $(EOLIST) + +# +# These are the OBJ files needed to create the LIB target above. +# Paths must all use the '/' character +# +FILES_lib_objs = \ + $(EOLIST) + +# +# 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) +# +install :: nlms FORCE + +# +# Any specialized rules here +# + +# +# Include the 'tail' makefile that has targets that depend on variables defined +# in this makefile +# + +include $(AP_WORK)\build\NWGNUtail.inc + + diff --git a/rubbos/app/httpd-2.0.64/modules/aaa/NWGNUmakefile b/rubbos/app/httpd-2.0.64/modules/aaa/NWGNUmakefile new file mode 100644 index 00000000..fc72c735 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/aaa/NWGNUmakefile @@ -0,0 +1,246 @@ +# +# Declare the sub-directories to be built here +# + +SUBDIRS = \ + $(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 += \ + $(EOLIST) + +# +# These flags will come after CFLAGS +# +XCFLAGS += \ + $(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 = + +# +# This is used by the link '-desc ' directive. +# If left blank, NLM_NAME will be used. +# +NLM_DESCRIPTION = + +# +# This is used by the '-threadname' directive. If left blank, +# NLM_NAME Thread will be used. +# +NLM_THREAD_NAME = + +# +# 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 = + + +# +# 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 = + +# +# If these are specified it will be used by the link '-flags' directive +# +NLM_FLAGS = + +# +# 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)/authanon.nlm \ + $(OBJDIR)/authdbm.nlm \ + $(OBJDIR)/digest.nlm \ + $(EOLIST) + +# +# If there is an LIB target, put it here +# +TARGET_lib = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the NLM target above. +# Paths must all use the '/' character +# +FILES_nlm_objs = \ + $(EOLIST) + +# +# 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 = \ + $(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 = \ + $(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 = \ + $(EOLIST) + +# +# Any symbols exported to here +# +FILES_nlm_exports = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the LIB target above. +# Paths must all use the '/' character +# +FILES_lib_objs = \ + $(EOLIST) + +# +# 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) +# +install :: nlms FORCE + copy $(OBJDIR)\*.nlm $(INSTALL)\Apache2\modules\*.* + +# +# Any specialized rules here +# + +# +# Include the 'tail' makefile that has targets that depend on variables defined +# in this makefile +# + +include $(AP_WORK)\build\NWGNUtail.inc + diff --git a/rubbos/app/httpd-2.0.64/modules/aaa/config.m4 b/rubbos/app/httpd-2.0.64/modules/aaa/config.m4 new file mode 100644 index 00000000..4440f67e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/aaa/config.m4 @@ -0,0 +1,23 @@ +dnl modules enabled in this directory by default + +dnl APACHE_MODULE(name, helptext[, objects[, structname[, default[, config]]]]) + +APACHE_MODPATH_INIT(aaa) + +APACHE_MODULE(access, host-based access control, , , yes) +APACHE_MODULE(auth, user-based access control, , , yes) +APACHE_MODULE(auth_anon, anonymous user access, , , most) +APACHE_MODULE(auth_dbm, DBM-based access databases, , , most) + +APACHE_MODULE(auth_digest, RFC2617 Digest authentication, , , most, [ + APR_CHECK_APR_DEFINE(APR_HAS_RANDOM) + 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 +]) + +APR_ADDTO(LT_LDFLAGS,-export-dynamic) + +APACHE_MODPATH_FINISH diff --git a/rubbos/app/httpd-2.0.64/modules/aaa/mod_access.c b/rubbos/app/httpd-2.0.64/modules/aaa/mod_access.c new file mode 100644 index 00000000..348289ab --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/aaa/mod_access.c @@ -0,0 +1,304 @@ +/* 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. + */ + +/* + * Security options etc. + * + * Module derived from code originally written by Rob McCool + * + */ + +#include "apr_strings.h" +#include "apr_network_io.h" +#include "apr_lib.h" + +#define APR_WANT_STRFUNC +#define APR_WANT_BYTEFUNC +#include "apr_want.h" + +#include "ap_config.h" +#include "httpd.h" +#include "http_core.h" +#include "http_config.h" +#include "http_log.h" +#include "http_request.h" + +#if APR_HAVE_NETINET_IN_H +#include +#endif + +enum allowdeny_type { + T_ENV, + T_ALL, + T_IP, + T_HOST, + T_FAIL +}; + +typedef struct { + apr_int64_t limited; + union { + char *from; + apr_ipsubnet_t *ip; + } x; + enum allowdeny_type type; +} allowdeny; + +/* things in the 'order' array */ +#define DENY_THEN_ALLOW 0 +#define ALLOW_THEN_DENY 1 +#define MUTUAL_FAILURE 2 + +typedef struct { + int order[METHODS]; + apr_array_header_t *allows; + apr_array_header_t *denys; +} access_dir_conf; + +module AP_MODULE_DECLARE_DATA access_module; + +static void *create_access_dir_config(apr_pool_t *p, char *dummy) +{ + int i; + access_dir_conf *conf = + (access_dir_conf *)apr_pcalloc(p, sizeof(access_dir_conf)); + + for (i = 0; i < METHODS; ++i) { + conf->order[i] = DENY_THEN_ALLOW; + } + conf->allows = apr_array_make(p, 1, sizeof(allowdeny)); + conf->denys = apr_array_make(p, 1, sizeof(allowdeny)); + + return (void *)conf; +} + +static const char *order(cmd_parms *cmd, void *dv, const char *arg) +{ + access_dir_conf *d = (access_dir_conf *) dv; + int i, o; + + if (!strcasecmp(arg, "allow,deny")) + o = ALLOW_THEN_DENY; + else if (!strcasecmp(arg, "deny,allow")) + o = DENY_THEN_ALLOW; + else if (!strcasecmp(arg, "mutual-failure")) + o = MUTUAL_FAILURE; + else + return "unknown order"; + + for (i = 0; i < METHODS; ++i) + if (cmd->limited & (AP_METHOD_BIT << i)) + d->order[i] = o; + + return NULL; +} + +static const char *allow_cmd(cmd_parms *cmd, void *dv, const char *from, + const char *where_c) +{ + access_dir_conf *d = (access_dir_conf *) dv; + allowdeny *a; + char *where = apr_pstrdup(cmd->pool, where_c); + char *s; + char msgbuf[120]; + apr_status_t rv; + + if (strcasecmp(from, "from")) + return "allow and deny must be followed by 'from'"; + + a = (allowdeny *) apr_array_push(cmd->info ? d->allows : d->denys); + a->x.from = where; + a->limited = cmd->limited; + + if (!strncasecmp(where, "env=", 4)) { + a->type = T_ENV; + a->x.from += 4; + + } + else if (!strcasecmp(where, "all")) { + a->type = T_ALL; + } + else if ((s = strchr(where, '/'))) { + *s++ = '\0'; + rv = apr_ipsubnet_create(&a->x.ip, where, s, cmd->pool); + if(APR_STATUS_IS_EINVAL(rv)) { + /* looked nothing like an IP address */ + return "An IP address was expected"; + } + else if (rv != APR_SUCCESS) { + apr_strerror(rv, msgbuf, sizeof msgbuf); + return apr_pstrdup(cmd->pool, msgbuf); + } + a->type = T_IP; + } + else if (!APR_STATUS_IS_EINVAL(rv = apr_ipsubnet_create(&a->x.ip, where, NULL, cmd->pool))) { + if (rv != APR_SUCCESS) { + apr_strerror(rv, msgbuf, sizeof msgbuf); + return apr_pstrdup(cmd->pool, msgbuf); + } + a->type = T_IP; + } + else { /* no slash, didn't look like an IP address => must be a host */ + a->type = T_HOST; + } + + return NULL; +} + +static char its_an_allow; + +static const command_rec access_cmds[] = +{ + AP_INIT_TAKE1("order", order, NULL, OR_LIMIT, + "'allow,deny', 'deny,allow', or 'mutual-failure'"), + AP_INIT_ITERATE2("allow", allow_cmd, &its_an_allow, OR_LIMIT, + "'from' followed by hostnames or IP-address wildcards"), + AP_INIT_ITERATE2("deny", allow_cmd, NULL, OR_LIMIT, + "'from' followed by hostnames or IP-address wildcards"), + {NULL} +}; + +static int in_domain(const char *domain, const char *what) +{ + int dl = strlen(domain); + int wl = strlen(what); + + if ((wl - dl) >= 0) { + if (strcasecmp(domain, &what[wl - dl]) != 0) + return 0; + + /* Make sure we matched an *entire* subdomain --- if the user + * said 'allow from good.com', we don't want people from nogood.com + * to be able to get in. + */ + + if (wl == dl) + return 1; /* matched whole thing */ + else + return (domain[0] == '.' || what[wl - dl - 1] == '.'); + } + else + return 0; +} + +static int find_allowdeny(request_rec *r, apr_array_header_t *a, int method) +{ + + allowdeny *ap = (allowdeny *) a->elts; + apr_int64_t mmask = (AP_METHOD_BIT << method); + int i; + int gothost = 0; + const char *remotehost = NULL; + + for (i = 0; i < a->nelts; ++i) { + if (!(mmask & ap[i].limited)) + continue; + + switch (ap[i].type) { + case T_ENV: + if (apr_table_get(r->subprocess_env, ap[i].x.from)) { + return 1; + } + break; + + case T_ALL: + return 1; + + case T_IP: + if (apr_ipsubnet_test(ap[i].x.ip, r->connection->remote_addr)) { + return 1; + } + break; + + case T_HOST: + if (!gothost) { + int remotehost_is_ip; + + remotehost = ap_get_remote_host(r->connection, r->per_dir_config, + REMOTE_DOUBLE_REV, &remotehost_is_ip); + + if ((remotehost == NULL) || remotehost_is_ip) + gothost = 1; + else + gothost = 2; + } + + if ((gothost == 2) && in_domain(ap[i].x.from, remotehost)) + return 1; + break; + + case T_FAIL: + /* do nothing? */ + break; + } + } + + return 0; +} + +static int check_dir_access(request_rec *r) +{ + int method = r->method_number; + int ret = OK; + access_dir_conf *a = (access_dir_conf *) + ap_get_module_config(r->per_dir_config, &access_module); + + if (a->order[method] == ALLOW_THEN_DENY) { + ret = HTTP_FORBIDDEN; + if (find_allowdeny(r, a->allows, method)) + ret = OK; + if (find_allowdeny(r, a->denys, method)) + ret = HTTP_FORBIDDEN; + } + else if (a->order[method] == DENY_THEN_ALLOW) { + if (find_allowdeny(r, a->denys, method)) + ret = HTTP_FORBIDDEN; + if (find_allowdeny(r, a->allows, method)) + ret = OK; + } + else { + if (find_allowdeny(r, a->allows, method) + && !find_allowdeny(r, a->denys, method)) + ret = OK; + else + ret = HTTP_FORBIDDEN; + } + + if (ret == HTTP_FORBIDDEN + && (ap_satisfies(r) != SATISFY_ANY || !ap_some_auth_required(r))) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "client denied by server configuration: %s", + r->filename); + } + + return ret; +} + +static void register_hooks(apr_pool_t *p) +{ + ap_hook_access_checker(check_dir_access,NULL,NULL,APR_HOOK_MIDDLE); +} + +module AP_MODULE_DECLARE_DATA access_module = +{ + STANDARD20_MODULE_STUFF, + create_access_dir_config, /* dir config creater */ + NULL, /* dir merger --- default is to override */ + NULL, /* server config */ + NULL, /* merge server config */ + access_cmds, + register_hooks /* register hooks */ +}; diff --git a/rubbos/app/httpd-2.0.64/modules/aaa/mod_access.dsp b/rubbos/app/httpd-2.0.64/modules/aaa/mod_access.dsp new file mode 100644 index 00000000..eae26a6d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/aaa/mod_access.dsp @@ -0,0 +1,128 @@ +# Microsoft Developer Studio Project File - Name="mod_access" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=mod_access - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "mod_access.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 "mod_access.mak" CFG="mod_access - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "mod_access - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_access - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "mod_access - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_access_src" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /out:"Release/mod_access.so" /base:@..\..\os\win32\BaseAddr.ref,mod_access.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Release/mod_access.so" /base:@..\..\os\win32\BaseAddr.ref,mod_access.so /opt:ref + +!ELSEIF "$(CFG)" == "mod_access - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_access_src" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_access.so" /base:@..\..\os\win32\BaseAddr.ref,mod_access.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_access.so" /base:@..\..\os\win32\BaseAddr.ref,mod_access.so + +!ENDIF + +# Begin Target + +# Name "mod_access - Win32 Release" +# Name "mod_access - Win32 Debug" +# Begin Source File + +SOURCE=.\mod_access.c +# End Source File +# Begin Source File + +SOURCE=.\mod_access.rc +# End Source File +# Begin Source File + +SOURCE=..\..\build\win32\win32ver.awk + +!IF "$(CFG)" == "mod_access - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_access.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_access.so "access_module for Apache" ../../include/ap_release.h > .\mod_access.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "mod_access - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_access.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_access.so "access_module for Apache" ../../include/ap_release.h > .\mod_access.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/modules/aaa/mod_access.exp b/rubbos/app/httpd-2.0.64/modules/aaa/mod_access.exp new file mode 100644 index 00000000..f8aff339 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/aaa/mod_access.exp @@ -0,0 +1 @@ +access_module diff --git a/rubbos/app/httpd-2.0.64/modules/aaa/mod_access.la b/rubbos/app/httpd-2.0.64/modules/aaa/mod_access.la new file mode 100644 index 00000000..5a1eaebf --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/aaa/mod_access.la @@ -0,0 +1,35 @@ +# mod_access.la - a libtool library file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='' + +# Names of this library. +library_names='' + +# The name of the static archive. +old_library='mod_access.a' + +# Libraries that this one depends upon. +dependency_libs=' -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib' + +# Version information for mod_access. +current= +age= +revision= + +# Is this an already installed library? +installed=no + +# Should we warn about portability when linking against -modules? +shouldnotlink=yes + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='' diff --git a/rubbos/app/httpd-2.0.64/modules/aaa/mod_access.lo b/rubbos/app/httpd-2.0.64/modules/aaa/mod_access.lo new file mode 100644 index 00000000..c09fcac0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/aaa/mod_access.lo @@ -0,0 +1,12 @@ +# mod_access.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/mod_access.o' + +# Name of the non-PIC object. +non_pic_object='mod_access.o' + diff --git a/rubbos/app/httpd-2.0.64/modules/aaa/mod_access.o b/rubbos/app/httpd-2.0.64/modules/aaa/mod_access.o new file mode 100644 index 0000000000000000000000000000000000000000..0ec5a0dbd0248497c33514ea1730fdcab62af5b3 GIT binary patch literal 42400 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 z�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 = NULL; /* just to illustrate the default really */ + conf->auth_grpfile = NULL; /* unless you have a broken HP cc */ + conf->auth_authoritative = 1; /* keep the fortress secure by default */ + return conf; +} + +static const char *set_auth_slot(cmd_parms *cmd, void *offset, const char *f, + const char *t) +{ + if (t && strcmp(t, "standard")) { + return apr_pstrcat(cmd->pool, "Invalid auth file type: ", t, NULL); + } + + return ap_set_file_slot(cmd, offset, f); +} + +static const command_rec auth_cmds[] = +{ + AP_INIT_TAKE12("AuthUserFile", set_auth_slot, + (void *)APR_OFFSETOF(auth_config_rec, auth_pwfile), + OR_AUTHCFG, "text file containing user IDs and passwords"), + AP_INIT_TAKE12("AuthGroupFile", set_auth_slot, + (void *)APR_OFFSETOF(auth_config_rec, auth_grpfile), + OR_AUTHCFG, + "text file containing group names and member user IDs"), + AP_INIT_FLAG("AuthAuthoritative", ap_set_flag_slot, + (void *)APR_OFFSETOF(auth_config_rec, auth_authoritative), + OR_AUTHCFG, + "Set to 'no' to allow access control to be passed along to " + "lower modules if the UserID is not known to this module"), + {NULL} +}; + +module AP_MODULE_DECLARE_DATA auth_module; + +static char *get_pw(request_rec *r, char *user, char *auth_pwfile) +{ + ap_configfile_t *f; + char l[MAX_STRING_LEN]; + const char *rpw, *w; + apr_status_t status; + + if ((status = ap_pcfg_openfile(&f, r->pool, auth_pwfile)) != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, status, r, + "Could not open password file: %s", auth_pwfile); + return NULL; + } + while (!(ap_cfg_getline(l, MAX_STRING_LEN, f))) { + if ((l[0] == '#') || (!l[0])) { + continue; + } + rpw = l; + w = ap_getword(r->pool, &rpw, ':'); + + if (!strcmp(user, w)) { + ap_cfg_closefile(f); + return ap_getword(r->pool, &rpw, ':'); + } + } + ap_cfg_closefile(f); + return NULL; +} + +static apr_table_t *groups_for_user(request_rec *r, char *user, char *grpfile) +{ + apr_pool_t *p = r->pool; + ap_configfile_t *f; + apr_table_t *grps = apr_table_make(p, 15); + apr_pool_t *sp; + char l[MAX_STRING_LEN]; + const char *group_name, *ll, *w; + apr_status_t status; + + if ((status = ap_pcfg_openfile(&f, p, grpfile)) != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, status, r, + "Could not open group file: %s", grpfile); + return NULL; + } + + apr_pool_create(&sp, p); + + while (!(ap_cfg_getline(l, MAX_STRING_LEN, f))) { + if ((l[0] == '#') || (!l[0])) { + continue; + } + ll = l; + apr_pool_clear(sp); + + group_name = ap_getword(sp, &ll, ':'); + + while (ll[0]) { + w = ap_getword_conf(sp, &ll); + if (!strcmp(w, user)) { + apr_table_setn(grps, apr_pstrdup(p, group_name), "in"); + break; + } + } + } + ap_cfg_closefile(f); + apr_pool_destroy(sp); + return grps; +} + +/* These functions return 0 if client is OK, and proper error status + * if not... either HTTP_UNAUTHORIZED, if we made a check, and it failed, or + * HTTP_INTERNAL_SERVER_ERROR, if things are so totally confused that we + * couldn't figure out how to tell if the client is authorized or not. + * + * If they return DECLINED, and all other modules also decline, that's + * treated by the server core as a configuration error, logged and + * reported as such. + */ + +/* Determine user ID, and check if it really is that user, for HTTP + * basic authentication... + */ + +static int authenticate_basic_user(request_rec *r) +{ + auth_config_rec *conf = ap_get_module_config(r->per_dir_config, + &auth_module); + const char *sent_pw; + char *real_pw; + apr_status_t invalid_pw; + int res; + + if ((res = ap_get_basic_auth_pw(r, &sent_pw))) { + return res; + } + + if (!conf->auth_pwfile) { + return DECLINED; + } + + if (!(real_pw = get_pw(r, r->user, conf->auth_pwfile))) { + if (!(conf->auth_authoritative)) { + return DECLINED; + } + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "user %s not found: %s", r->user, r->uri); + ap_note_basic_auth_failure(r); + return HTTP_UNAUTHORIZED; + } + invalid_pw = apr_password_validate(sent_pw, real_pw); + if (invalid_pw != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "user %s: authentication failure for \"%s\": " + "Password Mismatch", + r->user, r->uri); + ap_note_basic_auth_failure(r); + return HTTP_UNAUTHORIZED; + } + return OK; +} + +/* Checking ID */ + +static int check_user_access(request_rec *r) +{ + auth_config_rec *conf = ap_get_module_config(r->per_dir_config, + &auth_module); + char *user = r->user; + int m = r->method_number; + int method_restricted = 0; + register int x; + const char *t, *w; + apr_table_t *grpstatus; + const apr_array_header_t *reqs_arr = ap_requires(r); + require_line *reqs; + + /* BUG FIX: tadc, 11-Nov-1995. If there is no "requires" directive, + * then any user will do. + */ + if (!reqs_arr) { + return OK; + } + reqs = (require_line *)reqs_arr->elts; + + if (conf->auth_grpfile) { + grpstatus = groups_for_user(r, user, conf->auth_grpfile); + } + else { + grpstatus = NULL; + } + + for (x = 0; x < reqs_arr->nelts; x++) { + + if (!(reqs[x].method_mask & (AP_METHOD_BIT << m))) { + continue; + } + + method_restricted = 1; + + t = reqs[x].requirement; + w = ap_getword_white(r->pool, &t); + if (!strcmp(w, "valid-user")) { + return OK; + } + if (!strcmp(w, "user")) { + while (t[0]) { + w = ap_getword_conf(r->pool, &t); + if (!strcmp(user, w)) { + return OK; + } + } + } + else if (!strcmp(w, "group")) { + if (!grpstatus) { + return DECLINED; /* DBM group? Something else? */ + } + + while (t[0]) { + w = ap_getword_conf(r->pool, &t); + if (apr_table_get(grpstatus, w)) { + return OK; + } + } + } + else if (conf->auth_authoritative) { + /* if we aren't authoritative, any require directive could be + * valid even if we don't grok it. However, if we are + * authoritative, we can warn the user they did something wrong. + * That something could be a missing "AuthAuthoritative off", but + * more likely is a typo in the require directive. + */ + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "access to %s failed, reason: unknown require " + "directive:\"%s\"", r->uri, reqs[x].requirement); + } + } + + if (!method_restricted) { + return OK; + } + + if (!(conf->auth_authoritative)) { + return DECLINED; + } + + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "access to %s failed, reason: user %s not allowed access", + r->uri, user); + + ap_note_basic_auth_failure(r); + return HTTP_UNAUTHORIZED; +} + +static void register_hooks(apr_pool_t *p) +{ + ap_hook_check_user_id(authenticate_basic_user,NULL,NULL,APR_HOOK_MIDDLE); + ap_hook_auth_checker(check_user_access,NULL,NULL,APR_HOOK_MIDDLE); +} + +module AP_MODULE_DECLARE_DATA auth_module = +{ + STANDARD20_MODULE_STUFF, + create_auth_dir_config, /* dir config creater */ + NULL, /* dir merger --- default is to override */ + NULL, /* server config */ + NULL, /* merge server config */ + auth_cmds, /* command apr_table_t */ + register_hooks /* register hooks */ +}; diff --git a/rubbos/app/httpd-2.0.64/modules/aaa/mod_auth.dsp b/rubbos/app/httpd-2.0.64/modules/aaa/mod_auth.dsp new file mode 100644 index 00000000..ce7d0c77 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/aaa/mod_auth.dsp @@ -0,0 +1,128 @@ +# Microsoft Developer Studio Project File - Name="mod_auth" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=mod_auth - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "mod_auth.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 "mod_auth.mak" CFG="mod_auth - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "mod_auth - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_auth - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "mod_auth - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_auth_src" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /out:"Release/mod_auth.so" /base:@..\..\os\win32\BaseAddr.ref,mod_auth.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Release/mod_auth.so" /base:@..\..\os\win32\BaseAddr.ref,mod_auth.so /opt:ref + +!ELSEIF "$(CFG)" == "mod_auth - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_auth" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_auth.so" /base:@..\..\os\win32\BaseAddr.ref,mod_auth.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_auth.so" /base:@..\..\os\win32\BaseAddr.ref,mod_auth.so + +!ENDIF + +# Begin Target + +# Name "mod_auth - Win32 Release" +# Name "mod_auth - Win32 Debug" +# Begin Source File + +SOURCE=.\mod_auth.c +# End Source File +# Begin Source File + +SOURCE=.\mod_auth.rc +# End Source File +# Begin Source File + +SOURCE=..\..\build\win32\win32ver.awk + +!IF "$(CFG)" == "mod_auth - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_auth.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_auth.so "auth_module for Apache" ../../include/ap_release.h > .\mod_auth.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "mod_auth - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_auth.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_auth.so "auth_module for Apache" ../../include/ap_release.h > .\mod_auth.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/modules/aaa/mod_auth.exp b/rubbos/app/httpd-2.0.64/modules/aaa/mod_auth.exp new file mode 100644 index 00000000..76adad0a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/aaa/mod_auth.exp @@ -0,0 +1 @@ +auth_module diff --git a/rubbos/app/httpd-2.0.64/modules/aaa/mod_auth.la b/rubbos/app/httpd-2.0.64/modules/aaa/mod_auth.la new file mode 100644 index 00000000..5ffae20b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/aaa/mod_auth.la @@ -0,0 +1,35 @@ +# mod_auth.la - a libtool library file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='' + +# Names of this library. +library_names='' + +# The name of the static archive. +old_library='mod_auth.a' + +# Libraries that this one depends upon. +dependency_libs=' -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib' + +# Version information for mod_auth. +current= +age= +revision= + +# Is this an already installed library? +installed=no + +# Should we warn about portability when linking against -modules? +shouldnotlink=yes + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='' diff --git a/rubbos/app/httpd-2.0.64/modules/aaa/mod_auth.lo b/rubbos/app/httpd-2.0.64/modules/aaa/mod_auth.lo new file mode 100644 index 00000000..907d0402 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/aaa/mod_auth.lo @@ -0,0 +1,12 @@ +# mod_auth.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/mod_auth.o' + +# Name of the non-PIC object. +non_pic_object='mod_auth.o' + diff --git a/rubbos/app/httpd-2.0.64/modules/aaa/mod_auth.o b/rubbos/app/httpd-2.0.64/modules/aaa/mod_auth.o new file mode 100644 index 0000000000000000000000000000000000000000..8a0feeac8bf6b06e2733f32d32ac66bc47790a3f GIT binary patch literal 45400 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 CBMtHZ literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/modules/aaa/mod_auth_anon.c b/rubbos/app/httpd-2.0.64/modules/aaa/mod_auth_anon.c new file mode 100644 index 00000000..b5137d5f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/aaa/mod_auth_anon.c @@ -0,0 +1,238 @@ +/* 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. + */ + +/* + * http_auth: authentication + * + * Rob McCool & Brian Behlendorf. + * + * Adapted to Apache by rst. + * + * Version 0.5 May 1996 + * + * Modified by Dirk.vanGulik@jrc.it to + * + * Adapted to allow anonymous logins, just like with Anon-FTP, when + * one gives the magic user name 'anonymous' and ones email address + * as the password. + * + * Just add the following tokes to your setup: + * + * Anonymous magic-userid [magic-userid]... + * + * Anonymous_MustGiveEmail [ on | off ] default = on + * Anonymous_LogEmail [ on | off ] default = on + * Anonymous_VerifyEmail [ on | off ] default = off + * Anonymous_NoUserId [ on | off ] default = off + * Anonymous_Authoritative [ on | off ] default = off + * + * The magic user id is something like 'anonymous', it is NOT case sensitive. + * + * The MustGiveEmail flag can be used to force users to enter something + * in the password field (like an email address). Default is on. + * + * Furthermore the 'NoUserID' flag can be set to allow completely empty + * usernames in as well; this can be is convenient as a single return + * in broken GUIs like W95 is often given by the user. The Default is off. + * + * Dirk.vanGulik@jrc.it; http://ewse.ceo.org; http://me-www.jrc.it/~dirkx + * + */ + +#include "apr_strings.h" + +#define APR_WANT_STRFUNC +#include "apr_want.h" + +#include "httpd.h" +#include "http_config.h" +#include "http_core.h" +#include "http_log.h" +#include "http_request.h" +#include "http_protocol.h" + +typedef struct anon_auth { + char *password; + struct anon_auth *next; +} anon_auth; + +typedef struct { + anon_auth *anon_auth_passwords; + int anon_auth_nouserid; + int anon_auth_logemail; + int anon_auth_verifyemail; + int anon_auth_mustemail; + int anon_auth_authoritative; +} anon_auth_config_rec; + +static void *create_anon_auth_dir_config(apr_pool_t *p, char *d) +{ + anon_auth_config_rec *conf = apr_palloc(p, sizeof(*conf)); + + /* just to illustrate the defaults really. */ + conf->anon_auth_passwords = NULL; + + conf->anon_auth_nouserid = 0; + conf->anon_auth_logemail = 1; + conf->anon_auth_verifyemail = 0; + conf->anon_auth_mustemail = 1; + conf->anon_auth_authoritative = 0; + return conf; +} + +static const char *anon_set_string_slots(cmd_parms *cmd, + void *my_config, const char *arg) +{ + anon_auth_config_rec *conf = my_config; + anon_auth *first; + + if (!(*arg)) + return "Anonymous string cannot be empty, use Anonymous_NoUserId instead"; + + /* squeeze in a record */ + first = conf->anon_auth_passwords; + + if (!(conf->anon_auth_passwords = apr_palloc(cmd->pool, sizeof(anon_auth))) || + !(conf->anon_auth_passwords->password = apr_pstrdup(cmd->pool, arg))) + return "Failed to claim memory for an anonymous password..."; + + /* and repair the next */ + conf->anon_auth_passwords->next = first; + + return NULL; +} + +static const command_rec anon_auth_cmds[] = +{ + AP_INIT_ITERATE("Anonymous", anon_set_string_slots, NULL, OR_AUTHCFG, + "a space-separated list of user IDs"), + AP_INIT_FLAG("Anonymous_MustGiveEmail", ap_set_flag_slot, + (void *)APR_OFFSETOF(anon_auth_config_rec, anon_auth_mustemail), + OR_AUTHCFG, "Limited to 'on' or 'off'"), + AP_INIT_FLAG("Anonymous_NoUserId", ap_set_flag_slot, + (void *)APR_OFFSETOF(anon_auth_config_rec, anon_auth_nouserid), + OR_AUTHCFG, "Limited to 'on' or 'off'"), + AP_INIT_FLAG("Anonymous_VerifyEmail", ap_set_flag_slot, + (void *)APR_OFFSETOF(anon_auth_config_rec, anon_auth_verifyemail), + OR_AUTHCFG, "Limited to 'on' or 'off'"), + AP_INIT_FLAG("Anonymous_LogEmail", ap_set_flag_slot, + (void *)APR_OFFSETOF(anon_auth_config_rec, anon_auth_logemail), + OR_AUTHCFG, "Limited to 'on' or 'off'"), + AP_INIT_FLAG("Anonymous_Authoritative", ap_set_flag_slot, + (void *)APR_OFFSETOF(anon_auth_config_rec, anon_auth_authoritative), + OR_AUTHCFG, "Limited to 'on' or 'off'"), + {NULL} +}; + +module AP_MODULE_DECLARE_DATA auth_anon_module; + +static int anon_authenticate_basic_user(request_rec *r) +{ + anon_auth_config_rec *conf = ap_get_module_config(r->per_dir_config, + &auth_anon_module); + const char *sent_pw; + int res = DECLINED; + + if ((res = ap_get_basic_auth_pw(r, &sent_pw))) { + return res; + } + + /* Ignore if we are not configured */ + if (!conf->anon_auth_passwords) { + return DECLINED; + } + + /* Do we allow an empty userID and/or is it the magic one + */ + + if ((!(r->user[0])) && (conf->anon_auth_nouserid)) { + res = OK; + } + else { + anon_auth *p = conf->anon_auth_passwords; + res = DECLINED; + while ((res == DECLINED) && (p != NULL)) { + if (!(strcasecmp(r->user, p->password))) { + res = OK; + } + p = p->next; + } + } + if ( + /* username is OK */ + (res == OK) + /* password been filled out ? */ + && ((!conf->anon_auth_mustemail) || strlen(sent_pw)) + /* does the password look like an email address ? */ + && ((!conf->anon_auth_verifyemail) + || ((strpbrk("@", sent_pw) != NULL) + && (strpbrk(".", sent_pw) != NULL)))) { + if (conf->anon_auth_logemail && ap_is_initial_req(r)) { + ap_log_rerror(APLOG_MARK, APLOG_INFO, APR_SUCCESS, r, + "Anonymous: Passwd <%s> Accepted", + sent_pw ? sent_pw : "\'none\'"); + } + return OK; + } + else { + if (conf->anon_auth_authoritative) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, APR_SUCCESS, r, + "Anonymous: Authoritative, Passwd <%s> not accepted", + sent_pw ? sent_pw : "\'none\'"); + return HTTP_UNAUTHORIZED; + } + /* Drop out the bottom to return DECLINED */ + } + + return DECLINED; +} + +static int check_anon_access(request_rec *r) +{ +#ifdef NOTYET + conn_rec *c = r->connection; + anon_auth_config_rec *conf = ap_get_module_config(r->per_dir_config, + &auth_anon_module); + + if (!conf->anon_auth) { + return DECLINED; + } + + if (strcasecmp(r->connection->user, conf->anon_auth)) { + return DECLINED; + } + + return OK; +#endif + return DECLINED; +} + +static void register_hooks(apr_pool_t *p) +{ + ap_hook_check_user_id(anon_authenticate_basic_user,NULL,NULL,APR_HOOK_MIDDLE); + ap_hook_auth_checker(check_anon_access,NULL,NULL,APR_HOOK_MIDDLE); +} + +module AP_MODULE_DECLARE_DATA auth_anon_module = +{ + STANDARD20_MODULE_STUFF, + create_anon_auth_dir_config, /* dir config creater */ + NULL, /* dir merger ensure strictness */ + NULL, /* server config */ + NULL, /* merge server config */ + anon_auth_cmds, /* command apr_table_t */ + register_hooks /* register hooks */ +}; diff --git a/rubbos/app/httpd-2.0.64/modules/aaa/mod_auth_anon.dsp b/rubbos/app/httpd-2.0.64/modules/aaa/mod_auth_anon.dsp new file mode 100644 index 00000000..9ac81797 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/aaa/mod_auth_anon.dsp @@ -0,0 +1,128 @@ +# Microsoft Developer Studio Project File - Name="mod_auth_anon" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=mod_auth_anon - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "mod_auth_anon.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 "mod_auth_anon.mak" CFG="mod_auth_anon - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "mod_auth_anon - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_auth_anon - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "mod_auth_anon - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_auth_anon_src" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /out:"Release/mod_auth_anon.so" /base:@..\..\os\win32\BaseAddr.ref,mod_auth_anon.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Release/mod_auth_anon.so" /base:@..\..\os\win32\BaseAddr.ref,mod_auth_anon.so /opt:ref + +!ELSEIF "$(CFG)" == "mod_auth_anon - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_auth_anon_src" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_auth_anon.so" /base:@..\..\os\win32\BaseAddr.ref,mod_auth_anon.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_auth_anon.so" /base:@..\..\os\win32\BaseAddr.ref,mod_auth_anon.so + +!ENDIF + +# Begin Target + +# Name "mod_auth_anon - Win32 Release" +# Name "mod_auth_anon - Win32 Debug" +# Begin Source File + +SOURCE=.\mod_auth_anon.c +# End Source File +# Begin Source File + +SOURCE=.\mod_auth_anon.rc +# End Source File +# Begin Source File + +SOURCE=..\..\build\win32\win32ver.awk + +!IF "$(CFG)" == "mod_auth_anon - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_auth_anon.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_auth_anon.so "auth_anon_module for Apache" ../../include/ap_release.h > .\mod_auth_anon.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "mod_auth_anon - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_auth_anon.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_auth_anon.so "auth_anon_module for Apache" ../../include/ap_release.h > .\mod_auth_anon.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/modules/aaa/mod_auth_anon.exp b/rubbos/app/httpd-2.0.64/modules/aaa/mod_auth_anon.exp new file mode 100644 index 00000000..63282532 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/aaa/mod_auth_anon.exp @@ -0,0 +1 @@ +auth_anon_module diff --git a/rubbos/app/httpd-2.0.64/modules/aaa/mod_auth_dbm.c b/rubbos/app/httpd-2.0.64/modules/aaa/mod_auth_dbm.c new file mode 100644 index 00000000..e7c2cc9a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/aaa/mod_auth_dbm.c @@ -0,0 +1,293 @@ +/* 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. + */ + +/* + * http_auth: authentication + * + * Rob McCool & Brian Behlendorf. + * + * Adapted to Apache by rst. + * + * dirkx - Added Authoritative control to allow passing on to lower + * modules if and only if the userid is not known to this + * module. A known user with a faulty or absent password still + * causes an AuthRequired. The default is 'Authoritative', i.e. + * no control is passed along. + */ + +#define APR_WANT_STRFUNC +#include "apr_want.h" +#include "apr_strings.h" +#include "apr_dbm.h" +#include "apr_md5.h" /* for apr_password_validate */ + +#include "httpd.h" +#include "http_config.h" +#include "http_core.h" +#include "http_log.h" +#include "http_protocol.h" +#include "http_request.h" /* for ap_hook_(check_user_id | auth_checker)*/ + + +typedef struct { + char *auth_dbmpwfile; + char *auth_dbmgrpfile; + char *auth_dbmtype; + int auth_dbmauthoritative; +} dbm_auth_config_rec; + +static void *create_dbm_auth_dir_config(apr_pool_t *p, char *d) +{ + dbm_auth_config_rec *conf = apr_palloc(p, sizeof(*conf)); + + conf->auth_dbmpwfile = NULL; + conf->auth_dbmgrpfile = NULL; + conf->auth_dbmtype = "default"; + conf->auth_dbmauthoritative = 1; /* fortress is secure by default */ + + return conf; +} + +static const char *set_dbm_slot(cmd_parms *cmd, void *offset, + const char *f, const char *t) +{ + if (!t || strcmp(t, "dbm")) + return DECLINE_CMD; + + return ap_set_file_slot(cmd, offset, f); +} + +static const char *set_dbm_type(cmd_parms *cmd, + void *dir_config, + const char *arg) +{ + dbm_auth_config_rec *conf = dir_config; + + conf->auth_dbmtype = apr_pstrdup(cmd->pool, arg); + return NULL; +} + +static const command_rec dbm_auth_cmds[] = +{ + AP_INIT_TAKE1("AuthDBMUserFile", ap_set_file_slot, + (void *)APR_OFFSETOF(dbm_auth_config_rec, auth_dbmpwfile), + OR_AUTHCFG, "dbm database file containing user IDs and passwords"), + AP_INIT_TAKE1("AuthDBMGroupFile", ap_set_file_slot, + (void *)APR_OFFSETOF(dbm_auth_config_rec, auth_dbmgrpfile), + OR_AUTHCFG, "dbm database file containing group names and member user IDs"), + AP_INIT_TAKE12("AuthUserFile", set_dbm_slot, + (void *)APR_OFFSETOF(dbm_auth_config_rec, auth_dbmpwfile), + OR_AUTHCFG, NULL), + AP_INIT_TAKE12("AuthGroupFile", set_dbm_slot, + (void *)APR_OFFSETOF(dbm_auth_config_rec, auth_dbmgrpfile), + OR_AUTHCFG, NULL), + AP_INIT_TAKE1("AuthDBMType", set_dbm_type, + NULL, + OR_AUTHCFG, "what type of DBM file the user file is"), + AP_INIT_FLAG("AuthDBMAuthoritative", ap_set_flag_slot, + (void *)APR_OFFSETOF(dbm_auth_config_rec, auth_dbmauthoritative), + OR_AUTHCFG, "Set to 'no' to allow access control to be passed along to lower modules, if the UserID is not known in this module"), + {NULL} +}; + +module AP_MODULE_DECLARE_DATA auth_dbm_module; + +static char *get_dbm_pw(request_rec *r, + char *user, + char *auth_dbmpwfile, + char *dbtype) +{ + apr_dbm_t *f; + apr_datum_t d, q; + char *pw = NULL; + apr_status_t retval; + q.dptr = user; +#ifndef NETSCAPE_DBM_COMPAT + q.dsize = strlen(q.dptr); +#else + q.dsize = strlen(q.dptr) + 1; +#endif + + retval = apr_dbm_open_ex(&f, dbtype, auth_dbmpwfile, APR_DBM_READONLY, + APR_OS_DEFAULT, r->pool); + if (retval != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, retval, r, + "could not open dbm (type %s) auth file: %s", dbtype, + auth_dbmpwfile); + return NULL; + } + if (apr_dbm_fetch(f, q, &d) == APR_SUCCESS && d.dptr) { + pw = apr_palloc(r->pool, d.dsize + 1); + strncpy(pw, d.dptr, d.dsize); + pw[d.dsize] = '\0'; /* Terminate the string */ + } + + apr_dbm_close(f); + return pw; +} + +/* We do something strange with the group file. If the group file + * contains any : we assume the format is + * key=username value=":"groupname [":"anything here is ignored] + * otherwise we now (0.8.14+) assume that the format is + * key=username value=groupname + * The first allows the password and group files to be the same + * physical DBM file; key=username value=password":"groupname[":"anything] + * + * mark@telescope.org, 22Sep95 + */ + +static char *get_dbm_grp(request_rec *r, char *user, char *auth_dbmgrpfile, + char *dbtype) +{ + char *grp_data = get_dbm_pw(r, user, auth_dbmgrpfile,dbtype); + char *grp_colon; + char *grp_colon2; + + if (grp_data == NULL) + return NULL; + + if ((grp_colon = strchr(grp_data, ':')) != NULL) { + grp_colon2 = strchr(++grp_colon, ':'); + if (grp_colon2) + *grp_colon2 = '\0'; + return grp_colon; + } + return grp_data; +} + +static int dbm_authenticate_basic_user(request_rec *r) +{ + dbm_auth_config_rec *conf = ap_get_module_config(r->per_dir_config, + &auth_dbm_module); + const char *sent_pw; + char *real_pw, *colon_pw; + apr_status_t invalid_pw; + int res; + + if ((res = ap_get_basic_auth_pw(r, &sent_pw))) + return res; + + if (!conf->auth_dbmpwfile) + return DECLINED; + + if (!(real_pw = get_dbm_pw(r, r->user, conf->auth_dbmpwfile, + conf->auth_dbmtype))) { + if (!(conf->auth_dbmauthoritative)) + return DECLINED; + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "DBM user %s not found: %s", r->user, r->filename); + ap_note_basic_auth_failure(r); + return HTTP_UNAUTHORIZED; + } + /* Password is up to first : if exists */ + colon_pw = strchr(real_pw, ':'); + if (colon_pw) { + *colon_pw = '\0'; + } + invalid_pw = apr_password_validate(sent_pw, real_pw); + if (invalid_pw != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "DBM user %s: authentication failure for \"%s\": " + "Password Mismatch", + r->user, r->uri); + ap_note_basic_auth_failure(r); + return HTTP_UNAUTHORIZED; + } + return OK; +} + +/* Checking ID */ + +static int dbm_check_auth(request_rec *r) +{ + dbm_auth_config_rec *conf = ap_get_module_config(r->per_dir_config, + &auth_dbm_module); + char *user = r->user; + int m = r->method_number; + + const apr_array_header_t *reqs_arr = ap_requires(r); + require_line *reqs = reqs_arr ? (require_line *) reqs_arr->elts : NULL; + + register int x; + const char *t; + char *w; + + if (!conf->auth_dbmgrpfile) + return DECLINED; + if (!reqs_arr) + return DECLINED; + + for (x = 0; x < reqs_arr->nelts; x++) { + + if (!(reqs[x].method_mask & (AP_METHOD_BIT << m))) + continue; + + t = reqs[x].requirement; + w = ap_getword_white(r->pool, &t); + + if (!strcmp(w, "group") && conf->auth_dbmgrpfile) { + const char *orig_groups, *groups; + char *v; + + if (!(groups = get_dbm_grp(r, user, conf->auth_dbmgrpfile, + conf->auth_dbmtype))) { + if (!(conf->auth_dbmauthoritative)) + return DECLINED; + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "user %s not in DBM group file %s: %s", + user, conf->auth_dbmgrpfile, r->filename); + ap_note_basic_auth_failure(r); + return HTTP_UNAUTHORIZED; + } + orig_groups = groups; + while (t[0]) { + w = ap_getword_white(r->pool, &t); + groups = orig_groups; + while (groups[0]) { + v = ap_getword(r->pool, &groups, ','); + if (!strcmp(v, w)) + return OK; + } + } + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "user %s not in right group: %s", + user, r->filename); + ap_note_basic_auth_failure(r); + return HTTP_UNAUTHORIZED; + } + } + + return DECLINED; +} + +static void register_hooks(apr_pool_t *p) +{ + ap_hook_check_user_id(dbm_authenticate_basic_user, NULL, NULL, + APR_HOOK_MIDDLE); + ap_hook_auth_checker(dbm_check_auth, NULL, NULL, APR_HOOK_MIDDLE); +} + +module AP_MODULE_DECLARE_DATA auth_dbm_module = +{ + STANDARD20_MODULE_STUFF, + create_dbm_auth_dir_config, /* dir config creater */ + NULL, /* dir merger --- default is to override */ + NULL, /* server config */ + NULL, /* merge server config */ + dbm_auth_cmds, /* command apr_table_t */ + register_hooks /* register hooks */ +}; diff --git a/rubbos/app/httpd-2.0.64/modules/aaa/mod_auth_dbm.dsp b/rubbos/app/httpd-2.0.64/modules/aaa/mod_auth_dbm.dsp new file mode 100644 index 00000000..d55e0c9b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/aaa/mod_auth_dbm.dsp @@ -0,0 +1,128 @@ +# Microsoft Developer Studio Project File - Name="mod_auth_dbm" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=mod_auth_dbm - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "mod_auth_dbm.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 "mod_auth_dbm.mak" CFG="mod_auth_dbm - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "mod_auth_dbm - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_auth_dbm - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "mod_auth_dbm - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "AP_AUTH_DBM_USE_APR" /Fd"Release\mod_auth_dbm_src" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /out:"Release/mod_auth_dbm.so" /base:@..\..\os\win32\BaseAddr.ref,mod_auth_dbm.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Release/mod_auth_dbm.so" /base:@..\..\os\win32\BaseAddr.ref,mod_auth_dbm.so /opt:ref + +!ELSEIF "$(CFG)" == "mod_auth_dbm - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "AP_AUTH_DBM_USE_APR" /Fd"Debug\mod_auth_dbm_src" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_auth_dbm.so" /base:@..\..\os\win32\BaseAddr.ref,mod_auth_dbm.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_auth_dbm.so" /base:@..\..\os\win32\BaseAddr.ref,mod_auth_dbm.so + +!ENDIF + +# Begin Target + +# Name "mod_auth_dbm - Win32 Release" +# Name "mod_auth_dbm - Win32 Debug" +# Begin Source File + +SOURCE=.\mod_auth_dbm.c +# End Source File +# Begin Source File + +SOURCE=.\mod_auth_dbm.rc +# End Source File +# Begin Source File + +SOURCE=..\..\build\win32\win32ver.awk + +!IF "$(CFG)" == "mod_auth_dbm - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_auth_dbm.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_auth_dbm.so "auth_dbm_module for Apache" ../../include/ap_release.h > .\mod_auth_dbm.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "mod_auth_dbm - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_auth_dbm.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_auth_dbm.so "auth_dbm_module for Apache" ../../include/ap_release.h > .\mod_auth_dbm.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/modules/aaa/mod_auth_dbm.exp b/rubbos/app/httpd-2.0.64/modules/aaa/mod_auth_dbm.exp new file mode 100644 index 00000000..7038e804 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/aaa/mod_auth_dbm.exp @@ -0,0 +1 @@ +auth_dbm_module diff --git a/rubbos/app/httpd-2.0.64/modules/aaa/mod_auth_digest.c b/rubbos/app/httpd-2.0.64/modules/aaa/mod_auth_digest.c new file mode 100644 index 00000000..9f4c655a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/aaa/mod_auth_digest.c @@ -0,0 +1,2108 @@ +/* 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. + */ + +/* + * mod_auth_digest: MD5 digest authentication + * + * Originally by Alexei Kosut + * Updated to RFC-2617 by Ronald Tschalär + * based on mod_auth, by Rob McCool and Robert S. Thau + * + * This module an updated version of modules/standard/mod_digest.c + * It is still fairly new and problems may turn up - submit problem + * reports to the Apache bug-database, or send them directly to me + * at ronald@innovation.ch. + * + * Requires either /dev/random (or equivalent) or the truerand library, + * available for instance from + * ftp://research.att.com/dist/mab/librand.shar + * + * Open Issues: + * - qop=auth-int (when streams and trailer support available) + * - nonce-format configurability + * - Proxy-Authorization-Info header is set by this module, but is + * currently ignored by mod_proxy (needs patch to mod_proxy) + * - generating the secret takes a while (~ 8 seconds) if using the + * truerand library + * - The source of the secret should be run-time directive (with server + * scope: RSRC_CONF). However, that could be tricky when trying to + * choose truerand vs. file... + * - shared-mem not completely tested yet. Seems to work ok for me, + * but... (definitely won't work on Windoze) + * - Sharing a realm among multiple servers has following problems: + * o Server name and port can't be included in nonce-hash + * (we need two nonce formats, which must be configured explicitly) + * o Nonce-count check can't be for equal, or then nonce-count checking + * must be disabled. What we could do is the following: + * (expected < received) ? set expected = received : issue error + * The only problem is that it allows replay attacks when somebody + * captures a packet sent to one server and sends it to another + * one. Should we add "AuthDigestNcCheck Strict"? + * - expired nonces give amaya fits. + */ + +#include "apr_sha1.h" +#include "apr_base64.h" +#include "apr_lib.h" +#include "apr_time.h" +#include "apr_errno.h" +#include "apr_global_mutex.h" +#include "apr_strings.h" + +#define APR_WANT_STRFUNC +#include "apr_want.h" + +#include "ap_config.h" +#include "httpd.h" +#include "http_config.h" +#include "http_core.h" +#include "http_request.h" +#include "http_log.h" +#include "http_protocol.h" +#include "apr_uri.h" +#include "util_md5.h" +#include "apr_shm.h" +#include "apr_rmm.h" + +/* Disable shmem until pools/init gets sorted out + * remove following two lines when fixed + */ +#undef APR_HAS_SHARED_MEMORY +#define APR_HAS_SHARED_MEMORY 0 + +/* struct to hold the configuration info */ + +typedef struct digest_config_struct { + const char *dir_name; + const char *pwfile; + const char *grpfile; + const char *realm; + char **qop_list; + apr_sha1_ctx_t nonce_ctx; + apr_time_t nonce_lifetime; + const char *nonce_format; + int check_nc; + const char *algorithm; + char *uri_list; + const char *ha1; +} digest_config_rec; + + +#define DFLT_ALGORITHM "MD5" + +#define DFLT_NONCE_LIFE apr_time_from_sec(300) +#define NEXTNONCE_DELTA apr_time_from_sec(30) + + +#define NONCE_TIME_LEN (((sizeof(apr_time_t)+2)/3)*4) +#define NONCE_HASH_LEN (2*APR_SHA1_DIGESTSIZE) +#define NONCE_LEN (int )(NONCE_TIME_LEN + NONCE_HASH_LEN) + +#define SECRET_LEN 20 + + +/* client list definitions */ + +typedef struct hash_entry { + unsigned long key; /* the key for this entry */ + struct hash_entry *next; /* next entry in the bucket */ + unsigned long nonce_count; /* for nonce-count checking */ + char ha1[2*MD5_DIGESTSIZE+1]; /* for algorithm=MD5-sess */ + char last_nonce[NONCE_LEN+1]; /* for one-time nonce's */ +} client_entry; + +static struct hash_table { + client_entry **table; + unsigned long tbl_len; + unsigned long num_entries; + unsigned long num_created; + unsigned long num_removed; + unsigned long num_renewed; +} *client_list; + + +/* struct to hold a parsed Authorization header */ + +enum hdr_sts { NO_HEADER, NOT_DIGEST, INVALID, VALID }; + +typedef struct digest_header_struct { + const char *scheme; + const char *realm; + const char *username; + char *nonce; + const char *uri; + const char *method; + const char *digest; + const char *algorithm; + const char *cnonce; + const char *opaque; + unsigned long opaque_num; + const char *message_qop; + const char *nonce_count; + /* the following fields are not (directly) from the header */ + apr_time_t nonce_time; + enum hdr_sts auth_hdr_sts; + const char *raw_request_uri; + apr_uri_t *psd_request_uri; + int needed_auth; + client_entry *client; +} digest_header_rec; + + +/* (mostly) nonce stuff */ + +typedef union time_union { + apr_time_t time; + unsigned char arr[sizeof(apr_time_t)]; +} time_rec; + +static unsigned char secret[SECRET_LEN]; + +/* client-list, opaque, and one-time-nonce stuff */ + +static apr_shm_t *client_shm = NULL; +static apr_rmm_t *client_rmm = NULL; +static unsigned long *opaque_cntr; +static apr_time_t *otn_counter; /* one-time-nonce counter */ +static apr_global_mutex_t *client_lock = NULL; +static apr_global_mutex_t *opaque_lock = NULL; +static char client_lock_name[L_tmpnam]; +static char opaque_lock_name[L_tmpnam]; + +#define DEF_SHMEM_SIZE 1000L /* ~ 12 entries */ +#define DEF_NUM_BUCKETS 15L +#define HASH_DEPTH 5 + +static long shmem_size = DEF_SHMEM_SIZE; +static long num_buckets = DEF_NUM_BUCKETS; + + +module AP_MODULE_DECLARE_DATA auth_digest_module; + +/* + * initialization code + */ + +static apr_status_t cleanup_tables(void *not_used) +{ + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "Digest: cleaning up shared memory"); + fflush(stderr); + + if (client_shm) { + apr_shm_destroy(client_shm); + client_shm = NULL; + } + + if (client_lock) { + apr_global_mutex_destroy(client_lock); + client_lock = NULL; + } + + if (opaque_lock) { + apr_global_mutex_destroy(opaque_lock); + opaque_lock = NULL; + } + + return APR_SUCCESS; +} + +static apr_status_t initialize_secret(server_rec *s) +{ + apr_status_t status; + + ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, s, + "Digest: generating secret for digest authentication ..."); + +#if APR_HAS_RANDOM + status = apr_generate_random_bytes(secret, sizeof(secret)); +#else +#error APR random number support is missing; you probably need to install the truerand library. +#endif + + if (status != APR_SUCCESS) { + char buf[120]; + ap_log_error(APLOG_MARK, APLOG_CRIT, status, s, + "Digest: error generating secret: %s", + apr_strerror(status, buf, sizeof(buf))); + return status; + } + + ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, s, "Digest: done"); + + return APR_SUCCESS; +} + +static void log_error_and_cleanup(char *msg, apr_status_t sts, server_rec *s) +{ + ap_log_error(APLOG_MARK, APLOG_ERR, sts, s, + "Digest: %s - all nonce-count checking, one-time nonces, and " + "MD5-sess algorithm disabled", msg); + + cleanup_tables(NULL); +} + +#if APR_HAS_SHARED_MEMORY + +static void initialize_tables(server_rec *s, apr_pool_t *ctx) +{ + unsigned long idx; + apr_status_t sts; + + /* set up client list */ + + sts = apr_shm_create(&client_shm, shmem_size, tmpnam(NULL), ctx); + if (sts != APR_SUCCESS) { + log_error_and_cleanup("failed to create shared memory segments", sts, s); + return; + } + + client_list = apr_rmm_malloc(client_rmm, sizeof(*client_list) + + sizeof(client_entry*)*num_buckets); + if (!client_list) { + log_error_and_cleanup("failed to allocate shared memory", -1, s); + return; + } + client_list->table = (client_entry**) (client_list + 1); + for (idx = 0; idx < num_buckets; idx++) { + client_list->table[idx] = NULL; + } + client_list->tbl_len = num_buckets; + client_list->num_entries = 0; + + tmpnam(client_lock_name); + /* FIXME: get the client_lock_name from a directive so we're portable + * to non-process-inheriting operating systems, like Win32. */ + sts = apr_global_mutex_create(&client_lock, client_lock_name, + APR_LOCK_DEFAULT, ctx); + if (sts != APR_SUCCESS) { + log_error_and_cleanup("failed to create lock (client_lock)", sts, s); + return; + } + + + /* setup opaque */ + + opaque_cntr = apr_rmm_malloc(client_rmm, sizeof(*opaque_cntr)); + if (opaque_cntr == NULL) { + log_error_and_cleanup("failed to allocate shared memory", -1, s); + return; + } + *opaque_cntr = 1UL; + + tmpnam(opaque_lock_name); + /* FIXME: get the opaque_lock_name from a directive so we're portable + * to non-process-inheriting operating systems, like Win32. */ + sts = apr_global_mutex_create(&opaque_lock, opaque_lock_name, + APR_LOCK_DEFAULT, ctx); + if (sts != APR_SUCCESS) { + log_error_and_cleanup("failed to create lock (opaque_lock)", sts, s); + return; + } + + + /* setup one-time-nonce counter */ + + otn_counter = apr_rmm_malloc(client_rmm, sizeof(*otn_counter)); + if (otn_counter == NULL) { + log_error_and_cleanup("failed to allocate shared memory", -1, s); + return; + } + *otn_counter = 0; + /* no lock here */ + + + /* success */ + return; +} + +#endif /* APR_HAS_SHARED_MEMORY */ + + +static int initialize_module(apr_pool_t *p, apr_pool_t *plog, + apr_pool_t *ptemp, server_rec *s) +{ + void *data; + const char *userdata_key = "auth_digest_init"; + + /* initialize_module() will be called twice, and if it's a DSO + * then all static data from the first call will be lost. Only + * set up our static data on the second call. */ + apr_pool_userdata_get(&data, userdata_key, s->process->pool); + if (!data) { + apr_pool_userdata_set((const void *)1, userdata_key, + apr_pool_cleanup_null, s->process->pool); + return OK; + } + if (initialize_secret(s) != APR_SUCCESS) { + return !OK; + } + +#if APR_HAS_SHARED_MEMORY + /* Note: this stuff is currently fixed for the lifetime of the server, + * i.e. even across restarts. This means that A) any shmem-size + * configuration changes are ignored, and B) certain optimizations, + * such as only allocating the smallest necessary entry for each + * client, can't be done. However, the alternative is a nightmare: + * we can't call apr_shm_destroy on a graceful restart because there + * will be children using the tables, and we also don't know when the + * last child dies. Therefore we can never clean up the old stuff, + * creating a creeping memory leak. + */ + initialize_tables(s, p); + apr_pool_cleanup_register(p, NULL, cleanup_tables, apr_pool_cleanup_null); +#endif /* APR_HAS_SHARED_MEMORY */ + return OK; +} + +static void initialize_child(apr_pool_t *p, server_rec *s) +{ + apr_status_t sts; + + if (!client_shm) { + return; + } + + /* FIXME: get the client_lock_name from a directive so we're portable + * to non-process-inheriting operating systems, like Win32. */ + sts = apr_global_mutex_child_init(&client_lock, client_lock_name, p); + if (sts != APR_SUCCESS) { + log_error_and_cleanup("failed to create lock (client_lock)", sts, s); + return; + } + /* FIXME: get the opaque_lock_name from a directive so we're portable + * to non-process-inheriting operating systems, like Win32. */ + sts = apr_global_mutex_child_init(&opaque_lock, opaque_lock_name, p); + if (sts != APR_SUCCESS) { + log_error_and_cleanup("failed to create lock (opaque_lock)", sts, s); + return; + } +} + +/* + * configuration code + */ + +static void *create_digest_dir_config(apr_pool_t *p, char *dir) +{ + digest_config_rec *conf; + + if (dir == NULL) { + return NULL; + } + + conf = (digest_config_rec *) apr_pcalloc(p, sizeof(digest_config_rec)); + if (conf) { + conf->qop_list = apr_palloc(p, sizeof(char*)); + conf->qop_list[0] = NULL; + conf->nonce_lifetime = DFLT_NONCE_LIFE; + conf->dir_name = apr_pstrdup(p, dir); + conf->algorithm = DFLT_ALGORITHM; + } + + return conf; +} + +static const char *set_realm(cmd_parms *cmd, void *config, const char *realm) +{ + digest_config_rec *conf = (digest_config_rec *) config; + + /* The core already handles the realm, but it's just too convenient to + * grab it ourselves too and cache some setups. However, we need to + * let the core get at it too, which is why we decline at the end - + * this relies on the fact that http_core is last in the list. + */ + conf->realm = realm; + + /* we precompute the part of the nonce hash that is constant (well, + * the host:port would be too, but that varies for .htaccess files + * and directives outside a virtual host section) + */ + apr_sha1_init(&conf->nonce_ctx); + apr_sha1_update_binary(&conf->nonce_ctx, secret, sizeof(secret)); + apr_sha1_update_binary(&conf->nonce_ctx, (const unsigned char *) realm, + strlen(realm)); + + return DECLINE_CMD; +} + +static const char *set_digest_file(cmd_parms *cmd, void *config, + const char *file) +{ + ((digest_config_rec *) config)->pwfile = file; + return NULL; +} + +static const char *set_group_file(cmd_parms *cmd, void *config, + const char *file) +{ + ((digest_config_rec *) config)->grpfile = file; + return NULL; +} + +static const char *set_qop(cmd_parms *cmd, void *config, const char *op) +{ + digest_config_rec *conf = (digest_config_rec *) config; + char **tmp; + int cnt; + + if (!strcasecmp(op, "none")) { + if (conf->qop_list[0] == NULL) { + conf->qop_list = apr_palloc(cmd->pool, 2 * sizeof(char*)); + conf->qop_list[1] = NULL; + } + conf->qop_list[0] = "none"; + return NULL; + } + + if (!strcasecmp(op, "auth-int")) { + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, cmd->server, + "Digest: WARNING: qop `auth-int' currently only works " + "correctly for responses with no entity"); + } + else if (strcasecmp(op, "auth")) { + return apr_pstrcat(cmd->pool, "Unrecognized qop: ", op, NULL); + } + + for (cnt = 0; conf->qop_list[cnt] != NULL; cnt++) + ; + + tmp = apr_palloc(cmd->pool, (cnt + 2) * sizeof(char*)); + memcpy(tmp, conf->qop_list, cnt*sizeof(char*)); + tmp[cnt] = apr_pstrdup(cmd->pool, op); + tmp[cnt+1] = NULL; + conf->qop_list = tmp; + + return NULL; +} + +static const char *set_nonce_lifetime(cmd_parms *cmd, void *config, + const char *t) +{ + char *endptr; + long lifetime; + + lifetime = strtol(t, &endptr, 10); + if (endptr < (t+strlen(t)) && !apr_isspace(*endptr)) { + return apr_pstrcat(cmd->pool, + "Invalid time in AuthDigestNonceLifetime: ", + t, NULL); + } + + ((digest_config_rec *) config)->nonce_lifetime = apr_time_from_sec(lifetime); + return NULL; +} + +static const char *set_nonce_format(cmd_parms *cmd, void *config, + const char *fmt) +{ + ((digest_config_rec *) config)->nonce_format = fmt; + return "AuthDigestNonceFormat is not implemented (yet)"; +} + +static const char *set_nc_check(cmd_parms *cmd, void *config, int flag) +{ + if (flag && !client_shm) + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, + cmd->server, "Digest: WARNING: nonce-count checking " + "is not supported on platforms without shared-memory " + "support - disabling check"); + + ((digest_config_rec *) config)->check_nc = flag; + return NULL; +} + +static const char *set_algorithm(cmd_parms *cmd, void *config, const char *alg) +{ + if (!strcasecmp(alg, "MD5-sess")) { + if (!client_shm) { + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, + cmd->server, "Digest: WARNING: algorithm `MD5-sess' " + "is not supported on platforms without shared-memory " + "support - reverting to MD5"); + alg = "MD5"; + } + } + else if (strcasecmp(alg, "MD5")) { + return apr_pstrcat(cmd->pool, "Invalid algorithm in AuthDigestAlgorithm: ", alg, NULL); + } + + ((digest_config_rec *) config)->algorithm = alg; + return NULL; +} + +static const char *set_uri_list(cmd_parms *cmd, void *config, const char *uri) +{ + digest_config_rec *c = (digest_config_rec *) config; + if (c->uri_list) { + c->uri_list[strlen(c->uri_list)-1] = '\0'; + c->uri_list = apr_pstrcat(cmd->pool, c->uri_list, " ", uri, "\"", NULL); + } + else { + c->uri_list = apr_pstrcat(cmd->pool, ", domain=\"", uri, "\"", NULL); + } + return NULL; +} + +static const char *set_shmem_size(cmd_parms *cmd, void *config, + const char *size_str) +{ + char *endptr; + long size, min; + + size = strtol(size_str, &endptr, 10); + while (apr_isspace(*endptr)) endptr++; + if (*endptr == '\0' || *endptr == 'b' || *endptr == 'B') { + ; + } + else if (*endptr == 'k' || *endptr == 'K') { + size *= 1024; + } + else if (*endptr == 'm' || *endptr == 'M') { + size *= 1048576; + } + else { + return apr_pstrcat(cmd->pool, "Invalid size in AuthDigestShmemSize: ", + size_str, NULL); + } + + min = sizeof(*client_list) + sizeof(client_entry*) + sizeof(client_entry); + if (size < min) { + return apr_psprintf(cmd->pool, "size in AuthDigestShmemSize too small: " + "%ld < %ld", size, min); + } + + shmem_size = size; + num_buckets = (size - sizeof(*client_list)) / + (sizeof(client_entry*) + HASH_DEPTH * sizeof(client_entry)); + if (num_buckets == 0) { + num_buckets = 1; + } + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, cmd->server, + "Digest: Set shmem-size: %ld, num-buckets: %ld", shmem_size, + num_buckets); + + return NULL; +} + +static const command_rec digest_cmds[] = +{ + AP_INIT_TAKE1("AuthName", set_realm, NULL, OR_AUTHCFG, + "The authentication realm (e.g. \"Members Only\")"), + AP_INIT_TAKE1("AuthDigestFile", set_digest_file, NULL, OR_AUTHCFG, + "The name of the file containing the usernames and password hashes"), + AP_INIT_TAKE1("AuthDigestGroupFile", set_group_file, NULL, OR_AUTHCFG, + "The name of the file containing the group names and members"), + AP_INIT_ITERATE("AuthDigestQop", set_qop, NULL, OR_AUTHCFG, + "A list of quality-of-protection options"), + AP_INIT_TAKE1("AuthDigestNonceLifetime", set_nonce_lifetime, NULL, OR_AUTHCFG, + "Maximum lifetime of the server nonce (seconds)"), + AP_INIT_TAKE1("AuthDigestNonceFormat", set_nonce_format, NULL, OR_AUTHCFG, + "The format to use when generating the server nonce"), + AP_INIT_FLAG("AuthDigestNcCheck", set_nc_check, NULL, OR_AUTHCFG, + "Whether or not to check the nonce-count sent by the client"), + AP_INIT_TAKE1("AuthDigestAlgorithm", set_algorithm, NULL, OR_AUTHCFG, + "The algorithm used for the hash calculation"), + AP_INIT_ITERATE("AuthDigestDomain", set_uri_list, NULL, OR_AUTHCFG, + "A list of URI's which belong to the same protection space as the current URI"), + AP_INIT_TAKE1("AuthDigestShmemSize", set_shmem_size, NULL, RSRC_CONF, + "The amount of shared memory to allocate for keeping track of clients"), + {NULL} +}; + + +/* + * client list code + * + * Each client is assigned a number, which is transfered in the opaque + * field of the WWW-Authenticate and Authorization headers. The number + * is just a simple counter which is incremented for each new client. + * Clients can't forge this number because it is hashed up into the + * server nonce, and that is checked. + * + * The clients are kept in a simple hash table, which consists of an + * array of client_entry's, each with a linked list of entries hanging + * off it. The client's number modulo the size of the array gives the + * bucket number. + * + * The clients are garbage collected whenever a new client is allocated + * but there is not enough space left in the shared memory segment. A + * simple semi-LRU is used for this: whenever a client entry is accessed + * it is moved to the beginning of the linked list in its bucket (this + * also makes for faster lookups for current clients). The garbage + * collecter then just removes the oldest entry (i.e. the one at the + * end of the list) in each bucket. + * + * The main advantages of the above scheme are that it's easy to implement + * and it keeps the hash table evenly balanced (i.e. same number of entries + * in each bucket). The major disadvantage is that you may be throwing + * entries out which are in active use. This is not tragic, as these + * clients will just be sent a new client id (opaque field) and nonce + * with a stale=true (i.e. it will just look like the nonce expired, + * thereby forcing an extra round trip). If the shared memory segment + * has enough headroom over the current client set size then this should + * not occur too often. + * + * To help tune the size of the shared memory segment (and see if the + * above algorithm is really sufficient) a set of counters is kept + * indicating the number of clients held, the number of garbage collected + * clients, and the number of erroneously purged clients. These are printed + * out at each garbage collection run. Note that access to the counters is + * not synchronized because they are just indicaters, and whether they are + * off by a few doesn't matter; and for the same reason no attempt is made + * to guarantee the num_renewed is correct in the face of clients spoofing + * the opaque field. + */ + +/* + * Get the client given its client number (the key). Returns the entry, + * or NULL if it's not found. + * + * Access to the list itself is synchronized via locks. However, access + * to the entry returned by get_client() is NOT synchronized. This means + * that there are potentially problems if a client uses multiple, + * simultaneous connections to access url's within the same protection + * space. However, these problems are not new: when using multiple + * connections you have no guarantee of the order the requests are + * processed anyway, so you have problems with the nonce-count and + * one-time nonces anyway. + */ +static client_entry *get_client(unsigned long key, const request_rec *r) +{ + int bucket; + client_entry *entry, *prev = NULL; + + + if (!key || !client_shm) return NULL; + + bucket = key % client_list->tbl_len; + entry = client_list->table[bucket]; + + apr_global_mutex_lock(client_lock); + + while (entry && key != entry->key) { + prev = entry; + entry = entry->next; + } + + if (entry && prev) { /* move entry to front of list */ + prev->next = entry->next; + entry->next = client_list->table[bucket]; + client_list->table[bucket] = entry; + } + + apr_global_mutex_unlock(client_lock); + + if (entry) { + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, + "get_client(): client %lu found", key); + } + else { + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, + "get_client(): client %lu not found", key); + } + + return entry; +} + + +/* A simple garbage-collecter to remove unused clients. It removes the + * last entry in each bucket and updates the counters. Returns the + * number of removed entries. + */ +static long gc(void) +{ + client_entry *entry, *prev; + unsigned long num_removed = 0, idx; + + /* garbage collect all last entries */ + + for (idx = 0; idx < client_list->tbl_len; idx++) { + entry = client_list->table[idx]; + prev = NULL; + while (entry->next) { /* find last entry */ + prev = entry; + entry = entry->next; + } + if (prev) { + prev->next = NULL; /* cut list */ + } + else { + client_list->table[idx] = NULL; + } + if (entry) { /* remove entry */ + apr_rmm_free(client_rmm, (apr_rmm_off_t)entry); + num_removed++; + } + } + + /* update counters and log */ + + client_list->num_entries -= num_removed; + client_list->num_removed += num_removed; + + return num_removed; +} + + +/* + * Add a new client to the list. Returns the entry if successful, NULL + * otherwise. This triggers the garbage collection if memory is low. + */ +static client_entry *add_client(unsigned long key, client_entry *info, + server_rec *s) +{ + int bucket; + client_entry *entry; + + + if (!key || !client_shm) { + return NULL; + } + + bucket = key % client_list->tbl_len; + entry = client_list->table[bucket]; + + apr_global_mutex_lock(client_lock); + + /* try to allocate a new entry */ + + entry = (client_entry *)apr_rmm_malloc(client_rmm, sizeof(client_entry)); + if (!entry) { + long num_removed = gc(); + ap_log_error(APLOG_MARK, APLOG_INFO, 0, s, + "Digest: gc'd %ld client entries. Total new clients: " + "%ld; Total removed clients: %ld; Total renewed clients: " + "%ld", num_removed, + client_list->num_created - client_list->num_renewed, + client_list->num_removed, client_list->num_renewed); + entry = (client_entry *)apr_rmm_malloc(client_rmm, sizeof(client_entry)); + if (!entry) { + return NULL; /* give up */ + } + } + + /* now add the entry */ + + memcpy(entry, info, sizeof(client_entry)); + entry->key = key; + entry->next = client_list->table[bucket]; + client_list->table[bucket] = entry; + client_list->num_created++; + client_list->num_entries++; + + apr_global_mutex_unlock(client_lock); + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "allocated new client %lu", key); + + return entry; +} + + +/* + * Authorization header parser code + */ + +/* Parse the Authorization header, if it exists */ +static int get_digest_rec(request_rec *r, digest_header_rec *resp) +{ + const char *auth_line; + apr_size_t l; + int vk = 0, vv = 0; + char *key, *value; + + auth_line = apr_table_get(r->headers_in, + (PROXYREQ_PROXY == r->proxyreq) + ? "Proxy-Authorization" + : "Authorization"); + if (!auth_line) { + resp->auth_hdr_sts = NO_HEADER; + return !OK; + } + + resp->scheme = ap_getword_white(r->pool, &auth_line); + if (strcasecmp(resp->scheme, "Digest")) { + resp->auth_hdr_sts = NOT_DIGEST; + return !OK; + } + + l = strlen(auth_line); + + key = apr_palloc(r->pool, l+1); + value = apr_palloc(r->pool, l+1); + + while (auth_line[0] != '\0') { + + /* find key */ + + while (apr_isspace(auth_line[0])) { + auth_line++; + } + vk = 0; + while (auth_line[0] != '=' && auth_line[0] != ',' + && auth_line[0] != '\0' && !apr_isspace(auth_line[0])) { + key[vk++] = *auth_line++; + } + key[vk] = '\0'; + while (apr_isspace(auth_line[0])) { + auth_line++; + } + + /* find value */ + + if (auth_line[0] == '=') { + auth_line++; + while (apr_isspace(auth_line[0])) { + auth_line++; + } + + vv = 0; + if (auth_line[0] == '\"') { /* quoted string */ + auth_line++; + while (auth_line[0] != '\"' && auth_line[0] != '\0') { + if (auth_line[0] == '\\' && auth_line[1] != '\0') { + auth_line++; /* escaped char */ + } + value[vv++] = *auth_line++; + } + if (auth_line[0] != '\0') { + auth_line++; + } + } + else { /* token */ + while (auth_line[0] != ',' && auth_line[0] != '\0' + && !apr_isspace(auth_line[0])) { + value[vv++] = *auth_line++; + } + } + value[vv] = '\0'; + } + + while (auth_line[0] != ',' && auth_line[0] != '\0') { + auth_line++; + } + if (auth_line[0] != '\0') { + auth_line++; + } + + if (!strcasecmp(key, "username")) + resp->username = apr_pstrdup(r->pool, value); + else if (!strcasecmp(key, "realm")) + resp->realm = apr_pstrdup(r->pool, value); + else if (!strcasecmp(key, "nonce")) + resp->nonce = apr_pstrdup(r->pool, value); + else if (!strcasecmp(key, "uri")) + resp->uri = apr_pstrdup(r->pool, value); + else if (!strcasecmp(key, "response")) + resp->digest = apr_pstrdup(r->pool, value); + else if (!strcasecmp(key, "algorithm")) + resp->algorithm = apr_pstrdup(r->pool, value); + else if (!strcasecmp(key, "cnonce")) + resp->cnonce = apr_pstrdup(r->pool, value); + else if (!strcasecmp(key, "opaque")) + resp->opaque = apr_pstrdup(r->pool, value); + else if (!strcasecmp(key, "qop")) + resp->message_qop = apr_pstrdup(r->pool, value); + else if (!strcasecmp(key, "nc")) + resp->nonce_count = apr_pstrdup(r->pool, value); + } + + if (!resp->username || !resp->realm || !resp->nonce || !resp->uri + || !resp->digest + || (resp->message_qop && (!resp->cnonce || !resp->nonce_count))) { + resp->auth_hdr_sts = INVALID; + return !OK; + } + + if (resp->opaque) { + resp->opaque_num = (unsigned long) strtol(resp->opaque, NULL, 16); + } + + resp->auth_hdr_sts = VALID; + return OK; +} + + +/* Because the browser may preemptively send auth info, incrementing the + * nonce-count when it does, and because the client does not get notified + * if the URI didn't need authentication after all, we need to be sure to + * update the nonce-count each time we receive an Authorization header no + * matter what the final outcome of the request. Furthermore this is a + * convenient place to get the request-uri (before any subrequests etc + * are initiated) and to initialize the request_config. + * + * Note that this must be called after mod_proxy had its go so that + * r->proxyreq is set correctly. + */ +static int parse_hdr_and_update_nc(request_rec *r) +{ + digest_header_rec *resp; + int res; + + if (!ap_is_initial_req(r)) { + return DECLINED; + } + + resp = apr_pcalloc(r->pool, sizeof(digest_header_rec)); + resp->raw_request_uri = r->unparsed_uri; + resp->psd_request_uri = &r->parsed_uri; + resp->needed_auth = 0; + resp->method = r->method; + ap_set_module_config(r->request_config, &auth_digest_module, resp); + + res = get_digest_rec(r, resp); + resp->client = get_client(resp->opaque_num, r); + if (res == OK && resp->client) { + resp->client->nonce_count++; + } + + return DECLINED; +} + + +/* + * Nonce generation code + */ + +/* The hash part of the nonce is a SHA-1 hash of the time, realm, server host + * and port, opaque, and our secret. + */ +static void gen_nonce_hash(char *hash, const char *timestr, const char *opaque, + const server_rec *server, + const digest_config_rec *conf) +{ + const char *hex = "0123456789abcdef"; + unsigned char sha1[APR_SHA1_DIGESTSIZE]; + apr_sha1_ctx_t ctx; + int idx; + + memcpy(&ctx, &conf->nonce_ctx, sizeof(ctx)); + /* + apr_sha1_update_binary(&ctx, (const unsigned char *) server->server_hostname, + strlen(server->server_hostname)); + apr_sha1_update_binary(&ctx, (const unsigned char *) &server->port, + sizeof(server->port)); + */ + apr_sha1_update_binary(&ctx, (const unsigned char *) timestr, strlen(timestr)); + if (opaque) { + apr_sha1_update_binary(&ctx, (const unsigned char *) opaque, + strlen(opaque)); + } + apr_sha1_final(sha1, &ctx); + + for (idx=0; idx> 4]; + *hash++ = hex[sha1[idx] & 0xF]; + } + + *hash++ = '\0'; +} + + +/* The nonce has the format b64(time)+hash . + */ +static const char *gen_nonce(apr_pool_t *p, apr_time_t now, const char *opaque, + const server_rec *server, + const digest_config_rec *conf) +{ + char *nonce = apr_palloc(p, NONCE_LEN+1); + int len; + time_rec t; + + if (conf->nonce_lifetime != 0) { + t.time = now; + } + else if (otn_counter) { + /* this counter is not synch'd, because it doesn't really matter + * if it counts exactly. + */ + t.time = (*otn_counter)++; + } + else { + /* XXX: WHAT IS THIS CONSTANT? */ + t.time = 42; + } + len = apr_base64_encode_binary(nonce, t.arr, sizeof(t.arr)); + gen_nonce_hash(nonce+NONCE_TIME_LEN, nonce, opaque, server, conf); + + return nonce; +} + + +/* + * Opaque and hash-table management + */ + +/* + * Generate a new client entry, add it to the list, and return the + * entry. Returns NULL if failed. + */ +static client_entry *gen_client(const request_rec *r) +{ + unsigned long op; + client_entry new_entry = { 0, NULL, 0, "", "" }, *entry; + + if (!opaque_cntr) { + return NULL; + } + + apr_global_mutex_lock(opaque_lock); + op = (*opaque_cntr)++; + apr_global_mutex_lock(opaque_lock); + + if (!(entry = add_client(op, &new_entry, r->server))) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Digest: failed to allocate client entry - ignoring " + "client"); + return NULL; + } + + return entry; +} + + +/* + * MD5-sess code. + * + * If you want to use algorithm=MD5-sess you must write get_userpw_hash() + * yourself (see below). The dummy provided here just uses the hash from + * the auth-file, i.e. it is only useful for testing client implementations + * of MD5-sess . + */ + +/* + * get_userpw_hash() will be called each time a new session needs to be + * generated and is expected to return the equivalent of + * + * h_urp = ap_md5(r->pool, + * apr_pstrcat(r->pool, username, ":", ap_auth_name(r), ":", passwd)) + * ap_md5(r->pool, + * (unsigned char *) apr_pstrcat(r->pool, h_urp, ":", resp->nonce, ":", + * resp->cnonce, NULL)); + * + * or put differently, it must return + * + * MD5(MD5(username ":" realm ":" password) ":" nonce ":" cnonce) + * + * If something goes wrong, the failure must be logged and NULL returned. + * + * You must implement this yourself, which will probably consist of code + * contacting the password server with the necessary information (typically + * the username, realm, nonce, and cnonce) and receiving the hash from it. + * + * TBD: This function should probably be in a seperate source file so that + * people need not modify mod_auth_digest.c each time they install a new + * version of apache. + */ +static const char *get_userpw_hash(const request_rec *r, + const digest_header_rec *resp, + const digest_config_rec *conf) +{ + return ap_md5(r->pool, + (unsigned char *) apr_pstrcat(r->pool, conf->ha1, ":", resp->nonce, + ":", resp->cnonce, NULL)); +} + + +/* Retrieve current session H(A1). If there is none and "generate" is + * true then a new session for MD5-sess is generated and stored in the + * client struct; if generate is false, or a new session could not be + * generated then NULL is returned (in case of failure to generate the + * failure reason will have been logged already). + */ +static const char *get_session_HA1(const request_rec *r, + digest_header_rec *resp, + const digest_config_rec *conf, + int generate) +{ + const char *ha1 = NULL; + + /* return the current sessions if there is one */ + if (resp->opaque && resp->client && resp->client->ha1[0]) { + return resp->client->ha1; + } + else if (!generate) { + return NULL; + } + + /* generate a new session */ + if (!resp->client) { + resp->client = gen_client(r); + } + if (resp->client) { + ha1 = get_userpw_hash(r, resp, conf); + if (ha1) { + memcpy(resp->client->ha1, ha1, sizeof(resp->client->ha1)); + } + } + + return ha1; +} + + +static void clear_session(const digest_header_rec *resp) +{ + if (resp->client) { + resp->client->ha1[0] = '\0'; + } +} + +/* + * Authorization challenge generation code (for WWW-Authenticate) + */ + +static const char *ltox(apr_pool_t *p, unsigned long num) +{ + if (num != 0) { + return apr_psprintf(p, "%lx", num); + } + else { + return ""; + } +} + +static void note_digest_auth_failure(request_rec *r, + const digest_config_rec *conf, + digest_header_rec *resp, int stale) +{ + const char *qop, *opaque, *opaque_param, *domain, *nonce; + int cnt; + + /* Setup qop */ + + if (conf->qop_list[0] == NULL) { + qop = ", qop=\"auth\""; + } + else if (!strcasecmp(conf->qop_list[0], "none")) { + qop = ""; + } + else { + qop = apr_pstrcat(r->pool, ", qop=\"", conf->qop_list[0], NULL); + for (cnt = 1; conf->qop_list[cnt] != NULL; cnt++) { + qop = apr_pstrcat(r->pool, qop, ",", conf->qop_list[cnt], NULL); + } + qop = apr_pstrcat(r->pool, qop, "\"", NULL); + } + + /* Setup opaque */ + + if (resp->opaque == NULL) { + /* new client */ + if ((conf->check_nc || conf->nonce_lifetime == 0 + || !strcasecmp(conf->algorithm, "MD5-sess")) + && (resp->client = gen_client(r)) != NULL) { + opaque = ltox(r->pool, resp->client->key); + } + else { + opaque = ""; /* opaque not needed */ + } + } + else if (resp->client == NULL) { + /* client info was gc'd */ + resp->client = gen_client(r); + if (resp->client != NULL) { + opaque = ltox(r->pool, resp->client->key); + stale = 1; + client_list->num_renewed++; + } + else { + opaque = ""; /* ??? */ + } + } + else { + opaque = resp->opaque; + /* we're generating a new nonce, so reset the nonce-count */ + resp->client->nonce_count = 0; + } + + if (opaque[0]) { + opaque_param = apr_pstrcat(r->pool, ", opaque=\"", opaque, "\"", NULL); + } + else { + opaque_param = NULL; + } + + /* Setup nonce */ + + nonce = gen_nonce(r->pool, r->request_time, opaque, r->server, conf); + if (resp->client && conf->nonce_lifetime == 0) { + memcpy(resp->client->last_nonce, nonce, NONCE_LEN+1); + } + + /* Setup MD5-sess stuff. Note that we just clear out the session + * info here, since we can't generate a new session until the request + * from the client comes in with the cnonce. + */ + + if (!strcasecmp(conf->algorithm, "MD5-sess")) { + clear_session(resp); + } + + /* setup domain attribute. We want to send this attribute wherever + * possible so that the client won't send the Authorization header + * unneccessarily (it's usually > 200 bytes!). + */ + + /* don't send domain + * - for proxy requests + * - if it's no specified + */ + if (r->proxyreq || !conf->uri_list) { + domain = NULL; + } + else { + domain = conf->uri_list; + } + + apr_table_mergen(r->err_headers_out, + (PROXYREQ_PROXY == r->proxyreq) + ? "Proxy-Authenticate" : "WWW-Authenticate", + apr_psprintf(r->pool, "Digest realm=\"%s\", " + "nonce=\"%s\", algorithm=%s%s%s%s%s", + ap_auth_name(r), nonce, conf->algorithm, + opaque_param ? opaque_param : "", + domain ? domain : "", + stale ? ", stale=true" : "", qop)); + +} + + +/* + * Authorization header verification code + */ + +static const char *get_hash(request_rec *r, const char *user, + const char *realm, const char *auth_pwfile) +{ + ap_configfile_t *f; + char l[MAX_STRING_LEN]; + const char *rpw; + char *w, *x; + apr_status_t sts; + + if ((sts = ap_pcfg_openfile(&f, r->pool, auth_pwfile)) != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, sts, r, + "Digest: Could not open password file: %s", auth_pwfile); + return NULL; + } + while (!(ap_cfg_getline(l, MAX_STRING_LEN, f))) { + if ((l[0] == '#') || (!l[0])) { + continue; + } + rpw = l; + w = ap_getword(r->pool, &rpw, ':'); + x = ap_getword(r->pool, &rpw, ':'); + + if (x && w && !strcmp(user, w) && !strcmp(realm, x)) { + ap_cfg_closefile(f); + return apr_pstrdup(r->pool, rpw); + } + } + ap_cfg_closefile(f); + return NULL; +} + +static int check_nc(const request_rec *r, const digest_header_rec *resp, + const digest_config_rec *conf) +{ + unsigned long nc; + const char *snc = resp->nonce_count; + char *endptr; + + if (!conf->check_nc || !client_shm) { + return OK; + } + + nc = strtol(snc, &endptr, 16); + if (endptr < (snc+strlen(snc)) && !apr_isspace(*endptr)) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Digest: invalid nc %s received - not a number", snc); + return !OK; + } + + if (!resp->client) { + return !OK; + } + + if (nc != resp->client->nonce_count) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Digest: Warning, possible replay attack: nonce-count " + "check failed: %lu != %lu", nc, + resp->client->nonce_count); + return !OK; + } + + return OK; +} + +static int check_nonce(request_rec *r, digest_header_rec *resp, + const digest_config_rec *conf) +{ + apr_time_t dt; + int len; + time_rec nonce_time; + char tmp, hash[NONCE_HASH_LEN+1]; + + if (strlen(resp->nonce) != NONCE_LEN) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Digest: invalid nonce %s received - length is not %d", + resp->nonce, NONCE_LEN); + note_digest_auth_failure(r, conf, resp, 1); + return HTTP_UNAUTHORIZED; + } + + tmp = resp->nonce[NONCE_TIME_LEN]; + resp->nonce[NONCE_TIME_LEN] = '\0'; + len = apr_base64_decode_binary(nonce_time.arr, resp->nonce); + gen_nonce_hash(hash, resp->nonce, resp->opaque, r->server, conf); + resp->nonce[NONCE_TIME_LEN] = tmp; + resp->nonce_time = nonce_time.time; + + if (strcmp(hash, resp->nonce+NONCE_TIME_LEN)) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Digest: invalid nonce %s received - hash is not %s", + resp->nonce, hash); + note_digest_auth_failure(r, conf, resp, 1); + return HTTP_UNAUTHORIZED; + } + + dt = r->request_time - nonce_time.time; + if (conf->nonce_lifetime > 0 && dt < 0) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Digest: invalid nonce %s received - user attempted " + "time travel", resp->nonce); + note_digest_auth_failure(r, conf, resp, 1); + return HTTP_UNAUTHORIZED; + } + + if (conf->nonce_lifetime > 0) { + if (dt > conf->nonce_lifetime) { + ap_log_rerror(APLOG_MARK, APLOG_INFO, 0,r, + "Digest: user %s: nonce expired (%.2f seconds old " + "- max lifetime %.2f) - sending new nonce", + r->user, (double)apr_time_sec(dt), + (double)apr_time_sec(conf->nonce_lifetime)); + note_digest_auth_failure(r, conf, resp, 1); + return HTTP_UNAUTHORIZED; + } + } + else if (conf->nonce_lifetime == 0 && resp->client) { + if (memcmp(resp->client->last_nonce, resp->nonce, NONCE_LEN)) { + ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r, + "Digest: user %s: one-time-nonce mismatch - sending " + "new nonce", r->user); + note_digest_auth_failure(r, conf, resp, 1); + return HTTP_UNAUTHORIZED; + } + } + /* else (lifetime < 0) => never expires */ + + return OK; +} + +/* The actual MD5 code... whee */ + +/* RFC-2069 */ +static const char *old_digest(const request_rec *r, + const digest_header_rec *resp, const char *ha1) +{ + const char *ha2; + + ha2 = ap_md5(r->pool, (unsigned char *)apr_pstrcat(r->pool, resp->method, ":", + resp->uri, NULL)); + return ap_md5(r->pool, + (unsigned char *)apr_pstrcat(r->pool, ha1, ":", resp->nonce, + ":", ha2, NULL)); +} + +/* RFC-2617 */ +static const char *new_digest(const request_rec *r, + digest_header_rec *resp, + const digest_config_rec *conf) +{ + const char *ha1, *ha2, *a2; + + if (resp->algorithm && !strcasecmp(resp->algorithm, "MD5-sess")) { + ha1 = get_session_HA1(r, resp, conf, 1); + if (!ha1) { + return NULL; + } + } + else { + ha1 = conf->ha1; + } + + if (resp->message_qop && !strcasecmp(resp->message_qop, "auth-int")) { + a2 = apr_pstrcat(r->pool, resp->method, ":", resp->uri, ":", + ap_md5(r->pool, (const unsigned char*) ""), NULL); + /* TBD */ + } + else { + a2 = apr_pstrcat(r->pool, resp->method, ":", resp->uri, NULL); + } + ha2 = ap_md5(r->pool, (const unsigned char *)a2); + + return ap_md5(r->pool, + (unsigned char *)apr_pstrcat(r->pool, ha1, ":", resp->nonce, + ":", resp->nonce_count, ":", + resp->cnonce, ":", + resp->message_qop, ":", ha2, + NULL)); +} + + +static void copy_uri_components(apr_uri_t *dst, + apr_uri_t *src, request_rec *r) { + if (src->scheme && src->scheme[0] != '\0') { + dst->scheme = src->scheme; + } + else { + dst->scheme = (char *) "http"; + } + + if (src->hostname && src->hostname[0] != '\0') { + dst->hostname = apr_pstrdup(r->pool, src->hostname); + ap_unescape_url(dst->hostname); + } + else { + dst->hostname = (char *) ap_get_server_name(r); + } + + if (src->port_str && src->port_str[0] != '\0') { + dst->port = src->port; + } + else { + dst->port = ap_get_server_port(r); + } + + if (src->path && src->path[0] != '\0') { + dst->path = apr_pstrdup(r->pool, src->path); + ap_unescape_url(dst->path); + } + else { + dst->path = src->path; + } + + if (src->query && src->query[0] != '\0') { + dst->query = apr_pstrdup(r->pool, src->query); + ap_unescape_url(dst->query); + } + else { + dst->query = src->query; + } + + dst->hostinfo = src->hostinfo; +} + +/* These functions return 0 if client is OK, and proper error status + * if not... either HTTP_UNAUTHORIZED, if we made a check, and it failed, or + * HTTP_INTERNAL_SERVER_ERROR, if things are so totally confused that we + * couldn't figure out how to tell if the client is authorized or not. + * + * If they return DECLINED, and all other modules also decline, that's + * treated by the server core as a configuration error, logged and + * reported as such. + */ + +/* Determine user ID, and check if the attributes are correct, if it + * really is that user, if the nonce is correct, etc. + */ + +static int authenticate_digest_user(request_rec *r) +{ + digest_config_rec *conf; + digest_header_rec *resp; + request_rec *mainreq; + const char *t; + int res; + + /* do we require Digest auth for this URI? */ + + if (!(t = ap_auth_type(r)) || strcasecmp(t, "Digest")) { + return DECLINED; + } + + if (!ap_auth_name(r)) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Digest: need AuthName: %s", r->uri); + return HTTP_INTERNAL_SERVER_ERROR; + } + + + /* get the client response and mark */ + + mainreq = r; + while (mainreq->main != NULL) { + mainreq = mainreq->main; + } + while (mainreq->prev != NULL) { + mainreq = mainreq->prev; + } + resp = (digest_header_rec *) ap_get_module_config(mainreq->request_config, + &auth_digest_module); + resp->needed_auth = 1; + + + /* get our conf */ + + conf = (digest_config_rec *) ap_get_module_config(r->per_dir_config, + &auth_digest_module); + + + /* check for existence and syntax of Auth header */ + + if (resp->auth_hdr_sts != VALID) { + if (resp->auth_hdr_sts == NOT_DIGEST) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Digest: client used wrong authentication scheme " + "`%s': %s", resp->scheme, r->uri); + } + else if (resp->auth_hdr_sts == INVALID) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Digest: missing user, realm, nonce, uri, digest, " + "cnonce, or nonce_count in authorization header: %s", + r->uri); + } + /* else (resp->auth_hdr_sts == NO_HEADER) */ + note_digest_auth_failure(r, conf, resp, 0); + return HTTP_UNAUTHORIZED; + } + + r->user = (char *) resp->username; + r->ap_auth_type = (char *) "Digest"; + + /* check the auth attributes */ + + if (strcmp(resp->uri, resp->raw_request_uri)) { + /* Hmm, the simple match didn't work (probably a proxy modified the + * request-uri), so lets do a more sophisticated match + */ + apr_uri_t r_uri, d_uri; + + copy_uri_components(&r_uri, resp->psd_request_uri, r); + if (apr_uri_parse(r->pool, resp->uri, &d_uri) != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Digest: invalid uri <%s> in Authorization header", + resp->uri); + return HTTP_BAD_REQUEST; + } + + if (d_uri.hostname) { + ap_unescape_url(d_uri.hostname); + } + if (d_uri.path) { + ap_unescape_url(d_uri.path); + } + if (d_uri.query) { + ap_unescape_url(d_uri.query); + } + else if (r_uri.query) { + /* MSIE compatibility hack. MSIE has some RFC issues - doesn't + * include the query string in the uri Authorization component + * or when computing the response component. the second part + * works out ok, since we can hash the header and get the same + * result. however, the uri from the request line won't match + * the uri Authorization component since the header lacks the + * query string, leaving us incompatable with a (broken) MSIE. + * + * the workaround is to fake a query string match if in the proper + * environment - BrowserMatch MSIE, for example. the cool thing + * is that if MSIE ever fixes itself the simple match ought to + * work and this code won't be reached anyway, even if the + * environment is set. + */ + + if (apr_table_get(r->subprocess_env, + "AuthDigestEnableQueryStringHack")) { + d_uri.query = r_uri.query; + } + } + + if (r->method_number == M_CONNECT) { + if (!r_uri.hostinfo || strcmp(resp->uri, r_uri.hostinfo)) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Digest: uri mismatch - <%s> does not match " + "request-uri <%s>", resp->uri, r_uri.hostinfo); + return HTTP_BAD_REQUEST; + } + } + else if ( + /* check hostname matches, if present */ + (d_uri.hostname && d_uri.hostname[0] != '\0' + && strcasecmp(d_uri.hostname, r_uri.hostname)) + /* check port matches, if present */ + || (d_uri.port_str && d_uri.port != r_uri.port) + /* check that server-port is default port if no port present */ + || (d_uri.hostname && d_uri.hostname[0] != '\0' + && !d_uri.port_str && r_uri.port != ap_default_port(r)) + /* check that path matches */ + || (d_uri.path != r_uri.path + /* either exact match */ + && (!d_uri.path || !r_uri.path + || strcmp(d_uri.path, r_uri.path)) + /* or '*' matches empty path in scheme://host */ + && !(d_uri.path && !r_uri.path && resp->psd_request_uri->hostname + && d_uri.path[0] == '*' && d_uri.path[1] == '\0')) + /* check that query matches */ + || (d_uri.query != r_uri.query + && (!d_uri.query || !r_uri.query + || strcmp(d_uri.query, r_uri.query))) + ) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Digest: uri mismatch - <%s> does not match " + "request-uri <%s>", resp->uri, resp->raw_request_uri); + return HTTP_BAD_REQUEST; + } + } + + if (resp->opaque && resp->opaque_num == 0) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Digest: received invalid opaque - got `%s'", + resp->opaque); + note_digest_auth_failure(r, conf, resp, 0); + return HTTP_UNAUTHORIZED; + } + + if (strcmp(resp->realm, conf->realm)) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Digest: realm mismatch - got `%s' but expected `%s'", + resp->realm, conf->realm); + note_digest_auth_failure(r, conf, resp, 0); + return HTTP_UNAUTHORIZED; + } + + if (resp->algorithm != NULL + && strcasecmp(resp->algorithm, "MD5") + && strcasecmp(resp->algorithm, "MD5-sess")) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Digest: unknown algorithm `%s' received: %s", + resp->algorithm, r->uri); + note_digest_auth_failure(r, conf, resp, 0); + return HTTP_UNAUTHORIZED; + } + + if (!conf->pwfile) { + return DECLINED; + } + + if (!(conf->ha1 = get_hash(r, r->user, conf->realm, conf->pwfile))) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Digest: user `%s' in realm `%s' not found: %s", + r->user, conf->realm, r->uri); + note_digest_auth_failure(r, conf, resp, 0); + return HTTP_UNAUTHORIZED; + } + + + if (resp->message_qop == NULL) { + /* old (rfc-2069) style digest */ + if (strcmp(resp->digest, old_digest(r, resp, conf->ha1))) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Digest: user %s: password mismatch: %s", r->user, + r->uri); + note_digest_auth_failure(r, conf, resp, 0); + return HTTP_UNAUTHORIZED; + } + } + else { + const char *exp_digest; + int match = 0, idx; + for (idx = 0; conf->qop_list[idx] != NULL; idx++) { + if (!strcasecmp(conf->qop_list[idx], resp->message_qop)) { + match = 1; + break; + } + } + + if (!match + && !(conf->qop_list[0] == NULL + && !strcasecmp(resp->message_qop, "auth"))) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Digest: invalid qop `%s' received: %s", + resp->message_qop, r->uri); + note_digest_auth_failure(r, conf, resp, 0); + return HTTP_UNAUTHORIZED; + } + + exp_digest = new_digest(r, resp, conf); + if (!exp_digest) { + /* we failed to allocate a client struct */ + return HTTP_INTERNAL_SERVER_ERROR; + } + if (strcmp(resp->digest, exp_digest)) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Digest: user %s: password mismatch: %s", r->user, + r->uri); + note_digest_auth_failure(r, conf, resp, 0); + return HTTP_UNAUTHORIZED; + } + } + + if (check_nc(r, resp, conf) != OK) { + note_digest_auth_failure(r, conf, resp, 0); + return HTTP_UNAUTHORIZED; + } + + /* Note: this check is done last so that a "stale=true" can be + generated if the nonce is old */ + if ((res = check_nonce(r, resp, conf))) { + return res; + } + + return OK; +} + + +/* + * Checking ID + */ + +static apr_table_t *groups_for_user(request_rec *r, const char *user, + const char *grpfile) +{ + ap_configfile_t *f; + apr_table_t *grps = apr_table_make(r->pool, 15); + apr_pool_t *sp; + char l[MAX_STRING_LEN]; + const char *group_name, *ll, *w; + apr_status_t sts; + + if ((sts = ap_pcfg_openfile(&f, r->pool, grpfile)) != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, sts, r, + "Digest: Could not open group file: %s", grpfile); + return NULL; + } + + if (apr_pool_create(&sp, r->pool) != APR_SUCCESS) { + return NULL; + } + + while (!(ap_cfg_getline(l, MAX_STRING_LEN, f))) { + if ((l[0] == '#') || (!l[0])) { + continue; + } + ll = l; + apr_pool_clear(sp); + + group_name = ap_getword(sp, &ll, ':'); + + while (ll[0]) { + w = ap_getword_conf(sp, &ll); + if (!strcmp(w, user)) { + apr_table_setn(grps, apr_pstrdup(r->pool, group_name), "in"); + break; + } + } + } + + ap_cfg_closefile(f); + apr_pool_destroy(sp); + return grps; +} + + +static int digest_check_auth(request_rec *r) +{ + const digest_config_rec *conf = + (digest_config_rec *) ap_get_module_config(r->per_dir_config, + &auth_digest_module); + const char *user = r->user; + int m = r->method_number; + int method_restricted = 0; + register int x; + const char *t, *w; + apr_table_t *grpstatus; + const apr_array_header_t *reqs_arr; + require_line *reqs; + + if (!(t = ap_auth_type(r)) || strcasecmp(t, "Digest")) { + return DECLINED; + } + + reqs_arr = ap_requires(r); + /* If there is no "requires" directive, then any user will do. + */ + if (!reqs_arr) { + return OK; + } + reqs = (require_line *) reqs_arr->elts; + + if (conf->grpfile) { + grpstatus = groups_for_user(r, user, conf->grpfile); + } + else { + grpstatus = NULL; + } + + for (x = 0; x < reqs_arr->nelts; x++) { + + if (!(reqs[x].method_mask & (AP_METHOD_BIT << m))) { + continue; + } + + method_restricted = 1; + + t = reqs[x].requirement; + w = ap_getword_white(r->pool, &t); + if (!strcasecmp(w, "valid-user")) { + return OK; + } + else if (!strcasecmp(w, "user")) { + while (t[0]) { + w = ap_getword_conf(r->pool, &t); + if (!strcmp(user, w)) { + return OK; + } + } + } + else if (!strcasecmp(w, "group")) { + if (!grpstatus) { + return DECLINED; + } + + while (t[0]) { + w = ap_getword_conf(r->pool, &t); + if (apr_table_get(grpstatus, w)) { + return OK; + } + } + } + else { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Digest: access to %s failed, reason: unknown " + "require directive \"%s\"", + r->uri, reqs[x].requirement); + return DECLINED; + } + } + + if (!method_restricted) { + return OK; + } + + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Digest: access to %s failed, reason: user %s not " + "allowed access", r->uri, user); + + note_digest_auth_failure(r, conf, + (digest_header_rec *) ap_get_module_config(r->request_config, + &auth_digest_module), + 0); + return HTTP_UNAUTHORIZED; +} + + +/* + * Authorization-Info header code + */ + +#ifdef SEND_DIGEST +static const char *hdr(const apr_table_t *tbl, const char *name) +{ + const char *val = apr_table_get(tbl, name); + if (val) { + return val; + } + else { + return ""; + } +} +#endif + +static int add_auth_info(request_rec *r) +{ + const digest_config_rec *conf = + (digest_config_rec *) ap_get_module_config(r->per_dir_config, + &auth_digest_module); + digest_header_rec *resp = + (digest_header_rec *) ap_get_module_config(r->request_config, + &auth_digest_module); + const char *ai = NULL, *digest = NULL, *nextnonce = ""; + + if (resp == NULL || !resp->needed_auth || conf == NULL) { + return OK; + } + + + /* rfc-2069 digest + */ + if (resp->message_qop == NULL) { + /* old client, so calc rfc-2069 digest */ + +#ifdef SEND_DIGEST + /* most of this totally bogus because the handlers don't set the + * headers until the final handler phase (I wonder why this phase + * is called fixup when there's almost nothing you can fix up...) + * + * Because it's basically impossible to get this right (e.g. the + * Content-length is never set yet when we get here, and we can't + * calc the entity hash) it's best to just leave this #def'd out. + */ + char date[APR_RFC822_DATE_LEN]; + apr_rfc822_date(date, r->request_time); + char *entity_info = + ap_md5(r->pool, + (unsigned char *) apr_pstrcat(r->pool, resp->raw_request_uri, + ":", + r->content_type ? r->content_type : ap_default_type(r), ":", + hdr(r->headers_out, "Content-Length"), ":", + r->content_encoding ? r->content_encoding : "", ":", + hdr(r->headers_out, "Last-Modified"), ":", + r->no_cache && !apr_table_get(r->headers_out, "Expires") ? + date : + hdr(r->headers_out, "Expires"), + NULL)); + digest = + ap_md5(r->pool, + (unsigned char *)apr_pstrcat(r->pool, conf->ha1, ":", + resp->nonce, ":", + r->method, ":", + date, ":", + entity_info, ":", + ap_md5(r->pool, (unsigned char *) ""), /* H(entity) - TBD */ + NULL)); +#endif + } + + + /* setup nextnonce + */ + if (conf->nonce_lifetime > 0) { + /* send nextnonce if current nonce will expire in less than 30 secs */ + if ((r->request_time - resp->nonce_time) > (conf->nonce_lifetime-NEXTNONCE_DELTA)) { + nextnonce = apr_pstrcat(r->pool, ", nextnonce=\"", + gen_nonce(r->pool, r->request_time, + resp->opaque, r->server, conf), + "\"", NULL); + if (resp->client) + resp->client->nonce_count = 0; + } + } + else if (conf->nonce_lifetime == 0 && resp->client) { + const char *nonce = gen_nonce(r->pool, 0, resp->opaque, r->server, + conf); + nextnonce = apr_pstrcat(r->pool, ", nextnonce=\"", nonce, "\"", NULL); + memcpy(resp->client->last_nonce, nonce, NONCE_LEN+1); + } + /* else nonce never expires, hence no nextnonce */ + + + /* do rfc-2069 digest + */ + if (conf->qop_list[0] && !strcasecmp(conf->qop_list[0], "none") + && resp->message_qop == NULL) { + /* use only RFC-2069 format */ + if (digest) { + ai = apr_pstrcat(r->pool, "digest=\"", digest, "\"", nextnonce,NULL); + } + else { + ai = nextnonce; + } + } + else { + const char *resp_dig, *ha1, *a2, *ha2; + + /* calculate rspauth attribute + */ + if (resp->algorithm && !strcasecmp(resp->algorithm, "MD5-sess")) { + ha1 = get_session_HA1(r, resp, conf, 0); + if (!ha1) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Digest: internal error: couldn't find session " + "info for user %s", resp->username); + return !OK; + } + } + else { + ha1 = conf->ha1; + } + + if (resp->message_qop && !strcasecmp(resp->message_qop, "auth-int")) { + a2 = apr_pstrcat(r->pool, ":", resp->uri, ":", + ap_md5(r->pool,(const unsigned char *) ""), NULL); + /* TBD */ + } + else { + a2 = apr_pstrcat(r->pool, ":", resp->uri, NULL); + } + ha2 = ap_md5(r->pool, (const unsigned char *)a2); + + resp_dig = ap_md5(r->pool, + (unsigned char *)apr_pstrcat(r->pool, ha1, ":", + resp->nonce, ":", + resp->nonce_count, ":", + resp->cnonce, ":", + resp->message_qop ? + resp->message_qop : "", + ":", ha2, NULL)); + + /* assemble Authentication-Info header + */ + ai = apr_pstrcat(r->pool, + "rspauth=\"", resp_dig, "\"", + nextnonce, + resp->cnonce ? ", cnonce=\"" : "", + resp->cnonce + ? ap_escape_quotes(r->pool, resp->cnonce) + : "", + resp->cnonce ? "\"" : "", + resp->nonce_count ? ", nc=" : "", + resp->nonce_count ? resp->nonce_count : "", + resp->message_qop ? ", qop=" : "", + resp->message_qop ? resp->message_qop : "", + digest ? "digest=\"" : "", + digest ? digest : "", + digest ? "\"" : "", + NULL); + } + + if (ai && ai[0]) { + apr_table_mergen(r->headers_out, + (PROXYREQ_PROXY == r->proxyreq) + ? "Proxy-Authentication-Info" + : "Authentication-Info", + ai); + } + + return OK; +} + + +static void register_hooks(apr_pool_t *p) +{ + static const char * const cfgPost[]={ "http_core.c", NULL }; + static const char * const parsePre[]={ "mod_proxy.c", NULL }; + + ap_hook_post_config(initialize_module, NULL, cfgPost, APR_HOOK_MIDDLE); + ap_hook_child_init(initialize_child, NULL, NULL, APR_HOOK_MIDDLE); + ap_hook_post_read_request(parse_hdr_and_update_nc, parsePre, NULL, APR_HOOK_MIDDLE); + ap_hook_check_user_id(authenticate_digest_user, NULL, NULL, APR_HOOK_MIDDLE); + ap_hook_auth_checker(digest_check_auth, NULL, NULL, APR_HOOK_MIDDLE); + ap_hook_fixups(add_auth_info, NULL, NULL, APR_HOOK_MIDDLE); +} + +module AP_MODULE_DECLARE_DATA auth_digest_module = +{ + STANDARD20_MODULE_STUFF, + create_digest_dir_config, /* dir config creater */ + NULL, /* dir merger --- default is to override */ + NULL, /* server config */ + NULL, /* merge server config */ + digest_cmds, /* command table */ + register_hooks /* register hooks */ +}; + diff --git a/rubbos/app/httpd-2.0.64/modules/aaa/mod_auth_digest.dsp b/rubbos/app/httpd-2.0.64/modules/aaa/mod_auth_digest.dsp new file mode 100644 index 00000000..74daf60b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/aaa/mod_auth_digest.dsp @@ -0,0 +1,128 @@ +# Microsoft Developer Studio Project File - Name="mod_auth_digest" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=mod_auth_digest - 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 "mod_auth_digest.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 "mod_auth_digest.mak" CFG="mod_auth_digest - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "mod_auth_digest - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_auth_digest - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "mod_auth_digest - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_auth_digest_src" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL" +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL" +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /out:"Release/mod_auth_digest.so" /base:@..\..\os\win32\BaseAddr.ref,mod_auth_digest.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Release/mod_auth_digest.so" /base:@..\..\os\win32\BaseAddr.ref,mod_auth_digest.so /opt:ref + +!ELSEIF "$(CFG)" == "mod_auth_digest - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_auth_digest_src" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL" +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL" +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_auth_digest.so" /base:@..\..\os\win32\BaseAddr.ref,mod_auth_digest.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_auth_digest.so" /base:@..\..\os\win32\BaseAddr.ref,mod_auth_digest.so + +!ENDIF + +# Begin Target + +# Name "mod_auth_digest - Win32 Release" +# Name "mod_auth_digest - Win32 Debug" +# Begin Source File + +SOURCE=.\mod_auth_digest.c +# End Source File +# Begin Source File + +SOURCE=.\mod_auth_digest.rc +# End Source File +# Begin Source File + +SOURCE=..\..\build\win32\win32ver.awk + +!IF "$(CFG)" == "mod_auth_digest - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_auth_digest.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_auth_digest.so "auth_digest_module for Apache" ../../include/ap_release.h > .\mod_auth_digest.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "mod_auth_digest - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_auth_digest.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_auth_digest.so "auth_digest_module for Apache" ../../include/ap_release.h > .\mod_auth_digest.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/modules/aaa/modules.mk b/rubbos/app/httpd-2.0.64/modules/aaa/modules.mk new file mode 100644 index 00000000..79900dea --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/aaa/modules.mk @@ -0,0 +1,7 @@ +mod_access.la: mod_access.lo + $(MOD_LINK) mod_access.lo $(MOD_ACCESS_LDADD) +mod_auth.la: mod_auth.lo + $(MOD_LINK) mod_auth.lo $(MOD_AUTH_LDADD) +DISTCLEAN_TARGETS = modules.mk +static = mod_access.la mod_auth.la +shared = diff --git a/rubbos/app/httpd-2.0.64/modules/arch/netware/libprews.c b/rubbos/app/httpd-2.0.64/modules/arch/netware/libprews.c new file mode 100644 index 00000000..5ac5e54c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/arch/netware/libprews.c @@ -0,0 +1,70 @@ +/* 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. + */ + +/*------------------------------------------------------------------ + These functions are to be called when the shared NLM starts and + stops. By using these functions instead of defining a main() + and calling ExitThread(TSR_THREAD, 0), the load time of the + shared NLM is faster and memory size reduced. + + You may also want to override these in your own Apache module + to do any cleanup other than the mechanism Apache modules + provide. +------------------------------------------------------------------*/ +#include +//#include "stddef.h" +#include "novsock2.h" + +int _NonAppStart +( + void *NLMHandle, + void *errorScreen, + const char *cmdLine, + const char *loadDirPath, + size_t uninitializedDataLength, + void *NLMFileHandle, + int (*readRoutineP)( int conn, void *fileHandle, size_t offset, + size_t nbytes, size_t *bytesRead, void *buffer ), + size_t customDataOffset, + size_t customDataSize, + int messageCount, + const char **messages +) +{ +#pragma unused(cmdLine) +#pragma unused(loadDirPath) +#pragma unused(uninitializedDataLength) +#pragma unused(NLMFileHandle) +#pragma unused(readRoutineP) +#pragma unused(customDataOffset) +#pragma unused(customDataSize) +#pragma unused(messageCount) +#pragma unused(messages) + + WSADATA wsaData; + + return WSAStartup((WORD) MAKEWORD(2, 0), &wsaData); +} + +void _NonAppStop( void ) +{ + WSACleanup(); +} + +int _NonAppCheckUnload( void ) +{ + return 0; +} diff --git a/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_auth_anon.def b/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_auth_anon.def new file mode 100644 index 00000000..ab6b138f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_auth_anon.def @@ -0,0 +1 @@ +EXPORT auth_anon_module diff --git a/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_auth_basic.def b/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_auth_basic.def new file mode 100644 index 00000000..0a6f81aa --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_auth_basic.def @@ -0,0 +1 @@ +EXPORT auth_basic_module diff --git a/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_auth_dbm.def b/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_auth_dbm.def new file mode 100644 index 00000000..830f194d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_auth_dbm.def @@ -0,0 +1 @@ +EXPORT auth_dbm_module diff --git a/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_auth_digest.def b/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_auth_digest.def new file mode 100644 index 00000000..6a3aa085 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_auth_digest.def @@ -0,0 +1 @@ +EXPORT auth_digest_module diff --git a/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_cache.def b/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_cache.def new file mode 100644 index 00000000..6fd6423b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_cache.def @@ -0,0 +1,5 @@ +EXPORT cache_module +EXPORT @mod_cache.imp + + + diff --git a/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_cern_meta.def b/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_cern_meta.def new file mode 100644 index 00000000..5638325b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_cern_meta.def @@ -0,0 +1 @@ +EXPORT cern_meta_module diff --git a/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_dav.def b/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_dav.def new file mode 100644 index 00000000..fb56c92f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_dav.def @@ -0,0 +1,3 @@ +EXPORT dav_module +EXPORT @dav.imp + diff --git a/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_disk_cache.def b/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_disk_cache.def new file mode 100644 index 00000000..0a9440ad --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_disk_cache.def @@ -0,0 +1,3 @@ +IMPORT @mod_cache.imp +EXPORT disk_cache_module + diff --git a/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_echo.def b/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_echo.def new file mode 100644 index 00000000..694135a5 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_echo.def @@ -0,0 +1,2 @@ +EXPORT echo_module + diff --git a/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_expires.def b/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_expires.def new file mode 100644 index 00000000..bc416630 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_expires.def @@ -0,0 +1 @@ +EXPORT expires_module diff --git a/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_file_cache.def b/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_file_cache.def new file mode 100644 index 00000000..8ab98cfb --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_file_cache.def @@ -0,0 +1,2 @@ +EXPORT file_cache_module + diff --git a/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_headers.def b/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_headers.def new file mode 100644 index 00000000..2fe35a85 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_headers.def @@ -0,0 +1 @@ +EXPORT headers_module diff --git a/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_info.def b/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_info.def new file mode 100644 index 00000000..ce71cb37 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_info.def @@ -0,0 +1 @@ +EXPORT info_module diff --git a/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_logio.def b/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_logio.def new file mode 100644 index 00000000..68c70891 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_logio.def @@ -0,0 +1,2 @@ +EXPORT logio_module + diff --git a/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_mem_cache.def b/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_mem_cache.def new file mode 100644 index 00000000..531d6871 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_mem_cache.def @@ -0,0 +1,3 @@ +IMPORT @mod_cache.imp +EXPORT mem_cache_module + diff --git a/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_mime_magic.def b/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_mime_magic.def new file mode 100644 index 00000000..95307476 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_mime_magic.def @@ -0,0 +1 @@ +EXPORT mime_magic_module diff --git a/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_netware.c b/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_netware.c new file mode 100644 index 00000000..3fec8cc4 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_netware.c @@ -0,0 +1,194 @@ +/* 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. + */ + +#include "apr_strings.h" +#include "apr_portable.h" +#include "apr_buckets.h" +#include "ap_config.h" +#include "httpd.h" +#include "http_config.h" +#include "http_core.h" +#include "http_protocol.h" +#include "http_request.h" +#include "http_log.h" +#include "util_script.h" +#include "mod_core.h" +#include "apr_optional.h" +#include "apr_lib.h" +#include "mod_cgi.h" + +#ifdef NETWARE + + +module AP_MODULE_DECLARE_DATA netware_module; + +typedef struct { + apr_table_t *file_type_handlers; /* CGI map from file types to CGI modules */ + apr_table_t *file_handler_mode; /* CGI module mode (spawn in same address space or not) */ + apr_table_t *extra_env_vars; /* Environment variables to be added to the CGI environment */ +} netware_dir_config; + + +static void *create_netware_dir_config(apr_pool_t *p, char *dir) +{ + netware_dir_config *new = (netware_dir_config*) apr_palloc(p, sizeof(netware_dir_config)); + + new->file_type_handlers = apr_table_make(p, 10); + new->file_handler_mode = apr_table_make(p, 10); + new->extra_env_vars = apr_table_make(p, 10); + + apr_table_set(new->file_type_handlers, "NLM", "OS"); + + return new; +} + +static void *merge_netware_dir_configs(apr_pool_t *p, void *basev, void *addv) +{ + netware_dir_config *base = (netware_dir_config *) basev; + netware_dir_config *add = (netware_dir_config *) addv; + netware_dir_config *new = (netware_dir_config *) apr_palloc(p, sizeof(netware_dir_config)); + + new->file_type_handlers = apr_table_overlay(p, add->file_type_handlers, base->file_type_handlers); + new->file_handler_mode = apr_table_overlay(p, add->file_handler_mode, base->file_handler_mode); + new->extra_env_vars = apr_table_overlay(p, add->extra_env_vars, base->extra_env_vars); + + return new; +} + +static const char *set_extension_map(cmd_parms *cmd, netware_dir_config *m, + char *CGIhdlr, char *ext, char *detach) +{ + int i, len; + + if (*ext == '.') + ++ext; + + if (CGIhdlr != NULL) { + len = strlen(CGIhdlr); + for (i=0; ifile_type_handlers, ext, CGIhdlr); + if (detach) { + apr_table_set(m->file_handler_mode, ext, "y"); + } + + return NULL; +} + +static apr_status_t ap_cgi_build_command(const char **cmd, const char ***argv, + request_rec *r, apr_pool_t *p, + cgi_exec_info_t *e_info) +{ + char *ext = NULL; + char *cmd_only, *ptr; + const char *new_cmd; + netware_dir_config *d; + apr_file_t *fh; + const char *args = ""; + + d = (netware_dir_config *)ap_get_module_config(r->per_dir_config, + &netware_module); + + if (e_info->process_cgi) { + /* Handle the complete file name, we DON'T want to follow suexec, since + * an unrooted command is as predictable as shooting craps in Win32. + * + * Notice that unlike most mime extension parsing, we have to use the + * win32 parsing here, therefore the final extension is the only one + * we will consider + */ + *cmd = r->filename; + if (r->args && r->args[0] && !ap_strchr_c(r->args, '=')) { + args = r->args; + } + } + + cmd_only = apr_pstrdup(p, *cmd); + e_info->cmd_type = APR_PROGRAM; + + /* truncate any arguments from the cmd */ + for (ptr = cmd_only; *ptr && (*ptr != ' '); ptr++); + *ptr = '\0'; + + /* Figure out what the extension is so that we can matche it. */ + ext = strrchr(apr_filepath_name_get(cmd_only), '.'); + + /* If there isn't an extension then give it an empty string */ + if (!ext) { + ext = ""; + } + + /* eliminate the '.' if there is one */ + if (*ext == '.') + ++ext; + + /* check if we have a registered command for the extension*/ + new_cmd = apr_table_get(d->file_type_handlers, ext); + e_info->detached = AP_PROC_DETACHED; + if (new_cmd == NULL) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Could not find a command associated with the %s extension", ext); + return APR_EBADF; + } + if (stricmp(new_cmd, "OS")) { + /* If we have a registered command then add the file that was passed in as a + parameter to the registered command. */ + *cmd = apr_pstrcat (p, new_cmd, " ", cmd_only, NULL); + + /* Run in its own address space if specified */ + if(apr_table_get(d->file_handler_mode, ext)) + e_info->detached |= AP_PROC_NEWADDRSPACE; + } + + /* Tokenize the full command string into its arguments */ + apr_tokenize_to_argv(*cmd, (char***)argv, p); + + /* The first argument should be the executible */ + *cmd = ap_server_root_relative(p, *argv[0]); + + return APR_SUCCESS; +} + +static void register_hooks(apr_pool_t *p) +{ + APR_REGISTER_OPTIONAL_FN(ap_cgi_build_command); +} + +static const command_rec netware_cmds[] = { +AP_INIT_TAKE23("CGIMapExtension", set_extension_map, NULL, OR_FILEINFO, + "Full path to the CGI NLM module followed by a file extension. If the " + "first parameter is set to \"OS\" then the following file extension is " + "treated as NLM. The optional parameter \"detach\" can be specified if " + "the NLM should be launched in its own address space."), +{ NULL } +}; + +module AP_MODULE_DECLARE_DATA netware_module = { + STANDARD20_MODULE_STUFF, + create_netware_dir_config, /* create per-dir config */ + merge_netware_dir_configs, /* merge per-dir config */ + NULL, /* server config */ + NULL, /* merge server config */ + netware_cmds, /* command apr_table_t */ + register_hooks /* register hooks */ +}; + +#endif diff --git a/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_nw_ssl.c b/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_nw_ssl.c new file mode 100644 index 00000000..3d45f149 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_nw_ssl.c @@ -0,0 +1,1151 @@ +/* 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. + */ + +/* + * mod_tls.c - Apache SSL/TLS module for NetWare by Mike Gardiner. + * + * This module gives Apache the ability to do SSL/TLS with a minimum amount + * of effort. All of the SSL/TLS logic is already on NetWare versions 5 and + * above and is interfaced through WinSock on NetWare. As you can see in + * the code below SSL/TLS sockets can be created with three WinSock calls. + * + * To load, simply place the module in the modules directory under the main + * apache tree. Then add a "SecureListen" with two arguments. The first + * argument is an address and/or port. The second argument is the key pair + * name as created in ConsoleOne. + * + * Examples: + * + * SecureListen 443 "SSL CertificateIP" + * SecureListen 123.45.67.89:443 mycert + */ + +#define WS_SSL + +#define MAX_ADDRESS 512 +#define MAX_KEY 80 + + +#include "httpd.h" +#include "http_config.h" +#include "http_log.h" +#include "http_protocol.h" +#include "http_core.h" +#include "ap_listen.h" +#include "apr_strings.h" +#include "apr_portable.h" +#include "apr_optional.h" + +#include + +#ifndef SO_TLS_UNCLEAN_SHUTDOWN +#define SO_TLS_UNCLEAN_SHUTDOWN 0 +#endif + +/* The ssl_var_lookup() optional function retrieves SSL environment + * variables. */ +APR_DECLARE_OPTIONAL_FN(char *, ssl_var_lookup, + (apr_pool_t *, server_rec *, + conn_rec *, request_rec *, + char *)); + +/* An optional function which returns non-zero if the given connection + * is using SSL/TLS. */ +APR_DECLARE_OPTIONAL_FN(int, ssl_is_https, (conn_rec *)); + +/* The ssl_proxy_enable() and ssl_engine_disable() optional functions + * are used by mod_proxy to enable use of SSL for outgoing + * connections. */ +APR_DECLARE_OPTIONAL_FN(int, ssl_proxy_enable, (conn_rec *)); +APR_DECLARE_OPTIONAL_FN(int, ssl_engine_disable, (conn_rec *)); + +#define strEQ(s1,s2) (strcmp(s1,s2) == 0) +#define strNE(s1,s2) (strcmp(s1,s2) != 0) +#define strEQn(s1,s2,n) (strncmp(s1,s2,n) == 0) +#define strNEn(s1,s2,n) (strncmp(s1,s2,n) != 0) + +#define strcEQ(s1,s2) (strcasecmp(s1,s2) == 0) +#define strcNE(s1,s2) (strcasecmp(s1,s2) != 0) +#define strcEQn(s1,s2,n) (strncasecmp(s1,s2,n) == 0) +#define strcNEn(s1,s2,n) (strncasecmp(s1,s2,n) != 0) + +#define strIsEmpty(s) (s == NULL || s[0] == NUL) + + +module AP_MODULE_DECLARE_DATA nwssl_module; + +typedef struct NWSSLSrvConfigRec NWSSLSrvConfigRec; +typedef struct seclisten_rec seclisten_rec; +typedef struct seclistenup_rec seclistenup_rec; +typedef struct secsocket_data secsocket_data; + +struct seclisten_rec { + seclisten_rec *next; + struct sockaddr_in local_addr; /* local IP address and port */ + int fd; + int used; /* Only used during restart */ + char key[MAX_KEY]; + int mutual; + char *addr; + apr_port_t port; +}; + +struct seclistenup_rec { + seclistenup_rec *next; + char key[MAX_KEY]; + char *addr; + apr_port_t port; +}; + +struct NWSSLSrvConfigRec { + apr_table_t *sltable; + apr_table_t *slutable; + apr_pool_t *pPool; +}; + +struct secsocket_data { + apr_socket_t* csd; + int is_secure; +}; + +static apr_array_header_t *certlist = NULL; +static unicode_t** certarray = NULL; +static int numcerts = 0; +static seclisten_rec* ap_seclisteners = NULL; +static seclistenup_rec* ap_seclistenersup = NULL; + +#define get_nwssl_cfg(srv) (NWSSLSrvConfigRec *) ap_get_module_config(srv->module_config, &nwssl_module) + + +static void build_cert_list (apr_pool_t *p) +{ + int i; + char **rootcerts = (char **)certlist->elts; + + numcerts = certlist->nelts; + certarray = apr_palloc(p, sizeof(unicode_t*)*numcerts); + + for (i = 0; i < numcerts; ++i) { + unicode_t *unistr; + unistr = (unicode_t*)apr_palloc(p, strlen(rootcerts[i])*4); + loc2uni (UNI_LOCAL_DEFAULT, unistr, rootcerts[i], 0, 2); + certarray[i] = unistr; + } +} + +/* + * Parses a host of the form
    [:port] + * :port is permitted if 'port' is not NULL + */ +static unsigned long parse_addr(const char *w, unsigned short *ports) +{ + struct hostent *hep; + unsigned long my_addr; + char *p; + + p = strchr(w, ':'); + if (ports != NULL) { + *ports = 0; + if (p != NULL && strcmp(p + 1, "*") != 0) + *ports = atoi(p + 1); + } + + if (p != NULL) + *p = '\0'; + if (strcmp(w, "*") == 0) { + if (p != NULL) + *p = ':'; + return htonl(INADDR_ANY); + } + + my_addr = apr_inet_addr((char *)w); + if (my_addr != INADDR_NONE) { + if (p != NULL) + *p = ':'; + return my_addr; + } + + hep = gethostbyname(w); + + if ((!hep) || (hep->h_addrtype != AF_INET || !hep->h_addr_list[0])) { + /* XXX Should be echoing by h_errno the actual failure, no? + * ap_log_error would be good here. Better yet - APRize. + */ + fprintf(stderr, "Cannot resolve host name %s --- exiting!\n", w); + exit(1); + } + + if (hep->h_addr_list[1]) { + fprintf(stderr, "Host %s has multiple addresses ---\n", w); + fprintf(stderr, "you must choose one explicitly for use as\n"); + fprintf(stderr, "a secure port. Exiting!!!\n"); + exit(1); + } + + if (p != NULL) + *p = ':'; + + return ((struct in_addr *) (hep->h_addr))->s_addr; +} + +static int find_secure_listener(seclisten_rec *lr) +{ + seclisten_rec *sl; + + for (sl = ap_seclisteners; sl; sl = sl->next) { + if (!memcmp(&sl->local_addr, &lr->local_addr, sizeof(sl->local_addr))) { + sl->used = 1; + return sl->fd; + } + } + return -1; +} + +static char *get_port_key(conn_rec *c) +{ + seclistenup_rec *sl; + + for (sl = ap_seclistenersup; sl; sl = sl->next) { + if ((sl->port == (c->local_addr)->port) && + ((strcmp(sl->addr, "0.0.0.0") == 0) || (strcmp(sl->addr, c->local_ip) == 0))) { + return sl->key; + } + } + return NULL; +} + +static int make_secure_socket(apr_pool_t *pconf, const struct sockaddr_in *server, + char* key, int mutual, server_rec *sconf) +{ + int s; + int one = 1; + char addr[MAX_ADDRESS]; + struct sslserveropts opts; + unsigned int optParam; + WSAPROTOCOL_INFO SecureProtoInfo; + int no = 1; + + if (server->sin_addr.s_addr != htonl(INADDR_ANY)) + apr_snprintf(addr, sizeof(addr), "address %s port %d", + inet_ntoa(server->sin_addr), ntohs(server->sin_port)); + else + apr_snprintf(addr, sizeof(addr), "port %d", ntohs(server->sin_port)); + + /* note that because we're about to slack we don't use psocket */ + memset(&SecureProtoInfo, 0, sizeof(WSAPROTOCOL_INFO)); + + SecureProtoInfo.iAddressFamily = AF_INET; + SecureProtoInfo.iSocketType = SOCK_STREAM; + SecureProtoInfo.iProtocol = IPPROTO_TCP; + SecureProtoInfo.iSecurityScheme = SECURITY_PROTOCOL_SSL; + + s = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, + (LPWSAPROTOCOL_INFO)&SecureProtoInfo, 0, 0); + + if (s == INVALID_SOCKET) { + ap_log_error(APLOG_MARK, APLOG_CRIT, WSAGetLastError(), sconf, + "make_secure_socket: failed to get a socket for %s", + addr); + return -1; + } + + if (!mutual) { + optParam = SO_SSL_ENABLE | SO_SSL_SERVER; + + if (WSAIoctl(s, SO_SSL_SET_FLAGS, (char *)&optParam, + sizeof(optParam), NULL, 0, NULL, NULL, NULL)) { + ap_log_error(APLOG_MARK, APLOG_CRIT, WSAGetLastError(), sconf, + "make_secure_socket: for %s, WSAIoctl: " + "(SO_SSL_SET_FLAGS)", addr); + return -1; + } + } + + opts.cert = key; + opts.certlen = strlen(key); + opts.sidtimeout = 0; + opts.sidentries = 0; + opts.siddir = NULL; + + if (WSAIoctl(s, SO_SSL_SET_SERVER, (char *)&opts, sizeof(opts), + NULL, 0, NULL, NULL, NULL) != 0) { + ap_log_error(APLOG_MARK, APLOG_CRIT, WSAGetLastError(), sconf, + "make_secure_socket: for %s, WSAIoctl: " + "(SO_SSL_SET_SERVER)", addr); + return -1; + } + + if (mutual) { + optParam = 0x07; // SO_SSL_AUTH_CLIENT + + if(WSAIoctl(s, SO_SSL_SET_FLAGS, (char*)&optParam, + sizeof(optParam), NULL, 0, NULL, NULL, NULL)) { + ap_log_error(APLOG_MARK, APLOG_CRIT, WSAGetLastError(), sconf, + "make_secure_socket: for %s, WSAIoctl: " + "(SO_SSL_SET_FLAGS)", addr); + return -1; + } + } + + optParam = SO_TLS_UNCLEAN_SHUTDOWN; + WSAIoctl(s, SO_SSL_SET_FLAGS, (char *)&optParam, sizeof(optParam), + NULL, 0, NULL, NULL, NULL); + + return s; +} + +int convert_secure_socket(conn_rec *c, apr_socket_t *csd) +{ + int rcode; + struct tlsclientopts sWS2Opts; + struct nwtlsopts sNWTLSOpts; + struct sslserveropts opts; + unsigned long ulFlags; + SOCKET sock; + unicode_t keyFileName[60]; + + apr_os_sock_get(&sock, csd); + + /* zero out buffers */ + memset((char *)&sWS2Opts, 0, sizeof(struct tlsclientopts)); + memset((char *)&sNWTLSOpts, 0, sizeof(struct nwtlsopts)); + + /* turn on ssl for the socket */ + ulFlags = (numcerts ? SO_TLS_ENABLE : SO_TLS_ENABLE | SO_TLS_BLIND_ACCEPT); + rcode = WSAIoctl(sock, SO_TLS_SET_FLAGS, &ulFlags, sizeof(unsigned long), + NULL, 0, NULL, NULL, NULL); + if (SOCKET_ERROR == rcode) + { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, c->base_server, + "Error: %d with ioctlsocket(flag SO_TLS_ENABLE)", WSAGetLastError()); + return rcode; + } + + ulFlags = SO_TLS_UNCLEAN_SHUTDOWN; + WSAIoctl(sock, SO_TLS_SET_FLAGS, &ulFlags, sizeof(unsigned long), + NULL, 0, NULL, NULL, NULL); + + /* setup the socket for SSL */ + memset (&sWS2Opts, 0, sizeof(sWS2Opts)); + memset (&sNWTLSOpts, 0, sizeof(sNWTLSOpts)); + sWS2Opts.options = &sNWTLSOpts; + + if (numcerts) { + sNWTLSOpts.walletProvider = WAL_PROV_DER; //the wallet provider defined in wdefs.h + sNWTLSOpts.TrustedRootList = certarray; //array of certs in UNICODE format + sNWTLSOpts.numElementsInTRList = numcerts; //number of certs in TRList + } + else { + /* setup the socket for SSL */ + unicpy(keyFileName, L"SSL CertificateIP"); + sWS2Opts.wallet = keyFileName; /* no client certificate */ + sWS2Opts.walletlen = unilen(keyFileName); + + sNWTLSOpts.walletProvider = WAL_PROV_KMO; //the wallet provider defined in wdefs.h + } + + /* make the IOCTL call */ + rcode = WSAIoctl(sock, SO_TLS_SET_CLIENT, &sWS2Opts, + sizeof(struct tlsclientopts), NULL, 0, NULL, + NULL, NULL); + + /* make sure that it was successfull */ + if(SOCKET_ERROR == rcode ){ + ap_log_error(APLOG_MARK, APLOG_ERR, 0, c->base_server, + "Error: %d with ioctl (SO_TLS_SET_CLIENT)", WSAGetLastError()); + } + return rcode; +} + +int SSLize_Socket(SOCKET socketHnd, char *key, request_rec *r) +{ + int rcode; + struct tlsserveropts sWS2Opts; + struct nwtlsopts sNWTLSOpts; + unicode_t SASKey[512]; + unsigned long ulFlag; + + memset((char *)&sWS2Opts, 0, sizeof(struct tlsserveropts)); + memset((char *)&sNWTLSOpts, 0, sizeof(struct nwtlsopts)); + + + ulFlag = SO_TLS_ENABLE; + rcode = WSAIoctl(socketHnd, SO_TLS_SET_FLAGS, &ulFlag, sizeof(unsigned long), NULL, 0, NULL, NULL, NULL); + if(rcode) + { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server, + "Error: %d with WSAIoctl(SO_TLS_SET_FLAGS, SO_TLS_ENABLE)", WSAGetLastError()); + goto ERR; + } + + + ulFlag = SO_TLS_SERVER; + rcode = WSAIoctl(socketHnd, SO_TLS_SET_FLAGS, &ulFlag, sizeof(unsigned long),NULL, 0, NULL, NULL, NULL); + + if(rcode) + { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server, + "Error: %d with WSAIoctl(SO_TLS_SET_FLAGS, SO_TLS_SERVER)", WSAGetLastError()); + goto ERR; + } + + loc2uni(UNI_LOCAL_DEFAULT, SASKey, key, 0, 0); + + //setup the tlsserveropts struct + sWS2Opts.wallet = SASKey; + sWS2Opts.walletlen = unilen(SASKey); + sWS2Opts.sidtimeout = 0; + sWS2Opts.sidentries = 0; + sWS2Opts.siddir = NULL; + sWS2Opts.options = &sNWTLSOpts; + + //setup the nwtlsopts structure + + sNWTLSOpts.walletProvider = WAL_PROV_KMO; + sNWTLSOpts.keysList = NULL; + sNWTLSOpts.numElementsInKeyList = 0; + sNWTLSOpts.reservedforfutureuse = NULL; + sNWTLSOpts.reservedforfutureCRL = NULL; + sNWTLSOpts.reservedforfutureCRLLen = 0; + sNWTLSOpts.reserved1 = NULL; + sNWTLSOpts.reserved2 = NULL; + sNWTLSOpts.reserved3 = NULL; + + + rcode = WSAIoctl(socketHnd, + SO_TLS_SET_SERVER, + &sWS2Opts, + sizeof(struct tlsserveropts), + NULL, + 0, + NULL, + NULL, + NULL); + if(SOCKET_ERROR == rcode) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server, + "Error: %d with WSAIoctl(SO_TLS_SET_SERVER)", WSAGetLastError()); + goto ERR; + } + +ERR: + return rcode; +} + +static const char *set_secure_listener(cmd_parms *cmd, void *dummy, + const char *ips, const char* key, + const char* mutual) +{ + NWSSLSrvConfigRec* sc = get_nwssl_cfg(cmd->server); + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + char *ports, *addr; + unsigned short port; + seclisten_rec *new; + + + if (err != NULL) + return err; + + ports = strchr(ips, ':'); + + if (ports != NULL) { + if (ports == ips) + return "Missing IP address"; + else if (ports[1] == '\0') + return "Address must end in :"; + + *(ports++) = '\0'; + } + else { + ports = (char*)ips; + } + + new = apr_pcalloc(cmd->pool, sizeof(seclisten_rec)); + new->local_addr.sin_family = AF_INET; + + if (ports == ips) { + new->local_addr.sin_addr.s_addr = htonl(INADDR_ANY); + addr = apr_pstrdup(cmd->pool, "0.0.0.0"); + } + else { + new->local_addr.sin_addr.s_addr = parse_addr(ips, NULL); + addr = apr_pstrdup(cmd->pool, ips); + } + + port = atoi(ports); + + if (!port) + return "Port must be numeric"; + + apr_table_add(sc->sltable, ports, addr); + + new->local_addr.sin_port = htons(port); + new->fd = -1; + new->used = 0; + new->next = ap_seclisteners; + strcpy(new->key, key); + new->mutual = (mutual) ? 1 : 0; + new->addr = addr; + new->port = port; + ap_seclisteners = new; + return NULL; +} + +static const char *set_secure_upgradeable_listener(cmd_parms *cmd, void *dummy, + const char *ips, const char* key) +{ + NWSSLSrvConfigRec* sc = get_nwssl_cfg(cmd->server); + seclistenup_rec *listen_node; + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + char *ports, *addr; + unsigned short port; + seclistenup_rec *new; + + if (err != NULL) + return err; + + ports = strchr(ips, ':'); + + if (ports != NULL) { + if (ports == ips) + return "Missing IP address"; + else if (ports[1] == '\0') + return "Address must end in :"; + + *(ports++) = '\0'; + } + else { + ports = (char*)ips; + } + + if (ports == ips) { + addr = apr_pstrdup(cmd->pool, "0.0.0.0"); + } + else { + addr = apr_pstrdup(cmd->pool, ips); + } + + port = atoi(ports); + + if (!port) + return "Port must be numeric"; + + apr_table_set(sc->slutable, ports, addr); + + new = apr_pcalloc(cmd->pool, sizeof(seclistenup_rec)); + new->next = ap_seclistenersup; + strcpy(new->key, key); + new->addr = addr; + new->port = port; + ap_seclistenersup = new; + + return err; +} + +static apr_status_t nwssl_socket_cleanup(void *data) +{ + ap_listen_rec* slr = (ap_listen_rec*)data; + ap_listen_rec* lr; + + /* Remove our secure listener from the listener list */ + for (lr = ap_listeners; lr; lr = lr->next) { + /* slr is at the head of the list */ + if (lr == slr) { + ap_listeners = slr->next; + break; + } + /* slr is somewhere in between or at the end*/ + if (lr->next == slr) { + lr->next = slr->next; + break; + } + } + return APR_SUCCESS; +} + +static const char *set_trusted_certs(cmd_parms *cmd, void *dummy, char *arg) +{ + char **ptr = (char **)apr_array_push(certlist); + + *ptr = apr_pstrdup(cmd->pool, arg); + return NULL; +} + +static int nwssl_pre_config(apr_pool_t *pconf, apr_pool_t *plog, + apr_pool_t *ptemp) +{ + ap_seclisteners = NULL; + ap_seclistenersup = NULL; + certlist = apr_array_make(pconf, 1, sizeof(char *)); + + return OK; +} + +static int nwssl_pre_connection(conn_rec *c, void *csd) +{ + + if (apr_table_get(c->notes, "nwconv-ssl")) { + convert_secure_socket(c, (apr_socket_t*)csd); + } + else { + secsocket_data *csd_data = apr_palloc(c->pool, sizeof(secsocket_data)); + + csd_data->csd = (apr_socket_t*)csd; + csd_data->is_secure = 0; + ap_set_module_config(c->conn_config, &nwssl_module, (void*)csd_data); + } + + return OK; +} + +static int nwssl_post_config(apr_pool_t *pconf, apr_pool_t *plog, + apr_pool_t *ptemp, server_rec *s) +{ + seclisten_rec* sl; + ap_listen_rec* lr; + apr_socket_t* sd; + apr_status_t status; + seclistenup_rec *slu; + int found; + + for (sl = ap_seclisteners; sl != NULL; sl = sl->next) { + sl->fd = find_secure_listener(sl); + + if (sl->fd < 0) + sl->fd = make_secure_socket(pconf, &sl->local_addr, sl->key, sl->mutual, s); + + if (sl->fd >= 0) { + apr_os_sock_info_t sock_info; + + sock_info.os_sock = &(sl->fd); + sock_info.local = (struct sockaddr*)&(sl->local_addr); + sock_info.remote = NULL; + sock_info.family = APR_INET; + sock_info.type = SOCK_STREAM; + + apr_os_sock_make(&sd, &sock_info, pconf); + + lr = apr_pcalloc(pconf, sizeof(ap_listen_rec)); + + if (lr) { + lr->sd = sd; + if ((status = apr_sockaddr_info_get(&lr->bind_addr, sl->addr, APR_UNSPEC, sl->port, 0, + pconf)) != APR_SUCCESS) { + ap_log_perror(APLOG_MARK, APLOG_CRIT, status, pconf, + "alloc_listener: failed to set up sockaddr for %s:%d", sl->addr, sl->port); + return HTTP_INTERNAL_SERVER_ERROR; + } + lr->next = ap_listeners; + ap_listeners = lr; + apr_pool_cleanup_register(pconf, lr, nwssl_socket_cleanup, apr_pool_cleanup_null); + } + } else { + return HTTP_INTERNAL_SERVER_ERROR; + } + } + + for (slu = ap_seclistenersup; slu; slu = slu->next) { + /* Check the listener list for a matching upgradeable listener */ + found = 0; + for (lr = ap_listeners; lr; lr = lr->next) { + if (slu->port == lr->bind_addr->port) { + found = 1; + break; + } + } + if (!found) { + ap_log_perror(APLOG_MARK, APLOG_WARNING, 0, plog, + "No Listen directive found for upgradeable listener %s:%d", slu->addr, slu->port); + } + } + + build_cert_list(pconf); + + return OK; +} + +static void *nwssl_config_server_create(apr_pool_t *p, server_rec *s) +{ + NWSSLSrvConfigRec *new = apr_palloc(p, sizeof(NWSSLSrvConfigRec)); + new->sltable = apr_table_make(p, 5); + new->slutable = apr_table_make(p, 5); + return new; +} + +static void *nwssl_config_server_merge(apr_pool_t *p, void *basev, void *addv) +{ + NWSSLSrvConfigRec *base = (NWSSLSrvConfigRec *)basev; + NWSSLSrvConfigRec *add = (NWSSLSrvConfigRec *)addv; + NWSSLSrvConfigRec *merged = (NWSSLSrvConfigRec *)apr_palloc(p, sizeof(NWSSLSrvConfigRec)); + return merged; +} + +static int compare_ipports(void *rec, const char *key, const char *value) +{ + conn_rec *c = (conn_rec*)rec; + + if (value && + ((strcmp(value, "0.0.0.0") == 0) || (strcmp(value, c->local_ip) == 0))) + { + return 0; + } + return 1; +} + +static int isSecureConnEx (const server_rec *s, const conn_rec *c, const apr_table_t *t) +{ + char port[8]; + + itoa((c->local_addr)->port, port, 10); + if (!apr_table_do(compare_ipports, (void*)c, t, port, NULL)) + { + return 1; + } + + return 0; +} + +static int isSecureConn (const server_rec *s, const conn_rec *c) +{ + NWSSLSrvConfigRec *sc = get_nwssl_cfg(s); + + return isSecureConnEx (s, c, sc->sltable); +} + +static int isSecureConnUpgradeable (const server_rec *s, const conn_rec *c) +{ + NWSSLSrvConfigRec *sc = get_nwssl_cfg(s); + + return isSecureConnEx (s, c, sc->slutable); +} + +static int isSecure (const request_rec *r) +{ + return isSecureConn (r->server, r->connection); +} + +static int isSecureUpgradeable (const request_rec *r) +{ + return isSecureConnUpgradeable (r->server, r->connection); +} + +static int isSecureUpgraded (const request_rec *r) +{ + secsocket_data *csd_data = (secsocket_data*)ap_get_module_config(r->connection->conn_config, &nwssl_module); + + return csd_data->is_secure; +} + +static int nwssl_hook_Fixup(request_rec *r) +{ + int i; + + if (!isSecure(r) && !isSecureUpgraded(r)) + return DECLINED; + + apr_table_set(r->subprocess_env, "HTTPS", "on"); + + return DECLINED; +} + +static const char *nwssl_hook_http_method (const request_rec *r) +{ + if (isSecure(r) && !isSecureUpgraded(r)) + return "https"; + + return NULL; +} + +static apr_port_t nwssl_hook_default_port(const request_rec *r) +{ + if (isSecure(r)) + return DEFAULT_HTTPS_PORT; + + return 0; +} + +int ssl_proxy_enable(conn_rec *c) +{ + apr_table_set(c->notes, "nwconv-ssl", "Y"); + + return 1; +} + +int ssl_engine_disable(conn_rec *c) +{ + return 1; +} + +static int ssl_is_https(conn_rec *c) +{ + secsocket_data *csd_data = (secsocket_data*)ap_get_module_config(c->conn_config, &nwssl_module); + + return isSecureConn (c->base_server, c) || (csd_data && csd_data->is_secure); +} + +/* This function must remain safe to use for a non-SSL connection. */ +char *ssl_var_lookup(apr_pool_t *p, server_rec *s, conn_rec *c, request_rec *r, char *var) +{ + NWSSLSrvConfigRec *mc = get_nwssl_cfg(s); + const char *result; + BOOL resdup; + apr_time_exp_t tm; + + result = NULL; + resdup = TRUE; + + /* + * When no pool is given try to find one + */ + if (p == NULL) { + if (r != NULL) + p = r->pool; + else if (c != NULL) + p = c->pool; + else + p = mc->pPool; + } + + /* + * Request dependent stuff + */ + if (r != NULL) { + switch (var[0]) { + case 'H': + case 'h': + if (strcEQ(var, "HTTP_USER_AGENT")) + result = apr_table_get(r->headers_in, "User-Agent"); + else if (strcEQ(var, "HTTP_REFERER")) + result = apr_table_get(r->headers_in, "Referer"); + else if (strcEQ(var, "HTTP_COOKIE")) + result = apr_table_get(r->headers_in, "Cookie"); + else if (strcEQ(var, "HTTP_FORWARDED")) + result = apr_table_get(r->headers_in, "Forwarded"); + else if (strcEQ(var, "HTTP_HOST")) + result = apr_table_get(r->headers_in, "Host"); + else if (strcEQ(var, "HTTP_PROXY_CONNECTION")) + result = apr_table_get(r->headers_in, "Proxy-Connection"); + else if (strcEQ(var, "HTTP_ACCEPT")) + result = apr_table_get(r->headers_in, "Accept"); + else if (strcEQ(var, "HTTPS")) { + if (isSecure(r) || isSecureUpgraded(r)) + result = "on"; + else + result = "off"; + } + else if (strlen(var) > 5 && strcEQn(var, "HTTP:", 5)) + /* all other headers from which we are still not know about */ + result = apr_table_get(r->headers_in, var+5); + break; + + case 'R': + case 'r': + if (strcEQ(var, "REQUEST_METHOD")) + result = r->method; + else if (strcEQ(var, "REQUEST_SCHEME")) + result = ap_http_method(r); + else if (strcEQ(var, "REQUEST_URI")) + result = r->uri; + else if (strcEQ(var, "REQUEST_FILENAME")) + result = r->filename; + else if (strcEQ(var, "REMOTE_HOST")) + result = ap_get_remote_host(r->connection, r->per_dir_config, + REMOTE_NAME, NULL); + else if (strcEQ(var, "REMOTE_IDENT")) + result = ap_get_remote_logname(r); + else if (strcEQ(var, "REMOTE_USER")) + result = r->user; + break; + + case 'S': + case 's': + if (strcEQn(var, "SSL", 3)) break; /* shortcut common case */ + + if (strcEQ(var, "SERVER_ADMIN")) + result = r->server->server_admin; + else if (strcEQ(var, "SERVER_NAME")) + result = ap_get_server_name(r); + else if (strcEQ(var, "SERVER_PORT")) + result = apr_psprintf(p, "%u", ap_get_server_port(r)); + else if (strcEQ(var, "SERVER_PROTOCOL")) + result = r->protocol; + else if (strcEQ(var, "SCRIPT_FILENAME")) + result = r->filename; + break; + + default: + if (strcEQ(var, "PATH_INFO")) + result = r->path_info; + else if (strcEQ(var, "QUERY_STRING")) + result = r->args; + else if (strcEQ(var, "IS_SUBREQ")) + result = (r->main != NULL ? "true" : "false"); + else if (strcEQ(var, "DOCUMENT_ROOT")) + result = ap_document_root(r); + else if (strcEQ(var, "AUTH_TYPE")) + result = r->ap_auth_type; + else if (strcEQ(var, "THE_REQUEST")) + result = r->the_request; + break; + } + } + + /* + * Connection stuff + */ + if (result == NULL && c != NULL) { + + /* XXX-Can't get specific SSL info from NetWare */ + /* SSLConnRec *sslconn = myConnConfig(c); + if (strlen(var) > 4 && strcEQn(var, "SSL_", 4) + && sslconn && sslconn->ssl) + result = ssl_var_lookup_ssl(p, c, var+4);*/ + + if (strlen(var) > 4 && strcEQn(var, "SSL_", 4)) + result = NULL; + else if (strcEQ(var, "REMOTE_ADDR")) + result = c->remote_ip; + } + + /* + * Totally independent stuff + */ + if (result == NULL) { + if (strlen(var) > 12 && strcEQn(var, "SSL_VERSION_", 12)) + result = NULL; + /* XXX-Can't get specific SSL info from NetWare */ + /*result = ssl_var_lookup_ssl_version(p, var+12);*/ + else if (strcEQ(var, "SERVER_SOFTWARE")) + result = ap_get_server_version(); + else if (strcEQ(var, "API_VERSION")) { + result = apr_itoa(p, MODULE_MAGIC_NUMBER); + resdup = FALSE; + } + else if (strcEQ(var, "TIME_YEAR")) { + apr_time_exp_lt(&tm, apr_time_now()); + result = apr_psprintf(p, "%02d%02d", + (tm.tm_year / 100) + 19, tm.tm_year % 100); + resdup = FALSE; + } +#define MKTIMESTR(format, tmfield) \ + apr_time_exp_lt(&tm, apr_time_now()); \ + result = apr_psprintf(p, format, tm.tmfield); \ + resdup = FALSE; + else if (strcEQ(var, "TIME_MON")) { + MKTIMESTR("%02d", tm_mon+1) + } + else if (strcEQ(var, "TIME_DAY")) { + MKTIMESTR("%02d", tm_mday) + } + else if (strcEQ(var, "TIME_HOUR")) { + MKTIMESTR("%02d", tm_hour) + } + else if (strcEQ(var, "TIME_MIN")) { + MKTIMESTR("%02d", tm_min) + } + else if (strcEQ(var, "TIME_SEC")) { + MKTIMESTR("%02d", tm_sec) + } + else if (strcEQ(var, "TIME_WDAY")) { + MKTIMESTR("%d", tm_wday) + } + else if (strcEQ(var, "TIME")) { + apr_time_exp_lt(&tm, apr_time_now()); + result = apr_psprintf(p, + "%02d%02d%02d%02d%02d%02d%02d", (tm.tm_year / 100) + 19, + (tm.tm_year % 100), tm.tm_mon+1, tm.tm_mday, + tm.tm_hour, tm.tm_min, tm.tm_sec); + resdup = FALSE; + } + /* all other env-variables from the parent Apache process */ + else if (strlen(var) > 4 && strcEQn(var, "ENV:", 4)) { + result = apr_table_get(r->notes, var+4); + if (result == NULL) + result = apr_table_get(r->subprocess_env, var+4); + if (result == NULL) + result = getenv(var+4); + } + } + + if (result != NULL && resdup) + result = apr_pstrdup(p, result); + if (result == NULL) + result = ""; + return (char *)result; +} + +static apr_status_t ssl_io_filter_Upgrade(ap_filter_t *f, + apr_bucket_brigade *bb) + +{ +#define SWITCH_STATUS_LINE "HTTP/1.1 101 Switching Protocols" +#define UPGRADE_HEADER "Upgrade: TLS/1.0, HTTP/1.1" +#define CONNECTION_HEADER "Connection: Upgrade" + const char *upgrade; + const char *connection; + apr_bucket_brigade *upgradebb; + request_rec *r = f->r; + apr_socket_t *csd = NULL; + char *key; + unicode_t keyFileName[512]; + int ret; + char *token_string; + char *token; + char *token_state; + secsocket_data *csd_data; + + /* Just remove the filter, if it doesn't work the first time, it won't + * work at all for this request. + */ + ap_remove_output_filter(f); + + /* No need to ensure that this is a server with optional SSL, the filter + * is only inserted if that is true. + */ + + upgrade = apr_table_get(r->headers_in, "Upgrade"); + if (upgrade == NULL) { + return ap_pass_brigade(f->next, bb); + } + token_string = apr_pstrdup(r->pool,upgrade); + token = apr_strtok(token_string,", ",&token_state); + while (token && strcmp(token,"TLS/1.0")) { + apr_strtok(NULL,", ",&token_state); + } + // "Upgrade: TLS/1.0" header not found, don't do Upgrade + if (!token) { + return ap_pass_brigade(f->next, bb); + } + + connection = apr_table_get(r->headers_in, "Connection"); + token_string = apr_pstrdup(r->pool,connection); + token = apr_strtok(token_string,",",&token_state); + while (token && strcmp(token,"Upgrade")) { + apr_strtok(NULL,",",&token_state); + } + // "Connection: Upgrade" header not found, don't do Upgrade + if (!token) { + return ap_pass_brigade(f->next, bb); + } + + apr_table_unset(r->headers_out, "Upgrade"); + + if (r) { + csd_data = (secsocket_data*)ap_get_module_config(r->connection->conn_config, &nwssl_module); + csd = csd_data->csd; + } + else { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server, + "Unable to get upgradeable socket handle"); + return ap_pass_brigade(f->next, bb); + } + + + if (r->method_number == M_OPTIONS) { + apr_bucket *b = NULL; + /* This is a mandatory SSL upgrade. */ + + upgradebb = apr_brigade_create(r->pool, f->c->bucket_alloc); + + ap_fputstrs(f->next, upgradebb, SWITCH_STATUS_LINE, CRLF, + UPGRADE_HEADER, CRLF, CONNECTION_HEADER, CRLF, CRLF, NULL); + + b = apr_bucket_flush_create(f->c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(upgradebb, b); + ap_pass_brigade(f->next, upgradebb); + } + else { + /* This is optional, and should be configurable, for now don't bother + * doing anything. + */ + return ap_pass_brigade(f->next, bb); + } + + key = get_port_key(r->connection); + + if (csd && key) { + int sockdes; + apr_os_sock_get(&sockdes, csd); + + + ret = SSLize_Socket(sockdes, key, r); + if (!ret) { + csd_data->is_secure = 1; + } + } + else { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server, + "Upgradeable socket handle not found"); + return ap_pass_brigade(f->next, bb); + } + + ap_log_error(APLOG_MARK, APLOG_INFO, 0, r->server, + "Awaiting re-negotiation handshake"); + + return ap_pass_brigade(f->next, bb); +} + +static void ssl_hook_Insert_Filter(request_rec *r) +{ + NWSSLSrvConfigRec *sc = get_nwssl_cfg(r->server); + + if (isSecureUpgradeable (r)) { + ap_add_output_filter("UPGRADE_FILTER", NULL, r, r->connection); + } +} + +static const command_rec nwssl_module_cmds[] = +{ + AP_INIT_TAKE23("SecureListen", set_secure_listener, NULL, RSRC_CONF, + "specify an address and/or port with a key pair name.\n" + "Optional third parameter of MUTUAL configures the port for mutual authentication."), + AP_INIT_TAKE2("NWSSLUpgradeable", set_secure_upgradeable_listener, NULL, RSRC_CONF, + "specify an address and/or port with a key pair name, that can be upgraded to an SSL connection.\n" + "The address and/or port must have already be defined using a Listen directive."), + AP_INIT_ITERATE("NWSSLTrustedCerts", set_trusted_certs, NULL, RSRC_CONF, + "Adds trusted certificates that are used to create secure connections to proxied servers"), + {NULL} +}; + +static void register_hooks(apr_pool_t *p) +{ + ap_register_output_filter ("UPGRADE_FILTER", ssl_io_filter_Upgrade, NULL, AP_FTYPE_PROTOCOL + 5); + + ap_hook_pre_config(nwssl_pre_config, NULL, NULL, APR_HOOK_MIDDLE); + ap_hook_pre_connection(nwssl_pre_connection, NULL, NULL, APR_HOOK_MIDDLE); + ap_hook_post_config(nwssl_post_config, NULL, NULL, APR_HOOK_MIDDLE); + ap_hook_fixups(nwssl_hook_Fixup, NULL, NULL, APR_HOOK_MIDDLE); + ap_hook_http_method(nwssl_hook_http_method, NULL,NULL, APR_HOOK_MIDDLE); + ap_hook_default_port (nwssl_hook_default_port, NULL,NULL, APR_HOOK_MIDDLE); + ap_hook_insert_filter (ssl_hook_Insert_Filter, NULL,NULL, APR_HOOK_MIDDLE); + + APR_REGISTER_OPTIONAL_FN(ssl_is_https); + APR_REGISTER_OPTIONAL_FN(ssl_var_lookup); + + APR_REGISTER_OPTIONAL_FN(ssl_proxy_enable); + APR_REGISTER_OPTIONAL_FN(ssl_engine_disable); +} + +module AP_MODULE_DECLARE_DATA nwssl_module = +{ + STANDARD20_MODULE_STUFF, + NULL, /* dir config creater */ + NULL, /* dir merger --- default is to override */ + nwssl_config_server_create, /* server config */ + nwssl_config_server_merge, /* merge server config */ + nwssl_module_cmds, /* command apr_table_t */ + register_hooks +}; + diff --git a/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_proxy.def b/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_proxy.def new file mode 100644 index 00000000..ab02a53c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_proxy.def @@ -0,0 +1,6 @@ +EXPORT proxy_module +EXPORT proxy_hook_scheme_handler +EXPORT proxy_hook_canon_handler +EXPORT ap_proxy_ssl_enable +EXPORT ap_proxy_ssl_disable +EXPORT proxy_run_fixups diff --git a/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_proxy_connect.def b/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_proxy_connect.def new file mode 100644 index 00000000..13611140 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_proxy_connect.def @@ -0,0 +1,4 @@ +EXPORT proxy_connect_module +IMPORT proxy_module +IMPORT proxy_hook_scheme_handler +IMPORT proxy_hook_canon_handler diff --git a/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_proxy_ftp.def b/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_proxy_ftp.def new file mode 100644 index 00000000..f2dba7d6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_proxy_ftp.def @@ -0,0 +1,4 @@ +EXPORT proxy_ftp_module +IMPORT proxy_module +IMPORT proxy_hook_scheme_handler +IMPORT proxy_hook_canon_handler diff --git a/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_proxy_http.def b/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_proxy_http.def new file mode 100644 index 00000000..b24358b1 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_proxy_http.def @@ -0,0 +1,7 @@ +EXPORT proxy_http_module +IMPORT proxy_module +IMPORT proxy_hook_scheme_handler +IMPORT proxy_run_fixups +IMPORT proxy_hook_canon_handler +IMPORT ap_proxy_ssl_enable +IMPORT ap_proxy_ssl_disable diff --git a/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_rewrite.def b/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_rewrite.def new file mode 100644 index 00000000..cfdcf6b1 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_rewrite.def @@ -0,0 +1 @@ +EXPORT rewrite_module diff --git a/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_speling.def b/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_speling.def new file mode 100644 index 00000000..3d45a6aa --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_speling.def @@ -0,0 +1 @@ +EXPORT speling_module diff --git a/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_status.def b/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_status.def new file mode 100644 index 00000000..9a5a32d4 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_status.def @@ -0,0 +1,2 @@ +EXPORT status_module + diff --git a/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_unique_id.def b/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_unique_id.def new file mode 100644 index 00000000..0b72c1ec --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_unique_id.def @@ -0,0 +1 @@ +EXPORT unique_id_module diff --git a/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_usertrack.def b/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_usertrack.def new file mode 100644 index 00000000..7264c41e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_usertrack.def @@ -0,0 +1 @@ +EXPORT usertrack_module diff --git a/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_vhost_alias.def b/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_vhost_alias.def new file mode 100644 index 00000000..574b85f9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/arch/netware/mod_vhost_alias.def @@ -0,0 +1,2 @@ +EXPORT vhost_alias_module + diff --git a/rubbos/app/httpd-2.0.64/modules/arch/netware/moddavfs.def b/rubbos/app/httpd-2.0.64/modules/arch/netware/moddavfs.def new file mode 100644 index 00000000..67ec3117 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/arch/netware/moddavfs.def @@ -0,0 +1 @@ +EXPORT dav_fs_module diff --git a/rubbos/app/httpd-2.0.64/modules/arch/win32/.deps b/rubbos/app/httpd-2.0.64/modules/arch/win32/.deps new file mode 100644 index 00000000..e69de29b diff --git a/rubbos/app/httpd-2.0.64/modules/arch/win32/Makefile b/rubbos/app/httpd-2.0.64/modules/arch/win32/Makefile new file mode 100644 index 00000000..7886ef35 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/arch/win32/Makefile @@ -0,0 +1,8 @@ +top_srcdir = /bottlenecks/rubbos/app/httpd-2.0.64 +top_builddir = /bottlenecks/rubbos/app/httpd-2.0.64 +srcdir = /bottlenecks/rubbos/app/httpd-2.0.64/modules/arch/win32 +builddir = /bottlenecks/rubbos/app/httpd-2.0.64/modules/arch/win32 +VPATH = /bottlenecks/rubbos/app/httpd-2.0.64/modules/arch/win32 +# a modules Makefile has no explicit targets -- they will be defined by +# whatever modules are enabled. just grab special.mk to deal with this. +include $(top_srcdir)/build/special.mk diff --git a/rubbos/app/httpd-2.0.64/modules/arch/win32/Makefile.in b/rubbos/app/httpd-2.0.64/modules/arch/win32/Makefile.in new file mode 100644 index 00000000..7c5c149d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/arch/win32/Makefile.in @@ -0,0 +1,3 @@ +# a modules Makefile has no explicit targets -- they will be defined by +# whatever modules are enabled. just grab special.mk to deal with this. +include $(top_srcdir)/build/special.mk diff --git a/rubbos/app/httpd-2.0.64/modules/arch/win32/config.m4 b/rubbos/app/httpd-2.0.64/modules/arch/win32/config.m4 new file mode 100644 index 00000000..25f7a850 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/arch/win32/config.m4 @@ -0,0 +1,11 @@ +dnl modules enabled in this directory by default + +dnl APACHE_MODULE(name, helptext[, objects[, structname[, default[, config]]]]) + +APACHE_MODPATH_INIT(arch/win32) + +APACHE_MODULE(isapi, isapi extension support, , , no) + +APR_ADDTO(LT_LDFLAGS,-export-dynamic) + +APACHE_MODPATH_FINISH diff --git a/rubbos/app/httpd-2.0.64/modules/arch/win32/mod_isapi.c b/rubbos/app/httpd-2.0.64/modules/arch/win32/mod_isapi.c new file mode 100644 index 00000000..859d5670 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/arch/win32/mod_isapi.c @@ -0,0 +1,1760 @@ +/* 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. + */ + +/* + * mod_isapi.c - Internet Server Application (ISA) module for Apache + * by Alexei Kosut , significant overhauls and + * redesign by William Rowe , and hints from many + * other developer/users who have hit on specific flaws. + * + * This module implements the ISAPI Handler architecture, allowing + * Apache to load Internet Server Applications (ISAPI extensions), + * similar to the support in IIS, Zope, O'Reilly's WebSite and others. + * + * It is a complete implementation of the ISAPI 2.0 specification, + * except for "Microsoft extensions" to the API which provide + * asynchronous I/O. It is further extended to include additional + * "Microsoft extentions" through IIS 5.0, with some deficiencies + * where one-to-one mappings don't exist. + * + * Refer to /manual/mod/mod_isapi.html for additional details on + * configuration and use, but check this source for specific support + * of the API, + */ + +#include "ap_config.h" +#include "httpd.h" +#include "http_config.h" +#include "http_core.h" +#include "http_protocol.h" +#include "http_request.h" +#include "http_log.h" +#include "util_script.h" +#include "mod_core.h" +#include "apr_lib.h" +#include "apr_strings.h" +#include "apr_portable.h" +#include "apr_buckets.h" +#include "apr_thread_mutex.h" +#include "apr_thread_rwlock.h" +#include "apr_hash.h" +#include "mod_isapi.h" + +/* Retry frequency for a failed-to-load isapi .dll */ +#define ISAPI_RETRY apr_time_from_sec(30) + +/********************************************************** + * + * ISAPI Module Configuration + * + **********************************************************/ + +module AP_MODULE_DECLARE_DATA isapi_module; + +#define ISAPI_UNDEF -1 + +/* Our isapi per-dir config structure */ +typedef struct isapi_dir_conf { + int read_ahead_buflen; + int log_unsupported; + int log_to_errlog; + int log_to_query; + int fake_async; +} isapi_dir_conf; + +typedef struct isapi_loaded isapi_loaded; + +apr_status_t isapi_lookup(apr_pool_t *p, server_rec *s, request_rec *r, + const char *fpath, isapi_loaded** isa); + +static void *create_isapi_dir_config(apr_pool_t *p, char *dummy) +{ + isapi_dir_conf *dir = apr_palloc(p, sizeof(isapi_dir_conf)); + + dir->read_ahead_buflen = ISAPI_UNDEF; + dir->log_unsupported = ISAPI_UNDEF; + dir->log_to_errlog = ISAPI_UNDEF; + dir->log_to_query = ISAPI_UNDEF; + dir->fake_async = ISAPI_UNDEF; + + return dir; +} + +static void *merge_isapi_dir_configs(apr_pool_t *p, void *base_, void *add_) +{ + isapi_dir_conf *base = (isapi_dir_conf *) base_; + isapi_dir_conf *add = (isapi_dir_conf *) add_; + isapi_dir_conf *dir = apr_palloc(p, sizeof(isapi_dir_conf)); + + dir->read_ahead_buflen = (add->read_ahead_buflen == ISAPI_UNDEF) + ? base->read_ahead_buflen + : add->read_ahead_buflen; + dir->log_unsupported = (add->log_unsupported == ISAPI_UNDEF) + ? base->log_unsupported + : add->log_unsupported; + dir->log_to_errlog = (add->log_to_errlog == ISAPI_UNDEF) + ? base->log_to_errlog + : add->log_to_errlog; + dir->log_to_query = (add->log_to_query == ISAPI_UNDEF) + ? base->log_to_query + : add->log_to_query; + dir->fake_async = (add->fake_async == ISAPI_UNDEF) + ? base->fake_async + : add->fake_async; + + return dir; +} + +static const char *isapi_cmd_cachefile(cmd_parms *cmd, void *dummy, + const char *filename) +{ + isapi_loaded *isa; + apr_finfo_t tmp; + apr_status_t rv; + char *fspec; + + /* ### Just an observation ... it would be terribly cool to be + * able to use this per-dir, relative to the directory block being + * defined. The hash result remains global, but shorthand of + * + * ISAPICacheFile myapp.dll anotherapp.dll thirdapp.dll + * + * would be very convienent. + */ + fspec = ap_server_root_relative(cmd->pool, filename); + if (!fspec) { + ap_log_error(APLOG_MARK, APLOG_WARNING, APR_EBADPATH, cmd->server, + "ISAPI: invalid module path, skipping %s", filename); + return NULL; + } + if ((rv = apr_stat(&tmp, fspec, APR_FINFO_TYPE, + cmd->temp_pool)) != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_WARNING, rv, cmd->server, + "ISAPI: unable to stat, skipping %s", fspec); + return NULL; + } + if (tmp.filetype != APR_REG) { + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, cmd->server, + "ISAPI: not a regular file, skipping %s", fspec); + return NULL; + } + + /* Load the extention as cached (with null request_rec) */ + rv = isapi_lookup(cmd->pool, cmd->server, NULL, fspec, &isa); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_WARNING, rv, cmd->server, + "ISAPI: unable to cache, skipping %s", fspec); + return NULL; + } + + return NULL; +} + +static const command_rec isapi_cmds[] = { + AP_INIT_TAKE1("ISAPIReadAheadBuffer", ap_set_int_slot, + (void *)APR_OFFSETOF(isapi_dir_conf, read_ahead_buflen), + OR_FILEINFO, "Maximum client request body to initially pass to the" + " ISAPI handler (default: 49152)"), + AP_INIT_FLAG("ISAPILogNotSupported", ap_set_flag_slot, + (void *)APR_OFFSETOF(isapi_dir_conf, log_unsupported), + OR_FILEINFO, "Log requests not supported by the ISAPI server" + " on or off (default: off)"), + AP_INIT_FLAG("ISAPIAppendLogToErrors", ap_set_flag_slot, + (void *)APR_OFFSETOF(isapi_dir_conf, log_to_errlog), + OR_FILEINFO, "Send all Append Log requests to the error log" + " on or off (default: off)"), + AP_INIT_FLAG("ISAPIAppendLogToQuery", ap_set_flag_slot, + (void *)APR_OFFSETOF(isapi_dir_conf, log_to_query), + OR_FILEINFO, "Append Log requests are concatinated to the query args" + " on or off (default: on)"), + AP_INIT_FLAG("ISAPIFakeAsync", ap_set_flag_slot, + (void *)APR_OFFSETOF(isapi_dir_conf, fake_async), + OR_FILEINFO, "Fake Asynchronous support for isapi callbacks" + " on or off [Experimental] (default: off)"), + AP_INIT_ITERATE("ISAPICacheFile", isapi_cmd_cachefile, NULL, + RSRC_CONF, "Cache the specified ISAPI extension in-process"), + {NULL} +}; + +/********************************************************** + * + * ISAPI Module Cache handling section + * + **********************************************************/ + +/* Our isapi global config values */ +static struct isapi_global_conf { + apr_pool_t *pool; + apr_thread_mutex_t *lock; + apr_hash_t *hash; +} loaded; + +/* Our loaded isapi module description structure */ +struct isapi_loaded { + const char *filename; + apr_thread_rwlock_t *in_progress; + apr_status_t last_load_rv; + apr_time_t last_load_time; + apr_dso_handle_t *handle; + HSE_VERSION_INFO *isapi_version; + apr_uint32_t report_version; + apr_uint32_t timeout; + PFN_GETEXTENSIONVERSION GetExtensionVersion; + PFN_HTTPEXTENSIONPROC HttpExtensionProc; + PFN_TERMINATEEXTENSION TerminateExtension; +}; + +static apr_status_t isapi_unload(isapi_loaded *isa, int force) +{ + /* All done with the DLL... get rid of it... + * + * If optionally cached, and we weren't asked to force the unload, + * pass HSE_TERM_ADVISORY_UNLOAD, and if it returns 1, unload, + * otherwise, leave it alone (it didn't choose to cooperate.) + */ + if (!isa->handle) { + return APR_SUCCESS; + } + if (isa->TerminateExtension) { + if (force) { + (*isa->TerminateExtension)(HSE_TERM_MUST_UNLOAD); + } + else if (!(*isa->TerminateExtension)(HSE_TERM_ADVISORY_UNLOAD)) { + return APR_EGENERAL; + } + } + apr_dso_unload(isa->handle); + isa->handle = NULL; + return APR_SUCCESS; +} + +static apr_status_t cleanup_isapi(void *isa_) +{ + isapi_loaded* isa = (isapi_loaded*) isa_; + + /* We must force the module to unload, we are about + * to lose the isapi structure's allocation entirely. + */ + return isapi_unload(isa, 1); +} + +static apr_status_t isapi_load(apr_pool_t *p, server_rec *s, isapi_loaded *isa) +{ + apr_status_t rv; + + isa->isapi_version = apr_pcalloc(p, sizeof(HSE_VERSION_INFO)); + + /* TODO: These aught to become overrideable, so that we + * assure a given isapi can be fooled into behaving well. + * + * The tricky bit, they aren't really a per-dir sort of + * config, they will always be constant across every + * reference to the .dll no matter what context (vhost, + * location, etc) they apply to. + */ + isa->report_version = 0x500; /* Revision 5.0 */ + isa->timeout = 300 * 1000000; /* microsecs, not used */ + + rv = apr_dso_load(&isa->handle, isa->filename, p); + if (rv) + { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, s, + "ISAPI: failed to load %s", isa->filename); + isa->handle = NULL; + return rv; + } + + rv = apr_dso_sym((void**)&isa->GetExtensionVersion, isa->handle, + "GetExtensionVersion"); + if (rv) + { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, s, + "ISAPI: missing GetExtensionVersion() in %s", + isa->filename); + apr_dso_unload(isa->handle); + isa->handle = NULL; + return rv; + } + + rv = apr_dso_sym((void**)&isa->HttpExtensionProc, isa->handle, + "HttpExtensionProc"); + if (rv) + { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, s, + "ISAPI: missing HttpExtensionProc() in %s", + isa->filename); + apr_dso_unload(isa->handle); + isa->handle = NULL; + return rv; + } + + /* TerminateExtension() is an optional interface */ + rv = apr_dso_sym((void**)&isa->TerminateExtension, isa->handle, + "TerminateExtension"); + apr_set_os_error(0); + + /* Run GetExtensionVersion() */ + if (!(isa->GetExtensionVersion)(isa->isapi_version)) { + apr_status_t rv = apr_get_os_error(); + ap_log_error(APLOG_MARK, APLOG_ERR, rv, s, + "ISAPI: failed call to GetExtensionVersion() in %s", + isa->filename); + apr_dso_unload(isa->handle); + isa->handle = NULL; + return rv; + } + + apr_pool_cleanup_register(p, isa, cleanup_isapi, + apr_pool_cleanup_null); + + return APR_SUCCESS; +} + +apr_status_t isapi_lookup(apr_pool_t *p, server_rec *s, request_rec *r, + const char *fpath, isapi_loaded** isa) +{ + apr_status_t rv; + const char *key; + + if ((rv = apr_thread_mutex_lock(loaded.lock)) != APR_SUCCESS) { + return rv; + } + + *isa = apr_hash_get(loaded.hash, fpath, APR_HASH_KEY_STRING); + + if (*isa) { + + /* If we find this lock exists, use a set-aside copy of gainlock + * to avoid race conditions on NULLing the in_progress variable + * when the load has completed. Release the global isapi hash + * lock so other requests can proceed, then rdlock for completion + * of loading our desired dll or wrlock if we would like to retry + * loading the dll (because last_load_rv failed and retry is up.) + */ + apr_thread_rwlock_t *gainlock = (*isa)->in_progress; + + /* gainlock is NULLed after the module loads successfully. + * This free-threaded module can be used without any locking. + */ + if (!gainlock) { + rv = (*isa)->last_load_rv; + apr_thread_mutex_unlock(loaded.lock); + return rv; + } + + + if ((*isa)->last_load_rv == APR_SUCCESS) { + apr_thread_mutex_unlock(loaded.lock); + if ((rv = apr_thread_rwlock_rdlock(gainlock)) + != APR_SUCCESS) { + return rv; + } + rv = (*isa)->last_load_rv; + apr_thread_rwlock_unlock(gainlock); + return rv; + } + + if (apr_time_now() > (*isa)->last_load_time + ISAPI_RETRY) { + + /* Remember last_load_time before releasing the global + * hash lock to avoid colliding with another thread + * that hit this exception at the same time as our + * retry attempt, since we unlock the global mutex + * before attempting a write lock for this module. + */ + apr_time_t check_time = (*isa)->last_load_time; + apr_thread_mutex_unlock(loaded.lock); + + if ((rv = apr_thread_rwlock_wrlock(gainlock)) + != APR_SUCCESS) { + return rv; + } + + /* If last_load_time is unchanged, we still own this + * retry, otherwise presume another thread provided + * our retry (for good or ill). Relock the global + * hash for updating last_load_ vars, so their update + * is always atomic to the global lock. + */ + if (check_time == (*isa)->last_load_time) { + + rv = isapi_load(loaded.pool, s, *isa); + + apr_thread_mutex_lock(loaded.lock); + (*isa)->last_load_rv = rv; + (*isa)->last_load_time = apr_time_now(); + apr_thread_mutex_unlock(loaded.lock); + } + else { + rv = (*isa)->last_load_rv; + } + apr_thread_rwlock_unlock(gainlock); + + return rv; + } + + /* We haven't hit timeup on retry, let's grab the last_rv + * within the hash mutex before unlocking. + */ + rv = (*isa)->last_load_rv; + apr_thread_mutex_unlock(loaded.lock); + + return rv; + } + + /* If the module was not found, it's time to create a hash key entry + * before releasing the hash lock to avoid multiple threads from + * loading the same module. + */ + key = apr_pstrdup(loaded.pool, fpath); + *isa = apr_pcalloc(loaded.pool, sizeof(isapi_loaded)); + (*isa)->filename = key; + if (r) { + /* A mutex that exists only long enough to attempt to + * load this isapi dll, the release this module to all + * other takers that came along during the one-time + * load process. Short lifetime for this lock would + * be great, however, using r->pool is nasty if those + * blocked on the lock haven't all unlocked before we + * attempt to destroy. A nastier race condition than + * I want to deal with at this moment... + */ + apr_thread_rwlock_create(&(*isa)->in_progress, loaded.pool); + apr_thread_rwlock_wrlock((*isa)->in_progress); + } + + apr_hash_set(loaded.hash, key, APR_HASH_KEY_STRING, *isa); + + /* Now attempt to load the isapi on our own time, + * allow other isapi processing to resume. + */ + apr_thread_mutex_unlock(loaded.lock); + + rv = isapi_load(loaded.pool, s, *isa); + (*isa)->last_load_time = apr_time_now(); + (*isa)->last_load_rv = rv; + + if (r && (rv == APR_SUCCESS)) { + /* Let others who are blocked on this particular + * module resume their requests, for better or worse. + */ + apr_thread_rwlock_t *unlock = (*isa)->in_progress; + (*isa)->in_progress = NULL; + apr_thread_rwlock_unlock(unlock); + } + else if (!r && (rv != APR_SUCCESS)) { + /* We must leave a rwlock around for requests to retry + * loading this dll after timeup... since we were in + * the setup code we had avoided creating this lock. + */ + apr_thread_rwlock_create(&(*isa)->in_progress, loaded.pool); + } + + return (*isa)->last_load_rv; +} + +/********************************************************** + * + * ISAPI Module request callbacks section + * + **********************************************************/ + +/* Our "Connection ID" structure */ +struct isapi_cid { + EXTENSION_CONTROL_BLOCK *ecb; + isapi_dir_conf dconf; + isapi_loaded *isa; + request_rec *r; + int headers_set; + int response_sent; + PFN_HSE_IO_COMPLETION completion; + void *completion_arg; + apr_thread_mutex_t *completed; +}; + +int APR_THREAD_FUNC GetServerVariable (isapi_cid *cid, + char *variable_name, + void *buf_ptr, + apr_uint32_t *buf_size) +{ + request_rec *r = cid->r; + const char *result; + char *buf_data = (char*)buf_ptr; + apr_uint32_t len; + + if (!strcmp(variable_name, "ALL_HTTP")) + { + /* crlf delimited, colon split, comma separated and + * null terminated list of HTTP_ vars + */ + const apr_array_header_t *arr = apr_table_elts(r->subprocess_env); + const apr_table_entry_t *elts = (const apr_table_entry_t *)arr->elts; + int i; + + for (len = 0, i = 0; i < arr->nelts; i++) { + if (!strncmp(elts[i].key, "HTTP_", 5)) { + len += strlen(elts[i].key) + strlen(elts[i].val) + 3; + } + } + + if (*buf_size < len + 1) { + *buf_size = len + 1; + apr_set_os_error(APR_FROM_OS_ERROR(ERROR_INSUFFICIENT_BUFFER)); + return 0; + } + + for (i = 0; i < arr->nelts; i++) { + if (!strncmp(elts[i].key, "HTTP_", 5)) { + strcpy(buf_data, elts[i].key); + buf_data += strlen(elts[i].key); + *(buf_data++) = ':'; + strcpy(buf_data, elts[i].val); + buf_data += strlen(elts[i].val); + *(buf_data++) = '\r'; + *(buf_data++) = '\n'; + } + } + + *(buf_data++) = '\0'; + *buf_size = len + 1; + return 1; + } + + if (!strcmp(variable_name, "ALL_RAW")) + { + /* crlf delimited, colon split, comma separated and + * null terminated list of the raw request header + */ + const apr_array_header_t *arr = apr_table_elts(r->headers_in); + const apr_table_entry_t *elts = (const apr_table_entry_t *)arr->elts; + int i; + + for (len = 0, i = 0; i < arr->nelts; i++) { + len += strlen(elts[i].key) + strlen(elts[i].val) + 4; + } + + if (*buf_size < len + 1) { + *buf_size = len + 1; + apr_set_os_error(APR_FROM_OS_ERROR(ERROR_INSUFFICIENT_BUFFER)); + return 0; + } + + for (i = 0; i < arr->nelts; i++) { + strcpy(buf_data, elts[i].key); + buf_data += strlen(elts[i].key); + *(buf_data++) = ':'; + *(buf_data++) = ' '; + strcpy(buf_data, elts[i].val); + buf_data += strlen(elts[i].val); + *(buf_data++) = '\r'; + *(buf_data++) = '\n'; + } + *(buf_data++) = '\0'; + *buf_size = len + 1; + return 1; + } + + /* Not a special case */ + result = apr_table_get(r->subprocess_env, variable_name); + + if (result) { + len = strlen(result); + if (*buf_size < len + 1) { + *buf_size = len + 1; + apr_set_os_error(APR_FROM_OS_ERROR(ERROR_INSUFFICIENT_BUFFER)); + return 0; + } + strcpy(buf_data, result); + *buf_size = len + 1; + return 1; + } + + /* Not Found */ + apr_set_os_error(APR_FROM_OS_ERROR(ERROR_INVALID_INDEX)); + return 0; +} + +int APR_THREAD_FUNC ReadClient(isapi_cid *cid, + void *buf_data, + apr_uint32_t *buf_size) +{ + request_rec *r = cid->r; + apr_uint32_t read = 0; + int res; + + if (r->remaining < *buf_size) { + *buf_size = (apr_size_t)r->remaining; + } + + while (read < *buf_size && + ((res = ap_get_client_block(r, (char*)buf_data + read, + *buf_size - read)) > 0)) { + read += res; + } + + *buf_size = read; + if (res < 0) { + apr_set_os_error(APR_FROM_OS_ERROR(ERROR_READ_FAULT)); + } + return (res >= 0); +} + +/* Common code invoked for both HSE_REQ_SEND_RESPONSE_HEADER and + * the newer HSE_REQ_SEND_RESPONSE_HEADER_EX ServerSupportFunction(s) + * as well as other functions that write responses and presume that + * the support functions above are optional. + * + * Other callers trying to split headers and body bytes should pass + * head/headlen alone (leaving stat/statlen NULL/0), so that they + * get a proper count of bytes consumed. The argument passed to stat + * isn't counted as the head bytes are. + */ +static apr_ssize_t send_response_header(isapi_cid *cid, + const char *stat, + const char *head, + apr_size_t statlen, + apr_size_t headlen) +{ + int head_present = 1; + int termarg; + int res; + int old_status; + const char *termch; + apr_size_t ate = 0; + + if (!head || headlen == 0 || !*head) { + head = stat; + stat = NULL; + headlen = statlen; + statlen = 0; + head_present = 0; /* Don't eat the header */ + } + + if (!stat || statlen == 0 || !*stat) { + if (head && headlen && *head && ((stat = memchr(head, '\r', headlen)) + || (stat = memchr(head, '\n', headlen)) + || (stat = memchr(head, '\0', headlen)) + || (stat = head + headlen))) { + statlen = stat - head; + if (memchr(head, ':', statlen)) { + stat = "Status: 200 OK"; + statlen = strlen(stat); + } + else { + const char *flip = head; + head = stat; + stat = flip; + headlen -= statlen; + ate += statlen; + if (*head == '\r' && headlen) + ++head, --headlen, ++ate; + if (*head == '\n' && headlen) + ++head, --headlen, ++ate; + } + } + } + + if (stat && (statlen > 0) && *stat) { + char *newstat; + if (!apr_isdigit(*stat)) { + const char *stattok = stat; + int toklen = statlen; + while (toklen && *stattok && !apr_isspace(*stattok)) { + ++stattok; --toklen; + } + while (toklen && apr_isspace(*stattok)) { + ++stattok; --toklen; + } + /* Now decide if we follow the xxx message + * or the http/x.x xxx message format + */ + if (toklen && apr_isdigit(*stattok)) { + statlen = toklen; + stat = stattok; + } + } + newstat = apr_palloc(cid->r->pool, statlen + 9); + strcpy(newstat, "Status: "); + apr_cpystrn(newstat + 8, stat, statlen + 1); + stat = newstat; + statlen += 8; + } + + if (!head || headlen == 0 || !*head) { + head = "\r\n"; + headlen = 2; + } + else + { + if (head[headlen - 1] && head[headlen]) { + /* Whoops... not NULL terminated */ + head = apr_pstrndup(cid->r->pool, head, headlen); + } + } + + /* Seems IIS does not enforce the requirement for \r\n termination + * on HSE_REQ_SEND_RESPONSE_HEADER, but we won't panic... + * ap_scan_script_header_err_strs handles this aspect for us. + * + * Parse them out, or die trying + */ + old_status = cid->r->status; + + if (stat) { + res = ap_scan_script_header_err_strs(cid->r, NULL, &termch, &termarg, + stat, head, NULL); + } + else { + res = ap_scan_script_header_err_strs(cid->r, NULL, &termch, &termarg, + head, NULL); + } + + /* Set our status. */ + if (res) { + /* This is an immediate error result from the parser + */ + cid->r->status = res; + cid->r->status_line = ap_get_status_line(cid->r->status); + cid->ecb->dwHttpStatusCode = cid->r->status; + } + else if (cid->r->status) { + /* We have a status in r->status, so let's just use it. + * This is likely to be the Status: parsed above, and + * may also be a delayed error result from the parser. + * If it was filled in, status_line should also have + * been filled in. + */ + cid->ecb->dwHttpStatusCode = cid->r->status; + } + else if (cid->ecb->dwHttpStatusCode + && cid->ecb->dwHttpStatusCode != HTTP_OK) { + /* Now we fall back on dwHttpStatusCode if it appears + * ap_scan_script_header fell back on the default code. + * Any other results set dwHttpStatusCode to the decoded + * status value. + */ + cid->r->status = cid->ecb->dwHttpStatusCode; + cid->r->status_line = ap_get_status_line(cid->r->status); + } + else if (old_status) { + /* Well... either there is no dwHttpStatusCode or it's HTTP_OK. + * In any case, we don't have a good status to return yet... + * Perhaps the one we came in with will be better. Let's use it, + * if we were given one (note this is a pendantic case, it would + * normally be covered above unless the scan script code unset + * the r->status). Should there be a check here as to whether + * we are setting a valid response code? + */ + cid->r->status = old_status; + cid->r->status_line = ap_get_status_line(cid->r->status); + cid->ecb->dwHttpStatusCode = cid->r->status; + } + else { + /* None of dwHttpStatusCode, the parser's r->status nor the + * old value of r->status were helpful, and nothing was decoded + * from Status: string passed to us. Let's just say HTTP_OK + * and get the data out, this was the isapi dev's oversight. + */ + cid->r->status = HTTP_OK; + cid->r->status_line = ap_get_status_line(cid->r->status); + cid->ecb->dwHttpStatusCode = cid->r->status; + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, cid->r, + "ISAPI: Could not determine HTTP response code; using %d", + cid->r->status); + } + + if (cid->r->status == HTTP_INTERNAL_SERVER_ERROR) { + return -1; + } + + /* If only Status was passed, we consumed nothing + */ + if (!head_present) + return 0; + + cid->headers_set = 1; + + /* If all went well, tell the caller we consumed the headers complete + */ + if (!termch) + return(ate + headlen); + + /* Any data left must be sent directly by the caller, all we + * give back is the size of the headers we consumed (which only + * happens if the parser got to the head arg, which varies based + * on whether we passed stat+head to scan, or only head. + */ + if (termch && (termarg == (stat ? 1 : 0)) + && head_present && head + headlen > termch) { + return ate + termch - head; + } + return ate; +} + +int APR_THREAD_FUNC WriteClient(isapi_cid *cid, + void *buf_ptr, + apr_uint32_t *size_arg, + apr_uint32_t flags) +{ + request_rec *r = cid->r; + conn_rec *c = r->connection; + apr_uint32_t buf_size = *size_arg; + char *buf_data = (char*)buf_ptr; + apr_bucket_brigade *bb; + apr_bucket *b; + apr_status_t rv = APR_SUCCESS; + + if (!cid->headers_set) { + /* It appears that the foxisapi module and other clients + * presume that WriteClient("headers\n\nbody") will work. + * Parse them out, or die trying. + */ + apr_ssize_t ate; + ate = send_response_header(cid, NULL, buf_data, 0, buf_size); + if (ate < 0) { + apr_set_os_error(APR_FROM_OS_ERROR(ERROR_INVALID_PARAMETER)); + return 0; + } + + buf_data += ate; + buf_size -= ate; + } + + if (buf_size) { + bb = apr_brigade_create(r->pool, c->bucket_alloc); + b = apr_bucket_transient_create(buf_data, buf_size, c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, b); + b = apr_bucket_flush_create(c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, b); + rv = ap_pass_brigade(r->output_filters, bb); + cid->response_sent = 1; + if (rv != APR_SUCCESS) + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, rv, r, + "ISAPI: WriteClient ap_pass_brigade " + "failed: %s", r->filename); + } + + if ((flags & HSE_IO_ASYNC) && cid->completion) { + if (rv == APR_SUCCESS) { + cid->completion(cid->ecb, cid->completion_arg, + *size_arg, ERROR_SUCCESS); + } + else { + cid->completion(cid->ecb, cid->completion_arg, + *size_arg, ERROR_WRITE_FAULT); + } + } + return (rv == APR_SUCCESS); +} + +/* A "safe" maximum bucket size, 1Gb */ +#define MAX_BUCKET_SIZE (0x40000000) + +apr_bucket *brigade_insert_file(apr_bucket_brigade *bb, + apr_file_t *f, + apr_off_t start, + apr_off_t length, + apr_pool_t *p) +{ + apr_bucket *e; + + if (sizeof(apr_off_t) == sizeof(apr_size_t) || length < MAX_BUCKET_SIZE) { + e = apr_bucket_file_create(f, start, (apr_size_t)length, p, + bb->bucket_alloc); + } + else { + /* Several buckets are needed. */ + e = apr_bucket_file_create(f, start, MAX_BUCKET_SIZE, p, + bb->bucket_alloc); + + while (length > MAX_BUCKET_SIZE) { + apr_bucket *ce; + apr_bucket_copy(e, &ce); + APR_BRIGADE_INSERT_TAIL(bb, ce); + e->start += MAX_BUCKET_SIZE; + length -= MAX_BUCKET_SIZE; + } + e->length = (apr_size_t)length; /* Resize just the last bucket */ + } + + APR_BRIGADE_INSERT_TAIL(bb, e); + return e; +} + +int APR_THREAD_FUNC ServerSupportFunction(isapi_cid *cid, + apr_uint32_t HSE_code, + void *buf_ptr, + apr_uint32_t *buf_size, + apr_uint32_t *data_type) +{ + request_rec *r = cid->r; + conn_rec *c = r->connection; + char *buf_data = (char*)buf_ptr; + request_rec *subreq; + apr_status_t rv; + + switch (HSE_code) { + case HSE_REQ_SEND_URL_REDIRECT_RESP: + /* Set the status to be returned when the HttpExtensionProc() + * is done. + * WARNING: Microsoft now advertises HSE_REQ_SEND_URL_REDIRECT_RESP + * and HSE_REQ_SEND_URL as equivalant per the Jan 2000 SDK. + * They most definately are not, even in their own samples. + */ + apr_table_set (r->headers_out, "Location", buf_data); + cid->r->status = cid->ecb->dwHttpStatusCode = HTTP_MOVED_TEMPORARILY; + cid->r->status_line = ap_get_status_line(cid->r->status); + cid->headers_set = 1; + return 1; + + case HSE_REQ_SEND_URL: + /* Soak up remaining input */ + if (r->remaining > 0) { + char argsbuffer[HUGE_STRING_LEN]; + while (ap_get_client_block(r, argsbuffer, HUGE_STRING_LEN)); + } + + /* Reset the method to GET */ + r->method = apr_pstrdup(r->pool, "GET"); + r->method_number = M_GET; + + /* Don't let anyone think there's still data */ + apr_table_unset(r->headers_in, "Content-Length"); + + /* AV fault per PR3598 - redirected path is lost! */ + buf_data = apr_pstrdup(r->pool, (char*)buf_data); + ap_internal_redirect(buf_data, r); + return 1; + + case HSE_REQ_SEND_RESPONSE_HEADER: + { + /* Parse them out, or die trying */ + apr_size_t statlen = 0, headlen = 0; + apr_ssize_t ate; + if (buf_data) + statlen = strlen((char*) buf_data); + if (data_type) + headlen = strlen((char*) data_type); + ate = send_response_header(cid, (char*) buf_data, + (char*) data_type, + statlen, headlen); + if (ate < 0) { + apr_set_os_error(APR_FROM_OS_ERROR(ERROR_INVALID_PARAMETER)); + return 0; + } + else if ((apr_size_t)ate < headlen) { + apr_bucket_brigade *bb; + apr_bucket *b; + bb = apr_brigade_create(cid->r->pool, c->bucket_alloc); + b = apr_bucket_transient_create((char*) data_type + ate, + headlen - ate, c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, b); + b = apr_bucket_flush_create(c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, b); + rv = ap_pass_brigade(cid->r->output_filters, bb); + cid->response_sent = 1; + if (rv != APR_SUCCESS) + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, rv, r, + "ISAPI: ServerSupport function " + "HSE_REQ_SEND_RESPONSE_HEADER " + "ap_pass_brigade failed: %s", r->filename); + return (rv == APR_SUCCESS); + } + /* Deliberately hold off sending 'just the headers' to begin to + * accumulate the body and speed up the overall response, or at + * least wait for the end the session. + */ + return 1; + } + + case HSE_REQ_DONE_WITH_SESSION: + /* Signal to resume the thread completing this request, + * leave it to the pool cleanup to dispose of our mutex. + */ + if (cid->completed) { + (void)apr_thread_mutex_unlock(cid->completed); + return 1; + } + else if (cid->dconf.log_unsupported) { + ap_log_rerror(APLOG_MARK, APLOG_WARNING, 0, r, + "ISAPI: ServerSupportFunction " + "HSE_REQ_DONE_WITH_SESSION is not supported: %s", + r->filename); + } + apr_set_os_error(APR_FROM_OS_ERROR(ERROR_INVALID_PARAMETER)); + return 0; + + case HSE_REQ_MAP_URL_TO_PATH: + { + /* Map a URL to a filename */ + char *file = (char *)buf_data; + apr_uint32_t len; + subreq = ap_sub_req_lookup_uri( + apr_pstrndup(cid->r->pool, file, *buf_size), r, NULL); + + if (!subreq->filename) { + ap_destroy_sub_req(subreq); + return 0; + } + + len = (apr_uint32_t)strlen(r->filename); + + if ((subreq->finfo.filetype == APR_DIR) + && (!subreq->path_info) + && (file[len - 1] != '/')) + file = apr_pstrcat(cid->r->pool, subreq->filename, "/", NULL); + else + file = apr_pstrcat(cid->r->pool, subreq->filename, + subreq->path_info, NULL); + + ap_destroy_sub_req(subreq); + +#ifdef WIN32 + /* We need to make this a real Windows path name */ + apr_filepath_merge(&file, "", file, APR_FILEPATH_NATIVE, r->pool); +#endif + + *buf_size = apr_cpystrn(buf_data, file, *buf_size) - buf_data; + + return 1; + } + + case HSE_REQ_GET_SSPI_INFO: + if (cid->dconf.log_unsupported) + ap_log_rerror(APLOG_MARK, APLOG_WARNING, 0, r, + "ISAPI: ServerSupportFunction HSE_REQ_GET_SSPI_INFO " + "is not supported: %s", r->filename); + apr_set_os_error(APR_FROM_OS_ERROR(ERROR_INVALID_PARAMETER)); + return 0; + + case HSE_APPEND_LOG_PARAMETER: + /* Log buf_data, of buf_size bytes, in the URI Query (cs-uri-query) field + */ + apr_table_set(r->notes, "isapi-parameter", (char*) buf_data); + if (cid->dconf.log_to_query) { + if (r->args) + r->args = apr_pstrcat(r->pool, r->args, (char*) buf_data, NULL); + else + r->args = apr_pstrdup(r->pool, (char*) buf_data); + } + if (cid->dconf.log_to_errlog) + ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r, + "ISAPI: %s: %s", cid->r->filename, + (char*) buf_data); + return 1; + + case HSE_REQ_IO_COMPLETION: + /* Emulates a completion port... Record callback address and + * user defined arg, we will call this after any async request + * (e.g. transmitfile) as if the request executed async. + * Per MS docs... HSE_REQ_IO_COMPLETION replaces any prior call + * to HSE_REQ_IO_COMPLETION, and buf_data may be set to NULL. + */ + if (cid->dconf.fake_async) { + cid->completion = (PFN_HSE_IO_COMPLETION) buf_data; + cid->completion_arg = (void *) data_type; + return 1; + } + if (cid->dconf.log_unsupported) + ap_log_rerror(APLOG_MARK, APLOG_WARNING, 0, r, + "ISAPI: ServerSupportFunction HSE_REQ_IO_COMPLETION " + "is not supported: %s", r->filename); + apr_set_os_error(APR_FROM_OS_ERROR(ERROR_INVALID_PARAMETER)); + return 0; + + case HSE_REQ_TRANSMIT_FILE: + { + /* we do nothing with (tf->dwFlags & HSE_DISCONNECT_AFTER_SEND) + */ + HSE_TF_INFO *tf = (HSE_TF_INFO*)buf_data; + apr_uint32_t sent = 0; + apr_ssize_t ate = 0; + apr_bucket_brigade *bb; + apr_bucket *b; + apr_file_t *fd; + apr_off_t fsize; + + if (!cid->dconf.fake_async && (tf->dwFlags & HSE_IO_ASYNC)) { + if (cid->dconf.log_unsupported) + ap_log_rerror(APLOG_MARK, APLOG_WARNING, 0, r, + "ISAPI: ServerSupportFunction HSE_REQ_TRANSMIT_FILE " + "as HSE_IO_ASYNC is not supported: %s", r->filename); + apr_set_os_error(APR_FROM_OS_ERROR(ERROR_INVALID_PARAMETER)); + return 0; + } + + /* Presume the handle was opened with the CORRECT semantics + * for TransmitFile + */ + if ((rv = apr_os_file_put(&fd, &tf->hFile, + APR_READ | APR_XTHREAD, r->pool)) + != APR_SUCCESS) { + return 0; + } + if (tf->BytesToWrite) { + fsize = tf->BytesToWrite; + } + else { + apr_finfo_t fi; + if (apr_file_info_get(&fi, APR_FINFO_SIZE, fd) != APR_SUCCESS) { + apr_set_os_error(APR_FROM_OS_ERROR(ERROR_INVALID_PARAMETER)); + return 0; + } + fsize = fi.size - tf->Offset; + } + + /* apr_dupfile_oshandle (&fd, tf->hFile, r->pool); */ + bb = apr_brigade_create(r->pool, c->bucket_alloc); + + /* According to MS: if calling HSE_REQ_TRANSMIT_FILE with the + * HSE_IO_SEND_HEADERS flag, then you can't otherwise call any + * HSE_SEND_RESPONSE_HEADERS* fn, but if you don't use the flag, + * you must have done so. They document that the pHead headers + * option is valid only for HSE_IO_SEND_HEADERS - we are a bit + * more flexible and assume with the flag, pHead are the + * response headers, and without, pHead simply contains text + * (handled after this case). + */ + if ((tf->dwFlags & HSE_IO_SEND_HEADERS) && tf->pszStatusCode) { + ate = send_response_header(cid, tf->pszStatusCode, + (char*)tf->pHead, + strlen(tf->pszStatusCode), + tf->HeadLength); + } + else if (!cid->headers_set && tf->pHead && tf->HeadLength + && *(char*)tf->pHead) { + ate = send_response_header(cid, NULL, (char*)tf->pHead, + 0, tf->HeadLength); + if (ate < 0) + { + apr_brigade_destroy(bb); + apr_set_os_error(APR_FROM_OS_ERROR(ERROR_INVALID_PARAMETER)); + return 0; + } + } + + if (tf->pHead && (apr_size_t)ate < tf->HeadLength) { + b = apr_bucket_transient_create((char*)tf->pHead + ate, + tf->HeadLength - ate, + c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, b); + sent = tf->HeadLength; + } + + sent += (apr_uint32_t)fsize; + brigade_insert_file(bb, fd, tf->Offset, fsize, r->pool); + + if (tf->pTail && tf->TailLength) { + sent += tf->TailLength; + b = apr_bucket_transient_create((char*)tf->pTail, + tf->TailLength, c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, b); + } + + b = apr_bucket_flush_create(c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, b); + rv = ap_pass_brigade(r->output_filters, bb); + cid->response_sent = 1; + if (rv != APR_SUCCESS) + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, rv, r, + "ISAPI: ServerSupport function " + "HSE_REQ_TRANSMIT_FILE " + "ap_pass_brigade failed: %s", r->filename); + + /* Use tf->pfnHseIO + tf->pContext, or if NULL, then use cid->fnIOComplete + * pass pContect to the HseIO callback. + */ + if (tf->dwFlags & HSE_IO_ASYNC) { + if (tf->pfnHseIO) { + if (rv == APR_SUCCESS) { + tf->pfnHseIO(cid->ecb, tf->pContext, + ERROR_SUCCESS, sent); + } + else { + tf->pfnHseIO(cid->ecb, tf->pContext, + ERROR_WRITE_FAULT, sent); + } + } + else if (cid->completion) { + if (rv == APR_SUCCESS) { + cid->completion(cid->ecb, cid->completion_arg, + sent, ERROR_SUCCESS); + } + else { + cid->completion(cid->ecb, cid->completion_arg, + sent, ERROR_WRITE_FAULT); + } + } + } + return (rv == APR_SUCCESS); + } + + case HSE_REQ_REFRESH_ISAPI_ACL: + if (cid->dconf.log_unsupported) + ap_log_rerror(APLOG_MARK, APLOG_WARNING, 0, r, + "ISAPI: ServerSupportFunction " + "HSE_REQ_REFRESH_ISAPI_ACL " + "is not supported: %s", r->filename); + apr_set_os_error(APR_FROM_OS_ERROR(ERROR_INVALID_PARAMETER)); + return 0; + + case HSE_REQ_IS_KEEP_CONN: + *((int *)buf_data) = (r->connection->keepalive == AP_CONN_KEEPALIVE); + return 1; + + case HSE_REQ_ASYNC_READ_CLIENT: + { + apr_uint32_t read = 0; + int res; + if (!cid->dconf.fake_async) { + if (cid->dconf.log_unsupported) + ap_log_rerror(APLOG_MARK, APLOG_WARNING, 0, r, + "ISAPI: asynchronous I/O not supported: %s", + r->filename); + apr_set_os_error(APR_FROM_OS_ERROR(ERROR_INVALID_PARAMETER)); + return 0; + } + + if (r->remaining < *buf_size) { + *buf_size = (apr_size_t)r->remaining; + } + + while (read < *buf_size && + ((res = ap_get_client_block(r, (char*)buf_data + read, + *buf_size - read)) > 0)) { + read += res; + } + + if ((*data_type & HSE_IO_ASYNC) && cid->completion) { + /* XXX: Many authors issue their next HSE_REQ_ASYNC_READ_CLIENT + * within the completion logic. An example is MS's own PSDK + * sample web/iis/extensions/io/ASyncRead. This potentially + * leads to stack exhaustion. To refactor, the notification + * logic needs to move to isapi_handler() - differentiating + * the cid->completed event with a new flag to indicate + * an async-notice versus the async request completed. + */ + if (res >= 0) { + cid->completion(cid->ecb, cid->completion_arg, + read, ERROR_SUCCESS); + } + else { + cid->completion(cid->ecb, cid->completion_arg, + read, ERROR_READ_FAULT); + } + } + return (res >= 0); + } + + case HSE_REQ_GET_IMPERSONATION_TOKEN: /* Added in ISAPI 4.0 */ + if (cid->dconf.log_unsupported) + ap_log_rerror(APLOG_MARK, APLOG_WARNING, 0, r, + "ISAPI: ServerSupportFunction " + "HSE_REQ_GET_IMPERSONATION_TOKEN " + "is not supported: %s", r->filename); + apr_set_os_error(APR_FROM_OS_ERROR(ERROR_INVALID_PARAMETER)); + return 0; + + case HSE_REQ_MAP_URL_TO_PATH_EX: + { + /* Map a URL to a filename */ + HSE_URL_MAPEX_INFO *info = (HSE_URL_MAPEX_INFO*)data_type; + char* test_uri = apr_pstrndup(r->pool, (char *)buf_data, *buf_size); + + subreq = ap_sub_req_lookup_uri(test_uri, r, NULL); + info->cchMatchingURL = strlen(test_uri); + info->cchMatchingPath = apr_cpystrn(info->lpszPath, subreq->filename, + sizeof(info->lpszPath)) - info->lpszPath; + + /* Mapping started with assuming both strings matched. + * Now roll on the path_info as a mismatch and handle + * terminating slashes for directory matches. + */ + if (subreq->path_info && *subreq->path_info) { + apr_cpystrn(info->lpszPath + info->cchMatchingPath, + subreq->path_info, + sizeof(info->lpszPath) - info->cchMatchingPath); + info->cchMatchingURL -= strlen(subreq->path_info); + if (subreq->finfo.filetype == APR_DIR + && info->cchMatchingPath < sizeof(info->lpszPath) - 1) { + /* roll forward over path_info's first slash */ + ++info->cchMatchingPath; + ++info->cchMatchingURL; + } + } + else if (subreq->finfo.filetype == APR_DIR + && info->cchMatchingPath < sizeof(info->lpszPath) - 1) { + /* Add a trailing slash for directory */ + info->lpszPath[info->cchMatchingPath++] = '/'; + info->lpszPath[info->cchMatchingPath] = '\0'; + } + + /* If the matched isn't a file, roll match back to the prior slash */ + if (subreq->finfo.filetype == APR_NOFILE) { + while (info->cchMatchingPath && info->cchMatchingURL) { + if (info->lpszPath[info->cchMatchingPath - 1] == '/') + break; + --info->cchMatchingPath; + --info->cchMatchingURL; + } + } + + /* Paths returned with back slashes */ + for (test_uri = info->lpszPath; *test_uri; ++test_uri) + if (*test_uri == '/') + *test_uri = '\\'; + + /* is a combination of: + * HSE_URL_FLAGS_READ 0x001 Allow read + * HSE_URL_FLAGS_WRITE 0x002 Allow write + * HSE_URL_FLAGS_EXECUTE 0x004 Allow execute + * HSE_URL_FLAGS_SSL 0x008 Require SSL + * HSE_URL_FLAGS_DONT_CACHE 0x010 Don't cache (VRoot only) + * HSE_URL_FLAGS_NEGO_CERT 0x020 Allow client SSL cert + * HSE_URL_FLAGS_REQUIRE_CERT 0x040 Require client SSL cert + * HSE_URL_FLAGS_MAP_CERT 0x080 Map client SSL cert to account + * HSE_URL_FLAGS_SSL128 0x100 Require 128-bit SSL cert + * HSE_URL_FLAGS_SCRIPT 0x200 Allow script execution + * + * XxX: As everywhere, EXEC flags could use some work... + * and this could go further with more flags, as desired. + */ + info->dwFlags = (subreq->finfo.protection & APR_UREAD ? 0x001 : 0) + | (subreq->finfo.protection & APR_UWRITE ? 0x002 : 0) + | (subreq->finfo.protection & APR_UEXECUTE ? 0x204 : 0); + return 1; + } + + case HSE_REQ_ABORTIVE_CLOSE: + if (cid->dconf.log_unsupported) + ap_log_rerror(APLOG_MARK, APLOG_WARNING, 0, r, + "ISAPI: ServerSupportFunction HSE_REQ_ABORTIVE_CLOSE" + " is not supported: %s", r->filename); + apr_set_os_error(APR_FROM_OS_ERROR(ERROR_INVALID_PARAMETER)); + return 0; + + case HSE_REQ_GET_CERT_INFO_EX: /* Added in ISAPI 4.0 */ + if (cid->dconf.log_unsupported) + ap_log_rerror(APLOG_MARK, APLOG_WARNING, 0, r, + "ISAPI: ServerSupportFunction " + "HSE_REQ_GET_CERT_INFO_EX " + "is not supported: %s", r->filename); + apr_set_os_error(APR_FROM_OS_ERROR(ERROR_INVALID_PARAMETER)); + return 0; + + case HSE_REQ_SEND_RESPONSE_HEADER_EX: /* Added in ISAPI 4.0 */ + { + HSE_SEND_HEADER_EX_INFO *shi = (HSE_SEND_HEADER_EX_INFO*)buf_data; + + /* Ignore shi->fKeepConn - we don't want the advise + */ + apr_ssize_t ate = send_response_header(cid, shi->pszStatus, + shi->pszHeader, + shi->cchStatus, + shi->cchHeader); + if (ate < 0) { + apr_set_os_error(APR_FROM_OS_ERROR(ERROR_INVALID_PARAMETER)); + return 0; + } + else if ((apr_size_t)ate < shi->cchHeader) { + apr_bucket_brigade *bb; + apr_bucket *b; + bb = apr_brigade_create(cid->r->pool, c->bucket_alloc); + b = apr_bucket_transient_create(shi->pszHeader + ate, + shi->cchHeader - ate, + c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, b); + b = apr_bucket_flush_create(c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, b); + rv = ap_pass_brigade(cid->r->output_filters, bb); + cid->response_sent = 1; + if (rv != APR_SUCCESS) + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, rv, r, + "ISAPI: ServerSupport function " + "HSE_REQ_SEND_RESPONSE_HEADER_EX " + "ap_pass_brigade failed: %s", r->filename); + return (rv == APR_SUCCESS); + } + /* Deliberately hold off sending 'just the headers' to begin to + * accumulate the body and speed up the overall response, or at + * least wait for the end the session. + */ + return 1; + } + + case HSE_REQ_CLOSE_CONNECTION: /* Added after ISAPI 4.0 */ + if (cid->dconf.log_unsupported) + ap_log_rerror(APLOG_MARK, APLOG_WARNING, 0, r, + "ISAPI: ServerSupportFunction " + "HSE_REQ_CLOSE_CONNECTION " + "is not supported: %s", r->filename); + apr_set_os_error(APR_FROM_OS_ERROR(ERROR_INVALID_PARAMETER)); + return 0; + + case HSE_REQ_IS_CONNECTED: /* Added after ISAPI 4.0 */ + /* Returns True if client is connected c.f. MSKB Q188346 + * assuming the identical return mechanism as HSE_REQ_IS_KEEP_CONN + */ + *((int *)buf_data) = (r->connection->aborted == 0); + return 1; + + case HSE_REQ_EXTENSION_TRIGGER: /* Added after ISAPI 4.0 */ + /* Undocumented - defined by the Microsoft Jan '00 Platform SDK + */ + if (cid->dconf.log_unsupported) + ap_log_rerror(APLOG_MARK, APLOG_WARNING, 0, r, + "ISAPI: ServerSupportFunction " + "HSE_REQ_EXTENSION_TRIGGER " + "is not supported: %s", r->filename); + apr_set_os_error(APR_FROM_OS_ERROR(ERROR_INVALID_PARAMETER)); + return 0; + + default: + if (cid->dconf.log_unsupported) + ap_log_rerror(APLOG_MARK, APLOG_WARNING, 0, r, + "ISAPI: ServerSupportFunction (%d) not supported: " + "%s", HSE_code, r->filename); + apr_set_os_error(APR_FROM_OS_ERROR(ERROR_INVALID_PARAMETER)); + return 0; + } +} + +/********************************************************** + * + * ISAPI Module request invocation section + * + **********************************************************/ + +apr_status_t isapi_handler (request_rec *r) +{ + isapi_dir_conf *dconf; + apr_table_t *e; + apr_status_t rv; + isapi_loaded *isa; + isapi_cid *cid; + const char *val; + apr_uint32_t read; + int res; + + if(strcmp(r->handler, "isapi-isa") + && strcmp(r->handler, "isapi-handler")) { + /* Hang on to the isapi-isa for compatibility with older docs + * (wtf did '-isa' mean in the first place?) but introduce + * a newer and clearer "isapi-handler" name. + */ + return DECLINED; + } + dconf = ap_get_module_config(r->per_dir_config, &isapi_module); + e = r->subprocess_env; + + /* Use similar restrictions as CGIs + * + * If this fails, it's pointless to load the isapi dll. + */ + if (!(ap_allow_options(r) & OPT_EXECCGI)) { + return HTTP_FORBIDDEN; + } + if (r->finfo.filetype == APR_NOFILE) { + return HTTP_NOT_FOUND; + } + if (r->finfo.filetype != APR_REG) { + return HTTP_FORBIDDEN; + } + if ((r->used_path_info == AP_REQ_REJECT_PATH_INFO) && + r->path_info && *r->path_info) { + /* default to accept */ + return HTTP_NOT_FOUND; + } + + if (isapi_lookup(r->pool, r->server, r, r->filename, &isa) + != APR_SUCCESS) { + return HTTP_INTERNAL_SERVER_ERROR; + } + /* Set up variables */ + ap_add_common_vars(r); + ap_add_cgi_vars(r); + apr_table_setn(e, "UNMAPPED_REMOTE_USER", "REMOTE_USER"); + if ((val = apr_table_get(e, "HTTPS")) && (strcmp(val, "on") == 0)) + apr_table_setn(e, "SERVER_PORT_SECURE", "1"); + else + apr_table_setn(e, "SERVER_PORT_SECURE", "0"); + apr_table_setn(e, "URL", r->uri); + + /* Set up connection structure and ecb, + * NULL or zero out most fields. + */ + cid = apr_pcalloc(r->pool, sizeof(isapi_cid)); + + /* Fixup defaults for dconf */ + cid->dconf.read_ahead_buflen = (dconf->read_ahead_buflen == ISAPI_UNDEF) + ? 49152 : dconf->read_ahead_buflen; + cid->dconf.log_unsupported = (dconf->log_unsupported == ISAPI_UNDEF) + ? 0 : dconf->log_unsupported; + cid->dconf.log_to_errlog = (dconf->log_to_errlog == ISAPI_UNDEF) + ? 0 : dconf->log_to_errlog; + cid->dconf.log_to_query = (dconf->log_to_query == ISAPI_UNDEF) + ? 1 : dconf->log_to_query; + cid->dconf.fake_async = (dconf->fake_async == ISAPI_UNDEF) + ? 0 : dconf->fake_async; + + cid->ecb = apr_pcalloc(r->pool, sizeof(EXTENSION_CONTROL_BLOCK)); + cid->ecb->ConnID = cid; + cid->isa = isa; + cid->r = r; + r->status = 0; + + cid->ecb->cbSize = sizeof(EXTENSION_CONTROL_BLOCK); + cid->ecb->dwVersion = isa->report_version; + cid->ecb->dwHttpStatusCode = 0; + strcpy(cid->ecb->lpszLogData, ""); + /* TODO: are copies really needed here? + */ + cid->ecb->lpszMethod = (char*) r->method; + cid->ecb->lpszQueryString = (char*) apr_table_get(e, "QUERY_STRING"); + cid->ecb->lpszPathInfo = (char*) apr_table_get(e, "PATH_INFO"); + cid->ecb->lpszPathTranslated = (char*) apr_table_get(e, "PATH_TRANSLATED"); + cid->ecb->lpszContentType = (char*) apr_table_get(e, "CONTENT_TYPE"); + + /* Set up the callbacks */ + cid->ecb->GetServerVariable = GetServerVariable; + cid->ecb->WriteClient = WriteClient; + cid->ecb->ReadClient = ReadClient; + cid->ecb->ServerSupportFunction = ServerSupportFunction; + + /* Set up client input */ + res = ap_setup_client_block(r, REQUEST_CHUNKED_ERROR); + if (res) { + return res; + } + + if (ap_should_client_block(r)) { + /* Time to start reading the appropriate amount of data, + * and allow the administrator to tweak the number + */ + if (r->remaining) { + cid->ecb->cbTotalBytes = (apr_size_t)r->remaining; + if (cid->ecb->cbTotalBytes > (apr_uint32_t)cid->dconf.read_ahead_buflen) + cid->ecb->cbAvailable = cid->dconf.read_ahead_buflen; + else + cid->ecb->cbAvailable = cid->ecb->cbTotalBytes; + } + else + { + cid->ecb->cbTotalBytes = 0xffffffff; + cid->ecb->cbAvailable = cid->dconf.read_ahead_buflen; + } + + cid->ecb->lpbData = apr_pcalloc(r->pool, cid->ecb->cbAvailable + 1); + + read = 0; + while (read < cid->ecb->cbAvailable && + ((res = ap_get_client_block(r, (char*)cid->ecb->lpbData + read, + cid->ecb->cbAvailable - read)) > 0)) { + read += res; + } + + if (res < 0) { + return HTTP_INTERNAL_SERVER_ERROR; + } + + /* Although it's not to spec, IIS seems to null-terminate + * its lpdData string. So we will too. + */ + if (res == 0) + cid->ecb->cbAvailable = cid->ecb->cbTotalBytes = read; + else + cid->ecb->cbAvailable = read; + cid->ecb->lpbData[read] = '\0'; + } + else { + cid->ecb->cbTotalBytes = 0; + cid->ecb->cbAvailable = 0; + cid->ecb->lpbData = NULL; + } + + /* To emulate async behavior... + * + * We create a cid->completed mutex and lock on it so that the + * app can believe is it running async. + * + * This request completes upon a notification through + * ServerSupportFunction(HSE_REQ_DONE_WITH_SESSION), which + * unlocks this mutex. If the HttpExtensionProc() returns + * HSE_STATUS_PENDING, we will attempt to gain this lock again + * which may *only* happen once HSE_REQ_DONE_WITH_SESSION has + * unlocked the mutex. + */ + if (cid->dconf.fake_async) { + rv = apr_thread_mutex_create(&cid->completed, + APR_THREAD_MUTEX_UNNESTED, + r->pool); + if (cid->completed && (rv == APR_SUCCESS)) { + rv = apr_thread_mutex_lock(cid->completed); + } + + if (!cid->completed || (rv != APR_SUCCESS)) { + ap_log_rerror(APLOG_MARK, APLOG_WARNING, 0, r, + "ISAPI: Failed to create completion mutex"); + return HTTP_INTERNAL_SERVER_ERROR; + } + } + + /* All right... try and run the sucker */ + rv = (*isa->HttpExtensionProc)(cid->ecb); + + /* Check for a log message - and log it */ + if (cid->ecb->lpszLogData && *cid->ecb->lpszLogData) + ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r, + "ISAPI: %s: %s", r->filename, cid->ecb->lpszLogData); + + switch(rv) { + case 0: /* Strange, but MS isapi accepts this as success */ + case HSE_STATUS_SUCCESS: + case HSE_STATUS_SUCCESS_AND_KEEP_CONN: + /* Ignore the keepalive stuff; Apache handles it just fine without + * the ISAPI Handler's "advice". + * Per Microsoft: "In IIS versions 4.0 and later, the return + * values HSE_STATUS_SUCCESS and HSE_STATUS_SUCCESS_AND_KEEP_CONN + * are functionally identical: Keep-Alive connections are + * maintained, if supported by the client." + * ... so we were pat all this time + */ + break; + + case HSE_STATUS_PENDING: + /* emulating async behavior... + */ + if (cid->completed) { + /* The completion port was locked prior to invoking + * HttpExtensionProc(). Once we can regain the lock, + * when ServerSupportFunction(HSE_REQ_DONE_WITH_SESSION) + * is called by the extension to release the lock, + * we may finally destroy the request. + */ + (void)apr_thread_mutex_lock(cid->completed); + break; + } + else if (cid->dconf.log_unsupported) { + ap_log_rerror(APLOG_MARK, APLOG_WARNING, 0, r, + "ISAPI: asynch I/O result HSE_STATUS_PENDING " + "from HttpExtensionProc() is not supported: %s", + r->filename); + r->status = HTTP_INTERNAL_SERVER_ERROR; + } + break; + + case HSE_STATUS_ERROR: + /* end response if we have yet to do so. + */ + ap_log_rerror(APLOG_MARK, APLOG_WARNING, apr_get_os_error(), r, + "ISAPI: HSE_STATUS_ERROR result from " + "HttpExtensionProc(): %s", r->filename); + r->status = HTTP_INTERNAL_SERVER_ERROR; + break; + + default: + ap_log_rerror(APLOG_MARK, APLOG_WARNING, apr_get_os_error(), r, + "ISAPI: unrecognized result code %d " + "from HttpExtensionProc(): %s ", + rv, r->filename); + r->status = HTTP_INTERNAL_SERVER_ERROR; + break; + } + + /* Flush the response now, including headers-only responses */ + if (cid->headers_set || cid->response_sent) { + conn_rec *c = r->connection; + apr_bucket_brigade *bb; + apr_bucket *b; + apr_status_t rv; + + bb = apr_brigade_create(r->pool, c->bucket_alloc); + b = apr_bucket_eos_create(c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, b); + rv = ap_pass_brigade(r->output_filters, bb); + cid->response_sent = 1; + + if (rv != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, rv, r, + "ISAPI: ap_pass_brigade failed to " + "complete the response: %s ", r->filename); + } + + return OK; /* NOT r->status, even if it has changed. */ + } + + /* As the client returned no error, and if we did not error out + * ourselves, trust dwHttpStatusCode to say something relevant. + */ + if (!ap_is_HTTP_SERVER_ERROR(r->status) && cid->ecb->dwHttpStatusCode) { + r->status = cid->ecb->dwHttpStatusCode; + } + + /* For all missing-response situations simply return the status, + * and let the core respond to the client. + */ + return r->status; +} + +/********************************************************** + * + * ISAPI Module Setup Hooks + * + **********************************************************/ + +static int isapi_pre_config(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp) +{ + apr_status_t rv; + + apr_pool_create_ex(&loaded.pool, pconf, NULL, NULL); + if (!loaded.pool) { + ap_log_error(APLOG_MARK, APLOG_ERR, APR_EGENERAL, NULL, + "ISAPI: could not create the isapi cache pool"); + return APR_EGENERAL; + } + + loaded.hash = apr_hash_make(loaded.pool); + if (!loaded.hash) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, NULL, + "ISAPI: Failed to create module cache"); + return APR_EGENERAL; + } + + rv = apr_thread_mutex_create(&loaded.lock, APR_THREAD_MUTEX_DEFAULT, + loaded.pool); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, rv, 0, NULL, + "ISAPI: Failed to create module cache lock"); + return rv; + } + return OK; +} + +static void isapi_hooks(apr_pool_t *cont) +{ + ap_hook_pre_config(isapi_pre_config, NULL, NULL, APR_HOOK_MIDDLE); + ap_hook_handler(isapi_handler, NULL, NULL, APR_HOOK_MIDDLE); +} + +module AP_MODULE_DECLARE_DATA isapi_module = { + STANDARD20_MODULE_STUFF, + create_isapi_dir_config, /* create per-dir config */ + merge_isapi_dir_configs, /* merge per-dir config */ + NULL, /* server config */ + NULL, /* merge server config */ + isapi_cmds, /* command apr_table_t */ + isapi_hooks /* register hooks */ +}; diff --git a/rubbos/app/httpd-2.0.64/modules/arch/win32/mod_isapi.dsp b/rubbos/app/httpd-2.0.64/modules/arch/win32/mod_isapi.dsp new file mode 100644 index 00000000..08cbda21 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/arch/win32/mod_isapi.dsp @@ -0,0 +1,132 @@ +# Microsoft Developer Studio Project File - Name="mod_isapi" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=mod_isapi - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "mod_isapi.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 "mod_isapi.mak" CFG="mod_isapi - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "mod_isapi - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_isapi - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "mod_isapi - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../../../include" /I "../../../srclib/apr/include" /I "../../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_isapi_src" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib ws2_32.lib mswsock.lib /nologo /subsystem:windows /dll /out:"Release/mod_isapi.so" /base:@..\..\..\os\win32\BaseAddr.ref,mod_isapi.so +# ADD LINK32 kernel32.lib ws2_32.lib mswsock.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Release/mod_isapi.so" /base:@..\..\..\os\win32\BaseAddr.ref,mod_isapi.so /opt:ref + +!ELSEIF "$(CFG)" == "mod_isapi - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../../../include" /I "../../../srclib/apr/include" /I "../../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_isapi_src" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib ws2_32.lib mswsock.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_isapi.so" /base:@..\..\..\os\win32\BaseAddr.ref,mod_isapi.so +# ADD LINK32 kernel32.lib ws2_32.lib mswsock.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_isapi.so" /base:@..\..\..\os\win32\BaseAddr.ref,mod_isapi.so + +!ENDIF + +# Begin Target + +# Name "mod_isapi - Win32 Release" +# Name "mod_isapi - Win32 Debug" +# Begin Source File + +SOURCE=.\mod_isapi.c +# End Source File +# Begin Source File + +SOURCE=.\mod_isapi.h +# End Source File +# Begin Source File + +SOURCE=.\mod_isapi.rc +# End Source File +# Begin Source File + +SOURCE=..\..\..\build\win32\win32ver.awk + +!IF "$(CFG)" == "mod_isapi - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\..\build\win32\win32ver.awk + +".\mod_isapi.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../../build/win32/win32ver.awk mod_isapi.so "isapi_module for Apache" ../../../include/ap_release.h > .\mod_isapi.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "mod_isapi - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\..\build\win32\win32ver.awk + +".\mod_isapi.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../../build/win32/win32ver.awk mod_isapi.so "isapi_module for Apache" ../../../include/ap_release.h > .\mod_isapi.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/modules/arch/win32/mod_isapi.h b/rubbos/app/httpd-2.0.64/modules/arch/win32/mod_isapi.h new file mode 100644 index 00000000..33524bcb --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/arch/win32/mod_isapi.h @@ -0,0 +1,271 @@ +/* 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. + */ + +/** + * @file mod_isapi.h + * @brief ISAPI module extension to Apache + * + * @defgroup MOD_ISAPI mod_isapi + * @ingroup APACHE_MODS + * @{ + */ + +#ifndef MOD_ISAPI_H +#define MOD_ISAPI_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* The Version Information storage passed to a module on startup + * via the GetExtensionVersion() entry point. + */ +typedef struct HSE_VERSION_INFO { + apr_uint32_t dwExtensionVersion; + char lpszExtensionDesc[256]; +} HSE_VERSION_INFO; + +/* The startup entry point that must be exported by every ISAPI handler + */ +int APR_THREAD_FUNC GetExtensionVersion(HSE_VERSION_INFO *ver_info); +typedef int (APR_THREAD_FUNC *PFN_GETEXTENSIONVERSION)(HSE_VERSION_INFO *ver_info); + +/* Our internal 'HCONN' representation, always opaque to the user. + */ +typedef struct isapi_cid isapi_cid; +typedef struct isapi_cid *HCONN; + +/* Prototypes of the essential functions exposed by mod_isapi + * for the module to communicate with Apache. + */ +typedef int (APR_THREAD_FUNC + *PFN_GETSERVERVARIABLE)(HCONN cid, + char *variable_name, + void *buf_data, + apr_uint32_t *buf_size); +typedef int (APR_THREAD_FUNC + *PFN_WRITECLIENT)(HCONN cid, + void *buf_data, + apr_uint32_t *buf_size, + apr_uint32_t flags); +typedef int (APR_THREAD_FUNC + *PFN_READCLIENT)(HCONN cid, + void *buf_data, + apr_uint32_t *buf_size); +typedef int (APR_THREAD_FUNC + *PFN_SERVERSUPPORTFUNCTION)(HCONN cid, + apr_uint32_t HSE_code, + void *buf_data, + apr_uint32_t *buf_size, + apr_uint32_t *flags); + +/* The ecb structure is passed on each invocation of the module + */ +typedef struct EXTENSION_CONTROL_BLOCK { + apr_uint32_t cbSize; + apr_uint32_t dwVersion; + HCONN ConnID; + apr_uint32_t dwHttpStatusCode; + char lpszLogData[80]; + char *lpszMethod; + char *lpszQueryString; + char *lpszPathInfo; + char *lpszPathTranslated; + apr_uint32_t cbTotalBytes; + apr_uint32_t cbAvailable; + unsigned char *lpbData; + char *lpszContentType; + + PFN_GETSERVERVARIABLE GetServerVariable; + PFN_WRITECLIENT WriteClient; + PFN_READCLIENT ReadClient; + PFN_SERVERSUPPORTFUNCTION ServerSupportFunction; +} EXTENSION_CONTROL_BLOCK; + +/* Status/Headers structure to pass to HSE_SEND_HEADER_EX, + * an MS extension to ServerSupportFunction + */ +typedef struct HSE_SEND_HEADER_EX_INFO { + const char * pszStatus; /* HTTP status text, such as "200 OK" */ + const char * pszHeader; /* HTTP header lines text, such as + * "Content-type: text/plain\r\n" + * "Content-Language: en\r\n" + * Note that (in spite of cchFoo lengths below) + * NULL characters will interfere in headers. + */ + apr_uint32_t cchStatus; /* length of pszStatus text */ + apr_uint32_t cchHeader; /* length of pszHeader text */ + int fKeepConn; /* Ignored: used to set keep-alive status, + * but Apache follows the client's negotiated + * HTTP contract to decide. + */ +} HSE_SEND_HEADER_EX_INFO; + +/* Our only 'supported' MS extended flag bit for TransmitFile, + * HSE_IO_SEND_HEADERS indicates that Status+Headers are present + * in the pszStatusCode member of the HSE_TF_INFO structure. + */ +#define HSE_IO_SEND_HEADERS 8 + +/* The remaining flags are MS extended flag bits that bear little + * relation to Apache; the rules that the Apache server obeys follow + * its own design and HTTP protocol filter rules. + * + * We do not support async, however, we fake it. If HSE_IO_SYNC is + * not passed, and a completion context was defined, we will invoke the + * completion function immediately following the transfer, and then + * return to the caller. If HSE_IO_SYNC is passed, there is no call + * neccessary to the completion context. + */ +#define HSE_IO_SYNC 1 +#define HSE_IO_ASYNC 2 +#define HSE_IO_DISCONNECT_AFTER_SEND 4 +#define HSE_IO_NODELAY 4096 + +/* The Completion function prototype. This callback may be fixed with + * the HSE_REQ_IO_COMPLETION ServerSupportFunction call, or overriden + * for the HSE_REQ_TRANSMIT_FILE call. + */ +typedef void (APR_THREAD_FUNC *PFN_HSE_IO_COMPLETION) + (EXTENSION_CONTROL_BLOCK *ecb, + void *ctxt, + apr_uint32_t cbIO, + apr_uint32_t dwError); + +/* TransmitFile structure to pass to HSE_REQ_TRANSMIT_FILE, an MS extension + */ +typedef struct HSE_TF_INFO { + PFN_HSE_IO_COMPLETION pfnHseIO; /* Overrides the default setting of + * HSE_REQ_IO_COMPLETION if not NULL + */ + void *pContext; + apr_os_file_t hFile; /* HANDLE/fd to transmit */ + const char *pszStatusCode; /* Ignored if HSE_IO_SEND_HEADERS is + * not set. Includes HTTP status text + * plus header text lines, such as + * "200 OK\r\n" + * "Content-type: text/plain\r\n" + */ + apr_uint32_t BytesToWrite; /* 0 is write-all */ + apr_uint32_t Offset; /* File Offset */ + void *pHead; /* Prefix with *pHead body text */ + apr_uint32_t HeadLength; /* Length of *pHead body text */ + void *pTail; /* Prefix with *pTail body text */ + apr_uint32_t TailLength; /* Length of *pTail body text */ + apr_uint32_t dwFlags; /* bit flags described above */ +} HSE_TF_INFO; + +typedef struct HSE_URL_MAPEX_INFO { + char lpszPath[260]; + apr_uint32_t dwFlags; + apr_uint32_t cchMatchingPath; + apr_uint32_t cchMatchingURL; + apr_uint32_t dwReserved1; + apr_uint32_t dwReserved2; +} HSE_URL_MAPEX_INFO; + +/* Original ISAPI ServerSupportFunction() HSE_code methods */ +#define HSE_REQ_SEND_URL_REDIRECT_RESP 1 +#define HSE_REQ_SEND_URL 2 +#define HSE_REQ_SEND_RESPONSE_HEADER 3 +#define HSE_REQ_DONE_WITH_SESSION 4 + +/* MS Extented methods to ISAPI ServerSupportFunction() HSE_code */ +#define HSE_REQ_MAP_URL_TO_PATH 1001 /* Emulated */ +#define HSE_REQ_GET_SSPI_INFO 1002 /* Not Supported */ +#define HSE_APPEND_LOG_PARAMETER 1003 /* Supported */ +#define HSE_REQ_IO_COMPLETION 1005 /* Emulated */ +#define HSE_REQ_TRANSMIT_FILE 1006 /* Async Emulated */ +#define HSE_REQ_REFRESH_ISAPI_ACL 1007 /* Not Supported */ +#define HSE_REQ_IS_KEEP_CONN 1008 /* Supported */ +#define HSE_REQ_ASYNC_READ_CLIENT 1010 /* Emulated */ +/* Added with ISAPI 4.0 */ +#define HSE_REQ_GET_IMPERSONATION_TOKEN 1011 /* Not Supported */ +#define HSE_REQ_MAP_URL_TO_PATH_EX 1012 /* Emulated */ +#define HSE_REQ_ABORTIVE_CLOSE 1014 /* Ignored */ +/* Added after ISAPI 4.0 in IIS 5.0 */ +#define HSE_REQ_GET_CERT_INFO_EX 1015 /* Not Supported */ +#define HSE_REQ_SEND_RESPONSE_HEADER_EX 1016 /* Supported (no nulls!) */ +#define HSE_REQ_CLOSE_CONNECTION 1017 /* Ignored */ +#define HSE_REQ_IS_CONNECTED 1018 /* Supported */ +#define HSE_REQ_EXTENSION_TRIGGER 1020 /* Not Supported */ + +/* The request entry point that must be exported by every ISAPI handler + */ +apr_uint32_t APR_THREAD_FUNC HttpExtensionProc(EXTENSION_CONTROL_BLOCK *ecb); +typedef apr_uint32_t (APR_THREAD_FUNC + *PFN_HTTPEXTENSIONPROC)(EXTENSION_CONTROL_BLOCK *ecb); + +/* Allowable return values from HttpExtensionProc (apparently 0 is also + * accepted by MS IIS, and we will respect it as Success.) + * If the HttpExtensionProc returns HSE_STATUS_PENDING, we will create + * a wait mutex and lock on it, until HSE_REQ_DONE_WITH_SESSION is called. + */ +#define HSE_STATUS_SUCCESS 1 +#define HSE_STATUS_SUCCESS_AND_KEEP_CONN 2 /* 1 vs 2 Ignored, we choose */ +#define HSE_STATUS_PENDING 3 /* Emulated (thread lock) */ +#define HSE_STATUS_ERROR 4 + +/* Anticipated error code for common faults within mod_isapi itself + */ +#ifndef ERROR_INSUFFICIENT_BUFFER +#define ERROR_INSUFFICIENT_BUFFER ENOBUFS +#endif +#ifndef ERROR_INVALID_INDEX +#define ERROR_INVALID_INDEX EINVAL +#endif +#ifndef ERROR_INVALID_PARAMETER +#define ERROR_INVALID_PARAMETER EINVAL +#endif +#ifndef ERROR_READ_FAULT +#define ERROR_READ_FAULT EIO +#endif +#ifndef ERROR_WRITE_FAULT +#define ERROR_WRITE_FAULT EIO +#endif +#ifndef ERROR_SUCCESS +#define ERROR_SUCCESS 0 +#endif + +/* Valid flags passed with TerminateExtension() + */ +#define HSE_TERM_MUST_UNLOAD 1 +#define HSE_TERM_ADVISORY_UNLOAD 2 + +/* The shutdown entry point óptionally exported by an ISAPI handler, passed + * HSE_TERM_MUST_UNLOAD or HSE_TERM_ADVISORY_UNLOAD. The module may return + * if passed HSE_TERM_ADVISORY_UNLOAD, and the module will remain loaded. + * If the module returns 1 to HSE_TERM_ADVISORY_UNLOAD it is immediately + * unloaded. If the module is passed HSE_TERM_MUST_UNLOAD, its return value + * is ignored. + */ +int APR_THREAD_FUNC TerminateExtension(apr_uint32_t flags); +typedef int (APR_THREAD_FUNC *PFN_TERMINATEEXTENSION)(apr_uint32_t flags); + +/* Module may return 0 if passed HSE_TERM_ADVISORY_UNLOAD, and the module + * will remain loaded, or 1 if it consents to being unloaded. If the module + * is passed HSE_TERM_MUST_UNLOAD, it's return value is ignored. + */ +#define HSE_TERM_MUST_UNLOAD 1 +#define HSE_TERM_ADVISORY_UNLOAD 2 + +#ifdef __cplusplus +} +#endif + +#endif /* !MOD_ISAPI_H */ +/** @} */ + diff --git a/rubbos/app/httpd-2.0.64/modules/arch/win32/mod_win32.c b/rubbos/app/httpd-2.0.64/modules/arch/win32/mod_win32.c new file mode 100644 index 00000000..38b7b3b0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/arch/win32/mod_win32.c @@ -0,0 +1,553 @@ +/* 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. + */ + +#ifdef WIN32 + +#include "apr_strings.h" +#include "apr_portable.h" +#include "apr_buckets.h" +#include "ap_config.h" +#include "httpd.h" +#include "http_config.h" +#include "http_core.h" +#include "http_protocol.h" +#include "http_request.h" +#include "http_log.h" +#include "util_script.h" +#include "mod_core.h" +#include "mod_cgi.h" +#include "apr_lib.h" +#include "ap_regkey.h" + +extern OSVERSIONINFO osver; /* hiding in mpm_winnt.c */ +static int win_nt; + +/* + * CGI Script stuff for Win32... + */ +typedef enum { eFileTypeUNKNOWN, eFileTypeBIN, eFileTypeEXE16, eFileTypeEXE32, + eFileTypeSCRIPT } file_type_e; +typedef enum { INTERPRETER_SOURCE_UNSET, INTERPRETER_SOURCE_REGISTRY_STRICT, + INTERPRETER_SOURCE_REGISTRY, INTERPRETER_SOURCE_SHEBANG + } interpreter_source_e; +AP_DECLARE(file_type_e) ap_get_win32_interpreter(const request_rec *, + char **interpreter, + char **arguments); + +module AP_MODULE_DECLARE_DATA win32_module; + +typedef struct { + /* Where to find interpreter to run scripts */ + interpreter_source_e script_interpreter_source; +} win32_dir_conf; + +static void *create_win32_dir_config(apr_pool_t *p, char *dir) +{ + win32_dir_conf *conf; + conf = (win32_dir_conf*)apr_palloc(p, sizeof(win32_dir_conf)); + conf->script_interpreter_source = INTERPRETER_SOURCE_UNSET; + return conf; +} + +static void *merge_win32_dir_configs(apr_pool_t *p, void *basev, void *addv) +{ + win32_dir_conf *new; + win32_dir_conf *base = (win32_dir_conf *) basev; + win32_dir_conf *add = (win32_dir_conf *) addv; + + new = (win32_dir_conf *) apr_pcalloc(p, sizeof(win32_dir_conf)); + new->script_interpreter_source = (add->script_interpreter_source + != INTERPRETER_SOURCE_UNSET) + ? add->script_interpreter_source + : base->script_interpreter_source; + return new; +} + +static const char *set_interpreter_source(cmd_parms *cmd, void *dv, + char *arg) +{ + win32_dir_conf *d = (win32_dir_conf *)dv; + if (!strcasecmp(arg, "registry")) { + d->script_interpreter_source = INTERPRETER_SOURCE_REGISTRY; + } + else if (!strcasecmp(arg, "registry-strict")) { + d->script_interpreter_source = INTERPRETER_SOURCE_REGISTRY_STRICT; + } + else if (!strcasecmp(arg, "script")) { + d->script_interpreter_source = INTERPRETER_SOURCE_SHEBANG; + } + else { + return apr_pstrcat(cmd->temp_pool, "ScriptInterpreterSource \"", arg, + "\" must be \"registry\", \"registry-strict\" or " + "\"script\"", NULL); + } + return NULL; +} + +/* XXX: prep_string should translate the string into unicode, + * such that it is compatible with whatever codepage the client + * will read characters 80-ff. For the moment, use the unicode + * values 0080-00ff. This isn't trivial, since the code page + * varies between msdos and Windows applications. + * For subsystem 2 [GUI] the default is the system Ansi CP. + * For subsystem 3 [CLI] the default is the system OEM CP. + */ +static void prep_string(const char ** str, apr_pool_t *p) +{ + const char *ch = *str; + char *ch2; + int widen = 0; + + if (!ch) { + return; + } + while (*ch) { + if (*(ch++) & 0x80) { + ++widen; + } + } + if (!widen) { + return; + } + widen += (ch - *str) + 1; + ch = *str; + *str = ch2 = apr_palloc(p, widen); + while (*ch) { + if (*ch & 0x80) { + /* sign extension won't hurt us here */ + *(ch2++) = 0xC0 | ((*ch >> 6) & 0x03); + *(ch2++) = 0x80 | (*(ch++) & 0x3f); + } + else { + *(ch2++) = *(ch++); + } + } + *(ch2++) = '\0'; +} + +/* Somewhat more exciting ... figure out where the registry has stashed the + * ExecCGI or Open command - it may be nested one level deep (or more???) + */ +static char* get_interpreter_from_win32_registry(apr_pool_t *p, + const char* ext, + int strict) +{ + apr_status_t rv; + ap_regkey_t *name_key = NULL; + ap_regkey_t *type_key; + ap_regkey_t *key; + char execcgi_path[] = "SHELL\\EXECCGI\\COMMAND"; + char execopen_path[] = "SHELL\\OPEN\\COMMAND"; + char *type_name; + char *buffer; + + if (!ext) { + return NULL; + } + /* + * Future optimization: + * When the registry is successfully searched, store the strings for + * interpreter and arguments in an ext hash to speed up subsequent look-ups + */ + + /* Open the key associated with the script filetype extension */ + rv = ap_regkey_open(&type_key, AP_REGKEY_CLASSES_ROOT, ext, APR_READ, p); + + if (rv != APR_SUCCESS) { + return NULL; + } + + /* Retrieve the name of the script filetype extension */ + rv = ap_regkey_value_get(&type_name, type_key, "", p); + + if (rv == APR_SUCCESS && type_name[0]) { + /* Open the key associated with the script filetype extension */ + rv = ap_regkey_open(&name_key, AP_REGKEY_CLASSES_ROOT, type_name, + APR_READ, p); + } + + /* Open the key for the script command path by: + * + * 1) the 'named' filetype key for ExecCGI/Command + * 2) the extension's type key for ExecCGI/Command + * + * and if the strict arg is false, then continue trying: + * + * 3) the 'named' filetype key for Open/Command + * 4) the extension's type key for Open/Command + */ + + if (name_key) { + if ((rv = ap_regkey_open(&key, name_key, execcgi_path, APR_READ, p)) + == APR_SUCCESS) { + rv = ap_regkey_value_get(&buffer, key, "", p); + ap_regkey_close(name_key); + } + } + + if (!name_key || (rv != APR_SUCCESS)) { + if ((rv = ap_regkey_open(&key, type_key, execcgi_path, APR_READ, p)) + == APR_SUCCESS) { + rv = ap_regkey_value_get(&buffer, key, "", p); + ap_regkey_close(type_key); + } + } + + if (!strict && name_key && (rv != APR_SUCCESS)) { + if ((rv = ap_regkey_open(&key, name_key, execopen_path, APR_READ, p)) + == APR_SUCCESS) { + rv = ap_regkey_value_get(&buffer, key, "", p); + ap_regkey_close(name_key); + } + } + + if (!strict && (rv != APR_SUCCESS)) { + if ((rv = ap_regkey_open(&key, type_key, execopen_path, APR_READ, p)) + == APR_SUCCESS) { + rv = ap_regkey_value_get(&buffer, key, "", p); + ap_regkey_close(type_key); + } + } + + if (name_key) { + ap_regkey_close(name_key); + } + + ap_regkey_close(type_key); + + if (rv != APR_SUCCESS || !buffer[0]) { + return NULL; + } + + return buffer; +} + + +static apr_array_header_t *split_argv(apr_pool_t *p, const char *interp, + const char *cgiprg, const char *cgiargs) +{ + apr_array_header_t *args = apr_array_make(p, 8, sizeof(char*)); + char *d = apr_palloc(p, strlen(interp)+1); + const char *ch = interp; + const char **arg; + int prgtaken = 0; + int argtaken = 0; + int inquo; + int sl; + + while (*ch) { + /* Skip on through Deep Space */ + if (apr_isspace(*ch)) { + ++ch; continue; + } + /* One Arg */ + if (((*ch == '$') || (*ch == '%')) && (*(ch + 1) == '*')) { + const char *cgiarg = cgiargs; + argtaken = 1; + for (;;) { + char *w = ap_getword_nulls(p, &cgiarg, '+'); + if (!*w) { + break; + } + ap_unescape_url(w); + if (win_nt) { + prep_string(&w, p); + } + arg = (const char**)apr_array_push(args); + *arg = ap_escape_shell_cmd(p, w); + } + ch += 2; + continue; + } + if (((*ch == '$') || (*ch == '%')) && (*(ch + 1) == '1')) { + /* Todo: Make short name!!! */ + prgtaken = 1; + arg = (const char**)apr_array_push(args); + if (*ch == '%') { + char *repl = apr_pstrdup(p, cgiprg); + *arg = repl; + while ((repl = strchr(repl, '/'))) { + *repl++ = '\\'; + } + } + else { + *arg = cgiprg; + } + ch += 2; + continue; + } + if ((*ch == '\"') && ((*(ch + 1) == '$') + || (*(ch + 1) == '%')) && (*(ch + 2) == '1') + && (*(ch + 3) == '\"')) { + prgtaken = 1; + arg = (const char**)apr_array_push(args); + if (*(ch + 1) == '%') { + char *repl = apr_pstrdup(p, cgiprg); + *arg = repl; + while ((repl = strchr(repl, '/'))) { + *repl++ = '\\'; + } + } + else { + *arg = cgiprg; + } + ch += 4; + continue; + } + arg = (const char**)apr_array_push(args); + *arg = d; + inquo = 0; + while (*ch) { + if (apr_isspace(*ch) && !inquo) { + ++ch; break; + } + /* Get 'em backslashes */ + for (sl = 0; *ch == '\\'; ++sl) { + *d++ = *ch++; + } + if (sl & 1) { + /* last unmatched '\' + '"' sequence is a '"' */ + if (*ch == '\"') { + *(d - 1) = *ch++; + } + continue; + } + if (*ch == '\"') { + /* '""' sequence within quotes is a '"' */ + if (*++ch == '\"' && inquo) { + *d++ = *ch++; continue; + } + /* Flip quote state */ + inquo = !inquo; + if (apr_isspace(*ch) && !inquo) { + ++ch; break; + } + /* All other '"'s are Munched */ + continue; + } + /* Anything else is, well, something else */ + *d++ = *ch++; + } + /* Term that arg, already pushed on args */ + *d++ = '\0'; + } + + if (!prgtaken) { + arg = (const char**)apr_array_push(args); + *arg = cgiprg; + } + + if (!argtaken) { + const char *cgiarg = cgiargs; + for (;;) { + char *w = ap_getword_nulls(p, &cgiarg, '+'); + if (!*w) { + break; + } + ap_unescape_url(w); + if (win_nt) { + prep_string(&w, p); + } + arg = (const char**)apr_array_push(args); + *arg = ap_escape_shell_cmd(p, w); + } + } + + arg = (const char**)apr_array_push(args); + *arg = NULL; + + return args; +} + + +static apr_status_t ap_cgi_build_command(const char **cmd, const char ***argv, + request_rec *r, apr_pool_t *p, + cgi_exec_info_t *e_info) +{ + const apr_array_header_t *elts_arr = apr_table_elts(r->subprocess_env); + const apr_table_entry_t *elts = (apr_table_entry_t *) elts_arr->elts; + const char *ext = NULL; + const char *interpreter = NULL; + win32_dir_conf *d; + apr_file_t *fh; + const char *args = ""; + int i; + + d = (win32_dir_conf *)ap_get_module_config(r->per_dir_config, + &win32_module); + + if (e_info->cmd_type) { + /* We have to consider that the client gets any QUERY_ARGS + * without any charset interpretation, use prep_string to + * create a string of the literal QUERY_ARGS bytes. + */ + *cmd = r->filename; + if (r->args && r->args[0] && !ap_strchr_c(r->args, '=')) { + args = r->args; + } + } + /* Handle the complete file name, we DON'T want to follow suexec, since + * an unrooted command is as predictable as shooting craps in Win32. + * Notice that unlike most mime extension parsing, we have to use the + * win32 parsing here, therefore the final extension is the only one + * we will consider. + */ + ext = strrchr(apr_filename_of_pathname(*cmd), '.'); + + /* If the file has an extension and it is not .com and not .exe and + * we've been instructed to search the registry, then do so. + * Let apr_proc_create do all of the .bat/.cmd dirty work. + */ + if (ext && (!strcasecmp(ext,".exe") || !strcasecmp(ext,".com") + || !strcasecmp(ext,".bat") || !strcasecmp(ext,".cmd"))) { + interpreter = ""; + } + if (!interpreter && ext + && (d->script_interpreter_source + == INTERPRETER_SOURCE_REGISTRY + || d->script_interpreter_source + == INTERPRETER_SOURCE_REGISTRY_STRICT)) { + /* Check the registry */ + int strict = (d->script_interpreter_source + == INTERPRETER_SOURCE_REGISTRY_STRICT); + interpreter = get_interpreter_from_win32_registry(r->pool, ext, + strict); + if (interpreter && e_info->cmd_type != APR_SHELLCMD) { + e_info->cmd_type = APR_PROGRAM_PATH; + } + else { + ap_log_error(APLOG_MARK, APLOG_INFO, 0, r->server, + strict ? "No ExecCGI verb found for files of type '%s'." + : "No ExecCGI or Open verb found for files of type '%s'.", + ext); + } + } + if (!interpreter) { + apr_status_t rv; + char buffer[1024]; + apr_size_t bytes = sizeof(buffer); + int i; + + /* Need to peek into the file figure out what it really is... + * ### aught to go back and build a cache for this one of these days. + */ + if (((rv = apr_file_open(&fh, *cmd, APR_READ | APR_BUFFERED, + APR_OS_DEFAULT, r->pool)) != APR_SUCCESS) + || ((rv = apr_file_read(fh, buffer, &bytes)) != APR_SUCCESS)) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + "Failed to read cgi file %s for testing", *cmd); + return rv; + } + apr_file_close(fh); + + /* Script or executable, that is the question... */ + if ((buffer[0] == '#') && (buffer[1] == '!')) { + /* Assuming file is a script since it starts with a shebang */ + for (i = 2; i < sizeof(buffer); i++) { + if ((buffer[i] == '\r') || (buffer[i] == '\n')) { + buffer[i] = '\0'; + break; + } + } + if (i < sizeof(buffer)) { + interpreter = buffer + 2; + while (apr_isspace(*interpreter)) { + ++interpreter; + } + if (e_info->cmd_type != APR_SHELLCMD) { + e_info->cmd_type = APR_PROGRAM_PATH; + } + } + } + else { + /* Not a script, is it an executable? */ + IMAGE_DOS_HEADER *hdr = (IMAGE_DOS_HEADER*)buffer; + if ((bytes >= sizeof(IMAGE_DOS_HEADER)) + && (hdr->e_magic == IMAGE_DOS_SIGNATURE)) { + if (hdr->e_lfarlc < 0x40) { + /* Ought to invoke this 16 bit exe by a stub, (cmd /c?) */ + interpreter = ""; + } + else { + interpreter = ""; + } + } + } + } + if (!interpreter) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "%s is not executable; ensure interpreted scripts have " + "\"#!\" first line", *cmd); + return APR_EBADF; + } + + *argv = (const char **)(split_argv(p, interpreter, *cmd, + args)->elts); + *cmd = (*argv)[0]; + + e_info->detached = 1; + + /* XXX: Must fix r->subprocess_env to follow utf-8 conventions from + * the client's octets so that win32 apr_proc_create is happy. + * The -best- way is to determine if the .exe is unicode aware + * (using 0x0080-0x00ff) or is linked as a command or windows + * application (following the OEM or Ansi code page in effect.) + */ + for (i = 0; i < elts_arr->nelts; ++i) { + if (win_nt && elts[i].key && *elts[i].key + && (strncmp(elts[i].key, "HTTP_", 5) == 0 + || strncmp(elts[i].key, "SERVER_", 7) == 0 + || strncmp(elts[i].key, "REQUEST_", 8) == 0 + || strcmp(elts[i].key, "QUERY_STRING") == 0 + || strcmp(elts[i].key, "PATH_INFO") == 0 + || strcmp(elts[i].key, "PATH_TRANSLATED") == 0)) { + prep_string((const char**) &elts[i].val, r->pool); + } + } + return APR_SUCCESS; +} + +static int win32_pre_config(apr_pool_t *pconf_, apr_pool_t *plog, apr_pool_t *ptemp) +{ + win_nt = (osver.dwPlatformId != VER_PLATFORM_WIN32_WINDOWS); + return OK; +} + +static void register_hooks(apr_pool_t *p) +{ + APR_REGISTER_OPTIONAL_FN(ap_cgi_build_command); + ap_hook_pre_config(win32_pre_config, NULL, NULL, APR_HOOK_MIDDLE); +} + +static const command_rec win32_cmds[] = { +AP_INIT_TAKE1("ScriptInterpreterSource", set_interpreter_source, NULL, + OR_FILEINFO, + "Where to find interpreter to run Win32 scripts " + "(Registry or script shebang line)"), +{ NULL } +}; + +module AP_MODULE_DECLARE_DATA win32_module = { + STANDARD20_MODULE_STUFF, + create_win32_dir_config, /* create per-dir config */ + merge_win32_dir_configs, /* merge per-dir config */ + NULL, /* server config */ + NULL, /* merge server config */ + win32_cmds, /* command apr_table_t */ + register_hooks /* register hooks */ +}; + +#endif /* defined WIN32 */ diff --git a/rubbos/app/httpd-2.0.64/modules/arch/win32/modules.mk b/rubbos/app/httpd-2.0.64/modules/arch/win32/modules.mk new file mode 100644 index 00000000..ceb52a1b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/arch/win32/modules.mk @@ -0,0 +1,3 @@ +DISTCLEAN_TARGETS = modules.mk +static = +shared = diff --git a/rubbos/app/httpd-2.0.64/modules/cache/.deps b/rubbos/app/httpd-2.0.64/modules/cache/.deps new file mode 100644 index 00000000..e69de29b diff --git a/rubbos/app/httpd-2.0.64/modules/cache/.indent.pro b/rubbos/app/httpd-2.0.64/modules/cache/.indent.pro new file mode 100644 index 00000000..a9fbe9f9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/cache/.indent.pro @@ -0,0 +1,54 @@ +-i4 -npsl -di0 -br -nce -d0 -cli0 -npcs -nfc1 +-TBUFF +-TFILE +-TTRANS +-TUINT4 +-T_trans +-Tallow_options_t +-Tapache_sfio +-Tarray_header +-Tbool_int +-Tbuf_area +-Tbuff_struct +-Tbuffy +-Tcmd_how +-Tcmd_parms +-Tcommand_rec +-Tcommand_struct +-Tconn_rec +-Tcore_dir_config +-Tcore_server_config +-Tdir_maker_func +-Tevent +-Tglobals_s +-Thandler_func +-Thandler_rec +-Tjoblist_s +-Tlisten_rec +-Tmerger_func +-Tmode_t +-Tmodule +-Tmodule_struct +-Tmutex +-Tn_long +-Tother_child_rec +-Toverrides_t +-Tparent_score +-Tpid_t +-Tpiped_log +-Tpool +-Trequest_rec +-Trequire_line +-Trlim_t +-Tscoreboard +-Tsemaphore +-Tserver_addr_rec +-Tserver_rec +-Tserver_rec_chain +-Tshort_score +-Ttable +-Ttable_entry +-Tthread +-Tu_wide_int +-Tvtime_t +-Twide_int diff --git a/rubbos/app/httpd-2.0.64/modules/cache/Makefile b/rubbos/app/httpd-2.0.64/modules/cache/Makefile new file mode 100644 index 00000000..8baae947 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/cache/Makefile @@ -0,0 +1,8 @@ +top_srcdir = /bottlenecks/rubbos/app/httpd-2.0.64 +top_builddir = /bottlenecks/rubbos/app/httpd-2.0.64 +srcdir = /bottlenecks/rubbos/app/httpd-2.0.64/modules/cache +builddir = /bottlenecks/rubbos/app/httpd-2.0.64/modules/cache +VPATH = /bottlenecks/rubbos/app/httpd-2.0.64/modules/cache + +include $(top_srcdir)/build/special.mk + diff --git a/rubbos/app/httpd-2.0.64/modules/cache/Makefile.in b/rubbos/app/httpd-2.0.64/modules/cache/Makefile.in new file mode 100644 index 00000000..167b343d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/cache/Makefile.in @@ -0,0 +1,3 @@ + +include $(top_srcdir)/build/special.mk + diff --git a/rubbos/app/httpd-2.0.64/modules/cache/config.m4 b/rubbos/app/httpd-2.0.64/modules/cache/config.m4 new file mode 100644 index 00000000..9eabf541 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/cache/config.m4 @@ -0,0 +1,11 @@ +dnl modules enabled in this directory by default + +dnl APACHE_MODULE(name, helptext[, objects[, structname[, default[, config]]]]) + +APACHE_MODPATH_INIT(cache) + +APACHE_MODULE(file_cache, File cache, , , no) + +APR_ADDTO(LT_LDFLAGS,-export-dynamic) + +APACHE_MODPATH_FINISH diff --git a/rubbos/app/httpd-2.0.64/modules/cache/mod_file_cache.c b/rubbos/app/httpd-2.0.64/modules/cache/mod_file_cache.c new file mode 100644 index 00000000..947b8f2c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/cache/mod_file_cache.c @@ -0,0 +1,416 @@ +/* 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. + */ + +/* + * Author: mod_file_cache by Bill Stoddard + * Based on mod_mmap_static by Dean Gaudet + * + * v0.01: initial implementation + */ + +/* + Documentation: + + Some sites have a set of static files that are really busy, and + change infrequently (or even on a regular schedule). Save time + by caching open handles to these files. This module, unlike + mod_mmap_static, caches open file handles, not file content. + On systems (like Windows) with heavy system call overhead and + that have an efficient sendfile implementation, caching file handles + offers several advantages over caching content. First, the file system + can manage the memory, allowing infrequently hit cached files to + be paged out. Second, since caching open handles does not consume + significant resources, it will be possible to enable an AutoLoadCache + feature where static files are dynamically loaded in the cache + as the server runs. On systems that have file change notification, + this module can be enhanced to automatically garbage collect + cached files that change on disk. + + This module should work on Unix systems that have sendfile. Place + cachefile directives into your configuration to direct files to + be cached. + + cachefile /path/to/file1 + cachefile /path/to/file2 + ... + + These files are only cached when the server is restarted, so if you + change the list, or if the files are changed, then you'll need to + restart the server. + + To reiterate that point: if the files are modified *in place* + without restarting the server you may end up serving requests that + are completely bogus. You should update files by unlinking the old + copy and putting a new copy in place. + + There's no such thing as inheriting these files across vhosts or + whatever... place the directives in the main server only. + + Known problems: + + Don't use Alias or RewriteRule to move these files around... unless + you feel like paying for an extra stat() on each request. This is + a deficiency in the Apache API that will hopefully be solved some day. + The file will be served out of the file handle cache, but there will be + an extra stat() that's a waste. +*/ + +#include "apr.h" + +#if !(APR_HAS_SENDFILE || APR_HAS_MMAP) +#error mod_file_cache only works on systems with APR_HAS_SENDFILE or APR_HAS_MMAP +#endif + +#include "apr_mmap.h" +#include "apr_strings.h" +#include "apr_hash.h" +#include "apr_buckets.h" + +#define APR_WANT_STRFUNC +#include "apr_want.h" + +#if APR_HAVE_SYS_TYPES_H +#include +#endif + +#define CORE_PRIVATE + +#include "httpd.h" +#include "http_config.h" +#include "http_log.h" +#include "http_protocol.h" +#include "http_request.h" +#include "http_core.h" + +module AP_MODULE_DECLARE_DATA file_cache_module; + +typedef struct { +#if APR_HAS_SENDFILE + apr_file_t *file; +#endif + const char *filename; + apr_finfo_t finfo; + int is_mmapped; +#if APR_HAS_MMAP + apr_mmap_t *mm; +#endif + char mtimestr[APR_RFC822_DATE_LEN]; + char sizestr[21]; /* big enough to hold any 64-bit file size + null */ +} a_file; + +typedef struct { + apr_hash_t *fileht; +} a_server_config; + + +static void *create_server_config(apr_pool_t *p, server_rec *s) +{ + a_server_config *sconf = apr_palloc(p, sizeof(*sconf)); + + sconf->fileht = apr_hash_make(p); + return sconf; +} + +static void cache_the_file(cmd_parms *cmd, const char *filename, int mmap) +{ + a_server_config *sconf; + a_file *new_file; + a_file tmp; + apr_file_t *fd = NULL; + apr_status_t rc; + const char *fspec; + + fspec = ap_server_root_relative(cmd->pool, filename); + if (!fspec) { + ap_log_error(APLOG_MARK, APLOG_WARNING, APR_EBADPATH, cmd->server, + "mod_file_cache: invalid file path " + "%s, skipping", filename); + return; + } + if ((rc = apr_stat(&tmp.finfo, fspec, APR_FINFO_MIN, + cmd->temp_pool)) != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_WARNING, rc, cmd->server, + "mod_file_cache: unable to stat(%s), skipping", fspec); + return; + } + if (tmp.finfo.filetype != APR_REG) { + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, cmd->server, + "mod_file_cache: %s isn't a regular file, skipping", fspec); + return; + } + if (tmp.finfo.size > AP_MAX_SENDFILE) { + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, cmd->server, + "mod_file_cache: %s is too large to cache, skipping", fspec); + return; + } + + rc = apr_file_open(&fd, fspec, APR_READ | APR_BINARY | APR_XTHREAD, + APR_OS_DEFAULT, cmd->pool); + if (rc != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_WARNING, rc, cmd->server, + "mod_file_cache: unable to open(%s, O_RDONLY), skipping", fspec); + return; + } + apr_file_inherit_set(fd); + + /* WooHoo, we have a file to put in the cache */ + new_file = apr_pcalloc(cmd->pool, sizeof(a_file)); + new_file->finfo = tmp.finfo; + +#if APR_HAS_MMAP + if (mmap) { + /* MMAPFile directive. MMAP'ing the file + * XXX: APR_HAS_LARGE_FILES issue; need to reject this request if + * size is greater than MAX(apr_size_t) (perhaps greater than 1M?). + */ + if ((rc = apr_mmap_create(&new_file->mm, fd, 0, + (apr_size_t)new_file->finfo.size, + APR_MMAP_READ, cmd->pool)) != APR_SUCCESS) { + apr_file_close(fd); + ap_log_error(APLOG_MARK, APLOG_WARNING, rc, cmd->server, + "mod_file_cache: unable to mmap %s, skipping", filename); + return; + } + apr_file_close(fd); + new_file->is_mmapped = TRUE; + } +#endif +#if APR_HAS_SENDFILE + if (!mmap) { + /* CacheFile directive. Caching the file handle */ + new_file->is_mmapped = FALSE; + new_file->file = fd; + } +#endif + + new_file->filename = fspec; + apr_rfc822_date(new_file->mtimestr, new_file->finfo.mtime); + apr_snprintf(new_file->sizestr, sizeof new_file->sizestr, "%" APR_OFF_T_FMT, new_file->finfo.size); + + sconf = ap_get_module_config(cmd->server->module_config, &file_cache_module); + apr_hash_set(sconf->fileht, new_file->filename, strlen(new_file->filename), new_file); +} + +static const char *cachefilehandle(cmd_parms *cmd, void *dummy, const char *filename) +{ +#if APR_HAS_SENDFILE + cache_the_file(cmd, filename, 0); +#else + /* Sendfile not supported by this OS */ + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, cmd->server, + "mod_file_cache: unable to cache file: %s. Sendfile is not supported on this OS", filename); +#endif + return NULL; +} +static const char *cachefilemmap(cmd_parms *cmd, void *dummy, const char *filename) +{ +#if APR_HAS_MMAP + cache_the_file(cmd, filename, 1); +#else + /* MMAP not supported by this OS */ + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, cmd->server, + "mod_file_cache: unable to cache file: %s. MMAP is not supported by this OS", filename); +#endif + return NULL; +} + +static int file_cache_post_config(apr_pool_t *p, apr_pool_t *plog, + apr_pool_t *ptemp, server_rec *s) +{ + /* Hummm, anything to do here? */ + return OK; +} + +/* If it's one of ours, fill in r->finfo now to avoid extra stat()... this is a + * bit of a kludge, because we really want to run after core_translate runs. + */ +static int file_cache_xlat(request_rec *r) +{ + a_server_config *sconf; + a_file *match; + int res; + + sconf = ap_get_module_config(r->server->module_config, &file_cache_module); + + /* we only operate when at least one cachefile directive was used */ + if (!apr_hash_count(sconf->fileht)) { + return DECLINED; + } + + res = ap_core_translate(r); + if (res != OK || !r->filename) { + return res; + } + + /* search the cache */ + match = (a_file *) apr_hash_get(sconf->fileht, r->filename, APR_HASH_KEY_STRING); + if (match == NULL) + return DECLINED; + + /* pass search results to handler */ + ap_set_module_config(r->request_config, &file_cache_module, match); + + /* shortcircuit the get_path_info() stat() calls and stuff */ + r->finfo = match->finfo; + return OK; +} + +static int mmap_handler(request_rec *r, a_file *file) +{ +#if APR_HAS_MMAP + conn_rec *c = r->connection; + apr_bucket *b; + apr_mmap_t *mm; + apr_bucket_brigade *bb = apr_brigade_create(r->pool, c->bucket_alloc); + + apr_mmap_dup(&mm, file->mm, r->pool, 0); + b = apr_bucket_mmap_create(mm, 0, (apr_size_t)file->finfo.size, + c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, b); + b = apr_bucket_eos_create(c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, b); + + if (ap_pass_brigade(r->output_filters, bb) != APR_SUCCESS) + return HTTP_INTERNAL_SERVER_ERROR; +#endif + return OK; +} + +static int sendfile_handler(request_rec *r, a_file *file) +{ +#if APR_HAS_SENDFILE + conn_rec *c = r->connection; + apr_bucket *b; + apr_bucket_brigade *bb = apr_brigade_create(r->pool, c->bucket_alloc); + + b = apr_bucket_file_create(file->file, 0, (apr_size_t)file->finfo.size, + r->pool, c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, b); + b = apr_bucket_eos_create(c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, b); + + if (ap_pass_brigade(r->output_filters, bb) != APR_SUCCESS) + return HTTP_INTERNAL_SERVER_ERROR; +#endif + return OK; +} + +static int file_cache_handler(request_rec *r) +{ + a_file *match; + int errstatus; + int rc = OK; + + /* XXX: not sure if this is right yet + * see comment in http_core.c:default_handler + */ + if (ap_strcmp_match(r->handler, "*/*")) { + return DECLINED; + } + + /* we don't handle anything but GET */ + if (r->method_number != M_GET) return DECLINED; + + /* did xlat phase find the file? */ + match = ap_get_module_config(r->request_config, &file_cache_module); + + if (match == NULL) { + return DECLINED; + } + + /* note that we would handle GET on this resource */ + r->allowed |= (AP_METHOD_BIT << M_GET); + + /* This handler has no use for a request body (yet), but we still + * need to read and discard it if the client sent one. + */ + if ((errstatus = ap_discard_request_body(r)) != OK) + return errstatus; + + ap_update_mtime(r, match->finfo.mtime); + + /* ap_set_last_modified() always converts the file mtime to a string + * which is slow. Accelerate the common case. + * ap_set_last_modified(r); + */ + { + apr_time_t mod_time; + char *datestr; + + mod_time = ap_rationalize_mtime(r, r->mtime); + if (mod_time == match->finfo.mtime) + datestr = match->mtimestr; + else { + datestr = apr_palloc(r->pool, APR_RFC822_DATE_LEN); + apr_rfc822_date(datestr, mod_time); + } + apr_table_setn(r->headers_out, "Last-Modified", datestr); + } + + ap_set_etag(r); + if ((errstatus = ap_meets_conditions(r)) != OK) { + return errstatus; + } + + /* ap_set_content_length() always converts the same number and never + * returns an error. Accelerate it. + */ + r->clength = match->finfo.size; + apr_table_setn(r->headers_out, "Content-Length", match->sizestr); + + /* Call appropriate handler */ + if (!r->header_only) { + if (match->is_mmapped == TRUE) + rc = mmap_handler(r, match); + else + rc = sendfile_handler(r, match); + } + + return rc; +} + +static command_rec file_cache_cmds[] = +{ +AP_INIT_ITERATE("cachefile", cachefilehandle, NULL, RSRC_CONF, + "A space separated list of files to add to the file handle cache at config time"), +AP_INIT_ITERATE("mmapfile", cachefilemmap, NULL, RSRC_CONF, + "A space separated list of files to mmap at config time"), + {NULL} +}; + +static void register_hooks(apr_pool_t *p) +{ + ap_hook_handler(file_cache_handler, NULL, NULL, APR_HOOK_LAST); + ap_hook_post_config(file_cache_post_config, NULL, NULL, APR_HOOK_MIDDLE); + ap_hook_translate_name(file_cache_xlat, NULL, NULL, APR_HOOK_MIDDLE); + /* This trick doesn't work apparently because the translate hooks + are single shot. If the core_hook returns OK, then our hook is + not called. + ap_hook_translate_name(file_cache_xlat, aszPre, NULL, APR_HOOK_MIDDLE); + */ + +} + +module AP_MODULE_DECLARE_DATA file_cache_module = +{ + STANDARD20_MODULE_STUFF, + NULL, /* create per-directory config structure */ + NULL, /* merge per-directory config structures */ + create_server_config, /* create per-server config structure */ + NULL, /* merge per-server config structures */ + file_cache_cmds, /* command handlers */ + register_hooks /* register hooks */ +}; diff --git a/rubbos/app/httpd-2.0.64/modules/cache/mod_file_cache.dsp b/rubbos/app/httpd-2.0.64/modules/cache/mod_file_cache.dsp new file mode 100644 index 00000000..83d2a7b4 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/cache/mod_file_cache.dsp @@ -0,0 +1,128 @@ +# Microsoft Developer Studio Project File - Name="mod_file_cache" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=mod_file_cache - 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 "mod_file_cache.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 "mod_file_cache.mak" CFG="mod_file_cache - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "mod_file_cache - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_file_cache - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "mod_file_cache - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_file_cache_src" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL" +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL" +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 /nologo /subsystem:windows /dll /out:"Release/mod_file_cache.so" /base:@..\..\os\win32\BaseAddr.ref,mod_file_cache.so +# ADD LINK32 /nologo /subsystem:windows /dll /incremental:no /debug /out:"Release/mod_file_cache.so" /base:@..\..\os\win32\BaseAddr.ref,mod_file_cache.so /opt:ref + +!ELSEIF "$(CFG)" == "mod_file_cache - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_file_cache_src" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL" +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL" +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_file_cache.so" /base:@..\..\os\win32\BaseAddr.ref,mod_file_cache.so +# ADD LINK32 /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_file_cache.so" /base:@..\..\os\win32\BaseAddr.ref,mod_file_cache.so + +!ENDIF + +# Begin Target + +# Name "mod_file_cache - Win32 Release" +# Name "mod_file_cache - Win32 Debug" +# Begin Source File + +SOURCE=.\mod_file_cache.c +# End Source File +# Begin Source File + +SOURCE=.\mod_file_cache.rc +# End Source File +# Begin Source File + +SOURCE=..\..\build\win32\win32ver.awk + +!IF "$(CFG)" == "mod_file_cache - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_file_cache.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_file_cache.so "file_cache_module for Apache" ../../include/ap_release.h > .\mod_file_cache.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "mod_file_cache - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_file_cache.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_file_cache.so "file_cache_module for Apache" ../../include/ap_release.h > .\mod_file_cache.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/modules/cache/mod_file_cache.exp b/rubbos/app/httpd-2.0.64/modules/cache/mod_file_cache.exp new file mode 100644 index 00000000..23b092a6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/cache/mod_file_cache.exp @@ -0,0 +1 @@ +file_cache_module diff --git a/rubbos/app/httpd-2.0.64/modules/cache/modules.mk b/rubbos/app/httpd-2.0.64/modules/cache/modules.mk new file mode 100644 index 00000000..ceb52a1b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/cache/modules.mk @@ -0,0 +1,3 @@ +DISTCLEAN_TARGETS = modules.mk +static = +shared = diff --git a/rubbos/app/httpd-2.0.64/modules/config5.m4 b/rubbos/app/httpd-2.0.64/modules/config5.m4 new file mode 100644 index 00000000..5e38c951 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/config5.m4 @@ -0,0 +1,56 @@ +AC_MSG_CHECKING(for extra modules) +AC_ARG_WITH(module, + APACHE_HELP_STRING(--with-module=module-type:module-file, + Enable module-file in the modules/ directory.), + [ + as_save_IFS="$IFS"; IFS="," + 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" + libname="mod_$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($modpath_current/Makefile) + done + if test ! -z "$EXTRA_MODLIST"; then + AC_MSG_RESULT(added:$EXTRA_MODLIST) + fi + IFS="$as_save_IFS" + ], + [ AC_MSG_RESULT(none) + ]) diff --git a/rubbos/app/httpd-2.0.64/modules/dav/fs/.deps b/rubbos/app/httpd-2.0.64/modules/dav/fs/.deps new file mode 100644 index 00000000..e69de29b diff --git a/rubbos/app/httpd-2.0.64/modules/dav/fs/Makefile b/rubbos/app/httpd-2.0.64/modules/dav/fs/Makefile new file mode 100644 index 00000000..11144e34 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/dav/fs/Makefile @@ -0,0 +1,8 @@ +top_srcdir = /bottlenecks/rubbos/app/httpd-2.0.64 +top_builddir = /bottlenecks/rubbos/app/httpd-2.0.64 +srcdir = /bottlenecks/rubbos/app/httpd-2.0.64/modules/dav/fs +builddir = /bottlenecks/rubbos/app/httpd-2.0.64/modules/dav/fs +VPATH = /bottlenecks/rubbos/app/httpd-2.0.64/modules/dav/fs +# a modules Makefile has no explicit targets -- they will be defined by +# whatever modules are enabled. just grab special.mk to deal with this. +include $(top_srcdir)/build/special.mk diff --git a/rubbos/app/httpd-2.0.64/modules/dav/fs/Makefile.in b/rubbos/app/httpd-2.0.64/modules/dav/fs/Makefile.in new file mode 100644 index 00000000..7c5c149d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/dav/fs/Makefile.in @@ -0,0 +1,3 @@ +# a modules Makefile has no explicit targets -- they will be defined by +# whatever modules are enabled. just grab special.mk to deal with this. +include $(top_srcdir)/build/special.mk diff --git a/rubbos/app/httpd-2.0.64/modules/dav/fs/NWGNUmakefile b/rubbos/app/httpd-2.0.64/modules/dav/fs/NWGNUmakefile new file mode 100644 index 00000000..1569be42 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/dav/fs/NWGNUmakefile @@ -0,0 +1,266 @@ +# +# Declare the sub-directories to be built here +# + +SUBDIRS = \ + $(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 \ + $(AP_WORK)/include \ + $(AP_WORK)/modules/dav/main \ + $(AP_WORK)/server/mpm/NetWare \ + $(NWOS) \ + $(EOLIST) + +# +# These flags will come after CFLAGS +# +XCFLAGS += \ + $(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 = modDAVFS + +# +# This is used by the link '-desc ' directive. +# If left blank, NLM_NAME will be used. +# +NLM_DESCRIPTION = Apache $(VERSION_STR) DAV FileSystem Sub-Module + +# +# This is used by the '-threadname' directive. If left blank, +# NLM_NAME Thread will be used. +# +NLM_THREAD_NAME = modDAVFS Thread + +# +# 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 = _LibCPrelude + +# +# If this is specified it will be used by the link '-exit' directive +# +NLM_EXIT_SYM = _LibCPostlude + +# +# If this is specified it will be used by the link '-check' directive +# +NLM_CHECK_SYM = + +# +# If this is specified it will be used by the link '-flags' directive +# +NLM_FLAGS = AUTOUNLOAD, PSEUDOPREEMPTION + +# +# Declare all target files (you must add your files here) +# + +# +# If there is an NLM target, put it here +# +TARGET_nlm = \ + $(OBJDIR)/moddavfs.nlm \ + $(EOLIST) + +# +# If there is an LIB target, put it here +# +TARGET_lib = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the NLM target above. +# Paths must all use the '/' character +# +FILES_nlm_objs = \ + $(OBJDIR)/mod_dav_fs.o \ + $(OBJDIR)/dbm.o \ + $(OBJDIR)/lock.o \ + $(OBJDIR)/repos.o \ + $(OBJDIR)/libprews.o \ + $(EOLIST) + +# +# 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 = \ + libcpre.o \ + $(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 = \ + Apache2 \ + Libc \ + mod_dav \ + $(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 = \ + @libc.imp \ + @$(APR)/aprlib.imp \ + @httpd.imp \ + @ws2nlm.imp \ + @../main/dav.imp \ + $(EOLIST) + +# +# Any symbols exported to here +# +FILES_nlm_exports = \ + dav_fs_module \ + $(EOLIST) + +# +# These are the OBJ files needed to create the LIB target above. +# Paths must all use the '/' character +# +FILES_lib_objs = \ + $(EOLIST) + +# +# 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) +# +install :: nlms FORCE + copy $(OBJDIR)\moddavfs.nlm $(INSTALL)\Apache2\modules +# +# Any specialized rules here +# + +$(OBJDIR)/%.o: ../../arch/netware/%.c $(OBJDIR)\$(NLM_NAME)_cc.opt + @echo compiling $< + $(CC) $< -o=$(OBJDIR)\$(@F) @$(OBJDIR)\$(NLM_NAME)_cc.opt + +# +# Include the 'tail' makefile that has targets that depend on variables defined +# in this makefile +# + +include $(AP_WORK)\build\NWGNUtail.inc + + diff --git a/rubbos/app/httpd-2.0.64/modules/dav/fs/config6.m4 b/rubbos/app/httpd-2.0.64/modules/dav/fs/config6.m4 new file mode 100644 index 00000000..515111cd --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/dav/fs/config6.m4 @@ -0,0 +1,23 @@ +dnl modules enabled in this directory by default + +APACHE_MODPATH_INIT(dav/fs) + +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 + +APACHE_MODULE(dav_fs, DAV provider for the filesystem, $dav_fs_objects, , $dav_fs_enable) + +APACHE_MODPATH_FINISH diff --git a/rubbos/app/httpd-2.0.64/modules/dav/fs/dbm.c b/rubbos/app/httpd-2.0.64/modules/dav/fs/dbm.c new file mode 100644 index 00000000..a772a75d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/dav/fs/dbm.c @@ -0,0 +1,753 @@ +/* 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. + */ + +/* +** DAV extension module for Apache 2.0.* +** - Database support using DBM-style databases, +** part of the filesystem repository implementation +*/ + +/* +** This implementation uses a SDBM database per file and directory to +** record the properties. These databases are kept in a subdirectory (of +** the directory in question or the directory that holds the file in +** question) named by the macro DAV_FS_STATE_DIR (.DAV). The filename of the +** database is equivalent to the target filename, and is +** DAV_FS_STATE_FILE_FOR_DIR (.state_for_dir) for the directory itself. +*/ + +#include "apr_strings.h" +#include "apr_file_io.h" + +#include "apr_dbm.h" + +#define APR_WANT_BYTEFUNC +#include "apr_want.h" /* for ntohs and htons */ + +#include "mod_dav.h" +#include "repos.h" + + +struct dav_db { + apr_pool_t *pool; + apr_dbm_t *file; + + /* when used as a property database: */ + + int version; /* *minor* version of this db */ + + dav_buffer ns_table; /* table of namespace URIs */ + short ns_count; /* number of entries in table */ + int ns_table_dirty; /* ns_table was modified */ + apr_hash_t *uri_index; /* map URIs to (1-based) table indices */ + + dav_buffer wb_key; /* work buffer for dav_gdbm_key */ + + apr_datum_t iter; /* iteration key */ +}; + +/* ------------------------------------------------------------------------- + * + * GENERIC DBM ACCESS + * + * For the most part, this just uses the APR DBM functions. They are wrapped + * a bit with some error handling (using the mod_dav error functions). + */ + +void dav_dbm_get_statefiles(apr_pool_t *p, const char *fname, + const char **state1, const char **state2) +{ + if (fname == NULL) + fname = DAV_FS_STATE_FILE_FOR_DIR; + + apr_dbm_get_usednames(p, fname, state1, state2); +} + +static dav_error * dav_fs_dbm_error(dav_db *db, apr_pool_t *p, + apr_status_t status) +{ + int save_errno = errno; + int errcode; + const char *errstr; + dav_error *err; + char errbuf[200]; + + if (status == APR_SUCCESS) + return NULL; + + p = db ? db->pool : p; + + /* There might not be a if we had problems creating it. */ + if (db == NULL) { + errcode = 1; + errstr = "Could not open property database."; + } + else { + (void) apr_dbm_geterror(db->file, &errcode, errbuf, sizeof(errbuf)); + errstr = apr_pstrdup(p, errbuf); + } + + err = dav_new_error(p, HTTP_INTERNAL_SERVER_ERROR, errcode, errstr); + err->save_errno = save_errno; + return err; +} + +/* ensure that our state subdirectory is present */ +/* ### does this belong here or in dav_fs_repos.c ?? */ +void dav_fs_ensure_state_dir(apr_pool_t * p, const char *dirname) +{ + const char *pathname = apr_pstrcat(p, dirname, "/" DAV_FS_STATE_DIR, NULL); + + /* ### do we need to deal with the umask? */ + + /* just try to make it, ignoring any resulting errors */ + (void) apr_dir_make(pathname, APR_OS_DEFAULT, p); +} + +/* dav_dbm_open_direct: Opens a *dbm database specified by path. + * ro = boolean read-only flag. + */ +dav_error * dav_dbm_open_direct(apr_pool_t *p, const char *pathname, int ro, + dav_db **pdb) +{ + apr_status_t status; + apr_dbm_t *file; + + *pdb = NULL; + + if ((status = apr_dbm_open(&file, pathname, + ro ? APR_DBM_READONLY : APR_DBM_RWCREATE, + APR_OS_DEFAULT, p)) + != APR_SUCCESS + && !ro) { + /* ### do something with 'status' */ + + /* we can't continue if we couldn't open the file + and we need to write */ + return dav_fs_dbm_error(NULL, p, status); + } + + /* may be NULL if we tried to open a non-existent db as read-only */ + if (file != NULL) { + /* we have an open database... return it */ + *pdb = apr_pcalloc(p, sizeof(**pdb)); + (*pdb)->pool = p; + (*pdb)->file = file; + } + + return NULL; +} + +static dav_error * dav_dbm_open(apr_pool_t * p, const dav_resource *resource, + int ro, dav_db **pdb) +{ + const char *dirpath; + const char *fname; + const char *pathname; + + /* Get directory and filename for resource */ + /* ### should test this result value... */ + (void) dav_fs_dir_file_name(resource, &dirpath, &fname); + + /* If not opening read-only, ensure the state dir exists */ + if (!ro) { + /* ### what are the perf implications of always checking this? */ + dav_fs_ensure_state_dir(p, dirpath); + } + + pathname = apr_pstrcat(p, dirpath, "/" DAV_FS_STATE_DIR "/", + fname ? fname : DAV_FS_STATE_FILE_FOR_DIR, + NULL); + + /* ### readers cannot open while a writer has this open; we should + ### perform a few retries with random pauses. */ + + /* ### do we need to deal with the umask? */ + + return dav_dbm_open_direct(p, pathname, ro, pdb); +} + +void dav_dbm_close(dav_db *db) +{ + apr_dbm_close(db->file); +} + +dav_error * dav_dbm_fetch(dav_db *db, apr_datum_t key, apr_datum_t *pvalue) +{ + apr_status_t status = apr_dbm_fetch(db->file, key, pvalue); + + return dav_fs_dbm_error(db, NULL, status); +} + +dav_error * dav_dbm_store(dav_db *db, apr_datum_t key, apr_datum_t value) +{ + apr_status_t status = apr_dbm_store(db->file, key, value); + + return dav_fs_dbm_error(db, NULL, status); +} + +dav_error * dav_dbm_delete(dav_db *db, apr_datum_t key) +{ + apr_status_t status = apr_dbm_delete(db->file, key); + + return dav_fs_dbm_error(db, NULL, status); +} + +int dav_dbm_exists(dav_db *db, apr_datum_t key) +{ + return apr_dbm_exists(db->file, key); +} + +static dav_error * dav_dbm_firstkey(dav_db *db, apr_datum_t *pkey) +{ + apr_status_t status = apr_dbm_firstkey(db->file, pkey); + + return dav_fs_dbm_error(db, NULL, status); +} + +static dav_error * dav_dbm_nextkey(dav_db *db, apr_datum_t *pkey) +{ + apr_status_t status = apr_dbm_nextkey(db->file, pkey); + + return dav_fs_dbm_error(db, NULL, status); +} + +void dav_dbm_freedatum(dav_db *db, apr_datum_t data) +{ + apr_dbm_freedatum(db->file, data); +} + +/* ------------------------------------------------------------------------- + * + * PROPERTY DATABASE FUNCTIONS + */ + + +#define DAV_GDBM_NS_KEY "METADATA" +#define DAV_GDBM_NS_KEY_LEN 8 + +typedef struct { + unsigned char major; +#define DAV_DBVSN_MAJOR 4 + /* + ** V4 -- 0.9.9 .. + ** Prior versions could have keys or values with invalid + ** namespace prefixes as a result of the xmlns="" form not + ** resetting the default namespace to be "no namespace". The + ** namespace would be set to "" which is invalid; it should + ** be set to "no namespace". + ** + ** V3 -- 0.9.8 + ** Prior versions could have values with invalid namespace + ** prefixes due to an incorrect mapping of input to propdb + ** namespace indices. Version bumped to obsolete the old + ** values. + ** + ** V2 -- 0.9.7 + ** This introduced the xml:lang value into the property value's + ** record in the propdb. + ** + ** V1 -- .. 0.9.6 + ** Initial version. + */ + + + unsigned char minor; +#define DAV_DBVSN_MINOR 0 + + short ns_count; + +} dav_propdb_metadata; + +struct dav_deadprop_rollback { + apr_datum_t key; + apr_datum_t value; +}; + +struct dav_namespace_map { + int *ns_map; +}; + +/* +** Internal function to build a key +** +** WARNING: returns a pointer to a "static" buffer holding the key. The +** value must be copied or no longer used if this function is +** called again. +*/ +static apr_datum_t dav_build_key(dav_db *db, const dav_prop_name *name) +{ + char nsbuf[20]; + apr_size_t l_ns, l_name = strlen(name->name); + apr_datum_t key = { 0 }; + + /* + * Convert namespace ID to a string. "no namespace" is an empty string, + * so the keys will have the form ":name". Otherwise, the keys will + * have the form "#:name". + */ + if (*name->ns == '\0') { + nsbuf[0] = '\0'; + l_ns = 0; + } + else { + int ns_id = (int)apr_hash_get(db->uri_index, name->ns, + APR_HASH_KEY_STRING); + + + if (ns_id == 0) { + /* the namespace was not found(!) */ + return key; /* zeroed */ + } + + l_ns = sprintf(nsbuf, "%d", ns_id - 1); + } + + /* assemble: #:name */ + dav_set_bufsize(db->pool, &db->wb_key, l_ns + 1 + l_name + 1); + memcpy(db->wb_key.buf, nsbuf, l_ns); + db->wb_key.buf[l_ns] = ':'; + memcpy(&db->wb_key.buf[l_ns + 1], name->name, l_name + 1); + + /* build the database key */ + key.dsize = l_ns + 1 + l_name + 1; + key.dptr = db->wb_key.buf; + + return key; +} + +static void dav_append_prop(apr_pool_t *pool, + const char *name, const char *value, + apr_text_header *phdr) +{ + const char *s; + const char *lang = value; + + /* skip past the xml:lang value */ + value += strlen(lang) + 1; + + if (*value == '\0') { + /* the property is an empty value */ + if (*name == ':') { + /* "no namespace" case */ + s = apr_psprintf(pool, "<%s/>" DEBUG_CR, name+1); + } + else { + s = apr_psprintf(pool, "" DEBUG_CR, name); + } + } + else if (*lang != '\0') { + if (*name == ':') { + /* "no namespace" case */ + s = apr_psprintf(pool, "<%s xml:lang=\"%s\">%s" DEBUG_CR, + name+1, lang, value, name+1); + } + else { + s = apr_psprintf(pool, "%s" DEBUG_CR, + name, lang, value, name); + } + } + else if (*name == ':') { + /* "no namespace" case */ + s = apr_psprintf(pool, "<%s>%s" DEBUG_CR, name+1, value, name+1); + } + else { + s = apr_psprintf(pool, "%s" DEBUG_CR, name, value, name); + } + + apr_text_append(pool, phdr, s); +} + +static dav_error * dav_propdb_open(apr_pool_t *pool, + const dav_resource *resource, int ro, + dav_db **pdb) +{ + dav_db *db; + dav_error *err; + apr_datum_t key; + apr_datum_t value = { 0 }; + + *pdb = NULL; + + /* + ** Return if an error occurred, or there is no database. + ** + ** NOTE: db could be NULL if we attempted to open a readonly + ** database that doesn't exist. If we require read/write + ** access, then a database was created and opened. + */ + if ((err = dav_dbm_open(pool, resource, ro, &db)) != NULL + || db == NULL) + return err; + + db->uri_index = apr_hash_make(pool); + + key.dptr = DAV_GDBM_NS_KEY; + key.dsize = DAV_GDBM_NS_KEY_LEN; + if ((err = dav_dbm_fetch(db, key, &value)) != NULL) { + /* ### push a higher-level description? */ + return err; + } + + if (value.dptr == NULL) { + dav_propdb_metadata m = { + DAV_DBVSN_MAJOR, DAV_DBVSN_MINOR, 0 + }; + + /* + ** If there is no METADATA key, then the database may be + ** from versions 0.9.0 .. 0.9.4 (which would be incompatible). + ** These can be identified by the presence of an NS_TABLE entry. + */ + key.dptr = "NS_TABLE"; + key.dsize = 8; + if (dav_dbm_exists(db, key)) { + dav_dbm_close(db); + + /* call it a major version error */ + return dav_new_error(pool, HTTP_INTERNAL_SERVER_ERROR, + DAV_ERR_PROP_BAD_MAJOR, + "Prop database has the wrong major " + "version number and cannot be used."); + } + + /* initialize a new metadata structure */ + dav_set_bufsize(pool, &db->ns_table, sizeof(m)); + memcpy(db->ns_table.buf, &m, sizeof(m)); + } + else { + dav_propdb_metadata m; + int ns; + const char *uri; + + dav_set_bufsize(pool, &db->ns_table, value.dsize); + memcpy(db->ns_table.buf, value.dptr, value.dsize); + + memcpy(&m, value.dptr, sizeof(m)); + if (m.major != DAV_DBVSN_MAJOR) { + dav_dbm_close(db); + + return dav_new_error(pool, HTTP_INTERNAL_SERVER_ERROR, + DAV_ERR_PROP_BAD_MAJOR, + "Prop database has the wrong major " + "version number and cannot be used."); + } + db->version = m.minor; + db->ns_count = ntohs(m.ns_count); + + dav_dbm_freedatum(db, value); + + /* create db->uri_index */ + for (ns = 0, uri = db->ns_table.buf + sizeof(dav_propdb_metadata); + ns++ < db->ns_count; + uri += strlen(uri) + 1) { + + /* we must copy the key, in case ns_table.buf moves */ + apr_hash_set(db->uri_index, + apr_pstrdup(pool, uri), APR_HASH_KEY_STRING, + (void *)ns); + } + } + + *pdb = db; + return NULL; +} + +static void dav_propdb_close(dav_db *db) +{ + + if (db->ns_table_dirty) { + dav_propdb_metadata m; + apr_datum_t key; + apr_datum_t value; + dav_error *err; + + key.dptr = DAV_GDBM_NS_KEY; + key.dsize = DAV_GDBM_NS_KEY_LEN; + + value.dptr = db->ns_table.buf; + value.dsize = db->ns_table.cur_len; + + /* fill in the metadata that we store into the prop db. */ + m.major = DAV_DBVSN_MAJOR; + m.minor = db->version; /* ### keep current minor version? */ + m.ns_count = htons(db->ns_count); + + memcpy(db->ns_table.buf, &m, sizeof(m)); + + err = dav_dbm_store(db, key, value); + /* ### what to do with the error? */ + } + + dav_dbm_close(db); +} + +static dav_error * dav_propdb_define_namespaces(dav_db *db, dav_xmlns_info *xi) +{ + int ns; + const char *uri = db->ns_table.buf + sizeof(dav_propdb_metadata); + + /* within the prop values, we use "ns%d" for prefixes... register them */ + for (ns = 0; ns < db->ns_count; ++ns, uri += strlen(uri) + 1) { + + /* Empty URIs signify the empty namespace. These do not get a + namespace prefix. when we generate the value, we will simply + leave off the prefix, which is defined by mod_dav to be the + empty namespace. */ + if (*uri == '\0') + continue; + + /* ns_table.buf can move, so copy its value (we want the values to + last as long as the provided dav_xmlns_info). */ + dav_xmlns_add(xi, + apr_psprintf(xi->pool, "ns%d", ns), + apr_pstrdup(xi->pool, uri)); + } + + return NULL; +} + +static dav_error * dav_propdb_output_value(dav_db *db, + const dav_prop_name *name, + dav_xmlns_info *xi, + apr_text_header *phdr, + int *found) +{ + apr_datum_t key = dav_build_key(db, name); + apr_datum_t value; + dav_error *err; + + if ((err = dav_dbm_fetch(db, key, &value)) != NULL) + return err; + if (value.dptr == NULL) { + *found = 0; + return NULL; + } + *found = 1; + + dav_append_prop(db->pool, key.dptr, value.dptr, phdr); + + dav_dbm_freedatum(db, value); + + return NULL; +} + +static dav_error * dav_propdb_map_namespaces( + dav_db *db, + const apr_array_header_t *namespaces, + dav_namespace_map **mapping) +{ + dav_namespace_map *m = apr_palloc(db->pool, sizeof(*m)); + int i; + int *pmap; + const char **puri; + + /* + ** Iterate over the provided namespaces. If a namespace already appears + ** in our internal map of URI -> ns_id, then store that in the map. If + ** we don't know the namespace yet, then add it to the map and to our + ** table of known namespaces. + */ + m->ns_map = pmap = apr_palloc(db->pool, namespaces->nelts * sizeof(*pmap)); + for (i = namespaces->nelts, puri = (const char **)namespaces->elts; + i-- > 0; + ++puri, ++pmap) { + + const char *uri = *puri; + apr_size_t uri_len = strlen(uri); + int ns_id = (int)apr_hash_get(db->uri_index, uri, uri_len); + + if (ns_id == 0) { + dav_check_bufsize(db->pool, &db->ns_table, uri_len + 1); + memcpy(db->ns_table.buf + db->ns_table.cur_len, uri, uri_len + 1); + db->ns_table.cur_len += uri_len + 1; + + /* copy the uri in case the passed-in namespaces changes in + some way. */ + apr_hash_set(db->uri_index, apr_pstrdup(db->pool, uri), uri_len, + (void *)(db->ns_count + 1)); + + db->ns_table_dirty = 1; + + *pmap = db->ns_count++; + } + else { + *pmap = ns_id - 1; + } + } + + *mapping = m; + return NULL; +} + +static dav_error * dav_propdb_store(dav_db *db, const dav_prop_name *name, + const apr_xml_elem *elem, + dav_namespace_map *mapping) +{ + apr_datum_t key = dav_build_key(db, name); + apr_datum_t value; + + /* Note: mapping->ns_map was set up in dav_propdb_map_namespaces() */ + + /* ### use a db- subpool for these values? clear on exit? */ + + /* quote all the values in the element */ + /* ### be nice to do this without affecting the element itself */ + /* ### of course, the cast indicates Badness is occurring here */ + apr_xml_quote_elem(db->pool, (apr_xml_elem *)elem); + + /* generate a text blob for the xml:lang plus the contents */ + apr_xml_to_text(db->pool, elem, APR_XML_X2T_LANG_INNER, NULL, + mapping->ns_map, + (const char **)&value.dptr, &value.dsize); + + return dav_dbm_store(db, key, value); +} + +static dav_error * dav_propdb_remove(dav_db *db, const dav_prop_name *name) +{ + apr_datum_t key = dav_build_key(db, name); + return dav_dbm_delete(db, key); +} + +static int dav_propdb_exists(dav_db *db, const dav_prop_name *name) +{ + apr_datum_t key = dav_build_key(db, name); + return dav_dbm_exists(db, key); +} + +static const char *dav_get_ns_table_uri(dav_db *db, int ns_id) +{ + const char *p = db->ns_table.buf + sizeof(dav_propdb_metadata); + + while (ns_id--) + p += strlen(p) + 1; + + return p; +} + +static void dav_set_name(dav_db *db, dav_prop_name *pname) +{ + const char *s = db->iter.dptr; + + if (s == NULL) { + pname->ns = pname->name = NULL; + } + else if (*s == ':') { + pname->ns = ""; + pname->name = s + 1; + } + else { + int id = atoi(s); + + pname->ns = dav_get_ns_table_uri(db, id); + if (s[1] == ':') { + pname->name = s + 2; + } + else { + pname->name = ap_strchr_c(s + 2, ':') + 1; + } + } +} + +static dav_error * dav_propdb_next_name(dav_db *db, dav_prop_name *pname) +{ + dav_error *err; + + /* free the previous key. note: if the loop is aborted, then the DBM + will toss the key (via pool cleanup) */ + if (db->iter.dptr != NULL) + dav_dbm_freedatum(db, db->iter); + + if ((err = dav_dbm_nextkey(db, &db->iter)) != NULL) + return err; + + /* skip past the METADATA key */ + if (db->iter.dptr != NULL && *db->iter.dptr == 'M') + return dav_propdb_next_name(db, pname); + + dav_set_name(db, pname); + return NULL; +} + +static dav_error * dav_propdb_first_name(dav_db *db, dav_prop_name *pname) +{ + dav_error *err; + + if ((err = dav_dbm_firstkey(db, &db->iter)) != NULL) + return err; + + /* skip past the METADATA key */ + if (db->iter.dptr != NULL && *db->iter.dptr == 'M') + return dav_propdb_next_name(db, pname); + + dav_set_name(db, pname); + return NULL; +} + +static dav_error * dav_propdb_get_rollback(dav_db *db, + const dav_prop_name *name, + dav_deadprop_rollback **prollback) +{ + dav_deadprop_rollback *rb = apr_pcalloc(db->pool, sizeof(*rb)); + apr_datum_t key; + apr_datum_t value; + dav_error *err; + + key = dav_build_key(db, name); + rb->key.dptr = apr_pstrdup(db->pool, key.dptr); + rb->key.dsize = key.dsize; + + if ((err = dav_dbm_fetch(db, key, &value)) != NULL) + return err; + if (value.dptr != NULL) { + rb->value.dptr = apr_pmemdup(db->pool, value.dptr, value.dsize); + rb->value.dsize = value.dsize; + } + + *prollback = rb; + return NULL; +} + +static dav_error * dav_propdb_apply_rollback(dav_db *db, + dav_deadprop_rollback *rollback) +{ + if (rollback->value.dptr == NULL) { + /* don't fail if the thing isn't really there. */ + (void) dav_dbm_delete(db, rollback->key); + return NULL; + } + + return dav_dbm_store(db, rollback->key, rollback->value); +} + +const dav_hooks_db dav_hooks_db_dbm = +{ + dav_propdb_open, + dav_propdb_close, + dav_propdb_define_namespaces, + dav_propdb_output_value, + dav_propdb_map_namespaces, + dav_propdb_store, + dav_propdb_remove, + dav_propdb_exists, + dav_propdb_first_name, + dav_propdb_next_name, + dav_propdb_get_rollback, + dav_propdb_apply_rollback, + + NULL /* ctx */ +}; diff --git a/rubbos/app/httpd-2.0.64/modules/dav/fs/lock.c b/rubbos/app/httpd-2.0.64/modules/dav/fs/lock.c new file mode 100644 index 00000000..20780e15 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/dav/fs/lock.c @@ -0,0 +1,1517 @@ +/* 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. + */ + +/* +** DAV filesystem lock implementation +*/ + +#include "apr.h" +#include "apr_strings.h" +#include "apr_file_io.h" +#include "apr_uuid.h" + +#define APR_WANT_MEMFUNC +#include "apr_want.h" + +#include "httpd.h" +#include "http_log.h" + +#include "mod_dav.h" +#include "repos.h" + + +/* --------------------------------------------------------------- +** +** Lock database primitives +** +*/ + +/* +** LOCK DATABASES +** +** Lockdiscovery information is stored in the single lock database specified +** by the DAVLockDB directive. Information about this db is stored in the +** global server configuration. +** +** KEY +** +** The database is keyed by a key_type unsigned char (DAV_TYPE_INODE or +** DAV_TYPE_FNAME) followed by inode and device number if possible, +** otherwise full path (in the case of Win32 or lock-null resources). +** +** VALUE +** +** The value consists of a list of elements. +** DIRECT LOCK: [char (DAV_LOCK_DIRECT), +** char (dav_lock_scope), +** char (dav_lock_type), +** int depth, +** time_t expires, +** apr_uuid_t locktoken, +** char[] owner, +** char[] auth_user] +** +** INDIRECT LOCK: [char (DAV_LOCK_INDIRECT), +** apr_uuid_t locktoken, +** time_t expires, +** apr_size_t key_size, +** char[] key] +** The key is to the collection lock that resulted in this indirect lock +*/ + +#define DAV_TRUE 1 +#define DAV_FALSE 0 + +#define DAV_CREATE_LIST 23 +#define DAV_APPEND_LIST 24 + +/* Stored lock_discovery prefix */ +#define DAV_LOCK_DIRECT 1 +#define DAV_LOCK_INDIRECT 2 + +#define DAV_TYPE_INODE 10 +#define DAV_TYPE_FNAME 11 + + +/* ack. forward declare. */ +static dav_error * dav_fs_remove_locknull_member(apr_pool_t *p, + const char *filename, + dav_buffer *pbuf); + +/* +** Use the opaquelock scheme for locktokens +*/ +struct dav_locktoken { + apr_uuid_t uuid; +}; +#define dav_compare_locktoken(plt1, plt2) \ + memcmp(&(plt1)->uuid, &(plt2)->uuid, sizeof((plt1)->uuid)) + + +/* ################################################################# +** ### keep these structures (internal) or move fully to dav_lock? +*/ + +/* +** We need to reliably size the fixed-length portion of +** dav_lock_discovery; best to separate it into another +** struct for a convenient sizeof, unless we pack lock_discovery. +*/ +typedef struct dav_lock_discovery_fixed +{ + char scope; + char type; + int depth; + time_t timeout; +} dav_lock_discovery_fixed; + +typedef struct dav_lock_discovery +{ + struct dav_lock_discovery_fixed f; + + dav_locktoken *locktoken; + const char *owner; /* owner field from activelock */ + const char *auth_user; /* authenticated user who created the lock */ + struct dav_lock_discovery *next; +} dav_lock_discovery; + +/* Indirect locks represent locks inherited from containing collections. + * They reference the lock token for the collection the lock is + * inherited from. A lock provider may also define a key to the + * inherited lock, for fast datbase lookup. The key is opaque outside + * the lock provider. + */ +typedef struct dav_lock_indirect +{ + dav_locktoken *locktoken; + apr_datum_t key; + struct dav_lock_indirect *next; + time_t timeout; +} dav_lock_indirect; + +/* ################################################################# */ + + +/* +** Stored direct lock info - full lock_discovery length: +** prefix + Fixed length + lock token + 2 strings + 2 nulls (one for each string) +*/ +#define dav_size_direct(a) (1 + sizeof(dav_lock_discovery_fixed) \ + + sizeof(apr_uuid_t) \ + + ((a)->owner ? strlen((a)->owner) : 0) \ + + ((a)->auth_user ? strlen((a)->auth_user) : 0) \ + + 2) + +/* Stored indirect lock info - lock token and apr_datum_t */ +#define dav_size_indirect(a) (1 + sizeof(apr_uuid_t) \ + + sizeof(time_t) \ + + sizeof((a)->key.dsize) + (a)->key.dsize) + +/* +** The lockdb structure. +** +** The field may be NULL, meaning one of two things: +** 1) That we have not actually opened the underlying database (yet). The +** field should be false. +** 2) We opened it readonly and it wasn't present. +** +** The delayed opening (determined by ) makes creating a lockdb +** quick, while deferring the underlying I/O until it is actually required. +** +** We export the notion of a lockdb, but hide the details of it. Most +** implementations will use a database of some kind, but it is certainly +** possible that alternatives could be used. +*/ +struct dav_lockdb_private +{ + request_rec *r; /* for accessing the uuid state */ + apr_pool_t *pool; /* a pool to use */ + const char *lockdb_path; /* where is the lock database? */ + + int opened; /* we opened the database */ + dav_db *db; /* if non-NULL, the lock database */ +}; +typedef struct +{ + dav_lockdb pub; + dav_lockdb_private priv; +} dav_lockdb_combined; + +/* +** The private part of the lock structure. +*/ +struct dav_lock_private +{ + apr_datum_t key; /* key into the lock database */ +}; +typedef struct +{ + dav_lock pub; + dav_lock_private priv; + dav_locktoken token; +} dav_lock_combined; + +/* +** This must be forward-declared so the open_lockdb function can use it. +*/ +extern const dav_hooks_locks dav_hooks_locks_fs; + + +/* internal function for creating locks */ +static dav_lock *dav_fs_alloc_lock(dav_lockdb *lockdb, apr_datum_t key, + const dav_locktoken *locktoken) +{ + dav_lock_combined *comb; + + comb = apr_pcalloc(lockdb->info->pool, sizeof(*comb)); + comb->pub.rectype = DAV_LOCKREC_DIRECT; + comb->pub.info = &comb->priv; + comb->priv.key = key; + + if (locktoken == NULL) { + comb->pub.locktoken = &comb->token; + apr_uuid_get(&comb->token.uuid); + } + else { + comb->pub.locktoken = locktoken; + } + + return &comb->pub; +} + +/* +** dav_fs_parse_locktoken +** +** Parse an opaquelocktoken URI into a locktoken. +*/ +static dav_error * dav_fs_parse_locktoken( + apr_pool_t *p, + const char *char_token, + dav_locktoken **locktoken_p) +{ + dav_locktoken *locktoken; + + if (ap_strstr_c(char_token, "opaquelocktoken:") != char_token) { + return dav_new_error(p, + HTTP_BAD_REQUEST, DAV_ERR_LOCK_UNK_STATE_TOKEN, + "The lock token uses an unknown State-token " + "format and could not be parsed."); + } + char_token += 16; + + locktoken = apr_pcalloc(p, sizeof(*locktoken)); + if (apr_uuid_parse(&locktoken->uuid, char_token)) { + return dav_new_error(p, HTTP_BAD_REQUEST, DAV_ERR_LOCK_PARSE_TOKEN, + "The opaquelocktoken has an incorrect format " + "and could not be parsed."); + } + + *locktoken_p = locktoken; + return NULL; +} + +/* +** dav_fs_format_locktoken +** +** Generate the URI for a locktoken +*/ +static const char *dav_fs_format_locktoken( + apr_pool_t *p, + const dav_locktoken *locktoken) +{ + char buf[APR_UUID_FORMATTED_LENGTH + 1]; + + apr_uuid_format(buf, &locktoken->uuid); + return apr_pstrcat(p, "opaquelocktoken:", buf, NULL); +} + +/* +** dav_fs_compare_locktoken +** +** Determine whether two locktokens are the same +*/ +static int dav_fs_compare_locktoken( + const dav_locktoken *lt1, + const dav_locktoken *lt2) +{ + return dav_compare_locktoken(lt1, lt2); +} + +/* +** dav_fs_really_open_lockdb: +** +** If the database hasn't been opened yet, then open the thing. +*/ +static dav_error * dav_fs_really_open_lockdb(dav_lockdb *lockdb) +{ + dav_error *err; + + if (lockdb->info->opened) + return NULL; + + err = dav_dbm_open_direct(lockdb->info->pool, + lockdb->info->lockdb_path, + lockdb->ro, + &lockdb->info->db); + if (err != NULL) { + return dav_push_error(lockdb->info->pool, + HTTP_INTERNAL_SERVER_ERROR, + DAV_ERR_LOCK_OPENDB, + "Could not open the lock database.", + err); + } + + /* all right. it is opened now. */ + lockdb->info->opened = 1; + + return NULL; +} + +/* +** dav_fs_open_lockdb: +** +** "open" the lock database, as specified in the global server configuration. +** If force is TRUE, then the database is opened now, rather than lazily. +** +** Note that only one can be open read/write. +*/ +static dav_error * dav_fs_open_lockdb(request_rec *r, int ro, int force, + dav_lockdb **lockdb) +{ + dav_lockdb_combined *comb; + + comb = apr_pcalloc(r->pool, sizeof(*comb)); + comb->pub.hooks = &dav_hooks_locks_fs; + comb->pub.ro = ro; + comb->pub.info = &comb->priv; + comb->priv.r = r; + comb->priv.pool = r->pool; + + comb->priv.lockdb_path = dav_get_lockdb_path(r); + if (comb->priv.lockdb_path == NULL) { + return dav_new_error(r->pool, HTTP_INTERNAL_SERVER_ERROR, + DAV_ERR_LOCK_NO_DB, + "A lock database was not specified with the " + "DAVLockDB directive. One must be specified " + "to use the locking functionality."); + } + + /* done initializing. return it. */ + *lockdb = &comb->pub; + + if (force) { + /* ### add a higher-level comment? */ + return dav_fs_really_open_lockdb(*lockdb); + } + + return NULL; +} + +/* +** dav_fs_close_lockdb: +** +** Close it. Duh. +*/ +static void dav_fs_close_lockdb(dav_lockdb *lockdb) +{ + if (lockdb->info->db != NULL) + dav_dbm_close(lockdb->info->db); +} + +/* +** dav_fs_build_fname_key +** +** Given a pathname, build a DAV_TYPE_FNAME lock database key. +*/ +static apr_datum_t dav_fs_build_fname_key(apr_pool_t *p, const char *pathname) +{ + apr_datum_t key; + + /* ### does this allocation have a proper lifetime? need to check */ + /* ### can we use a buffer for this? */ + + /* size is TYPE + pathname + null */ + key.dsize = strlen(pathname) + 2; + key.dptr = apr_palloc(p, key.dsize); + *key.dptr = DAV_TYPE_FNAME; + memcpy(key.dptr + 1, pathname, key.dsize - 1); + if (key.dptr[key.dsize - 2] == '/') + key.dptr[--key.dsize - 1] = '\0'; + return key; +} + +/* +** dav_fs_build_key: Given a resource, return a apr_datum_t key +** to look up lock information for this file. +** +** (inode/dev not supported or file is lock-null): +** apr_datum_t->dvalue = full path +** +** (inode/dev supported and file exists ): +** apr_datum_t->dvalue = inode, dev +*/ +static apr_datum_t dav_fs_build_key(apr_pool_t *p, + const dav_resource *resource) +{ + const char *file = dav_fs_pathname(resource); + apr_datum_t key; + apr_finfo_t finfo; + apr_status_t rv; + + /* ### use lstat() ?? */ + /* + * XXX: What for platforms with no IDENT (dev/inode)? + */ + rv = apr_stat(&finfo, file, APR_FINFO_IDENT, p); + if ((rv == APR_SUCCESS || rv == APR_INCOMPLETE) + && ((finfo.valid & APR_FINFO_IDENT) == APR_FINFO_IDENT)) + { + /* ### can we use a buffer for this? */ + key.dsize = 1 + sizeof(finfo.inode) + sizeof(finfo.device); + key.dptr = apr_palloc(p, key.dsize); + *key.dptr = DAV_TYPE_INODE; + memcpy(key.dptr + 1, &finfo.inode, sizeof(finfo.inode)); + memcpy(key.dptr + 1 + sizeof(finfo.inode), &finfo.device, + sizeof(finfo.device)); + + return key; + } + + return dav_fs_build_fname_key(p, file); +} + +/* +** dav_fs_lock_expired: return 1 (true) if the given timeout is in the past +** or present (the lock has expired), or 0 (false) if in the future +** (the lock has not yet expired). +*/ +static int dav_fs_lock_expired(time_t expires) +{ + return expires != DAV_TIMEOUT_INFINITE && time(NULL) >= expires; +} + +/* +** dav_fs_save_lock_record: Saves the lock information specified in the +** direct and indirect lock lists about path into the lock database. +** If direct and indirect == NULL, the key is removed. +*/ +static dav_error * dav_fs_save_lock_record(dav_lockdb *lockdb, apr_datum_t key, + dav_lock_discovery *direct, + dav_lock_indirect *indirect) +{ + dav_error *err; + apr_datum_t val = { 0 }; + char *ptr; + dav_lock_discovery *dp = direct; + dav_lock_indirect *ip = indirect; + +#if DAV_DEBUG + if (lockdb->ro) { + return dav_new_error(lockdb->info->pool, + HTTP_INTERNAL_SERVER_ERROR, 0, + "INTERNAL DESIGN ERROR: the lockdb was opened " + "readonly, but an attempt to save locks was " + "performed."); + } +#endif + + if ((err = dav_fs_really_open_lockdb(lockdb)) != NULL) { + /* ### add a higher-level error? */ + return err; + } + + /* If nothing to save, delete key */ + if (dp == NULL && ip == NULL) { + /* don't fail if the key is not present */ + /* ### but what about other errors? */ + (void) dav_dbm_delete(lockdb->info->db, key); + return NULL; + } + + while(dp) { + val.dsize += dav_size_direct(dp); + dp = dp->next; + } + while(ip) { + val.dsize += dav_size_indirect(ip); + ip = ip->next; + } + + /* ### can this be apr_palloc() ? */ + /* ### hmmm.... investigate the use of a buffer here */ + ptr = val.dptr = apr_pcalloc(lockdb->info->pool, val.dsize); + dp = direct; + ip = indirect; + + while(dp) { + *ptr++ = DAV_LOCK_DIRECT; /* Direct lock - lock_discovery struct follows */ + memcpy(ptr, dp, sizeof(dp->f)); /* Fixed portion of struct */ + ptr += sizeof(dp->f); + memcpy(ptr, dp->locktoken, sizeof(*dp->locktoken)); + ptr += sizeof(*dp->locktoken); + if (dp->owner == NULL) { + *ptr++ = '\0'; + } + else { + memcpy(ptr, dp->owner, strlen(dp->owner) + 1); + ptr += strlen(dp->owner) + 1; + } + if (dp->auth_user == NULL) { + *ptr++ = '\0'; + } + else { + memcpy(ptr, dp->auth_user, strlen(dp->auth_user) + 1); + ptr += strlen(dp->auth_user) + 1; + } + + dp = dp->next; + } + + while(ip) { + *ptr++ = DAV_LOCK_INDIRECT; /* Indirect lock prefix */ + memcpy(ptr, ip->locktoken, sizeof(*ip->locktoken)); /* Locktoken */ + ptr += sizeof(*ip->locktoken); + memcpy(ptr, &ip->timeout, sizeof(ip->timeout)); /* Expire time */ + ptr += sizeof(ip->timeout); + memcpy(ptr, &ip->key.dsize, sizeof(ip->key.dsize)); /* Size of key */ + ptr += sizeof(ip->key.dsize); + memcpy(ptr, ip->key.dptr, ip->key.dsize); /* Key data */ + ptr += ip->key.dsize; + ip = ip->next; + } + + if ((err = dav_dbm_store(lockdb->info->db, key, val)) != NULL) { + /* ### more details? add an error_id? */ + return dav_push_error(lockdb->info->pool, + HTTP_INTERNAL_SERVER_ERROR, + DAV_ERR_LOCK_SAVE_LOCK, + "Could not save lock information.", + err); + } + + return NULL; +} + +/* +** dav_load_lock_record: Reads lock information about key from lock db; +** creates linked lists of the direct and indirect locks. +** +** If add_method = DAV_APPEND_LIST, the result will be appended to the +** head of the direct and indirect lists supplied. +** +** Passive lock removal: If lock has timed out, it will not be returned. +** ### How much "logging" does RFC 2518 require? +*/ +static dav_error * dav_fs_load_lock_record(dav_lockdb *lockdb, apr_datum_t key, + int add_method, + dav_lock_discovery **direct, + dav_lock_indirect **indirect) +{ + apr_pool_t *p = lockdb->info->pool; + dav_error *err; + apr_size_t offset = 0; + int need_save = DAV_FALSE; + apr_datum_t val = { 0 }; + dav_lock_discovery *dp; + dav_lock_indirect *ip; + dav_buffer buf = { 0 }; + + if (add_method != DAV_APPEND_LIST) { + *direct = NULL; + *indirect = NULL; + } + + if ((err = dav_fs_really_open_lockdb(lockdb)) != NULL) { + /* ### add a higher-level error? */ + return err; + } + + /* + ** If we opened readonly and the db wasn't there, then there are no + ** locks for this resource. Just exit. + */ + if (lockdb->info->db == NULL) + return NULL; + + if ((err = dav_dbm_fetch(lockdb->info->db, key, &val)) != NULL) + return err; + + if (!val.dsize) + return NULL; + + while (offset < val.dsize) { + switch (*(val.dptr + offset++)) { + case DAV_LOCK_DIRECT: + /* Create and fill a dav_lock_discovery structure */ + + dp = apr_pcalloc(p, sizeof(*dp)); + memcpy(dp, val.dptr + offset, sizeof(dp->f)); + offset += sizeof(dp->f); + dp->locktoken = apr_palloc(p, sizeof(*dp->locktoken)); + memcpy(dp->locktoken, val.dptr + offset, sizeof(*dp->locktoken)); + offset += sizeof(*dp->locktoken); + if (*(val.dptr + offset) == '\0') { + ++offset; + } + else { + dp->owner = apr_pstrdup(p, val.dptr + offset); + offset += strlen(dp->owner) + 1; + } + + if (*(val.dptr + offset) == '\0') { + ++offset; + } + else { + dp->auth_user = apr_pstrdup(p, val.dptr + offset); + offset += strlen(dp->auth_user) + 1; + } + + if (!dav_fs_lock_expired(dp->f.timeout)) { + dp->next = *direct; + *direct = dp; + } + else { + need_save = DAV_TRUE; + + /* Remove timed-out locknull fm .locknull list */ + if (*key.dptr == DAV_TYPE_FNAME) { + const char *fname = key.dptr + 1; + apr_finfo_t finfo; + apr_status_t rv; + + /* if we don't see the file, then it's a locknull */ + rv = apr_lstat(&finfo, fname, APR_FINFO_MIN, p); + if (rv != APR_SUCCESS && rv != APR_INCOMPLETE) { + if ((err = dav_fs_remove_locknull_member(p, fname, &buf)) != NULL) { + /* ### push a higher-level description? */ + return err; + } + } + } + } + break; + + case DAV_LOCK_INDIRECT: + /* Create and fill a dav_lock_indirect structure */ + + ip = apr_pcalloc(p, sizeof(*ip)); + ip->locktoken = apr_palloc(p, sizeof(*ip->locktoken)); + memcpy(ip->locktoken, val.dptr + offset, sizeof(*ip->locktoken)); + offset += sizeof(*ip->locktoken); + memcpy(&ip->timeout, val.dptr + offset, sizeof(ip->timeout)); + offset += sizeof(ip->timeout); + memcpy(&ip->key.dsize, val.dptr + offset, sizeof(ip->key.dsize)); /* length of datum */ + offset += sizeof(ip->key.dsize); + ip->key.dptr = apr_palloc(p, ip->key.dsize); + memcpy(ip->key.dptr, val.dptr + offset, ip->key.dsize); + offset += ip->key.dsize; + + if (!dav_fs_lock_expired(ip->timeout)) { + ip->next = *indirect; + *indirect = ip; + } + else { + need_save = DAV_TRUE; + /* A locknull resource will never be locked indirectly */ + } + + break; + + default: + dav_dbm_freedatum(lockdb->info->db, val); + + /* ### should use a computed_desc and insert corrupt token data */ + --offset; + return dav_new_error(p, + HTTP_INTERNAL_SERVER_ERROR, + DAV_ERR_LOCK_CORRUPT_DB, + apr_psprintf(p, + "The lock database was found to " + "be corrupt. offset %" + APR_SIZE_T_FMT ", c=%02x", + offset, val.dptr[offset])); + } + } + + dav_dbm_freedatum(lockdb->info->db, val); + + /* Clean up this record if we found expired locks */ + /* + ** ### shouldn't do this if we've been opened READONLY. elide the + ** ### timed-out locks from the response, but don't save that info back + */ + if (need_save == DAV_TRUE) { + return dav_fs_save_lock_record(lockdb, key, *direct, *indirect); + } + + return NULL; +} + +/* resolve , returning <*direct> */ +static dav_error * dav_fs_resolve(dav_lockdb *lockdb, + dav_lock_indirect *indirect, + dav_lock_discovery **direct, + dav_lock_discovery **ref_dp, + dav_lock_indirect **ref_ip) +{ + dav_error *err; + dav_lock_discovery *dir; + dav_lock_indirect *ind; + + if ((err = dav_fs_load_lock_record(lockdb, indirect->key, + DAV_CREATE_LIST, + &dir, &ind)) != NULL) { + /* ### insert a higher-level description? */ + return err; + } + if (ref_dp != NULL) { + *ref_dp = dir; + *ref_ip = ind; + } + + for (; dir != NULL; dir = dir->next) { + if (!dav_compare_locktoken(indirect->locktoken, dir->locktoken)) { + *direct = dir; + return NULL; + } + } + + /* No match found (but we should have found one!) */ + + /* ### use a different description and/or error ID? */ + return dav_new_error(lockdb->info->pool, + HTTP_INTERNAL_SERVER_ERROR, + DAV_ERR_LOCK_CORRUPT_DB, + "The lock database was found to be corrupt. " + "An indirect lock's direct lock could not " + "be found."); +} + +/* --------------------------------------------------------------- +** +** Property-related lock functions +** +*/ + +/* +** dav_fs_get_supportedlock: Returns a static string for all supportedlock +** properties. I think we save more returning a static string than +** constructing it every time, though it might look cleaner. +*/ +static const char *dav_fs_get_supportedlock(const dav_resource *resource) +{ + static const char supported[] = DEBUG_CR + "" DEBUG_CR + "" DEBUG_CR + "" DEBUG_CR + "" DEBUG_CR + "" DEBUG_CR + "" DEBUG_CR + "" DEBUG_CR + "" DEBUG_CR; + + return supported; +} + +/* --------------------------------------------------------------- +** +** General lock functions +** +*/ + +/* --------------------------------------------------------------- +** +** Functions dealing with lock-null resources +** +*/ + +/* +** dav_fs_load_locknull_list: Returns a dav_buffer dump of the locknull file +** for the given directory. +*/ +static dav_error * dav_fs_load_locknull_list(apr_pool_t *p, const char *dirpath, + dav_buffer *pbuf) +{ + apr_finfo_t finfo; + apr_file_t *file = NULL; + dav_error *err = NULL; + apr_size_t amt; + apr_status_t rv; + + dav_buffer_init(p, pbuf, dirpath); + + if (pbuf->buf[pbuf->cur_len - 1] == '/') + pbuf->buf[--pbuf->cur_len] = '\0'; + + dav_buffer_place(p, pbuf, "/" DAV_FS_STATE_DIR "/" DAV_FS_LOCK_NULL_FILE); + + /* reset this in case we leave w/o reading into the buffer */ + pbuf->cur_len = 0; + + if (apr_file_open(&file, pbuf->buf, APR_READ | APR_BINARY, APR_OS_DEFAULT, + p) != APR_SUCCESS) { + return NULL; + } + + rv = apr_file_info_get(&finfo, APR_FINFO_SIZE, file); + if (rv != APR_SUCCESS) { + err = dav_new_error(p, HTTP_INTERNAL_SERVER_ERROR, 0, + apr_psprintf(p, + "Opened but could not stat file %s", + pbuf->buf)); + goto loaderror; + } + + if (finfo.size != (apr_size_t)finfo.size) { + err = dav_new_error(p, HTTP_INTERNAL_SERVER_ERROR, 0, + apr_psprintf(p, + "Opened but rejected huge file %s", + pbuf->buf)); + goto loaderror; + } + + amt = (apr_size_t)finfo.size; + dav_set_bufsize(p, pbuf, amt); + if (apr_file_read(file, pbuf->buf, &amt) != APR_SUCCESS + || amt != finfo.size) { + err = dav_new_error(p, HTTP_INTERNAL_SERVER_ERROR, 0, + apr_psprintf(p, + "Failure reading locknull file " + "for %s", dirpath)); + + /* just in case the caller disregards the returned error */ + pbuf->cur_len = 0; + goto loaderror; + } + + loaderror: + apr_file_close(file); + return err; +} + +/* +** dav_fs_save_locknull_list: Saves contents of pbuf into the +** locknull file for dirpath. +*/ +static dav_error * dav_fs_save_locknull_list(apr_pool_t *p, const char *dirpath, + dav_buffer *pbuf) +{ + const char *pathname; + apr_file_t *file = NULL; + dav_error *err = NULL; + apr_size_t amt; + + if (pbuf->buf == NULL) + return NULL; + + dav_fs_ensure_state_dir(p, dirpath); + pathname = apr_pstrcat(p, + dirpath, + dirpath[strlen(dirpath) - 1] == '/' ? "" : "/", + DAV_FS_STATE_DIR "/" DAV_FS_LOCK_NULL_FILE, + NULL); + + if (pbuf->cur_len == 0) { + /* delete the file if cur_len == 0 */ + if (apr_file_remove(pathname, p) != 0) { + return dav_new_error(p, HTTP_INTERNAL_SERVER_ERROR, 0, + apr_psprintf(p, + "Error removing %s", pathname)); + } + return NULL; + } + + if (apr_file_open(&file, pathname, + APR_WRITE | APR_CREATE | APR_TRUNCATE | APR_BINARY, + APR_OS_DEFAULT, p) != APR_SUCCESS) { + return dav_new_error(p, HTTP_INTERNAL_SERVER_ERROR, 0, + apr_psprintf(p, + "Error opening %s for writing", + pathname)); + } + + amt = pbuf->cur_len; + if (apr_file_write(file, pbuf->buf, &amt) != APR_SUCCESS + || amt != pbuf->cur_len) { + err = dav_new_error(p, HTTP_INTERNAL_SERVER_ERROR, 0, + apr_psprintf(p, + "Error writing %" APR_SIZE_T_FMT + " bytes to %s", + pbuf->cur_len, pathname)); + } + + apr_file_close(file); + return err; +} + +/* +** dav_fs_remove_locknull_member: Removes filename from the locknull list +** for directory path. +*/ +static dav_error * dav_fs_remove_locknull_member(apr_pool_t *p, + const char *filename, + dav_buffer *pbuf) +{ + dav_error *err; + apr_size_t len; + apr_size_t scanlen; + char *scan; + const char *scanend; + char *dirpath = apr_pstrdup(p, filename); + char *fname = strrchr(dirpath, '/'); + int dirty = 0; + + if (fname != NULL) + *fname++ = '\0'; + else + fname = dirpath; + len = strlen(fname) + 1; + + if ((err = dav_fs_load_locknull_list(p, dirpath, pbuf)) != NULL) { + /* ### add a higher level description? */ + return err; + } + + for (scan = pbuf->buf, scanend = scan + pbuf->cur_len; + scan < scanend; + scan += scanlen) { + scanlen = strlen(scan) + 1; + if (len == scanlen && memcmp(fname, scan, scanlen) == 0) { + pbuf->cur_len -= scanlen; + memmove(scan, scan + scanlen, scanend - (scan + scanlen)); + dirty = 1; + break; + } + } + + if (dirty) { + if ((err = dav_fs_save_locknull_list(p, dirpath, pbuf)) != NULL) { + /* ### add a higher level description? */ + return err; + } + } + + return NULL; +} + +/* Note: used by dav_fs_repos.c */ +dav_error * dav_fs_get_locknull_members( + const dav_resource *resource, + dav_buffer *pbuf) +{ + const char *dirpath; + + /* ### should test this result value... */ + (void) dav_fs_dir_file_name(resource, &dirpath, NULL); + return dav_fs_load_locknull_list(dav_fs_pool(resource), dirpath, pbuf); +} + +/* ### fold into append_lock? */ +/* ### take an optional buf parameter? */ +static dav_error * dav_fs_add_locknull_state( + dav_lockdb *lockdb, + const dav_resource *resource) +{ + dav_buffer buf = { 0 }; + apr_pool_t *p = lockdb->info->pool; + const char *dirpath; + const char *fname; + dav_error *err; + + /* ### should test this result value... */ + (void) dav_fs_dir_file_name(resource, &dirpath, &fname); + + if ((err = dav_fs_load_locknull_list(p, dirpath, &buf)) != NULL) { + return dav_push_error(p, HTTP_INTERNAL_SERVER_ERROR, 0, + "Could not load .locknull file.", err); + } + + dav_buffer_append(p, &buf, fname); + buf.cur_len++; /* we want the null-term here */ + + if ((err = dav_fs_save_locknull_list(p, dirpath, &buf)) != NULL) { + return dav_push_error(p, HTTP_INTERNAL_SERVER_ERROR, 0, + "Could not save .locknull file.", err); + } + + return NULL; +} + +/* +** dav_fs_remove_locknull_state: Given a request, check to see if r->filename +** is/was a lock-null resource. If so, return it to an existant state. +** +** ### this function is broken... it doesn't check! +** +** In this implementation, this involves two things: +** (a) remove it from the list in the appropriate .DAV/locknull file +** (b) on *nix, convert the key from a filename to an inode. +*/ +static dav_error * dav_fs_remove_locknull_state( + dav_lockdb *lockdb, + const dav_resource *resource) +{ + dav_buffer buf = { 0 }; + dav_error *err; + apr_pool_t *p = lockdb->info->pool; + const char *pathname = dav_fs_pathname(resource); + + if ((err = dav_fs_remove_locknull_member(p, pathname, &buf)) != NULL) { + /* ### add a higher-level description? */ + return err; + } + + { + dav_lock_discovery *ld; + dav_lock_indirect *id; + apr_datum_t key; + + /* + ** Fetch the lock(s) that made the resource lock-null. Remove + ** them under the filename key. Obtain the new inode key, and + ** save the same lock information under it. + */ + key = dav_fs_build_fname_key(p, pathname); + if ((err = dav_fs_load_lock_record(lockdb, key, DAV_CREATE_LIST, + &ld, &id)) != NULL) { + /* ### insert a higher-level error description */ + return err; + } + + if ((err = dav_fs_save_lock_record(lockdb, key, NULL, NULL)) != NULL) { + /* ### insert a higher-level error description */ + return err; + } + + key = dav_fs_build_key(p, resource); + if ((err = dav_fs_save_lock_record(lockdb, key, ld, id)) != NULL) { + /* ### insert a higher-level error description */ + return err; + } + } + + return NULL; +} + +static dav_error * dav_fs_create_lock(dav_lockdb *lockdb, + const dav_resource *resource, + dav_lock **lock) +{ + apr_datum_t key; + + key = dav_fs_build_key(lockdb->info->pool, resource); + + *lock = dav_fs_alloc_lock(lockdb, + key, + NULL); + + (*lock)->is_locknull = !resource->exists; + + return NULL; +} + +static dav_error * dav_fs_get_locks(dav_lockdb *lockdb, + const dav_resource *resource, + int calltype, + dav_lock **locks) +{ + apr_pool_t *p = lockdb->info->pool; + apr_datum_t key; + dav_error *err; + dav_lock *lock = NULL; + dav_lock *newlock; + dav_lock_discovery *dp; + dav_lock_indirect *ip; + +#if DAV_DEBUG + if (calltype == DAV_GETLOCKS_COMPLETE) { + return dav_new_error(lockdb->info->pool, + HTTP_INTERNAL_SERVER_ERROR, 0, + "INTERNAL DESIGN ERROR: DAV_GETLOCKS_COMPLETE " + "is not yet supported"); + } +#endif + + key = dav_fs_build_key(p, resource); + if ((err = dav_fs_load_lock_record(lockdb, key, DAV_CREATE_LIST, + &dp, &ip)) != NULL) { + /* ### push a higher-level desc? */ + return err; + } + + /* copy all direct locks to the result list */ + for (; dp != NULL; dp = dp->next) { + newlock = dav_fs_alloc_lock(lockdb, key, dp->locktoken); + newlock->is_locknull = !resource->exists; + newlock->scope = dp->f.scope; + newlock->type = dp->f.type; + newlock->depth = dp->f.depth; + newlock->timeout = dp->f.timeout; + newlock->owner = dp->owner; + newlock->auth_user = dp->auth_user; + + /* hook into the result list */ + newlock->next = lock; + lock = newlock; + } + + /* copy all the indirect locks to the result list. resolve as needed. */ + for (; ip != NULL; ip = ip->next) { + newlock = dav_fs_alloc_lock(lockdb, ip->key, ip->locktoken); + newlock->is_locknull = !resource->exists; + + if (calltype == DAV_GETLOCKS_RESOLVED) { + if ((err = dav_fs_resolve(lockdb, ip, &dp, NULL, NULL)) != NULL) { + /* ### push a higher-level desc? */ + return err; + } + + newlock->scope = dp->f.scope; + newlock->type = dp->f.type; + newlock->depth = dp->f.depth; + newlock->timeout = dp->f.timeout; + newlock->owner = dp->owner; + newlock->auth_user = dp->auth_user; + } + else { + /* DAV_GETLOCKS_PARTIAL */ + newlock->rectype = DAV_LOCKREC_INDIRECT_PARTIAL; + } + + /* hook into the result list */ + newlock->next = lock; + lock = newlock; + } + + *locks = lock; + return NULL; +} + +static dav_error * dav_fs_find_lock(dav_lockdb *lockdb, + const dav_resource *resource, + const dav_locktoken *locktoken, + int partial_ok, + dav_lock **lock) +{ + dav_error *err; + apr_datum_t key; + dav_lock_discovery *dp; + dav_lock_indirect *ip; + + *lock = NULL; + + key = dav_fs_build_key(lockdb->info->pool, resource); + if ((err = dav_fs_load_lock_record(lockdb, key, DAV_CREATE_LIST, + &dp, &ip)) != NULL) { + /* ### push a higher-level desc? */ + return err; + } + + for (; dp != NULL; dp = dp->next) { + if (!dav_compare_locktoken(locktoken, dp->locktoken)) { + *lock = dav_fs_alloc_lock(lockdb, key, locktoken); + (*lock)->is_locknull = !resource->exists; + (*lock)->scope = dp->f.scope; + (*lock)->type = dp->f.type; + (*lock)->depth = dp->f.depth; + (*lock)->timeout = dp->f.timeout; + (*lock)->owner = dp->owner; + (*lock)->auth_user = dp->auth_user; + return NULL; + } + } + + for (; ip != NULL; ip = ip->next) { + if (!dav_compare_locktoken(locktoken, ip->locktoken)) { + *lock = dav_fs_alloc_lock(lockdb, ip->key, locktoken); + (*lock)->is_locknull = !resource->exists; + + /* ### nobody uses the resolving right now! */ + if (partial_ok) { + (*lock)->rectype = DAV_LOCKREC_INDIRECT_PARTIAL; + } + else { + (*lock)->rectype = DAV_LOCKREC_INDIRECT; + if ((err = dav_fs_resolve(lockdb, ip, &dp, + NULL, NULL)) != NULL) { + /* ### push a higher-level desc? */ + return err; + } + (*lock)->scope = dp->f.scope; + (*lock)->type = dp->f.type; + (*lock)->depth = dp->f.depth; + (*lock)->timeout = dp->f.timeout; + (*lock)->owner = dp->owner; + (*lock)->auth_user = dp->auth_user; + } + return NULL; + } + } + + return NULL; +} + +static dav_error * dav_fs_has_locks(dav_lockdb *lockdb, + const dav_resource *resource, + int *locks_present) +{ + dav_error *err; + apr_datum_t key; + + *locks_present = 0; + + if ((err = dav_fs_really_open_lockdb(lockdb)) != NULL) { + /* ### insert a higher-level error description */ + return err; + } + + /* + ** If we opened readonly and the db wasn't there, then there are no + ** locks for this resource. Just exit. + */ + if (lockdb->info->db == NULL) + return NULL; + + key = dav_fs_build_key(lockdb->info->pool, resource); + + *locks_present = dav_dbm_exists(lockdb->info->db, key); + + return NULL; +} + +static dav_error * dav_fs_append_locks(dav_lockdb *lockdb, + const dav_resource *resource, + int make_indirect, + const dav_lock *lock) +{ + apr_pool_t *p = lockdb->info->pool; + dav_error *err; + dav_lock_indirect *ip; + dav_lock_discovery *dp; + apr_datum_t key; + + key = dav_fs_build_key(lockdb->info->pool, resource); + if ((err = dav_fs_load_lock_record(lockdb, key, 0, &dp, &ip)) != NULL) { + /* ### maybe add in a higher-level description */ + return err; + } + + /* + ** ### when we store the lock more directly, we need to update + ** ### lock->rectype and lock->is_locknull + */ + + if (make_indirect) { + for (; lock != NULL; lock = lock->next) { + + /* ### this works for any rectype */ + dav_lock_indirect *newi = apr_pcalloc(p, sizeof(*newi)); + + /* ### shut off the const warning for now */ + newi->locktoken = (dav_locktoken *)lock->locktoken; + newi->timeout = lock->timeout; + newi->key = lock->info->key; + newi->next = ip; + ip = newi; + } + } + else { + for (; lock != NULL; lock = lock->next) { + /* create and link in the right kind of lock */ + + if (lock->rectype == DAV_LOCKREC_DIRECT) { + dav_lock_discovery *newd = apr_pcalloc(p, sizeof(*newd)); + + newd->f.scope = lock->scope; + newd->f.type = lock->type; + newd->f.depth = lock->depth; + newd->f.timeout = lock->timeout; + /* ### shut off the const warning for now */ + newd->locktoken = (dav_locktoken *)lock->locktoken; + newd->owner = lock->owner; + newd->auth_user = lock->auth_user; + newd->next = dp; + dp = newd; + } + else { + /* DAV_LOCKREC_INDIRECT(_PARTIAL) */ + + dav_lock_indirect *newi = apr_pcalloc(p, sizeof(*newi)); + + /* ### shut off the const warning for now */ + newi->locktoken = (dav_locktoken *)lock->locktoken; + newi->key = lock->info->key; + newi->next = ip; + ip = newi; + } + } + } + + if ((err = dav_fs_save_lock_record(lockdb, key, dp, ip)) != NULL) { + /* ### maybe add a higher-level description */ + return err; + } + + /* we have a special list for recording locknull resources */ + /* ### ack! this can add two copies to the locknull list */ + if (!resource->exists + && (err = dav_fs_add_locknull_state(lockdb, resource)) != NULL) { + /* ### maybe add a higher-level description */ + return err; + } + + return NULL; +} + +static dav_error * dav_fs_remove_lock(dav_lockdb *lockdb, + const dav_resource *resource, + const dav_locktoken *locktoken) +{ + dav_error *err; + dav_buffer buf = { 0 }; + dav_lock_discovery *dh = NULL; + dav_lock_indirect *ih = NULL; + apr_datum_t key; + + key = dav_fs_build_key(lockdb->info->pool, resource); + + if (locktoken != NULL) { + dav_lock_discovery *dp; + dav_lock_discovery *dprev = NULL; + dav_lock_indirect *ip; + dav_lock_indirect *iprev = NULL; + + if ((err = dav_fs_load_lock_record(lockdb, key, DAV_CREATE_LIST, + &dh, &ih)) != NULL) { + /* ### maybe add a higher-level description */ + return err; + } + + for (dp = dh; dp != NULL; dp = dp->next) { + if (dav_compare_locktoken(locktoken, dp->locktoken) == 0) { + if (dprev) + dprev->next = dp->next; + else + dh = dh->next; + } + dprev = dp; + } + + for (ip = ih; ip != NULL; ip = ip->next) { + if (dav_compare_locktoken(locktoken, ip->locktoken) == 0) { + if (iprev) + iprev->next = ip->next; + else + ih = ih->next; + } + iprev = ip; + } + + } + + /* save the modified locks, or remove all locks (dh=ih=NULL). */ + if ((err = dav_fs_save_lock_record(lockdb, key, dh, ih)) != NULL) { + /* ### maybe add a higher-level description */ + return err; + } + + /* + ** If this resource is a locknull resource AND no more locks exist, + ** then remove the locknull member. + ** + ** Note: remove_locknull_state() attempts to convert a locknull member + ** to a real member. In this case, all locks are gone, so the + ** locknull resource returns to the null state (ie. doesn't exist), + ** so there is no need to update the lockdb (and it won't find + ** any because a precondition is that none exist). + */ + if (!resource->exists && dh == NULL && ih == NULL + && (err = dav_fs_remove_locknull_member(lockdb->info->pool, + dav_fs_pathname(resource), + &buf)) != NULL) { + /* ### maybe add a higher-level description */ + return err; + } + + return NULL; +} + +static int dav_fs_do_refresh(dav_lock_discovery *dp, + const dav_locktoken_list *ltl, + time_t new_time) +{ + int dirty = 0; + + for (; ltl != NULL; ltl = ltl->next) { + if (dav_compare_locktoken(dp->locktoken, ltl->locktoken) == 0) + { + dp->f.timeout = new_time; + dirty = 1; + } + } + + return dirty; +} + +static dav_error * dav_fs_refresh_locks(dav_lockdb *lockdb, + const dav_resource *resource, + const dav_locktoken_list *ltl, + time_t new_time, + dav_lock **locks) +{ + dav_error *err; + apr_datum_t key; + dav_lock_discovery *dp; + dav_lock_discovery *dp_scan; + dav_lock_indirect *ip; + int dirty = 0; + dav_lock *newlock; + + *locks = NULL; + + key = dav_fs_build_key(lockdb->info->pool, resource); + if ((err = dav_fs_load_lock_record(lockdb, key, DAV_CREATE_LIST, + &dp, &ip)) != NULL) { + /* ### maybe add in a higher-level description */ + return err; + } + + /* ### we should be refreshing direct AND (resolved) indirect locks! */ + + /* refresh all of the direct locks on this resource */ + for (dp_scan = dp; dp_scan != NULL; dp_scan = dp_scan->next) { + if (dav_fs_do_refresh(dp_scan, ltl, new_time)) { + /* the lock was refreshed. return the lock. */ + newlock = dav_fs_alloc_lock(lockdb, key, dp_scan->locktoken); + newlock->is_locknull = !resource->exists; + newlock->scope = dp_scan->f.scope; + newlock->type = dp_scan->f.type; + newlock->depth = dp_scan->f.depth; + newlock->timeout = dp_scan->f.timeout; + newlock->owner = dp_scan->owner; + newlock->auth_user = dp_scan->auth_user; + + newlock->next = *locks; + *locks = newlock; + + dirty = 1; + } + } + + /* if we refreshed any locks, then save them back. */ + if (dirty + && (err = dav_fs_save_lock_record(lockdb, key, dp, ip)) != NULL) { + /* ### maybe add in a higher-level description */ + return err; + } + + /* for each indirect lock, find its direct lock and refresh it. */ + for (; ip != NULL; ip = ip->next) { + dav_lock_discovery *ref_dp; + dav_lock_indirect *ref_ip; + + if ((err = dav_fs_resolve(lockdb, ip, &dp_scan, + &ref_dp, &ref_ip)) != NULL) { + /* ### push a higher-level desc? */ + return err; + } + if (dav_fs_do_refresh(dp_scan, ltl, new_time)) { + /* the lock was refreshed. return the lock. */ + newlock = dav_fs_alloc_lock(lockdb, ip->key, dp_scan->locktoken); + newlock->is_locknull = !resource->exists; + newlock->scope = dp_scan->f.scope; + newlock->type = dp_scan->f.type; + newlock->depth = dp_scan->f.depth; + newlock->timeout = dp_scan->f.timeout; + newlock->owner = dp_scan->owner; + newlock->auth_user = dp_scan->auth_user; + + newlock->next = *locks; + *locks = newlock; + + /* save the (resolved) direct lock back */ + if ((err = dav_fs_save_lock_record(lockdb, ip->key, ref_dp, + ref_ip)) != NULL) { + /* ### push a higher-level desc? */ + return err; + } + } + } + + return NULL; +} + + +const dav_hooks_locks dav_hooks_locks_fs = +{ + dav_fs_get_supportedlock, + dav_fs_parse_locktoken, + dav_fs_format_locktoken, + dav_fs_compare_locktoken, + dav_fs_open_lockdb, + dav_fs_close_lockdb, + dav_fs_remove_locknull_state, + dav_fs_create_lock, + dav_fs_get_locks, + dav_fs_find_lock, + dav_fs_has_locks, + dav_fs_append_locks, + dav_fs_remove_lock, + dav_fs_refresh_locks, + NULL, /* lookup_resource */ + + NULL /* ctx */ +}; diff --git a/rubbos/app/httpd-2.0.64/modules/dav/fs/mod_dav_fs.c b/rubbos/app/httpd-2.0.64/modules/dav/fs/mod_dav_fs.c new file mode 100644 index 00000000..dfd190b3 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/dav/fs/mod_dav_fs.c @@ -0,0 +1,108 @@ +/* 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. + */ + +#include "httpd.h" +#include "http_config.h" +#include "apr_strings.h" + +#include "mod_dav.h" +#include "repos.h" + +/* per-server configuration */ +typedef struct { + const char *lockdb_path; + +} dav_fs_server_conf; + +extern module AP_MODULE_DECLARE_DATA dav_fs_module; + +const char *dav_get_lockdb_path(const request_rec *r) +{ + dav_fs_server_conf *conf; + + conf = ap_get_module_config(r->server->module_config, &dav_fs_module); + return conf->lockdb_path; +} + +static void *dav_fs_create_server_config(apr_pool_t *p, server_rec *s) +{ + return apr_pcalloc(p, sizeof(dav_fs_server_conf)); +} + +static void *dav_fs_merge_server_config(apr_pool_t *p, + void *base, void *overrides) +{ + dav_fs_server_conf *parent = base; + dav_fs_server_conf *child = overrides; + dav_fs_server_conf *newconf; + + newconf = apr_pcalloc(p, sizeof(*newconf)); + + newconf->lockdb_path = + child->lockdb_path ? child->lockdb_path : parent->lockdb_path; + + return newconf; +} + +/* + * Command handler for the DAVLockDB directive, which is TAKE1 + */ +static const char *dav_fs_cmd_davlockdb(cmd_parms *cmd, void *config, + const char *arg1) +{ + dav_fs_server_conf *conf; + conf = ap_get_module_config(cmd->server->module_config, + &dav_fs_module); + conf->lockdb_path = ap_server_root_relative(cmd->pool, arg1); + + if (!conf->lockdb_path) { + return apr_pstrcat(cmd->pool, "Invalid DAVLockDB path ", + arg1, NULL); + } + + return NULL; +} + +static const command_rec dav_fs_cmds[] = +{ + /* per server */ + AP_INIT_TAKE1("DAVLockDB", dav_fs_cmd_davlockdb, NULL, RSRC_CONF, + "specify a lock database"), + + { NULL } +}; + +static void register_hooks(apr_pool_t *p) +{ + dav_hook_gather_propsets(dav_fs_gather_propsets, NULL, NULL, + APR_HOOK_MIDDLE); + dav_hook_find_liveprop(dav_fs_find_liveprop, NULL, NULL, APR_HOOK_MIDDLE); + dav_hook_insert_all_liveprops(dav_fs_insert_all_liveprops, NULL, NULL, + APR_HOOK_MIDDLE); + + dav_fs_register(p); +} + +module AP_MODULE_DECLARE_DATA dav_fs_module = +{ + STANDARD20_MODULE_STUFF, + NULL, /* dir config creater */ + NULL, /* dir merger --- default is to override */ + dav_fs_create_server_config, /* server config */ + dav_fs_merge_server_config, /* merge server config */ + dav_fs_cmds, /* command table */ + register_hooks, /* register hooks */ +}; diff --git a/rubbos/app/httpd-2.0.64/modules/dav/fs/mod_dav_fs.dsp b/rubbos/app/httpd-2.0.64/modules/dav/fs/mod_dav_fs.dsp new file mode 100644 index 00000000..5c2239c9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/dav/fs/mod_dav_fs.dsp @@ -0,0 +1,152 @@ +# Microsoft Developer Studio Project File - Name="mod_dav_fs" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=mod_dav_fs - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "mod_dav_fs.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 "mod_dav_fs.mak" CFG="mod_dav_fs - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "mod_dav_fs - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_dav_fs - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "mod_dav_fs - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../../../include" /I "../../../srclib/apr/include" /I "../../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_dav_fs_src" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib ws2_32.lib mswsock.lib /nologo /subsystem:windows /dll /out:"Release/mod_dav_fs.so" /base:@..\..\..\os\win32\BaseAddr.ref,mod_dav_fs.so +# ADD LINK32 kernel32.lib ws2_32.lib mswsock.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Release/mod_dav_fs.so" /base:@..\..\..\os\win32\BaseAddr.ref,mod_dav_fs.so /opt:ref + +!ELSEIF "$(CFG)" == "mod_dav_fs - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../../../include" /I "../../../srclib/apr/include" /I "../../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_dav_fs_src" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib ws2_32.lib mswsock.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_dav_fs.so" /base:@..\..\..\os\win32\BaseAddr.ref,mod_dav_fs.so +# ADD LINK32 kernel32.lib ws2_32.lib mswsock.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_dav_fs.so" /base:@..\..\..\os\win32\BaseAddr.ref,mod_dav_fs.so + +!ENDIF + +# Begin Target + +# Name "mod_dav_fs - Win32 Release" +# Name "mod_dav_fs - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;hpj;bat;for;f90" +# Begin Source File + +SOURCE=.\dbm.c +# End Source File +# Begin Source File + +SOURCE=.\lock.c +# End Source File +# Begin Source File + +SOURCE=.\mod_dav_fs.c +# End Source File +# Begin Source File + +SOURCE=.\repos.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl;fi;fd" +# Begin Source File + +SOURCE=.\repos.h +# End Source File +# End Group +# Begin Source File + +SOURCE=.\mod_dav_fs.rc +# End Source File +# Begin Source File + +SOURCE=..\..\..\build\win32\win32ver.awk + +!IF "$(CFG)" == "mod_dav_fs - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\..\build\win32\win32ver.awk + +".\mod_dav_fs.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../../build/win32/win32ver.awk mod_dav_fs.so "dav_fs_module for Apache" ../../../include/ap_release.h > .\mod_dav_fs.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "mod_dav_fs - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\..\build\win32\win32ver.awk + +".\mod_dav_fs.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../../build/win32/win32ver.awk mod_dav_fs.so "dav_fs_module for Apache" ../../../include/ap_release.h > .\mod_dav_fs.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/modules/dav/fs/modules.mk b/rubbos/app/httpd-2.0.64/modules/dav/fs/modules.mk new file mode 100644 index 00000000..ceb52a1b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/dav/fs/modules.mk @@ -0,0 +1,3 @@ +DISTCLEAN_TARGETS = modules.mk +static = +shared = diff --git a/rubbos/app/httpd-2.0.64/modules/dav/fs/repos.c b/rubbos/app/httpd-2.0.64/modules/dav/fs/repos.c new file mode 100644 index 00000000..bf8da8d0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/dav/fs/repos.c @@ -0,0 +1,2130 @@ +/* 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. + */ + +/* +** DAV filesystem-based repository provider +*/ + +#include "apr.h" +#include "apr_file_io.h" +#include "apr_strings.h" +#include "apr_buckets.h" + +#if APR_HAVE_STDIO_H +#include /* for sprintf() */ +#endif + +#include "httpd.h" +#include "http_log.h" +#include "http_protocol.h" /* for ap_set_* (in dav_fs_set_headers) */ +#include "http_request.h" /* for ap_update_mtime() */ + +#include "mod_dav.h" +#include "repos.h" + + +/* to assist in debugging mod_dav's GET handling */ +#define DEBUG_GET_HANDLER 0 + +#define DAV_FS_COPY_BLOCKSIZE 16384 /* copy 16k at a time */ + +/* context needed to identify a resource */ +struct dav_resource_private { + apr_pool_t *pool; /* memory storage pool associated with request */ + const char *pathname; /* full pathname to resource */ + apr_finfo_t finfo; /* filesystem info */ +}; + +/* private context for doing a filesystem walk */ +typedef struct { + /* the input walk parameters */ + const dav_walk_params *params; + + /* reused as we walk */ + dav_walk_resource wres; + + dav_resource res1; + dav_resource_private info1; + dav_buffer path1; + dav_buffer uri_buf; + + /* MOVE/COPY need a secondary path */ + dav_resource res2; + dav_resource_private info2; + dav_buffer path2; + + dav_buffer locknull_buf; + +} dav_fs_walker_context; + +typedef struct { + int is_move; /* is this a MOVE? */ + dav_buffer work_buf; /* handy buffer for copymove_file() */ + + /* CALLBACK: this is a secondary resource managed specially for us */ + const dav_resource *res_dst; + + /* copied from dav_walk_params (they are invariant across the walk) */ + const dav_resource *root; + apr_pool_t *pool; + +} dav_fs_copymove_walk_ctx; + +/* an internal WALKTYPE to walk hidden files (the .DAV directory) */ +#define DAV_WALKTYPE_HIDDEN 0x4000 + +/* an internal WALKTYPE to call collections (again) after their contents */ +#define DAV_WALKTYPE_POSTFIX 0x8000 + +#define DAV_CALLTYPE_POSTFIX 1000 /* a private call type */ + + +/* pull this in from the other source file */ +extern const dav_hooks_locks dav_hooks_locks_fs; + +/* forward-declare the hook structures */ +static const dav_hooks_repository dav_hooks_repository_fs; +static const dav_hooks_liveprop dav_hooks_liveprop_fs; + +/* +** The namespace URIs that we use. This list and the enumeration must +** stay in sync. +*/ +static const char * const dav_fs_namespace_uris[] = +{ + "DAV:", + "http://apache.org/dav/props/", + + NULL /* sentinel */ +}; +enum { + DAV_FS_URI_DAV, /* the DAV: namespace URI */ + DAV_FS_URI_MYPROPS /* the namespace URI for our custom props */ +}; + +/* +** Does this platform support an executable flag? +** +** ### need a way to portably abstract this query +*/ +#ifndef WIN32 +#define DAV_FS_HAS_EXECUTABLE +#endif + +/* +** The single property that we define (in the DAV_FS_URI_MYPROPS namespace) +*/ +#define DAV_PROPID_FS_executable 1 + +static const dav_liveprop_spec dav_fs_props[] = +{ + /* standard DAV properties */ + { + DAV_FS_URI_DAV, + "creationdate", + DAV_PROPID_creationdate, + 0 + }, + { + DAV_FS_URI_DAV, + "getcontentlength", + DAV_PROPID_getcontentlength, + 0 + }, + { + DAV_FS_URI_DAV, + "getetag", + DAV_PROPID_getetag, + 0 + }, + { + DAV_FS_URI_DAV, + "getlastmodified", + DAV_PROPID_getlastmodified, + 0 + }, + + /* our custom properties */ + { + DAV_FS_URI_MYPROPS, + "executable", + DAV_PROPID_FS_executable, + 0 /* handled special in dav_fs_is_writable */ + }, + + { 0 } /* sentinel */ +}; + +static const dav_liveprop_group dav_fs_liveprop_group = +{ + dav_fs_props, + dav_fs_namespace_uris, + &dav_hooks_liveprop_fs +}; + + +/* define the dav_stream structure for our use */ +struct dav_stream { + apr_pool_t *p; + apr_file_t *f; + const char *pathname; /* we may need to remove it at close time */ +}; + +/* returns an appropriate HTTP status code given an APR status code for a + * failed I/O operation. ### use something besides 500? */ +#define MAP_IO2HTTP(e) (APR_STATUS_IS_ENOSPC(e) ? HTTP_INSUFFICIENT_STORAGE : \ + HTTP_INTERNAL_SERVER_ERROR) + +/* forward declaration for internal treewalkers */ +static dav_error * dav_fs_walk(const dav_walk_params *params, int depth, + dav_response **response); +static dav_error * dav_fs_internal_walk(const dav_walk_params *params, + int depth, int is_move, + const dav_resource *root_dst, + dav_response **response); + +/* -------------------------------------------------------------------- +** +** PRIVATE REPOSITORY FUNCTIONS +*/ +apr_pool_t *dav_fs_pool(const dav_resource *resource) +{ + return resource->info->pool; +} + +const char *dav_fs_pathname(const dav_resource *resource) +{ + return resource->info->pathname; +} + +dav_error * dav_fs_dir_file_name( + const dav_resource *resource, + const char **dirpath_p, + const char **fname_p) +{ + dav_resource_private *ctx = resource->info; + + if (resource->collection) { + *dirpath_p = ctx->pathname; + if (fname_p != NULL) + *fname_p = NULL; + } + else { + const char *testpath, *rootpath; + char *dirpath = ap_make_dirstr_parent(ctx->pool, ctx->pathname); + apr_size_t dirlen = strlen(dirpath); + apr_status_t rv = APR_SUCCESS; + + testpath = dirpath; + if (dirlen > 0) { + rv = apr_filepath_root(&rootpath, &testpath, 0, ctx->pool); + } + + /* remove trailing slash from dirpath, unless it's a root path + */ + if ((rv == APR_SUCCESS && testpath && *testpath) + || rv == APR_ERELATIVE) { + if (dirpath[dirlen - 1] == '/') { + dirpath[dirlen - 1] = '\0'; + } + } + + /* ###: Looks like a response could be appropriate + * + * APR_SUCCESS here tells us the dir is a root + * APR_ERELATIVE told us we had no root (ok) + * APR_EINCOMPLETE an incomplete testpath told us + * there was no -file- name here! + * APR_EBADPATH or other errors tell us this file + * path is undecipherable + */ + + if (rv == APR_SUCCESS || rv == APR_ERELATIVE) { + *dirpath_p = dirpath; + if (fname_p != NULL) + *fname_p = ctx->pathname + dirlen; + } + else { + return dav_new_error(ctx->pool, HTTP_INTERNAL_SERVER_ERROR, 0, + "An incomplete/bad path was found in " + "dav_fs_dir_file_name."); + } + } + + return NULL; +} + +/* Note: picked up from ap_gm_timestr_822() */ +/* NOTE: buf must be at least DAV_TIMEBUF_SIZE chars in size */ +static void dav_format_time(int style, apr_time_t sec, char *buf) +{ + apr_time_exp_t tms; + + /* ### what to do if fails? */ + (void) apr_time_exp_gmt(&tms, sec); + + if (style == DAV_STYLE_ISO8601) { + /* ### should we use "-00:00" instead of "Z" ?? */ + + /* 20 chars plus null term */ + sprintf(buf, "%.4d-%.2d-%.2dT%.2d:%.2d:%.2dZ", + tms.tm_year + 1900, tms.tm_mon + 1, tms.tm_mday, + tms.tm_hour, tms.tm_min, tms.tm_sec); + return; + } + + /* RFC 822 date format; as strftime '%a, %d %b %Y %T GMT' */ + + /* 29 chars plus null term */ + sprintf(buf, + "%s, %.2d %s %d %.2d:%.2d:%.2d GMT", + apr_day_snames[tms.tm_wday], + tms.tm_mday, apr_month_snames[tms.tm_mon], + tms.tm_year + 1900, + tms.tm_hour, tms.tm_min, tms.tm_sec); +} + +static dav_error * dav_fs_copymove_file( + int is_move, + apr_pool_t * p, + const char *src, + const char *dst, + dav_buffer *pbuf) +{ + dav_buffer work_buf = { 0 }; + apr_file_t *inf = NULL; + apr_file_t *outf = NULL; + apr_status_t status; + + if (pbuf == NULL) + pbuf = &work_buf; + + dav_set_bufsize(p, pbuf, DAV_FS_COPY_BLOCKSIZE); + + if ((apr_file_open(&inf, src, APR_READ | APR_BINARY, APR_OS_DEFAULT, p)) + != APR_SUCCESS) { + /* ### use something besides 500? */ + return dav_new_error(p, HTTP_INTERNAL_SERVER_ERROR, 0, + "Could not open file for reading"); + } + + /* ### do we need to deal with the umask? */ + status = apr_file_open(&outf, dst, APR_WRITE | APR_CREATE | APR_TRUNCATE + | APR_BINARY, APR_OS_DEFAULT, p); + if (status != APR_SUCCESS) { + apr_file_close(inf); + + return dav_new_error(p, MAP_IO2HTTP(status), 0, + "Could not open file for writing"); + } + + while (1) { + apr_size_t len = DAV_FS_COPY_BLOCKSIZE; + + status = apr_file_read(inf, pbuf->buf, &len); + if (status != APR_SUCCESS && status != APR_EOF) { + apr_file_close(inf); + apr_file_close(outf); + + if (apr_file_remove(dst, p) != APR_SUCCESS) { + /* ### ACK! Inconsistent state... */ + + /* ### use something besides 500? */ + return dav_new_error(p, HTTP_INTERNAL_SERVER_ERROR, 0, + "Could not delete output after read " + "failure. Server is now in an " + "inconsistent state."); + } + + /* ### use something besides 500? */ + return dav_new_error(p, HTTP_INTERNAL_SERVER_ERROR, 0, + "Could not read input file"); + } + + if (status == APR_EOF) + break; + + /* write any bytes that were read */ + status = apr_file_write_full(outf, pbuf->buf, len, NULL); + if (status != APR_SUCCESS) { + apr_file_close(inf); + apr_file_close(outf); + + if (apr_file_remove(dst, p) != APR_SUCCESS) { + /* ### ACK! Inconsistent state... */ + + /* ### use something besides 500? */ + return dav_new_error(p, HTTP_INTERNAL_SERVER_ERROR, 0, + "Could not delete output after write " + "failure. Server is now in an " + "inconsistent state."); + } + + return dav_new_error(p, MAP_IO2HTTP(status), 0, + "Could not write output file"); + } + } + + apr_file_close(inf); + apr_file_close(outf); + + if (is_move && apr_file_remove(src, p) != APR_SUCCESS) { + dav_error *err; + int save_errno = errno; /* save the errno that got us here */ + + if (apr_file_remove(dst, p) != APR_SUCCESS) { + /* ### ACK. this creates an inconsistency. do more!? */ + + /* ### use something besides 500? */ + /* Note that we use the latest errno */ + return dav_new_error(p, HTTP_INTERNAL_SERVER_ERROR, 0, + "Could not remove source or destination " + "file. Server is now in an inconsistent " + "state."); + } + + /* ### use something besides 500? */ + err = dav_new_error(p, HTTP_INTERNAL_SERVER_ERROR, 0, + "Could not remove source file after move. " + "Destination was removed to ensure consistency."); + err->save_errno = save_errno; + return err; + } + + return NULL; +} + +/* copy/move a file from within a state dir to another state dir */ +/* ### need more buffers to replace the pool argument */ +static dav_error * dav_fs_copymove_state( + int is_move, + apr_pool_t * p, + const char *src_dir, const char *src_file, + const char *dst_dir, const char *dst_file, + dav_buffer *pbuf) +{ + apr_finfo_t src_finfo; /* finfo for source file */ + apr_finfo_t dst_state_finfo; /* finfo for STATE directory */ + apr_status_t rv; + const char *src; + const char *dst; + + /* build the propset pathname for the source file */ + src = apr_pstrcat(p, src_dir, "/" DAV_FS_STATE_DIR "/", src_file, NULL); + + /* the source file doesn't exist */ + rv = apr_stat(&src_finfo, src, APR_FINFO_NORM, p); + if (rv != APR_SUCCESS && rv != APR_INCOMPLETE) { + return NULL; + } + + /* build the pathname for the destination state dir */ + dst = apr_pstrcat(p, dst_dir, "/" DAV_FS_STATE_DIR, NULL); + + /* ### do we need to deal with the umask? */ + + /* ensure that it exists */ + rv = apr_dir_make(dst, APR_OS_DEFAULT, p); + if (rv != APR_SUCCESS) { + if (!APR_STATUS_IS_EEXIST(rv)) { + /* ### use something besides 500? */ + return dav_new_error(p, HTTP_INTERNAL_SERVER_ERROR, 0, + "Could not create internal state directory"); + } + } + + /* get info about the state directory */ + rv = apr_stat(&dst_state_finfo, dst, APR_FINFO_NORM, p); + if (rv != APR_SUCCESS && rv != APR_INCOMPLETE) { + /* Ack! Where'd it go? */ + /* ### use something besides 500? */ + return dav_new_error(p, HTTP_INTERNAL_SERVER_ERROR, 0, + "State directory disappeared"); + } + + /* The mkdir() may have failed because a *file* exists there already */ + if (dst_state_finfo.filetype != APR_DIR) { + /* ### try to recover by deleting this file? (and mkdir again) */ + /* ### use something besides 500? */ + return dav_new_error(p, HTTP_INTERNAL_SERVER_ERROR, 0, + "State directory is actually a file"); + } + + /* append the target file to the state directory pathname */ + dst = apr_pstrcat(p, dst, "/", dst_file, NULL); + + /* copy/move the file now */ + if (is_move && src_finfo.device == dst_state_finfo.device) { + /* simple rename is possible since it is on the same device */ + if (apr_file_rename(src, dst, p) != APR_SUCCESS) { + /* ### use something besides 500? */ + return dav_new_error(p, HTTP_INTERNAL_SERVER_ERROR, 0, + "Could not move state file."); + } + } + else + { + /* gotta copy (and delete) */ + return dav_fs_copymove_file(is_move, p, src, dst, pbuf); + } + + return NULL; +} + +static dav_error *dav_fs_copymoveset(int is_move, apr_pool_t *p, + const dav_resource *src, + const dav_resource *dst, + dav_buffer *pbuf) +{ + const char *src_dir; + const char *src_file; + const char *src_state1; + const char *src_state2; + const char *dst_dir; + const char *dst_file; + const char *dst_state1; + const char *dst_state2; + dav_error *err; + + /* Get directory and filename for resources */ + /* ### should test these result values... */ + (void) dav_fs_dir_file_name(src, &src_dir, &src_file); + (void) dav_fs_dir_file_name(dst, &dst_dir, &dst_file); + + /* Get the corresponding state files for each resource */ + dav_dbm_get_statefiles(p, src_file, &src_state1, &src_state2); + dav_dbm_get_statefiles(p, dst_file, &dst_state1, &dst_state2); +#if DAV_DEBUG + if ((src_state2 != NULL && dst_state2 == NULL) || + (src_state2 == NULL && dst_state2 != NULL)) { + return dav_new_error(p, HTTP_INTERNAL_SERVER_ERROR, 0, + "DESIGN ERROR: dav_dbm_get_statefiles() " + "returned inconsistent results."); + } +#endif + + err = dav_fs_copymove_state(is_move, p, + src_dir, src_state1, + dst_dir, dst_state1, + pbuf); + + if (err == NULL && src_state2 != NULL) { + err = dav_fs_copymove_state(is_move, p, + src_dir, src_state2, + dst_dir, dst_state2, + pbuf); + + if (err != NULL) { + /* ### CRAP. inconsistency. */ + /* ### should perform some cleanup at the target if we still + ### have the original files */ + + /* Change the error to reflect the bad server state. */ + err->status = HTTP_INTERNAL_SERVER_ERROR; + err->desc = + "Could not fully copy/move the properties. " + "The server is now in an inconsistent state."; + } + } + + return err; +} + +static dav_error *dav_fs_deleteset(apr_pool_t *p, const dav_resource *resource) +{ + const char *dirpath; + const char *fname; + const char *state1; + const char *state2; + const char *pathname; + apr_status_t status; + + /* Get directory, filename, and state-file names for the resource */ + /* ### should test this result value... */ + (void) dav_fs_dir_file_name(resource, &dirpath, &fname); + dav_dbm_get_statefiles(p, fname, &state1, &state2); + + /* build the propset pathname for the file */ + pathname = apr_pstrcat(p, + dirpath, + "/" DAV_FS_STATE_DIR "/", + state1, + NULL); + + /* note: we may get ENOENT if the state dir is not present */ + if ((status = apr_file_remove(pathname, p)) != APR_SUCCESS + && !APR_STATUS_IS_ENOENT(status)) { + return dav_new_error(p, HTTP_INTERNAL_SERVER_ERROR, 0, + "Could not remove properties."); + } + + if (state2 != NULL) { + /* build the propset pathname for the file */ + pathname = apr_pstrcat(p, + dirpath, + "/" DAV_FS_STATE_DIR "/", + state2, + NULL); + + if ((status = apr_file_remove(pathname, p)) != APR_SUCCESS + && !APR_STATUS_IS_ENOENT(status)) { + /* ### CRAP. only removed half. */ + return dav_new_error(p, HTTP_INTERNAL_SERVER_ERROR, 0, + "Could not fully remove properties. " + "The server is now in an inconsistent " + "state."); + } + } + + return NULL; +} + +/* -------------------------------------------------------------------- +** +** REPOSITORY HOOK FUNCTIONS +*/ + +static dav_error * dav_fs_get_resource( + request_rec *r, + const char *root_dir, + const char *label, + int use_checked_in, + dav_resource **result_resource) +{ + dav_resource_private *ctx; + dav_resource *resource; + char *s; + char *filename; + apr_size_t len; + + /* ### optimize this into a single allocation! */ + + /* Create private resource context descriptor */ + ctx = apr_pcalloc(r->pool, sizeof(*ctx)); + ctx->finfo = r->finfo; + + /* ### this should go away */ + ctx->pool = r->pool; + + /* Preserve case on OSes which fold canonical filenames */ +#if 0 + /* ### not available in Apache 2.0 yet */ + filename = r->case_preserved_filename; +#else + filename = r->filename; +#endif + + /* + ** If there is anything in the path_info, then this indicates that the + ** entire path was not used to specify the file/dir. We want to append + ** it onto the filename so that we get a "valid" pathname for null + ** resources. + */ + s = apr_pstrcat(r->pool, filename, r->path_info, NULL); + + /* make sure the pathname does not have a trailing "/" */ + len = strlen(s); + if (len > 1 && s[len - 1] == '/') { + s[len - 1] = '\0'; + } + ctx->pathname = s; + + /* Create resource descriptor */ + resource = apr_pcalloc(r->pool, sizeof(*resource)); + resource->type = DAV_RESOURCE_TYPE_REGULAR; + resource->info = ctx; + resource->hooks = &dav_hooks_repository_fs; + resource->pool = r->pool; + + /* make sure the URI does not have a trailing "/" */ + len = strlen(r->uri); + if (len > 1 && r->uri[len - 1] == '/') { + s = apr_pstrdup(r->pool, r->uri); + s[len - 1] = '\0'; + resource->uri = s; + } + else { + resource->uri = r->uri; + } + + if (r->finfo.filetype != 0) { + resource->exists = 1; + resource->collection = r->finfo.filetype == APR_DIR; + + /* unused info in the URL will indicate a null resource */ + + if (r->path_info != NULL && *r->path_info != '\0') { + if (resource->collection) { + /* only a trailing "/" is allowed */ + if (*r->path_info != '/' || r->path_info[1] != '\0') { + + /* + ** This URL/filename represents a locknull resource or + ** possibly a destination of a MOVE/COPY + */ + resource->exists = 0; + resource->collection = 0; + } + } + else + { + /* + ** The base of the path refers to a file -- nothing should + ** be in path_info. The resource is simply an error: it + ** can't be a null or a locknull resource. + */ + return dav_new_error(r->pool, HTTP_BAD_REQUEST, 0, + "The URL contains extraneous path " + "components. The resource could not " + "be identified."); + } + + /* retain proper integrity across the structures */ + if (!resource->exists) { + ctx->finfo.filetype = 0; + } + } + } + + *result_resource = resource; + return NULL; +} + +static dav_error * dav_fs_get_parent_resource(const dav_resource *resource, + dav_resource **result_parent) +{ + dav_resource_private *ctx = resource->info; + dav_resource_private *parent_ctx; + dav_resource *parent_resource; + apr_status_t rv; + char *dirpath; + const char *testroot; + const char *testpath; + + /* If we're at the root of the URL space, then there is no parent. */ + if (strcmp(resource->uri, "/") == 0) { + *result_parent = NULL; + return NULL; + } + + /* If given resource is root, then there is no parent. + * Unless we can retrieve the filepath root, this is + * intendend to fail. If we split the root and + * no path info remains, then we also fail. + */ + testpath = ctx->pathname; + rv = apr_filepath_root(&testroot, &testpath, 0, ctx->pool); + if ((rv != APR_SUCCESS && rv != APR_ERELATIVE) + || !testpath || !*testpath) { + *result_parent = NULL; + return NULL; + } + + /* ### optimize this into a single allocation! */ + + /* Create private resource context descriptor */ + parent_ctx = apr_pcalloc(ctx->pool, sizeof(*parent_ctx)); + + /* ### this should go away */ + parent_ctx->pool = ctx->pool; + + dirpath = ap_make_dirstr_parent(ctx->pool, ctx->pathname); + if (strlen(dirpath) > 1 && dirpath[strlen(dirpath) - 1] == '/') + dirpath[strlen(dirpath) - 1] = '\0'; + parent_ctx->pathname = dirpath; + + parent_resource = apr_pcalloc(ctx->pool, sizeof(*parent_resource)); + parent_resource->info = parent_ctx; + parent_resource->collection = 1; + parent_resource->hooks = &dav_hooks_repository_fs; + parent_resource->pool = resource->pool; + + if (resource->uri != NULL) { + char *uri = ap_make_dirstr_parent(ctx->pool, resource->uri); + if (strlen(uri) > 1 && uri[strlen(uri) - 1] == '/') + uri[strlen(uri) - 1] = '\0'; + parent_resource->uri = uri; + } + + rv = apr_stat(&parent_ctx->finfo, parent_ctx->pathname, + APR_FINFO_NORM, ctx->pool); + if (rv == APR_SUCCESS || rv == APR_INCOMPLETE) { + parent_resource->exists = 1; + } + + *result_parent = parent_resource; + return NULL; +} + +static int dav_fs_is_same_resource( + const dav_resource *res1, + const dav_resource *res2) +{ + dav_resource_private *ctx1 = res1->info; + dav_resource_private *ctx2 = res2->info; + + if (res1->hooks != res2->hooks) + return 0; + + if ((ctx1->finfo.filetype != 0) && (ctx2->finfo.filetype != 0) + && (ctx1->finfo.valid & ctx2->finfo.valid & APR_FINFO_INODE)) { + return ctx1->finfo.inode == ctx2->finfo.inode; + } + else { + return strcmp(ctx1->pathname, ctx2->pathname) == 0; + } +} + +static int dav_fs_is_parent_resource( + const dav_resource *res1, + const dav_resource *res2) +{ + dav_resource_private *ctx1 = res1->info; + dav_resource_private *ctx2 = res2->info; + apr_size_t len1 = strlen(ctx1->pathname); + apr_size_t len2; + + if (res1->hooks != res2->hooks) + return 0; + + /* it is safe to use ctx2 now */ + len2 = strlen(ctx2->pathname); + + return (len2 > len1 + && memcmp(ctx1->pathname, ctx2->pathname, len1) == 0 + && ctx2->pathname[len1] == '/'); +} + +static dav_error * dav_fs_open_stream(const dav_resource *resource, + dav_stream_mode mode, + dav_stream **stream) +{ + apr_pool_t *p = resource->info->pool; + dav_stream *ds = apr_pcalloc(p, sizeof(*ds)); + apr_int32_t flags; + apr_status_t rv; + + switch (mode) { + default: + flags = APR_READ | APR_BINARY; + break; + + case DAV_MODE_WRITE_TRUNC: + flags = APR_WRITE | APR_CREATE | APR_TRUNCATE | APR_BINARY; + break; + case DAV_MODE_WRITE_SEEKABLE: + flags = APR_WRITE | APR_CREATE | APR_BINARY; + break; + } + + ds->p = p; + ds->pathname = resource->info->pathname; + rv = apr_file_open(&ds->f, ds->pathname, flags, APR_OS_DEFAULT, ds->p); + if (rv != APR_SUCCESS) { + return dav_new_error(p, MAP_IO2HTTP(rv), 0, + "An error occurred while opening a resource."); + } + + /* (APR registers cleanups for the fd with the pool) */ + + *stream = ds; + return NULL; +} + +static dav_error * dav_fs_close_stream(dav_stream *stream, int commit) +{ + apr_file_close(stream->f); + + if (!commit) { + if (apr_file_remove(stream->pathname, stream->p) != APR_SUCCESS) { + /* ### use a better description? */ + return dav_new_error(stream->p, HTTP_INTERNAL_SERVER_ERROR, 0, + "There was a problem removing (rolling " + "back) the resource " + "when it was being closed."); + } + } + + return NULL; +} + +static dav_error * dav_fs_write_stream(dav_stream *stream, + const void *buf, apr_size_t bufsize) +{ + apr_status_t status; + + status = apr_file_write_full(stream->f, buf, bufsize, NULL); + if (APR_STATUS_IS_ENOSPC(status)) { + return dav_new_error(stream->p, HTTP_INSUFFICIENT_STORAGE, 0, + "There is not enough storage to write to " + "this resource."); + } + else if (status != APR_SUCCESS) { + /* ### use something besides 500? */ + return dav_new_error(stream->p, HTTP_INTERNAL_SERVER_ERROR, 0, + "An error occurred while writing to a " + "resource."); + } + return NULL; +} + +static dav_error * dav_fs_seek_stream(dav_stream *stream, apr_off_t abs_pos) +{ + if (apr_file_seek(stream->f, APR_SET, &abs_pos) != APR_SUCCESS) { + /* ### should check whether apr_file_seek set abs_pos was set to the + * correct position? */ + /* ### use something besides 500? */ + return dav_new_error(stream->p, HTTP_INTERNAL_SERVER_ERROR, 0, + "Could not seek to specified position in the " + "resource."); + } + return NULL; +} + + +#if DEBUG_GET_HANDLER + +/* only define set_headers() and deliver() for debug purposes */ + + +static dav_error * dav_fs_set_headers(request_rec *r, + const dav_resource *resource) +{ + /* ### this function isn't really used since we have a get_pathname */ + if (!resource->exists) + return NULL; + + /* make sure the proper mtime is in the request record */ + ap_update_mtime(r, resource->info->finfo.mtime); + + /* ### note that these use r->filename rather than */ + ap_set_last_modified(r); + ap_set_etag(r); + + /* we accept byte-ranges */ + apr_table_setn(r->headers_out, "Accept-Ranges", "bytes"); + + /* set up the Content-Length header */ + ap_set_content_length(r, resource->info->finfo.size); + + /* ### how to set the content type? */ + /* ### until this is resolved, the Content-Type header is busted */ + + return NULL; +} + +static dav_error * dav_fs_deliver(const dav_resource *resource, + ap_filter_t *output) +{ + apr_pool_t *pool = resource->pool; + apr_bucket_brigade *bb; + apr_file_t *fd; + apr_status_t status; + apr_bucket *bkt; + + /* Check resource type */ + if (resource->type != DAV_RESOURCE_TYPE_REGULAR + && resource->type != DAV_RESOURCE_TYPE_VERSION + && resource->type != DAV_RESOURCE_TYPE_WORKING) { + return dav_new_error(pool, HTTP_CONFLICT, 0, + "Cannot GET this type of resource."); + } + if (resource->collection) { + return dav_new_error(pool, HTTP_CONFLICT, 0, + "There is no default response to GET for a " + "collection."); + } + + if ((status = apr_file_open(&fd, resource->info->pathname, + APR_READ | APR_BINARY, 0, + pool)) != APR_SUCCESS) { + return dav_new_error(pool, HTTP_FORBIDDEN, 0, + "File permissions deny server access."); + } + + bb = apr_brigade_create(pool, output->c->bucket_alloc); + + /* ### this does not handle large files. but this is test code anyway */ + bkt = apr_bucket_file_create(fd, 0, + (apr_size_t)resource->info->finfo.size, + pool, output->c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, bkt); + + bkt = apr_bucket_eos_create(output->c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, bkt); + + if ((status = ap_pass_brigade(output, bb)) != APR_SUCCESS) { + return dav_new_error(pool, HTTP_FORBIDDEN, 0, + "Could not write contents to filter."); + } + + return NULL; +} + +#endif /* DEBUG_GET_HANDLER */ + + +static dav_error * dav_fs_create_collection(dav_resource *resource) +{ + dav_resource_private *ctx = resource->info; + apr_status_t status; + + status = apr_dir_make(ctx->pathname, APR_OS_DEFAULT, ctx->pool); + if (APR_STATUS_IS_ENOSPC(status)) { + return dav_new_error(ctx->pool, HTTP_INSUFFICIENT_STORAGE, 0, + "There is not enough storage to create " + "this collection."); + } + else if (APR_STATUS_IS_ENOENT(status)) { + return dav_new_error(ctx->pool, HTTP_CONFLICT, 0, + "Cannot create collection; intermediate " + "collection does not exist."); + } + else if (status != APR_SUCCESS) { + /* ### refine this error message? */ + return dav_new_error(ctx->pool, HTTP_FORBIDDEN, 0, + "Unable to create collection."); + } + + /* update resource state to show it exists as a collection */ + resource->exists = 1; + resource->collection = 1; + + return NULL; +} + +static dav_error * dav_fs_copymove_walker(dav_walk_resource *wres, + int calltype) +{ + dav_fs_copymove_walk_ctx *ctx = wres->walk_ctx; + dav_resource_private *srcinfo = wres->resource->info; + dav_resource_private *dstinfo = ctx->res_dst->info; + dav_error *err = NULL; + + if (wres->resource->collection) { + if (calltype == DAV_CALLTYPE_POSTFIX) { + /* Postfix call for MOVE. delete the source dir. + * Note: when copying, we do not enable the postfix-traversal. + */ + /* ### we are ignoring any error here; what should we do? */ + (void) apr_dir_remove(srcinfo->pathname, ctx->pool); + } + else { + /* copy/move of a collection. Create the new, target collection */ + if (apr_dir_make(dstinfo->pathname, APR_OS_DEFAULT, + ctx->pool) != APR_SUCCESS) { + /* ### assume it was a permissions problem */ + /* ### need a description here */ + err = dav_new_error(ctx->pool, HTTP_FORBIDDEN, 0, NULL); + } + } + } + else { + err = dav_fs_copymove_file(ctx->is_move, ctx->pool, + srcinfo->pathname, dstinfo->pathname, + &ctx->work_buf); + /* ### push a higher-level description? */ + } + + /* + ** If we have a "not so bad" error, then it might need to go into a + ** multistatus response. + ** + ** For a MOVE, it will always go into the multistatus. It could be + ** that everything has been moved *except* for the root. Using a + ** multistatus (with no errors for the other resources) will signify + ** this condition. + ** + ** For a COPY, we are traversing in a prefix fashion. If the root fails, + ** then we can just bail out now. + */ + if (err != NULL + && !ap_is_HTTP_SERVER_ERROR(err->status) + && (ctx->is_move + || !dav_fs_is_same_resource(wres->resource, ctx->root))) { + /* ### use errno to generate DAV:responsedescription? */ + dav_add_response(wres, err->status, NULL); + + /* the error is in the multistatus now. do not stop the traversal. */ + return NULL; + } + + return err; +} + +static dav_error *dav_fs_copymove_resource( + int is_move, + const dav_resource *src, + const dav_resource *dst, + int depth, + dav_response **response) +{ + dav_error *err = NULL; + dav_buffer work_buf = { 0 }; + + *response = NULL; + + /* if a collection, recursively copy/move it and its children, + * including the state dirs + */ + if (src->collection) { + dav_walk_params params = { 0 }; + dav_response *multi_status; + + params.walk_type = DAV_WALKTYPE_NORMAL | DAV_WALKTYPE_HIDDEN; + params.func = dav_fs_copymove_walker; + params.pool = src->info->pool; + params.root = src; + + /* params.walk_ctx is managed by dav_fs_internal_walk() */ + + /* postfix is needed for MOVE to delete source dirs */ + if (is_move) + params.walk_type |= DAV_WALKTYPE_POSTFIX; + + /* note that we return the error OR the multistatus. never both */ + + if ((err = dav_fs_internal_walk(¶ms, depth, is_move, dst, + &multi_status)) != NULL) { + /* on a "real" error, then just punt. nothing else to do. */ + return err; + } + + if ((*response = multi_status) != NULL) { + /* some multistatus responses exist. wrap them in a 207 */ + return dav_new_error(src->info->pool, HTTP_MULTI_STATUS, 0, + "Error(s) occurred on some resources during " + "the COPY/MOVE process."); + } + + return NULL; + } + + /* not a collection */ + if ((err = dav_fs_copymove_file(is_move, src->info->pool, + src->info->pathname, dst->info->pathname, + &work_buf)) != NULL) { + /* ### push a higher-level description? */ + return err; + } + + /* copy/move properties as well */ + return dav_fs_copymoveset(is_move, src->info->pool, src, dst, &work_buf); +} + +static dav_error * dav_fs_copy_resource( + const dav_resource *src, + dav_resource *dst, + int depth, + dav_response **response) +{ + dav_error *err; + +#if DAV_DEBUG + if (src->hooks != dst->hooks) { + /* + ** ### strictly speaking, this is a design error; we should not + ** ### have reached this point. + */ + return dav_new_error(src->info->pool, HTTP_INTERNAL_SERVER_ERROR, 0, + "DESIGN ERROR: a mix of repositories " + "was passed to copy_resource."); + } +#endif + + if ((err = dav_fs_copymove_resource(0, src, dst, depth, + response)) == NULL) { + + /* update state of destination resource to show it exists */ + dst->exists = 1; + dst->collection = src->collection; + } + + return err; +} + +static dav_error * dav_fs_move_resource( + dav_resource *src, + dav_resource *dst, + dav_response **response) +{ + dav_resource_private *srcinfo = src->info; + dav_resource_private *dstinfo = dst->info; + dav_error *err; + int can_rename = 0; + +#if DAV_DEBUG + if (src->hooks != dst->hooks) { + /* + ** ### strictly speaking, this is a design error; we should not + ** ### have reached this point. + */ + return dav_new_error(src->info->pool, HTTP_INTERNAL_SERVER_ERROR, 0, + "DESIGN ERROR: a mix of repositories " + "was passed to move_resource."); + } +#endif + + /* determine whether a simple rename will work. + * Assume source exists, else we wouldn't get called. + */ + if (dstinfo->finfo.filetype != 0) { + if (dstinfo->finfo.device == srcinfo->finfo.device) { + /* target exists and is on the same device. */ + can_rename = 1; + } + } + else { + const char *dirpath; + apr_finfo_t finfo; + apr_status_t rv; + + /* destination does not exist, but the parent directory should, + * so try it + */ + dirpath = ap_make_dirstr_parent(dstinfo->pool, dstinfo->pathname); + /* + * XXX: If missing dev ... then what test? + * Really need a try and failover for those platforms. + * + */ + rv = apr_stat(&finfo, dirpath, APR_FINFO_DEV, dstinfo->pool); + if ((rv == APR_SUCCESS || rv == APR_INCOMPLETE) + && (finfo.valid & srcinfo->finfo.valid & APR_FINFO_DEV) + && (finfo.device == srcinfo->finfo.device)) { + can_rename = 1; + } + } + + /* if we can't simply rename, then do it the hard way... */ + if (!can_rename) { + if ((err = dav_fs_copymove_resource(1, src, dst, DAV_INFINITY, + response)) == NULL) { + /* update resource states */ + dst->exists = 1; + dst->collection = src->collection; + src->exists = 0; + src->collection = 0; + } + + return err; + } + + /* a rename should work. do it, and move properties as well */ + + /* no multistatus response */ + *response = NULL; + + /* ### APR has no rename? */ + if (apr_file_rename(srcinfo->pathname, dstinfo->pathname, + srcinfo->pool) != APR_SUCCESS) { + /* ### should have a better error than this. */ + return dav_new_error(srcinfo->pool, HTTP_INTERNAL_SERVER_ERROR, 0, + "Could not rename resource."); + } + + /* update resource states */ + dst->exists = 1; + dst->collection = src->collection; + src->exists = 0; + src->collection = 0; + + if ((err = dav_fs_copymoveset(1, src->info->pool, + src, dst, NULL)) == NULL) { + /* no error. we're done. go ahead and return now. */ + return NULL; + } + + /* error occurred during properties move; try to put resource back */ + if (apr_file_rename(dstinfo->pathname, srcinfo->pathname, + srcinfo->pool) != APR_SUCCESS) { + /* couldn't put it back! */ + return dav_push_error(srcinfo->pool, + HTTP_INTERNAL_SERVER_ERROR, 0, + "The resource was moved, but a failure " + "occurred during the move of its " + "properties. The resource could not be " + "restored to its original location. The " + "server is now in an inconsistent state.", + err); + } + + /* update resource states again */ + src->exists = 1; + src->collection = dst->collection; + dst->exists = 0; + dst->collection = 0; + + /* resource moved back, but properties may be inconsistent */ + return dav_push_error(srcinfo->pool, + HTTP_INTERNAL_SERVER_ERROR, 0, + "The resource was moved, but a failure " + "occurred during the move of its properties. " + "The resource was moved back to its original " + "location, but its properties may have been " + "partially moved. The server may be in an " + "inconsistent state.", + err); +} + +static dav_error * dav_fs_delete_walker(dav_walk_resource *wres, int calltype) +{ + dav_resource_private *info = wres->resource->info; + + /* do not attempt to remove a null resource, + * or a collection with children + */ + if (wres->resource->exists && + (!wres->resource->collection || calltype == DAV_CALLTYPE_POSTFIX)) { + /* try to remove the resource */ + apr_status_t result; + + result = wres->resource->collection + ? apr_dir_remove(info->pathname, wres->pool) + : apr_file_remove(info->pathname, wres->pool); + + /* + ** If an error occurred, then add it to multistatus response. + ** Note that we add it for the root resource, too. It is quite + ** possible to delete the whole darn tree, yet fail on the root. + ** + ** (also: remember we are deleting via a postfix traversal) + */ + if (result != APR_SUCCESS) { + /* ### assume there is a permissions problem */ + + /* ### use errno to generate DAV:responsedescription? */ + dav_add_response(wres, HTTP_FORBIDDEN, NULL); + } + } + + return NULL; +} + +static dav_error * dav_fs_remove_resource(dav_resource *resource, + dav_response **response) +{ + dav_resource_private *info = resource->info; + + *response = NULL; + + /* if a collection, recursively remove it and its children, + * including the state dirs + */ + if (resource->collection) { + dav_walk_params params = { 0 }; + dav_error *err = NULL; + dav_response *multi_status; + + params.walk_type = (DAV_WALKTYPE_NORMAL + | DAV_WALKTYPE_HIDDEN + | DAV_WALKTYPE_POSTFIX); + params.func = dav_fs_delete_walker; + params.pool = info->pool; + params.root = resource; + + if ((err = dav_fs_walk(¶ms, DAV_INFINITY, + &multi_status)) != NULL) { + /* on a "real" error, then just punt. nothing else to do. */ + return err; + } + + if ((*response = multi_status) != NULL) { + /* some multistatus responses exist. wrap them in a 207 */ + return dav_new_error(info->pool, HTTP_MULTI_STATUS, 0, + "Error(s) occurred on some resources during " + "the deletion process."); + } + + /* no errors... update resource state */ + resource->exists = 0; + resource->collection = 0; + + return NULL; + } + + /* not a collection; remove the file and its properties */ + if (apr_file_remove(info->pathname, info->pool) != APR_SUCCESS) { + /* ### put a description in here */ + return dav_new_error(info->pool, HTTP_FORBIDDEN, 0, NULL); + } + + /* update resource state */ + resource->exists = 0; + resource->collection = 0; + + /* remove properties and return its result */ + return dav_fs_deleteset(info->pool, resource); +} + +/* ### move this to dav_util? */ +/* Walk recursively down through directories, * + * including lock-null resources as we go. */ +static dav_error * dav_fs_walker(dav_fs_walker_context *fsctx, int depth) +{ + const dav_walk_params *params = fsctx->params; + apr_pool_t *pool = params->pool; + dav_error *err = NULL; + int isdir = fsctx->res1.collection; + apr_finfo_t dirent; + apr_dir_t *dirp; + + /* ensure the context is prepared properly, then call the func */ + err = (*params->func)(&fsctx->wres, + isdir + ? DAV_CALLTYPE_COLLECTION + : DAV_CALLTYPE_MEMBER); + if (err != NULL) { + return err; + } + + if (depth == 0 || !isdir) { + return NULL; + } + + /* put a trailing slash onto the directory, in preparation for appending + * files to it as we discovery them within the directory */ + dav_check_bufsize(pool, &fsctx->path1, DAV_BUFFER_PAD); + fsctx->path1.buf[fsctx->path1.cur_len++] = '/'; + fsctx->path1.buf[fsctx->path1.cur_len] = '\0'; /* in pad area */ + + /* if a secondary path is present, then do that, too */ + if (fsctx->path2.buf != NULL) { + dav_check_bufsize(pool, &fsctx->path2, DAV_BUFFER_PAD); + fsctx->path2.buf[fsctx->path2.cur_len++] = '/'; + fsctx->path2.buf[fsctx->path2.cur_len] = '\0'; /* in pad area */ + } + + /* Note: the URI should ALREADY have a trailing "/" */ + + /* for this first pass of files, all resources exist */ + fsctx->res1.exists = 1; + + /* a file is the default; we'll adjust if we hit a directory */ + fsctx->res1.collection = 0; + fsctx->res2.collection = 0; + + /* open and scan the directory */ + if ((apr_dir_open(&dirp, fsctx->path1.buf, pool)) != APR_SUCCESS) { + /* ### need a better error */ + return dav_new_error(pool, HTTP_NOT_FOUND, 0, NULL); + } + while ((apr_dir_read(&dirent, APR_FINFO_DIRENT, dirp)) == APR_SUCCESS) { + apr_size_t len; + apr_status_t status; + + len = strlen(dirent.name); + + /* avoid recursing into our current, parent, or state directories */ + if (dirent.name[0] == '.' + && (len == 1 || (dirent.name[1] == '.' && len == 2))) { + continue; + } + + if (params->walk_type & DAV_WALKTYPE_AUTH) { + /* ### need to authorize each file */ + /* ### example: .htaccess is normally configured to fail auth */ + + /* stuff in the state directory is never authorized! */ + if (!strcmp(dirent.name, DAV_FS_STATE_DIR)) { + continue; + } + } + /* skip the state dir unless a HIDDEN is performed */ + if (!(params->walk_type & DAV_WALKTYPE_HIDDEN) + && !strcmp(dirent.name, DAV_FS_STATE_DIR)) { + continue; + } + + /* append this file onto the path buffer (copy null term) */ + dav_buffer_place_mem(pool, &fsctx->path1, dirent.name, len + 1, 0); + + + /* ### Optimize me, dirent can give us what we need! */ + status = apr_lstat(&fsctx->info1.finfo, fsctx->path1.buf, + APR_FINFO_NORM, pool); + if (status != APR_SUCCESS && status != APR_INCOMPLETE) { + /* woah! where'd it go? */ + /* ### should have a better error here */ + err = dav_new_error(pool, HTTP_NOT_FOUND, 0, NULL); + break; + } + + /* copy the file to the URI, too. NOTE: we will pad an extra byte + for the trailing slash later. */ + dav_buffer_place_mem(pool, &fsctx->uri_buf, dirent.name, len + 1, 1); + + /* if there is a secondary path, then do that, too */ + if (fsctx->path2.buf != NULL) { + dav_buffer_place_mem(pool, &fsctx->path2, dirent.name, len + 1, 0); + } + + /* set up the (internal) pathnames for the two resources */ + fsctx->info1.pathname = fsctx->path1.buf; + fsctx->info2.pathname = fsctx->path2.buf; + + /* set up the URI for the current resource */ + fsctx->res1.uri = fsctx->uri_buf.buf; + + /* ### for now, only process regular files (e.g. skip symlinks) */ + if (fsctx->info1.finfo.filetype == APR_REG) { + /* call the function for the specified dir + file */ + if ((err = (*params->func)(&fsctx->wres, + DAV_CALLTYPE_MEMBER)) != NULL) { + /* ### maybe add a higher-level description? */ + break; + } + } + else if (fsctx->info1.finfo.filetype == APR_DIR) { + apr_size_t save_path_len = fsctx->path1.cur_len; + apr_size_t save_uri_len = fsctx->uri_buf.cur_len; + apr_size_t save_path2_len = fsctx->path2.cur_len; + + /* adjust length to incorporate the subdir name */ + fsctx->path1.cur_len += len; + fsctx->path2.cur_len += len; + + /* adjust URI length to incorporate subdir and a slash */ + fsctx->uri_buf.cur_len += len + 1; + fsctx->uri_buf.buf[fsctx->uri_buf.cur_len - 1] = '/'; + fsctx->uri_buf.buf[fsctx->uri_buf.cur_len] = '\0'; + + /* switch over to a collection */ + fsctx->res1.collection = 1; + fsctx->res2.collection = 1; + + /* recurse on the subdir */ + /* ### don't always want to quit on error from single child */ + if ((err = dav_fs_walker(fsctx, depth - 1)) != NULL) { + /* ### maybe add a higher-level description? */ + break; + } + + /* put the various information back */ + fsctx->path1.cur_len = save_path_len; + fsctx->path2.cur_len = save_path2_len; + fsctx->uri_buf.cur_len = save_uri_len; + + fsctx->res1.collection = 0; + fsctx->res2.collection = 0; + + /* assert: res1.exists == 1 */ + } + } + + /* ### check the return value of this? */ + apr_dir_close(dirp); + + if (err != NULL) + return err; + + if (params->walk_type & DAV_WALKTYPE_LOCKNULL) { + apr_size_t offset = 0; + + /* null terminate the directory name */ + fsctx->path1.buf[fsctx->path1.cur_len - 1] = '\0'; + + /* Include any lock null resources found in this collection */ + fsctx->res1.collection = 1; + if ((err = dav_fs_get_locknull_members(&fsctx->res1, + &fsctx->locknull_buf)) != NULL) { + /* ### maybe add a higher-level description? */ + return err; + } + + /* put a slash back on the end of the directory */ + fsctx->path1.buf[fsctx->path1.cur_len - 1] = '/'; + + /* these are all non-existant (files) */ + fsctx->res1.exists = 0; + fsctx->res1.collection = 0; + memset(&fsctx->info1.finfo, 0, sizeof(fsctx->info1.finfo)); + + while (offset < fsctx->locknull_buf.cur_len) { + apr_size_t len = strlen(fsctx->locknull_buf.buf + offset); + dav_lock *locks = NULL; + + /* + ** Append the locknull file to the paths and the URI. Note that + ** we don't have to pad the URI for a slash since a locknull + ** resource is not a collection. + */ + dav_buffer_place_mem(pool, &fsctx->path1, + fsctx->locknull_buf.buf + offset, len + 1, 0); + dav_buffer_place_mem(pool, &fsctx->uri_buf, + fsctx->locknull_buf.buf + offset, len + 1, 0); + if (fsctx->path2.buf != NULL) { + dav_buffer_place_mem(pool, &fsctx->path2, + fsctx->locknull_buf.buf + offset, + len + 1, 0); + } + + /* set up the (internal) pathnames for the two resources */ + fsctx->info1.pathname = fsctx->path1.buf; + fsctx->info2.pathname = fsctx->path2.buf; + + /* set up the URI for the current resource */ + fsctx->res1.uri = fsctx->uri_buf.buf; + + /* + ** To prevent a PROPFIND showing an expired locknull + ** resource, query the lock database to force removal + ** of both the lock entry and .locknull, if necessary.. + ** Sure, the query in PROPFIND would do this.. after + ** the locknull resource was already included in the + ** return. + ** + ** NOTE: we assume the caller has opened the lock database + ** if they have provided DAV_WALKTYPE_LOCKNULL. + */ + /* ### we should also look into opening it read-only and + ### eliding timed-out items from the walk, yet leaving + ### them in the locknull database until somebody opens + ### the thing writable. + */ + /* ### probably ought to use has_locks. note the problem + ### mentioned above, though... we would traverse this as + ### a locknull, but then a PROPFIND would load the lock + ### info, causing a timeout and the locks would not be + ### reported. Therefore, a null resource would be returned + ### in the PROPFIND. + ### + ### alternative: just load unresolved locks. any direct + ### locks will be timed out (correct). any indirect will + ### not (correct; consider if a parent timed out -- the + ### timeout routines do not walk and remove indirects; + ### even the resolve func would probably fail when it + ### tried to find a timed-out direct lock). + */ + if ((err = dav_lock_query(params->lockdb, &fsctx->res1, + &locks)) != NULL) { + /* ### maybe add a higher-level description? */ + return err; + } + + /* call the function for the specified dir + file */ + if (locks != NULL && + (err = (*params->func)(&fsctx->wres, + DAV_CALLTYPE_LOCKNULL)) != NULL) { + /* ### maybe add a higher-level description? */ + return err; + } + + offset += len + 1; + } + + /* reset the exists flag */ + fsctx->res1.exists = 1; + } + + if (params->walk_type & DAV_WALKTYPE_POSTFIX) { + /* replace the dirs' trailing slashes with null terms */ + fsctx->path1.buf[--fsctx->path1.cur_len] = '\0'; + fsctx->uri_buf.buf[--fsctx->uri_buf.cur_len] = '\0'; + if (fsctx->path2.buf != NULL) { + fsctx->path2.buf[--fsctx->path2.cur_len] = '\0'; + } + + /* this is a collection which exists */ + fsctx->res1.collection = 1; + + return (*params->func)(&fsctx->wres, DAV_CALLTYPE_POSTFIX); + } + + return NULL; +} + +static dav_error * dav_fs_internal_walk(const dav_walk_params *params, + int depth, int is_move, + const dav_resource *root_dst, + dav_response **response) +{ + dav_fs_walker_context fsctx = { 0 }; + dav_error *err; + dav_fs_copymove_walk_ctx cm_ctx = { 0 }; + +#if DAV_DEBUG + if ((params->walk_type & DAV_WALKTYPE_LOCKNULL) != 0 + && params->lockdb == NULL) { + return dav_new_error(params->pool, HTTP_INTERNAL_SERVER_ERROR, 0, + "DESIGN ERROR: walker called to walk locknull " + "resources, but a lockdb was not provided."); + } +#endif + + fsctx.params = params; + fsctx.wres.walk_ctx = params->walk_ctx; + fsctx.wres.pool = params->pool; + + /* ### zero out versioned, working, baselined? */ + + fsctx.res1 = *params->root; + fsctx.res1.pool = params->pool; + + fsctx.res1.info = &fsctx.info1; + fsctx.info1 = *params->root->info; + + /* the pathname is stored in the path1 buffer */ + dav_buffer_init(params->pool, &fsctx.path1, fsctx.info1.pathname); + fsctx.info1.pathname = fsctx.path1.buf; + + if (root_dst != NULL) { + /* internal call from the COPY/MOVE code. set it up. */ + + fsctx.wres.walk_ctx = &cm_ctx; + cm_ctx.is_move = is_move; + cm_ctx.res_dst = &fsctx.res2; + cm_ctx.root = params->root; + cm_ctx.pool = params->pool; + + fsctx.res2 = *root_dst; + fsctx.res2.exists = 0; + fsctx.res2.collection = 0; + fsctx.res2.uri = NULL; /* we don't track this */ + fsctx.res2.pool = params->pool; + + fsctx.res2.info = &fsctx.info2; + fsctx.info2 = *root_dst->info; + + /* res2 does not exist -- clear its finfo structure */ + memset(&fsctx.info2.finfo, 0, sizeof(fsctx.info2.finfo)); + + /* the pathname is stored in the path2 buffer */ + dav_buffer_init(params->pool, &fsctx.path2, fsctx.info2.pathname); + fsctx.info2.pathname = fsctx.path2.buf; + } + + /* prep the URI buffer */ + dav_buffer_init(params->pool, &fsctx.uri_buf, params->root->uri); + + /* if we have a directory, then ensure the URI has a trailing "/" */ + if (fsctx.res1.collection + && fsctx.uri_buf.buf[fsctx.uri_buf.cur_len - 1] != '/') { + + /* this will fall into the pad area */ + fsctx.uri_buf.buf[fsctx.uri_buf.cur_len++] = '/'; + fsctx.uri_buf.buf[fsctx.uri_buf.cur_len] = '\0'; + } + + /* the current resource's URI is stored in the uri_buf buffer */ + fsctx.res1.uri = fsctx.uri_buf.buf; + + /* point the callback's resource at our structure */ + fsctx.wres.resource = &fsctx.res1; + + /* always return the error, and any/all multistatus responses */ + err = dav_fs_walker(&fsctx, depth); + *response = fsctx.wres.response; + return err; +} + +static dav_error * dav_fs_walk(const dav_walk_params *params, int depth, + dav_response **response) +{ + /* always return the error, and any/all multistatus responses */ + return dav_fs_internal_walk(params, depth, 0, NULL, response); +} + +/* dav_fs_etag: Stolen from ap_make_etag. Creates a strong etag + * for file path. + * ### do we need to return weak tags sometimes? + */ +static const char *dav_fs_getetag(const dav_resource *resource) +{ + dav_resource_private *ctx = resource->info; + + if (!resource->exists) + return apr_pstrdup(ctx->pool, ""); + + if (ctx->finfo.filetype != 0) { + return apr_psprintf(ctx->pool, "\"%lx-%lx-%lx\"", + (unsigned long) ctx->finfo.inode, + (unsigned long) ctx->finfo.size, + (unsigned long) ctx->finfo.mtime); + } + + return apr_psprintf(ctx->pool, "\"%lx\"", (unsigned long) ctx->finfo.mtime); +} + +static const dav_hooks_repository dav_hooks_repository_fs = +{ + DEBUG_GET_HANDLER, /* normally: special GET handling not required */ + dav_fs_get_resource, + dav_fs_get_parent_resource, + dav_fs_is_same_resource, + dav_fs_is_parent_resource, + dav_fs_open_stream, + dav_fs_close_stream, + dav_fs_write_stream, + dav_fs_seek_stream, +#if DEBUG_GET_HANDLER + dav_fs_set_headers, + dav_fs_deliver, +#else + NULL, + NULL, +#endif + dav_fs_create_collection, + dav_fs_copy_resource, + dav_fs_move_resource, + dav_fs_remove_resource, + dav_fs_walk, + dav_fs_getetag, +}; + +static dav_prop_insert dav_fs_insert_prop(const dav_resource *resource, + int propid, dav_prop_insert what, + apr_text_header *phdr) +{ + const char *value; + const char *s; + apr_pool_t *p = resource->info->pool; + const dav_liveprop_spec *info; + int global_ns; + + /* an HTTP-date can be 29 chars plus a null term */ + /* a 64-bit size can be 20 chars plus a null term */ + char buf[DAV_TIMEBUF_SIZE]; + + /* + ** None of FS provider properties are defined if the resource does not + ** exist. Just bail for this case. + ** + ** Even though we state that the FS properties are not defined, the + ** client cannot store dead values -- we deny that thru the is_writable + ** hook function. + */ + if (!resource->exists) + return DAV_PROP_INSERT_NOTDEF; + + switch (propid) { + case DAV_PROPID_creationdate: + /* + ** Closest thing to a creation date. since we don't actually + ** perform the operations that would modify ctime (after we + ** create the file), then we should be pretty safe here. + */ + dav_format_time(DAV_STYLE_ISO8601, + resource->info->finfo.ctime, + buf); + value = buf; + break; + + case DAV_PROPID_getcontentlength: + /* our property, but not defined on collection resources */ + if (resource->collection) + return DAV_PROP_INSERT_NOTDEF; + + (void) sprintf(buf, "%" APR_OFF_T_FMT, resource->info->finfo.size); + value = buf; + break; + + case DAV_PROPID_getetag: + value = dav_fs_getetag(resource); + break; + + case DAV_PROPID_getlastmodified: + dav_format_time(DAV_STYLE_RFC822, + resource->info->finfo.mtime, + buf); + value = buf; + break; + + case DAV_PROPID_FS_executable: + /* our property, but not defined on collection resources */ + if (resource->collection) + return DAV_PROP_INSERT_NOTDEF; + + /* our property, but not defined on this platform */ + if (!(resource->info->finfo.valid & APR_FINFO_UPROT)) + return DAV_PROP_INSERT_NOTDEF; + + /* the files are "ours" so we only need to check owner exec privs */ + if (resource->info->finfo.protection & APR_UEXECUTE) + value = "T"; + else + value = "F"; + break; + + default: + /* ### what the heck was this property? */ + return DAV_PROP_INSERT_NOTDEF; + } + + /* assert: value != NULL */ + + /* get the information and global NS index for the property */ + global_ns = dav_get_liveprop_info(propid, &dav_fs_liveprop_group, &info); + + /* assert: info != NULL && info->name != NULL */ + + /* DBG3("FS: inserting lp%d:%s (local %d)", ns, scan->name, scan->ns); */ + + if (what == DAV_PROP_INSERT_VALUE) { + s = apr_psprintf(p, "%s" DEBUG_CR, + global_ns, info->name, value, global_ns, info->name); + } + else if (what == DAV_PROP_INSERT_NAME) { + s = apr_psprintf(p, "" DEBUG_CR, global_ns, info->name); + } + else { + /* assert: what == DAV_PROP_INSERT_SUPPORTED */ + s = apr_psprintf(p, + "" DEBUG_CR, + info->name, dav_fs_namespace_uris[info->ns]); + } + apr_text_append(p, phdr, s); + + /* we inserted what was asked for */ + return what; +} + +static int dav_fs_is_writable(const dav_resource *resource, int propid) +{ + const dav_liveprop_spec *info; + +#ifdef DAV_FS_HAS_EXECUTABLE + /* if we have the executable property, and this isn't a collection, + then the property is writable. */ + if (propid == DAV_PROPID_FS_executable && !resource->collection) + return 1; +#endif + + (void) dav_get_liveprop_info(propid, &dav_fs_liveprop_group, &info); + return info->is_writable; +} + +static dav_error *dav_fs_patch_validate(const dav_resource *resource, + const apr_xml_elem *elem, + int operation, + void **context, + int *defer_to_dead) +{ + const apr_text *cdata; + const apr_text *f_cdata; + char value; + dav_elem_private *priv = elem->priv; + + if (priv->propid != DAV_PROPID_FS_executable) { + *defer_to_dead = 1; + return NULL; + } + + if (operation == DAV_PROP_OP_DELETE) { + return dav_new_error(resource->info->pool, HTTP_CONFLICT, 0, + "The 'executable' property cannot be removed."); + } + + cdata = elem->first_cdata.first; + + /* ### hmm. this isn't actually looking at all the possible text items */ + f_cdata = elem->first_child == NULL + ? NULL + : elem->first_child->following_cdata.first; + + /* DBG3("name=%s cdata=%s f_cdata=%s",elem->name,cdata ? cdata->text : "[null]",f_cdata ? f_cdata->text : "[null]"); */ + + if (cdata == NULL) { + if (f_cdata == NULL) { + return dav_new_error(resource->info->pool, HTTP_CONFLICT, 0, + "The 'executable' property expects a single " + "character, valued 'T' or 'F'. There was no " + "value submitted."); + } + cdata = f_cdata; + } + else if (f_cdata != NULL) + goto too_long; + + if (cdata->next != NULL || strlen(cdata->text) != 1) + goto too_long; + + value = cdata->text[0]; + if (value != 'T' && value != 'F') { + return dav_new_error(resource->info->pool, HTTP_CONFLICT, 0, + "The 'executable' property expects a single " + "character, valued 'T' or 'F'. The value " + "submitted is invalid."); + } + + *context = (void *)(value == 'T'); + + return NULL; + + too_long: + return dav_new_error(resource->info->pool, HTTP_CONFLICT, 0, + "The 'executable' property expects a single " + "character, valued 'T' or 'F'. The value submitted " + "has too many characters."); + +} + +static dav_error *dav_fs_patch_exec(const dav_resource *resource, + const apr_xml_elem *elem, + int operation, + void *context, + dav_liveprop_rollback **rollback_ctx) +{ + int value = context != NULL; + apr_fileperms_t perms = resource->info->finfo.protection; + int old_value = (perms & APR_UEXECUTE) != 0; + + /* assert: prop == executable. operation == SET. */ + + /* don't do anything if there is no change. no rollback info either. */ + /* DBG2("new value=%d (old=%d)", value, old_value); */ + if (value == old_value) + return NULL; + + perms &= ~APR_UEXECUTE; + if (value) + perms |= APR_UEXECUTE; + + if (apr_file_perms_set(resource->info->pathname, perms) != APR_SUCCESS) { + return dav_new_error(resource->info->pool, + HTTP_INTERNAL_SERVER_ERROR, 0, + "Could not set the executable flag of the " + "target resource."); + } + + /* update the resource and set up the rollback context */ + resource->info->finfo.protection = perms; + *rollback_ctx = (dav_liveprop_rollback *)old_value; + + return NULL; +} + +static void dav_fs_patch_commit(const dav_resource *resource, + int operation, + void *context, + dav_liveprop_rollback *rollback_ctx) +{ + /* nothing to do */ +} + +static dav_error *dav_fs_patch_rollback(const dav_resource *resource, + int operation, + void *context, + dav_liveprop_rollback *rollback_ctx) +{ + apr_fileperms_t perms = resource->info->finfo.protection & ~APR_UEXECUTE; + int value = rollback_ctx != NULL; + + /* assert: prop == executable. operation == SET. */ + + /* restore the executable bit */ + if (value) + perms |= APR_UEXECUTE; + + if (apr_file_perms_set(resource->info->pathname, perms) != APR_SUCCESS) { + return dav_new_error(resource->info->pool, + HTTP_INTERNAL_SERVER_ERROR, 0, + "After a failure occurred, the resource's " + "executable flag could not be restored."); + } + + /* restore the resource's state */ + resource->info->finfo.protection = perms; + + return NULL; +} + + +static const dav_hooks_liveprop dav_hooks_liveprop_fs = +{ + dav_fs_insert_prop, + dav_fs_is_writable, + dav_fs_namespace_uris, + dav_fs_patch_validate, + dav_fs_patch_exec, + dav_fs_patch_commit, + dav_fs_patch_rollback +}; + +static const dav_provider dav_fs_provider = +{ + &dav_hooks_repository_fs, + &dav_hooks_db_dbm, + &dav_hooks_locks_fs, + NULL, /* vsn */ + NULL, /* binding */ + NULL, /* search */ + + NULL /* ctx */ +}; + +void dav_fs_gather_propsets(apr_array_header_t *uris) +{ +#ifdef DAV_FS_HAS_EXECUTABLE + *(const char **)apr_array_push(uris) = + ""; +#endif +} + +int dav_fs_find_liveprop(const dav_resource *resource, + const char *ns_uri, const char *name, + const dav_hooks_liveprop **hooks) +{ + /* don't try to find any liveprops if this isn't "our" resource */ + if (resource->hooks != &dav_hooks_repository_fs) + return 0; + return dav_do_find_liveprop(ns_uri, name, &dav_fs_liveprop_group, hooks); +} + +void dav_fs_insert_all_liveprops(request_rec *r, const dav_resource *resource, + dav_prop_insert what, apr_text_header *phdr) +{ + /* don't insert any liveprops if this isn't "our" resource */ + if (resource->hooks != &dav_hooks_repository_fs) + return; + + if (!resource->exists) { + /* a lock-null resource */ + /* + ** ### technically, we should insert empty properties. dunno offhand + ** ### what part of the spec said this, but it was essentially thus: + ** ### "the properties should be defined, but may have no value". + */ + return; + } + + (void) dav_fs_insert_prop(resource, DAV_PROPID_creationdate, + what, phdr); + (void) dav_fs_insert_prop(resource, DAV_PROPID_getcontentlength, + what, phdr); + (void) dav_fs_insert_prop(resource, DAV_PROPID_getlastmodified, + what, phdr); + (void) dav_fs_insert_prop(resource, DAV_PROPID_getetag, + what, phdr); + +#ifdef DAV_FS_HAS_EXECUTABLE + /* Only insert this property if it is defined for this platform. */ + (void) dav_fs_insert_prop(resource, DAV_PROPID_FS_executable, + what, phdr); +#endif + + /* ### we know the others aren't defined as liveprops */ +} + +void dav_fs_register(apr_pool_t *p) +{ + /* register the namespace URIs */ + dav_register_liveprop_group(p, &dav_fs_liveprop_group); + + /* register the repository provider */ + dav_register_provider(p, "filesystem", &dav_fs_provider); +} diff --git a/rubbos/app/httpd-2.0.64/modules/dav/fs/repos.h b/rubbos/app/httpd-2.0.64/modules/dav/fs/repos.h new file mode 100644 index 00000000..d7962d56 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/dav/fs/repos.h @@ -0,0 +1,78 @@ +/* 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. + */ + +/* +** Declarations for the filesystem repository implementation +*/ + +#ifndef _DAV_FS_REPOS_H_ +#define _DAV_FS_REPOS_H_ + +/* the subdirectory to hold all DAV-related information for a directory */ +#define DAV_FS_STATE_DIR ".DAV" +#define DAV_FS_STATE_FILE_FOR_DIR ".state_for_dir" +#define DAV_FS_LOCK_NULL_FILE ".locknull" + + +/* ensure that our state subdirectory is present */ +void dav_fs_ensure_state_dir(apr_pool_t *p, const char *dirname); + +/* return the storage pool associated with a resource */ +apr_pool_t *dav_fs_pool(const dav_resource *resource); + +/* return the full pathname for a resource */ +const char *dav_fs_pathname(const dav_resource *resource); + +/* return the directory and filename for a resource */ +dav_error * dav_fs_dir_file_name(const dav_resource *resource, + const char **dirpath, + const char **fname); + +/* return the list of locknull members in this resource's directory */ +dav_error * dav_fs_get_locknull_members(const dav_resource *resource, + dav_buffer *pbuf); + + +/* DBM functions used by the repository and locking providers */ +extern const dav_hooks_db dav_hooks_db_dbm; + +dav_error * dav_dbm_open_direct(apr_pool_t *p, const char *pathname, int ro, + dav_db **pdb); +void dav_dbm_get_statefiles(apr_pool_t *p, const char *fname, + const char **state1, const char **state2); +dav_error * dav_dbm_delete(dav_db *db, apr_datum_t key); +dav_error * dav_dbm_store(dav_db *db, apr_datum_t key, apr_datum_t value); +dav_error * dav_dbm_fetch(dav_db *db, apr_datum_t key, apr_datum_t *pvalue); +void dav_dbm_freedatum(dav_db *db, apr_datum_t data); +int dav_dbm_exists(dav_db *db, apr_datum_t key); +void dav_dbm_close(dav_db *db); + +/* where is the lock database located? */ +const char *dav_get_lockdb_path(const request_rec *r); + +const dav_hooks_locks *dav_fs_get_lock_hooks(request_rec *r); +const dav_hooks_propdb *dav_fs_get_propdb_hooks(request_rec *r); + +void dav_fs_gather_propsets(apr_array_header_t *uris); +int dav_fs_find_liveprop(const dav_resource *resource, + const char *ns_uri, const char *name, + const dav_hooks_liveprop **hooks); +void dav_fs_insert_all_liveprops(request_rec *r, const dav_resource *resource, + dav_prop_insert what, apr_text_header *phdr); + +void dav_fs_register(apr_pool_t *p); + +#endif /* _DAV_FS_REPOS_H_ */ diff --git a/rubbos/app/httpd-2.0.64/modules/dav/main/.deps b/rubbos/app/httpd-2.0.64/modules/dav/main/.deps new file mode 100644 index 00000000..e69de29b diff --git a/rubbos/app/httpd-2.0.64/modules/dav/main/Makefile b/rubbos/app/httpd-2.0.64/modules/dav/main/Makefile new file mode 100644 index 00000000..509e3634 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/dav/main/Makefile @@ -0,0 +1,8 @@ +top_srcdir = /bottlenecks/rubbos/app/httpd-2.0.64 +top_builddir = /bottlenecks/rubbos/app/httpd-2.0.64 +srcdir = /bottlenecks/rubbos/app/httpd-2.0.64/modules/dav/main +builddir = /bottlenecks/rubbos/app/httpd-2.0.64/modules/dav/main +VPATH = /bottlenecks/rubbos/app/httpd-2.0.64/modules/dav/main +# a modules Makefile has no explicit targets -- they will be defined by +# whatever modules are enabled. just grab special.mk to deal with this. +include $(top_srcdir)/build/special.mk diff --git a/rubbos/app/httpd-2.0.64/modules/dav/main/Makefile.in b/rubbos/app/httpd-2.0.64/modules/dav/main/Makefile.in new file mode 100644 index 00000000..7c5c149d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/dav/main/Makefile.in @@ -0,0 +1,3 @@ +# a modules Makefile has no explicit targets -- they will be defined by +# whatever modules are enabled. just grab special.mk to deal with this. +include $(top_srcdir)/build/special.mk diff --git a/rubbos/app/httpd-2.0.64/modules/dav/main/NWGNUmakefile b/rubbos/app/httpd-2.0.64/modules/dav/main/NWGNUmakefile new file mode 100644 index 00000000..8546d6a3 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/dav/main/NWGNUmakefile @@ -0,0 +1,268 @@ +# +# Declare the sub-directories to be built here +# + +SUBDIRS = \ + $(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 \ + $(AP_WORK)/include \ + $(AP_WORK)/server/mpm/NetWare \ + $(NWOS) \ + $(EOLIST) + +# +# These flags will come after CFLAGS +# +XCFLAGS += \ + $(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 = mod_DAV + +# +# This is used by the link '-desc ' directive. +# If left blank, NLM_NAME will be used. +# +NLM_DESCRIPTION = Apache $(VERSION_STR) DAV module + +# +# This is used by the '-threadname' directive. If left blank, +# NLM_NAME Thread will be used. +# +NLM_THREAD_NAME = mod_DAV + +# +# 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 = _LibCPrelude + +# +# If this is specified it will be used by the link '-exit' directive +# +NLM_EXIT_SYM = _LibCPostlude + +# +# If this is specified it will be used by the link '-check' directive +# +NLM_CHECK_SYM = + +# +# If this is specified it will be used by the link '-flags' directive +# +NLM_FLAGS = AUTOUNLOAD, 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 = + +# +# Declare all target files (you must add your files here) +# + +# +# If there is an NLM target, put it here +# +TARGET_nlm = \ + $(OBJDIR)/mod_dav.nlm \ + $(EOLIST) + +# +# If there is an LIB target, put it here +# +TARGET_lib = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the NLM target above. +# Paths must all use the '/' character +# +FILES_nlm_objs = \ + $(OBJDIR)/mod_dav.o \ + $(OBJDIR)/props.o \ + $(OBJDIR)/util.o \ + $(OBJDIR)/util_lock.o \ + $(OBJDIR)/liveprop.o \ + $(OBJDIR)/providers.o \ + $(OBJDIR)/std_liveprop.o \ + $(EOLIST) + +# +# 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 = \ + libcpre.o \ + $(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 = \ + Apache2 \ + 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 = \ + @libc.imp \ + @$(APR)/aprlib.imp \ + @httpd.imp \ + $(EOLIST) + +# +# Any symbols exported to here +# +FILES_nlm_exports = \ + dav_module \ + @dav.imp \ + $(EOLIST) + +# +# These are the OBJ files needed to create the LIB target above. +# Paths must all use the '/' character +# +FILES_lib_objs = \ + $(EOLIST) + +# +# 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) +# +install :: nlms FORCE + copy $(OBJDIR)\mod_dav.nlm $(INSTALL)\Apache2\modules\*.* + +# +# Any specialized rules here +# + +# +# Include the 'tail' makefile that has targets that depend on variables defined +# in this makefile +# + +include $(AP_WORK)\build\NWGNUtail.inc + + diff --git a/rubbos/app/httpd-2.0.64/modules/dav/main/config5.m4 b/rubbos/app/httpd-2.0.64/modules/dav/main/config5.m4 new file mode 100644 index 00000000..fa2eee47 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/dav/main/config5.m4 @@ -0,0 +1,22 @@ +dnl modules enabled in this directory by default + +APACHE_MODPATH_INIT(dav/main) + +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 + +APACHE_MODULE(dav, WebDAV protocol handling, $dav_objects, , $dav_enable) + +if test "$dav_enable" != "no" -o "$enable_dav" != "no"; then + apache_need_expat=yes + + APR_ADDTO(INCLUDES, [-I\$(top_srcdir)/$modpath_current]) +fi + + +APACHE_MODPATH_FINISH diff --git a/rubbos/app/httpd-2.0.64/modules/dav/main/dav.imp b/rubbos/app/httpd-2.0.64/modules/dav/main/dav.imp new file mode 100644 index 00000000..88b306da --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/dav/main/dav.imp @@ -0,0 +1,64 @@ + + (mod_dav) + dav_add_all_liveprop_xmlns, + dav_add_lock, + dav_add_response, + dav_add_vary_header, + dav_auto_checkin, + dav_auto_checkout, + dav_buffer_append, + dav_buffer_init, + dav_buffer_place, + dav_buffer_place_mem, + dav_check_bufsize, + dav_close_propdb, + dav_core_find_liveprop, + dav_core_insert_all_liveprops, + dav_core_register_uris, + dav_do_find_liveprop, + dav_find_child, + dav_get_allprops, + dav_get_binding_hooks, + dav_get_depth, + dav_get_liveprop_info, + dav_get_liveprop_ns_count, + dav_get_liveprop_ns_index, + dav_get_liveprop_supported, + dav_get_lock_hooks, + dav_get_locktoken_list, + dav_get_propdb_hooks, + dav_get_props, + dav_get_resource_state, + dav_get_search_hooks, + dav_get_timeout, + dav_get_vsn_hooks, + dav_hook_find_liveprop, + dav_hook_gather_propsets, + dav_hook_insert_all_liveprops, + dav_lock_get_activelock, + dav_lock_parse_lockinfo, + dav_lock_query, + dav_lookup_provider, + dav_lookup_uri, + dav_new_error, + dav_new_error_tag, + dav_notify_created, + dav_open_propdb, + dav_prop_commit, + dav_prop_exec, + dav_prop_rollback, + dav_prop_validate, + dav_push_error, + dav_register_liveprop_group, + dav_register_provider, + dav_set_bufsize, + dav_unlock, + dav_validate_request, + dav_validate_root, + dav_xml_get_cdata, + dav_xmlns_add, + dav_xmlns_add_uri, + dav_xmlns_create, + dav_xmlns_generate, + dav_xmlns_get_prefix, + dav_xmlns_get_uri diff --git a/rubbos/app/httpd-2.0.64/modules/dav/main/liveprop.c b/rubbos/app/httpd-2.0.64/modules/dav/main/liveprop.c new file mode 100644 index 00000000..88461a80 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/dav/main/liveprop.c @@ -0,0 +1,140 @@ +/* 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. + */ + +#include "apr_pools.h" +#include "apr_hash.h" +#include "apr_errno.h" +#include "apr_strings.h" +#include "util_xml.h" /* for apr_text_header */ +#include "mod_dav.h" + + +static apr_hash_t *dav_liveprop_uris = NULL; +static int dav_liveprop_count = 0; + + +static apr_status_t dav_cleanup_liveprops(void *ctx) +{ + dav_liveprop_uris = NULL; + dav_liveprop_count = 0; + return APR_SUCCESS; +} + +static void dav_register_liveprop_namespace(apr_pool_t *p, const char *uri) +{ + int value; + + if (dav_liveprop_uris == NULL) { + dav_liveprop_uris = apr_hash_make(p); + apr_pool_cleanup_register(p, NULL, dav_cleanup_liveprops, apr_pool_cleanup_null); + } + + value = (int)apr_hash_get(dav_liveprop_uris, uri, APR_HASH_KEY_STRING); + if (value != 0) { + /* already registered */ + return; + } + + /* start at 1, and count up */ + apr_hash_set(dav_liveprop_uris, uri, APR_HASH_KEY_STRING, + (void *)++dav_liveprop_count); +} + +DAV_DECLARE(int) dav_get_liveprop_ns_index(const char *uri) +{ + return (int)apr_hash_get(dav_liveprop_uris, uri, APR_HASH_KEY_STRING); +} + +DAV_DECLARE(int) dav_get_liveprop_ns_count(void) +{ + return dav_liveprop_count; +} + +DAV_DECLARE(void) dav_add_all_liveprop_xmlns(apr_pool_t *p, + apr_text_header *phdr) +{ + apr_hash_index_t *idx = apr_hash_first(p, dav_liveprop_uris); + + for ( ; idx != NULL; idx = apr_hash_next(idx) ) { + const void *key; + void *val; + const char *s; + + apr_hash_this(idx, &key, NULL, &val); + + s = apr_psprintf(p, " xmlns:lp%d=\"%s\"", (int)val, (const char *)key); + apr_text_append(p, phdr, s); + } +} + +DAV_DECLARE(int) dav_do_find_liveprop(const char *ns_uri, const char *name, + const dav_liveprop_group *group, + const dav_hooks_liveprop **hooks) +{ + const char * const *uris = group->namespace_uris; + const dav_liveprop_spec *scan; + int ns; + + /* first: locate the namespace in the namespace table */ + for (ns = 0; uris[ns] != NULL; ++ns) + if (strcmp(ns_uri, uris[ns]) == 0) + break; + if (uris[ns] == NULL) { + /* not our property (the namespace matched none of ours) */ + return 0; + } + + /* second: look for the property in the liveprop specs */ + for (scan = group->specs; scan->name != NULL; ++scan) + if (ns == scan->ns && strcmp(name, scan->name) == 0) { + *hooks = group->hooks; + return scan->propid; + } + + /* not our property (same namespace, but no matching prop name) */ + return 0; +} + +DAV_DECLARE(int) dav_get_liveprop_info(int propid, + const dav_liveprop_group *group, + const dav_liveprop_spec **info) +{ + const dav_liveprop_spec *scan; + + for (scan = group->specs; scan->name != NULL; ++scan) { + if (scan->propid == propid) { + *info = scan; + + /* map the provider-local NS into a global NS index */ + return dav_get_liveprop_ns_index(group->namespace_uris[scan->ns]); + } + } + + /* assert: should not reach this point */ + *info = NULL; + return 0; +} + +DAV_DECLARE(void) dav_register_liveprop_group(apr_pool_t *p, + const dav_liveprop_group *group) +{ + /* register the namespace URIs */ + const char * const * uris = group->namespace_uris; + + for ( ; *uris != NULL; ++uris) { + dav_register_liveprop_namespace(p, *uris); + } +} diff --git a/rubbos/app/httpd-2.0.64/modules/dav/main/mod_dav.c b/rubbos/app/httpd-2.0.64/modules/dav/main/mod_dav.c new file mode 100644 index 00000000..3d3b47bb --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/dav/main/mod_dav.c @@ -0,0 +1,4834 @@ +/* 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. + */ + +/* + * DAV extension module for Apache 2.0.* + * + * This module is repository-independent. It depends on hooks provided by a + * repository implementation. + * + * APACHE ISSUES: + * - within a DAV hierarchy, if an unknown method is used and we default + * to Apache's implementation, it sends back an OPTIONS with the wrong + * set of methods -- there is NO HOOK for us. + * therefore: we need to manually handle the HTTP_METHOD_NOT_ALLOWED + * and HTTP_NOT_IMPLEMENTED responses (not ap_send_error_response). + * - process_mkcol_body() had to dup code from ap_setup_client_block(). + * - it would be nice to get status lines from Apache for arbitrary + * status codes + * - it would be nice to be able to extend Apache's set of response + * codes so that it doesn't return 500 when an unknown code is placed + * into r->status. + * - http_vhost functions should apply "const" to their params + * + * DESIGN NOTES: + * - For PROPFIND, we batch up the entire response in memory before + * sending it. We may want to reorganize around sending the information + * as we suck it in from the propdb. Alternatively, we should at least + * generate a total Content-Length if we're going to buffer in memory + * so that we can keep the connection open. + */ + +#include "apr_strings.h" +#include "apr_lib.h" /* for apr_is* */ + +#define APR_WANT_STRFUNC +#include "apr_want.h" + +#include "httpd.h" +#include "http_config.h" +#include "http_core.h" +#include "http_log.h" +#include "http_main.h" +#include "http_protocol.h" +#include "http_request.h" +#include "util_script.h" + +#include "mod_dav.h" + + +/* ### what is the best way to set this? */ +#define DAV_DEFAULT_PROVIDER "filesystem" + +/* used to denote that mod_dav will be handling this request */ +#define DAV_HANDLER_NAME "dav-handler" + +enum { + DAV_ENABLED_UNSET = 0, + DAV_ENABLED_OFF, + DAV_ENABLED_ON +}; + +/* per-dir configuration */ +typedef struct { + const char *provider_name; + const dav_provider *provider; + const char *dir; + int locktimeout; + int allow_depthinfinity; + +} dav_dir_conf; + +/* per-server configuration */ +typedef struct { + int unused; + +} dav_server_conf; + +#define DAV_INHERIT_VALUE(parent, child, field) \ + ((child)->field ? (child)->field : (parent)->field) + + +/* forward-declare for use in configuration lookup */ +extern module DAV_DECLARE_DATA dav_module; + +/* DAV methods */ +enum { + DAV_M_BIND = 0, + DAV_M_SEARCH, + DAV_M_LAST +}; +static int dav_methods[DAV_M_LAST]; + + +static int dav_init_handler(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp, + server_rec *s) +{ + /* DBG0("dav_init_handler"); */ + + /* Register DAV methods */ + dav_methods[DAV_M_BIND] = ap_method_register(p, "BIND"); + dav_methods[DAV_M_SEARCH] = ap_method_register(p, "SEARCH"); + + ap_add_version_component(p, "DAV/2"); + + return OK; +} + +static void *dav_create_server_config(apr_pool_t *p, server_rec *s) +{ + dav_server_conf *newconf; + + newconf = (dav_server_conf *)apr_pcalloc(p, sizeof(*newconf)); + + /* ### this isn't used at the moment... */ + + return newconf; +} + +static void *dav_merge_server_config(apr_pool_t *p, void *base, void *overrides) +{ +#if 0 + dav_server_conf *child = overrides; +#endif + dav_server_conf *newconf; + + newconf = (dav_server_conf *)apr_pcalloc(p, sizeof(*newconf)); + + /* ### nothing to merge right now... */ + + return newconf; +} + +static void *dav_create_dir_config(apr_pool_t *p, char *dir) +{ + /* NOTE: dir==NULL creates the default per-dir config */ + + dav_dir_conf *conf; + + conf = (dav_dir_conf *)apr_pcalloc(p, sizeof(*conf)); + + /* clean up the directory to remove any trailing slash */ + if (dir != NULL) { + char *d; + apr_size_t l; + + d = apr_pstrdup(p, dir); + l = strlen(d); + if (l > 1 && d[l - 1] == '/') + d[l - 1] = '\0'; + conf->dir = d; + } + + return conf; +} + +static void *dav_merge_dir_config(apr_pool_t *p, void *base, void *overrides) +{ + dav_dir_conf *parent = base; + dav_dir_conf *child = overrides; + dav_dir_conf *newconf = (dav_dir_conf *)apr_pcalloc(p, sizeof(*newconf)); + + /* DBG3("dav_merge_dir_config: new=%08lx base=%08lx overrides=%08lx", + (long)newconf, (long)base, (long)overrides); */ + + newconf->provider_name = DAV_INHERIT_VALUE(parent, child, provider_name); + newconf->provider = DAV_INHERIT_VALUE(parent, child, provider); + if (parent->provider_name != NULL) { + if (child->provider_name == NULL) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, NULL, + "\"DAV Off\" cannot be used to turn off a subtree " + "of a DAV-enabled location."); + } + else if (strcasecmp(child->provider_name, + parent->provider_name) != 0) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, NULL, + "A subtree cannot specify a different DAV provider " + "than its parent."); + } + } + + newconf->locktimeout = DAV_INHERIT_VALUE(parent, child, locktimeout); + newconf->dir = DAV_INHERIT_VALUE(parent, child, dir); + newconf->allow_depthinfinity = DAV_INHERIT_VALUE(parent, child, + allow_depthinfinity); + + return newconf; +} + +static const dav_provider *dav_get_provider(request_rec *r) +{ + dav_dir_conf *conf; + + conf = ap_get_module_config(r->per_dir_config, &dav_module); + /* assert: conf->provider_name != NULL + (otherwise, DAV is disabled, and we wouldn't be here) */ + + /* assert: conf->provider != NULL + (checked when conf->provider_name is set) */ + return conf->provider; +} + +DAV_DECLARE(const dav_hooks_locks *) dav_get_lock_hooks(request_rec *r) +{ + return dav_get_provider(r)->locks; +} + +DAV_DECLARE(const dav_hooks_propdb *) dav_get_propdb_hooks(request_rec *r) +{ + return dav_get_provider(r)->propdb; +} + +DAV_DECLARE(const dav_hooks_vsn *) dav_get_vsn_hooks(request_rec *r) +{ + return dav_get_provider(r)->vsn; +} + +DAV_DECLARE(const dav_hooks_binding *) dav_get_binding_hooks(request_rec *r) +{ + return dav_get_provider(r)->binding; +} + +DAV_DECLARE(const dav_hooks_search *) dav_get_search_hooks(request_rec *r) +{ + return dav_get_provider(r)->search; +} + +/* + * Command handler for the DAV directive, which is TAKE1. + */ +static const char *dav_cmd_dav(cmd_parms *cmd, void *config, const char *arg1) +{ + dav_dir_conf *conf = (dav_dir_conf *)config; + + if (strcasecmp(arg1, "on") == 0) { + conf->provider_name = DAV_DEFAULT_PROVIDER; + } + else if (strcasecmp(arg1, "off") == 0) { + conf->provider_name = NULL; + conf->provider = NULL; + } + else { + conf->provider_name = apr_pstrdup(cmd->pool, arg1); + } + + if (conf->provider_name != NULL) { + /* lookup and cache the actual provider now */ + conf->provider = dav_lookup_provider(conf->provider_name); + + if (conf->provider == NULL) { + /* by the time they use it, the provider should be loaded and + registered with us. */ + return apr_psprintf(cmd->pool, + "Unknown DAV provider: %s", + conf->provider_name); + } + } + + return NULL; +} + +/* + * Command handler for the DAVDepthInfinity directive, which is FLAG. + */ +static const char *dav_cmd_davdepthinfinity(cmd_parms *cmd, void *config, + int arg) +{ + dav_dir_conf *conf = (dav_dir_conf *)config; + + if (arg) + conf->allow_depthinfinity = DAV_ENABLED_ON; + else + conf->allow_depthinfinity = DAV_ENABLED_OFF; + return NULL; +} + +/* + * Command handler for DAVMinTimeout directive, which is TAKE1 + */ +static const char *dav_cmd_davmintimeout(cmd_parms *cmd, void *config, + const char *arg1) +{ + dav_dir_conf *conf = (dav_dir_conf *)config; + + conf->locktimeout = atoi(arg1); + if (conf->locktimeout < 0) + return "DAVMinTimeout requires a non-negative integer."; + + return NULL; +} + +/* +** dav_error_response() +** +** Send a nice response back to the user. In most cases, Apache doesn't +** allow us to provide details in the body about what happened. This +** function allows us to completely specify the response body. +** +** ### this function is not logging any errors! (e.g. the body) +*/ +static int dav_error_response(request_rec *r, int status, const char *body) +{ + r->status = status; + + /* ### I really don't think this is needed; gotta test */ + r->status_line = ap_get_status_line(status); + + ap_set_content_type(r, "text/html; charset=ISO-8859-1"); + + /* begin the response now... */ + ap_rvputs(r, + DAV_RESPONSE_BODY_1, + r->status_line, + DAV_RESPONSE_BODY_2, + &r->status_line[4], + DAV_RESPONSE_BODY_3, + body, + DAV_RESPONSE_BODY_4, + ap_psignature("
    \n", r), + DAV_RESPONSE_BODY_5, + NULL); + + /* the response has been sent. */ + /* + * ### Use of DONE obviates logging..! + */ + return DONE; +} + + +/* + * Send a "standardized" error response based on the error's namespace & tag + */ +static int dav_error_response_tag(request_rec *r, + dav_error *err) +{ + r->status = err->status; + + /* ### I really don't think this is needed; gotta test */ + r->status_line = ap_get_status_line(err->status); + + ap_set_content_type(r, DAV_XML_CONTENT_TYPE); + + ap_rputs(DAV_XML_HEADER DEBUG_CR + "desc != NULL) { + /* ### should move this namespace somewhere (with the others!) */ + ap_rputs(" xmlns:m=\"http://apache.org/dav/xmlns\"", r); + } + + if (err->namespace != NULL) { + ap_rprintf(r, + " xmlns:C=\"%s\">" DEBUG_CR + "" DEBUG_CR, + err->namespace, err->tagname); + } + else { + ap_rprintf(r, + ">" DEBUG_CR + "" DEBUG_CR, err->tagname); + } + + /* here's our mod_dav specific tag: */ + if (err->desc != NULL) { + ap_rprintf(r, + "" DEBUG_CR + "%s" DEBUG_CR + "" DEBUG_CR, + err->error_id, + apr_xml_quote_string(r->pool, err->desc, 0)); + } + + ap_rputs("" DEBUG_CR, r); + + /* the response has been sent. */ + /* + * ### Use of DONE obviates logging..! + */ + return DONE; +} + + +/* + * Apache's URI escaping does not replace '&' since that is a valid character + * in a URI (to form a query section). We must explicitly handle it so that + * we can embed the URI into an XML document. + */ +static const char *dav_xml_escape_uri(apr_pool_t *p, const char *uri) +{ + const char *e_uri = ap_escape_uri(p, uri); + + /* check the easy case... */ + if (ap_strchr_c(e_uri, '&') == NULL) + return e_uri; + + /* there was a '&', so more work is needed... sigh. */ + + /* + * Note: this is a teeny bit of overkill since we know there are no + * '<' or '>' characters, but who cares. + */ + return apr_xml_quote_string(p, e_uri, 0); +} + + +/* Write a complete RESPONSE object out as a xml + element. Data is sent into brigade BB, which is auto-flushed into + OUTPUT filter stack. Use POOL for any temporary allocations. + + [Presumably the tag has already been written; this + routine is shared by dav_send_multistatus and dav_stream_response.] +*/ +static void dav_send_one_response(dav_response *response, + apr_bucket_brigade *bb, + ap_filter_t *output, + apr_pool_t *pool) +{ + apr_text *t = NULL; + + if (response->propresult.xmlns == NULL) { + ap_fputs(output, bb, ""); + } + else { + ap_fputs(output, bb, "propresult.xmlns; t; t = t->next) { + ap_fputs(output, bb, t->text); + } + ap_fputc(output, bb, '>'); + } + + ap_fputstrs(output, bb, + DEBUG_CR "", + dav_xml_escape_uri(pool, response->href), + "" DEBUG_CR, + NULL); + + if (response->propresult.propstats == NULL) { + /* use the Status-Line text from Apache. Note, this will + * default to 500 Internal Server Error if first->status + * is not a known (or valid) status code. + */ + ap_fputstrs(output, bb, + "HTTP/1.1 ", + ap_get_status_line(response->status), + "" DEBUG_CR, + NULL); + } + else { + /* assume this includes and is quoted properly */ + for (t = response->propresult.propstats; t; t = t->next) { + ap_fputs(output, bb, t->text); + } + } + + if (response->desc != NULL) { + /* + * We supply the description, so we know it doesn't have to + * have any escaping/encoding applied to it. + */ + ap_fputstrs(output, bb, + "", + response->desc, + "" DEBUG_CR, + NULL); + } + + ap_fputs(output, bb, "" DEBUG_CR); +} + + +/* Factorized helper function: prep request_rec R for a multistatus + response and write tag into BB, destined for + R->output_filters. Use xml NAMESPACES in initial tag, if + non-NULL. */ +static void dav_begin_multistatus(apr_bucket_brigade *bb, + request_rec *r, int status, + apr_array_header_t *namespaces) +{ + /* Set the correct status and Content-Type */ + r->status = status; + ap_set_content_type(r, DAV_XML_CONTENT_TYPE); + + /* Send the headers and actual multistatus response now... */ + ap_fputs(r->output_filters, bb, DAV_XML_HEADER DEBUG_CR + "nelts; i--; ) { + ap_fprintf(r->output_filters, bb, " xmlns:ns%d=\"%s\"", i, + APR_XML_GET_URI_ITEM(namespaces, i)); + } + } + + ap_fputs(r->output_filters, bb, ">" DEBUG_CR); +} + +/* Finish a multistatus response started by dav_begin_multistatus: */ +static apr_status_t dav_finish_multistatus(request_rec *r, + apr_bucket_brigade *bb) +{ + apr_bucket *b; + + ap_fputs(r->output_filters, bb, "" DEBUG_CR); + + /* indicate the end of the response body */ + b = apr_bucket_eos_create(r->connection->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, b); + + /* deliver whatever might be remaining in the brigade */ + return ap_pass_brigade(r->output_filters, bb); +} + +static void dav_send_multistatus(request_rec *r, int status, + dav_response *first, + apr_array_header_t *namespaces) +{ + apr_pool_t *subpool; + apr_bucket_brigade *bb = apr_brigade_create(r->pool, + r->connection->bucket_alloc); + + dav_begin_multistatus(bb, r, status, namespaces); + + apr_pool_create(&subpool, r->pool); + + for (; first != NULL; first = first->next) { + apr_pool_clear(subpool); + dav_send_one_response(first, bb, r->output_filters, subpool); + } + apr_pool_destroy(subpool); + + dav_finish_multistatus(r, bb); +} + +/* + * dav_log_err() + * + * Write error information to the log. + */ +static void dav_log_err(request_rec *r, dav_error *err, int level) +{ + dav_error *errscan; + + /* Log the errors */ + /* ### should have a directive to log the first or all */ + for (errscan = err; errscan != NULL; errscan = errscan->prev) { + if (errscan->desc == NULL) + continue; + + if (errscan->save_errno != 0) { + errno = errscan->save_errno; + ap_log_rerror(APLOG_MARK, level, errno, r, "%s [%d, #%d]", + errscan->desc, errscan->status, errscan->error_id); + } + else { + ap_log_rerror(APLOG_MARK, level, 0, r, + "%s [%d, #%d]", + errscan->desc, errscan->status, errscan->error_id); + } + } +} + +/* + * dav_handle_err() + * + * Handle the standard error processing. must be non-NULL. + * + * is set by the following: + * - dav_validate_request() + * - dav_add_lock() + * - repos_hooks->remove_resource + * - repos_hooks->move_resource + * - repos_hooks->copy_resource + * - vsn_hooks->update + */ +static int dav_handle_err(request_rec *r, dav_error *err, + dav_response *response) +{ + /* log the errors */ + dav_log_err(r, err, APLOG_ERR); + + if (response == NULL) { + dav_error *stackerr = err; + + /* our error messages are safe; tell Apache this */ + apr_table_setn(r->notes, "verbose-error-to", "*"); + + /* Didn't get a multistatus response passed in, but we still + might be able to generate a standard response. + Search the error stack for an errortag. */ + while (stackerr != NULL && stackerr->tagname == NULL) + stackerr = stackerr->prev; + + if (stackerr != NULL && stackerr->tagname != NULL) + return dav_error_response_tag(r, stackerr); + + return err->status; + } + + /* send the multistatus and tell Apache the request/response is DONE. */ + dav_send_multistatus(r, err->status, response, NULL); + return DONE; +} + +/* handy function for return values of methods that (may) create things */ +static int dav_created(request_rec *r, const char *locn, const char *what, + int replaced) +{ + const char *body; + + if (locn == NULL) { + locn = r->uri; + } + + /* did the target resource already exist? */ + if (replaced) { + /* Apache will supply a default message */ + return HTTP_NO_CONTENT; + } + + /* Per HTTP/1.1, S10.2.2: add a Location header to contain the + * URI that was created. */ + + /* Convert locn to an absolute URI, and return in Location header */ + apr_table_setn(r->headers_out, "Location", ap_construct_url(r->pool, locn, r)); + + /* ### insert an ETag header? see HTTP/1.1 S10.2.2 */ + + /* Apache doesn't allow us to set a variable body for HTTP_CREATED, so + * we must manufacture the entire response. */ + body = apr_psprintf(r->pool, "%s %s has been created.", + what, ap_escape_html(r->pool, locn)); + return dav_error_response(r, HTTP_CREATED, body); +} + +/* ### move to dav_util? */ +DAV_DECLARE(int) dav_get_depth(request_rec *r, int def_depth) +{ + const char *depth = apr_table_get(r->headers_in, "Depth"); + + if (depth == NULL) { + return def_depth; + } + + if (strcasecmp(depth, "infinity") == 0) { + return DAV_INFINITY; + } + else if (strcmp(depth, "0") == 0) { + return 0; + } + else if (strcmp(depth, "1") == 0) { + return 1; + } + + /* The caller will return an HTTP_BAD_REQUEST. This will augment the + * default message that Apache provides. */ + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "An invalid Depth header was specified."); + return -1; +} + +static int dav_get_overwrite(request_rec *r) +{ + const char *overwrite = apr_table_get(r->headers_in, "Overwrite"); + + if (overwrite == NULL) { + return 1; /* default is "T" */ + } + + if ((*overwrite == 'F' || *overwrite == 'f') && overwrite[1] == '\0') { + return 0; + } + + if ((*overwrite == 'T' || *overwrite == 't') && overwrite[1] == '\0') { + return 1; + } + + /* The caller will return an HTTP_BAD_REQUEST. This will augment the + * default message that Apache provides. */ + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "An invalid Overwrite header was specified."); + return -1; +} + +/* resolve a request URI to a resource descriptor. + * + * If label_allowed != 0, then allow the request target to be altered by + * a Label: header. + * + * If use_checked_in is true, then the repository provider should return + * the resource identified by the DAV:checked-in property of the resource + * identified by the Request-URI. + */ +static dav_error *dav_get_resource(request_rec *r, int label_allowed, + int use_checked_in, dav_resource **res_p) +{ + dav_dir_conf *conf; + const char *label = NULL; + dav_error *err; + + /* if the request target can be overridden, get any target selector */ + if (label_allowed) { + label = apr_table_get(r->headers_in, "label"); + } + + conf = ap_get_module_config(r->per_dir_config, &dav_module); + /* assert: conf->provider != NULL */ + + /* resolve the resource */ + err = (*conf->provider->repos->get_resource)(r, conf->dir, + label, use_checked_in, + res_p); + if (err != NULL) { + err = dav_push_error(r->pool, err->status, 0, + "Could not fetch resource information.", err); + return err; + } + + /* Note: this shouldn't happen, but just be sure... */ + if (*res_p == NULL) { + /* ### maybe use HTTP_INTERNAL_SERVER_ERROR */ + return dav_new_error(r->pool, HTTP_NOT_FOUND, 0, + apr_psprintf(r->pool, + "The provider did not define a " + "resource for %s.", + ap_escape_html(r->pool, r->uri))); + } + + /* ### hmm. this doesn't feel like the right place or thing to do */ + /* if there were any input headers requiring a Vary header in the response, + * add it now */ + dav_add_vary_header(r, r, *res_p); + + return NULL; +} + +static dav_error * dav_open_lockdb(request_rec *r, int ro, dav_lockdb **lockdb) +{ + const dav_hooks_locks *hooks = DAV_GET_HOOKS_LOCKS(r); + + if (hooks == NULL) { + *lockdb = NULL; + return NULL; + } + + /* open the thing lazily */ + return (*hooks->open_lockdb)(r, ro, 0, lockdb); +} + +static int dav_parse_range(request_rec *r, + apr_off_t *range_start, apr_off_t *range_end) +{ + const char *range_c; + char *range; + char *dash; + char *slash; + + range_c = apr_table_get(r->headers_in, "content-range"); + if (range_c == NULL) + return 0; + + range = apr_pstrdup(r->pool, range_c); + if (strncasecmp(range, "bytes ", 6) != 0 + || (dash = ap_strchr(range, '-')) == NULL + || (slash = ap_strchr(range, '/')) == NULL) { + /* malformed header. ignore it (per S14.16 of RFC2616) */ + return 0; + } + + *dash = *slash = '\0'; + + *range_start = apr_atoi64(range + 6); + *range_end = apr_atoi64(dash + 1); + + if (*range_end < *range_start + || (slash[1] != '*' && apr_atoi64(slash + 1) <= *range_end)) { + /* invalid range. ignore it (per S14.16 of RFC2616) */ + return 0; + } + + /* we now have a valid range */ + return 1; +} + +/* handle the GET method */ +static int dav_method_get(request_rec *r) +{ + dav_resource *resource; + dav_error *err; + + /* This method should only be called when the resource is not + * visible to Apache. We will fetch the resource from the repository, + * then create a subrequest for Apache to handle. + */ + err = dav_get_resource(r, 1 /* label_allowed */, 0 /* use_checked_in */, + &resource); + if (err != NULL) + return dav_handle_err(r, err, NULL); + + if (!resource->exists) { + /* Apache will supply a default error for this. */ + return HTTP_NOT_FOUND; + } + + /* set up the HTTP headers for the response */ + if ((err = (*resource->hooks->set_headers)(r, resource)) != NULL) { + err = dav_push_error(r->pool, err->status, 0, + "Unable to set up HTTP headers.", + err); + return dav_handle_err(r, err, NULL); + } + + if (r->header_only) { + return DONE; + } + + /* okay... time to deliver the content */ + if ((err = (*resource->hooks->deliver)(resource, + r->output_filters)) != NULL) { + err = dav_push_error(r->pool, err->status, 0, + "Unable to deliver content.", + err); + return dav_handle_err(r, err, NULL); + } + + return DONE; +} + +/* validate resource/locks on POST, then pass to the default handler */ +static int dav_method_post(request_rec *r) +{ + dav_resource *resource; + dav_error *err; + + /* Ask repository module to resolve the resource */ + err = dav_get_resource(r, 0 /* label_allowed */, 0 /* use_checked_in */, + &resource); + if (err != NULL) + return dav_handle_err(r, err, NULL); + + /* Note: depth == 0. Implies no need for a multistatus response. */ + if ((err = dav_validate_request(r, resource, 0, NULL, NULL, + DAV_VALIDATE_RESOURCE, NULL)) != NULL) { + /* ### add a higher-level description? */ + return dav_handle_err(r, err, NULL); + } + + return DECLINED; +} + +/* handle the PUT method */ +static int dav_method_put(request_rec *r) +{ + dav_resource *resource; + int resource_state; + dav_auto_version_info av_info; + const dav_hooks_locks *locks_hooks = DAV_GET_HOOKS_LOCKS(r); + const char *body; + dav_error *err; + dav_error *err2; + dav_stream_mode mode; + dav_stream *stream; + dav_response *multi_response; + int has_range; + apr_off_t range_start; + apr_off_t range_end; + + /* Ask repository module to resolve the resource */ + err = dav_get_resource(r, 0 /* label_allowed */, 0 /* use_checked_in */, + &resource); + if (err != NULL) + return dav_handle_err(r, err, NULL); + + /* If not a file or collection resource, PUT not allowed */ + if (resource->type != DAV_RESOURCE_TYPE_REGULAR + && resource->type != DAV_RESOURCE_TYPE_WORKING) { + body = apr_psprintf(r->pool, + "Cannot create resource %s with PUT.", + ap_escape_html(r->pool, r->uri)); + return dav_error_response(r, HTTP_CONFLICT, body); + } + + /* Cannot PUT a collection */ + if (resource->collection) { + return dav_error_response(r, HTTP_CONFLICT, + "Cannot PUT to a collection."); + + } + + resource_state = dav_get_resource_state(r, resource); + + /* + * Note: depth == 0 normally requires no multistatus response. However, + * if we pass DAV_VALIDATE_PARENT, then we could get an error on a URI + * other than the Request-URI, thereby requiring a multistatus. + * + * If the resource does not exist (DAV_RESOURCE_NULL), then we must + * check the resource *and* its parent. If the resource exists or is + * a locknull resource, then we check only the resource. + */ + if ((err = dav_validate_request(r, resource, 0, NULL, &multi_response, + resource_state == DAV_RESOURCE_NULL ? + DAV_VALIDATE_PARENT : + DAV_VALIDATE_RESOURCE, NULL)) != NULL) { + /* ### add a higher-level description? */ + return dav_handle_err(r, err, multi_response); + } + + /* make sure the resource can be modified (if versioning repository) */ + if ((err = dav_auto_checkout(r, resource, + 0 /* not parent_only */, + &av_info)) != NULL) { + /* ### add a higher-level description? */ + return dav_handle_err(r, err, NULL); + } + + /* truncate and rewrite the file unless we see a Content-Range */ + mode = DAV_MODE_WRITE_TRUNC; + + has_range = dav_parse_range(r, &range_start, &range_end); + if (has_range) { + mode = DAV_MODE_WRITE_SEEKABLE; + } + + /* Create the new file in the repository */ + if ((err = (*resource->hooks->open_stream)(resource, mode, + &stream)) != NULL) { + /* ### assuming FORBIDDEN is probably not quite right... */ + err = dav_push_error(r->pool, HTTP_FORBIDDEN, 0, + apr_psprintf(r->pool, + "Unable to PUT new contents for %s.", + ap_escape_html(r->pool, r->uri)), + err); + } + + if (err == NULL && has_range) { + /* a range was provided. seek to the start */ + err = (*resource->hooks->seek_stream)(stream, range_start); + } + + if (err == NULL) { + apr_bucket_brigade *bb; + apr_bucket *b; + int seen_eos = 0; + + bb = apr_brigade_create(r->pool, r->connection->bucket_alloc); + + do { + apr_status_t rc; + + rc = ap_get_brigade(r->input_filters, bb, AP_MODE_READBYTES, + APR_BLOCK_READ, DAV_READ_BLOCKSIZE); + + if (rc != APR_SUCCESS) { + err = dav_new_error(r->pool, HTTP_INTERNAL_SERVER_ERROR, 0, + "Could not get next bucket brigade"); + break; + } + + for (b = APR_BRIGADE_FIRST(bb); + b != APR_BRIGADE_SENTINEL(bb); + b = APR_BUCKET_NEXT(b)) + { + const char *data; + apr_size_t len; + + if (APR_BUCKET_IS_EOS(b)) { + seen_eos = 1; + break; + } + + if (APR_BUCKET_IS_METADATA(b)) { + continue; + } + + rc = apr_bucket_read(b, &data, &len, APR_BLOCK_READ); + if (rc != APR_SUCCESS) { + err = dav_new_error(r->pool, HTTP_BAD_REQUEST, 0, + "An error occurred while reading " + "the request body."); + break; + } + + if (err == NULL) { + /* write whatever we read, until we see an error */ + err = (*resource->hooks->write_stream)(stream, data, len); + } + } + + apr_brigade_cleanup(bb); + } while (!seen_eos); + + apr_brigade_destroy(bb); + + err2 = (*resource->hooks->close_stream)(stream, + err == NULL /* commit */); + if (err2 != NULL && err == NULL) { + /* no error during the write, but we hit one at close. use it. */ + err = err2; + } + } + + /* + * Ensure that we think the resource exists now. + * ### eek. if an error occurred during the write and we did not commit, + * ### then the resource might NOT exist (e.g. dav_fs_repos.c) + */ + if (err == NULL) { + resource->exists = 1; + } + + /* restore modifiability of resources back to what they were */ + err2 = dav_auto_checkin(r, resource, err != NULL /* undo if error */, + 0 /*unlock*/, &av_info); + + /* check for errors now */ + if (err != NULL) { + return dav_handle_err(r, err, NULL); + } + + if (err2 != NULL) { + /* just log a warning */ + err2 = dav_push_error(r->pool, err2->status, 0, + "The PUT was successful, but there " + "was a problem automatically checking in " + "the resource or its parent collection.", + err2); + dav_log_err(r, err2, APLOG_WARNING); + } + + /* ### place the Content-Type and Content-Language into the propdb */ + + if (locks_hooks != NULL) { + dav_lockdb *lockdb; + + if ((err = (*locks_hooks->open_lockdb)(r, 0, 0, &lockdb)) != NULL) { + /* The file creation was successful, but the locking failed. */ + err = dav_push_error(r->pool, err->status, 0, + "The file was PUT successfully, but there " + "was a problem opening the lock database " + "which prevents inheriting locks from the " + "parent resources.", + err); + return dav_handle_err(r, err, NULL); + } + + /* notify lock system that we have created/replaced a resource */ + err = dav_notify_created(r, lockdb, resource, resource_state, 0); + + (*locks_hooks->close_lockdb)(lockdb); + + if (err != NULL) { + /* The file creation was successful, but the locking failed. */ + err = dav_push_error(r->pool, err->status, 0, + "The file was PUT successfully, but there " + "was a problem updating its lock " + "information.", + err); + return dav_handle_err(r, err, NULL); + } + } + + /* NOTE: WebDAV spec, S8.7.1 states properties should be unaffected */ + + /* return an appropriate response (HTTP_CREATED or HTTP_NO_CONTENT) */ + return dav_created(r, NULL, "Resource", resource_state == DAV_RESOURCE_EXISTS); +} + + +/* Use POOL to temporarily construct a dav_response object (from WRES + STATUS, and PROPSTATS) and stream it via WRES's ctx->brigade. */ +static void dav_stream_response(dav_walk_resource *wres, + int status, + dav_get_props_result *propstats, + apr_pool_t *pool) +{ + dav_response resp = { 0 }; + dav_walker_ctx *ctx = wres->walk_ctx; + + resp.href = wres->resource->uri; + resp.status = status; + if (propstats) { + resp.propresult = *propstats; + } + + dav_send_one_response(&resp, ctx->bb, ctx->r->output_filters, pool); +} + + +/* ### move this to dav_util? */ +DAV_DECLARE(void) dav_add_response(dav_walk_resource *wres, + int status, dav_get_props_result *propstats) +{ + dav_response *resp; + + /* just drop some data into an dav_response */ + resp = apr_pcalloc(wres->pool, sizeof(*resp)); + resp->href = apr_pstrdup(wres->pool, wres->resource->uri); + resp->status = status; + if (propstats) { + resp->propresult = *propstats; + } + + resp->next = wres->response; + wres->response = resp; +} + + +/* handle the DELETE method */ +static int dav_method_delete(request_rec *r) +{ + dav_resource *resource; + dav_auto_version_info av_info; + dav_error *err; + dav_error *err2; + dav_response *multi_response; + int result; + int depth; + + /* We don't use the request body right now, so torch it. */ + if ((result = ap_discard_request_body(r)) != OK) { + return result; + } + + /* Ask repository module to resolve the resource */ + err = dav_get_resource(r, 0 /* label_allowed */, 0 /* use_checked_in */, + &resource); + if (err != NULL) + return dav_handle_err(r, err, NULL); + if (!resource->exists) { + /* Apache will supply a default error for this. */ + return HTTP_NOT_FOUND; + } + + /* 2518 says that depth must be infinity only for collections. + * For non-collections, depth is ignored, unless it is an illegal value (1). + */ + depth = dav_get_depth(r, DAV_INFINITY); + + if (resource->collection && depth != DAV_INFINITY) { + /* This supplies additional information for the default message. */ + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Depth must be \"infinity\" for DELETE of a collection."); + return HTTP_BAD_REQUEST; + } + + if (!resource->collection && depth == 1) { + /* This supplies additional information for the default message. */ + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Depth of \"1\" is not allowed for DELETE."); + return HTTP_BAD_REQUEST; + } + + /* + ** If any resources fail the lock/If: conditions, then we must fail + ** the delete. Each of the failing resources will be listed within + ** a DAV:multistatus body, wrapped into a 424 response. + ** + ** Note that a failure on the resource itself does not generate a + ** multistatus response -- only internal members/collections. + */ + if ((err = dav_validate_request(r, resource, depth, NULL, + &multi_response, + DAV_VALIDATE_PARENT + | DAV_VALIDATE_USE_424, NULL)) != NULL) { + err = dav_push_error(r->pool, err->status, 0, + apr_psprintf(r->pool, + "Could not DELETE %s due to a failed " + "precondition (e.g. locks).", + ap_escape_html(r->pool, r->uri)), + err); + return dav_handle_err(r, err, multi_response); + } + + /* ### RFC 2518 s. 8.10.5 says to remove _all_ locks, not just those + * locked by the token(s) in the if_header. + */ + if ((result = dav_unlock(r, resource, NULL)) != OK) { + return result; + } + + /* if versioned resource, make sure parent is checked out */ + if ((err = dav_auto_checkout(r, resource, 1 /* parent_only */, + &av_info)) != NULL) { + /* ### add a higher-level description? */ + return dav_handle_err(r, err, NULL); + } + + /* try to remove the resource */ + err = (*resource->hooks->remove_resource)(resource, &multi_response); + + /* restore writability of parent back to what it was */ + err2 = dav_auto_checkin(r, NULL, err != NULL /* undo if error */, + 0 /*unlock*/, &av_info); + + /* check for errors now */ + if (err != NULL) { + err = dav_push_error(r->pool, err->status, 0, + apr_psprintf(r->pool, + "Could not DELETE %s.", + ap_escape_html(r->pool, r->uri)), + err); + return dav_handle_err(r, err, multi_response); + } + if (err2 != NULL) { + /* just log a warning */ + err = dav_push_error(r->pool, err2->status, 0, + "The DELETE was successful, but there " + "was a problem automatically checking in " + "the parent collection.", + err2); + dav_log_err(r, err, APLOG_WARNING); + } + + /* ### HTTP_NO_CONTENT if no body, HTTP_OK if there is a body (some day) */ + + /* Apache will supply a default error for this. */ + return HTTP_NO_CONTENT; +} + +/* generate DAV:supported-method-set OPTIONS response */ +static dav_error *dav_gen_supported_methods(request_rec *r, + const apr_xml_elem *elem, + const apr_table_t *methods, + apr_text_header *body) +{ + const apr_array_header_t *arr; + const apr_table_entry_t *elts; + apr_xml_elem *child; + apr_xml_attr *attr; + char *s; + int i; + + apr_text_append(r->pool, body, "" DEBUG_CR); + + if (elem->first_child == NULL) { + /* show all supported methods */ + arr = apr_table_elts(methods); + elts = (const apr_table_entry_t *)arr->elts; + + for (i = 0; i < arr->nelts; ++i) { + if (elts[i].key == NULL) + continue; + + s = apr_psprintf(r->pool, + "" + DEBUG_CR, + elts[i].key); + apr_text_append(r->pool, body, s); + } + } + else { + /* check for support of specific methods */ + for (child = elem->first_child; child != NULL; child = child->next) { + if (child->ns == APR_XML_NS_DAV_ID + && strcmp(child->name, "supported-method") == 0) { + const char *name = NULL; + + /* go through attributes to find method name */ + for (attr = child->attr; attr != NULL; attr = attr->next) { + if (attr->ns == APR_XML_NS_DAV_ID + && strcmp(attr->name, "name") == 0) + name = attr->value; + } + + if (name == NULL) { + return dav_new_error(r->pool, HTTP_BAD_REQUEST, 0, + "A DAV:supported-method element " + "does not have a \"name\" attribute"); + } + + /* see if method is supported */ + if (apr_table_get(methods, name) != NULL) { + s = apr_psprintf(r->pool, + "" + DEBUG_CR, + name); + apr_text_append(r->pool, body, s); + } + } + } + } + + apr_text_append(r->pool, body, "" DEBUG_CR); + return NULL; +} + +/* generate DAV:supported-live-property-set OPTIONS response */ +static dav_error *dav_gen_supported_live_props(request_rec *r, + const dav_resource *resource, + const apr_xml_elem *elem, + apr_text_header *body) +{ + dav_lockdb *lockdb; + dav_propdb *propdb; + apr_xml_elem *child; + apr_xml_attr *attr; + dav_error *err; + + /* open lock database, to report on supported lock properties */ + /* ### should open read-only */ + if ((err = dav_open_lockdb(r, 0, &lockdb)) != NULL) { + return dav_push_error(r->pool, err->status, 0, + "The lock database could not be opened, " + "preventing the reporting of supported lock " + "properties.", + err); + } + + /* open the property database (readonly) for the resource */ + if ((err = dav_open_propdb(r, lockdb, resource, 1, NULL, + &propdb)) != NULL) { + if (lockdb != NULL) + (*lockdb->hooks->close_lockdb)(lockdb); + + return dav_push_error(r->pool, err->status, 0, + "The property database could not be opened, " + "preventing report of supported properties.", + err); + } + + apr_text_append(r->pool, body, "" DEBUG_CR); + + if (elem->first_child == NULL) { + /* show all supported live properties */ + dav_get_props_result props = dav_get_allprops(propdb, DAV_PROP_INSERT_SUPPORTED); + body->last->next = props.propstats; + while (body->last->next != NULL) + body->last = body->last->next; + } + else { + /* check for support of specific live property */ + for (child = elem->first_child; child != NULL; child = child->next) { + if (child->ns == APR_XML_NS_DAV_ID + && strcmp(child->name, "supported-live-property") == 0) { + const char *name = NULL; + const char *nmspace = NULL; + + /* go through attributes to find name and namespace */ + for (attr = child->attr; attr != NULL; attr = attr->next) { + if (attr->ns == APR_XML_NS_DAV_ID) { + if (strcmp(attr->name, "name") == 0) + name = attr->value; + else if (strcmp(attr->name, "namespace") == 0) + nmspace = attr->value; + } + } + + if (name == NULL) { + err = dav_new_error(r->pool, HTTP_BAD_REQUEST, 0, + "A DAV:supported-live-property " + "element does not have a \"name\" " + "attribute"); + break; + } + + /* default namespace to DAV: */ + if (nmspace == NULL) + nmspace = "DAV:"; + + /* check for support of property */ + dav_get_liveprop_supported(propdb, nmspace, name, body); + } + } + } + + apr_text_append(r->pool, body, "" DEBUG_CR); + + dav_close_propdb(propdb); + + if (lockdb != NULL) + (*lockdb->hooks->close_lockdb)(lockdb); + + return err; +} + +/* generate DAV:supported-report-set OPTIONS response */ +static dav_error *dav_gen_supported_reports(request_rec *r, + const dav_resource *resource, + const apr_xml_elem *elem, + const dav_hooks_vsn *vsn_hooks, + apr_text_header *body) +{ + apr_xml_elem *child; + apr_xml_attr *attr; + dav_error *err; + char *s; + + apr_text_append(r->pool, body, "" DEBUG_CR); + + if (vsn_hooks != NULL) { + const dav_report_elem *reports; + const dav_report_elem *rp; + + if ((err = (*vsn_hooks->avail_reports)(resource, &reports)) != NULL) { + return dav_push_error(r->pool, err->status, 0, + "DAV:supported-report-set could not be " + "determined due to a problem fetching the " + "available reports for this resource.", + err); + } + + if (reports != NULL) { + if (elem->first_child == NULL) { + /* show all supported reports */ + for (rp = reports; rp->nmspace != NULL; ++rp) { + /* Note: we presume reports->namespace is + * properly XML/URL quoted */ + s = apr_psprintf(r->pool, + "" DEBUG_CR, + rp->name, rp->nmspace); + apr_text_append(r->pool, body, s); + } + } + else { + /* check for support of specific report */ + for (child = elem->first_child; child != NULL; child = child->next) { + if (child->ns == APR_XML_NS_DAV_ID + && strcmp(child->name, "supported-report") == 0) { + const char *name = NULL; + const char *nmspace = NULL; + + /* go through attributes to find name and namespace */ + for (attr = child->attr; attr != NULL; attr = attr->next) { + if (attr->ns == APR_XML_NS_DAV_ID) { + if (strcmp(attr->name, "name") == 0) + name = attr->value; + else if (strcmp(attr->name, "namespace") == 0) + nmspace = attr->value; + } + } + + if (name == NULL) { + return dav_new_error(r->pool, HTTP_BAD_REQUEST, 0, + "A DAV:supported-report element " + "does not have a \"name\" attribute"); + } + + /* default namespace to DAV: */ + if (nmspace == NULL) + nmspace = "DAV:"; + + for (rp = reports; rp->nmspace != NULL; ++rp) { + if (strcmp(name, rp->name) == 0 + && strcmp(nmspace, rp->nmspace) == 0) { + /* Note: we presume reports->nmspace is + * properly XML/URL quoted + */ + s = apr_psprintf(r->pool, + "" + DEBUG_CR, + rp->name, rp->nmspace); + apr_text_append(r->pool, body, s); + break; + } + } + } + } + } + } + } + + apr_text_append(r->pool, body, "" DEBUG_CR); + return NULL; +} + + +/* handle the SEARCH method */ +static int dav_method_search(request_rec *r) +{ + const dav_hooks_search *search_hooks = DAV_GET_HOOKS_SEARCH(r); + dav_resource *resource; + dav_error *err; + dav_response *multi_status; + + /* If no search provider, decline the request */ + if (search_hooks == NULL) + return DECLINED; + + /* This method should only be called when the resource is not + * visible to Apache. We will fetch the resource from the repository, + * then create a subrequest for Apache to handle. + */ + err = dav_get_resource(r, 1 /* label_allowed */, 0 /* use_checked_in */, + &resource); + if (err != NULL) + return dav_handle_err(r, err, NULL); + + if (!resource->exists) { + /* Apache will supply a default error for this. */ + return HTTP_NOT_FOUND; + } + + /* set up the HTTP headers for the response */ + if ((err = (*resource->hooks->set_headers)(r, resource)) != NULL) { + err = dav_push_error(r->pool, err->status, 0, + "Unable to set up HTTP headers.", + err); + return dav_handle_err(r, err, NULL); + } + + if (r->header_only) { + return DONE; + } + + /* okay... time to search the content */ + /* Let's validate XML and process walk function + * in the hook function + */ + if ((err = (*search_hooks->search_resource)(r, &multi_status)) != NULL) { + /* ### add a higher-level description? */ + return dav_handle_err(r, err, NULL); + } + + /* We have results in multi_status */ + /* Should I pass namespace?? */ + dav_send_multistatus(r, HTTP_MULTI_STATUS, multi_status, NULL); + + return DONE; +} + + +/* handle the OPTIONS method */ +static int dav_method_options(request_rec *r) +{ + const dav_hooks_locks *locks_hooks = DAV_GET_HOOKS_LOCKS(r); + const dav_hooks_vsn *vsn_hooks = DAV_GET_HOOKS_VSN(r); + const dav_hooks_binding *binding_hooks = DAV_GET_HOOKS_BINDING(r); + const dav_hooks_search *search_hooks = DAV_GET_HOOKS_SEARCH(r); + dav_resource *resource; + const char *dav_level; + char *allow; + char *s; + const apr_array_header_t *arr; + const apr_table_entry_t *elts; + apr_table_t *methods = apr_table_make(r->pool, 12); + apr_text_header vsn_options = { 0 }; + apr_text_header body = { 0 }; + apr_text *t; + int text_size; + int result; + int i; + apr_array_header_t *uri_ary; + apr_xml_doc *doc; + const apr_xml_elem *elem; + dav_error *err; + + /* resolve the resource */ + err = dav_get_resource(r, 0 /* label_allowed */, 0 /* use_checked_in */, + &resource); + if (err != NULL) + return dav_handle_err(r, err, NULL); + + /* parse any request body */ + if ((result = ap_xml_parse_input(r, &doc)) != OK) { + return result; + } + /* note: doc == NULL if no request body */ + + if (doc && !dav_validate_root(doc, "options")) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "The \"options\" element was not found."); + return HTTP_BAD_REQUEST; + } + + /* determine which providers are available */ + dav_level = "1"; + + if (locks_hooks != NULL) { + dav_level = "1,2"; + } + + if (binding_hooks != NULL) + dav_level = apr_pstrcat(r->pool, dav_level, ",bindings", NULL); + + /* ### + * MSFT Web Folders chokes if length of DAV header value > 63 characters! + * To workaround that, we use separate DAV headers for versioning and + * live prop provider namespace URIs. + * ### + */ + apr_table_setn(r->headers_out, "DAV", dav_level); + + /* + * If there is a versioning provider, generate DAV headers + * for versioning options. + */ + if (vsn_hooks != NULL) { + (*vsn_hooks->get_vsn_options)(r->pool, &vsn_options); + + for (t = vsn_options.first; t != NULL; t = t->next) + apr_table_addn(r->headers_out, "DAV", t->text); + } + + /* + * Gather property set URIs from all the liveprop providers, + * and generate a separate DAV header for each URI, to avoid + * problems with long header lengths. + */ + uri_ary = apr_array_make(r->pool, 5, sizeof(const char *)); + dav_run_gather_propsets(uri_ary); + for (i = 0; i < uri_ary->nelts; ++i) { + if (((char **)uri_ary->elts)[i] != NULL) + apr_table_addn(r->headers_out, "DAV", ((char **)uri_ary->elts)[i]); + } + + /* this tells MSFT products to skip looking for FrontPage extensions */ + apr_table_setn(r->headers_out, "MS-Author-Via", "DAV"); + + /* + * Determine which methods are allowed on the resource. + * Three cases: resource is null (3), is lock-null (7.4), or exists. + * + * All cases support OPTIONS, and if there is a lock provider, LOCK. + * (Lock-) null resources also support MKCOL and PUT. + * Lock-null supports PROPFIND and UNLOCK. + * Existing resources support lots of stuff. + */ + + apr_table_addn(methods, "OPTIONS", ""); + + /* ### take into account resource type */ + switch (dav_get_resource_state(r, resource)) + { + case DAV_RESOURCE_EXISTS: + /* resource exists */ + apr_table_addn(methods, "GET", ""); + apr_table_addn(methods, "HEAD", ""); + apr_table_addn(methods, "POST", ""); + apr_table_addn(methods, "DELETE", ""); + apr_table_addn(methods, "TRACE", ""); + apr_table_addn(methods, "PROPFIND", ""); + apr_table_addn(methods, "PROPPATCH", ""); + apr_table_addn(methods, "COPY", ""); + apr_table_addn(methods, "MOVE", ""); + + if (!resource->collection) + apr_table_addn(methods, "PUT", ""); + + if (locks_hooks != NULL) { + apr_table_addn(methods, "LOCK", ""); + apr_table_addn(methods, "UNLOCK", ""); + } + + break; + + case DAV_RESOURCE_LOCK_NULL: + /* resource is lock-null. */ + apr_table_addn(methods, "MKCOL", ""); + apr_table_addn(methods, "PROPFIND", ""); + apr_table_addn(methods, "PUT", ""); + + if (locks_hooks != NULL) { + apr_table_addn(methods, "LOCK", ""); + apr_table_addn(methods, "UNLOCK", ""); + } + + break; + + case DAV_RESOURCE_NULL: + /* resource is null. */ + apr_table_addn(methods, "MKCOL", ""); + apr_table_addn(methods, "PUT", ""); + + if (locks_hooks != NULL) + apr_table_addn(methods, "LOCK", ""); + + break; + + default: + /* ### internal error! */ + break; + } + + /* If there is a versioning provider, add versioning methods */ + if (vsn_hooks != NULL) { + if (!resource->exists) { + if ((*vsn_hooks->versionable)(resource)) + apr_table_addn(methods, "VERSION-CONTROL", ""); + + if (vsn_hooks->can_be_workspace != NULL + && (*vsn_hooks->can_be_workspace)(resource)) + apr_table_addn(methods, "MKWORKSPACE", ""); + + if (vsn_hooks->can_be_activity != NULL + && (*vsn_hooks->can_be_activity)(resource)) + apr_table_addn(methods, "MKACTIVITY", ""); + } + else if (!resource->versioned) { + if ((*vsn_hooks->versionable)(resource)) + apr_table_addn(methods, "VERSION-CONTROL", ""); + } + else if (resource->working) { + apr_table_addn(methods, "CHECKIN", ""); + + /* ### we might not support this DeltaV option */ + apr_table_addn(methods, "UNCHECKOUT", ""); + } + else if (vsn_hooks->add_label != NULL) { + apr_table_addn(methods, "CHECKOUT", ""); + apr_table_addn(methods, "LABEL", ""); + } + else { + apr_table_addn(methods, "CHECKOUT", ""); + } + } + + /* If there is a bindings provider, see if resource is bindable */ + if (binding_hooks != NULL + && (*binding_hooks->is_bindable)(resource)) { + apr_table_addn(methods, "BIND", ""); + } + + /* If there is a search provider, set SEARCH in option */ + if (search_hooks != NULL) { + apr_table_addn(methods, "SEARCH", ""); + } + + /* Generate the Allow header */ + arr = apr_table_elts(methods); + elts = (const apr_table_entry_t *)arr->elts; + text_size = 0; + + /* first, compute total length */ + for (i = 0; i < arr->nelts; ++i) { + if (elts[i].key == NULL) + continue; + + /* add 1 for comma or null */ + text_size += strlen(elts[i].key) + 1; + } + + s = allow = apr_palloc(r->pool, text_size); + + for (i = 0; i < arr->nelts; ++i) { + if (elts[i].key == NULL) + continue; + + if (s != allow) + *s++ = ','; + + strcpy(s, elts[i].key); + s += strlen(s); + } + + apr_table_setn(r->headers_out, "Allow", allow); + + + /* If there is search set_option_head function, set head */ + /* DASL: + * DASL: + * DASL: + */ + if (search_hooks != NULL + && *search_hooks->set_option_head != NULL) { + if ((err = (*search_hooks->set_option_head)(r)) != NULL) { + return dav_handle_err(r, err, NULL); + } + } + + /* if there was no request body, then there is no response body */ + if (doc == NULL) { + ap_set_content_length(r, 0); + + /* ### this sends a Content-Type. the default OPTIONS does not. */ + + /* ### the default (ap_send_http_options) returns OK, but I believe + * ### that is because it is the default handler and nothing else + * ### will run after the thing. */ + return DONE; + } + + /* handle each options request */ + for (elem = doc->root->first_child; elem != NULL; elem = elem->next) { + /* check for something we recognize first */ + int core_option = 0; + dav_error *err = NULL; + + if (elem->ns == APR_XML_NS_DAV_ID) { + if (strcmp(elem->name, "supported-method-set") == 0) { + err = dav_gen_supported_methods(r, elem, methods, &body); + core_option = 1; + } + else if (strcmp(elem->name, "supported-live-property-set") == 0) { + err = dav_gen_supported_live_props(r, resource, elem, &body); + core_option = 1; + } + else if (strcmp(elem->name, "supported-report-set") == 0) { + err = dav_gen_supported_reports(r, resource, elem, vsn_hooks, &body); + core_option = 1; + } + } + + if (err != NULL) + return dav_handle_err(r, err, NULL); + + /* if unrecognized option, pass to versioning provider */ + if (!core_option && vsn_hooks != NULL) { + if ((err = (*vsn_hooks->get_option)(resource, elem, &body)) + != NULL) { + return dav_handle_err(r, err, NULL); + } + } + } + + /* send the options response */ + r->status = HTTP_OK; + ap_set_content_type(r, DAV_XML_CONTENT_TYPE); + + /* send the headers and response body */ + ap_rputs(DAV_XML_HEADER DEBUG_CR + "" DEBUG_CR, r); + + for (t = body.first; t != NULL; t = t->next) + ap_rputs(t->text, r); + + ap_rputs("" DEBUG_CR, r); + + /* we've sent everything necessary to the client. */ + return DONE; +} + +static void dav_cache_badprops(dav_walker_ctx *ctx) +{ + const apr_xml_elem *elem; + apr_text_header hdr = { 0 }; + + /* just return if we built the thing already */ + if (ctx->propstat_404 != NULL) { + return; + } + + apr_text_append(ctx->w.pool, &hdr, + "" DEBUG_CR + "" DEBUG_CR); + + elem = dav_find_child(ctx->doc->root, "prop"); + for (elem = elem->first_child; elem; elem = elem->next) { + apr_text_append(ctx->w.pool, &hdr, + apr_xml_empty_elem(ctx->w.pool, elem)); + } + + apr_text_append(ctx->w.pool, &hdr, + "" DEBUG_CR + "HTTP/1.1 404 Not Found" DEBUG_CR + "" DEBUG_CR); + + ctx->propstat_404 = hdr.first; +} + +static dav_error * dav_propfind_walker(dav_walk_resource *wres, int calltype) +{ + dav_walker_ctx *ctx = wres->walk_ctx; + dav_error *err; + dav_propdb *propdb; + dav_get_props_result propstats = { 0 }; + + /* + ** Note: ctx->doc can only be NULL for DAV_PROPFIND_IS_ALLPROP. Since + ** dav_get_allprops() does not need to do namespace translation, + ** we're okay. + ** + ** Note: we cast to lose the "const". The propdb won't try to change + ** the resource, however, since we are opening readonly. + */ + err = dav_open_propdb(ctx->r, ctx->w.lockdb, wres->resource, 1, + ctx->doc ? ctx->doc->namespaces : NULL, &propdb); + if (err != NULL) { + /* ### do something with err! */ + + if (ctx->propfind_type == DAV_PROPFIND_IS_PROP) { + dav_get_props_result badprops = { 0 }; + + /* some props were expected on this collection/resource */ + dav_cache_badprops(ctx); + badprops.propstats = ctx->propstat_404; + dav_stream_response(wres, 0, &badprops, ctx->scratchpool); + } + else { + /* no props on this collection/resource */ + dav_stream_response(wres, HTTP_OK, NULL, ctx->scratchpool); + } + + apr_pool_clear(ctx->scratchpool); + return NULL; + } + /* ### what to do about closing the propdb on server failure? */ + + if (ctx->propfind_type == DAV_PROPFIND_IS_PROP) { + propstats = dav_get_props(propdb, ctx->doc); + } + else { + dav_prop_insert what = ctx->propfind_type == DAV_PROPFIND_IS_ALLPROP + ? DAV_PROP_INSERT_VALUE + : DAV_PROP_INSERT_NAME; + propstats = dav_get_allprops(propdb, what); + } + dav_close_propdb(propdb); + + dav_stream_response(wres, 0, &propstats, ctx->scratchpool); + + /* at this point, ctx->scratchpool has been used to stream a + single response. this function fully controls the pool, and + thus has the right to clear it for the next iteration of this + callback. */ + apr_pool_clear(ctx->scratchpool); + + return NULL; +} + +/* handle the PROPFIND method */ +static int dav_method_propfind(request_rec *r) +{ + dav_resource *resource; + int depth; + dav_error *err; + int result; + apr_xml_doc *doc; + const apr_xml_elem *child; + dav_walker_ctx ctx = { { 0 } }; + dav_response *multi_status; + + /* Ask repository module to resolve the resource */ + err = dav_get_resource(r, 1 /* label_allowed */, 0 /* use_checked_in */, + &resource); + if (err != NULL) + return dav_handle_err(r, err, NULL); + + if (dav_get_resource_state(r, resource) == DAV_RESOURCE_NULL) { + /* Apache will supply a default error for this. */ + return HTTP_NOT_FOUND; + } + + if ((depth = dav_get_depth(r, DAV_INFINITY)) < 0) { + /* dav_get_depth() supplies additional information for the + * default message. */ + return HTTP_BAD_REQUEST; + } + + if (depth == DAV_INFINITY && resource->collection) { + dav_dir_conf *conf; + conf = (dav_dir_conf *)ap_get_module_config(r->per_dir_config, + &dav_module); + /* default is to DISALLOW these requests */ + if (conf->allow_depthinfinity != DAV_ENABLED_ON) { + return dav_error_response(r, HTTP_FORBIDDEN, + apr_psprintf(r->pool, + "PROPFIND requests with a " + "Depth of \"infinity\" are " + "not allowed for %s.", + ap_escape_html(r->pool, + r->uri))); + } + } + + if ((result = ap_xml_parse_input(r, &doc)) != OK) { + return result; + } + /* note: doc == NULL if no request body */ + + if (doc && !dav_validate_root(doc, "propfind")) { + /* This supplies additional information for the default message. */ + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "The \"propfind\" element was not found."); + return HTTP_BAD_REQUEST; + } + + /* ### validate that only one of these three elements is present */ + + if (doc == NULL + || (child = dav_find_child(doc->root, "allprop")) != NULL) { + /* note: no request body implies allprop */ + ctx.propfind_type = DAV_PROPFIND_IS_ALLPROP; + } + else if ((child = dav_find_child(doc->root, "propname")) != NULL) { + ctx.propfind_type = DAV_PROPFIND_IS_PROPNAME; + } + else if ((child = dav_find_child(doc->root, "prop")) != NULL) { + ctx.propfind_type = DAV_PROPFIND_IS_PROP; + } + else { + /* "propfind" element must have one of the above three children */ + + /* This supplies additional information for the default message. */ + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "The \"propfind\" element does not contain one of " + "the required child elements (the specific command)."); + return HTTP_BAD_REQUEST; + } + + ctx.w.walk_type = DAV_WALKTYPE_NORMAL | DAV_WALKTYPE_AUTH; + ctx.w.func = dav_propfind_walker; + ctx.w.walk_ctx = &ctx; + ctx.w.pool = r->pool; + ctx.w.root = resource; + + ctx.doc = doc; + ctx.r = r; + ctx.bb = apr_brigade_create(r->pool, r->connection->bucket_alloc); + apr_pool_create(&ctx.scratchpool, r->pool); + + /* ### should open read-only */ + if ((err = dav_open_lockdb(r, 0, &ctx.w.lockdb)) != NULL) { + err = dav_push_error(r->pool, err->status, 0, + "The lock database could not be opened, " + "preventing access to the various lock " + "properties for the PROPFIND.", + err); + return dav_handle_err(r, err, NULL); + } + if (ctx.w.lockdb != NULL) { + /* if we have a lock database, then we can walk locknull resources */ + ctx.w.walk_type |= DAV_WALKTYPE_LOCKNULL; + } + + /* send tag, with all doc->namespaces attached. */ + + /* NOTE: we *cannot* leave out the doc's namespaces from the + initial tag. if a 404 was generated for an HREF, + then we need to spit out the doc's namespaces for use by the + 404. Note that elements will override these ns0, + ns1, etc, but NOT within the scope for the + badprops. */ + dav_begin_multistatus(ctx.bb, r, HTTP_MULTI_STATUS, + doc ? doc->namespaces : NULL); + + /* Have the provider walk the resource. */ + err = (*resource->hooks->walk)(&ctx.w, depth, &multi_status); + + if (ctx.w.lockdb != NULL) { + (*ctx.w.lockdb->hooks->close_lockdb)(ctx.w.lockdb); + } + + if (err != NULL) { + /* If an error occurred during the resource walk, there's + basically nothing we can do but abort the connection and + log an error. This is one of the limitations of HTTP; it + needs to "know" the entire status of the response before + generating it, which is just impossible in these streamy + response situations. */ + err = dav_push_error(r->pool, err->status, 0, + "Provider encountered an error while streaming" + " a multistatus PROPFIND response.", err); + dav_log_err(r, err, APLOG_ERR); + r->connection->aborted = 1; + return DONE; + } + + dav_finish_multistatus(r, ctx.bb); + ap_filter_flush(ctx.bb, r->output_filters); + + /* the response has been sent. */ + return DONE; +} + +static apr_text * dav_failed_proppatch(apr_pool_t *p, + apr_array_header_t *prop_ctx) +{ + apr_text_header hdr = { 0 }; + int i = prop_ctx->nelts; + dav_prop_ctx *ctx = (dav_prop_ctx *)prop_ctx->elts; + dav_error *err424_set = NULL; + dav_error *err424_delete = NULL; + const char *s; + + /* ### might be nice to sort by status code and description */ + + for ( ; i-- > 0; ++ctx ) { + apr_text_append(p, &hdr, + "" DEBUG_CR + ""); + apr_text_append(p, &hdr, apr_xml_empty_elem(p, ctx->prop)); + apr_text_append(p, &hdr, "" DEBUG_CR); + + if (ctx->err == NULL) { + /* nothing was assigned here yet, so make it a 424 */ + + if (ctx->operation == DAV_PROP_OP_SET) { + if (err424_set == NULL) + err424_set = dav_new_error(p, HTTP_FAILED_DEPENDENCY, 0, + "Attempted DAV:set operation " + "could not be completed due " + "to other errors."); + ctx->err = err424_set; + } + else if (ctx->operation == DAV_PROP_OP_DELETE) { + if (err424_delete == NULL) + err424_delete = dav_new_error(p, HTTP_FAILED_DEPENDENCY, 0, + "Attempted DAV:remove " + "operation could not be " + "completed due to other " + "errors."); + ctx->err = err424_delete; + } + } + + s = apr_psprintf(p, + "" + "HTTP/1.1 %d (status)" + "" DEBUG_CR, + ctx->err->status); + apr_text_append(p, &hdr, s); + + /* ### we should use compute_desc if necessary... */ + if (ctx->err->desc != NULL) { + apr_text_append(p, &hdr, "" DEBUG_CR); + apr_text_append(p, &hdr, ctx->err->desc); + apr_text_append(p, &hdr, "" DEBUG_CR); + } + + apr_text_append(p, &hdr, "" DEBUG_CR); + } + + return hdr.first; +} + +static apr_text * dav_success_proppatch(apr_pool_t *p, apr_array_header_t *prop_ctx) +{ + apr_text_header hdr = { 0 }; + int i = prop_ctx->nelts; + dav_prop_ctx *ctx = (dav_prop_ctx *)prop_ctx->elts; + + /* + * ### we probably need to revise the way we assemble the response... + * ### this code assumes everything will return status==200. + */ + + apr_text_append(p, &hdr, + "" DEBUG_CR + "" DEBUG_CR); + + for ( ; i-- > 0; ++ctx ) { + apr_text_append(p, &hdr, apr_xml_empty_elem(p, ctx->prop)); + } + + apr_text_append(p, &hdr, + "" DEBUG_CR + "HTTP/1.1 200 OK" DEBUG_CR + "" DEBUG_CR); + + return hdr.first; +} + +static void dav_prop_log_errors(dav_prop_ctx *ctx) +{ + dav_log_err(ctx->r, ctx->err, APLOG_ERR); +} + +/* + * Call for each context. This can stop when an error occurs, or + * simply iterate through the whole list. + * + * Returns 1 if an error occurs (and the iteration is aborted). Returns 0 + * if all elements are processed. + * + * If is true (non-zero), then the list is traversed in + * reverse order. + */ +static int dav_process_ctx_list(void (*func)(dav_prop_ctx *ctx), + apr_array_header_t *ctx_list, int stop_on_error, + int reverse) +{ + int i = ctx_list->nelts; + dav_prop_ctx *ctx = (dav_prop_ctx *)ctx_list->elts; + + if (reverse) + ctx += i; + + while (i--) { + if (reverse) + --ctx; + + (*func)(ctx); + if (stop_on_error && DAV_PROP_CTX_HAS_ERR(*ctx)) { + return 1; + } + + if (!reverse) + ++ctx; + } + + return 0; +} + +/* handle the PROPPATCH method */ +static int dav_method_proppatch(request_rec *r) +{ + dav_error *err; + dav_resource *resource; + int result; + apr_xml_doc *doc; + apr_xml_elem *child; + dav_propdb *propdb; + int failure = 0; + dav_response resp = { 0 }; + apr_text *propstat_text; + apr_array_header_t *ctx_list; + dav_prop_ctx *ctx; + dav_auto_version_info av_info; + + /* Ask repository module to resolve the resource */ + err = dav_get_resource(r, 0 /* label_allowed */, 0 /* use_checked_in */, + &resource); + if (err != NULL) + return dav_handle_err(r, err, NULL); + if (!resource->exists) { + /* Apache will supply a default error for this. */ + return HTTP_NOT_FOUND; + } + + if ((result = ap_xml_parse_input(r, &doc)) != OK) { + return result; + } + /* note: doc == NULL if no request body */ + + if (doc == NULL || !dav_validate_root(doc, "propertyupdate")) { + /* This supplies additional information for the default message. */ + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "The request body does not contain " + "a \"propertyupdate\" element."); + return HTTP_BAD_REQUEST; + } + + /* Check If-Headers and existing locks */ + /* Note: depth == 0. Implies no need for a multistatus response. */ + if ((err = dav_validate_request(r, resource, 0, NULL, NULL, + DAV_VALIDATE_RESOURCE, NULL)) != NULL) { + /* ### add a higher-level description? */ + return dav_handle_err(r, err, NULL); + } + + /* make sure the resource can be modified (if versioning repository) */ + if ((err = dav_auto_checkout(r, resource, + 0 /* not parent_only */, + &av_info)) != NULL) { + /* ### add a higher-level description? */ + return dav_handle_err(r, err, NULL); + } + + if ((err = dav_open_propdb(r, NULL, resource, 0, doc->namespaces, + &propdb)) != NULL) { + /* undo any auto-checkout */ + dav_auto_checkin(r, resource, 1 /*undo*/, 0 /*unlock*/, &av_info); + + err = dav_push_error(r->pool, HTTP_INTERNAL_SERVER_ERROR, 0, + apr_psprintf(r->pool, + "Could not open the property " + "database for %s.", + ap_escape_html(r->pool, r->uri)), + err); + return dav_handle_err(r, err, NULL); + } + /* ### what to do about closing the propdb on server failure? */ + + /* ### validate "live" properties */ + + /* set up an array to hold property operation contexts */ + ctx_list = apr_array_make(r->pool, 10, sizeof(dav_prop_ctx)); + + /* do a first pass to ensure that all "remove" properties exist */ + for (child = doc->root->first_child; child; child = child->next) { + int is_remove; + apr_xml_elem *prop_group; + apr_xml_elem *one_prop; + + /* Ignore children that are not set/remove */ + if (child->ns != APR_XML_NS_DAV_ID + || (!(is_remove = strcmp(child->name, "remove") == 0) + && strcmp(child->name, "set") != 0)) { + continue; + } + + /* make sure that a "prop" child exists for set/remove */ + if ((prop_group = dav_find_child(child, "prop")) == NULL) { + dav_close_propdb(propdb); + + /* undo any auto-checkout */ + dav_auto_checkin(r, resource, 1 /*undo*/, 0 /*unlock*/, &av_info); + + /* This supplies additional information for the default message. */ + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "A \"prop\" element is missing inside " + "the propertyupdate command."); + return HTTP_BAD_REQUEST; + } + + for (one_prop = prop_group->first_child; one_prop; + one_prop = one_prop->next) { + + ctx = (dav_prop_ctx *)apr_array_push(ctx_list); + ctx->propdb = propdb; + ctx->operation = is_remove ? DAV_PROP_OP_DELETE : DAV_PROP_OP_SET; + ctx->prop = one_prop; + + ctx->r = r; /* for later use by dav_prop_log_errors() */ + + dav_prop_validate(ctx); + + if ( DAV_PROP_CTX_HAS_ERR(*ctx) ) { + failure = 1; + } + } + } + + /* ### should test that we found at least one set/remove */ + + /* execute all of the operations */ + if (!failure && dav_process_ctx_list(dav_prop_exec, ctx_list, 1, 0)) { + failure = 1; + } + + /* generate a failure/success response */ + if (failure) { + (void)dav_process_ctx_list(dav_prop_rollback, ctx_list, 0, 1); + propstat_text = dav_failed_proppatch(r->pool, ctx_list); + } + else { + (void)dav_process_ctx_list(dav_prop_commit, ctx_list, 0, 0); + propstat_text = dav_success_proppatch(r->pool, ctx_list); + } + + /* make sure this gets closed! */ + dav_close_propdb(propdb); + + /* complete any auto-versioning */ + dav_auto_checkin(r, resource, failure, 0 /*unlock*/, &av_info); + + /* log any errors that occurred */ + (void)dav_process_ctx_list(dav_prop_log_errors, ctx_list, 0, 0); + + resp.href = resource->uri; + + /* ### should probably use something new to pass along this text... */ + resp.propresult.propstats = propstat_text; + + dav_send_multistatus(r, HTTP_MULTI_STATUS, &resp, doc->namespaces); + + /* the response has been sent. */ + return DONE; +} + +static int process_mkcol_body(request_rec *r) +{ + /* This is snarfed from ap_setup_client_block(). We could get pretty + * close to this behavior by passing REQUEST_NO_BODY, but we need to + * return HTTP_UNSUPPORTED_MEDIA_TYPE (while ap_setup_client_block + * returns HTTP_REQUEST_ENTITY_TOO_LARGE). */ + + const char *tenc = apr_table_get(r->headers_in, "Transfer-Encoding"); + const char *lenp = apr_table_get(r->headers_in, "Content-Length"); + + /* make sure to set the Apache request fields properly. */ + r->read_body = REQUEST_NO_BODY; + r->read_chunked = 0; + r->remaining = 0; + + if (tenc) { + if (strcasecmp(tenc, "chunked")) { + /* Use this instead of Apache's default error string */ + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Unknown Transfer-Encoding %s", tenc); + return HTTP_NOT_IMPLEMENTED; + } + + r->read_chunked = 1; + } + else if (lenp) { + const char *pos = lenp; + + while (apr_isdigit(*pos) || apr_isspace(*pos)) { + ++pos; + } + + if (*pos != '\0') { + /* This supplies additional information for the default message. */ + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Invalid Content-Length %s", lenp); + return HTTP_BAD_REQUEST; + } + + r->remaining = apr_atoi64(lenp); + } + + if (r->read_chunked || r->remaining > 0) { + /* ### log something? */ + + /* Apache will supply a default error for this. */ + return HTTP_UNSUPPORTED_MEDIA_TYPE; + } + + /* + * Get rid of the body. this will call ap_setup_client_block(), but + * our copy above has already verified its work. + */ + return ap_discard_request_body(r); +} + +/* handle the MKCOL method */ +static int dav_method_mkcol(request_rec *r) +{ + dav_resource *resource; + int resource_state; + dav_auto_version_info av_info; + const dav_hooks_locks *locks_hooks = DAV_GET_HOOKS_LOCKS(r); + dav_error *err; + dav_error *err2; + int result; + dav_dir_conf *conf; + dav_response *multi_status; + + /* handle the request body */ + /* ### this may move lower once we start processing bodies */ + if ((result = process_mkcol_body(r)) != OK) { + return result; + } + + conf = (dav_dir_conf *)ap_get_module_config(r->per_dir_config, + &dav_module); + + /* Ask repository module to resolve the resource */ + err = dav_get_resource(r, 0 /* label_allowed */, 0 /* use_checked_in */, + &resource); + if (err != NULL) + return dav_handle_err(r, err, NULL); + + if (resource->exists) { + /* oops. something was already there! */ + + /* Apache will supply a default error for this. */ + /* ### we should provide a specific error message! */ + return HTTP_METHOD_NOT_ALLOWED; + } + + resource_state = dav_get_resource_state(r, resource); + + /* + * Check If-Headers and existing locks. + * + * Note: depth == 0 normally requires no multistatus response. However, + * if we pass DAV_VALIDATE_PARENT, then we could get an error on a URI + * other than the Request-URI, thereby requiring a multistatus. + * + * If the resource does not exist (DAV_RESOURCE_NULL), then we must + * check the resource *and* its parent. If the resource exists or is + * a locknull resource, then we check only the resource. + */ + if ((err = dav_validate_request(r, resource, 0, NULL, &multi_status, + resource_state == DAV_RESOURCE_NULL ? + DAV_VALIDATE_PARENT : + DAV_VALIDATE_RESOURCE, NULL)) != NULL) { + /* ### add a higher-level description? */ + return dav_handle_err(r, err, multi_status); + } + + /* if versioned resource, make sure parent is checked out */ + if ((err = dav_auto_checkout(r, resource, 1 /* parent_only */, + &av_info)) != NULL) { + /* ### add a higher-level description? */ + return dav_handle_err(r, err, NULL); + } + + /* try to create the collection */ + resource->collection = 1; + err = (*resource->hooks->create_collection)(resource); + + /* restore modifiability of parent back to what it was */ + err2 = dav_auto_checkin(r, NULL, err != NULL /* undo if error */, + 0 /*unlock*/, &av_info); + + /* check for errors now */ + if (err != NULL) { + return dav_handle_err(r, err, NULL); + } + if (err2 != NULL) { + /* just log a warning */ + err = dav_push_error(r->pool, err2->status, 0, + "The MKCOL was successful, but there " + "was a problem automatically checking in " + "the parent collection.", + err2); + dav_log_err(r, err, APLOG_WARNING); + } + + if (locks_hooks != NULL) { + dav_lockdb *lockdb; + + if ((err = (*locks_hooks->open_lockdb)(r, 0, 0, &lockdb)) != NULL) { + /* The directory creation was successful, but the locking failed. */ + err = dav_push_error(r->pool, err->status, 0, + "The MKCOL was successful, but there " + "was a problem opening the lock database " + "which prevents inheriting locks from the " + "parent resources.", + err); + return dav_handle_err(r, err, NULL); + } + + /* notify lock system that we have created/replaced a resource */ + err = dav_notify_created(r, lockdb, resource, resource_state, 0); + + (*locks_hooks->close_lockdb)(lockdb); + + if (err != NULL) { + /* The dir creation was successful, but the locking failed. */ + err = dav_push_error(r->pool, err->status, 0, + "The MKCOL was successful, but there " + "was a problem updating its lock " + "information.", + err); + return dav_handle_err(r, err, NULL); + } + } + + /* return an appropriate response (HTTP_CREATED) */ + return dav_created(r, NULL, "Collection", 0); +} + +/* handle the COPY and MOVE methods */ +static int dav_method_copymove(request_rec *r, int is_move) +{ + dav_resource *resource; + dav_resource *resnew; + dav_auto_version_info src_av_info = { 0 }; + dav_auto_version_info dst_av_info = { 0 }; + const char *body; + const char *dest; + dav_error *err; + dav_error *err2; + dav_error *err3; + dav_response *multi_response; + dav_lookup_result lookup; + int is_dir; + int overwrite; + int depth; + int result; + dav_lockdb *lockdb; + int replace_dest; + int resnew_state; + + /* Ask repository module to resolve the resource */ + err = dav_get_resource(r, !is_move /* label_allowed */, + 0 /* use_checked_in */, &resource); + if (err != NULL) + return dav_handle_err(r, err, NULL); + + if (!resource->exists) { + /* Apache will supply a default error for this. */ + return HTTP_NOT_FOUND; + } + + /* If not a file or collection resource, COPY/MOVE not allowed */ + /* ### allow COPY/MOVE of DeltaV resource types */ + if (resource->type != DAV_RESOURCE_TYPE_REGULAR) { + body = apr_psprintf(r->pool, + "Cannot COPY/MOVE resource %s.", + ap_escape_html(r->pool, r->uri)); + return dav_error_response(r, HTTP_METHOD_NOT_ALLOWED, body); + } + + /* get the destination URI */ + dest = apr_table_get(r->headers_in, "Destination"); + if (dest == NULL) { + /* Look in headers provided by Netscape's Roaming Profiles */ + const char *nscp_host = apr_table_get(r->headers_in, "Host"); + const char *nscp_path = apr_table_get(r->headers_in, "New-uri"); + + if (nscp_host != NULL && nscp_path != NULL) + dest = apr_psprintf(r->pool, "http://%s%s", nscp_host, nscp_path); + } + if (dest == NULL) { + /* This supplies additional information for the default message. */ + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "The request is missing a Destination header."); + return HTTP_BAD_REQUEST; + } + + lookup = dav_lookup_uri(dest, r, 1 /* must_be_absolute */); + if (lookup.rnew == NULL) { + if (lookup.err.status == HTTP_BAD_REQUEST) { + /* This supplies additional information for the default message. */ + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "%s", lookup.err.desc); + return HTTP_BAD_REQUEST; + } + + /* ### this assumes that dav_lookup_uri() only generates a status + * ### that Apache can provide a status line for!! */ + + return dav_error_response(r, lookup.err.status, lookup.err.desc); + } + if (lookup.rnew->status != HTTP_OK) { + const char *auth = apr_table_get(lookup.rnew->err_headers_out, + "WWW-Authenticate"); + if (lookup.rnew->status == HTTP_UNAUTHORIZED && auth != NULL) { + /* propagate the WWW-Authorization header up from the + * subreq so the client sees it. */ + apr_table_set(r->err_headers_out, "WWW-Authenticate", + apr_pstrdup(r->pool, auth)); + } + + /* ### how best to report this... */ + return dav_error_response(r, lookup.rnew->status, + "Destination URI had an error."); + } + + /* Resolve destination resource */ + err = dav_get_resource(lookup.rnew, 0 /* label_allowed */, + 0 /* use_checked_in */, &resnew); + if (err != NULL) + return dav_handle_err(r, err, NULL); + + /* are the two resources handled by the same repository? */ + if (resource->hooks != resnew->hooks) { + /* ### this message exposes some backend config, but screw it... */ + return dav_error_response(r, HTTP_BAD_GATEWAY, + "Destination URI is handled by a " + "different repository than the source URI. " + "MOVE or COPY between repositories is " + "not possible."); + } + + /* get and parse the overwrite header value */ + if ((overwrite = dav_get_overwrite(r)) < 0) { + /* dav_get_overwrite() supplies additional information for the + * default message. */ + return HTTP_BAD_REQUEST; + } + + /* quick failure test: if dest exists and overwrite is false. */ + if (resnew->exists && !overwrite) { + /* Supply some text for the error response body. */ + return dav_error_response(r, HTTP_PRECONDITION_FAILED, + "Destination is not empty and " + "Overwrite is not \"T\""); + } + + /* are the source and destination the same? */ + if ((*resource->hooks->is_same_resource)(resource, resnew)) { + /* Supply some text for the error response body. */ + return dav_error_response(r, HTTP_FORBIDDEN, + "Source and Destination URIs are the same."); + + } + + is_dir = resource->collection; + + /* get and parse the Depth header value. "0" and "infinity" are legal. */ + if ((depth = dav_get_depth(r, DAV_INFINITY)) < 0) { + /* dav_get_depth() supplies additional information for the + * default message. */ + return HTTP_BAD_REQUEST; + } + if (depth == 1) { + /* This supplies additional information for the default message. */ + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Depth must be \"0\" or \"infinity\" for COPY or MOVE."); + return HTTP_BAD_REQUEST; + } + if (is_move && is_dir && depth != DAV_INFINITY) { + /* This supplies additional information for the default message. */ + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Depth must be \"infinity\" when moving a collection."); + return HTTP_BAD_REQUEST; + } + + /* + * Check If-Headers and existing locks for each resource in the source + * if we are performing a MOVE. We will return a 424 response with a + * DAV:multistatus body. The multistatus responses will contain the + * information about any resource that fails the validation. + * + * We check the parent resource, too, since this is a MOVE. Moving the + * resource effectively removes it from the parent collection, so we + * must ensure that we have met the appropriate conditions. + * + * If a problem occurs with the Request-URI itself, then a plain error + * (rather than a multistatus) will be returned. + */ + if (is_move + && (err = dav_validate_request(r, resource, depth, NULL, + &multi_response, + DAV_VALIDATE_PARENT + | DAV_VALIDATE_USE_424, + NULL)) != NULL) { + err = dav_push_error(r->pool, err->status, 0, + apr_psprintf(r->pool, + "Could not MOVE %s due to a failed " + "precondition on the source " + "(e.g. locks).", + ap_escape_html(r->pool, r->uri)), + err); + return dav_handle_err(r, err, multi_response); + } + + /* + * Check If-Headers and existing locks for destination. Note that we + * use depth==infinity since the target (hierarchy) will be deleted + * before the move/copy is completed. + * + * Note that we are overwriting the target, which implies a DELETE, so + * we are subject to the error/response rules as a DELETE. Namely, we + * will return a 424 error if any of the validations fail. + * (see dav_method_delete() for more information) + */ + if ((err = dav_validate_request(lookup.rnew, resnew, DAV_INFINITY, NULL, + &multi_response, + DAV_VALIDATE_PARENT + | DAV_VALIDATE_USE_424, NULL)) != NULL) { + err = dav_push_error(r->pool, err->status, 0, + apr_psprintf(r->pool, + "Could not MOVE/COPY %s due to a " + "failed precondition on the " + "destination (e.g. locks).", + ap_escape_html(r->pool, r->uri)), + err); + return dav_handle_err(r, err, multi_response); + } + + if (is_dir + && depth == DAV_INFINITY + && (*resource->hooks->is_parent_resource)(resource, resnew)) { + /* Supply some text for the error response body. */ + return dav_error_response(r, HTTP_FORBIDDEN, + "Source collection contains the " + "Destination."); + + } + if (is_dir + && (*resnew->hooks->is_parent_resource)(resnew, resource)) { + /* The destination must exist (since it contains the source), and + * a condition above implies Overwrite==T. Obviously, we cannot + * delete the Destination before the MOVE/COPY, as that would + * delete the Source. + */ + + /* Supply some text for the error response body. */ + return dav_error_response(r, HTTP_FORBIDDEN, + "Destination collection contains the Source " + "and Overwrite has been specified."); + } + + /* ### for now, we don't need anything in the body */ + if ((result = ap_discard_request_body(r)) != OK) { + return result; + } + + if ((err = dav_open_lockdb(r, 0, &lockdb)) != NULL) { + /* ### add a higher-level description? */ + return dav_handle_err(r, err, NULL); + } + + /* remove any locks from the old resources */ + /* + * ### this is Yet Another Traversal. if we do a rename(), then we + * ### really don't have to do this in some cases since the inode + * ### values will remain constant across the move. but we can't + * ### know that fact from outside the provider :-( + * + * ### note that we now have a problem atomicity in the move/copy + * ### since a failure after this would have removed locks (technically, + * ### this is okay to do, but really...) + */ + if (is_move && lockdb != NULL) { + /* ### this is wrong! it blasts direct locks on parent resources */ + /* ### pass lockdb! */ + (void)dav_unlock(r, resource, NULL); + } + + /* if this is a move, then the source parent collection will be modified */ + if (is_move) { + if ((err = dav_auto_checkout(r, resource, 1 /* parent_only */, + &src_av_info)) != NULL) { + if (lockdb != NULL) + (*lockdb->hooks->close_lockdb)(lockdb); + + /* ### add a higher-level description? */ + return dav_handle_err(r, err, NULL); + } + } + + /* + * Remember the initial state of the destination, so the lock system + * can be notified as to how it changed. + */ + resnew_state = dav_get_resource_state(lookup.rnew, resnew); + + /* In a MOVE operation, the destination is replaced by the source. + * In a COPY operation, if the destination exists, is under version + * control, and is the same resource type as the source, + * then it should not be replaced, but modified to be a copy of + * the source. + */ + if (!resnew->exists) + replace_dest = 0; + else if (is_move || !resource->versioned) + replace_dest = 1; + else if (resource->type != resnew->type) + replace_dest = 1; + else if ((resource->collection == 0) != (resnew->collection == 0)) + replace_dest = 1; + else + replace_dest = 0; + + /* If the destination must be created or replaced, + * make sure the parent collection is writable + */ + if (!resnew->exists || replace_dest) { + if ((err = dav_auto_checkout(r, resnew, 1 /*parent_only*/, + &dst_av_info)) != NULL) { + /* could not make destination writable: + * if move, restore state of source parent + */ + if (is_move) { + (void)dav_auto_checkin(r, NULL, 1 /* undo */, + 0 /*unlock*/, &src_av_info); + } + + if (lockdb != NULL) + (*lockdb->hooks->close_lockdb)(lockdb); + + /* ### add a higher-level description? */ + return dav_handle_err(r, err, NULL); + } + } + + /* If source and destination parents are the same, then + * use the same resource object, so status updates to one are reflected + * in the other, when doing auto-versioning. Otherwise, + * we may try to checkin the parent twice. + */ + if (src_av_info.parent_resource != NULL + && dst_av_info.parent_resource != NULL + && (*src_av_info.parent_resource->hooks->is_same_resource) + (src_av_info.parent_resource, dst_av_info.parent_resource)) { + + dst_av_info.parent_resource = src_av_info.parent_resource; + } + + /* If destination is being replaced, remove it first + * (we know Ovewrite must be TRUE). Then try to copy/move the resource. + */ + if (replace_dest) + err = (*resnew->hooks->remove_resource)(resnew, &multi_response); + + if (err == NULL) { + if (is_move) + err = (*resource->hooks->move_resource)(resource, resnew, + &multi_response); + else + err = (*resource->hooks->copy_resource)(resource, resnew, depth, + &multi_response); + } + + /* perform any auto-versioning cleanup */ + err2 = dav_auto_checkin(r, NULL, err != NULL /* undo if error */, + 0 /*unlock*/, &dst_av_info); + + if (is_move) { + err3 = dav_auto_checkin(r, NULL, err != NULL /* undo if error */, + 0 /*unlock*/, &src_av_info); + } + else + err3 = NULL; + + /* check for error from remove/copy/move operations */ + if (err != NULL) { + if (lockdb != NULL) + (*lockdb->hooks->close_lockdb)(lockdb); + + err = dav_push_error(r->pool, err->status, 0, + apr_psprintf(r->pool, + "Could not MOVE/COPY %s.", + ap_escape_html(r->pool, r->uri)), + err); + return dav_handle_err(r, err, multi_response); + } + + /* check for errors from auto-versioning */ + if (err2 != NULL) { + /* just log a warning */ + err = dav_push_error(r->pool, err2->status, 0, + "The MOVE/COPY was successful, but there was a " + "problem automatically checking in the " + "source parent collection.", + err2); + dav_log_err(r, err, APLOG_WARNING); + } + if (err3 != NULL) { + /* just log a warning */ + err = dav_push_error(r->pool, err3->status, 0, + "The MOVE/COPY was successful, but there was a " + "problem automatically checking in the " + "destination or its parent collection.", + err3); + dav_log_err(r, err, APLOG_WARNING); + } + + /* propagate any indirect locks at the target */ + if (lockdb != NULL) { + + /* notify lock system that we have created/replaced a resource */ + err = dav_notify_created(r, lockdb, resnew, resnew_state, depth); + + (*lockdb->hooks->close_lockdb)(lockdb); + + if (err != NULL) { + /* The move/copy was successful, but the locking failed. */ + err = dav_push_error(r->pool, err->status, 0, + "The MOVE/COPY was successful, but there " + "was a problem updating the lock " + "information.", + err); + return dav_handle_err(r, err, NULL); + } + } + + /* return an appropriate response (HTTP_CREATED or HTTP_NO_CONTENT) */ + return dav_created(r, lookup.rnew->uri, "Destination", + resnew_state == DAV_RESOURCE_EXISTS); +} + +/* dav_method_lock: Handler to implement the DAV LOCK method + * Returns appropriate HTTP_* response. + */ +static int dav_method_lock(request_rec *r) +{ + dav_error *err; + dav_resource *resource; + const dav_hooks_locks *locks_hooks; + int result; + int depth; + int new_lock_request = 0; + apr_xml_doc *doc; + dav_lock *lock; + dav_response *multi_response = NULL; + dav_lockdb *lockdb; + int resource_state; + + /* If no locks provider, decline the request */ + locks_hooks = DAV_GET_HOOKS_LOCKS(r); + if (locks_hooks == NULL) + return DECLINED; + + if ((result = ap_xml_parse_input(r, &doc)) != OK) + return result; + + depth = dav_get_depth(r, DAV_INFINITY); + if (depth != 0 && depth != DAV_INFINITY) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Depth must be 0 or \"infinity\" for LOCK."); + return HTTP_BAD_REQUEST; + } + + /* Ask repository module to resolve the resource */ + err = dav_get_resource(r, 0 /* label_allowed */, 0 /* use_checked_in */, + &resource); + if (err != NULL) + return dav_handle_err(r, err, NULL); + + /* + * Open writable. Unless an error occurs, we'll be + * writing into the database. + */ + if ((err = (*locks_hooks->open_lockdb)(r, 0, 0, &lockdb)) != NULL) { + /* ### add a higher-level description? */ + return dav_handle_err(r, err, NULL); + } + + if (doc != NULL) { + if ((err = dav_lock_parse_lockinfo(r, resource, lockdb, doc, + &lock)) != NULL) { + /* ### add a higher-level description to err? */ + goto error; + } + new_lock_request = 1; + + lock->auth_user = apr_pstrdup(r->pool, r->user); + } + + resource_state = dav_get_resource_state(r, resource); + + /* + * Check If-Headers and existing locks. + * + * If this will create a locknull resource, then the LOCK will affect + * the parent collection (much like a PUT/MKCOL). For that case, we must + * validate the parent resource's conditions. + */ + if ((err = dav_validate_request(r, resource, depth, NULL, &multi_response, + (resource_state == DAV_RESOURCE_NULL + ? DAV_VALIDATE_PARENT + : DAV_VALIDATE_RESOURCE) + | (new_lock_request ? lock->scope : 0) + | DAV_VALIDATE_ADD_LD, + lockdb)) != OK) { + err = dav_push_error(r->pool, err->status, 0, + apr_psprintf(r->pool, + "Could not LOCK %s due to a failed " + "precondition (e.g. other locks).", + ap_escape_html(r->pool, r->uri)), + err); + goto error; + } + + if (new_lock_request == 0) { + dav_locktoken_list *ltl; + + /* + * Refresh request + * ### Assumption: We can renew multiple locks on the same resource + * ### at once. First harvest all the positive lock-tokens given in + * ### the If header. Then modify the lock entries for this resource + * ### with the new Timeout val. + */ + + if ((err = dav_get_locktoken_list(r, <l)) != NULL) { + err = dav_push_error(r->pool, err->status, 0, + apr_psprintf(r->pool, + "The lock refresh for %s failed " + "because no lock tokens were " + "specified in an \"If:\" " + "header.", + ap_escape_html(r->pool, r->uri)), + err); + goto error; + } + + if ((err = (*locks_hooks->refresh_locks)(lockdb, resource, ltl, + dav_get_timeout(r), + &lock)) != NULL) { + /* ### add a higher-level description to err? */ + goto error; + } + } else { + /* New lock request */ + char *locktoken_txt; + dav_dir_conf *conf; + + conf = (dav_dir_conf *)ap_get_module_config(r->per_dir_config, + &dav_module); + + /* apply lower bound (if any) from DAVMinTimeout directive */ + if (lock->timeout != DAV_TIMEOUT_INFINITE + && lock->timeout < time(NULL) + conf->locktimeout) + lock->timeout = time(NULL) + conf->locktimeout; + + err = dav_add_lock(r, resource, lockdb, lock, &multi_response); + if (err != NULL) { + /* ### add a higher-level description to err? */ + goto error; + } + + locktoken_txt = apr_pstrcat(r->pool, "<", + (*locks_hooks->format_locktoken)(r->pool, + lock->locktoken), + ">", NULL); + + apr_table_set(r->headers_out, "Lock-Token", locktoken_txt); + } + + (*locks_hooks->close_lockdb)(lockdb); + + r->status = HTTP_OK; + ap_set_content_type(r, DAV_XML_CONTENT_TYPE); + + ap_rputs(DAV_XML_HEADER DEBUG_CR "" DEBUG_CR, r); + if (lock == NULL) + ap_rputs("" DEBUG_CR, r); + else { + ap_rprintf(r, + "" DEBUG_CR + "%s" DEBUG_CR + "" DEBUG_CR, + dav_lock_get_activelock(r, lock, NULL)); + } + ap_rputs("", r); + + /* the response has been sent. */ + return DONE; + + error: + (*locks_hooks->close_lockdb)(lockdb); + return dav_handle_err(r, err, multi_response); +} + +/* dav_method_unlock: Handler to implement the DAV UNLOCK method + * Returns appropriate HTTP_* response. + */ +static int dav_method_unlock(request_rec *r) +{ + dav_error *err; + dav_resource *resource; + const dav_hooks_locks *locks_hooks; + int result; + const char *const_locktoken_txt; + char *locktoken_txt; + dav_locktoken *locktoken = NULL; + int resource_state; + dav_response *multi_response; + + /* If no locks provider, decline the request */ + locks_hooks = DAV_GET_HOOKS_LOCKS(r); + if (locks_hooks == NULL) + return DECLINED; + + if ((const_locktoken_txt = apr_table_get(r->headers_in, + "Lock-Token")) == NULL) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Unlock failed (%s): " + "No Lock-Token specified in header", r->filename); + return HTTP_BAD_REQUEST; + } + + locktoken_txt = apr_pstrdup(r->pool, const_locktoken_txt); + if (locktoken_txt[0] != '<') { + /* ### should provide more specifics... */ + return HTTP_BAD_REQUEST; + } + locktoken_txt++; + + if (locktoken_txt[strlen(locktoken_txt) - 1] != '>') { + /* ### should provide more specifics... */ + return HTTP_BAD_REQUEST; + } + locktoken_txt[strlen(locktoken_txt) - 1] = '\0'; + + if ((err = (*locks_hooks->parse_locktoken)(r->pool, locktoken_txt, + &locktoken)) != NULL) { + err = dav_push_error(r->pool, HTTP_BAD_REQUEST, 0, + apr_psprintf(r->pool, + "The UNLOCK on %s failed -- an " + "invalid lock token was specified " + "in the \"If:\" header.", + ap_escape_html(r->pool, r->uri)), + err); + return dav_handle_err(r, err, NULL); + } + + /* Ask repository module to resolve the resource */ + err = dav_get_resource(r, 0 /* label_allowed */, 0 /* use_checked_in */, + &resource); + if (err != NULL) + return dav_handle_err(r, err, NULL); + + resource_state = dav_get_resource_state(r, resource); + + /* + * Check If-Headers and existing locks. + * + * Note: depth == 0 normally requires no multistatus response. However, + * if we pass DAV_VALIDATE_PARENT, then we could get an error on a URI + * other than the Request-URI, thereby requiring a multistatus. + * + * If the resource is a locknull resource, then the UNLOCK will affect + * the parent collection (much like a delete). For that case, we must + * validate the parent resource's conditions. + */ + if ((err = dav_validate_request(r, resource, 0, locktoken, + &multi_response, + resource_state == DAV_RESOURCE_LOCK_NULL + ? DAV_VALIDATE_PARENT + : DAV_VALIDATE_RESOURCE, NULL)) != NULL) { + /* ### add a higher-level description? */ + return dav_handle_err(r, err, multi_response); + } + + /* ### RFC 2518 s. 8.11: If this resource is locked by locktoken, + * _all_ resources locked by locktoken are released. It does not say + * resource has to be the root of an infinte lock. Thus, an UNLOCK + * on any part of an infinte lock will remove the lock on all resources. + * + * For us, if r->filename represents an indirect lock (part of an infinity lock), + * we must actually perform an UNLOCK on the direct lock for this resource. + */ + if ((result = dav_unlock(r, resource, locktoken)) != OK) { + return result; + } + + return HTTP_NO_CONTENT; +} + +static int dav_method_vsn_control(request_rec *r) +{ + dav_resource *resource; + int resource_state; + dav_auto_version_info av_info; + const dav_hooks_locks *locks_hooks = DAV_GET_HOOKS_LOCKS(r); + const dav_hooks_vsn *vsn_hooks = DAV_GET_HOOKS_VSN(r); + dav_error *err; + apr_xml_doc *doc; + const char *target = NULL; + int result; + + /* if no versioning provider, decline the request */ + if (vsn_hooks == NULL) + return DECLINED; + + /* ask repository module to resolve the resource */ + err = dav_get_resource(r, 0 /* label_allowed */, 0 /* use_checked_in */, + &resource); + if (err != NULL) + return dav_handle_err(r, err, NULL); + + /* remember the pre-creation resource state */ + resource_state = dav_get_resource_state(r, resource); + + /* parse the request body (may be a version-control element) */ + if ((result = ap_xml_parse_input(r, &doc)) != OK) { + return result; + } + /* note: doc == NULL if no request body */ + + if (doc != NULL) { + const apr_xml_elem *child; + apr_size_t tsize; + + if (!dav_validate_root(doc, "version-control")) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "The request body does not contain " + "a \"version-control\" element."); + return HTTP_BAD_REQUEST; + } + + /* get the version URI */ + if ((child = dav_find_child(doc->root, "version")) == NULL) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "The \"version-control\" element does not contain " + "a \"version\" element."); + return HTTP_BAD_REQUEST; + } + + if ((child = dav_find_child(child, "href")) == NULL) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "The \"version\" element does not contain " + "an \"href\" element."); + return HTTP_BAD_REQUEST; + } + + /* get version URI */ + apr_xml_to_text(r->pool, child, APR_XML_X2T_INNER, NULL, NULL, + &target, &tsize); + if (tsize == 0) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "An \"href\" element does not contain a URI."); + return HTTP_BAD_REQUEST; + } + } + + /* Check request preconditions */ + + /* ### need a general mechanism for reporting precondition violations + * ### (should be returning XML document for 403/409 responses) + */ + + /* if not versioning existing resource, must specify version to select */ + if (!resource->exists && target == NULL) { + err = dav_new_error(r->pool, HTTP_CONFLICT, 0, + ""); + return dav_handle_err(r, err, NULL); + } + else if (resource->exists) { + /* cannot add resource to existing version history */ + if (target != NULL) { + err = dav_new_error(r->pool, HTTP_CONFLICT, 0, + ""); + return dav_handle_err(r, err, NULL); + } + + /* resource must be unversioned and versionable, or version selector */ + if (resource->type != DAV_RESOURCE_TYPE_REGULAR + || (!resource->versioned && !(vsn_hooks->versionable)(resource))) { + err = dav_new_error(r->pool, HTTP_CONFLICT, 0, + ""); + return dav_handle_err(r, err, NULL); + } + + /* the DeltaV spec says if resource is a version selector, + * then VERSION-CONTROL is a no-op + */ + if (resource->versioned) { + /* set the Cache-Control header, per the spec */ + apr_table_setn(r->headers_out, "Cache-Control", "no-cache"); + + /* no body */ + ap_set_content_length(r, 0); + + return DONE; + } + } + + /* Check If-Headers and existing locks */ + /* Note: depth == 0. Implies no need for a multistatus response. */ + if ((err = dav_validate_request(r, resource, 0, NULL, NULL, + resource_state == DAV_RESOURCE_NULL ? + DAV_VALIDATE_PARENT : + DAV_VALIDATE_RESOURCE, NULL)) != NULL) { + return dav_handle_err(r, err, NULL); + } + + /* if in versioned collection, make sure parent is checked out */ + if ((err = dav_auto_checkout(r, resource, 1 /* parent_only */, + &av_info)) != NULL) { + return dav_handle_err(r, err, NULL); + } + + /* attempt to version-control the resource */ + if ((err = (*vsn_hooks->vsn_control)(resource, target)) != NULL) { + dav_auto_checkin(r, resource, 1 /*undo*/, 0 /*unlock*/, &av_info); + err = dav_push_error(r->pool, HTTP_CONFLICT, 0, + apr_psprintf(r->pool, + "Could not VERSION-CONTROL resource %s.", + ap_escape_html(r->pool, r->uri)), + err); + return dav_handle_err(r, err, NULL); + } + + /* revert writability of parent directory */ + err = dav_auto_checkin(r, resource, 0 /*undo*/, 0 /*unlock*/, &av_info); + if (err != NULL) { + /* just log a warning */ + err = dav_push_error(r->pool, err->status, 0, + "The VERSION-CONTROL was successful, but there " + "was a problem automatically checking in " + "the parent collection.", + err); + dav_log_err(r, err, APLOG_WARNING); + } + + /* if the resource is lockable, let lock system know of new resource */ + if (locks_hooks != NULL + && (*locks_hooks->get_supportedlock)(resource) != NULL) { + dav_lockdb *lockdb; + + if ((err = (*locks_hooks->open_lockdb)(r, 0, 0, &lockdb)) != NULL) { + /* The resource creation was successful, but the locking failed. */ + err = dav_push_error(r->pool, err->status, 0, + "The VERSION-CONTROL was successful, but there " + "was a problem opening the lock database " + "which prevents inheriting locks from the " + "parent resources.", + err); + return dav_handle_err(r, err, NULL); + } + + /* notify lock system that we have created/replaced a resource */ + err = dav_notify_created(r, lockdb, resource, resource_state, 0); + + (*locks_hooks->close_lockdb)(lockdb); + + if (err != NULL) { + /* The dir creation was successful, but the locking failed. */ + err = dav_push_error(r->pool, err->status, 0, + "The VERSION-CONTROL was successful, but there " + "was a problem updating its lock " + "information.", + err); + return dav_handle_err(r, err, NULL); + } + } + + /* set the Cache-Control header, per the spec */ + apr_table_setn(r->headers_out, "Cache-Control", "no-cache"); + + /* return an appropriate response (HTTP_CREATED) */ + return dav_created(r, resource->uri, "Version selector", 0 /*replaced*/); +} + +/* handle the CHECKOUT method */ +static int dav_method_checkout(request_rec *r) +{ + dav_resource *resource; + dav_resource *working_resource; + const dav_hooks_vsn *vsn_hooks = DAV_GET_HOOKS_VSN(r); + dav_error *err; + int result; + apr_xml_doc *doc; + int apply_to_vsn = 0; + int is_unreserved = 0; + int is_fork_ok = 0; + int create_activity = 0; + apr_array_header_t *activities = NULL; + + /* If no versioning provider, decline the request */ + if (vsn_hooks == NULL) + return DECLINED; + + if ((result = ap_xml_parse_input(r, &doc)) != OK) + return result; + + if (doc != NULL) { + const apr_xml_elem *aset; + + if (!dav_validate_root(doc, "checkout")) { + /* This supplies additional information for the default msg. */ + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "The request body, if present, must be a " + "DAV:checkout element."); + return HTTP_BAD_REQUEST; + } + + if (dav_find_child(doc->root, "apply-to-version") != NULL) { + if (apr_table_get(r->headers_in, "label") != NULL) { + /* ### we want generic 403/409 XML reporting here */ + /* ### DAV:must-not-have-label-and-apply-to-version */ + return dav_error_response(r, HTTP_CONFLICT, + "DAV:apply-to-version cannot be " + "used in conjunction with a " + "Label header."); + } + apply_to_vsn = 1; + } + + is_unreserved = dav_find_child(doc->root, "unreserved") != NULL; + is_fork_ok = dav_find_child(doc->root, "fork-ok") != NULL; + + if ((aset = dav_find_child(doc->root, "activity-set")) != NULL) { + if (dav_find_child(aset, "new") != NULL) { + create_activity = 1; + } + else { + const apr_xml_elem *child = aset->first_child; + + activities = apr_array_make(r->pool, 1, sizeof(const char *)); + + for (; child != NULL; child = child->next) { + if (child->ns == APR_XML_NS_DAV_ID + && strcmp(child->name, "href") == 0) { + const char *href; + + href = dav_xml_get_cdata(child, r->pool, + 1 /* strip_white */); + *(const char **)apr_array_push(activities) = href; + } + } + + if (activities->nelts == 0) { + /* no href's is a DTD violation: + + */ + + /* This supplies additional info for the default msg. */ + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Within the DAV:activity-set element, the " + "DAV:new element must be used, or at least " + "one DAV:href must be specified."); + return HTTP_BAD_REQUEST; + } + } + } + } + + /* Ask repository module to resolve the resource */ + err = dav_get_resource(r, 1 /*label_allowed*/, apply_to_vsn, &resource); + if (err != NULL) + return dav_handle_err(r, err, NULL); + + if (!resource->exists) { + /* Apache will supply a default error for this. */ + return HTTP_NOT_FOUND; + } + + /* Check the state of the resource: must be a file or collection, + * must be versioned, and must not already be checked out. + */ + if (resource->type != DAV_RESOURCE_TYPE_REGULAR + && resource->type != DAV_RESOURCE_TYPE_VERSION) { + return dav_error_response(r, HTTP_CONFLICT, + "Cannot checkout this type of resource."); + } + + if (!resource->versioned) { + return dav_error_response(r, HTTP_CONFLICT, + "Cannot checkout unversioned resource."); + } + + if (resource->working) { + return dav_error_response(r, HTTP_CONFLICT, + "The resource is already checked out to the workspace."); + } + + /* ### do lock checks, once behavior is defined */ + + /* Do the checkout */ + if ((err = (*vsn_hooks->checkout)(resource, 0 /*auto_checkout*/, + is_unreserved, is_fork_ok, + create_activity, activities, + &working_resource)) != NULL) { + err = dav_push_error(r->pool, HTTP_CONFLICT, 0, + apr_psprintf(r->pool, + "Could not CHECKOUT resource %s.", + ap_escape_html(r->pool, r->uri)), + err); + return dav_handle_err(r, err, NULL); + } + + /* set the Cache-Control header, per the spec */ + apr_table_setn(r->headers_out, "Cache-Control", "no-cache"); + + /* if no working resource created, return OK, + * else return CREATED with working resource URL in Location header + */ + if (working_resource == NULL) { + /* no body */ + ap_set_content_length(r, 0); + return DONE; + } + + return dav_created(r, working_resource->uri, "Checked-out resource", 0); +} + +/* handle the UNCHECKOUT method */ +static int dav_method_uncheckout(request_rec *r) +{ + dav_resource *resource; + const dav_hooks_vsn *vsn_hooks = DAV_GET_HOOKS_VSN(r); + dav_error *err; + int result; + + /* If no versioning provider, decline the request */ + if (vsn_hooks == NULL) + return DECLINED; + + if ((result = ap_discard_request_body(r)) != OK) { + return result; + } + + /* Ask repository module to resolve the resource */ + err = dav_get_resource(r, 0 /* label_allowed */, 0 /* use_checked_in */, + &resource); + if (err != NULL) + return dav_handle_err(r, err, NULL); + + if (!resource->exists) { + /* Apache will supply a default error for this. */ + return HTTP_NOT_FOUND; + } + + /* Check the state of the resource: must be a file or collection, + * must be versioned, and must be checked out. + */ + if (resource->type != DAV_RESOURCE_TYPE_REGULAR) { + return dav_error_response(r, HTTP_CONFLICT, + "Cannot uncheckout this type of resource."); + } + + if (!resource->versioned) { + return dav_error_response(r, HTTP_CONFLICT, + "Cannot uncheckout unversioned resource."); + } + + if (!resource->working) { + return dav_error_response(r, HTTP_CONFLICT, + "The resource is not checked out to the workspace."); + } + + /* ### do lock checks, once behavior is defined */ + + /* Do the uncheckout */ + if ((err = (*vsn_hooks->uncheckout)(resource)) != NULL) { + err = dav_push_error(r->pool, HTTP_CONFLICT, 0, + apr_psprintf(r->pool, + "Could not UNCHECKOUT resource %s.", + ap_escape_html(r->pool, r->uri)), + err); + return dav_handle_err(r, err, NULL); + } + + /* no body */ + ap_set_content_length(r, 0); + + return DONE; +} + +/* handle the CHECKIN method */ +static int dav_method_checkin(request_rec *r) +{ + dav_resource *resource; + dav_resource *new_version; + const dav_hooks_vsn *vsn_hooks = DAV_GET_HOOKS_VSN(r); + dav_error *err; + int result; + apr_xml_doc *doc; + int keep_checked_out = 0; + + /* If no versioning provider, decline the request */ + if (vsn_hooks == NULL) + return DECLINED; + + if ((result = ap_xml_parse_input(r, &doc)) != OK) + return result; + + if (doc != NULL) { + if (!dav_validate_root(doc, "checkin")) { + /* This supplies additional information for the default msg. */ + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "The request body, if present, must be a " + "DAV:checkin element."); + return HTTP_BAD_REQUEST; + } + + keep_checked_out = dav_find_child(doc->root, "keep-checked-out") != NULL; + } + + /* Ask repository module to resolve the resource */ + err = dav_get_resource(r, 0 /* label_allowed */, 0 /* use_checked_in */, + &resource); + if (err != NULL) + return dav_handle_err(r, err, NULL); + + if (!resource->exists) { + /* Apache will supply a default error for this. */ + return HTTP_NOT_FOUND; + } + + /* Check the state of the resource: must be a file or collection, + * must be versioned, and must be checked out. + */ + if (resource->type != DAV_RESOURCE_TYPE_REGULAR) { + return dav_error_response(r, HTTP_CONFLICT, + "Cannot checkin this type of resource."); + } + + if (!resource->versioned) { + return dav_error_response(r, HTTP_CONFLICT, + "Cannot checkin unversioned resource."); + } + + if (!resource->working) { + return dav_error_response(r, HTTP_CONFLICT, + "The resource is not checked out."); + } + + /* ### do lock checks, once behavior is defined */ + + /* Do the checkin */ + if ((err = (*vsn_hooks->checkin)(resource, keep_checked_out, &new_version)) + != NULL) { + err = dav_push_error(r->pool, HTTP_CONFLICT, 0, + apr_psprintf(r->pool, + "Could not CHECKIN resource %s.", + ap_escape_html(r->pool, r->uri)), + err); + return dav_handle_err(r, err, NULL); + } + + return dav_created(r, new_version->uri, "Version", 0); +} + +static int dav_method_update(request_rec *r) +{ + dav_resource *resource; + dav_resource *version = NULL; + const dav_hooks_vsn *vsn_hooks = DAV_GET_HOOKS_VSN(r); + apr_xml_doc *doc; + apr_xml_elem *child; + int is_label = 0; + int depth; + int result; + apr_size_t tsize; + const char *target; + dav_response *multi_response; + dav_error *err; + dav_lookup_result lookup; + + /* If no versioning provider, or UPDATE not supported, + * decline the request */ + if (vsn_hooks == NULL || vsn_hooks->update == NULL) + return DECLINED; + + if ((depth = dav_get_depth(r, 0)) < 0) { + /* dav_get_depth() supplies additional information for the + * default message. */ + return HTTP_BAD_REQUEST; + } + + /* parse the request body */ + if ((result = ap_xml_parse_input(r, &doc)) != OK) { + return result; + } + + if (doc == NULL || !dav_validate_root(doc, "update")) { + /* This supplies additional information for the default message. */ + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "The request body does not contain " + "an \"update\" element."); + return HTTP_BAD_REQUEST; + } + + /* check for label-name or version element, but not both */ + if ((child = dav_find_child(doc->root, "label-name")) != NULL) + is_label = 1; + else if ((child = dav_find_child(doc->root, "version")) != NULL) { + /* get the href element */ + if ((child = dav_find_child(child, "href")) == NULL) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "The version element does not contain " + "an \"href\" element."); + return HTTP_BAD_REQUEST; + } + } + else { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "The \"update\" element does not contain " + "a \"label-name\" or \"version\" element."); + return HTTP_BAD_REQUEST; + } + + /* a depth greater than zero is only allowed for a label */ + if (!is_label && depth != 0) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Depth must be zero for UPDATE with a version"); + return HTTP_BAD_REQUEST; + } + + /* get the target value (a label or a version URI) */ + apr_xml_to_text(r->pool, child, APR_XML_X2T_INNER, NULL, NULL, + &target, &tsize); + if (tsize == 0) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "A \"label-name\" or \"href\" element does not contain " + "any content."); + return HTTP_BAD_REQUEST; + } + + /* Ask repository module to resolve the resource */ + err = dav_get_resource(r, 0 /* label_allowed */, 0 /* use_checked_in */, + &resource); + if (err != NULL) + return dav_handle_err(r, err, NULL); + + if (!resource->exists) { + /* Apache will supply a default error for this. */ + return HTTP_NOT_FOUND; + } + + /* ### need a general mechanism for reporting precondition violations + * ### (should be returning XML document for 403/409 responses) + */ + if (resource->type != DAV_RESOURCE_TYPE_REGULAR + || !resource->versioned || resource->working) { + return dav_error_response(r, HTTP_CONFLICT, + ""); + } + + /* if target is a version, resolve the version resource */ + /* ### dav_lookup_uri only allows absolute URIs; is that OK? */ + if (!is_label) { + lookup = dav_lookup_uri(target, r, 0 /* must_be_absolute */); + if (lookup.rnew == NULL) { + if (lookup.err.status == HTTP_BAD_REQUEST) { + /* This supplies additional information for the default message. */ + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "%s", lookup.err.desc); + return HTTP_BAD_REQUEST; + } + + /* ### this assumes that dav_lookup_uri() only generates a status + * ### that Apache can provide a status line for!! */ + + return dav_error_response(r, lookup.err.status, lookup.err.desc); + } + if (lookup.rnew->status != HTTP_OK) { + /* ### how best to report this... */ + return dav_error_response(r, lookup.rnew->status, + "Version URI had an error."); + } + + /* resolve version resource */ + err = dav_get_resource(lookup.rnew, 0 /* label_allowed */, + 0 /* use_checked_in */, &version); + if (err != NULL) + return dav_handle_err(r, err, NULL); + + /* NULL out target, since we're using a version resource */ + target = NULL; + } + + /* do the UPDATE operation */ + err = (*vsn_hooks->update)(resource, version, target, depth, &multi_response); + + if (err != NULL) { + err = dav_push_error(r->pool, err->status, 0, + apr_psprintf(r->pool, + "Could not UPDATE %s.", + ap_escape_html(r->pool, r->uri)), + err); + return dav_handle_err(r, err, multi_response); + } + + /* set the Cache-Control header, per the spec */ + apr_table_setn(r->headers_out, "Cache-Control", "no-cache"); + + /* no body */ + ap_set_content_length(r, 0); + + return DONE; +} + +/* context maintained during LABEL treewalk */ +typedef struct dav_label_walker_ctx +{ + /* input: */ + dav_walk_params w; + + /* label being manipulated */ + const char *label; + + /* label operation */ + int label_op; +#define DAV_LABEL_ADD 1 +#define DAV_LABEL_SET 2 +#define DAV_LABEL_REMOVE 3 + + /* version provider hooks */ + const dav_hooks_vsn *vsn_hooks; + +} dav_label_walker_ctx; + +static dav_error * dav_label_walker(dav_walk_resource *wres, int calltype) +{ + dav_label_walker_ctx *ctx = wres->walk_ctx; + dav_error *err = NULL; + + /* Check the state of the resource: must be a version or + * non-checkedout version selector + */ + /* ### need a general mechanism for reporting precondition violations + * ### (should be returning XML document for 403/409 responses) + */ + if (wres->resource->type != DAV_RESOURCE_TYPE_VERSION && + (wres->resource->type != DAV_RESOURCE_TYPE_REGULAR + || !wres->resource->versioned)) { + err = dav_new_error(ctx->w.pool, HTTP_CONFLICT, 0, + ""); + } + else if (wres->resource->working) { + err = dav_new_error(ctx->w.pool, HTTP_CONFLICT, 0, + ""); + } + else { + /* do the label operation */ + if (ctx->label_op == DAV_LABEL_REMOVE) + err = (*ctx->vsn_hooks->remove_label)(wres->resource, ctx->label); + else + err = (*ctx->vsn_hooks->add_label)(wres->resource, ctx->label, + ctx->label_op == DAV_LABEL_SET); + } + + if (err != NULL) { + /* ### need utility routine to add response with description? */ + dav_add_response(wres, err->status, NULL); + wres->response->desc = err->desc; + } + + return NULL; +} + +static int dav_method_label(request_rec *r) +{ + dav_resource *resource; + const dav_hooks_vsn *vsn_hooks = DAV_GET_HOOKS_VSN(r); + apr_xml_doc *doc; + apr_xml_elem *child; + int depth; + int result; + apr_size_t tsize; + dav_error *err; + dav_label_walker_ctx ctx = { { 0 } }; + dav_response *multi_status; + + /* If no versioning provider, or the provider doesn't support + * labels, decline the request */ + if (vsn_hooks == NULL || vsn_hooks->add_label == NULL) + return DECLINED; + + /* Ask repository module to resolve the resource */ + err = dav_get_resource(r, 1 /* label_allowed */, 0 /* use_checked_in */, + &resource); + if (err != NULL) + return dav_handle_err(r, err, NULL); + if (!resource->exists) { + /* Apache will supply a default error for this. */ + return HTTP_NOT_FOUND; + } + + if ((depth = dav_get_depth(r, 0)) < 0) { + /* dav_get_depth() supplies additional information for the + * default message. */ + return HTTP_BAD_REQUEST; + } + + /* parse the request body */ + if ((result = ap_xml_parse_input(r, &doc)) != OK) { + return result; + } + + if (doc == NULL || !dav_validate_root(doc, "label")) { + /* This supplies additional information for the default message. */ + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "The request body does not contain " + "a \"label\" element."); + return HTTP_BAD_REQUEST; + } + + /* check for add, set, or remove element */ + if ((child = dav_find_child(doc->root, "add")) != NULL) { + ctx.label_op = DAV_LABEL_ADD; + } + else if ((child = dav_find_child(doc->root, "set")) != NULL) { + ctx.label_op = DAV_LABEL_SET; + } + else if ((child = dav_find_child(doc->root, "remove")) != NULL) { + ctx.label_op = DAV_LABEL_REMOVE; + } + else { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "The \"label\" element does not contain " + "an \"add\", \"set\", or \"remove\" element."); + return HTTP_BAD_REQUEST; + } + + /* get the label string */ + if ((child = dav_find_child(child, "label-name")) == NULL) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "The label command element does not contain " + "a \"label-name\" element."); + return HTTP_BAD_REQUEST; + } + + apr_xml_to_text(r->pool, child, APR_XML_X2T_INNER, NULL, NULL, + &ctx.label, &tsize); + if (tsize == 0) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "A \"label-name\" element does not contain " + "a label name."); + return HTTP_BAD_REQUEST; + } + + /* do the label operation walk */ + ctx.w.walk_type = DAV_WALKTYPE_NORMAL; + ctx.w.func = dav_label_walker; + ctx.w.walk_ctx = &ctx; + ctx.w.pool = r->pool; + ctx.w.root = resource; + ctx.vsn_hooks = vsn_hooks; + + err = (*resource->hooks->walk)(&ctx.w, depth, &multi_status); + + if (err != NULL) { + /* some sort of error occurred which terminated the walk */ + err = dav_push_error(r->pool, err->status, 0, + "The LABEL operation was terminated prematurely.", + err); + return dav_handle_err(r, err, multi_status); + } + + if (multi_status != NULL) { + /* One or more resources had errors. If depth was zero, convert + * response to simple error, else make sure there is an + * overall error to pass to dav_handle_err() + */ + if (depth == 0) { + err = dav_new_error(r->pool, multi_status->status, 0, multi_status->desc); + multi_status = NULL; + } + else { + err = dav_new_error(r->pool, HTTP_MULTI_STATUS, 0, + "Errors occurred during the LABEL operation."); + } + + return dav_handle_err(r, err, multi_status); + } + + /* set the Cache-Control header, per the spec */ + apr_table_setn(r->headers_out, "Cache-Control", "no-cache"); + + /* no body */ + ap_set_content_length(r, 0); + + return DONE; +} + +static int dav_method_report(request_rec *r) +{ + dav_resource *resource; + const dav_hooks_vsn *vsn_hooks = DAV_GET_HOOKS_VSN(r); + int result; + int label_allowed; + apr_xml_doc *doc; + dav_error *err; + + /* If no versioning provider, decline the request */ + if (vsn_hooks == NULL) + return DECLINED; + + if ((result = ap_xml_parse_input(r, &doc)) != OK) + return result; + if (doc == NULL) { + /* This supplies additional information for the default msg. */ + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "The request body must specify a report."); + return HTTP_BAD_REQUEST; + } + + /* Ask repository module to resolve the resource. + * First determine whether a Target-Selector header is allowed + * for this report. + */ + label_allowed = (*vsn_hooks->report_label_header_allowed)(doc); + err = dav_get_resource(r, label_allowed, 0 /* use_checked_in */, + &resource); + if (err != NULL) + return dav_handle_err(r, err, NULL); + + if (!resource->exists) { + /* Apache will supply a default error for this. */ + return HTTP_NOT_FOUND; + } + + /* set up defaults for the report response */ + r->status = HTTP_OK; + ap_set_content_type(r, DAV_XML_CONTENT_TYPE); + + /* run report hook */ + if ((err = (*vsn_hooks->deliver_report)(r, resource, doc, + r->output_filters)) != NULL) { + if (! r->sent_bodyct) + /* No data has been sent to client yet; throw normal error. */ + return dav_handle_err(r, err, NULL); + + /* If an error occurred during the report delivery, there's + basically nothing we can do but abort the connection and + log an error. This is one of the limitations of HTTP; it + needs to "know" the entire status of the response before + generating it, which is just impossible in these streamy + response situations. */ + err = dav_push_error(r->pool, err->status, 0, + "Provider encountered an error while streaming" + " a REPORT response.", err); + dav_log_err(r, err, APLOG_ERR); + r->connection->aborted = 1; + return DONE; + } + + return DONE; +} + +static int dav_method_make_workspace(request_rec *r) +{ + dav_resource *resource; + const dav_hooks_vsn *vsn_hooks = DAV_GET_HOOKS_VSN(r); + dav_error *err; + apr_xml_doc *doc; + int result; + + /* if no versioning provider, or the provider does not support workspaces, + * decline the request + */ + if (vsn_hooks == NULL || vsn_hooks->make_workspace == NULL) + return DECLINED; + + /* ask repository module to resolve the resource */ + err = dav_get_resource(r, 0 /* label_allowed */, 0 /* use_checked_in */, + &resource); + if (err != NULL) + return dav_handle_err(r, err, NULL); + + /* parse the request body (must be a mkworkspace element) */ + if ((result = ap_xml_parse_input(r, &doc)) != OK) { + return result; + } + + if (doc == NULL + || !dav_validate_root(doc, "mkworkspace")) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "The request body does not contain " + "a \"mkworkspace\" element."); + return HTTP_BAD_REQUEST; + } + + /* Check request preconditions */ + + /* ### need a general mechanism for reporting precondition violations + * ### (should be returning XML document for 403/409 responses) + */ + + /* resource must not already exist */ + if (resource->exists) { + err = dav_new_error(r->pool, HTTP_CONFLICT, 0, + ""); + return dav_handle_err(r, err, NULL); + } + + /* ### what about locking? */ + + /* attempt to create the workspace */ + if ((err = (*vsn_hooks->make_workspace)(resource, doc)) != NULL) { + err = dav_push_error(r->pool, err->status, 0, + apr_psprintf(r->pool, + "Could not create workspace %s.", + ap_escape_html(r->pool, r->uri)), + err); + return dav_handle_err(r, err, NULL); + } + + /* set the Cache-Control header, per the spec */ + apr_table_setn(r->headers_out, "Cache-Control", "no-cache"); + + /* return an appropriate response (HTTP_CREATED) */ + return dav_created(r, resource->uri, "Workspace", 0 /*replaced*/); +} + +static int dav_method_make_activity(request_rec *r) +{ + dav_resource *resource; + const dav_hooks_vsn *vsn_hooks = DAV_GET_HOOKS_VSN(r); + dav_error *err; + int result; + + /* if no versioning provider, or the provider does not support activities, + * decline the request + */ + if (vsn_hooks == NULL || vsn_hooks->make_activity == NULL) + return DECLINED; + + /* ask repository module to resolve the resource */ + err = dav_get_resource(r, 0 /* label_allowed */, 0 /* use_checked_in */, + &resource); + if (err != NULL) + return dav_handle_err(r, err, NULL); + + /* MKACTIVITY does not have a defined request body. */ + if ((result = ap_discard_request_body(r)) != OK) { + return result; + } + + /* Check request preconditions */ + + /* ### need a general mechanism for reporting precondition violations + * ### (should be returning XML document for 403/409 responses) + */ + + /* resource must not already exist */ + if (resource->exists) { + err = dav_new_error(r->pool, HTTP_CONFLICT, 0, + ""); + return dav_handle_err(r, err, NULL); + } + + /* the provider must say whether the resource can be created as + an activity, i.e. whether the location is ok. */ + if (vsn_hooks->can_be_activity != NULL + && !(*vsn_hooks->can_be_activity)(resource)) { + err = dav_new_error(r->pool, HTTP_FORBIDDEN, 0, + ""); + return dav_handle_err(r, err, NULL); + } + + /* ### what about locking? */ + + /* attempt to create the activity */ + if ((err = (*vsn_hooks->make_activity)(resource)) != NULL) { + err = dav_push_error(r->pool, err->status, 0, + apr_psprintf(r->pool, + "Could not create activity %s.", + ap_escape_html(r->pool, r->uri)), + err); + return dav_handle_err(r, err, NULL); + } + + /* set the Cache-Control header, per the spec */ + apr_table_setn(r->headers_out, "Cache-Control", "no-cache"); + + /* return an appropriate response (HTTP_CREATED) */ + return dav_created(r, resource->uri, "Activity", 0 /*replaced*/); +} + +static int dav_method_baseline_control(request_rec *r) +{ + /* ### */ + return HTTP_METHOD_NOT_ALLOWED; +} + +static int dav_method_merge(request_rec *r) +{ + dav_resource *resource; + dav_resource *source_resource; + const dav_hooks_vsn *vsn_hooks = DAV_GET_HOOKS_VSN(r); + dav_error *err; + int result; + apr_xml_doc *doc; + apr_xml_elem *source_elem; + apr_xml_elem *href_elem; + apr_xml_elem *prop_elem; + const char *source; + int no_auto_merge; + int no_checkout; + dav_lookup_result lookup; + + /* If no versioning provider, decline the request */ + if (vsn_hooks == NULL) + return DECLINED; + + if ((result = ap_xml_parse_input(r, &doc)) != OK) + return result; + + if (doc == NULL || !dav_validate_root(doc, "merge")) { + /* This supplies additional information for the default msg. */ + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "The request body must be present and must be a " + "DAV:merge element."); + return HTTP_BAD_REQUEST; + } + + if ((source_elem = dav_find_child(doc->root, "source")) == NULL) { + /* This supplies additional information for the default msg. */ + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "The DAV:merge element must contain a DAV:source " + "element."); + return HTTP_BAD_REQUEST; + } + if ((href_elem = dav_find_child(source_elem, "href")) == NULL) { + /* This supplies additional information for the default msg. */ + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "The DAV:source element must contain a DAV:href " + "element."); + return HTTP_BAD_REQUEST; + } + source = dav_xml_get_cdata(href_elem, r->pool, 1 /* strip_white */); + + /* get a subrequest for the source, so that we can get a dav_resource + for that source. */ + lookup = dav_lookup_uri(source, r, 0 /* must_be_absolute */); + if (lookup.rnew == NULL) { + if (lookup.err.status == HTTP_BAD_REQUEST) { + /* This supplies additional information for the default message. */ + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "%s", lookup.err.desc); + return HTTP_BAD_REQUEST; + } + + /* ### this assumes that dav_lookup_uri() only generates a status + * ### that Apache can provide a status line for!! */ + + return dav_error_response(r, lookup.err.status, lookup.err.desc); + } + if (lookup.rnew->status != HTTP_OK) { + /* ### how best to report this... */ + return dav_error_response(r, lookup.rnew->status, + "Merge source URI had an error."); + } + err = dav_get_resource(lookup.rnew, 0 /* label_allowed */, + 0 /* use_checked_in */, &source_resource); + if (err != NULL) + return dav_handle_err(r, err, NULL); + + no_auto_merge = dav_find_child(doc->root, "no-auto-merge") != NULL; + no_checkout = dav_find_child(doc->root, "no-checkout") != NULL; + + prop_elem = dav_find_child(doc->root, "prop"); + + /* ### check RFC. I believe the DAV:merge element may contain any + ### element also allowed within DAV:checkout. need to extract them + ### here, and pass them along. + ### if so, then refactor the CHECKOUT method handling so we can reuse + ### the code. maybe create a structure to hold CHECKOUT parameters + ### which can be passed to the checkout() and merge() hooks. */ + + /* Ask repository module to resolve the resource */ + err = dav_get_resource(r, 0 /* label_allowed */, 0 /* use_checked_in */, + &resource); + if (err != NULL) + return dav_handle_err(r, err, NULL); + if (!resource->exists) { + /* Apache will supply a default error for this. */ + return HTTP_NOT_FOUND; + } + + /* ### check the source and target resources flags/types */ + + /* ### do lock checks, once behavior is defined */ + + /* set the Cache-Control header, per the spec */ + /* ### correct? */ + apr_table_setn(r->headers_out, "Cache-Control", "no-cache"); + + /* Initialize these values for a standard MERGE response. If the MERGE + is going to do something different (i.e. an error), then it must + return a dav_error, and we'll reset these values properly. */ + r->status = HTTP_OK; + ap_set_content_type(r, "text/xml"); + + /* ### should we do any preliminary response generation? probably not, + ### because we may have an error, thus demanding something else in + ### the response body. */ + + /* Do the merge, including any response generation. */ + if ((err = (*vsn_hooks->merge)(resource, source_resource, + no_auto_merge, no_checkout, + prop_elem, + r->output_filters)) != NULL) { + /* ### is err->status the right error here? */ + err = dav_push_error(r->pool, err->status, 0, + apr_psprintf(r->pool, + "Could not MERGE resource \"%s\" " + "into \"%s\".", + ap_escape_html(r->pool, source), + ap_escape_html(r->pool, r->uri)), + err); + return dav_handle_err(r, err, NULL); + } + + /* the response was fully generated by the merge() hook. */ + /* ### urk. does this prevent logging? need to check... */ + return DONE; +} + +static int dav_method_bind(request_rec *r) +{ + dav_resource *resource; + dav_resource *binding; + dav_auto_version_info av_info; + const dav_hooks_binding *binding_hooks = DAV_GET_HOOKS_BINDING(r); + const char *dest; + dav_error *err; + dav_error *err2; + dav_response *multi_response = NULL; + dav_lookup_result lookup; + int overwrite; + + /* If no bindings provider, decline the request */ + if (binding_hooks == NULL) + return DECLINED; + + /* Ask repository module to resolve the resource */ + err = dav_get_resource(r, 0 /* label_allowed */, 0 /* use_checked_in */, + &resource); + if (err != NULL) + return dav_handle_err(r, err, NULL); + + if (!resource->exists) { + /* Apache will supply a default error for this. */ + return HTTP_NOT_FOUND; + } + + /* get the destination URI */ + dest = apr_table_get(r->headers_in, "Destination"); + if (dest == NULL) { + /* This supplies additional information for the default message. */ + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "The request is missing a Destination header."); + return HTTP_BAD_REQUEST; + } + + lookup = dav_lookup_uri(dest, r, 0 /* must_be_absolute */); + if (lookup.rnew == NULL) { + if (lookup.err.status == HTTP_BAD_REQUEST) { + /* This supplies additional information for the default message. */ + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "%s", lookup.err.desc); + return HTTP_BAD_REQUEST; + } + else if (lookup.err.status == HTTP_BAD_GATEWAY) { + /* ### Bindings protocol draft 02 says to return 507 + * ### (Cross Server Binding Forbidden); Apache already defines 507 + * ### as HTTP_INSUFFICIENT_STORAGE. So, for now, we'll return + * ### HTTP_FORBIDDEN + */ + return dav_error_response(r, HTTP_FORBIDDEN, + "Cross server bindings are not " + "allowed by this server."); + } + + /* ### this assumes that dav_lookup_uri() only generates a status + * ### that Apache can provide a status line for!! */ + + return dav_error_response(r, lookup.err.status, lookup.err.desc); + } + if (lookup.rnew->status != HTTP_OK) { + /* ### how best to report this... */ + return dav_error_response(r, lookup.rnew->status, + "Destination URI had an error."); + } + + /* resolve binding resource */ + err = dav_get_resource(lookup.rnew, 0 /* label_allowed */, + 0 /* use_checked_in */, &binding); + if (err != NULL) + return dav_handle_err(r, err, NULL); + + /* are the two resources handled by the same repository? */ + if (resource->hooks != binding->hooks) { + /* ### this message exposes some backend config, but screw it... */ + return dav_error_response(r, HTTP_BAD_GATEWAY, + "Destination URI is handled by a " + "different repository than the source URI. " + "BIND between repositories is not possible."); + } + + /* get and parse the overwrite header value */ + if ((overwrite = dav_get_overwrite(r)) < 0) { + /* dav_get_overwrite() supplies additional information for the + * default message. */ + return HTTP_BAD_REQUEST; + } + + /* quick failure test: if dest exists and overwrite is false. */ + if (binding->exists && !overwrite) { + return dav_error_response(r, HTTP_PRECONDITION_FAILED, + "Destination is not empty and " + "Overwrite is not \"T\""); + } + + /* are the source and destination the same? */ + if ((*resource->hooks->is_same_resource)(resource, binding)) { + return dav_error_response(r, HTTP_FORBIDDEN, + "Source and Destination URIs are the same."); + } + + /* + * Check If-Headers and existing locks for destination. Note that we + * use depth==infinity since the target (hierarchy) will be deleted + * before the move/copy is completed. + * + * Note that we are overwriting the target, which implies a DELETE, so + * we are subject to the error/response rules as a DELETE. Namely, we + * will return a 424 error if any of the validations fail. + * (see dav_method_delete() for more information) + */ + if ((err = dav_validate_request(lookup.rnew, binding, DAV_INFINITY, NULL, + &multi_response, + DAV_VALIDATE_PARENT + | DAV_VALIDATE_USE_424, NULL)) != NULL) { + err = dav_push_error(r->pool, err->status, 0, + apr_psprintf(r->pool, + "Could not BIND %s due to a " + "failed precondition on the " + "destination (e.g. locks).", + ap_escape_html(r->pool, r->uri)), + err); + return dav_handle_err(r, err, multi_response); + } + + /* guard against creating circular bindings */ + if (resource->collection + && (*resource->hooks->is_parent_resource)(resource, binding)) { + return dav_error_response(r, HTTP_FORBIDDEN, + "Source collection contains the Destination."); + } + if (resource->collection + && (*resource->hooks->is_parent_resource)(binding, resource)) { + /* The destination must exist (since it contains the source), and + * a condition above implies Overwrite==T. Obviously, we cannot + * delete the Destination before the BIND, as that would + * delete the Source. + */ + + return dav_error_response(r, HTTP_FORBIDDEN, + "Destination collection contains the Source and " + "Overwrite has been specified."); + } + + /* prepare the destination collection for modification */ + if ((err = dav_auto_checkout(r, binding, 1 /* parent_only */, + &av_info)) != NULL) { + /* could not make destination writable */ + return dav_handle_err(r, err, NULL); + } + + /* If target exists, remove it first (we know Ovewrite must be TRUE). + * Then try to bind to the resource. + */ + if (binding->exists) + err = (*resource->hooks->remove_resource)(binding, &multi_response); + + if (err == NULL) { + err = (*binding_hooks->bind_resource)(resource, binding); + } + + /* restore parent collection states */ + err2 = dav_auto_checkin(r, NULL, + err != NULL /* undo if error */, + 0 /* unlock */, &av_info); + + /* check for error from remove/bind operations */ + if (err != NULL) { + err = dav_push_error(r->pool, err->status, 0, + apr_psprintf(r->pool, + "Could not BIND %s.", + ap_escape_html(r->pool, r->uri)), + err); + return dav_handle_err(r, err, multi_response); + } + + /* check for errors from reverting writability */ + if (err2 != NULL) { + /* just log a warning */ + err = dav_push_error(r->pool, err2->status, 0, + "The BIND was successful, but there was a " + "problem automatically checking in the " + "source parent collection.", + err2); + dav_log_err(r, err, APLOG_WARNING); + } + + /* return an appropriate response (HTTP_CREATED) */ + /* ### spec doesn't say what happens when destination was replaced */ + return dav_created(r, lookup.rnew->uri, "Binding", 0); +} + + +/* + * Response handler for DAV resources + */ +static int dav_handler(request_rec *r) +{ + if (strcmp(r->handler, DAV_HANDLER_NAME) != 0) + return DECLINED; + + /* Reject requests with an unescaped hash character, as these may + * be more destructive than the user intended. */ + if (r->parsed_uri.fragment != NULL) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "buggy client used un-escaped hash in Request-URI"); + return dav_error_response(r, HTTP_BAD_REQUEST, + "The request was invalid: the URI included " + "an un-escaped hash character"); + } + + /* ### do we need to do anything with r->proxyreq ?? */ + + /* + * ### anything else to do here? could another module and/or + * ### config option "take over" the handler here? i.e. how do + * ### we lock down this hierarchy so that we are the ultimate + * ### arbiter? (or do we simply depend on the administrator + * ### to avoid conflicting configurations?) + */ + + /* + * Set up the methods mask, since that's one of the reasons this handler + * gets called, and lower-level things may need the info. + * + * First, set the mask to the methods we handle directly. Since by + * definition we own our managed space, we unconditionally set + * the r->allowed field rather than ORing our values with anything + * any other module may have put in there. + * + * These are the HTTP-defined methods that we handle directly. + */ + r->allowed = 0 + | (AP_METHOD_BIT << M_GET) + | (AP_METHOD_BIT << M_PUT) + | (AP_METHOD_BIT << M_DELETE) + | (AP_METHOD_BIT << M_OPTIONS) + | (AP_METHOD_BIT << M_INVALID); + + /* + * These are the DAV methods we handle. + */ + r->allowed |= 0 + | (AP_METHOD_BIT << M_COPY) + | (AP_METHOD_BIT << M_LOCK) + | (AP_METHOD_BIT << M_UNLOCK) + | (AP_METHOD_BIT << M_MKCOL) + | (AP_METHOD_BIT << M_MOVE) + | (AP_METHOD_BIT << M_PROPFIND) + | (AP_METHOD_BIT << M_PROPPATCH); + + /* + * These are methods that we don't handle directly, but let the + * server's default handler do for us as our agent. + */ + r->allowed |= 0 + | (AP_METHOD_BIT << M_POST); + + /* ### hrm. if we return HTTP_METHOD_NOT_ALLOWED, then an Allow header + * ### is sent; it will need the other allowed states; since the default + * ### handler is not called on error, then it doesn't add the other + * ### allowed states, so we must + */ + + /* ### we might need to refine this for just where we return the error. + * ### also, there is the issue with other methods (see ISSUES) + */ + + /* dispatch the appropriate method handler */ + if (r->method_number == M_GET) { + return dav_method_get(r); + } + + if (r->method_number == M_PUT) { + return dav_method_put(r); + } + + if (r->method_number == M_POST) { + return dav_method_post(r); + } + + if (r->method_number == M_DELETE) { + return dav_method_delete(r); + } + + if (r->method_number == M_OPTIONS) { + return dav_method_options(r); + } + + if (r->method_number == M_PROPFIND) { + return dav_method_propfind(r); + } + + if (r->method_number == M_PROPPATCH) { + return dav_method_proppatch(r); + } + + if (r->method_number == M_MKCOL) { + return dav_method_mkcol(r); + } + + if (r->method_number == M_COPY) { + return dav_method_copymove(r, DAV_DO_COPY); + } + + if (r->method_number == M_MOVE) { + return dav_method_copymove(r, DAV_DO_MOVE); + } + + if (r->method_number == M_LOCK) { + return dav_method_lock(r); + } + + if (r->method_number == M_UNLOCK) { + return dav_method_unlock(r); + } + + if (r->method_number == M_VERSION_CONTROL) { + return dav_method_vsn_control(r); + } + + if (r->method_number == M_CHECKOUT) { + return dav_method_checkout(r); + } + + if (r->method_number == M_UNCHECKOUT) { + return dav_method_uncheckout(r); + } + + if (r->method_number == M_CHECKIN) { + return dav_method_checkin(r); + } + + if (r->method_number == M_UPDATE) { + return dav_method_update(r); + } + + if (r->method_number == M_LABEL) { + return dav_method_label(r); + } + + if (r->method_number == M_REPORT) { + return dav_method_report(r); + } + + if (r->method_number == M_MKWORKSPACE) { + return dav_method_make_workspace(r); + } + + if (r->method_number == M_MKACTIVITY) { + return dav_method_make_activity(r); + } + + if (r->method_number == M_BASELINE_CONTROL) { + return dav_method_baseline_control(r); + } + + if (r->method_number == M_MERGE) { + return dav_method_merge(r); + } + + /* BIND method */ + if (r->method_number == dav_methods[DAV_M_BIND]) { + return dav_method_bind(r); + } + + /* DASL method */ + if (r->method_number == dav_methods[DAV_M_SEARCH]) { + return dav_method_search(r); + } + + /* ### add'l methods for Advanced Collections, ACLs */ + + return DECLINED; +} + +static int dav_fixups(request_rec *r) +{ + dav_dir_conf *conf; + + /* quickly ignore any HTTP/0.9 requests which aren't subreqs. */ + if (r->assbackwards && !r->main) { + return DECLINED; + } + + conf = (dav_dir_conf *)ap_get_module_config(r->per_dir_config, + &dav_module); + + /* if DAV is not enabled, then we've got nothing to do */ + if (conf->provider == NULL) { + return DECLINED; + } + + /* We are going to handle almost every request. In certain cases, + the provider maps to the filesystem (thus, handle_get is + FALSE), and core Apache will handle it. a For that case, we + just return right away. */ + if (r->method_number == M_GET) { + /* + * ### need some work to pull Content-Type and Content-Language + * ### from the property database. + */ + + /* + * If the repository hasn't indicated that it will handle the + * GET method, then just punt. + * + * ### this isn't quite right... taking over the response can break + * ### things like mod_negotiation. need to look into this some more. + */ + if (!conf->provider->repos->handle_get) { + return DECLINED; + } + } + + /* ### this is wrong. We should only be setting the r->handler for the + * requests that mod_dav knows about. If we set the handler for M_POST + * requests, then CGI scripts that use POST will return the source for the + * script. However, mod_dav DOES handle POST, so something else needs + * to be fixed. + */ + if (r->method_number != M_POST) { + + /* We are going to be handling the response for this resource. */ + r->handler = DAV_HANDLER_NAME; + return OK; + } + + return DECLINED; +} + +static void register_hooks(apr_pool_t *p) +{ + ap_hook_handler(dav_handler, NULL, NULL, APR_HOOK_MIDDLE); + ap_hook_post_config(dav_init_handler, NULL, NULL, APR_HOOK_MIDDLE); + ap_hook_fixups(dav_fixups, NULL, NULL, APR_HOOK_MIDDLE); + + dav_hook_find_liveprop(dav_core_find_liveprop, NULL, NULL, APR_HOOK_LAST); + dav_hook_insert_all_liveprops(dav_core_insert_all_liveprops, + NULL, NULL, APR_HOOK_MIDDLE); + + dav_core_register_uris(p); +} + +/*--------------------------------------------------------------------------- + * + * Configuration info for the module + */ + +static const command_rec dav_cmds[] = +{ + /* per directory/location */ + AP_INIT_TAKE1("DAV", dav_cmd_dav, NULL, ACCESS_CONF, + "specify the DAV provider for a directory or location"), + + /* per directory/location, or per server */ + AP_INIT_TAKE1("DAVMinTimeout", dav_cmd_davmintimeout, NULL, + ACCESS_CONF|RSRC_CONF, + "specify minimum allowed timeout"), + + /* per directory/location, or per server */ + AP_INIT_FLAG("DAVDepthInfinity", dav_cmd_davdepthinfinity, NULL, + ACCESS_CONF|RSRC_CONF, + "allow Depth infinity PROPFIND requests"), + + { NULL } +}; + +module DAV_DECLARE_DATA dav_module = +{ + STANDARD20_MODULE_STUFF, + dav_create_dir_config, /* dir config creater */ + dav_merge_dir_config, /* dir merger --- default is to override */ + dav_create_server_config, /* server config */ + dav_merge_server_config, /* merge server config */ + dav_cmds, /* command table */ + register_hooks, /* register hooks */ +}; + +APR_HOOK_STRUCT( + APR_HOOK_LINK(gather_propsets) + APR_HOOK_LINK(find_liveprop) + APR_HOOK_LINK(insert_all_liveprops) + ) + +APR_IMPLEMENT_EXTERNAL_HOOK_VOID(dav, DAV, gather_propsets, + (apr_array_header_t *uris), + (uris)) + +APR_IMPLEMENT_EXTERNAL_HOOK_RUN_FIRST(dav, DAV, int, find_liveprop, + (const dav_resource *resource, + const char *ns_uri, const char *name, + const dav_hooks_liveprop **hooks), + (resource, ns_uri, name, hooks), 0) + +APR_IMPLEMENT_EXTERNAL_HOOK_VOID(dav, DAV, insert_all_liveprops, + (request_rec *r, const dav_resource *resource, + dav_prop_insert what, apr_text_header *phdr), + (r, resource, what, phdr)) diff --git a/rubbos/app/httpd-2.0.64/modules/dav/main/mod_dav.dsp b/rubbos/app/httpd-2.0.64/modules/dav/main/mod_dav.dsp new file mode 100644 index 00000000..38972a11 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/dav/main/mod_dav.dsp @@ -0,0 +1,164 @@ +# Microsoft Developer Studio Project File - Name="mod_dav" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=mod_dav - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "mod_dav.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 "mod_dav.mak" CFG="mod_dav - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "mod_dav - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_dav - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "mod_dav - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../../../include" /I "../../../srclib/apr/include" /I "../../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "DAV_DECLARE_EXPORT" /Fd"Release\mod_dav_src" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib ws2_32.lib mswsock.lib /nologo /subsystem:windows /dll /out:"Release/mod_dav.so" /base:@..\..\..\os\win32\BaseAddr.ref,mod_dav.so +# ADD LINK32 kernel32.lib ws2_32.lib mswsock.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Release/mod_dav.so" /base:@..\..\..\os\win32\BaseAddr.ref,mod_dav.so /opt:ref + +!ELSEIF "$(CFG)" == "mod_dav - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../../../include" /I "../../../srclib/apr/include" /I "../../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "DAV_DECLARE_EXPORT" /Fd"Debug\mod_dav_src" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib ws2_32.lib mswsock.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_dav.so" /base:@..\..\..\os\win32\BaseAddr.ref,mod_dav.so +# ADD LINK32 kernel32.lib ws2_32.lib mswsock.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_dav.so" /base:@..\..\..\os\win32\BaseAddr.ref,mod_dav.so + +!ENDIF + +# Begin Target + +# Name "mod_dav - Win32 Release" +# Name "mod_dav - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;hpj;bat;for;f90" +# Begin Source File + +SOURCE=.\liveprop.c +# End Source File +# Begin Source File + +SOURCE=.\mod_dav.c +# End Source File +# Begin Source File + +SOURCE=.\props.c +# End Source File +# Begin Source File + +SOURCE=.\providers.c +# End Source File +# Begin Source File + +SOURCE=.\std_liveprop.c +# End Source File +# Begin Source File + +SOURCE=.\util.c +# End Source File +# Begin Source File + +SOURCE=.\util_lock.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl;fi;fd" +# Begin Source File + +SOURCE=.\mod_dav.h +# End Source File +# End Group +# Begin Source File + +SOURCE=.\mod_dav.rc +# End Source File +# Begin Source File + +SOURCE=..\..\..\build\win32\win32ver.awk + +!IF "$(CFG)" == "mod_dav - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\..\build\win32\win32ver.awk + +".\mod_dav.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../../build/win32/win32ver.awk mod_dav.so "dav_module for Apache" ../../../include/ap_release.h > .\mod_dav.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "mod_dav - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\..\build\win32\win32ver.awk + +".\mod_dav.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../../build/win32/win32ver.awk mod_dav.so "dav_module for Apache" ../../../include/ap_release.h > .\mod_dav.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/modules/dav/main/mod_dav.h b/rubbos/app/httpd-2.0.64/modules/dav/main/mod_dav.h new file mode 100644 index 00000000..0fb9ac9b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/dav/main/mod_dav.h @@ -0,0 +1,2420 @@ +/* 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. + */ + +/* +** DAV extension module for Apache 2.0.* +*/ + +#ifndef _MOD_DAV_H_ +#define _MOD_DAV_H_ + +#include "apr_hooks.h" +#include "apr_hash.h" +#include "apr_dbm.h" +#include "apr_tables.h" + +#include "httpd.h" +#include "util_filter.h" +#include "util_xml.h" + +#include /* for INT_MAX */ +#include /* for time_t */ + +#ifdef __cplusplus +extern "C" { +#endif + + +#define DAV_VERSION AP_SERVER_BASEREVISION + +#define DAV_XML_HEADER "" +#define DAV_XML_CONTENT_TYPE "text/xml; charset=\"utf-8\"" + +#define DAV_READ_BLOCKSIZE 2048 /* used for reading input blocks */ + +#define DAV_RESPONSE_BODY_1 "\n\n" +#define DAV_RESPONSE_BODY_2 "\n\n

    " +#define DAV_RESPONSE_BODY_3 "

    \n

    " +#define DAV_RESPONSE_BODY_4 "

    \n" +#define DAV_RESPONSE_BODY_5 "\n" + +#define DAV_DO_COPY 0 +#define DAV_DO_MOVE 1 + + +#if 1 +#define DAV_DEBUG 1 +#define DEBUG_CR "\n" +#define DBG0(f) ap_log_error(APLOG_MARK, \ + APLOG_ERR, 0, NULL, (f)) +#define DBG1(f,a1) ap_log_error(APLOG_MARK, \ + APLOG_ERR, 0, NULL, f, a1) +#define DBG2(f,a1,a2) ap_log_error(APLOG_MARK, \ + APLOG_ERR, 0, NULL, f, a1, a2) +#define DBG3(f,a1,a2,a3) ap_log_error(APLOG_MARK, \ + APLOG_ERR, 0, NULL, f, a1, a2, a3) +#else +#undef DAV_DEBUG +#define DEBUG_CR "" +#endif + +#define DAV_INFINITY INT_MAX /* for the Depth: header */ + +/* Create a set of DAV_DECLARE(type), DAV_DECLARE_NONSTD(type) and + * DAV_DECLARE_DATA with appropriate export and import tags for the platform + */ +#if !defined(WIN32) +#define DAV_DECLARE(type) type +#define DAV_DECLARE_NONSTD(type) type +#define DAV_DECLARE_DATA +#elif defined(DAV_DECLARE_STATIC) +#define DAV_DECLARE(type) type __stdcall +#define DAV_DECLARE_NONSTD(type) type +#define DAV_DECLARE_DATA +#elif defined(DAV_DECLARE_EXPORT) +#define DAV_DECLARE(type) __declspec(dllexport) type __stdcall +#define DAV_DECLARE_NONSTD(type) __declspec(dllexport) type +#define DAV_DECLARE_DATA __declspec(dllexport) +#else +#define DAV_DECLARE(type) __declspec(dllimport) type __stdcall +#define DAV_DECLARE_NONSTD(type) __declspec(dllimport) type +#define DAV_DECLARE_DATA __declspec(dllimport) +#endif + +/* -------------------------------------------------------------------- +** +** ERROR MANAGEMENT +*/ + +/* +** dav_error structure. +** +** In most cases, mod_dav uses a pointer to a dav_error structure. If the +** pointer is NULL, then no error has occurred. +** +** In certain cases, a dav_error structure is directly used. In these cases, +** a status value of 0 means that an error has not occurred. +** +** Note: this implies that status != 0 whenever an error occurs. +** +** The desc field is optional (it may be NULL). When NULL, it typically +** implies that Apache has a proper description for the specified status. +*/ +typedef struct dav_error { + int status; /* suggested HTTP status (0 for no error) */ + int error_id; /* DAV-specific error ID */ + const char *desc; /* DAV:responsedescription and error log */ + + int save_errno; /* copy of errno causing the error */ + + const char *namespace; /* [optional] namespace of error */ + const char *tagname; /* name of error-tag */ + + struct dav_error *prev; /* previous error (in stack) */ + +} dav_error; + +/* +** Create a new error structure. save_errno will be filled with the current +** errno value. +*/ +DAV_DECLARE(dav_error*) dav_new_error(apr_pool_t *p, int status, + int error_id, const char *desc); + + +/* +** Create a new error structure with tagname and (optional) namespace; +** namespace may be NULL, which means "DAV:". save_errno will be +** filled with the current errno value. +*/ +DAV_DECLARE(dav_error*) dav_new_error_tag(apr_pool_t *p, int status, + int error_id, const char *desc, + const char *namespace, + const char *tagname); + + +/* +** Push a new error description onto the stack of errors. +** +** This function is used to provide an additional description to an existing +** error. +** +** should contain the caller's view of what the current status is, +** given the underlying error. If it doesn't have a better idea, then the +** caller should pass prev->status. +** +** can specify a new error_id since the topmost description has +** changed. +*/ +DAV_DECLARE(dav_error*) dav_push_error(apr_pool_t *p, int status, int error_id, + const char *desc, dav_error *prev); + + +/* error ID values... */ + +/* IF: header errors */ +#define DAV_ERR_IF_PARSE 100 /* general parsing error */ +#define DAV_ERR_IF_MULTIPLE_NOT 101 /* multiple "Not" found */ +#define DAV_ERR_IF_UNK_CHAR 102 /* unknown char in header */ +#define DAV_ERR_IF_ABSENT 103 /* no locktokens given */ +#define DAV_ERR_IF_TAGGED 104 /* in parsing tagged-list */ +#define DAV_ERR_IF_UNCLOSED_PAREN 105 /* in no-tagged-list */ + +/* Prop DB errors */ +#define DAV_ERR_PROP_BAD_MAJOR 200 /* major version was wrong */ +#define DAV_ERR_PROP_READONLY 201 /* prop is read-only */ +#define DAV_ERR_PROP_NO_DATABASE 202 /* writable db not avail */ +#define DAV_ERR_PROP_NOT_FOUND 203 /* prop not found */ +#define DAV_ERR_PROP_BAD_LOCKDB 204 /* could not open lockdb */ +#define DAV_ERR_PROP_OPENING 205 /* problem opening propdb */ +#define DAV_ERR_PROP_EXEC 206 /* problem exec'ing patch */ + +/* Predefined DB errors */ +/* ### any to define?? */ + +/* Predefined locking system errors */ +#define DAV_ERR_LOCK_OPENDB 400 /* could not open lockdb */ +#define DAV_ERR_LOCK_NO_DB 401 /* no database defined */ +#define DAV_ERR_LOCK_CORRUPT_DB 402 /* DB is corrupt */ +#define DAV_ERR_LOCK_UNK_STATE_TOKEN 403 /* unknown State-token */ +#define DAV_ERR_LOCK_PARSE_TOKEN 404 /* bad opaquelocktoken */ +#define DAV_ERR_LOCK_SAVE_LOCK 405 /* err saving locks */ + +/* +** Some comments on Error ID values: +** +** The numbers do not necessarily need to be unique. Uniqueness simply means +** that two errors that have not been predefined above can be distinguished +** from each other. At the moment, mod_dav does not use this distinguishing +** feature, but it could be used in the future to collapse elements +** into groups based on the error ID (and associated responsedescription). +** +** If a compute_desc is provided, then the error ID should be unique within +** the context of the compute_desc function (so the function can figure out +** what to filled into the desc). +** +** Basically, subsystems can ignore defining new error ID values if they want +** to. The subsystems *do* need to return the predefined errors when +** appropriate, so that mod_dav can figure out what to do. Subsystems can +** simply leave the error ID field unfilled (zero) if there isn't an error +** that must be placed there. +*/ + + +/* -------------------------------------------------------------------- +** +** HOOK STRUCTURES +** +** These are here for forward-declaration purposes. For more info, see +** the section title "HOOK HANDLING" for more information, plus each +** structure definition. +*/ + +/* forward-declare this structure */ +typedef struct dav_hooks_propdb dav_hooks_propdb; +typedef struct dav_hooks_locks dav_hooks_locks; +typedef struct dav_hooks_vsn dav_hooks_vsn; +typedef struct dav_hooks_repository dav_hooks_repository; +typedef struct dav_hooks_liveprop dav_hooks_liveprop; +typedef struct dav_hooks_binding dav_hooks_binding; +typedef struct dav_hooks_search dav_hooks_search; + +/* ### deprecated name */ +typedef dav_hooks_propdb dav_hooks_db; + + +/* -------------------------------------------------------------------- +** +** RESOURCE HANDLING +*/ + +/* +** Resource Types: +** The base protocol defines only file and collection resources. +** The versioning protocol defines several additional resource types +** to represent artifacts of a version control system. +** +** This enumeration identifies the type of URL used to identify the +** resource. Since the same resource may have more than one type of +** URL which can identify it, dav_resource_type cannot be used +** alone to determine the type of the resource; attributes of the +** dav_resource object must also be consulted. +*/ +typedef enum { + DAV_RESOURCE_TYPE_UNKNOWN, + + DAV_RESOURCE_TYPE_REGULAR, /* file or collection; could be + * unversioned, or version selector, + * or baseline selector */ + + DAV_RESOURCE_TYPE_VERSION, /* version or baseline URL */ + + DAV_RESOURCE_TYPE_HISTORY, /* version or baseline history URL */ + + DAV_RESOURCE_TYPE_WORKING, /* working resource URL */ + + DAV_RESOURCE_TYPE_WORKSPACE, /* workspace URL */ + + DAV_RESOURCE_TYPE_ACTIVITY, /* activity URL */ + + DAV_RESOURCE_TYPE_PRIVATE /* repository-private type */ + +} dav_resource_type; + +/* +** Opaque, repository-specific information for a resource. +*/ +typedef struct dav_resource_private dav_resource_private; + +/* +** Resource descriptor, generated by a repository provider. +** +** Note: the lock-null state is not explicitly represented here, +** since it may be expensive to compute. Use dav_get_resource_state() +** to determine whether a non-existent resource is a lock-null resource. +** +** A quick explanation of how the flags can apply to different resources: +** +** unversioned file or collection: +** type = DAV_RESOURCE_TYPE_REGULAR +** exists = ? (1 if exists) +** collection = ? (1 if collection) +** versioned = 0 +** baselined = 0 +** working = 0 +** +** version-controlled resource or configuration: +** type = DAV_RESOURCE_TYPE_REGULAR +** exists = 1 +** collection = ? (1 if collection) +** versioned = 1 +** baselined = ? (1 if configuration) +** working = ? (1 if checked out) +** +** version/baseline history: +** type = DAV_RESOURCE_TYPE_HISTORY +** exists = 1 +** collection = 0 +** versioned = 0 +** baselined = 0 +** working = 0 +** +** version/baseline: +** type = DAV_RESOURCE_TYPE_VERSION +** exists = 1 +** collection = ? (1 if collection) +** versioned = 1 +** baselined = ? (1 if baseline) +** working = 0 +** +** working resource: +** type = DAV_RESOURCE_TYPE_WORKING +** exists = 1 +** collection = ? (1 if collection) +** versioned = 1 +** baselined = 0 +** working = 1 +** +** workspace: +** type = DAV_RESOURCE_TYPE_WORKSPACE +** exists = ? (1 if exists) +** collection = 1 +** versioned = ? (1 if version-controlled) +** baselined = ? (1 if baseline-controlled) +** working = ? (1 if checked out) +** +** activity: +** type = DAV_RESOURCE_TYPE_ACTIVITY +** exists = ? (1 if exists) +** collection = 0 +** versioned = 0 +** baselined = 0 +** working = 0 +*/ +typedef struct dav_resource { + dav_resource_type type; + + int exists; /* 0 => null resource */ + + int collection; /* 0 => file; can be 1 for + * REGULAR, VERSION, and WORKING resources, + * and is always 1 for WORKSPACE */ + + int versioned; /* 0 => unversioned; can be 1 for + * REGULAR and WORKSPACE resources, + * and is always 1 for VERSION and WORKING */ + + int baselined; /* 0 => not baselined; can be 1 for + * REGULAR, VERSION, and WORKSPACE resources; + * versioned == 1 when baselined == 1 */ + + int working; /* 0 => not checked out; can be 1 for + * REGULAR and WORKSPACE resources, + * and is always 1 for WORKING */ + + const char *uri; /* the URI for this resource */ + + dav_resource_private *info; /* the provider's private info */ + + const dav_hooks_repository *hooks; /* hooks used for this resource */ + + /* When allocating items related specifically to this resource, the + following pool should be used. Its lifetime will be at least as + long as the dav_resource structure. */ + apr_pool_t *pool; + +} dav_resource; + +/* +** Lock token type. Lock providers define the details of a lock token. +** However, all providers are expected to at least be able to parse +** the "opaquelocktoken" scheme, which is represented by a uuid_t. +*/ +typedef struct dav_locktoken dav_locktoken; + + +/* -------------------------------------------------------------------- +** +** BUFFER HANDLING +** +** These buffers are used as a lightweight buffer reuse mechanism. Apache +** provides sub-pool creation and destruction to much the same effect, but +** the sub-pools are a bit more general and heavyweight than these buffers. +*/ + +/* buffer for reuse; can grow to accomodate needed size */ +typedef struct +{ + apr_size_t alloc_len; /* how much has been allocated */ + apr_size_t cur_len; /* how much is currently being used */ + char *buf; /* buffer contents */ +} dav_buffer; +#define DAV_BUFFER_MINSIZE 256 /* minimum size for buffer */ +#define DAV_BUFFER_PAD 64 /* amount of pad when growing */ + +/* set the cur_len to the given size and ensure space is available */ +DAV_DECLARE(void) dav_set_bufsize(apr_pool_t *p, dav_buffer *pbuf, + apr_size_t size); + +/* initialize a buffer and copy the specified (null-term'd) string into it */ +DAV_DECLARE(void) dav_buffer_init(apr_pool_t *p, dav_buffer *pbuf, + const char *str); + +/* check that the buffer can accomodate more bytes */ +DAV_DECLARE(void) dav_check_bufsize(apr_pool_t *p, dav_buffer *pbuf, + apr_size_t extra_needed); + +/* append a string to the end of the buffer, adjust length */ +DAV_DECLARE(void) dav_buffer_append(apr_pool_t *p, dav_buffer *pbuf, + const char *str); + +/* place a string on the end of the buffer, do NOT adjust length */ +DAV_DECLARE(void) dav_buffer_place(apr_pool_t *p, dav_buffer *pbuf, + const char *str); + +/* place some memory on the end of a buffer; do NOT adjust length */ +DAV_DECLARE(void) dav_buffer_place_mem(apr_pool_t *p, dav_buffer *pbuf, + const void *mem, apr_size_t amt, + apr_size_t pad); + + +/* -------------------------------------------------------------------- +** +** HANDY UTILITIES +*/ + +/* contains results from one of the getprop functions */ +typedef struct +{ + apr_text * propstats; /* element text */ + apr_text * xmlns; /* namespace decls for elem */ +} dav_get_props_result; + +/* holds the contents of a element */ +typedef struct dav_response +{ + const char *href; /* always */ + const char *desc; /* optional description at level */ + + /* use status if propresult.propstats is NULL. */ + dav_get_props_result propresult; + + int status; + + struct dav_response *next; +} dav_response; + +typedef struct +{ + request_rec *rnew; /* new subrequest */ + dav_error err; /* potential error response */ +} dav_lookup_result; + + +DAV_DECLARE(dav_lookup_result) dav_lookup_uri(const char *uri, request_rec *r, + int must_be_absolute); + +/* defines type of property info a provider is to return */ +typedef enum { + DAV_PROP_INSERT_NOTDEF, /* property is defined by this provider, + but nothing was inserted because the + (live) property is not defined for this + resource (it may be present as a dead + property). */ + DAV_PROP_INSERT_NOTSUPP, /* property is recognized by this provider, + but it is not supported, and cannot be + treated as a dead property */ + DAV_PROP_INSERT_NAME, /* a property name (empty elem) was + inserted into the text block */ + DAV_PROP_INSERT_VALUE, /* a property name/value pair was inserted + into the text block */ + DAV_PROP_INSERT_SUPPORTED /* a supported live property was added to + the text block as a + element */ +} dav_prop_insert; + +/* ### this stuff is private to dav/fs/repos.c; move it... */ +/* format a time string (buf must be at least DAV_TIMEBUF_SIZE chars) */ +#define DAV_STYLE_ISO8601 1 +#define DAV_STYLE_RFC822 2 +#define DAV_TIMEBUF_SIZE 30 + +DAV_DECLARE(int) dav_get_depth(request_rec *r, int def_depth); + +DAV_DECLARE(int) dav_validate_root(const apr_xml_doc *doc, + const char *tagname); +DAV_DECLARE(apr_xml_elem *) dav_find_child(const apr_xml_elem *elem, + const char *tagname); + +/* gather up all the CDATA into a single string */ +DAV_DECLARE(const char *) dav_xml_get_cdata(const apr_xml_elem *elem, apr_pool_t *pool, + int strip_white); + +/* +** XML namespace handling +** +** This structure tracks namespace declarations (xmlns:prefix="URI"). +** It maintains a one-to-many relationship of URIs-to-prefixes. In other +** words, one URI may be defined by many prefixes, but any specific +** prefix will specify only one URI. +** +** Prefixes using the "g###" pattern can be generated automatically if +** the caller does not have specific prefix requirements. +*/ +typedef struct { + apr_pool_t *pool; + apr_hash_t *uri_prefix; /* map URIs to an available prefix */ + apr_hash_t *prefix_uri; /* map all prefixes to their URIs */ + int count; /* counter for "g###" prefixes */ +} dav_xmlns_info; + +/* create an empty dav_xmlns_info structure */ +DAV_DECLARE(dav_xmlns_info *) dav_xmlns_create(apr_pool_t *pool); + +/* add a specific prefix/URI pair. the prefix/uri should have a lifetime + at least that of xmlns->pool */ +DAV_DECLARE(void) dav_xmlns_add(dav_xmlns_info *xi, + const char *prefix, const char *uri); + +/* add a URI (if not present); any prefix is acceptable and is returned. + the uri should have a lifetime at least that xmlns->pool */ +DAV_DECLARE(const char *) dav_xmlns_add_uri(dav_xmlns_info *xi, + const char *uri); + +/* return the URI for a specified prefix (or NULL if the prefix is unknown) */ +DAV_DECLARE(const char *) dav_xmlns_get_uri(dav_xmlns_info *xi, + const char *prefix); + +/* return an available prefix for a specified URI (or NULL if the URI + is unknown) */ +DAV_DECLARE(const char *) dav_xmlns_get_prefix(dav_xmlns_info *xi, + const char *uri); + +/* generate xmlns declarations (appending into the given text) */ +DAV_DECLARE(void) dav_xmlns_generate(dav_xmlns_info *xi, + apr_text_header *phdr); + +/* -------------------------------------------------------------------- +** +** DAV PLUGINS +*/ + +/* ### docco ... */ + +/* +** dav_provider +** +** This structure wraps up all of the hooks that a mod_dav provider can +** supply. The provider MUST supply and . The rest are +** optional and should contain NULL if that feature is not supplied. +** +** Note that a provider cannot pick and choose portions from various +** underlying implementations (which was theoretically possible in +** mod_dav 1.0). There are too many dependencies between a dav_resource +** (defined by ) and the other functionality. +** +** Live properties are not part of the dav_provider structure because they +** are handled through the APR_HOOK interface (to allow for multiple liveprop +** providers). The core always provides some properties, and then a given +** provider will add more properties. +** +** Some providers may need to associate a context with the dav_provider +** structure -- the ctx field is available for storing this context. Just +** leave it NULL if it isn't required. +*/ +typedef struct { + const dav_hooks_repository *repos; + const dav_hooks_propdb *propdb; + const dav_hooks_locks *locks; + const dav_hooks_vsn *vsn; + const dav_hooks_binding *binding; + const dav_hooks_search *search; + + void *ctx; +} dav_provider; + +/* +** gather_propsets: gather all live property propset-URIs +** +** The hook implementor should push one or more URIs into the specified +** array. These URIs are returned in the DAV: header to let clients know +** what sets of live properties are supported by the installation. mod_dav +** will place open/close angle brackets around each value (much like +** a Coded-URL); quotes and brackets should not be in the value. +** +** Example: http://apache.org/dav/props/ +** +** (of course, use your own domain to ensure a unique value) +*/ +APR_DECLARE_EXTERNAL_HOOK(dav, DAV, void, gather_propsets, + (apr_array_header_t *uris)) + +/* +** find_liveprop: find a live property, returning a non-zero, unique, +** opaque identifier. +** +** If the hook implementor determines the specified URI/name refers to +** one of its properties, then it should fill in HOOKS and return a +** non-zero value. The returned value is the "property ID" and will +** be passed to the various liveprop hook functions. +** +** Return 0 if the property is not defined by the hook implementor. +*/ +APR_DECLARE_EXTERNAL_HOOK(dav, DAV, int, find_liveprop, + (const dav_resource *resource, + const char *ns_uri, const char *name, + const dav_hooks_liveprop **hooks)) + +/* +** insert_all_liveprops: insert all (known) live property names/values. +** +** The hook implementor should append XML text to PHDR, containing liveprop +** names. If INSVALUE is true, then the property values should also be +** inserted into the output XML stream. +** +** The liveprop provider should insert *all* known and *defined* live +** properties on the specified resource. If a particular liveprop is +** not defined for this resource, then it should not be inserted. +*/ +APR_DECLARE_EXTERNAL_HOOK(dav, DAV, void, insert_all_liveprops, + (request_rec *r, const dav_resource *resource, + dav_prop_insert what, apr_text_header *phdr)) + +DAV_DECLARE(const dav_hooks_locks *) dav_get_lock_hooks(request_rec *r); +DAV_DECLARE(const dav_hooks_propdb *) dav_get_propdb_hooks(request_rec *r); +DAV_DECLARE(const dav_hooks_vsn *) dav_get_vsn_hooks(request_rec *r); +DAV_DECLARE(const dav_hooks_binding *) dav_get_binding_hooks(request_rec *r); +DAV_DECLARE(const dav_hooks_search *) dav_get_search_hooks(request_rec *r); + +DAV_DECLARE(void) dav_register_provider(apr_pool_t *p, const char *name, + const dav_provider *hooks); +DAV_DECLARE(const dav_provider *) dav_lookup_provider(const char *name); + + +/* ### deprecated */ +#define DAV_GET_HOOKS_PROPDB(r) dav_get_propdb_hooks(r) +#define DAV_GET_HOOKS_LOCKS(r) dav_get_lock_hooks(r) +#define DAV_GET_HOOKS_VSN(r) dav_get_vsn_hooks(r) +#define DAV_GET_HOOKS_BINDING(r) dav_get_binding_hooks(r) +#define DAV_GET_HOOKS_SEARCH(r) dav_get_search_hooks(r) + + +/* -------------------------------------------------------------------- +** +** IF HEADER PROCESSING +** +** Here is the definition of the If: header from RFC 2518, S9.4: +** +** If = "If" ":" (1*No-tag-list | 1*Tagged-list) +** No-tag-list = List +** Tagged-list = Resource 1*List +** Resource = Coded-URL +** List = "(" 1*(["Not"](State-token | "[" entity-tag "]")) ")" +** State-token = Coded-URL +** Coded-URL = "<" absoluteURI ">" ; absoluteURI from RFC 2616 +** +** List corresponds to dav_if_state_list. No-tag-list corresponds to +** dav_if_header with uri==NULL. Tagged-list corresponds to a sequence of +** dav_if_header structures with (duplicate) uri==Resource -- one +** dav_if_header per state_list. A second Tagged-list will start a new +** sequence of dav_if_header structures with the new URI. +** +** A summary of the semantics, mapped into our structures: +** - Chained dav_if_headers: OR +** - Chained dav_if_state_lists: AND +** - NULL uri matches all resources +*/ + +typedef enum +{ + dav_if_etag, + dav_if_opaquelock +} dav_if_state_type; + +typedef struct dav_if_state_list +{ + dav_if_state_type type; + + int condition; +#define DAV_IF_COND_NORMAL 0 +#define DAV_IF_COND_NOT 1 /* "Not" was applied */ + + const char *etag; + dav_locktoken *locktoken; + + struct dav_if_state_list *next; +} dav_if_state_list; + +typedef struct dav_if_header +{ + const char *uri; + apr_size_t uri_len; + struct dav_if_state_list *state; + struct dav_if_header *next; + + int dummy_header; /* used internally by the lock/etag validation */ +} dav_if_header; + +typedef struct dav_locktoken_list +{ + dav_locktoken *locktoken; + struct dav_locktoken_list *next; +} dav_locktoken_list; + +DAV_DECLARE(dav_error *) dav_get_locktoken_list(request_rec *r, + dav_locktoken_list **ltl); + + +/* -------------------------------------------------------------------- +** +** LIVE PROPERTY HANDLING +*/ + +/* opaque type for PROPPATCH rollback information */ +typedef struct dav_liveprop_rollback dav_liveprop_rollback; + +struct dav_hooks_liveprop +{ + /* + ** Insert property information into a text block. The property to + ** insert is identified by the propid value. The information to insert + ** is identified by the "what" argument, as follows: + ** DAV_PROP_INSERT_NAME + ** property name, as an empty XML element + ** DAV_PROP_INSERT_VALUE + ** property name/value, as an XML element + ** DAV_PROP_INSERT_SUPPORTED + ** if the property is defined on the resource, then + ** a DAV:supported-live-property element, as defined + ** by the DeltaV extensions to RFC2518. + ** + ** Providers should return DAV_PROP_INSERT_NOTDEF if the property is + ** known and not defined for this resource, so should be handled as a + ** dead property. If a provider recognizes, but does not support, a + ** property, and does not want it handled as a dead property, it should + ** return DAV_PROP_INSERT_NOTSUPP. + ** + ** Returns one of DAV_PROP_INSERT_* based on what happened. + ** + ** ### we may need more context... ie. the lock database + */ + dav_prop_insert (*insert_prop)(const dav_resource *resource, + int propid, dav_prop_insert what, + apr_text_header *phdr); + + /* + ** Determine whether a given property is writable. + ** + ** ### we may want a different semantic. i.e. maybe it should be + ** ### "can we write into this property?" + ** + ** Returns 1 if the live property can be written, 0 if read-only. + */ + int (*is_writable)(const dav_resource *resource, int propid); + + /* + ** This member defines the set of namespace URIs that the provider + ** uses for its properties. When insert_all is called, it will be + ** passed a list of integers that map from indices into this list + ** to namespace IDs for output generation. + ** + ** The last entry in this list should be a NULL value (sentinel). + */ + const char * const * namespace_uris; + + /* + ** ### this is not the final design. we want an open-ended way for + ** ### liveprop providers to attach *new* properties. To this end, + ** ### we'll have a "give me a list of the props you define", a way + ** ### to check for a prop's existence, a way to validate a set/remove + ** ### of a prop, and a way to execute/commit/rollback that change. + */ + + /* + ** Validate that the live property can be assigned a value, and that + ** the provided value is valid. + ** + ** elem will point to the XML element that names the property. For + ** example: + ** T + ** + ** The provider can access the cdata fields and the child elements + ** to extract the relevant pieces. + ** + ** operation is one of DAV_PROP_OP_SET or _DELETE. + ** + ** The provider may return a value in *context which will be passed + ** to each of the exec/commit/rollback functions. For example, this + ** may contain an internal value which has been processed from the + ** input element. + ** + ** The provider must set defer_to_dead to true (non-zero) or false. + ** If true, then the set/remove is deferred to the dead property + ** database. Note: it will be set to zero on entry. + */ + dav_error * (*patch_validate)(const dav_resource *resource, + const apr_xml_elem *elem, + int operation, + void **context, + int *defer_to_dead); + + /* ### doc... */ + dav_error * (*patch_exec)(const dav_resource *resource, + const apr_xml_elem *elem, + int operation, + void *context, + dav_liveprop_rollback **rollback_ctx); + + /* ### doc... */ + void (*patch_commit)(const dav_resource *resource, + int operation, + void *context, + dav_liveprop_rollback *rollback_ctx); + + /* ### doc... */ + dav_error * (*patch_rollback)(const dav_resource *resource, + int operation, + void *context, + dav_liveprop_rollback *rollback_ctx); + + /* + ** If a provider needs a context to associate with this hooks structure, + ** then this field may be used. In most cases, it will just be NULL. + */ + void *ctx; +}; + +/* +** dav_liveprop_spec: specify a live property +** +** This structure is used as a standard way to determine if a particular +** property is a live property. Its use is not part of the mandated liveprop +** interface, but can be used by liveprop providers in conjuction with the +** utility routines below. +** +** spec->name == NULL is the defined end-sentinel for a list of specs. +*/ +typedef struct { + int ns; /* provider-local namespace index */ + const char *name; /* name of the property */ + + int propid; /* provider-local property ID */ + + int is_writable; /* is the property writable? */ + +} dav_liveprop_spec; + +/* +** dav_liveprop_group: specify a group of liveprops +** +** This structure specifies a group of live properties, their namespaces, +** and how to handle them. +*/ +typedef struct { + const dav_liveprop_spec *specs; + const char * const *namespace_uris; + const dav_hooks_liveprop *hooks; + +} dav_liveprop_group; + +/* ### docco */ +DAV_DECLARE(int) dav_do_find_liveprop(const char *ns_uri, const char *name, + const dav_liveprop_group *group, + const dav_hooks_liveprop **hooks); + +/* ### docco */ +DAV_DECLARE(int) dav_get_liveprop_info(int propid, + const dav_liveprop_group *group, + const dav_liveprop_spec **info); + +/* ### docco */ +DAV_DECLARE(void) dav_register_liveprop_group(apr_pool_t *pool, + const dav_liveprop_group *group); + +/* ### docco */ +DAV_DECLARE(int) dav_get_liveprop_ns_index(const char *uri); + +/* ### docco */ +DAV_DECLARE(int) dav_get_liveprop_ns_count(void); + +/* ### docco */ +DAV_DECLARE(void) dav_add_all_liveprop_xmlns(apr_pool_t *p, + apr_text_header *phdr); + +/* +** The following three functions are part of mod_dav's internal handling +** for the core WebDAV properties. They are not part of mod_dav's API. +*/ +DAV_DECLARE_NONSTD(int) dav_core_find_liveprop( + const dav_resource *resource, + const char *ns_uri, + const char *name, + const dav_hooks_liveprop **hooks); +DAV_DECLARE_NONSTD(void) dav_core_insert_all_liveprops( + request_rec *r, + const dav_resource *resource, + dav_prop_insert what, + apr_text_header *phdr); +DAV_DECLARE_NONSTD(void) dav_core_register_uris(apr_pool_t *p); + + +/* +** Standard WebDAV Property Identifiers +** +** A live property provider does not need to use these; they are simply +** provided for convenience. +** +** Property identifiers need to be unique within a given provider, but not +** *across* providers (note: this uniqueness constraint was different in +** older versions of mod_dav). +** +** The identifiers start at 20000 to make it easier for providers to avoid +** conflicts with the standard properties. The properties are arranged +** alphabetically, and may be reordered from time to time (as properties +** are introduced). +** +** NOTE: there is no problem with reordering (e.g. binary compat) since the +** identifiers are only used within a given provider, which would pick up +** the entire set of changes upon a recompile. +*/ +enum { + DAV_PROPID_BEGIN = 20000, + + /* Standard WebDAV properties (RFC 2518) */ + DAV_PROPID_creationdate, + DAV_PROPID_displayname, + DAV_PROPID_getcontentlanguage, + DAV_PROPID_getcontentlength, + DAV_PROPID_getcontenttype, + DAV_PROPID_getetag, + DAV_PROPID_getlastmodified, + DAV_PROPID_lockdiscovery, + DAV_PROPID_resourcetype, + DAV_PROPID_source, + DAV_PROPID_supportedlock, + + /* DeltaV properties (from the I-D (#14)) */ + DAV_PROPID_activity_checkout_set, + DAV_PROPID_activity_set, + DAV_PROPID_activity_version_set, + DAV_PROPID_auto_merge_set, + DAV_PROPID_auto_version, + DAV_PROPID_baseline_collection, + DAV_PROPID_baseline_controlled_collection, + DAV_PROPID_baseline_controlled_collection_set, + DAV_PROPID_checked_in, + DAV_PROPID_checked_out, + DAV_PROPID_checkin_fork, + DAV_PROPID_checkout_fork, + DAV_PROPID_checkout_set, + DAV_PROPID_comment, + DAV_PROPID_creator_displayname, + DAV_PROPID_current_activity_set, + DAV_PROPID_current_workspace_set, + DAV_PROPID_default_variant, + DAV_PROPID_eclipsed_set, + DAV_PROPID_label_name_set, + DAV_PROPID_merge_set, + DAV_PROPID_precursor_set, + DAV_PROPID_predecessor_set, + DAV_PROPID_root_version, + DAV_PROPID_subactivity_set, + DAV_PROPID_subbaseline_set, + DAV_PROPID_successor_set, + DAV_PROPID_supported_method_set, + DAV_PROPID_supported_live_property_set, + DAV_PROPID_supported_report_set, + DAV_PROPID_unreserved, + DAV_PROPID_variant_set, + DAV_PROPID_version_controlled_binding_set, + DAV_PROPID_version_controlled_configuration, + DAV_PROPID_version_history, + DAV_PROPID_version_name, + DAV_PROPID_workspace, + DAV_PROPID_workspace_checkout_set, + + DAV_PROPID_END +}; + +/* +** Property Identifier Registration +** +** At the moment, mod_dav requires live property providers to ensure that +** each property returned has a unique value. For now, this is done through +** central registration (there are no known providers other than the default, +** so this remains manageable). +** +** WARNING: the TEST ranges should never be "shipped". +*/ +#define DAV_PROPID_CORE 10000 /* ..10099. defined by mod_dav */ +#define DAV_PROPID_FS 10100 /* ..10299. + mod_dav filesystem provider. */ +#define DAV_PROPID_TEST1 10300 /* ..10399 */ +#define DAV_PROPID_TEST2 10400 /* ..10499 */ +#define DAV_PROPID_TEST3 10500 /* ..10599 */ +/* Next: 10600 */ + + +/* -------------------------------------------------------------------- +** +** DATABASE FUNCTIONS +*/ + +typedef struct dav_db dav_db; +typedef struct dav_namespace_map dav_namespace_map; +typedef struct dav_deadprop_rollback dav_deadprop_rollback; + +typedef struct { + const char *ns; /* "" signals "no namespace" */ + const char *name; +} dav_prop_name; + +/* hook functions to enable pluggable databases */ +struct dav_hooks_propdb +{ + dav_error * (*open)(apr_pool_t *p, const dav_resource *resource, int ro, + dav_db **pdb); + void (*close)(dav_db *db); + + /* + ** In bulk, define any namespaces that the values and their name + ** elements may need. + ** + ** Note: sometimes mod_dav will defer calling this until output_value + ** returns found==1. If the output process needs the dav_xmlns_info + ** filled for its work, then it will need to fill it on demand rather + ** than depending upon this hook to fill in the structure. + ** + ** Note: this will *always* be called during an output sequence. Thus, + ** the provider may rely solely on using this to fill the xmlns info. + */ + dav_error * (*define_namespaces)(dav_db *db, dav_xmlns_info *xi); + + /* + ** Output the value from the database (i.e. add an element name and + ** the value into *phdr). Set *found based on whether the name/value + ** was found in the propdb. + ** + ** Note: it is NOT an error for the key/value pair to not exist. + ** + ** The dav_xmlns_info passed to define_namespaces() is also passed to + ** each output_value() call so that namespaces can be added on-demand. + ** It can also be used to look up prefixes or URIs during the output + ** process. + */ + dav_error * (*output_value)(dav_db *db, const dav_prop_name *name, + dav_xmlns_info *xi, + apr_text_header *phdr, int *found); + + /* + ** Build a mapping from "global" namespaces (stored in apr_xml_*) + ** into provider-local namespace identifiers. + ** + ** This mapping should be done once per set of namespaces, and the + ** resulting mapping should be passed into the store() hook function. + ** + ** Note: usually, there is just a single document/namespaces for all + ** elements passed. However, the generality of creating multiple + ** mappings and passing them to store() is provided here. + ** + ** Note: this is only in preparation for a series of store() calls. + ** As a result, the propdb must be open for read/write access when + ** this function is called. + */ + dav_error * (*map_namespaces)(dav_db *db, + const apr_array_header_t *namespaces, + dav_namespace_map **mapping); + + /* + ** Store a property value for a given name. The value->combined field + ** MUST be set for this call. + ** + ** ### WARNING: current providers will quote the text within ELEM. + ** ### this implies you can call this function only once with a given + ** ### element structure (a second time will quote it again). + */ + dav_error * (*store)(dav_db *db, const dav_prop_name *name, + const apr_xml_elem *elem, + dav_namespace_map *mapping); + + /* remove a given property */ + dav_error * (*remove)(dav_db *db, const dav_prop_name *name); + + /* returns 1 if the record specified by "key" exists; 0 otherwise */ + int (*exists)(dav_db *db, const dav_prop_name *name); + + /* + ** Iterate over the property names in the database. + ** + ** iter->name.ns == iter->name.name == NULL when there are no more names. + ** + ** Note: only one iteration may occur over the propdb at a time. + */ + dav_error * (*first_name)(dav_db *db, dav_prop_name *pname); + dav_error * (*next_name)(dav_db *db, dav_prop_name *pname); + + /* + ** Rollback support: get rollback context, and apply it. + ** + ** struct dav_deadprop_rollback is a provider-private structure; it + ** should remember the name, and the name's old value (or the fact that + ** the value was not present, and should be deleted if a rollback occurs). + */ + dav_error * (*get_rollback)(dav_db *db, const dav_prop_name *name, + dav_deadprop_rollback **prollback); + dav_error * (*apply_rollback)(dav_db *db, + dav_deadprop_rollback *rollback); + + /* + ** If a provider needs a context to associate with this hooks structure, + ** then this field may be used. In most cases, it will just be NULL. + */ + void *ctx; +}; + + +/* -------------------------------------------------------------------- +** +** LOCK FUNCTIONS +*/ + +/* Used to represent a Timeout header of "Infinity" */ +#define DAV_TIMEOUT_INFINITE 0 + +DAV_DECLARE(time_t) dav_get_timeout(request_rec *r); + +/* +** Opaque, provider-specific information for a lock database. +*/ +typedef struct dav_lockdb_private dav_lockdb_private; + +/* +** Opaque, provider-specific information for a lock record. +*/ +typedef struct dav_lock_private dav_lock_private; + +/* +** Lock database type. Lock providers are urged to implement a "lazy" open, so +** doing an "open" is cheap until something is actually needed from the DB. +*/ +typedef struct +{ + const dav_hooks_locks *hooks; /* the hooks used for this lockdb */ + int ro; /* was it opened readonly? */ + + dav_lockdb_private *info; + +} dav_lockdb; + +typedef enum { + DAV_LOCKSCOPE_UNKNOWN, + DAV_LOCKSCOPE_EXCLUSIVE, + DAV_LOCKSCOPE_SHARED +} dav_lock_scope; + +typedef enum { + DAV_LOCKTYPE_UNKNOWN, + DAV_LOCKTYPE_WRITE +} dav_lock_type; + +typedef enum { + DAV_LOCKREC_DIRECT, /* lock asserted on this resource */ + DAV_LOCKREC_INDIRECT, /* lock inherited from a parent */ + DAV_LOCKREC_INDIRECT_PARTIAL /* most info is not filled in */ +} dav_lock_rectype; + +/* +** dav_lock: hold information about a lock on a resource. +** +** This structure is used for both direct and indirect locks. A direct lock +** is a lock applied to a specific resource by the client. An indirect lock +** is one that is inherited from a parent resource by virtue of a non-zero +** Depth: header when the lock was applied. +** +** mod_dav records both types of locks in the lock database, managing their +** addition/removal as resources are moved about the namespace. +** +** Note that the lockdb is free to marshal this structure in any form that +** it likes. +** +** For a "partial" lock, the and fields must be filled +** in. All other (user) fields should be zeroed. The lock provider will +** usually fill in the field, and the field may be used to +** construct a list of partial locks. +** +** The lock provider MUST use the info field to store a value such that a +** dav_lock structure can locate itself in the underlying lock database. +** This requirement is needed for refreshing: when an indirect dav_lock is +** refreshed, its reference to the direct lock does not specify the direct's +** resource, so the only way to locate the (refreshed, direct) lock in the +** database is to use the info field. +** +** Note that only refers to the resource where this lock was +** found. +** ### hrm. that says the abstraction is wrong. is_locknull may disappear. +*/ +typedef struct dav_lock +{ + dav_lock_rectype rectype; /* type of lock record */ + int is_locknull; /* lock establishes a locknull resource */ + + /* ### put the resource in here? */ + + dav_lock_scope scope; /* scope of the lock */ + dav_lock_type type; /* type of lock */ + int depth; /* depth of the lock */ + time_t timeout; /* when the lock will timeout */ + + const dav_locktoken *locktoken; /* the token that was issued */ + + const char *owner; /* (XML) owner of the lock */ + const char *auth_user; /* auth'd username owning lock */ + + dav_lock_private *info; /* private to the lockdb */ + + struct dav_lock *next; /* for managing a list of locks */ +} dav_lock; + +/* Property-related public lock functions */ +DAV_DECLARE(const char *)dav_lock_get_activelock(request_rec *r, + dav_lock *locks, + dav_buffer *pbuf); + +/* LockDB-related public lock functions */ +DAV_DECLARE(dav_error *) dav_lock_parse_lockinfo(request_rec *r, + const dav_resource *resrouce, + dav_lockdb *lockdb, + const apr_xml_doc *doc, + dav_lock **lock_request); +DAV_DECLARE(int) dav_unlock(request_rec *r, + const dav_resource *resource, + const dav_locktoken *locktoken); +DAV_DECLARE(dav_error *) dav_add_lock(request_rec *r, + const dav_resource *resource, + dav_lockdb *lockdb, dav_lock *request, + dav_response **response); +DAV_DECLARE(dav_error *) dav_notify_created(request_rec *r, + dav_lockdb *lockdb, + const dav_resource *resource, + int resource_state, + int depth); + +DAV_DECLARE(dav_error*) dav_lock_query(dav_lockdb *lockdb, + const dav_resource *resource, + dav_lock **locks); + +DAV_DECLARE(dav_error *) dav_validate_request(request_rec *r, + dav_resource *resource, + int depth, + dav_locktoken *locktoken, + dav_response **response, + int flags, + dav_lockdb *lockdb); +/* +** flags: +** 0x0F -- reserved for values +** +** other flags, detailed below +*/ +#define DAV_VALIDATE_RESOURCE 0x0010 /* validate just the resource */ +#define DAV_VALIDATE_PARENT 0x0020 /* validate resource AND its parent */ +#define DAV_VALIDATE_ADD_LD 0x0040 /* add DAV:lockdiscovery into + the 424 DAV:response */ +#define DAV_VALIDATE_USE_424 0x0080 /* return 424 status, not 207 */ +#define DAV_VALIDATE_IS_PARENT 0x0100 /* for internal use */ + +/* Lock-null related public lock functions */ +DAV_DECLARE(int) dav_get_resource_state(request_rec *r, + const dav_resource *resource); + +/* Lock provider hooks. Locking is optional, so there may be no + * lock provider for a given repository. + */ +struct dav_hooks_locks +{ + /* Return the supportedlock property for a resource */ + const char * (*get_supportedlock)( + const dav_resource *resource + ); + + /* Parse a lock token URI, returning a lock token object allocated + * in the given pool. + */ + dav_error * (*parse_locktoken)( + apr_pool_t *p, + const char *char_token, + dav_locktoken **locktoken_p + ); + + /* Format a lock token object into a URI string, allocated in + * the given pool. + * + * Always returns non-NULL. + */ + const char * (*format_locktoken)( + apr_pool_t *p, + const dav_locktoken *locktoken + ); + + /* Compare two lock tokens. + * + * Result < 0 => lt1 < lt2 + * Result == 0 => lt1 == lt2 + * Result > 0 => lt1 > lt2 + */ + int (*compare_locktoken)( + const dav_locktoken *lt1, + const dav_locktoken *lt2 + ); + + /* Open the provider's lock database. + * + * The provider may or may not use a "real" database for locks + * (a lock could be an attribute on a resource, for example). + * + * The provider may choose to use the value of the DAVLockDB directive + * (as returned by dav_get_lockdb_path()) to decide where to place + * any storage it may need. + * + * The request storage pool should be associated with the lockdb, + * so it can be used in subsequent operations. + * + * If ro != 0, only readonly operations will be performed. + * If force == 0, the open can be "lazy"; no subsequent locking operations + * may occur. + * If force != 0, locking operations will definitely occur. + */ + dav_error * (*open_lockdb)( + request_rec *r, + int ro, + int force, + dav_lockdb **lockdb + ); + + /* Indicates completion of locking operations */ + void (*close_lockdb)( + dav_lockdb *lockdb + ); + + /* Take a resource out of the lock-null state. */ + dav_error * (*remove_locknull_state)( + dav_lockdb *lockdb, + const dav_resource *resource + ); + + /* + ** Create a (direct) lock structure for the given resource. A locktoken + ** will be created. + ** + ** The lock provider may store private information into lock->info. + */ + dav_error * (*create_lock)(dav_lockdb *lockdb, + const dav_resource *resource, + dav_lock **lock); + + /* + ** Get the locks associated with the specified resource. + ** + ** If resolve_locks is true (non-zero), then any indirect locks are + ** resolved to their actual, direct lock (i.e. the reference to followed + ** to the original lock). + ** + ** The locks, if any, are returned as a linked list in no particular + ** order. If no locks are present, then *locks will be NULL. + */ + dav_error * (*get_locks)(dav_lockdb *lockdb, + const dav_resource *resource, + int calltype, + dav_lock **locks); + +#define DAV_GETLOCKS_RESOLVED 0 /* resolve indirects to directs */ +#define DAV_GETLOCKS_PARTIAL 1 /* leave indirects partially filled */ +#define DAV_GETLOCKS_COMPLETE 2 /* fill out indirect locks */ + + /* + ** Find a particular lock on a resource (specified by its locktoken). + ** + ** *lock will be set to NULL if the lock is not found. + ** + ** Note that the provider can optimize the unmarshalling -- only one + ** lock (or none) must be constructed and returned. + ** + ** If partial_ok is true (non-zero), then an indirect lock can be + ** partially filled in. Otherwise, another lookup is done and the + ** lock structure will be filled out as a DAV_LOCKREC_INDIRECT. + */ + dav_error * (*find_lock)(dav_lockdb *lockdb, + const dav_resource *resource, + const dav_locktoken *locktoken, + int partial_ok, + dav_lock **lock); + + /* + ** Quick test to see if the resource has *any* locks on it. + ** + ** This is typically used to determine if a non-existent resource + ** has a lock and is (therefore) a locknull resource. + ** + ** WARNING: this function may return TRUE even when timed-out locks + ** exist (i.e. it may not perform timeout checks). + */ + dav_error * (*has_locks)(dav_lockdb *lockdb, + const dav_resource *resource, + int *locks_present); + + /* + ** Append the specified lock(s) to the set of locks on this resource. + ** + ** If "make_indirect" is true (non-zero), then the specified lock(s) + ** should be converted to an indirect lock (if it is a direct lock) + ** before appending. Note that the conversion to an indirect lock does + ** not alter the passed-in lock -- the change is internal the + ** append_locks function. + ** + ** Multiple locks are specified using the lock->next links. + */ + dav_error * (*append_locks)(dav_lockdb *lockdb, + const dav_resource *resource, + int make_indirect, + const dav_lock *lock); + + /* + ** Remove any lock that has the specified locktoken. + ** + ** If locktoken == NULL, then ALL locks are removed. + */ + dav_error * (*remove_lock)(dav_lockdb *lockdb, + const dav_resource *resource, + const dav_locktoken *locktoken); + + /* + ** Refresh all locks, found on the specified resource, which has a + ** locktoken in the provided list. + ** + ** If the lock is indirect, then the direct lock is referenced and + ** refreshed. + ** + ** Each lock that is updated is returned in the argument. + ** Note that the locks will be fully resolved. + */ + dav_error * (*refresh_locks)(dav_lockdb *lockdb, + const dav_resource *resource, + const dav_locktoken_list *ltl, + time_t new_time, + dav_lock **locks); + + /* + ** Look up the resource associated with a particular locktoken. + ** + ** The search begins at the specified and the lock + ** specified by . + ** + ** If the resource/token specifies an indirect lock, then the direct + ** lock will be looked up, and THAT resource will be returned. In other + ** words, this function always returns the resource where a particular + ** lock (token) was asserted. + ** + ** NOTE: this function pointer is allowed to be NULL, indicating that + ** the provider does not support this type of functionality. The + ** caller should then traverse up the repository hierarchy looking + ** for the resource defining a lock with this locktoken. + */ + dav_error * (*lookup_resource)(dav_lockdb *lockdb, + const dav_locktoken *locktoken, + const dav_resource *start_resource, + const dav_resource **resource); + + /* + ** If a provider needs a context to associate with this hooks structure, + ** then this field may be used. In most cases, it will just be NULL. + */ + void *ctx; +}; + +/* what types of resources can be discovered by dav_get_resource_state() */ +#define DAV_RESOURCE_LOCK_NULL 10 /* resource lock-null */ +#define DAV_RESOURCE_NULL 11 /* resource null */ +#define DAV_RESOURCE_EXISTS 12 /* resource exists */ +#define DAV_RESOURCE_ERROR 13 /* an error occurred */ + + +/* -------------------------------------------------------------------- +** +** PROPERTY HANDLING +*/ + +typedef struct dav_propdb dav_propdb; + + +DAV_DECLARE(dav_error *) dav_open_propdb( + request_rec *r, + dav_lockdb *lockdb, + const dav_resource *resource, + int ro, + apr_array_header_t *ns_xlate, + dav_propdb **propdb); + +DAV_DECLARE(void) dav_close_propdb(dav_propdb *db); + +DAV_DECLARE(dav_get_props_result) dav_get_props( + dav_propdb *db, + apr_xml_doc *doc); + +DAV_DECLARE(dav_get_props_result) dav_get_allprops( + dav_propdb *db, + dav_prop_insert what); + +DAV_DECLARE(void) dav_get_liveprop_supported( + dav_propdb *propdb, + const char *ns_uri, + const char *propname, + apr_text_header *body); + +/* +** 3-phase property modification. +** +** 1) validate props. readable? unlocked? ACLs allow access? +** 2) execute operation (set/delete) +** 3) commit or rollback +** +** ### eventually, auth must be available. a ref to the request_rec (which +** ### contains the auth info) should be in the shared context struct. +** +** Each function may alter the error values and information contained within +** the context record. This should be done as an "increasing" level of +** error, rather than overwriting any previous error. +** +** Note that commit() cannot generate errors. It should simply free the +** rollback information. +** +** rollback() may generate additional errors because the rollback operation +** can sometimes fail(!). +** +** The caller should allocate an array of these, one per operation. It should +** be zero-initialized, then the db, operation, and prop fields should be +** filled in before calling dav_prop_validate. Note that the set/delete +** operations are order-dependent. For a given (logical) context, the same +** pointer must be passed to each phase. +** +** error_type is an internal value, but will have the same numeric value +** for each possible "desc" value. This allows the caller to group the +** descriptions via the error_type variable, rather than through string +** comparisons. Note that "status" does not provide enough granularity to +** differentiate/group the "desc" values. +** +** Note that the propdb will maintain some (global) context across all +** of the property change contexts. This implies that you can have only +** one open transaction per propdb. +*/ +typedef struct dav_prop_ctx +{ + dav_propdb *propdb; + + int operation; +#define DAV_PROP_OP_SET 1 /* set a property value */ +#define DAV_PROP_OP_DELETE 2 /* delete a prop value */ +/* ### add a GET? */ + + apr_xml_elem *prop; /* property to affect */ + + dav_error *err; /* error (if any) */ + + /* private items to the propdb */ + int is_liveprop; + void *liveprop_ctx; + struct dav_rollback_item *rollback; /* optional rollback info */ + + /* private to mod_dav.c */ + request_rec *r; + +} dav_prop_ctx; + +DAV_DECLARE_NONSTD(void) dav_prop_validate(dav_prop_ctx *ctx); +DAV_DECLARE_NONSTD(void) dav_prop_exec(dav_prop_ctx *ctx); +DAV_DECLARE_NONSTD(void) dav_prop_commit(dav_prop_ctx *ctx); +DAV_DECLARE_NONSTD(void) dav_prop_rollback(dav_prop_ctx *ctx); + +#define DAV_PROP_CTX_HAS_ERR(dpc) ((dpc).err && (dpc).err->status >= 300) + + +/* -------------------------------------------------------------------- +** +** WALKER STRUCTURE +*/ + +enum { + DAV_CALLTYPE_MEMBER = 1, /* called for a member resource */ + DAV_CALLTYPE_COLLECTION, /* called for a collection */ + DAV_CALLTYPE_LOCKNULL /* called for a locknull resource */ +}; + +typedef struct +{ + /* the client-provided context */ + void *walk_ctx; + + /* pool to use for allocations in the callback */ + apr_pool_t *pool; + + /* the current resource */ + const dav_resource *resource; + + /* OUTPUT: add responses to this */ + dav_response *response; + +} dav_walk_resource; + +typedef struct +{ + int walk_type; +#define DAV_WALKTYPE_AUTH 0x0001 /* limit to authorized files */ +#define DAV_WALKTYPE_NORMAL 0x0002 /* walk normal files */ +#define DAV_WALKTYPE_LOCKNULL 0x0004 /* walk locknull resources */ + + /* callback function and a client context for the walk */ + dav_error * (*func)(dav_walk_resource *wres, int calltype); + void *walk_ctx; + + /* what pool to use for allocations needed by walk logic */ + apr_pool_t *pool; + + /* beginning root of the walk */ + const dav_resource *root; + + /* lock database to enable walking LOCKNULL resources */ + dav_lockdb *lockdb; + +} dav_walk_params; + +/* directory tree walking context */ +typedef struct dav_walker_ctx +{ + /* input: */ + dav_walk_params w; + + + /* ### client data... phasing out this big glom */ + + /* this brigade buffers data being sent to r->output_filters */ + apr_bucket_brigade *bb; + + /* a scratch pool, used to stream responses and iteratively cleared. */ + apr_pool_t *scratchpool; + + request_rec *r; /* original request */ + + /* for PROPFIND operations */ + apr_xml_doc *doc; + int propfind_type; +#define DAV_PROPFIND_IS_ALLPROP 1 +#define DAV_PROPFIND_IS_PROPNAME 2 +#define DAV_PROPFIND_IS_PROP 3 + + apr_text *propstat_404; /* (cached) propstat giving a 404 error */ + + const dav_if_header *if_header; /* for validation */ + const dav_locktoken *locktoken; /* for UNLOCK */ + const dav_lock *lock; /* for LOCK */ + int skip_root; /* for dav_inherit_locks() */ + + int flags; + + dav_buffer work_buf; /* for dav_validate_request() */ + +} dav_walker_ctx; + +DAV_DECLARE(void) dav_add_response(dav_walk_resource *wres, + int status, + dav_get_props_result *propstats); + + +/* -------------------------------------------------------------------- +** +** "STREAM" STRUCTURE +** +** mod_dav uses this abstraction for interacting with the repository +** while fetching/storing resources. mod_dav views resources as a stream +** of bytes. +** +** Note that the structure is opaque -- it is private to the repository +** that created the stream in the repository's "open" function. +** +** ### THIS STUFF IS GOING AWAY ... GET/read requests are handled by +** ### having the provider jam stuff straight into the filter stack. +** ### this is only left for handling PUT/write requests. +*/ + +typedef struct dav_stream dav_stream; + +typedef enum { + DAV_MODE_WRITE_TRUNC, /* truncate and open for writing */ + DAV_MODE_WRITE_SEEKABLE /* open for writing; random access */ +} dav_stream_mode; + + +/* -------------------------------------------------------------------- +** +** REPOSITORY FUNCTIONS +*/ + +/* Repository provider hooks */ +struct dav_hooks_repository +{ + /* Flag for whether repository requires special GET handling. + * If resources in the repository are not visible in the + * filesystem location which URLs map to, then special handling + * is required to first fetch a resource from the repository, + * respond to the GET request, then free the resource copy. + */ + int handle_get; + + /* Get a resource descriptor for the URI in a request. A descriptor + * should always be returned even if the resource does not exist. This + * repository has been identified as handling the resource given by + * the URI, so an answer must be given. If there is a problem with the + * URI or accessing the resource or whatever, then an error should be + * returned. + * + * root_dir: + * the root of the directory for which this repository is configured. + * + * label: + * if a Label: header is present (and allowed), this is the label + * to use to identify a version resource from the resource's + * corresponding version history. Otherwise, it will be NULL. + * + * use_checked_in: + * use the DAV:checked-in property of the resource identified by the + * Request-URI to identify and return a version resource + * + * The provider may associate the request storage pool with the resource + * (in the resource->pool field), to use in other operations on that + * resource. + */ + dav_error * (*get_resource)( + request_rec *r, + const char *root_dir, + const char *label, + int use_checked_in, + dav_resource **resource + ); + + /* Get a resource descriptor for the parent of the given resource. + * The resources need not exist. NULL is returned if the resource + * is the root collection. + * + * An error should be returned only if there is a fatal error in + * fetching information about the parent resource. + */ + dav_error * (*get_parent_resource)( + const dav_resource *resource, + dav_resource **parent_resource + ); + + /* Determine whether two resource descriptors refer to the same resource. + * + * Result != 0 => the resources are the same. + */ + int (*is_same_resource)( + const dav_resource *res1, + const dav_resource *res2 + ); + + /* Determine whether one resource is a parent (immediate or otherwise) + * of another. + * + * Result != 0 => res1 is a parent of res2. + */ + int (*is_parent_resource)( + const dav_resource *res1, + const dav_resource *res2 + ); + + /* + ** Open a stream for this resource, using the specified mode. The + ** stream will be returned in *stream. + */ + dav_error * (*open_stream)(const dav_resource *resource, + dav_stream_mode mode, + dav_stream **stream); + + /* + ** Close the specified stream. + ** + ** mod_dav will (ideally) make sure to call this. For safety purposes, + ** a provider should (ideally) register a cleanup function with the + ** request pool to get this closed and cleaned up. + ** + ** Note the possibility of an error from the close -- it is entirely + ** feasible that the close does a "commit" of some kind, which can + ** produce an error. + ** + ** commit should be TRUE (non-zero) or FALSE (0) if the stream was + ** opened for writing. This flag states whether to retain the file + ** or not. + ** Note: the commit flag is ignored for streams opened for reading. + */ + dav_error * (*close_stream)(dav_stream *stream, int commit); + + /* + ** Write data to the stream. + ** + ** All of the bytes must be written, or an error should be returned. + */ + dav_error * (*write_stream)(dav_stream *stream, + const void *buf, apr_size_t bufsize); + + /* + ** Seek to an absolute position in the stream. This is used to support + ** Content-Range in a GET/PUT. + ** + ** NOTE: if this function is NULL (which is allowed), then any + ** operations using Content-Range will be refused. + */ + dav_error * (*seek_stream)(dav_stream *stream, apr_off_t abs_position); + + /* + ** If a GET is processed using a stream (open_stream, read_stream) + ** rather than via a sub-request (on get_pathname), then this function + ** is used to provide the repository with a way to set the headers + ** in the response. + ** + ** This function may be called without a following deliver(), to + ** handle a HEAD request. + ** + ** This may be NULL if handle_get is FALSE. + */ + dav_error * (*set_headers)(request_rec *r, + const dav_resource *resource); + + /* + ** The provider should deliver the resource into the specified filter. + ** Basically, this is the response to the GET method. + ** + ** Note that this is called for all resources, including collections. + ** The provider should determine what has content to deliver or not. + ** + ** set_headers will be called prior to this function, allowing the + ** provider to set the appropriate response headers. + ** + ** This may be NULL if handle_get is FALSE. + ** ### maybe toss handle_get and just use this function as the marker + */ + dav_error * (*deliver)(const dav_resource *resource, + ap_filter_t *output); + + /* Create a collection resource. The resource must not already exist. + * + * Result == NULL if the collection was created successfully. Also, the + * resource object is updated to reflect that the resource exists, and + * is a collection. + */ + dav_error * (*create_collection)( + dav_resource *resource + ); + + /* Copy one resource to another. The destination may exist, if it is + * versioned. + * Handles both files and collections. Properties are copied as well. + * If the destination exists and is versioned, the provider must update + * the destination to have identical content to the source, + * recursively for collections. + * The depth argument is ignored for a file, and can be either 0 or + * DAV_INFINITY for a collection. + * If an error occurs in a child resource, then the return value is + * non-NULL, and *response is set to a multistatus response. + * If the copy is successful, the dst resource object is + * updated to reflect that the resource exists. + */ + dav_error * (*copy_resource)( + const dav_resource *src, + dav_resource *dst, + int depth, + dav_response **response + ); + + /* Move one resource to another. The destination must not exist. + * Handles both files and collections. Properties are moved as well. + * If an error occurs in a child resource, then the return value is + * non-NULL, and *response is set to a multistatus response. + * If the move is successful, the src and dst resource objects are + * updated to reflect that the source no longer exists, and the + * destination does. + */ + dav_error * (*move_resource)( + dav_resource *src, + dav_resource *dst, + dav_response **response + ); + + /* Remove a resource. Handles both files and collections. + * Removes any associated properties as well. + * If an error occurs in a child resource, then the return value is + * non-NULL, and *response is set to a multistatus response. + * If the delete is successful, the resource object is updated to + * reflect that the resource no longer exists. + */ + dav_error * (*remove_resource)( + dav_resource *resource, + dav_response **response + ); + + /* Walk a resource hierarchy. + * + * Iterates over the resource hierarchy specified by params->root. + * Control of the walk and the callback are specified by 'params'. + * + * An error may be returned. *response will contain multistatus + * responses (if any) suitable for the body of the error. It is also + * possible to return NULL, yet still have multistatus responses. + * In this case, typically the caller should return a 207 (Multistatus) + * and the responses (in the body) as the HTTP response. + */ + dav_error * (*walk)(const dav_walk_params *params, int depth, + dav_response **response); + + /* Get the entity tag for a resource */ + const char * (*getetag)(const dav_resource *resource); + + /* + ** If a provider needs a context to associate with this hooks structure, + ** then this field may be used. In most cases, it will just be NULL. + */ + void *ctx; +}; + + +/* -------------------------------------------------------------------- +** +** VERSIONING FUNCTIONS +*/ + + +/* dav_add_vary_header + * + * If there were any headers in the request which require a Vary header + * in the response, add it. + */ +DAV_DECLARE(void) dav_add_vary_header(request_rec *in_req, + request_rec *out_req, + const dav_resource *resource); + +/* +** Flags specifying auto-versioning behavior, returned by +** the auto_versionable hook. The value returned depends +** on both the state of the resource and the value of the +** DAV:auto-versioning property for the resource. +** +** If the resource does not exist (null or lock-null), +** DAV_AUTO_VERSION_ALWAYS causes creation of a new version-controlled resource +** +** If the resource is checked in, +** DAV_AUTO_VERSION_ALWAYS causes it to be checked out always, +** DAV_AUTO_VERSION_LOCKED causes it to be checked out only when locked +** +** If the resource is checked out, +** DAV_AUTO_VERSION_ALWAYS causes it to be checked in always, +** DAV_AUTO_VERSION_LOCKED causes it to be checked in when unlocked +** (note: a provider should allow auto-checkin only for resources which +** were automatically checked out) +** +** In all cases, DAV_AUTO_VERSION_NEVER results in no auto-versioning behavior. +*/ +typedef enum { + DAV_AUTO_VERSION_NEVER, + DAV_AUTO_VERSION_ALWAYS, + DAV_AUTO_VERSION_LOCKED +} dav_auto_version; + +/* +** This structure is used to record what auto-versioning operations +** were done to make a resource writable, so that they can be undone +** at the end of a request. +*/ +typedef struct { + int resource_versioned; /* 1 => resource was auto-version-controlled */ + int resource_checkedout; /* 1 => resource was auto-checked-out */ + int parent_checkedout; /* 1 => parent was auto-checked-out */ + dav_resource *parent_resource; /* parent resource, if it was needed */ +} dav_auto_version_info; + +/* Ensure that a resource is writable. If there is no versioning + * provider, then this is essentially a no-op. Versioning repositories + * require explicit resource creation and checkout before they can + * be written to. If a new resource is to be created, or an existing + * resource deleted, the parent collection must be checked out as well. + * + * Set the parent_only flag to only make the parent collection writable. + * Otherwise, both parent and child are made writable as needed. If the + * child does not exist, then a new versioned resource is created and + * checked out. + * + * If auto-versioning is not enabled for a versioned resource, then an error is + * returned, since the resource cannot be modified. + * + * The dav_auto_version_info structure is filled in with enough information + * to restore both parent and child resources to the state they were in + * before the auto-versioning operations occurred. + */ +DAV_DECLARE(dav_error *) dav_auto_checkout( + request_rec *r, + dav_resource *resource, + int parent_only, + dav_auto_version_info *av_info); + +/* Revert the writability of resources back to what they were + * before they were modified. If undo == 0, then the resource + * modifications are maintained (i.e. they are checked in). + * If undo != 0, then resource modifications are discarded + * (i.e. they are unchecked out). + * + * Set the unlock flag to indicate that the resource is about + * to be unlocked; it will be checked in if the resource + * auto-versioning property indicates it should be. In this case, + * av_info is ignored, so it can be NULL. + * + * The resource argument may be NULL if only the parent resource + * was checked out (i.e. the parent_only was != 0 in the + * dav_auto_checkout call). + */ +DAV_DECLARE(dav_error *) dav_auto_checkin( + request_rec *r, + dav_resource *resource, + int undo, + int unlock, + dav_auto_version_info *av_info); + +/* +** This structure is used to describe available reports +** +** "nmspace" should be valid XML and URL-quoted. mod_dav will place +** double-quotes around it and use it in an xmlns declaration. +*/ +typedef struct { + const char *nmspace; /* namespace of the XML report element */ + const char *name; /* element name for the XML report */ +} dav_report_elem; + + +/* Versioning provider hooks */ +struct dav_hooks_vsn +{ + /* + ** MANDATORY HOOKS + ** The following hooks are mandatory for all versioning providers; + ** they define the functionality needed to implement "core" versioning. + */ + + /* Return supported versioning options. + * Each dav_text item in the list will be returned as a separate + * DAV header. Providers are advised to limit the length of an + * individual text item to 63 characters, to conform to the limit + * used by MS Web Folders. + */ + void (*get_vsn_options)(apr_pool_t *p, apr_text_header *phdr); + + /* Get the value of a specific option for an OPTIONS request. + * The option being requested is given by the parsed XML + * element object "elem". The value of the option should be + * appended to the "option" text object. + */ + dav_error * (*get_option)(const dav_resource *resource, + const apr_xml_elem *elem, + apr_text_header *option); + + /* Determine whether a non-versioned (or non-existent) resource + * is versionable. Returns != 0 if resource can be versioned. + */ + int (*versionable)(const dav_resource *resource); + + /* Determine whether auto-versioning is enabled for a resource + * (which may not exist, or may not be versioned). If the resource + * is a checked-out resource, the provider must only enable + * auto-checkin if the resource was automatically checked out. + * + * The value returned depends on both the state of the resource + * and the value of its DAV:auto-version property. See the description + * of the dav_auto_version enumeration above for the details. + */ + dav_auto_version (*auto_versionable)(const dav_resource *resource); + + /* Put a resource under version control. If the resource already + * exists unversioned, then it becomes the initial version of the + * new version history, and it is replaced by a version selector + * which targets the new version. + * + * If the resource does not exist, then a new version-controlled + * resource is created which either targets an existing version (if the + * "target" argument is not NULL), or the initial, empty version + * in a new history resource (if the "target" argument is NULL). + * + * If successful, the resource object state is updated appropriately + * (that is, changed to refer to the new version-controlled resource). + */ + dav_error * (*vsn_control)(dav_resource *resource, + const char *target); + + /* Checkout a resource. If successful, the resource + * object state is updated appropriately. + * + * The auto_checkout flag will be set if this checkout is being + * done automatically, as part of some method which modifies + * the resource. The provider must remember that the resource + * was automatically checked out, so it can determine whether it + * can be automatically checked in. (Auto-checkin should only be + * enabled for resources which were automatically checked out.) + * + * If the working resource has a different URL from the + * target resource, a dav_resource descriptor is returned + * for the new working resource. Otherwise, the original + * resource descriptor will refer to the working resource. + * The working_resource argument can be NULL if the caller + * is not interested in the working resource. + * + * If the client has specified DAV:unreserved or DAV:fork-ok in the + * checkout request, then the corresponding flags are set. If + * DAV:activity-set has been specified, then create_activity is set + * if DAV:new was specified; otherwise, the DAV:href elements' CDATA + * (the actual href text) is passed in the "activities" array (each + * element of the array is a const char *). activities will be NULL + * no DAV:activity-set was provided or when create_activity is set. + */ + dav_error * (*checkout)(dav_resource *resource, + int auto_checkout, + int is_unreserved, int is_fork_ok, + int create_activity, + apr_array_header_t *activities, + dav_resource **working_resource); + + /* Uncheckout a checked-out resource. If successful, the resource + * object state is updated appropriately. + */ + dav_error * (*uncheckout)(dav_resource *resource); + + /* Checkin a checked-out resource. If successful, the resource + * object state is updated appropriately, and the + * version_resource descriptor will refer to the new version. + * The version_resource argument can be NULL if the caller + * is not interested in the new version resource. + * + * If the client has specified DAV:keep-checked-out in the checkin + * request, then the keep_checked_out flag is set. The provider + * should create a new version, but keep the resource in the + * checked-out state. + */ + dav_error * (*checkin)(dav_resource *resource, + int keep_checked_out, + dav_resource **version_resource); + + /* + ** Return the set of reports available at this resource. + ** + ** An array of report elements should be returned, with an end-marker + ** element containing namespace==NULL. The value of the + ** DAV:supported-report-set property will be constructed and + ** returned. + */ + dav_error * (*avail_reports)(const dav_resource *resource, + const dav_report_elem **reports); + + /* + ** Determine whether a Label header can be used + ** with a particular report. The dav_xml_doc structure + ** contains the parsed report request body. + ** Returns 0 if the Label header is not allowed. + */ + int (*report_label_header_allowed)(const apr_xml_doc *doc); + + /* + ** Generate a report on a resource. Since a provider is free + ** to define its own reports, and the value of request headers + ** may affect the interpretation of a report, the request record + ** must be passed to this routine. + ** + ** The dav_xml_doc structure contains the parsed report request + ** body. The report response should be generated into the specified + ** output filter. + ** + ** If an error occurs, and a response has not yet been generated, + ** then an error can be returned from this function. mod_dav will + ** construct an appropriate error response. Once some output has + ** been placed into the filter, however, the provider should not + ** return an error -- there is no way that mod_dav can deliver it + ** properly. + ** + ** ### maybe we need a way to signal an error anyways, and then + ** ### apache can abort the connection? + */ + dav_error * (*deliver_report)(request_rec *r, + const dav_resource *resource, + const apr_xml_doc *doc, + ap_filter_t *output); + + /* + ** OPTIONAL HOOKS + ** The following hooks are optional; if not defined, then the + ** corresponding protocol methods will be unsupported. + */ + + /* + ** Set the state of a checked-in version-controlled resource. + ** + ** If the request specified a version, the version resource + ** represents that version. If the request specified a label, + ** then "version" is NULL, and "label" is the label. + ** + ** The depth argument is ignored for a file, and can be 0, 1, or + ** DAV_INFINITY for a collection. The depth argument only applies + ** with a label, not a version. + ** + ** If an error occurs in a child resource, then the return value is + ** non-NULL, and *response is set to a multistatus response. + ** + ** This hook is optional; if not defined, then the UPDATE method + ** will not be supported. + */ + dav_error * (*update)(const dav_resource *resource, + const dav_resource *version, + const char *label, + int depth, + dav_response **response); + + /* + ** Add a label to a version. The resource is either a specific + ** version, or a version selector, in which case the label should + ** be added to the current target of the version selector. The + ** version selector cannot be checked out. + ** + ** If replace != 0, any existing label by the same name is + ** effectively deleted first. Otherwise, it is an error to + ** attempt to add a label which already exists on some version + ** of the same history resource. + ** + ** This hook is optional; if not defined, then the LABEL method + ** will not be supported. If it is defined, then the remove_label + ** hook must be defined also. + */ + dav_error * (*add_label)(const dav_resource *resource, + const char *label, + int replace); + + /* + ** Remove a label from a version. The resource is either a specific + ** version, or a version selector, in which case the label should + ** be added to the current target of the version selector. The + ** version selector cannot be checked out. + ** + ** It is an error if no such label exists on the specified version. + ** + ** This hook is optional, but if defined, the add_label hook + ** must be defined also. + */ + dav_error * (*remove_label)(const dav_resource *resource, + const char *label); + + /* + ** Determine whether a null resource can be created as a workspace. + ** The provider may restrict workspaces to certain locations. + ** Returns 0 if the resource cannot be a workspace. + ** + ** This hook is optional; if the provider does not support workspaces, + ** it should be set to NULL. + */ + int (*can_be_workspace)(const dav_resource *resource); + + /* + ** Create a workspace resource. The resource must not already + ** exist. Any element is passed to the provider + ** in the "doc" structure; it may be empty. + ** + ** If workspace creation is succesful, the state of the resource + ** object is updated appropriately. + ** + ** This hook is optional; if the provider does not support workspaces, + ** it should be set to NULL. + */ + dav_error * (*make_workspace)(dav_resource *resource, + apr_xml_doc *doc); + + /* + ** Determine whether a null resource can be created as an activity. + ** The provider may restrict activities to certain locations. + ** Returns 0 if the resource cannot be an activity. + ** + ** This hook is optional; if the provider does not support activities, + ** it should be set to NULL. + */ + int (*can_be_activity)(const dav_resource *resource); + + /* + ** Create an activity resource. The resource must not already + ** exist. + ** + ** If activity creation is succesful, the state of the resource + ** object is updated appropriately. + ** + ** This hook is optional; if the provider does not support activities, + ** it should be set to NULL. + */ + dav_error * (*make_activity)(dav_resource *resource); + + /* + ** Merge a resource (tree) into target resource (tree). + ** + ** ### more doc... + ** + ** This hook is optional; if the provider does not support merging, + ** then this should be set to NULL. + */ + dav_error * (*merge)(dav_resource *target, dav_resource *source, + int no_auto_merge, int no_checkout, + apr_xml_elem *prop_elem, + ap_filter_t *output); + + /* + ** If a provider needs a context to associate with this hooks structure, + ** then this field may be used. In most cases, it will just be NULL. + */ + void *ctx; +}; + + +/* -------------------------------------------------------------------- +** +** BINDING FUNCTIONS +*/ + +/* binding provider hooks */ +struct dav_hooks_binding { + + /* Determine whether a resource can be the target of a binding. + * Returns 0 if the resource cannot be a binding target. + */ + int (*is_bindable)(const dav_resource *resource); + + /* Create a binding to a resource. + * The resource argument is the target of the binding; + * the binding argument must be a resource which does not already + * exist. + */ + dav_error * (*bind_resource)(const dav_resource *resource, + dav_resource *binding); + + /* + ** If a provider needs a context to associate with this hooks structure, + ** then this field may be used. In most cases, it will just be NULL. + */ + void *ctx; + +}; + + +/* -------------------------------------------------------------------- +** +** SEARCH(DASL) FUNCTIONS +*/ + +/* search provider hooks */ +struct dav_hooks_search { + /* Set header for a OPTION method + * An error may be returned. + * To set a hadder, this function might call + * apr_table_setn(r->headers_out, "DASL", dasl_optin1); + * + * Examples: + * DASL: + * DASL: + * DASL: + */ + dav_error * (*set_option_head)(request_rec *r); + + /* Search resources + * An error may be returned. *response will contain multistatus + * responses (if any) suitable for the body of the error. It is also + * possible to return NULL, yet still have multistatus responses. + * In this case, typically the caller should return a 207 (Multistatus) + * and the responses (in the body) as the HTTP response. + */ + dav_error * (*search_resource)(request_rec *r, + dav_response **response); + + /* + ** If a provider needs a context to associate with this hooks structure, + ** then this field may be used. In most cases, it will just be NULL. + */ + void *ctx; + +}; + + +/* -------------------------------------------------------------------- +** +** MISCELLANEOUS STUFF +*/ + +/* fetch the "LimitXMLRequestBody" in force for this resource */ +DAV_DECLARE(apr_size_t) dav_get_limit_xml_body(const request_rec *r); + +typedef struct { + int propid; /* live property ID */ + const dav_hooks_liveprop *provider; /* the provider defining this prop */ +} dav_elem_private; + +#ifdef __cplusplus +} +#endif + +#endif /* _MOD_DAV_H_ */ diff --git a/rubbos/app/httpd-2.0.64/modules/dav/main/modules.mk b/rubbos/app/httpd-2.0.64/modules/dav/main/modules.mk new file mode 100644 index 00000000..ceb52a1b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/dav/main/modules.mk @@ -0,0 +1,3 @@ +DISTCLEAN_TARGETS = modules.mk +static = +shared = diff --git a/rubbos/app/httpd-2.0.64/modules/dav/main/props.c b/rubbos/app/httpd-2.0.64/modules/dav/main/props.c new file mode 100644 index 00000000..fc28532d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/dav/main/props.c @@ -0,0 +1,1116 @@ +/* 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. + */ + +/* +** DAV extension module for Apache 2.0.* +** - Property database handling (repository-independent) +** +** NOTES: +** +** PROPERTY DATABASE +** +** This version assumes that there is a per-resource database provider +** to record properties. The database provider decides how and where to +** store these databases. +** +** The DBM keys for the properties have the following form: +** +** namespace ":" propname +** +** For example: 5:author +** +** The namespace provides an integer index into the namespace table +** (see below). propname is simply the property name, without a namespace +** prefix. +** +** A special case exists for properties that had a prefix starting with +** "xml". The XML Specification reserves these for future use. mod_dav +** stores and retrieves them unchanged. The keys for these properties +** have the form: +** +** ":" propname +** +** The propname will contain the prefix and the property name. For +** example, a key might be ":xmlfoo:name" +** +** The ":name" style will also be used for properties that do not +** exist within a namespace. +** +** The DBM values consist of two null-terminated strings, appended +** together (the null-terms are retained and stored in the database). +** The first string is the xml:lang value for the property. An empty +** string signifies that a lang value was not in context for the value. +** The second string is the property value itself. +** +** +** NAMESPACE TABLE +** +** The namespace table is an array that lists each of the namespaces +** that are in use by the properties in the given propdb. Each entry +** in the array is a simple URI. +** +** For example: http://www.foo.bar/standards/props/ +** +** The prefix used for the property is stripped and the URI for it +** is entered into the namespace table. Also, any namespaces used +** within the property value will be entered into the table (and +** stripped from the child elements). +** +** The namespaces are stored in the DBM database under the "METADATA" key. +** +** +** STRIPPING NAMESPACES +** +** Within the property values, the namespace declarations (xmlns...) +** are stripped. Each element and attribute will have its prefix removed +** and a new prefix inserted. +** +** This must be done so that we can return multiple properties in a +** PROPFIND which may have (originally) used conflicting prefixes. For +** that case, we must bind all property value elements to new namespace +** values. +** +** This implies that clients must NOT be sensitive to the namespace +** prefix used for their properties. It WILL change when the properties +** are returned (we return them as "ns", e.g. "ns5"). Also, the +** property value can contain ONLY XML elements and CDATA. PI and comment +** elements will be stripped. CDATA whitespace will be preserved, but +** whitespace within element tags will be altered. Attribute ordering +** may be altered. Element and CDATA ordering will be preserved. +** +** +** ATTRIBUTES ON PROPERTY NAME ELEMENTS +** +** When getting/setting properties, the XML used looks like: +** +** +** value +** value +** +** +** This implementation (mod_dav) DOES NOT save any attributes that are +** associated with the element. The property value is deemed +** to be only the contents ("value" in the above example). +** +** We do store the xml:lang value (if any) that applies to the context +** of the element. Whether the xml:lang attribute is on +** itself, or from a higher level element, we will store it +** with the property value. +** +** +** VERSIONING +** +** The DBM db contains a key named "METADATA" that holds database-level +** information, such as the namespace table. The record also contains the +** db's version number as the very first 16-bit value. This first number +** is actually stored as two single bytes: the first byte is a "major" +** version number. The second byte is a "minor" number. +** +** If the major number is not what mod_dav expects, then the db is closed +** immediately and an error is returned. A minor number change is +** acceptable -- it is presumed that old/new dav_props.c can deal with +** the database format. For example, a newer dav_props might update the +** minor value and append information to the end of the metadata record +** (which would be ignored by previous versions). +** +** +** ISSUES: +** +** At the moment, for the dav_get_allprops() and dav_get_props() functions, +** we must return a set of xmlns: declarations for ALL known namespaces +** in the file. There isn't a way to filter this because we don't know +** which are going to be used or not. Examining property names is not +** sufficient because the property values could use entirely different +** namespaces. +** +** ==> we must devise a scheme where we can "garbage collect" the namespace +** entries from the property database. +*/ + +#include "apr.h" +#include "apr_strings.h" + +#define APR_WANT_STDIO +#define APR_WANT_BYTEFUNC +#include "apr_want.h" + +#include "mod_dav.h" + +#include "http_log.h" +#include "http_request.h" + +/* +** There is some rough support for writable DAV:getcontenttype and +** DAV:getcontentlanguage properties. If this #define is (1), then +** this support is disabled. +** +** We are disabling it because of a lack of support in GET and PUT +** operations. For GET, it would be "expensive" to look for a propdb, +** open it, and attempt to extract the Content-Type and Content-Language +** values for the response. +** (Handling the PUT would not be difficult, though) +*/ +#define DAV_DISABLE_WRITABLE_PROPS 1 + +#define DAV_EMPTY_VALUE "\0" /* TWO null terms */ + +struct dav_propdb { + apr_pool_t *p; /* the pool we should use */ + request_rec *r; /* the request record */ + + const dav_resource *resource; /* the target resource */ + + int deferred; /* open of db has been deferred */ + dav_db *db; /* underlying database containing props */ + + apr_array_header_t *ns_xlate; /* translation of an elem->ns to URI */ + dav_namespace_map *mapping; /* namespace mapping */ + + dav_lockdb *lockdb; /* the lock database */ + + dav_buffer wb_lock; /* work buffer for lockdiscovery property */ + + /* if we ever run a GET subreq, it will be stored here */ + request_rec *subreq; + + /* hooks we should use for processing (based on the target resource) */ + const dav_hooks_db *db_hooks; +}; + +/* NOTE: dav_core_props[] and the following enum must stay in sync. */ +/* ### move these into a "core" liveprop provider? */ +static const char * const dav_core_props[] = +{ + "getcontenttype", + "getcontentlanguage", + "lockdiscovery", + "supportedlock", + + NULL /* sentinel */ +}; +enum { + DAV_PROPID_CORE_getcontenttype = DAV_PROPID_CORE, + DAV_PROPID_CORE_getcontentlanguage, + DAV_PROPID_CORE_lockdiscovery, + DAV_PROPID_CORE_supportedlock, + + DAV_PROPID_CORE_UNKNOWN +}; + +/* +** This structure is used to track information needed for a rollback. +*/ +typedef struct dav_rollback_item { + /* select one of the two rollback context structures based on the + value of dav_prop_ctx.is_liveprop */ + dav_deadprop_rollback *deadprop; + dav_liveprop_rollback *liveprop; + +} dav_rollback_item; + + +static int dav_find_liveprop_provider(dav_propdb *propdb, + const char *ns_uri, + const char *propname, + const dav_hooks_liveprop **provider) +{ + int propid; + + *provider = NULL; + + if (ns_uri == NULL) { + /* policy: liveprop providers cannot define no-namespace properties */ + return DAV_PROPID_CORE_UNKNOWN; + } + + /* check liveprop providers first, so they can define core properties */ + propid = dav_run_find_liveprop(propdb->resource, ns_uri, propname, + provider); + if (propid != 0) { + return propid; + } + + /* check for core property */ + if (strcmp(ns_uri, "DAV:") == 0) { + const char * const *p = dav_core_props; + + for (propid = DAV_PROPID_CORE; *p != NULL; ++p, ++propid) + if (strcmp(propname, *p) == 0) { + return propid; + } + } + + /* no provider for this property */ + return DAV_PROPID_CORE_UNKNOWN; +} + +static void dav_find_liveprop(dav_propdb *propdb, apr_xml_elem *elem) +{ + const char *ns_uri; + dav_elem_private *priv = elem->priv; + const dav_hooks_liveprop *hooks; + + + if (elem->ns == APR_XML_NS_NONE) + ns_uri = NULL; + else if (elem->ns == APR_XML_NS_DAV_ID) + ns_uri = "DAV:"; + else + ns_uri = APR_XML_GET_URI_ITEM(propdb->ns_xlate, elem->ns); + + priv->propid = dav_find_liveprop_provider(propdb, ns_uri, elem->name, + &hooks); + + /* ### this test seems redundant... */ + if (priv->propid != DAV_PROPID_CORE_UNKNOWN) { + priv->provider = hooks; + } +} + +/* is the live property read/write? */ +static int dav_rw_liveprop(dav_propdb *propdb, dav_elem_private *priv) +{ + int propid = priv->propid; + + /* + ** Check the liveprop provider (if this is a provider-defined prop) + */ + if (priv->provider != NULL) { + return (*priv->provider->is_writable)(propdb->resource, propid); + } + + /* these are defined as read-only */ + if (propid == DAV_PROPID_CORE_lockdiscovery +#if DAV_DISABLE_WRITABLE_PROPS + || propid == DAV_PROPID_CORE_getcontenttype + || propid == DAV_PROPID_CORE_getcontentlanguage +#endif + || propid == DAV_PROPID_CORE_supportedlock + ) { + + return 0; + } + + /* these are defined as read/write */ + if (propid == DAV_PROPID_CORE_getcontenttype + || propid == DAV_PROPID_CORE_getcontentlanguage + || propid == DAV_PROPID_CORE_UNKNOWN) { + + return 1; + } + + /* + ** We don't recognize the property, so it must be dead (and writable) + */ + return 1; +} + +/* do a sub-request to fetch properties for the target resource's URI. */ +static void dav_do_prop_subreq(dav_propdb *propdb) +{ + /* perform a "GET" on the resource's URI (note that the resource + may not correspond to the current request!). */ + propdb->subreq = ap_sub_req_lookup_uri(propdb->resource->uri, propdb->r, + NULL); +} + +static dav_error * dav_insert_coreprop(dav_propdb *propdb, + int propid, const char *name, + dav_prop_insert what, + apr_text_header *phdr, + dav_prop_insert *inserted) +{ + const char *value = NULL; + dav_error *err; + + *inserted = DAV_PROP_INSERT_NOTDEF; + + /* fast-path the common case */ + if (propid == DAV_PROPID_CORE_UNKNOWN) + return NULL; + + switch (propid) { + + case DAV_PROPID_CORE_lockdiscovery: + if (propdb->lockdb != NULL) { + dav_lock *locks; + + if ((err = dav_lock_query(propdb->lockdb, propdb->resource, + &locks)) != NULL) { + return dav_push_error(propdb->p, err->status, 0, + "DAV:lockdiscovery could not be " + "determined due to a problem fetching " + "the locks for this resource.", + err); + } + + /* fast-path the no-locks case */ + if (locks == NULL) { + value = ""; + } + else { + /* + ** This may modify the buffer. value may point to + ** wb_lock.pbuf or a string constant. + */ + value = dav_lock_get_activelock(propdb->r, locks, + &propdb->wb_lock); + + /* make a copy to isolate it from changes to wb_lock */ + value = apr_pstrdup(propdb->p, propdb->wb_lock.buf); + } + } + break; + + case DAV_PROPID_CORE_supportedlock: + if (propdb->lockdb != NULL) { + value = (*propdb->lockdb->hooks->get_supportedlock)(propdb->resource); + } + break; + + case DAV_PROPID_CORE_getcontenttype: + if (propdb->subreq == NULL) { + dav_do_prop_subreq(propdb); + } + if (propdb->subreq->content_type != NULL) { + value = propdb->subreq->content_type; + } + break; + + case DAV_PROPID_CORE_getcontentlanguage: + { + const char *lang; + + if (propdb->subreq == NULL) { + dav_do_prop_subreq(propdb); + } + if ((lang = apr_table_get(propdb->subreq->headers_out, + "Content-Language")) != NULL) { + value = lang; + } + break; + } + + default: + /* fall through to interpret as a dead property */ + break; + } + + /* if something was supplied, then insert it */ + if (value != NULL) { + const char *s; + + if (what == DAV_PROP_INSERT_SUPPORTED) { + /* use D: prefix to refer to the DAV: namespace URI, + * and let the namespace attribute default to "DAV:" + */ + s = apr_psprintf(propdb->p, + "" DEBUG_CR, + name); + } + else if (what == DAV_PROP_INSERT_VALUE && *value != '\0') { + /* use D: prefix to refer to the DAV: namespace URI */ + s = apr_psprintf(propdb->p, "%s" DEBUG_CR, + name, value, name); + } + else { + /* use D: prefix to refer to the DAV: namespace URI */ + s = apr_psprintf(propdb->p, "" DEBUG_CR, name); + } + apr_text_append(propdb->p, phdr, s); + + *inserted = what; + } + + return NULL; +} + +static dav_error * dav_insert_liveprop(dav_propdb *propdb, + const apr_xml_elem *elem, + dav_prop_insert what, + apr_text_header *phdr, + dav_prop_insert *inserted) +{ + dav_elem_private *priv = elem->priv; + + *inserted = DAV_PROP_INSERT_NOTDEF; + + if (priv->provider == NULL) { + /* this is a "core" property that we define */ + return dav_insert_coreprop(propdb, priv->propid, elem->name, + what, phdr, inserted); + } + + /* ask the provider (that defined this prop) to insert the prop */ + *inserted = (*priv->provider->insert_prop)(propdb->resource, priv->propid, + what, phdr); + + return NULL; +} + +static void dav_output_prop_name(apr_pool_t *pool, + const dav_prop_name *name, + dav_xmlns_info *xi, + apr_text_header *phdr) +{ + const char *s; + + if (*name->ns == '\0') + s = apr_psprintf(pool, "<%s/>" DEBUG_CR, name->name); + else { + const char *prefix = dav_xmlns_add_uri(xi, name->ns); + + s = apr_psprintf(pool, "<%s:%s/>" DEBUG_CR, prefix, name->name); + } + + apr_text_append(pool, phdr, s); +} + +static void dav_insert_xmlns(apr_pool_t *p, const char *pre_prefix, int ns, + const char *ns_uri, apr_text_header *phdr) +{ + const char *s; + + s = apr_psprintf(p, " xmlns:%s%d=\"%s\"", pre_prefix, ns, ns_uri); + apr_text_append(p, phdr, s); +} + +static dav_error *dav_really_open_db(dav_propdb *propdb, int ro) +{ + dav_error *err; + + /* we're trying to open the db; turn off the 'deferred' flag */ + propdb->deferred = 0; + + /* ask the DB provider to open the thing */ + err = (*propdb->db_hooks->open)(propdb->p, propdb->resource, ro, + &propdb->db); + if (err != NULL) { + return dav_push_error(propdb->p, HTTP_INTERNAL_SERVER_ERROR, + DAV_ERR_PROP_OPENING, + "Could not open the property database.", + err); + } + + /* + ** NOTE: propdb->db could be NULL if we attempted to open a readonly + ** database that doesn't exist. If we require read/write + ** access, then a database was created and opened. + */ + + return NULL; +} + +DAV_DECLARE(dav_error *)dav_open_propdb(request_rec *r, dav_lockdb *lockdb, + const dav_resource *resource, + int ro, + apr_array_header_t * ns_xlate, + dav_propdb **p_propdb) +{ + dav_propdb *propdb = apr_pcalloc(r->pool, sizeof(*propdb)); + + *p_propdb = NULL; + +#if DAV_DEBUG + if (resource->uri == NULL) { + return dav_new_error(r->pool, HTTP_INTERNAL_SERVER_ERROR, 0, + "INTERNAL DESIGN ERROR: resource must define " + "its URI."); + } +#endif + + propdb->r = r; + propdb->p = r->pool; /* ### get rid of this */ + propdb->resource = resource; + propdb->ns_xlate = ns_xlate; + + propdb->db_hooks = DAV_GET_HOOKS_PROPDB(r); + + propdb->lockdb = lockdb; + + /* always defer actual open, to avoid expense of accessing db + * when only live properties are involved + */ + propdb->deferred = 1; + + /* ### what to do about closing the propdb on server failure? */ + + *p_propdb = propdb; + return NULL; +} + +DAV_DECLARE(void) dav_close_propdb(dav_propdb *propdb) +{ + if (propdb->db == NULL) + return; + + (*propdb->db_hooks->close)(propdb->db); +} + +DAV_DECLARE(dav_get_props_result) dav_get_allprops(dav_propdb *propdb, + dav_prop_insert what) +{ + const dav_hooks_db *db_hooks = propdb->db_hooks; + apr_text_header hdr = { 0 }; + apr_text_header hdr_ns = { 0 }; + dav_get_props_result result = { 0 }; + int found_contenttype = 0; + int found_contentlang = 0; + dav_prop_insert unused_inserted; + + /* if not just getting supported live properties, + * scan all properties in the dead prop database + */ + if (what != DAV_PROP_INSERT_SUPPORTED) { + if (propdb->deferred) { + /* ### what to do with db open error? */ + (void) dav_really_open_db(propdb, 1 /*ro*/); + } + + /* initialize the result with some start tags... */ + apr_text_append(propdb->p, &hdr, + "" DEBUG_CR + "" DEBUG_CR); + + /* if there ARE properties, then scan them */ + if (propdb->db != NULL) { + dav_xmlns_info *xi = dav_xmlns_create(propdb->p); + dav_prop_name name; + + /* define (up front) any namespaces the db might need */ + (void) (*db_hooks->define_namespaces)(propdb->db, xi); + + /* get the first property name, beginning the scan */ + (void) (*db_hooks->first_name)(propdb->db, &name); + while (name.ns != NULL) { + + /* + ** We also look for and + ** . If they are not stored as dead + ** properties, then we need to perform a subrequest to get + ** their values (if any). + */ + if (*name.ns == 'D' && strcmp(name.ns, "DAV:") == 0 + && *name.name == 'g') { + if (strcmp(name.name, "getcontenttype") == 0) { + found_contenttype = 1; + } + else if (strcmp(name.name, "getcontentlanguage") == 0) { + found_contentlang = 1; + } + } + + if (what == DAV_PROP_INSERT_VALUE) { + dav_error *err; + int found; + + if ((err = (*db_hooks->output_value)(propdb->db, &name, + xi, &hdr, + &found)) != NULL) { + /* ### anything better to do? */ + /* ### probably should enter a 500 error */ + goto next_key; + } + /* assert: found == 1 */ + } + else { + /* the value was not requested, so just add an empty + tag specifying the property name. */ + dav_output_prop_name(propdb->p, &name, xi, &hdr); + } + + next_key: + (void) (*db_hooks->next_name)(propdb->db, &name); + } + + /* all namespaces have been entered into xi. generate them into + the output now. */ + dav_xmlns_generate(xi, &hdr_ns); + + } /* propdb->db != NULL */ + + /* add namespaces for all the liveprop providers */ + dav_add_all_liveprop_xmlns(propdb->p, &hdr_ns); + } + + /* ask the liveprop providers to insert their properties */ + dav_run_insert_all_liveprops(propdb->r, propdb->resource, what, &hdr); + + /* insert the standard properties */ + /* ### should be handling the return errors here */ + (void)dav_insert_coreprop(propdb, + DAV_PROPID_CORE_supportedlock, "supportedlock", + what, &hdr, &unused_inserted); + (void)dav_insert_coreprop(propdb, + DAV_PROPID_CORE_lockdiscovery, "lockdiscovery", + what, &hdr, &unused_inserted); + + /* if we didn't find these, then do the whole subreq thing. */ + if (!found_contenttype) { + /* ### should be handling the return error here */ + (void)dav_insert_coreprop(propdb, + DAV_PROPID_CORE_getcontenttype, + "getcontenttype", + what, &hdr, &unused_inserted); + } + if (!found_contentlang) { + /* ### should be handling the return error here */ + (void)dav_insert_coreprop(propdb, + DAV_PROPID_CORE_getcontentlanguage, + "getcontentlanguage", + what, &hdr, &unused_inserted); + } + + /* if not just reporting on supported live props, + * terminate the result */ + if (what != DAV_PROP_INSERT_SUPPORTED) { + apr_text_append(propdb->p, &hdr, + "" DEBUG_CR + "HTTP/1.1 200 OK" DEBUG_CR + "" DEBUG_CR); + } + + result.propstats = hdr.first; + result.xmlns = hdr_ns.first; + return result; +} + +DAV_DECLARE(dav_get_props_result) dav_get_props(dav_propdb *propdb, + apr_xml_doc *doc) +{ + const dav_hooks_db *db_hooks = propdb->db_hooks; + apr_xml_elem *elem = dav_find_child(doc->root, "prop"); + apr_text_header hdr_good = { 0 }; + apr_text_header hdr_bad = { 0 }; + apr_text_header hdr_ns = { 0 }; + int have_good = 0; + dav_get_props_result result = { 0 }; + char *marks_liveprop; + dav_xmlns_info *xi; + int xi_filled = 0; + + /* ### NOTE: we should pass in TWO buffers -- one for keys, one for + the marks */ + + /* we will ALWAYS provide a "good" result, even if it is EMPTY */ + apr_text_append(propdb->p, &hdr_good, + "" DEBUG_CR + "" DEBUG_CR); + + /* ### the marks should be in a buffer! */ + /* allocate zeroed-memory for the marks. These marks indicate which + liveprop namespaces we've generated into the output xmlns buffer */ + + /* same for the liveprops */ + marks_liveprop = apr_pcalloc(propdb->p, dav_get_liveprop_ns_count() + 1); + + xi = dav_xmlns_create(propdb->p); + + for (elem = elem->first_child; elem; elem = elem->next) { + dav_elem_private *priv; + dav_error *err; + dav_prop_insert inserted; + dav_prop_name name; + + /* + ** First try live property providers; if they don't handle + ** the property, then try looking it up in the propdb. + */ + + if (elem->priv == NULL) { + elem->priv = apr_pcalloc(propdb->p, sizeof(*priv)); + } + priv = elem->priv; + + /* cache the propid; dav_get_props() could be called many times */ + if (priv->propid == 0) + dav_find_liveprop(propdb, elem); + + if (priv->propid != DAV_PROPID_CORE_UNKNOWN) { + + /* insert the property. returns 1 if an insertion was done. */ + if ((err = dav_insert_liveprop(propdb, elem, DAV_PROP_INSERT_VALUE, + &hdr_good, &inserted)) != NULL) { + /* ### need to propagate the error to the caller... */ + /* ### skip it for now, as if nothing was inserted */ + } + if (inserted == DAV_PROP_INSERT_VALUE) { + have_good = 1; + + /* + ** Add the liveprop's namespace URIs. Note that provider==NULL + ** for core properties. + */ + if (priv->provider != NULL) { + const char * const * scan_ns_uri; + + for (scan_ns_uri = priv->provider->namespace_uris; + *scan_ns_uri != NULL; + ++scan_ns_uri) { + int ns; + + ns = dav_get_liveprop_ns_index(*scan_ns_uri); + if (marks_liveprop[ns]) + continue; + marks_liveprop[ns] = 1; + + dav_insert_xmlns(propdb->p, "lp", ns, *scan_ns_uri, + &hdr_ns); + } + } + + /* property added. move on to the next property. */ + continue; + } + else if (inserted == DAV_PROP_INSERT_NOTDEF) { + /* nothing to do. fall thru to allow property to be handled + as a dead property */ + } +#if DAV_DEBUG + else { +#if 0 + /* ### need to change signature to return an error */ + return dav_new_error(propdb->p, HTTP_INTERNAL_SERVER_ERROR, 0, + "INTERNAL DESIGN ERROR: insert_liveprop " + "did not insert what was asked for."); +#endif + } +#endif + } + + /* The property wasn't a live property, so look in the dead property + database. */ + + /* make sure propdb is really open */ + if (propdb->deferred) { + /* ### what to do with db open error? */ + (void) dav_really_open_db(propdb, 1 /*ro*/); + } + + if (elem->ns == APR_XML_NS_NONE) + name.ns = ""; + else + name.ns = APR_XML_GET_URI_ITEM(propdb->ns_xlate, elem->ns); + name.name = elem->name; + + /* only bother to look if a database exists */ + if (propdb->db != NULL) { + int found; + + if ((err = (*db_hooks->output_value)(propdb->db, &name, + xi, &hdr_good, + &found)) != NULL) { + /* ### what to do? continue doesn't seem right... */ + continue; + } + + if (found) { + have_good = 1; + + /* if we haven't added the db's namespaces, then do so... */ + if (!xi_filled) { + (void) (*db_hooks->define_namespaces)(propdb->db, xi); + xi_filled = 1; + } + continue; + } + } + + /* not found as a live OR dead property. add a record to the "bad" + propstats */ + + /* make sure we've started our "bad" propstat */ + if (hdr_bad.first == NULL) { + apr_text_append(propdb->p, &hdr_bad, + "" DEBUG_CR + "" DEBUG_CR); + } + + /* output this property's name (into the bad propstats) */ + dav_output_prop_name(propdb->p, &name, xi, &hdr_bad); + } + + apr_text_append(propdb->p, &hdr_good, + "" DEBUG_CR + "HTTP/1.1 200 OK" DEBUG_CR + "" DEBUG_CR); + + /* default to start with the good */ + result.propstats = hdr_good.first; + + /* we may not have any "bad" results */ + if (hdr_bad.first != NULL) { + /* "close" the bad propstat */ + apr_text_append(propdb->p, &hdr_bad, + "" DEBUG_CR + "HTTP/1.1 404 Not Found" DEBUG_CR + "" DEBUG_CR); + + /* if there are no good props, then just return the bad */ + if (!have_good) { + result.propstats = hdr_bad.first; + } + else { + /* hook the bad propstat to the end of the good one */ + hdr_good.last->next = hdr_bad.first; + } + } + + /* add in all the various namespaces, and return them */ + dav_xmlns_generate(xi, &hdr_ns); + result.xmlns = hdr_ns.first; + + return result; +} + +DAV_DECLARE(void) dav_get_liveprop_supported(dav_propdb *propdb, + const char *ns_uri, + const char *propname, + apr_text_header *body) +{ + int propid; + const dav_hooks_liveprop *hooks; + + propid = dav_find_liveprop_provider(propdb, ns_uri, propname, &hooks); + + if (propid != DAV_PROPID_CORE_UNKNOWN) { + if (hooks == NULL) { + /* this is a "core" property that we define */ + dav_prop_insert unused_inserted; + dav_insert_coreprop(propdb, propid, propname, + DAV_PROP_INSERT_SUPPORTED, body, &unused_inserted); + } + else { + (*hooks->insert_prop)(propdb->resource, propid, + DAV_PROP_INSERT_SUPPORTED, body); + } + } +} + +DAV_DECLARE_NONSTD(void) dav_prop_validate(dav_prop_ctx *ctx) +{ + dav_propdb *propdb = ctx->propdb; + apr_xml_elem *prop = ctx->prop; + dav_elem_private *priv; + + priv = ctx->prop->priv = apr_pcalloc(propdb->p, sizeof(*priv)); + + /* + ** Check to see if this is a live property, and fill the fields + ** in the XML elem, as appropriate. + ** + ** Verify that the property is read/write. If not, then it cannot + ** be SET or DELETEd. + */ + if (priv->propid == 0) { + dav_find_liveprop(propdb, prop); + + /* it's a liveprop if a provider was found */ + /* ### actually the "core" props should really be liveprops, but + ### there is no "provider" for those and the r/w props are + ### treated as dead props anyhow */ + ctx->is_liveprop = priv->provider != NULL; + } + + if (!dav_rw_liveprop(propdb, priv)) { + ctx->err = dav_new_error(propdb->p, HTTP_CONFLICT, + DAV_ERR_PROP_READONLY, + "Property is read-only."); + return; + } + + if (ctx->is_liveprop) { + int defer_to_dead = 0; + + ctx->err = (*priv->provider->patch_validate)(propdb->resource, + prop, ctx->operation, + &ctx->liveprop_ctx, + &defer_to_dead); + if (ctx->err != NULL || !defer_to_dead) + return; + + /* clear is_liveprop -- act as a dead prop now */ + ctx->is_liveprop = 0; + } + + /* + ** The property is supposed to be stored into the dead-property + ** database. Make sure the thing is truly open (and writable). + */ + if (propdb->deferred + && (ctx->err = dav_really_open_db(propdb, 0 /* ro */)) != NULL) { + return; + } + + /* + ** There should be an open, writable database in here! + ** + ** Note: the database would be NULL if it was opened readonly and it + ** did not exist. + */ + if (propdb->db == NULL) { + ctx->err = dav_new_error(propdb->p, HTTP_INTERNAL_SERVER_ERROR, + DAV_ERR_PROP_NO_DATABASE, + "Attempted to set/remove a property " + "without a valid, open, read/write " + "property database."); + return; + } + + if (ctx->operation == DAV_PROP_OP_SET) { + /* + ** Prep the element => propdb namespace index mapping, inserting + ** namespace URIs into the propdb that don't exist. + */ + (void) (*propdb->db_hooks->map_namespaces)(propdb->db, + propdb->ns_xlate, + &propdb->mapping); + } + else if (ctx->operation == DAV_PROP_OP_DELETE) { + /* + ** There are no checks to perform here. If a property exists, then + ** we will delete it. If it does not exist, then it does not matter + ** (see S12.13.1). + ** + ** Note that if a property does not exist, that does not rule out + ** that a SET will occur during this PROPPATCH (thusly creating it). + */ + } +} + +DAV_DECLARE_NONSTD(void) dav_prop_exec(dav_prop_ctx *ctx) +{ + dav_propdb *propdb = ctx->propdb; + dav_error *err = NULL; + dav_elem_private *priv = ctx->prop->priv; + + ctx->rollback = apr_pcalloc(propdb->p, sizeof(*ctx->rollback)); + + if (ctx->is_liveprop) { + err = (*priv->provider->patch_exec)(propdb->resource, + ctx->prop, ctx->operation, + ctx->liveprop_ctx, + &ctx->rollback->liveprop); + } + else { + dav_prop_name name; + + if (ctx->prop->ns == APR_XML_NS_NONE) + name.ns = ""; + else + name.ns = APR_XML_GET_URI_ITEM(propdb->ns_xlate, ctx->prop->ns); + name.name = ctx->prop->name; + + /* save the old value so that we can do a rollback. */ + if ((err = (*propdb->db_hooks + ->get_rollback)(propdb->db, &name, + &ctx->rollback->deadprop)) != NULL) + goto error; + + if (ctx->operation == DAV_PROP_OP_SET) { + + /* Note: propdb->mapping was set in dav_prop_validate() */ + err = (*propdb->db_hooks->store)(propdb->db, &name, ctx->prop, + propdb->mapping); + + /* + ** If an error occurred, then assume that we didn't change the + ** value. Remove the rollback item so that we don't try to set + ** its value during the rollback. + */ + /* ### euh... where is the removal? */ + } + else if (ctx->operation == DAV_PROP_OP_DELETE) { + + /* + ** Delete the property. Ignore errors -- the property is there, or + ** we are deleting it for a second time. + */ + /* ### but what about other errors? */ + (void) (*propdb->db_hooks->remove)(propdb->db, &name); + } + } + + error: + /* push a more specific error here */ + if (err != NULL) { + /* + ** Use HTTP_INTERNAL_SERVER_ERROR because we shouldn't have seen + ** any errors at this point. + */ + ctx->err = dav_push_error(propdb->p, HTTP_INTERNAL_SERVER_ERROR, + DAV_ERR_PROP_EXEC, + "Could not execute PROPPATCH.", err); + } +} + +DAV_DECLARE_NONSTD(void) dav_prop_commit(dav_prop_ctx *ctx) +{ + dav_elem_private *priv = ctx->prop->priv; + + /* + ** Note that a commit implies ctx->err is NULL. The caller should assume + ** a status of HTTP_OK for this case. + */ + + if (ctx->is_liveprop) { + (*priv->provider->patch_commit)(ctx->propdb->resource, + ctx->operation, + ctx->liveprop_ctx, + ctx->rollback->liveprop); + } +} + +DAV_DECLARE_NONSTD(void) dav_prop_rollback(dav_prop_ctx *ctx) +{ + dav_error *err = NULL; + dav_elem_private *priv = ctx->prop->priv; + + /* do nothing if there is no rollback information. */ + if (ctx->rollback == NULL) + return; + + /* + ** ### if we have an error, and a rollback occurs, then the namespace + ** ### mods should not happen at all. Basically, the namespace management + ** ### is simply a bitch. + */ + + if (ctx->is_liveprop) { + err = (*priv->provider->patch_rollback)(ctx->propdb->resource, + ctx->operation, + ctx->liveprop_ctx, + ctx->rollback->liveprop); + } + else { + err = (*ctx->propdb->db_hooks + ->apply_rollback)(ctx->propdb->db, ctx->rollback->deadprop); + } + + if (err != NULL) { + if (ctx->err == NULL) + ctx->err = err; + else { + dav_error *scan = err; + + /* hook previous errors at the end of the rollback error */ + while (scan->prev != NULL) + scan = scan->prev; + scan->prev = ctx->err; + ctx->err = err; + } + } +} diff --git a/rubbos/app/httpd-2.0.64/modules/dav/main/providers.c b/rubbos/app/httpd-2.0.64/modules/dav/main/providers.c new file mode 100644 index 00000000..a2ccd1ca --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/dav/main/providers.c @@ -0,0 +1,33 @@ +/* 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. + */ + +#include "apr_pools.h" +#include "apr_hash.h" +#include "ap_provider.h" +#include "mod_dav.h" + +#define DAV_PROVIDER_GROUP "dav" + +DAV_DECLARE(void) dav_register_provider(apr_pool_t *p, const char *name, + const dav_provider *provider) +{ + ap_register_provider(p, DAV_PROVIDER_GROUP, name, "0", provider); +} + +DAV_DECLARE(const dav_provider *) dav_lookup_provider(const char *name) +{ + return ap_lookup_provider(DAV_PROVIDER_GROUP, name, "0"); +} diff --git a/rubbos/app/httpd-2.0.64/modules/dav/main/std_liveprop.c b/rubbos/app/httpd-2.0.64/modules/dav/main/std_liveprop.c new file mode 100644 index 00000000..e97d0fda --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/dav/main/std_liveprop.c @@ -0,0 +1,194 @@ +/* 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. + */ + +#include "httpd.h" +#include "util_xml.h" +#include "apr_strings.h" + +#include "mod_dav.h" + +/* forward-declare */ +static const dav_hooks_liveprop dav_core_hooks_liveprop; + +/* +** The namespace URIs that we use. There will only ever be "DAV:". +*/ +static const char * const dav_core_namespace_uris[] = +{ + "DAV:", + NULL /* sentinel */ +}; + +/* +** Define each of the core properties that this provider will handle. +** Note that all of them are in the DAV: namespace, which has a +** provider-local index of 0. +*/ +static const dav_liveprop_spec dav_core_props[] = +{ + { 0, "comment", DAV_PROPID_comment, 1 }, + { 0, "creator-displayname", DAV_PROPID_creator_displayname, 1 }, + { 0, "displayname", DAV_PROPID_displayname, 1 }, + { 0, "resourcetype", DAV_PROPID_resourcetype, 0 }, + { 0, "source", DAV_PROPID_source, 1 }, + + { 0 } /* sentinel */ +}; + +static const dav_liveprop_group dav_core_liveprop_group = +{ + dav_core_props, + dav_core_namespace_uris, + &dav_core_hooks_liveprop +}; + +static dav_prop_insert dav_core_insert_prop(const dav_resource *resource, + int propid, dav_prop_insert what, + apr_text_header *phdr) +{ + const char *value; + const char *s; + apr_pool_t *p = resource->pool; + const dav_liveprop_spec *info; + int global_ns; + + switch (propid) + { + case DAV_PROPID_resourcetype: + switch (resource->type) { + case DAV_RESOURCE_TYPE_VERSION: + if (resource->baselined) { + value = ""; + break; + } + /* fall through */ + case DAV_RESOURCE_TYPE_REGULAR: + case DAV_RESOURCE_TYPE_WORKING: + if (resource->collection) { + value = ""; + } + else { + /* ### should we denote lock-null resources? */ + + value = ""; /* becomes: */ + } + break; + case DAV_RESOURCE_TYPE_HISTORY: + value = ""; + break; + case DAV_RESOURCE_TYPE_WORKSPACE: + value = ""; + break; + case DAV_RESOURCE_TYPE_ACTIVITY: + value = ""; + break; + + default: + /* ### bad juju */ + return DAV_PROP_INSERT_NOTDEF; + } + break; + + case DAV_PROPID_comment: + case DAV_PROPID_creator_displayname: + case DAV_PROPID_displayname: + case DAV_PROPID_source: + default: + /* + ** This property is known, but not defined as a liveprop. However, + ** it may be a dead property. + */ + return DAV_PROP_INSERT_NOTDEF; + } + + /* assert: value != NULL */ + + /* get the information and global NS index for the property */ + global_ns = dav_get_liveprop_info(propid, &dav_core_liveprop_group, &info); + + /* assert: info != NULL && info->name != NULL */ + + if (what == DAV_PROP_INSERT_SUPPORTED) { + s = apr_psprintf(p, + "" DEBUG_CR, + info->name, dav_core_namespace_uris[info->ns]); + } + else if (what == DAV_PROP_INSERT_VALUE && *value != '\0') { + s = apr_psprintf(p, "%s" DEBUG_CR, + global_ns, info->name, value, global_ns, info->name); + } + else { + s = apr_psprintf(p, "" DEBUG_CR, global_ns, info->name); + } + apr_text_append(p, phdr, s); + + /* we inserted what was asked for */ + return what; +} + +static int dav_core_is_writable(const dav_resource *resource, int propid) +{ + const dav_liveprop_spec *info; + + (void) dav_get_liveprop_info(propid, &dav_core_liveprop_group, &info); + return info->is_writable; +} + +static dav_error * dav_core_patch_validate(const dav_resource *resource, + const apr_xml_elem *elem, + int operation, void **context, + int *defer_to_dead) +{ + /* all of our writable props go in the dead prop database */ + *defer_to_dead = 1; + + return NULL; +} + +static const dav_hooks_liveprop dav_core_hooks_liveprop = { + dav_core_insert_prop, + dav_core_is_writable, + dav_core_namespace_uris, + dav_core_patch_validate, + NULL, /* patch_exec */ + NULL, /* patch_commit */ + NULL, /* patch_rollback */ +}; + +DAV_DECLARE_NONSTD(int) dav_core_find_liveprop( + const dav_resource *resource, + const char *ns_uri, const char *name, + const dav_hooks_liveprop **hooks) +{ + return dav_do_find_liveprop(ns_uri, name, &dav_core_liveprop_group, hooks); +} + +DAV_DECLARE_NONSTD(void) dav_core_insert_all_liveprops( + request_rec *r, + const dav_resource *resource, + dav_prop_insert what, + apr_text_header *phdr) +{ + (void) dav_core_insert_prop(resource, DAV_PROPID_resourcetype, + what, phdr); +} + +DAV_DECLARE_NONSTD(void) dav_core_register_uris(apr_pool_t *p) +{ + /* register the namespace URIs */ + dav_register_liveprop_group(p, &dav_core_liveprop_group); +} diff --git a/rubbos/app/httpd-2.0.64/modules/dav/main/util.c b/rubbos/app/httpd-2.0.64/modules/dav/main/util.c new file mode 100644 index 00000000..3ff3a19f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/dav/main/util.c @@ -0,0 +1,2021 @@ +/* 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. + */ + +/* +** DAV extension module for Apache 2.0.* +** - various utilities, repository-independent +*/ + +#include "apr_strings.h" +#include "apr_lib.h" + +#define APR_WANT_STRFUNC +#include "apr_want.h" + +#include "mod_dav.h" + +#include "http_request.h" +#include "http_config.h" +#include "http_vhost.h" +#include "http_log.h" +#include "http_protocol.h" + +DAV_DECLARE(dav_error*) dav_new_error(apr_pool_t *p, int status, + int error_id, const char *desc) +{ + int save_errno = errno; + dav_error *err = apr_pcalloc(p, sizeof(*err)); + + /* DBG3("dav_new_error: %d %d %s", status, error_id, desc ? desc : "(no desc)"); */ + + err->status = status; + err->error_id = error_id; + err->desc = desc; + err->save_errno = save_errno; + + return err; +} + +DAV_DECLARE(dav_error*) dav_new_error_tag(apr_pool_t *p, int status, + int error_id, const char *desc, + const char *namespace, + const char *tagname) +{ + dav_error *err = dav_new_error(p, status, error_id, desc); + + err->tagname = tagname; + err->namespace = namespace; + + return err; +} + + +DAV_DECLARE(dav_error*) dav_push_error(apr_pool_t *p, int status, + int error_id, const char *desc, + dav_error *prev) +{ + dav_error *err = apr_pcalloc(p, sizeof(*err)); + + err->status = status; + err->error_id = error_id; + err->desc = desc; + err->prev = prev; + + return err; +} + +DAV_DECLARE(void) dav_check_bufsize(apr_pool_t * p, dav_buffer *pbuf, + apr_size_t extra_needed) +{ + /* grow the buffer if necessary */ + if (pbuf->cur_len + extra_needed > pbuf->alloc_len) { + char *newbuf; + + pbuf->alloc_len += extra_needed + DAV_BUFFER_PAD; + newbuf = apr_palloc(p, pbuf->alloc_len); + memcpy(newbuf, pbuf->buf, pbuf->cur_len); + pbuf->buf = newbuf; + } +} + +DAV_DECLARE(void) dav_set_bufsize(apr_pool_t * p, dav_buffer *pbuf, + apr_size_t size) +{ + /* NOTE: this does not retain prior contents */ + + /* NOTE: this function is used to init the first pointer, too, since + the PAD will be larger than alloc_len (0) for zeroed structures */ + + /* grow if we don't have enough for the requested size plus padding */ + if (size + DAV_BUFFER_PAD > pbuf->alloc_len) { + /* set the new length; min of MINSIZE */ + pbuf->alloc_len = size + DAV_BUFFER_PAD; + if (pbuf->alloc_len < DAV_BUFFER_MINSIZE) + pbuf->alloc_len = DAV_BUFFER_MINSIZE; + + pbuf->buf = apr_palloc(p, pbuf->alloc_len); + } + pbuf->cur_len = size; +} + + +/* initialize a buffer and copy the specified (null-term'd) string into it */ +DAV_DECLARE(void) dav_buffer_init(apr_pool_t *p, dav_buffer *pbuf, + const char *str) +{ + dav_set_bufsize(p, pbuf, strlen(str)); + memcpy(pbuf->buf, str, pbuf->cur_len + 1); +} + +/* append a string to the end of the buffer, adjust length */ +DAV_DECLARE(void) dav_buffer_append(apr_pool_t *p, dav_buffer *pbuf, + const char *str) +{ + apr_size_t len = strlen(str); + + dav_check_bufsize(p, pbuf, len + 1); + memcpy(pbuf->buf + pbuf->cur_len, str, len + 1); + pbuf->cur_len += len; +} + +/* place a string on the end of the buffer, do NOT adjust length */ +DAV_DECLARE(void) dav_buffer_place(apr_pool_t *p, dav_buffer *pbuf, + const char *str) +{ + apr_size_t len = strlen(str); + + dav_check_bufsize(p, pbuf, len + 1); + memcpy(pbuf->buf + pbuf->cur_len, str, len + 1); +} + +/* place some memory on the end of a buffer; do NOT adjust length */ +DAV_DECLARE(void) dav_buffer_place_mem(apr_pool_t *p, dav_buffer *pbuf, + const void *mem, apr_size_t amt, + apr_size_t pad) +{ + dav_check_bufsize(p, pbuf, amt + pad); + memcpy(pbuf->buf + pbuf->cur_len, mem, amt); +} + +/* +** dav_lookup_uri() +** +** Extension for ap_sub_req_lookup_uri() which can't handle absolute +** URIs properly. +** +** If NULL is returned, then an error occurred with parsing the URI or +** the URI does not match the current server. +*/ +DAV_DECLARE(dav_lookup_result) dav_lookup_uri(const char *uri, + request_rec * r, + int must_be_absolute) +{ + dav_lookup_result result = { 0 }; + const char *scheme; + apr_port_t port; + apr_uri_t comp; + char *new_file; + const char *domain; + + /* first thing to do is parse the URI into various components */ + if (apr_uri_parse(r->pool, uri, &comp) != APR_SUCCESS) { + result.err.status = HTTP_BAD_REQUEST; + result.err.desc = "Invalid syntax in Destination URI."; + return result; + } + + /* the URI must be an absoluteURI (WEBDAV S9.3) */ + if (comp.scheme == NULL && must_be_absolute) { + result.err.status = HTTP_BAD_REQUEST; + result.err.desc = "Destination URI must be an absolute URI."; + return result; + } + + /* the URI must not have a query (args) or a fragment */ + if (comp.query != NULL || comp.fragment != NULL) { + result.err.status = HTTP_BAD_REQUEST; + result.err.desc = + "Destination URI contains invalid components " + "(a query or a fragment)."; + return result; + } + + /* If the scheme or port was provided, then make sure that it matches + the scheme/port of this request. If the request must be absolute, + then require the (explicit/implicit) scheme/port be matching. + + ### hmm. if a port wasn't provided (does the parse return port==0?), + ### but we're on a non-standard port, then we won't detect that the + ### URI's port implies the wrong one. + */ + if (comp.scheme != NULL || comp.port != 0 || must_be_absolute) + { + /* ### not sure this works if the current request came in via https: */ + scheme = r->parsed_uri.scheme; + if (scheme == NULL) + scheme = ap_http_method(r); + + /* insert a port if the URI did not contain one */ + if (comp.port == 0) + comp.port = apr_uri_port_of_scheme(comp.scheme); + + /* now, verify that the URI uses the same scheme as the current. + request. the port must match our port. + */ + apr_sockaddr_port_get(&port, r->connection->local_addr); + if (strcasecmp(comp.scheme, scheme) != 0 +#ifdef APACHE_PORT_HANDLING_IS_BUSTED + || comp.port != port +#endif + ) { + result.err.status = HTTP_BAD_GATEWAY; + result.err.desc = apr_psprintf(r->pool, + "Destination URI refers to " + "different scheme or port " + "(%s://hostname:%d)" APR_EOL_STR + "(want: %s://hostname:%d)", + comp.scheme ? comp.scheme : scheme, + comp.port ? comp.port : port, + scheme, port); + return result; + } + } + + /* we have verified the scheme, port, and general structure */ + + /* + ** Hrm. IE5 will pass unqualified hostnames for both the + ** Host: and Destination: headers. This breaks the + ** http_vhost.c::matches_aliases function. + ** + ** For now, qualify unqualified comp.hostnames with + ** r->server->server_hostname. + ** + ** ### this is a big hack. Apache should provide a better way. + ** ### maybe the admin should list the unqualified hosts in a + ** ### block? + */ + if (comp.hostname != NULL + && strrchr(comp.hostname, '.') == NULL + && (domain = strchr(r->server->server_hostname, '.')) != NULL) { + comp.hostname = apr_pstrcat(r->pool, comp.hostname, domain, NULL); + } + + /* now, if a hostname was provided, then verify that it represents the + same server as the current connection. note that we just use our + port, since we've verified the URI matches ours */ +#ifdef APACHE_PORT_HANDLING_IS_BUSTED + if (comp.hostname != NULL && + !ap_matches_request_vhost(r, comp.hostname, port)) { + result.err.status = HTTP_BAD_GATEWAY; + result.err.desc = "Destination URI refers to a different server."; + return result; + } +#endif + + /* we have verified that the requested URI denotes the same server as + the current request. Therefore, we can use ap_sub_req_lookup_uri() */ + + /* reconstruct a URI as just the path */ + new_file = apr_uri_unparse(r->pool, &comp, APR_URI_UNP_OMITSITEPART); + + /* + * Lookup the URI and return the sub-request. Note that we use the + * same HTTP method on the destination. This allows the destination + * to apply appropriate restrictions (e.g. readonly). + */ + result.rnew = ap_sub_req_method_uri(r->method, new_file, r, NULL); + + return result; +} + +/* --------------------------------------------------------------- +** +** XML UTILITY FUNCTIONS +*/ + +/* validate that the root element uses a given DAV: tagname (TRUE==valid) */ +DAV_DECLARE(int) dav_validate_root(const apr_xml_doc *doc, + const char *tagname) +{ + return doc->root && + doc->root->ns == APR_XML_NS_DAV_ID && + strcmp(doc->root->name, tagname) == 0; +} + +/* find and return the (unique) child with a given DAV: tagname */ +DAV_DECLARE(apr_xml_elem *) dav_find_child(const apr_xml_elem *elem, + const char *tagname) +{ + apr_xml_elem *child = elem->first_child; + + for (; child; child = child->next) + if (child->ns == APR_XML_NS_DAV_ID && !strcmp(child->name, tagname)) + return child; + return NULL; +} + +/* gather up all the CDATA into a single string */ +DAV_DECLARE(const char *) dav_xml_get_cdata(const apr_xml_elem *elem, apr_pool_t *pool, + int strip_white) +{ + apr_size_t len = 0; + apr_text *scan; + const apr_xml_elem *child; + char *cdata; + char *s; + apr_size_t tlen; + const char *found_text = NULL; /* initialize to avoid gcc warning */ + int found_count = 0; + + for (scan = elem->first_cdata.first; scan != NULL; scan = scan->next) { + found_text = scan->text; + ++found_count; + len += strlen(found_text); + } + + for (child = elem->first_child; child != NULL; child = child->next) { + for (scan = child->following_cdata.first; + scan != NULL; + scan = scan->next) { + found_text = scan->text; + ++found_count; + len += strlen(found_text); + } + } + + /* some fast-path cases: + * 1) zero-length cdata + * 2) a single piece of cdata with no whitespace to strip + */ + if (len == 0) + return ""; + if (found_count == 1) { + if (!strip_white + || (!apr_isspace(*found_text) + && !apr_isspace(found_text[len - 1]))) + return found_text; + } + + cdata = s = apr_palloc(pool, len + 1); + + for (scan = elem->first_cdata.first; scan != NULL; scan = scan->next) { + tlen = strlen(scan->text); + memcpy(s, scan->text, tlen); + s += tlen; + } + + for (child = elem->first_child; child != NULL; child = child->next) { + for (scan = child->following_cdata.first; + scan != NULL; + scan = scan->next) { + tlen = strlen(scan->text); + memcpy(s, scan->text, tlen); + s += tlen; + } + } + + *s = '\0'; + + if (strip_white) { + /* trim leading whitespace */ + while (apr_isspace(*cdata)) /* assume: return false for '\0' */ + ++cdata; + + /* trim trailing whitespace */ + while (len-- > 0 && apr_isspace(cdata[len])) + continue; + cdata[len + 1] = '\0'; + } + + return cdata; +} + +DAV_DECLARE(dav_xmlns_info *) dav_xmlns_create(apr_pool_t *pool) +{ + dav_xmlns_info *xi = apr_pcalloc(pool, sizeof(*xi)); + + xi->pool = pool; + xi->uri_prefix = apr_hash_make(pool); + xi->prefix_uri = apr_hash_make(pool); + + return xi; +} + +DAV_DECLARE(void) dav_xmlns_add(dav_xmlns_info *xi, + const char *prefix, const char *uri) +{ + /* this "should" not overwrite a prefix mapping */ + apr_hash_set(xi->prefix_uri, prefix, APR_HASH_KEY_STRING, uri); + + /* note: this may overwrite an existing URI->prefix mapping, but it + doesn't matter -- any prefix is usuable to specify the URI. */ + apr_hash_set(xi->uri_prefix, uri, APR_HASH_KEY_STRING, prefix); +} + +DAV_DECLARE(const char *) dav_xmlns_add_uri(dav_xmlns_info *xi, + const char *uri) +{ + const char *prefix; + + if ((prefix = apr_hash_get(xi->uri_prefix, uri, + APR_HASH_KEY_STRING)) != NULL) + return prefix; + + prefix = apr_psprintf(xi->pool, "g%d", xi->count++); + dav_xmlns_add(xi, prefix, uri); + return prefix; +} + +DAV_DECLARE(const char *) dav_xmlns_get_uri(dav_xmlns_info *xi, + const char *prefix) +{ + return apr_hash_get(xi->prefix_uri, prefix, APR_HASH_KEY_STRING); +} + +DAV_DECLARE(const char *) dav_xmlns_get_prefix(dav_xmlns_info *xi, + const char *uri) +{ + return apr_hash_get(xi->uri_prefix, uri, APR_HASH_KEY_STRING); +} + +DAV_DECLARE(void) dav_xmlns_generate(dav_xmlns_info *xi, + apr_text_header *phdr) +{ + apr_hash_index_t *hi = apr_hash_first(xi->pool, xi->prefix_uri); + + for (; hi != NULL; hi = apr_hash_next(hi)) { + const void *prefix; + void *uri; + const char *s; + + apr_hash_this(hi, &prefix, NULL, &uri); + + s = apr_psprintf(xi->pool, " xmlns:%s=\"%s\"", + (const char *)prefix, (const char *)uri); + apr_text_append(xi->pool, phdr, s); + } +} + +/* --------------------------------------------------------------- +** +** Timeout header processing +** +*/ + +/* dav_get_timeout: If the Timeout: header exists, return a time_t + * when this lock is expected to expire. Otherwise, return + * a time_t of DAV_TIMEOUT_INFINITE. + * + * It's unclear if DAV clients are required to understand + * Seconds-xxx and Infinity time values. We assume that they do. + * In addition, for now, that's all we understand, too. + */ +DAV_DECLARE(time_t) dav_get_timeout(request_rec *r) +{ + time_t now, expires = DAV_TIMEOUT_INFINITE; + + const char *timeout_const = apr_table_get(r->headers_in, "Timeout"); + const char *timeout = apr_pstrdup(r->pool, timeout_const), *val; + + if (timeout == NULL) + return DAV_TIMEOUT_INFINITE; + + /* Use the first thing we understand, or infinity if + * we don't understand anything. + */ + + while ((val = ap_getword_white(r->pool, &timeout)) && strlen(val)) { + if (!strncmp(val, "Infinite", 8)) { + return DAV_TIMEOUT_INFINITE; + } + + if (!strncmp(val, "Second-", 7)) { + val += 7; + /* ### We need to handle overflow better: + * ### timeout will be <= 2^32 - 1 + */ + expires = atol(val); + now = time(NULL); + return now + expires; + } + } + + return DAV_TIMEOUT_INFINITE; +} + +/* --------------------------------------------------------------- +** +** If Header processing +** +*/ + +/* add_if_resource returns a new if_header, linking it to next_ih. + */ +static dav_if_header *dav_add_if_resource(apr_pool_t *p, dav_if_header *next_ih, + const char *uri, apr_size_t uri_len) +{ + dav_if_header *ih; + + if ((ih = apr_pcalloc(p, sizeof(*ih))) == NULL) + return NULL; + + ih->uri = uri; + ih->uri_len = uri_len; + ih->next = next_ih; + + return ih; +} + +/* add_if_state adds a condition to an if_header. + */ +static dav_error * dav_add_if_state(apr_pool_t *p, dav_if_header *ih, + const char *state_token, + dav_if_state_type t, int condition, + const dav_hooks_locks *locks_hooks) +{ + dav_if_state_list *new_sl; + + new_sl = apr_pcalloc(p, sizeof(*new_sl)); + + new_sl->condition = condition; + new_sl->type = t; + + if (t == dav_if_opaquelock) { + dav_error *err; + + if ((err = (*locks_hooks->parse_locktoken)(p, state_token, + &new_sl->locktoken)) != NULL) { + /* In cases where the state token is invalid, we'll just skip + * it rather than return 400. + */ + if (err->error_id == DAV_ERR_LOCK_UNK_STATE_TOKEN) { + return NULL; + } + else { + /* ### maybe add a higher-level description */ + return err; + } + } + } + else + new_sl->etag = state_token; + + new_sl->next = ih->state; + ih->state = new_sl; + + return NULL; +} + +/* fetch_next_token returns the substring from str+1 + * to the next occurence of char term, or \0, whichever + * occurs first. Leading whitespace is ignored. + */ +static char *dav_fetch_next_token(char **str, char term) +{ + char *sp; + char *token; + + token = *str + 1; + + while (*token && (*token == ' ' || *token == '\t')) + token++; + + if ((sp = strchr(token, term)) == NULL) + return NULL; + + *sp = '\0'; + *str = sp; + return token; +} + +/* dav_process_if_header: + * + * If NULL (no error) is returned, then **if_header points to the + * "If" productions structure (or NULL if "If" is not present). + * + * ### this part is bogus: + * If an error is encountered, the error is logged. Parent should + * return err->status. + */ +static dav_error * dav_process_if_header(request_rec *r, dav_if_header **p_ih) +{ + dav_error *err; + char *str; + char *list; + const char *state_token; + const char *uri = NULL; /* scope of current production; NULL=no-tag */ + apr_size_t uri_len = 0; + dav_if_header *ih = NULL; + apr_uri_t parsed_uri; + const dav_hooks_locks *locks_hooks = DAV_GET_HOOKS_LOCKS(r); + enum {no_tagged, tagged, unknown} list_type = unknown; + int condition; + + *p_ih = NULL; + + if ((str = apr_pstrdup(r->pool, apr_table_get(r->headers_in, "If"))) == NULL) + return NULL; + + while (*str) { + switch(*str) { + case '<': + /* Tagged-list production - following states apply to this uri */ + if (list_type == no_tagged + || ((uri = dav_fetch_next_token(&str, '>')) == NULL)) { + return dav_new_error(r->pool, HTTP_BAD_REQUEST, + DAV_ERR_IF_TAGGED, + "Invalid If-header: unclosed \"<\" or " + "unexpected tagged-list production."); + } + + /* 2518 specifies this must be an absolute URI; just take the + * relative part for later comparison against r->uri */ + if (apr_uri_parse(r->pool, uri, &parsed_uri) != APR_SUCCESS + || !parsed_uri.path) { + return dav_new_error(r->pool, HTTP_BAD_REQUEST, + DAV_ERR_IF_TAGGED, + "Invalid URI in tagged If-header."); + } + /* note that parsed_uri.path is allocated; we can trash it */ + + /* clean up the URI a bit */ + ap_getparents(parsed_uri.path); + uri_len = strlen(parsed_uri.path); + if (uri_len > 1 && parsed_uri.path[uri_len - 1] == '/') + parsed_uri.path[--uri_len] = '\0'; + + uri = parsed_uri.path; + list_type = tagged; + break; + + case '(': + /* List production */ + + /* If a uri has not been encountered, this is a No-Tagged-List */ + if (list_type == unknown) + list_type = no_tagged; + + if ((list = dav_fetch_next_token(&str, ')')) == NULL) { + return dav_new_error(r->pool, HTTP_BAD_REQUEST, + DAV_ERR_IF_UNCLOSED_PAREN, + "Invalid If-header: unclosed \"(\"."); + } + + if ((ih = dav_add_if_resource(r->pool, ih, uri, uri_len)) == NULL) { + /* ### dav_add_if_resource() should return an error for us! */ + return dav_new_error(r->pool, HTTP_BAD_REQUEST, + DAV_ERR_IF_PARSE, + "Internal server error parsing \"If:\" " + "header."); + } + + condition = DAV_IF_COND_NORMAL; + + while (*list) { + /* List is the entire production (in a uri scope) */ + + switch (*list) { + case '<': + if ((state_token = dav_fetch_next_token(&list, '>')) == NULL) { + /* ### add a description to this error */ + return dav_new_error(r->pool, HTTP_BAD_REQUEST, + DAV_ERR_IF_PARSE, NULL); + } + + if ((err = dav_add_if_state(r->pool, ih, state_token, dav_if_opaquelock, + condition, locks_hooks)) != NULL) { + /* ### maybe add a higher level description */ + return err; + } + condition = DAV_IF_COND_NORMAL; + break; + + case '[': + if ((state_token = dav_fetch_next_token(&list, ']')) == NULL) { + /* ### add a description to this error */ + return dav_new_error(r->pool, HTTP_BAD_REQUEST, + DAV_ERR_IF_PARSE, NULL); + } + + if ((err = dav_add_if_state(r->pool, ih, state_token, dav_if_etag, + condition, locks_hooks)) != NULL) { + /* ### maybe add a higher level description */ + return err; + } + condition = DAV_IF_COND_NORMAL; + break; + + case 'N': + if (list[1] == 'o' && list[2] == 't') { + if (condition != DAV_IF_COND_NORMAL) { + return dav_new_error(r->pool, HTTP_BAD_REQUEST, + DAV_ERR_IF_MULTIPLE_NOT, + "Invalid \"If:\" header: " + "Multiple \"not\" entries " + "for the same state."); + } + condition = DAV_IF_COND_NOT; + } + list += 2; + break; + + case ' ': + case '\t': + break; + + default: + return dav_new_error(r->pool, HTTP_BAD_REQUEST, + DAV_ERR_IF_UNK_CHAR, + apr_psprintf(r->pool, + "Invalid \"If:\" " + "header: Unexpected " + "character encountered " + "(0x%02x, '%c').", + *list, *list)); + } + + list++; + } + break; + + case ' ': + case '\t': + break; + + default: + return dav_new_error(r->pool, HTTP_BAD_REQUEST, + DAV_ERR_IF_UNK_CHAR, + apr_psprintf(r->pool, + "Invalid \"If:\" header: " + "Unexpected character " + "encountered (0x%02x, '%c').", + *str, *str)); + } + + str++; + } + + *p_ih = ih; + return NULL; +} + +static int dav_find_submitted_locktoken(const dav_if_header *if_header, + const dav_lock *lock_list, + const dav_hooks_locks *locks_hooks) +{ + for (; if_header != NULL; if_header = if_header->next) { + const dav_if_state_list *state_list; + + for (state_list = if_header->state; + state_list != NULL; + state_list = state_list->next) { + + if (state_list->type == dav_if_opaquelock) { + const dav_lock *lock; + + /* given state_list->locktoken, match it */ + + /* + ** The resource will have one or more lock tokens. We only + ** need to match one of them against any token in the + ** If: header. + ** + ** One token case: It is an exclusive or shared lock. Either + ** way, we must find it. + ** + ** N token case: They are shared locks. By policy, we need + ** to match only one. The resource's other + ** tokens may belong to somebody else (so we + ** shouldn't see them in the If: header anyway) + */ + for (lock = lock_list; lock != NULL; lock = lock->next) { + + if (!(*locks_hooks->compare_locktoken)(state_list->locktoken, lock->locktoken)) { + return 1; + } + } + } + } + } + + return 0; +} + +/* dav_validate_resource_state: + * Returns NULL if path/uri meets if-header and lock requirements + */ +static dav_error * dav_validate_resource_state(apr_pool_t *p, + const dav_resource *resource, + dav_lockdb *lockdb, + const dav_if_header *if_header, + int flags, + dav_buffer *pbuf, + request_rec *r) +{ + dav_error *err; + const char *uri; + const char *etag; + const dav_hooks_locks *locks_hooks = (lockdb ? lockdb->hooks : NULL); + const dav_if_header *ifhdr_scan; + dav_if_state_list *state_list; + dav_lock *lock_list; + dav_lock *lock; + int num_matched; + int num_that_apply; + int seen_locktoken; + apr_size_t uri_len; + const char *reason = NULL; + + /* DBG1("validate: <%s>", resource->uri); */ + + /* + ** The resource will have one of three states: + ** + ** 1) No locks. We have no special requirements that the user supply + ** specific locktokens. One of the state lists must match, and + ** we're done. + ** + ** 2) One exclusive lock. The locktoken must appear *anywhere* in the + ** If: header. Of course, asserting the token in a "Not" term will + ** quickly fail that state list :-). If the locktoken appears in + ** one of the state lists *and* one state list matches, then we're + ** done. + ** + ** 3) One or more shared locks. One of the locktokens must appear + ** *anywhere* in the If: header. If one of the locktokens appears, + ** and we match one state list, then we are done. + ** + ** The variable determines whether we have seen one + ** of this resource's locktokens in the If: header. + */ + + /* + ** If this is a new lock request, will contain the requested + ** lock scope. Three rules apply: + ** + ** 1) Do not require a (shared) locktoken to be seen (when we are + ** applying another shared lock) + ** 2) If the scope is exclusive and we see any locks, fail. + ** 3) If the scope is shared and we see an exclusive lock, fail. + */ + + if (lockdb == NULL) { + /* we're in State 1. no locks. */ + lock_list = NULL; + } + else { + /* + ** ### hrm... we don't need to have these fully + ** ### resolved since we're only looking at the + ** ### locktokens... + ** + ** ### use get_locks w/ calltype=PARTIAL + */ + if ((err = dav_lock_query(lockdb, resource, &lock_list)) != NULL) { + return dav_push_error(p, + HTTP_INTERNAL_SERVER_ERROR, 0, + "The locks could not be queried for " + "verification against a possible \"If:\" " + "header.", + err); + } + + /* lock_list now determines whether we're in State 1, 2, or 3. */ + } + + /* + ** For a new, exclusive lock: if any locks exist, fail. + ** For a new, shared lock: if an exclusive lock exists, fail. + ** else, do not require a token to be seen. + */ + if (flags & DAV_LOCKSCOPE_EXCLUSIVE) { + if (lock_list != NULL) { + return dav_new_error(p, HTTP_LOCKED, 0, + "Existing lock(s) on the requested resource " + "prevent an exclusive lock."); + } + + /* + ** There are no locks, so we can pretend that we've already met + ** any requirement to find the resource's locks in an If: header. + */ + seen_locktoken = 1; + } + else if (flags & DAV_LOCKSCOPE_SHARED) { + /* + ** Strictly speaking, we don't need this loop. Either the first + ** (and only) lock will be EXCLUSIVE, or none of them will be. + */ + for (lock = lock_list; lock != NULL; lock = lock->next) { + if (lock->scope == DAV_LOCKSCOPE_EXCLUSIVE) { + return dav_new_error(p, HTTP_LOCKED, 0, + "The requested resource is already " + "locked exclusively."); + } + } + + /* + ** The locks on the resource (if any) are all shared. Set the + ** flag to indicate that we do not need to find + ** the locks in an If: header. + */ + seen_locktoken = 1; + } + else { + /* + ** For methods other than LOCK: + ** + ** If we have no locks, then can be set to true -- + ** pretending that we've already met the requirement of seeing one + ** of the resource's locks in the If: header. + ** + ** Otherwise, it must be cleared and we'll look for one. + */ + seen_locktoken = (lock_list == NULL); + } + + /* + ** If there is no If: header, then we can shortcut some logic: + ** + ** 1) if we do not need to find a locktoken in the (non-existent) If: + ** header, then we are successful. + ** + ** 2) if we must find a locktoken in the (non-existent) If: header, then + ** we fail. + */ + if (if_header == NULL) { + if (seen_locktoken) + return NULL; + + return dav_new_error(p, HTTP_LOCKED, 0, + "This resource is locked and an \"If:\" header " + "was not supplied to allow access to the " + "resource."); + } + /* the If: header is present */ + + /* + ** If a dummy header is present (because of a Lock-Token: header), then + ** we are required to find that token in this resource's set of locks. + ** If we have no locks, then we immediately fail. + ** + ** This is a 400 (Bad Request) since they should only submit a locktoken + ** that actually exists. + ** + ** Don't issue this response if we're talking about the parent resource. + ** It is okay for that resource to NOT have this locktoken. + ** (in fact, it certainly will not: a dummy_header only occurs for the + ** UNLOCK method, the parent is checked only for locknull resources, + ** and the parent certainly does not have the (locknull's) locktoken) + */ + if (lock_list == NULL && if_header->dummy_header) { + if (flags & DAV_VALIDATE_IS_PARENT) + return NULL; + return dav_new_error(p, HTTP_BAD_REQUEST, 0, + "The locktoken specified in the \"Lock-Token:\" " + "header is invalid because this resource has no " + "outstanding locks."); + } + + /* + ** Prepare the input URI. We want the URI to never have a trailing slash. + ** + ** When URIs are placed into the dav_if_header structure, they are + ** guaranteed to never have a trailing slash. If the URIs are equivalent, + ** then it doesn't matter if they both lack a trailing slash -- they're + ** still equivalent. + ** + ** Note: we could also ensure that a trailing slash is present on both + ** URIs, but the majority of URIs provided to us via a resource walk + ** will not contain that trailing slash. + */ + uri = resource->uri; + uri_len = strlen(uri); + if (uri[uri_len - 1] == '/') { + dav_set_bufsize(p, pbuf, uri_len); + memcpy(pbuf->buf, uri, uri_len); + pbuf->buf[--uri_len] = '\0'; + uri = pbuf->buf; + } + + /* get the resource's etag; we may need it during the checks */ + etag = (*resource->hooks->getetag)(resource); + + /* how many state_lists apply to this URI? */ + num_that_apply = 0; + + /* If there are if-headers, fail if this resource + * does not match at least one state_list. + */ + for (ifhdr_scan = if_header; + ifhdr_scan != NULL; + ifhdr_scan = ifhdr_scan->next) { + + /* DBG2("uri=<%s> if_uri=<%s>", uri, ifhdr_scan->uri ? ifhdr_scan->uri : "(no uri)"); */ + + if (ifhdr_scan->uri != NULL + && (uri_len != ifhdr_scan->uri_len + || memcmp(uri, ifhdr_scan->uri, uri_len) != 0)) { + /* + ** A tagged-list's URI doesn't match this resource's URI. + ** Skip to the next state_list to see if it will match. + */ + continue; + } + + /* this state_list applies to this resource */ + + /* + ** ### only one state_list should ever apply! a no-tag, or a tagged + ** ### where S9.4.2 states only one can match. + ** + ** ### revamp this code to loop thru ifhdr_scan until we find the + ** ### matching state_list. process it. stop. + */ + ++num_that_apply; + + /* To succeed, resource must match *all* of the states + * specified in the state_list. + */ + for (state_list = ifhdr_scan->state; + state_list != NULL; + state_list = state_list->next) { + + switch(state_list->type) { + case dav_if_etag: + { + int mismatch = strcmp(state_list->etag, etag); + + if (state_list->condition == DAV_IF_COND_NORMAL && mismatch) { + /* + ** The specified entity-tag does not match the + ** entity-tag on the resource. This state_list is + ** not going to match. Bust outta here. + */ + reason = + "an entity-tag was specified, but the resource's " + "actual ETag does not match."; + goto state_list_failed; + } + else if (state_list->condition == DAV_IF_COND_NOT + && !mismatch) { + /* + ** The specified entity-tag DOES match the + ** entity-tag on the resource. This state_list is + ** not going to match. Bust outta here. + */ + reason = + "an entity-tag was specified using the \"Not\" form, " + "but the resource's actual ETag matches the provided " + "entity-tag."; + goto state_list_failed; + } + break; + } + + case dav_if_opaquelock: + if (lockdb == NULL) { + if (state_list->condition == DAV_IF_COND_NOT) { + /* the locktoken is definitely not there! (success) */ + continue; + } + + /* condition == DAV_IF_COND_NORMAL */ + + /* + ** If no lockdb is provided, then validation fails for + ** this state_list (NORMAL means we were supposed to + ** find the token, which we obviously cannot do without + ** a lock database). + ** + ** Go and try the next state list. + */ + reason = + "a State-token was supplied, but a lock database " + "is not available for to provide the required lock."; + goto state_list_failed; + } + + /* Resource validation 'fails' if: + * ANY of the lock->locktokens match + * a NOT state_list->locktoken, + * OR + * NONE of the lock->locktokens match + * a NORMAL state_list->locktoken. + */ + num_matched = 0; + for (lock = lock_list; lock != NULL; lock = lock->next) { + + /* + DBG2("compare: rsrc=%s ifhdr=%s", + (*locks_hooks->format_locktoken)(p, lock->locktoken), + (*locks_hooks->format_locktoken)(p, state_list->locktoken)); + */ + + /* nothing to do if the locktokens do not match. */ + if ((*locks_hooks->compare_locktoken)(state_list->locktoken, lock->locktoken)) { + continue; + } + + /* + ** We have now matched up one of the resource's locktokens + ** to a locktoken in a State-token in the If: header. + ** Note this fact, so that we can pass the overall + ** requirement of seeing at least one of the resource's + ** locktokens. + */ + seen_locktoken = 1; + + if (state_list->condition == DAV_IF_COND_NOT) { + /* + ** This state requires that the specified locktoken + ** is NOT present on the resource. But we just found + ** it. There is no way this state-list can now + ** succeed, so go try another one. + */ + reason = + "a State-token was supplied, which used a " + "\"Not\" condition. The State-token was found " + "in the locks on this resource"; + goto state_list_failed; + } + + /* condition == DAV_IF_COND_NORMAL */ + + /* Validate auth_user: If an authenticated user created + ** the lock, only the same user may submit that locktoken + ** to manipulate a resource. + */ + if (lock->auth_user && + (!r->user || + strcmp(lock->auth_user, r->user))) { + const char *errmsg; + + errmsg = apr_pstrcat(p, "User \"", + r->user, + "\" submitted a locktoken created " + "by user \"", + lock->auth_user, "\".", NULL); + return dav_new_error(p, HTTP_FORBIDDEN, 0, errmsg); + } + + /* + ** We just matched a specified State-Token to one of the + ** resource's locktokens. + ** + ** Break out of the lock scan -- we only needed to find + ** one match (actually, there shouldn't be any other + ** matches in the lock list). + */ + num_matched = 1; + break; + } + + if (num_matched == 0 + && state_list->condition == DAV_IF_COND_NORMAL) { + /* + ** We had a NORMAL state, meaning that we should have + ** found the State-Token within the locks on this + ** resource. We didn't, so this state_list must fail. + */ + reason = + "a State-token was supplied, but it was not found " + "in the locks on this resource."; + goto state_list_failed; + } + + break; + + } /* switch */ + } /* foreach ( state_list ) */ + + /* + ** We've checked every state in this state_list and none of them + ** have failed. Since all of them succeeded, then we have a matching + ** state list and we may be done. + ** + ** The next requirement is that we have seen one of the resource's + ** locktokens (if any). If we have, then we can just exit. If we + ** haven't, then we need to keep looking. + */ + if (seen_locktoken) { + /* woo hoo! */ + return NULL; + } + + /* + ** Haven't seen one. Let's break out of the search and just look + ** for a matching locktoken. + */ + break; + + /* + ** This label is used when we detect that a state_list is not + ** going to match this resource. We bust out and try the next + ** state_list. + */ + state_list_failed: + ; + + } /* foreach ( ifhdr_scan ) */ + + /* + ** The above loop exits for one of two reasons: + ** 1) a state_list matched and seen_locktoken is false. + ** 2) all if_header structures were scanned, without (1) occurring + */ + + if (ifhdr_scan == NULL) { + /* + ** We finished the loop without finding any matching state lists. + */ + + /* + ** If none of the state_lists apply to this resource, then we + ** may have succeeded. Note that this scenario implies a + ** tagged-list with no matching state_lists. If the If: header + ** was a no-tag-list, then it would have applied to this resource. + ** + ** S9.4.2 states that when no state_lists apply, then the header + ** should be ignored. + ** + ** If we saw one of the resource's locktokens, then we're done. + ** If we did not see a locktoken, then we fail. + */ + if (num_that_apply == 0) { + if (seen_locktoken) + return NULL; + + /* + ** We may have aborted the scan before seeing the locktoken. + ** Rescan the If: header to see if we can find the locktoken + ** somewhere. + ** + ** Note that seen_locktoken == 0 implies lock_list != NULL + ** which implies locks_hooks != NULL. + */ + if (dav_find_submitted_locktoken(if_header, lock_list, + locks_hooks)) { + /* + ** We found a match! We're set... none of the If: header + ** assertions apply (implicit success), and the If: header + ** specified the locktoken somewhere. We're done. + */ + return NULL; + } + + return dav_new_error(p, HTTP_LOCKED, 0 /* error_id */, + "This resource is locked and the \"If:\" " + "header did not specify one of the " + "locktokens for this resource's lock(s)."); + } + /* else: one or more state_lists were applicable, but failed. */ + + /* + ** If the dummy_header did not match, then they specified an + ** incorrect token in the Lock-Token header. Forget whether the + ** If: statement matched or not... we'll tell them about the + ** bad Lock-Token first. That is considered a 400 (Bad Request). + */ + if (if_header->dummy_header) { + return dav_new_error(p, HTTP_BAD_REQUEST, 0, + "The locktoken specified in the " + "\"Lock-Token:\" header did not specify one " + "of this resource's locktoken(s)."); + } + + if (reason == NULL) { + return dav_new_error(p, HTTP_PRECONDITION_FAILED, 0, + "The preconditions specified by the \"If:\" " + "header did not match this resource."); + } + + return dav_new_error(p, HTTP_PRECONDITION_FAILED, 0, + apr_psprintf(p, + "The precondition(s) specified by " + "the \"If:\" header did not match " + "this resource. At least one " + "failure is because: %s", reason)); + } + + /* assert seen_locktoken == 0 */ + + /* + ** ifhdr_scan != NULL implies we found a matching state_list. + ** + ** Since we're still here, it also means that we have not yet found + ** one the resource's locktokens in the If: header. + ** + ** Scan all the if_headers and states looking for one of this + ** resource's locktokens. Note that we need to go back and scan them + ** all -- we may have aborted a scan with a failure before we saw a + ** matching token. + ** + ** Note that seen_locktoken == 0 implies lock_list != NULL which implies + ** locks_hooks != NULL. + */ + if (dav_find_submitted_locktoken(if_header, lock_list, locks_hooks)) { + /* + ** We found a match! We're set... we have a matching state list, + ** and the If: header specified the locktoken somewhere. We're done. + */ + return NULL; + } + + /* + ** We had a matching state list, but the user agent did not specify one + ** of this resource's locktokens. Tell them so. + ** + ** Note that we need to special-case the message on whether a "dummy" + ** header exists. If it exists, yet we didn't see a needed locktoken, + ** then that implies the dummy header (Lock-Token header) did NOT + ** specify one of this resource's locktokens. (this implies something + ** in the real If: header matched) + ** + ** We want to note the 400 (Bad Request) in favor of a 423 (Locked). + */ + if (if_header->dummy_header) { + return dav_new_error(p, HTTP_BAD_REQUEST, 0, + "The locktoken specified in the " + "\"Lock-Token:\" header did not specify one " + "of this resource's locktoken(s)."); + } + + return dav_new_error(p, HTTP_LOCKED, 1 /* error_id */, + "This resource is locked and the \"If:\" header " + "did not specify one of the " + "locktokens for this resource's lock(s)."); +} + +/* dav_validate_walker: Walker callback function to validate resource state */ +static dav_error * dav_validate_walker(dav_walk_resource *wres, int calltype) +{ + dav_walker_ctx *ctx = wres->walk_ctx; + dav_error *err; + + if ((err = dav_validate_resource_state(ctx->w.pool, wres->resource, + ctx->w.lockdb, + ctx->if_header, ctx->flags, + &ctx->work_buf, ctx->r)) == NULL) { + /* There was no error, so just bug out. */ + return NULL; + } + + /* + ** If we have a serious server error, or if the request itself failed, + ** then just return error (not a multistatus). + */ + if (ap_is_HTTP_SERVER_ERROR(err->status) + || (*wres->resource->hooks->is_same_resource)(wres->resource, + ctx->w.root)) { + /* ### maybe push a higher-level description? */ + return err; + } + + /* associate the error with the current URI */ + dav_add_response(wres, err->status, NULL); + + return NULL; +} + +/* +** dav_validate_request: Validate if-headers (and check for locks) on: +** (1) r->filename @ depth; +** (2) Parent of r->filename if check_parent == 1 +** +** The check of parent should be done when it is necessary to verify that +** the parent collection will accept a new member (ie current resource +** state is null). +** +** Return OK on successful validation. +** On error, return appropriate HTTP_* code, and log error. If a multi-stat +** error is necessary, response will point to it, else NULL. +*/ +DAV_DECLARE(dav_error *) dav_validate_request(request_rec *r, + dav_resource *resource, + int depth, + dav_locktoken *locktoken, + dav_response **response, + int flags, + dav_lockdb *lockdb) +{ + dav_error *err; + int result; + dav_if_header *if_header; + int lock_db_opened_locally = 0; + const dav_hooks_locks *locks_hooks = DAV_GET_HOOKS_LOCKS(r); + const dav_hooks_repository *repos_hooks = resource->hooks; + dav_buffer work_buf = { 0 }; + dav_response *new_response; + +#if DAV_DEBUG + if (depth && response == NULL) { + /* + ** ### bleck. we can't return errors for other URIs unless we have + ** ### a "response" ptr. + */ + return dav_new_error(r->pool, HTTP_INTERNAL_SERVER_ERROR, 0, + "DESIGN ERROR: dav_validate_request called " + "with depth>0, but no response ptr."); + } +#endif + + if (response != NULL) + *response = NULL; + + /* Do the standard checks for conditional requests using + * If-..-Since, If-Match etc */ + if ((result = ap_meets_conditions(r)) != OK) { + /* ### fix this up... how? */ + return dav_new_error(r->pool, result, 0, NULL); + } + + /* always parse (and later process) the If: header */ + if ((err = dav_process_if_header(r, &if_header)) != NULL) { + /* ### maybe add higher-level description */ + return err; + } + + /* If a locktoken was specified, create a dummy if_header with which + * to validate resources. In the interim, figure out why DAV uses + * locktokens in an if-header without a Lock-Token header to refresh + * locks, but a Lock-Token header without an if-header to remove them. + */ + if (locktoken != NULL) { + dav_if_header *ifhdr_new; + + ifhdr_new = apr_pcalloc(r->pool, sizeof(*ifhdr_new)); + ifhdr_new->uri = resource->uri; + ifhdr_new->uri_len = strlen(resource->uri); + ifhdr_new->dummy_header = 1; + + ifhdr_new->state = apr_pcalloc(r->pool, sizeof(*ifhdr_new->state)); + ifhdr_new->state->type = dav_if_opaquelock; + ifhdr_new->state->condition = DAV_IF_COND_NORMAL; + ifhdr_new->state->locktoken = locktoken; + + ifhdr_new->next = if_header; + if_header = ifhdr_new; + } + + /* + ** If necessary, open the lock database (read-only, lazily); + ** the validation process may need to retrieve or update lock info. + ** Otherwise, assume provided lockdb is valid and opened rw. + */ + if (lockdb == NULL) { + if (locks_hooks != NULL) { + if ((err = (*locks_hooks->open_lockdb)(r, 0, 0, &lockdb)) != NULL) { + /* ### maybe insert higher-level comment */ + return err; + } + lock_db_opened_locally = 1; + } + } + + /* (1) Validate the specified resource, at the specified depth */ + if (resource->exists && depth > 0) { + dav_walker_ctx ctx = { { 0 } }; + dav_response *multi_status; + + ctx.w.walk_type = DAV_WALKTYPE_NORMAL; + ctx.w.func = dav_validate_walker; + ctx.w.walk_ctx = &ctx; + ctx.w.pool = r->pool; + ctx.w.root = resource; + + ctx.if_header = if_header; + ctx.r = r; + ctx.flags = flags; + + if (lockdb != NULL) { + ctx.w.lockdb = lockdb; + ctx.w.walk_type |= DAV_WALKTYPE_LOCKNULL; + } + + err = (*repos_hooks->walk)(&ctx.w, DAV_INFINITY, &multi_status); + if (err == NULL) { + *response = multi_status;; + } + /* else: implies a 5xx status code occurred. */ + } + else { + err = dav_validate_resource_state(r->pool, resource, lockdb, + if_header, flags, &work_buf, r); + } + + /* (2) Validate the parent resource if requested */ + if (err == NULL && (flags & DAV_VALIDATE_PARENT)) { + dav_resource *parent_resource; + + err = (*repos_hooks->get_parent_resource)(resource, &parent_resource); + + if (err == NULL && parent_resource == NULL) { + err = dav_new_error(r->pool, HTTP_FORBIDDEN, 0, + "Cannot access parent of repository root."); + } + else if (err == NULL) { + err = dav_validate_resource_state(r->pool, parent_resource, lockdb, + if_header, + flags | DAV_VALIDATE_IS_PARENT, + &work_buf, r); + + /* + ** This error occurred on the parent resource. This implies that + ** we have to create a multistatus response (to report the error + ** against a URI other than the Request-URI). "Convert" this error + ** into a multistatus response. + */ + if (err != NULL) { + new_response = apr_pcalloc(r->pool, sizeof(*new_response)); + + new_response->href = parent_resource->uri; + new_response->status = err->status; + new_response->desc = + "A validation error has occurred on the parent resource, " + "preventing the operation on the resource specified by " + "the Request-URI."; + if (err->desc != NULL) { + new_response->desc = apr_pstrcat(r->pool, + new_response->desc, + " The error was: ", + err->desc, NULL); + } + + /* assert: DAV_VALIDATE_PARENT implies response != NULL */ + new_response->next = *response; + *response = new_response; + + err = NULL; + } + } + } + + if (lock_db_opened_locally) + (*locks_hooks->close_lockdb)(lockdb); + + /* + ** If we don't have a (serious) error, and we have multistatus responses, + ** then we need to construct an "error". This error will be the overall + ** status returned, and the multistatus responses will go into its body. + ** + ** For certain methods, the overall error will be a 424. The default is + ** to construct a standard 207 response. + */ + if (err == NULL && response != NULL && *response != NULL) { + apr_text *propstat = NULL; + + if ((flags & DAV_VALIDATE_USE_424) != 0) { + /* manufacture a 424 error to hold the multistatus response(s) */ + return dav_new_error(r->pool, HTTP_FAILED_DEPENDENCY, 0, + "An error occurred on another resource, " + "preventing the requested operation on " + "this resource."); + } + + /* + ** Whatever caused the error, the Request-URI should have a 424 + ** associated with it since we cannot complete the method. + ** + ** For a LOCK operation, insert an empty DAV:lockdiscovery property. + ** For other methods, return a simple 424. + */ + if ((flags & DAV_VALIDATE_ADD_LD) != 0) { + propstat = apr_pcalloc(r->pool, sizeof(*propstat)); + propstat->text = + "" DEBUG_CR + "" DEBUG_CR + "HTTP/1.1 424 Failed Dependency" DEBUG_CR + "" DEBUG_CR; + } + + /* create the 424 response */ + new_response = apr_pcalloc(r->pool, sizeof(*new_response)); + new_response->href = resource->uri; + new_response->status = HTTP_FAILED_DEPENDENCY; + new_response->propresult.propstats = propstat; + new_response->desc = + "An error occurred on another resource, preventing the " + "requested operation on this resource."; + + new_response->next = *response; + *response = new_response; + + /* manufacture a 207 error for the multistatus response(s) */ + return dav_new_error(r->pool, HTTP_MULTI_STATUS, 0, + "Error(s) occurred on resources during the " + "validation process."); + } + + return err; +} + +/* dav_get_locktoken_list: + * + * Sets ltl to a locktoken_list of all positive locktokens in header, + * else NULL if no If-header, or no positive locktokens. + */ +DAV_DECLARE(dav_error *) dav_get_locktoken_list(request_rec *r, + dav_locktoken_list **ltl) +{ + dav_error *err; + dav_if_header *if_header; + dav_if_state_list *if_state; + dav_locktoken_list *lock_token = NULL; + + *ltl = NULL; + + if ((err = dav_process_if_header(r, &if_header)) != NULL) { + /* ### add a higher-level description? */ + return err; + } + + while (if_header != NULL) { + if_state = if_header->state; /* Begining of the if_state linked list */ + while (if_state != NULL) { + if (if_state->condition == DAV_IF_COND_NORMAL + && if_state->type == dav_if_opaquelock) { + lock_token = apr_pcalloc(r->pool, sizeof(dav_locktoken_list)); + lock_token->locktoken = if_state->locktoken; + lock_token->next = *ltl; + *ltl = lock_token; + } + if_state = if_state->next; + } + if_header = if_header->next; + } + if (*ltl == NULL) { + /* No nodes added */ + return dav_new_error(r->pool, HTTP_BAD_REQUEST, DAV_ERR_IF_ABSENT, + "No locktokens were specified in the \"If:\" " + "header, so the refresh could not be performed."); + } + + return NULL; +} + +#if 0 /* not needed right now... */ + +static const char *strip_white(const char *s, apr_pool_t *pool) +{ + apr_size_t idx; + + /* trim leading whitespace */ + while (apr_isspace(*s)) /* assume: return false for '\0' */ + ++s; + + /* trim trailing whitespace */ + idx = strlen(s) - 1; + if (apr_isspace(s[idx])) { + char *s2 = apr_pstrdup(pool, s); + + while (apr_isspace(s2[idx]) && idx > 0) + --idx; + s2[idx + 1] = '\0'; + return s2; + } + + return s; +} +#endif + +#define DAV_LABEL_HDR "Label" + +/* dav_add_vary_header + * + * If there were any headers in the request which require a Vary header + * in the response, add it. + */ +DAV_DECLARE(void) dav_add_vary_header(request_rec *in_req, + request_rec *out_req, + const dav_resource *resource) +{ + const dav_hooks_vsn *vsn_hooks = DAV_GET_HOOKS_VSN(in_req); + + /* ### this is probably all wrong... I think there is a function in + ### the Apache API to add things to the Vary header. need to check */ + + /* Only versioning headers require a Vary response header, + * so only do this check if there is a versioning provider */ + if (vsn_hooks != NULL) { + const char *target = apr_table_get(in_req->headers_in, DAV_LABEL_HDR); + const char *vary = apr_table_get(out_req->headers_out, "Vary"); + + /* If Target-Selector specified, add it to the Vary header */ + if (target != NULL) { + if (vary == NULL) + vary = DAV_LABEL_HDR; + else + vary = apr_pstrcat(out_req->pool, vary, "," DAV_LABEL_HDR, + NULL); + + apr_table_setn(out_req->headers_out, "Vary", vary); + } + } +} + +/* dav_can_auto_checkout + * + * Determine whether auto-checkout is enabled for a resource. + * r - the request_rec + * resource - the resource + * auto_version - the value of the auto_versionable hook for the resource + * lockdb - pointer to lock database (opened if necessary) + * auto_checkout - set to 1 if auto-checkout enabled + */ +static dav_error * dav_can_auto_checkout( + request_rec *r, + dav_resource *resource, + dav_auto_version auto_version, + dav_lockdb **lockdb, + int *auto_checkout) +{ + dav_error *err; + dav_lock *lock_list; + + *auto_checkout = 0; + + if (auto_version == DAV_AUTO_VERSION_ALWAYS) { + *auto_checkout = 1; + } + else if (auto_version == DAV_AUTO_VERSION_LOCKED) { + if (*lockdb == NULL) { + const dav_hooks_locks *locks_hooks = DAV_GET_HOOKS_LOCKS(r); + + if (locks_hooks == NULL) { + return dav_new_error(r->pool, HTTP_INTERNAL_SERVER_ERROR, 0, + "Auto-checkout is only enabled for locked resources, " + "but there is no lock provider."); + } + + if ((err = (*locks_hooks->open_lockdb)(r, 0, 0, lockdb)) != NULL) { + return dav_push_error(r->pool, HTTP_INTERNAL_SERVER_ERROR, 0, + "Cannot open lock database to determine " + "auto-versioning behavior.", + err); + } + } + + if ((err = dav_lock_query(*lockdb, resource, &lock_list)) != NULL) { + return dav_push_error(r->pool, + HTTP_INTERNAL_SERVER_ERROR, 0, + "The locks could not be queried for " + "determining auto-versioning behavior.", + err); + } + + if (lock_list != NULL) + *auto_checkout = 1; + } + + return NULL; +} + +/* see mod_dav.h for docco */ +DAV_DECLARE(dav_error *) dav_auto_checkout( + request_rec *r, + dav_resource *resource, + int parent_only, + dav_auto_version_info *av_info) +{ + const dav_hooks_vsn *vsn_hooks = DAV_GET_HOOKS_VSN(r); + dav_lockdb *lockdb = NULL; + dav_error *err = NULL; + + /* Initialize results */ + memset(av_info, 0, sizeof(*av_info)); + + /* if no versioning provider, just return */ + if (vsn_hooks == NULL) + return NULL; + + /* check parent resource if requested or if resource must be created */ + if (!resource->exists || parent_only) { + dav_resource *parent; + + if ((err = (*resource->hooks->get_parent_resource)(resource, + &parent)) != NULL) + goto done; + + if (parent == NULL || !parent->exists) { + err = dav_new_error(r->pool, HTTP_CONFLICT, 0, + apr_psprintf(r->pool, + "Missing one or more intermediate " + "collections. Cannot create resource %s.", + ap_escape_html(r->pool, resource->uri))); + goto done; + } + + av_info->parent_resource = parent; + + /* if parent versioned and not checked out, see if it can be */ + if (parent->versioned && !parent->working) { + int checkout_parent; + + if ((err = dav_can_auto_checkout(r, parent, + (*vsn_hooks->auto_versionable)(parent), + &lockdb, &checkout_parent)) + != NULL) { + goto done; + } + + if (!checkout_parent) { + err = dav_new_error(r->pool, HTTP_CONFLICT, 0, + ""); + goto done; + } + + /* Try to checkout the parent collection. + * Note that auto-versioning can only be applied to a version selector, + * so no separate working resource will be created. + */ + if ((err = (*vsn_hooks->checkout)(parent, 1 /*auto_checkout*/, + 0, 0, 0, NULL, NULL)) + != NULL) + { + err = dav_push_error(r->pool, HTTP_CONFLICT, 0, + apr_psprintf(r->pool, + "Unable to auto-checkout parent collection. " + "Cannot create resource %s.", + ap_escape_html(r->pool, resource->uri)), + err); + goto done; + } + + /* remember that parent was checked out */ + av_info->parent_checkedout = 1; + } + } + + /* if only checking parent, we're done */ + if (parent_only) + goto done; + + /* if creating a new resource, see if it should be version-controlled */ + if (!resource->exists + && (*vsn_hooks->auto_versionable)(resource) == DAV_AUTO_VERSION_ALWAYS) { + + if ((err = (*vsn_hooks->vsn_control)(resource, NULL)) != NULL) { + err = dav_push_error(r->pool, HTTP_CONFLICT, 0, + apr_psprintf(r->pool, + "Unable to create versioned resource %s.", + ap_escape_html(r->pool, resource->uri)), + err); + goto done; + } + + /* remember that resource was created */ + av_info->resource_versioned = 1; + } + + /* if resource is versioned, make sure it is checked out */ + if (resource->versioned && !resource->working) { + int checkout_resource; + + if ((err = dav_can_auto_checkout(r, resource, + (*vsn_hooks->auto_versionable)(resource), + &lockdb, &checkout_resource)) != NULL) { + goto done; + } + + if (!checkout_resource) { + err = dav_new_error(r->pool, HTTP_CONFLICT, 0, + ""); + goto done; + } + + /* Auto-versioning can only be applied to version selectors, so + * no separate working resource will be created. */ + if ((err = (*vsn_hooks->checkout)(resource, 1 /*auto_checkout*/, + 0, 0, 0, NULL, NULL)) + != NULL) + { + err = dav_push_error(r->pool, HTTP_CONFLICT, 0, + apr_psprintf(r->pool, + "Unable to checkout resource %s.", + ap_escape_html(r->pool, resource->uri)), + err); + goto done; + } + + /* remember that resource was checked out */ + av_info->resource_checkedout = 1; + } + +done: + + /* make sure lock database is closed */ + if (lockdb != NULL) + (*lockdb->hooks->close_lockdb)(lockdb); + + /* if an error occurred, undo any auto-versioning operations already done */ + if (err != NULL) { + dav_auto_checkin(r, resource, 1 /*undo*/, 0 /*unlock*/, av_info); + return err; + } + + return NULL; +} + +/* see mod_dav.h for docco */ +DAV_DECLARE(dav_error *) dav_auto_checkin( + request_rec *r, + dav_resource *resource, + int undo, + int unlock, + dav_auto_version_info *av_info) +{ + const dav_hooks_vsn *vsn_hooks = DAV_GET_HOOKS_VSN(r); + dav_error *err = NULL; + dav_auto_version auto_version; + + /* If no versioning provider, this is a no-op */ + if (vsn_hooks == NULL) + return NULL; + + /* If undoing auto-checkouts, then do uncheckouts */ + if (undo) { + if (resource != NULL) { + if (av_info->resource_checkedout) { + if ((err = (*vsn_hooks->uncheckout)(resource)) != NULL) { + return dav_push_error(r->pool, HTTP_INTERNAL_SERVER_ERROR, 0, + apr_psprintf(r->pool, + "Unable to undo auto-checkout " + "of resource %s.", + ap_escape_html(r->pool, resource->uri)), + err); + } + } + + if (av_info->resource_versioned) { + dav_response *response; + + /* ### should we do anything with the response? */ + if ((err = (*resource->hooks->remove_resource)(resource, + &response)) != NULL) { + return dav_push_error(r->pool, HTTP_INTERNAL_SERVER_ERROR, 0, + apr_psprintf(r->pool, + "Unable to undo auto-version-control " + "of resource %s.", + ap_escape_html(r->pool, resource->uri)), + err); + } + } + } + + if (av_info->parent_resource != NULL && av_info->parent_checkedout) { + if ((err = (*vsn_hooks->uncheckout)(av_info->parent_resource)) != NULL) { + return dav_push_error(r->pool, HTTP_INTERNAL_SERVER_ERROR, 0, + apr_psprintf(r->pool, + "Unable to undo auto-checkout " + "of parent collection %s.", + ap_escape_html(r->pool, av_info->parent_resource->uri)), + err); + } + } + + return NULL; + } + + /* If the resource was checked out, and auto-checkin is enabled, + * then check it in. + */ + if (resource != NULL && resource->working + && (unlock || av_info->resource_checkedout)) { + + auto_version = (*vsn_hooks->auto_versionable)(resource); + + if (auto_version == DAV_AUTO_VERSION_ALWAYS || + (unlock && (auto_version == DAV_AUTO_VERSION_LOCKED))) { + + if ((err = (*vsn_hooks->checkin)(resource, + 0 /*keep_checked_out*/, NULL)) + != NULL) { + return dav_push_error(r->pool, HTTP_INTERNAL_SERVER_ERROR, 0, + apr_psprintf(r->pool, + "Unable to auto-checkin resource %s.", + ap_escape_html(r->pool, resource->uri)), + err); + } + } + } + + /* If parent resource was checked out, and auto-checkin is enabled, + * then check it in. + */ + if (!unlock + && av_info->parent_checkedout + && av_info->parent_resource != NULL + && av_info->parent_resource->working) { + + auto_version = (*vsn_hooks->auto_versionable)(av_info->parent_resource); + + if (auto_version == DAV_AUTO_VERSION_ALWAYS) { + if ((err = (*vsn_hooks->checkin)(av_info->parent_resource, + 0 /*keep_checked_out*/, NULL)) + != NULL) { + return dav_push_error(r->pool, HTTP_INTERNAL_SERVER_ERROR, 0, + apr_psprintf(r->pool, + "Unable to auto-checkin parent collection %s.", + ap_escape_html(r->pool, av_info->parent_resource->uri)), + err); + } + } + } + + return NULL; +} diff --git a/rubbos/app/httpd-2.0.64/modules/dav/main/util_lock.c b/rubbos/app/httpd-2.0.64/modules/dav/main/util_lock.c new file mode 100644 index 00000000..cd39f067 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/dav/main/util_lock.c @@ -0,0 +1,791 @@ +/* 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. + */ + +/* +** DAV repository-independent lock functions +*/ + +#include "apr.h" +#include "apr_strings.h" + +#if APR_HAVE_STDIO_H +#include /* for sprintf() */ +#endif + +#include "mod_dav.h" +#include "http_log.h" +#include "http_config.h" +#include "http_protocol.h" +#include "http_core.h" + + +/* --------------------------------------------------------------- +** +** Property-related lock functions +** +*/ + +/* +** dav_lock_get_activelock: Returns a containing +** an activelock element for every item in the lock_discovery tree +*/ +DAV_DECLARE(const char *) dav_lock_get_activelock(request_rec *r, + dav_lock *lock, + dav_buffer *pbuf) +{ + dav_lock *lock_scan; + const dav_hooks_locks *hooks = DAV_GET_HOOKS_LOCKS(r); + int count = 0; + dav_buffer work_buf = { 0 }; + apr_pool_t *p = r->pool; + + /* If no locks or no lock provider, there are no locks */ + if (lock == NULL || hooks == NULL) { + /* + ** Since resourcediscovery is defined with (activelock)*, + ** shouldn't be necessary for an empty lock. + */ + return ""; + } + + /* + ** Note: it could be interesting to sum the lengths of the owners + ** and locktokens during this loop. However, the buffer + ** mechanism provides some rough padding so that we don't + ** really need to have an exact size. Further, constructing + ** locktoken strings could be relatively expensive. + */ + for (lock_scan = lock; lock_scan != NULL; lock_scan = lock_scan->next) + count++; + + /* if a buffer was not provided, then use an internal buffer */ + if (pbuf == NULL) + pbuf = &work_buf; + + /* reset the length before we start appending stuff */ + pbuf->cur_len = 0; + + /* prep the buffer with a "good" size */ + dav_check_bufsize(p, pbuf, count * 300); + + for (; lock != NULL; lock = lock->next) { + char tmp[100]; + +#if DAV_DEBUG + if (lock->rectype == DAV_LOCKREC_INDIRECT_PARTIAL) { + /* ### crap. design error */ + dav_buffer_append(p, pbuf, + "DESIGN ERROR: attempted to product an " + "activelock element from a partial, indirect " + "lock record. Creating an XML parsing error " + "to ease detection of this situation: <"); + } +#endif + + dav_buffer_append(p, pbuf, "" DEBUG_CR ""); + switch (lock->type) { + case DAV_LOCKTYPE_WRITE: + dav_buffer_append(p, pbuf, ""); + break; + default: + /* ### internal error. log something? */ + break; + } + dav_buffer_append(p, pbuf, "" DEBUG_CR ""); + switch (lock->scope) { + case DAV_LOCKSCOPE_EXCLUSIVE: + dav_buffer_append(p, pbuf, ""); + break; + case DAV_LOCKSCOPE_SHARED: + dav_buffer_append(p, pbuf, ""); + break; + default: + /* ### internal error. log something? */ + break; + } + dav_buffer_append(p, pbuf, "" DEBUG_CR); + sprintf(tmp, "%s" DEBUG_CR, + lock->depth == DAV_INFINITY ? "infinity" : "0"); + dav_buffer_append(p, pbuf, tmp); + + if (lock->owner) { + /* + ** This contains a complete, self-contained element, + ** with namespace declarations and xml:lang handling. Just drop + ** it in. + */ + dav_buffer_append(p, pbuf, lock->owner); + } + + dav_buffer_append(p, pbuf, ""); + if (lock->timeout == DAV_TIMEOUT_INFINITE) { + dav_buffer_append(p, pbuf, "Infinite"); + } + else { + time_t now = time(NULL); + sprintf(tmp, "Second-%lu", (long unsigned int)(lock->timeout - now)); + dav_buffer_append(p, pbuf, tmp); + } + + dav_buffer_append(p, pbuf, + "" DEBUG_CR + "" DEBUG_CR + ""); + dav_buffer_append(p, pbuf, + (*hooks->format_locktoken)(p, lock->locktoken)); + dav_buffer_append(p, pbuf, + "" DEBUG_CR + "" DEBUG_CR + "" DEBUG_CR); + } + + return pbuf->buf; +} + +/* +** dav_lock_parse_lockinfo: Validates the given xml_doc to contain a +** lockinfo XML element, then populates a dav_lock structure +** with its contents. +*/ +DAV_DECLARE(dav_error *) dav_lock_parse_lockinfo(request_rec *r, + const dav_resource *resource, + dav_lockdb *lockdb, + const apr_xml_doc *doc, + dav_lock **lock_request) +{ + apr_pool_t *p = r->pool; + dav_error *err; + apr_xml_elem *child; + dav_lock *lock; + + if (!dav_validate_root(doc, "lockinfo")) { + return dav_new_error(p, HTTP_BAD_REQUEST, 0, + "The request body contains an unexpected " + "XML root element."); + } + + if ((err = (*lockdb->hooks->create_lock)(lockdb, resource, + &lock)) != NULL) { + return dav_push_error(p, err->status, 0, + "Could not parse the lockinfo due to an " + "internal problem creating a lock structure.", + err); + } + + lock->depth = dav_get_depth(r, DAV_INFINITY); + if (lock->depth == -1) { + return dav_new_error(p, HTTP_BAD_REQUEST, 0, + "An invalid Depth header was specified."); + } + lock->timeout = dav_get_timeout(r); + + /* Parse elements in the XML body */ + for (child = doc->root->first_child; child; child = child->next) { + if (strcmp(child->name, "locktype") == 0 + && child->first_child + && lock->type == DAV_LOCKTYPE_UNKNOWN) { + if (strcmp(child->first_child->name, "write") == 0) { + lock->type = DAV_LOCKTYPE_WRITE; + continue; + } + } + if (strcmp(child->name, "lockscope") == 0 + && child->first_child + && lock->scope == DAV_LOCKSCOPE_UNKNOWN) { + if (strcmp(child->first_child->name, "exclusive") == 0) + lock->scope = DAV_LOCKSCOPE_EXCLUSIVE; + else if (strcmp(child->first_child->name, "shared") == 0) + lock->scope = DAV_LOCKSCOPE_SHARED; + if (lock->scope != DAV_LOCKSCOPE_UNKNOWN) + continue; + } + + if (strcmp(child->name, "owner") == 0 && lock->owner == NULL) { + const char *text; + + /* quote all the values in the element */ + apr_xml_quote_elem(p, child); + + /* + ** Store a full element with namespace definitions + ** and an xml:lang definition, if applicable. + */ + apr_xml_to_text(p, child, APR_XML_X2T_FULL_NS_LANG, doc->namespaces, + NULL, &text, NULL); + lock->owner = text; + + continue; + } + + return dav_new_error(p, HTTP_PRECONDITION_FAILED, 0, + apr_psprintf(p, + "The server cannot satisfy the " + "LOCK request due to an unknown XML " + "element (\"%s\") within the " + "DAV:lockinfo element.", + child->name)); + } + + *lock_request = lock; + return NULL; +} + +/* --------------------------------------------------------------- +** +** General lock functions +** +*/ + +/* dav_lock_walker: Walker callback function to record indirect locks */ +static dav_error * dav_lock_walker(dav_walk_resource *wres, int calltype) +{ + dav_walker_ctx *ctx = wres->walk_ctx; + dav_error *err; + + /* We don't want to set indirects on the target */ + if ((*wres->resource->hooks->is_same_resource)(wres->resource, + ctx->w.root)) + return NULL; + + if ((err = (*ctx->w.lockdb->hooks->append_locks)(ctx->w.lockdb, + wres->resource, 1, + ctx->lock)) != NULL) { + if (ap_is_HTTP_SERVER_ERROR(err->status)) { + /* ### add a higher-level description? */ + return err; + } + + /* add to the multistatus response */ + dav_add_response(wres, err->status, NULL); + + /* + ** ### actually, this is probably wrong: we want to fail the whole + ** ### LOCK process if something goes bad. maybe the caller should + ** ### do a dav_unlock() (e.g. a rollback) if any errors occurred. + */ + } + + return NULL; +} + +/* +** dav_add_lock: Add a direct lock for resource, and indirect locks for +** all children, bounded by depth. +** ### assume request only contains one lock +*/ +DAV_DECLARE(dav_error *) dav_add_lock(request_rec *r, + const dav_resource *resource, + dav_lockdb *lockdb, dav_lock *lock, + dav_response **response) +{ + dav_error *err; + int depth = lock->depth; + + *response = NULL; + + /* Requested lock can be: + * Depth: 0 for null resource, existing resource, or existing collection + * Depth: Inf for existing collection + */ + + /* + ** 2518 9.2 says to ignore depth if target is not a collection (it has + ** no internal children); pretend the client gave the correct depth. + */ + if (!resource->collection) { + depth = 0; + } + + /* In all cases, first add direct entry in lockdb */ + + /* + ** Append the new (direct) lock to the resource's existing locks. + ** + ** Note: this also handles locknull resources + */ + if ((err = (*lockdb->hooks->append_locks)(lockdb, resource, 0, + lock)) != NULL) { + /* ### maybe add a higher-level description */ + return err; + } + + if (depth > 0) { + /* Walk existing collection and set indirect locks */ + dav_walker_ctx ctx = { { 0 } }; + dav_response *multi_status; + + ctx.w.walk_type = DAV_WALKTYPE_NORMAL | DAV_WALKTYPE_AUTH; + ctx.w.func = dav_lock_walker; + ctx.w.walk_ctx = &ctx; + ctx.w.pool = r->pool; + ctx.w.root = resource; + ctx.w.lockdb = lockdb; + + ctx.r = r; + ctx.lock = lock; + + err = (*resource->hooks->walk)(&ctx.w, DAV_INFINITY, &multi_status); + if (err != NULL) { + /* implies a 5xx status code occurred. screw the multistatus */ + return err; + } + + if (multi_status != NULL) { + /* manufacture a 207 error for the multistatus response */ + *response = multi_status; + return dav_new_error(r->pool, HTTP_MULTI_STATUS, 0, + "Error(s) occurred on resources during the " + "addition of a depth lock."); + } + } + + return NULL; +} + +/* +** dav_lock_query: Opens the lock database. Returns a linked list of +** dav_lock structures for all direct locks on path. +*/ +DAV_DECLARE(dav_error*) dav_lock_query(dav_lockdb *lockdb, + const dav_resource *resource, + dav_lock **locks) +{ + /* If no lock database, return empty result */ + if (lockdb == NULL) { + *locks = NULL; + return NULL; + } + + /* ### insert a higher-level description? */ + return (*lockdb->hooks->get_locks)(lockdb, resource, + DAV_GETLOCKS_RESOLVED, + locks); +} + +/* dav_unlock_walker: Walker callback function to remove indirect locks */ +static dav_error * dav_unlock_walker(dav_walk_resource *wres, int calltype) +{ + dav_walker_ctx *ctx = wres->walk_ctx; + dav_error *err; + + /* Before removing the lock, do any auto-checkin required */ + if (wres->resource->working) { + /* ### get rid of this typecast */ + if ((err = dav_auto_checkin(ctx->r, (dav_resource *) wres->resource, + 0 /*undo*/, 1 /*unlock*/, NULL)) + != NULL) { + return err; + } + } + + if ((err = (*ctx->w.lockdb->hooks->remove_lock)(ctx->w.lockdb, + wres->resource, + ctx->locktoken)) != NULL) { + /* ### should we stop or return a multistatus? looks like STOP */ + /* ### add a higher-level description? */ + return err; + } + + return NULL; +} + +/* +** dav_get_direct_resource: +** +** Find a lock on the specified resource, then return the resource the +** lock was applied to (in other words, given a (possibly) indirect lock, +** return the direct lock's corresponding resource). +** +** If the lock is an indirect lock, this usually means traversing up the +** namespace [repository] hierarchy. Note that some lock providers may be +** able to return this information with a traversal. +*/ +static dav_error * dav_get_direct_resource(apr_pool_t *p, + dav_lockdb *lockdb, + const dav_locktoken *locktoken, + const dav_resource *resource, + const dav_resource **direct_resource) +{ + if (lockdb->hooks->lookup_resource != NULL) { + return (*lockdb->hooks->lookup_resource)(lockdb, locktoken, + resource, direct_resource); + } + + *direct_resource = NULL; + + /* Find the top of this lock- + * If r->filename's direct locks include locktoken, use r->filename. + * If r->filename's indirect locks include locktoken, retry r->filename/.. + * Else fail. + */ + while (resource != NULL) { + dav_error *err; + dav_lock *lock; + dav_resource *parent; + + /* + ** Find the lock specified by on . If it is + ** an indirect lock, then partial results are okay. We're just + ** trying to find the thing and know whether it is a direct or + ** an indirect lock. + */ + if ((err = (*lockdb->hooks->find_lock)(lockdb, resource, locktoken, + 1, &lock)) != NULL) { + /* ### add a higher-level desc? */ + return err; + } + + /* not found! that's an error. */ + if (lock == NULL) { + return dav_new_error(p, HTTP_BAD_REQUEST, 0, + "The specified locktoken does not correspond " + "to an existing lock on this resource."); + } + + if (lock->rectype == DAV_LOCKREC_DIRECT) { + /* we found the direct lock. return this resource. */ + + *direct_resource = resource; + return NULL; + } + + /* the lock was indirect. move up a level in the URL namespace */ + if ((err = (*resource->hooks->get_parent_resource)(resource, + &parent)) != NULL) { + /* ### add a higher-level desc? */ + return err; + } + resource = parent; + } + + return dav_new_error(p, HTTP_INTERNAL_SERVER_ERROR, 0, + "The lock database is corrupt. A direct lock could " + "not be found for the corresponding indirect lock " + "on this resource."); +} + +/* +** dav_unlock: Removes all direct and indirect locks for r->filename, +** with given locktoken. If locktoken == null_locktoken, all locks +** are removed. If r->filename represents an indirect lock, +** we must unlock the appropriate direct lock. +** Returns OK or appropriate HTTP_* response and logs any errors. +** +** ### We've already crawled the tree to ensure everything was locked +** by us; there should be no need to incorporate a rollback. +*/ +DAV_DECLARE(int) dav_unlock(request_rec *r, const dav_resource *resource, + const dav_locktoken *locktoken) +{ + int result; + dav_lockdb *lockdb; + const dav_resource *lock_resource = resource; + const dav_hooks_locks *hooks = DAV_GET_HOOKS_LOCKS(r); + const dav_hooks_repository *repos_hooks = resource->hooks; + dav_walker_ctx ctx = { { 0 } }; + dav_response *multi_status; + dav_error *err; + + /* If no locks provider, then there is nothing to unlock. */ + if (hooks == NULL) { + return OK; + } + + /* 2518 requires the entire lock to be removed if resource/locktoken + * point to an indirect lock. We need resource of the _direct_ + * lock in order to walk down the tree and remove the locks. So, + * If locktoken != null_locktoken, + * Walk up the resource hierarchy until we see a direct lock. + * Or, we could get the direct lock's db/key, pick out the URL + * and do a subrequest. I think walking up is faster and will work + * all the time. + * Else + * Just start removing all locks at and below resource. + */ + + if ((err = (*hooks->open_lockdb)(r, 0, 1, &lockdb)) != NULL) { + /* ### return err! maybe add a higher-level desc */ + /* ### map result to something nice; log an error */ + return HTTP_INTERNAL_SERVER_ERROR; + } + + if (locktoken != NULL + && (err = dav_get_direct_resource(r->pool, lockdb, + locktoken, resource, + &lock_resource)) != NULL) { + /* ### add a higher-level desc? */ + /* ### should return err! */ + return err->status; + } + + /* At this point, lock_resource/locktoken refers to a direct lock (key), ie + * the root of a depth > 0 lock, or locktoken is null. + */ + ctx.w.walk_type = DAV_WALKTYPE_NORMAL | DAV_WALKTYPE_LOCKNULL; + ctx.w.func = dav_unlock_walker; + ctx.w.walk_ctx = &ctx; + ctx.w.pool = r->pool; + ctx.w.root = lock_resource; + ctx.w.lockdb = lockdb; + + ctx.r = r; + ctx.locktoken = locktoken; + + err = (*repos_hooks->walk)(&ctx.w, DAV_INFINITY, &multi_status); + + /* ### fix this! */ + /* ### do something with multi_status */ + result = err == NULL ? OK : err->status; + + (*hooks->close_lockdb)(lockdb); + + return result; +} + +/* dav_inherit_walker: Walker callback function to inherit locks */ +static dav_error * dav_inherit_walker(dav_walk_resource *wres, int calltype) +{ + dav_walker_ctx *ctx = wres->walk_ctx; + + if (ctx->skip_root + && (*wres->resource->hooks->is_same_resource)(wres->resource, + ctx->w.root)) { + return NULL; + } + + /* ### maybe add a higher-level desc */ + return (*ctx->w.lockdb->hooks->append_locks)(ctx->w.lockdb, + wres->resource, 1, + ctx->lock); +} + +/* +** dav_inherit_locks: When a resource or collection is added to a collection, +** locks on the collection should be inherited to the resource/collection. +** (MOVE, MKCOL, etc) Here we propagate any direct or indirect locks from +** parent of resource to resource and below. +*/ +static dav_error * dav_inherit_locks(request_rec *r, dav_lockdb *lockdb, + const dav_resource *resource, + int use_parent) +{ + dav_error *err; + const dav_resource *which_resource; + dav_lock *locks; + dav_lock *scan; + dav_lock *prev; + dav_walker_ctx ctx = { { 0 } }; + const dav_hooks_repository *repos_hooks = resource->hooks; + dav_response *multi_status; + + if (use_parent) { + dav_resource *parent; + if ((err = (*repos_hooks->get_parent_resource)(resource, + &parent)) != NULL) { + /* ### add a higher-level desc? */ + return err; + } + if (parent == NULL) { + /* ### map result to something nice; log an error */ + return dav_new_error(r->pool, HTTP_INTERNAL_SERVER_ERROR, 0, + "Could not fetch parent resource. Unable to " + "inherit locks from the parent and apply " + "them to this resource."); + } + which_resource = parent; + } + else { + which_resource = resource; + } + + if ((err = (*lockdb->hooks->get_locks)(lockdb, which_resource, + DAV_GETLOCKS_PARTIAL, + &locks)) != NULL) { + /* ### maybe add a higher-level desc */ + return err; + } + + if (locks == NULL) { + /* No locks to propagate, just return */ + return NULL; + } + + /* + ** (1) Copy all indirect locks from our parent; + ** (2) Create indirect locks for the depth infinity, direct locks + ** in our parent. + ** + ** The append_locks call in the walker callback will do the indirect + ** conversion, but we need to remove any direct locks that are NOT + ** depth "infinity". + */ + for (scan = locks, prev = NULL; + scan != NULL; + prev = scan, scan = scan->next) { + + if (scan->rectype == DAV_LOCKREC_DIRECT + && scan->depth != DAV_INFINITY) { + + if (prev == NULL) + locks = scan->next; + else + prev->next = scan->next; + } + } + + /* has all our new locks. Walk down and propagate them. */ + + ctx.w.walk_type = DAV_WALKTYPE_NORMAL | DAV_WALKTYPE_LOCKNULL; + ctx.w.func = dav_inherit_walker; + ctx.w.walk_ctx = &ctx; + ctx.w.pool = r->pool; + ctx.w.root = resource; + ctx.w.lockdb = lockdb; + + ctx.r = r; + ctx.lock = locks; + ctx.skip_root = !use_parent; + + /* ### do something with multi_status */ + return (*repos_hooks->walk)(&ctx.w, DAV_INFINITY, &multi_status); +} + +/* --------------------------------------------------------------- +** +** Functions dealing with lock-null resources +** +*/ + +/* +** dav_get_resource_state: Returns the state of the resource +** r->filename: DAV_RESOURCE_NULL, DAV_RESOURCE_LOCK_NULL, +** or DAV_RESOURCE_EXIST. +** +** Returns DAV_RESOURCE_ERROR if an error occurs. +*/ +DAV_DECLARE(int) dav_get_resource_state(request_rec *r, + const dav_resource *resource) +{ + const dav_hooks_locks *hooks = DAV_GET_HOOKS_LOCKS(r); + + if (resource->exists) + return DAV_RESOURCE_EXISTS; + + if (hooks != NULL) { + dav_error *err; + dav_lockdb *lockdb; + int locks_present; + + /* + ** A locknull resource has the form: + ** + ** known-dir "/" locknull-file + ** + ** It would be nice to look into to verify this form, + ** but it does not have enough information for us. Instead, we + ** can look at the path_info. If the form does not match, then + ** there is no way we could have a locknull resource -- it must + ** be a plain, null resource. + ** + ** Apache sets r->filename to known-dir/unknown-file and r->path_info + ** to "" for the "proper" case. If anything is in path_info, then + ** it can't be a locknull resource. + ** + ** ### I bet this path_info hack doesn't work for repositories. + ** ### Need input from repository implementors! What kind of + ** ### restructure do we need? New provider APIs? + */ + if (r->path_info != NULL && *r->path_info != '\0') { + return DAV_RESOURCE_NULL; + } + + if ((err = (*hooks->open_lockdb)(r, 1, 1, &lockdb)) == NULL) { + /* note that we might see some expired locks... *shrug* */ + err = (*hooks->has_locks)(lockdb, resource, &locks_present); + (*hooks->close_lockdb)(lockdb); + } + + if (err != NULL) { + /* ### don't log an error. return err. add higher-level desc. */ + + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Failed to query lock-null status for %s", + r->filename); + + return DAV_RESOURCE_ERROR; + } + + if (locks_present) + return DAV_RESOURCE_LOCK_NULL; + } + + return DAV_RESOURCE_NULL; +} + +DAV_DECLARE(dav_error *) dav_notify_created(request_rec *r, + dav_lockdb *lockdb, + const dav_resource *resource, + int resource_state, + int depth) +{ + dav_error *err; + + if (resource_state == DAV_RESOURCE_LOCK_NULL) { + + /* + ** The resource is no longer a locknull resource. This will remove + ** the special marker. + ** + ** Note that a locknull resource has already inherited all of the + ** locks from the parent. We do not need to call dav_inherit_locks. + ** + ** NOTE: some lock providers record locks for locknull resources using + ** a different key than for regular resources. this will shift + ** the lock information between the two key types. + */ + (void)(*lockdb->hooks->remove_locknull_state)(lockdb, resource); + + /* + ** There are resources under this one, which are new. We must + ** propagate the locks down to the new resources. + */ + if (depth > 0 && + (err = dav_inherit_locks(r, lockdb, resource, 0)) != NULL) { + /* ### add a higher level desc? */ + return err; + } + } + else if (resource_state == DAV_RESOURCE_NULL) { + + /* ### should pass depth to dav_inherit_locks so that it can + ** ### optimize for the depth==0 case. + */ + + /* this resource should inherit locks from its parent */ + if ((err = dav_inherit_locks(r, lockdb, resource, 1)) != NULL) { + + err = dav_push_error(r->pool, err->status, 0, + "The resource was created successfully, but " + "there was a problem inheriting locks from " + "the parent resource.", + err); + return err; + } + } + /* else the resource already exists and its locks are correct. */ + + return NULL; +} diff --git a/rubbos/app/httpd-2.0.64/modules/echo/.deps b/rubbos/app/httpd-2.0.64/modules/echo/.deps new file mode 100644 index 00000000..e69de29b diff --git a/rubbos/app/httpd-2.0.64/modules/echo/.indent.pro b/rubbos/app/httpd-2.0.64/modules/echo/.indent.pro new file mode 100644 index 00000000..a9fbe9f9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/echo/.indent.pro @@ -0,0 +1,54 @@ +-i4 -npsl -di0 -br -nce -d0 -cli0 -npcs -nfc1 +-TBUFF +-TFILE +-TTRANS +-TUINT4 +-T_trans +-Tallow_options_t +-Tapache_sfio +-Tarray_header +-Tbool_int +-Tbuf_area +-Tbuff_struct +-Tbuffy +-Tcmd_how +-Tcmd_parms +-Tcommand_rec +-Tcommand_struct +-Tconn_rec +-Tcore_dir_config +-Tcore_server_config +-Tdir_maker_func +-Tevent +-Tglobals_s +-Thandler_func +-Thandler_rec +-Tjoblist_s +-Tlisten_rec +-Tmerger_func +-Tmode_t +-Tmodule +-Tmodule_struct +-Tmutex +-Tn_long +-Tother_child_rec +-Toverrides_t +-Tparent_score +-Tpid_t +-Tpiped_log +-Tpool +-Trequest_rec +-Trequire_line +-Trlim_t +-Tscoreboard +-Tsemaphore +-Tserver_addr_rec +-Tserver_rec +-Tserver_rec_chain +-Tshort_score +-Ttable +-Ttable_entry +-Tthread +-Tu_wide_int +-Tvtime_t +-Twide_int diff --git a/rubbos/app/httpd-2.0.64/modules/echo/Makefile b/rubbos/app/httpd-2.0.64/modules/echo/Makefile new file mode 100644 index 00000000..353de416 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/echo/Makefile @@ -0,0 +1,8 @@ +top_srcdir = /bottlenecks/rubbos/app/httpd-2.0.64 +top_builddir = /bottlenecks/rubbos/app/httpd-2.0.64 +srcdir = /bottlenecks/rubbos/app/httpd-2.0.64/modules/echo +builddir = /bottlenecks/rubbos/app/httpd-2.0.64/modules/echo +VPATH = /bottlenecks/rubbos/app/httpd-2.0.64/modules/echo + +include $(top_srcdir)/build/special.mk + diff --git a/rubbos/app/httpd-2.0.64/modules/echo/Makefile.in b/rubbos/app/httpd-2.0.64/modules/echo/Makefile.in new file mode 100644 index 00000000..167b343d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/echo/Makefile.in @@ -0,0 +1,3 @@ + +include $(top_srcdir)/build/special.mk + diff --git a/rubbos/app/httpd-2.0.64/modules/echo/NWGNUmakefile b/rubbos/app/httpd-2.0.64/modules/echo/NWGNUmakefile new file mode 100644 index 00000000..a2eecb32 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/echo/NWGNUmakefile @@ -0,0 +1,257 @@ +# +# Declare the sub-directories to be built here +# + +SUBDIRS = \ + $(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 \ + $(AP_WORK)/include \ + $(NWOS) \ + $(EOLIST) + +# +# These flags will come after CFLAGS +# +XCFLAGS += \ + $(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 = echo + +# +# This is used by the link '-desc ' directive. +# If left blank, NLM_NAME will be used. +# +NLM_DESCRIPTION = Apache $(VERSION_STR) Echo Module + +# +# This is used by the '-threadname' directive. If left blank, +# NLM_NAME Thread will be used. +# +NLM_THREAD_NAME = Echo Module + +# +# 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 = 8192 + + +# +# If this is specified it will be used by the link '-entry' directive +# +NLM_ENTRY_SYM = _LibCPrelude + +# +# If this is specified it will be used by the link '-exit' directive +# +NLM_EXIT_SYM = _LibCPostlude + +# +# If this is specified it will be used by the link '-check' directive +# +NLM_CHECK_SYM = + +# +# If these are specified it will be used by the link '-flags' directive +# +NLM_FLAGS = AUTOUNLOAD, 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)/echo.nlm \ + $(EOLIST) + +# +# If there is an LIB target, put it here +# +TARGET_lib = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the NLM target above. +# Paths must all use the '/' character +# +FILES_nlm_objs = \ + $(OBJDIR)/mod_echo.o \ + $(EOLIST) + +# +# 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 = \ + libcpre.o \ + $(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 = \ + @$(APR)/aprlib.imp \ + @$(NWOS)/httpd.imp \ + @libc.imp \ + $(EOLIST) + +# +# Any symbols exported to here +# +FILES_nlm_exports = \ + echo_module \ + $(EOLIST) + +# +# These are the OBJ files needed to create the LIB target above. +# Paths must all use the '/' character +# +FILES_lib_objs = \ + $(EOLIST) + +# +# 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) +# +install :: nlms FORCE + copy $(OBJDIR)\*.nlm $(INSTALL)\Apache2\modules\*.* + +# +# Any specialized rules here +# + +# +# Include the 'tail' makefile that has targets that depend on variables defined +# in this makefile +# + +include $(AP_WORK)\build\NWGNUtail.inc + + diff --git a/rubbos/app/httpd-2.0.64/modules/echo/config.m4 b/rubbos/app/httpd-2.0.64/modules/echo/config.m4 new file mode 100644 index 00000000..234a7d5e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/echo/config.m4 @@ -0,0 +1,11 @@ +dnl modules enabled in this directory by default + +dnl APACHE_MODULE(name, helptext[, objects[, structname[, default[, config]]]]) + +APACHE_MODPATH_INIT(echo) + +APACHE_MODULE(echo, ECHO server, , , no) + +APR_ADDTO(LT_LDFLAGS,-export-dynamic) + +APACHE_MODPATH_FINISH diff --git a/rubbos/app/httpd-2.0.64/modules/echo/mod_echo.c b/rubbos/app/httpd-2.0.64/modules/echo/mod_echo.c new file mode 100644 index 00000000..e9e6c33a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/echo/mod_echo.c @@ -0,0 +1,102 @@ +/* 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. + */ + +#include "ap_config.h" +#include "ap_mmn.h" +#include "httpd.h" +#include "http_config.h" +#include "http_connection.h" + +#include "apr_buckets.h" +#include "util_filter.h" + +module AP_MODULE_DECLARE_DATA echo_module; + +typedef struct { + int bEnabled; +} EchoConfig; + +static void *create_echo_server_config(apr_pool_t *p, server_rec *s) +{ + EchoConfig *pConfig = apr_pcalloc(p, sizeof *pConfig); + + pConfig->bEnabled = 0; + + return pConfig; +} + +static const char *echo_on(cmd_parms *cmd, void *dummy, int arg) +{ + EchoConfig *pConfig = ap_get_module_config(cmd->server->module_config, + &echo_module); + pConfig->bEnabled = arg; + + return NULL; +} + +static int process_echo_connection(conn_rec *c) +{ + apr_bucket_brigade *bb; + apr_bucket *b; + apr_status_t rv; + EchoConfig *pConfig = ap_get_module_config(c->base_server->module_config, + &echo_module); + + if (!pConfig->bEnabled) { + return DECLINED; + } + + bb = apr_brigade_create(c->pool, c->bucket_alloc); + + for ( ; ; ) { + /* Get a single line of input from the client */ + if ((rv = ap_get_brigade(c->input_filters, bb, AP_MODE_GETLINE, + APR_BLOCK_READ, 0) != APR_SUCCESS || + APR_BRIGADE_EMPTY(bb))) { + apr_brigade_destroy(bb); + break; + } + + /* Make sure the data is flushed to the client */ + b = apr_bucket_flush_create(c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, b); + ap_pass_brigade(c->output_filters, bb); + } + return OK; +} + +static const command_rec echo_cmds[] = +{ + AP_INIT_FLAG("ProtocolEcho", echo_on, NULL, RSRC_CONF, + "Run an echo server on this host"), + { NULL } +}; + +static void register_hooks(apr_pool_t *p) +{ + ap_hook_process_connection(process_echo_connection, NULL, NULL, + APR_HOOK_MIDDLE); +} + +module AP_MODULE_DECLARE_DATA echo_module = { + STANDARD20_MODULE_STUFF, + NULL, /* create per-directory config structure */ + NULL, /* merge per-directory config structures */ + create_echo_server_config, /* create per-server config structure */ + NULL, /* merge per-server config structures */ + echo_cmds, /* command apr_table_t */ + register_hooks /* register hooks */ +}; diff --git a/rubbos/app/httpd-2.0.64/modules/echo/mod_echo.dsp b/rubbos/app/httpd-2.0.64/modules/echo/mod_echo.dsp new file mode 100644 index 00000000..5f1543cf --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/echo/mod_echo.dsp @@ -0,0 +1,128 @@ +# Microsoft Developer Studio Project File - Name="mod_echo" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=mod_echo - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "mod_echo.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 "mod_echo.mak" CFG="mod_echo - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "mod_echo - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_echo - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "mod_echo - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_echo_src" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /out:"Release/mod_echo.so" /base:@..\..\os\win32\BaseAddr.ref,mod_echo.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Release/mod_echo.so" /base:@..\..\os\win32\BaseAddr.ref,mod_echo.so /opt:ref + +!ELSEIF "$(CFG)" == "mod_echo - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_echo_src" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_echo.so" /base:@..\..\os\win32\BaseAddr.ref,mod_echo.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_echo.so" /base:@..\..\os\win32\BaseAddr.ref,mod_echo.so + +!ENDIF + +# Begin Target + +# Name "mod_echo - Win32 Release" +# Name "mod_echo - Win32 Debug" +# Begin Source File + +SOURCE=.\mod_echo.c +# End Source File +# Begin Source File + +SOURCE=.\mod_echo.rc +# End Source File +# Begin Source File + +SOURCE=..\..\build\win32\win32ver.awk + +!IF "$(CFG)" == "mod_echo - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_echo.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_echo.so "echo_module for Apache" ../../include/ap_release.h > .\mod_echo.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "mod_echo - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_echo.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_echo.so "echo_module for Apache" ../../include/ap_release.h > .\mod_echo.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/modules/echo/modules.mk b/rubbos/app/httpd-2.0.64/modules/echo/modules.mk new file mode 100644 index 00000000..ceb52a1b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/echo/modules.mk @@ -0,0 +1,3 @@ +DISTCLEAN_TARGETS = modules.mk +static = +shared = diff --git a/rubbos/app/httpd-2.0.64/modules/experimental/.deps b/rubbos/app/httpd-2.0.64/modules/experimental/.deps new file mode 100644 index 00000000..e69de29b diff --git a/rubbos/app/httpd-2.0.64/modules/experimental/.indent.pro b/rubbos/app/httpd-2.0.64/modules/experimental/.indent.pro new file mode 100644 index 00000000..a9fbe9f9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/experimental/.indent.pro @@ -0,0 +1,54 @@ +-i4 -npsl -di0 -br -nce -d0 -cli0 -npcs -nfc1 +-TBUFF +-TFILE +-TTRANS +-TUINT4 +-T_trans +-Tallow_options_t +-Tapache_sfio +-Tarray_header +-Tbool_int +-Tbuf_area +-Tbuff_struct +-Tbuffy +-Tcmd_how +-Tcmd_parms +-Tcommand_rec +-Tcommand_struct +-Tconn_rec +-Tcore_dir_config +-Tcore_server_config +-Tdir_maker_func +-Tevent +-Tglobals_s +-Thandler_func +-Thandler_rec +-Tjoblist_s +-Tlisten_rec +-Tmerger_func +-Tmode_t +-Tmodule +-Tmodule_struct +-Tmutex +-Tn_long +-Tother_child_rec +-Toverrides_t +-Tparent_score +-Tpid_t +-Tpiped_log +-Tpool +-Trequest_rec +-Trequire_line +-Trlim_t +-Tscoreboard +-Tsemaphore +-Tserver_addr_rec +-Tserver_rec +-Tserver_rec_chain +-Tshort_score +-Ttable +-Ttable_entry +-Tthread +-Tu_wide_int +-Tvtime_t +-Twide_int diff --git a/rubbos/app/httpd-2.0.64/modules/experimental/Makefile b/rubbos/app/httpd-2.0.64/modules/experimental/Makefile new file mode 100644 index 00000000..9d5e211d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/experimental/Makefile @@ -0,0 +1,8 @@ +top_srcdir = /bottlenecks/rubbos/app/httpd-2.0.64 +top_builddir = /bottlenecks/rubbos/app/httpd-2.0.64 +srcdir = /bottlenecks/rubbos/app/httpd-2.0.64/modules/experimental +builddir = /bottlenecks/rubbos/app/httpd-2.0.64/modules/experimental +VPATH = /bottlenecks/rubbos/app/httpd-2.0.64/modules/experimental +# a modules Makefile has no explicit targets -- they will be defined by +# whatever modules are enabled. just grab special.mk to deal with this. +include $(top_srcdir)/build/special.mk diff --git a/rubbos/app/httpd-2.0.64/modules/experimental/Makefile.in b/rubbos/app/httpd-2.0.64/modules/experimental/Makefile.in new file mode 100644 index 00000000..7c5c149d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/experimental/Makefile.in @@ -0,0 +1,3 @@ +# a modules Makefile has no explicit targets -- they will be defined by +# whatever modules are enabled. just grab special.mk to deal with this. +include $(top_srcdir)/build/special.mk diff --git a/rubbos/app/httpd-2.0.64/modules/experimental/NWGNUauthldap b/rubbos/app/httpd-2.0.64/modules/experimental/NWGNUauthldap new file mode 100644 index 00000000..4963a1dd --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/experimental/NWGNUauthldap @@ -0,0 +1,262 @@ +# +# Make sure all needed macro's are defined +# + +# +# Get the 'head' of the build environment if necessary. This includes default +# targets and paths to tools +# + +ifndef EnvironmentDefined +include $(AP_WORK)\build\NWGNUhead.inc +endif + +# +# These directories will be at the beginning of the include list, followed by +# INCDIRS +# +XINCDIRS += \ + $(APR)/include \ + $(APRUTIL)/include \ + $(AP_WORK)/include \ + $(NWOS) \ + $(LDAPSDK)/inc \ + $(EOLIST) + +# +# These flags will come after CFLAGS +# +XCFLAGS += \ + $(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 = authldap + +# +# This is used by the link '-desc ' directive. +# If left blank, NLM_NAME will be used. +# +NLM_DESCRIPTION = Apache $(VERSION_STR) LDAP Authentication Module + +# +# This is used by the '-threadname' directive. If left blank, +# NLM_NAME Thread will be used. +# +NLM_THREAD_NAME = AuthLDAP Module + +# +# 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 = 8192 + + +# +# If this is specified it will be used by the link '-entry' directive +# +NLM_ENTRY_SYM = _LibCPrelude + +# +# If this is specified it will be used by the link '-exit' directive +# +NLM_EXIT_SYM = _LibCPostlude + +# +# If this is specified it will be used by the link '-check' directive +# +NLM_CHECK_SYM = + +# +# If these are specified it will be used by the link '-flags' directive +# +NLM_FLAGS = AUTOUNLOAD, 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)/authldap.nlm \ + $(EOLIST) + +# +# If there is an LIB target, put it here +# +TARGET_lib = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the NLM target above. +# Paths must all use the '/' character +# +FILES_nlm_objs = \ + $(OBJDIR)/mod_auth_ldap.o \ + $(EOLIST) + +# +# 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 = \ + libcpre.o \ + $(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 \ + lldapsdk \ + lldapssl \ + lldapx \ + $(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 = \ + util_ldap_connection_find \ + util_ldap_connection_close \ + util_ldap_connection_unbind \ + util_ldap_connection_cleanup \ + util_ldap_cache_checkuserid \ + util_ldap_cache_compare \ + util_ldap_cache_comparedn \ + @$(APR)/aprlib.imp \ + @$(NWOS)/httpd.imp \ + @libc.imp \ + @$(LDAPSDK)/imports/lldapsdk.imp \ + $(EOLIST) + +# +# Any symbols exported to here +# +FILES_nlm_exports = \ + auth_ldap_module \ + $(EOLIST) + +# +# These are the OBJ files needed to create the LIB target above. +# Paths must all use the '/' character +# +FILES_lib_objs = \ + $(EOLIST) + +# +# 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) +# +install :: nlms FORCE + copy $(OBJDIR)\*.nlm $(INSTALL)\Apache2\modules\*.* + copy charset.conv $(INSTALL)\Apache2\conf\*.* + +# +# Any specialized rules here +# + +# +# Include the 'tail' makefile that has targets that depend on variables defined +# in this makefile +# + +include $(AP_WORK)\build\NWGNUtail.inc + + diff --git a/rubbos/app/httpd-2.0.64/modules/experimental/NWGNUcharsetl b/rubbos/app/httpd-2.0.64/modules/experimental/NWGNUcharsetl new file mode 100644 index 00000000..b4e4f595 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/experimental/NWGNUcharsetl @@ -0,0 +1,257 @@ +# +# Declare the sub-directories to be built here +# + +SUBDIRS = \ + $(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 \ + $(AP_WORK)/include \ + $(NWOS) \ + $(EOLIST) + +# +# These flags will come after CFLAGS +# +XCFLAGS += \ + $(EOLIST) + +# +# These defines will come after DEFINES +# +XDEFINES += \ + -DAP_WANT_DIR_TRANSLATION \ + $(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 = charsetl + +# +# This is used by the link '-desc ' directive. +# If left blank, NLM_NAME will be used. +# +NLM_DESCRIPTION = Apache $(VERSION_STR) Charset Lite Module + +# +# This is used by the '-threadname' directive. If left blank, +# NLM_NAME Thread will be used. +# +NLM_THREAD_NAME = charsetl + +# +# 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 = 8192 + + +# +# If this is specified it will be used by the link '-entry' directive +# +NLM_ENTRY_SYM = _LibCPrelude + +# +# If this is specified it will be used by the link '-exit' directive +# +NLM_EXIT_SYM = _LibCPostlude + +# +# If this is specified it will be used by the link '-check' directive +# +NLM_CHECK_SYM = + +# +# If these are specified it will be used by the link '-flags' directive +# +NLM_FLAGS = AUTOUNLOAD, 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)/charsetl.nlm \ + $(EOLIST) + +# +# If there is an LIB target, put it here +# +TARGET_lib = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the NLM target above. +# Paths must all use the '/' character +# +FILES_nlm_objs = \ + $(OBJDIR)/mod_charset_lite.o \ + $(EOLIST) + +# +# 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 = \ + libcpre.o \ + $(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 = \ + @$(APR)/aprlib.imp \ + @$(NWOS)/httpd.imp \ + @libc.imp \ + $(EOLIST) + +# +# Any symbols exported to here +# +FILES_nlm_exports = \ + charset_lite_module \ + $(EOLIST) + +# +# These are the OBJ files needed to create the LIB target above. +# Paths must all use the '/' character +# +FILES_lib_objs = \ + $(EOLIST) + +# +# 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) +# +install :: nlms FORCE + +# +# Any specialized rules here +# + +# +# Include the 'tail' makefile that has targets that depend on variables defined +# in this makefile +# + +include $(AP_WORK)\build\NWGNUtail.inc + + diff --git a/rubbos/app/httpd-2.0.64/modules/experimental/NWGNUdsk_cach b/rubbos/app/httpd-2.0.64/modules/experimental/NWGNUdsk_cach new file mode 100644 index 00000000..879dd86e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/experimental/NWGNUdsk_cach @@ -0,0 +1,261 @@ +# +# Declare the sub-directories to be built here +# + +SUBDIRS = \ + $(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 \ + $(AP_WORK)/include \ + $(NWOS) \ + $(EOLIST) + +# +# These flags will come after CFLAGS +# +XCFLAGS += \ + $(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 = dsk_cach + +# +# This is used by the link '-desc ' directive. +# If left blank, NLM_NAME will be used. +# +NLM_DESCRIPTION = Apache $(VERSION_STR) Memory Cache Sub-Module + +# +# This is used by the '-threadname' directive. If left blank, +# NLM_NAME Thread will be used. +# +NLM_THREAD_NAME = dsk_cach + +# +# 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 = _LibCPrelude + +# +# If this is specified it will be used by the link '-exit' directive +# +NLM_EXIT_SYM = _LibCPostlude + +# +# If this is specified it will be used by the link '-check' directive +# +NLM_CHECK_SYM = + +# +# If this is specified it will be used by the link '-flags' directive +# +NLM_FLAGS = AUTOUNLOAD, 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 = + +# +# Declare all target files (you must add your files here) +# + +# +# If there is an NLM target, put it here +# +TARGET_nlm = \ + $(OBJDIR)/dsk_cach.nlm \ + $(EOLIST) + +# +# If there is an LIB target, put it here +# +TARGET_lib = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the NLM target above. +# Paths must all use the '/' character +# +FILES_nlm_objs = \ + $(OBJDIR)/mod_disk_cache.o \ + $(EOLIST) + +# +# 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 = \ + libcpre.o \ + $(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 = \ + Apache2 \ + Libc \ + mod_cach \ + $(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 = \ + @libc.imp \ + @$(APR)/aprlib.imp \ + @httpd.imp \ + @mod_cache.imp \ + $(EOLIST) + +# +# Any symbols exported to here +# +FILES_nlm_exports = \ + disk_cache_module \ + $(EOLIST) + +# +# These are the OBJ files needed to create the LIB target above. +# Paths must all use the '/' character +# +FILES_lib_objs = \ + $(EOLIST) + +# +# 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) +# +install :: nlms FORCE + +# +# Any specialized rules here +# + +# +# Include the 'tail' makefile that has targets that depend on variables defined +# in this makefile +# + +include $(AP_WORK)\build\NWGNUtail.inc + + diff --git a/rubbos/app/httpd-2.0.64/modules/experimental/NWGNUexample b/rubbos/app/httpd-2.0.64/modules/experimental/NWGNUexample new file mode 100644 index 00000000..01b7b85e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/experimental/NWGNUexample @@ -0,0 +1,256 @@ +# +# Declare the sub-directories to be built here +# + +SUBDIRS = \ + $(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 \ + $(AP_WORK)/include \ + $(NWOS) \ + $(EOLIST) + +# +# These flags will come after CFLAGS +# +XCFLAGS += \ + $(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 = example + +# +# This is used by the link '-desc ' directive. +# If left blank, NLM_NAME will be used. +# +NLM_DESCRIPTION = Apache $(VERSION_STR) Example Module + +# +# This is used by the '-threadname' directive. If left blank, +# NLM_NAME Thread will be used. +# +NLM_THREAD_NAME = Example Module + +# +# 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 = 8192 + + +# +# If this is specified it will be used by the link '-entry' directive +# +NLM_ENTRY_SYM = _LibCPrelude + +# +# If this is specified it will be used by the link '-exit' directive +# +NLM_EXIT_SYM = _LibCPostlude + +# +# If this is specified it will be used by the link '-check' directive +# +NLM_CHECK_SYM = + +# +# If these are specified it will be used by the link '-flags' directive +# +NLM_FLAGS = AUTOUNLOAD, 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)/example.nlm \ + $(EOLIST) + +# +# If there is an LIB target, put it here +# +TARGET_lib = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the NLM target above. +# Paths must all use the '/' character +# +FILES_nlm_objs = \ + $(OBJDIR)/mod_example.o \ + $(EOLIST) + +# +# 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 = \ + libcpre.o \ + $(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 = \ + @$(APR)/aprlib.imp \ + @$(NWOS)/httpd.imp \ + @libc.imp \ + $(EOLIST) + +# +# Any symbols exported to here +# +FILES_nlm_exports = \ + example_module \ + $(EOLIST) + +# +# These are the OBJ files needed to create the LIB target above. +# Paths must all use the '/' character +# +FILES_lib_objs = \ + $(EOLIST) + +# +# 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) +# +install :: nlms FORCE + +# +# Any specialized rules here +# + +# +# Include the 'tail' makefile that has targets that depend on variables defined +# in this makefile +# + +include $(AP_WORK)\build\NWGNUtail.inc + + diff --git a/rubbos/app/httpd-2.0.64/modules/experimental/NWGNUmakefile b/rubbos/app/httpd-2.0.64/modules/experimental/NWGNUmakefile new file mode 100644 index 00000000..d6584514 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/experimental/NWGNUmakefile @@ -0,0 +1,256 @@ +# +# Declare the sub-directories to be built here +# + +SUBDIRS = \ + $(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 += \ + $(EOLIST) + +# +# These flags will come after CFLAGS +# +XCFLAGS += \ + $(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 = + +# +# This is used by the link '-desc ' directive. +# If left blank, NLM_NAME will be used. +# +NLM_DESCRIPTION = + +# +# This is used by the '-threadname' directive. If left blank, +# NLM_NAME Thread will be used. +# +NLM_THREAD_NAME = + +# +# 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 = + + +# +# 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 = + +# +# If these are specified it will be used by the link '-flags' directive +# +NLM_FLAGS = + +# +# 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)/charsetl.nlm \ + $(OBJDIR)/example.nlm \ + $(OBJDIR)/moddumpio.nlm \ + $(OBJDIR)/mod_cach.nlm \ + $(OBJDIR)/mem_cach.nlm \ + $(OBJDIR)/dsk_cach.nlm \ + $(EOLIST) + +# If LDAPSDK has been defined then build the auth_ldap module +ifneq "$(LDAPSDK)" "" +TARGET_nlm += $(OBJDIR)/authldap.nlm \ + $(OBJDIR)/utilldap.nlm \ + $(EOLIST) +endif + +# +# If there is an LIB target, put it here +# +TARGET_lib = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the NLM target above. +# Paths must all use the '/' character +# +FILES_nlm_objs = \ + $(EOLIST) + +# +# 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 = \ + $(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 = \ + $(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 = \ + $(EOLIST) + +# +# Any symbols exported to here +# +FILES_nlm_exports = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the LIB target above. +# Paths must all use the '/' character +# +FILES_lib_objs = \ + $(EOLIST) + +# +# 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) +# +install :: nlms FORCE + copy $(OBJDIR)\*.nlm $(INSTALL)\Apache2\modules\*.* + +# +# Any specialized rules here +# + +# +# Include the 'tail' makefile that has targets that depend on variables defined +# in this makefile +# + +include $(AP_WORK)\build\NWGNUtail.inc + diff --git a/rubbos/app/httpd-2.0.64/modules/experimental/NWGNUmem_cach b/rubbos/app/httpd-2.0.64/modules/experimental/NWGNUmem_cach new file mode 100644 index 00000000..236d867a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/experimental/NWGNUmem_cach @@ -0,0 +1,265 @@ +# +# Declare the sub-directories to be built here +# + +SUBDIRS = \ + $(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 \ + $(AP_WORK)/include \ + $(NWOS) \ + $(EOLIST) + +# +# These flags will come after CFLAGS +# +XCFLAGS += \ + $(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 += \ + -DDEBUG \ + $(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 = mem_cach + +# +# This is used by the link '-desc ' directive. +# If left blank, NLM_NAME will be used. +# +NLM_DESCRIPTION = Apache $(VERSION_STR) Memory Cache Sub-Module + +# +# This is used by the '-threadname' directive. If left blank, +# NLM_NAME Thread will be used. +# +NLM_THREAD_NAME = mem_cach + +# +# 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 = _LibCPrelude + +# +# If this is specified it will be used by the link '-exit' directive +# +NLM_EXIT_SYM = _LibCPostlude + +# +# If this is specified it will be used by the link '-check' directive +# +NLM_CHECK_SYM = + +# +# If this is specified it will be used by the link '-flags' directive +# +NLM_FLAGS = AUTOUNLOAD, 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 = + +# +# Declare all target files (you must add your files here) +# + +# +# If there is an NLM target, put it here +# +TARGET_nlm = \ + $(OBJDIR)/mem_cach.nlm \ + $(EOLIST) + +# +# If there is an LIB target, put it here +# +TARGET_lib = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the NLM target above. +# Paths must all use the '/' character +# +FILES_nlm_objs = \ + $(OBJDIR)/mod_mem_cache.o \ + $(OBJDIR)/cache_hash.o \ + $(OBJDIR)/cache_pqueue.o \ + $(OBJDIR)/cache_cache.o \ + $(EOLIST) + +# +# 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 = \ + libcpre.o \ + $(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 = \ + Apache2 \ + Libc \ + mod_cach \ + $(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 = \ + @libc.imp \ + @$(APR)/aprlib.imp \ + @httpd.imp \ + @mod_cache.imp \ + $(EOLIST) + +# +# Any symbols exported to here +# +FILES_nlm_exports = \ + mem_cache_module \ + $(EOLIST) + +# +# These are the OBJ files needed to create the LIB target above. +# Paths must all use the '/' character +# +FILES_lib_objs = \ + $(EOLIST) + +# +# 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) +# +install :: nlms FORCE + +# +# Any specialized rules here +# + +# +# Include the 'tail' makefile that has targets that depend on variables defined +# in this makefile +# + +include $(AP_WORK)\build\NWGNUtail.inc + + diff --git a/rubbos/app/httpd-2.0.64/modules/experimental/NWGNUmod_cach b/rubbos/app/httpd-2.0.64/modules/experimental/NWGNUmod_cach new file mode 100644 index 00000000..3665b764 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/experimental/NWGNUmod_cach @@ -0,0 +1,264 @@ +# +# Declare the sub-directories to be built here +# + +SUBDIRS = \ + $(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 \ + $(AP_WORK)/include \ + $(NWOS) \ + $(EOLIST) + +# +# These flags will come after CFLAGS +# +XCFLAGS += \ + $(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 += \ + -DDEBUG \ + $(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 = mod_cach + +# +# This is used by the link '-desc ' directive. +# If left blank, NLM_NAME will be used. +# +NLM_DESCRIPTION = Apache $(VERSION_STR) Cache module + +# +# This is used by the '-threadname' directive. If left blank, +# NLM_NAME Thread will be used. +# +NLM_THREAD_NAME = mod_cach + +# +# 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 = _LibCPrelude + +# +# If this is specified it will be used by the link '-exit' directive +# +NLM_EXIT_SYM = _LibCPostlude + +# +# If this is specified it will be used by the link '-check' directive +# +NLM_CHECK_SYM = + +# +# If this is specified it will be used by the link '-flags' directive +# +NLM_FLAGS = AUTOUNLOAD, 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 = + +# +# Declare all target files (you must add your files here) +# + +# +# If there is an NLM target, put it here +# +TARGET_nlm = \ + $(OBJDIR)/mod_cach.nlm \ + $(EOLIST) + +# +# If there is an LIB target, put it here +# +TARGET_lib = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the NLM target above. +# Paths must all use the '/' character +# +FILES_nlm_objs = \ + $(OBJDIR)/cache_util.o \ + $(OBJDIR)/cache_storage.o \ + $(OBJDIR)/mod_cache.o \ + $(EOLIST) + +# +# 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 = \ + libcpre.o \ + $(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 = \ + Apache2 \ + 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 = \ + @libc.imp \ + @$(APR)/aprlib.imp \ + @httpd.imp \ + @netware.imp \ + $(EOLIST) + +# +# Any symbols exported to here +# +FILES_nlm_exports = \ + @mod_cache.imp \ + cache_module \ + $(EOLIST) + +# +# These are the OBJ files needed to create the LIB target above. +# Paths must all use the '/' character +# +FILES_lib_objs = \ + $(EOLIST) + +# +# 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) +# +install :: nlms FORCE + +# +# Any specialized rules here +# + +# +# Include the 'tail' makefile that has targets that depend on variables defined +# in this makefile +# + +include $(AP_WORK)\build\NWGNUtail.inc + + diff --git a/rubbos/app/httpd-2.0.64/modules/experimental/NWGNUmoddumpio b/rubbos/app/httpd-2.0.64/modules/experimental/NWGNUmoddumpio new file mode 100644 index 00000000..53c74bb5 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/experimental/NWGNUmoddumpio @@ -0,0 +1,248 @@ +# +# Make sure all needed macro's are defined +# + +# +# Get the 'head' of the build environment if necessary. This includes default +# targets and paths to tools +# + +ifndef EnvironmentDefined +include $(AP_WORK)\build\NWGNUhead.inc +endif + +# +# These directories will be at the beginning of the include list, followed by +# INCDIRS +# +XINCDIRS += \ + $(APR)/include \ + $(APRUTIL)/include \ + $(AP_WORK)/include \ + $(NWOS) \ + $(EOLIST) + +# +# These flags will come after CFLAGS +# +XCFLAGS += \ + $(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 = moddumpio + +# +# This is used by the link '-desc ' directive. +# If left blank, NLM_NAME will be used. +# +NLM_DESCRIPTION = Apache $(VERSION_STR) Debugging IO Module + +# +# This is used by the '-threadname' directive. If left blank, +# NLM_NAME Thread will be used. +# +NLM_THREAD_NAME = DumpIO Module + +# +# 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 = 8192 + + +# +# If this is specified it will be used by the link '-entry' directive +# +NLM_ENTRY_SYM = _LibCPrelude + +# +# If this is specified it will be used by the link '-exit' directive +# +NLM_EXIT_SYM = _LibCPostlude + +# +# If this is specified it will be used by the link '-check' directive +# +NLM_CHECK_SYM = + +# +# If these are specified it will be used by the link '-flags' directive +# +NLM_FLAGS = AUTOUNLOAD, 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)/moddumpio.nlm \ + $(EOLIST) + +# +# If there is an LIB target, put it here +# +TARGET_lib = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the NLM target above. +# Paths must all use the '/' character +# +FILES_nlm_objs = \ + $(OBJDIR)/mod_dumpio.o \ + $(EOLIST) + +# +# 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 = \ + libcpre.o \ + $(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 = \ + @$(APR)/aprlib.imp \ + @$(NWOS)/httpd.imp \ + @libc.imp \ + $(EOLIST) + +# +# Any symbols exported to here +# +FILES_nlm_exports = \ + dumpio_module \ + $(EOLIST) + +# +# These are the OBJ files needed to create the LIB target above. +# Paths must all use the '/' character +# +FILES_lib_objs = \ + $(EOLIST) + +# +# 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) +# +install :: nlms FORCE + +# +# Any specialized rules here +# + +# +# Include the 'tail' makefile that has targets that depend on variables defined +# in this makefile +# + +include $(AP_WORK)\build\NWGNUtail.inc + + diff --git a/rubbos/app/httpd-2.0.64/modules/experimental/NWGNUutilldap b/rubbos/app/httpd-2.0.64/modules/experimental/NWGNUutilldap new file mode 100644 index 00000000..376325a2 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/experimental/NWGNUutilldap @@ -0,0 +1,266 @@ +# +# Make sure all needed macro's are defined +# + +# +# Get the 'head' of the build environment if necessary. This includes default +# targets and paths to tools +# + +ifndef EnvironmentDefined +include $(AP_WORK)\build\NWGNUhead.inc +endif + +# +# These directories will be at the beginning of the include list, followed by +# INCDIRS +# +XINCDIRS += \ + $(APR)/include \ + $(APRUTIL)/include \ + $(AP_WORK)/include \ + $(NWOS) \ + $(LDAPSDK)/inc \ + $(EOLIST) + +# +# These flags will come after CFLAGS +# +XCFLAGS += \ + $(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 = utilldap + +# +# This is used by the link '-desc ' directive. +# If left blank, NLM_NAME will be used. +# +NLM_DESCRIPTION = Apache $(VERSION_STR) LDAP Authentication Module + +# +# This is used by the '-threadname' directive. If left blank, +# NLM_NAME Thread will be used. +# +NLM_THREAD_NAME = UtilLDAP Module + +# +# 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 = 8192 + + +# +# If this is specified it will be used by the link '-entry' directive +# +NLM_ENTRY_SYM = _LibCPrelude + +# +# If this is specified it will be used by the link '-exit' directive +# +NLM_EXIT_SYM = _LibCPostlude + +# +# If this is specified it will be used by the link '-check' directive +# +NLM_CHECK_SYM = + +# +# If these are specified it will be used by the link '-flags' directive +# +NLM_FLAGS = AUTOUNLOAD, 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)/utilldap.nlm \ + $(EOLIST) + +# +# If there is an LIB target, put it here +# +TARGET_lib = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the NLM target above. +# Paths must all use the '/' character +# +FILES_nlm_objs = \ + $(OBJDIR)/util_ldap.o \ + $(OBJDIR)/util_ldap_cache.o \ + $(OBJDIR)/util_ldap_cache_mgr.o \ + $(EOLIST) + +# +# 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 = \ + libcpre.o \ + $(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 \ + lldapsdk \ + lldapssl \ + lldapx \ + $(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 = \ + @$(APR)/aprlib.imp \ + @$(NWOS)/httpd.imp \ + @libc.imp \ + @$(LDAPSDK)/imports/lldapsdk.imp \ + @$(LDAPSDK)/imports/lldapssl.imp \ + $(EOLIST) + +# +# Any symbols exported to here +# +FILES_nlm_exports = \ + ldap_module \ + util_ldap_connection_find \ + util_ldap_connection_close \ + util_ldap_connection_unbind \ + util_ldap_connection_cleanup \ + util_ldap_cache_checkuserid \ + util_ldap_cache_getuserdn \ + util_ldap_cache_compare \ + util_ldap_cache_comparedn \ + util_ldap_ssl_supported \ + $(EOLIST) + +# +# These are the OBJ files needed to create the LIB target above. +# Paths must all use the '/' character +# +FILES_lib_objs = \ + $(EOLIST) + +# +# 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) +# +install :: nlms FORCE + copy $(OBJDIR)\*.nlm $(INSTALL)\Apache2\modules\*.* + +# +# Any specialized rules here +# + +# +# Include the 'tail' makefile that has targets that depend on variables defined +# in this makefile +# + +include $(AP_WORK)\build\NWGNUtail.inc + + diff --git a/rubbos/app/httpd-2.0.64/modules/experimental/README b/rubbos/app/httpd-2.0.64/modules/experimental/README new file mode 100644 index 00000000..447c16ee --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/experimental/README @@ -0,0 +1,41 @@ +README for Apache 2.0 Example Module +[April, 1997, updated May 2000] + +The files in the src/modules/example directory under the Apache +distribution directory tree are provided as an example to those that +wish to write modules that use the Apache API. + +The main file is mod_example.c, which illustrates all the different +callback mechanisms and call syntaces. By no means does an add-on +module need to include routines for all of the callbacks - quite the +contrary! + +The example module is an actual working module. If you link it into +your server, enable the "example-handler" handler for a location, and then +browse to that location, you will see a display of some of the tracing +the example module did as the various callbacks were made. + +To include the example module in your server add --enable-example to the +other ./configure arguments executed from the httpd-2.0 directory. After +that run 'make'. + +To add another module of your own: + + A. cp modules/experimental/mod_example.c modules/experimental/mod_myexample.c + B. Modify the file + C. Build the server with --enable--myexample + +To activate the example module, include a block similar to the +following in your httpd.conf file: + + + SetHandler example-handler + + +As an alternative, you can put the following into a .htaccess file and +then request the file "test.example" from that location: + + AddHandler example-handler .example + +After reloading/restarting your server, you should be able to browse +to this location and see the brief display mentioned earlier. diff --git a/rubbos/app/httpd-2.0.64/modules/experimental/README.ldap b/rubbos/app/httpd-2.0.64/modules/experimental/README.ldap new file mode 100644 index 00000000..c9445b81 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/experimental/README.ldap @@ -0,0 +1,47 @@ +Quick installation instructions (UNIX): + +- Building on generic Unix: + + Add generic ldap support and the TWO ldap modules to the build, like this: + + ./configure --with-ldap --enable-ldap --enable-auth-ldap + + The --with-ldap switches on LDAP library linking in apr-util. Make + sure that you have an LDAP client library available such as those + from Netscape/iPlanet/Sun One or the OpenLDAP project. + + The --enable-ldap option switches on the LDAP caching module. This + module is a support module for other LDAP modules, and is not useful + on its own. This module is required, but caching can be disabled + via the configuration directive LDAPCacheEntries. + + The --enable-auth-ldap option switches on the LDAP authentication + module. + +- Building on AIX: + + The following ./configure line is reported to work for AIX: + + CC=cc_r; export CC + CPPFLAGS=-qcpluscmt;export CPPFLAGS + ./configure --with-mpm=worker --prefix=/usr/local/apache \ + --enable-dav=static --enable-dav_fs=static --enable-ssl=static + --with-ldap=yes --with-ldap-include=/usr/local/include + --with-ldap-lib=/usr/local/lib --enable-ldap=static + --enable-auth_ldap=static + + +Quick installation instructions (win32): + +1. copy the file srclib\apr-util\include\apr_ldap.hw to apr_ldap.h +2. the netscape/iplanet ldap libraries are installed in srclib\ldap +3. Compile the two modules util_ldap and mod_auth_ldap using the dsp files +4. You get a mod_auth_ldap.so and a util_ldap.so module +5. Put them in the modules directory, don't forget to copy the + nsldap32v50.dll somewhere where apache.exe will find it +6. Load the two modules in your httpd.conf, like below: + LoadModule ldap_module modules/util_ldap.so + LoadModule auth_ldap_module modules/mod_auth_ldap.so +7. Configure the directories as described in the docus. + + diff --git a/rubbos/app/httpd-2.0.64/modules/experimental/cache_cache.c b/rubbos/app/httpd-2.0.64/modules/experimental/cache_cache.c new file mode 100644 index 00000000..6db98f71 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/experimental/cache_cache.c @@ -0,0 +1,171 @@ +/* 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. + */ + +#include "apr_general.h" + +#include "mod_cache.h" +#include "cache_hash.h" +#include "cache_pqueue.h" +#include "cache_cache.h" + +#if APR_HAVE_STDLIB_H +#include +#endif +#if APR_HAVE_STRING_H +#include +#endif + +struct cache_cache_t { + int max_entries; + apr_size_t max_size; + apr_size_t current_size; + int total_purges; + long queue_clock; + cache_hash_t *ht; + cache_pqueue_t *pq; + cache_pqueue_set_priority set_pri; + cache_pqueue_get_priority get_pri; + cache_cache_inc_frequency *inc_entry; + cache_cache_get_size *size_entry; + cache_cache_get_key *key_entry; + cache_cache_free *free_entry; +}; + +CACHE_DECLARE(cache_cache_t *)cache_init(int max_entries, + apr_size_t max_size, + cache_pqueue_get_priority get_pri, + cache_pqueue_set_priority set_pri, + cache_pqueue_getpos get_pos, + cache_pqueue_setpos set_pos, + cache_cache_inc_frequency *inc_entry, + cache_cache_get_size *size_entry, + cache_cache_get_key* key_entry, + cache_cache_free *free_entry) +{ + cache_cache_t *tmp; + tmp = malloc(sizeof(cache_cache_t)); + tmp->max_entries = max_entries; + tmp->max_size = max_size; + tmp->current_size = 0; + tmp->total_purges = 0; + tmp->queue_clock = 0; + tmp->get_pri = get_pri; + tmp->set_pri = set_pri; + tmp->inc_entry = inc_entry; + tmp->size_entry = size_entry; + tmp->key_entry = key_entry; + tmp->free_entry = free_entry; + + tmp->ht = cache_hash_make(max_entries); + tmp->pq = cache_pq_init(max_entries, get_pri, get_pos, set_pos); + + return tmp; +} + +CACHE_DECLARE(void) cache_free(cache_cache_t *c) +{ + cache_pq_free(c->pq); + cache_hash_free(c->ht); + free(c); +} + + +CACHE_DECLARE(void*) cache_find(cache_cache_t* c, const char *key) +{ + void *e; + + e = cache_hash_get(c->ht, key, CACHE_HASH_KEY_STRING); + if (!e) + return NULL; + + return e; +} + +CACHE_DECLARE(void) cache_update(cache_cache_t* c, void *entry) +{ + long old_priority; + long new_priority; + + old_priority = c->set_pri(c->queue_clock, entry); + c->inc_entry(entry); + new_priority = c->set_pri(c->queue_clock, entry); + cache_pq_change_priority(c->pq, old_priority, new_priority, entry); +} + +CACHE_DECLARE(void) cache_insert(cache_cache_t* c, void *entry) +{ + void *ejected = NULL; + long priority; + + c->set_pri(c->queue_clock, entry); + /* FIX: check if priority of bottom item is greater than inserted one */ + while ((cache_pq_size(c->pq) >= c->max_entries) || + ((c->current_size + c->size_entry(entry)) > c->max_size)) { + + ejected = cache_pq_pop(c->pq); + /* FIX: If ejected is NULL, we'll segfault here */ + priority = c->get_pri(ejected); + + if (c->queue_clock > priority) + c->queue_clock = priority; + + cache_hash_set(c->ht, + c->key_entry(ejected), + CACHE_HASH_KEY_STRING, + NULL); + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, NULL, "Cache Purge of %s",c->key_entry(ejected)); + c->current_size -= c->size_entry(ejected); + c->free_entry(ejected); + c->total_purges++; + } + c->current_size += c->size_entry(entry); + + cache_pq_insert(c->pq, entry); + cache_hash_set(c->ht, c->key_entry(entry), CACHE_HASH_KEY_STRING, entry); +} + +CACHE_DECLARE(void *) cache_pop(cache_cache_t *c) +{ + void *entry; + + if (!c) + return NULL; + + entry = cache_pq_pop(c->pq); + + if (!entry) + return NULL; + + c->current_size -= c->size_entry(entry); + cache_hash_set(c->ht, c->key_entry(entry), CACHE_HASH_KEY_STRING, NULL); + + return entry; +} + +CACHE_DECLARE(apr_status_t) cache_remove(cache_cache_t *c, void *entry) +{ + apr_size_t entry_size = c->size_entry(entry); + apr_status_t rc; + rc = cache_pq_remove(c->pq, entry); + if (rc != APR_SUCCESS) + return rc; + + cache_hash_set(c->ht, c->key_entry(entry), CACHE_HASH_KEY_STRING, NULL); + c->current_size -= entry_size; + + return APR_SUCCESS; +} diff --git a/rubbos/app/httpd-2.0.64/modules/experimental/cache_cache.h b/rubbos/app/httpd-2.0.64/modules/experimental/cache_cache.h new file mode 100644 index 00000000..67189c5f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/experimental/cache_cache.h @@ -0,0 +1,112 @@ +/* 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. + */ + +#ifndef CACHE_CACHE_H +#define CACHE_CACHE_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "mod_cache.h" + +/** + * @file cache_hash.h + * @brief Cache Cache Functions + */ + +/** + * @defgroup Cache_cache Cache Functions + * @ingroup CACHE + * @{ + */ +/** ADT for the cache */ +typedef struct cache_cache_t cache_cache_t; + +/** callback to increment the frequency of a item */ +typedef void cache_cache_inc_frequency(void*a); +/** callback to get the size of a item */ +typedef apr_size_t cache_cache_get_size(void*a); +/** callback to get the key of a item */ +typedef const char* cache_cache_get_key(void *a); +/** callback to free an entry */ +typedef void cache_cache_free(void *a); + +/** + * initialize the cache ADT + * @param max_entries the number of entries in the cache + * @param max_size the size of the cache + * @param get_pri callback to get a priority of a entry + * @param set_pri callback to set a priority of a entry + * @param get_pos callback to get the position of a entry in the cache + * @param set_pos callback to set the position of a entry in the cache + * @param inc_entry callback to increment the frequency of a entry + * @param size_entry callback to get the size of a entry + * @param key_entry callback to get the key of a entry + * @param free_entry callback to free an entry + */ +CACHE_DECLARE(cache_cache_t *)cache_init(int max_entries, + apr_size_t max_size, + cache_pqueue_get_priority get_pri, + cache_pqueue_set_priority set_pri, + cache_pqueue_getpos get_pos, + cache_pqueue_setpos set_pos, + cache_cache_inc_frequency *inc_entry, + cache_cache_get_size *size_entry, + cache_cache_get_key *key_entry, + cache_cache_free *free_entry); + +/** + * free up the cache + * @param c the cache + */ +CACHE_DECLARE(void) cache_free(cache_cache_t *c); +/** + * find a entry in the cache, incrementing the frequency if found + * @param c the cache + * @param key the key + */ +CACHE_DECLARE(void*) cache_find(cache_cache_t* c, const char *key); +/** + * insert a entry into the cache + * @param c the cache + * @param entry the entry + */ +CACHE_DECLARE(void) cache_update(cache_cache_t* c, void *entry); +/** + * insert a entry into the cache + * @param c the cache + * @param entry the entry + */ +CACHE_DECLARE(void) cache_insert(cache_cache_t* c, void *entry); +/** + * pop the lowest priority item off + * @param c the cache + * @returns the entry or NULL + */ +CACHE_DECLARE(void *)cache_pop(cache_cache_t* c); +/** + * remove an item from the cache + * @param c the cache + * @param entry the actual entry (from a find) + */ +CACHE_DECLARE(apr_status_t) cache_remove(cache_cache_t* c, void *entry); +/** @} */ +#ifdef __cplusplus +} +#endif + +#endif /* !CACHE_CACHE_H */ diff --git a/rubbos/app/httpd-2.0.64/modules/experimental/cache_hash.c b/rubbos/app/httpd-2.0.64/modules/experimental/cache_hash.c new file mode 100644 index 00000000..89552a18 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/experimental/cache_hash.c @@ -0,0 +1,290 @@ +/* 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. + */ + +#include "apr_general.h" + +#include "mod_cache.h" +#include "cache_hash.h" + +#if APR_HAVE_STDLIB_H +#include +#endif +#if APR_HAVE_STRING_H +#include +#endif + + +/* + * The internal form of a hash table. + * + * The table is an array indexed by the hash of the key; collisions + * are resolved by hanging a linked list of hash entries off each + * element of the array. Although this is a really simple design it + * isn't too bad given that pools have a low allocation overhead. + */ + +typedef struct cache_hash_entry_t cache_hash_entry_t; + +struct cache_hash_entry_t { + cache_hash_entry_t *next; + unsigned int hash; + const void *key; + apr_ssize_t klen; + const void *val; +}; + +/* + * Data structure for iterating through a hash table. + * + * We keep a pointer to the next hash entry here to allow the current + * hash entry to be freed or otherwise mangled between calls to + * cache_hash_next(). + */ +struct cache_hash_index_t { + cache_hash_t *ht; + cache_hash_entry_t *this, *next; + int index; +}; + +/* + * The size of the array is always a power of two. We use the maximum + * index rather than the size so that we can use bitwise-AND for + * modular arithmetic. + * The count of hash entries may be greater depending on the chosen + * collision rate. + */ +struct cache_hash_t { + cache_hash_entry_t **array; + cache_hash_index_t iterator; /* For cache_hash_first(NULL, ...) */ + int count, max; +}; + +/* + * Hash creation functions. + */ +static cache_hash_entry_t **alloc_array(cache_hash_t *ht, int max) +{ + return calloc(1, sizeof(*ht->array) * (max + 1)); +} + +CACHE_DECLARE(cache_hash_t *) cache_hash_make(apr_size_t size) +{ + cache_hash_t *ht; + ht = malloc(sizeof(cache_hash_t)); + if (!ht) { + return NULL; + } + ht->count = 0; + ht->max = size; + ht->array = alloc_array(ht, ht->max); + if (!ht->array) { + free(ht); + return NULL; + } + return ht; +} + +CACHE_DECLARE(void) cache_hash_free(cache_hash_t *ht) +{ + if (ht) { + if (ht->array) { + free (ht->array); + } + free (ht); + } +} +/* + * Hash iteration functions. + */ + +CACHE_DECLARE(cache_hash_index_t *) cache_hash_next(cache_hash_index_t *hi) +{ + hi->this = hi->next; + while (!hi->this) { + if (hi->index > hi->ht->max) + return NULL; + hi->this = hi->ht->array[hi->index++]; + } + hi->next = hi->this->next; + return hi; +} + +CACHE_DECLARE(cache_hash_index_t *) cache_hash_first(cache_hash_t *ht) +{ + cache_hash_index_t *hi; + + hi = &ht->iterator; + hi->ht = ht; + hi->index = 0; + hi->this = NULL; + hi->next = NULL; + return cache_hash_next(hi); +} + +CACHE_DECLARE(void) cache_hash_this(cache_hash_index_t *hi, + const void **key, + apr_ssize_t *klen, + void **val) +{ + if (key) *key = hi->this->key; + if (klen) *klen = hi->this->klen; + if (val) *val = (void *)hi->this->val; +} + + +/* + * This is where we keep the details of the hash function and control + * the maximum collision rate. + * + * If val is non-NULL it creates and initializes a new hash entry if + * there isn't already one there; it returns an updatable pointer so + * that hash entries can be removed. + */ + +static cache_hash_entry_t **find_entry(cache_hash_t *ht, + const void *key, + apr_ssize_t klen, + const void *val) +{ + cache_hash_entry_t **hep, *he; + const unsigned char *p; + unsigned int hash; + apr_ssize_t i; + + /* + * This is the popular `times 33' hash algorithm which is used by + * perl and also appears in Berkeley DB. This is one of the best + * known hash functions for strings because it is both computed + * very fast and distributes very well. + * + * The originator may be Dan Bernstein but the code in Berkeley DB + * cites Chris Torek as the source. The best citation I have found + * is "Chris Torek, Hash function for text in C, Usenet message + * <27038@mimsy.umd.edu> in comp.lang.c , October, 1990." in Rich + * Salz's USENIX 1992 paper about INN which can be found at + * . + * + * The magic of number 33, i.e. why it works better than many other + * constants, prime or not, has never been adequately explained by + * anyone. So I try an explanation: if one experimentally tests all + * multipliers between 1 and 256 (as I did while writing a low-level + * data structure library some time ago) one detects that even + * numbers are not useable at all. The remaining 128 odd numbers + * (except for the number 1) work more or less all equally well. + * They all distribute in an acceptable way and this way fill a hash + * table with an average percent of approx. 86%. + * + * If one compares the chi^2 values of the variants (see + * Bob Jenkins ``Hashing Frequently Asked Questions'' at + * http://burtleburtle.net/bob/hash/hashfaq.html for a description + * of chi^2), the number 33 not even has the best value. But the + * number 33 and a few other equally good numbers like 17, 31, 63, + * 127 and 129 have nevertheless a great advantage to the remaining + * numbers in the large set of possible multipliers: their multiply + * operation can be replaced by a faster operation based on just one + * shift plus either a single addition or subtraction operation. And + * because a hash function has to both distribute good _and_ has to + * be very fast to compute, those few numbers should be preferred. + * + * -- Ralf S. Engelschall + */ + hash = 0; + if (klen == CACHE_HASH_KEY_STRING) { + for (p = key; *p; p++) { + hash = hash * 33 + *p; + } + klen = p - (const unsigned char *)key; + } + else { + for (p = key, i = klen; i; i--, p++) { + hash = hash * 33 + *p; + } + } + + /* scan linked list */ + for (hep = &ht->array[hash % ht->max], he = *hep; + he; + hep = &he->next, he = *hep) { + if (he->hash == hash && + he->klen == klen && + memcmp(he->key, key, klen) == 0) + break; + } + if (he || !val) + return hep; + /* add a new entry for non-NULL values */ + he = malloc(sizeof(*he)); + if (!he) { + return NULL; + } + he->next = NULL; + he->hash = hash; + he->key = key; + he->klen = klen; + he->val = val; + *hep = he; + ht->count++; + return hep; +} + +CACHE_DECLARE(void *) cache_hash_get(cache_hash_t *ht, + const void *key, + apr_ssize_t klen) +{ + cache_hash_entry_t *he; + he = *find_entry(ht, key, klen, NULL); + if (he) + return (void *)he->val; + else + return NULL; +} + +CACHE_DECLARE(void *) cache_hash_set(cache_hash_t *ht, + const void *key, + apr_ssize_t klen, + const void *val) +{ + cache_hash_entry_t **hep, *tmp; + const void *tval; + hep = find_entry(ht, key, klen, val); + /* If hep == NULL, then the malloc() in find_entry failed */ + if (hep && *hep) { + if (!val) { + /* delete entry */ + tval = (*hep)->val; + tmp = *hep; + *hep = (*hep)->next; + free(tmp); + --ht->count; + } + else { + /* replace entry */ + tval = (*hep)->val; + (*hep)->val = val; + } + /* Return the object just removed from the cache to let the + * caller clean it up. Cast the constness away upon return. + */ + return (void *) tval; + } + /* else key not present and val==NULL */ + return NULL; +} + +CACHE_DECLARE(int) cache_hash_count(cache_hash_t *ht) +{ + return ht->count; +} diff --git a/rubbos/app/httpd-2.0.64/modules/experimental/cache_hash.h b/rubbos/app/httpd-2.0.64/modules/experimental/cache_hash.h new file mode 100644 index 00000000..ee3d8d12 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/experimental/cache_hash.h @@ -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. + */ + +#ifndef CACHE_HASH_H +#define CACHE_HASH_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "mod_cache.h" + +/** + * @file cache_hash.h + * @brief Cache Hash Tables + */ + +/** + * @defgroup Cache_Hash Hash Tables + * @ingroup CACHE + * @{ + */ + +/** + * When passing a key to cache_hash_set or cache_hash_get, this value can be + * passed to indicate a string-valued key, and have cache_hash compute the + * length automatically. + * + * @remark cache_hash will use strlen(key) for the length. The null-terminator + * is not included in the hash value (why throw a constant in?). + * Since the hash table merely references the provided key (rather + * than copying it), cache_hash_this() will return the null-term'd key. + */ +#define CACHE_HASH_KEY_STRING (-1) + +/** + * Abstract type for hash tables. + */ +typedef struct cache_hash_t cache_hash_t; + +/** + * Abstract type for scanning hash tables. + */ +typedef struct cache_hash_index_t cache_hash_index_t; + +/** + * Create a hash table. + * @param size + * @return The hash table just created + */ +CACHE_DECLARE(cache_hash_t *) cache_hash_make(apr_size_t size); + +/** + * Create a hash table. + * @param *ht Pointer to the hash table to be freed. + * @return void + * @remark The caller should ensure that all objects have been removed + * from the cache prior to calling cache_hash_free(). Objects + * not removed from the cache prior to calling cache_hash_free() + * will be unaccessable. + */ +CACHE_DECLARE(void) cache_hash_free(cache_hash_t *ht); + + +/** + * Associate a value with a key in a hash table. + * @param ht The hash table + * @param key Pointer to the key + * @param klen Length of the key. Can be CACHE_HASH_KEY_STRING to use the string length. + * @param val Value to associate with the key + * @remark If the value is NULL the hash entry is deleted. + * @return The value of the deleted cache entry (so the caller can clean it up). + */ +CACHE_DECLARE(void *) cache_hash_set(cache_hash_t *ht, const void *key, + apr_ssize_t klen, const void *val); + +/** + * Look up the value associated with a key in a hash table. + * @param ht The hash table + * @param key Pointer to the key + * @param klen Length of the key. Can be CACHE_HASH_KEY_STRING to use the string length. + * @return Returns NULL if the key is not present. + */ +CACHE_DECLARE(void *) cache_hash_get(cache_hash_t *ht, const void *key, + apr_ssize_t klen); + +/** + * Start iterating over the entries in a hash table. + * @param ht The hash table + * @example + */ +/** + *
    + * 
    + *     int sum_values(cache_hash_t *ht)
    + *     {
    + *         cache_hash_index_t *hi;
    + * 	   void *val;
    + * 	   int sum = 0;
    + * 	   for (hi = cache_hash_first(ht); hi; hi = cache_hash_next(hi)) {
    + * 	       cache_hash_this(hi, NULL, NULL, &val);
    + * 	       sum += *(int *)val;
    + * 	   }
    + * 	   return sum;
    + *     }
    + * 
    + * There is no restriction on adding or deleting hash entries during an
    + * iteration (although the results may be unpredictable unless all you do
    + * is delete the current entry) and multiple iterations can be in
    + * progress at the same time.
    + * 
    + */ +CACHE_DECLARE(cache_hash_index_t *) cache_hash_first(cache_hash_t *ht); + +/** + * Continue iterating over the entries in a hash table. + * @param hi The iteration state + * @return a pointer to the updated iteration state. NULL if there are no more + * entries. + */ +CACHE_DECLARE(cache_hash_index_t *) cache_hash_next(cache_hash_index_t *hi); + +/** + * Get the current entry's details from the iteration state. + * @param hi The iteration state + * @param key Return pointer for the pointer to the key. + * @param klen Return pointer for the key length. + * @param val Return pointer for the associated value. + * @remark The return pointers should point to a variable that will be set to the + * corresponding data, or they may be NULL if the data isn't interesting. + */ +CACHE_DECLARE(void) cache_hash_this(cache_hash_index_t *hi, const void **key, + apr_ssize_t *klen, void **val); + +/** + * Get the number of key/value pairs in the hash table. + * @param ht The hash table + * @return The number of key/value pairs in the hash table. + */ +CACHE_DECLARE(int) cache_hash_count(cache_hash_t *ht); + + +/** @} */ +#ifdef __cplusplus +} +#endif + +#endif /* !CACHE_HASH_H */ diff --git a/rubbos/app/httpd-2.0.64/modules/experimental/cache_pqueue.c b/rubbos/app/httpd-2.0.64/modules/experimental/cache_pqueue.c new file mode 100644 index 00000000..580b47e7 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/experimental/cache_pqueue.c @@ -0,0 +1,290 @@ +/* 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. + */ + +#include "apr_general.h" + +#if APR_HAVE_STDLIB_H +#include +#endif +#if APR_HAVE_STDIO_H +#include +#endif + +#if APR_HAVE_STRING_H +#include +#endif + +#include "cache_pqueue.h" +#define left(i) (2*(i)) +#define right(i) ((2*(i))+1) +#define parent(i) ((i)/2) +/* + * Priority queue structure + */ +struct cache_pqueue_t +{ + apr_ssize_t size; + apr_ssize_t avail; + apr_ssize_t step; + cache_pqueue_get_priority pri; + cache_pqueue_getpos get; + cache_pqueue_setpos set; + void **d; +}; + +cache_pqueue_t *cache_pq_init(apr_ssize_t n, + cache_pqueue_get_priority pri, + cache_pqueue_getpos get, + cache_pqueue_setpos set) +{ + cache_pqueue_t *q; + + if (!(q = malloc(sizeof(cache_pqueue_t)))) { + return NULL; + } + + /* Need to allocate n+1 elements since element 0 isn't used. */ + if (!(q->d = malloc(sizeof(void*) * (n+1)))) { + free(q); + return NULL; + } + q->avail = q->step = (n+1); /* see comment above about n+1 */ + q->pri = pri; + q->size = 1; + q->get = get; + q->set = set; + return q; +} +/* + * cleanup + */ +void cache_pq_free(cache_pqueue_t *q) +{ + free(q->d); + free(q); +} +/* + * pqsize: size of the queue. + */ +apr_ssize_t cache_pq_size(cache_pqueue_t *q) +{ + /* queue element 0 exists but doesn't count since it isn't used. */ + return (q->size - 1); +} + +static void cache_pq_bubble_up(cache_pqueue_t *q, apr_ssize_t i) +{ + apr_ssize_t parent_node; + void *moving_node = q->d[i]; + long moving_pri = q->pri(moving_node); + + for (parent_node = parent(i); + ((i > 1) && (q->pri(q->d[parent_node]) < moving_pri)); + i = parent_node, parent_node = parent(i)) + { + q->d[i] = q->d[parent_node]; + q->set(q->d[i], i); + } + + q->d[i] = moving_node; + q->set(moving_node, i); +} + +static apr_ssize_t maxchild(cache_pqueue_t *q, apr_ssize_t i) +{ + apr_ssize_t child_node = left(i); + + if (child_node >= q->size) + return 0; + + if ((child_node+1 < q->size) && + (q->pri(q->d[child_node+1]) > q->pri(q->d[child_node]))) + { + child_node++; /* use right child instead of left */ + } + + return child_node; +} + +static void cache_pq_percolate_down(cache_pqueue_t *q, apr_ssize_t i) +{ + apr_ssize_t child_node; + void *moving_node = q->d[i]; + long moving_pri = q->pri(moving_node); + + while ((child_node = maxchild(q, i)) && + (moving_pri < q->pri(q->d[child_node]))) + { + q->d[i] = q->d[child_node]; + q->set(q->d[i], i); + i = child_node; + } + + q->d[i] = moving_node; + q->set(moving_node, i); +} + +apr_status_t cache_pq_insert(cache_pqueue_t *q, void *d) +{ + void *tmp; + apr_ssize_t i; + apr_ssize_t newsize; + + if (!q) return APR_EGENERAL; + + /* allocate more memory if necessary */ + if (q->size >= q->avail) { + newsize = q->size + q->step; + if (!(tmp = realloc(q->d, sizeof(void*) * newsize))) { + return APR_EGENERAL; + }; + q->d = tmp; + q->avail = newsize; + } + + /* insert item */ + i = q->size++; + q->d[i] = d; + cache_pq_bubble_up(q, i); + return APR_SUCCESS; +} + +/* + * move a existing entry to a new priority + */ +void cache_pq_change_priority(cache_pqueue_t *q, + long old_priority, + long new_priority, + void *d) +{ + apr_ssize_t posn; + + posn = q->get(d); + if (new_priority > old_priority) + cache_pq_bubble_up(q, posn); + else + cache_pq_percolate_down(q, posn); +} + +apr_status_t cache_pq_remove(cache_pqueue_t *q, void *d) +{ + apr_ssize_t posn = q->get(d); + q->d[posn] = q->d[--q->size]; + if (q->pri(q->d[posn]) > q->pri(d)) + cache_pq_bubble_up(q, posn); + else + cache_pq_percolate_down(q, posn); + + return APR_SUCCESS; +} + +void *cache_pq_pop(cache_pqueue_t *q) +{ + void *head; + + if (!q || q->size == 1) + return NULL; + + head = q->d[1]; + q->d[1] = q->d[--q->size]; + cache_pq_percolate_down(q, 1); + + return head; +} + +void *cache_pq_peek(cache_pqueue_t *q) +{ + void *d; + if (!q || q->size == 1) + return NULL; + d = q->d[1]; + return d; +} + +static void cache_pq_set_null( void*d, apr_ssize_t val) +{ + /* do nothing */ +} + +/* + * this is a debug function.. so it's EASY not fast + */ +void cache_pq_dump(cache_pqueue_t *q, + FILE*out, + cache_pqueue_print_entry print) +{ + int i; + + fprintf(stdout,"posn\tleft\tright\tparent\tmaxchild\t...\n"); + for (i = 1; i < q->size ;i++) { + fprintf(stdout, + "%d\t%d\t%d\t%d\t%" APR_SSIZE_T_FMT "\t", + i, + left(i), right(i), parent(i), + maxchild(q, i)); + print(out, q->d[i]); + } +} + +/* + * this is a debug function.. so it's EASY not fast + */ +void cache_pq_print(cache_pqueue_t *q, + FILE*out, + cache_pqueue_print_entry print) +{ + cache_pqueue_t *dup; + dup = cache_pq_init(q->size, q->pri, q->get, cache_pq_set_null); + dup->size = q->size; + dup->avail = q->avail; + dup->step = q->step; + + memcpy(dup->d, q->d, q->size*sizeof(void*)); + + while (cache_pq_size(dup) > 1) { + void *e = NULL; + e = cache_pq_pop(dup); + if (e) + print(out, e); + else + break; + } + cache_pq_free(dup); +} + +static int cache_pq_subtree_is_valid(cache_pqueue_t *q, int pos) +{ + if (left(pos) < q->size) { + /* has a left child */ + if (q->pri(q->d[pos]) < q->pri(q->d[left(pos)])) + return 0; + if (!cache_pq_subtree_is_valid(q, left(pos))) + return 0; + } + if (right(pos) < q->size) { + /* has a right child */ + if (q->pri(q->d[pos]) < q->pri(q->d[right(pos)])) + return 0; + if (!cache_pq_subtree_is_valid(q, right(pos))) + return 0; + } + return 1; +} + +int cache_pq_is_valid(cache_pqueue_t *q) +{ + return cache_pq_subtree_is_valid(q, 1); +} diff --git a/rubbos/app/httpd-2.0.64/modules/experimental/cache_pqueue.h b/rubbos/app/httpd-2.0.64/modules/experimental/cache_pqueue.h new file mode 100644 index 00000000..19709764 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/experimental/cache_pqueue.h @@ -0,0 +1,160 @@ +/* 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. + */ + +#ifndef CACHE_PQUEUE_H +#define CACHE_PQUEUE_H + +#include +#include + +#if APR_HAVE_STDIO_H +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** the cache priority queue handle */ +typedef struct cache_pqueue_t cache_pqueue_t; + +/** + * callback function to assign a priority for a element + * @param a the element + * @return the score (the lower the score the longer it is kept int the queue) + */ +typedef long (*cache_pqueue_set_priority)(long queue_clock, void *a); +typedef long (*cache_pqueue_get_priority)(void *a); + +/** callback function to get a position of a element */ +typedef apr_ssize_t (*cache_pqueue_getpos)(void *a); + +/** + * callback function to set a position of a element + * @param a the element + * @param pos the position to set it to + */ +typedef void (*cache_pqueue_setpos)(void *a, apr_ssize_t pos); + +/** debug callback function to print a entry */ +typedef void (*cache_pqueue_print_entry)(FILE *out, void *a); + +/** + * initialize the queue + * + * @param n the initial estimate of the number of queue items for which memory + * should be preallocated + * @param pri the callback function to run to assign a score to a element + * @param get the callback function to get the current element's position + * @param set the callback function to set the current element's position + * + * @Return the handle or NULL for insufficent memory + */ +cache_pqueue_t *cache_pq_init(apr_ssize_t n, + cache_pqueue_get_priority pri, + cache_pqueue_getpos get, + cache_pqueue_setpos set); +/** + * free all memory used by the queue + * @param q the queue + */ +void cache_pq_free(cache_pqueue_t *q); +/** + * return the size of the queue. + * @param q the queue + */ +apr_ssize_t cache_pq_size(cache_pqueue_t *q); + +/** + * insert an item into the queue. + * @param q the queue + * @param d the item + * @return APR_SUCCESS on success + */ +apr_status_t cache_pq_insert(cache_pqueue_t *q, void *d); + +/* + * move a existing entry to a different priority + * @param q the queue + * @param old the old priority + * @param d the entry + */ +void cache_pq_change_priority(cache_pqueue_t *q, + long old_priority, + long new_priority, + void *d); + +/** + * pop the highest-ranking item from the queue. + * @param p the queue + * @param d where to copy the entry to + * @return NULL on error, otherwise the entry + */ +void *cache_pq_pop(cache_pqueue_t *q); + +/** + * remove an item from the queue. + * @param p the queue + * @param d the entry + * @return APR_SUCCESS on success + */ +apr_status_t cache_pq_remove(cache_pqueue_t *q, void *d); + +/** + * access highest-ranking item without removing it. + * @param q the queue + * @param d the entry + * @return NULL on error, otherwise the entry + */ +void *cache_pq_peek(cache_pqueue_t *q); + +/** + * print the queue + * @internal + * DEBUG function only + * @param q the queue + * @param out the output handle + * @param the callback function to print the entry + */ +void cache_pq_print(cache_pqueue_t *q, + FILE *out, + cache_pqueue_print_entry print); + +/** + * dump the queue and it's internal structure + * @internal + * debug function only + * @param q the queue + * @param out the output handle + * @param the callback function to print the entry + */ +void cache_pq_dump(cache_pqueue_t *q, + FILE *out, + cache_pqueue_print_entry print); + +/** + * checks that the pq is in the right order, etc + * @internal + * debug function only + * @param q the queue + */ +int cache_pq_is_valid(cache_pqueue_t *q); + +#ifdef __cplusplus +} +#endif + +#endif /* !CACHE_PQUEUE_H */ diff --git a/rubbos/app/httpd-2.0.64/modules/experimental/cache_storage.c b/rubbos/app/httpd-2.0.64/modules/experimental/cache_storage.c new file mode 100644 index 00000000..88f3d5dd --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/experimental/cache_storage.c @@ -0,0 +1,311 @@ +/* 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. + */ + +#define CORE_PRIVATE + +#include "mod_cache.h" + +extern APR_OPTIONAL_FN_TYPE(ap_cache_generate_key) *cache_generate_key; + +extern module AP_MODULE_DECLARE_DATA cache_module; + +/* -------------------------------------------------------------- */ + +/* + * delete all URL entities from the cache + * + */ +int cache_remove_url(request_rec *r, char *url) +{ + cache_provider_list *list; + apr_status_t rv; + char *key; + cache_request_rec *cache = (cache_request_rec *) + ap_get_module_config(r->request_config, &cache_module); + + rv = cache_generate_key(r,r->pool,&key); + if (rv != APR_SUCCESS) { + return rv; + } + + list = cache->providers; + + /* for each specified cache type, delete the URL */ + while(list) { + list->provider->remove_url(key); + list = list->next; + } + return OK; +} + + +/* + * create a new URL entity in the cache + * + * It is possible to store more than once entity per URL. This + * function will always create a new entity, regardless of whether + * other entities already exist for the same URL. + * + * The size of the entity is provided so that a cache module can + * decide whether or not it wants to cache this particular entity. + * If the size is unknown, a size of -1 should be set. + */ +int cache_create_entity(request_rec *r, char *url, apr_off_t size) +{ + cache_provider_list *list; + cache_handle_t *h = apr_pcalloc(r->pool, sizeof(cache_handle_t)); + char *key; + apr_status_t rv; + cache_request_rec *cache = (cache_request_rec *) + ap_get_module_config(r->request_config, &cache_module); + + rv = cache_generate_key(r,r->pool,&key); + if (rv != APR_SUCCESS) { + return rv; + } + + list = cache->providers; + /* for each specified cache type, delete the URL */ + while (list) { + switch (rv = list->provider->create_entity(h, r, key, size)) { + case OK: { + cache->handle = h; + cache->provider = list->provider; + cache->provider_name = list->provider_name; + return OK; + } + case DECLINED: { + list = list->next; + continue; + } + default: { + return rv; + } + } + } + return DECLINED; +} + +static int set_cookie_doo_doo(void *v, const char *key, const char *val) +{ + apr_table_addn(v, key, val); + return 1; +} + +static void accept_headers(cache_handle_t *h, request_rec *r) +{ + apr_table_t *cookie_table; + const char *v; + + v = apr_table_get(h->resp_hdrs, "Content-Type"); + if (v) { + ap_set_content_type(r, v); + apr_table_unset(h->resp_hdrs, "Content-Type"); + } + + /* If the cache gave us a Last-Modified header, we can't just + * pass it on blindly because of restrictions on future values. + */ + v = apr_table_get(h->resp_hdrs, "Last-Modified"); + if (v) { + ap_update_mtime(r, apr_date_parse_http(v)); + ap_set_last_modified(r); + apr_table_unset(h->resp_hdrs, "Last-Modified"); + } + + /* The HTTP specification says that it is legal to merge duplicate + * headers into one. Some browsers that support Cookies don't like + * merged headers and prefer that each Set-Cookie header is sent + * separately. Lets humour those browsers by not merging. + * Oh what a pain it is. + */ + cookie_table = apr_table_make(r->pool, 2); + apr_table_do(set_cookie_doo_doo, cookie_table, r->err_headers_out, + "Set-Cookie", NULL); + apr_table_do(set_cookie_doo_doo, cookie_table, h->resp_hdrs, + "Set-Cookie", NULL); + apr_table_unset(r->err_headers_out, "Set-Cookie"); + apr_table_unset(h->resp_hdrs, "Set-Cookie"); + + apr_table_overlap(r->headers_out, h->resp_hdrs, + APR_OVERLAP_TABLES_SET); + apr_table_overlap(r->err_headers_out, h->resp_err_hdrs, + APR_OVERLAP_TABLES_SET); + if (!apr_is_empty_table(cookie_table)) { + r->err_headers_out = apr_table_overlay(r->pool, r->err_headers_out, + cookie_table); + } +} + +/* + * select a specific URL entity in the cache + * + * It is possible to store more than one entity per URL. Content + * negotiation is used to select an entity. Once an entity is + * selected, details of it are stored in the per request + * config to save time when serving the request later. + * + * This function returns OK if successful, DECLINED if no + * cached entity fits the bill. + */ +int cache_select_url(request_rec *r, char *url) +{ + cache_provider_list *list; + apr_status_t rv; + cache_handle_t *h; + char *key; + cache_request_rec *cache = (cache_request_rec *) + ap_get_module_config(r->request_config, &cache_module); + + rv = cache_generate_key(r, r->pool, &key); + if (rv != APR_SUCCESS) { + return rv; + } + /* go through the cache types till we get a match */ + h = apr_palloc(r->pool, sizeof(cache_handle_t)); + + list = cache->providers; + + while (list) { + switch ((rv = list->provider->open_entity(h, r, key))) { + case OK: { + char *vary = NULL; + const char *varyhdr = NULL; + int fresh; + + if (list->provider->recall_headers(h, r) != APR_SUCCESS) { + /* TODO: Handle this error */ + return DECLINED; + } + + /* + * Check Content-Negotiation - Vary + * + * At this point we need to make sure that the object we found in + * the cache is the same object that would be delivered to the + * client, when the effects of content negotiation are taken into + * effect. + * + * In plain english, we want to make sure that a language-negotiated + * document in one language is not given to a client asking for a + * language negotiated document in a different language by mistake. + * + * This code makes the assumption that the storage manager will + * cache the req_hdrs if the response contains a Vary + * header. + * + * RFC2616 13.6 and 14.44 describe the Vary mechanism. + */ + if ((varyhdr = apr_table_get(h->resp_err_hdrs, "Vary")) == NULL) { + varyhdr = apr_table_get(h->resp_hdrs, "Vary"); + } + vary = apr_pstrdup(r->pool, varyhdr); + while (vary && *vary) { + char *name = vary; + const char *h1, *h2; + + /* isolate header name */ + while (*vary && !apr_isspace(*vary) && (*vary != ',')) + ++vary; + while (*vary && (apr_isspace(*vary) || (*vary == ','))) { + *vary = '\0'; + ++vary; + } + + /* + * is this header in the request and the header in the cached + * request identical? If not, we give up and do a straight get + */ + h1 = apr_table_get(r->headers_in, name); + h2 = apr_table_get(h->req_hdrs, name); + if (h1 == h2) { + /* both headers NULL, so a match - do nothing */ + } + else if (h1 && h2 && !strcmp(h1, h2)) { + /* both headers exist and are equal - do nothing */ + } + else { + /* headers do not match, so Vary failed */ + ap_log_error(APLOG_MARK, APLOG_DEBUG, APR_SUCCESS, + r->server, + "cache_select_url(): Vary header mismatch."); + return DECLINED; + } + } + + cache->provider = list->provider; + cache->provider_name = list->provider_name; + + /* Is our cached response fresh enough? */ + fresh = ap_cache_check_freshness(h, r); + if (!fresh) { + cache_info *info = &(h->cache_obj->info); + + /* Make response into a conditional */ + /* FIXME: What if the request is already conditional? */ + if (info && info->etag) { + /* if we have a cached etag */ + cache->stale_headers = apr_table_copy(r->pool, + r->headers_in); + apr_table_set(r->headers_in, "If-None-Match", info->etag); + cache->stale_handle = h; + } + else if (info && info->lastmods) { + /* if we have a cached Last-Modified header */ + cache->stale_headers = apr_table_copy(r->pool, + r->headers_in); + apr_table_set(r->headers_in, "If-Modified-Since", + info->lastmods); + cache->stale_handle = h; + } + + return DECLINED; + } + + /* Okay, this response looks okay. Merge in our stuff and go. */ + apr_table_setn(r->headers_out, "Content-Type", + ap_make_content_type(r, h->content_type)); + r->filename = apr_pstrdup(r->pool, h->cache_obj->info.filename); + accept_headers(h, r); + + cache->handle = h; + return OK; + } + case DECLINED: { + /* try again with next cache type */ + list = list->next; + continue; + } + default: { + /* oo-er! an error */ + return rv; + } + } + } + return DECLINED; +} + +apr_status_t cache_generate_key_default( request_rec *r, apr_pool_t*p, char**key ) +{ + if (r->hostname) { + *key = apr_pstrcat(p, r->hostname, r->uri, "?", r->args, NULL); + } + else { + *key = apr_pstrcat(p, r->uri, "?", r->args, NULL); + } + return APR_SUCCESS; +} + diff --git a/rubbos/app/httpd-2.0.64/modules/experimental/cache_util.c b/rubbos/app/httpd-2.0.64/modules/experimental/cache_util.c new file mode 100644 index 00000000..9782cb7b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/experimental/cache_util.c @@ -0,0 +1,575 @@ +/* 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. + */ + +#define CORE_PRIVATE + +#include "mod_cache.h" + +#include + +/* -------------------------------------------------------------- */ + +extern module AP_MODULE_DECLARE_DATA cache_module; + +/* return true if the request is conditional */ +CACHE_DECLARE(int) ap_cache_request_is_conditional(apr_table_t *table) +{ + if (apr_table_get(table, "If-Match") || + apr_table_get(table, "If-None-Match") || + apr_table_get(table, "If-Modified-Since") || + apr_table_get(table, "If-Unmodified-Since")) { + return 1; + } + return 0; +} + +CACHE_DECLARE(cache_provider_list *)ap_cache_get_providers(request_rec *r, + cache_server_conf *conf, + const char *url) +{ + cache_provider_list *providers = NULL; + int i; + + /* we can't cache if there's no URL */ + /* Is this case even possible?? */ + if (!url) return NULL; + + /* loop through all the cacheenable entries */ + for (i = 0; i < conf->cacheenable->nelts; i++) { + struct cache_enable *ent = + (struct cache_enable *)conf->cacheenable->elts; + if ((ent[i].url) && !strncasecmp(url, ent[i].url, ent[i].urllen)) { + /* Fetch from global config and add to the list. */ + cache_provider *provider; + provider = ap_lookup_provider(CACHE_PROVIDER_GROUP, ent[i].type, + "0"); + if (!provider) { + /* Log an error! */ + } + else { + cache_provider_list *newp; + newp = apr_pcalloc(r->pool, sizeof(cache_provider_list)); + newp->provider_name = ent[i].type; + newp->provider = provider; + + if (!providers) { + providers = newp; + } + else { + cache_provider_list *last = providers; + + while (last->next) { + last = last->next; + } + last->next = newp; + } + } + } + } + + /* then loop through all the cachedisable entries + * Looking for urls that contain the full cachedisable url and possibly + * more. + * This means we are disabling cachedisable url and below... + */ + for (i = 0; i < conf->cachedisable->nelts; i++) { + struct cache_disable *ent = + (struct cache_disable *)conf->cachedisable->elts; + if ((ent[i].url) && !strncasecmp(url, ent[i].url, ent[i].urllen)) { + /* Stop searching now. */ + return NULL; + } + } + + return providers; +} + + +/* do a HTTP/1.1 age calculation */ +CACHE_DECLARE(apr_int64_t) ap_cache_current_age(cache_info *info, + const apr_time_t age_value, + apr_time_t now) +{ + apr_time_t apparent_age, corrected_received_age, response_delay, + corrected_initial_age, resident_time, current_age, + age_value_usec; + + age_value_usec = apr_time_from_sec(age_value); + + /* Perform an HTTP/1.1 age calculation. (RFC2616 13.2.3) */ + + apparent_age = MAX(0, info->response_time - info->date); + corrected_received_age = MAX(apparent_age, age_value_usec); + response_delay = info->response_time - info->request_time; + corrected_initial_age = corrected_received_age + response_delay; + resident_time = now - info->response_time; + current_age = corrected_initial_age + resident_time; + + return apr_time_sec(current_age); +} + +CACHE_DECLARE(int) ap_cache_check_freshness(cache_handle_t *h, + request_rec *r) +{ + apr_int64_t age, maxage_req, maxage_cresp, maxage, smaxage, maxstale; + apr_int64_t minfresh; + int age_in_errhdr = 0; + const char *cc_cresp, *cc_ceresp, *cc_req; + const char *agestr = NULL; + const char *expstr = NULL; + char *val; + apr_time_t age_c = 0; + cache_info *info = &(h->cache_obj->info); + + /* + * We now want to check if our cached data is still fresh. This depends + * on a few things, in this order: + * + * - RFC2616 14.9.4 End to end reload, Cache-Control: no-cache. no-cache in + * either the request or the cached response means that we must + * revalidate the request unconditionally, overriding any expiration + * mechanism. It's equivalent to max-age=0,must-revalidate. + * + * - RFC2616 14.32 Pragma: no-cache This is treated the same as + * Cache-Control: no-cache. + * + * - RFC2616 14.9.3 Cache-Control: max-stale, must-revalidate, + * proxy-revalidate if the max-stale request header exists, modify the + * stale calculations below so that an object can be at most + * seconds stale before we request a revalidation, _UNLESS_ a + * must-revalidate or proxy-revalidate cached response header exists to + * stop us doing this. + * + * - RFC2616 14.9.3 Cache-Control: s-maxage the origin server specifies the + * maximum age an object can be before it is considered stale. This + * directive has the effect of proxy|must revalidate, which in turn means + * simple ignore any max-stale setting. + * + * - RFC2616 14.9.4 Cache-Control: max-age this header can appear in both + * requests and responses. If both are specified, the smaller of the two + * takes priority. + * + * - RFC2616 14.21 Expires: if this request header exists in the cached + * entity, and it's value is in the past, it has expired. + * + */ + cc_cresp = apr_table_get(h->resp_hdrs, "Cache-Control"); + cc_ceresp = apr_table_get(h->resp_err_hdrs, "Cache-Control"); + cc_req = apr_table_get(h->req_hdrs, "Cache-Control"); + + if ((agestr = apr_table_get(h->resp_hdrs, "Age"))) { + age_c = apr_atoi64(agestr); + } + else if ((agestr = apr_table_get(h->resp_err_hdrs, "Age"))) { + age_c = apr_atoi64(agestr); + age_in_errhdr = 1; + } + + if (!(expstr = apr_table_get(h->resp_err_hdrs, "Expires"))) { + expstr = apr_table_get(h->resp_hdrs, "Expires"); + } + + /* calculate age of object */ + age = ap_cache_current_age(info, age_c, r->request_time); + + /* extract s-maxage */ + if (cc_cresp && ap_cache_liststr(r->pool, cc_cresp, "s-maxage", &val) + && val != NULL) { + smaxage = apr_atoi64(val); + } + else if (cc_ceresp && ap_cache_liststr(r->pool, cc_ceresp, "s-maxage", &val)) { + smaxage = apr_atoi64(val); + } + else { + smaxage = -1; + } + + /* extract max-age from request */ + if (cc_req && ap_cache_liststr(r->pool, cc_req, "max-age", &val) + && val != NULL) { + maxage_req = apr_atoi64(val); + } + else { + maxage_req = -1; + } + + /* extract max-age from response */ + if (cc_cresp && ap_cache_liststr(r->pool, cc_cresp, "max-age", &val) + && val != NULL) { + maxage_cresp = apr_atoi64(val); + } + else if (cc_ceresp && ap_cache_liststr(r->pool, cc_ceresp, "max-age", &val)) { + maxage_cresp = apr_atoi64(val); + } + else + { + maxage_cresp = -1; + } + + /* + * if both maxage request and response, the smaller one takes priority + */ + if (-1 == maxage_req) { + maxage = maxage_cresp; + } + else if (-1 == maxage_cresp) { + maxage = maxage_req; + } + else { + maxage = MIN(maxage_req, maxage_cresp); + } + + /* extract max-stale */ + if (cc_req && ap_cache_liststr(r->pool, cc_req, "max-stale", &val)) { + if(val != NULL) { + maxstale = apr_atoi64(val); + } + else { + /* + * If no value is assigned to max-stale, then the client is willing + * to accept a stale response of any age (RFC2616 14.9.3). We will + * set it to one year in this case as this situation is somewhat + * similar to a "never expires" Expires header (RFC2616 14.21) + * which is set to a date one year from the time the response is + * sent in this case. + */ + maxstale = APR_INT64_C(86400*365); + } + } + else { + maxstale = 0; + } + + /* extract min-fresh */ + if (cc_req && ap_cache_liststr(r->pool, cc_req, "min-fresh", &val) + && val != NULL) { + minfresh = apr_atoi64(val); + } + else { + minfresh = 0; + } + + /* override maxstale if must-revalidate or proxy-revalidate */ + if (maxstale && ((cc_cresp && + ap_cache_liststr(NULL, cc_cresp, + "must-revalidate", NULL)) || + (cc_cresp && + ap_cache_liststr(NULL, cc_cresp, + "proxy-revalidate", NULL)) || + (cc_ceresp && + ap_cache_liststr(NULL, cc_ceresp, + "must-revalidate", NULL)) || + (cc_ceresp && + ap_cache_liststr(NULL, cc_ceresp, + "proxy-revalidate", NULL)))) { + maxstale = 0; + } + + /* handle expiration */ + if (((smaxage != -1) && (age < (smaxage - minfresh))) || + ((maxage != -1) && (age < (maxage + maxstale - minfresh))) || + ((smaxage == -1) && (maxage == -1) && + (info->expire != APR_DATE_BAD) && + (age < (apr_time_sec(info->expire - info->date) + maxstale - minfresh)))) { + const char *warn_head; + apr_table_t *head_ptr; + + warn_head = apr_table_get(h->resp_hdrs, "Warning"); + if (warn_head != NULL) { + head_ptr = h->resp_hdrs; + } + else { + warn_head = apr_table_get(h->resp_err_hdrs, "Warning"); + head_ptr = h->resp_err_hdrs; + } + + /* it's fresh darlings... */ + /* set age header on response */ + if (age_in_errhdr) { + apr_table_set(h->resp_err_hdrs, "Age", + apr_psprintf(r->pool, "%lu", (unsigned long)age)); + } + else { + apr_table_set(h->resp_hdrs, "Age", + apr_psprintf(r->pool, "%lu", (unsigned long)age)); + } + + /* add warning if maxstale overrode freshness calculation */ + if (!(((smaxage != -1) && age < smaxage) || + ((maxage != -1) && age < maxage) || + (info->expire != APR_DATE_BAD && + (info->expire - info->date) > age))) { + /* make sure we don't stomp on a previous warning */ + if ((warn_head == NULL) || + ((warn_head != NULL) && (ap_strstr_c(warn_head, "110") == NULL))) { + apr_table_merge(head_ptr, "Warning", "110 Response is stale"); + } + } + /* + * If none of Expires, Cache-Control: max-age, or Cache-Control: + * s-maxage appears in the response, and the respose header age + * calculated is more than 24 hours add the warning 113 + */ + if ((maxage_cresp == -1) && (smaxage == -1) && + (expstr == NULL) && (age > 86400)) { + + /* Make sure we don't stomp on a previous warning, and don't dup + * a 113 marning that is already present. Also, make sure to add + * the new warning to the correct *headers_out location. + */ + if ((warn_head == NULL) || + ((warn_head != NULL) && (ap_strstr_c(warn_head, "113") == NULL))) { + apr_table_merge(head_ptr, "Warning", "113 Heuristic expiration"); + } + } + return 1; /* Cache object is fresh (enough) */ + } + return 0; /* Cache object is stale */ +} + +/* + * list is a comma-separated list of case-insensitive tokens, with + * optional whitespace around the tokens. + * The return returns 1 if the token val is found in the list, or 0 + * otherwise. + */ +CACHE_DECLARE(int) ap_cache_liststr(apr_pool_t *p, const char *list, + const char *key, char **val) +{ + apr_size_t key_len; + const char *next; + + if (!list) { + return 0; + } + + key_len = strlen(key); + next = list; + + for (;;) { + + /* skip whitespace and commas to find the start of the next key */ + while (*next && (apr_isspace(*next) || (*next == ','))) { + next++; + } + + if (!*next) { + return 0; + } + + if (!strncasecmp(next, key, key_len)) { + /* this field matches the key (though it might just be + * a prefix match, so make sure the match is followed + * by either a space or an equals sign) + */ + next += key_len; + if (!*next || (*next == '=') || apr_isspace(*next) || + (*next == ',')) { + /* valid match */ + if (val) { + while (*next && (*next != '=') && (*next != ',')) { + next++; + } + if (*next == '=') { + next++; + while (*next && apr_isspace(*next )) { + next++; + } + if (!*next) { + *val = NULL; + } + else { + const char *val_start = next; + while (*next && !apr_isspace(*next) && + (*next != ',')) { + next++; + } + *val = apr_pstrmemdup(p, val_start, + next - val_start); + } + } + else { + *val = NULL; + } + } + return 1; + } + } + + /* skip to the next field */ + do { + next++; + if (!*next) { + return 0; + } + } while (*next != ','); + } +} + +/* return each comma separated token, one at a time */ +CACHE_DECLARE(const char *)ap_cache_tokstr(apr_pool_t *p, const char *list, + const char **str) +{ + apr_size_t i; + const char *s; + + s = ap_strchr_c(list, ','); + if (s != NULL) { + i = s - list; + do + s++; + while (apr_isspace(*s)) + ; /* noop */ + } + else + i = strlen(list); + + while (i > 0 && apr_isspace(list[i - 1])) + i--; + + *str = s; + if (i) + return apr_pstrndup(p, list, i); + else + return NULL; +} + +/* + * Converts apr_time_t expressed as hex digits to + * a true apr_time_t. + */ +CACHE_DECLARE(apr_time_t) ap_cache_hex2usec(const char *x) +{ + int i, ch; + apr_time_t j; + for (i = 0, j = 0; i < sizeof(j) * 2; i++) { + ch = x[i]; + j <<= 4; + if (apr_isdigit(ch)) + j |= ch - '0'; + else if (apr_isupper(ch)) + j |= ch - ('A' - 10); + else + j |= ch - ('a' - 10); + } + return j; +} + +/* + * Converts apr_time_t to apr_time_t expressed as hex digits. + */ +CACHE_DECLARE(void) ap_cache_usec2hex(apr_time_t j, char *y) +{ + int i, ch; + + for (i = (sizeof(j) * 2)-1; i >= 0; i--) { + ch = (int)(j & 0xF); + j >>= 4; + if (ch >= 10) + y[i] = ch + ('A' - 10); + else + y[i] = ch + '0'; + } + y[sizeof(j) * 2] = '\0'; +} + +static void cache_hash(const char *it, char *val, int ndepth, int nlength) +{ + apr_md5_ctx_t context; + unsigned char digest[16]; + char tmp[22]; + int i, k, d; + unsigned int x; + static const char enc_table[64] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_@"; + + apr_md5_init(&context); + apr_md5_update(&context, (const unsigned char *) it, strlen(it)); + apr_md5_final(digest, &context); + + /* encode 128 bits as 22 characters, using a modified uuencoding + * the encoding is 3 bytes -> 4 characters* i.e. 128 bits is + * 5 x 3 bytes + 1 byte -> 5 * 4 characters + 2 characters + */ + for (i = 0, k = 0; i < 15; i += 3) { + x = (digest[i] << 16) | (digest[i + 1] << 8) | digest[i + 2]; + tmp[k++] = enc_table[x >> 18]; + tmp[k++] = enc_table[(x >> 12) & 0x3f]; + tmp[k++] = enc_table[(x >> 6) & 0x3f]; + tmp[k++] = enc_table[x & 0x3f]; + } + + /* one byte left */ + x = digest[15]; + tmp[k++] = enc_table[x >> 2]; /* use up 6 bits */ + tmp[k++] = enc_table[(x << 4) & 0x3f]; + + /* now split into directory levels */ + for (i = k = d = 0; d < ndepth; ++d) { + memcpy(&val[i], &tmp[k], nlength); + k += nlength; + val[i + nlength] = '/'; + i += nlength + 1; + } + memcpy(&val[i], &tmp[k], 22 - k); + val[i + 22 - k] = '\0'; +} + +CACHE_DECLARE(char *)generate_name(apr_pool_t *p, int dirlevels, + int dirlength, const char *name) +{ + char hashfile[66]; + cache_hash(name, hashfile, dirlevels, dirlength); + return apr_pstrdup(p, hashfile); +} + +/* Create a new table consisting of those elements from an input + * headers table that are allowed to be stored in a cache. + */ +CACHE_DECLARE(apr_table_t *)ap_cache_cacheable_hdrs_out(apr_pool_t *pool, + apr_table_t *t, + server_rec *s) +{ + cache_server_conf *conf; + char **header; + int i; + + /* Make a copy of the headers, and remove from + * the copy any hop-by-hop headers, as defined in Section + * 13.5.1 of RFC 2616 + */ + apr_table_t *headers_out; + headers_out = apr_table_copy(pool, t); + apr_table_unset(headers_out, "Connection"); + apr_table_unset(headers_out, "Keep-Alive"); + apr_table_unset(headers_out, "Proxy-Authenticate"); + apr_table_unset(headers_out, "Proxy-Authorization"); + apr_table_unset(headers_out, "TE"); + apr_table_unset(headers_out, "Trailers"); + apr_table_unset(headers_out, "Transfer-Encoding"); + apr_table_unset(headers_out, "Upgrade"); + + conf = (cache_server_conf *)ap_get_module_config(s->module_config, + &cache_module); + /* Remove the user defined headers set with CacheIgnoreHeaders. + * This may break RFC 2616 compliance on behalf of the administrator. + */ + header = (char **)conf->ignore_headers->elts; + for (i = 0; i < conf->ignore_headers->nelts; i++) { + apr_table_unset(headers_out, header[i]); + } + return headers_out; +} diff --git a/rubbos/app/httpd-2.0.64/modules/experimental/charset.conv b/rubbos/app/httpd-2.0.64/modules/experimental/charset.conv new file mode 100644 index 00000000..3cd6fa9d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/experimental/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 Croation +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 + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/modules/experimental/config.m4 b/rubbos/app/httpd-2.0.64/modules/experimental/config.m4 new file mode 100644 index 00000000..b9d2e7e3 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/experimental/config.m4 @@ -0,0 +1,39 @@ + +APACHE_MODPATH_INIT(experimental) + +if test "$ac_cv_ebcdic" = "yes"; then +# mod_charset_lite can be very useful on an ebcdic system, +# so include it by default + APACHE_MODULE(charset_lite, character set translation, , , yes) +else + APACHE_MODULE(charset_lite, character set translation, , , no) +fi + +dnl # list of object files for mod_cache +cache_objs="dnl +mod_cache.lo dnl +cache_storage.lo dnl +cache_util.lo dnl +" +dnl # list of object files for mod_mem_cache +mem_cache_objs="dnl +mod_mem_cache.lo dnl +cache_cache.lo dnl +cache_pqueue.lo dnl +cache_hash.lo dnl +" +APACHE_MODULE(cache, dynamic file caching, $cache_objs, , no) +APACHE_MODULE(disk_cache, disk caching module, , , no) +APACHE_MODULE(mem_cache, memory caching module, $mem_cache_objs, , no) +APACHE_MODULE(example, example and demo module, , , no) +APACHE_MODULE(case_filter, example uppercase conversion filter, , , no) +APACHE_MODULE(case_filter_in, example uppercase conversion input filter, , , no) +APACHE_MODULE(dumpio, I/O dump filter, , , no) + +ldap_objects="util_ldap.lo util_ldap_cache.lo util_ldap_cache_mgr.lo" +APACHE_MODULE(ldap, LDAP caching and connection pooling services, $ldap_objects, , no) + +auth_ldap_objects="mod_auth_ldap.lo" +APACHE_MODULE(auth_ldap, LDAP based authentication, $auth_ldap_objects, , no) + +APACHE_MODPATH_FINISH diff --git a/rubbos/app/httpd-2.0.64/modules/experimental/mod_auth_ldap.c b/rubbos/app/httpd-2.0.64/modules/experimental/mod_auth_ldap.c new file mode 100644 index 00000000..10b3f17c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/experimental/mod_auth_ldap.c @@ -0,0 +1,1117 @@ +/* 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. + */ + +/* + * mod_auth_ldap.c: LDAP authentication module + * + * Original code from auth_ldap module for Apache v1.3: + * Copyright 1998, 1999 Enbridge Pipelines Inc. + * Copyright 1999-2001 Dave Carrigan + */ + +#include +#include +#include +#define APR_WANT_STRFUNC +#include + +#include "ap_config.h" +#if APR_HAVE_UNISTD_H +/* for getpid() */ +#include +#endif +#include + +#include "httpd.h" +#include "http_config.h" +#include "http_core.h" +#include "http_log.h" +#include "http_protocol.h" +#include "http_request.h" +#include "util_ldap.h" + +#ifndef APU_HAS_LDAP +#error mod_auth_ldap requires APR-util to have LDAP support built in +#endif + +/* per directory configuration */ +typedef struct { + apr_pool_t *pool; /* Pool that this config is allocated from */ +#if APR_HAS_THREADS + apr_thread_mutex_t *lock; /* Lock for this config */ +#endif + int auth_authoritative; /* Is this auth method the one and only? */ + int enabled; /* Is auth_ldap enabled in this directory? */ + + /* These parameters are all derived from the AuthLDAPURL directive */ + char *url; /* String representation of the URL */ + + char *host; /* Name of the LDAP server (or space separated list) */ + int port; /* Port of the LDAP server */ + char *basedn; /* Base DN to do all searches from */ + char *attribute; /* Attribute to search for */ + char **attributes; /* Array of all the attributes to return */ + int scope; /* Scope of the search */ + char *filter; /* Filter to further limit the search */ + deref_options deref; /* how to handle alias dereferening */ + char *binddn; /* DN to bind to server (can be NULL) */ + char *bindpw; /* Password to bind to server (can be NULL) */ + + int frontpage_hack; /* Hack for frontpage support */ + int user_is_dn; /* If true, connection->user is DN instead of userid */ + int compare_dn_on_server; /* If true, will use server to do DN compare */ + + int have_ldap_url; /* Set if we have found an LDAP url */ + + apr_array_header_t *groupattr; /* List of Group attributes */ + int group_attrib_is_dn; /* If true, the group attribute is the DN, otherwise, + it's the exact string passed by the HTTP client */ + + int secure; /* True if SSL connections are requested */ +} mod_auth_ldap_config_t; + +typedef struct mod_auth_ldap_request_t { + char *dn; /* The saved dn from a successful search */ + char *user; /* The username provided by the client */ +} mod_auth_ldap_request_t; + +/* maximum group elements supported */ +#define GROUPATTR_MAX_ELTS 10 + +struct mod_auth_ldap_groupattr_entry_t { + char *name; +}; + +module AP_MODULE_DECLARE_DATA auth_ldap_module; + +/* function prototypes */ +void mod_auth_ldap_build_filter(char *filtbuf, + request_rec *r, + mod_auth_ldap_config_t *sec); +int mod_auth_ldap_check_user_id(request_rec *r); +int mod_auth_ldap_auth_checker(request_rec *r); +void *mod_auth_ldap_create_dir_config(apr_pool_t *p, char *d); + +/* ---------------------------------------- */ + +static apr_hash_t *charset_conversions = NULL; +static char *to_charset = NULL; /* UTF-8 identifier derived from the charset.conv file */ + +/* Derive a code page ID give a language name or ID */ +static char* derive_codepage_from_lang (apr_pool_t *p, char *language) +{ + int lang_len; + int check_short = 0; + char *charset; + + if (!language) /* our default codepage */ + return apr_pstrdup(p, "ISO-8859-1"); + else + lang_len = strlen(language); + + charset = (char*) apr_hash_get(charset_conversions, language, APR_HASH_KEY_STRING); + + if (!charset) { + language[2] = '\0'; + charset = (char*) apr_hash_get(charset_conversions, language, APR_HASH_KEY_STRING); + } + + if (charset) { + charset = apr_pstrdup(p, charset); + } + + return charset; +} + +static apr_xlate_t* get_conv_set (request_rec *r) +{ + char *lang_line = (char*)apr_table_get(r->headers_in, "accept-language"); + char *lang; + apr_xlate_t *convset; + + if (lang_line) { + lang_line = apr_pstrdup(r->pool, lang_line); + for (lang = lang_line;*lang;lang++) { + if ((*lang == ',') || (*lang == ';')) { + *lang = '\0'; + break; + } + } + lang = derive_codepage_from_lang(r->pool, lang_line); + + if (lang && (apr_xlate_open(&convset, to_charset, lang, r->pool) == APR_SUCCESS)) { + return convset; + } + } + + return NULL; +} + + +/* + * Build the search filter, or at least as much of the search filter that + * will fit in the buffer. We don't worry about the buffer not being able + * to hold the entire filter. If the buffer wasn't big enough to hold the + * filter, ldap_search_s will complain, but the only situation where this + * is likely to happen is if the client sent a really, really long + * username, most likely as part of an attack. + * + * The search filter consists of the filter provided with the URL, + * combined with a filter made up of the attribute provided with the URL, + * and the actual username passed by the HTTP client. For example, assume + * that the LDAP URL is + * + * ldap://ldap.airius.com/ou=People, o=Airius?uid??(posixid=*) + * + * Further, assume that the userid passed by the client was `userj'. The + * search filter will be (&(posixid=*)(uid=userj)). + */ +#define FILTER_LENGTH MAX_STRING_LEN +void mod_auth_ldap_build_filter(char *filtbuf, + request_rec *r, + mod_auth_ldap_config_t *sec) +{ + char *p, *q, *filtbuf_end; + char *user; + apr_xlate_t *convset = NULL; + apr_size_t inbytes; + apr_size_t outbytes; + char *outbuf; + + if (r->user != NULL) { + user = apr_pstrdup (r->pool, r->user); + } + else + return; + + if (charset_conversions) { + convset = get_conv_set(r); + } + + if (convset) { + inbytes = strlen(user); + outbytes = (inbytes+1)*3; + outbuf = apr_pcalloc(r->pool, outbytes); + + /* Convert the user name to UTF-8. This is only valid for LDAP v3 */ + if (apr_xlate_conv_buffer(convset, user, &inbytes, outbuf, &outbytes) == APR_SUCCESS) { + user = apr_pstrdup(r->pool, outbuf); + } + } + + /* + * Create the first part of the filter, which consists of the + * config-supplied portions. + */ + apr_snprintf(filtbuf, FILTER_LENGTH, "(&(%s)(%s=", sec->filter, sec->attribute); + + /* + * Now add the client-supplied username to the filter, ensuring that any + * LDAP filter metachars are escaped. + */ + filtbuf_end = filtbuf + FILTER_LENGTH - 1; +#if APR_HAS_MICROSOFT_LDAPSDK + for (p = user, q=filtbuf + strlen(filtbuf); + *p && q < filtbuf_end; ) { + if (strchr("*()\\", *p) != NULL) { + if ( q + 3 >= filtbuf_end) + break; /* Don't write part of escape sequence if we can't write all of it */ + *q++ = '\\'; + switch ( *p++ ) + { + case '*': + *q++ = '2'; + *q++ = 'a'; + break; + case '(': + *q++ = '2'; + *q++ = '8'; + break; + case ')': + *q++ = '2'; + *q++ = '9'; + break; + case '\\': + *q++ = '5'; + *q++ = 'c'; + break; + } + } + else + *q++ = *p++; + } +#else + for (p = user, q=filtbuf + strlen(filtbuf); + *p && q < filtbuf_end; *q++ = *p++) { + if (strchr("*()\\", *p) != NULL) { + *q++ = '\\'; + if (q >= filtbuf_end) { + break; + } + } + } +#endif + *q = '\0'; + + /* + * Append the closing parens of the filter, unless doing so would + * overrun the buffer. + */ + if (q + 2 <= filtbuf_end) + strcat(filtbuf, "))"); +} + +static apr_status_t mod_auth_ldap_cleanup_connection_close(void *param) +{ + util_ldap_connection_t *ldc = param; + util_ldap_connection_close(ldc); + return APR_SUCCESS; +} + + +/* + * Authentication Phase + * -------------------- + * + * This phase authenticates the credentials the user has sent with + * the request (ie the username and password are checked). This is done + * by making an attempt to bind to the LDAP server using this user's + * DN and the supplied password. + * + */ +int mod_auth_ldap_check_user_id(request_rec *r) +{ + int failures = 0; + const char **vals = NULL; + char filtbuf[FILTER_LENGTH]; + mod_auth_ldap_config_t *sec = + (mod_auth_ldap_config_t *)ap_get_module_config(r->per_dir_config, &auth_ldap_module); + + util_ldap_connection_t *ldc = NULL; + const char *sent_pw; + int result = 0; + const char *dn = NULL; + + mod_auth_ldap_request_t *req = + (mod_auth_ldap_request_t *)apr_pcalloc(r->pool, sizeof(mod_auth_ldap_request_t)); + ap_set_module_config(r->request_config, &auth_ldap_module, req); + + if (!sec->enabled) { + return DECLINED; + } + + /* + * Basic sanity checks before any LDAP operations even happen. + */ + if (!sec->have_ldap_url) { + return DECLINED; + } + +start_over: + + /* There is a good AuthLDAPURL, right? */ + if (sec->host) { + ldc = util_ldap_connection_find(r, sec->host, sec->port, + sec->binddn, sec->bindpw, sec->deref, + sec->secure); + } + else { + ap_log_rerror(APLOG_MARK, APLOG_WARNING|APLOG_NOERRNO, 0, r, + "[%d] auth_ldap authenticate: no sec->host - weird...?", getpid()); + return sec->auth_authoritative? HTTP_UNAUTHORIZED : DECLINED; + } + + ap_log_rerror(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, r, + "[%d] auth_ldap authenticate: using URL %s", getpid(), sec->url); + + /* Get the password that the client sent */ + if ((result = ap_get_basic_auth_pw(r, &sent_pw))) { + ap_log_rerror(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, r, + "[%d] auth_ldap authenticate: " + "ap_get_basic_auth_pw() returns %d", getpid(), result); + util_ldap_connection_close(ldc); + return result; + } + + if (r->user == NULL) { + ap_log_rerror(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, r, + "[%d] auth_ldap authenticate: no user specified", getpid()); + util_ldap_connection_close(ldc); + return sec->auth_authoritative? HTTP_UNAUTHORIZED : DECLINED; + } + + /* build the username filter */ + mod_auth_ldap_build_filter(filtbuf, r, sec); + + /* do the user search */ + result = util_ldap_cache_checkuserid(r, ldc, sec->url, sec->basedn, sec->scope, + sec->attributes, filtbuf, sent_pw, &dn, &vals); + util_ldap_connection_close(ldc); + + /* sanity check - if server is down, retry it up to 5 times */ + if (result == LDAP_SERVER_DOWN) { + if (failures++ <= 5) { + goto start_over; + } + } + + /* handle bind failure */ + if (result != LDAP_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_WARNING|APLOG_NOERRNO, 0, r, + "[%d] auth_ldap authenticate: " + "user %s authentication failed; URI %s [%s][%s]", + getpid(), r->user, r->uri, ldc->reason, ldap_err2string(result)); + if ((LDAP_INVALID_CREDENTIALS == result) || sec->auth_authoritative) { + ap_note_basic_auth_failure(r); + return HTTP_UNAUTHORIZED; + } + else { + return DECLINED; + } + } + + /* mark the user and DN */ + req->dn = apr_pstrdup(r->pool, dn); + req->user = r->user; + if (sec->user_is_dn) { + r->user = req->dn; + } + + /* add environment variables */ + if (sec->attributes && vals) { + apr_table_t *e = r->subprocess_env; + int i = 0; + while (sec->attributes[i]) { + char *str = apr_pstrcat(r->pool, "AUTHENTICATE_", sec->attributes[i], NULL); + int j = 13; + while (str[j]) { + if (str[j] >= 'a' && str[j] <= 'z') { + str[j] = str[j] - ('a' - 'A'); + } + j++; + } + apr_table_setn(e, str, vals[i]); + i++; + } + } + + ap_log_rerror(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, r, + "[%d] auth_ldap authenticate: accepting %s", getpid(), r->user); + + return OK; +} + + +/* + * Authorisation Phase + * ------------------- + * + * After checking whether the username and password are correct, we need + * to check whether that user is authorised to view this resource. The + * require directive is used to do this: + * + * require valid-user Any authenticated is allowed in. + * require user This particular user is allowed in. + * require group The user must be a member of this group + * in order to be allowed in. + * require dn The user must have the following DN in the + * LDAP tree to be let in. + * + */ +int mod_auth_ldap_auth_checker(request_rec *r) +{ + int result = 0; + mod_auth_ldap_request_t *req = + (mod_auth_ldap_request_t *)ap_get_module_config(r->request_config, + &auth_ldap_module); + mod_auth_ldap_config_t *sec = + (mod_auth_ldap_config_t *)ap_get_module_config(r->per_dir_config, + &auth_ldap_module); + + util_ldap_connection_t *ldc = NULL; + int m = r->method_number; + + const apr_array_header_t *reqs_arr = ap_requires(r); + require_line *reqs = reqs_arr ? (require_line *)reqs_arr->elts : NULL; + + register int x; + const char *t; + char *w, *value; + int method_restricted = 0; + + if (!sec->enabled) { + return DECLINED; + } + + if (!sec->have_ldap_url) { + return DECLINED; + } + + /* + * It is possible that we've skipped mod_auth_ldap's + * check_user_id hook, but still get here. In that + * case, the req request_config struct hasn't been initialized + * causing problems when we try to use req->dn and/or req->name + * below. So we simply create one. + * + * Unlike 2.2, we don't try to search or populate it. + */ + if (!req) { + ap_log_rerror(APLOG_MARK, APLOG_WARNING|APLOG_NOERRNO, 0, r, + "[%d] auth_ldap authorise: " + "no req struct - skipped mod_auth_ldap_check_user_id?", + getpid()); + + req = (mod_auth_ldap_request_t *)apr_pcalloc(r->pool, + sizeof(mod_auth_ldap_request_t)); + ap_set_module_config(r->request_config, &auth_ldap_module, req); + } + + if (sec->host) { + ldc = util_ldap_connection_find(r, sec->host, sec->port, + sec->binddn, sec->bindpw, sec->deref, + sec->secure); + apr_pool_cleanup_register(r->pool, ldc, + mod_auth_ldap_cleanup_connection_close, + apr_pool_cleanup_null); + } + else { + ap_log_rerror(APLOG_MARK, APLOG_WARNING|APLOG_NOERRNO, 0, r, + "[%d] auth_ldap authorise: no sec->host - weird...?", getpid()); + return sec->auth_authoritative? HTTP_UNAUTHORIZED : DECLINED; + } + + /* + * If there are no elements in the group attribute array, the default should be + * member and uniquemember; populate the array now. + */ + if (sec->groupattr->nelts == 0) { + struct mod_auth_ldap_groupattr_entry_t *grp; +#if APR_HAS_THREADS + apr_thread_mutex_lock(sec->lock); +#endif + grp = apr_array_push(sec->groupattr); + grp->name = "member"; + grp = apr_array_push(sec->groupattr); + grp->name = "uniquemember"; +#if APR_HAS_THREADS + apr_thread_mutex_unlock(sec->lock); +#endif + } + + if (!reqs_arr) { + ap_log_rerror(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, r, + "[%d] auth_ldap authorise: no requirements array", getpid()); + return sec->auth_authoritative? HTTP_UNAUTHORIZED : DECLINED; + } + + /* Loop through the requirements array until there's no elements + * left, or something causes a return from inside the loop */ + for(x=0; x < reqs_arr->nelts; x++) { + if (! (reqs[x].method_mask & (1 << m))) { + continue; + } + method_restricted = 1; + + t = reqs[x].requirement; + w = ap_getword_white(r->pool, &t); + + if (strcmp(w, "valid-user") == 0) { + /* + * Valid user will always be true if we authenticated with ldap, + * but when using front page, valid user should only be true if + * he exists in the frontpage password file. This hack will get + * auth_ldap to look up the user in the the pw file to really be + * sure that he's valid. Naturally, it requires mod_auth to be + * compiled in, but if mod_auth wasn't in there, then the need + * for this hack wouldn't exist anyway. + */ + if (sec->frontpage_hack) { + ap_log_rerror(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, r, + "[%d] auth_ldap authorise: " + "deferring authorisation to mod_auth (FP Hack)", + getpid()); + return OK; + } + else { + ap_log_rerror(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, r, + "[%d] auth_ldap authorise: " + "successful authorisation because user " + "is valid-user", getpid()); + return OK; + } + } + else if (strcmp(w, "user") == 0) { + if (req->dn == NULL || strlen(req->dn) == 0) { + ap_log_rerror(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, r, + "[%d] auth_ldap authorise: " + "require user: user's DN has not been defined; failing authorisation", + getpid()); + return sec->auth_authoritative? HTTP_UNAUTHORIZED : DECLINED; + } + /* + * First do a whole-line compare, in case it's something like + * require user Babs Jensen + */ + result = util_ldap_cache_compare(r, ldc, sec->url, req->dn, sec->attribute, t); + switch(result) { + case LDAP_COMPARE_TRUE: { + ap_log_rerror(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, r, + "[%d] auth_ldap authorise: " + "require user: authorisation successful", getpid()); + return OK; + } + default: { + ap_log_rerror(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, r, + "[%d] auth_ldap authorise: require user: " + "authorisation failed [%s][%s]", getpid(), + ldc->reason, ldap_err2string(result)); + } + } + /* + * Now break apart the line and compare each word on it + */ + while (t[0]) { + w = ap_getword_conf(r->pool, &t); + result = util_ldap_cache_compare(r, ldc, sec->url, req->dn, sec->attribute, w); + switch(result) { + case LDAP_COMPARE_TRUE: { + ap_log_rerror(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, r, + "[%d] auth_ldap authorise: " + "require user: authorisation successful", getpid()); + return OK; + } + default: { + ap_log_rerror(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, r, + "[%d] auth_ldap authorise: " + "require user: authorisation failed [%s][%s]", + getpid(), ldc->reason, ldap_err2string(result)); + } + } + } + } + else if (strcmp(w, "dn") == 0) { + if (req->dn == NULL || strlen(req->dn) == 0) { + ap_log_rerror(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, r, + "[%d] auth_ldap authorise: " + "require dn: user's DN has not been defined; failing authorisation", + getpid()); + return sec->auth_authoritative? HTTP_UNAUTHORIZED : DECLINED; + } + + result = util_ldap_cache_comparedn(r, ldc, sec->url, req->dn, t, sec->compare_dn_on_server); + switch(result) { + case LDAP_COMPARE_TRUE: { + ap_log_rerror(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, r, + "[%d] auth_ldap authorise: " + "require dn: authorisation successful", getpid()); + return OK; + } + default: { + ap_log_rerror(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, r, + "[%d] auth_ldap authorise: " + "require dn \"%s\": LDAP error [%s][%s]", + getpid(), t, ldc->reason, ldap_err2string(result)); + } + } + } + else if (strcmp(w, "group") == 0) { + struct mod_auth_ldap_groupattr_entry_t *ent = (struct mod_auth_ldap_groupattr_entry_t *) sec->groupattr->elts; + int i; + + if (sec->group_attrib_is_dn) { + if (req->dn == NULL || strlen(req->dn) == 0) { + ap_log_rerror(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, r, + "[%d] auth_ldap authorise: require group: user's DN has not been defined; failing authorisation", + getpid()); + return sec->auth_authoritative? HTTP_UNAUTHORIZED : DECLINED; + } + } + else { + if (req->user == NULL || strlen(req->user) == 0) { + /* We weren't called in the authentication phase, so we didn't have a + * chance to set the user field. Do so now. */ + req->user = r->user; + } + } + + ap_log_rerror(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, r, + "[%d] auth_ldap authorise: require group: testing for group membership in \"%s\"", + getpid(), t); + + for (i = 0; i < sec->groupattr->nelts; i++) { + ap_log_rerror(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, r, + "[%d] auth_ldap authorise: require group: testing for %s: %s (%s)", getpid(), + ent[i].name, sec->group_attrib_is_dn ? req->dn : req->user, t); + + result = util_ldap_cache_compare(r, ldc, sec->url, t, ent[i].name, + sec->group_attrib_is_dn ? req->dn : req->user); + switch(result) { + case LDAP_COMPARE_TRUE: { + ap_log_rerror(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, r, + "[%d] auth_ldap authorise: require group: " + "authorisation successful (attribute %s) [%s][%s]", + getpid(), ent[i].name, ldc->reason, ldap_err2string(result)); + return OK; + } + default: { + ap_log_rerror(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, r, + "[%d] auth_ldap authorise: require group \"%s\": " + "authorisation failed [%s][%s]", + getpid(), t, ldc->reason, ldap_err2string(result)); + } + } + } + } + else if (strcmp(w, "ldap-attribute") == 0) { + if (req->dn == NULL || strlen(req->dn) == 0) { + ap_log_rerror(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, r, + "[%d] auth_ldap authorise: " + "require ldap-attribute: user's DN has not been defined; failing authorisation", + getpid()); + return sec->auth_authoritative? HTTP_UNAUTHORIZED : DECLINED; + } + while (t[0]) { + w = ap_getword(r->pool, &t, '='); + value = ap_getword_conf(r->pool, &t); + + ap_log_rerror(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, r, + "[%d] auth_ldap authorise: checking attribute" + " %s has value %s", getpid(), w, value); + result = util_ldap_cache_compare(r, ldc, sec->url, req->dn, + w, value); + switch(result) { + case LDAP_COMPARE_TRUE: { + ap_log_rerror(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, + 0, r, "[%d] auth_ldap authorise: " + "require attribute: authorisation " + "successful", getpid()); + return OK; + } + default: { + ap_log_rerror(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, + 0, r, "[%d] auth_ldap authorise: " + "require attribute: authorisation " + "failed [%s][%s]", getpid(), + ldc->reason, ldap_err2string(result)); + } + } + } + } + } + + if (!method_restricted) { + ap_log_rerror(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, r, + "[%d] auth_ldap authorise: agreeing because non-restricted", + getpid()); + return OK; + } + + if (!sec->auth_authoritative) { + ap_log_rerror(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, r, + "[%d] auth_ldap authorise: declining to authorise", getpid()); + return DECLINED; + } + + ap_log_rerror(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, r, + "[%d] auth_ldap authorise: authorisation denied", getpid()); + ap_note_basic_auth_failure (r); + + return HTTP_UNAUTHORIZED; +} + + +/* ---------------------------------------- */ +/* config directives */ + + +void *mod_auth_ldap_create_dir_config(apr_pool_t *p, char *d) +{ + mod_auth_ldap_config_t *sec = + (mod_auth_ldap_config_t *)apr_pcalloc(p, sizeof(mod_auth_ldap_config_t)); + + sec->pool = p; +#if APR_HAS_THREADS + apr_thread_mutex_create(&sec->lock, APR_THREAD_MUTEX_DEFAULT, p); +#endif + sec->auth_authoritative = 1; + sec->enabled = 1; + sec->groupattr = apr_array_make(p, GROUPATTR_MAX_ELTS, + sizeof(struct mod_auth_ldap_groupattr_entry_t)); + + sec->have_ldap_url = 0; + sec->url = ""; + sec->host = NULL; + sec->binddn = NULL; + sec->bindpw = NULL; + sec->deref = always; + sec->group_attrib_is_dn = 1; + + sec->frontpage_hack = 0; + sec->secure = 0; + + sec->user_is_dn = 0; + sec->compare_dn_on_server = 0; + + return sec; +} + +/* + * Use the ldap url parsing routines to break up the ldap url into + * host and port. + */ +static const char *mod_auth_ldap_parse_url(cmd_parms *cmd, + void *config, + const char *url) +{ + int result; + apr_ldap_url_desc_t *urld; + + mod_auth_ldap_config_t *sec = config; + + ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, + cmd->server, "[%d] auth_ldap url parse: `%s'", + getpid(), url); + + result = apr_ldap_url_parse(url, &(urld)); + if (result != LDAP_SUCCESS) { + switch (result) { + case LDAP_URL_ERR_NOTLDAP: + return "LDAP URL does not begin with ldap://"; + case LDAP_URL_ERR_NODN: + return "LDAP URL does not have a DN"; + case LDAP_URL_ERR_BADSCOPE: + return "LDAP URL has an invalid scope"; + case LDAP_URL_ERR_MEM: + return "Out of memory parsing LDAP URL"; + default: + return "Could not parse LDAP URL"; + } + } + sec->url = apr_pstrdup(cmd->pool, url); + + ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, + cmd->server, "[%d] auth_ldap url parse: Host: %s", getpid(), urld->lud_host); + ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, + cmd->server, "[%d] auth_ldap url parse: Port: %d", getpid(), urld->lud_port); + ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, + cmd->server, "[%d] auth_ldap url parse: DN: %s", getpid(), urld->lud_dn); + ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, + cmd->server, "[%d] auth_ldap url parse: attrib: %s", getpid(), urld->lud_attrs? urld->lud_attrs[0] : "(null)"); + ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, + cmd->server, "[%d] auth_ldap url parse: scope: %s", getpid(), + (urld->lud_scope == LDAP_SCOPE_SUBTREE? "subtree" : + urld->lud_scope == LDAP_SCOPE_BASE? "base" : + urld->lud_scope == LDAP_SCOPE_ONELEVEL? "onelevel" : "unknown")); + ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, + cmd->server, "[%d] auth_ldap url parse: filter: %s", getpid(), urld->lud_filter); + + /* Set all the values, or at least some sane defaults */ + if (sec->host) { + char *p = apr_palloc(cmd->pool, strlen(sec->host) + strlen(urld->lud_host) + 2); + strcpy(p, urld->lud_host); + strcat(p, " "); + strcat(p, sec->host); + sec->host = p; + } + else { + sec->host = urld->lud_host? apr_pstrdup(cmd->pool, urld->lud_host) : "localhost"; + } + sec->basedn = urld->lud_dn? apr_pstrdup(cmd->pool, urld->lud_dn) : ""; + if (urld->lud_attrs && urld->lud_attrs[0]) { + int i = 1; + while (urld->lud_attrs[i]) { + i++; + } + sec->attributes = apr_pcalloc(cmd->pool, sizeof(char *) * (i+1)); + i = 0; + while (urld->lud_attrs[i]) { + sec->attributes[i] = apr_pstrdup(cmd->pool, urld->lud_attrs[i]); + i++; + } + sec->attribute = sec->attributes[0]; + } + else { + sec->attribute = "uid"; + } + + sec->scope = urld->lud_scope == LDAP_SCOPE_ONELEVEL ? + LDAP_SCOPE_ONELEVEL : LDAP_SCOPE_SUBTREE; + + if (urld->lud_filter) { + if (urld->lud_filter[0] == '(') { + /* + * Get rid of the surrounding parens; later on when generating the + * filter, they'll be put back. + */ + sec->filter = apr_pstrdup(cmd->pool, urld->lud_filter+1); + sec->filter[strlen(sec->filter)-1] = '\0'; + } + else { + sec->filter = apr_pstrdup(cmd->pool, urld->lud_filter); + } + } + else { + sec->filter = "objectclass=*"; + } + + /* "ldaps" indicates secure ldap connections desired + */ + if (strncasecmp(url, "ldaps", 5) == 0) + { + sec->secure = 1; + sec->port = urld->lud_port? urld->lud_port : LDAPS_PORT; + ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, cmd->server, + "LDAP: auth_ldap using SSL connections"); + } + else + { + sec->secure = 0; + sec->port = urld->lud_port? urld->lud_port : LDAP_PORT; + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, cmd->server, + "LDAP: auth_ldap not using SSL connections"); + } + + sec->have_ldap_url = 1; + apr_ldap_free_urldesc(urld); + return NULL; +} + +static const char *mod_auth_ldap_set_deref(cmd_parms *cmd, void *config, const char *arg) +{ + mod_auth_ldap_config_t *sec = config; + + if (strcmp(arg, "never") == 0 || strcasecmp(arg, "off") == 0) { + sec->deref = never; + } + else if (strcmp(arg, "searching") == 0) { + sec->deref = searching; + } + else if (strcmp(arg, "finding") == 0) { + sec->deref = finding; + } + else if (strcmp(arg, "always") == 0 || strcasecmp(arg, "on") == 0) { + sec->deref = always; + } + else { + return "Unrecognized value for AuthLDAPAliasDereference directive"; + } + return NULL; +} + +static const char *mod_auth_ldap_add_group_attribute(cmd_parms *cmd, void *config, const char *arg) +{ + struct mod_auth_ldap_groupattr_entry_t *new; + + mod_auth_ldap_config_t *sec = config; + + if (sec->groupattr->nelts > GROUPATTR_MAX_ELTS) + return "Too many AuthLDAPGroupAttribute directives"; + + new = apr_array_push(sec->groupattr); + new->name = apr_pstrdup(cmd->pool, arg); + + return NULL; +} + +static const char *set_charset_config(cmd_parms *cmd, void *config, const char *arg) +{ + ap_set_module_config(cmd->server->module_config, &auth_ldap_module, + (void *)arg); + return NULL; +} + + +command_rec mod_auth_ldap_cmds[] = { + AP_INIT_TAKE1("AuthLDAPURL", mod_auth_ldap_parse_url, NULL, OR_AUTHCFG, + "URL to define LDAP connection. This should be an RFC 2255 complaint\n" + "URL of the form ldap://host[:port]/basedn[?attrib[?scope[?filter]]].\n" + "
      \n" + "
    • Host is the name of the LDAP server. Use a space separated list of hosts \n" + "to specify redundant servers.\n" + "
    • Port is optional, and specifies the port to connect to.\n" + "
    • basedn specifies the base DN to start searches from\n" + "
    • Attrib specifies what attribute to search for in the directory. If not " + "provided, it defaults to uid.\n" + "
    • Scope is the scope of the search, and can be either sub or " + "one. If not provided, the default is sub.\n" + "
    • Filter is a filter to use in the search. If not provided, " + "defaults to (objectClass=*).\n" + "
    \n" + "Searches are performed using the attribute and the filter combined. " + "For example, assume that the\n" + "LDAP URL is ldap://ldap.airius.com/ou=People, o=Airius?uid?sub?(posixid=*). " + "Searches will\n" + "be done using the filter (&((posixid=*))(uid=username)), " + "where username\n" + "is the user name passed by the HTTP client. The search will be a subtree " + "search on the branch ou=People, o=Airius."), + + AP_INIT_TAKE1("AuthLDAPBindDN", ap_set_string_slot, + (void *)APR_OFFSETOF(mod_auth_ldap_config_t, binddn), OR_AUTHCFG, + "DN to use to bind to LDAP server. If not provided, will do an anonymous bind."), + + AP_INIT_TAKE1("AuthLDAPBindPassword", ap_set_string_slot, + (void *)APR_OFFSETOF(mod_auth_ldap_config_t, bindpw), OR_AUTHCFG, + "Password to use to bind to LDAP server. If not provided, will do an anonymous bind."), + + AP_INIT_FLAG("AuthLDAPRemoteUserIsDN", ap_set_flag_slot, + (void *)APR_OFFSETOF(mod_auth_ldap_config_t, user_is_dn), OR_AUTHCFG, + "Set to 'on' to set the REMOTE_USER environment variable to be the full " + "DN of the remote user. By default, this is set to off, meaning that " + "the REMOTE_USER variable will contain whatever value the remote user sent."), + + AP_INIT_FLAG("AuthLDAPAuthoritative", ap_set_flag_slot, + (void *)APR_OFFSETOF(mod_auth_ldap_config_t, auth_authoritative), OR_AUTHCFG, + "Set to 'off' to allow access control to be passed along to lower modules if " + "the UserID and/or group is not known to this module"), + + AP_INIT_FLAG("AuthLDAPCompareDNOnServer", ap_set_flag_slot, + (void *)APR_OFFSETOF(mod_auth_ldap_config_t, compare_dn_on_server), OR_AUTHCFG, + "Set to 'on' to force auth_ldap to do DN compares (for the \"require dn\" " + "directive) using the server, and set it 'off' to do the compares locally " + "(at the expense of possible false matches). See the documentation for " + "a complete description of this option."), + + AP_INIT_ITERATE("AuthLDAPGroupAttribute", mod_auth_ldap_add_group_attribute, NULL, OR_AUTHCFG, + "A list of attributes used to define group membership - defaults to " + "member and uniquemember"), + + AP_INIT_FLAG("AuthLDAPGroupAttributeIsDN", ap_set_flag_slot, + (void *)APR_OFFSETOF(mod_auth_ldap_config_t, group_attrib_is_dn), OR_AUTHCFG, + "If set to 'on', auth_ldap uses the DN that is retrieved from the server for" + "subsequent group comparisons. If set to 'off', auth_ldap uses the string" + "provided by the client directly. Defaults to 'on'."), + + AP_INIT_TAKE1("AuthLDAPDereferenceAliases", mod_auth_ldap_set_deref, NULL, OR_AUTHCFG, + "Determines how aliases are handled during a search. Can bo one of the" + "values \"never\", \"searching\", \"finding\", or \"always\". " + "Defaults to always."), + + AP_INIT_FLAG("AuthLDAPEnabled", ap_set_flag_slot, + (void *)APR_OFFSETOF(mod_auth_ldap_config_t, enabled), OR_AUTHCFG, + "Set to off to disable auth_ldap, even if it's been enabled in a higher tree"), + + AP_INIT_FLAG("AuthLDAPFrontPageHack", ap_set_flag_slot, + (void *)APR_OFFSETOF(mod_auth_ldap_config_t, frontpage_hack), OR_AUTHCFG, + "Set to 'on' to support Microsoft FrontPage"), + + AP_INIT_TAKE1("AuthLDAPCharsetConfig", set_charset_config, NULL, RSRC_CONF, + "Character set conversion configuration file. If omitted, character set" + "conversion is disabled."), + + {NULL} +}; + +static int auth_ldap_post_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s) +{ + ap_configfile_t *f; + char l[MAX_STRING_LEN]; + const char *charset_confname = ap_get_module_config(s->module_config, + &auth_ldap_module); + apr_status_t status; + + /* + mod_auth_ldap_config_t *sec = (mod_auth_ldap_config_t *) + ap_get_module_config(s->module_config, + &auth_ldap_module); + + if (sec->secure) + { + if (!util_ldap_ssl_supported(s)) + { + ap_log_error(APLOG_MARK, APLOG_CRIT, 0, s, + "LDAP: SSL connections (ldaps://) not supported by utilLDAP"); + return(!OK); + } + } + */ + + /* make sure that mod_ldap (util_ldap) is loaded */ + if (ap_find_linked_module("util_ldap.c") == NULL) { + ap_log_error(APLOG_MARK, APLOG_ERR|APLOG_NOERRNO, 0, s, + "Module mod_ldap missing. Mod_ldap (aka. util_ldap) " + "must be loaded in order for mod_auth_ldap to function properly"); + return HTTP_INTERNAL_SERVER_ERROR; + + } + + if (!charset_confname) { + return OK; + } + + charset_confname = ap_server_root_relative(p, charset_confname); + if (!charset_confname) { + ap_log_error(APLOG_MARK, APLOG_ERR, APR_EBADPATH, s, + "Invalid charset conversion config path %s", + (const char *)ap_get_module_config(s->module_config, + &auth_ldap_module)); + return HTTP_INTERNAL_SERVER_ERROR; + } + if ((status = ap_pcfg_openfile(&f, ptemp, charset_confname)) + != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, status, s, + "could not open charset conversion config file %s.", + charset_confname); + return HTTP_INTERNAL_SERVER_ERROR; + } + + charset_conversions = apr_hash_make(p); + + while (!(ap_cfg_getline(l, MAX_STRING_LEN, f))) { + const char *ll = l; + char *lang; + + if (l[0] == '#') { + continue; + } + lang = ap_getword_conf(p, &ll); + ap_str_tolower(lang); + + if (ll[0]) { + char *charset = ap_getword_conf(p, &ll); + apr_hash_set(charset_conversions, lang, APR_HASH_KEY_STRING, charset); + } + } + ap_cfg_closefile(f); + + to_charset = derive_codepage_from_lang (p, "utf-8"); + if (to_charset == NULL) { + ap_log_error(APLOG_MARK, APLOG_ERR, status, s, + "could not find the UTF-8 charset in the file %s.", + charset_confname); + return HTTP_INTERNAL_SERVER_ERROR; + } + + return OK; +} + +static void mod_auth_ldap_register_hooks(apr_pool_t *p) +{ + ap_hook_post_config(auth_ldap_post_config,NULL,NULL,APR_HOOK_MIDDLE); + ap_hook_check_user_id(mod_auth_ldap_check_user_id, NULL, NULL, APR_HOOK_MIDDLE); + ap_hook_auth_checker(mod_auth_ldap_auth_checker, NULL, NULL, APR_HOOK_MIDDLE); +} + +module auth_ldap_module = { + STANDARD20_MODULE_STUFF, + mod_auth_ldap_create_dir_config, /* dir config creater */ + NULL, /* dir merger --- default is to override */ + NULL, /* server config */ + NULL, /* merge server config */ + mod_auth_ldap_cmds, /* command table */ + mod_auth_ldap_register_hooks, /* set up request processing hooks */ +}; diff --git a/rubbos/app/httpd-2.0.64/modules/experimental/mod_auth_ldap.def b/rubbos/app/httpd-2.0.64/modules/experimental/mod_auth_ldap.def new file mode 100644 index 00000000..599636fb --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/experimental/mod_auth_ldap.def @@ -0,0 +1,6 @@ +IMPORT util_ldap_connection_find +IMPORT util_ldap_connection_close +IMPORT util_ldap_cache_checkuserid +IMPORT util_ldap_cache_compare +IMPORT util_ldap_cache_comparedn +EXPORT auth_ldap_module diff --git a/rubbos/app/httpd-2.0.64/modules/experimental/mod_auth_ldap.dsp b/rubbos/app/httpd-2.0.64/modules/experimental/mod_auth_ldap.dsp new file mode 100644 index 00000000..f26a31a0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/experimental/mod_auth_ldap.dsp @@ -0,0 +1,128 @@ +# Microsoft Developer Studio Project File - Name="mod_auth_ldap" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=mod_auth_ldap - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "mod_auth_ldap.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 "mod_auth_ldap.mak" CFG="mod_auth_ldap - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "mod_auth_ldap - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_auth_ldap - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "mod_auth_ldap - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_auth_ldap_src" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /out:"Release/mod_auth_ldap.so" /base:@..\..\os\win32\BaseAddr.ref,mod_auth_ldap.so +# ADD LINK32 kernel32.lib wldap32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Release/mod_auth_ldap.so" /base:@..\..\os\win32\BaseAddr.ref,mod_auth_ldap.so /opt:ref + +!ELSEIF "$(CFG)" == "mod_auth_ldap - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_auth_ldap_src" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_auth_ldap.so" /base:@..\..\os\win32\BaseAddr.ref,mod_auth_ldap.so +# ADD LINK32 kernel32.lib wldap32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_auth_ldap.so" /base:@..\..\os\win32\BaseAddr.ref,mod_auth_ldap.so + +!ENDIF + +# Begin Target + +# Name "mod_auth_ldap - Win32 Release" +# Name "mod_auth_ldap - Win32 Debug" +# Begin Source File + +SOURCE=.\mod_auth_ldap.c +# End Source File +# Begin Source File + +SOURCE=.\mod_auth_ldap.rc +# End Source File +# Begin Source File + +SOURCE=..\..\build\win32\win32ver.awk + +!IF "$(CFG)" == "mod_auth_ldap - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_auth_ldap.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_auth_ldap.so "auth_ldap_module for Apache" ../../include/ap_release.h > .\mod_auth_ldap.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "mod_auth_ldap - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_auth_ldap.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_auth_ldap.so "auth_ldap_module for Apache" ../../include/ap_release.h > .\mod_auth_ldap.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/modules/experimental/mod_cache.c b/rubbos/app/httpd-2.0.64/modules/experimental/mod_cache.c new file mode 100644 index 00000000..a208a510 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/experimental/mod_cache.c @@ -0,0 +1,1006 @@ +/* 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. + */ + +#define CORE_PRIVATE + +#include "mod_cache.h" + +module AP_MODULE_DECLARE_DATA cache_module; +APR_OPTIONAL_FN_TYPE(ap_cache_generate_key) *cache_generate_key; + +/* -------------------------------------------------------------- */ + + +/* Handles for cache filters, resolved at startup to eliminate + * a name-to-function mapping on each request + */ +static ap_filter_rec_t *cache_save_filter_handle; +static ap_filter_rec_t *cache_out_filter_handle; + +/* + * CACHE handler + * ------------- + * + * Can we deliver this request from the cache? + * If yes: + * deliver the content by installing the CACHE_OUT filter. + * If no: + * check whether we're allowed to try cache it + * If yes: + * add CACHE_SAVE filter + * If No: + * oh well. + */ + +static int cache_url_handler(request_rec *r, int lookup) +{ + apr_status_t rv; + const char *pragma, *auth; + apr_uri_t uri; + char *url; + char *path; + cache_provider_list *providers; + cache_info *info; + cache_request_rec *cache; + cache_server_conf *conf; + apr_bucket_brigade *out; + + /* Delay initialization until we know we are handling a GET */ + if (r->method_number != M_GET) { + return DECLINED; + } + + uri = r->parsed_uri; + url = r->unparsed_uri; + path = uri.path; + info = NULL; + + conf = (cache_server_conf *) ap_get_module_config(r->server->module_config, + &cache_module); + + /* + * Which cache module (if any) should handle this request? + */ + if (!(providers = ap_cache_get_providers(r, conf, path))) { + return DECLINED; + } + + /* make space for the per request config */ + cache = (cache_request_rec *) ap_get_module_config(r->request_config, + &cache_module); + if (!cache) { + cache = apr_pcalloc(r->pool, sizeof(cache_request_rec)); + ap_set_module_config(r->request_config, &cache_module, cache); + } + + /* save away the possible providers */ + cache->providers = providers; + + /* + * Are we allowed to serve cached info at all? + */ + + /* find certain cache controlling headers */ + pragma = apr_table_get(r->headers_in, "Pragma"); + auth = apr_table_get(r->headers_in, "Authorization"); + + /* first things first - does the request allow us to return + * cached information at all? If not, just decline the request. + * + * Note that there is a big difference between not being allowed + * to cache a request (no-store) and not being allowed to return + * a cached request without revalidation (max-age=0). + * + * Caching is forbidden under the following circumstances: + * + * - RFC2616 14.9.2 Cache-Control: no-store + * - Pragma: no-cache + * - Any requests requiring authorization. + */ + if (conf->ignorecachecontrol == 1 && auth == NULL) { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "incoming request is asking for a uncached version of " + "%s, but we know better and are ignoring it", url); + } + else { + if (ap_cache_liststr(NULL, pragma, "no-cache", NULL) || + auth != NULL) { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "cache: no-cache or authorization forbids caching " + "of %s", url); + return DECLINED; + } + } + + /* + * Try to serve this request from the cache. + * + * If no existing cache file (DECLINED) + * add cache_save filter + * If cached file (OK) + * clear filter stack + * add cache_out filter + * return OK + */ + rv = cache_select_url(r, url); + if (rv != OK) { + if (rv == DECLINED) { + if (!lookup) { + /* add cache_save filter to cache this request */ + ap_add_output_filter_handle(cache_save_filter_handle, NULL, r, + r->connection); + } + } + else { + /* error */ + ap_log_error(APLOG_MARK, APLOG_ERR, rv, r->server, + "cache: error returned while checking for cached " + "file by %s cache", cache->provider_name); + } + return DECLINED; + } + + /* We have located a suitable cache file now. */ + info = &(cache->handle->cache_obj->info); + + if (info && info->lastmod) { + ap_update_mtime(r, info->lastmod); + } + + rv = ap_meets_conditions(r); + if (rv != OK) { + /* Return cached status. */ + return rv; + } + + /* If we're a lookup, we can exit now instead of serving the content. */ + if (lookup) { + return OK; + } + + /* Serve up the content */ + + /* We are in the quick handler hook, which means that no output + * filters have been set. So lets run the insert_filter hook. + */ + ap_run_insert_filter(r); + ap_add_output_filter_handle(cache_out_filter_handle, NULL, + r, r->connection); + + /* kick off the filter stack */ + out = apr_brigade_create(r->pool, r->connection->bucket_alloc); + rv = ap_pass_brigade(r->output_filters, out); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, r->server, + "cache: error returned while trying to return %s " + "cached data", + cache->provider_name); + return rv; + } + + return OK; +} + +/* + * CACHE_OUT filter + * ---------------- + * + * Deliver cached content (headers and body) up the stack. + */ +static int cache_out_filter(ap_filter_t *f, apr_bucket_brigade *bb) +{ + request_rec *r = f->r; + cache_request_rec *cache; + + cache = (cache_request_rec *) ap_get_module_config(r->request_config, + &cache_module); + + if (!cache) { + /* user likely configured CACHE_OUT manually; they should use mod_cache + * configuration to do that */ + ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server, + "CACHE_OUT enabled unexpectedly"); + ap_remove_output_filter(f); + return ap_pass_brigade(f->next, bb); + } + + ap_log_error(APLOG_MARK, APLOG_DEBUG, APR_SUCCESS, r->server, + "cache: running CACHE_OUT filter"); + + /* restore status of cached response */ + r->status = cache->handle->status; + + /* recall_headers() was called in cache_select_url() */ + cache->provider->recall_body(cache->handle, r->pool, bb); + + /* This filter is done once it has served up its content */ + ap_remove_output_filter(f); + + ap_log_error(APLOG_MARK, APLOG_DEBUG, APR_SUCCESS, r->server, + "cache: serving %s", r->uri); + return ap_pass_brigade(f->next, bb); +} + + +/* + * CACHE_SAVE filter + * --------------- + * + * Decide whether or not this content should be cached. + * If we decide no it should not: + * remove the filter from the chain + * If we decide yes it should: + * Have we already started saving the response? + * If we have started, pass the data to the storage manager via store_body + * Otherwise: + * Check to see if we *can* save this particular response. + * If we can, call cache_create_entity() and save the headers and body + * Finally, pass the data to the next filter (the network or whatever) + */ + +static int cache_save_filter(ap_filter_t *f, apr_bucket_brigade *in) +{ + int rv; + int date_in_errhdr = 0; + request_rec *r = f->r; + cache_request_rec *cache; + cache_server_conf *conf; + char *url = r->unparsed_uri; + const char *cc_in, *cc_out, *cl, *vary_out; + const char *exps, *lastmods, *dates, *etag; + apr_time_t exp, date, lastmod, now; + apr_off_t size; + cache_info *info; + char *reason; + apr_pool_t *p; + + /* check first whether running this filter has any point or not */ + /* If the user has Cache-Control: no-store from RFC 2616, don't store! */ + cc_in = apr_table_get(r->headers_in, "Cache-Control"); + vary_out = apr_table_get(r->headers_out, "Vary"); + if (r->no_cache || ap_cache_liststr(NULL, cc_in, "no-store", NULL) || + ap_cache_liststr(NULL, vary_out, "*", NULL)) { + ap_remove_output_filter(f); + return ap_pass_brigade(f->next, in); + } + + /* Setup cache_request_rec */ + cache = (cache_request_rec *) ap_get_module_config(r->request_config, + &cache_module); + if (!cache) { + /* user likely configured CACHE_SAVE manually; they should really use + * mod_cache configuration to do that + */ + cache = apr_pcalloc(r->pool, sizeof(cache_request_rec)); + ap_set_module_config(r->request_config, &cache_module, cache); + } + + reason = NULL; + p = r->pool; + /* + * Pass Data to Cache + * ------------------ + * This section passes the brigades into the cache modules, but only + * if the setup section (see below) is complete. + */ + if (cache->block_response) { + /* We've already sent down the response and EOS. So, ignore + * whatever comes now. + */ + return APR_SUCCESS; + } + + /* have we already run the cachability check and set up the + * cached file handle? + */ + if (cache->in_checked) { + /* pass the brigades into the cache, then pass them + * up the filter stack + */ + rv = cache->provider->store_body(cache->handle, r, in); + if (rv != APR_SUCCESS) { + ap_remove_output_filter(f); + } + return ap_pass_brigade(f->next, in); + } + + /* + * Setup Data in Cache + * ------------------- + * This section opens the cache entity and sets various caching + * parameters, and decides whether this URL should be cached at + * all. This section is* run before the above section. + */ + + /* read expiry date; if a bad date, then leave it so the client can + * read it + */ + exps = apr_table_get(r->err_headers_out, "Expires"); + if (exps == NULL) { + exps = apr_table_get(r->headers_out, "Expires"); + } + if (exps != NULL) { + if (APR_DATE_BAD == (exp = apr_date_parse_http(exps))) { + exps = NULL; + } + } + else { + exp = APR_DATE_BAD; + } + + /* read the last-modified date; if the date is bad, then delete it */ + lastmods = apr_table_get(r->err_headers_out, "Last-Modified"); + if (lastmods == NULL) { + lastmods = apr_table_get(r->headers_out, "Last-Modified"); + } + if (lastmods != NULL) { + if (APR_DATE_BAD == (lastmod = apr_date_parse_http(lastmods))) { + lastmods = NULL; + } + } + else { + lastmod = APR_DATE_BAD; + } + + conf = (cache_server_conf *) ap_get_module_config(r->server->module_config, &cache_module); + /* read the etag and cache-control from the entity */ + etag = apr_table_get(r->err_headers_out, "Etag"); + if (etag == NULL) { + etag = apr_table_get(r->headers_out, "Etag"); + } + cc_out = apr_table_get(r->err_headers_out, "Cache-Control"); + if (cc_out == NULL) { + cc_out = apr_table_get(r->headers_out, "Cache-Control"); + } + + /* + * what responses should we not cache? + * + * At this point we decide based on the response headers whether it + * is appropriate _NOT_ to cache the data from the server. There are + * a whole lot of conditions that prevent us from caching this data. + * They are tested here one by one to be clear and unambiguous. + */ + if (r->status != HTTP_OK && r->status != HTTP_NON_AUTHORITATIVE + && r->status != HTTP_MULTIPLE_CHOICES + && r->status != HTTP_MOVED_PERMANENTLY + && r->status != HTTP_NOT_MODIFIED) { + /* RFC2616 13.4 we are allowed to cache 200, 203, 206, 300, 301 or 410 + * We don't cache 206, because we don't (yet) cache partial responses. + * We include 304 Not Modified here too as this is the origin server + * telling us to serve the cached copy. + */ + reason = apr_psprintf(p, "Response status %d", r->status); + } + else if (exps != NULL && exp == APR_DATE_BAD) { + /* if a broken Expires header is present, don't cache it */ + reason = apr_pstrcat(p, "Broken expires header: ", exps, NULL); + } + else if (r->args && exps == NULL) { + /* if query string present but no expiration time, don't cache it + * (RFC 2616/13.9) + */ + reason = "Query string present but no expires header"; + } + else if (r->status == HTTP_NOT_MODIFIED && + !cache->handle && !cache->stale_handle) { + /* if the server said 304 Not Modified but we have no cache + * file - pass this untouched to the user agent, it's not for us. + */ + reason = "HTTP Status 304 Not Modified"; + } + else if (r->status == HTTP_OK && lastmods == NULL && etag == NULL + && (exps == NULL) && (conf->no_last_mod_ignore ==0)) { + /* 200 OK response from HTTP/1.0 and up without Last-Modified, + * Etag, or Expires headers. + */ + /* Note: mod-include clears last_modified/expires/etags - this + * is why we have an optional function for a key-gen ;-) + */ + reason = "No Last-Modified, Etag, or Expires headers"; + } + else if (r->header_only) { + /* HEAD requests */ + reason = "HTTP HEAD request"; + } + else if (ap_cache_liststr(NULL, cc_out, "no-store", NULL)) { + /* RFC2616 14.9.2 Cache-Control: no-store response + * indicating do not cache, or stop now if you are + * trying to cache it */ + reason = "Cache-Control: no-store present"; + } + else if (ap_cache_liststr(NULL, cc_out, "private", NULL)) { + /* RFC2616 14.9.1 Cache-Control: private + * this object is marked for this user's eyes only. Behave + * as a tunnel. + */ + reason = "Cache-Control: private present"; + } + else if (apr_table_get(r->headers_in, "Authorization") != NULL + && !(ap_cache_liststr(NULL, cc_out, "s-maxage", NULL) + || ap_cache_liststr(NULL, cc_out, "must-revalidate", NULL) + || ap_cache_liststr(NULL, cc_out, "public", NULL))) { + /* RFC2616 14.8 Authorisation: + * if authorisation is included in the request, we don't cache, + * but we can cache if the following exceptions are true: + * 1) If Cache-Control: s-maxage is included + * 2) If Cache-Control: must-revalidate is included + * 3) If Cache-Control: public is included + */ + reason = "Authorization required"; + } + else if (r->no_cache) { + /* or we've been asked not to cache it above */ + reason = "no_cache present"; + } + + if (reason) { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "cache: %s not cached. Reason: %s", url, reason); + /* remove this object from the cache + * BillS Asks.. Why do we need to make this call to remove_url? + * leave it in for now.. + */ + cache_remove_url(r, url); + + /* remove this filter from the chain */ + ap_remove_output_filter(f); + + /* ship the data up the stack */ + return ap_pass_brigade(f->next, in); + } + + /* Make it so that we don't execute this path again. */ + cache->in_checked = 1; + + /* Set the content length if known. + */ + cl = apr_table_get(r->err_headers_out, "Content-Length"); + if (cl == NULL) { + cl = apr_table_get(r->headers_out, "Content-Length"); + } + if (cl) { +#if 0 + char *errp; + if (apr_strtoff(&size, cl, &errp, 10) || *errp || size < 0) { + cl = NULL; /* parse error, see next 'if' block */ + } +#else + size = apr_atoi64(cl); + if (size < 0) { + cl = NULL; + } +#endif + } + + if (!cl) { + /* if we don't get the content-length, see if we have all the + * buckets and use their length to calculate the size + */ + apr_bucket *e; + int all_buckets_here=0; + int unresolved_length = 0; + size=0; + for (e = APR_BRIGADE_FIRST(in); + e != APR_BRIGADE_SENTINEL(in); + e = APR_BUCKET_NEXT(e)) + { + if (APR_BUCKET_IS_EOS(e)) { + all_buckets_here=1; + break; + } + if (APR_BUCKET_IS_FLUSH(e)) { + unresolved_length = 1; + continue; + } + if (e->length == (apr_size_t)-1) { + break; + } + size += e->length; + } + if (!all_buckets_here) { + size = -1; + } + } + + /* It's safe to cache the response. + * + * There are two possiblities at this point: + * - cache->handle == NULL. In this case there is no previously + * cached entity anywhere on the system. We must create a brand + * new entity and store the response in it. + * - cache->stale_handle != NULL. In this case there is a stale + * entity in the system which needs to be replaced by new + * content (unless the result was 304 Not Modified, which means + * the cached entity is actually fresh, and we should update + * the headers). + */ + + /* Did we have a stale cache entry that really is stale? */ + if (cache->stale_handle) { + if (r->status == HTTP_NOT_MODIFIED) { + /* Oh, hey. It isn't that stale! Yay! */ + cache->handle = cache->stale_handle; + info = &cache->handle->cache_obj->info; + } + else { + /* Oh, well. Toss it. */ + cache->provider->remove_entity(cache->stale_handle); + /* Treat the request as if it wasn't conditional. */ + cache->stale_handle = NULL; + } + } + + /* no cache handle, create a new entity */ + if (!cache->handle) { + rv = cache_create_entity(r, url, size); + info = apr_pcalloc(r->pool, sizeof(cache_info)); + /* We only set info->status upon the initial creation. */ + info->status = r->status; + } + + if (rv != OK) { + /* Caching layer declined the opportunity to cache the response */ + ap_remove_output_filter(f); + return ap_pass_brigade(f->next, in); + } + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "cache: Caching url: %s", url); + + /* + * We now want to update the cache file header information with + * the new date, last modified, expire and content length and write + * it away to our cache file. First, we determine these values from + * the response, using heuristics if appropriate. + * + * In addition, we make HTTP/1.1 age calculations and write them away + * too. + */ + + /* Read the date. Generate one if one is not supplied */ + dates = apr_table_get(r->err_headers_out, "Date"); + if (dates != NULL) { + date_in_errhdr = 1; + } + else { + dates = apr_table_get(r->headers_out, "Date"); + } + if (dates != NULL) { + info->date = apr_date_parse_http(dates); + } + else { + info->date = APR_DATE_BAD; + } + + now = apr_time_now(); + if (info->date == APR_DATE_BAD) { /* No, or bad date */ + char *dates; + /* no date header (or bad header)! */ + /* add one; N.B. use the time _now_ rather than when we were checking + * the cache + */ + if (date_in_errhdr == 1) { + apr_table_unset(r->err_headers_out, "Date"); + } + date = now; + dates = apr_pcalloc(r->pool, MAX_STRING_LEN); + apr_rfc822_date(dates, now); + apr_table_set(r->headers_out, "Date", dates); + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "cache: Added date header"); + info->date = date; + } + else { + date = info->date; + } + + /* set response_time for HTTP/1.1 age calculations */ + info->response_time = now; + + /* get the request time */ + info->request_time = r->request_time; + + /* check last-modified date */ + if (lastmod != APR_DATE_BAD && lastmod > date) { + /* if it's in the future, then replace by date */ + lastmod = date; + lastmods = dates; + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, + r->server, + "cache: Last modified is in the future, " + "replacing with now"); + } + info->lastmod = lastmod; + + /* if no expiry date then + * if lastmod + * expiry date = date + min((date - lastmod) * factor, maxexpire) + * else + * expire date = date + defaultexpire + */ + if (exp == APR_DATE_BAD) { + /* if lastmod == date then you get 0*conf->factor which results in + * an expiration time of now. This causes some problems with + * freshness calculations, so we choose the else path... + */ + if ((lastmod != APR_DATE_BAD) && (lastmod < date)) { + apr_time_t x = (apr_time_t) ((date - lastmod) * conf->factor); + + if (x > conf->maxex) { + x = conf->maxex; + } + exp = date + x; + } + else { + exp = date + conf->defex; + } + } + info->expire = exp; + + info->content_type = apr_pstrdup(r->pool, r->content_type); + info->etag = apr_pstrdup(r->pool, etag); + info->lastmods = apr_pstrdup(r->pool, lastmods); + info->filename = apr_pstrdup(r->pool, r->filename); + + /* + * Write away header information to cache. + */ + rv = cache->provider->store_headers(cache->handle, r, info); + + /* Did we actually find an entity before, but it wasn't really stale? */ + if (rv == APR_SUCCESS && cache->stale_handle) { + apr_bucket_brigade *bb; + apr_bucket *bkt; + + bb = apr_brigade_create(r->pool, r->connection->bucket_alloc); + + /* Were we initially a conditional request? */ + if (ap_cache_request_is_conditional(cache->stale_headers)) { + /* FIXME: Should we now go and make sure it's really not + * modified since what the user thought? + */ + bkt = apr_bucket_eos_create(bb->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, bkt); + } + else { + r->status = info->status; + cache->provider->recall_body(cache->handle, r->pool, bb); + } + + cache->block_response = 1; + return ap_pass_brigade(f->next, bb); + } + + if (rv == APR_SUCCESS) { + rv = cache->provider->store_body(cache->handle, r, in); + } + if (rv != APR_SUCCESS) { + ap_remove_output_filter(f); + } + + return ap_pass_brigade(f->next, in); +} + +/* -------------------------------------------------------------- */ +/* Setup configurable data */ + +static void * create_cache_config(apr_pool_t *p, server_rec *s) +{ + cache_server_conf *ps = apr_pcalloc(p, sizeof(cache_server_conf)); + + /* array of URL prefixes for which caching is enabled */ + ps->cacheenable = apr_array_make(p, 10, sizeof(struct cache_enable)); + /* array of URL prefixes for which caching is disabled */ + ps->cachedisable = apr_array_make(p, 10, sizeof(struct cache_disable)); + /* maximum time to cache a document */ + ps->maxex = DEFAULT_CACHE_MAXEXPIRE; + ps->maxex_set = 0; + /* default time to cache a document */ + ps->defex = DEFAULT_CACHE_EXPIRE; + ps->defex_set = 0; + /* factor used to estimate Expires date from LastModified date */ + ps->factor = DEFAULT_CACHE_LMFACTOR; + ps->factor_set = 0; + /* default percentage to force cache completion */ + ps->complete = DEFAULT_CACHE_COMPLETION; + ps->complete_set = 0; + ps->no_last_mod_ignore_set = 0; + ps->no_last_mod_ignore = 0; + ps->ignorecachecontrol = 0; + ps->ignorecachecontrol_set = 0 ; + /* array of headers that should not be stored in cache */ + ps->ignore_headers = apr_array_make(p, 10, sizeof(char *)); + ps->ignore_headers_set = CACHE_IGNORE_HEADERS_UNSET; + return ps; +} + +static void * merge_cache_config(apr_pool_t *p, void *basev, void *overridesv) +{ + cache_server_conf *ps = apr_pcalloc(p, sizeof(cache_server_conf)); + cache_server_conf *base = (cache_server_conf *) basev; + cache_server_conf *overrides = (cache_server_conf *) overridesv; + + /* array of URL prefixes for which caching is disabled */ + ps->cachedisable = apr_array_append(p, + base->cachedisable, + overrides->cachedisable); + /* array of URL prefixes for which caching is enabled */ + ps->cacheenable = apr_array_append(p, + base->cacheenable, + overrides->cacheenable); + /* maximum time to cache a document */ + ps->maxex = (overrides->maxex_set == 0) ? base->maxex : overrides->maxex; + /* default time to cache a document */ + ps->defex = (overrides->defex_set == 0) ? base->defex : overrides->defex; + /* factor used to estimate Expires date from LastModified date */ + ps->factor = + (overrides->factor_set == 0) ? base->factor : overrides->factor; + /* default percentage to force cache completion */ + ps->complete = + (overrides->complete_set == 0) ? base->complete : overrides->complete; + + ps->no_last_mod_ignore = + (overrides->no_last_mod_ignore_set == 0) + ? base->no_last_mod_ignore + : overrides->no_last_mod_ignore; + ps->ignorecachecontrol = + (overrides->ignorecachecontrol_set == 0) + ? base->ignorecachecontrol + : overrides->ignorecachecontrol; + ps->ignore_headers = + (overrides->ignore_headers_set == CACHE_IGNORE_HEADERS_UNSET) + ? base->ignore_headers + : overrides->ignore_headers; + return ps; +} +static const char *set_cache_ignore_no_last_mod(cmd_parms *parms, void *dummy, + int flag) +{ + cache_server_conf *conf; + + conf = + (cache_server_conf *)ap_get_module_config(parms->server->module_config, + &cache_module); + conf->no_last_mod_ignore = flag; + conf->no_last_mod_ignore_set = 1; + return NULL; + +} + +static const char *set_cache_ignore_cachecontrol(cmd_parms *parms, + void *dummy, int flag) +{ + cache_server_conf *conf; + + conf = + (cache_server_conf *)ap_get_module_config(parms->server->module_config, + &cache_module); + conf->ignorecachecontrol = flag; + conf->ignorecachecontrol_set = 1; + return NULL; +} + +static const char *add_ignore_header(cmd_parms *parms, void *dummy, + const char *header) +{ + cache_server_conf *conf; + char **new; + + conf = + (cache_server_conf *)ap_get_module_config(parms->server->module_config, + &cache_module); + if (!strncasecmp(header, "None", 4)) { + /* if header None is listed clear array */ + conf->ignore_headers->nelts = 0; + } + else { + if ((conf->ignore_headers_set == CACHE_IGNORE_HEADERS_UNSET) || + (conf->ignore_headers->nelts)) { + /* Only add header if no "None" has been found in header list + * so far. + * (When 'None' is passed, IGNORE_HEADERS_SET && nelts == 0.) + */ + new = (char **)apr_array_push(conf->ignore_headers); + (*new) = (char*)header; + } + } + conf->ignore_headers_set = CACHE_IGNORE_HEADERS_SET; + return NULL; +} + +static const char *add_cache_enable(cmd_parms *parms, void *dummy, + const char *type, + const char *url) +{ + cache_server_conf *conf; + struct cache_enable *new; + + conf = + (cache_server_conf *)ap_get_module_config(parms->server->module_config, + &cache_module); + new = apr_array_push(conf->cacheenable); + new->type = type; + new->url = url; + new->urllen = strlen(url); + return NULL; +} + +static const char *add_cache_disable(cmd_parms *parms, void *dummy, + const char *url) +{ + cache_server_conf *conf; + struct cache_disable *new; + + conf = + (cache_server_conf *)ap_get_module_config(parms->server->module_config, + &cache_module); + new = apr_array_push(conf->cachedisable); + new->url = url; + new->urllen = strlen(url); + return NULL; +} + +static const char *set_cache_maxex(cmd_parms *parms, void *dummy, + const char *arg) +{ + cache_server_conf *conf; + + conf = + (cache_server_conf *)ap_get_module_config(parms->server->module_config, + &cache_module); + conf->maxex = (apr_time_t) (atol(arg) * MSEC_ONE_SEC); + conf->maxex_set = 1; + return NULL; +} + +static const char *set_cache_defex(cmd_parms *parms, void *dummy, + const char *arg) +{ + cache_server_conf *conf; + + conf = + (cache_server_conf *)ap_get_module_config(parms->server->module_config, + &cache_module); + conf->defex = (apr_time_t) (atol(arg) * MSEC_ONE_SEC); + conf->defex_set = 1; + return NULL; +} + +static const char *set_cache_factor(cmd_parms *parms, void *dummy, + const char *arg) +{ + cache_server_conf *conf; + double val; + + conf = + (cache_server_conf *)ap_get_module_config(parms->server->module_config, + &cache_module); + if (sscanf(arg, "%lg", &val) != 1) { + return "CacheLastModifiedFactor value must be a float"; + } + conf->factor = val; + conf->factor_set = 1; + return NULL; +} + +static const char *set_cache_complete(cmd_parms *parms, void *dummy, + const char *arg) +{ + cache_server_conf *conf; + int val; + + conf = + (cache_server_conf *)ap_get_module_config(parms->server->module_config, + &cache_module); + if (sscanf(arg, "%u", &val) != 1) { + return "CacheForceCompletion value must be a percentage"; + } + conf->complete = val; + conf->complete_set = 1; + return NULL; +} + +static int cache_post_config(apr_pool_t *p, apr_pool_t *plog, + apr_pool_t *ptemp, server_rec *s) +{ + /* This is the means by which unusual (non-unix) os's may find alternate + * means to run a given command (e.g. shebang/registry parsing on Win32) + */ + cache_generate_key = APR_RETRIEVE_OPTIONAL_FN(ap_cache_generate_key); + if (!cache_generate_key) { + cache_generate_key = cache_generate_key_default; + } + return OK; +} + +static const command_rec cache_cmds[] = +{ + /* XXX + * Consider a new config directive that enables loading specific cache + * implememtations (like mod_cache_mem, mod_cache_file, etc.). + * Rather than using a LoadModule directive, admin would use something + * like CacheModule mem_cache_module | file_cache_module, etc, + * which would cause the approprpriate cache module to be loaded. + * This is more intuitive that requiring a LoadModule directive. + */ + + AP_INIT_TAKE2("CacheEnable", add_cache_enable, NULL, RSRC_CONF, + "A cache type and partial URL prefix below which " + "caching is enabled"), + AP_INIT_TAKE1("CacheDisable", add_cache_disable, NULL, RSRC_CONF, + "A partial URL prefix below which caching is disabled"), + AP_INIT_TAKE1("CacheMaxExpire", set_cache_maxex, NULL, RSRC_CONF, + "The maximum time in seconds to cache a document"), + AP_INIT_TAKE1("CacheDefaultExpire", set_cache_defex, NULL, RSRC_CONF, + "The default time in seconds to cache a document"), + AP_INIT_FLAG("CacheIgnoreNoLastMod", set_cache_ignore_no_last_mod, NULL, + RSRC_CONF, + "Ignore Responses where there is no Last Modified Header"), + AP_INIT_FLAG("CacheIgnoreCacheControl", set_cache_ignore_cachecontrol, + NULL, + RSRC_CONF, + "Ignore requests from the client for uncached content"), + AP_INIT_ITERATE("CacheIgnoreHeaders", add_ignore_header, NULL, RSRC_CONF, + "A space separated list of headers that should not be " + "stored by the cache"), + AP_INIT_TAKE1("CacheLastModifiedFactor", set_cache_factor, NULL, RSRC_CONF, + "The factor used to estimate Expires date from " + "LastModified date"), + AP_INIT_TAKE1("CacheForceCompletion", set_cache_complete, NULL, RSRC_CONF, + "Percentage of download to arrive for the cache to force " + "complete transfer"), + {NULL} +}; + +static void register_hooks(apr_pool_t *p) +{ + /* cache initializer */ + /* cache handler */ + ap_hook_quick_handler(cache_url_handler, NULL, NULL, APR_HOOK_FIRST); + /* cache filters + * XXX The cache filters need to run right after the handlers and before + * any other filters. Consider creating AP_FTYPE_CACHE for this purpose. + * Make them AP_FTYPE_CONTENT for now. + * XXX ianhH:they should run AFTER all the other content filters. + */ + cache_save_filter_handle = + ap_register_output_filter("CACHE_SAVE", + cache_save_filter, + NULL, + AP_FTYPE_CONTENT_SET-1); + /* CACHE_OUT must go into the filter chain before SUBREQ_CORE to + * handle subrequsts. Decrementing filter type by 1 ensures this + * happens. + */ + cache_out_filter_handle = + ap_register_output_filter("CACHE_OUT", + cache_out_filter, + NULL, + AP_FTYPE_CONTENT_SET-1); + ap_hook_post_config(cache_post_config, NULL, NULL, APR_HOOK_REALLY_FIRST); +} + +module AP_MODULE_DECLARE_DATA cache_module = +{ + STANDARD20_MODULE_STUFF, + NULL, /* create per-directory config structure */ + NULL, /* merge per-directory config structures */ + create_cache_config, /* create per-server config structure */ + merge_cache_config, /* merge per-server config structures */ + cache_cmds, /* command apr_table_t */ + register_hooks +}; diff --git a/rubbos/app/httpd-2.0.64/modules/experimental/mod_cache.dsp b/rubbos/app/httpd-2.0.64/modules/experimental/mod_cache.dsp new file mode 100644 index 00000000..8fea9982 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/experimental/mod_cache.dsp @@ -0,0 +1,168 @@ +# Microsoft Developer Studio Project File - Name="mod_cache" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=mod_cache - 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 "mod_cache.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 "mod_cache.mak" CFG="mod_cache - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "mod_cache - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_cache - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "mod_cache - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "MOD_CACHE_EXPORTS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../../srclib/apr-util/include" /I "../../srclib/apr/include" /I "../../include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "CACHE_DECLARE_EXPORT" /D "MOD_CACHE_EXPORTS" /Fd"Release\mod_cache_src" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Release/mod_cache.so" /base:@..\..\os\win32\BaseAddr.ref,mod_cache.so /opt:ref + +!ELSEIF "$(CFG)" == "mod_cache - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../../srclib/apr-util/include" /I "../../srclib/apr/include" /I "../../include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "CACHE_DECLARE_EXPORT" /Fd"Debug\mod_cache_src" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_cache.so" /base:@..\..\os\win32\BaseAddr.ref,mod_cache.so + +!ENDIF + +# Begin Target + +# Name "mod_cache - Win32 Release" +# Name "mod_cache - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;hpj;bat;for;f90" +# Begin Source File + +SOURCE=.\cache_cache.c +# End Source File +# Begin Source File + +SOURCE=.\cache_hash.c +# End Source File +# Begin Source File + +SOURCE=.\cache_pqueue.c +# End Source File +# Begin Source File + +SOURCE=.\cache_storage.c +# End Source File +# Begin Source File + +SOURCE=.\cache_util.c +# End Source File +# Begin Source File + +SOURCE=.\mod_cache.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\cache_cache.h +# End Source File +# Begin Source File + +SOURCE=.\cache_hash.h +# End Source File +# Begin Source File + +SOURCE=.\cache_pqueue.h +# End Source File +# Begin Source File + +SOURCE=.\mod_cache.h +# End Source File +# End Group +# Begin Source File + +SOURCE=..\..\build\win32\win32ver.awk + +!IF "$(CFG)" == "mod_cache - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_cache.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_cache.so "cache_module for Apache" ../../include/ap_release.h > .\mod_cache.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "mod_cache - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_cache.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_cache.so "cache_module for Apache" ../../include/ap_release.h > .\mod_cache.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/modules/experimental/mod_cache.h b/rubbos/app/httpd-2.0.64/modules/experimental/mod_cache.h new file mode 100644 index 00000000..62298a50 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/experimental/mod_cache.h @@ -0,0 +1,319 @@ +/* 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. + */ + +#ifndef MOD_CACHE_H +#define MOD_CACHE_H + +/* + * Main include file for the Apache Transparent Cache + */ + +#define CORE_PRIVATE + +#include "apr_hooks.h" +#include "apr.h" +#include "apr_lib.h" +#include "apr_strings.h" +#include "apr_buckets.h" +#include "apr_md5.h" +#include "apr_pools.h" +#include "apr_strings.h" +#include "apr_optional.h" +#define APR_WANT_STRFUNC +#include "apr_want.h" + +#include "httpd.h" +#include "http_config.h" +#include "ap_config.h" +#include "http_core.h" +#include "http_protocol.h" +#include "http_request.h" +#include "http_vhost.h" +#include "http_main.h" +#include "http_log.h" +#include "http_connection.h" +#include "util_filter.h" +#include "apr_date.h" +#include "apr_uri.h" + +#ifdef HAVE_NETDB_H +#include +#endif + +#ifdef HAVE_SYS_SOCKET_H +#include +#endif + +#ifdef HAVE_NETINET_IN_H +#include +#endif + +#ifdef HAVE_ARPA_INET_H +#include +#endif + +#include "apr_atomic.h" + +#ifndef MAX +#define MAX(a,b) ((a) > (b) ? (a) : (b)) +#endif +#ifndef MIN +#define MIN(a,b) ((a) < (b) ? (a) : (b)) +#endif + +/* default completion is 60% */ +#define DEFAULT_CACHE_COMPLETION (60) +#define MSEC_ONE_DAY ((apr_time_t)(86400*APR_USEC_PER_SEC)) /* one day, in microseconds */ +#define MSEC_ONE_HR ((apr_time_t)(3600*APR_USEC_PER_SEC)) /* one hour, in microseconds */ +#define MSEC_ONE_MIN ((apr_time_t)(60*APR_USEC_PER_SEC)) /* one minute, in microseconds */ +#define MSEC_ONE_SEC ((apr_time_t)(APR_USEC_PER_SEC)) /* one second, in microseconds */ +#define DEFAULT_CACHE_MAXEXPIRE MSEC_ONE_DAY +#define DEFAULT_CACHE_EXPIRE MSEC_ONE_HR +#define DEFAULT_CACHE_LMFACTOR (0.1) + +/* Create a set of PROXY_DECLARE(type), PROXY_DECLARE_NONSTD(type) and + * PROXY_DECLARE_DATA with appropriate export and import tags for the platform + */ +#if !defined(WIN32) +#define CACHE_DECLARE(type) type +#define CACHE_DECLARE_NONSTD(type) type +#define CACHE_DECLARE_DATA +#elif defined(CACHE_DECLARE_STATIC) +#define CACHE_DECLARE(type) type __stdcall +#define CACHE_DECLARE_NONSTD(type) type +#define CACHE_DECLARE_DATA +#elif defined(CACHE_DECLARE_EXPORT) +#define CACHE_DECLARE(type) __declspec(dllexport) type __stdcall +#define CACHE_DECLARE_NONSTD(type) __declspec(dllexport) type +#define CACHE_DECLARE_DATA __declspec(dllexport) +#else +#define CACHE_DECLARE(type) __declspec(dllimport) type __stdcall +#define CACHE_DECLARE_NONSTD(type) __declspec(dllimport) type +#define CACHE_DECLARE_DATA __declspec(dllimport) +#endif + +struct cache_enable { + const char *url; + const char *type; + apr_size_t urllen; +}; + +struct cache_disable { + const char *url; + apr_size_t urllen; +}; + +/* static information about the local cache */ +typedef struct { + apr_array_header_t *cacheenable; /* URLs to cache */ + apr_array_header_t *cachedisable; /* URLs not to cache */ + apr_time_t maxex; /* Maximum time to keep cached files in msecs */ + int maxex_set; + apr_time_t defex; /* default time to keep cached file in msecs */ + int defex_set; + double factor; /* factor for estimating expires date */ + int factor_set; + int complete; /* Force cache completion after this point */ + int complete_set; + /** ignore the last-modified header when deciding to cache this request */ + int no_last_mod_ignore_set; + int no_last_mod_ignore; + /** ignore client's requests for uncached responses */ + int ignorecachecontrol; + int ignorecachecontrol_set; + /** store the headers that should not be stored in the cache */ + apr_array_header_t *ignore_headers; + /* flag if CacheIgnoreHeader has been set */ + #define CACHE_IGNORE_HEADERS_SET 1 + #define CACHE_IGNORE_HEADERS_UNSET 0 + int ignore_headers_set; +} cache_server_conf; + +/* cache info information */ +typedef struct cache_info cache_info; +struct cache_info { + int status; + char *content_type; + char *etag; + char *lastmods; /* last modified of cache entity */ + char *filename; + apr_time_t date; + apr_time_t lastmod; + char lastmod_str[APR_RFC822_DATE_LEN]; + apr_time_t expire; + apr_time_t request_time; + apr_time_t response_time; + apr_size_t len; + apr_time_t ims; /* If-Modified_Since header value */ + apr_time_t ius; /* If-UnModified_Since header value */ + const char *im; /* If-Match header value */ + const char *inm; /* If-None-Match header value */ +}; + +/* cache handle information */ + +/* XXX TODO On the next structure change/MMN bump, + * count must become an apr_off_t, representing + * the potential size of disk cached objects. + * Then dig for + * "XXX Bad Temporary Cast - see cache_object_t notes" + */ +typedef struct cache_object cache_object_t; +struct cache_object { + char *key; + cache_object_t *next; + cache_info info; + void *vobj; /* Opaque portion (specific to the cache implementation) of the cache object */ + apr_size_t count; /* Number of body bytes written to the cache so far */ + int complete; + apr_atomic_t refcount; + apr_size_t cleanup; +}; + +typedef struct cache_handle cache_handle_t; + +#define CACHE_PROVIDER_GROUP "cache" + +typedef struct { + int (*remove_entity) (cache_handle_t *h); + apr_status_t (*store_headers)(cache_handle_t *h, request_rec *r, cache_info *i); + apr_status_t (*store_body)(cache_handle_t *h, request_rec *r, apr_bucket_brigade *b); + apr_status_t (*recall_headers) (cache_handle_t *h, request_rec *r); + apr_status_t (*recall_body) (cache_handle_t *h, apr_pool_t *p, apr_bucket_brigade *bb); + int (*create_entity) (cache_handle_t *h, request_rec *r, + const char *urlkey, apr_off_t len); + int (*open_entity) (cache_handle_t *h, request_rec *r, + const char *urlkey); + int (*remove_url) (const char *urlkey); +} cache_provider; + +/* A linked-list of authn providers. */ +typedef struct cache_provider_list cache_provider_list; + +struct cache_provider_list { + const char *provider_name; + const cache_provider *provider; + cache_provider_list *next; +}; + +struct cache_handle { + cache_object_t *cache_obj; + apr_table_t *req_hdrs; /* cached request headers */ + apr_table_t *resp_hdrs; /* cached response headers */ + apr_table_t *resp_err_hdrs; /* cached response err headers */ + const char *content_type; /* cached content type */ + int status; /* cached status */ +}; + +/* per request cache information */ +typedef struct { + cache_provider_list *providers; /* possible cache providers */ + const cache_provider *provider; /* current cache provider */ + const char *provider_name; /* current cache provider name */ + int fresh; /* is the entitey fresh? */ + cache_handle_t *handle; /* current cache handle */ + cache_handle_t *stale_handle; /* stale cache handle */ + apr_table_t *stale_headers; /* original request headers. */ + int in_checked; /* CACHE_SAVE must cache the entity */ + int block_response; /* CACHE_SAVE must block response. */ + apr_bucket_brigade *saved_brigade; /* copy of partial response */ + apr_off_t saved_size; /* length of saved_brigade */ + apr_time_t exp; /* expiration */ + apr_time_t lastmod; /* last-modified time */ + cache_info *info; /* current cache info */ +} cache_request_rec; + + +/* cache_util.c */ +/* do a HTTP/1.1 age calculation */ +CACHE_DECLARE(apr_time_t) ap_cache_current_age(cache_info *info, const apr_time_t age_value, + apr_time_t now); + +/** + * Check the freshness of the cache object per RFC2616 section 13.2 (Expiration Model) + * @param h cache_handle_t + * @param r request_rec + * @return 0 ==> cache object is stale, 1 ==> cache object is fresh + */ +CACHE_DECLARE(int) ap_cache_check_freshness(cache_handle_t *h, request_rec *r); +CACHE_DECLARE(apr_time_t) ap_cache_hex2usec(const char *x); +CACHE_DECLARE(void) ap_cache_usec2hex(apr_time_t j, char *y); +CACHE_DECLARE(char *) generate_name(apr_pool_t *p, int dirlevels, + int dirlength, + const char *name); +CACHE_DECLARE(int) ap_cache_request_is_conditional(apr_table_t *table); +CACHE_DECLARE(cache_provider_list *)ap_cache_get_providers(request_rec *r, cache_server_conf *conf, const char *url); +CACHE_DECLARE(int) ap_cache_liststr(apr_pool_t *p, const char *list, + const char *key, char **val); +CACHE_DECLARE(const char *)ap_cache_tokstr(apr_pool_t *p, const char *list, const char **str); + +/* Create a new table consisting of those elements from a request_rec's + * headers_out that are allowed to be stored in a cache + */ +CACHE_DECLARE(apr_table_t *)ap_cache_cacheable_hdrs_out(apr_pool_t *pool, + apr_table_t *t, + server_rec *s); + +/** + * cache_storage.c + */ +int cache_remove_url(request_rec *r, char *url); +int cache_create_entity(request_rec *r, char *url, apr_off_t size); +int cache_select_url(request_rec *r, char *url); +apr_status_t cache_generate_key_default( request_rec *r, apr_pool_t*p, char**key ); +/** + * create a key for the cache based on the request record + * this is the 'default' version, which can be overridden by a default function + */ +const char* cache_create_key( request_rec*r ); + +/* +apr_status_t cache_store_entity_headers(cache_handle_t *h, request_rec *r, cache_info *info); +apr_status_t cache_store_entity_body(cache_handle_t *h, request_rec *r, apr_bucket_brigade *bb); + +apr_status_t cache_recall_entity_headers(cache_handle_t *h, request_rec *r); +apr_status_t cache_recall_entity_body(cache_handle_t *h, apr_pool_t *p, apr_bucket_brigade *bb); +*/ + +/* hooks */ + +/* Create a set of CACHE_DECLARE(type), CACHE_DECLARE_NONSTD(type) and + * CACHE_DECLARE_DATA with appropriate export and import tags for the platform + */ +#if !defined(WIN32) +#define CACHE_DECLARE(type) type +#define CACHE_DECLARE_NONSTD(type) type +#define CACHE_DECLARE_DATA +#elif defined(CACHE_DECLARE_STATIC) +#define CACHE_DECLARE(type) type __stdcall +#define CACHE_DECLARE_NONSTD(type) type +#define CACHE_DECLARE_DATA +#elif defined(CACHE_DECLARE_EXPORT) +#define CACHE_DECLARE(type) __declspec(dllexport) type __stdcall +#define CACHE_DECLARE_NONSTD(type) __declspec(dllexport) type +#define CACHE_DECLARE_DATA __declspec(dllexport) +#else +#define CACHE_DECLARE(type) __declspec(dllimport) type __stdcall +#define CACHE_DECLARE_NONSTD(type) __declspec(dllimport) type +#define CACHE_DECLARE_DATA __declspec(dllimport) +#endif + +APR_DECLARE_OPTIONAL_FN(apr_status_t, + ap_cache_generate_key, + (request_rec *r, apr_pool_t*p, char**key )); + + +#endif /*MOD_CACHE_H*/ diff --git a/rubbos/app/httpd-2.0.64/modules/experimental/mod_cache.imp b/rubbos/app/httpd-2.0.64/modules/experimental/mod_cache.imp new file mode 100644 index 00000000..6bf4db08 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/experimental/mod_cache.imp @@ -0,0 +1,10 @@ + (MODCACHE) + ap_cache_request_is_conditional, + ap_cache_get_providers, + ap_cache_liststr, + ap_cache_tokstr, + ap_cache_hex2usec, + ap_cache_usec2hex, + ap_cache_cacheable_hdrs_out, + generate_name + diff --git a/rubbos/app/httpd-2.0.64/modules/experimental/mod_case_filter.c b/rubbos/app/httpd-2.0.64/modules/experimental/mod_case_filter.c new file mode 100644 index 00000000..657c174b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/experimental/mod_case_filter.c @@ -0,0 +1,137 @@ +/* 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. + */ + +#include "httpd.h" +#include "http_config.h" +#include "apr_buckets.h" +#include "apr_general.h" +#include "apr_lib.h" +#include "util_filter.h" +#include "http_request.h" + +#include + +static const char s_szCaseFilterName[]="CaseFilter"; +module AP_MODULE_DECLARE_DATA case_filter_module; + +typedef struct + { + int bEnabled; + } CaseFilterConfig; + +static void *CaseFilterCreateServerConfig(apr_pool_t *p,server_rec *s) + { + CaseFilterConfig *pConfig=apr_pcalloc(p,sizeof *pConfig); + + pConfig->bEnabled=0; + + return pConfig; + } + +static void CaseFilterInsertFilter(request_rec *r) + { + CaseFilterConfig *pConfig=ap_get_module_config(r->server->module_config, + &case_filter_module); + + if(!pConfig->bEnabled) + return; + + ap_add_output_filter(s_szCaseFilterName,NULL,r,r->connection); + } + +static apr_status_t CaseFilterOutFilter(ap_filter_t *f, + apr_bucket_brigade *pbbIn) + { + request_rec *r = f->r; + conn_rec *c = r->connection; + apr_bucket *pbktIn; + apr_bucket_brigade *pbbOut; + + pbbOut=apr_brigade_create(r->pool, c->bucket_alloc); + APR_BRIGADE_FOREACH(pbktIn,pbbIn) + { + const char *data; + apr_size_t len; + char *buf; + apr_size_t n; + apr_bucket *pbktOut; + + if(APR_BUCKET_IS_EOS(pbktIn)) + { + apr_bucket *pbktEOS=apr_bucket_eos_create(c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(pbbOut,pbktEOS); + continue; + } + + /* read */ + apr_bucket_read(pbktIn,&data,&len,APR_BLOCK_READ); + + /* write */ + buf = apr_bucket_alloc(len, c->bucket_alloc); + for(n=0 ; n < len ; ++n) + buf[n] = apr_toupper(data[n]); + + pbktOut = apr_bucket_heap_create(buf, len, apr_bucket_free, + c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(pbbOut,pbktOut); + } + + /* Q: is there any advantage to passing a brigade for each bucket? + * A: obviously, it can cut down server resource consumption, if this + * experimental module was fed a file of 4MB, it would be using 8MB for + * the 'read' buckets and the 'write' buckets. + * + * Note it is more efficient to consume (destroy) each bucket as it's + * processed above than to do a single cleanup down here. In any case, + * don't let our caller pass the same buckets to us, twice; + */ + apr_brigade_cleanup(pbbIn); + return ap_pass_brigade(f->next,pbbOut); + } + +static const char *CaseFilterEnable(cmd_parms *cmd, void *dummy, int arg) + { + CaseFilterConfig *pConfig=ap_get_module_config(cmd->server->module_config, + &case_filter_module); + pConfig->bEnabled=arg; + + return NULL; + } + +static const command_rec CaseFilterCmds[] = + { + AP_INIT_FLAG("CaseFilter", CaseFilterEnable, NULL, RSRC_CONF, + "Run a case filter on this host"), + { NULL } + }; + +static void CaseFilterRegisterHooks(apr_pool_t *p) + { + ap_hook_insert_filter(CaseFilterInsertFilter,NULL,NULL,APR_HOOK_MIDDLE); + ap_register_output_filter(s_szCaseFilterName,CaseFilterOutFilter,NULL, + AP_FTYPE_RESOURCE); + } + +module AP_MODULE_DECLARE_DATA case_filter_module = +{ + STANDARD20_MODULE_STUFF, + NULL, + NULL, + CaseFilterCreateServerConfig, + NULL, + CaseFilterCmds, + CaseFilterRegisterHooks +}; diff --git a/rubbos/app/httpd-2.0.64/modules/experimental/mod_case_filter_in.c b/rubbos/app/httpd-2.0.64/modules/experimental/mod_case_filter_in.c new file mode 100644 index 00000000..9cac660d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/experimental/mod_case_filter_in.c @@ -0,0 +1,160 @@ +/* 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. + */ + +/* + * An example input filter - this converts input to upper case. Note that + * because of the moment it gets inserted it does NOT convert request headers. + */ + +#include "httpd.h" +#include "http_config.h" +#include "apr_buckets.h" +#include "apr_general.h" +#include "apr_lib.h" +#include "util_filter.h" +#include "http_request.h" + +#include + +static const char s_szCaseFilterName[] = "CaseFilterIn"; +module AP_MODULE_DECLARE_DATA case_filter_in_module; + +typedef struct +{ + int bEnabled; +} CaseFilterInConfig; + +typedef struct +{ + apr_bucket_brigade *pbbTmp; +} CaseFilterInContext; + +static void *CaseFilterInCreateServerConfig(apr_pool_t *p, server_rec *s) +{ + CaseFilterInConfig *pConfig = apr_pcalloc(p, sizeof *pConfig); + + pConfig->bEnabled = 0; + + return pConfig; +} + +static void CaseFilterInInsertFilter(request_rec *r) +{ + CaseFilterInConfig *pConfig=ap_get_module_config(r->server->module_config, + &case_filter_in_module); + if(!pConfig->bEnabled) + return; + + ap_add_input_filter(s_szCaseFilterName,NULL,r,r->connection); +} + +static apr_status_t CaseFilterInFilter(ap_filter_t *f, + apr_bucket_brigade *pbbOut, + ap_input_mode_t eMode, + apr_read_type_e eBlock, + apr_off_t nBytes) +{ + request_rec *r = f->r; + conn_rec *c = r->connection; + CaseFilterInContext *pCtx; + apr_status_t ret; + + if (!(pCtx = f->ctx)) { + f->ctx = pCtx = apr_palloc(r->pool, sizeof *pCtx); + pCtx->pbbTmp = apr_brigade_create(r->pool, c->bucket_alloc); + } + + if (APR_BRIGADE_EMPTY(pCtx->pbbTmp)) { + ret = ap_get_brigade(f->next, pCtx->pbbTmp, eMode, eBlock, nBytes); + + if (eMode == AP_MODE_EATCRLF || ret != APR_SUCCESS) + return ret; + } + + while(!APR_BRIGADE_EMPTY(pCtx->pbbTmp)) { + apr_bucket *pbktIn = APR_BRIGADE_FIRST(pCtx->pbbTmp); + apr_bucket *pbktOut; + const char *data; + apr_size_t len; + char *buf; + int n; + + /* It is tempting to do this... + * APR_BUCKET_REMOVE(pB); + * APR_BRIGADE_INSERT_TAIL(pbbOut,pB); + * and change the case of the bucket data, but that would be wrong + * for a file or socket buffer, for example... + */ + + if(APR_BUCKET_IS_EOS(pbktIn)) { + APR_BUCKET_REMOVE(pbktIn); + APR_BRIGADE_INSERT_TAIL(pbbOut, pbktIn); + break; + } + + ret=apr_bucket_read(pbktIn, &data, &len, eBlock); + if(ret != APR_SUCCESS) + return ret; + + buf = malloc(len); + for(n=0 ; n < len ; ++n) + buf[n] = apr_toupper(data[n]); + + pbktOut = apr_bucket_heap_create(buf, len, 0, c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(pbbOut, pbktOut); + apr_bucket_delete(pbktIn); + } + + return APR_SUCCESS; +} + + +static const char *CaseFilterInEnable(cmd_parms *cmd, void *dummy, int arg) +{ + CaseFilterInConfig *pConfig + = ap_get_module_config(cmd->server->module_config, + &case_filter_in_module); + pConfig->bEnabled=arg; + + return NULL; +} + +static const command_rec CaseFilterInCmds[] = +{ + AP_INIT_FLAG("CaseFilterIn", CaseFilterInEnable, NULL, RSRC_CONF, + "Run an input case filter on this host"), + { NULL } +}; + + +static void CaseFilterInRegisterHooks(apr_pool_t *p) +{ + ap_hook_insert_filter(CaseFilterInInsertFilter, NULL, NULL, + APR_HOOK_MIDDLE); + ap_register_input_filter(s_szCaseFilterName, CaseFilterInFilter, NULL, + AP_FTYPE_RESOURCE); +} + +module AP_MODULE_DECLARE_DATA case_filter_in_module = +{ + STANDARD20_MODULE_STUFF, + NULL, + NULL, + CaseFilterInCreateServerConfig, + NULL, + CaseFilterInCmds, + CaseFilterInRegisterHooks +}; diff --git a/rubbos/app/httpd-2.0.64/modules/experimental/mod_charset_lite.c b/rubbos/app/httpd-2.0.64/modules/experimental/mod_charset_lite.c new file mode 100644 index 00000000..a39261da --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/experimental/mod_charset_lite.c @@ -0,0 +1,1082 @@ +/* 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. + */ + +/* + * simple hokey charset recoding configuration module + * + * See mod_ebcdic and mod_charset for more thought-out examples. This + * one is just so Jeff can learn how a module works and experiment with + * basic character set recoding configuration. + * + * !!!This is an extremely cheap ripoff of mod_charset.c from Russian Apache!!! + */ + +#include "httpd.h" +#include "http_config.h" +#define CORE_PRIVATE +#include "http_core.h" +#include "http_log.h" +#include "http_main.h" +#include "http_protocol.h" +#include "http_request.h" +#include "util_charset.h" +#include "apr_buckets.h" +#include "util_filter.h" +#include "apr_strings.h" +#include "apr_lib.h" +#include "apr_xlate.h" +#define APR_WANT_STRFUNC +#include "apr_want.h" + +#define OUTPUT_XLATE_BUF_SIZE (16*1024) /* size of translation buffer used on output */ +#define INPUT_XLATE_BUF_SIZE (8*1024) /* size of translation buffer used on input */ + +#define XLATE_MIN_BUFF_LEFT 128 /* flush once there is no more than this much + * space left in the translation buffer + */ + +#define FATTEST_CHAR 8 /* we don't handle chars wider than this that straddle + * two buckets + */ + +/* extended error status codes; this is used in addition to an apr_status_t to + * track errors in the translation filter + */ +typedef enum { + EES_INIT = 0, /* no error info yet; value must be 0 for easy init */ + EES_LIMIT, /* built-in restriction encountered */ + EES_INCOMPLETE_CHAR, /* incomplete multi-byte char at end of content */ + EES_BUCKET_READ, + EES_DOWNSTREAM, /* something bad happened in a filter below xlate */ + EES_BAD_INPUT /* input data invalid */ +} ees_t; + +/* registered name of the output translation filter */ +#define XLATEOUT_FILTER_NAME "XLATEOUT" +/* registered name of input translation filter */ +#define XLATEIN_FILTER_NAME "XLATEIN" + +typedef struct charset_dir_t { + /** debug level; -1 means uninitialized, 0 means no debug */ + int debug; + const char *charset_source; /* source encoding */ + const char *charset_default; /* how to ship on wire */ + /** module does ap_add_*_filter()? */ + enum {IA_INIT, IA_IMPADD, IA_NOIMPADD} implicit_add; +} charset_dir_t; + +/* charset_filter_ctx_t is created for each filter instance; because the same + * filter code is used for translating in both directions, we need this context + * data to tell the filter which translation handle to use; it also can hold a + * character which was split between buckets + */ +typedef struct charset_filter_ctx_t { + apr_xlate_t *xlate; + charset_dir_t *dc; + ees_t ees; /* extended error status */ + apr_size_t saved; + char buf[FATTEST_CHAR]; /* we want to be able to build a complete char here */ + int ran; /* has filter instance run before? */ + int noop; /* should we pass brigades through unchanged? */ + char *tmp; /* buffer for input filtering */ + apr_bucket_brigade *bb; /* input buckets we couldn't finish translating */ +} charset_filter_ctx_t; + +/* charset_req_t is available via r->request_config if any translation is + * being performed + */ +typedef struct charset_req_t { + charset_dir_t *dc; + charset_filter_ctx_t *output_ctx, *input_ctx; +} charset_req_t; + +/* debug level definitions */ +#define DBGLVL_GORY 9 /* gory details */ +#define DBGLVL_FLOW 4 /* enough messages to see what happens on + * each request */ +#define DBGLVL_PMC 2 /* messages about possible misconfiguration */ + +module AP_MODULE_DECLARE_DATA charset_lite_module; + +static void *create_charset_dir_conf(apr_pool_t *p,char *dummy) +{ + charset_dir_t *dc = (charset_dir_t *)apr_pcalloc(p,sizeof(charset_dir_t)); + + dc->debug = -1; + return dc; +} + +static void *merge_charset_dir_conf(apr_pool_t *p, void *basev, void *overridesv) +{ + charset_dir_t *a = (charset_dir_t *)apr_pcalloc (p, sizeof(charset_dir_t)); + charset_dir_t *base = (charset_dir_t *)basev, + *over = (charset_dir_t *)overridesv; + + /* If it is defined in the current container, use it. Otherwise, use the one + * from the enclosing container. + */ + + a->debug = + over->debug != -1 ? over->debug : base->debug; + a->charset_default = + over->charset_default ? over->charset_default : base->charset_default; + a->charset_source = + over->charset_source ? over->charset_source : base->charset_source; + a->implicit_add = + over->implicit_add != IA_INIT ? over->implicit_add : base->implicit_add; + return a; +} + +/* CharsetSourceEnc charset + */ +static const char *add_charset_source(cmd_parms *cmd, void *in_dc, + const char *name) +{ + charset_dir_t *dc = in_dc; + + dc->charset_source = name; + return NULL; +} + +/* CharsetDefault charset + */ +static const char *add_charset_default(cmd_parms *cmd, void *in_dc, + const char *name) +{ + charset_dir_t *dc = in_dc; + + dc->charset_default = name; + return NULL; +} + +/* CharsetOptions optionflag... + */ +static const char *add_charset_options(cmd_parms *cmd, void *in_dc, + const char *flag) +{ + charset_dir_t *dc = in_dc; + + if (!strcasecmp(flag, "ImplicitAdd")) { + dc->implicit_add = IA_IMPADD; + } + else if (!strcasecmp(flag, "NoImplicitAdd")) { + dc->implicit_add = IA_NOIMPADD; + } + else if (!strncasecmp(flag, "DebugLevel=", 11)) { + dc->debug = atoi(flag + 11); + } + else { + return apr_pstrcat(cmd->temp_pool, + "Invalid CharsetOptions option: ", + flag, + NULL); + } + + return NULL; +} + +/* find_code_page() is a fixup hook that decides if translation should be + * enabled; if so, it sets up request data for use by the filter registration + * hook so that it knows what to do + */ +static int find_code_page(request_rec *r) +{ + charset_dir_t *dc = ap_get_module_config(r->per_dir_config, + &charset_lite_module); + charset_req_t *reqinfo; + charset_filter_ctx_t *input_ctx, *output_ctx; + apr_status_t rv; + const char *mime_type; + + if (dc->debug >= DBGLVL_FLOW) { + ap_log_rerror(APLOG_MARK,APLOG_DEBUG, 0, r, + "uri: %s file: %s method: %d " + "imt: %s flags: %s%s%s %s->%s", + r->uri, r->filename, r->method_number, + r->content_type ? r->content_type : "(unknown)", + r->main ? "S" : "", /* S if subrequest */ + r->prev ? "R" : "", /* R if redirect */ + r->proxyreq ? "P" : "", /* P if proxy */ + dc->charset_source, dc->charset_default); + } + + /* If we don't have a full directory configuration, bail out. + */ + if (!dc->charset_source || !dc->charset_default) { + if (dc->debug >= DBGLVL_PMC) { + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, + "incomplete configuration: src %s, dst %s", + dc->charset_source ? dc->charset_source : "unspecified", + dc->charset_default ? dc->charset_default : "unspecified"); + } + return DECLINED; + } + + /* catch proxy requests */ + if (r->proxyreq) return DECLINED; + /* mod_rewrite indicators */ + if (!strncmp(r->filename, "redirect:", 9)) return DECLINED; + if (!strncmp(r->filename, "gone:", 5)) return DECLINED; + if (!strncmp(r->filename, "passthrough:", 12)) return DECLINED; + if (!strncmp(r->filename, "forbidden:", 10)) return DECLINED; + + mime_type = r->content_type ? r->content_type : ap_default_type(r); + + /* If mime type isn't text or message, bail out. + */ + +/* XXX When we handle translation of the request body, watch out here as + * 1.3 allowed additional mime types: multipart and + * application/x-www-form-urlencoded + */ + + if (strncasecmp(mime_type, "text/", 5) && +#if APR_CHARSET_EBCDIC || AP_WANT_DIR_TRANSLATION + /* On an EBCDIC machine, be willing to translate mod_autoindex- + * generated output. Otherwise, it doesn't look too cool. + * + * XXX This isn't a perfect fix because this doesn't trigger us + * to convert from the charset of the source code to ASCII. The + * general solution seems to be to allow a generator to set an + * indicator in the r specifying that the body is coded in the + * implementation character set (i.e., the charset of the source + * code). This would get several different types of documents + * translated properly: mod_autoindex output, mod_status output, + * mod_info output, hard-coded error documents, etc. + */ + strcmp(mime_type, DIR_MAGIC_TYPE) && +#endif + strncasecmp(mime_type, "message/", 8)) { + if (dc->debug >= DBGLVL_GORY) { + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, + "mime type is %s; no translation selected", + mime_type); + } + return DECLINED; + } + + if (dc->debug >= DBGLVL_GORY) { + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, + "charset_source: %s charset_default: %s", + dc && dc->charset_source ? dc->charset_source : "(none)", + dc && dc->charset_default ? dc->charset_default : "(none)"); + } + + /* Get storage for the request data and the output filter context. + * We rarely need the input filter context, so allocate that separately. + */ + reqinfo = (charset_req_t *)apr_pcalloc(r->pool, + sizeof(charset_req_t) + + sizeof(charset_filter_ctx_t)); + output_ctx = (charset_filter_ctx_t *)(reqinfo + 1); + + reqinfo->dc = dc; + output_ctx->dc = dc; + ap_set_module_config(r->request_config, &charset_lite_module, reqinfo); + + reqinfo->output_ctx = output_ctx; + rv = apr_xlate_open(&output_ctx->xlate, + dc->charset_default, dc->charset_source, r->pool); + if (rv != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + "can't open translation %s->%s", + dc->charset_source, dc->charset_default); + return HTTP_INTERNAL_SERVER_ERROR; + } + + switch (r->method_number) { + case M_PUT: + case M_POST: + /* Set up input translation. Note: A request body can be included + * with the OPTIONS method, but for now we don't set up translation + * of it. + */ + input_ctx = apr_pcalloc(r->pool, sizeof(charset_filter_ctx_t)); + input_ctx->bb = apr_brigade_create(r->pool, + r->connection->bucket_alloc); + input_ctx->tmp = apr_palloc(r->pool, INPUT_XLATE_BUF_SIZE); + input_ctx->dc = dc; + reqinfo->input_ctx = input_ctx; + rv = apr_xlate_open(&input_ctx->xlate, dc->charset_source, + dc->charset_default, r->pool); + if (rv != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + "can't open translation %s->%s", + dc->charset_default, dc->charset_source); + return HTTP_INTERNAL_SERVER_ERROR; + } + } + + return DECLINED; +} + +static int configured_in_list(request_rec *r, const char *filter_name, + struct ap_filter_t *filter_list) +{ + struct ap_filter_t *filter = filter_list; + + while (filter) { + if (!strcasecmp(filter_name, filter->frec->name)) { + return 1; + } + filter = filter->next; + } + return 0; +} + +static int configured_on_input(request_rec *r, const char *filter_name) +{ + return configured_in_list(r, filter_name, r->input_filters); +} + +static int configured_on_output(request_rec *r, const char *filter_name) +{ + return configured_in_list(r, filter_name, r->output_filters); +} + +/* xlate_insert_filter() is a filter hook which decides whether or not + * to insert a translation filter for the current request. + */ +static void xlate_insert_filter(request_rec *r) +{ + /* Hey... don't be so quick to use reqinfo->dc here; reqinfo may be NULL */ + charset_req_t *reqinfo = ap_get_module_config(r->request_config, + &charset_lite_module); + charset_dir_t *dc = ap_get_module_config(r->per_dir_config, + &charset_lite_module); + + if (reqinfo) { + if (reqinfo->output_ctx && !configured_on_output(r, XLATEOUT_FILTER_NAME)) { + ap_add_output_filter(XLATEOUT_FILTER_NAME, reqinfo->output_ctx, r, + r->connection); + } + else if (dc->debug >= DBGLVL_FLOW) { + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, + "xlate output filter not added implicitly because %s", + !reqinfo->output_ctx ? + "no output configuration available" : + "another module added the filter"); + } + + if (reqinfo->input_ctx && !configured_on_input(r, XLATEIN_FILTER_NAME)) { + ap_add_input_filter(XLATEIN_FILTER_NAME, reqinfo->input_ctx, r, + r->connection); + } + else if (dc->debug >= DBGLVL_FLOW) { + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, + "xlate input filter not added implicitly because %s", + !reqinfo->input_ctx ? + "no input configuration available" : + "another module added the filter"); + } + } +} + +/* stuff that sucks that I know of: + * + * bucket handling: + * why create an eos bucket when we see it come down the stream? just send the one + * passed as input... news flash: this will be fixed when xlate_out_filter() starts + * using the more generic xlate_brigade() + * + * translation mechanics: + * we don't handle characters that straddle more than two buckets; an error + * will be generated + */ + +/* send_downstream() is passed the translated data; it puts it in a single- + * bucket brigade and passes the brigade to the next filter + */ +static apr_status_t send_downstream(ap_filter_t *f, const char *tmp, apr_size_t len) +{ + request_rec *r = f->r; + conn_rec *c = r->connection; + apr_bucket_brigade *bb; + apr_bucket *b; + charset_filter_ctx_t *ctx = f->ctx; + apr_status_t rv; + + bb = apr_brigade_create(r->pool, c->bucket_alloc); + b = apr_bucket_transient_create(tmp, len, c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, b); + rv = ap_pass_brigade(f->next, bb); + if (rv != APR_SUCCESS) { + ctx->ees = EES_DOWNSTREAM; + } + return rv; +} + +static apr_status_t send_eos(ap_filter_t *f) +{ + request_rec *r = f->r; + conn_rec *c = r->connection; + apr_bucket_brigade *bb; + apr_bucket *b; + charset_filter_ctx_t *ctx = f->ctx; + apr_status_t rv; + + bb = apr_brigade_create(r->pool, c->bucket_alloc); + b = apr_bucket_eos_create(c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, b); + rv = ap_pass_brigade(f->next, bb); + if (rv != APR_SUCCESS) { + ctx->ees = EES_DOWNSTREAM; + } + return rv; +} + +static apr_status_t set_aside_partial_char(charset_filter_ctx_t *ctx, + const char *partial, + apr_size_t partial_len) +{ + apr_status_t rv; + + if (sizeof(ctx->buf) > partial_len) { + ctx->saved = partial_len; + memcpy(ctx->buf, partial, partial_len); + rv = APR_SUCCESS; + } + else { + rv = APR_INCOMPLETE; + ctx->ees = EES_LIMIT; /* we don't handle chars this wide which straddle + * buckets + */ + } + return rv; +} + +static apr_status_t finish_partial_char(charset_filter_ctx_t *ctx, + /* input buffer: */ + const char **cur_str, + apr_size_t *cur_len, + /* output buffer: */ + char **out_str, + apr_size_t *out_len) +{ + apr_status_t rv; + apr_size_t tmp_input_len; + + /* Keep adding bytes from the input string to the saved string until we + * 1) finish the input char + * 2) get an error + * or 3) run out of bytes to add + */ + + do { + ctx->buf[ctx->saved] = **cur_str; + ++ctx->saved; + ++*cur_str; + --*cur_len; + tmp_input_len = ctx->saved; + rv = apr_xlate_conv_buffer(ctx->xlate, + ctx->buf, + &tmp_input_len, + *out_str, + out_len); + } while (rv == APR_INCOMPLETE && *cur_len); + + if (rv == APR_SUCCESS) { + ctx->saved = 0; + } + else { + ctx->ees = EES_LIMIT; /* code isn't smart enough to handle chars + * straddling more than two buckets + */ + } + + return rv; +} + +static void log_xlate_error(ap_filter_t *f, apr_status_t rv) +{ + charset_filter_ctx_t *ctx = f->ctx; + const char *msg; + char msgbuf[100]; + int cur; + + switch(ctx->ees) { + case EES_LIMIT: + rv = 0; + msg = "xlate filter - a built-in restriction was encountered"; + break; + case EES_BAD_INPUT: + rv = 0; + msg = "xlate filter - an input character was invalid"; + break; + case EES_BUCKET_READ: + rv = 0; + msg = "xlate filter - bucket read routine failed"; + break; + case EES_INCOMPLETE_CHAR: + rv = 0; + strcpy(msgbuf, "xlate filter - incomplete char at end of input - "); + cur = 0; + while ((apr_size_t)cur < ctx->saved) { + apr_snprintf(msgbuf + strlen(msgbuf), sizeof(msgbuf) - strlen(msgbuf), + "%02X", (unsigned)ctx->buf[cur]); + ++cur; + } + msg = msgbuf; + break; + case EES_DOWNSTREAM: + msg = "xlate filter - an error occurred in a lower filter"; + break; + default: + msg = "xlate filter - returning error"; + } + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, f->r, + "%s", msg); +} + +/* chk_filter_chain() is called once per filter instance; it tries to + * determine if the current filter instance should be disabled because + * its translation is incompatible with the translation of an existing + * instance of the translate filter + * + * Example bad scenario: + * + * configured filter chain for the request: + * INCLUDES XLATEOUT(8859-1->UTS-16) + * configured filter chain for the subrequest: + * XLATEOUT(8859-1->UTS-16) + * + * When the subrequest is processed, the filter chain will be + * XLATEOUT(8859-1->UTS-16) XLATEOUT(8859-1->UTS-16) + * This makes no sense, so the instance of XLATEOUT added for the + * subrequest will be noop-ed. + * + * Example good scenario: + * + * configured filter chain for the request: + * INCLUDES XLATEOUT(8859-1->UTS-16) + * configured filter chain for the subrequest: + * XLATEOUT(IBM-1047->8859-1) + * + * When the subrequest is processed, the filter chain will be + * XLATEOUT(IBM-1047->8859-1) XLATEOUT(8859-1->UTS-16) + * This makes sense, so the instance of XLATEOUT added for the + * subrequest will be left alone and it will translate from + * IBM-1047->8859-1. + */ +static void chk_filter_chain(ap_filter_t *f) +{ + ap_filter_t *curf; + charset_filter_ctx_t *curctx, *last_xlate_ctx = NULL, + *ctx = f->ctx; + int debug = ctx->dc->debug; + int output = !strcasecmp(f->frec->name, XLATEOUT_FILTER_NAME); + + if (ctx->noop) { + return; + } + + /* walk the filter chain; see if it makes sense for our filter to + * do any translation + */ + curf = output ? f->r->output_filters : f->r->input_filters; + while (curf) { + if (!strcasecmp(curf->frec->name, f->frec->name) && + curf->ctx) { + curctx = (charset_filter_ctx_t *)curf->ctx; + if (!last_xlate_ctx) { + last_xlate_ctx = curctx; + } + else { + if (strcmp(last_xlate_ctx->dc->charset_default, + curctx->dc->charset_source)) { + /* incompatible translation + * if our filter instance is incompatible with an instance + * already in place, noop our instance + * Notes: + * . We are only willing to noop our own instance. + * . It is possible to noop another instance which has not + * yet run, but this is not currently implemented. + * Hopefully it will not be needed. + * . It is not possible to noop an instance which has + * already run. + */ + if (last_xlate_ctx == f->ctx) { + last_xlate_ctx->noop = 1; + if (debug >= DBGLVL_PMC) { + const char *symbol = output ? "->" : "<-"; + + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, + 0, f->r, + "%s %s - disabling " + "translation %s%s%s; existing " + "translation %s%s%s", + f->r->uri ? "uri" : "file", + f->r->uri ? f->r->uri : f->r->filename, + last_xlate_ctx->dc->charset_source, + symbol, + last_xlate_ctx->dc->charset_default, + curctx->dc->charset_source, + symbol, + curctx->dc->charset_default); + } + } + else { + const char *symbol = output ? "->" : "<-"; + + ap_log_rerror(APLOG_MARK, APLOG_ERR, + 0, f->r, + "chk_filter_chain() - can't disable " + "translation %s%s%s; existing " + "translation %s%s%s", + last_xlate_ctx->dc->charset_source, + symbol, + last_xlate_ctx->dc->charset_default, + curctx->dc->charset_source, + symbol, + curctx->dc->charset_default); + } + break; + } + } + } + curf = curf->next; + } +} + +/* xlate_brigade() is used to filter request and response bodies + * + * we'll stop when one of the following occurs: + * . we run out of buckets + * . we run out of space in the output buffer + * . we hit an error + * + * inputs: + * bb: brigade to process + * buffer: storage to hold the translated characters + * buffer_size: size of buffer + * (and a few more uninteresting parms) + * + * outputs: + * return value: APR_SUCCESS or some error code + * bb: we've removed any buckets representing the + * translated characters; the eos bucket, if + * present, will be left in the brigade + * buffer: filled in with translated characters + * buffer_size: updated with the bytes remaining + * hit_eos: did we hit an EOS bucket? + */ +static apr_status_t xlate_brigade(charset_filter_ctx_t *ctx, + apr_bucket_brigade *bb, + char *buffer, + apr_size_t *buffer_avail, + int *hit_eos) +{ + apr_bucket *b = NULL; /* set to NULL only to quiet some gcc */ + apr_bucket *consumed_bucket; + const char *bucket; + apr_size_t bytes_in_bucket; /* total bytes read from current bucket */ + apr_size_t bucket_avail; /* bytes left in current bucket */ + apr_status_t rv = APR_SUCCESS; + + *hit_eos = 0; + bucket_avail = 0; + consumed_bucket = NULL; + while (1) { + if (!bucket_avail) { /* no bytes left to process in the current bucket... */ + if (consumed_bucket) { + apr_bucket_delete(consumed_bucket); + consumed_bucket = NULL; + } + b = APR_BRIGADE_FIRST(bb); + if (b == APR_BRIGADE_SENTINEL(bb) || + APR_BUCKET_IS_EOS(b)) { + break; + } + rv = apr_bucket_read(b, &bucket, &bytes_in_bucket, APR_BLOCK_READ); + if (rv != APR_SUCCESS) { + ctx->ees = EES_BUCKET_READ; + break; + } + bucket_avail = bytes_in_bucket; + consumed_bucket = b; /* for axing when we're done reading it */ + } + if (bucket_avail) { + /* We've got data, so translate it. */ + if (ctx->saved) { + /* Rats... we need to finish a partial character from the previous + * bucket. + * + * Strangely, finish_partial_char() increments the input buffer + * pointer but does not increment the output buffer pointer. + */ + apr_size_t old_buffer_avail = *buffer_avail; + rv = finish_partial_char(ctx, + &bucket, &bucket_avail, + &buffer, buffer_avail); + buffer += old_buffer_avail - *buffer_avail; + } + else { + apr_size_t old_buffer_avail = *buffer_avail; + apr_size_t old_bucket_avail = bucket_avail; + rv = apr_xlate_conv_buffer(ctx->xlate, + bucket, &bucket_avail, + buffer, + buffer_avail); + buffer += old_buffer_avail - *buffer_avail; + bucket += old_bucket_avail - bucket_avail; + + if (rv == APR_INCOMPLETE) { /* partial character at end of input */ + /* We need to save the final byte(s) for next time; we can't + * convert it until we look at the next bucket. + */ + rv = set_aside_partial_char(ctx, bucket, bucket_avail); + bucket_avail = 0; + } + } + if (rv != APR_SUCCESS) { + /* bad input byte or partial char too big to store */ + break; + } + if (*buffer_avail < XLATE_MIN_BUFF_LEFT) { + /* if any data remains in the current bucket, split there */ + if (bucket_avail) { + apr_bucket_split(b, bytes_in_bucket - bucket_avail); + } + apr_bucket_delete(b); + break; + } + } + } + + if (!APR_BRIGADE_EMPTY(bb)) { + b = APR_BRIGADE_FIRST(bb); + if (APR_BUCKET_IS_EOS(b)) { + /* Leave the eos bucket in the brigade for reporting to + * subsequent filters. + */ + *hit_eos = 1; + if (ctx->saved) { + /* Oops... we have a partial char from the previous bucket + * that won't be completed because there's no more data. + */ + rv = APR_INCOMPLETE; + ctx->ees = EES_INCOMPLETE_CHAR; + } + } + } + + return rv; +} + +/* xlate_out_filter() handles (almost) arbitrary conversions from one charset + * to another... + * translation is determined in the fixup hook (find_code_page), which is + * where the filter's context data is set up... the context data gives us + * the translation handle + */ +static apr_status_t xlate_out_filter(ap_filter_t *f, apr_bucket_brigade *bb) +{ + charset_req_t *reqinfo = ap_get_module_config(f->r->request_config, + &charset_lite_module); + charset_dir_t *dc = ap_get_module_config(f->r->per_dir_config, + &charset_lite_module); + charset_filter_ctx_t *ctx = f->ctx; + apr_bucket *dptr, *consumed_bucket; + const char *cur_str; + apr_size_t cur_len, cur_avail; + char tmp[OUTPUT_XLATE_BUF_SIZE]; + apr_size_t space_avail; + int done; + apr_status_t rv = APR_SUCCESS; + + if (!ctx) { + /* this is SetOutputFilter path; grab the preallocated context, + * if any; note that if we decided not to do anything in an earlier + * handler, we won't even have a reqinfo + */ + if (reqinfo) { + ctx = f->ctx = reqinfo->output_ctx; + reqinfo->output_ctx = NULL; /* prevent SNAFU if user coded us twice + * in the filter chain; we can't have two + * instances using the same context + */ + } + if (!ctx) { /* no idea how to translate; don't do anything */ + ctx = f->ctx = apr_pcalloc(f->r->pool, sizeof(charset_filter_ctx_t)); + ctx->dc = dc; + ctx->noop = 1; + } + } + + if (dc->debug >= DBGLVL_GORY) { + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, f->r, + "xlate_out_filter() - " + "charset_source: %s charset_default: %s", + dc && dc->charset_source ? dc->charset_source : "(none)", + dc && dc->charset_default ? dc->charset_default : "(none)"); + } + + if (!ctx->ran) { /* filter never ran before */ + chk_filter_chain(f); + ctx->ran = 1; + } + + if (ctx->noop) { + return ap_pass_brigade(f->next, bb); + } + + dptr = APR_BRIGADE_FIRST(bb); + done = 0; + cur_len = 0; + space_avail = sizeof(tmp); + consumed_bucket = NULL; + while (!done) { + if (!cur_len) { /* no bytes left to process in the current bucket... */ + if (consumed_bucket) { + apr_bucket_delete(consumed_bucket); + consumed_bucket = NULL; + } + if (dptr == APR_BRIGADE_SENTINEL(bb)) { + done = 1; + break; + } + if (APR_BUCKET_IS_EOS(dptr)) { + done = 1; + cur_len = -1; /* XXX yuck, but that tells us to send + * eos down; when we minimize our bb construction + * we'll fix this crap */ + if (ctx->saved) { + /* Oops... we have a partial char from the previous bucket + * that won't be completed because there's no more data. + */ + rv = APR_INCOMPLETE; + ctx->ees = EES_INCOMPLETE_CHAR; + } + break; + } + rv = apr_bucket_read(dptr, &cur_str, &cur_len, APR_BLOCK_READ); + if (rv != APR_SUCCESS) { + done = 1; + ctx->ees = EES_BUCKET_READ; + break; + } + consumed_bucket = dptr; /* for axing when we're done reading it */ + dptr = APR_BUCKET_NEXT(dptr); /* get ready for when we access the + * next bucket */ + } + /* Try to fill up our tmp buffer with translated data. */ + cur_avail = cur_len; + + if (cur_len) { /* maybe we just hit the end of a pipe (len = 0) ? */ + if (ctx->saved) { + /* Rats... we need to finish a partial character from the previous + * bucket. + */ + char *tmp_tmp; + + tmp_tmp = tmp + sizeof(tmp) - space_avail; + rv = finish_partial_char(ctx, + &cur_str, &cur_len, + &tmp_tmp, &space_avail); + } + else { + rv = apr_xlate_conv_buffer(ctx->xlate, + cur_str, &cur_avail, + tmp + sizeof(tmp) - space_avail, &space_avail); + + /* Update input ptr and len after consuming some bytes */ + cur_str += cur_len - cur_avail; + cur_len = cur_avail; + + if (rv == APR_INCOMPLETE) { /* partial character at end of input */ + /* We need to save the final byte(s) for next time; we can't + * convert it until we look at the next bucket. + */ + rv = set_aside_partial_char(ctx, cur_str, cur_len); + cur_len = 0; + } + } + } + + if (rv != APR_SUCCESS) { + /* bad input byte or partial char too big to store */ + done = 1; + } + + if (space_avail < XLATE_MIN_BUFF_LEFT) { + /* It is time to flush, as there is not enough space left in the + * current output buffer to bother with converting more data. + */ + rv = send_downstream(f, tmp, sizeof(tmp) - space_avail); + if (rv != APR_SUCCESS) { + done = 1; + } + + /* tmp is now empty */ + space_avail = sizeof(tmp); + } + } + + if (rv == APR_SUCCESS) { + if (space_avail < sizeof(tmp)) { /* gotta write out what we converted */ + rv = send_downstream(f, tmp, sizeof(tmp) - space_avail); + } + } + if (rv == APR_SUCCESS) { + if (cur_len == -1) { + rv = send_eos(f); + } + } + else { + log_xlate_error(f, rv); + } + + return rv; +} + +static int xlate_in_filter(ap_filter_t *f, apr_bucket_brigade *bb, + ap_input_mode_t mode, apr_read_type_e block, + apr_off_t readbytes) +{ + apr_status_t rv; + charset_req_t *reqinfo = ap_get_module_config(f->r->request_config, + &charset_lite_module); + charset_dir_t *dc = ap_get_module_config(f->r->per_dir_config, + &charset_lite_module); + charset_filter_ctx_t *ctx = f->ctx; + apr_size_t buffer_size; + int hit_eos; + + if (!ctx) { + /* this is SetInputFilter path; grab the preallocated context, + * if any; note that if we decided not to do anything in an earlier + * handler, we won't even have a reqinfo + */ + if (reqinfo) { + ctx = f->ctx = reqinfo->input_ctx; + reqinfo->input_ctx = NULL; /* prevent SNAFU if user coded us twice + * in the filter chain; we can't have two + * instances using the same context + */ + } + if (!ctx) { /* no idea how to translate; don't do anything */ + ctx = f->ctx = apr_pcalloc(f->r->pool, sizeof(charset_filter_ctx_t)); + ctx->dc = dc; + ctx->noop = 1; + } + } + + if (dc->debug >= DBGLVL_GORY) { + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, f->r, + "xlate_in_filter() - " + "charset_source: %s charset_default: %s", + dc && dc->charset_source ? dc->charset_source : "(none)", + dc && dc->charset_default ? dc->charset_default : "(none)"); + } + + if (!ctx->ran) { /* filter never ran before */ + chk_filter_chain(f); + ctx->ran = 1; + } + + if (ctx->noop) { + return ap_get_brigade(f->next, bb, mode, block, readbytes); + } + + if (APR_BRIGADE_EMPTY(ctx->bb)) { + if ((rv = ap_get_brigade(f->next, bb, mode, block, + readbytes)) != APR_SUCCESS) { + return rv; + } + } + else { + APR_BRIGADE_PREPEND(bb, ctx->bb); /* first use the leftovers */ + } + + buffer_size = INPUT_XLATE_BUF_SIZE; + rv = xlate_brigade(ctx, bb, ctx->tmp, &buffer_size, &hit_eos); + if (rv == APR_SUCCESS) { + if (!hit_eos) { + /* move anything leftover into our context for next time; + * we don't currently "set aside" since the data came from + * down below, but I suspect that for long-term we need to + * do that + */ + APR_BRIGADE_CONCAT(ctx->bb, bb); + } + if (buffer_size < INPUT_XLATE_BUF_SIZE) { /* do we have output? */ + apr_bucket *e; + + e = apr_bucket_heap_create(ctx->tmp, + INPUT_XLATE_BUF_SIZE - buffer_size, + NULL, f->r->connection->bucket_alloc); + /* make sure we insert at the head, because there may be + * an eos bucket already there, and the eos bucket should + * come after the data + */ + APR_BRIGADE_INSERT_HEAD(bb, e); + } + else { + /* XXX need to get some more data... what if the last brigade + * we got had only the first byte of a multibyte char? we need + * to grab more data from the network instead of returning an + * empty brigade + */ + } + } + else { + log_xlate_error(f, rv); + } + + return rv; +} + +static const command_rec cmds[] = +{ + AP_INIT_TAKE1("CharsetSourceEnc", + add_charset_source, + NULL, + OR_FILEINFO, + "source (html,cgi,ssi) file charset"), + AP_INIT_TAKE1("CharsetDefault", + add_charset_default, + NULL, + OR_FILEINFO, + "name of default charset"), + AP_INIT_ITERATE("CharsetOptions", + add_charset_options, + NULL, + OR_FILEINFO, + "valid options: ImplicitAdd, NoImplicitAdd, DebugLevel=n"), + {NULL} +}; + +static void charset_register_hooks(apr_pool_t *p) +{ + ap_hook_fixups(find_code_page, NULL, NULL, APR_HOOK_MIDDLE); + ap_hook_insert_filter(xlate_insert_filter, NULL, NULL, APR_HOOK_REALLY_LAST); + ap_register_output_filter(XLATEOUT_FILTER_NAME, xlate_out_filter, NULL, + AP_FTYPE_RESOURCE); + ap_register_input_filter(XLATEIN_FILTER_NAME, xlate_in_filter, NULL, + AP_FTYPE_RESOURCE); +} + +module AP_MODULE_DECLARE_DATA charset_lite_module = +{ + STANDARD20_MODULE_STUFF, + create_charset_dir_conf, + merge_charset_dir_conf, + NULL, + NULL, + cmds, + charset_register_hooks +}; + diff --git a/rubbos/app/httpd-2.0.64/modules/experimental/mod_charset_lite.dsp b/rubbos/app/httpd-2.0.64/modules/experimental/mod_charset_lite.dsp new file mode 100644 index 00000000..8a133ff7 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/experimental/mod_charset_lite.dsp @@ -0,0 +1,124 @@ +# Microsoft Developer Studio Project File - Name="mod_charset_lite" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=mod_charset_lite - 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 "mod_charset_lite.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 "mod_charset_lite.mak" CFG="mod_charset_lite - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "mod_charset_lite - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_charset_lite - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "mod_charset_lite - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../../srclib/apr-util/include" /I "../../srclib/apr/include" /I "../../include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_charset_lite_src" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Release/mod_charset_lite.so" /base:@..\..\os\win32\BaseAddr.ref,mod_charset_lite.so /opt:ref + +!ELSEIF "$(CFG)" == "mod_charset_lite - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../../srclib/apr-util/include" /I "../../srclib/apr/include" /I "../../include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_charset_lite_src" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_charset_lite.so" /base:@..\..\os\win32\BaseAddr.ref,mod_charset_lite.so + +!ENDIF + +# Begin Target + +# Name "mod_charset_lite - Win32 Release" +# Name "mod_charset_lite - Win32 Debug" +# Begin Source File + +SOURCE=.\mod_charset_lite.c +# End Source File +# Begin Source File + +SOURCE=..\..\build\win32\win32ver.awk + +!IF "$(CFG)" == "mod_charset_lite - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_charset_lite.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_charset_lite.so "charset_lite_module for Apache" ../../include/ap_release.h > .\mod_charset_lite.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "mod_charset_lite - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_charset_lite.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_charset_lite.so "charset_lite_module for Apache" ../../include/ap_release.h > .\mod_charset_lite.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/modules/experimental/mod_charset_lite.exp b/rubbos/app/httpd-2.0.64/modules/experimental/mod_charset_lite.exp new file mode 100644 index 00000000..3f0bf14b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/experimental/mod_charset_lite.exp @@ -0,0 +1 @@ +charset_lite_module diff --git a/rubbos/app/httpd-2.0.64/modules/experimental/mod_disk_cache.c b/rubbos/app/httpd-2.0.64/modules/experimental/mod_disk_cache.c new file mode 100644 index 00000000..f8c1642f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/experimental/mod_disk_cache.c @@ -0,0 +1,963 @@ +/* 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. + */ + +#include "apr_file_io.h" +#include "apr_strings.h" +#include "mod_cache.h" +#include "ap_provider.h" +#include "util_filter.h" +#include "util_script.h" + +#if APR_HAVE_UNISTD_H +#include /* needed for unlink/link */ +#endif + +/* Our on-disk header format is: + * + * disk_cache_info_t + * entity name (dobj->name) [length is in disk_cache_info_t->name_len] + * r->headers_out (delimited by CRLF) + * CRLF + * r->headers_in (delimited by CRLF) + * CRLF + */ +#define DISK_FORMAT_VERSION 0 +typedef struct { + /* Indicates the format of the header struct stored on-disk. */ + int format; + /* The HTTP status code returned for this response. */ + int status; + /* The size of the entity name that follows. */ + apr_size_t name_len; + /* The number of times we've cached this entity. */ + apr_size_t entity_version; + /* Miscellaneous time values. */ + apr_time_t date; + apr_time_t expire; + apr_time_t request_time; + apr_time_t response_time; +} disk_cache_info_t; + +/* + * disk_cache_object_t + * Pointed to by cache_object_t::vobj + */ +typedef struct disk_cache_object { + const char *root; /* the location of the cache directory */ + char *tempfile; /* temp file tohold the content */ +#if 0 + int dirlevels; /* Number of levels of subdirectories */ + int dirlength; /* Length of subdirectory names */ +#endif + char *datafile; /* name of file where the data will go */ + char *hdrsfile; /* name of file where the hdrs will go */ + char *hashfile; /* Computed hash key for this URI */ + char *name; + apr_file_t *fd; /* data file */ + apr_file_t *hfd; /* headers file */ + apr_file_t *tfd; /* temporary file for data */ + apr_off_t file_size; /* File size of the cached data file */ + disk_cache_info_t disk_info; /* Header information. */ +} disk_cache_object_t; + + +/* + * mod_disk_cache configuration + */ +/* TODO: Make defaults OS specific */ +#define CACHEFILE_LEN 20 /* must be less than HASH_LEN/2 */ +#define DEFAULT_DIRLEVELS 3 +#define DEFAULT_DIRLENGTH 2 +#define DEFAULT_MIN_FILE_SIZE 1 +#define DEFAULT_MAX_FILE_SIZE 1000000 +#define DEFAULT_CACHE_SIZE 1000000 + +typedef struct { + const char* cache_root; + apr_size_t cache_root_len; + off_t space; /* Maximum cache size (in 1024 bytes) */ + apr_time_t maxexpire; /* Maximum time to keep cached files in msecs */ + apr_time_t defaultexpire; /* default time to keep cached file in msecs */ + double lmfactor; /* factor for estimating expires date */ + apr_time_t gcinterval; /* garbage collection interval, in msec */ + int dirlevels; /* Number of levels of subdirectories */ + int dirlength; /* Length of subdirectory names */ + int expirychk; /* true if expiry time is observed for cached files */ + apr_size_t minfs; /* minumum file size for cached files */ + apr_size_t maxfs; /* maximum file size for cached files */ + apr_time_t mintm; /* minimum time margin for caching files */ + /* dgc_time_t gcdt; time of day for daily garbage collection */ + apr_array_header_t *gcclnun; /* gc_retain_t entries for unused files */ + apr_array_header_t *gcclean; /* gc_retain_t entries for all files */ + int maxgcmem; /* maximum memory used by garbage collection */ +} disk_cache_conf; + +module AP_MODULE_DECLARE_DATA disk_cache_module; + +/* Forward declarations */ +static int remove_entity(cache_handle_t *h); +static apr_status_t store_headers(cache_handle_t *h, request_rec *r, cache_info *i); +static apr_status_t store_body(cache_handle_t *h, request_rec *r, apr_bucket_brigade *b); +static apr_status_t recall_headers(cache_handle_t *h, request_rec *r); +static apr_status_t recall_body(cache_handle_t *h, apr_pool_t *p, apr_bucket_brigade *bb); + +/* + * Local static functions + */ +#define CACHE_HEADER_SUFFIX ".header" +#define CACHE_DATA_SUFFIX ".data" +static char *header_file(apr_pool_t *p, disk_cache_conf *conf, + disk_cache_object_t *dobj, const char *name) +{ + if (!dobj->hashfile) { + dobj->hashfile = generate_name(p, conf->dirlevels, conf->dirlength, + name); + } + return apr_pstrcat(p, conf->cache_root, "/", dobj->hashfile, + CACHE_HEADER_SUFFIX, NULL); +} + +static char *data_file(apr_pool_t *p, disk_cache_conf *conf, + disk_cache_object_t *dobj, const char *name) +{ + if (!dobj->hashfile) { + dobj->hashfile = generate_name(p, conf->dirlevels, conf->dirlength, + name); + } + return apr_pstrcat(p, conf->cache_root, "/", dobj->hashfile, + CACHE_DATA_SUFFIX, NULL); +} + +static void mkdir_structure(disk_cache_conf *conf, char *file, apr_pool_t *pool) +{ + apr_status_t rv; + char *p; + + for (p = file + conf->cache_root_len + 1;;) { + p = strchr(p, '/'); + if (!p) + break; + *p = '\0'; + + rv = apr_dir_make(file, + APR_UREAD|APR_UWRITE|APR_UEXECUTE, pool); + if (rv != APR_SUCCESS && !APR_STATUS_IS_EEXIST(rv)) { + /* XXX */ + } + *p = '/'; + ++p; + } +} + +static apr_status_t file_cache_el_final(disk_cache_object_t *dobj, + request_rec *r) +{ + /* move the data over */ + if (dobj->tfd) { + apr_status_t rv; + + apr_file_close(dobj->tfd); + + /* This assumes that the tempfile is on the same file system + * as the cache_root. If not, then we need a file copy/move + * rather than a rename. + */ + rv = apr_file_rename(dobj->tempfile, dobj->datafile, r->pool); + if (rv != APR_SUCCESS) { + /* XXX log */ + } + + dobj->tfd = NULL; + } + + return APR_SUCCESS; +} + +static apr_status_t file_cache_errorcleanup(disk_cache_object_t *dobj, request_rec *r) +{ + /* Remove the header file and the body file. */ + apr_file_remove(dobj->hdrsfile, r->pool); + apr_file_remove(dobj->datafile, r->pool); + + /* If we opened the temporary data file, close and remove it. */ + if (dobj->tfd) { + apr_file_close(dobj->tfd); + apr_file_remove(dobj->tempfile, r->pool); + dobj->tfd = NULL; + } + + return APR_SUCCESS; +} + + +/* These two functions get and put state information into the data + * file for an ap_cache_el, this state information will be read + * and written transparent to clients of this module + */ +static int file_cache_recall_mydata(apr_file_t *fd, cache_info *info, + disk_cache_object_t *dobj, request_rec *r) +{ + apr_status_t rv; + char *urlbuff; + disk_cache_info_t disk_info; + apr_size_t len; + + /* read the data from the cache file */ + len = sizeof(disk_cache_info_t); + rv = apr_file_read_full(fd, &disk_info, len, &len); + if (rv != APR_SUCCESS) { + return rv; + } + + if (disk_info.format != DISK_FORMAT_VERSION) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server, + "cache_disk: URL %s had a on-disk version mismatch", + r->uri); + return APR_EGENERAL; + } + + /* Store it away so we can get it later. */ + dobj->disk_info = disk_info; + + info->date = disk_info.date; + info->expire = disk_info.expire; + info->request_time = disk_info.request_time; + info->response_time = disk_info.response_time; + + /* Note that we could optimize this by conditionally doing the palloc + * depending upon the size. */ + urlbuff = apr_palloc(r->pool, disk_info.name_len + 1); + len = disk_info.name_len; + rv = apr_file_read_full(fd, urlbuff, len, &len); + if (rv != APR_SUCCESS) { + return rv; + } + urlbuff[disk_info.name_len] = '\0'; + + /* check that we have the same URL */ + /* Would strncmp be correct? */ + if (strcmp(urlbuff, dobj->name) != 0) { + return APR_EGENERAL; + } + + return APR_SUCCESS; +} + +/* + * Hook and mod_cache callback functions + */ +#define AP_TEMPFILE "/aptmpXXXXXX" +static int create_entity(cache_handle_t *h, request_rec *r, + const char *key, + apr_off_t len) +{ + disk_cache_conf *conf = ap_get_module_config(r->server->module_config, + &disk_cache_module); + cache_object_t *obj; + disk_cache_object_t *dobj; + + if (conf->cache_root == NULL) { + return DECLINED; + } + + /* If the Content-Length is still unknown, cache anyway */ + if (len != -1 && (len < conf->minfs || len > conf->maxfs)) { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "cache_disk: URL %s failed the size check, " + "or is incomplete", + key); + return DECLINED; + } + + /* Allocate and initialize cache_object_t and disk_cache_object_t */ + h->cache_obj = obj = apr_pcalloc(r->pool, sizeof(*obj)); + obj->vobj = dobj = apr_pcalloc(r->pool, sizeof(*dobj)); + + obj->key = apr_pstrdup(r->pool, key); + /* XXX Bad Temporary Cast - see cache_object_t notes */ + obj->info.len = (apr_size_t) len; + obj->complete = 0; /* Cache object is not complete */ + + dobj->name = obj->key; + dobj->datafile = data_file(r->pool, conf, dobj, key); + dobj->hdrsfile = header_file(r->pool, conf, dobj, key); + dobj->tempfile = apr_pstrcat(r->pool, conf->cache_root, AP_TEMPFILE, NULL); + + return OK; +} + +static int open_entity(cache_handle_t *h, request_rec *r, const char *key) +{ + apr_status_t rc; + static int error_logged = 0; + disk_cache_conf *conf = ap_get_module_config(r->server->module_config, + &disk_cache_module); + apr_finfo_t finfo; + cache_object_t *obj; + cache_info *info; + disk_cache_object_t *dobj; + int flags; + + h->cache_obj = NULL; + + /* Look up entity keyed to 'url' */ + if (conf->cache_root == NULL) { + if (!error_logged) { + error_logged = 1; + ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server, + "disk_cache: Cannot cache files to disk without a CacheRoot specified."); + } + return DECLINED; + } + + /* Create and init the cache object */ + h->cache_obj = obj = apr_pcalloc(r->pool, sizeof(cache_object_t)); + obj->vobj = dobj = apr_pcalloc(r->pool, sizeof(disk_cache_object_t)); + + info = &(obj->info); + obj->key = (char *) key; + dobj->name = (char *) key; + dobj->datafile = data_file(r->pool, conf, dobj, key); + dobj->hdrsfile = header_file(r->pool, conf, dobj, key); + dobj->tempfile = apr_pstrcat(r->pool, conf->cache_root, AP_TEMPFILE, NULL); + + /* Open the data file */ + flags = APR_READ|APR_BINARY; +#ifdef APR_SENDFILE_ENABLED + flags |= APR_SENDFILE_ENABLED; +#endif + rc = apr_file_open(&dobj->fd, dobj->datafile, flags, 0, r->pool); + if (rc != APR_SUCCESS) { + /* XXX: Log message */ + return DECLINED; + } + + /* Open the headers file */ + flags = APR_READ|APR_BINARY|APR_BUFFERED; + rc = apr_file_open(&dobj->hfd, dobj->hdrsfile, flags, 0, r->pool); + if (rc != APR_SUCCESS) { + /* XXX: Log message */ + return DECLINED; + } + + rc = apr_file_info_get(&finfo, APR_FINFO_SIZE, dobj->fd); + if (rc == APR_SUCCESS) { + dobj->file_size = finfo.size; + } + + /* Read the bytes to setup the cache_info fields */ + rc = file_cache_recall_mydata(dobj->hfd, info, dobj, r); + if (rc != APR_SUCCESS) { + /* XXX log message */ + return DECLINED; + } + + /* Initialize the cache_handle callback functions */ + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "disk_cache: Recalled cached URL info header %s", dobj->name); + return OK; +} + +static int remove_entity(cache_handle_t *h) +{ + /* Null out the cache object pointer so next time we start from scratch */ + h->cache_obj = NULL; + return OK; +} + +static int remove_url(const char *key) +{ + /* XXX: Delete file from cache! */ + return OK; +} + +static apr_status_t read_table(cache_handle_t *handle, request_rec *r, + apr_table_t *table, apr_file_t *file) +{ + char w[MAX_STRING_LEN]; + char *l; + int p; + apr_status_t rv; + + while (1) { + + /* ### What about APR_EOF? */ + rv = apr_file_gets(w, MAX_STRING_LEN - 1, file); + if (rv != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Premature end of cache headers."); + return rv; + } + + /* Delete terminal (CR?)LF */ + + p = strlen(w); + /* Indeed, the host's '\n': + '\012' for UNIX; '\015' for MacOS; '\025' for OS/390 + -- whatever the script generates. + */ + if (p > 0 && w[p - 1] == '\n') { + if (p > 1 && w[p - 2] == CR) { + w[p - 2] = '\0'; + } + else { + w[p - 1] = '\0'; + } + } + + /* If we've finished reading the headers, break out of the loop. */ + if (w[0] == '\0') { + break; + } + +#if APR_CHARSET_EBCDIC + /* Chances are that we received an ASCII header text instead of + * the expected EBCDIC header lines. Try to auto-detect: + */ + if (!(l = strchr(w, ':'))) { + int maybeASCII = 0, maybeEBCDIC = 0; + unsigned char *cp, native; + apr_size_t inbytes_left, outbytes_left; + + for (cp = w; *cp != '\0'; ++cp) { + native = apr_xlate_conv_byte(ap_hdrs_from_ascii, *cp); + if (apr_isprint(*cp) && !apr_isprint(native)) + ++maybeEBCDIC; + if (!apr_isprint(*cp) && apr_isprint(native)) + ++maybeASCII; + } + if (maybeASCII > maybeEBCDIC) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server, + "CGI Interface Error: Script headers apparently ASCII: (CGI = %s)", + r->filename); + inbytes_left = outbytes_left = cp - w; + apr_xlate_conv_buffer(ap_hdrs_from_ascii, + w, &inbytes_left, w, &outbytes_left); + } + } +#endif /*APR_CHARSET_EBCDIC*/ + + /* if we see a bogus header don't ignore it. Shout and scream */ + if (!(l = strchr(w, ':'))) { + return APR_EGENERAL; + } + + *l++ = '\0'; + while (*l && apr_isspace(*l)) { + ++l; + } + + apr_table_add(table, w, l); + } + + return APR_SUCCESS; +} + +/* + * Reads headers from a buffer and returns an array of headers. + * Returns NULL on file error + * This routine tries to deal with too long lines and continuation lines. + * @@@: XXX: FIXME: currently the headers are passed thru un-merged. + * Is that okay, or should they be collapsed where possible? + */ +static apr_status_t recall_headers(cache_handle_t *h, request_rec *r) +{ + disk_cache_object_t *dobj = (disk_cache_object_t *) h->cache_obj->vobj; + + /* This case should not happen... */ + if (!dobj->hfd) { + /* XXX log message */ + return APR_NOTFOUND; + } + + h->req_hdrs = apr_table_make(r->pool, 20); + h->resp_hdrs = apr_table_make(r->pool, 20); + h->resp_err_hdrs = apr_table_make(r->pool, 20); + + /* Call routine to read the header lines/status line */ + read_table(h, r, h->resp_hdrs, dobj->hfd); + read_table(h, r, h->req_hdrs, dobj->hfd); + + apr_file_close(dobj->hfd); + + h->status = dobj->disk_info.status; + h->content_type = apr_table_get(h->resp_hdrs, "Content-Type"); + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "disk_cache: Recalled headers for URL %s", dobj->name); + return APR_SUCCESS; +} + +static apr_status_t recall_body(cache_handle_t *h, apr_pool_t *p, apr_bucket_brigade *bb) +{ + apr_bucket *e; + disk_cache_object_t *dobj = (disk_cache_object_t*) h->cache_obj->vobj; + + e = apr_bucket_file_create(dobj->fd, 0, (apr_size_t) dobj->file_size, p, + bb->bucket_alloc); + APR_BRIGADE_INSERT_HEAD(bb, e); + e = apr_bucket_eos_create(bb->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, e); + + return APR_SUCCESS; +} + +static apr_status_t store_table(apr_file_t *fd, apr_table_t *table) +{ + int i; + apr_status_t rv; + struct iovec iov[4]; + apr_size_t amt; + apr_table_entry_t *elts; + + elts = (apr_table_entry_t *) apr_table_elts(table)->elts; + for (i = 0; i < apr_table_elts(table)->nelts; ++i) { + if (elts[i].key != NULL) { + iov[0].iov_base = elts[i].key; + iov[0].iov_len = strlen(elts[i].key); + iov[1].iov_base = ": "; + iov[1].iov_len = sizeof(": ") - 1; + iov[2].iov_base = elts[i].val; + iov[2].iov_len = strlen(elts[i].val); + iov[3].iov_base = CRLF; + iov[3].iov_len = sizeof(CRLF) - 1; + + rv = apr_file_writev(fd, (const struct iovec *) &iov, 4, + &amt); + if (rv != APR_SUCCESS) { + return rv; + } + } + } + iov[0].iov_base = CRLF; + iov[0].iov_len = sizeof(CRLF) - 1; + rv = apr_file_writev(fd, (const struct iovec *) &iov, 1, + &amt); + return rv; +} + +static apr_status_t store_headers(cache_handle_t *h, request_rec *r, cache_info *info) +{ + disk_cache_conf *conf = ap_get_module_config(r->server->module_config, + &disk_cache_module); + apr_status_t rv; + apr_size_t amt; + disk_cache_object_t *dobj = (disk_cache_object_t*) h->cache_obj->vobj; + + if (!dobj->hfd) { + disk_cache_info_t disk_info; + struct iovec iov[2]; + + /* This is flaky... we need to manage the cache_info differently */ + h->cache_obj->info = *info; + + /* Remove old file with the same name. If remove fails, then + * perhaps we need to create the directory tree where we are + * about to write the new headers file. + */ + rv = apr_file_remove(dobj->hdrsfile, r->pool); + if (rv != APR_SUCCESS) { + mkdir_structure(conf, dobj->hdrsfile, r->pool); + } + + rv = apr_file_open(&dobj->hfd, dobj->hdrsfile, + APR_WRITE | APR_CREATE | APR_EXCL, + APR_OS_DEFAULT, r->pool); + if (rv != APR_SUCCESS) { + return rv; + } + dobj->name = h->cache_obj->key; + + disk_info.format = DISK_FORMAT_VERSION; + disk_info.date = info->date; + disk_info.expire = info->expire; + disk_info.entity_version = dobj->disk_info.entity_version++; + disk_info.request_time = info->request_time; + disk_info.response_time = info->response_time; + disk_info.status = info->status; + + disk_info.name_len = strlen(dobj->name); + + iov[0].iov_base = (void*)&disk_info; + iov[0].iov_len = sizeof(disk_cache_info_t); + iov[1].iov_base = dobj->name; + iov[1].iov_len = disk_info.name_len; + + rv = apr_file_writev(dobj->hfd, (const struct iovec *) &iov, 2, &amt); + if (rv != APR_SUCCESS) { + return rv; + } + + if (r->headers_out) { + apr_table_t *headers_out; + + headers_out = ap_cache_cacheable_hdrs_out(r->pool, r->headers_out, + r->server); + + if (!apr_table_get(headers_out, "Content-Type") && + r->content_type) { + apr_table_setn(headers_out, "Content-Type", + ap_make_content_type(r, r->content_type)); + } + + rv = store_table(dobj->hfd, headers_out); + if (rv != APR_SUCCESS) { + return rv; + } + + } + + /* Parse the vary header and dump those fields from the headers_in. */ + /* Make call to the same thing cache_select_url calls to crack Vary. */ + /* @@@ Some day, not today. */ + if (r->headers_in) { + apr_table_t *headers_in; + + headers_in = ap_cache_cacheable_hdrs_out(r->pool, r->headers_in, + r->server); + rv = store_table(dobj->hfd, headers_in); + if (rv != APR_SUCCESS) { + return rv; + } + } + apr_file_close(dobj->hfd); /* flush and close */ + } + else { + /* XXX log message */ + } + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "disk_cache: Stored headers for URL %s", dobj->name); + return APR_SUCCESS; +} + +static apr_status_t store_body(cache_handle_t *h, request_rec *r, + apr_bucket_brigade *bb) +{ + apr_bucket *e; + apr_status_t rv; + disk_cache_object_t *dobj = (disk_cache_object_t *) h->cache_obj->vobj; + disk_cache_conf *conf = ap_get_module_config(r->server->module_config, + &disk_cache_module); + + /* We write to a temp file and then atomically rename the file over + * in file_cache_el_final(). + */ + if (!dobj->tfd) { + rv = apr_file_mktemp(&dobj->tfd, dobj->tempfile, + APR_CREATE | APR_WRITE | APR_BINARY | + APR_BUFFERED | APR_EXCL, r->pool); + if (rv != APR_SUCCESS) { + return rv; + } + dobj->file_size = 0; + } + + for (e = APR_BRIGADE_FIRST(bb); + e != APR_BRIGADE_SENTINEL(bb); + e = APR_BUCKET_NEXT(e)) + { + const char *str; + apr_size_t length, written; + apr_bucket_read(e, &str, &length, APR_BLOCK_READ); + rv = apr_file_write_full(dobj->tfd, str, length, &written); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server, + "cache_disk: Error when writing cache file for URL %s", + h->cache_obj->key); + /* Remove the intermediate cache file and return non-APR_SUCCESS */ + file_cache_errorcleanup(dobj, r); + return APR_EGENERAL; + } + dobj->file_size += written; + if (dobj->file_size > conf->maxfs) { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "cache_disk: URL %s failed the size check (%lu>%lu)", + h->cache_obj->key, (unsigned long)dobj->file_size, + (unsigned long)conf->maxfs); + /* Remove the intermediate cache file and return non-APR_SUCCESS */ + file_cache_errorcleanup(dobj, r); + return APR_EGENERAL; + } + } + + /* Was this the final bucket? If yes, close the temp file and perform + * sanity checks. + */ + if (APR_BUCKET_IS_EOS(APR_BRIGADE_LAST(bb))) { + if (h->cache_obj->info.len <= 0) { + /* If the target value of the content length is unknown + * (h->cache_obj->info.len <= 0), check if connection has been + * aborted by client to avoid caching incomplete request bodies. + * + * This can happen with large responses from slow backends like + * Tomcat via mod_jk. + */ + if (r->connection->aborted) { + ap_log_error(APLOG_MARK, APLOG_INFO, 0, r->server, + "disk_cache: Discarding body for URL %s " + "because connection has been aborted.", + h->cache_obj->key); + /* Remove the intermediate cache file and return non-APR_SUCCESS */ + file_cache_errorcleanup(dobj, r); + return APR_EGENERAL; + } + /* XXX Fixme: file_size isn't constrained by size_t. */ + h->cache_obj->info.len = dobj->file_size; + } + else if (h->cache_obj->info.len != dobj->file_size) { + /* "Content-Length" and actual content disagree in size. Log that. */ + ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server, + "disk_cache: URL %s failed the size check (%lu != %lu)", + h->cache_obj->key, + (unsigned long)h->cache_obj->info.len, + (unsigned long)dobj->file_size); + /* Remove the intermediate cache file and return non-APR_SUCCESS */ + file_cache_errorcleanup(dobj, r); + return APR_EGENERAL; + } + if (dobj->file_size < conf->minfs) { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "cache_disk: URL %s failed the size check (%lu<%lu)", + h->cache_obj->key, (unsigned long)dobj->file_size, (unsigned long)conf->minfs); + /* Remove the intermediate cache file and return non-APR_SUCCESS */ + file_cache_errorcleanup(dobj, r); + return APR_EGENERAL; + } + + /* All checks were fine. Move tempfile to final destination */ + /* Link to the perm file, and close the descriptor */ + file_cache_el_final(dobj, r); + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "disk_cache: Body for URL %s cached.", dobj->name); + } + + return APR_SUCCESS; +} + +static void *create_config(apr_pool_t *p, server_rec *s) +{ + disk_cache_conf *conf = apr_pcalloc(p, sizeof(disk_cache_conf)); + + /* XXX: Set default values */ + conf->dirlevels = DEFAULT_DIRLEVELS; + conf->dirlength = DEFAULT_DIRLENGTH; + conf->space = DEFAULT_CACHE_SIZE; + conf->maxfs = DEFAULT_MAX_FILE_SIZE; + conf->minfs = DEFAULT_MIN_FILE_SIZE; + conf->expirychk = 1; + + conf->cache_root = NULL; + conf->cache_root_len = 0; + + return conf; +} + +/* + * mod_disk_cache configuration directives handlers. + */ +static const char +*set_cache_root(cmd_parms *parms, void *in_struct_ptr, const char *arg) +{ + disk_cache_conf *conf = ap_get_module_config(parms->server->module_config, + &disk_cache_module); + conf->cache_root = arg; + conf->cache_root_len = strlen(arg); + /* TODO: canonicalize cache_root and strip off any trailing slashes */ + + return NULL; +} +static const char +*set_cache_size(cmd_parms *parms, void *in_struct_ptr, const char *arg) +{ + disk_cache_conf *conf = ap_get_module_config(parms->server->module_config, + &disk_cache_module); + conf->space = atoi(arg); + return NULL; +} +static const char +*set_cache_gcint(cmd_parms *parms, void *in_struct_ptr, const char *arg) +{ +/* + disk_cache_conf *conf = ap_get_module_config(parms->server->module_config, + &disk_cache_module); +*/ + /* XXX */ + return NULL; +} +/* + * Consider eliminating the next two directives in favor of + * Ian's prime number hash... + * key = hash_fn( r->uri) + * filename = "/key % prime1 /key %prime2/key %prime3" + */ +static const char +*set_cache_dirlevels(cmd_parms *parms, void *in_struct_ptr, const char *arg) +{ + disk_cache_conf *conf = ap_get_module_config(parms->server->module_config, + &disk_cache_module); + int val = atoi(arg); + if (val < 1) + return "CacheDirLevels value must be an integer greater than 0"; + if (val * conf->dirlength > CACHEFILE_LEN) + return "CacheDirLevels*CacheDirLength value must not be higher than 20"; + conf->dirlevels = val; + return NULL; +} +static const char +*set_cache_dirlength(cmd_parms *parms, void *in_struct_ptr, const char *arg) +{ + disk_cache_conf *conf = ap_get_module_config(parms->server->module_config, + &disk_cache_module); + int val = atoi(arg); + if (val < 1) + return "CacheDirLength value must be an integer greater than 0"; + if (val * conf->dirlevels > CACHEFILE_LEN) + return "CacheDirLevels*CacheDirLength value must not be higher than 20"; + + conf->dirlength = val; + return NULL; +} +static const char +*set_cache_exchk(cmd_parms *parms, void *in_struct_ptr, int flag) +{ + disk_cache_conf *conf = ap_get_module_config(parms->server->module_config, + &disk_cache_module); + conf->expirychk = flag; + + return NULL; +} +static const char +*set_cache_minfs(cmd_parms *parms, void *in_struct_ptr, const char *arg) +{ + disk_cache_conf *conf = ap_get_module_config(parms->server->module_config, + &disk_cache_module); + conf->minfs = atoi(arg); + return NULL; +} +static const char +*set_cache_maxfs(cmd_parms *parms, void *in_struct_ptr, const char *arg) +{ + disk_cache_conf *conf = ap_get_module_config(parms->server->module_config, + &disk_cache_module); + conf->maxfs = atoi(arg); + return NULL; +} +static const char +*set_cache_minetm(cmd_parms *parms, void *in_struct_ptr, const char *arg) +{ + /* XXX + disk_cache_conf *conf = ap_get_module_config(parms->server->module_config, + &disk_cache_module); + */ + return NULL; +} +static const char +*set_cache_gctime(cmd_parms *parms, void *in_struct_ptr, const char *arg) +{ + /* XXX + disk_cache_conf *conf = ap_get_module_config(parms->server->module_config, + &disk_cache_module); + */ + return NULL; +} +static const char +*add_cache_gcclean(cmd_parms *parms, void *in_struct_ptr, const char *arg, const char *arg1) +{ + /* XXX + disk_cache_conf *conf = ap_get_module_config(parms->server->module_config, + &disk_cache_module); + */ + return NULL; +} +static const char +*add_cache_gcclnun(cmd_parms *parms, void *in_struct_ptr, const char *arg, const char *arg1) +{ + /* XXX + disk_cache_conf *conf = ap_get_module_config(parms->server->module_config, + &disk_cache_module); + */ + return NULL; +} +static const char +*set_cache_maxgcmem(cmd_parms *parms, void *in_struct_ptr, const char *arg) +{ + /* XXX + disk_cache_conf *conf = ap_get_module_config(parms->server->module_config, + &disk_cache_module); + */ + return NULL; +} + +static const command_rec disk_cache_cmds[] = +{ + AP_INIT_TAKE1("CacheRoot", set_cache_root, NULL, RSRC_CONF, + "The directory to store cache files"), + AP_INIT_TAKE1("CacheSize", set_cache_size, NULL, RSRC_CONF, + "The maximum disk space used by the cache in KB"), + AP_INIT_TAKE1("CacheGcInterval", set_cache_gcint, NULL, RSRC_CONF, + "The interval between garbage collections, in hours"), + AP_INIT_TAKE1("CacheDirLevels", set_cache_dirlevels, NULL, RSRC_CONF, + "The number of levels of subdirectories in the cache"), + AP_INIT_TAKE1("CacheDirLength", set_cache_dirlength, NULL, RSRC_CONF, + "The number of characters in subdirectory names"), + AP_INIT_FLAG("CacheExpiryCheck", set_cache_exchk, NULL, RSRC_CONF, + "on if cache observes Expires date when seeking files"), + AP_INIT_TAKE1("CacheMinFileSize", set_cache_minfs, NULL, RSRC_CONF, + "The minimum file size to cache a document"), + AP_INIT_TAKE1("CacheMaxFileSize", set_cache_maxfs, NULL, RSRC_CONF, + "The maximum file size to cache a document"), + AP_INIT_TAKE1("CacheTimeMargin", set_cache_minetm, NULL, RSRC_CONF, + "The minimum time margin to cache a document"), + AP_INIT_TAKE1("CacheGcDaily", set_cache_gctime, NULL, RSRC_CONF, + "The time of day for garbage collection (24 hour clock)"), + AP_INIT_TAKE2("CacheGcUnused", add_cache_gcclnun, NULL, RSRC_CONF, + "The time in hours to retain unused file that match a url"), + AP_INIT_TAKE2("CacheGcClean", add_cache_gcclean, NULL, RSRC_CONF, + "The time in hours to retain unchanged files that match a url"), + AP_INIT_TAKE1("CacheGcMemUsage", set_cache_maxgcmem, NULL, RSRC_CONF, + "The maximum kilobytes of memory used for garbage collection"), + {NULL} +}; + +static const cache_provider cache_disk_provider = +{ + &remove_entity, + &store_headers, + &store_body, + &recall_headers, + &recall_body, + &create_entity, + &open_entity, + &remove_url, +}; + +static void disk_cache_register_hook(apr_pool_t *p) +{ + /* cache initializer */ + ap_register_provider(p, CACHE_PROVIDER_GROUP, "disk", "0", + &cache_disk_provider); +} + +module AP_MODULE_DECLARE_DATA disk_cache_module = { + STANDARD20_MODULE_STUFF, + NULL, /* create per-directory config structure */ + NULL, /* merge per-directory config structures */ + create_config, /* create per-server config structure */ + NULL, /* merge per-server config structures */ + disk_cache_cmds, /* command apr_table_t */ + disk_cache_register_hook /* register hooks */ +}; diff --git a/rubbos/app/httpd-2.0.64/modules/experimental/mod_disk_cache.dsp b/rubbos/app/httpd-2.0.64/modules/experimental/mod_disk_cache.dsp new file mode 100644 index 00000000..9e7bf622 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/experimental/mod_disk_cache.dsp @@ -0,0 +1,128 @@ +# Microsoft Developer Studio Project File - Name="mod_disk_cache" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=mod_disk_cache - 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 "mod_disk_cache.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 "mod_disk_cache.mak" CFG="mod_disk_cache - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "mod_disk_cache - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_disk_cache - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "mod_disk_cache - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../../srclib/apr-util/include" /I "../../srclib/apr/include" /I "../../include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /Fd"Release\mod_disk_cache_src" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Release/mod_disk_cache.so" /base:@..\..\os\win32\BaseAddr.ref,mod_disk_cache.so /opt:ref + +!ELSEIF "$(CFG)" == "mod_disk_cache - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../../srclib/apr-util/include" /I "../../srclib/apr/include" /I "../../include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /Fd"Debug\mod_disk_cache_src" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_disk_cache.so" /base:@..\..\os\win32\BaseAddr.ref,mod_disk_cache.so + +!ENDIF + +# Begin Target + +# Name "mod_disk_cache - Win32 Release" +# Name "mod_disk_cache - Win32 Debug" +# Begin Source File + +SOURCE=.\mod_cache.h +# End Source File +# Begin Source File + +SOURCE=.\mod_disk_cache.c +# End Source File +# Begin Source File + +SOURCE=..\..\build\win32\win32ver.awk + +!IF "$(CFG)" == "mod_disk_cache - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_disk_cache.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_disk_cache.so "disk_cache_module for Apache" ../../include/ap_release.h > .\mod_disk_cache.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "mod_disk_cache - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_disk_cache.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_disk_cache.so "disk_cache_module for Apache" ../../include/ap_release.h > .\mod_disk_cache.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/modules/experimental/mod_dumpio.c b/rubbos/app/httpd-2.0.64/modules/experimental/mod_dumpio.c new file mode 100644 index 00000000..06ac65f5 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/experimental/mod_dumpio.c @@ -0,0 +1,215 @@ +/* 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. + */ + +/* + * Originally written @ Covalent by Jim Jagielski + */ + +/* + * mod_dumpio.c: + * Think of this as a filter sniffer for Apache 2.x. It logs + * all filter data right before and after it goes out on the + * wire (BUT right before SSL encoded or after SSL decoded). + * It can produce a *huge* amount of data. + */ + + +#include "httpd.h" +#include "http_connection.h" +#include "http_config.h" +#include "http_core.h" +#include "http_log.h" + +module AP_MODULE_DECLARE_DATA dumpio_module ; + +typedef struct dumpio_conf_t { + int enable_input; + int enable_output; +} dumpio_conf_t; + +/* + * Workhorse function: simply log to the current error_log + * info about the data in the bucket as well as the data itself + */ +static void dumpit(ap_filter_t *f, apr_bucket *b) +{ + conn_rec *c = f->c; + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, c->base_server, + "mod_dumpio: %s (%s-%s): %" APR_SIZE_T_FMT " bytes", + f->frec->name, + (APR_BUCKET_IS_METADATA(b)) ? "metadata" : "data", + b->type->name, + b->length) ; + + if (!(APR_BUCKET_IS_METADATA(b))) { + const char *buf; + apr_size_t nbytes; + char *obuf; + if (apr_bucket_read(b, &buf, &nbytes, APR_BLOCK_READ) == APR_SUCCESS) { + if (nbytes) { + obuf = malloc(nbytes+1); /* use pool? */ + memcpy(obuf, buf, nbytes); + obuf[nbytes] = '\0'; + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, c->base_server, + "mod_dumpio: %s (%s-%s): %s", + f->frec->name, + (APR_BUCKET_IS_METADATA(b)) ? "metadata" : "data", + b->type->name, + obuf); + free(obuf); + } + } else { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, c->base_server, + "mod_dumpio: %s (%s-%s): %s", + f->frec->name, + (APR_BUCKET_IS_METADATA(b)) ? "metadata" : "data", + b->type->name, + "error reading data"); + } + } +} + +#define whichmode( mode ) \ + ( (( mode ) == AP_MODE_READBYTES) ? "readbytes" : \ + (( mode ) == AP_MODE_GETLINE) ? "getline" : \ + (( mode ) == AP_MODE_EATCRLF) ? "eatcrlf" : \ + (( mode ) == AP_MODE_SPECULATIVE) ? "speculative" : \ + (( mode ) == AP_MODE_EXHAUSTIVE) ? "exhaustive" : \ + (( mode ) == AP_MODE_INIT) ? "init" : "unknown" \ + ) + +static int dumpio_input_filter (ap_filter_t *f, apr_bucket_brigade *bb, + ap_input_mode_t mode, apr_read_type_e block, apr_off_t readbytes) +{ + + apr_bucket *b; + apr_status_t ret; + conn_rec *c = f->c; + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, c->base_server, + "mod_dumpio: %s [%s-%s] %" APR_OFF_T_FMT " readbytes", + f->frec->name, + whichmode(mode), + ((block) == APR_BLOCK_READ) ? "blocking" : "nonblocking", + readbytes) ; + + ret = ap_get_brigade(f->next, bb, mode, block, readbytes); + + if (ret == APR_SUCCESS) { + for (b = APR_BRIGADE_FIRST(bb); b != APR_BRIGADE_SENTINEL(bb); b = APR_BUCKET_NEXT(b)) { + dumpit(f, b); + } + } else { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, c->base_server, + "mod_dumpio: %s - %d", f->frec->name, ret) ; + } + + return APR_SUCCESS ; +} + +static int dumpio_output_filter (ap_filter_t *f, apr_bucket_brigade *bb) +{ + apr_bucket *b; + conn_rec *c = f->c; + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, c->base_server, "mod_dumpio: %s", f->frec->name) ; + + for (b = APR_BRIGADE_FIRST(bb); b != APR_BRIGADE_SENTINEL(bb); b = APR_BUCKET_NEXT(b)) { + /* + * If we ever see an EOS, make sure to FLUSH. + */ + if (APR_BUCKET_IS_EOS(b)) { + apr_bucket *flush = apr_bucket_flush_create(f->c->bucket_alloc); + APR_BUCKET_INSERT_BEFORE(b, flush); + } + dumpit(f, b); + } + + return ap_pass_brigade(f->next, bb) ; +} + +static int dumpio_pre_conn(conn_rec *c, void *csd) +{ + dumpio_conf_t *ptr = + (dumpio_conf_t *) ap_get_module_config(c->base_server->module_config, + &dumpio_module); + + if (ptr->enable_input) + ap_add_input_filter("DUMPIO_IN", NULL, NULL, c); + if (ptr->enable_output) + ap_add_output_filter("DUMPIO_OUT", NULL, NULL, c); + return OK; +} + +static void dumpio_register_hooks(apr_pool_t *p) +{ +/* + * We know that SSL is CONNECTION + 5 + */ + ap_register_output_filter("DUMPIO_OUT", dumpio_output_filter, + NULL, AP_FTYPE_CONNECTION + 3) ; + + ap_register_input_filter("DUMPIO_IN", dumpio_input_filter, + NULL, AP_FTYPE_CONNECTION + 3) ; + + ap_hook_pre_connection(dumpio_pre_conn, NULL, NULL, APR_HOOK_MIDDLE); +} + +static void *dumpio_create_sconfig(apr_pool_t *p, server_rec *s) +{ + dumpio_conf_t *ptr = apr_pcalloc(p, sizeof *ptr); + ptr->enable_input = ptr->enable_output = 0; + return ptr; +} + +static const char *dumpio_enable_input(cmd_parms *cmd, void *dummy, int arg) +{ + dumpio_conf_t *ptr = + (dumpio_conf_t *) ap_get_module_config(cmd->server->module_config, + &dumpio_module); + + ptr->enable_input = arg; + return NULL; +} + +static const char *dumpio_enable_output(cmd_parms *cmd, void *dummy, int arg) +{ + dumpio_conf_t *ptr = + (dumpio_conf_t *) ap_get_module_config(cmd->server->module_config, + &dumpio_module); + + ptr->enable_output = arg; + return NULL; +} + +static const command_rec dumpio_cmds[] = { + AP_INIT_FLAG("DumpIOInput", dumpio_enable_input, NULL, + RSRC_CONF, "Enable I/O Dump on Input Data"), + AP_INIT_FLAG("DumpIOOutput", dumpio_enable_output, NULL, + RSRC_CONF, "Enable I/O Dump on Output Data"), + { NULL } +}; + +module AP_MODULE_DECLARE_DATA dumpio_module = { + STANDARD20_MODULE_STUFF, + NULL, + NULL, + dumpio_create_sconfig, + NULL, + dumpio_cmds, + dumpio_register_hooks +}; diff --git a/rubbos/app/httpd-2.0.64/modules/experimental/mod_dumpio.dsp b/rubbos/app/httpd-2.0.64/modules/experimental/mod_dumpio.dsp new file mode 100644 index 00000000..1126ddc9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/experimental/mod_dumpio.dsp @@ -0,0 +1,128 @@ +# Microsoft Developer Studio Project File - Name="mod_dumpio" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=mod_dumpio - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "mod_dumpio.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 "mod_dumpio.mak" CFG="mod_dumpio - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "mod_dumpio - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_dumpio - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "mod_dumpio - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_dumpio_src" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /out:"Release/mod_dumpio.so" /base:@..\..\os\win32\BaseAddr.ref,mod_dumpio.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Release/mod_dumpio.so" /base:@..\..\os\win32\BaseAddr.ref,mod_dumpio.so /opt:ref + +!ELSEIF "$(CFG)" == "mod_dumpio - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_dumpio_src" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_dumpio.so" /base:@..\..\os\win32\BaseAddr.ref,mod_dumpio.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_dumpio.so" /base:@..\..\os\win32\BaseAddr.ref,mod_dumpio.so + +!ENDIF + +# Begin Target + +# Name "mod_dumpio - Win32 Release" +# Name "mod_dumpio - Win32 Debug" +# Begin Source File + +SOURCE=.\mod_dumpio.c +# End Source File +# Begin Source File + +SOURCE=.\mod_dumpio.rc +# End Source File +# Begin Source File + +SOURCE=..\..\build\win32\win32ver.awk + +!IF "$(CFG)" == "mod_dumpio - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_dumpio.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_dumpio.so "dumpio_module for Apache" ../../include/ap_release.h > .\mod_dumpio.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "mod_dumpio - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_dumpio.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_dumpio.so "dumpio_module for Apache" ../../include/ap_release.h > .\mod_dumpio.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/modules/experimental/mod_example.c b/rubbos/app/httpd-2.0.64/modules/experimental/mod_example.c new file mode 100644 index 00000000..5fae6a20 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/experimental/mod_example.c @@ -0,0 +1,1313 @@ +/* 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. + */ + +/* + * Apache example module. Provide demonstrations of how modules do things. + * It is not meant to be used in a production server. Since it participates + * in all of the processing phases, it could conceivable interfere with + * the proper operation of other modules -- particularly the ones related + * to security. + * + * In the interest of brevity, all functions and structures internal to + * this module, but which may have counterparts in *real* modules, are + * prefixed with 'x_' instead of 'example_'. + */ + +#include "httpd.h" +#include "http_config.h" +#include "http_core.h" +#include "http_log.h" +#include "http_main.h" +#include "http_protocol.h" +#include "http_request.h" +#include "util_script.h" +#include "http_connection.h" + +#include "apr_strings.h" + +#include + +/*--------------------------------------------------------------------------*/ +/* */ +/* Data declarations. */ +/* */ +/* Here are the static cells and structure declarations private to our */ +/* module. */ +/* */ +/*--------------------------------------------------------------------------*/ + +/* + * Sample configuration record. Used for both per-directory and per-server + * configuration data. + * + * It's perfectly reasonable to have two different structures for the two + * different environments. The same command handlers will be called for + * both, though, so the handlers need to be able to tell them apart. One + * possibility is for both structures to start with an int which is 0 for + * one and 1 for the other. + * + * Note that while the per-directory and per-server configuration records are + * available to most of the module handlers, they should be treated as + * READ-ONLY by all except the command and merge handlers. Sometimes handlers + * are handed a record that applies to the current location by implication or + * inheritance, and modifying it will change the rules for other locations. + */ +typedef struct x_cfg { + int cmode; /* Environment to which record applies + * (directory, server, or combination). + */ +#define CONFIG_MODE_SERVER 1 +#define CONFIG_MODE_DIRECTORY 2 +#define CONFIG_MODE_COMBO 3 /* Shouldn't ever happen. */ + int local; /* Boolean: "Example" directive declared + * here? + */ + int congenital; /* Boolean: did we inherit an "Example"? */ + char *trace; /* Pointer to trace string. */ + char *loc; /* Location to which this record applies. */ +} x_cfg; + +/* + * Let's set up a module-local static cell to point to the accreting callback + * trace. As each API callback is made to us, we'll tack on the particulars + * to whatever we've already recorded. To avoid massive memory bloat as + * directories are walked again and again, we record the routine/environment + * the first time (non-request context only), and ignore subsequent calls for + * the same routine/environment. + */ +static const char *trace = NULL; +static apr_table_t *static_calls_made = NULL; + +/* + * To avoid leaking memory from pools other than the per-request one, we + * allocate a module-private pool, and then use a sub-pool of that which gets + * freed each time we modify the trace. That way previous layers of trace + * data don't get lost. + */ +static apr_pool_t *x_pool = NULL; +static apr_pool_t *x_subpool = NULL; + +/* + * Declare ourselves so the configuration routines can find and know us. + * We'll fill it in at the end of the module. + */ +module AP_MODULE_DECLARE_DATA example_module; + +/*--------------------------------------------------------------------------*/ +/* */ +/* The following pseudo-prototype declarations illustrate the parameters */ +/* passed to command handlers for the different types of directive */ +/* syntax. If an argument was specified in the directive definition */ +/* (look for "command_rec" below), it's available to the command handler */ +/* via the (void *) info field in the cmd_parms argument passed to the */ +/* handler (cmd->info for the examples below). */ +/* */ +/*--------------------------------------------------------------------------*/ + +/* + * Command handler for a NO_ARGS directive. Declared in the command_rec + * list with + * AP_INIT_NO_ARGS("directive", function, mconfig, where, help) + * + * static const char *handle_NO_ARGS(cmd_parms *cmd, void *mconfig); + */ + +/* + * Command handler for a RAW_ARGS directive. The "args" argument is the text + * of the commandline following the directive itself. Declared in the + * command_rec list with + * AP_INIT_RAW_ARGS("directive", function, mconfig, where, help) + * + * static const char *handle_RAW_ARGS(cmd_parms *cmd, void *mconfig, + * const char *args); + */ + +/* + * Command handler for a FLAG directive. The single parameter is passed in + * "bool", which is either zero or not for Off or On respectively. + * Declared in the command_rec list with + * AP_INIT_FLAG("directive", function, mconfig, where, help) + * + * static const char *handle_FLAG(cmd_parms *cmd, void *mconfig, int bool); + */ + +/* + * Command handler for a TAKE1 directive. The single parameter is passed in + * "word1". Declared in the command_rec list with + * AP_INIT_TAKE1("directive", function, mconfig, where, help) + * + * static const char *handle_TAKE1(cmd_parms *cmd, void *mconfig, + * char *word1); + */ + +/* + * Command handler for a TAKE2 directive. TAKE2 commands must always have + * exactly two arguments. Declared in the command_rec list with + * AP_INIT_TAKE2("directive", function, mconfig, where, help) + * + * static const char *handle_TAKE2(cmd_parms *cmd, void *mconfig, + * char *word1, char *word2); + */ + +/* + * Command handler for a TAKE3 directive. Like TAKE2, these must have exactly + * three arguments, or the parser complains and doesn't bother calling us. + * Declared in the command_rec list with + * AP_INIT_TAKE3("directive", function, mconfig, where, help) + * + * static const char *handle_TAKE3(cmd_parms *cmd, void *mconfig, + * char *word1, char *word2, char *word3); + */ + +/* + * Command handler for a TAKE12 directive. These can take either one or two + * arguments. + * - word2 is a NULL pointer if no second argument was specified. + * Declared in the command_rec list with + * AP_INIT_TAKE12("directive", function, mconfig, where, help) + * + * static const char *handle_TAKE12(cmd_parms *cmd, void *mconfig, + * char *word1, char *word2); + */ + +/* + * Command handler for a TAKE123 directive. A TAKE123 directive can be given, + * as might be expected, one, two, or three arguments. + * - word2 is a NULL pointer if no second argument was specified. + * - word3 is a NULL pointer if no third argument was specified. + * Declared in the command_rec list with + * AP_INIT_TAKE123("directive", function, mconfig, where, help) + * + * static const char *handle_TAKE123(cmd_parms *cmd, void *mconfig, + * char *word1, char *word2, char *word3); + */ + +/* + * Command handler for a TAKE13 directive. Either one or three arguments are + * permitted - no two-parameters-only syntax is allowed. + * - word2 and word3 are NULL pointers if only one argument was specified. + * Declared in the command_rec list with + * AP_INIT_TAKE13("directive", function, mconfig, where, help) + * + * static const char *handle_TAKE13(cmd_parms *cmd, void *mconfig, + * char *word1, char *word2, char *word3); + */ + +/* + * Command handler for a TAKE23 directive. At least two and as many as three + * arguments must be specified. + * - word3 is a NULL pointer if no third argument was specified. + * Declared in the command_rec list with + * AP_INIT_TAKE23("directive", function, mconfig, where, help) + * + * static const char *handle_TAKE23(cmd_parms *cmd, void *mconfig, + * char *word1, char *word2, char *word3); + */ + +/* + * Command handler for a ITERATE directive. + * - Handler is called once for each of n arguments given to the directive. + * - word1 points to each argument in turn. + * Declared in the command_rec list with + * AP_INIT_ITERATE("directive", function, mconfig, where, help) + * + * static const char *handle_ITERATE(cmd_parms *cmd, void *mconfig, + * char *word1); + */ + +/* + * Command handler for a ITERATE2 directive. + * - Handler is called once for each of the second and subsequent arguments + * given to the directive. + * - word1 is the same for each call for a particular directive instance (the + * first argument). + * - word2 points to each of the second and subsequent arguments in turn. + * Declared in the command_rec list with + * AP_INIT_ITERATE2("directive", function, mconfig, where, help) + * + * static const char *handle_ITERATE2(cmd_parms *cmd, void *mconfig, + * char *word1, char *word2); + */ + +/*--------------------------------------------------------------------------*/ +/* */ +/* These routines are strictly internal to this module, and support its */ +/* operation. They are not referenced by any external portion of the */ +/* server. */ +/* */ +/*--------------------------------------------------------------------------*/ + +/* + * Locate our directory configuration record for the current request. + */ +static x_cfg *our_dconfig(const request_rec *r) +{ + return (x_cfg *) ap_get_module_config(r->per_dir_config, &example_module); +} + +#if 0 +/* + * Locate our server configuration record for the specified server. + */ +static x_cfg *our_sconfig(const server_rec *s) +{ + return (x_cfg *) ap_get_module_config(s->module_config, &example_module); +} + +/* + * Likewise for our configuration record for the specified request. + */ +static x_cfg *our_rconfig(const request_rec *r) +{ + return (x_cfg *) ap_get_module_config(r->request_config, &example_module); +} +#endif + +/* + * Likewise for our configuration record for a connection. + */ +static x_cfg *our_cconfig(const conn_rec *c) +{ + return (x_cfg *) ap_get_module_config(c->conn_config, &example_module); +} + +/* + * This routine sets up some module-wide cells if they haven't been already. + */ +static void setup_module_cells(void) +{ + /* + * If we haven't already allocated our module-private pool, do so now. + */ + if (x_pool == NULL) { + apr_pool_create(&x_pool, NULL); + }; + /* + * Likewise for the table of routine/environment pairs we visit outside of + * request context. + */ + if (static_calls_made == NULL) { + static_calls_made = apr_table_make(x_pool, 16); + }; +} + +/* + * This routine is used to add a trace of a callback to the list. We're + * passed the server record (if available), the request record (if available), + * a pointer to our private configuration record (if available) for the + * environment to which the callback is supposed to apply, and some text. We + * turn this into a textual representation and add it to the tail of the list. + * The list can be displayed by the x_handler() routine. + * + * If the call occurs within a request context (i.e., we're passed a request + * record), we put the trace into the request apr_pool_t and attach it to the + * request via the notes mechanism. Otherwise, the trace gets added + * to the static (non-request-specific) list. + * + * Note that the r->notes table is only for storing strings; if you need to + * maintain per-request data of any other type, you need to use another + * mechanism. + */ + +#define TRACE_NOTE "example-trace" + +static void trace_add(server_rec *s, request_rec *r, x_cfg *mconfig, + const char *note) +{ + const char *sofar; + char *addon; + char *where; + apr_pool_t *p; + const char *trace_copy; + + /* + * Make sure our pools and tables are set up - we need 'em. + */ + setup_module_cells(); + /* + * Now, if we're in request-context, we use the request pool. + */ + if (r != NULL) { + p = r->pool; + if ((trace_copy = apr_table_get(r->notes, TRACE_NOTE)) == NULL) { + trace_copy = ""; + } + } + else { + /* + * We're not in request context, so the trace gets attached to our + * module-wide pool. We do the create/destroy every time we're called + * in non-request context; this avoids leaking memory in some of + * the subsequent calls that allocate memory only once (such as the + * key formation below). + * + * Make a new sub-pool and copy any existing trace to it. Point the + * trace cell at the copied value. + */ + apr_pool_create(&p, x_pool); + if (trace != NULL) { + trace = apr_pstrdup(p, trace); + } + /* + * Now, if we have a sub-pool from before, nuke it and replace with + * the one we just allocated. + */ + if (x_subpool != NULL) { + apr_pool_destroy(x_subpool); + } + x_subpool = p; + trace_copy = trace; + } + /* + * If we weren't passed a configuration record, we can't figure out to + * what location this call applies. This only happens for co-routines + * that don't operate in a particular directory or server context. If we + * got a valid record, extract the location (directory or server) to which + * it applies. + */ + where = (mconfig != NULL) ? mconfig->loc : "nowhere"; + where = (where != NULL) ? where : ""; + /* + * Now, if we're not in request context, see if we've been called with + * this particular combination before. The apr_table_t is allocated in the + * module's private pool, which doesn't get destroyed. + */ + if (r == NULL) { + char *key; + + key = apr_pstrcat(p, note, ":", where, NULL); + if (apr_table_get(static_calls_made, key) != NULL) { + /* + * Been here, done this. + */ + return; + } + else { + /* + * First time for this combination of routine and environment - + * log it so we don't do it again. + */ + apr_table_set(static_calls_made, key, "been here"); + } + } + addon = apr_pstrcat(p, + "
  • \n" + "
    \n" + "
    ", note, "
    \n" + "
    [", where, "]
    \n" + "
    \n" + "
  • \n", + NULL); + sofar = (trace_copy == NULL) ? "" : trace_copy; + trace_copy = apr_pstrcat(p, sofar, addon, NULL); + if (r != NULL) { + apr_table_set(r->notes, TRACE_NOTE, trace_copy); + } + else { + trace = trace_copy; + } + /* + * You *could* change the following if you wanted to see the calling + * sequence reported in the server's error_log, but beware - almost all of + * these co-routines are called for every single request, and the impact + * on the size (and readability) of the error_log is considerable. + */ +#define EXAMPLE_LOG_EACH 0 + if (EXAMPLE_LOG_EACH && (s != NULL)) { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, "mod_example: %s", note); + } +} + +/*--------------------------------------------------------------------------*/ +/* We prototyped the various syntax for command handlers (routines that */ +/* are called when the configuration parser detects a directive declared */ +/* by our module) earlier. Now we actually declare a "real" routine that */ +/* will be invoked by the parser when our "real" directive is */ +/* encountered. */ +/* */ +/* If a command handler encounters a problem processing the directive, it */ +/* signals this fact by returning a non-NULL pointer to a string */ +/* describing the problem. */ +/* */ +/* The magic return value DECLINE_CMD is used to deal with directives */ +/* that might be declared by multiple modules. If the command handler */ +/* returns NULL, the directive was processed; if it returns DECLINE_CMD, */ +/* the next module (if any) that declares the directive is given a chance */ +/* at it. If it returns any other value, it's treated as the text of an */ +/* error message. */ +/*--------------------------------------------------------------------------*/ +/* + * Command handler for the NO_ARGS "Example" directive. All we do is mark the + * call in the trace log, and flag the applicability of the directive to the + * current location in that location's configuration record. + */ +static const char *cmd_example(cmd_parms *cmd, void *mconfig) +{ + x_cfg *cfg = (x_cfg *) mconfig; + + /* + * "Example Wuz Here" + */ + cfg->local = 1; + trace_add(cmd->server, NULL, cfg, "cmd_example()"); + return NULL; +} + +/*--------------------------------------------------------------------------*/ +/* */ +/* Now we declare our content handlers, which are invoked when the server */ +/* encounters a document which our module is supposed to have a chance to */ +/* see. (See mod_mime's SetHandler and AddHandler directives, and the */ +/* mod_info and mod_status examples, for more details.) */ +/* */ +/* Since content handlers are dumping data directly into the connection */ +/* (using the r*() routines, such as rputs() and rprintf()) without */ +/* intervention by other parts of the server, they need to make */ +/* sure any accumulated HTTP headers are sent first. This is done by */ +/* calling send_http_header(). Otherwise, no header will be sent at all, */ +/* and the output sent to the client will actually be HTTP-uncompliant. */ +/*--------------------------------------------------------------------------*/ +/* + * Sample content handler. All this does is display the call list that has + * been built up so far. + * + * The return value instructs the caller concerning what happened and what to + * do next: + * OK ("we did our thing") + * DECLINED ("this isn't something with which we want to get involved") + * HTTP_mumble ("an error status should be reported") + */ +static int x_handler(request_rec *r) +{ + x_cfg *dcfg; + + if (strcmp(r->handler, "example-handler")) { + return DECLINED; + } + + dcfg = our_dconfig(r); + trace_add(r->server, r, dcfg, "x_handler()"); + /* + * We're about to start sending content, so we need to force the HTTP + * headers to be sent at this point. Otherwise, no headers will be sent + * at all. We can set any we like first, of course. **NOTE** Here's + * where you set the "Content-type" header, and you do so by putting it in + * r->content_type, *not* r->headers_out("Content-type"). If you don't + * set it, it will be filled in with the server's default type (typically + * "text/plain"). You *must* also ensure that r->content_type is lower + * case. + * + * We also need to start a timer so the server can know if the connexion + * is broken. + */ + ap_set_content_type(r, "text/html"); + /* + * If we're only supposed to send header information (HEAD request), we're + * already there. + */ + if (r->header_only) { + return OK; + } + + /* + * Now send our actual output. Since we tagged this as being + * "text/html", we need to embed any HTML. + */ + ap_rputs(DOCTYPE_HTML_3_2, r); + ap_rputs("\n", r); + ap_rputs(" \n", r); + ap_rputs(" mod_example Module Content-Handler Output\n", r); + ap_rputs(" \n", r); + ap_rputs(" \n", r); + ap_rputs(" \n", r); + ap_rputs("

    mod_example Module Content-Handler Output\n", r); + ap_rputs("

    \n", r); + ap_rputs("

    \n", r); + ap_rprintf(r, " Apache HTTP Server version: \"%s\"\n", + ap_get_server_version()); + ap_rputs("
    \n", r); + ap_rprintf(r, " Server built: \"%s\"\n", ap_get_server_built()); + ap_rputs("

    \n", r);; + ap_rputs("

    \n", r); + ap_rputs(" The format for the callback trace is:\n", r); + ap_rputs("

    \n", r); + ap_rputs("
    \n", r); + ap_rputs("
    n.<routine-name>", r); + ap_rputs("(<routine-data>)\n", r); + ap_rputs("
    \n", r); + ap_rputs("
    [<applies-to>]\n", r); + ap_rputs("
    \n", r); + ap_rputs("
    \n", r); + ap_rputs("

    \n", r); + ap_rputs(" The <routine-data> is supplied by\n", r); + ap_rputs(" the routine when it requests the trace,\n", r); + ap_rputs(" and the <applies-to> is extracted\n", r); + ap_rputs(" from the configuration record at the time of the trace.\n", r); + ap_rputs(" SVR() indicates a server environment\n", r); + ap_rputs(" (blank means the main or default server, otherwise it's\n", r); + ap_rputs(" the name of the VirtualHost); DIR()\n", r); + ap_rputs(" indicates a location in the URL or filesystem\n", r); + ap_rputs(" namespace.\n", r); + ap_rputs("

    \n", r); + ap_rprintf(r, "

    Static callbacks so far:

    \n
      \n%s
    \n", + trace); + ap_rputs("

    Request-specific callbacks so far:

    \n", r); + ap_rprintf(r, "
      \n%s
    \n", apr_table_get(r->notes, TRACE_NOTE)); + ap_rputs("

    Environment for this call:

    \n", r); + ap_rputs("
      \n", r); + ap_rprintf(r, "
    • Applies-to: %s\n
    • \n", dcfg->loc); + ap_rprintf(r, "
    • \"Example\" directive declared here: %s\n
    • \n", + (dcfg->local ? "YES" : "NO")); + ap_rprintf(r, "
    • \"Example\" inherited: %s\n
    • \n", + (dcfg->congenital ? "YES" : "NO")); + ap_rputs("
    \n", r); + ap_rputs(" \n", r); + ap_rputs("\n", r); + /* + * We're all done, so cancel the timeout we set. Since this is probably + * the end of the request we *could* assume this would be done during + * post-processing - but it's possible that another handler might be + * called and inherit our outstanding timer. Not good; to each its own. + */ + /* + * We did what we wanted to do, so tell the rest of the server we + * succeeded. + */ + return OK; +} + +/*--------------------------------------------------------------------------*/ +/* */ +/* Now let's declare routines for each of the callback phase in order. */ +/* (That's the order in which they're listed in the callback list, *not */ +/* the order in which the server calls them! See the command_rec */ +/* declaration near the bottom of this file.) Note that these may be */ +/* called for situations that don't relate primarily to our function - in */ +/* other words, the fixup handler shouldn't assume that the request has */ +/* to do with "example" stuff. */ +/* */ +/* With the exception of the content handler, all of our routines will be */ +/* called for each request, unless an earlier handler from another module */ +/* aborted the sequence. */ +/* */ +/* Handlers that are declared as "int" can return the following: */ +/* */ +/* OK Handler accepted the request and did its thing with it. */ +/* DECLINED Handler took no action. */ +/* HTTP_mumble Handler looked at request and found it wanting. */ +/* */ +/* What the server does after calling a module handler depends upon the */ +/* handler's return value. In all cases, if the handler returns */ +/* DECLINED, the server will continue to the next module with an handler */ +/* for the current phase. However, if the handler return a non-OK, */ +/* non-DECLINED status, the server aborts the request right there. If */ +/* the handler returns OK, the server's next action is phase-specific; */ +/* see the individual handler comments below for details. */ +/* */ +/*--------------------------------------------------------------------------*/ +/* + * This function is called during server initialisation. Any information + * that needs to be recorded must be in static cells, since there's no + * configuration record. + * + * There is no return value. + */ + +/* + * This function is called when an heavy-weight process (such as a child) is + * being run down or destroyed. As with the child initialisation function, + * any information that needs to be recorded must be in static cells, since + * there's no configuration record. + * + * There is no return value. + */ + +/* + * This function is called during server initialisation when an heavy-weight + * process (such as a child) is being initialised. As with the + * module initialisation function, any information that needs to be recorded + * must be in static cells, since there's no configuration record. + * + * There is no return value. + */ + +/* + * This function gets called to create a per-directory configuration + * record. This will be called for the "default" server environment, and for + * each directory for which the parser finds any of our directives applicable. + * If a directory doesn't have any of our directives involved (i.e., they + * aren't in the .htaccess file, or a , , or related + * block), this routine will *not* be called - the configuration for the + * closest ancestor is used. + * + * The return value is a pointer to the created module-specific + * structure. + */ +static void *x_create_dir_config(apr_pool_t *p, char *dirspec) +{ + x_cfg *cfg; + char *dname = dirspec; + + /* + * Allocate the space for our record from the pool supplied. + */ + cfg = (x_cfg *) apr_pcalloc(p, sizeof(x_cfg)); + /* + * Now fill in the defaults. If there are any `parent' configuration + * records, they'll get merged as part of a separate callback. + */ + cfg->local = 0; + cfg->congenital = 0; + cfg->cmode = CONFIG_MODE_DIRECTORY; + /* + * Finally, add our trace to the callback list. + */ + dname = (dname != NULL) ? dname : ""; + cfg->loc = apr_pstrcat(p, "DIR(", dname, ")", NULL); + trace_add(NULL, NULL, cfg, "x_create_dir_config()"); + return (void *) cfg; +} + +/* + * This function gets called to merge two per-directory configuration + * records. This is typically done to cope with things like .htaccess files + * or directives for directories that are beneath one for which a + * configuration record was already created. The routine has the + * responsibility of creating a new record and merging the contents of the + * other two into it appropriately. If the module doesn't declare a merge + * routine, the record for the closest ancestor location (that has one) is + * used exclusively. + * + * The routine MUST NOT modify any of its arguments! + * + * The return value is a pointer to the created module-specific structure + * containing the merged values. + */ +static void *x_merge_dir_config(apr_pool_t *p, void *parent_conf, + void *newloc_conf) +{ + + x_cfg *merged_config = (x_cfg *) apr_pcalloc(p, sizeof(x_cfg)); + x_cfg *pconf = (x_cfg *) parent_conf; + x_cfg *nconf = (x_cfg *) newloc_conf; + char *note; + + /* + * Some things get copied directly from the more-specific record, rather + * than getting merged. + */ + merged_config->local = nconf->local; + merged_config->loc = apr_pstrdup(p, nconf->loc); + /* + * Others, like the setting of the `congenital' flag, get ORed in. The + * setting of that particular flag, for instance, is TRUE if it was ever + * true anywhere in the upstream configuration. + */ + merged_config->congenital = (pconf->congenital | pconf->local); + /* + * If we're merging records for two different types of environment (server + * and directory), mark the new record appropriately. Otherwise, inherit + * the current value. + */ + merged_config->cmode = + (pconf->cmode == nconf->cmode) ? pconf->cmode : CONFIG_MODE_COMBO; + /* + * Now just record our being called in the trace list. Include the + * locations we were asked to merge. + */ + note = apr_pstrcat(p, "x_merge_dir_config(\"", pconf->loc, "\",\"", + nconf->loc, "\")", NULL); + trace_add(NULL, NULL, merged_config, note); + return (void *) merged_config; +} + +/* + * This function gets called to create a per-server configuration + * record. It will always be called for the "default" server. + * + * The return value is a pointer to the created module-specific + * structure. + */ +static void *x_create_server_config(apr_pool_t *p, server_rec *s) +{ + + x_cfg *cfg; + char *sname = s->server_hostname; + + /* + * As with the x_create_dir_config() reoutine, we allocate and fill + * in an empty record. + */ + cfg = (x_cfg *) apr_pcalloc(p, sizeof(x_cfg)); + cfg->local = 0; + cfg->congenital = 0; + cfg->cmode = CONFIG_MODE_SERVER; + /* + * Note that we were called in the trace list. + */ + sname = (sname != NULL) ? sname : ""; + cfg->loc = apr_pstrcat(p, "SVR(", sname, ")", NULL); + trace_add(s, NULL, cfg, "x_create_server_config()"); + return (void *) cfg; +} + +/* + * This function gets called to merge two per-server configuration + * records. This is typically done to cope with things like virtual hosts and + * the default server configuration The routine has the responsibility of + * creating a new record and merging the contents of the other two into it + * appropriately. If the module doesn't declare a merge routine, the more + * specific existing record is used exclusively. + * + * The routine MUST NOT modify any of its arguments! + * + * The return value is a pointer to the created module-specific structure + * containing the merged values. + */ +static void *x_merge_server_config(apr_pool_t *p, void *server1_conf, + void *server2_conf) +{ + + x_cfg *merged_config = (x_cfg *) apr_pcalloc(p, sizeof(x_cfg)); + x_cfg *s1conf = (x_cfg *) server1_conf; + x_cfg *s2conf = (x_cfg *) server2_conf; + char *note; + + /* + * Our inheritance rules are our own, and part of our module's semantics. + * Basically, just note whence we came. + */ + merged_config->cmode = + (s1conf->cmode == s2conf->cmode) ? s1conf->cmode : CONFIG_MODE_COMBO; + merged_config->local = s2conf->local; + merged_config->congenital = (s1conf->congenital | s1conf->local); + merged_config->loc = apr_pstrdup(p, s2conf->loc); + /* + * Trace our call, including what we were asked to merge. + */ + note = apr_pstrcat(p, "x_merge_server_config(\"", s1conf->loc, "\",\"", + s2conf->loc, "\")", NULL); + trace_add(NULL, NULL, merged_config, note); + return (void *) merged_config; +} + +/* + * This routine is called before the server processes the configuration + * files. There is no return value. + */ +static int x_pre_config(apr_pool_t *pconf, apr_pool_t *plog, + apr_pool_t *ptemp) +{ + /* + * Log the call and exit. + */ + trace_add(NULL, NULL, NULL, "x_pre_config()"); + + return OK; +} + +/* + * This routine is called to perform any module-specific fixing of header + * fields, et cetera. It is invoked just before any content-handler. + * + * The return value is OK, DECLINED, or HTTP_mumble. If we return OK, the + * server will still call any remaining modules with an handler for this + * phase. + */ +static int x_post_config(apr_pool_t *pconf, apr_pool_t *plog, + apr_pool_t *ptemp, server_rec *s) +{ + /* + * Log the call and exit. + */ + trace_add(NULL, NULL, NULL, "x_post_config()"); + return OK; +} + +/* + * This routine is called to perform any module-specific log file + * openings. It is invoked just before the post_config phase + * + * The return value is OK, DECLINED, or HTTP_mumble. If we return OK, the + * server will still call any remaining modules with an handler for this + * phase. + */ +static int x_open_logs(apr_pool_t *pconf, apr_pool_t *plog, + apr_pool_t *ptemp, server_rec *s) +{ + /* + * Log the call and exit. + */ + trace_add(s, NULL, NULL, "x_open_logs()"); + return OK; +} + +/* + * All our process-death routine does is add its trace to the log. + */ +static apr_status_t x_child_exit(void *data) +{ + char *note; + server_rec *s = data; + char *sname = s->server_hostname; + + /* + * The arbitrary text we add to our trace entry indicates for which server + * we're being called. + */ + sname = (sname != NULL) ? sname : ""; + note = apr_pstrcat(s->process->pool, "x_child_exit(", sname, ")", NULL); + trace_add(s, NULL, NULL, note); + return APR_SUCCESS; +} + +/* + * All our process initialiser does is add its trace to the log. + */ +static void x_child_init(apr_pool_t *p, server_rec *s) +{ + char *note; + char *sname = s->server_hostname; + + /* + * Set up any module cells that ought to be initialised. + */ + setup_module_cells(); + /* + * The arbitrary text we add to our trace entry indicates for which server + * we're being called. + */ + sname = (sname != NULL) ? sname : ""; + note = apr_pstrcat(p, "x_child_init(", sname, ")", NULL); + trace_add(s, NULL, NULL, note); + + apr_pool_cleanup_register(p, s, x_child_exit, x_child_exit); +} + +/* + * XXX: This routine is called XXX + * + * The return value is OK, DECLINED, or HTTP_mumble. If we return OK, the + * server will still call any remaining modules with an handler for this + * phase. + */ +#if 0 +static const char *x_http_method(const request_rec *r) +{ + x_cfg *cfg; + + cfg = our_dconfig(r); + /* + * Log the call and exit. + */ + trace_add(r->server, NULL, cfg, "x_http_method()"); + return "foo"; +} + +/* + * XXX: This routine is called XXX + * + * The return value is OK, DECLINED, or HTTP_mumble. If we return OK, the + * server will still call any remaining modules with an handler for this + * phase. + */ +static apr_port_t x_default_port(const request_rec *r) +{ + x_cfg *cfg; + + cfg = our_dconfig(r); + /* + * Log the call and exit. + */ + trace_add(r->server, NULL, cfg, "x_default_port()"); + return 80; +} +#endif /*0*/ + +/* + * XXX: This routine is called XXX + * + * The return value is OK, DECLINED, or HTTP_mumble. If we return OK, the + * server will still call any remaining modules with an handler for this + * phase. + */ +static void x_insert_filter(request_rec *r) +{ + x_cfg *cfg; + + cfg = our_dconfig(r); + /* + * Log the call and exit. + */ + trace_add(r->server, NULL, cfg, "x_insert_filter()"); +} + +/* + * XXX: This routine is called XXX + * + * The return value is OK, DECLINED, or HTTP_mumble. If we return OK, the + * server will still call any remaining modules with an handler for this + * phase. + */ +static int x_quick_handler(request_rec *r, int lookup_uri) +{ + x_cfg *cfg; + + cfg = our_dconfig(r); + /* + * Log the call and exit. + */ + trace_add(r->server, NULL, cfg, "x_post_config()"); + return DECLINED; +} + +/* + * This routine is called just after the server accepts the connection, + * but before it is handed off to a protocol module to be served. The point + * of this hook is to allow modules an opportunity to modify the connection + * as soon as possible. The core server uses this phase to setup the + * connection record based on the type of connection that is being used. + * + * The return value is OK, DECLINED, or HTTP_mumble. If we return OK, the + * server will still call any remaining modules with an handler for this + * phase. + */ +static int x_pre_connection(conn_rec *c, void *csd) +{ + x_cfg *cfg; + + cfg = our_cconfig(c); +#if 0 + /* + * Log the call and exit. + */ + trace_add(r->server, NULL, cfg, "x_post_config()"); +#endif + return OK; +} + +/* This routine is used to actually process the connection that was received. + * Only protocol modules should implement this hook, as it gives them an + * opportunity to replace the standard HTTP processing with processing for + * some other protocol. Both echo and POP3 modules are available as + * examples. + * + * The return VALUE is OK, DECLINED, or HTTP_mumble. If we return OK, no + * further modules are called for this phase. + */ +static int x_process_connection(conn_rec *c) +{ + return DECLINED; +} + +/* + * This routine is called after the request has been read but before any other + * phases have been processed. This allows us to make decisions based upon + * the input header fields. + * + * The return value is OK, DECLINED, or HTTP_mumble. If we return OK, no + * further modules are called for this phase. + */ +static int x_post_read_request(request_rec *r) +{ + x_cfg *cfg; + + cfg = our_dconfig(r); + /* + * We don't actually *do* anything here, except note the fact that we were + * called. + */ + trace_add(r->server, r, cfg, "x_post_read_request()"); + return DECLINED; +} + +/* + * This routine gives our module an opportunity to translate the URI into an + * actual filename. If we don't do anything special, the server's default + * rules (Alias directives and the like) will continue to be followed. + * + * The return value is OK, DECLINED, or HTTP_mumble. If we return OK, no + * further modules are called for this phase. + */ +static int x_translate_handler(request_rec *r) +{ + + x_cfg *cfg; + + cfg = our_dconfig(r); + /* + * We don't actually *do* anything here, except note the fact that we were + * called. + */ + trace_add(r->server, r, cfg, "x_translate_handler()"); + return DECLINED; +} + +/* + * this routine gives our module another chance to examine the request + * headers and to take special action. This is the first phase whose + * hooks' configuration directives can appear inside the + * and similar sections, because at this stage the URI has been mapped + * to the filename. For example this phase can be used to block evil + * clients, while little resources were wasted on these. + * + * The return value is OK, DECLINED, or HTTP_mumble. If we return OK, + * the server will still call any remaining modules with an handler + * for this phase. + */ +static int x_header_parser_handler(request_rec *r) +{ + + x_cfg *cfg; + + cfg = our_dconfig(r); + /* + * We don't actually *do* anything here, except note the fact that we were + * called. + */ + trace_add(r->server, r, cfg, "header_parser_handler()"); + return DECLINED; +} + + +/* + * This routine is called to check the authentication information sent with + * the request (such as looking up the user in a database and verifying that + * the [encrypted] password sent matches the one in the database). + * + * The return value is OK, DECLINED, or some HTTP_mumble error (typically + * HTTP_UNAUTHORIZED). If we return OK, no other modules are given a chance + * at the request during this phase. + */ +static int x_check_user_id(request_rec *r) +{ + + x_cfg *cfg; + + cfg = our_dconfig(r); + /* + * Don't do anything except log the call. + */ + trace_add(r->server, r, cfg, "x_check_user_id()"); + return DECLINED; +} + +/* + * This routine is called to check to see if the resource being requested + * requires authorisation. + * + * The return value is OK, DECLINED, or HTTP_mumble. If we return OK, no + * other modules are called during this phase. + * + * If *all* modules return DECLINED, the request is aborted with a server + * error. + */ +static int x_auth_checker(request_rec *r) +{ + + x_cfg *cfg; + + cfg = our_dconfig(r); + /* + * Log the call and return OK, or access will be denied (even though we + * didn't actually do anything). + */ + trace_add(r->server, r, cfg, "x_auth_checker()"); + return DECLINED; +} + +/* + * This routine is called to check for any module-specific restrictions placed + * upon the requested resource. (See the mod_access module for an example.) + * + * The return value is OK, DECLINED, or HTTP_mumble. All modules with an + * handler for this phase are called regardless of whether their predecessors + * return OK or DECLINED. The first one to return any other status, however, + * will abort the sequence (and the request) as usual. + */ +static int x_access_checker(request_rec *r) +{ + + x_cfg *cfg; + + cfg = our_dconfig(r); + trace_add(r->server, r, cfg, "x_access_checker()"); + return DECLINED; +} + +/* + * This routine is called to determine and/or set the various document type + * information bits, like Content-type (via r->content_type), language, et + * cetera. + * + * The return value is OK, DECLINED, or HTTP_mumble. If we return OK, no + * further modules are given a chance at the request for this phase. + */ +static int x_type_checker(request_rec *r) +{ + + x_cfg *cfg; + + cfg = our_dconfig(r); + /* + * Log the call, but don't do anything else - and report truthfully that + * we didn't do anything. + */ + trace_add(r->server, r, cfg, "x_type_checker()"); + return DECLINED; +} + +/* + * This routine is called to perform any module-specific fixing of header + * fields, et cetera. It is invoked just before any content-handler. + * + * The return value is OK, DECLINED, or HTTP_mumble. If we return OK, the + * server will still call any remaining modules with an handler for this + * phase. + */ +static int x_fixer_upper(request_rec *r) +{ + + x_cfg *cfg; + + cfg = our_dconfig(r); + /* + * Log the call and exit. + */ + trace_add(r->server, r, cfg, "x_fixer_upper()"); + return OK; +} + +/* + * This routine is called to perform any module-specific logging activities + * over and above the normal server things. + * + * The return value is OK, DECLINED, or HTTP_mumble. If we return OK, any + * remaining modules with an handler for this phase will still be called. + */ +static int x_logger(request_rec *r) +{ + + x_cfg *cfg; + + cfg = our_dconfig(r); + trace_add(r->server, r, cfg, "x_logger()"); + return DECLINED; +} + +/*--------------------------------------------------------------------------*/ +/* */ +/* Which functions are responsible for which hooks in the server. */ +/* */ +/*--------------------------------------------------------------------------*/ +/* + * Each function our module provides to handle a particular hook is + * specified here. The functions are registered using + * ap_hook_foo(name, predecessors, successors, position) + * where foo is the name of the hook. + * + * The args are as follows: + * name -> the name of the function to call. + * predecessors -> a list of modules whose calls to this hook must be + * invoked before this module. + * successors -> a list of modules whose calls to this hook must be + * invoked after this module. + * position -> The relative position of this module. One of + * APR_HOOK_FIRST, APR_HOOK_MIDDLE, or APR_HOOK_LAST. + * Most modules will use APR_HOOK_MIDDLE. If multiple + * modules use the same relative position, Apache will + * determine which to call first. + * If your module relies on another module to run first, + * or another module running after yours, use the + * predecessors and/or successors. + * + * The number in brackets indicates the order in which the routine is called + * during request processing. Note that not all routines are necessarily + * called (such as if a resource doesn't have access restrictions). + * The actual delivery of content to the browser [9] is not handled by + * a hook; see the handler declarations below. + */ +static void x_register_hooks(apr_pool_t *p) +{ + ap_hook_pre_config(x_pre_config, NULL, NULL, APR_HOOK_MIDDLE); + ap_hook_post_config(x_post_config, NULL, NULL, APR_HOOK_MIDDLE); + ap_hook_open_logs(x_open_logs, NULL, NULL, APR_HOOK_MIDDLE); + ap_hook_child_init(x_child_init, NULL, NULL, APR_HOOK_MIDDLE); + ap_hook_handler(x_handler, NULL, NULL, APR_HOOK_MIDDLE); + ap_hook_quick_handler(x_quick_handler, NULL, NULL, APR_HOOK_MIDDLE); + ap_hook_pre_connection(x_pre_connection, NULL, NULL, APR_HOOK_MIDDLE); + ap_hook_process_connection(x_process_connection, NULL, NULL, APR_HOOK_MIDDLE); + /* [1] post read_request handling */ + ap_hook_post_read_request(x_post_read_request, NULL, NULL, + APR_HOOK_MIDDLE); + ap_hook_log_transaction(x_logger, NULL, NULL, APR_HOOK_MIDDLE); +#if 0 + ap_hook_http_method(x_http_method, NULL, NULL, APR_HOOK_MIDDLE); + ap_hook_default_port(x_default_port, NULL, NULL, APR_HOOK_MIDDLE); +#endif + ap_hook_translate_name(x_translate_handler, NULL, NULL, APR_HOOK_MIDDLE); + ap_hook_header_parser(x_header_parser_handler, NULL, NULL, APR_HOOK_MIDDLE); + ap_hook_check_user_id(x_check_user_id, NULL, NULL, APR_HOOK_MIDDLE); + ap_hook_fixups(x_fixer_upper, NULL, NULL, APR_HOOK_MIDDLE); + ap_hook_type_checker(x_type_checker, NULL, NULL, APR_HOOK_MIDDLE); + ap_hook_access_checker(x_access_checker, NULL, NULL, APR_HOOK_MIDDLE); + ap_hook_auth_checker(x_auth_checker, NULL, NULL, APR_HOOK_MIDDLE); + ap_hook_insert_filter(x_insert_filter, NULL, NULL, APR_HOOK_MIDDLE); +} + +/*--------------------------------------------------------------------------*/ +/* */ +/* All of the routines have been declared now. Here's the list of */ +/* directives specific to our module, and information about where they */ +/* may appear and how the command parser should pass them to us for */ +/* processing. Note that care must be taken to ensure that there are NO */ +/* collisions of directive names between modules. */ +/* */ +/*--------------------------------------------------------------------------*/ +/* + * List of directives specific to our module. + */ +static const command_rec x_cmds[] = +{ + AP_INIT_NO_ARGS( + "Example", /* directive name */ + cmd_example, /* config action routine */ + NULL, /* argument to include in call */ + OR_OPTIONS, /* where available */ + "Example directive - no arguments" /* directive description */ + ), + {NULL} +}; +/*--------------------------------------------------------------------------*/ +/* */ +/* Finally, the list of callback routines and data structures that provide */ +/* the static hooks into our module from the other parts of the server. */ +/* */ +/*--------------------------------------------------------------------------*/ +/* + * Module definition for configuration. If a particular callback is not + * needed, replace its routine name below with the word NULL. + */ +module AP_MODULE_DECLARE_DATA example_module = +{ + STANDARD20_MODULE_STUFF, + x_create_dir_config, /* per-directory config creator */ + x_merge_dir_config, /* dir config merger */ + x_create_server_config, /* server config creator */ + x_merge_server_config, /* server config merger */ + x_cmds, /* command table */ + x_register_hooks, /* set up other request processing hooks */ +}; diff --git a/rubbos/app/httpd-2.0.64/modules/experimental/mod_mem_cache.c b/rubbos/app/httpd-2.0.64/modules/experimental/mod_mem_cache.c new file mode 100644 index 00000000..0812b976 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/experimental/mod_mem_cache.c @@ -0,0 +1,1198 @@ +/* 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. + */ + +/* + * Rules for managing obj->refcount: + * refcount should be incremented when an object is placed in the cache. Insertion + * of an object into the cache and the refcount increment should happen under + * protection of the sconf->lock. + * + * refcount should be decremented when the object is removed from the cache. + * Object should be removed from the cache and the refcount decremented while + * under protection of the sconf->lock. + * + * refcount should be incremented when an object is retrieved from the cache + * by a worker thread. The retrieval/find operation and refcount increment + * should occur under protection of the sconf->lock + * + * refcount can be atomically decremented w/o protection of the sconf->lock + * by worker threads. + * + * Any object whose refcount drops to 0 should be freed/cleaned up. A refcount + * of 0 means the object is not in the cache and no worker threads are accessing + * it. + */ +#define CORE_PRIVATE +#include "mod_cache.h" +#include "cache_pqueue.h" +#include "cache_cache.h" +#include "ap_provider.h" +#include "ap_mpm.h" +#include "apr_thread_mutex.h" +#if APR_HAVE_UNISTD_H +#include +#endif + +#if !APR_HAS_THREADS +#error This module does not currently compile unless you have a thread-capable APR. Sorry! +#endif + +module AP_MODULE_DECLARE_DATA mem_cache_module; + +typedef enum { + CACHE_TYPE_FILE = 1, + CACHE_TYPE_HEAP, + CACHE_TYPE_MMAP +} cache_type_e; + +typedef struct { + char* hdr; + char* val; +} cache_header_tbl_t; + +typedef struct mem_cache_object { + cache_type_e type; + apr_ssize_t num_header_out; + apr_ssize_t num_err_header_out; + apr_ssize_t num_subprocess_env; + apr_ssize_t num_notes; + apr_ssize_t num_req_hdrs; + cache_header_tbl_t *header_out; + cache_header_tbl_t *err_header_out; + cache_header_tbl_t *subprocess_env; + cache_header_tbl_t *notes; + cache_header_tbl_t *req_hdrs; /* for Vary negotiation */ + apr_size_t m_len; + void *m; + apr_os_file_t fd; + apr_int32_t flags; /* File open flags */ + long priority; /**< the priority of this entry */ + long total_refs; /**< total number of references this entry has had */ + + apr_uint32_t pos; /**< the position of this entry in the cache */ + +} mem_cache_object_t; + +typedef struct { + apr_thread_mutex_t *lock; + cache_cache_t *cache_cache; + + /* Fields set by config directives */ + apr_size_t min_cache_object_size; /* in bytes */ + apr_size_t max_cache_object_size; /* in bytes */ + apr_size_t max_cache_size; /* in bytes */ + apr_size_t max_object_cnt; + cache_pqueue_set_priority cache_remove_algorithm; + + /* maximum amount of data to buffer on a streamed response where + * we haven't yet seen EOS */ + apr_off_t max_streaming_buffer_size; +} mem_cache_conf; +static mem_cache_conf *sconf; + +#define DEFAULT_MAX_CACHE_SIZE 100*1024 +#define DEFAULT_MIN_CACHE_OBJECT_SIZE 0 +#define DEFAULT_MAX_CACHE_OBJECT_SIZE 10000 +#define DEFAULT_MAX_OBJECT_CNT 1009 +#define DEFAULT_MAX_STREAMING_BUFFER_SIZE 100000 +#define CACHEFILE_LEN 20 + +/* Forward declarations */ +static int remove_entity(cache_handle_t *h); +static apr_status_t store_headers(cache_handle_t *h, request_rec *r, cache_info *i); +static apr_status_t store_body(cache_handle_t *h, request_rec *r, apr_bucket_brigade *b); +static apr_status_t recall_headers(cache_handle_t *h, request_rec *r); +static apr_status_t recall_body(cache_handle_t *h, apr_pool_t *p, apr_bucket_brigade *bb); + +static void cleanup_cache_object(cache_object_t *obj); + +static long memcache_get_priority(void*a) +{ + cache_object_t *obj = (cache_object_t *)a; + mem_cache_object_t *mobj = obj->vobj; + + return mobj->priority; +} + +static void memcache_inc_frequency(void*a) +{ + cache_object_t *obj = (cache_object_t *)a; + mem_cache_object_t *mobj = obj->vobj; + + mobj->total_refs++; + mobj->priority = 0; +} + +static void memcache_set_pos(void *a, apr_ssize_t pos) +{ + cache_object_t *obj = (cache_object_t *)a; + mem_cache_object_t *mobj = obj->vobj; + + apr_atomic_set(&mobj->pos, pos); +} +static apr_ssize_t memcache_get_pos(void *a) +{ + cache_object_t *obj = (cache_object_t *)a; + mem_cache_object_t *mobj = obj->vobj; + + return apr_atomic_read(&mobj->pos); +} + +static apr_size_t memcache_cache_get_size(void*a) +{ + cache_object_t *obj = (cache_object_t *)a; + mem_cache_object_t *mobj = obj->vobj; + return mobj->m_len; +} +/** callback to get the key of a item */ +static const char* memcache_cache_get_key(void*a) +{ + cache_object_t *obj = (cache_object_t *)a; + return obj->key; +} +/** + * memcache_cache_free() + * memcache_cache_free is a callback that is only invoked by a thread + * running in cache_insert(). cache_insert() runs under protection + * of sconf->lock. By the time this function has been entered, the cache_object + * has been ejected from the cache. decrement the refcount and if the refcount drops + * to 0, cleanup the cache object. + */ +static void memcache_cache_free(void*a) +{ + cache_object_t *obj = (cache_object_t *)a; + + /* Decrement the refcount to account for the object being ejected + * from the cache. If the refcount is 0, free the object. + */ + if (!apr_atomic_dec(&obj->refcount)) { + cleanup_cache_object(obj); + } +} +/* + * functions return a 'negative' score since priority queues + * dequeue the object with the highest value first + */ +static long memcache_lru_algorithm(long queue_clock, void *a) +{ + cache_object_t *obj = (cache_object_t *)a; + mem_cache_object_t *mobj = obj->vobj; + if (mobj->priority == 0) + mobj->priority = queue_clock - mobj->total_refs; + + /* + * a 'proper' LRU function would just be + * mobj->priority = mobj->total_refs; + */ + return mobj->priority; +} + +static long memcache_gdsf_algorithm(long queue_clock, void *a) +{ + cache_object_t *obj = (cache_object_t *)a; + mem_cache_object_t *mobj = obj->vobj; + + if (mobj->priority == 0) + mobj->priority = queue_clock - + (long)(mobj->total_refs*1000 / mobj->m_len); + + return mobj->priority; +} + +static void cleanup_cache_object(cache_object_t *obj) +{ + mem_cache_object_t *mobj = obj->vobj; + + /* TODO: + * We desperately need a more efficient way of allocating objects. We're + * making way too many malloc calls to create a fully populated + * cache object... + */ + + /* Cleanup the cache_object_t */ + if (obj->key) { + free(obj->key); + } + if (obj->info.content_type) { + free(obj->info.content_type); + } + if (obj->info.etag) { + free(obj->info.etag); + } + if (obj->info.lastmods) { + free(obj->info.lastmods); + } + if (obj->info.filename) { + free(obj->info.filename); + } + + free(obj); + + /* Cleanup the mem_cache_object_t */ + if (mobj) { + if (mobj->type == CACHE_TYPE_HEAP && mobj->m) { + free(mobj->m); + } + if (mobj->type == CACHE_TYPE_FILE && mobj->fd) { +#ifdef WIN32 + CloseHandle(mobj->fd); +#else + close(mobj->fd); +#endif + } + if (mobj->header_out) { + if (mobj->header_out[0].hdr) + free(mobj->header_out[0].hdr); + free(mobj->header_out); + } + if (mobj->err_header_out) { + if (mobj->err_header_out[0].hdr) + free(mobj->err_header_out[0].hdr); + free(mobj->err_header_out); + } + if (mobj->subprocess_env) { + if (mobj->subprocess_env[0].hdr) + free(mobj->subprocess_env[0].hdr); + free(mobj->subprocess_env); + } + if (mobj->notes) { + if (mobj->notes[0].hdr) + free(mobj->notes[0].hdr); + free(mobj->notes); + } + if (mobj->req_hdrs) { + if (mobj->req_hdrs[0].hdr) + free(mobj->req_hdrs[0].hdr); + free(mobj->req_hdrs); + } + free(mobj); + } +} +static apr_status_t decrement_refcount(void *arg) +{ + cache_object_t *obj = (cache_object_t *) arg; + + /* If obj->complete is not set, the cache update failed and the + * object needs to be removed from the cache then cleaned up. + * The garbage collector may have ejected the object from the + * cache already, so make sure it is really still in the cache + * before attempting to remove it. + */ + if (!obj->complete) { + cache_object_t *tobj = NULL; + if (sconf->lock) { + apr_thread_mutex_lock(sconf->lock); + } + tobj = cache_find(sconf->cache_cache, obj->key); + if (tobj == obj) { + cache_remove(sconf->cache_cache, obj); + apr_atomic_dec(&obj->refcount); + } + if (sconf->lock) { + apr_thread_mutex_unlock(sconf->lock); + } + } + + /* If the refcount drops to 0, cleanup the cache object */ + if (!apr_atomic_dec(&obj->refcount)) { + cleanup_cache_object(obj); + } + return APR_SUCCESS; +} +static apr_status_t cleanup_cache_mem(void *sconfv) +{ + cache_object_t *obj; + mem_cache_conf *co = (mem_cache_conf*) sconfv; + + if (!co) { + return APR_SUCCESS; + } + if (!co->cache_cache) { + return APR_SUCCESS; + } + + if (sconf->lock) { + apr_thread_mutex_lock(sconf->lock); + } + obj = cache_pop(co->cache_cache); + while (obj) { + /* Iterate over the cache and clean up each unreferenced entry */ + if (!apr_atomic_dec(&obj->refcount)) { + cleanup_cache_object(obj); + } + obj = cache_pop(co->cache_cache); + } + + /* Cache is empty, free the cache table */ + cache_free(co->cache_cache); + + if (sconf->lock) { + apr_thread_mutex_unlock(sconf->lock); + } + return APR_SUCCESS; +} +/* + * TODO: enable directives to be overridden in various containers + */ +static void *create_cache_config(apr_pool_t *p, server_rec *s) +{ + sconf = apr_pcalloc(p, sizeof(mem_cache_conf)); + + sconf->min_cache_object_size = DEFAULT_MIN_CACHE_OBJECT_SIZE; + sconf->max_cache_object_size = DEFAULT_MAX_CACHE_OBJECT_SIZE; + /* Number of objects in the cache */ + sconf->max_object_cnt = DEFAULT_MAX_OBJECT_CNT; + /* Size of the cache in bytes */ + sconf->max_cache_size = DEFAULT_MAX_CACHE_SIZE; + sconf->cache_cache = NULL; + sconf->cache_remove_algorithm = memcache_gdsf_algorithm; + sconf->max_streaming_buffer_size = DEFAULT_MAX_STREAMING_BUFFER_SIZE; + + return sconf; +} + +static int create_entity(cache_handle_t *h, cache_type_e type_e, + request_rec *r, const char *key, apr_off_t len) +{ + cache_object_t *obj, *tmp_obj; + mem_cache_object_t *mobj; + apr_size_t key_len; + + if (len == -1) { + /* Caching a streaming response. Assume the response is + * less than or equal to max_streaming_buffer_size. We will + * correct all the cache size counters in store_body once + * we know exactly know how much we are caching. + */ + len = sconf->max_streaming_buffer_size; + } + + /* Note: cache_insert() will automatically garbage collect + * objects from the cache if the max_cache_size threshold is + * exceeded. This means mod_mem_cache does not need to implement + * max_cache_size checks. + */ + if (len < sconf->min_cache_object_size || + len > sconf->max_cache_object_size) { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "mem_cache: URL %s failed the size check and will not be cached.", + key); + return DECLINED; + } + + if (type_e == CACHE_TYPE_FILE) { + /* CACHE_TYPE_FILE is only valid for local content handled by the + * default handler. Need a better way to check if the file is + * local or not. + */ + if (!r->filename) { + return DECLINED; + } + } + + /* Allocate and initialize cache_object_t */ + obj = calloc(1, sizeof(*obj)); + if (!obj) { + return DECLINED; + } + key_len = strlen(key) + 1; + obj->key = malloc(key_len); + if (!obj->key) { + cleanup_cache_object(obj); + return DECLINED; + } + memcpy(obj->key, key, key_len); + /* Safe cast: We tested < sconf->max_cache_object_size above */ + obj->info.len = (apr_size_t)len; + + /* Allocate and init mem_cache_object_t */ + mobj = calloc(1, sizeof(*mobj)); + if (!mobj) { + cleanup_cache_object(obj); + return DECLINED; + } + + /* Finish initing the cache object */ + apr_atomic_set(&obj->refcount, 1); + mobj->total_refs = 1; + obj->complete = 0; + obj->vobj = mobj; + /* Safe cast: We tested < sconf->max_cache_object_size above */ + mobj->m_len = (apr_size_t)len; + mobj->type = type_e; + + /* Place the cache_object_t into the hash table. + * Note: Perhaps we should wait to put the object in the + * hash table when the object is complete? I add the object here to + * avoid multiple threads attempting to cache the same content only + * to discover at the very end that only one of them will succeed. + * Furthermore, adding the cache object to the table at the end could + * open up a subtle but easy to exploit DoS hole: someone could request + * a very large file with multiple requests. Better to detect this here + * rather than after the cache object has been completely built and + * initialized... + * XXX Need a way to insert into the cache w/o such coarse grained locking + */ + if (sconf->lock) { + apr_thread_mutex_lock(sconf->lock); + } + tmp_obj = (cache_object_t *) cache_find(sconf->cache_cache, key); + + if (!tmp_obj) { + cache_insert(sconf->cache_cache, obj); + /* Add a refcount to account for the reference by the + * hashtable in the cache. Refcount should be 2 now, one + * for this thread, and one for the cache. + */ + apr_atomic_inc(&obj->refcount); + } + if (sconf->lock) { + apr_thread_mutex_unlock(sconf->lock); + } + + if (tmp_obj) { + /* This thread collided with another thread loading the same object + * into the cache at the same time. Defer to the other thread which + * is further along. + */ + cleanup_cache_object(obj); + return DECLINED; + } + + apr_pool_cleanup_register(r->pool, obj, decrement_refcount, + apr_pool_cleanup_null); + + /* Populate the cache handle */ + h->cache_obj = obj; + + return OK; +} + +static int create_mem_entity(cache_handle_t *h, request_rec *r, + const char *key, apr_off_t len) +{ + return create_entity(h, CACHE_TYPE_HEAP, r, key, len); +} + +static int create_fd_entity(cache_handle_t *h, request_rec *r, + const char *key, apr_off_t len) +{ + return create_entity(h, CACHE_TYPE_FILE, r, key, len); +} + +static int open_entity(cache_handle_t *h, request_rec *r, const char *key) +{ + cache_object_t *obj; + + /* Look up entity keyed to 'url' */ + if (sconf->lock) { + apr_thread_mutex_lock(sconf->lock); + } + obj = (cache_object_t *) cache_find(sconf->cache_cache, key); + if (obj) { + if (obj->complete) { + request_rec *rmain=r, *rtmp; + apr_atomic_inc(&obj->refcount); + /* cache is worried about overall counts, not 'open' ones */ + cache_update(sconf->cache_cache, obj); + + /* If this is a subrequest, register the cleanup against + * the main request. This will prevent the cache object + * from being cleaned up from under the request after the + * subrequest is destroyed. + */ + rtmp = r; + while (rtmp) { + rmain = rtmp; + rtmp = rmain->main; + } + apr_pool_cleanup_register(rmain->pool, obj, decrement_refcount, + apr_pool_cleanup_null); + } + else { + obj = NULL; + } + } + + if (sconf->lock) { + apr_thread_mutex_unlock(sconf->lock); + } + + if (!obj) { + return DECLINED; + } + + /* Initialize the cache_handle */ + h->cache_obj = obj; + h->req_hdrs = NULL; /* Pick these up in recall_headers() */ + return OK; +} + +/* remove_entity() + * Notes: + * refcount should be at least 1 upon entry to this function to account + * for this thread's reference to the object. If the refcount is 1, then + * object has been removed from the cache by another thread and this thread + * is the last thread accessing the object. + */ +static int remove_entity(cache_handle_t *h) +{ + cache_object_t *obj = h->cache_obj; + cache_object_t *tobj = NULL; + + if (sconf->lock) { + apr_thread_mutex_lock(sconf->lock); + } + + /* If the entity is still in the cache, remove it and decrement the + * refcount. If the entity is not in the cache, do nothing. In both cases + * decrement_refcount called by the last thread referencing the object will + * trigger the cleanup. + */ + tobj = cache_find(sconf->cache_cache, obj->key); + if (tobj == obj) { + cache_remove(sconf->cache_cache, obj); + apr_atomic_dec(&obj->refcount); + } + + if (sconf->lock) { + apr_thread_mutex_unlock(sconf->lock); + } + + return OK; +} +static apr_status_t serialize_table(cache_header_tbl_t **obj, + apr_ssize_t *nelts, + apr_table_t *table) +{ + const apr_array_header_t *elts_arr = apr_table_elts(table); + apr_table_entry_t *elts = (apr_table_entry_t *) elts_arr->elts; + apr_ssize_t i; + apr_size_t len = 0; + apr_size_t idx = 0; + char *buf; + + *nelts = elts_arr->nelts; + if (*nelts == 0 ) { + *obj=NULL; + return APR_SUCCESS; + } + *obj = malloc(sizeof(cache_header_tbl_t) * elts_arr->nelts); + if (NULL == *obj) { + return APR_ENOMEM; + } + for (i = 0; i < elts_arr->nelts; ++i) { + len += strlen(elts[i].key); + len += strlen(elts[i].val); + len += 2; /* Extra space for NULL string terminator for key and val */ + } + + /* Transfer the headers into a contiguous memory block */ + buf = malloc(len); + if (!buf) { + *obj = NULL; + return APR_ENOMEM; + } + + for (i = 0; i < *nelts; ++i) { + (*obj)[i].hdr = &buf[idx]; + len = strlen(elts[i].key) + 1; /* Include NULL terminator */ + memcpy(&buf[idx], elts[i].key, len); + idx+=len; + + (*obj)[i].val = &buf[idx]; + len = strlen(elts[i].val) + 1; + memcpy(&buf[idx], elts[i].val, len); + idx+=len; + } + return APR_SUCCESS; +} +static int unserialize_table( cache_header_tbl_t *ctbl, + int num_headers, + apr_table_t *t ) +{ + int i; + + for (i = 0; i < num_headers; ++i) { + apr_table_addn(t, ctbl[i].hdr, ctbl[i].val); + } + + return APR_SUCCESS; +} +/* Define request processing hook handlers */ +/* remove_url() + * Notes: + */ +static int remove_url(const char *key) +{ + cache_object_t *obj; + int cleanup = 0; + + if (sconf->lock) { + apr_thread_mutex_lock(sconf->lock); + } + + obj = cache_find(sconf->cache_cache, key); + if (obj) { + cache_remove(sconf->cache_cache, obj); + /* For performance, cleanup cache object after releasing the lock */ + cleanup = !apr_atomic_dec(&obj->refcount); + } + if (sconf->lock) { + apr_thread_mutex_unlock(sconf->lock); + } + + if (cleanup) { + cleanup_cache_object(obj); + } + + return OK; +} + +static apr_status_t recall_headers(cache_handle_t *h, request_rec *r) +{ + int rc; + mem_cache_object_t *mobj = (mem_cache_object_t*) h->cache_obj->vobj; + + h->req_hdrs = apr_table_make(r->pool, mobj->num_req_hdrs); + h->resp_hdrs = apr_table_make(r->pool, mobj->num_header_out); + h->resp_err_hdrs = apr_table_make(r->pool, mobj->num_err_header_out); + /* ### FIXME: These two items should not be saved. */ + r->subprocess_env = apr_table_make(r->pool, mobj->num_subprocess_env); + r->notes = apr_table_make(r->pool, mobj->num_notes); + + rc = unserialize_table(mobj->req_hdrs, + mobj->num_req_hdrs, + h->req_hdrs); + rc = unserialize_table( mobj->header_out, + mobj->num_header_out, + h->resp_hdrs); + rc = unserialize_table( mobj->err_header_out, + mobj->num_err_header_out, + h->resp_err_hdrs); + rc = unserialize_table( mobj->subprocess_env, + mobj->num_subprocess_env, + r->subprocess_env); + rc = unserialize_table( mobj->notes, + mobj->num_notes, + r->notes); + + /* Content-Type: header may not be set if content is local since + * CACHE_IN runs before header filters.... + */ + h->content_type = h->cache_obj->info.content_type; + h->status = h->cache_obj->info.status; + + return rc; +} + +static apr_status_t recall_body(cache_handle_t *h, apr_pool_t *p, apr_bucket_brigade *bb) +{ + apr_bucket *b; + mem_cache_object_t *mobj = (mem_cache_object_t*) h->cache_obj->vobj; + + if (mobj->type == CACHE_TYPE_FILE) { + /* CACHE_TYPE_FILE */ + apr_file_t *file; + apr_os_file_put(&file, &mobj->fd, mobj->flags, p); + b = apr_bucket_file_create(file, 0, mobj->m_len, p, bb->bucket_alloc); + } + else { + /* CACHE_TYPE_HEAP */ + b = apr_bucket_immortal_create(mobj->m, mobj->m_len, bb->bucket_alloc); + } + APR_BRIGADE_INSERT_TAIL(bb, b); + b = apr_bucket_eos_create(bb->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, b); + + return APR_SUCCESS; +} + + +static apr_status_t store_headers(cache_handle_t *h, request_rec *r, cache_info *info) +{ + cache_object_t *obj = h->cache_obj; + mem_cache_object_t *mobj = (mem_cache_object_t*) obj->vobj; + int rc; + + /* + * The cache needs to keep track of the following information: + * - Date, LastMod, Version, ReqTime, RespTime, ContentLength + * - The original request headers (for Vary) + * - The original response headers (for returning with a cached response) + * - The body of the message + */ + rc = serialize_table(&mobj->req_hdrs, + &mobj->num_req_hdrs, + r->headers_in); + if (rc != APR_SUCCESS) { + return rc; + } + + /* Precompute how much storage we need to hold the headers */ + rc = serialize_table(&mobj->header_out, + &mobj->num_header_out, + ap_cache_cacheable_hdrs_out(r->pool, r->headers_out, + r->server)); + if (rc != APR_SUCCESS) { + return rc; + } + rc = serialize_table(&mobj->err_header_out, + &mobj->num_err_header_out, + ap_cache_cacheable_hdrs_out(r->pool, + r->err_headers_out, + r->server)); + if (rc != APR_SUCCESS) { + return rc; + } + rc = serialize_table(&mobj->subprocess_env, + &mobj->num_subprocess_env, + r->subprocess_env ); + if (rc != APR_SUCCESS) { + return rc; + } + + rc = serialize_table(&mobj->notes, &mobj->num_notes, r->notes); + if (rc != APR_SUCCESS) { + return rc; + } + + /* Init the info struct */ + obj->info.status = info->status; + if (info->date) { + obj->info.date = info->date; + } + if (info->lastmod) { + obj->info.lastmod = info->lastmod; + } + if (info->response_time) { + obj->info.response_time = info->response_time; + } + if (info->request_time) { + obj->info.request_time = info->request_time; + } + if (info->expire) { + obj->info.expire = info->expire; + } + if (info->content_type) { + apr_size_t len = strlen(info->content_type) + 1; + obj->info.content_type = (char*) malloc(len); + if (!obj->info.content_type) { + return APR_ENOMEM; + } + memcpy(obj->info.content_type, info->content_type, len); + } + if (info->etag) { + apr_size_t len = strlen(info->etag) + 1; + obj->info.etag = (char*) malloc(len); + if (!obj->info.etag) { + return APR_ENOMEM; + } + memcpy(obj->info.etag, info->etag, len); + } + if (info->lastmods) { + apr_size_t len = strlen(info->lastmods) + 1; + obj->info.lastmods = (char*) malloc(len); + if (!obj->info.lastmods) { + return APR_ENOMEM; + } + memcpy(obj->info.lastmods, info->lastmods, len); + } + if ( info->filename) { + apr_size_t len = strlen(info->filename) + 1; + obj->info.filename = (char*) malloc(len); + if (!obj->info.filename ) { + return APR_ENOMEM; + } + memcpy(obj->info.filename, info->filename, len); + } + + return APR_SUCCESS; +} + +static apr_status_t store_body(cache_handle_t *h, request_rec *r, apr_bucket_brigade *b) +{ + apr_status_t rv; + cache_object_t *obj = h->cache_obj; + cache_object_t *tobj = NULL; + mem_cache_object_t *mobj = (mem_cache_object_t*) obj->vobj; + apr_read_type_e eblock = APR_BLOCK_READ; + apr_bucket *e; + char *cur; + int eos = 0; + + if (mobj->type == CACHE_TYPE_FILE) { + apr_file_t *file = NULL; + int fd = 0; + int other = 0; + + /* We can cache an open file descriptor if: + * - the brigade contains one and only one file_bucket && + * - the brigade is complete && + * - the file_bucket is the last data bucket in the brigade + */ + for (e = APR_BRIGADE_FIRST(b); + e != APR_BRIGADE_SENTINEL(b); + e = APR_BUCKET_NEXT(e)) + { + if (APR_BUCKET_IS_EOS(e)) { + eos = 1; + } + else if (APR_BUCKET_IS_FILE(e)) { + apr_bucket_file *a = e->data; + fd++; + file = a->fd; + } + else { + other++; + } + } + if (fd == 1 && !other && eos) { + apr_file_t *tmpfile; + const char *name; + /* Open a new XTHREAD handle to the file */ + apr_file_name_get(&name, file); + mobj->flags = ((APR_SENDFILE_ENABLED & apr_file_flags_get(file)) + | APR_READ | APR_BINARY | APR_XTHREAD | APR_FILE_NOCLEANUP); + rv = apr_file_open(&tmpfile, name, mobj->flags, + APR_OS_DEFAULT, r->pool); + if (rv != APR_SUCCESS) { + return rv; + } + apr_file_inherit_unset(tmpfile); + apr_os_file_get(&(mobj->fd), tmpfile); + + /* Open for business */ + ap_log_error(APLOG_MARK, APLOG_INFO, 0, r->server, + "mem_cache: Cached file: %s with key: %s", name, obj->key); + obj->complete = 1; + return APR_SUCCESS; + } + + /* Content not suitable for fd caching. Cache in-memory instead. */ + mobj->type = CACHE_TYPE_HEAP; + } + + /* + * FD cacheing is not enabled or the content was not + * suitable for fd caching. + */ + if (mobj->m == NULL) { + mobj->m = malloc(mobj->m_len); + if (mobj->m == NULL) { + return APR_ENOMEM; + } + obj->count = 0; + } + cur = (char*) mobj->m + obj->count; + + /* Iterate accross the brigade and populate the cache storage */ + for (e = APR_BRIGADE_FIRST(b); + e != APR_BRIGADE_SENTINEL(b); + e = APR_BUCKET_NEXT(e)) + { + const char *s; + apr_size_t len; + + if (APR_BUCKET_IS_EOS(e)) { + if (mobj->m_len > obj->count) { + /* Caching a streamed response. Reallocate a buffer of the + * correct size and copy the streamed response into that + * buffer */ + char *buf = malloc(obj->count); + if (!buf) { + return APR_ENOMEM; + } + memcpy(buf, mobj->m, obj->count); + free(mobj->m); + mobj->m = buf; + + /* Now comes the crufty part... there is no way to tell the + * cache that the size of the object has changed. We need + * to remove the object, update the size and re-add the + * object, all under protection of the lock. + */ + if (sconf->lock) { + apr_thread_mutex_lock(sconf->lock); + } + /* Has the object been ejected from the cache? + */ + tobj = (cache_object_t *) cache_find(sconf->cache_cache, obj->key); + if (tobj == obj) { + /* Object is still in the cache, remove it, update the len field then + * replace it under protection of sconf->lock. + */ + cache_remove(sconf->cache_cache, obj); + /* For illustration, cache no longer has reference to the object + * so decrement the refcount + * apr_atomic_dec(&obj->refcount); + */ + mobj->m_len = obj->count; + + cache_insert(sconf->cache_cache, obj); + /* For illustration, cache now has reference to the object, so + * increment the refcount + * apr_atomic_inc(&obj->refcount); + */ + } + else if (tobj) { + /* Different object with the same key found in the cache. Doing nothing + * here will cause the object refcount to drop to 0 in decrement_refcount + * and the object will be cleaned up. + */ + + } else { + /* Object has been ejected from the cache, add it back to the cache */ + mobj->m_len = obj->count; + cache_insert(sconf->cache_cache, obj); + apr_atomic_inc(&obj->refcount); + } + + if (sconf->lock) { + apr_thread_mutex_unlock(sconf->lock); + } + } + /* Open for business */ + ap_log_error(APLOG_MARK, APLOG_INFO, 0, r->server, + "mem_cache: Cached url: %s", obj->key); + obj->complete = 1; + break; + } + rv = apr_bucket_read(e, &s, &len, eblock); + if (rv != APR_SUCCESS) { + return rv; + } + if (len) { + /* Check for buffer overflow */ + if ((obj->count + len) > mobj->m_len) { + return APR_ENOMEM; + } + else { + memcpy(cur, s, len); + cur+=len; + obj->count+=len; + } + } + /* This should not fail, but if it does, we are in BIG trouble + * cause we just stomped all over the heap. + */ + AP_DEBUG_ASSERT(obj->count <= mobj->m_len); + } + return APR_SUCCESS; +} +/** + * Configuration and start-up + */ +static int mem_cache_post_config(apr_pool_t *p, apr_pool_t *plog, + apr_pool_t *ptemp, server_rec *s) +{ + int threaded_mpm; + + /* Sanity check the cache configuration */ + if (sconf->min_cache_object_size >= sconf->max_cache_object_size) { + ap_log_error(APLOG_MARK, APLOG_CRIT, 0, s, + "MCacheMaxObjectSize must be greater than MCacheMinObjectSize"); + return DONE; + } + if (sconf->max_cache_object_size >= sconf->max_cache_size) { + ap_log_error(APLOG_MARK, APLOG_CRIT, 0, s, + "MCacheSize must be greater than MCacheMaxObjectSize"); + return DONE; + } + if (sconf->max_streaming_buffer_size > sconf->max_cache_object_size) { + /* Issue a notice only if something other than the default config + * is being used */ + if (sconf->max_streaming_buffer_size != DEFAULT_MAX_STREAMING_BUFFER_SIZE && + sconf->max_cache_object_size != DEFAULT_MAX_CACHE_OBJECT_SIZE) { + ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, s, + "MCacheMaxStreamingBuffer must be less than or equal to MCacheMaxObjectSize. " + "Resetting MCacheMaxStreamingBuffer to MCacheMaxObjectSize."); + } + sconf->max_streaming_buffer_size = sconf->max_cache_object_size; + } + if (sconf->max_streaming_buffer_size < sconf->min_cache_object_size) { + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s, + "MCacheMaxStreamingBuffer must be greater than or equal to MCacheMinObjectSize. " + "Resetting MCacheMaxStreamingBuffer to MCacheMinObjectSize."); + sconf->max_streaming_buffer_size = sconf->min_cache_object_size; + } + ap_mpm_query(AP_MPMQ_IS_THREADED, &threaded_mpm); + if (threaded_mpm) { + apr_thread_mutex_create(&sconf->lock, APR_THREAD_MUTEX_DEFAULT, p); + } + + sconf->cache_cache = cache_init(sconf->max_object_cnt, + sconf->max_cache_size, + memcache_get_priority, + sconf->cache_remove_algorithm, + memcache_get_pos, + memcache_set_pos, + memcache_inc_frequency, + memcache_cache_get_size, + memcache_cache_get_key, + memcache_cache_free); + apr_pool_cleanup_register(p, sconf, cleanup_cache_mem, apr_pool_cleanup_null); + + if (sconf->cache_cache) + return OK; + + return -1; + +} + +static const char +*set_max_cache_size(cmd_parms *parms, void *in_struct_ptr, const char *arg) +{ + apr_size_t val; + + if (sscanf(arg, "%" APR_SIZE_T_FMT, &val) != 1) { + return "MCacheSize argument must be an integer representing the max cache size in KBytes."; + } + sconf->max_cache_size = val*1024; + return NULL; +} +static const char +*set_min_cache_object_size(cmd_parms *parms, void *in_struct_ptr, const char *arg) +{ + apr_size_t val; + + if (sscanf(arg, "%" APR_SIZE_T_FMT, &val) != 1) { + return "MCacheMinObjectSize value must be an integer (bytes)"; + } + sconf->min_cache_object_size = val; + return NULL; +} +static const char +*set_max_cache_object_size(cmd_parms *parms, void *in_struct_ptr, const char *arg) +{ + apr_size_t val; + + if (sscanf(arg, "%" APR_SIZE_T_FMT, &val) != 1) { + return "MCacheMaxObjectSize value must be an integer (bytes)"; + } + sconf->max_cache_object_size = val; + return NULL; +} +static const char +*set_max_object_count(cmd_parms *parms, void *in_struct_ptr, const char *arg) +{ + apr_size_t val; + + if (sscanf(arg, "%" APR_SIZE_T_FMT, &val) != 1) { + return "MCacheMaxObjectCount value must be an integer"; + } + sconf->max_object_cnt = val; + return NULL; +} + +static const char +*set_cache_removal_algorithm(cmd_parms *parms, void *name, const char *arg) +{ + if (strcasecmp("LRU", arg)) { + sconf->cache_remove_algorithm = memcache_lru_algorithm; + } + else { + if (strcasecmp("GDSF", arg)) { + sconf->cache_remove_algorithm = memcache_gdsf_algorithm; + } + else { + return "currently implemented algorithms are LRU and GDSF"; + } + } + return NULL; +} + +static const char *set_max_streaming_buffer(cmd_parms *parms, void *dummy, + const char *arg) +{ +#if 0 + char *err; + if (apr_strtoff(&sconf->max_streaming_buffer_size, arg, &err, 10) || *err) { + return "MCacheMaxStreamingBuffer value must be a number"; + } +#else + sconf->max_streaming_buffer_size = apr_atoi64(arg); +#endif + return NULL; +} + +static const command_rec cache_cmds[] = +{ + AP_INIT_TAKE1("MCacheSize", set_max_cache_size, NULL, RSRC_CONF, + "The maximum amount of memory used by the cache in KBytes"), + AP_INIT_TAKE1("MCacheMaxObjectCount", set_max_object_count, NULL, RSRC_CONF, + "The maximum number of objects allowed to be placed in the cache"), + AP_INIT_TAKE1("MCacheMinObjectSize", set_min_cache_object_size, NULL, RSRC_CONF, + "The minimum size (in bytes) of an object to be placed in the cache"), + AP_INIT_TAKE1("MCacheMaxObjectSize", set_max_cache_object_size, NULL, RSRC_CONF, + "The maximum size (in bytes) of an object to be placed in the cache"), + AP_INIT_TAKE1("MCacheRemovalAlgorithm", set_cache_removal_algorithm, NULL, RSRC_CONF, + "The algorithm used to remove entries from the cache (default: GDSF)"), + AP_INIT_TAKE1("MCacheMaxStreamingBuffer", set_max_streaming_buffer, NULL, RSRC_CONF, + "Maximum number of bytes of content to buffer for a streamed response"), + {NULL} +}; + +static const cache_provider cache_mem_provider = +{ + &remove_entity, + &store_headers, + &store_body, + &recall_headers, + &recall_body, + &create_mem_entity, + &open_entity, + &remove_url, +}; + +static const cache_provider cache_fd_provider = +{ + &remove_entity, + &store_headers, + &store_body, + &recall_headers, + &recall_body, + &create_fd_entity, + &open_entity, + &remove_url, +}; + +static void register_hooks(apr_pool_t *p) +{ + ap_hook_post_config(mem_cache_post_config, NULL, NULL, APR_HOOK_MIDDLE); + /* cache initializer */ + /* cache_hook_init(cache_mem_init, NULL, NULL, APR_HOOK_MIDDLE); */ + /* + cache_hook_create_entity(create_entity, NULL, NULL, APR_HOOK_MIDDLE); + cache_hook_open_entity(open_entity, NULL, NULL, APR_HOOK_MIDDLE); + cache_hook_remove_url(remove_url, NULL, NULL, APR_HOOK_MIDDLE); + */ + ap_register_provider(p, CACHE_PROVIDER_GROUP, "mem", "0", + &cache_mem_provider); + ap_register_provider(p, CACHE_PROVIDER_GROUP, "fd", "0", + &cache_fd_provider); +} + +module AP_MODULE_DECLARE_DATA mem_cache_module = +{ + STANDARD20_MODULE_STUFF, + NULL, /* create per-directory config structure */ + NULL, /* merge per-directory config structures */ + create_cache_config, /* create per-server config structure */ + NULL, /* merge per-server config structures */ + cache_cmds, /* command apr_table_t */ + register_hooks +}; diff --git a/rubbos/app/httpd-2.0.64/modules/experimental/mod_mem_cache.dsp b/rubbos/app/httpd-2.0.64/modules/experimental/mod_mem_cache.dsp new file mode 100644 index 00000000..98a27b76 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/experimental/mod_mem_cache.dsp @@ -0,0 +1,128 @@ +# Microsoft Developer Studio Project File - Name="mod_mem_cache" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=mod_mem_cache - 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 "mod_mem_cache.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 "mod_mem_cache.mak" CFG="mod_mem_cache - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "mod_mem_cache - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_mem_cache - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "mod_mem_cache - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "mod_mem_cache_EXPORTS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../../srclib/apr-util/include" /I "../../srclib/apr/include" /I "../../include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_mem_cache_src" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Release/mod_mem_cache.so" /base:@..\..\os\win32\BaseAddr.ref,mod_mem_cache.so /opt:ref + +!ELSEIF "$(CFG)" == "mod_mem_cache - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../../srclib/apr-util/include" /I "../../srclib/apr/include" /I "../../include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_mem_cache_src" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_mem_cache.so" /base:@..\..\os\win32\BaseAddr.ref,mod_mem_cache.so + +!ENDIF + +# Begin Target + +# Name "mod_mem_cache - Win32 Release" +# Name "mod_mem_cache - Win32 Debug" +# Begin Source File + +SOURCE=.\mod_cache.h +# End Source File +# Begin Source File + +SOURCE=.\mod_mem_cache.c +# End Source File +# Begin Source File + +SOURCE=..\..\build\win32\win32ver.awk + +!IF "$(CFG)" == "mod_mem_cache - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_mem_cache.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_mem_cache.so "mem_cache_module for Apache" ../../include/ap_release.h > .\mod_mem_cache.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "mod_mem_cache - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_mem_cache.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_mem_cache.so "mem_cache_module for Apache" ../../include/ap_release.h > .\mod_mem_cache.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/modules/experimental/modules.mk b/rubbos/app/httpd-2.0.64/modules/experimental/modules.mk new file mode 100644 index 00000000..ceb52a1b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/experimental/modules.mk @@ -0,0 +1,3 @@ +DISTCLEAN_TARGETS = modules.mk +static = +shared = diff --git a/rubbos/app/httpd-2.0.64/modules/experimental/util_ldap.c b/rubbos/app/httpd-2.0.64/modules/experimental/util_ldap.c new file mode 100644 index 00000000..adaccb32 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/experimental/util_ldap.c @@ -0,0 +1,1758 @@ +/* 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. + */ + +/* + * util_ldap.c: LDAP things + * + * Original code from auth_ldap module for Apache v1.3: + * Copyright 1998, 1999 Enbridge Pipelines Inc. + * Copyright 1999-2001 Dave Carrigan + */ + +#include +#include + +#include "ap_config.h" +#include "httpd.h" +#include "http_config.h" +#include "http_core.h" +#include "http_log.h" +#include "http_protocol.h" +#include "http_request.h" +#include "util_ldap.h" +#include "util_ldap_cache.h" + +#if APR_HAVE_UNISTD_H +#include +#endif + +#ifndef APU_HAS_LDAP +#error mod_ldap requires APR-util to have LDAP support built in +#endif + +#if !defined(OS2) && !defined(WIN32) && !defined(BEOS) && !defined(NETWARE) +#include "unixd.h" +#define UTIL_LDAP_SET_MUTEX_PERMS +#endif + + /* defines for certificate file types + */ +#define LDAP_CA_TYPE_UNKNOWN 0 +#define LDAP_CA_TYPE_DER 1 +#define LDAP_CA_TYPE_BASE64 2 +#define LDAP_CA_TYPE_CERT7_DB 3 + + +module AP_MODULE_DECLARE_DATA ldap_module; + +int util_ldap_handler(request_rec *r); +void *util_ldap_create_config(apr_pool_t *p, server_rec *s); + + +/* + * Some definitions to help between various versions of apache. + */ + +#ifndef DOCTYPE_HTML_2_0 +#define DOCTYPE_HTML_2_0 "\n" +#endif + +#ifndef DOCTYPE_HTML_3_2 +#define DOCTYPE_HTML_3_2 "\n" +#endif + +#ifndef DOCTYPE_HTML_4_0S +#define DOCTYPE_HTML_4_0S "\n" +#endif + +#ifndef DOCTYPE_HTML_4_0T +#define DOCTYPE_HTML_4_0T "\n" +#endif + +#ifndef DOCTYPE_HTML_4_0F +#define DOCTYPE_HTML_4_0F "\n" +#endif + +#define LDAP_CACHE_LOCK() \ + if (st->util_ldap_cache_lock) \ + apr_global_mutex_lock(st->util_ldap_cache_lock) +#define LDAP_CACHE_UNLOCK() \ + if (st->util_ldap_cache_lock) \ + apr_global_mutex_unlock(st->util_ldap_cache_lock) + + +static void util_ldap_strdup (char **str, const char *newstr) +{ + if (*str) { + free(*str); + *str = NULL; + } + + if (newstr) { + *str = calloc(1, strlen(newstr)+1); + strcpy (*str, newstr); + } +} + +/* + * Status Handler + * -------------- + * + * This handler generates a status page about the current performance of + * the LDAP cache. It is enabled as follows: + * + * + * SetHandler ldap-status + * + * + */ +int util_ldap_handler(request_rec *r) +{ + util_ldap_state_t *st = (util_ldap_state_t *)ap_get_module_config(r->server->module_config, &ldap_module); + + r->allowed |= (1 << M_GET); + if (r->method_number != M_GET) + return DECLINED; + + if (strcmp(r->handler, "ldap-status")) { + return DECLINED; + } + + r->content_type = "text/html; charset=ISO-8859-1"; + if (r->header_only) + return OK; + + ap_rputs(DOCTYPE_HTML_3_2 + "LDAP Cache Information\n", r); + ap_rputs("

    LDAP Cache Information

    \n", r); + + util_ald_cache_display(r, st); + + return OK; +} + +/* ------------------------------------------------------------------ */ + + +/* + * Closes an LDAP connection by unlocking it. The next time + * util_ldap_connection_find() is called this connection will be + * available for reuse. + */ +LDAP_DECLARE(void) util_ldap_connection_close(util_ldap_connection_t *ldc) +{ + + /* + * QUESTION: + * + * Is it safe leaving bound connections floating around between the + * different modules? Keeping the user bound is a performance boost, + * but it is also a potential security problem - maybe. + * + * For now we unbind the user when we finish with a connection, but + * we don't have to... + */ + + /* mark our connection as available for reuse */ + +#if APR_HAS_THREADS + apr_thread_mutex_unlock(ldc->lock); +#endif +} + + +/* + * Destroys an LDAP connection by unbinding and closing the connection to + * the LDAP server. It is used to bring the connection back to a known + * state after an error, and during pool cleanup. + */ +LDAP_DECLARE_NONSTD(apr_status_t) util_ldap_connection_unbind(void *param) +{ + util_ldap_connection_t *ldc = param; + + if (ldc) { + if (ldc->ldap) { + ldap_unbind_s(ldc->ldap); + ldc->ldap = NULL; + } + ldc->bound = 0; + } + + return APR_SUCCESS; +} + + +/* + * Clean up an LDAP connection by unbinding and unlocking the connection. + * This function is registered with the pool cleanup function - causing + * the LDAP connections to be shut down cleanly on graceful restart. + */ +LDAP_DECLARE_NONSTD(apr_status_t) util_ldap_connection_cleanup(void *param) +{ + util_ldap_connection_t *ldc = param; + + if (ldc) { + + /* unbind and disconnect from the LDAP server */ + util_ldap_connection_unbind(ldc); + + /* free the username and password */ + if (ldc->bindpw) { + free((void*)ldc->bindpw); + } + if (ldc->binddn) { + free((void*)ldc->binddn); + } + + /* unlock this entry */ + util_ldap_connection_close(ldc); + + } + + return APR_SUCCESS; +} + + +/* + * Connect to the LDAP server and binds. Does not connect if already + * connected (i.e. ldc->ldap is non-NULL.) Does not bind if already bound. + * + * Returns LDAP_SUCCESS on success; and an error code on failure + */ +LDAP_DECLARE(int) util_ldap_connection_open(request_rec *r, + util_ldap_connection_t *ldc) +{ + int result = 0; + int failures = 0; + int version = LDAP_VERSION3; + int rc = LDAP_SUCCESS; + struct timeval timeOut = {10,0}; /* 10 second connection timeout */ + + util_ldap_state_t *st = (util_ldap_state_t *)ap_get_module_config( + r->server->module_config, &ldap_module); + + /* If the connection is already bound, return + */ + if (ldc->bound) + { + ldc->reason = "LDAP: connection open successful (already bound)"; + return LDAP_SUCCESS; + } + + /* create the ldap session handle + */ + if (NULL == ldc->ldap) + { + /* clear connection requested */ + if (!ldc->secure) + { + ldc->ldap = ldap_init(const_cast(ldc->host), ldc->port); + } + else /* ssl connnection requested */ + { + /* check configuration to make sure it supports SSL + */ + if (st->ssl_support) + { + #if APR_HAS_LDAP_SSL + + #if APR_HAS_NOVELL_LDAPSDK + ldc->ldap = ldapssl_init(ldc->host, ldc->port, 1); + + #elif APR_HAS_NETSCAPE_LDAPSDK + ldc->ldap = ldapssl_init(ldc->host, ldc->port, 1); + + #elif APR_HAS_OPENLDAP_LDAPSDK + ldc->ldap = ldap_init(ldc->host, ldc->port); + if (NULL != ldc->ldap) + { + int SSLmode = LDAP_OPT_X_TLS_HARD; + result = ldap_set_option(ldc->ldap, LDAP_OPT_X_TLS, &SSLmode); + if (LDAP_SUCCESS != result) + { + ldap_unbind_s(ldc->ldap); + ldc->reason = "LDAP: ldap_set_option - LDAP_OPT_X_TLS_HARD failed"; + ldc->ldap = NULL; + } + } + + #elif APR_HAS_MICROSOFT_LDAPSDK + ldc->ldap = ldap_sslinit(const_cast(ldc->host), ldc->port, 1); + + #else + ldc->reason = "LDAP: ssl connections not supported"; + #endif /* APR_HAS_NOVELL_LDAPSDK */ + + #endif /* APR_HAS_LDAP_SSL */ + } + else + ldc->reason = "LDAP: ssl connections not supported"; + } + + if (NULL == ldc->ldap) + { + ldc->bound = 0; + if (NULL == ldc->reason) + ldc->reason = "LDAP: ldap initialization failed"; + return(-1); + } + + /* Set the alias dereferencing option */ + ldap_set_option(ldc->ldap, LDAP_OPT_DEREF, &(ldc->deref)); + + /* always default to LDAP V3 */ + ldap_set_option(ldc->ldap, LDAP_OPT_PROTOCOL_VERSION, &version); + +#ifdef LDAP_OPT_NETWORK_TIMEOUT + if (st->connectionTimeout > 0) { + timeOut.tv_sec = st->connectionTimeout; + } + + if (st->connectionTimeout >= 0) { + rc = ldap_set_option(ldc->ldap, LDAP_OPT_NETWORK_TIMEOUT, (void *)&timeOut); + if (APR_SUCCESS != rc) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server, + "LDAP: Could not set the connection timeout" ); + } + } +#endif + } + + + /* loop trying to bind up to 10 times if LDAP_SERVER_DOWN error is + * returned. Break out of the loop on Success or any other error. + * + * NOTE: Looping is probably not a great idea. If the server isn't + * responding the chances it will respond after a few tries are poor. + * However, the original code looped and it only happens on + * the error condition. + */ + for (failures=0; failures<10; failures++) + { + result = ldap_simple_bind_s(ldc->ldap, const_cast(ldc->binddn), const_cast(ldc->bindpw)); + if (LDAP_SERVER_DOWN != result) + break; + } + + /* free the handle if there was an error + */ + if (LDAP_SUCCESS != result) + { + ldap_unbind_s(ldc->ldap); + ldc->ldap = NULL; + ldc->bound = 0; + ldc->reason = "LDAP: ldap_simple_bind_s() failed"; + } + else { + ldc->bound = 1; + ldc->reason = "LDAP: connection open successful"; + } + + return(result); +} + + +/* + * Find an existing ldap connection struct that matches the + * provided ldap connection parameters. + * + * If not found in the cache, a new ldc structure will be allocated from st->pool + * and returned to the caller. If found in the cache, a pointer to the existing + * ldc structure will be returned. + */ +LDAP_DECLARE(util_ldap_connection_t *)util_ldap_connection_find(request_rec *r, const char *host, int port, + const char *binddn, const char *bindpw, deref_options deref, + int secure ) +{ + struct util_ldap_connection_t *l, *p; /* To traverse the linked list */ + + util_ldap_state_t *st = + (util_ldap_state_t *)ap_get_module_config(r->server->module_config, + &ldap_module); + + +#if APR_HAS_THREADS + /* mutex lock this function */ + apr_thread_mutex_lock(st->mutex); +#endif + + /* Search for an exact connection match in the list that is not + * being used. + */ + for (l=st->connections,p=NULL; l; l=l->next) { +#if APR_HAS_THREADS + if (APR_SUCCESS == apr_thread_mutex_trylock(l->lock)) { +#endif + if ((l->port == port) && (strcmp(l->host, host) == 0) && + ((!l->binddn && !binddn) || (l->binddn && binddn && !strcmp(l->binddn, binddn))) && + ((!l->bindpw && !bindpw) || (l->bindpw && bindpw && !strcmp(l->bindpw, bindpw))) && + (l->deref == deref) && (l->secure == secure)) { + + break; + } +#if APR_HAS_THREADS + /* If this connection didn't match the criteria, then we + * need to unlock the mutex so it is available to be reused. + */ + apr_thread_mutex_unlock(l->lock); + } +#endif + p = l; + } + + /* If nothing found, search again, but we don't care about the + * binddn and bindpw this time. + */ + if (!l) { + for (l=st->connections,p=NULL; l; l=l->next) { +#if APR_HAS_THREADS + if (APR_SUCCESS == apr_thread_mutex_trylock(l->lock)) { + +#endif + if ((l->port == port) && (strcmp(l->host, host) == 0) && + (l->deref == deref) && (l->secure == secure)) { + + /* the bind credentials have changed */ + l->bound = 0; + util_ldap_strdup((char**)&(l->binddn), binddn); + util_ldap_strdup((char**)&(l->bindpw), bindpw); + break; + } +#if APR_HAS_THREADS + /* If this connection didn't match the criteria, then we + * need to unlock the mutex so it is available to be reused. + */ + apr_thread_mutex_unlock(l->lock); + } +#endif + p = l; + } + } + +/* artificially disable cache */ +/* l = NULL; */ + + /* If no connection what found after the second search, we + * must create one. + */ + if (!l) { + + /* + * Add the new connection entry to the linked list. Note that we + * don't actually establish an LDAP connection yet; that happens + * the first time authentication is requested. + */ + /* create the details to the pool in st */ + l = apr_pcalloc(st->pool, sizeof(util_ldap_connection_t)); +#if APR_HAS_THREADS + apr_thread_mutex_create(&l->lock, APR_THREAD_MUTEX_DEFAULT, st->pool); + apr_thread_mutex_lock(l->lock); +#endif + l->pool = st->pool; + l->bound = 0; + l->host = apr_pstrdup(st->pool, host); + l->port = port; + l->deref = deref; + util_ldap_strdup((char**)&(l->binddn), binddn); + util_ldap_strdup((char**)&(l->bindpw), bindpw); + l->secure = secure; + + /* add the cleanup to the pool */ + apr_pool_cleanup_register(l->pool, l, + util_ldap_connection_cleanup, + apr_pool_cleanup_null); + + if (p) { + p->next = l; + } + else { + st->connections = l; + } + } + +#if APR_HAS_THREADS + apr_thread_mutex_unlock(st->mutex); +#endif + return l; +} + +/* ------------------------------------------------------------------ */ + +/* + * Compares two DNs to see if they're equal. The only way to do this correctly is to + * search for the dn and then do ldap_get_dn() on the result. This should match the + * initial dn, since it would have been also retrieved with ldap_get_dn(). This is + * expensive, so if the configuration value compare_dn_on_server is + * false, just does an ordinary strcmp. + * + * The lock for the ldap cache should already be acquired. + */ +LDAP_DECLARE(int) util_ldap_cache_comparedn(request_rec *r, util_ldap_connection_t *ldc, + const char *url, const char *dn, const char *reqdn, + int compare_dn_on_server) +{ + int result = 0; + util_url_node_t *curl; + util_url_node_t curnode; + util_dn_compare_node_t *node; + util_dn_compare_node_t newnode; + int failures = 0; + LDAPMessage *res, *entry; + char *searchdn; + + util_ldap_state_t *st = (util_ldap_state_t *)ap_get_module_config(r->server->module_config, &ldap_module); + + /* get cache entry (or create one) */ + LDAP_CACHE_LOCK(); + + curnode.url = url; + curl = util_ald_cache_fetch(st->util_ldap_cache, &curnode); + if (curl == NULL) { + curl = util_ald_create_caches(st, url); + } + LDAP_CACHE_UNLOCK(); + + /* a simple compare? */ + if (!compare_dn_on_server) { + /* unlock this read lock */ + if (strcmp(dn, reqdn)) { + ldc->reason = "DN Comparison FALSE (direct strcmp())"; + return LDAP_COMPARE_FALSE; + } + else { + ldc->reason = "DN Comparison TRUE (direct strcmp())"; + return LDAP_COMPARE_TRUE; + } + } + + if (curl) { + /* no - it's a server side compare */ + LDAP_CACHE_LOCK(); + + /* is it in the compare cache? */ + newnode.reqdn = (char *)reqdn; + node = util_ald_cache_fetch(curl->dn_compare_cache, &newnode); + if (node != NULL) { + /* If it's in the cache, it's good */ + /* unlock this read lock */ + LDAP_CACHE_UNLOCK(); + ldc->reason = "DN Comparison TRUE (cached)"; + return LDAP_COMPARE_TRUE; + } + + /* unlock this read lock */ + LDAP_CACHE_UNLOCK(); + } + +start_over: + if (failures++ > 10) { + /* too many failures */ + return result; + } + + /* make a server connection */ + if (LDAP_SUCCESS != (result = util_ldap_connection_open(r, ldc))) { + /* connect to server failed */ + return result; + } + + /* search for reqdn */ + if ((result = ldap_search_ext_s(ldc->ldap, const_cast(reqdn), LDAP_SCOPE_BASE, + "(objectclass=*)", NULL, 1, + NULL, NULL, NULL, -1, &res)) == LDAP_SERVER_DOWN) { + ldc->reason = "DN Comparison ldap_search_ext_s() failed with server down"; + util_ldap_connection_unbind(ldc); + goto start_over; + } + if (result != LDAP_SUCCESS) { + /* search for reqdn failed - no match */ + ldc->reason = "DN Comparison ldap_search_ext_s() failed"; + return result; + } + + entry = ldap_first_entry(ldc->ldap, res); + searchdn = ldap_get_dn(ldc->ldap, entry); + + ldap_msgfree(res); + if (strcmp(dn, searchdn) != 0) { + /* compare unsuccessful */ + ldc->reason = "DN Comparison FALSE (checked on server)"; + result = LDAP_COMPARE_FALSE; + } + else { + if (curl) { + /* compare successful - add to the compare cache */ + LDAP_CACHE_LOCK(); + newnode.reqdn = (char *)reqdn; + newnode.dn = (char *)dn; + + node = util_ald_cache_fetch(curl->dn_compare_cache, &newnode); + if ((node == NULL) || + (strcmp(reqdn, node->reqdn) != 0) || (strcmp(dn, node->dn) != 0)) { + + util_ald_cache_insert(curl->dn_compare_cache, &newnode); + } + LDAP_CACHE_UNLOCK(); + } + ldc->reason = "DN Comparison TRUE (checked on server)"; + result = LDAP_COMPARE_TRUE; + } + ldap_memfree(searchdn); + return result; + +} + +/* + * Does an generic ldap_compare operation. It accepts a cache that it will use + * to lookup the compare in the cache. We cache two kinds of compares + * (require group compares) and (require user compares). Each compare has a different + * cache node: require group includes the DN; require user does not because the + * require user cache is owned by the + * + */ +LDAP_DECLARE(int) util_ldap_cache_compare(request_rec *r, util_ldap_connection_t *ldc, + const char *url, const char *dn, + const char *attrib, const char *value) +{ + int result = 0; + util_url_node_t *curl; + util_url_node_t curnode; + util_compare_node_t *compare_nodep; + util_compare_node_t the_compare_node; + apr_time_t curtime = 0; /* silence gcc -Wall */ + int failures = 0; + + util_ldap_state_t *st = + (util_ldap_state_t *)ap_get_module_config(r->server->module_config, + &ldap_module); + + /* get cache entry (or create one) */ + LDAP_CACHE_LOCK(); + curnode.url = url; + curl = util_ald_cache_fetch(st->util_ldap_cache, &curnode); + if (curl == NULL) { + curl = util_ald_create_caches(st, url); + } + LDAP_CACHE_UNLOCK(); + + if (curl) { + /* make a comparison to the cache */ + LDAP_CACHE_LOCK(); + curtime = apr_time_now(); + + the_compare_node.dn = (char *)dn; + the_compare_node.attrib = (char *)attrib; + the_compare_node.value = (char *)value; + the_compare_node.result = 0; + + compare_nodep = util_ald_cache_fetch(curl->compare_cache, &the_compare_node); + + if (compare_nodep != NULL) { + /* found it... */ + if (curtime - compare_nodep->lastcompare > st->compare_cache_ttl) { + /* ...but it is too old */ + util_ald_cache_remove(curl->compare_cache, compare_nodep); + } + else { + /* ...and it is good */ + /* unlock this read lock */ + LDAP_CACHE_UNLOCK(); + if (LDAP_COMPARE_TRUE == compare_nodep->result) { + ldc->reason = "Comparison true (cached)"; + return compare_nodep->result; + } + else if (LDAP_COMPARE_FALSE == compare_nodep->result) { + ldc->reason = "Comparison false (cached)"; + return compare_nodep->result; + } + else if (LDAP_NO_SUCH_ATTRIBUTE == compare_nodep->result) { + ldc->reason = "Comparison no such attribute (cached)"; + return compare_nodep->result; + } + else { + ldc->reason = "Comparison undefined (cached)"; + return compare_nodep->result; + } + } + } + /* unlock this read lock */ + LDAP_CACHE_UNLOCK(); + } + +start_over: + if (failures++ > 10) { + /* too many failures */ + return result; + } + if (LDAP_SUCCESS != (result = util_ldap_connection_open(r, ldc))) { + /* connect failed */ + return result; + } + + if ((result = ldap_compare_s(ldc->ldap, const_cast(dn), const_cast(attrib), const_cast(value))) + == LDAP_SERVER_DOWN) { + /* connection failed - try again */ + ldc->reason = "ldap_compare_s() failed with server down"; + util_ldap_connection_unbind(ldc); + goto start_over; + } + + ldc->reason = "Comparison complete"; + if ((LDAP_COMPARE_TRUE == result) || + (LDAP_COMPARE_FALSE == result) || + (LDAP_NO_SUCH_ATTRIBUTE == result)) { + if (curl) { + /* compare completed; caching result */ + LDAP_CACHE_LOCK(); + the_compare_node.lastcompare = curtime; + the_compare_node.result = result; + + /* If the node doesn't exist then insert it, otherwise just update it with + the last results */ + compare_nodep = util_ald_cache_fetch(curl->compare_cache, &the_compare_node); + if ((compare_nodep == NULL) || + (strcmp(the_compare_node.dn, compare_nodep->dn) != 0) || + (strcmp(the_compare_node.attrib, compare_nodep->attrib) != 0) || + (strcmp(the_compare_node.value, compare_nodep->value) != 0)) { + + util_ald_cache_insert(curl->compare_cache, &the_compare_node); + } + else { + compare_nodep->lastcompare = curtime; + compare_nodep->result = result; + } + LDAP_CACHE_UNLOCK(); + } + if (LDAP_COMPARE_TRUE == result) { + ldc->reason = "Comparison true (adding to cache)"; + return LDAP_COMPARE_TRUE; + } + else if (LDAP_COMPARE_FALSE == result) { + ldc->reason = "Comparison false (adding to cache)"; + return LDAP_COMPARE_FALSE; + } + else { + ldc->reason = "Comparison no such attribute (adding to cache)"; + return LDAP_NO_SUCH_ATTRIBUTE; + } + } + return result; +} + +LDAP_DECLARE(int) util_ldap_cache_checkuserid(request_rec *r, util_ldap_connection_t *ldc, + const char *url, const char *basedn, int scope, char **attrs, + const char *filter, const char *bindpw, const char **binddn, + const char ***retvals) +{ + const char **vals = NULL; + int numvals = 0; + int result = 0; + LDAPMessage *res, *entry; + char *dn; + int count; + int failures = 0; + util_url_node_t *curl; /* Cached URL node */ + util_url_node_t curnode; + util_search_node_t *search_nodep; /* Cached search node */ + util_search_node_t the_search_node; + apr_time_t curtime; + + util_ldap_state_t *st = + (util_ldap_state_t *)ap_get_module_config(r->server->module_config, + &ldap_module); + + /* Get the cache node for this url */ + LDAP_CACHE_LOCK(); + curnode.url = url; + curl = (util_url_node_t *)util_ald_cache_fetch(st->util_ldap_cache, &curnode); + if (curl == NULL) { + curl = util_ald_create_caches(st, url); + } + LDAP_CACHE_UNLOCK(); + + if (curl) { + LDAP_CACHE_LOCK(); + the_search_node.username = filter; + search_nodep = util_ald_cache_fetch(curl->search_cache, &the_search_node); + if (search_nodep != NULL) { + + /* found entry in search cache... */ + curtime = apr_time_now(); + + /* + * Remove this item from the cache if its expired. + * If the sent password doesn't match the stored password, + * the entry will be removed and readded later if the + * credentials pass authentication. + */ + if ((curtime - search_nodep->lastbind) > st->search_cache_ttl) { + /* ...but entry is too old */ + util_ald_cache_remove(curl->search_cache, search_nodep); + } + else if ((search_nodep->bindpw) && + (search_nodep->bindpw[0] != '\0') && + (strcmp(search_nodep->bindpw, bindpw) == 0)) { + /* ...and entry is valid */ + *binddn = search_nodep->dn; + *retvals = search_nodep->vals; + LDAP_CACHE_UNLOCK(); + ldc->reason = "Authentication successful (cached)"; + return LDAP_SUCCESS; + } + } + /* unlock this read lock */ + LDAP_CACHE_UNLOCK(); + } + + /* + * At this point, there is no valid cached search, so lets do the search. + */ + + /* + * If any LDAP operation fails due to LDAP_SERVER_DOWN, control returns here. + */ +start_over: + if (failures++ > 10) { + return result; + } + if (LDAP_SUCCESS != (result = util_ldap_connection_open(r, ldc))) { + return result; + } + + /* try do the search */ + if ((result = ldap_search_ext_s(ldc->ldap, + const_cast(basedn), scope, + const_cast(filter), attrs, 0, + NULL, NULL, NULL, -1, &res)) == LDAP_SERVER_DOWN) { + ldc->reason = "ldap_search_ext_s() for user failed with server down"; + util_ldap_connection_unbind(ldc); + goto start_over; + } + + /* if there is an error (including LDAP_NO_SUCH_OBJECT) return now */ + if (result != LDAP_SUCCESS) { + ldc->reason = "ldap_search_ext_s() for user failed"; + return result; + } + + /* + * We should have found exactly one entry; to find a different + * number is an error. + */ + count = ldap_count_entries(ldc->ldap, res); + if (count != 1) + { + if (count == 0 ) + ldc->reason = "User not found"; + else + ldc->reason = "User is not unique (search found two or more matches)"; + ldap_msgfree(res); + return LDAP_NO_SUCH_OBJECT; + } + + entry = ldap_first_entry(ldc->ldap, res); + + /* Grab the dn, copy it into the pool, and free it again */ + dn = ldap_get_dn(ldc->ldap, entry); + *binddn = apr_pstrdup(r->pool, dn); + ldap_memfree(dn); + + /* + * A bind to the server with an empty password always succeeds, so + * we check to ensure that the password is not empty. This implies + * that users who actually do have empty passwords will never be + * able to authenticate with this module. I don't see this as a big + * problem. + */ + if (!bindpw || strlen(bindpw) <= 0) { + ldap_msgfree(res); + ldc->reason = "Empty password not allowed"; + return LDAP_INVALID_CREDENTIALS; + } + + /* + * Attempt to bind with the retrieved dn and the password. If the bind + * fails, it means that the password is wrong (the dn obviously + * exists, since we just retrieved it) + */ + if ((result = + ldap_simple_bind_s(ldc->ldap, const_cast(*binddn), const_cast(bindpw))) == + LDAP_SERVER_DOWN) { + ldc->reason = "ldap_simple_bind_s() to check user credentials failed with server down"; + ldap_msgfree(res); + util_ldap_connection_unbind(ldc); + goto start_over; + } + + /* failure? if so - return */ + if (result != LDAP_SUCCESS) { + ldc->reason = "ldap_simple_bind_s() to check user credentials failed"; + ldap_msgfree(res); + util_ldap_connection_unbind(ldc); + return result; + } + else { + /* + * We have just bound the connection to a different user and password + * combination, which might be reused unintentionally next time this + * connection is used from the connection pool. To ensure no confusion, + * we mark the connection as unbound. + */ + ldc->bound = 0; + } + + /* + * Get values for the provided attributes. + */ + if (attrs) { + int k = 0; + int i = 0; + while (attrs[k++]); + vals = apr_pcalloc(r->pool, sizeof(char *) * (k+1)); + numvals = k; + while (attrs[i]) { + char **values; + int j = 0; + char *str = NULL; + /* get values */ + values = ldap_get_values(ldc->ldap, entry, attrs[i]); + while (values && values[j]) { + str = str ? apr_pstrcat(r->pool, str, "; ", values[j], NULL) : apr_pstrdup(r->pool, values[j]); + j++; + } + ldap_value_free(values); + vals[i] = str; + i++; + } + *retvals = vals; + } + + /* + * Add the new username to the search cache. + */ + if (curl) { + LDAP_CACHE_LOCK(); + the_search_node.username = filter; + the_search_node.dn = *binddn; + the_search_node.bindpw = bindpw; + the_search_node.lastbind = apr_time_now(); + the_search_node.vals = vals; + the_search_node.numvals = numvals; + + /* Search again to make sure that another thread didn't ready insert this node + into the cache before we got here. If it does exist then update the lastbind */ + search_nodep = util_ald_cache_fetch(curl->search_cache, &the_search_node); + if ((search_nodep == NULL) || + (strcmp(*binddn, search_nodep->dn) != 0)) { + + /* Nothing in cache, insert new entry */ + util_ald_cache_insert(curl->search_cache, &the_search_node); + } + else if ((!search_nodep->bindpw) || + (strcmp(bindpw, search_nodep->bindpw) != 0)) { + + /* Entry in cache is invalid, remove it and insert new one */ + util_ald_cache_remove(curl->search_cache, search_nodep); + util_ald_cache_insert(curl->search_cache, &the_search_node); + } + else { + /* Cache entry is valid, update lastbind */ + search_nodep->lastbind = the_search_node.lastbind; + } + LDAP_CACHE_UNLOCK(); + } + ldap_msgfree(res); + + ldc->reason = "Authentication successful"; + return LDAP_SUCCESS; +} + +/* + * This function will return the DN of the entry matching userid. + * It is used to get the DN in case some other module than mod_auth_ldap + * has authenticated the user. + * The function is basically a copy of util_ldap_cache_checkuserid + * with password checking removed. + */ +LDAP_DECLARE(int) util_ldap_cache_getuserdn(request_rec *r, util_ldap_connection_t *ldc, + const char *url, const char *basedn, int scope, char **attrs, + const char *filter, const char **binddn, + const char ***retvals) +{ + const char **vals = NULL; + int numvals = 0; + int result = 0; + LDAPMessage *res, *entry; + char *dn; + int count; + int failures = 0; + util_url_node_t *curl; /* Cached URL node */ + util_url_node_t curnode; + util_search_node_t *search_nodep; /* Cached search node */ + util_search_node_t the_search_node; + apr_time_t curtime; + + util_ldap_state_t *st = + (util_ldap_state_t *)ap_get_module_config(r->server->module_config, + &ldap_module); + + /* Get the cache node for this url */ + LDAP_CACHE_LOCK(); + curnode.url = url; + curl = (util_url_node_t *)util_ald_cache_fetch(st->util_ldap_cache, &curnode); + if (curl == NULL) { + curl = util_ald_create_caches(st, url); + } + LDAP_CACHE_UNLOCK(); + + if (curl) { + LDAP_CACHE_LOCK(); + the_search_node.username = filter; + search_nodep = util_ald_cache_fetch(curl->search_cache, &the_search_node); + if (search_nodep != NULL) { + + /* found entry in search cache... */ + curtime = apr_time_now(); + + /* + * Remove this item from the cache if its expired. + */ + if ((curtime - search_nodep->lastbind) > st->search_cache_ttl) { + /* ...but entry is too old */ + util_ald_cache_remove(curl->search_cache, search_nodep); + } + else { + /* ...and entry is valid */ + *binddn = search_nodep->dn; + *retvals = search_nodep->vals; + LDAP_CACHE_UNLOCK(); + ldc->reason = "Search successful (cached)"; + return LDAP_SUCCESS; + } + } + /* unlock this read lock */ + LDAP_CACHE_UNLOCK(); + } + + /* + * At this point, there is no valid cached search, so lets do the search. + */ + + /* + * If any LDAP operation fails due to LDAP_SERVER_DOWN, control returns here. + */ +start_over: + if (failures++ > 10) { + return result; + } + if (LDAP_SUCCESS != (result = util_ldap_connection_open(r, ldc))) { + return result; + } + + /* try do the search */ + if ((result = ldap_search_ext_s(ldc->ldap, + const_cast(basedn), scope, + const_cast(filter), attrs, 0, + NULL, NULL, NULL, -1, &res)) == LDAP_SERVER_DOWN) { + ldc->reason = "ldap_search_ext_s() for user failed with server down"; + util_ldap_connection_unbind(ldc); + goto start_over; + } + + /* if there is an error (including LDAP_NO_SUCH_OBJECT) return now */ + if (result != LDAP_SUCCESS) { + ldc->reason = "ldap_search_ext_s() for user failed"; + return result; + } + + /* + * We should have found exactly one entry; to find a different + * number is an error. + */ + count = ldap_count_entries(ldc->ldap, res); + if (count != 1) + { + if (count == 0 ) + ldc->reason = "User not found"; + else + ldc->reason = "User is not unique (search found two or more matches)"; + ldap_msgfree(res); + return LDAP_NO_SUCH_OBJECT; + } + + entry = ldap_first_entry(ldc->ldap, res); + + /* Grab the dn, copy it into the pool, and free it again */ + dn = ldap_get_dn(ldc->ldap, entry); + *binddn = apr_pstrdup(r->pool, dn); + ldap_memfree(dn); + + /* + * Get values for the provided attributes. + */ + if (attrs) { + int k = 0; + int i = 0; + while (attrs[k++]); + vals = apr_pcalloc(r->pool, sizeof(char *) * (k+1)); + numvals = k; + while (attrs[i]) { + char **values; + int j = 0; + char *str = NULL; + /* get values */ + values = ldap_get_values(ldc->ldap, entry, attrs[i]); + while (values && values[j]) { + str = str ? apr_pstrcat(r->pool, str, "; ", values[j], NULL) : apr_pstrdup(r->pool, values[j]); + j++; + } + ldap_value_free(values); + vals[i] = str; + i++; + } + *retvals = vals; + } + + /* + * Add the new username to the search cache. + */ + if (curl) { + LDAP_CACHE_LOCK(); + the_search_node.username = filter; + the_search_node.dn = *binddn; + the_search_node.bindpw = NULL; + the_search_node.lastbind = apr_time_now(); + the_search_node.vals = vals; + the_search_node.numvals = numvals; + + /* Search again to make sure that another thread didn't ready insert this node + into the cache before we got here. If it does exist then update the lastbind */ + search_nodep = util_ald_cache_fetch(curl->search_cache, &the_search_node); + if ((search_nodep == NULL) || + (strcmp(*binddn, search_nodep->dn) != 0)) { + + /* Nothing in cache, insert new entry */ + util_ald_cache_insert(curl->search_cache, &the_search_node); + } + /* + * Don't update lastbind on entries with bindpw because + * we haven't verified that password. It's OK to update + * the entry if there is no password in it. + */ + else if (!search_nodep->bindpw) { + /* Cache entry is valid, update lastbind */ + search_nodep->lastbind = the_search_node.lastbind; + } + LDAP_CACHE_UNLOCK(); + } + ldap_msgfree(res); + + ldc->reason = "Search successful"; + return LDAP_SUCCESS; +} + +/* + * Reports if ssl support is enabled + * + * 1 = enabled, 0 = not enabled + */ +LDAP_DECLARE(int) util_ldap_ssl_supported(request_rec *r) +{ + util_ldap_state_t *st = (util_ldap_state_t *)ap_get_module_config( + r->server->module_config, &ldap_module); + + return(st->ssl_support); +} + + +/* ---------------------------------------- */ +/* config directives */ + + +static const char *util_ldap_set_cache_bytes(cmd_parms *cmd, void *dummy, const char *bytes) +{ + util_ldap_state_t *st = + (util_ldap_state_t *)ap_get_module_config(cmd->server->module_config, + &ldap_module); + + st->cache_bytes = atol(bytes); + + ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, cmd->server, + "[%" APR_PID_T_FMT "] ldap cache: Setting shared memory " + " cache size to %" APR_SIZE_T_FMT " bytes.", + getpid(), st->cache_bytes); + + return NULL; +} + +static const char *util_ldap_set_cache_file(cmd_parms *cmd, void *dummy, const char *file) +{ + util_ldap_state_t *st = + (util_ldap_state_t *)ap_get_module_config(cmd->server->module_config, + &ldap_module); + + if (file) { + st->cache_file = ap_server_root_relative(st->pool, file); + } + else { + st->cache_file = NULL; + } + + ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, cmd->server, + "LDAP cache: Setting shared memory cache file to %s bytes.", + st->cache_file); + + return NULL; +} + +static const char *util_ldap_set_cache_ttl(cmd_parms *cmd, void *dummy, const char *ttl) +{ + util_ldap_state_t *st = + (util_ldap_state_t *)ap_get_module_config(cmd->server->module_config, + &ldap_module); + + st->search_cache_ttl = atol(ttl) * 1000000; + + ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, cmd->server, + "[%d] ldap cache: Setting cache TTL to %ld microseconds.", + getpid(), st->search_cache_ttl); + + return NULL; +} + +static const char *util_ldap_set_cache_entries(cmd_parms *cmd, void *dummy, const char *size) +{ + util_ldap_state_t *st = + (util_ldap_state_t *)ap_get_module_config(cmd->server->module_config, + &ldap_module); + + + st->search_cache_size = atol(size); + if (st->search_cache_size < 0) { + st->search_cache_size = 0; + } + + ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, cmd->server, + "[%d] ldap cache: Setting search cache size to %ld entries.", + getpid(), st->search_cache_size); + + return NULL; +} + +static const char *util_ldap_set_opcache_ttl(cmd_parms *cmd, void *dummy, const char *ttl) +{ + util_ldap_state_t *st = + (util_ldap_state_t *)ap_get_module_config(cmd->server->module_config, + &ldap_module); + + st->compare_cache_ttl = atol(ttl) * 1000000; + + ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, cmd->server, + "[%d] ldap cache: Setting operation cache TTL to %ld microseconds.", + getpid(), st->compare_cache_ttl); + + return NULL; +} + +static const char *util_ldap_set_opcache_entries(cmd_parms *cmd, void *dummy, const char *size) +{ + util_ldap_state_t *st = + (util_ldap_state_t *)ap_get_module_config(cmd->server->module_config, + &ldap_module); + + st->compare_cache_size = atol(size); + if (st->compare_cache_size < 0) { + st->compare_cache_size = 0; + } + + ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, cmd->server, + "[%d] ldap cache: Setting operation cache size to %ld entries.", + getpid(), st->compare_cache_size); + + return NULL; +} + +static const char *util_ldap_set_cert_auth(cmd_parms *cmd, void *dummy, const char *file) +{ + util_ldap_state_t *st = + (util_ldap_state_t *)ap_get_module_config(cmd->server->module_config, + &ldap_module); + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + apr_finfo_t finfo; + apr_status_t rv; + + if (err != NULL) { + return err; + } + + ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, cmd->server, + "LDAP: SSL trusted certificate authority file - %s", + file); + + st->cert_auth_file = ap_server_root_relative(cmd->pool, file); + + if (st->cert_auth_file && + ((rv = apr_stat (&finfo, st->cert_auth_file, APR_FINFO_MIN, cmd->pool)) != APR_SUCCESS)) + { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, cmd->server, + "LDAP: Could not open SSL trusted certificate authority file - %s", + st->cert_auth_file == NULL ? file : st->cert_auth_file); + return "Invalid file path"; + } + + return(NULL); +} + + +static const char *util_ldap_set_cert_type(cmd_parms *cmd, void *dummy, const char *Type) +{ + util_ldap_state_t *st = + (util_ldap_state_t *)ap_get_module_config(cmd->server->module_config, + &ldap_module); + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, cmd->server, + "LDAP: SSL trusted certificate authority file type - %s", + Type); + + if (0 == strcmp("DER_FILE", Type)) + st->cert_file_type = LDAP_CA_TYPE_DER; + + else if (0 == strcmp("BASE64_FILE", Type)) + st->cert_file_type = LDAP_CA_TYPE_BASE64; + + else if (0 == strcmp("CERT7_DB_PATH", Type)) + st->cert_file_type = LDAP_CA_TYPE_CERT7_DB; + + else + st->cert_file_type = LDAP_CA_TYPE_UNKNOWN; + + return(NULL); +} + +static const char *util_ldap_set_connection_timeout(cmd_parms *cmd, void *dummy, const char *ttl) +{ + util_ldap_state_t *st = + (util_ldap_state_t *)ap_get_module_config(cmd->server->module_config, + &ldap_module); + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + + if (err != NULL) { + return err; + } + +#ifdef LDAP_OPT_NETWORK_TIMEOUT + st->connectionTimeout = atol(ttl); + + ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, cmd->server, + "[%d] ldap connection: Setting connection timeout to %ld seconds.", + getpid(), st->connectionTimeout); +#else + ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, cmd->server, + "LDAP: Connection timout option not supported by the LDAP SDK in use." ); +#endif + + return NULL; +} + +void *util_ldap_create_config(apr_pool_t *p, server_rec *s) +{ + util_ldap_state_t *st = + (util_ldap_state_t *)apr_pcalloc(p, sizeof(util_ldap_state_t)); + + /* Create a per vhost pool for mod_ldap to use, serialized with + * st->mutex (also one per vhost) + */ + apr_pool_create(&st->pool, p); +#if APR_HAS_THREADS + apr_thread_mutex_create(&st->mutex, APR_THREAD_MUTEX_DEFAULT, st->pool); +#endif + + st->cache_bytes = 100000; + st->search_cache_ttl = 600000000; + st->search_cache_size = 1024; + st->compare_cache_ttl = 600000000; + st->compare_cache_size = 1024; + st->connections = NULL; + st->cert_auth_file = NULL; + st->cert_file_type = LDAP_CA_TYPE_UNKNOWN; + st->ssl_support = 0; + st->connectionTimeout = 10; + + return st; +} + +static apr_status_t util_ldap_cleanup_module(void *data) +{ +#if APR_HAS_LDAP_SSL && APR_HAS_NOVELL_LDAPSDK + server_rec *s = data; + util_ldap_state_t *st = (util_ldap_state_t *)ap_get_module_config( + s->module_config, &ldap_module); + + if (st->ssl_support) + ldapssl_client_deinit(); + +#endif + return APR_SUCCESS; +} + +static int util_ldap_post_config(apr_pool_t *p, apr_pool_t *plog, + apr_pool_t *ptemp, server_rec *s) +{ + int rc = LDAP_SUCCESS; + apr_status_t result; + char buf[MAX_STRING_LEN]; + server_rec *s_vhost; + util_ldap_state_t *st_vhost; + + util_ldap_state_t *st = + (util_ldap_state_t *)ap_get_module_config(s->module_config, &ldap_module); + + void *data; + const char *userdata_key = "util_ldap_init"; + + /* util_ldap_post_config() will be called twice. Don't bother + * going through all of the initialization on the first call + * because it will just be thrown away.*/ + apr_pool_userdata_get(&data, userdata_key, s->process->pool); + if (!data) { + apr_pool_userdata_set((const void *)1, userdata_key, + apr_pool_cleanup_null, s->process->pool); + +#if APR_HAS_SHARED_MEMORY + /* If the cache file already exists then delete it. Otherwise we are + * going to run into problems creating the shared memory. */ + if (st->cache_file) { + char *lck_file = apr_pstrcat (ptemp, st->cache_file, ".lck", NULL); + apr_file_remove(st->cache_file, ptemp); + apr_file_remove(lck_file, ptemp); + } +#endif + return OK; + } + +#if APR_HAS_SHARED_MEMORY + /* initializing cache if shared memory size is not zero and we already don't have shm address */ + if (!st->cache_shm && st->cache_bytes > 0) { +#endif + result = util_ldap_cache_init(p, st); + if (result != APR_SUCCESS) { + apr_strerror(result, buf, sizeof(buf)); + ap_log_error(APLOG_MARK, APLOG_ERR, result, s, + "LDAP cache: error while creating a shared memory segment: %s", buf); + } + + +#if APR_HAS_SHARED_MEMORY + if (st->cache_file) { + st->lock_file = apr_pstrcat (st->pool, st->cache_file, ".lck", NULL); + } + else +#endif + st->lock_file = ap_server_root_relative(st->pool, tmpnam(NULL)); + + result = apr_global_mutex_create(&st->util_ldap_cache_lock, st->lock_file, APR_LOCK_DEFAULT, st->pool); + if (result != APR_SUCCESS) { + return result; + } + +#ifdef UTIL_LDAP_SET_MUTEX_PERMS + result = unixd_set_global_mutex_perms(st->util_ldap_cache_lock); + if (result != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_CRIT, result, s, + "LDAP cache: failed to set mutex permissions"); + return result; + } +#endif + + /* merge config in all vhost */ + s_vhost = s->next; + while (s_vhost) { + st_vhost = (util_ldap_state_t *)ap_get_module_config(s_vhost->module_config, &ldap_module); + +#if APR_HAS_SHARED_MEMORY + st_vhost->cache_shm = st->cache_shm; + st_vhost->cache_rmm = st->cache_rmm; + st_vhost->cache_file = st->cache_file; + ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, result, s, + "LDAP merging Shared Cache conf: shm=0x%pp rmm=0x%pp for VHOST: %s", + st->cache_shm, st->cache_rmm, s_vhost->server_hostname); +#endif + st_vhost->lock_file = st->lock_file; + s_vhost = s_vhost->next; + } +#if APR_HAS_SHARED_MEMORY + } + else { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, "LDAP cache: LDAPSharedCacheSize is zero, disabling shared memory cache"); + } +#endif + + /* log the LDAP SDK used + */ + #if APR_HAS_NETSCAPE_LDAPSDK + + ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, s, + "LDAP: Built with Netscape LDAP SDK" ); + + #elif APR_HAS_NOVELL_LDAPSDK + + ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, s, + "LDAP: Built with Novell LDAP SDK" ); + + #elif APR_HAS_OPENLDAP_LDAPSDK + + ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, s, + "LDAP: Built with OpenLDAP LDAP SDK" ); + + #elif APR_HAS_MICROSOFT_LDAPSDK + + ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, s, + "LDAP: Built with Microsoft LDAP SDK" ); + #else + + ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, s, + "LDAP: Built with unknown LDAP SDK" ); + + #endif /* APR_HAS_NETSCAPE_LDAPSDK */ + + + + apr_pool_cleanup_register(p, s, util_ldap_cleanup_module, + util_ldap_cleanup_module); + + /* initialize SSL support if requested + */ + if (st->cert_auth_file) + { + #if APR_HAS_LDAP_SSL /* compiled with ssl support */ + + #if APR_HAS_NETSCAPE_LDAPSDK + + /* Netscape sdk only supports a cert7.db file + */ + if (st->cert_file_type == LDAP_CA_TYPE_CERT7_DB) + { + rc = ldapssl_client_init(st->cert_auth_file, NULL); + } + else + { + ap_log_error(APLOG_MARK, APLOG_CRIT, 0, s, + "LDAP: Invalid LDAPTrustedCAType directive - " + "CERT7_DB_PATH type required"); + rc = -1; + } + + #elif APR_HAS_NOVELL_LDAPSDK + + /* Novell SDK supports DER or BASE64 files + */ + if (st->cert_file_type == LDAP_CA_TYPE_DER || + st->cert_file_type == LDAP_CA_TYPE_BASE64 ) + { + rc = ldapssl_client_init(NULL, NULL); + if (LDAP_SUCCESS == rc) + { + if (st->cert_file_type == LDAP_CA_TYPE_BASE64) + rc = ldapssl_add_trusted_cert(st->cert_auth_file, + LDAPSSL_CERT_FILETYPE_B64); + else + rc = ldapssl_add_trusted_cert(st->cert_auth_file, + LDAPSSL_CERT_FILETYPE_DER); + + if (LDAP_SUCCESS != rc) + ldapssl_client_deinit(); + } + } + else + { + ap_log_error(APLOG_MARK, APLOG_CRIT, 0, s, + "LDAP: Invalid LDAPTrustedCAType directive - " + "DER_FILE or BASE64_FILE type required"); + rc = -1; + } + + #elif APR_HAS_OPENLDAP_LDAPSDK + + /* OpenLDAP SDK supports BASE64 files + */ + if (st->cert_file_type == LDAP_CA_TYPE_BASE64) + { + rc = ldap_set_option(NULL, LDAP_OPT_X_TLS_CACERTFILE, st->cert_auth_file); + } + else + { + ap_log_error(APLOG_MARK, APLOG_CRIT, 0, s, + "LDAP: Invalid LDAPTrustedCAType directive - " + "BASE64_FILE type required"); + rc = -1; + } + + + #elif APR_HAS_MICROSOFT_LDAPSDK + + /* Microsoft SDK use the registry certificate store - always + * assume support is always available + */ + rc = LDAP_SUCCESS; + + #else + rc = -1; + #endif /* APR_HAS_NETSCAPE_LDAPSDK */ + + #else /* not compiled with SSL Support */ + + ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, s, + "LDAP: Not built with SSL support." ); + rc = -1; + + #endif /* APR_HAS_LDAP_SSL */ + + if (LDAP_SUCCESS == rc) + { + st->ssl_support = 1; + } + else + { + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s, + "LDAP: SSL initialization failed"); + st->ssl_support = 0; + } + } + + /* The Microsoft SDK uses the registry certificate store - + * always assume support is available + */ + #if APR_HAS_MICROSOFT_LDAPSDK + st->ssl_support = 1; + #endif + + + /* log SSL status - If SSL isn't available it isn't necessarily + * an error because the modules asking for LDAP connections + * may not ask for SSL support + */ + if (st->ssl_support) + { + ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, s, + "LDAP: SSL support available" ); + } + else + { + ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, s, + "LDAP: SSL support unavailable" ); + } + + return(OK); +} + +static void util_ldap_child_init(apr_pool_t *p, server_rec *s) +{ + apr_status_t sts; + util_ldap_state_t *st = ap_get_module_config(s->module_config, &ldap_module); + + if (!st->util_ldap_cache_lock) return; + + sts = apr_global_mutex_child_init(&st->util_ldap_cache_lock, st->lock_file, p); + if (sts != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_CRIT, sts, s, + "Failed to initialise global mutex %s in child process %" + APR_PID_T_FMT + ".", + st->lock_file, getpid()); + return; + } + else { + ap_log_error(APLOG_MARK, APLOG_DEBUG|APLOG_NOERRNO, 0, s, + "Initialisation of global mutex %s in child process %" + APR_PID_T_FMT + " successful.", + st->lock_file, getpid()); + } +} + +command_rec util_ldap_cmds[] = { + AP_INIT_TAKE1("LDAPSharedCacheSize", util_ldap_set_cache_bytes, NULL, RSRC_CONF, + "Sets the size of the shared memory cache in bytes. " + "Zero means disable the shared memory cache. Defaults to 100KB."), + + AP_INIT_TAKE1("LDAPSharedCacheFile", util_ldap_set_cache_file, NULL, RSRC_CONF, + "Sets the file of the shared memory cache." + "Nothing means disable the shared memory cache."), + + AP_INIT_TAKE1("LDAPCacheEntries", util_ldap_set_cache_entries, NULL, RSRC_CONF, + "Sets the maximum number of entries that are possible in the LDAP " + "search cache. " + "Zero means no limit; -1 disables the cache. Defaults to 1024 entries."), + + AP_INIT_TAKE1("LDAPCacheTTL", util_ldap_set_cache_ttl, NULL, RSRC_CONF, + "Sets the maximum time (in seconds) that an item can be cached in the LDAP " + "search cache. Zero means no limit. Defaults to 600 seconds (10 minutes)."), + + AP_INIT_TAKE1("LDAPOpCacheEntries", util_ldap_set_opcache_entries, NULL, RSRC_CONF, + "Sets the maximum number of entries that are possible in the LDAP " + "compare cache. " + "Zero means no limit; -1 disables the cache. Defaults to 1024 entries."), + + AP_INIT_TAKE1("LDAPOpCacheTTL", util_ldap_set_opcache_ttl, NULL, RSRC_CONF, + "Sets the maximum time (in seconds) that an item is cached in the LDAP " + "operation cache. Zero means no limit. Defaults to 600 seconds (10 minutes)."), + + AP_INIT_TAKE1("LDAPTrustedCA", util_ldap_set_cert_auth, NULL, RSRC_CONF, + "Sets the file containing the trusted Certificate Authority certificate. " + "Used to validate the LDAP server certificate for SSL connections."), + + AP_INIT_TAKE1("LDAPTrustedCAType", util_ldap_set_cert_type, NULL, RSRC_CONF, + "Specifies the type of the Certificate Authority file. " + "The following types are supported: " + " DER_FILE - file in binary DER format " + " BASE64_FILE - file in Base64 format " + " CERT7_DB_PATH - Netscape certificate database file "), + + AP_INIT_TAKE1("LDAPConnectionTimeout", util_ldap_set_connection_timeout, NULL, RSRC_CONF, + "Specifies the LDAP socket connection timeout in seconds. " + "Default is 10 seconds. "), + + {NULL} +}; + +static void util_ldap_register_hooks(apr_pool_t *p) +{ + ap_hook_post_config(util_ldap_post_config,NULL,NULL,APR_HOOK_MIDDLE); + ap_hook_handler(util_ldap_handler, NULL, NULL, APR_HOOK_MIDDLE); + ap_hook_child_init(util_ldap_child_init, NULL, NULL, APR_HOOK_MIDDLE); +} + +module ldap_module = { + STANDARD20_MODULE_STUFF, + NULL, /* dir config creater */ + NULL, /* dir merger --- default is to override */ + util_ldap_create_config, /* server config */ + NULL, /* merge server config */ + util_ldap_cmds, /* command table */ + util_ldap_register_hooks, /* set up request processing hooks */ +}; diff --git a/rubbos/app/httpd-2.0.64/modules/experimental/util_ldap.def b/rubbos/app/httpd-2.0.64/modules/experimental/util_ldap.def new file mode 100644 index 00000000..f3ca3264 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/experimental/util_ldap.def @@ -0,0 +1,7 @@ +EXPORT ldap_module +EXPORT util_ldap_connection_find +EXPORT util_ldap_connection_close +EXPORT util_ldap_cache_checkuserid +EXPORT util_ldap_cache_getuserdn +EXPORT util_ldap_cache_compare +EXPORT util_ldap_cache_comparedn diff --git a/rubbos/app/httpd-2.0.64/modules/experimental/util_ldap.dsp b/rubbos/app/httpd-2.0.64/modules/experimental/util_ldap.dsp new file mode 100644 index 00000000..ad33d824 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/experimental/util_ldap.dsp @@ -0,0 +1,140 @@ +# Microsoft Developer Studio Project File - Name="util_ldap" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=util_ldap - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "util_ldap.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 "util_ldap.mak" CFG="util_ldap - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "util_ldap - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "util_ldap - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "util_ldap - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "LDAP_DECLARE_EXPORT" /Fd"Release\util_ldap_src" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /out:"Release/util_ldap.so" /base:@..\..\os\win32\BaseAddr.ref,util_ldap.so +# ADD LINK32 kernel32.lib wldap32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Release/util_ldap.so" /base:@..\..\os\win32\BaseAddr.ref,util_ldap.so /opt:ref + +!ELSEIF "$(CFG)" == "util_ldap - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "LDAP_DECLARE_EXPORT" /Fd"Debug\util_ldap_src" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/util_ldap.so" /base:@..\..\os\win32\BaseAddr.ref,util_ldap.so +# ADD LINK32 kernel32.lib wldap32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/util_ldap.so" /base:@..\..\os\win32\BaseAddr.ref,util_ldap.so + +!ENDIF + +# Begin Target + +# Name "util_ldap - Win32 Release" +# Name "util_ldap - Win32 Debug" +# Begin Source File + +SOURCE=.\util_ldap.c +# End Source File +# Begin Source File + +SOURCE=.\util_ldap.rc +# End Source File +# Begin Source File + +SOURCE=.\util_ldap_cache.c +# End Source File +# Begin Source File + +SOURCE=.\util_ldap_cache.h +# End Source File +# Begin Source File + +SOURCE=.\util_ldap_cache_mgr.c +# End Source File +# Begin Source File + +SOURCE=..\..\build\win32\win32ver.awk + +!IF "$(CFG)" == "util_ldap - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\util_ldap.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk util_ldap.so "LDAP Utility Module for Apache" ../../include/ap_release.h > .\util_ldap.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "util_ldap - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\util_ldap.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk util_ldap.so "LDAP Utility Module for Apache" ../../include/ap_release.h > .\util_ldap.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/modules/experimental/util_ldap_cache.c b/rubbos/app/httpd-2.0.64/modules/experimental/util_ldap_cache.c new file mode 100644 index 00000000..8f6062bb --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/experimental/util_ldap_cache.c @@ -0,0 +1,450 @@ +/* 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. + */ + +/* + * util_ldap_cache.c: LDAP cache things + * + * Original code from auth_ldap module for Apache v1.3: + * Copyright 1998, 1999 Enbridge Pipelines Inc. + * Copyright 1999-2001 Dave Carrigan + */ + +#include +#include +#include "util_ldap.h" +#include "util_ldap_cache.h" + +#ifdef APU_HAS_LDAP + +#if APR_HAS_SHARED_MEMORY +#define MODLDAP_SHMEM_CACHE "/tmp/mod_ldap_cache" +#endif + +/* ------------------------------------------------------------------ */ + +unsigned long util_ldap_url_node_hash(void *n) +{ + util_url_node_t *node = (util_url_node_t *)n; + return util_ald_hash_string(1, node->url); +} + +int util_ldap_url_node_compare(void *a, void *b) +{ + util_url_node_t *na = (util_url_node_t *)a; + util_url_node_t *nb = (util_url_node_t *)b; + + return(strcmp(na->url, nb->url) == 0); +} + +void *util_ldap_url_node_copy(util_ald_cache_t *cache, void *c) +{ + util_url_node_t *n = (util_url_node_t *)c; + util_url_node_t *node = (util_url_node_t *)util_ald_alloc(cache, sizeof(util_url_node_t)); + + if (node) { + if (!(node->url = util_ald_strdup(cache, n->url))) { + util_ald_free(cache, node->url); + return NULL; + } + node->search_cache = n->search_cache; + node->compare_cache = n->compare_cache; + node->dn_compare_cache = n->dn_compare_cache; + return node; + } + else { + return NULL; + } +} + +void util_ldap_url_node_free(util_ald_cache_t *cache, void *n) +{ + util_url_node_t *node = (util_url_node_t *)n; + + util_ald_free(cache, node->url); + util_ald_destroy_cache(node->search_cache); + util_ald_destroy_cache(node->compare_cache); + util_ald_destroy_cache(node->dn_compare_cache); + util_ald_free(cache, node); +} + +void util_ldap_url_node_display(request_rec *r, util_ald_cache_t *cache, void *n) +{ + util_url_node_t *node = (util_url_node_t *)n; + char date_str[APR_CTIME_LEN+1]; + char *buf; + const char *type_str; + util_ald_cache_t *cache_node; + int x; + + for (x=0;x<3;x++) { + switch (x) { + case 0: + cache_node = node->search_cache; + type_str = "Searches"; + break; + case 1: + cache_node = node->compare_cache; + type_str = "Compares"; + break; + case 2: + cache_node = node->dn_compare_cache; + type_str = "DN Compares"; + break; + } + + if (cache_node->marktime) { + apr_ctime(date_str, cache_node->marktime); + } + else + date_str[0] = 0; + + buf = apr_psprintf(r->pool, + "
  • %s (%s)%ld%ld%ld%ld%s
    %s%s%s
    %s%s%s%s%s
    %s%s
    %s%lu (%.0f%% full)%.1f%lu/%lu%.0f%%%lu/%lu%lu%s(none)%.2g
    Cache has not been enabled/initialised.
    \n" + "\n" + "" + "" + "\n" + "
    Cache Name:%s (%s)
    \n

    \n", + buf, + cachetype[0] == 'm'? "Main" : + (cachetype[0] == 's' ? "Search" : + (cachetype[0] == 'c' ? "Compares" : "DNCompares"))), r); + + switch (cachetype[0]) { + case 'm': + if (util_ldap_cache->marktime) { + apr_ctime(date_str, util_ldap_cache->marktime); + } + else + date_str[0] = 0; + + ap_rputs(apr_psprintf(r->pool, + "

    \n" + "\n" + "\n" + "" + "" + "\n" + "\n" + "" + "" + "\n" + "\n" + "" + "" + "\n" + "\n" + "" + "" + "\n" + "\n" + "" + "" + "\n" + "
    Size:%ld
    Max Entries:%ld
    # Entries:%ld
    Full Mark:%ld
    Full Mark Time:%s
    \n

    \n", + util_ldap_cache->size, + util_ldap_cache->maxentries, + util_ldap_cache->numentries, + util_ldap_cache->fullmark, + date_str), r); + + ap_rputs("

    \n" + "\n" + "\n" + "" + "" + "" + "" + "" + "" + "\n", r + ); + for (i=0; i < util_ldap_cache->size; ++i) { + for (p = util_ldap_cache->nodes[i]; p != NULL; p = p->next) { + + (*util_ldap_cache->display)(r, util_ldap_cache, p->payload); + } + } + ap_rputs("
    LDAP URLSizeMax Entries# EntriesFull MarkFull Mark Time
    \n

    \n", r); + + + break; + case 's': + ap_rputs("

    \n" + "\n" + "\n" + "" + "" + "" + "\n", r + ); + if (n) { + for (i=0; i < n->search_cache->size; ++i) { + for (p = n->search_cache->nodes[i]; p != NULL; p = p->next) { + + (*n->search_cache->display)(r, n->search_cache, p->payload); + } + } + } + ap_rputs("
    LDAP FilterUser NameLast Bind
    \n

    \n", r); + break; + case 'c': + ap_rputs("

    \n" + "\n" + "\n" + "" + "" + "" + "" + "" + "\n", r + ); + if (n) { + for (i=0; i < n->compare_cache->size; ++i) { + for (p = n->compare_cache->nodes[i]; p != NULL; p = p->next) { + + (*n->compare_cache->display)(r, n->compare_cache, p->payload); + } + } + } + ap_rputs("
    DNAttributeValueLast CompareResult
    \n

    \n", r); + break; + case 'd': + ap_rputs("

    \n" + "\n" + "\n" + "" + "" + "\n", r + ); + if (n) { + for (i=0; i < n->dn_compare_cache->size; ++i) { + for (p = n->dn_compare_cache->nodes[i]; p != NULL; p = p->next) { + + (*n->dn_compare_cache->display)(r, n->dn_compare_cache, p->payload); + } + } + } + ap_rputs("
    Require DNActual DN
    \n

    \n", r); + break; + default: + break; + } + + } + else { + buf = ""; + } + } + else { + ap_rputs("

    \n" + "\n" + "\n" + "" + "" + "" + "" + "" + "" + "" + "\n", r + ); + + + id1 = apr_psprintf(pool, argfmt, "main", 0, 0); + buf = util_ald_cache_display_stats(r, st->util_ldap_cache, "LDAP URL Cache", id1); + + for (i=0; i < util_ldap_cache->size; ++i) { + for (p = util_ldap_cache->nodes[i],j=0; p != NULL; p = p->next,j++) { + + n = (util_url_node_t *)p->payload; + + t1 = apr_psprintf(pool, "%s (Searches)", n->url); + t2 = apr_psprintf(pool, "%s (Compares)", n->url); + t3 = apr_psprintf(pool, "%s (DNCompares)", n->url); + id1 = apr_psprintf(pool, argfmt, "srch", i, j); + id2 = apr_psprintf(pool, argfmt, "cmpr", i, j); + id3 = apr_psprintf(pool, argfmt, "dncp", i, j); + + buf = apr_psprintf(pool, "%s\n\n" + "%s\n\n" + "%s\n\n" + "%s\n\n", + buf, + util_ald_cache_display_stats(r, n->search_cache, t1, id1), + util_ald_cache_display_stats(r, n->compare_cache, t2, id2), + util_ald_cache_display_stats(r, n->dn_compare_cache, t3, id3) + ); + } + } + ap_rputs(buf, r); + ap_rputs("
    Cache NameEntriesAvg. Chain Len.HitsIns/RemPurgesAvg Purge Time
    \n

    \n", r); + } + + return buf; +} + +#endif /* APU_HAS_LDAP */ diff --git a/rubbos/app/httpd-2.0.64/modules/filters/.deps b/rubbos/app/httpd-2.0.64/modules/filters/.deps new file mode 100644 index 00000000..e69de29b diff --git a/rubbos/app/httpd-2.0.64/modules/filters/.indent.pro b/rubbos/app/httpd-2.0.64/modules/filters/.indent.pro new file mode 100644 index 00000000..a9fbe9f9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/filters/.indent.pro @@ -0,0 +1,54 @@ +-i4 -npsl -di0 -br -nce -d0 -cli0 -npcs -nfc1 +-TBUFF +-TFILE +-TTRANS +-TUINT4 +-T_trans +-Tallow_options_t +-Tapache_sfio +-Tarray_header +-Tbool_int +-Tbuf_area +-Tbuff_struct +-Tbuffy +-Tcmd_how +-Tcmd_parms +-Tcommand_rec +-Tcommand_struct +-Tconn_rec +-Tcore_dir_config +-Tcore_server_config +-Tdir_maker_func +-Tevent +-Tglobals_s +-Thandler_func +-Thandler_rec +-Tjoblist_s +-Tlisten_rec +-Tmerger_func +-Tmode_t +-Tmodule +-Tmodule_struct +-Tmutex +-Tn_long +-Tother_child_rec +-Toverrides_t +-Tparent_score +-Tpid_t +-Tpiped_log +-Tpool +-Trequest_rec +-Trequire_line +-Trlim_t +-Tscoreboard +-Tsemaphore +-Tserver_addr_rec +-Tserver_rec +-Tserver_rec_chain +-Tshort_score +-Ttable +-Ttable_entry +-Tthread +-Tu_wide_int +-Tvtime_t +-Twide_int diff --git a/rubbos/app/httpd-2.0.64/modules/filters/.libs/mod_include.a b/rubbos/app/httpd-2.0.64/modules/filters/.libs/mod_include.a new file mode 100644 index 0000000000000000000000000000000000000000..02aa56ff8d106da9a5e11e5a6e38c7c8184fe0c8 GIT binary patch literal 204368 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/modules/filters/.libs/mod_include.la b/rubbos/app/httpd-2.0.64/modules/filters/.libs/mod_include.la new file mode 100644 index 00000000..602915a6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/filters/.libs/mod_include.la @@ -0,0 +1,35 @@ +# mod_include.la - a libtool library file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='' + +# Names of this library. +library_names='' + +# The name of the static archive. +old_library='mod_include.a' + +# Libraries that this one depends upon. +dependency_libs=' -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib' + +# Version information for mod_include. +current= +age= +revision= + +# Is this an already installed library? +installed=no + +# Should we warn about portability when linking against -modules? +shouldnotlink=yes + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='' diff --git a/rubbos/app/httpd-2.0.64/modules/filters/.libs/mod_include.o b/rubbos/app/httpd-2.0.64/modules/filters/.libs/mod_include.o new file mode 100644 index 0000000000000000000000000000000000000000..d08f85f962b654fdfdedb2f75fc88aa17ca51fa8 GIT binary patch literal 204216 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≤Idvzy}gcl&OO0RxTO607yWb$@%i9o zi2n>;k$Crw-sgJa8^POwYyDr-*Xsw9zQRkMj|$-_#M?nXfp{|b4B~Ua=MsMjJPn-V z+(h~#&~GJuKa}eb=`TY6332r~Nj~-9bKY>9<6{d2^h2H!;dU+`_jA9~sQd}Mfihw4aW zxb&6b(*NVO1UT|T2tQAJ5cGc%Uk@HV$@^(NTmmmZJn`_&_cOI60mOqU)rT>4cH_`FD5o$bg7Ne z*L2hAl8H;bNPoPP=eH6+RK)X9#Q)3d`55BuP~d6Ae~$I~dEipsmL3JKkCVP7&d$6%xKV6@AsW{KO6MqEdO(s4U`A#KX0P*X6JeqHL zwBsA3zy4aE?}x;jA>Y%)%VK=^kNA4%D^JZ@-Z;e5hIntpKaBX60)F{1#D|shdFO>Hn@p9-_XNbQ9ec@D}zm{ti`dby^wJ{JhC;kT7YXI@7h<_aM?~w14#2*2F zk$53&fAr{d5K5ZBX8Z#J@p5Y)?G8koW0F zyaxDK;uEpHtRX%c{q0racVawzkNEqjw{M9bL;dHQk+r-N(cfZ-53S&J)rnWZ_!dw6 z+c>XpPrPkK&qoq}4&(3=;vZqX*hswib>3$W@%?Ducw)I)9eUrH8o>DCZFHiYZ%db7`(5dDr2ek_Fl9Kv(T&Yw%1 zZ}|}3AcS`f;bVyxLjBAO;cG(pju3te0S0dBAJA^N;+viFY*;r4d{Y=7<*qQ5ygr2Q3gMrH@be)&Z`-Wp z)qLYZc+(KxD}?L!$y)z^xA6Jtb7GlCbdS_3Y)&%PN56FDafys?Q3~Dr^U;2S zc`P)dwfY9cQ!$Nj0&SodLzj~MTLw=7Pb0n)d>io?WPXfz0{A)NN#F(GCzJA@3LZ;5 z0p;&VJPlmqRiEIX&H1H~esfMAh(2#g^?F`Co%FG2D1GjAh929mv4~f>J}2imalNl9 zf_PQ0zssrn-8dWef~x)w$G~9=SbW|T<;6sOgt&U*IQ}S zhx+J!E0dYG_xksV>ve_=P=D&9*F~f<@8NxP$3XS^eStprUAdm0d<;7h%Juxx{{gdA BzCZu~ literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/modules/filters/Makefile b/rubbos/app/httpd-2.0.64/modules/filters/Makefile new file mode 100644 index 00000000..918a8cbb --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/filters/Makefile @@ -0,0 +1,8 @@ +top_srcdir = /bottlenecks/rubbos/app/httpd-2.0.64 +top_builddir = /bottlenecks/rubbos/app/httpd-2.0.64 +srcdir = /bottlenecks/rubbos/app/httpd-2.0.64/modules/filters +builddir = /bottlenecks/rubbos/app/httpd-2.0.64/modules/filters +VPATH = /bottlenecks/rubbos/app/httpd-2.0.64/modules/filters + +include $(top_srcdir)/build/special.mk + diff --git a/rubbos/app/httpd-2.0.64/modules/filters/Makefile.in b/rubbos/app/httpd-2.0.64/modules/filters/Makefile.in new file mode 100644 index 00000000..167b343d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/filters/Makefile.in @@ -0,0 +1,3 @@ + +include $(top_srcdir)/build/special.mk + diff --git a/rubbos/app/httpd-2.0.64/modules/filters/NWGNUdeflate b/rubbos/app/httpd-2.0.64/modules/filters/NWGNUdeflate new file mode 100644 index 00000000..4d9cbfa3 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/filters/NWGNUdeflate @@ -0,0 +1,278 @@ +# +# The MOD_DEFLATE module requires the ZLib source which +# can be downloaded from http://www.gzip.org/zlib/ +# +# Declare the sub-directories to be built here +# + +SUBDIRS = \ + $(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 \ + $(AP_WORK)/include \ + $(NWOS) \ + $(EOLIST) + +# +# These flags will come after CFLAGS +# +XCFLAGS += \ + $(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 = deflate + +# +# This is used by the link '-desc ' directive. +# If left blank, NLM_NAME will be used. +# +NLM_DESCRIPTION = Apache $(VERSION_STR) Deflate Module + +# +# This is used by the '-threadname' directive. If left blank, +# NLM_NAME Thread will be used. +# +NLM_THREAD_NAME = Deflate Module + +# +# 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 = 8192 + + +# +# If this is specified it will be used by the link '-entry' directive +# +NLM_ENTRY_SYM = _LibCPrelude + +# +# If this is specified it will be used by the link '-exit' directive +# +NLM_EXIT_SYM = _LibCPostlude + +# +# If this is specified it will be used by the link '-check' directive +# +NLM_CHECK_SYM = + +# +# If these are specified it will be used by the link '-flags' directive +# +NLM_FLAGS = AUTOUNLOAD, 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)/deflate.nlm \ + $(EOLIST) + +# +# If there is an LIB target, put it here +# +TARGET_lib = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the NLM target above. +# Paths must all use the '/' character +# +FILES_nlm_objs = \ + $(OBJDIR)/mod_deflate.o \ + $(OBJDIR)/adler32.o \ + $(OBJDIR)/crc32.o \ + $(OBJDIR)/deflate.o \ + $(OBJDIR)/inflate.o \ + $(OBJDIR)/inffast.o \ + $(OBJDIR)/inftrees.o \ + $(OBJDIR)/trees.o \ + $(OBJDIR)/zutil.o \ + $(EOLIST) + +ifeq "$(wildcard $(ZLIBSDK)/infblock.c)" "$(ZLIBSDK)/infblock.c" +FILES_nlm_objs += \ + $(OBJDIR)/infblock.o \ + $(OBJDIR)/infcodes.o \ + $(OBJDIR)/infutil.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 = \ + libcpre.o \ + $(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 = \ + @$(APR)/aprlib.imp \ + @$(NWOS)/httpd.imp \ + @libc.imp \ + $(EOLIST) + +# +# Any symbols exported to here +# +FILES_nlm_exports = \ + deflate_module \ + $(EOLIST) + +# +# These are the OBJ files needed to create the LIB target above. +# Paths must all use the '/' character +# +FILES_lib_objs = \ + $(EOLIST) + +# +# 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) +# +install :: nlms FORCE + copy $(OBJDIR)\*.nlm $(INSTALL)\Apache2\modules\*.* + +# +# Any specialized rules here +# + +vpath %.c $(ZLIBSDK) + +# +# Include the 'tail' makefile that has targets that depend on variables defined +# in this makefile +# + +include $(AP_WORK)\build\NWGNUtail.inc + + diff --git a/rubbos/app/httpd-2.0.64/modules/filters/NWGNUextfiltr b/rubbos/app/httpd-2.0.64/modules/filters/NWGNUextfiltr new file mode 100644 index 00000000..8aa5b208 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/filters/NWGNUextfiltr @@ -0,0 +1,248 @@ +# +# Make sure all needed macro's are defined +# + +# +# Get the 'head' of the build environment if necessary. This includes default +# targets and paths to tools +# + +ifndef EnvironmentDefined +include $(AP_WORK)\build\NWGNUhead.inc +endif + +# +# These directories will be at the beginning of the include list, followed by +# INCDIRS +# +XINCDIRS += \ + $(APR)/include \ + $(APRUTIL)/include \ + $(AP_WORK)/include \ + $(NWOS) \ + $(EOLIST) + +# +# These flags will come after CFLAGS +# +XCFLAGS += \ + $(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 = extfiltr + +# +# This is used by the link '-desc ' directive. +# If left blank, NLM_NAME will be used. +# +NLM_DESCRIPTION = Apache $(VERSION_STR) External Filter Module + +# +# This is used by the '-threadname' directive. If left blank, +# NLM_NAME Thread will be used. +# +NLM_THREAD_NAME = ExtFilter Module + +# +# 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 = 8192 + + +# +# If this is specified it will be used by the link '-entry' directive +# +NLM_ENTRY_SYM = _LibCPrelude + +# +# If this is specified it will be used by the link '-exit' directive +# +NLM_EXIT_SYM = _LibCPostlude + +# +# If this is specified it will be used by the link '-check' directive +# +NLM_CHECK_SYM = + +# +# If these are specified it will be used by the link '-flags' directive +# +NLM_FLAGS = AUTOUNLOAD, 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)/extfiltr.nlm \ + $(EOLIST) + +# +# If there is an LIB target, put it here +# +TARGET_lib = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the NLM target above. +# Paths must all use the '/' character +# +FILES_nlm_objs = \ + $(OBJDIR)/mod_ext_filter.o \ + $(EOLIST) + +# +# 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 = \ + libcpre.o \ + $(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 = \ + @$(APR)/aprlib.imp \ + @$(NWOS)/httpd.imp \ + @libc.imp \ + $(EOLIST) + +# +# Any symbols exported to here +# +FILES_nlm_exports = \ + ext_filter_module \ + $(EOLIST) + +# +# These are the OBJ files needed to create the LIB target above. +# Paths must all use the '/' character +# +FILES_lib_objs = \ + $(EOLIST) + +# +# 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) +# +install :: nlms FORCE + +# +# Any specialized rules here +# + +# +# Include the 'tail' makefile that has targets that depend on variables defined +# in this makefile +# + +include $(AP_WORK)\build\NWGNUtail.inc + + diff --git a/rubbos/app/httpd-2.0.64/modules/filters/NWGNUmakefile b/rubbos/app/httpd-2.0.64/modules/filters/NWGNUmakefile new file mode 100644 index 00000000..c8509428 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/filters/NWGNUmakefile @@ -0,0 +1,255 @@ +# +# Declare the sub-directories to be built here +# + +SUBDIRS = \ + $(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 += \ + $(EOLIST) + +# +# These flags will come after CFLAGS +# +XCFLAGS += \ + $(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 = + +# +# This is used by the link '-desc ' directive. +# If left blank, NLM_NAME will be used. +# +NLM_DESCRIPTION = + +# +# This is used by the '-threadname' directive. If left blank, +# NLM_NAME Thread will be used. +# +NLM_THREAD_NAME = + +# +# 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 = + + +# +# 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 = + +# +# If these are specified it will be used by the link '-flags' directive +# +NLM_FLAGS = + +# +# 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)/extfiltr.nlm \ + $(EOLIST) + +# If the zlib libraries source exists then build the mod_deflate module +ifneq "$(ZLIBSDK)" "" +ifeq "$(wildcard $(ZLIBSDK))" "$(ZLIBSDK)" +TARGET_nlm += $(OBJDIR)/deflate.nlm \ + $(EOLIST) +endif +else +TARGET_nlm += $(OBJDIR)/extfiltr.nlm \ + $(EOLIST) +endif + +# +# If there is an LIB target, put it here +# +TARGET_lib = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the NLM target above. +# Paths must all use the '/' character +# +FILES_nlm_objs = \ + $(EOLIST) + +# +# 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 = \ + $(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 = \ + $(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 = \ + $(EOLIST) + +# +# Any symbols exported to here +# +FILES_nlm_exports = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the LIB target above. +# Paths must all use the '/' character +# +FILES_lib_objs = \ + $(EOLIST) + +# +# 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) +# +install :: nlms FORCE + copy $(OBJDIR)\*.nlm $(INSTALL)\Apache2\modules\*.* + +# +# Any specialized rules here +# + +# +# Include the 'tail' makefile that has targets that depend on variables defined +# in this makefile +# + +include $(AP_WORK)\build\NWGNUtail.inc + diff --git a/rubbos/app/httpd-2.0.64/modules/filters/config.m4 b/rubbos/app/httpd-2.0.64/modules/filters/config.m4 new file mode 100644 index 00000000..726dfe29 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/filters/config.m4 @@ -0,0 +1,65 @@ +dnl modules enabled in this directory by default + +dnl APACHE_MODULE(name, helptext[, objects[, structname[, default[, config]]]]) + +APACHE_MODPATH_INIT(filters) + +APACHE_MODULE(ext_filter, external filter module, , , most) +APACHE_MODULE(include, Server Side Includes, , , yes) + +APR_ADDTO(LT_LDFLAGS,-export-dynamic) + +APACHE_MODULE(deflate, Deflate transfer encoding support, , , no, [ + AC_ARG_WITH(z, APACHE_HELP_STRING(--with-z=DIR,use a specific zlib library), + [ + if test "x$withval" != "xyes" && test "x$withval" != "x"; then + ap_zlib_base="$withval" + fi + ]) + if test "x$ap_zlib_base" = "x"; then + AC_MSG_CHECKING([for zlib location]) + AC_CACHE_VAL(ap_cv_zlib,[ + 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 + ]) + ap_zlib_base=$ap_cv_zlib + if test "x$ap_zlib_base" = "x"; then + enable_deflate=no + AC_MSG_RESULT([not found]) + else + AC_MSG_RESULT([$ap_zlib_base]) + fi + fi + if test "$enable_deflate" != "no"; then + ap_save_includes=$INCLUDE + ap_save_ldflags=$LDFLAGS + ap_save_libs=$LIBS + ap_save_cppflags=$CPPFLAGS + if test "$ap_zlib_base" != "/usr"; then + APR_ADDTO(INCLUDES, [-I${ap_zlib_base}/include]) + dnl put in CPPFLAGS temporarily so that AC_TRY_LINK below will work + CPPFLAGS="$CPPFLAGS $INCLUDES" + APR_ADDTO(LDFLAGS, [-L${ap_zlib_base}/lib]) + if test "x$ap_platform_runtime_link_flag" != "x"; then + APR_ADDTO(LDFLAGS, [$ap_platform_runtime_link_flag${ap_zlib_base}/lib]) + fi + fi + APR_ADDTO(LIBS, [-lz]) + AC_MSG_CHECKING([for zlib library]) + AC_TRY_LINK([#include ], [int i = Z_OK;], + [AC_MSG_RESULT(found) + AC_CHECK_HEADERS(zutil.h)], + [AC_MSG_RESULT(not found) + enable_deflate=no + INCLUDES=$ap_save_includes + LDFLAGS=$ap_save_ldflags + LIBS=$ap_save_libs]) + CPPFLAGS=$ap_save_cppflags + fi +]) + +APACHE_MODPATH_FINISH diff --git a/rubbos/app/httpd-2.0.64/modules/filters/mod_deflate.c b/rubbos/app/httpd-2.0.64/modules/filters/mod_deflate.c new file mode 100644 index 00000000..610be52d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/filters/mod_deflate.c @@ -0,0 +1,875 @@ +/* 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. + */ + +/* + * Portions of this software are based upon public domain software + * (zlib functions gz_open and gzwrite) + */ + +/* + * mod_deflate.c: Perform deflate transfer-encoding on the fly + * + * Written by Ian Holsman + * + */ + +#include "httpd.h" +#include "http_config.h" +#include "http_log.h" +#include "apr_strings.h" +#include "apr_general.h" +#include "util_filter.h" +#include "apr_buckets.h" +#include "http_request.h" +#define APR_WANT_STRFUNC +#include "apr_want.h" + +#include "zlib.h" + +#ifdef HAVE_ZUTIL_H +#include "zutil.h" +#else +/* As part of the encoding process, we must send what our OS_CODE is + * (or so it seems based on what I can tell of how gzip encoding works). + * + * zutil.h is not always included with zlib distributions (it is a private + * header), so this is straight from zlib 1.1.3's zutil.h. + */ +#ifdef OS2 +#define OS_CODE 0x06 +#endif + +#ifdef WIN32 /* Window 95 & Windows NT */ +#define OS_CODE 0x0b +#endif + +#if defined(VAXC) || defined(VMS) +#define OS_CODE 0x02 +#endif + +#ifdef AMIGA +#define OS_CODE 0x01 +#endif + +#if defined(ATARI) || defined(atarist) +#define OS_CODE 0x05 +#endif + +#if defined(MACOS) || defined(TARGET_OS_MAC) +#define OS_CODE 0x07 +#endif + +#ifdef __50SERIES /* Prime/PRIMOS */ +#define OS_CODE 0x0F +#endif + +#ifdef TOPS20 +#define OS_CODE 0x0a +#endif + +#ifndef OS_CODE +#define OS_CODE 0x03 /* assume Unix */ +#endif +#endif + +static const char deflateFilterName[] = "DEFLATE"; +module AP_MODULE_DECLARE_DATA deflate_module; + +typedef struct deflate_filter_config_t +{ + int windowSize; + int memlevel; + int compressionlevel; + apr_size_t bufferSize; + char *note_ratio_name; + char *note_input_name; + char *note_output_name; +} deflate_filter_config; + +/* windowsize is negative to suppress Zlib header */ +#define DEFAULT_COMPRESSION Z_DEFAULT_COMPRESSION +#define DEFAULT_WINDOWSIZE -15 +#define DEFAULT_MEMLEVEL 9 +#define DEFAULT_BUFFERSIZE 8096 + +/* Outputs a long in LSB order to the given file + * only the bottom 4 bits are required for the deflate file format. + */ +static void putLong(unsigned char *string, unsigned long x) +{ + string[0] = (unsigned char)(x & 0xff); + string[1] = (unsigned char)((x & 0xff00) >> 8); + string[2] = (unsigned char)((x & 0xff0000) >> 16); + string[3] = (unsigned char)((x & 0xff000000) >> 24); +} + +/* Inputs a string and returns a long. + */ +static unsigned long getLong(unsigned char *string) +{ + return ((unsigned long)string[0]) + | (((unsigned long)string[1]) << 8) + | (((unsigned long)string[2]) << 16) + | (((unsigned long)string[3]) << 24); +} + +static void *create_deflate_server_config(apr_pool_t *p, server_rec *s) +{ + deflate_filter_config *c = apr_pcalloc(p, sizeof *c); + + c->memlevel = DEFAULT_MEMLEVEL; + c->windowSize = DEFAULT_WINDOWSIZE; + c->bufferSize = DEFAULT_BUFFERSIZE; + c->compressionlevel = DEFAULT_COMPRESSION; + + return c; +} + +static const char *deflate_set_window_size(cmd_parms *cmd, void *dummy, + const char *arg) +{ + deflate_filter_config *c = ap_get_module_config(cmd->server->module_config, + &deflate_module); + int i; + + i = atoi(arg); + + if (i < 1 || i > 15) + return "DeflateWindowSize must be between 1 and 15"; + + c->windowSize = i * -1; + + return NULL; +} + +static const char *deflate_set_buffer_size(cmd_parms *cmd, void *dummy, + const char *arg) +{ + deflate_filter_config *c = ap_get_module_config(cmd->server->module_config, + &deflate_module); + int n = atoi(arg); + + if (n <= 0) { + return "DeflateBufferSize should be positive"; + } + + c->bufferSize = (apr_size_t)n; + + return NULL; +} +static const char *deflate_set_note(cmd_parms *cmd, void *dummy, + const char *arg1, const char *arg2) +{ + deflate_filter_config *c = ap_get_module_config(cmd->server->module_config, + &deflate_module); + + if (arg2 == NULL) { + c->note_ratio_name = apr_pstrdup(cmd->pool, arg1); + } + else if (!strcasecmp(arg1, "ratio")) { + c->note_ratio_name = apr_pstrdup(cmd->pool, arg2); + } + else if (!strcasecmp(arg1, "input")) { + c->note_input_name = apr_pstrdup(cmd->pool, arg2); + } + else if (!strcasecmp(arg1, "output")) { + c->note_output_name = apr_pstrdup(cmd->pool, arg2); + } + else { + return apr_psprintf(cmd->pool, "Unknown note type %s", arg1); + } + + return NULL; +} + +static const char *deflate_set_memlevel(cmd_parms *cmd, void *dummy, + const char *arg) +{ + deflate_filter_config *c = ap_get_module_config(cmd->server->module_config, + &deflate_module); + int i; + + i = atoi(arg); + + if (i < 1 || i > 9) + return "DeflateMemLevel must be between 1 and 9"; + + c->memlevel = i; + + return NULL; +} + +static const char *deflate_set_compressionlevel(cmd_parms *cmd, void *dummy, + const char *arg) +{ + deflate_filter_config *c = ap_get_module_config(cmd->server->module_config, + &deflate_module); + int i; + + i = atoi(arg); + + if (i < 1 || i > 9) + return "Compression Level must be between 1 and 9"; + + c->compressionlevel = i; + + return NULL; +} + +/* magic header */ +static char deflate_magic[2] = { '\037', '\213' }; + +typedef struct deflate_ctx_t +{ + z_stream stream; + unsigned char *buffer; + unsigned long crc; + apr_bucket_brigade *bb, *proc_bb; +} deflate_ctx; + +static apr_status_t deflate_out_filter(ap_filter_t *f, + apr_bucket_brigade *bb) +{ + apr_bucket *e; + request_rec *r = f->r; + deflate_ctx *ctx = f->ctx; + int zRC; + deflate_filter_config *c = ap_get_module_config(r->server->module_config, + &deflate_module); + + /* If we don't have a context, we need to ensure that it is okay to send + * the deflated content. If we have a context, that means we've done + * this before and we liked it. + * This could be not so nice if we always fail. But, if we succeed, + * we're in better shape. + */ + if (!ctx) { + char *buf, *token; + const char *encoding, *accepts; + + /* only work on main request/no subrequests */ + if (r->main) { + ap_remove_output_filter(f); + return ap_pass_brigade(f->next, bb); + } + + /* some browsers might have problems, so set no-gzip + * (with browsermatch) for them + */ + if (apr_table_get(r->subprocess_env, "no-gzip")) { + ap_remove_output_filter(f); + return ap_pass_brigade(f->next, bb); + } + + /* Some browsers might have problems with content types + * other than text/html, so set gzip-only-text/html + * (with browsermatch) for them + */ + if (r->content_type == NULL + || strncmp(r->content_type, "text/html", 9)) { + const char *env_value = apr_table_get(r->subprocess_env, + "gzip-only-text/html"); + if ( env_value && (strcmp(env_value,"1") == 0) ) { + ap_remove_output_filter(f); + return ap_pass_brigade(f->next, bb); + } + } + + /* Let's see what our current Content-Encoding is. + * If it's already encoded, don't compress again. + * (We could, but let's not.) + */ + encoding = apr_table_get(r->headers_out, "Content-Encoding"); + if (encoding) { + const char *err_enc; + + err_enc = apr_table_get(r->err_headers_out, "Content-Encoding"); + if (err_enc) { + encoding = apr_pstrcat(r->pool, encoding, ",", err_enc, NULL); + } + } + else { + encoding = apr_table_get(r->err_headers_out, "Content-Encoding"); + } + + if (r->content_encoding) { + encoding = encoding ? apr_pstrcat(r->pool, encoding, ",", + r->content_encoding, NULL) + : r->content_encoding; + } + + if (encoding) { + const char *tmp = encoding; + + token = ap_get_token(r->pool, &tmp, 0); + while (token && *token) { + /* stolen from mod_negotiation: */ + if (strcmp(token, "identity") && strcmp(token, "7bit") && + strcmp(token, "8bit") && strcmp(token, "binary")) { + + ap_remove_output_filter(f); + return ap_pass_brigade(f->next, bb); + } + + /* Otherwise, skip token */ + if (*tmp) { + ++tmp; + } + token = (*tmp) ? ap_get_token(r->pool, &tmp, 0) : NULL; + } + } + + /* Even if we don't accept this request based on it not having + * the Accept-Encoding, we need to note that we were looking + * for this header and downstream proxies should be aware of that. + */ + apr_table_mergen(r->headers_out, "Vary", "Accept-Encoding"); + + /* if they don't have the line, then they can't play */ + accepts = apr_table_get(r->headers_in, "Accept-Encoding"); + if (accepts == NULL) { + ap_remove_output_filter(f); + return ap_pass_brigade(f->next, bb); + } + + token = ap_get_token(r->pool, &accepts, 0); + while (token && token[0] && strcasecmp(token, "gzip")) { + /* skip parameters, XXX: ;q=foo evaluation? */ + while (*accepts == ';') { + ++accepts; + token = ap_get_token(r->pool, &accepts, 1); + } + + /* retrieve next token */ + if (*accepts == ',') { + ++accepts; + } + token = (*accepts) ? ap_get_token(r->pool, &accepts, 0) : NULL; + } + + /* No acceptable token found. */ + if (token == NULL || token[0] == '\0') { + ap_remove_output_filter(f); + return ap_pass_brigade(f->next, bb); + } + + /* We're cool with filtering this. */ + ctx = f->ctx = apr_pcalloc(r->pool, sizeof(*ctx)); + ctx->bb = apr_brigade_create(r->pool, f->c->bucket_alloc); + ctx->buffer = apr_palloc(r->pool, c->bufferSize); + + zRC = deflateInit2(&ctx->stream, c->compressionlevel, Z_DEFLATED, + c->windowSize, c->memlevel, + Z_DEFAULT_STRATEGY); + + if (zRC != Z_OK) { + f->ctx = NULL; + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "unable to init Zlib: " + "deflateInit2 returned %d: URL %s", + zRC, r->uri); + return ap_pass_brigade(f->next, bb); + } + + /* RFC 1952 Section 2.3 dictates the gzip header: + * + * +---+---+---+---+---+---+---+---+---+---+ + * |ID1|ID2|CM |FLG| MTIME |XFL|OS | + * +---+---+---+---+---+---+---+---+---+---+ + * + * If we wish to populate in MTIME (as hinted in RFC 1952), do: + * putLong(date_array, apr_time_now() / APR_USEC_PER_SEC); + * where date_array is a char[4] and then print date_array in the + * MTIME position. WARNING: ENDIANNESS ISSUE HERE. + */ + buf = apr_psprintf(r->pool, "%c%c%c%c%c%c%c%c%c%c", deflate_magic[0], + deflate_magic[1], Z_DEFLATED, 0 /* flags */, + 0, 0, 0, 0 /* 4 chars for mtime */, + 0 /* xflags */, OS_CODE); + e = apr_bucket_pool_create(buf, 10, r->pool, f->c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(ctx->bb, e); + + /* If the entire Content-Encoding is "identity", we can replace it. */ + if (!encoding || !strcasecmp(encoding, "identity")) { + apr_table_setn(r->headers_out, "Content-Encoding", "gzip"); + } + else { + apr_table_mergen(r->headers_out, "Content-Encoding", "gzip"); + } + apr_table_unset(r->headers_out, "Content-Length"); + + /* initialize deflate output buffer */ + ctx->stream.next_out = ctx->buffer; + ctx->stream.avail_out = c->bufferSize; + } + + while (!APR_BRIGADE_EMPTY(bb)) + { + const char *data; + apr_bucket *b; + apr_size_t len; + int done = 0; + + e = APR_BRIGADE_FIRST(bb); + + if (APR_BUCKET_IS_EOS(e)) { + char *buf; + unsigned int deflate_len; + + ctx->stream.avail_in = 0; /* should be zero already anyway */ + for (;;) { + deflate_len = c->bufferSize - ctx->stream.avail_out; + + if (deflate_len != 0) { + b = apr_bucket_heap_create((char *)ctx->buffer, + deflate_len, NULL, + f->c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(ctx->bb, b); + ctx->stream.next_out = ctx->buffer; + ctx->stream.avail_out = c->bufferSize; + } + + if (done) { + break; + } + + zRC = deflate(&ctx->stream, Z_FINISH); + + if (deflate_len == 0 && zRC == Z_BUF_ERROR) { + zRC = Z_OK; + } + + done = (ctx->stream.avail_out != 0 || zRC == Z_STREAM_END); + + if (zRC != Z_OK && zRC != Z_STREAM_END) { + break; + } + } + + buf = apr_palloc(r->pool, 8); + putLong((unsigned char *)&buf[0], ctx->crc); + putLong((unsigned char *)&buf[4], ctx->stream.total_in); + + b = apr_bucket_pool_create(buf, 8, r->pool, f->c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(ctx->bb, b); + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, + "Zlib: Compressed %ld to %ld : URL %s", + ctx->stream.total_in, ctx->stream.total_out, r->uri); + + /* leave notes for logging */ + if (c->note_input_name) { + apr_table_setn(r->notes, c->note_input_name, + (ctx->stream.total_in > 0) + ? apr_off_t_toa(r->pool, + ctx->stream.total_in) + : "-"); + } + + if (c->note_output_name) { + apr_table_setn(r->notes, c->note_output_name, + (ctx->stream.total_in > 0) + ? apr_off_t_toa(r->pool, + ctx->stream.total_out) + : "-"); + } + + if (c->note_ratio_name) { + apr_table_setn(r->notes, c->note_ratio_name, + (ctx->stream.total_in > 0) + ? apr_itoa(r->pool, + (int)(ctx->stream.total_out + * 100 + / ctx->stream.total_in)) + : "-"); + } + + deflateEnd(&ctx->stream); + + /* Remove EOS from the old list, and insert into the new. */ + APR_BUCKET_REMOVE(e); + APR_BRIGADE_INSERT_TAIL(ctx->bb, e); + + /* Okay, we've seen the EOS. + * Time to pass it along down the chain. + */ + return ap_pass_brigade(f->next, ctx->bb); + } + + if (APR_BUCKET_IS_FLUSH(e)) { + apr_bucket *bkt; + apr_status_t rv; + + apr_bucket_delete(e); + + if (ctx->stream.avail_in > 0) { + zRC = deflate(&(ctx->stream), Z_SYNC_FLUSH); + if (zRC != Z_OK) { + return APR_EGENERAL; + } + } + + ctx->stream.next_out = ctx->buffer; + len = c->bufferSize - ctx->stream.avail_out; + + b = apr_bucket_heap_create((char *)ctx->buffer, len, + NULL, f->c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(ctx->bb, b); + ctx->stream.avail_out = c->bufferSize; + + bkt = apr_bucket_flush_create(f->c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(ctx->bb, bkt); + rv = ap_pass_brigade(f->next, ctx->bb); + if (rv != APR_SUCCESS) { + return rv; + } + continue; + } + + /* read */ + apr_bucket_read(e, &data, &len, APR_BLOCK_READ); + + /* This crc32 function is from zlib. */ + ctx->crc = crc32(ctx->crc, (const Bytef *)data, len); + + /* write */ + ctx->stream.next_in = (unsigned char *)data; /* We just lost const-ness, + * but we'll just have to + * trust zlib */ + ctx->stream.avail_in = len; + + while (ctx->stream.avail_in != 0) { + if (ctx->stream.avail_out == 0) { + apr_status_t rv; + + ctx->stream.next_out = ctx->buffer; + len = c->bufferSize - ctx->stream.avail_out; + + b = apr_bucket_heap_create((char *)ctx->buffer, len, + NULL, f->c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(ctx->bb, b); + ctx->stream.avail_out = c->bufferSize; + /* Send what we have right now to the next filter. */ + rv = ap_pass_brigade(f->next, ctx->bb); + if (rv != APR_SUCCESS) { + return rv; + } + } + + zRC = deflate(&(ctx->stream), Z_NO_FLUSH); + + if (zRC != Z_OK) + return APR_EGENERAL; + } + + apr_bucket_delete(e); + } + + apr_brigade_cleanup(bb); + return APR_SUCCESS; +} + +/* This is the deflate input filter (inflates). */ +static apr_status_t deflate_in_filter(ap_filter_t *f, + apr_bucket_brigade *bb, + ap_input_mode_t mode, + apr_read_type_e block, + apr_off_t readbytes) +{ + apr_bucket *bkt; + request_rec *r = f->r; + deflate_ctx *ctx = f->ctx; + int zRC; + apr_status_t rv; + deflate_filter_config *c; + + /* just get out of the way of things we don't want. */ + if (mode != AP_MODE_READBYTES) { + return ap_get_brigade(f->next, bb, mode, block, readbytes); + } + + c = ap_get_module_config(r->server->module_config, &deflate_module); + + if (!ctx) { + int found = 0; + char *token, deflate_hdr[10]; + const char *encoding; + apr_size_t len; + + /* only work on main request/no subrequests */ + if (r->main) { + ap_remove_input_filter(f); + return ap_get_brigade(f->next, bb, mode, block, readbytes); + } + + /* Let's see what our current Content-Encoding is. + * If gzip is present, don't gzip again. (We could, but let's not.) + */ + encoding = apr_table_get(r->headers_in, "Content-Encoding"); + if (encoding) { + const char *tmp = encoding; + + token = ap_get_token(r->pool, &tmp, 0); + while (token && token[0]) { + if (!strcasecmp(token, "gzip")) { + found = 1; + break; + } + /* Otherwise, skip token */ + tmp++; + token = ap_get_token(r->pool, &tmp, 0); + } + } + + if (found == 0) { + ap_remove_input_filter(f); + return ap_get_brigade(f->next, bb, mode, block, readbytes); + } + + f->ctx = ctx = apr_pcalloc(f->r->pool, sizeof(*ctx)); + ctx->bb = apr_brigade_create(r->pool, f->c->bucket_alloc); + ctx->proc_bb = apr_brigade_create(r->pool, f->c->bucket_alloc); + ctx->buffer = apr_palloc(r->pool, c->bufferSize); + + rv = ap_get_brigade(f->next, ctx->bb, AP_MODE_READBYTES, block, 10); + if (rv != APR_SUCCESS) { + return rv; + } + + len = 10; + rv = apr_brigade_flatten(ctx->bb, deflate_hdr, &len); + if (rv != APR_SUCCESS) { + return rv; + } + + /* We didn't get the magic bytes. */ + if (len != 10 || + deflate_hdr[0] != deflate_magic[0] || + deflate_hdr[1] != deflate_magic[1]) { + return APR_EGENERAL; + } + + /* We can't handle flags for now. */ + if (deflate_hdr[3] != 0) { + return APR_EGENERAL; + } + + zRC = inflateInit2(&ctx->stream, c->windowSize); + + if (zRC != Z_OK) { + f->ctx = NULL; + inflateEnd(&ctx->stream); + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "unable to init Zlib: " + "inflateInit2 returned %d: URL %s", + zRC, r->uri); + ap_remove_input_filter(f); + return ap_get_brigade(f->next, bb, mode, block, readbytes); + } + + /* initialize deflate output buffer */ + ctx->stream.next_out = ctx->buffer; + ctx->stream.avail_out = c->bufferSize; + + apr_brigade_cleanup(ctx->bb); + } + + if (APR_BRIGADE_EMPTY(ctx->proc_bb)) { + rv = ap_get_brigade(f->next, ctx->bb, mode, block, readbytes); + + if (rv != APR_SUCCESS) { + /* What about APR_EAGAIN errors? */ + inflateEnd(&ctx->stream); + return rv; + } + + APR_BRIGADE_FOREACH(bkt, ctx->bb) { + const char *data; + apr_size_t len; + + /* If we actually see the EOS, that means we screwed up! */ + if (APR_BUCKET_IS_EOS(bkt)) { + inflateEnd(&ctx->stream); + return APR_EGENERAL; + } + + if (APR_BUCKET_IS_FLUSH(bkt)) { + apr_bucket *tmp_heap; + zRC = inflate(&(ctx->stream), Z_SYNC_FLUSH); + if (zRC != Z_OK) { + inflateEnd(&ctx->stream); + return APR_EGENERAL; + } + + ctx->stream.next_out = ctx->buffer; + len = c->bufferSize - ctx->stream.avail_out; + + ctx->crc = crc32(ctx->crc, (const Bytef *)ctx->buffer, len); + tmp_heap = apr_bucket_heap_create((char *)ctx->buffer, len, + NULL, f->c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(ctx->proc_bb, tmp_heap); + ctx->stream.avail_out = c->bufferSize; + + /* Move everything to the returning brigade. */ + APR_BUCKET_REMOVE(bkt); + APR_BRIGADE_CONCAT(bb, ctx->bb); + break; + } + + /* read */ + apr_bucket_read(bkt, &data, &len, APR_BLOCK_READ); + + /* pass through zlib inflate. */ + ctx->stream.next_in = (unsigned char *)data; + ctx->stream.avail_in = len; + + zRC = Z_OK; + + while (ctx->stream.avail_in != 0) { + if (ctx->stream.avail_out == 0) { + apr_bucket *tmp_heap; + ctx->stream.next_out = ctx->buffer; + len = c->bufferSize - ctx->stream.avail_out; + + ctx->crc = crc32(ctx->crc, (const Bytef *)ctx->buffer, len); + tmp_heap = apr_bucket_heap_create((char *)ctx->buffer, len, + NULL, f->c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(ctx->proc_bb, tmp_heap); + ctx->stream.avail_out = c->bufferSize; + } + + zRC = inflate(&ctx->stream, Z_NO_FLUSH); + + if (zRC == Z_STREAM_END) { + break; + } + + if (zRC != Z_OK) { + inflateEnd(&ctx->stream); + return APR_EGENERAL; + } + } + if (zRC == Z_STREAM_END) { + apr_bucket *tmp_heap, *eos; + + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, + "Zlib: Inflated %ld to %ld : URL %s", + ctx->stream.total_in, ctx->stream.total_out, + r->uri); + + len = c->bufferSize - ctx->stream.avail_out; + + ctx->crc = crc32(ctx->crc, (const Bytef *)ctx->buffer, len); + tmp_heap = apr_bucket_heap_create((char *)ctx->buffer, len, + NULL, f->c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(ctx->proc_bb, tmp_heap); + ctx->stream.avail_out = c->bufferSize; + + /* Is the remaining 8 bytes already in the avail stream? */ + if (ctx->stream.avail_in >= 8) { + unsigned long compCRC, compLen; + compCRC = getLong(ctx->stream.next_in); + if (ctx->crc != compCRC) { + inflateEnd(&ctx->stream); + return APR_EGENERAL; + } + ctx->stream.next_in += 4; + compLen = getLong(ctx->stream.next_in); + if (ctx->stream.total_out != compLen) { + inflateEnd(&ctx->stream); + return APR_EGENERAL; + } + } + else { + /* FIXME: We need to grab the 8 verification bytes + * from the wire! */ + inflateEnd(&ctx->stream); + return APR_EGENERAL; + } + + inflateEnd(&ctx->stream); + + eos = apr_bucket_eos_create(f->c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(ctx->proc_bb, eos); + break; + } + + } + apr_brigade_cleanup(ctx->bb); + } + + /* If we are about to return nothing for a 'blocking' read and we have + * some data in our zlib buffer, flush it out so we can return something. + */ + if (block == APR_BLOCK_READ && + APR_BRIGADE_EMPTY(ctx->proc_bb) && + ctx->stream.avail_out < c->bufferSize) { + apr_bucket *tmp_heap; + apr_size_t len; + ctx->stream.next_out = ctx->buffer; + len = c->bufferSize - ctx->stream.avail_out; + + ctx->crc = crc32(ctx->crc, (const Bytef *)ctx->buffer, len); + tmp_heap = apr_bucket_heap_create((char *)ctx->buffer, len, + NULL, f->c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(ctx->proc_bb, tmp_heap); + ctx->stream.avail_out = c->bufferSize; + } + + if (!APR_BRIGADE_EMPTY(ctx->proc_bb)) { + apr_bucket_brigade *newbb; + + /* May return APR_INCOMPLETE which is fine by us. */ + apr_brigade_partition(ctx->proc_bb, readbytes, &bkt); + + newbb = apr_brigade_split(ctx->proc_bb, bkt); + APR_BRIGADE_CONCAT(bb, ctx->proc_bb); + APR_BRIGADE_CONCAT(ctx->proc_bb, newbb); + } + + return APR_SUCCESS; +} + +static void register_hooks(apr_pool_t *p) +{ + ap_register_output_filter(deflateFilterName, deflate_out_filter, NULL, + AP_FTYPE_CONTENT_SET); + ap_register_input_filter(deflateFilterName, deflate_in_filter, NULL, + AP_FTYPE_CONTENT_SET); +} + +static const command_rec deflate_filter_cmds[] = { + AP_INIT_TAKE12("DeflateFilterNote", deflate_set_note, NULL, RSRC_CONF, + "Set a note to report on compression ratio"), + AP_INIT_TAKE1("DeflateWindowSize", deflate_set_window_size, NULL, + RSRC_CONF, "Set the Deflate window size (1-15)"), + AP_INIT_TAKE1("DeflateBufferSize", deflate_set_buffer_size, NULL, RSRC_CONF, + "Set the Deflate Buffer Size"), + AP_INIT_TAKE1("DeflateMemLevel", deflate_set_memlevel, NULL, RSRC_CONF, + "Set the Deflate Memory Level (1-9)"), + AP_INIT_TAKE1("DeflateCompressionLevel", deflate_set_compressionlevel, NULL, RSRC_CONF, + "Set the Deflate Compression Level (1-9)"), + {NULL} +}; + +module AP_MODULE_DECLARE_DATA deflate_module = { + STANDARD20_MODULE_STUFF, + NULL, /* dir config creater */ + NULL, /* dir merger --- default is to override */ + create_deflate_server_config, /* server config */ + NULL, /* merge server config */ + deflate_filter_cmds, /* command table */ + register_hooks /* register hooks */ +}; diff --git a/rubbos/app/httpd-2.0.64/modules/filters/mod_deflate.dsp b/rubbos/app/httpd-2.0.64/modules/filters/mod_deflate.dsp new file mode 100644 index 00000000..e26600ca --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/filters/mod_deflate.dsp @@ -0,0 +1,127 @@ +# Microsoft Developer Studio Project File - Name="mod_deflate" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=mod_deflate - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "mod_deflate.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 "mod_deflate.mak" CFG="mod_deflate - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "mod_deflate - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_deflate - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "mod_deflate - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "HAVE_ZUTIL_H" /FD /c +# ADD CPP /nologo /MD /W3 /O2 /Oy- /Zi /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /I "../../srclib/zlib" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_deflate_src" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /out:".\Release\mod_deflate.so" /base:@..\..\os\win32\BaseAddr.ref,mod_deflate.so +# ADD LINK32 kernel32.lib zdll.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:".\Release\mod_deflate.so" /libpath:"../../srclib/zlib" /base:@..\..\os\win32\BaseAddr.ref,mod_deflate.so /opt:ref + +!ELSEIF "$(CFG)" == "mod_deflate - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /I "../../srclib/zlib" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "HAVE_ZUTIL_H" /Fd"Debug\mod_deflate_src" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:".\Debug\mod_deflate.so" /base:@..\..\os\win32\BaseAddr.ref,mod_deflate.so +# ADD LINK32 kernel32.lib zdll.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:".\Debug\mod_deflate.so" /libpath:"../../srclib/zlib" /base:@..\..\os\win32\BaseAddr.ref,mod_deflate.so + +!ENDIF + +# Begin Target + +# Name "mod_deflate - Win32 Release" +# Name "mod_deflate - Win32 Debug" +# Begin Source File + +SOURCE=.\mod_deflate.c +# End Source File +# Begin Source File + +SOURCE=.\mod_deflate.rc +# End Source File +# Begin Source File + +SOURCE=..\..\build\win32\win32ver.awk + +!IF "$(CFG)" == "mod_deflate - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_deflate.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_deflate.so "deflate_module for Apache" ../../include/ap_release.h > .\mod_deflate.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "mod_deflate - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_deflate.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_deflate.so "deflate_module for Apache" ../../include/ap_release.h > .\mod_deflate.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/modules/filters/mod_deflate.exp b/rubbos/app/httpd-2.0.64/modules/filters/mod_deflate.exp new file mode 100644 index 00000000..9ec76883 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/filters/mod_deflate.exp @@ -0,0 +1 @@ +deflate_module diff --git a/rubbos/app/httpd-2.0.64/modules/filters/mod_ext_filter.c b/rubbos/app/httpd-2.0.64/modules/filters/mod_ext_filter.c new file mode 100644 index 00000000..cc77b40a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/filters/mod_ext_filter.c @@ -0,0 +1,890 @@ +/* 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. + */ + +/* + * mod_ext_filter allows Unix-style filters to filter http content. + */ + +#include "httpd.h" +#include "http_config.h" +#include "http_log.h" +#include "http_protocol.h" +#define CORE_PRIVATE +#include "http_core.h" +#include "apr_buckets.h" +#include "util_filter.h" +#include "util_script.h" +#include "util_time.h" +#include "apr_strings.h" +#include "apr_hash.h" +#include "apr_lib.h" +#include "apr_poll.h" +#define APR_WANT_STRFUNC +#include "apr_want.h" + +typedef struct ef_server_t { + apr_pool_t *p; + apr_hash_t *h; +} ef_server_t; + +typedef struct ef_filter_t { + const char *name; + enum {INPUT_FILTER=1, OUTPUT_FILTER} mode; + ap_filter_type ftype; + const char *command; + const char *enable_env; + const char *disable_env; + char **args; + const char *intype; /* list of IMTs we process (well, just one for now) */ +#define INTYPE_ALL (char *)1 + const char *outtype; /* IMT of filtered output */ +#define OUTTYPE_UNCHANGED (char *)1 + int preserves_content_length; +} ef_filter_t; + +typedef struct ef_dir_t { + int debug; + int log_stderr; +} ef_dir_t; + +typedef struct ef_ctx_t { + apr_pool_t *p; + apr_proc_t *proc; + apr_procattr_t *procattr; + ef_dir_t *dc; + ef_filter_t *filter; + int noop; +#if APR_FILES_AS_SOCKETS + apr_pollfd_t *pollset; +#endif +} ef_ctx_t; + +module AP_MODULE_DECLARE_DATA ext_filter_module; +static const server_rec *main_server; + +static apr_status_t ef_output_filter(ap_filter_t *, apr_bucket_brigade *); + +#define DBGLVL_SHOWOPTIONS 1 +#define DBGLVL_ERRORCHECK 2 +#define DBGLVL_GORY 9 + +#define ERRFN_USERDATA_KEY "EXTFILTCHILDERRFN" + +static void *create_ef_dir_conf(apr_pool_t *p, char *dummy) +{ + ef_dir_t *dc = (ef_dir_t *)apr_pcalloc(p, sizeof(ef_dir_t)); + + dc->debug = -1; + dc->log_stderr = -1; + + return dc; +} + +static void *create_ef_server_conf(apr_pool_t *p, server_rec *s) +{ + ef_server_t *conf; + + conf = (ef_server_t *)apr_pcalloc(p, sizeof(ef_server_t)); + conf->p = p; + conf->h = apr_hash_make(conf->p); + return conf; +} + +static void *merge_ef_dir_conf(apr_pool_t *p, void *basev, void *overridesv) +{ + ef_dir_t *a = (ef_dir_t *)apr_pcalloc (p, sizeof(ef_dir_t)); + ef_dir_t *base = (ef_dir_t *)basev, *over = (ef_dir_t *)overridesv; + + if (over->debug != -1) { /* if admin coded something... */ + a->debug = over->debug; + } + else { + a->debug = base->debug; + } + + if (over->log_stderr != -1) { /* if admin coded something... */ + a->log_stderr = over->log_stderr; + } + else { + a->log_stderr = base->log_stderr; + } + + return a; +} + +static const char *add_options(cmd_parms *cmd, void *in_dc, + const char *arg) +{ + ef_dir_t *dc = in_dc; + + if (!strncasecmp(arg, "DebugLevel=", 11)) { + dc->debug = atoi(arg + 11); + } + else if (!strcasecmp(arg, "LogStderr")) { + dc->log_stderr = 1; + } + else if (!strcasecmp(arg, "NoLogStderr")) { + dc->log_stderr = 0; + } + else { + return apr_pstrcat(cmd->temp_pool, + "Invalid ExtFilterOptions option: ", + arg, + NULL); + } + + return NULL; +} + +static const char *parse_cmd(apr_pool_t *p, const char **args, ef_filter_t *filter) +{ + if (**args == '"') { + const char *start = *args + 1; + char *parms; + int escaping = 0; + apr_status_t rv; + + ++*args; /* move past leading " */ + /* find true end of args string (accounting for escaped quotes) */ + while (**args && (**args != '"' || (**args == '"' && escaping))) { + if (escaping) { + escaping = 0; + } + else if (**args == '\\') { + escaping = 1; + } + ++*args; + } + if (**args != '"') { + return "Expected cmd= delimiter"; + } + /* copy *just* the arg string for parsing, */ + parms = apr_pstrndup(p, start, *args - start); + ++*args; /* move past trailing " */ + + /* parse and tokenize the args. */ + rv = apr_tokenize_to_argv(parms, &(filter->args), p); + if (rv != APR_SUCCESS) { + return "cmd= parse error"; + } + } + else + { + /* simple path */ + /* Allocate space for two argv pointers and parse the args. */ + filter->args = (char **)apr_palloc(p, 2 * sizeof(char *)); + filter->args[0] = ap_getword_white(p, args); + filter->args[1] = NULL; /* end of args */ + } + if (!filter->args[0]) { + return "Invalid cmd= parameter"; + } + filter->command = filter->args[0]; + + return NULL; +} + +static const char *define_filter(cmd_parms *cmd, void *dummy, const char *args) +{ + ef_server_t *conf = ap_get_module_config(cmd->server->module_config, + &ext_filter_module); + const char *token; + const char *name; + ef_filter_t *filter; + + name = ap_getword_white(cmd->pool, &args); + if (!name) { + return "Filter name not found"; + } + + if (apr_hash_get(conf->h, name, APR_HASH_KEY_STRING)) { + return apr_psprintf(cmd->pool, "ExtFilter %s is already defined", + name); + } + + filter = (ef_filter_t *)apr_pcalloc(conf->p, sizeof(ef_filter_t)); + filter->name = name; + filter->mode = OUTPUT_FILTER; + filter->ftype = AP_FTYPE_RESOURCE; + apr_hash_set(conf->h, name, APR_HASH_KEY_STRING, filter); + + while (*args) { + while (apr_isspace(*args)) { + ++args; + } + + /* Nasty parsing... I wish I could simply use ap_getword_white() + * here and then look at the token, but ap_getword_white() doesn't + * do the right thing when we have cmd="word word word" + */ + if (!strncasecmp(args, "preservescontentlength", 22)) { + token = ap_getword_white(cmd->pool, &args); + if (!strcasecmp(token, "preservescontentlength")) { + filter->preserves_content_length = 1; + } + else { + return apr_psprintf(cmd->pool, + "mangled argument `%s'", + token); + } + continue; + } + + if (!strncasecmp(args, "mode=", 5)) { + args += 5; + token = ap_getword_white(cmd->pool, &args); + if (!strcasecmp(token, "output")) { + filter->mode = OUTPUT_FILTER; + } + else if (!strcasecmp(token, "input")) { + filter->mode = INPUT_FILTER; + } + else { + return apr_psprintf(cmd->pool, "Invalid mode: `%s'", + token); + } + continue; + } + + if (!strncasecmp(args, "ftype=", 6)) { + args += 6; + token = ap_getword_white(cmd->pool, &args); + filter->ftype = atoi(token); + continue; + } + + if (!strncasecmp(args, "enableenv=", 10)) { + args += 10; + token = ap_getword_white(cmd->pool, &args); + filter->enable_env = token; + continue; + } + + if (!strncasecmp(args, "disableenv=", 11)) { + args += 11; + token = ap_getword_white(cmd->pool, &args); + filter->disable_env = token; + continue; + } + + if (!strncasecmp(args, "intype=", 7)) { + args += 7; + filter->intype = ap_getword_white(cmd->pool, &args); + continue; + } + + if (!strncasecmp(args, "outtype=", 8)) { + args += 8; + filter->outtype = ap_getword_white(cmd->pool, &args); + continue; + } + + if (!strncasecmp(args, "cmd=", 4)) { + args += 4; + if ((token = parse_cmd(cmd->pool, &args, filter))) { + return token; + } + continue; + } + + return apr_psprintf(cmd->pool, "Unexpected parameter: `%s'", + args); + } + + /* parsing is done... register the filter + */ + if (filter->mode == OUTPUT_FILTER) { + /* XXX need a way to ensure uniqueness among all filters */ + ap_register_output_filter(filter->name, ef_output_filter, NULL, filter->ftype); + } +#if 0 /* no input filters yet */ + else if (filter->mode == INPUT_FILTER) { + /* XXX need a way to ensure uniqueness among all filters */ + ap_register_input_filter(filter->name, ef_input_filter, NULL, AP_FTYPE_RESOURCE); + } +#endif + else { + ap_assert(1 != 1); /* we set the field wrong somehow */ + } + + return NULL; +} + +static const command_rec cmds[] = +{ + AP_INIT_ITERATE("ExtFilterOptions", + add_options, + NULL, + ACCESS_CONF, /* same as SetInputFilter/SetOutputFilter */ + "valid options: DebugLevel=n, LogStderr, NoLogStderr"), + AP_INIT_RAW_ARGS("ExtFilterDefine", + define_filter, + NULL, + RSRC_CONF, + "Define an external filter"), + {NULL} +}; + +static int ef_init(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *main_s) +{ + main_server = main_s; + return OK; +} + +static void register_hooks(apr_pool_t *p) +{ + ap_hook_post_config(ef_init, NULL, NULL, APR_HOOK_MIDDLE); +} + +static apr_status_t set_resource_limits(request_rec *r, + apr_procattr_t *procattr) +{ +#if defined(RLIMIT_CPU) || defined(RLIMIT_NPROC) || \ + defined(RLIMIT_DATA) || defined(RLIMIT_VMEM) || defined (RLIMIT_AS) + core_dir_config *conf = + (core_dir_config *)ap_get_module_config(r->per_dir_config, + &core_module); + apr_status_t rv; + +#ifdef RLIMIT_CPU + rv = apr_procattr_limit_set(procattr, APR_LIMIT_CPU, conf->limit_cpu); + ap_assert(rv == APR_SUCCESS); /* otherwise, we're out of sync with APR */ +#endif +#if defined(RLIMIT_DATA) || defined(RLIMIT_VMEM) || defined(RLIMIT_AS) + rv = apr_procattr_limit_set(procattr, APR_LIMIT_MEM, conf->limit_mem); + ap_assert(rv == APR_SUCCESS); /* otherwise, we're out of sync with APR */ +#endif +#ifdef RLIMIT_NPROC + rv = apr_procattr_limit_set(procattr, APR_LIMIT_NPROC, conf->limit_nproc); + ap_assert(rv == APR_SUCCESS); /* otherwise, we're out of sync with APR */ +#endif + +#endif /* if at least one limit defined */ + + return APR_SUCCESS; +} + +static apr_status_t ef_close_file(void *vfile) +{ + return apr_file_close(vfile); +} + +static void child_errfn(apr_pool_t *pool, apr_status_t err, const char *description) +{ + request_rec *r; + void *vr; + apr_file_t *stderr_log; + char errbuf[200]; + char time_str[APR_CTIME_LEN]; + + apr_pool_userdata_get(&vr, ERRFN_USERDATA_KEY, pool); + r = vr; + apr_file_open_stderr(&stderr_log, pool); + ap_recent_ctime(time_str, apr_time_now()); + apr_file_printf(stderr_log, + "[%s] [client %s] mod_ext_filter (%d)%s: %s\n", + time_str, + r->connection->remote_ip, + err, + apr_strerror(err, errbuf, sizeof(errbuf)), + description); +} + +/* init_ext_filter_process: get the external filter process going + * This is per-filter-instance (i.e., per-request) initialization. + */ +static apr_status_t init_ext_filter_process(ap_filter_t *f) +{ + ef_ctx_t *ctx = f->ctx; + apr_status_t rc; + ef_dir_t *dc = ctx->dc; + const char * const *env; + + ctx->proc = apr_pcalloc(ctx->p, sizeof(*ctx->proc)); + + rc = apr_procattr_create(&ctx->procattr, ctx->p); + ap_assert(rc == APR_SUCCESS); + + rc = apr_procattr_io_set(ctx->procattr, + APR_CHILD_BLOCK, + APR_CHILD_BLOCK, + APR_CHILD_BLOCK); + ap_assert(rc == APR_SUCCESS); + + rc = set_resource_limits(f->r, ctx->procattr); + ap_assert(rc == APR_SUCCESS); + + if (dc->log_stderr > 0) { + rc = apr_procattr_child_err_set(ctx->procattr, + f->r->server->error_log, /* stderr in child */ + NULL); + ap_assert(rc == APR_SUCCESS); + } + + rc = apr_procattr_child_errfn_set(ctx->procattr, child_errfn); + ap_assert(rc == APR_SUCCESS); + apr_pool_userdata_set(f->r, ERRFN_USERDATA_KEY, apr_pool_cleanup_null, ctx->p); + + if (dc->debug >= DBGLVL_ERRORCHECK) { + rc = apr_procattr_error_check_set(ctx->procattr, 1); + ap_assert(rc == APR_SUCCESS); + } + + /* add standard CGI variables as well as DOCUMENT_URI, DOCUMENT_PATH_INFO, + * and QUERY_STRING_UNESCAPED + */ + ap_add_cgi_vars(f->r); + ap_add_common_vars(f->r); + apr_table_setn(f->r->subprocess_env, "DOCUMENT_URI", f->r->uri); + apr_table_setn(f->r->subprocess_env, "DOCUMENT_PATH_INFO", f->r->path_info); + if (f->r->args) { + /* QUERY_STRING is added by ap_add_cgi_vars */ + char *arg_copy = apr_pstrdup(f->r->pool, f->r->args); + ap_unescape_url(arg_copy); + apr_table_setn(f->r->subprocess_env, "QUERY_STRING_UNESCAPED", + ap_escape_shell_cmd(f->r->pool, arg_copy)); + } + + env = (const char * const *) ap_create_environment(ctx->p, + f->r->subprocess_env); + + rc = apr_proc_create(ctx->proc, + ctx->filter->command, + (const char * const *)ctx->filter->args, + env, /* environment */ + ctx->procattr, + ctx->p); + if (rc != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rc, f->r, + "couldn't create child process to run `%s'", + ctx->filter->command); + return rc; + } + + apr_pool_note_subprocess(ctx->p, ctx->proc, APR_KILL_AFTER_TIMEOUT); + + /* We don't want the handle to the child's stdin inherited by any + * other processes created by httpd. Otherwise, when we close our + * handle, the child won't see EOF because another handle will still + * be open. + */ + + apr_pool_cleanup_register(ctx->p, ctx->proc->in, + apr_pool_cleanup_null, /* other mechanism */ + ef_close_file); + +#if APR_FILES_AS_SOCKETS + { + apr_socket_t *newsock; + + rc = apr_poll_setup(&ctx->pollset, 2, ctx->p); + ap_assert(rc == APR_SUCCESS); + rc = apr_socket_from_file(&newsock, ctx->proc->in); + ap_assert(rc == APR_SUCCESS); + rc = apr_poll_socket_add(ctx->pollset, newsock, APR_POLLOUT); + ap_assert(rc == APR_SUCCESS); + rc = apr_socket_from_file(&newsock, ctx->proc->out); + ap_assert(rc == APR_SUCCESS); + rc = apr_poll_socket_add(ctx->pollset, newsock, APR_POLLIN); + ap_assert(rc == APR_SUCCESS); + } +#endif + + return APR_SUCCESS; +} + +static const char *get_cfg_string(ef_dir_t *dc, ef_filter_t *filter, apr_pool_t *p) +{ + const char *debug_str = dc->debug == -1 ? + "DebugLevel=0" : apr_psprintf(p, "DebugLevel=%d", dc->debug); + const char *log_stderr_str = dc->log_stderr < 1 ? + "NoLogStderr" : "LogStderr"; + const char *preserve_content_length_str = filter->preserves_content_length ? + "PreservesContentLength" : "!PreserveContentLength"; + const char *intype_str = !filter->intype ? + "*/*" : filter->intype; + const char *outtype_str = !filter->outtype ? + "(unchanged)" : filter->outtype; + + return apr_psprintf(p, + "ExtFilterOptions %s %s %s ExtFilterInType %s " + "ExtFilterOuttype %s", + debug_str, log_stderr_str, preserve_content_length_str, + intype_str, outtype_str); +} + +static ef_filter_t *find_filter_def(const server_rec *s, const char *fname) +{ + ef_server_t *sc; + ef_filter_t *f; + + sc = ap_get_module_config(s->module_config, &ext_filter_module); + f = apr_hash_get(sc->h, fname, APR_HASH_KEY_STRING); + if (!f && s != main_server) { + s = main_server; + sc = ap_get_module_config(s->module_config, &ext_filter_module); + f = apr_hash_get(sc->h, fname, APR_HASH_KEY_STRING); + } + return f; +} + +static apr_status_t init_filter_instance(ap_filter_t *f) +{ + ef_ctx_t *ctx; + ef_dir_t *dc; + apr_status_t rv; + + f->ctx = ctx = apr_pcalloc(f->r->pool, sizeof(ef_ctx_t)); + dc = ap_get_module_config(f->r->per_dir_config, + &ext_filter_module); + ctx->dc = dc; + /* look for the user-defined filter */ + ctx->filter = find_filter_def(f->r->server, f->frec->name); + if (!ctx->filter) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, f->r, + "couldn't find definition of filter '%s'", + f->frec->name); + return APR_EINVAL; + } + ctx->p = f->r->pool; + if (ctx->filter->intype && + ctx->filter->intype != INTYPE_ALL) { + if (!f->r->content_type) { + ctx->noop = 1; + } + else { + const char *ctypes = f->r->content_type; + const char *ctype = ap_getword(f->r->pool, &ctypes, ';'); + + if (strcasecmp(ctx->filter->intype, ctype)) { + /* wrong IMT for us; don't mess with the output */ + ctx->noop = 1; + } + } + } + if (ctx->filter->enable_env && + !apr_table_get(f->r->subprocess_env, ctx->filter->enable_env)) { + /* an environment variable that enables the filter isn't set; bail */ + ctx->noop = 1; + } + if (ctx->filter->disable_env && + apr_table_get(f->r->subprocess_env, ctx->filter->disable_env)) { + /* an environment variable that disables the filter is set; bail */ + ctx->noop = 1; + } + if (!ctx->noop) { + rv = init_ext_filter_process(f); + if (rv != APR_SUCCESS) { + return rv; + } + if (ctx->filter->outtype && + ctx->filter->outtype != OUTTYPE_UNCHANGED) { + ap_set_content_type(f->r, ctx->filter->outtype); + } + if (ctx->filter->preserves_content_length != 1) { + /* nasty, but needed to avoid confusing the browser + */ + apr_table_unset(f->r->headers_out, "Content-Length"); + } + } + + if (dc->debug >= DBGLVL_SHOWOPTIONS) { + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, f->r, + "%sfiltering `%s' of type `%s' through `%s', cfg %s", + ctx->noop ? "NOT " : "", + f->r->uri ? f->r->uri : f->r->filename, + f->r->content_type ? f->r->content_type : "(unspecified)", + ctx->filter->command, + get_cfg_string(dc, ctx->filter, f->r->pool)); + } + + return APR_SUCCESS; +} + +/* drain_available_output(): + * + * if any data is available from the filter, read it and pass it + * to the next filter + */ +static apr_status_t drain_available_output(ap_filter_t *f) +{ + request_rec *r = f->r; + conn_rec *c = r->connection; + ef_ctx_t *ctx = f->ctx; + ef_dir_t *dc = ctx->dc; + apr_size_t len; + char buf[4096]; + apr_status_t rv; + apr_bucket_brigade *bb; + apr_bucket *b; + + while (1) { + len = sizeof(buf); + rv = apr_file_read(ctx->proc->out, + buf, + &len); + if ((rv && !APR_STATUS_IS_EAGAIN(rv)) || + dc->debug >= DBGLVL_GORY) { + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, rv, r, + "apr_file_read(child output), len %" APR_SIZE_T_FMT, + !rv ? len : -1); + } + if (rv != APR_SUCCESS) { + return rv; + } + bb = apr_brigade_create(r->pool, c->bucket_alloc); + b = apr_bucket_transient_create(buf, len, c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, b); + if ((rv = ap_pass_brigade(f->next, bb)) != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + "ap_pass_brigade()"); + return rv; + } + } + /* we should never get here; if we do, a bogus error message would be + * the least of our problems + */ + return APR_ANONYMOUS; +} + +static apr_status_t pass_data_to_filter(ap_filter_t *f, const char *data, + apr_size_t len) +{ + ef_ctx_t *ctx = f->ctx; + ef_dir_t *dc = ctx->dc; + apr_status_t rv; + apr_size_t bytes_written = 0; + apr_size_t tmplen; + + do { + tmplen = len - bytes_written; + rv = apr_file_write(ctx->proc->in, + (const char *)data + bytes_written, + &tmplen); + bytes_written += tmplen; + if (rv != APR_SUCCESS && !APR_STATUS_IS_EAGAIN(rv)) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, f->r, + "apr_file_write(child input), len %" APR_SIZE_T_FMT, + tmplen); + return rv; + } + if (APR_STATUS_IS_EAGAIN(rv)) { + /* XXX handle blocking conditions here... if we block, we need + * to read data from the child process and pass it down to the + * next filter! + */ + rv = drain_available_output(f); + if (APR_STATUS_IS_EAGAIN(rv)) { +#if APR_FILES_AS_SOCKETS + int num_events; + + rv = apr_poll(ctx->pollset, 2, + &num_events, f->r->server->timeout); + if (rv || dc->debug >= DBGLVL_GORY) { + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, + rv, f->r, "apr_poll()"); + } + if (rv != APR_SUCCESS && !APR_STATUS_IS_EINTR(rv)) { + /* some error such as APR_TIMEUP */ + return rv; + } +#else /* APR_FILES_AS_SOCKETS */ + /* Yuck... I'd really like to wait until I can read + * or write, but instead I have to sleep and try again + */ + apr_sleep(100000); /* 100 milliseconds */ + if (dc->debug >= DBGLVL_GORY) { + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, + 0, f->r, "apr_sleep()"); + } +#endif /* APR_FILES_AS_SOCKETS */ + } + else if (rv != APR_SUCCESS) { + return rv; + } + } + } while (bytes_written < len); + return rv; +} + +static apr_status_t ef_output_filter(ap_filter_t *f, apr_bucket_brigade *bb) +{ + request_rec *r = f->r; + conn_rec *c = r->connection; + ef_ctx_t *ctx = f->ctx; + apr_bucket *b; + ef_dir_t *dc; + apr_size_t len; + const char *data; + apr_status_t rv; + char buf[4096]; + apr_bucket *eos = NULL; + + if (!ctx) { + if ((rv = init_filter_instance(f)) != APR_SUCCESS) { + return rv; + } + ctx = f->ctx; + } + if (ctx->noop) { + ap_remove_output_filter(f); + return ap_pass_brigade(f->next, bb); + } + dc = ctx->dc; + + APR_BRIGADE_FOREACH(b, bb) { + + if (APR_BUCKET_IS_EOS(b)) { + eos = b; + break; + } + + rv = apr_bucket_read(b, &data, &len, APR_BLOCK_READ); + if (rv != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, "apr_bucket_read()"); + return rv; + } + + /* Good cast, we just tested len isn't negative */ + if (len > 0 && + (rv = pass_data_to_filter(f, data, (apr_size_t)len)) + != APR_SUCCESS) { + return rv; + } + } + + apr_brigade_destroy(bb); + + /* XXX What we *really* need to do once we've hit eos is create a pipe bucket + * from the child output pipe and pass down the pipe bucket + eos. + */ + if (eos) { + /* close the child's stdin to signal that no more data is coming; + * that will cause the child to finish generating output + */ + if ((rv = apr_file_close(ctx->proc->in)) != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + "apr_file_close(child input)"); + return rv; + } + /* since we've seen eos and closed the child's stdin, set the proper pipe + * timeout; we don't care if we don't return from apr_file_read() for a while... + */ + rv = apr_file_pipe_timeout_set(ctx->proc->out, + r->server->timeout); + if (rv) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + "apr_file_pipe_timeout_set(child output)"); + return rv; + } + } + + do { + len = sizeof(buf); + rv = apr_file_read(ctx->proc->out, + buf, + &len); + if ((rv && !APR_STATUS_IS_EOF(rv) && !APR_STATUS_IS_EAGAIN(rv)) || + dc->debug >= DBGLVL_GORY) { + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, rv, r, + "apr_file_read(child output), len %" APR_SIZE_T_FMT, + !rv ? len : -1); + } + if (APR_STATUS_IS_EAGAIN(rv)) { + if (eos) { + /* should not occur, because we have an APR timeout in place */ + AP_DEBUG_ASSERT(1 != 1); + } + return APR_SUCCESS; + } + + if (rv == APR_SUCCESS) { + bb = apr_brigade_create(r->pool, c->bucket_alloc); + b = apr_bucket_transient_create(buf, len, c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, b); + if ((rv = ap_pass_brigade(f->next, bb)) != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + "ap_pass_brigade(filtered buffer) failed"); + return rv; + } + } + } while (rv == APR_SUCCESS); + + if (!APR_STATUS_IS_EOF(rv)) { + return rv; + } + + if (eos) { + /* pass down eos */ + bb = apr_brigade_create(r->pool, c->bucket_alloc); + b = apr_bucket_eos_create(c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, b); + if ((rv = ap_pass_brigade(f->next, bb)) != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + "ap_pass_brigade(eos) failed"); + return rv; + } + } + + return APR_SUCCESS; +} + +#if 0 +static int ef_input_filter(ap_filter_t *f, apr_bucket_brigade *bb, + ap_input_mode_t mode, apr_read_type_e block, + apr_off_t readbytes) +{ + apr_status_t rv; + apr_bucket *b; + char *buf; + apr_ssize_t len; + char *zero; + + rv = ap_get_brigade(f->next, bb, mode, block, readbytes); + if (rv != APR_SUCCESS) { + return rv; + } + + APR_BRIGADE_FOREACH(b, bb) { + if (!APR_BUCKET_IS_EOS(b)) { + if ((rv = apr_bucket_read(b, (const char **)&buf, &len, APR_BLOCK_READ)) != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, f->r, "apr_bucket_read() failed"); + return rv; + } + ap_log_error(APLOG_MARK, APLOG_ERR, 0, NULL, "apr_bucket_read -> %d bytes", + len); + while ((zero = memchr(buf, '0', len))) { + *zero = 'a'; + } + } + else + ap_log_error(APLOG_MARK, APLOG_ERR, 0, NULL, "got eos bucket"); + } + + return rv; +} +#endif + +module AP_MODULE_DECLARE_DATA ext_filter_module = +{ + STANDARD20_MODULE_STUFF, + create_ef_dir_conf, + merge_ef_dir_conf, + create_ef_server_conf, + NULL, + cmds, + register_hooks +}; diff --git a/rubbos/app/httpd-2.0.64/modules/filters/mod_ext_filter.dsp b/rubbos/app/httpd-2.0.64/modules/filters/mod_ext_filter.dsp new file mode 100644 index 00000000..fccf6e8b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/filters/mod_ext_filter.dsp @@ -0,0 +1,128 @@ +# Microsoft Developer Studio Project File - Name="mod_ext_filter" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=mod_ext_filter - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "mod_ext_filter.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 "mod_ext_filter.mak" CFG="mod_ext_filter - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "mod_ext_filter - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_ext_filter - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "mod_ext_filter - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_ext_filter_src" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /out:"Release/mod_ext_filter.so" /base:@..\..\os\win32\BaseAddr.ref,mod_ext_filter.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Release/mod_ext_filter.so" /base:@..\..\os\win32\BaseAddr.ref,mod_ext_filter.so /opt:ref + +!ELSEIF "$(CFG)" == "mod_ext_filter - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_ext_filter_src" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_ext_filter.so" /base:@..\..\os\win32\BaseAddr.ref,mod_ext_filter.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_ext_filter.so" /base:@..\..\os\win32\BaseAddr.ref,mod_ext_filter.so + +!ENDIF + +# Begin Target + +# Name "mod_ext_filter - Win32 Release" +# Name "mod_ext_filter - Win32 Debug" +# Begin Source File + +SOURCE=.\mod_ext_filter.c +# End Source File +# Begin Source File + +SOURCE=.\mod_ext_filter.rc +# End Source File +# Begin Source File + +SOURCE=..\..\build\win32\win32ver.awk + +!IF "$(CFG)" == "mod_ext_filter - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_ext_filter.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_ext_filter.so "ext_filter_module for Apache" ../../include/ap_release.h > .\mod_ext_filter.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "mod_ext_filter - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_ext_filter.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_ext_filter.so "ext_filter_module for Apache" ../../include/ap_release.h > .\mod_ext_filter.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/modules/filters/mod_ext_filter.exp b/rubbos/app/httpd-2.0.64/modules/filters/mod_ext_filter.exp new file mode 100644 index 00000000..ed3b8fc6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/filters/mod_ext_filter.exp @@ -0,0 +1 @@ +ext_filter_module diff --git a/rubbos/app/httpd-2.0.64/modules/filters/mod_include.c b/rubbos/app/httpd-2.0.64/modules/filters/mod_include.c new file mode 100644 index 00000000..38dc3213 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/filters/mod_include.c @@ -0,0 +1,3751 @@ +/* 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. + */ + +/* + * http_include.c: Handles the server-parsed HTML documents + * + * Original by Rob McCool; substantial fixups by David Robinson; + * incorporated into the Apache module framework by rst. + * + */ + +#include "apr.h" +#include "apr_strings.h" +#include "apr_thread_proc.h" +#include "apr_hash.h" +#include "apr_user.h" +#include "apr_lib.h" +#include "apr_optional.h" + +#define APR_WANT_STRFUNC +#define APR_WANT_MEMFUNC +#include "apr_want.h" + +#define CORE_PRIVATE + +#include "ap_config.h" +#include "util_filter.h" +#include "httpd.h" +#include "http_config.h" +#include "http_core.h" +#include "http_request.h" +#include "http_core.h" +#include "http_protocol.h" +#include "http_log.h" +#include "http_main.h" +#include "util_script.h" +#include "http_core.h" + +#define MOD_INCLUDE_REDESIGN +#include "mod_include.h" +#include "util_ebcdic.h" + +module AP_MODULE_DECLARE_DATA include_module; +static apr_hash_t *include_hash; +static APR_OPTIONAL_FN_TYPE(ap_register_include_handler) *ssi_pfn_register; + +/***************************************************************** + * + * XBITHACK. Sigh... NB it's configurable per-directory; the compile-time + * option only changes the default. + */ + +enum xbithack { + xbithack_off, xbithack_on, xbithack_full +}; + +struct bndm_t { + unsigned int T[256]; + unsigned int x; +} ; + +typedef struct { + char *default_error_msg; + char *default_time_fmt; + enum xbithack *xbithack; +} include_dir_config; + +typedef struct { + char *default_start_tag; + char *default_end_tag; + int start_tag_len; + bndm_t start_seq_pat; + char *undefinedEcho; + int undefinedEchoLen; +} include_server_config; + +/* main parser states */ +typedef enum { + PARSE_PRE_HEAD, + PARSE_HEAD, + PARSE_DIRECTIVE, + PARSE_DIRECTIVE_POSTNAME, + PARSE_DIRECTIVE_TAIL, + PARSE_DIRECTIVE_POSTTAIL, + PARSE_PRE_ARG, + PARSE_ARG, + PARSE_ARG_NAME, + PARSE_ARG_POSTNAME, + PARSE_ARG_EQ, + PARSE_ARG_PREVAL, + PARSE_ARG_VAL, + PARSE_ARG_VAL_ESC, + PARSE_ARG_POSTVAL, + PARSE_TAIL, + PARSE_TAIL_SEQ, + PARSE_EXECUTE +} parse_state_t; + +typedef struct ssi_arg_item { + struct ssi_arg_item *next; + char *name; + apr_size_t name_len; + char *value; + apr_size_t value_len; +} ssi_arg_item_t; + +typedef struct { + parse_state_t state; + int seen_eos; + int error; + char quote; /* quote character value (or \0) */ + + apr_bucket_brigade *tmp_bb; + + apr_size_t end_seq_len; + char *directive; /* name of the current directive */ + + unsigned argc; /* argument counter (of the current + * directive) + */ + ssi_arg_item_t *argv; /* all arguments */ + ssi_arg_item_t *current_arg; /* currently parsed argument */ + request_rec *r; + include_ctx_t *ctx; /* public part of the context structure */ + + apr_pool_t *dpool; +} ssi_ctx_t; + +#ifdef XBITHACK +#define DEFAULT_XBITHACK xbithack_full +#else +#define DEFAULT_XBITHACK xbithack_off +#endif + +#define BYTE_COUNT_THRESHOLD AP_MIN_BYTES_TO_WRITE + +#define SSI_CREATE_ERROR_BUCKET(ctx, f, bb) APR_BRIGADE_INSERT_TAIL((bb), \ + apr_bucket_pool_create(apr_pstrdup((ctx)->pool, (ctx)->error_str), \ + strlen((ctx)->error_str), (ctx)->pool, \ + (f)->c->bucket_alloc)) + +/* ------------------------ Environment function -------------------------- */ + +/* Sentinel value to store in subprocess_env for items that + * shouldn't be evaluated until/unless they're actually used + */ +static const char lazy_eval_sentinel; +#define LAZY_VALUE (&lazy_eval_sentinel) + +static void add_include_vars(request_rec *r, char *timefmt) +{ + apr_table_t *e = r->subprocess_env; + char *t; + + apr_table_setn(e, "DATE_LOCAL", LAZY_VALUE); + apr_table_setn(e, "DATE_GMT", LAZY_VALUE); + apr_table_setn(e, "LAST_MODIFIED", LAZY_VALUE); + apr_table_setn(e, "DOCUMENT_URI", r->uri); + if (r->path_info && *r->path_info) { + apr_table_setn(e, "DOCUMENT_PATH_INFO", r->path_info); + } + apr_table_setn(e, "USER_NAME", LAZY_VALUE); + if (r->filename && (t = strrchr(r->filename, '/'))) { + apr_table_setn(e, "DOCUMENT_NAME", ++t); + } + else { + apr_table_setn(e, "DOCUMENT_NAME", r->uri); + } + if (r->args) { + char *arg_copy = apr_pstrdup(r->pool, r->args); + + ap_unescape_url(arg_copy); + apr_table_setn(e, "QUERY_STRING_UNESCAPED", + ap_escape_shell_cmd(r->pool, arg_copy)); + } +} + +static const char *add_include_vars_lazy(request_rec *r, const char *var) +{ + char *val; + if (!strcasecmp(var, "DATE_LOCAL")) { + include_dir_config *conf = + (include_dir_config *)ap_get_module_config(r->per_dir_config, + &include_module); + val = ap_ht_time(r->pool, r->request_time, conf->default_time_fmt, 0); + } + else if (!strcasecmp(var, "DATE_GMT")) { + include_dir_config *conf = + (include_dir_config *)ap_get_module_config(r->per_dir_config, + &include_module); + val = ap_ht_time(r->pool, r->request_time, conf->default_time_fmt, 1); + } + else if (!strcasecmp(var, "LAST_MODIFIED")) { + include_dir_config *conf = + (include_dir_config *)ap_get_module_config(r->per_dir_config, + &include_module); + val = ap_ht_time(r->pool, r->finfo.mtime, conf->default_time_fmt, 0); + } + else if (!strcasecmp(var, "USER_NAME")) { + if (apr_get_username(&val, r->finfo.user, r->pool) != APR_SUCCESS) { + val = ""; + } + } + else { + val = NULL; + } + + if (val) { + apr_table_setn(r->subprocess_env, var, val); + } + return val; +} + +static const char *get_include_var(request_rec *r, include_ctx_t *ctx, + const char *var) +{ + const char *val; + if (apr_isdigit(*var) && !var[1]) { + /* Handle $0 .. $9 from the last regex evaluated. + * The choice of returning NULL strings on not-found, + * v.s. empty strings on an empty match is deliberate. + */ + if (!ctx->re_result || !ctx->re_string) { + return NULL; + } + else { + int idx = atoi(var); + apr_size_t len = (*ctx->re_result)[idx].rm_eo + - (*ctx->re_result)[idx].rm_so; + if ( (*ctx->re_result)[idx].rm_so < 0 + || (*ctx->re_result)[idx].rm_eo < 0) { + return NULL; + } + val = apr_pstrmemdup(r->pool, ctx->re_string + + (*ctx->re_result)[idx].rm_so, len); + } + } + else { + val = apr_table_get(r->subprocess_env, var); + + if (val == LAZY_VALUE) + val = add_include_vars_lazy(r, var); + } + return val; +} + +/* --------------------------- Parser functions --------------------------- */ + +/* This is an implementation of the BNDM search algorithm. + * + * Fast and Flexible String Matching by Combining Bit-parallelism and + * Suffix Automata (2001) + * Gonzalo Navarro, Mathieu Raffinot + * + * http://www-igm.univ-mlv.fr/~raffinot/ftp/jea2001.ps.gz + * + * Initial code submitted by Sascha Schumann. + */ + +/* Precompile the bndm_t data structure. */ +static void bndm_compile(bndm_t *t, const char *n, apr_size_t nl) +{ + unsigned int x; + const char *ne = n + nl; + + memset(t->T, 0, sizeof(unsigned int) * 256); + + for (x = 1; n < ne; x <<= 1) + t->T[(unsigned char) *n++] |= x; + + t->x = x - 1; +} + +/* Implements the BNDM search algorithm (as described above). + * + * n - the pattern to search for + * nl - length of the pattern to search for + * h - the string to look in + * hl - length of the string to look for + * t - precompiled bndm structure against the pattern + * + * Returns the count of character that is the first match or hl if no + * match is found. + */ +static apr_size_t bndm(const char *n, apr_size_t nl, const char *h, + apr_size_t hl, bndm_t *t) +{ + const char *skip; + const char *he, *p, *pi; + unsigned int *T, x, d; + + he = h + hl; + + T = t->T; + x = t->x; + + pi = h - 1; /* pi: p initial */ + p = pi + nl; /* compare window right to left. point to the first char */ + + while (p < he) { + skip = p; + d = x; + do { + d &= T[(unsigned char) *p--]; + if (!d) { + break; + } + if ((d & 1)) { + if (p != pi) + skip = p; + else + return p - h + 1; + } + d >>= 1; + } while (d); + + pi = skip; + p = pi + nl; + } + + return hl; +} + +/* + * decodes a string containing html entities or numeric character references. + * 's' is overwritten with the decoded string. + * If 's' is syntatically incorrect, then the followed fixups will be made: + * unknown entities will be left undecoded; + * references to unused numeric characters will be deleted. + * In particular, � will not be decoded, but will be deleted. + * + * drtr + */ + +/* maximum length of any ISO-LATIN-1 HTML entity name. */ +#define MAXENTLEN (6) + +/* The following is a shrinking transformation, therefore safe. */ + +static void decodehtml(char *s) +{ + int val, i, j; + char *p; + const char *ents; + static const char * const entlist[MAXENTLEN + 1] = + { + NULL, /* 0 */ + NULL, /* 1 */ + "lt\074gt\076", /* 2 */ + "amp\046ETH\320eth\360", /* 3 */ + "quot\042Auml\304Euml\313Iuml\317Ouml\326Uuml\334auml\344euml\353\ +iuml\357ouml\366uuml\374yuml\377", /* 4 */ + "Acirc\302Aring\305AElig\306Ecirc\312Icirc\316Ocirc\324Ucirc\333\ +THORN\336szlig\337acirc\342aring\345aelig\346ecirc\352icirc\356ocirc\364\ +ucirc\373thorn\376", /* 5 */ + "Agrave\300Aacute\301Atilde\303Ccedil\307Egrave\310Eacute\311\ +Igrave\314Iacute\315Ntilde\321Ograve\322Oacute\323Otilde\325Oslash\330\ +Ugrave\331Uacute\332Yacute\335agrave\340aacute\341atilde\343ccedil\347\ +egrave\350eacute\351igrave\354iacute\355ntilde\361ograve\362oacute\363\ +otilde\365oslash\370ugrave\371uacute\372yacute\375" /* 6 */ + }; + + /* Do a fast scan through the string until we find anything + * that needs more complicated handling + */ + for (; *s != '&'; s++) { + if (*s == '\0') { + return; + } + } + + for (p = s; *s != '\0'; s++, p++) { + if (*s != '&') { + *p = *s; + continue; + } + /* find end of entity */ + for (i = 1; s[i] != ';' && s[i] != '\0'; i++) { + continue; + } + + if (s[i] == '\0') { /* treat as normal data */ + *p = *s; + continue; + } + + /* is it numeric ? */ + if (s[1] == '#') { + for (j = 2, val = 0; j < i && apr_isdigit(s[j]); j++) { + val = val * 10 + s[j] - '0'; + } + s += i; + if (j < i || val <= 8 || (val >= 11 && val <= 31) || + (val >= 127 && val <= 160) || val >= 256) { + p--; /* no data to output */ + } + else { + *p = RAW_ASCII_CHAR(val); + } + } + else { + j = i - 1; + if (j > MAXENTLEN || entlist[j] == NULL) { + /* wrong length */ + *p = '&'; + continue; /* skip it */ + } + for (ents = entlist[j]; *ents != '\0'; ents += i) { + if (strncmp(s + 1, ents, j) == 0) { + break; + } + } + + if (*ents == '\0') { + *p = '&'; /* unknown */ + } + else { + *p = RAW_ASCII_CHAR(((const unsigned char *) ents)[j]); + s += i; + } + } + } + + *p = '\0'; +} + +/* + * Extract the next tag name and value. + * If there are no more tags, set the tag name to NULL. + * The tag value is html decoded if dodecode is non-zero. + * The tag value may be NULL if there is no tag value.. + * format: + * [WS][WS]=[WS]['|"|`][['|"|`|]|WS] + */ + +#define SKIP_TAG_WHITESPACE(ptr) while ((*ptr != '\0') && (apr_isspace (*ptr))) ptr++ + +static void ap_ssi_get_tag_and_value(include_ctx_t *ctx, char **tag, + char **tag_val, int dodecode) +{ + *tag_val = NULL; + if (ctx->curr_tag_pos >= ctx->combined_tag + ctx->tag_length) { + *tag = NULL; + return; + } + + *tag = ctx->curr_tag_pos; + if (!**tag) { + *tag = NULL; + /* finitio */ + ctx->curr_tag_pos = ctx->combined_tag + ctx->tag_length; + return; + } + + *tag_val = ap_strchr(*tag, '='); + if (!*tag_val) { + ctx->curr_tag_pos = ctx->combined_tag + ctx->tag_length; + return; + } + + /* if it starts with '=' there was no tag name, just a value */ + if (*tag_val == *tag) { + *tag = NULL; + } + + *(*tag_val)++ = '\0'; + ctx->curr_tag_pos = *tag_val + strlen(*tag_val) + 1; /* skip \0 byte */ + + if (dodecode) { + decodehtml(*tag_val); + } + + return; +} + +/* initial buffer size for power-of-two allocator in ap_ssi_parse_string */ +#define PARSE_STRING_INITIAL_SIZE 64 + +/* + * Do variable substitution on strings + * (Note: If out==NULL, this function allocs a buffer for the resulting + * string from r->pool. The return value is the parsed string) + */ +static char *ap_ssi_parse_string(request_rec *r, include_ctx_t *ctx, + const char *in, char *out, + apr_size_t length, int leave_name) +{ + char ch; + char *next; + char *end_out; + apr_size_t out_size; + + /* allocate an output buffer if needed */ + if (!out) { + out_size = PARSE_STRING_INITIAL_SIZE; + if (out_size > length) { + out_size = length; + } + out = apr_palloc(r->pool, out_size); + } + else { + out_size = length; + } + + /* leave room for nul terminator */ + end_out = out + out_size - 1; + + next = out; + while ((ch = *in++) != '\0') { + switch (ch) { + case '\\': + if (next == end_out) { + if (out_size < length) { + /* double the buffer size */ + apr_size_t new_out_size = out_size * 2; + apr_size_t current_length = next - out; + char *new_out; + if (new_out_size > length) { + new_out_size = length; + } + new_out = apr_palloc(r->pool, new_out_size); + memcpy(new_out, out, current_length); + out = new_out; + out_size = new_out_size; + end_out = out + out_size - 1; + next = out + current_length; + } + else { + /* truncated */ + *next = '\0'; + return out; + } + } + if (*in == '$') { + *next++ = *in++; + } + else { + *next++ = ch; + } + break; + case '$': + { + const char *start_of_var_name; + char *end_of_var_name; /* end of var name + 1 */ + const char *expansion, *temp_end, *val; + char tmp_store; + apr_size_t l; + + /* guess that the expansion won't happen */ + expansion = in - 1; + if (*in == '{') { + ++in; + start_of_var_name = in; + in = ap_strchr_c(in, '}'); + if (in == NULL) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, + 0, r, "Missing '}' on variable \"%s\"", + expansion); + *next = '\0'; + return out; + } + temp_end = in; + end_of_var_name = (char *)temp_end; + ++in; + } + else { + start_of_var_name = in; + while (apr_isalnum(*in) || *in == '_') { + ++in; + } + temp_end = in; + end_of_var_name = (char *)temp_end; + } + /* what a pain, too bad there's no table_getn where you can + * pass a non-nul terminated string */ + l = end_of_var_name - start_of_var_name; + if (l != 0) { + tmp_store = *end_of_var_name; + *end_of_var_name = '\0'; + val = get_include_var(r, ctx, start_of_var_name); + *end_of_var_name = tmp_store; + + if (val) { + expansion = val; + l = strlen(expansion); + } + else if (leave_name) { + l = in - expansion; + } + else { + /* no expansion to be done */ + break; + } + } + else { + /* zero-length variable name causes just the $ to be + * copied */ + l = 1; + } + if ((next + l > end_out) && (out_size < length)) { + /* increase the buffer size to accommodate l more chars */ + apr_size_t new_out_size = out_size; + apr_size_t current_length = next - out; + char *new_out; + do { + new_out_size *= 2; + } while (new_out_size < current_length + l + 1); /* +1 for NUL */ + if (new_out_size > length) { + new_out_size = length; + } + new_out = apr_palloc(r->pool, new_out_size); + memcpy(new_out, out, current_length); + out = new_out; + out_size = new_out_size; + end_out = out + out_size - 1; + next = out + current_length; + } + l = ((int)l > end_out - next) ? (end_out - next) : l; + memcpy(next, expansion, l); + next += l; + break; + } + default: + if (next == end_out) { + if (out_size < length) { + /* double the buffer size */ + apr_size_t new_out_size = out_size * 2; + apr_size_t current_length = next - out; + char *new_out; + if (new_out_size > length) { + new_out_size = length; + } + new_out = apr_palloc(r->pool, new_out_size); + memcpy(new_out, out, current_length); + out = new_out; + out_size = new_out_size; + end_out = out + out_size - 1; + next = out + current_length; + } + else { + /* truncated */ + *next = '\0'; + return out; + } + } + *next++ = ch; + break; + } + } + *next = '\0'; + return out; +} + +/* --------------------------- Action handlers ---------------------------- */ + +/* ensure that path is relative, and does not contain ".." elements + * ensentially ensure that it does not match the regex: + * (^/|(^|/)\.\.(/|$)) + * XXX: Simply replace with apr_filepath_merge + */ +static int is_only_below(const char *path) +{ +#ifdef HAVE_DRIVE_LETTERS + if (path[1] == ':') + return 0; +#endif +#ifdef NETWARE + if (ap_strchr_c(path, ':')) + return 0; +#endif + if (path[0] == '/') { + return 0; + } + while (*path) { + int dots = 0; + while (path[dots] == '.') + ++dots; +#if defined(WIN32) + /* If the name is canonical this is redundant + * but in security, redundancy is worthwhile. + * Does OS2 belong here (accepts ... for ..)? + */ + if (dots > 1 && (!path[dots] || path[dots] == '/')) + return 0; +#else + if (dots == 2 && (!path[dots] || path[dots] == '/')) + return 0; +#endif + path += dots; + /* Advance to either the null byte at the end of the + * string or the character right after the next slash, + * whichever comes first + */ + while (*path && (*path++ != '/')) { + continue; + } + } + return 1; +} + +static int handle_include(include_ctx_t *ctx, apr_bucket_brigade **bb, + request_rec *r, ap_filter_t *f, apr_bucket *head_ptr, + apr_bucket **inserted_head) +{ + char *tag = NULL; + char *tag_val = NULL; + apr_bucket *tmp_buck; + char *parsed_string; + int loglevel = APLOG_ERR; + + *inserted_head = NULL; + if (ctx->flags & FLAG_PRINTING) { + while (1) { + ap_ssi_get_tag_and_value(ctx, &tag, &tag_val, 1); + if (tag_val == NULL) { + if (tag == NULL) { + return (0); + } + else { + return (1); + } + } + if (!strcmp(tag, "virtual") || !strcmp(tag, "file")) { + request_rec *rr = NULL; + char *error_fmt = NULL; + apr_status_t rc = APR_SUCCESS; + + SPLIT_AND_PASS_PRETAG_BUCKETS(*bb, ctx, f->next, rc); + if (rc != APR_SUCCESS) { + return rc; + } + + parsed_string = ap_ssi_parse_string(r, ctx, tag_val, NULL, + MAX_STRING_LEN, 0); + if (tag[0] == 'f') { + /* XXX: Port to apr_filepath_merge + * be safe; only files in this directory or below allowed + */ + if (!is_only_below(parsed_string)) { + error_fmt = "unable to include file \"%s\" " + "in parsed file %s"; + } + else { + rr = ap_sub_req_lookup_uri(parsed_string, r, f->next); + } + } + else { + rr = ap_sub_req_lookup_uri(parsed_string, r, f->next); + } + + if (!error_fmt && rr->status != HTTP_OK) { + error_fmt = "unable to include \"%s\" in parsed file %s"; + } + + if (!error_fmt && (ctx->flags & FLAG_NO_EXEC) && + rr->content_type && + (strncmp(rr->content_type, "text/", 5))) { + error_fmt = "unable to include potential exec \"%s\" " + "in parsed file %s"; + } + + /* See the Kludge in send_parsed_file for why */ + /* Basically, it puts a bread crumb in here, then looks */ + /* for the crumb later to see if its been here. */ + if (rr) + ap_set_module_config(rr->request_config, + &include_module, r); + + if (!error_fmt && ap_run_sub_req(rr)) { + error_fmt = "unable to include \"%s\" in parsed file %s"; + } + if (error_fmt) { + ap_log_rerror(APLOG_MARK, loglevel, + 0, r, error_fmt, tag_val, r->filename); + CREATE_ERROR_BUCKET(ctx, tmp_buck, head_ptr, + *inserted_head); + } + + /* Do *not* destroy the subrequest here; it may have allocated + * variables in this r->subprocess_env in the subrequest's + * r->pool, so that pool must survive as long as this request. + * Yes, this is a memory leak. */ + } + else { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "unknown parameter \"%s\" to tag include in %s", + tag, r->filename); + CREATE_ERROR_BUCKET(ctx, tmp_buck, head_ptr, *inserted_head); + return 1; + } + } + } + return 0; +} + + +static int handle_echo(include_ctx_t *ctx, apr_bucket_brigade **bb, + request_rec *r, ap_filter_t *f, apr_bucket *head_ptr, + apr_bucket **inserted_head) +{ + char *tag = NULL; + char *tag_val = NULL; + const char *echo_text = NULL; + apr_bucket *tmp_buck; + apr_size_t e_len; + enum {E_NONE, E_URL, E_ENTITY} encode; + + encode = E_ENTITY; + + *inserted_head = NULL; + if (ctx->flags & FLAG_PRINTING) { + while (1) { + ap_ssi_get_tag_and_value(ctx, &tag, &tag_val, 1); + if (tag_val == NULL) { + if (tag != NULL) { + return 1; + } + else { + return 0; + } + } + if (!strcmp(tag, "var")) { + conn_rec *c = r->connection; + const char *val = + get_include_var(r, ctx, + ap_ssi_parse_string(r, ctx, tag_val, NULL, + MAX_STRING_LEN, 0)); + if (val) { + switch(encode) { + case E_NONE: + echo_text = val; + break; + case E_URL: + echo_text = ap_escape_uri(r->pool, val); + break; + case E_ENTITY: + echo_text = ap_escape_html(r->pool, val); + break; + } + + e_len = strlen(echo_text); + tmp_buck = apr_bucket_pool_create(echo_text, e_len, + r->pool, c->bucket_alloc); + } + else { + include_server_config *sconf= + ap_get_module_config(r->server->module_config, + &include_module); + tmp_buck = apr_bucket_pool_create(sconf->undefinedEcho, + sconf->undefinedEchoLen, + r->pool, c->bucket_alloc); + } + APR_BUCKET_INSERT_BEFORE(head_ptr, tmp_buck); + if (*inserted_head == NULL) { + *inserted_head = tmp_buck; + } + } + else if (!strcmp(tag, "encoding")) { + if (!strcasecmp(tag_val, "none")) encode = E_NONE; + else if (!strcasecmp(tag_val, "url")) encode = E_URL; + else if (!strcasecmp(tag_val, "entity")) encode = E_ENTITY; + else { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "unknown value \"%s\" to parameter \"encoding\" of " + "tag echo in %s", tag_val, r->filename); + CREATE_ERROR_BUCKET(ctx, tmp_buck, head_ptr, + *inserted_head); + return 1; + } + } + else { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "unknown parameter \"%s\" in tag echo of %s", + tag, r->filename); + CREATE_ERROR_BUCKET(ctx, tmp_buck, head_ptr, *inserted_head); + return 1; + } + + } + } + return 0; +} + +/* error and tf must point to a string with room for at + * least MAX_STRING_LEN characters + */ +static int handle_config(include_ctx_t *ctx, apr_bucket_brigade **bb, + request_rec *r, ap_filter_t *f, apr_bucket *head_ptr, + apr_bucket **inserted_head) +{ + char *tag = NULL; + char *tag_val = NULL; + char *parsed_string; + apr_table_t *env = r->subprocess_env; + + *inserted_head = NULL; + if (ctx->flags & FLAG_PRINTING) { + while (1) { + ap_ssi_get_tag_and_value(ctx, &tag, &tag_val, 0); + if (tag_val == NULL) { + if (tag == NULL) { + return 0; /* Reached the end of the string. */ + } + else { + return 1; /* tags must have values. */ + } + } + if (!strcmp(tag, "errmsg")) { + if (ctx->error_str_override == NULL) { + ctx->error_str_override = (char *)apr_palloc(ctx->pool, + MAX_STRING_LEN); + ctx->error_str = ctx->error_str_override; + } + ap_ssi_parse_string(r, ctx, tag_val, ctx->error_str_override, + MAX_STRING_LEN, 0); + } + else if (!strcmp(tag, "timefmt")) { + apr_time_t date = r->request_time; + if (ctx->time_str_override == NULL) { + ctx->time_str_override = (char *)apr_palloc(ctx->pool, + MAX_STRING_LEN); + ctx->time_str = ctx->time_str_override; + } + ap_ssi_parse_string(r, ctx, tag_val, ctx->time_str_override, + MAX_STRING_LEN, 0); + apr_table_setn(env, "DATE_LOCAL", ap_ht_time(r->pool, date, + ctx->time_str, 0)); + apr_table_setn(env, "DATE_GMT", ap_ht_time(r->pool, date, + ctx->time_str, 1)); + apr_table_setn(env, "LAST_MODIFIED", + ap_ht_time(r->pool, r->finfo.mtime, + ctx->time_str, 0)); + } + else if (!strcmp(tag, "sizefmt")) { + parsed_string = ap_ssi_parse_string(r, ctx, tag_val, NULL, + MAX_STRING_LEN, 0); + decodehtml(parsed_string); + if (!strcmp(parsed_string, "bytes")) { + ctx->flags |= FLAG_SIZE_IN_BYTES; + } + else if (!strcmp(parsed_string, "abbrev")) { + ctx->flags &= FLAG_SIZE_ABBREV; + } + } + else { + apr_bucket *tmp_buck; + + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "unknown parameter \"%s\" to tag config in %s", + tag, r->filename); + CREATE_ERROR_BUCKET(ctx, tmp_buck, head_ptr, *inserted_head); + return 1; + } + } + } + return 0; +} + + +static int find_file(request_rec *r, const char *directive, const char *tag, + char *tag_val, apr_finfo_t *finfo) +{ + char *to_send = tag_val; + request_rec *rr = NULL; + int ret=0; + char *error_fmt = NULL; + apr_status_t rv = APR_SUCCESS; + + if (!strcmp(tag, "file")) { + /* XXX: Port to apr_filepath_merge + * be safe; only files in this directory or below allowed + */ + if (!is_only_below(tag_val)) { + error_fmt = "unable to access file \"%s\" " + "in parsed file %s"; + } + else { + ap_getparents(tag_val); /* get rid of any nasties */ + + /* note: it is okay to pass NULL for the "next filter" since + we never attempt to "run" this sub request. */ + rr = ap_sub_req_lookup_file(tag_val, r, NULL); + + if (rr->status == HTTP_OK && rr->finfo.filetype != 0) { + to_send = rr->filename; + if ((rv = apr_stat(finfo, to_send, + APR_FINFO_GPROT | APR_FINFO_MIN, rr->pool)) != APR_SUCCESS + && rv != APR_INCOMPLETE) { + error_fmt = "unable to get information about \"%s\" " + "in parsed file %s"; + } + } + else { + error_fmt = "unable to lookup information about \"%s\" " + "in parsed file %s"; + } + } + + if (error_fmt) { + ret = -1; + ap_log_rerror(APLOG_MARK, APLOG_ERR, + rv, r, error_fmt, to_send, r->filename); + } + + if (rr) ap_destroy_sub_req(rr); + + return ret; + } + else if (!strcmp(tag, "virtual")) { + /* note: it is okay to pass NULL for the "next filter" since + we never attempt to "run" this sub request. */ + rr = ap_sub_req_lookup_uri(tag_val, r, NULL); + + if (rr->status == HTTP_OK && rr->finfo.filetype != 0) { + memcpy((char *) finfo, (const char *) &rr->finfo, + sizeof(rr->finfo)); + ap_destroy_sub_req(rr); + return 0; + } + else { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "unable to get information about \"%s\" " + "in parsed file %s", + tag_val, r->filename); + ap_destroy_sub_req(rr); + return -1; + } + } + else { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "unknown parameter \"%s\" to tag %s in %s", + tag, directive, r->filename); + return -1; + } +} + +static int handle_fsize(include_ctx_t *ctx, apr_bucket_brigade **bb, + request_rec *r, ap_filter_t *f, apr_bucket *head_ptr, + apr_bucket **inserted_head) +{ + char *tag = NULL; + char *tag_val = NULL; + apr_finfo_t finfo; + apr_size_t s_len; + apr_bucket *tmp_buck; + char *parsed_string; + + *inserted_head = NULL; + if (ctx->flags & FLAG_PRINTING) { + while (1) { + ap_ssi_get_tag_and_value(ctx, &tag, &tag_val, 1); + if (tag_val == NULL) { + if (tag == NULL) { + return 0; + } + else { + return 1; + } + } + else { + parsed_string = ap_ssi_parse_string(r, ctx, tag_val, NULL, + MAX_STRING_LEN, 0); + if (!find_file(r, "fsize", tag, parsed_string, &finfo)) { + /* XXX: if we *know* we're going to have to copy the + * thing off of the stack anyway, why not palloc buff + * instead of sticking it on the stack; then we can just + * use a pool bucket and skip the copy + */ + char buff[50]; + + if (!(ctx->flags & FLAG_SIZE_IN_BYTES)) { + apr_strfsize(finfo.size, buff); + s_len = strlen (buff); + } + else { + int l, x, pos = 0; + char tmp_buff[50]; + + apr_snprintf(tmp_buff, sizeof(tmp_buff), + "%" APR_OFF_T_FMT, finfo.size); + l = strlen(tmp_buff); /* grrr */ + for (x = 0; x < l; x++) { + if (x && (!((l - x) % 3))) { + buff[pos++] = ','; + } + buff[pos++] = tmp_buff[x]; + } + buff[pos] = '\0'; + s_len = pos; + } + + tmp_buck = apr_bucket_heap_create(buff, s_len, NULL, + r->connection->bucket_alloc); + APR_BUCKET_INSERT_BEFORE(head_ptr, tmp_buck); + if (*inserted_head == NULL) { + *inserted_head = tmp_buck; + } + } + else { + CREATE_ERROR_BUCKET(ctx, tmp_buck, head_ptr, + *inserted_head); + return 1; + } + } + } + } + return 0; +} + +static int handle_flastmod(include_ctx_t *ctx, apr_bucket_brigade **bb, + request_rec *r, ap_filter_t *f, + apr_bucket *head_ptr, apr_bucket **inserted_head) +{ + char *tag = NULL; + char *tag_val = NULL; + apr_finfo_t finfo; + apr_size_t t_len; + apr_bucket *tmp_buck; + char *parsed_string; + + *inserted_head = NULL; + if (ctx->flags & FLAG_PRINTING) { + while (1) { + ap_ssi_get_tag_and_value(ctx, &tag, &tag_val, 1); + if (tag_val == NULL) { + if (tag == NULL) { + return 0; + } + else { + return 1; + } + } + else { + parsed_string = ap_ssi_parse_string(r, ctx, tag_val, NULL, + MAX_STRING_LEN, 0); + if (!find_file(r, "flastmod", tag, parsed_string, &finfo)) { + char *t_val; + + t_val = ap_ht_time(r->pool, finfo.mtime, ctx->time_str, 0); + t_len = strlen(t_val); + + tmp_buck = apr_bucket_pool_create(t_val, t_len, r->pool, + r->connection->bucket_alloc); + APR_BUCKET_INSERT_BEFORE(head_ptr, tmp_buck); + if (*inserted_head == NULL) { + *inserted_head = tmp_buck; + } + } + else { + CREATE_ERROR_BUCKET(ctx, tmp_buck, head_ptr, + *inserted_head); + return 1; + } + } + } + } + return 0; +} + +static int re_check(request_rec *r, include_ctx_t *ctx, + char *string, char *rexp) +{ + regex_t *compiled; + const apr_size_t nres = sizeof(*ctx->re_result) / sizeof(regmatch_t); + int regex_error; + + compiled = ap_pregcomp(r->pool, rexp, REG_EXTENDED | REG_NOSUB); + if (compiled == NULL) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "unable to compile pattern \"%s\"", rexp); + return -1; + } + if (!ctx->re_result) { + ctx->re_result = apr_pcalloc(r->pool, sizeof(*ctx->re_result)); + } + ctx->re_string = string; + regex_error = ap_regexec(compiled, string, nres, *ctx->re_result, 0); + ap_pregfree(r->pool, compiled); + return (!regex_error); +} + +enum token_type { + token_string, token_re, + token_and, token_or, token_not, token_eq, token_ne, + token_rbrace, token_lbrace, token_group, + token_ge, token_le, token_gt, token_lt +}; +struct token { + enum token_type type; + char* value; +}; + +static const char *get_ptoken(request_rec *r, const char *string, + struct token *token, int *unmatched) +{ + char ch; + int next = 0; + char qs = 0; + int tkn_fnd = 0; + + token->value = NULL; + + /* Skip leading white space */ + if (string == (char *) NULL) { + return (char *) NULL; + } + while ((ch = *string++)) { + if (!apr_isspace(ch)) { + break; + } + } + if (ch == '\0') { + return (char *) NULL; + } + + token->type = token_string; /* the default type */ + switch (ch) { + case '(': + token->type = token_lbrace; + return (string); + case ')': + token->type = token_rbrace; + return (string); + case '=': + token->type = token_eq; + return (string); + case '!': + if (*string == '=') { + token->type = token_ne; + return (string + 1); + } + else { + token->type = token_not; + return (string); + } + case '\'': + /* already token->type == token_string */ + qs = '\''; + break; + case '/': + token->type = token_re; + qs = '/'; + break; + case '|': + if (*string == '|') { + token->type = token_or; + return (string + 1); + } + break; + case '&': + if (*string == '&') { + token->type = token_and; + return (string + 1); + } + break; + case '>': + if (*string == '=') { + token->type = token_ge; + return (string + 1); + } + else { + token->type = token_gt; + return (string); + } + case '<': + if (*string == '=') { + token->type = token_le; + return (string + 1); + } + else { + token->type = token_lt; + return (string); + } + default: + /* already token->type == token_string */ + break; + } + /* We should only be here if we are in a string */ + token->value = apr_palloc(r->pool, strlen(string) + 2); /* 2 for ch plus + trailing null */ + if (!qs) { + --string; + } + + /* + * I used the ++string throughout this section so that string + * ends up pointing to the next token and I can just return it + */ + for (ch = *string; ((ch != '\0') && (!tkn_fnd)); ch = *++string) { + if (ch == '\\') { + if ((ch = *++string) == '\0') { + tkn_fnd = 1; + } + else { + token->value[next++] = ch; + } + } + else { + if (!qs) { + if (apr_isspace(ch)) { + tkn_fnd = 1; + } + else { + switch (ch) { + case '(': + case ')': + case '=': + case '!': + case '<': + case '>': + tkn_fnd = 1; + break; + case '|': + if (*(string + 1) == '|') { + tkn_fnd = 1; + } + break; + case '&': + if (*(string + 1) == '&') { + tkn_fnd = 1; + } + break; + } + if (!tkn_fnd) { + token->value[next++] = ch; + } + } + } + else { + if (ch == qs) { + qs = 0; + tkn_fnd = 1; + string++; + } + else { + token->value[next++] = ch; + } + } + } + if (tkn_fnd) { + break; + } + } + + /* If qs is still set, we have an unmatched quote */ + if (qs) { + *unmatched = 1; + next = 0; + } + token->value[next] = '\0'; + + return (string); +} + + +/* there is an implicit assumption here that expr is at most MAX_STRING_LEN-1 + * characters long... + */ +static int parse_expr(request_rec *r, include_ctx_t *ctx, const char *expr, + int *was_error, int *was_unmatched, char *debug) +{ + struct parse_node { + struct parse_node *left, *right, *parent; + struct token token; + int value, done; + } *root, *current, *new; + const char *parse; + char* buffer; + int retval = 0; + apr_size_t debug_pos = 0; + + debug[debug_pos] = '\0'; + *was_error = 0; + *was_unmatched = 0; + if ((parse = expr) == (char *) NULL) { + return (0); + } + root = current = (struct parse_node *) NULL; + + /* Create Parse Tree */ + while (1) { + new = (struct parse_node *) apr_palloc(r->pool, + sizeof(struct parse_node)); + new->parent = new->left = new->right = (struct parse_node *) NULL; + new->done = 0; + if ((parse = get_ptoken(r, parse, &new->token, was_unmatched)) == + (char *) NULL) { + break; + } + switch (new->token.type) { + + case token_string: +#ifdef DEBUG_INCLUDE + debug_pos += sprintf (&debug[debug_pos], + " Token: string (%s)\n", + new->token.value); +#endif + if (current == (struct parse_node *) NULL) { + root = current = new; + break; + } + switch (current->token.type) { + case token_string: + current->token.value = apr_pstrcat(r->pool, + current->token.value, + current->token.value[0] ? " " : "", + new->token.value, + NULL); + + break; + case token_eq: + case token_ne: + case token_and: + case token_or: + case token_lbrace: + case token_not: + case token_ge: + case token_gt: + case token_le: + case token_lt: + new->parent = current; + current = current->right = new; + break; + default: + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Invalid expression \"%s\" in file %s", + expr, r->filename); + *was_error = 1; + return retval; + } + break; + + case token_re: +#ifdef DEBUG_INCLUDE + debug_pos += sprintf (&debug[debug_pos], + " Token: regex (%s)\n", + new->token.value); +#endif + if (current == (struct parse_node *) NULL) { + root = current = new; + break; + } + switch (current->token.type) { + case token_eq: + case token_ne: + case token_and: + case token_or: + case token_lbrace: + case token_not: + new->parent = current; + current = current->right = new; + break; + default: + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Invalid expression \"%s\" in file %s", + expr, r->filename); + *was_error = 1; + return retval; + } + break; + + case token_and: + case token_or: +#ifdef DEBUG_INCLUDE + memcpy (&debug[debug_pos], " Token: and/or\n", + sizeof (" Token: and/or\n")); + debug_pos += sizeof (" Token: and/or\n"); +#endif + if (current == (struct parse_node *) NULL) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Invalid expression \"%s\" in file %s", + expr, r->filename); + *was_error = 1; + return retval; + } + /* Percolate upwards */ + while (current != (struct parse_node *) NULL) { + switch (current->token.type) { + case token_string: + case token_re: + case token_group: + case token_not: + case token_eq: + case token_ne: + case token_and: + case token_or: + case token_ge: + case token_gt: + case token_le: + case token_lt: + current = current->parent; + continue; + case token_lbrace: + break; + default: + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Invalid expression \"%s\" in file %s", + expr, r->filename); + *was_error = 1; + return retval; + } + break; + } + if (current == (struct parse_node *) NULL) { + new->left = root; + new->left->parent = new; + new->parent = (struct parse_node *) NULL; + root = new; + } + else { + new->left = current->right; + new->left->parent = new; + current->right = new; + new->parent = current; + } + current = new; + break; + + case token_not: +#ifdef DEBUG_INCLUDE + memcpy(&debug[debug_pos], " Token: not\n", + sizeof(" Token: not\n")); + debug_pos += sizeof(" Token: not\n"); +#endif + if (current == (struct parse_node *) NULL) { + root = current = new; + break; + } + /* Percolate upwards */ + if (current != (struct parse_node *) NULL) { + switch (current->token.type) { + case token_not: + case token_eq: + case token_ne: + case token_and: + case token_or: + case token_lbrace: + case token_ge: + case token_gt: + case token_le: + case token_lt: + break; + default: + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Invalid expression \"%s\" in file %s", + expr, r->filename); + *was_error = 1; + return retval; + } + } + if (current == (struct parse_node *) NULL) { + new->left = root; + new->left->parent = new; + new->parent = (struct parse_node *) NULL; + root = new; + } + else { + new->left = current->right; + current->right = new; + new->parent = current; + } + current = new; + break; + + case token_eq: + case token_ne: + case token_ge: + case token_gt: + case token_le: + case token_lt: +#ifdef DEBUG_INCLUDE + memcpy(&debug[debug_pos], " Token: eq/ne/ge/gt/le/lt\n", + sizeof(" Token: eq/ne/ge/gt/le/lt\n")); + debug_pos += sizeof(" Token: eq/ne/ge/gt/le/lt\n"); +#endif + if (current == (struct parse_node *) NULL) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Invalid expression \"%s\" in file %s", + expr, r->filename); + *was_error = 1; + return retval; + } + /* Percolate upwards */ + while (current != (struct parse_node *) NULL) { + switch (current->token.type) { + case token_string: + case token_re: + case token_group: + current = current->parent; + continue; + case token_lbrace: + case token_and: + case token_or: + break; + case token_not: + case token_eq: + case token_ne: + case token_ge: + case token_gt: + case token_le: + case token_lt: + default: + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Invalid expression \"%s\" in file %s", + expr, r->filename); + *was_error = 1; + return retval; + } + break; + } + if (current == (struct parse_node *) NULL) { + new->left = root; + new->left->parent = new; + new->parent = (struct parse_node *) NULL; + root = new; + } + else { + new->left = current->right; + new->left->parent = new; + current->right = new; + new->parent = current; + } + current = new; + break; + + case token_rbrace: +#ifdef DEBUG_INCLUDE + memcpy (&debug[debug_pos], " Token: rbrace\n", + sizeof (" Token: rbrace\n")); + debug_pos += sizeof (" Token: rbrace\n"); +#endif + while (current != (struct parse_node *) NULL) { + if (current->token.type == token_lbrace) { + current->token.type = token_group; + break; + } + current = current->parent; + } + if (current == (struct parse_node *) NULL) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Unmatched ')' in \"%s\" in file %s", + expr, r->filename); + *was_error = 1; + return retval; + } + break; + + case token_lbrace: +#ifdef DEBUG_INCLUDE + memcpy (&debug[debug_pos], " Token: lbrace\n", + sizeof (" Token: lbrace\n")); + debug_pos += sizeof (" Token: lbrace\n"); +#endif + if (current == (struct parse_node *) NULL) { + root = current = new; + break; + } + /* Percolate upwards */ + if (current != (struct parse_node *) NULL) { + switch (current->token.type) { + case token_not: + case token_eq: + case token_ne: + case token_and: + case token_or: + case token_lbrace: + case token_ge: + case token_gt: + case token_le: + case token_lt: + break; + case token_string: + case token_re: + case token_group: + default: + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Invalid expression \"%s\" in file %s", + expr, r->filename); + *was_error = 1; + return retval; + } + } + if (current == (struct parse_node *) NULL) { + new->left = root; + new->left->parent = new; + new->parent = (struct parse_node *) NULL; + root = new; + } + else { + new->left = current->right; + current->right = new; + new->parent = current; + } + current = new; + break; + default: + break; + } + } + + /* Evaluate Parse Tree */ + current = root; + while (current != (struct parse_node *) NULL) { + switch (current->token.type) { + case token_string: +#ifdef DEBUG_INCLUDE + memcpy (&debug[debug_pos], " Evaluate string\n", + sizeof (" Evaluate string\n")); + debug_pos += sizeof (" Evaluate string\n"); +#endif + buffer = ap_ssi_parse_string(r, ctx, current->token.value, NULL, + MAX_STRING_LEN, 0); + current->token.value = buffer; + current->value = (current->token.value[0] != '\0'); + current->done = 1; + current = current->parent; + break; + + case token_re: + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "No operator before regex of expr \"%s\" in file %s", + expr, r->filename); + *was_error = 1; + return retval; + + case token_and: + case token_or: +#ifdef DEBUG_INCLUDE + memcpy(&debug[debug_pos], " Evaluate and/or\n", + sizeof(" Evaluate and/or\n")); + debug_pos += sizeof(" Evaluate and/or\n"); +#endif + if (current->left == (struct parse_node *) NULL || + current->right == (struct parse_node *) NULL) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Invalid expression \"%s\" in file %s", + expr, r->filename); + *was_error = 1; + return retval; + } + if (!current->left->done) { + switch (current->left->token.type) { + case token_string: + buffer = ap_ssi_parse_string(r, ctx, current->left->token.value, + NULL, MAX_STRING_LEN, 0); + current->left->token.value = buffer; + current->left->value = + (current->left->token.value[0] != '\0'); + current->left->done = 1; + break; + default: + current = current->left; + continue; + } + } + if (!current->right->done) { + switch (current->right->token.type) { + case token_string: + buffer = ap_ssi_parse_string(r, ctx, current->right->token.value, + NULL, MAX_STRING_LEN, 0); + current->right->token.value = buffer; + current->right->value = + (current->right->token.value[0] != '\0'); + current->right->done = 1; + break; + default: + current = current->right; + continue; + } + } +#ifdef DEBUG_INCLUDE + debug_pos += sprintf (&debug[debug_pos], " Left: %c\n", + current->left->value ? '1' : '0'); + debug_pos += sprintf (&debug[debug_pos], " Right: %c\n", + current->right->value ? '1' : '0'); +#endif + if (current->token.type == token_and) { + current->value = current->left->value && current->right->value; + } + else { + current->value = current->left->value || current->right->value; + } +#ifdef DEBUG_INCLUDE + debug_pos += sprintf (&debug[debug_pos], " Returning %c\n", + current->value ? '1' : '0'); +#endif + current->done = 1; + current = current->parent; + break; + + case token_eq: + case token_ne: +#ifdef DEBUG_INCLUDE + memcpy (&debug[debug_pos], " Evaluate eq/ne\n", + sizeof (" Evaluate eq/ne\n")); + debug_pos += sizeof (" Evaluate eq/ne\n"); +#endif + if ((current->left == (struct parse_node *) NULL) || + (current->right == (struct parse_node *) NULL) || + (current->left->token.type != token_string) || + ((current->right->token.type != token_string) && + (current->right->token.type != token_re))) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Invalid expression \"%s\" in file %s", + expr, r->filename); + *was_error = 1; + return retval; + } + buffer = ap_ssi_parse_string(r, ctx, current->left->token.value, + NULL, MAX_STRING_LEN, 0); + current->left->token.value = buffer; + buffer = ap_ssi_parse_string(r, ctx, current->right->token.value, + NULL, MAX_STRING_LEN, 0); + current->right->token.value = buffer; + if (current->right->token.type == token_re) { +#ifdef DEBUG_INCLUDE + debug_pos += sprintf (&debug[debug_pos], + " Re Compare (%s) with /%s/\n", + current->left->token.value, + current->right->token.value); +#endif + current->value = + re_check(r, ctx, current->left->token.value, + current->right->token.value); + } + else { +#ifdef DEBUG_INCLUDE + debug_pos += sprintf (&debug[debug_pos], + " Compare (%s) with (%s)\n", + current->left->token.value, + current->right->token.value); +#endif + current->value = + (strcmp(current->left->token.value, + current->right->token.value) == 0); + } + if (current->token.type == token_ne) { + current->value = !current->value; + } +#ifdef DEBUG_INCLUDE + debug_pos += sprintf (&debug[debug_pos], " Returning %c\n", + current->value ? '1' : '0'); +#endif + current->done = 1; + current = current->parent; + break; + case token_ge: + case token_gt: + case token_le: + case token_lt: +#ifdef DEBUG_INCLUDE + memcpy (&debug[debug_pos], " Evaluate ge/gt/le/lt\n", + sizeof (" Evaluate ge/gt/le/lt\n")); + debug_pos += sizeof (" Evaluate ge/gt/le/lt\n"); +#endif + if ((current->left == (struct parse_node *) NULL) || + (current->right == (struct parse_node *) NULL) || + (current->left->token.type != token_string) || + (current->right->token.type != token_string)) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Invalid expression \"%s\" in file %s", + expr, r->filename); + *was_error = 1; + return retval; + } + buffer = ap_ssi_parse_string(r, ctx, current->left->token.value, + NULL, MAX_STRING_LEN, 0); + current->left->token.value = buffer; + buffer = ap_ssi_parse_string(r, ctx, current->right->token.value, + NULL, MAX_STRING_LEN, 0); + current->right->token.value = buffer; +#ifdef DEBUG_INCLUDE + debug_pos += sprintf (&debug[debug_pos], + " Compare (%s) with (%s)\n", + current->left->token.value, + current->right->token.value); +#endif + current->value = + strcmp(current->left->token.value, + current->right->token.value); + if (current->token.type == token_ge) { + current->value = current->value >= 0; + } + else if (current->token.type == token_gt) { + current->value = current->value > 0; + } + else if (current->token.type == token_le) { + current->value = current->value <= 0; + } + else if (current->token.type == token_lt) { + current->value = current->value < 0; + } + else { + current->value = 0; /* Don't return -1 if unknown token */ + } +#ifdef DEBUG_INCLUDE + debug_pos += sprintf (&debug[debug_pos], " Returning %c\n", + current->value ? '1' : '0'); +#endif + current->done = 1; + current = current->parent; + break; + + case token_not: + if (current->right != (struct parse_node *) NULL) { + if (!current->right->done) { + current = current->right; + continue; + } + current->value = !current->right->value; + } + else { + current->value = 0; + } +#ifdef DEBUG_INCLUDE + debug_pos += sprintf (&debug[debug_pos], " Evaluate !: %c\n", + current->value ? '1' : '0'); +#endif + current->done = 1; + current = current->parent; + break; + + case token_group: + if (current->right != (struct parse_node *) NULL) { + if (!current->right->done) { + current = current->right; + continue; + } + current->value = current->right->value; + } + else { + current->value = 1; + } +#ifdef DEBUG_INCLUDE + debug_pos += sprintf (&debug[debug_pos], " Evaluate (): %c\n", + current->value ? '1' : '0'); +#endif + current->done = 1; + current = current->parent; + break; + + case token_lbrace: + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Unmatched '(' in \"%s\" in file %s", + expr, r->filename); + *was_error = 1; + return retval; + + case token_rbrace: + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Unmatched ')' in \"%s\" in file %s", + expr, r->filename); + *was_error = 1; + return retval; + + default: + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "bad token type"); + *was_error = 1; + return retval; + } + } + + retval = (root == (struct parse_node *) NULL) ? 0 : root->value; + return (retval); +} + +/*-------------------------------------------------------------------------*/ +#ifdef DEBUG_INCLUDE + +#define MAX_DEBUG_SIZE MAX_STRING_LEN +#define LOG_COND_STATUS(cntx, t_buck, h_ptr, ins_head, tag_text) \ +{ \ + char cond_txt[] = "**** X conditional_status=\"0\"\n"; \ + \ + if (cntx->flags & FLAG_COND_TRUE) { \ + cond_txt[31] = '1'; \ + } \ + memcpy(&cond_txt[5], tag_text, sizeof(tag_text)-1); \ + t_buck = apr_bucket_heap_create(cond_txt, sizeof(cond_txt)-1, \ + NULL, h_ptr->list); \ + APR_BUCKET_INSERT_BEFORE(h_ptr, t_buck); \ + \ + if (ins_head == NULL) { \ + ins_head = t_buck; \ + } \ +} +#define DUMP_PARSE_EXPR_DEBUG(t_buck, h_ptr, d_buf, ins_head) \ +{ \ + if (d_buf[0] != '\0') { \ + t_buck = apr_bucket_heap_create(d_buf, strlen(d_buf), \ + NULL, h_ptr->list); \ + APR_BUCKET_INSERT_BEFORE(h_ptr, t_buck); \ + \ + if (ins_head == NULL) { \ + ins_head = t_buck; \ + } \ + } \ +} +#else + +#define MAX_DEBUG_SIZE 10 +#define LOG_COND_STATUS(cntx, t_buck, h_ptr, ins_head, tag_text) +#define DUMP_PARSE_EXPR_DEBUG(t_buck, h_ptr, d_buf, ins_head) + +#endif +/*-------------------------------------------------------------------------*/ + +/* pjr - These seem to allow expr="fred" expr="joe" where joe overwrites fred. */ +static int handle_if(include_ctx_t *ctx, apr_bucket_brigade **bb, + request_rec *r, ap_filter_t *f, apr_bucket *head_ptr, + apr_bucket **inserted_head) +{ + char *tag = NULL; + char *tag_val = NULL; + char *expr = NULL; + int expr_ret, was_error, was_unmatched; + apr_bucket *tmp_buck; + char debug_buf[MAX_DEBUG_SIZE]; + + *inserted_head = NULL; + if (!(ctx->flags & FLAG_PRINTING)) { + ctx->if_nesting_level++; + } + else { + while (1) { + ap_ssi_get_tag_and_value(ctx, &tag, &tag_val, 0); + if (tag == NULL) { + if (expr == NULL) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "missing expr in if statement: %s", + r->filename); + CREATE_ERROR_BUCKET(ctx, tmp_buck, head_ptr, + *inserted_head); + return 1; + } + expr_ret = parse_expr(r, ctx, expr, &was_error, + &was_unmatched, debug_buf); + if (was_error) { + CREATE_ERROR_BUCKET(ctx, tmp_buck, head_ptr, + *inserted_head); + return 1; + } + if (was_unmatched) { + DUMP_PARSE_EXPR_DEBUG(tmp_buck, head_ptr, + "\nUnmatched '\n", *inserted_head); + } + DUMP_PARSE_EXPR_DEBUG(tmp_buck, head_ptr, debug_buf, + *inserted_head); + + if (expr_ret) { + ctx->flags |= (FLAG_PRINTING | FLAG_COND_TRUE); + } + else { + ctx->flags &= FLAG_CLEAR_PRINT_COND; + } + LOG_COND_STATUS(ctx, tmp_buck, head_ptr, *inserted_head, + " if"); + ctx->if_nesting_level = 0; + return 0; + } + else if (!strcmp(tag, "expr")) { + expr = tag_val; +#ifdef DEBUG_INCLUDE + if (1) { + apr_size_t d_len = 0; + d_len = sprintf(debug_buf, "**** if expr=\"%s\"\n", expr); + tmp_buck = apr_bucket_heap_create(debug_buf, d_len, NULL, + r->connection->bucket_alloc); + APR_BUCKET_INSERT_BEFORE(head_ptr, tmp_buck); + + if (*inserted_head == NULL) { + *inserted_head = tmp_buck; + } + } +#endif + } + else { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "unknown parameter \"%s\" to tag if in %s", tag, + r->filename); + CREATE_ERROR_BUCKET(ctx, tmp_buck, head_ptr, *inserted_head); + return 1; + } + + } + } + return 0; +} + +static int handle_elif(include_ctx_t *ctx, apr_bucket_brigade **bb, + request_rec *r, ap_filter_t *f, apr_bucket *head_ptr, + apr_bucket **inserted_head) +{ + char *tag = NULL; + char *tag_val = NULL; + char *expr = NULL; + int expr_ret, was_error, was_unmatched; + apr_bucket *tmp_buck; + char debug_buf[MAX_DEBUG_SIZE]; + + *inserted_head = NULL; + if (!ctx->if_nesting_level) { + while (1) { + ap_ssi_get_tag_and_value(ctx, &tag, &tag_val, 0); + if (tag == '\0') { + LOG_COND_STATUS(ctx, tmp_buck, head_ptr, *inserted_head, + " elif"); + + if (ctx->flags & FLAG_COND_TRUE) { + ctx->flags &= FLAG_CLEAR_PRINTING; + return (0); + } + if (expr == NULL) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "missing expr in elif statement: %s", + r->filename); + CREATE_ERROR_BUCKET(ctx, tmp_buck, head_ptr, + *inserted_head); + return 1; + } + expr_ret = parse_expr(r, ctx, expr, &was_error, + &was_unmatched, debug_buf); + if (was_error) { + CREATE_ERROR_BUCKET(ctx, tmp_buck, head_ptr, + *inserted_head); + return 1; + } + if (was_unmatched) { + DUMP_PARSE_EXPR_DEBUG(tmp_buck, head_ptr, + "\nUnmatched '\n", *inserted_head); + } + DUMP_PARSE_EXPR_DEBUG(tmp_buck, head_ptr, debug_buf, + *inserted_head); + + if (expr_ret) { + ctx->flags |= (FLAG_PRINTING | FLAG_COND_TRUE); + } + else { + ctx->flags &= FLAG_CLEAR_PRINT_COND; + } + LOG_COND_STATUS(ctx, tmp_buck, head_ptr, *inserted_head, + " elif"); + return (0); + } + else if (!strcmp(tag, "expr")) { + expr = tag_val; +#ifdef DEBUG_INCLUDE + if (1) { + apr_size_t d_len = 0; + d_len = sprintf(debug_buf, "**** elif expr=\"%s\"\n", expr); + tmp_buck = apr_bucket_heap_create(debug_buf, d_len, NULL, + r->connection->bucket_alloc); + APR_BUCKET_INSERT_BEFORE(head_ptr, tmp_buck); + + if (*inserted_head == NULL) { + *inserted_head = tmp_buck; + } + } +#endif + } + else { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "unknown parameter \"%s\" to tag if in %s", tag, + r->filename); + CREATE_ERROR_BUCKET(ctx, tmp_buck, head_ptr, *inserted_head); + return 1; + } + } + } + return 0; +} + +static int handle_else(include_ctx_t *ctx, apr_bucket_brigade **bb, + request_rec *r, ap_filter_t *f, apr_bucket *head_ptr, + apr_bucket **inserted_head) +{ + char *tag = NULL; + char *tag_val = NULL; + apr_bucket *tmp_buck; + + *inserted_head = NULL; + if (!ctx->if_nesting_level) { + ap_ssi_get_tag_and_value(ctx, &tag, &tag_val, 1); + if ((tag != NULL) || (tag_val != NULL)) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "else directive does not take tags in %s", r->filename); + if (ctx->flags & FLAG_PRINTING) { + CREATE_ERROR_BUCKET(ctx, tmp_buck, head_ptr, *inserted_head); + } + return -1; + } + else { + LOG_COND_STATUS(ctx, tmp_buck, head_ptr, *inserted_head, " else"); + + if (ctx->flags & FLAG_COND_TRUE) { + ctx->flags &= FLAG_CLEAR_PRINTING; + } + else { + ctx->flags |= (FLAG_PRINTING | FLAG_COND_TRUE); + } + return 0; + } + } + return 0; +} + +static int handle_endif(include_ctx_t *ctx, apr_bucket_brigade **bb, + request_rec *r, ap_filter_t *f, apr_bucket *head_ptr, + apr_bucket **inserted_head) +{ + char *tag = NULL; + char *tag_val = NULL; + apr_bucket *tmp_buck; + + *inserted_head = NULL; + if (!ctx->if_nesting_level) { + ap_ssi_get_tag_and_value(ctx, &tag, &tag_val, 1); + if ((tag != NULL) || (tag_val != NULL)) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "endif directive does not take tags in %s", r->filename); + CREATE_ERROR_BUCKET(ctx, tmp_buck, head_ptr, *inserted_head); + return -1; + } + else { + LOG_COND_STATUS(ctx, tmp_buck, head_ptr, *inserted_head, "endif"); + ctx->flags |= (FLAG_PRINTING | FLAG_COND_TRUE); + return 0; + } + } + else { + ctx->if_nesting_level--; + return 0; + } +} + +static int handle_set(include_ctx_t *ctx, apr_bucket_brigade **bb, + request_rec *r, ap_filter_t *f, apr_bucket *head_ptr, + apr_bucket **inserted_head) +{ + char *tag = NULL; + char *tag_val = NULL; + char *var = NULL; + apr_bucket *tmp_buck; + char *parsed_string; + request_rec *sub = r->main; + apr_pool_t *p = r->pool; + + /* we need to use the 'main' request pool to set notes as that is + * a notes lifetime + */ + while (sub) { + p = sub->pool; + sub = sub->main; + } + + *inserted_head = NULL; + if (ctx->flags & FLAG_PRINTING) { + while (1) { + ap_ssi_get_tag_and_value(ctx, &tag, &tag_val, 1); + if ((tag == NULL) && (tag_val == NULL)) { + return 0; + } + else if (tag_val == NULL) { + return 1; + } + else if (!strcmp(tag, "var")) { + var = ap_ssi_parse_string(r, ctx, tag_val, NULL, + MAX_STRING_LEN, 0); + } + else if (!strcmp(tag, "value")) { + if (var == (char *) NULL) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "variable must precede value in set directive in %s", + r->filename); + CREATE_ERROR_BUCKET(ctx, tmp_buck, head_ptr, + *inserted_head); + return (-1); + } + parsed_string = ap_ssi_parse_string(r, ctx, tag_val, NULL, + MAX_STRING_LEN, 0); + apr_table_setn(r->subprocess_env, apr_pstrdup(p, var), + apr_pstrdup(p, parsed_string)); + } + else { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Invalid tag for set directive in %s", r->filename); + CREATE_ERROR_BUCKET(ctx, tmp_buck, head_ptr, *inserted_head); + return -1; + } + } + } + return 0; +} + +static int handle_printenv(include_ctx_t *ctx, apr_bucket_brigade **bb, + request_rec *r, ap_filter_t *f, + apr_bucket *head_ptr, apr_bucket **inserted_head) +{ + char *tag = NULL; + char *tag_val = NULL; + apr_bucket *tmp_buck; + + if (ctx->flags & FLAG_PRINTING) { + ap_ssi_get_tag_and_value(ctx, &tag, &tag_val, 1); + if ((tag == NULL) && (tag_val == NULL)) { + const apr_array_header_t *arr = apr_table_elts(r->subprocess_env); + const apr_table_entry_t *elts = (const apr_table_entry_t *)arr->elts; + int i; + const char *key_text, *val_text; + char *key_val, *next; + apr_size_t k_len, v_len, kv_length; + + *inserted_head = NULL; + for (i = 0; i < arr->nelts; ++i) { + key_text = ap_escape_html(r->pool, elts[i].key); + val_text = elts[i].val; + if (val_text == LAZY_VALUE) { + val_text = add_include_vars_lazy(r, elts[i].key); + } + val_text = ap_escape_html(r->pool, elts[i].val); + k_len = strlen(key_text); + v_len = strlen(val_text); + kv_length = k_len + v_len + sizeof("=\n"); + key_val = apr_palloc(r->pool, kv_length); + next = key_val; + memcpy(next, key_text, k_len); + next += k_len; + *next++ = '='; + memcpy(next, val_text, v_len); + next += v_len; + *next++ = '\n'; + *next = 0; + tmp_buck = apr_bucket_pool_create(key_val, kv_length - 1, + r->pool, + r->connection->bucket_alloc); + APR_BUCKET_INSERT_BEFORE(head_ptr, tmp_buck); + if (*inserted_head == NULL) { + *inserted_head = tmp_buck; + } + } + return 0; + } + else { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "printenv directive does not take tags in %s", + r->filename); + CREATE_ERROR_BUCKET(ctx, tmp_buck, head_ptr, *inserted_head); + return -1; + } + } + return 0; +} + +/* -------------------------- The main function --------------------------- */ + +/* + * returns the index position of the first byte of start_seq (or the len of + * the buffer as non-match) + */ +static apr_size_t find_start_sequence(ssi_ctx_t *ctx, const char *data, + apr_size_t len) +{ + apr_size_t slen = ctx->ctx->start_seq_len; + apr_size_t index; + const char *p, *ep; + + if (len < slen) { + p = data; /* try partial match at the end of the buffer (below) */ + } + else { + /* try fast bndm search over the buffer + * (hopefully the whole start sequence can be found in this buffer) + */ + index = bndm(ctx->ctx->start_seq, ctx->ctx->start_seq_len, data, len, + ctx->ctx->start_seq_pat); + + /* wow, found it. ready. */ + if (index < len) { + ctx->state = PARSE_DIRECTIVE; + return index; + } + else { + /* ok, the pattern can't be found as whole in the buffer, + * check the end for a partial match + */ + p = data + len - slen + 1; + } + } + + ep = data + len; + do { + while (p < ep && *p != *ctx->ctx->start_seq) { + ++p; + } + + index = p - data; + + /* found a possible start_seq start */ + if (p < ep) { + apr_size_t pos = 1; + + ++p; + while (p < ep && *p == ctx->ctx->start_seq[pos]) { + ++p; + ++pos; + } + + /* partial match found. Store the info for the next round */ + if (p == ep) { + ctx->state = PARSE_HEAD; + ctx->ctx->parse_pos = pos; + return index; + } + } + + /* we must try all combinations; consider (e.g.) SSIStartTag "--->" + * and a string data of "--.-" and the end of the buffer + */ + p = data + index + 1; + } while (p < ep); + + /* no match */ + return len; +} + +/* + * returns the first byte *after* the partial (or final) match. + * + * If we had to trick with the start_seq start, 'release' returns the + * number of chars of the start_seq which appeared not to be part of a + * full tag and may have to be passed down the filter chain. + */ +static apr_size_t find_partial_start_sequence(ssi_ctx_t *ctx, + const char *data, + apr_size_t len, + apr_size_t *release) +{ + apr_size_t pos, spos = 0; + apr_size_t slen = ctx->ctx->start_seq_len; + const char *p, *ep; + + pos = ctx->ctx->parse_pos; + ep = data + len; + *release = 0; + + do { + p = data; + + while (p < ep && pos < slen && *p == ctx->ctx->start_seq[pos]) { + ++p; + ++pos; + } + + /* full match */ + if (pos == slen) { + ctx->state = PARSE_DIRECTIVE; + return (p - data); + } + + /* the whole buffer is a partial match */ + if (p == ep) { + ctx->ctx->parse_pos = pos; + return (p - data); + } + + /* No match so far, but again: + * We must try all combinations, since the start_seq is a random + * user supplied string + * + * So: look if the first char of start_seq appears somewhere within + * the current partial match. If it does, try to start a match that + * begins with this offset. (This can happen, if a strange + * start_seq like "---->" spans buffers) + */ + if (spos < ctx->ctx->parse_pos) { + do { + ++spos; + ++*release; + p = ctx->ctx->start_seq + spos; + pos = ctx->ctx->parse_pos - spos; + + while (pos && *p != *ctx->ctx->start_seq) { + ++p; + ++spos; + ++*release; + --pos; + } + + /* if a matching beginning char was found, try to match the + * remainder of the old buffer. + */ + if (pos > 1) { + apr_size_t t = 1; + + ++p; + while (t < pos && *p == ctx->ctx->start_seq[t]) { + ++p; + ++t; + } + + if (t == pos) { + /* yeah, another partial match found in the *old* + * buffer, now test the *current* buffer for + * continuing match + */ + break; + } + } + } while (pos > 1); + + if (pos) { + continue; + } + } + + break; + } while (1); /* work hard to find a match ;-) */ + + /* no match at all, release all (wrongly) matched chars so far */ + *release = ctx->ctx->parse_pos; + ctx->state = PARSE_PRE_HEAD; + return 0; +} + +/* + * returns the position after the directive + */ +static apr_size_t find_directive(ssi_ctx_t *ctx, const char *data, + apr_size_t len, char ***store, + apr_size_t **store_len) +{ + const char *p = data; + const char *ep = data + len; + apr_size_t pos; + + switch (ctx->state) { + case PARSE_DIRECTIVE: + while (p < ep && !apr_isspace(*p)) { + /* we have to consider the case of missing space between directive + * and end_seq (be somewhat lenient), e.g. + */ + if (*p == *ctx->ctx->end_seq) { + ctx->state = PARSE_DIRECTIVE_TAIL; + ctx->ctx->parse_pos = 1; + ++p; + return (p - data); + } + ++p; + } + + if (p < ep) { /* found delimiter whitespace */ + ctx->state = PARSE_DIRECTIVE_POSTNAME; + *store = &ctx->directive; + *store_len = &ctx->ctx->directive_length; + } + + break; + + case PARSE_DIRECTIVE_TAIL: + pos = ctx->ctx->parse_pos; + + while (p < ep && pos < ctx->end_seq_len && + *p == ctx->ctx->end_seq[pos]) { + ++p; + ++pos; + } + + /* full match, we're done */ + if (pos == ctx->end_seq_len) { + ctx->state = PARSE_DIRECTIVE_POSTTAIL; + *store = &ctx->directive; + *store_len = &ctx->ctx->directive_length; + break; + } + + /* partial match, the buffer is too small to match fully */ + if (p == ep) { + ctx->ctx->parse_pos = pos; + break; + } + + /* no match. continue normal parsing */ + ctx->state = PARSE_DIRECTIVE; + return 0; + + case PARSE_DIRECTIVE_POSTTAIL: + ctx->state = PARSE_EXECUTE; + ctx->ctx->directive_length -= ctx->end_seq_len; + /* continue immediately with the next state */ + + case PARSE_DIRECTIVE_POSTNAME: + if (PARSE_DIRECTIVE_POSTNAME == ctx->state) { + ctx->state = PARSE_PRE_ARG; + } + ctx->argc = 0; + ctx->argv = NULL; + + if (!ctx->ctx->directive_length) { + ctx->error = 1; + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, ctx->r, "missing directive " + "name in parsed document %s", ctx->r->filename); + } + else { + char *sp = ctx->directive; + char *sep = ctx->directive + ctx->ctx->directive_length; + + /* normalize directive name */ + for (; sp < sep; ++sp) { + *sp = apr_tolower(*sp); + } + } + + return 0; + + default: + /* get a rid of a gcc warning about unhandled enumerations */ + break; + } + + return (p - data); +} + +/* + * find out whether the next token is (a possible) end_seq or an argument + */ +static apr_size_t find_arg_or_tail(ssi_ctx_t *ctx, const char *data, + apr_size_t len) +{ + const char *p = data; + const char *ep = data + len; + + /* skip leading WS */ + while (p < ep && apr_isspace(*p)) { + ++p; + } + + /* buffer doesn't consist of whitespaces only */ + if (p < ep) { + ctx->state = (*p == *ctx->ctx->end_seq) ? PARSE_TAIL : PARSE_ARG; + } + + return (p - data); +} + +/* + * test the stream for end_seq. If it doesn't match at all, it must be an + * argument + */ +static apr_size_t find_tail(ssi_ctx_t *ctx, const char *data, + apr_size_t len) +{ + const char *p = data; + const char *ep = data + len; + apr_size_t pos = ctx->ctx->parse_pos; + + if (PARSE_TAIL == ctx->state) { + ctx->state = PARSE_TAIL_SEQ; + pos = ctx->ctx->parse_pos = 0; + } + + while (p < ep && pos < ctx->end_seq_len && *p == ctx->ctx->end_seq[pos]) { + ++p; + ++pos; + } + + /* bingo, full match */ + if (pos == ctx->end_seq_len) { + ctx->state = PARSE_EXECUTE; + return (p - data); + } + + /* partial match, the buffer is too small to match fully */ + if (p == ep) { + ctx->ctx->parse_pos = pos; + return (p - data); + } + + /* no match. It must be an argument string then */ + ctx->state = PARSE_ARG; + return 0; +} + +/* + * extract name=value from the buffer + * A pcre-pattern could look (similar to): + * name\s*(?:=\s*(["'`]?)value\1(?>\s*))? + */ +static apr_size_t find_argument(ssi_ctx_t *ctx, const char *data, + apr_size_t len, char ***store, + apr_size_t **store_len) +{ + const char *p = data; + const char *ep = data + len; + + switch (ctx->state) { + case PARSE_ARG: + /* + * create argument structure and append it to the current list + */ + ctx->current_arg = apr_palloc(ctx->dpool, + sizeof(*ctx->current_arg)); + ctx->current_arg->next = NULL; + + ++(ctx->argc); + if (!ctx->argv) { + ctx->argv = ctx->current_arg; + } + else { + ssi_arg_item_t *newarg = ctx->argv; + + while (newarg->next) { + newarg = newarg->next; + } + newarg->next = ctx->current_arg; + } + + /* check whether it's a valid one. If it begins with a quote, we + * can safely assume, someone forgot the name of the argument + */ + switch (*p) { + case '"': case '\'': case '`': + *store = NULL; + + ctx->state = PARSE_ARG_VAL; + ctx->quote = *p++; + ctx->current_arg->name = NULL; + ctx->current_arg->name_len = 0; + ctx->error = 1; + + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, ctx->r, "missing argument " + "name for value to tag %s in %s", + apr_pstrmemdup(ctx->r->pool, ctx->directive, + ctx->ctx->directive_length), + ctx->r->filename); + + return (p - data); + + default: + ctx->state = PARSE_ARG_NAME; + } + /* continue immediately with next state */ + + case PARSE_ARG_NAME: + while (p < ep && !apr_isspace(*p) && *p != '=') { + ++p; + } + + if (p < ep) { + ctx->state = PARSE_ARG_POSTNAME; + *store = &ctx->current_arg->name; + *store_len = &ctx->current_arg->name_len; + return (p - data); + } + break; + + case PARSE_ARG_POSTNAME: + ctx->current_arg->name = apr_pstrmemdup(ctx->dpool, + ctx->current_arg->name, + ctx->current_arg->name_len); + if (!ctx->current_arg->name_len) { + ctx->error = 1; + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, ctx->r, "missing argument " + "name for value to tag %s in %s", + apr_pstrmemdup(ctx->r->pool, ctx->directive, + ctx->ctx->directive_length), + ctx->r->filename); + } + else { + char *sp = ctx->current_arg->name; + + /* normalize the name */ + while (*sp) { + *sp = apr_tolower(*sp); + ++sp; + } + } + + ctx->state = PARSE_ARG_EQ; + /* continue with next state immediately */ + + case PARSE_ARG_EQ: + *store = NULL; + + while (p < ep && apr_isspace(*p)) { + ++p; + } + + if (p < ep) { + if (*p == '=') { + ctx->state = PARSE_ARG_PREVAL; + ++p; + } + else { /* no value */ + ctx->current_arg->value = NULL; + ctx->state = PARSE_PRE_ARG; + } + + return (p - data); + } + break; + + case PARSE_ARG_PREVAL: + *store = NULL; + + while (p < ep && apr_isspace(*p)) { + ++p; + } + + /* buffer doesn't consist of whitespaces only */ + if (p < ep) { + ctx->state = PARSE_ARG_VAL; + switch (*p) { + case '"': case '\'': case '`': + ctx->quote = *p++; + break; + default: + ctx->quote = '\0'; + break; + } + + return (p - data); + } + break; + + case PARSE_ARG_VAL_ESC: + if (*p == ctx->quote) { + ++p; + } + ctx->state = PARSE_ARG_VAL; + /* continue with next state immediately */ + + case PARSE_ARG_VAL: + for (; p < ep; ++p) { + if (ctx->quote && *p == '\\') { + ++p; + if (p == ep) { + ctx->state = PARSE_ARG_VAL_ESC; + break; + } + + if (*p != ctx->quote) { + --p; + } + } + else if (ctx->quote && *p == ctx->quote) { + ++p; + *store = &ctx->current_arg->value; + *store_len = &ctx->current_arg->value_len; + ctx->state = PARSE_ARG_POSTVAL; + break; + } + else if (!ctx->quote && apr_isspace(*p)) { + ++p; + *store = &ctx->current_arg->value; + *store_len = &ctx->current_arg->value_len; + ctx->state = PARSE_ARG_POSTVAL; + break; + } + } + + return (p - data); + + case PARSE_ARG_POSTVAL: + /* + * The value is still the raw input string. Finally clean it up. + */ + --(ctx->current_arg->value_len); + + /* strip quote escaping \ from the string */ + if (ctx->quote) { + apr_size_t shift = 0; + char *sp; + + sp = ctx->current_arg->value; + ep = ctx->current_arg->value + ctx->current_arg->value_len; + while (sp < ep && *sp != '\\') { + ++sp; + } + for (; sp < ep; ++sp) { + if (*sp == '\\' && sp[1] == ctx->quote) { + ++sp; + ++shift; + } + if (shift) { + *(sp-shift) = *sp; + } + } + + ctx->current_arg->value_len -= shift; + } + + ctx->current_arg->value[ctx->current_arg->value_len] = '\0'; + ctx->state = PARSE_PRE_ARG; + + return 0; + + default: + /* get a rid of a gcc warning about unhandled enumerations */ + break; + } + + return len; /* partial match of something */ +} + +/* + * This is the main loop over the current bucket brigade. + */ +static apr_status_t send_parsed_content(ap_filter_t *f, apr_bucket_brigade *bb) +{ + ssi_ctx_t *ctx = f->ctx; + request_rec *r = f->r; + apr_bucket *b = APR_BRIGADE_FIRST(bb); + apr_bucket_brigade *pass_bb; + apr_status_t rv = APR_SUCCESS; + char *magic; /* magic pointer for sentinel use */ + + /* fast exit */ + if (APR_BRIGADE_EMPTY(bb)) { + return APR_SUCCESS; + } + + /* we may crash, since already cleaned up; hand over the responsibility + * to the next filter;-) + */ + if (ctx->seen_eos) { + return ap_pass_brigade(f->next, bb); + } + + /* All stuff passed along has to be put into that brigade */ + pass_bb = apr_brigade_create(ctx->ctx->pool, f->c->bucket_alloc); + ctx->ctx->bytes_parsed = 0; + ctx->ctx->output_now = 0; + ctx->error = 0; + + /* loop over the current bucket brigade */ + while (b != APR_BRIGADE_SENTINEL(bb)) { + const char *data = NULL; + apr_size_t len, index, release; + apr_bucket *newb = NULL; + char **store = &magic; + apr_size_t *store_len; + + /* handle meta buckets before reading any data */ + if (APR_BUCKET_IS_METADATA(b)) { + newb = APR_BUCKET_NEXT(b); + + APR_BUCKET_REMOVE(b); + + if (APR_BUCKET_IS_EOS(b)) { + ctx->seen_eos = 1; + + /* Hit end of stream, time for cleanup ... But wait! + * Perhaps we're not ready yet. We may have to loop one or + * two times again to finish our work. In that case, we + * just re-insert the EOS bucket to allow for an extra loop. + * + * PARSE_EXECUTE means, we've hit a directive just before the + * EOS, which is now waiting for execution. + * + * PARSE_DIRECTIVE_POSTTAIL means, we've hit a directive with + * no argument and no space between directive and end_seq + * just before the EOS. (consider as last + * or only string within the stream). This state, however, + * just cleans up and turns itself to PARSE_EXECUTE, which + * will be passed through within the next (and actually + * last) round. + */ + if (PARSE_EXECUTE == ctx->state || + PARSE_DIRECTIVE_POSTTAIL == ctx->state) { + APR_BUCKET_INSERT_BEFORE(newb, b); + } + else { + break; /* END OF STREAM */ + } + } + else { + APR_BRIGADE_INSERT_TAIL(pass_bb, b); + + if (APR_BUCKET_IS_FLUSH(b)) { + ctx->ctx->output_now = 1; + } + + b = newb; + continue; + } + } + + /* enough is enough ... */ + if (ctx->ctx->output_now || + ctx->ctx->bytes_parsed > AP_MIN_BYTES_TO_WRITE) { + + if (!APR_BRIGADE_EMPTY(pass_bb)) { + rv = ap_pass_brigade(f->next, pass_bb); + if (!APR_STATUS_IS_SUCCESS(rv)) { + apr_brigade_destroy(pass_bb); + return rv; + } + } + + ctx->ctx->output_now = 0; + ctx->ctx->bytes_parsed = 0; + } + + /* read the current bucket data */ + len = 0; + if (!ctx->seen_eos) { + if (ctx->ctx->bytes_parsed > 0) { + rv = apr_bucket_read(b, &data, &len, APR_NONBLOCK_READ); + if (APR_STATUS_IS_EAGAIN(rv)) { + ctx->ctx->output_now = 1; + continue; + } + } + + if (!len || !APR_STATUS_IS_SUCCESS(rv)) { + rv = apr_bucket_read(b, &data, &len, APR_BLOCK_READ); + } + + if (!APR_STATUS_IS_SUCCESS(rv)) { + apr_brigade_destroy(pass_bb); + return rv; + } + + ctx->ctx->bytes_parsed += len; + } + + /* zero length bucket, fetch next one */ + if (!len && !ctx->seen_eos) { + b = APR_BUCKET_NEXT(b); + continue; + } + + /* + * it's actually a data containing bucket, start/continue parsing + */ + + switch (ctx->state) { + /* no current tag; search for start sequence */ + case PARSE_PRE_HEAD: + index = find_start_sequence(ctx, data, len); + + if (index < len) { + apr_bucket_split(b, index); + } + + newb = APR_BUCKET_NEXT(b); + if (ctx->ctx->flags & FLAG_PRINTING) { + APR_BUCKET_REMOVE(b); + APR_BRIGADE_INSERT_TAIL(pass_bb, b); + } + else { + apr_bucket_delete(b); + } + + if (index < len) { + /* now delete the start_seq stuff from the remaining bucket */ + if (PARSE_DIRECTIVE == ctx->state) { /* full match */ + apr_bucket_split(newb, ctx->ctx->start_seq_len); + ctx->ctx->output_now = 1; /* pass pre-tag stuff */ + } + + b = APR_BUCKET_NEXT(newb); + apr_bucket_delete(newb); + } + else { + b = newb; + } + + break; + + /* we're currently looking for the end of the start sequence */ + case PARSE_HEAD: + index = find_partial_start_sequence(ctx, data, len, &release); + + /* check if we mismatched earlier and have to release some chars */ + if (release && (ctx->ctx->flags & FLAG_PRINTING)) { + char *to_release = apr_palloc(ctx->ctx->pool, release); + + memcpy(to_release, ctx->ctx->start_seq, release); + newb = apr_bucket_pool_create(to_release, release, + ctx->ctx->pool, + f->c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(pass_bb, newb); + } + + if (index) { /* any match */ + /* now delete the start_seq stuff from the remaining bucket */ + if (PARSE_DIRECTIVE == ctx->state) { /* final match */ + apr_bucket_split(b, index); + ctx->ctx->output_now = 1; /* pass pre-tag stuff */ + } + newb = APR_BUCKET_NEXT(b); + apr_bucket_delete(b); + b = newb; + } + + break; + + /* we're currently grabbing the directive name */ + case PARSE_DIRECTIVE: + case PARSE_DIRECTIVE_POSTNAME: + case PARSE_DIRECTIVE_TAIL: + case PARSE_DIRECTIVE_POSTTAIL: + index = find_directive(ctx, data, len, &store, &store_len); + + if (index) { + apr_bucket_split(b, index); + newb = APR_BUCKET_NEXT(b); + } + + if (store) { + if (index) { + APR_BUCKET_REMOVE(b); + APR_BRIGADE_INSERT_TAIL(ctx->tmp_bb, b); + b = newb; + } + + /* time for cleanup? */ + if (store != &magic) { + apr_brigade_pflatten(ctx->tmp_bb, store, store_len, + ctx->dpool); + apr_brigade_cleanup(ctx->tmp_bb); + } + } + else if (index) { + apr_bucket_delete(b); + b = newb; + } + + break; + + /* skip WS and find out what comes next (arg or end_seq) */ + case PARSE_PRE_ARG: + index = find_arg_or_tail(ctx, data, len); + + if (index) { /* skipped whitespaces */ + if (index < len) { + apr_bucket_split(b, index); + } + newb = APR_BUCKET_NEXT(b); + apr_bucket_delete(b); + b = newb; + } + + break; + + /* currently parsing name[=val] */ + case PARSE_ARG: + case PARSE_ARG_NAME: + case PARSE_ARG_POSTNAME: + case PARSE_ARG_EQ: + case PARSE_ARG_PREVAL: + case PARSE_ARG_VAL: + case PARSE_ARG_VAL_ESC: + case PARSE_ARG_POSTVAL: + index = find_argument(ctx, data, len, &store, &store_len); + + if (index) { + apr_bucket_split(b, index); + newb = APR_BUCKET_NEXT(b); + } + + if (store) { + if (index) { + APR_BUCKET_REMOVE(b); + APR_BRIGADE_INSERT_TAIL(ctx->tmp_bb, b); + b = newb; + } + + /* time for cleanup? */ + if (store != &magic) { + apr_brigade_pflatten(ctx->tmp_bb, store, store_len, + ctx->dpool); + apr_brigade_cleanup(ctx->tmp_bb); + } + } + else if (index) { + apr_bucket_delete(b); + b = newb; + } + + break; + + /* try to match end_seq at current pos. */ + case PARSE_TAIL: + case PARSE_TAIL_SEQ: + index = find_tail(ctx, data, len); + + switch (ctx->state) { + case PARSE_EXECUTE: /* full match */ + apr_bucket_split(b, index); + newb = APR_BUCKET_NEXT(b); + apr_bucket_delete(b); + b = newb; + break; + + case PARSE_ARG: /* no match */ + /* PARSE_ARG must reparse at the beginning */ + APR_BRIGADE_PREPEND(bb, ctx->tmp_bb); + b = APR_BRIGADE_FIRST(bb); + break; + + default: /* partial match */ + newb = APR_BUCKET_NEXT(b); + APR_BUCKET_REMOVE(b); + APR_BRIGADE_INSERT_TAIL(ctx->tmp_bb, b); + b = newb; + break; + } + + break; + + /* now execute the parsed directive, cleanup the space and + * start again with PARSE_PRE_HEAD + */ + case PARSE_EXECUTE: + /* if there was an error, it was already logged; just stop here */ + if (ctx->error) { + if (ctx->ctx->flags & FLAG_PRINTING) { + SSI_CREATE_ERROR_BUCKET(ctx->ctx, f, pass_bb); + ctx->error = 0; + } + } + else { + include_handler_fn_t *handle_func; + + handle_func = + (include_handler_fn_t *) apr_hash_get(include_hash, + ctx->directive, + ctx->ctx->directive_length); + if (handle_func) { + apr_bucket *dummy; + char *tag; + apr_size_t tag_len = 0; + ssi_arg_item_t *carg = ctx->argv; + + /* legacy wrapper code */ + while (carg) { + /* +1 \0 byte (either after tag or value) + * +1 = byte (before value) + */ + tag_len += (carg->name ? carg->name_len : 0) + + (carg->value ? carg->value_len + 1 : 0) + 1; + carg = carg->next; + } + + tag = ctx->ctx->combined_tag = ctx->ctx->curr_tag_pos = + apr_palloc(ctx->dpool, tag_len); + + carg = ctx->argv; + while (carg) { + if (carg->name) { + memcpy(tag, carg->name, carg->name_len); + tag += carg->name_len; + } + if (carg->value) { + *tag++ = '='; + memcpy(tag, carg->value, carg->value_len); + tag += carg->value_len; + } + *tag++ = '\0'; + carg = carg->next; + } + ctx->ctx->tag_length = tag_len; + + /* create dummy buckets for backards compat */ + ctx->ctx->head_start_bucket = + apr_bucket_pool_create(apr_pmemdup(ctx->ctx->pool, + ctx->ctx->start_seq, + ctx->ctx->start_seq_len), + ctx->ctx->start_seq_len, + ctx->ctx->pool, + f->c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(ctx->ctx->ssi_tag_brigade, + ctx->ctx->head_start_bucket); + ctx->ctx->tag_start_bucket = + apr_bucket_pool_create(apr_pmemdup(ctx->ctx->pool, + ctx->ctx->combined_tag, + ctx->ctx->tag_length), + ctx->ctx->tag_length, + ctx->ctx->pool, + f->c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(ctx->ctx->ssi_tag_brigade, + ctx->ctx->tag_start_bucket); + ctx->ctx->tail_start_bucket = + apr_bucket_pool_create(apr_pmemdup(ctx->ctx->pool, + ctx->ctx->end_seq, + ctx->end_seq_len), + ctx->end_seq_len, + ctx->ctx->pool, + f->c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(ctx->ctx->ssi_tag_brigade, + ctx->ctx->tail_start_bucket); + + rv = handle_func(ctx->ctx, &bb, r, f, b, &dummy); + + apr_brigade_cleanup(ctx->ctx->ssi_tag_brigade); + + if (rv != 0 && rv != 1 && rv != -1) { + apr_brigade_destroy(pass_bb); + return rv; + } + + if (dummy) { + apr_bucket_brigade *remain; + + remain = apr_brigade_split(bb, b); + APR_BRIGADE_CONCAT(pass_bb, bb); + bb = remain; + } + } + else { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "unknown directive \"%s\" in parsed doc %s", + apr_pstrmemdup(r->pool, ctx->directive, + ctx->ctx->directive_length), + r->filename); + if (ctx->ctx->flags & FLAG_PRINTING) { + SSI_CREATE_ERROR_BUCKET(ctx->ctx, f, pass_bb); + } + } + } + + /* cleanup */ + apr_pool_clear(ctx->dpool); + apr_brigade_cleanup(ctx->tmp_bb); + + /* Oooof. Done here, start next round */ + ctx->state = PARSE_PRE_HEAD; + break; + } + + } /* while (brigade) */ + + /* End of stream. Final cleanup */ + if (ctx->seen_eos) { + if (PARSE_HEAD == ctx->state) { + if (ctx->ctx->flags & FLAG_PRINTING) { + char *to_release = apr_palloc(ctx->ctx->pool, + ctx->ctx->parse_pos); + + memcpy(to_release, ctx->ctx->start_seq, ctx->ctx->parse_pos); + APR_BRIGADE_INSERT_TAIL(pass_bb, + apr_bucket_pool_create(to_release, + ctx->ctx->parse_pos, ctx->ctx->pool, + f->c->bucket_alloc)); + } + } + else if (PARSE_PRE_HEAD != ctx->state) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "SSI directive was not properly finished at the end " + "of parsed document %s", r->filename); + if (ctx->ctx->flags & FLAG_PRINTING) { + SSI_CREATE_ERROR_BUCKET(ctx->ctx, f, pass_bb); + } + } + + if (!(ctx->ctx->flags & FLAG_PRINTING)) { + ap_log_rerror(APLOG_MARK, APLOG_WARNING, 0, r, + "missing closing endif directive in parsed document" + " %s", r->filename); + } + + /* cleanup our temporary memory */ + apr_brigade_destroy(ctx->tmp_bb); + apr_pool_destroy(ctx->dpool); + + /* don't forget to finally insert the EOS bucket */ + APR_BRIGADE_INSERT_TAIL(pass_bb, b); + } + + /* if something's left over, pass it along */ + if (!APR_BRIGADE_EMPTY(pass_bb)) { + rv = ap_pass_brigade(f->next, pass_bb); + } + else { + rv = APR_SUCCESS; + } + + apr_brigade_destroy(pass_bb); + return rv; +} + +static void *create_includes_dir_config(apr_pool_t *p, char *dummy) +{ + include_dir_config *result = + (include_dir_config *)apr_palloc(p, sizeof(include_dir_config)); + enum xbithack *xbh = (enum xbithack *) apr_palloc(p, sizeof(enum xbithack)); + *xbh = DEFAULT_XBITHACK; + result->default_error_msg = DEFAULT_ERROR_MSG; + result->default_time_fmt = DEFAULT_TIME_FORMAT; + result->xbithack = xbh; + return result; +} + +static void *create_includes_server_config(apr_pool_t*p, server_rec *server) +{ + include_server_config *result = + (include_server_config *)apr_palloc(p, sizeof(include_server_config)); + result->default_end_tag = ENDING_SEQUENCE; + result->default_start_tag =STARTING_SEQUENCE; + result->start_tag_len = sizeof(STARTING_SEQUENCE)-1; + /* compile the pattern used by find_start_sequence */ + bndm_compile(&result->start_seq_pat, result->default_start_tag, + result->start_tag_len); + + result->undefinedEcho = apr_pstrdup(p,"(none)"); + result->undefinedEchoLen = strlen( result->undefinedEcho); + return result; +} +static const char *set_xbithack(cmd_parms *cmd, void *xbp, const char *arg) +{ + include_dir_config *conf = (include_dir_config *)xbp; + + if (!strcasecmp(arg, "off")) { + *conf->xbithack = xbithack_off; + } + else if (!strcasecmp(arg, "on")) { + *conf->xbithack = xbithack_on; + } + else if (!strcasecmp(arg, "full")) { + *conf->xbithack = xbithack_full; + } + else { + return "XBitHack must be set to Off, On, or Full"; + } + + return NULL; +} + +static int includes_setup(ap_filter_t *f) +{ + include_dir_config *conf = + (include_dir_config *)ap_get_module_config(f->r->per_dir_config, + &include_module); + + /* When our xbithack value isn't set to full or our platform isn't + * providing group-level protection bits or our group-level bits do not + * have group-execite on, we will set the no_local_copy value to 1 so + * that we will not send 304s. + */ + if ((*conf->xbithack != xbithack_full) + || !(f->r->finfo.valid & APR_FINFO_GPROT) + || !(f->r->finfo.protection & APR_GEXECUTE)) { + f->r->no_local_copy = 1; + } + + /* Don't allow ETag headers to be generated - see RFC2616 - 13.3.4. + * We don't know if we are going to be including a file or executing + * a program - in either case a strong ETag header will likely be invalid. + */ + apr_table_setn(f->r->notes, "no-etag", ""); + + return OK; +} + +static apr_status_t includes_filter(ap_filter_t *f, apr_bucket_brigade *b) +{ + request_rec *r = f->r; + ssi_ctx_t *ctx = f->ctx; + request_rec *parent; + include_dir_config *conf = + (include_dir_config *)ap_get_module_config(r->per_dir_config, + &include_module); + + include_server_config *sconf= ap_get_module_config(r->server->module_config, + &include_module); + + if (!(ap_allow_options(r) & OPT_INCLUDES)) { + ap_log_rerror(APLOG_MARK, APLOG_WARNING, 0, r, + "mod_include: Options +Includes (or IncludesNoExec) " + "wasn't set, INCLUDES filter removed"); + ap_remove_output_filter(f); + return ap_pass_brigade(f->next, b); + } + + if (!f->ctx) { + /* create context for this filter */ + f->ctx = ctx = apr_palloc(f->c->pool, sizeof(*ctx)); + ctx->ctx = apr_pcalloc(f->c->pool, sizeof(*ctx->ctx)); + ctx->ctx->pool = f->r->pool; + apr_pool_create(&ctx->dpool, ctx->ctx->pool); + + /* configuration data */ + ctx->end_seq_len = strlen(sconf->default_end_tag); + ctx->r = f->r; + + /* runtime data */ + ctx->tmp_bb = apr_brigade_create(ctx->ctx->pool, f->c->bucket_alloc); + ctx->seen_eos = 0; + ctx->state = PARSE_PRE_HEAD; + ctx->ctx->flags = (FLAG_PRINTING | FLAG_COND_TRUE); + if (ap_allow_options(f->r) & OPT_INCNOEXEC) { + ctx->ctx->flags |= FLAG_NO_EXEC; + } + ctx->ctx->if_nesting_level = 0; + ctx->ctx->re_string = NULL; + ctx->ctx->error_str_override = NULL; + ctx->ctx->time_str_override = NULL; + + ctx->ctx->error_str = conf->default_error_msg; + ctx->ctx->time_str = conf->default_time_fmt; + ctx->ctx->start_seq_pat = &sconf->start_seq_pat; + ctx->ctx->start_seq = sconf->default_start_tag; + ctx->ctx->start_seq_len = sconf->start_tag_len; + ctx->ctx->end_seq = sconf->default_end_tag; + + /* legacy compat stuff */ + ctx->ctx->state = PARSED; /* dummy */ + ctx->ctx->ssi_tag_brigade = apr_brigade_create(f->c->pool, + f->c->bucket_alloc); + ctx->ctx->status = APR_SUCCESS; + ctx->ctx->head_start_index = 0; + ctx->ctx->tag_start_index = 0; + ctx->ctx->tail_start_index = 0; + } + else { + ctx->ctx->bytes_parsed = 0; + } + + if ((parent = ap_get_module_config(r->request_config, &include_module))) { + /* Kludge --- for nested includes, we want to keep the subprocess + * environment of the base document (for compatibility); that means + * torquing our own last_modified date as well so that the + * LAST_MODIFIED variable gets reset to the proper value if the + * nested document resets . + */ + r->subprocess_env = r->main->subprocess_env; + apr_pool_join(r->main->pool, r->pool); + r->finfo.mtime = r->main->finfo.mtime; + } + else { + /* we're not a nested include, so we create an initial + * environment */ + ap_add_common_vars(r); + ap_add_cgi_vars(r); + add_include_vars(r, conf->default_time_fmt); + } + /* Always unset the content-length. There is no way to know if + * the content will be modified at some point by send_parsed_content. + * It is very possible for us to not find any content in the first + * 9k of the file, but still have to modify the content of the file. + * If we are going to pass the file through send_parsed_content, then + * the content-length should just be unset. + */ + apr_table_unset(f->r->headers_out, "Content-Length"); + + /* Always unset the Last-Modified field - see RFC2616 - 13.3.4. + * We don't know if we are going to be including a file or executing + * a program which may change the Last-Modified header or make the + * content completely dynamic. Therefore, we can't support these + * headers. + * Exception: XBitHack full means we *should* set the Last-Modified field. + */ + + /* Assure the platform supports Group protections */ + if ((*conf->xbithack == xbithack_full) + && (r->finfo.valid & APR_FINFO_GPROT) + && (r->finfo.protection & APR_GEXECUTE)) { + ap_update_mtime(r, r->finfo.mtime); + ap_set_last_modified(r); + } + else { + apr_table_unset(f->r->headers_out, "Last-Modified"); + } + + /* add QUERY stuff to env cause it ain't yet */ + if (r->args) { + char *arg_copy = apr_pstrdup(r->pool, r->args); + + apr_table_setn(r->subprocess_env, "QUERY_STRING", r->args); + ap_unescape_url(arg_copy); + apr_table_setn(r->subprocess_env, "QUERY_STRING_UNESCAPED", + ap_escape_shell_cmd(r->pool, arg_copy)); + } + + return send_parsed_content(f, b); +} + +static void ap_register_include_handler(char *tag, include_handler_fn_t *func) +{ + apr_hash_set(include_hash, tag, strlen(tag), (const void *)func); +} + +static int include_post_config(apr_pool_t *p, apr_pool_t *plog, + apr_pool_t *ptemp, server_rec *s) +{ + include_hash = apr_hash_make(p); + + ssi_pfn_register = APR_RETRIEVE_OPTIONAL_FN(ap_register_include_handler); + + if(ssi_pfn_register) { + ssi_pfn_register("if", handle_if); + ssi_pfn_register("set", handle_set); + ssi_pfn_register("else", handle_else); + ssi_pfn_register("elif", handle_elif); + ssi_pfn_register("echo", handle_echo); + ssi_pfn_register("endif", handle_endif); + ssi_pfn_register("fsize", handle_fsize); + ssi_pfn_register("config", handle_config); + ssi_pfn_register("include", handle_include); + ssi_pfn_register("flastmod", handle_flastmod); + ssi_pfn_register("printenv", handle_printenv); + } + return OK; +} + +static const char *set_default_error_msg(cmd_parms *cmd, void *mconfig, const char *msg) +{ + include_dir_config *conf = (include_dir_config *)mconfig; + conf->default_error_msg = apr_pstrdup(cmd->pool, msg); + return NULL; +} + +static const char *set_default_start_tag(cmd_parms *cmd, void *mconfig, const char *msg) +{ + include_server_config *conf; + conf= ap_get_module_config(cmd->server->module_config , &include_module); + conf->default_start_tag = apr_pstrdup(cmd->pool, msg); + conf->start_tag_len = strlen(conf->default_start_tag ); + bndm_compile(&conf->start_seq_pat, conf->default_start_tag, + conf->start_tag_len); + + return NULL; +} +static const char *set_undefined_echo(cmd_parms *cmd, void *mconfig, const char *msg) +{ + include_server_config *conf; + conf = ap_get_module_config(cmd->server->module_config, &include_module); + conf->undefinedEcho = apr_pstrdup(cmd->pool, msg); + conf->undefinedEchoLen = strlen(msg); + + return NULL; +} + + +static const char *set_default_end_tag(cmd_parms *cmd, void *mconfig, const char *msg) +{ + include_server_config *conf; + conf= ap_get_module_config(cmd->server->module_config , &include_module); + conf->default_end_tag = apr_pstrdup(cmd->pool, msg); + + return NULL; +} + +static const char *set_default_time_fmt(cmd_parms *cmd, void *mconfig, const char *fmt) +{ + include_dir_config *conf = (include_dir_config *)mconfig; + conf->default_time_fmt = apr_pstrdup(cmd->pool, fmt); + return NULL; +} + +/* + * Module definition and configuration data structs... + */ +static const command_rec includes_cmds[] = +{ + AP_INIT_TAKE1("XBitHack", set_xbithack, NULL, OR_OPTIONS, + "Off, On, or Full"), + AP_INIT_TAKE1("SSIErrorMsg", set_default_error_msg, NULL, OR_ALL, + "a string"), + AP_INIT_TAKE1("SSITimeFormat", set_default_time_fmt, NULL, OR_ALL, + "a strftime(3) formatted string"), + AP_INIT_TAKE1("SSIStartTag", set_default_start_tag, NULL, RSRC_CONF, + "SSI Start String Tag"), + AP_INIT_TAKE1("SSIEndTag", set_default_end_tag, NULL, RSRC_CONF, + "SSI End String Tag"), + AP_INIT_TAKE1("SSIUndefinedEcho", set_undefined_echo, NULL, RSRC_CONF, + "SSI Start String Tag"), + + {NULL} +}; + +static int include_fixup(request_rec *r) +{ + include_dir_config *conf; + + conf = (include_dir_config *) ap_get_module_config(r->per_dir_config, + &include_module); + + if (r->handler && (strcmp(r->handler, "server-parsed") == 0)) + { + if (!r->content_type || !*r->content_type) { + ap_set_content_type(r, "text/html"); + } + r->handler = "default-handler"; + } + else +#if defined(OS2) || defined(WIN32) || defined(NETWARE) + /* These OS's don't support xbithack. This is being worked on. */ + { + return DECLINED; + } +#else + { + if (*conf->xbithack == xbithack_off) { + return DECLINED; + } + + if (!(r->finfo.protection & APR_UEXECUTE)) { + return DECLINED; + } + + if (!r->content_type || strcmp(r->content_type, "text/html")) { + return DECLINED; + } + } +#endif + + /* We always return declined, because the default handler actually + * serves the file. All we have to do is add the filter. + */ + ap_add_output_filter("INCLUDES", NULL, r, r->connection); + return DECLINED; +} + +static void register_hooks(apr_pool_t *p) +{ + APR_REGISTER_OPTIONAL_FN(ap_ssi_get_tag_and_value); + APR_REGISTER_OPTIONAL_FN(ap_ssi_parse_string); + APR_REGISTER_OPTIONAL_FN(ap_register_include_handler); + ap_hook_post_config(include_post_config, NULL, NULL, APR_HOOK_REALLY_FIRST); + ap_hook_fixups(include_fixup, NULL, NULL, APR_HOOK_LAST); + ap_register_output_filter("INCLUDES", includes_filter, includes_setup, + AP_FTYPE_RESOURCE); +} + +module AP_MODULE_DECLARE_DATA include_module = +{ + STANDARD20_MODULE_STUFF, + create_includes_dir_config, /* dir config creater */ + NULL, /* dir merger --- default is to override */ + create_includes_server_config,/* server config */ + NULL, /* merge server config */ + includes_cmds, /* command apr_table_t */ + register_hooks /* register hooks */ +}; diff --git a/rubbos/app/httpd-2.0.64/modules/filters/mod_include.dsp b/rubbos/app/httpd-2.0.64/modules/filters/mod_include.dsp new file mode 100644 index 00000000..52136219 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/filters/mod_include.dsp @@ -0,0 +1,132 @@ +# Microsoft Developer Studio Project File - Name="mod_include" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=mod_include - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "mod_include.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 "mod_include.mak" CFG="mod_include - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "mod_include - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_include - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "mod_include - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_include_src" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /out:"Release/mod_include.so" /base:@..\..\os\win32\BaseAddr.ref,mod_include.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Release/mod_include.so" /base:@..\..\os\win32\BaseAddr.ref,mod_include.so /opt:ref + +!ELSEIF "$(CFG)" == "mod_include - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_include_src" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_include.so" /base:@..\..\os\win32\BaseAddr.ref,mod_include.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_include.so" /base:@..\..\os\win32\BaseAddr.ref,mod_include.so + +!ENDIF + +# Begin Target + +# Name "mod_include - Win32 Release" +# Name "mod_include - Win32 Debug" +# Begin Source File + +SOURCE=.\mod_include.c +# End Source File +# Begin Source File + +SOURCE=.\mod_include.h +# End Source File +# Begin Source File + +SOURCE=.\mod_include.rc +# End Source File +# Begin Source File + +SOURCE=..\..\build\win32\win32ver.awk + +!IF "$(CFG)" == "mod_include - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_include.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_include.so "include_module for Apache" ../../include/ap_release.h > .\mod_include.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "mod_include - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_include.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_include.so "include_module for Apache" ../../include/ap_release.h > .\mod_include.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/modules/filters/mod_include.exp b/rubbos/app/httpd-2.0.64/modules/filters/mod_include.exp new file mode 100644 index 00000000..112e1c4d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/filters/mod_include.exp @@ -0,0 +1 @@ +include_module diff --git a/rubbos/app/httpd-2.0.64/modules/filters/mod_include.h b/rubbos/app/httpd-2.0.64/modules/filters/mod_include.h new file mode 100644 index 00000000..6264b888 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/filters/mod_include.h @@ -0,0 +1,206 @@ +/* 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. + */ + +#ifndef _MOD_INCLUDE_H +#define _MOD_INCLUDE_H 1 + +#include "apr_pools.h" +#include "apr_optional.h" + +#define STARTING_SEQUENCE "" + +#define DEFAULT_ERROR_MSG "[an error occurred while processing this directive]" +#define DEFAULT_TIME_FORMAT "%A, %d-%b-%Y %H:%M:%S %Z" +#define SIZEFMT_BYTES 0 +#define SIZEFMT_KMG 1 +#define TMP_BUF_SIZE 1024 +#if APR_CHARSET_EBCDIC +#define RAW_ASCII_CHAR(ch) apr_xlate_conv_byte(ap_hdrs_from_ascii, (unsigned char)ch) +#else /*APR_CHARSET_EBCDIC*/ +#define RAW_ASCII_CHAR(ch) (ch) +#endif /*APR_CHARSET_EBCDIC*/ + +/**************************************************************************** + * Used to keep context information during parsing of a request for SSI tags. + * This is especially useful if the tag stretches across multiple buckets or + * brigades. This keeps track of which buckets need to be replaced with the + * content generated by the SSI tag. + * + * state: PRE_HEAD - State prior to finding the first character of the + * STARTING_SEQUENCE. Next state is PARSE_HEAD. + * PARSE_HEAD - State entered once the first character of the + * STARTING_SEQUENCE is found and exited when the + * the full STARTING_SEQUENCE has been matched or + * a match failure occurs. Next state is PRE_HEAD + * or PARSE_TAG. + * PARSE_TAG - State entered once the STARTING sequence has been + * matched. It is exited when the first character in + * ENDING_SEQUENCE is found. Next state is PARSE_TAIL. + * PARSE_TAIL - State entered from PARSE_TAG state when the first + * character in ENDING_SEQUENCE is encountered. This + * state is exited when the ENDING_SEQUENCE has been + * completely matched, or when a match failure occurs. + * Next state is PARSE_TAG or PARSED. + * PARSED - State entered from PARSE_TAIL once the complete + * ENDING_SEQUENCE has been matched. The SSI tag is + * processed and the SSI buckets are replaced with the + * SSI content during this state. + * parse_pos: Current matched position within the STARTING_SEQUENCE or + * ENDING_SEQUENCE during the PARSE_HEAD and PARSE_TAIL states. + * This is especially useful when the sequence spans brigades. + * X_start_bucket: These point to the buckets containing the first character + * of the STARTING_SEQUENCE, the first non-whitespace + * character of the tag, and the first character in the + * ENDING_SEQUENCE (head_, tag_, and tail_ respectively). + * The buckets are kept intact until the PARSED state is + * reached, at which time the tag is consolidated and the + * buckets are released. The buckets that these point to + * have all been set aside in the ssi_tag_brigade (along + * with all of the intervening buckets). + * X_start_index: The index points within the specified bucket contents + * where the first character of the STARTING_SEQUENCE, + * the first non-whitespace character of the tag, and the + * first character in the ENDING_SEQUENCE can be found + * (head_, tag_, and tail_ respectively). + * combined_tag: Once the PARSED state is reached the tag is collected from + * the bucket(s) in the ssi_tag_brigade into this contiguous + * buffer. The buckets in the ssi_tag_brigade are released + * and the tag is processed. + * curr_tag_pos: Ptr to the combined_tag buffer indicating the current + * parse position. + * tag_length: The number of bytes in the actual tag (excluding the + * STARTING_SEQUENCE, leading and trailing whitespace, + * and ENDING_SEQUENCE). This length is computed as the + * buckets are parsed and set aside during the PARSE_TAG state. + * ssi_tag_brigade: The temporary brigade used by this filter to set aside + * the buckets containing parts of the ssi tag and headers. + */ + +/* I keep this stuff here, because of binary compat. It probably doesn't care, + * but who knows ...? + */ +#ifdef MOD_INCLUDE_REDESIGN +typedef enum {PRE_HEAD, BLOW_PARSE_HEAD, BLOW_PARSE_DIRECTIVE, PARSE_TAG, + BLOW_PARSE_TAIL, PARSED} states; +#else +typedef enum {PRE_HEAD, PARSE_HEAD, PARSE_DIRECTIVE, PARSE_TAG, PARSE_TAIL, + PARSED} states; +#endif + +/** forward referenced as it needs to be held on the context */ +typedef struct bndm_t bndm_t; + +typedef struct include_filter_ctx { + states state; + long flags; /* See the FLAG_XXXXX definitions. */ + int if_nesting_level; + apr_size_t parse_pos; + int bytes_parsed; + apr_status_t status; + int output_now; + int output_flush; + + apr_bucket *head_start_bucket; + apr_size_t head_start_index; + + apr_bucket *tag_start_bucket; + apr_size_t tag_start_index; + + apr_bucket *tail_start_bucket; + apr_size_t tail_start_index; + + char *combined_tag; + char *curr_tag_pos; + apr_size_t directive_length; + apr_size_t tag_length; + + char *error_str; + char *error_str_override; + char *time_str; + char *time_str_override; + apr_pool_t *pool; + + apr_bucket_brigade *ssi_tag_brigade; + bndm_t *start_seq_pat; + char *start_seq; + int start_seq_len; + char *end_seq; + char *re_string; + regmatch_t (*re_result)[10]; +} include_ctx_t; + +/* These flags are used to set flag bits. */ +#define FLAG_PRINTING 0x00000001 /* Printing conditional lines. */ +#define FLAG_COND_TRUE 0x00000002 /* Conditional eval'd to true. */ +#define FLAG_SIZE_IN_BYTES 0x00000004 /* Sizes displayed in bytes. */ +#define FLAG_NO_EXEC 0x00000008 /* No Exec in current context. */ + +/* These flags are used to clear flag bits. */ +#define FLAG_SIZE_ABBREV 0xFFFFFFFB /* Reset SIZE_IN_BYTES bit. */ +#define FLAG_CLEAR_PRINT_COND 0xFFFFFFFC /* Reset PRINTING and COND_TRUE*/ +#define FLAG_CLEAR_PRINTING 0xFFFFFFFE /* Reset just PRINTING bit. */ + +#define CREATE_ERROR_BUCKET(cntx, t_buck, h_ptr, ins_head) \ +{ \ + /* XXX: it'd probably be nice to use a pool bucket here */ \ + t_buck = apr_bucket_heap_create(cntx->error_str, \ + strlen(cntx->error_str), \ + NULL, h_ptr->list); \ + APR_BUCKET_INSERT_BEFORE(h_ptr, t_buck); \ + \ + if (ins_head == NULL) { \ + ins_head = t_buck; \ + } \ +} + +/* Make sure to check the return code rc. If it is anything other + * than APR_SUCCESS, then you should return this value up the + * call chain. + */ +#define SPLIT_AND_PASS_PRETAG_BUCKETS(brgd, cntxt, next, rc) \ +if ((APR_BRIGADE_EMPTY((cntxt)->ssi_tag_brigade)) && \ + ((cntxt)->head_start_bucket != NULL)) { \ + apr_bucket_brigade *tag_plus; \ + \ + tag_plus = apr_brigade_split((brgd), (cntxt)->head_start_bucket); \ + if ((cntxt)->output_flush) { \ + APR_BRIGADE_INSERT_TAIL((brgd), apr_bucket_flush_create((brgd)->bucket_alloc)); \ + } \ + (rc) = ap_pass_brigade((next), (brgd)); \ + (cntxt)->bytes_parsed = 0; \ + (brgd) = tag_plus; \ +} + + +typedef int (include_handler_fn_t)(include_ctx_t *ctx, apr_bucket_brigade **bb, + request_rec *r, ap_filter_t *f, apr_bucket *head_ptr, + apr_bucket **inserted_head); + +APR_DECLARE_OPTIONAL_FN(void, ap_ssi_get_tag_and_value, (include_ctx_t *ctx, + char **tag, + char **tag_val, + int dodecode)); +APR_DECLARE_OPTIONAL_FN(char*, ap_ssi_parse_string, (request_rec *r, + include_ctx_t *ctx, + const char *in, + char *out, + apr_size_t length, + int leave_name)); +APR_DECLARE_OPTIONAL_FN(void, ap_register_include_handler, + (char *tag, include_handler_fn_t *func)); + +#endif /* MOD_INCLUDE */ diff --git a/rubbos/app/httpd-2.0.64/modules/filters/mod_include.la b/rubbos/app/httpd-2.0.64/modules/filters/mod_include.la new file mode 100644 index 00000000..602915a6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/filters/mod_include.la @@ -0,0 +1,35 @@ +# mod_include.la - a libtool library file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='' + +# Names of this library. +library_names='' + +# The name of the static archive. +old_library='mod_include.a' + +# Libraries that this one depends upon. +dependency_libs=' -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib' + +# Version information for mod_include. +current= +age= +revision= + +# Is this an already installed library? +installed=no + +# Should we warn about portability when linking against -modules? +shouldnotlink=yes + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='' diff --git a/rubbos/app/httpd-2.0.64/modules/filters/mod_include.lo b/rubbos/app/httpd-2.0.64/modules/filters/mod_include.lo new file mode 100644 index 00000000..9fdb766d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/filters/mod_include.lo @@ -0,0 +1,12 @@ +# mod_include.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/mod_include.o' + +# Name of the non-PIC object. +non_pic_object='mod_include.o' + diff --git a/rubbos/app/httpd-2.0.64/modules/filters/mod_include.o b/rubbos/app/httpd-2.0.64/modules/filters/mod_include.o new file mode 100644 index 0000000000000000000000000000000000000000..d08f85f962b654fdfdedb2f75fc88aa17ca51fa8 GIT binary patch literal 204216 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≤Idvzy}gcl&OO0RxTO607yWb$@%i9o zi2n>;k$Crw-sgJa8^POwYyDr-*Xsw9zQRkMj|$-_#M?nXfp{|b4B~Ua=MsMjJPn-V z+(h~#&~GJuKa}eb=`TY6332r~Nj~-9bKY>9<6{d2^h2H!;dU+`_jA9~sQd}Mfihw4aW zxb&6b(*NVO1UT|T2tQAJ5cGc%Uk@HV$@^(NTmmmZJn`_&_cOI60mOqU)rT>4cH_`FD5o$bg7Ne z*L2hAl8H;bNPoPP=eH6+RK)X9#Q)3d`55BuP~d6Ae~$I~dEipsmL3JKkCVP7&d$6%xKV6@AsW{KO6MqEdO(s4U`A#KX0P*X6JeqHL zwBsA3zy4aE?}x;jA>Y%)%VK=^kNA4%D^JZ@-Z;e5hIntpKaBX60)F{1#D|shdFO>Hn@p9-_XNbQ9ec@D}zm{ti`dby^wJ{JhC;kT7YXI@7h<_aM?~w14#2*2F zk$53&fAr{d5K5ZBX8Z#J@p5Y)?G8koW0F zyaxDK;uEpHtRX%c{q0racVawzkNEqjw{M9bL;dHQk+r-N(cfZ-53S&J)rnWZ_!dw6 z+c>XpPrPkK&qoq}4&(3=;vZqX*hswib>3$W@%?Ducw)I)9eUrH8o>DCZFHiYZ%db7`(5dDr2ek_Fl9Kv(T&Yw%1 zZ}|}3AcS`f;bVyxLjBAO;cG(pju3te0S0dBAJA^N;+viFY*;r4d{Y=7<*qQ5ygr2Q3gMrH@be)&Z`-Wp z)qLYZc+(KxD}?L!$y)z^xA6Jtb7GlCbdS_3Y)&%PN56FDafys?Q3~Dr^U;2S zc`P)dwfY9cQ!$Nj0&SodLzj~MTLw=7Pb0n)d>io?WPXfz0{A)NN#F(GCzJA@3LZ;5 z0p;&VJPlmqRiEIX&H1H~esfMAh(2#g^?F`Co%FG2D1GjAh929mv4~f>J}2imalNl9 zf_PQ0zssrn-8dWef~x)w$G~9=SbW|T<;6sOgt&U*IQ}S zhx+J!E0dYG_xksV>ve_=P=D&9*F~f<@8NxP$3XS^eStprUAdm0d<;7h%Juxx{{gdA BzCZu~ literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/modules/filters/modules.mk b/rubbos/app/httpd-2.0.64/modules/filters/modules.mk new file mode 100644 index 00000000..cd07d4a0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/filters/modules.mk @@ -0,0 +1,5 @@ +mod_include.la: mod_include.lo + $(MOD_LINK) mod_include.lo $(MOD_INCLUDE_LDADD) +DISTCLEAN_TARGETS = modules.mk +static = mod_include.la +shared = diff --git a/rubbos/app/httpd-2.0.64/modules/generators/.deps b/rubbos/app/httpd-2.0.64/modules/generators/.deps new file mode 100644 index 00000000..e69de29b diff --git a/rubbos/app/httpd-2.0.64/modules/generators/.indent.pro b/rubbos/app/httpd-2.0.64/modules/generators/.indent.pro new file mode 100644 index 00000000..a9fbe9f9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/generators/.indent.pro @@ -0,0 +1,54 @@ +-i4 -npsl -di0 -br -nce -d0 -cli0 -npcs -nfc1 +-TBUFF +-TFILE +-TTRANS +-TUINT4 +-T_trans +-Tallow_options_t +-Tapache_sfio +-Tarray_header +-Tbool_int +-Tbuf_area +-Tbuff_struct +-Tbuffy +-Tcmd_how +-Tcmd_parms +-Tcommand_rec +-Tcommand_struct +-Tconn_rec +-Tcore_dir_config +-Tcore_server_config +-Tdir_maker_func +-Tevent +-Tglobals_s +-Thandler_func +-Thandler_rec +-Tjoblist_s +-Tlisten_rec +-Tmerger_func +-Tmode_t +-Tmodule +-Tmodule_struct +-Tmutex +-Tn_long +-Tother_child_rec +-Toverrides_t +-Tparent_score +-Tpid_t +-Tpiped_log +-Tpool +-Trequest_rec +-Trequire_line +-Trlim_t +-Tscoreboard +-Tsemaphore +-Tserver_addr_rec +-Tserver_rec +-Tserver_rec_chain +-Tshort_score +-Ttable +-Ttable_entry +-Tthread +-Tu_wide_int +-Tvtime_t +-Twide_int diff --git a/rubbos/app/httpd-2.0.64/modules/generators/.libs/mod_asis.a b/rubbos/app/httpd-2.0.64/modules/generators/.libs/mod_asis.a new file mode 100644 index 0000000000000000000000000000000000000000..f7606c14441de372e19d0f8d93af5b18ee3e5987 GIT binary patch literal 33444 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/modules/generators/.libs/mod_asis.la b/rubbos/app/httpd-2.0.64/modules/generators/.libs/mod_asis.la new file mode 100644 index 00000000..f3cb430d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/generators/.libs/mod_asis.la @@ -0,0 +1,35 @@ +# mod_asis.la - a libtool library file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='' + +# Names of this library. +library_names='' + +# The name of the static archive. +old_library='mod_asis.a' + +# Libraries that this one depends upon. +dependency_libs=' -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib' + +# Version information for mod_asis. +current= +age= +revision= + +# Is this an already installed library? +installed=no + +# Should we warn about portability when linking against -modules? +shouldnotlink=yes + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='' diff --git a/rubbos/app/httpd-2.0.64/modules/generators/.libs/mod_asis.o b/rubbos/app/httpd-2.0.64/modules/generators/.libs/mod_asis.o new file mode 100644 index 0000000000000000000000000000000000000000..acca986697c2b8a6f39332879f9aedc717e28483 GIT binary patch literal 33296 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 Rh1Su}Lq3P|6m@<5`#)sB61M;V literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/modules/generators/.libs/mod_autoindex.la b/rubbos/app/httpd-2.0.64/modules/generators/.libs/mod_autoindex.la new file mode 100644 index 00000000..139298d2 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/generators/.libs/mod_autoindex.la @@ -0,0 +1,35 @@ +# mod_autoindex.la - a libtool library file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='' + +# Names of this library. +library_names='' + +# The name of the static archive. +old_library='mod_autoindex.a' + +# Libraries that this one depends upon. +dependency_libs=' -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib' + +# Version information for mod_autoindex. +current= +age= +revision= + +# Is this an already installed library? +installed=no + +# Should we warn about portability when linking against -modules? +shouldnotlink=yes + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='' diff --git a/rubbos/app/httpd-2.0.64/modules/generators/.libs/mod_autoindex.o b/rubbos/app/httpd-2.0.64/modules/generators/.libs/mod_autoindex.o new file mode 100644 index 0000000000000000000000000000000000000000..08725d05b00b9afc520c607bfbe2df3b8e3f10ad GIT binary patch literal 150568 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 k7+1~f^>*^f_4+V{h#EV1;8x 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 L-gOOY#yWYtN~U(D_q@&O5ymeD?Ie! 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/modules/generators/.libs/mod_status.a b/rubbos/app/httpd-2.0.64/modules/generators/.libs/mod_status.a new file mode 100644 index 0000000000000000000000000000000000000000..00fe8005f4e59d3d818a912e9d5d4ada0a1ab56c GIT binary patch literal 97328 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/modules/generators/Makefile b/rubbos/app/httpd-2.0.64/modules/generators/Makefile new file mode 100644 index 00000000..16be1a0d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/generators/Makefile @@ -0,0 +1,8 @@ +top_srcdir = /bottlenecks/rubbos/app/httpd-2.0.64 +top_builddir = /bottlenecks/rubbos/app/httpd-2.0.64 +srcdir = /bottlenecks/rubbos/app/httpd-2.0.64/modules/generators +builddir = /bottlenecks/rubbos/app/httpd-2.0.64/modules/generators +VPATH = /bottlenecks/rubbos/app/httpd-2.0.64/modules/generators + +include $(top_srcdir)/build/special.mk + diff --git a/rubbos/app/httpd-2.0.64/modules/generators/Makefile.in b/rubbos/app/httpd-2.0.64/modules/generators/Makefile.in new file mode 100644 index 00000000..167b343d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/generators/Makefile.in @@ -0,0 +1,3 @@ + +include $(top_srcdir)/build/special.mk + diff --git a/rubbos/app/httpd-2.0.64/modules/generators/NWGNUinfo b/rubbos/app/httpd-2.0.64/modules/generators/NWGNUinfo new file mode 100644 index 00000000..eb76803f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/generators/NWGNUinfo @@ -0,0 +1,248 @@ +# +# Make sure all needed macro's are defined +# + +# +# Get the 'head' of the build environment if necessary. This includes default +# targets and paths to tools +# + +ifndef EnvironmentDefined +include $(AP_WORK)\build\NWGNUhead.inc +endif + +# +# These directories will be at the beginning of the include list, followed by +# INCDIRS +# +XINCDIRS += \ + $(APR)/include \ + $(APRUTIL)/include \ + $(AP_WORK)/include \ + $(NWOS) \ + $(EOLIST) + +# +# These flags will come after CFLAGS +# +XCFLAGS += \ + $(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 = info + +# +# This is used by the link '-desc ' directive. +# If left blank, NLM_NAME will be used. +# +NLM_DESCRIPTION = Apache $(VERSION_STR) Info Module + +# +# This is used by the '-threadname' directive. If left blank, +# NLM_NAME Thread will be used. +# +NLM_THREAD_NAME = Info Module + +# +# 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 = 8192 + + +# +# If this is specified it will be used by the link '-entry' directive +# +NLM_ENTRY_SYM = _LibCPrelude + +# +# If this is specified it will be used by the link '-exit' directive +# +NLM_EXIT_SYM = _LibCPostlude + +# +# If this is specified it will be used by the link '-check' directive +# +NLM_CHECK_SYM = + +# +# If these are specified it will be used by the link '-flags' directive +# +NLM_FLAGS = AUTOUNLOAD, 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)/info.nlm \ + $(EOLIST) + +# +# If there is an LIB target, put it here +# +TARGET_lib = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the NLM target above. +# Paths must all use the '/' character +# +FILES_nlm_objs = \ + $(OBJDIR)/mod_info.o \ + $(EOLIST) + +# +# 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 = \ + libcpre.o \ + $(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 = \ + @$(APR)/aprlib.imp \ + @$(NWOS)/httpd.imp \ + @libc.imp \ + $(EOLIST) + +# +# Any symbols exported to here +# +FILES_nlm_exports = \ + info_module \ + $(EOLIST) + +# +# These are the OBJ files needed to create the LIB target above. +# Paths must all use the '/' character +# +FILES_lib_objs = \ + $(EOLIST) + +# +# 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) +# +install :: nlms FORCE + +# +# Any specialized rules here +# + +# +# Include the 'tail' makefile that has targets that depend on variables defined +# in this makefile +# + +include $(AP_WORK)\build\NWGNUtail.inc + + diff --git a/rubbos/app/httpd-2.0.64/modules/generators/NWGNUmakefile b/rubbos/app/httpd-2.0.64/modules/generators/NWGNUmakefile new file mode 100644 index 00000000..7f7d343b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/generators/NWGNUmakefile @@ -0,0 +1,247 @@ +# +# Declare the sub-directories to be built here +# + +SUBDIRS = \ + $(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 += \ + $(EOLIST) + +# +# These flags will come after CFLAGS +# +XCFLAGS += \ + $(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 = + +# +# This is used by the link '-desc ' directive. +# If left blank, NLM_NAME will be used. +# +NLM_DESCRIPTION = + +# +# This is used by the '-threadname' directive. If left blank, +# NLM_NAME Thread will be used. +# +NLM_THREAD_NAME = + +# +# 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 = + + +# +# 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 = + +# +# If these are specified it will be used by the link '-flags' directive +# +NLM_FLAGS = + +# +# 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)/info.nlm \ + $(OBJDIR)/status.nlm \ + $(EOLIST) + +# +# If there is an LIB target, put it here +# +TARGET_lib = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the NLM target above. +# Paths must all use the '/' character +# +FILES_nlm_objs = \ + $(EOLIST) + +# +# 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 = \ + $(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 = \ + $(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 = \ + $(EOLIST) + +# +# Any symbols exported to here +# +FILES_nlm_exports = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the LIB target above. +# Paths must all use the '/' character +# +FILES_lib_objs = \ + $(EOLIST) + +# +# 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) +# +install :: nlms FORCE + copy $(OBJDIR)\*.nlm $(INSTALL)\Apache2\modules\*.* + +# +# Any specialized rules here +# + +# +# Include the 'tail' makefile that has targets that depend on variables defined +# in this makefile +# + +include $(AP_WORK)\build\NWGNUtail.inc + + + diff --git a/rubbos/app/httpd-2.0.64/modules/generators/NWGNUstatus b/rubbos/app/httpd-2.0.64/modules/generators/NWGNUstatus new file mode 100644 index 00000000..01cbef5a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/generators/NWGNUstatus @@ -0,0 +1,248 @@ +# +# Make sure all needed macro's are defined +# + +# +# Get the 'head' of the build environment if necessary. This includes default +# targets and paths to tools +# + +ifndef EnvironmentDefined +include $(AP_WORK)\build\NWGNUhead.inc +endif + +# +# These directories will be at the beginning of the include list, followed by +# INCDIRS +# +XINCDIRS += \ + $(APR)/include \ + $(APRUTIL)/include \ + $(AP_WORK)/include \ + $(NWOS) \ + $(EOLIST) + +# +# These flags will come after CFLAGS +# +XCFLAGS += \ + $(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 = status + +# +# This is used by the link '-desc ' directive. +# If left blank, NLM_NAME will be used. +# +NLM_DESCRIPTION = Apache $(VERSION_STR) Status Module + +# +# This is used by the '-threadname' directive. If left blank, +# NLM_NAME Thread will be used. +# +NLM_THREAD_NAME = Status Module + +# +# 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 = 8192 + + +# +# If this is specified it will be used by the link '-entry' directive +# +NLM_ENTRY_SYM = _LibCPrelude + +# +# If this is specified it will be used by the link '-exit' directive +# +NLM_EXIT_SYM = _LibCPostlude + +# +# If this is specified it will be used by the link '-check' directive +# +NLM_CHECK_SYM = + +# +# If these are specified it will be used by the link '-flags' directive +# +NLM_FLAGS = AUTOUNLOAD, 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)/status.nlm \ + $(EOLIST) + +# +# If there is an LIB target, put it here +# +TARGET_lib = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the NLM target above. +# Paths must all use the '/' character +# +FILES_nlm_objs = \ + $(OBJDIR)/mod_status.o \ + $(EOLIST) + +# +# 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 = \ + libcpre.o \ + $(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 = \ + @$(APR)/aprlib.imp \ + @$(NWOS)/httpd.imp \ + @libc.imp \ + $(EOLIST) + +# +# Any symbols exported to here +# +FILES_nlm_exports = \ + status_module \ + $(EOLIST) + +# +# These are the OBJ files needed to create the LIB target above. +# Paths must all use the '/' character +# +FILES_lib_objs = \ + $(EOLIST) + +# +# 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) +# +install :: nlms FORCE + +# +# Any specialized rules here +# + +# +# Include the 'tail' makefile that has targets that depend on variables defined +# in this makefile +# + +include $(AP_WORK)\build\NWGNUtail.inc + + diff --git a/rubbos/app/httpd-2.0.64/modules/generators/config5.m4 b/rubbos/app/httpd-2.0.64/modules/generators/config5.m4 new file mode 100644 index 00000000..f4afb7f1 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/generators/config5.m4 @@ -0,0 +1,66 @@ +dnl modules enabled in this directory by default + +dnl APACHE_MODULE(name, helptext[, objects[, structname[, default[, config]]]]) + +APACHE_MODPATH_INIT(generators) + +APACHE_MODULE(status, process/thread monitoring, , , yes) +APACHE_MODULE(autoindex, directory listing, , , yes) +APACHE_MODULE(asis, as-is filetypes, , , yes) +APACHE_MODULE(info, server information, , , most) +APACHE_MODULE(suexec, set uid and gid for spawned processes, , , no, [ + other_targets=suexec ] ) + +APR_ADDTO(LT_LDFLAGS,-export-dynamic) + +if test "$apache_cv_mpm" = "worker" -o "$apache_cv_mpm" = "perchild"; then +# if we are using a threaded MPM, we will get better performance with +# mod_cgid, so make it the default. + APACHE_MODULE(cgid, CGI scripts, , , yes, [ + case $host in + *-solaris2*) + case `uname -r` in + 5.10) + dnl Does the system have the appropriate patches? + case `uname -p` in + i386) + patch_id="120665" + ;; + sparc) + patch_id="120664" + ;; + *) + AC_MSG_WARN([Unknown platform]) + patch_id="120664" + ;; + esac + AC_MSG_CHECKING([for Solaris patch $patch_id]) + showrev -p | grep "$patch_id" >/dev/null 2>&1 + if test $? -eq 1; then + dnl Solaris 11 (next release) as of snv_19 doesn't have this problem. + dnl It may be possible to use /kernel/drv/tl from later releases. + AC_MSG_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: ]) + else + AC_MSG_RESULT(yes) + fi + ;; + esac + ;; + esac + ]) + APACHE_MODULE(cgi, CGI scripts, , , no) +else +# if we are using a non-threaded MPM, it makes little sense to use +# mod_cgid, and it just opens up holes we don't need. Make mod_cgi the +# default + APACHE_MODULE(cgi, CGI scripts, , , yes) + APACHE_MODULE(cgid, CGI scripts, , , no) +fi + +APACHE_MODPATH_FINISH diff --git a/rubbos/app/httpd-2.0.64/modules/generators/mod_asis.c b/rubbos/app/httpd-2.0.64/modules/generators/mod_asis.c new file mode 100644 index 00000000..a5c65b47 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/generators/mod_asis.c @@ -0,0 +1,145 @@ +/* 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. + */ + +#include "apr_strings.h" +#include "ap_config.h" +#include "httpd.h" +#include "http_config.h" +#include "http_protocol.h" +#include "http_log.h" +#include "util_script.h" +#include "http_main.h" +#include "http_request.h" + +#include "mod_core.h" + +#define ASIS_MAGIC_TYPE "httpd/send-as-is" + +static int asis_handler(request_rec *r) +{ + conn_rec *c = r->connection; + apr_file_t *f = NULL; + apr_status_t rv; + const char *location; + + if(strcmp(r->handler,ASIS_MAGIC_TYPE) && strcmp(r->handler,"send-as-is")) + return DECLINED; + + r->allowed |= (AP_METHOD_BIT << M_GET); + if (r->method_number != M_GET) + return DECLINED; + if (r->finfo.filetype == 0) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "File does not exist: %s", r->filename); + return HTTP_NOT_FOUND; + } + + if ((rv = apr_file_open(&f, r->filename, APR_READ, + APR_OS_DEFAULT, r->pool)) != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + "file permissions deny server access: %s", r->filename); + return HTTP_FORBIDDEN; + } + + ap_scan_script_header_err(r, f, NULL); + location = apr_table_get(r->headers_out, "Location"); + + if (location && location[0] == '/' && + ((r->status == HTTP_OK) || ap_is_HTTP_REDIRECT(r->status))) { + + apr_file_close(f); + + /* Internal redirect -- fake-up a pseudo-request */ + r->status = HTTP_OK; + + /* This redirect needs to be a GET no matter what the original + * method was. + */ + r->method = apr_pstrdup(r->pool, "GET"); + r->method_number = M_GET; + + ap_internal_redirect_handler(location, r); + return OK; + } + + if (!r->header_only) { + apr_bucket_brigade *bb; + apr_bucket *b; + apr_off_t pos = 0; + + rv = apr_file_seek(f, APR_CUR, &pos); + if (rv != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + "mod_asis: failed to find end-of-headers position " + "for %s", r->filename); + apr_file_close(f); + return HTTP_INTERNAL_SERVER_ERROR; + } + + bb = apr_brigade_create(r->pool, c->bucket_alloc); +#if APR_HAS_LARGE_FILES + if (r->finfo.size - pos > AP_MAX_SENDFILE) { + /* APR_HAS_LARGE_FILES issue; must split into mutiple buckets, + * no greater than MAX(apr_size_t), and more granular than that + * in case the brigade code/filters attempt to read it directly. + */ + apr_off_t fsize = r->finfo.size - pos; + b = apr_bucket_file_create(f, pos, AP_MAX_SENDFILE, + r->pool, c->bucket_alloc); + while (fsize > AP_MAX_SENDFILE) { + APR_BRIGADE_INSERT_TAIL(bb, b); + apr_bucket_copy(b, &b); + b->start += AP_MAX_SENDFILE; + fsize -= AP_MAX_SENDFILE; + } + b->length = (apr_size_t)fsize; /* Resize just the last bucket */ + } + else +#endif + b = apr_bucket_file_create(f, pos, (apr_size_t) (r->finfo.size - pos), + r->pool, c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, b); + b = apr_bucket_eos_create(c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, b); + rv = ap_pass_brigade(r->output_filters, bb); + if (rv != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + "mod_asis: ap_pass_brigade failed for file %s", r->filename); + return HTTP_INTERNAL_SERVER_ERROR; + } + } + else { + apr_file_close(f); + } + + return OK; +} + +static void register_hooks(apr_pool_t *p) +{ + ap_hook_handler(asis_handler,NULL,NULL,APR_HOOK_MIDDLE); +} + +module AP_MODULE_DECLARE_DATA asis_module = +{ + STANDARD20_MODULE_STUFF, + NULL, /* create per-directory config structure */ + NULL, /* merge per-directory config structures */ + NULL, /* create per-server config structure */ + NULL, /* merge per-server config structures */ + NULL, /* command apr_table_t */ + register_hooks /* register hooks */ +}; diff --git a/rubbos/app/httpd-2.0.64/modules/generators/mod_asis.dsp b/rubbos/app/httpd-2.0.64/modules/generators/mod_asis.dsp new file mode 100644 index 00000000..77fdafd3 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/generators/mod_asis.dsp @@ -0,0 +1,128 @@ +# Microsoft Developer Studio Project File - Name="mod_asis" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=mod_asis - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "mod_asis.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 "mod_asis.mak" CFG="mod_asis - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "mod_asis - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_asis - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "mod_asis - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_asis_src" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /out:"Release/mod_asis.so" /base:@..\..\os\win32\BaseAddr.ref,mod_asis.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Release/mod_asis.so" /base:@..\..\os\win32\BaseAddr.ref,mod_asis.so /opt:ref + +!ELSEIF "$(CFG)" == "mod_asis - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_asis_src" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_asis.so" /base:@..\..\os\win32\BaseAddr.ref,mod_asis.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_asis.so" /base:@..\..\os\win32\BaseAddr.ref,mod_asis.so + +!ENDIF + +# Begin Target + +# Name "mod_asis - Win32 Release" +# Name "mod_asis - Win32 Debug" +# Begin Source File + +SOURCE=.\mod_asis.c +# End Source File +# Begin Source File + +SOURCE=.\mod_asis.rc +# End Source File +# Begin Source File + +SOURCE=..\..\build\win32\win32ver.awk + +!IF "$(CFG)" == "mod_asis - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_asis.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_asis.so "asis_module for Apache" ../../include/ap_release.h > .\mod_asis.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "mod_asis - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_asis.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_asis.so "asis_module for Apache" ../../include/ap_release.h > .\mod_asis.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/modules/generators/mod_asis.exp b/rubbos/app/httpd-2.0.64/modules/generators/mod_asis.exp new file mode 100644 index 00000000..4f347d92 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/generators/mod_asis.exp @@ -0,0 +1 @@ +asis_module diff --git a/rubbos/app/httpd-2.0.64/modules/generators/mod_asis.la b/rubbos/app/httpd-2.0.64/modules/generators/mod_asis.la new file mode 100644 index 00000000..f3cb430d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/generators/mod_asis.la @@ -0,0 +1,35 @@ +# mod_asis.la - a libtool library file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='' + +# Names of this library. +library_names='' + +# The name of the static archive. +old_library='mod_asis.a' + +# Libraries that this one depends upon. +dependency_libs=' -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib' + +# Version information for mod_asis. +current= +age= +revision= + +# Is this an already installed library? +installed=no + +# Should we warn about portability when linking against -modules? +shouldnotlink=yes + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='' diff --git a/rubbos/app/httpd-2.0.64/modules/generators/mod_asis.lo b/rubbos/app/httpd-2.0.64/modules/generators/mod_asis.lo new file mode 100644 index 00000000..7eeba69a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/generators/mod_asis.lo @@ -0,0 +1,12 @@ +# mod_asis.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/mod_asis.o' + +# Name of the non-PIC object. +non_pic_object='mod_asis.o' + diff --git a/rubbos/app/httpd-2.0.64/modules/generators/mod_asis.o b/rubbos/app/httpd-2.0.64/modules/generators/mod_asis.o new file mode 100644 index 0000000000000000000000000000000000000000..acca986697c2b8a6f39332879f9aedc717e28483 GIT binary patch literal 33296 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. + */ + +#include "apr_strings.h" +#include "apr_fnmatch.h" +#include "apr_strings.h" +#include "apr_lib.h" + +#define APR_WANT_STRFUNC +#include "apr_want.h" + +#include "ap_config.h" +#include "httpd.h" +#include "http_config.h" +#include "http_core.h" +#include "http_request.h" +#include "http_protocol.h" +#include "http_log.h" +#include "http_main.h" +#include "util_script.h" + +#include "mod_core.h" + +module AP_MODULE_DECLARE_DATA autoindex_module; + +/**************************************************************** + * + * Handling configuration directives... + */ + +#define NO_OPTIONS (1 << 0) /* Indexing options */ +#define ICONS_ARE_LINKS (1 << 1) +#define SCAN_HTML_TITLES (1 << 2) +#define SUPPRESS_ICON (1 << 3) +#define SUPPRESS_LAST_MOD (1 << 4) +#define SUPPRESS_SIZE (1 << 5) +#define SUPPRESS_DESC (1 << 6) +#define SUPPRESS_PREAMBLE (1 << 7) +#define SUPPRESS_COLSORT (1 << 8) +#define SUPPRESS_RULES (1 << 9) +#define FOLDERS_FIRST (1 << 10) +#define VERSION_SORT (1 << 11) +#define TRACK_MODIFIED (1 << 12) +#define FANCY_INDEXING (1 << 13) +#define TABLE_INDEXING (1 << 14) +#define IGNORE_CLIENT (1 << 15) +#define IGNORE_CASE (1 << 16) +#define EMIT_XHTML (1 << 17) + +#define K_NOADJUST 0 +#define K_ADJUST 1 +#define K_UNSET 2 + +/* + * Define keys for sorting. + */ +#define K_NAME 'N' /* Sort by file name (default) */ +#define K_LAST_MOD 'M' /* Last modification date */ +#define K_SIZE 'S' /* Size (absolute, not as displayed) */ +#define K_DESC 'D' /* Description */ +#define K_VALID "NMSD" /* String containing _all_ valid K_ opts */ + +#define D_ASCENDING 'A' +#define D_DESCENDING 'D' +#define D_VALID "AD" /* String containing _all_ valid D_ opts */ + +/* + * These are the dimensions of the default icons supplied with Apache. + */ +#define DEFAULT_ICON_WIDTH 20 +#define DEFAULT_ICON_HEIGHT 22 + +/* + * Other default dimensions. + */ +#define DEFAULT_NAME_WIDTH 23 +#define DEFAULT_DESC_WIDTH 23 + +struct item { + char *type; + char *apply_to; + char *apply_path; + char *data; +}; + +typedef struct ai_desc_t { + char *pattern; + char *description; + int full_path; + int wildcards; +} ai_desc_t; + +typedef struct autoindex_config_struct { + + char *default_icon; + apr_int32_t opts; + apr_int32_t incremented_opts; + apr_int32_t decremented_opts; + int name_width; + int name_adjust; + int desc_width; + int desc_adjust; + int icon_width; + int icon_height; + char default_keyid; + char default_direction; + + apr_array_header_t *icon_list; + apr_array_header_t *alt_list; + apr_array_header_t *desc_list; + apr_array_header_t *ign_list; + apr_array_header_t *hdr_list; + apr_array_header_t *rdme_list; + + char *ctype; + char *charset; +} autoindex_config_rec; + +static char c_by_encoding, c_by_type, c_by_path; + +#define BY_ENCODING &c_by_encoding +#define BY_TYPE &c_by_type +#define BY_PATH &c_by_path + +/* + * This routine puts the standard HTML header at the top of the index page. + * We include the DOCTYPE because we may be using features therefrom (i.e., + * HEIGHT and WIDTH attributes on the icons if we're FancyIndexing). + */ +static void emit_preamble(request_rec *r, int xhtml, const char *title) +{ + ap_rvputs(r, xhtml ? DOCTYPE_XHTML_1_0T : DOCTYPE_HTML_3_2, + "\n \n Index of ", title, + "\n \n \n", NULL); +} + +static void push_item(apr_array_header_t *arr, char *type, const char *to, + const char *path, const char *data) +{ + struct item *p = (struct item *) apr_array_push(arr); + + if (!to) { + to = ""; + } + if (!path) { + path = ""; + } + + p->type = type; + p->data = data ? apr_pstrdup(arr->pool, data) : NULL; + p->apply_path = apr_pstrcat(arr->pool, path, "*", NULL); + + if ((type == BY_PATH) && (!ap_is_matchexp(to))) { + p->apply_to = apr_pstrcat(arr->pool, "*", to, NULL); + } + else if (to) { + p->apply_to = apr_pstrdup(arr->pool, to); + } + else { + p->apply_to = NULL; + } +} + +static const char *add_alt(cmd_parms *cmd, void *d, const char *alt, + const char *to) +{ + if (cmd->info == BY_PATH) { + if (!strcmp(to, "**DIRECTORY**")) { + to = "^^DIRECTORY^^"; + } + } + if (cmd->info == BY_ENCODING) { + char *tmp = apr_pstrdup(cmd->pool, to); + ap_str_tolower(tmp); + to = tmp; + } + + push_item(((autoindex_config_rec *) d)->alt_list, cmd->info, to, + cmd->path, alt); + return NULL; +} + +static const char *add_icon(cmd_parms *cmd, void *d, const char *icon, + const char *to) +{ + char *iconbak = apr_pstrdup(cmd->pool, icon); + + if (icon[0] == '(') { + char *alt; + char *cl = strchr(iconbak, ')'); + + if (cl == NULL) { + return "missing closing paren"; + } + alt = ap_getword_nc(cmd->pool, &iconbak, ','); + *cl = '\0'; /* Lose closing paren */ + add_alt(cmd, d, &alt[1], to); + } + if (cmd->info == BY_PATH) { + if (!strcmp(to, "**DIRECTORY**")) { + to = "^^DIRECTORY^^"; + } + } + if (cmd->info == BY_ENCODING) { + char *tmp = apr_pstrdup(cmd->pool, to); + ap_str_tolower(tmp); + to = tmp; + } + + push_item(((autoindex_config_rec *) d)->icon_list, cmd->info, to, + cmd->path, iconbak); + return NULL; +} + +/* + * Add description text for a filename pattern. If the pattern has + * wildcards already (or we need to add them), add leading and + * trailing wildcards to it to ensure substring processing. If the + * pattern contains a '/' anywhere, force wildcard matching mode, + * add a slash to the prefix so that "bar/bletch" won't be matched + * by "foobar/bletch", and make a note that there's a delimiter; + * the matching routine simplifies to just the actual filename + * whenever it can. This allows definitions in parent directories + * to be made for files in subordinate ones using relative paths. + */ + +/* + * Absent a strcasestr() function, we have to force wildcards on + * systems for which "AAA" and "aaa" mean the same file. + */ +#ifdef CASE_BLIND_FILESYSTEM +#define WILDCARDS_REQUIRED 1 +#else +#define WILDCARDS_REQUIRED 0 +#endif + +static const char *add_desc(cmd_parms *cmd, void *d, const char *desc, + const char *to) +{ + autoindex_config_rec *dcfg = (autoindex_config_rec *) d; + ai_desc_t *desc_entry; + char *prefix = ""; + + desc_entry = (ai_desc_t *) apr_array_push(dcfg->desc_list); + desc_entry->full_path = (ap_strchr_c(to, '/') == NULL) ? 0 : 1; + desc_entry->wildcards = (WILDCARDS_REQUIRED + || desc_entry->full_path + || apr_fnmatch_test(to)); + if (desc_entry->wildcards) { + prefix = desc_entry->full_path ? "*/" : "*"; + desc_entry->pattern = apr_pstrcat(dcfg->desc_list->pool, + prefix, to, "*", NULL); + } + else { + desc_entry->pattern = apr_pstrdup(dcfg->desc_list->pool, to); + } + desc_entry->description = apr_pstrdup(dcfg->desc_list->pool, desc); + return NULL; +} + +static const char *add_ignore(cmd_parms *cmd, void *d, const char *ext) +{ + push_item(((autoindex_config_rec *) d)->ign_list, 0, ext, cmd->path, NULL); + return NULL; +} + +static const char *add_header(cmd_parms *cmd, void *d, const char *name) +{ + push_item(((autoindex_config_rec *) d)->hdr_list, 0, NULL, cmd->path, + name); + return NULL; +} + +static const char *add_readme(cmd_parms *cmd, void *d, const char *name) +{ + push_item(((autoindex_config_rec *) d)->rdme_list, 0, NULL, cmd->path, + name); + return NULL; +} + +static const char *add_opts(cmd_parms *cmd, void *d, const char *optstr) +{ + char *w; + apr_int32_t opts; + apr_int32_t opts_add; + apr_int32_t opts_remove; + char action; + autoindex_config_rec *d_cfg = (autoindex_config_rec *) d; + + opts = d_cfg->opts; + opts_add = d_cfg->incremented_opts; + opts_remove = d_cfg->decremented_opts; + while (optstr[0]) { + int option = 0; + + w = ap_getword_conf(cmd->pool, &optstr); + if ((*w == '+') || (*w == '-')) { + action = *(w++); + } + else { + action = '\0'; + } + if (!strcasecmp(w, "FancyIndexing")) { + option = FANCY_INDEXING; + } + else if (!strcasecmp(w, "FoldersFirst")) { + option = FOLDERS_FIRST; + } + else if (!strcasecmp(w, "HTMLTable")) { + option = TABLE_INDEXING; + } + else if (!strcasecmp(w, "IconsAreLinks")) { + option = ICONS_ARE_LINKS; + } + else if (!strcasecmp(w, "IgnoreCase")) { + option = IGNORE_CASE; + } + else if (!strcasecmp(w, "IgnoreClient")) { + option = IGNORE_CLIENT; + } + else if (!strcasecmp(w, "ScanHTMLTitles")) { + option = SCAN_HTML_TITLES; + } + else if (!strcasecmp(w, "SuppressColumnSorting")) { + option = SUPPRESS_COLSORT; + } + else if (!strcasecmp(w, "SuppressDescription")) { + option = SUPPRESS_DESC; + } + else if (!strcasecmp(w, "SuppressHTMLPreamble")) { + option = SUPPRESS_PREAMBLE; + } + else if (!strcasecmp(w, "SuppressIcon")) { + option = SUPPRESS_ICON; + } + else if (!strcasecmp(w, "SuppressLastModified")) { + option = SUPPRESS_LAST_MOD; + } + else if (!strcasecmp(w, "SuppressSize")) { + option = SUPPRESS_SIZE; + } + else if (!strcasecmp(w, "SuppressRules")) { + option = SUPPRESS_RULES; + } + else if (!strcasecmp(w, "TrackModified")) { + option = TRACK_MODIFIED; + } + else if (!strcasecmp(w, "VersionSort")) { + option = VERSION_SORT; + } + else if (!strcasecmp(w, "XHTML")) { + option = EMIT_XHTML; + } + else if (!strcasecmp(w, "None")) { + if (action != '\0') { + return "Cannot combine '+' or '-' with 'None' keyword"; + } + opts = NO_OPTIONS; + opts_add = 0; + opts_remove = 0; + } + else if (!strcasecmp(w, "IconWidth")) { + if (action != '-') { + d_cfg->icon_width = DEFAULT_ICON_WIDTH; + } + else { + d_cfg->icon_width = 0; + } + } + else if (!strncasecmp(w, "IconWidth=", 10)) { + if (action == '-') { + return "Cannot combine '-' with IconWidth=n"; + } + d_cfg->icon_width = atoi(&w[10]); + } + else if (!strcasecmp(w, "IconHeight")) { + if (action != '-') { + d_cfg->icon_height = DEFAULT_ICON_HEIGHT; + } + else { + d_cfg->icon_height = 0; + } + } + else if (!strncasecmp(w, "IconHeight=", 11)) { + if (action == '-') { + return "Cannot combine '-' with IconHeight=n"; + } + d_cfg->icon_height = atoi(&w[11]); + } + else if (!strcasecmp(w, "NameWidth")) { + if (action != '-') { + return "NameWidth with no value may only appear as " + "'-NameWidth'"; + } + d_cfg->name_width = DEFAULT_NAME_WIDTH; + d_cfg->name_adjust = K_NOADJUST; + } + else if (!strncasecmp(w, "NameWidth=", 10)) { + if (action == '-') { + return "Cannot combine '-' with NameWidth=n"; + } + if (w[10] == '*') { + d_cfg->name_adjust = K_ADJUST; + } + else { + int width = atoi(&w[10]); + + if (width && (width < 5)) { + return "NameWidth value must be greater than 5"; + } + d_cfg->name_width = width; + d_cfg->name_adjust = K_NOADJUST; + } + } + else if (!strcasecmp(w, "DescriptionWidth")) { + if (action != '-') { + return "DescriptionWidth with no value may only appear as " + "'-DescriptionWidth'"; + } + d_cfg->desc_width = DEFAULT_DESC_WIDTH; + d_cfg->desc_adjust = K_NOADJUST; + } + else if (!strncasecmp(w, "DescriptionWidth=", 17)) { + if (action == '-') { + return "Cannot combine '-' with DescriptionWidth=n"; + } + if (w[17] == '*') { + d_cfg->desc_adjust = K_ADJUST; + } + else { + int width = atoi(&w[17]); + + if (width && (width < 12)) { + return "DescriptionWidth value must be greater than 12"; + } + d_cfg->desc_width = width; + d_cfg->desc_adjust = K_NOADJUST; + } + } + else if (!strncasecmp(w, "Type=", 5)) { + d_cfg->ctype = apr_pstrdup(cmd->pool, &w[5]); + } + else if (!strncasecmp(w, "Charset=", 8)) { + d_cfg->charset = apr_pstrdup(cmd->pool, &w[8]); + } + else { + return "Invalid directory indexing option"; + } + if (action == '\0') { + opts |= option; + opts_add = 0; + opts_remove = 0; + } + else if (action == '+') { + opts_add |= option; + opts_remove &= ~option; + } + else { + opts_remove |= option; + opts_add &= ~option; + } + } + if ((opts & NO_OPTIONS) && (opts & ~NO_OPTIONS)) { + return "Cannot combine other IndexOptions keywords with 'None'"; + } + d_cfg->incremented_opts = opts_add; + d_cfg->decremented_opts = opts_remove; + d_cfg->opts = opts; + return NULL; +} + +static const char *set_default_order(cmd_parms *cmd, void *m, + const char *direction, const char *key) +{ + autoindex_config_rec *d_cfg = (autoindex_config_rec *) m; + + if (!strcasecmp(direction, "Ascending")) { + d_cfg->default_direction = D_ASCENDING; + } + else if (!strcasecmp(direction, "Descending")) { + d_cfg->default_direction = D_DESCENDING; + } + else { + return "First keyword must be 'Ascending' or 'Descending'"; + } + + if (!strcasecmp(key, "Name")) { + d_cfg->default_keyid = K_NAME; + } + else if (!strcasecmp(key, "Date")) { + d_cfg->default_keyid = K_LAST_MOD; + } + else if (!strcasecmp(key, "Size")) { + d_cfg->default_keyid = K_SIZE; + } + else if (!strcasecmp(key, "Description")) { + d_cfg->default_keyid = K_DESC; + } + else { + return "Second keyword must be 'Name', 'Date', 'Size', or " + "'Description'"; + } + + return NULL; +} + +#define DIR_CMD_PERMS OR_INDEXES + +static const command_rec autoindex_cmds[] = +{ + AP_INIT_ITERATE2("AddIcon", add_icon, BY_PATH, DIR_CMD_PERMS, + "an icon URL followed by one or more filenames"), + AP_INIT_ITERATE2("AddIconByType", add_icon, BY_TYPE, DIR_CMD_PERMS, + "an icon URL followed by one or more MIME types"), + AP_INIT_ITERATE2("AddIconByEncoding", add_icon, BY_ENCODING, DIR_CMD_PERMS, + "an icon URL followed by one or more content encodings"), + AP_INIT_ITERATE2("AddAlt", add_alt, BY_PATH, DIR_CMD_PERMS, + "alternate descriptive text followed by one or more " + "filenames"), + AP_INIT_ITERATE2("AddAltByType", add_alt, BY_TYPE, DIR_CMD_PERMS, + "alternate descriptive text followed by one or more MIME " + "types"), + AP_INIT_ITERATE2("AddAltByEncoding", add_alt, BY_ENCODING, DIR_CMD_PERMS, + "alternate descriptive text followed by one or more " + "content encodings"), + AP_INIT_RAW_ARGS("IndexOptions", add_opts, NULL, DIR_CMD_PERMS, + "one or more index options [+|-][]"), + AP_INIT_TAKE2("IndexOrderDefault", set_default_order, NULL, DIR_CMD_PERMS, + "{Ascending,Descending} {Name,Size,Description,Date}"), + AP_INIT_ITERATE("IndexIgnore", add_ignore, NULL, DIR_CMD_PERMS, + "one or more file extensions"), + AP_INIT_ITERATE2("AddDescription", add_desc, BY_PATH, DIR_CMD_PERMS, + "Descriptive text followed by one or more filenames"), + AP_INIT_TAKE1("HeaderName", add_header, NULL, DIR_CMD_PERMS, + "a filename"), + AP_INIT_TAKE1("ReadmeName", add_readme, NULL, DIR_CMD_PERMS, + "a filename"), + AP_INIT_RAW_ARGS("FancyIndexing", ap_set_deprecated, NULL, OR_ALL, + "The FancyIndexing directive is no longer supported. " + "Use IndexOptions FancyIndexing."), + AP_INIT_TAKE1("DefaultIcon", ap_set_string_slot, + (void *)APR_OFFSETOF(autoindex_config_rec, default_icon), + DIR_CMD_PERMS, "an icon URL"), + {NULL} +}; + +static void *create_autoindex_config(apr_pool_t *p, char *dummy) +{ + autoindex_config_rec *new = + (autoindex_config_rec *) apr_pcalloc(p, sizeof(autoindex_config_rec)); + + new->icon_width = 0; + new->icon_height = 0; + new->name_width = DEFAULT_NAME_WIDTH; + new->name_adjust = K_UNSET; + new->desc_width = DEFAULT_DESC_WIDTH; + new->desc_adjust = K_UNSET; + new->icon_list = apr_array_make(p, 4, sizeof(struct item)); + new->alt_list = apr_array_make(p, 4, sizeof(struct item)); + new->desc_list = apr_array_make(p, 4, sizeof(ai_desc_t)); + new->ign_list = apr_array_make(p, 4, sizeof(struct item)); + new->hdr_list = apr_array_make(p, 4, sizeof(struct item)); + new->rdme_list = apr_array_make(p, 4, sizeof(struct item)); + new->opts = 0; + new->incremented_opts = 0; + new->decremented_opts = 0; + new->default_keyid = '\0'; + new->default_direction = '\0'; + + return (void *) new; +} + +static void *merge_autoindex_configs(apr_pool_t *p, void *basev, void *addv) +{ + autoindex_config_rec *new; + autoindex_config_rec *base = (autoindex_config_rec *) basev; + autoindex_config_rec *add = (autoindex_config_rec *) addv; + + new = (autoindex_config_rec *) apr_pcalloc(p, sizeof(autoindex_config_rec)); + new->default_icon = add->default_icon ? add->default_icon + : base->default_icon; + new->icon_height = add->icon_height ? add->icon_height : base->icon_height; + new->icon_width = add->icon_width ? add->icon_width : base->icon_width; + + new->ctype = add->ctype ? add->ctype : base->ctype; + new->charset = add->charset ? add->charset : base->charset; + + new->alt_list = apr_array_append(p, add->alt_list, base->alt_list); + new->ign_list = apr_array_append(p, add->ign_list, base->ign_list); + new->hdr_list = apr_array_append(p, add->hdr_list, base->hdr_list); + new->desc_list = apr_array_append(p, add->desc_list, base->desc_list); + new->icon_list = apr_array_append(p, add->icon_list, base->icon_list); + new->rdme_list = apr_array_append(p, add->rdme_list, base->rdme_list); + if (add->opts & NO_OPTIONS) { + /* + * If the current directory says 'no options' then we also + * clear any incremental mods from being inheritable further down. + */ + new->opts = NO_OPTIONS; + new->incremented_opts = 0; + new->decremented_opts = 0; + } + else { + /* + * If there were any nonincremental options selected for + * this directory, they dominate and we don't inherit *anything.* + * Contrariwise, we *do* inherit if the only settings here are + * incremental ones. + */ + if (add->opts == 0) { + new->incremented_opts = (base->incremented_opts + | add->incremented_opts) + & ~add->decremented_opts; + new->decremented_opts = (base->decremented_opts + | add->decremented_opts); + /* + * We may have incremental settings, so make sure we don't + * inadvertently inherit an IndexOptions None from above. + */ + new->opts = (base->opts & ~NO_OPTIONS); + } + else { + /* + * There are local nonincremental settings, which clear + * all inheritance from above. They *are* the new base settings. + */ + new->opts = add->opts;; + } + /* + * We're guaranteed that there'll be no overlap between + * the add-options and the remove-options. + */ + new->opts |= new->incremented_opts; + new->opts &= ~new->decremented_opts; + } + /* + * Inherit the NameWidth settings if there aren't any specific to + * the new location; otherwise we'll end up using the defaults set in the + * config-rec creation routine. + */ + if (add->name_adjust == K_UNSET) { + new->name_width = base->name_width; + new->name_adjust = base->name_adjust; + } + else { + new->name_width = add->name_width; + new->name_adjust = add->name_adjust; + } + + /* + * Likewise for DescriptionWidth. + */ + if (add->desc_adjust == K_UNSET) { + new->desc_width = base->desc_width; + new->desc_adjust = base->desc_adjust; + } + else { + new->desc_width = add->desc_width; + new->desc_adjust = add->desc_adjust; + } + + new->default_keyid = add->default_keyid ? add->default_keyid + : base->default_keyid; + new->default_direction = add->default_direction ? add->default_direction + : base->default_direction; + return new; +} + +/**************************************************************** + * + * Looking things up in config entries... + */ + +/* Structure used to hold entries when we're actually building an index */ + +struct ent { + char *name; + char *icon; + char *alt; + char *desc; + apr_off_t size; + apr_time_t lm; + struct ent *next; + int ascending, ignore_case, version_sort; + char key; + int isdir; +}; + +static char *find_item(request_rec *r, apr_array_header_t *list, int path_only) +{ + const char *content_type = ap_field_noparam(r->pool, r->content_type); + const char *content_encoding = r->content_encoding; + char *path = r->filename; + + struct item *items = (struct item *) list->elts; + int i; + + for (i = 0; i < list->nelts; ++i) { + struct item *p = &items[i]; + + /* Special cased for ^^DIRECTORY^^ and ^^BLANKICON^^ */ + if ((path[0] == '^') || (!ap_strcmp_match(path, p->apply_path))) { + if (!*(p->apply_to)) { + return p->data; + } + else if (p->type == BY_PATH || path[0] == '^') { + if (!ap_strcmp_match(path, p->apply_to)) { + return p->data; + } + } + else if (!path_only) { + if (!content_encoding) { + if (p->type == BY_TYPE) { + if (content_type + && !ap_strcasecmp_match(content_type, + p->apply_to)) { + return p->data; + } + } + } + else { + if (p->type == BY_ENCODING) { + if (!ap_strcasecmp_match(content_encoding, + p->apply_to)) { + return p->data; + } + } + } + } + } + } + return NULL; +} + +#define find_icon(d,p,t) find_item(p,d->icon_list,t) +#define find_alt(d,p,t) find_item(p,d->alt_list,t) +#define find_header(d,p) find_item(p,d->hdr_list,0) +#define find_readme(d,p) find_item(p,d->rdme_list,0) + +static char *find_default_item(char *bogus_name, apr_array_header_t *list) +{ + request_rec r; + /* Bleah. I tried to clean up find_item, and it lead to this bit + * of ugliness. Note that the fields initialized are precisely + * those that find_item looks at... + */ + r.filename = bogus_name; + r.content_type = r.content_encoding = NULL; + return find_item(&r, list, 1); +} + +#define find_default_icon(d,n) find_default_item(n, d->icon_list) +#define find_default_alt(d,n) find_default_item(n, d->alt_list) + +/* + * Look through the list of pattern/description pairs and return the first one + * if any) that matches the filename in the request. If multiple patterns + * match, only the first one is used; since the order in the array is the + * same as the order in which directives were processed, earlier matching + * directives will dominate. + */ + +#ifdef CASE_BLIND_FILESYSTEM +#define MATCH_FLAGS FNM_CASE_BLIND +#else +#define MATCH_FLAGS 0 +#endif + +static char *find_desc(autoindex_config_rec *dcfg, const char *filename_full) +{ + int i; + ai_desc_t *list = (ai_desc_t *) dcfg->desc_list->elts; + const char *filename_only; + const char *filename; + + /* + * If the filename includes a path, extract just the name itself + * for the simple matches. + */ + if ((filename_only = ap_strrchr_c(filename_full, '/')) == NULL) { + filename_only = filename_full; + } + else { + filename_only++; + } + for (i = 0; i < dcfg->desc_list->nelts; ++i) { + ai_desc_t *tuple = &list[i]; + int found; + + /* + * Only use the full-path filename if the pattern contains '/'s. + */ + filename = (tuple->full_path) ? filename_full : filename_only; + /* + * Make the comparison using the cheapest method; only do + * wildcard checking if we must. + */ + if (tuple->wildcards) { + found = (apr_fnmatch(tuple->pattern, filename, MATCH_FLAGS) == 0); + } + else { + found = (ap_strstr_c(filename, tuple->pattern) != NULL); + } + if (found) { + return tuple->description; + } + } + return NULL; +} + +static int ignore_entry(autoindex_config_rec *d, char *path) +{ + apr_array_header_t *list = d->ign_list; + struct item *items = (struct item *) list->elts; + char *tt; + int i; + + if ((tt = strrchr(path, '/')) == NULL) { + tt = path; + } + else { + tt++; + } + + for (i = 0; i < list->nelts; ++i) { + struct item *p = &items[i]; + char *ap; + + if ((ap = strrchr(p->apply_to, '/')) == NULL) { + ap = p->apply_to; + } + else { + ap++; + } + +#ifndef CASE_BLIND_FILESYSTEM + if (!ap_strcmp_match(path, p->apply_path) + && !ap_strcmp_match(tt, ap)) { + return 1; + } +#else /* !CASE_BLIND_FILESYSTEM */ + /* + * On some platforms, the match must be case-blind. This is really + * a factor of the filesystem involved, but we can't detect that + * reliably - so we have to granularise at the OS level. + */ + if (!ap_strcasecmp_match(path, p->apply_path) + && !ap_strcasecmp_match(tt, ap)) { + return 1; + } +#endif /* !CASE_BLIND_FILESYSTEM */ + } + return 0; +} + +/***************************************************************** + * + * Actually generating output + */ + +/* + * Elements of the emitted document: + * Preamble + * Emitted unless SUPPRESS_PREAMBLE is set AND ap_run_sub_req + * succeeds for the (content_type == text/html) header file. + * Header file + * Emitted if found (and able). + * H1 tag line + * Emitted if a header file is NOT emitted. + * Directory stuff + * Always emitted. + * HR + * Emitted if FANCY_INDEXING is set. + * Readme file + * Emitted if found (and able). + * ServerSig + * Emitted if ServerSignature is not Off AND a readme file + * is NOT emitted. + * Postamble + * Emitted unless SUPPRESS_PREAMBLE is set AND ap_run_sub_req + * succeeds for the (content_type == text/html) readme file. + */ + + +/* + * emit a plain text file + */ +static void do_emit_plain(request_rec *r, apr_file_t *f) +{ + char buf[AP_IOBUFSIZE + 1]; + int ch; + apr_size_t i, c, n; + apr_status_t rv; + + ap_rputs("
    \n", r);
    +    while (!apr_file_eof(f)) {
    +        do {
    +            n = sizeof(char) * AP_IOBUFSIZE;
    +            rv = apr_file_read(f, buf, &n);
    +        } while (APR_STATUS_IS_EINTR(rv));
    +        if (n == 0 || rv != APR_SUCCESS) {
    +            /* ###: better error here? */
    +            break;
    +        }
    +        buf[n] = '\0';
    +        c = 0;
    +        while (c < n) {
    +            for (i = c; i < n; i++) {
    +                if (buf[i] == '<' || buf[i] == '>' || buf[i] == '&') {
    +                    break;
    +                }
    +            }
    +            ch = buf[i];
    +            buf[i] = '\0';
    +            ap_rputs(&buf[c], r);
    +            if (ch == '<') {
    +                ap_rputs("<", r);
    +            }
    +            else if (ch == '>') {
    +                ap_rputs(">", r);
    +            }
    +            else if (ch == '&') {
    +                ap_rputs("&", r);
    +            }
    +            c = i + 1;
    +        }
    +    }
    +    ap_rputs("
    \n", r); +} + +/* + * Handle the preamble through the H1 tag line, inclusive. Locate + * the file with a subrequests. Process text/html documents by actually + * running the subrequest; text/xxx documents get copied verbatim, + * and any other content type is ignored. This means that a non-text + * document (such as HEADER.gif) might get multiviewed as the result + * instead of a text document, meaning nothing will be displayed, but + * oh well. + */ +static void emit_head(request_rec *r, char *header_fname, int suppress_amble, + int emit_xhtml, char *title) +{ + apr_table_t *hdrs = r->headers_in; + apr_file_t *f = NULL; + request_rec *rr = NULL; + int emit_amble = 1; + int emit_H1 = 1; + const char *r_accept; + const char *r_accept_enc; + + /* + * If there's a header file, send a subrequest to look for it. If it's + * found and html do the subrequest, otherwise handle it + */ + r_accept = apr_table_get(hdrs, "Accept"); + r_accept_enc = apr_table_get(hdrs, "Accept-Encoding"); + apr_table_setn(hdrs, "Accept", "text/html, text/plain"); + apr_table_unset(hdrs, "Accept-Encoding"); + + + if ((header_fname != NULL) && r->args) { + header_fname = apr_pstrcat(r->pool, header_fname, "?", r->args, NULL); + } + + if ((header_fname != NULL) + && (rr = ap_sub_req_lookup_uri(header_fname, r, r->output_filters)) + && (rr->status == HTTP_OK) + && (rr->filename != NULL) + && (rr->finfo.filetype == APR_REG)) { + /* + * Check for the two specific cases we allow: text/html and + * text/anything-else. The former is allowed to be processed for + * SSIs. + */ + if (rr->content_type != NULL) { + if (!strcasecmp(ap_field_noparam(r->pool, rr->content_type), + "text/html")) { + ap_filter_t *f; + /* Hope everything will work... */ + emit_amble = 0; + emit_H1 = 0; + + if (! suppress_amble) { + emit_preamble(r, emit_xhtml, title); + } + /* This is a hack, but I can't find any better way to do this. + * The problem is that we have already created the sub-request, + * but we just inserted the OLD_WRITE filter, and the + * sub-request needs to pass its data through the OLD_WRITE + * filter, or things go horribly wrong (missing data, data in + * the wrong order, etc). To fix it, if you create a + * sub-request and then insert the OLD_WRITE filter before you + * run the request, you need to make sure that the sub-request + * data goes through the OLD_WRITE filter. Just steal this + * code. The long-term solution is to remove the ap_r* + * functions. + */ + for (f=rr->output_filters; + f->frec != ap_subreq_core_filter_handle; f = f->next); + f->next = r->output_filters; + + /* + * If there's a problem running the subrequest, display the + * preamble if we didn't do it before -- the header file + * didn't get displayed. + */ + if (ap_run_sub_req(rr) != OK) { + /* It didn't work */ + emit_amble = suppress_amble; + emit_H1 = 1; + } + } + else if (!strncasecmp("text/", rr->content_type, 5)) { + /* + * If we can open the file, prefix it with the preamble + * regardless; since we'll be sending a
     block around
    +                 * the file's contents, any HTML header it had won't end up
    +                 * where it belongs.
    +                 */
    +                if (apr_file_open(&f, rr->filename, APR_READ,
    +                                  APR_OS_DEFAULT, r->pool) == APR_SUCCESS) {
    +                    emit_preamble(r, emit_xhtml, title);
    +                    emit_amble = 0;
    +                    do_emit_plain(r, f);
    +                    apr_file_close(f);
    +                    emit_H1 = 0;
    +                }
    +            }
    +        }
    +    }
    +
    +    if (r_accept) {
    +        apr_table_setn(hdrs, "Accept", r_accept);
    +    }
    +    else {
    +        apr_table_unset(hdrs, "Accept");
    +    }
    +
    +    if (r_accept_enc) {
    +        apr_table_setn(hdrs, "Accept-Encoding", r_accept_enc);
    +    }
    +
    +    if (emit_amble) {
    +        emit_preamble(r, emit_xhtml, title);
    +    }
    +    if (emit_H1) {
    +        ap_rvputs(r, "

    Index of ", title, "

    \n", NULL); + } + if (rr != NULL) { + ap_destroy_sub_req(rr); + } +} + + +/* + * Handle the Readme file through the postamble, inclusive. Locate + * the file with a subrequests. Process text/html documents by actually + * running the subrequest; text/xxx documents get copied verbatim, + * and any other content type is ignored. This means that a non-text + * document (such as FOOTER.gif) might get multiviewed as the result + * instead of a text document, meaning nothing will be displayed, but + * oh well. + */ +static void emit_tail(request_rec *r, char *readme_fname, int suppress_amble) +{ + apr_file_t *f = NULL; + request_rec *rr = NULL; + int suppress_post = 0; + int suppress_sig = 0; + + /* + * If there's a readme file, send a subrequest to look for it. If it's + * found and a text file, handle it -- otherwise fall through and + * pretend there's nothing there. + */ + if ((readme_fname != NULL) + && (rr = ap_sub_req_lookup_uri(readme_fname, r, r->output_filters)) + && (rr->status == HTTP_OK) + && (rr->filename != NULL) + && rr->finfo.filetype == APR_REG) { + /* + * Check for the two specific cases we allow: text/html and + * text/anything-else. The former is allowed to be processed for + * SSIs. + */ + if (rr->content_type != NULL) { + if (!strcasecmp(ap_field_noparam(r->pool, rr->content_type), + "text/html")) { + ap_filter_t *f; + for (f=rr->output_filters; + f->frec != ap_subreq_core_filter_handle; f = f->next); + f->next = r->output_filters; + + + if (ap_run_sub_req(rr) == OK) { + /* worked... */ + suppress_sig = 1; + suppress_post = suppress_amble; + } + } + else if (!strncasecmp("text/", rr->content_type, 5)) { + /* + * If we can open the file, suppress the signature. + */ + if (apr_file_open(&f, rr->filename, APR_READ, + APR_OS_DEFAULT, r->pool) == APR_SUCCESS) { + do_emit_plain(r, f); + apr_file_close(f); + suppress_sig = 1; + } + } + } + } + + if (!suppress_sig) { + ap_rputs(ap_psignature("", r), r); + } + if (!suppress_post) { + ap_rputs("\n", r); + } + if (rr != NULL) { + ap_destroy_sub_req(rr); + } +} + + +static char *find_title(request_rec *r) +{ + char titlebuf[MAX_STRING_LEN], *find = ""; + apr_file_t *thefile = NULL; + int x, y, p; + apr_size_t n; + + if (r->status != HTTP_OK) { + return NULL; + } + if ((r->content_type != NULL) + && (!strcasecmp(ap_field_noparam(r->pool, r->content_type), + "text/html") + || !strcmp(r->content_type, INCLUDES_MAGIC_TYPE)) + && !r->content_encoding) { + if (apr_file_open(&thefile, r->filename, APR_READ, + APR_OS_DEFAULT, r->pool) != APR_SUCCESS) { + return NULL; + } + n = sizeof(char) * (MAX_STRING_LEN - 1); + apr_file_read(thefile, titlebuf, &n); + if (n <= 0) { + apr_file_close(thefile); + return NULL; + } + titlebuf[n] = '\0'; + for (x = 0, p = 0; titlebuf[x]; x++) { + if (apr_tolower(titlebuf[x]) == find[p]) { + if (!find[++p]) { + if ((p = ap_ind(&titlebuf[++x], '<')) != -1) { + titlebuf[x + p] = '\0'; + } + /* Scan for line breaks for Tanmoy's secretary */ + for (y = x; titlebuf[y]; y++) { + if ((titlebuf[y] == CR) || (titlebuf[y] == LF)) { + if (y == x) { + x++; + } + else { + titlebuf[y] = ' '; + } + } + } + apr_file_close(thefile); + return apr_pstrdup(r->pool, &titlebuf[x]); + } + } + else { + p = 0; + } + } + apr_file_close(thefile); + } + return NULL; +} + +static struct ent *make_parent_entry(apr_int32_t autoindex_opts, + autoindex_config_rec *d, + request_rec *r, char keyid, + char direction) +{ + struct ent *p = (struct ent *) apr_pcalloc(r->pool, sizeof(struct ent)); + char *testpath; + /* + * p->name is now the true parent URI. + * testpath is a crafted lie, so that the syntax '/some/..' + * (or simply '..')be used to describe 'up' from '/some/' + * when processeing IndexIgnore, and Icon|Alt|Desc configs. + */ + + /* The output has always been to the parent. Don't make ourself + * our own parent (worthless cyclical reference). + */ + if (!(p->name = ap_make_full_path(r->pool, r->uri, "../"))) { + return (NULL); + } + ap_getparents(p->name); + if (!*p->name) { + return (NULL); + } + + /* IndexIgnore has always compared "/thispath/.." */ + testpath = ap_make_full_path(r->pool, r->filename, ".."); + if (ignore_entry(d, testpath)) { + return (NULL); + } + + p->size = -1; + p->lm = -1; + p->key = apr_toupper(keyid); + p->ascending = (apr_toupper(direction) == D_ASCENDING); + p->version_sort = autoindex_opts & VERSION_SORT; + if (autoindex_opts & FANCY_INDEXING) { + if (!(p->icon = find_default_icon(d, testpath))) { + p->icon = find_default_icon(d, "^^DIRECTORY^^"); + } + if (!(p->alt = find_default_alt(d, testpath))) { + if (!(p->alt = find_default_alt(d, "^^DIRECTORY^^"))) { + p->alt = "DIR"; + } + } + p->desc = find_desc(d, testpath); + } + return p; +} + +static struct ent *make_autoindex_entry(const apr_finfo_t *dirent, + int autoindex_opts, + autoindex_config_rec *d, + request_rec *r, char keyid, + char direction, + const char *pattern) +{ + request_rec *rr; + struct ent *p; + + /* Dot is ignored, Parent is handled by make_parent_entry() */ + if ((dirent->name[0] == '.') && (!dirent->name[1] + || ((dirent->name[1] == '.') && !dirent->name[2]))) + return (NULL); + +#ifndef CASE_BLIND_FILESYSTEM + if (pattern && (apr_fnmatch(pattern, dirent->name, + FNM_NOESCAPE | FNM_PERIOD) + != APR_SUCCESS)) + return (NULL); +#else /* !CASE_BLIND_FILESYSTEM */ + /* + * On some platforms, the match must be case-blind. This is really + * a factor of the filesystem involved, but we can't detect that + * reliably - so we have to granularise at the OS level. + */ + if (pattern && (apr_fnmatch(pattern, dirent->name, + FNM_NOESCAPE | FNM_PERIOD | FNM_CASE_BLIND) + != APR_SUCCESS)) + return (NULL); +#endif /* !CASE_BLIND_FILESYSTEM */ + + if (ignore_entry(d, ap_make_full_path(r->pool, + r->filename, dirent->name))) { + return (NULL); + } + + if (!(rr = ap_sub_req_lookup_dirent(dirent, r, AP_SUBREQ_NO_ARGS, NULL))) { + return (NULL); + } + + if ((rr->finfo.filetype != APR_DIR && rr->finfo.filetype != APR_REG) + || !(rr->status == OK || ap_is_HTTP_SUCCESS(rr->status) + || ap_is_HTTP_REDIRECT(rr->status))) { + ap_destroy_sub_req(rr); + return (NULL); + } + + p = (struct ent *) apr_pcalloc(r->pool, sizeof(struct ent)); + if (dirent->filetype == APR_DIR) { + p->name = apr_pstrcat(r->pool, dirent->name, "/", NULL); + } + else { + p->name = apr_pstrdup(r->pool, dirent->name); + } + p->size = -1; + p->icon = NULL; + p->alt = NULL; + p->desc = NULL; + p->lm = -1; + p->isdir = 0; + p->key = apr_toupper(keyid); + p->ascending = (apr_toupper(direction) == D_ASCENDING); + p->version_sort = !!(autoindex_opts & VERSION_SORT); + p->ignore_case = !!(autoindex_opts & IGNORE_CASE); + + if (autoindex_opts & (FANCY_INDEXING | TABLE_INDEXING)) { + p->lm = rr->finfo.mtime; + if (dirent->filetype == APR_DIR) { + if (autoindex_opts & FOLDERS_FIRST) { + p->isdir = 1; + } + rr->filename = ap_make_dirstr_parent (rr->pool, rr->filename); + + /* omit the trailing slash (1.3 compat) */ + rr->filename[strlen(rr->filename) - 1] = '\0'; + + if (!(p->icon = find_icon(d, rr, 1))) { + p->icon = find_default_icon(d, "^^DIRECTORY^^"); + } + if (!(p->alt = find_alt(d, rr, 1))) { + if (!(p->alt = find_default_alt(d, "^^DIRECTORY^^"))) { + p->alt = "DIR"; + } + } + } + else { + p->icon = find_icon(d, rr, 0); + p->alt = find_alt(d, rr, 0); + p->size = rr->finfo.size; + } + + p->desc = find_desc(d, rr->filename); + + if ((!p->desc) && (autoindex_opts & SCAN_HTML_TITLES)) { + p->desc = apr_pstrdup(r->pool, find_title(rr)); + } + } + ap_destroy_sub_req(rr); + /* + * We don't need to take any special action for the file size key. + * If we did, it would go here. + */ + if (keyid == K_LAST_MOD) { + if (p->lm < 0) { + p->lm = 0; + } + } + return (p); +} + +static char *terminate_description(autoindex_config_rec *d, char *desc, + apr_int32_t autoindex_opts, int desc_width) +{ + int maxsize = desc_width; + register int x; + + /* + * If there's no DescriptionWidth in effect, default to the old + * behaviour of adjusting the description size depending upon + * what else is being displayed. Otherwise, stick with the + * setting. + */ + if (d->desc_adjust == K_UNSET) { + if (autoindex_opts & SUPPRESS_ICON) { + maxsize += 6; + } + if (autoindex_opts & SUPPRESS_LAST_MOD) { + maxsize += 19; + } + if (autoindex_opts & SUPPRESS_SIZE) { + maxsize += 7; + } + } + for (x = 0; desc[x] && ((maxsize > 0) || (desc[x] == '<')); x++) { + if (desc[x] == '<') { + while (desc[x] != '>') { + if (!desc[x]) { + maxsize = 0; + break; + } + ++x; + } + } + else if (desc[x] == '&') { + /* entities like ä count as one character */ + --maxsize; + for ( ; desc[x] != ';'; ++x) { + if (desc[x] == '\0') { + maxsize = 0; + break; + } + } + } + else { + --maxsize; + } + } + if (!maxsize && desc[x] != '\0') { + desc[x - 1] = '>'; /* Grump. */ + desc[x] = '\0'; /* Double Grump! */ + } + return desc; +} + +/* + * Emit the anchor for the specified field. If a field is the key for the + * current request, the link changes its meaning to reverse the order when + * selected again. Non-active fields always start in ascending order. + */ +static void emit_link(request_rec *r, const char *anchor, char column, + char curkey, char curdirection, + const char *colargs, int nosort) +{ + if (!nosort) { + char qvalue[9]; + + qvalue[0] = '?'; + qvalue[1] = 'C'; + qvalue[2] = '='; + qvalue[3] = column; + qvalue[4] = ';'; + qvalue[5] = 'O'; + qvalue[6] = '='; + /* reverse? */ + qvalue[7] = ((curkey == column) && (curdirection == D_ASCENDING)) + ? D_DESCENDING : D_ASCENDING; + qvalue[8] = '\0'; + ap_rvputs(r, "<a href=\"", qvalue, colargs ? colargs : "", + "\">", anchor, "</a>", NULL); + } + else { + ap_rputs(anchor, r); + } +} + +static void output_directories(struct ent **ar, int n, + autoindex_config_rec *d, request_rec *r, + apr_int32_t autoindex_opts, char keyid, + char direction, const char *colargs) +{ + int x; + apr_size_t rv; + char *name = r->uri; + char *tp; + int static_columns = !!(autoindex_opts & SUPPRESS_COLSORT); + apr_pool_t *scratch; + int name_width; + int desc_width; + char *name_scratch; + char *pad_scratch; + char *breakrow = ""; + + apr_pool_create(&scratch, r->pool); + if (name[0] == '\0') { + name = "/"; + } + + name_width = d->name_width; + desc_width = d->desc_width; + + if ((autoindex_opts & (FANCY_INDEXING | TABLE_INDEXING)) + == FANCY_INDEXING) { + if (d->name_adjust == K_ADJUST) { + for (x = 0; x < n; x++) { + int t = strlen(ar[x]->name); + if (t > name_width) { + name_width = t; + } + } + } + + if (d->desc_adjust == K_ADJUST) { + for (x = 0; x < n; x++) { + if (ar[x]->desc != NULL) { + int t = strlen(ar[x]->desc); + if (t > desc_width) { + desc_width = t; + } + } + } + } + } + name_scratch = apr_palloc(r->pool, name_width + 1); + pad_scratch = apr_palloc(r->pool, name_width + 1); + memset(pad_scratch, ' ', name_width); + pad_scratch[name_width] = '\0'; + + if (autoindex_opts & TABLE_INDEXING) { + int cols = 1; + ap_rputs("<table><tr>", r); + if (!(autoindex_opts & SUPPRESS_ICON)) { + ap_rputs("<th>", r); + if ((tp = find_default_icon(d, "^^BLANKICON^^"))) { + ap_rvputs(r, "<img src=\"", ap_escape_html(scratch, tp), + "\" alt=\"[ICO]\"", NULL); + if (d->icon_width) { + ap_rprintf(r, " width=\"%d\"", d->icon_width); + } + if (d->icon_height) { + ap_rprintf(r, " height=\"%d\"", d->icon_height); + } + + if (autoindex_opts & EMIT_XHTML) { + ap_rputs(" /", r); + } + ap_rputs("></th>", r); + } + else { + ap_rputs(" </th>", r); + } + + ++cols; + } + ap_rputs("<th>", r); + emit_link(r, "Name", K_NAME, keyid, direction, + colargs, static_columns); + if (!(autoindex_opts & SUPPRESS_LAST_MOD)) { + ap_rputs("</th><th>", r); + emit_link(r, "Last modified", K_LAST_MOD, keyid, direction, + colargs, static_columns); + ++cols; + } + if (!(autoindex_opts & SUPPRESS_SIZE)) { + ap_rputs("</th><th>", r); + emit_link(r, "Size", K_SIZE, keyid, direction, + colargs, static_columns); + ++cols; + } + if (!(autoindex_opts & SUPPRESS_DESC)) { + ap_rputs("</th><th>", r); + emit_link(r, "Description", K_DESC, keyid, direction, + colargs, static_columns); + ++cols; + } + if (!(autoindex_opts & SUPPRESS_RULES)) { + breakrow = apr_psprintf(r->pool, + "<tr><th colspan=\"%d\">" + "<hr%s></th></tr>\n", cols, + (autoindex_opts & EMIT_XHTML) ? " /" : ""); + } + ap_rvputs(r, "</th></tr>", breakrow, NULL); + } + else if (autoindex_opts & FANCY_INDEXING) { + ap_rputs("<pre>", r); + if (!(autoindex_opts & SUPPRESS_ICON)) { + if ((tp = find_default_icon(d, "^^BLANKICON^^"))) { + ap_rvputs(r, "<img src=\"", ap_escape_html(scratch, tp), + "\" alt=\"Icon \"", NULL); + if (d->icon_width) { + ap_rprintf(r, " width=\"%d\"", d->icon_width); + } + if (d->icon_height) { + ap_rprintf(r, " height=\"%d\"", d->icon_height); + } + + if (autoindex_opts & EMIT_XHTML) { + ap_rputs(" /", r); + } + ap_rputs("> ", r); + } + else { + ap_rputs(" ", r); + } + } + emit_link(r, "Name", K_NAME, keyid, direction, + colargs, static_columns); + ap_rputs(pad_scratch + 4, r); + /* + * Emit the guaranteed-at-least-one-space-between-columns byte. + */ + ap_rputs(" ", r); + if (!(autoindex_opts & SUPPRESS_LAST_MOD)) { + emit_link(r, "Last modified", K_LAST_MOD, keyid, direction, + colargs, static_columns); + ap_rputs(" ", r); + } + if (!(autoindex_opts & SUPPRESS_SIZE)) { + emit_link(r, "Size", K_SIZE, keyid, direction, + colargs, static_columns); + ap_rputs(" ", r); + } + if (!(autoindex_opts & SUPPRESS_DESC)) { + emit_link(r, "Description", K_DESC, keyid, direction, + colargs, static_columns); + } + if (!(autoindex_opts & SUPPRESS_RULES)) { + ap_rputs("<hr", r); + if (autoindex_opts & EMIT_XHTML) { + ap_rputs(" /", r); + } + ap_rputs(">", r); + } + else { + ap_rputc('\n', r); + } + } + else { + ap_rputs("<ul>", r); + } + + for (x = 0; x < n; x++) { + char *anchor, *t, *t2; + int nwidth; + + apr_pool_clear(scratch); + + t = ar[x]->name; + anchor = ap_escape_html(scratch, ap_os_escape_path(scratch, t, 0)); + + if (!x && t[0] == '/') { + t2 = "Parent Directory"; + } + else { + t2 = t; + } + + if (autoindex_opts & TABLE_INDEXING) { + ap_rputs("<tr>", r); + if (!(autoindex_opts & SUPPRESS_ICON)) { + ap_rputs("<td valign=\"top\">", r); + if (autoindex_opts & ICONS_ARE_LINKS) { + ap_rvputs(r, "<a href=\"", anchor, "\">", NULL); + } + if ((ar[x]->icon) || d->default_icon) { + ap_rvputs(r, "<img src=\"", + ap_escape_html(scratch, + ar[x]->icon ? ar[x]->icon + : d->default_icon), + "\" alt=\"[", (ar[x]->alt ? ar[x]->alt : " "), + "]\"", NULL); + if (d->icon_width) { + ap_rprintf(r, " width=\"%d\"", d->icon_width); + } + if (d->icon_height) { + ap_rprintf(r, " height=\"%d\"", d->icon_height); + } + + if (autoindex_opts & EMIT_XHTML) { + ap_rputs(" /", r); + } + ap_rputs(">", r); + } + else { + ap_rputs(" ", r); + } + if (autoindex_opts & ICONS_ARE_LINKS) { + ap_rputs("</a></td>", r); + } + else { + ap_rputs("</td>", r); + } + } + if (d->name_adjust == K_ADJUST) { + ap_rvputs(r, "<td><a href=\"", anchor, "\">", + ap_escape_html(scratch, t2), "</a>", NULL); + } + else { + nwidth = strlen(t2); + if (nwidth > name_width) { + memcpy(name_scratch, t2, name_width - 3); + name_scratch[name_width - 3] = '.'; + name_scratch[name_width - 2] = '.'; + name_scratch[name_width - 1] = '>'; + name_scratch[name_width] = 0; + t2 = name_scratch; + nwidth = name_width; + } + ap_rvputs(r, "<td><a href=\"", anchor, "\">", + ap_escape_html(scratch, t2), + "</a>", pad_scratch + nwidth, NULL); + } + if (!(autoindex_opts & SUPPRESS_LAST_MOD)) { + if (ar[x]->lm != -1) { + char time_str[MAX_STRING_LEN]; + apr_time_exp_t ts; + apr_time_exp_lt(&ts, ar[x]->lm); + apr_strftime(time_str, &rv, MAX_STRING_LEN, + "</td><td align=\"right\">%d-%b-%Y %H:%M ", + &ts); + ap_rputs(time_str, r); + } + else { + ap_rputs("</td><td> ", r); + } + } + if (!(autoindex_opts & SUPPRESS_SIZE)) { + char buf[5]; + ap_rvputs(r, "</td><td align=\"right\">", + apr_strfsize(ar[x]->size, buf), NULL); + } + if (!(autoindex_opts & SUPPRESS_DESC)) { + if (ar[x]->desc) { + if (d->desc_adjust == K_ADJUST) { + ap_rvputs(r, "</td><td>", ar[x]->desc, NULL); + } + else { + ap_rvputs(r, "</td><td>", + terminate_description(d, ar[x]->desc, + autoindex_opts, + desc_width), NULL); + } + } + } + else { + ap_rputs("</td><td> ", r); + } + ap_rputs("</td></tr>\n", r); + } + else if (autoindex_opts & FANCY_INDEXING) { + if (!(autoindex_opts & SUPPRESS_ICON)) { + if (autoindex_opts & ICONS_ARE_LINKS) { + ap_rvputs(r, "<a href=\"", anchor, "\">", NULL); + } + if ((ar[x]->icon) || d->default_icon) { + ap_rvputs(r, "<img src=\"", + ap_escape_html(scratch, + ar[x]->icon ? ar[x]->icon + : d->default_icon), + "\" alt=\"[", (ar[x]->alt ? ar[x]->alt : " "), + "]\"", NULL); + if (d->icon_width) { + ap_rprintf(r, " width=\"%d\"", d->icon_width); + } + if (d->icon_height) { + ap_rprintf(r, " height=\"%d\"", d->icon_height); + } + + if (autoindex_opts & EMIT_XHTML) { + ap_rputs(" /", r); + } + ap_rputs(">", r); + } + else { + ap_rputs(" ", r); + } + if (autoindex_opts & ICONS_ARE_LINKS) { + ap_rputs("</a> ", r); + } + else { + ap_rputc(' ', r); + } + } + nwidth = strlen(t2); + if (nwidth > name_width) { + memcpy(name_scratch, t2, name_width - 3); + name_scratch[name_width - 3] = '.'; + name_scratch[name_width - 2] = '.'; + name_scratch[name_width - 1] = '>'; + name_scratch[name_width] = 0; + t2 = name_scratch; + nwidth = name_width; + } + ap_rvputs(r, "<a href=\"", anchor, "\">", + ap_escape_html(scratch, t2), + "</a>", pad_scratch + nwidth, NULL); + /* + * The blank before the storm.. er, before the next field. + */ + ap_rputs(" ", r); + if (!(autoindex_opts & SUPPRESS_LAST_MOD)) { + if (ar[x]->lm != -1) { + char time_str[MAX_STRING_LEN]; + apr_time_exp_t ts; + apr_time_exp_lt(&ts, ar[x]->lm); + apr_strftime(time_str, &rv, MAX_STRING_LEN, + "%d-%b-%Y %H:%M ", &ts); + ap_rputs(time_str, r); + } + else { + /*Length="22-Feb-1998 23:42 " (see 4 lines above) */ + ap_rputs(" ", r); + } + } + if (!(autoindex_opts & SUPPRESS_SIZE)) { + char buf[5]; + ap_rputs(apr_strfsize(ar[x]->size, buf), r); + ap_rputs(" ", r); + } + if (!(autoindex_opts & SUPPRESS_DESC)) { + if (ar[x]->desc) { + ap_rputs(terminate_description(d, ar[x]->desc, + autoindex_opts, + desc_width), r); + } + } + ap_rputc('\n', r); + } + else { + ap_rvputs(r, "<li><a href=\"", anchor, "\"> ", t2, + "</a></li>\n", NULL); + } + } + if (autoindex_opts & TABLE_INDEXING) { + ap_rvputs(r, breakrow, "</table>\n", NULL); + } + else if (autoindex_opts & FANCY_INDEXING) { + if (!(autoindex_opts & SUPPRESS_RULES)) { + ap_rputs("<hr", r); + if (autoindex_opts & EMIT_XHTML) { + ap_rputs(" /", r); + } + ap_rputs("></pre>\n", r); + } + else { + ap_rputs("</pre>\n", r); + } + } + else { + ap_rputs("</ul>\n", r); + } +} + +/* + * Compare two file entries according to the sort criteria. The return + * is essentially a signum function value. + */ + +static int dsortf(struct ent **e1, struct ent **e2) +{ + struct ent *c1; + struct ent *c2; + int result = 0; + + /* + * First, see if either of the entries is for the parent directory. + * If so, that *always* sorts lower than anything else. + */ + if ((*e1)->name[0] == '/') { + return -1; + } + if ((*e2)->name[0] == '/') { + return 1; + } + /* + * Now see if one's a directory and one isn't, if we're set + * isdir for FOLDERS_FIRST. + */ + if ((*e1)->isdir != (*e2)->isdir) { + return (*e1)->isdir ? -1 : 1; + } + /* + * All of our comparisons will be of the c1 entry against the c2 one, + * so assign them appropriately to take care of the ordering. + */ + if ((*e1)->ascending) { + c1 = *e1; + c2 = *e2; + } + else { + c1 = *e2; + c2 = *e1; + } + + switch (c1->key) { + case K_LAST_MOD: + if (c1->lm > c2->lm) { + return 1; + } + else if (c1->lm < c2->lm) { + return -1; + } + break; + case K_SIZE: + if (c1->size > c2->size) { + return 1; + } + else if (c1->size < c2->size) { + return -1; + } + break; + case K_DESC: + if (c1->version_sort) { + result = apr_strnatcmp(c1->desc ? c1->desc : "", + c2->desc ? c2->desc : ""); + } + else { + result = strcmp(c1->desc ? c1->desc : "", + c2->desc ? c2->desc : ""); + } + if (result) { + return result; + } + break; + } + + /* names may identical when treated case-insensitively, + * so always fall back on strcmp() flavors to put entries + * in deterministic order. This means that 'ABC' and 'abc' + * will always appear in the same order, rather than + * variably between 'ABC abc' and 'abc ABC' order. + */ + + if (c1->version_sort) { + if (c1->ignore_case) { + result = apr_strnatcasecmp (c1->name, c2->name); + } + if (!result) { + result = apr_strnatcmp(c1->name, c2->name); + } + } + + /* The names may be identical in respects other other than + * filename case when strnatcmp is used above, so fall back + * to strcmp on conflicts so that fn1.01.zzz and fn1.1.zzz + * are also sorted in a deterministic order. + */ + + if (!result && c1->ignore_case) { + result = strcasecmp (c1->name, c2->name); + } + if (!result) { + result = strcmp (c1->name, c2->name); + } + return result; +} + + +static int index_directory(request_rec *r, + autoindex_config_rec *autoindex_conf) +{ + char *title_name = ap_escape_html(r->pool, r->uri); + char *title_endp; + char *name = r->filename; + char *pstring = NULL; + apr_finfo_t dirent; + apr_dir_t *thedir; + apr_status_t status; + int num_ent = 0, x; + struct ent *head, *p; + struct ent **ar = NULL; + const char *qstring; + apr_int32_t autoindex_opts = autoindex_conf->opts; + char keyid; + char direction; + char *colargs; + char *fullpath; + apr_size_t dirpathlen; + char *ctype = "text/html"; + char *charset; + + if ((status = apr_dir_open(&thedir, name, r->pool)) != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, status, r, + "Can't open directory for index: %s", r->filename); + return HTTP_FORBIDDEN; + } + + if (autoindex_conf->ctype) { + ctype = autoindex_conf->ctype; + } + if (autoindex_conf->charset) { + charset = autoindex_conf->charset; + } + else { +#if APR_HAS_UNICODE_FS + charset = "UTF-8"; +#else + charset = "ISO-8859-1"; +#endif + } + if (*charset) { + ap_set_content_type(r, apr_pstrcat(r->pool, ctype, ";charset=", + charset, NULL)); + } + else { + ap_set_content_type(r, ctype); + } + + if (autoindex_opts & TRACK_MODIFIED) { + ap_update_mtime(r, r->finfo.mtime); + ap_set_last_modified(r); + ap_set_etag(r); + } + if (r->header_only) { + apr_dir_close(thedir); + return 0; + } + + /* + * If there is no specific ordering defined for this directory, + * default to ascending by filename. + */ + keyid = autoindex_conf->default_keyid + ? autoindex_conf->default_keyid : K_NAME; + direction = autoindex_conf->default_direction + ? autoindex_conf->default_direction : D_ASCENDING; + + /* + * Figure out what sort of indexing (if any) we're supposed to use. + * + * If no QUERY_STRING was specified or client query strings have been + * explicitly disabled. + * If we are ignoring the client, suppress column sorting as well. + */ + if (autoindex_opts & IGNORE_CLIENT) { + qstring = NULL; + autoindex_opts |= SUPPRESS_COLSORT; + colargs = ""; + } + else { + char fval[5], vval[5], *ppre = "", *epattern = ""; + fval[0] = '\0'; vval[0] = '\0'; + qstring = r->args; + + while (qstring && *qstring) { + if (qstring[0] == 'C' && qstring[1] == '=' + && qstring[2] && strchr(K_VALID, qstring[2]) + && (qstring[3] == '&' || qstring[3] == ';' + || !qstring[3])) { + keyid = qstring[2]; + qstring += qstring[3] ? 4 : 3; + } + else if (qstring[0] == 'O' && qstring[1] == '=' + && ((qstring[2] == D_ASCENDING) + || (qstring[2] == D_DESCENDING)) + && (qstring[3] == '&' || qstring[3] == ';' + || !qstring[3])) { + direction = qstring[2]; + qstring += qstring[3] ? 4 : 3; + } + else if (qstring[0] == 'F' && qstring[1] == '=' + && qstring[2] && strchr("012", qstring[2]) + && (qstring[3] == '&' || qstring[3] == ';' + || !qstring[3])) { + if (qstring[2] == '0') { + autoindex_opts &= ~(FANCY_INDEXING | TABLE_INDEXING); + } + else if (qstring[2] == '1') { + autoindex_opts = (autoindex_opts | FANCY_INDEXING) + & ~TABLE_INDEXING; + } + else if (qstring[2] == '2') { + autoindex_opts |= FANCY_INDEXING | TABLE_INDEXING; + } + strcpy(fval, ";F= "); + fval[3] = qstring[2]; + qstring += qstring[3] ? 4 : 3; + } + else if (qstring[0] == 'V' && qstring[1] == '=' + && (qstring[2] == '0' || qstring[2] == '1') + && (qstring[3] == '&' || qstring[3] == ';' + || !qstring[3])) { + if (qstring[2] == '0') { + autoindex_opts &= ~VERSION_SORT; + } + else if (qstring[2] == '1') { + autoindex_opts |= VERSION_SORT; + } + strcpy(vval, ";V= "); + vval[3] = qstring[2]; + qstring += qstring[3] ? 4 : 3; + } + else if (qstring[0] == 'P' && qstring[1] == '=') { + const char *eos = qstring += 2; /* for efficiency */ + + while (*eos && *eos != '&' && *eos != ';') { + ++eos; + } + + if (eos == qstring) { + pstring = NULL; + } + else { + pstring = apr_pstrndup(r->pool, qstring, eos - qstring); + if (ap_unescape_url(pstring) != OK) { + /* ignore the pattern, if it's bad. */ + pstring = NULL; + } + else { + ppre = ";P="; + /* be correct */ + epattern = ap_escape_uri(r->pool, pstring); + } + } + + if (*eos && *++eos) { + qstring = eos; + } + else { + qstring = NULL; + } + } + else { /* Syntax error? Ignore the remainder! */ + qstring = NULL; + } + } + colargs = apr_pstrcat(r->pool, fval, vval, ppre, epattern, NULL); + } + + /* Spew HTML preamble */ + title_endp = title_name + strlen(title_name) - 1; + + while (title_endp > title_name && *title_endp == '/') { + *title_endp-- = '\0'; + } + + emit_head(r, find_header(autoindex_conf, r), + autoindex_opts & SUPPRESS_PREAMBLE, + autoindex_opts & EMIT_XHTML, title_name); + + /* + * Since we don't know how many dir. entries there are, put them into a + * linked list and then arrayificate them so qsort can use them. + */ + head = NULL; + p = make_parent_entry(autoindex_opts, autoindex_conf, r, keyid, direction); + if (p != NULL) { + p->next = head; + head = p; + num_ent++; + } + fullpath = apr_palloc(r->pool, APR_PATH_MAX); + dirpathlen = strlen(name); + memcpy(fullpath, name, dirpathlen); + + do { + status = apr_dir_read(&dirent, APR_FINFO_MIN | APR_FINFO_NAME, thedir); + if (APR_STATUS_IS_INCOMPLETE(status)) { + continue; /* ignore un-stat()able files */ + } + else if (status != APR_SUCCESS) { + break; + } + + /* We want to explode symlinks here. */ + if (dirent.filetype == APR_LNK) { + const char *savename; + apr_finfo_t fi; + /* We *must* have FNAME. */ + savename = dirent.name; + apr_cpystrn(fullpath + dirpathlen, dirent.name, + APR_PATH_MAX - dirpathlen); + status = apr_stat(&fi, fullpath, + dirent.valid & ~(APR_FINFO_NAME), r->pool); + if (status != APR_SUCCESS) { + /* Something bad happened, skip this file. */ + continue; + } + memcpy(&dirent, &fi, sizeof(fi)); + dirent.name = savename; + dirent.valid |= APR_FINFO_NAME; + } + p = make_autoindex_entry(&dirent, autoindex_opts, autoindex_conf, r, + keyid, direction, pstring); + if (p != NULL) { + p->next = head; + head = p; + num_ent++; + } + } while (1); + + if (num_ent > 0) { + ar = (struct ent **) apr_palloc(r->pool, + num_ent * sizeof(struct ent *)); + p = head; + x = 0; + while (p) { + ar[x++] = p; + p = p->next; + } + + qsort((void *) ar, num_ent, sizeof(struct ent *), + (int (*)(const void *, const void *)) dsortf); + } + output_directories(ar, num_ent, autoindex_conf, r, autoindex_opts, + keyid, direction, colargs); + apr_dir_close(thedir); + + emit_tail(r, find_readme(autoindex_conf, r), + autoindex_opts & SUPPRESS_PREAMBLE); + + return 0; +} + +/* The formal handler... */ + +static int handle_autoindex(request_rec *r) +{ + autoindex_config_rec *d; + int allow_opts; + + if(strcmp(r->handler,DIR_MAGIC_TYPE)) { + return DECLINED; + } + + allow_opts = ap_allow_options(r); + + d = (autoindex_config_rec *) ap_get_module_config(r->per_dir_config, + &autoindex_module); + + r->allowed |= (AP_METHOD_BIT << M_GET); + if (r->method_number != M_GET) { + return DECLINED; + } + + /* OK, nothing easy. Trot out the heavy artillery... */ + + if (allow_opts & OPT_INDEXES) { + int errstatus; + + if ((errstatus = ap_discard_request_body(r)) != OK) { + return errstatus; + } + + /* KLUDGE --- make the sub_req lookups happen in the right directory. + * Fixing this in the sub_req_lookup functions themselves is difficult, + * and would probably break virtual includes... + */ + + if (r->filename[strlen(r->filename) - 1] != '/') { + r->filename = apr_pstrcat(r->pool, r->filename, "/", NULL); + } + return index_directory(r, d); + } + else { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Directory index forbidden by rule: %s", r->filename); + return HTTP_FORBIDDEN; + } +} + +static void register_hooks(apr_pool_t *p) +{ + ap_hook_handler(handle_autoindex,NULL,NULL,APR_HOOK_MIDDLE); +} + +module AP_MODULE_DECLARE_DATA autoindex_module = +{ + STANDARD20_MODULE_STUFF, + create_autoindex_config, /* dir config creater */ + merge_autoindex_configs, /* dir merger --- default is to override */ + NULL, /* server config */ + NULL, /* merge server config */ + autoindex_cmds, /* command apr_table_t */ + register_hooks /* register hooks */ +}; diff --git a/rubbos/app/httpd-2.0.64/modules/generators/mod_autoindex.dsp b/rubbos/app/httpd-2.0.64/modules/generators/mod_autoindex.dsp new file mode 100644 index 00000000..da8a9f5c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/generators/mod_autoindex.dsp @@ -0,0 +1,128 @@ +# Microsoft Developer Studio Project File - Name="mod_autoindex" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=mod_autoindex - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "mod_autoindex.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 "mod_autoindex.mak" CFG="mod_autoindex - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "mod_autoindex - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_autoindex - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "mod_autoindex - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_autoindex_src" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /out:"Release/mod_autoindex.so" /base:@..\..\os\win32\BaseAddr.ref,mod_autoindex.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Release/mod_autoindex.so" /base:@..\..\os\win32\BaseAddr.ref,mod_autoindex.so /opt:ref + +!ELSEIF "$(CFG)" == "mod_autoindex - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_autoindex_src" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_autoindex.so" /base:@..\..\os\win32\BaseAddr.ref,mod_autoindex.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_autoindex.so" /base:@..\..\os\win32\BaseAddr.ref,mod_autoindex.so + +!ENDIF + +# Begin Target + +# Name "mod_autoindex - Win32 Release" +# Name "mod_autoindex - Win32 Debug" +# Begin Source File + +SOURCE=.\mod_autoindex.c +# End Source File +# Begin Source File + +SOURCE=.\mod_autoindex.rc +# End Source File +# Begin Source File + +SOURCE=..\..\build\win32\win32ver.awk + +!IF "$(CFG)" == "mod_autoindex - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_autoindex.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_autoindex.so "autoindex_module for Apache" ../../include/ap_release.h > .\mod_autoindex.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "mod_autoindex - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_autoindex.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_autoindex.so "autoindex_module for Apache" ../../include/ap_release.h > .\mod_autoindex.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/modules/generators/mod_autoindex.exp b/rubbos/app/httpd-2.0.64/modules/generators/mod_autoindex.exp new file mode 100644 index 00000000..90f4057e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/generators/mod_autoindex.exp @@ -0,0 +1 @@ +autoindex_module diff --git a/rubbos/app/httpd-2.0.64/modules/generators/mod_autoindex.la b/rubbos/app/httpd-2.0.64/modules/generators/mod_autoindex.la new file mode 100644 index 00000000..139298d2 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/generators/mod_autoindex.la @@ -0,0 +1,35 @@ +# mod_autoindex.la - a libtool library file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='' + +# Names of this library. +library_names='' + +# The name of the static archive. +old_library='mod_autoindex.a' + +# Libraries that this one depends upon. +dependency_libs=' -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib' + +# Version information for mod_autoindex. +current= +age= +revision= + +# Is this an already installed library? +installed=no + +# Should we warn about portability when linking against -modules? +shouldnotlink=yes + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='' diff --git a/rubbos/app/httpd-2.0.64/modules/generators/mod_autoindex.lo b/rubbos/app/httpd-2.0.64/modules/generators/mod_autoindex.lo new file mode 100644 index 00000000..6533eb63 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/generators/mod_autoindex.lo @@ -0,0 +1,12 @@ +# mod_autoindex.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/mod_autoindex.o' + +# Name of the non-PIC object. +non_pic_object='mod_autoindex.o' + diff --git a/rubbos/app/httpd-2.0.64/modules/generators/mod_autoindex.o b/rubbos/app/httpd-2.0.64/modules/generators/mod_autoindex.o new file mode 100644 index 0000000000000000000000000000000000000000..08725d05b00b9afc520c607bfbe2df3b8e3f10ad GIT binary patch literal 150568 zcmdqK3v^V~^*?^^<iYUDgl7^!86ZI9nFwl>fC))-f<Z$vfuNu~5)8^qG7(geXcA>Q z#e$FOx248bTdl2@T1BLa0g*?wzS~ltRI6ViYVlFDROSEKd!KXeokxUzzu&cfYyIz9 zxwH2^`|Q2XKKtzRxOXP&O3Tml*tVrF+nQoIn5J6R#!DP(A(IQOK~|RaL^mLLujCzl znur~ATZC(zZ*U92R&`aN`6F*2GCmL~wVLwB`&u3ZH4r&95J>_W8XqYQOezk9&T9V3 z&T4Ny=xIJ=2by<#FPZy{Z*U25mihx{7yGYYu}E-~Z6i~dq0ow~&2K#(>KX_i2!sy@ z!q57)7MB!E59JqBg?1N|gjPo`C~V!|SQe=&Xnn=kdN=D{3aJB0Ng(`AApFTCbH!|} zF9-T^*8OnpZr|WSYuj;L9arEc`Xj{!t?j<nJ6KR71Wh^w&>~tXm=6EYH@Jxik%q!; z^x1ke5NXV83<M(AWd?xwN{$3tkK^MjU9V*}Y4GAk`T`NLF8m3MGb|So%lqFRKfbXO zIfu6@z0ekA)D~3gsAS<yWDj~HKM+1r8;DFCo<n#zl%11zG!n`#Y&|ON%71xJNp||V zxb-T=t@q^h!R$T&`cA^F-$l6fpB%budl70+Z{3f=j3-#~hG2GjnXhzzU~fsbmndc7 zoq@f{*#s7`Gj<S|*A5Ap7Pl=BDap>M4NOR8TN+2AQ}U(Xi<-VF+K&FWLO(uyyKgY; z{5BBY%asoA=MU+RqUxexS@;VSR|mr1a1d4nZult2Z&_%g$PI*BvNJ)*Yv+pP;s54O z>a!jQCFyrq?+t7SWv8Q9T7VkN*Zfs-=wKjHj`G(1zLvkjD60B0KJ$+6Dd~}J1<roa zx3#1oy<zFb@UG@}ziB#F5Lyrj|NC&(#z6BkcHr#iP&_ETq0*EF3Pv>kJ+J|OMgZ<X znH8|5b-=k5(nj<*>D_Q0g#62QQxQ5+D_eOxG;A#K?KqTBPEqqW1)*NJPYDggeMIA9 zhwo!Qy2Ky;>BcB^hc`u`fr$9c>7ca04ZF#;m&`4iQ#AJ(u`z1AQ-4rTd`BnTux`aZ z_)dpLBT~cTndk=$kI=9{<Xo1@p`v@dwY~AIK=V^MH10#?dF_G7liZ;&tbilO*V;$| zqKs4dBJvo?W|uxO0QEorMdJ=FtMSo5<gt1bmm@hnaolHF+et;h1W4m;fk;7iz{Caz z#__=_FerKv6Yaj1J*c&(BstykZJm>y-tva8<xx<$A$hL^BKdjy4`+!zdHVy+yKJ!a zWws5ZZsDgz;n#dSwgR@!p4is-M)OWPuyAJ+j~T1+g$)<m+{HTzz)-&M@U#sDIV`*R zE2KXAK;SOcJ=M20I3~U2l~8#R0?TuFAm@{X`zb{IfrT$Mw?l6bdS3~RY&zC$L*RHQ zrRiAD#=oEaT;qZ8Gl$=l{8Nz4vODfT=72JC023t2B5SQ_8zzeSju2S5%*ppfv!;jl z7R@XRA1$gb3xC7G@W-k^_*I$)L{94)W#Qf2Hl)D=f!2?whbLwOJe1cy9l5+m8FZ9~ zzh!2E%fiSPdHeI)x08bqp;B_gw}et*dgwIb3xwa65|F$yhftIjU0QV6GjP7lM^094 ze2yxiKf<qbusL-P?{eBBv)4rxfynhWW#O0dj^@2`C=;U)LD;<8`wYf6&2C&?q07I5 zTN0E9O7q(Djvjj5DaCjsFa3#9*z*`Q|5TIZ^@VKAj`3(9rK7NnGzzsl+I?HwTie6M z>7nwy#eFGUWvE0-3n8B~ae4S%iaE)4fp8M$(86*|D3N>?8weM(d-B@VFs6QYl4593 zq&QuP#=!e2i$C0E=9kh!6q4)9!yh;zlMeqE=h32B)cN0X8lcu>mPD3$OCpPUM3y1d zp`XLZvy_Ku>@?+DzLpOmsw{GSJ|$m?5Z~6!vhd!fe~%4yZTk0UU+Y)I(Y)7YOUlC% zay0Dzfr2>Vu|&iaI4X{l7CLdne<!MbGy$=doZ0fmwq$&SuF~-p-UXAte8tz&406|J zxtT>nUZa+__D9?l9evjJwQParqA#CCBpl~~;A^=X6hu^}bP2~S`!ny2judd2_}ymt zNo(VsMO~lG`?xgk?;VdoiW9HfEZB4SZNp#Gb@z}zb=*QcEN`1ti1Hn#e47V$9)8%t zEqLYd-7dTd<+sGS>F=l(NBmbJ;wOoS?<FE0NJRW&BI5Ijhz}(qQYXdPxjzB1_4^>g zvDX(pg|4tV+Tb$8={5?IjtCH}CbCPy^Lm8q(@VnjG=ehq2;%PAR!G(6gL7LGL9+<* z5;UElbb^Wr@)LA6K^BM|;~7FXbPQ*RN<aJN`0*I48>e7EkPV@sdkeE^0OqxKd=5SY zkjLuiU<m3u-T?#-Fj(6WImkpEA&|DyLOoXIFdAg%m2Ftpjf;_;s9GS>BRgD_jf%IS zVr-pJ+K$Y<g*pAf4!$c{JK&Cd)}BLR4mWM@j*r;-tn&is>>jT(2eJky(3uOJjYFvQ zdkgz!K<M7WOj6M?K#!n~r@v-bfc6-mgsnZ5TDzjCX<fHbjpvFmS{qOU9z>m3L+eTD zY~dRuO8u<#=jbQ$S>91r!#=|z@%q8yxW0Rf*f@x-GDi6UwYG=eLT|yu-iGc4w7nN- zvD$}1yRRjJ5*XZTRO7{Bh+i4}uYaRnN_@T0_1h5yandfO3|qEgm70Rl!GUm5JuLh! z<e)9RqTAA4w`I`YB0t2Di*5#|SRVxBwB<ZQFCbZ>C&dI3^vpx;GL+FgLsQ*LykP$W zRt5j28KOMmE4zVGhlP1u0fm9c1r=qHHQD*);TI0w|0RZ>jJKjWYF`-sv#jaTQ1A0! zuwht3ymWYv<hej(9rigdl+#*3YzglTgp*|{Qy%GF&TF?w-|WM8#H?S-!v73}|E#Cv zKWQsTAPZ_*Yvlw;Y-4c8X;7{gsn~pq6|EmP_Ht4=Ej>zTOkF24-1af3BNlC_u=kYG zJo-19ow40}2Z4osabPl7tk6XDSuVa<n~Ql}%nt84bo)``5?PC@`5BY4+b_IiD)*JV zdw9EJ2Y9qguo4q6l63ek?jKpTp@(*?fDu@fzyo^e_JED02-?d<zSdkMt-_;wJ-*f{ z0ww!e%K?Qy&1>J;kyLnePx9x1Uxm8u?LzGdH1ACY$rI{EYoooMMd9<mZT`RxCGF_~ z@04Qsj~ShEFIFs((i|*3Qi{+?IpN}*NNKi4v%|&N;GW0aZOmOf4}^LqECZn|63ouW zHW-of4=i=+xqU>$9=tIiMCnN)Vqw=<A;f^;ECdlNCaPXxh`Au53y3JoGpb$#VvP`U z#gXCSnn<bl0Zj5&q0y1j%)P~48nb(gdyp6Q7SlvvHGky^Ess?94HswPfFoShmk3u! zst1LOferF)EgjR+-k4g1ePi~R^~GaA7;6Y)*B6gPfZ_P!fLg&h^FPLAN#ueak*f5r z`@Vc-$SxQVuJS^9<0kSZ6!xXhOi@hq?-35YgXq%_{fBSBycelXkCgT(>RyuFBm8nv zcWmvye0j)DV)2GA=n<|;Z$9|#;mwOSmVr{=u^xdd@l}Q#-Ej_36^~RtkLN-ae;ZcY z*ew-qUCxoyvIp6o;tty+#6<Ha2#Z<YqA1zd@)(LXO6)X$l1$;#@iUNUxH|2v=2+wn zXD3lQ6yBF8%@qhydLE$vL6nC7vA38f*1g3!(wQ<D6=x#qt?ho?_7=-jQS2wuj%3_a zTu|WTGEXcue|u&E-ok{ufrQkG7%E~85;2mBYY-&Sp|_`ajJ2nDEUh->l&y(bWBTPa z?!tuq@{DwL3stkC`{w~Fit3-{;~pG0`C488uWxI9Vast}OFQ7QF!n-uuN)q$;-s+Y zctL1fbB7IJL})(t$bp5Qm2XJS#SoBM-$Sj|{p<croa!WR;W6LViTQ<1-%bg=P}p)b z<PU6ElW%jrE%9yb0wFj?ni6^hv16BF_<V?c_|H`wn!1xhw^Ci4#-J|FQ*^yazLu-8 zy3ln$$lKqs2)MHM^Jg|(m3nlS*H`+&(Ou~quIdAz`Cb2ptGWQ_=nY03JHEcBB=`7~ zBE&l;E%8@TFcAI=WmmLDW!La?93jYX7Z>4ZY-|yiIUCi`m9c~?VhM|52%Ppq3on@) z2*1QLrYr~o;eRMq%+UA_>nk~Yi!+{xGUh^bjGDI?pAP(Y;y1>tfZyxFOMu^|aJ~P- zG|Kx|oB*g@?ea_{N*N5T?d6EKqR4qYru$01!7iq?eO;f!3u!;xyc_4g&-zOzE$Xqh zG7y>TWhvSlNVn+$%$vyely!ZjuWR4!!S>(T8#X>p;l0InZKqVfgB-PN=Wunkzcc&G zBj;-K%Qws;1BxOS;jH4aOf=#BypIu@BM&dedEErvM7>vUoKzM`ZGINbdM0yHeUG&z z*k4Dg`a)W3dzr7~>(*C7IE45XN69!_ps>J1c)M)#L)bvdX5G~gSx>~aL&YWSzp?oa z|B;VHW%`z7mOf=u2W-5ADMGd`kNl1f*2*Klr;{*vob=yvAMD8c`0&_LtY!vI$I0B) zvKsNV{0t?IzocFMqDf=2*ESS2oqK60JrHTYA*$Y`H@*ej+cd=rof0rhn^fX#yw}C` zI2xMiteVsYxX==<jdul_*JOLG5d4cz-RCzR#%Ws2Hca`UJp85hWor#a<KZ^d|2KT} z05Wr6!_3Sl&|IX*C$qWT&3k&_+%K@VC7ZlK7s0$g0DR~^WHy{HQr&0V^H0&NQk-|~ z{D-$_W@&g&QS*P>&bb$@9iPJi(+wZx4}&<Irmn^(4%{n{YqD1(ROmFspZ7{hxIDYC zBywN&3gW}sGBfJzItNsBniDA<M5~69>|jaw2r7>mZq2i-$(A44wWYl)791G9h@=hm z$e$nUvoa6>lHeK%PC)sAg<#!*im+@6P|&bKqGggErG!8Y2G($^5Qdjz=k6)#2TiTF zc<KCN536lG8<QNbIYl;3|LY;t!of8bRyd--(D2=IYm(U3d?+b!7wMYU@hSYgQA=t0 z9i$W;-Q)GO?nLF%@R#r<R+i7Fl6_bmMpodc^{B7q5EBa1<%t620bgl5mvms6N#U`Y z7X7kBqvdj8AiPVTHRrV#@d+8<qH-o3)c7M6+4Pji&w?1wA^a<-Bs(n+n*J*355Mg+ zxD=0b!f#_-M7cqqr%i&B%NKs-`@tj>i*-r7t5HjE_!x&>iOj+(SwBcA59>2nw_<oJ zy|GF;CnwPSEvDABWZi}*vzy>U=?<K#tssgY9Z<fZg-f{k+o|^yj})UBj6<;B*HVcJ zfC?KCPwanseigzVmmE`00r**Dwg1q-uP`veZ#%o7x1Xky1`)*B;aP9Vq$SxEzLs0i z;p_s@%2Lr?d9Rd5{AN!=9T>m{2Qn-qA07?9mU=9np*WZJ2>Y=JjOqano0ijIFB{jq zIuon!B=|e76JGevPKfe%f<RGYFp=M@u@(P6^83$}-+ir3+#<*KdE)!k{^sLo;Dcz3 z>W4!=#BPvIvUlm2Hiy3ws72@qaeA}vjn<XOXo$XCitrCqgd-w2mbWS#+0NJc1P~|O zi*ERU212N3R2M`e$aIvm%yT1O>+ca0NS~Akqh>O<U>f`_B^Z0Y9ZRwc%h9&XQs0ih zmxd2+zYxKon^uCs5biiM;XOnFLIR2F?ZAfB$<n;o@!@OvJvD^`dWJxSzLx6=!hoiU z07JL63vgEp^-wQCK8<de&TSoo`8cBl<urhGdXbo!9zGbAUsPXoe1fAM%wOow4Uh70 z4AA(YIHxA4hnrFQI@X|y%v<Fc7uakDv*%%?=y{VK4q`|96?XAhm-)UKNB3{}PRq_@ zAD$Mi$sW_u!qzsCs;B+9vC@v&pyK(TL<kZtQzh%B@i=j1-BC<Plywht$^Svt{fwjC z$+|WKo2;8oTHKwhv+i!>6sPN)@!x8}b^M%xO^eR9(fyUMvog4PVYJeYUz`3&*pG>Z zU`H<1G4Dfgyx>6%N3(if<1B6+kGE$2i{cy0gFy2+7=&F3bvvM=1(Zb_|5tJG=`pjP ziIzQ(Wb-;xk2)R1Um)Gnem$1{yrM_TdBn&Ggg?vMA6sdzD=sNGB`(i`RZ!kSlo<cN zE=47v(=-%_<aTsp#S#O2axY=b$>bdhDIMTQC0yj&fi;0-m+(PKCQ;cXyptCXe|no9 z)$B?4wbVj}<c|miBql^(%QS*i{?I9*F-HX}hZBw>%d_jT?h1dXdYX09YzAsDyFT6- z&m)H~LViHIWCp8*7KQq4U+Ykmqp*Tj=lubfZK(F*Wf@4!rDbG3%5q6G65^cf+{hf7 zp=-1Ar-wfZY)IZkug1_hB%RM7?_e%J9_q$6o&Aij{6HDD6J=+A)OZkegC!Bv3qV3{ z$3y?5?nb?nj@v(@PhD}lm(ZxVof<VB)JSlKfJp!?$5Az=Sm%S5BXMHi1_k5Y$psya z2)>OjypHey-gJTUdH)NgI;_i3#_e<#FSHt{rx5Hoot@A^uoHJ)(We6`+_Ak1#X7<% zt`2Q{Gp6kvJ*_uF7gr-D%x<U(2b-#gW}{liTsEi>+cHdpFx26lu6YmT#>(&LgIa2z zgEhThuSjI4gYC>AWJ|heYx95$zDvWA(p+q>GXon|^f>g}PhmbSxOUMziTTG_mtk!h z-o=3)(?OAHUP05zFo$lWf>+Qzfa|_%9VyeUt7p2)8j>k`rNRwI;|t*-9;K$;6f0-E z0Uy;NlA>aZHZuRqMn8E(HToU6<UeaPzk));S2cPDB$!4oA#rLPJOu}+Tz9D}jyr96 zRCG*w9W7sXGS%Gicqo~wO+huCLS9AhsuV&AgEA8(jWLugC~?$qQlacYnM36bIX92W z7<dN&O@@Rqls2$Lfvo1$l(4RXhK@xpOF7+iJc!(-hlw732eG7&r9BzD%<tHnfa}Lt z#m3fLMSJzAoO5Fw<t~hA&Ex8i7chW|nhLVV^P?O*I62tS`nh_^h4X_tU!ix-aIS@u z6`Ut<q&z;4KhBNXxzo5(ZG;;Gk>+|3iV)S_K%|cx0)%mJMGh>_?#uqcfNPzFg=ZNO z)x0vW)~lyV>fOQpg8EAKHJy!h!IQ}pSMPAuFLAz4kCgFl8mN)tLcAw}jkd4#2vB*H z(9#~>xs6uSsLzzK>&vr8Gqp&lETqY@Kp*34nT~b)4KR(Kf>T1Q0TTn64Cs@B4J9df zFYVct{SRlU^Opdoragr=UX441w~X+j=O<`NUuskZ%nk3O1DF8LT!zzT0#*jX`||b= zhh9RK96IA;%8|c10-Srd3~oZsA~WdHCvjW`1h0#*2RN;3BKftD$(q6l4zqkMb=Xe^ zB9SI)R_p!{9xYG8qO3f8RJ~=yoJfAq>ubqp=G#_d*y30TQ4>`<0Hrsq=2zO_AbQ4N z;WM8;eJx}01RO6l`C2C8Ic0hHSd=9+O%?`l{MR#zT!JB#U)uUcD6a$z0q$>RP)8n^ zFUSXQV`=LvSZEw6rI(}FrV=<gw-o0st-+q8_-M$h55j2KLnlK!Do_`msU^Z_0P=wB z0UJKVCS*Gm;|vDX<)O*50^y;_i-5u}^P|0^yJDa09o<C__Kwm+oJHYP-!{LiAME{Z z9{D&jiES<qf8+SB3r+;cv#RgPB3<}>pljLNzoU_&t8pEA8jQ0k9xl0uZttLH(0JYm z?y|k-`*Fl~9G^M#DX#Es4P}oGMAC7hza)DMMc>p&-$#np&ngK-tf|cf4;0BMYf<?8 z{P4cvme;bH-uDA5^tGNTQgg}AMNd;#lILh_iTN<a?}QhvDf~276w*->Tq;izr)@}n zj0BKsqUM6|5D^H0%AJS01Mr9UHP>eQ?VX3xfsFw?22U`cFNpbegPi2-SaE~pVa=0Q z_p+_fyVUX@;mD!+$?S~~nCffk%e$vXvx%!|$~a$36(t7P#4El2{Hg#;z+;Ac0})}w zq8#lCMA+F}s-1jj;vw;G2>#S&Ak1Egjs76YBTba&FyQeH_o`EIs=s2x#(dCkIJOto z_-<N{JFO#{@TtSGV;~r~oiy+`I835^N1y+ggw`^irjf|+4p302Y#00K<hz!1=Ej1B z+l0|L51OrxiR=;?0bD{s|19E<$Aqu-9vlNm&_65?g8oTBCwx-K&o1e~rGB2R`o-gG z`GOWZ+TH49@v?9!VzyMpY^j%w1CHq8Pfo4CIhKp|mIjE<_R@YIYy9*`-);ov7p<?R zU~Vq(QY^E#=E31x+l#`bv>!k;mloo43_c5dExRE{TUHjiiJS>ja(u0K!bq+S2Zg+( zl0v>LvXus5S!9YR5AQ7t-^9Zbfhy0%DM~ANb%}o6Q{p+!(-xMHlH3n1`)_m`WzkX` z?L4bywR~N{u$^z%u;IFv*+eyt$qNrH{y+=K^tFtEw{#3Ot;rre-Pc0m%EC)?i|~{W z2hJTku`D$E$8wC#LRz8(w$tz}kNld42t))<+l6<o@#Y1$E^>SJdbBwZ=}ys3^9&|~ z8{S2bO2(oQS5NCroNY<zC*@(06~OD|O<cDn+lz{Xi>#LHbl^99pHXn&QD_SfSdx;d zSnpC*{R+QF;W-L_K;bmAQ2i|m&sR9j4<xTp;q3|!D14v7D-`~c!fO<MK;iQgeo)~n z6n+FaWt7&3F{(EDw$8L$@OtAMAWg?Wy^DbB>16yCD(@)9oyWCGF?gyayDc@mDfm0S zl`bkl$2G6bv3%hIEYK+Ap-bL~)BAr~G34g$r~cAGmGwS&LC&YJiZ1&0?<fkFrX#xB zVLm{A#}=#_-RCd2Q3!{3%2{1m_`r_)apcHb58BoA&EAeoD#MKu$8F?=$mZ<3@QL%x zLHxQo!fBqbb(I%IcqD|9s58wbY6Kp8;D{<zI(^}nNU?Zj`kzESL^r(g%xPy=s5kce z;ZgX?M=o9p$K#EU8;|g&ieKSE{OM&5#cvJG?e&51UrT`C;o-X_;crn+bBPy}+Hi9A zq2=%l<$TF|<f9rol6uFu?rl0WZN-BHXDQ`tp~Ye#!pj?EcRd{w8&>}OTt+Q#@SZz) z!@aV0SBRpwevEv>t8RJZ+wnLM#04HRHbKZ93>kdT=SKSEHPY(<uqf?P^b`PRl{r29 zNegC=S3twtwa1EmEqjr#nvPxMYZ-yQYC3kFuXQP%(lo8JC;M6-6e+Vj6sA7`;@j~V zcP|b})H^yf88r*r`AJA&xdkIa-hxS?WV|D=tm#-TUf+jLnvUfy+6Wz(XK4x#?`wK~ zUemGDeWi3n)E6$K7EC&CvLB6Tp+>;=^F8ZZvYUaxm?S%p)joa0nl8y57m|5#t)g=@ zntwOk&Q73XVG@bu-1P9Fa+-A{UZAd~W8)VxuJn5v7x7HhGE<!spr7^oGZ(4%XG&2N z^Zv}~&iO#|HW~+5qK-kwG;gE$#-433by;LfCNO@c=3`vG<HT!F9UhbqC2(44T^xwu zxgb8yPRDn#B8BMy8WH#^s1T(U>D(5o_InISMC=lR-vZpR3pYL91IDgr(O_fOHXv@h z9$>r^yTb6cC}<py&p_hEb89<gPAhr=jl^-H=1?lq&B1~vYd^Mb$WYC+_Q!^6pRW{c zLzm@uB*DnoEkSAC(T>B|QR?=pp#3LYfbfx^Jw*OU7_=`4n+jUIq4F&{s$hh#<tRQe zNLn8P!!|VEDzo?En^~hfUIWbU^~vDapagjE-8gSSk*{@)5N0Jc9fP=gAg1XU<lRZ~ z@L*^zia8;c*?(D&g+xb-lGk)>rmyu{3TqKOQ48Ks@lw+<+jsLYNAQSHPe>1WNnj6< zX*6N@(7>NGlZVgk0Il#Jn*Qi*`ryj~dgteSkFWG)jM%;yPn3hB#uM@gCk%S$7rYrH z_&v-!9S@s%CGX>oDw>auVyGtLnIYaFrDen1=O~WwG+Z7qVuHx*cnD=?y+H5OAIFvf zdk5J#ba>E<&itXjV-ZjXyU4C;n09RV4ElJ!q8yxiXwy5KY|FyuWASr31_@7EQr2k7 zu;Td)?V~+JZW*t4u6c_lvGX%Ku0@<g?F>8qfFl)nH;{!D=dR?A%P~3&D9Z$z+mk!G z0=uC$yYKNfc!G}B_dqPt#UmGW<iRvp&MD$U&!Q5%df71&H1+n@hw^saU{KgbIhuR< zZS+0*1(~27Z`$Ck-Rks?1$6REwhGTf;Gt=_V;JaKIUgAKF_9m@aXnU%ludX8B6Ub4 ztzI!$FmimYZ{o;Jtu@Q>hKO2zIbX*ziQ{)*{13-7Exj#rFE$M?@1?$%#U0C}u}Q|@ zGoL;?D(Ub~zAzSJFXgHvBv12wvG20;bvn*;DXxiC-0>1PT%NuhJs$1pS?L`gVx+h{ zT`W=I?br%Bo8NS-0{asfrH0^d38ayO_q;tcW9~$oC^^uYq5z|t@Urlihtn~B@FlPe z49bn6US;7IDf8H68!oaj_8Z?1oc%%wZ(d=L{2@R+6gcfO)`!$jtBp+6AG{d}P2{?C zG?WSHlrvgRgB?xR*qB-d11jHejoon}#--so{5l1DCN!vT+d+rC^Tv|J7&<Kj{qV!I zqyE&Xdv_Fe*T$mY6EyS4SzPl+>3GY@kN)OJ`}`Mpe*}eQr??O&7(gSp&EqL+%pW4R zH4&jXvK}8cJqh0o-~qd_P@mQDdJL;XEMh6G?%3v4!UN%Cd_#gQ-o}f>=H2PE4Ak#? zt6eI#+wYf0?xnd_zl~7Tv?lrZ_|QN&KrM~&NY~8ud_;)1n$l_AMqf@Yn$vOfVVW?S zpdYsGPTz)I$#K?YS@&O`XX9weA`+E%cIBR4QPf%4NzsQ+u?pt<>sQt-nmp7h7(XBA zij{R!x&fBY5lcdotPz*fZT`{~ldMqP>d^T5(9$IWtsdJ@xAN+`m19@TU)fMsJC;id zLW@I7>ZVwutWo2w^X4yGcum=|+Pc+?mtAh1w|q%$-O7gZ7O!jwS%Kj6^5FahOX{q$ zh0B*U6s@c)U%c$f2CMAyWy@FA70+)#fq+XE*DVWKRSV}Y<2oe1!K!Lp0UH|{ikB~G zT)M1k`N|M!(A1K;hJ`B^uLvz(zRb|5a>dHJ`AbQsW+dGPDWBgEn!dbt@uJ0bwT4)= z_*#d(vXOKLSI%E}rD2?jCP5FGVAYTk>%!&Bq*b#P*M{o3eGE-zFi^Mn^7@bqoNQe< ze`%fY8fdcRYJ-%;5++;0YgW`vwu<Y?{h`U$rI(hJRhAY9FRGk<>7~}FQ3e||%38X( zp#dK9FI=*mKhb4%%dDb?g>}nn$#W!Jfn<YKGCzc7Q`=o?E&q6{f+~jmC5u<qEetJR zd5z`w`>lcy_2iU-&`QKmsD27enOa_S;RR*I7hMQbhWh6(2~8e)3DCKSw8cv=_cyFu zh@kVYA`eX-I=mKeJv&B_DFx$6%!p+R8dgjanC~o{`pLgkca+e_vuX-kt&O_YKh&Dy zCkt^|1Xu<2EAev(1&vF{P`0+#fA#z&i!Wa`d1z?)3JeKYsO?qyd2B#UE$YY}pnK#H zia)Vdcz~nPEOsUJH;px_OMD6<le@ttT%gQ{p~Gv(4qq^K_-z01z&XRGlgaTHvlfhB zvKV!TqD}#zC|kHEx>@j`4B~?EXlysDtm>k%`T1v@JvPspR596t`!1W`7+SuV2Ishi z)})0xiY}a9Rbu7loo*E^Tv)dvq&~)$E?WqXBT`Hf7~^Mf#gh4pms#ghqj=<Z^B0V- zubW>x1;B#kwbwv5^MRp04@d#-oD%%Y7x}Gm<HqC9La18f!NC>4h#Ujf`cP;^?fAxJ zi&u}WHStzdTg#(XeNMfGMuBB8V<#v@OJF{KI9#Ajy~Z%HAs2C?K<Xi1T(lB7s-$kw z{6<t}iliY6gWA7*CE{*noqy5dC3Suz!@6ZO^czTtdzb{!{JNDqj^;D(G8$5qpf0VG z(IxV^9rKs@7gMNKSC&iGE}p+^+47Ko;qs*m7DMOA(IZLk$gv|aT0-^yk(6FW`me0J zX4UeQwWt!yuNg_Y<eg<K_`CQdDNSZZvXJYEzGcg4fHc<mm(IV&zkJz}Yy9(9tf-s6 z(m%feMj7Ujo!VhoM7)#jwA@Av=LL2C%aNQzbu0a$dbs2a%bj>m+8kFeaGjCg;h$Ju zWnR2q)%-+eVwfOED1p@aO^Eszs~OL~T&AFe{kl9<kH)$KQ1@wryQ3|ustz4ls|)>0 zl^r9=uOr9!M^dV$Ps-N#q*!q^ZKTEXZG3f;`z5@nicA3HGrA~0BHtnqmo%)HkNk)% zJq7u5c!OkT40uXlH1IjE#pJuVWL7Yw<f7u>?21x94R3!%_0;mRV*k*w<HygMP&|Ho zNwCDv^QS*=T&^E;EXEd1;PaP^A76Um&~8I18=NzK{Hj%}#;uw#Zu!c~#|JCNuO?Y} zR9S&zL#~?RYD2IYHgbE6eww8d>gR$9<4*UVw^-}dwRxP4453Twmbtom5!}t)eU5*4 zgVH0}%U__fpkFPCxT`to37?rlMSvfo7A&r<h4=;6_*Y`3p+ve81bCJ#S-z^SmRMpF z(lW#YnQ$`v)61rp`a?*ZsBkj;h(IK}kiSmN0<32VM(Z*JpTAZwx2~?^IpL(tw6G@l zPwTtQ{-4xO)QqUa&Rwa7ZG-=k(QC%ey=1O*mvx;PF=L#;vethcjl(fC_?WDgonvTJ zuH~9$F#bp0v8-Tyoj+;;t-@|G<ScIRBQGymzU*@3kOr)UvHGm59p|rZsEbZ1Q3A%P zmL&d22N`FiC%pdu#CO8Rf`QtL&E*L%;-d}aiLU>|fA)!lp`7HM4Bz0BkVPyfD=$`D z>QWs)UN$Grrt2p=RXjF!-SDdiPipXyEFWI^u<?YJ%5Y4tT$-G-0AO-*%3^E<JziJA znyH3o?IZ(U?|{vV4Yh?pk0?p;rh4h;c|4+wJ1+StQ!S-ng|3!Tbdv!qt~21wO&Uyn zjcibI-Ntnp@|5QB4w?v%o0s18<9YB6x4-K@=p;?SNAgha5&EZ@fRhFO;x~Z3Qh89< zuYYYSf9tAzoGar&D}JNIvUh<eSrFU)AypT|!zGy#r`>YLf}303Esx9-Z~{4j=gjUs zY$6MsW>Xgk+{-3U3f$NJ!odCQ4g+V{Jz<3KWZ9;ddW<14sa`rg?M@xQN_(C;6*yke z(D;T*;Hlmk+<Ptn^>P4d1PFiHX)8f+_<iGUjK=eB1&(%Gmftt=4Z!S5-<bp|IDY|w zLO+M#9s(B-oG$Q`Er2s&$XTezmZpz;AI%al-vMhpAhEtN>6hIGnCqv{|0|dkypUk& z()2olMR)q;1dHzU#RQA)^eYMOD{__+oGI{ff(HqF6~TUi8wk!8xRKx-F|*g$w_yWY z-0RF&0s4}APw4<o16|#1hCO^w;yZr%3Reo>Q~BP7@5hy>-hp321WWC`_&7eD&gjk7 zO3|u)kRsr^;h0_6MXP(?{ViZNwf8+vm-N1u%oexw{&_N3#4WuaWOIf8*W_JsOYev8 z1}tvry`>+zNL<nT5g+R22>+ubGgsiP-vG`RcpJfm0&o8t>IMXUlHdw~cMx17aQhg* z^90^SaJ|60laP&8Nb^&@)Glu0fj<8XBaJanpQ8)NnF9ZN3xNWEO|W!#pKl13w)FXy zV88GjCpd?PZy(DhBv%ldk$gcsj1&rz%t%0x6h<lpNoAx)5U;%x7S0o-o4prEy&ye! ztgjFxosp0ry=_W+s|D%L>7hxG47&^^Hwuzz{}Ixf1sP<&1!TP-!)-c`-6+U7`(Yq= z2{N9Mdj!d4<N-nQ7}+Ao>6~x22{MswYZv59`#tE{ZP9P9SbcuP-H_Sm9%`hx@}~qU z_-E8y)eXO(?n%ce-w0Z&w<|idH>D;ryU+aqh)TW5)Xz1wkEAA=!qTW666bxdqZr_j z?|LfbVYVZ=>tIUIY)982J((svjgNz;Z+h2P7lFu+T)Y0s0snHfp&q!2YW1e{PeeA% zXZ5D)RKj={t2e3qp~jO$dwSQGWe$OWuCEu69IH1a|ED!$7qPhCQ-4HtHmu*SKcSFW zYx?b}gXL^|zkSYl?e_-?M{#1m=Lwcr?)L)8m00fg5{<t>{Tt?6{r*Z){37O!t{6fE z0>4H6FBJG7!6gE}M_vsG{6PyoE3CeQ`n^I>22L@pey<IKZ1!2dzsv)OZu$c>`;z;g z-3F#~P}JR)M)fcF9_ZY@{;M7X$d5Su{XO;}AXzJ{{$88g#}U=Pm%SSkm{*WK_6{Iw z?(Bcf=cvHmDeQkR2o9i@)&Je^(~KwZ-+u>KJktL|`f99rr2l7>dBhF<zn~`O2>;h# zLrku~-;%C;W$AU7p}@(n{jXmRoOS2-Z+_G0zL~O;(*1pMqx4Mw&BP*^wEumiL)o<D zbZU?2YcB_^Y<g}HU}e**Hv!HikKXwy)r3^z(E%h&B0tqjr9Fqh06!|E@ofY_W9UYm zfxaOhr+Uds@WThGUJpvS7O9t7?EX}5zAhnSq=c%VPNgnsG9?6|gtVr5m*74yz5lxp z;ZqvNpd0prjruRuOFwqoy%x5odZ`mR9MaM6AAt@WJt}Y%;<W~m@Ko=EEQ1mNP^{fP z@N~u7!Kq#!?!0Un1|ZGcP;wdwr!aFyzUNFJqA}xa&!s?EW5y&8tt%8VnG49^o8dPJ z*Nh){egW<*oH$t-n>^g@QuQ_u_q!l>czy-0bV2U){Fb$G7^QlteyaCz+`HG}CKlc6 z*~dIko|Cb~lL20-{D{XH6d8{)B7-7hD=Snwwt3#~4I8D-cDBo}ME~3~4AR*AEg5~1 zuf}6LVe6OtW*^hojO3#bphOQyriLlegOX`gszeV-rd;C}0mB%{5oCBWWu9C?MsZ2L zAY+ohL?a6Y8JA3M3J5ZRk#a%KOeUXI2$Ii8jUbbg{|rOt336`oN3gA4kRnD_2vW?_ zRtr+f$QnTc+@2;urg6!7L8d2D=Wi6`B1Y~Kq>|b05hTdSeS*wn<N@X0`#m?pqwL<h zGM-NQMVfZ+&LmgQJ(J{e@3TpideTMO{v=AOnSwmWh+mKwlE~M}y{|BmD<ywoB>z+t zTNwwEsDF~}!G%)zX42L0R*4iIOd@wDdrnmze~)qH@%LFwg;YDlNKMw_S}Wsl(qhz_ zCk3A*QNJjMf12cl@D)<>c~TIFa`-<PY07F?P;X^?$t_eq{#VkCVB4tt^-Iqqa1rl_ z@9|{p@bp61iMV!msPFO|apG~ehrFj8w%7AD5aqD_jQB;s9~n^&d(}hU(+=aYk}qtp zGg2VPn~W3+@;28|t~$si$~*7!kg5^3_dS0@2rBm+;u7Va54nzV&!=3X-19k?G>L$& zNt9-kd%7pNLa=9&2fn&X*wT||y1GY@-i$mTNZ%x~V2dDG+^5?F8JI*vw_T7^xXwO7 z{EWOL$WTTO2r_~N926vnk-rNvieu}LAZK&m9}#2{BVYO9V=H3{BbMz4Vr3LE=2h5K z#?lp5#^z-z>;lI83cHZ89EDY|TXGdvB@wT%nT!=GtcJ0G!Y*O^D-<@Dv7o|gCC2R` zjVl*h8H*U3r^@OXt5?{SjIB`EQpQ#*Y&m013cD(402ZC=71oeM@oahgxLFx%S$mDb zT6rMNQ`pTitQ7WxB$^{uDC|}lSPHvcMwY_vVr;#_e$3cLh272i?($ekq&~A^5NzSa zN=;_<>wvvXp0$NO1fET>ELJivAy^hDnR5x21xn^+1p9@5KEbj;$y`XVESfUw2+kLt z%Ly(N_=<O+HX!g)njk8MqR`63D-D#hd<tz4G)<w6g7&P?dpj~d)q5EC?iAjsUYf;H zy);c?LPb7F^^Su7QoXBC$}P^x`iPPfYtA}y?Et9jzc94g%KDsgue3Pp=)5enxc^Ek z>ub&_SqrT!+or_hhpaTzAC{c4jq_<bYJrz-Hs3uepFNp$G5Auwv{00}JT>`tP<Tf0 zXLRAYOU6uBhAlz5CsW?{3euA&&vZe2JbBX5$9k6hBwEHDI$*%ZAaL^v2MoKouWH_a z;p7u(>VO=ArFjEJ6N_}{fN=y%hYrXiSUPmTL~@68=zx5xD;+w3k7e><1F6iWW+x9E z^BBn^ILZ-B`R=0&FY|QedpEv!mnID?ZYR4)<cfi|-GUtjJ7HiFZ#)%}!h22e)xa(` zB~S6yz^*nW&rGS)-KON}7bMNT0zWgFBS^Zv0!XePeR!XdFGznz3I)luX`TrPGFW!+ zSqqoeS_6mJS3^LJlw{j9BhC|Kgna`_>TxbI@PZd%KJSSJPVX?_MPB@_t57Q)FgV6g zXH^^U;t)WqC-uX7sFKDv>LGLlIX~4)D!80PIpt{_0;%4A=wcEdQ>=N?P{blgZz3Me zc)DgJt6Yo=#Gp$+<+vPp3H6(RPizELM&Q8h?*rx$IPgifPv9Nb5?SDOYMg}Vz+EI) zLUiD>^Uzv3X&bnY>iU)ZPmgH%xdT5dh37@i=L9PFi&`QJ{V36u{4YtDlK&OU6rO)k zw#k8S>3E?hF_8e?U8Q{iOz*QU05#Q1ZA$gN%Oi6QDBW9`a5I5K<s2|@oP8Gv9M|;& z$J=uNNw`elP*%v9jL2#6z<hU*PqN8C737n7ET|waVqt!fR?4TlD#$OemqLvS@=E(= zAS%c&wtoSnQ0mOL+kvPcU(6*HQnJh)<X77-gKZw#N-Y^cqSJW4km_9knEga5(rA^N zwgr9yYlAK!eNsaH)E?ZRi^&2hrU8eFzXo9dDP$@Ldx(_+;sYX5c2=G}nDiG=QoTg? zC1;&JoKiSS)m<fLrbOi=iJz>%SE$FKnpH~)Ucj5rgOpTnIqtkCrg<TaZ=X_srh0Qh z5Z3Tj%(_am{wRtyjm+UqcN(qTRGnLX&UJo8b*N3-bscLsFw2{@@hwm=hOo2TG|7Os zE&`}T+(vcK-nM?2%D8osNBc5-D&KSXemdU^RJ|t-p`KX2Z#1f^$?=sCU=IJR*PNl5 z^=Gm}hECQS)G`@5S$`v~GIX;3PF4Nz35mnbpYJ!}-km05mhZPO-v<KAx9hi1y98cL zu*kQsAXwzvR}!2ll{4*SDFbzd<*v#rT$QgPH>%1j3GOS6v>Qk<8?nM}>^VrwS>=+m z+BxdBuOV0tXzXhVRx+<+nPT)Bf~E2HT7o4n+1C^77oK$lXA9g!aE`z?Yy~_<;2Q}Z zD{u=<Te$+a5}YsaO#~MTd^5oTf!7mUA#j-B8i6C!u6Y7~pWu4shYjiQ;Rt$tv%-GT zvlEWsF>XJ_TO5V#V8ok+_W>;XX+|XF*zJr+%CUEP_}DCK$x=Mt;=PY#9Qzp-EE&h% z%{v^)I0}(HmO=`%@ZywZKkFekl!!HZxK03JlnDz*qQJ6iQm7sFDW|}RwS*FMnyX0Q z*(uar8YY*IVxCJ<2p+xKvga@a*%SsM`v|91dpXIbdEGu@(-fP7h8^J~EAl>Nwj8!s zV3GYfTV;)5ML)8C3^8L@TK119J&hA0DOVtmE74ob3v;^*Hs#c&;v}a{#k`vk`K7$) z5%|0$;vOAB&z#RJqZeCtfaQ!Iy~469rF=d>*&NYej3D?$V;0x3*FlD~Da)lZi+5Ti za3Bj5jf0YiTi{ceL*P>x9xupf7t<K7OnPa+ir)PkIQDUBDO@A_bFpAQpQmZq>9OZ{ zpDf~^cfo&TQ9^&w!`^_!FLB7Q3tnX+#u2$bshnn-q&%D~u>S>Dpy`#Qa+=YVtzV0+ zb*Lg%2|>d&%toUP-+CyqDJ{9I<xZo8anX`Xr;Q3^En?Rq3g@I9rUv7}wunO{k1X=^ z=jlJ`O>GPaTzWc{+B<lN6NovBFMIO@zhzB8_wVrXK@+GGr3h0=on@V2S9j&aPsB6q zpq+b$J%etQ_BobyCQ<FtUC1-~3S&UgWpAD_1fuKmh=D-5Ce)qoM$cM^(y?7AvCwta zLX?g(Xg<;G@kaXDgumq1(G~7O{*j&)7#7KOCM>sTLB<zW9(;9&5yHO6RaM{u#ba?* zg9RaIvM$0~;ntau0iSpp$Qhoi@d!kh601SNWI(Ey8YZs4Ek*PFK>_yW?+=AT5E{3o z@X7@ADO3iW`^<$?vZG7NZ%_Gd{0>w9T&iT>!70qM$zlgy3ay1qzbl0-@N9CvhHx*; zM!VcSJ_F_G?f#$JvrQZT&K;LyTmAc-Vb{2sXD5Ab2hZ@VvRp*ZDzA+gHeTEg9oIuI zyvW>k5Fgc!>;6Qp;|Fz{!NpI-yvm6ijRiN_)B*~!%dxE_CvHsAPMolaFgh)!YwChV z;I}3bU-G8*r`MgeupTZ}Ne3~9Y;b!LKbipdSqt6R)MXk=-n0!hS6&TgCJphh;OG`r z591cO+AZN>n*BPOwN#iqYh3R52k3VgI-Ji&Vvw=QXeAFZABUZhOYVH-M9PWj!%iyu z;F#D^PJtbzVdBX!&F+NBj0&e~SA(_qe)6MVC6RS}ULl^fEc)^!UH0a)Mo9mzOV<5c z$OShfQwcju6DUP?OQKS`+6w7z-^kAmk~eKZ|6w|B=3{p%ISb1O7lst*VASy~$rKda z3nr8BlWEi~AFeaW_me3JNv0B*WINI9TjcU2C6Lvq8a2cmM~?#UW-hMA5TZPrhmn`m z4gUqrbOwdX4iOO@D8|XN-5L@5))5ieb(6K$8rrSUKZr7yx4^M+BbZEeLX5Vb137Jk z7;LILyiR`xz{LHD|HM{84zPbpce?h-2fA`8Cil|$D=}DqO0yze=h4mnDfJv(rJ?1( zboP_NpLK$sj~=^^=5xA?#ZND?tk*_xM0?h{=+u&rm>%@3bJ1S|y+7<CpIl8ocaPvo zBrYSFB#cv>4K4{Ef_@&;X;!d`#2{D!dQ?Y4I8PfSRR#ShnVnS?Oxk?eo8N-G3B0r% z#Y;;fPr#CIl$>V)lbOJ&Z`4vxK&_dlYmi-MXnn&v(KkIu>l+rOZ&-{zr~b+5J0(ir zDcm|5)K3|Gr$p&H#ps)WZ)aGxQ$L|TY8qxB$Db)t`kpiTKEP^B{FxG^FU9B+e>(Li zP$Z@raWcTYvT}!5!MpOxn6wDqjSu?>H^YhI(S(q7xn-?_DYSrCL%rnjj(18aV1CM_ zGq|+U9g5UQBZorq3FZuX*1F`M3i&S^`A#SjKWSS7%g!Y8>^##lLI<VNojT@1gr+zu zFUnE!1`qLwqn!F@t+MP1rrqL)i8k%3=o0*l82ro_{4859XoNrC_&MMRnIdOiAe7NE zSYKu(dyD-s7I)KLRAnY$Ccr7=@O9nHu)sPov5d`j-sta?(cLYBms2;Rf-EW@W&<y9 z8;2(geAy4%Cu^82(%v#s_kM@ez27CZm)le)c52{`qmYi$q)pq_IR!L14aBCDeMQAi z_(d}no(xmn$uNEIWSD+)GEA?X4AZ|(hUrwiR&_!b;D5E8n5q6`m^PdY(<3Lt^p}%i z`ub#;hG1WLLKmEOGE7&V4AaJwVS4ODObv+ZcM>zvO6r{G7*59j@%+vvk~n;|F%c7q zn-ndsDlw<SMB>&aW=de)&k}P+i+esX6NxK|<~-Ut=NZwQex&~dZXucZ4kt|~`OJy6 zlsA5wS(k#OS5Aq~mM1ox11;+|^=WTD8>bbeyuNvoPR{5m#q#FKhXuwek<JoLWnLCO zrPqOGHQrNkAAl{>3AWp5F@B)~66Bl%AnWlp8rshfEyeor*)56`HMRCbIi<(X?MkO{ zx1k5&nxs`0CQCED(`rjK^+jzTiTqm0wKqSH{l7HzMR!wQ)J;8)IBipzoBEO#brBc7 zLRNY<1$e$W74pt!_xwp4fBwQHmi=dqnWoTc;~i;=$9tNq`#}Fj(KiLqw;t~pr=7F{ zpb(G)j<tX*dEF4_^$TH$c>SQ`bq2|3$LoU_#eR$oXRp5>XDUV1_fQV6lQJ`RE2pyo zrd`DRxMIdW)iBG-m)1^tl~e7}UM3rUruOaj<{=ZY%0c&6%ez7-lU0qwAB&G(R)=-Y zEDxQy${MAHVUl~+{945BY=c+Ov8DU6FY#PG!Lnuy$I@iQi~+PjnTFr{kjpgdS#-<o zU?b;~+p#!Y;dI(Tl>XY3M$>n9LVvRp`WKzhd%!KC-Ek`ERW!A9oD}8MTh&6(-hA^J z;?zkoPMyT(qtsY&;$(JIyptw-ehmF5;iM;&nY3Mtc2c)`%X-sYYER_w_B;L}mg6U8 z8G^=8vsnjAu>;XUO5!*?-WWZXCuA}4N~T2XAPH9GUOi&qGWjMJt<2wquxanAqG_LK z;Ftoc4gg3!M)$U0Dx#FGU~dIjmBTay^6OkkLMNUDp%Ycnv_cI`)4)sx1Q#fPQ_#KG zLpZhKn2j7>yjN4z$x5R|i_9ier*?COaV;{9V~8mcLyVk#N)GptOHP!sk2_Ho#nc;a zNTe{%qF7Z{B|W{-*KZYIZ}uTaOxvo8s(uY1^%&jTg1Zzk_<{yr*TDM<U>|=0lY&Qd z(J=)~)~ZfJ?Cf+~9kr7zLFr#r=~`EYBs#To9qvIotZ>FT38W&Gd9Y%r?CDBlPnf1{ zr>2ckMOCK)NIgdPw&0nH7%bF4xdv(!z)fp|gkYU6x=H~Bx@nie665%5*(^M8aM2Q& z+Ny+*i~+VtvN!(<>Zbir6;1oK0;=u-ka~>nZEiTYO)&&_Yv3gfys3dh3gCwP1oz<Q ziekEkoIDdH;%F!IiM}iW{l7q8FLWF>u1j?qPbDPfdNjzmhYl32N_s%0FFtPrVsGw` zjqS9ls%YAU3Yd8@fTT??U2D8beMo}okTIBoBl}@JkS7_)q$fLhv&cJG{{;2pi-%}Q z$Jb$>eA=5!u{xPBAE$W_rI^P%I5&Mr9+-lQPOKj02d`9x4(T6`dD8J4e*8+MQ|M;@ z#yr_Lm+>u(<H?0aX<_8q<fW6`M~t4SbT0q96gjSK+P)60gRDnW^fF^~2y^{oj7rf~ zQ?-y;A5WoYU&))+>$=+vgH(7T2H$REOZo3(@Fxu(KhM3L@*AwBrqN=6u4%j;AV4n( zOgB9${hzXF-xKRnd9L$QH*Goq)RJ?8AHp$W!n?-A3U_dj3j2eUQxQKVAWVn^sFcGa zdDF)2>x^O*A57$U0Go+#dX_L5;t)WIk}ef5h%Hv>#>kj8#Iha|rr2qKC+rKMHFeWV zPprE=8RvUg(Vbz>PTBMTxdA~Nb%6U9IOz)(<vOq+A(X2tPu=ttDw$^j*IR{?vj=$n z*}13j<143C^yF(K?4w~3GcmExNesEdbqYr<Ete{eBNDar&Q9feywgv<rKIo4PV~V6 za(xDOfJZKB6pgHejq3b(krWM=YMnQXn5LbGiTe4D&J4i5qvStp{q~d5mx3XYu))w* zb@KXpF2=cDVo{ERiRq#fF_EW2!W8FDXUKsmYDB3(l41VmGCj<zQgv243p->tcDfst zoDfW1pd!KS-n7D-3-wdr&r{_=8Xk~M4K-Ny7pY%zGDJc!fpi+$IR-UgAtwdL17#?= zLYF`U%ue2f9E?GegdfL(zuj%Fk=oh_i(JDpr6w;);!Hgq?9hNb_Tv~+H+N#{U$jAJ zL$s;=Aj_rj|H@Q$H!S=$#LEL`s|!t!{MgZW5nmUuR<Z%`5nAk+Mt=C7l#mYq$))_` zcA>1>%II|yef3j-{cdWvsTh?JRW_|j1C0tWf;Yev_#tJ}A<k>G>*h3f1gLB8uG@7L z#7es!NKM?XY2e_#r*;`N@;*U=jLOfz5;tN)>Wlv;jp#fjjw<HH$LIOzSWTe`2uXjo z%l(*rVyA$MM4F39*4C!mdHkP<=|ObJ_my31Tq&IL`F%|1lMy47Jo_)jpJ=|~xiWh2 z#k7NV0rGB!5lWVxisd9Cqx0s_KK}w{nt_!mC)B^wL_Lf4o++EQPy|IuT*%BEw}#%1 z<~E5Y`y7?(OozRJLc{qnkO!3n4pR8va7N8`Wc`~Wvvcdo&tC`=V%||hl6sVK3`fz) z&-0m{Ad0aT`yct4TzCr$JqZ_*1=~8aAZ|hOmT-3N01}sXUMB+}af8$X%q25s7*KDP zDVbis<5cRAWkPpVmf?}O56Qayomuxk8lInYqTd7<8QJIj69hel$7p7XABNXR<@j`x z*qbrKFgBgseIirHMQ{ISDx)4AQ+tyFCulD*<(!C#RzK5)DYo%W3=q@G6ETsxJ5QvJ z8oo2JBxIpjKOT$~=a@v=Qp!%?0n%0~OtFpQnKHq^k8|@CCsIPr`9WeOj=9A2XeUf& zrlmF|O54ske41J%beV=DYpfk#GaE)T6e&4c@!Q9NsdG{1f46-!t2(_{xkZ`rhfd5e z<Fn@#mh}jjdD(^?I=nCMpSreUbaws+=81kej_B_upp&<{T#(pfMlmssIT@xIC&P60 z$uQj!%j84>ZKd9n;so*N@zR!=_q^Y|U8Y7I7cpJ<Twxe?*wJ${v1H@%U7~P`a!%RF zFfBV7rVX)7PP@sPUw2+i!}J{~7PqAEjvqndo^hhG1I<=PrHcEpFgbWK9%!N22^~y( z$CGsM0ukf3Alk*G>zCi5i}uAQp^L;E`3^C3xNs6;$i@9GOx)onH$*M9$m_GEM!c`0 zr|H<de0?X1q9W_w6ERUv+?Ut@Cv=GE;}bDa<9lPPcEV^ss}m;UA?Iz#YOwN)%gI&^ zWnFuBl6?#``Yyw6eoy%{MW)TXh8Gz4S$;cN=+C;o*|C?u1wR_^Gw<W~n@7{Tl>1rW zC>Hn!t|;(xF8F!Z7cu@QU&J6OA12Ya)ASb^9#7sm2)15Zp-p-`nO@_fubOO2rU##7 z{uBHfu9)^j@>XN=c82LIB~P*#vEeCxsdx635GjNM^7^g%8pvPO%eW)i_zuzEYlha} zk?g=9GAr3~*x2%s%a)H^wtVb@Kj9zkU`HKcb~5o()->A#O=8vvnS_*CBh{3IuZDx8 zJAE@>y0I|XZUu$>Q0UTK$gLEg6tbP<+^PKHF>5YnW>Hnb3<Ar~i;O4k*~!uscwB`( z_<{M(1ED|YLwArj4_qkc=s)P9Uxvns7z#Faq5h$ZckK49UGyoD;J3x#x5waj7`%{# z;1>s}(Mg-`Su6ORT}X4%rn}aPyt}&Sm*55eFJmvA%sZHr{>Xfz<19Geh0()<ADi!n z2=nGH`sD|~f6^uTUBbJ&P|(pO<!v$eJ*FvA{?i!zXI=EW{!)H#O!<8Vub^S<zU(6J z!C6=cZB+DWEgD#@fh8JPpa85w@sMb<!e%}I0B*fL_=utepVGj74g5(1e^WpiebY=| zc?z({B#*)4nQ1>zWz$+TaGe5*bQQ|hW>z~jNs|q*>Cl?nlhuiM?8NDzWAy0ncp#%Y ztIG9C+GnsO_(>vz$7_R+B)#?j&S2w=$ybOou7_Dsjx~1nPj0RLf9BZ9x_2sJ=Yz0= zI*uR8I;#n1h9jmIPsFqeO!mx#lA?Os5qm3Yj7VI=VWQWSE0`(B=Ri>luBffh0}!`N ziK7#v=(P};_g{&X!MvzvJ;b`FQ`Y272iLfcp7w(IZKKsWGm860MmLOU7?sGsG;+@8 z;)H8Le#GR|lULDA50V#`sLGx8AiWs4QJCC<X4tMb^G3nbPY4g?4tNF605N2-x{LmD z2z_DdWn-?>Wcp4AI*XPd?#rI${q1bay7(+i&(lWZM%T0<8pzN<cLi`Rt1bo>oUTam zk2jx8uCIZV&L3|&xg$+9TDPM@@KPnwET;~@ee(3<UX)iap>pF}+SvUbWC|v4g+qT2 zm0oAMD;yn1Bwgu}LA<GGe<y>0-i`5dF;44Waz_?DUp<FQ@H8Z@B$%*--Uw-wlB6~5 zWOst9w+n+42+m15>5N*U!W$LthXCYDyVBeJVmSZg9{})}VPo3Y;HVp4Iy;1xS{1Yi zbYJ#z@4h*Z{Gy^?{0x9;k1K52LmIeO19xg5q5zo)-%wcf2LR3{4Vz$a@SlpDp!4se z@+7Rf_==CWtds-P<nM?#6EyTP$(LY;AMvIIw->|A=%jcs2=%_H*biZI&Lv!t)<hI^ zbmks^4naAmQW%jF9RU=sS1_H!)o7tt84Yr_J2>em=5CRcyy=KL`sm^O?~M-R06Wi7 zM1==BE2J3wR0=5uomyme*E!t2D6=WWk7c@RG?7Nv(F<vuX6hy=yu7nQ`VQbaQ|S1C zoMK#0asMk}I@w_{NyUnF9(FHuT{l-R7BAx;uO!;kMfl$5Jg-{jULQY{uJq=j+II{k z$HpK!?lLeVuDV=r(Fht!AwoHShPRuQPLx5;P;LM_SS6Ly+==lvNC!CChRY6n^Dl$? za}|Bs1Pz>~03J^>F962t$!bLo&eOmW1sHcAqWS7}DMr*asx)q0bTxR4_i5%H3U-Nj zhyD{Z;e4il$Aco;Sznf*GSOR3RGC6@voK)^>I6sJ?7dGkxPrr2Pjl->@rvT+)?V<m z>5xQUx}<saG-1NPcZ`vFmDAX-=2=!Dx!3+1Klw$ctc%9CsP~foW;PfYIn2L>K5>=N z4+7{*?fEP_$@^=lzW5Q8O}k$+Bxdd9{YyNn>Hi~2^ttnJ09>~mkNW$Y;ZUH}ZgVH0 zzW^BqZk;fl82%XPiKh*fM)O=jL+_nmDzy^z3MG{va527sbPvBMuxSfEDtQ%I!^37a zGK`5#k_QW1vYZ}>I+gku=KfU_(^i%3!?fmvZSN&WfWkoiXaa?jZP)p%g@Vn{DYuPK zbV~S9iH~ynxm*~;n-1wtEs{1{YT+xoZvCf0|8-J=rjvmwJyzUcd7QfBoHpi&%D7R> zX==seA|<L7WuU*9fPNY1|DAxo0`%h!-Gsmmpc@zb5Xdx~Oht773{UEIe;1koC(!#@ z<QvyxEvGj5sFrI7ldrcXWIH80A@_EX>ydX(X=i}1nZV1go;G&StBvnP@zYDJ>Wh+W zKuyY~M|n|<H^tVk#p)OjDN{DJ2;@!P^c8v{aT}?dd*XZpZDdK*&4!at^-{fGV7Gjx zh0EULg&F4hRzddWhFUqB+2qw{GiTwn>Naom$;|DhHm8kSp>`CBuz%?N0w0*24cu22 zNCP2PGR6I-u5rt|aN{$^bjQ6EgKsGM8drBxe5F7jdeFm9(;Z(+cuyn)=%RxzI0P?& zVt;A$eFc4Zty8(m8KV>?@gcI!t3m`GO%x{<Z%FJPY=u6@kdr6&re96l1#|eYHO(p{ z!|i^a10Xr_x<3MR4iyc0fPOSyz+VzLm#C*)?4e(F#6*G0&v?I|;jWB)imyc;OroC! zN&74lH~NWWxp5rKBZgDyW)V)m0>Zz1CqI9O;f0^6EvFKCtKC(?mGQ&n^hv)K;wq9# zv#5kNpso_GG~`PDN+?aE{F7!2S+O;whRGDKQiH<~O~(ribnAPJ&g|&-1Jd}nF<4gL zVw<Qmt1?x7uWn2?@N;>_Dn8q!9jN@$8XwMyyscETic0uKC24e4mq!2iLH`09se(#8 zQJPT;)>Q8md|!ck_gO~EBz{qirc*JU0zz56gS60+P^=c;@Q;Z;O+^0PIL9d8H4mdE zMR^+k#DK8#?^}JS*_FRC9+P8Uq$pNu%_F7KlQbjKm#M`X_5@2BdMUvZbcvYgc^rey zs?@|ZhPY0umjp4Gv4<T=OA@h}eq3FO`~y71a+?vro}_GGar9-Jp89ht<7I*fyOV`c zb`@c)lAXroJp=r`cKYs)l=G1%x4`#H^2>2k!Vul)_m{9g>VC6FdEU32IO%13kwKE> zKe(_Ce;5AJH@(&F@)8$iJjI@+7x|@#`$uZc<XW^7a}|kiXHrkoJMT`3OJBybER^1f zcFNs-MjcNt14{^#wzR3ZNgoY<ki18$1!)Xfq~o9}h05q*kyECI)H)tg^!6i<G*-M& zB&Pp_%q^xOzWogtd`Rz3a&yw(qjGxXk2_9&N1ysZtfxAnWN;a~WCL;1FQiF7BUmkq znnamgn#4ate?QR|(9Qn?{zn@0G?PUtlP_YE=@lw=p8V(`$5GF&HZ9w@k;0r&CQZLW zQN=Wt&TZ)V1hpZLiuuNa?R=2Z&H@dsB|@tAa@?7J*v17Q)1joOWuos5a`qA;@{NNb z)w>de?({>u6nmEMb2=?cqn`yABbZBy{!P0Or%0(Pqx43*1mSN&2It>e6nVq$q~jy8 zLeftar5`fS%J><#n$Cip4i^{7c*{?r4Zrk*v}-9Tqy2drJ&{UdWh6^9iqzX#D(wXw zsbcHkb_y`s_Nh=ntJ9nz+51oA<vXdEZ`5>2q~u=smo}*j09hFiq*5WR(WTX#;@QN( z*N_fcushmCht!lOT(m-VwX64Mq`3#??liu!W~G!K_^>;MOtop<>I?v}rMH)74q9}I z*_`^Rmg<35Y27Kc{st{V9r7DmbxOZ*?+$r@mYYK0hV<rXiq;cpj<Df>rS+n;nc5?v zO~y-Kkl_o(T+cTiS`^8Up(HB5zWPl!fK=5Q@&b<#TFHo7Bn2!2u4K9FP|NOR4^QjU zJt=KqS}(hImvpQMJlR(F?o&X*e!IVwly*+{N!`m3t;ve+#k$G|7W5Z=P*ImYc2ZjR z?!;*W_4YK?^1;?sp($m32<@hX0>!u(VbMpAKB!TUh1}H79+_3vhoq#XaFH+Bb|k0c zA4R1N>S<ZMv}JgtZQD|z&k$4?4-I`YTvhrx#^CpFfOw@rWJ-pE;ukATBT`6xmMT+L z4<N&cKCq8V_@Fb`##2VXucs<SsL;K8&+a|ClZL@8GzBVIsNdnqPeBK{bO0TyO5syS z!Z6i-uAiM8<>=uVQRoOL^Rly;dE_{hl4kO#pL-@JMcU84KMe?%QxA-q=t4#VAvZDG z7$v6r$Se^uRte#*AE$&cGQPWw-~AhBpPMCNBZ?=o-|`IEWzXr3i4=Z?nRiZQ<_V6S z9)#q?@QpSi^^U1oc`)^i@7-uyp3F^Cu|_@95m44AO2k=C8%RXH(>_Aa?rv9SP<NgK z(UuX7_$47!P#^`QaI&b+<FK6Kc#Q;|>q22qp-T<WB3%>5a4vgLQp~}MPA_rX8)bi~ zaseDmdd^dN6negrrqBR22gfR>*m>-Qn(nhX1g51}d0hPhcL~1C<0y@B+jP|c?#~My zglxFTg`x=+B(oBVwYC|gZ4jcqa-6cmbZ8YDf=a=O%A#rl@SQBiQ80^oHLnl%YK_yY z5^}S<+teo)lN4+nl^qCA(l*C2>)b3#B6FQ`AzbPvc%bYucQ6)k$jvjP?#t3BaD_bI zAv?qchRCrjoC_h>svT!h@Q=)z$d=RzN*PCLTh=0}ODOSBvo1H{z$K)5H;HVa%&jgY zX1;8zT7wY6SF(joY@0&NhhITK^@)la#EzLSsi?7Lhf#yS#K@-WWHkh}2HxkZiorIG z-9xf)*;eo#2Jlv+`Xmj(HjRC#s9@A!FPAC7HjNEbR4{7LZF4ZrE83JRjE1U>3VgyL zX*=F@NZO8BMq|}-1!|49Ri*gNN4&b3S{-j^z-U`D<JHa7>Vihy%y@M(jUEN~)u-+T zkCkhj&ns(`6HP1px8f&S7o|zN*0w4%c&;iUHVu~>!zvaiP#cJv8ob$6Q^V#5RILgP zZg#P0*zszGveJBPQS6hkETRjct-&fql8DvVGKW!v^#3`fZcu~QM%9&K=dP9RRmu@^ z8k}fkRcKJ#V_UN|sEv_O*O*ogr)kh_M|=cpJN{+tn4v+f$zyG*(y-P;T4%IrY`(F0 zh6d{ti7IPYTVz`^H0U;NM%?hy#&t9DD>bN9lOdJH5G~fWDmCcVP}!-5u|`9U2HhHJ z5@@JNq@ku$4TFt_*&1|fn4Lhw>_i%7$7yI%l5aB_sx|nCAq6$~RgwfD5`_l8Q6!0S zjd`$-q6>@yICrh_dyaSw9y8+SXiy83NY$7lo=+GZ;aD~)8D;9Tx3$S?kRRi`-S*~Z zd-F%M%}`~Rs?Q|LJEE;cAup;=TaGN<vQt#iV8c?a!Ig$orNMQERINcrc3gVavdf)X zixqggLvmX~@O#RMJq=4-hDujmQDwTMT7!2O(o7BhNRgyFHI|wxiW79F4@*e8MyXFq z%o;vj(J*E;c%~vHSy$O@8Ywo!HFjH>LN0eIYw&qPs(M?4#<Dn%Mik3t&1zL?@Bu@r z)ZoL0RH4Dg6)DMDv99eYg*Y};Y8(FM<`Zu?_wVwLZZ|THZuJ^tM&()swir@e-|GH( zTJ@U8DvKN8>B>WS##7ZA{Fx!m)!_Y#B>k_kKRb+0%LIxSAJpRSGqo<&pcW{@S!0fP zelp-z5ifp*7XK3?zDk2yU<S=FYDicFtKZOW(+rNrxUh-WSgAGMZ8Xl*pcY6PD_t5Z zJJ%SO5#u%1XpO%x8ZXnJ)<`a_NzkCn-0mYdU&)wkWL0SJ9z&X=#X6peORWbL_eZ8y zwFZwXl7vmH1-jy=reaWo?uzjX3|;YaQ*nj{zci#84Z3B;uLtCxjNquJi<pO%ng$0e zQex|M#a^ajP=oG@@z(2#eN4p}8q6@H8V$N-#ar)J6~>r~)f$|vNQtf274uBRpa$I) z<E_^f&oC8dXwY3T-qb=>VV0>_t-<a%yQ3?ysk-7NreaWo^q=VH!UUwj-HJrAf^8bp z8WPM@@#1G_@y{6Xb2X?1lK2@3#Pjn^F-q?7;w!cIoksi|4Z6iwCJ-Mt_%2s6t~9bL zG`Pc%s<c?g4RQHR+qquV>L&kyh8oePY4;e3!B~lIc6aj$mjA_r12Wak7-AZ%=_<^& zb*Tm~Q6vcljdj6+3SD5-U^hh)MvaY8XAfYM8qPi5j-a+f{&N;>Jy)rJU5n!!Wk`~R zw_`NIr`Qllj2hOenNcI!4q}YG;tiRh4Y^492(q@V(@2#fdaRJ8VJ)8-V-;MiDl9P` zuh5|UmmhNEWx7q5n@*_E;D_BrB)DQ51X8TJ;Y!U+BWSLceZUBs`<4PzOjpj;pw^K} zu1+21)wphCf<^afN+<o#X}WA{j@BvvEtp9fyh(A<GE~D!#*R4})OwX2Jv8pv5jOzk zpF-hm(bzFF-j12yWruC-n5jXnSJ{!SamS9h)k1v#R>gN_RlK0ML~x#RY^uv;8a~A| zvO+hq(Z!}=-CCR&XlLK)V$<-0jx-JGxTAiGwUubn*Uo*n@*VxxZMu@Ib=}%D@~Uxc zwFcjH^GOxwp5H^@0`&=D-P<&Bz9J%dX>g{S&k-ZgSE}%9hpAheM!Mip5nT|bK|EyP zi(4>8A?LV>QtsS$tHON_Q?E9SysC)Mputbvd|xRfRi#U)?G@+UTvb?Oa%!~(R~S;2 z1{)Mf^0CIAaTp!b1&S9R)Z$l~T5~k01(Nt+o5rp)j6n_FYDjZ5*k(vU4LWwk4QXxH zBvWgK2DN>*Rii;|3E4Hn*!6&^Tcbg(5yw|GCw4`pmS1lq&CsfDc1XH~S_$^l8hlJ~ zkzti>8gs0OpO>_JEflXs#>K=hmDER#4HX*vF3~S3_K!`qY7GwZi8pXKt-+y+B%!3S zW`|LO;V4FpJ?}8aI$GOtz}OMg;1E-5t_HPci8+m}cNjIOH4CH096REch1!l!jU6*I z*wcugsX;A>#K*6!<7HK9S%ZzNIU3ZhAX$}d8oSA1)Yi8-qz4ta%OPoSuOf*!jcJ21 zE64W0Bvqlp$cj6^(9Q1cuxRiULz<~gpW%>Vb?K&P`x6DUZpa=Zrb2_?(TbN8_eZ8y zwFX;z>3E*2!J8C`oK)SWv6XnGg{}mv8!i4FBR;6XW+Q%%2DLyEA50)Vt`D?$Z8EZk z25&IpXKK(bentZEachy+mDSp0Jc!VsHW`7TLAUsmvi`j|-~XRl|Cth>nXbF1LW51l zIaM0e*3()?m5ws~TBSj!tK)*bNpat5YE^5ny^pqFrUrK^l0=fmdiOPq0yuXq{w5<n zs6kyz!p5m0&|Rv+4pXs0gHIc~sx+u&!40v3{K~j7#>k)sbNUJMN!6O6YaLU9$nF_! z8uJ-hGc>5h3*(9Hs!XJz(r8FB8Y(r|Rgsdc(6wzEajT7gJfz(*!?>eTgR>MV$y#Z* zX=IDT_lN>Na!8*lu%Ba_1_wB{UDKu!Z5z&(WBs8UU!+9RdRxO<4H8AXq#3c2a+T&Y zj8WAZ#9LN;N&I$Jak8lx)Zl%FG)IF!S0ssFjcE-DrXFoqnUOU^gKdU1Q-fNdM32TC z@o{M{UVNn%f431|r9mx_#8<Xy%n={AG0Rsnv`3ItHK;v;HfvA|JZa}#t;GLCeNx5h zwhtAi?GkEizs1(YF<WfK1SfCtwW{K4#knEA)|~iSaWh`Jin}4|6VB7%&kbp=1|L); zah}GWbQm?bGm0_REm~==saUPS`wi(*Eq;eXiWM|g6-_rRGh<oKP(_7?r9y)xiiADh zx;Bmc((qlT4QO{rvC?%dZ2;v44c}|3#d%$`)EJhT8oX4IlB}!ewQ1z14qvPVT9jtR zZeh9NzQNS0(BM6W6c;})siMCbmY@cg;bk(quprZ5gCa>JXspFy)L=M@QRF!HE~?b0 zKFNO?zQPEb=~NIXDW+P2_jfdl)_|#0gG-FyIoj|W9a5|=ZBB+^sV-LFbcdwDDnkl( zCTP52snXy?MM|<7>f1E3*x`#6HAEHV7?z4T3aoWVv9&g;qDKu&wFX}^q$&+QNbkqt zN}SoWtZk-Zr3PoIiij2s&T+}AY}45H9Yzgqiel85HYLG^V29Gb%h*w&L0v21N$`Hf zKik-FsW$5thZJu>+~N64O3)>y)@54IMu!wHDDJRW`~9G4N!$>PWueic*{h7QnOc97 zLyFfQH>R|pE~ZwM274+J!gF4mMk*b?c!gE*3gcR{MG1J(2&&fLVWV)<wzV4hLJ<=O zq?Y!)krvdT7J$WQs7)hoY4K0<EcF8CB=w2oLJel)`y6y37&UmVA<fj_Wcj+58a*2O zx1yr123v=UIBAu}-Ww)VFlz9*Y&WCE4k;=aHTX>wqsCs%F%mU+SdkJtRJ&k`aY0an zPQ^_JpI9eyU3XQX)Kr|I!HtGAQ-c?(mL}s7#}n%`_C3@7nHv1<NZo#7)Y$uqie;1r zUDkooWtV`;gki>%N)2k0Fq>#l+e0p@Y}1%F35*)l_6VcKUN+WMX)xP3o&H;f#vGeT zPiHnSGd9;~@T*gV8IScesDq76scF;L2d4io)u3Bx{L6H@|FtH(52-<S#rSvR2B^`X zhXQ4(A%n!sE7d2$^*8??b?+S*Rhj+&-{e9VKm#Hw_K2d05~@g5dJ822VuIip(k0Dg zLTJ)e>|jA$6;M%EMa30Y1iP++sEfU=Wfc+YD#|Xp>i*7op7)tKoXmXp^ZEXM|NO3I z?!B*h-}9X3JoT2j!1E{LIha<3Qoj#tK2ky{rOQkzuw;apjoAf=mH143*C%-TD<Kt; zxJvi%WK*KqESMkk?$GUsH3B4{5e~2WMu;?NvLc((p5s;oNUJ8TY)X@kYXwNdCar8r ztBz|0NN7kan-ZnCR)7>^A}5K+_^pKqqBI9O&6Q1Q3)F5OPqf=;yxpE9n^JIID0_#* ztK&r36nDJvzqyhg%seWIFZ9B9@l0wHD`i`17NtQ-+50H&^+ef}YUhQrC*HG3*;a0o zN$d6oL~vug>E_C&_(@67zjYwBK$7ybasR+to5*Gue=3oPY)aiEb6X!<AbXSI<IrT; zl#1zvvUe>;C+c2hQ@KqR#qDc5c&Gf~vUe*e9WI+He{^_~{1LVJlV&PCi+-p=m}HF{ zpnnlZ_M{!^BZNsF{SmU)19d?kAxveR(vUp~fj&Z*G-02H>`5!uM+lRK?2nK=Y0LTu zVX6X>S2lL9qE5V@s2j2=8K9(SC=!=d0TE47Ktxj|A{OZh;jA^*po7+)gQ?6(DUyT# z|E;`Iv2H_CN)NiNk!^_=wU1FJ`Y24onviVH1)@s=3)aZa!h}vXhhVnBDaiJ?_zYyS zY}NxgbFy=BLMNN+wN7@Vc945D=)&*Cnv;DT+fp}~+0uOxp1%>#L8D9KB9UC^YHyR( z-`V8#ch(IV=(}P{LY3@~k1Z%}G*QWwIg3nGyf8^GLWfJ8zbZZlXQN5lHc^R@49DKC zb#r7Rho;Jbe~*u$Q|(bUb94dJW`mIAVcD_%ctUHic@Ng))b7U?$lluH;=)I<`3%-x zD0@=r$)XJjAsY`uHUlRe=}Bj->GF+io*qZh^$5<NuqKskJ|0KW>B!5xcs6sBWRqqw z^O2Y9<Jrtjl1&m?ZzTnZQ!6(qy1q$|qv&6Bi)5X+Ce;Bd@~I?Z(+Ak9#AONme@$5q zP(}IQY$i|nSqzjf#wSmWn(^xx{y&OO15!$)`_nD97wWgPc>SGpI@03xcQ!vip(AS+ zZ!eA9_#R&!bh1B~&i7?=Z+AfxW%HmO9{Cez*_+ufE|kr=Kwc<&3;M@}ek1WIeq_e| zm?WDmkSH}4*_4#oJpHl~f`s|03B!KtRG94%H=iq;-A?rq>evTl`^^nl6S@mQ*clJT z<jy_4s`9k>fg^kQ&1-wd(JpMZ>JvxjV{=CW9njZ*`x@4iV&h;nx?<I$lRv6A)=BP` zjzmUt6B(Ax4^Ht%)8)aZ=h-YfXfy4g&9;L!;||)aJ1Ci7gUmZ<v+tk{fP>!U#HZx% zH{_4cgk@W0a8siUve4#_nPjg9rOQmVJE5e>lTGtvr#~PIlZ0W@yd+`RG%raQHqA>C zhE4M%3_qeNxx{7XU-2fFE1NygxSZ}Z>{M%bA$Bg(FcDI}bru3zmZ&(@o&8t0VolZU z#;zXSi#4I$*xZ*u66aUrjVD(&KZv6V(tNwe+j*{aN=o}vv{jC|Z10Y<Zfj&)YBgO9 zkWFdRe5h=Te<YJlY3D2x$E0eIOg5$MvrM+75|B(br9WVqY`+-qBcie?9RkZ_Tj~T^ zlTGO)SSH(j;}sz)o6-lfOe&Fdjm&It`ylRTV4X~J5BdxVI%^sSd$I)fig+EEEHy;} zOg)^$RT3m5G5k}aPvw7;nimNYsbo`H7JDK6t28WTx0sHWS>w1)P8KkqX5v$VQyj0H zje29LoXM(=9L^rdc2V3^u53!RqN{_lDUskKWm~Eh$z)S%70YB>B1baWl<LAV*_P~+ zOg8_wRp&Ew64LXsd3v9TTcm%a3f%j2kHkSjwJ0JfDpk#oi;sm-slKZcwOls8ila%L z(4R@CN4N3|fTZ3NN|dSJ8Ux>DSfmGFWK#_w8ygKE)W2?=C$(A1+(9Wismu;aK^34n zJ19H#@xI_J*_0SLom6zG<PJ(rS0m}h_z=<-!E?%^%<RHJiK&FfK^vUEAUNCNqre2& zRKeLkFG-fS&yy^#La|c{+vlw_b-=+S`P&{JA{QlQ3ft$&&NYB^K~^?Z9Ja^fAeG!D zlO)UA=h-ZO*r+bg>nz!mi9mWVuXE$^e_m&)&EjQ}3E9`iyq>p9^HHJQH?Is`q0}a_ zDS?&tM48){Y?`qz9z$`=DW$EcfbE+ntxW}NU!&OU#Tfe^tjXLbjYNlHdT>Nynjo8J z1JQB28yzPNu^JK5kr8%9ydF-H0sXA_Bz=-?joN}O=DDzxusETy#R>MP3oz4GCkwVP zXneBOnUFMADF{MR3^F1SvV}k>l?SSh?2flIRUvjKs}Q@BRfyg5#1mB^b|<S4jmu2p zp}e{BA{!AZ?JF;`F>%mF#la-rTzQd=j8mqH%|(gxA=&&ij?R<K-EovFn*pXbNq!?J zIh9I6w?1W-Bh`+OOlhRUASCTp%7&2i?TN}TQ8F!aJW@%PWiTd`D#L$7dsGvGL~_$) zy7c$>C^OBL1|4Y2f{-|ssG-xuDd{FiWu2OdxJod2G9cT>#{--zn``2}pC=V(F;1hY ztCP(v3>#E3lARCY**ULqcFt>@o%0%J=e)+*Y4m)HWJmnvE4s3+s{On1Mz{*zvrx9h zeU61}O9`>gW`L^qyUE(>yUE(>yYaTV1_M2tlx-;~R}7}C{)c(n@&9$+b|lN&j%0b; z5zpJ>DsQs=f6CissD@W1nz?Mg60e2vGc+j-nt$4|Ak?@rMH|<gs0nVc7Adbwcp#gq z;(QVhuJ}NO|4Fjm`;%l*`y^S^K8Z(7BIImZ2d5zpSI6VgXt=QwveS4Ju%aYA)!S$k zza^Ts^=2);`fFS=`M*h$dehiWqkgl-Oo)?=vsRKcDJx2n@#hd*RpQ%|6<Onns2ur! zJ>p1rN?yr`BXygQoJ&aECL|rC8ib_&{2vCP#(qw1JTgvgJTgv|kul-t)W&{JZS3dN z#(qw1?B`TldBjgu5*w41#KuN5(*_JtbK^r*u58N152_wJ=2=%AwCB_gTHmBclCq|| z!nutuPdRAg=%9_HgEp29Hg=H`vhj3E8&L=Uo8LUh*urOKy=G>eW@de6W?g1xJ!WPd zW|qp|ALBh<u51pD7j9HGrEsZxkV(hu@kz&I*?cRGqSjS9P&`e{p>l1FNYeY<1ZOs4 zoyn)p^ggox9MS!Rnjiyr(i6FpbFRUO6Rf8jRbvs!*%;m9kxg}C*7$_(dKgVqPP+Up zr7YL=s9JBD_itS9lNqstQqFSq%0amxC2@67VkG^KgNaP~tt8%TPv*_`WZrC_m&BXx z^OAV8eO?l88h6sx8|p=EWC+=~5VC#{vR)9fJ`nnE@u1sdjXjv!*n@cYE9F85Huhj@ zV-Fg2tTqNzY#Wo6$i`$PvN2hSY)n=n8<Ukt<IY;V`3AL?Zr-lFXpQXs3zX`<Y)ZBE zLK{0zZTLL3W$395qNg^Fp4!6v9qzS=U)0EzO>vXXfUJ*%4#9mCX?cXKcZ95KgsfkL ztW%X;JXwTwB%m&c|8>RoLcYW|bTuvyj#R~O>@@lnpd7UnM`f_R+MvDcUjg2fIAQC~ zvxrTi=b<6Y=HHE0HUbXX7&vI7kaV!K3G)DB(`9CpWoA=lW)o$WDzm#26+$*8|8xp& zy&z<rpmS;K1F5VFNlxb<MW6nUZr-;flJAX#qBpBiPOOL<!2JJ_>Y_%fKjGGiTxOvj z=gNzuACu{%gEFCzygMi}1sRAPw2_xI-bGqTuH}kE+@RjsIzh;~K*&0fq+5Rm$$pGA zR}R_UlW<8k6D~{^7ru($L(7#-2@TCS8oSWwY)f2dp>BnX@zZgV#%{^BSWg;w7TPqE zRrvqgMER13jkHelG~6d*Cfic}e5@`0X2@VR)=7$AVlH<D^yOw@a+iR*RoRpqVp=Yz z{*nWd%f&&NKoXL9kz9KqB)2q1^q1Coo@~m!FP)Asx#>d|Y{vh0xtjLB%hj~Txti8E zSJNa{Q{uUrCYzE2Di7IAWTw%z$e&Sl#Y^sV7BnhrdmD~a8yc(Rj^iVVJC3sXmpGar zo3F-ER5la0DksQhD`b$G%#L}7VW&eJ(y#qxM{aJ?)hO9a+~=Gin^N}9p6p1R=x4rZ zYh))8v_^MC7b5*zu%@|^Y-SFSYBo_e+W`4TykxH+A(YLsI67N4%lA80_U6Qe6J>M$ zenMMipM;~W;s;I^Kc**;Y)axu?gg)hp^xJ^&lN+*#tr4#<g@Tq_tX+TjZ1gOMfN*d z^0gnNohJaE!}>2+@4(uw-bnN044+7lhjkg&Rxj^zJGQz1<^-%y!uouy<+W?}m21|X zywvQ-1N}GlJ!MueuPFNhdi&NftN$(2lfzp1bw{k_6+c%0Ex!K;*7E9>;jO*0Ya73o z*RR;)ufz8@U@h-F`3C!25B5jM+fD58_FV+uAL11)4z)_ZFF#(t3E$s}^_moV{&$af z>40@ltmVhg{@cW-{I)e{=b8M5bu9MJ$9f^wtFV@z5GO48E%|lLw!{7Yt5|=4wbg$H zz6<MR?V-T4v(2#{C2KqyFHhUc6R`HFS9ucLrgtrle-7)vV*Mu8R)6Xdo*aFYU&}M` zcOC8b@5TCItb=1cmwfDo-^=mX`}bG}c<@*Jlt<nD(TPv_anP&KzmN6DSSOTz>s;JY zD8*XtPRjFHxxKt@Aa0v|-`nrE?&H^T(N~6JnNi3L&8rfh58!&)pRtx}sqf?Zl(j39 z7CFC=nU-8ePFVI^TVeMltmS&>v9O<wwcK~N_N~3!p_dz@avkkaaI0^E^X^Qn<x<&^ z*tdG&dH7x~It;{Vnw+6uiZi2KIC<L8-CL@`+<X((Yf(NsWQ}r?xlyY0k4O3^VSOsr zWnKIca_U}-{d%meJvpuqj<=`iR{sR@`4rZ2YJ4c{+x*$%<z!GE5)Bcb<FU@hTH<Dp zmou-fnBPeprQWYX93`$&ucaPZdtzq_>=j~Ng|$rQyP~}MU@iHSb|&dcyOMe;<tXh; zCb%*Sv;Hi`1msezmt!sSFspAjz>~>XPr>?ptc$R&!P*|bt`*NuriS#Z{<ME*9!Q^Q zJfon$v@Z2^wOz`q3M=Z1iUYmVWmfNA(Ox|}SCm)P&+1%SRo`WLd93cgNa|)oQBgj< zOKD+YV<SDYdnZq>syJ3oe?gb&)v;JbaaD2QjJhth_0y+U*L5kVsp(P{i`5i$?w;K> zyI0RHb+v_@LP3r4{eO2{=lWQAMZ%N+$-xq(pt8CsT2LRWF0U#oo|Rq5(XNXXkwe*K z9Mig3ZFyB`589#WS!{Mqaozr#R1739DlQ@1gtn^-XB5Z0gtrTdifa8{c@?djI(2y! zE66xynKm-qMzpxLwyHX@TT@+K!D->!f{Kdj!h%?}Iv`dsy~4QzNvyoGIB`IIU9r-Z zlvfl-%d1L|0A;V7H@y#0|E)@#%C4chc1F~RV19Z%XN_HI76h&UX_KbNl!<74ZMo-M z5Ns~y5~pt+C@d+B)fTgJMEKBXVRcnWd8r2!KXC@%)k4~TdOexyTwZks7Yirkivw}- zJ7k2i;f}1St&UX}R#$kttS_mmEQl4B5ujW+O>Oao^~H5u0OU&{m#8vOQ4OEyUzUtd z$HONNN;^3GW?p1x*t}%#!(qeX@a<rIICgW`V^4Vhg3;j{L0-6dK`d;(Cp>9S*eVt| zX+-%c;mGx2%hlnOlJJ>e&xWwY=5T7H&46>dj_eUB508$tiL?)=yd54I+4*>Q%e+Yc z(UC4;%gy1e?EL)voc#PLL3)$0fj|22$5{SI?{W~Y^3Mw!BFle%Dcm)8{hV-4|J-m+ z-r`74`YJ6yGWNw4`T4w=@pi_gozER`&VV24&*}2FMfsP9H9NyLd12M)6$8%cGH%SG z{3Ye(cklgXTlivHde5{yk)Ab|blVcSI6P@}m++kQQ_><iYa;)8YeoM1`Q+rDkp98x z^d{-sBFB9m*~a#-i%`0YKi`%Uwptv{inLh~wuqF3-!<%vY&o~jnb(~;Vx03LMxSBE z7XBQ?AM9HgY0ICr{4u3_<S<&NQI=v`!k_6M2u;gbG~l|hez9B4T%1F3Dp?)rv0~AH z_f9$U)LAUfkNhdpl{V7D`be8kXGJ=M4Wq;6vGB;q=*ST{IpNIy&ScBY@4eG+z&qn3 zV-x>{3)3Q_!$k|S!~X<%PdyaAKR-LXJ1sAKZ+`#q-n8X>T*hkmS<j#6REF=&kM!Rg zu1L#k=p24OKav$*pSEW}_}%=id-v|0oiMDna>D5(yDDw<k^y5zbqV*(Uw<1d>uwGY zT)i%G@Bl(wS^CCq4%@7bbc^JlOBuO*!DtG?iIME^^&sX&>q+!#K(%W1bzbx9e9?Tu znyL4PGdHhWN8i<l*DY92!SnFK&1CN@r(Kn{nZCT741E>E?#j7~#Mjk_zsz4BUYiz+ zoEym}9fjkvv=|-onmgnncgPR(W8soCI)r=<=d2FDW!b_7>myyBS{XSctlPOQ(mir; z*fRa3wETXNgRdPqrR&~v!b7NfQN`{$D(BsYmPHyUqjhhSa7(`d;rHop-!buqCSmyV z+&s$YrA@Nkc7NJl)+BvWTFy0RP`uMKTz$!-%`jtt1*{0^-!`Vtm-u57e~jS|SF0Z5 zt(^b2yDP#j>%+<Y>+8dgv1tPahqL<+nKq!`Kr)-2v6zi>I|wtpw+fsYj)=s<!&Y}W zix0_P61G^pWJx%AYriF3C!ZBI<ekYD!XmC)>EH6lKPdn|&fP-+*d3<lrnR5El)%b) z9G$O1j?T(?9GyKOMTc5>eSLky<ofzG{c=9n|JO}$-{p*@0~XDDn+{moB0VoHJRmKM z^$!o|AGR!s+)p2U!<i-N9olaDZ2akK@~KK~yDviRBriPt?Qlx=b=QSQzMYdFemQGv zw?1c{op<I6>gXbe@PE4}h0U|W()GJ1b%~r5wk`?lR)+_cgfmx%ElR@Kt1H8Y(^o$e z&d$4d+$9Yo#zwA>95H-W?{O=_);q%sM~AJlBUB0QTM${!eOrCr#X~Qd8P<*t4;Vcr zY`r|vmU^SF2c3RHPGo$}xJX@>aM^-LR^-~qkZ{iE`k7<H12^Y~E%L&$NZ!j-ajCww z**qbvh-6b>+w393GpU)iiNrQee!O3#K0my#X{3LT>S@Em19ygX*)cjitXmu&m`6L| zf$1I6&g(Z|OrNpgp?e}Z#rbO}VE>G9v@dVDI=+2H%dJz+=zH~)@br@K^sQ9wSBERp zmWRvJD5a^9{@d1Uj~q6fO0P*qgez&2jPyS3_WpDGD+BtKu3Iu{0EI1mP`hoVk>j_e zpV0Q_J4&}jJ_ui&zctc*ZBE^Q$e6xUDz|J4+pqpow1;}>A^YxFvn_HcR}1P!ce?e; z1zfwRB?qIizdU?8ZT%B7`<8B7v*M+&`POjnMd_!etqI$%PCvPA<j`$*+;Mw-ztT0^ z!=L7F4PQ^EzN9X_Yg*)U%H2b?kr-ul!-0{}7xyVGEv4=@kD|S2Nx%HtQs*dgT-YOh zU|LvBHM?DU@3hDR<Vjjaq)kTHb|+c=TWy4^=m!Ug)n|f8UZf^+Vc3n1cz6MQOrk;a zxQJ`jVHWMLnZM_p{CsLBOGf3B*X!1;3%Q?rGg#gwz2jlwpB6+mhs`+vX`iPLK6u-k z;SFh#&HJSr#v<!?{rJT;>aHWBzYFX4gq!A5B0tRMrWJ+{q*2b!+7sFJ(wcB)`pIdL zU11@m`_=5c7q)~qX1LAG;mVA>73n9neej>#!*e287x&2zi>WKy7Ot7YvQL|`r*k%k ze{U+XWi-f!?N+mLHYsV%K88bRJN@*7Bcsj__Xg?h)2NbUMfy+$9)WdVsyI26!r4x~ zD_9+FO{0SOHdq}gy*1KhDGyuCsoPx7pUp?VdTtoY3lHA>#0?jJKyiq)FB-!$hnb7R z7Ng6SgpV#*9^RF<{H1pm-5y@jklu~jc`W>nGJI(Rwe-zP77fUMF+YEMBquVq&zYr> zZDB=hQFzE=nt_z8*hdxPhgqw`Yn#z=@8yT9B8$U4v+}~LoAG)pg>F>?H;3I3?tE4? zaLN7@NuQ8LdsjB>bbI|Hhb(z2GGI~u%S)ELQ#x`<<hc5NIpGf(B}>b;os&<(PpjF) z>ek$%KCNC%+dnqXTRJj-+ltQl;rfi7k<x}s!<Dlmc{hZuBRkViIxMpLoybe!olW;d zo_Xi<B}+eF6TUWwec3W|D;@lo=IqOsne598&8Z`NKXS$rxBPfc&h7K-mn<z?bbslZ zrC;=E*tKv<<h}3!DvwCpzGE)9G`u}y{TQmbqd!{`X&c!^W?pvwJl1+WZNKQYH<J&v z^FsA{vj0r;^i64LG$fuFSs(UF@0fN!4Q8VwrRU@j`@BhHdHShs!<}i1!>i}hd@1}e zt$%)`d+!T!1}vNw8B5=-4WDbE8PLrBRA3zX6SqbhURn`;nX#vC@AKit1tsCj!SaFO zh6Rhm*MjUDS8;{NSe|jeTW`&XtcV<(bKOJa&KEUQ0%_qbts>c5xIW3TH0g}d*SFSC zqo(iw-7I}%+B>iQ7<r<;E`QXN2I|=k+sfnlVusIz_s?D&ewvZqCCz<3mqw+t!jio3 zJgTLO7P;DZYh;f~eaTXSVFq_=X&FD=PeCh9kTBzP{&sxW)=!bh@5sTQ^N97g8lIG_ zBWKr96Pe>?P2q$+q)w;Yg&)nLm@G|Se1EtogSy~w2hF#r{I`bpr$u%~9*jH`K0Tir z+h3beK4<L=TfI#t->>1a-_@ML{CQ+}_#(B&Md9*UTf-+8P*s067)=}5ysiwF&88+E z{>s_>aoYl#E^UpxOx?<l;ZO8Z7e07HGqS#HfzQ?Qj0Y!=iPUno(lbV9l=jOXHFavF zOTYX`*RZ+I*y7b0;e|9>t&bd27S=@ipE@L*y?zKa?#<mNT^|{^G;%`ml4W6=(Ny45 z!b&<J*c>Shn@3iMv&oy;qn`=S9UXSaOK(bN<v3lbqVtb}y5hphnjl(VMQ3G2-Gj2? zf}&zRIVq?t4hH2;h)x(bB5-G6Rn>tziJ^0~n)(>dr0Rlbw60r}&ZC2Zs=~7B+JH|h z`CQ1cy27$zvJ<O}QZnu=sbG3_ZLFlesxTUZxvKg~N+>#fQhx5R=#cT_CJh@mDLQf3 zq@c9Ch(u(nux2*=s*6_F$AZe@+S1}^QF$%S)q=YEnwr|;y1HmhbzLkdnoZ7^7e*_p z3yPv;1yw~A#X(V3U6d5n6*G&AoF9B%SyNnFSw~55IQ%JO)Sb(+Yvd*8!exgtSw~rm zO|LJZ6SacELQaaT)mM;vIFqKR1a$?`5=yyZHW{dmvaW`_sjjDUVUo`*uC3#cavsM; z&mNaEZu~jp0w3sFin?-xRb$5w9TpuiY|@xf<Aw$GbY9-A7n$V}8GQDToMDrqV~0%| zG<49UK|x({RV+Hax@dOcep%u3M>?Xeyec}UxVAc=waZnEinF4iv@WPBp2Y`HAnOVX zYKzE4clzl}1yrJ?v9h4By0VfYNZ%Fuw8xAel0$W3(9nP*$h9O|T~#rgszG&02_-kH zELK^e-E=ON&?Ss$temd51XO^!`cTy<uPdTbE3B`j5-l!_l~-2<RCa|kg7~$MXmt%; z65`s2@5$>@cO9U}Re_+cu$IrIeaZUs>S&BkrGu*KXkh_W!k~<52E{3$>lEcqRu?OX z)w|M{D=gkrZ9zk{pq9czo>7x13<@i$7F9QJMXW6>b2TDbP8SKBm7?OAlxcE@D^3IZ zN$%GL5=wt9A!sPCDB=*;1?6>AQOaZG1r_CUs3sOt!N-cJanw@nklM^;JZ}8(QDcTt zO|Rt2Pi5GP;$2%8ix!rVt-!S+I=-%cIz`3R$KtA)K~ZsCVYH#Vhzd?>(8SzfL(U#E zXws<3!@R@PYFurLQkADG7*s1Lkvh5{R$EY2S{#(uxCUH9RX;jve6*pqoct@UDoPZ0 zNqt2H6*txYpf1W{XSblXwqSM?y+<r4p=&B!)KPBg6m+`&<Gc$B>guK!6wYXH(Lg^` zQb)nyAlA;LszE{G>s{QwskEzWXFL0-y5*%+)wS$Uj5rl8UwNvaz^NXB8lt^$#^qBV zD~ocIpt7NEft!nK8ot2>T%gg4a;h;S#+{utB#SN|X7|kMTp6pcDjrZuR|#v&3u(82 zYQO-xVA;7BeOa2-d3^V*&Lvcn3TJdi?W7*Cq_&{6lIz-ZN@_+eRUOW!4^T~g9W|=x z^x4sx0xG5H)umJiU0>^~PB5dmm@8BH%;IQe!7MID-!bM+7(Z$Jknv-jEpB?g6zi*M z3aDEt;>%nd!LsV=8R+wBDUQ{2vDIbTRZr>qd;_5}tam+ZCFyFT+&yvAqv~GA0j#Ga zsLIz<r@~zb$KR!mj?%@d%5|4iOJikpsnVgk0yh>=hU0zKOv+9Xg}suRFBMp+%PwE= zlflMyAmn^?U6d+t0d-q0IEn6{zN(H2zPKo>u&lsWH$OJeG4(Y?+=41y4U0#MyVzkv zCXE_DE?`sWqNqM|zd{X`E;biOdEg-n+(s$)T-E3s<lI%kpqheGTTU^oVUaiG9H-8Q z2L~z#x|-<gI5nXtU283%K_OaQOJgYaSKKnG-cvK@3PHu>Ix=cBuJou)kliZUE(~Za z(j!`|j0@QH#{u<mC8dGyUdd1abs$xx0cV&8L&`yI4P6M1mGCC@FYc;h@vNGFT5e^X zE3+DMwy3_w3EbdKx#Y2dYM5(!lLqAs>(;%8Zw0>pKy`@Lak=}RySTDE=32OGLe%m5 zu}f7zy1rRo>8cQwAdRi63*iohJGO~5eo)+KIAHf&NV&pr>#63!U5^c}m*wu4int&s zaTS@0*o~h<#*CjhOt%(^2iGpnb+op=DoXt$hmj{K-TfqmFT8T=DXuQzTA&9RF5~i2 zR~jxVewvXOg#7o;w%>GyVltvhe^pM&7gta>#;qO_a;LIj21ShePG7nCOKNvi2(HsE zD7v7YIv=hXu8Ne=B+9oZ>KaMJQE*);8pTYilT@f&5xAZ8CP_s(mk;HZ5-qMMa#@%@ zn?^wzUZ^voWMZ||)M?gNdP_326Xr%P;|NzqUmyIc2bEE60hJUkVAFKN4OXnHEiR=l zlWHz^I}(_xDEDE$3!@6oeVr>g9!}~Cs9&2-b51TGZZQ=FG^SB)EGM67SSu=;Nk;uN zgcIP|6;%()olw`#-L-KSUw5N{Emb*hsSdj-3Bp<BOSlG;RiAIy{}-0kSIwXlU8y9B z*pDkb+|nGWy1}*e+G0Nlx=BHlN{?pARVZLzs#GQvM6U8K(A81bQfexwrShzyN+#L9 z%ws*eQ-08AQfW-5t|A(BS&GK0DOHLmbyLz4`Km@yj}_E$SHwnquDQsm&P*6|PIS<O z5fcOS@id-ucTDp;-;#NvL$hJuHtPaC(G4UF7g8Tx??-5it<>>Rf9P9yjH+(8fIqvt z&mOJ;2T?bHjQ6<{hD{uQ_JkpRnnBqvaYaQNl6`7~@#5sknd{`^b)`-wLljM!32|Qe zW>XaNq~cjr8SCok{twTVxx3h}WXTmbYv$?c;QUF$Cc5qwQ$|-N1(h@x4~CB!MCUY7 zy1D0~Nkb<U2=^G&`4EcF2mM&U<76*4(djLsy7=^J)VNWT0&cO?@G5DzpfT5LIce@q zxC00<YvDksqNbA;6m_EM^1$S#dwym`-TBP&+E{%-MNmRT6!?loHQ43DRdt#ACMFI+ zNp(F<*m%b4tyC72mQ#K5(>#u;A4|A9&K;FI?0<GE)CZ%ki<=Db-9Db>x>Fzt`>;Wi zhD;bU+_gX#ST{RhDTO!Q`gtx%u^u^oe2z?1=xds6(=>#FQ^f-X`{<e}cO239q?88= ziYIqCJc;(rna^c{Lf6~T-8vo-IpeP77Sn{n^?g*<JV&F+^9(veE3a?^-SmPPob2qP z0zboaU3FnaHI)%tbA1+9VRsr>S5r~$&L;e+L0PdY*BQmLX=am{NpoeVGX!_Cm=&M2 zQ2)&J#SL3I!-nM!8pD%uJ)_|+)y;~yNa)Pa&Hc$`H|3HlPW>STiqmycZr1g6uI>eX z7R>n$sNG`bOjAe>Gy>+cQyFdG?7EY+UOl;3Fe<vvn7Wu!Hw5|m>dMR&gX^)m)=)1L zTu8a(afdpTIzN)jw8xF;T+no)?9LhD=jD`HH~J4AljGK7#^v})1)oy8e!xvJ_#mF8 z@VH6yL-LQeU5DVxg=RI}nyX5q-MV%Sc--LWyqj0L%qPxRoX2Rt{uG3!idC3h*4I|V z&(A5zLN_LI*NvgApvc!n9x`3c<Y}>Uz@2E&Qv!5~@4Tk?Vq8^I4H{T!D4@O*{!{r= z`O;~Mt4;nKe#poPRBBbFSzI|1&EJpQ0ZvLd6EjWq;%hY&VLB6;LE}bk5!FvO3Xmtr zojU>Nid~GkvY+J_l(VZ`g*c`d1*X@Qm(ukf)#stxqB7=5fxmi^cnE=eGN0Z|?vCip zy}Xutx)@(dpluEcw^BNs{^ydVtot)%o~~5!B$Q4j+*u>fTl`SSGb2BEV(?)PeZODf zGr?#3UO^|FZvMelTP^`m3DS9Zc_B62SS<~qR9OD%1>51atSS;ko5OA!r$5P>G-1%V zi9_hZiyJs(6yhewfpCHIr*S-O@KYPAJ~Vrw=HTYE9AQ59rK<*frXmf)_Y?8jMRPlr zP!4=Irq3dH{HUX9Mvp|$={-GuK*5xV#p-KlFp&o48zmJgUx8rgnksj%e7V7$RPwop zKO=EdX^IzJBXMKM$ZmeRfD;n-M0yI>T-cuLg~&-vqG?i6J)@qQ5uItmBTAV28-LdC zugy^ja0P%C$@5i0jG^6n#mCNJc_Rm%J<(m6pz2yyU0>^40!_=Pr{>8McZWkqO`zoL z8I)^+v1&IjriwwA@hD+TV`t6gDL;=WzOSPhTQ_omRz3Wxr(c~$7wl&G&NMy?p(}md zCHW4uoZ6cB-J?78G<4wrH7nk;`H?s=XK<&_Xr7d9x*$oHDQLD6aB)#D%X8<Th)?La za?-^eZWeyT@Yew_)lnARM1o6_o1Q;!<vF82Jwc_yEU~KEov%?#<nBzX`OKn#u2;II zRhKwnbUjYAs+xjGlYAQ8T)m_s=M#xSzSe>P1Q$}>_$L=Z{bbuuGwF+&TpKVhaewT_ zDeABJ+7DfS<vPJvDr$n#+G_fYQl;}f08RMma*pdq=u)N|s-)s_R{S+V*IbHd_~A2B zH$DWTCJmb~XcEsj$vB_6@uZasue5@$wpIl0w2><?P0lg1c9$I7nK2)vE?l@S!i|Fa zx#4r|XC!{sO^qlhVjoKU2<A(T!;0>mH@VBe+{H)7HP)FN6lq4zId|Eqthl_i%#Z9Y z>wJ>v$Hd~w8rKi{Hj9%PBt&B&H$Oh-i}92u8kK7ze#E3M#CN>TEml+M?|<pupXazM z)&Wm5-5Bc2&(*Y`u%N2Cs+_N|afV!Ry56&K7wS7_YPa<~d3RR<Fzh5|Ag(!&8$WJv z;u^AZ-(NE3{vNfHPZ_AD(nVNz;Z+Kxf-X?j7nD+4;?BxlSENu=9da`nYVW0$F`A<U z1-`yeWvHy<W@bAuv<}yg(yWlWG~bm<7s@kG?!I}lLrunycjLzUlPupexB+aI8@H*q zn#m(@lm^6dDpaa~n37QU;m!<5%ohaQNaS*uI1Q4zLfx<{Ev~9KU7|jOd+Wp%gJ?DN z>X?JEj3%0L^_g$DP{iV=V&jHQI%oWZ92$R%XfW}Y#%Um?Sq)z+<3Xyn++C>_SN(v@ z*AcnmQB3LLT%x3Tj^eKWx%%t2{4Ip;@irSD23-^6)<_kS+^5?zCFQfoQJQ(kJcXU7 zitY19#e*hJR|e>`*!311miUd8n7<C;&+px54}I6AmkX(Hn>4DsGUJozqUbC+5$5L& zDW?}k6W8<TGOWJ<MOP~P90h$rWkKBxnFq%EFmken=j$}%uH{KJpX>8OkCgoi*CFbV zx{lhl6({7=SH99l!x{I%ZiXP&TInhuWggc8g8k+ss9T9la8;s;SyW$HN#`qdg*4Ff zw1aK>@s}q*d@Iidj|LU0KD0*-l4c*Suk97Bmmae_&QZ8z=~5HlTj81JOdm#6GQO5b zrv$E};`?j<yfl6x*w2J$GR#wsV8oCieX}~AJ-xmvR`0K#ckW*A_PWjQ)-$_n&yzjn zrzP9+2Q6uHCIo4-TBjX(K(okldQg&oRfAtn1o&l4FpwCYeh)4qO)x04^(E<pGTSW) zhh}Egw#aNpU{Gdcc*{w&J=|>%Yk3iEk8s;LEd%#!l^7k$%S-$*G;?73>K1%Zz)wUk zXGY6nwm&$t^;PMEGuvGmj>ycqq{*nvj!T-3$lNh7JU6XHX2(I9S(G+u24_YFk?DY+ z5Z^(6y!><j<4Jo-lc92adYw6ZM9YzM%mI81Eido~*}W!xSZ2Gc!(o|OS2Y=y+40Jz zgEG5bk})*1_mXBK$m{ABnZ1b&%Ir8eGmE_Ro{VnkVwwkA?pGy4Gh0u|j5uDCf-eI< zn$sqI9_cwhYr(fOckv*fuH<+lKSMLSrk7E6hNx%^YZ*{A2>ym+kD`ZKeSXMG<Y#a^ zKZ7_wLo;*3E)>)x85-U)yp_Kh(kQDO^p0eDD4v16j<z|SE7M1FofwhX^#UsUA+CU^ zc!M$Ybq%z?LVH#E$o=y}k)@inU*V2unVx5II8w^{Y1q4+*NOOy(($2ZG3js$S-iUB zv}C`3#j)3NoLpTVg}NMer6W+AN4Dg)(2<_t<|Trd@~=+%gT2pRxO|VvY<CHl&5|bR zQ@w#<nUSIF>s0!yfc_!qui?6l@)&K)V_<qLY0yWsqzc%$EZF|bu>aWq%>IHD#hujt z`DF7{dUBnYBRB?>U-(b8AMJzcV!VCirr({^{;-xsN%KV|%6-vtq%o8e8j-o7>AcJc z*PB0re@#DY@M%+7T^&+6H)@+>GQS@lMw%u~-IWE~+Xs8saOY<7;@XDGi)$OBGd~H# z|1?i(&(*_RGBJ{#+2`eV{&00+IM)U0ca}7vhLBFZAXh)CWz<_yg&s`%BV>OJm1!2~ z{kLo(2(s&DSJDtbYdVj1>oVD@Ev_iYcBlE-Zqtnl+0*IvR(5SQ@9;6*=m$6Z?e?Z! zKF~|BQ&c>?zSPe#vi)|!bUNLbx!>13x*{bfr_&R<Jx!_kBV^C};uL(gBVUs*K{nsu z;M1UNJ^{<7`?{TJmPC&gc(cW2QMyq}rzZdJmn<^D)swqCy$r;T{dq38ZM_^xJE$5O z2Lofi;mgZV_}7I@=+^;mX@~VGv}TT`2pR-W<7YZ$apE_!%>IeApDg`Vclq>ZLC@)P z8a93Yl@&9aen<D)h{oJor30|=uMC;tS8aj=IsQ7-bNND!m-Vm|$3H#9A2HPwjQB6d z=i_*E&5}%zHQH~=&!FXtEZM+%60MWPul3zNg;n^H<Hu=B`ci%+#Kafcj4!je)1akA zrC-aZ)fUhf$<qJheO|fgW`887--7;Z`nANYO+I3=>(ql_eTw+AhL?-!FWK?gPr0vy zmh7Nftac%Nm(2h3NB9yMh=O7N52Qcq{|&^fO+rDREKj@gj#{jCIenKb{k5Zf!g4&P z&qIMte;qMvlTc8O^lRh*hO}7iqe&R+-s|X<f8<2fVvqk5eV5Gt9q?c38T;Rc{=^;O z&k<vrl26)n%c9;sr3ps~@oPz6)~^yycKjQYyaK;2jvJBVWc?0~j|;Hz8;-YJjuZY3 zZ7{R#H#plXSDE@N`IqCrpp9hl+l~0?`p3VJm*XXV2NAP<AKP9v#i##I-cgJ7KdJAe zUq0O{*YaeJ79J<~m$Ei}e#=6#^t)F1<1<bFXVa&{lP;`l68!L=WM77jYOz;^Nj+iz zOd*h*<Cd=M$T?pYxV%Bc&2NbD5;huTgMh~$wv)vITHJXet$WiS^9{(bJNF|t7<?fr zj63fmmJ8k*mBF3Q5j$5n;`jpX^HNNIX)0e5*J|RN?kCXWSN_2qaQ>AdFT%P1bpC_8 z^D$!FFEJkozMb}E3B`y2THi!}tZ$79;?BW{-45P0lQw8^=S;M|m;Ts)X*c5kCgN;o z2lVc|iP$s3(I2_<A7bx;FXYaJ7I$t#>mTUP<qIeLavqaO2{G?_2&;qOeZLB_z+2;W z6%T>;1m6LUVJR2}zMLB+E$$qF){}{IzG&qZS)UKR{2S*(@qI0LaJUC<zE7JMgUi1r z=H~4<CXBa209xHZ`ZUG$ydiWWZ$c|uVQ_$K?zaxzNVgwyJE0qal5uWLjhE2%_{lg5 z#e5Y82y!EiAUEPDM8(%p99pY=+1!|dZ%M(orQmO-;JZ@r?^E!fQ}7nlAd>liSPI@D z1@D!D^R<g)_PM?!<IxnnDg~dDf?t+`-;jc@OTq6;!5>e-Urxc_O~F4-!M{tv`I<_y zxHY3eF&S@{f}fOvcS*s|Ou>hz;1g2tk`#P)3cfG}za|A=nS$Syf<K&sKc0ebPr*M- z!M{que@MZ9O~ISfIGwC~4^6>4rQp3&@DVBaIVpH$3cfG}zcvM5n}Tml!JkRN-%r86 zO2Pk=g14lpTe3JGo`QEt!TY7)LsRexDR^EAUXp?@Nx`p8!PlhV52oNx6F*4Jd&@B3 zy_Q1%WeWc96ui;z8O(FHjh@oM{b_f1)!j8N+V7cE_o#}0rkj6{;BSN_ew4tsl=xW( zx;CcnF7YOw3*$|9AB#8K<I23jPZu~N@q2;p5W0JdM-}WN4e=*F?H57PdzIPcb+rZA zUHM5^N?ku_@7?mx4tZ7g#N#*~_(xV<PCe+Uo=nE0J9tutA4|uB=>E=RbuB;A-RMUt z@yA5nBOi2&aKGPP&=ttWH{%%6V<6^>IFaAKkS%@`m7kh%S1c3HE%LoRz7_8tUytu_ zVbN_r`i7qSPCUyYT6b?b*%QWe2<6J%Fmy)!Gj8s#C3)(9FtFbbSL7>qdw%~P8*tY6 z$5EW9{s9)HA&+TMO(@};l=0`GX`7$cA_;B9pU_Z8@K1*lH(PmgznhK;;GV}KBk;l9 zMvvcOCQkor*O27?ciLS_`#)?Pe`I#QXY0rqKjOrC{cHvA(^vknXUYVgCT9PgRe6-n z{K`cRb5F41_g?O3`Ar8MpLkwpzh^rdKd$0@;&<<G(7lIlkJ=0zcDuMw-ss5){D_F! zHvd#Wo}1ukHTv~}ej+bXw-S#uvnSMiTu0)<?SF|8fBMBgp+uJV`vDK_bMrR83h>ZB zoeHy3RlQ@B5P6Je2wk@2!73kJewt*zM}+)CM8x*Ht<M=w_1M$?zb9d{@dp|?6Z+9o z+INrQbJys84VdWP@I)#plK$wDxbNNQZacLx{zZf*lskUvwXUK%Mq>+K!{vq7H1!SS zI!Q?9GrTbCN`Jrp$1g{LvmTccXe$W%DSa2(7yWsP^R*S>OBC1kS1I0I=`+|7T5P(< zgY#uA_6L_4f|HFNW`k_QX`14ezTmv-L4V?Bwc<S$pQ$*%c}?`!fQz4U9qK`)*LEIN zyqB`W=PkVO>U8=O`(tVT$_sOC=WK9E_f)3}f+;EVH>BVjjh*(e^H>V~^G1IX^xIPC z-!OW<j?BxuDfGW9uH!rj1;=sVYjYBxd~k^a*CAdClwQ|Exi2gF{$3uutMq+{iG8{6 zYRlzlns4#Kyf6KUehj$O&&e#JWm*b8TiNMHI<fPX;_RdFT`BlJ#rf8q=+ki>k^R*1 z%vPLlwTZqDxWtFPa?80&ukBYF{dv&WEB%?o#Qr>Rjt@faj<`nYwf&8X4^(zu02e<c z-R(-R)6GNY#c|O2EmM4uvcD8u?4M8H@v_`-N%vM|N2mLs;yPb1D?XU)N_;*`VLu($ zW!ZmiCs*+y%1$M?_+Loh@lvn!x?L<b`U|~0xIBgaMx&n({hAc|^+vx8`i&{{&lvqm z=(nZNzisrlLH|(-{ntkS0Q5hm&=1Dzs5zc|srp?EFuN7!qI&{%z6a;>(sBOH=-+_8 zDI2E6>f3-zIey_~!4WC+CmFq5fA5k)-{0t)BVR*P=+83xW1!DZp)WD|Q=qR(p`UB? zeV|{GLciSTM?k+Sh5k;Xp9uZ^DfF9-J|FsLQ|Qm)j*S-n8n-mu{<(^CJ&}1*A-FB~ z2aUcA={~CTL&=Wx8#@#qrub*ZP95xgt@OHnw!|$3@t@~vyd1AM`#&FcP622CwLe1@ z*Z!Pi>|72zQKi@ZELD1rXCD3Wa<$<L9Swq86=y%Mhy6R1eeLJVM!yF7H<e!d(}W)) zpoR0R^L0G9#EtKR@zTxkPaLKBv*B`oYqa9*zubSE0B+;F*yx{y|CguGuQK|r(63FQ ze@JmX?(9%p$KfB!K9^T6?Ehx?Lhxpoz)RdDzlVc!es#K|z`6SB`NIUm`8ZzYDf=AH zkCE;&!(Rix6WpfzkmAG1j<mb)6xV)c;65kY8Km@?;GAFf=Ub$Ey3&tO`pMunzvme) z`MuuQm;A0ZT=KgK+~)T=#dUtaRD7iJ^A23(Wjmu3-;{#Cl7fGlg8wT8Kj0urj24^j zHRybqYd=rG2^#a!^e5%mHwDj4!Anx`c`5j{DR>{;0+sp@vSYLi2j^Yg|D0{~?Vz8Q zLSJI^M?+tgLf>HY?V(?gLch%DPlA4V3jK{r&qdT4`g;`Tc5xv1Ln-WRQhL|VK;I3w zpm{fk{-k_oq~MDcAEWduQt<B;*Y?}u7B{CmR@uo_e4OHsD6Y?EzX6x_j%)=-wxfe- z;eG9AH*nEA5q%6wp`UK_=zfBkN<W^Cm$==Mg3rM74(v~^(%+`IZg&r*;O{7Yma-GU zg#u|8|3)AV1m|6SJ>*bujsw>pS>_r$cq}mZgR(P$#FF1X8U10n9`UH*M}R+W_$>JO zyt3az+5g$-e}?{drPujt#Sd=LB5}A9>9z&8aX3oxiFBOgtDoXJzoU$O3}?YO!=;`~ zG+f5u3zU7G-&&*p9{FuhdY#`}6rZI0|Ff}kE#mOB(x0vLI~3RU4>*cMwAi>EuJ~m7 zUgFkE@pBX(qj;X;`HJf}&jpuqlv{oam0tUKo8r10pH^Jk|G?Ona{R<_DaX$Z?~8c; zL)q8m*!F13BrO~_T`t++oUb<Yw*lqbTj_PVj8t6bce%2|?Y9R0{6XopKerqG9O&;; zdToEV(eH(y-=@(2ZuC8%504?|XyILLza_Yo??>>bbqf6;qkkRtho{ibFnSsHFHfPr z*65|(-IzlElF>_i{+dF+)99ri`!a=o54i20Tj4=QiQA)y+hK-33x1U0FMyv2&SBK` zWRT+d^qsWpF^cPQoMi0pLAm6o(9c$Uin9M_#dUx3ys_UD{=cmB+MgecUdFH1S(F$p z?4IriI%Y9Vj2AL~b<T1)K90!v)!lFzzxsmPcvc&|lzU9+wf`3zeJAAi@)Y`e6xaEB z%Gi<q?Rmqcf7@ob^lxt{`?{X&H2RV7^Gl`I`D%V#;1-ULu2%<xOMT9Rouidrr`yNq zWjq~dc$!Zx7@5LOjnQ9%bnBH~`@ceQU2k7DcBJ2XP3g6rzZ<>W5Bpl_&n4fb-TiFz zOVGZ;_CABWtMzTcC7yR6UxzEb_9xruWgO|P^g8~djJ_xAk5hVWzsTsNo|LE1UuN_< z={}#=rO@AL^yfhTKnndfqnB}^>G3`t+ut4xF7cG|JzjAh$Cn}9PT;&dmHwn0`zbw- z*DpdpOzCx;pHzIJvh#znBlUlu;c0Y?TTbvRPEOnJ2rl_LKJ>cIO0Uath|x<u%u#w> z52qWw)bk5c=oc8h#CfUGYkyW4{TJ|mWeWXmMvv2n;I0(<O-BDF>_4mYI-YMUuE(#B z!EL>2-NDCO;xE??PB2`?)04ru9CaLWj9#uMG#LIE>f2JozXZQ5h5bK)i~m!h|3T^X zxbv&A|1R|5iTmeQ#?6-CEYtDqXY{*ZXQ0ySIE*#=2cbVZg}&P8<MA<E`jg92*tr|r z#%Gt(>-hX&>|X#s_Zcqn2~P5Hv+?N)F7@XY*y*eEIzA(eUg9%8g}&VArC!Z9T<lzu z!p>TwmwNua((C@MW5@mLiSz@V!8w~cU#A<r^fQB$UiV8mMlb!?*(vnXjb8jIReJ5u zg+?#_%vE~r&&5VB{#=tne~ZzJKes8p_U8ekm-hZ}3jNbYe+TN-ODXj489o0FgO@Lq z{xsT`aj?V5?(0VL@Ue<dQ~DxsspsAO;X$3@-=TkArtF-j?0gR{?G$E$v`&7D-PZN6 z5M0vDYT|Wsls-yG^0mO|PlEpP6#8q7{&eWCH(b)aP1!kLrF)mrOS%szeSy-yVf15> z?z>8VrqcgY@#%_pJ%x5?X+eL@=uiCY4bJgApZ+91BaB}B9G^m8sPsI)lJkNx!)1J_ zQk?x6k9^Hkob5b~dU829`>DsBI~6aa@5KM-6(6a1r&DQ%7Ky{fNVhvU+b^O&u`^up zV#N!Loy%aSMCrAi8x${5c79M?`x$g55iRVGuIGm-uFq>`C|*j(i2wI1K2GuNifccA zQoKy*duG!PE$oku^9XQ>=YfdBIHlM1GhcDt-e)RaPHBk$^A*29@k<n+q4*lbD-?fB zaUJKbT}VU==W77{NxJ2V>+;&Ac%{<+qPQ-vSzSp)i;dg!idWJ1lI~8$s}(;H9jU}w z-pkS%obBs4Z&7+~N2}0|wkpo;?l<svm7N-uZWnHBw6J|0x3j?6AO0?j{&*=+`U`1a z@^z!)x?J8;e7e&AQ`u)fW%;+#*Af)_89a#6!oKM7G!tCn#=k4#<=_<h6BO6=e6q3Q ztpvf{h93p{8<d?vBo;qU<-wH}@yG84K@^<**X8(y;=SoRvGa|wgW?N*QhI$~wM8$V z65Fp+c1}?|ruYKIb-GKz#eYfnN~PE7-l_C$$iDRd_bIOX|A!T4z4ZT27%t<>c5u!Y zR}G2Jdy4D){-U_f@6^-jU|J+!hoKyc!P&kp$IToRTA1s8<0o*jQv*A{8r}e&(Z`u_ zcC`Nm;9^I{>vE;n^MtpJUY>vW#PBPT?k|RmKD)2?N7B6j`X1n%-=Xv;aV}DvO$x79 zc67PVRa}?*62*17UuC$I`_16C+&3xSU-|Qqvcu_0zCKfWov#D>k%$(yuk+PSaczGf zxWrB3IofcEf05y$Z&3ERDN8)RP`qC8pA?^|_$YRc7V+n2^z-AuIbV77C-zqv{p~3C zKPr8L(m$y9EaH#{e^++69Cst#y^3@EW!!O%hxXYYJ?<REjfxiLv*}O#?4tNY#Rq{) zer0^jQF`64wxVNsVf#Ea5c@AMq=h*T>B3txq$Q31wEt+<j`J}KIn%TZbe~?&d<PQb znDfGR+Pf|PaXz-0v)(R}?xP5F1Om~^`zW-ZQYI|TQhIi=HNNbqIOppr@UDtG|1&+% z`DH1m&kN5Dc;S7vKM;0u8PdX>?Y{!9<Dl)IPa0lW&r*p+4MSSQzVxfJJdWG{81@$` z&Nk%z9?KMm)R9$+v;XotinWTf|GRL|9~Ia3Hz>|h_LrBZ-Dkr8-LSJ&akl>>_zuOj z{dW~-sl;cu;_QFNrXGB+INNUmzE5$sA@4<L4Ts}#hQ6KRZ08{GEXAFlhj_!i6=#3s zJwpQ(XFJEk&Pc`CP8NSj%lV2k;@?m6Qf7D#c#Yz0XCUm%QXC<6c9tp5e(r#s<%+Y3 zDd4LVXZx;F(`tj_tS^Rsli@YsPb<!L<b62rDz5E(VmQxDdD*S_9FP2`b1qTeA{ib> z6leQ$;g3A0#^&aFsr&3`^p`>pb8dX;p!5e|oBQET^mi2W2O0he3IWx{*<pPv^fQM; z&;Gy#M{rrl>1CV0=<2@p;~m@C00%LBi`$Q)A3nqAS03rXFvEZ2N<qsQzlz&g3OhUo z@gn&RkMjF@eii4J9O?m|`|u+AOAwd~J&yC24)$Q4;Tg!+rG~$Gm<QJyJ`usY)o^)f z!M%oOAzzOfUI>4lG<+rse4F80QGjn6ei!yXHoUl<2VWV!kt-=Jd;KaNpZl77kdFE< z@$3gX@;eXV9ggsNe!mhg!tdb?S`Ih-9PFQ9cn<cv8r}@`yuaaHP+ro%NxBapo|BCJ z8|)Vt{tW!DG`tz|JKONnQ4je&O}t3D$F}tQ@*XPTYYy~WejgzG5AgGTW9JpbU-~!E zKLp)#Mt?Ed(W{0RAU^LK-T*)Oy+yo;{jJFF9>aIT{_lqWihS{Vi?p4&sGo-#z6AM_ z`yP^RfO%|hqc26jF(d^aX*kcJc_}lz5dB_V3NH7T#Gl6zAG!Zv`7&ciuCHE~g0C_B zdc>LEXT*!xuSMMCcfP{i3%^PCoY9X&`To`L0>t@K!zZ90`_}La&`<6&d<*m;%18VW z-pcR}*gw+n8kfr;;P)KyB6hAtx%4o6MO&}q_Z;ye`kml8hMx-m&oTT{@Iu4)p&za` zygB$>!>>SGE;am3l;ib=e}#0{82%*6>raNS#{MS5JNoPgPa6J5#6ka_x)W*VBi)yb zzP`0Lw8QWW#Q$x>FM|GWhBrjKolgzF33221EAb-bH4XJ=ui-zUKXE4^N-w-A<}YIB zKhA36yh`|R*gewdSHu4kQ}FJFOM5)S@G6woXv6=E`Y_q>8<5}WhW`WOOO@dZF>je; z_!k)OE;0Od#7(ZVN*s3c1}&?N{y6jl_Zt2h%KguV%X#0khRgHruNqzf|M`7Syof(n zV4RTiIpOCa-91L1jd76Q1EuYh!2cGAhuCS4`hTe5|3SL#4L=0^YPR98Bi+7+pM?4| z-0*k7`TbDZ&vLYj^9+~zH^cBJknSwQr^5clhS#Hf`Mps(-KNMFzc)(rI>cGtpDb}Z zA14Hl8U1aD=L?2+^=5-N3?Gd8{E6X@z@Kjo&qqJ`i{Xc19@Px(O#JMIa%^k(ZD@DL z8Gah#ChsK>JKrE*{fxdZ#&;P%MgJr8XB+)5;L{CHLp-Yue*yl;`wGOqbbFT@{Xen4 z!tf{2pWkZuaGV$1WB8Hq=Mlrp!9&dV#UE*3nT8KSeh)YNB4nV0;Um#*yBoe2<v7gn zY|I;T4X;JI=NjG#{@-Z$xv+DG;d?M|eA@5_;pcY4*P=eZoq~UAxQrLy8D5C~@E60E zV|>g&KOyn&fpps#z82+vvf=U`jnfR@fc8Gf@Tq9OV-1(_GT(4{Z_aGPH(;E-&Tx6Y z<tD=$(B9V?z7~GoXZY{P@1IlfR}J5a_WOb1zk+{h_)65npHlEZ#u<uNC;DrK{R0e_ zeyyG1$D?05!SFj#?p+Q40`;W7;WBR+X}IL~Y{Oe2U+1Ub#fHmyU`+}>&u|&9ml^&m z_OCbmMD*ut4gU%I>kVH4|2G-_Fv{_H!@DD%I}GoG`t!Nr1t^!V4d0A(Z{UVVi?m0n z|F;?52KoAn;l0t%zHYeK`Pgu=^Sj|w;r}VfH-FuU{+ePwd3p-&{(%?ezx=LGzej@Y zjEA4a#*Vy)Yk}b%(SKcO_(0U#n+%uy-fegb*m=V6w#fgs6#Q+&rN7nhqu_jXgZ=M~ z{&4vDo8gndTVVWTH`vY!j4$mB9{@j3NWr@qUIKs4FkIr3WB4?TQ+bAOgg?cGw?jRt zH9QM;78ow$%aw-9`#5eg{9KGjcNzW>;`XrN_h9^e+VDFO_g4&`j`96{!{xm$Ul{&8 z;`x)|+t81v$@M3c<IR{~W*Yt`_K!6DYRuC*8ZPfGI?eFEA>F}-e~kJ3c*B=tf2!ec zp+71&{2G*RgW;DW4ogySNk{6lw3l0rK8AXAui*{oXC5`YALjGV8{Pu-<Tb;i(0^q3 z%ZT&WhR4t^?KAut%r_#KFG#))g8zpYUV;9+gW*@8-gGzoIM_MU@c4aX!`q{Liw&3e zAk-TEGvc|x@Oc=IZZcfvEq5D!EBc>@Q}AaDmvVpA@GlXE4-9_-^ZDI|OMkW3a2dbS zF%C<)$nUgU8GbwJ?NNr$#XS6E!#_a((97^;s3$`V?}_;28h$DD2fR!(T;}H&82&Kq zG#Gvq=CN`=O7i<WbSsSh8uY`f4PS!(@IJ%$pudv$sEGZK(7yg+^fE5KZn#|c|Jd*^ z(a(HixLnWq+3@D5CmCq3;?E%{uY(Q$1obD&@XaXq&W86wyX$NCZ?HeYa+J#?!{xm& z1%|%`J5`21?5jgC*YF(Fx62Hd_fg(xxU}~>4PPnaqv4&<4?JV|Xq4|?4SxXj?L))I zqhI~naJjDdv*F((4$Uy0NI8Cm{^t<GUxfa6!(T%EJk#(ks5fH`?+E|THT-nchjPRF zA#M$ZKMQ`b;c^~(o#FESj@t~s4(UE<cmc+jCk&VQ?RLYZ-+s?<>F2*N{94Qt_8Q(B z^)N)ck#hM0{cIb<TVPx~It4%3@N(Ec&G3(4e~{r)f5sZV1^qz2;nIH=8{Qt{?}diT z{7SAHNq(23d@nP4xqf<s;Xk6@-e$PWZ|^r;-skYR;k8J2yWx8fw+{@LbX#Hk7yoCV zo*!xWdD!n^xQwSohR;RZE--ux>Q9Z~wP<$@hM&WZ(Q=vLGqHa|3Vyrc;^%{ge~x<i zxZ%Cgk8LyjV8rJ$!>@q;yA=Ev!?$4k%0NFY@t1z1jp5?|F@`^a_TI_x3GlO*;c|Uu zu;J40jWawA{Y-)3osn*(;jdsmP-pmqh|g@p9|2!r_*UsB4gUr6kSh%T58AcdUzK?F z!1!{b(PyDv-D>z2_;ZKhZ$W>L;qv_3gNDodM*nPh6!rfZ!(YPwtA;PZ{7~kPk}tWA zvD@fx!v0>v??BwrF;5XY!x5iWh8Lk-9A&uF+mj8K`MJ!4#QxowCk!!qnV;txF8%5S zhL1!4rQgHWiTZ^P&~IF2^u57X8GaP%?Hz`9LH&8a@YBE_GrS-8^M=2S@n|mUuf*X` zXz%hom+(&L|K+`E!sWfUw;DTg-SQs8zr#G~5yR#E!p|7~6YBXZhTn;P<2}Pa2j6A* z8OYZUDfn-O{|o(KbJPpT?;!LuhZx=i^NiyR&*lSZ>1?>fr;p)Zpq#F<9C5qJaJdh6 zm*ET1jvh8V6YcbA!;eJ1UNKz!eBbboe71rw443}@C&T5vqG>1}iDzf@!<mM!M7@>w z=866(q$~4W;g_MkoM!C&1@RngxcvKw;|(8)^7_K?g=jBn=!YcTci?9;!*9d9;y}a4 z!Op>ke+K^#H+(+&$72nb>t81tz7OTt&2X77^*8)^_+M&xYovR#;g_IYY%%;h#O+1H zOL1QFy5UbFz8@Jbc78B?4E+3;;VV!delz@DoHvE&Kcu{59@*URchN3d87}WPl=B<0 zBkxf?&gkX(!l@~^%-6(@w6CE?KN97bYxow_pQ(mFg7Lb{aA}WM8Xlm1t}<NiudOp& z<^dZFKLh=qeve`&DifK%Z8Q3xpnuEoGK`ylH~cL0W8WHnAIe+5kCD@r_XTC(IEk~Q zdywG=A>E@5{|fc|WW%>(ygtqF4QMZe46i~tjx~G~#+!V@|Hcl}Qf&CU=pQaL{3?uV z7a86T_2DwZFGIQCV0anwdz;~Rz|Z>)Z-e&rnBkpJE`KrnLX_WYhWADMKQ#Py<m*er zx1s**HT-GBEe-bxrQF-YpG?E$zOvje6}_~_9!7sR;yKpvndsl97%tC!)fq1BQQjLV z={|$}TxIk%nBV@v@Z;gnM#D!Uo?8w7332$$aPeQ>8!7(Wjrrccjb7?uv!i`I6@3K$ zoM8AQ)c+jA??QiDX!rxr*BJg7;&8Fy=fY3@{>e_{T37gUi_vdJc|B^l%;%poT<-h- z)$m>LGxM1J<1h*B=vc!SVjgme;XUDxexD@!FX@go`eDd#zTt9STw?g6@Tb=Bj}gyH z3}1-2-DbG>bHCx=pd24FT&~Cd#c;Xq`kLVq{|^n9ILkknE%j|L{BM2i{_*dC{^3Z& zi_!ncdnUzB3(Tv#8~teTA%<Uues8?t5}y*o??Jyk({S-~k>T?16I^My__@mP^*;N- z9}O4#4;wD_pE6wD&%DEMxli_?;WAI&3C`19R88kmlPvET$N5CR={}oh`5n=tdIm=r zF8{7sPjD%(ff&EeG<xg?=PNy@+lT&msm^jM_nZmyoBeJu-|+F6w_j!Wli=4X-id6C zz<lgh#o2ym1mkwaI}(@WzAV2b`5J>S9yR<2w8!VbC2lW4|C-?);pZ-6N9^x0T<rgD z?3@WZ2OJl;Mbd2sez@V&!B02*Qt+XM-vXWoE^&AW<r_76`TgMnrRO-eMf+N+cqig# zd$)sY6lcAhCtj~O>+=xjHHx$TAoS1c6leX{7_T2xob?Ytzfp14Uyu6ml;W&!jsE0$ z#aS=!_5Q2ktgnUsO~qON9>$l?6zBTZmHv47Mse03bb!ObzroXJmt8yqejd=?f6ttU zI%F$oZ@5=cJ2RY*<7J%TXf8oi@pRJ3?}8Q>&i|e{FSmlXpl$Yl8m=3xGx~+lKd<y0 zw>J^D*9{+@L0{6c$M8GBgX8`8oG#mu>&%&kPs4oRRKw-|S2u8p^TY6SxZ-R=`oqbJ zvvdpeRfc~CzS8isLOO_+2Mj+C{5i!r-BX=92;NYfP2U9l*M>g<9-QD0lzP%0c3LaW zc3y$LgW{a-Nzk9BIP2wiFQXM_J%;gMisGzKZ{iKj2A6trA%97Wyth;0FYgCfr}SLD zf96DJxkquXZx>@eu-WiIXh$!COB^OUD?#v@(GSG=<JXFFx`&|u`PuLX!JBpP2BjXJ zhV!E%!6jd7n|NJUrDy-8|L<?O^#3CiXMe7R{jtV=9_&vsycoP%aSmm7?@lmVaaX?3 z-)i`;;7=KTTvKo8Wy3E5m-l~49Nq)}-RQppm-l>%{#Wo$oOxP=%kPm#flIwgL;pYC z=v!y_<7<?jH~)-y)+^5CBG+3MD9)RQa6+_PWq1tyTE*Fp%%5*joHuttf1Bd0m+Le4 zDbAaD=vOxxF8^-X6W|h`?iq9tEpHhf1^?FY+29d0e73{&<UBS)%VCOhJ-H70E{1Oc zm-mQ@KYs<!Q+jQ`3Y^2jaah1#(lT4=IbC^Q!Ocp4A`8*p?=id&_ydZweYu|SnBr_l zo*#V@T>Re$|36ZCwzD1e?MtI~!K3e6@?cL3=Zoz>34abZ{9oY5D6aiHS#h@073W#m z;NoYyX7nX3<CLE59EE-|-{`ZTm-mi}pYve<GG&L;eFXd_!@mPxZS41g{U?>4{gHpC zWSh|sg#K%#=X6iP1m$PL&j<fqakeklPnw@hJG4l?o`Sxe;m4r=KU#6NBi9EyD$f2$ zx}6ngy*ww~TXEK31p5ONXZ-~jI7ceZ`WK)d3ohk574ey3cm?<@!*2t>PH{%ku5VYI z+t<U;Z#H}f`0Iwt?{>Zb=Qwk|ZfZ^+wCpi@x!>KEMYOP<^LrfXXM4l%0Y6D`-rR_G z*IjY8(;e3t1{yBUMGaG&H|4r<uHtMb9oOs5R-8A>alP(*#aTZS`eMa-Q=WUSQJnR^ zLtn2rZ+?XPFAEiCz1-iqSaIHz>vGE#XT8Mj2F1CFoKJte{6TTvydLB1or<%azhdGm z?}?RqDA!e9GWvPA-u_o`(Z7lDYmedm(eGuR!d@ln!#3DC7+ma(guc7dbG|mXqv_v& zRGgElz<FzqvGXhJ==aBReh<a@n!G<&(v6^hTc+%Dx}VS=FDn$+>E342-3mL8DLtn< z3+X;-^zwZEM}|*|xMYKW87{w1Yjdjqp8e;hTj+O#qZH@%el_fzt~l#2gnp3XtiJ>L zsfx3HKJ@Y)T8Y~x=ocCNGU%^RobA5?{auQ){gu#fP@MIjLcd*c*53yGTZ*&(U(kQA zIO`vP{ujkrFTc+^q_Y=DJfDF6SjAc2yoLXwui|X~4d{m|&iZ4Zk1EdkFQ6}1ob^4R zU#d9ke}(>P#aS=c1Mg9s_41yYhZSf2G}wPtan>Kh8K>o4#aUkq{f~;XUVgXoo8qj$ z6#91Av_p%;vk&aISDf{?KtDinwlDu4vAhSE4`=;D&`&pd`S*w`6leVl&|j)J+s}tT zD->saX-oQ`Wxe98KM(ppE6(~Y(7&cQ>&u}3L~+*t1Nwg}&U*Rxg`0Mv9a<#6^4w9D z;;f$!`&|@g`-KPa(e!V0D$aWO_kt%W&iZ?xuU4G(^6&r7SDf|lLVuIute5xu+@Uz@ zCm%>3v^=Re>*c!QD~hxJYUp<>&iZGO-+w92`gPE^=}J4au#ELvp+8P>*3101kKspW z(wDT12j^<jiT-{>znyRN^4`BWO3(fL`_Nx%cpu!)U1|7h;Oh(@igE28aLx|<KMQ_7 zsr2mU82aO7o8fYu;SI&v&zE5TJ!5|r?C&%B@1Xz9=<k94&~7gIc)fiD{8Yos!TW+s zoCn}K)lj3~0e!L3v;Q41kE%8Ne((mxIX-e9d6D95=QPast}%QO`1OjjowQc;LCfum zcclH+sBe!b&i1=t{{Nie6Tr8EOZm2d{Z9<<2mZU^XMrD!3qE2;es|v!T;eSC<V?e* zo{UnQ{l6K0jyLu<Al)jXe+v3KqkkOwD-3@Te68VoQ0|)yp9lRb;F7NsaXupN8<#l9 z@7ne$J?CpL{QOOES5FS2FKLPN@N2fu`bjt+IZ$!duVMi$?G$JI!_c3sIO}WCj(RH2 zdij0XP{S|8a{yz(C12kn4rePp*TaD<pyfiv+5QgLX-Hw`2E*@e?aT!C8~!->UkrZ@ z{6oWcf$uf^-{1%K^yx^xS|k4L!8yDfw_DJ!b~bu>FYZ{S=lq_D=LRMy&UUt-T&5|` z`qj|a8vEC^p)YBfqx2l-g^2S?#o5j~uyacaJDUyfcraTJf)5Qp13Wm*e=qTo=N#G_ zF2AD~X81zbDKmT}_?3odwe{)U4bJiBd}STu`3A!$gFj~YCh%7c?}Gc*?-;%n{O{nB z->!%FbbmGaHd&rG?d8|vXAXF#;rD_cW_a`C{P9_amw|UsoXh=bc8r$pigSEkgub8Q zVS6VJh8iyS?Zz5j4gCbgb-Gi**$ti#EJ1u46zBPmyk~Hc;;g?O`c;avUjALDb&9io zH1tm?&iatQq-C4pj0&LNsW|J~LI0iNjB258emd>Y!uevo{Cn#ME6(~ypzowO>*e1) z@1r>DTOUdvv`hk*dLsW`V7cK(9PjnDh8Kd*HT)9rrH1bWzf5s1$L~>pRw~Z*=g1R$ zx@!zC0bd6$<z9_^J!`o9e&Bt>Z-9QU;irMO?d{VS`#Zq9fJ@vSgg-+Kmw&Hrtl{V4 zKG0;t=YvNLe-XS$agJLS>d%FWbKF|<2Q709KNoxfxa6zdVP1cw;gi7E8vYaF@RZ@p zp?@D-;<EzjerEWG;7#ygjOdF`^8OrX_^sfF8omqsSi`$;kZ9>>_yq9IiZjYZJo_rn zE<OnTncxz)W81OyAUMbHVc^w<&jG*8@U`Hp4Sx*r++g?y=(mGQ+_G@p`Ax&Cz&|y1 zzJZ;?`ucpZolf*O4)exiz$L%I;a+#9(sO(shyAgJKgGsqIoI%g;N^y|JjLs)6lbYC z|2bQ6PIvUFUO!)P){n$I@G`|&{}l9BE6#d({_|GD<++zf6lXj8VCN;p*^b;_drNWF z&&Tzk&lP9=x47={z2dCD1Nyy+v;H;I&y0SwLrV+#V=m8cAEY?jc`lniXgO4I*2{CV z$0^SGaa~wVa~s83|01p@$iK(I>9W3QSNfo(m(lM=JsG4p>o0(QxZ-TT6xZR;Qk?ap zab7nCT<YOdus>btxrwetd}<YEJD1>mX0G91gD*9_Zx1?%mdn5;-4BrN2Bqh8cOc!z z6z6;m!+idE#o3=`nAg5y?8|-hx0Igk4-Dypmd_PuJMB($IQY)+e&9bUuI;4v_s2=T z-ehC69BcTE?LF_QIL|BO-yJ?faSp+spr5EX>*e1GEmWNKA3#4}an{Sc=mEu9pN;v$ zbBgn+h`fLK1I5`+4?c(%`S(yHzoTHM^#K1pbJo8IeMiL^<s&`=6leW|(2rG|(Ol@u z6lcBsJF2S`XT3aEalhiMm$*HlIP1TH{g(`HauR(>%jb%-omud6kKyv~tEQdd4s-KN zmYxAShbqo?<lj*}QE}E!gub8Rte5!YD9-wN=t~r5z09{)D$e@Lp}$XYZGVg6tX~iP z+lsSZ=KmRI(he<B9~N-qpyfElS$_>1qvaIE8C?hcaK%}_1o~XX8QlqevEr<k`dP0y z>tBWb62)162khSn&iyb;<#$GF73covZ2IHnKE=7}tU>?qnBl{FIeD<v@Oj{`D9-kG zVf=bmakf9;bZ_TFaEbGEM|!?T>Di9F_vhe&{(I4{g}$@l&x7YH&hfbx{p1YAIb?4_ zzs&HKN7I+I+&a*$;^V3K^CY<V(+>J~4et-$WRSPRdhVAtpu7%MoY5HQdl=sJSbu!J z;lse|49^9>!tiO}w<yl>k$*4yA;sCBGU#6cZ$XU9@oSXh+lC+2o4%ywW5dq`-)Zb$ z1p6%q`{UAR#p&+L^84KkKkzuua|}NYe7fSCuRN6dOvTfQFNFSDaLHFO{Jh!lmEh|P ze+>K{aPj{J*xzCJ>La}W9~!<De4pa%zx2;dhxp^zKJz1xuOkgV4Ez+u(@CF>dOlEb zw(~Q8NlUKcjM_n8tT^kh3|US6wBoGKg8nMQ&ji2I@G9`96=(Z+tTK4paLzX`pBawJ z-oY=5vp;iTztvE8nCs8k{`bi5v5GTldX(3VF}yW+k>N*!FEYF@_|=Bzg5PKOH1JJ^ zF9m-^arR&S{fiG3XaDbney`!rgC97|=TGYAkKi2@XZw9auRFtViGPma694Invp<)k zAG^kIxo&)~;+(FGQ;#Xmb{>SCR~2Wyytn5g#aZ78{mIXYv;GC-tJQGYp+(x!v*7Iw ze-ymC;%t92?2k5FevcGYoYQRzJJpJ_owix@LCZYD&&YB(xKVMoBmKZS!=)eCY`F9T zFDcIH&Vv1q6=(a>5Bx)M)?W>MlM%E-i^Q!H^3_&x*59ASDtb=e@OQEt4n`>6jF8l~ zX@*OEyTEX%Z*vsqbialDYZPxrd?fr_qd4ow97i9tY*w80O&q23Hp9iAj}>P-vtj2a z#o5j!NVmyIZ;+2?{aer<t~l#uzIU?Xtp5k}LltMe%s<B|&iZEU>4TPX#aS=&&pO3f ze>C*V6leV%@PC!!tnUx~!-}(B+V8W9vwi~f?<mgtp0NLS#aUko{XZ3Fy_93dDB7V# z;@RW`zki(Kte0{;-EcmRm*I+Yy4_&sT*cYW@$hqo;;bJJ{UwUCUgEr5an@Hsf1l#4 zmvVeWan>(`{sqNZFZJXd#aaKv@$^B<UT~Sue2n?YFGl|?^aqUg$4NZpcMfgA*-l6L z`yO#PLGcrbr}y#4cQ(8Ocz4CMok8G|?#CUxo%0OeeUj(%lpRi2u9Ge@`k$b`#_;OH zy`6^*zY~1B;qvcOd}jDTGEY;S%SC>d8p-kLNWOl+_;s}6tl!IpMoVYK88th`;b5@h zte0}1pg8N>LSL#l>pwzyH7L&d(a>M1IO|`BKPweybP@CqDb9Mi4)dYntiKw1dB8^E za5MNJV@N~`bG9S%u?~u}oj0KGt2pZ=Zle`v{kPCZ6=%JSYt@Rg{tswhOBHAR7l_-{ zinIP+=<iUR^{5WP{fe{x1?XQ>ob_+Q{wIpF{(b2GWq20aMVqlCqDA5+*DKCYob7b} zf9kpy@S4v%4&VntoQS6GU1iPE3k~WPB(9OV1T7M`xm8HD$nuCTLrXClLsf<3DOT5c zv^1Ns)@V^#)$ka>=CbBdO4}$kY9*L%@9(_dpZ)TEn*Z}8=gH@M&+q@f?|J{1lXLP9 z@&k>_diC{PhH=RcMSiAn$?NZ1HXE1xY~(*RF8Q5ur(3QY7kUHvYW+fY-*5jV<m($3 z`X2d5$sdr7-Ys2>%X;;^s4w|x)E{nKs5|ORGA?z#LVlKUp;offa!bB($?NvG!MNmm zApfy($?JappmE9T-=ADGE_pqUTs1EFOw_N^-~Hegoe$ccI>sgcXXKk0m-;&X3C1O_ ze`hiT9&{GxzS@PmZ*IvV$IGn1%jC)Rd_I?aK|}9(<a!;9RpgO)owA2quk(J0{2o51 zagsbk2Ffj8kXOOyXYP_OmS57irRD&CtK*>WH#H;I_mvXJ_5GuM<a28Jx}(XH!@Orz z;M2*25k9|&{2a!AIk~of2f4O?AGx-_m|U-ebdy}$AC_8v+|;AV^>dZ+<Vl!sN#r`O z#*i2L)djN1$4B`)=8><#IOoA-ddU30hV5mm$;&RI5a%=7jmvfsiT!zzammMbaNpdr z-?-#^;eFd<#wEWD`IE*azYOg^Z(Q<YI=XLe`O3KD^?k<c#wD-sW8E|^`A=)OZ*HlS z=5K@UM)J>h@;_HIE_t0-^~vXBNALu>UjMw6ajCEGTeLGS_4V^?-Hb~<t&98Smj2{h zx_TdET<YA#=MY94mpUhq&mupZ<m=2J{}=q%#-)B|JTHrkOZ{)U`8s*VC9m7v+r}lo zG1=$W8JE0nkA=o1|H;!nzty<pbvxZ<T=Lty`+Sjc$?N;qhmA|VUJsu?W?b^CF>gzZ zOa3_W=Z#B#NNr!|igC%`LjJmO$?pyN{C|u~zC};(l?M7-iAi3smsQia<X0hI53bww z2ziiOqD@{l^%(32nj4ooCs3yy`QTns#eH6q`~p0Md~%A<r;`5-KE$|f&uHV)p0RlS zHkteu{1x*3ef)aolCQ`4`Xcg~IPWYV58!-mHC)GYR8wF7L&~p1{uA<j@WbSn;K!)` zV$?4+E>lW>pMRZP&-a3Ze7mHblHZH{bF^_e|Iz=$+uXS9|MhczJ>fFnWc+L5Jgh(E z*W&%JOv<-FK8HLF{wn!Y_#CQ#6!ljax8ty$T*u)favg^w#_c$qH7?`u1J-+sJR8TU zI)h!vEjm6c(f&r{yWx+Me*uq!>%3Zn`rVA%{`Mi){$`MCf2SC?{heoA`a2W*hjqp! zultAhj7xqo^81ZTzA^SE#l|JCe@A-RxUFAC-X3)-4{;B6i;mAWtT)=YU2kLKvfdKp zlZ{LMS=3K8F8MpiPa^Mx?Qx-T+y0ftrOrU)KQM0F`B&qT--P_<<a67(JKb`Hd<neL zP=CLSkJNANe+)zzm-<1Rzdd1G@>4MmiR9Vv6ys7S3w1J#+i}P;F8TJD&vT4Rej@7U z8JGNc<Ub_e0zXc^3;refA26QZ!h^219AB1Ty_J9NesGJp?BA;5^-lzOS9o3Wui??; zZw`>E?)YrnuD7LeS?@vQ6X80~51{?sOkV0-L;F*WOP!`TuN_W)0iHp=EX_U0Efe6n z-u!0X=TN>QjyJ!d{0ig?OkUcVRMpqnKzZ%gF7kG$bIiERlU(%oGvhK(^z)6S<P%Zn zo^h$O0ClPl^X=09&OrWW<obEpj^rIN{|A%n=Uk_d_r~j#*Nsbij!6UDQeZr^eIdWm zxXo`jF8Q$Lp)!FzaGmGb82=;2WuEBy=PB|`Jiq72m%zV->$p9P^+pZ%>t}BW*Y>PM zdzu)R_8dU{cH~2F-0ez!5uQT+0*)W4<fZW8<WsOe9c^6Zt+sQ#acO58>_=WQF8P>h z?wea?84vXf`Pbk&K3Oe%eyPbzoov)uV_fPq#5~?ab#_1H>ufdoQ2SA*$hg!QiaLkL zi{U58yW{yj1K0L%#q(Z9eiUAHgm0JTOW?K1%itZ!6VR`L<l5g%@_3BrH1coYx#T~< z*O14y^zGh7-Wz^~{6+Y8<TK#Gk>$ss6%Ndg7?<r@k4H}#m+g8g@_osd!pD>UDZ#IA zHu)a-8|0rS`uuw1c0W^ST-sBmgU|0aZu19?OMWfJ;VfMC199#vyq>Rf$+*nV{kne{ z<?q+|a}9NBz;%Ce4)gpW<5K4m>co=Q!hCH?9uIE?*YzI2deg~E;j_uNwejtqZ|aBk z4>Cw@S#Dg~sr#dK<a^Mb&E)6dTa4TKMaHFmXUxk(<a^;K$lK!iI1Sfv2;e;PI^}g9 z+@yR9<RhMwUjP5R{S3zEQS$%76O3cXLXS@|F7qlFAL2kdc?0;bj7y!RIPT{fmpV<5 zUqybot*^hCybS)aajB2ZF>uhh)c?AJuXEP8<n_GwTjP?C>ge;eNBdhH|0eJ_^0x3q zxNaBO7`$ZTvfaHO>FcJEKV94VSn}45yk{Agd36r+<R#-$KjLAZf7Q6;w_|?HgKNKT zWBlKt{9KI7R>~(}KX#n*n~*<E`8P2>Wt2aP{5{HFMn0JC`=RYDgFi-|*2(9R$lpi5 z1{;^Bq!H%fXyfv{XJB3}A=ke%TxVSBG(ep~<5K6zC*3!<>`V{c+<(2C3jZhhBKUXY zRprTaOK^<8)p5|@A2ufc9_P<V<a%B@oO}|F`!mSXaNN%`F8z%}f7cq9{*FR^2l*@T zV)8lgQu2lHz}WKr{T)1#yaXG3tZ`}QJ^Y@nn{nB+mc#oRuk5@H_Iu;V$H8AGk8zKY zrGPvS`HSSgg<mJv<5aB-U$2t8sqDV=?|)+9vOkfjp#L|qIpy`b-_M%7Z0|d;U5y~0 zknZkuOS*BXU$t(C1DVF9&bD;#*~aB~7YO(MvT>>NjORcuxn8GYnQ^J3@3+2fT<Q#~ z?+d+ST-sBb?!6GM;}+A|`#$nE@DlR=@LR@Z{^)sNwdZ|3tv><zM&yOq|HPArA>YHe zou3no%ls^@;@6i054s;^9D3IAKHKEO9LZdfWdY?g<$-P~puF@$merJ>h1Y|dDeu$n zeIClE;=Hlg<YP7LZqHKwU9|ra`Kem|LH{QIDW3PhIDfy6Lo|+?k#OnHG#?3luTS|? z=vRC4-#_Rd)S3Jwj+=wY_5Z9)BG0Vp>ntSKCT$=u2=n)RM4pI#og}}8@%fDW4z{~% z<h!c+`cW_VTOGG>jAv8w1rPb$aPqte?^DS2|Ig)-Klp&pZzR7Wlie+Q$@TXk{~%w{ z(C06cpF*8VFZ%nnU;VJ&>f}Y}*CXU-u))N$<GgDac@gqC<e3<seDW(8=Z)n1P=7yp z7tFWw<lP$ienyNh-{1Dwj^fDMV!zRYeELuP<I~B<pgq&c?_mC{B!3Iz`2l&D&S!G{ zKO?8f?_$4kgZu=x$66E0_xEsh|8pGqr3T*nkUxj*@t5TD(ay!>`hP~=BOig|U=ev; zY^NpUYcZZz$@8oEcGj9$zF+U6on6TFdWi$cTcf|z$o2Yo%gB%5dEZ3d6#Y6t-W%h8 zhFq^Re35)|4d0)z%<}!(f^n!%u7AJZfxH*Cqrv34m?t^pM=%dpleffnw39p=?Kw?; zBg(h?DtQUUxy~=j_p3fUj{Fw3yFTOx@Vuv!&kg#zlgXpdo;l>3;ct=a^*#PVz6<-G z3*-^lkKHC8fcF0p?ULguHn~tkV<UWf+0S6V%N~yQvX5%@<8}19ZJaNvAb+C*f4udN z*B@Ge_rvQvUGGSY&%_FRUIm_zSbn`)XHW&6U4ir8J^8AEKyuIW_0gTcYZds7k>&GR zM}PmO{Z(H$s(k)7=EFg9&6ic+nC_wX?;g{zyTx?4|N2+&nt=64doc8&yJ8R!vyPYX zArse}p8IKDuS=Ovb!Ma3-^rtJT+r+PX&wE41S6$^Zc*3YbLNoiMze@K1{>1`@+9~< z@~CjXz7(`q*Q?j7%puq7EAC^*_8Gu9YaPAbS~GIJZdekzUcXEKo<{5Fb(xAOuluEz k7+1~f^>*^f_4+V{<a+%U{l6AkM?Vkw49-*3_4V)n02E{Lp8x;= literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/modules/generators/mod_cgi.c b/rubbos/app/httpd-2.0.64/modules/generators/mod_cgi.c new file mode 100644 index 00000000..32902c10 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/generators/mod_cgi.c @@ -0,0 +1,1235 @@ +/* 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. + */ + +/* + * http_script: keeps all script-related ramblings together. + * + * Compliant to CGI/1.1 spec + * + * Adapted by rst from original NCSA code by Rob McCool + * + * Apache adds some new env vars; REDIRECT_URL and REDIRECT_QUERY_STRING for + * custom error responses, and DOCUMENT_ROOT because we found it useful. + * It also adds SERVER_ADMIN - useful for scripts to know who to mail when + * they fail. + */ + +#include "apr.h" +#include "apr_strings.h" +#include "apr_thread_proc.h" /* for RLIMIT stuff */ +#include "apr_optional.h" +#include "apr_buckets.h" +#include "apr_lib.h" +#include "apr_poll.h" + +#define APR_WANT_STRFUNC +#include "apr_want.h" + +#define CORE_PRIVATE + +#include "util_filter.h" +#include "ap_config.h" +#include "httpd.h" +#include "http_config.h" +#include "http_request.h" +#include "http_core.h" +#include "http_protocol.h" +#include "http_main.h" +#include "http_log.h" +#include "util_script.h" +#include "ap_mpm.h" +#include "mod_core.h" +#include "mod_cgi.h" + +module AP_MODULE_DECLARE_DATA cgi_module; + +static APR_OPTIONAL_FN_TYPE(ap_register_include_handler) *cgi_pfn_reg_with_ssi; +static APR_OPTIONAL_FN_TYPE(ap_ssi_get_tag_and_value) *cgi_pfn_gtv; +static APR_OPTIONAL_FN_TYPE(ap_ssi_parse_string) *cgi_pfn_ps; +static APR_OPTIONAL_FN_TYPE(ap_cgi_build_command) *cgi_build_command; + +/* Read and discard the data in the brigade produced by a CGI script */ +static void discard_script_output(apr_bucket_brigade *bb); + +/* KLUDGE --- for back-combatibility, we don't have to check ExecCGI + * in ScriptAliased directories, which means we need to know if this + * request came through ScriptAlias or not... so the Alias module + * leaves a note for us. + */ + +static int is_scriptaliased(request_rec *r) +{ + const char *t = apr_table_get(r->notes, "alias-forced-type"); + return t && (!strcasecmp(t, "cgi-script")); +} + +/* Configuration stuff */ + +#define DEFAULT_LOGBYTES 10385760 +#define DEFAULT_BUFBYTES 1024 + +typedef struct { + const char *logname; + long logbytes; + apr_size_t bufbytes; +} cgi_server_conf; + +static void *create_cgi_config(apr_pool_t *p, server_rec *s) +{ + cgi_server_conf *c = + (cgi_server_conf *) apr_pcalloc(p, sizeof(cgi_server_conf)); + + c->logname = NULL; + c->logbytes = DEFAULT_LOGBYTES; + c->bufbytes = DEFAULT_BUFBYTES; + + return c; +} + +static void *merge_cgi_config(apr_pool_t *p, void *basev, void *overridesv) +{ + cgi_server_conf *base = (cgi_server_conf *) basev, + *overrides = (cgi_server_conf *) overridesv; + + return overrides->logname ? overrides : base; +} + +static const char *set_scriptlog(cmd_parms *cmd, void *dummy, const char *arg) +{ + server_rec *s = cmd->server; + cgi_server_conf *conf = ap_get_module_config(s->module_config, + &cgi_module); + + conf->logname = ap_server_root_relative(cmd->pool, arg); + + if (!conf->logname) { + return apr_pstrcat(cmd->pool, "Invalid ScriptLog path ", + arg, NULL); + } + + return NULL; +} + +static const char *set_scriptlog_length(cmd_parms *cmd, void *dummy, + const char *arg) +{ + server_rec *s = cmd->server; + cgi_server_conf *conf = ap_get_module_config(s->module_config, + &cgi_module); + + conf->logbytes = atol(arg); + return NULL; +} + +static const char *set_scriptlog_buffer(cmd_parms *cmd, void *dummy, + const char *arg) +{ + server_rec *s = cmd->server; + cgi_server_conf *conf = ap_get_module_config(s->module_config, + &cgi_module); + + conf->bufbytes = atoi(arg); + return NULL; +} + +static const command_rec cgi_cmds[] = +{ +AP_INIT_TAKE1("ScriptLog", set_scriptlog, NULL, RSRC_CONF, + "the name of a log for script debugging info"), +AP_INIT_TAKE1("ScriptLogLength", set_scriptlog_length, NULL, RSRC_CONF, + "the maximum length (in bytes) of the script debug log"), +AP_INIT_TAKE1("ScriptLogBuffer", set_scriptlog_buffer, NULL, RSRC_CONF, + "the maximum size (in bytes) to record of a POST request"), + {NULL} +}; + +static int log_scripterror(request_rec *r, cgi_server_conf * conf, int ret, + apr_status_t rv, char *error) +{ + apr_file_t *f = NULL; + apr_finfo_t finfo; + char time_str[APR_CTIME_LEN]; + int log_flags = rv ? APLOG_ERR : APLOG_ERR; + + ap_log_rerror(APLOG_MARK, log_flags, rv, r, + "%s: %s", error, r->filename); + + /* XXX Very expensive mainline case! Open, then getfileinfo! */ + if (!conf->logname || + ((apr_stat(&finfo, conf->logname, + APR_FINFO_SIZE, r->pool) == APR_SUCCESS) && + (finfo.size > conf->logbytes)) || + (apr_file_open(&f, conf->logname, + APR_APPEND|APR_WRITE|APR_CREATE, APR_OS_DEFAULT, + r->pool) != APR_SUCCESS)) { + return ret; + } + + /* "%% [Wed Jun 19 10:53:21 1996] GET /cgi-bin/printenv HTTP/1.0" */ + apr_ctime(time_str, apr_time_now()); + apr_file_printf(f, "%%%% [%s] %s %s%s%s %s\n", time_str, r->method, r->uri, + r->args ? "?" : "", r->args ? r->args : "", r->protocol); + /* "%% 500 /usr/local/apache/cgi-bin */ + apr_file_printf(f, "%%%% %d %s\n", ret, r->filename); + + apr_file_printf(f, "%%error\n%s\n", error); + + apr_file_close(f); + return ret; +} + +/* Soak up stderr from a script and redirect it to the error log. + */ +static apr_status_t log_script_err(request_rec *r, apr_file_t *script_err) +{ + char argsbuffer[HUGE_STRING_LEN]; + char *newline; + apr_status_t rv; + + while ((rv = apr_file_gets(argsbuffer, HUGE_STRING_LEN, + script_err)) == APR_SUCCESS) { + newline = strchr(argsbuffer, '\n'); + if (newline) { + *newline = '\0'; + } + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "%s", argsbuffer); + } + + return rv; +} + +static int log_script(request_rec *r, cgi_server_conf * conf, int ret, + char *dbuf, const char *sbuf, apr_bucket_brigade *bb, + apr_file_t *script_err) +{ + const apr_array_header_t *hdrs_arr = apr_table_elts(r->headers_in); + const apr_table_entry_t *hdrs = (const apr_table_entry_t *) hdrs_arr->elts; + char argsbuffer[HUGE_STRING_LEN]; + apr_file_t *f = NULL; + apr_bucket *e; + const char *buf; + apr_size_t len; + apr_status_t rv; + int first; + int i; + apr_finfo_t finfo; + char time_str[APR_CTIME_LEN]; + + /* XXX Very expensive mainline case! Open, then getfileinfo! */ + if (!conf->logname || + ((apr_stat(&finfo, conf->logname, + APR_FINFO_SIZE, r->pool) == APR_SUCCESS) && + (finfo.size > conf->logbytes)) || + (apr_file_open(&f, conf->logname, + APR_APPEND|APR_WRITE|APR_CREATE, APR_OS_DEFAULT, + r->pool) != APR_SUCCESS)) { + /* Soak up script output */ + discard_script_output(bb); + log_script_err(r, script_err); + return ret; + } + + /* "%% [Wed Jun 19 10:53:21 1996] GET /cgi-bin/printenv HTTP/1.0" */ + apr_ctime(time_str, apr_time_now()); + apr_file_printf(f, "%%%% [%s] %s %s%s%s %s\n", time_str, r->method, r->uri, + r->args ? "?" : "", r->args ? r->args : "", r->protocol); + /* "%% 500 /usr/local/apache/cgi-bin" */ + apr_file_printf(f, "%%%% %d %s\n", ret, r->filename); + + apr_file_puts("%request\n", f); + for (i = 0; i < hdrs_arr->nelts; ++i) { + if (!hdrs[i].key) + continue; + apr_file_printf(f, "%s: %s\n", hdrs[i].key, hdrs[i].val); + } + if ((r->method_number == M_POST || r->method_number == M_PUT) && + *dbuf) { + apr_file_printf(f, "\n%s\n", dbuf); + } + + apr_file_puts("%response\n", f); + hdrs_arr = apr_table_elts(r->err_headers_out); + hdrs = (const apr_table_entry_t *) hdrs_arr->elts; + + for (i = 0; i < hdrs_arr->nelts; ++i) { + if (!hdrs[i].key) + continue; + apr_file_printf(f, "%s: %s\n", hdrs[i].key, hdrs[i].val); + } + + if (sbuf && *sbuf) + apr_file_printf(f, "%s\n", sbuf); + + first = 1; + APR_BRIGADE_FOREACH(e, bb) { + if (APR_BUCKET_IS_EOS(e)) { + break; + } + rv = apr_bucket_read(e, &buf, &len, APR_BLOCK_READ); + if (rv != APR_SUCCESS || (len == 0)) { + break; + } + if (first) { + apr_file_puts("%stdout\n", f); + first = 0; + } + apr_file_write(f, buf, &len); + apr_file_puts("\n", f); + } + + if (apr_file_gets(argsbuffer, HUGE_STRING_LEN, script_err) == APR_SUCCESS) { + apr_file_puts("%stderr\n", f); + apr_file_puts(argsbuffer, f); + while (apr_file_gets(argsbuffer, HUGE_STRING_LEN, + script_err) == APR_SUCCESS) { + apr_file_puts(argsbuffer, f); + } + apr_file_puts("\n", f); + } + + apr_brigade_destroy(bb); + apr_file_close(script_err); + + apr_file_close(f); + return ret; +} + + +/* This is the special environment used for running the "exec cmd=" + * variety of SSI directives. + */ +static void add_ssi_vars(request_rec *r) +{ + apr_table_t *e = r->subprocess_env; + + if (r->path_info && r->path_info[0] != '\0') { + request_rec *pa_req; + + apr_table_setn(e, "PATH_INFO", ap_escape_shell_cmd(r->pool, + r->path_info)); + + pa_req = ap_sub_req_lookup_uri(ap_escape_uri(r->pool, r->path_info), + r, NULL); + if (pa_req->filename) { + apr_table_setn(e, "PATH_TRANSLATED", + apr_pstrcat(r->pool, pa_req->filename, + pa_req->path_info, NULL)); + } + ap_destroy_sub_req(pa_req); + } + + if (r->args) { + char *arg_copy = apr_pstrdup(r->pool, r->args); + + apr_table_setn(e, "QUERY_STRING", r->args); + ap_unescape_url(arg_copy); + apr_table_setn(e, "QUERY_STRING_UNESCAPED", + ap_escape_shell_cmd(r->pool, arg_copy)); + } +} + +static void cgi_child_errfn(apr_pool_t *pool, apr_status_t err, + const char *description) +{ + apr_file_t *stderr_log; + char errbuf[200]; + + apr_file_open_stderr(&stderr_log, pool); + /* Escape the logged string because it may be something that + * came in over the network. + */ + apr_file_printf(stderr_log, + "(%d)%s: %s\n", + err, + apr_strerror(err, errbuf, sizeof(errbuf)), +#ifdef AP_UNSAFE_ERROR_LOG_UNESCAPED + description +#else + ap_escape_logitem(pool, description) +#endif + ); +} + +static apr_status_t run_cgi_child(apr_file_t **script_out, + apr_file_t **script_in, + apr_file_t **script_err, + const char *command, + const char * const argv[], + request_rec *r, + apr_pool_t *p, + cgi_exec_info_t *e_info) +{ + const char * const *env; + apr_procattr_t *procattr; + apr_proc_t *procnew; + apr_status_t rc = APR_SUCCESS; + +#if defined(RLIMIT_CPU) || defined(RLIMIT_NPROC) || \ + defined(RLIMIT_DATA) || defined(RLIMIT_VMEM) || defined (RLIMIT_AS) + + core_dir_config *conf = ap_get_module_config(r->per_dir_config, + &core_module); +#endif + +#ifdef DEBUG_CGI +#ifdef OS2 + /* Under OS/2 need to use device con. */ + FILE *dbg = fopen("con", "w"); +#else + FILE *dbg = fopen("/dev/tty", "w"); +#endif + int i; +#endif + + RAISE_SIGSTOP(CGI_CHILD); +#ifdef DEBUG_CGI + fprintf(dbg, "Attempting to exec %s as CGI child (argv0 = %s)\n", + r->filename, argv[0]); +#endif + + env = (const char * const *)ap_create_environment(p, r->subprocess_env); + +#ifdef DEBUG_CGI + fprintf(dbg, "Environment: \n"); + for (i = 0; env[i]; ++i) + fprintf(dbg, "'%s'\n", env[i]); +#endif + + /* Transmute ourselves into the script. + * NB only ISINDEX scripts get decoded arguments. + */ + if (((rc = apr_procattr_create(&procattr, p)) != APR_SUCCESS) || + ((rc = apr_procattr_io_set(procattr, + e_info->in_pipe, + e_info->out_pipe, + e_info->err_pipe)) != APR_SUCCESS) || + ((rc = apr_procattr_dir_set(procattr, + ap_make_dirstr_parent(r->pool, + r->filename))) != APR_SUCCESS) || +#ifdef RLIMIT_CPU + ((rc = apr_procattr_limit_set(procattr, APR_LIMIT_CPU, + conf->limit_cpu)) != APR_SUCCESS) || +#endif +#if defined(RLIMIT_DATA) || defined(RLIMIT_VMEM) || defined(RLIMIT_AS) + ((rc = apr_procattr_limit_set(procattr, APR_LIMIT_MEM, + conf->limit_mem)) != APR_SUCCESS) || +#endif +#ifdef RLIMIT_NPROC + ((rc = apr_procattr_limit_set(procattr, APR_LIMIT_NPROC, + conf->limit_nproc)) != APR_SUCCESS) || +#endif + ((rc = apr_procattr_cmdtype_set(procattr, + e_info->cmd_type)) != APR_SUCCESS) || + + ((rc = apr_procattr_detach_set(procattr, + e_info->detached & AP_PROC_DETACHED)) != APR_SUCCESS) || + ((rc = apr_procattr_addrspace_set(procattr, + (e_info->detached & AP_PROC_NEWADDRSPACE) ? 1 : 0)) != APR_SUCCESS) || + ((rc = apr_procattr_child_errfn_set(procattr, cgi_child_errfn)) != APR_SUCCESS)) { + /* Something bad happened, tell the world. */ + ap_log_rerror(APLOG_MARK, APLOG_ERR, rc, r, + "couldn't set child process attributes: %s", r->filename); + } + else { + procnew = apr_pcalloc(p, sizeof(*procnew)); + if (e_info->prog_type == RUN_AS_SSI) { + SPLIT_AND_PASS_PRETAG_BUCKETS(*(e_info->bb), e_info->ctx, + e_info->next, rc); + if (rc != APR_SUCCESS) { + return rc; + } + } + + rc = ap_os_create_privileged_process(r, procnew, command, argv, env, + procattr, p); + + if (rc != APR_SUCCESS) { + /* Bad things happened. Everyone should have cleaned up. */ + ap_log_rerror(APLOG_MARK, APLOG_ERR|APLOG_TOCLIENT, rc, r, + "couldn't create child process: %d: %s", rc, + apr_filename_of_pathname(r->filename)); + } + else { + apr_pool_note_subprocess(p, procnew, APR_KILL_AFTER_TIMEOUT); + + *script_in = procnew->out; + if (!*script_in) + return APR_EBADF; + apr_file_pipe_timeout_set(*script_in, r->server->timeout); + + if (e_info->prog_type == RUN_AS_CGI) { + *script_out = procnew->in; + if (!*script_out) + return APR_EBADF; + apr_file_pipe_timeout_set(*script_out, r->server->timeout); + + *script_err = procnew->err; + if (!*script_err) + return APR_EBADF; + apr_file_pipe_timeout_set(*script_err, r->server->timeout); + } + } + } +#ifdef DEBUG_CGI + fclose(dbg); +#endif + return (rc); +} + + +static apr_status_t default_build_command(const char **cmd, const char ***argv, + request_rec *r, apr_pool_t *p, + cgi_exec_info_t *e_info) +{ + int numwords, x, idx; + char *w; + const char *args = NULL; + + if (e_info->process_cgi) { + *cmd = r->filename; + /* Do not process r->args if they contain an '=' assignment + */ + if (r->args && r->args[0] && !ap_strchr_c(r->args, '=')) { + args = r->args; + } + } + + if (!args) { + numwords = 1; + } + else { + /* count the number of keywords */ + for (x = 0, numwords = 2; args[x]; x++) { + if (args[x] == '+') { + ++numwords; + } + } + } + /* Everything is - 1 to account for the first parameter + * which is the program name. + */ + if (numwords > APACHE_ARG_MAX - 1) { + numwords = APACHE_ARG_MAX - 1; /* Truncate args to prevent overrun */ + } + *argv = apr_palloc(p, (numwords + 2) * sizeof(char *)); + (*argv)[0] = *cmd; + for (x = 1, idx = 1; x < numwords; x++) { + w = ap_getword_nulls(p, &args, '+'); + ap_unescape_url(w); + (*argv)[idx++] = ap_escape_shell_cmd(p, w); + } + (*argv)[idx] = NULL; + + return APR_SUCCESS; +} + +static void discard_script_output(apr_bucket_brigade *bb) +{ + apr_bucket *e; + const char *buf; + apr_size_t len; + apr_status_t rv; + APR_BRIGADE_FOREACH(e, bb) { + if (APR_BUCKET_IS_EOS(e)) { + break; + } + rv = apr_bucket_read(e, &buf, &len, APR_BLOCK_READ); + if (rv != APR_SUCCESS) { + break; + } + } +} + +#if APR_FILES_AS_SOCKETS + +/* A CGI bucket type is needed to catch any output to stderr from the + * script; see PR 22030. */ +static const apr_bucket_type_t bucket_type_cgi; + +struct cgi_bucket_data { + apr_pollset_t *pollset; + request_rec *r; +}; + +/* Create a CGI bucket using pipes from script stdout 'out' + * and stderr 'err', for request 'r'. */ +static apr_bucket *cgi_bucket_create(request_rec *r, + apr_file_t *out, apr_file_t *err, + apr_bucket_alloc_t *list) +{ + apr_bucket *b = apr_bucket_alloc(sizeof(*b), list); + apr_status_t rv; + apr_pollfd_t fd; + struct cgi_bucket_data *data = apr_palloc(r->pool, sizeof *data); + + APR_BUCKET_INIT(b); + b->free = apr_bucket_free; + b->list = list; + b->type = &bucket_type_cgi; + b->length = (apr_size_t)(-1); + b->start = -1; + + /* Create the pollset */ + rv = apr_pollset_create(&data->pollset, 2, r->pool, 0); + AP_DEBUG_ASSERT(rv == APR_SUCCESS); + + fd.desc_type = APR_POLL_FILE; + fd.reqevents = APR_POLLIN; + fd.p = r->pool; + fd.desc.f = out; /* script's stdout */ + fd.client_data = (void *)1; + rv = apr_pollset_add(data->pollset, &fd); + AP_DEBUG_ASSERT(rv == APR_SUCCESS); + + fd.desc.f = err; /* script's stderr */ + fd.client_data = (void *)2; + rv = apr_pollset_add(data->pollset, &fd); + AP_DEBUG_ASSERT(rv == APR_SUCCESS); + + data->r = r; + b->data = data; + return b; +} + +/* Create a duplicate CGI bucket using given bucket data */ +static apr_bucket *cgi_bucket_dup(struct cgi_bucket_data *data, + apr_bucket_alloc_t *list) +{ + apr_bucket *b = apr_bucket_alloc(sizeof(*b), list); + APR_BUCKET_INIT(b); + b->free = apr_bucket_free; + b->list = list; + b->type = &bucket_type_cgi; + b->length = (apr_size_t)(-1); + b->start = -1; + b->data = data; + return b; +} + +/* Handle stdout from CGI child. Duplicate of logic from the _read + * method of the real APR pipe bucket implementation. */ +static apr_status_t cgi_read_stdout(apr_bucket *a, apr_file_t *out, + const char **str, apr_size_t *len) +{ + char *buf; + apr_status_t rv; + + *str = NULL; + *len = APR_BUCKET_BUFF_SIZE; + buf = apr_bucket_alloc(*len, a->list); /* XXX: check for failure? */ + + rv = apr_file_read(out, buf, len); + + if (rv != APR_SUCCESS && rv != APR_EOF) { + apr_bucket_free(buf); + return rv; + } + + if (*len > 0) { + struct cgi_bucket_data *data = a->data; + apr_bucket_heap *h; + + /* Change the current bucket to refer to what we read */ + a = apr_bucket_heap_make(a, buf, *len, apr_bucket_free); + h = a->data; + h->alloc_len = APR_BUCKET_BUFF_SIZE; /* note the real buffer size */ + *str = buf; + APR_BUCKET_INSERT_AFTER(a, cgi_bucket_dup(data, a->list)); + } + else { + apr_bucket_free(buf); + a = apr_bucket_immortal_make(a, "", 0); + *str = a->data; + } + return rv; +} + +/* Read method of CGI bucket: polls on stderr and stdout of the child, + * sending any stderr output immediately away to the error log. */ +static apr_status_t cgi_bucket_read(apr_bucket *b, const char **str, + apr_size_t *len, apr_read_type_e block) +{ + struct cgi_bucket_data *data = b->data; + apr_interval_time_t timeout; + apr_status_t rv; + int gotdata = 0; + + timeout = block == APR_NONBLOCK_READ ? 0 : data->r->server->timeout; + + do { + const apr_pollfd_t *results; + apr_int32_t num; + + rv = apr_pollset_poll(data->pollset, timeout, &num, &results); + if (APR_STATUS_IS_TIMEUP(rv)) { + return timeout == 0 ? APR_EAGAIN : rv; + } + else if (APR_STATUS_IS_EINTR(rv)) { + continue; + } + else if (rv != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, data->r, + "poll failed waiting for CGI child"); + return rv; + } + + for (; num; num--, results++) { + if (results[0].client_data == (void *)1) { + /* stdout */ + rv = cgi_read_stdout(b, results[0].desc.f, str, len); + if (APR_STATUS_IS_EOF(rv)) { + rv = APR_SUCCESS; + } + gotdata = 1; + } else { + /* stderr */ + apr_status_t rv2 = log_script_err(data->r, results[0].desc.f); + if (APR_STATUS_IS_EOF(rv2)) { + apr_pollset_remove(data->pollset, &results[0]); + } + } + } + + } while (!gotdata); + + return rv; +} + +static const apr_bucket_type_t bucket_type_cgi = { + "CGI", 5, APR_BUCKET_DATA, + apr_bucket_destroy_noop, + cgi_bucket_read, + apr_bucket_setaside_notimpl, + apr_bucket_split_notimpl, + apr_bucket_copy_notimpl +}; + +#endif + +static int cgi_handler(request_rec *r) +{ + int nph; + apr_size_t dbpos = 0; + const char *argv0; + const char *command; + const char **argv; + char *dbuf = NULL; + apr_file_t *script_out = NULL, *script_in = NULL, *script_err = NULL; + apr_bucket_brigade *bb; + apr_bucket *b; + int is_included; + int seen_eos, child_stopped_reading; + apr_pool_t *p; + cgi_server_conf *conf; + apr_status_t rv; + cgi_exec_info_t e_info; + conn_rec *c = r->connection; + + if(strcmp(r->handler, CGI_MAGIC_TYPE) && strcmp(r->handler, "cgi-script")) + return DECLINED; + + is_included = !strcmp(r->protocol, "INCLUDED"); + + p = r->main ? r->main->pool : r->pool; + + argv0 = apr_filename_of_pathname(r->filename); + nph = !(strncmp(argv0, "nph-", 4)); + conf = ap_get_module_config(r->server->module_config, &cgi_module); + + if (!(ap_allow_options(r) & OPT_EXECCGI) && !is_scriptaliased(r)) + return log_scripterror(r, conf, HTTP_FORBIDDEN, 0, + "Options ExecCGI is off in this directory"); + if (nph && is_included) + return log_scripterror(r, conf, HTTP_FORBIDDEN, 0, + "attempt to include NPH CGI script"); + + if (r->finfo.filetype == 0) + return log_scripterror(r, conf, HTTP_NOT_FOUND, 0, + "script not found or unable to stat"); + if (r->finfo.filetype == APR_DIR) + return log_scripterror(r, conf, HTTP_FORBIDDEN, 0, + "attempt to invoke directory as script"); + + if ((r->used_path_info == AP_REQ_REJECT_PATH_INFO) && + r->path_info && *r->path_info) + { + /* default to accept */ + return log_scripterror(r, conf, HTTP_NOT_FOUND, 0, + "AcceptPathInfo off disallows user's path"); + } +/* + if (!ap_suexec_enabled) { + if (!ap_can_exec(&r->finfo)) + return log_scripterror(r, conf, HTTP_FORBIDDEN, 0, + "file permissions deny server execution"); + } + +*/ + ap_add_common_vars(r); + ap_add_cgi_vars(r); + + e_info.process_cgi = 1; + e_info.cmd_type = APR_PROGRAM; + e_info.detached = 0; + e_info.in_pipe = APR_CHILD_BLOCK; + e_info.out_pipe = APR_CHILD_BLOCK; + e_info.err_pipe = APR_CHILD_BLOCK; + e_info.prog_type = RUN_AS_CGI; + e_info.bb = NULL; + e_info.ctx = NULL; + e_info.next = NULL; + + /* build the command line */ + if ((rv = cgi_build_command(&command, &argv, r, p, &e_info)) != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + "don't know how to spawn child process: %s", + r->filename); + return HTTP_INTERNAL_SERVER_ERROR; + } + + /* run the script in its own process */ + if ((rv = run_cgi_child(&script_out, &script_in, &script_err, + command, argv, r, p, &e_info)) != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + "couldn't spawn child process: %s", r->filename); + return HTTP_INTERNAL_SERVER_ERROR; + } + + /* Transfer any put/post args, CERN style... + * Note that we already ignore SIGPIPE in the core server. + */ + bb = apr_brigade_create(r->pool, c->bucket_alloc); + seen_eos = 0; + child_stopped_reading = 0; + if (conf->logname) { + dbuf = apr_palloc(r->pool, conf->bufbytes + 1); + dbpos = 0; + } + do { + apr_bucket *bucket; + + rv = ap_get_brigade(r->input_filters, bb, AP_MODE_READBYTES, + APR_BLOCK_READ, HUGE_STRING_LEN); + + if (rv != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + "Error reading request entity data"); + return HTTP_INTERNAL_SERVER_ERROR; + } + + APR_BRIGADE_FOREACH(bucket, bb) { + const char *data; + apr_size_t len; + + if (APR_BUCKET_IS_EOS(bucket)) { + seen_eos = 1; + break; + } + + /* We can't do much with this. */ + if (APR_BUCKET_IS_FLUSH(bucket)) { + continue; + } + + /* If the child stopped, we still must read to EOS. */ + if (child_stopped_reading) { + continue; + } + + /* read */ + apr_bucket_read(bucket, &data, &len, APR_BLOCK_READ); + + if (conf->logname && dbpos < conf->bufbytes) { + int cursize; + + if ((dbpos + len) > conf->bufbytes) { + cursize = conf->bufbytes - dbpos; + } + else { + cursize = len; + } + memcpy(dbuf + dbpos, data, cursize); + dbpos += cursize; + } + + /* Keep writing data to the child until done or too much time + * elapses with no progress or an error occurs. + */ + rv = apr_file_write_full(script_out, data, len, NULL); + + if (rv != APR_SUCCESS) { + /* silly script stopped reading, soak up remaining message */ + child_stopped_reading = 1; + } + } + apr_brigade_cleanup(bb); + } + while (!seen_eos); + + if (conf->logname) { + dbuf[dbpos] = '\0'; + } + /* Is this flush really needed? */ + apr_file_flush(script_out); + apr_file_close(script_out); + + AP_DEBUG_ASSERT(script_in != NULL); + + apr_brigade_cleanup(bb); + +#if APR_FILES_AS_SOCKETS + apr_file_pipe_timeout_set(script_in, 0); + apr_file_pipe_timeout_set(script_err, 0); + + b = cgi_bucket_create(r, script_in, script_err, c->bucket_alloc); +#else + b = apr_bucket_pipe_create(script_in, c->bucket_alloc); +#endif + APR_BRIGADE_INSERT_TAIL(bb, b); + b = apr_bucket_eos_create(c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, b); + + /* Handle script return... */ + if (!nph) { + const char *location; + char sbuf[MAX_STRING_LEN]; + int ret; + + if ((ret = ap_scan_script_header_err_brigade(r, bb, sbuf))) { + return log_script(r, conf, ret, dbuf, sbuf, bb, script_err); + } + + location = apr_table_get(r->headers_out, "Location"); + + if (location && location[0] == '/' && r->status == 200) { + discard_script_output(bb); + apr_brigade_destroy(bb); + apr_file_pipe_timeout_set(script_err, r->server->timeout); + log_script_err(r, script_err); + /* This redirect needs to be a GET no matter what the original + * method was. + */ + r->method = apr_pstrdup(r->pool, "GET"); + r->method_number = M_GET; + + /* We already read the message body (if any), so don't allow + * the redirected request to think it has one. We can ignore + * Transfer-Encoding, since we used REQUEST_CHUNKED_ERROR. + */ + apr_table_unset(r->headers_in, "Content-Length"); + + ap_internal_redirect_handler(location, r); + return OK; + } + else if (location && r->status == 200) { + /* XX Note that if a script wants to produce its own Redirect + * body, it now has to explicitly *say* "Status: 302" + */ + discard_script_output(bb); + apr_brigade_destroy(bb); + return HTTP_MOVED_TEMPORARILY; + } + + rv = ap_pass_brigade(r->output_filters, bb); + } + else /* nph */ { + struct ap_filter_t *cur; + + /* get rid of all filters up through protocol... since we + * haven't parsed off the headers, there is no way they can + * work + */ + + cur = r->proto_output_filters; + while (cur && cur->frec->ftype < AP_FTYPE_CONNECTION) { + cur = cur->next; + } + r->output_filters = r->proto_output_filters = cur; + + rv = ap_pass_brigade(r->output_filters, bb); + } + + /* don't soak up script output if errors occurred writing it + * out... otherwise, we prolong the life of the script when the + * connection drops or we stopped sending output for some other + * reason */ + if (rv == APR_SUCCESS && !r->connection->aborted) { + apr_file_pipe_timeout_set(script_err, r->server->timeout); + log_script_err(r, script_err); + } + + apr_file_close(script_err); + + return OK; /* NOT r->status, even if it has changed. */ +} + +/*============================================================================ + *============================================================================ + * This is the beginning of the cgi filter code moved from mod_include. This + * is the code required to handle the "exec" SSI directive. + *============================================================================ + *============================================================================*/ +static int include_cgi(char *s, request_rec *r, ap_filter_t *next, + apr_bucket *head_ptr, apr_bucket **inserted_head) +{ + request_rec *rr = ap_sub_req_lookup_uri(s, r, next); + int rr_status; + apr_bucket *tmp_buck, *tmp2_buck; + + if (rr->status != HTTP_OK) { + ap_destroy_sub_req(rr); + return -1; + } + + /* No hardwired path info or query allowed */ + + if ((rr->path_info && rr->path_info[0]) || rr->args) { + ap_destroy_sub_req(rr); + return -1; + } + if (rr->finfo.filetype != APR_REG) { + ap_destroy_sub_req(rr); + return -1; + } + + /* Script gets parameters of the *document*, for back compatibility */ + + rr->path_info = r->path_info; /* hard to get right; see mod_cgi.c */ + rr->args = r->args; + + /* Force sub_req to be treated as a CGI request, even if ordinary + * typing rules would have called it something else. + */ + + ap_set_content_type(rr, CGI_MAGIC_TYPE); + + /* Run it. */ + + rr_status = ap_run_sub_req(rr); + if (ap_is_HTTP_REDIRECT(rr_status)) { + apr_size_t len_loc; + const char *location = apr_table_get(rr->headers_out, "Location"); + conn_rec *c = r->connection; + + location = ap_escape_html(rr->pool, location); + len_loc = strlen(location); + + /* XXX: if most of this stuff is going to get copied anyway, + * it'd be more efficient to pstrcat it into a single pool buffer + * and a single pool bucket */ + + tmp_buck = apr_bucket_immortal_create("<A HREF=\"", + sizeof("<A HREF=\"") - 1, + c->bucket_alloc); + APR_BUCKET_INSERT_BEFORE(head_ptr, tmp_buck); + tmp2_buck = apr_bucket_heap_create(location, len_loc, NULL, + c->bucket_alloc); + APR_BUCKET_INSERT_BEFORE(head_ptr, tmp2_buck); + tmp2_buck = apr_bucket_immortal_create("\">", sizeof("\">") - 1, + c->bucket_alloc); + APR_BUCKET_INSERT_BEFORE(head_ptr, tmp2_buck); + tmp2_buck = apr_bucket_heap_create(location, len_loc, NULL, + c->bucket_alloc); + APR_BUCKET_INSERT_BEFORE(head_ptr, tmp2_buck); + tmp2_buck = apr_bucket_immortal_create("</A>", sizeof("</A>") - 1, + c->bucket_alloc); + APR_BUCKET_INSERT_BEFORE(head_ptr, tmp2_buck); + + if (*inserted_head == NULL) { + *inserted_head = tmp_buck; + } + } + + ap_destroy_sub_req(rr); + + return 0; +} + + +static int include_cmd(include_ctx_t *ctx, apr_bucket_brigade **bb, + const char *command, request_rec *r, ap_filter_t *f) +{ + cgi_exec_info_t e_info; + const char **argv; + apr_file_t *script_out = NULL, *script_in = NULL, *script_err = NULL; + apr_bucket_brigade *bcgi; + apr_bucket *b; + apr_status_t rv; + + add_ssi_vars(r); + + e_info.process_cgi = 0; + e_info.cmd_type = APR_SHELLCMD; + e_info.detached = 0; + e_info.in_pipe = APR_NO_PIPE; + e_info.out_pipe = APR_FULL_BLOCK; + e_info.err_pipe = APR_NO_PIPE; + e_info.prog_type = RUN_AS_SSI; + e_info.bb = bb; + e_info.ctx = ctx; + e_info.next = f->next; + + if ((rv = cgi_build_command(&command, &argv, r, r->pool, &e_info)) != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + "don't know how to spawn cmd child process: %s", + r->filename); + return HTTP_INTERNAL_SERVER_ERROR; + } + + /* run the script in its own process */ + if ((rv = run_cgi_child(&script_out, &script_in, &script_err, + command, argv, r, r->pool, + &e_info)) != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + "couldn't spawn child process: %s", r->filename); + return HTTP_INTERNAL_SERVER_ERROR; + } + + bcgi = apr_brigade_create(r->pool, f->c->bucket_alloc); + b = apr_bucket_pipe_create(script_in, f->c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bcgi, b); + ap_pass_brigade(f->next, bcgi); + + /* We can't close the pipe here, because we may return before the + * full CGI has been sent to the network. That's okay though, + * because we can rely on the pool to close the pipe for us. + */ + + return 0; +} + +static int handle_exec(include_ctx_t *ctx, apr_bucket_brigade **bb, + request_rec *r, ap_filter_t *f, apr_bucket *head_ptr, + apr_bucket **inserted_head) +{ + char *tag = NULL; + char *tag_val = NULL; + char *file = r->filename; + apr_bucket *tmp_buck; + char parsed_string[MAX_STRING_LEN]; + + *inserted_head = NULL; + if (ctx->flags & FLAG_PRINTING) { + if (ctx->flags & FLAG_NO_EXEC) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "exec used but not allowed in %s", r->filename); + CREATE_ERROR_BUCKET(ctx, tmp_buck, head_ptr, *inserted_head); + } + else { + while (1) { + cgi_pfn_gtv(ctx, &tag, &tag_val, 1); + if (tag_val == NULL) { + if (tag == NULL) { + return 0; + } + else { + return 1; + } + } + if (!strcmp(tag, "cmd")) { + cgi_pfn_ps(r, ctx, tag_val, parsed_string, + sizeof(parsed_string), 1); + if (include_cmd(ctx, bb, parsed_string, r, f) == -1) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "execution failure for parameter \"%s\" " + "to tag exec in file %s", tag, r->filename); + CREATE_ERROR_BUCKET(ctx, tmp_buck, head_ptr, + *inserted_head); + } + } + else if (!strcmp(tag, "cgi")) { + apr_status_t retval = APR_SUCCESS; + + cgi_pfn_ps(r, ctx, tag_val, parsed_string, + sizeof(parsed_string), 0); + + SPLIT_AND_PASS_PRETAG_BUCKETS(*bb, ctx, f->next, retval); + if (retval != APR_SUCCESS) { + return retval; + } + + if (include_cgi(parsed_string, r, f->next, head_ptr, + inserted_head) == -1) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "invalid CGI ref \"%s\" in %s", + tag_val, file); + CREATE_ERROR_BUCKET(ctx, tmp_buck, head_ptr, + *inserted_head); + } + } + else { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "unknown parameter \"%s\" to tag exec in %s", + tag, file); + CREATE_ERROR_BUCKET(ctx, tmp_buck, head_ptr, + *inserted_head); + } + } + } + } + return 0; +} + + +/*============================================================================ + *============================================================================ + * This is the end of the cgi filter code moved from mod_include. + *============================================================================ + *============================================================================*/ + + +static int cgi_post_config(apr_pool_t *p, apr_pool_t *plog, + apr_pool_t *ptemp, server_rec *s) +{ + cgi_pfn_reg_with_ssi = APR_RETRIEVE_OPTIONAL_FN(ap_register_include_handler); + cgi_pfn_gtv = APR_RETRIEVE_OPTIONAL_FN(ap_ssi_get_tag_and_value); + cgi_pfn_ps = APR_RETRIEVE_OPTIONAL_FN(ap_ssi_parse_string); + + if ((cgi_pfn_reg_with_ssi) && (cgi_pfn_gtv) && (cgi_pfn_ps)) { + /* Required by mod_include filter. This is how mod_cgi registers + * with mod_include to provide processing of the exec directive. + */ + cgi_pfn_reg_with_ssi("exec", handle_exec); + } + + /* This is the means by which unusual (non-unix) os's may find alternate + * means to run a given command (e.g. shebang/registry parsing on Win32) + */ + cgi_build_command = APR_RETRIEVE_OPTIONAL_FN(ap_cgi_build_command); + if (!cgi_build_command) { + cgi_build_command = default_build_command; + } + return OK; +} + +static void register_hooks(apr_pool_t *p) +{ + static const char * const aszPre[] = { "mod_include.c", NULL }; + ap_hook_handler(cgi_handler, NULL, NULL, APR_HOOK_MIDDLE); + ap_hook_post_config(cgi_post_config, aszPre, NULL, APR_HOOK_REALLY_FIRST); +} + +module AP_MODULE_DECLARE_DATA cgi_module = +{ + STANDARD20_MODULE_STUFF, + NULL, /* dir config creater */ + NULL, /* dir merger --- default is to override */ + create_cgi_config, /* server config */ + merge_cgi_config, /* merge server config */ + cgi_cmds, /* command apr_table_t */ + register_hooks /* register hooks */ +}; diff --git a/rubbos/app/httpd-2.0.64/modules/generators/mod_cgi.dsp b/rubbos/app/httpd-2.0.64/modules/generators/mod_cgi.dsp new file mode 100644 index 00000000..02167c19 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/generators/mod_cgi.dsp @@ -0,0 +1,132 @@ +# Microsoft Developer Studio Project File - Name="mod_cgi" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=mod_cgi - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "mod_cgi.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 "mod_cgi.mak" CFG="mod_cgi - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "mod_cgi - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_cgi - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "mod_cgi - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_cgi_src" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /out:"Release/mod_cgi.so" /base:@..\..\os\win32\BaseAddr.ref,mod_cgi.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Release/mod_cgi.so" /base:@..\..\os\win32\BaseAddr.ref,mod_cgi.so /opt:ref + +!ELSEIF "$(CFG)" == "mod_cgi - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_cgi_src" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_cgi.so" /base:@..\..\os\win32\BaseAddr.ref,mod_cgi.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_cgi.so" /base:@..\..\os\win32\BaseAddr.ref,mod_cgi.so + +!ENDIF + +# Begin Target + +# Name "mod_cgi - Win32 Release" +# Name "mod_cgi - Win32 Debug" +# Begin Source File + +SOURCE=.\mod_cgi.c +# End Source File +# Begin Source File + +SOURCE=.\mod_cgi.h +# End Source File +# Begin Source File + +SOURCE=.\mod_cgi.rc +# End Source File +# Begin Source File + +SOURCE=..\..\build\win32\win32ver.awk + +!IF "$(CFG)" == "mod_cgi - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_cgi.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_cgi.so "cgi_module for Apache" ../../include/ap_release.h > .\mod_cgi.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "mod_cgi - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_cgi.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_cgi.so "cgi_module for Apache" ../../include/ap_release.h > .\mod_cgi.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/modules/generators/mod_cgi.exp b/rubbos/app/httpd-2.0.64/modules/generators/mod_cgi.exp new file mode 100644 index 00000000..96ea0c23 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/generators/mod_cgi.exp @@ -0,0 +1 @@ +cgi_module diff --git a/rubbos/app/httpd-2.0.64/modules/generators/mod_cgi.h b/rubbos/app/httpd-2.0.64/modules/generators/mod_cgi.h new file mode 100644 index 00000000..9a54895a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/generators/mod_cgi.h @@ -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. + */ + +#ifndef _MOD_CGI_H +#define _MOD_CGI_H 1 + +#include "mod_include.h" + +#define AP_PROC_DETACHED 1 +#define AP_PROC_NEWADDRSPACE 2 + +typedef enum {RUN_AS_SSI, RUN_AS_CGI} prog_types; + +typedef struct { + apr_int32_t in_pipe; + apr_int32_t out_pipe; + apr_int32_t err_pipe; + int process_cgi; + apr_cmdtype_e cmd_type; + apr_int32_t detached; /* used as a bitfield for detached_ & addrspace_set, */ + /* when initializing apr_proc_attr structure */ + prog_types prog_type; + apr_bucket_brigade **bb; + include_ctx_t *ctx; + ap_filter_t *next; +} cgi_exec_info_t; + +/** + * Registerable optional function to override CGI behavior; + * Reprocess the command and arguments to execute the given CGI script. + * @param cmd Pointer to the command to execute (may be overridden) + * @param argv Pointer to the arguments to pass (may be overridden) + * @param r The current request + * @param p The pool to allocate correct cmd/argv elements within. + * @param process_cgi Set true if processing r->filename and r->args + * as a CGI invocation, otherwise false + * @param type Set to APR_SHELLCMD or APR_PROGRAM on entry, may be + * changed to invoke the program with alternate semantics. + * @param detach Should the child start in detached state? Default is no. + * @remark This callback may be registered by the os-specific module + * to correct the command and arguments for apr_proc_create invocation + * on a given os. mod_cgi will call the function if registered. + */ +APR_DECLARE_OPTIONAL_FN(apr_status_t, ap_cgi_build_command, + (const char **cmd, const char ***argv, + request_rec *r, apr_pool_t *p, + cgi_exec_info_t *e_info)); + +#endif /* _MOD_CGI_H */ diff --git a/rubbos/app/httpd-2.0.64/modules/generators/mod_cgid.c b/rubbos/app/httpd-2.0.64/modules/generators/mod_cgid.c new file mode 100644 index 00000000..55ac3b04 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/generators/mod_cgid.c @@ -0,0 +1,1744 @@ +/* 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. + */ + +/* + * http_script: keeps all script-related ramblings together. + * + * Compliant to cgi/1.1 spec + * + * Adapted by rst from original NCSA code by Rob McCool + * + * Apache adds some new env vars; REDIRECT_URL and REDIRECT_QUERY_STRING for + * custom error responses, and DOCUMENT_ROOT because we found it useful. + * It also adds SERVER_ADMIN - useful for scripts to know who to mail when + * they fail. + */ + +#include "apr_lib.h" +#include "apr_strings.h" +#include "apr_general.h" +#include "apr_file_io.h" +#include "apr_portable.h" +#include "apr_buckets.h" +#include "apr_optional.h" +#include "apr_signal.h" + +#define APR_WANT_STRFUNC +#include "apr_want.h" + +#if APR_HAVE_SYS_SOCKET_H +#include <sys/socket.h> +#endif +#if APR_HAVE_UNISTD_H +#include <unistd.h> +#endif +#if APR_HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif + +#define CORE_PRIVATE + +#include "util_filter.h" +#include "httpd.h" +#include "http_config.h" +#include "http_request.h" +#include "http_core.h" +#include "http_protocol.h" +#include "http_main.h" +#include "http_log.h" +#include "util_script.h" +#include "ap_mpm.h" +#include "unixd.h" +#include "mod_suexec.h" +#include "../filters/mod_include.h" + +#include "mod_core.h" + + +/* ### should be tossed in favor of APR */ +#include <sys/stat.h> +#include <sys/un.h> /* for sockaddr_un */ + + +module AP_MODULE_DECLARE_DATA cgid_module; + +static int cgid_start(apr_pool_t *p, server_rec *main_server, apr_proc_t *procnew); +static int cgid_init(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *main_server); +static int handle_exec(include_ctx_t *ctx, apr_bucket_brigade **bb, request_rec *r, + ap_filter_t *f, apr_bucket *head_ptr, apr_bucket **inserted_head); + +static APR_OPTIONAL_FN_TYPE(ap_register_include_handler) *cgid_pfn_reg_with_ssi; +static APR_OPTIONAL_FN_TYPE(ap_ssi_get_tag_and_value) *cgid_pfn_gtv; +static APR_OPTIONAL_FN_TYPE(ap_ssi_parse_string) *cgid_pfn_ps; + +static apr_pool_t *pcgi = NULL; +static int total_modules = 0; +static pid_t daemon_pid; +static int daemon_should_exit = 0; +static server_rec *root_server = NULL; +static apr_pool_t *root_pool = NULL; +static ap_unix_identity_t empty_ugid = { (uid_t)-1, (gid_t)-1, -1 }; + +/* Read and discard the data in the brigade produced by a CGI script */ +static void discard_script_output(apr_bucket_brigade *bb); + +/* This doer will only ever be called when we are sure that we have + * a valid ugid. + */ +static ap_unix_identity_t *cgid_suexec_id_doer(const request_rec *r) +{ + return (ap_unix_identity_t *) + ap_get_module_config(r->request_config, &cgid_module); +} + +/* KLUDGE --- for back-combatibility, we don't have to check ExecCGI + * in ScriptAliased directories, which means we need to know if this + * request came through ScriptAlias or not... so the Alias module + * leaves a note for us. + */ + +static int is_scriptaliased(request_rec *r) +{ + const char *t = apr_table_get(r->notes, "alias-forced-type"); + return t && (!strcasecmp(t, "cgi-script")); +} + +/* Configuration stuff */ + +#define DEFAULT_LOGBYTES 10385760 +#define DEFAULT_BUFBYTES 1024 +#define DEFAULT_SOCKET DEFAULT_REL_RUNTIMEDIR "/cgisock" + +#define CGI_REQ 1 +#define SSI_REQ 2 +#define GETPID_REQ 3 /* get the pid of script created for prior request */ + +#define ERRFN_USERDATA_KEY "CGIDCHILDERRFN" + +/* DEFAULT_CGID_LISTENBACKLOG controls the max depth on the unix socket's + * pending connection queue. If a bunch of cgi requests arrive at about + * the same time, connections from httpd threads/processes will back up + * in the queue while the cgid process slowly forks off a child to process + * each connection on the unix socket. If the queue is too short, the + * httpd process will get ECONNREFUSED when trying to connect. + */ +#ifndef DEFAULT_CGID_LISTENBACKLOG +#define DEFAULT_CGID_LISTENBACKLOG 100 +#endif + +/* DEFAULT_CONNECT_ATTEMPTS controls how many times we'll try to connect + * to the cgi daemon from the thread/process handling the cgi request. + * Generally we want to retry when we get ECONNREFUSED since it is + * probably because the listen queue is full. We need to try harder so + * the client doesn't see it as a 503 error. + * + * Set this to 0 to continually retry until the connect works or Apache + * terminates. + */ +#ifndef DEFAULT_CONNECT_ATTEMPTS +#define DEFAULT_CONNECT_ATTEMPTS 15 +#endif + +typedef struct { + const char *sockname; + const char *logname; + long logbytes; + int bufbytes; +} cgid_server_conf; + +typedef struct { + int req_type; /* request type (CGI_REQ, SSI_REQ, etc.) */ + unsigned long conn_id; /* connection id; daemon uses this as a hash value + * to find the script pid when it is time for that + * process to be cleaned up + */ + int core_module_index; + int env_count; + ap_unix_identity_t ugid; + apr_size_t filename_len; + apr_size_t argv0_len; + apr_size_t uri_len; + apr_size_t args_len; + int loglevel; /* to stuff in server_rec */ +} cgid_req_t; + +/* This routine is called to create the argument list to be passed + * to the CGI script. When suexec is enabled, the suexec path, user, and + * group are the first three arguments to be passed; if not, all three + * must be NULL. The query info is split into separate arguments, where + * "+" is the separator between keyword arguments. + * + * Do not process the args if they containing an '=' assignment. + */ +static char **create_argv(apr_pool_t *p, char *path, char *user, char *group, + char *av0, const char *args) +{ + int x, numwords; + char **av; + char *w; + int idx = 0; + + if (ap_strchr_c(args, '=')) { + numwords = 0; + } + else { + /* count the number of keywords */ + + for (x = 0, numwords = 1; args[x]; x++) { + if (args[x] == '+') { + ++numwords; + } + } + } + + if (numwords > APACHE_ARG_MAX - 5) { + numwords = APACHE_ARG_MAX - 5; /* Truncate args to prevent overrun */ + } + av = (char **) apr_pcalloc(p, (numwords + 5) * sizeof(char *)); + + if (path) { + av[idx++] = path; + } + if (user) { + av[idx++] = user; + } + if (group) { + av[idx++] = group; + } + + av[idx++] = apr_pstrdup(p, av0); + + for (x = 1; x <= numwords; x++) { + w = ap_getword_nulls(p, &args, '+'); + if (strcmp(w, "")) { + ap_unescape_url(w); + av[idx++] = ap_escape_shell_cmd(p, w); + } + } + av[idx] = NULL; + return av; +} + +#if APR_HAS_OTHER_CHILD +static void cgid_maint(int reason, void *data, apr_wait_t status) +{ + apr_proc_t *proc = data; + int mpm_state; + int stopping; + + switch (reason) { + case APR_OC_REASON_DEATH: + apr_proc_other_child_unregister(data); + /* If apache is not terminating or restarting, + * restart the cgid daemon + */ + stopping = 1; /* if MPM doesn't support query, + * assume we shouldn't restart daemon + */ + if (ap_mpm_query(AP_MPMQ_MPM_STATE, &mpm_state) == APR_SUCCESS && + mpm_state != AP_MPMQ_STOPPING) { + stopping = 0; + } + if (!stopping) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, NULL, + "cgid daemon process died, restarting"); + cgid_start(root_pool, root_server, proc); + } + break; + case APR_OC_REASON_RESTART: + /* don't do anything; server is stopping or restarting */ + apr_proc_other_child_unregister(data); + break; + case APR_OC_REASON_LOST: + /* Restart the child cgid daemon process */ + apr_proc_other_child_unregister(data); + cgid_start(root_pool, root_server, proc); + break; + case APR_OC_REASON_UNREGISTER: + /* we get here when pcgi is cleaned up; pcgi gets cleaned + * up when pconf gets cleaned up + */ + kill(proc->pid, SIGHUP); /* send signal to daemon telling it to die */ + break; + } +} +#endif + +/* deal with incomplete reads and signals + * assume you really have to read buf_size bytes + */ +static apr_status_t sock_read(int fd, void *vbuf, size_t buf_size) +{ + char *buf = vbuf; + int rc; + size_t bytes_read = 0; + + do { + do { + rc = read(fd, buf + bytes_read, buf_size - bytes_read); + } while (rc < 0 && errno == EINTR); + switch(rc) { + case -1: + return errno; + case 0: /* unexpected */ + return ECONNRESET; + default: + bytes_read += rc; + } + } while (bytes_read < buf_size); + + return APR_SUCCESS; +} + +/* deal with signals + */ +static apr_status_t sock_write(int fd, const void *buf, size_t buf_size) +{ + int rc; + + do { + rc = write(fd, buf, buf_size); + } while (rc < 0 && errno == EINTR); + if (rc < 0) { + return errno; + } + + return APR_SUCCESS; +} + +static apr_status_t get_req(int fd, request_rec *r, char **argv0, char ***env, + cgid_req_t *req) +{ + int i; + char **environ; + core_request_config *temp_core; + void **rconf; + apr_status_t stat; + + r->server = apr_pcalloc(r->pool, sizeof(server_rec)); + + /* read the request header */ + stat = sock_read(fd, req, sizeof(*req)); + if (stat != APR_SUCCESS) { + return stat; + } + r->server->loglevel = req->loglevel; + if (req->req_type == GETPID_REQ) { + /* no more data sent for this request */ + return APR_SUCCESS; + } + + /* handle module indexes and such */ + rconf = (void **) apr_pcalloc(r->pool, sizeof(void *) * (total_modules + DYNAMIC_MODULE_LIMIT)); + + temp_core = (core_request_config *)apr_palloc(r->pool, sizeof(core_module)); + rconf[req->core_module_index] = (void *)temp_core; + r->request_config = (ap_conf_vector_t *)rconf; + ap_set_module_config(r->request_config, &cgid_module, (void *)&req->ugid); + + /* Read the filename, argv0, uri, and args */ + r->filename = apr_pcalloc(r->pool, req->filename_len + 1); + *argv0 = apr_pcalloc(r->pool, req->argv0_len + 1); + r->uri = apr_pcalloc(r->pool, req->uri_len + 1); + if ((stat = sock_read(fd, r->filename, req->filename_len)) != APR_SUCCESS || + (stat = sock_read(fd, *argv0, req->argv0_len)) != APR_SUCCESS || + (stat = sock_read(fd, r->uri, req->uri_len)) != APR_SUCCESS) { + return stat; + } + + r->args = apr_pcalloc(r->pool, req->args_len + 1); /* empty string if no args */ + if (req->args_len) { + if ((stat = sock_read(fd, r->args, req->args_len)) != APR_SUCCESS) { + return stat; + } + } + + /* read the environment variables */ + environ = apr_pcalloc(r->pool, (req->env_count + 2) *sizeof(char *)); + for (i = 0; i < req->env_count; i++) { + apr_size_t curlen; + + if ((stat = sock_read(fd, &curlen, sizeof(curlen))) != APR_SUCCESS) { + return stat; + } + environ[i] = apr_pcalloc(r->pool, curlen + 1); + if ((stat = sock_read(fd, environ[i], curlen)) != APR_SUCCESS) { + return stat; + } + } + *env = environ; + +#if 0 +#ifdef RLIMIT_CPU + sock_read(fd, &j, sizeof(int)); + if (j) { + temp_core->limit_cpu = (struct rlimit *)apr_palloc (sizeof(struct rlimit)); + sock_read(fd, temp_core->limit_cpu, sizeof(struct rlimit)); + } + else { + temp_core->limit_cpu = NULL; + } +#endif + +#if defined (RLIMIT_DATA) || defined(RLIMIT_VMEM) || defined(RLIMIT_AS) + sock_read(fd, &j, sizeof(int)); + if (j) { + temp_core->limit_mem = (struct rlimit *)apr_palloc(r->pool, sizeof(struct rlimit)); + sock_read(fd, temp_core->limit_mem, sizeof(struct rlimit)); + } + else { + temp_core->limit_mem = NULL; + } +#endif + +#ifdef RLIMIT_NPROC + sock_read(fd, &j, sizeof(int)); + if (j) { + temp_core->limit_nproc = (struct rlimit *)apr_palloc(r->pool, sizeof(struct rlimit)); + sock_read(fd, temp_core->limit_nproc, sizeof(struct rlimit)); + } + else { + temp_core->limit_nproc = NULL; + } +#endif +#endif + + return APR_SUCCESS; +} + +static apr_status_t send_req(int fd, request_rec *r, char *argv0, char **env, + int req_type) +{ + int i; + cgid_req_t req = {0}; + apr_status_t stat; + ap_unix_identity_t * ugid = ap_run_get_suexec_identity(r); + + if (ugid == NULL) { + req.ugid = empty_ugid; + } else { + memcpy(&req.ugid, ugid, sizeof(ap_unix_identity_t)); + } + + req.req_type = req_type; + req.conn_id = r->connection->id; + req.core_module_index = core_module.module_index; + for (req.env_count = 0; env[req.env_count]; req.env_count++) { + continue; + } + req.filename_len = strlen(r->filename); + req.argv0_len = strlen(argv0); + req.uri_len = strlen(r->uri); + req.args_len = r->args ? strlen(r->args) : 0; + req.loglevel = r->server->loglevel; + + /* Write the request header */ + if ((stat = sock_write(fd, &req, sizeof(req))) != APR_SUCCESS) { + return stat; + } + + /* Write filename, argv0, uri, and args */ + if ((stat = sock_write(fd, r->filename, req.filename_len)) != APR_SUCCESS || + (stat = sock_write(fd, argv0, req.argv0_len)) != APR_SUCCESS || + (stat = sock_write(fd, r->uri, req.uri_len)) != APR_SUCCESS) { + return stat; + } + if (req.args_len) { + if ((stat = sock_write(fd, r->args, req.args_len)) != APR_SUCCESS) { + return stat; + } + } + + /* write the environment variables */ + for (i = 0; i < req.env_count; i++) { + apr_size_t curlen = strlen(env[i]); + + if ((stat = sock_write(fd, &curlen, sizeof(curlen))) != APR_SUCCESS) { + return stat; + } + + if ((stat = sock_write(fd, env[i], curlen)) != APR_SUCCESS) { + return stat; + } + } + +#if 0 +#ifdef RLIMIT_CPU + if (conf->limit_cpu) { + len = 1; + stat = sock_write(fd, &len, sizeof(int)); + stat = sock_write(fd, conf->limit_cpu, sizeof(struct rlimit)); + } + else { + len = 0; + stat = sock_write(fd, &len, sizeof(int)); + } +#endif + +#if defined(RLIMIT_DATA) || defined(RLIMIT_VMEM) || defined(RLIMIT_AS) + if (conf->limit_mem) { + len = 1; + stat = sock_write(fd, &len, sizeof(int)); + stat = sock_write(fd, conf->limit_mem, sizeof(struct rlimit)); + } + else { + len = 0; + stat = sock_write(fd, &len, sizeof(int)); + } +#endif + +#ifdef RLIMIT_NPROC + if (conf->limit_nproc) { + len = 1; + stat = sock_write(fd, &len, sizeof(int)); + stat = sock_write(fd, conf->limit_nproc, sizeof(struct rlimit)); + } + else { + len = 0; + stat = sock_write(fd, &len, sizeof(int)); + } +#endif +#endif + return APR_SUCCESS; +} + +static void daemon_signal_handler(int sig) +{ + if (sig == SIGHUP) { + ++daemon_should_exit; + } +} + +static void cgid_child_errfn(apr_pool_t *pool, apr_status_t err, + const char *description) +{ + request_rec *r; + void *vr; + + apr_pool_userdata_get(&vr, ERRFN_USERDATA_KEY, pool); + r = vr; + + /* sure we got r, but don't call ap_log_rerror() because we don't + * have r->headers_in and possibly other storage referenced by + * ap_log_rerror() + */ + ap_log_error(APLOG_MARK, APLOG_ERR, err, r->server, "%s", +#ifdef AP_UNSAFE_ERROR_LOG_UNESCAPED + description +#else + ap_escape_logitem(pool, description) +#endif + ); +} + +static int cgid_server(void *data) +{ + struct sockaddr_un unix_addr; + int sd, sd2, rc; + mode_t omask; + apr_socklen_t len; + apr_pool_t *ptrans; + server_rec *main_server = data; + cgid_server_conf *sconf = ap_get_module_config(main_server->module_config, + &cgid_module); + apr_hash_t *script_hash = apr_hash_make(pcgi); + + apr_pool_create(&ptrans, pcgi); + + apr_signal(SIGCHLD, SIG_IGN); + apr_signal(SIGHUP, daemon_signal_handler); + + if (unlink(sconf->sockname) < 0 && errno != ENOENT) { + ap_log_error(APLOG_MARK, APLOG_ERR, errno, main_server, + "Couldn't unlink unix domain socket %s", + sconf->sockname); + /* just a warning; don't bail out */ + } + + /* cgid should use its own suexec doer */ + ap_hook_get_suexec_identity(cgid_suexec_id_doer, NULL, NULL, + APR_HOOK_REALLY_FIRST); + apr_hook_sort_all(); + + if ((sd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) { + ap_log_error(APLOG_MARK, APLOG_ERR, errno, main_server, + "Couldn't create unix domain socket"); + return errno; + } + + memset(&unix_addr, 0, sizeof(unix_addr)); + unix_addr.sun_family = AF_UNIX; + strcpy(unix_addr.sun_path, sconf->sockname); + + omask = umask(0077); /* so that only Apache can use socket */ + rc = bind(sd, (struct sockaddr *)&unix_addr, sizeof(unix_addr)); + umask(omask); /* can't fail, so can't clobber errno */ + if (rc < 0) { + ap_log_error(APLOG_MARK, APLOG_ERR, errno, main_server, + "Couldn't bind unix domain socket %s", + sconf->sockname); + return errno; + } + + if (listen(sd, DEFAULT_CGID_LISTENBACKLOG) < 0) { + ap_log_error(APLOG_MARK, APLOG_ERR, errno, main_server, + "Couldn't listen on unix domain socket"); + return errno; + } + + if (!geteuid()) { + if (chown(sconf->sockname, unixd_config.user_id, -1) < 0) { + ap_log_error(APLOG_MARK, APLOG_ERR, errno, main_server, + "Couldn't change owner of unix domain socket %s", + sconf->sockname); + return errno; + } + } + + unixd_setup_child(); /* if running as root, switch to configured user/group */ + + while (!daemon_should_exit) { + int errfileno = STDERR_FILENO; + char *argv0; + char **env; + const char * const *argv; + apr_int32_t in_pipe; + apr_int32_t out_pipe; + apr_int32_t err_pipe; + apr_cmdtype_e cmd_type; + request_rec *r; + apr_procattr_t *procattr = NULL; + apr_proc_t *procnew = NULL; + apr_file_t *inout; + cgid_req_t cgid_req; + apr_status_t stat; + + apr_pool_clear(ptrans); + + len = sizeof(unix_addr); + sd2 = accept(sd, (struct sockaddr *)&unix_addr, &len); + if (sd2 < 0) { + if (errno != EINTR) { + ap_log_error(APLOG_MARK, APLOG_ERR, errno, + (server_rec *)data, + "Error accepting on cgid socket"); + } + continue; + } + + r = apr_pcalloc(ptrans, sizeof(request_rec)); + procnew = apr_pcalloc(ptrans, sizeof(*procnew)); + r->pool = ptrans; + stat = get_req(sd2, r, &argv0, &env, &cgid_req); + if (stat != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, stat, + main_server, + "Error reading request on cgid socket"); + close(sd2); + continue; + } + + if (cgid_req.req_type == GETPID_REQ) { + pid_t pid; + + pid = (pid_t)apr_hash_get(script_hash, &cgid_req.conn_id, sizeof(cgid_req.conn_id)); + if (write(sd2, &pid, sizeof(pid)) != sizeof(pid)) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, + main_server, + "Error writing pid %" APR_PID_T_FMT " to handler", pid); + } + close(sd2); + continue; + } + + apr_os_file_put(&r->server->error_log, &errfileno, 0, r->pool); + apr_os_file_put(&inout, &sd2, 0, r->pool); + + if (cgid_req.req_type == SSI_REQ) { + in_pipe = APR_NO_PIPE; + out_pipe = APR_FULL_BLOCK; + err_pipe = APR_NO_PIPE; + cmd_type = APR_SHELLCMD; + } + else { + in_pipe = APR_CHILD_BLOCK; + out_pipe = APR_CHILD_BLOCK; + err_pipe = APR_CHILD_BLOCK; + cmd_type = APR_PROGRAM; + } + + if (((rc = apr_procattr_create(&procattr, ptrans)) != APR_SUCCESS) || + ((cgid_req.req_type == CGI_REQ) && + (((rc = apr_procattr_io_set(procattr, + in_pipe, + out_pipe, + err_pipe)) != APR_SUCCESS) || + /* XXX apr_procattr_child_*_set() is creating an unnecessary + * pipe between this process and the child being created... + * It is cleaned up with the temporary pool for this request. + */ + ((rc = apr_procattr_child_err_set(procattr, r->server->error_log, NULL)) != APR_SUCCESS) || + ((rc = apr_procattr_child_in_set(procattr, inout, NULL)) != APR_SUCCESS))) || + ((rc = apr_procattr_child_out_set(procattr, inout, NULL)) != APR_SUCCESS) || + ((rc = apr_procattr_dir_set(procattr, + ap_make_dirstr_parent(r->pool, r->filename))) != APR_SUCCESS) || + ((rc = apr_procattr_cmdtype_set(procattr, cmd_type)) != APR_SUCCESS) || + ((rc = apr_procattr_child_errfn_set(procattr, cgid_child_errfn)) != APR_SUCCESS)) { + /* Something bad happened, tell the world. + * ap_log_rerror() won't work because the header table used by + * ap_log_rerror() hasn't been replicated in the phony r + */ + ap_log_error(APLOG_MARK, APLOG_ERR, rc, r->server, + "couldn't set child process attributes: %s", r->filename); + } + else { + apr_pool_userdata_set(r, ERRFN_USERDATA_KEY, apr_pool_cleanup_null, ptrans); + + argv = (const char * const *)create_argv(r->pool, NULL, NULL, NULL, argv0, r->args); + + /* We want to close sd2 for the new CGI process too. + * If it is left open it'll make ap_pass_brigade() block + * waiting for EOF if CGI forked something running long. + * close(sd2) here should be okay, as CGI channel + * is already dup()ed by apr_procattr_child_{in,out}_set() + * above. + */ + close(sd2); + + if (memcmp(&empty_ugid, &cgid_req.ugid, sizeof(empty_ugid))) { + /* We have a valid identity, and can be sure that + * cgid_suexec_id_doer will return a valid ugid + */ + rc = ap_os_create_privileged_process(r, procnew, argv0, argv, + (const char * const *)env, + procattr, ptrans); + } else { + rc = apr_proc_create(procnew, argv0, argv, + (const char * const *)env, + procattr, ptrans); + } + + if (rc != APR_SUCCESS) { + /* Bad things happened. Everyone should have cleaned up. + * ap_log_rerror() won't work because the header table used by + * ap_log_rerror() hasn't been replicated in the phony r + */ + ap_log_error(APLOG_MARK, APLOG_ERR, rc, r->server, + "couldn't create child process: %d: %s", rc, + apr_filename_of_pathname(r->filename)); + } + else { + /* We don't want to leak storage for the key, so only allocate + * a key if the key doesn't exist yet in the hash; there are + * only a limited number of possible keys (one for each + * possible thread in the server), so we can allocate a copy + * of the key the first time a thread has a cgid request. + * Note that apr_hash_set() only uses the storage passed in + * for the key if it is adding the key to the hash for the + * first time; new key storage isn't needed for replacing the + * existing value of a key. + */ + void *key; + + if (apr_hash_get(script_hash, &cgid_req.conn_id, sizeof(cgid_req.conn_id))) { + key = &cgid_req.conn_id; + } + else { + key = apr_pcalloc(pcgi, sizeof(cgid_req.conn_id)); + memcpy(key, &cgid_req.conn_id, sizeof(cgid_req.conn_id)); + } + apr_hash_set(script_hash, key, sizeof(cgid_req.conn_id), + (void *)procnew->pid); + } + } + } + return -1; +} + +static int cgid_start(apr_pool_t *p, server_rec *main_server, + apr_proc_t *procnew) +{ + daemon_should_exit = 0; /* clear setting from previous generation */ + if ((daemon_pid = fork()) < 0) { + ap_log_error(APLOG_MARK, APLOG_ERR, errno, main_server, + "mod_cgid: Couldn't spawn cgid daemon process"); + return DECLINED; + } + else if (daemon_pid == 0) { + if (pcgi == NULL) { + apr_pool_create(&pcgi, p); + } + cgid_server(main_server); + exit(-1); + } + procnew->pid = daemon_pid; + procnew->err = procnew->in = procnew->out = NULL; + apr_pool_note_subprocess(p, procnew, APR_KILL_AFTER_TIMEOUT); +#if APR_HAS_OTHER_CHILD + apr_proc_other_child_register(procnew, cgid_maint, procnew, NULL, p); +#endif + return OK; +} + +static int cgid_init(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp, + server_rec *main_server) +{ + apr_proc_t *procnew = NULL; + int first_time = 0; + const char *userdata_key = "cgid_init"; + module **m; + int ret = OK; + + root_server = main_server; + root_pool = p; + + apr_pool_userdata_get((void **)&procnew, userdata_key, main_server->process->pool); + if (!procnew) { + first_time = 1; + procnew = apr_pcalloc(main_server->process->pool, sizeof(*procnew)); + procnew->pid = -1; + procnew->err = procnew->in = procnew->out = NULL; + apr_pool_userdata_set((const void *)procnew, userdata_key, + apr_pool_cleanup_null, main_server->process->pool); + } + + if (!first_time) { + total_modules = 0; + for (m = ap_preloaded_modules; *m != NULL; m++) + total_modules++; + + ret = cgid_start(p, main_server, procnew); + if (ret != OK ) { + return ret; + } + cgid_pfn_reg_with_ssi = APR_RETRIEVE_OPTIONAL_FN(ap_register_include_handler); + cgid_pfn_gtv = APR_RETRIEVE_OPTIONAL_FN(ap_ssi_get_tag_and_value); + cgid_pfn_ps = APR_RETRIEVE_OPTIONAL_FN(ap_ssi_parse_string); + + if ((cgid_pfn_reg_with_ssi) && (cgid_pfn_gtv) && (cgid_pfn_ps)) { + /* Required by mod_include filter. This is how mod_cgid registers + * with mod_include to provide processing of the exec directive. + */ + cgid_pfn_reg_with_ssi("exec", handle_exec); + } + } + return ret; +} + +static void *create_cgid_config(apr_pool_t *p, server_rec *s) +{ + cgid_server_conf *c = + (cgid_server_conf *) apr_pcalloc(p, sizeof(cgid_server_conf)); + + c->logname = NULL; + c->logbytes = DEFAULT_LOGBYTES; + c->bufbytes = DEFAULT_BUFBYTES; + c->sockname = ap_server_root_relative(p, DEFAULT_SOCKET); + return c; +} + +static void *merge_cgid_config(apr_pool_t *p, void *basev, void *overridesv) +{ + cgid_server_conf *base = (cgid_server_conf *) basev, *overrides = (cgid_server_conf *) overridesv; + + return overrides->logname ? overrides : base; +} + +static const char *set_scriptlog(cmd_parms *cmd, void *dummy, const char *arg) +{ + server_rec *s = cmd->server; + cgid_server_conf *conf = ap_get_module_config(s->module_config, + &cgid_module); + + conf->logname = ap_server_root_relative(cmd->pool, arg); + + if (!conf->logname) { + return apr_pstrcat(cmd->pool, "Invalid ScriptLog path ", + arg, NULL); + } + return NULL; +} + +static const char *set_scriptlog_length(cmd_parms *cmd, void *dummy, const char *arg) +{ + server_rec *s = cmd->server; + cgid_server_conf *conf = ap_get_module_config(s->module_config, + &cgid_module); + + conf->logbytes = atol(arg); + return NULL; +} + +static const char *set_scriptlog_buffer(cmd_parms *cmd, void *dummy, const char *arg) +{ + server_rec *s = cmd->server; + cgid_server_conf *conf = ap_get_module_config(s->module_config, + &cgid_module); + + conf->bufbytes = atoi(arg); + return NULL; +} + +static const char *set_script_socket(cmd_parms *cmd, void *dummy, const char *arg) +{ + server_rec *s = cmd->server; + cgid_server_conf *conf = ap_get_module_config(s->module_config, + &cgid_module); + + conf->sockname = ap_server_root_relative(cmd->pool, arg); + + if (!conf->sockname) { + return apr_pstrcat(cmd->pool, "Invalid Scriptsock path ", + arg, NULL); + } + + return NULL; +} + +static const command_rec cgid_cmds[] = +{ + AP_INIT_TAKE1("ScriptLog", set_scriptlog, NULL, RSRC_CONF, + "the name of a log for script debugging info"), + AP_INIT_TAKE1("ScriptLogLength", set_scriptlog_length, NULL, RSRC_CONF, + "the maximum length (in bytes) of the script debug log"), + AP_INIT_TAKE1("ScriptLogBuffer", set_scriptlog_buffer, NULL, RSRC_CONF, + "the maximum size (in bytes) to record of a POST request"), + AP_INIT_TAKE1("Scriptsock", set_script_socket, NULL, RSRC_CONF, + "the name of the socket to use for communication with " + "the cgi daemon."), + {NULL} +}; + +static int log_scripterror(request_rec *r, cgid_server_conf * conf, int ret, + apr_status_t rv, char *error) +{ + apr_file_t *f = NULL; + struct stat finfo; + char time_str[APR_CTIME_LEN]; + int log_flags = rv ? APLOG_ERR : APLOG_ERR; + + ap_log_rerror(APLOG_MARK, log_flags, rv, r, + "%s: %s", error, r->filename); + + /* XXX Very expensive mainline case! Open, then getfileinfo! */ + if (!conf->logname || + ((stat(conf->logname, &finfo) == 0) + && (finfo.st_size > conf->logbytes)) || + (apr_file_open(&f, conf->logname, + APR_APPEND|APR_WRITE|APR_CREATE, APR_OS_DEFAULT, r->pool) != APR_SUCCESS)) { + return ret; + } + + /* "%% [Wed Jun 19 10:53:21 1996] GET /cgid-bin/printenv HTTP/1.0" */ + apr_ctime(time_str, apr_time_now()); + apr_file_printf(f, "%%%% [%s] %s %s%s%s %s\n", time_str, r->method, r->uri, + r->args ? "?" : "", r->args ? r->args : "", r->protocol); + /* "%% 500 /usr/local/apache/cgid-bin */ + apr_file_printf(f, "%%%% %d %s\n", ret, r->filename); + + apr_file_printf(f, "%%error\n%s\n", error); + + apr_file_close(f); + return ret; +} + +static int log_script(request_rec *r, cgid_server_conf * conf, int ret, + char *dbuf, const char *sbuf, apr_bucket_brigade *bb, + apr_file_t *script_err) +{ + const apr_array_header_t *hdrs_arr = apr_table_elts(r->headers_in); + const apr_table_entry_t *hdrs = (apr_table_entry_t *) hdrs_arr->elts; + char argsbuffer[HUGE_STRING_LEN]; + apr_file_t *f = NULL; + apr_bucket *e; + const char *buf; + apr_size_t len; + apr_status_t rv; + int first; + int i; + struct stat finfo; + char time_str[APR_CTIME_LEN]; + + /* XXX Very expensive mainline case! Open, then getfileinfo! */ + if (!conf->logname || + ((stat(conf->logname, &finfo) == 0) + && (finfo.st_size > conf->logbytes)) || + (apr_file_open(&f, conf->logname, + APR_APPEND|APR_WRITE|APR_CREATE, APR_OS_DEFAULT, r->pool) != APR_SUCCESS)) { + /* Soak up script output */ + discard_script_output(bb); + if (script_err) { + while (apr_file_gets(argsbuffer, HUGE_STRING_LEN, + script_err) == APR_SUCCESS) + continue; + } + return ret; + } + + /* "%% [Wed Jun 19 10:53:21 1996] GET /cgid-bin/printenv HTTP/1.0" */ + apr_ctime(time_str, apr_time_now()); + apr_file_printf(f, "%%%% [%s] %s %s%s%s %s\n", time_str, r->method, r->uri, + r->args ? "?" : "", r->args ? r->args : "", r->protocol); + /* "%% 500 /usr/local/apache/cgid-bin" */ + apr_file_printf(f, "%%%% %d %s\n", ret, r->filename); + + apr_file_puts("%request\n", f); + for (i = 0; i < hdrs_arr->nelts; ++i) { + if (!hdrs[i].key) + continue; + apr_file_printf(f, "%s: %s\n", hdrs[i].key, hdrs[i].val); + } + if ((r->method_number == M_POST || r->method_number == M_PUT) + && *dbuf) { + apr_file_printf(f, "\n%s\n", dbuf); + } + + apr_file_puts("%response\n", f); + hdrs_arr = apr_table_elts(r->err_headers_out); + hdrs = (const apr_table_entry_t *) hdrs_arr->elts; + + for (i = 0; i < hdrs_arr->nelts; ++i) { + if (!hdrs[i].key) + continue; + apr_file_printf(f, "%s: %s\n", hdrs[i].key, hdrs[i].val); + } + + if (sbuf && *sbuf) + apr_file_printf(f, "%s\n", sbuf); + + first = 1; + APR_BRIGADE_FOREACH(e, bb) { + if (APR_BUCKET_IS_EOS(e)) { + break; + } + rv = apr_bucket_read(e, &buf, &len, APR_BLOCK_READ); + if (!APR_STATUS_IS_SUCCESS(rv) || (len == 0)) { + break; + } + if (first) { + apr_file_puts("%stdout\n", f); + first = 0; + } + apr_file_write(f, buf, &len); + apr_file_puts("\n", f); + } + + if (script_err) { + if (apr_file_gets(argsbuffer, HUGE_STRING_LEN, + script_err) == APR_SUCCESS) { + apr_file_puts("%stderr\n", f); + apr_file_puts(argsbuffer, f); + while (apr_file_gets(argsbuffer, HUGE_STRING_LEN, + script_err) == APR_SUCCESS) + apr_file_puts(argsbuffer, f); + apr_file_puts("\n", f); + } + } + + if (script_err) { + apr_file_close(script_err); + } + + apr_file_close(f); + return ret; +} + +static apr_status_t close_unix_socket(void *thefd) +{ + int fd = (int)thefd; + + return close(fd); +} + +static int connect_to_daemon(int *sdptr, request_rec *r, + cgid_server_conf *conf) +{ + struct sockaddr_un unix_addr; + int sd; + int connect_tries; + apr_interval_time_t sliding_timer; + + memset(&unix_addr, 0, sizeof(unix_addr)); + unix_addr.sun_family = AF_UNIX; + strcpy(unix_addr.sun_path, conf->sockname); + + connect_tries = 0; + sliding_timer = 100000; /* 100 milliseconds */ + while (1) { + ++connect_tries; + if ((sd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) { + return log_scripterror(r, conf, HTTP_INTERNAL_SERVER_ERROR, errno, + "unable to create socket to cgi daemon"); + } + if (connect(sd, (struct sockaddr *)&unix_addr, sizeof(unix_addr)) < 0) { + if (errno == ECONNREFUSED && connect_tries < DEFAULT_CONNECT_ATTEMPTS) { + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, errno, r, + "connect #%d to cgi daemon failed, sleeping before retry", + connect_tries); + close(sd); + apr_sleep(sliding_timer); + if (sliding_timer < apr_time_from_sec(2)) { + sliding_timer *= 2; + } + } + else { + close(sd); + return log_scripterror(r, conf, HTTP_SERVICE_UNAVAILABLE, errno, + "unable to connect to cgi daemon after multiple tries"); + } + } + else { + apr_pool_cleanup_register(r->pool, (void *)sd, close_unix_socket, + apr_pool_cleanup_null); + break; /* we got connected! */ + } + /* gotta try again, but make sure the cgid daemon is still around */ + if (kill(daemon_pid, 0) != 0) { + return log_scripterror(r, conf, HTTP_SERVICE_UNAVAILABLE, errno, + "cgid daemon is gone; is Apache terminating?"); + } + } + *sdptr = sd; + return OK; +} + +static void discard_script_output(apr_bucket_brigade *bb) +{ + apr_bucket *e; + const char *buf; + apr_size_t len; + apr_status_t rv; + APR_BRIGADE_FOREACH(e, bb) { + if (APR_BUCKET_IS_EOS(e)) { + break; + } + rv = apr_bucket_read(e, &buf, &len, APR_BLOCK_READ); + if (!APR_STATUS_IS_SUCCESS(rv)) { + break; + } + } +} + +/**************************************************************** + * + * Actual cgid handling... + */ + +struct cleanup_script_info { + request_rec *r; + unsigned long conn_id; + cgid_server_conf *conf; +}; + +static apr_status_t dead_yet(pid_t pid, apr_interval_time_t max_wait) +{ + apr_interval_time_t interval = 10000; /* 10 ms */ + apr_interval_time_t total = 0; + + do { +#ifdef _AIX + /* On AIX, for processes like mod_cgid's script children where + * SIGCHLD is ignored, kill(pid,0) returns success for up to + * one second after the script child exits, based on when a + * daemon runs to clean up unnecessary process table entries. + * getpgid() can report the proper info (-1/ESRCH) immediately. + */ + if (getpgid(pid) < 0) { +#else + if (kill(pid, 0) < 0) { +#endif + return APR_SUCCESS; + } + apr_sleep(interval); + total = total + interval; + if (interval < 500000) { + interval *= 2; + } + } while (total < max_wait); + return APR_EGENERAL; +} + +static apr_status_t cleanup_nonchild_process(request_rec *r, pid_t pid) +{ + kill(pid, SIGTERM); /* in case it isn't dead yet */ + if (dead_yet(pid, apr_time_from_sec(3)) == APR_SUCCESS) { + return APR_SUCCESS; + } + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "CGI process %" APR_PID_T_FMT " didn't exit, sending SIGKILL", + pid); + kill(pid, SIGKILL); + if (dead_yet(pid, apr_time_from_sec(3)) == APR_SUCCESS) { + return APR_SUCCESS; + } + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "CGI process %" APR_PID_T_FMT " didn't exit, sending SIGKILL again", + pid); + kill(pid, SIGKILL); + + return APR_EGENERAL; +} + +static apr_status_t cleanup_script(void *vptr) +{ + struct cleanup_script_info *info = vptr; + int sd; + int rc; + cgid_req_t req = {0}; + pid_t pid; + apr_status_t stat; + + rc = connect_to_daemon(&sd, info->r, info->conf); + if (rc != OK) { + return APR_EGENERAL; + } + + /* we got a socket, and there is already a cleanup registered for it */ + + req.req_type = GETPID_REQ; + req.conn_id = info->r->connection->id; + + stat = sock_write(sd, &req, sizeof(req)); + if (stat != APR_SUCCESS) { + return stat; + } + + /* wait for pid of script */ + stat = sock_read(sd, &pid, sizeof(pid)); + if (stat != APR_SUCCESS) { + return stat; + } + + if (pid == 0) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, info->r, + "daemon couldn't find CGI process for connection %lu", + info->conn_id); + return APR_EGENERAL; + } + return cleanup_nonchild_process(info->r, pid); +} + +static int cgid_handler(request_rec *r) +{ + conn_rec *c = r->connection; + int retval, nph, dbpos = 0; + char *argv0, *dbuf = NULL; + apr_bucket_brigade *bb; + apr_bucket *b; + cgid_server_conf *conf; + int is_included; + int seen_eos, child_stopped_reading; + int sd; + char **env; + apr_file_t *tempsock; + struct cleanup_script_info *info; + apr_status_t rv; + + if (strcmp(r->handler,CGI_MAGIC_TYPE) && strcmp(r->handler,"cgi-script")) + return DECLINED; + + conf = ap_get_module_config(r->server->module_config, &cgid_module); + is_included = !strcmp(r->protocol, "INCLUDED"); + + if ((argv0 = strrchr(r->filename, '/')) != NULL) + argv0++; + else + argv0 = r->filename; + + nph = !(strncmp(argv0, "nph-", 4)); + + argv0 = r->filename; + + if (!(ap_allow_options(r) & OPT_EXECCGI) && !is_scriptaliased(r)) + return log_scripterror(r, conf, HTTP_FORBIDDEN, 0, + "Options ExecCGI is off in this directory"); + if (nph && is_included) + return log_scripterror(r, conf, HTTP_FORBIDDEN, 0, + "attempt to include NPH CGI script"); + +#if defined(OS2) || defined(WIN32) +#error mod_cgid does not work on this platform. If you teach it to, look +#error at mod_cgi.c for required code in this path. +#else + if (r->finfo.filetype == 0) + return log_scripterror(r, conf, HTTP_NOT_FOUND, 0, + "script not found or unable to stat"); +#endif + if (r->finfo.filetype == APR_DIR) + return log_scripterror(r, conf, HTTP_FORBIDDEN, 0, + "attempt to invoke directory as script"); + + if ((r->used_path_info == AP_REQ_REJECT_PATH_INFO) && + r->path_info && *r->path_info) + { + /* default to accept */ + return log_scripterror(r, conf, HTTP_NOT_FOUND, 0, + "AcceptPathInfo off disallows user's path"); + } +/* + if (!ap_suexec_enabled) { + if (!ap_can_exec(&r->finfo)) + return log_scripterror(r, conf, HTTP_FORBIDDEN, 0, + "file permissions deny server execution"); + } +*/ + ap_add_common_vars(r); + ap_add_cgi_vars(r); + env = ap_create_environment(r->pool, r->subprocess_env); + + if ((retval = connect_to_daemon(&sd, r, conf)) != OK) { + return retval; + } + + rv = send_req(sd, r, argv0, env, CGI_REQ); + if (rv != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + "write to cgi daemon process"); + } + + info = apr_palloc(r->pool, sizeof(struct cleanup_script_info)); + info->r = r; + info->conn_id = r->connection->id; + info->conf = conf; + apr_pool_cleanup_register(r->pool, info, + cleanup_script, + apr_pool_cleanup_null); + /* We are putting the socket discriptor into an apr_file_t so that we can + * use a pipe bucket to send the data to the client. APR will create + * a cleanup for the apr_file_t which will close the socket, so we'll + * get rid of the cleanup we registered when we created the socket. + */ + + apr_os_pipe_put_ex(&tempsock, &sd, 1, r->pool); + apr_pool_cleanup_kill(r->pool, (void *)sd, close_unix_socket); + + if ((argv0 = strrchr(r->filename, '/')) != NULL) + argv0++; + else + argv0 = r->filename; + + /* Transfer any put/post args, CERN style... + * Note that we already ignore SIGPIPE in the core server. + */ + bb = apr_brigade_create(r->pool, r->connection->bucket_alloc); + seen_eos = 0; + child_stopped_reading = 0; + if (conf->logname) { + dbuf = apr_palloc(r->pool, conf->bufbytes + 1); + dbpos = 0; + } + do { + apr_bucket *bucket; + + rv = ap_get_brigade(r->input_filters, bb, AP_MODE_READBYTES, + APR_BLOCK_READ, HUGE_STRING_LEN); + + if (rv != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + "Error reading request entity data"); + return HTTP_INTERNAL_SERVER_ERROR; + } + + APR_BRIGADE_FOREACH(bucket, bb) { + const char *data; + apr_size_t len; + + if (APR_BUCKET_IS_EOS(bucket)) { + seen_eos = 1; + break; + } + + /* We can't do much with this. */ + if (APR_BUCKET_IS_FLUSH(bucket)) { + continue; + } + + /* If the child stopped, we still must read to EOS. */ + if (child_stopped_reading) { + continue; + } + + /* read */ + apr_bucket_read(bucket, &data, &len, APR_BLOCK_READ); + + if (conf->logname && dbpos < conf->bufbytes) { + int cursize; + + if ((dbpos + len) > conf->bufbytes) { + cursize = conf->bufbytes - dbpos; + } + else { + cursize = len; + } + memcpy(dbuf + dbpos, data, cursize); + dbpos += cursize; + } + + /* Keep writing data to the child until done or too much time + * elapses with no progress or an error occurs. + */ + rv = apr_file_write_full(tempsock, data, len, NULL); + + if (rv != APR_SUCCESS) { + /* silly script stopped reading, soak up remaining message */ + child_stopped_reading = 1; + } + } + apr_brigade_cleanup(bb); + } + while (!seen_eos); + + if (conf->logname) { + dbuf[dbpos] = '\0'; + } + + /* we're done writing, or maybe we didn't write at all; + * force EOF on child's stdin so that the cgi detects end (or + * absence) of data + */ + shutdown(sd, 1); + + /* Handle script return... */ + if (!nph) { + const char *location; + char sbuf[MAX_STRING_LEN]; + int ret; + + bb = apr_brigade_create(r->pool, c->bucket_alloc); + b = apr_bucket_pipe_create(tempsock, c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, b); + b = apr_bucket_eos_create(c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, b); + + if ((ret = ap_scan_script_header_err_brigade(r, bb, sbuf))) { + return log_script(r, conf, ret, dbuf, sbuf, bb, NULL); + } + + location = apr_table_get(r->headers_out, "Location"); + + if (location && location[0] == '/' && r->status == 200) { + + /* Soak up all the script output */ + discard_script_output(bb); + apr_brigade_destroy(bb); + /* This redirect needs to be a GET no matter what the original + * method was. + */ + r->method = apr_pstrdup(r->pool, "GET"); + r->method_number = M_GET; + + /* We already read the message body (if any), so don't allow + * the redirected request to think it has one. We can ignore + * Transfer-Encoding, since we used REQUEST_CHUNKED_ERROR. + */ + apr_table_unset(r->headers_in, "Content-Length"); + + ap_internal_redirect_handler(location, r); + return OK; + } + else if (location && r->status == 200) { + /* XX Note that if a script wants to produce its own Redirect + * body, it now has to explicitly *say* "Status: 302" + */ + discard_script_output(bb); + apr_brigade_destroy(bb); + return HTTP_MOVED_TEMPORARILY; + } + + ap_pass_brigade(r->output_filters, bb); + } + + if (nph) { + struct ap_filter_t *cur; + + /* get rid of all filters up through protocol... since we + * haven't parsed off the headers, there is no way they can + * work + */ + + cur = r->proto_output_filters; + while (cur && cur->frec->ftype < AP_FTYPE_CONNECTION) { + cur = cur->next; + } + r->output_filters = r->proto_output_filters = cur; + + bb = apr_brigade_create(r->pool, c->bucket_alloc); + b = apr_bucket_pipe_create(tempsock, c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, b); + b = apr_bucket_eos_create(c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, b); + ap_pass_brigade(r->output_filters, bb); + } + + return OK; /* NOT r->status, even if it has changed. */ +} + + + + +/*============================================================================ + *============================================================================ + * This is the beginning of the cgi filter code moved from mod_include. This + * is the code required to handle the "exec" SSI directive. + *============================================================================ + *============================================================================*/ +static int include_cgi(char *s, request_rec *r, ap_filter_t *next, + apr_bucket *head_ptr, apr_bucket **inserted_head) +{ + request_rec *rr = ap_sub_req_lookup_uri(s, r, next); + int rr_status; + apr_bucket *tmp_buck, *tmp2_buck; + + if (rr->status != HTTP_OK) { + ap_destroy_sub_req(rr); + return -1; + } + + /* No hardwired path info or query allowed */ + + if ((rr->path_info && rr->path_info[0]) || rr->args) { + ap_destroy_sub_req(rr); + return -1; + } + if (rr->finfo.filetype != APR_REG) { + ap_destroy_sub_req(rr); + return -1; + } + + /* Script gets parameters of the *document*, for back compatibility */ + + rr->path_info = r->path_info; /* hard to get right; see mod_cgi.c */ + rr->args = r->args; + + /* Force sub_req to be treated as a CGI request, even if ordinary + * typing rules would have called it something else. + */ + ap_set_content_type(rr, CGI_MAGIC_TYPE); + + /* Run it. */ + + rr_status = ap_run_sub_req(rr); + if (ap_is_HTTP_REDIRECT(rr_status)) { + apr_size_t len_loc; + const char *location = apr_table_get(rr->headers_out, "Location"); + conn_rec *c = r->connection; + + location = ap_escape_html(rr->pool, location); + len_loc = strlen(location); + + /* XXX: if most of this stuff is going to get copied anyway, + * it'd be more efficient to pstrcat it into a single pool buffer + * and a single pool bucket */ + + tmp_buck = apr_bucket_immortal_create("<A HREF=\"", + sizeof("<A HREF=\"") - 1, + c->bucket_alloc); + APR_BUCKET_INSERT_BEFORE(head_ptr, tmp_buck); + tmp2_buck = apr_bucket_heap_create(location, len_loc, NULL, + c->bucket_alloc); + APR_BUCKET_INSERT_BEFORE(head_ptr, tmp2_buck); + tmp2_buck = apr_bucket_immortal_create("\">", sizeof("\">") - 1, + c->bucket_alloc); + APR_BUCKET_INSERT_BEFORE(head_ptr, tmp2_buck); + tmp2_buck = apr_bucket_heap_create(location, len_loc, NULL, + c->bucket_alloc); + APR_BUCKET_INSERT_BEFORE(head_ptr, tmp2_buck); + tmp2_buck = apr_bucket_immortal_create("</A>", sizeof("</A>") - 1, + c->bucket_alloc); + APR_BUCKET_INSERT_BEFORE(head_ptr, tmp2_buck); + + if (*inserted_head == NULL) { + *inserted_head = tmp_buck; + } + } + + ap_destroy_sub_req(rr); + + return 0; +} + + +/* This is the special environment used for running the "exec cmd=" + * variety of SSI directives. + */ +static void add_ssi_vars(request_rec *r, ap_filter_t *next) +{ + apr_table_t *e = r->subprocess_env; + + if (r->path_info && r->path_info[0] != '\0') { + request_rec *pa_req; + + apr_table_setn(e, "PATH_INFO", ap_escape_shell_cmd(r->pool, r->path_info)); + + pa_req = ap_sub_req_lookup_uri(ap_escape_uri(r->pool, r->path_info), r, NULL); + if (pa_req->filename) { + apr_table_setn(e, "PATH_TRANSLATED", + apr_pstrcat(r->pool, pa_req->filename, pa_req->path_info, NULL)); + } + ap_destroy_sub_req(pa_req); + } + + if (r->args) { + char *arg_copy = apr_pstrdup(r->pool, r->args); + + apr_table_setn(e, "QUERY_STRING", r->args); + ap_unescape_url(arg_copy); + apr_table_setn(e, "QUERY_STRING_UNESCAPED", ap_escape_shell_cmd(r->pool, arg_copy)); + } +} + +static int include_cmd(include_ctx_t *ctx, apr_bucket_brigade **bb, char *command, + request_rec *r, ap_filter_t *f) +{ + char **env; + int sd; + apr_status_t rc = APR_SUCCESS; + int retval; + apr_bucket_brigade *bcgi; + apr_bucket *b; + apr_file_t *tempsock = NULL; + cgid_server_conf *conf = ap_get_module_config(r->server->module_config, + &cgid_module); + struct cleanup_script_info *info; + + add_ssi_vars(r, f->next); + env = ap_create_environment(r->pool, r->subprocess_env); + + if ((retval = connect_to_daemon(&sd, r, conf)) != OK) { + return retval; + } + + SPLIT_AND_PASS_PRETAG_BUCKETS(*bb, ctx, f->next, rc); + if (rc != APR_SUCCESS) { + return rc; + } + + send_req(sd, r, command, env, SSI_REQ); + + info = apr_palloc(r->pool, sizeof(struct cleanup_script_info)); + info->r = r; + info->conn_id = r->connection->id; + info->conf = conf; + /* for this type of request, the script is invoked through an + * intermediate shell process... cleanup_script is only able + * to knock out the shell process, not the actual script + */ + apr_pool_cleanup_register(r->pool, info, + cleanup_script, + apr_pool_cleanup_null); + /* We are putting the socket discriptor into an apr_file_t so that we can + * use a pipe bucket to send the data to the client. APR will create + * a cleanup for the apr_file_t which will close the socket, so we'll + * get rid of the cleanup we registered when we created the socket. + */ + apr_os_pipe_put_ex(&tempsock, &sd, 1, r->pool); + apr_pool_cleanup_kill(r->pool, (void *)sd, close_unix_socket); + + bcgi = apr_brigade_create(r->pool, r->connection->bucket_alloc); + b = apr_bucket_pipe_create(tempsock, r->connection->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bcgi, b); + ap_pass_brigade(f->next, bcgi); + + return 0; +} + +static int handle_exec(include_ctx_t *ctx, apr_bucket_brigade **bb, request_rec *r, + ap_filter_t *f, apr_bucket *head_ptr, apr_bucket **inserted_head) +{ + char *tag = NULL; + char *tag_val = NULL; + char *file = r->filename; + apr_bucket *tmp_buck; + char parsed_string[MAX_STRING_LEN]; + + *inserted_head = NULL; + if (ctx->flags & FLAG_PRINTING) { + if (ctx->flags & FLAG_NO_EXEC) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "exec used but not allowed in %s", r->filename); + CREATE_ERROR_BUCKET(ctx, tmp_buck, head_ptr, *inserted_head); + } + else { + while (1) { + cgid_pfn_gtv(ctx, &tag, &tag_val, 1); + if (tag_val == NULL) { + if (tag == NULL) { + return (0); + } + else { + return 1; + } + } + if (!strcmp(tag, "cmd")) { + cgid_pfn_ps(r, ctx, tag_val, parsed_string, sizeof(parsed_string), 1); + if (include_cmd(ctx, bb, parsed_string, r, f) == -1) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "execution failure for parameter \"%s\" " + "to tag exec in file %s", tag, r->filename); + CREATE_ERROR_BUCKET(ctx, tmp_buck, head_ptr, *inserted_head); + } + /* just in case some stooge changed directories */ + } + else if (!strcmp(tag, "cgi")) { + apr_status_t retval = APR_SUCCESS; + + cgid_pfn_ps(r, ctx, tag_val, parsed_string, sizeof(parsed_string), 0); + SPLIT_AND_PASS_PRETAG_BUCKETS(*bb, ctx, f->next, retval); + if (retval != APR_SUCCESS) { + return retval; + } + + if (include_cgi(parsed_string, r, f->next, head_ptr, inserted_head) == -1) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "invalid CGI ref \"%s\" in %s", tag_val, file); + CREATE_ERROR_BUCKET(ctx, tmp_buck, head_ptr, *inserted_head); + } + } + else { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "unknown parameter \"%s\" to tag exec in %s", tag, file); + CREATE_ERROR_BUCKET(ctx, tmp_buck, head_ptr, *inserted_head); + } + } + } + } + return 0; +} +/*============================================================================ + *============================================================================ + * This is the end of the cgi filter code moved from mod_include. + *============================================================================ + *============================================================================*/ + + +static void register_hook(apr_pool_t *p) +{ + static const char * const aszPre[] = { "mod_include.c", NULL }; + + ap_hook_post_config(cgid_init, aszPre, NULL, APR_HOOK_MIDDLE); + ap_hook_handler(cgid_handler, NULL, NULL, APR_HOOK_MIDDLE); +} + +module AP_MODULE_DECLARE_DATA cgid_module = { + STANDARD20_MODULE_STUFF, + NULL, /* dir config creater */ + NULL, /* dir merger --- default is to override */ + create_cgid_config, /* server config */ + merge_cgid_config, /* merge server config */ + cgid_cmds, /* command table */ + register_hook /* register_handlers */ +}; + diff --git a/rubbos/app/httpd-2.0.64/modules/generators/mod_cgid.exp b/rubbos/app/httpd-2.0.64/modules/generators/mod_cgid.exp new file mode 100644 index 00000000..5f10d486 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/generators/mod_cgid.exp @@ -0,0 +1 @@ +cgid_module diff --git a/rubbos/app/httpd-2.0.64/modules/generators/mod_cgid.la b/rubbos/app/httpd-2.0.64/modules/generators/mod_cgid.la new file mode 100644 index 00000000..7528f2d9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/generators/mod_cgid.la @@ -0,0 +1,35 @@ +# mod_cgid.la - a libtool library file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='' + +# Names of this library. +library_names='' + +# The name of the static archive. +old_library='mod_cgid.a' + +# Libraries that this one depends upon. +dependency_libs=' -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib' + +# Version information for mod_cgid. +current= +age= +revision= + +# Is this an already installed library? +installed=no + +# Should we warn about portability when linking against -modules? +shouldnotlink=yes + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='' diff --git a/rubbos/app/httpd-2.0.64/modules/generators/mod_cgid.lo b/rubbos/app/httpd-2.0.64/modules/generators/mod_cgid.lo new file mode 100644 index 00000000..3d819a78 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/generators/mod_cgid.lo @@ -0,0 +1,12 @@ +# mod_cgid.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/mod_cgid.o' + +# Name of the non-PIC object. +non_pic_object='mod_cgid.o' + diff --git a/rubbos/app/httpd-2.0.64/modules/generators/mod_cgid.o b/rubbos/app/httpd-2.0.64/modules/generators/mod_cgid.o new file mode 100644 index 0000000000000000000000000000000000000000..ffbaef812c25e88640a4f12cb69947e7f511d373 GIT binary patch literal 153464 zcmc${3w)H-@i+cFyUVhWzy=}`1Z0%}K`s&y1VKz7!CeTLkOZQJO9%lX5F*(iDiAb@ zvTmuQ#Y=z1LbbKD+KTq_Ln;t&fZ7YiUaa@p8xikXs`bMEJ2U5;=h@vrZQu9ve;?)9 zIWu!+=FFKh=kh$eX(}w5;jwK?U$!;Xa!ML&S)r>OY#yWYtN~U(D_q@&O5ymeD?Ie! zJNo1@T%&`7T9_-`d_%wr$Bu@B1&5vt4zkL_Th|0i!_9AHh2x6?;YlYN&pR;!_}pj0 zTg$Qo;n?58vDZ!&XSKFBo)wPw2SYSH9G{*MzLdl@z7TGHD(mV6PcC!hzZH12J4m_5 z4iLvdx*eyR!sec26zT;!2u;?x>{B>nZ~pv9?4SAb@?&4*mq%j%$S;e;ep{aVHd!1f zioH=3d#51w&+za!Sw(AmIQHcF%H~f`MK5lBsj>gw6;ME$u3nH|nZF=^Vg4etc{8aE zSHBdtUx`e5Yu%*TTSs1a;>QZla^lIA9RD%Bd7`iJe@<-9ZC|$S#I8j9^UL$g@?#%y z+snhT--ToUDh<azg}FK5tsAnlxPDQ5Rd!Z5_6}Uj<$~Cs@*gFu_IYue9WTr{a1Qle z%$Lp1%57&hv?NDb;`qD#KnPXBvCr8f!WMfMZU`UF%L2s;AErA#@&fe9hM|zL`1)^I z#Nt!k6OMVwQ{mVP)SbrvF#c#bK0h3;?m^XaPljWM!|}Pr;rM`O_fbD9mD4kF+pm6d z*|smoADf;<?1;1GQ+71%L#I8>T}X`$lEf={^D{W|9}xWfi5}ZnUEFH^*oSzGy$B~3 z#Qx66*7o&pKqz_|5pV3zpBIV!p52;XK0EeH68DRO*yEAd$0YQ?cj0jEpPSx#9eS5y zzzoR&5RSEEzktu&b{a_-YDKYh=?m$o@Zo}Nac`_3JD~d~-e`qePe!NE&<P!+0jex( z>>i2x!;=cKi<<@&#l2x-q-c2bR1lrs(_xHW7>@5?%}c}M2CyjwvDbsG6dmE4o_ZZ0 zI+o$00`2~-k7e&6j@Thq7>+k@hW2p$#_&F%t)h7IVlK~GACCQAwSWf828{4H><9-7 z-zy3hJR9D+T?x7<JGY%<MG1_P6PULk_68G7qfx&o_GSu>D|U=Jb?OvDYJBC-f0P1= zy5%H|mBQS=lvCG+Z+dGtwIDw3=eusPt)i`~vO{DahDlj=Mnb>b4Zhs=qS(9p$ip9o zAHX;SQ)u5R6c2aB%~}?_+!xup(ZiZgEJU11qi4t7dvp!x`-tm69%4VYokv(fEIXT- zWAE~Z9+}~-zW#Aeb>W*nZE88!3J2%Bkb9DOTHAxIpF<8Z9U0>EcYgCzc58d=>EM=I zNLL+h$WyVyx>jr_FkEP!xF!-i+}J(8`LkfKwF17<`r`%J8HMq#V)mo|gn}aExvj++ z;jQ(7<3m3`bt)YHN;bIyfs)RF5^TK-MMTMNeCR0QjA!B`UX-0t5LeD%fh7=lZQ#+5 zpy2q?&rY2>u^Xuz{E_(7aP>bVDM6eX=CCR&mXq6l;$}TQ!)G>hBSd!0bz;EEpP$=a z7(1-`KN9;LW%OV0+)yq_Y(;o$Wp)NS06iOy{geF^hOb-NU}HEAN?CSJJTDNN9*V?g z1R~8-vaQ)$F$xP1E*Th?*<^1xp0_xRv6&U;gaRnEmwGAMU$-v<S)jQ+(A;i^TaPuq z8!O7rj>Hd8n6pa67uBE01rT@u0g<N>Ji>qoBS*BJigpo0fhdMq8T*RKh}f&KcjI{^ zr{eh7Pfwj{ZI7OfEW0A1cQ%6){{ESau(Irlh=DH5-1vMrUY4Cl!Sn9%5B^2<8{5Gt zgSjj_4D?Ha{yuRQqb0%C7KlTyWaqxr+P<k&jk`#EiUfFgYcxBsF905CVBq*SSVFM1 z8r?)v0+IMd*^qpb!p{P}`AIv1*<n&;c6QTGa@#vD29Dz-EdHe?<``Fx=~(i`sZ%hN zd<01si=>uisMYZqNUr=mpF-hRlnNq9^ePps4^a<Z9>BPl*bc|OlDz^*EKB0Iv7=(q z?3~?p5xOmdl5rRf!XyXp6A(E}eGUH?Wru<-mmmaoW3}*fuyw!Bvcztr=;B9-iyRUz ziv9hRS~w{;w#-D1py&>7o>(1hA*Y5hd_puS%czXRUf_x4z(amf707)?r4x>Y+3^Rn zH=`ONNn#^Ddt&Y}<Y<G4<%Hwq$iUQwSTO(;VxDlUFc5B@WCdI2Q;)>#jw{&PB+Cl^ zENpN7WOcCRLlicDvOL&IPTjoTQyXlpWXOw(G~x<#pUK~Ag{Xl=*^7&0A;)cu#9Oj= zqk1?Fofrb)Nlye@yl6xuJ`d?&L-t|>E}MMQ`uZbaM2-r!e!%O=&FkSa4994<%@d*M z6(A$c2dSS?`ZY@V%?IyB$qu$Y&J~)e0#6P_u~U)Qtz2K`CzPlnYXXr!M~wug`Qz%~ zEtjCHG`3?lf`<DIEnOOHU5n!8^<Hb)HnblwT9?nA>1r{pTUD20xvH1NKW6=ilL}aj ziSdB|^dVVb=$tHyPdSQqO+`z_V_guA|Cr3989f}1PiFJN@vjq3wTCl=Ea`Y^R4h@< zT8f_;!?7n!m&boB3Y9oGyPzocFZeqWd;0imAJY&Iwq6buop#c%U^C|H0$N}!&fg0M z!$lp`Ti?MDgVF=EC{bpVBA_NC+`_Re&f{3NAq>`YsPVEu@ukrSfXEHm6+EK~x|(qD z$!^B!EHJ)jo7MrFu@?XqRl{!l)^ZFtEN?R+@p9HDpPopp5U5QVtfFH*CWlBonmq<C z4z^??W@)_TgyWKQ^O1{2at^1gb}qt!$y7faAES&fB7Q6rTHEu{sUcW~Q9miz@_P=L zJcQDzU~3SHuqL9sVTNw*GctJZ=D~~UgU33J?v9JWuID!$fkX{qM6oB$$p1bn^ZJ3z zWC_J2K`o8`eFAVse@>?fU>>FcP7fXb02CaQ2N&E-&4|Q~YGb4sw>Xv<{gL>N?9J>D z*=B@Q0(#9^CsOv|*)~=GWGmRR6A?yB;2oTN&5|_O`g<DNH$6ppI$<t@eG=K71ip;? z$xe(>GJF;L3DuQ*q+ys%Pew<D<J%NJQa+rE{Q|Qk%Pm5`VEHLBIwI&fJ-;9P7)@t( zt{915Ruo@}{Hm77*v61pMZ1Gy`an0_Om|9zMPg5cDNPq*R@_QVVG3ASPC-|MrO3oc zY#N+ch=9*1ij@acV<?m79H0TJ1e)|7iL)}w@`l$fn<bM@XGS1LxwuI(M#Gnq4BjG) zqlqqQJiowg8R2G1;ddi*!1j)9_*}Nl8ISLNk~AJM+VfFuBo-l&A~ZjTMq(s>F}K1s z{$|H647NOs+8s|~nX1+wh@$2Vn5Bbvw0AtnXqr(e1GAv6;rM#p7ng;%&WHDS?GO2V zk+)P1QJ{yAv1u6{>nLT!yjYK1$qQmm9_S$@ibf8)ZjzQa1_>z~@1^A#&_fW(+krvG zt#PeS%6J#ArjOV=rC64PX+s}xnn=?|Q9S#obYp9K1VcaC^Xdh;?bw5=c4H3)-@lpr z3=I>GMmgco`6d59l8+=4?V%J%od0|Iw138d$<H%}S=Nccm=$sEAr@nAgI&#_Z+GQg zP57qI4;~t2H4V%?>1?U5|Fvn3^w-r3_Ku!|G>T0&&&TDt?YwyBO?2~H>%;L<_;_4c z_HXaf8lE<~$9*5r)V7c6M$@naULQM3=M3AzaW9P|wOoFOayXrVz_l1uvV_k${?B)* za_ou5L&Qtd)qs680FJ-<wj%rxCn^J4-)<a3^U)(-Nz=K{9C#LNY5@AOvGZ10gze~P zMED%Q2Ao#H@&4=+EY+UH%z+T^ntQCH3=BHW>YR^l@eVCCHd5BqoH*1f4<B1tLiB(f zJLnk$*4(En=C*fMRjhgqwO#Qy|52LKaRP=FGC~pOJU6|Sb6(O>MHUd0r!U92;X!a~ z2$O_r_@NK)kM?2s(KK>x42WQBS1gK=w$NFP;YTU)nI+Oal!v7*0{p}K4_wH#UZYUY z4{m>21y4QpP3<C<`XU@G`0&H~u_Fm?FUTIoJi7zImS2Fhc|-OvB${8KW8<xNLpbf` z-a@JQV^6T<O4M%NUx8F<M{8+EgBmbWubF=uK!tF8qgvG<n5N*|59dC#VEPdUMzG~) zR0aEC@`GzX{46cuZ+eQ{l`u;c5O*ujFIdUOv67A662X!xBSM=a37$d(_I6SYOa2#O zc48;TdpN#716XHXp|x-yH7l7NeoHq*PG=Iot|Zn#V#iD{A)u$^?*&#Ca&(||{Dt=@ z0)wsncoDkMaxdy=!rn-Ih{Wz%)h*@>>0YeO=8X-GqBdmbIa6*J%epBf!OdDIGTjR} z<Z3!5rbz-rk|NNG_M_~NmF-4rEBd}#4ncSlrNvQ3VJ@~DZ-=*51Z17Ee>1HSFk5C| zTXako=G?c`v`nU<R#Ch@5SjF9V`j$#(6MaW?Dzx}gDv-<MEhttXAZV}2W5eyFBi6+ zYW#y7P%oxrP=S*S98pKu=;&lNvtZKkO}Vt2T^y<YJY0RGVEFOy){FY)$NmtW^eeKe zq9Azr$6+t>Nu>G@h4$wXc2t3>w9$m;&?qLrEX;7hI}Vd^YNw3T2BvjnpdWQUr&@wm z=JX)vWX-OAd)gsi4lUlN@M#g(l!4KL^Dc_VE#wnqo<1iAIO88lFoQy@TR5K4d_z|5 zx_5ZSlpv5QvDWpd8HxX|vo05yTY#hBqOH|>sZojv^&s&T#X_<qK)R+a=X5ce(swEe zK~E}ZpMk2#G#$5Np;g%OcCcjxfHMX9hBp!DRi|On<7+-KO#xHvah16-mmZge?F{58 z&N8feFCA2M^m4Hp#sQj9<@k=rPoq_j!9R6C>mf|}d(nTVIvxXLe0xT3uI$8{YPr^# zH$lQG7kfoo0t&;{?b(z?jN1`gvBS|#@bi1{FSnEyVu1+8c|0%6IpAo;`8!5UbUN<< zog+ttO)x^EFg&RxoBFruJQh$CFGL=|!YlQpc>$eqe*V`}rwU>pcO2yH<Nm}YGvY21 zdn(xSITlx&Ct^_-L=fDxk&gs|t$(K_7ewrX2>PVR*gKlKXDx(rF}(G$Y-*5MbjMqH zM;+g&&!t-zbL`LV{9HQhK9?3j$>-8rX|kd~4;RG##c5b|KaJwB6FB+tdFe>$Me(KC z8Lh`QT^xy@m5tM~Xefe3BKidaRP6$CFq>aM4$a2_A&$PX3MbD<-|!3?fc7*Wx0^q< zgSTvD-C9qfIu}MSS|CU-#-0ktS7gQW(s34tO-(sQ__1go?8FjuGH-tKAv@gsG&DuC z(>FZ7`7w?WOq?<UUX48YO0ebc<WKVeF4*!1l=nlObt0ddT+B_O=%|n`NOS|%IV|Pd zNmANS&V5^QY6a!gVsxoI_Pd@I?iE(_+Sa$D_au4s#8*r>ynx|DVer78op7Km<(era zy0QIO&&b2Ao1v91u{8D$PT?3tf*FmY5N--1Iw}xssy*nbuo^$^{_c1Y>n6^%bTHLY z!zJR4J(0jxM9V8DzvkooQ6E0yaUGViA7X)30f!z&K9MWo=|dPK6=GPDGS7M($9)5= zu|jJfMhL>4S`t27m_haN8Bm`*k8(3+$6klC)l(C_*pZz!DKI<j#>=pNA!}Ug7Zwm# z%amLUQFRO%z;eL}cus03ek4w7zLYG0TMp8SNS}pGN3bv<93Od97~|vFRAh|BG;33` z2{A<;ar6RJip1umAL?kvV{YHF07ntI$8t|TdJ<{XF^K6Y&r0CKg6y+`TRw*;!$=oL zAr~tzdS=4Ub3Xh5VUMA>>~ITHZG?ZLXghcr@GKYO_pI>NpD;sy>?wZc!USw(^080^ zpH<lUc5urV&_m1zmg=fx@<y1<JjkQxC?B9n&Cg2E5z99<OL%Kb_7+qo-%OMvZ(7l` z(*z00i?Lp+<R}2Jg7mUrF%Y9tTM23fwNj~tu(IHmW-a8vE<jA$ZHIBn7CXF;Fu~TR zVSnDq!=7O44+QcBTfYh@_M6=H$2+_ypYUPJ740sM!NSdleJ7vrM7u4cGD@E2H|(hQ z5H@^d>4A{euOAXKb`P-naWOq9M$y7N0FdLi09&oHa7=YLnTNIL;eAvq*!mAF=Eb}h z1%i2WR`H*j7i+{p^iQ%kLnv<z3$O}*|20__pNrwp{20^lB(*RjzCHU0_+rK3V9Pqt z)DsExU%}S;yxG+!Bai>hTNIP^YEkS1eumAy<@~e)burHhqIx^ep4iF%K3omA!V}0f zcjL1t_EUPJA`&|bQ?fok--rj5^>_%;ne14rOieBFL>1<oftMH7E!lfXVG?KVN!aY1 zlKoVqZs!wxxFsCpIrRARud;Vqeh(3P8D&z#t+1R&qRL$8=Q3`viQkqyWZ33kOS}sy z(EN!n*m4f=NvEDSCQ0i!iIo=33^)<lfakCQm>?pch9;AG-mN3V>lq!!)B9k{dSnMo zu=Pf`K9T*p79TSwnH}^DDvXZi*o3Am3W(QVk$~vI#GlGiVmmvL$d4=XJ3JM%WVd(X z+@x^WE=)05rqHqTS_Ch;d%LQO{Q!c>bH<=TJI9=;l6I3T$d>WS7J4p5lT`h`>E$9E zieoQQkHLlNGh@C_BF%^G<L|sIE$$C71(P0QvzqSEgCW>*9gC+;y=?y~bC2<!Y<-?M zUZK$`8?x(jk1<l!#vxb~dmj*1V4w4JVeH+)*gN@;|J`%>*62E$IguQPDQ+7NjCgm7 z&ZSOYp@bn5wtNR;FdV;w;uOnIJZ6<1KG3fF74ux|tZZK1v)qoK=>?;n)lA^#J9UJW z4*D31BRoBL{?pRN=ahxc$-e9x#_O74R~XfRmuu5X%mm(nIS%hx+3^4i(7TA^h;7NH z&2RcBp>~YHN{16_^P3*ZsU3ZQI7FFZz5U2T9iO8yi4_(DlTe`$2wh=k$Eee`zFga- zjky}e(7cT2UCzYXF#>C)PFh8?5Oa~YlUmiAN36;vDwT6T>ZLkOX%}-ep>qpxD1ktx zbDP%lHPTtw5ju_0c+kiP3rxeZMlXqr;y;vyf1!1NRvhZ#dQMSnRrY!@og(LHgiPVq zx-Ps8!<ISn_+OE@aXKyP@s^1@cOwhn3<&gmXCZ<IOqiHoz~q_-Sr~es;@M>Z7Swsc zuaGaOjd&3&n!SGC2oza09si6)f~5&PEXGtnN24Lk+*_yHk*$@#v_LHoYRrpgCI!u; z<HUXJwSw3u1+fnbVqY)=`QuY|FpWeW9N~Dq3_+s3#<bLt(|QPmj@?A%VSoJ83zE}s zM1XY+LzooBK88HJ!}QwhYS{batiuIQqZz6pG-J|KwJ#kvCqBrtbm&ZZXK@j>J1g+a zke-`xiorvSzwz$WCuf;hEn%S)U5H%_jbLsN4PzNC<RiRjF*3U#)*<8U&pOI<jCNqz zm;W<6Klrmks|Bj>fa)nDg4^38%}?9GpS9=PhfcgfJ?xq-ij?QD;{@0^RIN)71W;Fe zei#s%K>K06{PIVt)3eFHt{JCeCA3o;(NHYE5Ha)+01ZX3=-mZc*wGJDM*dA-e1_BC zy`SP%5S;y9$4$sBbi~Thi=Du8@>(QTII>DcZVb>?oUDQ={6ZX#WyC;a>j1re(Lw_t ztQOqP9wItaPWfnt#~TRXXb%)3HPY)Rcns6{Zh?}=X9dS=KBS(HJsAz+tUOEJ$>Z}! zr(4y~=0ysdkb(%u<@vYlQfTA(h&C*`n+}!k<Cb#0Q^!u+A?J4910iaGdI)P)hM8(i z({oO>D8!gKY{8MI^lCBprEt8vUMD&yj2#ofqn?NG2CMn4jOJ4~`X$Yq%9~GlqZ6A? z`M7<J=bCqZ^g3LeAA9k5F`gm79T|Af(7fM=N8U8hr4NM0a&ScWTO$eMJ^dhc7qej+ zdlXyRbWijV32K}R=(PuJ+}R&0n!_nZJoi4vB0YFg&tLQ#O03&rcaTfyg2I&Rdz*6Y zp1_`tt}BcgTb!@q|K@Z0<&lEv;Yd+I;oP}1=2$}-tkr9lE~;K$yL5E5wQ9}sh6@2V ztf^jUU1ouLNeCQ6aD}cO(y#yp{7?Vkqr2dTELCvL+O=!eb|-vsepz@?WX_B$1S*@G zKc}<^uk;mICFO;4uUu4GHa9Zo@`S>o@;Qa2)ANhLQ&nHTs<yf+TDzw1!u6w8M5Faf zN5LkmXpJDPDfyxB+`<``o^PE$)tYi){#2{BZe7)?+NB{hF0{60S?K&B4d;hy>tL7_ zQKZu9wYBw8YFMbgD!L++L?~LbT;ZW=R0A_xkvY?g$_rppUHytt7Bo~fj9Rv4ZFSAk zQPJz`Ypm<m)<$bW(KR8|2`#OvS-qw%RKIpjbxi|&wzlTl#+rsGyu?oIZn0~CZm3^V z*HA-v`WIcgrV&itt;-9`tm$j&qBV8VQAIU%%cCnSh+Vp<wyrh`pDbEigMNwDtOcTa zRpZi{MJuZ6maeK<OSFcD+C|H2qKl$c%NGH=2;OL{(S-V{wGB0k8lr1!>y}$J>uajH z$CVUxx_AZ-a3H1MP^L95TLw*z5AlX~UDc9R()hJCRd55jwkDeB4FqWQn!380>S$;% z;v~^i%c^Qu)hrzuYFJfMQxDrhOKRZU8gyWE?e%W?N<w1os%7v+Xm#VNXl*^&v9`9R zfyM**O!q}?LumP$x|+!$0QvP*)hobPvvzfD9fGTFIpP}^IV9BBP_s0&q%j(*TN4dc zty;C_I+P`Th~7xC7$SQcVIPb{sI0A8T|*XdsKGS2KE$$6Z5bLyu}4>9-O9Q(*C8&> zSVJ*`UxiWin#NU2>xM-kt4`ut1s1DUP9>{`tZHOE6#AM4u3lQpwQJVbM&aR_x~1gc z(#YkrB1J|2DSxPHc~vbPNzhdljn=HL=YCcp6q-{U=8>mHjqpi<9lC5yBiaD3IWf}^ zt%?d?g1mKWR@T7uwFsCsYp)MgHH3`J{OanO`e-qRZlrG6n$VhM%fQ&cebqqyw{}<q z4`7js<sxMx#8MTvTn)w$23KwLdc;SxN-<thPo3KkDnvh%4-qOP8@(7^0oWL$<?3vC zNocz6qK5h^bg(<{bP_-%!_`=~s<v(=d{DbSv~<mCcvKG=?tH^nEyF35Pb@HeODHf> zxpdqazEzYp>Ou&WRA#q*)yOByYeI-sMD?0wop7^g@oN?L2E`QQa?54-Yrj)wBx*ed zqYQkVt*VXJkSwZK)UH};!WN;hwictXMrIvpui;mINvML^X(`W8T5ocHCtH`8AM|)x zT1$BdnK@dumdqy2Q6!5xjB#>BRR|L!4?GpsOKX-iE?-U!tVJ-gp~SzsYJKhM#?_%! zoW4Uj=;9^UqdCJ#2r;;;lT4*Y*K4S~p~hVcX$3=J%~}i|GNSm3(lQ`;T1l{vMVs`C z!Jv}F>ec9SnKVP!)nd{kM)a1-kE7Y}|HIp6)Tf2kzq>Yr;r|6+vR$)ouq+(i;0mxg zDK>4Q{hzu#c7Py{2dAX?@X1F&K5QKP5{(zyUSF5mx~Sy|aETT8H%tRvz>Sj)xXA&V z9EO`5?9C3gd7-J+;()F5Nv~KT;^Rc@5|F|-9L{e!;DZkM5P|+cPc+>ljgX4_jSXF= z)M&+B^KUfZ40;;Gyj_dy4LI+623)e=fU7^yVBojZAof{CxApfxD?7E@4Zj9j!8d-+ zplX!ci`~!bgBtW6isc)Y^%-FLa*<{8-NSb;-+g@V!goL4yYqeX=8$}5i0NqqE<$}V zr~4fvJ<5dccadx{r~BQ6_E>4;qA38=kATzzKI@7CZ}0qpX%0Bs0qJ!W#ZV1U)TF=t z0AOx)`n!&r^!HZcy&I3<-=7QEC-6rdfCErhr$r1%|Lk)k;tQ9EQ!Iiu4pzEl7bE(7 zQn2l#Bt!}xres0l!;qrvqjNe1_H;mcw?tvH0dfQCdJHTB%*OQ?<Y?~^dTucJ$sf4T zsdW`Vj**^M*8>a&dR|3=$xjP<UPazi;N=cD*8vweARVhKUh<y;$qx#o2U`lvbii{R zaJU0f0~GHffUvnItm;J_>JRiIkUG>K$R?0F6pbQ~I@BMacg}lJhx!AB1X9QN1H}ZA zNBx1T2_%pD1Iq{`kNN}G5=b8P2R0B$9`y%qC6GMk4}6V4$774`MHwDjNZ(8lYZp4s zTbK!|!qQvM3LNf$7dhZ%4mi^R%N=mB1Fm$ybq;uw1AYadbZT(SC<ErwKq8729A{ET zM)@+>?hmZOz4vvvWm2}X&hiK7lg}M`rQ1|f;GVXF585O~@V#uxQUaf4uf{+WxR1TW zz-QY<2JUM=VBmiCG}L9wdXFUW{=lcOq!$fm#%4}PL-OV@m-5#BDEkBF;eIw%7z02I zXZl&gCnxat8GSG0F{#f)1D-u9Un@9!!Uzra9erIw-M+cEqRite)c2yJfO%Z?oj{<1 zCz1^T!Cyjfy1-Ki&JcJi&0jR6E!1OE`WF02OU~+hd2gubyRznbt8av7y1v*HT772| ztRxrTiAH2tS-z~PbHU76^2=w}uFQ|K4Az|$CVc{~zD+wP>$;G3Lsru!FyMd7TA%f; z`Dg<-BWst_?5z8!q8OL;-38#4W@r6?%#&tkJva|-JWJ~Ss0whFz<XXr-H^bKtN?$G zz&|0GV+8)$A;1#_-b-+v!29wbCoJ$|1Q!c@fZz&&+y4Rn#R5M;@Ct#Ss>El#PMOp$ zZsQC6{_zGTE#~QWlDbX7pE@1T?=ym>UHv{MSlZI>3xY#Z_Y}c7oW}cEHWkK5!REq5 zDPW-jN}d#aTnI~{3m1x|;O9bx6aw}+=)%QP=x)<2xk3u*JSOX<kimth6nfj=qYjk9 z**uIlOQEkF0p(^XWZ6R@tyu~K><K7rk-`xB5wLBO!f5+N6z-P7g<RMrg)v;%Ernbz z?2*D)&INm=a1q<qE`<s96zF*h-*v~;?|--(vij|!Mv5!HO`wABrRGYg^}C-(6-H7A zddweK0&br9$!wna2}`}n*dmS1lvHsw%9+#-iT-nLq!`HZ^&hnr1pJSS@13kzq(=Yo z%fP_qhWg*|Tflv>ZL<1rn2#>C`eNtZe-mK?eQ{D`_1{czMqiw^S^aM&m~sFa!Go{= zop&4X-uD3Z?t*1NCJnO8Hxad&6uOG_!3>Z%3BugRrl0_RTzo&hxli-~Co4-omlhms zxi5VXtwh+->E~SzQ1dhvf+v`f{`@W=dCE%vodf=1kHNmsPPNi#>LVn3K4_&;b)s;& ztCdD7X=%e{uV~Lm|BWn}ARzt4btK11qlxMh&Dd2e9<YBCs<ZI}o(SS`2peB9;LuLM zZ2W*DPC^>+ER8COk^#RUSO)8WUy)oHtOJfxf*H`ap~@QYN0Jf}F)tkhdWyiWP=MtL z{5rt}0{@x9M)J;pza2o`Vk<acz%hc(X+XaZ_${q7*k=R&K<f<jv=2l!dfUL!t>`?K zG;mA}hzcHm3xR^abO&HDdf-%Ay^GNU^XdT)5FTFOi`4_ClXcmGFC>{c0?+&&;4uQv zc^U9Tfs6kRSXwslYJP88@RbBt2)uyc6#`#FCa<^BXt{p}K<-43)q59U8ASd7;kk#- z{VG|L<r_5V5K!*e6#Aek4{O#z*S!p|KiI9%AdekHMi@|U4GP%YnVcU6^|D{Y1D${r zGVR}@z`t@}S%a=W2UzxM-k{fS1kBbBdgEU3DEKeW02WUUdh<u<Tk+(e4`?0{?+yBh z`cphM=rd}Pcx=!Yq-&xw`o>!zA2ij-L7VQ>x+e~5_JUD#-^v43;IEJ$q(=wsAQqVy z2YrWhD4X_#fmb%QF9ED<dTs+?Wz+LJ0FNP$-jxL?!J}tWc9;NcCf}wIG>vZLd&C{N z)E^+D`~hmdKR_b57HN}O>}`Kwj;4@qp->gnS)nO+8VW(6kXC=-X50s640_{9e5yVm z&<)eRh`P%k_%$fK;tW!saqnlKn>`pYD5GBmPACMdb4j8<@Ef#?!z?tJmZ=P$H;I<5 z{=jfZ7{r+KOUU;F1Lv2{1CC8Pzw82l3N9zuC$-O?Hy#CErVgIySq)fB8a&B!2MTP` z;K?3ZFRH?&OrRERK!TR=9elgz6>ty0$)h#6&BI|JRln}xIFP~}o;SdiA%(j<$5F_V zu<{3}zCZ8|?!CT=n^<(8=M-Spku!LYXAWN3lgf{HoIx`9CtQ$0GWch#Q0ds~8IT1X zQfD9A6;h(V>$wWjSoEI3nZ6(P)}s6PGHEuJI(>bkAV7&e$43oQq6hdUgG-4%&qs+i zBy|RJAx8>Be3W*_NZ|seOq9Y%A5DaLQW)(cH-)7zjtfOnnBXIy6-!|v7b>K1sjmkN zT`Yyme6!FSE2NOmg?cGWXKCxDP{@T1QV4T<HcMe9Q?^K9wvRf0n-s3#!rfAs%WS)( zP{xJtNMRlqb}RRO&+{le%I>{;@Imh@ncAa|dtE*Eq}S!%r@fSlGDO-lUYb#|r0^UU zLQ?pZmwc_<dyETXgz`HsObkJaHTVTD^^eaUlqbZOy+1@x76|cmFS*<2Iahi7&s<g> z|0|0rmTJejP%!|Do53f%w7pv_gm=8uFUsNXdoP3VdZB#ijiaC({tqr}9?-C4g*Et} z+(PB!PrUSHsBOw$-}iLDMdv}jwaYX3fG6BnJFMLu>Q8uvp;AB;J>?<qDTf{Qj6*>= z>=`a7hy9WZIa23&4|z{JjK|7Ep}fe2DN=Zu3(9q`a-FbHUT2E(&Ko?WDunV^4{be^ zdyX?@g;3t)I?6roGex=QL#AvNwr*ZZGh3vP=5>W&5AP&2?rx!Ecxn3DC57Hx*e!*# zykx;1DfHt$-7AIuUK+aXQW(f}jz}TIg`-k9p9?QYVJHiDT?#o|_=^-S;Mh7Yg-P7^ z?@3`Y7d}3p`f>17E?Bmd^0*XGrD<HsP^Ac)m!(RxxD-;QIb6z7rDAr=7*#5jh*za~ zT*_0W3ND3J>1wvWSd|uVsZ5oYN{ris8`suagO_n>v7)Wu(h5~t$)$Q#TFs^Ps<ehn zn^oyrZv)mQTU4pROYv-Z#1k7?dxa{s@<3XwO1H|eQl;CyG)L5{(${2QsnT{CS*mn5 zm$s<VH@UP;mA=LL?)J!xmt9;6TX^AAkzL-4h7<Kx_Iw%`3ciwHS-fOlO|UFjvKJ66 z3zqCf1c#(<6~VG#$*v|?7E#$X1Wy#6<pk#me9hTV8y0vqO%TP|Y(u@|te`43NU^6X zHcGKav7R%@cz@u0+<VC)hh{M>WiYW}LPb9D2ddyd9Bg4&aEo(>yhX{0H4l03o994l z-|FakYsiO`d!@xgPTquhC8O_JYshDuQwCI9Lu{K8PYALK@j1jdcrWKu_i~J3kIH9{ zdE3C}575F<=5oL9IbixzJ41uJ^4uk3rW?bS6w-W@_XASs!INi(6oNc?(#G*1Oa2fo z%km8wI|Ih1n!%WaLw4!?A>n@D=Vj86rPLGwZ(R<oKd>5iULKMMGWpgOYCtJ5wPIgm z*1I+9&l6ZP$sAsPW>S_?;=g)`>->W1(9H9au44^F$qEeF_60Dc$r{pDX~3`D3Q&po zI@LjYcTPa3aqHw!!C4HS%l90<kLCLmRqxSm;Fm@oDFUd%;Mg62B@BMc%Qb<2Pj;v< zc!^pjfj{I=q*Vfc$X}=`MFNTQ2l8=e`9sfn5FpFX8#=fjdYWYp9pcCznnSS2A3B0q zME=mx1dIHkxdex#?nN)c0XYIsq`ES&hVlX9L}(|KIOTu|IU}Q}$8DE;C#L~Sbw6&A z1Hk~}yYXGTnkG%kncf7M_#a6q$F`>rP?K_wmydTOW^=mmiH^i<PFI^IF^SonZZ=I~ zSscJQX*Nw_Au05<ho7rgF*zCbg(!>>N+$3BCQ9LKF62oe%cl80EQLXGMmC^&^-?S6 zJbOF@R0t*8rj^NJDGasqKv{tU`kYx`h4~y~IkR^g@QT9*oa=yPCk%G}Sp#*otHuGe z&Zd627xYZNQ4gUb$oc*NsbD&Za_Dk`gH4zwllUaE=J}=OA-$dPXvX(7BU$BQqyYv~ z&H<L=GUsaQHvu2L0$3RWIs3i?m_sY)F(*WG4oo7n;M=Kj5~4XzkX#AToTmq&wQ>}Z zbA;-Kl>GM}((=dTeBguUMb3u=D)^(pgckfs!YldzBwb4W$1GELKA8-B4jM#<cxMw6 z3E+c=OnSt?5Xjwu^#`a;{=m1-q5EWDdKEBY27!d-T%0r7o(}}a^@^Me?f!#wT#w^W zR&hOn3-W9(XQDgEC);G83i3;NET|yQXJIPH3+-uSyF}tFdnDATAfIc`KtTohRdx*u zD#)wsCKObV*D|G81k|~Me4V`wY>UxKYDsSroyq$)JP-lQej*ieibzv0SjTD#=@Sb1 zQ+u#TlgR=h(||+8l|b|+g^UHF6|lJSUYmBVoYfyD2AVMy>5z9nFp}_fT@g!LpiCv3 zYKf@Vz4rq42mXXRhwJc*z5vMQF2iyz7-!E8A?lVau`Zavpmfs(m)fPkOZvIsa_%PS znG1^SD?yQ-xuAq8A;_m=Cx3ui?hlY>So;NYZ7-Ppfe+b+>j3wXCB%z}JAYscA!ubW zFnz>`eJJ#8#GYuxNP2u^^~DQp)`(I3{D`A=#Aq5V0cpmF3%7!wTQnl~D8RE{!;SuB zUW*%qlRSUmY1{{9jkqlPJT+EE<T>MVL_TSfaWi5XX_5n_5z|SNdQLu~-~?o3`9?0S zgbdE-|7I=_vqsij2!6J3WbImj>~qc&ua8{$7M88ts*$Tmtb$iBBv9~mY=gjSoP)NJ z^@I-z{#rV$l4Ht|YYCqt_y&SU3fxF1N;1WbTt{*y3VuD|^8~)0@L_>(Bz&>J8wg(^ z@Fwck#R4}Gyh7m3#8WTuO$4tOxS4o13*18R7J>QOy4wW4h46O^d@BX;E`ejTLfS3x zZRDyw0>_DeufTj5*e>u^!XFX%s{|hv_;$}=%X$G}u>3q6gwx3tA^5Ph8?YZhvUJe4 z>%bu3{&T^?18fF>OuiKnM59pFZ{(rOJ8^@I07!Tr0-~k*;|qZ3eVwUFqa~AX)F+DR z>6<}6n+*K{F|uS<M6sDk_)PMo>&ffL=YC3ZpC)#u69mPX_~6GeF9G0&t+WP)>~Efx ztzydF;l#Ur55WQUjm_`GWC*;IY*UB8_AU}Nu-LwLmyvNF+b+D{nFd}ZV>jWIjPDaH z4<zj$(BR7w{s*WfIRZaO@EC!ANbp2~e?)Mezz>m}usF)zGYB^DoRVcneXpW0V6A00 z`ZyzU3b)t!*dQrf$2=Ku3^^bNk}TWrvA;lJcth=SDsWRSAd0U)KU?<>7-Cr?6oQ>4 z)U!Fcc`q^4vw4QHMiQ%ikxgUIz5&$X%a&4^1P@=*xQyVzhzAx4m?qRwYpX3==00mQ z)%ToFkMF$?qWXnWrs@i$G^#+VEH%7Eg!aCwYe<>dyhWz6w}@+u0jp(SOK981ejpcK zyOx|bHfq@oP9wWKEsY!j9<~<<qH37%aOP9kKS{Ii;eD_D1K@{4<~?2#DlNUoOZ_t( zuPqavy|H$kWq->{juMt{@qT_3T(rweCza#a%x`;1zQFf-NwmQCu@DLGeZX>fXDM$i zqfy}f6VT!UE-R4R$8PqHVW(vd(`;N8wlUO63S_5A3lB&OPoWC6@PMm@2V5-_Hfh#D zZkC2g`*6&t_CYVD1wpsF+WUl;gi9Nr^ma#-3jCC}4`A}n)66}p#<CB2DcOwTusY1A zHly%XrDY%S(vTTN4t|CmEFzv|<44t6_Hzsg_7^S(|B@YyKJ5Zsz38~zAIKo^_W(JQ z3`OapBj}k^gVYEb?zf{rk~@a`oem%Fr`;@BIl@n8mE&u`BpOFEn>9g7ll|0LI)tYC zIV?+uLn56M*wg)#``BgE{gi6OWz)G9DJ@`W!{L|$rLqp~p5dpoI;sJK?{XH&gDmW) za1*@|MhiUCPn|Ie-7?EhE){H%-wDIneu`hgU*RY7#uwlwhzhQ*+Ec+2@R&$wQC0K@ z9)JLeBCkZzR%&FuWqbLATH59118RYN-VJDjbus=~_FMMLVCRUm-y$C=(4+&wPGshH zsG@-H60d;o5vWXP;&8EZkj;kEj?QlK(&kDOH}SFY@T#@QiNZLl!Ln~+)1*~5bFeE} zl_D!@WL3IkRk~yeBgtCmlC?-=NmklN-DVGi9l7w#KAQHWq5CLGItO#B){U|3pF0dc zr%^T*!L#3KJcDDa5E=(a#n|gG1gXZ@+NEG@C&mflrZ;H3yFiU5qZFDQNrPh)aJ@zu zuioI}ydMR2IK7@=-{7P76Hr8>Zs3O`;=c_pcq7BsBxb6iRjR%+6=3i9Hbh*4V6VA0 z1WD!AWTM#R>|4boOGrZR2q4U+z<uQ$Sa$iPE^fOlp;R)JY4f=c?6QPX34OZ>@)r8& zgRaZv11i1-6?v4$7W!!D(3Ov|zSu{@hpuUym8$rOkEgA88YiYDK1xiUwu*epP1Woz zVxCSnx(e)aPXq2{p6hTg0cU|d*G6cFB?l1>a^<Q|d&hXVA5ZG-gMNO_1H3fiaepBw z-Mos?Dl|YHR_Y)@mqUe0ccH`{Ly9l4X6RbWP%F6xF&R!PjiQcp@>FD7y~r}@sKKVC zBo1tRp<BVhKD7t?Xdu&-PYZ@2{A`Pg#(-PJ0PlzBekHa)FEfaXu6yMJo%3}}Z+Rr9 zKTqI<7cKqe6v<WQxeeuf?yiA+#zXx1v?e*%R1Xu*9>mKP0wc7vabNaedp)$y+@<g{ z@6f<)3YewY?~#UhHgP}WcP8wTE*q?M_yZhPk>+U!PeMTjKo5`RSgrtj$4$rz(!3t> z<O-BLdh^Hb;i2J3m(Y9ilOQVRgPOsQsi-t<9g4j?)B~Qja3P`SdJab9KsW_uTR1sF z5T{N|odD|$#VYZ;&azC4{cBQV$J_lJ4@J*7#F=LUbX@7gpYGpC!uXyiR-u0<V?a>I zN955a@Oj9o5zeW^Gzxt;i%0ZqT0`n9r~uGDg{^arffkx`m^fxWruhmrcP@<X2SwES zb-0�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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/modules/generators/mod_info.c b/rubbos/app/httpd-2.0.64/modules/generators/mod_info.c new file mode 100644 index 00000000..eb728442 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/generators/mod_info.c @@ -0,0 +1,533 @@ +/* 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. + */ + +/* + * Info Module. Display configuration information for the server and + * all included modules. + * + * <Location /server-info> + * SetHandler server-info + * </Location> + * + * GET /server-info - Returns full configuration page for server and all modules + * GET /server-info?server - Returns server configuration only + * GET /server-info?module_name - Returns configuration for a single module + * GET /server-info?list - Returns quick list of included modules + * + * Rasmus Lerdorf <rasmus@vex.net>, May 1996 + * + * 05.01.96 Initial Version + * + * Lou Langholtz <ldl@usi.utah.edu>, July 1997 + * + * 07.11.97 Addition of the AddModuleInfo directive + * + * Ryan Morgan <rmorgan@covalent.net> + * + * 8.11.00 Port to Apache 2.0. Read configuation from the configuration + * tree rather than reparse the entire configuation file. + * + */ + +#define CORE_PRIVATE + +#include "httpd.h" +#include "http_config.h" +#include "http_core.h" +#include "http_log.h" +#include "http_main.h" +#include "http_protocol.h" +#include "http_request.h" +#include "util_script.h" +#include "apr_strings.h" +#include "apr_lib.h" +#define APR_WANT_STRFUNC +#include "apr_want.h" +#include "ap_mpm.h" + +typedef struct { + const char *name; /* matching module name */ + const char *info; /* additional info */ +} info_entry; + +typedef struct { + apr_array_header_t *more_info; +} info_svr_conf; + +module AP_MODULE_DECLARE_DATA info_module; + +static void *create_info_config(apr_pool_t *p, server_rec *s) +{ + info_svr_conf *conf = (info_svr_conf *) apr_pcalloc(p, sizeof(info_svr_conf)); + + conf->more_info = apr_array_make(p, 20, sizeof(info_entry)); + return conf; +} + +static void *merge_info_config(apr_pool_t *p, void *basev, void *overridesv) +{ + info_svr_conf *new = (info_svr_conf *) apr_pcalloc(p, sizeof(info_svr_conf)); + info_svr_conf *base = (info_svr_conf *) basev; + info_svr_conf *overrides = (info_svr_conf *) overridesv; + + new->more_info = apr_array_append(p, overrides->more_info, base->more_info); + return new; +} + +static void mod_info_html_cmd_string(request_rec *r, const char *string, + int close) +{ + const char *s; + + s = string; + /* keep space for \0 byte */ + while (*s) { + if (*s == '<') { + if (close) { + ap_rputs("</", r); + } else { + ap_rputs("<", r); + } + } + else if (*s == '>') { + ap_rputs(">", r); + } + else if (*s == '&') { + ap_rputs("&", r); + } + else if (*s == ' ') { + if (close) { + ap_rputs(">", r); + break; + } else { + ap_rputc(*s, r); + } + } else { + ap_rputc(*s, r); + } + s++; + } +} + +static void mod_info_module_cmds(request_rec * r, const command_rec * cmds, + ap_directive_t * conftree) +{ + const command_rec *cmd; + ap_directive_t *tmptree = conftree; + char htmlstring[MAX_STRING_LEN]; + int block_start = 0; + int nest = 0; + + while (tmptree != NULL) { + cmd = cmds; + while (cmd->name) { + if ((cmd->name[0] != '<') && + (strcasecmp(cmd->name, tmptree->directive) == 0)) { + if (nest > block_start) { + block_start++; + apr_snprintf(htmlstring, sizeof(htmlstring), "%s %s", + tmptree->parent->directive, + tmptree->parent->args); + ap_rputs("<dd><tt>", r); + mod_info_html_cmd_string(r, htmlstring, 0); + ap_rputs("</tt></dd>\n", r); + } + if (nest == 2) { + ap_rprintf(r, "<dd><tt>    %s " + "<i>%s</i></tt></dd>\n", + ap_escape_html(r->pool,tmptree->directive), + ap_escape_html(r->pool,tmptree->args)); + } else if (nest == 1) { + ap_rprintf(r, + "<dd><tt>  %s <i>%s</i></tt></dd>\n", + ap_escape_html(r->pool,tmptree->directive), + ap_escape_html(r->pool,tmptree->args)); + } else { + ap_rputs("<dd><tt>", r); + mod_info_html_cmd_string(r, tmptree->directive, 0); + ap_rprintf(r, " <i>%s</i></tt></dd>\n", + ap_escape_html(r->pool,tmptree->args)); + } + } + ++cmd; + } + if (tmptree->first_child != NULL) { + tmptree = tmptree->first_child; + nest++; + } else if (tmptree->next != NULL) { + tmptree = tmptree->next; + } else { + if (block_start) { + apr_snprintf(htmlstring, sizeof(htmlstring), "%s %s", + tmptree->parent->directive, + tmptree->parent->args); + ap_rputs("<dd><tt>", r); + mod_info_html_cmd_string(r, htmlstring, 1); + ap_rputs("</tt></dd>\n", r); + block_start--; + } + if (tmptree->parent) { + tmptree = tmptree->parent->next; + } + else { + tmptree = NULL; + } + nest--; + } + + } +} + +typedef struct { /*XXX: should get something from apr_hooks.h instead */ + void (*pFunc)(void); /* just to get the right size */ + const char *szName; + const char * const *aszPredecessors; + const char * const *aszSuccessors; + int nOrder; +} hook_struct_t; + +/* + * hook_get_t is a pointer to a function that takes void as an argument and + * returns a pointer to an apr_array_header_t. The nasty WIN32 ifdef + * is required to account for the fact that the ap_hook* calls all use + * STDCALL calling convention. + */ +typedef apr_array_header_t * ( +#ifdef WIN32 +__stdcall +#endif +* hook_get_t)(void); + +typedef struct { + const char *name; + hook_get_t get; +} hook_lookup_t; + +static hook_lookup_t request_hooks[] = { + {"Post-Read Request", ap_hook_get_post_read_request}, + {"Header Parse", ap_hook_get_header_parser}, + {"Translate Path", ap_hook_get_translate_name}, + {"Check Access", ap_hook_get_access_checker}, + {"Verify User ID", ap_hook_get_check_user_id}, + {"Verify User Access", ap_hook_get_auth_checker}, + {"Check Type", ap_hook_get_type_checker}, + {"Fixups", ap_hook_get_fixups}, + {"Logging", ap_hook_get_log_transaction}, + {NULL}, +}; + +static int module_find_hook(module *modp, + hook_get_t hook_get) +{ + int i; + apr_array_header_t *hooks = hook_get(); + hook_struct_t *elts; + + if (!hooks) { + return 0; + } + + elts = (hook_struct_t *)hooks->elts; + + for (i=0; i< hooks->nelts; i++) { + if (strcmp(elts[i].szName, modp->name) == 0) { + return 1; + } + } + + return 0; +} + +static void module_participate(request_rec *r, + module *modp, + hook_lookup_t *lookup, + int *comma) +{ + if (module_find_hook(modp, lookup->get)) { + if (*comma) { + ap_rputs(", ", r); + } + ap_rvputs(r, "<tt>", lookup->name, "</tt>", NULL); + *comma = 1; + } +} + +static void module_request_hook_participate(request_rec *r, module *modp) +{ + int i, comma=0; + + ap_rputs("<dt><strong>Request Phase Participation:</strong>\n", r); + + for (i=0; request_hooks[i].name; i++) { + module_participate(r, modp, &request_hooks[i], &comma); + } + + if (!comma) { + ap_rputs("<tt> <em>none</em></tt>", r); + } + ap_rputs("</dt>\n", r); +} + +static const char *find_more_info(server_rec *s, const char *module_name) +{ + int i; + info_svr_conf *conf = (info_svr_conf *) ap_get_module_config(s->module_config, + &info_module); + info_entry *entry = (info_entry *) conf->more_info->elts; + + if (!module_name) { + return 0; + } + for (i = 0; i < conf->more_info->nelts; i++) { + if (!strcmp(module_name, entry->name)) { + return entry->info; + } + entry++; + } + return 0; +} + +static int display_info(request_rec *r) +{ + module *modp = NULL; + const char *more_info; + const command_rec *cmd = NULL; +#ifdef NEVERMORE + const handler_rec *hand = NULL; +#endif + server_rec *serv = r->server; + int comma = 0; + + if (strcmp(r->handler, "server-info")) + return DECLINED; + + r->allowed |= (AP_METHOD_BIT << M_GET); + if (r->method_number != M_GET) + return DECLINED; + + ap_set_content_type(r, "text/html; charset=ISO-8859-1"); + + ap_rputs(DOCTYPE_HTML_3_2 + "<html><head><title>Server Information\n", r); + ap_rputs("

    Apache Server Information

    \n", r); + if (!r->args || strcasecmp(r->args, "list")) { + if (!r->args) { + ap_rputs("
    Server Settings, ", r); + for (modp = ap_top_module; modp; modp = modp->next) { + ap_rprintf(r, "%s", modp->name, modp->name); + if (modp->next) { + ap_rputs(", ", r); + } + } + ap_rputs("

    ", r); + + } + if (!r->args || !strcasecmp(r->args, "server")) { + int max_daemons, forked, threaded; + + ap_rprintf(r, "
    Server Version: " + "%s
    \n", + ap_get_server_version()); + ap_rprintf(r, "
    Server Built: " + "%s
    \n", + ap_get_server_built()); + ap_rprintf(r, "
    API Version: " + "%d:%d
    \n", + MODULE_MAGIC_NUMBER_MAJOR, MODULE_MAGIC_NUMBER_MINOR); + ap_rprintf(r, "
    Hostname/port: " + "%s:%u
    \n", + ap_get_server_name(r), ap_get_server_port(r)); + ap_rprintf(r, "
    Timeouts: " + "connection: %d    " + "keep-alive: %d
    ", + (int)(apr_time_sec(serv->timeout)), + (int)(apr_time_sec(serv->timeout))); + ap_mpm_query(AP_MPMQ_MAX_DAEMON_USED, &max_daemons); + ap_mpm_query(AP_MPMQ_IS_THREADED, &threaded); + ap_mpm_query(AP_MPMQ_IS_FORKED, &forked); + ap_rprintf(r, "
    MPM Name: %s
    \n", ap_show_mpm()); + ap_rprintf(r, "
    MPM Information: " + "Max Daemons: %d Threaded: %s Forked: %s
    \n", + max_daemons, threaded ? "yes" : "no", + forked ? "yes" : "no"); + ap_rprintf(r, "
    Server Root: " + "%s
    \n", ap_server_root); + ap_rprintf(r, "
    Config File: " + "%s
    \n", ap_conftree->filename); + ap_rputs("

    ", r); + } + for (modp = ap_top_module; modp; modp = modp->next) { + if (!r->args || !strcasecmp(modp->name, r->args)) { + ap_rprintf(r, "
    Module Name: " + "%s
    \n", + modp->name, modp->name); + ap_rputs("
    Content handlers: ", r); +#ifdef NEVERMORE + hand = modp->handlers; + if (hand) { + while (hand) { + if (hand->content_type) { + ap_rprintf(r, " %s\n", hand->content_type); + } + else { + break; + } + hand++; + if (hand && hand->content_type) { + ap_rputs(",", r); + } + } + } + else { + ap_rputs(" none", r); + } +#else + if (module_find_hook(modp, ap_hook_get_handler)) { + ap_rputs(" yes", r); + } + else { + ap_rputs(" none", r); + } +#endif + ap_rputs("
    ", r); + ap_rputs("
    Configuration Phase Participation:\n", + r); + if (modp->create_dir_config) { + if (comma) { + ap_rputs(", ", r); + } + ap_rputs("Create Directory Config", r); + comma = 1; + } + if (modp->merge_dir_config) { + if (comma) { + ap_rputs(", ", r); + } + ap_rputs("Merge Directory Configs", r); + comma = 1; + } + if (modp->create_server_config) { + if (comma) { + ap_rputs(", ", r); + } + ap_rputs("Create Server Config", r); + comma = 1; + } + if (modp->merge_server_config) { + if (comma) { + ap_rputs(", ", r); + } + ap_rputs("Merge Server Configs", r); + comma = 1; + } + if (!comma) + ap_rputs(" none", r); + comma = 0; + ap_rputs("
    ", r); + + module_request_hook_participate(r, modp); + + cmd = modp->cmds; + if (cmd) { + ap_rputs("
    Module Directives:
    ", r); + while (cmd) { + if (cmd->name) { + ap_rputs("
    ", r); + mod_info_html_cmd_string(r, cmd->name, 0); + ap_rputs(" - ", r); + if (cmd->errmsg) { + ap_rputs(cmd->errmsg, r); + } + ap_rputs("
    \n", r); + } + else { + break; + } + cmd++; + } + ap_rputs("
    Current Configuration:
    \n", r); + mod_info_module_cmds(r, modp->cmds, ap_conftree); + } + else { + ap_rputs("
    Module Directives: none
    ", r); + } + more_info = find_more_info(serv, modp->name); + if (more_info) { + ap_rputs("
    Additional Information:\n
    ", + r); + ap_rputs(more_info, r); + ap_rputs("
    ", r); + } + ap_rputs("

    \n", r); + if (r->args) { + break; + } + } + } + if (!modp && r->args && strcasecmp(r->args, "server")) { + ap_rputs("

    No such module

    \n", r); + } + } + else { + ap_rputs("
    Server Module List
    ", r); + for (modp = ap_top_module; modp; modp = modp->next) { + ap_rputs("
    ", r); + ap_rputs(modp->name, r); + ap_rputs("
    ", r); + } + ap_rputs("

    ", r); + } + ap_rputs(ap_psignature("",r), r); + ap_rputs("\n", r); + /* Done, turn off timeout, close file and return */ + return 0; +} + +static const char *add_module_info(cmd_parms *cmd, void *dummy, + const char *name, const char *info) +{ + server_rec *s = cmd->server; + info_svr_conf *conf = (info_svr_conf *) ap_get_module_config(s->module_config, + &info_module); + info_entry *new = apr_array_push(conf->more_info); + + new->name = name; + new->info = info; + return NULL; +} + +static const command_rec info_cmds[] = +{ + AP_INIT_TAKE2("AddModuleInfo", add_module_info, NULL, RSRC_CONF, + "a module name and additional information on that module"), + {NULL} +}; + +static void register_hooks(apr_pool_t *p) +{ + ap_hook_handler(display_info, NULL, NULL, APR_HOOK_MIDDLE); +} + +module AP_MODULE_DECLARE_DATA info_module = +{ + STANDARD20_MODULE_STUFF, + NULL, /* dir config creater */ + NULL, /* dir merger --- default is to override */ + create_info_config, /* server config */ + merge_info_config, /* merge server config */ + info_cmds, /* command apr_table_t */ + register_hooks +}; diff --git a/rubbos/app/httpd-2.0.64/modules/generators/mod_info.dsp b/rubbos/app/httpd-2.0.64/modules/generators/mod_info.dsp new file mode 100644 index 00000000..7b6a28ec --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/generators/mod_info.dsp @@ -0,0 +1,128 @@ +# Microsoft Developer Studio Project File - Name="mod_info" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=mod_info - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "mod_info.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 "mod_info.mak" CFG="mod_info - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "mod_info - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_info - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "mod_info - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_info_src" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /out:"Release/mod_info.so" /base:@..\..\os\win32\BaseAddr.ref,mod_info.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Release/mod_info.so" /base:@..\..\os\win32\BaseAddr.ref,mod_info.so /opt:ref + +!ELSEIF "$(CFG)" == "mod_info - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_info_src" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_info.so" /base:@..\..\os\win32\BaseAddr.ref,mod_info.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_info.so" /base:@..\..\os\win32\BaseAddr.ref,mod_info.so + +!ENDIF + +# Begin Target + +# Name "mod_info - Win32 Release" +# Name "mod_info - Win32 Debug" +# Begin Source File + +SOURCE=.\mod_info.c +# End Source File +# Begin Source File + +SOURCE=.\mod_info.rc +# End Source File +# Begin Source File + +SOURCE=..\..\build\win32\win32ver.awk + +!IF "$(CFG)" == "mod_info - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_info.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_info.so "info_module for Apache" ../../include/ap_release.h > .\mod_info.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "mod_info - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_info.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_info.so "info_module for Apache" ../../include/ap_release.h > .\mod_info.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/modules/generators/mod_info.exp b/rubbos/app/httpd-2.0.64/modules/generators/mod_info.exp new file mode 100644 index 00000000..c304fa77 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/generators/mod_info.exp @@ -0,0 +1 @@ +info_module diff --git a/rubbos/app/httpd-2.0.64/modules/generators/mod_status.c b/rubbos/app/httpd-2.0.64/modules/generators/mod_status.c new file mode 100644 index 00000000..ba978d63 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/generators/mod_status.c @@ -0,0 +1,857 @@ +/* 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. + */ + +/* Status Module. Display lots of internal data about how Apache is + * performing and the state of all children processes. + * + * To enable this, add the following lines into any config file: + * + * + * SetHandler server-status + * + * + * You may want to protect this location by password or domain so no one + * else can look at it. Then you can access the statistics with a URL like: + * + * http://your_server_name/server-status + * + * /server-status - Returns page using tables + * /server-status?notable - Returns page for browsers without table support + * /server-status?refresh - Returns page with 1 second refresh + * /server-status?refresh=6 - Returns page with refresh every 6 seconds + * /server-status?auto - Returns page with data for automatic parsing + * + * Mark Cox, mark@ukweb.com, November 1995 + * + * 12.11.95 Initial version for www.telescope.org + * 13.3.96 Updated to remove rprintf's [Mark] + * 18.3.96 Added CPU usage, process information, and tidied [Ben Laurie] + * 18.3.96 Make extra Scoreboard variables #definable + * 25.3.96 Make short report have full precision [Ben Laurie suggested] + * 25.3.96 Show uptime better [Mark/Ben Laurie] + * 29.3.96 Better HTML and explanation [Mark/Rob Hartill suggested] + * 09.4.96 Added message for non-STATUS compiled version + * 18.4.96 Added per child and per slot counters [Jim Jagielski] + * 01.5.96 Table format, cleanup, even more spiffy data [Chuck Murcko/Jim J.] + * 18.5.96 Adapted to use new rprintf() routine, incidentally fixing a missing + * piece in short reports [Ben Laurie] + * 21.5.96 Additional Status codes (DNS and LOGGING only enabled if + * extended STATUS is enabled) [George Burgyan/Jim J.] + * 10.8.98 Allow for extended status info at runtime (no more STATUS) + * [Jim J.] + */ + +#define CORE_PRIVATE +#include "httpd.h" +#include "http_config.h" +#include "http_core.h" +#include "http_protocol.h" +#include "http_main.h" +#include "ap_mpm.h" +#include "util_script.h" +#include +#include "scoreboard.h" +#include "http_log.h" +#include "mod_status.h" +#if APR_HAVE_UNISTD_H +#include +#endif +#define APR_WANT_STRFUNC +#include "apr_want.h" +#include "apr_strings.h" + +#ifdef NEXT +#if (NX_CURRENT_COMPILER_RELEASE == 410) +#ifdef m68k +#define HZ 64 +#else +#define HZ 100 +#endif +#else +#include +#endif +#endif /* NEXT */ + +#define STATUS_MAXLINE 64 + +#define KBYTE 1024 +#define MBYTE 1048576L +#define GBYTE 1073741824L + +#ifndef DEFAULT_TIME_FORMAT +#define DEFAULT_TIME_FORMAT "%A, %d-%b-%Y %H:%M:%S %Z" +#endif + +#define STATUS_MAGIC_TYPE "application/x-httpd-status" + +module AP_MODULE_DECLARE_DATA status_module; + +int server_limit, thread_limit; + +#ifdef HAVE_TIMES +/* ugh... need to know if we're running with a pthread implementation + * such as linuxthreads that treats individual threads as distinct + * processes; that affects how we add up CPU time in a process + */ +static pid_t child_pid; +#endif + +/* Implement 'ap_run_status_hook'. */ +APR_IMPLEMENT_OPTIONAL_HOOK_RUN_ALL(ap, STATUS, int, status_hook, + (request_rec *r, int flags), + (r, flags), + OK, DECLINED) + +/* + * command-related code. This is here to prevent use of ExtendedStatus + * without status_module included. + */ +static const char *set_extended_status(cmd_parms *cmd, void *dummy, int arg) +{ + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + ap_extended_status = arg; + return NULL; +} + +static const command_rec status_module_cmds[] = +{ + AP_INIT_FLAG("ExtendedStatus", set_extended_status, NULL, RSRC_CONF, + "\"On\" to enable extended status information, \"Off\" to disable"), + {NULL} +}; + +/* Format the number of bytes nicely */ +static void format_byte_out(request_rec *r, apr_off_t bytes) +{ + if (bytes < (5 * KBYTE)) + ap_rprintf(r, "%d B", (int) bytes); + else if (bytes < (MBYTE / 2)) + ap_rprintf(r, "%.1f kB", (float) bytes / KBYTE); + else if (bytes < (GBYTE / 2)) + ap_rprintf(r, "%.1f MB", (float) bytes / MBYTE); + else + ap_rprintf(r, "%.1f GB", (float) bytes / GBYTE); +} + +static void format_kbyte_out(request_rec *r, apr_off_t kbytes) +{ + if (kbytes < KBYTE) + ap_rprintf(r, "%d kB", (int) kbytes); + else if (kbytes < MBYTE) + ap_rprintf(r, "%.1f MB", (float) kbytes / KBYTE); + else + ap_rprintf(r, "%.1f GB", (float) kbytes / MBYTE); +} + +static void show_time(request_rec *r, apr_interval_time_t tsecs) +{ + int days, hrs, mins, secs; + + secs = (int)(tsecs % 60); + tsecs /= 60; + mins = (int)(tsecs % 60); + tsecs /= 60; + hrs = (int)(tsecs % 24); + days = (int)(tsecs / 24); + + if (days) + ap_rprintf(r, " %d day%s", days, days == 1 ? "" : "s"); + + if (hrs) + ap_rprintf(r, " %d hour%s", hrs, hrs == 1 ? "" : "s"); + + if (mins) + ap_rprintf(r, " %d minute%s", mins, mins == 1 ? "" : "s"); + + if (secs) + ap_rprintf(r, " %d second%s", secs, secs == 1 ? "" : "s"); +} + +/* Main handler for x-httpd-status requests */ + +/* ID values for command table */ + +#define STAT_OPT_END -1 +#define STAT_OPT_REFRESH 0 +#define STAT_OPT_NOTABLE 1 +#define STAT_OPT_AUTO 2 + +struct stat_opt { + int id; + const char *form_data_str; + const char *hdr_out_str; +}; + +static const struct stat_opt status_options[] = /* see #defines above */ +{ + {STAT_OPT_REFRESH, "refresh", "Refresh"}, + {STAT_OPT_NOTABLE, "notable", NULL}, + {STAT_OPT_AUTO, "auto", NULL}, + {STAT_OPT_END, NULL, NULL} +}; + +static char status_flags[SERVER_NUM_STATUS]; + +static int status_handler(request_rec *r) +{ + const char *loc; + apr_time_t nowtime; + apr_interval_time_t up_time; + int j, i, res; + int ready; + int busy; + unsigned long count; + unsigned long lres, my_lres, conn_lres; + apr_off_t bytes, my_bytes, conn_bytes; + apr_off_t bcount, kbcount; + long req_time; +#ifdef HAVE_TIMES + float tick; + int times_per_thread = getpid() != child_pid; +#endif + int short_report; + int no_table_report; + worker_score *ws_record; + process_score *ps_record; + char *stat_buffer; + pid_t *pid_buffer; + clock_t tu, ts, tcu, tcs; + + if (strcmp(r->handler, STATUS_MAGIC_TYPE) && + strcmp(r->handler, "server-status")) { + return DECLINED; + } + +#ifdef HAVE_TIMES +#ifdef _SC_CLK_TCK + tick = sysconf(_SC_CLK_TCK); +#else + tick = HZ; +#endif +#endif + + ready = 0; + busy = 0; + count = 0; + bcount = 0; + kbcount = 0; + short_report = 0; + no_table_report = 0; + + pid_buffer = apr_palloc(r->pool, server_limit * sizeof(pid_t)); + stat_buffer = apr_palloc(r->pool, server_limit * thread_limit * sizeof(char)); + + nowtime = apr_time_now(); + tu = ts = tcu = tcs = 0; + + if (!ap_exists_scoreboard_image()) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Server status unavailable in inetd mode"); + return HTTP_INTERNAL_SERVER_ERROR; + } + + r->allowed = (AP_METHOD_BIT << M_GET); + if (r->method_number != M_GET) + return DECLINED; + + ap_set_content_type(r, "text/html; charset=ISO-8859-1"); + + /* + * Simple table-driven form data set parser that lets you alter the header + */ + + if (r->args) { + i = 0; + while (status_options[i].id != STAT_OPT_END) { + if ((loc = ap_strstr_c(r->args, + status_options[i].form_data_str)) != NULL) { + switch (status_options[i].id) { + case STAT_OPT_REFRESH: { + apr_size_t len = strlen(status_options[i].form_data_str); + long t = 0; + + if (*(loc + len ) == '=') { + t = atol(loc + len + 1); + } + apr_table_set(r->headers_out, + status_options[i].hdr_out_str, + apr_ltoa(r->pool, t < 1 ? 10 : t)); + break; + } + case STAT_OPT_NOTABLE: + no_table_report = 1; + break; + case STAT_OPT_AUTO: + ap_set_content_type(r, "text/plain; charset=ISO-8859-1"); + short_report = 1; + break; + } + } + + i++; + } + } + + for (i = 0; i < server_limit; ++i) { +#ifdef HAVE_TIMES + clock_t proc_tu = 0, proc_ts = 0, proc_tcu = 0, proc_tcs = 0; + clock_t tmp_tu, tmp_ts, tmp_tcu, tmp_tcs; +#endif + + ps_record = ap_get_scoreboard_process(i); + for (j = 0; j < thread_limit; ++j) { + int indx = (i * thread_limit) + j; + + ws_record = ap_get_scoreboard_worker(i, j); + res = ws_record->status; + stat_buffer[indx] = status_flags[res]; + + if (!ps_record->quiescing + && ps_record->pid) { + if (res == SERVER_READY + && ps_record->generation == ap_my_generation) + ready++; + else if (res != SERVER_DEAD && + res != SERVER_STARTING && + res != SERVER_IDLE_KILL) + busy++; + } + + /* XXX what about the counters for quiescing/seg faulted + * processes? should they be counted or not? GLA + */ + if (ap_extended_status) { + lres = ws_record->access_count; + bytes = ws_record->bytes_served; + + if (lres != 0 || (res != SERVER_READY && res != SERVER_DEAD)) { +#ifdef HAVE_TIMES + tmp_tu = ws_record->times.tms_utime; + tmp_ts = ws_record->times.tms_stime; + tmp_tcu = ws_record->times.tms_cutime; + tmp_tcs = ws_record->times.tms_cstime; + + if (times_per_thread) { + proc_tu += tmp_tu; + proc_ts += tmp_ts; + proc_tcu += tmp_tcu; + proc_tcs += proc_tcs; + } + else { + if (tmp_tu > proc_tu || + tmp_ts > proc_ts || + tmp_tcu > proc_tcu || + tmp_tcs > proc_tcs) { + proc_tu = tmp_tu; + proc_ts = tmp_ts; + proc_tcu = tmp_tcu; + proc_tcs = proc_tcs; + } + } +#endif /* HAVE_TIMES */ + + count += lres; + bcount += bytes; + + if (bcount >= KBYTE) { + kbcount += (bcount >> 10); + bcount = bcount & 0x3ff; + } + } + } + } +#ifdef HAVE_TIMES + tu += proc_tu; + ts += proc_ts; + tcu += proc_tcu; + tcs += proc_tcs; +#endif + pid_buffer[i] = ps_record->pid; + } + + /* up_time in seconds */ + up_time = (apr_uint32_t) apr_time_sec(nowtime - + ap_scoreboard_image->global->restart_time); + + if (!short_report) { + ap_rputs(DOCTYPE_HTML_3_2 + "\nApache Status\n\n", + r); + ap_rputs("

    Apache Server Status for ", r); + ap_rvputs(r, ap_get_server_name(r), "

    \n\n", NULL); + ap_rvputs(r, "
    Server Version: ", + ap_get_server_version(), "
    \n", NULL); + ap_rvputs(r, "
    Server Built: ", + ap_get_server_built(), "\n

    \n", NULL); + ap_rvputs(r, "
    Current Time: ", + ap_ht_time(r->pool, nowtime, DEFAULT_TIME_FORMAT, 0), + "
    \n", NULL); + ap_rvputs(r, "
    Restart Time: ", + ap_ht_time(r->pool, + ap_scoreboard_image->global->restart_time, + DEFAULT_TIME_FORMAT, 0), + "
    \n", NULL); + ap_rprintf(r, "
    Parent Server Generation: %d
    \n", + (int)ap_my_generation); + ap_rputs("
    Server uptime: ", r); + show_time(r, up_time); + ap_rputs("
    \n", r); + } + + if (ap_extended_status) { + if (short_report) { + ap_rprintf(r, "Total Accesses: %lu\nTotal kBytes: %" + APR_OFF_T_FMT "\n", + count, kbcount); + +#ifdef HAVE_TIMES + /* Allow for OS/2 not having CPU stats */ + if (ts || tu || tcu || tcs) + ap_rprintf(r, "CPULoad: %g\n", + (tu + ts + tcu + tcs) / tick / up_time * 100.); +#endif + + ap_rprintf(r, "Uptime: %ld\n", (long) (up_time)); + if (up_time > 0) + ap_rprintf(r, "ReqPerSec: %g\n", + (float) count / (float) up_time); + + if (up_time > 0) + ap_rprintf(r, "BytesPerSec: %g\n", + KBYTE * (float) kbcount / (float) up_time); + + if (count > 0) + ap_rprintf(r, "BytesPerReq: %g\n", + KBYTE * (float) kbcount / (float) count); + } + else { /* !short_report */ + ap_rprintf(r, "
    Total accesses: %lu - Total Traffic: ", count); + format_kbyte_out(r, kbcount); + ap_rputs("
    \n", r); + +#ifdef HAVE_TIMES + /* Allow for OS/2 not having CPU stats */ + ap_rprintf(r, "
    CPU Usage: u%g s%g cu%g cs%g", + tu / tick, ts / tick, tcu / tick, tcs / tick); + + if (ts || tu || tcu || tcs) + ap_rprintf(r, " - %.3g%% CPU load
    \n", + (tu + ts + tcu + tcs) / tick / up_time * 100.); +#endif + + if (up_time > 0) + ap_rprintf(r, "
    %.3g requests/sec - ", + (float) count / (float) up_time); + + if (up_time > 0) { + format_byte_out(r, (unsigned long)(KBYTE * (float) kbcount + / (float) up_time)); + ap_rputs("/second - ", r); + } + + if (count > 0) { + format_byte_out(r, (unsigned long)(KBYTE * (float) kbcount + / (float) count)); + ap_rputs("/request", r); + } + + ap_rputs("
    \n", r); + } /* short_report */ + } /* ap_extended_status */ + + if (!short_report) + ap_rprintf(r, "
    %d requests currently being processed, " + "%d idle workers
    \n", busy, ready); + else + ap_rprintf(r, "BusyWorkers: %d\nIdleWorkers: %d\n", busy, ready); + + /* send the scoreboard 'table' out */ + if (!short_report) + ap_rputs("
    ", r);
    +    else
    +        ap_rputs("Scoreboard: ", r);
    +
    +    for (i = 0; i < server_limit; ++i) {
    +        for (j = 0; j < thread_limit; ++j) {
    +            int indx = (i * thread_limit) + j;
    +            ap_rputc(stat_buffer[indx], r);
    +            if ((indx % STATUS_MAXLINE == (STATUS_MAXLINE - 1))
    +                && !short_report)
    +                ap_rputs("\n", r);
    +        }
    +    }
    +
    +    if (short_report)
    +        ap_rputs("\n", r);
    +    else {
    +        ap_rputs("
    \n", r); + ap_rputs("

    Scoreboard Key:
    \n", r); + ap_rputs("\"_\" Waiting for Connection, \n", r); + ap_rputs("\"S\" Starting up, \n", r); + ap_rputs("\"R\" Reading Request,
    \n", r); + ap_rputs("\"W\" Sending Reply, \n", r); + ap_rputs("\"K\" Keepalive (read), \n", r); + ap_rputs("\"D\" DNS Lookup,
    \n", r); + ap_rputs("\"C\" Closing connection, \n", r); + ap_rputs("\"L\" Logging, \n", r); + ap_rputs("\"G\" Gracefully finishing,
    \n", r); + ap_rputs("\"I\" Idle cleanup of worker, \n", r); + ap_rputs("\".\" Open slot with no current process

    \n", r); + ap_rputs("

    \n", r); + if (!ap_extended_status) { + int j; + int k = 0; + ap_rputs("PID Key:
    \n", r); + ap_rputs("

    \n", r);
    +            for (i = 0; i < server_limit; ++i) {
    +                for (j = 0; j < thread_limit; ++j) {
    +                    int indx = (i * thread_limit) + j;
    +
    +                    if (stat_buffer[indx] != '.') {
    +                        ap_rprintf(r, "   %" APR_PID_T_FMT
    +                                   " in state: %c ", pid_buffer[i],
    +                                   stat_buffer[indx]);
    +
    +                        if (++k >= 3) {
    +                            ap_rputs("\n", r);
    +                            k = 0;
    +                        } else
    +                            ap_rputs(",", r);
    +                    }
    +                }
    +            }
    +
    +            ap_rputs("\n", r);
    +            ap_rputs("
    \n", r); + } + } + + if (ap_extended_status && !short_report) { + if (no_table_report) + ap_rputs("

    Server Details

    \n\n", r); + else + ap_rputs("\n\n" + "" + "" +#ifdef HAVE_TIMES + "" +#endif + "" + "" + "" + "\n\n", r); + + for (i = 0; i < server_limit; ++i) { + for (j = 0; j < thread_limit; ++j) { + ws_record = ap_get_scoreboard_worker(i, j); + + if (ws_record->access_count == 0 && + (ws_record->status == SERVER_READY || + ws_record->status == SERVER_DEAD)) { + continue; + } + + ps_record = ap_get_scoreboard_process(i); + + if (ws_record->start_time == 0L) + req_time = 0L; + else + req_time = (long) + ((ws_record->stop_time - + ws_record->start_time) / 1000); + if (req_time < 0L) + req_time = 0L; + + lres = ws_record->access_count; + my_lres = ws_record->my_access_count; + conn_lres = ws_record->conn_count; + bytes = ws_record->bytes_served; + my_bytes = ws_record->my_bytes_served; + conn_bytes = ws_record->conn_bytes; + + if (no_table_report) { + if (ws_record->status == SERVER_DEAD) + ap_rprintf(r, + "Server %d-%d (-): %d|%lu|%lu [", + i, (int)ps_record->generation, + (int)conn_lres, my_lres, lres); + else + ap_rprintf(r, + "Server %d-%d (%" + APR_PID_T_FMT "): %d|%lu|%lu [", + i, (int) ps_record->generation, + ps_record->pid, + (int)conn_lres, my_lres, lres); + + switch (ws_record->status) { + case SERVER_READY: + ap_rputs("Ready", r); + break; + case SERVER_STARTING: + ap_rputs("Starting", r); + break; + case SERVER_BUSY_READ: + ap_rputs("Read", r); + break; + case SERVER_BUSY_WRITE: + ap_rputs("Write", r); + break; + case SERVER_BUSY_KEEPALIVE: + ap_rputs("Keepalive", r); + break; + case SERVER_BUSY_LOG: + ap_rputs("Logging", r); + break; + case SERVER_BUSY_DNS: + ap_rputs("DNS lookup", r); + break; + case SERVER_CLOSING: + ap_rputs("Closing", r); + break; + case SERVER_DEAD: + ap_rputs("Dead", r); + break; + case SERVER_GRACEFUL: + ap_rputs("Graceful", r); + break; + case SERVER_IDLE_KILL: + ap_rputs("Dying", r); + break; + default: + ap_rputs("?STATE?", r); + break; + } + + ap_rprintf(r, "] " +#ifdef HAVE_TIMES + "u%g s%g cu%g cs%g" +#endif + "\n %ld %ld (", +#ifdef HAVE_TIMES + ws_record->times.tms_utime / tick, + ws_record->times.tms_stime / tick, + ws_record->times.tms_cutime / tick, + ws_record->times.tms_cstime / tick, +#endif + (long)apr_time_sec(nowtime - + ws_record->last_used), + (long) req_time); + + format_byte_out(r, conn_bytes); + ap_rputs("|", r); + format_byte_out(r, my_bytes); + ap_rputs("|", r); + format_byte_out(r, bytes); + ap_rputs(")\n", r); + ap_rprintf(r, + " %s {%s}[%s]
    \n\n", + ap_escape_html(r->pool, + ws_record->client), + ap_escape_html(r->pool, + ap_escape_logitem(r->pool, + ws_record->request)), + ap_escape_html(r->pool, + ws_record->vhost)); + } + else { /* !no_table_report */ + if (ws_record->status == SERVER_DEAD) + ap_rprintf(r, + "" +#ifdef HAVE_TIMES + "" +#endif + "\n\n"); + else + ap_rprintf(r, + "\n\n", + ap_escape_html(r->pool, + ws_record->client), + ap_escape_html(r->pool, + ws_record->vhost), + ap_escape_html(r->pool, + ap_escape_logitem(r->pool, + ws_record->request))); + } /* no_table_report */ + } /* for (j...) */ + } /* for (i...) */ + + if (!no_table_report) { + ap_rputs("
    SrvPIDAccMCPU\nSSReqConnChildSlotClientVHostRequest
    %d-%d-%d/%lu/%lu", + i, (int)ps_record->generation, + (int)conn_lres, my_lres, lres); + else + ap_rprintf(r, + "
    %d-%d%" + APR_PID_T_FMT + "%d/%lu/%lu", + i, (int)ps_record->generation, + ps_record->pid, (int)conn_lres, + my_lres, lres); + + switch (ws_record->status) { + case SERVER_READY: + ap_rputs("_", r); + break; + case SERVER_STARTING: + ap_rputs("S", r); + break; + case SERVER_BUSY_READ: + ap_rputs("R", r); + break; + case SERVER_BUSY_WRITE: + ap_rputs("W", r); + break; + case SERVER_BUSY_KEEPALIVE: + ap_rputs("K", r); + break; + case SERVER_BUSY_LOG: + ap_rputs("L", r); + break; + case SERVER_BUSY_DNS: + ap_rputs("D", r); + break; + case SERVER_CLOSING: + ap_rputs("C", r); + break; + case SERVER_DEAD: + ap_rputs(".", r); + break; + case SERVER_GRACEFUL: + ap_rputs("G", r); + break; + case SERVER_IDLE_KILL: + ap_rputs("I", r); + break; + default: + ap_rputs("?", r); + break; + } + + ap_rprintf(r, + "\n%.2f%ld%ld", +#ifdef HAVE_TIMES + (ws_record->times.tms_utime + + ws_record->times.tms_stime + + ws_record->times.tms_cutime + + ws_record->times.tms_cstime) / tick, +#endif + (long)apr_time_sec(nowtime - + ws_record->last_used), + (long)req_time); + + ap_rprintf(r, "%-1.1f%-2.2f%-2.2f\n", + (float)conn_bytes / KBYTE, (float) my_bytes / MBYTE, + (float)bytes / MBYTE); + + if (ws_record->status == SERVER_BUSY_READ) + ap_rprintf(r, + "??..reading..
    %s%s%s
    \n \ +
    \ +\n \ +\n \ +\n \ +\n \ +\n" + +#ifdef HAVE_TIMES +"\n" +#endif + +"\n \ +\n \ +\n \ +\n \ +\n \ +
    SrvChild Server number - generation
    PIDOS process ID
    AccNumber of accesses this connection / this child / this slot
    MMode of operation
    CPUCPU usage, number of seconds
    SSSeconds since beginning of most recent request
    ReqMilliseconds required to process most recent request
    ConnKilobytes transferred this connection
    ChildMegabytes transferred this child
    SlotTotal megabytes transferred this slot
    \n", r); + } + } /* if (ap_extended_status && !short_report) */ + else { + + if (!short_report) { + ap_rputs("
    To obtain a full report with current status " + "information you need to use the " + "ExtendedStatus On directive.\n", r); + } + } + + { + /* Run extension hooks to insert extra content. */ + int flags = + (short_report ? AP_STATUS_SHORT : 0) | + (no_table_report ? AP_STATUS_NOTABLE : 0) | + (ap_extended_status ? AP_STATUS_EXTENDED : 0); + + ap_run_status_hook(r, flags); + } + + if (!short_report) { + ap_rputs(ap_psignature("
    \n",r), r); + ap_rputs("\n", r); + } + + return 0; +} + + +static int status_init(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp, + server_rec *s) +{ + status_flags[SERVER_DEAD] = '.'; /* We don't want to assume these are in */ + status_flags[SERVER_READY] = '_'; /* any particular order in scoreboard.h */ + status_flags[SERVER_STARTING] = 'S'; + status_flags[SERVER_BUSY_READ] = 'R'; + status_flags[SERVER_BUSY_WRITE] = 'W'; + status_flags[SERVER_BUSY_KEEPALIVE] = 'K'; + status_flags[SERVER_BUSY_LOG] = 'L'; + status_flags[SERVER_BUSY_DNS] = 'D'; + status_flags[SERVER_CLOSING] = 'C'; + status_flags[SERVER_GRACEFUL] = 'G'; + status_flags[SERVER_IDLE_KILL] = 'I'; + ap_mpm_query(AP_MPMQ_HARD_LIMIT_THREADS, &thread_limit); + ap_mpm_query(AP_MPMQ_HARD_LIMIT_DAEMONS, &server_limit); + return OK; +} + +#ifdef HAVE_TIMES +static void status_child_init(apr_pool_t *p, server_rec *s) +{ + child_pid = getpid(); +} +#endif + +static void register_hooks(apr_pool_t *p) +{ + ap_hook_handler(status_handler, NULL, NULL, APR_HOOK_MIDDLE); + ap_hook_post_config(status_init, NULL, NULL, APR_HOOK_MIDDLE); +#ifdef HAVE_TIMES + ap_hook_child_init(status_child_init, NULL, NULL, APR_HOOK_MIDDLE); +#endif +} + +module AP_MODULE_DECLARE_DATA status_module = +{ + STANDARD20_MODULE_STUFF, + NULL, /* dir config creater */ + NULL, /* dir merger --- default is to override */ + NULL, /* server config */ + NULL, /* merge server config */ + status_module_cmds, /* command table */ + register_hooks /* register_hooks */ +}; + diff --git a/rubbos/app/httpd-2.0.64/modules/generators/mod_status.dsp b/rubbos/app/httpd-2.0.64/modules/generators/mod_status.dsp new file mode 100644 index 00000000..5a0eef5d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/generators/mod_status.dsp @@ -0,0 +1,128 @@ +# Microsoft Developer Studio Project File - Name="mod_status" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=mod_status - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "mod_status.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 "mod_status.mak" CFG="mod_status - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "mod_status - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_status - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "mod_status - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "STATUS_DECLARE_EXPORT" /Fd"Release\mod_status_src" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /out:"Release/mod_status.so" /base:@..\..\os\win32\BaseAddr.ref,mod_status.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /debug /out:"Release/mod_status.so" /base:@..\..\os\win32\BaseAddr.ref,mod_status.so /opt:ref + +!ELSEIF "$(CFG)" == "mod_status - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "STATUS_DECLARE_EXPORT" /Fd"Debug\mod_status_src" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_status.so" /base:@..\..\os\win32\BaseAddr.ref,mod_status.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_status.so" /base:@..\..\os\win32\BaseAddr.ref,mod_status.so + +!ENDIF + +# Begin Target + +# Name "mod_status - Win32 Release" +# Name "mod_status - Win32 Debug" +# Begin Source File + +SOURCE=.\mod_status.c +# End Source File +# Begin Source File + +SOURCE=.\mod_status.rc +# End Source File +# Begin Source File + +SOURCE=..\..\build\win32\win32ver.awk + +!IF "$(CFG)" == "mod_status - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_status.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_status.so "status_module for Apache" ../../include/ap_release.h > .\mod_status.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "mod_status - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_status.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_status.so "status_module for Apache" ../../include/ap_release.h > .\mod_status.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/modules/generators/mod_status.exp b/rubbos/app/httpd-2.0.64/modules/generators/mod_status.exp new file mode 100644 index 00000000..54380936 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/generators/mod_status.exp @@ -0,0 +1 @@ +status_module diff --git a/rubbos/app/httpd-2.0.64/modules/generators/mod_status.h b/rubbos/app/httpd-2.0.64/modules/generators/mod_status.h new file mode 100644 index 00000000..03911a02 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/generators/mod_status.h @@ -0,0 +1,54 @@ +/* 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. + */ + +#ifndef MOD_STATUS_H +#define MOD_STATUS_H + +#include "ap_config.h" +#include "httpd.h" + +#define AP_STATUS_SHORT (0x1) /* short, non-HTML report requested */ +#define AP_STATUS_NOTABLE (0x2) /* HTML report without tables */ +#define AP_STATUS_EXTENDED (0x4) /* detailed report */ + +#if !defined(WIN32) +#define STATUS_DECLARE(type) type +#define STATUS_DECLARE_NONSTD(type) type +#define STATUS_DECLARE_DATA +#elif defined(STATUS_DECLARE_STATIC) +#define STATUS_DECLARE(type) type __stdcall +#define STATUS_DECLARE_NONSTD(type) type +#define STATUS_DECLARE_DATA +#elif defined(STATUS_DECLARE_EXPORT) +#define STATUS_DECLARE(type) __declspec(dllexport) type __stdcall +#define STATUS_DECLARE_NONSTD(type) __declspec(dllexport) type +#define STATUS_DECLARE_DATA __declspec(dllexport) +#else +#define STATUS_DECLARE(type) __declspec(dllimport) type __stdcall +#define STATUS_DECLARE_NONSTD(type) __declspec(dllimport) type +#define STATUS_DECLARE_DATA __declspec(dllimport) +#endif + +/* Optional hooks which can insert extra content into the mod_status + * output. FLAGS will be set to the bitwise OR of any of the + * AP_STATUS_* flags. + * + * Implementations of this hook should generate content using + * functions in the ap_rputs/ap_rprintf family; each hook should + * return OK or DECLINED. */ +APR_DECLARE_EXTERNAL_HOOK(ap, STATUS, int, status_hook, + (request_rec *r, int flags)) +#endif diff --git a/rubbos/app/httpd-2.0.64/modules/generators/mod_status.la b/rubbos/app/httpd-2.0.64/modules/generators/mod_status.la new file mode 100644 index 00000000..fc5f7173 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/generators/mod_status.la @@ -0,0 +1,35 @@ +# mod_status.la - a libtool library file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='' + +# Names of this library. +library_names='' + +# The name of the static archive. +old_library='mod_status.a' + +# Libraries that this one depends upon. +dependency_libs=' -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib' + +# Version information for mod_status. +current= +age= +revision= + +# Is this an already installed library? +installed=no + +# Should we warn about portability when linking against -modules? +shouldnotlink=yes + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='' diff --git a/rubbos/app/httpd-2.0.64/modules/generators/mod_status.lo b/rubbos/app/httpd-2.0.64/modules/generators/mod_status.lo new file mode 100644 index 00000000..a740c8dd --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/generators/mod_status.lo @@ -0,0 +1,12 @@ +# mod_status.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/mod_status.o' + +# Name of the non-PIC object. +non_pic_object='mod_status.o' + diff --git a/rubbos/app/httpd-2.0.64/modules/generators/mod_status.o b/rubbos/app/httpd-2.0.64/modules/generators/mod_status.o new file mode 100644 index 0000000000000000000000000000000000000000..107ccfefb0833c768b4744c9d4254838497b1ef1 GIT binary patch literal 97120 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/modules/generators/mod_suexec.c b/rubbos/app/httpd-2.0.64/modules/generators/mod_suexec.c new file mode 100644 index 00000000..308c3520 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/generators/mod_suexec.c @@ -0,0 +1,138 @@ +/* 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. + */ + +#define CORE_PRIVATE +#include "httpd.h" +#include "http_config.h" +#include "http_core.h" +#include "http_log.h" +#include "http_request.h" +#include "apr_strings.h" +#include "unixd.h" +#include "mpm_common.h" +#include "mod_suexec.h" + +module AP_MODULE_DECLARE_DATA suexec_module; + +/* + * Create a configuration specific to this module for a server or directory + * location, and fill it with the default settings. + */ +static void *mkconfig(apr_pool_t *p) +{ + suexec_config_t *cfg = apr_palloc(p, sizeof(suexec_config_t)); + + cfg->active = 0; + return cfg; +} + +/* + * Respond to a callback to create configuration record for a server or + * vhost environment. + */ +static void *create_mconfig_for_server(apr_pool_t *p, server_rec *s) +{ + return mkconfig(p); +} + +/* + * Respond to a callback to create a config record for a specific directory. + */ +static void *create_mconfig_for_directory(apr_pool_t *p, char *dir) +{ + return mkconfig(p); +} + +static const char *set_suexec_ugid(cmd_parms *cmd, void *mconfig, + const char *uid, const char *gid) +{ + suexec_config_t *cfg = (suexec_config_t *) mconfig; + const char *err = ap_check_cmd_context(cmd, NOT_IN_DIR_LOC_FILE|NOT_IN_LIMIT); + + if (err != NULL) { + return err; + } + if (unixd_config.suexec_enabled) { + cfg->ugid.uid = ap_uname2id(uid); + cfg->ugid.gid = ap_gname2id(gid); + cfg->ugid.userdir = 0; + cfg->active = 1; + } + else { + fprintf(stderr, + "Warning: SuexecUserGroup directive requires SUEXEC wrapper.\n"); + } + return NULL; +} + +static ap_unix_identity_t *get_suexec_id_doer(const request_rec *r) +{ + suexec_config_t *cfg = + (suexec_config_t *) ap_get_module_config(r->per_dir_config, &suexec_module); + + return cfg->active ? &cfg->ugid : NULL; +} + +#define SUEXEC_POST_CONFIG_USERDATA "suexec_post_config_userdata" +static int suexec_post_config(apr_pool_t *p, apr_pool_t *plog, + apr_pool_t *ptemp, server_rec *s) +{ + void *reported; + + apr_pool_userdata_get(&reported, SUEXEC_POST_CONFIG_USERDATA, + s->process->pool); + + if ((reported == NULL) && unixd_config.suexec_enabled) { + ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, s, + "suEXEC mechanism enabled (wrapper: %s)", SUEXEC_BIN); + + apr_pool_userdata_set((void *)1, SUEXEC_POST_CONFIG_USERDATA, + apr_pool_cleanup_null, s->process->pool); + } + + return OK; +} +#undef SUEXEC_POST_CONFIG_USERDATA + +/* + * Define the directives specific to this module. This structure is referenced + * later by the 'module' structure. + */ +static const command_rec suexec_cmds[] = +{ + /* XXX - Another important reason not to allow this in .htaccess is that + * the ap_[ug]name2id() is not thread-safe */ + AP_INIT_TAKE2("SuexecUserGroup", set_suexec_ugid, NULL, RSRC_CONF, + "User and group for spawned processes"), + { NULL } +}; + +static void suexec_hooks(apr_pool_t *p) +{ + ap_hook_get_suexec_identity(get_suexec_id_doer,NULL,NULL,APR_HOOK_MIDDLE); + ap_hook_post_config(suexec_post_config,NULL,NULL,APR_HOOK_MIDDLE); +} + +module AP_MODULE_DECLARE_DATA suexec_module = +{ + STANDARD20_MODULE_STUFF, + create_mconfig_for_directory, /* create per-dir config */ + NULL, /* merge per-dir config */ + create_mconfig_for_server, /* server config */ + NULL, /* merge server config */ + suexec_cmds, /* command table */ + suexec_hooks /* register hooks */ +}; diff --git a/rubbos/app/httpd-2.0.64/modules/generators/mod_suexec.h b/rubbos/app/httpd-2.0.64/modules/generators/mod_suexec.h new file mode 100644 index 00000000..6adc9ec4 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/generators/mod_suexec.h @@ -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. + */ + +#include "unixd.h" + +typedef struct { + ap_unix_identity_t ugid; + int active; +} suexec_config_t; + diff --git a/rubbos/app/httpd-2.0.64/modules/generators/modules.mk b/rubbos/app/httpd-2.0.64/modules/generators/modules.mk new file mode 100644 index 00000000..5c4be7c6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/generators/modules.mk @@ -0,0 +1,11 @@ +mod_status.la: mod_status.lo + $(MOD_LINK) mod_status.lo $(MOD_STATUS_LDADD) +mod_autoindex.la: mod_autoindex.lo + $(MOD_LINK) mod_autoindex.lo $(MOD_AUTOINDEX_LDADD) +mod_asis.la: mod_asis.lo + $(MOD_LINK) mod_asis.lo $(MOD_ASIS_LDADD) +mod_cgid.la: mod_cgid.lo + $(MOD_LINK) mod_cgid.lo $(MOD_CGID_LDADD) +DISTCLEAN_TARGETS = modules.mk +static = mod_status.la mod_autoindex.la mod_asis.la mod_cgid.la +shared = diff --git a/rubbos/app/httpd-2.0.64/modules/http/.deps b/rubbos/app/httpd-2.0.64/modules/http/.deps new file mode 100644 index 00000000..e69de29b diff --git a/rubbos/app/httpd-2.0.64/modules/http/.indent.pro b/rubbos/app/httpd-2.0.64/modules/http/.indent.pro new file mode 100644 index 00000000..a9fbe9f9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/http/.indent.pro @@ -0,0 +1,54 @@ +-i4 -npsl -di0 -br -nce -d0 -cli0 -npcs -nfc1 +-TBUFF +-TFILE +-TTRANS +-TUINT4 +-T_trans +-Tallow_options_t +-Tapache_sfio +-Tarray_header +-Tbool_int +-Tbuf_area +-Tbuff_struct +-Tbuffy +-Tcmd_how +-Tcmd_parms +-Tcommand_rec +-Tcommand_struct +-Tconn_rec +-Tcore_dir_config +-Tcore_server_config +-Tdir_maker_func +-Tevent +-Tglobals_s +-Thandler_func +-Thandler_rec +-Tjoblist_s +-Tlisten_rec +-Tmerger_func +-Tmode_t +-Tmodule +-Tmodule_struct +-Tmutex +-Tn_long +-Tother_child_rec +-Toverrides_t +-Tparent_score +-Tpid_t +-Tpiped_log +-Tpool +-Trequest_rec +-Trequire_line +-Trlim_t +-Tscoreboard +-Tsemaphore +-Tserver_addr_rec +-Tserver_rec +-Tserver_rec_chain +-Tshort_score +-Ttable +-Ttable_entry +-Tthread +-Tu_wide_int +-Tvtime_t +-Twide_int diff --git a/rubbos/app/httpd-2.0.64/modules/http/.libs/http_core.o b/rubbos/app/httpd-2.0.64/modules/http/.libs/http_core.o new file mode 100644 index 0000000000000000000000000000000000000000..2be9da12eb67c9631633ee523e02cb872d46339c GIT binary patch literal 47552 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 H_3Qrukhogd literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/modules/http/.libs/http_protocol.o b/rubbos/app/httpd-2.0.64/modules/http/.libs/http_protocol.o new file mode 100644 index 0000000000000000000000000000000000000000..6c2d6acf1ea2e30f4f26062f71fe0e959d1834fd GIT binary patch literal 188976 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%0DqKx6~@nG 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/modules/http/.libs/http_request.o b/rubbos/app/httpd-2.0.64/modules/http/.libs/http_request.o new file mode 100644 index 0000000000000000000000000000000000000000..c1a201058f3ce8fd4162ff6bef0f96e6e814f9d6 GIT binary patch literal 47576 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/modules/http/.libs/mod_http.a b/rubbos/app/httpd-2.0.64/modules/http/.libs/mod_http.a new file mode 100644 index 0000000000000000000000000000000000000000..881fa056085a3c51c10a8b59b9f60949d145d75d GIT binary patch literal 285478 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�dU^_pCMmeK#?yqX~*r^boTf_ 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/modules/http/.libs/mod_http.la b/rubbos/app/httpd-2.0.64/modules/http/.libs/mod_http.la new file mode 100644 index 00000000..4f24a965 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/http/.libs/mod_http.la @@ -0,0 +1,35 @@ +# mod_http.la - a libtool library file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='' + +# Names of this library. +library_names='' + +# The name of the static archive. +old_library='mod_http.a' + +# Libraries that this one depends upon. +dependency_libs=' -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib' + +# Version information for mod_http. +current= +age= +revision= + +# Is this an already installed library? +installed=no + +# Should we warn about portability when linking against -modules? +shouldnotlink=yes + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='' diff --git a/rubbos/app/httpd-2.0.64/modules/http/.libs/mod_mime.a b/rubbos/app/httpd-2.0.64/modules/http/.libs/mod_mime.a new file mode 100644 index 0000000000000000000000000000000000000000..d798f81b376277505ad21c7723dd92e83014a5ad GIT binary patch literal 75212 zcmc$H3wTu3wf{LYA&f+lKm@`=9TYWE2?-)b0ZD+!L;?gz1XLVCG9i(?%*^ocDo_*D zG(ParTW_mEtG3u`wY9Zs6;piRt6tw)Z7a33ib{Q>wkrSMT6?WCCp(GS`}O<&r)ADs zzrFU_Yp=cb+WYJobH+}qZmX$3WzfWM&#Q3q`+_{|&)do z`?=QJZ`OJGcNC$?^3I1BM>?ONMnrv;6Y0#3bXA2SofRS6vvDUr7x!G;!?=fW&%-?r z_X6AtB3(I=&Ce!+Ty=4X=rrJ{zc^bNC|R7V3^XkcD+6_l^OS+k#RbX~NH?+$cS@?t zI$tQMEbDx-D$@DI;>fq(DGI}7HN(h(wUMs0qw+vRIy=VY0Wa*1bd^*@x+Xt;H= z?~i27e$RAqb9bck!K{u9#7g9{^T(lsJIg!&!DXAf6H7XO7wH@`uCTl09;!L7bN9VL z+;{v6;we|({Snpfx|AEMjU0b4x1O~*i{NiRM5dj&yyUEs<=%KkI^Qk7tZ`h}*w8tE zlxH1Y3?-H0vUfPBP~Q2j7?HL4E|hLMe_Z&;^3KL_xrtXImnFtw1dKpg=R=XM+2e9I z6*-A+9nT&Tk zC+9~xpNn*D2xVQ<9dRFwY(9`UQH;8vh`J{>mZ2T=MT$zDlFr%VLWSMrS~zwScdYAz zqI+pF?MTCik?h=6MuKnOT9=x?B}+<9FYDYN>3piBio)o56GjO9@~#|W4WJDn%C35SxiOQNux z{d7SQD=h0wkDw1c9U0i}qB?qgFHO+oDop-B*5(U9gGx)T>U^fK`*(YT`*)^&82MRZ z(5`_fK?}Rm_U{ZN1|jgoU(WU!z3p$Mk?Oauz!Uu9hMUXuqqZV6Z}Xn4j&2|&Kn|YQRX#3vb9dI|KL;|e^QppDX?~S;P4W6` zrVo$LuEhGXno~n%?b8N2iDnMk)Cf==qyaN!FzYDX%~*Afz#KqGW|ws>;S7m8XGq*R zL*mXE5_is!xO0Xqt2sRs*_Fmwzx_eCto@PflBs8nJ2>moGimZskIHtHhG03mSB#|D zowxvp z+QQ&J=PfC){75VxG|=5B`(!8DIKWvstK)V6lH$3djyUQZ&UF%lKiT<($|s+1e>_mw z-C33U_TyVD`NWJKK<7?wVe_-eZAQgYU(occgLI1JMs>{%qYN4hRvfqljf-fMKtDDRr~^t}{u5(2Zw zg-iC&8RKScej7O@()Baauwx<(kt{rj%B+sPs1muX!ln6K5b2sq3s1ql`4B5D+%J8` z%7u_(W*5Q;Wzdl)d2jZ(0<2tF9sh*-9`#LSTAm-y>i8o{HzDgKp3>IKkf%2v$m-aM z_1K%6X5Ho~{ZLlNPpPO2+XrNl8;I_Ft>k|41FNRB4Vw<=pFJ)+tK%gIn9{O#WF;qY zWTfl21!NSpa&XA2g$3Hk@w_j`6x#e)Vq&E0&O8=ITU)u^sYqP+QeUxoNVOX2Y$rKt z9NVAn#F(!5w9WgI!{F;&Y?9i;D7+j0oY`5WZ;}+YLfwg_U2~^xek{3=Y%PMjl1IFK zqWEuas1VE8E2(wSNFa8P$*LD%AGm>&_Zh49-aV4oG~ z`akJUW|wZ>m&~BH+^mj?*xt~#jjr zcfG%V_FBxkcRL;{>wG$^qZ~0_)_KUdx5H-sbv%|h0-=+2*Jt}@Z-CseO`lE8>R3cG z!D!g@*~H{43{D5w@mN;J2~?P>k{D*@xwI#G-bKBv&H3rnlb0fwo#vJwi#^5p<3d?? zEplgP-L-S({@JIx;lwD<-rvFAA*qt&z7C|$kD;KfvmCosgm>qoZ~FzZH~n*JA|uk? zjf&YF&nEYjb#|8>`{+D)EEh=DU61ddJs(YoeJrLR`~mHmGzjo<`z}mt%!Nc|)?F2D z$FrR;WNoITQ%+%Nc7=tH-Afy-9cLkn@P1hKfsuBeJDAs>qJ*{~zvbb_KIxN}k>evh zmZV}Ni#?GZThmDAKS~StnGr^KW=1+6q3Qc;mmw_m<=9GK+Fpb8psZ{1IGW^}M}JO? ze_C%o77&Z>JqnbU-y@w}G!4zf+}mu5Xdl*&WZ+Ve!clpbm3}hKUGsMFrZ2*YzZG|2 z!{H*$mv=S7@tVmrU!RY}menx;-YB1n^5pQnr=jP%o|Lse?3QHR)#Mas?fBx&{0|Ns z*xbGGEhwIvwfPK=dGv-B;c$89TW{|844VMSe6JvxaDse>vkD}3PzGf;lwlr)sTMXH z_1I7p^Aw=Ro6e$S*4|1sU=yS^214^_hL)k{;nOZl3=AN-hy|0!mEoBsWHzacVNY2WL|%Nvok#{|M=o3M zk_?PQ#7Z@2i(rSAjb|;4>m#%Atj;Ao>o0=E82ys_LLlBAjXZ>OlGQN>{gKq$)r7w6 zODvg(zIK&5i7XC21PLB#KKyaw>GH05*a+Rpc?5g6uBj!w+)F;j)@vMj#kAP@8tNI+ zs7>BN&2271XhA>n7YJ3>MQOdf^L^3OOM}M!<`4yD`^Ibp#TN)Kn82$mFSk;wotGDR zpuyG7A4=k_dty|pP-jwDUk*XYNj2LjOo54>#kDgvWibO{nK4DYg#xl zqoX^kBMUXBA)OAyy^maSJ%-tzOZMLWFK-`8jlBKSx-I)>x|1@AUAYaF>HKA9 zVDJC>_p>H8tl`xBf{@ghV0RVn+dF`~h8a?@cQ{I z>b*b0z@}V{$Kj9R>^^$%Te}B$s9dD;xN$wx?n$<62V_mw>f)@m8K2X$HgDts^{1FK zKSn3a<|j9+<3yBmlF0{w3`BvG7>qPf>SDk)zk>+r!_swj>*;9S}x1&U}u$ve*5FZJPEM9NWX$G-0P!YQbkEG z@c#hh9Xsum;^U^CeAW>Y&s;uZx>M8ATsM&qUlZ$FWAW5kY>iXZ+!m{8S=HQdUaU6U z(wb;!X?9AQ*E{oLt6CBb)rnZ`g678c&Z!NJiCA0QiBvb&HWE>vNVL{YOg1;Hn^4;T z6^WL%_0Dl&r@D0lH8df%t|rFX;u9Jh;t6L~b#rq|BD^Y=2sg!Q8>++c`HTBhP@mRu{8Ww80GaZamQd>Jqia?e&*R<3&G_N993?#Cwxiy(Eh7(&} z-MlJUy(&iZf@GpcStTrSX2aZXTG1H4U+~@p;vWntEqZtf^&9OxtZ~j)hy= z!c8r0v2a~OV=Nq7mxwjT;lH>@dS;o5YMJ5u#u>zG*RVZIG!R=!AMsfj(1uk`qCOU$ zS2nLSOrDH~X_y;Uu{F-TmfCq3hpKq2qB>Du)?C+uI4WyiQ{C858>SKJS*I03;iKXb zYc(y&#@aBAS4(TGxesyf@KJGkFr-VOBis-VH()H9psisgT(Y(SS`kfQL`~R=D5|H? z^zT+Am3_9=vyJ1zY8bVzjiFurF5+YuR^7P%yjZj*adNoE4pH)IxUQ|GDSXUP@ncZ0 zR}fng)f%SZyjcFK{NrF`%Y;bG7};wJi=Tf!}vrfsR7 z^W5>01v{o^*oO0JO(ueCG-zoCO@wv{=;J8$P?|Q^Vq{gAaLoEx{1_stDbA3Z%r|a? zkaaxA8;}XuP7d9g`dH0s%AEh+6&7)NSfqdbT_Gv>IypW>g6!AH<$Xha{NVHr^c8$V zeIoX?_W9ez*6V98>Mx!H`@OWN@u|3VF(0pa)h(mG;<4?n~NhJfC085 zm^PrHIpG9C%u#2Z;Q2H0X~+xch|iE4Qe^wt9@;@-5VB=M-O-D z=*-|FTsoLA^hnnm$Bg4hWqPO#&jlIOQhJDva589!*p`E*)Pg@4tTQ-m$i#=i&_jZ= zDPV4C<`y!yY;y~nTepaA;^zuylhiSssc))>Ok0B|Kdo(X+nM>hd-8?vf#(qnXHGr| zlaxm%a|)3{7g2vg20xi-I!1@h(}>PC^eK0M&P7+3K^?c0mH!?M7fEInd1Us4KLcPi zd&+Yl2d51^BCQM28K1fapA) zWjT&ZOo3rsW{M0GV5ZnGY0N|nGk}>2!=y8_)G#484hvTpW{|rcOubsgqbrFSbFHU7{hEz6=e31>qr|=8cjxTRy4;MN)>+vK8N~YqW_Tpq8Pycq5d#R zmuyE`=y1xTY)5G910YoD*`a4lswbmf`3JY2O*#5p6&z?R9(MoBsLsX@+j%hx@qf&KVULV} zY!vpU3!HjHmhKF44A4k;iA?_NiEg{3?xUFDhi5tHD zW>jGB6c68>4hgW1GyL^aXfZPMo)~E3k>PKB4)cshhJQer$GBnmN7ThUBmeo&p{Bsl zUs78|V(EVkK>;sT#_|ng!E@V1!`mChq=@GOD+@iI|=rVknnj1BoX zJw#TfhsYo4pWhaPSyWL-$}p&KOdj9y*J4Py$E~{Tj%j_=ngm z3hV@7bd5ME@D>=>HDYRjR$*bLa{-z1H+aMZ;)p8(lQIy9IM;JVTp8d2HC3+;@Q51b zyMYrSm2H^s1*U_^)fI^9r-x?YGvhrpY%IDlP{}fAJa5Dufg8b?%D)Vx!hOWAm@(l# z;x2Ab+PFJ#?ohO0>fFnAg+=wvf!kH}9V2qm0{E$?5gV3PpW}6QMB0T=AgV{DQO88} zm^9iJit4dxltscu!I8}58Rn=o$|(hg8P6p}hB+?n7Id=MF!^cZrifvVXQtdRQ_{$1 z6^1EdW~pJOr>%scD-1Iu?X;k-gCk0qX*DIYSlc?olrnR^VIth0O@=v*OD-|Yyfhm8 zErwaZ%(aGD#A4eFQ_0LthB=*??c&~_1Tx`Kj*e?bJP@3O8EC|Q7xazXgF&Br9}ZGd z$u?q-1u0$T8s-UR!iIS&NWK>LKFdsjDS3gJqQg+^jCeW7k1_7y#isC&!2rB9+Z65& zlDpFahl$7k%Di~|Z>*-mRC|+|r6U_^oe^&bX_vpk6#OGd<5F*!_k-6UOj-@|VQ@DX zarno~Y#JF~S?`SagnKAH{w$aYgSLpjZV8+M7adNfZwrjr5x9PcI;`6t>N^AHr{eLU z0C`UwwkvQ67;)HR%!tE&&x|L4Tu0pVK9`7lKID>3M!`WrN;Be~jG!+B2L~@l=dLwk*+E)} zwi#w9GusVwNRTYJ!!RRxOz$?#=paqqZo?ePbsjZLn3<;ya|AOl8|G+Mu-hD?;<10vFjJZNG|XbBFypv}D`qYv+)U=Og)3w8a)q1ATv)jI%;gDJ!EPxK zZn24Y;ZA3+Sh%IkMT9$(?XM7SIdhf5)tVT0$0pkvoDp@*t&p;M=IVu8&0MQ+P0Xzm zu7$Zx!krs@5<_u`aPc6;vl9s8!x?b_x4u-k%{-A-2zRlWR>EBoq&1>dxU0;>67Cu^ zvxK{rxl4rm0dre~yMf!gHej|TxfR=C3vWY~=2q3wbRw&Am)t=&LoXxRY(sL-B-(5} za+ecrwjQ}rqQgeMnrO52$gLsTY=?4VL>C#ERYVsX`kd8hHe%=|S|BQpK%tY{YI0VV zuyMm?3Y#?S;0j$c$@uipT6|`h-3hH?*wesg=^;wFINd=WPY=C-;O8FajeLia6Sq9_ zy@{jH==2pt*aaj^b^Iq4S6~-5d2S5-|fhDxYXGprZ$ql5fNDa-(ViZs3&J7oD9Vp4AvtIYRRhT82*Mg@1MAX()Tq%8$Zc>~29m!r?5aWmvSV<2m0 z;OKkL1{pgAAn_x`19M7RF%oJwKaqZ|Le~?dg$v_G6 z={y%C$V*sR*k~)|Bh@^^%ymCQGZN&B+#IwnL4Jli2~4pOt9Hx5NRT&hNrfqC_6PYI zcR9pXpqJE>QKUMDpBK_Y{{YQ?q9$@^mzzT=AEF1egxWJDibbP3AZ2&C*Ro_!>^L5r?ad83LA5q(rEJ+vL48MH_YP8&Jt6)>E7*Kil67C^PAI6_~{7LI3j(DWrJ=a6tbn?;NAY~PO_E;>PJWobGpPIuXUnDzZ6@8U@ zX6D$)zfh}Yj*Z+yRl{%rsl(EYPo5lO=DIcP#S>7@&1Ab%8nqesM2;nH(ly8G#w_=w zIVxY|PJh{x=VNtaqC11?8nfJDqK#Q@3DL$ZcP7zcqkk6BX7zJt6I~!}m9B;U(P4L9 z-e~E*JD*5tXCbXR(#~S4C+$?xph-JRi5`QF)0Y?QSoiF|Y7cVV73X-Gc~j*K$L~)Z zcO_{P%{3&F4GkyZZZy;qIXcg+>-K7|N)3x!Pe(9PyMZ%^>E}7A(=B&3Ri$BR^|Utr z7s#X0u;V_(iO1as;F!3w$d0%I1vHm~hvS>WV^h44x5FVqQqB}@`#Gn%b5P}&8pqx5 z-i4y^Z82#6)FeXF>H#CSp5#z=fQ>M6E#dUWRpjJi!5`q`6;hAJ;byWhmxWEz&RcjbNHcjd`$xMFm7{vE6Cvi^5XdB z6b*+y0_Zqy;&%637&ZZdw^LSP$GEps&=~R#iluxO{Uu3GY;fE=DP9T;`0KR*g}#Sq zTK;e#N+)2PT@LsOit>CLgVj=PQ=>{gs&Fvt16X*BquTLr@cp|JXG zpP4ZtM*~ckd);5CyO>32f3w0Ue-&(ceKvX?1aLN(kgDD2&enapgV z_UJO~mCDYdJf)WovU~M!!Z-lSK{6>S4dIinQ@?fY#3;QnMl3C z^B}3%f!s=$dtJ?uCcthm-$ekM!v+2GQ;<|{;HL``jMO>qHhw-yyYh|)Hb#*5f9R6Z zv@5$G*jUE8e&o#(!{6l6;XPfanVaJ@3sH6iR5n7%{ah#Q%DW%fIHM+^e2+RjPk|hV zIy3M~E6079r!xtu1D!pHj1R|h><89h22`@jRQUmvXFvhwMj-Bss3B7bs|1GG6gcPr zrc>a2DE2~*6jLRi(v;Rh)UFn-Ykby}1Hahd>@I5I0&W3qdp5U0>PaKjV`c{j{R*jV zp?iFhyA;M0xyyXTfwc~Gz*BNPleg= z6dY7EzYi0fV)8s)&q7HtQ}}ojjQKV*0ljmt19#wXiONx4WRP@{K5)6$<&UF0Kv{hh z=TAbXP-Y)xo~4Q95g+X-n1Kv`sLAjsHGy^*uU%BRm_F#*2Wz~}20(?-lo{xh5Cw%d z&|@G30e3RFzF3pVe%`9EO2=8`O{bT!xt+>}@2Ay>uBl}A{u>P=+2j+gJ(YXmvE}H* zXS_;5d?rV>jipn`l@wfVf7-9ZmpV)a9&{F5S+`+C3+h*SgylD2dR9bqO z%Jgu^D2P#5eCRIf>8VMkfTn?0fjo5@<5j)zm4f@Daw=+W5ia1e`BZXK%;uSN6tC%OmLW1eK+T5IqB~sEW zg;t`aiW({Hv8u2?P~W|OC|N_R3SHj9Qc4R8Up)q45`>X0kgztU(@eo&c$338-DE*= zeQ>Rl?wdX|;+iK(g7o)Le}z%cnU?nmUg;U2?(vl_@@J%_Zb8b7`%EKjBBmqlBlY@N z2=}@@*lLz`OHt{QO1vaQ#b1T+Ji1P*Uf-jl%6l5Tu~GTOq{-{Wi=fVf266(0d}XQ^ zsSc1(Ujmk%o&RS&i$0RxQJ)$-pUgTIJ{fSB;Y+iW7%jx?V~8jgao%%zJIeQs$+WrC zO~&iyu|~un$7uy!?sbn~_d5lTHm~!e4Phof?+NIPG5p{7YicSt>-pdL@rL+F9k$+Y z@Iz1#acIO1PsQJif73Isk}AE1=O$AzC#btH!ygh{LISwFSkOW49Iutm;_rA!2>nMd z4IjMn?u~Gaxw5enYeEHDK4@1?3-l>kcmfJ3&!Peqg{Jyii-^!CUTbw$YliR9S``$& z`fs%6nMp}J3(hdpG!?ltbtf=h$=e*BzFw{K&|In1LcfZ&Up-dXD2$QA*9alpD+7m2fPw-k^AxB+#mQc+d34a> zzuapA^QrPu!A|gLfw7eDCwiS)WnpD>!dVloSDd}Z68FX=< zx(fbJx}NM)*PO4@)w6R$kiZb<*3jPh?#J|bF~$6=E$RE*)0b+8G#!ma5}D3d8K)i_0QFd}Ny8~D$wwxhrKF+$t2B6iCJm-P z==N#cd3<0x^Ywe^n86QJzX`s4kioo0XmNjl8>w_BhlYI@cR~uQs zzZY66$*DhOF)VGVJ&y69|53smvAhUT`L%Wlxy5a!y?3gCZ2F4#Un(?IwyrDOAuuf^ zmGL$ts<{4jE}ieEik1+1=yv)=yCH8Oaw*F`7t9^umt98a=tqKd_MF4taMCY3bNGWR zvjDzBqkzvT!C9p#O9`Ao8V-)|p$~b_d^^fN&OMWghAij?il3kc9Oo62=~>o%`@5W!46dY8yd3I&4xQ)b&qG{vn zj}dPnDcYx-67r~VtFi8E(ne3~mbb+CJIVNVuQpTsaXDdpR-PW}1f4)Xk#BKH$E6UoP9vgs>abgNL(r0L{6hev{ZLe z%W#^~rY7}~zrD|)UsW0PBQEEFq9-q-gaRt(E)<*ck?UCr&DK7ZaOfQ|)1_H%bo=b< zBKv4bV%29m)ufiJpzLLS)4^`Jj&Qbl>_9#Mr__=PD`zE@XMUJNKX>&x0pB>fM`h+@ z1T#lx4snML%pQS=80TbUoB{}E#6pH}lt0`FW}cieHKQyC|AA!|L@-KpBYt3x8_dke zpkfznXs{<+1hIpJ9Z;4->>$wu7NdQ%L$`x-P-7ZgJvhxx>B-CkI%Y5)Oto>0mFt$} zP$NUeqUJ>C8#>HAW~9M#2C%k6M);HrOBsW2=fH$aFUXV;DHh*zdz~0S`bSEcSUrkb zA$)X>Px+V=xWPm5{gQK-G=vHn8G|zp&Y%_!XQczsBr6T4WQqnj&RAa?V2_Ye_%x;A zNbv~QAD7m{(MOHw!5*CtmYO1egn1~A8DKih&d$qsXN)wXXe1_ckB)_mH?-p?`zm}3 z3@fBDI!?4_95d4Bo*=q81oB0cnTeu=nF9I?y@k>S+cC*+Cxu;c?)PT0DaWVG4dgn` zjI(RVI%oj~rDGg1E}Q}ErHBMZ@=lT-aE%juzS zs_29H0qC11RtP&i)j2Zi6m1O~7AZj|sa`Qk9I^v{{3_)gsx#BaLU7ih5F!hfW-Q}T zn?1lO%o&65DJ6n*oyr8N&hfbfc*NHvO3OsCSa4bf{4jJNh3#CPE(o%6sUf|YM{O^1 zt45%04zc+@fQ?y@fl?eNPZm=a8l^a5%@?!1;af~H*y>UZY82miYy42RPxtkc+gc*! zuw}+bn*K{u6=sa2D$Bf(MNm)U7&*famE{=l%zVcm+NA3&PcEZ5lj7Y-E>FR#@oY5Y zME$r5uP|zl89ABFt2Q#Ei~#E5N`EzK)(PVuUD#jq{YB%@&yk%UC9>(GDax(h9_7hlz01Ip;Xkx ze^6&#?+HHuIf5?qS;^}K>buWcalfgDij_+GEB5ZQR@7!(XQ7h*iVJ%=t9QjkTJZ;- z^^2AC>ss^;bS+g~*Lk{5SJJO*={L}YiEO;$uehvN#dMKUlU?TPfTzyJVNk>dIg38VGIPpwl|xy~Xb)g;$BOG&kd8eQaBm+-7R zOG&lI2r8#0L8Fp>>w1T>dRR?@)87?0rg@E4D5+K=*3?k72ap1>gMcQ1W2US>loS#e4ohcC|)iSunuJxQqzm%$_WU5v#qgO~5*LYp6Qu5~> zbh?ti5QxUAYO8WDqy%lFRQNPz&=$}4YAsaq zHV;~?Eu|Fo@{AgFjaREe$vZr#SM$5Ih<{kh3yCY_N)I|+$<+cGe=0W#+atP=gA9@S zRP}FZGft(F^`82(l~jespUS1wpPf={C{<5?g_bT_l!P4ZL1!tcib#F$bkSSaBGu)u z*n1|wA$`-1VJ0i79dn)kdmk&LBa6HaRVZ2KLAv2FZouakV$?aFNVK;JCAGH$oC}Qk+#_L{6z@>vf$TS;vg+VAeeinIH$;_i*Tt>`u9)CzR~=A4r10N05s z>9b;cA67*Buwr{3R`iP0)1<@d08Bb1)d84vO8Tt$kNQHbPzU_~@x>bP#rM4+s8I5G z2}Ojtl6yR;LP;HUNGW-g7lsu|rXsUfw%H{uU*PHPH5Yq}^ja)z5uO*R@HdnSX@I$o zKC^j}wn)G!*s9_w3wte~?@1^2r`)LI!Ct?jN{;iO3ME$y6mZshwkYw1C{-Cu5iQdD zQBqw+g7}8L*TaV`^bPd%WlpgS?`&_FtCTzeriA7IfuO>U$0G9MPdB|A(!=L)0Jfl`gcU`dAoy zi}ac-#nQ&ogPk~ewKSxRpApeiMA5vZSWmQvLTPbv9BPuF54RVSoOSfoCC+qqB` z{m4_)t9N%u(FdMLm69uQuuT`-revc)rYp+nUmonkzxze)a!*%OYb~KKC|G^8UdZko z4|-h4lBcz}HEIzsL^y;1UJ98J=N#I|jtHu!}xE=*P>f9OFKO14YSAZ7OpklialcAo%+ zElUBJrc{WY@Y>ii&+5(YbnAmXRh;DIJm=3$t~qYN{eJjjcaOd=sYh zKfO%6e2}EFEV&1q!mUbc^ifrNsuHHbrZGjBJqZc3d#a0z_7uyWcJx%QQ;Y3RK}!3i zh5@qe0%V&7$hHble@5XOW4_y`YmH$)3{v_AKs?p9@n3J5cFbWcw~jY3|Sg02US?RmwZ4yFzOgE|Dh__v3ELC(T`e2y} zXyICK7o>sDU?1MPw%2BcRQBPSYd5MJ_DM97pwff9XsJ+A9mFlGYcy^cR3_rZRfUp^ zQZBr9qcR$7)NsmohPp(&bh8&l6-uhlFp^5D%Se+tMUw!;wEGu%^R7Zk4UayurM*0m za?NI~VisX)gsvHcX>eaBsf#eBbqHyRQzJFr2~%1#4%M~eoiH_BBbG27m#=cI_Ujf| z1p-byTWMViF`nDK9lCamLG79Lf&xnG zeNCTj8~d<&Td(N@TefZN!|H7t`>=Z3M%(K9#L16(OKydd>T7({r(xCQEq-U&euk9V zs{sN?Q=>W_knMIrw)uc;;{n;G|5##NCl?&97HHT4vTHpiwRBeWalrAFTZfZ+Zyhvq zV(VbHrjAn)jMkQ3V{p4n!ry!Qhzjk1ZVS*6-3~nDZ3ilPZwGpH_Yu+gjNJW``p2Rv z=p1xltF4PcyF0zjTBv5JGVBFZ)$^XE3zgK+2s-C(=#^7dyVmd1F6w}7mTg0ZbFO=h zYyRGa*D*DrN1=jh7Ya9eHSK1;>0YRh{fn*2mGwrKq&}XhbTgva4J&|Jsk5q&MPahc z(5c=`tx$5a2ld)JeMPO=sai@_c+esx&-S1yC8Gijq>#sd__0-igcM|O!TGuAN1#x_ zby7Hp3tJs3vz^!5+J#>)QfZ5vAuXxB2;8q1`371%2k5|g4zP#ME3n(uN7wCQV!%0Z z>o0`v_F=X{lCyQS$;8(O`#w@4{b?iflMOjU6&<=r+bX{!U%p-{cl}cK55hb0&B!FV z+x71ke5c&?+a3KT$ClS4m1VL%ekJxtq z3dD}-a^EI*T~cg$&BOZmsrh!WBvpL`(&TE_*W~+6<<*ZD%GA?Ds^f3_(QYqK>J`de z^Vc-tZTUHZm&;v~Y?bhuxiq2L_0_&DBL6eF-!6AeCHDz$*Kfm@UIFK5{NBWM|Ajw- z?&5+B{<#yA@wSP0-C<+0Ha2lx(UjqVlmVdcbC zH8s7JOwKRT7JBMxjwKrKuLtN%T-lOH;7^g^m2UBgZON4@TjCR|TU#gct2!r4$}h;D zGI?UWt%jPbZuM;cck4|^CK?)3W_^=J#Y?FdFXq>fqvMG-ynF8W{Ce^yzrwO7i9{Sv z)Z%4$fH4B`mYUVEgb^Vce`%%7a1G74BjZ9EFV+H$Y>FO&z_-pIqOrEN=9U!O+S1Y( zPqFpY@%j{(sK%=+eWeM!EHhP#7wL)K8nPG#rmZNw)-OtL*E6zkas!b)N_{3^^wzet zt&XygSh+Gu9i*labv$Yyu?|rW@YlQzPTr@+=>4c%%0Nxsszh6i%z->rjhdH%`hd3B zxye|ZyaN&Pl$bYdWfIyZG&G+=W5RVCTUHq{YT1mEIK(h0M88V|_ZceB$c-4SM=Y}T!DY*W$;BD&@bGIcsI@YWWz7=?MN34BGGSu;9@VW~= z7`x=Qv_SBtjZ5+0vit@A{h8Z-%9Z8b|K0y`>Cm`r^BE`CFMs2t8ONV;+!?{P(6pVfX4i%nVa+{m zKGV}c-|GfWbAJo=;SHf1z`y4NirrA%nN>eLTTdzwGX52eHc2=mMzJ33)Ww9AsKY0ok1rNTLi*HC@d-|I1 z37K4W->W9F5XM@Ujblw!5Jl zf`dZ$2FKnTJSH^liYJ1DZU~K?I{mG^mCNRK6czt*>eUO@mi~9}@{LP_HwOYoxERcz zu74E$crkqo(-cv!reD|&=BD+;{4sqg)2I1pnh>w0FWnkjwk&w=mSFa@+k!*)1RGCV z#;)0t9vr+U@U0yIS=!4$}H@RE31{WlPUv9u$3Kj;AbD!J_4=fAr-mvHD;LYx%!Jlso z;J>FDgp%M0`nbg<$p<#xup_vQDwPDcy7vbE0`r3Z9;q2Pn;&8S>mc{F7B?rcxXf$3JrN6*Q>j7meX5x6YX;aK;!UBjjCN4FblTFYW zJ+*RKMQL=_g87xD^DCo^ODmmK4YkpPQy;6Y#mlXuc+afU6l+@*i{c$Pl1Ux!m93oR zo!a$yr*1<{w6UeSHfmn8>(n;KqxiFwEsbkpwVbtSQD}{|HN~Nva;eGiQF=dX4WQPR zwgg$srlTkEdH^evbx5t%H8rs~Yr|WpdFkWsH8eZ%>S!HWZd?xqwJk|3R%mk#%#JzH zvc;{*=9&cc5xtuqt(re~{(>d*ojQ8|uhWL^Idv_`X1o_RmZ+|+PE`A>qDu1?%r1@2 zDXlCon_ucAv6dE2K`S&0GplCJEv<~sE3GVFt;i7mPFBb<0j60mba5h$BOj0jjcADwW-C+<{CF=3E@}?%d?iRhOF-?~*m^Bw+ zP%;~1-BMQvRf%|Otfm2fOW0=`n^oN!jVxF&7Y)S|GH?(#?+s2x47|S@rbV%8Mr#^d z;xQU04iUV_oZf(rGQ6oA3v?|jahhAAHPwhHryhFIbJMRxbs|Y4+g80cioe?$cjWEJ z(RFZdeM@cJ!5{pK*0-#solaX#J;oU^P#arAby7jxcBckIm54>L z*TBH44E1&Xf>X=NOA(w+HLdH(%~PDZhBoSJeM2K+ZY2T;_3?6bOcjoxSo0chWEWSI z&Z;UesVqCa6kcv!Pumq(-;9@{H?(qmwIUd!WecKf+whv_DE*CF??vuWevf-RN^;zh z>bAD(^-(it(4#u+KgiS3I)tEuH-IDJ@V@l6MhMZLeXfqjS60`oUR&J;$B-i=7~ors zM|C5*i7x3BM4)33s*{QOD8&@VF2@_kmYD#~ocUGZSz+vw^CyQVG$oSFvFWR@|7~li z0b31^PshG|!W0y)3Qt%tDLkPrj)}E;0;LgtWj&0pUPW(fhJJdvJItop2;)rWT9fg5 zhu)U%4=6IMzNKY#4{UWT26G!5*2JPs)$7RPCdpJRT2Q%Q)`D^;*^KwvBdO6&4pX6} zHpW|Chu_tVA&W+noP*S5JT^@bY>U$5rl>?T#p&JUNlbY}R1#Bjy>yS+OL^7olTAd*gh1doH*;=5V)o~Eyrmm3 z?~%=rb1w6Ao0z3X1td=_4UWk~h?{E6T)aY?0-hEQ4sA4En{1_oT;14OPia<$20fx& zSXnZ+v~be#-URWQLG;Lq6|lxxsEoH(*Tfvtjx42C zPNn8}L8)V9x&X~8U$D5;@l6i(68?;f89X!bQr)I-<3)WEuj7b~)rj)*Fg5j=hWY>( z#v1X2P0kjcrf$Q^WP&8ypt}V!FnwKZ!>R_FD7*%dnVg@nuv4zbl&8Qif-EO*iU25# zHP&*QE7vDtain3mycW++Z7u5^_||C9WlCnE=382|%;=ii@ibV~O~z|@P{PW|NuA`{ zVyhakp0sf~;eq1dBzKuqLQDFBXuKL(Wo0!Mc;wzSsKr6bF-*_F7$cakDCb@B06)jV z_Czxqf?#WAXTp#EX+fI;tRBhc)wFJ4LBZnOvev8&F|!Qt+7?ALVMo^NxgBmhei9m% zbOOJujJ4^Er5W0=3Vlsf$7#x@3?fIz6V9TNCDD>aa~5m+WKBa`B8g=@HJ8m+ zlD9-=Q_xhss)3f5CX6B5YEmTaTPn&bNrk~hLn;Q*FZ6LlV;`Nh2Ct6s5cbIv{FgJN=;zy1J1{)@r)3~3cM;=jfIIf$x|jn zc`F7OtV!Yvj88d_P#ie4m!^>--(w7Tx5xYG^0~YSl+QP70FOr#*~Ne^*5d z3ksYlEoU+)x@BOCVIwU$n2Q`wsTIehF^ywt-mLKsXJyHa)wS68z;MdB4sXzTyUK=O z5a48N7b(%fAnmr90X!#o^r)!owjiS0p@BZy}UjWz6P*6c~~MNg;P znAy}eAqmoMy#`4X+ceMTczPxfJv7sc<@t<4h1o*1-`cRtY+0rR-q3D;o&&3@*=K zYzrQkaG**1IOyaZvmf^2jzfY6jvf|z?}^95xJcDlN|Wp%O@P4ir${fA^y{HZTZ;H66=B~^?0;Yl9!9HbQN z{&=>`E?b1HR9#)ey42Q7cj>SWX7U1o^=egHb!$EC2iC2}qK&4ouojvdRwd#lo7)MT zYOrV$q#E%kDax+fj z(eY+H5tw~Auj73DA+ceW4a}faITB`#qsta&Pd&46z^&md%u$JCfd@f48EM2b6FvX5 zI;+}R@QGba+jnX>OpQrqrbdNU8h#+>aAL}wc1`jkU44&e z;_r~6D-m|IZ=wT7D{$i6Dz^VPj=`fGZ`NqrMs>{s!l8k00>8=kaAv8E^EZN&GQB+o z#=XgVaM1780P=&3d3@kc(y=6^oo+T(WGXW zNe=Av4WrrbkrK)b<_UytX~hYv6J28-sU%q7Kj}wXOG^T4QzOp2@H|P+V;aV0dSObz zP;=hOxq`#OnKNtF$>F@JmC5Er(i~zNecDRO{8_O05olp1Knc1<-5aSWSiv*7Y&jYDkIIt%Ux^&QQD|mn_GP5=(%|gO z@I`5}GxOR9%*otc9QeVY%)FA!a7kt^L}q4&$};E|IPXc_B;8SPY2eh%+>59#zAPy* zCPA298tYJ>!t|XyE`Hq#HCIK}lxb%*-$(P1C1lu&zeY#V-V5U9kJ|V5z4IH7`mpAzgDaR|FF-ltI0vERsQf zy<2pBOvbTa%f(j>o?lDQ36k9-vJE85eV&u*b0vEgUB;hWLvglz$;vNMNc9)Jk^cH^ z+=Oq=()#Risr;x1uW5^~Z$fb6o@g`odZj3?^LatYXOfr3{FQivTz*>%F;u58zpy7; z1ePiq5n*a$E0e1*199k_Z|LfkD`{p4NAq7AVM&~u;Ak2R8DZs&87#pM7g7u}oP0Wz zp@lG?HbD6}AD+OEexf#3AH{($wj=+cD-1m}Z1Uf>ds>TyvVS#3^VNUhZv!au_C0Rp%Gvp_f zNPU+rTaB{5+JE`?rqZYKBW!A){@X*l{Wf5>PO90$3xVS-7W)aK%a+~L2S#!`jdO{U)tYo z1-32w%YN#gcL{013r^%uCK#@FTeODuWxq4dw4`xD_R|jmZToisBT4NiNWR{?!rcF+ zn*zbre!V{iys!E%{Mb|&FZJ}M_4NL%)Yo#oACUUW>s{+9{{{%ctZC*rKQR(3tOD)7 z)_)yDU;fJ#|AnPN@*lZE>#JYMr`8Yyahw&m@XdMO+`LcQ{yuGobnY)ql}Ng|kHT#% z{@Lx*f56;l`@b>uGOa?peIwQTljPEz_Yd?gq4xUL6716wlDCool+u4~8u01SFgsN6 zFz$5m{u6iet7_NTCQa*GCa0r}^yq&YuP=t8yiRxp?sRDyq_jf#7DnX{&4Z5Np9@P{ z1<#gyGwvk+p76Y96*|~!)iwn|`thB0b%J+&e$a8e0XXSjA>+jRRbaIDC49Hw`WnDp zf)|TR^`&!vR$Q9q{UWe;6_*AZ!0Q$CqDc|tc=*@#;r{h2XkJX65*8}RquC3FH)Zo- z6$LqyS|HdUKaKQ-(=6+K1s(bC7OkS7dEd8%l75Y{o<%|L=_rLC0zV8v4ZZ4x2m{yH z&@#GD?guaH2e0f0U)c}d&=3CYe(!8Klso3!5`=cf4(35)qe1| z`oX{G2dD2~^dy+R-AJ8&;5%IFOKLub@%_BYJ5rQyMXduYI!`p;fq1{!(qFiw&St#d zJaA=mD!UG+!t|>b?*uF*&QFkZl4n8voS^mkZl&k(#wjG(ONPc#6ezMSoO0*oU6S8HJ9y9NHr zhmQ5onD3ZePLJtORjQ_b^49B{QEJNf(=bH| zzDPCzUR@!J1Eve_+jNhq`x$zcqOxtse{>yhZj2oP`tt+kDiK`eb)UoU0kB#=953hr{5*T zxagLLf7))2;G~D1x2TLR%I|ckeq9^J`}7=(a@9k5nJ&7G$3MkeeK^^!_(eXP&O{Xd zi4UhesN#?HgHxWRi*6I}Pvt4k(nU9ayZd}N#fHiUW$Qu3en0DeUj2h&zQQ7J`)9IG zkKaG@efUIZ(00%8;RQbYLLXk}!>{z=bcUjOuJ_@7KkV}16!R({kU*mT`t=Oy2Os0Z z{rboCgP-cdC;Qq>`fz`oT;#*Y`Q-oN!~J&d_u>9=Y?OUE^~n{q~3C`Owxs)`$D;`OJq;@#&99!qWJmn4qglaMFJw{;54JK6#p_kK!L) z-}d2@2Q;sB_M>O3Pu{QR7e1Wy%p~Qw?&(L*PD}nYBknxjkNh*1yd2j#dwe+Avqkh| zgbYFcA$+Oeiv=hD9EE@CpVxf2fBt^%!~O9eKFBB}Jtz6}%<4kHKPB0K%p9Wt2^J^bY&+v*re0CRwuOsY=MtYDe_Y*W$*Z0n7Or|8?nlr2mc07; zUp{%ipVNn?`sMd?z7O~Nd8y#q-^Hf7v)m`|*VAIjYri&Gxc2K}pB}$|e&Ca*sS|Qd z!?*fynrf=&&VKZa%rW)Uezj-3g{vNVFBM&O9+>Ns_uF%p5BJ+s(~q9DK6%npEd9E~ zhx_$h(T|?3mV7%~jn`RPxc2Ke{pk6VC9nSZhlQ)2kNeS6c!)8;_VY{&S3PBd+kReV z$*Vo*Sh(srw;w&Hi9bmHk@%I^AF-t8O_B5W%de+Z%GI9tM9(@OPI^8Rev=RP>$%p4lRbG!sb3YMr`U&+o+-jdd^p)tEc;-M7b+$_*NUEcpFHU~RrppP zPI^{|{3Sk|tE}`{d(^3;eI{(I~mopQRKRP@_s!p`*6RW-4=eC z@NfEXzaEDeTvY7WLof8DOL01Pr%Qi#L#$tq#;?k&e+n!;KNmekKHRT|&adgR^(?jU z--(_TKHRT|&aeB@v&q8gdjPsF@!>);zRib|f7I{WE&M~#bB7O~$r{YZqduJC@MVcB zd7R~ad#+EOzF(w^)|W%^FON3kxMZ8-;j0AD+^h1(3qard(naQp3Cz>pgD#RE!<6|b z5L)%zEzj-r>`a&9mxzJ%EJK@aYDsewH_DEsDe3%^bDEVl4dej4 z|GDTt*TO#%znyR4|0DaSi!GeKpP}n2bMy3{LW7TselJ0n_IHKY|6>Dt_`4*4OP@bf zzFzFyVTwKZOGN%L3*RW~{qq*yCj4s_UMc&Pw=Dc-3AB$be7gpe#IM?^=K_N*e6;94 z#KM0ec8;|0@dud(<>v@qe-9P8iI)5j;ip>op)!thEPTAg=VA-LS^ONeaLpU~8%OQ$ zO)_8BS@O3_oOD?Ds}i4@|5eX=>94+GQt^xBx&5b>o-4&p&HpOj6f%B$(2~DM_@^xV z0ht&6b8N~Rt>Pa&$5#FNVu$xFJx|E^eqrHni2j3QeyE)&4x!%Ha1;5$CU(Ggl-e%#q%Q)(b7uC*D(yx0g`63w?`aYE|m7gl@K4Rf{(ywRw z!C$oSXC==6(hvT33;&U&d472bbh&^L1e2MsNf`uO? z<5g_oRT2+#Ej(A^|8xuAAb7QfKO*fWEPS}|=UKRz?`*R0J0u=1vhdl`?xhxfo~%<> zS@=_ue{}z={=87+Z?NPqkT|)?!gtDgcdLc35WoG#!XGxn>g=@eKgf9h-omdCdvt%K zb}GKdlGiwS&%!Sd|9@`bYoy(ftS74fBC%gzhp6~YnHOP8UjNG9aTc!MuM}DM%Q9ZG zEnHv2qi=!KcC#fu&$8qT#Q*x{NtJ(4`kAog6Jq}+3x879ef_JQs%N3(jcYCWHza;; zvhcaGe*MD2$BX^*;=SMAkx3v4bh3mP@ZVNv|^t@x?izR+OweV*IPm{RN{zfIv z^>@mOZxDYTYRUgy`m6g6m2VdPCtC6uGO=e{_@5=eEwu0t#Ls72_+%Nc)fRq>_+g!e z>$YyQg+C?v^C}B(6nv|NN5sxsE&RV_{k_M+Kau&a`A_{5m3jA^C0{3g+il@`e!b7a z^{>DF)51RzKMa(0Tiex_1|4GI0dbIiaZh&}n1ymZT%X5o9pj#(BSm-)WH!ei7B zt}`wC9U1pk7OsB<_16}z^Q+s!=ZPPlu<+lAJug}K4JnZye_ia%`BmTKG8lF6_bgn07j?abUm@+zk$6%6X#6j>@GGTXYb|_^%*PH3S3Or+xa#?hg^!bX zc(5P*X$yZ|^3|U#T-W>eE!>sYtY^`G3iH?XmDSvFCjY|4jA|Ut0KX(UT#0McdVNB-g?%Pd@95Kw2~?@PXlTe$8^Hd*-7vTj{w;de?N{=S7@CwBhC!oMT_{FQ}Y zB>I16;hzisl!cF#{mH8q-X`t7Y2itUtB)wG!Z!Xpw_ zQ!G3o<2%d3Gh`o9Vd4KRxV~0X?VKq1IhOog!mqXPcFmI(ev+(r*I4*LV*d{<{8-6j zzp(IY$S_U7Owk~<1PF! znMX7F!RJ}Hj{6xF{+jqoxK*W`|$l1K3V*%-y`XGy(;6FE#t5FM>1~@weVxb z592NTHqn2gh3ol(zU@Z!|3dQcLR((+=zC;T{zi%a)s}px_$T$I8?(Oaxy@!v{zy`Y z>naOxlJVMV;jf7wZ?*8B$++KR;dwG&9eON1Y0;U%KyNDJ5bUTER(NWW%S_z4m}`rNGTz9@O}OiTV3@_f`_;rf=5 zwHB`Dhnp=tUHo~qg;86$g=^l9S-9r;xP{*! zcKUzENb#)SmtSGYpDO;;my2nCGiCp9izTnP+N<)jX!7Fvoh3hA^#9(%HGcHvPO9e@ zMBw_HC9nC@|2s+Q*PATuIA2)uy1zO|;zITRUF3#Y_&E}{V=esqGF}rbT=%ypS@;Jc zAF=RfrQIbKez(}a%EGl>|L-TMzpXM)e`3kkNZxtC!gW1;&%#S2Z|}Eo{k^`veMtTG z0~tqsDX!w5NS+@ib}8N@_KfWZ&$n>3bE<{kCUL0ewW|LinRiu|{Ik-Z77LHbx^`Ya z_(c|8BmKI{!ZmN)VBu>2Pc2-(pS#P#CkemP!u1^HDGS%U_lkwTEBn}e7Owvt)Mpm1 zZ&p8G;ho~20peHn^A&>Yeq8Yb63;^{`D)pRjIi*xs3NXIEj%dvkrv)9{y)~jzbp3W zeqZgWkoEcmOa67u!xp|v^!tC;O7m;B@7h3oqFZ419! z^2X&BK3w=8Sh&6=Zo7qR-2U3ab$`Co!mp6|^1l|Y`}03qxaQUU7Jj?z$AU6GIxgAr ze4@|yinmBU8E47gE`FG3;d=gcvV|{`xGJ^qsNfYA{w-;Dpv0-#bB4sjPz(Q3^5mfw zuD?IleYfh-^T`t|`H#d8B^G|C#+!xj61(+#1J%D>=55T9e@XB*3m+!^x}YDt)54FF zIRCDN&y;!eLkk})<9?fkKPBznW8vzbhb{bjl21mC;56ZVKeA8!c9eyWk-Rs_!pDl< z85Vw!$d}u=^lO=gtDSWgev>iJiCehl|4kPD8(F_Dv+#>0Uwz-gw@Tdp#KJqI-CtR_ zEBoi)S$Mnn^C=4-A%1w(!rzqfip!5RHQr8^`FNLw|6c68&%)QpeA#K?dj9yRh3oI1 zpR(}FB@Umr@LA%|S1tTm8OOg{xbBzUxA1$#{xPyK*8WbCb}KCW0@=^BTKIAq$MY@x zUKy8*E&M^5r&n9J>iMySuNFIRweaN<55KhVowAR;+ro#5{W~oDX^Dr2EPS)%_a`j; zFqw}pTDYD+{-qy$pM~rE`pm-1WE=;K>X`>dN!}h};rB`YJk-Kzpe+xfgH(}$qE;TEl=2)whuQ)X3e7k`ZGa*S)H;#@DMM;$%EOTo+Madx z`s3d4+!fpSxM7W)AT`9ab`_($(g^XvL@LkmZM!3~`M7SO2IVIfA z2V50y*9-nfcwP3N2D~`l#=Tn{XPOEh!S+fM{v-C!p~4^J`py%6nfrwggy(R-b6EI5 z##1KzE&AVw$$C^Q{uIuaGKIgucFz@_9~Msx626!HYMk&otapm=DIDj2BHYf;tq^Yc z|Ap}OjDNFm%l~`AudyA^3D0A@+!X#_<}>wMVZ|+Pc0E9j@G9=t^2pJAoC?GSQ$_zU zx6{SKZC>%J_@sp}65E}gyMp+WU83(peW~z`>{p)&A4&Z`gxhmk>a__1%fpBK9@LoJ z)^`+rx;s7M>`R{GI8ttT7~nYcv#B2~{u9XyogO|%*}gA}ekJv9J3ah&l5Z1^=fKd0;Y2nrQv*c|Y zhkptCRcFWHWA|-kIS&0XZjZT+LvQytJ?uF2*EtRkaUA+|cJ|?pLvP1t3LJ-iCiN2> zhyEhRjcLNGI4;e096sCWQ{*^&`msMOavb^#)GsHuep{FM+*yNuZw>nMPLFz5FwP3m z+jiHmZ6u0{wPS1M{~pKTGnD(0R*oZnyI#DFUWF&5cMZSUrGIG(U(zwL-;xJ zly*@NQK=RE1G4)NGKJ&0bSU}4uVBHbOcq{;`enki$k#iLrcI4q5{Uzjqsw+8FLN9g zh4>SdOTw3vC$|ru+j`})-CH{D>mA@YHVqZ}t^^IrUFEJ>s-uP4D zc3tLb;rpn6+j02Yyl#`@@V}4qpRJC^@o;|izT?o3r2dd_d+yIij>E_1wE@}m)7nOe_TC2*!kJk!kf`QTe#gH@|f^W)ITFUpL~(< zx#TN^+j?ygeu?^n!v9VF7jo-|H`z}vir${*P`hKugYBo*;XhHS=Q!G>kb_5K$C1x= z+#fY}9Qu}QuQbP@-$s20$Dz09s&sQ4`Yaybctp5eA2vdGKkiQp$gQ80)QQZZGSTVL zPx1hxQs_A9JwTtAYTyfmpQnDA@Y>AV>yG<+-*g=HW>8-&JfD0sxvkeZuGc=%+jT+* zMSq9-v!ef;{^g>#>jZ9#z82?)$r;GrH}jm1>JB z-0pi_DSR#UJB8ake82EJjOUDS+mBR|+xBATb8iXX!u5@Q+&wO)ufqvJ{9`FDZ&S!q zski*RS1&BzS$s;V?8VO%P-dy-u^0wsG zE@SDRC44*iqs|B8+mqZsJ}!Fu-u*+T$2ic4^M@B5htJbk>8LDl9Qq$nzr=Cq?S9cW z9EbiW^~J*N_|+cA;bX`54mu8>bnahD9f$rl*Y~*N&<~;h6UU+N#O>vC$D!ZP<3AT2 zhyE!vL{zRi4t)~mrPm$Dcsmo~s8l%)ADidY>k@xl{eA5weNr5Uek=E1EgVO^c|31) zKe_djw;BfD9!?LR-E7DHj>D&dJ_8+xeiHlPXma!4*D(0c5PpVyxo|t4SxgR@k7tMD zh$oHbhju&e2U|qPC95{S$wp(xnETE&L4ixsJ!%5dw(HK*u5N!SfvX z!e{U}^%&vrV5Ot-lyEyft!n>lA%@JMQ%Z9EZMpdWd7F@aM_LkXt-q$8m%* zne*+WtRS#@7n64tzJ)wr_-kyhNsjw?mI}9c-f$f89HY->$Gy)Vg`3Z5$KjLDaqpV& zpOM$&1P|-${WFD|e;>!;|2z5&cij8TcKq&0Umq1k#M-|2N?l zXQkute~vzNx})}Qo^NLTq^sjT&i;Ap^vJ_T=3%Q2 zpN36B1q+0arhhTH%^#LBpPNPh4E2YE+kK|Tg(o=AuMnP2UcXm}%i8NP@(khQ$Oj5v zM*cnF$GH6#3jd1nFLoSxn;ybQ{M>Qmty$yn!A{{%GoJ?>htC-LoFzv-(Vy+PX&0Ry zU4JI^RieM05YGWC~)FG6FY^bRkUH@hFE ziSTkXW>k6#|26Y4Lik7?zj{IVRQAIS!W-Qi{Pzg|1MB@nxIGu|itxvohpWODF#k!s zfW+3fg#F|J;ZLw#`U~%c1*0-S_?z@85pK^fI4k_e^tmQ{Ft?+|xuG75Gn>bCdka6w z?YBVqSho9o;dX!QD&gyx|82tU`mv9M+jI2Fg%9NT!*s;o>sy3XiT^U(>hJaTQ8xE` zHtrcuFqe`{{V2c{Ad6G literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/modules/http/.libs/mod_mime.la b/rubbos/app/httpd-2.0.64/modules/http/.libs/mod_mime.la new file mode 100644 index 00000000..854bb02d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/http/.libs/mod_mime.la @@ -0,0 +1,35 @@ +# mod_mime.la - a libtool library file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='' + +# Names of this library. +library_names='' + +# The name of the static archive. +old_library='mod_mime.a' + +# Libraries that this one depends upon. +dependency_libs=' -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib' + +# Version information for mod_mime. +current= +age= +revision= + +# Is this an already installed library? +installed=no + +# Should we warn about portability when linking against -modules? +shouldnotlink=yes + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='' diff --git a/rubbos/app/httpd-2.0.64/modules/http/.libs/mod_mime.o b/rubbos/app/httpd-2.0.64/modules/http/.libs/mod_mime.o new file mode 100644 index 0000000000000000000000000000000000000000..dae6c77be9babb62e8e71200f119f5bfeda53037 GIT binary patch literal 75064 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 T?ZuvBT*tY8Zwuh`b{_Tr$M4`Y literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/modules/http/Makefile b/rubbos/app/httpd-2.0.64/modules/http/Makefile new file mode 100644 index 00000000..fc341312 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/http/Makefile @@ -0,0 +1,8 @@ +top_srcdir = /bottlenecks/rubbos/app/httpd-2.0.64 +top_builddir = /bottlenecks/rubbos/app/httpd-2.0.64 +srcdir = /bottlenecks/rubbos/app/httpd-2.0.64/modules/http +builddir = /bottlenecks/rubbos/app/httpd-2.0.64/modules/http +VPATH = /bottlenecks/rubbos/app/httpd-2.0.64/modules/http + +include $(top_srcdir)/build/special.mk + diff --git a/rubbos/app/httpd-2.0.64/modules/http/Makefile.in b/rubbos/app/httpd-2.0.64/modules/http/Makefile.in new file mode 100644 index 00000000..167b343d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/http/Makefile.in @@ -0,0 +1,3 @@ + +include $(top_srcdir)/build/special.mk + diff --git a/rubbos/app/httpd-2.0.64/modules/http/config2.m4 b/rubbos/app/httpd-2.0.64/modules/http/config2.m4 new file mode 100644 index 00000000..ecb7e6e5 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/http/config2.m4 @@ -0,0 +1,20 @@ +dnl modules enabled in this directory by default + +APACHE_MODPATH_INIT(http) + +http_objects="http_core.lo http_protocol.lo http_request.lo" + +dnl mod_http should only be built as a static module for now. +dnl this will hopefully be "fixed" at some point in the future by +dnl refactoring mod_http and moving some things to the core and +dnl vice versa so that the core does not depend upon mod_http. +if test "$enable_http" = "yes"; then + enable_http="static" +elif test "$enable_http" = "shared"; then + AC_MSG_ERROR([mod_http can not be built as a shared DSO]) +fi + +APACHE_MODULE(http, HTTP protocol handling, $http_objects, , static) +APACHE_MODULE(mime, mapping of file-extension to MIME, , , yes) + +APACHE_MODPATH_FINISH diff --git a/rubbos/app/httpd-2.0.64/modules/http/http_core.c b/rubbos/app/httpd-2.0.64/modules/http/http_core.c new file mode 100644 index 00000000..c214bc46 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/http/http_core.c @@ -0,0 +1,322 @@ +/* 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. + */ + +#include "apr_strings.h" +#include "apr_thread_proc.h" /* for RLIMIT stuff */ + +#define APR_WANT_STRFUNC +#include "apr_want.h" + +#define CORE_PRIVATE +#include "httpd.h" +#include "http_config.h" +#include "http_connection.h" +#include "http_core.h" +#include "http_protocol.h" /* For index_of_response(). Grump. */ +#include "http_request.h" + +#include "util_filter.h" +#include "util_ebcdic.h" +#include "ap_mpm.h" +#include "scoreboard.h" + +#include "mod_core.h" + +/* Handles for core filters */ +AP_DECLARE_DATA ap_filter_rec_t *ap_http_input_filter_handle; +AP_DECLARE_DATA ap_filter_rec_t *ap_http_header_filter_handle; +AP_DECLARE_DATA ap_filter_rec_t *ap_chunk_filter_handle; +AP_DECLARE_DATA ap_filter_rec_t *ap_byterange_filter_handle; + +static const char *set_keep_alive_timeout(cmd_parms *cmd, void *dummy, + const char *arg) +{ + const char *err = ap_check_cmd_context(cmd, NOT_IN_DIR_LOC_FILE|NOT_IN_LIMIT); + if (err != NULL) { + return err; + } + + cmd->server->keep_alive_timeout = apr_time_from_sec(atoi(arg)); + return NULL; +} + +static const char *set_keep_alive(cmd_parms *cmd, void *dummy, + const char *arg) +{ + const char *err = ap_check_cmd_context(cmd, NOT_IN_DIR_LOC_FILE|NOT_IN_LIMIT); + if (err != NULL) { + return err; + } + + /* We've changed it to On/Off, but used to use numbers + * so we accept anything but "Off" or "0" as "On" + */ + if (!strcasecmp(arg, "off") || !strcmp(arg, "0")) { + cmd->server->keep_alive = 0; + } + else { + cmd->server->keep_alive = 1; + } + return NULL; +} + +static const char *set_keep_alive_max(cmd_parms *cmd, void *dummy, + const char *arg) +{ + const char *err = ap_check_cmd_context(cmd, NOT_IN_DIR_LOC_FILE|NOT_IN_LIMIT); + if (err != NULL) { + return err; + } + + cmd->server->keep_alive_max = atoi(arg); + return NULL; +} + +static const command_rec http_cmds[] = { + AP_INIT_TAKE1("KeepAliveTimeout", set_keep_alive_timeout, NULL, RSRC_CONF, + "Keep-Alive timeout duration (sec)"), + AP_INIT_TAKE1("MaxKeepAliveRequests", set_keep_alive_max, NULL, RSRC_CONF, + "Maximum number of Keep-Alive requests per connection, or 0 for infinite"), + AP_INIT_TAKE1("KeepAlive", set_keep_alive, NULL, RSRC_CONF, + "Whether persistent connections should be On or Off"), + { NULL } +}; + +/* + * HTTP/1.1 chunked transfer encoding filter. + */ +static apr_status_t chunk_filter(ap_filter_t *f, apr_bucket_brigade *b) +{ +#define ASCII_CRLF "\015\012" +#define ASCII_ZERO "\060" + conn_rec *c = f->r->connection; + apr_bucket_brigade *more; + apr_bucket *e; + apr_status_t rv; + + for (more = NULL; b; b = more, more = NULL) { + apr_off_t bytes = 0; + apr_bucket *eos = NULL; + apr_bucket *flush = NULL; + /* XXX: chunk_hdr must remain at this scope since it is used in a + * transient bucket. + */ + char chunk_hdr[20]; /* enough space for the snprintf below */ + + APR_BRIGADE_FOREACH(e, b) { + if (APR_BUCKET_IS_EOS(e)) { + /* there shouldn't be anything after the eos */ + eos = e; + break; + } + if (APR_BUCKET_IS_FLUSH(e)) { + flush = e; + more = apr_brigade_split(b, APR_BUCKET_NEXT(e)); + break; + } + else if (e->length == (apr_size_t)-1) { + /* unknown amount of data (e.g. a pipe) */ + const char *data; + apr_size_t len; + + rv = apr_bucket_read(e, &data, &len, APR_BLOCK_READ); + if (rv != APR_SUCCESS) { + return rv; + } + if (len > 0) { + /* + * There may be a new next bucket representing the + * rest of the data stream on which a read() may + * block so we pass down what we have so far. + */ + bytes += len; + more = apr_brigade_split(b, APR_BUCKET_NEXT(e)); + break; + } + else { + /* If there was nothing in this bucket then we can + * safely move on to the next one without pausing + * to pass down what we have counted up so far. + */ + continue; + } + } + else { + bytes += e->length; + } + } + + /* + * XXX: if there aren't very many bytes at this point it may + * be a good idea to set them aside and return for more, + * unless we haven't finished counting this brigade yet. + */ + /* if there are content bytes, then wrap them in a chunk */ + if (bytes > 0) { + apr_size_t hdr_len; + /* + * Insert the chunk header, specifying the number of bytes in + * the chunk. + */ + /* XXX might be nice to have APR_OFF_T_FMT_HEX */ + hdr_len = apr_snprintf(chunk_hdr, sizeof(chunk_hdr), + "%qx" CRLF, (apr_uint64_t)bytes); + ap_xlate_proto_to_ascii(chunk_hdr, hdr_len); + e = apr_bucket_transient_create(chunk_hdr, hdr_len, + c->bucket_alloc); + APR_BRIGADE_INSERT_HEAD(b, e); + + /* + * Insert the end-of-chunk CRLF before an EOS or + * FLUSH bucket, or appended to the brigade + */ + e = apr_bucket_immortal_create(ASCII_CRLF, 2, c->bucket_alloc); + if (eos != NULL) { + APR_BUCKET_INSERT_BEFORE(eos, e); + } + else if (flush != NULL) { + APR_BUCKET_INSERT_BEFORE(flush, e); + } + else { + APR_BRIGADE_INSERT_TAIL(b, e); + } + } + + /* RFC 2616, Section 3.6.1 + * + * If there is an EOS bucket, then prefix it with: + * 1) the last-chunk marker ("0" CRLF) + * 2) the trailer + * 3) the end-of-chunked body CRLF + * + * If there is no EOS bucket, then do nothing. + * + * XXX: it would be nice to combine this with the end-of-chunk + * marker above, but this is a bit more straight-forward for + * now. + */ + if (eos != NULL) { + /* XXX: (2) trailers ... does not yet exist */ + e = apr_bucket_immortal_create(ASCII_ZERO ASCII_CRLF + /* */ + ASCII_CRLF, 5, c->bucket_alloc); + APR_BUCKET_INSERT_BEFORE(eos, e); + } + + /* pass the brigade to the next filter. */ + rv = ap_pass_brigade(f->next, b); + if (rv != APR_SUCCESS || eos != NULL) { + return rv; + } + } + return APR_SUCCESS; +} + +static const char *http_method(const request_rec *r) + { return "http"; } + +static apr_port_t http_port(const request_rec *r) + { return DEFAULT_HTTP_PORT; } + +static int ap_process_http_connection(conn_rec *c) +{ + request_rec *r; + int csd_set = 0; + apr_socket_t *csd = NULL; + + /* + * Read and process each request found on our connection + * until no requests are left or we decide to close. + */ + + ap_update_child_status(c->sbh, SERVER_BUSY_READ, NULL); + while ((r = ap_read_request(c)) != NULL) { + + c->keepalive = AP_CONN_UNKNOWN; + /* process the request if it was read without error */ + + ap_update_child_status(c->sbh, SERVER_BUSY_WRITE, r); + if (r->status == HTTP_OK) + ap_process_request(r); + + if (ap_extended_status) + ap_increment_counts(c->sbh, r); + + if (c->keepalive != AP_CONN_KEEPALIVE || c->aborted) + break; + + ap_update_child_status(c->sbh, SERVER_BUSY_KEEPALIVE, r); + apr_pool_destroy(r->pool); + + if (ap_graceful_stop_signalled()) + break; + /* Go straight to select() to wait for the next request */ + if (!csd_set) { + csd = ap_get_module_config(c->conn_config, &core_module); + csd_set = 1; + } + apr_socket_opt_set(csd, APR_INCOMPLETE_READ, 1); + } + + return OK; +} + +static int http_create_request(request_rec *r) +{ + if (!r->main && !r->prev) { + ap_add_output_filter_handle(ap_byterange_filter_handle, + NULL, r, r->connection); + ap_add_output_filter_handle(ap_content_length_filter_handle, + NULL, r, r->connection); + ap_add_output_filter_handle(ap_http_header_filter_handle, + NULL, r, r->connection); + } + + return OK; +} + +static void register_hooks(apr_pool_t *p) +{ + ap_hook_process_connection(ap_process_http_connection,NULL,NULL, + APR_HOOK_REALLY_LAST); + ap_hook_map_to_storage(ap_send_http_trace,NULL,NULL,APR_HOOK_MIDDLE); + ap_hook_http_method(http_method,NULL,NULL,APR_HOOK_REALLY_LAST); + ap_hook_default_port(http_port,NULL,NULL,APR_HOOK_REALLY_LAST); + ap_hook_create_request(http_create_request, NULL, NULL, APR_HOOK_REALLY_LAST); + ap_http_input_filter_handle = + ap_register_input_filter("HTTP_IN", ap_http_filter, + NULL, AP_FTYPE_PROTOCOL); + ap_http_header_filter_handle = + ap_register_output_filter("HTTP_HEADER", ap_http_header_filter, + NULL, AP_FTYPE_PROTOCOL); + ap_chunk_filter_handle = + ap_register_output_filter("CHUNK", chunk_filter, + NULL, AP_FTYPE_TRANSCODE); + ap_byterange_filter_handle = + ap_register_output_filter("BYTERANGE", ap_byterange_filter, + NULL, AP_FTYPE_PROTOCOL); + ap_method_registry_init(p); +} + +module AP_MODULE_DECLARE_DATA http_module = { + STANDARD20_MODULE_STUFF, + NULL, /* create per-directory config structure */ + NULL, /* merge per-directory config structures */ + NULL, /* create per-server config structure */ + NULL, /* merge per-server config structures */ + http_cmds, /* command apr_table_t */ + register_hooks /* register hooks */ +}; diff --git a/rubbos/app/httpd-2.0.64/modules/http/http_core.lo b/rubbos/app/httpd-2.0.64/modules/http/http_core.lo new file mode 100644 index 00000000..3ab9338f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/http/http_core.lo @@ -0,0 +1,12 @@ +# http_core.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/http_core.o' + +# Name of the non-PIC object. +non_pic_object='http_core.o' + diff --git a/rubbos/app/httpd-2.0.64/modules/http/http_core.o b/rubbos/app/httpd-2.0.64/modules/http/http_core.o new file mode 100644 index 0000000000000000000000000000000000000000..2be9da12eb67c9631633ee523e02cb872d46339c GIT binary patch literal 47552 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 H_3Qrukhogd literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/modules/http/http_protocol.c b/rubbos/app/httpd-2.0.64/modules/http/http_protocol.c new file mode 100644 index 00000000..163a9091 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/http/http_protocol.c @@ -0,0 +1,3212 @@ +/* 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. + */ + +/* + * http_protocol.c --- routines which directly communicate with the client. + * + * Code originally by Rob McCool; much redone by Robert S. Thau + * and the Apache Software Foundation. + */ + +#include "apr.h" +#include "apr_strings.h" +#include "apr_buckets.h" +#include "apr_lib.h" +#include "apr_signal.h" + +#define APR_WANT_STDIO /* for sscanf */ +#define APR_WANT_STRFUNC +#define APR_WANT_MEMFUNC +#include "apr_want.h" + +#define CORE_PRIVATE +#include "util_filter.h" +#include "ap_config.h" +#include "httpd.h" +#include "http_config.h" +#include "http_core.h" +#include "http_protocol.h" +#include "http_main.h" +#include "http_request.h" +#include "http_vhost.h" +#include "http_log.h" /* For errors detected in basic auth common + * support code... */ +#include "apr_date.h" /* For apr_date_parse_http and APR_DATE_BAD */ +#include "util_charset.h" +#include "util_ebcdic.h" +#include "util_time.h" + +#include "mod_core.h" + +#if APR_HAVE_STDARG_H +#include +#endif +#if APR_HAVE_UNISTD_H +#include +#endif + +/* New Apache routine to map status codes into array indicies + * e.g. 100 -> 0, 101 -> 1, 200 -> 2 ... + * The number of status lines must equal the value of RESPONSE_CODES (httpd.h) + * and must be listed in order. + */ + +#ifdef UTS21 +/* The second const triggers an assembler bug on UTS 2.1. + * Another workaround is to move some code out of this file into another, + * but this is easier. Dave Dykstra, 3/31/99 + */ +static const char * status_lines[RESPONSE_CODES] = +#else +static const char * const status_lines[RESPONSE_CODES] = +#endif +{ + "100 Continue", + "101 Switching Protocols", + "102 Processing", +#define LEVEL_200 3 + "200 OK", + "201 Created", + "202 Accepted", + "203 Non-Authoritative Information", + "204 No Content", + "205 Reset Content", + "206 Partial Content", + "207 Multi-Status", +#define LEVEL_300 11 + "300 Multiple Choices", + "301 Moved Permanently", + "302 Found", + "303 See Other", + "304 Not Modified", + "305 Use Proxy", + "306 unused", + "307 Temporary Redirect", +#define LEVEL_400 19 + "400 Bad Request", + "401 Authorization Required", + "402 Payment Required", + "403 Forbidden", + "404 Not Found", + "405 Method Not Allowed", + "406 Not Acceptable", + "407 Proxy Authentication Required", + "408 Request Time-out", + "409 Conflict", + "410 Gone", + "411 Length Required", + "412 Precondition Failed", + "413 Request Entity Too Large", + "414 Request-URI Too Large", + "415 Unsupported Media Type", + "416 Requested Range Not Satisfiable", + "417 Expectation Failed", + "418 unused", + "419 unused", + "420 unused", + "421 unused", + "422 Unprocessable Entity", + "423 Locked", + "424 Failed Dependency", + /* This is a hack, but it is required for ap_index_of_response + * to work with 426. + */ + "425 No code", + "426 Upgrade Required", +#define LEVEL_500 46 + "500 Internal Server Error", + "501 Method Not Implemented", + "502 Bad Gateway", + "503 Service Temporarily Unavailable", + "504 Gateway Time-out", + "505 HTTP Version Not Supported", + "506 Variant Also Negotiates", + "507 Insufficient Storage", + "508 unused", + "509 unused", + "510 Not Extended" +}; + +APR_HOOK_STRUCT( + APR_HOOK_LINK(insert_error_filter) +) + +AP_IMPLEMENT_HOOK_VOID(insert_error_filter, (request_rec *r), (r)) + +/* The index of the first bit field that is used to index into a limit + * bitmask. M_INVALID + 1 to METHOD_NUMBER_LAST. + */ +#define METHOD_NUMBER_FIRST (M_INVALID + 1) + +/* The max method number. Method numbers are used to shift bitmasks, + * so this cannot exceed 63, and all bits high is equal to -1, which is a + * special flag, so the last bit used has index 62. + */ +#define METHOD_NUMBER_LAST 62 + + +AP_DECLARE(int) ap_set_keepalive(request_rec *r) +{ + int ka_sent = 0; + int wimpy = ap_find_token(r->pool, + apr_table_get(r->headers_out, "Connection"), + "close"); + const char *conn = apr_table_get(r->headers_in, "Connection"); + + /* The following convoluted conditional determines whether or not + * the current connection should remain persistent after this response + * (a.k.a. HTTP Keep-Alive) and whether or not the output message + * body should use the HTTP/1.1 chunked transfer-coding. In English, + * + * IF we have not marked this connection as errored; + * and the response body has a defined length due to the status code + * being 304 or 204, the request method being HEAD, already + * having defined Content-Length or Transfer-Encoding: chunked, or + * the request version being HTTP/1.1 and thus capable of being set + * as chunked [we know the (r->chunked = 1) side-effect is ugly]; + * and the server configuration enables keep-alive; + * and the server configuration has a reasonable inter-request timeout; + * and there is no maximum # requests or the max hasn't been reached; + * and the response status does not require a close; + * and the response generator has not already indicated close; + * and the client did not request non-persistence (Connection: close); + * and we haven't been configured to ignore the buggy twit + * or they're a buggy twit coming through a HTTP/1.1 proxy + * and the client is requesting an HTTP/1.0-style keep-alive + * or the client claims to be HTTP/1.1 compliant (perhaps a proxy); + * THEN we can be persistent, which requires more headers be output. + * + * Note that the condition evaluation order is extremely important. + */ + if ((r->connection->keepalive != AP_CONN_CLOSE) + && ((r->status == HTTP_NOT_MODIFIED) + || (r->status == HTTP_NO_CONTENT) + || r->header_only + || apr_table_get(r->headers_out, "Content-Length") + || ap_find_last_token(r->pool, + apr_table_get(r->headers_out, + "Transfer-Encoding"), + "chunked") + || ((r->proto_num >= HTTP_VERSION(1,1)) + && (r->chunked = 1))) /* THIS CODE IS CORRECT, see above. */ + && r->server->keep_alive + && (r->server->keep_alive_timeout > 0) + && ((r->server->keep_alive_max == 0) + || (r->server->keep_alive_max > r->connection->keepalives)) + && !ap_status_drops_connection(r->status) + && !wimpy + && !ap_find_token(r->pool, conn, "close") + && (!apr_table_get(r->subprocess_env, "nokeepalive") + || apr_table_get(r->headers_in, "Via")) + && ((ka_sent = ap_find_token(r->pool, conn, "keep-alive")) + || (r->proto_num >= HTTP_VERSION(1,1)))) { + int left = r->server->keep_alive_max - r->connection->keepalives; + + r->connection->keepalive = AP_CONN_KEEPALIVE; + r->connection->keepalives++; + + /* If they sent a Keep-Alive token, send one back */ + if (ka_sent) { + if (r->server->keep_alive_max) { + apr_table_setn(r->headers_out, "Keep-Alive", + apr_psprintf(r->pool, "timeout=%d, max=%d", + (int)apr_time_sec(r->server->keep_alive_timeout), + left)); + } + else { + apr_table_setn(r->headers_out, "Keep-Alive", + apr_psprintf(r->pool, "timeout=%d", + (int)apr_time_sec(r->server->keep_alive_timeout))); + } + apr_table_mergen(r->headers_out, "Connection", "Keep-Alive"); + } + + return 1; + } + + /* Otherwise, we need to indicate that we will be closing this + * connection immediately after the current response. + * + * We only really need to send "close" to HTTP/1.1 clients, but we + * always send it anyway, because a broken proxy may identify itself + * as HTTP/1.0, but pass our request along with our HTTP/1.1 tag + * to a HTTP/1.1 client. Better safe than sorry. + */ + if (!wimpy) { + apr_table_mergen(r->headers_out, "Connection", "close"); + } + + r->connection->keepalive = AP_CONN_CLOSE; + + return 0; +} + +AP_DECLARE(int) ap_meets_conditions(request_rec *r) +{ + const char *etag; + const char *if_match, *if_modified_since, *if_unmodified, *if_nonematch; + apr_time_t tmp_time; + apr_int64_t mtime; + + /* Check for conditional requests --- note that we only want to do + * this if we are successful so far and we are not processing a + * subrequest or an ErrorDocument. + * + * The order of the checks is important, since ETag checks are supposed + * to be more accurate than checks relative to the modification time. + * However, not all documents are guaranteed to *have* ETags, and some + * might have Last-Modified values w/o ETags, so this gets a little + * complicated. + */ + + if (!ap_is_HTTP_SUCCESS(r->status) || r->no_local_copy) { + return OK; + } + + etag = apr_table_get(r->headers_out, "ETag"); + + /* All of our comparisons must be in seconds, because that's the + * highest time resolution the HTTP specification allows. + */ + /* XXX: we should define a "time unset" constant */ + tmp_time = ((r->mtime != 0) ? r->mtime : apr_time_now()); + mtime = apr_time_sec(tmp_time); + + /* If an If-Match request-header field was given + * AND the field value is not "*" (meaning match anything) + * AND if our strong ETag does not match any entity tag in that field, + * respond with a status of 412 (Precondition Failed). + */ + if ((if_match = apr_table_get(r->headers_in, "If-Match")) != NULL) { + if (if_match[0] != '*' + && (etag == NULL || etag[0] == 'W' + || !ap_find_list_item(r->pool, if_match, etag))) { + return HTTP_PRECONDITION_FAILED; + } + } + else { + /* Else if a valid If-Unmodified-Since request-header field was given + * AND the requested resource has been modified since the time + * specified in this field, then the server MUST + * respond with a status of 412 (Precondition Failed). + */ + if_unmodified = apr_table_get(r->headers_in, "If-Unmodified-Since"); + if (if_unmodified != NULL) { + apr_time_t ius = apr_date_parse_http(if_unmodified); + + if ((ius != APR_DATE_BAD) && (mtime > apr_time_sec(ius))) { + return HTTP_PRECONDITION_FAILED; + } + } + } + + /* If an If-None-Match request-header field was given + * AND the field value is "*" (meaning match anything) + * OR our ETag matches any of the entity tags in that field, fail. + * + * If the request method was GET or HEAD, failure means the server + * SHOULD respond with a 304 (Not Modified) response. + * For all other request methods, failure means the server MUST + * respond with a status of 412 (Precondition Failed). + * + * GET or HEAD allow weak etag comparison, all other methods require + * strong comparison. We can only use weak if it's not a range request. + */ + if_nonematch = apr_table_get(r->headers_in, "If-None-Match"); + if (if_nonematch != NULL) { + if (r->method_number == M_GET) { + if (if_nonematch[0] == '*') { + return HTTP_NOT_MODIFIED; + } + if (etag != NULL) { + if (apr_table_get(r->headers_in, "Range")) { + if (etag[0] != 'W' + && ap_find_list_item(r->pool, if_nonematch, etag)) { + return HTTP_NOT_MODIFIED; + } + } + else if (ap_strstr_c(if_nonematch, etag)) { + return HTTP_NOT_MODIFIED; + } + } + } + else if (if_nonematch[0] == '*' + || (etag != NULL + && ap_find_list_item(r->pool, if_nonematch, etag))) { + return HTTP_PRECONDITION_FAILED; + } + } + /* Else if a valid If-Modified-Since request-header field was given + * AND it is a GET or HEAD request + * AND the requested resource has not been modified since the time + * specified in this field, then the server MUST + * respond with a status of 304 (Not Modified). + * A date later than the server's current request time is invalid. + */ + else if ((r->method_number == M_GET) + && ((if_modified_since = + apr_table_get(r->headers_in, + "If-Modified-Since")) != NULL)) { + apr_time_t ims_time; + apr_int64_t ims, reqtime; + + ims_time = apr_date_parse_http(if_modified_since); + ims = apr_time_sec(ims_time); + reqtime = apr_time_sec(r->request_time); + + if ((ims >= mtime) && (ims <= reqtime)) { + return HTTP_NOT_MODIFIED; + } + } + return OK; +} + +/** + * Singleton registry of additional methods. This maps new method names + * such as "MYGET" to methnums, which are int offsets into bitmasks. + * + * This follows the same technique as standard M_GET, M_POST, etc. These + * are dynamically assigned when modules are loaded and + * directives are processed. + */ +static apr_hash_t *methods_registry = NULL; +static int cur_method_number = METHOD_NUMBER_FIRST; + +/* internal function to register one method/number pair */ +static void register_one_method(apr_pool_t *p, const char *methname, + int methnum) +{ + int *pnum = apr_palloc(p, sizeof(*pnum)); + + *pnum = methnum; + apr_hash_set(methods_registry, methname, APR_HASH_KEY_STRING, pnum); +} + +/* This internal function is used to clear the method registry + * and reset the cur_method_number counter. + */ +static apr_status_t ap_method_registry_destroy(void *notused) +{ + methods_registry = NULL; + cur_method_number = METHOD_NUMBER_FIRST; + return APR_SUCCESS; +} + +AP_DECLARE(void) ap_method_registry_init(apr_pool_t *p) +{ + methods_registry = apr_hash_make(p); + apr_pool_cleanup_register(p, NULL, + ap_method_registry_destroy, + apr_pool_cleanup_null); + + /* put all the standard methods into the registry hash to ease the + mapping operations between name and number */ + register_one_method(p, "GET", M_GET); + register_one_method(p, "PUT", M_PUT); + register_one_method(p, "POST", M_POST); + register_one_method(p, "DELETE", M_DELETE); + register_one_method(p, "CONNECT", M_CONNECT); + register_one_method(p, "OPTIONS", M_OPTIONS); + register_one_method(p, "TRACE", M_TRACE); + register_one_method(p, "PATCH", M_PATCH); + register_one_method(p, "PROPFIND", M_PROPFIND); + register_one_method(p, "PROPPATCH", M_PROPPATCH); + register_one_method(p, "MKCOL", M_MKCOL); + register_one_method(p, "COPY", M_COPY); + register_one_method(p, "MOVE", M_MOVE); + register_one_method(p, "LOCK", M_LOCK); + register_one_method(p, "UNLOCK", M_UNLOCK); + register_one_method(p, "VERSION-CONTROL", M_VERSION_CONTROL); + register_one_method(p, "CHECKOUT", M_CHECKOUT); + register_one_method(p, "UNCHECKOUT", M_UNCHECKOUT); + register_one_method(p, "CHECKIN", M_CHECKIN); + register_one_method(p, "UPDATE", M_UPDATE); + register_one_method(p, "LABEL", M_LABEL); + register_one_method(p, "REPORT", M_REPORT); + register_one_method(p, "MKWORKSPACE", M_MKWORKSPACE); + register_one_method(p, "MKACTIVITY", M_MKACTIVITY); + register_one_method(p, "BASELINE-CONTROL", M_BASELINE_CONTROL); + register_one_method(p, "MERGE", M_MERGE); +} + +AP_DECLARE(int) ap_method_register(apr_pool_t *p, const char *methname) +{ + int *methnum; + + if (methods_registry == NULL) { + ap_method_registry_init(p); + } + + if (methname == NULL) { + return M_INVALID; + } + + /* Check if the method was previously registered. If it was + * return the associated method number. + */ + methnum = (int *)apr_hash_get(methods_registry, methname, + APR_HASH_KEY_STRING); + if (methnum != NULL) + return *methnum; + + if (cur_method_number > METHOD_NUMBER_LAST) { + /* The method registry has run out of dynamically + * assignable method numbers. Log this and return M_INVALID. + */ + ap_log_perror(APLOG_MARK, APLOG_ERR, 0, p, + "Maximum new request methods %d reached while " + "registering method %s.", + METHOD_NUMBER_LAST, methname); + return M_INVALID; + } + + register_one_method(p, methname, cur_method_number); + return cur_method_number++; +} + +#define UNKNOWN_METHOD (-1) + +static int lookup_builtin_method(const char *method, apr_size_t len) +{ + /* Note: the following code was generated by the "shilka" tool from + the "cocom" parsing/compilation toolkit. It is an optimized lookup + based on analysis of the input keywords. Postprocessing was done + on the shilka output, but the basic structure and analysis is + from there. Should new HTTP methods be added, then manual insertion + into this code is fine, or simply re-running the shilka tool on + the appropriate input. */ + + /* Note: it is also quite reasonable to just use our method_registry, + but I'm assuming (probably incorrectly) we want more speed here + (based on the optimizations the previous code was doing). */ + + switch (len) + { + case 3: + switch (method[0]) + { + case 'P': + return (method[1] == 'U' + && method[2] == 'T' + ? M_PUT : UNKNOWN_METHOD); + case 'G': + return (method[1] == 'E' + && method[2] == 'T' + ? M_GET : UNKNOWN_METHOD); + default: + return UNKNOWN_METHOD; + } + + case 4: + switch (method[0]) + { + case 'H': + return (method[1] == 'E' + && method[2] == 'A' + && method[3] == 'D' + ? M_GET : UNKNOWN_METHOD); + case 'P': + return (method[1] == 'O' + && method[2] == 'S' + && method[3] == 'T' + ? M_POST : UNKNOWN_METHOD); + case 'M': + return (method[1] == 'O' + && method[2] == 'V' + && method[3] == 'E' + ? M_MOVE : UNKNOWN_METHOD); + case 'L': + return (method[1] == 'O' + && method[2] == 'C' + && method[3] == 'K' + ? M_LOCK : UNKNOWN_METHOD); + case 'C': + return (method[1] == 'O' + && method[2] == 'P' + && method[3] == 'Y' + ? M_COPY : UNKNOWN_METHOD); + default: + return UNKNOWN_METHOD; + } + + case 5: + switch (method[2]) + { + case 'T': + return (memcmp(method, "PATCH", 5) == 0 + ? M_PATCH : UNKNOWN_METHOD); + case 'R': + return (memcmp(method, "MERGE", 5) == 0 + ? M_MERGE : UNKNOWN_METHOD); + case 'C': + return (memcmp(method, "MKCOL", 5) == 0 + ? M_MKCOL : UNKNOWN_METHOD); + case 'B': + return (memcmp(method, "LABEL", 5) == 0 + ? M_LABEL : UNKNOWN_METHOD); + case 'A': + return (memcmp(method, "TRACE", 5) == 0 + ? M_TRACE : UNKNOWN_METHOD); + default: + return UNKNOWN_METHOD; + } + + case 6: + switch (method[0]) + { + case 'U': + switch (method[5]) + { + case 'K': + return (memcmp(method, "UNLOCK", 6) == 0 + ? M_UNLOCK : UNKNOWN_METHOD); + case 'E': + return (memcmp(method, "UPDATE", 6) == 0 + ? M_UPDATE : UNKNOWN_METHOD); + default: + return UNKNOWN_METHOD; + } + case 'R': + return (memcmp(method, "REPORT", 6) == 0 + ? M_REPORT : UNKNOWN_METHOD); + case 'D': + return (memcmp(method, "DELETE", 6) == 0 + ? M_DELETE : UNKNOWN_METHOD); + default: + return UNKNOWN_METHOD; + } + + case 7: + switch (method[1]) + { + case 'P': + return (memcmp(method, "OPTIONS", 7) == 0 + ? M_OPTIONS : UNKNOWN_METHOD); + case 'O': + return (memcmp(method, "CONNECT", 7) == 0 + ? M_CONNECT : UNKNOWN_METHOD); + case 'H': + return (memcmp(method, "CHECKIN", 7) == 0 + ? M_CHECKIN : UNKNOWN_METHOD); + default: + return UNKNOWN_METHOD; + } + + case 8: + switch (method[0]) + { + case 'P': + return (memcmp(method, "PROPFIND", 8) == 0 + ? M_PROPFIND : UNKNOWN_METHOD); + case 'C': + return (memcmp(method, "CHECKOUT", 8) == 0 + ? M_CHECKOUT : UNKNOWN_METHOD); + default: + return UNKNOWN_METHOD; + } + + case 9: + return (memcmp(method, "PROPPATCH", 9) == 0 + ? M_PROPPATCH : UNKNOWN_METHOD); + + case 10: + switch (method[0]) + { + case 'U': + return (memcmp(method, "UNCHECKOUT", 10) == 0 + ? M_UNCHECKOUT : UNKNOWN_METHOD); + case 'M': + return (memcmp(method, "MKACTIVITY", 10) == 0 + ? M_MKACTIVITY : UNKNOWN_METHOD); + default: + return UNKNOWN_METHOD; + } + + case 11: + return (memcmp(method, "MKWORKSPACE", 11) == 0 + ? M_MKWORKSPACE : UNKNOWN_METHOD); + + case 15: + return (memcmp(method, "VERSION-CONTROL", 15) == 0 + ? M_VERSION_CONTROL : UNKNOWN_METHOD); + + case 16: + return (memcmp(method, "BASELINE-CONTROL", 16) == 0 + ? M_BASELINE_CONTROL : UNKNOWN_METHOD); + + default: + return UNKNOWN_METHOD; + } + + /* NOTREACHED */ +} + +/* Get the method number associated with the given string, assumed to + * contain an HTTP method. Returns M_INVALID if not recognized. + * + * This is the first step toward placing method names in a configurable + * list. Hopefully it (and other routines) can eventually be moved to + * something like a mod_http_methods.c, complete with config stuff. + */ +AP_DECLARE(int) ap_method_number_of(const char *method) +{ + int len = strlen(method); + int which = lookup_builtin_method(method, len); + + if (which != UNKNOWN_METHOD) + return which; + + /* check if the method has been dynamically registered */ + if (methods_registry != NULL) { + int *methnum = apr_hash_get(methods_registry, method, len); + + if (methnum != NULL) { + return *methnum; + } + } + + return M_INVALID; +} + +/* + * Turn a known method number into a name. + */ +AP_DECLARE(const char *) ap_method_name_of(apr_pool_t *p, int methnum) +{ + apr_hash_index_t *hi = apr_hash_first(p, methods_registry); + + /* scan through the hash table, looking for a value that matches + the provided method number. */ + for (; hi; hi = apr_hash_next(hi)) { + const void *key; + void *val; + + apr_hash_this(hi, &key, NULL, &val); + if (*(int *)val == methnum) + return key; + } + + /* it wasn't found in the hash */ + return NULL; +} + +static long get_chunk_size(char *); + +typedef struct http_filter_ctx { + apr_off_t remaining; + apr_off_t limit; + apr_off_t limit_used; + enum { + BODY_NONE, + BODY_LENGTH, + BODY_CHUNK + } state; + int eos_sent; +} http_ctx_t; + +/* This is the HTTP_INPUT filter for HTTP requests and responses from + * proxied servers (mod_proxy). It handles chunked and content-length + * bodies. This can only be inserted/used after the headers + * are successfully parsed. + */ +apr_status_t ap_http_filter(ap_filter_t *f, apr_bucket_brigade *b, + ap_input_mode_t mode, apr_read_type_e block, + apr_off_t readbytes) +{ + apr_bucket *e; + http_ctx_t *ctx = f->ctx; + apr_status_t rv; + apr_off_t totalread; + + /* just get out of the way of things we don't want. */ + if (mode != AP_MODE_READBYTES && mode != AP_MODE_GETLINE) { + return ap_get_brigade(f->next, b, mode, block, readbytes); + } + + if (!ctx) { + const char *tenc, *lenp; + f->ctx = ctx = apr_palloc(f->r->pool, sizeof(*ctx)); + ctx->state = BODY_NONE; + ctx->remaining = 0; + ctx->limit_used = 0; + ctx->eos_sent = 0; + + /* LimitRequestBody does not apply to proxied responses. + * Consider implementing this check in its own filter. + * Would adding a directive to limit the size of proxied + * responses be useful? + */ + if (!f->r->proxyreq) { + ctx->limit = ap_get_limit_req_body(f->r); + } + else { + ctx->limit = 0; + } + + tenc = apr_table_get(f->r->headers_in, "Transfer-Encoding"); + lenp = apr_table_get(f->r->headers_in, "Content-Length"); + + if (tenc) { + if (!strcasecmp(tenc, "chunked")) { + ctx->state = BODY_CHUNK; + } + } + else if (lenp) { + int conversion_error = 0; + char *endstr; + + ctx->state = BODY_LENGTH; + errno = 0; + ctx->remaining = strtol(lenp, &endstr, 10); /* we depend on ANSI */ + + /* This protects us from over/underflow (the errno check), + * non-digit chars in the string (excluding leading space) + * (the endstr checks) and a negative number. Depending + * on the strtol implementation, the errno check may also + * trigger on an all whitespace string */ + if (errno || (endstr && *endstr) || (ctx->remaining < 0)) { + conversion_error = 1; + } + + if (conversion_error) { + apr_bucket_brigade *bb; + + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, f->r, + "Invalid Content-Length"); + + bb = apr_brigade_create(f->r->pool, f->c->bucket_alloc); + e = ap_bucket_error_create(HTTP_REQUEST_ENTITY_TOO_LARGE, NULL, + f->r->pool, f->c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, e); + e = apr_bucket_eos_create(f->c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, e); + ctx->eos_sent = 1; + return ap_pass_brigade(f->r->output_filters, bb); + } + + /* If we have a limit in effect and we know the C-L ahead of + * time, stop it here if it is invalid. + */ + if (ctx->limit && ctx->limit < ctx->remaining) { + apr_bucket_brigade *bb; + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, f->r, + "Requested content-length of %" APR_OFF_T_FMT + " is larger than the configured limit" + " of %" APR_OFF_T_FMT, ctx->remaining, ctx->limit); + bb = apr_brigade_create(f->r->pool, f->c->bucket_alloc); + e = ap_bucket_error_create(HTTP_REQUEST_ENTITY_TOO_LARGE, NULL, + f->r->pool, f->c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, e); + e = apr_bucket_eos_create(f->c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, e); + ctx->eos_sent = 1; + return ap_pass_brigade(f->r->output_filters, bb); + } + } + + /* If we don't have a request entity indicated by the headers, EOS. + * (BODY_NONE is a valid intermediate state due to trailers, + * but it isn't a valid starting state.) + * + * RFC 2616 Section 4.4 note 5 states that connection-close + * is invalid for a request entity - request bodies must be + * denoted by C-L or T-E: chunked. + * + * Note that since the proxy uses this filter to handle the + * proxied *response*, proxy responses MUST be exempt. + */ + if (ctx->state == BODY_NONE && f->r->proxyreq != PROXYREQ_RESPONSE) { + e = apr_bucket_eos_create(f->c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(b, e); + ctx->eos_sent = 1; + return APR_SUCCESS; + } + + /* Since we're about to read data, send 100-Continue if needed. + * Only valid on chunked and C-L bodies where the C-L is > 0. */ + if ((ctx->state == BODY_CHUNK || + (ctx->state == BODY_LENGTH && ctx->remaining > 0)) && + f->r->expecting_100 && f->r->proto_num >= HTTP_VERSION(1,1)) { + char *tmp; + apr_bucket_brigade *bb; + + tmp = apr_pstrcat(f->r->pool, AP_SERVER_PROTOCOL, " ", + status_lines[0], CRLF CRLF, NULL); + bb = apr_brigade_create(f->r->pool, f->c->bucket_alloc); + e = apr_bucket_pool_create(tmp, strlen(tmp), f->r->pool, + f->c->bucket_alloc); + APR_BRIGADE_INSERT_HEAD(bb, e); + e = apr_bucket_flush_create(f->c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, e); + + ap_pass_brigade(f->c->output_filters, bb); + } + + /* We can't read the chunk until after sending 100 if required. */ + if (ctx->state == BODY_CHUNK) { + char line[30]; + apr_bucket_brigade *bb; + apr_size_t len = 30; + + bb = apr_brigade_create(f->r->pool, f->c->bucket_alloc); + + rv = ap_get_brigade(f->next, bb, AP_MODE_GETLINE, + APR_BLOCK_READ, 0); + + if (rv == APR_SUCCESS) { + rv = apr_brigade_flatten(bb, line, &len); + if (rv == APR_SUCCESS) { + ctx->remaining = get_chunk_size(line); + } + } + apr_brigade_cleanup(bb); + + /* Detect chunksize error (such as overflow) */ + if (rv != APR_SUCCESS || ctx->remaining < 0) { + ctx->remaining = 0; /* Reset it in case we have to + * come back here later */ + e = ap_bucket_error_create(HTTP_REQUEST_ENTITY_TOO_LARGE, NULL, + f->r->pool, + f->c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, e); + e = apr_bucket_eos_create(f->c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, e); + ctx->eos_sent = 1; + return ap_pass_brigade(f->r->output_filters, bb); + } + + if (!ctx->remaining) { + /* Handle trailers by calling ap_get_mime_headers again! */ + ctx->state = BODY_NONE; + ap_get_mime_headers(f->r); + e = apr_bucket_eos_create(f->c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(b, e); + ctx->eos_sent = 1; + return APR_SUCCESS; + } + } + } + + if (ctx->eos_sent) { + e = apr_bucket_eos_create(f->c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(b, e); + return APR_SUCCESS; + } + + if (!ctx->remaining) { + switch (ctx->state) { + case BODY_NONE: + break; + case BODY_LENGTH: + e = apr_bucket_eos_create(f->c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(b, e); + ctx->eos_sent = 1; + return APR_SUCCESS; + case BODY_CHUNK: + { + char line[30]; + apr_bucket_brigade *bb; + apr_size_t len = 30; + + bb = apr_brigade_create(f->r->pool, f->c->bucket_alloc); + + /* We need to read the CRLF after the chunk. */ + rv = ap_get_brigade(f->next, bb, AP_MODE_GETLINE, + APR_BLOCK_READ, 0); + apr_brigade_cleanup(bb); + + if (rv == APR_SUCCESS) { + /* Read the real chunk line. */ + rv = ap_get_brigade(f->next, bb, AP_MODE_GETLINE, + APR_BLOCK_READ, 0); + if (rv == APR_SUCCESS) { + rv = apr_brigade_flatten(bb, line, &len); + if (rv == APR_SUCCESS) { + ctx->remaining = get_chunk_size(line); + } + } + apr_brigade_cleanup(bb); + } + + /* Detect chunksize error (such as overflow) */ + if (rv != APR_SUCCESS || ctx->remaining < 0) { + ctx->remaining = 0; /* Reset it in case we have to + * come back here later */ + e = ap_bucket_error_create(HTTP_REQUEST_ENTITY_TOO_LARGE, + NULL, f->r->pool, + f->c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, e); + e = apr_bucket_eos_create(f->c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, e); + ctx->eos_sent = 1; + return ap_pass_brigade(f->r->output_filters, bb); + } + + if (!ctx->remaining) { + /* Handle trailers by calling ap_get_mime_headers again! */ + ctx->state = BODY_NONE; + ap_get_mime_headers(f->r); + e = apr_bucket_eos_create(f->c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(b, e); + ctx->eos_sent = 1; + return APR_SUCCESS; + } + } + break; + } + } + + /* Ensure that the caller can not go over our boundary point. */ + if (ctx->state == BODY_LENGTH || ctx->state == BODY_CHUNK) { + if (ctx->remaining < readbytes) { + readbytes = ctx->remaining; + } + AP_DEBUG_ASSERT(readbytes > 0); + } + + rv = ap_get_brigade(f->next, b, mode, block, readbytes); + + if (rv != APR_SUCCESS) { + return rv; + } + + /* How many bytes did we just read? */ + apr_brigade_length(b, 0, &totalread); + + /* If this happens, we have a bucket of unknown length. Die because + * it means our assumptions have changed. */ + AP_DEBUG_ASSERT(totalread >= 0); + + if (ctx->state != BODY_NONE) { + ctx->remaining -= totalread; + } + + /* If we have no more bytes remaining on a C-L request, + * save the callter a roundtrip to discover EOS. + */ + if (ctx->state == BODY_LENGTH && ctx->remaining == 0) { + e = apr_bucket_eos_create(f->c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(b, e); + } + + /* We have a limit in effect. */ + if (ctx->limit) { + /* FIXME: Note that we might get slightly confused on chunked inputs + * as we'd need to compensate for the chunk lengths which may not + * really count. This seems to be up for interpretation. */ + ctx->limit_used += totalread; + if (ctx->limit < ctx->limit_used) { + apr_bucket_brigade *bb; + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, f->r, + "Read content-length of %" APR_OFF_T_FMT + " is larger than the configured limit" + " of %" APR_OFF_T_FMT, ctx->limit_used, ctx->limit); + bb = apr_brigade_create(f->r->pool, f->c->bucket_alloc); + e = ap_bucket_error_create(HTTP_REQUEST_ENTITY_TOO_LARGE, NULL, + f->r->pool, + f->c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, e); + e = apr_bucket_eos_create(f->c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, e); + ctx->eos_sent = 1; + return ap_pass_brigade(f->r->output_filters, bb); + } + } + + return APR_SUCCESS; +} + +/* The index is found by its offset from the x00 code of each level. + * Although this is fast, it will need to be replaced if some nutcase + * decides to define a high-numbered code before the lower numbers. + * If that sad event occurs, replace the code below with a linear search + * from status_lines[shortcut[i]] to status_lines[shortcut[i+1]-1]; + */ +AP_DECLARE(int) ap_index_of_response(int status) +{ + static int shortcut[6] = {0, LEVEL_200, LEVEL_300, LEVEL_400, + LEVEL_500, RESPONSE_CODES}; + int i, pos; + + if (status < 100) { /* Below 100 is illegal for HTTP status */ + return LEVEL_500; + } + + for (i = 0; i < 5; i++) { + status -= 100; + if (status < 100) { + pos = (status + shortcut[i]); + if (pos < shortcut[i + 1]) { + return pos; + } + else { + return LEVEL_500; /* status unknown (falls in gap) */ + } + } + } + return LEVEL_500; /* 600 or above is also illegal */ +} + +AP_DECLARE(const char *) ap_get_status_line(int status) +{ + return status_lines[ap_index_of_response(status)]; +} + +typedef struct header_struct { + apr_pool_t *pool; + apr_bucket_brigade *bb; +} header_struct; + +/* Send a single HTTP header field to the client. Note that this function + * is used in calls to table_do(), so their interfaces are co-dependent. + * In other words, don't change this one without checking table_do in alloc.c. + * It returns true unless there was a write error of some kind. + */ +static int form_header_field(header_struct *h, + const char *fieldname, const char *fieldval) +{ +#if APR_CHARSET_EBCDIC + char *headfield; + apr_size_t len; + apr_size_t name_len; + apr_size_t val_len; + char *next; + + name_len = strlen(fieldname); + val_len = strlen(fieldval); + len = name_len + val_len + 4; /* 4 for ": " plus CRLF */ + headfield = (char *)apr_palloc(h->pool, len + 1); + memcpy(headfield, fieldname, name_len); + next = headfield + name_len; + *next++ = ':'; + *next++ = ' '; + memcpy(next, fieldval, val_len); + next += val_len; + *next++ = CR; + *next++ = LF; + *next = 0; + ap_xlate_proto_to_ascii(headfield, len); + apr_brigade_write(h->bb, NULL, NULL, headfield, len); +#else + struct iovec vec[4]; + struct iovec *v = vec; + v->iov_base = (void *)fieldname; + v->iov_len = strlen(fieldname); + v++; + v->iov_base = ": "; + v->iov_len = sizeof(": ") - 1; + v++; + v->iov_base = (void *)fieldval; + v->iov_len = strlen(fieldval); + v++; + v->iov_base = CRLF; + v->iov_len = sizeof(CRLF) - 1; + apr_brigade_writev(h->bb, NULL, NULL, vec, 4); +#endif /* !APR_CHARSET_EBCDIC */ + return 1; +} + +/* Send a request's HTTP response headers to the client. + */ +static apr_status_t send_all_header_fields(header_struct *h, + const request_rec *r) +{ + const apr_array_header_t *elts; + const apr_table_entry_t *t_elt; + const apr_table_entry_t *t_end; + struct iovec *vec; + struct iovec *vec_next; + + elts = apr_table_elts(r->headers_out); + if (elts->nelts == 0) { + return APR_SUCCESS; + } + t_elt = (const apr_table_entry_t *)(elts->elts); + t_end = t_elt + elts->nelts; + vec = (struct iovec *)apr_palloc(h->pool, 4 * elts->nelts * + sizeof(struct iovec)); + vec_next = vec; + + /* For each field, generate + * name ": " value CRLF + */ + do { + vec_next->iov_base = (void*)(t_elt->key); + vec_next->iov_len = strlen(t_elt->key); + vec_next++; + vec_next->iov_base = ": "; + vec_next->iov_len = sizeof(": ") - 1; + vec_next++; + vec_next->iov_base = (void*)(t_elt->val); + vec_next->iov_len = strlen(t_elt->val); + vec_next++; + vec_next->iov_base = CRLF; + vec_next->iov_len = sizeof(CRLF) - 1; + vec_next++; + t_elt++; + } while (t_elt < t_end); + +#if APR_CHARSET_EBCDIC + { + apr_size_t len; + char *tmp = apr_pstrcatv(r->pool, vec, vec_next - vec, &len); + ap_xlate_proto_to_ascii(tmp, len); + return apr_brigade_write(h->bb, NULL, NULL, tmp, len); + } +#else + return apr_brigade_writev(h->bb, NULL, NULL, vec, vec_next - vec); +#endif +} + +/* Confirm that the status line is well-formed and matches r->status. + * Otherwise, a filter may have negated the status line set by a + * handler. + * Zap r->status_line if bad. + */ +static void validate_status_line(request_rec *r) +{ + char *end; + + if (r->status_line + && (strlen(r->status_line) <= 4 + || apr_strtoi64(r->status_line, &end, 10) != r->status + || *end != ' ' + || (end - 3) != r->status_line)) { + r->status_line = NULL; + } +} + +/* + * Determine the protocol to use for the response. Potentially downgrade + * to HTTP/1.0 in some situations and/or turn off keepalives. + * + * also prepare r->status_line. + */ +static void basic_http_header_check(request_rec *r, + const char **protocol) +{ + if (r->assbackwards) { + /* no such thing as a response protocol */ + return; + } + + validate_status_line(r); + + if (!r->status_line) { + r->status_line = status_lines[ap_index_of_response(r->status)]; + } + + /* Note that we must downgrade before checking for force responses. */ + if (r->proto_num > HTTP_VERSION(1,0) + && apr_table_get(r->subprocess_env, "downgrade-1.0")) { + r->proto_num = HTTP_VERSION(1,0); + } + + /* kludge around broken browsers when indicated by force-response-1.0 + */ + if (r->proto_num == HTTP_VERSION(1,0) + && apr_table_get(r->subprocess_env, "force-response-1.0")) { + *protocol = "HTTP/1.0"; + r->connection->keepalive = AP_CONN_CLOSE; + } + else { + *protocol = AP_SERVER_PROTOCOL; + } + +} + +/* fill "bb" with a barebones/initial HTTP response header */ +static void basic_http_header(request_rec *r, apr_bucket_brigade *bb, + const char *protocol) +{ + char *date; + const char *server; + header_struct h; + struct iovec vec[4]; + + if (r->assbackwards) { + /* there are no headers to send */ + return; + } + + /* Output the HTTP/1.x Status-Line and the Date and Server fields */ + + vec[0].iov_base = (void *)protocol; + vec[0].iov_len = strlen(protocol); + vec[1].iov_base = (void *)" "; + vec[1].iov_len = sizeof(" ") - 1; + vec[2].iov_base = (void *)(r->status_line); + vec[2].iov_len = strlen(r->status_line); + vec[3].iov_base = (void *)CRLF; + vec[3].iov_len = sizeof(CRLF) - 1; +#if APR_CHARSET_EBCDIC + { + char *tmp; + apr_size_t len; + tmp = apr_pstrcatv(r->pool, vec, 4, &len); + ap_xlate_proto_to_ascii(tmp, len); + apr_brigade_write(bb, NULL, NULL, tmp, len); + } +#else + apr_brigade_writev(bb, NULL, NULL, vec, 4); +#endif + + date = apr_palloc(r->pool, APR_RFC822_DATE_LEN); + ap_recent_rfc822_date(date, r->request_time); + + h.pool = r->pool; + h.bb = bb; + form_header_field(&h, "Date", date); + + /* keep the set-by-proxy server header, otherwise + * generate a new server header */ + if (r->proxyreq != PROXYREQ_NONE) { + server = apr_table_get(r->headers_out, "Server"); + if (server) { + form_header_field(&h, "Server", server); + } + } + else { + form_header_field(&h, "Server", ap_get_server_version()); + } + + /* unset so we don't send them again */ + apr_table_unset(r->headers_out, "Date"); /* Avoid bogosity */ + apr_table_unset(r->headers_out, "Server"); +} + +AP_DECLARE(void) ap_basic_http_header(request_rec *r, apr_bucket_brigade *bb) +{ + const char *protocol; + + basic_http_header_check(r, &protocol); + basic_http_header(r, bb, protocol); +} + +/* Navigator versions 2.x, 3.x and 4.0 betas up to and including 4.0b2 + * have a header parsing bug. If the terminating \r\n occur starting + * at offset 256, 257 or 258 of output then it will not properly parse + * the headers. Curiously it doesn't exhibit this problem at 512, 513. + * We are guessing that this is because their initial read of a new request + * uses a 256 byte buffer, and subsequent reads use a larger buffer. + * So the problem might exist at different offsets as well. + * + * This should also work on keepalive connections assuming they use the + * same small buffer for the first read of each new request. + * + * At any rate, we check the bytes written so far and, if we are about to + * tickle the bug, we instead insert a bogus padding header. Since the bug + * manifests as a broken image in Navigator, users blame the server. :( + * It is more expensive to check the User-Agent than it is to just add the + * bytes, so we haven't used the BrowserMatch feature here. + */ +static void terminate_header(apr_bucket_brigade *bb) +{ + char tmp[] = "X-Pad: avoid browser bug" CRLF; + char crlf[] = CRLF; + apr_off_t len; + apr_size_t buflen; + + (void) apr_brigade_length(bb, 1, &len); + + if (len >= 255 && len <= 257) { + buflen = strlen(tmp); + ap_xlate_proto_to_ascii(tmp, buflen); + apr_brigade_write(bb, NULL, NULL, tmp, buflen); + } + buflen = strlen(crlf); + ap_xlate_proto_to_ascii(crlf, buflen); + apr_brigade_write(bb, NULL, NULL, crlf, buflen); +} + +/* Build the Allow field-value from the request handler method mask. + * Note that we always allow TRACE, since it is handled below. + */ +static char *make_allow(request_rec *r) +{ + char *list; + apr_int64_t mask; + apr_array_header_t *allow = apr_array_make(r->pool, 10, sizeof(char *)); + apr_hash_index_t *hi = apr_hash_first(r->pool, methods_registry); + /* For TRACE below */ + core_server_config *conf = + ap_get_module_config(r->server->module_config, &core_module); + + mask = r->allowed_methods->method_mask; + + for (; hi; hi = apr_hash_next(hi)) { + const void *key; + void *val; + + apr_hash_this(hi, &key, NULL, &val); + if ((mask & (AP_METHOD_BIT << *(int *)val)) != 0) { + *(const char **)apr_array_push(allow) = key; + + /* the M_GET method actually refers to two methods */ + if (*(int *)val == M_GET) + *(const char **)apr_array_push(allow) = "HEAD"; + } + } + + /* TRACE is tested on a per-server basis */ + if (conf->trace_enable != AP_TRACE_DISABLE) + *(const char **)apr_array_push(allow) = "TRACE"; + + list = apr_array_pstrcat(r->pool, allow, ','); + + /* ### this is rather annoying. we should enforce registration of + ### these methods */ + if ((mask & (AP_METHOD_BIT << M_INVALID)) + && (r->allowed_methods->method_list != NULL) + && (r->allowed_methods->method_list->nelts != 0)) { + int i; + char **xmethod = (char **) r->allowed_methods->method_list->elts; + + /* + * Append all of the elements of r->allowed_methods->method_list + */ + for (i = 0; i < r->allowed_methods->method_list->nelts; ++i) { + list = apr_pstrcat(r->pool, list, ",", xmethod[i], NULL); + } + } + + return list; +} + +AP_DECLARE_NONSTD(int) ap_send_http_trace(request_rec *r) +{ + core_server_config *conf; + int rv; + apr_bucket_brigade *bb; + header_struct h; + apr_bucket *b; + int body; + char *bodyread = NULL, *bodyoff; + apr_size_t bodylen = 0; + apr_size_t bodybuf; + long res; + + if (r->method_number != M_TRACE) { + return DECLINED; + } + + /* Get the original request */ + while (r->prev) { + r = r->prev; + } + conf = (core_server_config *)ap_get_module_config(r->server->module_config, + &core_module); + + if (conf->trace_enable == AP_TRACE_DISABLE) { + apr_table_setn(r->notes, "error-notes", + "TRACE denied by server configuration"); + return HTTP_FORBIDDEN; + } + + if (conf->trace_enable == AP_TRACE_EXTENDED) + /* XX should be = REQUEST_CHUNKED_PASS */ + body = REQUEST_CHUNKED_DECHUNK; + else + body = REQUEST_NO_BODY; + + if ((rv = ap_setup_client_block(r, body))) { + if (rv == HTTP_REQUEST_ENTITY_TOO_LARGE) + apr_table_setn(r->notes, "error-notes", + "TRACE with a request body is not allowed"); + return rv; + } + + if (ap_should_client_block(r)) { + + if (r->remaining > 0) { + if (r->remaining > 65536) { + apr_table_setn(r->notes, "error-notes", + "Extended TRACE request bodies cannot exceed 64k"); + return HTTP_REQUEST_ENTITY_TOO_LARGE; + } + /* always 32 extra bytes to catch chunk header exceptions */ + bodybuf = (apr_size_t)r->remaining + 32; + } + else { + /* Add an extra 8192 for chunk headers */ + bodybuf = 73730; + } + + bodyoff = bodyread = apr_palloc(r->pool, bodybuf); + + /* only while we have enough for a chunked header */ + while ((!bodylen || bodybuf >= 32) && + (res = ap_get_client_block(r, bodyoff, bodybuf)) > 0) { + bodylen += res; + bodybuf -= res; + bodyoff += res; + } + if (res > 0 && bodybuf < 32) { + /* discard_rest_of_request_body into our buffer */ + while (ap_get_client_block(r, bodyread, bodylen) > 0) + ; + apr_table_setn(r->notes, "error-notes", + "Extended TRACE request bodies cannot exceed 64k"); + return HTTP_REQUEST_ENTITY_TOO_LARGE; + } + + if (res < 0) { + return HTTP_BAD_REQUEST; + } + } + + ap_set_content_type(r, "message/http"); + + /* Now we recreate the request, and echo it back */ + + bb = apr_brigade_create(r->pool, r->connection->bucket_alloc); + apr_brigade_putstrs(bb, NULL, NULL, r->the_request, CRLF, NULL); + h.pool = r->pool; + h.bb = bb; + apr_table_do((int (*) (void *, const char *, const char *)) + form_header_field, (void *) &h, r->headers_in, NULL); + apr_brigade_puts(bb, NULL, NULL, CRLF); + + /* If configured to accept a body, echo the body */ + if (bodylen) { + b = apr_bucket_pool_create(bodyread, bodylen, + r->pool, bb->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, b); + } + + ap_pass_brigade(r->output_filters, bb); + + return DONE; +} + +AP_DECLARE(int) ap_send_http_options(request_rec *r) +{ + if (r->assbackwards) { + return DECLINED; + } + + apr_table_setn(r->headers_out, "Allow", make_allow(r)); + + /* the request finalization will send an EOS, which will flush all + * the headers out (including the Allow header) + */ + + return OK; +} + +/* This routine is called by apr_table_do and merges all instances of + * the passed field values into a single array that will be further + * processed by some later routine. Originally intended to help split + * and recombine multiple Vary fields, though it is generic to any field + * consisting of comma/space-separated tokens. + */ +static int uniq_field_values(void *d, const char *key, const char *val) +{ + apr_array_header_t *values; + char *start; + char *e; + char **strpp; + int i; + + values = (apr_array_header_t *)d; + + e = apr_pstrdup(values->pool, val); + + do { + /* Find a non-empty fieldname */ + + while (*e == ',' || apr_isspace(*e)) { + ++e; + } + if (*e == '\0') { + break; + } + start = e; + while (*e != '\0' && *e != ',' && !apr_isspace(*e)) { + ++e; + } + if (*e != '\0') { + *e++ = '\0'; + } + + /* Now add it to values if it isn't already represented. + * Could be replaced by a ap_array_strcasecmp() if we had one. + */ + for (i = 0, strpp = (char **) values->elts; i < values->nelts; + ++i, ++strpp) { + if (*strpp && strcasecmp(*strpp, start) == 0) { + break; + } + } + if (i == values->nelts) { /* if not found */ + *(char **)apr_array_push(values) = start; + } + } while (*e != '\0'); + + return 1; +} + +/* + * Since some clients choke violently on multiple Vary fields, or + * Vary fields with duplicate tokens, combine any multiples and remove + * any duplicates. + */ +static void fixup_vary(request_rec *r) +{ + apr_array_header_t *varies; + + varies = apr_array_make(r->pool, 5, sizeof(char *)); + + /* Extract all Vary fields from the headers_out, separate each into + * its comma-separated fieldname values, and then add them to varies + * if not already present in the array. + */ + apr_table_do((int (*)(void *, const char *, const char *))uniq_field_values, + (void *) varies, r->headers_out, "Vary", NULL); + + /* If we found any, replace old Vary fields with unique-ified value */ + + if (varies->nelts > 0) { + apr_table_setn(r->headers_out, "Vary", + apr_array_pstrcat(r->pool, varies, ',')); + } +} + +AP_DECLARE(void) ap_set_content_type(request_rec *r, const char *ct) +{ + if (!ct) { + r->content_type = NULL; + } + else if (!r->content_type || strcmp(r->content_type, ct)) { + r->content_type = ct; + + /* Insert filters requested by the AddOutputFiltersByType + * configuration directive. Content-type filters must be + * inserted after the content handlers have run because + * only then, do we reliably know the content-type. + */ + ap_add_output_filters_by_type(r); + } +} + +typedef struct header_filter_ctx { + int headers_sent; +} header_filter_ctx; + +AP_CORE_DECLARE_NONSTD(apr_status_t) ap_http_header_filter(ap_filter_t *f, + apr_bucket_brigade *b) +{ + request_rec *r = f->r; + conn_rec *c = r->connection; + const char *clheader; + const char *protocol; + apr_bucket *e; + apr_bucket_brigade *b2; + header_struct h; + header_filter_ctx *ctx = f->ctx; + + AP_DEBUG_ASSERT(!r->main); + + if (r->header_only) { + if (!ctx) { + ctx = f->ctx = apr_pcalloc(r->pool, sizeof(header_filter_ctx)); + } + else if (ctx->headers_sent) { + apr_brigade_destroy(b); + return OK; + } + } + + APR_BRIGADE_FOREACH(e, b) { + if (e->type == &ap_bucket_type_error) { + ap_bucket_error *eb = e->data; + + ap_die(eb->status, r); + return AP_FILTER_ERROR; + } + } + + if (r->assbackwards) { + r->sent_bodyct = 1; + ap_remove_output_filter(f); + return ap_pass_brigade(f->next, b); + } + + /* + * Now that we are ready to send a response, we need to combine the two + * header field tables into a single table. If we don't do this, our + * later attempts to set or unset a given fieldname might be bypassed. + */ + if (!apr_is_empty_table(r->err_headers_out)) { + r->headers_out = apr_table_overlay(r->pool, r->err_headers_out, + r->headers_out); + } + + /* + * Remove the 'Vary' header field if the client can't handle it. + * Since this will have nasty effects on HTTP/1.1 caches, force + * the response into HTTP/1.0 mode. + * + * Note: the force-response-1.0 should come before the call to + * basic_http_header_check() + */ + if (apr_table_get(r->subprocess_env, "force-no-vary") != NULL) { + apr_table_unset(r->headers_out, "Vary"); + r->proto_num = HTTP_VERSION(1,0); + apr_table_set(r->subprocess_env, "force-response-1.0", "1"); + } + else { + fixup_vary(r); + } + + /* + * Now remove any ETag response header field if earlier processing + * says so (such as a 'FileETag None' directive). + */ + if (apr_table_get(r->notes, "no-etag") != NULL) { + apr_table_unset(r->headers_out, "ETag"); + } + + /* determine the protocol and whether we should use keepalives. */ + basic_http_header_check(r, &protocol); + ap_set_keepalive(r); + + if (r->chunked) { + apr_table_mergen(r->headers_out, "Transfer-Encoding", "chunked"); + apr_table_unset(r->headers_out, "Content-Length"); + } + + apr_table_setn(r->headers_out, "Content-Type", + ap_make_content_type(r, r->content_type)); + + if (r->content_encoding) { + apr_table_setn(r->headers_out, "Content-Encoding", + r->content_encoding); + } + + if (!apr_is_empty_array(r->content_languages)) { + int i; + char **languages = (char **)(r->content_languages->elts); + for (i = 0; i < r->content_languages->nelts; ++i) { + apr_table_mergen(r->headers_out, "Content-Language", languages[i]); + } + } + + /* + * Control cachability for non-cachable responses if not already set by + * some other part of the server configuration. + */ + if (r->no_cache && !apr_table_get(r->headers_out, "Expires")) { + char *date = apr_palloc(r->pool, APR_RFC822_DATE_LEN); + ap_recent_rfc822_date(date, r->request_time); + apr_table_addn(r->headers_out, "Expires", date); + } + + /* This is a hack, but I can't find anyway around it. The idea is that + * we don't want to send out 0 Content-Lengths if it is a head request. + * This happens when modules try to outsmart the server, and return + * if they see a HEAD request. Apache 1.3 handlers were supposed to + * just return in that situation, and the core handled the HEAD. In + * 2.0, if a handler returns, then the core sends an EOS bucket down + * the filter stack, and the content-length filter computes a C-L of + * zero and that gets put in the headers, and we end up sending a + * zero C-L to the client. We can't just remove the C-L filter, + * because well behaved 2.0 handlers will send their data down the stack, + * and we will compute a real C-L for the head request. RBB + */ + if (r->header_only + && (clheader = apr_table_get(r->headers_out, "Content-Length")) + && !strcmp(clheader, "0")) { + apr_table_unset(r->headers_out, "Content-Length"); + } + + b2 = apr_brigade_create(r->pool, c->bucket_alloc); + basic_http_header(r, b2, protocol); + + h.pool = r->pool; + h.bb = b2; + + if (r->status == HTTP_NOT_MODIFIED) { + apr_table_do((int (*)(void *, const char *, const char *)) form_header_field, + (void *) &h, r->headers_out, + "Connection", + "Keep-Alive", + "ETag", + "Content-Location", + "Expires", + "Cache-Control", + "Vary", + "Warning", + "WWW-Authenticate", + "Proxy-Authenticate", + "Set-Cookie", + "Set-Cookie2", + NULL); + } + else { + send_all_header_fields(&h, r); + } + + terminate_header(b2); + + ap_pass_brigade(f->next, b2); + + if (r->header_only) { + apr_brigade_destroy(b); + ctx->headers_sent = 1; + return OK; + } + + r->sent_bodyct = 1; /* Whatever follows is real body stuff... */ + + if (r->chunked) { + /* We can't add this filter until we have already sent the headers. + * If we add it before this point, then the headers will be chunked + * as well, and that is just wrong. + */ + ap_add_output_filter("CHUNK", NULL, r, r->connection); + } + + /* Don't remove this filter until after we have added the CHUNK filter. + * Otherwise, f->next won't be the CHUNK filter and thus the first + * brigade won't be chunked properly. + */ + ap_remove_output_filter(f); + return ap_pass_brigade(f->next, b); +} + +/* Here we deal with getting the request message body from the client. + * Whether or not the request contains a body is signaled by the presence + * of a non-zero Content-Length or by a Transfer-Encoding: chunked. + * + * Note that this is more complicated than it was in Apache 1.1 and prior + * versions, because chunked support means that the module does less. + * + * The proper procedure is this: + * + * 1. Call setup_client_block() near the beginning of the request + * handler. This will set up all the necessary properties, and will + * return either OK, or an error code. If the latter, the module should + * return that error code. The second parameter selects the policy to + * apply if the request message indicates a body, and how a chunked + * transfer-coding should be interpreted. Choose one of + * + * REQUEST_NO_BODY Send 413 error if message has any body + * REQUEST_CHUNKED_ERROR Send 411 error if body without Content-Length + * REQUEST_CHUNKED_DECHUNK If chunked, remove the chunks for me. + * + * In order to use the last two options, the caller MUST provide a buffer + * large enough to hold a chunk-size line, including any extensions. + * + * 2. When you are ready to read a body (if any), call should_client_block(). + * This will tell the module whether or not to read input. If it is 0, + * the module should assume that there is no message body to read. + * This step also sends a 100 Continue response to HTTP/1.1 clients, + * so should not be called until the module is *definitely* ready to + * read content. (otherwise, the point of the 100 response is defeated). + * Never call this function more than once. + * + * 3. Finally, call get_client_block in a loop. Pass it a buffer and its size. + * It will put data into the buffer (not necessarily a full buffer), and + * return the length of the input block. When it is done reading, it will + * return 0 if EOF, or -1 if there was an error. + * If an error occurs on input, we force an end to keepalive. + */ + +AP_DECLARE(int) ap_setup_client_block(request_rec *r, int read_policy) +{ + const char *tenc = apr_table_get(r->headers_in, "Transfer-Encoding"); + const char *lenp = apr_table_get(r->headers_in, "Content-Length"); + + r->read_body = read_policy; + r->read_chunked = 0; + r->remaining = 0; + + if (tenc) { + if (strcasecmp(tenc, "chunked")) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Unknown Transfer-Encoding %s", tenc); + return HTTP_NOT_IMPLEMENTED; + } + if (r->read_body == REQUEST_CHUNKED_ERROR) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "chunked Transfer-Encoding forbidden: %s", r->uri); + return (lenp) ? HTTP_BAD_REQUEST : HTTP_LENGTH_REQUIRED; + } + + r->read_chunked = 1; + } + else if (lenp) { + int conversion_error = 0; + char *endstr; + + errno = 0; + r->remaining = strtol(lenp, &endstr, 10); /* depend on ANSI */ + + /* See comments in ap_http_filter() */ + if (errno || (endstr && *endstr) || (r->remaining < 0)) { + conversion_error = 1; + } + + if (conversion_error) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Invalid Content-Length"); + return HTTP_BAD_REQUEST; + } + } + + if ((r->read_body == REQUEST_NO_BODY) + && (r->read_chunked || (r->remaining > 0))) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "%s with body is not allowed for %s", r->method, r->uri); + return HTTP_REQUEST_ENTITY_TOO_LARGE; + } + +#ifdef AP_DEBUG + { + /* Make sure ap_getline() didn't leave any droppings. */ + core_request_config *req_cfg = + (core_request_config *)ap_get_module_config(r->request_config, + &core_module); + AP_DEBUG_ASSERT(APR_BRIGADE_EMPTY(req_cfg->bb)); + } +#endif + + return OK; +} + +AP_DECLARE(int) ap_should_client_block(request_rec *r) +{ + /* First check if we have already read the request body */ + + if (r->read_length || (!r->read_chunked && (r->remaining <= 0))) { + return 0; + } + + return 1; +} + +/** + * Parse a chunk extension, detect overflow. + * There are two error cases: + * 1) If the conversion would require too many bits, a -1 is returned. + * 2) If the conversion used the correct number of bits, but an overflow + * caused only the sign bit to flip, then that negative number is + * returned. + * In general, any negative number can be considered an overflow error. + */ +static long get_chunk_size(char *b) +{ + long chunksize = 0; + size_t chunkbits = sizeof(long) * 8; + + ap_xlate_proto_from_ascii(b, strlen(b)); + + /* Skip leading zeros */ + while (*b == '0') { + ++b; + } + + while (apr_isxdigit(*b) && (chunkbits > 0)) { + int xvalue = 0; + + if (*b >= '0' && *b <= '9') { + xvalue = *b - '0'; + } + else if (*b >= 'A' && *b <= 'F') { + xvalue = *b - 'A' + 0xa; + } + else if (*b >= 'a' && *b <= 'f') { + xvalue = *b - 'a' + 0xa; + } + + chunksize = (chunksize << 4) | xvalue; + chunkbits -= 4; + ++b; + } + if (apr_isxdigit(*b) && (chunkbits <= 0)) { + /* overflow */ + return -1; + } + + return chunksize; +} + +/* get_client_block is called in a loop to get the request message body. + * This is quite simple if the client includes a content-length + * (the normal case), but gets messy if the body is chunked. Note that + * r->remaining is used to maintain state across calls and that + * r->read_length is the total number of bytes given to the caller + * across all invocations. It is messy because we have to be careful not + * to read past the data provided by the client, since these reads block. + * Returns 0 on End-of-body, -1 on error or premature chunk end. + * + */ +AP_DECLARE(long) ap_get_client_block(request_rec *r, char *buffer, + apr_size_t bufsiz) +{ + apr_status_t rv; + apr_bucket_brigade *bb; + + if (r->remaining < 0 || (!r->read_chunked && r->remaining == 0)) { + return 0; + } + + bb = apr_brigade_create(r->pool, r->connection->bucket_alloc); + if (bb == NULL) { + r->connection->keepalive = AP_CONN_CLOSE; + return -1; + } + + rv = ap_get_brigade(r->input_filters, bb, AP_MODE_READBYTES, + APR_BLOCK_READ, bufsiz); + + /* We lose the failure code here. This is why ap_get_client_block should + * not be used. + */ + if (rv != APR_SUCCESS) { + /* if we actually fail here, we want to just return and + * stop trying to read data from the client. + */ + r->connection->keepalive = AP_CONN_CLOSE; + apr_brigade_destroy(bb); + return -1; + } + + /* If this fails, it means that a filter is written incorrectly and that + * it needs to learn how to properly handle APR_BLOCK_READ requests by + * returning data when requested. + */ + AP_DEBUG_ASSERT(!APR_BRIGADE_EMPTY(bb)); + + /* Check to see if EOS in the brigade. + * + * If so, we have to leave a nugget for the *next* ap_get_client_block + * call to return 0. + */ + if (APR_BUCKET_IS_EOS(APR_BRIGADE_LAST(bb))) { + if (r->read_chunked) { + r->remaining = -1; + } + else { + r->remaining = 0; + } + } + + rv = apr_brigade_flatten(bb, buffer, &bufsiz); + if (rv != APR_SUCCESS) { + apr_brigade_destroy(bb); + return -1; + } + + /* XXX yank me? */ + r->read_length += bufsiz; + + apr_brigade_destroy(bb); + return bufsiz; +} + +/* In HTTP/1.1, any method can have a body. However, most GET handlers + * wouldn't know what to do with a request body if they received one. + * This helper routine tests for and reads any message body in the request, + * simply discarding whatever it receives. We need to do this because + * failing to read the request body would cause it to be interpreted + * as the next request on a persistent connection. + * + * Since we return an error status if the request is malformed, this + * routine should be called at the beginning of a no-body handler, e.g., + * + * if ((retval = ap_discard_request_body(r)) != OK) { + * return retval; + * } + */ +AP_DECLARE(int) ap_discard_request_body(request_rec *r) +{ + apr_bucket_brigade *bb; + int rv, seen_eos; + + /* Sometimes we'll get in a state where the input handling has + * detected an error where we want to drop the connection, so if + * that's the case, don't read the data as that is what we're trying + * to avoid. + * + * This function is also a no-op on a subrequest. + */ + if (r->main || r->connection->keepalive == AP_CONN_CLOSE || + ap_status_drops_connection(r->status)) { + return OK; + } + + bb = apr_brigade_create(r->pool, r->connection->bucket_alloc); + seen_eos = 0; + do { + apr_bucket *bucket; + + rv = ap_get_brigade(r->input_filters, bb, AP_MODE_READBYTES, + APR_BLOCK_READ, HUGE_STRING_LEN); + + if (rv != APR_SUCCESS) { + /* FIXME: If we ever have a mapping from filters (apr_status_t) + * to HTTP error codes, this would be a good place for them. + * + * If we received the special case AP_FILTER_ERROR, it means + * that the filters have already handled this error. + * Otherwise, we should assume we have a bad request. + */ + if (rv == AP_FILTER_ERROR) { + apr_brigade_destroy(bb); + return rv; + } + else { + apr_brigade_destroy(bb); + return HTTP_BAD_REQUEST; + } + } + + APR_BRIGADE_FOREACH(bucket, bb) { + const char *data; + apr_size_t len; + + if (APR_BUCKET_IS_EOS(bucket)) { + seen_eos = 1; + break; + } + + /* These are metadata buckets. */ + if (bucket->length == 0) { + continue; + } + + /* We MUST read because in case we have an unknown-length + * bucket or one that morphs, we want to exhaust it. + */ + rv = apr_bucket_read(bucket, &data, &len, APR_BLOCK_READ); + if (rv != APR_SUCCESS) { + apr_brigade_destroy(bb); + return HTTP_BAD_REQUEST; + } + } + apr_brigade_cleanup(bb); + } while (!seen_eos); + + return OK; +} + +static const char *add_optional_notes(request_rec *r, + const char *prefix, + const char *key, + const char *suffix) +{ + const char *notes, *result; + + if ((notes = apr_table_get(r->notes, key)) == NULL) { + result = apr_pstrcat(r->pool, prefix, suffix, NULL); + } + else { + result = apr_pstrcat(r->pool, prefix, notes, suffix, NULL); + } + + return result; +} + +/* construct and return the default error message for a given + * HTTP defined error code + */ +static const char *get_canned_error_string(int status, + request_rec *r, + const char *location) +{ + apr_pool_t *p = r->pool; + const char *error_notes, *h1, *s1; + + switch (status) { + case HTTP_MOVED_PERMANENTLY: + case HTTP_MOVED_TEMPORARILY: + case HTTP_TEMPORARY_REDIRECT: + return(apr_pstrcat(p, + "

    The document has moved pool, location), + "\">here.

    \n", + NULL)); + case HTTP_SEE_OTHER: + return(apr_pstrcat(p, + "

    The answer to your request is located " + "pool, location), + "\">here.

    \n", + NULL)); + case HTTP_USE_PROXY: + return(apr_pstrcat(p, + "

    This resource is only accessible " + "through the proxy\n", + ap_escape_html(r->pool, location), + "
    \nYou will need to configure " + "your client to use that proxy.

    \n", + NULL)); + case HTTP_PROXY_AUTHENTICATION_REQUIRED: + case HTTP_UNAUTHORIZED: + return("

    This server could not verify that you\n" + "are authorized to access the document\n" + "requested. Either you supplied the wrong\n" + "credentials (e.g., bad password), or your\n" + "browser doesn't understand how to supply\n" + "the credentials required.

    \n"); + case HTTP_BAD_REQUEST: + return(add_optional_notes(r, + "

    Your browser sent a request that " + "this server could not understand.
    \n", + "error-notes", + "

    \n")); + case HTTP_FORBIDDEN: + return(apr_pstrcat(p, + "

    You don't have permission to access ", + ap_escape_html(r->pool, r->uri), + "\non this server.

    \n", + NULL)); + case HTTP_NOT_FOUND: + return(apr_pstrcat(p, + "

    The requested URL ", + ap_escape_html(r->pool, r->uri), + " was not found on this server.

    \n", + NULL)); + case HTTP_METHOD_NOT_ALLOWED: + return(apr_pstrcat(p, + "

    The requested method ", + ap_escape_html(r->pool, r->method), + " is not allowed for the URL ", + ap_escape_html(r->pool, r->uri), + ".

    \n", + NULL)); + case HTTP_NOT_ACCEPTABLE: + s1 = apr_pstrcat(p, + "

    An appropriate representation of the " + "requested resource ", + ap_escape_html(r->pool, r->uri), + " could not be found on this server.

    \n", + NULL); + return(add_optional_notes(r, s1, "variant-list", "")); + case HTTP_MULTIPLE_CHOICES: + return(add_optional_notes(r, "", "variant-list", "")); + case HTTP_LENGTH_REQUIRED: + s1 = apr_pstrcat(p, + "

    A request of the requested method ", + ap_escape_html(r->pool, r->method), + " requires a valid Content-length.
    \n", + NULL); + return(add_optional_notes(r, s1, "error-notes", "

    \n")); + case HTTP_PRECONDITION_FAILED: + return(apr_pstrcat(p, + "

    The precondition on the request " + "for the URL ", + ap_escape_html(r->pool, r->uri), + " evaluated to false.

    \n", + NULL)); + case HTTP_NOT_IMPLEMENTED: + s1 = apr_pstrcat(p, + "

    ", + ap_escape_html(r->pool, r->method), " to ", + ap_escape_html(r->pool, r->uri), + " not supported.
    \n", + NULL); + return(add_optional_notes(r, s1, "error-notes", "

    \n")); + case HTTP_BAD_GATEWAY: + s1 = "

    The proxy server received an invalid" CRLF + "response from an upstream server.
    " CRLF; + return(add_optional_notes(r, s1, "error-notes", "

    \n")); + case HTTP_VARIANT_ALSO_VARIES: + return(apr_pstrcat(p, + "

    A variant for the requested " + "resource\n

    \n",
    +                           ap_escape_html(r->pool, r->uri),
    +                           "\n
    \nis itself a negotiable resource. " + "This indicates a configuration error.

    \n", + NULL)); + case HTTP_REQUEST_TIME_OUT: + return("

    Server timeout waiting for the HTTP request from the client.

    \n"); + case HTTP_GONE: + return(apr_pstrcat(p, + "

    The requested resource
    ", + ap_escape_html(r->pool, r->uri), + "
    \nis no longer available on this server " + "and there is no forwarding address.\n" + "Please remove all references to this " + "resource.

    \n", + NULL)); + case HTTP_REQUEST_ENTITY_TOO_LARGE: + return(apr_pstrcat(p, + "The requested resource
    ", + ap_escape_html(r->pool, r->uri), "
    \n", + "does not allow request data with ", + ap_escape_html(r->pool, r->method), + " requests, or the amount of data provided in\n" + "the request exceeds the capacity limit.\n", + NULL)); + case HTTP_REQUEST_URI_TOO_LARGE: + s1 = "

    The requested URL's length exceeds the capacity\n" + "limit for this server.
    \n"; + return(add_optional_notes(r, s1, "error-notes", "

    \n")); + case HTTP_UNSUPPORTED_MEDIA_TYPE: + return("

    The supplied request data is not in a format\n" + "acceptable for processing by this resource.

    \n"); + case HTTP_RANGE_NOT_SATISFIABLE: + return("

    None of the range-specifier values in the Range\n" + "request-header field overlap the current extent\n" + "of the selected resource.

    \n"); + case HTTP_EXPECTATION_FAILED: + return(apr_pstrcat(p, + "

    The expectation given in the Expect " + "request-header" + "\nfield could not be met by this server.

    \n" + "

    The client sent

    \n    Expect: ",
    +                           ap_escape_html(r->pool, apr_table_get(r->headers_in, "Expect")),
    +                           "\n
    \n" + "but we only allow the 100-continue " + "expectation.

    \n", + NULL)); + case HTTP_UNPROCESSABLE_ENTITY: + return("

    The server understands the media type of the\n" + "request entity, but was unable to process the\n" + "contained instructions.

    \n"); + case HTTP_LOCKED: + return("

    The requested resource is currently locked.\n" + "The lock must be released or proper identification\n" + "given before the method can be applied.

    \n"); + case HTTP_FAILED_DEPENDENCY: + return("

    The method could not be performed on the resource\n" + "because the requested action depended on another\n" + "action and that other action failed.

    \n"); + case HTTP_UPGRADE_REQUIRED: + return("

    The requested resource can only be retrieved\n" + "using SSL. The server is willing to upgrade the current\n" + "connection to SSL, but your client doesn't support it.\n" + "Either upgrade your client, or try requesting the page\n" + "using https://\n"); + case HTTP_INSUFFICIENT_STORAGE: + return("

    The method could not be performed on the resource\n" + "because the server is unable to store the\n" + "representation needed to successfully complete the\n" + "request. There is insufficient free space left in\n" + "your storage allocation.

    \n"); + case HTTP_SERVICE_UNAVAILABLE: + return("

    The server is temporarily unable to service your\n" + "request due to maintenance downtime or capacity\n" + "problems. Please try again later.

    \n"); + case HTTP_GATEWAY_TIME_OUT: + return("

    The proxy server did not receive a timely response\n" + "from the upstream server.

    \n"); + case HTTP_NOT_EXTENDED: + return("

    A mandatory extension policy in the request is not\n" + "accepted by the server for this resource.

    \n"); + default: /* HTTP_INTERNAL_SERVER_ERROR */ + /* + * This comparison to expose error-notes could be modified to + * use a configuration directive and export based on that + * directive. For now "*" is used to designate an error-notes + * that is totally safe for any user to see (ie lacks paths, + * database passwords, etc.) + */ + if (((error_notes = apr_table_get(r->notes, + "error-notes")) != NULL) + && (h1 = apr_table_get(r->notes, "verbose-error-to")) != NULL + && (strcmp(h1, "*") == 0)) { + return(apr_pstrcat(p, error_notes, "

    \n", NULL)); + } + else { + return(apr_pstrcat(p, + "

    The server encountered an internal " + "error or\n" + "misconfiguration and was unable to complete\n" + "your request.

    \n" + "

    Please contact the server " + "administrator,\n ", + ap_escape_html(r->pool, + r->server->server_admin), + " and inform them of the time the " + "error occurred,\n" + "and anything you might have done that " + "may have\n" + "caused the error.

    \n" + "

    More information about this error " + "may be available\n" + "in the server error log.

    \n", + NULL)); + } + /* + * It would be nice to give the user the information they need to + * fix the problem directly since many users don't have access to + * the error_log (think University sites) even though they can easily + * get this error by misconfiguring an htaccess file. However, the + * e error notes tend to include the real file pathname in this case, + * which some people consider to be a breach of privacy. Until we + * can figure out a way to remove the pathname, leave this commented. + * + * if ((error_notes = apr_table_get(r->notes, + * "error-notes")) != NULL) { + * return(apr_pstrcat(p, error_notes, "

    \n", NULL); + * } + * else { + * return ""; + * } + */ + } +} + +/* We should have named this send_canned_response, since it is used for any + * response that can be generated by the server from the request record. + * This includes all 204 (no content), 3xx (redirect), 4xx (client error), + * and 5xx (server error) messages that have not been redirected to another + * handler via the ErrorDocument feature. + */ +AP_DECLARE(void) ap_send_error_response(request_rec *r, int recursive_error) +{ + int status = r->status; + int idx = ap_index_of_response(status); + char *custom_response; + const char *location = apr_table_get(r->headers_out, "Location"); + + /* At this point, we are starting the response over, so we have to reset + * this value. + */ + r->eos_sent = 0; + + /* and we need to get rid of any RESOURCE filters that might be lurking + * around, thinking they are in the middle of the original request + */ + + r->output_filters = r->proto_output_filters; + + ap_run_insert_error_filter(r); + + /* + * It's possible that the Location field might be in r->err_headers_out + * instead of r->headers_out; use the latter if possible, else the + * former. + */ + if (location == NULL) { + location = apr_table_get(r->err_headers_out, "Location"); + } + /* We need to special-case the handling of 204 and 304 responses, + * since they have specific HTTP requirements and do not include a + * message body. Note that being assbackwards here is not an option. + */ + if (status == HTTP_NOT_MODIFIED) { + ap_finalize_request_protocol(r); + return; + } + + if (status == HTTP_NO_CONTENT) { + ap_finalize_request_protocol(r); + return; + } + + if (!r->assbackwards) { + apr_table_t *tmp = r->headers_out; + + /* For all HTTP/1.x responses for which we generate the message, + * we need to avoid inheriting the "normal status" header fields + * that may have been set by the request handler before the + * error or redirect, except for Location on external redirects. + */ + r->headers_out = r->err_headers_out; + r->err_headers_out = tmp; + apr_table_clear(r->err_headers_out); + + if (ap_is_HTTP_REDIRECT(status) || (status == HTTP_CREATED)) { + if ((location != NULL) && *location) { + apr_table_setn(r->headers_out, "Location", location); + } + else { + location = ""; /* avoids coredump when printing, below */ + } + } + + r->content_languages = NULL; + r->content_encoding = NULL; + r->clength = 0; + + if (apr_table_get(r->subprocess_env, + "suppress-error-charset") != NULL) { + core_request_config *request_conf = + ap_get_module_config(r->request_config, &core_module); + request_conf->suppress_charset = 1; /* avoid adding default + * charset later + */ + ap_set_content_type(r, "text/html"); + } + else { + ap_set_content_type(r, "text/html; charset=iso-8859-1"); + } + + if ((status == HTTP_METHOD_NOT_ALLOWED) + || (status == HTTP_NOT_IMPLEMENTED)) { + apr_table_setn(r->headers_out, "Allow", make_allow(r)); + } + + if (r->header_only) { + ap_finalize_request_protocol(r); + return; + } + } + + if ((custom_response = ap_response_code_string(r, idx))) { + /* + * We have a custom response output. This should only be + * a text-string to write back. But if the ErrorDocument + * was a local redirect and the requested resource failed + * for any reason, the custom_response will still hold the + * redirect URL. We don't really want to output this URL + * as a text message, so first check the custom response + * string to ensure that it is a text-string (using the + * same test used in ap_die(), i.e. does it start with a "). + * + * If it's not a text string, we've got a recursive error or + * an external redirect. If it's a recursive error, ap_die passes + * us the second error code so we can write both, and has already + * backed up to the original error. If it's an external redirect, + * it hasn't happened yet; we may never know if it fails. + */ + if (custom_response[0] == '\"') { + ap_rputs(custom_response + 1, r); + ap_finalize_request_protocol(r); + return; + } + } + { + const char *title = status_lines[idx]; + const char *h1; + + /* Accept a status_line set by a module, but only if it begins + * with the 3 digit status code + */ + if (r->status_line != NULL + && strlen(r->status_line) > 4 /* long enough */ + && apr_isdigit(r->status_line[0]) + && apr_isdigit(r->status_line[1]) + && apr_isdigit(r->status_line[2]) + && apr_isspace(r->status_line[3]) + && apr_isalnum(r->status_line[4])) { + title = r->status_line; + } + + /* folks decided they didn't want the error code in the H1 text */ + h1 = &title[4]; + + /* can't count on a charset filter being in place here, + * so do ebcdic->ascii translation explicitly (if needed) + */ + + ap_rvputs_proto_in_ascii(r, + DOCTYPE_HTML_2_0 + "\n", title, + "\n\n

    ", h1, "

    \n", + NULL); + + ap_rvputs_proto_in_ascii(r, + get_canned_error_string(status, r, location), + NULL); + + if (recursive_error) { + ap_rvputs_proto_in_ascii(r, "

    Additionally, a ", + status_lines[ap_index_of_response(recursive_error)], + "\nerror was encountered while trying to use an " + "ErrorDocument to handle the request.

    \n", NULL); + } + ap_rvputs_proto_in_ascii(r, ap_psignature("
    \n", r), NULL); + ap_rvputs_proto_in_ascii(r, "\n", NULL); + } + ap_finalize_request_protocol(r); +} + +/* + * Create a new method list with the specified number of preallocated + * extension slots. + */ +AP_DECLARE(ap_method_list_t *) ap_make_method_list(apr_pool_t *p, int nelts) +{ + ap_method_list_t *ml; + + ml = (ap_method_list_t *) apr_palloc(p, sizeof(ap_method_list_t)); + ml->method_mask = 0; + ml->method_list = apr_array_make(p, nelts, sizeof(char *)); + return ml; +} + +/* + * Make a copy of a method list (primarily for subrequests that may + * subsequently change it; don't want them changing the parent's, too!). + */ +AP_DECLARE(void) ap_copy_method_list(ap_method_list_t *dest, + ap_method_list_t *src) +{ + int i; + char **imethods; + char **omethods; + + dest->method_mask = src->method_mask; + imethods = (char **) src->method_list->elts; + for (i = 0; i < src->method_list->nelts; ++i) { + omethods = (char **) apr_array_push(dest->method_list); + *omethods = apr_pstrdup(dest->method_list->pool, imethods[i]); + } +} + +/* + * Invoke a callback routine for each method in the specified list. + */ +AP_DECLARE_NONSTD(void) ap_method_list_do(int (*comp) (void *urec, + const char *mname, + int mnum), + void *rec, + const ap_method_list_t *ml, ...) +{ + va_list vp; + va_start(vp, ml); + ap_method_list_vdo(comp, rec, ml, vp); + va_end(vp); +} + +AP_DECLARE(void) ap_method_list_vdo(int (*comp) (void *mrec, + const char *mname, + int mnum), + void *rec, const ap_method_list_t *ml, + va_list vp) +{ + +} + +/* + * Return true if the specified HTTP method is in the provided + * method list. + */ +AP_DECLARE(int) ap_method_in_list(ap_method_list_t *l, const char *method) +{ + int methnum; + int i; + char **methods; + + /* + * If it's one of our known methods, use the shortcut and check the + * bitmask. + */ + methnum = ap_method_number_of(method); + if (methnum != M_INVALID) { + return !!(l->method_mask & (AP_METHOD_BIT << methnum)); + } + /* + * Otherwise, see if the method name is in the array or string names + */ + if ((l->method_list == NULL) || (l->method_list->nelts == 0)) { + return 0; + } + methods = (char **)l->method_list->elts; + for (i = 0; i < l->method_list->nelts; ++i) { + if (strcmp(method, methods[i]) == 0) { + return 1; + } + } + return 0; +} + +/* + * Add the specified method to a method list (if it isn't already there). + */ +AP_DECLARE(void) ap_method_list_add(ap_method_list_t *l, const char *method) +{ + int methnum; + int i; + const char **xmethod; + char **methods; + + /* + * If it's one of our known methods, use the shortcut and use the + * bitmask. + */ + methnum = ap_method_number_of(method); + l->method_mask |= (AP_METHOD_BIT << methnum); + if (methnum != M_INVALID) { + return; + } + /* + * Otherwise, see if the method name is in the array of string names. + */ + if (l->method_list->nelts != 0) { + methods = (char **)l->method_list->elts; + for (i = 0; i < l->method_list->nelts; ++i) { + if (strcmp(method, methods[i]) == 0) { + return; + } + } + } + xmethod = (const char **) apr_array_push(l->method_list); + *xmethod = method; +} + +/* + * Remove the specified method from a method list. + */ +AP_DECLARE(void) ap_method_list_remove(ap_method_list_t *l, + const char *method) +{ + int methnum; + char **methods; + + /* + * If it's a known methods, either builtin or registered + * by a module, use the bitmask. + */ + methnum = ap_method_number_of(method); + l->method_mask |= ~(AP_METHOD_BIT << methnum); + if (methnum != M_INVALID) { + return; + } + /* + * Otherwise, see if the method name is in the array of string names. + */ + if (l->method_list->nelts != 0) { + register int i, j, k; + methods = (char **)l->method_list->elts; + for (i = 0; i < l->method_list->nelts; ) { + if (strcmp(method, methods[i]) == 0) { + for (j = i, k = i + 1; k < l->method_list->nelts; ++j, ++k) { + methods[j] = methods[k]; + } + --l->method_list->nelts; + } + else { + ++i; + } + } + } +} + +/* + * Reset a method list to be completely empty. + */ +AP_DECLARE(void) ap_clear_method_list(ap_method_list_t *l) +{ + l->method_mask = 0; + l->method_list->nelts = 0; +} + +/* Generate the human-readable hex representation of an unsigned long + * (basically a faster version of 'sprintf("%lx")') + */ +#define HEX_DIGITS "0123456789abcdef" +static char *etag_ulong_to_hex(char *next, unsigned long u) +{ + int printing = 0; + int shift = sizeof(unsigned long) * 8 - 4; + do { + unsigned long next_digit = ((u >> shift) & (unsigned long)0xf); + if (next_digit) { + *next++ = HEX_DIGITS[next_digit]; + printing = 1; + } + else if (printing) { + *next++ = HEX_DIGITS[next_digit]; + } + shift -= 4; + } while (shift); + *next++ = HEX_DIGITS[u & (unsigned long)0xf]; + return next; +} + +#define ETAG_WEAK "W/" +#define CHARS_PER_UNSIGNED_LONG (sizeof(unsigned long) * 2) +/* + * Construct an entity tag (ETag) from resource information. If it's a real + * file, build in some of the file characteristics. If the modification time + * is newer than (request-time minus 1 second), mark the ETag as weak - it + * could be modified again in as short an interval. We rationalize the + * modification time we're given to keep it from being in the future. + */ +AP_DECLARE(char *) ap_make_etag(request_rec *r, int force_weak) +{ + char *weak; + apr_size_t weak_len; + char *etag; + char *next; + core_dir_config *cfg; + etag_components_t etag_bits; + etag_components_t bits_added; + + cfg = (core_dir_config *)ap_get_module_config(r->per_dir_config, + &core_module); + etag_bits = (cfg->etag_bits & (~ cfg->etag_remove)) | cfg->etag_add; + + /* + * If it's a file (or we wouldn't be here) and no ETags + * should be set for files, return an empty string and + * note it for the header-sender to ignore. + */ + if (etag_bits & ETAG_NONE) { + apr_table_setn(r->notes, "no-etag", "omit"); + return ""; + } + + if (etag_bits == ETAG_UNSET) { + etag_bits = ETAG_BACKWARD; + } + /* + * Make an ETag header out of various pieces of information. We use + * the last-modified date and, if we have a real file, the + * length and inode number - note that this doesn't have to match + * the content-length (i.e. includes), it just has to be unique + * for the file. + * + * If the request was made within a second of the last-modified date, + * we send a weak tag instead of a strong one, since it could + * be modified again later in the second, and the validation + * would be incorrect. + */ + if ((r->request_time - r->mtime > (1 * APR_USEC_PER_SEC)) && + !force_weak) { + weak = NULL; + weak_len = 0; + } + else { + weak = ETAG_WEAK; + weak_len = sizeof(ETAG_WEAK); + } + + if (r->finfo.filetype != 0) { + /* + * ETag gets set to [W/]"inode-size-mtime", modulo any + * FileETag keywords. + */ + etag = apr_palloc(r->pool, weak_len + sizeof("\"--\"") + + 3 * CHARS_PER_UNSIGNED_LONG + 1); + next = etag; + if (weak) { + while (*weak) { + *next++ = *weak++; + } + } + *next++ = '"'; + bits_added = 0; + if (etag_bits & ETAG_INODE) { + next = etag_ulong_to_hex(next, (unsigned long)r->finfo.inode); + bits_added |= ETAG_INODE; + } + if (etag_bits & ETAG_SIZE) { + if (bits_added != 0) { + *next++ = '-'; + } + next = etag_ulong_to_hex(next, (unsigned long)r->finfo.size); + bits_added |= ETAG_SIZE; + } + if (etag_bits & ETAG_MTIME) { + if (bits_added != 0) { + *next++ = '-'; + } + next = etag_ulong_to_hex(next, (unsigned long)r->mtime); + } + *next++ = '"'; + *next = '\0'; + } + else { + /* + * Not a file document, so just use the mtime: [W/]"mtime" + */ + etag = apr_palloc(r->pool, weak_len + sizeof("\"\"") + + CHARS_PER_UNSIGNED_LONG + 1); + next = etag; + if (weak) { + while (*weak) { + *next++ = *weak++; + } + } + *next++ = '"'; + next = etag_ulong_to_hex(next, (unsigned long)r->mtime); + *next++ = '"'; + *next = '\0'; + } + + return etag; +} + +AP_DECLARE(void) ap_set_etag(request_rec *r) +{ + char *etag; + char *variant_etag, *vlv; + int vlv_weak; + + if (!r->vlist_validator) { + etag = ap_make_etag(r, 0); + + /* If we get a blank etag back, don't set the header. */ + if (!etag[0]) { + return; + } + } + else { + /* If we have a variant list validator (vlv) due to the + * response being negotiated, then we create a structured + * entity tag which merges the variant etag with the variant + * list validator (vlv). This merging makes revalidation + * somewhat safer, ensures that caches which can deal with + * Vary will (eventually) be updated if the set of variants is + * changed, and is also a protocol requirement for transparent + * content negotiation. + */ + + /* if the variant list validator is weak, we make the whole + * structured etag weak. If we would not, then clients could + * have problems merging range responses if we have different + * variants with the same non-globally-unique strong etag. + */ + + vlv = r->vlist_validator; + vlv_weak = (vlv[0] == 'W'); + + variant_etag = ap_make_etag(r, vlv_weak); + + /* If we get a blank etag back, don't append vlv and stop now. */ + if (!variant_etag[0]) { + return; + } + + /* merge variant_etag and vlv into a structured etag */ + variant_etag[strlen(variant_etag) - 1] = '\0'; + if (vlv_weak) { + vlv += 3; + } + else { + vlv++; + } + etag = apr_pstrcat(r->pool, variant_etag, ";", vlv, NULL); + } + + apr_table_setn(r->headers_out, "ETag", etag); +} + +static int parse_byterange(char *range, apr_off_t clength, + apr_off_t *start, apr_off_t *end) +{ + char *dash = strchr(range, '-'); + + if (!dash) { + return 0; + } + + if ((dash == range)) { + /* In the form "-5" */ + *start = clength - apr_atoi64(dash + 1); + *end = clength - 1; + } + else { + *dash = '\0'; + dash++; + *start = apr_atoi64(range); + if (*dash) { + *end = apr_atoi64(dash); + } + else { /* "5-" */ + *end = clength - 1; + } + } + + if (*start < 0) { + *start = 0; + } + + if (*end >= clength) { + *end = clength - 1; + } + + if (*start > *end) { + return -1; + } + + return (*start > 0 || *end < clength); +} + +static int ap_set_byterange(request_rec *r); + +typedef struct byterange_ctx { + apr_bucket_brigade *bb; + int num_ranges; + char *boundary; + char *bound_head; +} byterange_ctx; + +/* + * Here we try to be compatible with clients that want multipart/x-byteranges + * instead of multipart/byteranges (also see above), as per HTTP/1.1. We + * look for the Request-Range header (e.g. Netscape 2 and 3) as an indication + * that the browser supports an older protocol. We also check User-Agent + * for Microsoft Internet Explorer 3, which needs this as well. + */ +static int use_range_x(request_rec *r) +{ + const char *ua; + return (apr_table_get(r->headers_in, "Request-Range") + || ((ua = apr_table_get(r->headers_in, "User-Agent")) + && ap_strstr_c(ua, "MSIE 3"))); +} + +#define BYTERANGE_FMT "%" APR_OFF_T_FMT "-%" APR_OFF_T_FMT "/%" APR_OFF_T_FMT +#define PARTITION_ERR_FMT "apr_brigade_partition() failed " \ + "[%" APR_OFF_T_FMT ",%" APR_OFF_T_FMT "]" + +AP_CORE_DECLARE_NONSTD(apr_status_t) ap_byterange_filter(ap_filter_t *f, + apr_bucket_brigade *bb) +{ +#define MIN_LENGTH(len1, len2) ((len1 > len2) ? len2 : len1) + request_rec *r = f->r; + conn_rec *c = r->connection; + byterange_ctx *ctx; + apr_bucket *e; + apr_bucket_brigade *bsend; + apr_off_t range_start; + apr_off_t range_end; + char *current; + apr_off_t clength = 0; + apr_status_t rv; + int found = 0; + + /* Iterate through the brigade until reaching EOS or a bucket with + * unknown length. */ + for (e = APR_BRIGADE_FIRST(bb); + (e != APR_BRIGADE_SENTINEL(bb) && !APR_BUCKET_IS_EOS(e) + && e->length != (apr_size_t)-1); + e = APR_BUCKET_NEXT(e)) { + clength += e->length; + } + + /* Don't attempt to do byte range work if this brigade doesn't + * contain an EOS, or if any of the buckets has an unknown length; + * this avoids the cases where it is expensive to perform + * byteranging (i.e. may require arbitrary amounts of memory). */ + if (!APR_BUCKET_IS_EOS(e) || clength <= 0) { + ap_remove_output_filter(f); + return ap_pass_brigade(f->next, bb); + } + + { + int num_ranges = ap_set_byterange(r); + + /* We have nothing to do, get out of the way. */ + if (num_ranges == 0) { + ap_remove_output_filter(f); + return ap_pass_brigade(f->next, bb); + } + + ctx = apr_pcalloc(r->pool, sizeof(*ctx)); + ctx->num_ranges = num_ranges; + /* create a brigade in case we never call ap_save_brigade() */ + ctx->bb = apr_brigade_create(r->pool, c->bucket_alloc); + + if (ctx->num_ranges > 1) { + /* Is ap_make_content_type required here? */ + const char *orig_ct = ap_make_content_type(r, r->content_type); + /* need APR_TIME_T_FMT_HEX */ + ctx->boundary = apr_psprintf(r->pool, "%qx%lx", + r->request_time, (long) getpid()); + + ap_set_content_type(r, apr_pstrcat(r->pool, "multipart", + use_range_x(r) ? "/x-" : "/", + "byteranges; boundary=", + ctx->boundary, NULL)); + + ctx->bound_head = apr_pstrcat(r->pool, + CRLF "--", ctx->boundary, + CRLF "Content-type: ", + orig_ct, + CRLF "Content-range: bytes ", + NULL); + ap_xlate_proto_to_ascii(ctx->bound_head, strlen(ctx->bound_head)); + } + } + + /* this brigade holds what we will be sending */ + bsend = apr_brigade_create(r->pool, c->bucket_alloc); + + while ((current = ap_getword(r->pool, &r->range, ',')) + && (rv = parse_byterange(current, clength, &range_start, + &range_end))) { + apr_bucket *e2; + apr_bucket *ec; + + if (rv == -1) { + continue; + } + + /* these calls to apr_brigade_partition() should theoretically + * never fail because of the above call to apr_brigade_length(), + * but what the heck, we'll check for an error anyway */ + if ((rv = apr_brigade_partition(bb, range_start, &ec)) != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + PARTITION_ERR_FMT, range_start, clength); + continue; + } + if ((rv = apr_brigade_partition(bb, range_end+1, &e2)) != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + PARTITION_ERR_FMT, range_end+1, clength); + continue; + } + + found = 1; + + /* For single range requests, we must produce Content-Range header. + * Otherwise, we need to produce the multipart boundaries. + */ + if (ctx->num_ranges == 1) { + apr_table_setn(r->headers_out, "Content-Range", + apr_psprintf(r->pool, "bytes " BYTERANGE_FMT, + range_start, range_end, clength)); + } + else { + char *ts; + + e = apr_bucket_pool_create(ctx->bound_head, strlen(ctx->bound_head), + r->pool, c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bsend, e); + + ts = apr_psprintf(r->pool, BYTERANGE_FMT CRLF CRLF, + range_start, range_end, clength); + ap_xlate_proto_to_ascii(ts, strlen(ts)); + e = apr_bucket_pool_create(ts, strlen(ts), r->pool, + c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bsend, e); + } + + do { + apr_bucket *foo; + const char *str; + apr_size_t len; + + if (apr_bucket_copy(ec, &foo) != APR_SUCCESS) { + /* this shouldn't ever happen due to the call to + * apr_brigade_length() above which normalizes + * indeterminate-length buckets. just to be sure, + * though, this takes care of uncopyable buckets that + * do somehow manage to slip through. + */ + /* XXX: check for failure? */ + apr_bucket_read(ec, &str, &len, APR_BLOCK_READ); + apr_bucket_copy(ec, &foo); + } + APR_BRIGADE_INSERT_TAIL(bsend, foo); + ec = APR_BUCKET_NEXT(ec); + } while (ec != e2); + } + + if (found == 0) { + ap_remove_output_filter(f); + r->status = HTTP_OK; + /* bsend is assumed to be empty if we get here. */ + e = ap_bucket_error_create(HTTP_RANGE_NOT_SATISFIABLE, NULL, + r->pool, c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bsend, e); + e = apr_bucket_eos_create(c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bsend, e); + return ap_pass_brigade(f->next, bsend); + } + + if (ctx->num_ranges > 1) { + char *end; + + /* add the final boundary */ + end = apr_pstrcat(r->pool, CRLF "--", ctx->boundary, "--" CRLF, NULL); + ap_xlate_proto_to_ascii(end, strlen(end)); + e = apr_bucket_pool_create(end, strlen(end), r->pool, c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bsend, e); + } + + e = apr_bucket_eos_create(c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bsend, e); + + /* we're done with the original content - all of our data is in bsend. */ + apr_brigade_destroy(bb); + + /* send our multipart output */ + return ap_pass_brigade(f->next, bsend); +} + +static int ap_set_byterange(request_rec *r) +{ + const char *range; + const char *if_range; + const char *match; + const char *ct; + int num_ranges; + + if (r->assbackwards) { + return 0; + } + + /* Check for Range request-header (HTTP/1.1) or Request-Range for + * backwards-compatibility with second-draft Luotonen/Franks + * byte-ranges (e.g. Netscape Navigator 2-3). + * + * We support this form, with Request-Range, and (farther down) we + * send multipart/x-byteranges instead of multipart/byteranges for + * Request-Range based requests to work around a bug in Netscape + * Navigator 2-3 and MSIE 3. + */ + + if (!(range = apr_table_get(r->headers_in, "Range"))) { + range = apr_table_get(r->headers_in, "Request-Range"); + } + + if (!range || strncasecmp(range, "bytes=", 6) || r->status != HTTP_OK) { + return 0; + } + + /* is content already a single range? */ + if (apr_table_get(r->headers_out, "Content-Range")) { + return 0; + } + + /* is content already a multiple range? */ + if ((ct = apr_table_get(r->headers_out, "Content-Type")) + && (!strncasecmp(ct, "multipart/byteranges", 20) + || !strncasecmp(ct, "multipart/x-byteranges", 22))) { + return 0; + } + + /* Check the If-Range header for Etag or Date. + * Note that this check will return false (as required) if either + * of the two etags are weak. + */ + if ((if_range = apr_table_get(r->headers_in, "If-Range"))) { + if (if_range[0] == '"') { + if (!(match = apr_table_get(r->headers_out, "Etag")) + || (strcmp(if_range, match) != 0)) { + return 0; + } + } + else if (!(match = apr_table_get(r->headers_out, "Last-Modified")) + || (strcmp(if_range, match) != 0)) { + return 0; + } + } + + if (!ap_strchr_c(range, ',')) { + /* a single range */ + num_ranges = 1; + } + else { + /* a multiple range */ + num_ranges = 2; + } + + r->status = HTTP_PARTIAL_CONTENT; + r->range = range + 6; + + return num_ranges; +} diff --git a/rubbos/app/httpd-2.0.64/modules/http/http_protocol.lo b/rubbos/app/httpd-2.0.64/modules/http/http_protocol.lo new file mode 100644 index 00000000..dc7313d2 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/http/http_protocol.lo @@ -0,0 +1,12 @@ +# http_protocol.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/http_protocol.o' + +# Name of the non-PIC object. +non_pic_object='http_protocol.o' + diff --git a/rubbos/app/httpd-2.0.64/modules/http/http_protocol.o b/rubbos/app/httpd-2.0.64/modules/http/http_protocol.o new file mode 100644 index 0000000000000000000000000000000000000000..6c2d6acf1ea2e30f4f26062f71fe0e959d1834fd GIT binary patch literal 188976 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%0DqKx6~@nG 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/modules/http/http_request.c b/rubbos/app/httpd-2.0.64/modules/http/http_request.c new file mode 100644 index 00000000..c80816d2 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/http/http_request.c @@ -0,0 +1,548 @@ +/* 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. + */ + +/* + * http_request.c: functions to get and process requests + * + * Rob McCool 3/21/93 + * + * Thoroughly revamped by rst for Apache. NB this file reads + * best from the bottom up. + * + */ + +#include "apr_strings.h" +#include "apr_file_io.h" +#include "apr_fnmatch.h" + +#define APR_WANT_STRFUNC +#include "apr_want.h" + +#define CORE_PRIVATE +#include "ap_config.h" +#include "httpd.h" +#include "http_config.h" +#include "http_request.h" +#include "http_core.h" +#include "http_protocol.h" +#include "http_log.h" +#include "http_main.h" +#include "util_filter.h" +#include "util_charset.h" + +#include "mod_core.h" +#include "scoreboard.h" + +#if APR_HAVE_STDARG_H +#include +#endif + +/***************************************************************** + * + * Mainline request processing... + */ + +/* XXX A cleaner and faster way to do this might be to pass the request_rec + * down the filter chain as a parameter. It would need to change for + * subrequest vs. main request filters; perhaps the subrequest filter could + * make the switch. + */ +static void update_r_in_filters(ap_filter_t *f, + request_rec *from, + request_rec *to) +{ + while (f) { + if (f->r == from) { + f->r = to; + } + f = f->next; + } +} + +AP_DECLARE(void) ap_die(int type, request_rec *r) +{ + int error_index = ap_index_of_response(type); + char *custom_response = ap_response_code_string(r, error_index); + int recursive_error = 0; + request_rec *r_1st_err = r; + + if (type == AP_FILTER_ERROR) { + return; + } + + if (type == DONE) { + ap_finalize_request_protocol(r); + return; + } + + /* + * The following takes care of Apache redirects to custom response URLs + * Note that if we are already dealing with the response to some other + * error condition, we just report on the original error, and give up on + * any attempt to handle the other thing "intelligently"... + */ + if (r->status != HTTP_OK) { + recursive_error = type; + + while (r_1st_err->prev && (r_1st_err->prev->status != HTTP_OK)) + r_1st_err = r_1st_err->prev; /* Get back to original error */ + + if (r_1st_err != r) { + /* The recursive error was caused by an ErrorDocument specifying + * an internal redirect to a bad URI. ap_internal_redirect has + * changed the filter chains to point to the ErrorDocument's + * request_rec. Back out those changes so we can safely use the + * original failing request_rec to send the canned error message. + * + * ap_send_error_response gets rid of existing resource filters + * on the output side, so we can skip those. + */ + update_r_in_filters(r_1st_err->proto_output_filters, r, r_1st_err); + update_r_in_filters(r_1st_err->input_filters, r, r_1st_err); + } + + custom_response = NULL; /* Do NOT retry the custom thing! */ + } + + r->status = type; + + /* + * This test is done here so that none of the auth modules needs to know + * about proxy authentication. They treat it like normal auth, and then + * we tweak the status. + */ + if (HTTP_UNAUTHORIZED == r->status && PROXYREQ_PROXY == r->proxyreq) { + r->status = HTTP_PROXY_AUTHENTICATION_REQUIRED; + } + + /* If we don't want to keep the connection, make sure we mark that the + * connection is not eligible for keepalive. If we want to keep the + * connection, be sure that the request body (if any) has been read. + */ + if (ap_status_drops_connection(r->status)) { + r->connection->keepalive = AP_CONN_CLOSE; + } + + /* + * Two types of custom redirects --- plain text, and URLs. Plain text has + * a leading '"', so the URL code, here, is triggered on its absence + */ + + if (custom_response && custom_response[0] != '"') { + + if (ap_is_url(custom_response)) { + /* + * The URL isn't local, so lets drop through the rest of this + * apache code, and continue with the usual REDIRECT handler. + * But note that the client will ultimately see the wrong + * status... + */ + r->status = HTTP_MOVED_TEMPORARILY; + apr_table_setn(r->headers_out, "Location", custom_response); + } + else if (custom_response[0] == '/') { + const char *error_notes; + r->no_local_copy = 1; /* Do NOT send HTTP_NOT_MODIFIED for + * error documents! */ + /* + * This redirect needs to be a GET no matter what the original + * method was. + */ + apr_table_setn(r->subprocess_env, "REQUEST_METHOD", r->method); + + /* + * Provide a special method for modules to communicate + * more informative (than the plain canned) messages to us. + * Propagate them to ErrorDocuments via the ERROR_NOTES variable: + */ + if ((error_notes = apr_table_get(r->notes, + "error-notes")) != NULL) { + apr_table_setn(r->subprocess_env, "ERROR_NOTES", error_notes); + } + r->method = apr_pstrdup(r->pool, "GET"); + r->method_number = M_GET; + ap_internal_redirect(custom_response, r); + return; + } + else { + /* + * Dumb user has given us a bad url to redirect to --- fake up + * dying with a recursive server error... + */ + recursive_error = HTTP_INTERNAL_SERVER_ERROR; + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Invalid error redirection directive: %s", + custom_response); + } + } + ap_send_error_response(r_1st_err, recursive_error); +} + +static void check_pipeline_flush(request_rec *r) +{ + conn_rec *c = r->connection; + /* ### if would be nice if we could PEEK without a brigade. that would + ### allow us to defer creation of the brigade to when we actually + ### need to send a FLUSH. */ + apr_bucket_brigade *bb = apr_brigade_create(r->pool, c->bucket_alloc); + + /* Flush the filter contents if: + * + * 1) the connection will be closed + * 2) there isn't a request ready to be read + */ + /* ### shouldn't this read from the connection input filters? */ + /* ### is zero correct? that means "read one line" */ + if (r->connection->keepalive == AP_CONN_CLOSE || + ap_get_brigade(r->input_filters, bb, AP_MODE_EATCRLF, + APR_NONBLOCK_READ, 0) != APR_SUCCESS) { + apr_bucket *e = apr_bucket_flush_create(c->bucket_alloc); + + /* We just send directly to the connection based filters. At + * this point, we know that we have seen all of the data + * (request finalization sent an EOS bucket, which empties all + * of the request filters). We just want to flush the buckets + * if something hasn't been sent to the network yet. + */ + APR_BRIGADE_INSERT_HEAD(bb, e); + ap_pass_brigade(r->connection->output_filters, bb); + } +} + +void ap_process_request(request_rec *r) +{ + int access_status; + + /* Give quick handlers a shot at serving the request on the fast + * path, bypassing all of the other Apache hooks. + * + * This hook was added to enable serving files out of a URI keyed + * content cache ( e.g., Mike Abbott's Quick Shortcut Cache, + * described here: http://oss.sgi.com/projects/apache/mod_qsc.html ) + * + * It may have other uses as well, such as routing requests directly to + * content handlers that have the ability to grok HTTP and do their + * own access checking, etc (e.g. servlet engines). + * + * Use this hook with extreme care and only if you know what you are + * doing. + */ + if (ap_extended_status) + ap_time_process_request(r->connection->sbh, START_PREQUEST); + access_status = ap_run_quick_handler(r, 0); /* Not a look-up request */ + if (access_status == DECLINED) { + access_status = ap_process_request_internal(r); + if (access_status == OK) { + access_status = ap_invoke_handler(r); + } + } + + if (access_status == DONE) { + /* e.g., something not in storage like TRACE */ + access_status = OK; + } + + if (access_status == OK) { + ap_finalize_request_protocol(r); + } + else { + r->status = HTTP_OK; + ap_die(access_status, r); + } + + /* + * We want to flush the last packet if this isn't a pipelining connection + * *before* we start into logging. Suppose that the logging causes a DNS + * lookup to occur, which may have a high latency. If we hold off on + * this packet, then it'll appear like the link is stalled when really + * it's the application that's stalled. + */ + check_pipeline_flush(r); + ap_update_child_status(r->connection->sbh, SERVER_BUSY_LOG, r); + ap_run_log_transaction(r); + if (ap_extended_status) + ap_time_process_request(r->connection->sbh, STOP_PREQUEST); +} + +static apr_table_t *rename_original_env(apr_pool_t *p, apr_table_t *t) +{ + const apr_array_header_t *env_arr = apr_table_elts(t); + const apr_table_entry_t *elts = (const apr_table_entry_t *) env_arr->elts; + apr_table_t *new = apr_table_make(p, env_arr->nalloc); + int i; + + for (i = 0; i < env_arr->nelts; ++i) { + if (!elts[i].key) + continue; + apr_table_setn(new, apr_pstrcat(p, "REDIRECT_", elts[i].key, NULL), + elts[i].val); + } + + return new; +} + +static request_rec *internal_internal_redirect(const char *new_uri, + request_rec *r) { + int access_status; + request_rec *new; + + if (ap_is_recursion_limit_exceeded(r)) { + ap_die(HTTP_INTERNAL_SERVER_ERROR, r); + return NULL; + } + + new = (request_rec *) apr_pcalloc(r->pool, sizeof(request_rec)); + + new->connection = r->connection; + new->server = r->server; + new->pool = r->pool; + + /* + * A whole lot of this really ought to be shared with http_protocol.c... + * another missing cleanup. It's particularly inappropriate to be + * setting header_only, etc., here. + */ + + new->method = r->method; + new->method_number = r->method_number; + new->allowed_methods = ap_make_method_list(new->pool, 2); + ap_parse_uri(new, new_uri); + + new->request_config = ap_create_request_config(r->pool); + + new->per_dir_config = r->server->lookup_defaults; + + new->prev = r; + r->next = new; + + /* Must have prev and next pointers set before calling create_request + * hook. + */ + ap_run_create_request(new); + + /* Inherit the rest of the protocol info... */ + + new->the_request = r->the_request; + + new->allowed = r->allowed; + + new->status = r->status; + new->assbackwards = r->assbackwards; + new->header_only = r->header_only; + new->protocol = r->protocol; + new->proto_num = r->proto_num; + new->hostname = r->hostname; + new->request_time = r->request_time; + new->main = r->main; + + new->headers_in = r->headers_in; + new->headers_out = apr_table_make(r->pool, 12); + new->err_headers_out = r->err_headers_out; + new->subprocess_env = rename_original_env(r->pool, r->subprocess_env); + new->notes = apr_table_make(r->pool, 5); + new->allowed_methods = ap_make_method_list(new->pool, 2); + + new->htaccess = r->htaccess; + new->no_cache = r->no_cache; + new->expecting_100 = r->expecting_100; + new->no_local_copy = r->no_local_copy; + new->read_length = r->read_length; /* We can only read it once */ + new->vlist_validator = r->vlist_validator; + + new->proto_output_filters = r->proto_output_filters; + new->proto_input_filters = r->proto_input_filters; + + new->output_filters = new->proto_output_filters; + new->input_filters = new->proto_input_filters; + + if (new->main) { + /* Add back the subrequest filter, which we lost when + * we set output_filters to include only the protocol + * output filters from the original request. + */ + ap_add_output_filter_handle(ap_subreq_core_filter_handle, + NULL, new, new->connection); + } + + update_r_in_filters(new->input_filters, r, new); + update_r_in_filters(new->output_filters, r, new); + + apr_table_setn(new->subprocess_env, "REDIRECT_STATUS", + apr_itoa(r->pool, r->status)); + + /* + * XXX: hmm. This is because mod_setenvif and mod_unique_id really need + * to do their thing on internal redirects as well. Perhaps this is a + * misnamed function. + */ + if ((access_status = ap_run_post_read_request(new))) { + ap_die(access_status, new); + return NULL; + } + + return new; +} + +/* XXX: Is this function is so bogus and fragile that we deep-6 it? */ +AP_DECLARE(void) ap_internal_fast_redirect(request_rec *rr, request_rec *r) +{ + /* We need to tell POOL_DEBUG that we're guaranteeing that rr->pool + * will exist as long as r->pool. Otherwise we run into troubles because + * some values in this request will be allocated in r->pool, and others in + * rr->pool. + */ + apr_pool_join(r->pool, rr->pool); + r->proxyreq = rr->proxyreq; + r->no_cache = (r->no_cache && rr->no_cache); + r->no_local_copy = (r->no_local_copy && rr->no_local_copy); + r->mtime = rr->mtime; + r->uri = rr->uri; + r->filename = rr->filename; + r->canonical_filename = rr->canonical_filename; + r->path_info = rr->path_info; + r->args = rr->args; + r->finfo = rr->finfo; + r->handler = rr->handler; + ap_set_content_type(r, rr->content_type); + r->content_encoding = rr->content_encoding; + r->content_languages = rr->content_languages; + r->per_dir_config = rr->per_dir_config; + /* copy output headers from subrequest, but leave negotiation headers */ + r->notes = apr_table_overlay(r->pool, rr->notes, r->notes); + r->headers_out = apr_table_overlay(r->pool, rr->headers_out, + r->headers_out); + r->err_headers_out = apr_table_overlay(r->pool, rr->err_headers_out, + r->err_headers_out); + r->subprocess_env = apr_table_overlay(r->pool, rr->subprocess_env, + r->subprocess_env); + + r->output_filters = rr->output_filters; + r->input_filters = rr->input_filters; + + if (r->main) { + ap_add_output_filter_handle(ap_subreq_core_filter_handle, + NULL, r, r->connection); + } + else if (r->output_filters->frec == ap_subreq_core_filter_handle) { + ap_remove_output_filter(r->output_filters); + r->output_filters = r->output_filters->next; + } + + /* If any filters pointed at the now-defunct rr, we must point them + * at our "new" instance of r. In particular, some of rr's structures + * will now be bogus (say rr->headers_out). If a filter tried to modify + * their f->r structure when it is pointing to rr, the real request_rec + * will not get updated. Fix that here. + */ + update_r_in_filters(r->input_filters, rr, r); + update_r_in_filters(r->output_filters, rr, r); +} + +AP_DECLARE(void) ap_internal_redirect(const char *new_uri, request_rec *r) +{ + request_rec *new = internal_internal_redirect(new_uri, r); + int access_status; + + /* ap_die was already called, if an error occured */ + if (!new) { + return; + } + + access_status = ap_process_request_internal(new); + if (access_status == OK) { + if ((access_status = ap_invoke_handler(new)) != 0) { + ap_die(access_status, new); + return; + } + ap_finalize_request_protocol(new); + } + else { + ap_die(access_status, new); + } +} + +/* This function is designed for things like actions or CGI scripts, when + * using AddHandler, and you want to preserve the content type across + * an internal redirect. + */ +AP_DECLARE(void) ap_internal_redirect_handler(const char *new_uri, request_rec *r) +{ + int access_status; + request_rec *new = internal_internal_redirect(new_uri, r); + + /* ap_die was already called, if an error occured */ + if (!new) { + return; + } + + if (r->handler) + ap_set_content_type(new, r->content_type); + access_status = ap_process_request_internal(new); + if (access_status == OK) { + if ((access_status = ap_invoke_handler(new)) != 0) { + ap_die(access_status, new); + return; + } + ap_finalize_request_protocol(new); + } + else { + ap_die(access_status, new); + } +} + +AP_DECLARE(void) ap_allow_methods(request_rec *r, int reset, ...) +{ + const char *method; + va_list methods; + + /* + * Get rid of any current settings if requested; not just the + * well-known methods but any extensions as well. + */ + if (reset) { + ap_clear_method_list(r->allowed_methods); + } + + va_start(methods, reset); + while ((method = va_arg(methods, const char *)) != NULL) { + ap_method_list_add(r->allowed_methods, method); + } + va_end(methods); +} + +AP_DECLARE(void) ap_allow_standard_methods(request_rec *r, int reset, ...) +{ + int method; + va_list methods; + apr_int64_t mask; + + /* + * Get rid of any current settings if requested; not just the + * well-known methods but any extensions as well. + */ + if (reset) { + ap_clear_method_list(r->allowed_methods); + } + + mask = 0; + va_start(methods, reset); + while ((method = va_arg(methods, int)) != -1) { + mask |= (AP_METHOD_BIT << method); + } + va_end(methods); + + r->allowed_methods->method_mask |= mask; +} diff --git a/rubbos/app/httpd-2.0.64/modules/http/http_request.lo b/rubbos/app/httpd-2.0.64/modules/http/http_request.lo new file mode 100644 index 00000000..678ea930 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/http/http_request.lo @@ -0,0 +1,12 @@ +# http_request.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/http_request.o' + +# Name of the non-PIC object. +non_pic_object='http_request.o' + diff --git a/rubbos/app/httpd-2.0.64/modules/http/http_request.o b/rubbos/app/httpd-2.0.64/modules/http/http_request.o new file mode 100644 index 0000000000000000000000000000000000000000..c1a201058f3ce8fd4162ff6bef0f96e6e814f9d6 GIT binary patch literal 47576 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/modules/http/mod_core.h b/rubbos/app/httpd-2.0.64/modules/http/mod_core.h new file mode 100644 index 00000000..093f38d1 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/http/mod_core.h @@ -0,0 +1,80 @@ +/* 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. + */ + +#ifndef MOD_CORE_H +#define MOD_CORE_H + +#include "apr.h" +#include "apr_buckets.h" + +#include "httpd.h" +#include "util_filter.h" + + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @package mod_core private header file + */ + +/* Handles for core filters */ +extern AP_DECLARE_DATA ap_filter_rec_t *ap_http_input_filter_handle; +extern AP_DECLARE_DATA ap_filter_rec_t *ap_http_header_filter_handle; +extern AP_DECLARE_DATA ap_filter_rec_t *ap_chunk_filter_handle; +extern AP_DECLARE_DATA ap_filter_rec_t *ap_byterange_filter_handle; + +/* + * These (input) filters are internal to the mod_core operation. + */ +apr_status_t ap_http_filter(ap_filter_t *f, apr_bucket_brigade *b, + ap_input_mode_t mode, apr_read_type_e block, + apr_off_t readbytes); + +char *ap_response_code_string(request_rec *r, int error_index); + +/** + * Send the minimal part of an HTTP response header. + * @param r The current request + * @param bb The brigade to add the header to. + * @warning Modules should be very careful about using this, and should + * the default behavior. Much of the HTTP/1.1 implementation + * correctness depends on the full headers. + * @deffunc void ap_basic_http_header(request_rec *r, apr_bucket_brigade *bb) + */ +AP_DECLARE(void) ap_basic_http_header(request_rec *r, apr_bucket_brigade *bb); + +/** + * Send an appropriate response to an http TRACE request. + * @param r The current request + * @tip returns DONE or the HTTP status error if it handles the TRACE, + * or DECLINED if the request was not for TRACE. + * request method was not TRACE. + */ +AP_DECLARE_NONSTD(int) ap_send_http_trace(request_rec *r); + +/** + * Send an appropriate response to an http OPTIONS request. + * @param r The current request + */ +AP_DECLARE(int) ap_send_http_options(request_rec *r); + +#ifdef __cplusplus +} +#endif + +#endif /* !MOD_CORE_H */ diff --git a/rubbos/app/httpd-2.0.64/modules/http/mod_http.la b/rubbos/app/httpd-2.0.64/modules/http/mod_http.la new file mode 100644 index 00000000..4f24a965 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/http/mod_http.la @@ -0,0 +1,35 @@ +# mod_http.la - a libtool library file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='' + +# Names of this library. +library_names='' + +# The name of the static archive. +old_library='mod_http.a' + +# Libraries that this one depends upon. +dependency_libs=' -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib' + +# Version information for mod_http. +current= +age= +revision= + +# Is this an already installed library? +installed=no + +# Should we warn about portability when linking against -modules? +shouldnotlink=yes + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='' diff --git a/rubbos/app/httpd-2.0.64/modules/http/mod_mime.c b/rubbos/app/httpd-2.0.64/modules/http/mod_mime.c new file mode 100644 index 00000000..214cd8bf --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/http/mod_mime.c @@ -0,0 +1,987 @@ +/* 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. + */ + +/* + * http_mime.c: Sends/gets MIME headers for requests + * + * Rob McCool + * + */ + +#include "apr.h" +#include "apr_strings.h" +#include "apr_lib.h" +#include "apr_hash.h" + +#define APR_WANT_STRFUNC +#include "apr_want.h" + +#include "ap_config.h" +#include "httpd.h" +#include "http_config.h" +#include "http_log.h" +#include "http_request.h" +#include "http_protocol.h" + +/* XXXX - fix me / EBCDIC + * there was a cludge here which would use its + * own version apr_isascii(). Indicating that + * on some platforms that might be needed. + * + * #define OS_ASC(c) (c) -- for mere mortals + * or + * #define OS_ASC(c) (ebcdic2ascii[c]) -- for dino's + * + * #define apr_isascii(c) ((OS_ASC(c) & 0x80) == 0) + */ + +/* XXXXX - fix me - See note with NOT_PROXY + */ + +typedef struct attrib_info { + char *name; + int offset; +} attrib_info; + +/* Information to which an extension can be mapped + */ +typedef struct extension_info { + char *forced_type; /* Additional AddTyped stuff */ + char *encoding_type; /* Added with AddEncoding... */ + char *language_type; /* Added with AddLanguage... */ + char *handler; /* Added with AddHandler... */ + char *charset_type; /* Added with AddCharset... */ + char *input_filters; /* Added with AddInputFilter... */ + char *output_filters; /* Added with AddOutputFilter... */ +} extension_info; + +#define MULTIMATCH_UNSET 0 +#define MULTIMATCH_ANY 1 +#define MULTIMATCH_NEGOTIATED 2 +#define MULTIMATCH_HANDLERS 4 +#define MULTIMATCH_FILTERS 8 + +typedef struct { + apr_hash_t *extension_mappings; /* Map from extension name to + * extension_info structure */ + + apr_array_header_t *remove_mappings; /* A simple list, walked once */ + + char *default_language; /* Language if no AddLanguage ext found */ + + int multimatch; /* Extensions to include in multiview matching + * for filenames, e.g. Filters and Handlers + */ + int use_path_info; /* If set to 0, only use filename. + * If set to 1, append PATH_INFO to filename for + * lookups. + * If set to 2, this value is unset and is + * effectively 0. + */ +} mime_dir_config; + +typedef struct param_s { + char *attr; + char *val; + struct param_s *next; +} param; + +typedef struct { + const char *type; + apr_size_t type_len; + const char *subtype; + apr_size_t subtype_len; + param *param; +} content_type; + +static char tspecial[] = { + '(', ')', '<', '>', '@', ',', ';', ':', + '\\', '"', '/', '[', ']', '?', '=', + '\0' +}; + +module AP_MODULE_DECLARE_DATA mime_module; + +static void *create_mime_dir_config(apr_pool_t *p, char *dummy) +{ + mime_dir_config *new = apr_palloc(p, sizeof(mime_dir_config)); + + new->extension_mappings = NULL; + new->remove_mappings = NULL; + + new->default_language = NULL; + + new->multimatch = MULTIMATCH_UNSET; + + new->use_path_info = 2; + + return new; +} +/* + * Overlay one hash table of extension_mappings onto another + */ +static void *overlay_extension_mappings(apr_pool_t *p, + const void *key, + apr_ssize_t klen, + const void *overlay_val, + const void *base_val, + const void *data) +{ + extension_info *new_info = apr_palloc(p, sizeof(extension_info)); + const extension_info *overlay_info = (const extension_info *)overlay_val; + const extension_info *base_info = (const extension_info *)base_val; + + memcpy(new_info, base_info, sizeof(extension_info)); + if (overlay_info->forced_type) { + new_info->forced_type = overlay_info->forced_type; + } + if (overlay_info->encoding_type) { + new_info->encoding_type = overlay_info->encoding_type; + } + if (overlay_info->language_type) { + new_info->language_type = overlay_info->language_type; + } + if (overlay_info->handler) { + new_info->handler = overlay_info->handler; + } + if (overlay_info->charset_type) { + new_info->charset_type = overlay_info->charset_type; + } + if (overlay_info->input_filters) { + new_info->input_filters = overlay_info->input_filters; + } + if (overlay_info->output_filters) { + new_info->output_filters = overlay_info->output_filters; + } + + return new_info; +} + +/* Member is the offset within an extension_info of the pointer to reset + */ +static void remove_items(apr_pool_t *p, apr_array_header_t *remove, + apr_hash_t *mappings) +{ + attrib_info *suffix = (attrib_info *) remove->elts; + int i; + for (i = 0; i < remove->nelts; i++) { + extension_info *exinfo = apr_hash_get(mappings, + suffix[i].name, + APR_HASH_KEY_STRING); + if (exinfo && *(const char**)((char *)exinfo + suffix[i].offset)) { + extension_info *copyinfo = exinfo; + exinfo = (extension_info*)apr_palloc(p, sizeof(*exinfo)); + apr_hash_set(mappings, suffix[i].name, + APR_HASH_KEY_STRING, exinfo); + memcpy(exinfo, copyinfo, sizeof(*exinfo)); + *(const char**)((char *)exinfo + suffix[i].offset) = NULL; + } + } +} + +static void *merge_mime_dir_configs(apr_pool_t *p, void *basev, void *addv) +{ + mime_dir_config *base = (mime_dir_config *)basev; + mime_dir_config *add = (mime_dir_config *)addv; + mime_dir_config *new = apr_palloc(p, sizeof(mime_dir_config)); + + if (base->extension_mappings && add->extension_mappings) { + new->extension_mappings = apr_hash_merge(p, add->extension_mappings, + base->extension_mappings, + overlay_extension_mappings, + NULL); + } + else { + if (base->extension_mappings == NULL) { + new->extension_mappings = add->extension_mappings; + } + else { + new->extension_mappings = base->extension_mappings; + } + /* We may not be merging the tables, but if we potentially will change + * an exinfo member, then we are about to trounce it anyways. + * We must have a copy for safety. + */ + if (new->extension_mappings && add->remove_mappings) { + new->extension_mappings = + apr_hash_copy(p, new->extension_mappings); + } + } + + if (new->extension_mappings) { + if (add->remove_mappings) + remove_items(p, add->remove_mappings, new->extension_mappings); + } + new->remove_mappings = NULL; + + new->default_language = add->default_language ? + add->default_language : base->default_language; + + new->multimatch = (add->multimatch != MULTIMATCH_UNSET) ? + add->multimatch : base->multimatch; + + if ((add->use_path_info & 2) == 0) { + new->use_path_info = add->use_path_info; + } + else { + new->use_path_info = base->use_path_info; + } + + return new; +} + +static const char *add_extension_info(cmd_parms *cmd, void *m_, + const char *value_, const char* ext) +{ + mime_dir_config *m=m_; + extension_info *exinfo; + int offset = (int) (long) cmd->info; + char *key = apr_pstrdup(cmd->temp_pool, ext); + char *value = apr_pstrdup(cmd->pool, value_); + ap_str_tolower(value); + ap_str_tolower(key); + + if (*key == '.') { + ++key; + } + if (!m->extension_mappings) { + m->extension_mappings = apr_hash_make(cmd->pool); + exinfo = NULL; + } + else { + exinfo = (extension_info*)apr_hash_get(m->extension_mappings, key, + APR_HASH_KEY_STRING); + } + if (!exinfo) { + exinfo = apr_pcalloc(cmd->pool, sizeof(extension_info)); + key = apr_pstrdup(cmd->pool, key); + apr_hash_set(m->extension_mappings, key, APR_HASH_KEY_STRING, exinfo); + } + *(const char**)((char *)exinfo + offset) = value; + return NULL; +} + +/* + * Note handler names are un-added with each per_dir_config merge. + * This keeps the association from being inherited, but not + * from being re-added at a subordinate level. + */ +static const char *remove_extension_info(cmd_parms *cmd, void *m_, + const char *ext) +{ + mime_dir_config *m = (mime_dir_config *) m_; + attrib_info *suffix; + if (*ext == '.') { + ++ext; + } + if (!m->remove_mappings) { + m->remove_mappings = apr_array_make(cmd->pool, 4, sizeof(*suffix)); + } + suffix = (attrib_info *)apr_array_push(m->remove_mappings); + suffix->name = apr_pstrdup(cmd->pool, ext); + ap_str_tolower(suffix->name); + suffix->offset = (int) (long) cmd->info; + return NULL; +} + +/* The sole bit of server configuration that the MIME module has is + * the name of its config file, so... + */ + +static const char *set_types_config(cmd_parms *cmd, void *dummy, + const char *arg) +{ + ap_set_module_config(cmd->server->module_config, &mime_module, + (void *)arg); + return NULL; +} + +static const char *multiviews_match(cmd_parms *cmd, void *m_, + const char *include) +{ + mime_dir_config *m = (mime_dir_config *) m_; + + if (strcasecmp(include, "Any") == 0) { + if (m->multimatch && (m->multimatch & ~MULTIMATCH_ANY)) { + return "Any is incompatible with NegotiatedOnly, " + "Filters and Handlers"; + } + m->multimatch |= MULTIMATCH_ANY; + } + else if (strcasecmp(include, "NegotiatedOnly") == 0) { + if (m->multimatch && (m->multimatch & ~MULTIMATCH_NEGOTIATED)) { + return "Any is incompatible with NegotiatedOnly, " + "Filters and Handlers"; + } + m->multimatch |= MULTIMATCH_NEGOTIATED; + } + else if (strcasecmp(include, "Filters") == 0) { + if (m->multimatch && (m->multimatch & (MULTIMATCH_NEGOTIATED + | MULTIMATCH_ANY))) { + return "Filters is incompatible with Any and NegotiatedOnly"; + } + m->multimatch |= MULTIMATCH_FILTERS; + } + else if (strcasecmp(include, "Handlers") == 0) { + if (m->multimatch && (m->multimatch & (MULTIMATCH_NEGOTIATED + | MULTIMATCH_ANY))) { + return "Handlers is incompatible with Any and NegotiatedOnly"; + } + m->multimatch |= MULTIMATCH_HANDLERS; + } + else { + return "Unrecognized option"; + } + + return NULL; +} + +static const command_rec mime_cmds[] = +{ + AP_INIT_ITERATE2("AddCharset", add_extension_info, + (void *)APR_OFFSETOF(extension_info, charset_type), OR_FILEINFO, + "a charset (e.g., iso-2022-jp), followed by one or more " + "file extensions"), + AP_INIT_ITERATE2("AddEncoding", add_extension_info, + (void *)APR_OFFSETOF(extension_info, encoding_type), OR_FILEINFO, + "an encoding (e.g., gzip), followed by one or more file extensions"), + AP_INIT_ITERATE2("AddHandler", add_extension_info, + (void *)APR_OFFSETOF(extension_info, handler), OR_FILEINFO, + "a handler name followed by one or more file extensions"), + AP_INIT_ITERATE2("AddInputFilter", add_extension_info, + (void *)APR_OFFSETOF(extension_info, input_filters), OR_FILEINFO, + "input filter name (or ; delimited names) followed by one or " + "more file extensions"), + AP_INIT_ITERATE2("AddLanguage", add_extension_info, + (void *)APR_OFFSETOF(extension_info, language_type), OR_FILEINFO, + "a language (e.g., fr), followed by one or more file extensions"), + AP_INIT_ITERATE2("AddOutputFilter", add_extension_info, + (void *)APR_OFFSETOF(extension_info, output_filters), OR_FILEINFO, + "output filter name (or ; delimited names) followed by one or " + "more file extensions"), + AP_INIT_ITERATE2("AddType", add_extension_info, + (void *)APR_OFFSETOF(extension_info, forced_type), OR_FILEINFO, + "a mime type followed by one or more file extensions"), + AP_INIT_TAKE1("DefaultLanguage", ap_set_string_slot, + (void*)APR_OFFSETOF(mime_dir_config, default_language), OR_FILEINFO, + "language to use for documents with no other language file extension"), + AP_INIT_ITERATE("MultiviewsMatch", multiviews_match, NULL, OR_FILEINFO, + "NegotiatedOnly (default), Handlers and/or Filters, or Any"), + AP_INIT_ITERATE("RemoveCharset", remove_extension_info, + (void *)APR_OFFSETOF(extension_info, charset_type), OR_FILEINFO, + "one or more file extensions"), + AP_INIT_ITERATE("RemoveEncoding", remove_extension_info, + (void *)APR_OFFSETOF(extension_info, encoding_type), OR_FILEINFO, + "one or more file extensions"), + AP_INIT_ITERATE("RemoveHandler", remove_extension_info, + (void *)APR_OFFSETOF(extension_info, handler), OR_FILEINFO, + "one or more file extensions"), + AP_INIT_ITERATE("RemoveInputFilter", remove_extension_info, + (void *)APR_OFFSETOF(extension_info, input_filters), OR_FILEINFO, + "one or more file extensions"), + AP_INIT_ITERATE("RemoveLanguage", remove_extension_info, + (void *)APR_OFFSETOF(extension_info, language_type), OR_FILEINFO, + "one or more file extensions"), + AP_INIT_ITERATE("RemoveOutputFilter", remove_extension_info, + (void *)APR_OFFSETOF(extension_info, output_filters), OR_FILEINFO, + "one or more file extensions"), + AP_INIT_ITERATE("RemoveType", remove_extension_info, + (void *)APR_OFFSETOF(extension_info, forced_type), OR_FILEINFO, + "one or more file extensions"), + AP_INIT_TAKE1("TypesConfig", set_types_config, NULL, RSRC_CONF, + "the MIME types config file"), + AP_INIT_FLAG("ModMimeUsePathInfo", ap_set_flag_slot, + (void *)APR_OFFSETOF(mime_dir_config, use_path_info), ACCESS_CONF, + "Set to 'yes' to allow mod_mime to use path info for type checking"), + {NULL} +}; + +static apr_hash_t *mime_type_extensions; + +static int mime_post_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s) +{ + ap_configfile_t *f; + char l[MAX_STRING_LEN]; + const char *types_confname = ap_get_module_config(s->module_config, + &mime_module); + apr_status_t status; + + if (!types_confname) { + types_confname = AP_TYPES_CONFIG_FILE; + } + + types_confname = ap_server_root_relative(p, types_confname); + if (!types_confname) { + ap_log_error(APLOG_MARK, APLOG_ERR, APR_EBADPATH, s, + "Invalid mime types config path %s", + (const char *)ap_get_module_config(s->module_config, + &mime_module)); + return HTTP_INTERNAL_SERVER_ERROR; + } + if ((status = ap_pcfg_openfile(&f, ptemp, types_confname)) + != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, status, s, + "could not open mime types config file %s.", + types_confname); + return HTTP_INTERNAL_SERVER_ERROR; + } + + mime_type_extensions = apr_hash_make(p); + + while (!(ap_cfg_getline(l, MAX_STRING_LEN, f))) { + const char *ll = l, *ct; + + if (l[0] == '#') { + continue; + } + ct = ap_getword_conf(p, &ll); + + while (ll[0]) { + char *ext = ap_getword_conf(p, &ll); + ap_str_tolower(ext); + apr_hash_set(mime_type_extensions, ext, APR_HASH_KEY_STRING, ct); + } + } + ap_cfg_closefile(f); + return OK; +} + +static const char *zap_sp(const char *s) +{ + if (s == NULL) { + return (NULL); + } + if (*s == '\0') { + return (s); + } + + /* skip prefixed white space */ + for (; *s == ' ' || *s == '\t' || *s == '\n'; s++) + ; + + return (s); +} + +static char *zap_sp_and_dup(apr_pool_t *p, const char *start, + const char *end, apr_size_t *len) +{ + while ((start < end) && apr_isspace(*start)) { + start++; + } + while ((end > start) && apr_isspace(*(end - 1))) { + end--; + } + if (len) { + *len = end - start; + } + return apr_pstrmemdup(p, start, end - start); +} + +static int is_token(char c) +{ + int res; + + res = (apr_isascii(c) && apr_isgraph(c) + && (strchr(tspecial, c) == NULL)) ? 1 : -1; + return res; +} + +static int is_qtext(char c) +{ + int res; + + res = (apr_isascii(c) && (c != '"') && (c != '\\') && (c != '\n')) + ? 1 : -1; + return res; +} + +static int is_quoted_pair(const char *s) +{ + int res = -1; + int c; + + if (((s + 1) != NULL) && (*s == '\\')) { + c = (int) *(s + 1); + if (apr_isascii(c)) { + res = 1; + } + } + return (res); +} + +static content_type *analyze_ct(request_rec *r, const char *s) +{ + const char *cp, *mp; + char *attribute, *value; + int quoted = 0; + server_rec * ss = r->server; + apr_pool_t * p = r->pool; + + content_type *ctp; + param *pp, *npp; + + /* initialize ctp */ + ctp = (content_type *)apr_palloc(p, sizeof(content_type)); + ctp->type = NULL; + ctp->subtype = NULL; + ctp->param = NULL; + + mp = s; + + /* getting a type */ + cp = mp; + while (apr_isspace(*cp)) { + cp++; + } + if (!*cp) { + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, ss, + "mod_mime: analyze_ct: cannot get media type from '%s'", + (const char *) mp); + return (NULL); + } + ctp->type = cp; + do { + cp++; + } while (*cp && (*cp != '/') && !apr_isspace(*cp) && (*cp != ';')); + if (!*cp || (*cp == ';')) { + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, ss, + "Cannot get media type from '%s'", + (const char *) mp); + return (NULL); + } + while (apr_isspace(*cp)) { + cp++; + } + if (*cp != '/') { + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, ss, + "mod_mime: analyze_ct: cannot get media type from '%s'", + (const char *) mp); + return (NULL); + } + ctp->type_len = cp - ctp->type; + + cp++; /* skip the '/' */ + + /* getting a subtype */ + while (apr_isspace(*cp)) { + cp++; + } + if (!*cp) { + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, ss, + "Cannot get media subtype."); + return (NULL); + } + ctp->subtype = cp; + do { + cp++; + } while (*cp && !apr_isspace(*cp) && (*cp != ';')); + ctp->subtype_len = cp - ctp->subtype; + while (apr_isspace(*cp)) { + cp++; + } + + if (*cp == '\0') { + return (ctp); + } + + /* getting parameters */ + cp++; /* skip the ';' */ + cp = zap_sp(cp); + if (cp == NULL || *cp == '\0') { + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, ss, + "Cannot get media parameter."); + return (NULL); + } + mp = cp; + attribute = NULL; + value = NULL; + + while (cp != NULL && *cp != '\0') { + if (attribute == NULL) { + if (is_token(*cp) > 0) { + cp++; + continue; + } + else if (*cp == ' ' || *cp == '\t' || *cp == '\n') { + cp++; + continue; + } + else if (*cp == '=') { + attribute = zap_sp_and_dup(p, mp, cp, NULL); + if (attribute == NULL || *attribute == '\0') { + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, ss, + "Cannot get media parameter."); + return (NULL); + } + cp++; + cp = zap_sp(cp); + if (cp == NULL || *cp == '\0') { + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, ss, + "Cannot get media parameter."); + return (NULL); + } + mp = cp; + continue; + } + else { + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, ss, + "Cannot get media parameter."); + return (NULL); + } + } + else { + if (mp == cp) { + if (*cp == '"') { + quoted = 1; + cp++; + } + else { + quoted = 0; + } + } + if (quoted > 0) { + while (quoted && *cp != '\0') { + if (is_qtext(*cp) > 0) { + cp++; + } + else if (is_quoted_pair(cp) > 0) { + cp += 2; + } + else if (*cp == '"') { + cp++; + while (*cp == ' ' || *cp == '\t' || *cp == '\n') { + cp++; + } + if (*cp != ';' && *cp != '\0') { + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, ss, + "Cannot get media parameter."); + return(NULL); + } + quoted = 0; + } + else { + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, ss, + "Cannot get media parameter."); + return (NULL); + } + } + } + else { + while (1) { + if (is_token(*cp) > 0) { + cp++; + } + else if (*cp == '\0' || *cp == ';') { + break; + } + else { + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, ss, + "Cannot get media parameter."); + return (NULL); + } + } + } + value = zap_sp_and_dup(p, mp, cp, NULL); + if (value == NULL || *value == '\0') { + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, ss, + "Cannot get media parameter."); + return (NULL); + } + + pp = apr_palloc(p, sizeof(param)); + pp->attr = attribute; + pp->val = value; + pp->next = NULL; + + if (ctp->param == NULL) { + ctp->param = pp; + } + else { + npp = ctp->param; + while (npp->next) { + npp = npp->next; + } + npp->next = pp; + } + quoted = 0; + attribute = NULL; + value = NULL; + if (*cp == '\0') { + break; + } + cp++; + mp = cp; + } + } + return (ctp); +} + +/* + * find_ct is the hook routine for determining content-type and other + * MIME-related metadata. It assumes that r->filename has already been + * set and stat has been called for r->finfo. It also assumes that the + * non-path base file name is not the empty string unless it is a dir. + */ +static int find_ct(request_rec *r) +{ + mime_dir_config *conf; + apr_array_header_t *exception_list; + char *ext; + const char *fn, *type, *charset = NULL, *resource_name; + int found_metadata = 0; + + if (r->finfo.filetype == APR_DIR) { + ap_set_content_type(r, DIR_MAGIC_TYPE); + return OK; + } + + if (!r->filename) { + return DECLINED; + } + + conf = (mime_dir_config *)ap_get_module_config(r->per_dir_config, + &mime_module); + exception_list = apr_array_make(r->pool, 2, sizeof(char *)); + + /* If use_path_info is explicitly set to on (value & 1 == 1), append. */ + if (conf->use_path_info & 1) { + resource_name = apr_pstrcat(r->pool, r->filename, r->path_info, NULL); + } + else { + resource_name = r->filename; + } + + /* Always drop the path leading up to the file name. + */ + if ((fn = ap_strrchr_c(resource_name, '/')) == NULL) { + fn = resource_name; + } + else { + ++fn; + } + + /* The exception list keeps track of those filename components that + * are not associated with extensions indicating metadata. + * The base name is always the first exception (i.e., "txt.html" has + * a basename of "txt" even though it might look like an extension). + */ + ext = ap_getword(r->pool, &fn, '.'); + *((const char **)apr_array_push(exception_list)) = ext; + + /* Parse filename extensions which can be in any order + */ + while (*fn && (ext = ap_getword(r->pool, &fn, '.'))) { + const extension_info *exinfo = NULL; + int found; + + if (*ext == '\0') { /* ignore empty extensions "bad..html" */ + continue; + } + + found = 0; + + ap_str_tolower(ext); + + if (conf->extension_mappings != NULL) { + exinfo = (extension_info*)apr_hash_get(conf->extension_mappings, + ext, APR_HASH_KEY_STRING); + } + + if (exinfo == NULL || !exinfo->forced_type) { + if ((type = apr_hash_get(mime_type_extensions, ext, + APR_HASH_KEY_STRING)) != NULL) { + ap_set_content_type(r, (char*) type); + found = 1; + } + } + + if (exinfo != NULL) { + + if (exinfo->forced_type) { + ap_set_content_type(r, exinfo->forced_type); + found = 1; + } + + if (exinfo->charset_type) { + charset = exinfo->charset_type; + found = 1; + } + if (exinfo->language_type) { + if (!r->content_languages) { + r->content_languages = apr_array_make(r->pool, 2, + sizeof(char *)); + } + *((const char **)apr_array_push(r->content_languages)) + = exinfo->language_type; + found = 1; + } + if (exinfo->encoding_type) { + if (!r->content_encoding) { + r->content_encoding = exinfo->encoding_type; + } + else { + /* XXX should eliminate duplicate entities */ + r->content_encoding = apr_pstrcat(r->pool, + r->content_encoding, + ", ", + exinfo->encoding_type, + NULL); + } + found = 1; + } + /* The following extensions are not 'Found'. That is, they don't + * make any contribution to metadata negotation, so they must have + * been explicitly requested by name. + */ + if (exinfo->handler && r->proxyreq == PROXYREQ_NONE) { + r->handler = exinfo->handler; + if (conf->multimatch & MULTIMATCH_HANDLERS) { + found = 1; + } + } + /* XXX Two significant problems; 1, we don't check to see if we are + * setting redundant filters. 2, we insert these in the types config + * hook, which may be too early (dunno.) + */ + if (exinfo->input_filters && r->proxyreq == PROXYREQ_NONE) { + const char *filter, *filters = exinfo->input_filters; + while (*filters + && (filter = ap_getword(r->pool, &filters, ';'))) { + ap_add_input_filter(filter, NULL, r, r->connection); + } + if (conf->multimatch & MULTIMATCH_FILTERS) { + found = 1; + } + } + if (exinfo->output_filters && r->proxyreq == PROXYREQ_NONE) { + const char *filter, *filters = exinfo->output_filters; + while (*filters + && (filter = ap_getword(r->pool, &filters, ';'))) { + ap_add_output_filter(filter, NULL, r, r->connection); + } + if (conf->multimatch & MULTIMATCH_FILTERS) { + found = 1; + } + } + } + + if (found || (conf->multimatch & MULTIMATCH_ANY)) { + found_metadata = 1; + } + else { + *((const char **) apr_array_push(exception_list)) = ext; + } + } + + /* + * Need to set a notes entry on r for unrecognized elements. + * Somebody better claim them! If we did absolutely nothing, + * skip the notes to alert mod_negotiation we are clueless. + */ + if (found_metadata) { + apr_table_setn(r->notes, "ap-mime-exceptions-list", + (void *)exception_list); + } + + if (r->content_type) { + content_type *ctp; + int override = 0; + + if ((ctp = analyze_ct(r, r->content_type))) { + param *pp = ctp->param; + char *base_content_type = apr_palloc(r->pool, ctp->type_len + + ctp->subtype_len + + sizeof("/")); + char *tmp = base_content_type; + memcpy(tmp, ctp->type, ctp->type_len); + tmp += ctp->type_len; + *tmp++ = '/'; + memcpy(tmp, ctp->subtype, ctp->subtype_len); + tmp += ctp->subtype_len; + *tmp = 0; + ap_set_content_type(r, base_content_type); + while (pp != NULL) { + if (charset && !strcmp(pp->attr, "charset")) { + if (!override) { + ap_set_content_type(r, + apr_pstrcat(r->pool, + r->content_type, + "; charset=", + charset, + NULL)); + override = 1; + } + } + else { + ap_set_content_type(r, + apr_pstrcat(r->pool, + r->content_type, + "; ", pp->attr, + "=", pp->val, + NULL)); + } + pp = pp->next; + } + if (charset && !override) { + ap_set_content_type(r, apr_pstrcat(r->pool, r->content_type, + "; charset=", charset, + NULL)); + } + } + } + + /* Set default language, if none was specified by the extensions + * and we have a DefaultLanguage setting in force + */ + + if (!r->content_languages && conf->default_language) { + const char **new; + + if (!r->content_languages) { + r->content_languages = apr_array_make(r->pool, 2, sizeof(char *)); + } + new = (const char **)apr_array_push(r->content_languages); + *new = conf->default_language; + } + + if (!r->content_type) { + return DECLINED; + } + + return OK; +} + +static void register_hooks(apr_pool_t *p) +{ + ap_hook_post_config(mime_post_config,NULL,NULL,APR_HOOK_MIDDLE); + ap_hook_type_checker(find_ct,NULL,NULL,APR_HOOK_MIDDLE); + /* + * this hook seems redundant ... is there any reason a type checker isn't + * allowed to do this already? I'd think that fixups in general would be + * the last opportunity to get the filters right. + * ap_hook_insert_filter(mime_insert_filters,NULL,NULL,APR_HOOK_MIDDLE); + */ +} + +module AP_MODULE_DECLARE_DATA mime_module = { + STANDARD20_MODULE_STUFF, + create_mime_dir_config, /* create per-directory config structure */ + merge_mime_dir_configs, /* merge per-directory config structures */ + NULL, /* create per-server config structure */ + NULL, /* merge per-server config structures */ + mime_cmds, /* command apr_table_t */ + register_hooks /* register hooks */ +}; diff --git a/rubbos/app/httpd-2.0.64/modules/http/mod_mime.dsp b/rubbos/app/httpd-2.0.64/modules/http/mod_mime.dsp new file mode 100644 index 00000000..2d50e032 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/http/mod_mime.dsp @@ -0,0 +1,128 @@ +# Microsoft Developer Studio Project File - Name="mod_mime" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=mod_mime - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "mod_mime.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 "mod_mime.mak" CFG="mod_mime - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "mod_mime - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_mime - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "mod_mime - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_mime_src" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /out:"Release/mod_mime.so" /base:@..\..\os\win32\BaseAddr.ref,mod_mime.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Release/mod_mime.so" /base:@..\..\os\win32\BaseAddr.ref,mod_mime.so /opt:ref + +!ELSEIF "$(CFG)" == "mod_mime - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_mime_src" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_mime.so" /base:@..\..\os\win32\BaseAddr.ref,mod_mime.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_mime.so" /base:@..\..\os\win32\BaseAddr.ref,mod_mime.so + +!ENDIF + +# Begin Target + +# Name "mod_mime - Win32 Release" +# Name "mod_mime - Win32 Debug" +# Begin Source File + +SOURCE=.\mod_mime.c +# End Source File +# Begin Source File + +SOURCE=.\mod_mime.rc +# End Source File +# Begin Source File + +SOURCE=..\..\build\win32\win32ver.awk + +!IF "$(CFG)" == "mod_mime - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_mime.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_mime.so "mime_module for Apache" ../../include/ap_release.h > .\mod_mime.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "mod_mime - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_mime.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_mime.so "mime_module for Apache" ../../include/ap_release.h > .\mod_mime.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/modules/http/mod_mime.exp b/rubbos/app/httpd-2.0.64/modules/http/mod_mime.exp new file mode 100644 index 00000000..f2e38dbd --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/http/mod_mime.exp @@ -0,0 +1 @@ +mime_module diff --git a/rubbos/app/httpd-2.0.64/modules/http/mod_mime.la b/rubbos/app/httpd-2.0.64/modules/http/mod_mime.la new file mode 100644 index 00000000..854bb02d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/http/mod_mime.la @@ -0,0 +1,35 @@ +# mod_mime.la - a libtool library file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='' + +# Names of this library. +library_names='' + +# The name of the static archive. +old_library='mod_mime.a' + +# Libraries that this one depends upon. +dependency_libs=' -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib' + +# Version information for mod_mime. +current= +age= +revision= + +# Is this an already installed library? +installed=no + +# Should we warn about portability when linking against -modules? +shouldnotlink=yes + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='' diff --git a/rubbos/app/httpd-2.0.64/modules/http/mod_mime.lo b/rubbos/app/httpd-2.0.64/modules/http/mod_mime.lo new file mode 100644 index 00000000..e64d8500 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/http/mod_mime.lo @@ -0,0 +1,12 @@ +# mod_mime.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/mod_mime.o' + +# Name of the non-PIC object. +non_pic_object='mod_mime.o' + diff --git a/rubbos/app/httpd-2.0.64/modules/http/mod_mime.o b/rubbos/app/httpd-2.0.64/modules/http/mod_mime.o new file mode 100644 index 0000000000000000000000000000000000000000..dae6c77be9babb62e8e71200f119f5bfeda53037 GIT binary patch literal 75064 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 T?ZuvBT*tY8Zwuh`b{_Tr$M4`Y literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/modules/http/modules.mk b/rubbos/app/httpd-2.0.64/modules/http/modules.mk new file mode 100644 index 00000000..a94da85b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/http/modules.mk @@ -0,0 +1,7 @@ +mod_http.la: http_core.lo http_protocol.lo http_request.lo + $(MOD_LINK) http_core.lo http_protocol.lo http_request.lo $(MOD_HTTP_LDADD) +mod_mime.la: mod_mime.lo + $(MOD_LINK) mod_mime.lo $(MOD_MIME_LDADD) +DISTCLEAN_TARGETS = modules.mk +static = mod_http.la mod_mime.la +shared = diff --git a/rubbos/app/httpd-2.0.64/modules/loggers/.deps b/rubbos/app/httpd-2.0.64/modules/loggers/.deps new file mode 100644 index 00000000..e69de29b diff --git a/rubbos/app/httpd-2.0.64/modules/loggers/.indent.pro b/rubbos/app/httpd-2.0.64/modules/loggers/.indent.pro new file mode 100644 index 00000000..a9fbe9f9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/loggers/.indent.pro @@ -0,0 +1,54 @@ +-i4 -npsl -di0 -br -nce -d0 -cli0 -npcs -nfc1 +-TBUFF +-TFILE +-TTRANS +-TUINT4 +-T_trans +-Tallow_options_t +-Tapache_sfio +-Tarray_header +-Tbool_int +-Tbuf_area +-Tbuff_struct +-Tbuffy +-Tcmd_how +-Tcmd_parms +-Tcommand_rec +-Tcommand_struct +-Tconn_rec +-Tcore_dir_config +-Tcore_server_config +-Tdir_maker_func +-Tevent +-Tglobals_s +-Thandler_func +-Thandler_rec +-Tjoblist_s +-Tlisten_rec +-Tmerger_func +-Tmode_t +-Tmodule +-Tmodule_struct +-Tmutex +-Tn_long +-Tother_child_rec +-Toverrides_t +-Tparent_score +-Tpid_t +-Tpiped_log +-Tpool +-Trequest_rec +-Trequire_line +-Trlim_t +-Tscoreboard +-Tsemaphore +-Tserver_addr_rec +-Tserver_rec +-Tserver_rec_chain +-Tshort_score +-Ttable +-Ttable_entry +-Tthread +-Tu_wide_int +-Tvtime_t +-Twide_int diff --git a/rubbos/app/httpd-2.0.64/modules/loggers/.libs/mod_log_config.a b/rubbos/app/httpd-2.0.64/modules/loggers/.libs/mod_log_config.a new file mode 100644 index 0000000000000000000000000000000000000000..a9e57678f688e9630b509b0eb26e9e796ec39bdc GIT binary patch literal 121544 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 D(ky%) literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/modules/loggers/.libs/mod_log_config.la b/rubbos/app/httpd-2.0.64/modules/loggers/.libs/mod_log_config.la new file mode 100644 index 00000000..e08ddd31 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/loggers/.libs/mod_log_config.la @@ -0,0 +1,35 @@ +# mod_log_config.la - a libtool library file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='' + +# Names of this library. +library_names='' + +# The name of the static archive. +old_library='mod_log_config.a' + +# Libraries that this one depends upon. +dependency_libs=' -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib' + +# Version information for mod_log_config. +current= +age= +revision= + +# Is this an already installed library? +installed=no + +# Should we warn about portability when linking against -modules? +shouldnotlink=yes + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='' diff --git a/rubbos/app/httpd-2.0.64/modules/loggers/.libs/mod_log_config.o b/rubbos/app/httpd-2.0.64/modules/loggers/.libs/mod_log_config.o new file mode 100644 index 0000000000000000000000000000000000000000..55dc12bcca96a0098e80505ce6ede67baf1d811f GIT binary patch literal 121312 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 + * LogFormat "... custom format ..." + * TransferLog log/virtual_only + * CustomLog log/virtual_useragents "%t %{user-agent}i" + * + * + * This will log using CLF to access_log any requests handled by the + * main server, while any requests to the virtual host will be logged + * with the "... custom format..." to virtual_only _AND_ using + * the custom user-agent log to virtual_useragents. + * + * Note that the NCSA referer and user-agent logs are easily added with + * CustomLog: + * CustomLog logs/referer "%{referer}i -> %U" + * CustomLog logs/agent "%{user-agent}i" + * + * RefererIgnore functionality can be obtained with conditional + * logging (SetEnvIf and CustomLog ... env=!VAR). + * + * But using this method allows much easier modification of the + * log format, e.g. to log hosts along with UA: + * CustomLog logs/referer "%{referer}i %U %h" + * + * The argument to LogFormat and CustomLog is a string, which can include + * literal characters copied into the log files, and '%' directives as + * follows: + * + * %...B: bytes sent, excluding HTTP headers. + * %...b: bytes sent, excluding HTTP headers in CLF format, i.e. a '-' + * when no bytes where sent (rather than a '0'. + * %...{FOOBAR}C: The contents of the HTTP cookie FOOBAR + * %...{FOOBAR}e: The contents of the environment variable FOOBAR + * %...f: filename + * %...h: remote host + * %...a: remote IP-address + * %...A: local IP-address + * %...{Foobar}i: The contents of Foobar: header line(s) in the request + * sent to the client. + * %...l: remote logname (from identd, if supplied) + * %...{Foobar}n: The contents of note "Foobar" from another module. + * %...{Foobar}o: The contents of Foobar: header line(s) in the reply. + * %...p: the port the request was served to + * %...P: the process ID of the child that serviced the request. + * %...{format}P: the process ID or thread ID of the child/thread that + * serviced the request + * %...r: first line of request + * %...s: status. For requests that got internally redirected, this + * is status of the *original* request --- %...>s for the last. + * %...t: time, in common log format time format + * %...{format}t: The time, in the form given by format, which should + * be in strftime(3) format. + * %...T: the time taken to serve the request, in seconds. + * %...D: the time taken to serve the request, in micro seconds. + * %...u: remote user (from auth; may be bogus if return status (%s) is 401) + * %...U: the URL path requested. + * %...v: the configured name of the server (i.e. which virtual host?) + * %...V: the server name according to the UseCanonicalName setting + * %...m: the request method + * %...H: the request protocol + * %...q: the query string prepended by "?", or empty if no query string + * %...X: Status of the connection. + * 'X' = connection aborted before the response completed. + * '+' = connection may be kept alive after the response is sent. + * '-' = connection will be closed after the response is sent. + (This directive was %...c in late versions of Apache 1.3, but + this conflicted with the historical ssl %...{var}c syntax.) +* + * The '...' can be nothing at all (e.g. "%h %u %r %s %b"), or it can + * indicate conditions for inclusion of the item (which will cause it + * to be replaced with '-' if the condition is not met). Note that + * there is no escaping performed on the strings from %r, %...i and + * %...o; some with long memories may remember that I thought this was + * a bad idea, once upon a time, and I'm still not comfortable with + * it, but it is difficult to see how to "do the right thing" with all + * of '%..i', unless we URL-escape everything and break with CLF. + * + * The forms of condition are a list of HTTP status codes, which may + * or may not be preceded by '!'. Thus, '%400,501{User-agent}i' logs + * User-agent: on 400 errors and 501 errors (Bad Request, Not + * Implemented) only; '%!200,304,302{Referer}i' logs Referer: on all + * requests which did *not* return some sort of normal status. + * + * The default LogFormat reproduces CLF; see below. + * + * The way this is supposed to work with virtual hosts is as follows: + * a virtual host can have its own LogFormat, or its own TransferLog. + * If it doesn't have its own LogFormat, it inherits from the main + * server. If it doesn't have its own TransferLog, it writes to the + * same descriptor (meaning the same process for "| ..."). + * + * --- rst */ + +#include "apr_strings.h" +#include "apr_lib.h" +#include "apr_hash.h" +#include "apr_optional.h" +#include "apr_anylock.h" + +#define APR_WANT_STRFUNC +#include "apr_want.h" + +#include "ap_config.h" +#include "mod_log_config.h" +#include "httpd.h" +#include "http_config.h" +#include "http_core.h" /* For REMOTE_NAME */ +#include "http_log.h" +#include "http_protocol.h" +#include "util_time.h" +#include "ap_mpm.h" + +#if APR_HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_LIMITS_H +#include +#endif + +#define DEFAULT_LOG_FORMAT "%h %l %u %t \"%r\" %>s %b" + +module AP_MODULE_DECLARE_DATA log_config_module; + +#ifndef APR_LARGEFILE +#define APR_LARGEFILE 0 +#endif + +static int xfer_flags = (APR_WRITE | APR_APPEND | APR_CREATE | APR_LARGEFILE); +static apr_fileperms_t xfer_perms = APR_OS_DEFAULT; +static apr_hash_t *log_hash; +static apr_status_t ap_default_log_writer(request_rec *r, + void *handle, + const char **strs, + int *strl, + int nelts, + apr_size_t len); +static apr_status_t ap_buffered_log_writer(request_rec *r, + void *handle, + const char **strs, + int *strl, + int nelts, + apr_size_t len); +static void *ap_default_log_writer_init(apr_pool_t *p, server_rec *s, + const char* name); +static void *ap_buffered_log_writer_init(apr_pool_t *p, server_rec *s, + const char* name); + +static void ap_log_set_writer_init(ap_log_writer_init *handle); +static void ap_log_set_writer(ap_log_writer *handle); +static ap_log_writer *log_writer = ap_default_log_writer; +static ap_log_writer_init *log_writer_init = ap_default_log_writer_init; +static int buffered_logs = 0; /* default unbuffered */ +static apr_array_header_t *all_buffered_logs = NULL; + +/* POSIX.1 defines PIPE_BUF as the maximum number of bytes that is + * guaranteed to be atomic when writing a pipe. And PIPE_BUF >= 512 + * is guaranteed. So we'll just guess 512 in the event the system + * doesn't have this. Now, for file writes there is actually no limit, + * the entire write is atomic. Whether all systems implement this + * correctly is another question entirely ... so we'll just use PIPE_BUF + * because it's probably a good guess as to what is implemented correctly + * everywhere. + */ +#ifdef PIPE_BUF +#define LOG_BUFSIZE PIPE_BUF +#else +#define LOG_BUFSIZE (512) +#endif + +/* + * multi_log_state is our per-(virtual)-server configuration. We store + * an array of the logs we are going to use, each of type config_log_state. + * If a default log format is given by LogFormat, store in default_format + * (backward compat. with mod_log_config). We also store for each virtual + * server a pointer to the logs specified for the main server, so that if this + * vhost has no logs defined, we can use the main server's logs instead. + * + * So, for the main server, config_logs contains a list of the log files + * and server_config_logs is empty. For a vhost, server_config_logs + * points to the same array as config_logs in the main server, and + * config_logs points to the array of logs defined inside this vhost, + * which might be empty. + */ + +typedef struct { + const char *default_format_string; + apr_array_header_t *default_format; + apr_array_header_t *config_logs; + apr_array_header_t *server_config_logs; + apr_table_t *formats; +} multi_log_state; + +/* + * config_log_state holds the status of a single log file. fname might + * be NULL, which means this module does no logging for this + * request. format might be NULL, in which case the default_format + * from the multi_log_state should be used, or if that is NULL as + * well, use the CLF. + * log_writer is NULL before the log file is opened and is + * set to a opaque structure (usually a fd) after it is opened. + + */ +typedef struct { + apr_file_t *handle; + apr_size_t outcnt; + char outbuf[LOG_BUFSIZE]; + apr_anylock_t mutex; +} buffered_log; + +typedef struct { + const char *fname; + const char *format_string; + apr_array_header_t *format; + void *log_writer; + char *condition_var; +} config_log_state; + +/* + * Format items... + * Note that many of these could have ap_sprintfs replaced with static buffers. + */ + +typedef struct { + ap_log_handler_fn_t *func; + char *arg; + int condition_sense; + int want_orig; + apr_array_header_t *conditions; +} log_format_item; + +static char *format_integer(apr_pool_t *p, int i) +{ + return apr_itoa(p, i); +} + +static char *pfmt(apr_pool_t *p, int i) +{ + if (i <= 0) { + return "-"; + } + else { + return format_integer(p, i); + } +} + +static const char *constant_item(request_rec *dummy, char *stuff) +{ + return stuff; +} + +static const char *log_remote_host(request_rec *r, char *a) +{ + return ap_escape_logitem(r->pool, ap_get_remote_host(r->connection, + r->per_dir_config, + REMOTE_NAME, NULL)); +} + +static const char *log_remote_address(request_rec *r, char *a) +{ + return r->connection->remote_ip; +} + +static const char *log_local_address(request_rec *r, char *a) +{ + return r->connection->local_ip; +} + +static const char *log_remote_logname(request_rec *r, char *a) +{ + return ap_escape_logitem(r->pool, ap_get_remote_logname(r)); +} + +static const char *log_remote_user(request_rec *r, char *a) +{ + char *rvalue = r->user; + + if (rvalue == NULL) { + rvalue = "-"; + } + else if (strlen(rvalue) == 0) { + rvalue = "\"\""; + } + else { + rvalue = ap_escape_logitem(r->pool, rvalue); + } + + return rvalue; +} + +static const char *log_request_line(request_rec *r, char *a) +{ + /* NOTE: If the original request contained a password, we + * re-write the request line here to contain XXXXXX instead: + * (note the truncation before the protocol string for HTTP/0.9 requests) + * (note also that r->the_request contains the unmodified request) + */ + return ap_escape_logitem(r->pool, + (r->parsed_uri.password) + ? apr_pstrcat(r->pool, r->method, " ", + apr_uri_unparse(r->pool, + &r->parsed_uri, 0), + r->assbackwards ? NULL : " ", + r->protocol, NULL) + : r->the_request); +} + +static const char *log_request_file(request_rec *r, char *a) +{ + return ap_escape_logitem(r->pool, r->filename); +} +static const char *log_request_uri(request_rec *r, char *a) +{ + return ap_escape_logitem(r->pool, r->uri); +} +static const char *log_request_method(request_rec *r, char *a) +{ + return ap_escape_logitem(r->pool, r->method); +} +static const char *log_request_protocol(request_rec *r, char *a) +{ + return ap_escape_logitem(r->pool, r->protocol); +} +static const char *log_request_query(request_rec *r, char *a) +{ + return (r->args) ? apr_pstrcat(r->pool, "?", + ap_escape_logitem(r->pool, r->args), NULL) + : ""; +} +static const char *log_status(request_rec *r, char *a) +{ + return pfmt(r->pool, r->status); +} + +static const char *clf_log_bytes_sent(request_rec *r, char *a) +{ + if (!r->sent_bodyct || !r->bytes_sent) { + return "-"; + } + else { + return apr_off_t_toa(r->pool, r->bytes_sent); + } +} + +static const char *log_bytes_sent(request_rec *r, char *a) +{ + if (!r->sent_bodyct || !r->bytes_sent) { + return "0"; + } + else { + return apr_psprintf(r->pool, "%" APR_OFF_T_FMT, r->bytes_sent); + } +} + + +static const char *log_header_in(request_rec *r, char *a) +{ + return ap_escape_logitem(r->pool, apr_table_get(r->headers_in, a)); +} + +static APR_INLINE char *find_multiple_headers(apr_pool_t *pool, + const apr_table_t *table, + const char *key) +{ + const apr_array_header_t *elts; + const apr_table_entry_t *t_elt; + const apr_table_entry_t *t_end; + apr_size_t len; + struct sle { + struct sle *next; + const char *value; + apr_size_t len; + } *result_list, *rp; + + elts = apr_table_elts(table); + + if (!elts->nelts) { + return NULL; + } + + t_elt = (const apr_table_entry_t *)elts->elts; + t_end = t_elt + elts->nelts; + len = 1; /* \0 */ + result_list = rp = NULL; + + do { + if (!strcasecmp(t_elt->key, key)) { + if (!result_list) { + result_list = rp = apr_palloc(pool, sizeof(*rp)); + } + else { + rp = rp->next = apr_palloc(pool, sizeof(*rp)); + len += 2; /* ", " */ + } + + rp->next = NULL; + rp->value = t_elt->val; + rp->len = strlen(rp->value); + + len += rp->len; + } + ++t_elt; + } while (t_elt < t_end); + + if (result_list) { + char *result = apr_palloc(pool, len); + char *cp = result; + + rp = result_list; + while (rp) { + if (rp != result_list) { + *cp++ = ','; + *cp++ = ' '; + } + memcpy(cp, rp->value, rp->len); + cp += rp->len; + rp = rp->next; + } + *cp = '\0'; + + return result; + } + + return NULL; +} + +static const char *log_header_out(request_rec *r, char *a) +{ + const char *cp = NULL; + + if (!strcasecmp(a, "Content-type") && r->content_type) { + cp = ap_field_noparam(r->pool, r->content_type); + } + else if (!strcasecmp(a, "Set-Cookie")) { + cp = find_multiple_headers(r->pool, r->headers_out, a); + } + else { + cp = apr_table_get(r->headers_out, a); + } + + return ap_escape_logitem(r->pool, cp); +} + +static const char *log_note(request_rec *r, char *a) +{ + return ap_escape_logitem(r->pool, apr_table_get(r->notes, a)); +} +static const char *log_env_var(request_rec *r, char *a) +{ + return ap_escape_logitem(r->pool, apr_table_get(r->subprocess_env, a)); +} + +static const char *log_cookie(request_rec *r, char *a) +{ + const char *cookies; + const char *start_cookie; + + if ((cookies = apr_table_get(r->headers_in, "Cookie"))) { + if ((start_cookie = ap_strstr_c(cookies,a))) { + char *cookie, *end_cookie; + start_cookie += strlen(a) + 1; /* cookie_name + '=' */ + cookie = apr_pstrdup(r->pool, start_cookie); + /* kill everything in cookie after ';' */ + end_cookie = strchr(cookie, ';'); + if (end_cookie) { + *end_cookie = '\0'; + } + return ap_escape_logitem(r->pool, cookie); + } + } + return NULL; +} + +static const char *log_request_time_custom(request_rec *r, char *a, + apr_time_exp_t *xt) +{ + apr_size_t retcode; + char tstr[MAX_STRING_LEN]; + apr_strftime(tstr, &retcode, sizeof(tstr), a, xt); + return apr_pstrdup(r->pool, tstr); +} + +#define DEFAULT_REQUEST_TIME_SIZE 32 +typedef struct { + unsigned t; + char timestr[DEFAULT_REQUEST_TIME_SIZE]; + unsigned t_validate; +} cached_request_time; + +#define TIME_CACHE_SIZE 4 +#define TIME_CACHE_MASK 3 +static cached_request_time request_time_cache[TIME_CACHE_SIZE]; + +static const char *log_request_time(request_rec *r, char *a) +{ + apr_time_exp_t xt; + + /* ### I think getting the time again at the end of the request + * just for logging is dumb. i know it's "required" for CLF. + * folks writing log parsing tools don't realise that out of order + * times have always been possible (consider what happens if one + * process calculates the time to log, but then there's a context + * switch before it writes and before that process is run again the + * log rotation occurs) and they should just fix their tools rather + * than force the server to pay extra cpu cycles. if you've got + * a problem with this, you can set the define. -djg + */ + if (a && *a) { /* Custom format */ + /* The custom time formatting uses a very large temp buffer + * on the stack. To avoid using so much stack space in the + * common case where we're not using a custom format, the code + * for the custom format in a separate function. (That's why + * log_request_time_custom is not inlined right here.) + */ +#ifdef I_INSIST_ON_EXTRA_CYCLES_FOR_CLF_COMPLIANCE + ap_explode_recent_localtime(&xt, apr_time_now()); +#else + ap_explode_recent_localtime(&xt, r->request_time); +#endif + return log_request_time_custom(r, a, &xt); + } + else { /* CLF format */ + /* This code uses the same technique as ap_explode_recent_localtime(): + * optimistic caching with logic to detect and correct race conditions. + * See the comments in server/util_time.c for more information. + */ + cached_request_time* cached_time = apr_palloc(r->pool, + sizeof(*cached_time)); +#ifdef I_INSIST_ON_EXTRA_CYCLES_FOR_CLF_COMPLIANCE + apr_time_t request_time = apr_time_now(); +#else + apr_time_t request_time = r->request_time; +#endif + unsigned t_seconds = (unsigned)apr_time_sec(request_time); + unsigned i = t_seconds & TIME_CACHE_MASK; + memcpy(cached_time, &(request_time_cache[i]), sizeof(*cached_time)); + if ((t_seconds != cached_time->t) || + (t_seconds != cached_time->t_validate)) { + + /* Invalid or old snapshot, so compute the proper time string + * and store it in the cache + */ + char sign; + int timz; + + ap_explode_recent_localtime(&xt, request_time); + timz = xt.tm_gmtoff; + if (timz < 0) { + timz = -timz; + sign = '-'; + } + else { + sign = '+'; + } + cached_time->t = t_seconds; + apr_snprintf(cached_time->timestr, DEFAULT_REQUEST_TIME_SIZE, + "[%02d/%s/%d:%02d:%02d:%02d %c%.2d%.2d]", + xt.tm_mday, apr_month_snames[xt.tm_mon], + xt.tm_year+1900, xt.tm_hour, xt.tm_min, xt.tm_sec, + sign, timz / (60*60), (timz % (60*60)) / 60); + cached_time->t_validate = t_seconds; + memcpy(&(request_time_cache[i]), cached_time, + sizeof(*cached_time)); + } + return cached_time->timestr; + } +} + +static const char *log_request_duration(request_rec *r, char *a) +{ + apr_time_t duration = apr_time_now() - r->request_time; + return apr_psprintf(r->pool, "%" APR_TIME_T_FMT, apr_time_sec(duration)); +} + +static const char *log_request_duration_microseconds(request_rec *r, char *a) +{ + return apr_psprintf(r->pool, "%" APR_TIME_T_FMT, + (apr_time_now() - r->request_time)); +} + +/* These next two routines use the canonical name:port so that log + * parsers don't need to duplicate all the vhost parsing crud. + */ +static const char *log_virtual_host(request_rec *r, char *a) +{ + return ap_escape_logitem(r->pool, r->server->server_hostname); +} + +static const char *log_server_port(request_rec *r, char *a) +{ + return apr_psprintf(r->pool, "%u", + r->server->port ? r->server->port : ap_default_port(r)); +} + +/* This respects the setting of UseCanonicalName so that + * the dynamic mass virtual hosting trick works better. + */ +static const char *log_server_name(request_rec *r, char *a) +{ + return ap_escape_logitem(r->pool, ap_get_server_name(r)); +} + +static const char *log_pid_tid(request_rec *r, char *a) +{ + if (*a == '\0' || !strcmp(a, "pid")) { + return apr_psprintf(r->pool, "%" APR_PID_T_FMT, getpid()); + } + else if (!strcmp(a, "tid")) { +#if APR_HAS_THREADS + apr_os_thread_t tid = apr_os_thread_current(); +#else + int tid = 0; /* APR will format "0" anyway but an arg is needed */ +#endif + return apr_psprintf(r->pool, "%pT", &tid); + } + /* bogus format */ + return a; +} + +static const char *log_connection_status(request_rec *r, char *a) +{ + if (r->connection->aborted) + return "X"; + + if (r->connection->keepalive == AP_CONN_KEEPALIVE && + (!r->server->keep_alive_max || + (r->server->keep_alive_max - r->connection->keepalives) > 0)) { + return "+"; + } + return "-"; +} + +/***************************************************************** + * + * Parsing the log format string + */ + +static char *parse_log_misc_string(apr_pool_t *p, log_format_item *it, + const char **sa) +{ + const char *s; + char *d; + + it->func = constant_item; + it->conditions = NULL; + + s = *sa; + while (*s && *s != '%') { + s++; + } + /* + * This might allocate a few chars extra if there's a backslash + * escape in the format string. + */ + it->arg = apr_palloc(p, s - *sa + 1); + + d = it->arg; + s = *sa; + while (*s && *s != '%') { + if (*s != '\\') { + *d++ = *s++; + } + else { + s++; + switch (*s) { + case '\\': + *d++ = '\\'; + s++; + break; + case 'r': + *d++ = '\r'; + s++; + break; + case 'n': + *d++ = '\n'; + s++; + break; + case 't': + *d++ = '\t'; + s++; + break; + default: + /* copy verbatim */ + *d++ = '\\'; + /* + * Allow the loop to deal with this *s in the normal + * fashion so that it handles end of string etc. + * properly. + */ + break; + } + } + } + *d = '\0'; + + *sa = s; + return NULL; +} + +static char *parse_log_item(apr_pool_t *p, log_format_item *it, const char **sa) +{ + const char *s = *sa; + ap_log_handler *handler; + + if (*s != '%') { + return parse_log_misc_string(p, it, sa); + } + + ++s; + it->condition_sense = 0; + it->conditions = NULL; + + if (*s == '%') { + it->arg = "%"; + it->func = constant_item; + *sa = ++s; + + return NULL; + } + + it->want_orig = -1; + it->arg = ""; /* For safety's sake... */ + + while (*s) { + int i; + + switch (*s) { + case '!': + ++s; + it->condition_sense = !it->condition_sense; + break; + + case '<': + ++s; + it->want_orig = 1; + break; + + case '>': + ++s; + it->want_orig = 0; + break; + + case ',': + ++s; + break; + + case '{': + ++s; + it->arg = ap_getword(p, &s, '}'); + break; + + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + i = *s - '0'; + while (apr_isdigit(*++s)) { + i = i * 10 + (*s) - '0'; + } + if (!it->conditions) { + it->conditions = apr_array_make(p, 4, sizeof(int)); + } + *(int *) apr_array_push(it->conditions) = i; + break; + + default: + handler = (ap_log_handler *)apr_hash_get(log_hash, s++, 1); + if (!handler) { + char dummy[2]; + + dummy[0] = s[-1]; + dummy[1] = '\0'; + return apr_pstrcat(p, "Unrecognized LogFormat directive %", + dummy, NULL); + } + it->func = handler->func; + if (it->want_orig == -1) { + it->want_orig = handler->want_orig_default; + } + *sa = s; + return NULL; + } + } + + return "Ran off end of LogFormat parsing args to some directive"; +} + +static apr_array_header_t *parse_log_string(apr_pool_t *p, const char *s, const char **err) +{ + apr_array_header_t *a = apr_array_make(p, 30, sizeof(log_format_item)); + char *res; + + while (*s) { + if ((res = parse_log_item(p, (log_format_item *) apr_array_push(a), &s))) { + *err = res; + return NULL; + } + } + + s = APR_EOL_STR; + parse_log_item(p, (log_format_item *) apr_array_push(a), &s); + return a; +} + +/***************************************************************** + * + * Actually logging. + */ + +static const char *process_item(request_rec *r, request_rec *orig, + log_format_item *item) +{ + const char *cp; + + /* First, see if we need to process this thing at all... */ + + if (item->conditions && item->conditions->nelts != 0) { + int i; + int *conds = (int *) item->conditions->elts; + int in_list = 0; + + for (i = 0; i < item->conditions->nelts; ++i) { + if (r->status == conds[i]) { + in_list = 1; + break; + } + } + + if ((item->condition_sense && in_list) + || (!item->condition_sense && !in_list)) { + return "-"; + } + } + + /* We do. Do it... */ + + cp = (*item->func) (item->want_orig ? orig : r, item->arg); + return cp ? cp : "-"; +} + +static void flush_log(buffered_log *buf) +{ + if (buf->outcnt && buf->handle != NULL) { + apr_file_write(buf->handle, buf->outbuf, &buf->outcnt); + buf->outcnt = 0; + } +} + + +static int config_log_transaction(request_rec *r, config_log_state *cls, + apr_array_header_t *default_format) +{ + log_format_item *items; + const char **strs; + int *strl; + request_rec *orig; + int i; + apr_size_t len = 0; + apr_array_header_t *format; + char *envar; + apr_status_t rv; + + if (cls->fname == NULL) { + return DECLINED; + } + + /* + * See if we've got any conditional envariable-controlled logging decisions + * to make. + */ + if (cls->condition_var != NULL) { + envar = cls->condition_var; + if (*envar != '!') { + if (apr_table_get(r->subprocess_env, envar) == NULL) { + return DECLINED; + } + } + else { + if (apr_table_get(r->subprocess_env, &envar[1]) != NULL) { + return DECLINED; + } + } + } + + format = cls->format ? cls->format : default_format; + + strs = apr_palloc(r->pool, sizeof(char *) * (format->nelts)); + strl = apr_palloc(r->pool, sizeof(int) * (format->nelts)); + items = (log_format_item *) format->elts; + + orig = r; + while (orig->prev) { + orig = orig->prev; + } + while (r->next) { + r = r->next; + } + + for (i = 0; i < format->nelts; ++i) { + strs[i] = process_item(r, orig, &items[i]); + } + + for (i = 0; i < format->nelts; ++i) { + len += strl[i] = strlen(strs[i]); + } + if (!log_writer) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, APR_EGENERAL, r, + "log writer isn't correctly setup"); + return HTTP_INTERNAL_SERVER_ERROR; + } + rv = log_writer(r, cls->log_writer, strs, strl, format->nelts, len); + /* xxx: do we return an error on log_writer? */ + return OK; +} + +static int multi_log_transaction(request_rec *r) +{ + multi_log_state *mls = ap_get_module_config(r->server->module_config, + &log_config_module); + config_log_state *clsarray; + int i; + + /* + * Log this transaction.. + */ + if (mls->config_logs->nelts) { + clsarray = (config_log_state *) mls->config_logs->elts; + for (i = 0; i < mls->config_logs->nelts; ++i) { + config_log_state *cls = &clsarray[i]; + + config_log_transaction(r, cls, mls->default_format); + } + } + else if (mls->server_config_logs) { + clsarray = (config_log_state *) mls->server_config_logs->elts; + for (i = 0; i < mls->server_config_logs->nelts; ++i) { + config_log_state *cls = &clsarray[i]; + + config_log_transaction(r, cls, mls->default_format); + } + } + + return OK; +} + +/***************************************************************** + * + * Module glue... + */ + +static void *make_config_log_state(apr_pool_t *p, server_rec *s) +{ + multi_log_state *mls; + + mls = (multi_log_state *) apr_palloc(p, sizeof(multi_log_state)); + mls->config_logs = apr_array_make(p, 1, sizeof(config_log_state)); + mls->default_format_string = NULL; + mls->default_format = NULL; + mls->server_config_logs = NULL; + mls->formats = apr_table_make(p, 4); + apr_table_setn(mls->formats, "CLF", DEFAULT_LOG_FORMAT); + + return mls; +} + +/* + * Use the merger to simply add a pointer from the vhost log state + * to the log of logs specified for the non-vhost configuration. Make sure + * vhosts inherit any globally-defined format names. + */ + +static void *merge_config_log_state(apr_pool_t *p, void *basev, void *addv) +{ + multi_log_state *base = (multi_log_state *) basev; + multi_log_state *add = (multi_log_state *) addv; + + add->server_config_logs = base->config_logs; + if (!add->default_format) { + add->default_format_string = base->default_format_string; + add->default_format = base->default_format; + } + add->formats = apr_table_overlay(p, base->formats, add->formats); + + return add; +} + +/* + * Set the default logfile format, or define a nickname for a format string. + */ +static const char *log_format(cmd_parms *cmd, void *dummy, const char *fmt, + const char *name) +{ + const char *err_string = NULL; + multi_log_state *mls = ap_get_module_config(cmd->server->module_config, + &log_config_module); + + /* + * If we were given two arguments, the second is a name to be given to the + * format. This syntax just defines the nickname - it doesn't actually + * make the format the default. + */ + if (name != NULL) { + parse_log_string(cmd->pool, fmt, &err_string); + if (err_string == NULL) { + apr_table_setn(mls->formats, name, fmt); + } + } + else { + mls->default_format_string = fmt; + mls->default_format = parse_log_string(cmd->pool, fmt, &err_string); + } + return err_string; +} + + +static const char *add_custom_log(cmd_parms *cmd, void *dummy, const char *fn, + const char *fmt, const char *envclause) +{ + const char *err_string = NULL; + multi_log_state *mls = ap_get_module_config(cmd->server->module_config, + &log_config_module); + config_log_state *cls; + + cls = (config_log_state *) apr_array_push(mls->config_logs); + cls->condition_var = NULL; + if (envclause != NULL) { + if (strncasecmp(envclause, "env=", 4) != 0) { + return "error in condition clause"; + } + if ((envclause[4] == '\0') + || ((envclause[4] == '!') && (envclause[5] == '\0'))) { + return "missing environment variable name"; + } + cls->condition_var = apr_pstrdup(cmd->pool, &envclause[4]); + } + + cls->fname = fn; + cls->format_string = fmt; + if (fmt == NULL) { + cls->format = NULL; + } + else { + cls->format = parse_log_string(cmd->pool, fmt, &err_string); + } + cls->log_writer = NULL; + + return err_string; +} + +static const char *set_transfer_log(cmd_parms *cmd, void *dummy, + const char *fn) +{ + return add_custom_log(cmd, dummy, fn, NULL, NULL); +} + +static const char *set_cookie_log(cmd_parms *cmd, void *dummy, const char *fn) +{ + return add_custom_log(cmd, dummy, fn, "%{Cookie}n \"%r\" %t", NULL); +} + +static const char *set_buffered_logs_on(cmd_parms *parms, void *dummy, int flag) +{ + buffered_logs = flag; + if (buffered_logs) { + ap_log_set_writer_init(ap_buffered_log_writer_init); + ap_log_set_writer(ap_buffered_log_writer); + } + return NULL; +} +static const command_rec config_log_cmds[] = +{ +AP_INIT_TAKE23("CustomLog", add_custom_log, NULL, RSRC_CONF, + "a file name, a custom log format string or format name, " + "and an optional \"env=\" clause (see docs)"), +AP_INIT_TAKE1("TransferLog", set_transfer_log, NULL, RSRC_CONF, + "the filename of the access log"), +AP_INIT_TAKE12("LogFormat", log_format, NULL, RSRC_CONF, + "a log format string (see docs) and an optional format name"), +AP_INIT_TAKE1("CookieLog", set_cookie_log, NULL, RSRC_CONF, + "the filename of the cookie log"), +AP_INIT_FLAG("BufferedLogs", set_buffered_logs_on, NULL, RSRC_CONF, + "Enable Buffered Logging (experimental)"), + {NULL} +}; + +static config_log_state *open_config_log(server_rec *s, apr_pool_t *p, + config_log_state *cls, + apr_array_header_t *default_format) +{ + if (cls->log_writer != NULL) { + return cls; /* virtual config shared w/main server */ + } + + if (cls->fname == NULL) { + return cls; /* Leave it NULL to decline. */ + } + + cls->log_writer = log_writer_init(p, s, cls->fname); + if (cls->log_writer == NULL) + return NULL; + + return cls; +} + +static int open_multi_logs(server_rec *s, apr_pool_t *p) +{ + int i; + multi_log_state *mls = ap_get_module_config(s->module_config, + &log_config_module); + config_log_state *clsarray; + const char *dummy; + const char *format; + + if (mls->default_format_string) { + format = apr_table_get(mls->formats, mls->default_format_string); + if (format) { + mls->default_format = parse_log_string(p, format, &dummy); + } + } + + if (!mls->default_format) { + mls->default_format = parse_log_string(p, DEFAULT_LOG_FORMAT, &dummy); + } + + if (mls->config_logs->nelts) { + clsarray = (config_log_state *) mls->config_logs->elts; + for (i = 0; i < mls->config_logs->nelts; ++i) { + config_log_state *cls = &clsarray[i]; + + if (cls->format_string) { + format = apr_table_get(mls->formats, cls->format_string); + if (format) { + cls->format = parse_log_string(p, format, &dummy); + } + } + + if (!open_config_log(s, p, cls, mls->default_format)) { + /* Failure already logged by open_config_log */ + return DONE; + } + } + } + else if (mls->server_config_logs) { + clsarray = (config_log_state *) mls->server_config_logs->elts; + for (i = 0; i < mls->server_config_logs->nelts; ++i) { + config_log_state *cls = &clsarray[i]; + + if (cls->format_string) { + format = apr_table_get(mls->formats, cls->format_string); + if (format) { + cls->format = parse_log_string(p, format, &dummy); + } + } + + if (!open_config_log(s, p, cls, mls->default_format)) { + /* Failure already logged by open_config_log */ + return DONE; + } + } + } + + return OK; +} + + +static apr_status_t flush_all_logs(void *data) +{ + server_rec *s = data; + multi_log_state *mls; + apr_array_header_t *log_list; + config_log_state *clsarray; + buffered_log *buf; + int i; + + if (!buffered_logs) + return APR_SUCCESS; + + for (; s; s = s->next) { + mls = ap_get_module_config(s->module_config, &log_config_module); + log_list = NULL; + if (mls->config_logs->nelts) { + log_list = mls->config_logs; + } + else if (mls->server_config_logs) { + log_list = mls->server_config_logs; + } + if (log_list) { + clsarray = (config_log_state *) log_list->elts; + for (i = 0; i < log_list->nelts; ++i) { + buf = clsarray[i].log_writer; + flush_log(buf); + } + } + } + return APR_SUCCESS; +} + + +static int init_config_log(apr_pool_t *pc, apr_pool_t *p, apr_pool_t *pt, server_rec *s) +{ + int res; + + /* First init the buffered logs array, which is needed when opening the logs. */ + if (buffered_logs) { + all_buffered_logs = apr_array_make(p, 5, sizeof(buffered_log *)); + } + + /* Next, do "physical" server, which gets default log fd and format + * for the virtual servers, if they don't override... + */ + res = open_multi_logs(s, p); + + /* Then, virtual servers */ + + for (s = s->next; (res == OK) && s; s = s->next) { + res = open_multi_logs(s, p); + } + + return res; +} + +static void init_child(apr_pool_t *p, server_rec *s) +{ + int mpm_threads; + + ap_mpm_query(AP_MPMQ_MAX_THREADS, &mpm_threads); + + /* Now register the last buffer flush with the cleanup engine */ + if (buffered_logs) { + int i; + buffered_log **array = (buffered_log **)all_buffered_logs->elts; + + apr_pool_cleanup_register(p, s, flush_all_logs, flush_all_logs); + + for (i = 0; i < all_buffered_logs->nelts; i++) { + buffered_log *this = array[i]; + +#if APR_HAS_THREADS + if (mpm_threads > 1) { + apr_status_t rv; + + this->mutex.type = apr_anylock_threadmutex; + rv = apr_thread_mutex_create(&this->mutex.lock.tm, + APR_THREAD_MUTEX_DEFAULT, + p); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_CRIT, rv, s, + "could not initialize buffered log mutex, " + "transfer log may become corrupted"); + this->mutex.type = apr_anylock_none; + } + } + else +#endif + { + this->mutex.type = apr_anylock_none; + } + } + } +} + +static void ap_register_log_handler(apr_pool_t *p, char *tag, + ap_log_handler_fn_t *handler, int def) +{ + ap_log_handler *log_struct = apr_palloc(p, sizeof(*log_struct)); + log_struct->func = handler; + log_struct->want_orig_default = def; + + apr_hash_set(log_hash, tag, 1, (const void *)log_struct); +} +static void ap_log_set_writer_init(ap_log_writer_init *handle) +{ + log_writer_init = handle; + +} +static void ap_log_set_writer(ap_log_writer *handle) +{ + log_writer = handle; +} + +static apr_status_t ap_default_log_writer( request_rec *r, + void *handle, + const char **strs, + int *strl, + int nelts, + apr_size_t len) + +{ + char *str; + char *s; + int i; + apr_status_t rv; + + str = apr_palloc(r->pool, len + 1); + + for (i = 0, s = str; i < nelts; ++i) { + memcpy(s, strs[i], strl[i]); + s += strl[i]; + } + + rv = apr_file_write((apr_file_t*)handle, str, &len); + + return rv; +} +static void *ap_default_log_writer_init(apr_pool_t *p, server_rec *s, + const char* name) +{ + if (*name == '|') { + piped_log *pl; + + pl = ap_open_piped_log(p, name + 1); + if (pl == NULL) { + return NULL;; + } + return ap_piped_log_write_fd(pl); + } + else { + const char *fname = ap_server_root_relative(p, name); + apr_file_t *fd; + apr_status_t rv; + + if (!fname) { + ap_log_error(APLOG_MARK, APLOG_ERR, APR_EBADPATH, s, + "invalid transfer log path %s.", name); + return NULL; + } + rv = apr_file_open(&fd, fname, xfer_flags, xfer_perms, p); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, s, + "could not open transfer log file %s.", fname); + return NULL; + } + return fd; + } +} +static void *ap_buffered_log_writer_init(apr_pool_t *p, server_rec *s, + const char* name) +{ + buffered_log *b; + b = apr_pcalloc(p, sizeof(buffered_log)); + b->handle = ap_default_log_writer_init(p, s, name); + + if (b->handle) { + *(buffered_log **)apr_array_push(all_buffered_logs) = b; + return b; + } + else + return NULL; +} +static apr_status_t ap_buffered_log_writer(request_rec *r, + void *handle, + const char **strs, + int *strl, + int nelts, + apr_size_t len) + +{ + char *str; + char *s; + int i; + apr_status_t rv; + buffered_log *buf = (buffered_log*)handle; + + if ((rv = APR_ANYLOCK_LOCK(&buf->mutex)) != APR_SUCCESS) { + return rv; + } + + if (len + buf->outcnt > LOG_BUFSIZE) { + flush_log(buf); + } + if (len >= LOG_BUFSIZE) { + apr_size_t w; + + str = apr_palloc(r->pool, len + 1); + for (i = 0, s = str; i < nelts; ++i) { + memcpy(s, strs[i], strl[i]); + s += strl[i]; + } + w = len; + rv = apr_file_write(buf->handle, str, &w); + + } + else { + for (i = 0, s = &buf->outbuf[buf->outcnt]; i < nelts; ++i) { + memcpy(s, strs[i], strl[i]); + s += strl[i]; + } + buf->outcnt += len; + rv = APR_SUCCESS; + } + + APR_ANYLOCK_UNLOCK(&buf->mutex); + return rv; +} + +static int log_pre_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp) +{ + static APR_OPTIONAL_FN_TYPE(ap_register_log_handler) *log_pfn_register; + + log_pfn_register = APR_RETRIEVE_OPTIONAL_FN(ap_register_log_handler); + + if (log_pfn_register) { + log_pfn_register(p, "h", log_remote_host, 0); + log_pfn_register(p, "a", log_remote_address, 0 ); + log_pfn_register(p, "A", log_local_address, 0 ); + log_pfn_register(p, "l", log_remote_logname, 0); + log_pfn_register(p, "u", log_remote_user, 0); + log_pfn_register(p, "t", log_request_time, 0); + log_pfn_register(p, "f", log_request_file, 0); + log_pfn_register(p, "b", clf_log_bytes_sent, 0); + log_pfn_register(p, "B", log_bytes_sent, 0); + log_pfn_register(p, "i", log_header_in, 0); + log_pfn_register(p, "o", log_header_out, 0); + log_pfn_register(p, "n", log_note, 0); + log_pfn_register(p, "e", log_env_var, 0); + log_pfn_register(p, "V", log_server_name, 0); + log_pfn_register(p, "v", log_virtual_host, 0); + log_pfn_register(p, "p", log_server_port, 0); + log_pfn_register(p, "P", log_pid_tid, 0); + log_pfn_register(p, "H", log_request_protocol, 0); + log_pfn_register(p, "m", log_request_method, 0); + log_pfn_register(p, "q", log_request_query, 0); + log_pfn_register(p, "X", log_connection_status, 0); + log_pfn_register(p, "C", log_cookie, 0); + log_pfn_register(p, "r", log_request_line, 1); + log_pfn_register(p, "D", log_request_duration_microseconds, 1); + log_pfn_register(p, "T", log_request_duration, 1); + log_pfn_register(p, "U", log_request_uri, 1); + log_pfn_register(p, "s", log_status, 1); + } + + return OK; +} + +static void register_hooks(apr_pool_t *p) +{ + ap_hook_pre_config(log_pre_config,NULL,NULL,APR_HOOK_REALLY_FIRST); + ap_hook_child_init(init_child,NULL,NULL,APR_HOOK_MIDDLE); + ap_hook_open_logs(init_config_log,NULL,NULL,APR_HOOK_MIDDLE); + ap_hook_log_transaction(multi_log_transaction,NULL,NULL,APR_HOOK_MIDDLE); + + /* Init log_hash before we register the optional function. It is + * possible for the optional function, ap_register_log_handler, + * to be called before any other mod_log_config hooks are called. + * As a policy, we should init everything required by an optional function + * before calling APR_REGISTER_OPTIONAL_FN. + */ + log_hash = apr_hash_make(p); + APR_REGISTER_OPTIONAL_FN(ap_register_log_handler); + APR_REGISTER_OPTIONAL_FN(ap_log_set_writer_init); + APR_REGISTER_OPTIONAL_FN(ap_log_set_writer); +} + +module AP_MODULE_DECLARE_DATA log_config_module = +{ + STANDARD20_MODULE_STUFF, + NULL, /* create per-dir config */ + NULL, /* merge per-dir config */ + make_config_log_state, /* server config */ + merge_config_log_state, /* merge server config */ + config_log_cmds, /* command apr_table_t */ + register_hooks /* register hooks */ +}; + diff --git a/rubbos/app/httpd-2.0.64/modules/loggers/mod_log_config.dsp b/rubbos/app/httpd-2.0.64/modules/loggers/mod_log_config.dsp new file mode 100644 index 00000000..dcd522ea --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/loggers/mod_log_config.dsp @@ -0,0 +1,128 @@ +# Microsoft Developer Studio Project File - Name="mod_log_config" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=mod_log_config - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "mod_log_config.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 "mod_log_config.mak" CFG="mod_log_config - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "mod_log_config - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_log_config - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "mod_log_config - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_log_config_src" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /out:"Release/mod_log_config.so" /base:@..\..\os\win32\BaseAddr.ref,mod_log_config.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Release/mod_log_config.so" /base:@..\..\os\win32\BaseAddr.ref,mod_log_config.so /opt:ref + +!ELSEIF "$(CFG)" == "mod_log_config - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_log_config_src" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_log_config.so" /base:@..\..\os\win32\BaseAddr.ref,mod_log_config.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_log_config.so" /base:@..\..\os\win32\BaseAddr.ref,mod_log_config.so + +!ENDIF + +# Begin Target + +# Name "mod_log_config - Win32 Release" +# Name "mod_log_config - Win32 Debug" +# Begin Source File + +SOURCE=.\mod_log_config.c +# End Source File +# Begin Source File + +SOURCE=.\mod_log_config.rc +# End Source File +# Begin Source File + +SOURCE=..\..\build\win32\win32ver.awk + +!IF "$(CFG)" == "mod_log_config - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_log_config.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_log_config.so "log_config_module for Apache" ../../include/ap_release.h > .\mod_log_config.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "mod_log_config - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_log_config.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_log_config.so "log_config_module for Apache" ../../include/ap_release.h > .\mod_log_config.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/modules/loggers/mod_log_config.exp b/rubbos/app/httpd-2.0.64/modules/loggers/mod_log_config.exp new file mode 100644 index 00000000..0749e527 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/loggers/mod_log_config.exp @@ -0,0 +1 @@ +log_config_module diff --git a/rubbos/app/httpd-2.0.64/modules/loggers/mod_log_config.h b/rubbos/app/httpd-2.0.64/modules/loggers/mod_log_config.h new file mode 100644 index 00000000..00e79014 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/loggers/mod_log_config.h @@ -0,0 +1,63 @@ +/* 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. + */ + +#include "apr_optional.h" +#include "httpd.h" +#include "scoreboard.h" + +#ifndef _MOD_LOG_CONFIG_H +#define _MOD_LOG_CONFIG_H 1 + +/** + * callback function prototype for a external log handler + */ +typedef const char *ap_log_handler_fn_t(request_rec *r, char *a); + +/** + * callback function prototype for external writer initialization. + */ +typedef void *ap_log_writer_init(apr_pool_t *p, server_rec *s, + const char *name); +/** + * callback which gets called where there is a log line to write. + */ +typedef apr_status_t ap_log_writer( + request_rec *r, + void *handle, + const char **portions, + int *lengths, + int nelts, + apr_size_t len); + +typedef struct ap_log_handler { + ap_log_handler_fn_t *func; + int want_orig_default; +} ap_log_handler; + +APR_DECLARE_OPTIONAL_FN(void, ap_register_log_handler, + (apr_pool_t *p, char *tag, ap_log_handler_fn_t *func, + int def)); +/** + * you will need to set your init handler *BEFORE* the open_logs + * in mod_log_config gets executed + */ +APR_DECLARE_OPTIONAL_FN(void, ap_log_set_writer_init,(ap_log_writer_init *func)); +/** + * you should probably set the writer at the same time (ie..before open_logs) + */ +APR_DECLARE_OPTIONAL_FN(void, ap_log_set_writer, (ap_log_writer* func)); + +#endif /* MOD_LOG_CONFIG */ diff --git a/rubbos/app/httpd-2.0.64/modules/loggers/mod_log_config.la b/rubbos/app/httpd-2.0.64/modules/loggers/mod_log_config.la new file mode 100644 index 00000000..e08ddd31 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/loggers/mod_log_config.la @@ -0,0 +1,35 @@ +# mod_log_config.la - a libtool library file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='' + +# Names of this library. +library_names='' + +# The name of the static archive. +old_library='mod_log_config.a' + +# Libraries that this one depends upon. +dependency_libs=' -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib' + +# Version information for mod_log_config. +current= +age= +revision= + +# Is this an already installed library? +installed=no + +# Should we warn about portability when linking against -modules? +shouldnotlink=yes + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='' diff --git a/rubbos/app/httpd-2.0.64/modules/loggers/mod_log_config.lo b/rubbos/app/httpd-2.0.64/modules/loggers/mod_log_config.lo new file mode 100644 index 00000000..8fb4c5e6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/loggers/mod_log_config.lo @@ -0,0 +1,12 @@ +# mod_log_config.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/mod_log_config.o' + +# Name of the non-PIC object. +non_pic_object='mod_log_config.o' + diff --git a/rubbos/app/httpd-2.0.64/modules/loggers/mod_log_config.o b/rubbos/app/httpd-2.0.64/modules/loggers/mod_log_config.o new file mode 100644 index 0000000000000000000000000000000000000000..55dc12bcca96a0098e80505ce6ede67baf1d811f GIT binary patch literal 121312 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 %b %{forensic-id}n" + * + * Credit is due to Tina Bird , whose + * idea this module was. + * + * Ben Laurie 29/12/2003 + */ + +#include "httpd.h" +#include "http_config.h" +#include "http_log.h" +#include "apr_strings.h" +#include "apr_atomic.h" +#include "http_protocol.h" +#include "test_char.h" +#if APR_HAVE_UNISTD_H +#include +#endif + +module AP_MODULE_DECLARE_DATA log_forensic_module; + +typedef struct fcfg { + const char *logname; + apr_file_t *fd; +} fcfg; + +static void *make_forensic_log_scfg(apr_pool_t *p, server_rec *s) +{ + fcfg *cfg = apr_pcalloc(p, sizeof *cfg); + + cfg->logname = NULL; + cfg->fd = NULL; + + return cfg; +} + +static void *merge_forensic_log_scfg(apr_pool_t *p, void *parent, void *new) +{ + fcfg *cfg = apr_pcalloc(p, sizeof *cfg); + fcfg *pc = parent; + fcfg *nc = new; + + cfg->logname = apr_pstrdup(p, nc->logname ? nc->logname : pc->logname); + cfg->fd = NULL; + + return cfg; +} + +static int open_log(server_rec *s, apr_pool_t *p) +{ + fcfg *cfg = ap_get_module_config(s->module_config, &log_forensic_module); + + if (!cfg->logname || cfg->fd) + return 1; + + if (*cfg->logname == '|') { + piped_log *pl; + const char *pname = ap_server_root_relative(p, cfg->logname + 1); + + pl = ap_open_piped_log(p, pname); + if (pl == NULL) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, + "couldn't spawn forensic log pipe %s", cfg->logname); + return 0; + } + cfg->fd = ap_piped_log_write_fd(pl); + } + else { + const char *fname = ap_server_root_relative(p, cfg->logname); + apr_status_t rv; + + if ((rv = apr_file_open(&cfg->fd, fname, + APR_WRITE | APR_APPEND | APR_CREATE, + APR_OS_DEFAULT, p)) != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, s, + "could not open forensic log file %s.", fname); + return 0; + } + } + + return 1; +} + +static int log_init(apr_pool_t *pc, apr_pool_t *p, apr_pool_t *pt, + server_rec *s) +{ + for ( ; s ; s = s->next) { + if (!open_log(s, p)) { + return HTTP_INTERNAL_SERVER_ERROR; + } + } + + return OK; +} + + +/* e is the first _invalid_ location in q + N.B. returns the terminating NUL. + */ +static char *log_escape(char *q, const char *e, const char *p) +{ + for ( ; *p ; ++p) { + ap_assert(q < e); + if (test_char_table[*(unsigned char *)p]&T_ESCAPE_FORENSIC) { + ap_assert(q+2 < e); + *q++ = '%'; + sprintf(q, "%02x", *(unsigned char *)p); + q += 2; + } + else + *q++ = *p; + } + ap_assert(q < e); + *q = '\0'; + + return q; +} + +typedef struct hlog { + char *log; + char *pos; + char *end; + apr_pool_t *p; + apr_size_t count; +} hlog; + +static int count_string(const char *p) +{ + int n; + + for (n = 0 ; *p ; ++p, ++n) + if (test_char_table[*(unsigned char *)p]&T_ESCAPE_FORENSIC) + n += 2; + return n; +} + +static int count_headers(void *h_, const char *key, const char *value) +{ + hlog *h = h_; + + h->count += count_string(key)+count_string(value)+2; + + return 1; +} + +static int log_headers(void *h_, const char *key, const char *value) +{ + hlog *h = h_; + + /* note that we don't have to check h->pos here, coz its been done + for us by log_escape */ + *h->pos++ = '|'; + h->pos = log_escape(h->pos, h->end, key); + *h->pos++ = ':'; + h->pos = log_escape(h->pos, h->end, value); + + return 1; +} + +static int log_before(request_rec *r) +{ + fcfg *cfg = ap_get_module_config(r->server->module_config, + &log_forensic_module); + const char *id; + hlog h; + apr_size_t n; + apr_status_t rv; + + if (!cfg->fd || r->prev) { + return DECLINED; + } + + if (!(id = apr_table_get(r->subprocess_env, "UNIQUE_ID"))) { + /* we make the assumption that we can't go through all the PIDs in + under 1 second */ + ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server, + "mod_log_forensic: mod_unique_id must also be active"); + return DECLINED; + } + ap_set_module_config(r->request_config, &log_forensic_module, (char *)id); + + h.p = r->pool; + h.count = 0; + + apr_table_do(count_headers, &h, r->headers_in, NULL); + + h.count += 1+strlen(id)+1+count_string(r->the_request)+1+1; + h.log = apr_palloc(r->pool, h.count); + h.pos = h.log; + h.end = h.log+h.count; + + *h.pos++ = '+'; + strcpy(h.pos, id); + h.pos += strlen(h.pos); + *h.pos++ = '|'; + h.pos = log_escape(h.pos, h.end, r->the_request); + + apr_table_do(log_headers, &h, r->headers_in, NULL); + + ap_assert(h.pos < h.end); + *h.pos++ = '\n'; + + n = h.count-1; + rv = apr_file_write(cfg->fd, h.log, &n); + ap_assert(rv == APR_SUCCESS && n == h.count-1); + + apr_table_setn(r->notes, "forensic-id", id); + + return OK; +} + +static int log_after(request_rec *r) +{ + fcfg *cfg = ap_get_module_config(r->server->module_config, + &log_forensic_module); + const char *id = ap_get_module_config(r->request_config, + &log_forensic_module); + char *s; + apr_size_t l, n; + apr_status_t rv; + + if (!cfg->fd) { + return DECLINED; + } + + s = apr_pstrcat(r->pool, "-", id, "\n", NULL); + l = n = strlen(s); + rv = apr_file_write(cfg->fd, s, &n); + ap_assert(rv == APR_SUCCESS && n == l); + + return OK; +} + +static const char *set_forensic_log(cmd_parms *cmd, void *dummy, const char *fn) +{ + fcfg *cfg = ap_get_module_config(cmd->server->module_config, + &log_forensic_module); + + cfg->logname = fn; + return NULL; +} + +static const command_rec forensic_log_cmds[] = +{ + AP_INIT_TAKE1("ForensicLog", set_forensic_log, NULL, RSRC_CONF, + "the filename of the forensic log"), + { NULL } +}; + +static void register_hooks(apr_pool_t *p) +{ + static const char * const pre[] = { "mod_unique_id.c", NULL }; + + ap_hook_open_logs(log_init,NULL,NULL,APR_HOOK_MIDDLE); + ap_hook_post_read_request(log_before,pre,NULL,APR_HOOK_REALLY_FIRST); + ap_hook_log_transaction(log_after,NULL,NULL,APR_HOOK_REALLY_LAST); +} + +module AP_MODULE_DECLARE_DATA log_forensic_module = +{ + STANDARD20_MODULE_STUFF, + NULL, /* create per-dir config */ + NULL, /* merge per-dir config */ + make_forensic_log_scfg, /* server config */ + merge_forensic_log_scfg, /* merge server config */ + forensic_log_cmds, /* command apr_table_t */ + register_hooks /* register hooks */ +}; diff --git a/rubbos/app/httpd-2.0.64/modules/loggers/mod_log_forensic.dsp b/rubbos/app/httpd-2.0.64/modules/loggers/mod_log_forensic.dsp new file mode 100644 index 00000000..b41c267e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/loggers/mod_log_forensic.dsp @@ -0,0 +1,128 @@ +# Microsoft Developer Studio Project File - Name="mod_log_forensic" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=mod_log_forensic - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "mod_log_forensic.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 "mod_log_forensic.mak" CFG="mod_log_forensic - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "mod_log_forensic - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_log_forensic - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "mod_log_forensic - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /I "../../server" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_log_forensic_src" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /out:"Release/mod_log_forensic.so" /base:@..\..\os\win32\BaseAddr.ref,mod_log_forensic.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Release/mod_log_forensic.so" /base:@..\..\os\win32\BaseAddr.ref,mod_log_forensic.so /opt:ref + +!ELSEIF "$(CFG)" == "mod_log_forensic - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /I "../../server" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_log_forensic_src" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_log_forensic.so" /base:@..\..\os\win32\BaseAddr.ref,mod_log_forensic.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_log_forensic.so" /base:@..\..\os\win32\BaseAddr.ref,mod_log_forensic.so + +!ENDIF + +# Begin Target + +# Name "mod_log_forensic - Win32 Release" +# Name "mod_log_forensic - Win32 Debug" +# Begin Source File + +SOURCE=.\mod_log_forensic.c +# End Source File +# Begin Source File + +SOURCE=.\mod_log_forensic.rc +# End Source File +# Begin Source File + +SOURCE=..\..\build\win32\win32ver.awk + +!IF "$(CFG)" == "mod_log_forensic - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_log_forensic.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_log_forensic.so "log_forensic_module for Apache" ../../include/ap_release.h > .\mod_log_forensic.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "mod_log_forensic - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_log_forensic.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_log_forensic.so "log_forensic_module for Apache" ../../include/ap_release.h > .\mod_log_forensic.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/modules/loggers/mod_log_forensic.exp b/rubbos/app/httpd-2.0.64/modules/loggers/mod_log_forensic.exp new file mode 100644 index 00000000..92f5075b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/loggers/mod_log_forensic.exp @@ -0,0 +1 @@ +log_forensic_module diff --git a/rubbos/app/httpd-2.0.64/modules/loggers/mod_logio.c b/rubbos/app/httpd-2.0.64/modules/loggers/mod_logio.c new file mode 100644 index 00000000..ba337ed2 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/loggers/mod_logio.c @@ -0,0 +1,192 @@ +/* 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. + */ + +/* + * Written by Bojan Smojver : + * + * The argument to LogFormat and CustomLog is a string, which can include + * literal characters copied into the log files, and '%' directives as + * follows: + * + * %...I: bytes received, including request and headers, cannot be zero + * %...O: bytes sent, including headers, cannot be zero + * + */ + +#include "apr_strings.h" +#include "apr_lib.h" +#include "apr_hash.h" +#include "apr_optional.h" + +#define APR_WANT_STRFUNC +#include "apr_want.h" + +#include "ap_config.h" +#include "mod_log_config.h" +#include "httpd.h" +#include "http_core.h" +#include "http_config.h" +#include "http_connection.h" +#include "http_protocol.h" + +module AP_MODULE_DECLARE_DATA logio_module; + +static const char logio_filter_name[] = "LOG_INPUT_OUTPUT"; + +/* + * Logging of input and output config... + */ + +typedef struct logio_config_t { + apr_off_t bytes_in; + apr_off_t bytes_out; +} logio_config_t; + +/* + * Optional function for the core to add to bytes_out + */ + +static void ap_logio_add_bytes_out(conn_rec *c, apr_off_t bytes){ + logio_config_t *cf = ap_get_module_config(c->conn_config, &logio_module); + + cf->bytes_out += bytes; +} + +/* + * Format items... + */ + +static const char *log_bytes_in(request_rec *r, char *a) +{ + logio_config_t *cf = ap_get_module_config(r->connection->conn_config, + &logio_module); + + return apr_off_t_toa(r->pool, cf->bytes_in); +} + +static const char *log_bytes_out(request_rec *r, char *a) +{ + logio_config_t *cf = ap_get_module_config(r->connection->conn_config, + &logio_module); + + return apr_off_t_toa(r->pool, cf->bytes_out); +} + +/* + * Reset counters after logging... + */ + +static int logio_transaction(request_rec *r) +{ + logio_config_t *cf = ap_get_module_config(r->connection->conn_config, + &logio_module); + + cf->bytes_in = cf->bytes_out = 0; + + return OK; +} + +/* + * Logging of input and output filters... + */ + +static apr_status_t logio_in_filter(ap_filter_t *f, + apr_bucket_brigade *bb, + ap_input_mode_t mode, + apr_read_type_e block, + apr_off_t readbytes) { + apr_off_t length; + apr_status_t status; + logio_config_t *cf = ap_get_module_config(f->c->conn_config, &logio_module); + + status = ap_get_brigade(f->next, bb, mode, block, readbytes); + + apr_brigade_length (bb, 0, &length); + + if (length > 0) + cf->bytes_in += length; + + return status; +} + +static apr_status_t logio_out_filter(ap_filter_t *f, + apr_bucket_brigade *bb) { + apr_bucket *b = APR_BRIGADE_LAST(bb); + + /* End of data, make sure we flush */ + if (APR_BUCKET_IS_EOS(b)) { + APR_BUCKET_INSERT_BEFORE(b, + apr_bucket_flush_create(f->c->bucket_alloc)); + } + + return ap_pass_brigade(f->next, bb); +} + +/* + * The hooks... + */ + +static int logio_pre_conn(conn_rec *c, void *csd) { + logio_config_t *cf = apr_pcalloc(c->pool, sizeof(*cf)); + + ap_set_module_config(c->conn_config, &logio_module, cf); + + ap_add_input_filter(logio_filter_name, NULL, NULL, c); + ap_add_output_filter(logio_filter_name, NULL, NULL, c); + + return OK; +} + +static int logio_pre_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp) +{ + static APR_OPTIONAL_FN_TYPE(ap_register_log_handler) *log_pfn_register; + + log_pfn_register = APR_RETRIEVE_OPTIONAL_FN(ap_register_log_handler); + + if (log_pfn_register) { + log_pfn_register(p, "I", log_bytes_in, 0); + log_pfn_register(p, "O", log_bytes_out, 0); + } + + return OK; +} + +static void register_hooks(apr_pool_t *p) +{ + static const char *pre[] = { "mod_log_config.c", NULL }; + + ap_hook_pre_connection(logio_pre_conn, NULL, NULL, APR_HOOK_MIDDLE); + ap_hook_pre_config(logio_pre_config, NULL, NULL, APR_HOOK_REALLY_FIRST); + ap_hook_log_transaction(logio_transaction, pre, NULL, APR_HOOK_MIDDLE); + + ap_register_input_filter(logio_filter_name, logio_in_filter, NULL, + AP_FTYPE_NETWORK - 1); + ap_register_output_filter(logio_filter_name, logio_out_filter, NULL, + AP_FTYPE_NETWORK - 1); + + APR_REGISTER_OPTIONAL_FN(ap_logio_add_bytes_out); +} + +module AP_MODULE_DECLARE_DATA logio_module = +{ + STANDARD20_MODULE_STUFF, + NULL, /* create per-dir config */ + NULL, /* merge per-dir config */ + NULL, /* server config */ + NULL, /* merge server config */ + NULL, /* command apr_table_t */ + register_hooks /* register hooks */ +}; diff --git a/rubbos/app/httpd-2.0.64/modules/loggers/mod_logio.dsp b/rubbos/app/httpd-2.0.64/modules/loggers/mod_logio.dsp new file mode 100644 index 00000000..c312c045 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/loggers/mod_logio.dsp @@ -0,0 +1,128 @@ +# Microsoft Developer Studio Project File - Name="mod_logio" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=mod_logio - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "mod_logio.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 "mod_logio.mak" CFG="mod_logio - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "mod_logio - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_logio - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "mod_logio - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_logio_src" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /out:"Release/mod_logio.so" /base:@..\..\os\win32\BaseAddr.ref,mod_logio.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Release/mod_logio.so" /base:@..\..\os\win32\BaseAddr.ref,mod_logio.so /opt:ref + +!ELSEIF "$(CFG)" == "mod_logio - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_logio_src" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_logio.so" /base:@..\..\os\win32\BaseAddr.ref,mod_logio.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_logio.so" /base:@..\..\os\win32\BaseAddr.ref,mod_logio.so + +!ENDIF + +# Begin Target + +# Name "mod_logio - Win32 Release" +# Name "mod_logio - Win32 Debug" +# Begin Source File + +SOURCE=.\mod_logio.c +# End Source File +# Begin Source File + +SOURCE=.\mod_logio.rc +# End Source File +# Begin Source File + +SOURCE=..\..\build\win32\win32ver.awk + +!IF "$(CFG)" == "mod_logio - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_logio.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_logio.so "logio_module for Apache" ../../include/ap_release.h > .\mod_logio.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "mod_logio - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_logio.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_logio.so "logio_module for Apache" ../../include/ap_release.h > .\mod_logio.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/modules/loggers/modules.mk b/rubbos/app/httpd-2.0.64/modules/loggers/modules.mk new file mode 100644 index 00000000..8aacac02 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/loggers/modules.mk @@ -0,0 +1,5 @@ +mod_log_config.la: mod_log_config.lo + $(MOD_LINK) mod_log_config.lo $(MOD_LOG_CONFIG_LDADD) +DISTCLEAN_TARGETS = modules.mk +static = mod_log_config.la +shared = diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/.deps b/rubbos/app/httpd-2.0.64/modules/mappers/.deps new file mode 100644 index 00000000..e69de29b diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/.indent.pro b/rubbos/app/httpd-2.0.64/modules/mappers/.indent.pro new file mode 100644 index 00000000..a9fbe9f9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/mappers/.indent.pro @@ -0,0 +1,54 @@ +-i4 -npsl -di0 -br -nce -d0 -cli0 -npcs -nfc1 +-TBUFF +-TFILE +-TTRANS +-TUINT4 +-T_trans +-Tallow_options_t +-Tapache_sfio +-Tarray_header +-Tbool_int +-Tbuf_area +-Tbuff_struct +-Tbuffy +-Tcmd_how +-Tcmd_parms +-Tcommand_rec +-Tcommand_struct +-Tconn_rec +-Tcore_dir_config +-Tcore_server_config +-Tdir_maker_func +-Tevent +-Tglobals_s +-Thandler_func +-Thandler_rec +-Tjoblist_s +-Tlisten_rec +-Tmerger_func +-Tmode_t +-Tmodule +-Tmodule_struct +-Tmutex +-Tn_long +-Tother_child_rec +-Toverrides_t +-Tparent_score +-Tpid_t +-Tpiped_log +-Tpool +-Trequest_rec +-Trequire_line +-Trlim_t +-Tscoreboard +-Tsemaphore +-Tserver_addr_rec +-Tserver_rec +-Tserver_rec_chain +-Tshort_score +-Ttable +-Ttable_entry +-Tthread +-Tu_wide_int +-Tvtime_t +-Twide_int diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/.libs/mod_actions.a b/rubbos/app/httpd-2.0.64/modules/mappers/.libs/mod_actions.a new file mode 100644 index 0000000000000000000000000000000000000000..8654502352fb0e09d8079848ded19cc0cd00a15d GIT binary patch literal 36840 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/.libs/mod_actions.la b/rubbos/app/httpd-2.0.64/modules/mappers/.libs/mod_actions.la new file mode 100644 index 00000000..4bc62514 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/mappers/.libs/mod_actions.la @@ -0,0 +1,35 @@ +# mod_actions.la - a libtool library file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='' + +# Names of this library. +library_names='' + +# The name of the static archive. +old_library='mod_actions.a' + +# Libraries that this one depends upon. +dependency_libs=' -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib' + +# Version information for mod_actions. +current= +age= +revision= + +# Is this an already installed library? +installed=no + +# Should we warn about portability when linking against -modules? +shouldnotlink=yes + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='' diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/.libs/mod_actions.o b/rubbos/app/httpd-2.0.64/modules/mappers/.libs/mod_actions.o new file mode 100644 index 0000000000000000000000000000000000000000..91f684c1a54ee02f3a85be35e03a1e4cfe7fd59b GIT binary patch literal 36688 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 Z3YYced4)^9{Yc@GXXKB$NV_t>{tsu)EUW+k literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/.libs/mod_alias.a b/rubbos/app/httpd-2.0.64/modules/mappers/.libs/mod_alias.a new file mode 100644 index 0000000000000000000000000000000000000000..efd4192ae9300ba4786191b1189180115068e17c GIT binary patch literal 59550 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

    Jh_DwH{{Co4wZh|kV9 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 bK4{6yxnm>=8hT`ZSZd+2pV?{QvcCK;e!F*c literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/.libs/mod_alias.la b/rubbos/app/httpd-2.0.64/modules/mappers/.libs/mod_alias.la new file mode 100644 index 00000000..f008aff6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/mappers/.libs/mod_alias.la @@ -0,0 +1,35 @@ +# mod_alias.la - a libtool library file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='' + +# Names of this library. +library_names='' + +# The name of the static archive. +old_library='mod_alias.a' + +# Libraries that this one depends upon. +dependency_libs=' -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib' + +# Version information for mod_alias. +current= +age= +revision= + +# Is this an already installed library? +installed=no + +# Should we warn about portability when linking against -modules? +shouldnotlink=yes + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='' diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/.libs/mod_alias.o b/rubbos/app/httpd-2.0.64/modules/mappers/.libs/mod_alias.o new file mode 100644 index 0000000000000000000000000000000000000000..178414cd5c31085e3bd0b486216ed65617bb0f32 GIT binary patch literal 59400 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 C^;(_) literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/.libs/mod_dir.a b/rubbos/app/httpd-2.0.64/modules/mappers/.libs/mod_dir.a new file mode 100644 index 0000000000000000000000000000000000000000..0fa02416a9efba57661294a3da27e843f8fc4e20 GIT binary patch literal 37596 zcmb__33yahvj4r^Av6S%Kz2ZBP#hG=0*H~#1c)ROLI?>2x2DtSBt0bEu@?w#;6T)f zqvG=PIX=O0bad1i#y6vY8{-C!jvKDy!mFxN)qPWtdGr3?|9<3l)$i1) zQ>RXyI_KWLw;4Cf9}RTO8Cv4)f0Rv|Hm&@G>C?-nc)g`mLlr%m&ErydXOQ9CP#uB)m&$z`KTbJ*4#YCw4T zEUgvFvMPwIutr%0R@tuJ=d!Ne)pwGoY}dnCW33&zP+0a{*_RKZ&^|o1!BLzwb|cbO zk zx@kRtJK@i&?)#{E)67M^?`CbxgrfHW0(~>9`yQ(*dwfyfn>!HLiKnt%slr#GoVk0y zhO+9uhaNx~!nRLF(>6RZ@zm2RPpdq=@{CH~!);k(=cCxiB(eUSK?h2*dRH7caG-kA ze`9CKQ9H0V`)|qWod!tFrnDoW(^(t6VAlLiD~Hu?>L{#2JM*dZT&t?=%gP6bLzTau zku`Qbd|E&4ec^`#2R3{i$hsf|Lg#<~A8^jv_}v*X5MKtrfN<>Az6yh*)3*b8z~T99_(A`K{kMIeEIv7m1Q(tYpmy9Jts{#W&WnYA$s`Z>Sv zlYLiUhj!0DG8?-`?ybBJq^;VYb{?6%?`0^xys5hHMVM;)VXA>G={T3hRI|UU`zC_h zVB(&7I!s+NKdU#bE8pn>9S=b4i4E?*|4GV0-xm*Hd!Y1rRBFuJ4G4H)cLi1jZ)9M^ zjNY`=Q{Cs;@K0C5y{XC5SMR~*s4);(Wc~dwZI`18(#LvOfzb!*&eFzP+T@yqkd z>`cIM=nqkxgi5E>S0B*Z=RsH{mdy5nf7uHhBKN>%0YjcUGfAG8A~&3o zL^mSoGMWc@(ml5$Yg#ZG?oU=rn*~d!(VJFzc9N{`PLj(o%}}*LFQ5&q*J)h(xVuDV z@R(^pQlGLt|7ZfQP^Uc~4@UXoI@hlYK)0U}Sdo)>JpMZ^DYEo7p!X2I8ih*}p>bOgFRdxDVRNHFbZz z8|XqqZyO4<*U)!O1o?@E{vGNpHT2z|0bOqB?MPP`dgm=rx7yJ6Azg3i2as+y^saG0 zuQc>SNOu_ekulJfZZp2=9_$zO@s$x@{2Zn-$&C0Chl%NLahOaWM|_90>DP$wY50u% z4@i3reE{i+6yhT+8<|qW*u<0@#zjnpVbX}HHq0Pm>J5`lOtWD;_N#-SONJS0zX?o- zVTRFs=r&9?F>%9;v@ZY)dJL0KQ)sTx zQ*7S^%(aFoA!e&#N{PAEFlEGSGt3m4liLk5jcnUxnCbR+(9R=P7U;A_Tt~xDIASYy z(zxc9)0Y7Mevcb8Z7H-7_A>FdL^Ynmyur)CMSyCZWS1F?|CsrzI<5{ePs*Q z%ElClAeoS5Wn*eRA8$s52LBV%CYE!aLcL~Q<~)P*Z%ls7Z{_?MwRnyA zYd-)y%g}q#jTMG|6Y2Seeh0l;ZRo%K7u2n{a>wL6hg3l<6t;3+C5TXQS&bH}P?yQ>tr~c)xc?!rvsAPF_;X)9aDe8vAVpIPpqH;&rdx7v6 zCdYmm2wq=u*J5e{1z>pYn_WPYnYnM@jKYR~_fJ3@kK}&vH!#n5B=`ub=RhdqTq1E0DIBt4+y}wp4n;6C4c(9NSYuFmy60i&7jyzb zj`jk1<*xBS7$tcpxK0)&c{5$O{2C>Bv#9`Ws0CM;2+X_8bp=Ql!Cu!Q8mX^*bP_jfr{NT<#1p;x1Pz z&hvgpjEVESyQx8LW4r6w5m4VWxRdPivg(^%S)h$nZ_CR`YXLKiSYFzmk;%>$q`eIa zSoNqh>=>&alZKlyRy{5a(}&k6ID(johMACt$)waU$52VRVUA79hQ3u8rZ^4VRBf24 z#MByQdK&ty-Z16FG#h4i+CyOIO2eF(_FJ&6!!VV^bQ@+KY3nge6*1=+rkeV*-Y_Rq z$wh`)l!k+UxnUL)bFE<-NNlTN8j1OZVU`hdE4%lXt}u9%+XqYF6@fzkSH~O00`y4T)rsPFp$`6BLEAJIIT`|~WD@@_* z?iTRYd{g+Q8{M7eI-EWJ4)N^qzml4IQ|*0Xnu|iMR^H#;xVK(u3O;h>tS^eSbXa*`Q4iV2-?+mdb~*d&HrEZ{qQlYjt**QWT;Ib5o>8~U z8R`$YUQfm2BQEqFJ8ZY>ePGyOj}yZVdy*J-*z+#*o;Zx=O1Ww0Rbplt=5=D&b#G7| zcGa6y!rpnCrc|@3^H&${H`zV!Qwh801FFOB`IJi7J^QI-y-_g4jcJD6li_xR;Bfax z(79`kShgEipsj`(NzAQ=$#tUz+YD1gW4hfiqun@lcNyj|sd7so%q=w$&)hQNDwt~~u9~@1$^LrgPA9IBxmFY7wl@(CS$S>5t>m%};yRdH zMO-&?UBvY;7a?vvb7#7zx?wDti@7nLEtm1cxzu_ybG?nO4kQ=EgOmo4G5@ z#A5C$Gqaexmbil*UopcZG{lEm64e4p?0ihMan>U!&E;DC_5N#PIBMtMu$1uZb@ys?% z7A>B5hagUxZw0lq6)qh0X8@>s6@^Efl*8RCoIu+U>T2Ocq)qnGm`;}I7?2Sa#cjVt0x!yILI zK}iQ(krXYw7tE*2oT5c9CdtL0C&`8s*;ojIMs|5+l00Q4LL+e;o`zaEbixsWfk5Y{ zd$0*AM^&lv914MS&udbQ>Q%AG{8MDG-9yQU;NehCZJ|{TLEKV+DGLClxGXvq$IXyC z&H>cSz@nYc0!?9AbRXGg=m**mHuNs+oC(pQhfuEx(V|Cdp|@j<%pR=kW&NMNF8WK0 zJ}U#y8=3t`GW~fy!Uq2man}D8w#E9tCY?s+8_YHnp+k7bU?d8m0=i(z*$13lIvo#a zx(EA|?sd(lMaA|;04T0Iic0M20*ULX6v`ae(}^)RNsG#zK|a$) z13AcN(_G*nuOww0-d@?n2S!Q1%>xn4RI`wqVKu;3$9a?E<0?asSgqOF=c(rob#{#dL1S3%xKf z>7JwDOqasA3gpmfD2^UnBm-bX`xcVu5)qB}6U{+$=&CsfcWPYc(sfj)7waqs^eU-i z9SNM}DY*O|Kp<-1_Q>YEBzZ*zkgVcLtONbs@-cimvSu#Phtqi?ou|-w7T4SH5Xc+L z_Y8tHkC(#d>VT$TFL)s}5er^IJ9sI44SQxLO2J#$s+lMS?_yOi_ypC#ng}Hn;iD?; zhoST7o>K^q!Z`yM;^Arb_$z=Rv-%B^vCBSc4V02y+4jVTfF`@_qcM*&eGDq_u>7R| z0%ig_%Ti zqk6k>qCeUW3@Wsj91SwFP~2{WzM{Fupbq;3JmUdriVpkwJ3(qvHx$ujAArYlkrjsB z;AFdLh+BZkcB5T7*w(7TVa=`syzzTZZ*|hF-KeP0>0a{mC}%^b^wb1c2MzDW2don znlNY?7@JaqZic=eCjyvG@R$#MpN@om9Y&3D50MC3lJF@lSCShU0b_4wAYw zsp;O7CL&2w(#|8jjxM8}4?;y{YqQf`$3cbHNv09pMM0BtN+T40o-DMIt^649ff+05 zsEa`kA``|ICO`HL25$9QDU*H=49<@!*wu0|pivZ}(mFiBVPAhC+(*DU*C=z&G@q1KYxAZJ?1!T48SkUO%)M~7>r=+R;3a>$ z_uEa_hYB%&q0{`Mp(Y;o^+hoLX#T?f<}Z{uGxjb*tNK|)DHAm;`r-d>Q8sQ^j)s-;S(wr#U zoQMK>HG{Bg81`oM$FRzw@(L^;vk8kaK~Qm}Md)F_M-gUWGg8GW7D9o!zU{0^L5 zByTF62qo6=sWw`G6UtbbY}KOj!!M)n!!XpH2Cl`xz>v?O^{)arYj^}{3?-up{bQUo z4~vIY({|95(YFT*fW#FdC7yrbzT!owG zg1%yhJ`gMcmO}|!D|N6?T9#oq6`-T17=2|l+EanCM%bu%n&7Z1XF!7^2cz`#lonV@ zQr&ie%JNkEkPZ(6Em*5LV+BR)j6qge&KMZ5nMj~Tvr@WFEW)Uq?F3L_PSV|jegqO| zz==+%CdYskNsydwz)DbH&2^R-d|na)rKkbKvT@$R0m+&U+iDW>2!_%uSTnXTll-7n z3b?Bnfr>)nSE_i})>0wIGh}oLcLgLm78LS&hK!(aTii)OL!{1^GI=+D+SX~JKA5!Q zv~8>wpD@7#q|RrZS0{C!X3A1$d>RywKP45NF66Texvg`1wg}Uk)PDMxOiC-Zb^68J z&~^NoX2GU-i*Ttfo^BdVoyCmRNi$A6pGj#M`Xl6vNz2Yzw?&wgWv3l%*=b^#*x<6t z1|07kR`0S(w}_*~8pMR|Nc!T8E+*HfAQ@OO25So4l^l>|LZ-ZUhL9;+OAoU3L-yS_ z{ApYDpK{yM2tX+Z8)_!^Onl|C<|l1RwKo5t*8alvKIKoC2|^x7LXB=VU|7-#P1*o) z-KEJ|^+GY<+jx<{T!8aX0wpuRJXPH)^*y3NvsMVIK#tb%{r*V zTUqDtlDeCO+{2KWzQVnb5)|_NeuAd0)cN2R8l{EDlDd`(Da~M`ja!7179b0y6dUSb z^-Dzk?xgx(}n}n2SZx1~jQn4mku~A58#m0l?4Bl}uQ%bIo%t%WuJ?^rW zO1hN=%;GrE@@qLk?BP$nPDzrwi08HF>Hc5zUBvn%FHDvC%770*kIVWHN^Sew%;9jh zu_pZ4C5c$HBoq#GCR&3fJ>}DV)2B`D422UtliS0Il9o_BX8miC*jkq847HTB2LcBx znO0mbE%etF4#q?9*AKKxS|agyXD}QLtcsOH6D=)~Sc$*8yM!K2pFE|ww0Qcol2|l= z&H1~Nw*O!2O-{r^ohh^aokrP9sn?PM=;l~F8Va{hE$%>f#@BWSWBo~RdMw`B8f*g? zh9MRStO~}B2-0x>AZoZ!7(O9#K^mSE2O2I6po2ib*9$=Sg3)L=l483fkxp!jOXL2Q zPHJ2DP**Tjnt%uNQye~x?+b<7SR1%9grsTEXG$F{!5FQHL|6Gph}E|wupihy+>@oT z0TN~p8VcW%8ytO%>f+QmloAkVYmY~RXdEC|)fb3_+d}OQAR0U~5saY|Km;A)FwZ!g zd(PFPtj&}`HRuXldM2lXdxo92)qT6&mgD~7JkPtHQBS^Rxzgfy02X4IoUndQ|!6mk2UTgCqLpYnDyab?{(+x^qlUlndLtI zWOq%oJL9E$J!@_};lz7c;k{e#L~0kFJPG#^o_Ng)_l4`;br*dG4NSD%<#6(Bc_(q- z+p9gL?%W&Pm7bBW1l^acyW{@eUw`Kw=XrPG@(pROWodA;*p=qqh^HBNnvE*c(KPog zJf)uqXV-P^=uZ}=xo%Fg&rPg`cMWXY-_1VvVK`cq^$otIi{~x0y8W>jjAJXj($N)( z2YnrpSloi=ET{Y0IwNZ^9ANYSjjV$DJ&Ep^Rnu72P}x{D#qz~EBGGtDqRooHYaY>1 zYtZTnM%#lv^WFy!pyjJs?CXS}_JQ7b6eh71!eFAH@JFNmwZ4v^zcm;#i3AV}7BCXWDP&gD1`8z{r1zRl`E`NK>T2R;I zo#%z*T0G4=xhtLs2WPiK+Kh$*z~cLuvmu>No(_fW-pPxncqg~T;{L#@$PCV0rGSe4b z9JFAV;H4pSIC{Fp9}BLwd|=Kh=rmPfKej|e?GOqU1s3@R?TSG27RQvowF{mBMhzTg z7OC|464QNX@YE@!uMGnijOdO+OHcy_F6H2;uQj+D3eA9qBk{IK0>&iR(+wVgwC#g8 zM@b81PhUGMMoIl;)2T#~H1*gQNyPhwQe)-9sl{1 zAQoD!P&Zob!&%W5^|yBgAs!OpZhtfeV~r0MfvKTD&`OAd%^3JhfLJhjTVVLs_@fXJ zkP^WXt2G>h84-(guEwx{u#5Ruo2XkA40c1ThE@ly)%XsUZ#6Kjet4q`=2T==q8l93 z=1+9O^4=K15+8L4N67+{U@Kern>Ph*=##<7!MtkUflX{m9Iapi zoL|$B98DMj8q6rT)*nyAfT7s)!F(Vgld8J>tAZ9p3FH7slD;;7R|wvHKG|1$T zpvhV=KHyn$2D-03)C#(Nk+!xN1QyJaFy}hywPYijV@vC+<~7w;Hr6bw!uit;2^VUc zgc$=@T9l4j6J1?v!RxKCJX*2t&JZ+!6E7SA5F)J1iup0bAYuBFxtfwZDzwnalFr(Xky{8fctQUKs15jFb*A&HQiTVzlCNm%yn8HM{-LXP%bb@hJ8iQyJtBeDx6pkWD7Rn!1`s3%-|H zjR-6qb-t#$g>{RU*IBS(UL}#?ldNrw#0dDewzOup$4a_jvx~Vhxk%MFEN)ypZ*i?f z0~o|9i@u}m5`ZNIvbo8u7zP}T$rK6+2i+6s@PlV);BoPQSnTTZhg+!(-?k4z7a&WS zA%i_RC82UKy>79uvSGneQ|w%mDCT&5#N`ARG#oyY>a9R$1V-?r+R6n<_bsSutgWf5 zN)0l)+!yI=l?ejr$?wQUxL(4xwH2Z|-T~tV+mkT$9x_+h2QCldgl&PhPU9Vzb!dY? zQD)|EcOuq-dCJ5wL=(<+UI}1d0d_U`<~Ge+Sk>s8U)fkmeBI)cYHF*%U5W52NT~sy z7dUHZ_NA6~n&jb#FW?V!K$?KL%}$6z+9{8T1O+ zupc(ben@`us;xz<3OR}rI<-X!9A*O!7EWFh4N=Oc+(ob=jvEY!(HPCxWR}E1pom>q zRaIYEiz$W{UfS=V^>K`-PJg&P;ctgKFJ=xJ)vjO{ra)8+bB28E9KdMM?3d7R(gyhi^q9?97o}j6p;f++ zFyDx01L~=GYhLZ*rI?H%^eDN)Mi_G} z4k>(0GatucO!3Axh8qOSY#gD({uu6*!3#9l)r%J|gj|g~Yi^oarZ}vH?Ky0JVUC(P zjAIypr3^QK66Tmt%!bTQEc)LPZ z1mq(huUohep#+P`gra|GZROHx-{O-_vby}R9<@g!iEb0CQ_ROyOR}w5`f&VV1iBz& zVLbTY%8yKCv(|)Q@|!{S`2rn~bTC`;MF$CTq!~-;dIi+s!a?~ywcOxp7>%rzWe3~{ zUdBa?LXKzoqN>J9n(4IJ!Ss^Mv5gItbxY^LPS*;+`U5+6wSB0ssfR5-F1<8loEB(_ zhK6xCc&KQv6(?`duFxzrZJ{Vk??4CiH`ON2$EtaaHH+(vPw@I3$12eRv5uDQ3@Bzi70G|%>?6_8w>{`aMz$67gV!nO6BvmP_PpM5H9*)&`>7X>$9 zu4t@UYWZ7W2Lf5O%ikUfSZy@Zq^r0{Vb+_(g*iKk~RAhZplV3r*@ z4|$hAwo1aL|K%`bX|gO8Oj6ZMQoL*-i@6#)A!#oy*S64PIrA;qRc5GMD z9*veP6IRPw*yosCW7zDsaIx^=<^hbSU85}9@nBas1P5M9noDo;rOC6&+XAK@XHnXS z>nVdv8{Am{ANXkzGd_vJj>|_26~-&92(o9zi~SgE2H<*uZ?M3u#Ysc?ihdsh7G>T@ zumtQwD6Jyya2-M!EOsKMon&k>o9XIfTP8i&*U49FX%pJW@jeB&3~sKE)}5j zFpKd9poKR{D2qbEf-QJ37VyIe(KZ-bgA8nLEli<1112%Uk9=T<{A)~~Q!y0qha=$- zCMO&>>P2$95p(>O2jB6DgyG^Tc`Xf-mXe2O3x7ogs6z ziMv2*mdDUsY~o!9nE{ryVBWkL-ib{uiEun&Zk0@)k|3_^ys~M-(nK@pR$*x}26I$Gg8pJ{pqb8cq#Wv;oIg_pYL zW_o{`HaBzPC4(w6OD{;T%q-t9ctPe$*Goe)%K@p(oCp#i2{q7bG- zcuWBvIJc}jxSeYJtjx^5z%@U!aD#h6rg! z0RY+gAdCG^!*2!PpeN1dXJ)r%!tK}M*xD{gI`A2fn$HfQqQOpoF>N`EiKJ;#+yZyY zilY%^uufTV8L%j6FlJhVEs1tW?y$EiHnhK`1@GZ72g#j3v zdl<#`unpaQ8DqMAc)IA22Zvg+Y&uYgC7&VY5~(lWxk&}7FP|rK{p3A=7Tm?{i~UmH zD+GU5!RMj+Uva7txSZv%|L~Q^LH);J5?ff5KFT>DKJ+@#gJm0__)zUX!|iW9&eX^D zhrplqe*myUwSOc%iECL~)xc=kGY6>u2tBwCU({fy9fz)eK9p$;#gF9ym3%2GwCp)h zaH#%wZ#FfgKK38;u%l->`hRnF%%y*)l~ZEfAQZ9Aa*GGx3c|c zHy-$z4S(AH-vEZ~OFx06% zAd0!Z6GK|+3H}OWdj6GieR9=565$2obZ_M7=xiDjxm#X{{vA1Ie*eR|+f zrS5}9!AQ9eX$jhQa59FaANrlLM)o+k9wCmgiid4E7IKQ6p3JwN&>K*Iw&)p!IJX(OV&5J>V^(0GB9!KTi!);-&4?f)H zz2Soj+{t%<`WLy)ZxQtefpaIl*1yPYjqDFF=T7cE`xm>-+g|-a;M~d4NENLDQpPHU zTGm;>jDQ+)bTH8ipNEpaW&r%A0r1}qfImC{{>K6Ey#wI;2f*?7;|^v2=mBv20n+t>tY=PyAWp&>GO7KPjDAD)L06OG1H(>oCZ&arg<5#CCPA)zXaomkhvGnB{vhXb) z?)2d$5ctDmDEwg_E=2~8v&{!#n0sZ7c*22W-S6;+GU0fganyr3dMfj8DV(=c=9fUB z4BNz4<>42!$Lr98zaEH(*k3^$tdor6$2j;CJAcVI+K2uWJGU!6UMR!keutj% zz>A(gJ8i}*1$9I&2cCFJ&pa4sc;|bFH-nC_Rj=` zH}ICdOyO_y)^@hSM{R`T&VERSss6$ z9S>=D1CQ^|6>feT(z5PU_yV?PyTTvj{PVEF-{y9oR`{trUtUxAB(_KLhuFEF{kdPs zKZpWw$Xg^LU&!N?!R-is6VGe>see2KhnMu|n5=NzSL0DW06tscck#TIbzJldzDUW- zylox;Z&mm`?1yfJcVI(soTKnpd0xmf?P5;@`}ry*znAB=>^DUI1|Ijjl>85DkL))@ z{zBHXN6GiHpI=k>@jQ>-QusXX*Lw=jW<9b$k#=QK+OOn)!*+h7@Wnh{2NXV&^S~gE zYtb)jUWUT2V>@#c{yF>MaD|`A@<%IN-pQV(@DJF&69>Q-DqP}Zxx!y!KL->Z<~Wi2 z2-4sC*l%Ym`8>{77b?7iO=x+w&KNf5Q4dRQODm|3=|=u%FYpo{WpE2k^E#9fGf7KYJA} z`^Cu$e}nT3ya3%#&t=RnQ25u(H!8e|F?afvA0rqE|!mnZbPf_?J9x8BMQHc$M@+0@b?rxiu)z|1@XUJCz$`#Beh?B zh3DyTo=+k#c#*=zFB24gC%0Rs@D}#ZY=y@;K5G=do%tq(|G?w!SGe?7_8nsXFFBt` zp3wMtN>2ml>%IZ-s}(Nm^^FQYn#b!-h1YUC>`?f}?6*f19%27HtMChXy!I;m1CF14 z3SYR>7!hVyv+n#;v+68}3DF7Lj-q3}O*fB&v<(et&!MNa`X2#2&A zWqXbo054T|2m5oj!vDbgkR=K~!1AjUEqj3Cn5IlMnF8#Vv;V1C?yiMVE@c90I z0Q@0^OJ0@zCKluUsFPX$>q`Dnj+1=~Kb_^jRQOTMr*S=GQU6`+pX>qf!xUb}dGZ*A zi+_$+_}_S*;xkKlNV{)xye?7rE}ma!DEumpw^a(4b)-k(bJ@;bg&)Rod4iX z6#g0GcPQM?!<}rtm4;ujdth4zG`ID%{QE_z#7D!utQI@HEB;vp(_j(X1y| z;a~B%k5l;L94EyJzm55s3O|m=v0CBfJYG!-H~(dkWd#&|4d=JW0J!)``X%$FPsu;Y ze*O=I-_8EHN#QFvZ){WeROatj_)oZBe^mH5j+2)a{tK3u`*ULdwH!a6D|z~9QqW~{ zUKIHrwts}e*Yf;2T;WeLKS|-waeMO>K9=KQiNZhP_&G!2Pw{%aO5wLN-m7rgpIoVM zx&OOm0Q^pc%ee1Uc#P-uZiQ#@_`aZU$yaYFT-K?N6fW`lt-?R$_%}a&oyu=7@w%MH z<1FJ?$9^8K@Jo3dOB8+&$MY=6v&1i^zmuTM~V+IYS!Ppze(ZmF&|L4`Q2s9I#c1#vLDtd z{0X+_rwacW%l}N_Pq1HZQ@HGJ?@_qq?MD?ZdH#8YzsUZV`>*1+%`Eq^lK(l+iysu; z&iQQ!$C2m}JWt_gGe1t@a(`#C!X;`JXCW_P773aQTJ0TNS>8`Fj+OzbS;rZiP#`-zxl999M%m-ep|mKG9f( z%X(U`@D|S7%M?DB^ND=#D*AJgfFq#fUuSy~3U~9oIDY_K)>Y9jcK%GsFX#DttHR%9 z{PzkU#r)F>ujDv?bpTwhhs2&?vK}dU$s0c?T!aF$rRw?{Jw*O3ppKQ8otx@>J91rIz zyq56|3djG|3y(g9Z)f{2Q}_n<^VJIP?ohZ~&+JgR*!h^kkLP^*yuu~_zp3!8oUi_&@VmIb|5W&F&SQfM`uq6+$7im> z!bY&znT5{ zjl%1Be?kv&f?en?oXVrw{tVtI3NHJie1)&z{7JtT?a-6OagtE-7qXwPR`^!7|3-y> z$K!Q}!Z&cdZCAMHc|zd?@m%{tE^FBmG?pyZDr?eJ6U z3NK~+*A6|H2i$Du_5tKycF1G9C$OG(75)dt_c?IX-^}{IR`?{2D;GXY4+r`I^&iIL zJJ^Avo_QS4BOEx&|AOW79XQI%^JiWMj`H&T<^%`Ms-YC#FLdCj=MqBUxkm?%dS2wg zoXxn5@6#-Qio!o+JmSDH^&iLhISQZ3_+|%=P5zVd+Y~O(^*-RhQUCEQzsG^2olH4^**Q* zzsR8n+m(Iz6-r*-5BjY`9_{&(+r8U?qaGReT@D=OOL+hGg3@2db{-f2KZaj$lK5<8 z`RR;fe|gCV3VusP$?su17b{%i2t)(X~YwQ5WKwFHsa-}s$#?m06r2hv}E|Ihz^$jmw4d+xdC zo_p@O_q};DtgWg&(Pi6~6x%x9N^yc(R%vaDt{}3)8f6t&WjlMH&AMu5--({GoeyP= zwYKL%W!bZ3Up#<9d-0_WN^#cM4Ms6W2d*4fN;A>Yd@T ztm^d-c(M1a4fBxOxV{It>fW94A?wPmtlk0wZ(D(2AP?1n$O-`0onu+G8xMavtM^Lm zV`Jmt9x!XeyCAr6{W^epcV_k4AXvNc#&rPhfIq9c@5AbiGZ*&0leHles@?+#^v$g9 zd$g+Tv4wqaY)4=RzLf1uRlWlC%-!=9)K&LAct6Szwrw(+w*KLXr<_)KYUOE_r&szO zYReis55+zriFIcW+Fz2@yL|ut{nZ=)8wX2{+K!{ycXL+nG(c)LrX3E0&f4Gwv*vAF zF|2lDM`0D(nNPLnSXE_TR6Z~qn*8(htg-9h-TG9!*o~p8){e055tL)k8zSpVk#*XfqzMV#IR&R*LxE04(-TOs+7!9l-IaXlDVc|Q(iZ!>6v_%itUgyXRG zRu~+ez75Fz4$o(et+1+hU4RB)*?ar<==6I$z^A4R9G!TudLsqZ-aQ~;=8Ft6(NOl7 zbHIDQK$&Db*KE8j8}z|knzxy?ee(`Co~+#n6jV@@U|g+75omw_=@$u$G@t}lfdm4^ zg1+@g_r16GX6P2iU)B3X)`lz?=e)j;_g;IV5#kcr3SX7<60V1&Hk?Ln+R@$g?q|ruyoD(tlqe`e1`{g+z+uQHn{)!7pVt* zpWl!DfzsztsWEdGAmD{v71$KKk%192dgBsLb)RSbH?D+xW0R+^-hvPNOOu%vK4^o|kN~hFUCYk>SA{1^7_7r!-yE?6o zc)Yu{BoPkvOl}QDgMoM?y2gqI4Lv#Fj|STkotQcP-oB^_ICwiDVZgm{#b{#DC~_yy^Gq~tgc9_5Be$& z{M%9B6uJMcgsDWiLH~iA7J1KWS!o2~a)OmiwBsdYY6)@K6c#SmU}Rls=FMZ?>~sQM zWQ99zP$(R?Tpr>`h5PI|AYjOIW+usVQ{?*7ljsH{T}JaDPrBzeWK9o7!+ptSX|saT zEUogaBw62`B$r~Ep=N`gM;lnL)423;cZ$s5G1GvgF=c!H)dUWqL3=(Lj=nMU$0xyH zU55Uo4CpjNf3_QFk7+!{^W6=}#y>b3@2AE?KpBYIcY{otVQl+%*xWEKswp&f4=J4t z(lmr2WoVuur=k;v!k;yCn2oTZGwo$bdW4OhGPVC`n$1W>2LrXLIZFklToym)?pzHAxrlvykn zA#Qq2qt`+7noh5S=@oJhsmiW?R=UmZdQ!U0UVR^^Gy-dnhdyYSJ=xb607hnKZ%GX^ z`$lYNhM9fSAs}vsnf)6y&kQsB_Ish9T+{ZqyMQh<^wyz3dkuZ(M3A3o=s%#&QbXVM zDbVGH-iCCAp?BO2ZL1A^FVgjfz8~pkL+>01^a?{ih;)acA07ik={ED5?!j@<7+)Uo z`7dE9lgx-OaGIF@7N^OKam05>n{kc!o~F;p|A4gD(EE{|NFhGLvXLn@j7?0rVO+#i z7$%LFYQqd7rrt2=#55bmW4|&8hGdwb_8Y)-7-kr)hi=1U6B9SgNc()SpvN%zw1n0f zrogU&nx7b^(EbN#TW^>#_7}ihXqXB1CJ?*KFva$bz+7XP5@NO(rj(dl3{ytTR>Mr8 zHMz|&)5x}+hM8`E2mL&3Wr0p>#I-aHg(J4$AdM?;K$7WS;&6EyZl+ZPE9X|g(mms0 z4zqFjqS+&^Lv4WKY!W&QQVyXx)<|qP8u%O>hl%r%XJHJ$KTv-t<|?uy%`+C07}?<& zcLb0kleisZa2$Bg|RyH=r8sZ0A+1Mp!MdID2 z_iWEICeNZ#uQZ_^D;pE!%OW_~Se$d;gV3Ce&w21es3hZ?a~?ex2r@orcWS-n{P`wS zXz;%vZDKj+Nz`lBWzN&M{>J3T{8r9iQH$4zzxo5fvkbil-B@AhH;|rZ=(o|U)rS7Z zFQ9F`l{+TqS)>YLp|F+nd?6?ypXI!S`wmRg+tBmywA|yifeL-CLghrM(7cK;$o1$(=EH;ggA}V);y$1-7VRG!3fZ+WlcMYZ{PymMKzR?9VnVI|6 zO(<;Wcm4vj@ks9b{{ZuhM{+;K%wyb;`xy>#qLKeD59CV?{R8$@&X%6l17K(I1WL2IRU9Ee8I_pxj`SNd(g^s5BekBGg?|<_ofxO zKi#ufYS0){gH52#N~!s;WDQbKgT1DEdf|0+cJ5n`!n<({kxtqJV(5@`&$A$uaSo9< zi4+dmFzbe}Hi{N}~(xTV3u9G2%{FD$eu%K#Ym=yt}AF?qi$lnGw+5bhv}; z^0MliTv?!vRBz48NoxT!j96aU?vcsC7Nore3Rv~1G#nVK9+QTLF;+b;4bz9$C^(Fm ziH4bwhRLMVFh@~MxnYh@%Z9O47^XN4-BfLusl?P8W_lX>tllu?#55abcG`nr=nBJ} zkoJ49t-~;t#B>{GE@|sAOcgO_8>X7Zv(7LlQO$*hS(t{Cf0sHtG;G#p(^ewKu`(59|1)fp2(;4ayx?W4gpfuDVUH2R z4ts(acGz<+^qx43)=IhQ=M`dR8Rj)&*mbW{8+O$jRKwnRi^DsAuxNPQX$h<=477*uUu8z2g%+-@yN|{??BA&UW#8oiYOk6c{ zr;z>i%$-JDBXg}L#%*sR8nW`*h+DyR9mI7ox01MS=DLXMVJ<@4I_A!BPj$mwG8c1W zJXhBtt zIgjMmdmxtR{L!4>^eE7@&E_w|g~9Z4q|Nyw{}iOnnIr!+q|KQl--ook!eS|!q7i{9J;MGbQf+A_2Zz@%I`KgD~s8fVKbRc77JM1 zHNzZBa2HGW;5G>xD&&)NPd@lB-7^baPIM@G1%q zJ28icS2%%=AvDy&iAbB_6;47CGogjWNSg^QEJNB%XyLTf!M3m*+nNb2q`Md8U;}n} z7>+Bg=;#}u-GPoEaDb8knxP=9xkZFlGLW>Dm&Yf0m)qCs@| zXna*P*v8~(d{s2W#^hN@jw{NrF?o6olW8x_m))}{+ddVTQd5&dmk#BI$tR}5Foibm zGu4I}Yc9x(0$r_E(Kx#W6f~Qf!)@FVR~Y69y9;VM;EJSZ!98F;UFH-md?86L`YcH{ zq{zlX5HzyODwE{ND-arq^Y9e3%ApsWA(#kse!2&{pn6o5s?VViNcX%d)u>)oi_AA7 zgZ&;%Mg$Lqdg=?UatPv)0!*0?D8*&bDL8M2+TJ&idc;3kDLz3yw>Jc{h7l^a|FR?Gy z{}t&pGGAl1nFs^II|d_B2o=x;Q_f!C0>+9X8HK8I=z1aDQwKEp z3A@O_Q*I8Xd=T|X4fbbh(4XSLHByZhm}*>b(C``nMq!790&pjaE`z#f5yb2a7q1 zD|{74W)@1po7k&aC>OHylWBIH4b7I@rKx6* zK(kv+Ggr*f*E@jkGJT~qq?+xA>VF(iJ=NH0ES)9{S_a0Z)S#PT?8k@zrV}jlVC>V8 zu&>3aG43G}L5ut|23%<>ek1-Vj>2@@CeuMumn1dalhQ;aX-e98xYsdcwDSRIsBCR^ zy6YHd@EXZ9g1abaQch`v%FmLORK@+zSt$Wl(0;q#guH0ky|E_n>28X*Gif6M__P$Ou?a+ zivf+I5S7;93l#gh3*bHiuDM28bEf;Gv|`J{!PS<%6b&#lx=d^-_P2s*&B7k{1gvx^ z^f?7~x3m+wo3Rh7vS+-90yFo(t6iTm{&_F?)4k7b!ZB2c`3s!p9|_5)5UuKG5v5Gju<(cfyG7Y}U^xAgKkDfu_wuD@WggpTHRM zRwQR5YJb!Nr-GFH@d(16fC(d~4ZMS|nK=7>S9M%AElTv|q7Ck_XX2Q0rGR~N~fMkhdxHGHa#7T|(1RwjG3sQ%DP z>GLoQb*F)AFfcIWb7=po0L~g7K^jBJXhQ!OC(Xs`VbydTG<9^Z-Lgm66Ebr$+?k^@ zN7y3=XBWU`dAOC4aXdhB*c3=or|1v!ruaKekAIfy~1zliJD>QUGW;-hmM z%Euf-9Uj7cfNVy_@Qh&@sQggUHwbzoePdHH<**jK4)wr}<63ZMO2c?|2DLvdt)Gt% zFX+ckD7H^1G82T(@McUSV~-e=oC!!M#n1!?j}kcB6@^#NA+d=d#%^&zv>rLFAA3}) zUB6b79IYU3j_&)34dHavoT4&t)8vbOVq31lO>;nBu|ppSmH^A4guRtISg0+_u$v0d z(Nm1RGMeqFz*r+})I3da*p)M&!;yngdU{F=Y$d5-yFg`ms((m_hkzDr)ts@MqIJd~ zt1M>>OxR2$(4tu>T_+S_RL*t+C~m^Ly#qYLts;Cbp?KpKStHmcwuz=Kgtn;d*?o&-&>J^^` z#qyV=qSJ(Yh9S3gPS0jxdXw5u`+`a7#kNknh&#HL-_tBO6mJ$THN?|Qr>R#lV^z|O zQ_o{kdWP```9jjNv)67GCS}>F2U>QjSSB{Otg->;JBQV~tkTWmXt4${p*xbkIK7L> zbtyJM;q9_tYMzycwqwV5>GQo0T>Rdk6lFt0*N>;KrU3bt!ua*Rzv%Colz zpAKnQlWf>1q_bh;0c!^DxR@m+S4d{2rIns{*-Ite$_8d}9BBD9oFI1dyWXcHNnOb6 zTJ&`PFZwQIeUcZZN_%C%`=G~VeE_w#{cYxOc(t)5{MjXmShOS*4s<43gC#xX(|yyY zP3{bZ6FrmL!-zq`AH9!{S;rMR?s`m~Z*G=SatyOXy6U)xPi#6z7av;LD#*-KXc z2i0ToXeiu1wYUS_8DG;KjP)nM>9KfgYp@Mqn1)y+ure4oB1psigQ(#`VR(ng1!;Iv z9B8;OfB^ylA1?sm3r3^iNQ&)_L^`oAu8sR!I;n5rLtVjCZ2}(9PjUD(zAqGRV{PEd z5R#@tpQ&~91aq`H5?$#dAy(g#z;R&za8H)z21r;vXefM2ZgBK5s*6+SP)k6dtvwzM zqH%y=Q(qtwZVR6u&(?iqI87WZv- zTaNqlb3N~PMm_PWDccfp_{mO}TKYsev#BH10LtNwS7d*$ipRt;;)_uiV&q?mF zo?_4Wf39&4Iq6|{!K@GdevdnEhvzhR%`Eq^C%J2y-5D?5<5_*faVOlv3h&u`2U0un z#glL!=84xVcVDpf9e2^E(7{C8T@Ejv&2J~}eQTAc)SY|1yV5iA<)HiGwYT5b``ho_ z<2>&yShhaRwKNTG7Q52i8}MZYzRX6I>1djJ7QUpP0I#lV-O-;cNORqkW}lN-1>ZHW zZGSiW+=t<4Rn|B7mMogP!0PtLVla=b@Rg3PNIdB4h{WO+JZCxG*VY+Xjo|>Z2WVs^ zwC_oD$E=#hs)owOswtK)))9%uTM}(n1it1G4YdZXu3)r1=riB@;0d&RHH&)vw<;8kC;Xi>+PXz`b82D4zJ{vGc{rv}SUl2}2nRsMcVgr6`YPYt zMRko;b&b9yRgD&X55{M{q5?yVM15_@;P+bs!C1^P0q^s7!T?hm8mg8oYHFBUMdN`l zuq0r#IDpmB5O^4ekO;>@?crdn7r*`y4)(+?@L&wTIRl14;De(QfjF$0P7Av2inUwV z#p+*?})V0@Iv8GJml{Tof&MkV7mP6F>8KZlXtEcl56oa@8qs{A{?CE4rwzQ z3IOYm20CU#I-fipD%-u27fta_Zi~hJft8bCKymtRj}=aI`N$!dgkqL2kia?VOmu}Y z#o|`7Y8kvCiv12IvhRS;*SMaSw1jl zB@CLHupe8Zp>_xbivo*$gLXxrdy8Yr-`WMw0HX$uGK*CDe2M8kG0;%cfI}BxxG4 zFOrD&3#G=&1yyBJrlwkzgEzYITT}j4UrVHQjn&f`>VjBkwL;x!wGUTCTh!m)6@++5 zguDIG7|b<3SOlhq0zoSw4mNY(GXY}3;%$NHTkVfRL_kUeORUy#3|2%e(zy!50>Uol zUuB|hWiZ$cu^L(xv{vDFuzah4Y4yW5x?oL3RwlZ^F>U@tCv5MXk#M`0UiyV9PH#8# z4PWze&Ksr_a0RWtF0jN$1HxIdz$Dm$z##NLE_zsZq5kgbhP9tsxF}+F2hg|*(-CA3 zW1K(kx8MT;6GaXmnKcvk;rM8HzMz#FD+F2(CniTPm;mS1G$dyeW`HI$3a<6X6ER>Y z_I$7&NXVqBF8|7)1yKSy0FtDy&EFM*@4oTkBsrR7a)?>W&fD11i0T3dr%!>Ij#2{h%lDV3aJSw!%$&~4FNM{D45fiDN<^A027UYLAt4!C@D3Wpb0MZ&=j0Xzrp~izYCLOBQ`c*(Cs53S@JWSuqSa z8j~p$5)Qg2(BTKq(8S~B0kPQCxHm zlPKnRf5hzsH#D3+lj^NNX9Q;O#M;XFN%zgKYOJlPt4d8Wy4)A(Y?TE9>B;ZNMz~+X zv9%SVI^F^E2FH^yjUF;r*at2T;(~2~Z=J?FFze6(fuhW;-|j@L1M`%LV~8eP>%0@d zxdQBJ@XcwOyP&GkH?Oj>lK8qsC)U(ffx8mnm5@>cye@Fn(CSNV?X<|l5nsR`=zuf< zYnz=AhqO^<;p-H7#l0amg|cKc*bb=}QXrnOaL!;iRaIYEiz$XSUOMlf^>K`-PJg&P z;ctg3=rM<}E=s{BL#uotVa!{k?6hQ56b1vQH-FUMMgF4X zKrY98f-x^W_%IN~2Q*Ug*4)}fOE4Kj=uvWogD~b;oKkq3X5Nm$nBs$N3=asFIXJ?A z{V_Z#gBNJBs~0U=0J$1Z*4#DqOmSEX$8$LT!WuPe80RnmTNxezCCo9Qn9~!^3rJ!p zL3o2Qtm5>HB!v|Oj1OH0)#i}ZZ+nN(g@Y`J@NtE%2*^i1-nZ}^LJ1a=2}S>s+R7!> zzC|aVXm$BvKWdLg65S?NrbPW~~mv;y07*^94E} z>0q|xiw+XxNHdnw^$MuNjf3)iYP-SRFdA7S+YY!9yo{R|g&eQ)g;kA}w9@IYgXtxi zV;dVP>z2%gldctj{Rd9&>iAG!Qx8Xc+t+CouS z-hmDnZ>mpRk5zLUYZlcRpWyX7&Q+oXVjV9z;PPP=$1F?4{y?24xgy1Fxq0D7Tg4PJxIS>9N+#PYYm2?Vlgm%lv}u-a&) z$xv~V!mKxyuRI`x=?4T_TbXL8TxND6y1=A!j7fpGp_5e@|Gat|d~>TC%vRDb=y7%^ zSJOTpf?&iGIm{rXXH4#tn&e_r5>L+>K(qvgGn53y$ zql?AWiQJ(?}qCajh*GmSsHn_6@KJe2fW_%Kb6PJ%R zDvVdy5#-E@7yB_d48ZjQ-(Z1Ni;ITx75zR2Y|4C)Um%+5@LhyPALTq?leVHM*IKnrh@P!@%R1xN5;EZ~P3 zqGK@h1{v7gT9`t2225gxANjxm`B$4Ur(!7J4@bfwOinm&G>YVLBj&h8%6EJsVYqlo zUQ5HGrKIP)sRF~`>oJ^jGqV(!zC;+$fyUK%XUJS_;wg~29iva3O5UL@s1%B`^*N*?#Z@C4;$>c3~uS-XYlZ( z92I#I6fyaT9X|Z0(h9Hhn5Jhi=VWGI>Y9^Tc!_&XruV05b22AhJg73W^!)V7%<}bv z=Vz{Py*MDqF%FOKZUGp*v z*SqIudY28&ES#H}U76{r0b!JVnPutWHE0Fa#rvN--U{8Ru6J!v*CGrKht zZod}C)^tJAf%kaSymtr{4R-pA>Bw13BrTKT7Pwnh9E~7@ZOV$vfJI4zG1D4sNwh<9 zhqG0&q5Ul_cn^m;NH+Z>;UEVGI?!x{g){wLx2TV zvf5yW5AMT2aR2`)UQmPXgZtzCN(FQJvm}fmXMsml&6CSc5a_MT3{c3Q1>xf(*bmGM z738r@f|q%aulzFM)C;wW6^#!yH7T352M&0_M!VPV@&rCPZu4uaHu8g zrUQjo@)=^Tk@oVLn>3L2@_rJxPu}xq!JXW{*e~t9LhySPydP}*6{i@1%UBM_4faP2LL-*|A*6)xR$j=O^lX3 zV}SM#(}U~qK@AStQFQzBpiW~bel$<0*um`I!uF%xSnxd?{<-wn{7r%}GOid9W@P(xX^k%(f-jc7{e&n_7D7+OHCX`!P zIX;(%ed_*kO&+ZOW`0&;sp?R%(E8v7<n6D!2J9qW&Oo?xffH zSGlc`{Q>6O$Xc&q=rqO2#U~<;yYVTOK3qcU%4>|H9?a2GnSWE^e4H}B1PXQ7C+0lS^99Qzj@N&J4}!SBBKnUt ztTmKzl!vc3CFPHH;P~*i=$WhZNJe_XAwSk3|GAQvaee2IciJxxzo0!{haUX(KrCW^ z1#z%XGLCQK;7{!QHREU>`cv%Oru2BB4$FNGJ>!8FJ%4rJ&iVR>(j)WoFNeHyTm_uU zu=+5E{^JI~PZzJ48YMdAOW*t_^SP;j182HoJSnxcEMeq&0 z_2StPi{P91x(0I#7HyB5KTuxIKqx2ni=O+~sAN6>8MJ348;Iu}EFv!tkK=VG7QsEN zr`EtpJc9?cMB#VvI`JzUzEeb{P2m?YF7qJ$E`o1-VZrM#EP|iF_FrJ&B>n*h%H;}w zl>ICZ*@~VoS^sa9d=3ZHe=9tn_1~}X!+5?PQ}_n9^Ld4DXZ&vpKZ5=FzQUV1(7sf7 z39s896n-Du@8-CZ@t(?l$W*wG^%p68F8gPK!W;O=UZ(K3_-H#@;UhUg*C>1f_bb;S zV&}DNXN!`5hy4~-_(;}srotz)UoKGiXDp9D&yGd@6~2r8bC|-*Ik04Z6FqNmzMHA!H}ibWS9n;?Cko%edDy4$Q+QrhD!i5L zU#;+UY|jRTA95o`3nDv`9_5| zaeVp}ek$W(g$EcvOW{9e{6dA7uph2c_|xpS8x@ZCyRiI5;cHmWT?&7V{q~^3_wu@U zQsMcWSI2NW@xQFEA1QnSPD|`m?3l#nk+i|+W;~bwMh2yXBV~H#Lb&lJu z3jdJf;a-K0=JEbj;ZO3o-ck5T-0w#N;NL1-_KU&XkNC5J*J+Nz>p72&Rrt%yPg3}q z+}|99?`MD3Dg0`-|73+v;`wS*cro))h5wxM)#VC*k@x-E6<)ypyi?)dn`yMRD?G^d zKdkU;d48W70Do8Eqj+3$UJ(Dwb%Oa%JyPe@mwBBI=k+A=f)^=V{4zn|cW}RD3U6Wm z%vN}u0q|0Vcd$QaEBsG<4q2@5{Vcyy z;qt=}JqpKP2f@;-a2eMX3O|n5=dB9Ao#*$D1KNva!vDeR6rWkbBK^L>@w!;yJ9&Mb zuJ9{4-c~AH_K_Zi&tW@z6@CcE<>d;0+?Z!=R`{ok->z^!&+m4HkL5h`sKTf4xSmt^ z*}Ol#p>Q|PUS{dtkX|IGR5YK5Q1cK%A?J2^l9Ug4`b-tJfU zTZ})h@E6&hmlZDi=-(AShsX7)!qeIQ{R%&c<%hBVWFGTbu1Mj<9REisd;`bBRE2-W z_E#u;Jj*Xs_!I2UlNEj@+taS_Gk9DHh2PI{yk6n5-Zv@y7}m2{;mw@i-g5W`3*T*S6 zZM;KbxxX`6;SxW` zDI7nu$5N$m$)AfA9^!aDP2qCB3Mu>?9#=x)zvOj&p29C?{-+9;^X-2rTz;YM7KLwT z{%(ciZwg`ArEux@TZR9I<7zO+yUdH+CmO48*-z^g-okl%slw-QK9SE|MSm_5Py$N+ zHMS?Aa5t}u^9I0WUlsjg=g*b=GG4#8DEuA9|ETa$%s-{@N{;ha2EgTdNbDIV`;n5D zyzzs=#eR9dSoGkJvSZ2T>sP_|aNZlQaJdgttZ>PDGZg*=uiJ$RujlbDSNIF;H=n{E zC-wg_1!t3f% zg`dm%uT}U4#&1&iMT~D%_@V6Qc7A|K{I;9(SXAMMN!%*@eV)fYh0FcPs}wHJ?cJd8 zi&)Pc3LnJlce}!EmVZRy+xgu7tiqdFe$N2-UWFgS{{LLzvOn4R{o`!|`)9bqhw-{7 zQn>hMg2HcRJJ%?D9>;mF!sQ1mFIV^$_QPg{f6IDqSGZiyY*)D0`KZE=<$U{`!X^K| zq3|u7ul}X*J9)g{D10{OvB3rX{k)&!Ggskp&P(GI-e#Ix#R|WS=VhkC>Hh|WHm@rD ze765hgp9-GDO~hCuJ8cc^NhmBG5(Um zA7%gSQTS18&)W*e|Md~eUWI#kem_>Yk+!UF75+B+Kb;@+6#ol8QsJ_W4psQkod1tf z_{W@orYrnrwsVfcW!;^k@T=I)bqZh3`}_F{-^cb`tnetu=M@USlJ#7#aJfGJjl!q% zJl>`7^EeMYr0|<~0-jX3e9rN@!r$ij+^g_Eu$`YNyo=*pzAzy3_$tTAQ2rtTn$4k1 z7A zn6B{i*bhw#zlHPmN`-&N=fjN(@3l<1LE+zHl7n)Wm)?@sFSB_ay`b=`*&co)c|P)z z0*o0f=oVgb#LM&W8uwDIk#)*XQ@H4@R(L7%TNN&O?=^)>-th3eVW0RX>*ap{hdY`p literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/.libs/mod_imap.a b/rubbos/app/httpd-2.0.64/modules/mappers/.libs/mod_imap.a new file mode 100644 index 0000000000000000000000000000000000000000..e30d4fd58cbfbbb35677b9a8418d540030bd454c GIT binary patch literal 72260 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 F{1@-{jP3vc literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/.libs/mod_negotiation.la b/rubbos/app/httpd-2.0.64/modules/mappers/.libs/mod_negotiation.la new file mode 100644 index 00000000..7b42e96c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/mappers/.libs/mod_negotiation.la @@ -0,0 +1,35 @@ +# mod_negotiation.la - a libtool library file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='' + +# Names of this library. +library_names='' + +# The name of the static archive. +old_library='mod_negotiation.a' + +# Libraries that this one depends upon. +dependency_libs=' -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib' + +# Version information for mod_negotiation. +current= +age= +revision= + +# Is this an already installed library? +installed=no + +# Should we warn about portability when linking against -modules? +shouldnotlink=yes + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='' diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/.libs/mod_negotiation.o b/rubbos/app/httpd-2.0.64/modules/mappers/.libs/mod_negotiation.o new file mode 100644 index 0000000000000000000000000000000000000000..38f004265e10d17cfd43d8bd1e690129add2f6dd GIT binary patch literal 149648 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 E2XZvYV*mgE literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/.libs/mod_so.la b/rubbos/app/httpd-2.0.64/modules/mappers/.libs/mod_so.la new file mode 100644 index 00000000..1c9e8489 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/mappers/.libs/mod_so.la @@ -0,0 +1,35 @@ +# mod_so.la - a libtool library file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='' + +# Names of this library. +library_names='' + +# The name of the static archive. +old_library='mod_so.a' + +# Libraries that this one depends upon. +dependency_libs=' -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib' + +# Version information for mod_so. +current= +age= +revision= + +# Is this an already installed library? +installed=no + +# Should we warn about portability when linking against -modules? +shouldnotlink=yes + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='' diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/.libs/mod_so.o b/rubbos/app/httpd-2.0.64/modules/mappers/.libs/mod_so.o new file mode 100644 index 0000000000000000000000000000000000000000..71d442fa491016e7306ea88bc5c69dae47be116d GIT binary patch literal 29736 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 T=8pp#q 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/Makefile b/rubbos/app/httpd-2.0.64/modules/mappers/Makefile new file mode 100644 index 00000000..536b0888 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/mappers/Makefile @@ -0,0 +1,8 @@ +top_srcdir = /bottlenecks/rubbos/app/httpd-2.0.64 +top_builddir = /bottlenecks/rubbos/app/httpd-2.0.64 +srcdir = /bottlenecks/rubbos/app/httpd-2.0.64/modules/mappers +builddir = /bottlenecks/rubbos/app/httpd-2.0.64/modules/mappers +VPATH = /bottlenecks/rubbos/app/httpd-2.0.64/modules/mappers + +include $(top_srcdir)/build/special.mk + diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/Makefile.in b/rubbos/app/httpd-2.0.64/modules/mappers/Makefile.in new file mode 100644 index 00000000..167b343d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/mappers/Makefile.in @@ -0,0 +1,3 @@ + +include $(top_srcdir)/build/special.mk + diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/NWGNUmakefile b/rubbos/app/httpd-2.0.64/modules/mappers/NWGNUmakefile new file mode 100644 index 00000000..62c9624d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/mappers/NWGNUmakefile @@ -0,0 +1,247 @@ +# +# Declare the sub-directories to be built here +# + +SUBDIRS = \ + $(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 += \ + $(EOLIST) + +# +# These flags will come after CFLAGS +# +XCFLAGS += \ + $(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 = + +# +# This is used by the link '-desc ' directive. +# If left blank, NLM_NAME will be used. +# +NLM_DESCRIPTION = + +# +# This is used by the '-threadname' directive. If left blank, +# NLM_NAME Thread will be used. +# +NLM_THREAD_NAME = + +# +# 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 = + + +# +# 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 = + +# +# If these are specified it will be used by the link '-flags' directive +# +NLM_FLAGS = + +# +# 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)/rewrite.nlm \ + $(OBJDIR)/speling.nlm \ + $(OBJDIR)/vhost.nlm \ + $(EOLIST) + +# +# If there is an LIB target, put it here +# +TARGET_lib = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the NLM target above. +# Paths must all use the '/' character +# +FILES_nlm_objs = \ + $(EOLIST) + +# +# 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 = \ + $(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 = \ + $(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 = \ + $(EOLIST) + +# +# Any symbols exported to here +# +FILES_nlm_exports = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the LIB target above. +# Paths must all use the '/' character +# +FILES_lib_objs = \ + $(EOLIST) + +# +# 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) +# +install :: nlms FORCE + copy $(OBJDIR)\*.nlm $(INSTALL)\Apache2\modules\*.* + +# +# Any specialized rules here +# + +# +# Include the 'tail' makefile that has targets that depend on variables defined +# in this makefile +# + +include $(AP_WORK)\build\NWGNUtail.inc + + diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/NWGNUrewrite b/rubbos/app/httpd-2.0.64/modules/mappers/NWGNUrewrite new file mode 100644 index 00000000..960fca7c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/mappers/NWGNUrewrite @@ -0,0 +1,248 @@ +# +# Make sure all needed macro's are defined +# + +# +# Get the 'head' of the build environment if necessary. This includes default +# targets and paths to tools +# + +ifndef EnvironmentDefined +include $(AP_WORK)\build\NWGNUhead.inc +endif + +# +# These directories will be at the beginning of the include list, followed by +# INCDIRS +# +XINCDIRS += \ + $(APR)/include \ + $(APRUTIL)/include \ + $(AP_WORK)/include \ + $(NWOS) \ + $(EOLIST) + +# +# These flags will come after CFLAGS +# +XCFLAGS += \ + $(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 = rewrite + +# +# This is used by the link '-desc ' directive. +# If left blank, NLM_NAME will be used. +# +NLM_DESCRIPTION = Apache $(VERSION_STR) Rewrite Module + +# +# This is used by the '-threadname' directive. If left blank, +# NLM_NAME Thread will be used. +# +NLM_THREAD_NAME = Rewrite Module + +# +# 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 = 8192 + + +# +# If this is specified it will be used by the link '-entry' directive +# +NLM_ENTRY_SYM = _LibCPrelude + +# +# If this is specified it will be used by the link '-exit' directive +# +NLM_EXIT_SYM = _LibCPostlude + +# +# If this is specified it will be used by the link '-check' directive +# +NLM_CHECK_SYM = + +# +# If these are specified it will be used by the link '-flags' directive +# +NLM_FLAGS = AUTOUNLOAD, 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)/rewrite.nlm \ + $(EOLIST) + +# +# If there is an LIB target, put it here +# +TARGET_lib = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the NLM target above. +# Paths must all use the '/' character +# +FILES_nlm_objs = \ + $(OBJDIR)/mod_rewrite.o \ + $(EOLIST) + +# +# 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 = \ + libcpre.o \ + $(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 = \ + @$(APR)/aprlib.imp \ + @$(NWOS)/httpd.imp \ + @libc.imp \ + $(EOLIST) + +# +# Any symbols exported to here +# +FILES_nlm_exports = \ + rewrite_module \ + $(EOLIST) + +# +# These are the OBJ files needed to create the LIB target above. +# Paths must all use the '/' character +# +FILES_lib_objs = \ + $(EOLIST) + +# +# 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) +# +install :: nlms FORCE + +# +# Any specialized rules here +# + +# +# Include the 'tail' makefile that has targets that depend on variables defined +# in this makefile +# + +include $(AP_WORK)\build\NWGNUtail.inc + + diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/NWGNUspeling b/rubbos/app/httpd-2.0.64/modules/mappers/NWGNUspeling new file mode 100644 index 00000000..550def1a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/mappers/NWGNUspeling @@ -0,0 +1,248 @@ +# +# Make sure all needed macro's are defined +# + +# +# Get the 'head' of the build environment if necessary. This includes default +# targets and paths to tools +# + +ifndef EnvironmentDefined +include $(AP_WORK)\build\NWGNUhead.inc +endif + +# +# These directories will be at the beginning of the include list, followed by +# INCDIRS +# +XINCDIRS += \ + $(APR)/include \ + $(APRUTIL)/include \ + $(AP_WORK)/include \ + $(NWOS) \ + $(EOLIST) + +# +# These flags will come after CFLAGS +# +XCFLAGS += \ + $(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 = speling + +# +# This is used by the link '-desc ' directive. +# If left blank, NLM_NAME will be used. +# +NLM_DESCRIPTION = Apache $(VERSION_STR) Speling Module + +# +# This is used by the '-threadname' directive. If left blank, +# NLM_NAME Thread will be used. +# +NLM_THREAD_NAME = Speling Module + +# +# 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 = 8192 + + +# +# If this is specified it will be used by the link '-entry' directive +# +NLM_ENTRY_SYM = _LibCPrelude + +# +# If this is specified it will be used by the link '-exit' directive +# +NLM_EXIT_SYM = _LibCPostlude + +# +# If this is specified it will be used by the link '-check' directive +# +NLM_CHECK_SYM = + +# +# If these are specified it will be used by the link '-flags' directive +# +NLM_FLAGS = AUTOUNLOAD, 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)/speling.nlm \ + $(EOLIST) + +# +# If there is an LIB target, put it here +# +TARGET_lib = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the NLM target above. +# Paths must all use the '/' character +# +FILES_nlm_objs = \ + $(OBJDIR)/mod_speling.o \ + $(EOLIST) + +# +# 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 = \ + libcpre.o \ + $(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 = \ + @$(APR)/aprlib.imp \ + @$(NWOS)/httpd.imp \ + @libc.imp \ + $(EOLIST) + +# +# Any symbols exported to here +# +FILES_nlm_exports = \ + speling_module \ + $(EOLIST) + +# +# These are the OBJ files needed to create the LIB target above. +# Paths must all use the '/' character +# +FILES_lib_objs = \ + $(EOLIST) + +# +# 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) +# +install :: nlms FORCE + +# +# Any specialized rules here +# + +# +# Include the 'tail' makefile that has targets that depend on variables defined +# in this makefile +# + +include $(AP_WORK)\build\NWGNUtail.inc + + diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/NWGNUvhost b/rubbos/app/httpd-2.0.64/modules/mappers/NWGNUvhost new file mode 100644 index 00000000..8d68295a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/mappers/NWGNUvhost @@ -0,0 +1,248 @@ +# +# Make sure all needed macro's are defined +# + +# +# Get the 'head' of the build environment if necessary. This includes default +# targets and paths to tools +# + +ifndef EnvironmentDefined +include $(AP_WORK)\build\NWGNUhead.inc +endif + +# +# These directories will be at the beginning of the include list, followed by +# INCDIRS +# +XINCDIRS += \ + $(APR)/include \ + $(APRUTIL)/include \ + $(AP_WORK)/include \ + $(NWOS) \ + $(EOLIST) + +# +# These flags will come after CFLAGS +# +XCFLAGS += \ + $(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 = vhost + +# +# This is used by the link '-desc ' directive. +# If left blank, NLM_NAME will be used. +# +NLM_DESCRIPTION = Apache $(VERSION_STR) Vhost Alias Module + +# +# This is used by the '-threadname' directive. If left blank, +# NLM_NAME Thread will be used. +# +NLM_THREAD_NAME = Vhost Alias Module + +# +# 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 = 8192 + + +# +# If this is specified it will be used by the link '-entry' directive +# +NLM_ENTRY_SYM = _LibCPrelude + +# +# If this is specified it will be used by the link '-exit' directive +# +NLM_EXIT_SYM = _LibCPostlude + +# +# If this is specified it will be used by the link '-check' directive +# +NLM_CHECK_SYM = + +# +# If these are specified it will be used by the link '-flags' directive +# +NLM_FLAGS = AUTOUNLOAD, 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)/vhost.nlm \ + $(EOLIST) + +# +# If there is an LIB target, put it here +# +TARGET_lib = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the NLM target above. +# Paths must all use the '/' character +# +FILES_nlm_objs = \ + $(OBJDIR)/mod_vhost_alias.o \ + $(EOLIST) + +# +# 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 = \ + libcpre.o \ + $(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 = \ + @$(APR)/aprlib.imp \ + @$(NWOS)/httpd.imp \ + @libc.imp \ + $(EOLIST) + +# +# Any symbols exported to here +# +FILES_nlm_exports = \ + vhost_alias_module \ + $(EOLIST) + +# +# These are the OBJ files needed to create the LIB target above. +# Paths must all use the '/' character +# +FILES_lib_objs = \ + $(EOLIST) + +# +# 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) +# +install :: nlms FORCE + +# +# Any specialized rules here +# + +# +# Include the 'tail' makefile that has targets that depend on variables defined +# in this makefile +# + +include $(AP_WORK)\build\NWGNUtail.inc + + diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/config9.m4 b/rubbos/app/httpd-2.0.64/modules/mappers/config9.m4 new file mode 100644 index 00000000..adb66ea8 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/mappers/config9.m4 @@ -0,0 +1,57 @@ +dnl modules enabled in this directory by default + +dnl APACHE_MODULE(name, helptext[, objects[, structname[, default[, config]]]]) + +APACHE_MODPATH_INIT(mappers) + +APACHE_MODULE(vhost_alias, mass virtual hosting module, , , most) +APACHE_MODULE(negotiation, content negotiation, , , yes) +APACHE_MODULE(dir, directory request handling, , , yes) +APACHE_MODULE(imap, server-side imagemaps, , , yes) +APACHE_MODULE(actions, Action triggering on requests, , , yes) +APACHE_MODULE(speling, correct common URL misspellings, , , most) +APACHE_MODULE(userdir, mapping of requests to user-specific directories, , , yes) +APACHE_MODULE(alias, mapping of requests to different filesystem parts, , , yes) + +APACHE_MODULE(rewrite, rule based URL manipulation, , , most) + + +APR_CHECK_APR_DEFINE(APR_HAS_DSO) + +case "x$enable_so" in + "xyes") + if test $ac_cv_define_APR_HAS_DSO = "no"; then + AC_MSG_ERROR([mod_so has been requested but cannot be built on your system]) + fi + ;; + "xshared") + AC_MSG_ERROR([mod_so can not be built as a shared DSO]) + ;; + "xno") + ;; + "x") + enable_so=$ac_cv_define_APR_HAS_DSO + ;; +esac + +dnl mod_so can only be built statically. If the user wants modules to +dnl be built as DSOs by default (eg. ./configure --enable-mods-shared=most) +dnl then we must override the default here. +if test "x$enable_so" = "xyes"; then + enable_so="static" +fi + +if test "$sharedobjs" = "yes"; then + if test $ac_cv_define_APR_HAS_DSO = "no"; then + AC_MSG_ERROR([shared objects have been requested but cannot be built since mod_so cannot be built]) + elif test $enable_so = "no"; then + AC_MSG_ERROR([shared objects have been requested but cannot be built since mod_so was disabled]) + fi +fi + +APACHE_MODULE(so, DSO capability, , , $enable_so) + +dnl ### why save the cache? +AC_CACHE_SAVE + +APACHE_MODPATH_FINISH diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/mod_actions.c b/rubbos/app/httpd-2.0.64/modules/mappers/mod_actions.c new file mode 100644 index 00000000..f8af935a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/mappers/mod_actions.c @@ -0,0 +1,198 @@ +/* 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. + */ + +/* + * mod_actions.c: executes scripts based on MIME type or HTTP method + * + * by Alexei Kosut; based on mod_cgi.c, mod_mime.c and mod_includes.c, + * adapted by rst from original NCSA code by Rob McCool + * + * Usage instructions: + * + * Action mime/type /cgi-bin/script + * + * will activate /cgi-bin/script when a file of content type mime/type is + * requested. It sends the URL and file path of the requested document using + * the standard CGI PATH_INFO and PATH_TRANSLATED environment variables. + * + * Script PUT /cgi-bin/script + * + * will activate /cgi-bin/script when a request is received with the + * HTTP method "PUT". The available method names are defined in httpd.h. + * If the method is GET, the script will only be activated if the requested + * URI includes query information (stuff after a ?-mark). + */ + +#include "apr_strings.h" +#include "ap_config.h" +#include "httpd.h" +#include "http_config.h" +#include "http_request.h" +#include "http_core.h" +#include "http_protocol.h" +#include "http_main.h" +#include "http_log.h" +#include "util_script.h" + +typedef struct { + apr_table_t *action_types; /* Added with Action... */ + const char *scripted[METHODS]; /* Added with Script... */ + int configured; /* True if Action or Script has been + * called at least once + */ +} action_dir_config; + +module AP_MODULE_DECLARE_DATA actions_module; + +static void *create_action_dir_config(apr_pool_t *p, char *dummy) +{ + action_dir_config *new = + (action_dir_config *) apr_pcalloc(p, sizeof(action_dir_config)); + + new->action_types = apr_table_make(p, 4); + + return new; +} + +static void *merge_action_dir_configs(apr_pool_t *p, void *basev, void *addv) +{ + action_dir_config *base = (action_dir_config *) basev; + action_dir_config *add = (action_dir_config *) addv; + action_dir_config *new = (action_dir_config *) apr_palloc(p, + sizeof(action_dir_config)); + int i; + + new->action_types = apr_table_overlay(p, add->action_types, + base->action_types); + + for (i = 0; i < METHODS; ++i) { + new->scripted[i] = add->scripted[i] ? add->scripted[i] + : base->scripted[i]; + } + + new->configured = (base->configured || add->configured); + return new; +} + +static const char *add_action(cmd_parms *cmd, void *m_v, + const char *type, const char *script) +{ + action_dir_config *m = (action_dir_config *)m_v; + apr_table_setn(m->action_types, type, script); + m->configured = 1; + return NULL; +} + +static const char *set_script(cmd_parms *cmd, void *m_v, + const char *method, const char *script) +{ + action_dir_config *m = (action_dir_config *)m_v; + int methnum; + + methnum = ap_method_number_of(method); + if (methnum == M_TRACE) + return "TRACE not allowed for Script"; + else if (methnum == M_INVALID) + return "Unknown method type for Script"; + else + m->scripted[methnum] = script; + + m->configured = 1; + return NULL; +} + +static const command_rec action_cmds[] = +{ + AP_INIT_TAKE2("Action", add_action, NULL, OR_FILEINFO, + "a media type followed by a script name"), + AP_INIT_TAKE2("Script", set_script, NULL, ACCESS_CONF | RSRC_CONF, + "a method followed by a script name"), + {NULL} +}; + +static int action_handler(request_rec *r) +{ + action_dir_config *conf = (action_dir_config *) + ap_get_module_config(r->per_dir_config, &actions_module); + const char *t, *action; + const char *script; + int i; + + if (!conf->configured) { + return DECLINED; + } + + /* Note that this handler handles _all_ types, so handler is unchecked */ + + /* Set allowed stuff */ + for (i = 0; i < METHODS; ++i) { + if (conf->scripted[i]) + r->allowed |= (AP_METHOD_BIT << i); + } + + /* First, check for the method-handling scripts */ + if (r->method_number == M_GET) { + if (r->args) + script = conf->scripted[M_GET]; + else + script = NULL; + } + else { + script = conf->scripted[r->method_number]; + } + + /* Check for looping, which can happen if the CGI script isn't */ + if (script && r->prev && r->prev->prev) + return DECLINED; + + /* Second, check for actions (which override the method scripts) */ + action = r->handler ? r->handler : + ap_field_noparam(r->pool, r->content_type); + if ((t = apr_table_get(conf->action_types, + action ? action : ap_default_type(r)))) { + script = t; + if (r->finfo.filetype == 0) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "File does not exist: %s", r->filename); + return HTTP_NOT_FOUND; + } + } + + if (script == NULL) + return DECLINED; + + ap_internal_redirect_handler(apr_pstrcat(r->pool, script, + ap_escape_uri(r->pool, r->uri), + r->args ? "?" : NULL, + r->args, NULL), r); + return OK; +} + +static void register_hooks(apr_pool_t *p) +{ + ap_hook_handler(action_handler,NULL,NULL,APR_HOOK_LAST); +} + +module AP_MODULE_DECLARE_DATA actions_module = +{ + STANDARD20_MODULE_STUFF, + create_action_dir_config, /* dir config creater */ + merge_action_dir_configs, /* dir merger --- default is to override */ + NULL, /* server config */ + NULL, /* merge server config */ + action_cmds, /* command apr_table_t */ + register_hooks /* register hooks */ +}; diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/mod_actions.dsp b/rubbos/app/httpd-2.0.64/modules/mappers/mod_actions.dsp new file mode 100644 index 00000000..f78be8f0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/mappers/mod_actions.dsp @@ -0,0 +1,128 @@ +# Microsoft Developer Studio Project File - Name="mod_actions" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=mod_actions - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "mod_actions.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 "mod_actions.mak" CFG="mod_actions - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "mod_actions - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_actions - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "mod_actions - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_actions_src" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /out:"Release/mod_actions.so" /base:@..\..\os\win32\BaseAddr.ref,mod_actions.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Release/mod_actions.so" /base:@..\..\os\win32\BaseAddr.ref,mod_actions.so /opt:ref + +!ELSEIF "$(CFG)" == "mod_actions - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_actions_src" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_actions.so" /base:@..\..\os\win32\BaseAddr.ref,mod_actions.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_actions.so" /base:@..\..\os\win32\BaseAddr.ref,mod_actions.so + +!ENDIF + +# Begin Target + +# Name "mod_actions - Win32 Release" +# Name "mod_actions - Win32 Debug" +# Begin Source File + +SOURCE=.\mod_actions.c +# End Source File +# Begin Source File + +SOURCE=.\mod_actions.rc +# End Source File +# Begin Source File + +SOURCE=..\..\build\win32\win32ver.awk + +!IF "$(CFG)" == "mod_actions - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_actions.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_actions.so "actions_module for Apache" ../../include/ap_release.h > .\mod_actions.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "mod_actions - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_actions.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_actions.so "actions_module for Apache" ../../include/ap_release.h > .\mod_actions.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/mod_actions.exp b/rubbos/app/httpd-2.0.64/modules/mappers/mod_actions.exp new file mode 100644 index 00000000..8cc6cdb1 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/mappers/mod_actions.exp @@ -0,0 +1 @@ +actions_module diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/mod_actions.la b/rubbos/app/httpd-2.0.64/modules/mappers/mod_actions.la new file mode 100644 index 00000000..4bc62514 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/mappers/mod_actions.la @@ -0,0 +1,35 @@ +# mod_actions.la - a libtool library file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='' + +# Names of this library. +library_names='' + +# The name of the static archive. +old_library='mod_actions.a' + +# Libraries that this one depends upon. +dependency_libs=' -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib' + +# Version information for mod_actions. +current= +age= +revision= + +# Is this an already installed library? +installed=no + +# Should we warn about portability when linking against -modules? +shouldnotlink=yes + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='' diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/mod_actions.lo b/rubbos/app/httpd-2.0.64/modules/mappers/mod_actions.lo new file mode 100644 index 00000000..a7d3e371 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/mappers/mod_actions.lo @@ -0,0 +1,12 @@ +# mod_actions.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/mod_actions.o' + +# Name of the non-PIC object. +non_pic_object='mod_actions.o' + diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/mod_actions.o b/rubbos/app/httpd-2.0.64/modules/mappers/mod_actions.o new file mode 100644 index 0000000000000000000000000000000000000000..91f684c1a54ee02f3a85be35e03a1e4cfe7fd59b GIT binary patch literal 36688 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 Z3YYced4)^9{Yc@GXXKB$NV_t>{tsu)EUW+k literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/mod_alias.c b/rubbos/app/httpd-2.0.64/modules/mappers/mod_alias.c new file mode 100644 index 00000000..4e5b6ef0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/mappers/mod_alias.c @@ -0,0 +1,484 @@ +/* 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. + */ + +/* + * http_alias.c: Stuff for dealing with directory aliases + * + * Original by Rob McCool, rewritten in succession by David Robinson + * and rst. + * + */ + +#include "apr_strings.h" +#include "apr_lib.h" + +#define APR_WANT_STRFUNC +#include "apr_want.h" + +#include "ap_config.h" +#include "httpd.h" +#include "http_core.h" +#include "http_config.h" +#include "http_request.h" +#include "http_log.h" + + +typedef struct { + const char *real; + const char *fake; + char *handler; + regex_t *regexp; + int redir_status; /* 301, 302, 303, 410, etc */ +} alias_entry; + +typedef struct { + apr_array_header_t *aliases; + apr_array_header_t *redirects; +} alias_server_conf; + +typedef struct { + apr_array_header_t *redirects; +} alias_dir_conf; + +module AP_MODULE_DECLARE_DATA alias_module; + +static void *create_alias_config(apr_pool_t *p, server_rec *s) +{ + alias_server_conf *a = + (alias_server_conf *) apr_pcalloc(p, sizeof(alias_server_conf)); + + a->aliases = apr_array_make(p, 20, sizeof(alias_entry)); + a->redirects = apr_array_make(p, 20, sizeof(alias_entry)); + return a; +} + +static void *create_alias_dir_config(apr_pool_t *p, char *d) +{ + alias_dir_conf *a = + (alias_dir_conf *) apr_pcalloc(p, sizeof(alias_dir_conf)); + a->redirects = apr_array_make(p, 2, sizeof(alias_entry)); + return a; +} + +static void *merge_alias_config(apr_pool_t *p, void *basev, void *overridesv) +{ + alias_server_conf *a = + (alias_server_conf *) apr_pcalloc(p, sizeof(alias_server_conf)); + alias_server_conf *base = (alias_server_conf *) basev; + alias_server_conf *overrides = (alias_server_conf *) overridesv; + + a->aliases = apr_array_append(p, overrides->aliases, base->aliases); + a->redirects = apr_array_append(p, overrides->redirects, base->redirects); + return a; +} + +static void *merge_alias_dir_config(apr_pool_t *p, void *basev, void *overridesv) +{ + alias_dir_conf *a = + (alias_dir_conf *) apr_pcalloc(p, sizeof(alias_dir_conf)); + alias_dir_conf *base = (alias_dir_conf *) basev; + alias_dir_conf *overrides = (alias_dir_conf *) overridesv; + a->redirects = apr_array_append(p, overrides->redirects, base->redirects); + return a; +} + +/* need prototype for overlap check */ +static int alias_matches(const char *uri, const char *alias_fakename); + +static const char *add_alias_internal(cmd_parms *cmd, void *dummy, + const char *f, const char *r, + int use_regex) +{ + server_rec *s = cmd->server; + alias_server_conf *conf = ap_get_module_config(s->module_config, + &alias_module); + alias_entry *new = apr_array_push(conf->aliases); + alias_entry *entries = (alias_entry *)conf->aliases->elts; + int i; + + /* XX r can NOT be relative to DocumentRoot here... compat bug. */ + + if (use_regex) { + new->regexp = ap_pregcomp(cmd->pool, f, REG_EXTENDED); + if (new->regexp == NULL) + return "Regular expression could not be compiled."; + new->real = r; + } + else { + /* XXX This may be optimized, but we must know that new->real + * exists. If so, we can dir merge later, trusing new->real + * and just canonicalizing the remainder. Not till I finish + * cleaning out the old ap_canonical stuff first. + */ + new->real = r; + } + new->fake = f; + new->handler = cmd->info; + + /* check for overlapping (Script)Alias directives + * and throw a warning if found one + */ + if (!use_regex) { + for (i = 0; i < conf->aliases->nelts - 1; ++i) { + alias_entry *p = &entries[i]; + + if ( (!p->regexp && alias_matches(f, p->fake) > 0) + || (p->regexp && !ap_regexec(p->regexp, f, 0, NULL, 0))) { + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, cmd->server, + "The %s directive in %s at line %d will probably " + "never match because it overlaps an earlier " + "%sAlias%s.", + cmd->cmd->name, cmd->directive->filename, + cmd->directive->line_num, + p->handler ? "Script" : "", + p->regexp ? "Match" : ""); + + break; /* one warning per alias should be sufficient */ + } + } + } + + return NULL; +} + +static const char *add_alias(cmd_parms *cmd, void *dummy, const char *f, + const char *r) +{ + return add_alias_internal(cmd, dummy, f, r, 0); +} + +static const char *add_alias_regex(cmd_parms *cmd, void *dummy, const char *f, + const char *r) +{ + return add_alias_internal(cmd, dummy, f, r, 1); +} + +static const char *add_redirect_internal(cmd_parms *cmd, + alias_dir_conf *dirconf, + const char *arg1, const char *arg2, + const char *arg3, int use_regex) +{ + alias_entry *new; + server_rec *s = cmd->server; + alias_server_conf *serverconf = ap_get_module_config(s->module_config, + &alias_module); + int status = (int) (long) cmd->info; + regex_t *r = NULL; + const char *f = arg2; + const char *url = arg3; + + if (!strcasecmp(arg1, "gone")) + status = HTTP_GONE; + else if (!strcasecmp(arg1, "permanent")) + status = HTTP_MOVED_PERMANENTLY; + else if (!strcasecmp(arg1, "temp")) + status = HTTP_MOVED_TEMPORARILY; + else if (!strcasecmp(arg1, "seeother")) + status = HTTP_SEE_OTHER; + else if (apr_isdigit(*arg1)) + status = atoi(arg1); + else { + f = arg1; + url = arg2; + } + + if (use_regex) { + r = ap_pregcomp(cmd->pool, f, REG_EXTENDED); + if (r == NULL) + return "Regular expression could not be compiled."; + } + + if (ap_is_HTTP_REDIRECT(status)) { + if (!url) + return "URL to redirect to is missing"; + if (!use_regex && !ap_is_url(url)) + return "Redirect to non-URL"; + } + else { + if (url) + return "Redirect URL not valid for this status"; + } + + if (cmd->path) + new = apr_array_push(dirconf->redirects); + else + new = apr_array_push(serverconf->redirects); + + new->fake = f; + new->real = url; + new->regexp = r; + new->redir_status = status; + return NULL; +} + +static const char *add_redirect(cmd_parms *cmd, void *dirconf, + const char *arg1, const char *arg2, + const char *arg3) +{ + return add_redirect_internal(cmd, dirconf, arg1, arg2, arg3, 0); +} + +static const char *add_redirect2(cmd_parms *cmd, void *dirconf, + const char *arg1, const char *arg2) +{ + return add_redirect_internal(cmd, dirconf, arg1, arg2, NULL, 0); +} + +static const char *add_redirect_regex(cmd_parms *cmd, void *dirconf, + const char *arg1, const char *arg2, + const char *arg3) +{ + return add_redirect_internal(cmd, dirconf, arg1, arg2, arg3, 1); +} + +static const command_rec alias_cmds[] = +{ + AP_INIT_TAKE2("Alias", add_alias, NULL, RSRC_CONF, + "a fakename and a realname"), + AP_INIT_TAKE2("ScriptAlias", add_alias, "cgi-script", RSRC_CONF, + "a fakename and a realname"), + AP_INIT_TAKE23("Redirect", add_redirect, (void *) HTTP_MOVED_TEMPORARILY, + OR_FILEINFO, + "an optional status, then document to be redirected and " + "destination URL"), + AP_INIT_TAKE2("AliasMatch", add_alias_regex, NULL, RSRC_CONF, + "a regular expression and a filename"), + AP_INIT_TAKE2("ScriptAliasMatch", add_alias_regex, "cgi-script", RSRC_CONF, + "a regular expression and a filename"), + AP_INIT_TAKE23("RedirectMatch", add_redirect_regex, + (void *) HTTP_MOVED_TEMPORARILY, OR_FILEINFO, + "an optional status, then a regular expression and " + "destination URL"), + AP_INIT_TAKE2("RedirectTemp", add_redirect2, + (void *) HTTP_MOVED_TEMPORARILY, OR_FILEINFO, + "a document to be redirected, then the destination URL"), + AP_INIT_TAKE2("RedirectPermanent", add_redirect2, + (void *) HTTP_MOVED_PERMANENTLY, OR_FILEINFO, + "a document to be redirected, then the destination URL"), + {NULL} +}; + +static int alias_matches(const char *uri, const char *alias_fakename) +{ + const char *aliasp = alias_fakename, *urip = uri; + + while (*aliasp) { + if (*aliasp == '/') { + /* any number of '/' in the alias matches any number in + * the supplied URI, but there must be at least one... + */ + if (*urip != '/') + return 0; + + do { + ++aliasp; + } while (*aliasp == '/'); + do { + ++urip; + } while (*urip == '/'); + } + else { + /* Other characters are compared literally */ + if (*urip++ != *aliasp++) + return 0; + } + } + + /* Check last alias path component matched all the way */ + + if (aliasp[-1] != '/' && *urip != '\0' && *urip != '/') + return 0; + + /* Return number of characters from URI which matched (may be + * greater than length of alias, since we may have matched + * doubled slashes) + */ + + return urip - uri; +} + +static char *try_alias_list(request_rec *r, apr_array_header_t *aliases, + int doesc, int *status) +{ + alias_entry *entries = (alias_entry *) aliases->elts; + regmatch_t regm[AP_MAX_REG_MATCH]; + char *found = NULL; + int i; + + for (i = 0; i < aliases->nelts; ++i) { + alias_entry *p = &entries[i]; + int l; + + if (p->regexp) { + if (!ap_regexec(p->regexp, r->uri, AP_MAX_REG_MATCH, regm, 0)) { + if (p->real) { + found = ap_pregsub(r->pool, p->real, r->uri, + AP_MAX_REG_MATCH, regm); + if (found && doesc) { + apr_uri_t uri; + apr_uri_parse(r->pool, found, &uri); + /* Do not escape the query string or fragment. */ + found = apr_uri_unparse(r->pool, &uri, + APR_URI_UNP_OMITQUERY); + found = ap_escape_uri(r->pool, found); + if (uri.query) { + found = apr_pstrcat(r->pool, found, "?", + uri.query, NULL); + } + if (uri.fragment) { + found = apr_pstrcat(r->pool, found, "#", + uri.fragment, NULL); + } + } + } + else { + /* need something non-null */ + found = apr_pstrdup(r->pool, ""); + } + } + } + else { + l = alias_matches(r->uri, p->fake); + + if (l > 0) { + if (doesc) { + char *escurl; + escurl = ap_os_escape_path(r->pool, r->uri + l, 1); + + found = apr_pstrcat(r->pool, p->real, escurl, NULL); + } + else + found = apr_pstrcat(r->pool, p->real, r->uri + l, NULL); + } + } + + if (found) { + if (p->handler) { /* Set handler, and leave a note for mod_cgi */ + r->handler = p->handler; + apr_table_setn(r->notes, "alias-forced-type", r->handler); + } + /* XXX This is as SLOW as can be, next step, we optimize + * and merge to whatever part of the found path was already + * canonicalized. After I finish eliminating os canonical. + * Better fail test for ap_server_root_relative needed here. + */ + if (!doesc) { + found = ap_server_root_relative(r->pool, found); + } + if (found) { + *status = p->redir_status; + } + return found; + } + + } + + return NULL; +} + +static int translate_alias_redir(request_rec *r) +{ + ap_conf_vector_t *sconf = r->server->module_config; + alias_server_conf *serverconf = ap_get_module_config(sconf, &alias_module); + char *ret; + int status; + + if (r->uri[0] != '/' && r->uri[0] != '\0') { + return DECLINED; + } + + if ((ret = try_alias_list(r, serverconf->redirects, 1, &status)) != NULL) { + if (ap_is_HTTP_REDIRECT(status)) { + /* include QUERY_STRING if any */ + if (r->args) { + ret = apr_pstrcat(r->pool, ret, "?", r->args, NULL); + } + apr_table_setn(r->headers_out, "Location", ret); + } + return status; + } + + if ((ret = try_alias_list(r, serverconf->aliases, 0, &status)) != NULL) { + r->filename = ret; + return OK; + } + + return DECLINED; +} + +static int fixup_redir(request_rec *r) +{ + void *dconf = r->per_dir_config; + alias_dir_conf *dirconf = + (alias_dir_conf *) ap_get_module_config(dconf, &alias_module); + char *ret; + int status; + + /* It may have changed since last time, so try again */ + + if ((ret = try_alias_list(r, dirconf->redirects, 1, &status)) != NULL) { + if (ap_is_HTTP_REDIRECT(status)) { + if (ret[0] == '/') { + char *orig_target = ret; + + ret = ap_construct_url(r->pool, ret, r); + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, + "incomplete redirection target of '%s' for " + "URI '%s' modified to '%s'", + orig_target, r->uri, ret); + } + if (!ap_is_url(ret)) { + status = HTTP_INTERNAL_SERVER_ERROR; + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "cannot redirect '%s' to '%s'; " + "target is not a valid absoluteURI or abs_path", + r->uri, ret); + } + else { + /* append requested query only, if the config didn't + * supply its own. + */ + if (r->args && !ap_strchr(ret, '?')) { + ret = apr_pstrcat(r->pool, ret, "?", r->args, NULL); + } + apr_table_setn(r->headers_out, "Location", ret); + } + } + return status; + } + + return DECLINED; +} + +static void register_hooks(apr_pool_t *p) +{ + static const char * const aszSucc[]={ "mod_userdir.c", + "mod_vhost_alias.c",NULL }; + + ap_hook_translate_name(translate_alias_redir,NULL,aszSucc,APR_HOOK_MIDDLE); + ap_hook_fixups(fixup_redir,NULL,NULL,APR_HOOK_MIDDLE); +} + +module AP_MODULE_DECLARE_DATA alias_module = +{ + STANDARD20_MODULE_STUFF, + create_alias_dir_config, /* dir config creater */ + merge_alias_dir_config, /* dir merger --- default is to override */ + create_alias_config, /* server config */ + merge_alias_config, /* merge server configs */ + alias_cmds, /* command apr_table_t */ + register_hooks /* register hooks */ +}; diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/mod_alias.dsp b/rubbos/app/httpd-2.0.64/modules/mappers/mod_alias.dsp new file mode 100644 index 00000000..b13219d1 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/mappers/mod_alias.dsp @@ -0,0 +1,128 @@ +# Microsoft Developer Studio Project File - Name="mod_alias" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=mod_alias - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "mod_alias.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 "mod_alias.mak" CFG="mod_alias - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "mod_alias - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_alias - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "mod_alias - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_alias_src" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /out:"Release/mod_alias.so" /base:@..\..\os\win32\BaseAddr.ref,mod_alias.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Release/mod_alias.so" /base:@..\..\os\win32\BaseAddr.ref,mod_alias.so /opt:ref + +!ELSEIF "$(CFG)" == "mod_alias - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_alias_src" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_alias.so" /base:@..\..\os\win32\BaseAddr.ref,mod_alias.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_alias.so" /base:@..\..\os\win32\BaseAddr.ref,mod_alias.so + +!ENDIF + +# Begin Target + +# Name "mod_alias - Win32 Release" +# Name "mod_alias - Win32 Debug" +# Begin Source File + +SOURCE=.\mod_alias.c +# End Source File +# Begin Source File + +SOURCE=.\mod_alias.rc +# End Source File +# Begin Source File + +SOURCE=..\..\build\win32\win32ver.awk + +!IF "$(CFG)" == "mod_alias - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_alias.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_alias.so "alias_module for Apache" ../../include/ap_release.h > .\mod_alias.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "mod_alias - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_alias.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_alias.so "alias_module for Apache" ../../include/ap_release.h > .\mod_alias.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/mod_alias.exp b/rubbos/app/httpd-2.0.64/modules/mappers/mod_alias.exp new file mode 100644 index 00000000..ac386ec3 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/mappers/mod_alias.exp @@ -0,0 +1 @@ +alias_module diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/mod_alias.la b/rubbos/app/httpd-2.0.64/modules/mappers/mod_alias.la new file mode 100644 index 00000000..f008aff6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/mappers/mod_alias.la @@ -0,0 +1,35 @@ +# mod_alias.la - a libtool library file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='' + +# Names of this library. +library_names='' + +# The name of the static archive. +old_library='mod_alias.a' + +# Libraries that this one depends upon. +dependency_libs=' -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib' + +# Version information for mod_alias. +current= +age= +revision= + +# Is this an already installed library? +installed=no + +# Should we warn about portability when linking against -modules? +shouldnotlink=yes + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='' diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/mod_alias.lo b/rubbos/app/httpd-2.0.64/modules/mappers/mod_alias.lo new file mode 100644 index 00000000..bf4ea8f5 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/mappers/mod_alias.lo @@ -0,0 +1,12 @@ +# mod_alias.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/mod_alias.o' + +# Name of the non-PIC object. +non_pic_object='mod_alias.o' + diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/mod_alias.o b/rubbos/app/httpd-2.0.64/modules/mappers/mod_alias.o new file mode 100644 index 0000000000000000000000000000000000000000..178414cd5c31085e3bd0b486216ed65617bb0f32 GIT binary patch literal 59400 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 C^;(_) literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/mod_dir.c b/rubbos/app/httpd-2.0.64/modules/mappers/mod_dir.c new file mode 100644 index 00000000..9191b7f0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/mappers/mod_dir.c @@ -0,0 +1,247 @@ +/* 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. + */ + +/* + * mod_dir.c: handle default index files, and trailing-/ redirects + */ + +#include "apr_strings.h" +#include "ap_config.h" +#include "httpd.h" +#include "http_config.h" +#include "http_core.h" +#include "http_request.h" +#include "http_protocol.h" +#include "http_log.h" +#include "http_main.h" +#include "util_script.h" + +module AP_MODULE_DECLARE_DATA dir_module; + +typedef enum { + SLASH_OFF = 0, + SLASH_ON, + SLASH_UNSET +} slash_cfg; + +typedef struct dir_config_struct { + apr_array_header_t *index_names; + slash_cfg do_slash; +} dir_config_rec; + +#define DIR_CMD_PERMS OR_INDEXES + +static const char *add_index(cmd_parms *cmd, void *dummy, const char *arg) +{ + dir_config_rec *d = dummy; + + if (!d->index_names) { + d->index_names = apr_array_make(cmd->pool, 2, sizeof(char *)); + } + *(const char **)apr_array_push(d->index_names) = arg; + return NULL; +} + +static const char *configure_slash(cmd_parms *cmd, void *d_, int arg) +{ + dir_config_rec *d = d_; + + d->do_slash = arg ? SLASH_ON : SLASH_OFF; + return NULL; +} + +static const command_rec dir_cmds[] = +{ + AP_INIT_ITERATE("DirectoryIndex", add_index, NULL, DIR_CMD_PERMS, + "a list of file names"), + AP_INIT_FLAG("DirectorySlash", configure_slash, NULL, DIR_CMD_PERMS, + "On or Off"), + {NULL} +}; + +static void *create_dir_config(apr_pool_t *p, char *dummy) +{ + dir_config_rec *new = apr_pcalloc(p, sizeof(dir_config_rec)); + + new->index_names = NULL; + new->do_slash = SLASH_UNSET; + return (void *) new; +} + +static void *merge_dir_configs(apr_pool_t *p, void *basev, void *addv) +{ + dir_config_rec *new = apr_pcalloc(p, sizeof(dir_config_rec)); + dir_config_rec *base = (dir_config_rec *)basev; + dir_config_rec *add = (dir_config_rec *)addv; + + new->index_names = add->index_names ? add->index_names : base->index_names; + new->do_slash = + (add->do_slash == SLASH_UNSET) ? base->do_slash : add->do_slash; + return new; +} + +static int fixup_dir(request_rec *r) +{ + dir_config_rec *d; + char *dummy_ptr[1]; + char **names_ptr; + int num_names; + int error_notfound = 0; + + /* only handle requests against directories */ + if (r->finfo.filetype != APR_DIR) { + return DECLINED; + } + + /* In case mod_mime wasn't present, and no handler was assigned. */ + if (!r->handler) { + r->handler = DIR_MAGIC_TYPE; + } + + /* Never tolerate path_info on dir requests */ + if (r->path_info && *r->path_info) { + return DECLINED; + } + + d = (dir_config_rec *)ap_get_module_config(r->per_dir_config, + &dir_module); + + /* Redirect requests that are not '/' terminated */ + if (r->uri[0] == '\0' || r->uri[strlen(r->uri) - 1] != '/') + { + char *ifile; + + if (!d->do_slash) { + return DECLINED; + } + + /* Only redirect non-get requests if we have no note to warn + * that this browser cannot handle redirs on non-GET requests + * (such as Microsoft's WebFolders). + */ + if ((r->method_number != M_GET) + && apr_table_get(r->subprocess_env, "redirect-carefully")) { + return DECLINED; + } + + if (r->args != NULL) { + ifile = apr_pstrcat(r->pool, ap_escape_uri(r->pool, r->uri), + "/", "?", r->args, NULL); + } + else { + ifile = apr_pstrcat(r->pool, ap_escape_uri(r->pool, r->uri), + "/", NULL); + } + + apr_table_setn(r->headers_out, "Location", + ap_construct_url(r->pool, ifile, r)); + return HTTP_MOVED_PERMANENTLY; + } + + if (strcmp(r->handler, DIR_MAGIC_TYPE)) { + return DECLINED; + } + + if (d->index_names) { + names_ptr = (char **)d->index_names->elts; + num_names = d->index_names->nelts; + } + else { + dummy_ptr[0] = AP_DEFAULT_INDEX; + names_ptr = dummy_ptr; + num_names = 1; + } + + for (; num_names; ++names_ptr, --num_names) { + /* XXX: Is this name_ptr considered escaped yet, or not??? */ + char *name_ptr = *names_ptr; + request_rec *rr; + + /* Once upon a time args were handled _after_ the successful redirect. + * But that redirect might then _refuse_ the given r->args, creating + * a nasty tangle. It seems safer to consider the r->args while we + * determine if name_ptr is our viable index, and therefore set them + * up correctly on redirect. + */ + if (r->args != NULL) { + name_ptr = apr_pstrcat(r->pool, name_ptr, "?", r->args, NULL); + } + + rr = ap_sub_req_lookup_uri(name_ptr, r, NULL); + + /* XXX: (filetype == APR_REG) - we can't use a non-file index??? */ + if ( rr->status == HTTP_OK + && ( (rr->handler && !strcmp(rr->handler, "proxy-server")) + || rr->finfo.filetype == APR_REG)) { + ap_internal_fast_redirect(rr, r); + return OK; + } + + /* If the request returned a redirect, propagate it to the client */ + + if (ap_is_HTTP_REDIRECT(rr->status) + || (rr->status == HTTP_NOT_ACCEPTABLE && num_names == 1) + || (rr->status == HTTP_UNAUTHORIZED && num_names == 1)) { + + apr_pool_join(r->pool, rr->pool); + error_notfound = rr->status; + r->notes = apr_table_overlay(r->pool, r->notes, rr->notes); + r->headers_out = apr_table_overlay(r->pool, r->headers_out, + rr->headers_out); + r->err_headers_out = apr_table_overlay(r->pool, r->err_headers_out, + rr->err_headers_out); + return error_notfound; + } + + /* If the request returned something other than 404 (or 200), + * it means the module encountered some sort of problem. To be + * secure, we should return the error, rather than allow autoindex + * to create a (possibly unsafe) directory index. + * + * So we store the error, and if none of the listed files + * exist, we return the last error response we got, instead + * of a directory listing. + */ + if (rr->status && rr->status != HTTP_NOT_FOUND + && rr->status != HTTP_OK) { + error_notfound = rr->status; + } + + ap_destroy_sub_req(rr); + } + + if (error_notfound) { + return error_notfound; + } + + /* nothing for us to do, pass on through */ + return DECLINED; +} + +static void register_hooks(apr_pool_t *p) +{ + ap_hook_fixups(fixup_dir,NULL,NULL,APR_HOOK_LAST); +} + +module AP_MODULE_DECLARE_DATA dir_module = { + STANDARD20_MODULE_STUFF, + create_dir_config, /* create per-directory config structure */ + merge_dir_configs, /* merge per-directory config structures */ + NULL, /* create per-server config structure */ + NULL, /* merge per-server config structures */ + dir_cmds, /* command apr_table_t */ + register_hooks /* register hooks */ +}; diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/mod_dir.dsp b/rubbos/app/httpd-2.0.64/modules/mappers/mod_dir.dsp new file mode 100644 index 00000000..5863d90f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/mappers/mod_dir.dsp @@ -0,0 +1,128 @@ +# Microsoft Developer Studio Project File - Name="mod_dir" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=mod_dir - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "mod_dir.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 "mod_dir.mak" CFG="mod_dir - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "mod_dir - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_dir - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "mod_dir - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_dir_src" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /out:"Release/mod_dir.so" /base:@..\..\os\win32\BaseAddr.ref,mod_dir.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Release/mod_dir.so" /base:@..\..\os\win32\BaseAddr.ref,mod_dir.so /opt:ref + +!ELSEIF "$(CFG)" == "mod_dir - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_dir_src" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_dir.so" /base:@..\..\os\win32\BaseAddr.ref,mod_dir.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_dir.so" /base:@..\..\os\win32\BaseAddr.ref,mod_dir.so + +!ENDIF + +# Begin Target + +# Name "mod_dir - Win32 Release" +# Name "mod_dir - Win32 Debug" +# Begin Source File + +SOURCE=.\mod_dir.c +# End Source File +# Begin Source File + +SOURCE=.\mod_dir.rc +# End Source File +# Begin Source File + +SOURCE=..\..\build\win32\win32ver.awk + +!IF "$(CFG)" == "mod_dir - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_dir.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_dir.so "dir_module for Apache" ../../include/ap_release.h > .\mod_dir.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "mod_dir - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_dir.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_dir.so "dir_module for Apache" ../../include/ap_release.h > .\mod_dir.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/mod_dir.exp b/rubbos/app/httpd-2.0.64/modules/mappers/mod_dir.exp new file mode 100644 index 00000000..5fbf7729 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/mappers/mod_dir.exp @@ -0,0 +1 @@ +dir_module diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/mod_dir.la b/rubbos/app/httpd-2.0.64/modules/mappers/mod_dir.la new file mode 100644 index 00000000..9fd727d8 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/mappers/mod_dir.la @@ -0,0 +1,35 @@ +# mod_dir.la - a libtool library file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='' + +# Names of this library. +library_names='' + +# The name of the static archive. +old_library='mod_dir.a' + +# Libraries that this one depends upon. +dependency_libs=' -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib' + +# Version information for mod_dir. +current= +age= +revision= + +# Is this an already installed library? +installed=no + +# Should we warn about portability when linking against -modules? +shouldnotlink=yes + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='' diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/mod_dir.lo b/rubbos/app/httpd-2.0.64/modules/mappers/mod_dir.lo new file mode 100644 index 00000000..471329d6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/mappers/mod_dir.lo @@ -0,0 +1,12 @@ +# mod_dir.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/mod_dir.o' + +# Name of the non-PIC object. +non_pic_object='mod_dir.o' + diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/mod_dir.o b/rubbos/app/httpd-2.0.64/modules/mappers/mod_dir.o new file mode 100644 index 0000000000000000000000000000000000000000..40dbfa1ec5d69b4dbf4f504b87bf3260dd3b727d GIT binary patch literal 37448 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/mod_imap.c b/rubbos/app/httpd-2.0.64/modules/mappers/mod_imap.c new file mode 100644 index 00000000..f7745c65 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/mappers/mod_imap.c @@ -0,0 +1,897 @@ +/* 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. + */ + +/* + * This imagemap module started as a port of the original imagemap.c + * written by Rob McCool (11/13/93 robm@ncsa.uiuc.edu). + * This version includes the mapping algorithms found in version 1.3 + * of imagemap.c. + * + * Contributors to this code include: + * + * Kevin Hughes, kevinh@pulua.hcc.hawaii.edu + * + * Eric Haines, erich@eye.com + * "macmartinized" polygon code copyright 1992 by Eric Haines, erich@eye.com + * + * Randy Terbush, randy@zyzzyva.com + * port to Apache module format, "base_uri" and support for relative URLs + * + * James H. Cloos, Jr., cloos@jhcloos.com + * Added point datatype, using code in NCSA's version 1.8 imagemap.c + * program, as distributed with version 1.4.1 of their server. + * The point code is originally added by Craig Milo Rogers, Rogers@ISI.Edu + * + * Nathan Kurz, nate@tripod.com + * Rewrite/reorganization. New handling of default, base and relative URLs. + * New Configuration directives: + * ImapMenu {none, formatted, semiformatted, unformatted} + * ImapDefault {error, nocontent, referer, menu, URL} + * ImapBase {map, referer, URL} + * Support for creating non-graphical menu added. (backwards compatible): + * Old: directive URL [x,y ...] + * New: directive URL "Menu text" [x,y ...] + * or: directive URL x,y ... "Menu text" + * Map format and menu concept courtesy Joshua Bell, jsbell@acs.ucalgary.ca. + * + * Mark Cox, mark@ukweb.com, Allow relative URLs even when no base specified + */ + +#include "apr.h" +#include "apr_strings.h" +#include "apr_lib.h" + +#define APR_WANT_STDIO /* for sscanf() */ +#define APR_WANT_STRFUNC +#include "apr_want.h" + +#include "ap_config.h" +#include "httpd.h" +#include "http_config.h" +#include "http_request.h" +#include "http_core.h" +#include "http_protocol.h" +#include "http_main.h" +#include "http_log.h" +#include "util_script.h" +#include "mod_core.h" + + +#define IMAP_MAGIC_TYPE "application/x-httpd-imap" +#define MAXVERTS 100 +#define X 0 +#define Y 1 + +#define IMAP_MENU_DEFAULT "formatted" +#define IMAP_DEFAULT_DEFAULT "nocontent" +#define IMAP_BASE_DEFAULT "map" + +#ifdef SUNOS4 +double strtod(); /* SunOS needed this */ +#endif + +module AP_MODULE_DECLARE_DATA imap_module; + +typedef struct { + char *imap_menu; + char *imap_default; + char *imap_base; +} imap_conf_rec; + +static void *create_imap_dir_config(apr_pool_t *p, char *dummy) +{ + imap_conf_rec *icr = + (imap_conf_rec *) apr_palloc(p, sizeof(imap_conf_rec)); + + icr->imap_menu = NULL; + icr->imap_default = NULL; + icr->imap_base = NULL; + + return icr; +} + +static void *merge_imap_dir_configs(apr_pool_t *p, void *basev, void *addv) +{ + imap_conf_rec *new = (imap_conf_rec *) apr_pcalloc(p, sizeof(imap_conf_rec)); + imap_conf_rec *base = (imap_conf_rec *) basev; + imap_conf_rec *add = (imap_conf_rec *) addv; + + new->imap_menu = add->imap_menu ? add->imap_menu : base->imap_menu; + new->imap_default = add->imap_default ? add->imap_default + : base->imap_default; + new->imap_base = add->imap_base ? add->imap_base : base->imap_base; + + return new; +} + + +static const command_rec imap_cmds[] = +{ + AP_INIT_TAKE1("ImapMenu", ap_set_string_slot, + (void *)APR_OFFSETOF(imap_conf_rec, imap_menu), OR_INDEXES, + "the type of menu generated: none, formatted, semiformatted, " + "unformatted"), + AP_INIT_TAKE1("ImapDefault", ap_set_string_slot, + (void *)APR_OFFSETOF(imap_conf_rec, imap_default), OR_INDEXES, + "the action taken if no match: error, nocontent, referer, " + "menu, URL"), + AP_INIT_TAKE1("ImapBase", ap_set_string_slot, + (void *)APR_OFFSETOF(imap_conf_rec, imap_base), OR_INDEXES, + "the base for all URL's: map, referer, URL (or start of)"), + {NULL} +}; + +static int pointinrect(const double point[2], double coords[MAXVERTS][2]) +{ + double max[2], min[2]; + if (coords[0][X] > coords[1][X]) { + max[0] = coords[0][X]; + min[0] = coords[1][X]; + } + else { + max[0] = coords[1][X]; + min[0] = coords[0][X]; + } + + if (coords[0][Y] > coords[1][Y]) { + max[1] = coords[0][Y]; + min[1] = coords[1][Y]; + } + else { + max[1] = coords[1][Y]; + min[1] = coords[0][Y]; + } + + return ((point[X] >= min[0] && point[X] <= max[0]) && + (point[Y] >= min[1] && point[Y] <= max[1])); +} + +static int pointincircle(const double point[2], double coords[MAXVERTS][2]) +{ + double radius1, radius2; + + radius1 = ((coords[0][Y] - coords[1][Y]) * (coords[0][Y] - coords[1][Y])) + + ((coords[0][X] - coords[1][X]) * (coords[0][X] - coords[1][X])); + + radius2 = ((coords[0][Y] - point[Y]) * (coords[0][Y] - point[Y])) + + ((coords[0][X] - point[X]) * (coords[0][X] - point[X])); + + return (radius2 <= radius1); +} + +#define fmin(a,b) (((a)>(b))?(b):(a)) +#define fmax(a,b) (((a)>(b))?(a):(b)) + +static int pointinpoly(const double point[2], double pgon[MAXVERTS][2]) +{ + int i, numverts, crossings = 0; + double x = point[X], y = point[Y]; + + for (numverts = 0; pgon[numverts][X] != -1 && numverts < MAXVERTS; + numverts++) { + /* just counting the vertexes */ + } + + for (i = 0; i < numverts; i++) { + double x1=pgon[i][X]; + double y1=pgon[i][Y]; + double x2=pgon[(i + 1) % numverts][X]; + double y2=pgon[(i + 1) % numverts][Y]; + double d=(y - y1) * (x2 - x1) - (x - x1) * (y2 - y1); + + if ((y1 >= y) != (y2 >= y)) { + crossings +=y2 - y1 >= 0 ? d >= 0 : d <= 0; + } + if (!d && fmin(x1,x2) <= x && x <= fmax(x1,x2) + && fmin(y1,y2) <= y && y <= fmax(y1,y2)) { + return 1; + } + } + return crossings & 0x01; +} + + +static int is_closer(const double point[2], double coords[MAXVERTS][2], + double *closest) +{ + double dist_squared = ((point[X] - coords[0][X]) + * (point[X] - coords[0][X])) + + ((point[Y] - coords[0][Y]) + * (point[Y] - coords[0][Y])); + + if (point[X] < 0 || point[Y] < 0) { + return (0); /* don't mess around with negative coordinates */ + } + + if (*closest < 0 || dist_squared < *closest) { + *closest = dist_squared; + return (1); /* if this is the first point or is the closest yet + set 'closest' equal to this distance^2 */ + } + + return (0); /* if it's not the first or closest */ + +} + +static double get_x_coord(const char *args) +{ + char *endptr; /* we want it non-null */ + double x_coord = -1; /* -1 is returned if no coordinate is given */ + + if (args == NULL) { + return (-1); /* in case we aren't passed anything */ + } + + while (*args && !apr_isdigit(*args) && *args != ',') { + args++; /* jump to the first digit, but not past + a comma or end */ + } + + x_coord = strtod(args, &endptr); + + if (endptr > args) { /* if a conversion was made */ + return (x_coord); + } + + return (-1); /* else if no conversion was made, + or if no args was given */ +} + +static double get_y_coord(const char *args) +{ + char *endptr; /* we want it non-null */ + const char *start_of_y = NULL; + double y_coord = -1; /* -1 is returned on error */ + + if (args == NULL) { + return (-1); /* in case we aren't passed anything */ + } + + start_of_y = ap_strchr_c(args, ','); /* the comma */ + + if (start_of_y) { + + start_of_y++; /* start looking at the character after + the comma */ + + while (*start_of_y && !apr_isdigit(*start_of_y)) { + start_of_y++; /* jump to the first digit, but not + past the end */ + } + + y_coord = strtod(start_of_y, &endptr); + + if (endptr > start_of_y) { + return (y_coord); + } + } + + return (-1); /* if no conversion was made, or + no comma was found in args */ +} + + +/* See if string has a "quoted part", and if so set *quoted_part to + * the first character of the quoted part, then hammer a \0 onto the + * trailing quote, and set *string to point at the first character + * past the second quote. + * + * Otherwise set *quoted_part to NULL, and leave *string alone. + */ +static void read_quoted(char **string, char **quoted_part) +{ + char *strp = *string; + + /* assume there's no quoted part */ + *quoted_part = NULL; + + while (apr_isspace(*strp)) { + strp++; /* go along string until non-whitespace */ + } + + if (*strp == '"') { /* if that character is a double quote */ + strp++; /* step over it */ + *quoted_part = strp; /* note where the quoted part begins */ + + while (*strp && *strp != '"') { + ++strp; /* skip the quoted portion */ + } + + *strp = '\0'; /* end the string with a NUL */ + + strp++; /* step over the last double quote */ + *string = strp; + } +} + +/* + * returns the mapped URL or NULL. + */ +static char *imap_url(request_rec *r, const char *base, const char *value) +{ +/* translates a value into a URL. */ + int slen, clen; + char *string_pos = NULL; + const char *string_pos_const = NULL; + char *directory = NULL; + const char *referer = NULL; + char *my_base; + + if (!strcasecmp(value, "map") || !strcasecmp(value, "menu")) { + return ap_construct_url(r->pool, r->uri, r); + } + + if (!strcasecmp(value, "nocontent") || !strcasecmp(value, "error")) { + return apr_pstrdup(r->pool, value); /* these are handled elsewhere, + so just copy them */ + } + + if (!strcasecmp(value, "referer")) { + referer = apr_table_get(r->headers_in, "Referer"); + if (referer && *referer) { + return ap_escape_html(r->pool, referer); + } + else { + /* XXX: This used to do *value = '\0'; ... which is totally bogus + * because it hammers the passed in value, which can be a string + * constant, or part of a config, or whatever. Total garbage. + * This works around that without changing the rest of this + * code much + */ + value = ""; /* if 'referer' but no referring page, + null the value */ + } + } + + string_pos_const = value; + while (apr_isalpha(*string_pos_const)) { + string_pos_const++; /* go along the URL from the map + until a non-letter */ + } + if (*string_pos_const == ':') { + /* if letters and then a colon (like http:) */ + /* it's an absolute URL, so use it! */ + return apr_pstrdup(r->pool, value); + } + + if (!base || !*base) { + if (value && *value) { + return apr_pstrdup(r->pool, value); /* no base: use what is given */ + } + /* no base, no value: pick a simple default */ + return ap_construct_url(r->pool, "/", r); + } + + /* must be a relative URL to be combined with base */ + if (ap_strchr_c(base, '/') == NULL && (!strncmp(value, "../", 3) + || !strcmp(value, ".."))) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "invalid base directive in map file: %s", r->uri); + return NULL; + } + my_base = apr_pstrdup(r->pool, base); + string_pos = my_base; + while (*string_pos) { + if (*string_pos == '/' && *(string_pos + 1) == '/') { + string_pos += 2; /* if there are two slashes, jump over them */ + continue; + } + if (*string_pos == '/') { /* the first single slash */ + if (value[0] == '/') { + *string_pos = '\0'; + } /* if the URL from the map starts from root, + end the base URL string at the first single + slash */ + else { + directory = string_pos; /* save the start of + the directory portion */ + + string_pos = strrchr(string_pos, '/'); /* now reuse + string_pos */ + string_pos++; /* step over that last slash */ + *string_pos = '\0'; + } /* but if the map url is relative, leave the + slash on the base (if there is one) */ + break; + } + string_pos++; /* until we get to the end of my_base without + finding a slash by itself */ + } + + while (!strncmp(value, "../", 3) || !strcmp(value, "..")) { + + if (directory && (slen = strlen(directory))) { + + /* for each '..', knock a directory off the end + by ending the string right at the last slash. + But only consider the directory portion: don't eat + into the server name. And only try if a directory + portion was found */ + + clen = slen - 1; + + while ((slen - clen) == 1) { + + if ((string_pos = strrchr(directory, '/'))) { + *string_pos = '\0'; + } + clen = strlen(directory); + if (clen == 0) { + break; + } + } + + value += 2; /* jump over the '..' that we found in the + value */ + } + else if (directory) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "invalid directory name in map file: %s", r->uri); + return NULL; + } + + if (!strncmp(value, "/../", 4) || !strcmp(value, "/..")) { + value++; /* step over the '/' if there are more '..' + to do. This way, we leave the starting + '/' on value after the last '..', but get + rid of it otherwise */ + } + + } /* by this point, value does not start + with '..' */ + + if (value && *value) { + return apr_pstrcat(r->pool, my_base, value, NULL); + } + return my_base; +} + +static int imap_reply(request_rec *r, char *redirect) +{ + if (!strcasecmp(redirect, "error")) { + /* they actually requested an error! */ + return HTTP_INTERNAL_SERVER_ERROR; + } + if (!strcasecmp(redirect, "nocontent")) { + /* tell the client to keep the page it has */ + return HTTP_NO_CONTENT; + } + if (redirect && *redirect) { + /* must be a URL, so redirect to it */ + apr_table_setn(r->headers_out, "Location", redirect); + return HTTP_MOVED_TEMPORARILY; + } + return HTTP_INTERNAL_SERVER_ERROR; +} + +static void menu_header(request_rec *r, char *menu) +{ + ap_set_content_type(r, "text/html; charset=ISO-8859-1"); + + ap_rvputs(r, DOCTYPE_HTML_3_2, "\nMenu for ", + ap_escape_html(r->pool, r->uri), + "\n\n", NULL); + + if (!strcasecmp(menu, "formatted")) { + ap_rvputs(r, "

    Menu for ", + ap_escape_html(r->pool, r->uri), + "

    \n
    \n\n", NULL); + } + + return; +} + +static void menu_blank(request_rec *r, char *menu) +{ + if (!strcasecmp(menu, "formatted")) { + ap_rputs("\n", r); + } + if (!strcasecmp(menu, "semiformatted")) { + ap_rputs("
    \n", r); + } + if (!strcasecmp(menu, "unformatted")) { + ap_rputs("\n", r); + } + return; +} + +static void menu_comment(request_rec *r, char *menu, char *comment) +{ + if (!strcasecmp(menu, "formatted")) { + ap_rputs("\n", r); /* print just a newline if 'formatted' */ + } + if (!strcasecmp(menu, "semiformatted") && *comment) { + ap_rvputs(r, comment, "\n", NULL); + } + if (!strcasecmp(menu, "unformatted") && *comment) { + ap_rvputs(r, comment, "\n", NULL); + } + return; /* comments are ignored in the + 'formatted' form */ +} + +static void menu_default(request_rec *r, char *menu, char *href, char *text) +{ + if (!strcasecmp(href, "error") || !strcasecmp(href, "nocontent")) { + return; /* don't print such lines, these aren't + really href's */ + } + if (!strcasecmp(menu, "formatted")) { + ap_rvputs(r, "
    (Default) ", text,
    +               "
    \n", NULL); + } + if (!strcasecmp(menu, "semiformatted")) { + ap_rvputs(r, "
    (Default) ", text,
    +               "
    \n", NULL); + } + if (!strcasecmp(menu, "unformatted")) { + ap_rvputs(r, "", text, "", NULL); + } + return; +} + +static void menu_directive(request_rec *r, char *menu, char *href, char *text) +{ + if (!strcasecmp(href, "error") || !strcasecmp(href, "nocontent")) { + return; /* don't print such lines, as this isn't + really an href */ + } + if (!strcasecmp(menu, "formatted")) { + ap_rvputs(r, "
              ", text,
    +               "
    \n", NULL); + } + if (!strcasecmp(menu, "semiformatted")) { + ap_rvputs(r, "
              ", text,
    +               "
    \n", NULL); + } + if (!strcasecmp(menu, "unformatted")) { + ap_rvputs(r, "", text, "", NULL); + } + return; +} + +static void menu_footer(request_rec *r) +{ + ap_rputs("\n\n\n\n", r); /* finish the menu */ +} + +static int imap_handler_internal(request_rec *r) +{ + char input[MAX_STRING_LEN]; + char *directive; + char *value; + char *href_text; + char *base; + char *redirect; + char *mapdflt; + char *closest = NULL; + double closest_yet = -1; + apr_status_t status; + + double testpoint[2]; + double pointarray[MAXVERTS + 1][2]; + int vertex; + + char *string_pos; + int showmenu = 0; + + imap_conf_rec *icr; + + char *imap_menu; + char *imap_default; + char *imap_base; + + ap_configfile_t *imap; + + icr = ap_get_module_config(r->per_dir_config, &imap_module); + + imap_menu = icr->imap_menu ? icr->imap_menu : IMAP_MENU_DEFAULT; + imap_default = icr->imap_default + ? icr->imap_default : IMAP_DEFAULT_DEFAULT; + imap_base = icr->imap_base ? icr->imap_base : IMAP_BASE_DEFAULT; + + status = ap_pcfg_openfile(&imap, r->pool, r->filename); + + if (status != APR_SUCCESS) { + return HTTP_NOT_FOUND; + } + + base = imap_url(r, NULL, imap_base); /* set base according + to default */ + if (!base) { + return HTTP_INTERNAL_SERVER_ERROR; + } + mapdflt = imap_url(r, NULL, imap_default); /* and default to + global default */ + if (!mapdflt) { + return HTTP_INTERNAL_SERVER_ERROR; + } + + testpoint[X] = get_x_coord(r->args); + testpoint[Y] = get_y_coord(r->args); + + if ((testpoint[X] == -1 || testpoint[Y] == -1) || + (testpoint[X] == 0 && testpoint[Y] == 0)) { + /* if either is -1 or if both are zero (new Lynx) */ + /* we don't have valid coordinates */ + testpoint[X] = -1; + testpoint[Y] = -1; + if (strncasecmp(imap_menu, "none", 2)) { + showmenu = 1; /* show the menu _unless_ ImapMenu is + 'none' or 'no' */ + } + } + + if (showmenu) { /* send start of imagemap menu if + we're going to */ + menu_header(r, imap_menu); + } + + while (!ap_cfg_getline(input, sizeof(input), imap)) { + if (!input[0]) { + if (showmenu) { + menu_blank(r, imap_menu); + } + continue; + } + + if (input[0] == '#') { + if (showmenu) { + menu_comment(r, imap_menu, input + 1); + } + continue; + } /* blank lines and comments are ignored + if we aren't printing a menu */ + + /* find the first two space delimited fields, recall that + * ap_cfg_getline has removed leading/trailing whitespace. + * + * note that we're tokenizing as we go... if we were to use the + * ap_getword() class of functions we would end up allocating extra + * memory for every line of the map file + */ + string_pos = input; + if (!*string_pos) { /* need at least two fields */ + goto need_2_fields; + } + + directive = string_pos; + while (*string_pos && !apr_isspace(*string_pos)) { /* past directive */ + ++string_pos; + } + if (!*string_pos) { /* need at least two fields */ + goto need_2_fields; + } + *string_pos++ = '\0'; + + if (!*string_pos) { /* need at least two fields */ + goto need_2_fields; + } + while(*string_pos && apr_isspace(*string_pos)) { /* past whitespace */ + ++string_pos; + } + + value = string_pos; + while (*string_pos && !apr_isspace(*string_pos)) { /* past value */ + ++string_pos; + } + if (apr_isspace(*string_pos)) { + *string_pos++ = '\0'; + } + else { + /* end of input, don't advance past it */ + *string_pos = '\0'; + } + + if (!strncasecmp(directive, "base", 4)) { /* base, base_uri */ + base = imap_url(r, NULL, value); + if (!base) { + goto menu_bail; + } + continue; /* base is never printed to a menu */ + } + + read_quoted(&string_pos, &href_text); + + if (!strcasecmp(directive, "default")) { /* default */ + mapdflt = imap_url(r, NULL, value); + if (!mapdflt) { + goto menu_bail; + } + if (showmenu) { /* print the default if there's a menu */ + redirect = imap_url(r, base, mapdflt); + if (!redirect) { + goto menu_bail; + } + menu_default(r, imap_menu, redirect, + href_text ? href_text : mapdflt); + } + continue; + } + + vertex = 0; + while (vertex < MAXVERTS && + sscanf(string_pos, "%lf%*[, ]%lf", + &pointarray[vertex][X], &pointarray[vertex][Y]) == 2) { + /* Now skip what we just read... we can't use ANSIism %n */ + while (apr_isspace(*string_pos)) { /* past whitespace */ + string_pos++; + } + while (apr_isdigit(*string_pos)) { /* and the 1st number */ + string_pos++; + } + string_pos++; /* skip the ',' */ + while (apr_isspace(*string_pos)) { /* past any more whitespace */ + string_pos++; + } + while (apr_isdigit(*string_pos)) { /* 2nd number */ + string_pos++; + } + vertex++; + } /* so long as there are more vertices to + read, and we have room, read them in. + We start where we left off of the last + sscanf, not at the beginning. */ + + pointarray[vertex][X] = -1; /* signals the end of vertices */ + + if (showmenu) { + if (!href_text) { + read_quoted(&string_pos, &href_text); /* href text could + be here instead */ + } + redirect = imap_url(r, base, value); + if (!redirect) { + goto menu_bail; + } + menu_directive(r, imap_menu, redirect, + href_text ? href_text : value); + continue; + } + /* note that we don't make it past here if we are making a menu */ + + if (testpoint[X] == -1 || pointarray[0][X] == -1) { + continue; /* don't try the following tests if testpoints + are invalid, or if there are no + coordinates */ + } + + if (!strcasecmp(directive, "poly")) { /* poly */ + + if (pointinpoly(testpoint, pointarray)) { + ap_cfg_closefile(imap); + redirect = imap_url(r, base, value); + if (!redirect) { + return HTTP_INTERNAL_SERVER_ERROR; + } + return (imap_reply(r, redirect)); + } + continue; + } + + if (!strcasecmp(directive, "circle")) { /* circle */ + + if (pointincircle(testpoint, pointarray)) { + ap_cfg_closefile(imap); + redirect = imap_url(r, base, value); + if (!redirect) { + return HTTP_INTERNAL_SERVER_ERROR; + } + return (imap_reply(r, redirect)); + } + continue; + } + + if (!strcasecmp(directive, "rect")) { /* rect */ + + if (pointinrect(testpoint, pointarray)) { + ap_cfg_closefile(imap); + redirect = imap_url(r, base, value); + if (!redirect) { + return HTTP_INTERNAL_SERVER_ERROR; + } + return (imap_reply(r, redirect)); + } + continue; + } + + if (!strcasecmp(directive, "point")) { /* point */ + + if (is_closer(testpoint, pointarray, &closest_yet)) { + closest = apr_pstrdup(r->pool, value); + } + + continue; + } /* move on to next line whether it's + closest or not */ + + } /* nothing matched, so we get another line! */ + + ap_cfg_closefile(imap); /* we are done with the map file; close it */ + + if (showmenu) { + menu_footer(r); /* finish the menu and we are done */ + return OK; + } + + if (closest) { /* if a 'point' directive has been seen */ + redirect = imap_url(r, base, closest); + if (!redirect) { + return HTTP_INTERNAL_SERVER_ERROR; + } + return (imap_reply(r, redirect)); + } + + if (mapdflt) { /* a default should be defined, even if + only 'nocontent' */ + redirect = imap_url(r, base, mapdflt); + if (!redirect) { + return HTTP_INTERNAL_SERVER_ERROR; + } + return (imap_reply(r, redirect)); + } + + return HTTP_INTERNAL_SERVER_ERROR; /* If we make it this far, + we failed. They lose! */ + +need_2_fields: + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "map file %s, line %d syntax error: requires at " + "least two fields", r->uri, imap->line_number); + /* fall through */ +menu_bail: + ap_cfg_closefile(imap); + if (showmenu) { + /* There's not much else we can do ... we've already sent the headers + * to the client. + */ + ap_rputs("\n\n[an internal server error occured]\n", r); + menu_footer(r); + return OK; + } + return HTTP_INTERNAL_SERVER_ERROR; +} + +static int imap_handler(request_rec *r) +{ + /* Optimization: skip the allocation of large local variables on the + * stack (in imap_handler_internal()) on requests that aren't using + * imagemaps + */ + if (r->method_number != M_GET || (strcmp(r->handler,IMAP_MAGIC_TYPE) + && strcmp(r->handler, "imap-file"))) { + return DECLINED; + } + else { + return imap_handler_internal(r); + } +} + +static void register_hooks(apr_pool_t *p) +{ + ap_hook_handler(imap_handler,NULL,NULL,APR_HOOK_MIDDLE); +} + +module AP_MODULE_DECLARE_DATA imap_module = +{ + STANDARD20_MODULE_STUFF, + create_imap_dir_config, /* dir config creater */ + merge_imap_dir_configs, /* dir merger --- default is to override */ + NULL, /* server config */ + NULL, /* merge server config */ + imap_cmds, /* command apr_table_t */ + register_hooks /* register hooks */ +}; diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/mod_imap.dsp b/rubbos/app/httpd-2.0.64/modules/mappers/mod_imap.dsp new file mode 100644 index 00000000..19e15bf3 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/mappers/mod_imap.dsp @@ -0,0 +1,128 @@ +# Microsoft Developer Studio Project File - Name="mod_imap" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=mod_imap - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "mod_imap.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 "mod_imap.mak" CFG="mod_imap - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "mod_imap - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_imap - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "mod_imap - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_imap_src" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /out:"Release/mod_imap.so" /base:@..\..\os\win32\BaseAddr.ref,mod_imap.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Release/mod_imap.so" /base:@..\..\os\win32\BaseAddr.ref,mod_imap.so /opt:ref + +!ELSEIF "$(CFG)" == "mod_imap - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_imap_src" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_imap.so" /base:@..\..\os\win32\BaseAddr.ref,mod_imap.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_imap.so" /base:@..\..\os\win32\BaseAddr.ref,mod_imap.so + +!ENDIF + +# Begin Target + +# Name "mod_imap - Win32 Release" +# Name "mod_imap - Win32 Debug" +# Begin Source File + +SOURCE=.\mod_imap.c +# End Source File +# Begin Source File + +SOURCE=.\mod_imap.rc +# End Source File +# Begin Source File + +SOURCE=..\..\build\win32\win32ver.awk + +!IF "$(CFG)" == "mod_imap - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_imap.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_imap.so "imap_module for Apache" ../../include/ap_release.h > .\mod_imap.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "mod_imap - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_imap.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_imap.so "imap_module for Apache" ../../include/ap_release.h > .\mod_imap.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/mod_imap.exp b/rubbos/app/httpd-2.0.64/modules/mappers/mod_imap.exp new file mode 100644 index 00000000..1e0e0b83 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/mappers/mod_imap.exp @@ -0,0 +1 @@ +imap_module diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/mod_imap.la b/rubbos/app/httpd-2.0.64/modules/mappers/mod_imap.la new file mode 100644 index 00000000..a51962d8 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/mappers/mod_imap.la @@ -0,0 +1,35 @@ +# mod_imap.la - a libtool library file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='' + +# Names of this library. +library_names='' + +# The name of the static archive. +old_library='mod_imap.a' + +# Libraries that this one depends upon. +dependency_libs=' -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib' + +# Version information for mod_imap. +current= +age= +revision= + +# Is this an already installed library? +installed=no + +# Should we warn about portability when linking against -modules? +shouldnotlink=yes + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='' diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/mod_imap.lo b/rubbos/app/httpd-2.0.64/modules/mappers/mod_imap.lo new file mode 100644 index 00000000..4cfb46d6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/mappers/mod_imap.lo @@ -0,0 +1,12 @@ +# mod_imap.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/mod_imap.o' + +# Name of the non-PIC object. +non_pic_object='mod_imap.o' + diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/mod_imap.o b/rubbos/app/httpd-2.0.64/modules/mappers/mod_imap.o new file mode 100644 index 0000000000000000000000000000000000000000..e824bbdd1591b67a6632a25325dd33cf0cc5390f GIT binary patch literal 72112 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 d>i8fe5MmS`t=-z}U;CbBforcelangpriority = FLP_UNDEF; + new->language_priority = NULL; + return new; +} + +static void *merge_neg_dir_configs(apr_pool_t *p, void *basev, void *addv) +{ + neg_dir_config *base = (neg_dir_config *) basev; + neg_dir_config *add = (neg_dir_config *) addv; + neg_dir_config *new = (neg_dir_config *) apr_palloc(p, + sizeof(neg_dir_config)); + + /* give priority to the config in the subdirectory */ + new->forcelangpriority = (add->forcelangpriority != FLP_UNDEF) + ? add->forcelangpriority + : base->forcelangpriority; + new->language_priority = add->language_priority + ? add->language_priority + : base->language_priority; + return new; +} + +static const char *set_language_priority(cmd_parms *cmd, void *n_, + const char *lang) +{ + neg_dir_config *n = n_; + const char **langp; + + if (!n->language_priority) + n->language_priority = apr_array_make(cmd->pool, 4, sizeof(char *)); + + langp = (const char **) apr_array_push(n->language_priority); + *langp = lang; + return NULL; +} + +static const char *set_force_priority(cmd_parms *cmd, void *n_, const char *w) +{ + neg_dir_config *n = n_; + + if (!strcasecmp(w, "None")) { + if (n->forcelangpriority & ~FLP_NONE) { + return "Cannot combine ForceLanguagePriority options with None"; + } + n->forcelangpriority = FLP_NONE; + } + else if (!strcasecmp(w, "Prefer")) { + if (n->forcelangpriority & FLP_NONE) { + return "Cannot combine ForceLanguagePriority options None and " + "Prefer"; + } + n->forcelangpriority |= FLP_PREFER; + } + else if (!strcasecmp(w, "Fallback")) { + if (n->forcelangpriority & FLP_NONE) { + return "Cannot combine ForceLanguagePriority options None and " + "Fallback"; + } + n->forcelangpriority |= FLP_FALLBACK; + } + else { + return apr_pstrcat(cmd->pool, "Invalid ForceLanguagePriority option ", + w, NULL); + } + + return NULL; +} + +static const char *cache_negotiated_docs(cmd_parms *cmd, void *dummy, + int arg) +{ + ap_set_module_config(cmd->server->module_config, &negotiation_module, + (arg ? "Cache" : NULL)); + return NULL; +} + +static int do_cache_negotiated_docs(server_rec *s) +{ + return (ap_get_module_config(s->module_config, + &negotiation_module) != NULL); +} + +static const command_rec negotiation_cmds[] = +{ + AP_INIT_FLAG("CacheNegotiatedDocs", cache_negotiated_docs, NULL, RSRC_CONF, + "Either 'on' or 'off' (default)"), + AP_INIT_ITERATE("LanguagePriority", set_language_priority, NULL, + OR_FILEINFO, + "space-delimited list of MIME language abbreviations"), + AP_INIT_ITERATE("ForceLanguagePriority", set_force_priority, NULL, + OR_FILEINFO, + "Force LanguagePriority elections, either None, or " + "Fallback and/or Prefer"), + {NULL} +}; + +/* + * Record of available info on a media type specified by the client + * (we also use 'em for encodings and languages) + */ + +typedef struct accept_rec { + char *name; /* MUST be lowercase */ + float quality; + float level; + char *charset; /* for content-type only */ +} accept_rec; + +/* + * Record of available info on a particular variant + * + * Note that a few of these fields are updated by the actual negotiation + * code. These are: + * + * level_matched --- initialized to zero. Set to the value of level + * if the client actually accepts this media type at that + * level (and *not* if it got in on a wildcard). See level_cmp + * below. + * mime_stars -- initialized to zero. Set to the number of stars + * present in the best matching Accept header element. + * 1 for star/star, 2 for type/star and 3 for + * type/subtype. + * + * definite -- initialized to 1. Set to 0 if there is a match which + * makes the variant non-definite according to the rules + * in rfc2296. + */ + +typedef struct var_rec { + request_rec *sub_req; /* May be NULL (is, for map files) */ + const char *mime_type; /* MUST be lowercase */ + const char *file_name; /* Set to 'this' (for map file body content) */ + apr_off_t body; /* Only for map file body content */ + const char *content_encoding; + apr_array_header_t *content_languages; /* list of lang. for this variant */ + const char *content_charset; + const char *description; + + /* The next five items give the quality values for the dimensions + * of negotiation for this variant. They are obtained from the + * appropriate header lines, except for source_quality, which + * is obtained from the variant itself (the 'qs' parameter value + * from the variant's mime-type). Apart from source_quality, + * these values are set when we find the quality for each variant + * (see best_match()). source_quality is set from the 'qs' parameter + * of the variant description or mime type: see set_mime_fields(). + */ + float lang_quality; /* quality of this variant's language */ + float encoding_quality; /* ditto encoding */ + float charset_quality; /* ditto charset */ + float mime_type_quality; /* ditto media type */ + float source_quality; /* source quality for this variant */ + + /* Now some special values */ + float level; /* Auxiliary to content-type... */ + apr_off_t bytes; /* content length, if known */ + int lang_index; /* Index into LanguagePriority list */ + int is_pseudo_html; /* text/html, *or* the INCLUDES_MAGIC_TYPEs */ + + /* Above are all written-once properties of the variant. The + * three fields below are changed during negotiation: + */ + + float level_matched; + int mime_stars; + int definite; +} var_rec; + +/* Something to carry around the state of negotiation (and to keep + * all of this thread-safe)... + */ + +typedef struct { + apr_pool_t *pool; + request_rec *r; + neg_dir_config *conf; + char *dir_name; + int accept_q; /* 1 if an Accept item has a q= param */ + float default_lang_quality; /* fiddle lang q for variants with no lang */ + + /* the array pointers below are NULL if the corresponding accept + * headers are not present + */ + apr_array_header_t *accepts; /* accept_recs */ + apr_array_header_t *accept_encodings; /* accept_recs */ + apr_array_header_t *accept_charsets; /* accept_recs */ + apr_array_header_t *accept_langs; /* accept_recs */ + + apr_array_header_t *avail_vars; /* available variants */ + + int count_multiviews_variants; /* number of variants found on disk */ + + int is_transparent; /* 1 if this resource is trans. negotiable */ + + int dont_fiddle_headers; /* 1 if we may not fiddle with accept hdrs */ + int ua_supports_trans; /* 1 if ua supports trans negotiation */ + int send_alternates; /* 1 if we want to send an Alternates header */ + int may_choose; /* 1 if we may choose a variant for the client */ + int use_rvsa; /* 1 if we must use RVSA/1.0 negotiation algo */ +} negotiation_state; + +/* A few functions to manipulate var_recs. + * Cleaning out the fields... + */ + +static void clean_var_rec(var_rec *mime_info) +{ + mime_info->sub_req = NULL; + mime_info->mime_type = ""; + mime_info->file_name = ""; + mime_info->body = 0; + mime_info->content_encoding = NULL; + mime_info->content_languages = NULL; + mime_info->content_charset = ""; + mime_info->description = ""; + + mime_info->is_pseudo_html = 0; + mime_info->level = 0.0f; + mime_info->level_matched = 0.0f; + mime_info->bytes = -1; + mime_info->lang_index = -1; + mime_info->mime_stars = 0; + mime_info->definite = 1; + + mime_info->charset_quality = 1.0f; + mime_info->encoding_quality = 1.0f; + mime_info->lang_quality = 1.0f; + mime_info->mime_type_quality = 1.0f; + mime_info->source_quality = 0.0f; +} + +/* Initializing the relevant fields of a variant record from the + * accept_info read out of its content-type, one way or another. + */ + +static void set_mime_fields(var_rec *var, accept_rec *mime_info) +{ + var->mime_type = mime_info->name; + var->source_quality = mime_info->quality; + var->level = mime_info->level; + var->content_charset = mime_info->charset; + + var->is_pseudo_html = (!strcmp(var->mime_type, "text/html") + || !strcmp(var->mime_type, INCLUDES_MAGIC_TYPE) + || !strcmp(var->mime_type, INCLUDES_MAGIC_TYPE3)); +} + +/* Create a variant list validator in r using info from vlistr. */ + +static void set_vlist_validator(request_rec *r, request_rec *vlistr) +{ + /* Calculating the variant list validator is similar to + * calculating an etag for the source of the variant list + * information, so we use ap_make_etag(). Note that this + * validator can be 'weak' in extreme case. + */ + ap_update_mtime(vlistr, vlistr->finfo.mtime); + r->vlist_validator = ap_make_etag(vlistr, 0); + + /* ap_set_etag will later take r->vlist_validator into account + * when creating the etag header + */ +} + + +/***************************************************************** + * + * Parsing (lists of) media types and their parameters, as seen in + * HTTPD header lines and elsewhere. + */ + +/* + * Get a single mime type entry --- one media type and parameters; + * enter the values we recognize into the argument accept_rec + */ + +static const char *get_entry(apr_pool_t *p, accept_rec *result, + const char *accept_line) +{ + result->quality = 1.0f; + result->level = 0.0f; + result->charset = ""; + + /* + * Note that this handles what I gather is the "old format", + * + * Accept: text/html text/plain moo/zot + * + * without any compatibility kludges --- if the token after the + * MIME type begins with a semicolon, we know we're looking at parms, + * otherwise, we know we aren't. (So why all the pissing and moaning + * in the CERN server code? I must be missing something). + */ + + result->name = ap_get_token(p, &accept_line, 0); + ap_str_tolower(result->name); /* You want case insensitive, + * you'll *get* case insensitive. + */ + + /* KLUDGE!!! Default HTML to level 2.0 unless the browser + * *explicitly* says something else. + */ + + if (!strcmp(result->name, "text/html") && (result->level == 0.0)) { + result->level = 2.0f; + } + else if (!strcmp(result->name, INCLUDES_MAGIC_TYPE)) { + result->level = 2.0f; + } + else if (!strcmp(result->name, INCLUDES_MAGIC_TYPE3)) { + result->level = 3.0f; + } + + while (*accept_line == ';') { + /* Parameters ... */ + + char *parm; + char *cp; + char *end; + + ++accept_line; + parm = ap_get_token(p, &accept_line, 1); + + /* Look for 'var = value' --- and make sure the var is in lcase. */ + + for (cp = parm; (*cp && !apr_isspace(*cp) && *cp != '='); ++cp) { + *cp = apr_tolower(*cp); + } + + if (!*cp) { + continue; /* No '='; just ignore it. */ + } + + *cp++ = '\0'; /* Delimit var */ + while (*cp && (apr_isspace(*cp) || *cp == '=')) { + ++cp; + } + + if (*cp == '"') { + ++cp; + for (end = cp; + (*end && *end != '\n' && *end != '\r' && *end != '\"'); + end++); + } + else { + for (end = cp; (*end && !apr_isspace(*end)); end++); + } + if (*end) { + *end = '\0'; /* strip ending quote or return */ + } + ap_str_tolower(cp); + + if (parm[0] == 'q' + && (parm[1] == '\0' || (parm[1] == 's' && parm[2] == '\0'))) { + result->quality = (float)atof(cp); + } + else if (parm[0] == 'l' && !strcmp(&parm[1], "evel")) { + result->level = (float)atof(cp); + } + else if (!strcmp(parm, "charset")) { + result->charset = cp; + } + } + + if (*accept_line == ',') { + ++accept_line; + } + + return accept_line; +} + +/***************************************************************** + * + * Dealing with header lines ... + * + * Accept, Accept-Charset, Accept-Language and Accept-Encoding + * are handled by do_header_line() - they all have the same + * basic structure of a list of items of the format + * name; q=N; charset=TEXT + * + * where charset is only valid in Accept. + */ + +static apr_array_header_t *do_header_line(apr_pool_t *p, + const char *accept_line) +{ + apr_array_header_t *accept_recs; + + if (!accept_line) { + return NULL; + } + + accept_recs = apr_array_make(p, 40, sizeof(accept_rec)); + + while (*accept_line) { + accept_rec *new = (accept_rec *) apr_array_push(accept_recs); + accept_line = get_entry(p, new, accept_line); + } + + return accept_recs; +} + +/* Given the text of the Content-Languages: line from the var map file, + * return an array containing the languages of this variant + */ + +static apr_array_header_t *do_languages_line(apr_pool_t *p, + const char **lang_line) +{ + apr_array_header_t *lang_recs = apr_array_make(p, 2, sizeof(char *)); + + if (!lang_line) { + return lang_recs; + } + + while (**lang_line) { + char **new = (char **) apr_array_push(lang_recs); + *new = ap_get_token(p, lang_line, 0); + ap_str_tolower(*new); + if (**lang_line == ',' || **lang_line == ';') { + ++(*lang_line); + } + } + + return lang_recs; +} + +/***************************************************************** + * + * Handling header lines from clients... + */ + +static negotiation_state *parse_accept_headers(request_rec *r) +{ + negotiation_state *new = + (negotiation_state *) apr_pcalloc(r->pool, sizeof(negotiation_state)); + accept_rec *elts; + apr_table_t *hdrs = r->headers_in; + int i; + + new->pool = r->pool; + new->r = r; + new->conf = (neg_dir_config *)ap_get_module_config(r->per_dir_config, + &negotiation_module); + + new->dir_name = ap_make_dirstr_parent(r->pool, r->filename); + + new->accepts = do_header_line(r->pool, apr_table_get(hdrs, "Accept")); + + /* calculate new->accept_q value */ + if (new->accepts) { + elts = (accept_rec *) new->accepts->elts; + + for (i = 0; i < new->accepts->nelts; ++i) { + if (elts[i].quality < 1.0) { + new->accept_q = 1; + } + } + } + + new->accept_encodings = + do_header_line(r->pool, apr_table_get(hdrs, "Accept-Encoding")); + new->accept_langs = + do_header_line(r->pool, apr_table_get(hdrs, "Accept-Language")); + new->accept_charsets = + do_header_line(r->pool, apr_table_get(hdrs, "Accept-Charset")); + + /* This is possibly overkill for some servers, heck, we have + * only 33 index.html variants in docs/docroot (today). + * Make this configurable? + */ + new->avail_vars = apr_array_make(r->pool, 40, sizeof(var_rec)); + + return new; +} + + +static void parse_negotiate_header(request_rec *r, negotiation_state *neg) +{ + const char *negotiate = apr_table_get(r->headers_in, "Negotiate"); + char *tok; + + /* First, default to no TCN, no Alternates, and the original Apache + * negotiation algorithm with fiddles for broken browser configs. + * + * To save network bandwidth, we do not configure to send an + * Alternates header to the user agent by default. User + * agents that want an Alternates header for agent-driven + * negotiation will have to request it by sending an + * appropriate Negotiate header. + */ + neg->ua_supports_trans = 0; + neg->send_alternates = 0; + neg->may_choose = 1; + neg->use_rvsa = 0; + neg->dont_fiddle_headers = 0; + + if (!negotiate) + return; + + if (strcmp(negotiate, "trans") == 0) { + /* Lynx 2.7 and 2.8 send 'negotiate: trans' even though they + * do not support transparent content negotiation, so for Lynx we + * ignore the negotiate header when its contents are exactly "trans". + * If future versions of Lynx ever need to say 'negotiate: trans', + * they can send the equivalent 'negotiate: trans, trans' instead + * to avoid triggering the workaround below. + */ + const char *ua = apr_table_get(r->headers_in, "User-Agent"); + + if (ua && (strncmp(ua, "Lynx", 4) == 0)) + return; + } + + neg->may_choose = 0; /* An empty Negotiate would require 300 response */ + + while ((tok = ap_get_list_item(neg->pool, &negotiate)) != NULL) { + + if (strcmp(tok, "trans") == 0 || + strcmp(tok, "vlist") == 0 || + strcmp(tok, "guess-small") == 0 || + apr_isdigit(tok[0]) || + strcmp(tok, "*") == 0) { + + /* The user agent supports transparent negotiation */ + neg->ua_supports_trans = 1; + + /* Send-alternates could be configurable, but note + * that it must be 1 if we have 'vlist' in the + * negotiate header. + */ + neg->send_alternates = 1; + + if (strcmp(tok, "1.0") == 0) { + /* we may use the RVSA/1.0 algorithm, configure for it */ + neg->may_choose = 1; + neg->use_rvsa = 1; + neg->dont_fiddle_headers = 1; + } + else if (tok[0] == '*') { + /* we may use any variant selection algorithm, configure + * to use the Apache algorithm + */ + neg->may_choose = 1; + + /* We disable header fiddles on the assumption that a + * client sending Negotiate knows how to send correct + * headers which don't need fiddling. + */ + neg->dont_fiddle_headers = 1; + } + } + } + +#ifdef NEG_DEBUG + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "dont_fiddle_headers=%d use_rvsa=%d ua_supports_trans=%d " + "send_alternates=%d, may_choose=%d", + neg->dont_fiddle_headers, neg->use_rvsa, + neg->ua_supports_trans, neg->send_alternates, neg->may_choose); +#endif + +} + +/* Sometimes clients will give us no Accept info at all; this routine sets + * up the standard default for that case, and also arranges for us to be + * willing to run a CGI script if we find one. (In fact, we set up to + * dramatically prefer CGI scripts in cases where that's appropriate, + * e.g., POST or when URI includes query args or extra path info). + */ +static void maybe_add_default_accepts(negotiation_state *neg, + int prefer_scripts) +{ + accept_rec *new_accept; + + if (!neg->accepts) { + neg->accepts = apr_array_make(neg->pool, 4, sizeof(accept_rec)); + + new_accept = (accept_rec *) apr_array_push(neg->accepts); + + new_accept->name = "*/*"; + new_accept->quality = 1.0f; + new_accept->level = 0.0f; + } + + new_accept = (accept_rec *) apr_array_push(neg->accepts); + + new_accept->name = CGI_MAGIC_TYPE; + if (neg->use_rvsa) { + new_accept->quality = 0; + } + else { + new_accept->quality = prefer_scripts ? 2.0f : 0.001f; + } + new_accept->level = 0.0f; +} + +/***************************************************************** + * + * Parsing type-map files, in Roy's meta/http format augmented with + * #-comments. + */ + +/* Reading RFC822-style header lines, ignoring #-comments and + * handling continuations. + */ + +enum header_state { + header_eof, header_seen, header_sep +}; + +static enum header_state get_header_line(char *buffer, int len, apr_file_t *map) +{ + char *buf_end = buffer + len; + char *cp; + char c; + + /* Get a noncommented line */ + + do { + if (apr_file_gets(buffer, MAX_STRING_LEN, map) != APR_SUCCESS) { + return header_eof; + } + } while (buffer[0] == '#'); + + /* If blank, just return it --- this ends information on this variant */ + + for (cp = buffer; (*cp && apr_isspace(*cp)); ++cp) { + continue; + } + + if (*cp == '\0') { + return header_sep; + } + + /* If non-blank, go looking for header lines, but note that we still + * have to treat comments specially... + */ + + cp += strlen(cp); + + /* We need to shortcut the rest of this block following the Body: + * tag - we will not look for continutation after this line. + */ + if (!strncasecmp(buffer, "Body:", 5)) + return header_seen; + + while (apr_file_getc(&c, map) != APR_EOF) { + if (c == '#') { + /* Comment line */ + while (apr_file_getc(&c, map) != APR_EOF && c != '\n') { + continue; + } + } + else if (apr_isspace(c)) { + /* Leading whitespace. POSSIBLE continuation line + * Also, possibly blank --- if so, we ungetc() the final newline + * so that we will pick up the blank line the next time 'round. + */ + + while (c != '\n' && apr_isspace(c)) { + if(apr_file_getc(&c, map) != APR_SUCCESS) + break; + } + + apr_file_ungetc(c, map); + + if (c == '\n') { + return header_seen; /* Blank line */ + } + + /* Continuation */ + + while ( cp < buf_end - 2 + && (apr_file_getc(&c, map)) != APR_EOF + && c != '\n') { + *cp++ = c; + } + + *cp++ = '\n'; + *cp = '\0'; + } + else { + + /* Line beginning with something other than whitespace */ + + apr_file_ungetc(c, map); + return header_seen; + } + } + + return header_seen; +} + +static apr_off_t get_body(char *buffer, apr_size_t *len, const char *tag, + apr_file_t *map) +{ + char *endbody; + int bodylen; + int taglen; + apr_off_t pos; + + taglen = strlen(tag); + *len -= taglen; + + /* We are at the first character following a body:tag\n entry + * Suck in the body, then backspace to the first char after the + * closing tag entry. If we fail to read, find the tag or back + * up then we have a hosed file, so give up already + */ + if (apr_file_read(map, buffer, len) != APR_SUCCESS) { + return -1; + } + + /* put a copy of the tag *after* the data read from the file + * so that strstr() will find something with no reliance on + * terminating '\0' + */ + memcpy(buffer + *len, tag, taglen); + endbody = strstr(buffer, tag); + if (endbody == buffer + *len) { + return -1; + } + bodylen = endbody - buffer; + endbody += strlen(tag); + /* Skip all the trailing cruft after the end tag to the next line */ + while (*endbody) { + if (*endbody == '\n') { + ++endbody; + break; + } + ++endbody; + } + + pos = -(apr_off_t)(*len - (endbody - buffer)); + if (apr_file_seek(map, APR_CUR, &pos) != APR_SUCCESS) { + return -1; + } + + /* Give the caller back the actual body's file offset and length */ + *len = bodylen; + return pos - (endbody - buffer); +} + + +/* Stripping out RFC822 comments */ + +static void strip_paren_comments(char *hdr) +{ + /* Hmmm... is this correct? In Roy's latest draft, (comments) can nest! */ + /* Nope, it isn't correct. Fails to handle backslash escape as well. */ + + while (*hdr) { + if (*hdr == '"') { + hdr = strchr(hdr, '"'); + if (hdr == NULL) { + return; + } + ++hdr; + } + else if (*hdr == '(') { + while (*hdr && *hdr != ')') { + *hdr++ = ' '; + } + + if (*hdr) { + *hdr++ = ' '; + } + } + else { + ++hdr; + } + } +} + +/* Getting to a header body from the header */ + +static char *lcase_header_name_return_body(char *header, request_rec *r) +{ + char *cp = header; + + for ( ; *cp && *cp != ':' ; ++cp) { + *cp = apr_tolower(*cp); + } + + if (!*cp) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Syntax error in type map, no ':' in %s for header %s", + r->filename, header); + return NULL; + } + + do { + ++cp; + } while (*cp && apr_isspace(*cp)); + + if (!*cp) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Syntax error in type map --- no header body: %s for %s", + r->filename, header); + return NULL; + } + + return cp; +} + +static int read_type_map(apr_file_t **map, negotiation_state *neg, + request_rec *rr) +{ + request_rec *r = neg->r; + apr_file_t *map_ = NULL; + apr_status_t status; + char buffer[MAX_STRING_LEN]; + enum header_state hstate; + struct var_rec mime_info; + int has_content; + + if (!map) + map = &map_; + + /* We are not using multiviews */ + neg->count_multiviews_variants = 0; + + if ((status = apr_file_open(map, rr->filename, APR_READ | APR_BUFFERED, + APR_OS_DEFAULT, neg->pool)) != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, status, r, + "cannot access type map file: %s", rr->filename); + return HTTP_FORBIDDEN; + } + + clean_var_rec(&mime_info); + has_content = 0; + + do { + hstate = get_header_line(buffer, MAX_STRING_LEN, *map); + + if (hstate == header_seen) { + char *body1 = lcase_header_name_return_body(buffer, neg->r); + const char *body; + + if (body1 == NULL) { + return HTTP_INTERNAL_SERVER_ERROR; + } + + strip_paren_comments(body1); + body = body1; + + if (!strncmp(buffer, "uri:", 4)) { + mime_info.file_name = ap_get_token(neg->pool, &body, 0); + } + else if (!strncmp(buffer, "content-type:", 13)) { + struct accept_rec accept_info; + + get_entry(neg->pool, &accept_info, body); + set_mime_fields(&mime_info, &accept_info); + has_content = 1; + } + else if (!strncmp(buffer, "content-length:", 15)) { + mime_info.bytes = apr_atoi64((char *)body); + has_content = 1; + } + else if (!strncmp(buffer, "content-language:", 17)) { + mime_info.content_languages = do_languages_line(neg->pool, + &body); + has_content = 1; + } + else if (!strncmp(buffer, "content-encoding:", 17)) { + mime_info.content_encoding = ap_get_token(neg->pool, &body, 0); + has_content = 1; + } + else if (!strncmp(buffer, "description:", 12)) { + char *desc = apr_pstrdup(neg->pool, body); + char *cp; + + for (cp = desc; *cp; ++cp) { + if (*cp=='\n') *cp=' '; + } + if (cp>desc) *(cp-1)=0; + mime_info.description = desc; + } + else if (!strncmp(buffer, "body:", 5)) { + char *tag = apr_pstrdup(neg->pool, body); + char *eol = strchr(tag, '\0'); + apr_size_t len = MAX_STRING_LEN; + while (--eol >= tag && apr_isspace(*eol)) + *eol = '\0'; + if ((mime_info.body = get_body(buffer, &len, tag, *map)) < 0) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Syntax error in type map, no end tag '%s'" + "found in %s for Body: content.", + tag, r->filename); + break; + } + mime_info.bytes = len; + mime_info.file_name = apr_filename_of_pathname(rr->filename); + } + } + else { + if (*mime_info.file_name && has_content) { + void *new_var = apr_array_push(neg->avail_vars); + + memcpy(new_var, (void *) &mime_info, sizeof(var_rec)); + } + + clean_var_rec(&mime_info); + has_content = 0; + } + } while (hstate != header_eof); + + if (map_) + apr_file_close(map_); + + set_vlist_validator(r, rr); + + return OK; +} + + +/* Sort function used by read_types_multi. */ +static int variantsortf(var_rec *a, var_rec *b) { + + /* First key is the source quality, sort in descending order. */ + + /* XXX: note that we currently implement no method of setting the + * source quality for multiviews variants, so we are always comparing + * 1.0 to 1.0 for now + */ + if (a->source_quality < b->source_quality) + return 1; + if (a->source_quality > b->source_quality) + return -1; + + /* Second key is the variant name */ + return strcmp(a->file_name, b->file_name); +} + +/***************************************************************** + * + * Same as read_type_map, except we use a filtered directory listing + * as the map... + */ + +static int read_types_multi(negotiation_state *neg) +{ + request_rec *r = neg->r; + + char *filp; + int prefix_len; + apr_dir_t *dirp; + apr_finfo_t dirent; + apr_status_t status; + struct var_rec mime_info; + struct accept_rec accept_info; + void *new_var; + int anymatch = 0; + + clean_var_rec(&mime_info); + + if (r->proxyreq || !r->filename + || !ap_os_is_path_absolute(neg->pool, r->filename)) { + return DECLINED; + } + + /* Only absolute paths here */ + if (!(filp = strrchr(r->filename, '/'))) { + return DECLINED; + } + ++filp; + prefix_len = strlen(filp); + + if ((status = apr_dir_open(&dirp, neg->dir_name, + neg->pool)) != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, status, r, + "cannot read directory for multi: %s", neg->dir_name); + return HTTP_FORBIDDEN; + } + + while (apr_dir_read(&dirent, APR_FINFO_DIRENT, dirp) == APR_SUCCESS) { + apr_array_header_t *exception_list; + request_rec *sub_req; + + /* Do we have a match? */ +#ifdef CASE_BLIND_FILESYSTEM + if (strncasecmp(dirent.name, filp, prefix_len)) { +#else + if (strncmp(dirent.name, filp, prefix_len)) { +#endif + continue; + } + if (dirent.name[prefix_len] != '.') { + continue; + } + + /* Don't negotiate directories and other unusual files + * Really shouldn't see anything but DIR/LNK/REG here, + * and we aught to discover if the LNK was interesting. + * + * Of course, this only helps platforms that capture the + * the filetype in apr_dir_read(), which most can once + * they are optimized with some magic [it's known to the + * dirent, not associated to the inode, on most FS's.] + */ + if ((dirent.valid & APR_FINFO_TYPE) && (dirent.filetype == APR_DIR)) + continue; + + /* Ok, something's here. Maybe nothing useful. Remember that + * we tried, if we completely fail, so we can reject the request! + */ + anymatch = 1; + + /* See if it's something which we have access to, and which + * has a known type and encoding (as opposed to something + * which we'll be slapping default_type on later). + */ + sub_req = ap_sub_req_lookup_dirent(&dirent, r, AP_SUBREQ_MERGE_ARGS, + NULL); + + /* Double check, we still don't multi-resolve non-ordinary files + */ + if (sub_req->finfo.filetype != APR_REG) + continue; + + /* If it has a handler, we'll pretend it's a CGI script, + * since that's a good indication of the sort of thing it + * might be doing. + */ + if (sub_req->handler && !sub_req->content_type) { + ap_set_content_type(sub_req, CGI_MAGIC_TYPE); + } + + /* + * mod_mime will _always_ provide us the base name in the + * ap-mime-exception-list, if it processed anything. If + * this list is empty, give up immediately, there was + * nothing interesting. For example, looking at the files + * readme.txt and readme.foo, we will throw away .foo if + * it's an insignificant file (e.g. did not identify a + * language, charset, encoding, content type or handler,) + */ + exception_list = + (apr_array_header_t *)apr_table_get(sub_req->notes, + "ap-mime-exceptions-list"); + + if (!exception_list) { + ap_destroy_sub_req(sub_req); + continue; + } + + /* Each unregonized bit better match our base name, in sequence. + * A test of index.html.foo will match index.foo or index.html.foo, + * but it will never transpose the segments and allow index.foo.html + * because that would introduce too much CPU consumption. Better that + * we don't attempt a many-to-many match here. + */ + { + int nexcept = exception_list->nelts; + char **cur_except = (char**)exception_list->elts; + char *segstart = filp, *segend, saveend; + + while (*segstart && nexcept) { + if (!(segend = strchr(segstart, '.'))) + segend = strchr(segstart, '\0'); + saveend = *segend; + *segend = '\0'; + +#ifdef CASE_BLIND_FILESYSTEM + if (strcasecmp(segstart, *cur_except) == 0) { +#else + if (strcmp(segstart, *cur_except) == 0) { +#endif + --nexcept; + ++cur_except; + } + + if (!saveend) + break; + + *segend = saveend; + segstart = segend + 1; + } + + if (nexcept) { + /* Something you don't know is, something you don't know... + */ + ap_destroy_sub_req(sub_req); + continue; + } + } + + /* + * ###: be warned, the _default_ content type is already + * picked up here! If we failed the subrequest, or don't + * know what we are serving, then continue. + */ + if (sub_req->status != HTTP_OK || (!sub_req->content_type)) { + ap_destroy_sub_req(sub_req); + continue; + } + + /* If it's a map file, we use that instead of the map + * we're building... + */ + if (((sub_req->content_type) && + !strcmp(sub_req->content_type, MAP_FILE_MAGIC_TYPE)) || + ((sub_req->handler) && + !strcmp(sub_req->handler, "type-map"))) { + + apr_dir_close(dirp); + neg->avail_vars->nelts = 0; + if (sub_req->status != HTTP_OK) { + return sub_req->status; + } + return read_type_map(NULL, neg, sub_req); + } + + /* Have reasonable variant --- gather notes. */ + + mime_info.sub_req = sub_req; + mime_info.file_name = apr_pstrdup(neg->pool, dirent.name); + if (sub_req->content_encoding) { + mime_info.content_encoding = sub_req->content_encoding; + } + if (sub_req->content_languages) { + mime_info.content_languages = sub_req->content_languages; + } + + get_entry(neg->pool, &accept_info, sub_req->content_type); + set_mime_fields(&mime_info, &accept_info); + + new_var = apr_array_push(neg->avail_vars); + memcpy(new_var, (void *) &mime_info, sizeof(var_rec)); + + neg->count_multiviews_variants++; + + clean_var_rec(&mime_info); + } + + apr_dir_close(dirp); + + /* We found some file names that matched. None could be served. + * Rather than fall out to autoindex or some other mapper, this + * request must die. + */ + if (anymatch && !neg->avail_vars->nelts) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Negotiation: discovered file(s) matching request: %s" + " (None could be negotiated).", + r->filename); + return HTTP_NOT_FOUND; + } + + set_vlist_validator(r, r); + + /* Sort the variants into a canonical order. The negotiation + * result sometimes depends on the order of the variants. By + * sorting the variants into a canonical order, rather than using + * the order in which readdir() happens to return them, we ensure + * that the negotiation result will be consistent over filesystem + * backup/restores and over all mirror sites. + */ + + qsort((void *) neg->avail_vars->elts, neg->avail_vars->nelts, + sizeof(var_rec), (int (*)(const void *, const void *)) variantsortf); + + return OK; +} + + +/***************************************************************** + * And now for the code you've been waiting for... actually + * finding a match to the client's requirements. + */ + +/* Matching MIME types ... the star/star and foo/star commenting conventions + * are implemented here. (You know what I mean by star/star, but just + * try mentioning those three characters in a C comment). Using strcmp() + * is legit, because everything has already been smashed to lowercase. + * + * Note also that if we get an exact match on the media type, we update + * level_matched for use in level_cmp below... + * + * We also give a value for mime_stars, which is used later. It should + * be 1 for star/star, 2 for type/star and 3 for type/subtype. + */ + +static int mime_match(accept_rec *accept_r, var_rec *avail) +{ + const char *accept_type = accept_r->name; + const char *avail_type = avail->mime_type; + int len = strlen(accept_type); + + if (accept_type[0] == '*') { /* Anything matches star/star */ + if (avail->mime_stars < 1) { + avail->mime_stars = 1; + } + return 1; + } + else if ((accept_type[len - 1] == '*') && + !strncmp(accept_type, avail_type, len - 2)) { + if (avail->mime_stars < 2) { + avail->mime_stars = 2; + } + return 1; + } + else if (!strcmp(accept_type, avail_type) + || (!strcmp(accept_type, "text/html") + && (!strcmp(avail_type, INCLUDES_MAGIC_TYPE) + || !strcmp(avail_type, INCLUDES_MAGIC_TYPE3)))) { + if (accept_r->level >= avail->level) { + avail->level_matched = avail->level; + avail->mime_stars = 3; + return 1; + } + } + + return OK; +} + +/* This code implements a piece of the tie-breaking algorithm between + * variants of equal quality. This piece is the treatment of variants + * of the same base media type, but different levels. What we want to + * return is the variant at the highest level that the client explicitly + * claimed to accept. + * + * If all the variants available are at a higher level than that, or if + * the client didn't say anything specific about this media type at all + * and these variants just got in on a wildcard, we prefer the lowest + * level, on grounds that that's the one that the client is least likely + * to choke on. + * + * (This is all motivated by treatment of levels in HTML --- we only + * want to give level 3 to browsers that explicitly ask for it; browsers + * that don't, including HTTP/0.9 browsers that only get the implicit + * "Accept: * / *" [space added to avoid confusing cpp --- no, that + * syntax doesn't really work] should get HTML2 if available). + * + * (Note that this code only comes into play when we are choosing among + * variants of equal quality, where the draft standard gives us a fair + * bit of leeway about what to do. It ain't specified by the standard; + * rather, it is a choice made by this server about what to do in cases + * where the standard does not specify a unique course of action). + */ + +static int level_cmp(var_rec *var1, var_rec *var2) +{ + /* Levels are only comparable between matching media types */ + + if (var1->is_pseudo_html && !var2->is_pseudo_html) { + return 0; + } + + if (!var1->is_pseudo_html && strcmp(var1->mime_type, var2->mime_type)) { + return 0; + } + /* The result of the above if statements is that, if we get to + * here, both variants have the same mime_type or both are + * pseudo-html. + */ + + /* Take highest level that matched, if either did match. */ + + if (var1->level_matched > var2->level_matched) { + return 1; + } + if (var1->level_matched < var2->level_matched) { + return -1; + } + + /* Neither matched. Take lowest level, if there's a difference. */ + + if (var1->level < var2->level) { + return 1; + } + if (var1->level > var2->level) { + return -1; + } + + /* Tied */ + + return 0; +} + +/* Finding languages. The main entry point is set_language_quality() + * which is called for each variant. It sets two elements in the + * variant record: + * language_quality - the 'q' value of the 'best' matching language + * from Accept-Language: header (HTTP/1.1) + * lang_index - Non-negotiated language priority, using + * position of language on the Accept-Language: + * header, if present, else LanguagePriority + * directive order. + * + * When we do the variant checking for best variant, we use language + * quality first, and if a tie, language_index next (this only applies + * when _not_ using the RVSA/1.0 algorithm). If using the RVSA/1.0 + * algorithm, lang_index is never used. + * + * set_language_quality() calls find_lang_index() and find_default_index() + * to set lang_index. + */ + +static int find_lang_index(apr_array_header_t *accept_langs, char *lang) +{ + const char **alang; + int i; + + if (!lang || !accept_langs) { + return -1; + } + + alang = (const char **) accept_langs->elts; + + for (i = 0; i < accept_langs->nelts; ++i) { + if (!strncmp(lang, *alang, strlen(*alang))) { + return i; + } + alang += (accept_langs->elt_size / sizeof(char*)); + } + + return -1; +} + +/* set_default_lang_quality() sets the quality we apply to variants + * which have no language assigned to them. If none of the variants + * have a language, we are not negotiating on language, so all are + * acceptable, and we set the default q value to 1.0. However if + * some of the variants have languages, we set this default to 0.0001. + * The value of this default will be applied to all variants with + * no explicit language -- which will have the effect of making them + * acceptable, but only if no variants with an explicit language + * are acceptable. The default q value set here is assigned to variants + * with no language type in set_language_quality(). + * + * Note that if using the RVSA/1.0 algorithm, we don't use this + * fiddle. + */ + +static void set_default_lang_quality(negotiation_state *neg) +{ + var_rec *avail_recs = (var_rec *) neg->avail_vars->elts; + int j; + + if (!neg->dont_fiddle_headers) { + for (j = 0; j < neg->avail_vars->nelts; ++j) { + var_rec *variant = &avail_recs[j]; + if (variant->content_languages && + variant->content_languages->nelts) { + neg->default_lang_quality = 0.0001f; + return; + } + } + } + + neg->default_lang_quality = 1.0f; +} + +/* Set the language_quality value in the variant record. Also + * assigns lang_index for ForceLanguagePriority. + * + * To find the language_quality value, we look for the 'q' value + * of the 'best' matching language on the Accept-Language + * header. The 'best' match is the language on Accept-Language + * header which matches the language of this variant either fully, + * or as far as the prefix marker (-). If two or more languages + * match, use the longest string from the Accept-Language header + * (see HTTP/1.1 [14.4]) + * + * When a variant has multiple languages, we find the 'best' + * match for each variant language tag as above, then select the + * one with the highest q value. Because both the accept-header + * and variant can have multiple languages, we now have a hairy + * loop-within-a-loop here. + * + * If the variant has no language and we have no Accept-Language + * items, leave the quality at 1.0 and return. + * + * If the variant has no language, we use the default as set by + * set_default_lang_quality() (1.0 if we are not negotiating on + * language, 0.001 if we are). + * + * Following the setting of the language quality, we drop through to + * set the old 'lang_index'. This is set based on either the order + * of the languages on the Accept-Language header, or the + * order on the LanguagePriority directive. This is only used + * in the negotiation if the language qualities tie. + */ + +static void set_language_quality(negotiation_state *neg, var_rec *variant) +{ + int forcepriority = neg->conf->forcelangpriority; + if (forcepriority == FLP_UNDEF) { + forcepriority = FLP_DEFAULT; + } + + if (!variant->content_languages || !variant->content_languages->nelts) { + /* This variant has no content-language, so use the default + * quality factor for variants with no content-language + * (previously set by set_default_lang_quality()). + * Leave the factor alone (it remains at 1.0) when we may not fiddle + * with the headers. + */ + if (!neg->dont_fiddle_headers) { + variant->lang_quality = neg->default_lang_quality; + } + if (!neg->accept_langs) { + return; /* no accept-language header */ + } + return; + } + else { + /* Variant has one (or more) languages. Look for the best + * match. We do this by going through each language on the + * variant description looking for a match on the + * Accept-Language header. The best match is the longest + * matching language on the header. The final result is the + * best q value from all the languages on the variant + * description. + */ + + if (!neg->accept_langs) { + /* no accept-language header makes the variant indefinite */ + variant->definite = 0; + } + else { /* There is an accept-language with 0 or more items */ + accept_rec *accs = (accept_rec *) neg->accept_langs->elts; + accept_rec *best = NULL, *star = NULL; + accept_rec *bestthistag; + char *lang, *p; + float fiddle_q = 0.0f; + int any_match_on_star = 0; + int i, j; + apr_size_t alen, longest_lang_range_len; + + for (j = 0; j < variant->content_languages->nelts; ++j) { + p = NULL; + bestthistag = NULL; + longest_lang_range_len = 0; + alen = 0; + + /* lang is the variant's language-tag, which is the one + * we are allowed to use the prefix of in HTTP/1.1 + */ + lang = ((char **) (variant->content_languages->elts))[j]; + + /* now find the best (i.e. longest) matching + * Accept-Language header language. We put the best match + * for this tag in bestthistag. We cannot update the + * overall best (based on q value) because the best match + * for this tag is the longest language item on the accept + * header, not necessarily the highest q. + */ + for (i = 0; i < neg->accept_langs->nelts; ++i) { + if (!strcmp(accs[i].name, "*")) { + if (!star) { + star = &accs[i]; + } + continue; + } + /* Find language. We match if either the variant + * language tag exactly matches the language range + * from the accept header, or a prefix of the variant + * language tag up to a '-' character matches the + * whole of the language range in the Accept-Language + * header. Note that HTTP/1.x allows any number of + * '-' characters in a tag or range, currently only + * tags with zero or one '-' characters are defined + * for general use (see rfc1766). + * + * We only use language range in the Accept-Language + * header the best match for the variant language tag + * if it is longer than the previous best match. + */ + + alen = strlen(accs[i].name); + + if ((strlen(lang) >= alen) && + !strncmp(lang, accs[i].name, alen) && + ((lang[alen] == 0) || (lang[alen] == '-')) ) { + + if (alen > longest_lang_range_len) { + longest_lang_range_len = alen; + bestthistag = &accs[i]; + } + } + + if (!bestthistag && !neg->dont_fiddle_headers) { + /* The next bit is a fiddle. Some browsers might + * be configured to send more specific language + * ranges than desirable. For example, an + * Accept-Language of en-US should never match + * variants with languages en or en-GB. But US + * English speakers might pick en-US as their + * language choice. So this fiddle checks if the + * language range has a prefix, and if so, it + * matches variants which match that prefix with a + * priority of 0.001. So a request for en-US would + * match variants of types en and en-GB, but at + * much lower priority than matches of en-US + * directly, or of any other language listed on + * the Accept-Language header. Note that this + * fiddle does not handle multi-level prefixes. + */ + if ((p = strchr(accs[i].name, '-'))) { + int plen = p - accs[i].name; + + if (!strncmp(lang, accs[i].name, plen)) { + fiddle_q = 0.001f; + } + } + } + } + /* Finished looking at Accept-Language headers, the best + * (longest) match is in bestthistag, or NULL if no match + */ + if (!best || + (bestthistag && bestthistag->quality > best->quality)) { + best = bestthistag; + } + + /* See if the tag matches on a * in the Accept-Language + * header. If so, record this fact for later use + */ + if (!bestthistag && star) { + any_match_on_star = 1; + } + } + + /* If one of the language tags of the variant matched on *, we + * need to see if its q is better than that of any non-* match + * on any other tag of the variant. If so the * match takes + * precedence and the overall match is not definite. + */ + if ( any_match_on_star && + ((best && star->quality > best->quality) || + (!best)) ) { + best = star; + variant->definite = 0; + } + + variant->lang_quality = best ? best->quality : fiddle_q; + } + } + + /* Handle the ForceDefaultLanguage overrides, based on the best match + * to LanguagePriority order. The best match is the lowest index of + * any LanguagePriority match. + */ + if (((forcepriority & FLP_PREFER) + && (variant->lang_index < 0)) + || ((forcepriority & FLP_FALLBACK) + && !variant->lang_quality)) + { + int bestidx = -1; + int j; + + for (j = 0; j < variant->content_languages->nelts; ++j) + { + /* lang is the variant's language-tag, which is the one + * we are allowed to use the prefix of in HTTP/1.1 + */ + char *lang = ((char **) (variant->content_languages->elts))[j]; + int idx = -1; + + /* If we wish to fallback or + * we use our own LanguagePriority index. + */ + idx = find_lang_index(neg->conf->language_priority, lang); + if ((idx >= 0) && ((bestidx == -1) || (idx < bestidx))) { + bestidx = idx; + } + } + + if (bestidx >= 0) { + if (variant->lang_quality) { + if (forcepriority & FLP_PREFER) { + variant->lang_index = bestidx; + } + } + else { + if (forcepriority & FLP_FALLBACK) { + variant->lang_index = bestidx; + variant->lang_quality = .0001f; + variant->definite = 0; + } + } + } + } + return; +} + +/* Determining the content length --- if the map didn't tell us, + * we have to do a stat() and remember for next time. + */ + +static apr_off_t find_content_length(negotiation_state *neg, var_rec *variant) +{ + apr_finfo_t statb; + + if (variant->bytes < 0) { + if ( variant->sub_req + && (variant->sub_req->finfo.valid & APR_FINFO_SIZE)) { + variant->bytes = variant->sub_req->finfo.size; + } + else { + char *fullname = ap_make_full_path(neg->pool, neg->dir_name, + variant->file_name); + + if (apr_stat(&statb, fullname, + APR_FINFO_SIZE, neg->pool) == APR_SUCCESS) { + variant->bytes = statb.size; + } + } + } + + return variant->bytes; +} + +/* For a given variant, find the best matching Accept: header + * and assign the Accept: header's quality value to the + * mime_type_quality field of the variant, for later use in + * determining the best matching variant. + */ + +static void set_accept_quality(negotiation_state *neg, var_rec *variant) +{ + int i; + accept_rec *accept_recs; + float q = 0.0f; + int q_definite = 1; + + /* if no Accept: header, leave quality alone (will + * remain at the default value of 1) + * + * XXX: This if is currently never true because of the effect of + * maybe_add_default_accepts(). + */ + if (!neg->accepts) { + if (variant->mime_type && *variant->mime_type) + variant->definite = 0; + return; + } + + accept_recs = (accept_rec *) neg->accepts->elts; + + /* + * Go through each of the ranges on the Accept: header, + * looking for the 'best' match with this variant's + * content-type. We use the best match's quality + * value (from the Accept: header) for this variant's + * mime_type_quality field. + * + * The best match is determined like this: + * type/type is better than type/ * is better than * / * + * if match is type/type, use the level mime param if available + */ + for (i = 0; i < neg->accepts->nelts; ++i) { + + accept_rec *type = &accept_recs[i]; + int prev_mime_stars; + + prev_mime_stars = variant->mime_stars; + + if (!mime_match(type, variant)) { + continue; /* didn't match the content type at all */ + } + else { + /* did match - see if there were less or more stars than + * in previous match + */ + if (prev_mime_stars == variant->mime_stars) { + continue; /* more stars => not as good a match */ + } + } + + /* If we are allowed to mess with the q-values + * and have no explicit q= parameters in the accept header, + * make wildcards very low, so we have a low chance + * of ending up with them if there's something better. + */ + + if (!neg->dont_fiddle_headers && !neg->accept_q && + variant->mime_stars == 1) { + q = 0.01f; + } + else if (!neg->dont_fiddle_headers && !neg->accept_q && + variant->mime_stars == 2) { + q = 0.02f; + } + else { + q = type->quality; + } + + q_definite = (variant->mime_stars == 3); + } + variant->mime_type_quality = q; + variant->definite = variant->definite && q_definite; + +} + +/* For a given variant, find the 'q' value of the charset given + * on the Accept-Charset line. If no charsets are listed, + * assume value of '1'. + */ +static void set_charset_quality(negotiation_state *neg, var_rec *variant) +{ + int i; + accept_rec *accept_recs; + const char *charset = variant->content_charset; + accept_rec *star = NULL; + + /* if no Accept-Charset: header, leave quality alone (will + * remain at the default value of 1) + */ + if (!neg->accept_charsets) { + if (charset && *charset) + variant->definite = 0; + return; + } + + accept_recs = (accept_rec *) neg->accept_charsets->elts; + + if (charset == NULL || !*charset) { + /* Charset of variant not known */ + + /* if not a text / * type, leave quality alone */ + if (!(!strncmp(variant->mime_type, "text/", 5) + || !strcmp(variant->mime_type, INCLUDES_MAGIC_TYPE) + || !strcmp(variant->mime_type, INCLUDES_MAGIC_TYPE3) + )) + return; + + /* Don't go guessing if we are in strict header mode, + * e.g. when running the rvsa, as any guess won't be reflected + * in the variant list or content-location headers. + */ + if (neg->dont_fiddle_headers) + return; + + charset = "iso-8859-1"; /* The default charset for HTTP text types */ + } + + /* + * Go through each of the items on the Accept-Charset header, + * looking for a match with this variant's charset. If none + * match, charset is unacceptable, so set quality to 0. + */ + for (i = 0; i < neg->accept_charsets->nelts; ++i) { + + accept_rec *type = &accept_recs[i]; + + if (!strcmp(type->name, charset)) { + variant->charset_quality = type->quality; + return; + } + else if (strcmp(type->name, "*") == 0) { + star = type; + } + } + /* No explicit match */ + if (star) { + variant->charset_quality = star->quality; + variant->definite = 0; + return; + } + /* If this variant is in charset iso-8859-1, the default is 1.0 */ + if (strcmp(charset, "iso-8859-1") == 0) { + variant->charset_quality = 1.0f; + } + else { + variant->charset_quality = 0.0f; + } +} + + +/* is_identity_encoding is included for back-compat, but does anyone + * use 7bit, 8bin or binary in their var files?? + */ + +static int is_identity_encoding(const char *enc) +{ + return (!enc || !enc[0] || !strcmp(enc, "7bit") || !strcmp(enc, "8bit") + || !strcmp(enc, "binary")); +} + +/* + * set_encoding_quality determines whether the encoding for a particular + * variant is acceptable for the user-agent. + * + * The rules for encoding are that if the user-agent does not supply + * any Accept-Encoding header, then all encodings are allowed but a + * variant with no encoding should be preferred. + * If there is an empty Accept-Encoding header, then no encodings are + * acceptable. If there is a non-empty Accept-Encoding header, then + * any of the listed encodings are acceptable, as well as no encoding + * unless the "identity" encoding is specifically excluded. + */ +static void set_encoding_quality(negotiation_state *neg, var_rec *variant) +{ + accept_rec *accept_recs; + const char *enc = variant->content_encoding; + accept_rec *star = NULL; + float value_if_not_found = 0.0f; + int i; + + if (!neg->accept_encodings) { + /* We had no Accept-Encoding header, assume that all + * encodings are acceptable with a low quality, + * but we prefer no encoding if available. + */ + if (!enc || is_identity_encoding(enc)) + variant->encoding_quality = 1.0f; + else + variant->encoding_quality = 0.5f; + + return; + } + + if (!enc || is_identity_encoding(enc)) { + enc = "identity"; + value_if_not_found = 0.0001f; + } + + accept_recs = (accept_rec *) neg->accept_encodings->elts; + + /* Go through each of the encodings on the Accept-Encoding: header, + * looking for a match with our encoding. x- prefixes are ignored. + */ + if (enc[0] == 'x' && enc[1] == '-') { + enc += 2; + } + for (i = 0; i < neg->accept_encodings->nelts; ++i) { + + char *name = accept_recs[i].name; + + if (name[0] == 'x' && name[1] == '-') { + name += 2; + } + + if (!strcmp(name, enc)) { + variant->encoding_quality = accept_recs[i].quality; + return; + } + + if (strcmp(name, "*") == 0) { + star = &accept_recs[i]; + } + + } + /* No explicit match */ + if (star) { + variant->encoding_quality = star->quality; + return; + } + + /* Encoding not found on Accept-Encoding: header, so it is + * _not_ acceptable unless it is the identity (no encoding) + */ + variant->encoding_quality = value_if_not_found; +} + +/************************************************************* + * Possible results of the variant selection algorithm + */ +enum algorithm_results { + alg_choice = 1, /* choose variant */ + alg_list /* list variants */ +}; + +/* Below is the 'best_match' function. It returns an int, which has + * one of the two values alg_choice or alg_list, which give the result + * of the variant selection algorithm. alg_list means that no best + * variant was found by the algorithm, alg_choice means that a best + * variant was found and should be returned. The list/choice + * terminology comes from TCN (rfc2295), but is used in a more generic + * way here. The best variant is returned in *pbest. best_match has + * two possible algorithms for determining the best variant: the + * RVSA/1.0 algorithm (from RFC2296), and the standard Apache + * algorithm. These are split out into separate functions + * (is_variant_better_rvsa() and is_variant_better()). Selection of + * one is through the neg->use_rvsa flag. + * + * The call to best_match also creates full information, including + * language, charset, etc quality for _every_ variant. This is needed + * for generating a correct Vary header, and can be used for the + * Alternates header, the human-readable list responses and 406 errors. + */ + +/* Firstly, the RVSA/1.0 (HTTP Remote Variant Selection Algorithm + * v1.0) from rfc2296. This is the algorithm that goes together with + * transparent content negotiation (TCN). + */ +static int is_variant_better_rvsa(negotiation_state *neg, var_rec *variant, + var_rec *best, float *p_bestq) +{ + float bestq = *p_bestq, q; + + /* TCN does not cover negotiation on content-encoding. For now, + * we ignore the encoding unless it was explicitly excluded. + */ + if (variant->encoding_quality == 0.0f) + return 0; + + q = variant->mime_type_quality * + variant->source_quality * + variant->charset_quality * + variant->lang_quality; + + /* RFC 2296 calls for the result to be rounded to 5 decimal places, + * but we don't do that because it serves no useful purpose other + * than to ensure that a remote algorithm operates on the same + * precision as ours. That is silly, since what we obviously want + * is for the algorithm to operate on the best available precision + * regardless of who runs it. Since the above calculation may + * result in significant variance at 1e-12, rounding would be bogus. + */ + +#ifdef NEG_DEBUG + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "Variant: file=%s type=%s lang=%s sourceq=%1.3f " + "mimeq=%1.3f langq=%1.3f charq=%1.3f encq=%1.3f " + "q=%1.5f definite=%d", + (variant->file_name ? variant->file_name : ""), + (variant->mime_type ? variant->mime_type : ""), + (variant->content_languages + ? apr_array_pstrcat(neg->pool, variant->content_languages, ',') + : ""), + variant->source_quality, + variant->mime_type_quality, + variant->lang_quality, + variant->charset_quality, + variant->encoding_quality, + q, + variant->definite); +#endif + + if (q <= 0.0f) { + return 0; + } + if (q > bestq) { + *p_bestq = q; + return 1; + } + if (q == bestq) { + /* If the best variant's encoding is of lesser quality than + * this variant, then we prefer this variant + */ + if (variant->encoding_quality > best->encoding_quality) { + *p_bestq = q; + return 1; + } + } + return 0; +} + +/* Negotiation algorithm as used by previous versions of Apache + * (just about). + */ + +static int is_variant_better(negotiation_state *neg, var_rec *variant, + var_rec *best, float *p_bestq) +{ + float bestq = *p_bestq, q; + int levcmp; + + /* For non-transparent negotiation, server can choose how + * to handle the negotiation. We'll use the following in + * order: content-type, language, content-type level, charset, + * content encoding, content length. + * + * For each check, we have three possible outcomes: + * This variant is worse than current best: return 0 + * This variant is better than the current best: + * assign this variant's q to *p_bestq, and return 1 + * This variant is just as desirable as the current best: + * drop through to the next test. + * + * This code is written in this long-winded way to allow future + * customisation, either by the addition of additional + * checks, or to allow the order of the checks to be determined + * by configuration options (e.g. we might prefer to check + * language quality _before_ content type). + */ + + /* First though, eliminate this variant if it is not + * acceptable by type, charset, encoding or language. + */ + +#ifdef NEG_DEBUG + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "Variant: file=%s type=%s lang=%s sourceq=%1.3f " + "mimeq=%1.3f langq=%1.3f langidx=%d charq=%1.3f encq=%1.3f ", + (variant->file_name ? variant->file_name : ""), + (variant->mime_type ? variant->mime_type : ""), + (variant->content_languages + ? apr_array_pstrcat(neg->pool, variant->content_languages, ',') + : ""), + variant->source_quality, + variant->mime_type_quality, + variant->lang_quality, + variant->lang_index, + variant->charset_quality, + variant->encoding_quality); +#endif + + if (variant->encoding_quality == 0.0f || + variant->lang_quality == 0.0f || + variant->source_quality == 0.0f || + variant->charset_quality == 0.0f || + variant->mime_type_quality == 0.0f) { + return 0; /* don't consider unacceptables */ + } + + q = variant->mime_type_quality * variant->source_quality; + if (q == 0.0 || q < bestq) { + return 0; + } + if (q > bestq || !best) { + *p_bestq = q; + return 1; + } + + /* language */ + if (variant->lang_quality < best->lang_quality) { + return 0; + } + if (variant->lang_quality > best->lang_quality) { + *p_bestq = q; + return 1; + } + + /* if language qualities were equal, try the LanguagePriority stuff */ + if (best->lang_index != -1 && + (variant->lang_index == -1 || variant->lang_index > best->lang_index)) { + return 0; + } + if (variant->lang_index != -1 && + (best->lang_index == -1 || variant->lang_index < best->lang_index)) { + *p_bestq = q; + return 1; + } + + /* content-type level (sometimes used with text/html, though we + * support it on other types too) + */ + levcmp = level_cmp(variant, best); + if (levcmp == -1) { + return 0; + } + if (levcmp == 1) { + *p_bestq = q; + return 1; + } + + /* charset */ + if (variant->charset_quality < best->charset_quality) { + return 0; + } + /* If the best variant's charset is ISO-8859-1 and this variant has + * the same charset quality, then we prefer this variant + */ + + if (variant->charset_quality > best->charset_quality || + ((variant->content_charset != NULL && + *variant->content_charset != '\0' && + strcmp(variant->content_charset, "iso-8859-1") != 0) && + (best->content_charset == NULL || + *best->content_charset == '\0' || + strcmp(best->content_charset, "iso-8859-1") == 0))) { + *p_bestq = q; + return 1; + } + + /* Prefer the highest value for encoding_quality. + */ + if (variant->encoding_quality < best->encoding_quality) { + return 0; + } + if (variant->encoding_quality > best->encoding_quality) { + *p_bestq = q; + return 1; + } + + /* content length if all else equal */ + if (find_content_length(neg, variant) >= find_content_length(neg, best)) { + return 0; + } + + /* ok, to get here means every thing turned out equal, except + * we have a shorter content length, so use this variant + */ + *p_bestq = q; + return 1; +} + +/* figure out, whether a variant is in a specific language + * it returns also false, if the variant has no language. + */ +static int variant_has_language(var_rec *variant, const char *lang) +{ + int j, max; + + /* fast exit */ + if ( !lang + || !variant->content_languages + || !(max = variant->content_languages->nelts)) { + return 0; + } + + for (j = 0; j < max; ++j) { + if (!strcmp(lang, + ((char **) (variant->content_languages->elts))[j])) { + return 1; + } + } + + return 0; +} + +static int best_match(negotiation_state *neg, var_rec **pbest) +{ + int j; + var_rec *best; + float bestq = 0.0f; + enum algorithm_results algorithm_result; + + var_rec *avail_recs = (var_rec *) neg->avail_vars->elts; + + const char *preferred_language = apr_table_get(neg->r->subprocess_env, + "prefer-language"); + + set_default_lang_quality(neg); + + /* + * Find the 'best' variant + * We run the loop possibly twice: if "prefer-language" + * environment variable is set but we did not find an appropriate + * best variant. In that case forget the preferred language and + * negotiate over all variants. + */ + + do { + best = NULL; + + for (j = 0; j < neg->avail_vars->nelts; ++j) { + var_rec *variant = &avail_recs[j]; + + /* if a language is preferred, but the current variant + * is not in that language, then drop it for now + */ + if ( preferred_language + && !variant_has_language(variant, preferred_language)) { + continue; + } + + /* Find all the relevant 'quality' values from the + * Accept... headers, and store in the variant. This also + * prepares for sending an Alternates header etc so we need to + * do it even if we do not actually plan to find a best + * variant. + */ + set_accept_quality(neg, variant); + /* accept the preferred language, even when it's not listed within + * the Accept-Language header + */ + if (preferred_language) { + variant->lang_quality = 1.0f; + variant->definite = 1; + } + else { + set_language_quality(neg, variant); + } + set_encoding_quality(neg, variant); + set_charset_quality(neg, variant); + + /* Only do variant selection if we may actually choose a + * variant for the client + */ + if (neg->may_choose) { + + /* Now find out if this variant is better than the current + * best, either using the RVSA/1.0 algorithm, or Apache's + * internal server-driven algorithm. Presumably other + * server-driven algorithms are possible, and could be + * implemented here. + */ + + if (neg->use_rvsa) { + if (is_variant_better_rvsa(neg, variant, best, &bestq)) { + best = variant; + } + } + else { + if (is_variant_better(neg, variant, best, &bestq)) { + best = variant; + } + } + } + } + + /* We now either have a best variant, or no best variant */ + + if (neg->use_rvsa) { + /* calculate result for RVSA/1.0 algorithm: + * only a choice response if the best variant has q>0 + * and is definite + */ + algorithm_result = (best && best->definite) && (bestq > 0) ? + alg_choice : alg_list; + } + else { + /* calculate result for Apache negotiation algorithm */ + algorithm_result = bestq > 0 ? alg_choice : alg_list; + } + + /* run the loop again, if the "prefer-language" got no clear result */ + if (preferred_language && (!best || algorithm_result != alg_choice)) { + preferred_language = NULL; + continue; + } + + break; + } while (1); + + /* Returning a choice response with a non-neighboring variant is a + * protocol security error in TCN (see rfc2295). We do *not* + * verify here that the variant and URI are neighbors, even though + * we may return alg_choice. We depend on the environment (the + * caller) to only declare the resource transparently negotiable if + * all variants are neighbors. + */ + *pbest = best; + return algorithm_result; +} + +/* Sets response headers for a negotiated response. + * neg->is_transparent determines whether a transparently negotiated + * response or a plain `server driven negotiation' response is + * created. Applicable headers are Alternates, Vary, and TCN. + * + * The Vary header we create is sometimes longer than is required for + * the correct caching of negotiated results by HTTP/1.1 caches. For + * example if we have 3 variants x.html, x.ps.en and x.ps.nl, and if + * the Accept: header assigns a 0 quality to .ps, then the results of + * the two server-side negotiation algorithms we currently implement + * will never depend on Accept-Language so we could return `Vary: + * negotiate, accept' instead of the longer 'Vary: negotiate, accept, + * accept-language' which the code below will return. A routine for + * computing the exact minimal Vary header would be a huge pain to code + * and maintain though, especially because we need to take all possible + * twiddles in the server-side negotiation algorithms into account. + */ +static void set_neg_headers(request_rec *r, negotiation_state *neg, + int alg_result) +{ + apr_table_t *hdrs; + var_rec *avail_recs = (var_rec *) neg->avail_vars->elts; + const char *sample_type = NULL; + const char *sample_language = NULL; + const char *sample_encoding = NULL; + const char *sample_charset = NULL; + char *lang; + char *qstr; + char *lenstr; + apr_off_t len; + apr_array_header_t *arr; + int max_vlist_array = (neg->avail_vars->nelts * 21); + int first_variant = 1; + int vary_by_type = 0; + int vary_by_language = 0; + int vary_by_charset = 0; + int vary_by_encoding = 0; + int j; + + /* In order to avoid O(n^2) memory copies in building Alternates, + * we preallocate a apr_table_t with the maximum substrings possible, + * fill it with the variant list, and then concatenate the entire array. + * Note that if you change the number of substrings pushed, you also + * need to change the calculation of max_vlist_array above. + */ + if (neg->send_alternates && neg->avail_vars->nelts) + arr = apr_array_make(r->pool, max_vlist_array, sizeof(char *)); + else + arr = NULL; + + /* Put headers into err_headers_out, since send_http_header() + * outputs both headers_out and err_headers_out. + */ + hdrs = r->err_headers_out; + + for (j = 0; j < neg->avail_vars->nelts; ++j) { + var_rec *variant = &avail_recs[j]; + + if (variant->content_languages && variant->content_languages->nelts) { + lang = apr_array_pstrcat(r->pool, variant->content_languages, ','); + } + else { + lang = NULL; + } + + /* Calculate Vary by looking for any difference between variants */ + + if (first_variant) { + sample_type = variant->mime_type; + sample_charset = variant->content_charset; + sample_language = lang; + sample_encoding = variant->content_encoding; + } + else { + if (!vary_by_type && + strcmp(sample_type ? sample_type : "", + variant->mime_type ? variant->mime_type : "")) { + vary_by_type = 1; + } + if (!vary_by_charset && + strcmp(sample_charset ? sample_charset : "", + variant->content_charset ? + variant->content_charset : "")) { + vary_by_charset = 1; + } + if (!vary_by_language && + strcmp(sample_language ? sample_language : "", + lang ? lang : "")) { + vary_by_language = 1; + } + if (!vary_by_encoding && + strcmp(sample_encoding ? sample_encoding : "", + variant->content_encoding ? + variant->content_encoding : "")) { + vary_by_encoding = 1; + } + } + first_variant = 0; + + if (!neg->send_alternates) + continue; + + /* Generate the string components for this Alternates entry */ + + *((const char **) apr_array_push(arr)) = "{\""; + *((const char **) apr_array_push(arr)) = variant->file_name; + *((const char **) apr_array_push(arr)) = "\" "; + + qstr = (char *) apr_palloc(r->pool, 6); + apr_snprintf(qstr, 6, "%1.3f", variant->source_quality); + + /* Strip trailing zeros (saves those valuable network bytes) */ + if (qstr[4] == '0') { + qstr[4] = '\0'; + if (qstr[3] == '0') { + qstr[3] = '\0'; + if (qstr[2] == '0') { + qstr[1] = '\0'; + } + } + } + *((const char **) apr_array_push(arr)) = qstr; + + if (variant->mime_type && *variant->mime_type) { + *((const char **) apr_array_push(arr)) = " {type "; + *((const char **) apr_array_push(arr)) = variant->mime_type; + *((const char **) apr_array_push(arr)) = "}"; + } + if (variant->content_charset && *variant->content_charset) { + *((const char **) apr_array_push(arr)) = " {charset "; + *((const char **) apr_array_push(arr)) = variant->content_charset; + *((const char **) apr_array_push(arr)) = "}"; + } + if (lang) { + *((const char **) apr_array_push(arr)) = " {language "; + *((const char **) apr_array_push(arr)) = lang; + *((const char **) apr_array_push(arr)) = "}"; + } + if (variant->content_encoding && *variant->content_encoding) { + /* Strictly speaking, this is non-standard, but so is TCN */ + + *((const char **) apr_array_push(arr)) = " {encoding "; + *((const char **) apr_array_push(arr)) = variant->content_encoding; + *((const char **) apr_array_push(arr)) = "}"; + } + + /* Note that the Alternates specification (in rfc2295) does + * not require that we include {length x}, so we could omit it + * if determining the length is too expensive. We currently + * always include it though. 22 bytes is enough for 2^64. + * + * If the variant is a CGI script, find_content_length would + * return the length of the script, not the output it + * produces, so we check for the presence of a handler and if + * there is one we don't add a length. + * + * XXX: TODO: This check does not detect a CGI script if we + * get the variant from a type map. This needs to be fixed + * (without breaking things if the type map specifies a + * content-length, which currently leads to the correct result). + */ + if (!(variant->sub_req && variant->sub_req->handler) + && (len = find_content_length(neg, variant)) >= 0) { + + lenstr = (char *) apr_palloc(r->pool, 22); + apr_snprintf(lenstr, 22, "%" APR_OFF_T_FMT, len); + *((const char **) apr_array_push(arr)) = " {length "; + *((const char **) apr_array_push(arr)) = lenstr; + *((const char **) apr_array_push(arr)) = "}"; + } + + *((const char **) apr_array_push(arr)) = "}"; + *((const char **) apr_array_push(arr)) = ", "; /* trimmed below */ + } + + if (neg->send_alternates && neg->avail_vars->nelts) { + arr->nelts--; /* remove last comma */ + apr_table_mergen(hdrs, "Alternates", + apr_array_pstrcat(r->pool, arr, '\0')); + } + + if (neg->is_transparent || vary_by_type || vary_by_language || + vary_by_language || vary_by_charset || vary_by_encoding) { + + apr_table_mergen(hdrs, "Vary", 2 + apr_pstrcat(r->pool, + neg->is_transparent ? ", negotiate" : "", + vary_by_type ? ", accept" : "", + vary_by_language ? ", accept-language" : "", + vary_by_charset ? ", accept-charset" : "", + vary_by_encoding ? ", accept-encoding" : "", NULL)); + } + + if (neg->is_transparent) { /* Create TCN response header */ + apr_table_setn(hdrs, "TCN", + alg_result == alg_list ? "list" : "choice"); + } +} + +/********************************************************************** + * + * Return an HTML list of variants. This is output as part of the + * choice response or 406 status body. + */ + +static char *make_variant_list(request_rec *r, negotiation_state *neg) +{ + apr_array_header_t *arr; + int i; + int max_vlist_array = (neg->avail_vars->nelts * 15) + 2; + + /* In order to avoid O(n^2) memory copies in building the list, + * we preallocate a apr_table_t with the maximum substrings possible, + * fill it with the variant list, and then concatenate the entire array. + */ + arr = apr_array_make(r->pool, max_vlist_array, sizeof(char *)); + + *((const char **) apr_array_push(arr)) = "Available variants:\n
      \n"; + + for (i = 0; i < neg->avail_vars->nelts; ++i) { + var_rec *variant = &((var_rec *) neg->avail_vars->elts)[i]; + const char *filename = variant->file_name ? variant->file_name : ""; + apr_array_header_t *languages = variant->content_languages; + const char *description = variant->description + ? variant->description + : ""; + + /* The format isn't very neat, and it would be nice to make + * the tags human readable (eg replace 'language en' with 'English'). + * Note that if you change the number of substrings pushed, you also + * need to change the calculation of max_vlist_array above. + */ + *((const char **) apr_array_push(arr)) = "
    • "; + *((const char **) apr_array_push(arr)) = filename; + *((const char **) apr_array_push(arr)) = " "; + *((const char **) apr_array_push(arr)) = description; + + if (variant->mime_type && *variant->mime_type) { + *((const char **) apr_array_push(arr)) = ", type "; + *((const char **) apr_array_push(arr)) = variant->mime_type; + } + if (languages && languages->nelts) { + *((const char **) apr_array_push(arr)) = ", language "; + *((const char **) apr_array_push(arr)) = apr_array_pstrcat(r->pool, + languages, ','); + } + if (variant->content_charset && *variant->content_charset) { + *((const char **) apr_array_push(arr)) = ", charset "; + *((const char **) apr_array_push(arr)) = variant->content_charset; + } + if (variant->content_encoding) { + *((const char **) apr_array_push(arr)) = ", encoding "; + *((const char **) apr_array_push(arr)) = variant->content_encoding; + } + *((const char **) apr_array_push(arr)) = "
    • \n"; + } + *((const char **) apr_array_push(arr)) = "
    \n"; + + return apr_array_pstrcat(r->pool, arr, '\0'); +} + +static void store_variant_list(request_rec *r, negotiation_state *neg) +{ + if (r->main == NULL) { + apr_table_setn(r->notes, "variant-list", make_variant_list(r, neg)); + } + else { + apr_table_setn(r->main->notes, "variant-list", + make_variant_list(r->main, neg)); + } +} + +/* Called if we got a "Choice" response from the variant selection algorithm. + * It checks the result of the chosen variant to see if it + * is itself negotiated (if so, return error HTTP_VARIANT_ALSO_VARIES). + * Otherwise, add the appropriate headers to the current response. + */ + +static int setup_choice_response(request_rec *r, negotiation_state *neg, + var_rec *variant) +{ + request_rec *sub_req; + const char *sub_vary; + + if (!variant->sub_req) { + int status; + + sub_req = ap_sub_req_lookup_file(variant->file_name, r, NULL); + status = sub_req->status; + + if (status != HTTP_OK && + !apr_table_get(sub_req->err_headers_out, "TCN")) { + ap_destroy_sub_req(sub_req); + return status; + } + variant->sub_req = sub_req; + } + else { + sub_req = variant->sub_req; + } + + /* The variant selection algorithm told us to return a "Choice" + * response. This is the normal variant response, with + * some extra headers. First, ensure that the chosen + * variant did or will not itself engage in transparent negotiation. + * If not, set the appropriate headers, and fall through to + * the normal variant handling + */ + + /* This catches the error that a transparent type map selects a + * transparent multiviews resource as the best variant. + * + * XXX: We do not signal an error if a transparent type map + * selects a _non_transparent multiviews resource as the best + * variant, because we can generate a legal negotiation response + * in this case. In this case, the vlist_validator of the + * nontransparent subrequest will be lost however. This could + * lead to cases in which a change in the set of variants or the + * negotiation algorithm of the nontransparent resource is never + * propagated up to a HTTP/1.1 cache which interprets Vary. To be + * completely on the safe side we should return HTTP_VARIANT_ALSO_VARIES + * for this type of recursive negotiation too. + */ + if (neg->is_transparent && + apr_table_get(sub_req->err_headers_out, "TCN")) { + return HTTP_VARIANT_ALSO_VARIES; + } + + /* This catches the error that a transparent type map recursively + * selects, as the best variant, another type map which itself + * causes transparent negotiation to be done. + * + * XXX: Actually, we catch this error by catching all cases of + * type map recursion. There are some borderline recursive type + * map arrangements which would not produce transparent + * negotiation protocol errors or lack of cache propagation + * problems, but such arrangements are very hard to detect at this + * point in the control flow, so we do not bother to single them + * out. + * + * Recursive type maps imply a recursive arrangement of negotiated + * resources which is visible to outside clients, and this is not + * supported by the transparent negotiation caching protocols, so + * if we are to have generic support for recursive type maps, we + * have to create some configuration setting which makes all type + * maps non-transparent when recursion is enabled. Also, if we + * want recursive type map support which ensures propagation of + * type map changes into HTTP/1.1 caches that handle Vary, we + * would have to extend the current mechanism for generating + * variant list validators. + */ + if (sub_req->handler && strcmp(sub_req->handler, "type-map") == 0) { + return HTTP_VARIANT_ALSO_VARIES; + } + + /* This adds an appropriate Variant-Vary header if the subrequest + * is a multiviews resource. + * + * XXX: TODO: Note that this does _not_ handle any Vary header + * returned by a CGI if sub_req is a CGI script, because we don't + * see that Vary header yet at this point in the control flow. + * This won't cause any cache consistency problems _unless_ the + * CGI script also returns a Cache-Control header marking the + * response as cachable. This needs to be fixed, also there are + * problems if a CGI returns an Etag header which also need to be + * fixed. + */ + if ((sub_vary = apr_table_get(sub_req->err_headers_out, "Vary")) != NULL) { + apr_table_setn(r->err_headers_out, "Variant-Vary", sub_vary); + + /* Move the subreq Vary header into the main request to + * prevent having two Vary headers in the response, which + * would be legal but strange. + */ + apr_table_setn(r->err_headers_out, "Vary", sub_vary); + apr_table_unset(sub_req->err_headers_out, "Vary"); + } + + apr_table_setn(r->err_headers_out, "Content-Location", + apr_pstrdup(r->pool, variant->file_name)); + + set_neg_headers(r, neg, alg_choice); /* add Alternates and Vary */ + + /* Still to do by caller: add Expires */ + + return 0; +} + +/**************************************************************** + * + * Executive... + */ + +static int do_negotiation(request_rec *r, negotiation_state *neg, + var_rec **bestp, int prefer_scripts) +{ + var_rec *avail_recs = (var_rec *) neg->avail_vars->elts; + int alg_result; /* result of variant selection algorithm */ + int res; + int j; + + /* Decide if resource is transparently negotiable */ + + /* GET or HEAD? (HEAD has same method number as GET) */ + if (r->method_number == M_GET) { + + /* maybe this should be configurable, see also the comment + * about recursive type maps in setup_choice_response() + */ + neg->is_transparent = 1; + + /* We can't be transparent if we are a map file in the middle + * of the request URI. + */ + if (r->path_info && *r->path_info) + neg->is_transparent = 0; + + for (j = 0; j < neg->avail_vars->nelts; ++j) { + var_rec *variant = &avail_recs[j]; + + /* We can't be transparent, because of internal + * assumptions in best_match(), if there is a + * non-neighboring variant. We can have a non-neighboring + * variant when processing a type map. + */ + if (ap_strchr_c(variant->file_name, '/')) + neg->is_transparent = 0; + + /* We can't be transparent, because of the behavior + * of variant typemap bodies. + */ + if (variant->body) { + neg->is_transparent = 0; + } + } + } + + if (neg->is_transparent) { + parse_negotiate_header(r, neg); + } + else { /* configure negotiation on non-transparent resource */ + neg->may_choose = 1; + } + + maybe_add_default_accepts(neg, prefer_scripts); + + alg_result = best_match(neg, bestp); + + /* alg_result is one of + * alg_choice: a best variant is chosen + * alg_list: no best variant is chosen + */ + + if (alg_result == alg_list) { + /* send a list response or HTTP_NOT_ACCEPTABLE error response */ + + neg->send_alternates = 1; /* always include Alternates header */ + set_neg_headers(r, neg, alg_result); + store_variant_list(r, neg); + + if (neg->is_transparent && neg->ua_supports_trans) { + /* XXX todo: expires? cachability? */ + + /* Some HTTP/1.0 clients are known to choke when they get + * a 300 (multiple choices) response without a Location + * header. However the 300 code response we are are about + * to generate will only reach 1.0 clients which support + * transparent negotiation, and they should be OK. The + * response should never reach older 1.0 clients, even if + * we have CacheNegotiatedDocs enabled, because no 1.0 + * proxy cache (we know of) will cache and return 300 + * responses (they certainly won't if they conform to the + * HTTP/1.0 specification). + */ + return HTTP_MULTIPLE_CHOICES; + } + + if (!*bestp) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "no acceptable variant: %s", r->filename); + return HTTP_NOT_ACCEPTABLE; + } + } + + /* Variant selection chose a variant */ + + /* XXX todo: merge the two cases in the if statement below */ + if (neg->is_transparent) { + + if ((res = setup_choice_response(r, neg, *bestp)) != 0) { + return res; /* return if error */ + } + } + else { + set_neg_headers(r, neg, alg_result); + } + + /* Make sure caching works - Vary should handle HTTP/1.1, but for + * HTTP/1.0, we can't allow caching at all. + */ + + /* XXX: Note that we only set r->no_cache to 1, which causes + * Expires: to be added, when responding to a HTTP/1.0 + * client. If we return the response to a 1.1 client, we do not + * add Expires , because doing so would degrade 1.1 cache + * performance by preventing re-use of the response without prior + * revalidation. On the other hand, if the 1.1 client is a proxy + * which was itself contacted by a 1.0 client, or a proxy cache + * which can be contacted later by 1.0 clients, then we currently + * rely on this 1.1 proxy to add the Expires: when it + * forwards the response. + * + * XXX: TODO: Find out if the 1.1 spec requires proxies and + * tunnels to add Expires: when forwarding the response to + * 1.0 clients. I (kh) recall it is rather vague on this point. + * Testing actual 1.1 proxy implementations would also be nice. If + * Expires: is not added by proxies then we need to always + * include Expires: ourselves to ensure correct caching, but + * this would degrade HTTP/1.1 cache efficiency unless we also add + * Cache-Control: max-age=N, which we currently don't. + * + * Roy: No, we are not going to screw over HTTP future just to + * ensure that people who can't be bothered to upgrade their + * clients will always receive perfect server-side negotiation. + * Hell, those clients are sending bogus accept headers anyway. + * + * Manual setting of cache-control/expires always overrides this + * automated kluge, on purpose. + */ + + if ((!do_cache_negotiated_docs(r->server) + && (r->proto_num < HTTP_VERSION(1,1))) + && neg->count_multiviews_variants != 1) { + r->no_cache = 1; + } + + return OK; +} + +static int handle_map_file(request_rec *r) +{ + negotiation_state *neg; + apr_file_t *map; + var_rec *best; + int res; + char *udir; + + if(strcmp(r->handler,MAP_FILE_MAGIC_TYPE) && strcmp(r->handler,"type-map")) + return DECLINED; + + neg = parse_accept_headers(r); + if ((res = read_type_map(&map, neg, r))) { + return res; + } + + res = do_negotiation(r, neg, &best, 0); + if (res != 0) return res; + + if (best->body) + { + conn_rec *c = r->connection; + apr_bucket_brigade *bb; + apr_bucket *e; + + ap_allow_standard_methods(r, REPLACE_ALLOW, M_GET, M_OPTIONS, + M_POST, -1); + /* XXX: ? + * if (r->method_number == M_OPTIONS) { + * return ap_send_http_options(r); + *} + */ + if (r->method_number != M_GET && r->method_number != M_POST) { + return HTTP_METHOD_NOT_ALLOWED; + } + + /* ### These may be implemented by adding some 'extra' info + * of the file offset onto the etag + * ap_update_mtime(r, r->finfo.mtime); + * ap_set_last_modified(r); + * ap_set_etag(r); + */ + apr_table_setn(r->headers_out, "Accept-Ranges", "bytes"); + ap_set_content_length(r, best->bytes); + + /* set MIME type and charset as negotiated */ + if (best->mime_type && *best->mime_type) { + if (best->content_charset && *best->content_charset) { + ap_set_content_type(r, apr_pstrcat(r->pool, + best->mime_type, + "; charset=", + best->content_charset, + NULL)); + } + else { + ap_set_content_type(r, apr_pstrdup(r->pool, best->mime_type)); + } + } + + /* set Content-language(s) as negotiated */ + if (best->content_languages && best->content_languages->nelts) { + r->content_languages = apr_array_copy(r->pool, + best->content_languages); + } + + /* set Content-Encoding as negotiated */ + if (best->content_encoding && *best->content_encoding) { + r->content_encoding = apr_pstrdup(r->pool, + best->content_encoding); + } + + if ((res = ap_meets_conditions(r)) != OK) { + return res; + } + + if ((res = ap_discard_request_body(r)) != OK) { + return res; + } + bb = apr_brigade_create(r->pool, c->bucket_alloc); + e = apr_bucket_file_create(map, best->body, + (apr_size_t)best->bytes, r->pool, + c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, e); + e = apr_bucket_eos_create(c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, e); + + return ap_pass_brigade(r->output_filters, bb); + } + + if (r->path_info && *r->path_info) { + /* remove any path_info from the end of the uri before trying + * to change the filename. r->path_info from the original + * request is passed along on the redirect. + */ + r->uri[ap_find_path_info(r->uri, r->path_info)] = '\0'; + } + udir = ap_make_dirstr_parent(r->pool, r->uri); + udir = ap_escape_uri(r->pool, udir); + ap_internal_redirect(apr_pstrcat(r->pool, udir, best->file_name, + r->path_info, NULL), r); + return OK; +} + +static int handle_multi(request_rec *r) +{ + negotiation_state *neg; + var_rec *best, *avail_recs; + request_rec *sub_req; + int res; + int j; + + if (r->finfo.filetype != APR_NOFILE + || !(ap_allow_options(r) & OPT_MULTI)) { + return DECLINED; + } + + neg = parse_accept_headers(r); + + if ((res = read_types_multi(neg))) { + return_from_multi: + /* free all allocated memory from subrequests */ + avail_recs = (var_rec *) neg->avail_vars->elts; + for (j = 0; j < neg->avail_vars->nelts; ++j) { + var_rec *variant = &avail_recs[j]; + if (variant->sub_req) { + ap_destroy_sub_req(variant->sub_req); + } + } + return res; + } + if (neg->avail_vars->nelts == 0) { + return DECLINED; + } + + res = do_negotiation(r, neg, &best, + (r->method_number != M_GET) || r->args || + (r->path_info && *r->path_info)); + if (res != 0) + goto return_from_multi; + + if (!(sub_req = best->sub_req)) { + /* We got this out of a map file, so we don't actually have + * a sub_req structure yet. Get one now. + */ + + sub_req = ap_sub_req_lookup_file(best->file_name, r, NULL); + if (sub_req->status != HTTP_OK) { + res = sub_req->status; + ap_destroy_sub_req(sub_req); + goto return_from_multi; + } + } + if (sub_req->args == NULL) { + sub_req->args = r->args; + } + + /* now do a "fast redirect" ... promotes the sub_req into the main req */ + ap_internal_fast_redirect(sub_req, r); + + /* give no advise for time on this subrequest. Perhaps we + * should tally the last mtime amoung all variants, and date + * the most recent, but that could confuse the proxies. + */ + r->mtime = 0; + + /* clean up all but our favorite variant, since that sub_req + * is now merged into the main request! + */ + avail_recs = (var_rec *) neg->avail_vars->elts; + for (j = 0; j < neg->avail_vars->nelts; ++j) { + var_rec *variant = &avail_recs[j]; + if (variant != best && variant->sub_req) { + ap_destroy_sub_req(variant->sub_req); + } + } + return OK; +} + +/********************************************************************** + * There is a problem with content-encoding, as some clients send and + * expect an x- token (e.g. x-gzip) while others expect the plain token + * (i.e. gzip). To try and deal with this as best as possible we do + * the following: if the client sent an Accept-Encoding header and it + * contains a plain token corresponding to the content encoding of the + * response, then set content encoding using the plain token. Else if + * the A-E header contains the x- token use the x- token in the C-E + * header. Else don't do anything. + * + * Note that if no A-E header was sent, or it does not contain a token + * compatible with the final content encoding, then the token in the + * C-E header will be whatever was specified in the AddEncoding + * directive. + */ +static int fix_encoding(request_rec *r) +{ + const char *enc = r->content_encoding; + char *x_enc = NULL; + apr_array_header_t *accept_encodings; + accept_rec *accept_recs; + int i; + + if (!enc || !*enc) { + return DECLINED; + } + + if (enc[0] == 'x' && enc[1] == '-') { + enc += 2; + } + + if ((accept_encodings = do_header_line(r->pool, + apr_table_get(r->headers_in, "Accept-Encoding"))) == NULL) { + return DECLINED; + } + + accept_recs = (accept_rec *) accept_encodings->elts; + + for (i = 0; i < accept_encodings->nelts; ++i) { + char *name = accept_recs[i].name; + + if (!strcmp(name, enc)) { + r->content_encoding = name; + return OK; + } + + if (name[0] == 'x' && name[1] == '-' && !strcmp(name+2, enc)) { + x_enc = name; + } + } + + if (x_enc) { + r->content_encoding = x_enc; + return OK; + } + + return DECLINED; +} + +static void register_hooks(apr_pool_t *p) +{ + ap_hook_fixups(fix_encoding,NULL,NULL,APR_HOOK_MIDDLE); + ap_hook_type_checker(handle_multi,NULL,NULL,APR_HOOK_FIRST); + ap_hook_handler(handle_map_file,NULL,NULL,APR_HOOK_MIDDLE); +} + +module AP_MODULE_DECLARE_DATA negotiation_module = +{ + STANDARD20_MODULE_STUFF, + create_neg_dir_config, /* dir config creator */ + merge_neg_dir_configs, /* dir merger --- default is to override */ + NULL, /* server config */ + NULL, /* merge server config */ + negotiation_cmds, /* command apr_table_t */ + register_hooks /* register hooks */ +}; diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/mod_negotiation.dsp b/rubbos/app/httpd-2.0.64/modules/mappers/mod_negotiation.dsp new file mode 100644 index 00000000..fea69f66 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/mappers/mod_negotiation.dsp @@ -0,0 +1,128 @@ +# Microsoft Developer Studio Project File - Name="mod_negotiation" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=mod_negotiation - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "mod_negotiation.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 "mod_negotiation.mak" CFG="mod_negotiation - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "mod_negotiation - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_negotiation - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "mod_negotiation - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_negotiation_src" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /out:"Release/mod_negotiation.so" /base:@..\..\os\win32\BaseAddr.ref,mod_negotiation.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Release/mod_negotiation.so" /base:@..\..\os\win32\BaseAddr.ref,mod_negotiation.so /opt:ref + +!ELSEIF "$(CFG)" == "mod_negotiation - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_negotiation_src" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_negotiation.so" /base:@..\..\os\win32\BaseAddr.ref,mod_negotiation.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_negotiation.so" /base:@..\..\os\win32\BaseAddr.ref,mod_negotiation.so + +!ENDIF + +# Begin Target + +# Name "mod_negotiation - Win32 Release" +# Name "mod_negotiation - Win32 Debug" +# Begin Source File + +SOURCE=.\mod_negotiation.c +# End Source File +# Begin Source File + +SOURCE=.\mod_negotiation.rc +# End Source File +# Begin Source File + +SOURCE=..\..\build\win32\win32ver.awk + +!IF "$(CFG)" == "mod_negotiation - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_negotiation.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_negotiation.so "negotiation_module for Apache" ../../include/ap_release.h > .\mod_negotiation.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "mod_negotiation - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_negotiation.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_negotiation.so "negotiation_module for Apache" ../../include/ap_release.h > .\mod_negotiation.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/mod_negotiation.exp b/rubbos/app/httpd-2.0.64/modules/mappers/mod_negotiation.exp new file mode 100644 index 00000000..a7c18da1 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/mappers/mod_negotiation.exp @@ -0,0 +1 @@ +negotiation_module diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/mod_negotiation.la b/rubbos/app/httpd-2.0.64/modules/mappers/mod_negotiation.la new file mode 100644 index 00000000..7b42e96c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/mappers/mod_negotiation.la @@ -0,0 +1,35 @@ +# mod_negotiation.la - a libtool library file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='' + +# Names of this library. +library_names='' + +# The name of the static archive. +old_library='mod_negotiation.a' + +# Libraries that this one depends upon. +dependency_libs=' -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib' + +# Version information for mod_negotiation. +current= +age= +revision= + +# Is this an already installed library? +installed=no + +# Should we warn about portability when linking against -modules? +shouldnotlink=yes + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='' diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/mod_negotiation.lo b/rubbos/app/httpd-2.0.64/modules/mappers/mod_negotiation.lo new file mode 100644 index 00000000..c2852784 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/mappers/mod_negotiation.lo @@ -0,0 +1,12 @@ +# mod_negotiation.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/mod_negotiation.o' + +# Name of the non-PIC object. +non_pic_object='mod_negotiation.o' + diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/mod_negotiation.o b/rubbos/app/httpd-2.0.64/modules/mappers/mod_negotiation.o new file mode 100644 index 0000000000000000000000000000000000000000..38f004265e10d17cfd43d8bd1e690129add2f6dd GIT binary patch literal 149648 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 +#endif +#if APR_HAVE_SYS_TYPES_H +#include +#endif + +#include "ap_config.h" +#include "httpd.h" +#include "http_config.h" +#include "http_request.h" +#include "http_core.h" +#include "http_log.h" +#include "http_protocol.h" +#include "mod_rewrite.h" + +/* mod_ssl.h is not safe for inclusion in 2.0, so duplicate the + * optional function declarations. */ +APR_DECLARE_OPTIONAL_FN(char *, ssl_var_lookup, + (apr_pool_t *, server_rec *, + conn_rec *, request_rec *, + char *)); +APR_DECLARE_OPTIONAL_FN(int, ssl_is_https, (conn_rec *)); + +#if !defined(OS2) && !defined(WIN32) && !defined(BEOS) && !defined(NETWARE) +#include "unixd.h" +#define MOD_REWRITE_SET_MUTEX_PERMS /* XXX Apache should define something */ +#endif + +/* +** +-------------------------------------------------------+ +** | | +** | static module configuration +** | | +** +-------------------------------------------------------+ +*/ + + +/* +** Our interface to the Apache server kernel: +** +** o Runtime logic of a request is as following: +** while(request or subrequest) +** foreach(stage #0...#9) +** foreach(module) (**) +** try to run hook +** +** o the order of modules at (**) is the inverted order as +** given in the "Configuration" file, i.e. the last module +** specified is the first one called for each hook! +** The core module is always the last! +** +** o there are two different types of result checking and +** continue processing: +** for hook #0,#1,#4,#5,#6,#8: +** hook run loop stops on first modules which gives +** back a result != DECLINED, i.e. it usually returns OK +** which says "OK, module has handled this _stage_" and for #1 +** this have not to mean "Ok, the filename is now valid". +** for hook #2,#3,#7,#9: +** all hooks are run, independend of result +** +** o at the last stage, the core module always +** - says "HTTP_BAD_REQUEST" if r->filename does not begin with "/" +** - prefix URL with document_root or replaced server_root +** with document_root and sets r->filename +** - always return a "OK" independed if the file really exists +** or not! +*/ + + /* the module (predeclaration) */ +module AP_MODULE_DECLARE_DATA rewrite_module; + + /* rewritemap int: handler function registry */ +static apr_hash_t *mapfunc_hash; + + /* the cache */ +static cache *cachep; + + /* whether proxy module is available or not */ +static int proxy_available; + +static const char *lockname; +static apr_global_mutex_t *rewrite_mapr_lock_acquire = NULL; +static apr_global_mutex_t *rewrite_log_lock = NULL; + +/* Optional functions imported from mod_ssl when loaded: */ +static APR_OPTIONAL_FN_TYPE(ssl_var_lookup) *rewrite_ssl_lookup = NULL; +static APR_OPTIONAL_FN_TYPE(ssl_is_https) *rewrite_is_https = NULL; + +/* +** +-------------------------------------------------------+ +** | | +** | configuration directive handling +** | | +** +-------------------------------------------------------+ +*/ + +/* +** +** per-server configuration structure handling +** +*/ + +static void *config_server_create(apr_pool_t *p, server_rec *s) +{ + rewrite_server_conf *a; + + a = (rewrite_server_conf *)apr_pcalloc(p, sizeof(rewrite_server_conf)); + + a->state = ENGINE_DISABLED; + a->options = OPTION_NONE; + a->rewritelogfile = NULL; + a->rewritelogfp = NULL; + a->rewriteloglevel = 0; + a->rewritemaps = apr_array_make(p, 2, sizeof(rewritemap_entry)); + a->rewriteconds = apr_array_make(p, 2, sizeof(rewritecond_entry)); + a->rewriterules = apr_array_make(p, 2, sizeof(rewriterule_entry)); + a->server = s; + a->redirect_limit = 0; /* unset (use default) */ + + return (void *)a; +} + +static void *config_server_merge(apr_pool_t *p, void *basev, void *overridesv) +{ + rewrite_server_conf *a, *base, *overrides; + + a = (rewrite_server_conf *)apr_pcalloc(p, + sizeof(rewrite_server_conf)); + base = (rewrite_server_conf *)basev; + overrides = (rewrite_server_conf *)overridesv; + + a->state = overrides->state; + a->options = overrides->options; + a->server = overrides->server; + a->redirect_limit = overrides->redirect_limit + ? overrides->redirect_limit + : base->redirect_limit; + + if (a->options & OPTION_INHERIT) { + /* + * local directives override + * and anything else is inherited + */ + a->rewriteloglevel = overrides->rewriteloglevel != 0 + ? overrides->rewriteloglevel + : base->rewriteloglevel; + a->rewritelogfile = overrides->rewritelogfile != NULL + ? overrides->rewritelogfile + : base->rewritelogfile; + a->rewritelogfp = overrides->rewritelogfp != NULL + ? overrides->rewritelogfp + : base->rewritelogfp; + a->rewritemaps = apr_array_append(p, overrides->rewritemaps, + base->rewritemaps); + a->rewriteconds = apr_array_append(p, overrides->rewriteconds, + base->rewriteconds); + a->rewriterules = apr_array_append(p, overrides->rewriterules, + base->rewriterules); + } + else { + /* + * local directives override + * and anything else gets defaults + */ + a->rewriteloglevel = overrides->rewriteloglevel; + a->rewritelogfile = overrides->rewritelogfile; + a->rewritelogfp = overrides->rewritelogfp; + a->rewritemaps = overrides->rewritemaps; + a->rewriteconds = overrides->rewriteconds; + a->rewriterules = overrides->rewriterules; + } + + return (void *)a; +} + + +/* +** +** per-directory configuration structure handling +** +*/ + +static void *config_perdir_create(apr_pool_t *p, char *path) +{ + rewrite_perdir_conf *a; + + a = (rewrite_perdir_conf *)apr_pcalloc(p, sizeof(rewrite_perdir_conf)); + + a->state = ENGINE_DISABLED; + a->options = OPTION_NONE; + a->baseurl = NULL; + a->rewriteconds = apr_array_make(p, 2, sizeof(rewritecond_entry)); + a->rewriterules = apr_array_make(p, 2, sizeof(rewriterule_entry)); + a->redirect_limit = 0; /* unset (use server config) */ + + if (path == NULL) { + a->directory = NULL; + } + else { + /* make sure it has a trailing slash */ + if (path[strlen(path)-1] == '/') { + a->directory = apr_pstrdup(p, path); + } + else { + a->directory = apr_pstrcat(p, path, "/", NULL); + } + } + + return (void *)a; +} + +static void *config_perdir_merge(apr_pool_t *p, void *basev, void *overridesv) +{ + rewrite_perdir_conf *a, *base, *overrides; + + a = (rewrite_perdir_conf *)apr_pcalloc(p, + sizeof(rewrite_perdir_conf)); + base = (rewrite_perdir_conf *)basev; + overrides = (rewrite_perdir_conf *)overridesv; + + a->state = overrides->state; + a->options = overrides->options; + a->directory = overrides->directory; + a->baseurl = overrides->baseurl; + a->redirect_limit = overrides->redirect_limit + ? overrides->redirect_limit + : base->redirect_limit; + + if (a->options & OPTION_INHERIT) { + a->rewriteconds = apr_array_append(p, overrides->rewriteconds, + base->rewriteconds); + a->rewriterules = apr_array_append(p, overrides->rewriterules, + base->rewriterules); + } + else { + a->rewriteconds = overrides->rewriteconds; + a->rewriterules = overrides->rewriterules; + } + + return (void *)a; +} + + +/* +** +** the configuration commands +** +*/ + +static const char *cmd_rewriteengine(cmd_parms *cmd, + void *in_dconf, int flag) +{ + rewrite_perdir_conf *dconf = in_dconf; + rewrite_server_conf *sconf; + + sconf = ap_get_module_config(cmd->server->module_config, &rewrite_module); + + if (cmd->path == NULL) { /* is server command */ + sconf->state = (flag ? ENGINE_ENABLED : ENGINE_DISABLED); + } + else /* is per-directory command */ { + dconf->state = (flag ? ENGINE_ENABLED : ENGINE_DISABLED); + } + + return NULL; +} + +static const char *cmd_rewriteoptions(cmd_parms *cmd, + void *in_dconf, const char *option) +{ + int options = 0, limit = 0; + char *w; + + while (*option) { + w = ap_getword_conf(cmd->pool, &option); + + if (!strcasecmp(w, "inherit")) { + options |= OPTION_INHERIT; + } + else if (!strncasecmp(w, "MaxRedirects=", 13)) { + limit = atoi(&w[13]); + if (limit <= 0) { + return "RewriteOptions: MaxRedirects takes a number greater " + "than zero."; + } + } + else if (!strcasecmp(w, "MaxRedirects")) { /* be nice */ + return "RewriteOptions: MaxRedirects has the format MaxRedirects" + "=n."; + } + else { + return apr_pstrcat(cmd->pool, "RewriteOptions: unknown option '", + w, "'", NULL); + } + } + + /* put it into the appropriate config */ + if (cmd->path == NULL) { /* is server command */ + rewrite_server_conf *conf = + ap_get_module_config(cmd->server->module_config, + &rewrite_module); + + conf->options |= options; + conf->redirect_limit = limit; + } + else { /* is per-directory command */ + rewrite_perdir_conf *conf = in_dconf; + + conf->options |= options; + conf->redirect_limit = limit; + } + + return NULL; +} + +static const char *cmd_rewritelog(cmd_parms *cmd, void *dconf, const char *a1) +{ + rewrite_server_conf *sconf; + + sconf = ap_get_module_config(cmd->server->module_config, &rewrite_module); + + sconf->rewritelogfile = a1; + + return NULL; +} + +static const char *cmd_rewriteloglevel(cmd_parms *cmd, void *dconf, + const char *a1) +{ + rewrite_server_conf *sconf; + + sconf = ap_get_module_config(cmd->server->module_config, &rewrite_module); + + sconf->rewriteloglevel = atoi(a1); + + return NULL; +} + +static const char *cmd_rewritemap(cmd_parms *cmd, void *dconf, const char *a1, + const char *a2) +{ + rewrite_server_conf *sconf; + rewritemap_entry *newmap; + apr_finfo_t st; + + sconf = ap_get_module_config(cmd->server->module_config, &rewrite_module); + + newmap = apr_array_push(sconf->rewritemaps); + + newmap->name = a1; + newmap->func = NULL; + if (strncmp(a2, "txt:", 4) == 0) { + newmap->type = MAPTYPE_TXT; + newmap->datafile = a2+4; + newmap->checkfile = a2+4; + newmap->cachename = apr_psprintf(cmd->pool, "%pp:%s", + (void *)cmd->server, a1); + } + else if (strncmp(a2, "rnd:", 4) == 0) { + newmap->type = MAPTYPE_RND; + newmap->datafile = a2+4; + newmap->checkfile = a2+4; + newmap->cachename = apr_psprintf(cmd->pool, "%pp:%s", + (void *)cmd->server, a1); + } + else if (strncmp(a2, "dbm", 3) == 0) { + const char *ignored_fname; + int bad = 0; + apr_status_t rv; + + newmap->type = MAPTYPE_DBM; + newmap->cachename = apr_psprintf(cmd->pool, "%pp:%s", + (void *)cmd->server, a1); + + if (a2[3] == ':') { + newmap->dbmtype = "default"; + newmap->datafile = a2+4; + } + else if (a2[3] == '=') { + const char *colon = ap_strchr_c(a2 + 4, ':'); + + if (colon) { + newmap->dbmtype = apr_pstrndup(cmd->pool, a2 + 4, + colon - (a2 + 3) - 1); + newmap->datafile = colon + 1; + } + else { + ++bad; + } + } + else { + ++bad; + } + + if (bad) { + return apr_pstrcat(cmd->pool, "RewriteMap: bad map:", + a2, NULL); + } + + rv = apr_dbm_get_usednames_ex(cmd->pool, newmap->dbmtype, + newmap->datafile, &newmap->checkfile, + &ignored_fname); + if (rv != APR_SUCCESS) { + return apr_pstrcat(cmd->pool, "RewriteMap: dbm type ", + newmap->dbmtype, " is invalid", NULL); + } + } + else if (strncmp(a2, "prg:", 4) == 0) { + newmap->type = MAPTYPE_PRG; + apr_tokenize_to_argv(a2 + 4, &newmap->argv, cmd->pool); + newmap->datafile = NULL; + newmap->checkfile = newmap->argv[0]; + newmap->cachename = NULL; + + } + else if (strncmp(a2, "int:", 4) == 0) { + newmap->type = MAPTYPE_INT; + newmap->datafile = NULL; + newmap->checkfile = NULL; + newmap->cachename = NULL; + newmap->func = (char *(*)(request_rec *,char *)) + apr_hash_get(mapfunc_hash, a2+4, strlen(a2+4)); + if ((sconf->state == ENGINE_ENABLED) && (newmap->func == NULL)) { + return apr_pstrcat(cmd->pool, "RewriteMap: internal map not found:", + a2+4, NULL); + } + } + else { + newmap->type = MAPTYPE_TXT; + newmap->datafile = a2; + newmap->checkfile = a2; + newmap->cachename = apr_psprintf(cmd->pool, "%pp:%s", + (void *)cmd->server, a1); + } + newmap->fpin = NULL; + newmap->fpout = NULL; + + if (newmap->checkfile && (sconf->state == ENGINE_ENABLED) + && (apr_stat(&st, newmap->checkfile, APR_FINFO_MIN, + cmd->pool) != APR_SUCCESS)) { + return apr_pstrcat(cmd->pool, + "RewriteMap: file for map ", newmap->name, + " not found:", newmap->checkfile, NULL); + } + + return NULL; +} + +static const char *cmd_rewritelock(cmd_parms *cmd, void *dconf, const char *a1) +{ + const char *error; + + if ((error = ap_check_cmd_context(cmd, GLOBAL_ONLY)) != NULL) + return error; + + /* fixup the path, especially for rewritelock_remove() */ + lockname = ap_server_root_relative(cmd->pool, a1); + + if (!lockname) { + return apr_pstrcat(cmd->pool, "Invalid RewriteLock path ", a1); + } + + return NULL; +} + +static const char *cmd_rewritebase(cmd_parms *cmd, void *in_dconf, + const char *a1) +{ + rewrite_perdir_conf *dconf = in_dconf; + + if (cmd->path == NULL || dconf == NULL) { + return "RewriteBase: only valid in per-directory config files"; + } + if (a1[0] == '\0') { + return "RewriteBase: empty URL not allowed"; + } + if (a1[0] != '/') { + return "RewriteBase: argument is not a valid URL"; + } + + dconf->baseurl = a1; + + return NULL; +} + +static const char *cmd_rewritecond(cmd_parms *cmd, void *in_dconf, + const char *in_str) +{ + rewrite_perdir_conf *dconf = in_dconf; + char *str = apr_pstrdup(cmd->pool, in_str); + rewrite_server_conf *sconf; + rewritecond_entry *newcond; + regex_t *regexp; + char *a1; + char *a2; + char *a3; + char *cp; + const char *err; + int rc; + + sconf = ap_get_module_config(cmd->server->module_config, &rewrite_module); + + /* make a new entry in the internal temporary rewrite rule list */ + if (cmd->path == NULL) { /* is server command */ + newcond = apr_array_push(sconf->rewriteconds); + } + else { /* is per-directory command */ + newcond = apr_array_push(dconf->rewriteconds); + } + + /* parse the argument line ourself */ + if (parseargline(str, &a1, &a2, &a3)) { + return apr_pstrcat(cmd->pool, "RewriteCond: bad argument line '", str, + "'", NULL); + } + + /* arg1: the input string */ + newcond->input = apr_pstrdup(cmd->pool, a1); + + /* arg3: optional flags field + (this have to be first parsed, because we need to + know if the regex should be compiled with ICASE!) */ + newcond->flags = CONDFLAG_NONE; + if (a3 != NULL) { + if ((err = cmd_rewritecond_parseflagfield(cmd->pool, newcond, + a3)) != NULL) { + return err; + } + } + + /* arg2: the pattern + try to compile the regexp to test if is ok */ + cp = a2; + if (cp[0] == '!') { + newcond->flags |= CONDFLAG_NOTMATCH; + cp++; + } + + /* now be careful: Under the POSIX regex library + we can compile the pattern for case insensitive matching, + under the old V8 library we have to do it self via a hack */ + if (newcond->flags & CONDFLAG_NOCASE) { + rc = ((regexp = ap_pregcomp(cmd->pool, cp, REG_EXTENDED|REG_ICASE)) + == NULL); + } + else { + rc = ((regexp = ap_pregcomp(cmd->pool, cp, REG_EXTENDED)) == NULL); + } + if (rc) { + return apr_pstrcat(cmd->pool, + "RewriteCond: cannot compile regular expression '", + a2, "'", NULL); + } + + newcond->pattern = apr_pstrdup(cmd->pool, cp); + newcond->regexp = regexp; + + return NULL; +} + +static const char *cmd_rewritecond_parseflagfield(apr_pool_t *p, + rewritecond_entry *cfg, + char *str) +{ + char *cp; + char *cp1; + char *cp2; + char *cp3; + char *key; + char *val; + const char *err; + + if (str[0] != '[' || str[strlen(str)-1] != ']') { + return "RewriteCond: bad flag delimiters"; + } + + cp = str+1; + str[strlen(str)-1] = ','; /* for simpler parsing */ + for ( ; *cp != '\0'; ) { + /* skip whitespaces */ + for ( ; (*cp == ' ' || *cp == '\t') && *cp != '\0'; cp++) + ; + if (*cp == '\0') { + break; + } + cp1 = cp; + if ((cp2 = strchr(cp, ',')) != NULL) { + cp = cp2+1; + for ( ; (*(cp2-1) == ' ' || *(cp2-1) == '\t'); cp2--) + ; + *cp2 = '\0'; + if ((cp3 = strchr(cp1, '=')) != NULL) { + *cp3 = '\0'; + key = cp1; + val = cp3+1; + } + else { + key = cp1; + val = ""; + } + if ((err = cmd_rewritecond_setflag(p, cfg, key, val)) != NULL) { + return err; + } + } + else { + break; + } + } + + return NULL; +} + +static const char *cmd_rewritecond_setflag(apr_pool_t *p, + rewritecond_entry *cfg, + char *key, char *val) +{ + if ( strcasecmp(key, "nocase") == 0 + || strcasecmp(key, "NC") == 0 ) { + cfg->flags |= CONDFLAG_NOCASE; + } + else if ( strcasecmp(key, "ornext") == 0 + || strcasecmp(key, "OR") == 0 ) { + cfg->flags |= CONDFLAG_ORNEXT; + } + else { + return apr_pstrcat(p, "RewriteCond: unknown flag '", key, "'", NULL); + } + return NULL; +} + +static const char *cmd_rewriterule(cmd_parms *cmd, void *in_dconf, + const char *in_str) +{ + rewrite_perdir_conf *dconf = in_dconf; + char *str = apr_pstrdup(cmd->pool, in_str); + rewrite_server_conf *sconf; + rewriterule_entry *newrule; + regex_t *regexp; + char *a1; + char *a2; + char *a3; + char *cp; + const char *err; + int mode; + + sconf = ap_get_module_config(cmd->server->module_config, &rewrite_module); + + /* make a new entry in the internal rewrite rule list */ + if (cmd->path == NULL) { /* is server command */ + newrule = apr_array_push(sconf->rewriterules); + } + else { /* is per-directory command */ + newrule = apr_array_push(dconf->rewriterules); + } + + /* parse the argument line ourself */ + if (parseargline(str, &a1, &a2, &a3)) { + return apr_pstrcat(cmd->pool, "RewriteRule: bad argument line '", str, + "'", NULL); + } + + /* arg3: optional flags field */ + newrule->forced_mimetype = NULL; + newrule->forced_responsecode = HTTP_MOVED_TEMPORARILY; + newrule->flags = RULEFLAG_NONE; + newrule->env[0] = NULL; + newrule->cookie[0] = NULL; + newrule->skip = 0; + if (a3 != NULL) { + if ((err = cmd_rewriterule_parseflagfield(cmd->pool, newrule, + a3)) != NULL) { + return err; + } + } + + /* arg1: the pattern + * try to compile the regexp to test if is ok + */ + cp = a1; + if (cp[0] == '!') { + newrule->flags |= RULEFLAG_NOTMATCH; + cp++; + } + mode = REG_EXTENDED; + if (newrule->flags & RULEFLAG_NOCASE) { + mode |= REG_ICASE; + } + if ((regexp = ap_pregcomp(cmd->pool, cp, mode)) == NULL) { + return apr_pstrcat(cmd->pool, + "RewriteRule: cannot compile regular expression '", + a1, "'", NULL); + } + newrule->pattern = apr_pstrdup(cmd->pool, cp); + newrule->regexp = regexp; + + /* arg2: the output string + * replace the $ by \ which is needed by the currently + * used Regular Expression library + * + * TODO: Is this still required for PCRE? If not, does it *work* with PCRE? + */ + newrule->output = apr_pstrdup(cmd->pool, a2); + + /* now, if the server or per-dir config holds an + * array of RewriteCond entries, we take it for us + * and clear the array + */ + if (cmd->path == NULL) { /* is server command */ + newrule->rewriteconds = sconf->rewriteconds; + sconf->rewriteconds = apr_array_make(cmd->pool, 2, + sizeof(rewritecond_entry)); + } + else { /* is per-directory command */ + newrule->rewriteconds = dconf->rewriteconds; + dconf->rewriteconds = apr_array_make(cmd->pool, 2, + sizeof(rewritecond_entry)); + } + + return NULL; +} + +static const char *cmd_rewriterule_parseflagfield(apr_pool_t *p, + rewriterule_entry *cfg, + char *str) +{ + char *cp; + char *cp1; + char *cp2; + char *cp3; + char *key; + char *val; + const char *err; + + if (str[0] != '[' || str[strlen(str)-1] != ']') { + return "RewriteRule: bad flag delimiters"; + } + + cp = str+1; + str[strlen(str)-1] = ','; /* for simpler parsing */ + for ( ; *cp != '\0'; ) { + /* skip whitespaces */ + for ( ; (*cp == ' ' || *cp == '\t') && *cp != '\0'; cp++) + ; + if (*cp == '\0') { + break; + } + cp1 = cp; + if ((cp2 = strchr(cp, ',')) != NULL) { + cp = cp2+1; + for ( ; (*(cp2-1) == ' ' || *(cp2-1) == '\t'); cp2--) + ; + *cp2 = '\0'; + if ((cp3 = strchr(cp1, '=')) != NULL) { + *cp3 = '\0'; + key = cp1; + val = cp3+1; + } + else { + key = cp1; + val = ""; + } + if ((err = cmd_rewriterule_setflag(p, cfg, key, val)) != NULL) { + return err; + } + } + else { + break; + } + } + + return NULL; +} + +static const char *cmd_rewriterule_setflag(apr_pool_t *p, + rewriterule_entry *cfg, + char *key, char *val) +{ + int status = 0; + int i; + + if ( strcasecmp(key, "redirect") == 0 + || strcasecmp(key, "R") == 0 ) { + cfg->flags |= RULEFLAG_FORCEREDIRECT; + if (strlen(val) > 0) { + if (strcasecmp(val, "permanent") == 0) { + status = HTTP_MOVED_PERMANENTLY; + } + else if (strcasecmp(val, "temp") == 0) { + status = HTTP_MOVED_TEMPORARILY; + } + else if (strcasecmp(val, "seeother") == 0) { + status = HTTP_SEE_OTHER; + } + else if (apr_isdigit(*val)) { + status = atoi(val); + } + if (!ap_is_HTTP_REDIRECT(status)) { + return "RewriteRule: invalid HTTP response code " + "for flag 'R'"; + } + cfg->forced_responsecode = status; + } + } + else if ( strcasecmp(key, "noescape") == 0 + || strcasecmp(key, "NE") == 0 ) { + cfg->flags |= RULEFLAG_NOESCAPE; + } + else if ( strcasecmp(key, "last") == 0 + || strcasecmp(key, "L") == 0 ) { + cfg->flags |= RULEFLAG_LASTRULE; + } + else if ( strcasecmp(key, "next") == 0 + || strcasecmp(key, "N") == 0 ) { + cfg->flags |= RULEFLAG_NEWROUND; + } + else if ( strcasecmp(key, "chain") == 0 + || strcasecmp(key, "C") == 0 ) { + cfg->flags |= RULEFLAG_CHAIN; + } + else if ( strcasecmp(key, "type") == 0 + || strcasecmp(key, "T") == 0 ) { + cfg->forced_mimetype = apr_pstrdup(p, val); + ap_str_tolower(cfg->forced_mimetype); + } + else if ( strcasecmp(key, "env") == 0 + || strcasecmp(key, "E") == 0 ) { + for (i = 0; (cfg->env[i] != NULL) && (i < MAX_ENV_FLAGS); i++) + ; + if (i < MAX_ENV_FLAGS) { + cfg->env[i] = apr_pstrdup(p, val); + cfg->env[i+1] = NULL; + } + else { + return "RewriteRule: too many environment flags 'E'"; + } + } + else if ( strcasecmp(key, "cookie") == 0 || strcasecmp(key, "CO") == 0) { + for (i = 0; (cfg->cookie[i] != NULL) && (i < MAX_COOKIE_FLAGS); i++) + ; + if (i < MAX_COOKIE_FLAGS) { + cfg->cookie[i] = apr_pstrdup(p, val); + cfg->cookie[i+1] = NULL; + } + else { + return "RewriteRule: too many cookie flags 'CO'"; + } + } + else if ( strcasecmp(key, "nosubreq") == 0 + || strcasecmp(key, "NS") == 0 ) { + cfg->flags |= RULEFLAG_IGNOREONSUBREQ; + } + else if ( strcasecmp(key, "proxy") == 0 + || strcasecmp(key, "P") == 0 ) { + cfg->flags |= RULEFLAG_PROXY; + } + else if ( strcasecmp(key, "passthrough") == 0 + || strcasecmp(key, "PT") == 0 ) { + cfg->flags |= RULEFLAG_PASSTHROUGH; + } + else if ( strcasecmp(key, "skip") == 0 + || strcasecmp(key, "S") == 0 ) { + cfg->skip = atoi(val); + } + else if ( strcasecmp(key, "forbidden") == 0 + || strcasecmp(key, "F") == 0 ) { + cfg->flags |= RULEFLAG_FORBIDDEN; + } + else if ( strcasecmp(key, "gone") == 0 + || strcasecmp(key, "G") == 0 ) { + cfg->flags |= RULEFLAG_GONE; + } + else if ( strcasecmp(key, "qsappend") == 0 + || strcasecmp(key, "QSA") == 0 ) { + cfg->flags |= RULEFLAG_QSAPPEND; + } + else if ( strcasecmp(key, "nocase") == 0 + || strcasecmp(key, "NC") == 0 ) { + cfg->flags |= RULEFLAG_NOCASE; + } + else { + return apr_pstrcat(p, "RewriteRule: unknown flag '", key, "'", NULL); + } + return NULL; +} + + +/* +** +** Global Module Initialization +** +*/ + +static int pre_config(apr_pool_t *pconf, + apr_pool_t *plog, + apr_pool_t *ptemp) +{ + APR_OPTIONAL_FN_TYPE(ap_register_rewrite_mapfunc) *map_pfn_register; + + /* register int: rewritemap handlers */ + mapfunc_hash = apr_hash_make(pconf); + map_pfn_register = APR_RETRIEVE_OPTIONAL_FN(ap_register_rewrite_mapfunc); + if (map_pfn_register) { + map_pfn_register("tolower", rewrite_mapfunc_tolower); + map_pfn_register("toupper", rewrite_mapfunc_toupper); + map_pfn_register("escape", rewrite_mapfunc_escape); + map_pfn_register("unescape", rewrite_mapfunc_unescape); + } + return OK; +} + +static int post_config(apr_pool_t *p, + apr_pool_t *plog, + apr_pool_t *ptemp, + server_rec *s) +{ + apr_status_t rv; + void *data; + int first_time = 0; + const char *userdata_key = "rewrite_init_module"; + + apr_pool_userdata_get(&data, userdata_key, s->process->pool); + if (!data) { + first_time = 1; + apr_pool_userdata_set((const void *)1, userdata_key, + apr_pool_cleanup_null, s->process->pool); + } + + /* check if proxy module is available */ + proxy_available = (ap_find_linked_module("mod_proxy.c") != NULL); + + /* create the rewriting lockfiles in the parent */ + if ((rv = apr_global_mutex_create(&rewrite_log_lock, NULL, + APR_LOCK_DEFAULT, p)) != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_CRIT, rv, s, + "mod_rewrite: could not create rewrite_log_lock"); + return HTTP_INTERNAL_SERVER_ERROR; + } + +#ifdef MOD_REWRITE_SET_MUTEX_PERMS + rv = unixd_set_global_mutex_perms(rewrite_log_lock); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_CRIT, rv, s, + "mod_rewrite: Could not set permissions on " + "rewrite_log_lock; check User and Group directives"); + return HTTP_INTERNAL_SERVER_ERROR; + } +#endif + + rv = rewritelock_create(s, p); + if (rv != APR_SUCCESS) { + return HTTP_INTERNAL_SERVER_ERROR; + } + + apr_pool_cleanup_register(p, (void *)s, rewritelock_remove, + apr_pool_cleanup_null); + + /* step through the servers and + * - open each rewriting logfile + * - open the RewriteMap prg:xxx programs + */ + for (; s; s = s->next) { + if (!open_rewritelog(s, p)) { + return HTTP_INTERNAL_SERVER_ERROR; + } + + if (!first_time) { + if (run_rewritemap_programs(s, p) != APR_SUCCESS) { + return HTTP_INTERNAL_SERVER_ERROR; + } + } + } + + rewrite_ssl_lookup = APR_RETRIEVE_OPTIONAL_FN(ssl_var_lookup); + rewrite_is_https = APR_RETRIEVE_OPTIONAL_FN(ssl_is_https); + + return OK; +} + + +/* +** +** Per-Child Module Initialization +** [called after a child process is spawned] +** +*/ + +static void init_child(apr_pool_t *p, server_rec *s) +{ + apr_status_t rv; + + if (lockname != NULL && *(lockname) != '\0') { + rv = apr_global_mutex_child_init(&rewrite_mapr_lock_acquire, + lockname, p); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_CRIT, rv, s, + "mod_rewrite: could not init rewrite_mapr_lock_acquire" + " in child"); + } + } + + rv = apr_global_mutex_child_init(&rewrite_log_lock, NULL, p); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_CRIT, rv, s, + "mod_rewrite: could not init rewrite log lock in child"); + } + + /* create the lookup cache */ + cachep = init_cache(p); +} + + +/* +** +-------------------------------------------------------+ +** | | +** | runtime hooks +** | | +** +-------------------------------------------------------+ +*/ + +/* +** +** URI-to-filename hook +** +** [used for the rewriting engine triggered by +** the per-server 'RewriteRule' directives] +** +*/ + +static int hook_uri2file(request_rec *r) +{ + rewrite_server_conf *conf; + const char *saved_rulestatus; + const char *var; + const char *thisserver; + char *thisport; + const char *thisurl; + char buf[512]; + char docroot[512]; + const char *ccp; + unsigned int port; + int rulestatus; + int n; + int l; + + /* + * retrieve the config structures + */ + conf = ap_get_module_config(r->server->module_config, &rewrite_module); + + /* + * only do something under runtime if the engine is really enabled, + * else return immediately! + */ + if (conf->state == ENGINE_DISABLED) { + return DECLINED; + } + + /* + * check for the ugly API case of a virtual host section where no + * mod_rewrite directives exists. In this situation we became no chance + * by the API to setup our default per-server config so we have to + * on-the-fly assume we have the default config. But because the default + * config has a disabled rewriting engine we are lucky because can + * just stop operating now. + */ + if (conf->server != r->server) { + return DECLINED; + } + + /* + * add the SCRIPT_URL variable to the env. this is a bit complicated + * due to the fact that apache uses subrequests and internal redirects + */ + + if (r->main == NULL) { + var = apr_pstrcat(r->pool, "REDIRECT_", ENVVAR_SCRIPT_URL, NULL); + var = apr_table_get(r->subprocess_env, var); + if (var == NULL) { + apr_table_setn(r->subprocess_env, ENVVAR_SCRIPT_URL, r->uri); + } + else { + apr_table_setn(r->subprocess_env, ENVVAR_SCRIPT_URL, var); + } + } + else { + var = apr_table_get(r->main->subprocess_env, ENVVAR_SCRIPT_URL); + apr_table_setn(r->subprocess_env, ENVVAR_SCRIPT_URL, var); + } + + /* + * create the SCRIPT_URI variable for the env + */ + + /* add the canonical URI of this URL */ + thisserver = ap_get_server_name(r); + port = ap_get_server_port(r); + if (ap_is_default_port(port, r)) { + thisport = ""; + } + else { + apr_snprintf(buf, sizeof(buf), ":%u", port); + thisport = buf; + } + thisurl = apr_table_get(r->subprocess_env, ENVVAR_SCRIPT_URL); + + /* set the variable */ + var = apr_pstrcat(r->pool, ap_http_method(r), "://", thisserver, thisport, + thisurl, NULL); + apr_table_setn(r->subprocess_env, ENVVAR_SCRIPT_URI, var); + + if (!(saved_rulestatus = apr_table_get(r->notes,"mod_rewrite_rewritten"))) { + /* if filename was not initially set, + * we start with the requested URI + */ + if (r->filename == NULL) { + r->filename = apr_pstrdup(r->pool, r->uri); + rewritelog(r, 2, "init rewrite engine with requested uri %s", + r->filename); + } + else { + rewritelog(r, 2, "init rewrite engine with passed filename %s." + " Original uri = %s", r->filename, r->uri); + } + + /* + * now apply the rules ... + */ + rulestatus = apply_rewrite_list(r, conf->rewriterules, NULL); + apr_table_set(r->notes,"mod_rewrite_rewritten", + apr_psprintf(r->pool,"%d",rulestatus)); + } + else { + rewritelog(r, 2, + "uri already rewritten. Status %s, Uri %s, r->filename %s", + saved_rulestatus, r->uri, r->filename); + rulestatus = atoi(saved_rulestatus); + } + + if (rulestatus) { + unsigned skip; + + if (strlen(r->filename) > 6 && + strncmp(r->filename, "proxy:", 6) == 0) { + /* it should be go on as an internal proxy request */ + + /* check if the proxy module is enabled, so + * we can actually use it! + */ + if (!proxy_available) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "attempt to make remote request from mod_rewrite " + "without proxy enabled: %s", r->filename); + return HTTP_FORBIDDEN; + } + + /* make sure the QUERY_STRING and + * PATH_INFO parts get incorporated + */ + if (r->path_info != NULL) { + r->filename = apr_pstrcat(r->pool, r->filename, + r->path_info, NULL); + } + if (r->args != NULL && + r->uri == r->unparsed_uri) { + /* see proxy_http:proxy_http_canon() */ + r->filename = apr_pstrcat(r->pool, r->filename, + "?", r->args, NULL); + } + + /* now make sure the request gets handled by the proxy handler */ + if (PROXYREQ_NONE == r->proxyreq) { + r->proxyreq = PROXYREQ_REVERSE; + } + r->handler = "proxy-server"; + + rewritelog(r, 1, "go-ahead with proxy request %s [OK]", + r->filename); + return OK; + } + else if ((skip = is_absolute_uri(r->filename)) > 0) { + /* it was finally rewritten to a remote URL */ + + if (rulestatus != ACTION_NOESCAPE) { + rewritelog(r, 1, "escaping %s for redirect", r->filename); + r->filename = escape_absolute_uri(r->pool, r->filename, skip); + } + + /* append the QUERY_STRING part */ + if (r->args) { + r->filename = apr_pstrcat(r->pool, r->filename, "?", + (rulestatus == ACTION_NOESCAPE) + ? r->args + : ap_escape_uri(r->pool, r->args), + NULL); + } + + /* determine HTTP redirect response code */ + if (ap_is_HTTP_REDIRECT(r->status)) { + n = r->status; + r->status = HTTP_OK; /* make Apache kernel happy */ + } + else { + n = HTTP_MOVED_TEMPORARILY; + } + + /* now do the redirection */ + apr_table_setn(r->headers_out, "Location", r->filename); + rewritelog(r, 1, "redirect to %s [REDIRECT/%d]", r->filename, n); + return n; + } + else if (strlen(r->filename) > 10 && + strncmp(r->filename, "forbidden:", 10) == 0) { + /* This URLs is forced to be forbidden for the requester */ + return HTTP_FORBIDDEN; + } + else if (strlen(r->filename) > 5 && + strncmp(r->filename, "gone:", 5) == 0) { + /* This URLs is forced to be gone */ + return HTTP_GONE; + } + else if (strlen(r->filename) > 12 && + strncmp(r->filename, "passthrough:", 12) == 0) { + /* + * Hack because of underpowered API: passing the current + * rewritten filename through to other URL-to-filename handlers + * just as it were the requested URL. This is to enable + * post-processing by mod_alias, etc. which always act on + * r->uri! The difference here is: We do not try to + * add the document root + */ + r->uri = apr_pstrdup(r->pool, r->filename+12); + return DECLINED; + } + else { + /* it was finally rewritten to a local path */ + + /* expand "/~user" prefix */ +#if APR_HAS_USER + r->filename = expand_tildepaths(r, r->filename); +#endif + rewritelog(r, 2, "local path result: %s", r->filename); + + /* the filename must be either an absolute local path or an + * absolute local URL. + */ + if ( *r->filename != '/' + && !ap_os_is_path_absolute(r->pool, r->filename)) { + return HTTP_BAD_REQUEST; + } + + /* if there is no valid prefix, we have + * to emulate the translator from the core and + * prefix the filename with document_root + * + * NOTICE: + * We cannot leave out the prefix_stat because + * - when we always prefix with document_root + * then no absolute path can be created, e.g. via + * emulating a ScriptAlias directive, etc. + * - when we always NOT prefix with document_root + * then the files under document_root have to + * be references directly and document_root + * gets never used and will be a dummy parameter - + * this is also bad + * + * BUT: + * Under real Unix systems this is no problem, + * because we only do stat() on the first directory + * and this gets cached by the kernel for along time! + */ + n = prefix_stat(r->filename, r->pool); + if (n == 0) { + if ((ccp = ap_document_root(r)) != NULL) { + l = apr_cpystrn(docroot, ccp, sizeof(docroot)) - docroot; + + /* always NOT have a trailing slash */ + if (docroot[l-1] == '/') { + docroot[l-1] = '\0'; + } + if (r->server->path + && !strncmp(r->filename, r->server->path, + r->server->pathlen)) { + r->filename = apr_pstrcat(r->pool, docroot, + (r->filename + + r->server->pathlen), NULL); + } + else { + r->filename = apr_pstrcat(r->pool, docroot, + r->filename, NULL); + } + rewritelog(r, 2, "prefixed with document_root to %s", + r->filename); + } + } + + rewritelog(r, 1, "go-ahead with %s [OK]", r->filename); + return OK; + } + } + else { + rewritelog(r, 1, "pass through %s", r->filename); + return DECLINED; + } +} + + +/* +** +** MIME-type hook +** +** [used to support the forced-MIME-type feature] +** +*/ + +static int hook_mimetype(request_rec *r) +{ + const char *t; + + /* now check if we have to force a MIME-type */ + t = apr_table_get(r->notes, REWRITE_FORCED_MIMETYPE_NOTEVAR); + if (t == NULL) { + return DECLINED; + } + else { + rewritelog(r, 1, "force filename %s to have MIME-type '%s'", + r->filename, t); + ap_set_content_type(r, t); + return OK; + } +} + + +/* +** +** Fixup hook +** +** [used for the rewriting engine triggered by +** the per-directory 'RewriteRule' directives] +** +*/ + +static int hook_fixup(request_rec *r) +{ + rewrite_perdir_conf *dconf; + char *cp; + char *cp2; + const char *ccp; + char *prefix; + apr_size_t l; + int rulestatus; + int n; + char *ofilename; + int is_proxyreq; + + dconf = (rewrite_perdir_conf *)ap_get_module_config(r->per_dir_config, + &rewrite_module); + + /* if there is no per-dir config we return immediately */ + if (dconf == NULL) { + return DECLINED; + } + + /* we shouldn't do anything in subrequests */ + if (r->main != NULL) { + return DECLINED; + } + + /* if there are no real (i.e. no RewriteRule directives!) + per-dir config of us, we return also immediately */ + if (dconf->directory == NULL) { + return DECLINED; + } + + /* + * Proxy request? + */ + is_proxyreq = ( r->proxyreq && r->filename + && !strncmp(r->filename, "proxy:", 6)); + + /* + * .htaccess file is called before really entering the directory, i.e.: + * URL: http://localhost/foo and .htaccess is located in foo directory + * Ignore such attempts, since they may lead to undefined behaviour. + */ + if (is_proxyreq) { + l = strlen(dconf->directory) - 1; + if (r->filename && strlen(r->filename) == l && + (dconf->directory)[l] == '/' && + !strncmp(r->filename, dconf->directory, l)) { + return DECLINED; + } + } + + /* + * only do something under runtime if the engine is really enabled, + * for this directory, else return immediately! + */ + if (dconf->state == ENGINE_DISABLED) { + return DECLINED; + } + + /* + * Do the Options check after engine check, so + * the user is able to explicitely turn RewriteEngine Off. + */ + if (!(ap_allow_options(r) & (OPT_SYM_LINKS | OPT_SYM_OWNER))) { + /* FollowSymLinks is mandatory! */ + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Options FollowSymLinks or SymLinksIfOwnerMatch is off " + "which implies that RewriteRule directive is forbidden: " + "%s", r->filename); + return HTTP_FORBIDDEN; + } + + /* + * remember the current filename before rewriting for later check + * to prevent deadlooping because of internal redirects + * on final URL/filename which can be equal to the inital one. + * also, we'll restore original r->filename if we decline this + * request + */ + ofilename = r->filename; + + if (r->filename == NULL) { + r->filename = apr_pstrdup(r->pool, r->uri); + rewritelog(r, 2, "init rewrite engine with requested uri %s", + r->filename); + } + + /* + * now apply the rules ... + */ + rulestatus = apply_rewrite_list(r, dconf->rewriterules, dconf->directory); + if (rulestatus) { + unsigned skip; + + if (strlen(r->filename) > 6 && + strncmp(r->filename, "proxy:", 6) == 0) { + /* it should go on as an internal proxy request */ + + /* make sure the QUERY_STRING and + * PATH_INFO parts get incorporated + * (r->path_info was already appended by the + * rewriting engine because of the per-dir context!) + */ + if (r->args != NULL) { + r->filename = apr_pstrcat(r->pool, r->filename, + "?", r->args, NULL); + } + + /* now make sure the request gets handled by the proxy handler */ + if (PROXYREQ_NONE == r->proxyreq) { + r->proxyreq = PROXYREQ_REVERSE; + } + r->handler = "proxy-server"; + + rewritelog(r, 1, "[per-dir %s] go-ahead with proxy request " + "%s [OK]", dconf->directory, r->filename); + return OK; + } + else if ((skip = is_absolute_uri(r->filename)) > 0) { + /* it was finally rewritten to a remote URL */ + + /* because we are in a per-dir context + * first try to replace the directory with its base-URL + * if there is a base-URL available + */ + if (dconf->baseurl != NULL) { + /* skip 'scheme://' */ + cp = r->filename + skip; + + if ((cp = ap_strchr(cp, '/')) != NULL && *(++cp)) { + rewritelog(r, 2, + "[per-dir %s] trying to replace " + "prefix %s with %s", + dconf->directory, dconf->directory, + dconf->baseurl); + + /* I think, that hack needs an explanation: + * well, here is it: + * mod_rewrite was written for unix systems, were + * absolute file-system paths start with a slash. + * URL-paths _also_ start with slashes, so they + * can be easily compared with system paths. + * + * the following assumes, that the actual url-path + * may be prefixed by the current directory path and + * tries to replace the system path with the RewriteBase + * URL. + * That assumption is true if we use a RewriteRule like + * + * RewriteRule ^foo bar [R] + * + * (see apply_rewrite_rule function) + * However on systems that don't have a / as system + * root this will never match, so we skip the / after the + * hostname and compare/substitute only the stuff after it. + * + * (note that cp was already increased to the right value) + */ + cp2 = subst_prefix_path(r, cp, (*dconf->directory == '/') + ? dconf->directory + 1 + : dconf->directory, + dconf->baseurl + 1); + if (strcmp(cp2, cp) != 0) { + *cp = '\0'; + r->filename = apr_pstrcat(r->pool, r->filename, + cp2, NULL); + } + } + } + + /* now prepare the redirect... */ + if (rulestatus != ACTION_NOESCAPE) { + rewritelog(r, 1, "[per-dir %s] escaping %s for redirect", + dconf->directory, r->filename); + r->filename = escape_absolute_uri(r->pool, r->filename, skip); + } + + /* append the QUERY_STRING part */ + if (r->args) { + r->filename = apr_pstrcat(r->pool, r->filename, "?", + (rulestatus == ACTION_NOESCAPE) + ? r->args + : ap_escape_uri(r->pool, r->args), + NULL); + } + + /* determine HTTP redirect response code */ + if (ap_is_HTTP_REDIRECT(r->status)) { + n = r->status; + r->status = HTTP_OK; /* make Apache kernel happy */ + } + else { + n = HTTP_MOVED_TEMPORARILY; + } + + /* now do the redirection */ + apr_table_setn(r->headers_out, "Location", r->filename); + rewritelog(r, 1, "[per-dir %s] redirect to %s [REDIRECT/%d]", + dconf->directory, r->filename, n); + return n; + } + else if (strlen(r->filename) > 10 && + strncmp(r->filename, "forbidden:", 10) == 0) { + /* This URL is forced to be forbidden for the requester */ + return HTTP_FORBIDDEN; + } + else if (strlen(r->filename) > 5 && + strncmp(r->filename, "gone:", 5) == 0) { + /* This URL is forced to be gone */ + return HTTP_GONE; + } + else { + /* it was finally rewritten to a local path */ + + /* if someone used the PASSTHROUGH flag in per-dir + * context we just ignore it. It is only useful + * in per-server context + */ + if (strlen(r->filename) > 12 && + strncmp(r->filename, "passthrough:", 12) == 0) { + r->filename = apr_pstrdup(r->pool, r->filename+12); + } + + /* the filename must be either an absolute local path or an + * absolute local URL. + */ + if ( *r->filename != '/' + && !ap_os_is_path_absolute(r->pool, r->filename)) { + return HTTP_BAD_REQUEST; + } + + /* Check for deadlooping: + * At this point we KNOW that at least one rewriting + * rule was applied, but when the resulting URL is + * the same as the initial URL, we are not allowed to + * use the following internal redirection stuff because + * this would lead to a deadloop. + */ + if (ofilename != NULL && strcmp(r->filename, ofilename) == 0) { + rewritelog(r, 1, "[per-dir %s] initial URL equal rewritten " + "URL: %s [IGNORING REWRITE]", + dconf->directory, r->filename); + return OK; + } + + /* if there is a valid base-URL then substitute + * the per-dir prefix with this base-URL if the + * current filename still is inside this per-dir + * context. If not then treat the result as a + * plain URL + */ + if (dconf->baseurl != NULL) { + rewritelog(r, 2, + "[per-dir %s] trying to replace prefix %s with %s", + dconf->directory, dconf->directory, dconf->baseurl); + r->filename = subst_prefix_path(r, r->filename, + dconf->directory, + dconf->baseurl); + } + else { + /* if no explicit base-URL exists we assume + * that the directory prefix is also a valid URL + * for this webserver and only try to remove the + * document_root if it is prefix + */ + if ((ccp = ap_document_root(r)) != NULL) { + prefix = apr_pstrdup(r->pool, ccp); + /* always NOT have a trailing slash */ + l = strlen(prefix); + if (prefix[l-1] == '/') { + prefix[l-1] = '\0'; + l--; + } + if (strncmp(r->filename, prefix, l) == 0) { + rewritelog(r, 2, + "[per-dir %s] strip document_root " + "prefix: %s -> %s", + dconf->directory, r->filename, + r->filename+l); + r->filename = apr_pstrdup(r->pool, r->filename+l); + } + } + } + + /* now initiate the internal redirect */ + rewritelog(r, 1, "[per-dir %s] internal redirect with %s " + "[INTERNAL REDIRECT]", dconf->directory, r->filename); + r->filename = apr_pstrcat(r->pool, "redirect:", r->filename, NULL); + r->handler = "redirect-handler"; + return OK; + } + } + else { + rewritelog(r, 1, "[per-dir %s] pass through %s", + dconf->directory, r->filename); + r->filename = ofilename; + return DECLINED; + } +} + + +/* +** +** Content-Handlers +** +** [used for redirect support] +** +*/ + +static int handler_redirect(request_rec *r) +{ + if (strcmp(r->handler, "redirect-handler")) { + return DECLINED; + } + + /* just make sure that we are really meant! */ + if (strncmp(r->filename, "redirect:", 9) != 0) { + return DECLINED; + } + + if (is_redirect_limit_exceeded(r)) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "mod_rewrite: maximum number of internal redirects " + "reached. Assuming configuration error. Use " + "'RewriteOptions MaxRedirects' to increase the limit " + "if neccessary."); + return HTTP_INTERNAL_SERVER_ERROR; + } + + /* now do the internal redirect */ + ap_internal_redirect(apr_pstrcat(r->pool, r->filename+9, + r->args ? "?" : NULL, r->args, NULL), r); + + /* and return gracefully */ + return OK; +} + +/* + * check whether redirect limit is reached + */ +static int is_redirect_limit_exceeded(request_rec *r) +{ + request_rec *top = r; + rewrite_request_conf *reqc; + rewrite_perdir_conf *dconf; + + /* we store it in the top request */ + while (top->main) { + top = top->main; + } + while (top->prev) { + top = top->prev; + } + + /* fetch our config */ + reqc = (rewrite_request_conf *) ap_get_module_config(top->request_config, + &rewrite_module); + + /* no config there? create one. */ + if (!reqc) { + rewrite_server_conf *sconf; + + reqc = apr_palloc(top->pool, sizeof(rewrite_request_conf)); + sconf = ap_get_module_config(r->server->module_config, &rewrite_module); + + reqc->redirects = 0; + reqc->redirect_limit = sconf->redirect_limit + ? sconf->redirect_limit + : REWRITE_REDIRECT_LIMIT; + + /* associate it with this request */ + ap_set_module_config(top->request_config, &rewrite_module, reqc); + } + + /* allow to change the limit during redirects. */ + dconf = (rewrite_perdir_conf *)ap_get_module_config(r->per_dir_config, + &rewrite_module); + + /* 0 == unset; take server conf ... */ + if (dconf->redirect_limit) { + reqc->redirect_limit = dconf->redirect_limit; + } + + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, + "mod_rewrite's internal redirect status: %d/%d.", + reqc->redirects, reqc->redirect_limit); + + /* and now give the caller a hint */ + return (reqc->redirects++ >= reqc->redirect_limit); +} + + +/* +** +-------------------------------------------------------+ +** | | +** | the rewriting engine +** | | +** +-------------------------------------------------------+ +*/ + +/* + * Apply a complete rule set, + * i.e. a list of rewrite rules + */ +static int apply_rewrite_list(request_rec *r, apr_array_header_t *rewriterules, + char *perdir) +{ + rewriterule_entry *entries; + rewriterule_entry *p; + int i; + int changed; + int rc; + int s; + + /* + * Iterate over all existing rules + */ + entries = (rewriterule_entry *)rewriterules->elts; + changed = 0; + loop: + for (i = 0; i < rewriterules->nelts; i++) { + p = &entries[i]; + + /* + * Ignore this rule on subrequests if we are explicitly + * asked to do so or this is a proxy-throughput or a + * forced redirect rule. + */ + if (r->main != NULL && + (p->flags & RULEFLAG_IGNOREONSUBREQ || + p->flags & RULEFLAG_PROXY || + p->flags & RULEFLAG_FORCEREDIRECT )) { + continue; + } + + /* + * Apply the current rule. + */ + rc = apply_rewrite_rule(r, p, perdir); + if (rc) { + /* + * Indicate a change if this was not a match-only rule. + */ + if (rc != 2) { + changed = ((p->flags & RULEFLAG_NOESCAPE) + ? ACTION_NOESCAPE : ACTION_NORMAL); + } + + /* + * Pass-Through Feature (`RewriteRule .. .. [PT]'): + * Because the Apache 1.x API is very limited we + * need this hack to pass the rewritten URL to other + * modules like mod_alias, mod_userdir, etc. + */ + if (p->flags & RULEFLAG_PASSTHROUGH) { + rewritelog(r, 2, "forcing '%s' to get passed through " + "to next API URI-to-filename handler", r->filename); + r->filename = apr_pstrcat(r->pool, "passthrough:", + r->filename, NULL); + changed = ACTION_NORMAL; + break; + } + + /* + * Rule has the "forbidden" flag set which means that + * we stop processing and indicate this to the caller. + */ + if (p->flags & RULEFLAG_FORBIDDEN) { + rewritelog(r, 2, "forcing '%s' to be forbidden", r->filename); + r->filename = apr_pstrcat(r->pool, "forbidden:", + r->filename, NULL); + changed = ACTION_NORMAL; + break; + } + + /* + * Rule has the "gone" flag set which means that + * we stop processing and indicate this to the caller. + */ + if (p->flags & RULEFLAG_GONE) { + rewritelog(r, 2, "forcing '%s' to be gone", r->filename); + r->filename = apr_pstrcat(r->pool, "gone:", r->filename, NULL); + changed = ACTION_NORMAL; + break; + } + + /* + * Stop processing also on proxy pass-through and + * last-rule and new-round flags. + */ + if (p->flags & RULEFLAG_PROXY) { + break; + } + if (p->flags & RULEFLAG_LASTRULE) { + break; + } + + /* + * On "new-round" flag we just start from the top of + * the rewriting ruleset again. + */ + if (p->flags & RULEFLAG_NEWROUND) { + goto loop; + } + + /* + * If we are forced to skip N next rules, do it now. + */ + if (p->skip > 0) { + s = p->skip; + while ( i < rewriterules->nelts + && s > 0) { + i++; + p = &entries[i]; + s--; + } + } + } + else { + /* + * If current rule is chained with next rule(s), + * skip all this next rule(s) + */ + while ( i < rewriterules->nelts + && p->flags & RULEFLAG_CHAIN) { + i++; + p = &entries[i]; + } + } + } + return changed; +} + +/* + * Apply a single(!) rewrite rule + */ +static int apply_rewrite_rule(request_rec *r, rewriterule_entry *p, + char *perdir) +{ + char *uri; + char *output; + const char *vary; + char newuri[MAX_STRING_LEN]; + regex_t *regexp; + regmatch_t regmatch[AP_MAX_REG_MATCH]; + backrefinfo *briRR = NULL; + backrefinfo *briRC = NULL; + int failed; + apr_array_header_t *rewriteconds; + rewritecond_entry *conds; + rewritecond_entry *c; + int i; + int rc; + int is_proxyreq = 0; + + /* + * Initialisation + */ + uri = r->filename; + regexp = p->regexp; + output = p->output; + + /* + * Add (perhaps splitted away) PATH_INFO postfix to URL to + * make sure we really match against the complete URL. + */ + if (perdir != NULL && r->path_info != NULL && r->path_info[0] != '\0') { + rewritelog(r, 3, "[per-dir %s] add path info postfix: %s -> %s%s", + perdir, uri, uri, r->path_info); + uri = apr_pstrcat(r->pool, uri, r->path_info, NULL); + } + + /* + * On per-directory context (.htaccess) strip the location + * prefix from the URL to make sure patterns apply only to + * the local part. Additionally indicate this special + * threatment in the logfile. + */ + if (perdir) { + /* + * Proxy request? + */ + is_proxyreq = ( r->proxyreq && r->filename + && !strncmp(r->filename, "proxy:", 6)); + + if ( !is_proxyreq && strlen(uri) >= strlen(perdir) + && strncmp(uri, perdir, strlen(perdir)) == 0) { + rewritelog(r, 3, "[per-dir %s] strip per-dir prefix: %s -> %s", + perdir, uri, uri+strlen(perdir)); + uri = uri+strlen(perdir); + } + } + + /* + * Try to match the URI against the RewriteRule pattern + * and exit immeddiately if it didn't apply. + */ + if (perdir == NULL) { + rewritelog(r, 3, "applying pattern '%s' to uri '%s'", + p->pattern, uri); + } + else { + rewritelog(r, 3, "[per-dir %s] applying pattern '%s' to uri '%s'", + perdir, p->pattern, uri); + } + rc = (ap_regexec(regexp, uri, AP_MAX_REG_MATCH, regmatch, 0) == 0); + if (! (( rc && !(p->flags & RULEFLAG_NOTMATCH)) || + (!rc && (p->flags & RULEFLAG_NOTMATCH)) ) ) { + return 0; + } + + /* + * Else create the RewriteRule `regsubinfo' structure which + * holds the substitution information. + */ + briRR = (backrefinfo *)apr_palloc(r->pool, sizeof(backrefinfo)); + if (!rc && (p->flags & RULEFLAG_NOTMATCH)) { + /* empty info on negative patterns */ + briRR->source = ""; + briRR->nsub = 0; + } + else { + briRR->source = apr_pstrdup(r->pool, uri); + briRR->nsub = regexp->re_nsub; + memcpy((void *)(briRR->regmatch), (void *)(regmatch), + sizeof(regmatch)); + } + + /* + * Initiallally create the RewriteCond backrefinfo with + * empty backrefinfo, i.e. not subst parts + * (this one is adjusted inside apply_rewrite_cond() later!!) + */ + briRC = (backrefinfo *)apr_pcalloc(r->pool, sizeof(backrefinfo)); + briRC->source = ""; + briRC->nsub = 0; + + /* + * Ok, we already know the pattern has matched, but we now + * additionally have to check for all existing preconditions + * (RewriteCond) which have to be also true. We do this at + * this very late stage to avoid unnessesary checks which + * would slow down the rewriting engine!! + */ + rewriteconds = p->rewriteconds; + conds = (rewritecond_entry *)rewriteconds->elts; + failed = 0; + for (i = 0; i < rewriteconds->nelts; i++) { + c = &conds[i]; + rc = apply_rewrite_cond(r, c, perdir, briRR, briRC); + if (c->flags & CONDFLAG_ORNEXT) { + /* + * The "OR" case + */ + if (rc == 0) { + /* One condition is false, but another can be + * still true, so we have to continue... + */ + apr_table_unset(r->notes, VARY_KEY_THIS); + continue; + } + else { + /* One true condition is enough in "or" case, so + * skip the other conditions which are "ornext" + * chained + */ + while ( i < rewriteconds->nelts + && c->flags & CONDFLAG_ORNEXT) { + i++; + c = &conds[i]; + } + continue; + } + } + else { + /* + * The "AND" case, i.e. no "or" flag, + * so a single failure means total failure. + */ + if (rc == 0) { + failed = 1; + break; + } + } + vary = apr_table_get(r->notes, VARY_KEY_THIS); + if (vary != NULL) { + apr_table_merge(r->notes, VARY_KEY, vary); + apr_table_unset(r->notes, VARY_KEY_THIS); + } + } + /* if any condition fails the complete rule fails */ + if (failed) { + apr_table_unset(r->notes, VARY_KEY); + apr_table_unset(r->notes, VARY_KEY_THIS); + return 0; + } + + /* + * Regardless of what we do next, we've found a match. Check to see + * if any of the request header fields were involved, and add them + * to the Vary field of the response. + */ + if ((vary = apr_table_get(r->notes, VARY_KEY)) != NULL) { + apr_table_merge(r->headers_out, "Vary", vary); + apr_table_unset(r->notes, VARY_KEY); + } + + /* + * If this is a pure matching rule (`RewriteRule -') + * we stop processing and return immediately. The only thing + * we have not to forget are the environment variables and + * cookies: + * (`RewriteRule - [E=...,CO=...]') + */ + if (strcmp(output, "-") == 0) { + do_expand_env(r, p->env, briRR, briRC); + do_expand_cookie(r, p->cookie, briRR, briRC); + if (p->forced_mimetype != NULL) { + if (perdir == NULL) { + /* In the per-server context we can force the MIME-type + * the correct way by notifying our MIME-type hook handler + * to do the job when the MIME-type API stage is reached. + */ + rewritelog(r, 2, "remember %s to have MIME-type '%s'", + r->filename, p->forced_mimetype); + apr_table_setn(r->notes, REWRITE_FORCED_MIMETYPE_NOTEVAR, + p->forced_mimetype); + } + else { + /* In per-directory context we operate in the Fixup API hook + * which is after the MIME-type hook, so our MIME-type handler + * has no chance to set r->content_type. And because we are + * in the situation where no substitution takes place no + * sub-request will happen (which could solve the + * restriction). As a workaround we do it ourself now + * immediately although this is not strictly API-conforming. + * But it's the only chance we have... + */ + rewritelog(r, 1, "[per-dir %s] force %s to have MIME-type " + "'%s'", perdir, r->filename, p->forced_mimetype); + ap_set_content_type(r, p->forced_mimetype); + } + } + return 2; + } + + /* + * Ok, now we finally know all patterns have matched and + * that there is something to replace, so we create the + * substitution URL string in `newuri'. + */ + do_expand(r, output, newuri, sizeof(newuri), briRR, briRC); + if (perdir == NULL) { + rewritelog(r, 2, "rewrite %s -> %s", uri, newuri); + } + else { + rewritelog(r, 2, "[per-dir %s] rewrite %s -> %s", perdir, uri, newuri); + } + + /* + * Additionally do expansion for the environment variable + * strings (`RewriteRule .. .. [E=]'). + */ + do_expand_env(r, p->env, briRR, briRC); + + /* + * Also set cookies for any cookie strings + * (`RewriteRule .. .. [CO=]'). + */ + do_expand_cookie(r, p->cookie, briRR, briRC); + + /* + * Now replace API's knowledge of the current URI: + * Replace r->filename with the new URI string and split out + * an on-the-fly generated QUERY_STRING part into r->args + */ + r->filename = apr_pstrdup(r->pool, newuri); + splitout_queryargs(r, p->flags & RULEFLAG_QSAPPEND); + + /* + * Add the previously stripped per-directory location + * prefix if the new URI is not a new one for this + * location, i.e. if it's not an absolute URL (!) path nor + * a fully qualified URL scheme. + */ + if ( perdir && !is_proxyreq && *r->filename != '/' + && !is_absolute_uri(r->filename)) { + rewritelog(r, 3, "[per-dir %s] add per-dir prefix: %s -> %s%s", + perdir, r->filename, perdir, r->filename); + r->filename = apr_pstrcat(r->pool, perdir, r->filename, NULL); + } + + /* + * If this rule is forced for proxy throughput + * (`RewriteRule ... ... [P]') then emulate mod_proxy's + * URL-to-filename handler to be sure mod_proxy is triggered + * for this URL later in the Apache API. But make sure it is + * a fully-qualified URL. (If not it is qualified with + * ourself). + */ + if (p->flags & RULEFLAG_PROXY) { + fully_qualify_uri(r); + if (perdir == NULL) { + rewritelog(r, 2, "forcing proxy-throughput with %s", r->filename); + } + else { + rewritelog(r, 2, "[per-dir %s] forcing proxy-throughput with %s", + perdir, r->filename); + } + r->filename = apr_pstrcat(r->pool, "proxy:", r->filename, NULL); + return 1; + } + + /* + * If this rule is explicitly forced for HTTP redirection + * (`RewriteRule .. .. [R]') then force an external HTTP + * redirect. But make sure it is a fully-qualified URL. (If + * not it is qualified with ourself). + */ + if (p->flags & RULEFLAG_FORCEREDIRECT) { + fully_qualify_uri(r); + if (perdir == NULL) { + rewritelog(r, 2, + "explicitly forcing redirect with %s", r->filename); + } + else { + rewritelog(r, 2, + "[per-dir %s] explicitly forcing redirect with %s", + perdir, r->filename); + } + r->status = p->forced_responsecode; + return 1; + } + + /* + * Special Rewriting Feature: Self-Reduction + * We reduce the URL by stripping a possible + * http[s]://[:] prefix, i.e. a prefix which + * corresponds to ourself. This is to simplify rewrite maps + * and to avoid recursion, etc. When this prefix is not a + * coincidence then the user has to use [R] explicitly (see + * above). + */ + reduce_uri(r); + + /* + * If this rule is still implicitly forced for HTTP + * redirection (`RewriteRule .. ://...') then + * directly force an external HTTP redirect. + */ + if (is_absolute_uri(r->filename)) { + if (perdir == NULL) { + rewritelog(r, 2, + "implicitly forcing redirect (rc=%d) with %s", + p->forced_responsecode, r->filename); + } + else { + rewritelog(r, 2, "[per-dir %s] implicitly forcing redirect " + "(rc=%d) with %s", perdir, p->forced_responsecode, + r->filename); + } + r->status = p->forced_responsecode; + return 1; + } + + /* + * Finally we had to remember if a MIME-type should be + * forced for this URL (`RewriteRule .. .. [T=]') + * Later in the API processing phase this is forced by our + * MIME API-hook function. This time it's no problem even for + * the per-directory context (where the MIME-type hook was + * already processed) because a sub-request happens ;-) + */ + if (p->forced_mimetype != NULL) { + apr_table_setn(r->notes, REWRITE_FORCED_MIMETYPE_NOTEVAR, + p->forced_mimetype); + if (perdir == NULL) { + rewritelog(r, 2, "remember %s to have MIME-type '%s'", + r->filename, p->forced_mimetype); + } + else { + rewritelog(r, 2, + "[per-dir %s] remember %s to have MIME-type '%s'", + perdir, r->filename, p->forced_mimetype); + } + } + + /* + * Puuhhhhhhhh... WHAT COMPLICATED STUFF ;_) + * But now we're done for this particular rule. + */ + return 1; +} + +static int apply_rewrite_cond(request_rec *r, rewritecond_entry *p, + char *perdir, backrefinfo *briRR, + backrefinfo *briRC) +{ + char input[MAX_STRING_LEN]; + apr_finfo_t sb; + request_rec *rsub; + regmatch_t regmatch[AP_MAX_REG_MATCH]; + int rc; + + /* + * Construct the string we match against + */ + + do_expand(r, p->input, input, sizeof(input), briRR, briRC); + + /* + * Apply the patterns + */ + + rc = 0; + if (strcmp(p->pattern, "-f") == 0) { + if (apr_stat(&sb, input, APR_FINFO_MIN, r->pool) == APR_SUCCESS) { + if (sb.filetype == APR_REG) { + rc = 1; + } + } + } + else if (strcmp(p->pattern, "-s") == 0) { + if (apr_stat(&sb, input, APR_FINFO_MIN, r->pool) == APR_SUCCESS) { + if ((sb.filetype == APR_REG) && sb.size > 0) { + rc = 1; + } + } + } + else if (strcmp(p->pattern, "-l") == 0) { +#if !defined(OS2) + if (apr_lstat(&sb, input, APR_FINFO_MIN, r->pool) == APR_SUCCESS) { + if (sb.filetype == APR_LNK) { + rc = 1; + } + } +#endif + } + else if (strcmp(p->pattern, "-d") == 0) { + if (apr_stat(&sb, input, APR_FINFO_MIN, r->pool) == APR_SUCCESS) { + if (sb.filetype == APR_DIR) { + rc = 1; + } + } + } + else if (strcmp(p->pattern, "-U") == 0) { + /* avoid infinite subrequest recursion */ + if (strlen(input) > 0 && subreq_ok(r)) { + + /* run a URI-based subrequest */ + rsub = ap_sub_req_lookup_uri(input, r, NULL); + + /* URI exists for any result up to 3xx, redirects allowed */ + if (rsub->status < 400) + rc = 1; + + /* log it */ + rewritelog(r, 5, "RewriteCond URI (-U) check: " + "path=%s -> status=%d", input, rsub->status); + + /* cleanup by destroying the subrequest */ + ap_destroy_sub_req(rsub); + } + } + else if (strcmp(p->pattern, "-F") == 0) { + /* avoid infinite subrequest recursion */ + if (strlen(input) > 0 && subreq_ok(r)) { + + /* process a file-based subrequest: + * this differs from -U in that no path translation is done. + */ + rsub = ap_sub_req_lookup_file(input, r, NULL); + + /* file exists for any result up to 2xx, no redirects */ + if (rsub->status < 300 && + /* double-check that file exists since default result is 200 */ + apr_stat(&sb, rsub->filename, APR_FINFO_MIN, + r->pool) == APR_SUCCESS) { + rc = 1; + } + + /* log it */ + rewritelog(r, 5, "RewriteCond file (-F) check: path=%s " + "-> file=%s status=%d", input, rsub->filename, + rsub->status); + + /* cleanup by destroying the subrequest */ + ap_destroy_sub_req(rsub); + } + } + else if (strlen(p->pattern) > 1 && *(p->pattern) == '>') { + rc = (compare_lexicography(input, p->pattern+1) == 1 ? 1 : 0); + } + else if (strlen(p->pattern) > 1 && *(p->pattern) == '<') { + rc = (compare_lexicography(input, p->pattern+1) == -1 ? 1 : 0); + } + else if (strlen(p->pattern) > 1 && *(p->pattern) == '=') { + if (strcmp(p->pattern+1, "\"\"") == 0) { + rc = (*input == '\0'); + } + else { + rc = (strcmp(input, p->pattern+1) == 0 ? 1 : 0); + } + } + else { + /* it is really a regexp pattern, so apply it */ + rc = (ap_regexec(p->regexp, input, AP_MAX_REG_MATCH, regmatch,0) == 0); + + /* if it isn't a negated pattern and really matched + we update the passed-through regex subst info structure */ + if (rc && !(p->flags & CONDFLAG_NOTMATCH)) { + briRC->source = apr_pstrdup(r->pool, input); + briRC->nsub = p->regexp->re_nsub; + memcpy((void *)(briRC->regmatch), (void *)(regmatch), + sizeof(regmatch)); + } + } + + /* if this is a non-matching regexp, just negate the result */ + if (p->flags & CONDFLAG_NOTMATCH) { + rc = !rc; + } + + rewritelog(r, 4, "RewriteCond: input='%s' pattern='%s%s' => %s", + input, (p->flags & CONDFLAG_NOTMATCH ? "!" : ""), + p->pattern, rc ? "matched" : "not-matched"); + + /* end just return the result */ + return rc; +} + + +/* +** +-------------------------------------------------------+ +** | | +** | URL transformation functions +** | | +** +-------------------------------------------------------+ +*/ + + +/* +** +** perform all the expansions on the input string +** leaving the result in the supplied buffer +** +*/ + +static void do_expand(request_rec *r, char *input, char *buffer, int nbuf, + backrefinfo *briRR, backrefinfo *briRC) +{ + char *inp, *outp; + apr_size_t span, space; + + /* + * for security reasons this expansion must be performed in a + * single pass, otherwise an attacker can arrange for the result + * of an earlier expansion to include expansion specifiers that + * are interpreted by a later expansion, producing results that + * were not intended by the administrator. + */ + + inp = input; + outp = buffer; + space = nbuf - 1; /* room for '\0' */ + + for (;;) { + span = strcspn(inp, "\\$%"); + if (span > space) { + span = space; + } + memcpy(outp, inp, span); + inp += span; + outp += span; + space -= span; + if (space == 0 || *inp == '\0') { + break; + } + /* now we have a '\', '$', or '%' */ + if (inp[0] == '\\') { + if (inp[1] != '\0') { + inp++; + goto skip; + } + } + else if (inp[1] == '{') { + char *endp; + endp = find_closing_bracket(inp+2, '{', '}'); + if (endp == NULL) { + goto skip; + } + /* + * These lookups may be recursive in a very convoluted + * fashion -- see the LA-U and LA-F variable expansion + * prefixes -- so we copy lookup keys to a separate buffer + * rather than adding zero bytes in order to use them in + * place. + */ + if (inp[0] == '$') { + /* ${...} map lookup expansion */ + /* + * To make rewrite maps useful the lookup key and + * default values must be expanded, so we make + * recursive calls to do the work. For security + * reasons we must never expand a string that includes + * verbatim data from the network. The recursion here + * isn't a problem because the result of expansion is + * only passed to lookup_map() so it cannot be + * re-expanded, only re-looked-up. Another way of + * looking at it is that the recursion is entirely + * driven by the syntax of the nested curly brackets. + */ + char *map, *key, *dflt, *result; + char xkey[MAX_STRING_LEN]; + char xdflt[MAX_STRING_LEN]; + key = find_char_in_brackets(inp+2, ':', '{', '}'); + if (key == NULL) { + goto skip; + } + map = apr_pstrndup(r->pool, inp+2, key-inp-2); + dflt = find_char_in_brackets(key+1, '|', '{', '}'); + if (dflt == NULL) { + key = apr_pstrndup(r->pool, key+1, endp-key-1); + dflt = ""; + } + else { + key = apr_pstrndup(r->pool, key+1, dflt-key-1); + dflt = apr_pstrndup(r->pool, dflt+1, endp-dflt-1); + } + do_expand(r, key, xkey, sizeof(xkey), briRR, briRC); + result = lookup_map(r, map, xkey); + if (result) { + span = apr_cpystrn(outp, result, space) - outp; + } + else { + do_expand(r, dflt, xdflt, sizeof(xdflt), briRR, briRC); + span = apr_cpystrn(outp, xdflt, space) - outp; + } + } + else if (inp[0] == '%') { + /* %{...} variable lookup expansion */ + char *var; + var = apr_pstrndup(r->pool, inp+2, endp-inp-2); + span = apr_cpystrn(outp, lookup_variable(r, var), space) - outp; + } + else { + span = 0; + } + inp = endp+1; + outp += span; + space -= span; + continue; + } + else if (apr_isdigit(inp[1])) { + int n = inp[1] - '0'; + backrefinfo *bri = NULL; + if (inp[0] == '$') { + /* $N RewriteRule regexp backref expansion */ + bri = briRR; + } + else if (inp[0] == '%') { + /* %N RewriteCond regexp backref expansion */ + bri = briRC; + } + /* see ap_pregsub() in src/main/util.c */ + if (bri && n < AP_MAX_REG_MATCH + && bri->regmatch[n].rm_eo > bri->regmatch[n].rm_so) { + span = bri->regmatch[n].rm_eo - bri->regmatch[n].rm_so; + if (span > space) { + span = space; + } + memcpy(outp, bri->source + bri->regmatch[n].rm_so, span); + outp += span; + space -= span; + } + inp += 2; + continue; + } + skip: + *outp++ = *inp++; + space--; + } + *outp++ = '\0'; +} + + +/* +** +** perform all the expansions on the environment variables +** +*/ + +static void do_expand_env(request_rec *r, char *env[], + backrefinfo *briRR, backrefinfo *briRC) +{ + int i; + char buf[MAX_STRING_LEN]; + + for (i = 0; env[i] != NULL; i++) { + do_expand(r, env[i], buf, sizeof(buf), briRR, briRC); + add_env_variable(r, buf); + } +} + +static void do_expand_cookie( request_rec *r, char *cookie[], + backrefinfo *briRR, backrefinfo *briRC) +{ + int i; + char buf[MAX_STRING_LEN]; + + for (i = 0; cookie[i] != NULL; i++) { + do_expand(r, cookie[i], buf, sizeof(buf), briRR, briRC); + add_cookie(r, buf); + } +} + + +/* +** +** split out a QUERY_STRING part from +** the current URI string +** +*/ + +static void splitout_queryargs(request_rec *r, int qsappend) +{ + char *q; + char *olduri; + + /* don't touch, unless it's an http or mailto URL. + * See RFC 1738 and RFC 2368. + */ + if ( is_absolute_uri(r->filename) + && strncasecmp(r->filename, "http", 4) + && strncasecmp(r->filename, "mailto", 6)) { + r->args = NULL; /* forget the query that's still flying around */ + return; + } + + q = strchr(r->filename, '?'); + if (q != NULL) { + olduri = apr_pstrdup(r->pool, r->filename); + *q++ = '\0'; + if (qsappend) { + r->args = apr_pstrcat(r->pool, q, "&", r->args, NULL); + } + else { + r->args = apr_pstrdup(r->pool, q); + } + if (strlen(r->args) == 0) { + r->args = NULL; + rewritelog(r, 3, "split uri=%s -> uri=%s, args=", olduri, + r->filename); + } + else { + if (r->args[strlen(r->args)-1] == '&') { + r->args[strlen(r->args)-1] = '\0'; + } + rewritelog(r, 3, "split uri=%s -> uri=%s, args=%s", olduri, + r->filename, r->args); + } + } + + return; +} + + +/* +** +** strip 'http[s]://ourhost/' from URI +** +*/ + +static void reduce_uri(request_rec *r) +{ + char *cp; + unsigned short port; + char *portp; + char *hostp; + char *url; + char c; + char host[LONG_STRING_LEN]; + char buf[MAX_STRING_LEN]; + char *olduri; + apr_size_t l; + + cp = (char *)ap_http_method(r); + l = strlen(cp); + if ( strlen(r->filename) > l+3 + && strncasecmp(r->filename, cp, l) == 0 + && r->filename[l] == ':' + && r->filename[l+1] == '/' + && r->filename[l+2] == '/' ) { + /* there was really a rewrite to a remote path */ + + olduri = apr_pstrdup(r->pool, r->filename); /* save for logging */ + + /* cut the hostname and port out of the URI */ + apr_cpystrn(buf, r->filename+(l+3), sizeof(buf)); + hostp = buf; + for (cp = hostp; *cp != '\0' && *cp != '/' && *cp != ':'; cp++) + ; + if (*cp == ':') { + /* set host */ + *cp++ = '\0'; + apr_cpystrn(host, hostp, sizeof(host)); + /* set port */ + portp = cp; + for (; *cp != '\0' && *cp != '/'; cp++) + ; + c = *cp; + *cp = '\0'; + port = atoi(portp); + *cp = c; + /* set remaining url */ + url = cp; + } + else if (*cp == '/') { + /* set host */ + *cp = '\0'; + apr_cpystrn(host, hostp, sizeof(host)); + *cp = '/'; + /* set port */ + port = ap_default_port(r); + /* set remaining url */ + url = cp; + } + else { + /* set host */ + apr_cpystrn(host, hostp, sizeof(host)); + /* set port */ + port = ap_default_port(r); + /* set remaining url */ + url = "/"; + } + + /* now check whether we could reduce it to a local path... */ + if (ap_matches_request_vhost(r, host, port)) { + /* this is our host, so only the URL remains */ + r->filename = apr_pstrdup(r->pool, url); + rewritelog(r, 3, "reduce %s -> %s", olduri, r->filename); + } + } + return; +} + + +/* +** +** add 'http[s]://ourhost[:ourport]/' to URI +** if URI is still not fully qualified +** +*/ + +static void fully_qualify_uri(request_rec *r) +{ + char buf[32]; + const char *thisserver; + char *thisport; + int port; + + if (!is_absolute_uri(r->filename)) { + + thisserver = ap_get_server_name(r); + port = ap_get_server_port(r); + if (ap_is_default_port(port,r)) { + thisport = ""; + } + else { + apr_snprintf(buf, sizeof(buf), ":%u", port); + thisport = buf; + } + + if (r->filename[0] == '/') { + r->filename = apr_psprintf(r->pool, "%s://%s%s%s", + ap_http_method(r), thisserver, + thisport, r->filename); + } + else { + r->filename = apr_psprintf(r->pool, "%s://%s%s/%s", + ap_http_method(r), thisserver, + thisport, r->filename); + } + } + return; +} + + +/* return number of chars of the scheme (incl. '://') + * if the URI is absolute (includes a scheme etc.) + * otherwise 0. + * + * NOTE: If you add new schemes here, please have a + * look at escape_absolute_uri and splitout_queryargs. + * Not every scheme takes query strings and some schemes + * may be handled in a special way. + * + * XXX: we should consider a scheme registry, perhaps with + * appropriate escape callbacks to allow other modules + * to extend mod_rewrite at runtime. + */ +static unsigned is_absolute_uri(char *uri) +{ + /* fast exit */ + if (*uri == '/' || strlen(uri) <= 5) { + return 0; + } + + switch (*uri++) { + case 'f': + case 'F': + if (!strncasecmp(uri, "tp://", 5)) { /* ftp:// */ + return 6; + } + break; + + case 'g': + case 'G': + if (!strncasecmp(uri, "opher://", 8)) { /* gopher:// */ + return 9; + } + break; + + case 'h': + case 'H': + if (!strncasecmp(uri, "ttp://", 6)) { /* http:// */ + return 7; + } + else if (!strncasecmp(uri, "ttps://", 7)) { /* https:// */ + return 8; + } + break; + + case 'l': + case 'L': + if (!strncasecmp(uri, "dap://", 6)) { /* ldap:// */ + return 7; + } + break; + + case 'm': + case 'M': + if (!strncasecmp(uri, "ailto:", 6)) { /* mailto: */ + return 7; + } + break; + + case 'n': + case 'N': + if (!strncasecmp(uri, "ews:", 4)) { /* news: */ + return 5; + } + else if (!strncasecmp(uri, "ntp://", 6)) { /* nntp:// */ + return 7; + } + break; + } + + return 0; +} + + +/* escape absolute uri, which may or may not be path oriented. + * So let's handle them differently. + */ +static char *escape_absolute_uri(apr_pool_t *p, char *uri, unsigned scheme) +{ + char *cp; + + /* be safe. + * NULL should indicate elsewhere, that something's wrong + */ + if (!scheme || strlen(uri) < scheme) { + return NULL; + } + + cp = uri + scheme; + + /* scheme with authority part? */ + if (cp[-1] == '/') { + /* skip host part */ + while (*cp && *cp != '/') { + ++cp; + } + + /* nothing after the hostpart. ready! */ + if (!*cp || !*++cp) { + return apr_pstrdup(p, uri); + } + + /* remember the hostname stuff */ + scheme = cp - uri; + + /* special thing for ldap. + * The parts are separated by question marks. From RFC 2255: + * ldapurl = scheme "://" [hostport] ["/" + * [dn ["?" [attributes] ["?" [scope] + * ["?" [filter] ["?" extensions]]]]]] + */ + if (!strncasecmp(uri, "ldap", 4)) { + char *token[5]; + int c = 0; + + token[0] = cp = apr_pstrdup(p, cp); + while (*cp && c < 4) { + if (*cp == '?') { + token[++c] = cp + 1; + *cp = '\0'; + } + ++cp; + } + + return apr_pstrcat(p, apr_pstrndup(p, uri, scheme), + ap_escape_uri(p, token[0]), + (c >= 1) ? "?" : NULL, + (c >= 1) ? ap_escape_uri(p, token[1]) : NULL, + (c >= 2) ? "?" : NULL, + (c >= 2) ? ap_escape_uri(p, token[2]) : NULL, + (c >= 3) ? "?" : NULL, + (c >= 3) ? ap_escape_uri(p, token[3]) : NULL, + (c >= 4) ? "?" : NULL, + (c >= 4) ? ap_escape_uri(p, token[4]) : NULL, + NULL); + } + } + + /* Nothing special here. Apply normal escaping. */ + return apr_pstrcat(p, apr_pstrndup(p, uri, scheme), + ap_escape_uri(p, cp), NULL); +} + + +/* +** +** Expand tilde-paths (/~user) through Unix /etc/passwd +** database information (or other OS-specific database) +** +*/ +#if APR_HAS_USER +static char *expand_tildepaths(request_rec *r, char *uri) +{ + char user[LONG_STRING_LEN]; + char *newuri; + int i, j; + char *homedir; + + newuri = uri; + if (uri != NULL && strlen(uri) > 2 && uri[0] == '/' && uri[1] == '~') { + /* cut out the username */ + for (j = 0, i = 2; j < sizeof(user)-1 + && uri[i] != '\0' + && uri[i] != '/' ; ) { + user[j++] = uri[i++]; + } + user[j] = '\0'; + + /* lookup username in systems passwd file */ + if (apr_get_home_directory(&homedir, user, r->pool) == APR_SUCCESS) { + /* ok, user was found, so expand the ~user string */ + if (uri[i] != '\0') { + /* ~user/anything... has to be expanded */ + if (homedir[strlen(homedir)-1] == '/') { + homedir[strlen(homedir)-1] = '\0'; + } + newuri = apr_pstrcat(r->pool, homedir, uri+i, NULL); + } + else { + /* only ~user has to be expanded */ + newuri = homedir; + } + } + } + return newuri; +} +#endif /* if APR_HAS_USER */ + + + +/* +** +-------------------------------------------------------+ +** | | +** | DBM hashfile support +** | | +** +-------------------------------------------------------+ +*/ + + +static char *lookup_map(request_rec *r, char *name, char *key) +{ + rewrite_server_conf *conf; + apr_array_header_t *rewritemaps; + rewritemap_entry *entries; + rewritemap_entry *s; + char *value; + apr_finfo_t st; + apr_status_t rv; + int i; + + /* get map configuration */ + conf = ap_get_module_config(r->server->module_config, &rewrite_module); + rewritemaps = conf->rewritemaps; + + entries = (rewritemap_entry *)rewritemaps->elts; + for (i = 0; i < rewritemaps->nelts; i++) { + s = &entries[i]; + if (strcmp(s->name, name) == 0) { + if (s->type == MAPTYPE_TXT) { + if ((rv = apr_stat(&st, s->checkfile, + APR_FINFO_MIN, r->pool)) != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + "mod_rewrite: can't access text RewriteMap " + "file %s", s->checkfile); + rewritelog(r, 1, "can't open RewriteMap file, " + "see error log"); + return NULL; + } + value = get_cache_string(cachep, s->cachename, CACHEMODE_TS, + st.mtime, key); + if (value == NULL) { + rewritelog(r, 6, "cache lookup FAILED, forcing new " + "map lookup"); + if ((value = + lookup_map_txtfile(r, s->datafile, key)) != NULL) { + rewritelog(r, 5, "map lookup OK: map=%s key=%s[txt] " + "-> val=%s", s->name, key, value); + set_cache_string(cachep, s->cachename, CACHEMODE_TS, + st.mtime, key, value); + return value; + } + else { + rewritelog(r, 5, "map lookup FAILED: map=%s[txt] " + "key=%s", s->name, key); + set_cache_string(cachep, s->cachename, CACHEMODE_TS, + st.mtime, key, ""); + return NULL; + } + } + else { + rewritelog(r, 5, "cache lookup OK: map=%s[txt] key=%s " + "-> val=%s", s->name, key, value); + return value[0] != '\0' ? value : NULL; + } + } + else if (s->type == MAPTYPE_DBM) { + if ((rv = apr_stat(&st, s->checkfile, + APR_FINFO_MIN, r->pool)) != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + "mod_rewrite: can't access DBM RewriteMap " + "file %s", s->checkfile); + rewritelog(r, 1, "can't open DBM RewriteMap file, " + "see error log"); + return NULL; + } + value = get_cache_string(cachep, s->cachename, CACHEMODE_TS, + st.mtime, key); + if (value == NULL) { + rewritelog(r, 6, + "cache lookup FAILED, forcing new map lookup"); + if ((value = + lookup_map_dbmfile(r, s->datafile, s->dbmtype, key)) != NULL) { + rewritelog(r, 5, "map lookup OK: map=%s[dbm] key=%s " + "-> val=%s", s->name, key, value); + set_cache_string(cachep, s->cachename, CACHEMODE_TS, + st.mtime, key, value); + return value; + } + else { + rewritelog(r, 5, "map lookup FAILED: map=%s[dbm] " + "key=%s", s->name, key); + set_cache_string(cachep, s->cachename, CACHEMODE_TS, + st.mtime, key, ""); + return NULL; + } + } + else { + rewritelog(r, 5, "cache lookup OK: map=%s[dbm] key=%s " + "-> val=%s", s->name, key, value); + return value[0] != '\0' ? value : NULL; + } + } + else if (s->type == MAPTYPE_PRG) { + if ((value = + lookup_map_program(r, s->fpin, s->fpout, key)) != NULL) { + rewritelog(r, 5, "map lookup OK: map=%s key=%s -> val=%s", + s->name, key, value); + return value; + } + else { + rewritelog(r, 5, "map lookup FAILED: map=%s key=%s", + s->name, key); + } + } + else if (s->type == MAPTYPE_INT) { + if ((value = s->func(r, key)) != NULL) { + rewritelog(r, 5, "map lookup OK: map=%s key=%s -> val=%s", + s->name, key, value); + return value; + } + else { + rewritelog(r, 5, "map lookup FAILED: map=%s key=%s", + s->name, key); + } + } + else if (s->type == MAPTYPE_RND) { + if ((rv = apr_stat(&st, s->checkfile, + APR_FINFO_MIN, r->pool)) != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + "mod_rewrite: can't access text RewriteMap " + "file %s", s->checkfile); + rewritelog(r, 1, "can't open RewriteMap file, " + "see error log"); + return NULL; + } + value = get_cache_string(cachep, s->cachename, CACHEMODE_TS, + st.mtime, key); + if (value == NULL) { + rewritelog(r, 6, "cache lookup FAILED, forcing new " + "map lookup"); + if ((value = + lookup_map_txtfile(r, s->datafile, key)) != NULL) { + rewritelog(r, 5, "map lookup OK: map=%s key=%s[txt] " + "-> val=%s", s->name, key, value); + set_cache_string(cachep, s->cachename, CACHEMODE_TS, + st.mtime, key, value); + } + else { + rewritelog(r, 5, "map lookup FAILED: map=%s[txt] " + "key=%s", s->name, key); + set_cache_string(cachep, s->cachename, CACHEMODE_TS, + st.mtime, key, ""); + return NULL; + } + } + else { + rewritelog(r, 5, "cache lookup OK: map=%s[txt] key=%s " + "-> val=%s", s->name, key, value); + } + if (value[0] != '\0') { + value = select_random_value_part(r, value); + rewritelog(r, 5, "randomly choosen the subvalue `%s'", + value); + } + else { + value = NULL; + } + return value; + } + } + } + return NULL; +} + +static char *lookup_map_txtfile(request_rec *r, const char *file, char *key) +{ + apr_file_t *fp = NULL; + apr_status_t rc; + char line[1024]; + char *value = NULL; + char *cpT; + apr_size_t skip; + char *curkey; + char *curval; + + rc = apr_file_open(&fp, file, APR_READ|APR_BUFFERED, APR_OS_DEFAULT, r->pool); + if (rc != APR_SUCCESS) { + return NULL; + } + + while (apr_file_gets(line, sizeof(line), fp) == APR_SUCCESS) { + if (line[0] == '#') { + continue; /* ignore comments */ + } + cpT = line; + curkey = cpT; + skip = strcspn(cpT," \t\r\n"); + if (skip == 0) { + continue; /* ignore lines that start with a space, tab, CR, or LF */ + } + cpT += skip; + *cpT = '\0'; + if (strcmp(curkey, key) != 0) { + continue; /* key does not match... */ + } + + /* found a matching key; now extract and return the value */ + ++cpT; + skip = strspn(cpT, " \t\r\n"); + cpT += skip; + curval = cpT; + skip = strcspn(cpT, " \t\r\n"); + if (skip == 0) { + continue; /* no value... */ + } + cpT += skip; + *cpT = '\0'; + value = apr_pstrdup(r->pool, curval); + break; + } + apr_file_close(fp); + return value; +} + +static char *lookup_map_dbmfile(request_rec *r, const char *file, + const char *dbmtype, char *key) +{ + apr_dbm_t *dbmfp = NULL; + apr_datum_t dbmkey; + apr_datum_t dbmval; + char *value; + + if (apr_dbm_open_ex(&dbmfp, dbmtype, file, APR_DBM_READONLY, APR_OS_DEFAULT, + r->pool) != APR_SUCCESS) { + return NULL; + } + + dbmkey.dptr = key; + dbmkey.dsize = strlen(key); + + if (apr_dbm_fetch(dbmfp, dbmkey, &dbmval) == APR_SUCCESS && dbmval.dptr) { + value = apr_pstrmemdup(r->pool, dbmval.dptr, dbmval.dsize); + } + else { + value = NULL; + } + + apr_dbm_close(dbmfp); + + return value; +} + +static char *lookup_map_program(request_rec *r, apr_file_t *fpin, + apr_file_t *fpout, char *key) +{ + char buf[LONG_STRING_LEN]; + char c; + int i; + apr_size_t nbytes; + apr_status_t rv; + +#ifndef NO_WRITEV + struct iovec iova[2]; + apr_size_t niov; +#endif + + /* when `RewriteEngine off' was used in the per-server + * context then the rewritemap-programs were not spawned. + * In this case using such a map (usually in per-dir context) + * is useless because it is not available. + * + * newlines in the key leave bytes in the pipe and cause + * bad things to happen (next map lookup will use the chars + * after the \n instead of the new key etc etc - in other words, + * the Rewritemap falls out of sync with the requests). + */ + if (fpin == NULL || fpout == NULL || ap_strchr(key, '\n')) { + return NULL; + } + + /* take the lock */ + + if (rewrite_mapr_lock_acquire) { + rv = apr_global_mutex_lock(rewrite_mapr_lock_acquire); + if (rv != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + "apr_global_mutex_lock(rewrite_mapr_lock_acquire) " + "failed"); + return NULL; /* Maybe this should be fatal? */ + } + } + + /* write out the request key */ +#ifdef NO_WRITEV + nbytes = strlen(key); + apr_file_write(fpin, key, &nbytes); + nbytes = 1; + apr_file_write(fpin, "\n", &nbytes); +#else + iova[0].iov_base = key; + iova[0].iov_len = strlen(key); + iova[1].iov_base = "\n"; + iova[1].iov_len = 1; + + niov = 2; + apr_file_writev(fpin, iova, niov, &nbytes); +#endif + + /* read in the response value */ + i = 0; + nbytes = 1; + apr_file_read(fpout, &c, &nbytes); + while (nbytes == 1 && (i < LONG_STRING_LEN-1)) { + if (c == '\n') { + break; + } + buf[i++] = c; + + apr_file_read(fpout, &c, &nbytes); + } + buf[i] = '\0'; + + /* give the lock back */ + if (rewrite_mapr_lock_acquire) { + rv = apr_global_mutex_unlock(rewrite_mapr_lock_acquire); + if (rv != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + "apr_global_mutex_unlock(rewrite_mapr_lock_acquire) " + "failed"); + return NULL; /* Maybe this should be fatal? */ + } + } + + if (strcasecmp(buf, "NULL") == 0) { + return NULL; + } + else { + return apr_pstrdup(r->pool, buf); + } +} + +static void ap_register_rewrite_mapfunc(char *name, rewrite_mapfunc_t *func) +{ + apr_hash_set(mapfunc_hash, name, strlen(name), (const void *)func); +} + +static char *rewrite_mapfunc_toupper(request_rec *r, char *key) +{ + char *value, *cp; + + for (cp = value = apr_pstrdup(r->pool, key); cp != NULL && *cp != '\0'; + cp++) { + *cp = apr_toupper(*cp); + } + return value; +} + +static char *rewrite_mapfunc_tolower(request_rec *r, char *key) +{ + char *value, *cp; + + for (cp = value = apr_pstrdup(r->pool, key); cp != NULL && *cp != '\0'; + cp++) { + *cp = apr_tolower(*cp); + } + return value; +} + +static char *rewrite_mapfunc_escape(request_rec *r, char *key) +{ + char *value; + + value = ap_escape_uri(r->pool, key); + return value; +} + +static char *rewrite_mapfunc_unescape(request_rec *r, char *key) +{ + char *value; + + value = apr_pstrdup(r->pool, key); + ap_unescape_url(value); + return value; +} + +static int rewrite_rand_init_done = 0; + +static void rewrite_rand_init(void) +{ + if (!rewrite_rand_init_done) { + srand((unsigned)(getpid())); + rewrite_rand_init_done = 1; + } + return; +} + +static int rewrite_rand(int l, int h) +{ + rewrite_rand_init(); + + /* Get [0,1) and then scale to the appropriate range. Note that using + * a floating point value ensures that we use all bits of the rand() + * result. Doing an integer modulus would only use the lower-order bits + * which may not be as uniformly random. + */ + return (int)(((double)(rand() % RAND_MAX) / RAND_MAX) * (h - l + 1) + l); +} + +static char *select_random_value_part(request_rec *r, char *value) +{ + char *buf; + int n, i, k; + + /* count number of distinct values */ + for (n = 1, i = 0; value[i] != '\0'; i++) { + if (value[i] == '|') { + n++; + } + } + + /* when only one value we have no option to choose */ + if (n == 1) { + return value; + } + + /* else randomly select one */ + k = rewrite_rand(1, n); + + /* and grep it out */ + for (n = 1, i = 0; value[i] != '\0'; i++) { + if (n == k) { + break; + } + if (value[i] == '|') { + n++; + } + } + buf = apr_pstrdup(r->pool, &value[i]); + for (i = 0; buf[i] != '\0' && buf[i] != '|'; i++) + ; + buf[i] = '\0'; + return buf; +} + + +/* +** +-------------------------------------------------------+ +** | | +** | rewriting logfile support +** | | +** +-------------------------------------------------------+ +*/ + + +static int open_rewritelog(server_rec *s, apr_pool_t *p) +{ + rewrite_server_conf *conf; + const char *fname; + apr_status_t rc; + piped_log *pl; + int rewritelog_flags = ( APR_WRITE | APR_APPEND | APR_CREATE ); + apr_fileperms_t rewritelog_mode = ( APR_UREAD | APR_UWRITE | + APR_GREAD | APR_WREAD ); + + conf = ap_get_module_config(s->module_config, &rewrite_module); + + /* - no logfile configured + * - logfilename empty + * - virtual log shared w/ main server + */ + if (!conf->rewritelogfile || !*conf->rewritelogfile || conf->rewritelogfp) { + return 1; + } + + if (*conf->rewritelogfile == '|') { + if ((pl = ap_open_piped_log(p, conf->rewritelogfile+1)) == NULL) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, + "mod_rewrite: could not open reliable pipe " + "to RewriteLog filter %s", conf->rewritelogfile+1); + return 0; + } + conf->rewritelogfp = ap_piped_log_write_fd(pl); + } + else if (*conf->rewritelogfile != '\0') { + fname = ap_server_root_relative(p, conf->rewritelogfile); + if (!fname) { + ap_log_error(APLOG_MARK, APLOG_ERR, APR_EBADPATH, s, + "mod_rewrite: Invalid RewriteLog " + "path %s", conf->rewritelogfile); + return 0; + } + if ((rc = apr_file_open(&conf->rewritelogfp, fname, + rewritelog_flags, rewritelog_mode, p)) + != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, rc, s, + "mod_rewrite: could not open RewriteLog " + "file %s", fname); + return 0; + } + } + + return 1; +} + +static void rewritelog(request_rec *r, int level, const char *text, ...) +{ + rewrite_server_conf *conf; + conn_rec *conn; + char *str1; + char str2[512]; + char str3[1024]; + const char *type; + char redir[20]; /* enough for "/redir#%d" if int is 32 bit */ + va_list ap; + int i; + apr_size_t nbytes; + request_rec *req; + char *ruser; + const char *rhost; + apr_status_t rv; + + va_start(ap, text); + conf = ap_get_module_config(r->server->module_config, &rewrite_module); + conn = r->connection; + + if (conf->rewritelogfp == NULL) { + return; + } + if (conf->rewritelogfile == NULL) { + return; + } + if (*(conf->rewritelogfile) == '\0') { + return; + } + + if (level > conf->rewriteloglevel) { + return; + } + + if (r->user == NULL) { + ruser = "-"; + } + else if (strlen(r->user) != 0) { + ruser = r->user; + } + else { + ruser = "\"\""; + } + + rhost = ap_get_remote_host(conn, r->per_dir_config, + REMOTE_NOLOOKUP, NULL); + if (rhost == NULL) { + rhost = "UNKNOWN-HOST"; + } + + str1 = apr_pstrcat(r->pool, rhost, " ", + (conn->remote_logname != NULL ? + conn->remote_logname : "-"), " ", + ruser, NULL); + apr_vsnprintf(str2, sizeof(str2), text, ap); + + if (r->main == NULL) { + type = "initial"; + } + else { + type = "subreq"; + } + + for (i = 0, req = r; req->prev != NULL; req = req->prev) { + i++; + } + if (i == 0) { + redir[0] = '\0'; + } + else { + apr_snprintf(redir, sizeof(redir), "/redir#%d", i); + } + + apr_snprintf(str3, sizeof(str3), + "%s %s [%s/sid#%lx][rid#%lx/%s%s] (%d) %s" APR_EOL_STR, str1, + current_logtime(r), ap_get_server_name(r), + (unsigned long)(r->server), (unsigned long)r, + type, redir, level, str2); + + rv = apr_global_mutex_lock(rewrite_log_lock); + if (rv != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + "apr_global_mutex_lock(rewrite_log_lock) failed"); + /* XXX: Maybe this should be fatal? */ + } + nbytes = strlen(str3); + apr_file_write(conf->rewritelogfp, str3, &nbytes); + rv = apr_global_mutex_unlock(rewrite_log_lock); + if (rv != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + "apr_global_mutex_unlock(rewrite_log_lock) failed"); + /* XXX: Maybe this should be fatal? */ + } + + va_end(ap); + return; +} + +static char *current_logtime(request_rec *r) +{ + apr_time_exp_t t; + char tstr[80]; + apr_size_t len; + + apr_time_exp_lt(&t, apr_time_now()); + + apr_strftime(tstr, &len, 80, "[%d/%b/%Y:%H:%M:%S ", &t); + apr_snprintf(tstr + strlen(tstr), 80-strlen(tstr), "%c%.2d%.2d]", + t.tm_gmtoff < 0 ? '-' : '+', + t.tm_gmtoff / (60*60), t.tm_gmtoff % (60*60)); + return apr_pstrdup(r->pool, tstr); +} + + + + +/* +** +-------------------------------------------------------+ +** | | +** | rewriting lockfile support +** | | +** +-------------------------------------------------------+ +*/ + +#define REWRITELOCK_MODE ( APR_UREAD | APR_UWRITE | APR_GREAD | APR_WREAD ) + +static apr_status_t rewritelock_create(server_rec *s, apr_pool_t *p) +{ + apr_status_t rc; + + /* only operate if a lockfile is used */ + if (lockname == NULL || *(lockname) == '\0') { + return APR_SUCCESS; + } + + /* create the lockfile */ + rc = apr_global_mutex_create(&rewrite_mapr_lock_acquire, lockname, + APR_LOCK_DEFAULT, p); + if (rc != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_CRIT, rc, s, + "mod_rewrite: Parent could not create RewriteLock " + "file %s", lockname); + return rc; + } + +#ifdef MOD_REWRITE_SET_MUTEX_PERMS + rc = unixd_set_global_mutex_perms(rewrite_mapr_lock_acquire); + if (rc != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_CRIT, rc, s, + "mod_rewrite: Parent could not set permissions " + "on RewriteLock; check User and Group directives"); + return rc; + } +#endif + + return APR_SUCCESS; +} + +static apr_status_t rewritelock_remove(void *data) +{ + /* only operate if a lockfile is used */ + if (lockname == NULL || *(lockname) == '\0') { + return APR_SUCCESS; + } + + /* destroy the rewritelock */ + apr_global_mutex_destroy (rewrite_mapr_lock_acquire); + rewrite_mapr_lock_acquire = NULL; + lockname = NULL; + return(0); +} + + +/* +** +-------------------------------------------------------+ +** | | +** | program map support +** | | +** +-------------------------------------------------------+ +*/ + +static apr_status_t run_rewritemap_programs(server_rec *s, apr_pool_t *p) +{ + rewrite_server_conf *conf; + apr_array_header_t *rewritemaps; + rewritemap_entry *entries; + int i; + apr_status_t rc; + + conf = ap_get_module_config(s->module_config, &rewrite_module); + + /* If the engine isn't turned on, + * don't even try to do anything. + */ + if (conf->state == ENGINE_DISABLED) { + return APR_SUCCESS; + } + + rewritemaps = conf->rewritemaps; + entries = (rewritemap_entry *)rewritemaps->elts; + for (i = 0; i < rewritemaps->nelts; i++) { + apr_file_t *fpin = NULL; + apr_file_t *fpout = NULL; + rewritemap_entry *map = &entries[i]; + + if (map->type != MAPTYPE_PRG) { + continue; + } + if (map->argv[0] == NULL + || *(map->argv[0]) == '\0' + || map->fpin != NULL + || map->fpout != NULL ) { + continue; + } + rc = rewritemap_program_child(p, map->argv[0], map->argv, + &fpout, &fpin); + if (rc != APR_SUCCESS || fpin == NULL || fpout == NULL) { + ap_log_error(APLOG_MARK, APLOG_ERR, rc, s, + "mod_rewrite: could not startup RewriteMap " + "program %s", map->datafile); + return rc; + } + map->fpin = fpin; + map->fpout = fpout; + } + return APR_SUCCESS; +} + +/* child process code */ +static apr_status_t rewritemap_program_child(apr_pool_t *p, + const char *progname, char **argv, + apr_file_t **fpout, + apr_file_t **fpin) +{ + apr_status_t rc; + apr_procattr_t *procattr; + apr_proc_t *procnew; + + if (((rc = apr_procattr_create(&procattr, p)) != APR_SUCCESS) || + ((rc = apr_procattr_io_set(procattr, APR_FULL_BLOCK, APR_FULL_BLOCK, + APR_NO_PIPE)) != APR_SUCCESS) || + ((rc = apr_procattr_dir_set(procattr, + ap_make_dirstr_parent(p, argv[0]))) + != APR_SUCCESS) || + ((rc = apr_procattr_cmdtype_set(procattr, APR_PROGRAM)) + != APR_SUCCESS)) { + /* Something bad happened, give up and go away. */ + } + else { + procnew = apr_pcalloc(p, sizeof(*procnew)); + rc = apr_proc_create(procnew, argv[0], (const char **)argv, NULL, + procattr, p); + + if (rc == APR_SUCCESS) { + apr_pool_note_subprocess(p, procnew, APR_KILL_AFTER_TIMEOUT); + + if (fpin) { + (*fpin) = procnew->in; + } + + if (fpout) { + (*fpout) = procnew->out; + } + } + } + + return (rc); +} + + + + +/* +** +-------------------------------------------------------+ +** | | +** | environment variable support +** | | +** +-------------------------------------------------------+ +*/ + + +static char *lookup_variable(request_rec *r, char *var) +{ + const char *result; + char resultbuf[LONG_STRING_LEN]; + apr_time_exp_t tm; + request_rec *rsub; + + result = NULL; + + /* HTTP headers */ + if (strcasecmp(var, "HTTP_USER_AGENT") == 0) { + result = lookup_header(r, "User-Agent"); + } + else if (strcasecmp(var, "HTTP_REFERER") == 0) { + result = lookup_header(r, "Referer"); + } + else if (strcasecmp(var, "HTTP_COOKIE") == 0) { + result = lookup_header(r, "Cookie"); + } + else if (strcasecmp(var, "HTTP_FORWARDED") == 0) { + result = lookup_header(r, "Forwarded"); + } + else if (strcasecmp(var, "HTTP_HOST") == 0) { + result = lookup_header(r, "Host"); + } + else if (strcasecmp(var, "HTTP_PROXY_CONNECTION") == 0) { + result = lookup_header(r, "Proxy-Connection"); + } + else if (strcasecmp(var, "HTTP_ACCEPT") == 0) { + result = lookup_header(r, "Accept"); + } + /* all other headers from which we are still not know about */ + else if (strlen(var) > 5 && strncasecmp(var, "HTTP:", 5) == 0) { + result = lookup_header(r, var+5); + } + + /* connection stuff */ + else if (strcasecmp(var, "REMOTE_ADDR") == 0) { + result = r->connection->remote_ip; + } + else if (strcasecmp(var, "REMOTE_PORT") == 0) { + return apr_itoa(r->pool, r->connection->remote_addr->port); + } + else if (strcasecmp(var, "REMOTE_HOST") == 0) { + result = (char *)ap_get_remote_host(r->connection, + r->per_dir_config, REMOTE_NAME, NULL); + } + else if (strcasecmp(var, "REMOTE_USER") == 0) { + result = r->user; + } + else if (strcasecmp(var, "REMOTE_IDENT") == 0) { + result = (char *)ap_get_remote_logname(r); + } + + /* request stuff */ + else if (strcasecmp(var, "THE_REQUEST") == 0) { /* non-standard */ + result = r->the_request; + } + else if (strcasecmp(var, "REQUEST_METHOD") == 0) { + result = r->method; + } + else if (strcasecmp(var, "REQUEST_URI") == 0) { /* non-standard */ + result = r->uri; + } + else if (strcasecmp(var, "SCRIPT_FILENAME") == 0 || + strcasecmp(var, "REQUEST_FILENAME") == 0 ) { + result = r->filename; + } + else if (strcasecmp(var, "PATH_INFO") == 0) { + result = r->path_info; + } + else if (strcasecmp(var, "QUERY_STRING") == 0) { + result = r->args; + } + else if (strcasecmp(var, "AUTH_TYPE") == 0) { + result = r->ap_auth_type; + } + else if (strcasecmp(var, "IS_SUBREQ") == 0) { /* non-standard */ + result = (r->main != NULL ? "true" : "false"); + } + + /* internal server stuff */ + else if (strcasecmp(var, "DOCUMENT_ROOT") == 0) { + result = ap_document_root(r); + } + else if (strcasecmp(var, "SERVER_ADMIN") == 0) { + result = r->server->server_admin; + } + else if (strcasecmp(var, "SERVER_NAME") == 0) { + result = ap_get_server_name(r); + } + else if (strcasecmp(var, "SERVER_ADDR") == 0) { /* non-standard */ + result = r->connection->local_ip; + } + else if (strcasecmp(var, "SERVER_PORT") == 0) { + apr_snprintf(resultbuf, sizeof(resultbuf), "%u", ap_get_server_port(r)); + result = resultbuf; + } + else if (strcasecmp(var, "SERVER_PROTOCOL") == 0) { + result = r->protocol; + } + else if (strcasecmp(var, "SERVER_SOFTWARE") == 0) { + result = ap_get_server_version(); + } + else if (strcasecmp(var, "API_VERSION") == 0) { /* non-standard */ + apr_snprintf(resultbuf, sizeof(resultbuf), "%d:%d", + MODULE_MAGIC_NUMBER_MAJOR, MODULE_MAGIC_NUMBER_MINOR); + result = resultbuf; + } + +/* XXX: wow this has gotta be slow if you actually use it for a lot, recalculates exploded time for each variable */ + /* underlaying Unix system stuff */ + else if (strcasecmp(var, "TIME_YEAR") == 0) { + apr_time_exp_lt(&tm, apr_time_now()); + apr_snprintf(resultbuf, sizeof(resultbuf), "%04d", tm.tm_year + 1900); + result = resultbuf; + } +#define MKTIMESTR(format, tmfield) \ + apr_time_exp_lt(&tm, apr_time_now()); \ + apr_snprintf(resultbuf, sizeof(resultbuf), format, tm.tmfield); \ + result = resultbuf; + else if (strcasecmp(var, "TIME_MON") == 0) { + MKTIMESTR("%02d", tm_mon+1) + } + else if (strcasecmp(var, "TIME_DAY") == 0) { + MKTIMESTR("%02d", tm_mday) + } + else if (strcasecmp(var, "TIME_HOUR") == 0) { + MKTIMESTR("%02d", tm_hour) + } + else if (strcasecmp(var, "TIME_MIN") == 0) { + MKTIMESTR("%02d", tm_min) + } + else if (strcasecmp(var, "TIME_SEC") == 0) { + MKTIMESTR("%02d", tm_sec) + } + else if (strcasecmp(var, "TIME_WDAY") == 0) { + MKTIMESTR("%d", tm_wday) + } + else if (strcasecmp(var, "TIME") == 0) { + apr_time_exp_lt(&tm, apr_time_now()); + apr_snprintf(resultbuf, sizeof(resultbuf), + "%04d%02d%02d%02d%02d%02d", tm.tm_year + 1900, + tm.tm_mon+1, tm.tm_mday, + tm.tm_hour, tm.tm_min, tm.tm_sec); + result = resultbuf; + rewritelog(r, 1, "RESULT='%s'", result); + } + + /* all other env-variables from the parent Apache process */ + else if (strlen(var) > 4 && strncasecmp(var, "ENV:", 4) == 0) { + /* first try the internal Apache notes structure */ + result = apr_table_get(r->notes, var+4); + /* second try the internal Apache env structure */ + if (result == NULL) { + result = apr_table_get(r->subprocess_env, var+4); + } + /* third try the external OS env */ + if (result == NULL) { + result = getenv(var+4); + } + } + else if (strlen(var) > 4 && !strncasecmp(var, "SSL:", 4) + && rewrite_ssl_lookup) { + result = rewrite_ssl_lookup(r->pool, r->server, r->connection, r, + var + 4); + } + +#define LOOKAHEAD(subrecfunc) \ + if ( \ + /* filename is safe to use */ \ + r->filename != NULL \ + /* - and we're either not in a subrequest */ \ + && ( r->main == NULL \ + /* - or in a subrequest where paths are non-NULL... */ \ + || ( r->main->uri != NULL && r->uri != NULL \ + /* ...and sub and main paths differ */ \ + && strcmp(r->main->uri, r->uri) != 0))) { \ + /* process a file-based subrequest */ \ + rsub = subrecfunc(r->filename, r, NULL); \ + /* now recursively lookup the variable in the sub_req */ \ + result = lookup_variable(rsub, var+5); \ + /* copy it up to our scope before we destroy sub_req's apr_pool_t */ \ + result = apr_pstrdup(r->pool, result); \ + /* cleanup by destroying the subrequest */ \ + ap_destroy_sub_req(rsub); \ + /* log it */ \ + rewritelog(r, 5, "lookahead: path=%s var=%s -> val=%s", \ + r->filename, var+5, result); \ + /* return ourself to prevent re-pstrdup */ \ + return (char *)result; \ + } + + /* look-ahead for parameter through URI-based sub-request */ + else if (strlen(var) > 5 && strncasecmp(var, "LA-U:", 5) == 0) { + LOOKAHEAD(ap_sub_req_lookup_uri) + } + /* look-ahead for parameter through file-based sub-request */ + else if (strlen(var) > 5 && strncasecmp(var, "LA-F:", 5) == 0) { + LOOKAHEAD(ap_sub_req_lookup_file) + } + + /* file stuff */ + else if (strcasecmp(var, "SCRIPT_USER") == 0) { + result = ""; + if (r->finfo.valid & APR_FINFO_USER) { + apr_get_username((char **)&result, r->finfo.user, r->pool); + } + } + else if (strcasecmp(var, "SCRIPT_GROUP") == 0) { + result = ""; + if (r->finfo.valid & APR_FINFO_GROUP) { + apr_group_name_get((char **)&result, r->finfo.group, r->pool); + } + } else if (strcasecmp(var, "HTTPS") == 0) { + int flag = rewrite_is_https && rewrite_is_https(r->connection); + result = flag ? "on" : "off"; + } + + if (result == NULL) { + return apr_pstrdup(r->pool, ""); + } + else { + return apr_pstrdup(r->pool, result); + } +} + +static char *lookup_header(request_rec *r, const char *name) +{ + const apr_array_header_t *hdrs_arr; + const apr_table_entry_t *hdrs; + int i; + + hdrs_arr = apr_table_elts(r->headers_in); + hdrs = (const apr_table_entry_t *)hdrs_arr->elts; + for (i = 0; i < hdrs_arr->nelts; ++i) { + if (hdrs[i].key == NULL) { + continue; + } + if (strcasecmp(hdrs[i].key, name) == 0) { + apr_table_merge(r->notes, VARY_KEY_THIS, name); + return hdrs[i].val; + } + } + return NULL; +} + + + + +/* +** +-------------------------------------------------------+ +** | | +** | caching support +** | | +** +-------------------------------------------------------+ +*/ + + +static cache *init_cache(apr_pool_t *p) +{ + cache *c; + + c = (cache *)apr_palloc(p, sizeof(cache)); + if (apr_pool_create(&c->pool, p) != APR_SUCCESS) { + return NULL; + } + c->lists = apr_array_make(c->pool, 2, sizeof(cachelist)); +#if APR_HAS_THREADS + (void)apr_thread_mutex_create(&(c->lock), APR_THREAD_MUTEX_DEFAULT, p); +#endif + return c; +} + +static void set_cache_string(cache *c, const char *res, int mode, apr_time_t t, + char *key, char *value) +{ + cacheentry ce; + + ce.time = t; + ce.key = key; + ce.value = value; + store_cache_string(c, res, &ce); + return; +} + +static char *get_cache_string(cache *c, const char *res, int mode, + apr_time_t t, char *key) +{ + cacheentry *ce; + + ce = retrieve_cache_string(c, res, key); + if (ce == NULL) { + return NULL; + } + if (mode & CACHEMODE_TS) { + if (t != ce->time) { + return NULL; + } + } + else if (mode & CACHEMODE_TTL) { + if (t > ce->time) { + return NULL; + } + } + return ce->value; +} + +static int cache_tlb_hash(char *key) +{ + unsigned long n; + char *p; + + n = 0; + for (p = key; *p != '\0'; p++) { + n = ((n << 5) + n) ^ (unsigned long)(*p++); + } + + return n % CACHE_TLB_ROWS; +} + +static cacheentry *cache_tlb_lookup(cachetlbentry *tlb, cacheentry *elt, + char *key) +{ + int ix = cache_tlb_hash(key); + int i; + int j; + + for (i=0; i < CACHE_TLB_COLS; ++i) { + j = tlb[ix].t[i]; + if (j < 0) + return NULL; + if (strcmp(elt[j].key, key) == 0) + return &elt[j]; + } + return NULL; +} + +static void cache_tlb_replace(cachetlbentry *tlb, cacheentry *elt, + cacheentry *e) +{ + int ix = cache_tlb_hash(e->key); + int i; + + tlb = &tlb[ix]; + + for (i=1; i < CACHE_TLB_COLS; ++i) + tlb->t[i] = tlb->t[i-1]; + + tlb->t[0] = e - elt; +} + +static void store_cache_string(cache *c, const char *res, cacheentry *ce) +{ + int i; + int j; + cachelist *l; + cacheentry *e; + cachetlbentry *t; + int found_list; + +#if APR_HAS_THREADS + apr_thread_mutex_lock(c->lock); +#endif + + found_list = 0; + /* first try to edit an existing entry */ + for (i = 0; i < c->lists->nelts; i++) { + l = &(((cachelist *)c->lists->elts)[i]); + if (strcmp(l->resource, res) == 0) { + found_list = 1; + + e = cache_tlb_lookup((cachetlbentry *)l->tlb->elts, + (cacheentry *)l->entries->elts, ce->key); + if (e != NULL) { + e->time = ce->time; + e->value = apr_pstrdup(c->pool, ce->value); +#if APR_HAS_THREADS + apr_thread_mutex_unlock(c->lock); +#endif + return; + } + + for (j = 0; j < l->entries->nelts; j++) { + e = &(((cacheentry *)l->entries->elts)[j]); + if (strcmp(e->key, ce->key) == 0) { + e->time = ce->time; + e->value = apr_pstrdup(c->pool, ce->value); + cache_tlb_replace((cachetlbentry *)l->tlb->elts, + (cacheentry *)l->entries->elts, e); +#if APR_HAS_THREADS + apr_thread_mutex_unlock(c->lock); +#endif + return; + } + } + } + } + + /* create a needed new list */ + if (!found_list) { + l = apr_array_push(c->lists); + l->resource = apr_pstrdup(c->pool, res); + l->entries = apr_array_make(c->pool, 2, sizeof(cacheentry)); + l->tlb = apr_array_make(c->pool, CACHE_TLB_ROWS, + sizeof(cachetlbentry)); + for (i=0; itlb->elts)[i]; + for (j=0; jt[j] = -1; + } + } + + /* create the new entry */ + for (i = 0; i < c->lists->nelts; i++) { + l = &(((cachelist *)c->lists->elts)[i]); + if (strcmp(l->resource, res) == 0) { + e = apr_array_push(l->entries); + e->time = ce->time; + e->key = apr_pstrdup(c->pool, ce->key); + e->value = apr_pstrdup(c->pool, ce->value); + cache_tlb_replace((cachetlbentry *)l->tlb->elts, + (cacheentry *)l->entries->elts, e); +#if APR_HAS_THREADS + apr_thread_mutex_unlock(c->lock); +#endif + return; + } + } + + /* not reached, but when it is no problem... */ +#if APR_HAS_THREADS + apr_thread_mutex_unlock(c->lock); +#endif + return; +} + +static cacheentry *retrieve_cache_string(cache *c, const char *res, char *key) +{ + int i; + int j; + cachelist *l; + cacheentry *e; + +#if APR_HAS_THREADS + apr_thread_mutex_lock(c->lock); +#endif + + for (i = 0; i < c->lists->nelts; i++) { + l = &(((cachelist *)c->lists->elts)[i]); + if (strcmp(l->resource, res) == 0) { + + e = cache_tlb_lookup((cachetlbentry *)l->tlb->elts, + (cacheentry *)l->entries->elts, key); + if (e != NULL) { +#if APR_HAS_THREADS + apr_thread_mutex_unlock(c->lock); +#endif + return e; + } + + for (j = 0; j < l->entries->nelts; j++) { + e = &(((cacheentry *)l->entries->elts)[j]); + if (strcmp(e->key, key) == 0) { +#if APR_HAS_THREADS + apr_thread_mutex_unlock(c->lock); +#endif + return e; + } + } + } + } +#if APR_HAS_THREADS + apr_thread_mutex_unlock(c->lock); +#endif + return NULL; +} + + + + +/* +** +-------------------------------------------------------+ +** | | +** | misc functions +** | | +** +-------------------------------------------------------+ +*/ + +/* + * substitute the prefix path 'match' in 'input' with 'subst' + * (think of RewriteBase which substitutes the physical path with + * the virtual path) + */ + +static char *subst_prefix_path(request_rec *r, char *input, char *match, + const char *subst) +{ + apr_size_t len = strlen(match); + + if (len && match[len - 1] == '/') { + --len; + } + + if (!strncmp(input, match, len) && input[len++] == '/') { + apr_size_t slen, outlen; + char *output; + + rewritelog(r, 5, "strip matching prefix: %s -> %s", input, input+len); + + slen = strlen(subst); + if (slen && subst[slen - 1] != '/') { + ++slen; + } + + outlen = strlen(input) + slen - len; + output = apr_palloc(r->pool, outlen + 1); /* don't forget the \0 */ + + memcpy(output, subst, slen); + if (slen && !output[slen-1]) { + output[slen-1] = '/'; + } + memcpy(output+slen, input+len, outlen - slen); + output[outlen] = '\0'; + + rewritelog(r, 4, "add subst prefix: %s -> %s", input+len, output); + + return output; + } + + /* prefix didn't match */ + return input; +} + + +/* +** +** own command line parser which don't have the '\\' problem +** +*/ + +static int parseargline(char *str, char **a1, char **a2, char **a3) +{ + char *cp; + int isquoted; + +#define SKIP_WHITESPACE(cp) \ + for ( ; *cp == ' ' || *cp == '\t'; ) { \ + cp++; \ + }; + +#define CHECK_QUOTATION(cp,isquoted) \ + isquoted = 0; \ + if (*cp == '"') { \ + isquoted = 1; \ + cp++; \ + } + +#define DETERMINE_NEXTSTRING(cp,isquoted) \ + for ( ; *cp != '\0'; cp++) { \ + if ( (isquoted && (*cp == ' ' || *cp == '\t')) \ + || (*cp == '\\' && (*(cp+1) == ' ' || *(cp+1) == '\t'))) { \ + cp++; \ + continue; \ + } \ + if ( (!isquoted && (*cp == ' ' || *cp == '\t')) \ + || (isquoted && *cp == '"') ) { \ + break; \ + } \ + } + + cp = str; + SKIP_WHITESPACE(cp); + + /* determine first argument */ + CHECK_QUOTATION(cp, isquoted); + *a1 = cp; + DETERMINE_NEXTSTRING(cp, isquoted); + if (*cp == '\0') { + return 1; + } + *cp++ = '\0'; + + SKIP_WHITESPACE(cp); + + /* determine second argument */ + CHECK_QUOTATION(cp, isquoted); + *a2 = cp; + DETERMINE_NEXTSTRING(cp, isquoted); + if (*cp == '\0') { + *cp++ = '\0'; + *a3 = NULL; + return 0; + } + *cp++ = '\0'; + + SKIP_WHITESPACE(cp); + + /* again check if there are only two arguments */ + if (*cp == '\0') { + *cp++ = '\0'; + *a3 = NULL; + return 0; + } + + /* determine second argument */ + CHECK_QUOTATION(cp, isquoted); + *a3 = cp; + DETERMINE_NEXTSTRING(cp, isquoted); + *cp++ = '\0'; + + return 0; +} + + +static void add_env_variable(request_rec *r, char *s) +{ + char var[MAX_STRING_LEN]; + char val[MAX_STRING_LEN]; + char *cp; + int n; + + if ((cp = strchr(s, ':')) != NULL) { + n = ((cp-s) > MAX_STRING_LEN-1 ? MAX_STRING_LEN-1 : (cp-s)); + memcpy(var, s, n); + var[n] = '\0'; + apr_cpystrn(val, cp+1, sizeof(val)); + apr_table_set(r->subprocess_env, var, val); + rewritelog(r, 5, "setting env variable '%s' to '%s'", var, val); + } +} + +static void add_cookie(request_rec *r, char *s) +{ + char *var; + char *val; + char *domain; + char *expires; + char *path; + + char *tok_cntx; + char *cookie; + + if (s) { + var = apr_strtok(s, ":", &tok_cntx); + val = apr_strtok(NULL, ":", &tok_cntx); + domain = apr_strtok(NULL, ":", &tok_cntx); + /** the line below won't hit the token ever **/ + expires = apr_strtok(NULL, ":", &tok_cntx); + if (expires) { + path = apr_strtok(NULL,":", &tok_cntx); + } + else { + path = NULL; + } + + if (var && val && domain) { + /* FIX: use cached time similar to how logging does it */ + request_rec *rmain = r; + char *notename; + void *data; + while (rmain->main) { + rmain = rmain->main; + } + + notename = apr_pstrcat(rmain->pool, var, "_rewrite", NULL); + apr_pool_userdata_get(&data, notename, rmain->pool); + if (data == NULL) { + cookie = apr_pstrcat(rmain->pool, + var, "=", val, + "; path=", (path)? path : "/", + "; domain=", domain, + (expires)? "; expires=" : NULL, + (expires)? + ap_ht_time(r->pool, + r->request_time + + apr_time_from_sec((60 * + atol(expires))), + "%a, %d-%b-%Y %T GMT", 1) + : NULL, + NULL); + /* + * XXX: should we add it to err_headers_out as well ? + * if we do we need to be careful that only ONE gets sent out + */ + apr_table_add(rmain->err_headers_out, "Set-Cookie", cookie); + apr_pool_userdata_set("set", notename, NULL, rmain->pool); + rewritelog(rmain, 5, "setting cookie '%s'", cookie); + } + else { + rewritelog(rmain, 5, "skipping already set cookie '%s'", var); + } + } + } +} + + +/* +** +** check that a subrequest won't cause infinite recursion +** +*/ + +static int subreq_ok(request_rec *r) +{ + /* + * either not in a subrequest, or in a subrequest + * and URIs aren't NULL and sub/main URIs differ + */ + return (r->main == NULL + || (r->main->uri != NULL + && r->uri != NULL + && strcmp(r->main->uri, r->uri) != 0)); +} + + +/* +** +** stat() for only the prefix of a path +** +*/ + +static int prefix_stat(const char *path, apr_pool_t *pool) +{ + const char *curpath = path; + const char *root; + const char *slash; + char *statpath; + apr_status_t rv; + + rv = apr_filepath_root(&root, &curpath, APR_FILEPATH_TRUENAME, pool); + + if (rv != APR_SUCCESS) { + return 0; + } + + /* let's recognize slashes only, the mod_rewrite semantics are opaque + * enough. + */ + if ((slash = ap_strchr_c(curpath, '/')) != NULL) { + rv = apr_filepath_merge(&statpath, root, + apr_pstrndup(pool, curpath, + (apr_size_t)(slash - curpath)), + APR_FILEPATH_NOTABOVEROOT | + APR_FILEPATH_NOTRELATIVE, pool); + } + else { + rv = apr_filepath_merge(&statpath, root, curpath, + APR_FILEPATH_NOTABOVEROOT | + APR_FILEPATH_NOTRELATIVE, pool); + } + + if (rv == APR_SUCCESS) { + apr_finfo_t sb; + + if (apr_stat(&sb, statpath, APR_FINFO_MIN, pool) == APR_SUCCESS) { + return 1; + } + } + + return 0; +} + + +/* +** +** Lexicographic Compare +** +*/ + +static int compare_lexicography(char *cpNum1, char *cpNum2) +{ + int i; + int n1, n2; + + n1 = strlen(cpNum1); + n2 = strlen(cpNum2); + if (n1 > n2) { + return 1; + } + if (n1 < n2) { + return -1; + } + for (i = 0; i < n1; i++) { + if (cpNum1[i] > cpNum2[i]) { + return 1; + } + if (cpNum1[i] < cpNum2[i]) { + return -1; + } + } + return 0; +} + +/* +** +** Bracketed expression handling +** s points after the opening bracket +** +*/ + +static char *find_closing_bracket(char *s, int left, int right) +{ + int depth; + + for (depth = 1; *s; ++s) { + if (*s == right && --depth == 0) { + return s; + } + else if (*s == left) { + ++depth; + } + } + return NULL; +} + +static char *find_char_in_brackets(char *s, int c, int left, int right) +{ + int depth; + + for (depth = 1; *s; ++s) { + if (*s == c && depth == 1) { + return s; + } + else if (*s == right && --depth == 0) { + return NULL; + } + else if (*s == left) { + ++depth; + } + } + return NULL; +} + +/* +** +** Module paraphernalia +** +*/ + + /* the apr_table_t of commands we provide */ +static const command_rec command_table[] = { + AP_INIT_FLAG( "RewriteEngine", cmd_rewriteengine, NULL, OR_FILEINFO, + "On or Off to enable or disable (default) the whole " + "rewriting engine"), + AP_INIT_ITERATE( "RewriteOptions", cmd_rewriteoptions, NULL, OR_FILEINFO, + "List of option strings to set"), + AP_INIT_TAKE1( "RewriteBase", cmd_rewritebase, NULL, OR_FILEINFO, + "the base URL of the per-directory context"), + AP_INIT_RAW_ARGS("RewriteCond", cmd_rewritecond, NULL, OR_FILEINFO, + "an input string and a to be applied regexp-pattern"), + AP_INIT_RAW_ARGS("RewriteRule", cmd_rewriterule, NULL, OR_FILEINFO, + "an URL-applied regexp-pattern and a substitution URL"), + AP_INIT_TAKE2( "RewriteMap", cmd_rewritemap, NULL, RSRC_CONF, + "a mapname and a filename"), + AP_INIT_TAKE1( "RewriteLock", cmd_rewritelock, NULL, RSRC_CONF, + "the filename of a lockfile used for inter-process " + "synchronization"), + AP_INIT_TAKE1( "RewriteLog", cmd_rewritelog, NULL, RSRC_CONF, + "the filename of the rewriting logfile"), + AP_INIT_TAKE1( "RewriteLogLevel", cmd_rewriteloglevel, NULL, RSRC_CONF, + "the level of the rewriting logfile verbosity " + "(0=none, 1=std, .., 9=max)"), + { NULL } +}; + +static void register_hooks(apr_pool_t *p) +{ + /* fixup after mod_proxy, so that the proxied url will not + * escaped accidentally by mod_proxy's fixup. + */ + static const char * const aszPre[]={ "mod_proxy.c", NULL }; + + /* check type before mod_mime, so that [T=foo/bar] will not be + * overridden by AddType definitions. + */ + static const char * const ct_aszSucc[]={ "mod_mime.c", NULL }; + + APR_REGISTER_OPTIONAL_FN(ap_register_rewrite_mapfunc); + + ap_hook_handler(handler_redirect, NULL, NULL, APR_HOOK_MIDDLE); + ap_hook_pre_config(pre_config, NULL, NULL, APR_HOOK_MIDDLE); + ap_hook_post_config(post_config, NULL, NULL, APR_HOOK_MIDDLE); + ap_hook_child_init(init_child, NULL, NULL, APR_HOOK_MIDDLE); + + ap_hook_fixups(hook_fixup, aszPre, NULL, APR_HOOK_FIRST); + ap_hook_translate_name(hook_uri2file, NULL, NULL, APR_HOOK_FIRST); + ap_hook_type_checker(hook_mimetype, NULL, ct_aszSucc, APR_HOOK_MIDDLE); +} + + /* the main config structure */ +module AP_MODULE_DECLARE_DATA rewrite_module = { + STANDARD20_MODULE_STUFF, + config_perdir_create, /* create per-dir config structures */ + config_perdir_merge, /* merge per-dir config structures */ + config_server_create, /* create per-server config structures */ + config_server_merge, /* merge per-server config structures */ + command_table, /* table of config file commands */ + register_hooks /* register hooks */ +}; + +/*EOF*/ diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/mod_rewrite.dsp b/rubbos/app/httpd-2.0.64/modules/mappers/mod_rewrite.dsp new file mode 100644 index 00000000..9f8bee18 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/mappers/mod_rewrite.dsp @@ -0,0 +1,128 @@ +# Microsoft Developer Studio Project File - Name="mod_rewrite" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=mod_rewrite - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "mod_rewrite.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 "mod_rewrite.mak" CFG="mod_rewrite - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "mod_rewrite - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_rewrite - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "mod_rewrite - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_rewrite_src" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /out:"Release/mod_rewrite.so" /base:@..\..\os\win32\BaseAddr.ref,mod_rewrite.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Release/mod_rewrite.so" /base:@..\..\os\win32\BaseAddr.ref,mod_rewrite.so /opt:ref + +!ELSEIF "$(CFG)" == "mod_rewrite - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_rewrite_src" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_rewrite.so" /base:@..\..\os\win32\BaseAddr.ref,mod_rewrite.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_rewrite.so" /base:@..\..\os\win32\BaseAddr.ref,mod_rewrite.so + +!ENDIF + +# Begin Target + +# Name "mod_rewrite - Win32 Release" +# Name "mod_rewrite - Win32 Debug" +# Begin Source File + +SOURCE=.\mod_rewrite.c +# End Source File +# Begin Source File + +SOURCE=.\mod_rewrite.rc +# End Source File +# Begin Source File + +SOURCE=..\..\build\win32\win32ver.awk + +!IF "$(CFG)" == "mod_rewrite - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_rewrite.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_rewrite.so "rewrite_module for Apache" ../../include/ap_release.h > .\mod_rewrite.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "mod_rewrite - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_rewrite.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_rewrite.so "rewrite_module for Apache" ../../include/ap_release.h > .\mod_rewrite.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/mod_rewrite.exp b/rubbos/app/httpd-2.0.64/modules/mappers/mod_rewrite.exp new file mode 100644 index 00000000..8f2165bf --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/mappers/mod_rewrite.exp @@ -0,0 +1 @@ +rewrite_module diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/mod_rewrite.h b/rubbos/app/httpd-2.0.64/modules/mappers/mod_rewrite.h new file mode 100644 index 00000000..e648da98 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/mappers/mod_rewrite.h @@ -0,0 +1,446 @@ +/* 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. + */ + +#ifndef MOD_REWRITE_H +#define MOD_REWRITE_H 1 + +/* +** _ _ _ +** _ __ ___ ___ __| | _ __ _____ ___ __(_) |_ ___ +** | '_ ` _ \ / _ \ / _` | | '__/ _ \ \ /\ / / '__| | __/ _ \ +** | | | | | | (_) | (_| | | | | __/\ V V /| | | | || __/ +** |_| |_| |_|\___/ \__,_|___|_| \___| \_/\_/ |_| |_|\__\___| +** |_____| +** +** URL Rewriting Module +** +** This module uses a rule-based rewriting engine (based on a +** regular-expression parser) to rewrite requested URLs on the fly. +** +** It supports an unlimited number of additional rule conditions (which can +** operate on a lot of variables, even on HTTP headers) for granular +** matching and even external database lookups (either via plain text +** tables, DBM hash files or even external processes) for advanced URL +** substitution. +** +** It operates on the full URLs (including the PATH_INFO part) both in +** per-server context (httpd.conf) and per-dir context (.htaccess) and even +** can generate QUERY_STRING parts on result. The rewriting result finally +** can lead to internal subprocessing, external request redirection or even +** to internal proxy throughput. +** +** This module was originally written in April 1996 and +** gifted exclusively to the The Apache Software Foundation in July 1997 by +** +** Ralf S. Engelschall +** rse@engelschall.com +** www.engelschall.com +*/ + +#include "apr.h" + +#define APR_WANT_STRFUNC +#define APR_WANT_MEMFUNC +#include "apr_want.h" + + /* Include from the underlaying Unix system ... */ +#if APR_HAVE_STDARG_H +#include +#endif +#if APR_HAVE_STDLIB_H +#include +#endif +#if APR_HAVE_CTYPE_H +#include +#endif +#if APR_HAVE_SYS_TYPES_H +#include +#endif + +#if APR_HAS_THREADS +#include "apr_thread_mutex.h" +#endif +#include "apr_optional.h" +#include "apr_dbm.h" +#include "ap_config.h" + + /* Include from the Apache server ... */ +#define CORE_PRIVATE +#include "httpd.h" +#include "http_config.h" +#include "http_request.h" +#include "http_core.h" +#include "http_log.h" +#include "http_vhost.h" + + /* + * The key in the r->notes apr_table_t wherein we store our accumulated + * Vary values, and the one used for per-condition checks in a chain. + */ +#define VARY_KEY "rewrite-Vary" +#define VARY_KEY_THIS "rewrite-Vary-this" + +/* +** +** Some defines +** +*/ + +#define ENVVAR_SCRIPT_URL "SCRIPT_URL" +#define ENVVAR_SCRIPT_URI "SCRIPT_URI" + +#define REWRITE_FORCED_MIMETYPE_NOTEVAR "rewrite-forced-mimetype" + +#define CONDFLAG_NONE 1<<0 +#define CONDFLAG_NOCASE 1<<1 +#define CONDFLAG_NOTMATCH 1<<2 +#define CONDFLAG_ORNEXT 1<<3 + +#define RULEFLAG_NONE 1<<0 +#define RULEFLAG_FORCEREDIRECT 1<<1 +#define RULEFLAG_LASTRULE 1<<2 +#define RULEFLAG_NEWROUND 1<<3 +#define RULEFLAG_CHAIN 1<<4 +#define RULEFLAG_IGNOREONSUBREQ 1<<5 +#define RULEFLAG_NOTMATCH 1<<6 +#define RULEFLAG_PROXY 1<<7 +#define RULEFLAG_PASSTHROUGH 1<<8 +#define RULEFLAG_FORBIDDEN 1<<9 +#define RULEFLAG_GONE 1<<10 +#define RULEFLAG_QSAPPEND 1<<11 +#define RULEFLAG_NOCASE 1<<12 +#define RULEFLAG_NOESCAPE 1<<13 + +#define ACTION_NORMAL 1<<0 +#define ACTION_NOESCAPE 1<<1 + +#define MAPTYPE_TXT 1<<0 +#define MAPTYPE_DBM 1<<1 +#define MAPTYPE_PRG 1<<2 +#define MAPTYPE_INT 1<<3 +#define MAPTYPE_RND 1<<4 + +#define ENGINE_DISABLED 1<<0 +#define ENGINE_ENABLED 1<<1 + +#define OPTION_NONE 1<<0 +#define OPTION_INHERIT 1<<1 + +#define CACHEMODE_TS 1<<0 +#define CACHEMODE_TTL 1<<1 + +#define CACHE_TLB_ROWS 1024 +#define CACHE_TLB_COLS 4 + +#ifndef FALSE +#define FALSE 0 +#define TRUE !FALSE +#endif + +#ifndef NO +#define NO FALSE +#define YES TRUE +#endif + +#ifndef RAND_MAX +#define RAND_MAX 32767 +#endif + +#ifndef LONG_STRING_LEN +#define LONG_STRING_LEN 2048 +#endif + +#define MAX_ENV_FLAGS 15 +#define MAX_COOKIE_FLAGS 15 +/*** max cookie size in rfc 2109 ***/ +#define MAX_COOKIE_LEN 4096 + +/* default maximum number of internal redirects */ +#define REWRITE_REDIRECT_LIMIT 10 + + +/* +** +** our private data structures we handle with +** +*/ + + /* the list structures for holding the mapfile information + * and the rewrite rules + */ +typedef struct { + const char *name; /* the name of the map */ + const char *datafile; /* filename for map data files */ + const char *dbmtype; /* dbm type for dbm map data files */ + const char *checkfile; /* filename to check for map existence */ + int type; /* the type of the map */ + apr_file_t *fpin; /* in file pointer for program maps */ + apr_file_t *fpout; /* out file pointer for program maps */ + apr_file_t *fperr; /* err file pointer for program maps */ + char *(*func)(request_rec *, /* function pointer for internal maps */ + char *); + char **argv; + char *cachename; /* name for the cache */ +} rewritemap_entry; + +typedef struct { + char *input; /* Input string of RewriteCond */ + char *pattern; /* the RegExp pattern string */ + regex_t *regexp; + int flags; /* Flags which control the match */ +} rewritecond_entry; + +typedef struct { + apr_array_header_t *rewriteconds; /* the corresponding RewriteCond entries */ + char *pattern; /* the RegExp pattern string */ + regex_t *regexp; /* the RegExp pattern compilation */ + char *output; /* the Substitution string */ + int flags; /* Flags which control the substitution */ + char *forced_mimetype; /* forced MIME type of substitution */ + int forced_responsecode; /* forced HTTP redirect response status */ + char *env[MAX_ENV_FLAGS+1]; /* added environment variables */ + char *cookie[MAX_COOKIE_FLAGS+1]; /* added cookies */ + int skip; /* number of next rules to skip */ +} rewriterule_entry; + + + /* the per-server or per-virtual-server configuration + * statically generated once on startup for every server + */ +typedef struct { + int state; /* the RewriteEngine state */ + int options; /* the RewriteOption state */ + const char *rewritelogfile; /* the RewriteLog filename */ + apr_file_t *rewritelogfp; /* the RewriteLog open filepointer */ + int rewriteloglevel; /* the RewriteLog level of verbosity */ + apr_array_header_t *rewritemaps; /* the RewriteMap entries */ + apr_array_header_t *rewriteconds; /* the RewriteCond entries (temporary) */ + apr_array_header_t *rewriterules; /* the RewriteRule entries */ + server_rec *server; /* the corresponding server indicator */ + int redirect_limit; /* maximum number of internal redirects */ +} rewrite_server_conf; + + + /* the per-directory configuration + * generated on-the-fly by Apache server for current request + */ +typedef struct { + int state; /* the RewriteEngine state */ + int options; /* the RewriteOption state */ + apr_array_header_t *rewriteconds; /* the RewriteCond entries (temporary) */ + apr_array_header_t *rewriterules; /* the RewriteRule entries */ + char *directory; /* the directory where it applies */ + const char *baseurl; /* the base-URL where it applies */ + int redirect_limit; /* maximum number of internal redirects */ +} rewrite_perdir_conf; + + + /* the per-request configuration + */ +typedef struct { + int redirects; /* current number of redirects */ + int redirect_limit; /* maximum number of redirects */ +} rewrite_request_conf; + + + /* the cache structures, + * a 4-way hash apr_table_t with LRU functionality + */ +typedef struct cacheentry { + apr_time_t time; + char *key; + char *value; +} cacheentry; + +typedef struct tlbentry { + int t[CACHE_TLB_COLS]; +} cachetlbentry; + +typedef struct cachelist { + char *resource; + apr_array_header_t *entries; + apr_array_header_t *tlb; +} cachelist; + +typedef struct cache { + apr_pool_t *pool; + apr_array_header_t *lists; +#if APR_HAS_THREADS + apr_thread_mutex_t *lock; +#endif +} cache; + + + /* the regex structure for the + * substitution of backreferences + */ +typedef struct backrefinfo { + char *source; + int nsub; + regmatch_t regmatch[AP_MAX_REG_MATCH]; +} backrefinfo; + + +/* +** +** forward declarations +** +*/ + + /* config structure handling */ +static void *config_server_create(apr_pool_t *p, server_rec *s); +static void *config_server_merge (apr_pool_t *p, void *basev, void *overridesv); +static void *config_perdir_create(apr_pool_t *p, char *path); +static void *config_perdir_merge (apr_pool_t *p, void *basev, void *overridesv); + + /* config directive handling */ +static const char *cmd_rewriteengine(cmd_parms *cmd, + void *dconf, int flag); +static const char *cmd_rewriteoptions(cmd_parms *cmd, + void *dconf, + const char *option); +static const char *cmd_rewritelog (cmd_parms *cmd, void *dconf, const char *a1); +static const char *cmd_rewriteloglevel(cmd_parms *cmd, void *dconf, const char *a1); +static const char *cmd_rewritemap (cmd_parms *cmd, void *dconf, + const char *a1, const char *a2); +static const char *cmd_rewritelock(cmd_parms *cmd, void *dconf, const char *a1); +static const char *cmd_rewritebase(cmd_parms *cmd, void *dconf, + const char *a1); +static const char *cmd_rewritecond(cmd_parms *cmd, void *dconf, + const char *str); +static const char *cmd_rewritecond_parseflagfield(apr_pool_t *p, + rewritecond_entry *new, + char *str); +static const char *cmd_rewritecond_setflag(apr_pool_t *p, rewritecond_entry *cfg, + char *key, char *val); +static const char *cmd_rewriterule(cmd_parms *cmd, void *dconf, + const char *str); +static const char *cmd_rewriterule_parseflagfield(apr_pool_t *p, + rewriterule_entry *new, + char *str); +static const char *cmd_rewriterule_setflag(apr_pool_t *p, rewriterule_entry *cfg, + char *key, char *val); + + /* initialisation */ +static int pre_config(apr_pool_t *pconf, + apr_pool_t *plog, + apr_pool_t *ptemp); +static int post_config(apr_pool_t *pconf, + apr_pool_t *plog, + apr_pool_t *ptemp, + server_rec *s); +static void init_child(apr_pool_t *p, server_rec *s); + + /* runtime hooks */ +static int hook_uri2file (request_rec *r); +static int hook_mimetype (request_rec *r); +static int hook_fixup (request_rec *r); +static int handler_redirect(request_rec *r); + + /* rewriting engine */ +static int apply_rewrite_list(request_rec *r, apr_array_header_t *rewriterules, + char *perdir); +static int apply_rewrite_rule(request_rec *r, rewriterule_entry *p, + char *perdir); +static int apply_rewrite_cond(request_rec *r, rewritecond_entry *p, + char *perdir, backrefinfo *briRR, + backrefinfo *briRC); + +static void do_expand(request_rec *r, char *input, char *buffer, int nbuf, + backrefinfo *briRR, backrefinfo *briRC); +static void do_expand_env(request_rec *r, char *env[], + backrefinfo *briRR, backrefinfo *briRC); +static void do_expand_cookie(request_rec *r, char *cookie[], + backrefinfo *briRR, backrefinfo *briRC); + + /* URI transformation function */ +static void splitout_queryargs(request_rec *r, int qsappend); +static void fully_qualify_uri(request_rec *r); +static void reduce_uri(request_rec *r); +static unsigned is_absolute_uri(char *uri); +static char *escape_absolute_uri(apr_pool_t *p, char *uri, unsigned scheme); +static char *expand_tildepaths(request_rec *r, char *uri); + + /* rewrite map support functions */ +static char *lookup_map(request_rec *r, char *name, char *key); +static char *lookup_map_txtfile(request_rec *r, const char *file, char *key); +static char *lookup_map_dbmfile(request_rec *r, const char *file, + const char *dbmtype, char *key); +static char *lookup_map_program(request_rec *r, apr_file_t *fpin, + apr_file_t *fpout, char *key); + +typedef char *(rewrite_mapfunc_t)(request_rec *r, char *key); +static void ap_register_rewrite_mapfunc(char *name, rewrite_mapfunc_t *func); +APR_DECLARE_OPTIONAL_FN(void, ap_register_rewrite_mapfunc, + (char *name, rewrite_mapfunc_t *func)); + +static char *rewrite_mapfunc_toupper(request_rec *r, char *key); +static char *rewrite_mapfunc_tolower(request_rec *r, char *key); +static char *rewrite_mapfunc_escape(request_rec *r, char *key); +static char *rewrite_mapfunc_unescape(request_rec *r, char *key); + +static char *select_random_value_part(request_rec *r, char *value); +static void rewrite_rand_init(void); +static int rewrite_rand(int l, int h); + + /* rewriting logfile support */ +static int open_rewritelog(server_rec *s, apr_pool_t *p); +static void rewritelog(request_rec *r, int level, const char *text, ...) + __attribute__((format(printf,3,4))); +static char *current_logtime(request_rec *r); + + /* rewriting lockfile support */ +static apr_status_t rewritelock_create(server_rec *s, apr_pool_t *p); +static apr_status_t rewritelock_remove(void *data); + + /* program map support */ +static apr_status_t run_rewritemap_programs(server_rec *s, apr_pool_t *p); +static apr_status_t rewritemap_program_child(apr_pool_t *p, + const char *progname, char **argv, + apr_file_t **fpout, + apr_file_t **fpin); + + /* env variable support */ +static char *lookup_variable(request_rec *r, char *var); +static char *lookup_header(request_rec *r, const char *name); + + /* caching functions */ +static cache *init_cache(apr_pool_t *p); +static char *get_cache_string(cache *c, const char *res, int mode, apr_time_t mtime, + char *key); +static void set_cache_string(cache *c, const char *res, int mode, apr_time_t mtime, + char *key, char *value); +static cacheentry *retrieve_cache_string(cache *c, const char *res, char *key); +static void store_cache_string(cache *c, const char *res, cacheentry *ce); + + /* misc functions */ +static char *subst_prefix_path(request_rec *r, char *input, char *match, + const char *subst); +static int parseargline(char *str, char **a1, char **a2, char **a3); +static int prefix_stat(const char *path, apr_pool_t *pool); +static void add_env_variable(request_rec *r, char *s); +static void add_cookie(request_rec *r, char *s); +static int subreq_ok(request_rec *r); +static int is_redirect_limit_exceeded(request_rec *r); + + /* Lexicographic Comparison */ +static int compare_lexicography(char *cpNum1, char *cpNum2); + + /* Bracketed expression handling */ +static char *find_closing_bracket(char *s, int left, int right); +static char *find_char_in_brackets(char *s, int c, int left, int right); + +#endif /* MOD_REWRITE_H */ diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/mod_so.c b/rubbos/app/httpd-2.0.64/modules/mappers/mod_so.c new file mode 100644 index 00000000..984cb549 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/mappers/mod_so.c @@ -0,0 +1,368 @@ +/* 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. + */ + +/* + * This module is used to load Apache modules at runtime. This means that the + * server functionality can be extended without recompiling and even without + * taking the server down at all. Only a HUP or AP_SIG_GRACEFUL signal + * needs to be sent to the server to reload the dynamically loaded modules. + * + * To use, you'll first need to build your module as a shared library, then + * update your configuration (httpd.conf) to get the Apache core to load the + * module at start-up. + * + * The easiest way to build a module as a shared library is to use the + * `SharedModule' command in the Configuration file, instead of `AddModule'. + * You should also change the file extension from `.o' to `.so'. So, for + * example, to build the status module as a shared library edit Configuration + * and change + * AddModule modules/standard/mod_status.o + * to + * SharedModule modules/standard/mod_status.so + * + * Run Configure and make. Now Apache's httpd binary will _not_ include + * mod_status. Instead a shared object called mod_status.so will be build, in + * the modules/standard directory. You can build most of the modules as shared + * libraries like this. + * + * To use the shared module, move the .so file(s) into an appropriate + * directory. You might like to create a directory called "modules" under you + * server root for this (e.g. /usr/local/httpd/modules). + * + * Then edit your conf/httpd.conf file, and add LoadModule lines. For + * example + * LoadModule status_module modules/mod_status.so + * + * The first argument is the module's structure name (look at the end of the + * module source to find this). The second option is the path to the module + * file, relative to the server root. Put these directives right at the top + * of your httpd.conf file. + * + * Now you can start Apache. A message will be logged at "debug" level to your + * error_log to confirm that the module(s) are loaded (use "LogLevel debug" + * directive to get these log messages). + * + * If you edit the LoadModule directives while the server is live you can get + * Apache to re-load the modules by sending it a HUP or AP_SIG_GRACEFUL + * signal as normal. You can use this to dynamically change the capability + * of your server without bringing it down. + * + * Because currently there is only limited builtin support in the Configure + * script for creating the shared library files (`.so'), please consult your + * vendors cc(1), ld(1) and dlopen(3) manpages to find out the appropriate + * compiler and linker flags and insert them manually into the Configuration + * file under CFLAGS_SHLIB, LDFLAGS_SHLIB and LDFLAGS_SHLIB_EXPORT. + * + * If you still have problems figuring out the flags both try the paper + * http://developer.netscape.com/library/documentation/enterprise + * /unix/svrplug.htm#1013807 + * or install a Perl 5 interpreter on your platform and then run the command + * + * $ perl -V:usedl -V:ccdlflags -V:cccdlflags -V:lddlflags + * + * This gives you what type of dynamic loading Perl 5 uses on your platform + * and which compiler and linker flags Perl 5 uses to create the shared object + * files. + * + * Another location where you can find useful hints is the `ltconfig' script + * of the GNU libtool 1.2 package. Search for your platform name inside the + * various "case" constructs. + * + */ + +#include "apr.h" +#include "apr_dso.h" +#include "apr_strings.h" +#include "apr_errno.h" + +#define CORE_PRIVATE +#include "ap_config.h" +#include "httpd.h" +#include "http_config.h" +#include "http_log.h" +#include "ap_config.h" + +module AP_MODULE_DECLARE_DATA so_module; + + +/* + * Server configuration to keep track of actually + * loaded modules and the corresponding module name. + */ + +typedef struct moduleinfo { + const char *name; + module *modp; +} moduleinfo; + +typedef struct so_server_conf { + apr_array_header_t *loaded_modules; +} so_server_conf; + +static void *so_sconf_create(apr_pool_t *p, server_rec *s) +{ + so_server_conf *soc; + + soc = (so_server_conf *)apr_pcalloc(p, sizeof(so_server_conf)); + soc->loaded_modules = apr_array_make(p, DYNAMIC_MODULE_LIMIT, + sizeof(moduleinfo)); + + return (void *)soc; +} + +#ifndef NO_DLOPEN + +/* + * This is the cleanup for a loaded shared object. It unloads the module. + * This is called as a cleanup function from the core. + */ + +static apr_status_t unload_module(void *data) +{ + moduleinfo *modi = (moduleinfo*)data; + + /* only unload if module information is still existing */ + if (modi->modp == NULL) + return APR_SUCCESS; + + /* remove the module pointer from the core structure */ + ap_remove_loaded_module(modi->modp); + + /* destroy the module information */ + modi->modp = NULL; + modi->name = NULL; + return APR_SUCCESS; +} + +/* + * This is called for the directive LoadModule and actually loads + * a shared object file into the address space of the server process. + */ + +static const char *load_module(cmd_parms *cmd, void *dummy, + const char *modname, const char *filename) +{ + apr_dso_handle_t *modhandle; + apr_dso_handle_sym_t modsym; + module *modp; + const char *szModuleFile = ap_server_root_relative(cmd->pool, filename); + so_server_conf *sconf; + moduleinfo *modi; + moduleinfo *modie; + int i; + + /* we need to setup this value for dummy to make sure that we don't try + * to add a non-existant tree into the build when we return to + * execute_now. + */ + *(ap_directive_t **)dummy = NULL; + + if (!szModuleFile) { + return apr_pstrcat(cmd->pool, "Invalid LoadModule path ", + filename, NULL); + } + + /* + * check for already existing module + * If it already exists, we have nothing to do + * Check both dynamically-loaded modules and statically-linked modules. + */ + sconf = (so_server_conf *)ap_get_module_config(cmd->server->module_config, + &so_module); + modie = (moduleinfo *)sconf->loaded_modules->elts; + for (i = 0; i < sconf->loaded_modules->nelts; i++) { + modi = &modie[i]; + if (modi->name != NULL && strcmp(modi->name, modname) == 0) { + ap_log_perror(APLOG_MARK, APLOG_WARNING, 0, + cmd->pool, "module %s is already loaded, skipping", + modname); + return NULL; + } + } + + for (i = 0; ap_preloaded_modules[i]; i++) { + const char *preload_name; + apr_size_t preload_len; + apr_size_t thismod_len; + + modp = ap_preloaded_modules[i]; + + /* make sure we're comparing apples with apples + * make sure name of preloaded module is mod_FOO.c + * make sure name of structure being loaded is FOO_module + */ + + if (memcmp(modp->name, "mod_", 4)) { + continue; + } + + preload_name = modp->name + strlen("mod_"); + preload_len = strlen(preload_name) - 2; + + if (strlen(modname) <= strlen("_module")) { + continue; + } + thismod_len = strlen(modname) - strlen("_module"); + if (strcmp(modname + thismod_len, "_module")) { + continue; + } + + if (thismod_len != preload_len) { + continue; + } + + if (!memcmp(modname, preload_name, preload_len)) { + return apr_pstrcat(cmd->pool, "module ", modname, + " is built-in and can't be loaded", + NULL); + } + } + + modi = apr_array_push(sconf->loaded_modules); + modi->name = modname; + + /* + * Load the file into the Apache address space + */ + if (apr_dso_load(&modhandle, szModuleFile, cmd->pool) != APR_SUCCESS) { + char my_error[256]; + + return apr_pstrcat(cmd->pool, "Cannot load ", szModuleFile, + " into server: ", + apr_dso_error(modhandle, my_error, sizeof(my_error)), + NULL); + } + ap_log_perror(APLOG_MARK, APLOG_DEBUG, 0, cmd->pool, + "loaded module %s", modname); + + /* + * Retrieve the pointer to the module structure through the module name: + * First with the hidden variant (prefix `AP_') and then with the plain + * symbol name. + */ + if (apr_dso_sym(&modsym, modhandle, modname) != APR_SUCCESS) { + char my_error[256]; + + return apr_pstrcat(cmd->pool, "Can't locate API module structure `", + modname, "' in file ", szModuleFile, ": ", + apr_dso_error(modhandle, my_error, sizeof(my_error)), + NULL); + } + modp = (module*) modsym; + modp->dynamic_load_handle = (apr_dso_handle_t *)modhandle; + modi->modp = modp; + + /* + * Make sure the found module structure is really a module structure + * + */ + if (modp->magic != MODULE_MAGIC_COOKIE) { + return apr_psprintf(cmd->pool, "API module structure '%s' in file %s " + "is garbled - expected signature %08lx but saw " + "%08lx - perhaps this is not an Apache module DSO, " + "or was compiled for a different Apache version?", + modname, szModuleFile, + MODULE_MAGIC_COOKIE, modp->magic); + } + + /* + * Add this module to the Apache core structures + */ + ap_add_loaded_module(modp, cmd->pool); + + /* + * Register a cleanup in the config apr_pool_t (normally pconf). When + * we do a restart (or shutdown) this cleanup will cause the + * shared object to be unloaded. + */ + apr_pool_cleanup_register(cmd->pool, modi, unload_module, apr_pool_cleanup_null); + + /* + * Finally we need to run the configuration process for the module + */ + ap_single_module_configure(cmd->pool, cmd->server, modp); + + return NULL; +} + +/* + * This implements the LoadFile directive and loads an arbitrary + * shared object file into the adress space of the server process. + */ + +static const char *load_file(cmd_parms *cmd, void *dummy, const char *filename) +{ + apr_dso_handle_t *handle; + const char *file; + + file = ap_server_root_relative(cmd->pool, filename); + + if (!file) { + return apr_pstrcat(cmd->pool, "Invalid LoadFile path ", + filename, NULL); + } + + if (apr_dso_load(&handle, file, cmd->pool) != APR_SUCCESS) { + char my_error[256]; + + return apr_pstrcat(cmd->pool, "Cannot load ", filename, + " into server: ", + apr_dso_error(handle, my_error, sizeof(my_error)), + NULL); + } + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, NULL, + "loaded file %s", filename); + + return NULL; +} + +#else /* not NO_DLOPEN */ + +static const char *load_file(cmd_parms *cmd, void *dummy, const char *filename) +{ + ap_log_perror(APLOG_MARK, APLOG_STARTUP, 0, cmd->pool, + "WARNING: LoadFile not supported on this platform"); + return NULL; +} + +static const char *load_module(cmd_parms *cmd, void *dummy, + const char *modname, const char *filename) +{ + ap_log_perror(APLOG_MARK, APLOG_STARTUP, 0, cmd->pool, + "WARNING: LoadModule not supported on this platform"); + return NULL; +} + +#endif /* NO_DLOPEN */ + +static const command_rec so_cmds[] = { + AP_INIT_TAKE2("LoadModule", load_module, NULL, RSRC_CONF | EXEC_ON_READ, + "a module name and the name of a shared object file to load it from"), + AP_INIT_ITERATE("LoadFile", load_file, NULL, RSRC_CONF | EXEC_ON_READ, + "shared object file or library to load into the server at runtime"), + { NULL } +}; + +module AP_MODULE_DECLARE_DATA so_module = { + STANDARD20_MODULE_STUFF, + NULL, /* create per-dir config */ + NULL, /* merge per-dir config */ + so_sconf_create, /* server config */ + NULL, /* merge server config */ + so_cmds, /* command apr_table_t */ + NULL /* register hooks */ +}; diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/mod_so.la b/rubbos/app/httpd-2.0.64/modules/mappers/mod_so.la new file mode 100644 index 00000000..1c9e8489 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/mappers/mod_so.la @@ -0,0 +1,35 @@ +# mod_so.la - a libtool library file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='' + +# Names of this library. +library_names='' + +# The name of the static archive. +old_library='mod_so.a' + +# Libraries that this one depends upon. +dependency_libs=' -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib' + +# Version information for mod_so. +current= +age= +revision= + +# Is this an already installed library? +installed=no + +# Should we warn about portability when linking against -modules? +shouldnotlink=yes + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='' diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/mod_so.lo b/rubbos/app/httpd-2.0.64/modules/mappers/mod_so.lo new file mode 100644 index 00000000..917d7775 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/mappers/mod_so.lo @@ -0,0 +1,12 @@ +# mod_so.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/mod_so.o' + +# Name of the non-PIC object. +non_pic_object='mod_so.o' + diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/mod_so.o b/rubbos/app/httpd-2.0.64/modules/mappers/mod_so.o new file mode 100644 index 0000000000000000000000000000000000000000..71d442fa491016e7306ea88bc5c69dae47be116d GIT binary patch literal 29736 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 June, 1996 + * + * This module is transparent, and simple. It attempts to correct + * misspellings of URLs that users might have entered, namely by checking + * capitalizations. If it finds a match, it sends a redirect. + * + * 08-Aug-1997 + * o Upgraded module interface to apache_1.3a2-dev API (more NULL's in + * speling_module). + * o Integrated tcsh's "spelling correction" routine which allows one + * misspelling (character insertion/omission/typo/transposition). + * Rewrote it to ignore case as well. This ought to catch the majority + * of misspelled requests. + * o Commented out the second pass where files' suffixes are stripped. + * Given the better hit rate of the first pass, this rather ugly + * (request index.html, receive index.db ?!?!) solution can be + * omitted. + * o wrote a "kind of" html page for mod_speling + * + * Activate it with "CheckSpelling On" + */ + +module AP_MODULE_DECLARE_DATA speling_module; + +typedef struct { + int enabled; +} spconfig; + +/* + * Create a configuration specific to this module for a server or directory + * location, and fill it with the default settings. + * + * The API says that in the absence of a merge function, the record for the + * closest ancestor is used exclusively. That's what we want, so we don't + * bother to have such a function. + */ + +static void *mkconfig(apr_pool_t *p) +{ + spconfig *cfg = apr_pcalloc(p, sizeof(spconfig)); + + cfg->enabled = 0; + return cfg; +} + +/* + * Respond to a callback to create configuration record for a server or + * vhost environment. + */ +static void *create_mconfig_for_server(apr_pool_t *p, server_rec *s) +{ + return mkconfig(p); +} + +/* + * Respond to a callback to create a config record for a specific directory. + */ +static void *create_mconfig_for_directory(apr_pool_t *p, char *dir) +{ + return mkconfig(p); +} + +/* + * Handler for the CheckSpelling directive, which is FLAG. + */ +static const char *set_speling(cmd_parms *cmd, void *mconfig, int arg) +{ + spconfig *cfg = (spconfig *) mconfig; + + cfg->enabled = arg; + return NULL; +} + +/* + * Define the directives specific to this module. This structure is referenced + * later by the 'module' structure. + */ +static const command_rec speling_cmds[] = +{ + AP_INIT_FLAG("CheckSpelling", set_speling, NULL, OR_OPTIONS, + "whether or not to fix miscapitalized/misspelled requests"), + { NULL } +}; + +typedef enum { + SP_IDENTICAL = 0, + SP_MISCAPITALIZED = 1, + SP_TRANSPOSITION = 2, + SP_MISSINGCHAR = 3, + SP_EXTRACHAR = 4, + SP_SIMPLETYPO = 5, + SP_VERYDIFFERENT = 6 +} sp_reason; + +static const char *sp_reason_str[] = +{ + "identical", + "miscapitalized", + "transposed characters", + "character missing", + "extra character", + "mistyped character", + "common basename", +}; + +typedef struct { + const char *name; + sp_reason quality; +} misspelled_file; + +/* + * spdist() is taken from Kernighan & Pike, + * _The_UNIX_Programming_Environment_ + * and adapted somewhat to correspond better to psychological reality. + * (Note the changes to the return values) + * + * According to Pollock and Zamora, CACM April 1984 (V. 27, No. 4), + * page 363, the correct order for this is: + * OMISSION = TRANSPOSITION > INSERTION > SUBSTITUTION + * thus, it was exactly backwards in the old version. -- PWP + * + * This routine was taken out of tcsh's spelling correction code + * (tcsh-6.07.04) and re-converted to apache data types ("char" type + * instead of tcsh's NLS'ed "Char"). Plus it now ignores the case + * during comparisons, so is a "approximate strcasecmp()". + * NOTE that is still allows only _one_ real "typo", + * it does NOT try to correct multiple errors. + */ + +static sp_reason spdist(const char *s, const char *t) +{ + for (; apr_tolower(*s) == apr_tolower(*t); t++, s++) { + if (*t == '\0') { + return SP_MISCAPITALIZED; /* exact match (sans case) */ + } + } + if (*s) { + if (*t) { + if (s[1] && t[1] && apr_tolower(*s) == apr_tolower(t[1]) + && apr_tolower(*t) == apr_tolower(s[1]) + && strcasecmp(s + 2, t + 2) == 0) { + return SP_TRANSPOSITION; /* transposition */ + } + if (strcasecmp(s + 1, t + 1) == 0) { + return SP_SIMPLETYPO; /* 1 char mismatch */ + } + } + if (strcasecmp(s + 1, t) == 0) { + return SP_EXTRACHAR; /* extra character */ + } + } + if (*t && strcasecmp(s, t + 1) == 0) { + return SP_MISSINGCHAR; /* missing character */ + } + return SP_VERYDIFFERENT; /* distance too large to fix. */ +} + +static int sort_by_quality(const void *left, const void *rite) +{ + return (int) (((misspelled_file *) left)->quality) + - (int) (((misspelled_file *) rite)->quality); +} + +static int check_speling(request_rec *r) +{ + spconfig *cfg; + char *good, *bad, *postgood, *url; + apr_finfo_t dirent; + int filoc, dotloc, urlen, pglen; + apr_array_header_t *candidates = NULL; + apr_dir_t *dir; + + cfg = ap_get_module_config(r->per_dir_config, &speling_module); + if (!cfg->enabled) { + return DECLINED; + } + + /* We only want to worry about GETs */ + if (r->method_number != M_GET) { + return DECLINED; + } + + /* We've already got a file of some kind or another */ + if (r->finfo.filetype != 0) { + return DECLINED; + } + + /* Not a file request */ + if (r->proxyreq || !r->filename) { + return DECLINED; + } + + /* This is a sub request - don't mess with it */ + if (r->main) { + return DECLINED; + } + + /* + * The request should end up looking like this: + * r->uri: /correct-url/mispelling/more + * r->filename: /correct-file/mispelling r->path_info: /more + * + * So we do this in steps. First break r->filename into two pieces + */ + + filoc = ap_rind(r->filename, '/'); + /* + * Don't do anything if the request doesn't contain a slash, or + * requests "/" + */ + if (filoc == -1 || strcmp(r->uri, "/") == 0) { + return DECLINED; + } + + /* good = /correct-file */ + good = apr_pstrndup(r->pool, r->filename, filoc); + /* bad = mispelling */ + bad = apr_pstrdup(r->pool, r->filename + filoc + 1); + /* postgood = mispelling/more */ + postgood = apr_pstrcat(r->pool, bad, r->path_info, NULL); + + urlen = strlen(r->uri); + pglen = strlen(postgood); + + /* Check to see if the URL pieces add up */ + if (strcmp(postgood, r->uri + (urlen - pglen))) { + return DECLINED; + } + + /* url = /correct-url */ + url = apr_pstrndup(r->pool, r->uri, (urlen - pglen)); + + /* Now open the directory and do ourselves a check... */ + if (apr_dir_open(&dir, good, r->pool) != APR_SUCCESS) { + /* Oops, not a directory... */ + return DECLINED; + } + + candidates = apr_array_make(r->pool, 2, sizeof(misspelled_file)); + + dotloc = ap_ind(bad, '.'); + if (dotloc == -1) { + dotloc = strlen(bad); + } + + while (apr_dir_read(&dirent, APR_FINFO_DIRENT, dir) == APR_SUCCESS) { + sp_reason q; + + /* + * If we end up with a "fixed" URL which is identical to the + * requested one, we must have found a broken symlink or some such. + * Do _not_ try to redirect this, it causes a loop! + */ + if (strcmp(bad, dirent.name) == 0) { + apr_dir_close(dir); + return OK; + } + + /* + * miscapitalization errors are checked first (like, e.g., lower case + * file, upper case request) + */ + else if (strcasecmp(bad, dirent.name) == 0) { + misspelled_file *sp_new; + + sp_new = (misspelled_file *) apr_array_push(candidates); + sp_new->name = apr_pstrdup(r->pool, dirent.name); + sp_new->quality = SP_MISCAPITALIZED; + } + + /* + * simple typing errors are checked next (like, e.g., + * missing/extra/transposed char) + */ + else if ((q = spdist(bad, dirent.name)) != SP_VERYDIFFERENT) { + misspelled_file *sp_new; + + sp_new = (misspelled_file *) apr_array_push(candidates); + sp_new->name = apr_pstrdup(r->pool, dirent.name); + sp_new->quality = q; + } + + /* + * The spdist() should have found the majority of the misspelled + * requests. It is of questionable use to continue looking for + * files with the same base name, but potentially of totally wrong + * type (index.html <-> index.db). + * I would propose to not set the WANT_BASENAME_MATCH define. + * 08-Aug-1997 + * + * However, Alexei replied giving some reasons to add it anyway: + * > Oh, by the way, I remembered why having the + * > extension-stripping-and-matching stuff is a good idea: + * > + * > If you're using MultiViews, and have a file named foobar.html, + * > which you refer to as "foobar", and someone tried to access + * > "Foobar", mod_speling won't find it, because it won't find + * > anything matching that spelling. With the extension-munging, + * > it would locate "foobar.html". Not perfect, but I ran into + * > that problem when I first wrote the module. + */ + else { +#ifdef WANT_BASENAME_MATCH + /* + * Okay... we didn't find anything. Now we take out the hard-core + * power tools. There are several cases here. Someone might have + * entered a wrong extension (.htm instead of .html or vice + * versa) or the document could be negotiated. At any rate, now + * we just compare stuff before the first dot. If it matches, we + * figure we got us a match. This can result in wrong things if + * there are files of different content types but the same prefix + * (e.g. foo.gif and foo.html) This code will pick the first one + * it finds. Better than a Not Found, though. + */ + int entloc = ap_ind(dirent.name, '.'); + if (entloc == -1) { + entloc = strlen(dirent.name); + } + + if ((dotloc == entloc) + && !strncasecmp(bad, dirent.name, dotloc)) { + misspelled_file *sp_new; + + sp_new = (misspelled_file *) apr_array_push(candidates); + sp_new->name = apr_pstrdup(r->pool, dirent.name); + sp_new->quality = SP_VERYDIFFERENT; + } +#endif + } + } + apr_dir_close(dir); + + if (candidates->nelts != 0) { + /* Wow... we found us a mispelling. Construct a fixed url */ + char *nuri; + const char *ref; + misspelled_file *variant = (misspelled_file *) candidates->elts; + int i; + + ref = apr_table_get(r->headers_in, "Referer"); + + qsort((void *) candidates->elts, candidates->nelts, + sizeof(misspelled_file), sort_by_quality); + + /* + * Conditions for immediate redirection: + * a) the first candidate was not found by stripping the suffix + * AND b) there exists only one candidate OR the best match is not + * ambiguous + * then return a redirection right away. + */ + if (variant[0].quality != SP_VERYDIFFERENT + && (candidates->nelts == 1 + || variant[0].quality != variant[1].quality)) { + + nuri = ap_escape_uri(r->pool, apr_pstrcat(r->pool, url, + variant[0].name, + r->path_info, NULL)); + if (r->parsed_uri.query) + nuri = apr_pstrcat(r->pool, nuri, "?", r->parsed_uri.query, NULL); + + apr_table_setn(r->headers_out, "Location", + ap_construct_url(r->pool, nuri, r)); + + ap_log_rerror(APLOG_MARK, APLOG_INFO, APR_SUCCESS, + r, + ref ? "Fixed spelling: %s to %s from %s" + : "Fixed spelling: %s to %s", + r->uri, nuri, ref); + + return HTTP_MOVED_PERMANENTLY; + } + /* + * Otherwise, a "[300] Multiple Choices" list with the variants is + * returned. + */ + else { + apr_pool_t *p; + apr_table_t *notes; + apr_pool_t *sub_pool; + apr_array_header_t *t; + apr_array_header_t *v; + + + if (r->main == NULL) { + p = r->pool; + notes = r->notes; + } + else { + p = r->main->pool; + notes = r->main->notes; + } + + if (apr_pool_create(&sub_pool, p) != APR_SUCCESS) + return DECLINED; + + t = apr_array_make(sub_pool, candidates->nelts * 8 + 8, + sizeof(char *)); + v = apr_array_make(sub_pool, candidates->nelts * 5, + sizeof(char *)); + + /* Generate the response text. */ + + *(const char **)apr_array_push(t) = + "The document name you requested ("; + *(const char **)apr_array_push(t) = ap_escape_html(sub_pool, r->uri); + *(const char **)apr_array_push(t) = + ") could not be found on this server.\n" + "However, we found documents with names similar " + "to the one you requested.

    " + "Available documents:\n

      \n"; + + for (i = 0; i < candidates->nelts; ++i) { + char *vuri; + const char *reason; + + reason = sp_reason_str[(int) (variant[i].quality)]; + /* The format isn't very neat... */ + vuri = apr_pstrcat(sub_pool, url, variant[i].name, r->path_info, + (r->parsed_uri.query != NULL) ? "?" : "", + (r->parsed_uri.query != NULL) + ? r->parsed_uri.query : "", + NULL); + *(const char **)apr_array_push(v) = "\""; + *(const char **)apr_array_push(v) = ap_escape_uri(sub_pool, vuri); + *(const char **)apr_array_push(v) = "\";\""; + *(const char **)apr_array_push(v) = reason; + *(const char **)apr_array_push(v) = "\""; + + *(const char **)apr_array_push(t) = "
    • "; + *(const char **)apr_array_push(t) = ap_escape_html(sub_pool, vuri); + *(const char **)apr_array_push(t) = " ("; + *(const char **)apr_array_push(t) = reason; + *(const char **)apr_array_push(t) = ")\n"; + + /* + * when we have printed the "close matches" and there are + * more "distant matches" (matched by stripping the suffix), + * then we insert an additional separator text to suggest + * that the user LOOK CLOSELY whether these are really the + * files she wanted. + */ + if (i > 0 && i < candidates->nelts - 1 + && variant[i].quality != SP_VERYDIFFERENT + && variant[i + 1].quality == SP_VERYDIFFERENT) { + *(const char **)apr_array_push(t) = + "
    \nFurthermore, the following related " + "documents were found:\n
      \n"; + } + } + *(const char **)apr_array_push(t) = "
    \n"; + + /* If we know there was a referring page, add a note: */ + if (ref != NULL) { + *(const char **)apr_array_push(t) = + "Please consider informing the owner of the " + "referring page " + "about the broken link.\n"; + } + + + /* Pass our apr_table_t to http_protocol.c (see mod_negotiation): */ + apr_table_setn(notes, "variant-list", apr_array_pstrcat(p, t, 0)); + + apr_table_mergen(r->subprocess_env, "VARIANTS", + apr_array_pstrcat(p, v, ',')); + + apr_pool_destroy(sub_pool); + + ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r, + ref ? "Spelling fix: %s: %d candidates from %s" + : "Spelling fix: %s: %d candidates", + r->uri, candidates->nelts, ref); + + return HTTP_MULTIPLE_CHOICES; + } + } + + return OK; +} + +static void register_hooks(apr_pool_t *p) +{ + ap_hook_fixups(check_speling,NULL,NULL,APR_HOOK_LAST); +} + +module AP_MODULE_DECLARE_DATA speling_module = +{ + STANDARD20_MODULE_STUFF, + create_mconfig_for_directory, /* create per-dir config */ + NULL, /* merge per-dir config */ + create_mconfig_for_server, /* server config */ + NULL, /* merge server config */ + speling_cmds, /* command apr_table_t */ + register_hooks /* register hooks */ +}; diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/mod_speling.dsp b/rubbos/app/httpd-2.0.64/modules/mappers/mod_speling.dsp new file mode 100644 index 00000000..46626b0c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/mappers/mod_speling.dsp @@ -0,0 +1,128 @@ +# Microsoft Developer Studio Project File - Name="mod_speling" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=mod_speling - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "mod_speling.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 "mod_speling.mak" CFG="mod_speling - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "mod_speling - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_speling - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "mod_speling - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_speling_src" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /out:"Release/mod_speling.so" /base:@..\..\os\win32\BaseAddr.ref,mod_speling.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Release/mod_speling.so" /base:@..\..\os\win32\BaseAddr.ref,mod_speling.so /opt:ref + +!ELSEIF "$(CFG)" == "mod_speling - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_speling_src" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_speling.so" /base:@..\..\os\win32\BaseAddr.ref,mod_speling.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_speling.so" /base:@..\..\os\win32\BaseAddr.ref,mod_speling.so + +!ENDIF + +# Begin Target + +# Name "mod_speling - Win32 Release" +# Name "mod_speling - Win32 Debug" +# Begin Source File + +SOURCE=.\mod_speling.c +# End Source File +# Begin Source File + +SOURCE=.\mod_speling.rc +# End Source File +# Begin Source File + +SOURCE=..\..\build\win32\win32ver.awk + +!IF "$(CFG)" == "mod_speling - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_speling.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_speling.so "speling_module for Apache" ../../include/ap_release.h > .\mod_speling.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "mod_speling - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_speling.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_speling.so "speling_module for Apache" ../../include/ap_release.h > .\mod_speling.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/mod_speling.exp b/rubbos/app/httpd-2.0.64/modules/mappers/mod_speling.exp new file mode 100644 index 00000000..a6ee8b50 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/mappers/mod_speling.exp @@ -0,0 +1 @@ +speling_module diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/mod_userdir.c b/rubbos/app/httpd-2.0.64/modules/mappers/mod_userdir.c new file mode 100644 index 00000000..b071b1a7 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/mappers/mod_userdir.c @@ -0,0 +1,366 @@ +/* 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. + */ + +/* + * mod_userdir... implement the UserDir command. Broken away from the + * Alias stuff for a couple of good and not-so-good reasons: + * + * 1) It shows a real minimal working example of how to do something like + * this. + * 2) I know people who are actually interested in changing this *particular* + * aspect of server functionality without changing the rest of it. That's + * what this whole modular arrangement is supposed to be good at... + * + * Modified by Alexei Kosut to support the following constructs + * (server running at www.foo.com, request for /~bar/one/two.html) + * + * UserDir public_html -> ~bar/public_html/one/two.html + * UserDir /usr/web -> /usr/web/bar/one/two.html + * UserDir /home/ * /www -> /home/bar/www/one/two.html + * NOTE: theses ^ ^ space only added allow it to work in a comment, ignore + * UserDir http://x/users -> (302) http://x/users/bar/one/two.html + * UserDir http://x/ * /y -> (302) http://x/bar/y/one/two.html + * NOTE: here also ^ ^ + * + * In addition, you can use multiple entries, to specify alternate + * user directories (a la Directory Index). For example: + * + * UserDir public_html /usr/web http://www.xyz.com/users + * + * Modified by Ken Coar to provide for the following: + * + * UserDir disable[d] username ... + * UserDir enable[d] username ... + * + * If "disabled" has no other arguments, *all* ~ references are + * disabled, except those explicitly turned on with the "enabled" keyword. + */ + +#include "apr_strings.h" +#include "apr_user.h" + +#define APR_WANT_STRFUNC +#include "apr_want.h" + +#if APR_HAVE_UNISTD_H +#include +#endif + +#include "ap_config.h" +#include "httpd.h" +#include "http_config.h" +#include "http_request.h" + +#if !defined(WIN32) && !defined(OS2) && !defined(BEOS) && !defined(NETWARE) +#define HAVE_UNIX_SUEXEC +#endif + +#ifdef HAVE_UNIX_SUEXEC +#include "unixd.h" /* Contains the suexec_identity hook used on Unix */ +#endif + + +/* The default directory in user's home dir */ +#ifndef DEFAULT_USER_DIR +#define DEFAULT_USER_DIR "public_html" +#endif + +module AP_MODULE_DECLARE_DATA userdir_module; + +typedef struct { + int globally_disabled; + char *userdir; + apr_table_t *enabled_users; + apr_table_t *disabled_users; +} userdir_config; + +/* + * Server config for this module: global disablement flag, a list of usernames + * ineligible for UserDir access, a list of those immune to global (but not + * explicit) disablement, and the replacement string for all others. + */ + +static void *create_userdir_config(apr_pool_t *p, server_rec *s) +{ + userdir_config *newcfg = apr_pcalloc(p, sizeof(*newcfg)); + + newcfg->globally_disabled = 0; + newcfg->userdir = DEFAULT_USER_DIR; + newcfg->enabled_users = apr_table_make(p, 4); + newcfg->disabled_users = apr_table_make(p, 4); + + return newcfg; +} + +#define O_DEFAULT 0 +#define O_ENABLE 1 +#define O_DISABLE 2 + +static const char *set_user_dir(cmd_parms *cmd, void *dummy, const char *arg) +{ + userdir_config *s_cfg = ap_get_module_config(cmd->server->module_config, + &userdir_module); + char *username; + const char *usernames = arg; + char *kw = ap_getword_conf(cmd->pool, &usernames); + apr_table_t *usertable; + + /* Since we are a raw argument, it is possible for us to be called with + * zero arguments. So that we aren't ambiguous, flat out reject this. + */ + if (*kw == '\0') { + return "UserDir requires an argument."; + } + + /* + * Let's do the comparisons once. + */ + if ((!strcasecmp(kw, "disable")) || (!strcasecmp(kw, "disabled"))) { + /* + * If there are no usernames specified, this is a global disable - we + * need do no more at this point than record the fact. + */ + if (strlen(usernames) == 0) { + s_cfg->globally_disabled = 1; + return NULL; + } + usertable = s_cfg->disabled_users; + } + else if ((!strcasecmp(kw, "enable")) || (!strcasecmp(kw, "enabled"))) { + /* + * The "disable" keyword can stand alone or take a list of names, but + * the "enable" keyword requires the list. Whinge if it doesn't have + * it. + */ + if (strlen(usernames) == 0) { + return "UserDir \"enable\" keyword requires a list of usernames"; + } + usertable = s_cfg->enabled_users; + } + else { + /* + * If the first (only?) value isn't one of our keywords, just copy + * the string to the userdir string. + */ + s_cfg->userdir = apr_pstrdup(cmd->pool, arg); + return NULL; + } + /* + * Now we just take each word in turn from the command line and add it to + * the appropriate table. + */ + while (*usernames) { + username = ap_getword_conf(cmd->pool, &usernames); + apr_table_setn(usertable, username, kw); + } + return NULL; +} + +static const command_rec userdir_cmds[] = { + AP_INIT_RAW_ARGS("UserDir", set_user_dir, NULL, RSRC_CONF, + "the public subdirectory in users' home directories, or " + "'disabled', or 'disabled username username...', or " + "'enabled username username...'"), + {NULL} +}; + +static int translate_userdir(request_rec *r) +{ + ap_conf_vector_t *server_conf; + const userdir_config *s_cfg; + char *name = r->uri; + const char *userdirs; + const char *w, *dname; + char *redirect; + apr_finfo_t statbuf; + + /* + * If the URI doesn't match our basic pattern, we've nothing to do with + * it. + */ + if (name[0] != '/' || name[1] != '~') { + return DECLINED; + } + server_conf = r->server->module_config; + s_cfg = ap_get_module_config(server_conf, &userdir_module); + userdirs = s_cfg->userdir; + if (userdirs == NULL) { + return DECLINED; + } + + dname = name + 2; + w = ap_getword(r->pool, &dname, '/'); + + /* + * The 'dname' funny business involves backing it up to capture the '/' + * delimiting the "/~user" part from the rest of the URL, in case there + * was one (the case where there wasn't being just "GET /~user HTTP/1.0", + * for which we don't want to tack on a '/' onto the filename). + */ + + if (dname[-1] == '/') { + --dname; + } + + /* + * If there's no username, it's not for us. Ignore . and .. as well. + */ + if (w[0] == '\0' || (w[1] == '.' && (w[2] == '\0' || (w[2] == '.' && w[3] == '\0')))) { + return DECLINED; + } + /* + * Nor if there's an username but it's in the disabled list. + */ + if (apr_table_get(s_cfg->disabled_users, w) != NULL) { + return DECLINED; + } + /* + * If there's a global interdiction on UserDirs, check to see if this + * name is one of the Blessed. + */ + if (s_cfg->globally_disabled + && apr_table_get(s_cfg->enabled_users, w) == NULL) { + return DECLINED; + } + + /* + * Special cases all checked, onward to normal substitution processing. + */ + + while (*userdirs) { + const char *userdir = ap_getword_conf(r->pool, &userdirs); + char *filename = NULL, *x = NULL; + apr_status_t rv; + int is_absolute = ap_os_is_path_absolute(r->pool, userdir); + + if (ap_strchr_c(userdir, '*')) + x = ap_getword(r->pool, &userdir, '*'); + + if (userdir[0] == '\0' || is_absolute) { + if (x) { +#ifdef HAVE_DRIVE_LETTERS + /* + * Crummy hack. Need to figure out whether we have been + * redirected to a URL or to a file on some drive. Since I + * know of no protocols that are a single letter, ignore + * a : as the first or second character, and assume a file + * was specified + */ + if (strchr(x + 2, ':')) +#else + if (strchr(x, ':') && !is_absolute) +#endif /* HAVE_DRIVE_LETTERS */ + { + redirect = apr_pstrcat(r->pool, x, w, userdir, dname, NULL); + apr_table_setn(r->headers_out, "Location", redirect); + return HTTP_MOVED_TEMPORARILY; + } + else + filename = apr_pstrcat(r->pool, x, w, userdir, NULL); + } + else + filename = apr_pstrcat(r->pool, userdir, "/", w, NULL); + } + else if (x && ap_strchr_c(x, ':')) { + redirect = apr_pstrcat(r->pool, x, w, dname, NULL); + apr_table_setn(r->headers_out, "Location", redirect); + return HTTP_MOVED_TEMPORARILY; + } + else { +#if APR_HAS_USER + char *homedir; + + if (apr_get_home_directory(&homedir, w, r->pool) == APR_SUCCESS) { + filename = apr_pstrcat(r->pool, homedir, "/", userdir, NULL); + } +#else + return DECLINED; +#endif + } + + /* + * Now see if it exists, or we're at the last entry. If we are at the + * last entry, then use the filename generated (if there is one) + * anyway, in the hope that some handler might handle it. This can be + * used, for example, to run a CGI script for the user. + */ + if (filename && (!*userdirs + || ((rv = apr_stat(&statbuf, filename, APR_FINFO_MIN, + r->pool)) == APR_SUCCESS + || rv == APR_INCOMPLETE))) { + r->filename = apr_pstrcat(r->pool, filename, dname, NULL); + /* XXX: Does this walk us around FollowSymLink rules? + * When statbuf contains info on r->filename we can save a syscall + * by copying it to r->finfo + */ + if (*userdirs && dname[0] == 0) + r->finfo = statbuf; + + /* For use in the get_suexec_identity phase */ + apr_table_setn(r->notes, "mod_userdir_user", w); + + return OK; + } + } + + return DECLINED; +} + +#ifdef HAVE_UNIX_SUEXEC +static ap_unix_identity_t *get_suexec_id_doer(const request_rec *r) +{ + ap_unix_identity_t *ugid = NULL; +#if APR_HAS_USER + const char *username = apr_table_get(r->notes, "mod_userdir_user"); + + if (username == NULL) { + return NULL; + } + + if ((ugid = apr_palloc(r->pool, sizeof(*ugid))) == NULL) { + return NULL; + } + + if (apr_get_userid(&ugid->uid, &ugid->gid, username, r->pool) != APR_SUCCESS) { + return NULL; + } + + ugid->userdir = 1; +#endif + return ugid; +} +#endif /* HAVE_UNIX_SUEXEC */ + +static void register_hooks(apr_pool_t *p) +{ + static const char * const aszPre[]={ "mod_alias.c",NULL }; + static const char * const aszSucc[]={ "mod_vhost_alias.c",NULL }; + + ap_hook_translate_name(translate_userdir,aszPre,aszSucc,APR_HOOK_MIDDLE); +#ifdef HAVE_UNIX_SUEXEC + ap_hook_get_suexec_identity(get_suexec_id_doer,NULL,NULL,APR_HOOK_FIRST); +#endif +} + +module AP_MODULE_DECLARE_DATA userdir_module = { + STANDARD20_MODULE_STUFF, + NULL, /* dir config creater */ + NULL, /* dir merger --- default is to override */ + create_userdir_config, /* server config */ + NULL, /* merge server config */ + userdir_cmds, /* command apr_table_t */ + register_hooks /* register hooks */ +}; diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/mod_userdir.dsp b/rubbos/app/httpd-2.0.64/modules/mappers/mod_userdir.dsp new file mode 100644 index 00000000..04c078b4 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/mappers/mod_userdir.dsp @@ -0,0 +1,128 @@ +# Microsoft Developer Studio Project File - Name="mod_userdir" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=mod_userdir - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "mod_userdir.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 "mod_userdir.mak" CFG="mod_userdir - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "mod_userdir - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_userdir - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "mod_userdir - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_userdir_src" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /out:"Release/mod_userdir.so" /base:@..\..\os\win32\BaseAddr.ref,mod_userdir.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Release/mod_userdir.so" /base:@..\..\os\win32\BaseAddr.ref,mod_userdir.so /opt:ref + +!ELSEIF "$(CFG)" == "mod_userdir - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_userdir_src" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_userdir.so" /base:@..\..\os\win32\BaseAddr.ref,mod_userdir.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_userdir.so" /base:@..\..\os\win32\BaseAddr.ref,mod_userdir.so + +!ENDIF + +# Begin Target + +# Name "mod_userdir - Win32 Release" +# Name "mod_userdir - Win32 Debug" +# Begin Source File + +SOURCE=.\mod_userdir.c +# End Source File +# Begin Source File + +SOURCE=.\mod_userdir.rc +# End Source File +# Begin Source File + +SOURCE=..\..\build\win32\win32ver.awk + +!IF "$(CFG)" == "mod_userdir - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_userdir.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_userdir.so "userdir_module for Apache" ../../include/ap_release.h > .\mod_userdir.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "mod_userdir - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_userdir.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_userdir.so "userdir_module for Apache" ../../include/ap_release.h > .\mod_userdir.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/mod_userdir.exp b/rubbos/app/httpd-2.0.64/modules/mappers/mod_userdir.exp new file mode 100644 index 00000000..6b8b81d5 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/mappers/mod_userdir.exp @@ -0,0 +1 @@ +userdir_module diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/mod_userdir.la b/rubbos/app/httpd-2.0.64/modules/mappers/mod_userdir.la new file mode 100644 index 00000000..2f7eeb0b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/mappers/mod_userdir.la @@ -0,0 +1,35 @@ +# mod_userdir.la - a libtool library file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='' + +# Names of this library. +library_names='' + +# The name of the static archive. +old_library='mod_userdir.a' + +# Libraries that this one depends upon. +dependency_libs=' -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib' + +# Version information for mod_userdir. +current= +age= +revision= + +# Is this an already installed library? +installed=no + +# Should we warn about portability when linking against -modules? +shouldnotlink=yes + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='' diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/mod_userdir.lo b/rubbos/app/httpd-2.0.64/modules/mappers/mod_userdir.lo new file mode 100644 index 00000000..445d354f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/mappers/mod_userdir.lo @@ -0,0 +1,12 @@ +# mod_userdir.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/mod_userdir.o' + +# Name of the non-PIC object. +non_pic_object='mod_userdir.o' + diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/mod_userdir.o b/rubbos/app/httpd-2.0.64/modules/mappers/mod_userdir.o new file mode 100644 index 0000000000000000000000000000000000000000..677c39d14766384e3401cb7efc063fdad3adcbda GIT binary patch literal 40624 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/mod_vhost_alias.c b/rubbos/app/httpd-2.0.64/modules/mappers/mod_vhost_alias.c new file mode 100644 index 00000000..cb798863 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/mappers/mod_vhost_alias.c @@ -0,0 +1,457 @@ +/* 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. + */ + +/* + * mod_vhost_alias.c: support for dynamically configured mass virtual hosting + * + * Copyright (c) 1998-1999 Demon Internet Ltd. + * + * This software was submitted by Demon Internet to the Apache Software Foundation + * in May 1999. Future revisions and derivatives of this source code + * must acknowledge Demon Internet as the original contributor of + * this module. All other licensing and usage conditions are those + * of the Apache Software Foundation. + * + * Originally written by Tony Finch . + * + * Implementation ideas were taken from mod_alias.c. The overall + * concept is derived from the OVERRIDE_DOC_ROOT/OVERRIDE_CGIDIR + * patch to Apache 1.3b3 and a similar feature in Demon's thttpd, + * both written by James Grinter . + */ + +#include "apr.h" +#include "apr_strings.h" +#include "apr_hooks.h" +#include "apr_lib.h" + +#define APR_WANT_STRFUNC +#include "apr_want.h" + +#include "httpd.h" +#include "http_config.h" +#include "http_core.h" +#include "http_request.h" /* for ap_hook_translate_name */ + + +module AP_MODULE_DECLARE_DATA vhost_alias_module; + + +/* + * basic configuration things + * we abbreviate "mod_vhost_alias" to "mva" for shorter names + */ + +typedef enum { + VHOST_ALIAS_UNSET, VHOST_ALIAS_NONE, VHOST_ALIAS_NAME, VHOST_ALIAS_IP +} mva_mode_e; + +/* + * Per-server module config record. + */ +typedef struct mva_sconf_t { + const char *doc_root; + const char *cgi_root; + mva_mode_e doc_root_mode; + mva_mode_e cgi_root_mode; +} mva_sconf_t; + +static void *mva_create_server_config(apr_pool_t *p, server_rec *s) +{ + mva_sconf_t *conf; + + conf = (mva_sconf_t *) apr_pcalloc(p, sizeof(mva_sconf_t)); + conf->doc_root = NULL; + conf->cgi_root = NULL; + conf->doc_root_mode = VHOST_ALIAS_UNSET; + conf->cgi_root_mode = VHOST_ALIAS_UNSET; + return conf; +} + +static void *mva_merge_server_config(apr_pool_t *p, void *parentv, void *childv) +{ + mva_sconf_t *parent = (mva_sconf_t *) parentv; + mva_sconf_t *child = (mva_sconf_t *) childv; + mva_sconf_t *conf; + + conf = (mva_sconf_t *) apr_pcalloc(p, sizeof(*conf)); + if (child->doc_root_mode == VHOST_ALIAS_UNSET) { + conf->doc_root_mode = parent->doc_root_mode; + conf->doc_root = parent->doc_root; + } + else { + conf->doc_root_mode = child->doc_root_mode; + conf->doc_root = child->doc_root; + } + if (child->cgi_root_mode == VHOST_ALIAS_UNSET) { + conf->cgi_root_mode = parent->cgi_root_mode; + conf->cgi_root = parent->cgi_root; + } + else { + conf->cgi_root_mode = child->cgi_root_mode; + conf->cgi_root = child->cgi_root; + } + return conf; +} + + +/* + * These are just here to tell us what vhost_alias_set should do. + * We don't put anything into them; we just use the cell addresses. + */ +static int vhost_alias_set_doc_root_ip, + vhost_alias_set_cgi_root_ip, + vhost_alias_set_doc_root_name, + vhost_alias_set_cgi_root_name; + +static const char *vhost_alias_set(cmd_parms *cmd, void *dummy, const char *map) +{ + mva_sconf_t *conf; + mva_mode_e mode, *pmode; + const char **pmap; + const char *p; + + conf = (mva_sconf_t *) ap_get_module_config(cmd->server->module_config, + &vhost_alias_module); + /* there ought to be a better way of doing this */ + if (&vhost_alias_set_doc_root_ip == cmd->info) { + mode = VHOST_ALIAS_IP; + pmap = &conf->doc_root; + pmode = &conf->doc_root_mode; + } + else if (&vhost_alias_set_cgi_root_ip == cmd->info) { + mode = VHOST_ALIAS_IP; + pmap = &conf->cgi_root; + pmode = &conf->cgi_root_mode; + } + else if (&vhost_alias_set_doc_root_name == cmd->info) { + mode = VHOST_ALIAS_NAME; + pmap = &conf->doc_root; + pmode = &conf->doc_root_mode; + } + else if (&vhost_alias_set_cgi_root_name == cmd->info) { + mode = VHOST_ALIAS_NAME; + pmap = &conf->cgi_root; + pmode = &conf->cgi_root_mode; + } + else { + return "INTERNAL ERROR: unknown command info"; + } + + if (!ap_os_is_path_absolute(cmd->pool, map)) { + if (strcasecmp(map, "none")) { + return "format string must be an absolute path, or 'none'"; + } + *pmap = NULL; + *pmode = VHOST_ALIAS_NONE; + return NULL; + } + + /* sanity check */ + p = map; + while (*p != '\0') { + if (*p++ != '%') { + continue; + } + /* we just found a '%' */ + if (*p == 'p' || *p == '%') { + ++p; + continue; + } + /* optional dash */ + if (*p == '-') { + ++p; + } + /* digit N */ + if (apr_isdigit(*p)) { + ++p; + } + else { + return "syntax error in format string"; + } + /* optional plus */ + if (*p == '+') { + ++p; + } + /* do we end here? */ + if (*p != '.') { + continue; + } + ++p; + /* optional dash */ + if (*p == '-') { + ++p; + } + /* digit M */ + if (apr_isdigit(*p)) { + ++p; + } + else { + return "syntax error in format string"; + } + /* optional plus */ + if (*p == '+') { + ++p; + } + } + *pmap = map; + *pmode = mode; + return NULL; +} + +static const command_rec mva_commands[] = +{ + AP_INIT_TAKE1("VirtualScriptAlias", vhost_alias_set, + &vhost_alias_set_cgi_root_name, RSRC_CONF, + "how to create a ScriptAlias based on the host"), + AP_INIT_TAKE1("VirtualDocumentRoot", vhost_alias_set, + &vhost_alias_set_doc_root_name, RSRC_CONF, + "how to create the DocumentRoot based on the host"), + AP_INIT_TAKE1("VirtualScriptAliasIP", vhost_alias_set, + &vhost_alias_set_cgi_root_ip, RSRC_CONF, + "how to create a ScriptAlias based on the host"), + AP_INIT_TAKE1("VirtualDocumentRootIP", vhost_alias_set, + &vhost_alias_set_doc_root_ip, RSRC_CONF, + "how to create the DocumentRoot based on the host"), + { NULL } +}; + + +/* + * This really wants to be a nested function + * but C is too feeble to support them. + */ +static APR_INLINE void vhost_alias_checkspace(request_rec *r, char *buf, + char **pdest, int size) +{ + /* XXX: what if size > HUGE_STRING_LEN? */ + if (*pdest + size > buf + HUGE_STRING_LEN) { + **pdest = '\0'; + if (r->filename) { + r->filename = apr_pstrcat(r->pool, r->filename, buf, NULL); + } + else { + r->filename = apr_pstrdup(r->pool, buf); + } + *pdest = buf; + } +} + +static void vhost_alias_interpolate(request_rec *r, const char *name, + const char *map, const char *uri) +{ + /* 0..9 9..0 */ + enum { MAXDOTS = 19 }; + const char *dots[MAXDOTS+1]; + int ndots; + + char buf[HUGE_STRING_LEN]; + char *dest, last; + + int N, M, Np, Mp, Nd, Md; + const char *start, *end; + + const char *p; + + ndots = 0; + dots[ndots++] = name-1; /* slightly naughty */ + for (p = name; *p; ++p){ + if (*p == '.' && ndots < MAXDOTS) { + dots[ndots++] = p; + } + } + dots[ndots] = p; + + r->filename = NULL; + + dest = buf; + last = '\0'; + while (*map) { + if (*map != '%') { + /* normal characters */ + vhost_alias_checkspace(r, buf, &dest, 1); + last = *dest++ = *map++; + continue; + } + /* we are in a format specifier */ + ++map; + /* can't be a slash */ + last = '\0'; + /* %% -> % */ + if (*map == '%') { + ++map; + vhost_alias_checkspace(r, buf, &dest, 1); + *dest++ = '%'; + continue; + } + /* port number */ + if (*map == 'p') { + ++map; + /* no. of decimal digits in a short plus one */ + vhost_alias_checkspace(r, buf, &dest, 7); + dest += apr_snprintf(dest, 7, "%d", ap_get_server_port(r)); + continue; + } + /* deal with %-N+.-M+ -- syntax is already checked */ + N = M = 0; /* value */ + Np = Mp = 0; /* is there a plus? */ + Nd = Md = 0; /* is there a dash? */ + if (*map == '-') ++map, Nd = 1; + N = *map++ - '0'; + if (*map == '+') ++map, Np = 1; + if (*map == '.') { + ++map; + if (*map == '-') { + ++map, Md = 1; + } + M = *map++ - '0'; + if (*map == '+') { + ++map, Mp = 1; + } + } + /* note that N and M are one-based indices, not zero-based */ + start = dots[0]+1; /* ptr to the first character */ + end = dots[ndots]; /* ptr to the character after the last one */ + if (N != 0) { + if (N > ndots) { + start = "_"; + end = start+1; + } + else if (!Nd) { + start = dots[N-1]+1; + if (!Np) { + end = dots[N]; + } + } + else { + if (!Np) { + start = dots[ndots-N]+1; + } + end = dots[ndots-N+1]; + } + } + if (M != 0) { + if (M > end - start) { + start = "_"; + end = start+1; + } + else if (!Md) { + start = start+M-1; + if (!Mp) { + end = start+1; + } + } + else { + if (!Mp) { + start = end-M; + } + end = end-M+1; + } + } + vhost_alias_checkspace(r, buf, &dest, end - start); + for (p = start; p < end; ++p) { + *dest++ = apr_tolower(*p); + } + } + *dest = '\0'; + /* no double slashes */ + if (last == '/') { + ++uri; + } + + if (r->filename) { + r->filename = apr_pstrcat(r->pool, r->filename, buf, uri, NULL); + } + else { + r->filename = apr_pstrcat(r->pool, buf, uri, NULL); + } +} + +static int mva_translate(request_rec *r) +{ + mva_sconf_t *conf; + const char *name, *map, *uri; + mva_mode_e mode; + const char *cgi; + + conf = (mva_sconf_t *) ap_get_module_config(r->server->module_config, + &vhost_alias_module); + cgi = NULL; + if (conf->cgi_root) { + cgi = strstr(r->uri, "cgi-bin/"); + if (cgi && (cgi != r->uri + strspn(r->uri, "/"))) { + cgi = NULL; + } + } + if (cgi) { + mode = conf->cgi_root_mode; + map = conf->cgi_root; + uri = cgi + strlen("cgi-bin"); + } + else if (r->uri[0] == '/') { + mode = conf->doc_root_mode; + map = conf->doc_root; + uri = r->uri; + } + else { + return DECLINED; + } + + if (mode == VHOST_ALIAS_NAME) { + name = ap_get_server_name(r); + } + else if (mode == VHOST_ALIAS_IP) { + name = r->connection->local_ip; + } + else { + return DECLINED; + } + + /* ### There is an optimization available here to determine the + * absolute portion of the path from the server config phase, + * through the first % segment, and note that portion of the path + * canonical_path buffer. + */ + r->canonical_filename = ""; + vhost_alias_interpolate(r, name, map, uri); + + if (cgi) { + /* see is_scriptaliased() in mod_cgi */ + r->handler = "cgi-script"; + apr_table_setn(r->notes, "alias-forced-type", r->handler); + } + + return OK; +} + +static void register_hooks(apr_pool_t *p) +{ + static const char * const aszPre[]={ "mod_alias.c","mod_userdir.c",NULL }; + + ap_hook_translate_name(mva_translate, aszPre, NULL, APR_HOOK_MIDDLE); +} + +module AP_MODULE_DECLARE_DATA vhost_alias_module = +{ + STANDARD20_MODULE_STUFF, + NULL, /* dir config creater */ + NULL, /* dir merger --- default is to override */ + mva_create_server_config, /* server config */ + mva_merge_server_config, /* merge server configs */ + mva_commands, /* command apr_table_t */ + register_hooks /* register hooks */ +}; + diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/mod_vhost_alias.dsp b/rubbos/app/httpd-2.0.64/modules/mappers/mod_vhost_alias.dsp new file mode 100644 index 00000000..3b322e23 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/mappers/mod_vhost_alias.dsp @@ -0,0 +1,128 @@ +# Microsoft Developer Studio Project File - Name="mod_vhost_alias" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=mod_vhost_alias - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "mod_vhost_alias.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 "mod_vhost_alias.mak" CFG="mod_vhost_alias - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "mod_vhost_alias - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_vhost_alias - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "mod_vhost_alias - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_vhost_alias_src" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /out:"Release/mod_vhost_alias.so" /base:@..\..\os\win32\BaseAddr.ref,mod_vhost_alias.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Release/mod_vhost_alias.so" /base:@..\..\os\win32\BaseAddr.ref,mod_vhost_alias.so /opt:ref + +!ELSEIF "$(CFG)" == "mod_vhost_alias - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_vhost_alias_src" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_vhost_alias.so" /base:@..\..\os\win32\BaseAddr.ref,mod_vhost_alias.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_vhost_alias.so" /base:@..\..\os\win32\BaseAddr.ref,mod_vhost_alias.so + +!ENDIF + +# Begin Target + +# Name "mod_vhost_alias - Win32 Release" +# Name "mod_vhost_alias - Win32 Debug" +# Begin Source File + +SOURCE=.\mod_vhost_alias.c +# End Source File +# Begin Source File + +SOURCE=.\mod_vhost_alias.rc +# End Source File +# Begin Source File + +SOURCE=..\..\build\win32\win32ver.awk + +!IF "$(CFG)" == "mod_vhost_alias - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_vhost_alias.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_vhost_alias.so "vhost_alias_module for Apache" ../../include/ap_release.h > .\mod_vhost_alias.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "mod_vhost_alias - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_vhost_alias.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_vhost_alias.so "vhost_alias_module for Apache" ../../include/ap_release.h > .\mod_vhost_alias.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/mod_vhost_alias.exp b/rubbos/app/httpd-2.0.64/modules/mappers/mod_vhost_alias.exp new file mode 100644 index 00000000..b17666fc --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/mappers/mod_vhost_alias.exp @@ -0,0 +1 @@ +vhost_alias_module diff --git a/rubbos/app/httpd-2.0.64/modules/mappers/modules.mk b/rubbos/app/httpd-2.0.64/modules/mappers/modules.mk new file mode 100644 index 00000000..8fb09eec --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/mappers/modules.mk @@ -0,0 +1,17 @@ +mod_negotiation.la: mod_negotiation.lo + $(MOD_LINK) mod_negotiation.lo $(MOD_NEGOTIATION_LDADD) +mod_dir.la: mod_dir.lo + $(MOD_LINK) mod_dir.lo $(MOD_DIR_LDADD) +mod_imap.la: mod_imap.lo + $(MOD_LINK) mod_imap.lo $(MOD_IMAP_LDADD) +mod_actions.la: mod_actions.lo + $(MOD_LINK) mod_actions.lo $(MOD_ACTIONS_LDADD) +mod_userdir.la: mod_userdir.lo + $(MOD_LINK) mod_userdir.lo $(MOD_USERDIR_LDADD) +mod_alias.la: mod_alias.lo + $(MOD_LINK) mod_alias.lo $(MOD_ALIAS_LDADD) +mod_so.la: mod_so.lo + $(MOD_LINK) mod_so.lo $(MOD_SO_LDADD) +DISTCLEAN_TARGETS = modules.mk +static = mod_negotiation.la mod_dir.la mod_imap.la mod_actions.la mod_userdir.la mod_alias.la mod_so.la +shared = diff --git a/rubbos/app/httpd-2.0.64/modules/metadata/.deps b/rubbos/app/httpd-2.0.64/modules/metadata/.deps new file mode 100644 index 00000000..e69de29b diff --git a/rubbos/app/httpd-2.0.64/modules/metadata/.indent.pro b/rubbos/app/httpd-2.0.64/modules/metadata/.indent.pro new file mode 100644 index 00000000..a9fbe9f9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/metadata/.indent.pro @@ -0,0 +1,54 @@ +-i4 -npsl -di0 -br -nce -d0 -cli0 -npcs -nfc1 +-TBUFF +-TFILE +-TTRANS +-TUINT4 +-T_trans +-Tallow_options_t +-Tapache_sfio +-Tarray_header +-Tbool_int +-Tbuf_area +-Tbuff_struct +-Tbuffy +-Tcmd_how +-Tcmd_parms +-Tcommand_rec +-Tcommand_struct +-Tconn_rec +-Tcore_dir_config +-Tcore_server_config +-Tdir_maker_func +-Tevent +-Tglobals_s +-Thandler_func +-Thandler_rec +-Tjoblist_s +-Tlisten_rec +-Tmerger_func +-Tmode_t +-Tmodule +-Tmodule_struct +-Tmutex +-Tn_long +-Tother_child_rec +-Toverrides_t +-Tparent_score +-Tpid_t +-Tpiped_log +-Tpool +-Trequest_rec +-Trequire_line +-Trlim_t +-Tscoreboard +-Tsemaphore +-Tserver_addr_rec +-Tserver_rec +-Tserver_rec_chain +-Tshort_score +-Ttable +-Ttable_entry +-Tthread +-Tu_wide_int +-Tvtime_t +-Twide_int diff --git a/rubbos/app/httpd-2.0.64/modules/metadata/.libs/mod_env.a b/rubbos/app/httpd-2.0.64/modules/metadata/.libs/mod_env.a new file mode 100644 index 0000000000000000000000000000000000000000..7b9b9591d91727ff5649963ff0bc1b9856b86980 GIT binary patch literal 37500 zcmbt-3w%`7@&CQMAuI$!AR&Z@vLIl5kOv7d@=OSUO^GDr0Vv|KB%5R<$)@|@VO6O3 zAjJo2wfK`Nty*oZmY-UyRusi|tMyUqTd7*LTCEnXw!VHdb7t<|Op@RK_y7IQNA8{Z zo;h>o%$YOi+?(BX%DhmlrDMVHLVw>pg>v43#JIrDxq;sIYkS|Jn&M{zz1y+H znzg-8SDt#%rN24Q`+V`Uje*|7f$e|u1$Lh83-o?OjYtKP+aK~3A6T>YVB4-h@8=}g z`=`Lpg@N-PzXy8`jH-UdbaWs9qHg__D{FfHRM}kF1RZ^LUls^MUte+uNvo#!p+N5& z#MV5zc$yEj)qoK-y=l{o(0K=HdLK?4yR&{oU}s0(dC#6bx%ib)lVR-8c;~!n+Yj1- z?GNXXY~_h-M{IqkX6FKT%i{t&SLcCi&O30nzxcylft`&o%98C5+t@m={h&1M8nN}Q zHEU~o4^^I8xwi7OgQF&ILt~oB=0NY)jW}$hxcBdY-h=ny#HDzzo3HYr8v?yAqRXhb z<`W$8b)feJaKm$;GOKpy3^6xxY+&bE<$>NuSncb9-Un-Y-!wpV|l5T}U1C$%jF19lP$G{n&+JTB@)mJ*q|Avr7 z)?(F%;_>S4jaFkgfw$)FxFJX@SNb=GVv*4L&ai)a+`lOl_b0ns!)=l7a4Yv6@^?n! z34gTB4=Xnki*|Q~yAw{UxIYo~_dq{*uUcADV1>E|6!dq8y2AcYcdI|zlZZsSL!F?b zGa2sR-sw*)Bi*rZS9D|8-xiB@`4b&s?91Ix!JwYP$?^_bo2o#$p(%Dy>VK+FD|pp! zS=iRHFh7{&hKO35mXrR ztho+(c8c77nuDH;q{nC;;!F44jI8OwXxQ&G^Ui}5ZuEL9zvqzkJr23@d?C~Rh&HfZ zw{b(J+$J*VlS+Z4F=Y+?uo=8UgC6?#k?0^pe|#AX)??^Twg8=G=ufktozFC$H1w;V zIE}w?HU5?w4+CW&X#WOe(hOtUpMxr&VLVimX9nggnhDZ0a$hl;XUGzC0_GuW*a#b8 zLucBn9D02I4xwv0U5C;Yaw(}A6_@}j4B7RRbUSL(eo$%9 zt>=RPxoGpKYl48$kVoxJxoFgN*w74Q)D2+}H!d3W3pCHTXw)y$fX*>(Zyg16o}u^U zf^YnWzO4uFd_&)XI*SZ_=Qlu?8~QG!D-3-P`ZZwady%d;^nFOLHuQm+K(90OgGhH6 z`k_`BN{@++bRUk3#`t2^XYUW;F=qV}r`U`)>&w(+WqpOT8CTZVNSm=_eS@?aOV+nY z=hITjvTS6E3}X{hZWs?S6^2P8CSaH$#MB!motV{z@!3;h6|OVPa62EE4#SL~b=6~- zEMgLd8DpOh7Hl?5E-l4vh8btqK+QRZ$+HVU+jhfDvKIie!!XnBOF?XxVG8W)fZ1)B zLSptBrihrE3{y~b`N9hh`r^CTYBZ)=1j(>b z)@W>wHN+3KMq`(lU5WRa-m`{2WAZg982a*$QI9nm6RjVNM@Tz0t6X9=CRaz9rFZ+qjBPx-y>~edCXI&*TnLer*ZvF8W|5+V_rfnexv4<;jo0} z8TvJJV}+p)A-&kpZ=qMsvK;fyU!ZNhHFnaNXOS8gk91pO{+I{4$!B9;!2JuR={Ts& zOv^qIt)&FT3C#>Dd)^07PvgtplnWwx(8%&y?&oJ5c zWMFuo%HGlh4L}zdo_*-oK*N8QmHp<2C~WArb3opBB>Vk;fO*Cv+5f=I<2N#&;t=x< z{nc7%TV&{Ou&;8q^m_*YOl>~dXFm-*^7gz)Bz5Yf~1@Fff&wTx^Dv1WIRkHP9lXv7R>uefTL22={}6lnuHqDeHqjc699H# z<&=9)2f`@HIni^OD9M@Y!R^;5$(c_TXv1o7g^9qNOFS=w^!V0D%*wgcLo-SJ=Uncg zsWi+Lo;N@$%P>Fk{Dpd>$Vm5L`*hz2aLw2a7x)h>y3X?z5Y$J0&OXnw3^C$1Pb$uH z?jXj*dCr~GA@^~YXZ#pwZ#uk(?DDhf8$7E(8>!xxlb!YpFvEzAP0Px520Je8SWv*K zC#2!PSoNedJg~9qDQTEK{6@i1#N-=hdKxB^BEuX@HRXmmK5aFOt->$`Y3QbaVM>Up zHB4C=`mEkC<;1Ku%>1X6=GYu1<@oY29cc^BE zVNOcJ$=_v|I%0Mkrh&xv8m5Vu>kYG#n48$WH+t>_kCJ3cK&oI9u#&4LXyy$Co@3X`dnVRQ`DL(?Lt(+IVI6rCjahu){wiX50Aq`VK4Sa~dK0_+Q>TL2MWM>*t<#z(q%bervBM=RQyMXmQv9cc?$; znFft~rlW^E=skAWqn;vQ*kO+o!w!3rn0(XbIS+bI97b!U+|;~G%sj)qN({U1b!rnZ zHHWB%z4In5snw?DFCIK^vU}d6nhsO*KDA-@d_pzsp2JkL&4>;2Vw%}um<+Eg1V?(y zU~s!lO_mpTpuL6}L(ENv$?>8E`wTOl=JYPZO!VT?Jz$t4sLf-B@e}j3VWtxEqG4u` zfd7rd%r%;bXKp2N70j(BF2LLxvcI0WwZt_s*J@(i_9tTzE2oXPbzIj$TnBR- zi0fgli@43qMTy(S+;_d-^TJ#*7x!X3TOQ+yv#9sg%$-LIX&rMHm}SM>C0^VkdYHS+ zEG*`JXjT?;yNTPu+||VGV(uF1Z@0&sN5;Zn8${Y~+J=xeXO6KgNSkxe*f7%NMy4I<3PYcs4c!I|-Gv)O{S>IQ z#`c(;HHz7|VKbRc8g^v8Jg%Yf>AuNu%`nFj+{My;xJ|-_3i%}6cN+LF-4}r1rxEAp z{tc58^_=_hp7GG>$d<%rEB7$wUNhp{f1U$*J8NXj%KeIR%J>#5*S0b7_(9hqxKB;X zxr_3t`$R>whx6IJ-itvl-FE=G0ux|0q^CUw2<-^|oT0RLnKd(vXv;7eX_)tYh8anl zXO>|`(dLP77w#p^AA?#t3XhvG1@=K2Ud6bhE(V&0H*Pu|Lkyjdv>D#G<50v*=(qx; z&4i9CM%r)WOH&8iapl<7Oz1dz^HB~qV3$YXxYF{D|0~e_9YM%{|MtO0GQ;RPoUR#W zNO@JCqFt!JC(pL;%Hho*&r8pe##ebm=<(6`DsQNb$I6A<~d|TifmfvpsRWv@|2r^w6bv?#sQT>7n~uO z2y}kB54)gxRF$gFp%6&-9VOMMUR8_CB9Xy<2a*xNHW5UtT!MI{08=gjl;SdP4bGb( z?|ukSvjX$(84u2&Fw47_>@)Ozw}OZX(YymVI1{3I529WZqInPh5Jo%6$UlZ{{jC3! zX`qwz7v=q9i=+QAlHAv)yAd{R|A{#3{~Y^b{a=tyBl9oJHu*3hd}EM}La2Zqm~#FK zoIE;h1vK4D^A@Wf#Dzz*`ET# zK^~!+dK1ds?jYZ24*~Pn!O(Cd6Hs*yJujsDt^}I=gk9v|DK`gGK8W5ZHQ1l2L4S$| zACPLaz*OUcgNBCyn1CG;3c$ZnbQRQ1KoGMtJly8aS_&NH4}M)h^Z@TaO|;|&ur&o{ zZY!p9LtfAUXu7W(uJkC3yFd8cJNmC3XaSyl-xgKuV$g-zKu=&;1g5_ zdm>yZ!pB$I8PFo#_fx{}foleC#}l*cBM$*Xz1frTX@O}!(mrFIJ>`ConT{^7PeqID z1rsc52Bup3R7`qDn<@;R8KGFaWv@l4d_sdLYsht|(~uz=7(@~%K8EBdCXs?wNyXlC z6|_9I2VT$8qZxq5ag}u;oY;=Hn}>M?INolui;lNf;HANyV_Enf&a$t>8I{t^guQ3_ zL{J=qYKl~V3&NJYn??^zA*K?ljlsR zS%Ecd%b7G}mXg2h*?aClTga7XqARh?!i#+-x)aN>O|!ZKiS?V zk9d3?xOhr2kw7*%*;VP;WWhv3aol!0D1eWXa0sO4@^QeOUT`kaLzoeoNWo}4hAf44 z{P%>ppwqH~!3zY|V{psBN3ja3FR?MzVKy;)eoB<0Y{WYlv^gk4Cr@+yG*w?7 z*{8}f=wVzZxv!zLAb> zIfxBoc1TS&vcp*uu;8H?7T!i=LyLJZhLIraGu@zUW}2N+J1QT9Cc)!%me>O6$+l~< zvClD6Kv5wy$sTJTJ>FnBLrD49aV{mfDcj(wCe<4pF`PjRL51VFj;)@6Y7w89?b0@B zHuZ1>D+Sq%jFA~5GSK!TN#76{4C$Mkk|`eohZvW7V5e{`xHF|;DvzGpAC=a}$J563 zVW$@Wi+;ng`)L+t3~^iuCm3Ly>B}#5F~_7@Vgyv={b&)5^Vn2#4@AXrz312vELSWV zUkpw-{s-sSmM8DhMR4evnNm;#fA?^yD1d%=GEqfgs#|1>jK*S`zG7kEbdWL?#Y&(C zrWt!JEr45}9%c`*inCFwtdxlpGQi3)Lvg0S%}@yzo@g*gjwoeWb6ti&^}H0ja6AU# zd^dm!78KYE$CLkt91Rkve4zu8%MDoJfFM_sZNN$g1W5y-+pH=#j>5P?x!_06u-I0! zkkBWUH0!Y4d@VE1&Ck>lzC%MHqYl(4WRjtQbx|G$iGUH;`QNP+Iy_k@ybl8Bj8glG2gfDYF67!+>qAlq$JzW8yNtgLj0y zm7#%MAq}r^8a4^}O9yHc(ygnh-xP_i^PPq(guKOpRto9XwW6P{eca%7r(v^@&oeae zfTZC)PQxZ4_d8ItkZxW52PC>4b{eh_@<|7364I?}@BxXmZ8Zq#ZrISz6EbWWg>C)s z2Xu(7{)mkAV4pcAXl@7F4>(&-|tfFg0d6mX>>pWobAtz+hV??e;XsW-imm~o;bWHmm(!|Q$Rao`V}Sq>5t5Ha?4~3CLr;4oz(P%gm8*wb8Ng&n`^HV}+6Kmd<2rxNviM zS+J~hW@n^3xp`)Lcd~GOBoVj%dy)7SmgtPEFKlmV>93@;pj>+BtE)SlfUgB4`hZs9 z`e-828SW0ZY={@elIzz;F52#|t{pnL>h}UY&!I*$ZCn6Y*#k!*@wkI0x#J;#Tf#0%l^O3G_sx}!9yEL^$I>W(8cN=R1 z??sR_9R^LUt0$P2P0`qfAPI4I>ytPR>9TaMcQ3JEd1SMIF3#L5p)QfN79{97KI8h9fa8Mcp?_*Zf76B<2)}P zcs+1~ZD)IXd~X-UiemFOZMqM2|GQ@Y zLhtC+-spF{qvvhEZ0SiS&z)a9r`GbMc`n7v_wka%%c>3A=gu#rnro4d<7GZx9_{qj z`U7~n)`L%7&lUKgxv zSlUP+2C%DrOSESTOhqV`ATv=tgix7<-<*L_z@*?;a4a4ae3{2Ru$E|77koJ<7z?*p z7>dwAcd#wg73tiPGH7+6vbnLTW@WY28Epx52C)kq27afHzvCB#FYUyG@I50^U<4rG zC}I;2-cf6KBXICtqeMqE4vm8Ckydm- zxT`0KYihtQ@jFP+7R)X)c6B9SeNm5_Vi6es`cOO!Lum*uu4%9!o)h42u%jgki@Dtb z_q1#vYs|U{u8&39L#^mvn)~2Jnlvz@wL1=8ibp#)LU%L;;PXT>9)vvXo{l7b+sfM9 z8R>%FTT??PJ1`2O!DuqklT7gXi^D`2OW}_gaVruJq6d=j{R;S#N3bUp>jJ+fV#yY8 z4SpjFJlz>-4Phh&TRKAUapX9zQecu8uARxQZmT=l6>Lj(w^-rML=fW$oN2t9B$u{E zlaP~OI2*$;@J=|2QwQHB!W@CQ&xCqsw7cDpUot}2%tce>vg+bl7Trq7tBrM4%PdHM z(HKUWwILkt34(zz*Il8_)Dpf_))oZ^_Jm{Z$itX`1+xKS4!+j~woqcRx^P4oB9sQL zZWuuvrVTDxrncHL-P0I4U>TbD+-y8< zCJcsS@-%b>q2)3F0)IVZmQA5pt4SvukC;gsf{SWlV!&0Ei_O}AAnAdv1(qLq4X4yZ zJQ_@S2W1zX+*I9|@-z;lx~i$BZaJ>KjTU`#&x$A4Lman+<8d6AMc%;mhhOu>ulsg{ zVFAU0(Qe2gII2#VVn{|XvAE(=JqK~xU|1LlxD3gem|tl5%N`7IVDZ`vb%GcvK<5{i zK?9t9nmEi`Juua<8al#|0Ay5+_0?6)wUv~;a3&?AW2cbjVTC1PmJ={EA)>F$D1)X?0U=&2pJa$U$AWB*B_9!m%iBk+9lvRdYD1R>T1EQ zupy8!Egi}34Ujc(q?^L6!OhUBBMS4&*_*=^r!WG^%dDR`dI5HF@Kgk{3a)!}a*uHr zC!&<9ZrBy#7W&vEO!5lme{95C5(Y9ZWm?Hl5e(GTErUSZoa~8%*Re6?3m7G)dO$F{ zK@P#iWP%uyEUik4#pbGI)lI>Zs+%eoS2k6`(IV7>;bW!t4_GKTPz$~vigO%{wzXjz z6-k(?IIJ${(49EZU~(G;66CSeb_BT-T}nAcraTtf6r>z$;#9IKB(IbafCTC+TFj*AjpcRA-HQ|FGU(2m zxPPG?W;t8Iw$4y{d=})ySf~p-hRuMM42_(26`BKpgRmBGrQx7Hssv9bss-Zix!m(Ruj3-B{Jr+&&Sl~gNpUzg9BXTKRHd>J$vIMQb zfi^E+MoBIeS7sN*jEO3Htau1zDOh2D2fxzhiJlDxlV(3J$LI?sVLza7qRD|>&iJ;^ z4uv_P1kV%BzG=15QU(QP$govI&{NnttHhmJpbBL10A$t^31Olz`!gP1FvMWFS{rHo zNbbjF4UUp66r6=-&;}#3nQ{VrojKMS!u;CRTCKA{Ab zLX`9|HPRi0lZ)Am&Cr981zL;2n{b%h69aFybVNE^VcuMEf&+|2z!F|(5%^~LW?ELfjhc|Qa5gOHq$LC?n{o=C z6dLM*RtT2ij`RMqa42*}<}I>A(YUq$LcS2OQWawEHKJR(SY|Md7?3ViWWLyDjd`*&qowDuaRm(qPv?J_Ia9fngEIi{=>tl_xMqgJIg3$o>4( zVvc^;5pBvi_i$LjNQ>fm7Z0NmI6s~N$5~7S6f!-Xk%ZMyxyroEfFBfq{R3YiLQ~i? zy5j9t8!Chg-BG2F8s? zWAmuh24{EK3FyhHW_e9h>Np*ThgwKB=7E~hBlc@%x}`IU&*N|+O+AwIz+<}e3ra1R zkTAMnWaj*qN)WIZX#a#Ulm(L*3PEQpww6{^&GF|quTOR-lIHc*%vnj|iq9@CEhs8I z#-Q-=UsLQe8Z3KrmOXLAP~R?iZJGt}B(BTmdp_KYm~O`VqRgxdJ%P-;^Szas{_Sa= z#hH1PnOTc7;bkFyR#-j-P=K;falU6sX5M!1(oFxF%)F}1tV$5X{?EmFDAVz>G&5^0 z;N?K>K_1H8c!9ny_Ecx)UF2Pq>Ax_oGBf}DAvKvr+tWQ)XXZoqPz553r0*B84U|f{ zVBa;^_u@={S7zQ~({}~d!C0|u!3&M262}8JZckg9S+rqzroW0t1)7&+obKYV0hEIH zmM%y{a8Ja{y+f#2xHD9cz}YV#l4iePJv<2&#G=Sxo8p4vzHB*58xd(5UY~4-nT7*L zK`YUr_3JTGSTjNRDCOqi5dzXL_J)R-W^@)|8dGus9sqEK6ySqm0le>=2~Q&MlFT#; zcLZS#!6x*7Eq+jdu7=mveM$v$`mZDyf9?XG<29eXc7s6IuQEUdzhuS_#b7@Wf>iK> zGgyv;e~81Y|32jax9jMGT9#k&Gk~X0rYn5c$p+ZWIQEZy=>GAukBI61^ECi6SkP8? zDFX(vS#A($X@8W$rM=v%p?;wD_1yo{s=e4R?Qxh$JMZ#Y-p@|i%e>tDLh!u_?gRPH zcZv~^^@{$(zNLSezc#?c7SqC953tfhemB}*HU!lJ^?!)_e|olQkNx8}1a$u~zy|7n zFC{I@xdHg{Y!i7e-!-F{r`Lbod8+ybN{{n5C2^cvIF&>e<^C=?<&C^`yUPe zbpO8w496sP0!bx~3k%9~W6WKyGJd%qfQo_IFR3vtj+KUdmv(Z0oZBlgtB2cbT-pi# zI=9#BPuf?g1~PtW{}K=b`LBZgcM}Vu|KLN^{rrbMRZ~PQ_VMTM-Xkt`QRa~EwCyOp zy1}&B#mXlDi#CY;vi^qwHcXA>HY;o0komonOxK3>szBg3``Z2TiFJALK>3$Vn%4Gdu z(1RJKfAP}F9|#w(_pS3TS2-=t8 zcpUg9iR7V{-;k&N`ekb9Wn`)$y-9HWT|!=*fsLsLXowM6ad^l4>xX|>Bu^lQxk&bg zrC13CaXfQ>g+F8pC4?Xp#PPXM@GB97g7^{ePw<~02nBKYa*~5TfFKmKM{+#!Pv8X# z%1?%WqUUo2p&;&ue}bpmz(7HK3j7ls;~Wd(ZuK*ud$tkk{&Int zm)(rZ^DoX9o~fkB+#!y;lDvBn8Nn~-bE@oIg1^HPh;xTU>@ggFrx+NNmv=r`Cw>q; zyEze@fR#`Lzlsf^@6@?){0%THcn-lL@&R-blv;Ch@bRp_QQ%C+X^$Y0I;tqLy~Vu0Hfp3M_} zpTak>J@{OJMaC88`Te7T9sCs@?;8q#j2FiH3O}ED$)BSCTpsT?O8$C0U_{fUh>yb~r zi=H_=VEN#?;J0&o`9gu>>t@jq~8{ndqv6L z#`E~D!oT44dsyMe@H+ig;XRzBGdS*~U;OntEaMaopQNO6l)`UkKb)xWDBJ1Yzc8l> zUZdpeSiWfx{A7iPc>T5xg7+x=U7nXS75)VCI~2Z?^U@C${yq2@E|$Ft$FHGcxn1F{ z2Da`S1brTdu1MbIL@;aF8omnZ^MRAj#2oVJg!28Kg;nn zTj7^*o}a7m_gPP+!e3+gr3!z9@skuT??W3EUd8dVM&TdwxY`sxhS$Y+6@CuK^O*|& z4)Yfbf?uw1iMMMNzJ~L_%?fYk_4ONt-@^Psg-hQ5gTlwLA6`-TUF?T<6~39*#bJei z#ddzH@U1ML!G4l>Tf+LsDg1nn&!ZH+pW~-c;peg+<|_Pg9@kQZU(M^HQQ_ZZex1UX zaK9TA9%6oz!q>4q+ZFyc=j}@rehvHWYK8xlMdldc*<3CsUi;Ul?aQulj zEC&_-4&zTN{A`ZH*A)H~`|SgTN16YJ!tv+uv3#TOf3Sas^L(NixL@P%{$j~hcqa3$ z3YYa2RroRN&odN0g4gf)3V)Q>(d7#NG4E?XQ@Ht&c+2`vg}=#q?p1gi>-j?AH?yD3 z|EnW)ZoiM^r|>w$KR;mk;}w1^=gAWW!K)N5`$e6?6Fe_#6#ga8U%SF@V}HgKem&dy z1BFL;eO;+=^V4jW^;3oK<9NGO;gh-FdlbHo{r0lLOW6KT6@Gy8(Z3ab3ioUCUHpF& z%b6c0PtDgSyspP7dBF=6-p>9pza^j2b1B>T9VP!3+u1w_9#Z(@%y%h#D(A5+3cruz z=RAeW^XH`s-@tzUvBJO4`S#}um+{`I@b@?#9vB3FMB!`MKhF$;zou~6um7s>2iOmv zDZGK#r_FZBykE`!8L9BIIA4ud_*C}KbcLVH{wY@YrJN_1D0~v<6Z0F@sW_?SIQ*xQ zm-zRvU1C4}Dl3*53cs24mndBHR482Z1Qq@VwqwH}_-2Lg;XHGm!jETru2Q(p}40+&@<1{v~;JoWft@^*c@BN3h?D6<)&l z0)_vcJ)w&?=Pn+{3f24h{Bh$o{b9M$n&*b;j5V6rSKQn&p%f9Q_SD2 z@Q--je=`XFkiuoXJfrXuUcav^{3!PG2MV9S{`o@T``Q0P*iSOQ9zH*eQFt4-hhNL0 zBJz(I);eC{^1~PN6rRrZ*C_nYoM%o}cr)jvHif^$d|csY@IH8rvt6 z|2G8hkrcj<`6m@F=aW|y{#%Z>cL%{gQ@G5#%!Bwjlh@rSo*%*S|89h3lENil9iwpB zr^*yA?^&u8-otTTukfF7ziSnK2j`K~6~2)Dze(X&bG|)S;YEBNxK!bC4!=g>Hm~2C z6@E0w)m;idpX2{wg(o;ZpH=u7%)g;MWCIAk98vi+kK4*$0W zDw7p1?+<4x{9;}ga~0mneyCA+7U$|zf*Vt+bQQ| z@xxu5x9?W+BUoPED~S9RZ0GYzekJ$&mck$7`T9iRa=!gm;gYvUa-2%PlIJHXT>gH4 zjKaU+eos*N$2`AF6h03-g0f-|e67Ow^Sne9o@D>4Qu2~Nb@H{s&*J zhCw-9;qo44qrxTcoulxV*bi4IT-NPR6dvSxxl!SAe!4~BHJn#(SNO4v->vX3`J8aS z!arg=A6EF~#tqi*6psHJS1ivcypH>QLE(3@{A&uoj`PV|3ZKIA?<@R%UZU$N%9kmMVp(aliEnm$+T4a5v;I#N9^iPe$C-Y_&thk$!b^Ev6BRD`KVRX$xYkcT_271_$ z6~2)NFk9gd@jT8|_)yM2l?o5=cmoRm4d?$xh0D3$+FrUvi$`uW5mvwiY!tsAJ zjpZ?g_psmosPHp*zW%K69o+BV6fQrGJd{7^EA!aN>+T4J|BBapzQV`VW^L+?xKzadQ12@&{e=*zbv~=V^tX z$N2Lu9QBKT-f-cl=O&ha+l8aN`0XPXj`F3PPYyFK{#nL)GVnwEPy`Pf)|$b%%;WpK zFBB>HZ7jdSC6E2C;(k}UaI{n6VVw&{dHfDNmZ-vCWjx`+-Tpb-g}e1^XI#ehA4a{k zSK&7>{%e;W)GwdMykynOC-j0<=BZITN|`B|JNr!X#ldkX5X%yZ$qqzPZ)(u4Y!@&35R zC6A^bB5BJy!zGXXp3VJkb>XPzHa;ixx^R?#g5@uE;V7TOe%S58Q9hUL`LPQ}`Mcz~ z&xND>dX~Ra;kPpWu)_b%_!BN1^~>j1|LDR|e-+#Lmcq9%{;|TJXZ$n9WnR7nU0BB8 zmx!PUJ{$=s$12><_z4P^-#<711L>5WQ&@h5l9$hUCmEMGeBN|xZB_DnS9$@m(LA;sqp96 z{_#gbV<@6WzDHBaIQjwmUBUg%SNJ20FH!injMphV!HaCQ!f#dd~;_xo^XOl~wLyGjSSMrlNuDTSyjPcD1kFfr8UHW-zCH)sE`QtDspxmnP z&sqOd3U9)JK>0}FPx1ac%um(M`B{E`eX_!T#m=6i@CUiyW`$pG)LK!6hxmNktMCgs zf8L?+sT_w-D0~M$7yQ;T1?Lz2#^TmngW&l6Tr66ihe3W|6G={Ji5~*t@&U(@#{DdS o)ht3tslxrtuT%Io=65Ju&Ix-Jeu(*36~33pnZ|dqNAk>n0laStPyhe` literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/modules/metadata/.libs/mod_env.la b/rubbos/app/httpd-2.0.64/modules/metadata/.libs/mod_env.la new file mode 100644 index 00000000..80d73dfa --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/metadata/.libs/mod_env.la @@ -0,0 +1,35 @@ +# mod_env.la - a libtool library file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='' + +# Names of this library. +library_names='' + +# The name of the static archive. +old_library='mod_env.a' + +# Libraries that this one depends upon. +dependency_libs=' -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib' + +# Version information for mod_env. +current= +age= +revision= + +# Is this an already installed library? +installed=no + +# Should we warn about portability when linking against -modules? +shouldnotlink=yes + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='' diff --git a/rubbos/app/httpd-2.0.64/modules/metadata/.libs/mod_env.o b/rubbos/app/httpd-2.0.64/modules/metadata/.libs/mod_env.o new file mode 100644 index 0000000000000000000000000000000000000000..b98d9d62ce407281c2308be9738bf074f3bc4a28 GIT binary patch literal 37352 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/modules/metadata/.libs/mod_setenvif.a b/rubbos/app/httpd-2.0.64/modules/metadata/.libs/mod_setenvif.a new file mode 100644 index 0000000000000000000000000000000000000000..6e6c84b66063a8bacbe3a44f59981c783e73d642 GIT binary patch literal 55920 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 E16WXs&;S4c literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/modules/metadata/.libs/mod_setenvif.la b/rubbos/app/httpd-2.0.64/modules/metadata/.libs/mod_setenvif.la new file mode 100644 index 00000000..6562d1dc --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/metadata/.libs/mod_setenvif.la @@ -0,0 +1,35 @@ +# mod_setenvif.la - a libtool library file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='' + +# Names of this library. +library_names='' + +# The name of the static archive. +old_library='mod_setenvif.a' + +# Libraries that this one depends upon. +dependency_libs=' -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib' + +# Version information for mod_setenvif. +current= +age= +revision= + +# Is this an already installed library? +installed=no + +# Should we warn about portability when linking against -modules? +shouldnotlink=yes + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='' diff --git a/rubbos/app/httpd-2.0.64/modules/metadata/.libs/mod_setenvif.o b/rubbos/app/httpd-2.0.64/modules/metadata/.libs/mod_setenvif.o new file mode 100644 index 0000000000000000000000000000000000000000..0f0fee97a9b7ce5dc159996af3ea6bd305c4206b GIT binary patch literal 55768 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 a&r-Oon|TVC^{Y(bvX0>Mt=;-1AO1hmX=|AP literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/modules/metadata/Makefile b/rubbos/app/httpd-2.0.64/modules/metadata/Makefile new file mode 100644 index 00000000..d90900c2 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/metadata/Makefile @@ -0,0 +1,8 @@ +top_srcdir = /bottlenecks/rubbos/app/httpd-2.0.64 +top_builddir = /bottlenecks/rubbos/app/httpd-2.0.64 +srcdir = /bottlenecks/rubbos/app/httpd-2.0.64/modules/metadata +builddir = /bottlenecks/rubbos/app/httpd-2.0.64/modules/metadata +VPATH = /bottlenecks/rubbos/app/httpd-2.0.64/modules/metadata + +include $(top_srcdir)/build/special.mk + diff --git a/rubbos/app/httpd-2.0.64/modules/metadata/Makefile.in b/rubbos/app/httpd-2.0.64/modules/metadata/Makefile.in new file mode 100644 index 00000000..167b343d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/metadata/Makefile.in @@ -0,0 +1,3 @@ + +include $(top_srcdir)/build/special.mk + diff --git a/rubbos/app/httpd-2.0.64/modules/metadata/NWGNUcernmeta b/rubbos/app/httpd-2.0.64/modules/metadata/NWGNUcernmeta new file mode 100644 index 00000000..9a642677 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/metadata/NWGNUcernmeta @@ -0,0 +1,248 @@ +# +# Make sure all needed macro's are defined +# + +# +# Get the 'head' of the build environment if necessary. This includes default +# targets and paths to tools +# + +ifndef EnvironmentDefined +include $(AP_WORK)\build\NWGNUhead.inc +endif + +# +# These directories will be at the beginning of the include list, followed by +# INCDIRS +# +XINCDIRS += \ + $(APR)/include \ + $(APRUTIL)/include \ + $(AP_WORK)/include \ + $(NWOS) \ + $(EOLIST) + +# +# These flags will come after CFLAGS +# +XCFLAGS += \ + $(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 = cernmeta + +# +# This is used by the link '-desc ' directive. +# If left blank, NLM_NAME will be used. +# +NLM_DESCRIPTION = Apache $(VERSION_STR) CERN Meta Module + +# +# This is used by the '-threadname' directive. If left blank, +# NLM_NAME Thread will be used. +# +NLM_THREAD_NAME = CERN Meta Module + +# +# 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 = 8192 + + +# +# If this is specified it will be used by the link '-entry' directive +# +NLM_ENTRY_SYM = _LibCPrelude + +# +# If this is specified it will be used by the link '-exit' directive +# +NLM_EXIT_SYM = _LibCPostlude + +# +# If this is specified it will be used by the link '-check' directive +# +NLM_CHECK_SYM = + +# +# If these are specified it will be used by the link '-flags' directive +# +NLM_FLAGS = AUTOUNLOAD, 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)/cernmeta.nlm \ + $(EOLIST) + +# +# If there is an LIB target, put it here +# +TARGET_lib = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the NLM target above. +# Paths must all use the '/' character +# +FILES_nlm_objs = \ + $(OBJDIR)/mod_cern_meta.o \ + $(EOLIST) + +# +# 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 = \ + libcpre.o \ + $(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 = \ + @$(APR)/aprlib.imp \ + @$(NWOS)/httpd.imp \ + @libc.imp \ + $(EOLIST) + +# +# Any symbols exported to here +# +FILES_nlm_exports = \ + cern_meta_module \ + $(EOLIST) + +# +# These are the OBJ files needed to create the LIB target above. +# Paths must all use the '/' character +# +FILES_lib_objs = \ + $(EOLIST) + +# +# 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) +# +install :: nlms FORCE + +# +# Any specialized rules here +# + +# +# Include the 'tail' makefile that has targets that depend on variables defined +# in this makefile +# + +include $(AP_WORK)\build\NWGNUtail.inc + + diff --git a/rubbos/app/httpd-2.0.64/modules/metadata/NWGNUexpires b/rubbos/app/httpd-2.0.64/modules/metadata/NWGNUexpires new file mode 100644 index 00000000..eacc10eb --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/metadata/NWGNUexpires @@ -0,0 +1,248 @@ +# +# Make sure all needed macro's are defined +# + +# +# Get the 'head' of the build environment if necessary. This includes default +# targets and paths to tools +# + +ifndef EnvironmentDefined +include $(AP_WORK)\build\NWGNUhead.inc +endif + +# +# These directories will be at the beginning of the include list, followed by +# INCDIRS +# +XINCDIRS += \ + $(APR)/include \ + $(APRUTIL)/include \ + $(AP_WORK)/include \ + $(NWOS) \ + $(EOLIST) + +# +# These flags will come after CFLAGS +# +XCFLAGS += \ + $(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 = expires + +# +# This is used by the link '-desc ' directive. +# If left blank, NLM_NAME will be used. +# +NLM_DESCRIPTION = Apache $(VERSION_STR) Expires Module + +# +# This is used by the '-threadname' directive. If left blank, +# NLM_NAME Thread will be used. +# +NLM_THREAD_NAME = Expires Module + +# +# 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 = 8192 + + +# +# If this is specified it will be used by the link '-entry' directive +# +NLM_ENTRY_SYM = _LibCPrelude + +# +# If this is specified it will be used by the link '-exit' directive +# +NLM_EXIT_SYM = _LibCPostlude + +# +# If this is specified it will be used by the link '-check' directive +# +NLM_CHECK_SYM = + +# +# If these are specified it will be used by the link '-flags' directive +# +NLM_FLAGS = AUTOUNLOAD, 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)/expires.nlm \ + $(EOLIST) + +# +# If there is an LIB target, put it here +# +TARGET_lib = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the NLM target above. +# Paths must all use the '/' character +# +FILES_nlm_objs = \ + $(OBJDIR)/mod_expires.o \ + $(EOLIST) + +# +# 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 = \ + libcpre.o \ + $(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 = \ + @$(APR)/aprlib.imp \ + @$(NWOS)/httpd.imp \ + @libc.imp \ + $(EOLIST) + +# +# Any symbols exported to here +# +FILES_nlm_exports = \ + expires_module \ + $(EOLIST) + +# +# These are the OBJ files needed to create the LIB target above. +# Paths must all use the '/' character +# +FILES_lib_objs = \ + $(EOLIST) + +# +# 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) +# +install :: nlms FORCE + +# +# Any specialized rules here +# + +# +# Include the 'tail' makefile that has targets that depend on variables defined +# in this makefile +# + +include $(AP_WORK)\build\NWGNUtail.inc + + diff --git a/rubbos/app/httpd-2.0.64/modules/metadata/NWGNUheaders b/rubbos/app/httpd-2.0.64/modules/metadata/NWGNUheaders new file mode 100644 index 00000000..def6d703 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/metadata/NWGNUheaders @@ -0,0 +1,248 @@ +# +# Make sure all needed macro's are defined +# + +# +# Get the 'head' of the build environment if necessary. This includes default +# targets and paths to tools +# + +ifndef EnvironmentDefined +include $(AP_WORK)\build\NWGNUhead.inc +endif + +# +# These directories will be at the beginning of the include list, followed by +# INCDIRS +# +XINCDIRS += \ + $(APR)/include \ + $(APRUTIL)/include \ + $(AP_WORK)/include \ + $(NWOS) \ + $(EOLIST) + +# +# These flags will come after CFLAGS +# +XCFLAGS += \ + $(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 = headers + +# +# This is used by the link '-desc ' directive. +# If left blank, NLM_NAME will be used. +# +NLM_DESCRIPTION = Apache $(VERSION_STR) Headers Module + +# +# This is used by the '-threadname' directive. If left blank, +# NLM_NAME Thread will be used. +# +NLM_THREAD_NAME = Headers Module + +# +# 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 = 8192 + + +# +# If this is specified it will be used by the link '-entry' directive +# +NLM_ENTRY_SYM = _LibCPrelude + +# +# If this is specified it will be used by the link '-exit' directive +# +NLM_EXIT_SYM = _LibCPostlude + +# +# If this is specified it will be used by the link '-check' directive +# +NLM_CHECK_SYM = + +# +# If these are specified it will be used by the link '-flags' directive +# +NLM_FLAGS = AUTOUNLOAD, 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)/headers.nlm \ + $(EOLIST) + +# +# If there is an LIB target, put it here +# +TARGET_lib = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the NLM target above. +# Paths must all use the '/' character +# +FILES_nlm_objs = \ + $(OBJDIR)/mod_headers.o \ + $(EOLIST) + +# +# 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 = \ + libcpre.o \ + $(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 = \ + @$(APR)/aprlib.imp \ + @$(NWOS)/httpd.imp \ + @libc.imp \ + $(EOLIST) + +# +# Any symbols exported to here +# +FILES_nlm_exports = \ + headers_module \ + $(EOLIST) + +# +# These are the OBJ files needed to create the LIB target above. +# Paths must all use the '/' character +# +FILES_lib_objs = \ + $(EOLIST) + +# +# 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) +# +install :: nlms FORCE + +# +# Any specialized rules here +# + +# +# Include the 'tail' makefile that has targets that depend on variables defined +# in this makefile +# + +include $(AP_WORK)\build\NWGNUtail.inc + + diff --git a/rubbos/app/httpd-2.0.64/modules/metadata/NWGNUmakefile b/rubbos/app/httpd-2.0.64/modules/metadata/NWGNUmakefile new file mode 100644 index 00000000..fe1ecf21 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/metadata/NWGNUmakefile @@ -0,0 +1,252 @@ +# +# Declare the sub-directories to be built here +# + +SUBDIRS = \ + $(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 += \ + $(EOLIST) + +# +# These flags will come after CFLAGS +# +XCFLAGS += \ + $(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 = + +# +# This is used by the link '-desc ' directive. +# If left blank, NLM_NAME will be used. +# +NLM_DESCRIPTION = + +# +# This is used by the '-threadname' directive. If left blank, +# NLM_NAME Thread will be used. +# +NLM_THREAD_NAME = + +# +# 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 = + + +# +# 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 = + +# +# If these are specified it will be used by the link '-flags' directive +# +NLM_FLAGS = + +# +# 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)/cernmeta.nlm \ + $(OBJDIR)/expires.nlm \ + $(OBJDIR)/headers.nlm \ + $(OBJDIR)/mimemagi.nlm \ + $(OBJDIR)/uniqueid.nlm \ + $(OBJDIR)/usertrk.nlm \ + $(OBJDIR)/modversion.nlm \ + $(EOLIST) + +# +# If there is an LIB target, put it here +# +TARGET_lib = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the NLM target above. +# Paths must all use the '/' character +# +FILES_nlm_objs = \ + $(EOLIST) + +# +# 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 = \ + $(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 = \ + $(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 = \ + $(EOLIST) + +# +# Any symbols exported to here +# +FILES_nlm_exports = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the LIB target above. +# Paths must all use the '/' character +# +FILES_lib_objs = \ + $(EOLIST) + +# +# 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) +# +install :: nlms FORCE + copy $(OBJDIR)\*.nlm $(INSTALL)\Apache2\modules\*.* + +# +# Any specialized rules here +# + +# +# Include the 'tail' makefile that has targets that depend on variables defined +# in this makefile +# + +include $(AP_WORK)\build\NWGNUtail.inc + + diff --git a/rubbos/app/httpd-2.0.64/modules/metadata/NWGNUmimemagi b/rubbos/app/httpd-2.0.64/modules/metadata/NWGNUmimemagi new file mode 100644 index 00000000..c2aa84da --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/metadata/NWGNUmimemagi @@ -0,0 +1,248 @@ +# +# Make sure all needed macro's are defined +# + +# +# Get the 'head' of the build environment if necessary. This includes default +# targets and paths to tools +# + +ifndef EnvironmentDefined +include $(AP_WORK)\build\NWGNUhead.inc +endif + +# +# These directories will be at the beginning of the include list, followed by +# INCDIRS +# +XINCDIRS += \ + $(APR)/include \ + $(APRUTIL)/include \ + $(AP_WORK)/include \ + $(NWOS) \ + $(EOLIST) + +# +# These flags will come after CFLAGS +# +XCFLAGS += \ + $(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 = mimemagi + +# +# This is used by the link '-desc ' directive. +# If left blank, NLM_NAME will be used. +# +NLM_DESCRIPTION = Apache $(VERSION_STR) Mime Magic Module + +# +# This is used by the '-threadname' directive. If left blank, +# NLM_NAME Thread will be used. +# +NLM_THREAD_NAME = CERN Meta Module + +# +# 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 = 8192 + + +# +# If this is specified it will be used by the link '-entry' directive +# +NLM_ENTRY_SYM = _LibCPrelude + +# +# If this is specified it will be used by the link '-exit' directive +# +NLM_EXIT_SYM = _LibCPostlude + +# +# If this is specified it will be used by the link '-check' directive +# +NLM_CHECK_SYM = + +# +# If these are specified it will be used by the link '-flags' directive +# +NLM_FLAGS = AUTOUNLOAD, 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)/mimemagi.nlm \ + $(EOLIST) + +# +# If there is an LIB target, put it here +# +TARGET_lib = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the NLM target above. +# Paths must all use the '/' character +# +FILES_nlm_objs = \ + $(OBJDIR)/mod_mime_magic.o \ + $(EOLIST) + +# +# 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 = \ + libcpre.o \ + $(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 = \ + @$(APR)/aprlib.imp \ + @$(NWOS)/httpd.imp \ + @libc.imp \ + $(EOLIST) + +# +# Any symbols exported to here +# +FILES_nlm_exports = \ + mime_magic_module \ + $(EOLIST) + +# +# These are the OBJ files needed to create the LIB target above. +# Paths must all use the '/' character +# +FILES_lib_objs = \ + $(EOLIST) + +# +# 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) +# +install :: nlms FORCE + +# +# Any specialized rules here +# + +# +# Include the 'tail' makefile that has targets that depend on variables defined +# in this makefile +# + +include $(AP_WORK)\build\NWGNUtail.inc + + diff --git a/rubbos/app/httpd-2.0.64/modules/metadata/NWGNUmodversion b/rubbos/app/httpd-2.0.64/modules/metadata/NWGNUmodversion new file mode 100644 index 00000000..fdece687 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/metadata/NWGNUmodversion @@ -0,0 +1,248 @@ +# +# Make sure all needed macro's are defined +# + +# +# Get the 'head' of the build environment if necessary. This includes default +# targets and paths to tools +# + +ifndef EnvironmentDefined +include $(AP_WORK)\build\NWGNUhead.inc +endif + +# +# These directories will be at the beginning of the include list, followed by +# INCDIRS +# +XINCDIRS += \ + $(APR)/include \ + $(APRUTIL)/include \ + $(AP_WORK)/include \ + $(NWOS) \ + $(EOLIST) + +# +# These flags will come after CFLAGS +# +XCFLAGS += \ + $(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 = modversion + +# +# This is used by the link '-desc ' directive. +# If left blank, NLM_NAME will be used. +# +NLM_DESCRIPTION = Apache $(VERSION_STR) Version Module + +# +# This is used by the '-threadname' directive. If left blank, +# NLM_NAME Thread will be used. +# +NLM_THREAD_NAME = Version Module + +# +# 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 = 8192 + + +# +# If this is specified it will be used by the link '-entry' directive +# +NLM_ENTRY_SYM = _LibCPrelude + +# +# If this is specified it will be used by the link '-exit' directive +# +NLM_EXIT_SYM = _LibCPostlude + +# +# If this is specified it will be used by the link '-check' directive +# +NLM_CHECK_SYM = + +# +# If these are specified it will be used by the link '-flags' directive +# +NLM_FLAGS = AUTOUNLOAD, 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 = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the NLM target above. +# Paths must all use the '/' character +# +FILES_nlm_objs = \ + $(OBJDIR)/mod_version.o \ + $(EOLIST) + +# +# 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 = \ + libcpre.o \ + $(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 = \ + @$(APR)/aprlib.imp \ + @$(NWOS)/httpd.imp \ + @libc.imp \ + $(EOLIST) + +# +# Any symbols exported to here +# +FILES_nlm_exports = \ + version_module \ + $(EOLIST) + +# +# These are the OBJ files needed to create the LIB target above. +# Paths must all use the '/' character +# +FILES_lib_objs = \ + $(EOLIST) + +# +# 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) +# +install :: nlms FORCE + +# +# Any specialized rules here +# + +# +# Include the 'tail' makefile that has targets that depend on variables defined +# in this makefile +# + +include $(AP_WORK)\build\NWGNUtail.inc + + diff --git a/rubbos/app/httpd-2.0.64/modules/metadata/NWGNUuniqueid b/rubbos/app/httpd-2.0.64/modules/metadata/NWGNUuniqueid new file mode 100644 index 00000000..02917f5b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/metadata/NWGNUuniqueid @@ -0,0 +1,254 @@ +# +# Make sure all needed macro's are defined +# + +# +# Get the 'head' of the build environment if necessary. This includes default +# targets and paths to tools +# + +ifndef EnvironmentDefined +include $(AP_WORK)\build\NWGNUhead.inc +endif + +# +# These directories will be at the beginning of the include list, followed by +# INCDIRS +# +XINCDIRS += \ + $(APR)/include \ + $(APRUTIL)/include \ + $(AP_WORK)/include \ + $(NWOS) \ + $(EOLIST) + +# +# These flags will come after CFLAGS +# +XCFLAGS += \ + $(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 = uniqueid + +# +# This is used by the link '-desc ' directive. +# If left blank, NLM_NAME will be used. +# +NLM_DESCRIPTION = Apache $(VERSION_STR) Unique ID Module + +# +# This is used by the '-threadname' directive. If left blank, +# NLM_NAME Thread will be used. +# +NLM_THREAD_NAME = Unique ID Module + +# +# 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 = 8192 + + +# +# If this is specified it will be used by the link '-entry' directive +# +NLM_ENTRY_SYM = _LibCPrelude + +# +# If this is specified it will be used by the link '-exit' directive +# +NLM_EXIT_SYM = _LibCPostlude + +# +# If this is specified it will be used by the link '-check' directive +# +NLM_CHECK_SYM = + +# +# If these are specified it will be used by the link '-flags' directive +# +NLM_FLAGS = AUTOUNLOAD, 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)/uniqueid.nlm \ + $(EOLIST) + +# +# If there is an LIB target, put it here +# +TARGET_lib = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the NLM target above. +# Paths must all use the '/' character +# +FILES_nlm_objs = \ + $(OBJDIR)/mod_unique_id.o \ + $(OBJDIR)/libprews.o \ + $(EOLIST) + +# +# 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 = \ + libcpre.o \ + $(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 = \ + @$(APR)/aprlib.imp \ + @$(NWOS)/httpd.imp \ + @libc.imp \ + @ws2nlm.imp \ + $(EOLIST) + +# +# Any symbols exported to here +# +FILES_nlm_exports = \ + unique_id_module \ + $(EOLIST) + +# +# These are the OBJ files needed to create the LIB target above. +# Paths must all use the '/' character +# +FILES_lib_objs = \ + $(EOLIST) + +# +# 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) +# +install :: nlms FORCE + +# +# Any specialized rules here +# + +$(OBJDIR)/%.o: ../arch/netware/%.c $(OBJDIR)\$(NLM_NAME)_cc.opt + @echo compiling $< + $(CC) $< -o=$(OBJDIR)\$(@F) @$(OBJDIR)\$(NLM_NAME)_cc.opt + +# +# Include the 'tail' makefile that has targets that depend on variables defined +# in this makefile +# + +include $(AP_WORK)\build\NWGNUtail.inc + + diff --git a/rubbos/app/httpd-2.0.64/modules/metadata/NWGNUusertrk b/rubbos/app/httpd-2.0.64/modules/metadata/NWGNUusertrk new file mode 100644 index 00000000..49ee8f84 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/metadata/NWGNUusertrk @@ -0,0 +1,248 @@ +# +# Make sure all needed macro's are defined +# + +# +# Get the 'head' of the build environment if necessary. This includes default +# targets and paths to tools +# + +ifndef EnvironmentDefined +include $(AP_WORK)\build\NWGNUhead.inc +endif + +# +# These directories will be at the beginning of the include list, followed by +# INCDIRS +# +XINCDIRS += \ + $(APR)/include \ + $(APRUTIL)/include \ + $(AP_WORK)/include \ + $(NWOS) \ + $(EOLIST) + +# +# These flags will come after CFLAGS +# +XCFLAGS += \ + $(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 = usertrk + +# +# This is used by the link '-desc ' directive. +# If left blank, NLM_NAME will be used. +# +NLM_DESCRIPTION = Apache $(VERSION_STR) User Track Module + +# +# This is used by the '-threadname' directive. If left blank, +# NLM_NAME Thread will be used. +# +NLM_THREAD_NAME = User Track Module + +# +# 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 = 8192 + + +# +# If this is specified it will be used by the link '-entry' directive +# +NLM_ENTRY_SYM = _LibCPrelude + +# +# If this is specified it will be used by the link '-exit' directive +# +NLM_EXIT_SYM = _LibCPostlude + +# +# If this is specified it will be used by the link '-check' directive +# +NLM_CHECK_SYM = + +# +# If these are specified it will be used by the link '-flags' directive +# +NLM_FLAGS = AUTOUNLOAD, 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)/usertrk.nlm \ + $(EOLIST) + +# +# If there is an LIB target, put it here +# +TARGET_lib = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the NLM target above. +# Paths must all use the '/' character +# +FILES_nlm_objs = \ + $(OBJDIR)/mod_usertrack.o \ + $(EOLIST) + +# +# 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 = \ + libcpre.o \ + $(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 = \ + @$(APR)/aprlib.imp \ + @$(NWOS)/httpd.imp \ + @libc.imp \ + $(EOLIST) + +# +# Any symbols exported to here +# +FILES_nlm_exports = \ + usertrack_module \ + $(EOLIST) + +# +# These are the OBJ files needed to create the LIB target above. +# Paths must all use the '/' character +# +FILES_lib_objs = \ + $(EOLIST) + +# +# 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) +# +install :: nlms FORCE + +# +# Any specialized rules here +# + +# +# Include the 'tail' makefile that has targets that depend on variables defined +# in this makefile +# + +include $(AP_WORK)\build\NWGNUtail.inc + + diff --git a/rubbos/app/httpd-2.0.64/modules/metadata/config.m4 b/rubbos/app/httpd-2.0.64/modules/metadata/config.m4 new file mode 100644 index 00000000..3fc1b2ce --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/metadata/config.m4 @@ -0,0 +1,24 @@ +dnl modules enabled in this directory by default + +dnl APACHE_MODULE(name, helptext[, objects[, structname[, default[, config]]]]) + +APACHE_MODPATH_INIT(metadata) + +APACHE_MODULE(env, clearing/setting of ENV vars, , , yes) +APACHE_MODULE(mime_magic, automagically determining MIME type) +APACHE_MODULE(cern_meta, CERN-type meta files) +APACHE_MODULE(expires, Expires header control, , , most) +APACHE_MODULE(headers, HTTP header control, , , most) + +APACHE_MODULE(usertrack, user-session tracking, , , , [ + AC_CHECK_HEADERS(sys/times.h) + AC_CHECK_FUNCS(times) +]) + +APACHE_MODULE(unique_id, per-request unique ids) +APACHE_MODULE(setenvif, basing ENV vars on headers, , , yes) +APACHE_MODULE(version, determining httpd version in config files) + +APR_ADDTO(LT_LDFLAGS,-export-dynamic) + +APACHE_MODPATH_FINISH diff --git a/rubbos/app/httpd-2.0.64/modules/metadata/mod_cern_meta.c b/rubbos/app/httpd-2.0.64/modules/metadata/mod_cern_meta.c new file mode 100644 index 00000000..18bf1c0b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/metadata/mod_cern_meta.c @@ -0,0 +1,372 @@ +/* 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. + */ + +/* + * mod_cern_meta.c + * version 0.1.0 + * status beta + * + * Andrew Wilson 25.Jan.96 + * + * *** IMPORTANT *** + * This version of mod_cern_meta.c controls Meta File behaviour on a + * per-directory basis. Previous versions of the module defined behaviour + * on a per-server basis. The upshot is that you'll need to revisit your + * configuration files in order to make use of the new module. + * *** + * + * Emulate the CERN HTTPD Meta file semantics. Meta files are HTTP + * headers that can be output in addition to the normal range of + * headers for each file accessed. They appear rather like the Apache + * .asis files, and are able to provide a crude way of influencing + * the Expires: header, as well as providing other curiosities. + * There are many ways to manage meta information, this one was + * chosen because there is already a large number of CERN users + * who can exploit this module. It should be noted that there are probably + * more sensitive ways of managing the Expires: header specifically. + * + * The module obeys the following directives, which can appear + * in the server's .conf files and in .htaccess files. + * + * MetaFiles + * + * turns on|off meta file processing for any directory. + * Default value is off + * + * # turn on MetaFiles in this directory + * MetaFiles on + * + * MetaDir + * + * specifies the name of the directory in which Apache can find + * meta information files. The directory is usually a 'hidden' + * subdirectory of the directory that contains the file being + * accessed. eg: + * + * # .meta files are in the *same* directory as the + * # file being accessed + * MetaDir . + * + * the default is to look in a '.web' subdirectory. This is the + * same as for CERN 3.+ webservers and behaviour is the same as + * for the directive: + * + * MetaDir .web + * + * MetaSuffix + * + * specifies the file name suffix for the file containing the + * meta information. eg: + * + * # our meta files are suffixed with '.cern_meta' + * MetaSuffix .cern_meta + * + * the default is to look for files with the suffix '.meta'. This + * behaviour is the same as for the directive: + * + * MetaSuffix .meta + * + * When accessing the file + * + * DOCUMENT_ROOT/somedir/index.html + * + * this module will look for the file + * + * DOCUMENT_ROOT/somedir/.web/index.html.meta + * + * and will use its contents to generate additional MIME header + * information. + * + * For more information on the CERN Meta file semantics see: + * + * http://www.w3.org/hypertext/WWW/Daemon/User/Config/General.html#MetaDir + * + * Change-log: + * 29.Jan.96 pfopen/pfclose instead of fopen/fclose + * DECLINE when real file not found, we may be checking each + * of the index.html/index.shtml/index.htm variants and don't + * need to report missing ones as spurious errors. + * 31.Jan.96 log_error reports about a malformed .meta file, rather + * than a script error. + * 20.Jun.96 MetaFiles default off, added, so that module + * can be configured per-directory. Prior to this the module + * was running for each request anywhere on the server, naughty.. + * 29.Jun.96 All directives made per-directory. + */ + +#include "apr.h" +#include "apr_strings.h" + +#define APR_WANT_STRFUNC +#include "apr_want.h" + +#if APR_HAVE_SYS_TYPES_H +#include +#endif + +#include "ap_config.h" +#include "httpd.h" +#include "http_config.h" +#include "util_script.h" +#include "http_log.h" +#include "http_request.h" +#include "http_protocol.h" +#include "apr_lib.h" + +#define DIR_CMD_PERMS OR_INDEXES + +#define DEFAULT_METADIR ".web" +#define DEFAULT_METASUFFIX ".meta" +#define DEFAULT_METAFILES 0 + +module AP_MODULE_DECLARE_DATA cern_meta_module; + +typedef struct { + const char *metadir; + const char *metasuffix; + int metafiles; +} cern_meta_dir_config; + +static void *create_cern_meta_dir_config(apr_pool_t *p, char *dummy) +{ + cern_meta_dir_config *new = + (cern_meta_dir_config *) apr_palloc(p, sizeof(cern_meta_dir_config)); + + new->metadir = NULL; + new->metasuffix = NULL; + new->metafiles = DEFAULT_METAFILES; + + return new; +} + +static void *merge_cern_meta_dir_configs(apr_pool_t *p, void *basev, void *addv) +{ + cern_meta_dir_config *base = (cern_meta_dir_config *) basev; + cern_meta_dir_config *add = (cern_meta_dir_config *) addv; + cern_meta_dir_config *new = + (cern_meta_dir_config *) apr_palloc(p, sizeof(cern_meta_dir_config)); + + new->metadir = add->metadir ? add->metadir : base->metadir; + new->metasuffix = add->metasuffix ? add->metasuffix : base->metasuffix; + new->metafiles = add->metafiles; + + return new; +} + +static const char *set_metadir(cmd_parms *parms, void *in_dconf, const char *arg) +{ + cern_meta_dir_config *dconf = in_dconf; + + dconf->metadir = arg; + return NULL; +} + +static const char *set_metasuffix(cmd_parms *parms, void *in_dconf, const char *arg) +{ + cern_meta_dir_config *dconf = in_dconf; + + dconf->metasuffix = arg; + return NULL; +} + +static const char *set_metafiles(cmd_parms *parms, void *in_dconf, int arg) +{ + cern_meta_dir_config *dconf = in_dconf; + + dconf->metafiles = arg; + return NULL; +} + + +static const command_rec cern_meta_cmds[] = +{ + AP_INIT_FLAG("MetaFiles", set_metafiles, NULL, DIR_CMD_PERMS, + "Limited to 'on' or 'off'"), + AP_INIT_TAKE1("MetaDir", set_metadir, NULL, DIR_CMD_PERMS, + "the name of the directory containing meta files"), + AP_INIT_TAKE1("MetaSuffix", set_metasuffix, NULL, DIR_CMD_PERMS, + "the filename suffix for meta files"), + {NULL} +}; + +/* XXX: this is very similar to ap_scan_script_header_err_core... + * are the differences deliberate, or just a result of bit rot? + */ +static int scan_meta_file(request_rec *r, apr_file_t *f) +{ + char w[MAX_STRING_LEN]; + char *l; + int p; + apr_table_t *tmp_headers; + + tmp_headers = apr_table_make(r->pool, 5); + while (apr_file_gets(w, MAX_STRING_LEN - 1, f) == APR_SUCCESS) { + + /* Delete terminal (CR?)LF */ + + p = strlen(w); + if (p > 0 && w[p - 1] == '\n') { + if (p > 1 && w[p - 2] == '\015') + w[p - 2] = '\0'; + else + w[p - 1] = '\0'; + } + + if (w[0] == '\0') { + return OK; + } + + /* if we see a bogus header don't ignore it. Shout and scream */ + + if (!(l = strchr(w, ':'))) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "malformed header in meta file: %s", r->filename); + return HTTP_INTERNAL_SERVER_ERROR; + } + + *l++ = '\0'; + while (*l && apr_isspace(*l)) + ++l; + + if (!strcasecmp(w, "Content-type")) { + char *tmp; + /* Nuke trailing whitespace */ + + char *endp = l + strlen(l) - 1; + while (endp > l && apr_isspace(*endp)) + *endp-- = '\0'; + + tmp = apr_pstrdup(r->pool, l); + ap_content_type_tolower(tmp); + ap_set_content_type(r, tmp); + } + else if (!strcasecmp(w, "Status")) { + sscanf(l, "%d", &r->status); + r->status_line = apr_pstrdup(r->pool, l); + } + else { + apr_table_set(tmp_headers, w, l); + } + } + apr_table_overlap(r->headers_out, tmp_headers, APR_OVERLAP_TABLES_SET); + return OK; +} + +static int add_cern_meta_data(request_rec *r) +{ + char *metafilename; + char *leading_slash; + char *last_slash; + char *real_file; + char *scrap_book; + apr_file_t *f = NULL; + apr_status_t retcode; + cern_meta_dir_config *dconf; + int rv; + request_rec *rr; + + dconf = ap_get_module_config(r->per_dir_config, &cern_meta_module); + + if (!dconf->metafiles) { + return DECLINED; + }; + + /* if ./.web/$1.meta exists then output 'asis' */ + + if (r->finfo.filetype == 0) { + return DECLINED; + }; + + /* is this a directory? */ + if (r->finfo.filetype == APR_DIR || r->uri[strlen(r->uri) - 1] == '/') { + return DECLINED; + }; + + /* what directory is this file in? */ + scrap_book = apr_pstrdup(r->pool, r->filename); + + leading_slash = strchr(scrap_book, '/'); + last_slash = strrchr(scrap_book, '/'); + if ((last_slash != NULL) && (last_slash != leading_slash)) { + /* skip over last slash */ + real_file = last_slash; + real_file++; + *last_slash = '\0'; + } + else { + /* no last slash, buh?! */ + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "internal error in mod_cern_meta: %s", r->filename); + /* should really barf, but hey, let's be friends... */ + return DECLINED; + }; + + metafilename = apr_pstrcat(r->pool, scrap_book, "/", + dconf->metadir ? dconf->metadir : DEFAULT_METADIR, + "/", real_file, + dconf->metasuffix ? dconf->metasuffix : DEFAULT_METASUFFIX, + NULL); + + /* It sucks to require this subrequest to complete, because this + * means people must leave their meta files accessible to the world. + * A better solution might be a "safe open" feature of pfopen to avoid + * pipes, symlinks, and crap like that. + * + * In fact, this doesn't suck. Because blocks are never run + * against sub_req_lookup_file, the meta can be somewhat protected by + * either masking it with a directive or alias, or stowing + * the file outside of the web document tree, while providing the + * appropriate directory blocks to allow access to it as a file. + */ + rr = ap_sub_req_lookup_file(metafilename, r, NULL); + if (rr->status != HTTP_OK) { + ap_destroy_sub_req(rr); + return DECLINED; + } + ap_destroy_sub_req(rr); + + retcode = apr_file_open(&f, metafilename, APR_READ, APR_OS_DEFAULT, r->pool); + if (retcode != APR_SUCCESS) { + if (APR_STATUS_IS_ENOENT(retcode)) { + return DECLINED; + } + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "meta file permissions deny server access: %s", metafilename); + return HTTP_FORBIDDEN; + }; + + /* read the headers in */ + rv = scan_meta_file(r, f); + apr_file_close(f); + + return rv; +} + +static void register_hooks(apr_pool_t *p) +{ + ap_hook_fixups(add_cern_meta_data,NULL,NULL,APR_HOOK_MIDDLE); +} + +module AP_MODULE_DECLARE_DATA cern_meta_module = +{ + STANDARD20_MODULE_STUFF, + create_cern_meta_dir_config,/* dir config creater */ + merge_cern_meta_dir_configs,/* dir merger --- default is to override */ + NULL, /* server config */ + NULL, /* merge server configs */ + cern_meta_cmds, /* command apr_table_t */ + register_hooks /* register hooks */ +}; diff --git a/rubbos/app/httpd-2.0.64/modules/metadata/mod_cern_meta.dsp b/rubbos/app/httpd-2.0.64/modules/metadata/mod_cern_meta.dsp new file mode 100644 index 00000000..c50e9085 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/metadata/mod_cern_meta.dsp @@ -0,0 +1,128 @@ +# Microsoft Developer Studio Project File - Name="mod_cern_meta" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=mod_cern_meta - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "mod_cern_meta.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 "mod_cern_meta.mak" CFG="mod_cern_meta - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "mod_cern_meta - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_cern_meta - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "mod_cern_meta - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_cern_meta_src" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /out:"Release/mod_cern_meta.so" /base:@..\..\os\win32\BaseAddr.ref,mod_cern_meta.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Release/mod_cern_meta.so" /base:@..\..\os\win32\BaseAddr.ref,mod_cern_meta.so /opt:ref + +!ELSEIF "$(CFG)" == "mod_cern_meta - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_cern_meta_src" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_cern_meta.so" /base:@..\..\os\win32\BaseAddr.ref,mod_cern_meta.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_cern_meta.so" /base:@..\..\os\win32\BaseAddr.ref,mod_cern_meta.so + +!ENDIF + +# Begin Target + +# Name "mod_cern_meta - Win32 Release" +# Name "mod_cern_meta - Win32 Debug" +# Begin Source File + +SOURCE=.\mod_cern_meta.c +# End Source File +# Begin Source File + +SOURCE=.\mod_cern_meta.rc +# End Source File +# Begin Source File + +SOURCE=..\..\build\win32\win32ver.awk + +!IF "$(CFG)" == "mod_cern_meta - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_cern_meta.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_cern_meta.so "cern_meta_module for Apache" ../../include/ap_release.h > .\mod_cern_meta.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "mod_cern_meta - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_cern_meta.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_cern_meta.so "cern_meta_module for Apache" ../../include/ap_release.h > .\mod_cern_meta.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/modules/metadata/mod_cern_meta.exp b/rubbos/app/httpd-2.0.64/modules/metadata/mod_cern_meta.exp new file mode 100644 index 00000000..d36e2be6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/metadata/mod_cern_meta.exp @@ -0,0 +1 @@ +cern_meta_module diff --git a/rubbos/app/httpd-2.0.64/modules/metadata/mod_env.c b/rubbos/app/httpd-2.0.64/modules/metadata/mod_env.c new file mode 100644 index 00000000..9ce1ccbc --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/metadata/mod_env.c @@ -0,0 +1,179 @@ +/* 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. + */ + +#include "apr.h" +#include "apr_strings.h" + +#if APR_HAVE_STDLIB_H +#include +#endif + +#include "ap_config.h" +#include "httpd.h" +#include "http_config.h" +#include "http_request.h" +#include "http_log.h" + +typedef struct { + apr_table_t *vars; + apr_table_t *unsetenv; +} env_dir_config_rec; + +module AP_MODULE_DECLARE_DATA env_module; + +static void *create_env_dir_config(apr_pool_t *p, char *dummy) +{ + env_dir_config_rec *conf = apr_palloc(p, sizeof(*conf)); + + conf->vars = apr_table_make(p, 10); + conf->unsetenv = apr_table_make(p, 10); + + return conf; +} + +static void *merge_env_dir_configs(apr_pool_t *p, void *basev, void *addv) +{ + env_dir_config_rec *base = basev; + env_dir_config_rec *add = addv; + env_dir_config_rec *res = apr_palloc(p, sizeof(*res)); + + const apr_table_entry_t *elts; + const apr_array_header_t *arr; + + int i; + + /* + * res->vars = copy_table( p, base->vars ); + * foreach $unsetenv ( @add->unsetenv ) + * table_unset( res->vars, $unsetenv ); + * foreach $element ( @add->vars ) + * table_set( res->vars, $element.key, $element.val ); + * + * add->unsetenv already removed the vars from add->vars, + * if they preceeded the UnsetEnv directive. + */ + res->vars = apr_table_copy(p, base->vars); + res->unsetenv = NULL; + + arr = apr_table_elts(add->unsetenv); + if (arr) { + elts = (const apr_table_entry_t *)arr->elts; + + for (i = 0; i < arr->nelts; ++i) { + apr_table_unset(res->vars, elts[i].key); + } + } + + arr = apr_table_elts(add->vars); + if (arr) { + elts = (const apr_table_entry_t *)arr->elts; + + for (i = 0; i < arr->nelts; ++i) { + apr_table_setn(res->vars, elts[i].key, elts[i].val); + } + } + + return res; +} + +static const char *add_env_module_vars_passed(cmd_parms *cmd, void *sconf_, + const char *arg) +{ + env_dir_config_rec *sconf = sconf_; + apr_table_t *vars = sconf->vars; + const char *env_var; + + env_var = getenv(arg); + if (env_var != NULL) { + apr_table_setn(vars, arg, apr_pstrdup(cmd->pool, env_var)); + } + else { + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, cmd->server, + "PassEnv variable %s was undefined", arg); + } + + return NULL; +} + +static const char *add_env_module_vars_set(cmd_parms *cmd, void *sconf_, + const char *name, const char *value) +{ + env_dir_config_rec *sconf = sconf_; + + /* name is mandatory, value is optional. no value means + * set the variable to an empty string + */ + apr_table_setn(sconf->vars, name, value ? value : ""); + + return NULL; +} + +static const char *add_env_module_vars_unset(cmd_parms *cmd, void *sconf_, + const char *arg) +{ + env_dir_config_rec *sconf = sconf_; + + /* Always UnsetEnv FOO in the same context as {Set,Pass}Env FOO + * only if this UnsetEnv follows the {Set,Pass}Env. The merge + * will only apply unsetenv to the parent env (main server). + */ + apr_table_set(sconf->unsetenv, arg, NULL); + apr_table_unset(sconf->vars, arg); + + return NULL; +} + +static const command_rec env_module_cmds[] = +{ +AP_INIT_ITERATE("PassEnv", add_env_module_vars_passed, NULL, + OR_FILEINFO, "a list of environment variables to pass to CGI."), +AP_INIT_TAKE12("SetEnv", add_env_module_vars_set, NULL, + OR_FILEINFO, "an environment variable name and optional value to pass to CGI."), +AP_INIT_ITERATE("UnsetEnv", add_env_module_vars_unset, NULL, + OR_FILEINFO, "a list of variables to remove from the CGI environment."), + {NULL}, +}; + +static int fixup_env_module(request_rec *r) +{ + apr_table_t *e = r->subprocess_env; + env_dir_config_rec *sconf = ap_get_module_config(r->per_dir_config, + &env_module); + apr_table_t *vars = sconf->vars; + + if (!apr_table_elts(sconf->vars)->nelts) + return DECLINED; + + r->subprocess_env = apr_table_overlay(r->pool, e, vars); + + return OK; +} + +static void register_hooks(apr_pool_t *p) +{ + ap_hook_fixups(fixup_env_module, NULL, NULL, APR_HOOK_MIDDLE); +} + +module AP_MODULE_DECLARE_DATA env_module = +{ + STANDARD20_MODULE_STUFF, + create_env_dir_config, /* dir config creater */ + merge_env_dir_configs, /* dir merger --- default is to override */ + NULL, /* server config */ + NULL, /* merge server configs */ + env_module_cmds, /* command apr_table_t */ + register_hooks /* register hooks */ +}; diff --git a/rubbos/app/httpd-2.0.64/modules/metadata/mod_env.dsp b/rubbos/app/httpd-2.0.64/modules/metadata/mod_env.dsp new file mode 100644 index 00000000..9a841cb6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/metadata/mod_env.dsp @@ -0,0 +1,128 @@ +# Microsoft Developer Studio Project File - Name="mod_env" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=mod_env - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "mod_env.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 "mod_env.mak" CFG="mod_env - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "mod_env - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_env - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "mod_env - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_env_src" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /out:"Release/mod_env.so" /base:@..\..\os\win32\BaseAddr.ref,mod_env.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Release/mod_env.so" /base:@..\..\os\win32\BaseAddr.ref,mod_env.so /opt:ref + +!ELSEIF "$(CFG)" == "mod_env - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_env_src" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_env.so" /base:@..\..\os\win32\BaseAddr.ref,mod_env.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_env.so" /base:@..\..\os\win32\BaseAddr.ref,mod_env.so + +!ENDIF + +# Begin Target + +# Name "mod_env - Win32 Release" +# Name "mod_env - Win32 Debug" +# Begin Source File + +SOURCE=.\mod_env.c +# End Source File +# Begin Source File + +SOURCE=.\mod_env.rc +# End Source File +# Begin Source File + +SOURCE=..\..\build\win32\win32ver.awk + +!IF "$(CFG)" == "mod_env - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_env.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_env.so "env_module for Apache" ../../include/ap_release.h > .\mod_env.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "mod_env - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_env.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_env.so "env_module for Apache" ../../include/ap_release.h > .\mod_env.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/modules/metadata/mod_env.exp b/rubbos/app/httpd-2.0.64/modules/metadata/mod_env.exp new file mode 100644 index 00000000..b487bf09 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/metadata/mod_env.exp @@ -0,0 +1 @@ +env_module diff --git a/rubbos/app/httpd-2.0.64/modules/metadata/mod_env.la b/rubbos/app/httpd-2.0.64/modules/metadata/mod_env.la new file mode 100644 index 00000000..80d73dfa --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/metadata/mod_env.la @@ -0,0 +1,35 @@ +# mod_env.la - a libtool library file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='' + +# Names of this library. +library_names='' + +# The name of the static archive. +old_library='mod_env.a' + +# Libraries that this one depends upon. +dependency_libs=' -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib' + +# Version information for mod_env. +current= +age= +revision= + +# Is this an already installed library? +installed=no + +# Should we warn about portability when linking against -modules? +shouldnotlink=yes + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='' diff --git a/rubbos/app/httpd-2.0.64/modules/metadata/mod_env.lo b/rubbos/app/httpd-2.0.64/modules/metadata/mod_env.lo new file mode 100644 index 00000000..134c2b05 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/metadata/mod_env.lo @@ -0,0 +1,12 @@ +# mod_env.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/mod_env.o' + +# Name of the non-PIC object. +non_pic_object='mod_env.o' + diff --git a/rubbos/app/httpd-2.0.64/modules/metadata/mod_env.o b/rubbos/app/httpd-2.0.64/modules/metadata/mod_env.o new file mode 100644 index 0000000000000000000000000000000000000000..b98d9d62ce407281c2308be9738bf074f3bc4a28 GIT binary patch literal 37352 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/modules/metadata/mod_expires.c b/rubbos/app/httpd-2.0.64/modules/metadata/mod_expires.c new file mode 100644 index 00000000..7c2b78a5 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/metadata/mod_expires.c @@ -0,0 +1,566 @@ +/* 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. + */ + +/* + * mod_expires.c + * version 0.0.11 + * status beta + * + * Andrew Wilson 26.Jan.96 + * + * This module allows you to control the form of the Expires: header + * that Apache issues for each access. Directives can appear in + * configuration files or in .htaccess files so expiry semantics can + * be defined on a per-directory basis. + * + * DIRECTIVE SYNTAX + * + * Valid directives are: + * + * ExpiresActive on | off + * ExpiresDefault + * ExpiresByType type/encoding + * + * Valid values for are: + * + * 'M' expires header shows file modification date + + * 'A' expires header shows access time + + * + * [I'm not sure which of these is best under different + * circumstances, I guess it's for other people to explore. + * The effects may be indistinguishable for a number of cases] + * + * should be an integer value [acceptable to atoi()] + * + * There is NO space between the and . + * + * For example, a directory which contains information which changes + * frequently might contain: + * + * # reports generated by cron every hour. don't let caches + * # hold onto stale information + * ExpiresDefault M3600 + * + * Another example, our html pages can change all the time, the gifs + * tend not to change often: + * + * # pages are hot (1 week), images are cold (1 month) + * ExpiresByType text/html A604800 + * ExpiresByType image/gif A2592000 + * + * Expires can be turned on for all URLs on the server by placing the + * following directive in a conf file: + * + * ExpiresActive on + * + * ExpiresActive can also appear in .htaccess files, enabling the + * behaviour to be turned on or off for each chosen directory. + * + * # turn off Expires behaviour in this directory + * # and subdirectories + * ExpiresActive off + * + * Directives defined for a directory are valid in subdirectories + * unless explicitly overridden by new directives in the subdirectory + * .htaccess files. + * + * ALTERNATIVE DIRECTIVE SYNTAX + * + * Directives can also be defined in a more readable syntax of the form: + * + * ExpiresDefault " [plus] { }*" + * ExpiresByType type/encoding " [plus] { }*" + * + * where is one of: + * access + * now equivalent to 'access' + * modification + * + * where the 'plus' keyword is optional + * + * where should be an integer value [acceptable to atoi()] + * + * where is one of: + * years + * months + * weeks + * days + * hours + * minutes + * seconds + * + * For example, any of the following directives can be used to make + * documents expire 1 month after being accessed, by default: + * + * ExpiresDefault "access plus 1 month" + * ExpiresDefault "access plus 4 weeks" + * ExpiresDefault "access plus 30 days" + * + * The expiry time can be fine-tuned by adding several ' ' + * clauses: + * + * ExpiresByType text/html "access plus 1 month 15 days 2 hours" + * ExpiresByType image/gif "modification plus 5 hours 3 minutes" + * + * --- + * + * Change-log: + * 29.Jan.96 Hardened the add_* functions. Server will now bail out + * if bad directives are given in the conf files. + * 02.Feb.96 Returns DECLINED if not 'ExpiresActive on', giving other + * expires-aware modules a chance to play with the same + * directives. [Michael Rutman] + * 03.Feb.96 Call tzset() before localtime(). Trying to get the module + * to work properly in non GMT timezones. + * 12.Feb.96 Modified directive syntax to allow more readable commands: + * ExpiresDefault "now plus 10 days 20 seconds" + * ExpiresDefault "access plus 30 days" + * ExpiresDefault "modification plus 1 year 10 months 30 days" + * 13.Feb.96 Fix call to table_get() with NULL 2nd parameter [Rob Hartill] + * 19.Feb.96 Call gm_timestr_822() to get time formatted correctly, can't + * rely on presence of HTTP_TIME_FORMAT in Apache 1.1+. + * 21.Feb.96 This version (0.0.9) reverses assumptions made in 0.0.8 + * about star/star handlers. Reverting to 0.0.7 behaviour. + * 08.Jun.96 allows ExpiresDefault to be used with responses that use + * the DefaultType by not DECLINING, but instead skipping + * the table_get check and then looking for an ExpiresDefault. + * [Rob Hartill] + * 04.Nov.96 'const' definitions added. + * + * TODO + * add support for Cache-Control: max-age=20 from the HTTP/1.1 + * proposal (in this case, a ttl of 20 seconds) [ask roy] + * add per-file expiry and explicit expiry times - duplicates some + * of the mod_cern_meta.c functionality. eg: + * ExpiresExplicit index.html "modification plus 30 days" + * + * BUGS + * Hi, welcome to the internet. + */ + +#include "apr.h" +#include "apr_strings.h" +#include "apr_lib.h" + +#define APR_WANT_STRFUNC +#include "apr_want.h" + +#include "ap_config.h" +#include "httpd.h" +#include "http_config.h" +#include "http_log.h" +#include "http_request.h" +#include "http_protocol.h" + +typedef struct { + int active; + int wildcards; + char *expiresdefault; + apr_table_t *expiresbytype; +} expires_dir_config; + +/* from mod_dir, why is this alias used? + */ +#define DIR_CMD_PERMS OR_INDEXES + +#define ACTIVE_ON 1 +#define ACTIVE_OFF 0 +#define ACTIVE_DONTCARE 2 + +module AP_MODULE_DECLARE_DATA expires_module; + +static void *create_dir_expires_config(apr_pool_t *p, char *dummy) +{ + expires_dir_config *new = + (expires_dir_config *) apr_pcalloc(p, sizeof(expires_dir_config)); + new->active = ACTIVE_DONTCARE; + new->wildcards = 0; + new->expiresdefault = NULL; + new->expiresbytype = apr_table_make(p, 4); + return (void *) new; +} + +static const char *set_expiresactive(cmd_parms *cmd, void *in_dir_config, int arg) +{ + expires_dir_config *dir_config = in_dir_config; + + /* if we're here at all it's because someone explicitly + * set the active flag + */ + dir_config->active = ACTIVE_ON; + if (arg == 0) { + dir_config->active = ACTIVE_OFF; + } + return NULL; +} + +/* check_code() parse 'code' and return NULL or an error response + * string. If we return NULL then real_code contains code converted + * to the cnnnn format. + */ +static char *check_code(apr_pool_t *p, const char *code, char **real_code) +{ + char *word; + char base = 'X'; + int modifier = 0; + int num = 0; + int factor = 0; + + /* 0.0.4 compatibility? + */ + if ((code[0] == 'A') || (code[0] == 'M')) { + *real_code = (char *)code; + return NULL; + } + + /* [plus] { }* + */ + + /* + */ + word = ap_getword_conf(p, &code); + if (!strncasecmp(word, "now", 1) || + !strncasecmp(word, "access", 1)) { + base = 'A'; + } + else if (!strncasecmp(word, "modification", 1)) { + base = 'M'; + } + else { + return apr_pstrcat(p, "bad expires code, unrecognised '", + word, "'", NULL); + } + + /* [plus] + */ + word = ap_getword_conf(p, &code); + if (!strncasecmp(word, "plus", 1)) { + word = ap_getword_conf(p, &code); + } + + /* { }* + */ + while (word[0]) { + /* + */ + if (apr_isdigit(word[0])) { + num = atoi(word); + } + else { + return apr_pstrcat(p, "bad expires code, numeric value expected '", + word, "'", NULL); + } + + /* + */ + word = ap_getword_conf(p, &code); + if (word[0]) { + /* do nothing */ + } + else { + return apr_pstrcat(p, "bad expires code, missing ", NULL); + } + + factor = 0; + if (!strncasecmp(word, "years", 1)) { + factor = 60 * 60 * 24 * 365; + } + else if (!strncasecmp(word, "months", 2)) { + factor = 60 * 60 * 24 * 30; + } + else if (!strncasecmp(word, "weeks", 1)) { + factor = 60 * 60 * 24 * 7; + } + else if (!strncasecmp(word, "days", 1)) { + factor = 60 * 60 * 24; + } + else if (!strncasecmp(word, "hours", 1)) { + factor = 60 * 60; + } + else if (!strncasecmp(word, "minutes", 2)) { + factor = 60; + } + else if (!strncasecmp(word, "seconds", 1)) { + factor = 1; + } + else { + return apr_pstrcat(p, "bad expires code, unrecognised ", + "'", word, "'", NULL); + } + + modifier = modifier + factor * num; + + /* next + */ + word = ap_getword_conf(p, &code); + } + + *real_code = apr_psprintf(p, "%c%d", base, modifier); + + return NULL; +} + +static const char *set_expiresbytype(cmd_parms *cmd, void *in_dir_config, + const char *mime, const char *code) +{ + expires_dir_config *dir_config = in_dir_config; + char *response, *real_code; + const char *check; + + check = ap_strrchr_c(mime, '/'); + if ((strlen(++check) == 1) && (*check == '*')) { + dir_config->wildcards = 1; + } + + if ((response = check_code(cmd->pool, code, &real_code)) == NULL) { + apr_table_setn(dir_config->expiresbytype, mime, real_code); + return NULL; + } + return apr_pstrcat(cmd->pool, + "'ExpiresByType ", mime, " ", code, "': ", response, NULL); +} + +static const char *set_expiresdefault(cmd_parms *cmd, void *in_dir_config, + const char *code) +{ + expires_dir_config * dir_config = in_dir_config; + char *response, *real_code; + + if ((response = check_code(cmd->pool, code, &real_code)) == NULL) { + dir_config->expiresdefault = real_code; + return NULL; + } + return apr_pstrcat(cmd->pool, + "'ExpiresDefault ", code, "': ", response, NULL); +} + +static const command_rec expires_cmds[] = +{ + AP_INIT_FLAG("ExpiresActive", set_expiresactive, NULL, DIR_CMD_PERMS, + "Limited to 'on' or 'off'"), + AP_INIT_TAKE2("ExpiresByType", set_expiresbytype, NULL, DIR_CMD_PERMS, + "a MIME type followed by an expiry date code"), + AP_INIT_TAKE1("ExpiresDefault", set_expiresdefault, NULL, DIR_CMD_PERMS, + "an expiry date code"), + {NULL} +}; + +static void *merge_expires_dir_configs(apr_pool_t *p, void *basev, void *addv) +{ + expires_dir_config *new = (expires_dir_config *) apr_pcalloc(p, sizeof(expires_dir_config)); + expires_dir_config *base = (expires_dir_config *) basev; + expires_dir_config *add = (expires_dir_config *) addv; + + if (add->active == ACTIVE_DONTCARE) { + new->active = base->active; + } + else { + new->active = add->active; + } + + if (add->expiresdefault != NULL) { + new->expiresdefault = add->expiresdefault; + } + else { + new->expiresdefault = base->expiresdefault; + } + new->wildcards = add->wildcards; + new->expiresbytype = apr_table_overlay(p, add->expiresbytype, + base->expiresbytype); + return new; +} + +/* + * Handle the setting of the expiration response header fields according + * to our criteria. + */ + +static int set_expiration_fields(request_rec *r, const char *code, + apr_table_t *t) +{ + apr_time_t base; + apr_time_t additional; + apr_time_t expires; + int additional_sec; + char *timestr; + + switch (code[0]) { + case 'M': + if (r->finfo.filetype == 0) { + /* file doesn't exist on disk, so we can't do anything based on + * modification time. Note that this does _not_ log an error. + */ + return DECLINED; + } + base = r->finfo.mtime; + additional_sec = atoi(&code[1]); + additional = apr_time_from_sec(additional_sec); + break; + case 'A': + /* there's been some discussion and it's possible that + * 'access time' will be stored in request structure + */ + base = r->request_time; + additional_sec = atoi(&code[1]); + additional = apr_time_from_sec(additional_sec); + break; + default: + /* expecting the add_* routines to be case-hardened this + * is just a reminder that module is beta + */ + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "internal error: bad expires code: %s", r->filename); + return HTTP_INTERNAL_SERVER_ERROR; + } + + expires = base + additional; + if (expires < r->request_time) { + expires = r->request_time; + } + apr_table_mergen(t, "Cache-Control", + apr_psprintf(r->pool, "max-age=%" APR_TIME_T_FMT, + apr_time_sec(expires - r->request_time))); + timestr = apr_palloc(r->pool, APR_RFC822_DATE_LEN); + apr_rfc822_date(timestr, expires); + apr_table_setn(t, "Expires", timestr); + return OK; +} + +/* + * Output filter to set the Expires response header field + * according to the content-type of the response -- if it hasn't + * already been set. + */ +static apr_status_t expires_filter(ap_filter_t *f, + apr_bucket_brigade *b) +{ + request_rec *r; + expires_dir_config *conf; + const char *expiry; + apr_table_t *t; + + r = f->r; + conf = (expires_dir_config *) ap_get_module_config(r->per_dir_config, + &expires_module); + + /* + * Check to see which output header table we should use; + * mod_cgi loads script fields into r->err_headers_out, + * for instance. + */ + expiry = apr_table_get(r->err_headers_out, "Expires"); + if (expiry != NULL) { + t = r->err_headers_out; + } + else { + expiry = apr_table_get(r->headers_out, "Expires"); + t = r->headers_out; + } + if (expiry == NULL) { + /* + * No expiration has been set, so we can apply any managed by + * this module. First, check to see if there is an applicable + * ExpiresByType directive. + */ + expiry = apr_table_get(conf->expiresbytype, + ap_field_noparam(r->pool, r->content_type)); + if (expiry == NULL) { + int usedefault = 1; + /* + * See if we have a wildcard entry for the major type. + */ + if (conf->wildcards) { + char *checkmime; + char *spos; + checkmime = apr_pstrdup(r->pool, r->content_type); + spos = checkmime ? ap_strchr(checkmime, '/') : NULL; + if (spos != NULL) { + /* + * Without a '/' character, nothing we have will match. + * However, we have one. + */ + if (strlen(++spos) > 0) { + *spos++ = '*'; + *spos = '\0'; + } + else { + checkmime = apr_pstrcat(r->pool, checkmime, "*", NULL); + } + expiry = apr_table_get(conf->expiresbytype, checkmime); + usedefault = (expiry == NULL); + } + } + if (usedefault) { + /* + * Use the ExpiresDefault directive + */ + expiry = conf->expiresdefault; + } + } + if (expiry != NULL) { + set_expiration_fields(r, expiry, t); + } + } + ap_remove_output_filter(f); + return ap_pass_brigade(f->next, b); +} + +static void expires_insert_filter(request_rec *r) +{ + expires_dir_config *conf; + + /* Don't add Expires headers to errors */ + if (ap_is_HTTP_ERROR(r->status)) { + return; + } + /* Say no to subrequests */ + if (r->main != NULL) { + return; + } + conf = (expires_dir_config *) ap_get_module_config(r->per_dir_config, + &expires_module); + + /* Check to see if the filter is enabled and if there are any applicable + * config directives for this directory scope + */ + if (conf->active != ACTIVE_ON || + (apr_is_empty_table(conf->expiresbytype) && !conf->expiresdefault)) { + return; + } + ap_add_output_filter("MOD_EXPIRES", NULL, r, r->connection); + return; +} +static void register_hooks(apr_pool_t *p) +{ + /* mod_expires needs to run *before* the cache save filter which is + * AP_FTYPE_CONTENT_SET-1. Otherwise, our expires won't be honored. + */ + ap_register_output_filter("MOD_EXPIRES", expires_filter, NULL, + AP_FTYPE_CONTENT_SET-2); + ap_hook_insert_error_filter(expires_insert_filter, NULL, NULL, APR_HOOK_MIDDLE); + ap_hook_insert_filter(expires_insert_filter, NULL, NULL, APR_HOOK_MIDDLE); +} + +module AP_MODULE_DECLARE_DATA expires_module = +{ + STANDARD20_MODULE_STUFF, + create_dir_expires_config, /* dir config creater */ + merge_expires_dir_configs, /* dir merger --- default is to override */ + NULL, /* server config */ + NULL, /* merge server configs */ + expires_cmds, /* command apr_table_t */ + register_hooks /* register hooks */ +}; diff --git a/rubbos/app/httpd-2.0.64/modules/metadata/mod_expires.dsp b/rubbos/app/httpd-2.0.64/modules/metadata/mod_expires.dsp new file mode 100644 index 00000000..6cb9f91f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/metadata/mod_expires.dsp @@ -0,0 +1,128 @@ +# Microsoft Developer Studio Project File - Name="mod_expires" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=mod_expires - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "mod_expires.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 "mod_expires.mak" CFG="mod_expires - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "mod_expires - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_expires - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "mod_expires - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_expires_src" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /out:"Release/mod_expires.so" /base:@..\..\os\win32\BaseAddr.ref,mod_expires.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Release/mod_expires.so" /base:@..\..\os\win32\BaseAddr.ref,mod_expires.so /opt:ref + +!ELSEIF "$(CFG)" == "mod_expires - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_expires_src" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_expires.so" /base:@..\..\os\win32\BaseAddr.ref,mod_expires.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_expires.so" /base:@..\..\os\win32\BaseAddr.ref,mod_expires.so + +!ENDIF + +# Begin Target + +# Name "mod_expires - Win32 Release" +# Name "mod_expires - Win32 Debug" +# Begin Source File + +SOURCE=.\mod_expires.c +# End Source File +# Begin Source File + +SOURCE=.\mod_expires.rc +# End Source File +# Begin Source File + +SOURCE=..\..\build\win32\win32ver.awk + +!IF "$(CFG)" == "mod_expires - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_expires.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_expires.so "expires_module for Apache" ../../include/ap_release.h > .\mod_expires.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "mod_expires - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_expires.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_expires.so "expires_module for Apache" ../../include/ap_release.h > .\mod_expires.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/modules/metadata/mod_expires.exp b/rubbos/app/httpd-2.0.64/modules/metadata/mod_expires.exp new file mode 100644 index 00000000..863a9687 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/metadata/mod_expires.exp @@ -0,0 +1 @@ +expires_module diff --git a/rubbos/app/httpd-2.0.64/modules/metadata/mod_headers.c b/rubbos/app/httpd-2.0.64/modules/metadata/mod_headers.c new file mode 100644 index 00000000..ce4460d4 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/metadata/mod_headers.c @@ -0,0 +1,620 @@ +/* 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. + */ + +/* + * mod_headers.c: Add/append/remove HTTP response headers + * Written by Paul Sutton, paul@ukweb.com, 1 Oct 1996 + * + * The Header directive can be used to add/replace/remove HTTP headers + * within the response message. The RequestHeader directive can be used + * to add/replace/remove HTTP headers before a request message is processed. + * Valid in both per-server and per-dir configurations. + * + * Syntax is: + * + * Header action header value + * RequestHeader action header value + * + * Where action is one of: + * set - set this header, replacing any old value + * add - add this header, possible resulting in two or more + * headers with the same name + * append - append this text onto any existing header of this same + * unset - remove this header + * + * Where action is unset, the third argument (value) should not be given. + * The header name can include the colon, or not. + * + * The Header and RequestHeader directives can only be used where allowed + * by the FileInfo override. + * + * When the request is processed, the header directives are processed in + * this order: firstly, the main server, then the virtual server handling + * this request (if any), then any sections (working downwards + * from the root dir), then an sections (working down from + * shortest URL component), the any sections. This order is + * important if any 'set' or 'unset' actions are used. For example, + * the following two directives have different effect if applied in + * the reverse order: + * + * Header append Author "John P. Doe" + * Header unset Author + * + * Examples: + * + * To set the "Author" header, use + * Header add Author "John P. Doe" + * + * To remove a header: + * Header unset Author + * + */ + +#include "apr.h" +#include "apr_lib.h" +#include "apr_strings.h" +#include "apr_buckets.h" + +#include "apr_hash.h" +#define APR_WANT_STRFUNC +#include "apr_want.h" + +#include "httpd.h" +#include "http_config.h" +#include "http_request.h" +#include "http_log.h" +#include "util_filter.h" +#include "http_protocol.h" /* ap_hook_insert_error_filter */ + +/* format_tag_hash is initialized during pre-config */ +static apr_hash_t *format_tag_hash; + +typedef enum { + hdr_add = 'a', /* add header (could mean multiple hdrs) */ + hdr_set = 's', /* set (replace old value) */ + hdr_append = 'm', /* append (merge into any old value) */ + hdr_unset = 'u', /* unset header */ + hdr_echo = 'e' /* echo headers from request to response */ +} hdr_actions; + +/* + * magic cmd->info values + */ +static char hdr_in = '0'; /* RequestHeader */ +static char hdr_out = '1'; /* Header onsuccess */ +static char hdr_err = '2'; /* Header always */ + +/* + * There is an array of struct format_tag per Header/RequestHeader + * config directive + */ +typedef struct { + const char* (*func)(request_rec *r,char *arg); + char *arg; +} format_tag; + +/* + * There is one "header_entry" per Header/RequestHeader config directive + */ +typedef struct { + hdr_actions action; + char *header; + apr_array_header_t *ta; /* Array of format_tag structs */ + regex_t *regex; + const char *condition_var; +} header_entry; + +/* echo_do is used for Header echo to iterate through the request headers*/ +typedef struct { + request_rec *r; + header_entry *hdr; +} echo_do; + +/* + * headers_conf is our per-module configuration. This is used as both + * a per-dir and per-server config + */ +typedef struct { + apr_array_header_t *fixup_in; + apr_array_header_t *fixup_out; + apr_array_header_t *fixup_err; +} headers_conf; + +module AP_MODULE_DECLARE_DATA headers_module; + +/* + * Tag formatting functions + */ +static const char *constant_item(request_rec *r, char *stuff) +{ + return stuff; +} +static const char *header_request_duration(request_rec *r, char *a) +{ + return apr_psprintf(r->pool, "D=%" APR_TIME_T_FMT, + (apr_time_now() - r->request_time)); +} +static const char *header_request_time(request_rec *r, char *a) +{ + return apr_psprintf(r->pool, "t=%" APR_TIME_T_FMT, r->request_time); +} +static const char *header_request_env_var(request_rec *r, char *a) +{ + const char *s = apr_table_get(r->subprocess_env,a); + + if (s) + return s; + else + return "(null)"; +} +/* + * Config routines + */ +static void *create_headers_config(apr_pool_t *p, char *dummy) +{ + headers_conf *conf = apr_palloc(p, sizeof(*conf)); + + conf->fixup_in = apr_array_make(p, 2, sizeof(header_entry)); + conf->fixup_out = apr_array_make(p, 2, sizeof(header_entry)); + conf->fixup_err = apr_array_make(p, 2, sizeof(header_entry)); + + return conf; +} + +static void *merge_headers_config(apr_pool_t *p, void *basev, void *overridesv) +{ + headers_conf *newconf = apr_palloc(p, sizeof(*newconf)); + headers_conf *base = basev; + headers_conf *overrides = overridesv; + + newconf->fixup_in = apr_array_append(p, base->fixup_in, overrides->fixup_in); + newconf->fixup_out = apr_array_append(p, base->fixup_out, overrides->fixup_out); + newconf->fixup_err = apr_array_append(p, base->fixup_err, overrides->fixup_err); + + return newconf; +} + +static char *parse_misc_string(apr_pool_t *p, format_tag *tag, const char **sa) +{ + const char *s; + char *d; + + tag->func = constant_item; + + s = *sa; + while (*s && *s != '%') { + s++; + } + /* + * This might allocate a few chars extra if there's a backslash + * escape in the format string. + */ + tag->arg = apr_palloc(p, s - *sa + 1); + + d = tag->arg; + s = *sa; + while (*s && *s != '%') { + if (*s != '\\') { + *d++ = *s++; + } + else { + s++; + switch (*s) { + case '\\': + *d++ = '\\'; + s++; + break; + case 'r': + *d++ = '\r'; + s++; + break; + case 'n': + *d++ = '\n'; + s++; + break; + case 't': + *d++ = '\t'; + s++; + break; + default: + /* copy verbatim */ + *d++ = '\\'; + /* + * Allow the loop to deal with this *s in the normal + * fashion so that it handles end of string etc. + * properly. + */ + break; + } + } + } + *d = '\0'; + + *sa = s; + return NULL; +} + +static char *parse_format_tag(apr_pool_t *p, format_tag *tag, const char **sa) +{ + const char *s = *sa; + const char * (*tag_handler)(request_rec *,char *); + + /* Handle string literal/conditionals */ + if (*s != '%') { + return parse_misc_string(p, tag, sa); + } + s++; /* skip the % */ + tag->arg = '\0'; + /* grab the argument if there is one */ + if (*s == '{') { + ++s; + tag->arg = ap_getword(p,&s,'}'); + } + + tag_handler = (const char * (*)(request_rec *,char *))apr_hash_get(format_tag_hash, s++, 1); + + if (!tag_handler) { + char dummy[2]; + dummy[0] = s[-1]; + dummy[1] = '\0'; + return apr_pstrcat(p, "Unrecognized Header or RequestHeader directive %", + dummy, NULL); + } + tag->func = tag_handler; + + *sa = s; + return NULL; +} + +/* + * A format string consists of white space, text and optional format + * tags in any order. E.g., + * + * Header add MyHeader "Free form text %D %t more text" + * + * Decompose the format string into its tags. Each tag (struct format_tag) + * contains a pointer to the function used to format the tag. Then save each + * tag in the tag array anchored in the header_entry. + */ +static char *parse_format_string(apr_pool_t *p, header_entry *hdr, const char *s) +{ + char *res; + + /* No string to parse with unset and copy commands */ + if (hdr->action == hdr_unset || + hdr->action == hdr_echo) { + return NULL; + } + + hdr->ta = apr_array_make(p, 10, sizeof(format_tag)); + + while (*s) { + if ((res = parse_format_tag(p, (format_tag *) apr_array_push(hdr->ta), &s))) { + return res; + } + } + return NULL; +} + +/* handle RequestHeader and Header directive */ +static const char *header_inout_cmd(cmd_parms *cmd, void *indirconf, + const char *action, const char *inhdr, + const char *value, const char* envclause) +{ + headers_conf *dirconf = indirconf; + const char *condition_var = NULL; + char *colon; + char *hdr = apr_pstrdup(cmd->pool, inhdr); + header_entry *new; + apr_array_header_t *fixup = (cmd->info == &hdr_in) + ? dirconf->fixup_in : (cmd->info == &hdr_err) + ? dirconf->fixup_err + : dirconf->fixup_out; + + new = (header_entry *) apr_array_push(fixup); + + if (!strcasecmp(action, "set")) + new->action = hdr_set; + else if (!strcasecmp(action, "add")) + new->action = hdr_add; + else if (!strcasecmp(action, "append")) + new->action = hdr_append; + else if (!strcasecmp(action, "unset")) + new->action = hdr_unset; + else if (!strcasecmp(action, "echo")) + new->action = hdr_echo; + else + return "first argument must be add, set, append, unset or echo."; + + if (new->action == hdr_unset) { + if (value) + return "header unset takes two arguments"; + } + else if (new->action == hdr_echo) { + regex_t *regex; + if (value) + return "Header echo takes two arguments"; + else if (cmd->info == &hdr_in) + return "Header echo only valid on Header directive"; + else { + regex = ap_pregcomp(cmd->pool, hdr, REG_EXTENDED | REG_NOSUB); + if (regex == NULL) { + return "Header echo regex could not be compiled"; + } + } + new->regex = regex; + } + else if (!value) + return "header requires three arguments"; + + /* Handle the envclause on Header */ + if (envclause != NULL) { + if (strncasecmp(envclause, "env=", 4) != 0) { + return "error: envclause should be in the form env=envar"; + } + if ((envclause[4] == '\0') + || ((envclause[4] == '!') && (envclause[5] == '\0'))) { + return "error: missing environment variable name. envclause should be in the form env=envar "; + } + condition_var = apr_pstrdup(cmd->pool, &envclause[4]); + } + + if ((colon = strchr(hdr, ':'))) + *colon = '\0'; + + new->header = hdr; + new->condition_var = condition_var; + + return parse_format_string(cmd->pool, new, value); +} + +/* Handle all (xxx)Header directives */ +static const char *header_cmd(cmd_parms *cmd, void *indirconf, + const char *args) +{ + const char *s; + const char *action; + const char *hdr; + const char *val; + const char *envclause; + + s = apr_pstrdup(cmd->pool, args); + action = ap_getword_conf(cmd->pool, &s); + if (cmd->info == &hdr_out) { + if (!strcasecmp(action, "always")) { + cmd->info = &hdr_err; + action = ap_getword_conf(cmd->pool, &s); + } + else if (!strcasecmp(action, "onsuccess")) { + action = ap_getword_conf(cmd->pool, &s); + } + } + hdr = ap_getword_conf(cmd->pool, &s); + val = *s ? ap_getword_conf(cmd->pool, &s) : NULL; + envclause = *s ? ap_getword_conf(cmd->pool, &s) : NULL; + + if (*s) { + return apr_pstrcat(cmd->pool, cmd->cmd->name, + " has too many arguments", NULL); + } + + return header_inout_cmd(cmd, indirconf, action, hdr, val, envclause); +} + +/* + * Process the tags in the format string. Tags may be format specifiers + * (%D, %t, etc.), whitespace or text strings. For each tag, run the handler + * (formatter) specific to the tag. Handlers return text strings. + * Concatenate the return from each handler into one string that is + * returned from this call. + */ +static char* process_tags(header_entry *hdr, request_rec *r) +{ + int i; + const char *s; + char *str = NULL; + + format_tag *tag = (format_tag*) hdr->ta->elts; + + for (i = 0; i < hdr->ta->nelts; i++) { + s = tag[i].func(r, tag[i].arg); + if (str == NULL) + str = apr_pstrdup(r->pool, s); + else + str = apr_pstrcat(r->pool, str, s, NULL); + } + return str ? str : ""; +} + +static int echo_header(echo_do *v, const char *key, const char *val) +{ + /* If the input header (key) matches the regex, echo it intact to + * r->headers_out. + */ + if (!ap_regexec(v->hdr->regex, key, 0, NULL, 0)) { + apr_table_add(v->r->headers_out, key, val); + } + + return 1; +} + +static void do_headers_fixup(request_rec *r, apr_table_t *headers, + apr_array_header_t *fixup) +{ + int i; + + for (i = 0; i < fixup->nelts; ++i) { + header_entry *hdr = &((header_entry *) (fixup->elts))[i]; + + /* Have any conditional envar-controlled Header processing to do? */ + if (hdr->condition_var) { + const char *envar = hdr->condition_var; + if (*envar != '!') { + if (apr_table_get(r->subprocess_env, envar) == NULL) + continue; + } + else { + if (apr_table_get(r->subprocess_env, &envar[1]) != NULL) + continue; + } + } + + switch (hdr->action) { + case hdr_add: + apr_table_addn(headers, hdr->header, process_tags(hdr, r)); + break; + case hdr_append: + apr_table_mergen(headers, hdr->header, process_tags(hdr, r)); + break; + case hdr_set: + apr_table_setn(headers, hdr->header, process_tags(hdr, r)); + break; + case hdr_unset: + apr_table_unset(headers, hdr->header); + break; + case hdr_echo: + { + echo_do v; + v.r = r; + v.hdr = hdr; + apr_table_do((int (*) (void *, const char *, const char *)) + echo_header, (void *) &v, r->headers_in, NULL); + break; + } + } + } +} + +static void ap_headers_insert_output_filter(request_rec *r) +{ + headers_conf *dirconf = ap_get_module_config(r->per_dir_config, + &headers_module); + + if (dirconf->fixup_out->nelts || dirconf->fixup_err->nelts) { + ap_add_output_filter("FIXUP_HEADERS_OUT", NULL, r, r->connection); + } +} + +static void ap_headers_insert_error_filter(request_rec *r) +{ + headers_conf *dirconf = ap_get_module_config(r->per_dir_config, + &headers_module); + + if (dirconf->fixup_err->nelts) { + ap_add_output_filter("FIXUP_HEADERS_ERR", NULL, r, r->connection); + } +} + +static apr_status_t ap_headers_output_filter(ap_filter_t *f, + apr_bucket_brigade *in) +{ + headers_conf *dirconf = ap_get_module_config(f->r->per_dir_config, + &headers_module); + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, f->r->server, + "headers: ap_headers_output_filter()"); + + /* do the fixup */ + do_headers_fixup(f->r, f->r->err_headers_out, dirconf->fixup_err); + do_headers_fixup(f->r, f->r->headers_out, dirconf->fixup_out); + + /* remove ourselves from the filter chain */ + ap_remove_output_filter(f); + + /* send the data up the stack */ + return ap_pass_brigade(f->next,in); +} + +static apr_status_t ap_headers_error_filter(ap_filter_t *f, + apr_bucket_brigade *in) +{ + headers_conf *dirconf = ap_get_module_config(f->r->per_dir_config, + &headers_module); + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, f->r->server, + "headers: ap_headers_error_filter()"); + + /* do the fixup */ + do_headers_fixup(f->r, f->r->err_headers_out, dirconf->fixup_err); + + /* remove ourselves from the filter chain */ + ap_remove_output_filter(f); + + /* send the data up the stack */ + return ap_pass_brigade(f->next,in); +} + +static apr_status_t ap_headers_fixup(request_rec *r) +{ + headers_conf *dirconf = ap_get_module_config(r->per_dir_config, + &headers_module); + + /* do the fixup */ + if (dirconf->fixup_in->nelts) { + do_headers_fixup(r, r->headers_in, dirconf->fixup_in); + } + + return DECLINED; +} + +static const command_rec headers_cmds[] = +{ + AP_INIT_RAW_ARGS("Header", header_cmd, &hdr_out, OR_FILEINFO, + "an optional condition, an action, header and value " + "followed by optional env clause"), + AP_INIT_RAW_ARGS("RequestHeader", header_cmd, &hdr_in, OR_FILEINFO, + "an action, header and value"), + {NULL} +}; + +static void register_format_tag_handler(apr_pool_t *p, char *tag, void *tag_handler, int def) +{ + const void *h = apr_palloc(p, sizeof(h)); + h = tag_handler; + apr_hash_set(format_tag_hash, tag, 1, h); +} +static int header_pre_config(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp) +{ + format_tag_hash = apr_hash_make(p); + register_format_tag_handler(p, "D", (void*) header_request_duration, 0); + register_format_tag_handler(p, "t", (void*) header_request_time, 0); + register_format_tag_handler(p, "e", (void*) header_request_env_var, 0); + + return OK; +} + +static void register_hooks(apr_pool_t *p) +{ + ap_hook_pre_config(header_pre_config,NULL,NULL,APR_HOOK_MIDDLE); + ap_hook_insert_filter(ap_headers_insert_output_filter, NULL, NULL, APR_HOOK_LAST); + ap_hook_insert_error_filter(ap_headers_insert_error_filter, NULL, NULL, APR_HOOK_LAST); + ap_hook_fixups(ap_headers_fixup, NULL, NULL, APR_HOOK_LAST); + ap_register_output_filter("FIXUP_HEADERS_OUT", ap_headers_output_filter, + NULL, AP_FTYPE_CONTENT_SET); + ap_register_output_filter("FIXUP_HEADERS_ERR", ap_headers_error_filter, + NULL, AP_FTYPE_CONTENT_SET); +} + +module AP_MODULE_DECLARE_DATA headers_module = +{ + STANDARD20_MODULE_STUFF, + create_headers_config, /* dir config creater */ + merge_headers_config, /* dir merger --- default is to override */ + NULL, /* server config */ + NULL, /* merge server configs */ + headers_cmds, /* command apr_table_t */ + register_hooks /* register hooks */ +}; diff --git a/rubbos/app/httpd-2.0.64/modules/metadata/mod_headers.dsp b/rubbos/app/httpd-2.0.64/modules/metadata/mod_headers.dsp new file mode 100644 index 00000000..3e5a016f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/metadata/mod_headers.dsp @@ -0,0 +1,128 @@ +# Microsoft Developer Studio Project File - Name="mod_headers" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=mod_headers - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "mod_headers.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 "mod_headers.mak" CFG="mod_headers - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "mod_headers - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_headers - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "mod_headers - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_headers_src" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /out:"Release/mod_headers.so" /base:@..\..\os\win32\BaseAddr.ref,mod_headers.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Release/mod_headers.so" /base:@..\..\os\win32\BaseAddr.ref,mod_headers.so /opt:ref + +!ELSEIF "$(CFG)" == "mod_headers - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_headers_src" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_headers.so" /base:@..\..\os\win32\BaseAddr.ref,mod_headers.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_headers.so" /base:@..\..\os\win32\BaseAddr.ref,mod_headers.so + +!ENDIF + +# Begin Target + +# Name "mod_headers - Win32 Release" +# Name "mod_headers - Win32 Debug" +# Begin Source File + +SOURCE=.\mod_headers.c +# End Source File +# Begin Source File + +SOURCE=.\mod_headers.rc +# End Source File +# Begin Source File + +SOURCE=..\..\build\win32\win32ver.awk + +!IF "$(CFG)" == "mod_headers - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_headers.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_headers.so "headers_module for Apache" ../../include/ap_release.h > .\mod_headers.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "mod_headers - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_headers.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_headers.so "headers_module for Apache" ../../include/ap_release.h > .\mod_headers.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/modules/metadata/mod_headers.exp b/rubbos/app/httpd-2.0.64/modules/metadata/mod_headers.exp new file mode 100644 index 00000000..3f306380 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/metadata/mod_headers.exp @@ -0,0 +1 @@ +headers_module diff --git a/rubbos/app/httpd-2.0.64/modules/metadata/mod_mime_magic.c b/rubbos/app/httpd-2.0.64/modules/metadata/mod_mime_magic.c new file mode 100644 index 00000000..329d3898 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/metadata/mod_mime_magic.c @@ -0,0 +1,2477 @@ +/* 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. + */ + +/* + * 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 Software Foundation 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 Software Foundation. + * + * 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 compliance with Mr Darwin's terms: this has been very significantly + * modified from the free "file" command. + * - all-in-one file for compilation convenience when moving from one + * version of Apache to the next. + * - Memory allocation is done through the Apache API's apr_pool_t structure. + * - All functions have had necessary Apache API request or server + * structures passed to them where necessary to call other Apache API + * routines. (i.e. usually for logging, files, or memory allocation in + * itself or a called function.) + * - struct magic has been converted from an array to a single-ended linked + * list because it only grows one record at a time, it's only accessed + * sequentially, and the Apache API has no equivalent of realloc(). + * - Functions have been changed to get their parameters from the server + * configuration instead of globals. (It should be reentrant now but has + * not been tested in a threaded environment.) + * - Places where it used to print results to stdout now saves them in a + * list where they're used to set the MIME type in the Apache request + * record. + * - Command-line flags have been removed since they will never be used here. + * + * Ian Kluft + * Engineering Information Framework + * Central Engineering + * Cisco Systems, Inc. + * San Jose, CA, USA + * + * Initial installation July/August 1996 + * Misc bug fixes May 1997 + * Submission to Apache Software Foundation July 1997 + * + */ + +#include "apr.h" +#include "apr_strings.h" +#include "apr_lib.h" +#define APR_WANT_STRFUNC +#include "apr_want.h" + +#if APR_HAVE_UNISTD_H +#include +#endif + +#include "ap_config.h" +#include "httpd.h" +#include "http_config.h" +#include "http_request.h" +#include "http_core.h" +#include "http_log.h" +#include "http_protocol.h" +#include "util_script.h" + +/* ### this isn't set by configure? does anybody set this? */ +#ifdef HAVE_UTIME_H +#include +#endif + +/* + * data structures and related constants + */ + +#define MODNAME "mod_mime_magic" +#define MIME_MAGIC_DEBUG 0 + +#define MIME_BINARY_UNKNOWN "application/octet-stream" +#define MIME_TEXT_UNKNOWN "text/plain" + +#define MAXMIMESTRING 256 + +/* HOWMANY must be at least 4096 to make gzip -dcq work */ +#define HOWMANY 4096 +/* SMALL_HOWMANY limits how much work we do to figure out text files */ +#define SMALL_HOWMANY 1024 +#define MAXDESC 50 /* max leng of text description */ +#define MAXstring 64 /* max leng of "string" types */ + +struct magic { + struct magic *next; /* link to next entry */ + int lineno; /* line number from magic file */ + + short flag; +#define INDIR 1 /* if '>(...)' appears, */ +#define UNSIGNED 2 /* comparison is unsigned */ + short cont_level; /* level of ">" */ + struct { + char type; /* byte short long */ + long offset; /* offset from indirection */ + } in; + long offset; /* offset to magic number */ + unsigned char reln; /* relation (0=eq, '>'=gt, etc) */ + char type; /* int, short, long or string. */ + char vallen; /* length of string value, if any */ +#define BYTE 1 +#define SHORT 2 +#define LONG 4 +#define STRING 5 +#define DATE 6 +#define BESHORT 7 +#define BELONG 8 +#define BEDATE 9 +#define LESHORT 10 +#define LELONG 11 +#define LEDATE 12 + union VALUETYPE { + unsigned char b; + unsigned short h; + unsigned long l; + char s[MAXstring]; + unsigned char hs[2]; /* 2 bytes of a fixed-endian "short" */ + unsigned char hl[4]; /* 2 bytes of a fixed-endian "long" */ + } value; /* either number or string */ + unsigned long mask; /* mask before comparison with value */ + char nospflag; /* supress space character */ + + /* NOTE: this string is suspected of overrunning - find it! */ + char desc[MAXDESC]; /* description */ +}; + +/* + * data structures for tar file recognition + * -------------------------------------------------------------------------- + * Header file for public domain tar (tape archive) program. + * + * @(#)tar.h 1.20 86/10/29 Public Domain. Created 25 August 1985 by John + * Gilmore, ihnp4!hoptoad!gnu. + * + * Header block on tape. + * + * I'm going to use traditional DP naming conventions here. A "block" is a big + * chunk of stuff that we do I/O on. A "record" is a piece of info that we + * care about. Typically many "record"s fit into a "block". + */ +#define RECORDSIZE 512 +#define NAMSIZ 100 +#define TUNMLEN 32 +#define TGNMLEN 32 + +union record { + char charptr[RECORDSIZE]; + struct header { + char name[NAMSIZ]; + char mode[8]; + char uid[8]; + char gid[8]; + char size[12]; + char mtime[12]; + char chksum[8]; + char linkflag; + char linkname[NAMSIZ]; + char magic[8]; + char uname[TUNMLEN]; + char gname[TGNMLEN]; + char devmajor[8]; + char devminor[8]; + } header; +}; + +/* The magic field is filled with this if uname and gname are valid. */ +#define TMAGIC "ustar " /* 7 chars and a null */ + +/* + * file-function prototypes + */ +static int ascmagic(request_rec *, unsigned char *, apr_size_t); +static int is_tar(unsigned char *, apr_size_t); +static int softmagic(request_rec *, unsigned char *, apr_size_t); +static int tryit(request_rec *, unsigned char *, apr_size_t, int); +static int zmagic(request_rec *, unsigned char *, apr_size_t); + +static int getvalue(server_rec *, struct magic *, char **); +static int hextoint(int); +static char *getstr(server_rec *, char *, char *, int, int *); +static int parse(server_rec *, apr_pool_t *p, char *, int); + +static int match(request_rec *, unsigned char *, apr_size_t); +static int mget(request_rec *, union VALUETYPE *, unsigned char *, + struct magic *, apr_size_t); +static int mcheck(request_rec *, union VALUETYPE *, struct magic *); +static void mprint(request_rec *, union VALUETYPE *, struct magic *); + +static int uncompress(request_rec *, int, + unsigned char **, apr_size_t); +static long from_oct(int, char *); +static int fsmagic(request_rec *r, const char *fn); + +/* + * includes for ASCII substring recognition formerly "names.h" in file + * command + * + * Original notes: names and types used by ascmagic in file(1). These tokens are + * here because they can appear anywhere in the first HOWMANY bytes, while + * tokens in /etc/magic must appear at fixed offsets into the file. Don't + * make HOWMANY too high unless you have a very fast CPU. + */ + +/* these types are used to index the apr_table_t 'types': keep em in sync! */ +/* HTML inserted in first because this is a web server module now */ +#define L_HTML 0 /* HTML */ +#define L_C 1 /* first and foremost on UNIX */ +#define L_FORT 2 /* the oldest one */ +#define L_MAKE 3 /* Makefiles */ +#define L_PLI 4 /* PL/1 */ +#define L_MACH 5 /* some kinda assembler */ +#define L_ENG 6 /* English */ +#define L_PAS 7 /* Pascal */ +#define L_MAIL 8 /* Electronic mail */ +#define L_NEWS 9 /* Usenet Netnews */ + +static char *types[] = +{ + "text/html", /* HTML */ + "text/plain", /* "c program text", */ + "text/plain", /* "fortran program text", */ + "text/plain", /* "make commands text", */ + "text/plain", /* "pl/1 program text", */ + "text/plain", /* "assembler program text", */ + "text/plain", /* "English text", */ + "text/plain", /* "pascal program text", */ + "message/rfc822", /* "mail text", */ + "message/news", /* "news text", */ + "application/binary", /* "can't happen error on names.h/types", */ + 0 +}; + +static struct names { + char *name; + short type; +} names[] = { + + /* These must be sorted by eye for optimal hit rate */ + /* Add to this list only after substantial meditation */ + { + "", L_HTML + }, + { + "", L_HTML + }, + { + "", L_HTML + }, + { + "", L_HTML + }, + { + "", L_HTML + }, + { + "<TITLE>", L_HTML + }, + { + "<h1>", L_HTML + }, + { + "<H1>", L_HTML + }, + { + "<!--", L_HTML + }, + { + "<!DOCTYPE HTML", L_HTML + }, + { + "/*", L_C + }, /* must precede "The", "the", etc. */ + { + "#include", L_C + }, + { + "char", L_C + }, + { + "The", L_ENG + }, + { + "the", L_ENG + }, + { + "double", L_C + }, + { + "extern", L_C + }, + { + "float", L_C + }, + { + "real", L_C + }, + { + "struct", L_C + }, + { + "union", L_C + }, + { + "CFLAGS", L_MAKE + }, + { + "LDFLAGS", L_MAKE + }, + { + "all:", L_MAKE + }, + { + ".PRECIOUS", L_MAKE + }, + /* + * Too many files of text have these words in them. Find another way to + * recognize Fortrash. + */ +#ifdef NOTDEF + { + "subroutine", L_FORT + }, + { + "function", L_FORT + }, + { + "block", L_FORT + }, + { + "common", L_FORT + }, + { + "dimension", L_FORT + }, + { + "integer", L_FORT + }, + { + "data", L_FORT + }, +#endif /* NOTDEF */ + { + ".ascii", L_MACH + }, + { + ".asciiz", L_MACH + }, + { + ".byte", L_MACH + }, + { + ".even", L_MACH + }, + { + ".globl", L_MACH + }, + { + "clr", L_MACH + }, + { + "(input,", L_PAS + }, + { + "dcl", L_PLI + }, + { + "Received:", L_MAIL + }, + { + ">From", L_MAIL + }, + { + "Return-Path:", L_MAIL + }, + { + "Cc:", L_MAIL + }, + { + "Newsgroups:", L_NEWS + }, + { + "Path:", L_NEWS + }, + { + "Organization:", L_NEWS + }, + { + NULL, 0 + } +}; + +#define NNAMES ((sizeof(names)/sizeof(struct names)) - 1) + +/* + * Result String List (RSL) + * + * The file(1) command prints its output. Instead, we store the various + * "printed" strings in a list (allocating memory as we go) and concatenate + * them at the end when we finally know how much space they'll need. + */ + +typedef struct magic_rsl_s { + char *str; /* string, possibly a fragment */ + struct magic_rsl_s *next; /* pointer to next fragment */ +} magic_rsl; + +/* + * Apache module configuration structures + */ + +/* per-server info */ +typedef struct { + const char *magicfile; /* where magic be found */ + struct magic *magic; /* head of magic config list */ + struct magic *last; +} magic_server_config_rec; + +/* per-request info */ +typedef struct { + magic_rsl *head; /* result string list */ + magic_rsl *tail; + unsigned suf_recursion; /* recursion depth in suffix check */ +} magic_req_rec; + +/* + * configuration functions - called by Apache API routines + */ + +module AP_MODULE_DECLARE_DATA mime_magic_module; + +static void *create_magic_server_config(apr_pool_t *p, server_rec *d) +{ + /* allocate the config - use pcalloc because it needs to be zeroed */ + return apr_pcalloc(p, sizeof(magic_server_config_rec)); +} + +static void *merge_magic_server_config(apr_pool_t *p, void *basev, void *addv) +{ + magic_server_config_rec *base = (magic_server_config_rec *) basev; + magic_server_config_rec *add = (magic_server_config_rec *) addv; + magic_server_config_rec *new = (magic_server_config_rec *) + apr_palloc(p, sizeof(magic_server_config_rec)); + + new->magicfile = add->magicfile ? add->magicfile : base->magicfile; + new->magic = NULL; + new->last = NULL; + return new; +} + +static const char *set_magicfile(cmd_parms *cmd, void *dummy, const char *arg) +{ + magic_server_config_rec *conf = (magic_server_config_rec *) + ap_get_module_config(cmd->server->module_config, + &mime_magic_module); + + if (!conf) { + return MODNAME ": server structure not allocated"; + } + conf->magicfile = arg; + return NULL; +} + +/* + * configuration file commands - exported to Apache API + */ + +static const command_rec mime_magic_cmds[] = +{ + AP_INIT_TAKE1("MimeMagicFile", set_magicfile, NULL, RSRC_CONF, + "Path to MIME Magic file (in file(1) format)"), + {NULL} +}; + +/* + * RSL (result string list) processing routines + * + * These collect strings that would have been printed in fragments by file(1) + * into a list of magic_rsl structures with the strings. When complete, + * they're concatenated together to become the MIME content and encoding + * types. + * + * return value conventions for these functions: functions which return int: + * failure = -1, other = result functions which return pointers: failure = 0, + * other = result + */ + +/* allocate a per-request structure and put it in the request record */ +static magic_req_rec *magic_set_config(request_rec *r) +{ + magic_req_rec *req_dat = (magic_req_rec *) apr_palloc(r->pool, + sizeof(magic_req_rec)); + + req_dat->head = req_dat->tail = (magic_rsl *) NULL; + ap_set_module_config(r->request_config, &mime_magic_module, req_dat); + return req_dat; +} + +/* add a string to the result string list for this request */ +/* it is the responsibility of the caller to allocate "str" */ +static int magic_rsl_add(request_rec *r, char *str) +{ + magic_req_rec *req_dat = (magic_req_rec *) + ap_get_module_config(r->request_config, &mime_magic_module); + magic_rsl *rsl; + + /* make sure we have a list to put it in */ + if (!req_dat) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, APR_EINVAL, r, + MODNAME ": request config should not be NULL"); + if (!(req_dat = magic_set_config(r))) { + /* failure */ + return -1; + } + } + + /* allocate the list entry */ + rsl = (magic_rsl *) apr_palloc(r->pool, sizeof(magic_rsl)); + + /* fill it */ + rsl->str = str; + rsl->next = (magic_rsl *) NULL; + + /* append to the list */ + if (req_dat->head && req_dat->tail) { + req_dat->tail->next = rsl; + req_dat->tail = rsl; + } + else { + req_dat->head = req_dat->tail = rsl; + } + + /* success */ + return 0; +} + +/* RSL hook for puts-type functions */ +static int magic_rsl_puts(request_rec *r, char *str) +{ + return magic_rsl_add(r, str); +} + +/* RSL hook for printf-type functions */ +static int magic_rsl_printf(request_rec *r, char *str,...) +{ + va_list ap; + + char buf[MAXMIMESTRING]; + + /* assemble the string into the buffer */ + va_start(ap, str); + apr_vsnprintf(buf, sizeof(buf), str, ap); + va_end(ap); + + /* add the buffer to the list */ + return magic_rsl_add(r, apr_pstrdup(r->pool, buf)); +} + +/* RSL hook for putchar-type functions */ +static int magic_rsl_putchar(request_rec *r, char c) +{ + char str[2]; + + /* high overhead for 1 char - just hope they don't do this much */ + str[0] = c; + str[1] = '\0'; + return magic_rsl_add(r, str); +} + +/* allocate and copy a contiguous string from a result string list */ +static char *rsl_strdup(request_rec *r, int start_frag, int start_pos, int len) +{ + char *result; /* return value */ + int cur_frag, /* current fragment number/counter */ + cur_pos, /* current position within fragment */ + res_pos; /* position in result string */ + magic_rsl *frag; /* list-traversal pointer */ + magic_req_rec *req_dat = (magic_req_rec *) + ap_get_module_config(r->request_config, &mime_magic_module); + + /* allocate the result string */ + result = (char *) apr_palloc(r->pool, len + 1); + + /* loop through and collect the string */ + res_pos = 0; + for (frag = req_dat->head, cur_frag = 0; + frag->next; + frag = frag->next, cur_frag++) { + /* loop to the first fragment */ + if (cur_frag < start_frag) + continue; + + /* loop through and collect chars */ + for (cur_pos = (cur_frag == start_frag) ? start_pos : 0; + frag->str[cur_pos]; + cur_pos++) { + if (cur_frag >= start_frag + && cur_pos >= start_pos + && res_pos <= len) { + result[res_pos++] = frag->str[cur_pos]; + if (res_pos > len) { + break; + } + } + } + } + + /* clean up and return */ + result[res_pos] = 0; +#if MIME_MAGIC_DEBUG + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, + MODNAME ": rsl_strdup() %d chars: %s", res_pos - 1, result); +#endif + return result; +} + +/* states for the state-machine algorithm in magic_rsl_to_request() */ +typedef enum { + rsl_leading_space, rsl_type, rsl_subtype, rsl_separator, rsl_encoding +} rsl_states; + +/* process the RSL and set the MIME info in the request record */ +static int magic_rsl_to_request(request_rec *r) +{ + int cur_frag, /* current fragment number/counter */ + cur_pos, /* current position within fragment */ + type_frag, /* content type starting point: fragment */ + type_pos, /* content type starting point: position */ + type_len, /* content type length */ + encoding_frag, /* content encoding starting point: fragment */ + encoding_pos, /* content encoding starting point: position */ + encoding_len; /* content encoding length */ + + magic_rsl *frag; /* list-traversal pointer */ + rsl_states state; + + magic_req_rec *req_dat = (magic_req_rec *) + ap_get_module_config(r->request_config, &mime_magic_module); + + /* check if we have a result */ + if (!req_dat || !req_dat->head) { + /* empty - no match, we defer to other Apache modules */ + return DECLINED; + } + + /* start searching for the type and encoding */ + state = rsl_leading_space; + type_frag = type_pos = type_len = 0; + encoding_frag = encoding_pos = encoding_len = 0; + for (frag = req_dat->head, cur_frag = 0; + frag && frag->next; + frag = frag->next, cur_frag++) { + /* loop through the characters in the fragment */ + for (cur_pos = 0; frag->str[cur_pos]; cur_pos++) { + if (apr_isspace(frag->str[cur_pos])) { + /* process whitespace actions for each state */ + if (state == rsl_leading_space) { + /* eat whitespace in this state */ + continue; + } + else if (state == rsl_type) { + /* whitespace: type has no slash! */ + return DECLINED; + } + else if (state == rsl_subtype) { + /* whitespace: end of MIME type */ + state++; + continue; + } + else if (state == rsl_separator) { + /* eat whitespace in this state */ + continue; + } + else if (state == rsl_encoding) { + /* whitespace: end of MIME encoding */ + /* we're done */ + frag = req_dat->tail; + break; + } + else { + /* should not be possible */ + /* abandon malfunctioning module */ + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + MODNAME ": bad state %d (ws)", state); + return DECLINED; + } + /* NOTREACHED */ + } + else if (state == rsl_type && + frag->str[cur_pos] == '/') { + /* copy the char and go to rsl_subtype state */ + type_len++; + state++; + } + else { + /* process non-space actions for each state */ + if (state == rsl_leading_space) { + /* non-space: begin MIME type */ + state++; + type_frag = cur_frag; + type_pos = cur_pos; + type_len = 1; + continue; + } + else if (state == rsl_type || + state == rsl_subtype) { + /* non-space: adds to type */ + type_len++; + continue; + } + else if (state == rsl_separator) { + /* non-space: begin MIME encoding */ + state++; + encoding_frag = cur_frag; + encoding_pos = cur_pos; + encoding_len = 1; + continue; + } + else if (state == rsl_encoding) { + /* non-space: adds to encoding */ + encoding_len++; + continue; + } + else { + /* should not be possible */ + /* abandon malfunctioning module */ + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + MODNAME ": bad state %d (ns)", state); + return DECLINED; + } + /* NOTREACHED */ + } + /* NOTREACHED */ + } + } + + /* if we ended prior to state rsl_subtype, we had incomplete info */ + if (state != rsl_subtype && state != rsl_separator && + state != rsl_encoding) { + /* defer to other modules */ + return DECLINED; + } + + /* save the info in the request record */ + if (state == rsl_subtype || state == rsl_encoding || + state == rsl_encoding) { + char *tmp; + tmp = rsl_strdup(r, type_frag, type_pos, type_len); + /* XXX: this could be done at config time I'm sure... but I'm + * confused by all this magic_rsl stuff. -djg */ + ap_content_type_tolower(tmp); + ap_set_content_type(r, tmp); + } + if (state == rsl_encoding) { + char *tmp; + tmp = rsl_strdup(r, encoding_frag, + encoding_pos, encoding_len); + /* XXX: this could be done at config time I'm sure... but I'm + * confused by all this magic_rsl stuff. -djg */ + ap_str_tolower(tmp); + r->content_encoding = tmp; + } + + /* detect memory allocation or other errors */ + if (!r->content_type || + (state == rsl_encoding && !r->content_encoding)) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + MODNAME ": unexpected state %d; could be caused by bad " + "data in magic file", + state); + return HTTP_INTERNAL_SERVER_ERROR; + } + + /* success! */ + return OK; +} + +/* + * magic_process - process input file r Apache API request record + * (formerly called "process" in file command, prefix added for clarity) Opens + * the file and reads a fixed-size buffer to begin processing the contents. + */ +static int magic_process(request_rec *r) +{ + apr_file_t *fd = NULL; + unsigned char buf[HOWMANY + 1]; /* one extra for terminating '\0' */ + apr_size_t nbytes = 0; /* number of bytes read from a datafile */ + int result; + + /* + * first try judging the file based on its filesystem status + */ + switch ((result = fsmagic(r, r->filename))) { + case DONE: + magic_rsl_putchar(r, '\n'); + return OK; + case OK: + break; + default: + /* fatal error, bail out */ + return result; + } + + if (apr_file_open(&fd, r->filename, APR_READ, APR_OS_DEFAULT, r->pool) != APR_SUCCESS) { + /* We can't open it, but we were able to stat it. */ + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + MODNAME ": can't read `%s'", r->filename); + /* let some other handler decide what the problem is */ + return DECLINED; + } + + /* + * try looking at the first HOWMANY bytes + */ + nbytes = sizeof(buf) - 1; + if ((result = apr_file_read(fd, (char *) buf, &nbytes)) != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, result, r, + MODNAME ": read failed: %s", r->filename); + return HTTP_INTERNAL_SERVER_ERROR; + } + + if (nbytes == 0) { + return DECLINED; + } + else { + buf[nbytes++] = '\0'; /* null-terminate it */ + result = tryit(r, buf, nbytes, 1); + if (result != OK) { + return result; + } + } + + (void) apr_file_close(fd); + (void) magic_rsl_putchar(r, '\n'); + + return OK; +} + + +static int tryit(request_rec *r, unsigned char *buf, apr_size_t nb, + int checkzmagic) +{ + /* + * Try compression stuff + */ + if (checkzmagic == 1) { + if (zmagic(r, buf, nb) == 1) + return OK; + } + + /* + * try tests in /etc/magic (or surrogate magic file) + */ + if (softmagic(r, buf, nb) == 1) + return OK; + + /* + * try known keywords, check for ascii-ness too. + */ + if (ascmagic(r, buf, nb) == 1) + return OK; + + /* + * abandon hope, all ye who remain here + */ + return DECLINED; +} + +#define EATAB {while (apr_isspace(*l)) ++l;} + +/* + * apprentice - load configuration from the magic file r + * API request record + */ +static int apprentice(server_rec *s, apr_pool_t *p) +{ + apr_file_t *f = NULL; + apr_status_t result; + char line[BUFSIZ + 1]; + int errs = 0; + int lineno; +#if MIME_MAGIC_DEBUG + int rule = 0; + struct magic *m, *prevm; +#endif + magic_server_config_rec *conf = (magic_server_config_rec *) + ap_get_module_config(s->module_config, &mime_magic_module); + const char *fname = ap_server_root_relative(p, conf->magicfile); + + if (!fname) { + ap_log_error(APLOG_MARK, APLOG_ERR, APR_EBADPATH, s, + MODNAME ": Invalid magic file path %s", conf->magicfile); + return -1; + } + if ((result = apr_file_open(&f, fname, APR_READ | APR_BUFFERED, + APR_OS_DEFAULT, p) != APR_SUCCESS)) { + ap_log_error(APLOG_MARK, APLOG_ERR, result, s, + MODNAME ": can't read magic file %s", fname); + return -1; + } + + /* set up the magic list (empty) */ + conf->magic = conf->last = NULL; + + /* parse it */ + for (lineno = 1; apr_file_gets(line, BUFSIZ, f) == APR_SUCCESS; lineno++) { + int ws_offset; + char *last = line + strlen(line) - 1; /* guaranteed that len >= 1 since an + * "empty" line contains a '\n' + */ + + /* delete newline and any other trailing whitespace */ + while (last >= line + && apr_isspace(*last)) { + *last = '\0'; + --last; + } + + /* skip leading whitespace */ + ws_offset = 0; + while (line[ws_offset] && apr_isspace(line[ws_offset])) { + ws_offset++; + } + + /* skip blank lines */ + if (line[ws_offset] == 0) { + continue; + } + + /* comment, do not parse */ + if (line[ws_offset] == '#') + continue; + +#if MIME_MAGIC_DEBUG + /* if we get here, we're going to use it so count it */ + rule++; +#endif + + /* parse it */ + if (parse(s, p, line + ws_offset, lineno) != 0) + ++errs; + } + + (void) apr_file_close(f); + +#if MIME_MAGIC_DEBUG + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + MODNAME ": apprentice conf=%x file=%s m=%s m->next=%s last=%s", + conf, + conf->magicfile ? conf->magicfile : "NULL", + conf->magic ? "set" : "NULL", + (conf->magic && conf->magic->next) ? "set" : "NULL", + conf->last ? "set" : "NULL"); + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + MODNAME ": apprentice read %d lines, %d rules, %d errors", + lineno, rule, errs); +#endif + +#if MIME_MAGIC_DEBUG + prevm = 0; + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + MODNAME ": apprentice test"); + for (m = conf->magic; m; m = m->next) { + if (apr_isprint((((unsigned long) m) >> 24) & 255) && + apr_isprint((((unsigned long) m) >> 16) & 255) && + apr_isprint((((unsigned long) m) >> 8) & 255) && + apr_isprint(((unsigned long) m) & 255)) { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + MODNAME ": apprentice: POINTER CLOBBERED! " + "m=\"%c%c%c%c\" line=%d", + (((unsigned long) m) >> 24) & 255, + (((unsigned long) m) >> 16) & 255, + (((unsigned long) m) >> 8) & 255, + ((unsigned long) m) & 255, + prevm ? prevm->lineno : -1); + break; + } + prevm = m; + } +#endif + + return (errs ? -1 : 0); +} + +/* + * extend the sign bit if the comparison is to be signed + */ +static unsigned long signextend(server_rec *s, struct magic *m, unsigned long v) +{ + if (!(m->flag & UNSIGNED)) + switch (m->type) { + /* + * Do not remove the casts below. They are vital. When later + * compared with the data, the sign extension must have happened. + */ + case BYTE: + v = (char) v; + break; + case SHORT: + case BESHORT: + case LESHORT: + v = (short) v; + break; + case DATE: + case BEDATE: + case LEDATE: + case LONG: + case BELONG: + case LELONG: + v = (long) v; + break; + case STRING: + break; + default: + ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, + MODNAME ": can't happen: m->type=%d", m->type); + return -1; + } + return v; +} + +/* + * parse one line from magic file, put into magic[index++] if valid + */ +static int parse(server_rec *serv, apr_pool_t *p, char *l, int lineno) +{ + struct magic *m; + char *t, *s; + magic_server_config_rec *conf = (magic_server_config_rec *) + ap_get_module_config(serv->module_config, &mime_magic_module); + + /* allocate magic structure entry */ + m = (struct magic *) apr_pcalloc(p, sizeof(struct magic)); + + /* append to linked list */ + m->next = NULL; + if (!conf->magic || !conf->last) { + conf->magic = conf->last = m; + } + else { + conf->last->next = m; + conf->last = m; + } + + /* set values in magic structure */ + m->flag = 0; + m->cont_level = 0; + m->lineno = lineno; + + while (*l == '>') { + ++l; /* step over */ + m->cont_level++; + } + + if (m->cont_level != 0 && *l == '(') { + ++l; /* step over */ + m->flag |= INDIR; + } + + /* get offset, then skip over it */ + m->offset = (int) strtol(l, &t, 0); + if (l == t) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, serv, + MODNAME ": offset %s invalid", l); + } + l = t; + + if (m->flag & INDIR) { + m->in.type = LONG; + m->in.offset = 0; + /* + * read [.lbs][+-]nnnnn) + */ + if (*l == '.') { + switch (*++l) { + case 'l': + m->in.type = LONG; + break; + case 's': + m->in.type = SHORT; + break; + case 'b': + m->in.type = BYTE; + break; + default: + ap_log_error(APLOG_MARK, APLOG_ERR, 0, serv, + MODNAME ": indirect offset type %c invalid", *l); + break; + } + l++; + } + s = l; + if (*l == '+' || *l == '-') + l++; + if (apr_isdigit((unsigned char) *l)) { + m->in.offset = strtol(l, &t, 0); + if (*s == '-') + m->in.offset = -m->in.offset; + } + else + t = l; + if (*t++ != ')') { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, serv, + MODNAME ": missing ')' in indirect offset"); + } + l = t; + } + + + while (apr_isdigit((unsigned char) *l)) + ++l; + EATAB; + +#define NBYTE 4 +#define NSHORT 5 +#define NLONG 4 +#define NSTRING 6 +#define NDATE 4 +#define NBESHORT 7 +#define NBELONG 6 +#define NBEDATE 6 +#define NLESHORT 7 +#define NLELONG 6 +#define NLEDATE 6 + + if (*l == 'u') { + ++l; + m->flag |= UNSIGNED; + } + + /* get type, skip it */ + if (strncmp(l, "byte", NBYTE) == 0) { + m->type = BYTE; + l += NBYTE; + } + else if (strncmp(l, "short", NSHORT) == 0) { + m->type = SHORT; + l += NSHORT; + } + else if (strncmp(l, "long", NLONG) == 0) { + m->type = LONG; + l += NLONG; + } + else if (strncmp(l, "string", NSTRING) == 0) { + m->type = STRING; + l += NSTRING; + } + else if (strncmp(l, "date", NDATE) == 0) { + m->type = DATE; + l += NDATE; + } + else if (strncmp(l, "beshort", NBESHORT) == 0) { + m->type = BESHORT; + l += NBESHORT; + } + else if (strncmp(l, "belong", NBELONG) == 0) { + m->type = BELONG; + l += NBELONG; + } + else if (strncmp(l, "bedate", NBEDATE) == 0) { + m->type = BEDATE; + l += NBEDATE; + } + else if (strncmp(l, "leshort", NLESHORT) == 0) { + m->type = LESHORT; + l += NLESHORT; + } + else if (strncmp(l, "lelong", NLELONG) == 0) { + m->type = LELONG; + l += NLELONG; + } + else if (strncmp(l, "ledate", NLEDATE) == 0) { + m->type = LEDATE; + l += NLEDATE; + } + else { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, serv, + MODNAME ": type %s invalid", l); + return -1; + } + /* New-style anding: "0 byte&0x80 =0x80 dynamically linked" */ + if (*l == '&') { + ++l; + m->mask = signextend(serv, m, strtol(l, &l, 0)); + } + else + m->mask = ~0L; + EATAB; + + switch (*l) { + case '>': + case '<': + /* Old-style anding: "0 byte &0x80 dynamically linked" */ + case '&': + case '^': + case '=': + m->reln = *l; + ++l; + break; + case '!': + if (m->type != STRING) { + m->reln = *l; + ++l; + break; + } + /* FALL THROUGH */ + default: + if (*l == 'x' && apr_isspace(l[1])) { + m->reln = *l; + ++l; + goto GetDesc; /* Bill The Cat */ + } + m->reln = '='; + break; + } + EATAB; + + if (getvalue(serv, m, &l)) + return -1; + /* + * now get last part - the description + */ + GetDesc: + EATAB; + if (l[0] == '\b') { + ++l; + m->nospflag = 1; + } + else if ((l[0] == '\\') && (l[1] == 'b')) { + ++l; + ++l; + m->nospflag = 1; + } + else + m->nospflag = 0; + strncpy(m->desc, l, sizeof(m->desc) - 1); + m->desc[sizeof(m->desc) - 1] = '\0'; + +#if MIME_MAGIC_DEBUG + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, serv, + MODNAME ": parse line=%d m=%x next=%x cont=%d desc=%s", + lineno, m, m->next, m->cont_level, m->desc); +#endif /* MIME_MAGIC_DEBUG */ + + return 0; +} + +/* + * Read a numeric value from a pointer, into the value union of a magic + * pointer, according to the magic type. Update the string pointer to point + * just after the number read. Return 0 for success, non-zero for failure. + */ +static int getvalue(server_rec *s, struct magic *m, char **p) +{ + int slen; + + if (m->type == STRING) { + *p = getstr(s, *p, m->value.s, sizeof(m->value.s), &slen); + m->vallen = slen; + } + else if (m->reln != 'x') + m->value.l = signextend(s, m, strtol(*p, p, 0)); + return 0; +} + +/* + * Convert a string containing C character escapes. Stop at an unescaped + * space or tab. Copy the converted version to "p", returning its length in + * *slen. Return updated scan pointer as function result. + */ +static char *getstr(server_rec *serv, register char *s, register char *p, + int plen, int *slen) +{ + char *origs = s, *origp = p; + char *pmax = p + plen - 1; + register int c; + register int val; + + while ((c = *s++) != '\0') { + if (apr_isspace(c)) + break; + if (p >= pmax) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, serv, + MODNAME ": string too long: %s", origs); + break; + } + if (c == '\\') { + switch (c = *s++) { + + case '\0': + goto out; + + default: + *p++ = (char) c; + break; + + case 'n': + *p++ = '\n'; + break; + + case 'r': + *p++ = '\r'; + break; + + case 'b': + *p++ = '\b'; + break; + + case 't': + *p++ = '\t'; + break; + + case 'f': + *p++ = '\f'; + break; + + case 'v': + *p++ = '\v'; + break; + + /* \ and up to 3 octal digits */ + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + val = c - '0'; + c = *s++; /* try for 2 */ + if (c >= '0' && c <= '7') { + val = (val << 3) | (c - '0'); + c = *s++; /* try for 3 */ + if (c >= '0' && c <= '7') + val = (val << 3) | (c - '0'); + else + --s; + } + else + --s; + *p++ = (char) val; + break; + + /* \x and up to 3 hex digits */ + case 'x': + val = 'x'; /* Default if no digits */ + c = hextoint(*s++); /* Get next char */ + if (c >= 0) { + val = c; + c = hextoint(*s++); + if (c >= 0) { + val = (val << 4) + c; + c = hextoint(*s++); + if (c >= 0) { + val = (val << 4) + c; + } + else + --s; + } + else + --s; + } + else + --s; + *p++ = (char) val; + break; + } + } + else + *p++ = (char) c; + } + out: + *p = '\0'; + *slen = p - origp; + return s; +} + + +/* Single hex char to int; -1 if not a hex char. */ +static int hextoint(int c) +{ + if (apr_isdigit(c)) + return c - '0'; + if ((c >= 'a') && (c <= 'f')) + return c + 10 - 'a'; + if ((c >= 'A') && (c <= 'F')) + return c + 10 - 'A'; + return -1; +} + + +/* + * return DONE to indicate it's been handled + * return OK to indicate it's a regular file still needing handling + * other returns indicate a failure of some sort + */ +static int fsmagic(request_rec *r, const char *fn) +{ + switch (r->finfo.filetype) { + case APR_DIR: + magic_rsl_puts(r, DIR_MAGIC_TYPE); + return DONE; + case APR_CHR: + /* + * (void) magic_rsl_printf(r,"character special (%d/%d)", + * major(sb->st_rdev), minor(sb->st_rdev)); + */ + (void) magic_rsl_puts(r, MIME_BINARY_UNKNOWN); + return DONE; + case APR_BLK: + /* + * (void) magic_rsl_printf(r,"block special (%d/%d)", + * major(sb->st_rdev), minor(sb->st_rdev)); + */ + (void) magic_rsl_puts(r, MIME_BINARY_UNKNOWN); + return DONE; + /* TODO add code to handle V7 MUX and Blit MUX files */ + case APR_PIPE: + /* + * magic_rsl_puts(r,"fifo (named pipe)"); + */ + (void) magic_rsl_puts(r, MIME_BINARY_UNKNOWN); + return DONE; + case APR_LNK: + /* We used stat(), the only possible reason for this is that the + * symlink is broken. + */ + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + MODNAME ": broken symlink (%s)", fn); + return HTTP_INTERNAL_SERVER_ERROR; + case APR_SOCK: + magic_rsl_puts(r, MIME_BINARY_UNKNOWN); + return DONE; + case APR_REG: + break; + default: + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + MODNAME ": invalid file type %d.", r->finfo.filetype); + return HTTP_INTERNAL_SERVER_ERROR; + } + + /* + * regular file, check next possibility + */ + if (r->finfo.size == 0) { + magic_rsl_puts(r, MIME_TEXT_UNKNOWN); + return DONE; + } + return OK; +} + +/* + * softmagic - lookup one file in database (already read from /etc/magic by + * apprentice.c). Passed the name and FILE * of one file to be typed. + */ + /* ARGSUSED1 *//* nbytes passed for regularity, maybe need later */ +static int softmagic(request_rec *r, unsigned char *buf, apr_size_t nbytes) +{ + if (match(r, buf, nbytes)) + return 1; + + return 0; +} + +/* + * Go through the whole list, stopping if you find a match. Process all the + * continuations of that match before returning. + * + * We support multi-level continuations: + * + * At any time when processing a successful top-level match, there is a current + * continuation level; it represents the level of the last successfully + * matched continuation. + * + * Continuations above that level are skipped as, if we see one, it means that + * the continuation that controls them - i.e, the lower-level continuation + * preceding them - failed to match. + * + * Continuations below that level are processed as, if we see one, it means + * we've finished processing or skipping higher-level continuations under the + * control of a successful or unsuccessful lower-level continuation, and are + * now seeing the next lower-level continuation and should process it. The + * current continuation level reverts to the level of the one we're seeing. + * + * Continuations at the current level are processed as, if we see one, there's + * no lower-level continuation that may have failed. + * + * If a continuation matches, we bump the current continuation level so that + * higher-level continuations are processed. + */ +static int match(request_rec *r, unsigned char *s, apr_size_t nbytes) +{ +#if MIME_MAGIC_DEBUG + int rule_counter = 0; +#endif + int cont_level = 0; + int need_separator = 0; + union VALUETYPE p; + magic_server_config_rec *conf = (magic_server_config_rec *) + ap_get_module_config(r->server->module_config, &mime_magic_module); + struct magic *m; + +#if MIME_MAGIC_DEBUG + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, + MODNAME ": match conf=%x file=%s m=%s m->next=%s last=%s", + conf, + conf->magicfile ? conf->magicfile : "NULL", + conf->magic ? "set" : "NULL", + (conf->magic && conf->magic->next) ? "set" : "NULL", + conf->last ? "set" : "NULL"); +#endif + +#if MIME_MAGIC_DEBUG + for (m = conf->magic; m; m = m->next) { + if (apr_isprint((((unsigned long) m) >> 24) & 255) && + apr_isprint((((unsigned long) m) >> 16) & 255) && + apr_isprint((((unsigned long) m) >> 8) & 255) && + apr_isprint(((unsigned long) m) & 255)) { + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, + MODNAME ": match: POINTER CLOBBERED! " + "m=\"%c%c%c%c\"", + (((unsigned long) m) >> 24) & 255, + (((unsigned long) m) >> 16) & 255, + (((unsigned long) m) >> 8) & 255, + ((unsigned long) m) & 255); + break; + } + } +#endif + + for (m = conf->magic; m; m = m->next) { +#if MIME_MAGIC_DEBUG + rule_counter++; + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, + MODNAME ": line=%d desc=%s", m->lineno, m->desc); +#endif + + /* check if main entry matches */ + if (!mget(r, &p, s, m, nbytes) || + !mcheck(r, &p, m)) { + struct magic *m_cont; + + /* + * main entry didn't match, flush its continuations + */ + if (!m->next || (m->next->cont_level == 0)) { + continue; + } + + m_cont = m->next; + while (m_cont && (m_cont->cont_level != 0)) { +#if MIME_MAGIC_DEBUG + rule_counter++; + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, + MODNAME ": line=%d mc=%x mc->next=%x cont=%d desc=%s", + m_cont->lineno, m_cont, + m_cont->next, m_cont->cont_level, + m_cont->desc); +#endif + /* + * this trick allows us to keep *m in sync when the continue + * advances the pointer + */ + m = m_cont; + m_cont = m_cont->next; + } + continue; + } + + /* if we get here, the main entry rule was a match */ + /* this will be the last run through the loop */ +#if MIME_MAGIC_DEBUG + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, + MODNAME ": rule matched, line=%d type=%d %s", + m->lineno, m->type, + (m->type == STRING) ? m->value.s : ""); +#endif + + /* print the match */ + mprint(r, &p, m); + + /* + * If we printed something, we'll need to print a blank before we + * print something else. + */ + if (m->desc[0]) + need_separator = 1; + /* and any continuations that match */ + cont_level++; + /* + * while (m && m->next && m->next->cont_level != 0 && ( m = m->next + * )) + */ + m = m->next; + while (m && (m->cont_level != 0)) { +#if MIME_MAGIC_DEBUG + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, + MODNAME ": match line=%d cont=%d type=%d %s", + m->lineno, m->cont_level, m->type, + (m->type == STRING) ? m->value.s : ""); +#endif + if (cont_level >= m->cont_level) { + if (cont_level > m->cont_level) { + /* + * We're at the end of the level "cont_level" + * continuations. + */ + cont_level = m->cont_level; + } + if (mget(r, &p, s, m, nbytes) && + mcheck(r, &p, m)) { + /* + * This continuation matched. Print its message, with a + * blank before it if the previous item printed and this + * item isn't empty. + */ + /* space if previous printed */ + if (need_separator + && (m->nospflag == 0) + && (m->desc[0] != '\0') + ) { + (void) magic_rsl_putchar(r, ' '); + need_separator = 0; + } + mprint(r, &p, m); + if (m->desc[0]) + need_separator = 1; + + /* + * If we see any continuations at a higher level, process + * them. + */ + cont_level++; + } + } + + /* move to next continuation record */ + m = m->next; + } +#if MIME_MAGIC_DEBUG + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, + MODNAME ": matched after %d rules", rule_counter); +#endif + return 1; /* all through */ + } +#if MIME_MAGIC_DEBUG + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, + MODNAME ": failed after %d rules", rule_counter); +#endif + return 0; /* no match at all */ +} + +static void mprint(request_rec *r, union VALUETYPE *p, struct magic *m) +{ + char *pp; + unsigned long v; + char time_str[APR_CTIME_LEN]; + + switch (m->type) { + case BYTE: + v = p->b; + break; + + case SHORT: + case BESHORT: + case LESHORT: + v = p->h; + break; + + case LONG: + case BELONG: + case LELONG: + v = p->l; + break; + + case STRING: + if (m->reln == '=') { + (void) magic_rsl_printf(r, m->desc, m->value.s); + } + else { + (void) magic_rsl_printf(r, m->desc, p->s); + } + return; + + case DATE: + case BEDATE: + case LEDATE: + apr_ctime(time_str, apr_time_from_sec(*(time_t *)&p->l)); + pp = time_str; + (void) magic_rsl_printf(r, m->desc, pp); + return; + default: + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + MODNAME ": invalid m->type (%d) in mprint().", + m->type); + return; + } + + v = signextend(r->server, m, v) & m->mask; + (void) magic_rsl_printf(r, m->desc, (unsigned long) v); +} + +/* + * Convert the byte order of the data we are looking at + */ +static int mconvert(request_rec *r, union VALUETYPE *p, struct magic *m) +{ + char *rt; + + switch (m->type) { + case BYTE: + case SHORT: + case LONG: + case DATE: + return 1; + case STRING: + /* Null terminate and eat the return */ + p->s[sizeof(p->s) - 1] = '\0'; + if ((rt = strchr(p->s, '\n')) != NULL) + *rt = '\0'; + return 1; + case BESHORT: + p->h = (short) ((p->hs[0] << 8) | (p->hs[1])); + return 1; + case BELONG: + case BEDATE: + p->l = (long) + ((p->hl[0] << 24) | (p->hl[1] << 16) | (p->hl[2] << 8) | (p->hl[3])); + return 1; + case LESHORT: + p->h = (short) ((p->hs[1] << 8) | (p->hs[0])); + return 1; + case LELONG: + case LEDATE: + p->l = (long) + ((p->hl[3] << 24) | (p->hl[2] << 16) | (p->hl[1] << 8) | (p->hl[0])); + return 1; + default: + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + MODNAME ": invalid type %d in mconvert().", m->type); + return 0; + } +} + + +static int mget(request_rec *r, union VALUETYPE *p, unsigned char *s, + struct magic *m, apr_size_t nbytes) +{ + long offset = m->offset; + + if (offset + sizeof(union VALUETYPE) > nbytes) + return 0; + + memcpy(p, s + offset, sizeof(union VALUETYPE)); + + if (!mconvert(r, p, m)) + return 0; + + if (m->flag & INDIR) { + + switch (m->in.type) { + case BYTE: + offset = p->b + m->in.offset; + break; + case SHORT: + offset = p->h + m->in.offset; + break; + case LONG: + offset = p->l + m->in.offset; + break; + } + + if (offset + sizeof(union VALUETYPE) > nbytes) + return 0; + + memcpy(p, s + offset, sizeof(union VALUETYPE)); + + if (!mconvert(r, p, m)) + return 0; + } + return 1; +} + +static int mcheck(request_rec *r, union VALUETYPE *p, struct magic *m) +{ + register unsigned long l = m->value.l; + register unsigned long v; + int matched; + + if ((m->value.s[0] == 'x') && (m->value.s[1] == '\0')) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + MODNAME ": BOINK"); + return 1; + } + + switch (m->type) { + case BYTE: + v = p->b; + break; + + case SHORT: + case BESHORT: + case LESHORT: + v = p->h; + break; + + case LONG: + case BELONG: + case LELONG: + case DATE: + case BEDATE: + case LEDATE: + v = p->l; + break; + + case STRING: + l = 0; + /* + * What we want here is: v = strncmp(m->value.s, p->s, m->vallen); + * but ignoring any nulls. bcmp doesn't give -/+/0 and isn't + * universally available anyway. + */ + v = 0; + { + register unsigned char *a = (unsigned char *) m->value.s; + register unsigned char *b = (unsigned char *) p->s; + register int len = m->vallen; + + while (--len >= 0) + if ((v = *b++ - *a++) != 0) + break; + } + break; + default: + /* bogosity, pretend that it just wasn't a match */ + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + MODNAME ": invalid type %d in mcheck().", m->type); + return 0; + } + + v = signextend(r->server, m, v) & m->mask; + + switch (m->reln) { + case 'x': +#if MIME_MAGIC_DEBUG + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, + "%lu == *any* = 1", v); +#endif + matched = 1; + break; + + case '!': + matched = v != l; +#if MIME_MAGIC_DEBUG + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, + "%lu != %lu = %d", v, l, matched); +#endif + break; + + case '=': + matched = v == l; +#if MIME_MAGIC_DEBUG + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, + "%lu == %lu = %d", v, l, matched); +#endif + break; + + case '>': + if (m->flag & UNSIGNED) { + matched = v > l; +#if MIME_MAGIC_DEBUG + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, + "%lu > %lu = %d", v, l, matched); +#endif + } + else { + matched = (long) v > (long) l; +#if MIME_MAGIC_DEBUG + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, + "%ld > %ld = %d", v, l, matched); +#endif + } + break; + + case '<': + if (m->flag & UNSIGNED) { + matched = v < l; +#if MIME_MAGIC_DEBUG + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, + "%lu < %lu = %d", v, l, matched); +#endif + } + else { + matched = (long) v < (long) l; +#if MIME_MAGIC_DEBUG + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, + "%ld < %ld = %d", v, l, matched); +#endif + } + break; + + case '&': + matched = (v & l) == l; +#if MIME_MAGIC_DEBUG + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, + "((%lx & %lx) == %lx) = %d", v, l, l, matched); +#endif + break; + + case '^': + matched = (v & l) != l; +#if MIME_MAGIC_DEBUG + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, + "((%lx & %lx) != %lx) = %d", v, l, l, matched); +#endif + break; + + default: + /* bogosity, pretend it didn't match */ + matched = 0; + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + MODNAME ": mcheck: can't happen: invalid relation %d.", + m->reln); + break; + } + + return matched; +} + +/* an optimization over plain strcmp() */ +#define STREQ(a, b) (*(a) == *(b) && strcmp((a), (b)) == 0) + +static int ascmagic(request_rec *r, unsigned char *buf, apr_size_t nbytes) +{ + int has_escapes = 0; + unsigned char *s; + char nbuf[HOWMANY + 1]; /* one extra for terminating '\0' */ + char *token; + register struct names *p; + int small_nbytes; + char *strtok_state; + + /* these are easy, do them first */ + + /* + * for troff, look for . + letter + letter or .\"; this must be done to + * disambiguate tar archives' ./file and other trash from real troff + * input. + */ + if (*buf == '.') { + unsigned char *tp = buf + 1; + + while (apr_isspace(*tp)) + ++tp; /* skip leading whitespace */ + if ((apr_isalnum(*tp) || *tp == '\\') && + (apr_isalnum(*(tp + 1)) || *tp == '"')) { + magic_rsl_puts(r, "application/x-troff"); + return 1; + } + } + if ((*buf == 'c' || *buf == 'C') && apr_isspace(*(buf + 1))) { + /* Fortran */ + magic_rsl_puts(r, "text/plain"); + return 1; + } + + /* look for tokens from names.h - this is expensive!, so we'll limit + * ourselves to only SMALL_HOWMANY bytes */ + small_nbytes = (nbytes > SMALL_HOWMANY) ? SMALL_HOWMANY : nbytes; + /* make a copy of the buffer here because apr_strtok() will destroy it */ + s = (unsigned char *) memcpy(nbuf, buf, small_nbytes); + s[small_nbytes] = '\0'; + has_escapes = (memchr(s, '\033', small_nbytes) != NULL); + while ((token = apr_strtok((char *) s, " \t\n\r\f", &strtok_state)) != NULL) { + s = NULL; /* make apr_strtok() keep on tokin' */ + for (p = names; p < names + NNAMES; p++) { + if (STREQ(p->name, token)) { + magic_rsl_puts(r, types[p->type]); + if (has_escapes) + magic_rsl_puts(r, " (with escape sequences)"); + return 1; + } + } + } + + switch (is_tar(buf, nbytes)) { + case 1: + /* V7 tar archive */ + magic_rsl_puts(r, "application/x-tar"); + return 1; + case 2: + /* POSIX tar archive */ + magic_rsl_puts(r, "application/x-tar"); + return 1; + } + + /* all else fails, but it is ascii... */ + return 0; +} + + +/* + * compress routines: zmagic() - returns 0 if not recognized, uncompresses + * and prints information if recognized uncompress(s, method, old, n, newch) + * - uncompress old into new, using method, return sizeof new + */ + +static struct { + char *magic; + apr_size_t maglen; + char *argv[3]; + int silent; + char *encoding; /* MUST be lowercase */ +} compr[] = { + + /* we use gzip here rather than uncompress because we have to pass + * it a full filename -- and uncompress only considers filenames + * ending with .Z + */ + { + "\037\235", 2, { + "gzip", "-dcq", NULL + }, 0, "x-compress" + }, + { + "\037\213", 2, { + "gzip", "-dcq", NULL + }, 1, "x-gzip" + }, + /* + * XXX pcat does not work, cause I don't know how to make it read stdin, + * so we use gzip + */ + { + "\037\036", 2, { + "gzip", "-dcq", NULL + }, 0, "x-gzip" + }, +}; + +static int ncompr = sizeof(compr) / sizeof(compr[0]); + +static int zmagic(request_rec *r, unsigned char *buf, apr_size_t nbytes) +{ + unsigned char *newbuf; + int newsize; + int i; + + for (i = 0; i < ncompr; i++) { + if (nbytes < compr[i].maglen) + continue; + if (memcmp(buf, compr[i].magic, compr[i].maglen) == 0) + break; + } + + if (i == ncompr) + return 0; + + if ((newsize = uncompress(r, i, &newbuf, nbytes)) > 0) { + if (tryit(r, newbuf, newsize, 0) != OK) { + return 0; + } + + /* set encoding type in the request record */ + r->content_encoding = compr[i].encoding; + } + return 1; +} + + +struct uncompress_parms { + request_rec *r; + int method; +}; + +static int create_uncompress_child(struct uncompress_parms *parm, apr_pool_t *cntxt, + apr_file_t **pipe_in) +{ + int rc = 1; + const char *new_argv[4]; + const char *const *env; + request_rec *r = parm->r; + apr_pool_t *child_context = cntxt; + apr_procattr_t *procattr; + apr_proc_t *procnew; + + /* XXX missing 1.3 logic: + * + * what happens when !compr[parm->method].silent? + * Should we create the err pipe, read it, and copy to the log? + */ + + env = (const char *const *)ap_create_environment(child_context, r->subprocess_env); + + if ((apr_procattr_create(&procattr, child_context) != APR_SUCCESS) || + (apr_procattr_io_set(procattr, APR_FULL_BLOCK, + APR_FULL_BLOCK, APR_NO_PIPE) != APR_SUCCESS) || + (apr_procattr_dir_set(procattr, r->filename) != APR_SUCCESS) || + (apr_procattr_cmdtype_set(procattr, APR_PROGRAM) != APR_SUCCESS)) { + /* Something bad happened, tell the world. */ + ap_log_rerror(APLOG_MARK, APLOG_ERR, APR_ENOPROC, r, + "couldn't setup child process: %s", r->filename); + } + else { + new_argv[0] = compr[parm->method].argv[0]; + new_argv[1] = compr[parm->method].argv[1]; + new_argv[2] = r->filename; + new_argv[3] = NULL; + + procnew = apr_pcalloc(child_context, sizeof(*procnew)); + rc = apr_proc_create(procnew, compr[parm->method].argv[0], + new_argv, env, procattr, child_context); + + if (rc != APR_SUCCESS) { + /* Bad things happened. Everyone should have cleaned up. */ + ap_log_rerror(APLOG_MARK, APLOG_ERR, APR_ENOPROC, r, + MODNAME ": could not execute `%s'.", + compr[parm->method].argv[0]); + } + else { + apr_pool_note_subprocess(child_context, procnew, APR_KILL_AFTER_TIMEOUT); + *pipe_in = procnew->out; + } + } + + return (rc); +} + +static int uncompress(request_rec *r, int method, + unsigned char **newch, apr_size_t n) +{ + struct uncompress_parms parm; + apr_file_t *pipe_out = NULL; + apr_pool_t *sub_context; + apr_status_t rv; + + parm.r = r; + parm.method = method; + + /* We make a sub_pool so that we can collect our child early, otherwise + * there are cases (i.e. generating directory indicies with mod_autoindex) + * where we would end up with LOTS of zombies. + */ + if (apr_pool_create(&sub_context, r->pool) != APR_SUCCESS) + return -1; + + if ((rv = create_uncompress_child(&parm, sub_context, &pipe_out)) != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + MODNAME ": couldn't spawn uncompress process: %s", r->uri); + return -1; + } + + *newch = (unsigned char *) apr_palloc(r->pool, n); + rv = apr_file_read(pipe_out, *newch, &n); + if (n == 0) { + apr_pool_destroy(sub_context); + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + MODNAME ": read failed %s", r->filename); + return -1; + } + apr_pool_destroy(sub_context); + return n; +} + +/* + * is_tar() -- figure out whether file is a tar archive. + * + * Stolen (by author of file utility) from the public domain tar program: Public + * Domain version written 26 Aug 1985 John Gilmore (ihnp4!hoptoad!gnu). + * + * @(#)list.c 1.18 9/23/86 Public Domain - gnu $Id: mod_mime_magic.c,v 1.7 + * 1997/06/24 00:41:02 ikluft Exp ikluft $ + * + * Comments changed and some code/comments reformatted for file command by Ian + * Darwin. + */ + +#define isodigit(c) (((unsigned char)(c) >= '0') && ((unsigned char)(c) <= '7')) + +/* + * Return 0 if the checksum is bad (i.e., probably not a tar archive), 1 for + * old UNIX tar file, 2 for Unix Std (POSIX) tar file. + */ + +static int is_tar(unsigned char *buf, apr_size_t nbytes) +{ + register union record *header = (union record *) buf; + register int i; + register long sum, recsum; + register char *p; + + if (nbytes < sizeof(union record)) + return 0; + + recsum = from_oct(8, header->header.chksum); + + sum = 0; + p = header->charptr; + for (i = sizeof(union record); --i >= 0;) { + /* + * We can't use unsigned char here because of old compilers, e.g. V7. + */ + sum += 0xFF & *p++; + } + + /* Adjust checksum to count the "chksum" field as blanks. */ + for (i = sizeof(header->header.chksum); --i >= 0;) + sum -= 0xFF & header->header.chksum[i]; + sum += ' ' * sizeof header->header.chksum; + + if (sum != recsum) + return 0; /* Not a tar archive */ + + if (0 == strcmp(header->header.magic, TMAGIC)) + return 2; /* Unix Standard tar archive */ + + return 1; /* Old fashioned tar archive */ +} + + +/* + * Quick and dirty octal conversion. + * + * Result is -1 if the field is invalid (all blank, or nonoctal). + */ +static long from_oct(int digs, char *where) +{ + register long value; + + while (apr_isspace(*where)) { /* Skip spaces */ + where++; + if (--digs <= 0) + return -1; /* All blank field */ + } + value = 0; + while (digs > 0 && isodigit(*where)) { /* Scan til nonoctal */ + value = (value << 3) | (*where++ - '0'); + --digs; + } + + if (digs > 0 && *where && !apr_isspace(*where)) + return -1; /* Ended on non-space/nul */ + + return value; +} + +/* + * Check for file-revision suffix + * + * This is for an obscure document control system used on an intranet. + * The web representation of each file's revision has an @1, @2, etc + * appended with the revision number. This needs to be stripped off to + * find the file suffix, which can be recognized by sending the name back + * through a sub-request. The base file name (without the @num suffix) + * must exist because its type will be used as the result. + */ +static int revision_suffix(request_rec *r) +{ + int suffix_pos, result; + char *sub_filename; + request_rec *sub; + +#if MIME_MAGIC_DEBUG + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, + MODNAME ": revision_suffix checking %s", r->filename); +#endif /* MIME_MAGIC_DEBUG */ + + /* check for recognized revision suffix */ + suffix_pos = strlen(r->filename) - 1; + if (!apr_isdigit(r->filename[suffix_pos])) { + return 0; + } + while (suffix_pos >= 0 && apr_isdigit(r->filename[suffix_pos])) + suffix_pos--; + if (suffix_pos < 0 || r->filename[suffix_pos] != '@') { + return 0; + } + + /* perform sub-request for the file name without the suffix */ + result = 0; + sub_filename = apr_pstrndup(r->pool, r->filename, suffix_pos); +#if MIME_MAGIC_DEBUG + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, + MODNAME ": subrequest lookup for %s", sub_filename); +#endif /* MIME_MAGIC_DEBUG */ + sub = ap_sub_req_lookup_file(sub_filename, r, NULL); + + /* extract content type/encoding/language from sub-request */ + if (sub->content_type) { + ap_set_content_type(r, apr_pstrdup(r->pool, sub->content_type)); +#if MIME_MAGIC_DEBUG + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, + MODNAME ": subrequest %s got %s", + sub_filename, r->content_type); +#endif /* MIME_MAGIC_DEBUG */ + if (sub->content_encoding) + r->content_encoding = + apr_pstrdup(r->pool, sub->content_encoding); + if (sub->content_languages) { + int n; + r->content_languages = apr_array_copy(r->pool, + sub->content_languages); + for (n = 0; n < r->content_languages->nelts; ++n) { + char **lang = ((char **)r->content_languages->elts) + n; + *lang = apr_pstrdup(r->pool, *lang); + } + } + result = 1; + } + + /* clean up */ + ap_destroy_sub_req(sub); + + return result; +} + +/* + * initialize the module + */ +static int magic_init(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *main_server) +{ + int result; + magic_server_config_rec *conf; + magic_server_config_rec *main_conf; + server_rec *s; +#if MIME_MAGIC_DEBUG + struct magic *m, *prevm; +#endif /* MIME_MAGIC_DEBUG */ + + main_conf = ap_get_module_config(main_server->module_config, &mime_magic_module); + for (s = main_server; s; s = s->next) { + conf = ap_get_module_config(s->module_config, &mime_magic_module); + if (conf->magicfile == NULL && s != main_server) { + /* inherits from the parent */ + *conf = *main_conf; + } + else if (conf->magicfile) { + result = apprentice(s, p); + if (result == -1) + return OK; +#if MIME_MAGIC_DEBUG + prevm = 0; + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + MODNAME ": magic_init 1 test"); + for (m = conf->magic; m; m = m->next) { + if (apr_isprint((((unsigned long) m) >> 24) & 255) && + apr_isprint((((unsigned long) m) >> 16) & 255) && + apr_isprint((((unsigned long) m) >> 8) & 255) && + apr_isprint(((unsigned long) m) & 255)) { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + MODNAME ": magic_init 1: POINTER CLOBBERED! " + "m=\"%c%c%c%c\" line=%d", + (((unsigned long) m) >> 24) & 255, + (((unsigned long) m) >> 16) & 255, + (((unsigned long) m) >> 8) & 255, + ((unsigned long) m) & 255, + prevm ? prevm->lineno : -1); + break; + } + prevm = m; + } +#endif + } + } + return OK; +} + +/* + * Find the Content-Type from any resource this module has available + */ + +static int magic_find_ct(request_rec *r) +{ + int result; + magic_server_config_rec *conf; + + /* the file has to exist */ + if (r->finfo.filetype == 0 || !r->filename) { + return DECLINED; + } + + /* was someone else already here? */ + if (r->content_type) { + return DECLINED; + } + + conf = ap_get_module_config(r->server->module_config, &mime_magic_module); + if (!conf || !conf->magic) { + return DECLINED; + } + + /* initialize per-request info */ + if (!magic_set_config(r)) { + return HTTP_INTERNAL_SERVER_ERROR; + } + + /* try excluding file-revision suffixes */ + if (revision_suffix(r) != 1) { + /* process it based on the file contents */ + if ((result = magic_process(r)) != OK) { + return result; + } + } + + /* if we have any results, put them in the request structure */ + return magic_rsl_to_request(r); +} + +static void register_hooks(apr_pool_t *p) +{ + static const char * const aszPre[]={ "mod_mime.c", NULL }; + + /* mod_mime_magic should be run after mod_mime, if at all. */ + + ap_hook_type_checker(magic_find_ct, aszPre, NULL, APR_HOOK_MIDDLE); + ap_hook_post_config(magic_init, NULL, NULL, APR_HOOK_FIRST); +} + +/* + * Apache API module interface + */ + +module AP_MODULE_DECLARE_DATA mime_magic_module = +{ + STANDARD20_MODULE_STUFF, + NULL, /* dir config creator */ + NULL, /* dir merger --- default is to override */ + create_magic_server_config, /* server config */ + merge_magic_server_config, /* merge server config */ + mime_magic_cmds, /* command apr_table_t */ + register_hooks /* register hooks */ +}; + + diff --git a/rubbos/app/httpd-2.0.64/modules/metadata/mod_mime_magic.dsp b/rubbos/app/httpd-2.0.64/modules/metadata/mod_mime_magic.dsp new file mode 100644 index 00000000..bbffdfcd --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/metadata/mod_mime_magic.dsp @@ -0,0 +1,128 @@ +# Microsoft Developer Studio Project File - Name="mod_mime_magic" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=mod_mime_magic - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "mod_mime_magic.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 "mod_mime_magic.mak" CFG="mod_mime_magic - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "mod_mime_magic - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_mime_magic - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "mod_mime_magic - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_mime_magic_src" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib ws2_32.lib /nologo /subsystem:windows /dll /out:"Release/mod_mime_magic.so" /base:@..\..\os\win32\BaseAddr.ref,mod_mime_magic.so +# ADD LINK32 kernel32.lib ws2_32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Release/mod_mime_magic.so" /base:@..\..\os\win32\BaseAddr.ref,mod_mime_magic.so /opt:ref + +!ELSEIF "$(CFG)" == "mod_mime_magic - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_mime_magic_src" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib ws2_32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_mime_magic.so" /base:@..\..\os\win32\BaseAddr.ref,mod_mime_magic.so +# ADD LINK32 kernel32.lib ws2_32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_mime_magic.so" /base:@..\..\os\win32\BaseAddr.ref,mod_mime_magic.so + +!ENDIF + +# Begin Target + +# Name "mod_mime_magic - Win32 Release" +# Name "mod_mime_magic - Win32 Debug" +# Begin Source File + +SOURCE=.\mod_mime_magic.c +# End Source File +# Begin Source File + +SOURCE=.\mod_mime_magic.rc +# End Source File +# Begin Source File + +SOURCE=..\..\build\win32\win32ver.awk + +!IF "$(CFG)" == "mod_mime_magic - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_mime_magic.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_mime_magic.so "mime_magic_module for Apache" ../../include/ap_release.h > .\mod_mime_magic.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "mod_mime_magic - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_mime_magic.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_mime_magic.so "mime_magic_module for Apache" ../../include/ap_release.h > .\mod_mime_magic.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/modules/metadata/mod_mime_magic.exp b/rubbos/app/httpd-2.0.64/modules/metadata/mod_mime_magic.exp new file mode 100644 index 00000000..42068a43 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/metadata/mod_mime_magic.exp @@ -0,0 +1 @@ +mime_magic_module diff --git a/rubbos/app/httpd-2.0.64/modules/metadata/mod_setenvif.c b/rubbos/app/httpd-2.0.64/modules/metadata/mod_setenvif.c new file mode 100644 index 00000000..a85806d3 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/metadata/mod_setenvif.c @@ -0,0 +1,586 @@ +/* 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. + */ + +/* + * mod_setenvif.c + * Set environment variables based on matching request headers or + * attributes against regex strings + * + * Paul Sutton <paul@ukweb.com> 27 Oct 1996 + * Based on mod_browser by Alexei Kosut <akosut@organic.com> + */ + +/* + * Used to set environment variables based on the incoming request headers, + * or some selected other attributes of the request (e.g., the remote host + * name). + * + * Usage: + * + * SetEnvIf name regex var ... + * + * where name is either a HTTP request header name, or one of the + * special values (see below). 'name' may be a regex when it is used + * to specify an HTTP request header name. The 'value' of the header + & (or the value of the special value from below) are compared against + * the regex argument. If this is a simple string, a simple sub-string + * match is performed. Otherwise, a request expression match is + * done. If the value matches the string or regular expression, the + * environment variables listed as var ... are set. Each var can + * be in one of three formats: var, which sets the named variable + * (the value value "1"); var=value, which sets the variable to + * the given value; or !var, which unsets the variable is it has + * been previously set. + * + * Normally the strings are compared with regard to case. To ignore + * case, use the directive SetEnvIfNoCase instead. + * + * Special values for 'name' are: + * + * server_addr IP address of interface on which request arrived + * (analogous to SERVER_ADDR set in ap_add_common_vars()) + * remote_host Remote host name (if available) + * remote_addr Remote IP address + * request_method Request method (GET, POST, etc) + * request_uri Requested URI + * + * Examples: + * + * To set the enviroment variable LOCALHOST if the client is the local + * machine: + * + * SetEnvIf remote_addr 127.0.0.1 LOCALHOST + * + * To set LOCAL if the client is the local host, or within our company's + * domain (192.168.10): + * + * SetEnvIf remote_addr 192.168.10. LOCAL + * SetEnvIf remote_addr 127.0.0.1 LOCALHOST + * + * This could be written as: + * + * SetEnvIf remote_addr (127.0.0.1|192.168.10.) LOCAL + * + * To set HAVE_TS if the client request contains any header beginning + * with "TS" with a value beginning with a lower case alphabet: + * + * SetEnvIf ^TS* ^[a-z].* HAVE_TS + */ + +#include "apr.h" +#include "apr_strings.h" +#include "apr_strmatch.h" + +#define APR_WANT_STRFUNC +#include "apr_want.h" + +#include "ap_config.h" +#include "httpd.h" +#include "http_config.h" +#include "http_core.h" +#include "http_log.h" +#include "http_protocol.h" + + +enum special { + SPECIAL_NOT, + SPECIAL_REMOTE_ADDR, + SPECIAL_REMOTE_HOST, + SPECIAL_REQUEST_URI, + SPECIAL_REQUEST_METHOD, + SPECIAL_REQUEST_PROTOCOL, + SPECIAL_SERVER_ADDR +}; +typedef struct { + char *name; /* header name */ + regex_t *pnamereg; /* compiled header name regex */ + char *regex; /* regex to match against */ + regex_t *preg; /* compiled regex */ + const apr_strmatch_pattern *pattern; /* non-regex pattern to match */ + apr_table_t *features; /* env vars to set (or unset) */ + enum special special_type; /* is it a "special" header ? */ + int icase; /* ignoring case? */ +} sei_entry; + +typedef struct { + apr_array_header_t *conditionals; +} sei_cfg_rec; + +module AP_MODULE_DECLARE_DATA setenvif_module; + +/* + * These routines, the create- and merge-config functions, are called + * for both the server-wide and the per-directory contexts. This is + * because the different definitions are used at different times; the + * server-wide ones are used in the post-read-request phase, and the + * per-directory ones are used during the header-parse phase (after + * the URI has been mapped to a file and we have anything from the + * .htaccess file and <Directory> and <Files> containers). + */ +static void *create_setenvif_config(apr_pool_t *p) +{ + sei_cfg_rec *new = (sei_cfg_rec *) apr_palloc(p, sizeof(sei_cfg_rec)); + + new->conditionals = apr_array_make(p, 20, sizeof(sei_entry)); + return (void *) new; +} + +static void *create_setenvif_config_svr(apr_pool_t *p, server_rec *dummy) +{ + return create_setenvif_config(p); +} + +static void *create_setenvif_config_dir(apr_pool_t *p, char *dummy) +{ + return create_setenvif_config(p); +} + +static void *merge_setenvif_config(apr_pool_t *p, void *basev, void *overridesv) +{ + sei_cfg_rec *a = apr_pcalloc(p, sizeof(sei_cfg_rec)); + sei_cfg_rec *base = basev, *overrides = overridesv; + + a->conditionals = apr_array_append(p, base->conditionals, + overrides->conditionals); + return a; +} + +/* + * any non-NULL magic constant will do... used to indicate if REG_ICASE should + * be used + */ +#define ICASE_MAGIC ((void *)(&setenvif_module)) +#define SEI_MAGIC_HEIRLOOM "setenvif-phase-flag" + +static int is_header_regex(apr_pool_t *p, const char* name) +{ + /* If a Header name contains characters other than: + * -,_,[A-Z\, [a-z] and [0-9]. + * assume the header name is a regular expression. + */ + regex_t *preg = ap_pregcomp(p, "^[-A-Za-z0-9_]*$", + (REG_EXTENDED | REG_NOSUB )); + ap_assert(preg != NULL); + + if (ap_regexec(preg, name, 0, NULL, 0)) { + return 1; + } + + return 0; +} + +/* If the input string does not take advantage of regular + * expression metacharacters, return a pointer to an equivalent + * string that can be searched using apr_strmatch(). (The + * returned string will often be the input string. But if + * the input string contains escaped characters, the returned + * string will be a copy with the escapes removed.) + */ +static const char *non_regex_pattern(apr_pool_t *p, const char *s) +{ + const char *src = s; + int escapes_found = 0; + int in_escape = 0; + + while (*src) { + switch (*src) { + case '^': + case '.': + case '$': + case '|': + case '(': + case ')': + case '[': + case ']': + case '*': + case '+': + case '?': + case '{': + case '}': + if (!in_escape) { + return NULL; + } + in_escape = 0; + break; + case '\\': + if (!in_escape) { + in_escape = 1; + escapes_found = 1; + } + else { + in_escape = 0; + } + break; + default: + if (in_escape) { + return NULL; + } + break; + } + src++; + } + if (!escapes_found) { + return s; + } + else { + char *unescaped = (char *)apr_palloc(p, src - s + 1); + char *dst = unescaped; + src = s; + do { + if (*src == '\\') { + src++; + } + } while ((*dst++ = *src++)); + return unescaped; + } +} + +static const char *add_setenvif_core(cmd_parms *cmd, void *mconfig, + char *fname, const char *args) +{ + char *regex; + const char *simple_pattern; + const char *feature; + sei_cfg_rec *sconf; + sei_entry *new; + sei_entry *entries; + char *var; + int i; + int beenhere = 0; + int icase; + + /* + * Determine from our context into which record to put the entry. + * cmd->path == NULL means we're in server-wide context; otherwise, + * we're dealing with a per-directory setting. + */ + sconf = (cmd->path != NULL) + ? (sei_cfg_rec *) mconfig + : (sei_cfg_rec *) ap_get_module_config(cmd->server->module_config, + &setenvif_module); + entries = (sei_entry *) sconf->conditionals->elts; + /* get regex */ + regex = ap_getword_conf(cmd->pool, &args); + if (!*regex) { + return apr_pstrcat(cmd->pool, "Missing regular expression for ", + cmd->cmd->name, NULL); + } + + /* + * If we've already got a sei_entry with the same name we want to + * just copy the name pointer... so that later on we can compare + * two header names just by comparing the pointers. + */ + for (i = 0; i < sconf->conditionals->nelts; ++i) { + new = &entries[i]; + if (!strcasecmp(new->name, fname)) { + fname = new->name; + break; + } + } + + /* if the last entry has an identical headername and regex then + * merge with it + */ + i = sconf->conditionals->nelts - 1; + icase = cmd->info == ICASE_MAGIC; + if (i < 0 + || entries[i].name != fname + || entries[i].icase != icase + || strcmp(entries[i].regex, regex)) { + + /* no match, create a new entry */ + new = apr_array_push(sconf->conditionals); + new->name = fname; + new->regex = regex; + new->icase = icase; + if ((simple_pattern = non_regex_pattern(cmd->pool, regex))) { + new->pattern = apr_strmatch_precompile(cmd->pool, + simple_pattern, !icase); + if (new->pattern == NULL) { + return apr_pstrcat(cmd->pool, cmd->cmd->name, + " pattern could not be compiled.", NULL); + } + new->preg = NULL; + } + else { + new->preg = ap_pregcomp(cmd->pool, regex, + (REG_EXTENDED | (icase ? REG_ICASE : 0))); + if (new->preg == NULL) { + return apr_pstrcat(cmd->pool, cmd->cmd->name, + " regex could not be compiled.", NULL); + } + new->pattern = NULL; + } + new->features = apr_table_make(cmd->pool, 2); + + if (!strcasecmp(fname, "remote_addr")) { + new->special_type = SPECIAL_REMOTE_ADDR; + } + else if (!strcasecmp(fname, "remote_host")) { + new->special_type = SPECIAL_REMOTE_HOST; + } + else if (!strcasecmp(fname, "request_uri")) { + new->special_type = SPECIAL_REQUEST_URI; + } + else if (!strcasecmp(fname, "request_method")) { + new->special_type = SPECIAL_REQUEST_METHOD; + } + else if (!strcasecmp(fname, "request_protocol")) { + new->special_type = SPECIAL_REQUEST_PROTOCOL; + } + else if (!strcasecmp(fname, "server_addr")) { + new->special_type = SPECIAL_SERVER_ADDR; + } + else { + new->special_type = SPECIAL_NOT; + /* Handle fname as a regular expression. + * If fname a simple header string, identify as such + * (new->pnamereg = NULL) to avoid the overhead of searching + * through headers_in for a regex match. + */ + if (is_header_regex(cmd->pool, fname)) { + new->pnamereg = ap_pregcomp(cmd->pool, fname, + (REG_EXTENDED | REG_NOSUB + | (icase ? REG_ICASE : 0))); + if (new->pnamereg == NULL) + return apr_pstrcat(cmd->pool, cmd->cmd->name, + "Header name regex could not be " + "compiled.", NULL); + } + else { + new->pnamereg = NULL; + } + } + } + else { + new = &entries[i]; + } + + for ( ; ; ) { + feature = ap_getword_conf(cmd->pool, &args); + if (!*feature) { + break; + } + beenhere++; + + var = ap_getword(cmd->pool, &feature, '='); + if (*feature) { + apr_table_setn(new->features, var, feature); + } + else if (*var == '!') { + apr_table_setn(new->features, var + 1, "!"); + } + else { + apr_table_setn(new->features, var, "1"); + } + } + + if (!beenhere) { + return apr_pstrcat(cmd->pool, "Missing envariable expression for ", + cmd->cmd->name, NULL); + } + + return NULL; +} + +static const char *add_setenvif(cmd_parms *cmd, void *mconfig, + const char *args) +{ + char *fname; + + /* get header name */ + fname = ap_getword_conf(cmd->pool, &args); + if (!*fname) { + return apr_pstrcat(cmd->pool, "Missing header-field name for ", + cmd->cmd->name, NULL); + } + return add_setenvif_core(cmd, mconfig, fname, args); +} + +/* + * This routine handles the BrowserMatch* directives. It simply turns around + * and feeds them, with the appropriate embellishments, to the general-purpose + * command handler. + */ +static const char *add_browser(cmd_parms *cmd, void *mconfig, const char *args) +{ + return add_setenvif_core(cmd, mconfig, "User-Agent", args); +} + +static const command_rec setenvif_module_cmds[] = +{ + AP_INIT_RAW_ARGS("SetEnvIf", add_setenvif, NULL, OR_FILEINFO, + "A header-name, regex and a list of variables."), + AP_INIT_RAW_ARGS("SetEnvIfNoCase", add_setenvif, ICASE_MAGIC, OR_FILEINFO, + "a header-name, regex and a list of variables."), + AP_INIT_RAW_ARGS("BrowserMatch", add_browser, NULL, OR_FILEINFO, + "A browser regex and a list of variables."), + AP_INIT_RAW_ARGS("BrowserMatchNoCase", add_browser, ICASE_MAGIC, + OR_FILEINFO, + "A browser regex and a list of variables."), + { NULL }, +}; + +/* + * This routine gets called at two different points in request processing: + * once before the URI has been translated (during the post-read-request + * phase) and once after (during the header-parse phase). We use different + * config records for the two different calls to reduce overhead (by not + * re-doing the server-wide settings during directory processing), and + * signal which call it is by having the earlier one pass a flag to the + * later one. + */ +static int match_headers(request_rec *r) +{ + sei_cfg_rec *sconf; + sei_entry *entries; + const apr_table_entry_t *elts; + const char *val; + apr_size_t val_len = 0; + int i, j; + char *last_name; + regmatch_t regm[AP_MAX_REG_MATCH]; + + if (!ap_get_module_config(r->request_config, &setenvif_module)) { + ap_set_module_config(r->request_config, &setenvif_module, + SEI_MAGIC_HEIRLOOM); + sconf = (sei_cfg_rec *) ap_get_module_config(r->server->module_config, + &setenvif_module); + } + else { + sconf = (sei_cfg_rec *) ap_get_module_config(r->per_dir_config, + &setenvif_module); + } + entries = (sei_entry *) sconf->conditionals->elts; + last_name = NULL; + val = NULL; + for (i = 0; i < sconf->conditionals->nelts; ++i) { + sei_entry *b = &entries[i]; + + /* Optimize the case where a bunch of directives in a row use the + * same header. Remember we don't need to strcmp the two header + * names because we made sure the pointers were equal during + * configuration. + */ + if (b->name != last_name) { + last_name = b->name; + switch (b->special_type) { + case SPECIAL_REMOTE_ADDR: + val = r->connection->remote_ip; + break; + case SPECIAL_SERVER_ADDR: + val = r->connection->local_ip; + break; + case SPECIAL_REMOTE_HOST: + val = ap_get_remote_host(r->connection, r->per_dir_config, + REMOTE_NAME, NULL); + break; + case SPECIAL_REQUEST_URI: + val = r->uri; + break; + case SPECIAL_REQUEST_METHOD: + val = r->method; + break; + case SPECIAL_REQUEST_PROTOCOL: + val = r->protocol; + break; + case SPECIAL_NOT: + if (b->pnamereg) { + /* Matching headers_in against a regex. Iterate through + * the headers_in until we find a match or run out of + * headers. + */ + const apr_array_header_t + *arr = apr_table_elts(r->headers_in); + + elts = (const apr_table_entry_t *) arr->elts; + val = NULL; + for (j = 0; j < arr->nelts; ++j) { + if (!ap_regexec(b->pnamereg, elts[j].key, 0, NULL, 0)) { + val = elts[j].val; + } + } + } + else { + /* Not matching against a regex */ + val = apr_table_get(r->headers_in, b->name); + if (val == NULL) { + val = apr_table_get(r->subprocess_env, b->name); + } + } + } + val_len = val ? strlen(val) : 0; + } + + /* + * A NULL value indicates that the header field or special entity + * wasn't present or is undefined. Represent that as an empty string + * so that REs like "^$" will work and allow envariable setting + * based on missing or empty field. + */ + if (val == NULL) { + val = ""; + val_len = 0; + } + + if ((b->pattern && apr_strmatch(b->pattern, val, val_len)) || + (!b->pattern && !ap_regexec(b->preg, val, AP_MAX_REG_MATCH, regm, + 0))) { + const apr_array_header_t *arr = apr_table_elts(b->features); + elts = (const apr_table_entry_t *) arr->elts; + + for (j = 0; j < arr->nelts; ++j) { + if (*(elts[j].val) == '!') { + apr_table_unset(r->subprocess_env, elts[j].key); + } + else { + if (!b->pattern) { + char *replaced = ap_pregsub(r->pool, elts[j].val, val, + AP_MAX_REG_MATCH, regm); + if (replaced) { + apr_table_setn(r->subprocess_env, elts[j].key, + replaced); + } + } + else { + apr_table_setn(r->subprocess_env, elts[j].key, + elts[j].val); + } + } + } + } + } + + return DECLINED; +} + +static void register_hooks(apr_pool_t *p) +{ + ap_hook_header_parser(match_headers, NULL, NULL, APR_HOOK_MIDDLE); + ap_hook_post_read_request(match_headers, NULL, NULL, APR_HOOK_MIDDLE); +} + +module AP_MODULE_DECLARE_DATA setenvif_module = +{ + STANDARD20_MODULE_STUFF, + create_setenvif_config_dir, /* dir config creater */ + merge_setenvif_config, /* dir merger --- default is to override */ + create_setenvif_config_svr, /* server config */ + merge_setenvif_config, /* merge server configs */ + setenvif_module_cmds, /* command apr_table_t */ + register_hooks /* register hooks */ +}; diff --git a/rubbos/app/httpd-2.0.64/modules/metadata/mod_setenvif.dsp b/rubbos/app/httpd-2.0.64/modules/metadata/mod_setenvif.dsp new file mode 100644 index 00000000..cffd4649 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/metadata/mod_setenvif.dsp @@ -0,0 +1,128 @@ +# Microsoft Developer Studio Project File - Name="mod_setenvif" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=mod_setenvif - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "mod_setenvif.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 "mod_setenvif.mak" CFG="mod_setenvif - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "mod_setenvif - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_setenvif - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "mod_setenvif - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_setenvif_src" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /out:"Release/mod_setenvif.so" /base:@..\..\os\win32\BaseAddr.ref,mod_setenvif.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Release/mod_setenvif.so" /base:@..\..\os\win32\BaseAddr.ref,mod_setenvif.so /opt:ref + +!ELSEIF "$(CFG)" == "mod_setenvif - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_setenvif_src" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_setenvif.so" /base:@..\..\os\win32\BaseAddr.ref,mod_setenvif.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_setenvif.so" /base:@..\..\os\win32\BaseAddr.ref,mod_setenvif.so + +!ENDIF + +# Begin Target + +# Name "mod_setenvif - Win32 Release" +# Name "mod_setenvif - Win32 Debug" +# Begin Source File + +SOURCE=.\mod_setenvif.c +# End Source File +# Begin Source File + +SOURCE=.\mod_setenvif.rc +# End Source File +# Begin Source File + +SOURCE=..\..\build\win32\win32ver.awk + +!IF "$(CFG)" == "mod_setenvif - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_setenvif.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_setenvif.so "setenvif_module for Apache" ../../include/ap_release.h > .\mod_setenvif.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "mod_setenvif - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_setenvif.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_setenvif.so "setenvif_module for Apache" ../../include/ap_release.h > .\mod_setenvif.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/modules/metadata/mod_setenvif.exp b/rubbos/app/httpd-2.0.64/modules/metadata/mod_setenvif.exp new file mode 100644 index 00000000..4f3800e3 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/metadata/mod_setenvif.exp @@ -0,0 +1 @@ +setenvif_module diff --git a/rubbos/app/httpd-2.0.64/modules/metadata/mod_setenvif.la b/rubbos/app/httpd-2.0.64/modules/metadata/mod_setenvif.la new file mode 100644 index 00000000..6562d1dc --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/metadata/mod_setenvif.la @@ -0,0 +1,35 @@ +# mod_setenvif.la - a libtool library file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='' + +# Names of this library. +library_names='' + +# The name of the static archive. +old_library='mod_setenvif.a' + +# Libraries that this one depends upon. +dependency_libs=' -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib' + +# Version information for mod_setenvif. +current= +age= +revision= + +# Is this an already installed library? +installed=no + +# Should we warn about portability when linking against -modules? +shouldnotlink=yes + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='' diff --git a/rubbos/app/httpd-2.0.64/modules/metadata/mod_setenvif.lo b/rubbos/app/httpd-2.0.64/modules/metadata/mod_setenvif.lo new file mode 100644 index 00000000..1a7420ba --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/metadata/mod_setenvif.lo @@ -0,0 +1,12 @@ +# mod_setenvif.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/mod_setenvif.o' + +# Name of the non-PIC object. +non_pic_object='mod_setenvif.o' + diff --git a/rubbos/app/httpd-2.0.64/modules/metadata/mod_setenvif.o b/rubbos/app/httpd-2.0.64/modules/metadata/mod_setenvif.o new file mode 100644 index 0000000000000000000000000000000000000000..0f0fee97a9b7ce5dc159996af3ea6bd305c4206b GIT binary patch literal 55768 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�l^+|S;aef`BRdKY>!?WKEKukbza$o8Y# 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 a&r-Oon|TVC^{Y(bvX0>Mt=;-1AO1hmX=|AP literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/modules/metadata/mod_unique_id.c b/rubbos/app/httpd-2.0.64/modules/metadata/mod_unique_id.c new file mode 100644 index 00000000..faf1dbd0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/metadata/mod_unique_id.c @@ -0,0 +1,367 @@ +/* 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. + */ + +/* + * mod_unique_id.c: generate a unique identifier for each request + * + * Original author: Dean Gaudet <dgaudet@arctic.org> + * UUencoding modified by: Alvaro Martinez Echevarria <alvaro@lander.es> + */ + +#define APR_WANT_BYTEFUNC /* for htons() et al */ +#include "apr_want.h" +#include "apr_general.h" /* for APR_OFFSETOF */ +#include "apr_network_io.h" + +#include "httpd.h" +#include "http_config.h" +#include "http_log.h" +#include "http_protocol.h" /* for ap_hook_post_read_request */ + +#if APR_HAVE_UNISTD_H +#include <unistd.h> /* for getpid() */ +#endif + +typedef struct { + unsigned int stamp; + unsigned int in_addr; + unsigned int pid; + unsigned short counter; + unsigned int thread_index; +} unique_id_rec; + +/* We are using thread_index (the index into the scoreboard), because we + * cannot guarantee the thread_id will be an integer. + * + * This code looks like it won't give a unique ID with the new thread logic. + * It will. The reason is, we don't increment the counter in a thread_safe + * manner. Because the thread_index is also in the unique ID now, this does + * not matter. In order for the id to not be unique, the same thread would + * have to get the same counter twice in the same second. + */ + +/* Comments: + * + * We want an identifier which is unique across all hits, everywhere. + * "everywhere" includes multiple httpd instances on the same machine, or on + * multiple machines. Essentially "everywhere" should include all possible + * httpds across all servers at a particular "site". We make some assumptions + * that if the site has a cluster of machines then their time is relatively + * synchronized. We also assume that the first address returned by a + * gethostbyname (gethostname()) is unique across all the machines at the + * "site". + * + * We also further assume that pids fit in 32-bits. If something uses more + * than 32-bits, the fix is trivial, but it requires the unrolled uuencoding + * loop to be extended. * A similar fix is needed to support multithreaded + * servers, using a pid/tid combo. + * + * Together, the in_addr and pid are assumed to absolutely uniquely identify + * this one child from all other currently running children on all servers + * (including this physical server if it is running multiple httpds) from each + * other. + * + * The stamp and counter are used to distinguish all hits for a particular + * (in_addr,pid) pair. The stamp is updated using r->request_time, + * saving cpu cycles. The counter is never reset, and is used to permit up to + * 64k requests in a single second by a single child. + * + * The 112-bits of unique_id_rec are encoded using the alphabet + * [A-Za-z0-9@-], resulting in 19 bytes of printable characters. That is then + * stuffed into the environment variable UNIQUE_ID so that it is available to + * other modules. The alphabet choice differs from normal base64 encoding + * [A-Za-z0-9+/] because + and / are special characters in URLs and we want to + * make it easy to use UNIQUE_ID in URLs. + * + * Note that UNIQUE_ID should be considered an opaque token by other + * applications. No attempt should be made to dissect its internal components. + * It is an abstraction that may change in the future as the needs of this + * module change. + * + * It is highly desirable that identifiers exist for "eternity". But future + * needs (such as much faster webservers, moving to 64-bit pids, or moving to a + * multithreaded server) may dictate a need to change the contents of + * unique_id_rec. Such a future implementation should ensure that the first + * field is still a time_t stamp. By doing that, it is possible for a site to + * have a "flag second" in which they stop all of their old-format servers, + * wait one entire second, and then start all of their new-servers. This + * procedure will ensure that the new space of identifiers is completely unique + * from the old space. (Since the first four unencoded bytes always differ.) + */ +/* + * Sun Jun 7 05:43:49 CEST 1998 -- Alvaro + * More comments: + * 1) The UUencoding prodecure is now done in a general way, avoiding the problems + * with sizes and paddings that can arise depending on the architecture. Now the + * offsets and sizes of the elements of the unique_id_rec structure are calculated + * in unique_id_global_init; and then used to duplicate the structure without the + * paddings that might exist. The multithreaded server fix should be now very easy: + * just add a new "tid" field to the unique_id_rec structure, and increase by one + * UNIQUE_ID_REC_MAX. + * 2) unique_id_rec.stamp has been changed from "time_t" to "unsigned int", because + * its size is 64bits on some platforms (linux/alpha), and this caused problems with + * htonl/ntohl. Well, this shouldn't be a problem till year 2106. + */ + +static unsigned global_in_addr; + +static unique_id_rec cur_unique_id; + +/* + * Number of elements in the structure unique_id_rec. + */ +#define UNIQUE_ID_REC_MAX 5 + +static unsigned short unique_id_rec_offset[UNIQUE_ID_REC_MAX], + unique_id_rec_size[UNIQUE_ID_REC_MAX], + unique_id_rec_total_size, + unique_id_rec_size_uu; + +static int unique_id_global_init(apr_pool_t *p, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *main_server) +{ + char str[APRMAXHOSTLEN + 1]; + apr_status_t rv; + char *ipaddrstr; + apr_sockaddr_t *sockaddr; + + /* + * Calculate the sizes and offsets in cur_unique_id. + */ + unique_id_rec_offset[0] = APR_OFFSETOF(unique_id_rec, stamp); + unique_id_rec_size[0] = sizeof(cur_unique_id.stamp); + unique_id_rec_offset[1] = APR_OFFSETOF(unique_id_rec, in_addr); + unique_id_rec_size[1] = sizeof(cur_unique_id.in_addr); + unique_id_rec_offset[2] = APR_OFFSETOF(unique_id_rec, pid); + unique_id_rec_size[2] = sizeof(cur_unique_id.pid); + unique_id_rec_offset[3] = APR_OFFSETOF(unique_id_rec, counter); + unique_id_rec_size[3] = sizeof(cur_unique_id.counter); + unique_id_rec_offset[4] = APR_OFFSETOF(unique_id_rec, thread_index); + unique_id_rec_size[4] = sizeof(cur_unique_id.thread_index); + unique_id_rec_total_size = unique_id_rec_size[0] + unique_id_rec_size[1] + + unique_id_rec_size[2] + unique_id_rec_size[3] + + unique_id_rec_size[4]; + + /* + * Calculate the size of the structure when encoded. + */ + unique_id_rec_size_uu = (unique_id_rec_total_size*8+5)/6; + + /* + * Now get the global in_addr. Note that it is not sufficient to use one + * of the addresses from the main_server, since those aren't as likely to + * be unique as the physical address of the machine + */ + if ((rv = apr_gethostname(str, sizeof(str) - 1, p)) != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ALERT, rv, main_server, + "mod_unique_id: unable to find hostname of the server"); + return HTTP_INTERNAL_SERVER_ERROR; + } + + if ((rv = apr_sockaddr_info_get(&sockaddr, str, AF_INET, 0, 0, p)) == APR_SUCCESS) { + global_in_addr = sockaddr->sa.sin.sin_addr.s_addr; + } + else { + ap_log_error(APLOG_MARK, APLOG_ALERT, rv, main_server, + "mod_unique_id: unable to find IPv4 address of \"%s\"", str); +#if APR_HAVE_IPV6 + if ((rv = apr_sockaddr_info_get(&sockaddr, str, AF_INET6, 0, 0, p)) == APR_SUCCESS) { + memcpy(&global_in_addr, + (char *)sockaddr->ipaddr_ptr + sockaddr->ipaddr_len - sizeof(global_in_addr), + sizeof(global_in_addr)); + ap_log_error(APLOG_MARK, APLOG_ALERT, rv, main_server, + "mod_unique_id: using low-order bits of IPv6 address " + "as if they were unique"); + } + else +#endif + return HTTP_INTERNAL_SERVER_ERROR; + } + + apr_sockaddr_ip_get(&ipaddrstr, sockaddr); + ap_log_error(APLOG_MARK, APLOG_INFO, 0, main_server, + "mod_unique_id: using ip addr %s", + ipaddrstr); + + /* + * If the server is pummelled with restart requests we could possibly end + * up in a situation where we're starting again during the same second + * that has been used in previous identifiers. Avoid that situation. + * + * In truth, for this to actually happen not only would it have to restart + * in the same second, but it would have to somehow get the same pids as + * one of the other servers that was running in that second. Which would + * mean a 64k wraparound on pids ... not very likely at all. + * + * But protecting against it is relatively cheap. We just sleep into the + * next second. + */ + apr_sleep(apr_time_from_sec(1) - apr_time_usec(apr_time_now())); + return OK; +} + +static void unique_id_child_init(apr_pool_t *p, server_rec *s) +{ + pid_t pid; + apr_time_t tv; + + /* + * Note that we use the pid because it's possible that on the same + * physical machine there are multiple servers (i.e. using Listen). But + * it's guaranteed that none of them will share the same pids between + * children. + * + * XXX: for multithread this needs to use a pid/tid combo and probably + * needs to be expanded to 32 bits + */ + pid = getpid(); + cur_unique_id.pid = pid; + + /* + * Test our assumption that the pid is 32-bits. It's possible that + * 64-bit machines will declare pid_t to be 64 bits but only use 32 + * of them. It would have been really nice to test this during + * global_init ... but oh well. + */ + if ((pid_t)cur_unique_id.pid != pid) { + ap_log_error(APLOG_MARK, APLOG_CRIT, 0, s, + "oh no! pids are greater than 32-bits! I'm broken!"); + } + + cur_unique_id.in_addr = global_in_addr; + + /* + * If we use 0 as the initial counter we have a little less protection + * against restart problems, and a little less protection against a clock + * going backwards in time. + */ + tv = apr_time_now(); + /* Some systems have very low variance on the low end of their system + * counter, defend against that. + */ + cur_unique_id.counter = (unsigned short)(apr_time_usec(tv) / 10); + + /* + * We must always use network ordering for these bytes, so that + * identifiers are comparable between machines of different byte + * orderings. Note in_addr is already in network order. + */ + cur_unique_id.pid = htonl(cur_unique_id.pid); + cur_unique_id.counter = htons(cur_unique_id.counter); +} + +/* NOTE: This is *NOT* the same encoding used by base64encode ... the last two + * characters should be + and /. But those two characters have very special + * meanings in URLs, and we want to make it easy to use identifiers in + * URLs. So we replace them with @ and -. + */ +static const char uuencoder[64] = { + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', + 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', + 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', + 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '@', '-', +}; + +static int gen_unique_id(request_rec *r) +{ + char *str; + /* + * Buffer padded with two final bytes, used to copy the unique_id_red + * structure without the internal paddings that it could have. + */ + unique_id_rec new_unique_id; + struct { + unique_id_rec foo; + unsigned char pad[2]; + } paddedbuf; + unsigned char *x,*y; + unsigned short counter; + const char *e; + int i,j,k; + + /* copy the unique_id if this is an internal redirect (we're never + * actually called for sub requests, so we don't need to test for + * them) */ + if (r->prev && (e = apr_table_get(r->subprocess_env, "REDIRECT_UNIQUE_ID"))) { + apr_table_setn(r->subprocess_env, "UNIQUE_ID", e); + return DECLINED; + } + + new_unique_id.in_addr = cur_unique_id.in_addr; + new_unique_id.pid = cur_unique_id.pid; + new_unique_id.counter = cur_unique_id.counter; + + new_unique_id.stamp = htonl((unsigned int)r->request_time); + new_unique_id.thread_index = htonl((unsigned int)r->connection->id); + + /* we'll use a temporal buffer to avoid uuencoding the possible internal + * paddings of the original structure */ + x = (unsigned char *) &paddedbuf; + y = (unsigned char *) &new_unique_id; + k = 0; + for (i = 0; i < UNIQUE_ID_REC_MAX; i++) { + y = ((unsigned char *) &new_unique_id) + unique_id_rec_offset[i]; + for (j = 0; j < unique_id_rec_size[i]; j++, k++) { + x[k] = y[j]; + } + } + /* + * We reset two more bytes just in case padding is needed for the uuencoding. + */ + x[k++] = '\0'; + x[k++] = '\0'; + + /* alloc str and do the uuencoding */ + str = (char *)apr_palloc(r->pool, unique_id_rec_size_uu + 1); + k = 0; + for (i = 0; i < unique_id_rec_total_size; i += 3) { + y = x + i; + str[k++] = uuencoder[y[0] >> 2]; + str[k++] = uuencoder[((y[0] & 0x03) << 4) | ((y[1] & 0xf0) >> 4)]; + if (k == unique_id_rec_size_uu) break; + str[k++] = uuencoder[((y[1] & 0x0f) << 2) | ((y[2] & 0xc0) >> 6)]; + if (k == unique_id_rec_size_uu) break; + str[k++] = uuencoder[y[2] & 0x3f]; + } + str[k++] = '\0'; + + /* set the environment variable */ + apr_table_setn(r->subprocess_env, "UNIQUE_ID", str); + + /* and increment the identifier for the next call */ + + counter = ntohs(new_unique_id.counter) + 1; + cur_unique_id.counter = htons(counter); + + return DECLINED; +} + +static void register_hooks(apr_pool_t *p) +{ + ap_hook_post_config(unique_id_global_init, NULL, NULL, APR_HOOK_MIDDLE); + ap_hook_child_init(unique_id_child_init, NULL, NULL, APR_HOOK_MIDDLE); + ap_hook_post_read_request(gen_unique_id, NULL, NULL, APR_HOOK_MIDDLE); +} + +module AP_MODULE_DECLARE_DATA unique_id_module = { + STANDARD20_MODULE_STUFF, + NULL, /* dir config creater */ + NULL, /* dir merger --- default is to override */ + NULL, /* server config */ + NULL, /* merge server configs */ + NULL, /* command apr_table_t */ + register_hooks /* register hooks */ +}; diff --git a/rubbos/app/httpd-2.0.64/modules/metadata/mod_unique_id.dsp b/rubbos/app/httpd-2.0.64/modules/metadata/mod_unique_id.dsp new file mode 100644 index 00000000..9c80da49 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/metadata/mod_unique_id.dsp @@ -0,0 +1,128 @@ +# Microsoft Developer Studio Project File - Name="mod_unique_id" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=mod_unique_id - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "mod_unique_id.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 "mod_unique_id.mak" CFG="mod_unique_id - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "mod_unique_id - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_unique_id - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "mod_unique_id - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_unique_id_src" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib ws2_32.lib /nologo /subsystem:windows /dll /out:"Release/mod_unique_id.so" /base:@..\..\os\win32\BaseAddr.ref,mod_unique_id.so +# ADD LINK32 kernel32.lib ws2_32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Release/mod_unique_id.so" /base:@..\..\os\win32\BaseAddr.ref,mod_unique_id.so /opt:ref + +!ELSEIF "$(CFG)" == "mod_unique_id - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_unique_id_src" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib ws2_32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_unique_id.so" /base:@..\..\os\win32\BaseAddr.ref,mod_unique_id.so +# ADD LINK32 kernel32.lib ws2_32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_unique_id.so" /base:@..\..\os\win32\BaseAddr.ref,mod_unique_id.so + +!ENDIF + +# Begin Target + +# Name "mod_unique_id - Win32 Release" +# Name "mod_unique_id - Win32 Debug" +# Begin Source File + +SOURCE=.\mod_unique_id.c +# End Source File +# Begin Source File + +SOURCE=.\mod_unique_id.rc +# End Source File +# Begin Source File + +SOURCE=..\..\build\win32\win32ver.awk + +!IF "$(CFG)" == "mod_unique_id - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_unique_id.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_unique_id.so "unique_id_module for Apache" ../../include/ap_release.h > .\mod_unique_id.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "mod_unique_id - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_unique_id.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_unique_id.so "unique_id_module for Apache" ../../include/ap_release.h > .\mod_unique_id.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/modules/metadata/mod_unique_id.exp b/rubbos/app/httpd-2.0.64/modules/metadata/mod_unique_id.exp new file mode 100644 index 00000000..93000f1e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/metadata/mod_unique_id.exp @@ -0,0 +1 @@ +unique_id_module diff --git a/rubbos/app/httpd-2.0.64/modules/metadata/mod_usertrack.c b/rubbos/app/httpd-2.0.64/modules/metadata/mod_usertrack.c new file mode 100644 index 00000000..94c46a37 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/metadata/mod_usertrack.c @@ -0,0 +1,454 @@ +/* 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. + */ + +/* User Tracking Module (Was mod_cookies.c) + * + * *** IMPORTANT NOTE: This module is not designed to generate + * *** cryptographically secure cookies. This means you should not + * *** use cookies generated by this module for authentication purposes + * + * This Apache module is designed to track users paths through a site. + * It uses the client-side state ("Cookie") protocol developed by Netscape. + * It is known to work on most browsers. + * + * Each time a page is requested we look to see if the browser is sending + * us a Cookie: header that we previously generated. + * + * If we don't find one then the user hasn't been to this site since + * starting their browser or their browser doesn't support cookies. So + * we generate a unique Cookie for the transaction and send it back to + * the browser (via a "Set-Cookie" header) + * Future requests from the same browser should keep the same Cookie line. + * + * By matching up all the requests with the same cookie you can + * work out exactly what path a user took through your site. To log + * the cookie use the " %{Cookie}n " directive in a custom access log; + * + * Example 1 : If you currently use the standard Log file format (CLF) + * and use the command "TransferLog somefilename", add the line + * LogFormat "%h %l %u %t \"%r\" %s %b %{Cookie}n" + * to your config file. + * + * Example 2 : If you used to use the old "CookieLog" directive, you + * can emulate it by adding the following command to your config file + * CustomLog filename "%{Cookie}n \"%r\" %t" + * + * Mark Cox, mjc@apache.org, 6 July 95 + * + * This file replaces mod_cookies.c + */ + +#include "apr.h" +#include "apr_lib.h" +#include "apr_strings.h" + +#define APR_WANT_STRFUNC +#include "apr_want.h" + +#include "httpd.h" +#include "http_config.h" +#include "http_core.h" +#include "http_request.h" + + +module AP_MODULE_DECLARE_DATA usertrack_module; + +typedef struct { + int always; + int expires; +} cookie_log_state; + +typedef enum { + CT_UNSET, + CT_NETSCAPE, + CT_COOKIE, + CT_COOKIE2 +} cookie_type_e; + +typedef struct { + int enabled; + cookie_type_e style; + char *cookie_name; + char *cookie_domain; + char *regexp_string; /* used to compile regexp; save for debugging */ + regex_t *regexp; /* used to find usertrack cookie in cookie header */ +} cookie_dir_rec; + +/* Make Cookie: Now we have to generate something that is going to be + * pretty unique. We can base it on the pid, time, hostip */ + +#define COOKIE_NAME "Apache" + +static void make_cookie(request_rec *r) +{ + cookie_log_state *cls = ap_get_module_config(r->server->module_config, + &usertrack_module); + /* 1024 == hardcoded constant */ + char cookiebuf[1024]; + char *new_cookie; + const char *rname = ap_get_remote_host(r->connection, r->per_dir_config, + REMOTE_NAME, NULL); + cookie_dir_rec *dcfg; + + dcfg = ap_get_module_config(r->per_dir_config, &usertrack_module); + + /* XXX: hmm, this should really tie in with mod_unique_id */ + apr_snprintf(cookiebuf, sizeof(cookiebuf), "%s.%" APR_TIME_T_FMT, rname, + apr_time_now()); + + if (cls->expires) { + + /* Cookie with date; as strftime '%a, %d-%h-%y %H:%M:%S GMT' */ + new_cookie = apr_psprintf(r->pool, "%s=%s; path=/", + dcfg->cookie_name, cookiebuf); + + if ((dcfg->style == CT_UNSET) || (dcfg->style == CT_NETSCAPE)) { + apr_time_exp_t tms; + apr_time_exp_gmt(&tms, r->request_time + + apr_time_from_sec(cls->expires)); + new_cookie = apr_psprintf(r->pool, + "%s; expires=%s, " + "%.2d-%s-%.2d %.2d:%.2d:%.2d GMT", + new_cookie, apr_day_snames[tms.tm_wday], + tms.tm_mday, + apr_month_snames[tms.tm_mon], + tms.tm_year % 100, + tms.tm_hour, tms.tm_min, tms.tm_sec); + } + else { + new_cookie = apr_psprintf(r->pool, "%s; max-age=%d", + new_cookie, cls->expires); + } + } + else { + new_cookie = apr_psprintf(r->pool, "%s=%s; path=/", + dcfg->cookie_name, cookiebuf); + } + if (dcfg->cookie_domain != NULL) { + new_cookie = apr_pstrcat(r->pool, new_cookie, "; domain=", + dcfg->cookie_domain, + (dcfg->style == CT_COOKIE2 + ? "; version=1" + : ""), + NULL); + } + + apr_table_addn(r->headers_out, + (dcfg->style == CT_COOKIE2 ? "Set-Cookie2" : "Set-Cookie"), + new_cookie); + apr_table_setn(r->notes, "cookie", apr_pstrdup(r->pool, cookiebuf)); /* log first time */ + return; +} + +/* dcfg->regexp is "^cookie_name=([^;]+)|;[ \t]+cookie_name=([^;]+)", + * which has three subexpressions, $0..$2 */ +#define NUM_SUBS 3 + +static void set_and_comp_regexp(cookie_dir_rec *dcfg, + apr_pool_t *p, + const char *cookie_name) +{ + int danger_chars = 0; + const char *sp = cookie_name; + + /* The goal is to end up with this regexp, + * ^cookie_name=([^;]+)|;[\t]+cookie_name=([^;]+) + * with cookie_name obviously substituted either + * with the real cookie name set by the user in httpd.conf, or with the + * default COOKIE_NAME. + */ + + /* Anyway, we need to escape the cookie_name before pasting it + * into the regex + */ + while (*sp) { + if (!apr_isalnum(*sp)) { + ++danger_chars; + } + ++sp; + } + + if (danger_chars) { + char *cp; + cp = apr_palloc(p, sp - cookie_name + danger_chars + 1); /* 1 == \0 */ + sp = cookie_name; + cookie_name = cp; + while (*sp) { + if (!apr_isalnum(*sp)) { + *cp++ = '\\'; + } + *cp++ = *sp++; + } + *cp = '\0'; + } + + dcfg->regexp_string = apr_pstrcat(p, "^", + cookie_name, + "=([^;]+)|;[ \t]+", + cookie_name, + "=([^;]+)", NULL); + + dcfg->regexp = ap_pregcomp(p, dcfg->regexp_string, REG_EXTENDED); + ap_assert(dcfg->regexp != NULL); +} + +static int spot_cookie(request_rec *r) +{ + cookie_dir_rec *dcfg = ap_get_module_config(r->per_dir_config, + &usertrack_module); + const char *cookie_header; + regmatch_t regm[NUM_SUBS]; + + /* Do not run in subrequests */ + if (!dcfg->enabled || r->main) { + return DECLINED; + } + + if ((cookie_header = apr_table_get(r->headers_in, "Cookie"))) { + if (!ap_regexec(dcfg->regexp, cookie_header, NUM_SUBS, regm, 0)) { + char *cookieval = NULL; + /* Our regexp, + * ^cookie_name=([^;]+)|;[ \t]+cookie_name=([^;]+) + * only allows for $1 or $2 to be available. ($0 is always + * filled with the entire matched expression, not just + * the part in parentheses.) So just check for either one + * and assign to cookieval if present. */ + if (regm[1].rm_so != -1) { + cookieval = ap_pregsub(r->pool, "$1", cookie_header, + NUM_SUBS, regm); + } + if (regm[2].rm_so != -1) { + cookieval = ap_pregsub(r->pool, "$2", cookie_header, + NUM_SUBS, regm); + } + /* Set the cookie in a note, for logging */ + apr_table_setn(r->notes, "cookie", cookieval); + + return DECLINED; /* There's already a cookie, no new one */ + } + } + make_cookie(r); + return OK; /* We set our cookie */ +} + +static void *make_cookie_log_state(apr_pool_t *p, server_rec *s) +{ + cookie_log_state *cls = + (cookie_log_state *) apr_palloc(p, sizeof(cookie_log_state)); + + cls->expires = 0; + + return (void *) cls; +} + +static void *make_cookie_dir(apr_pool_t *p, char *d) +{ + cookie_dir_rec *dcfg; + + dcfg = (cookie_dir_rec *) apr_pcalloc(p, sizeof(cookie_dir_rec)); + dcfg->cookie_name = COOKIE_NAME; + dcfg->cookie_domain = NULL; + dcfg->style = CT_UNSET; + dcfg->enabled = 0; + + /* In case the user does not use the CookieName directive, + * we need to compile the regexp for the default cookie name. */ + set_and_comp_regexp(dcfg, p, COOKIE_NAME); + + return dcfg; +} + +static const char *set_cookie_enable(cmd_parms *cmd, void *mconfig, int arg) +{ + cookie_dir_rec *dcfg = mconfig; + + dcfg->enabled = arg; + return NULL; +} + +static const char *set_cookie_exp(cmd_parms *parms, void *dummy, + const char *arg) +{ + cookie_log_state *cls; + time_t factor, modifier = 0; + time_t num = 0; + char *word; + + cls = ap_get_module_config(parms->server->module_config, + &usertrack_module); + /* The simple case first - all numbers (we assume) */ + if (apr_isdigit(arg[0]) && apr_isdigit(arg[strlen(arg) - 1])) { + cls->expires = atol(arg); + return NULL; + } + + /* + * The harder case - stolen from mod_expires + * + * CookieExpires "[plus] {<num> <type>}*" + */ + + word = ap_getword_conf(parms->pool, &arg); + if (!strncasecmp(word, "plus", 1)) { + word = ap_getword_conf(parms->pool, &arg); + }; + + /* {<num> <type>}* */ + while (word[0]) { + /* <num> */ + if (apr_isdigit(word[0])) + num = atoi(word); + else + return "bad expires code, numeric value expected."; + + /* <type> */ + word = ap_getword_conf(parms->pool, &arg); + if (!word[0]) + return "bad expires code, missing <type>"; + + factor = 0; + if (!strncasecmp(word, "years", 1)) + factor = 60 * 60 * 24 * 365; + else if (!strncasecmp(word, "months", 2)) + factor = 60 * 60 * 24 * 30; + else if (!strncasecmp(word, "weeks", 1)) + factor = 60 * 60 * 24 * 7; + else if (!strncasecmp(word, "days", 1)) + factor = 60 * 60 * 24; + else if (!strncasecmp(word, "hours", 1)) + factor = 60 * 60; + else if (!strncasecmp(word, "minutes", 2)) + factor = 60; + else if (!strncasecmp(word, "seconds", 1)) + factor = 1; + else + return "bad expires code, unrecognized type"; + + modifier = modifier + factor * num; + + /* next <num> */ + word = ap_getword_conf(parms->pool, &arg); + } + + cls->expires = modifier; + + return NULL; +} + +static const char *set_cookie_name(cmd_parms *cmd, void *mconfig, + const char *name) +{ + cookie_dir_rec *dcfg = (cookie_dir_rec *) mconfig; + + dcfg->cookie_name = apr_pstrdup(cmd->pool, name); + + set_and_comp_regexp(dcfg, cmd->pool, name); + + if (dcfg->regexp == NULL) { + return "Regular expression could not be compiled."; + } + if (dcfg->regexp->re_nsub + 1 != NUM_SUBS) { + return apr_pstrcat(cmd->pool, "Invalid cookie name \"", + name, "\"", NULL); + } + + return NULL; +} + +/* + * Set the value for the 'Domain=' attribute. + */ +static const char *set_cookie_domain(cmd_parms *cmd, void *mconfig, + const char *name) +{ + cookie_dir_rec *dcfg; + + dcfg = (cookie_dir_rec *) mconfig; + + /* + * Apply the restrictions on cookie domain attributes. + */ + if (strlen(name) == 0) { + return "CookieDomain values may not be null"; + } + if (name[0] != '.') { + return "CookieDomain values must begin with a dot"; + } + if (ap_strchr_c(&name[1], '.') == NULL) { + return "CookieDomain values must contain at least one embedded dot"; + } + + dcfg->cookie_domain = apr_pstrdup(cmd->pool, name); + return NULL; +} + +/* + * Make a note of the cookie style we should use. + */ +static const char *set_cookie_style(cmd_parms *cmd, void *mconfig, + const char *name) +{ + cookie_dir_rec *dcfg; + + dcfg = (cookie_dir_rec *) mconfig; + + if (strcasecmp(name, "Netscape") == 0) { + dcfg->style = CT_NETSCAPE; + } + else if ((strcasecmp(name, "Cookie") == 0) + || (strcasecmp(name, "RFC2109") == 0)) { + dcfg->style = CT_COOKIE; + } + else if ((strcasecmp(name, "Cookie2") == 0) + || (strcasecmp(name, "RFC2965") == 0)) { + dcfg->style = CT_COOKIE2; + } + else { + return apr_psprintf(cmd->pool, "Invalid %s keyword: '%s'", + cmd->cmd->name, name); + } + + return NULL; +} + +static const command_rec cookie_log_cmds[] = { + AP_INIT_TAKE1("CookieExpires", set_cookie_exp, NULL, OR_FILEINFO, + "an expiry date code"), + AP_INIT_TAKE1("CookieDomain", set_cookie_domain, NULL, OR_FILEINFO, + "domain to which this cookie applies"), + AP_INIT_TAKE1("CookieStyle", set_cookie_style, NULL, OR_FILEINFO, + "'Netscape', 'Cookie' (RFC2109), or 'Cookie2' (RFC2965)"), + AP_INIT_FLAG("CookieTracking", set_cookie_enable, NULL, OR_FILEINFO, + "whether or not to enable cookies"), + AP_INIT_TAKE1("CookieName", set_cookie_name, NULL, OR_FILEINFO, + "name of the tracking cookie"), + {NULL} +}; + +static void register_hooks(apr_pool_t *p) +{ + ap_hook_fixups(spot_cookie,NULL,NULL,APR_HOOK_MIDDLE); +} + +module AP_MODULE_DECLARE_DATA usertrack_module = { + STANDARD20_MODULE_STUFF, + make_cookie_dir, /* dir config creater */ + NULL, /* dir merger --- default is to override */ + make_cookie_log_state, /* server config */ + NULL, /* merge server configs */ + cookie_log_cmds, /* command apr_table_t */ + register_hooks /* register hooks */ +}; diff --git a/rubbos/app/httpd-2.0.64/modules/metadata/mod_usertrack.dsp b/rubbos/app/httpd-2.0.64/modules/metadata/mod_usertrack.dsp new file mode 100644 index 00000000..63497a9d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/metadata/mod_usertrack.dsp @@ -0,0 +1,128 @@ +# Microsoft Developer Studio Project File - Name="mod_usertrack" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=mod_usertrack - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "mod_usertrack.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 "mod_usertrack.mak" CFG="mod_usertrack - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "mod_usertrack - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_usertrack - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "mod_usertrack - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_usertrack_src" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /out:"Release/mod_usertrack.so" /base:@..\..\os\win32\BaseAddr.ref,mod_usertrack.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Release/mod_usertrack.so" /base:@..\..\os\win32\BaseAddr.ref,mod_usertrack.so /opt:ref + +!ELSEIF "$(CFG)" == "mod_usertrack - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_usertrack_src" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_usertrack.so" /base:@..\..\os\win32\BaseAddr.ref,mod_usertrack.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_usertrack.so" /base:@..\..\os\win32\BaseAddr.ref,mod_usertrack.so + +!ENDIF + +# Begin Target + +# Name "mod_usertrack - Win32 Release" +# Name "mod_usertrack - Win32 Debug" +# Begin Source File + +SOURCE=.\mod_usertrack.c +# End Source File +# Begin Source File + +SOURCE=.\mod_usertrack.rc +# End Source File +# Begin Source File + +SOURCE=..\..\build\win32\win32ver.awk + +!IF "$(CFG)" == "mod_usertrack - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_usertrack.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_usertrack.so "usertrack_module for Apache" ../../include/ap_release.h > .\mod_usertrack.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "mod_usertrack - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_usertrack.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_usertrack.so "usertrack_module for Apache" ../../include/ap_release.h > .\mod_usertrack.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/modules/metadata/mod_usertrack.exp b/rubbos/app/httpd-2.0.64/modules/metadata/mod_usertrack.exp new file mode 100644 index 00000000..234a5f75 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/metadata/mod_usertrack.exp @@ -0,0 +1 @@ +usertrack_module diff --git a/rubbos/app/httpd-2.0.64/modules/metadata/mod_version.c b/rubbos/app/httpd-2.0.64/modules/metadata/mod_version.c new file mode 100644 index 00000000..9104929b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/metadata/mod_version.c @@ -0,0 +1,312 @@ +/* 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. + */ + +/* + * mod_version.c + * Allow conditional configuration depending on the httpd version + * + * André Malo (nd/perlig.de), January 2004 + * + * Some stuff coded here is heavily based on the core <IfModule> + * containers. + * + * The module makes the following confgurations possible: + * + * <IfVersion op major.minor.patch> + * # conditional config here ... + *</IfVersion> + * + * where "op" is one of: + * = / == equal + * > greater than + * >= greater or equal + * < less than + * <= less or equal + * + * If minor version and patch level are omitted they are assumed to be 0. + * + * Alternatively you can match the whole version (including some vendor-added + * string of the CORE version, see ap_release.h) against a regular expression: + * + * <IfVersion op regex> + * # conditional config here ... + *</IfVersion> + * + * where "op" is one of: + * = / == match; regex must be surrounded by slashes + * ~ match; regex MAY NOT be surrounded by slashes + * + * Note that all operators may be preceeded by an exclamation mark + * (without spaces) in order to reverse their meaning. + * + */ + +#include "apr.h" +#include "apr_strings.h" +#include "apr_lib.h" + +#include "httpd.h" +#include "http_config.h" +#include "http_log.h" + + +/* module structure */ +module AP_MODULE_DECLARE_DATA version_module; + +/* queried httpd version */ +static ap_version_t httpd_version; + + +/* + * compare the supplied version with the core one + */ +static int compare_version(char *version_string, const char **error) +{ + char *p = version_string, *ep; + int version[3] = {0, 0, 0}; + int c = 0; + + *error = "Version appears to be invalid. It must have the format " + "major[.minor[.patch]] where major, minor and patch are " + "numbers."; + + if (!apr_isdigit(*p)) { + return 0; + } + + /* parse supplied version */ + ep = version_string + strlen(version_string); + while (p <= ep && c < 3) { + if (*p == '.') { + *p = '\0'; + } + + if (!*p) { + version[c++] = atoi(version_string); + version_string = ++p; + continue; + } + + if (!apr_isdigit(*p)) { + break; + } + + ++p; + } + + if (p < ep) { /* syntax error */ + return 0; + } + + *error = NULL; + + if (httpd_version.major > version[0]) { + return 1; + } + else if (httpd_version.major < version[0]) { + return -1; + } + else if (httpd_version.minor > version[1]) { + return 1; + } + else if (httpd_version.minor < version[1]) { + return -1; + } + else if (httpd_version.patch > version[2]) { + return 1; + } + else if (httpd_version.patch < version[2]) { + return -1; + } + + /* seems to be the same */ + return 0; +} + +/* + * match version against a regular expression + */ +static int match_version(apr_pool_t *pool, char *version_string, + const char **error) +{ + regex_t *compiled; + const char *to_match; + int rc; + + compiled = ap_pregcomp(pool, version_string, REG_EXTENDED); + if (!compiled) { + *error = "Unable to compile regular expression"; + return 0; + } + + *error = NULL; + + to_match = apr_psprintf(pool, "%d.%d.%d%s", + httpd_version.major, + httpd_version.minor, + httpd_version.patch, + httpd_version.add_string); + + rc = !ap_regexec(compiled, to_match, 0, NULL, 0); + + ap_pregfree(pool, compiled); + return rc; +} + +/* + * Implements the <IfVersion> container + */ +static const char *start_ifversion(cmd_parms *cmd, void *mconfig, + const char *arg1, const char *arg2, + const char *arg3) +{ + const char *endp; + int reverse = 0, done = 0, match = 0, compare; + const char *p, *error; + char c; + + /* supplying one argument is possible, we assume an equality check then */ + if (!arg2) { + arg2 = arg1; + arg1 = "="; + } + + /* surrounding quotes without operator */ + if (!arg3 && *arg2 == '>' && !arg2[1]) { + arg3 = ">"; + arg2 = arg1; + arg1 = "="; + } + + /* the third argument makes version surrounding quotes plus operator + * possible. + */ + endp = arg2 + strlen(arg2); + if ( endp == arg2 + || (!(arg3 && *arg3 == '>' && !arg3[1]) && *--endp != '>')) { + return apr_pstrcat(cmd->pool, cmd->cmd->name, + "> directive missing closing '>'", NULL); + } + + p = arg1; + if (*p == '!') { + reverse = 1; + if (p[1]) { + ++p; + } + } + + c = *p++; + if (!*p || (*p == '=' && !p[1] && c != '~')) { + if (!httpd_version.major) { + ap_get_server_revision(&httpd_version); + } + + done = 1; + switch (c) { + case '=': + /* normal comparison */ + if (*arg2 != '/') { + compare = compare_version(apr_pstrmemdup(cmd->pool, arg2, + endp-arg2), + &error); + if (error) { + return error; + } + + match = !compare; + break; + } + + /* regexp otherwise */ + if (endp == ++arg2 || *--endp != '/') { + return "Missing delimiting / of regular expression."; + } + + case '~': + /* regular expression */ + match = match_version(cmd->pool, apr_pstrmemdup(cmd->pool, arg2, + endp-arg2), + &error); + if (error) { + return error; + } + break; + + case '<': + compare = compare_version(apr_pstrmemdup(cmd->pool, arg2, + endp-arg2), + &error); + if (error) { + return error; + } + + match = ((-1 == compare) || (*p && !compare)); + break; + + case '>': + compare = compare_version(apr_pstrmemdup(cmd->pool, arg2, + endp-arg2), + &error); + if (error) { + return error; + } + + match = ((1 == compare) || (*p && !compare)); + break; + + default: + done = 0; + break; + } + } + + if (!done) { + return apr_pstrcat(cmd->pool, "unrecognized operator '", arg1, "'", + NULL); + } + + if ((!reverse && match) || (reverse && !match)) { + ap_directive_t *parent = NULL; + ap_directive_t *current = NULL; + const char *retval; + + retval = ap_build_cont_config(cmd->pool, cmd->temp_pool, cmd, + ¤t, &parent, "<IfVersion"); + *(ap_directive_t **)mconfig = current; + return retval; + } + + *(ap_directive_t **)mconfig = NULL; + return ap_soak_end_container(cmd, "<IfVersion"); +} + +static const command_rec version_cmds[] = { + AP_INIT_TAKE123("<IfVersion", start_ifversion, NULL, EXEC_ON_READ | OR_ALL, + "a comparison operator, a version (and a delimiter)"), + { NULL } +}; + +module AP_MODULE_DECLARE_DATA version_module = +{ + STANDARD20_MODULE_STUFF, + NULL, /* dir config creater */ + NULL, /* dir merger --- default is to override */ + NULL, /* server config */ + NULL, /* merge server configs */ + version_cmds, /* command apr_table_t */ + NULL, /* register hooks */ +}; diff --git a/rubbos/app/httpd-2.0.64/modules/metadata/mod_version.dsp b/rubbos/app/httpd-2.0.64/modules/metadata/mod_version.dsp new file mode 100644 index 00000000..e30ff21a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/metadata/mod_version.dsp @@ -0,0 +1,128 @@ +# Microsoft Developer Studio Project File - Name="mod_version" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=mod_version - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "mod_version.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 "mod_version.mak" CFG="mod_version - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "mod_version - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_version - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "mod_version - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_version_src" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /out:"Release/mod_version.so" /base:@..\..\os\win32\BaseAddr.ref,mod_version.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Release/mod_version.so" /base:@..\..\os\win32\BaseAddr.ref,mod_version.so /opt:ref + +!ELSEIF "$(CFG)" == "mod_version - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_version_src" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_version.so" /base:@..\..\os\win32\BaseAddr.ref,mod_version.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_version.so" /base:@..\..\os\win32\BaseAddr.ref,mod_version.so + +!ENDIF + +# Begin Target + +# Name "mod_version - Win32 Release" +# Name "mod_version - Win32 Debug" +# Begin Source File + +SOURCE=.\mod_version.c +# End Source File +# Begin Source File + +SOURCE=.\mod_version.rc +# End Source File +# Begin Source File + +SOURCE=..\..\build\win32\win32ver.awk + +!IF "$(CFG)" == "mod_version - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_version.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_version.so "version_module for Apache" ../../include/ap_release.h > .\mod_version.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "mod_version - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_version.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_version.so "version_module for Apache" ../../include/ap_release.h > .\mod_version.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/modules/metadata/mod_version.exp b/rubbos/app/httpd-2.0.64/modules/metadata/mod_version.exp new file mode 100644 index 00000000..3dce8456 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/metadata/mod_version.exp @@ -0,0 +1 @@ +version_module diff --git a/rubbos/app/httpd-2.0.64/modules/metadata/modules.mk b/rubbos/app/httpd-2.0.64/modules/metadata/modules.mk new file mode 100644 index 00000000..fb8eff50 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/metadata/modules.mk @@ -0,0 +1,7 @@ +mod_env.la: mod_env.lo + $(MOD_LINK) mod_env.lo $(MOD_ENV_LDADD) +mod_setenvif.la: mod_setenvif.lo + $(MOD_LINK) mod_setenvif.lo $(MOD_SETENVIF_LDADD) +DISTCLEAN_TARGETS = modules.mk +static = mod_env.la mod_setenvif.la +shared = diff --git a/rubbos/app/httpd-2.0.64/modules/proxy/.deps b/rubbos/app/httpd-2.0.64/modules/proxy/.deps new file mode 100644 index 00000000..e69de29b diff --git a/rubbos/app/httpd-2.0.64/modules/proxy/.indent.pro b/rubbos/app/httpd-2.0.64/modules/proxy/.indent.pro new file mode 100644 index 00000000..e2cd357a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/proxy/.indent.pro @@ -0,0 +1,58 @@ +-i4 -npsl -di0 -br -nce -d0 -cli0 -npcs -nfc1 +-TBUFF +-TFILE +-TTRANS +-TUINT4 +-T_trans +-Tallow_options_t +-Tapache_sfio +-Tarray_header +-Tbool_int +-Tapr_bucket_brigade +-Tapr_pool_t +-Tap_filter_t +-Tbuf_area +-Tbuff_struct +-Tbuffy +-Tcmd_how +-Tcmd_parms +-Tcommand_rec +-Tcommand_struct +-Tconn_rec +-Tcore_dir_config +-Tcore_server_config +-Tdir_maker_func +-Tevent +-Tglobals_s +-Thandler_func +-Thandler_rec +-Tjoblist_s +-Tlisten_rec +-Tmerger_func +-Tmode_t +-Tmodule +-Tmodule_struct +-Tmutex +-Tn_long +-Tother_child_rec +-Toverrides_t +-Tparent_score +-Tpid_t +-Tpiped_log +-Tpool +-Trequest_rec +-Trequire_line +-Trlim_t +-Tscoreboard +-Tsemaphore +-Tserver_addr_rec +-Tserver_rec +-Tserver_rec_chain +-Tshort_score +-Ttable +-Ttable_entry +-Tthread +-Tu_wide_int +-Tvtime_t +-Twide_int +-Tproxy_server_conf diff --git a/rubbos/app/httpd-2.0.64/modules/proxy/CHANGES b/rubbos/app/httpd-2.0.64/modules/proxy/CHANGES new file mode 100644 index 00000000..73a9228d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/proxy/CHANGES @@ -0,0 +1,223 @@ +****************************************** +* PLEASE NOTE: Now that development for * +* mod_proxy has been folded back into * +* the httpd-2.0 tree, this file has * +* been depreciated. Proxy changes should * +* be noted in httpd-2.0's CHANGES file. * +* This file exists for historical * +* purposes. * +****************************************** + +mod_proxy changes for httpd 2.0.29-dev + *) don't do keepalives for sub-requests. [Ian Holsman] + + *) fix up proxypass handling [Ian Holsman] + + *) don't send If-Modified-Since, Cache-Control, or If-None-Match on + a subrequest [Ian Holsman] + +mod_proxy changes for httpd 2.0.26-dev + *) Add New option 'HTTPProxyOverrideReturnedErrors'. By Turning the + Flag on, you will mask the error pages returned by the proxied + server, and will it will be handled as if your server generated + the error. This change was put in so that a 404 on a included + r-proxied component will act in the same manner as a 404 on a + included file. [Ian Holsman <ianh@cnet.com>] + +mod_proxy changes for httpd 2.0.25-dev + + *) Split proxy: space using <Proxy[Match] > directive blocks from + the <Directory[Match] > and <Files[Match] > blocks. Mod_proxy + now bypasses the directory and files testing phase (and skips + the http TRACE default handler on it's own, as well). Note that + <Location > blocks continue to be processed for proxy: requests. + [William Rowe <wrowe@covalent.net>] + + *) apr_uri type/function namespace changes in apr_uri functions + [Doug MacEachern <dougm@covalent.net>] + +mod_proxy changes for httpd 2.0.23-dev + + *) break the proxy_http_handler into multiple smaller functions. + [John Barbee <barbee@veribox.net>] + + *) Fix the proxy when the origin server sends back a 100 + Continue response. [John Barbee <barbee@veribox.net>] + + *) Change 'readbytes' from apr_size_t to apr_off_t due to change + in ap_get_brigade's parameters [John Barbee <barbee@veribox.net>] + +mod_proxy changes for httpd 2.0.20-dev + *) Timeout added for backend connections. + [Victor Orlikowski <v.j.orlikowski@gte.net>] + + *) Fix abort code path in proxy_http.c, similar to FTP fix. + [Chuck Murcko <chuck@topsail.org>] + + *) Fix FTP ABOR command execution path. + [Victor Orlikowski <v.j.orlikowski@gte.net>] + + *) FTP return code variable cleanup; fixed problem in login + [Chuck Murcko <chuck@topsail.org>] + + *) Get PORT working again in the ftp proxy. + [Victor Orlikowski <v.j.orlikowski@gte.net>] + + *) Return result code check for FTP QUIT, after fixing + problems with passive connection handling. + [Victor Orlikowski <v.j.orlikowski@gte.net>] + + *) Reorganize ap_proxy_string_read() internally to not process eos + buckets. + [Chuck Murcko <chuck@topsail.org>] + [Victor Orlikowski <v.j.orlikowski@gte.net>] + + *) Remove result code check for FTP QUIT command. Some servers send + nothing at all back in response to QUIT. + [Chuck Murcko <chuck@topsail.org>] + [Victor Orlikowski <v.j.orlikowski@gte.net>] + +mod_proxy changes for httpd 2.0.19 + + *) Reverse previous patch since the core reverted. + [Chuck Murcko <chuck@topsail.org>] + + *) Remove indirection on number of bytes to read for input filters. + [Chuck Murcko <chuck@topsail.org>] + + *) Fixed a problem with directory listing corruption in the + PROXY_DIR filter. + [Graham Leggett <minfrin@sharp.fm>] + + *) mod_proxy and the proxy submodules now build properly as DSOs. + [Graham Leggett <minfrin@sharp.fm>] + + *) Stopped the HTTP proxy from trying to read entity bodies when there + wasn't one (response was 1xx, 204, 205 or 304). + [Graham Leggett <minfrin@sharp.fm>] + + *) Made sure dates were canonicalised correctly when passed to the client + browser through the HTTP proxy. + [Graham Leggett <minfrin@sharp.fm>] + + *) Split each individual proxy protocol into separate modules. + [Graham Leggett <minfrin@sharp.fm>] + + *) Added Max-Forwards support for all request types so as to prevent + loops. + [Graham Leggett <minfrin@sharp.fm>] + + *) Fix warnings about byte count type on Darwin (connect handler). + [Chuck Murcko <chuck@topsail.org>] + +mod_proxy changes for httpd 2.0.18 + + *) IPV6 EPSV support for IPV6 in FTP proxy. + [Graham Leggett <minfrin@sharp.fm>] + + *) FTP directory filter works now. + [Graham Leggett <minfrin@sharp.fm>] + + *) Fixed some thread-safety issues with the HTTP proxy in mod_proxy. + [Graham Leggett <minfrin@sharp.fm>] + + *) PASV FTP works now. + [Graham Leggett <minfrin@sharp.fm>] + + *) Reworked the line-at-a-time read from the control connection to + workaround a stray empty bucket returned by the HTTP_IN filter. + [Graham Leggett <minfrin@sharp.fm>] + + *) Stopped the CORE filter from sending off an HTTP response when a + CONNECT tunnel was closed. + [Graham Leggett <minfrin@sharp.fm>] + + *) Fixed the poll() loop in proxy_connect.c -> it works now!!! + [Graham Leggett <minfrin@sharp.fm>] + + *) Converted send_dir() to ap_proxy_send_dir_filter() in proxy_ftp.c. + [Graham Leggett <minfrin@sharp.fm>] + +mod_proxy changes for httpd 2.0.17 + + *) Major rework of ap_proxy_ftp_handler() to use filters (begone foul + BUFF!!!). It compiles, but is untested, and the build environment needs + to be fixed to include proxy_ftp.c. + [Graham Leggett <minfrin@sharp.fm>] + + *) Cleanup of dead functions within proxy_util.c. + [Graham Leggett <minfrin@sharp.fm>] + + *) Reworked the storage of the client socket between keepalive connections + to fix some nasty problems with the socket lasting longer than the + memory pool it was allocated from. + [Graham Leggett <minfrin@sharp.fm>] + + *) Fixed bug where a hostname without a "." in it (such as "localhost") + would not trigger an IP address check with ProxyBlock. + [Graham Leggett <minfrin@sharp.fm>] + +mod_proxy changes for httpd 2.0.16 + + *) Fixed ProxyBlock bugs with ap_proxy_http_handler() and + ap_proxy_connect_handler(). + [Graham Leggett <minfrin@sharp.fm>] + + *) Updated ap_proxy_connect_handler() to support APR, while + moving some common code between http_handler and connect_handler + to proxy_util.c. + [Graham Leggett <minfrin@sharp.fm>] + + *) Updated mod_proxy.html docs to include v2.0 configuration. + [Graham Leggett <minfrin@sharp.fm>] + + *) Fixed problem where responses without entity bodies would cause + the directly following proxy keepalive request to fail. + [Graham Leggett <minfrin@sharp.fm>] + +mod_proxy changes for httpd 2.0.15 + + *) Added support for downstream keepalives in mod_proxy. + [Graham Leggett <minfrin@sharp.fm>] + + *) Changed mod_proxy ap_proxy_http_handler() to support APR properly. + [Graham Leggett <minfrin@sharp.fm>] + + *) Fix problem where incoming response headers were not being returned + to the client in mod_proxy. + [Graham Leggett <minfrin@sharp.fm>] + + *) Added X-Forwarded-For, X-Forwarded-Host and X-Forwarded-Server to + reverse proxied request headers in mod_proxy. + [Graham Leggett <minfrin@sharp.fm>] + + *) replace INADDR_NONE with APR_INADDR_NONE [Ian Holsman <IanH@cnet.com>] + + *) Fix problem with proxy configuration where globally set + configuration options were overridden inside virtual hosts. + [Graham Leggett <minfrin@sharp.fm>] + + *) Fix ProxyReceiveBufferSize where default value was left + uninitialised. + [Graham Leggett <minfrin@sharp.fm>] + + *) Some small changes: + - Ensured hop-by-hop headers were stripped as per + RFC2616 13.5.1. + - Upgraded version code to HTTP/1.1. + - Added Connection: close until Keepalives come. + - Some cosmetic fixes and commenting. + [Graham Leggett <minfrin@sharp.fm>] + +mod_proxy changes for httpd 2.0.14 + + *) removed ProxyNoCache and ProxyCacheForceCompletion config directives, + since we no longer directly cache from this module + [Chuck Murcko <chuck@topsail.org>] + + *) removed cache + [Chuck Murcko <chuck@topsail.org>] + + *) initial rerebuild for 2.0 + [Chuck Murcko <chuck@topsail.org>] + diff --git a/rubbos/app/httpd-2.0.64/modules/proxy/Makefile b/rubbos/app/httpd-2.0.64/modules/proxy/Makefile new file mode 100644 index 00000000..d1597bdf --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/proxy/Makefile @@ -0,0 +1,8 @@ +top_srcdir = /bottlenecks/rubbos/app/httpd-2.0.64 +top_builddir = /bottlenecks/rubbos/app/httpd-2.0.64 +srcdir = /bottlenecks/rubbos/app/httpd-2.0.64/modules/proxy +builddir = /bottlenecks/rubbos/app/httpd-2.0.64/modules/proxy +VPATH = /bottlenecks/rubbos/app/httpd-2.0.64/modules/proxy +# a modules Makefile has no explicit targets -- they will be defined by +# whatever modules are enabled. just grab special.mk to deal with this. +include $(top_srcdir)/build/special.mk diff --git a/rubbos/app/httpd-2.0.64/modules/proxy/Makefile.in b/rubbos/app/httpd-2.0.64/modules/proxy/Makefile.in new file mode 100644 index 00000000..7c5c149d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/proxy/Makefile.in @@ -0,0 +1,3 @@ +# a modules Makefile has no explicit targets -- they will be defined by +# whatever modules are enabled. just grab special.mk to deal with this. +include $(top_srcdir)/build/special.mk diff --git a/rubbos/app/httpd-2.0.64/modules/proxy/NWGNUmakefile b/rubbos/app/httpd-2.0.64/modules/proxy/NWGNUmakefile new file mode 100644 index 00000000..61842f0a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/proxy/NWGNUmakefile @@ -0,0 +1,247 @@ +# +# Declare the sub-directories to be built here +# + +SUBDIRS = \ + $(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 += \ + $(EOLIST) + +# +# These flags will come after CFLAGS +# +XCFLAGS += \ + $(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 = + +# +# This is used by the link '-desc ' directive. +# If left blank, NLM_NAME will be used. +# +NLM_DESCRIPTION = + +# +# This is used by the '-threadname' directive. If left blank, +# NLM_NAME Thread will be used. +# +NLM_THREAD_NAME = + +# +# 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 = + + +# +# 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 = + +# +# If these are specified it will be used by the link '-flags' directive +# +NLM_FLAGS = + +# +# 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)/proxy.nlm \ + $(OBJDIR)/proxycon.nlm \ + $(OBJDIR)/proxyftp.nlm \ + $(OBJDIR)/proxyhtp.nlm \ + $(EOLIST) + +# +# If there is an LIB target, put it here +# +TARGET_lib = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the NLM target above. +# Paths must all use the '/' character +# +FILES_nlm_objs = \ + $(EOLIST) + +# +# 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 = \ + $(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 = \ + $(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 = \ + $(EOLIST) + +# +# Any symbols exported to here +# +FILES_nlm_exports = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the LIB target above. +# Paths must all use the '/' character +# +FILES_lib_objs = \ + $(EOLIST) + +# +# 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) +# +install :: nlms FORCE + copy $(OBJDIR)\*.nlm $(INSTALL)\Apache2\modules\*.* + +# +# Any specialized rules here +# + +# +# Include the 'tail' makefile that has targets that depend on variables defined +# in this makefile +# + +include $(AP_WORK)\build\NWGNUtail.inc + diff --git a/rubbos/app/httpd-2.0.64/modules/proxy/NWGNUproxy b/rubbos/app/httpd-2.0.64/modules/proxy/NWGNUproxy new file mode 100644 index 00000000..d6abf6b3 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/proxy/NWGNUproxy @@ -0,0 +1,261 @@ +# +# Make sure all needed macro's are defined +# + +# +# Get the 'head' of the build environment if necessary. This includes default +# targets and paths to tools +# + +ifndef EnvironmentDefined +include $(AP_WORK)\build\NWGNUhead.inc +endif + +# +# These directories will be at the beginning of the include list, followed by +# INCDIRS +# +XINCDIRS += \ + $(APR)/include \ + $(APRUTIL)/include \ + $(AP_WORK)/include \ + $(AP_WORK)/modules/http \ + $(NWOS) \ + $(EOLIST) + +# +# These flags will come after CFLAGS +# +XCFLAGS += \ + $(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 = proxy + +# +# This is used by the link '-desc ' directive. +# If left blank, NLM_NAME will be used. +# +NLM_DESCRIPTION = Apache $(VERSION_STR) Proxy Module + +# +# This is used by the '-threadname' directive. If left blank, +# NLM_NAME Thread will be used. +# +NLM_THREAD_NAME = Proxy Module + +# +# 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 = 8192 + + +# +# If this is specified it will be used by the link '-entry' directive +# +NLM_ENTRY_SYM = _LibCPrelude + +# +# If this is specified it will be used by the link '-exit' directive +# +NLM_EXIT_SYM = _LibCPostlude + +# +# If this is specified it will be used by the link '-check' directive +# +NLM_CHECK_SYM = + +# +# If these are specified it will be used by the link '-flags' directive +# +NLM_FLAGS = AUTOUNLOAD, 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)/proxy.nlm \ + $(EOLIST) + +# +# If there is an LIB target, put it here +# +TARGET_lib = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the NLM target above. +# Paths must all use the '/' character +# +FILES_nlm_objs = \ + $(OBJDIR)/mod_proxy.o \ + $(OBJDIR)/proxy_util.o \ + $(OBJDIR)/libprews.o \ + $(EOLIST) + +# +# 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 = \ + libcpre.o \ + $(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 = \ + @$(APR)/aprlib.imp \ + @$(NWOS)/httpd.imp \ + @libc.imp \ + @ws2nlm.imp \ + $(EOLIST) + +# +# Any symbols exported to here +# +FILES_nlm_exports = \ + proxy_module \ + proxy_hook_scheme_handler \ + proxy_hook_canon_handler \ + ap_proxy_ssl_enable \ + ap_proxy_ssl_disable \ + proxy_run_fixups \ + $(EOLIST) + +# +# These are the OBJ files needed to create the LIB target above. +# Paths must all use the '/' character +# +FILES_lib_objs = \ + $(EOLIST) + +# +# 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) +# +install :: nlms FORCE + +# +# Any specialized rules here +# + +$(OBJDIR)/%.o: ../arch/netware/%.c $(OBJDIR)\$(NLM_NAME)_cc.opt + @echo compiling $< + $(CC) $< -o=$(OBJDIR)\$(@F) @$(OBJDIR)\$(NLM_NAME)_cc.opt + +# +# Include the 'tail' makefile that has targets that depend on variables defined +# in this makefile +# + +include $(AP_WORK)\build\NWGNUtail.inc + + diff --git a/rubbos/app/httpd-2.0.64/modules/proxy/NWGNUproxycon b/rubbos/app/httpd-2.0.64/modules/proxy/NWGNUproxycon new file mode 100644 index 00000000..07c91f70 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/proxy/NWGNUproxycon @@ -0,0 +1,254 @@ +# +# Make sure all needed macro's are defined +# + +# +# Get the 'head' of the build environment if necessary. This includes default +# targets and paths to tools +# + +ifndef EnvironmentDefined +include $(AP_WORK)\build\NWGNUhead.inc +endif + +# +# These directories will be at the beginning of the include list, followed by +# INCDIRS +# +XINCDIRS += \ + $(APR)/include \ + $(APRUTIL)/include \ + $(AP_WORK)/include \ + $(AP_WORK)/modules/http \ + $(NWOS) \ + $(EOLIST) + +# +# These flags will come after CFLAGS +# +XCFLAGS += \ + $(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 = proxycon + +# +# This is used by the link '-desc ' directive. +# If left blank, NLM_NAME will be used. +# +NLM_DESCRIPTION = Apache $(VERSION_STR) Proxy Connection Sub-Module + +# +# This is used by the '-threadname' directive. If left blank, +# NLM_NAME Thread will be used. +# +NLM_THREAD_NAME = Proxy Conn Module + +# +# 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 = 8192 + + +# +# If this is specified it will be used by the link '-entry' directive +# +NLM_ENTRY_SYM = _LibCPrelude + +# +# If this is specified it will be used by the link '-exit' directive +# +NLM_EXIT_SYM = _LibCPostlude + +# +# If this is specified it will be used by the link '-check' directive +# +NLM_CHECK_SYM = + +# +# If these are specified it will be used by the link '-flags' directive +# +NLM_FLAGS = AUTOUNLOAD, 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)/proxycon.nlm \ + $(EOLIST) + +# +# If there is an LIB target, put it here +# +TARGET_lib = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the NLM target above. +# Paths must all use the '/' character +# +FILES_nlm_objs = \ + $(OBJDIR)/proxy_connect.o \ + $(OBJDIR)/proxy_util.o \ + $(EOLIST) + +# +# 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 = \ + libcpre.o \ + $(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 \ + proxy \ + $(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 = \ + @$(APR)/aprlib.imp \ + @$(NWOS)/httpd.imp \ + @libc.imp \ + proxy_module \ + proxy_hook_scheme_handler \ + proxy_hook_canon_handler \ + $(EOLIST) + +# +# Any symbols exported to here +# +FILES_nlm_exports = \ + proxy_connect_module \ + $(EOLIST) + +# +# These are the OBJ files needed to create the LIB target above. +# Paths must all use the '/' character +# +FILES_lib_objs = \ + $(EOLIST) + +# +# 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) +# +install :: nlms FORCE + +# +# Any specialized rules here +# + +# +# Include the 'tail' makefile that has targets that depend on variables defined +# in this makefile +# + +include $(AP_WORK)\build\NWGNUtail.inc + + diff --git a/rubbos/app/httpd-2.0.64/modules/proxy/NWGNUproxyftp b/rubbos/app/httpd-2.0.64/modules/proxy/NWGNUproxyftp new file mode 100644 index 00000000..bd5d527c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/proxy/NWGNUproxyftp @@ -0,0 +1,260 @@ +# +# Make sure all needed macro's are defined +# + +# +# Get the 'head' of the build environment if necessary. This includes default +# targets and paths to tools +# + +ifndef EnvironmentDefined +include $(AP_WORK)\build\NWGNUhead.inc +endif + +# +# These directories will be at the beginning of the include list, followed by +# INCDIRS +# +XINCDIRS += \ + $(APR)/include \ + $(APRUTIL)/include \ + $(AP_WORK)/include \ + $(AP_WORK)/modules/http \ + $(NWOS) \ + $(EOLIST) + +# +# These flags will come after CFLAGS +# +XCFLAGS += \ + $(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 = proxyftp + +# +# This is used by the link '-desc ' directive. +# If left blank, NLM_NAME will be used. +# +NLM_DESCRIPTION = Apache $(VERSION_STR) Proxy FTP Sub-Module + +# +# This is used by the '-threadname' directive. If left blank, +# NLM_NAME Thread will be used. +# +NLM_THREAD_NAME = Proxy FTP Module + +# +# 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 = 8192 + + +# +# If this is specified it will be used by the link '-entry' directive +# +NLM_ENTRY_SYM = _LibCPrelude + +# +# If this is specified it will be used by the link '-exit' directive +# +NLM_EXIT_SYM = _LibCPostlude + +# +# If this is specified it will be used by the link '-check' directive +# +NLM_CHECK_SYM = + +# +# If these are specified it will be used by the link '-flags' directive +# +NLM_FLAGS = AUTOUNLOAD, 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)/proxyftp.nlm \ + $(EOLIST) + +# +# If there is an LIB target, put it here +# +TARGET_lib = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the NLM target above. +# Paths must all use the '/' character +# +FILES_nlm_objs = \ + $(OBJDIR)/proxy_ftp.o \ + $(OBJDIR)/proxy_util.o \ + $(OBJDIR)/libprews.o \ + $(EOLIST) + +# +# 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 = \ + libcpre.o \ + $(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 \ + proxy \ + $(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 = \ + @$(APR)/aprlib.imp \ + @$(NWOS)/httpd.imp \ + @libc.imp \ + @ws2nlm.imp \ + proxy_module \ + proxy_hook_scheme_handler \ + proxy_hook_canon_handler \ + $(EOLIST) + +# +# Any symbols exported to here +# +FILES_nlm_exports = \ + proxy_ftp_module \ + $(EOLIST) + +# +# These are the OBJ files needed to create the LIB target above. +# Paths must all use the '/' character +# +FILES_lib_objs = \ + $(EOLIST) + +# +# 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) +# +install :: nlms FORCE + +# +# Any specialized rules here +# + +$(OBJDIR)/%.o: ../arch/netware/%.c $(OBJDIR)\$(NLM_NAME)_cc.opt + @echo compiling $< + $(CC) $< -o=$(OBJDIR)\$(@F) @$(OBJDIR)\$(NLM_NAME)_cc.opt + +# +# Include the 'tail' makefile that has targets that depend on variables defined +# in this makefile +# + +include $(AP_WORK)\build\NWGNUtail.inc + + diff --git a/rubbos/app/httpd-2.0.64/modules/proxy/NWGNUproxyhtp b/rubbos/app/httpd-2.0.64/modules/proxy/NWGNUproxyhtp new file mode 100644 index 00000000..5fda2693 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/proxy/NWGNUproxyhtp @@ -0,0 +1,263 @@ +# +# Make sure all needed macro's are defined +# + +# +# Get the 'head' of the build environment if necessary. This includes default +# targets and paths to tools +# + +ifndef EnvironmentDefined +include $(AP_WORK)\build\NWGNUhead.inc +endif + +# +# These directories will be at the beginning of the include list, followed by +# INCDIRS +# +XINCDIRS += \ + $(APR)/include \ + $(APRUTIL)/include \ + $(AP_WORK)/include \ + $(AP_WORK)/modules/http \ + $(NWOS) \ + $(EOLIST) + +# +# These flags will come after CFLAGS +# +XCFLAGS += \ + $(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 = proxyhtp + +# +# This is used by the link '-desc ' directive. +# If left blank, NLM_NAME will be used. +# +NLM_DESCRIPTION = Apache $(VERSION_STR) Proxy HTTP Sub-Module + +# +# This is used by the '-threadname' directive. If left blank, +# NLM_NAME Thread will be used. +# +NLM_THREAD_NAME = Proxy HTTP Module + +# +# 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 = 8192 + + +# +# If this is specified it will be used by the link '-entry' directive +# +NLM_ENTRY_SYM = _LibCPrelude + +# +# If this is specified it will be used by the link '-exit' directive +# +NLM_EXIT_SYM = _LibCPostlude + +# +# If this is specified it will be used by the link '-check' directive +# +NLM_CHECK_SYM = + +# +# If these are specified it will be used by the link '-flags' directive +# +NLM_FLAGS = AUTOUNLOAD, 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)/proxyhtp.nlm \ + $(EOLIST) + +# +# If there is an LIB target, put it here +# +TARGET_lib = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the NLM target above. +# Paths must all use the '/' character +# +FILES_nlm_objs = \ + $(OBJDIR)/proxy_http.o \ + $(OBJDIR)/proxy_util.o \ + $(OBJDIR)/libprews.o \ + $(EOLIST) + +# +# 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 = \ + libcpre.o \ + $(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 \ + proxy \ + $(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 = \ + @$(APR)/aprlib.imp \ + @$(NWOS)/httpd.imp \ + @libc.imp \ + @ws2nlm.imp \ + proxy_module \ + proxy_hook_scheme_handler \ + proxy_hook_canon_handler \ + proxy_run_fixups \ + ap_proxy_ssl_enable \ + ap_proxy_ssl_disable \ + $(EOLIST) + +# +# Any symbols exported to here +# +FILES_nlm_exports = \ + proxy_http_module \ + $(EOLIST) + +# +# These are the OBJ files needed to create the LIB target above. +# Paths must all use the '/' character +# +FILES_lib_objs = \ + $(EOLIST) + +# +# 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) +# +install :: nlms FORCE + +# +# Any specialized rules here +# + +$(OBJDIR)/%.o: ../arch/netware/%.c $(OBJDIR)\$(NLM_NAME)_cc.opt + @echo compiling $< + $(CC) $< -o=$(OBJDIR)\$(@F) @$(OBJDIR)\$(NLM_NAME)_cc.opt + +# +# Include the 'tail' makefile that has targets that depend on variables defined +# in this makefile +# + +include $(AP_WORK)\build\NWGNUtail.inc + + diff --git a/rubbos/app/httpd-2.0.64/modules/proxy/config.m4 b/rubbos/app/httpd-2.0.64/modules/proxy/config.m4 new file mode 100644 index 00000000..d33683e9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/proxy/config.m4 @@ -0,0 +1,34 @@ +dnl modules enabled in this directory by default + +APACHE_MODPATH_INIT(proxy) + +if test "$enable_proxy" = "shared"; then + proxy_mods_enable=shared +elif test "$enable_proxy" = "yes"; then + proxy_mods_enable=yes +else + proxy_mods_enable=no +fi + +proxy_objs="mod_proxy.lo proxy_util.lo" +APACHE_MODULE(proxy, Apache proxy module, $proxy_objs, , $proxy_mods_enable) + +proxy_connect_objs="proxy_connect.lo" +proxy_ftp_objs="proxy_ftp.lo" +proxy_http_objs="proxy_http.lo" + +case "$host" in + *os2*) + # OS/2 DLLs must resolve all symbols at build time and + # these sub-modules need some from the main proxy module + proxy_connect_objs="$proxy_connect_objs mod_proxy.la" + proxy_ftp_objs="$proxy_ftp_objs mod_proxy.la" + proxy_http_objs="$proxy_http_objs mod_proxy.la" + ;; +esac + +APACHE_MODULE(proxy_connect, Apache proxy CONNECT module, $proxy_connect_objs, , $proxy_mods_enable) +APACHE_MODULE(proxy_ftp, Apache proxy FTP module, $proxy_ftp_objs, , $proxy_mods_enable) +APACHE_MODULE(proxy_http, Apache proxy HTTP module, $proxy_http_objs, , $proxy_mods_enable) + +APACHE_MODPATH_FINISH diff --git a/rubbos/app/httpd-2.0.64/modules/proxy/libproxy.exp b/rubbos/app/httpd-2.0.64/modules/proxy/libproxy.exp new file mode 100644 index 00000000..a20f2378 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/proxy/libproxy.exp @@ -0,0 +1 @@ +proxy_module diff --git a/rubbos/app/httpd-2.0.64/modules/proxy/mod_proxy.c b/rubbos/app/httpd-2.0.64/modules/proxy/mod_proxy.c new file mode 100644 index 00000000..84d5fb10 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/proxy/mod_proxy.c @@ -0,0 +1,1181 @@ +/* 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. + */ + +#define CORE_PRIVATE + +#include "mod_proxy.h" +#include "mod_core.h" + +#include "apr_optional.h" + +#ifndef MAX +#define MAX(x,y) ((x) >= (y) ? (x) : (y)) +#endif + +/* + * A Web proxy module. Stages: + * + * translate_name: set filename to proxy:<URL> + * map_to_storage: run proxy_walk (rather than directory_walk/file_walk) + * can't trust directory_walk/file_walk since these are + * not in our filesystem. Prevents mod_http from serving + * the TRACE request we will set aside to handle later. + * type_checker: set type to PROXY_MAGIC_TYPE if filename begins proxy: + * fix_ups: convert the URL stored in the filename to the + * canonical form. + * handler: handle proxy requests + */ + +/* -------------------------------------------------------------- */ +/* Translate the URL into a 'filename' */ + +static int alias_match(const char *uri, const char *alias_fakename) +{ + const char *end_fakename = alias_fakename + strlen(alias_fakename); + const char *aliasp = alias_fakename, *urip = uri; + + while (aliasp < end_fakename) { + if (*aliasp == '/') { + /* any number of '/' in the alias matches any number in + * the supplied URI, but there must be at least one... + */ + if (*urip != '/') + return 0; + + while (*aliasp == '/') + ++aliasp; + while (*urip == '/') + ++urip; + } + else { + /* Other characters are compared literally */ + if (*urip++ != *aliasp++) + return 0; + } + } + + /* Check last alias path component matched all the way */ + + if (aliasp[-1] != '/' && *urip != '\0' && *urip != '/') + return 0; + + /* Return number of characters from URI which matched (may be + * greater than length of alias, since we may have matched + * doubled slashes) + */ + + return urip - uri; +} + +/* Detect if an absoluteURI should be proxied or not. Note that we + * have to do this during this phase because later phases are + * "short-circuiting"... i.e. translate_names will end when the first + * module returns OK. So for example, if the request is something like: + * + * GET http://othervhost/cgi-bin/printenv HTTP/1.0 + * + * mod_alias will notice the /cgi-bin part and ScriptAlias it and + * short-circuit the proxy... just because of the ordering in the + * configuration file. + */ +static int proxy_detect(request_rec *r) +{ + void *sconf = r->server->module_config; + proxy_server_conf *conf; + + conf = (proxy_server_conf *) ap_get_module_config(sconf, &proxy_module); + + /* Ick... msvc (perhaps others) promotes ternary short results to int */ + + if (conf->req && r->parsed_uri.scheme) { + /* but it might be something vhosted */ + if (!(r->parsed_uri.hostname + && !strcasecmp(r->parsed_uri.scheme, ap_http_method(r)) + && ap_matches_request_vhost(r, r->parsed_uri.hostname, + (apr_port_t)(r->parsed_uri.port_str ? r->parsed_uri.port + : ap_default_port(r))))) { + r->proxyreq = PROXYREQ_PROXY; + r->uri = r->unparsed_uri; + r->filename = apr_pstrcat(r->pool, "proxy:", r->uri, NULL); + r->handler = "proxy-server"; + } + } + /* We need special treatment for CONNECT proxying: it has no scheme part */ + else if (conf->req && r->method_number == M_CONNECT + && r->parsed_uri.hostname + && r->parsed_uri.port_str) { + r->proxyreq = PROXYREQ_PROXY; + r->uri = r->unparsed_uri; + r->filename = apr_pstrcat(r->pool, "proxy:", r->uri, NULL); + r->handler = "proxy-server"; + } + return DECLINED; +} + +static int proxy_trans(request_rec *r) +{ + void *sconf = r->server->module_config; + proxy_server_conf *conf = + (proxy_server_conf *) ap_get_module_config(sconf, &proxy_module); + int i, len; + struct proxy_alias *ent = (struct proxy_alias *) conf->aliases->elts; + + if (r->proxyreq) { + /* someone has already set up the proxy, it was possibly ourselves + * in proxy_detect + */ + return OK; + } + + /* XXX: since r->uri has been manipulated already we're not really + * compliant with RFC1945 at this point. But this probably isn't + * an issue because this is a hybrid proxy/origin server. + */ + + for (i = 0; i < conf->aliases->nelts; i++) { + len = alias_match(r->uri, ent[i].fake); + + if (len > 0) { + if ((ent[i].real[0] == '!' ) && ( ent[i].real[1] == 0 )) { + return DECLINED; + } + + r->filename = apr_pstrcat(r->pool, "proxy:", ent[i].real, + (r->uri + len ), NULL); + r->handler = "proxy-server"; + r->proxyreq = PROXYREQ_REVERSE; + return OK; + } + } + return DECLINED; +} + +static int proxy_walk(request_rec *r) +{ + proxy_server_conf *sconf = ap_get_module_config(r->server->module_config, + &proxy_module); + ap_conf_vector_t *per_dir_defaults = r->server->lookup_defaults; + ap_conf_vector_t **sec_proxy = (ap_conf_vector_t **) sconf->sec_proxy->elts; + ap_conf_vector_t *entry_config; + proxy_dir_conf *entry_proxy; + int num_sec = sconf->sec_proxy->nelts; + /* XXX: shouldn't we use URI here? Canonicalize it first? + * Pass over "proxy:" prefix + */ + const char *proxyname = r->filename + 6; + int j; + + for (j = 0; j < num_sec; ++j) + { + entry_config = sec_proxy[j]; + entry_proxy = ap_get_module_config(entry_config, &proxy_module); + + /* XXX: What about case insensitive matching ??? + * Compare regex, fnmatch or string as appropriate + * If the entry doesn't relate, then continue + */ + if (entry_proxy->r + ? ap_regexec(entry_proxy->r, proxyname, 0, NULL, 0) + : (entry_proxy->p_is_fnmatch + ? apr_fnmatch(entry_proxy->p, proxyname, 0) + : strncmp(proxyname, entry_proxy->p, + strlen(entry_proxy->p)))) { + continue; + } + per_dir_defaults = ap_merge_per_dir_configs(r->pool, per_dir_defaults, + entry_config); + } + + r->per_dir_config = per_dir_defaults; + + return OK; +} + +static int proxy_map_location(request_rec *r) +{ + int access_status; + + if (!r->proxyreq || !r->filename || strncmp(r->filename, "proxy:", 6) != 0) + return DECLINED; + + /* Don't let the core or mod_http map_to_storage hooks handle this, + * We don't need directory/file_walk, and we want to TRACE on our own. + */ + if ((access_status = proxy_walk(r))) { + ap_die(access_status, r); + return access_status; + } + + return OK; +} + +/* -------------------------------------------------------------- */ +/* Fixup the filename */ + +/* + * Canonicalise the URL + */ +static int proxy_fixup(request_rec *r) +{ + char *url, *p; + int access_status; + + if (!r->proxyreq || !r->filename || strncmp(r->filename, "proxy:", 6) != 0) + return DECLINED; + + /* XXX: Shouldn't we try this before we run the proxy_walk? */ + url = &r->filename[6]; + + /* canonicalise each specific scheme */ + if ((access_status = proxy_run_canon_handler(r, url))) { + return access_status; + } + + p = strchr(url, ':'); + if (p == NULL || p == url) + return HTTP_BAD_REQUEST; + + return OK; /* otherwise; we've done the best we can */ +} + +/* Send a redirection if the request contains a hostname which is not */ +/* fully qualified, i.e. doesn't have a domain name appended. Some proxy */ +/* servers like Netscape's allow this and access hosts from the local */ +/* domain in this case. I think it is better to redirect to a FQDN, since */ +/* these will later be found in the bookmarks files. */ +/* The "ProxyDomain" directive determines what domain will be appended */ +static int proxy_needsdomain(request_rec *r, const char *url, const char *domain) +{ + char *nuri; + const char *ref; + + /* We only want to worry about GETs */ + if (!r->proxyreq || r->method_number != M_GET || !r->parsed_uri.hostname) + return DECLINED; + + /* If host does contain a dot already, or it is "localhost", decline */ + if (strchr(r->parsed_uri.hostname, '.') != NULL + || strcasecmp(r->parsed_uri.hostname, "localhost") == 0) + return DECLINED; /* host name has a dot already */ + + ref = apr_table_get(r->headers_in, "Referer"); + + /* Reassemble the request, but insert the domain after the host name */ + /* Note that the domain name always starts with a dot */ + r->parsed_uri.hostname = apr_pstrcat(r->pool, r->parsed_uri.hostname, + domain, NULL); + nuri = apr_uri_unparse(r->pool, + &r->parsed_uri, + APR_URI_UNP_REVEALPASSWORD); + + apr_table_set(r->headers_out, "Location", nuri); + ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r, + "Domain missing: %s sent to %s%s%s", r->uri, + apr_uri_unparse(r->pool, &r->parsed_uri, + APR_URI_UNP_OMITUSERINFO), + ref ? " from " : "", ref ? ref : ""); + + return HTTP_MOVED_PERMANENTLY; +} + +/* -------------------------------------------------------------- */ +/* Invoke handler */ + +static int proxy_handler(request_rec *r) +{ + char *url, *scheme, *p; + const char *p2; + void *sconf = r->server->module_config; + proxy_server_conf *conf = (proxy_server_conf *) + ap_get_module_config(sconf, &proxy_module); + apr_array_header_t *proxies = conf->proxies; + struct proxy_remote *ents = (struct proxy_remote *) proxies->elts; + int i, rc, access_status; + int direct_connect = 0; + const char *str; + long maxfwd; + + /* is this for us? */ + if (!r->proxyreq || !r->filename || strncmp(r->filename, "proxy:", 6) != 0) + return DECLINED; + + /* handle max-forwards / OPTIONS / TRACE */ + if ((str = apr_table_get(r->headers_in, "Max-Forwards"))) { + maxfwd = strtol(str, NULL, 10); + if (maxfwd < 1) { + switch (r->method_number) { + case M_TRACE: { + int access_status; + r->proxyreq = PROXYREQ_NONE; + if ((access_status = ap_send_http_trace(r))) + ap_die(access_status, r); + else + ap_finalize_request_protocol(r); + return OK; + } + case M_OPTIONS: { + int access_status; + r->proxyreq = PROXYREQ_NONE; + if ((access_status = ap_send_http_options(r))) + ap_die(access_status, r); + else + ap_finalize_request_protocol(r); + return OK; + } + default: { + return ap_proxyerror(r, HTTP_BAD_GATEWAY, + "Max-Forwards has reached zero - proxy loop?"); + } + } + } + maxfwd = (maxfwd > 0) ? maxfwd - 1 : 0; + } + else { + /* set configured max-forwards */ + maxfwd = conf->maxfwd; + } + apr_table_set(r->headers_in, "Max-Forwards", + apr_psprintf(r->pool, "%ld", (maxfwd > 0) ? maxfwd : 0)); + + if (r->method_number == M_TRACE) { + core_server_config *coreconf = (core_server_config *) + ap_get_module_config(sconf, &core_module); + + if (coreconf->trace_enable == AP_TRACE_DISABLE) + { + /* Allow "error-notes" string to be printed by ap_send_error_response() + * Note; this goes nowhere, canned error response need an overhaul. + */ + apr_table_setn(r->notes, "error-notes", + "TRACE forbidden by server configuration"); + apr_table_setn(r->notes, "verbose-error-to", "*"); + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "proxy: TRACE forbidden by server configuration"); + return HTTP_FORBIDDEN; + } + + /* Can't test ap_should_client_block, we aren't ready to send + * the client a 100 Continue response till the connection has + * been established + */ + if (coreconf->trace_enable != AP_TRACE_EXTENDED + && (r->read_length || r->read_chunked || r->remaining)) + { + /* Allow "error-notes" string to be printed by ap_send_error_response() + * Note; this goes nowhere, canned error response need an overhaul. + */ + apr_table_setn(r->notes, "error-notes", + "TRACE with request body is not allowed"); + apr_table_setn(r->notes, "verbose-error-to", "*"); + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "proxy: TRACE with request body is not allowed"); + return HTTP_REQUEST_ENTITY_TOO_LARGE; + } + } + + url = r->filename + 6; + p = strchr(url, ':'); + if (p == NULL) + return HTTP_BAD_REQUEST; + + /* If the host doesn't have a domain name, add one and redirect. */ + if (conf->domain != NULL) { + rc = proxy_needsdomain(r, url, conf->domain); + if (ap_is_HTTP_REDIRECT(rc)) + return HTTP_MOVED_PERMANENTLY; + } + + *p = '\0'; + scheme = apr_pstrdup(r->pool, url); + *p = ':'; + + /* Check URI's destination host against NoProxy hosts */ + /* Bypass ProxyRemote server lookup if configured as NoProxy */ + /* we only know how to handle communication to a proxy via http */ + /*if (strcasecmp(scheme, "http") == 0) */ + { + int ii; + struct dirconn_entry *list = (struct dirconn_entry *) conf->dirconn->elts; + + for (direct_connect = ii = 0; ii < conf->dirconn->nelts && !direct_connect; ii++) { + direct_connect = list[ii].matcher(&list[ii], r); + } +#if DEBUGGING + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, + (direct_connect) ? "NoProxy for %s" : "UseProxy for %s", + r->uri); +#endif + } + + /* firstly, try a proxy, unless a NoProxy directive is active */ + if (!direct_connect) { + for (i = 0; i < proxies->nelts; i++) { + p2 = ap_strchr_c(ents[i].scheme, ':'); /* is it a partial URL? */ + if (strcmp(ents[i].scheme, "*") == 0 || + (ents[i].use_regex && + ap_regexec(ents[i].regexp, url, 0,NULL, 0) == 0) || + (p2 == NULL && strcasecmp(scheme, ents[i].scheme) == 0) || + (p2 != NULL && + strncasecmp(url, ents[i].scheme, strlen(ents[i].scheme)) == 0)) { + + /* handle the scheme */ + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "Trying to run scheme_handler against proxy"); + access_status = proxy_run_scheme_handler(r, conf, url, ents[i].hostname, ents[i].port); + + /* an error or success */ + if (access_status != DECLINED && access_status != HTTP_BAD_GATEWAY) { + return access_status; + } + /* we failed to talk to the upstream proxy */ + } + } + } + + /* otherwise, try it direct */ + /* N.B. what if we're behind a firewall, where we must use a proxy or + * give up?? + */ + + /* handle the scheme */ + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "Trying to run scheme_handler"); + access_status = proxy_run_scheme_handler(r, conf, url, NULL, 0); + if (DECLINED == access_status) { + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, r->server, + "proxy: No protocol handler was valid for the URL %s. " + "If you are using a DSO version of mod_proxy, make sure " + "the proxy submodules are included in the configuration " + "using LoadModule.", r->uri); + return HTTP_FORBIDDEN; + } + return access_status; +} + +/* -------------------------------------------------------------- */ +/* Setup configurable data */ + +static void * create_proxy_config(apr_pool_t *p, server_rec *s) +{ + proxy_server_conf *ps = apr_pcalloc(p, sizeof(proxy_server_conf)); + + ps->sec_proxy = apr_array_make(p, 10, sizeof(ap_conf_vector_t *)); + ps->proxies = apr_array_make(p, 10, sizeof(struct proxy_remote)); + ps->aliases = apr_array_make(p, 10, sizeof(struct proxy_alias)); + ps->raliases = apr_array_make(p, 10, sizeof(struct proxy_alias)); + ps->noproxies = apr_array_make(p, 10, sizeof(struct noproxy_entry)); + ps->dirconn = apr_array_make(p, 10, sizeof(struct dirconn_entry)); + ps->allowed_connect_ports = apr_array_make(p, 10, sizeof(int)); + ps->domain = NULL; + ps->viaopt = via_off; /* initially backward compatible with 1.3.1 */ + ps->viaopt_set = 0; /* 0 means default */ + ps->req = 0; + ps->req_set = 0; + ps->recv_buffer_size = 0; /* this default was left unset for some reason */ + ps->recv_buffer_size_set = 0; + ps->io_buffer_size = AP_IOBUFSIZE; + ps->io_buffer_size_set = 0; + ps->maxfwd = DEFAULT_MAX_FORWARDS; + ps->maxfwd_set = 0; + ps->error_override = 0; + ps->error_override_set = 0; + ps->preserve_host_set = 0; + ps->preserve_host = 0; + ps->timeout = 0; + ps->timeout_set = 0; + ps->badopt = bad_error; + ps->badopt_set = 0; + return ps; +} + +static void * merge_proxy_config(apr_pool_t *p, void *basev, void *overridesv) +{ + proxy_server_conf *ps = apr_pcalloc(p, sizeof(proxy_server_conf)); + proxy_server_conf *base = (proxy_server_conf *) basev; + proxy_server_conf *overrides = (proxy_server_conf *) overridesv; + + ps->proxies = apr_array_append(p, base->proxies, overrides->proxies); + ps->sec_proxy = apr_array_append(p, base->sec_proxy, overrides->sec_proxy); + ps->aliases = apr_array_append(p, base->aliases, overrides->aliases); + ps->raliases = apr_array_append(p, base->raliases, overrides->raliases); + ps->noproxies = apr_array_append(p, base->noproxies, overrides->noproxies); + ps->dirconn = apr_array_append(p, base->dirconn, overrides->dirconn); + ps->allowed_connect_ports = apr_array_append(p, base->allowed_connect_ports, overrides->allowed_connect_ports); + + ps->domain = (overrides->domain == NULL) ? base->domain : overrides->domain; + ps->viaopt = (overrides->viaopt_set == 0) ? base->viaopt : overrides->viaopt; + ps->viaopt_set = overrides->viaopt_set || base->viaopt_set; + ps->req = (overrides->req_set == 0) ? base->req : overrides->req; + ps->req_set = overrides->req_set || base->req_set; + ps->recv_buffer_size = (overrides->recv_buffer_size_set == 0) ? base->recv_buffer_size : overrides->recv_buffer_size; + ps->recv_buffer_size_set = overrides->recv_buffer_size_set || base->recv_buffer_size_set; + ps->io_buffer_size = (overrides->io_buffer_size_set == 0) ? base->io_buffer_size : overrides->io_buffer_size; + ps->io_buffer_size_set = overrides->io_buffer_size_set || base->io_buffer_size_set; + ps->maxfwd = (overrides->maxfwd_set == 0) ? base->maxfwd : overrides->maxfwd; + ps->maxfwd_set = overrides->maxfwd_set || base->maxfwd_set; + ps->error_override = (overrides->error_override_set == 0) ? base->error_override : overrides->error_override; + ps->error_override_set = overrides->error_override_set || base->error_override_set; + ps->preserve_host = (overrides->preserve_host_set == 0) ? base->preserve_host : overrides->preserve_host; + ps->preserve_host_set = overrides->preserve_host_set || base->preserve_host_set; + ps->timeout= (overrides->timeout_set == 0) ? base->timeout : overrides->timeout; + ps->timeout_set = overrides->timeout_set || base->timeout_set; + ps->badopt = (overrides->badopt_set == 0) ? base->badopt : overrides->badopt; + ps->badopt_set = overrides->badopt_set || base->badopt_set; + + return ps; +} + +static void *create_proxy_dir_config(apr_pool_t *p, char *dummy) +{ + proxy_dir_conf *new = + (proxy_dir_conf *) apr_pcalloc(p, sizeof(proxy_dir_conf)); + + /* Filled in by proxysection, when applicable */ + + return (void *) new; +} + +static void *merge_proxy_dir_config(apr_pool_t *p, void *basev, void *addv) +{ + proxy_dir_conf *new = (proxy_dir_conf *) apr_pcalloc(p, sizeof(proxy_dir_conf)); + proxy_dir_conf *add = (proxy_dir_conf *) addv; + proxy_dir_conf *base = (proxy_dir_conf *) basev; + + new->p = add->p; + new->p_is_fnmatch = add->p_is_fnmatch; + new->r = add->r; + new->ftp_directory_charset = add->ftp_directory_charset ? + add->ftp_directory_charset : + base->ftp_directory_charset; + return new; +} + + +static const char * + add_proxy(cmd_parms *cmd, void *dummy, const char *f1, const char *r1, int regex) +{ + server_rec *s = cmd->server; + proxy_server_conf *conf = + (proxy_server_conf *) ap_get_module_config(s->module_config, &proxy_module); + struct proxy_remote *new; + char *p, *q; + char *r, *f, *scheme; + regex_t *reg = NULL; + int port; + + r = apr_pstrdup(cmd->pool, r1); + scheme = apr_pstrdup(cmd->pool, r1); + f = apr_pstrdup(cmd->pool, f1); + p = strchr(r, ':'); + if (p == NULL || p[1] != '/' || p[2] != '/' || p[3] == '\0') { + if (regex) + return "ProxyRemoteMatch: Bad syntax for a remote proxy server"; + else + return "ProxyRemote: Bad syntax for a remote proxy server"; + } + else { + scheme[p-r] = 0; + } + q = strchr(p + 3, ':'); + if (q != NULL) { + if (sscanf(q + 1, "%u", &port) != 1 || port > 65535) { + if (regex) + return "ProxyRemoteMatch: Bad syntax for a remote proxy server (bad port number)"; + else + return "ProxyRemote: Bad syntax for a remote proxy server (bad port number)"; + } + *q = '\0'; + } + else + port = -1; + *p = '\0'; + if (regex) { + reg = ap_pregcomp(cmd->pool, f, REG_EXTENDED); + if (!reg) + return "Regular expression for ProxyRemoteMatch could not be compiled."; + } + else + if (strchr(f, ':') == NULL) + ap_str_tolower(f); /* lowercase scheme */ + ap_str_tolower(p + 3); /* lowercase hostname */ + + if (port == -1) { + port = apr_uri_port_of_scheme(scheme); + } + + new = apr_array_push(conf->proxies); + new->scheme = f; + new->protocol = r; + new->hostname = p + 3; + new->port = port; + new->regexp = reg; + new->use_regex = regex; + return NULL; +} + +static const char * + add_proxy_noregex(cmd_parms *cmd, void *dummy, const char *f1, const char *r1) +{ + return add_proxy(cmd, dummy, f1, r1, 0); +} + +static const char * + add_proxy_regex(cmd_parms *cmd, void *dummy, const char *f1, const char *r1) +{ + return add_proxy(cmd, dummy, f1, r1, 1); +} + +static const char * + add_pass(cmd_parms *cmd, void *dummy, const char *f, const char *r) +{ + server_rec *s = cmd->server; + proxy_server_conf *conf = + (proxy_server_conf *) ap_get_module_config(s->module_config, &proxy_module); + struct proxy_alias *new; + if (r!=NULL && cmd->path == NULL ) { + new = apr_array_push(conf->aliases); + new->fake = f; + new->real = r; + } else if (r==NULL && cmd->path != NULL) { + new = apr_array_push(conf->aliases); + new->fake = cmd->path; + new->real = f; + } else { + if ( r== NULL) + return "ProxyPass needs a path when not defined in a location"; + else + return "ProxyPass can not have a path when defined in a location"; + } + + return NULL; +} + +static const char * + add_pass_reverse(cmd_parms *cmd, void *dummy, const char *f, const char *r) +{ + server_rec *s = cmd->server; + proxy_server_conf *conf; + struct proxy_alias *new; + + conf = (proxy_server_conf *)ap_get_module_config(s->module_config, + &proxy_module); + if (r!=NULL && cmd->path == NULL ) { + new = apr_array_push(conf->raliases); + new->fake = f; + new->real = r; + } else if (r==NULL && cmd->path != NULL) { + new = apr_array_push(conf->raliases); + new->fake = cmd->path; + new->real = f; + } else { + if ( r == NULL) + return "ProxyPassReverse needs a path when not defined in a location"; + else + return "ProxyPassReverse can not have a path when defined in a location"; + } + + return NULL; +} + +static const char * + set_proxy_exclude(cmd_parms *parms, void *dummy, const char *arg) +{ + server_rec *s = parms->server; + proxy_server_conf *conf = + ap_get_module_config(s->module_config, &proxy_module); + struct noproxy_entry *new; + struct noproxy_entry *list = (struct noproxy_entry *) conf->noproxies->elts; + struct apr_sockaddr_t *addr; + int found = 0; + int i; + + /* Don't duplicate entries */ + for (i = 0; i < conf->noproxies->nelts; i++) { + if (apr_strnatcasecmp(arg, list[i].name) == 0) { /* ignore case for host names */ + found = 1; + } + } + + if (!found) { + new = apr_array_push(conf->noproxies); + new->name = arg; + if (APR_SUCCESS == apr_sockaddr_info_get(&addr, new->name, APR_UNSPEC, 0, 0, parms->pool)) { + new->addr = addr; + } + else { + new->addr = NULL; + } + } + return NULL; +} + +/* + * Set the ports CONNECT can use + */ +static const char * + set_allowed_ports(cmd_parms *parms, void *dummy, const char *arg) +{ + server_rec *s = parms->server; + proxy_server_conf *conf = + ap_get_module_config(s->module_config, &proxy_module); + int *New; + + if (!apr_isdigit(arg[0])) + return "AllowCONNECT: port number must be numeric"; + + New = apr_array_push(conf->allowed_connect_ports); + *New = atoi(arg); + return NULL; +} + +/* Similar to set_proxy_exclude(), but defining directly connected hosts, + * which should never be accessed via the configured ProxyRemote servers + */ +static const char * + set_proxy_dirconn(cmd_parms *parms, void *dummy, const char *arg) +{ + server_rec *s = parms->server; + proxy_server_conf *conf = + ap_get_module_config(s->module_config, &proxy_module); + struct dirconn_entry *New; + struct dirconn_entry *list = (struct dirconn_entry *) conf->dirconn->elts; + int found = 0; + int i; + + /* Don't duplicate entries */ + for (i = 0; i < conf->dirconn->nelts; i++) { + if (strcasecmp(arg, list[i].name) == 0) + found = 1; + } + + if (!found) { + New = apr_array_push(conf->dirconn); + New->name = apr_pstrdup(parms->pool, arg); + New->hostaddr = NULL; + + if (ap_proxy_is_ipaddr(New, parms->pool)) { +#if DEBUGGING + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "Parsed addr %s", inet_ntoa(New->addr)); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "Parsed mask %s", inet_ntoa(New->mask)); +#endif + } + else if (ap_proxy_is_domainname(New, parms->pool)) { + ap_str_tolower(New->name); +#if DEBUGGING + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "Parsed domain %s", New->name); +#endif + } + else if (ap_proxy_is_hostname(New, parms->pool)) { + ap_str_tolower(New->name); +#if DEBUGGING + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "Parsed host %s", New->name); +#endif + } + else { + ap_proxy_is_word(New, parms->pool); +#if DEBUGGING + fprintf(stderr, "Parsed word %s\n", New->name); +#endif + } + } + return NULL; +} + +static const char * + set_proxy_domain(cmd_parms *parms, void *dummy, const char *arg) +{ + proxy_server_conf *psf = + ap_get_module_config(parms->server->module_config, &proxy_module); + + if (arg[0] != '.') + return "ProxyDomain: domain name must start with a dot."; + + psf->domain = arg; + return NULL; +} + +static const char * + set_proxy_req(cmd_parms *parms, void *dummy, int flag) +{ + proxy_server_conf *psf = + ap_get_module_config(parms->server->module_config, &proxy_module); + + psf->req = flag; + psf->req_set = 1; + return NULL; +} +static const char * + set_proxy_error_override(cmd_parms *parms, void *dummy, int flag) +{ + proxy_server_conf *psf = + ap_get_module_config(parms->server->module_config, &proxy_module); + + psf->error_override = flag; + psf->error_override_set = 1; + return NULL; +} +static const char * + set_preserve_host(cmd_parms *parms, void *dummy, int flag) +{ + proxy_server_conf *psf = + ap_get_module_config(parms->server->module_config, &proxy_module); + + psf->preserve_host = flag; + psf->preserve_host_set = 1; + return NULL; +} + +static const char * + set_recv_buffer_size(cmd_parms *parms, void *dummy, const char *arg) +{ + proxy_server_conf *psf = + ap_get_module_config(parms->server->module_config, &proxy_module); + int s = atoi(arg); + if (s < 512 && s != 0) { + return "ProxyReceiveBufferSize must be >= 512 bytes, or 0 for system default."; + } + + psf->recv_buffer_size = s; + psf->recv_buffer_size_set = 1; + return NULL; +} + +static const char * + set_io_buffer_size(cmd_parms *parms, void *dummy, const char *arg) +{ + proxy_server_conf *psf = + ap_get_module_config(parms->server->module_config, &proxy_module); + long s = atol(arg); + + psf->io_buffer_size = ((s > AP_IOBUFSIZE) ? s : AP_IOBUFSIZE); + psf->io_buffer_size_set = 1; + return NULL; +} + +static const char * + set_max_forwards(cmd_parms *parms, void *dummy, const char *arg) +{ + proxy_server_conf *psf = + ap_get_module_config(parms->server->module_config, &proxy_module); + long s = atol(arg); + if (s < 0) { + return "ProxyMaxForwards must be greater or equal to zero.."; + } + + psf->maxfwd = s; + psf->maxfwd_set = 1; + return NULL; +} +static const char* + set_proxy_timeout(cmd_parms *parms, void *dummy, const char *arg) +{ + proxy_server_conf *psf = + ap_get_module_config(parms->server->module_config, &proxy_module); + int timeout; + + timeout=atoi(arg); + if (timeout<1) { + return "Proxy Timeout must be at least 1 second."; + } + psf->timeout_set=1; + psf->timeout=apr_time_from_sec(timeout); + + return NULL; +} + +static const char* + set_via_opt(cmd_parms *parms, void *dummy, const char *arg) +{ + proxy_server_conf *psf = + ap_get_module_config(parms->server->module_config, &proxy_module); + + if (strcasecmp(arg, "Off") == 0) + psf->viaopt = via_off; + else if (strcasecmp(arg, "On") == 0) + psf->viaopt = via_on; + else if (strcasecmp(arg, "Block") == 0) + psf->viaopt = via_block; + else if (strcasecmp(arg, "Full") == 0) + psf->viaopt = via_full; + else { + return "ProxyVia must be one of: " + "off | on | full | block"; + } + + psf->viaopt_set = 1; + return NULL; +} + +static const char* + set_bad_opt(cmd_parms *parms, void *dummy, const char *arg) +{ + proxy_server_conf *psf = + ap_get_module_config(parms->server->module_config, &proxy_module); + + if (strcasecmp(arg, "IsError") == 0) + psf->badopt = bad_error; + else if (strcasecmp(arg, "Ignore") == 0) + psf->badopt = bad_ignore; + else if (strcasecmp(arg, "StartBody") == 0) + psf->badopt = bad_body; + else { + return "ProxyBadHeader must be one of: " + "IsError | Ignore | StartBody"; + } + + psf->badopt_set = 1; + return NULL; +} + +static const char* set_ftp_directory_charset(cmd_parms *cmd, void *dconf, + const char *arg) +{ + proxy_dir_conf *conf = dconf; + + conf->ftp_directory_charset = arg; + return NULL; +} + +static void ap_add_per_proxy_conf(server_rec *s, ap_conf_vector_t *dir_config) +{ + proxy_server_conf *sconf = ap_get_module_config(s->module_config, + &proxy_module); + void **new_space = (void **)apr_array_push(sconf->sec_proxy); + + *new_space = dir_config; +} + +static const char *proxysection(cmd_parms *cmd, void *mconfig, const char *arg) +{ + const char *errmsg; + const char *endp = ap_strrchr_c(arg, '>'); + int old_overrides = cmd->override; + char *old_path = cmd->path; + proxy_dir_conf *conf; + ap_conf_vector_t *new_dir_conf = ap_create_per_dir_config(cmd->pool); + regex_t *r = NULL; + const command_rec *thiscmd = cmd->cmd; + + const char *err = ap_check_cmd_context(cmd, + NOT_IN_DIR_LOC_FILE|NOT_IN_LIMIT); + if (err != NULL) { + return err; + } + + if (endp == NULL) { + return apr_pstrcat(cmd->pool, cmd->cmd->name, + "> directive missing closing '>'", NULL); + } + + arg=apr_pstrndup(cmd->pool, arg, endp-arg); + + if (!arg) { + if (thiscmd->cmd_data) + return "<ProxyMatch > block must specify a path"; + else + return "<Proxy > block must specify a path"; + } + + cmd->path = ap_getword_conf(cmd->pool, &arg); + cmd->override = OR_ALL|ACCESS_CONF; + + if (!strncasecmp(cmd->path, "proxy:", 6)) + cmd->path += 6; + + /* XXX Ignore case? What if we proxy a case-insensitive server?!? + * While we are at it, shouldn't we also canonicalize the entire + * scheme? See proxy_fixup() + */ + if (thiscmd->cmd_data) { /* <ProxyMatch> */ + r = ap_pregcomp(cmd->pool, cmd->path, REG_EXTENDED); + if (!r) { + return "Regex could not be compiled"; + } + } + else if (!strcmp(cmd->path, "~")) { + cmd->path = ap_getword_conf(cmd->pool, &arg); + if (!cmd->path) + return "<Proxy ~ > block must specify a path"; + if (strncasecmp(cmd->path, "proxy:", 6)) + cmd->path += 6; + r = ap_pregcomp(cmd->pool, cmd->path, REG_EXTENDED); + if (!r) { + return "Regex could not be compiled"; + } + } + + /* initialize our config and fetch it */ + conf = ap_set_config_vectors(cmd->server, new_dir_conf, cmd->path, + &proxy_module, cmd->pool); + + errmsg = ap_walk_config(cmd->directive->first_child, cmd, new_dir_conf); + if (errmsg != NULL) + return errmsg; + + conf->r = r; + conf->p = cmd->path; + conf->p_is_fnmatch = apr_fnmatch_test(conf->p); + + ap_add_per_proxy_conf(cmd->server, new_dir_conf); + + if (*arg != '\0') { + return apr_pstrcat(cmd->pool, "Multiple ", thiscmd->name, + "> arguments not (yet) supported.", NULL); + } + + cmd->path = old_path; + cmd->override = old_overrides; + + return NULL; +} + +static const command_rec proxy_cmds[] = +{ + AP_INIT_RAW_ARGS("<Proxy", proxysection, NULL, RSRC_CONF, + "Container for directives affecting resources located in the proxied " + "location"), + AP_INIT_RAW_ARGS("<ProxyMatch", proxysection, (void*)1, RSRC_CONF, + "Container for directives affecting resources located in the proxied " + "location, in regular expression syntax"), + AP_INIT_FLAG("ProxyRequests", set_proxy_req, NULL, RSRC_CONF, + "on if the true proxy requests should be accepted"), + AP_INIT_TAKE2("ProxyRemote", add_proxy_noregex, NULL, RSRC_CONF, + "a scheme, partial URL or '*' and a proxy server"), + AP_INIT_TAKE2("ProxyRemoteMatch", add_proxy_regex, NULL, RSRC_CONF, + "a regex pattern and a proxy server"), + AP_INIT_TAKE12("ProxyPass", add_pass, NULL, RSRC_CONF|ACCESS_CONF, + "a virtual path and a URL"), + AP_INIT_TAKE12("ProxyPassReverse", add_pass_reverse, NULL, RSRC_CONF|ACCESS_CONF, + "a virtual path and a URL for reverse proxy behaviour"), + AP_INIT_ITERATE("ProxyBlock", set_proxy_exclude, NULL, RSRC_CONF, + "A list of names, hosts or domains to which the proxy will not connect"), + AP_INIT_TAKE1("ProxyReceiveBufferSize", set_recv_buffer_size, NULL, RSRC_CONF, + "Receive buffer size for outgoing HTTP and FTP connections in bytes"), + AP_INIT_TAKE1("ProxyIOBufferSize", set_io_buffer_size, NULL, RSRC_CONF, + "IO buffer size for outgoing HTTP and FTP connections in bytes"), + AP_INIT_TAKE1("ProxyMaxForwards", set_max_forwards, NULL, RSRC_CONF, + "The maximum number of proxies a request may be forwarded through."), + AP_INIT_ITERATE("NoProxy", set_proxy_dirconn, NULL, RSRC_CONF, + "A list of domains, hosts, or subnets to which the proxy will connect directly"), + AP_INIT_TAKE1("ProxyDomain", set_proxy_domain, NULL, RSRC_CONF, + "The default intranet domain name (in absence of a domain in the URL)"), + AP_INIT_ITERATE("AllowCONNECT", set_allowed_ports, NULL, RSRC_CONF, + "A list of ports which CONNECT may connect to"), + AP_INIT_TAKE1("ProxyVia", set_via_opt, NULL, RSRC_CONF, + "Configure Via: proxy header header to one of: on | off | block | full"), + AP_INIT_FLAG("ProxyErrorOverride", set_proxy_error_override, NULL, RSRC_CONF, + "use our error handling pages instead of the servers' we are proxying"), + AP_INIT_FLAG("ProxyPreserveHost", set_preserve_host, NULL, RSRC_CONF, + "on if we should preserve host header while proxying"), + AP_INIT_TAKE1("ProxyTimeout", set_proxy_timeout, NULL, RSRC_CONF, + "Set the timeout (in seconds) for a proxied connection. " + "This overrides the server timeout"), + AP_INIT_TAKE1("ProxyBadHeader", set_bad_opt, NULL, RSRC_CONF, + "How to handle bad header line in response: IsError | Ignore | StartBody"), + AP_INIT_TAKE1("ProxyFtpDirCharset", set_ftp_directory_charset, NULL, + RSRC_CONF|ACCESS_CONF, "Define the character set for proxied FTP listings"), + {NULL} +}; + +APR_DECLARE_OPTIONAL_FN(int, ssl_proxy_enable, (conn_rec *)); +APR_DECLARE_OPTIONAL_FN(int, ssl_engine_disable, (conn_rec *)); + +static APR_OPTIONAL_FN_TYPE(ssl_proxy_enable) *proxy_ssl_enable = NULL; +static APR_OPTIONAL_FN_TYPE(ssl_engine_disable) *proxy_ssl_disable = NULL; + +PROXY_DECLARE(int) ap_proxy_ssl_enable(conn_rec *c) +{ + /* + * if c == NULL just check if the optional function was imported + * else run the optional function so ssl filters are inserted + */ + if (proxy_ssl_enable) { + return c ? proxy_ssl_enable(c) : 1; + } + + return 0; +} + +PROXY_DECLARE(int) ap_proxy_ssl_disable(conn_rec *c) +{ + if (proxy_ssl_disable) { + return proxy_ssl_disable(c); + } + + return 0; +} + +static int proxy_post_config(apr_pool_t *pconf, apr_pool_t *plog, + apr_pool_t *ptemp, server_rec *s) +{ + proxy_ssl_enable = APR_RETRIEVE_OPTIONAL_FN(ssl_proxy_enable); + proxy_ssl_disable = APR_RETRIEVE_OPTIONAL_FN(ssl_engine_disable); + + return OK; +} + +static void register_hooks(apr_pool_t *p) +{ + /* fixup before mod_rewrite, so that the proxied url will not + * escaped accidentally by our fixup. + */ + static const char * const aszSucc[]={ "mod_rewrite.c", NULL }; + + /* handler */ + ap_hook_handler(proxy_handler, NULL, NULL, APR_HOOK_FIRST); + /* filename-to-URI translation */ + ap_hook_translate_name(proxy_trans, NULL, NULL, APR_HOOK_FIRST); + /* walk <Proxy > entries and suppress default TRACE behavior */ + ap_hook_map_to_storage(proxy_map_location, NULL,NULL, APR_HOOK_FIRST); + /* fixups */ + ap_hook_fixups(proxy_fixup, NULL, aszSucc, APR_HOOK_FIRST); + /* post read_request handling */ + ap_hook_post_read_request(proxy_detect, NULL, NULL, APR_HOOK_FIRST); + /* post config handling */ + ap_hook_post_config(proxy_post_config, NULL, NULL, APR_HOOK_MIDDLE); +} + +module AP_MODULE_DECLARE_DATA proxy_module = +{ + STANDARD20_MODULE_STUFF, + create_proxy_dir_config, /* create per-directory config structure */ + merge_proxy_dir_config, /* merge per-directory config structures */ + create_proxy_config, /* create per-server config structure */ + merge_proxy_config, /* merge per-server config structures */ + proxy_cmds, /* command table */ + register_hooks +}; + +APR_HOOK_STRUCT( + APR_HOOK_LINK(scheme_handler) + APR_HOOK_LINK(canon_handler) +) + +APR_IMPLEMENT_EXTERNAL_HOOK_RUN_FIRST(proxy, PROXY, int, scheme_handler, + (request_rec *r, proxy_server_conf *conf, + char *url, const char *proxyhost, + apr_port_t proxyport),(r,conf,url, + proxyhost,proxyport),DECLINED) +APR_IMPLEMENT_EXTERNAL_HOOK_RUN_FIRST(proxy, PROXY, int, canon_handler, + (request_rec *r, char *url),(r, + url),DECLINED) +APR_IMPLEMENT_OPTIONAL_HOOK_RUN_ALL(proxy, PROXY, int, fixups, + (request_rec *r), (r), + OK, DECLINED) diff --git a/rubbos/app/httpd-2.0.64/modules/proxy/mod_proxy.dsp b/rubbos/app/httpd-2.0.64/modules/proxy/mod_proxy.dsp new file mode 100644 index 00000000..9fa9feb0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/proxy/mod_proxy.dsp @@ -0,0 +1,140 @@ +# Microsoft Developer Studio Project File - Name="mod_proxy" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=mod_proxy - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "mod_proxy.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 "mod_proxy.mak" CFG="mod_proxy - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "mod_proxy - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_proxy - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "mod_proxy - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "PROXY_DECLARE_EXPORT" /Fd"Release\mod_proxy_src" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x809 /d "NDEBUG" +# ADD RSC /l 0x809 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib ws2_32.lib mswsock.lib /nologo /subsystem:windows /dll /out:"Release/mod_proxy.so" /base:@..\..\os\win32\BaseAddr.ref,mod_proxy.so +# ADD LINK32 kernel32.lib ws2_32.lib mswsock.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Release/mod_proxy.so" /base:@..\..\os\win32\BaseAddr.ref,mod_proxy.so /opt:ref + +!ELSEIF "$(CFG)" == "mod_proxy - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "PROXY_DECLARE_EXPORT" /Fd"Debug\mod_proxy_src" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x809 /d "_DEBUG" +# ADD RSC /l 0x809 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib ws2_32.lib mswsock.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_proxy.so" /base:@..\..\os\win32\BaseAddr.ref,mod_proxy.so +# ADD LINK32 kernel32.lib ws2_32.lib mswsock.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_proxy.so" /base:@..\..\os\win32\BaseAddr.ref,mod_proxy.so + +!ENDIF + +# Begin Target + +# Name "mod_proxy - Win32 Release" +# Name "mod_proxy - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;hpj;bat;for;f90" +# Begin Source File + +SOURCE=.\mod_proxy.c +# End Source File +# Begin Source File + +SOURCE=.\proxy_util.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl;fi;fd" +# Begin Source File + +SOURCE=.\mod_proxy.h +# End Source File +# End Group +# Begin Source File + +SOURCE=..\..\build\win32\win32ver.awk + +!IF "$(CFG)" == "mod_proxy - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_proxy.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_proxy.so "proxy_module for Apache" ../../include/ap_release.h > .\mod_proxy.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "mod_proxy - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_proxy.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_proxy.so "proxy_module for Apache" ../../include/ap_release.h > .\mod_proxy.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/modules/proxy/mod_proxy.h b/rubbos/app/httpd-2.0.64/modules/proxy/mod_proxy.h new file mode 100644 index 00000000..d1ed7d46 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/proxy/mod_proxy.h @@ -0,0 +1,255 @@ +/* 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. + */ + +#ifndef MOD_PROXY_H +#define MOD_PROXY_H + +/* + * Main include file for the Apache proxy + */ + +/* + + Also note numerous FIXMEs and CHECKMEs which should be eliminated. + + This code is once again experimental! + + Things to do: + + 1. Make it completely work (for FTP too) + + 2. HTTP/1.1 + + Chuck Murcko <chuck@topsail.org> 02-06-01 + + */ + +#define CORE_PRIVATE + +#include "apr_hooks.h" +#include "apr.h" +#include "apr_lib.h" +#include "apr_strings.h" +#include "apr_buckets.h" +#include "apr_md5.h" +#include "apr_network_io.h" +#include "apr_pools.h" +#include "apr_strings.h" +#include "apr_uri.h" +#include "apr_date.h" +#include "apr_fnmatch.h" +#define APR_WANT_STRFUNC +#include "apr_want.h" + +#include "httpd.h" +#include "http_config.h" +#include "ap_config.h" +#include "http_core.h" +#include "http_protocol.h" +#include "http_request.h" +#include "http_vhost.h" +#include "http_main.h" +#include "http_log.h" +#include "http_connection.h" +#include "util_filter.h" +#include "util_ebcdic.h" + +#if APR_HAVE_NETINET_IN_H +#include <netinet/in.h> +#endif +#if APR_HAVE_ARPA_INET_H +#include <arpa/inet.h> +#endif + +/* for proxy_canonenc() */ +enum enctype { + enc_path, enc_search, enc_user, enc_fpath, enc_parm +}; + +#if APR_CHARSET_EBCDIC +#define CRLF "\r\n" +#else /*APR_CHARSET_EBCDIC*/ +#define CRLF "\015\012" +#endif /*APR_CHARSET_EBCDIC*/ + +/* default Max-Forwards header setting */ +#define DEFAULT_MAX_FORWARDS 10 + +/* static information about a remote proxy */ +struct proxy_remote { + const char *scheme; /* the schemes handled by this proxy, or '*' */ + const char *protocol; /* the scheme used to talk to this proxy */ + const char *hostname; /* the hostname of this proxy */ + apr_port_t port; /* the port for this proxy */ + regex_t *regexp; /* compiled regex (if any) for the remote */ + int use_regex; /* simple boolean. True if we have a regex pattern */ +}; + +struct proxy_alias { + const char *real; + const char *fake; +}; + +struct dirconn_entry { + char *name; + struct in_addr addr, mask; + struct apr_sockaddr_t *hostaddr; + int (*matcher) (struct dirconn_entry * This, request_rec *r); +}; + +struct noproxy_entry { + const char *name; + struct apr_sockaddr_t *addr; +}; + +typedef struct { + apr_array_header_t *proxies; + apr_array_header_t *sec_proxy; + apr_array_header_t *aliases; + apr_array_header_t *raliases; + apr_array_header_t *noproxies; + apr_array_header_t *dirconn; + apr_array_header_t *allowed_connect_ports; + const char *domain; /* domain name to use in absence of a domain name in the request */ + int req; /* true if proxy requests are enabled */ + char req_set; + enum { + via_off, + via_on, + via_block, + via_full + } viaopt; /* how to deal with proxy Via: headers */ + char viaopt_set; + apr_size_t recv_buffer_size; + char recv_buffer_size_set; + apr_size_t io_buffer_size; + char io_buffer_size_set; + long maxfwd; + char maxfwd_set; + /** + * the following setting masks the error page + * returned from the 'proxied server' and just + * forwards the status code upwards. + * This allows the main server (us) to generate + * the error page, (so it will look like a error + * returned from the rest of the system + */ + int error_override; + int error_override_set; + int preserve_host; + int preserve_host_set; + apr_interval_time_t timeout; + apr_interval_time_t timeout_set; + enum { + bad_error, + bad_ignore, + bad_body + } badopt; /* how to deal with bad headers */ + char badopt_set; + +} proxy_server_conf; + +typedef struct { + const char *p; /* The path */ + int p_is_fnmatch; /* Is this path an fnmatch candidate? */ + regex_t *r; /* Is this a regex? */ + const char *ftp_directory_charset; +} proxy_dir_conf; + +typedef struct { + conn_rec *connection; + char *hostname; + apr_port_t port; + int is_ssl; +} proxy_conn_rec; + +typedef struct { + float cache_completion; /* completion percentage */ + int content_length; /* length of the content */ +} proxy_completion; + + +/* hooks */ + +/* Create a set of PROXY_DECLARE(type), PROXY_DECLARE_NONSTD(type) and + * PROXY_DECLARE_DATA with appropriate export and import tags for the platform + */ +#if !defined(WIN32) +#define PROXY_DECLARE(type) type +#define PROXY_DECLARE_NONSTD(type) type +#define PROXY_DECLARE_DATA +#elif defined(PROXY_DECLARE_STATIC) +#define PROXY_DECLARE(type) type __stdcall +#define PROXY_DECLARE_NONSTD(type) type +#define PROXY_DECLARE_DATA +#elif defined(PROXY_DECLARE_EXPORT) +#define PROXY_DECLARE(type) __declspec(dllexport) type __stdcall +#define PROXY_DECLARE_NONSTD(type) __declspec(dllexport) type +#define PROXY_DECLARE_DATA __declspec(dllexport) +#else +#define PROXY_DECLARE(type) __declspec(dllimport) type __stdcall +#define PROXY_DECLARE_NONSTD(type) __declspec(dllimport) type +#define PROXY_DECLARE_DATA __declspec(dllimport) +#endif + +/** + * Hook an optional proxy hook. Unlike static hooks, this uses a macro + * instead of a function. + */ +#define PROXY_OPTIONAL_HOOK(name,fn,pre,succ,order) \ + APR_OPTIONAL_HOOK(proxy,name,fn,pre,succ,order) + +APR_DECLARE_EXTERNAL_HOOK(proxy, PROXY, int, scheme_handler, (request_rec *r, + proxy_server_conf *conf, char *url, + const char *proxyhost, apr_port_t proxyport)) +APR_DECLARE_EXTERNAL_HOOK(proxy, PROXY, int, canon_handler, (request_rec *r, + char *url)) + +APR_DECLARE_EXTERNAL_HOOK(proxy, PROXY, int, create_req, (request_rec *r, request_rec *pr)) +APR_DECLARE_EXTERNAL_HOOK(proxy, PROXY, int, fixups, (request_rec *r)) + +/* proxy_util.c */ + +PROXY_DECLARE(request_rec *)ap_proxy_make_fake_req(conn_rec *c, request_rec *r); +PROXY_DECLARE(int) ap_proxy_hex2c(const char *x); +PROXY_DECLARE(void) ap_proxy_c2hex(int ch, char *x); +PROXY_DECLARE(char *)ap_proxy_canonenc(apr_pool_t *p, const char *x, int len, enum enctype t, + int isenc); +PROXY_DECLARE(char *)ap_proxy_canon_netloc(apr_pool_t *p, char **const urlp, char **userp, + char **passwordp, char **hostp, apr_port_t *port); +PROXY_DECLARE(const char *)ap_proxy_date_canon(apr_pool_t *p, const char *x); +PROXY_DECLARE(apr_table_t *)ap_proxy_read_headers(request_rec *r, request_rec *rp, char *buffer, int size, conn_rec *c); +PROXY_DECLARE(int) ap_proxy_liststr(const char *list, const char *val); +PROXY_DECLARE(char *)ap_proxy_removestr(apr_pool_t *pool, const char *list, const char *val); +PROXY_DECLARE(int) ap_proxy_hex2sec(const char *x); +PROXY_DECLARE(void) ap_proxy_sec2hex(int t, char *y); +PROXY_DECLARE(int) ap_proxyerror(request_rec *r, int statuscode, const char *message); +PROXY_DECLARE(int) ap_proxy_is_ipaddr(struct dirconn_entry *This, apr_pool_t *p); +PROXY_DECLARE(int) ap_proxy_is_domainname(struct dirconn_entry *This, apr_pool_t *p); +PROXY_DECLARE(int) ap_proxy_is_hostname(struct dirconn_entry *This, apr_pool_t *p); +PROXY_DECLARE(int) ap_proxy_is_word(struct dirconn_entry *This, apr_pool_t *p); +PROXY_DECLARE(int) ap_proxy_checkproxyblock(request_rec *r, proxy_server_conf *conf, apr_sockaddr_t *uri_addr); +PROXY_DECLARE(int) ap_proxy_pre_http_request(conn_rec *c, request_rec *r); +PROXY_DECLARE(apr_status_t) ap_proxy_string_read(conn_rec *c, apr_bucket_brigade *bb, char *buff, size_t bufflen, int *eos); +PROXY_DECLARE(void) ap_proxy_table_unmerge(apr_pool_t *p, apr_table_t *t, char *key); +PROXY_DECLARE(int) ap_proxy_connect_to_backend(apr_socket_t **, const char *, apr_sockaddr_t *, const char *, proxy_server_conf *, server_rec *, apr_pool_t *); +PROXY_DECLARE(int) ap_proxy_ssl_enable(conn_rec *c); +PROXY_DECLARE(int) ap_proxy_ssl_disable(conn_rec *c); + +/* For proxy_util */ +extern module AP_MODULE_DECLARE_DATA proxy_module; + +#endif /*MOD_PROXY_H*/ diff --git a/rubbos/app/httpd-2.0.64/modules/proxy/mod_proxy_connect.dsp b/rubbos/app/httpd-2.0.64/modules/proxy/mod_proxy_connect.dsp new file mode 100644 index 00000000..0c2a12b0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/proxy/mod_proxy_connect.dsp @@ -0,0 +1,136 @@ +# Microsoft Developer Studio Project File - Name="mod_proxy_connect" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=mod_proxy_connect - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "mod_proxy_connect.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 "mod_proxy_connect.mak" CFG="mod_proxy_connect - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "mod_proxy_connect - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_proxy_connect - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "mod_proxy_connect - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_proxy_connect_src" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x809 /d "NDEBUG" +# ADD RSC /l 0x809 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib ws2_32.lib mswsock.lib /nologo /subsystem:windows /dll /out:"Release/mod_proxy_connect.so" /base:@..\..\os\win32\BaseAddr.ref,mod_proxy_connect.so +# ADD LINK32 kernel32.lib ws2_32.lib mswsock.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Release/mod_proxy_connect.so" /base:@..\..\os\win32\BaseAddr.ref,mod_proxy_connect.so /opt:ref + +!ELSEIF "$(CFG)" == "mod_proxy_connect - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_proxy_connect_src" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x809 /d "_DEBUG" +# ADD RSC /l 0x809 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib ws2_32.lib mswsock.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_proxy_connect.so" /base:@..\..\os\win32\BaseAddr.ref,mod_proxy_connect.so +# ADD LINK32 kernel32.lib ws2_32.lib mswsock.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_proxy_connect.so" /base:@..\..\os\win32\BaseAddr.ref,mod_proxy_connect.so + +!ENDIF + +# Begin Target + +# Name "mod_proxy_connect - Win32 Release" +# Name "mod_proxy_connect - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;hpj;bat;for;f90" +# Begin Source File + +SOURCE=.\proxy_connect.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter ".h" +# Begin Source File + +SOURCE=.\mod_proxy.h +# End Source File +# End Group +# Begin Source File + +SOURCE=..\..\build\win32\win32ver.awk + +!IF "$(CFG)" == "mod_proxy_connect - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_proxy_connect.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_proxy_connect.so "proxy_connect_module for Apache" ../../include/ap_release.h > .\mod_proxy_connect.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "mod_proxy_connect - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_proxy_connect.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_proxy_connect.so "proxy_connect_module for Apache" ../../include/ap_release.h > .\mod_proxy_connect.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/modules/proxy/mod_proxy_ftp.dsp b/rubbos/app/httpd-2.0.64/modules/proxy/mod_proxy_ftp.dsp new file mode 100644 index 00000000..3dfe0b7e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/proxy/mod_proxy_ftp.dsp @@ -0,0 +1,136 @@ +# Microsoft Developer Studio Project File - Name="mod_proxy_ftp" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=mod_proxy_ftp - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "mod_proxy_ftp.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 "mod_proxy_ftp.mak" CFG="mod_proxy_ftp - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "mod_proxy_ftp - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_proxy_ftp - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "mod_proxy_ftp - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_proxy_ftp_src" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x809 /d "NDEBUG" +# ADD RSC /l 0x809 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib ws2_32.lib mswsock.lib /nologo /subsystem:windows /dll /out:"Release/mod_proxy_ftp.so" /base:@..\..\os\win32\BaseAddr.ref,mod_proxy_ftp.so +# ADD LINK32 kernel32.lib ws2_32.lib mswsock.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Release/mod_proxy_ftp.so" /base:@..\..\os\win32\BaseAddr.ref,mod_proxy_ftp.so /opt:ref + +!ELSEIF "$(CFG)" == "mod_proxy_ftp - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_proxy_ftp_src" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x809 /d "_DEBUG" +# ADD RSC /l 0x809 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib ws2_32.lib mswsock.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_proxy_ftp.so" /base:@..\..\os\win32\BaseAddr.ref,mod_proxy_ftp.so +# ADD LINK32 kernel32.lib ws2_32.lib mswsock.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_proxy_ftp.so" /base:@..\..\os\win32\BaseAddr.ref,mod_proxy_ftp.so + +!ENDIF + +# Begin Target + +# Name "mod_proxy_ftp - Win32 Release" +# Name "mod_proxy_ftp - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;hpj;bat;for;f90" +# Begin Source File + +SOURCE=.\proxy_ftp.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter ".h" +# Begin Source File + +SOURCE=.\mod_proxy.h +# End Source File +# End Group +# Begin Source File + +SOURCE=..\..\build\win32\win32ver.awk + +!IF "$(CFG)" == "mod_proxy_ftp - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_proxy_ftp.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_proxy_ftp.so "proxy_ftp_module for Apache" ../../include/ap_release.h > .\mod_proxy_ftp.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "mod_proxy_ftp - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_proxy_ftp.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_proxy_ftp.so "proxy_ftp_module for Apache" ../../include/ap_release.h > .\mod_proxy_ftp.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/modules/proxy/mod_proxy_http.dsp b/rubbos/app/httpd-2.0.64/modules/proxy/mod_proxy_http.dsp new file mode 100644 index 00000000..d8f29006 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/proxy/mod_proxy_http.dsp @@ -0,0 +1,136 @@ +# Microsoft Developer Studio Project File - Name="mod_proxy_http" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=mod_proxy_http - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "mod_proxy_http.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 "mod_proxy_http.mak" CFG="mod_proxy_http - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "mod_proxy_http - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_proxy_http - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "mod_proxy_http - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_proxy_http_src" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x809 /d "NDEBUG" +# ADD RSC /l 0x809 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib ws2_32.lib mswsock.lib /nologo /subsystem:windows /dll /out:"Release/mod_proxy_http.so" /base:@..\..\os\win32\BaseAddr.ref,mod_proxy_http.so +# ADD LINK32 kernel32.lib ws2_32.lib mswsock.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Release/mod_proxy_http.so" /base:@..\..\os\win32\BaseAddr.ref,mod_proxy_http.so /opt:ref + +!ELSEIF "$(CFG)" == "mod_proxy_http - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_proxy_http_src" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x809 /d "_DEBUG" +# ADD RSC /l 0x809 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib ws2_32.lib mswsock.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_proxy_http.so" /base:@..\..\os\win32\BaseAddr.ref,mod_proxy_http.so +# ADD LINK32 kernel32.lib ws2_32.lib mswsock.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_proxy_http.so" /base:@..\..\os\win32\BaseAddr.ref,mod_proxy_http.so + +!ENDIF + +# Begin Target + +# Name "mod_proxy_http - Win32 Release" +# Name "mod_proxy_http - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;hpj;bat;for;f90" +# Begin Source File + +SOURCE=.\proxy_http.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter ".h" +# Begin Source File + +SOURCE=.\mod_proxy.h +# End Source File +# End Group +# Begin Source File + +SOURCE=..\..\build\win32\win32ver.awk + +!IF "$(CFG)" == "mod_proxy_http - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_proxy_http.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_proxy_http.so "proxy_http_module for Apache" ../../include/ap_release.h > .\mod_proxy_http.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "mod_proxy_http - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_proxy_http.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_proxy_http.so "proxy_http_module for Apache" ../../include/ap_release.h > .\mod_proxy_http.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/modules/proxy/modules.mk b/rubbos/app/httpd-2.0.64/modules/proxy/modules.mk new file mode 100644 index 00000000..ceb52a1b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/proxy/modules.mk @@ -0,0 +1,3 @@ +DISTCLEAN_TARGETS = modules.mk +static = +shared = diff --git a/rubbos/app/httpd-2.0.64/modules/proxy/proxy_connect.c b/rubbos/app/httpd-2.0.64/modules/proxy/proxy_connect.c new file mode 100644 index 00000000..20e40ebb --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/proxy/proxy_connect.c @@ -0,0 +1,377 @@ +/* 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. + */ + +/* CONNECT method for Apache proxy */ + +#define CORE_PRIVATE + +#include "mod_proxy.h" +#include "apr_poll.h" + +module AP_MODULE_DECLARE_DATA proxy_connect_module; + +int ap_proxy_connect_canon(request_rec *r, char *url); +int ap_proxy_connect_handler(request_rec *r, proxy_server_conf *conf, + char *url, const char *proxyname, + apr_port_t proxyport); + +/* + * This handles Netscape CONNECT method secure proxy requests. + * A connection is opened to the specified host and data is + * passed through between the WWW site and the browser. + * + * This code is based on the INTERNET-DRAFT document + * "Tunneling SSL Through a WWW Proxy" currently at + * http://www.mcom.com/newsref/std/tunneling_ssl.html. + * + * If proxyhost and proxyport are set, we send a CONNECT to + * the specified proxy.. + * + * FIXME: this doesn't log the number of bytes sent, but + * that may be okay, since the data is supposed to + * be transparent. In fact, this doesn't log at all + * yet. 8^) + * FIXME: doesn't check any headers initally sent from the + * client. + * FIXME: should allow authentication, but hopefully the + * generic proxy authentication is good enough. + * FIXME: no check for r->assbackwards, whatever that is. + */ + +static int +allowed_port(proxy_server_conf *conf, int port) +{ + int i; + int *list = (int *) conf->allowed_connect_ports->elts; + + for(i = 0; i < conf->allowed_connect_ports->nelts; i++) { + if(port == list[i]) + return 1; + } + return 0; +} + +/* canonicalise CONNECT URLs. */ +int ap_proxy_connect_canon(request_rec *r, char *url) +{ + + if (r->method_number != M_CONNECT) { + return DECLINED; + } + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: CONNECT: canonicalising URL %s", url); + + return OK; +} + +/* CONNECT handler */ +int ap_proxy_connect_handler(request_rec *r, proxy_server_conf *conf, + char *url, const char *proxyname, + apr_port_t proxyport) +{ + apr_pool_t *p = r->pool; + apr_socket_t *sock; + apr_status_t err, rv; + apr_size_t i, o, nbytes; + char buffer[HUGE_STRING_LEN]; + apr_socket_t *client_socket = ap_get_module_config(r->connection->conn_config, &core_module); + int failed; + apr_pollfd_t *pollfd; + apr_int32_t pollcnt; + apr_int16_t pollevent; + apr_sockaddr_t *uri_addr, *connect_addr; + + apr_uri_t uri; + const char *connectname; + int connectport = 0; + + /* is this for us? */ + if (r->method_number != M_CONNECT) { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: CONNECT: declining URL %s", url); + return DECLINED; + } + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: CONNECT: serving URL %s", url); + + + /* + * Step One: Determine Who To Connect To + * + * Break up the URL to determine the host to connect to + */ + + /* we break the URL into host, port, uri */ + if (APR_SUCCESS != apr_uri_parse_hostinfo(p, url, &uri)) { + return ap_proxyerror(r, HTTP_BAD_REQUEST, + apr_pstrcat(p, "URI cannot be parsed: ", url, NULL)); + } + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: CONNECT: connecting %s to %s:%d", url, uri.hostname, uri.port); + + /* do a DNS lookup for the destination host */ + err = apr_sockaddr_info_get(&uri_addr, uri.hostname, APR_UNSPEC, uri.port, 0, p); + + /* are we connecting directly, or via a proxy? */ + if (proxyname) { + connectname = proxyname; + connectport = proxyport; + err = apr_sockaddr_info_get(&connect_addr, proxyname, APR_UNSPEC, proxyport, 0, p); + } + else { + connectname = uri.hostname; + connectport = uri.port; + connect_addr = uri_addr; + } + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: CONNECT: connecting to remote proxy %s on port %d", connectname, connectport); + + /* check if ProxyBlock directive on this host */ + if (OK != ap_proxy_checkproxyblock(r, conf, uri_addr)) { + return ap_proxyerror(r, HTTP_FORBIDDEN, + "Connect to remote machine blocked"); + } + + /* Check if it is an allowed port */ + if (conf->allowed_connect_ports->nelts == 0) { + /* Default setting if not overridden by AllowCONNECT */ + switch (uri.port) { + case APR_URI_HTTPS_DEFAULT_PORT: + case APR_URI_SNEWS_DEFAULT_PORT: + break; + default: + /* XXX can we call ap_proxyerror() here to get a nice log message? */ + return HTTP_FORBIDDEN; + } + } else if(!allowed_port(conf, uri.port)) { + /* XXX can we call ap_proxyerror() here to get a nice log message? */ + return HTTP_FORBIDDEN; + } + + /* + * Step Two: Make the Connection + * + * We have determined who to connect to. Now make the connection. + */ + + /* get all the possible IP addresses for the destname and loop through them + * until we get a successful connection + */ + if (APR_SUCCESS != err) { + return ap_proxyerror(r, HTTP_BAD_GATEWAY, apr_pstrcat(p, + "DNS lookup failure for: ", + connectname, NULL)); + } + + /* + * At this point we have a list of one or more IP addresses of + * the machine to connect to. If configured, reorder this + * list so that the "best candidate" is first try. "best + * candidate" could mean the least loaded server, the fastest + * responding server, whatever. + * + * For now we do nothing, ie we get DNS round robin. + * XXX FIXME + */ + failed = ap_proxy_connect_to_backend(&sock, "CONNECT", connect_addr, + connectname, conf, r->server, + r->pool); + + /* handle a permanent error from the above loop */ + if (failed) { + if (proxyname) { + return DECLINED; + } + else { + return HTTP_BAD_GATEWAY; + } + } + + /* + * Step Three: Send the Request + * + * Send the HTTP/1.1 CONNECT request to the remote server + */ + + /* we are acting as a tunnel - the output filter stack should + * be completely empty, because when we are done here we are done completely. + * We add the NULL filter to the stack to do this... + */ + r->output_filters = NULL; + r->connection->output_filters = NULL; + + + /* If we are connecting through a remote proxy, we need to pass + * the CONNECT request on to it. + */ + if (proxyport) { + /* FIXME: Error checking ignored. + */ + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: CONNECT: sending the CONNECT request to the remote proxy"); + nbytes = apr_snprintf(buffer, sizeof(buffer), + "CONNECT %s HTTP/1.0" CRLF, r->uri); + apr_send(sock, buffer, &nbytes); + nbytes = apr_snprintf(buffer, sizeof(buffer), + "Proxy-agent: %s" CRLF CRLF, ap_get_server_version()); + apr_send(sock, buffer, &nbytes); + } + else { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: CONNECT: Returning 200 OK Status"); + nbytes = apr_snprintf(buffer, sizeof(buffer), + "HTTP/1.0 200 Connection Established" CRLF); + ap_xlate_proto_to_ascii(buffer, nbytes); + apr_send(client_socket, buffer, &nbytes); + nbytes = apr_snprintf(buffer, sizeof(buffer), + "Proxy-agent: %s" CRLF CRLF, ap_get_server_version()); + ap_xlate_proto_to_ascii(buffer, nbytes); + apr_send(client_socket, buffer, &nbytes); +#if 0 + /* This is safer code, but it doesn't work yet. I'm leaving it + * here so that I can fix it later. + */ + r->status = HTTP_OK; + r->header_only = 1; + apr_table_set(r->headers_out, "Proxy-agent: %s", ap_get_server_version()); + ap_rflush(r); +#endif + } + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: CONNECT: setting up poll()"); + + /* + * Step Four: Handle Data Transfer + * + * Handle two way transfer of data over the socket (this is a tunnel). + */ + +/* r->sent_bodyct = 1;*/ + + if((rv = apr_poll_setup(&pollfd, 2, r->pool)) != APR_SUCCESS) + { + apr_socket_close(sock); + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + "proxy: CONNECT: error apr_poll_setup()"); + return HTTP_INTERNAL_SERVER_ERROR; + } + + /* Add client side to the poll */ + apr_poll_socket_add(pollfd, client_socket, APR_POLLIN); + + /* Add the server side to the poll */ + apr_poll_socket_add(pollfd, sock, APR_POLLIN); + + while (1) { /* Infinite loop until error (one side closes the connection) */ +/* ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, "proxy: CONNECT: going to sleep (poll)");*/ + if ((rv = apr_poll(pollfd, 2, &pollcnt, -1)) != APR_SUCCESS) + { + apr_socket_close(sock); + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, "proxy: CONNECT: error apr_poll()"); + return HTTP_INTERNAL_SERVER_ERROR; + } +/* ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: CONNECT: woke from select(), i=%d", pollcnt);*/ + + if (pollcnt) { + apr_poll_revents_get(&pollevent, sock, pollfd); + if (pollevent & APR_POLLIN) { +/* ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: CONNECT: sock was set");*/ + nbytes = sizeof(buffer); + if (apr_recv(sock, buffer, &nbytes) == APR_SUCCESS) { + o = 0; + i = nbytes; + while(i > 0) + { + nbytes = i; + /* This is just plain wrong. No module should ever write directly + * to the client. For now, this works, but this is high on my list of + * things to fix. The correct line is: + * if ((nbytes = ap_rwrite(buffer + o, nbytes, r)) < 0) + * rbb + */ + if (apr_send(client_socket, buffer + o, &nbytes) != APR_SUCCESS) + break; + o += nbytes; + i -= nbytes; + } + } + else + break; + } + else if ((pollevent & APR_POLLERR) || (pollevent & APR_POLLHUP)) + break; + + + apr_poll_revents_get(&pollevent, client_socket, pollfd); + if (pollevent & APR_POLLIN) { +/* ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: CONNECT: client was set");*/ + nbytes = sizeof(buffer); + if (apr_recv(client_socket, buffer, &nbytes) == APR_SUCCESS) { + o = 0; + i = nbytes; + while(i > 0) + { + nbytes = i; + if (apr_send(sock, buffer + o, &nbytes) != APR_SUCCESS) + break; + o += nbytes; + i -= nbytes; + } + } + else + break; + } + else if ((pollevent & APR_POLLERR) || (pollevent & APR_POLLHUP)) + break; + } + else + break; + } + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: CONNECT: finished with poll() - cleaning up"); + + /* + * Step Five: Clean Up + * + * Close the socket and clean up + */ + + apr_socket_close(sock); + + return OK; +} + +static void ap_proxy_connect_register_hook(apr_pool_t *p) +{ + proxy_hook_scheme_handler(ap_proxy_connect_handler, NULL, NULL, APR_HOOK_MIDDLE); + proxy_hook_canon_handler(ap_proxy_connect_canon, NULL, NULL, APR_HOOK_MIDDLE); +} + +module AP_MODULE_DECLARE_DATA proxy_connect_module = { + STANDARD20_MODULE_STUFF, + NULL, /* create per-directory config structure */ + NULL, /* merge per-directory config structures */ + NULL, /* create per-server config structure */ + NULL, /* merge per-server config structures */ + NULL, /* command apr_table_t */ + ap_proxy_connect_register_hook /* register hooks */ +}; diff --git a/rubbos/app/httpd-2.0.64/modules/proxy/proxy_ftp.c b/rubbos/app/httpd-2.0.64/modules/proxy/proxy_ftp.c new file mode 100644 index 00000000..cbbf23c9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/proxy/proxy_ftp.c @@ -0,0 +1,1936 @@ +/* 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. + */ + +/* FTP routines for Apache proxy */ + +#include "mod_proxy.h" +#if APR_HAVE_TIME_H +#include <time.h> +#endif + +#define AUTODETECT_PWD +/* Automatic timestamping (Last-Modified header) based on MDTM is used if: + * 1) the FTP server supports the MDTM command and + * 2) HAVE_TIMEGM (preferred) or HAVE_GMTOFF is available at compile time + */ +#define USE_MDTM + + +module AP_MODULE_DECLARE_DATA proxy_ftp_module; + +int ap_proxy_ftp_canon(request_rec *r, char *url); +int ap_proxy_ftp_handler(request_rec *r, proxy_server_conf *conf, + char *url, const char *proxyhost, + apr_port_t proxyport); +apr_status_t ap_proxy_send_dir_filter(ap_filter_t * f, + apr_bucket_brigade *bb); + + +/* + * Decodes a '%' escaped string, and returns the number of characters + */ +static int decodeenc(char *x) +{ + int i, j, ch; + + if (x[0] == '\0') + return 0; /* special case for no characters */ + for (i = 0, j = 0; x[i] != '\0'; i++, j++) { + /* decode it if not already done */ + ch = x[i]; + if (ch == '%' && apr_isxdigit(x[i + 1]) && apr_isxdigit(x[i + 2])) { + ch = ap_proxy_hex2c(&x[i + 1]); + i += 2; + } + x[j] = ch; + } + x[j] = '\0'; + return j; +} + +/* + * Escape the globbing characters in a path used as argument to + * the FTP commands (SIZE, CWD, RETR, MDTM, ...). + * ftpd assumes '\\' as a quoting character to escape special characters. + * Returns: escaped string + */ +#define FTP_GLOBBING_CHARS "*?[{~" +static char *ftp_escape_globbingchars(apr_pool_t *p, const char *path) +{ + char *ret = apr_palloc(p, 2*strlen(path)+sizeof("")); + char *d; + for (d = ret; *path; ++path) { + if (strchr(FTP_GLOBBING_CHARS, *path) != NULL) + *d++ = '\\'; + *d++ = *path; + } + *d = '\0'; + return ret; +} + +/* + * Check for globbing characters in a path used as argument to + * the FTP commands (SIZE, CWD, RETR, MDTM, ...). + * ftpd assumes '\\' as a quoting character to escape special characters. + * Returns: 0 (no globbing chars, or all globbing chars escaped), 1 (globbing chars) + */ +static int ftp_check_globbingchars(const char *path) +{ + for ( ; *path; ++path) { + if (*path == '\\') + ++path; + if (*path != '\0' && strchr(FTP_GLOBBING_CHARS, *path) != NULL) + return TRUE; + } + return FALSE; +} + +/* + * checks an encoded ftp string for bad characters, namely, CR, LF or + * non-ascii character + */ +static int ftp_check_string(const char *x) +{ + int i, ch = 0; +#if APR_CHARSET_EBCDIC + char buf[1]; +#endif + + for (i = 0; x[i] != '\0'; i++) { + ch = x[i]; + if (ch == '%' && apr_isxdigit(x[i + 1]) && apr_isxdigit(x[i + 2])) { + ch = ap_proxy_hex2c(&x[i + 1]); + i += 2; + } +#if !APR_CHARSET_EBCDIC + if (ch == '\015' || ch == '\012' || (ch & 0x80)) +#else /* APR_CHARSET_EBCDIC */ + if (ch == '\r' || ch == '\n') + return 0; + buf[0] = ch; + ap_xlate_proto_to_ascii(buf, 1); + if (buf[0] & 0x80) +#endif /* APR_CHARSET_EBCDIC */ + return 0; + } + return 1; +} + +/* + * Canonicalise ftp URLs. + */ +int ap_proxy_ftp_canon(request_rec *r, char *url) +{ + char *user, *password, *host, *path, *parms, *strp, sport[7]; + apr_pool_t *p = r->pool; + const char *err; + apr_port_t port, def_port; + + /* */ + if (strncasecmp(url, "ftp:", 4) == 0) { + url += 4; + } + else { + return DECLINED; + } + def_port = apr_uri_port_of_scheme("ftp"); + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: FTP: canonicalising URL %s", url); + + port = def_port; + err = ap_proxy_canon_netloc(p, &url, &user, &password, &host, &port); + if (err) + return HTTP_BAD_REQUEST; + if (user != NULL && !ftp_check_string(user)) + return HTTP_BAD_REQUEST; + if (password != NULL && !ftp_check_string(password)) + return HTTP_BAD_REQUEST; + + /* now parse path/parameters args, according to rfc1738 */ + /* + * N.B. if this isn't a true proxy request, then the URL path (but not + * query args) has already been decoded. This gives rise to the problem + * of a ; being decoded into the path. + */ + strp = strchr(url, ';'); + if (strp != NULL) { + *(strp++) = '\0'; + parms = ap_proxy_canonenc(p, strp, strlen(strp), enc_parm, + r->proxyreq); + if (parms == NULL) + return HTTP_BAD_REQUEST; + } + else + parms = ""; + + path = ap_proxy_canonenc(p, url, strlen(url), enc_path, r->proxyreq); + if (path == NULL) + return HTTP_BAD_REQUEST; + if (!ftp_check_string(path)) + return HTTP_BAD_REQUEST; + + if (r->proxyreq && r->args != NULL) { + if (strp != NULL) { + strp = ap_proxy_canonenc(p, r->args, strlen(r->args), enc_parm, 1); + if (strp == NULL) + return HTTP_BAD_REQUEST; + parms = apr_pstrcat(p, parms, "?", strp, NULL); + } + else { + strp = ap_proxy_canonenc(p, r->args, strlen(r->args), enc_fpath, 1); + if (strp == NULL) + return HTTP_BAD_REQUEST; + path = apr_pstrcat(p, path, "?", strp, NULL); + } + r->args = NULL; + } + +/* now, rebuild URL */ + + if (port != def_port) + apr_snprintf(sport, sizeof(sport), ":%d", port); + else + sport[0] = '\0'; + + if (ap_strchr_c(host, ':')) { /* if literal IPv6 address */ + host = apr_pstrcat(p, "[", host, "]", NULL); + } + r->filename = apr_pstrcat(p, "proxy:ftp://", (user != NULL) ? user : "", + (password != NULL) ? ":" : "", + (password != NULL) ? password : "", + (user != NULL) ? "@" : "", host, sport, "/", path, + (parms[0] != '\0') ? ";" : "", parms, NULL); + + return OK; +} + +/* we chop lines longer than 80 characters */ +#define MAX_LINE_LEN 80 + +/* + * Reads response lines, returns both the ftp status code and + * remembers the response message in the supplied buffer + */ +static int ftp_getrc_msg(conn_rec *ftp_ctrl, apr_bucket_brigade *bb, char *msgbuf, int msglen) +{ + int status; + char response[MAX_LINE_LEN]; + char buff[5]; + char *mb = msgbuf, *me = &msgbuf[msglen]; + apr_status_t rv; + int eos; + + if (APR_SUCCESS != (rv = ap_proxy_string_read(ftp_ctrl, bb, response, sizeof(response), &eos))) { + return -1; + } +/* + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, NULL, + "proxy: <FTP: %s", response); +*/ + if (!apr_isdigit(response[0]) || !apr_isdigit(response[1]) || + !apr_isdigit(response[2]) || (response[3] != ' ' && response[3] != '-')) + status = 0; + else + status = 100 * response[0] + 10 * response[1] + response[2] - 111 * '0'; + + mb = apr_cpystrn(mb, response + 4, me - mb); + + if (response[3] == '-') { + memcpy(buff, response, 3); + buff[3] = ' '; + do { + if (APR_SUCCESS != (rv = ap_proxy_string_read(ftp_ctrl, bb, response, sizeof(response), &eos))) { + return -1; + } + mb = apr_cpystrn(mb, response + (' ' == response[0] ? 1 : 4), me - mb); + } while (memcmp(response, buff, 4) != 0); + } + + return status; +} + +/* this is a filter that turns a raw ASCII directory listing into pretty HTML */ + +/* ideally, mod_proxy should simply send the raw directory list up the filter + * stack to mod_autoindex, which in theory should turn the raw ascii into + * pretty html along with all the bells and whistles it provides... + * + * all in good time...! :) + */ + +typedef struct { + apr_bucket_brigade *in; + char buffer[MAX_STRING_LEN]; + enum { + HEADER, BODY, FOOTER + } state; +} proxy_dir_ctx_t; + +/* fallback regex for ls -s1; ($0..$2) == 3 */ +#define LS_REG_PATTERN "^ *([0-9]+) +([^ ]+)$" +#define LS_REG_MATCH 3 + +apr_status_t ap_proxy_send_dir_filter(ap_filter_t *f, apr_bucket_brigade *in) +{ + request_rec *r = f->r; + conn_rec *c = r->connection; + apr_pool_t *p = r->pool; + apr_bucket_brigade *out = apr_brigade_create(p, c->bucket_alloc); + apr_status_t rv; + + register int n; + char *dir, *path, *reldir, *site, *str, *type; + + const char *pwd = apr_table_get(r->notes, "Directory-PWD"); + const char *readme = apr_table_get(r->notes, "Directory-README"); + + proxy_dir_ctx_t *ctx = f->ctx; + + if (!ctx) { + f->ctx = ctx = apr_pcalloc(p, sizeof(*ctx)); + ctx->in = apr_brigade_create(p, c->bucket_alloc); + ctx->buffer[0] = 0; + ctx->state = HEADER; + } + + /* combine the stored and the new */ + APR_BRIGADE_CONCAT(ctx->in, in); + + if (HEADER == ctx->state) { + + /* basedir is either "", or "/%2f" for the "squid %2f hack" */ + const char *basedir = ""; /* By default, path is relative to the $HOME dir */ + char *wildcard = NULL; + + /* Save "scheme://site" prefix without password */ + site = apr_uri_unparse(p, &f->r->parsed_uri, APR_URI_UNP_OMITPASSWORD | APR_URI_UNP_OMITPATHINFO); + /* ... and path without query args */ + path = apr_uri_unparse(p, &f->r->parsed_uri, APR_URI_UNP_OMITSITEPART | APR_URI_UNP_OMITQUERY); + + /* If path began with /%2f, change the basedir */ + if (strncasecmp(path, "/%2f", 4) == 0) { + basedir = "/%2f"; + } + + /* Strip off a type qualifier. It is ignored for dir listings */ + if ((type = strstr(path, ";type=")) != NULL) + *type++ = '\0'; + + (void)decodeenc(path); + + while (path[1] == '/') /* collapse multiple leading slashes to one */ + ++path; + + reldir = strrchr(path, '/'); + if (reldir != NULL && ftp_check_globbingchars(reldir)) { + wildcard = &reldir[1]; + reldir[0] = '\0'; /* strip off the wildcard suffix */ + } + + /* Copy path, strip (all except the last) trailing slashes */ + /* (the trailing slash is needed for the dir component loop below) */ + path = dir = apr_pstrcat(p, path, "/", NULL); + for (n = strlen(path); n > 1 && path[n - 1] == '/' && path[n - 2] == '/'; --n) + path[n - 1] = '\0'; + + /* Add a link to the root directory (if %2f hack was used) */ + str = (basedir[0] != '\0') ? "<a href=\"/%2f/\">%2f</a>/" : ""; + + /* print "ftp://host/" */ + str = apr_psprintf(p, DOCTYPE_HTML_3_2 + "<html>\n <head>\n <title>%s%s%s\n" + " \n" + " \n

    Directory of " + "%s/%s", + site, basedir, ap_escape_html(p, path), + site, str); + + APR_BRIGADE_INSERT_TAIL(out, apr_bucket_pool_create(str, strlen(str), + p, c->bucket_alloc)); + + for (dir = path+1; (dir = strchr(dir, '/')) != NULL; ) + { + *dir = '\0'; + if ((reldir = strrchr(path+1, '/'))==NULL) { + reldir = path+1; + } + else + ++reldir; + /* print "path/" component */ + str = apr_psprintf(p, "%s/", basedir, + ap_escape_uri(p, path), + ap_escape_html(p, reldir)); + *dir = '/'; + while (*dir == '/') + ++dir; + APR_BRIGADE_INSERT_TAIL(out, apr_bucket_pool_create(str, + strlen(str), p, + c->bucket_alloc)); + } + if (wildcard != NULL) { + wildcard = ap_escape_html(p, wildcard); + APR_BRIGADE_INSERT_TAIL(out, apr_bucket_pool_create(wildcard, + strlen(wildcard), p, + c->bucket_alloc)); + } + + /* If the caller has determined the current directory, and it differs */ + /* from what the client requested, then show the real name */ + if (pwd == NULL || strncmp(pwd, path, strlen(pwd)) == 0) { + str = apr_psprintf(p, "

    \n\n
    \n\n
    ");
    +        }
    +        else {
    +            str = apr_psprintf(p, "\n\n(%s)\n\n  
    \n\n
    ",
    +                               ap_escape_html(p, pwd));
    +        }
    +        APR_BRIGADE_INSERT_TAIL(out, apr_bucket_pool_create(str, strlen(str),
    +                                                           p, c->bucket_alloc));
    +
    +        /* print README */
    +        if (readme) {
    +            str = apr_psprintf(p, "%s\n
    \n\n
    \n\n
    \n",
    +                               ap_escape_html(p, readme));
    +
    +            APR_BRIGADE_INSERT_TAIL(out, apr_bucket_pool_create(str,
    +                                                           strlen(str), p,
    +                                                           c->bucket_alloc));
    +        }
    +
    +        /* make sure page intro gets sent out */
    +        APR_BRIGADE_INSERT_TAIL(out, apr_bucket_flush_create(c->bucket_alloc));
    +        if (APR_SUCCESS != (rv = ap_pass_brigade(f->next, out))) {
    +            return rv;
    +        }
    +        apr_brigade_cleanup(out);
    +
    +        ctx->state = BODY;
    +    }
    +
    +    /* loop through each line of directory */
    +    while (BODY == ctx->state) {
    +        char *filename;
    +        int found = 0;
    +        int eos = 0;
    +
    +        regex_t *re = NULL;
    +        regmatch_t re_result[LS_REG_MATCH];
    +
    +        /* Compile the output format of "ls -s1" as a fallback for non-unix ftp listings */
    +        re = ap_pregcomp(p, LS_REG_PATTERN, REG_EXTENDED);
    +        ap_assert(re != NULL);
    +
    +        /* get a complete line */
    +        /* if the buffer overruns - throw data away */
    +        while (!found && !APR_BRIGADE_EMPTY(ctx->in)) {
    +            char *pos, *response;
    +            apr_size_t len, max;
    +            apr_bucket *e;
    +
    +            e = APR_BRIGADE_FIRST(ctx->in);
    +            if (APR_BUCKET_IS_EOS(e)) {
    +                eos = 1;
    +                break;
    +            }
    +            if (APR_SUCCESS != (rv = apr_bucket_read(e, (const char **)&response, &len, APR_BLOCK_READ))) {
    +                return rv;
    +            }
    +            pos = memchr(response, APR_ASCII_LF, len);
    +            if (pos != NULL) {
    +                if ((response + len) != (pos + 1)) {
    +                    len = pos - response + 1;
    +                    apr_bucket_split(e, pos - response + 1);
    +                }
    +                found = 1;
    +            }
    +            max = sizeof(ctx->buffer) - strlen(ctx->buffer) - 1;
    +            if (len > max) {
    +                len = max;
    +            }
    +
    +            /* len+1 to leave space for the trailing nil char */
    +            apr_cpystrn(ctx->buffer+strlen(ctx->buffer), response, len+1);
    +
    +            APR_BUCKET_REMOVE(e);
    +            apr_bucket_destroy(e);
    +        }
    +
    +        /* EOS? jump to footer */
    +        if (eos) {
    +            ctx->state = FOOTER;
    +            break;
    +        }
    +
    +        /* not complete? leave and try get some more */
    +        if (!found) {
    +            return APR_SUCCESS;
    +        }
    +
    +        {
    +            apr_size_t n = strlen(ctx->buffer);
    +            if (ctx->buffer[n-1] == CRLF[1])  /* strip trailing '\n' */
    +                ctx->buffer[--n] = '\0';
    +            if (ctx->buffer[n-1] == CRLF[0])  /* strip trailing '\r' if present */
    +                ctx->buffer[--n] = '\0';
    +        }
    +
    +        /* a symlink? */
    +        if (ctx->buffer[0] == 'l' && (filename = strstr(ctx->buffer, " -> ")) != NULL) {
    +            char *link_ptr = filename;
    +
    +            do {
    +                filename--;
    +            } while (filename[0] != ' ' && filename > ctx->buffer);
    +            if (filename > ctx->buffer)
    +                *(filename++) = '\0';
    +            *(link_ptr++) = '\0';
    +            str = apr_psprintf(p, "%s %s %s\n",
    +                               ap_escape_html(p, ctx->buffer),
    +                               ap_escape_uri(p, filename),
    +                               ap_escape_html(p, filename),
    +                               ap_escape_html(p, link_ptr));
    +        }
    +
    +        /* a directory/file? */
    +        else if (ctx->buffer[0] == 'd' || ctx->buffer[0] == '-' || ctx->buffer[0] == 'l' || apr_isdigit(ctx->buffer[0])) {
    +            int searchidx = 0;
    +            char *searchptr = NULL;
    +            int firstfile = 1;
    +            if (apr_isdigit(ctx->buffer[0])) {  /* handle DOS dir */
    +                searchptr = strchr(ctx->buffer, '<');
    +                if (searchptr != NULL)
    +                    *searchptr = '[';
    +                searchptr = strchr(ctx->buffer, '>');
    +                if (searchptr != NULL)
    +                    *searchptr = ']';
    +            }
    +
    +            filename = strrchr(ctx->buffer, ' ');
    +            *(filename++) = '\0';
    +
    +            /* handle filenames with spaces in 'em */
    +            if (!strcmp(filename, ".") || !strcmp(filename, "..") || firstfile) {
    +                firstfile = 0;
    +                searchidx = filename - ctx->buffer;
    +            }
    +            else if (searchidx != 0 && ctx->buffer[searchidx] != 0) {
    +                *(--filename) = ' ';
    +                ctx->buffer[searchidx - 1] = '\0';
    +                filename = &ctx->buffer[searchidx];
    +            }
    +
    +            /* Append a slash to the HREF link for directories */
    +            if (!strcmp(filename, ".") || !strcmp(filename, "..") || ctx->buffer[0] == 'd') {
    +                str = apr_psprintf(p, "%s %s\n",
    +                                   ap_escape_html(p, ctx->buffer),
    +                                   ap_escape_uri(p, filename),
    +                                   ap_escape_html(p, filename));
    +            }
    +            else {
    +                str = apr_psprintf(p, "%s %s\n",
    +                                   ap_escape_html(p, ctx->buffer),
    +                                   ap_escape_uri(p, filename),
    +                                   ap_escape_html(p, filename));
    +            }
    +        }
    +        /* Try a fallback for listings in the format of "ls -s1" */
    +        else if (0 == ap_regexec(re, ctx->buffer, LS_REG_MATCH, re_result, 0)) {
    +
    +            filename = apr_pstrndup(p, &ctx->buffer[re_result[2].rm_so], re_result[2].rm_eo - re_result[2].rm_so);
    +
    +            str = apr_pstrcat(p, ap_escape_html(p, apr_pstrndup(p, ctx->buffer, re_result[2].rm_so)),
    +                              "",
    +                              ap_escape_html(p, filename), "\n", NULL);
    +        }
    +        else {
    +            strcat(ctx->buffer, "\n"); /* re-append the newline */
    +            str = ap_escape_html(p, ctx->buffer);
    +        }
    +
    +        /* erase buffer for next time around */
    +        ctx->buffer[0] = 0;
    +
    +        APR_BRIGADE_INSERT_TAIL(out, apr_bucket_pool_create(str, strlen(str), p,
    +                                                            c->bucket_alloc));
    +        APR_BRIGADE_INSERT_TAIL(out, apr_bucket_flush_create(c->bucket_alloc));
    +        if (APR_SUCCESS != (rv = ap_pass_brigade(f->next, out))) {
    +            return rv;
    +        }
    +        apr_brigade_cleanup(out);
    +
    +    }
    +
    +    if (FOOTER == ctx->state) {
    +        str = apr_psprintf(p, "
    \n\n
    \n\n %s\n\n \n\n", ap_psignature("", r)); + APR_BRIGADE_INSERT_TAIL(out, apr_bucket_pool_create(str, strlen(str), p, + c->bucket_alloc)); + APR_BRIGADE_INSERT_TAIL(out, apr_bucket_flush_create(c->bucket_alloc)); + APR_BRIGADE_INSERT_TAIL(out, apr_bucket_eos_create(c->bucket_alloc)); + if (APR_SUCCESS != (rv = ap_pass_brigade(f->next, out))) { + return rv; + } + apr_brigade_destroy(out); + } + + return APR_SUCCESS; +} + +/* Parse EPSV reply and return port, or zero on error. */ +static apr_port_t parse_epsv_reply(const char *reply) +{ + const char *p; + char *ep; + long port; + + /* Reply syntax per RFC 2428: "229 blah blah (|||port|)" where '|' + * can be any character in ASCII from 33-126, obscurely. Verify + * the syntax. */ + p = ap_strchr_c(reply, '('); + if (p == NULL || !p[1] || p[1] != p[2] || p[1] != p[3] + || p[4] == p[1]) { + return 0; + } + + errno = 0; + port = strtol(p + 4, &ep, 10); + if (errno || port < 1 || port > 65535 || ep[0] != p[1] || ep[1] != ')') { + return 0; + } + + return (apr_port_t)port; +} + +/* + * Generic "send FTP command to server" routine, using the control socket. + * Returns the FTP returncode (3 digit code) + * Allows for tracing the FTP protocol (in LogLevel debug) + */ +static int +proxy_ftp_command(const char *cmd, request_rec *r, conn_rec *ftp_ctrl, + apr_bucket_brigade *bb, char **pmessage) +{ + char *crlf; + int rc; + char message[HUGE_STRING_LEN]; + + /* If cmd == NULL, we retrieve the next ftp response line */ + if (cmd != NULL) { + conn_rec *c = r->connection; + APR_BRIGADE_INSERT_TAIL(bb, apr_bucket_pool_create(cmd, strlen(cmd), r->pool, c->bucket_alloc)); + APR_BRIGADE_INSERT_TAIL(bb, apr_bucket_flush_create(c->bucket_alloc)); + ap_pass_brigade(ftp_ctrl->output_filters, bb); + + /* strip off the CRLF for logging */ + apr_cpystrn(message, cmd, sizeof(message)); + if ((crlf = strchr(message, '\r')) != NULL || + (crlf = strchr(message, '\n')) != NULL) + *crlf = '\0'; + if (strncmp(message,"PASS ", 5) == 0) + strcpy(&message[5], "****"); + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy:>FTP: %s", message); + } + + rc = ftp_getrc_msg(ftp_ctrl, bb, message, sizeof message); + if (rc == -1 || rc == 421) + strcpy(message,""); + if ((crlf = strchr(message, '\r')) != NULL || + (crlf = strchr(message, '\n')) != NULL) + *crlf = '\0'; + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy:pool, message); + + return rc; +} + +/* Set ftp server to TYPE {A,I,E} before transfer of a directory or file */ +static int ftp_set_TYPE(char xfer_type, request_rec *r, conn_rec *ftp_ctrl, + apr_bucket_brigade *bb, char **pmessage) +{ + char old_type[2] = { 'A', '\0' }; /* After logon, mode is ASCII */ + int ret = HTTP_OK; + int rc; + + /* set desired type */ + old_type[0] = xfer_type; + + rc = proxy_ftp_command(apr_pstrcat(r->pool, "TYPE ", old_type, CRLF, NULL), + r, ftp_ctrl, bb, pmessage); +/* responses: 200, 421, 500, 501, 504, 530 */ + /* 200 Command okay. */ + /* 421 Service not available, closing control connection. */ + /* 500 Syntax error, command unrecognized. */ + /* 501 Syntax error in parameters or arguments. */ + /* 504 Command not implemented for that parameter. */ + /* 530 Not logged in. */ + if (rc == -1 || rc == 421) { + ret = ap_proxyerror(r, HTTP_BAD_GATEWAY, + "Error reading from remote server"); + } + else if (rc != 200 && rc != 504) { + ret = ap_proxyerror(r, HTTP_BAD_GATEWAY, + "Unable to set transfer type"); + } +/* Allow not implemented */ + else if (rc == 504) + /* ignore it silently */; + + return ret; +} + + +/* Return the current directory which we have selected on the FTP server, or NULL */ +static char *ftp_get_PWD(request_rec *r, conn_rec *ftp_ctrl, apr_bucket_brigade *bb) +{ + char *cwd = NULL; + char *ftpmessage = NULL; + + /* responses: 257, 500, 501, 502, 421, 550 */ + /* 257 "" */ + /* 421 Service not available, closing control connection. */ + /* 500 Syntax error, command unrecognized. */ + /* 501 Syntax error in parameters or arguments. */ + /* 502 Command not implemented. */ + /* 550 Requested action not taken. */ + switch (proxy_ftp_command("PWD" CRLF, r, ftp_ctrl, bb, &ftpmessage)) { + case -1: + case 421: + case 550: + ap_proxyerror(r, HTTP_BAD_GATEWAY, + "Failed to read PWD on ftp server"); + break; + + case 257: { + const char *dirp = ftpmessage; + cwd = ap_getword_conf(r->pool, &dirp); + } + } + return cwd; +} + + +/* Common routine for failed authorization (i.e., missing or wrong password) + * to an ftp service. This causes most browsers to retry the request + * with username and password (which was presumably queried from the user) + * supplied in the Authorization: header. + * Note that we "invent" a realm name which consists of the + * ftp://user@host part of the reqest (sans password -if supplied but invalid-) + */ +static int ftp_unauthorized(request_rec *r, int log_it) +{ + r->proxyreq = PROXYREQ_NONE; + /* + * Log failed requests if they supplied a password (log username/password + * guessing attempts) + */ + if (log_it) + ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r, + "proxy: missing or failed auth to %s", + apr_uri_unparse(r->pool, + &r->parsed_uri, APR_URI_UNP_OMITPATHINFO)); + + apr_table_setn(r->err_headers_out, "WWW-Authenticate", + apr_pstrcat(r->pool, "Basic realm=\"", + apr_uri_unparse(r->pool, &r->parsed_uri, + APR_URI_UNP_OMITPASSWORD | APR_URI_UNP_OMITPATHINFO), + "\"", NULL)); + + return HTTP_UNAUTHORIZED; +} + + +/* + * Handles direct access of ftp:// URLs + * Original (Non-PASV) version from + * Troy Morrison + * PASV added by Chuck + * Filters by [Graham Leggett ] + */ +int ap_proxy_ftp_handler(request_rec *r, proxy_server_conf *conf, + char *url, const char *proxyhost, + apr_port_t proxyport) +{ + apr_pool_t *p = r->pool; + conn_rec *c = r->connection; + proxy_conn_rec *backend; + apr_socket_t *sock, *local_sock, *data_sock = NULL; + apr_sockaddr_t *connect_addr; + apr_status_t rv; + conn_rec *origin, *data = NULL; + int err; + apr_bucket_brigade *bb = apr_brigade_create(p, c->bucket_alloc); + char *buf, *connectname; + apr_port_t connectport; + char buffer[MAX_STRING_LEN]; + char *ftpmessage = NULL; + char *path, *strp, *type_suffix, *cwd = NULL; + apr_uri_t uri; + char *user = NULL; +/* char *account = NULL; how to supply an account in a URL? */ + const char *password = NULL; + int len, rc; + int one = 1; + char *size = NULL; + apr_socket_t *origin_sock = NULL; + char xfer_type = 'A'; /* after ftp login, the default is ASCII */ + int dirlisting = 0; +#if defined(USE_MDTM) && (defined(HAVE_TIMEGM) || defined(HAVE_GMTOFF)) + apr_time_t mtime = 0L; +#endif + + /* stuff for PASV mode */ + int connect = 0, use_port = 0; + char dates[APR_RFC822_DATE_LEN]; + + /* is this for us? */ + if (proxyhost) { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: FTP: declining URL %s - proxyhost %s specified:", url, proxyhost); + return DECLINED; /* proxy connections are via HTTP */ + } + if (strncasecmp(url, "ftp:", 4)) { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: FTP: declining URL %s - not ftp:", url); + return DECLINED; /* only interested in FTP */ + } + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: FTP: serving URL %s", url); + + /* create space for state information */ + backend = (proxy_conn_rec *) ap_get_module_config(c->conn_config, &proxy_ftp_module); + if (!backend) { + backend = apr_pcalloc(c->pool, sizeof(proxy_conn_rec)); + backend->connection = NULL; + backend->hostname = NULL; + backend->port = 0; + ap_set_module_config(c->conn_config, &proxy_ftp_module, backend); + } + if (backend->connection) + origin_sock = ap_get_module_config(backend->connection->conn_config, &core_module); + + + /* + * I: Who Do I Connect To? ----------------------- + * + * Break up the URL to determine the host to connect to + */ + + /* we only support GET and HEAD */ + if (r->method_number != M_GET) + return HTTP_NOT_IMPLEMENTED; + + /* We break the URL into host, port, path-search */ + if (r->parsed_uri.hostname == NULL) { + if (APR_SUCCESS != apr_uri_parse(p, url, &uri)) { + return ap_proxyerror(r, HTTP_BAD_REQUEST, + apr_psprintf(p, "URI cannot be parsed: %s", url)); + } + connectname = uri.hostname; + connectport = uri.port; + path = apr_pstrdup(p, uri.path); + } + else { + connectname = r->parsed_uri.hostname; + connectport = r->parsed_uri.port; + path = apr_pstrdup(p, r->parsed_uri.path); + } + if (connectport == 0) { + connectport = apr_uri_port_of_scheme("ftp"); + } + path = (path != NULL && path[0] != '\0') ? &path[1] : ""; + + type_suffix = strchr(path, ';'); + if (type_suffix != NULL) + *(type_suffix++) = '\0'; + + if (type_suffix != NULL && strncmp(type_suffix, "type=", 5) == 0 + && apr_isalpha(type_suffix[5])) { + /* "type=d" forces a dir listing. + * The other types (i|a|e) are directly used for the ftp TYPE command + */ + if ( ! (dirlisting = (apr_tolower(type_suffix[5]) == 'd'))) + xfer_type = apr_toupper(type_suffix[5]); + + /* Check valid types, rather than ignoring invalid types silently: */ + if (strchr("AEI", xfer_type) == NULL) + return ap_proxyerror(r, HTTP_BAD_REQUEST, apr_pstrcat(r->pool, + "ftp proxy supports only types 'a', 'i', or 'e': \"", + type_suffix, "\" is invalid.", NULL)); + } + else { + /* make binary transfers the default */ + xfer_type = 'I'; + } + + + /* + * The "Authorization:" header must be checked first. We allow the user + * to "override" the URL-coded user [ & password ] in the Browsers' + * User&Password Dialog. NOTE that this is only marginally more secure + * than having the password travel in plain as part of the URL, because + * Basic Auth simply uuencodes the plain text password. But chances are + * still smaller that the URL is logged regularly. + */ + if ((password = apr_table_get(r->headers_in, "Authorization")) != NULL + && strcasecmp(ap_getword(r->pool, &password, ' '), "Basic") == 0 + && (password = ap_pbase64decode(r->pool, password))[0] != ':') { + /* Check the decoded string for special characters. */ + if (!ftp_check_string(password)) { + return ap_proxyerror(r, HTTP_BAD_REQUEST, + "user credentials contained invalid character"); + } + /* + * Note that this allocation has to be made from r->connection->pool + * because it has the lifetime of the connection. The other + * allocations are temporary and can be tossed away any time. + */ + user = ap_getword_nulls(r->connection->pool, &password, ':'); + r->ap_auth_type = "Basic"; + r->user = r->parsed_uri.user = user; + } + else if ((user = r->parsed_uri.user) != NULL) { + user = apr_pstrdup(p, user); + decodeenc(user); + if ((password = r->parsed_uri.password) != NULL) { + char *tmp = apr_pstrdup(p, password); + decodeenc(tmp); + password = tmp; + } + } + else { + user = "anonymous"; + password = "apache-proxy@"; + } + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: FTP: connecting %s to %s:%d", url, connectname, connectport); + + /* do a DNS lookup for the destination host */ + err = apr_sockaddr_info_get(&connect_addr, connectname, APR_UNSPEC, connectport, 0, p); + + /* check if ProxyBlock directive on this host */ + if (OK != ap_proxy_checkproxyblock(r, conf, connect_addr)) { + return ap_proxyerror(r, HTTP_FORBIDDEN, + "Connect to remote machine blocked"); + } + + + /* + * II: Make the Connection ----------------------- + * + * We have determined who to connect to. Now make the connection. + */ + + /* + * get all the possible IP addresses for the destname and loop through + * them until we get a successful connection + */ + if (APR_SUCCESS != err) { + return ap_proxyerror(r, HTTP_BAD_GATEWAY, apr_pstrcat(p, + "DNS lookup failure for: ", + connectname, NULL)); + } + + /* + * At this point we have a list of one or more IP addresses of the + * machine to connect to. If configured, reorder this list so that the + * "best candidate" is first try. "best candidate" could mean the least + * loaded server, the fastest responding server, whatever. + * + * For now we do nothing, ie we get DNS round robin. XXX FIXME + */ + + + /* try each IP address until we connect successfully */ + { + int failed = 1; + while (connect_addr) { + + if ((rv = apr_socket_create(&sock, connect_addr->family, SOCK_STREAM, r->pool)) != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + "proxy: FTP: error creating socket"); + connect_addr = connect_addr->next; + continue; + } + +#if !defined(TPF) && !defined(BEOS) + if (conf->recv_buffer_size > 0 + && (rv = apr_socket_opt_set(sock, APR_SO_RCVBUF, + conf->recv_buffer_size))) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + "apr_socket_opt_set(APR_SO_RCVBUF): Failed to set ProxyReceiveBufferSize, using default"); + } +#endif + + if (APR_SUCCESS != (rv = apr_socket_opt_set(sock, APR_SO_REUSEADDR, one))) { + apr_socket_close(sock); +#ifndef _OSD_POSIX /* BS2000 has this option "always on" */ + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + "proxy: FTP: error setting reuseaddr option: apr_socket_opt_set(APR_SO_REUSEADDR)"); + connect_addr = connect_addr->next; + continue; +#endif /* _OSD_POSIX */ + } + + /* Set a timeout on the socket */ + if (conf->timeout_set == 1) { + apr_socket_timeout_set(sock, conf->timeout); + } + else { + apr_socket_timeout_set(sock, r->server->timeout); + } + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: FTP: fam %d socket created, trying to connect to %pI (%s)...", + connect_addr->family, connect_addr, connectname); + + /* make the connection out of the socket */ + rv = apr_connect(sock, connect_addr); + + /* if an error occurred, loop round and try again */ + if (rv != APR_SUCCESS) { + apr_socket_close(sock); + ap_log_error(APLOG_MARK, APLOG_ERR, rv, r->server, + "proxy: FTP: attempt to connect to %pI (%s) failed", connect_addr, connectname); + connect_addr = connect_addr->next; + continue; + } + + /* if we get here, all is well */ + failed = 0; + break; + } + + /* handle a permanent error from the above loop */ + if (failed) { + return ap_proxyerror(r, HTTP_BAD_GATEWAY, apr_psprintf(r->pool, + "Could not connect to remote machine: %s port %d", + connectname, connectport)); + } + } + + /* the socket is now open, create a new connection */ + origin = ap_run_create_connection(p, r->server, sock, r->connection->id, + r->connection->sbh, c->bucket_alloc); + if (!origin) { + /* + * the peer reset the connection already; ap_run_create_connection() closed + * the socket + */ + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: FTP: an error occurred creating a new connection to %pI (%s)", connect_addr, connectname); + return HTTP_INTERNAL_SERVER_ERROR; + } + + /* if a keepalive connection is floating around, close it first! */ + /* we might support ftp keepalives later, but not now... */ + if (backend->connection) { + apr_socket_close(origin_sock); + backend->connection = NULL; + origin_sock = NULL; + } + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: FTP: control connection complete"); + + + /* + * III: Send Control Request ------------------------- + * + * Log into the ftp server, send the username & password, change to the + * correct directory... + */ + + /* set up the connection filters */ + rc = ap_run_pre_connection(origin, sock); + if (rc != OK && rc != DONE) { + origin->aborted = 1; + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: FTP: pre_connection setup failed (%d)", + rc); + return rc; + } + + /* possible results: */ + /* 120 Service ready in nnn minutes. */ + /* 220 Service ready for new user. */ + /* 421 Service not available, closing control connection. */ + rc = proxy_ftp_command(NULL, r, origin, bb, &ftpmessage); + if (rc == -1 || rc == 421) { + return ap_proxyerror(r, HTTP_BAD_GATEWAY, "Error reading from remote server"); + } + if (rc == 120) { + /* + * RFC2616 states: 14.37 Retry-After + * + * The Retry-After response-header field can be used with a 503 (Service + * Unavailable) response to indicate how long the service is expected + * to be unavailable to the requesting client. [...] The value of + * this field can be either an HTTP-date or an integer number of + * seconds (in decimal) after the time of the response. Retry-After + * = "Retry-After" ":" ( HTTP-date | delta-seconds ) + */ + char *secs_str = ftpmessage; + time_t secs; + + /* Look for a number, preceded by whitespace */ + while (*secs_str) + if ((secs_str==ftpmessage || apr_isspace(secs_str[-1])) && + apr_isdigit(secs_str[0])) + break; + if (*secs_str != '\0') { + secs = atol(secs_str); + apr_table_add(r->headers_out, "Retry-After", + apr_psprintf(p, "%lu", (unsigned long)(60 * secs))); + } + return ap_proxyerror(r, HTTP_SERVICE_UNAVAILABLE, ftpmessage); + } + if (rc != 220) { + return ap_proxyerror(r, HTTP_BAD_GATEWAY, ftpmessage); + } + + rc = proxy_ftp_command(apr_pstrcat(p, "USER ", user, CRLF, NULL), + r, origin, bb, &ftpmessage); + /* possible results; 230, 331, 332, 421, 500, 501, 530 */ + /* states: 1 - error, 2 - success; 3 - send password, 4,5 fail */ + /* 230 User logged in, proceed. */ + /* 331 User name okay, need password. */ + /* 332 Need account for login. */ + /* 421 Service not available, closing control connection. */ + /* 500 Syntax error, command unrecognized. */ + /* (This may include errors such as command line too long.) */ + /* 501 Syntax error in parameters or arguments. */ + /* 530 Not logged in. */ + if (rc == -1 || rc == 421) { + return ap_proxyerror(r, HTTP_BAD_GATEWAY, "Error reading from remote server"); + } + if (rc == 530) { + return ftp_unauthorized(r, 1); /* log it: user name guessing + * attempt? */ + } + if (rc != 230 && rc != 331) { + return ap_proxyerror(r, HTTP_BAD_GATEWAY, ftpmessage); + } + + if (rc == 331) { /* send password */ + if (password == NULL) { + return ftp_unauthorized(r, 0); + } + + rc = proxy_ftp_command(apr_pstrcat(p, "PASS ", password, CRLF, NULL), + r, origin, bb, &ftpmessage); + /* possible results 202, 230, 332, 421, 500, 501, 503, 530 */ + /* 230 User logged in, proceed. */ + /* 332 Need account for login. */ + /* 421 Service not available, closing control connection. */ + /* 500 Syntax error, command unrecognized. */ + /* 501 Syntax error in parameters or arguments. */ + /* 503 Bad sequence of commands. */ + /* 530 Not logged in. */ + if (rc == -1 || rc == 421) { + return ap_proxyerror(r, HTTP_BAD_GATEWAY, + "Error reading from remote server"); + } + if (rc == 332) { + return ap_proxyerror(r, HTTP_UNAUTHORIZED, + apr_pstrcat(p, "Need account for login: ", ftpmessage, NULL)); + } + /* @@@ questionable -- we might as well return a 403 Forbidden here */ + if (rc == 530) { + return ftp_unauthorized(r, 1); /* log it: passwd guessing + * attempt? */ + } + if (rc != 230 && rc != 202) { + return ap_proxyerror(r, HTTP_BAD_GATEWAY, ftpmessage); + } + } + apr_table_set(r->notes, "Directory-README", ftpmessage); + + + /* Special handling for leading "%2f": this enforces a "cwd /" + * out of the $HOME directory which was the starting point after login + */ + if (strncasecmp(path, "%2f", 3) == 0) { + path += 3; + while (*path == '/') /* skip leading '/' (after root %2f) */ + ++path; + + rc = proxy_ftp_command("CWD /" CRLF, r, origin, bb, &ftpmessage); + if (rc == -1 || rc == 421) + return ap_proxyerror(r, HTTP_BAD_GATEWAY, + "Error reading from remote server"); + } + + /* + * set the directory (walk directory component by component): this is + * what we must do if we don't know the OS type of the remote machine + */ + for (;;) { + strp = strchr(path, '/'); + if (strp == NULL) + break; + *strp = '\0'; + + len = decodeenc(path); /* Note! This decodes a %2f -> "/" */ + + if (strchr(path, '/')) { /* are there now any '/' characters? */ + return ap_proxyerror(r, HTTP_BAD_REQUEST, + "Use of /%2f is only allowed at the base directory"); + } + + /* NOTE: FTP servers do globbing on the path. + * So we need to escape the URI metacharacters. + * We use a special glob-escaping routine to escape globbing chars. + * We could also have extended gen_test_char.c with a special T_ESCAPE_FTP_PATH + */ + rc = proxy_ftp_command(apr_pstrcat(p, "CWD ", + ftp_escape_globbingchars(p, path), CRLF, NULL), + r, origin, bb, &ftpmessage); + *strp = '/'; + /* responses: 250, 421, 500, 501, 502, 530, 550 */ + /* 250 Requested file action okay, completed. */ + /* 421 Service not available, closing control connection. */ + /* 500 Syntax error, command unrecognized. */ + /* 501 Syntax error in parameters or arguments. */ + /* 502 Command not implemented. */ + /* 530 Not logged in. */ + /* 550 Requested action not taken. */ + if (rc == -1 || rc == 421) { + return ap_proxyerror(r, HTTP_BAD_GATEWAY, + "Error reading from remote server"); + } + if (rc == 550) { + return ap_proxyerror(r, HTTP_NOT_FOUND, ftpmessage); + } + if (rc != 250) { + return ap_proxyerror(r, HTTP_BAD_GATEWAY, ftpmessage); + } + + path = strp + 1; + } + + /* + * IV: Make Data Connection? ------------------------- + * + * Try EPSV, if that fails... try PASV, if that fails... try PORT. + */ +/* this temporarily switches off EPSV/PASV */ +/*goto bypass;*/ + + /* set up data connection - EPSV */ + { + apr_sockaddr_t *data_addr; + char *data_ip; + apr_port_t data_port; + + /* + * The EPSV command replaces PASV where both IPV4 and IPV6 is + * supported. Only the port is returned, the IP address is always the + * same as that on the control connection. Example: Entering Extended + * Passive Mode (|||6446|) + */ + rc = proxy_ftp_command("EPSV" CRLF, + r, origin, bb, &ftpmessage); + /* possible results: 227, 421, 500, 501, 502, 530 */ + /* 227 Entering Passive Mode (h1,h2,h3,h4,p1,p2). */ + /* 421 Service not available, closing control connection. */ + /* 500 Syntax error, command unrecognized. */ + /* 501 Syntax error in parameters or arguments. */ + /* 502 Command not implemented. */ + /* 530 Not logged in. */ + if (rc == -1 || rc == 421) { + return ap_proxyerror(r, HTTP_BAD_GATEWAY, + "Error reading from remote server"); + } + if (rc != 229 && rc != 500 && rc != 501 && rc != 502) { + return ap_proxyerror(r, HTTP_BAD_GATEWAY, ftpmessage); + } + else if (rc == 229) { + /* Parse the port out of the EPSV reply. */ + data_port = parse_epsv_reply(ftpmessage); + + if (data_port) { + apr_sockaddr_t *epsv_addr; + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: FTP: EPSV contacting remote host on port %d", + data_port); + + if ((rv = apr_socket_create(&data_sock, connect_addr->family, SOCK_STREAM, r->pool)) != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + "proxy: FTP: error creating EPSV socket"); + return HTTP_INTERNAL_SERVER_ERROR; + } + +#if !defined (TPF) && !defined(BEOS) + if (conf->recv_buffer_size > 0 + && (rv = apr_socket_opt_set(data_sock, APR_SO_RCVBUF, + conf->recv_buffer_size))) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + "proxy: FTP: apr_socket_opt_set(SO_RCVBUF): Failed to set ProxyReceiveBufferSize, using default"); + } +#endif + + /* make the connection */ + apr_socket_addr_get(&data_addr, APR_REMOTE, sock); + apr_sockaddr_ip_get(&data_ip, data_addr); + apr_sockaddr_info_get(&epsv_addr, data_ip, connect_addr->family, data_port, 0, p); + rv = apr_connect(data_sock, epsv_addr); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, r->server, + "proxy: FTP: EPSV attempt to connect to %pI failed - Firewall/NAT?", epsv_addr); + return ap_proxyerror(r, HTTP_BAD_GATEWAY, apr_psprintf(r->pool, + "EPSV attempt to connect to %pI failed - firewall/NAT?", epsv_addr)); + } + else { + connect = 1; + } + } + } + } + + /* set up data connection - PASV */ + if (!connect) { + rc = proxy_ftp_command("PASV" CRLF, + r, origin, bb, &ftpmessage); + /* possible results: 227, 421, 500, 501, 502, 530 */ + /* 227 Entering Passive Mode (h1,h2,h3,h4,p1,p2). */ + /* 421 Service not available, closing control connection. */ + /* 500 Syntax error, command unrecognized. */ + /* 501 Syntax error in parameters or arguments. */ + /* 502 Command not implemented. */ + /* 530 Not logged in. */ + if (rc == -1 || rc == 421) { + return ap_proxyerror(r, HTTP_BAD_GATEWAY, + "Error reading from remote server"); + } + if (rc != 227 && rc != 502) { + return ap_proxyerror(r, HTTP_BAD_GATEWAY, ftpmessage); + } + else if (rc == 227) { + unsigned int h0, h1, h2, h3, p0, p1; + char *pstr; + char *tok_cntx; + +/* FIXME: Check PASV against RFC1123 */ + + pstr = ftpmessage; + pstr = apr_strtok(pstr, " ", &tok_cntx); /* separate result code */ + if (pstr != NULL) { + if (*(pstr + strlen(pstr) + 1) == '=') { + pstr += strlen(pstr) + 2; + } + else { + pstr = apr_strtok(NULL, "(", &tok_cntx); /* separate address & + * port params */ + if (pstr != NULL) + pstr = apr_strtok(NULL, ")", &tok_cntx); + } + } + +/* FIXME: Only supports IPV4 - fix in RFC2428 */ + + if (pstr != NULL && (sscanf(pstr, + "%d,%d,%d,%d,%d,%d", &h3, &h2, &h1, &h0, &p1, &p0) == 6)) { + + apr_sockaddr_t *pasv_addr; + apr_port_t pasvport = (p1 << 8) + p0; + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: FTP: PASV contacting host %d.%d.%d.%d:%d", + h3, h2, h1, h0, pasvport); + + if ((rv = apr_socket_create(&data_sock, connect_addr->family, SOCK_STREAM, r->pool)) != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + "proxy: error creating PASV socket"); + return HTTP_INTERNAL_SERVER_ERROR; + } + +#if !defined (TPF) && !defined(BEOS) + if (conf->recv_buffer_size > 0 + && (rv = apr_socket_opt_set(data_sock, APR_SO_RCVBUF, + conf->recv_buffer_size))) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + "proxy: FTP: apr_socket_opt_set(SO_RCVBUF): Failed to set ProxyReceiveBufferSize, using default"); + } +#endif + + /* make the connection */ + apr_sockaddr_info_get(&pasv_addr, apr_psprintf(p, "%d.%d.%d.%d", h3, h2, h1, h0), connect_addr->family, pasvport, 0, p); + rv = apr_connect(data_sock, pasv_addr); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, r->server, + "proxy: FTP: PASV attempt to connect to %pI failed - Firewall/NAT?", pasv_addr); + return ap_proxyerror(r, HTTP_BAD_GATEWAY, apr_psprintf(r->pool, + "PASV attempt to connect to %pI failed - firewall/NAT?", pasv_addr)); + } + else { + connect = 1; + } + } + } + } +/*bypass:*/ + + /* set up data connection - PORT */ + if (!connect) { + apr_sockaddr_t *local_addr; + char *local_ip; + apr_port_t local_port; + unsigned int h0, h1, h2, h3, p0, p1; + + if ((rv = apr_socket_create(&local_sock, connect_addr->family, SOCK_STREAM, r->pool)) != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + "proxy: FTP: error creating local socket"); + return HTTP_INTERNAL_SERVER_ERROR; + } + apr_socket_addr_get(&local_addr, APR_LOCAL, sock); + apr_sockaddr_port_get(&local_port, local_addr); + apr_sockaddr_ip_get(&local_ip, local_addr); + + if ((rv = apr_socket_opt_set(local_sock, APR_SO_REUSEADDR, one)) + != APR_SUCCESS) { +#ifndef _OSD_POSIX /* BS2000 has this option "always on" */ + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + "proxy: FTP: error setting reuseaddr option"); + return HTTP_INTERNAL_SERVER_ERROR; +#endif /* _OSD_POSIX */ + } + + apr_sockaddr_info_get(&local_addr, local_ip, APR_UNSPEC, local_port, 0, r->pool); + + if ((rv = apr_bind(local_sock, local_addr)) != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + "proxy: FTP: error binding to ftp data socket %pI", local_addr); + return HTTP_INTERNAL_SERVER_ERROR; + } + + /* only need a short queue */ + if ((rv = apr_listen(local_sock, 2)) != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + "proxy: FTP: error listening to ftp data socket %pI", local_addr); + return HTTP_INTERNAL_SERVER_ERROR; + } + +/* FIXME: Sent PORT here */ + + if (local_ip && (sscanf(local_ip, + "%d.%d.%d.%d", &h3, &h2, &h1, &h0) == 4)) { + p1 = (local_port >> 8); + p0 = (local_port & 0xFF); + + rc = proxy_ftp_command(apr_psprintf(p, "PORT %d,%d,%d,%d,%d,%d" CRLF, h3, h2, h1, h0, p1, p0), + r, origin, bb, &ftpmessage); + /* possible results: 200, 421, 500, 501, 502, 530 */ + /* 200 Command okay. */ + /* 421 Service not available, closing control connection. */ + /* 500 Syntax error, command unrecognized. */ + /* 501 Syntax error in parameters or arguments. */ + /* 502 Command not implemented. */ + /* 530 Not logged in. */ + if (rc == -1 || rc == 421) { + return ap_proxyerror(r, HTTP_BAD_GATEWAY, + "Error reading from remote server"); + } + if (rc != 200) { + return ap_proxyerror(r, HTTP_BAD_GATEWAY, buffer); + } + + /* signal that we must use the EPRT/PORT loop */ + use_port = 1; + } + else { +/* IPV6 FIXME: + * The EPRT command replaces PORT where both IPV4 and IPV6 is supported. The first + * number (1,2) indicates the protocol type. Examples: + * EPRT |1|132.235.1.2|6275| + * EPRT |2|1080::8:800:200C:417A|5282| + */ + return ap_proxyerror(r, HTTP_NOT_IMPLEMENTED, "Connect to IPV6 ftp server using EPRT not supported. Enable EPSV."); + } + } + + + /* + * V: Set The Headers ------------------- + * + * Get the size of the request, set up the environment for HTTP. + */ + + /* set request; "path" holds last path component */ + len = decodeenc(path); + + if (strchr(path, '/')) { /* are there now any '/' characters? */ + return ap_proxyerror(r, HTTP_BAD_REQUEST, + "Use of /%2f is only allowed at the base directory"); + } + + /* If len == 0 then it must be a directory (you can't RETR nothing) + * Also, don't allow to RETR by wildcard. Instead, create a dirlisting + */ + if (len == 0 || ftp_check_globbingchars(path)) { + dirlisting = 1; + } + else { + /* (from FreeBSD ftpd): + * SIZE is not in RFC959, but Postel has blessed it and + * it will be in the updated RFC. + * + * Return size of file in a format suitable for + * using with RESTART (we just count bytes). + */ + /* from draft-ietf-ftpext-mlst-14.txt: + * This value will + * change depending on the current STRUcture, MODE and TYPE of the data + * connection, or a data connection which would be created were one + * created now. Thus, the result of the SIZE command is dependent on + * the currently established STRU, MODE and TYPE parameters. + */ + /* Therefore: switch to binary if the user did not specify ";type=a" */ + ftp_set_TYPE(xfer_type, r, origin, bb, &ftpmessage); + rc = proxy_ftp_command(apr_pstrcat(p, "SIZE ", + ftp_escape_globbingchars(p, path), CRLF, NULL), + r, origin, bb, &ftpmessage); + if (rc == -1 || rc == 421) { + return ap_proxyerror(r, HTTP_BAD_GATEWAY, + "Error reading from remote server"); + } + else if (rc == 213) {/* Size command ok */ + int j; + for (j = 0; apr_isdigit(ftpmessage[j]); j++) + ; + ftpmessage[j] = '\0'; + if (ftpmessage[0] != '\0') + size = ftpmessage; /* already pstrdup'ed: no copy necessary */ + } + else if (rc == 550) { /* Not a regular file */ + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: FTP: SIZE shows this is a directory"); + dirlisting = 1; + rc = proxy_ftp_command(apr_pstrcat(p, "CWD ", + ftp_escape_globbingchars(p, path), CRLF, NULL), + r, origin, bb, &ftpmessage); + /* possible results: 250, 421, 500, 501, 502, 530, 550 */ + /* 250 Requested file action okay, completed. */ + /* 421 Service not available, closing control connection. */ + /* 500 Syntax error, command unrecognized. */ + /* 501 Syntax error in parameters or arguments. */ + /* 502 Command not implemented. */ + /* 530 Not logged in. */ + /* 550 Requested action not taken. */ + if (rc == -1 || rc == 421) { + return ap_proxyerror(r, HTTP_BAD_GATEWAY, + "Error reading from remote server"); + } + if (rc == 550) { + return ap_proxyerror(r, HTTP_NOT_FOUND, ftpmessage); + } + if (rc != 250) { + return ap_proxyerror(r, HTTP_BAD_GATEWAY, ftpmessage); + } + path = ""; + len = 0; + } + } + + cwd = ftp_get_PWD(r, origin, bb); + if (cwd != NULL) { + apr_table_set(r->notes, "Directory-PWD", cwd); + } + + if (dirlisting) { + ftp_set_TYPE('A', r, origin, bb, NULL); + /* If the current directory contains no slash, we are talking to + * a non-unix ftp system. Try LIST instead of "LIST -lag", it + * should return a long listing anyway (unlike NLST). + * Some exotic FTP servers might choke on the "-lag" switch. + */ + /* Note that we do not escape the path here, to allow for + * queries like: ftp://user@host/apache/src/server/http_*.c + */ + if (len != 0) + buf = apr_pstrcat(p, "LIST ", path, CRLF, NULL); + else if (cwd == NULL || strchr(cwd, '/') != NULL) + buf = apr_pstrcat(p, "LIST -lag", CRLF, NULL); + else + buf = "LIST" CRLF; + } + else { + /* switch to binary if the user did not specify ";type=a" */ + ftp_set_TYPE(xfer_type, r, origin, bb, &ftpmessage); +#if defined(USE_MDTM) && (defined(HAVE_TIMEGM) || defined(HAVE_GMTOFF)) + /* from draft-ietf-ftpext-mlst-14.txt: + * The FTP command, MODIFICATION TIME (MDTM), can be used to determine + * when a file in the server NVFS was last modified. <..> + * The syntax of a time value is: + * time-val = 14DIGIT [ "." 1*DIGIT ] <..> + * Symbolically, a time-val may be viewed as + * YYYYMMDDHHMMSS.sss + * The "." and subsequent digits ("sss") are optional. <..> + * Time values are always represented in UTC (GMT) + */ + rc = proxy_ftp_command(apr_pstrcat(p, "MDTM ", ftp_escape_globbingchars(p, path), CRLF, NULL), + r, origin, bb, &ftpmessage); + /* then extract the Last-Modified time from it (YYYYMMDDhhmmss or YYYYMMDDhhmmss.xxx GMT). */ + if (rc == 213) { + struct { + char YYYY[4+1]; + char MM[2+1]; + char DD[2+1]; + char hh[2+1]; + char mm[2+1]; + char ss[2+1]; + } time_val; + if (6 == sscanf(ftpmessage, "%4[0-9]%2[0-9]%2[0-9]%2[0-9]%2[0-9]%2[0-9]", + time_val.YYYY, time_val.MM, time_val.DD, time_val.hh, time_val.mm, time_val.ss)) { + struct tm tms; + memset (&tms, '\0', sizeof tms); + tms.tm_year = atoi(time_val.YYYY) - 1900; + tms.tm_mon = atoi(time_val.MM) - 1; + tms.tm_mday = atoi(time_val.DD); + tms.tm_hour = atoi(time_val.hh); + tms.tm_min = atoi(time_val.mm); + tms.tm_sec = atoi(time_val.ss); +#ifdef HAVE_TIMEGM /* Does system have timegm()? */ + mtime = timegm(&tms); + mtime *= APR_USEC_PER_SEC; +#elif HAVE_GMTOFF /* does struct tm have a member tm_gmtoff? */ + /* mktime will subtract the local timezone, which is not what we want. + * Add it again because the MDTM string is GMT + */ + mtime = mktime(&tms); + mtime += tms.tm_gmtoff; + mtime *= APR_USEC_PER_SEC; +#else + mtime = 0L; +#endif + } + } +#endif /* USE_MDTM */ +/* FIXME: Handle range requests - send REST */ + buf = apr_pstrcat(p, "RETR ", ftp_escape_globbingchars(p, path), CRLF, NULL); + } + rc = proxy_ftp_command(buf, r, origin, bb, &ftpmessage); + /* rc is an intermediate response for the LIST or RETR commands */ + + /* + * RETR: 110, 125, 150, 226, 250, 421, 425, 426, 450, 451, 500, 501, 530, + * 550 NLST: 125, 150, 226, 250, 421, 425, 426, 450, 451, 500, 501, 502, + * 530 + */ + /* 110 Restart marker reply. */ + /* 125 Data connection already open; transfer starting. */ + /* 150 File status okay; about to open data connection. */ + /* 226 Closing data connection. */ + /* 250 Requested file action okay, completed. */ + /* 421 Service not available, closing control connection. */ + /* 425 Can't open data connection. */ + /* 426 Connection closed; transfer aborted. */ + /* 450 Requested file action not taken. */ + /* 451 Requested action aborted. Local error in processing. */ + /* 500 Syntax error, command unrecognized. */ + /* 501 Syntax error in parameters or arguments. */ + /* 530 Not logged in. */ + /* 550 Requested action not taken. */ + if (rc == -1 || rc == 421) { + return ap_proxyerror(r, HTTP_BAD_GATEWAY, + "Error reading from remote server"); + } + if (rc == 550) { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: FTP: RETR failed, trying LIST instead"); + + /* Directory Listings should always be fetched in ASCII mode */ + dirlisting = 1; + ftp_set_TYPE('A', r, origin, bb, NULL); + + rc = proxy_ftp_command(apr_pstrcat(p, "CWD ", + ftp_escape_globbingchars(p, path), CRLF, NULL), + r, origin, bb, &ftpmessage); + /* possible results: 250, 421, 500, 501, 502, 530, 550 */ + /* 250 Requested file action okay, completed. */ + /* 421 Service not available, closing control connection. */ + /* 500 Syntax error, command unrecognized. */ + /* 501 Syntax error in parameters or arguments. */ + /* 502 Command not implemented. */ + /* 530 Not logged in. */ + /* 550 Requested action not taken. */ + if (rc == -1 || rc == 421) { + return ap_proxyerror(r, HTTP_BAD_GATEWAY, + "Error reading from remote server"); + } + if (rc == 550) { + return ap_proxyerror(r, HTTP_NOT_FOUND, ftpmessage); + } + if (rc != 250) { + return ap_proxyerror(r, HTTP_BAD_GATEWAY, ftpmessage); + } + + /* Update current directory after CWD */ + cwd = ftp_get_PWD(r, origin, bb); + if (cwd != NULL) { + apr_table_set(r->notes, "Directory-PWD", cwd); + } + + /* See above for the "LIST" vs. "LIST -lag" discussion. */ + rc = proxy_ftp_command((cwd == NULL || strchr(cwd, '/') != NULL) + ? "LIST -lag" CRLF : "LIST" CRLF, + r, origin, bb, &ftpmessage); + + /* rc is an intermediate response for the LIST command (125 transfer starting, 150 opening data connection) */ + if (rc == -1 || rc == 421) + return ap_proxyerror(r, HTTP_BAD_GATEWAY, + "Error reading from remote server"); + } + if (rc != 125 && rc != 150 && rc != 226 && rc != 250) { + return ap_proxyerror(r, HTTP_BAD_GATEWAY, ftpmessage); + } + + r->status = HTTP_OK; + r->status_line = "200 OK"; + + apr_rfc822_date(dates, r->request_time); + apr_table_setn(r->headers_out, "Date", dates); + apr_table_setn(r->headers_out, "Server", ap_get_server_version()); + + /* set content-type */ + if (dirlisting) { + ap_set_content_type(r, "text/html; charset=ISO-8859-1"); + } + else { + if (r->content_type) { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: FTP: Content-Type set to %s", r->content_type); + } + else { + ap_set_content_type(r, ap_default_type(r)); + } + if (xfer_type != 'A' && size != NULL) { + /* We "trust" the ftp server to really serve (size) bytes... */ + apr_table_setn(r->headers_out, "Content-Length", size); + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: FTP: Content-Length set to %s", size); + } + } + apr_table_setn(r->headers_out, "Content-Type", r->content_type); + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: FTP: Content-Type set to %s", r->content_type); + +#if defined(USE_MDTM) && (defined(HAVE_TIMEGM) || defined(HAVE_GMTOFF)) + if (mtime != 0L) { + char datestr[APR_RFC822_DATE_LEN]; + apr_rfc822_date(datestr, mtime); + apr_table_set(r->headers_out, "Last-Modified", datestr); + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: FTP: Last-Modified set to %s", datestr); + } +#endif /* USE_MDTM */ + + /* If an encoding has been set by mistake, delete it. + * @@@ FIXME (e.g., for ftp://user@host/file*.tar.gz, + * @@@ the encoding is currently set to x-gzip) + */ + if (dirlisting && r->content_encoding != NULL) + r->content_encoding = NULL; + + /* set content-encoding (not for dir listings, they are uncompressed)*/ + if (r->content_encoding != NULL && r->content_encoding[0] != '\0') { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: FTP: Content-Encoding set to %s", r->content_encoding); + apr_table_setn(r->headers_out, "Content-Encoding", r->content_encoding); + } + + /* wait for connection */ + if (use_port) { + for (;;) { + rv = apr_accept(&data_sock, local_sock, r->pool); + if (rv == APR_EINTR) { + continue; + } + else if (rv == APR_SUCCESS) { + break; + } + else { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + "proxy: FTP: failed to accept data connection"); + return HTTP_BAD_GATEWAY; + } + } + } + + /* the transfer socket is now open, create a new connection */ + data = ap_run_create_connection(p, r->server, data_sock, r->connection->id, + r->connection->sbh, c->bucket_alloc); + if (!data) { + /* + * the peer reset the connection already; ap_run_create_connection() closed + * the socket + */ + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: FTP: an error occurred creating the transfer connection"); + return HTTP_INTERNAL_SERVER_ERROR; + } + + /* set up the connection filters */ + rc = ap_run_pre_connection(data, data_sock); + if (rc != OK && rc != DONE) { + data->aborted = 1; + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: FTP: pre_connection setup failed (%d)", + rc); + return rc; + } + + /* + * VI: Receive the Response ------------------------ + * + * Get response from the remote ftp socket, and pass it up the filter chain. + */ + + /* send response */ + r->sent_bodyct = 1; + + if (dirlisting) { + /* insert directory filter */ + ap_add_output_filter("PROXY_SEND_DIR", NULL, r, r->connection); + } + + /* send body */ + if (!r->header_only) { + apr_bucket *e; + int finish = FALSE; + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: FTP: start body send"); + + /* read the body, pass it to the output filters */ + while (ap_get_brigade(data->input_filters, + bb, + AP_MODE_READBYTES, + APR_BLOCK_READ, + conf->io_buffer_size) == APR_SUCCESS) { +#if DEBUGGING + { + apr_off_t readbytes; + apr_brigade_length(bb, 0, &readbytes); + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, + r->server, "proxy (PID %d): readbytes: %#x", + getpid(), readbytes); + } +#endif + /* sanity check */ + if (APR_BRIGADE_EMPTY(bb)) { + apr_brigade_cleanup(bb); + break; + } + + /* found the last brigade? */ + if (APR_BUCKET_IS_EOS(APR_BRIGADE_LAST(bb))) { + /* if this is the last brigade, cleanup the + * backend connection first to prevent the + * backend server from hanging around waiting + * for a slow client to eat these bytes + */ + ap_flush_conn(data); + if (data_sock) { + apr_socket_close(data_sock); + } + data_sock = NULL; + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: FTP: data connection closed"); + /* signal that we must leave */ + finish = TRUE; + } + + /* if no EOS yet, then we must flush */ + if (FALSE == finish) { + e = apr_bucket_flush_create(c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, e); + } + + /* try send what we read */ + if (ap_pass_brigade(r->output_filters, bb) != APR_SUCCESS + || c->aborted) { + /* Ack! Phbtt! Die! User aborted! */ + finish = TRUE; + } + + /* make sure we always clean up after ourselves */ + apr_brigade_cleanup(bb); + + /* if we are done, leave */ + if (TRUE == finish) { + break; + } + } + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: FTP: end body send"); + + } + if (data_sock) { + ap_flush_conn(data); + apr_socket_close(data_sock); + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: FTP: data connection closed"); + } + + /* Retrieve the final response for the RETR or LIST commands */ + rc = proxy_ftp_command(NULL, r, origin, bb, &ftpmessage); + apr_brigade_cleanup(bb); + + /* + * VII: Clean Up ------------- + * + * If there are no KeepAlives, or if the connection has been signalled to + * close, close the socket and clean up + */ + + /* finish */ + rc = proxy_ftp_command("QUIT" CRLF, + r, origin, bb, &ftpmessage); + /* responses: 221, 500 */ + /* 221 Service closing control connection. */ + /* 500 Syntax error, command unrecognized. */ + ap_flush_conn(origin); + if (origin_sock) { + apr_socket_close(origin_sock); + origin_sock = NULL; + } + apr_brigade_destroy(bb); + return OK; +} + +static void ap_proxy_ftp_register_hook(apr_pool_t *p) +{ + /* hooks */ + proxy_hook_scheme_handler(ap_proxy_ftp_handler, NULL, NULL, APR_HOOK_MIDDLE); + proxy_hook_canon_handler(ap_proxy_ftp_canon, NULL, NULL, APR_HOOK_MIDDLE); + /* filters */ + ap_register_output_filter("PROXY_SEND_DIR", ap_proxy_send_dir_filter, + NULL, AP_FTYPE_RESOURCE); +} + +module AP_MODULE_DECLARE_DATA proxy_ftp_module = { + STANDARD20_MODULE_STUFF, + NULL, /* create per-directory config structure */ + NULL, /* merge per-directory config structures */ + NULL, /* create per-server config structure */ + NULL, /* merge per-server config structures */ + NULL, /* command apr_table_t */ + ap_proxy_ftp_register_hook /* register hooks */ +}; diff --git a/rubbos/app/httpd-2.0.64/modules/proxy/proxy_http.c b/rubbos/app/httpd-2.0.64/modules/proxy/proxy_http.c new file mode 100644 index 00000000..ca5f038b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/proxy/proxy_http.c @@ -0,0 +1,1824 @@ +/* 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. + */ + +/* HTTP routines for Apache proxy */ + +#include "mod_proxy.h" + +module AP_MODULE_DECLARE_DATA proxy_http_module; + +int ap_proxy_http_canon(request_rec *r, char *url); +int ap_proxy_http_handler(request_rec *r, proxy_server_conf *conf, + char *url, const char *proxyname, + apr_port_t proxyport); + +typedef struct { + const char *name; + apr_port_t port; + apr_sockaddr_t *addr; + apr_socket_t *sock; + int close; +} proxy_http_conn_t; + +static apr_status_t ap_proxy_http_cleanup(request_rec *r, + proxy_http_conn_t *p_conn, + proxy_conn_rec *backend); + +/* + * Canonicalise http-like URLs. + * scheme is the scheme for the URL + * url is the URL starting with the first '/' + * def_port is the default port for this scheme. + */ +int ap_proxy_http_canon(request_rec *r, char *url) +{ + char *host, *path, *search, sport[7]; + const char *err; + const char *scheme; + apr_port_t port, def_port; + + /* ap_port_of_scheme() */ + if (strncasecmp(url, "http:", 5) == 0) { + url += 5; + scheme = "http"; + } + else if (strncasecmp(url, "https:", 6) == 0) { + url += 6; + scheme = "https"; + } + else { + return DECLINED; + } + def_port = apr_uri_port_of_scheme(scheme); + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: HTTP: canonicalising URL %s", url); + + /* do syntatic check. + * We break the URL into host, port, path, search + */ + port = def_port; + err = ap_proxy_canon_netloc(r->pool, &url, NULL, NULL, &host, &port); + if (err) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "error parsing URL %s: %s", + url, err); + return HTTP_BAD_REQUEST; + } + + /* now parse path/search args, according to rfc1738 */ + /* N.B. if this isn't a true proxy request, then the URL _path_ + * has already been decoded. True proxy requests have r->uri + * == r->unparsed_uri, and no others have that property. + */ + if (r->uri == r->unparsed_uri) { + search = strchr(url, '?'); + if (search != NULL) + *(search++) = '\0'; + } + else + search = r->args; + + /* process path */ + path = ap_proxy_canonenc(r->pool, url, strlen(url), enc_path, r->proxyreq); + if (path == NULL) + return HTTP_BAD_REQUEST; + + if (port != def_port) + apr_snprintf(sport, sizeof(sport), ":%d", port); + else + sport[0] = '\0'; + + if (ap_strchr_c(host, ':')) { /* if literal IPv6 address */ + host = apr_pstrcat(r->pool, "[", host, "]", NULL); + } + r->filename = apr_pstrcat(r->pool, "proxy:", scheme, "://", host, sport, + "/", path, (search) ? "?" : "", (search) ? search : "", NULL); + return OK; +} + +static const char *ap_proxy_location_reverse_map(request_rec *r, proxy_server_conf *conf, const char *url) +{ + struct proxy_alias *ent; + int i, l1, l2; + char *u; + + /* XXX FIXME: Make sure this handled the ambiguous case of the :80 + * after the hostname */ + + l1 = strlen(url); + ent = (struct proxy_alias *)conf->raliases->elts; + for (i = 0; i < conf->raliases->nelts; i++) { + l2 = strlen(ent[i].real); + if (l1 >= l2 && strncmp(ent[i].real, url, l2) == 0) { + u = apr_pstrcat(r->pool, ent[i].fake, &url[l2], NULL); + return ap_construct_url(r->pool, u, r); + } + } + return url; +} + +/* Clear all connection-based headers from the incoming headers table */ +static void ap_proxy_clear_connection(apr_pool_t *p, apr_table_t *headers) +{ + const char *name; + char *next = apr_pstrdup(p, apr_table_get(headers, "Connection")); + + apr_table_unset(headers, "Proxy-Connection"); + if (!next) + return; + + while (*next) { + name = next; + while (*next && !apr_isspace(*next) && (*next != ',')) { + ++next; + } + while (*next && (apr_isspace(*next) || (*next == ','))) { + *next = '\0'; + ++next; + } + apr_table_unset(headers, name); + } + apr_table_unset(headers, "Connection"); +} + +static +apr_status_t ap_proxy_http_determine_connection(apr_pool_t *p, request_rec *r, + proxy_http_conn_t *p_conn, + conn_rec *c, + proxy_server_conf *conf, + apr_uri_t *uri, + char **url, + const char *proxyname, + apr_port_t proxyport, + char *server_portstr, + int server_portstr_size) { + int server_port; + apr_status_t err; + apr_sockaddr_t *uri_addr; + /* + * Break up the URL to determine the host to connect to + */ + + /* we break the URL into host, port, uri */ + if (APR_SUCCESS != apr_uri_parse(p, *url, uri)) { + return ap_proxyerror(r, HTTP_BAD_REQUEST, + apr_pstrcat(p,"URI cannot be parsed: ", *url, + NULL)); + } + if (!uri->port) { + uri->port = apr_uri_port_of_scheme(uri->scheme); + } + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: HTTP connecting %s to %s:%d", *url, uri->hostname, + uri->port); + + /* do a DNS lookup for the destination host */ + /* see memory note above */ + err = apr_sockaddr_info_get(&uri_addr, apr_pstrdup(c->pool, uri->hostname), + APR_UNSPEC, uri->port, 0, c->pool); + + /* allocate these out of the connection pool - the check on + * r->connection->id makes sure that this string does not get accessed + * past the connection lifetime */ + /* are we connecting directly, or via a proxy? */ + if (proxyname) { + p_conn->name = apr_pstrdup(c->pool, proxyname); + p_conn->port = proxyport; + /* see memory note above */ + err = apr_sockaddr_info_get(&p_conn->addr, p_conn->name, APR_UNSPEC, + p_conn->port, 0, c->pool); + } else { + p_conn->name = apr_pstrdup(c->pool, uri->hostname); + p_conn->port = uri->port; + p_conn->addr = uri_addr; + *url = apr_pstrcat(p, uri->path, uri->query ? "?" : "", + uri->query ? uri->query : "", + uri->fragment ? "#" : "", + uri->fragment ? uri->fragment : "", NULL); + } + + if (err != APR_SUCCESS) { + return ap_proxyerror(r, HTTP_BAD_GATEWAY, + apr_pstrcat(p, "DNS lookup failure for: ", + p_conn->name, NULL)); + } + + /* Get the server port for the Via headers */ + { + server_port = ap_get_server_port(r); + if (ap_is_default_port(server_port, r)) { + strcpy(server_portstr,""); + } else { + apr_snprintf(server_portstr, server_portstr_size, ":%d", + server_port); + } + } + + /* check if ProxyBlock directive on this host */ + if (OK != ap_proxy_checkproxyblock(r, conf, uri_addr)) { + return ap_proxyerror(r, HTTP_FORBIDDEN, + "Connect to remote machine blocked"); + } + return OK; +} + +static +apr_status_t ap_proxy_http_create_connection(apr_pool_t *p, request_rec *r, + proxy_http_conn_t *p_conn, + conn_rec *c, conn_rec **origin, + proxy_conn_rec *backend, + proxy_server_conf *conf, + const char *proxyname) { + int failed=0, new=0; + apr_socket_t *client_socket = NULL; + + /* We have determined who to connect to. Now make the connection, supporting + * a KeepAlive connection. + */ + + /* get all the possible IP addresses for the destname and loop through them + * until we get a successful connection + */ + + /* if a keepalive socket is already open, check whether it must stay + * open, or whether it should be closed and a new socket created. + */ + /* see memory note above */ + if (backend->connection) { + client_socket = ap_get_module_config(backend->connection->conn_config, &core_module); + if ((backend->connection->id == c->id) && + (backend->port == p_conn->port) && + (backend->hostname) && + (!apr_strnatcasecmp(backend->hostname, p_conn->name))) { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: keepalive address match (keep original socket)"); + } else { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: keepalive address mismatch / connection has" + " changed (close old socket (%s/%s, %d/%d))", + p_conn->name, backend->hostname, p_conn->port, + backend->port); + apr_socket_close(client_socket); + backend->connection = NULL; + } + } + + /* get a socket - either a keepalive one, or a new one */ + new = 1; + if ((backend->connection) && (backend->connection->id == c->id)) { + apr_size_t buffer_len = 1; + char test_buffer[1]; + apr_status_t socket_status; + apr_interval_time_t current_timeout; + + /* use previous keepalive socket */ + *origin = backend->connection; + p_conn->sock = client_socket; + new = 0; + + /* save timeout */ + apr_socket_timeout_get(p_conn->sock, ¤t_timeout); + /* set no timeout */ + apr_socket_timeout_set(p_conn->sock, 0); + socket_status = apr_recv(p_conn->sock, test_buffer, &buffer_len); + /* put back old timeout */ + apr_socket_timeout_set(p_conn->sock, current_timeout); + if ( APR_STATUS_IS_EOF(socket_status) ) { + ap_log_error(APLOG_MARK, APLOG_INFO, 0, NULL, + "proxy: previous connection is closed, creating a new connection."); + new = 1; + } + } + if (new) { + int rc; + + /* create a new socket */ + backend->connection = NULL; + + /* + * At this point we have a list of one or more IP addresses of + * the machine to connect to. If configured, reorder this + * list so that the "best candidate" is first try. "best + * candidate" could mean the least loaded server, the fastest + * responding server, whatever. + * + * For now we do nothing, ie we get DNS round robin. + * XXX FIXME + */ + failed = ap_proxy_connect_to_backend(&p_conn->sock, "HTTP", + p_conn->addr, p_conn->name, + conf, r->server, c->pool); + + /* handle a permanent error on the connect */ + if (failed) { + if (proxyname) { + return DECLINED; + } else { + return HTTP_BAD_GATEWAY; + } + } + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: socket is connected"); + + /* the socket is now open, create a new backend server connection */ + *origin = ap_run_create_connection(c->pool, r->server, p_conn->sock, + r->connection->id, + r->connection->sbh, c->bucket_alloc); + if (!*origin) { + /* the peer reset the connection already; ap_run_create_connection() + * closed the socket + */ + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, + r->server, "proxy: an error occurred creating a " + "new connection to %pI (%s)", p_conn->addr, + p_conn->name); + apr_socket_close(p_conn->sock); + return HTTP_INTERNAL_SERVER_ERROR; + } + backend->connection = *origin; + backend->hostname = apr_pstrdup(c->pool, p_conn->name); + backend->port = p_conn->port; + + if (backend->is_ssl) { + if (!ap_proxy_ssl_enable(backend->connection)) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, + r->server, "proxy: failed to enable ssl support " + "for %pI (%s)", p_conn->addr, p_conn->name); + return HTTP_INTERNAL_SERVER_ERROR; + } + } + else { + ap_proxy_ssl_disable(backend->connection); + } + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: connection complete to %pI (%s)", + p_conn->addr, p_conn->name); + + /* set up the connection filters */ + rc = ap_run_pre_connection(*origin, p_conn->sock); + if (rc != OK && rc != DONE) { + (*origin)->aborted = 1; + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: HTTP: pre_connection setup failed (%d)", + rc); + return rc; + } + } + return OK; +} + +static void add_te_chunked(apr_pool_t *p, + apr_bucket_alloc_t *bucket_alloc, + apr_bucket_brigade *header_brigade) +{ + apr_bucket *e; + char *buf; + const char te_hdr[] = "Transfer-Encoding: chunked" CRLF; + + buf = apr_pmemdup(p, te_hdr, sizeof(te_hdr)-1); + ap_xlate_proto_to_ascii(buf, sizeof(te_hdr)-1); + + e = apr_bucket_pool_create(buf, sizeof(te_hdr)-1, p, bucket_alloc); + APR_BRIGADE_INSERT_TAIL(header_brigade, e); +} + +static void add_cl(apr_pool_t *p, + apr_bucket_alloc_t *bucket_alloc, + apr_bucket_brigade *header_brigade, + const char *cl_val) +{ + apr_bucket *e; + char *buf; + + buf = apr_pstrcat(p, "Content-Length: ", + cl_val, + CRLF, + NULL); + ap_xlate_proto_to_ascii(buf, strlen(buf)); + e = apr_bucket_pool_create(buf, strlen(buf), p, bucket_alloc); + APR_BRIGADE_INSERT_TAIL(header_brigade, e); +} + +#define ASCII_CRLF "\015\012" +#define ASCII_ZERO "\060" + +static void terminate_headers(apr_bucket_alloc_t *bucket_alloc, + apr_bucket_brigade *header_brigade) +{ + apr_bucket *e; + + /* add empty line at the end of the headers */ + e = apr_bucket_immortal_create(ASCII_CRLF, 2, bucket_alloc); + APR_BRIGADE_INSERT_TAIL(header_brigade, e); +} + +static apr_status_t pass_brigade(apr_bucket_alloc_t *bucket_alloc, + request_rec *r, proxy_http_conn_t *p_conn, + conn_rec *origin, apr_bucket_brigade *bb, + int flush) +{ + apr_status_t status; + + if (flush) { + apr_bucket *e = apr_bucket_flush_create(bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, e); + } + status = ap_pass_brigade(origin->output_filters, bb); + if (status != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, status, r->server, + "proxy: pass request body failed to %pI (%s)", + p_conn->addr, p_conn->name); + return status; + } + apr_brigade_cleanup(bb); + return APR_SUCCESS; +} + +static apr_status_t stream_reqbody_chunked(apr_pool_t *p, + request_rec *r, + proxy_http_conn_t *p_conn, + conn_rec *origin, + apr_bucket_brigade *header_brigade, + apr_bucket_brigade *input_brigade) +{ + int seen_eos = 0; + apr_size_t hdr_len; + apr_off_t bytes; + apr_status_t status; + apr_bucket_alloc_t *bucket_alloc = r->connection->bucket_alloc; + apr_bucket_brigade *bb; + apr_bucket *e; + + add_te_chunked(p, bucket_alloc, header_brigade); + terminate_headers(bucket_alloc, header_brigade); + + while (!APR_BUCKET_IS_EOS(APR_BRIGADE_FIRST(input_brigade))) + { + char chunk_hdr[20]; /* must be here due to transient bucket. */ + + /* If this brigade contains EOS, either stop or remove it. */ + if (APR_BUCKET_IS_EOS(APR_BRIGADE_LAST(input_brigade))) { + seen_eos = 1; + + /* We can't pass this EOS to the output_filters. */ + e = APR_BRIGADE_LAST(input_brigade); + apr_bucket_delete(e); + } + + apr_brigade_length(input_brigade, 1, &bytes); + + hdr_len = apr_snprintf(chunk_hdr, sizeof(chunk_hdr), + "%" APR_UINT64_T_HEX_FMT CRLF, + (apr_uint64_t)bytes); + + ap_xlate_proto_to_ascii(chunk_hdr, hdr_len); + e = apr_bucket_transient_create(chunk_hdr, hdr_len, + bucket_alloc); + APR_BRIGADE_INSERT_HEAD(input_brigade, e); + + /* + * Append the end-of-chunk CRLF + */ + e = apr_bucket_immortal_create(ASCII_CRLF, 2, bucket_alloc); + APR_BRIGADE_INSERT_TAIL(input_brigade, e); + + if (header_brigade) { + /* we never sent the header brigade, so go ahead and + * take care of that now + */ + bb = header_brigade; + + /* + * Save input_brigade in bb brigade. (At least) in the SSL case + * input_brigade contains transient buckets whose data would get + * overwritten during the next call of ap_get_brigade in the loop. + * ap_save_brigade ensures these buckets to be set aside. + * Calling ap_save_brigade with NULL as filter is OK, because + * bb brigade already has been created and does not need to get + * created by ap_save_brigade. + */ + status = ap_save_brigade(NULL, &bb, &input_brigade, p); + if (status != APR_SUCCESS) { + return status; + } + + header_brigade = NULL; + } + else { + bb = input_brigade; + } + + /* The request is flushed below this loop with chunk EOS header */ + status = pass_brigade(bucket_alloc, r, p_conn, origin, bb, 0); + if (status != APR_SUCCESS) { + return status; + } + + if (seen_eos) { + break; + } + + status = ap_get_brigade(r->input_filters, input_brigade, + AP_MODE_READBYTES, APR_BLOCK_READ, + HUGE_STRING_LEN); + + if (status != APR_SUCCESS) { + return status; + } + } + + if (header_brigade) { + /* we never sent the header brigade because there was no request body; + * send it now + */ + bb = header_brigade; + } + else { + if (!APR_BRIGADE_EMPTY(input_brigade)) { + /* input brigade still has an EOS which we can't pass to the output_filters. */ + e = APR_BRIGADE_LAST(input_brigade); + AP_DEBUG_ASSERT(APR_BUCKET_IS_EOS(e)); + apr_bucket_delete(e); + } + bb = input_brigade; + } + + e = apr_bucket_immortal_create(ASCII_ZERO ASCII_CRLF + /* */ + ASCII_CRLF, + 5, bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, e); + + /* Now we have headers-only, or the chunk EOS mark; flush it */ + status = pass_brigade(bucket_alloc, r, p_conn, origin, bb, 1); + return status; +} + +static apr_status_t stream_reqbody_cl(apr_pool_t *p, + request_rec *r, + proxy_http_conn_t *p_conn, + conn_rec *origin, + apr_bucket_brigade *header_brigade, + apr_bucket_brigade *input_brigade, + const char *old_cl_val) +{ + int seen_eos = 0; + apr_status_t status = APR_SUCCESS; + apr_bucket_alloc_t *bucket_alloc = r->connection->bucket_alloc; + apr_bucket_brigade *bb; + apr_bucket *e; + apr_off_t cl_val = 0; + apr_off_t bytes; + apr_off_t bytes_streamed = 0; + + if (old_cl_val) { + add_cl(p, bucket_alloc, header_brigade, old_cl_val); + cl_val = atol(old_cl_val); + } + terminate_headers(bucket_alloc, header_brigade); + + while (!APR_BUCKET_IS_EOS(APR_BRIGADE_FIRST(input_brigade))) + { + apr_brigade_length(input_brigade, 1, &bytes); + bytes_streamed += bytes; + + /* If this brigade contains EOS, either stop or remove it. */ + if (APR_BUCKET_IS_EOS(APR_BRIGADE_LAST(input_brigade))) { + seen_eos = 1; + + /* We can't pass this EOS to the output_filters. */ + e = APR_BRIGADE_LAST(input_brigade); + apr_bucket_delete(e); + } + + /* C-L < bytes streamed?!? + * We will error out after the body is completely + * consumed, but we can't stream more bytes at the + * back end since they would in part be interpreted + * as another request! If nothing is sent, then + * just send nothing. + * + * Prevents HTTP Response Splitting. + */ + if (bytes_streamed > cl_val) + continue; + + if (header_brigade) { + /* we never sent the header brigade, so go ahead and + * take care of that now + */ + bb = header_brigade; + + /* + * Save input_brigade in bb brigade. (At least) in the SSL case + * input_brigade contains transient buckets whose data would get + * overwritten during the next call of ap_get_brigade in the loop. + * ap_save_brigade ensures these buckets to be set aside. + * Calling ap_save_brigade with NULL as filter is OK, because + * bb brigade already has been created and does not need to get + * created by ap_save_brigade. + */ + status = ap_save_brigade(NULL, &bb, &input_brigade, p); + if (status != APR_SUCCESS) { + return status; + } + + header_brigade = NULL; + } + else { + bb = input_brigade; + } + + /* Once we hit EOS, we are ready to flush. */ + status = pass_brigade(bucket_alloc, r, p_conn, origin, bb, seen_eos); + if (status != APR_SUCCESS) { + return status; + } + + if (seen_eos) { + break; + } + + status = ap_get_brigade(r->input_filters, input_brigade, + AP_MODE_READBYTES, APR_BLOCK_READ, + HUGE_STRING_LEN); + + if (status != APR_SUCCESS) { + return status; + } + } + + if (bytes_streamed != cl_val) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server, + "proxy: client %s given Content-Length did not match" + " number of body bytes read", r->connection->remote_ip); + return APR_EOF; + } + + if (header_brigade) { + /* we never sent the header brigade since there was no request + * body; send it now with the flush flag + */ + bb = header_brigade; + status = pass_brigade(bucket_alloc, r, p_conn, origin, bb, 1); + } + return status; +} + +#define MAX_MEM_SPOOL 16384 + +static apr_status_t spool_reqbody_cl(apr_pool_t *p, + request_rec *r, + proxy_http_conn_t *p_conn, + conn_rec *origin, + apr_bucket_brigade *header_brigade, + apr_bucket_brigade *input_brigade, + int force_cl) +{ + int seen_eos = 0; + apr_status_t status; + apr_bucket_alloc_t *bucket_alloc = r->connection->bucket_alloc; + apr_bucket_brigade *body_brigade; + apr_bucket *e; + apr_off_t bytes, bytes_spooled = 0, fsize = 0; + apr_file_t *tmpfile = NULL; + + body_brigade = apr_brigade_create(p, bucket_alloc); + + while (!APR_BUCKET_IS_EOS(APR_BRIGADE_FIRST(input_brigade))) + { + /* If this brigade contains EOS, either stop or remove it. */ + if (APR_BUCKET_IS_EOS(APR_BRIGADE_LAST(input_brigade))) { + seen_eos = 1; + + /* We can't pass this EOS to the output_filters. */ + e = APR_BRIGADE_LAST(input_brigade); + apr_bucket_delete(e); + } + + apr_brigade_length(input_brigade, 1, &bytes); + + if (bytes_spooled + bytes > MAX_MEM_SPOOL) { + /* can't spool any more in memory; write latest brigade to disk */ + if (tmpfile == NULL) { + const char *temp_dir; + char *template; + + status = apr_temp_dir_get(&temp_dir, p); + if (status != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, status, r->server, + "proxy: search for temporary directory failed"); + return status; + } + apr_filepath_merge(&template, temp_dir, + "modproxy.tmp.XXXXXX", + APR_FILEPATH_NATIVE, p); + status = apr_file_mktemp(&tmpfile, template, 0, p); + if (status != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, status, r->server, + "proxy: creation of temporary file in directory %s failed", + temp_dir); + return status; + } + } + for (e = APR_BRIGADE_FIRST(input_brigade); + e != APR_BRIGADE_SENTINEL(input_brigade); + e = APR_BUCKET_NEXT(e)) { + const char *data; + apr_size_t bytes_read, bytes_written; + + apr_bucket_read(e, &data, &bytes_read, APR_BLOCK_READ); + status = apr_file_write_full(tmpfile, data, bytes_read, &bytes_written); + if (status != APR_SUCCESS) { + const char *tmpfile_name; + + if (apr_file_name_get(&tmpfile_name, tmpfile) != APR_SUCCESS) { + tmpfile_name = "(unknown)"; + } + ap_log_error(APLOG_MARK, APLOG_ERR, status, r->server, + "proxy: write to temporary file %s failed", + tmpfile_name); + return status; + } + AP_DEBUG_ASSERT(bytes_read == bytes_written); + fsize += bytes_written; + } + apr_brigade_cleanup(input_brigade); + } + else { + + /* + * Save input_brigade in body_brigade. (At least) in the SSL case + * input_brigade contains transient buckets whose data would get + * overwritten during the next call of ap_get_brigade in the loop. + * ap_save_brigade ensures these buckets to be set aside. + * Calling ap_save_brigade with NULL as filter is OK, because + * body_brigade already has been created and does not need to get + * created by ap_save_brigade. + */ + status = ap_save_brigade(NULL, &body_brigade, &input_brigade, p); + if (status != APR_SUCCESS) { + return status; + } + + } + + bytes_spooled += bytes; + + if (seen_eos) { + break; + } + + status = ap_get_brigade(r->input_filters, input_brigade, + AP_MODE_READBYTES, APR_BLOCK_READ, + HUGE_STRING_LEN); + + if (status != APR_SUCCESS) { + return status; + } + } + + if (bytes_spooled || force_cl) { + add_cl(p, bucket_alloc, header_brigade, apr_off_t_toa(p, bytes_spooled)); + } + terminate_headers(bucket_alloc, header_brigade); + APR_BRIGADE_CONCAT(header_brigade, body_brigade); + if (tmpfile) { + /* For platforms where the size of the file may be larger than + * that which can be stored in a single bucket (where the + * length field is an apr_size_t), split it into several + * buckets: */ + if (sizeof(apr_off_t) > sizeof(apr_size_t) + && fsize > AP_MAX_SENDFILE) { + e = apr_bucket_file_create(tmpfile, 0, AP_MAX_SENDFILE, p, + bucket_alloc); + while (fsize > AP_MAX_SENDFILE) { + apr_bucket *ce; + apr_bucket_copy(e, &ce); + APR_BRIGADE_INSERT_TAIL(header_brigade, ce); + e->start += AP_MAX_SENDFILE; + fsize -= AP_MAX_SENDFILE; + } + e->length = (apr_size_t)fsize; /* Resize just the last bucket */ + } + else { + e = apr_bucket_file_create(tmpfile, 0, (apr_size_t)fsize, p, + bucket_alloc); + } + APR_BRIGADE_INSERT_TAIL(header_brigade, e); + } + /* This is all a single brigade, pass with flush flagged */ + status = pass_brigade(bucket_alloc, r, p_conn, origin, header_brigade, 1); + return status; +} + +static +apr_status_t ap_proxy_http_request(apr_pool_t *p, request_rec *r, + proxy_http_conn_t *p_conn, conn_rec *origin, + proxy_server_conf *conf, + apr_uri_t *uri, + char *url, + apr_bucket_brigade *header_brigade, + char *server_portstr) +{ + conn_rec *c = r->connection; + apr_bucket_alloc_t *bucket_alloc = c->bucket_alloc; + apr_bucket_brigade *input_brigade; + apr_bucket_brigade *temp_brigade; + apr_bucket *e; + char *buf; + const apr_array_header_t *headers_in_array; + const apr_table_entry_t *headers_in; + int counter; + apr_status_t status; + enum rb_methods {RB_INIT, RB_STREAM_CL, RB_STREAM_CHUNKED, RB_SPOOL_CL}; + enum rb_methods rb_method = RB_INIT; + const char *old_cl_val = NULL; + const char *old_te_val = NULL; + apr_off_t bytes_read = 0; + apr_off_t bytes; + int force10; + + /* + * Send the HTTP/1.1 request to the remote server + */ + + /* strip connection listed hop-by-hop headers from the request */ + /* even though in theory a connection: close coming from the client + * should not affect the connection to the server, it's unlikely + * that subsequent client requests will hit this thread/process, + * so we cancel server keepalive if the client does. + */ + if (ap_proxy_liststr(apr_table_get(r->headers_in, + "Connection"), "close")) { + p_conn->close++; + /* XXX: we are abusing r->headers_in rather than a copy, + * give the core output handler a clue the client would + * rather just close. + */ + c->keepalive = AP_CONN_CLOSE; + } + ap_proxy_clear_connection(p, r->headers_in); + + if (apr_table_get(r->subprocess_env, "force-proxy-request-1.0")) { + buf = apr_pstrcat(p, r->method, " ", url, " HTTP/1.0" CRLF, NULL); + force10 = 1; + p_conn->close++; + } else { + buf = apr_pstrcat(p, r->method, " ", url, " HTTP/1.1" CRLF, NULL); + force10 = 0; + } + if (apr_table_get(r->subprocess_env, "proxy-nokeepalive")) { + origin->keepalive = AP_CONN_CLOSE; + p_conn->close++; + } + ap_xlate_proto_to_ascii(buf, strlen(buf)); + e = apr_bucket_pool_create(buf, strlen(buf), p, c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(header_brigade, e); + if (conf->preserve_host == 0) { + if (uri->port_str && uri->port != DEFAULT_HTTP_PORT) { + buf = apr_pstrcat(p, "Host: ", uri->hostname, ":", uri->port_str, + CRLF, NULL); + } else { + buf = apr_pstrcat(p, "Host: ", uri->hostname, CRLF, NULL); + } + } + else { + /* don't want to use r->hostname, as the incoming header might have a + * port attached + */ + const char* hostname = apr_table_get(r->headers_in,"Host"); + if (!hostname) { + hostname = r->server->server_hostname; + ap_log_rerror(APLOG_MARK, APLOG_WARNING, 0, r, + "proxy: no HTTP 0.9 request (with no host line) " + "on incoming request and preserve host set " + "forcing hostname to be %s for uri %s", + hostname, + r->uri ); + } + buf = apr_pstrcat(p, "Host: ", hostname, CRLF, NULL); + } + ap_xlate_proto_to_ascii(buf, strlen(buf)); + e = apr_bucket_pool_create(buf, strlen(buf), p, c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(header_brigade, e); + + /* handle Via */ + if (conf->viaopt == via_block) { + /* Block all outgoing Via: headers */ + apr_table_unset(r->headers_in, "Via"); + } else if (conf->viaopt != via_off) { + const char *server_name = ap_get_server_name(r); + /* If USE_CANONICAL_NAME_OFF was configured for the proxy virtual host, + * then the server name returned by ap_get_server_name() is the + * origin server name (which does make too much sense with Via: headers) + * so we use the proxy vhost's name instead. + */ + if (server_name == r->hostname) + server_name = r->server->server_hostname; + /* Create a "Via:" request header entry and merge it */ + /* Generate outgoing Via: header with/without server comment: */ + apr_table_mergen(r->headers_in, "Via", + (conf->viaopt == via_full) + ? apr_psprintf(p, "%d.%d %s%s (%s)", + HTTP_VERSION_MAJOR(r->proto_num), + HTTP_VERSION_MINOR(r->proto_num), + server_name, server_portstr, + AP_SERVER_BASEVERSION) + : apr_psprintf(p, "%d.%d %s%s", + HTTP_VERSION_MAJOR(r->proto_num), + HTTP_VERSION_MINOR(r->proto_num), + server_name, server_portstr) + ); + } + + /* X-Forwarded-*: handling + * + * XXX Privacy Note: + * ----------------- + * + * These request headers are only really useful when the mod_proxy + * is used in a reverse proxy configuration, so that useful info + * about the client can be passed through the reverse proxy and on + * to the backend server, which may require the information to + * function properly. + * + * In a forward proxy situation, these options are a potential + * privacy violation, as information about clients behind the proxy + * are revealed to arbitrary servers out there on the internet. + * + * The HTTP/1.1 Via: header is designed for passing client + * information through proxies to a server, and should be used in + * a forward proxy configuation instead of X-Forwarded-*. See the + * ProxyVia option for details. + */ + + if (PROXYREQ_REVERSE == r->proxyreq) { + const char *buf; + + /* Add X-Forwarded-For: so that the upstream has a chance to + * determine, where the original request came from. + */ + apr_table_mergen(r->headers_in, "X-Forwarded-For", + r->connection->remote_ip); + + /* Add X-Forwarded-Host: so that upstream knows what the + * original request hostname was. + */ + if ((buf = apr_table_get(r->headers_in, "Host"))) { + apr_table_mergen(r->headers_in, "X-Forwarded-Host", buf); + } + + /* Add X-Forwarded-Server: so that upstream knows what the + * name of this proxy server is (if there are more than one) + * XXX: This duplicates Via: - do we strictly need it? + */ + apr_table_mergen(r->headers_in, "X-Forwarded-Server", + r->server->server_hostname); + } + + /* send request headers */ + proxy_run_fixups(r); + headers_in_array = apr_table_elts(r->headers_in); + headers_in = (const apr_table_entry_t *) headers_in_array->elts; + for (counter = 0; counter < headers_in_array->nelts; counter++) { + if (headers_in[counter].key == NULL + || headers_in[counter].val == NULL + + /* Already sent */ + || !strcasecmp(headers_in[counter].key, "Host") + + /* Clear out hop-by-hop request headers not to send + * RFC2616 13.5.1 says we should strip these headers + */ + || !strcasecmp(headers_in[counter].key, "Keep-Alive") + || !strcasecmp(headers_in[counter].key, "TE") + || !strcasecmp(headers_in[counter].key, "Trailer") + || !strcasecmp(headers_in[counter].key, "Upgrade") + + /* XXX: @@@ FIXME: "Proxy-Authorization" should *only* be + * suppressed if THIS server requested the authentication, + * not when a frontend proxy requested it! + * + * The solution to this problem is probably to strip out + * the Proxy-Authorisation header in the authorisation + * code itself, not here. This saves us having to signal + * somehow whether this request was authenticated or not. + */ + || !strcasecmp(headers_in[counter].key,"Proxy-Authorization") + || !strcasecmp(headers_in[counter].key,"Proxy-Authenticate")) { + continue; + } + + /* Skip Transfer-Encoding and Content-Length for now. + */ + if (!strcasecmp(headers_in[counter].key, "Transfer-Encoding")) { + old_te_val = headers_in[counter].val; + continue; + } + if (!strcasecmp(headers_in[counter].key, "Content-Length")) { + old_cl_val = headers_in[counter].val; + continue; + } + + /* for sub-requests, ignore freshness/expiry headers */ + if (r->main) { + if ( !strcasecmp(headers_in[counter].key, "If-Match") + || !strcasecmp(headers_in[counter].key, "If-Modified-Since") + || !strcasecmp(headers_in[counter].key, "If-Range") + || !strcasecmp(headers_in[counter].key, "If-Unmodified-Since") + || !strcasecmp(headers_in[counter].key, "If-None-Match")) { + continue; + } + } + + buf = apr_pstrcat(p, headers_in[counter].key, ": ", + headers_in[counter].val, CRLF, + NULL); + ap_xlate_proto_to_ascii(buf, strlen(buf)); + e = apr_bucket_pool_create(buf, strlen(buf), p, c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(header_brigade, e); + } + + /* We have headers, let's figure out our request body... */ + input_brigade = apr_brigade_create(p, bucket_alloc); + + /* sub-requests never use keepalives, and mustn't pass request bodies. + * Because the new logic looks at input_brigade, we will self-terminate + * input_brigade and jump past all of the request body logic... + * Reading anything with ap_get_brigade is likely to consume the + * main request's body or read beyond EOS - which would be unplesant. + */ + if (r->main) { + p_conn->close++; + if (old_cl_val) { + old_cl_val = NULL; + apr_table_unset(r->headers_in, "Content-Length"); + } + if (old_te_val) { + old_te_val = NULL; + apr_table_unset(r->headers_in, "Transfer-Encoding"); + } + rb_method = RB_STREAM_CL; + e = apr_bucket_eos_create(input_brigade->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(input_brigade, e); + goto skip_body; + } + + /* WE only understand chunked. Other modules might inject + * (and therefore, decode) other flavors but we don't know + * that the can and have done so unless they they remove + * their decoding from the headers_in T-E list. + * XXX: Make this extensible, but in doing so, presume the + * encoding has been done by the extensions' handler, and + * do not modify add_te_chunked's logic + */ + if (old_te_val && strcmp(old_te_val, "chunked") != 0) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server, + "proxy: %s Transfer-Encoding is not supported", + old_te_val); + return APR_EINVAL; + } + + if (old_cl_val && old_te_val) { + ap_log_error(APLOG_MARK, APLOG_DEBUG, APR_ENOTIMPL, r->server, + "proxy: client %s (%s) requested Transfer-Encoding body" + " with Content-Length (C-L ignored)", + c->remote_ip, c->remote_host ? c->remote_host: ""); + apr_table_unset(r->headers_in, "Content-Length"); + old_cl_val = NULL; + origin->keepalive = AP_CONN_CLOSE; + p_conn->close++; + } + + /* Prefetch MAX_MEM_SPOOL bytes + * + * This helps us avoid any election of C-L v.s. T-E + * request bodies, since we are willing to keep in + * memory this much data, in any case. This gives + * us an instant C-L election if the body is of some + * reasonable size. + */ + temp_brigade = apr_brigade_create(p, bucket_alloc); + do { + status = ap_get_brigade(r->input_filters, temp_brigade, + AP_MODE_READBYTES, APR_BLOCK_READ, + MAX_MEM_SPOOL - bytes_read); + if (status != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, status, r->server, + "proxy: prefetch request body failed to %s" + " from %s (%s)", + p_conn->name ? p_conn->name: "", + c->remote_ip, c->remote_host ? c->remote_host: ""); + return status; + } + + apr_brigade_length(temp_brigade, 1, &bytes); + bytes_read += bytes; + + /* + * Save temp_brigade in input_brigade. (At least) in the SSL case + * temp_brigade contains transient buckets whose data would get + * overwritten during the next call of ap_get_brigade in the loop. + * ap_save_brigade ensures these buckets to be set aside. + * Calling ap_save_brigade with NULL as filter is OK, because + * input_brigade already has been created and does not need to get + * created by ap_save_brigade. + */ + status = ap_save_brigade(NULL, &input_brigade, &temp_brigade, p); + if (status != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, status, r->server, + "proxy: processing prefetched request body failed" + " to %s from %s (%s)", + p_conn->name ? p_conn->name: "", + c->remote_ip, c->remote_host ? c->remote_host: ""); + return status; + } + + /* Ensure we don't hit a wall where we have a buffer too small + * for ap_get_brigade's filters to fetch us another bucket, + * surrender once we hit 80 bytes less than MAX_MEM_SPOOL + * (an arbitrary value.) + */ + } while ((bytes_read < MAX_MEM_SPOOL - 80) + && !APR_BUCKET_IS_EOS(APR_BRIGADE_LAST(input_brigade))); + + /* Use chunked request body encoding or send a content-length body? + * + * Prefer C-L when: + * + * We have no request body (handled by RB_STREAM_CL) + * + * We have a request body length <= MAX_MEM_SPOOL + * + * The administrator has setenv force-proxy-request-1.0 + * + * The client sent a C-L body, and the administrator has + * not setenv proxy-sendchunked or has set setenv proxy-sendcl + * + * The client sent a T-E body, and the administrator has + * setenv proxy-sendcl, and not setenv proxy-sendchunked + * + * If both proxy-sendcl and proxy-sendchunked are set, the + * behavior is the same as if neither were set, large bodies + * that can't be read will be forwarded in their original + * form of C-L, or T-E. + * + * To ensure maximum compatibility, setenv proxy-sendcl + * To reduce server resource use, setenv proxy-sendchunked + * + * Then address specific servers with conditional setenv + * options to restore the default behavior where desireable. + * + * We have to compute content length by reading the entire request + * body; if request body is not small, we'll spool the remaining + * input to a temporary file. Chunked is always preferable. + * + * We can only trust the client-provided C-L if the T-E header + * is absent, and the filters are unchanged (the body won't + * be resized by another content filter). + */ + if (APR_BUCKET_IS_EOS(APR_BRIGADE_LAST(input_brigade))) { + /* The whole thing fit, so our decision is trivial, use + * the filtered bytes read from the client for the request + * body Content-Length. + * + * If we expected no body, and read no body, do not set + * the Content-Length. + */ + if (old_cl_val || old_te_val || bytes_read) { + old_cl_val = apr_off_t_toa(r->pool, bytes_read); + } + rb_method = RB_STREAM_CL; + } + else if (old_te_val) { + if (force10 + || (apr_table_get(r->subprocess_env, "proxy-sendcl") + && !apr_table_get(r->subprocess_env, "proxy-sendchunks") + && !apr_table_get(r->subprocess_env, "proxy-sendchunked"))) { + rb_method = RB_SPOOL_CL; + } + else { + rb_method = RB_STREAM_CHUNKED; + } + } + else if (old_cl_val) { + if (r->input_filters == r->proto_input_filters) { + rb_method = RB_STREAM_CL; + } + else if (!force10 + && (apr_table_get(r->subprocess_env, "proxy-sendchunks") + || apr_table_get(r->subprocess_env, "proxy-sendchunked")) + && !apr_table_get(r->subprocess_env, "proxy-sendcl")) { + rb_method = RB_STREAM_CHUNKED; + } + else { + rb_method = RB_SPOOL_CL; + } + } + else { + /* This is an appropriate default; very efficient for no-body + * requests, and has the behavior that it will not add any C-L + * when the old_cl_val is NULL. + */ + rb_method = RB_SPOOL_CL; + } + +/* Yes I hate gotos. This is the subrequest shortcut */ +skip_body: + /* Handle Connection: header */ + if (!force10 && p_conn->close) { + buf = apr_pstrdup(p, "Connection: close" CRLF); + ap_xlate_proto_to_ascii(buf, strlen(buf)); + e = apr_bucket_pool_create(buf, strlen(buf), p, c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(header_brigade, e); + } + + /* send the request body, if any. */ + switch(rb_method) { + case RB_STREAM_CHUNKED: + status = stream_reqbody_chunked(p, r, p_conn, origin, header_brigade, + input_brigade); + break; + case RB_STREAM_CL: + status = stream_reqbody_cl(p, r, p_conn, origin, header_brigade, + input_brigade, old_cl_val); + break; + case RB_SPOOL_CL: + status = spool_reqbody_cl(p, r, p_conn, origin, header_brigade, + input_brigade, (old_cl_val != NULL) + || (old_te_val != NULL) + || (bytes_read > 0)); + break; + default: + ap_assert(1 != 1); + break; + } + + if (status != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, status, r->server, + "proxy: pass request body failed to %pI (%s)" + " from %s (%s)", + p_conn->addr, p_conn->name ? p_conn->name: "", + c->remote_ip, c->remote_host ? c->remote_host: ""); + return status; + } + + return APR_SUCCESS; +} + +static int addit_dammit(void *v, const char *key, const char *val) +{ + apr_table_addn(v, key, val); + return 1; +} + +/* + * Limit the number of interim respones we sent back to the client. Otherwise + * we suffer from a memory build up. Besides there is NO sense in sending back + * an unlimited number of interim responses to the client. Thus if we cross + * this limit send back a 502 (Bad Gateway). + */ +#ifndef AP_MAX_INTERIM_RESPONSES +#define AP_MAX_INTERIM_RESPONSES 10 +#endif + +static +apr_status_t ap_proxy_http_process_response(apr_pool_t * p, request_rec *r, + proxy_http_conn_t *p_conn, + conn_rec *origin, + proxy_conn_rec *backend, + proxy_server_conf *conf, + apr_bucket_brigade *bb, + char *server_portstr) { + conn_rec *c = r->connection; + char buffer[HUGE_STRING_LEN]; + const char *buf; + char keepchar; + request_rec *rp; + apr_bucket *e; + apr_table_t *save_table; + int len, backasswards; + int received_continue = 1; /* flag to indicate if we should + * loop over response parsing logic + * in the case that the origin told us + * to HTTP_CONTINUE + */ + + /* Get response from the remote server, and pass it up the + * filter chain + */ + + rp = ap_proxy_make_fake_req(origin, r); + /* In case anyone needs to know, this is a fake request that is really a + * response. + */ + rp->proxyreq = PROXYREQ_RESPONSE; + + while (received_continue && (received_continue <= AP_MAX_INTERIM_RESPONSES)) { + apr_brigade_cleanup(bb); + + len = ap_getline(buffer, sizeof(buffer), rp, 0); + if (len == 0) { + /* handle one potential stray CRLF */ + len = ap_getline(buffer, sizeof(buffer), rp, 0); + } + if (len <= 0) { + apr_socket_close(p_conn->sock); + backend->connection = NULL; + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "proxy: error reading status line from remote " + "server %s", p_conn->name); + return ap_proxyerror(r, HTTP_BAD_GATEWAY, + "Error reading from remote server"); + } + + /* Is it an HTTP/1 response? + * This is buggy if we ever see an HTTP/1.10 + */ + if (apr_date_checkmask(buffer, "HTTP/#.# ###*")) { + int major, minor; + + if (2 != sscanf(buffer, "HTTP/%u.%u", &major, &minor)) { + major = 1; + minor = 1; + } + /* If not an HTTP/1 message or + * if the status line was > 8192 bytes + */ + else if ((buffer[5] != '1') || (len >= sizeof(buffer)-1)) { + apr_socket_close(p_conn->sock); + backend->connection = NULL; + return ap_proxyerror(r, HTTP_BAD_GATEWAY, + apr_pstrcat(p, "Corrupt status line returned by remote " + "server: ", buffer, NULL)); + } + backasswards = 0; + + keepchar = buffer[12]; + buffer[12] = '\0'; + r->status = atoi(&buffer[9]); + + if (keepchar != '\0') { + buffer[12] = keepchar; + } else { + /* 2616 requires the space in Status-Line; the origin + * server may have sent one but ap_rgetline_core will + * have stripped it. */ + buffer[12] = ' '; + buffer[13] = '\0'; + } + r->status_line = apr_pstrdup(p, &buffer[9]); + + /* read the headers. */ + /* N.B. for HTTP/1.0 clients, we have to fold line-wrapped headers*/ + /* Also, take care with headers with multiple occurences. */ + + /* First, tuck away all already existing cookies */ + save_table = apr_table_make(r->pool, 2); + apr_table_do(addit_dammit, save_table, r->headers_out, + "Set-Cookie", NULL); + + r->headers_out = ap_proxy_read_headers(r, rp, buffer, + sizeof(buffer), origin); + if (r->headers_out == NULL) { + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, + r->server, "proxy: bad HTTP/%d.%d header " + "returned by %s (%s)", major, minor, r->uri, + r->method); + p_conn->close += 1; + /* + * ap_send_error relies on a headers_out to be present. we + * are in a bad position here.. so force everything we send out + * to have nothing to do with the incoming packet + */ + r->headers_out = apr_table_make(r->pool,1); + r->status = HTTP_BAD_GATEWAY; + r->status_line = "bad gateway"; + return r->status; + } + + /* Now, add in the just read cookies */ + apr_table_do(addit_dammit, save_table, r->headers_out, + "Set-Cookie", NULL); + + /* and now load 'em all in */ + if (!apr_is_empty_table(save_table)) { + apr_table_unset(r->headers_out, "Set-Cookie"); + r->headers_out = apr_table_overlay(r->pool, + r->headers_out, + save_table); + } + + /* can't have both Content-Length and Transfer-Encoding */ + if (apr_table_get(r->headers_out, "Transfer-Encoding") + && apr_table_get(r->headers_out, "Content-Length")) { + /* 2616 section 4.4, point 3: "if both Transfer-Encoding + * and Content-Length are received, the latter MUST be + * ignored"; so unset it here to prevent any confusion + * later. */ + apr_table_unset(r->headers_out, "Content-Length"); + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, + r->server, + "proxy: server %s returned Transfer-Encoding and Content-Length", + p_conn->name); + p_conn->close += 1; + } + + /* strip connection listed hop-by-hop headers from response */ + p_conn->close += ap_proxy_liststr(apr_table_get(r->headers_out, + "Connection"), + "close"); + ap_proxy_clear_connection(p, r->headers_out); + if ((buf = apr_table_get(r->headers_out, "Content-Type"))) { + ap_set_content_type(r, apr_pstrdup(p, buf)); + } + if (!ap_is_HTTP_INFO(r->status)) { + ap_proxy_pre_http_request(origin, rp); + } + + /* handle Via header in response */ + if (conf->viaopt != via_off && conf->viaopt != via_block) { + const char *server_name = ap_get_server_name(r); + /* If USE_CANONICAL_NAME_OFF was configured for the proxy virtual host, + * then the server name returned by ap_get_server_name() is the + * origin server name (which does make too much sense with Via: headers) + * so we use the proxy vhost's name instead. + */ + if (server_name == r->hostname) + server_name = r->server->server_hostname; + + /* create a "Via:" response header entry and merge it */ + apr_table_mergen(r->headers_out, "Via", + (conf->viaopt == via_full) + ? apr_psprintf(p, "%d.%d %s%s (%s)", + HTTP_VERSION_MAJOR(r->proto_num), + HTTP_VERSION_MINOR(r->proto_num), + server_name, + server_portstr, + AP_SERVER_BASEVERSION) + : apr_psprintf(p, "%d.%d %s%s", + HTTP_VERSION_MAJOR(r->proto_num), + HTTP_VERSION_MINOR(r->proto_num), + server_name, + server_portstr) + ); + } + + /* cancel keepalive if HTTP/1.0 or less */ + if ((major < 1) || (minor < 1)) { + p_conn->close += 1; + origin->keepalive = AP_CONN_CLOSE; + } + } else { + /* an http/0.9 response */ + backasswards = 1; + r->status = 200; + r->status_line = "200 OK"; + p_conn->close += 1; + } + + if ( r->status != HTTP_CONTINUE ) { + received_continue = 0; + } else { + received_continue++; + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, NULL, + "proxy: HTTP: received 100 CONTINUE"); + } + + /* we must accept 3 kinds of date, but generate only 1 kind of date */ + if ((buf = apr_table_get(r->headers_out, "Date")) != NULL) { + apr_table_set(r->headers_out, "Date", + ap_proxy_date_canon(p, buf)); + } + if ((buf = apr_table_get(r->headers_out, "Expires")) != NULL) { + apr_table_set(r->headers_out, "Expires", + ap_proxy_date_canon(p, buf)); + } + if ((buf = apr_table_get(r->headers_out, "Last-Modified")) != NULL) { + apr_table_set(r->headers_out, "Last-Modified", + ap_proxy_date_canon(p, buf)); + } + + /* munge the Location and URI response headers according to + * ProxyPassReverse + */ + if ((buf = apr_table_get(r->headers_out, "Location")) != NULL) { + apr_table_set(r->headers_out, "Location", + ap_proxy_location_reverse_map(r, conf, buf)); + } + if ((buf = apr_table_get(r->headers_out, "Content-Location")) != NULL) { + apr_table_set(r->headers_out, "Content-Location", + ap_proxy_location_reverse_map(r, conf, buf)); + } + if ((buf = apr_table_get(r->headers_out, "URI")) != NULL) { + apr_table_set(r->headers_out, "URI", + ap_proxy_location_reverse_map(r, conf, buf)); + } + + if ((r->status == 401) && (conf->error_override != 0)) { + const char *wa = "WWW-Authenticate"; + if ((buf = apr_table_get(r->headers_out, wa))) { + apr_table_set(r->err_headers_out, wa, buf); + } else { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: origin server sent 401 without WWW-Authenticate header"); + } + } + + r->sent_bodyct = 1; + /* Is it an HTTP/0.9 response? If so, send the extra data */ + if (backasswards) { + apr_ssize_t cntr = len; + e = apr_bucket_heap_create(buffer, cntr, NULL, c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, e); + } + + /* send body - but only if a body is expected */ + if ((!r->header_only) && /* not HEAD request */ + (r->status > 199) && /* not any 1xx response */ + (r->status != HTTP_NO_CONTENT) && /* not 204 */ + (r->status != HTTP_RESET_CONTENT) && /* not 205 */ + (r->status != HTTP_NOT_MODIFIED)) { /* not 304 */ + + /* We need to copy the output headers and treat them as input + * headers as well. BUT, we need to do this before we remove + * TE, so that they are preserved accordingly for + * ap_http_filter to know where to end. + */ + rp->headers_in = apr_table_copy(r->pool, r->headers_out); + + apr_table_unset(r->headers_out,"Transfer-Encoding"); + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: start body send"); + + /* + * if we are overriding the errors, we can't put the content + * of the page into the brigade + */ + if ( (conf->error_override ==0) || r->status < 400 ) { + + /* read the body, pass it to the output filters */ + int finish = FALSE; + while (ap_get_brigade(rp->input_filters, + bb, + AP_MODE_READBYTES, + APR_BLOCK_READ, + conf->io_buffer_size) == APR_SUCCESS) { +#if DEBUGGING + { + apr_off_t readbytes; + apr_brigade_length(bb, 0, &readbytes); + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, + r->server, "proxy (PID %d): readbytes: %#x", + getpid(), readbytes); + } +#endif + /* sanity check */ + if (APR_BRIGADE_EMPTY(bb)) { + apr_brigade_cleanup(bb); + break; + } + + /* found the last brigade? */ + if (APR_BUCKET_IS_EOS(APR_BRIGADE_LAST(bb))) { + /* if this is the last brigade, cleanup the + * backend connection first to prevent the + * backend server from hanging around waiting + * for a slow client to eat these bytes + */ + ap_proxy_http_cleanup(r, p_conn, backend); + /* signal that we must leave */ + finish = TRUE; + } + + /* try send what we read */ + if (ap_pass_brigade(r->output_filters, bb) != APR_SUCCESS + || c->aborted) { + /* Ack! Phbtt! Die! User aborted! */ + p_conn->close = 1; /* this causes socket close below */ + finish = TRUE; + } + + /* make sure we always clean up after ourselves */ + apr_brigade_cleanup(bb); + + /* if we are done, leave */ + if (TRUE == finish) { + break; + } + } + } + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: end body send"); + } else { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: header only"); + } + } + + /* See define of AP_MAX_INTERIM_RESPONSES for why */ + if (received_continue > AP_MAX_INTERIM_RESPONSES) { + return ap_proxyerror(r, HTTP_BAD_GATEWAY, + apr_psprintf(p, + "Too many (%d) interim responses from origin server", + received_continue)); + } + + if ( conf->error_override ) { + /* the code above this checks for 'OK' which is what the hook expects */ + if ( r->status == HTTP_OK ) + return OK; + else { + /* clear r->status for override error, otherwise ErrorDocument + * thinks that this is a recursive error, and doesn't find the + * custom error page + */ + int status = r->status; + r->status = HTTP_OK; + /* Discard body, if one is expected */ + if ((status > 199) && /* not any 1xx response */ + (status != HTTP_NO_CONTENT) && /* not 204 */ + (status != HTTP_RESET_CONTENT) && /* not 205 */ + (status != HTTP_NOT_MODIFIED)) { /* not 304 */ + ap_discard_request_body(rp); + } + return status; + } + } else + return OK; +} + +static +apr_status_t ap_proxy_http_cleanup(request_rec *r, proxy_http_conn_t *p_conn, + proxy_conn_rec *backend) { + /* If there are no KeepAlives, or if the connection has been signalled + * to close, close the socket and clean up + */ + + /* if the connection is < HTTP/1.1, or Connection: close, + * we close the socket, otherwise we leave it open for KeepAlive support + */ + if (p_conn->close || (r->proto_num < HTTP_VERSION(1,1))) { + if (p_conn->sock) { + apr_socket_close(p_conn->sock); + p_conn->sock = NULL; + backend->connection = NULL; + } + } + return OK; +} + +/* + * This handles http:// URLs, and other URLs using a remote proxy over http + * If proxyhost is NULL, then contact the server directly, otherwise + * go via the proxy. + * Note that if a proxy is used, then URLs other than http: can be accessed, + * also, if we have trouble which is clearly specific to the proxy, then + * we return DECLINED so that we can try another proxy. (Or the direct + * route.) + */ +int ap_proxy_http_handler(request_rec *r, proxy_server_conf *conf, + char *url, const char *proxyname, + apr_port_t proxyport) +{ + int status; + char server_portstr[32]; + conn_rec *origin = NULL; + proxy_conn_rec *backend = NULL; + int is_ssl = 0; + + /* Note: Memory pool allocation. + * A downstream keepalive connection is always connected to the existence + * (or not) of an upstream keepalive connection. If this is not done then + * load balancing against multiple backend servers breaks (one backend + * server ends up taking 100% of the load), and the risk is run of + * downstream keepalive connections being kept open unnecessarily. This + * keeps webservers busy and ties up resources. + * + * As a result, we allocate all sockets out of the upstream connection + * pool, and when we want to reuse a socket, we check first whether the + * connection ID of the current upstream connection is the same as that + * of the connection when the socket was opened. + */ + apr_pool_t *p = r->connection->pool; + conn_rec *c = r->connection; + apr_bucket_brigade *bb = apr_brigade_create(p, c->bucket_alloc); + apr_uri_t *uri = apr_palloc(r->connection->pool, sizeof(*uri)); + proxy_http_conn_t *p_conn = apr_pcalloc(r->connection->pool, + sizeof(*p_conn)); + + /* is it for us? */ + if (strncasecmp(url, "https:", 6) == 0) { + if (!ap_proxy_ssl_enable(NULL)) { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: HTTPS: declining URL %s" + " (mod_ssl not configured?)", url); + return DECLINED; + } + is_ssl = 1; + } + else if (!(strncasecmp(url, "http:", 5)==0 || (strncasecmp(url, "ftp:", 4)==0 && proxyname))) { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: HTTP: declining URL %s", url); + return DECLINED; /* only interested in HTTP, or FTP via proxy */ + } + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: HTTP: serving URL %s", url); + + + /* only use stored info for top-level pages. Sub requests don't share + * in keepalives + */ + if (!r->main) { + backend = (proxy_conn_rec *) ap_get_module_config(c->conn_config, + &proxy_http_module); + } + /* create space for state information */ + if (!backend) { + backend = apr_pcalloc(c->pool, sizeof(proxy_conn_rec)); + backend->connection = NULL; + backend->hostname = NULL; + backend->port = 0; + if (!r->main) { + ap_set_module_config(c->conn_config, &proxy_http_module, backend); + } + } + + backend->is_ssl = is_ssl; + + /* Step One: Determine Who To Connect To */ + status = ap_proxy_http_determine_connection(p, r, p_conn, c, conf, uri, + &url, proxyname, proxyport, + server_portstr, + sizeof(server_portstr)); + if ( status != OK ) { + return status; + } + + /* Step Two: Make the Connection */ + status = ap_proxy_http_create_connection(p, r, p_conn, c, &origin, backend, + conf, proxyname); + if ( status != OK ) { + return status; + } + + /* Step Three: Send the Request */ + status = ap_proxy_http_request(p, r, p_conn, origin, conf, uri, url, bb, + server_portstr); + if ( status != OK ) { + return status; + } + + /* Step Four: Receive the Response */ + status = ap_proxy_http_process_response(p, r, p_conn, origin, backend, conf, + bb, server_portstr); + if ( status != OK ) { + /* clean up even if there is an error */ + ap_proxy_http_cleanup(r, p_conn, backend); + return status; + } + + /* Step Five: Clean Up */ + status = ap_proxy_http_cleanup(r, p_conn, backend); + if ( status != OK ) { + return status; + } + + return OK; +} + +static void ap_proxy_http_register_hook(apr_pool_t *p) +{ + proxy_hook_scheme_handler(ap_proxy_http_handler, NULL, NULL, APR_HOOK_FIRST); + proxy_hook_canon_handler(ap_proxy_http_canon, NULL, NULL, APR_HOOK_FIRST); +} + +module AP_MODULE_DECLARE_DATA proxy_http_module = { + STANDARD20_MODULE_STUFF, + NULL, /* create per-directory config structure */ + NULL, /* merge per-directory config structures */ + NULL, /* create per-server config structure */ + NULL, /* merge per-server config structures */ + NULL, /* command apr_table_t */ + ap_proxy_http_register_hook/* register hooks */ +}; + diff --git a/rubbos/app/httpd-2.0.64/modules/proxy/proxy_util.c b/rubbos/app/httpd-2.0.64/modules/proxy/proxy_util.c new file mode 100644 index 00000000..bab945f5 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/proxy/proxy_util.c @@ -0,0 +1,1120 @@ +/* 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. + */ + +/* Utility routines for Apache proxy */ +#include "mod_proxy.h" + + +static int proxy_match_ipaddr(struct dirconn_entry *This, request_rec *r); +static int proxy_match_domainname(struct dirconn_entry *This, request_rec *r); +static int proxy_match_hostname(struct dirconn_entry *This, request_rec *r); +static int proxy_match_word(struct dirconn_entry *This, request_rec *r); + +APR_IMPLEMENT_OPTIONAL_HOOK_RUN_ALL(proxy, PROXY, int, create_req, + (request_rec *r, request_rec *pr), (r, pr), + OK, DECLINED) + +/* already called in the knowledge that the characters are hex digits */ +PROXY_DECLARE(int) ap_proxy_hex2c(const char *x) +{ + int i, ch; + +#if !APR_CHARSET_EBCDIC + ch = x[0]; + if (apr_isdigit(ch)) + i = ch - '0'; + else if (apr_isupper(ch)) + i = ch - ('A' - 10); + else + i = ch - ('a' - 10); + i <<= 4; + + ch = x[1]; + if (apr_isdigit(ch)) + i += ch - '0'; + else if (apr_isupper(ch)) + i += ch - ('A' - 10); + else + i += ch - ('a' - 10); + return i; +#else /*APR_CHARSET_EBCDIC*/ + /* we assume that the hex value refers to an ASCII character + * so convert to EBCDIC so that it makes sense locally; + * + * example: + * + * client specifies %20 in URL to refer to a space char; + * at this point we're called with EBCDIC "20"; after turning + * EBCDIC "20" into binary 0x20, we then need to assume that 0x20 + * represents an ASCII char and convert 0x20 to EBCDIC, yielding + * 0x40 + */ + char buf[1]; + + if (1 == sscanf(x, "%2x", &i)) { + buf[0] = i & 0xFF; + ap_xlate_proto_from_ascii(buf, 1); + return buf[0]; + } + else { + return 0; + } +#endif /*APR_CHARSET_EBCDIC*/ +} + +PROXY_DECLARE(void) ap_proxy_c2hex(int ch, char *x) +{ +#if !APR_CHARSET_EBCDIC + int i; + + x[0] = '%'; + i = (ch & 0xF0) >> 4; + if (i >= 10) + x[1] = ('A' - 10) + i; + else + x[1] = '0' + i; + + i = ch & 0x0F; + if (i >= 10) + x[2] = ('A' - 10) + i; + else + x[2] = '0' + i; +#else /*APR_CHARSET_EBCDIC*/ + static const char ntoa[] = { "0123456789ABCDEF" }; + char buf[1]; + + ch &= 0xFF; + + buf[0] = ch; + ap_xlate_proto_to_ascii(buf, 1); + + x[0] = '%'; + x[1] = ntoa[(buf[0] >> 4) & 0x0F]; + x[2] = ntoa[buf[0] & 0x0F]; + x[3] = '\0'; +#endif /*APR_CHARSET_EBCDIC*/ +} + +/* + * canonicalise a URL-encoded string + */ + +/* + * Convert a URL-encoded string to canonical form. + * It decodes characters which need not be encoded, + * and encodes those which must be encoded, and does not touch + * those which must not be touched. + */ +PROXY_DECLARE(char *)ap_proxy_canonenc(apr_pool_t *p, const char *x, int len, enum enctype t, + int isenc) +{ + int i, j, ch; + char *y; + char *allowed; /* characters which should not be encoded */ + char *reserved; /* characters which much not be en/de-coded */ + +/* N.B. in addition to :@&=, this allows ';' in an http path + * and '?' in an ftp path -- this may be revised + * + * Also, it makes a '+' character in a search string reserved, as + * it may be form-encoded. (Although RFC 1738 doesn't allow this - + * it only permits ; / ? : @ = & as reserved chars.) + */ + if (t == enc_path) + allowed = "$-_.+!*'(),;:@&="; + else if (t == enc_search) + allowed = "$-_.!*'(),;:@&="; + else if (t == enc_user) + allowed = "$-_.+!*'(),;@&="; + else if (t == enc_fpath) + allowed = "$-_.+!*'(),?:@&="; + else /* if (t == enc_parm) */ + allowed = "$-_.+!*'(),?/:@&="; + + if (t == enc_path) + reserved = "/"; + else if (t == enc_search) + reserved = "+"; + else + reserved = ""; + + y = apr_palloc(p, 3 * len + 1); + + for (i = 0, j = 0; i < len; i++, j++) { +/* always handle '/' first */ + ch = x[i]; + if (strchr(reserved, ch)) { + y[j] = ch; + continue; + } +/* decode it if not already done */ + if (isenc && (isenc != PROXYREQ_REVERSE) && (ch == '%')) { + if (!apr_isxdigit(x[i + 1]) || !apr_isxdigit(x[i + 2])) + return NULL; + ch = ap_proxy_hex2c(&x[i + 1]); + i += 2; + if (ch != 0 && strchr(reserved, ch)) { /* keep it encoded */ + ap_proxy_c2hex(ch, &y[j]); + j += 2; + continue; + } + } +/* recode it, if necessary */ + if (!apr_isalnum(ch) && !strchr(allowed, ch)) { + ap_proxy_c2hex(ch, &y[j]); + j += 2; + } + else + y[j] = ch; + } + y[j] = '\0'; + return y; +} + +/* + * Parses network-location. + * urlp on input the URL; on output the path, after the leading / + * user NULL if no user/password permitted + * password holder for password + * host holder for host + * port port number; only set if one is supplied. + * + * Returns an error string. + */ +PROXY_DECLARE(char *) + ap_proxy_canon_netloc(apr_pool_t *p, char **const urlp, char **userp, + char **passwordp, char **hostp, apr_port_t *port) +{ + char *addr, *scope_id, *strp, *host, *url = *urlp; + char *user = NULL, *password = NULL; + apr_port_t tmp_port; + apr_status_t rv; + + if (url[0] != '/' || url[1] != '/') + return "Malformed URL"; + host = url + 2; + url = strchr(host, '/'); + if (url == NULL) + url = ""; + else + *(url++) = '\0'; /* skip seperating '/' */ + + /* find _last_ '@' since it might occur in user/password part */ + strp = strrchr(host, '@'); + + if (strp != NULL) { + *strp = '\0'; + user = host; + host = strp + 1; + +/* find password */ + strp = strchr(user, ':'); + if (strp != NULL) { + *strp = '\0'; + password = ap_proxy_canonenc(p, strp + 1, strlen(strp + 1), enc_user, 1); + if (password == NULL) + return "Bad %-escape in URL (password)"; + } + + user = ap_proxy_canonenc(p, user, strlen(user), enc_user, 1); + if (user == NULL) + return "Bad %-escape in URL (username)"; + } + if (userp != NULL) { + *userp = user; + } + if (passwordp != NULL) { + *passwordp = password; + } + + /* Parse the host string to separate host portion from optional port. + * Perform range checking on port. + */ + rv = apr_parse_addr_port(&addr, &scope_id, &tmp_port, host, p); + if (rv != APR_SUCCESS || addr == NULL || scope_id != NULL) { + return "Invalid host/port"; + } + if (tmp_port != 0) { /* only update caller's port if port was specified */ + *port = tmp_port; + } + + ap_str_tolower(addr); /* DNS names are case-insensitive */ + + *urlp = url; + *hostp = addr; + + return NULL; +} + +/* + * If the date is a valid RFC 850 date or asctime() date, then it + * is converted to the RFC 1123 format. + */ +PROXY_DECLARE(const char *) + ap_proxy_date_canon(apr_pool_t *p, const char *date) +{ + apr_status_t rv; + char* ndate; + + apr_time_t time = apr_date_parse_http(date); + if (!time) { + return date; + } + + ndate = apr_palloc(p, APR_RFC822_DATE_LEN); + rv = apr_rfc822_date(ndate, time); + if (rv != APR_SUCCESS) { + return date; + } + + return ndate; +} + +PROXY_DECLARE(request_rec *)ap_proxy_make_fake_req(conn_rec *c, request_rec *r) +{ + request_rec *rp = apr_pcalloc(c->pool, sizeof(*r)); + + rp->pool = c->pool; + rp->status = HTTP_OK; + + rp->headers_in = apr_table_make(c->pool, 50); + rp->subprocess_env = apr_table_make(c->pool, 50); + rp->headers_out = apr_table_make(c->pool, 12); + rp->err_headers_out = apr_table_make(c->pool, 5); + rp->notes = apr_table_make(c->pool, 5); + + rp->server = r->server; + rp->proxyreq = r->proxyreq; + rp->request_time = r->request_time; + rp->connection = c; + rp->output_filters = c->output_filters; + rp->input_filters = c->input_filters; + rp->proto_output_filters = c->output_filters; + rp->proto_input_filters = c->input_filters; + + rp->request_config = ap_create_request_config(c->pool); + proxy_run_create_req(r, rp); + + return rp; +} + +/* + * Reads headers from a buffer and returns an array of headers. + * Returns NULL on file error + * This routine tries to deal with too long lines and continuation lines. + * + * Note: Currently the headers are passed through unmerged. This has to be + * done so that headers which react badly to merging (such as Set-Cookie + * headers, which contain commas within the date field) do not get stuffed + * up. + */ +PROXY_DECLARE(apr_table_t *)ap_proxy_read_headers(request_rec *r, request_rec *rr, char *buffer, int size, conn_rec *c) +{ + apr_table_t *headers_out; + int len; + char *value, *end; + char field[MAX_STRING_LEN]; + int saw_headers = 0; + void *sconf = r->server->module_config; + proxy_server_conf *psc; + + psc = (proxy_server_conf *) ap_get_module_config(sconf, &proxy_module); + + headers_out = apr_table_make(r->pool, 20); + + /* + * Read header lines until we get the empty separator line, a read error, + * the connection closes (EOF), or we timeout. + */ + while ((len = ap_getline(buffer, size, rr, 1)) > 0) { + + if (!(value = strchr(buffer, ':'))) { /* Find the colon separator */ + + /* We may encounter invalid headers, usually from buggy + * MS IIS servers, so we need to determine just how to handle + * them. We can either ignore them, assume that they mark the + * start-of-body (eg: a missing CRLF) or (the default) mark + * the headers as totally bogus and return a 500. The sole + * exception is an extra "HTTP/1.0 200, OK" line sprinkled + * in between the usual MIME headers, which is a favorite + * IIS bug. + */ + /* XXX: The mask check is buggy if we ever see an HTTP/1.10 */ + + if (!apr_date_checkmask(buffer, "HTTP/#.# ###*")) { + if (psc->badopt == bad_error) { + /* Nope, it wasn't even an extra HTTP header. Give up. */ + return NULL; + } + else if (psc->badopt == bad_body) { + /* if we've already started loading headers_out, then + * return what we've accumulated so far, in the hopes + * that they are useful. Otherwise, we completely bail. + */ + /* FIXME: We've already scarfed the supposed 1st line of + * the body, so the actual content may end up being bogus + * as well. If the content is HTML, we may be lucky. + */ + if (saw_headers) { + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, r->server, + "proxy: Starting body due to bogus non-header in headers " + "returned by %s (%s)", r->uri, r->method); + return headers_out; + } else { + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, r->server, + "proxy: No HTTP headers " + "returned by %s (%s)", r->uri, r->method); + return NULL; + } + } + } + /* this is the psc->badopt == bad_ignore case */ + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, r->server, + "proxy: Ignoring bogus HTTP header " + "returned by %s (%s)", r->uri, r->method); + continue; + } + + *value = '\0'; + ++value; + /* XXX: RFC2068 defines only SP and HT as whitespace, this test is + * wrong... and so are many others probably. + */ + while (apr_isspace(*value)) + ++value; /* Skip to start of value */ + + /* should strip trailing whitespace as well */ + for (end = &value[strlen(value)-1]; end > value && apr_isspace(*end); --end) + *end = '\0'; + + /* make sure we add so as not to destroy duplicated headers */ + apr_table_add(headers_out, buffer, value); + saw_headers = 1; + + /* the header was too long; at the least we should skip extra data */ + if (len >= size - 1) { + while ((len = ap_getline(field, MAX_STRING_LEN, rr, 1)) + >= MAX_STRING_LEN - 1) { + /* soak up the extra data */ + } + if (len == 0) /* time to exit the larger loop as well */ + break; + } + } + return headers_out; +} + + +/* + * list is a comma-separated list of case-insensitive tokens, with + * optional whitespace around the tokens. + * The return returns 1 if the token val is found in the list, or 0 + * otherwise. + */ +PROXY_DECLARE(int) ap_proxy_liststr(const char *list, const char *val) +{ + int len, i; + const char *p; + + len = strlen(val); + + while (list != NULL) { + p = ap_strchr_c(list, ','); + if (p != NULL) { + i = p - list; + do + p++; + while (apr_isspace(*p)); + } + else + i = strlen(list); + + while (i > 0 && apr_isspace(list[i - 1])) + i--; + if (i == len && strncasecmp(list, val, len) == 0) + return 1; + list = p; + } + return 0; +} + +/* + * list is a comma-separated list of case-insensitive tokens, with + * optional whitespace around the tokens. + * if val appears on the list of tokens, it is removed from the list, + * and the new list is returned. + */ +PROXY_DECLARE(char *)ap_proxy_removestr(apr_pool_t *pool, const char *list, const char *val) +{ + int len, i; + const char *p; + char *new = NULL; + + len = strlen(val); + + while (list != NULL) { + p = ap_strchr_c(list, ','); + if (p != NULL) { + i = p - list; + do + p++; + while (apr_isspace(*p)); + } + else + i = strlen(list); + + while (i > 0 && apr_isspace(list[i - 1])) + i--; + if (i == len && strncasecmp(list, val, len) == 0) { + /* do nothing */ + } + else { + if (new) + new = apr_pstrcat(pool, new, ",", apr_pstrndup(pool, list, i), NULL); + else + new = apr_pstrndup(pool, list, i); + } + list = p; + } + return new; +} + +/* + * Converts 8 hex digits to a time integer + */ +PROXY_DECLARE(int) ap_proxy_hex2sec(const char *x) +{ + int i, ch; + unsigned int j; + + for (i = 0, j = 0; i < 8; i++) { + ch = x[i]; + j <<= 4; + if (apr_isdigit(ch)) + j |= ch - '0'; + else if (apr_isupper(ch)) + j |= ch - ('A' - 10); + else + j |= ch - ('a' - 10); + } + if (j == 0xffffffff) + return -1; /* so that it works with 8-byte ints */ + else + return j; +} + +/* + * Converts a time integer to 8 hex digits + */ +PROXY_DECLARE(void) ap_proxy_sec2hex(int t, char *y) +{ + int i, ch; + unsigned int j = t; + + for (i = 7; i >= 0; i--) { + ch = j & 0xF; + j >>= 4; + if (ch >= 10) + y[i] = ch + ('A' - 10); + else + y[i] = ch + '0'; + } + y[8] = '\0'; +} + +PROXY_DECLARE(int) ap_proxyerror(request_rec *r, int statuscode, const char *message) +{ + apr_table_setn(r->notes, "error-notes", + apr_pstrcat(r->pool, + "The proxy server could not handle the request " + "pool, r->uri), + "\">", ap_escape_html(r->pool, r->method), + " ", + ap_escape_html(r->pool, r->uri), ".

    \n" + "Reason: ", + ap_escape_html(r->pool, message), + "

    ", NULL)); + + /* Allow "error-notes" string to be printed by ap_send_error_response() */ + apr_table_setn(r->notes, "verbose-error-to", apr_pstrdup(r->pool, "*")); + + r->status_line = apr_psprintf(r->pool, "%3.3u Proxy Error", statuscode); + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "proxy: %s returned by %s", message, r->uri); + return statuscode; +} + +static const char * + proxy_get_host_of_request(request_rec *r) +{ + char *url, *user = NULL, *password = NULL, *err, *host; + apr_port_t port; + + if (r->hostname != NULL) + return r->hostname; + + /* Set url to the first char after "scheme://" */ + if ((url = strchr(r->uri, ':')) == NULL + || url[1] != '/' || url[2] != '/') + return NULL; + + url = apr_pstrdup(r->pool, &url[1]); /* make it point to "//", which is what proxy_canon_netloc expects */ + + err = ap_proxy_canon_netloc(r->pool, &url, &user, &password, &host, &port); + + if (err != NULL) + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "%s", err); + + r->hostname = host; + + return host; /* ought to return the port, too */ +} + +/* Return TRUE if addr represents an IP address (or an IP network address) */ +PROXY_DECLARE(int) ap_proxy_is_ipaddr(struct dirconn_entry *This, apr_pool_t *p) +{ + const char *addr = This->name; + long ip_addr[4]; + int i, quads; + long bits; + + /* if the address is given with an explicit netmask, use that */ + /* Due to a deficiency in apr_inet_addr(), it is impossible to parse */ + /* "partial" addresses (with less than 4 quads) correctly, i.e. */ + /* 192.168.123 is parsed as 192.168.0.123, which is not what I want. */ + /* I therefore have to parse the IP address manually: */ + /*if (proxy_readmask(This->name, &This->addr.s_addr, &This->mask.s_addr) == 0) */ + /* addr and mask were set by proxy_readmask() */ + /*return 1; */ + + /* Parse IP addr manually, optionally allowing */ + /* abbreviated net addresses like 192.168. */ + + /* Iterate over up to 4 (dotted) quads. */ + for (quads = 0; quads < 4 && *addr != '\0'; ++quads) { + char *tmp; + + if (*addr == '/' && quads > 0) /* netmask starts here. */ + break; + + if (!apr_isdigit(*addr)) + return 0; /* no digit at start of quad */ + + ip_addr[quads] = strtol(addr, &tmp, 0); + + if (tmp == addr) /* expected a digit, found something else */ + return 0; + + if (ip_addr[quads] < 0 || ip_addr[quads] > 255) { + /* invalid octet */ + return 0; + } + + addr = tmp; + + if (*addr == '.' && quads != 3) + ++addr; /* after the 4th quad, a dot would be illegal */ + } + + for (This->addr.s_addr = 0, i = 0; i < quads; ++i) + This->addr.s_addr |= htonl(ip_addr[i] << (24 - 8 * i)); + + if (addr[0] == '/' && apr_isdigit(addr[1])) { /* net mask follows: */ + char *tmp; + + ++addr; + + bits = strtol(addr, &tmp, 0); + + if (tmp == addr) /* expected a digit, found something else */ + return 0; + + addr = tmp; + + if (bits < 0 || bits > 32) /* netmask must be between 0 and 32 */ + return 0; + + } + else { + /* Determine (i.e., "guess") netmask by counting the */ + /* number of trailing .0's; reduce #quads appropriately */ + /* (so that 192.168.0.0 is equivalent to 192.168.) */ + while (quads > 0 && ip_addr[quads - 1] == 0) + --quads; + + /* "IP Address should be given in dotted-quad form, optionally followed by a netmask (e.g., 192.168.111.0/24)"; */ + if (quads < 1) + return 0; + + /* every zero-byte counts as 8 zero-bits */ + bits = 8 * quads; + + if (bits != 32) /* no warning for fully qualified IP address */ + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "Warning: NetMask not supplied with IP-Addr; guessing: %s/%ld", + inet_ntoa(This->addr), bits); + } + + This->mask.s_addr = htonl(APR_INADDR_NONE << (32 - bits)); + + if (*addr == '\0' && (This->addr.s_addr & ~This->mask.s_addr) != 0) { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "Warning: NetMask and IP-Addr disagree in %s/%ld", + inet_ntoa(This->addr), bits); + This->addr.s_addr &= This->mask.s_addr; + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + " Set to %s/%ld", + inet_ntoa(This->addr), bits); + } + + if (*addr == '\0') { + This->matcher = proxy_match_ipaddr; + return 1; + } + else + return (*addr == '\0'); /* okay iff we've parsed the whole string */ +} + +/* Return TRUE if addr represents an IP address (or an IP network address) */ +static int proxy_match_ipaddr(struct dirconn_entry *This, request_rec *r) +{ + int i, ip_addr[4]; + struct in_addr addr, *ip; + const char *host = proxy_get_host_of_request(r); + + if (host == NULL) /* oops! */ + return 0; + + memset(&addr, '\0', sizeof addr); + memset(ip_addr, '\0', sizeof ip_addr); + + if (4 == sscanf(host, "%d.%d.%d.%d", &ip_addr[0], &ip_addr[1], &ip_addr[2], &ip_addr[3])) { + for (addr.s_addr = 0, i = 0; i < 4; ++i) + addr.s_addr |= htonl(ip_addr[i] << (24 - 8 * i)); + + if (This->addr.s_addr == (addr.s_addr & This->mask.s_addr)) { +#if DEBUGGING + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "1)IP-Match: %s[%s] <-> ", host, inet_ntoa(addr)); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "%s/", inet_ntoa(This->addr)); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "%s", inet_ntoa(This->mask)); +#endif + return 1; + } +#if DEBUGGING + else { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "1)IP-NoMatch: %s[%s] <-> ", host, inet_ntoa(addr)); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "%s/", inet_ntoa(This->addr)); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "%s", inet_ntoa(This->mask)); + } +#endif + } + else { + struct apr_sockaddr_t *reqaddr; + + if (apr_sockaddr_info_get(&reqaddr, host, APR_UNSPEC, 0, 0, r->pool) + != APR_SUCCESS) { +#if DEBUGGING + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "2)IP-NoMatch: hostname=%s msg=Host not found", + host); +#endif + return 0; + } + + /* Try to deal with multiple IP addr's for a host */ + /* FIXME: This needs to be able to deal with IPv6 */ + while (reqaddr) { + ip = (struct in_addr *) reqaddr->ipaddr_ptr; + if (This->addr.s_addr == (ip->s_addr & This->mask.s_addr)) { +#if DEBUGGING + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "3)IP-Match: %s[%s] <-> ", host, + inet_ntoa(*ip)); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "%s/", inet_ntoa(This->addr)); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "%s", inet_ntoa(This->mask)); +#endif + return 1; + } +#if DEBUGGING + else { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "3)IP-NoMatch: %s[%s] <-> ", host, + inet_ntoa(*ip)); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "%s/", inet_ntoa(This->addr)); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "%s", inet_ntoa(This->mask)); + } +#endif + reqaddr = reqaddr->next; + } + } + + return 0; +} + +/* Return TRUE if addr represents a domain name */ +PROXY_DECLARE(int) ap_proxy_is_domainname(struct dirconn_entry *This, apr_pool_t *p) +{ + char *addr = This->name; + int i; + + /* Domain name must start with a '.' */ + if (addr[0] != '.') + return 0; + + /* rfc1035 says DNS names must consist of "[-a-zA-Z0-9]" and '.' */ + for (i = 0; apr_isalnum(addr[i]) || addr[i] == '-' || addr[i] == '.'; ++i) + continue; + +#if 0 + if (addr[i] == ':') { + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "@@@@ handle optional port in proxy_is_domainname()"); + /* @@@@ handle optional port */ + } +#endif + + if (addr[i] != '\0') + return 0; + + /* Strip trailing dots */ + for (i = strlen(addr) - 1; i > 0 && addr[i] == '.'; --i) + addr[i] = '\0'; + + This->matcher = proxy_match_domainname; + return 1; +} + +/* Return TRUE if host "host" is in domain "domain" */ +static int proxy_match_domainname(struct dirconn_entry *This, request_rec *r) +{ + const char *host = proxy_get_host_of_request(r); + int d_len = strlen(This->name), h_len; + + if (host == NULL) /* some error was logged already */ + return 0; + + h_len = strlen(host); + + /* @@@ do this within the setup? */ + /* Ignore trailing dots in domain comparison: */ + while (d_len > 0 && This->name[d_len - 1] == '.') + --d_len; + while (h_len > 0 && host[h_len - 1] == '.') + --h_len; + return h_len > d_len + && strncasecmp(&host[h_len - d_len], This->name, d_len) == 0; +} + +/* Return TRUE if host represents a host name */ +PROXY_DECLARE(int) ap_proxy_is_hostname(struct dirconn_entry *This, apr_pool_t *p) +{ + struct apr_sockaddr_t *addr; + char *host = This->name; + int i; + + /* Host names must not start with a '.' */ + if (host[0] == '.') + return 0; + + /* rfc1035 says DNS names must consist of "[-a-zA-Z0-9]" and '.' */ + for (i = 0; apr_isalnum(host[i]) || host[i] == '-' || host[i] == '.'; ++i); + + if (host[i] != '\0' || apr_sockaddr_info_get(&addr, host, APR_UNSPEC, 0, 0, p) != APR_SUCCESS) + return 0; + + This->hostaddr = addr; + + /* Strip trailing dots */ + for (i = strlen(host) - 1; i > 0 && host[i] == '.'; --i) + host[i] = '\0'; + + This->matcher = proxy_match_hostname; + return 1; +} + +/* Return TRUE if host "host" is equal to host2 "host2" */ +static int proxy_match_hostname(struct dirconn_entry *This, request_rec *r) +{ + char *host = This->name; + const char *host2 = proxy_get_host_of_request(r); + int h2_len; + int h1_len; + + if (host == NULL || host2 == NULL) + return 0; /* oops! */ + + h2_len = strlen(host2); + h1_len = strlen(host); + +#if 0 + struct apr_sockaddr_t *addr = *This->hostaddr; + + /* Try to deal with multiple IP addr's for a host */ + while (addr) { + if (addr->ipaddr_ptr == ? ? ? ? ? ? ? ? ? ? ? ? ?) + return 1; + addr = addr->next; + } +#endif + + /* Ignore trailing dots in host2 comparison: */ + while (h2_len > 0 && host2[h2_len - 1] == '.') + --h2_len; + while (h1_len > 0 && host[h1_len - 1] == '.') + --h1_len; + return h1_len == h2_len + && strncasecmp(host, host2, h1_len) == 0; +} + +/* Return TRUE if addr is to be matched as a word */ +PROXY_DECLARE(int) ap_proxy_is_word(struct dirconn_entry *This, apr_pool_t *p) +{ + This->matcher = proxy_match_word; + return 1; +} + +/* Return TRUE if string "str2" occurs literally in "str1" */ +static int proxy_match_word(struct dirconn_entry *This, request_rec *r) +{ + const char *host = proxy_get_host_of_request(r); + return host != NULL && ap_strstr_c(host, This->name) != NULL; +} + +/* checks whether a host in uri_addr matches proxyblock */ +PROXY_DECLARE(int) ap_proxy_checkproxyblock(request_rec *r, proxy_server_conf *conf, + apr_sockaddr_t *uri_addr) +{ + int j; + apr_sockaddr_t * src_uri_addr = uri_addr; + /* XXX FIXME: conf->noproxies->elts is part of an opaque structure */ + for (j = 0; j < conf->noproxies->nelts; j++) { + struct noproxy_entry *npent = (struct noproxy_entry *) conf->noproxies->elts; + struct apr_sockaddr_t *conf_addr = npent[j].addr; + uri_addr = src_uri_addr; + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: checking remote machine [%s] against [%s]", uri_addr->hostname, npent[j].name); + if ((npent[j].name && ap_strstr_c(uri_addr->hostname, npent[j].name)) + || npent[j].name[0] == '*') { + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, r->server, + "proxy: connect to remote machine %s blocked: name %s matched", uri_addr->hostname, npent[j].name); + return HTTP_FORBIDDEN; + } + while (conf_addr) { + while (uri_addr) { + char *conf_ip; + char *uri_ip; + apr_sockaddr_ip_get(&conf_ip, conf_addr); + apr_sockaddr_ip_get(&uri_ip, uri_addr); + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "proxy: ProxyBlock comparing %s and %s", conf_ip, uri_ip); + if (!apr_strnatcasecmp(conf_ip, uri_ip)) { + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, r->server, + "proxy: connect to remote machine %s blocked: IP %s matched", uri_addr->hostname, conf_ip); + return HTTP_FORBIDDEN; + } + uri_addr = uri_addr->next; + } + conf_addr = conf_addr->next; + } + } + return OK; +} + +/* set up the minimal filter set */ +PROXY_DECLARE(int) ap_proxy_pre_http_request(conn_rec *c, request_rec *r) +{ + ap_add_input_filter("HTTP_IN", NULL, r, c); + return OK; +} + +/* converts a series of buckets into a string + * XXX: BillS says this function performs essentially the same function as + * ap_rgetline() in protocol.c. Deprecate this function and use ap_rgetline() + * instead? I think ap_proxy_string_read() will not work properly on non ASCII + * (EBCDIC) machines either. + */ +PROXY_DECLARE(apr_status_t) ap_proxy_string_read(conn_rec *c, apr_bucket_brigade *bb, + char *buff, apr_size_t bufflen, int *eos) +{ + apr_bucket *e; + apr_status_t rv; + char *pos = buff; + char *response; + int found = 0; + apr_size_t len; + + /* start with an empty string */ + buff[0] = 0; + *eos = 0; + + /* loop through each brigade */ + while (!found) { + /* get brigade from network one line at a time */ + if (APR_SUCCESS != (rv = ap_get_brigade(c->input_filters, bb, + AP_MODE_GETLINE, + APR_BLOCK_READ, + 0))) { + return rv; + } + /* loop through each bucket */ + while (!found) { + if (*eos || APR_BRIGADE_EMPTY(bb)) { + /* The connection aborted or timed out */ + return APR_ECONNABORTED; + } + e = APR_BRIGADE_FIRST(bb); + if (APR_BUCKET_IS_EOS(e)) { + *eos = 1; + } + else { + if (APR_SUCCESS != apr_bucket_read(e, (const char **)&response, &len, APR_BLOCK_READ)) { + return rv; + } + /* is string LF terminated? + * XXX: This check can be made more efficient by simply checking + * if the last character in the 'response' buffer is an ASCII_LF. + * See ap_rgetline() for an example. + */ + if (memchr(response, APR_ASCII_LF, len)) { + found = 1; + } + /* concat strings until buff is full - then throw the data away */ + if (len > ((bufflen-1)-(pos-buff))) { + len = (bufflen-1)-(pos-buff); + } + if (len > 0) { + pos = apr_cpystrn(pos, response, len); + } + } + APR_BUCKET_REMOVE(e); + apr_bucket_destroy(e); + } + } + + return APR_SUCCESS; +} + +/* unmerge an element in the table */ +PROXY_DECLARE(void) ap_proxy_table_unmerge(apr_pool_t *p, apr_table_t *t, char *key) +{ + apr_off_t offset = 0; + apr_off_t count = 0; + char *value = NULL; + + /* get the value to unmerge */ + const char *initial = apr_table_get(t, key); + if (!initial) { + return; + } + value = apr_pstrdup(p, initial); + + /* remove the value from the headers */ + apr_table_unset(t, key); + + /* find each comma */ + while (value[count]) { + if (value[count] == ',') { + value[count] = 0; + apr_table_add(t, key, value + offset); + offset = count + 1; + } + count++; + } + apr_table_add(t, key, value + offset); +} + +PROXY_DECLARE(int) ap_proxy_connect_to_backend(apr_socket_t **newsock, + const char *proxy_function, + apr_sockaddr_t *backend_addr, + const char *backend_name, + proxy_server_conf *conf, + server_rec *s, + apr_pool_t *p) +{ + apr_status_t rv; + int connected = 0; + int loglevel; + + while (backend_addr && !connected) { + if ((rv = apr_socket_create(newsock, backend_addr->family, + SOCK_STREAM, p)) != APR_SUCCESS) { + loglevel = backend_addr->next ? APLOG_DEBUG : APLOG_ERR; + ap_log_error(APLOG_MARK, loglevel, rv, s, + "proxy: %s: error creating fam %d socket for target %s", + proxy_function, + backend_addr->family, + backend_name); + /* this could be an IPv6 address from the DNS but the + * local machine won't give us an IPv6 socket; hopefully the + * DNS returned an additional address to try + */ + backend_addr = backend_addr->next; + continue; + } + +#if !defined(TPF) && !defined(BEOS) + if (conf->recv_buffer_size > 0 && + (rv = apr_socket_opt_set(*newsock, APR_SO_RCVBUF, + conf->recv_buffer_size))) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, s, + "apr_socket_opt_set(SO_RCVBUF): Failed to set " + "ProxyReceiveBufferSize, using default"); + } +#endif + + /* Set a timeout on the socket */ + if (conf->timeout_set == 1) { + apr_socket_timeout_set(*newsock, conf->timeout); + } + else { + apr_socket_timeout_set(*newsock, s->timeout); + } + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "proxy: %s: fam %d socket created to connect to %s", + proxy_function, backend_addr->family, backend_name); + + /* make the connection out of the socket */ + rv = apr_connect(*newsock, backend_addr); + + /* if an error occurred, loop round and try again */ + if (rv != APR_SUCCESS) { + apr_socket_close(*newsock); + loglevel = backend_addr->next ? APLOG_DEBUG : APLOG_ERR; + ap_log_error(APLOG_MARK, loglevel, rv, s, + "proxy: %s: attempt to connect to %pI (%s) failed", + proxy_function, + backend_addr, + backend_name); + backend_addr = backend_addr->next; + continue; + } + connected = 1; + } + return connected ? 0 : 1; +} + diff --git a/rubbos/app/httpd-2.0.64/modules/ssl/.deps b/rubbos/app/httpd-2.0.64/modules/ssl/.deps new file mode 100644 index 00000000..e69de29b diff --git a/rubbos/app/httpd-2.0.64/modules/ssl/Makefile b/rubbos/app/httpd-2.0.64/modules/ssl/Makefile new file mode 100644 index 00000000..b624d817 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/ssl/Makefile @@ -0,0 +1,43 @@ +top_srcdir = /bottlenecks/rubbos/app/httpd-2.0.64 +top_builddir = /bottlenecks/rubbos/app/httpd-2.0.64 +srcdir = /bottlenecks/rubbos/app/httpd-2.0.64/modules/ssl +builddir = /bottlenecks/rubbos/app/httpd-2.0.64/modules/ssl +VPATH = /bottlenecks/rubbos/app/httpd-2.0.64/modules/ssl +# 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. + +# +# standard stuff +# + +include $(top_srcdir)/build/special.mk + +# +# developer stuff +# (we really don't expect end users to use these targets!) +# + +ssl_expr_scan.c: $(top_srcdir)/modules/ssl/ssl_expr_scan.l ssl_expr_parse.h + flex -Pssl_expr_yy -s -B $(top_srcdir)/modules/ssl/ssl_expr_scan.l + sed -e '/$$Header:/d' ssl_expr_scan.c && rm -f lex.ssl_expr_yy.c + +ssl_expr_parse.c ssl_expr_parse.h: $(top_srcdir)/modules/ssl/ssl_expr_parse.y + yacc -d $(top_srcdir)/modules/ssl/ssl_expr_parse.y + sed -e 's;yy;ssl_expr_yy;g' \ + -e '/#if defined(c_plusplus) || defined(__cplusplus)/,/#endif/d' \ + ssl_expr_parse.c && rm -f y.tab.c + sed -e 's;yy;ssl_expr_yy;g' \ + ssl_expr_parse.h && rm -f y.tab.h + diff --git a/rubbos/app/httpd-2.0.64/modules/ssl/Makefile.in b/rubbos/app/httpd-2.0.64/modules/ssl/Makefile.in new file mode 100644 index 00000000..a5153f3a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/ssl/Makefile.in @@ -0,0 +1,38 @@ +# 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. + +# +# standard stuff +# + +include $(top_srcdir)/build/special.mk + +# +# developer stuff +# (we really don't expect end users to use these targets!) +# + +ssl_expr_scan.c: $(top_srcdir)/modules/ssl/ssl_expr_scan.l ssl_expr_parse.h + flex -Pssl_expr_yy -s -B $(top_srcdir)/modules/ssl/ssl_expr_scan.l + sed -e '/$$Header:/d' ssl_expr_scan.c && rm -f lex.ssl_expr_yy.c + +ssl_expr_parse.c ssl_expr_parse.h: $(top_srcdir)/modules/ssl/ssl_expr_parse.y + yacc -d $(top_srcdir)/modules/ssl/ssl_expr_parse.y + sed -e 's;yy;ssl_expr_yy;g' \ + -e '/#if defined(c_plusplus) || defined(__cplusplus)/,/#endif/d' \ + ssl_expr_parse.c && rm -f y.tab.c + sed -e 's;yy;ssl_expr_yy;g' \ + ssl_expr_parse.h && rm -f y.tab.h + diff --git a/rubbos/app/httpd-2.0.64/modules/ssl/README b/rubbos/app/httpd-2.0.64/modules/ssl/README new file mode 100644 index 00000000..b24af26f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/ssl/README @@ -0,0 +1,129 @@ +SYNOPSIS + + This Apache module provides strong cryptography for the Apache 2.0 webserver + via the Secure Sockets Layer (SSL v2/v3) and Transport Layer Security (TLS + v1) protocols by the help of the SSL/TLS implementation library OpenSSL which + is based on SSLeay from Eric A. Young and Tim J. Hudson. + + The mod_ssl package was created in April 1998 by Ralf S. Engelschall + and was originally derived from software developed by Ben Laurie for + use in the Apache-SSL HTTP server project. The mod_ssl implementation + for Apache 1.3 continues to be supported by the modssl project + . + +SOURCES + + See the top-level LAYOUT file in httpd-2.0 for file descriptions. + + The source files are written in clean ANSI C and pass the ``gcc -O -g + -ggdb3 -Wall -Wshadow -Wpointer-arith -Wcast-align -Wmissing-prototypes + -Wmissing-declarations -Wnested-externs -Winline'' compiler test + (assuming `gcc' is GCC 2.95.2 or newer) without any complains. When + you make changes or additions make sure the source still passes this + compiler test. + +FUNCTIONS + + Inside the source code you will be confronted with the following types of + functions which can be identified by their prefixes: + + ap_xxxx() ............... Apache API function + ssl_xxxx() .............. mod_ssl function + SSL_xxxx() .............. OpenSSL function (SSL library) + OpenSSL_xxxx() .......... OpenSSL function (SSL library) + X509_xxxx() ............. OpenSSL function (Crypto library) + PEM_xxxx() .............. OpenSSL function (Crypto library) + EVP_xxxx() .............. OpenSSL function (Crypto library) + RSA_xxxx() .............. OpenSSL function (Crypto library) + +DATA STRUCTURES + + Inside the source code you will be confronted with the following + data structures: + + server_rec .............. Apache (Virtual) Server + conn_rec ................ Apache Connection + request_rec ............. Apache Request + SSLModConfig ............ mod_ssl (Global) Module Configuration + SSLSrvConfig ............ mod_ssl (Virtual) Server Configuration + SSLDirConfig ............ mod_ssl Directory Configuration + SSLConnConfig ........... mod_ssl Connection Configuration + SSLFilterRec ............ mod_ssl Filter Context + SSL_CTX ................. OpenSSL Context + SSL_METHOD .............. OpenSSL Protocol Method + SSL_CIPHER .............. OpenSSL Cipher + SSL_SESSION ............. OpenSSL Session + SSL ..................... OpenSSL Connection + BIO ..................... OpenSSL Connection Buffer + + For an overview how these are related and chained together have a look at the + page in README.dsov.{fig,ps}. It contains overview diagrams for those data + structures. It's designed for DIN A4 paper size, but you can easily generate + a smaller version inside XFig by specifing a magnification on the Export + panel. + +EXPERIMENTAL CODE + + Experimental code is always encapsulated as following: + + | #ifdef SSL_EXPERIMENTAL_xxxx + | ... + | #endif + + This way it is only compiled in when this define is enabled with + the APACI --enable-rule=SSL_EXPERIMENTAL option and as long as the + C pre-processor variable SSL_EXPERIMENTAL_xxxx_IGNORE is _NOT_ + defined (via CFLAGS). Or in other words: SSL_EXPERIMENTAL enables all + SSL_EXPERIMENTAL_xxxx variables, except if SSL_EXPERIMENTAL_xxxx_IGNORE + is already defined. Currently the following features are experimental: + + o SSL_EXPERIMENTAL_ENGINE + The ability to support the new forthcoming OpenSSL ENGINE stuff. + Until this development branch of OpenSSL is merged into the main + stream, you have to use openssl-engine-0.9.x.tar.gz for this. + mod_ssl automatically recognizes this OpenSSL variant and then can + activate external crypto devices through SSLCryptoDevice directive. + +INCOMPATIBILITIES + + The following intentional incompatibilities exist between mod_ssl 2.x + from Apache 1.3 and this mod_ssl version for Apache 2.0: + + o The complete EAPI-based SSL_VENDOR stuff was removed. + o The complete EAPI-based SSL_COMPAT stuff was removed. + o The variable MOD_SSL is no longer provided automatically + +MAJOR CHANGES + + For a complete history of changes for Apache 2.0 mod_ssl, see the + CHANGES file in the top-level httpd-2.0 directory. The following + is a condensed summary of the major changes were made between + mod_ssl 2.x from Apache 1.3 and this mod_ssl version for Apache 2.0: + + o The DBM based session cache is now based on APR's DBM API only. + o The shared memory based session cache is now based on APR's APIs. + o SSL I/O is now implemented in terms of filters rather than BUFF + o Eliminated ap_global_ctx. Storing Persistant information in + process_rec->pool->user_data. The ssl_pphrase_Handle_CB() and + ssl_config_global_* () functions have an extra parameter now - + "server_rec *" - which is used to retrieve the SSLModConfigRec. + o Properly support restarts, allowing mod_ssl to be added to a server + that is already running and to change server certs/keys on restart + o Various performance enhancements + o proxy support is no longer an "extension", much of the mod_ssl core + was re-written (ssl_engine_{init,kernel,config}.c) to be generic so + it could be re-used in proxy mode. + - the optional function ssl_proxy_enable is provide for mod_proxy + to enable proxy support + - proxy support now requires 'SSLProxyEngine on' to be configured + - proxy now supports SSLProxyCARevocation{Path,File} in addition to + the original SSLProxy* directives + o per-directory SSLCACertificate{File,Path} is now thread-safe but + requires SSL_set_cert_store patch to OpenSSL + o RSA sslc is supported via ssl_toolkit_compat.h + o the ssl_engine_{ds,ext}.c source files are obsolete and no longer + exist + +TODO + + See the top-level STATUS file in httpd-2.0 for current efforts and goals. diff --git a/rubbos/app/httpd-2.0.64/modules/ssl/README.dsov.fig b/rubbos/app/httpd-2.0.64/modules/ssl/README.dsov.fig new file mode 100644 index 00000000..d8d03db2 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/ssl/README.dsov.fig @@ -0,0 +1,346 @@ +#FIG 3.2 +Landscape +Center +Metric +Letter +100.00 +Single +-2 +1200 2 +0 32 #616561 +0 33 #b6b2b6 +0 34 #f7f3f7 +0 35 #cfcfcf +0 36 #ffffff +6 6345 2835 7155 3150 +6 6345 2970 7110 3150 +4 0 0 200 0 20 8 0.0000 4 120 585 6345 3105 "ssl_module")\001 +-6 +4 0 0 200 0 20 8 0.0000 4 120 660 6345 2970 ap_ctx_get(...,\001 +-6 +6 10800 2610 12240 3060 +4 0 0 200 0 20 8 0.0000 4 120 1170 10800 2745 ap_get_module_config(...\001 +4 0 0 200 0 20 8 0.0000 4 120 795 10800 2880 ->per_dir_config,\001 +4 0 0 200 0 20 8 0.0000 4 120 585 10800 3015 &ssl_module)\001 +-6 +6 7920 4770 9135 4995 +2 4 0 1 35 35 200 0 20 0.000 0 0 4 0 0 5 + 9135 4995 7920 4995 7920 4770 9135 4770 9135 4995 +4 0 0 100 0 18 12 0.0000 4 180 1065 8010 4950 request_rec\001 +-6 +2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 6975 3330 7425 2520 +2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 7200 4230 9450 2520 +2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 7875 4905 7200 5220 +2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 6750 5130 6750 4545 +2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 6705 5445 7155 6120 +2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 7875 4815 7200 4590 +2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 9585 2565 11475 4230 +2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 10170 5130 11835 4545 +2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 7920 6075 9855 5400 +2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 9990 5445 10935 5625 +2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 10215 5310 10935 5310 +2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 11925 4590 11925 5085 +2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 9810 5490 9810 6840 +2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 9945 5445 10935 6030 +2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 8865 4725 10800 2565 +2 1 0 3 0 34 200 0 20 0.000 0 0 -1 0 0 2 + 675 6075 5850 6075 +2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 675 6525 675 6075 +2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2 + 1 0 1.00 60.00 120.00 + 5850 6075 5850 6525 +2 1 0 3 0 34 200 0 20 0.000 0 0 -1 0 0 2 + 900 5625 5625 5625 +2 1 0 3 0 34 200 0 20 0.000 0 0 -1 0 0 2 + 1125 5175 5400 5175 +2 1 0 3 0 34 200 0 20 0.000 0 0 -1 0 0 2 + 1350 4725 5175 4725 +2 1 0 3 0 34 200 0 20 0.000 0 0 -1 0 0 2 + 1575 4275 4950 4275 +2 1 0 3 0 34 200 0 20 0.000 0 0 -1 0 0 2 + 1800 3825 4725 3825 +2 1 0 3 0 34 200 0 20 0.000 0 0 -1 0 0 2 + 2025 3375 4500 3375 +2 1 0 3 0 34 200 0 20 0.000 0 0 -1 0 0 2 + 2250 2925 4275 2925 +2 1 0 3 0 34 200 0 20 0.000 0 0 -1 0 0 2 + 2475 2475 4050 2475 +2 1 0 3 0 34 200 0 20 0.000 0 0 -1 0 0 2 + 2700 2025 3825 2025 +2 1 0 3 0 34 200 0 20 0.000 0 0 -1 0 0 2 + 2925 1575 3600 1575 +2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 900 6075 900 5625 +2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 1125 6525 1125 5175 +2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 1350 5175 1350 4725 +2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 1575 4725 1575 4275 +2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 1800 6525 1800 3825 +2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 2025 3825 2025 3375 +2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 2250 3375 2250 2925 +2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 2475 2925 2475 2475 +2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2 + 1 0 1.00 60.00 120.00 + 5625 5625 5625 6075 +2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2 + 1 0 1.00 60.00 120.00 + 5400 5175 5400 6525 +2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2 + 1 0 1.00 60.00 120.00 + 5175 4725 5175 5175 +2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2 + 1 0 1.00 60.00 120.00 + 4950 4275 4950 4725 +2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2 + 1 0 1.00 60.00 120.00 + 4725 3825 4725 6525 +2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2 + 1 0 1.00 60.00 120.00 + 4500 3375 4500 3825 +2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2 + 1 0 1.00 60.00 120.00 + 4275 2925 4275 3375 +2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2 + 1 0 1.00 60.00 120.00 + 4050 2475 4050 2925 +2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 2700 6525 2700 2025 +2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2 + 1 0 1.00 60.00 120.00 + 3825 2025 3825 6525 +2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2 + 1 0 1.00 60.00 120.00 + 3600 1575 3600 2025 +2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 2925 2025 2925 1575 +2 1 0 4 0 0 200 0 20 0.000 0 0 -1 1 0 2 + 1 1 4.00 60.00 120.00 + 540 6525 6300 6525 +2 3 0 1 7 7 800 0 20 0.000 0 0 -1 0 0 9 + 675 6525 5850 6525 5850 6075 5625 6075 5625 5625 900 5625 + 900 6075 675 6075 675 6525 +2 3 0 1 34 34 700 0 20 0.000 0 0 -1 0 0 13 + 1125 6525 5355 6525 5400 5175 5175 5175 5175 4725 4950 4725 + 4950 4275 1575 4275 1575 4725 1350 4725 1350 5175 1125 5175 + 1125 6525 +2 3 0 1 35 35 500 0 20 0.000 0 0 -1 0 0 17 + 1800 6525 4725 6525 4725 3825 4500 3825 4500 3375 4275 3375 + 4275 2925 4050 2925 4050 2475 2475 2475 2475 2925 2250 2925 + 2250 3375 2025 3375 2025 3825 1800 3825 1800 6525 +2 3 0 1 33 33 400 0 20 0.000 0 0 -1 0 0 9 + 2700 6525 3825 6525 3825 2025 3600 2025 3600 1575 2925 1575 + 2925 2025 2700 2025 2700 6525 +2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 1 2 + 2 0 1.00 60.00 120.00 + 2 0 1.00 60.00 120.00 + 2700 6750 3825 6750 +2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 1 2 + 2 0 1.00 60.00 120.00 + 2 0 1.00 60.00 120.00 + 1125 7200 5400 7200 +2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 1 2 + 2 0 1.00 60.00 120.00 + 2 0 1.00 60.00 120.00 + 1800 6975 4725 6975 +2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 1 2 + 2 0 1.00 60.00 120.00 + 2 0 1.00 60.00 120.00 + 675 7425 5850 7425 +2 1 2 1 0 34 200 0 20 3.000 0 1 -1 0 0 2 + 675 6570 675 7650 +2 1 2 1 0 34 200 0 20 3.000 0 1 -1 0 0 2 + 1125 6570 1125 7650 +2 1 2 1 0 34 200 0 20 3.000 0 1 -1 0 0 2 + 1800 6570 1800 7650 +2 1 2 1 0 34 200 0 20 3.000 0 1 -1 0 0 2 + 2700 6570 2700 7650 +2 1 2 1 0 34 200 0 20 3.000 0 1 -1 0 0 2 + 3825 6570 3825 7650 +2 1 2 1 0 34 200 0 20 3.000 0 1 -1 0 0 2 + 4725 6570 4725 7650 +2 1 2 1 0 34 200 0 20 3.000 0 1 -1 0 0 2 + 5400 6570 5400 7650 +2 1 2 1 0 34 200 0 20 3.000 0 1 -1 0 0 2 + 5850 6570 5850 7650 +2 4 0 2 0 7 100 0 -1 0.000 0 0 20 0 0 5 + 12600 8550 450 8550 450 225 12600 225 12600 8550 +2 4 0 1 0 34 200 0 20 0.000 0 0 20 0 0 5 + 12600 1350 450 1350 450 225 12600 225 12600 1350 +2 4 0 1 35 35 200 0 20 0.000 0 0 4 0 0 5 + 10170 2475 8775 2475 8775 2250 10170 2250 10170 2475 +2 4 0 1 35 35 200 0 20 0.000 0 0 4 0 0 5 + 11925 2475 10575 2475 10575 2250 11925 2250 11925 2475 +2 4 0 1 35 35 200 0 20 0.000 0 0 4 0 0 5 + 12375 4500 11430 4500 11430 4275 12375 4275 12375 4500 +2 4 0 1 35 35 200 0 20 0.000 0 0 4 0 0 5 + 12375 5400 10980 5400 10980 5175 12375 5175 12375 5400 +2 4 0 1 35 35 200 0 20 0.000 0 0 4 0 0 5 + 10170 5400 9675 5400 9675 5175 10170 5175 10170 5400 +2 4 0 1 35 35 200 0 20 0.000 0 0 4 0 0 5 + 7875 6300 7200 6300 7200 6075 7875 6075 7875 6300 +2 4 0 1 35 35 200 0 20 0.000 0 0 4 0 0 5 + 8190 2475 6750 2475 6750 2250 8190 2250 8190 2475 +2 4 0 1 35 35 200 0 20 0.000 0 0 4 0 0 5 + 7605 3600 6300 3600 6300 3375 7605 3375 7605 3600 +2 4 0 1 35 35 200 0 20 0.000 0 0 4 0 0 5 + 7335 4500 6300 4500 6300 4275 7335 4275 7335 4500 +2 4 0 1 35 35 200 0 20 0.000 0 0 4 0 0 5 + 7200 5400 6300 5400 6300 5175 7200 5175 7200 5400 +2 1 0 6 7 7 600 0 -1 0.000 0 0 -1 0 0 2 + 9450 4500 6075 1935 +2 1 0 6 7 7 600 0 -1 0.000 0 0 4 0 0 2 + 9450 4500 12465 2205 +2 1 0 6 7 7 600 0 -1 0.000 0 0 4 0 0 2 + 9450 4500 9450 7785 +2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 9630 5310 7245 5310 +2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 11385 4365 7380 4365 +2 4 0 1 35 35 200 0 20 0.000 0 0 4 0 0 5 + 12240 5805 10980 5805 10980 5580 12240 5580 12240 5805 +2 4 0 1 35 35 200 0 20 0.000 0 0 4 0 0 5 + 12375 6210 10980 6210 10980 5985 12375 5985 12375 6210 +2 1 0 1 0 34 200 0 20 0.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 11205 6885 9900 5445 +2 4 0 1 35 35 200 0 20 0.000 0 0 4 0 0 5 + 12285 7155 10530 7155 10530 6930 12285 6930 12285 7155 +2 4 0 1 35 35 200 0 20 0.000 0 0 4 0 0 5 + 10170 7155 9630 7155 9630 6930 10170 6930 10170 7155 +2 1 0 6 7 7 600 0 -1 0.000 0 0 4 0 0 2 + 12510 6435 9450 6435 +2 1 0 1 0 34 300 0 20 0.000 0 0 7 1 0 4 + 1 1 1.00 60.00 120.00 + 12375 4455 12510 4635 12510 6210 11970 6885 +2 1 2 1 0 34 200 0 20 1.000 0 0 -1 1 0 2 + 1 1 1.00 60.00 120.00 + 9850 5143 9175 4918 +3 1 0 1 34 34 800 0 20 0.000 0 0 0 41 + 7380 1710 6390 2115 5535 2115 6075 3015 5670 3465 6165 3915 + 5715 4410 6030 5040 6030 5310 6480 5715 6390 6255 6975 6300 + 7065 6975 7965 6750 8100 7560 8955 7290 9360 7740 9720 7560 + 10755 8145 12060 8280 12375 7650 12420 7200 12510 7065 12330 6660 + 12510 6390 12420 5940 12375 5400 12510 5220 12510 4725 12600 4275 + 12375 3645 12105 3240 12150 2745 12375 2700 12330 1980 11790 1575 + 11250 1935 10125 1485 8955 2070 7785 1620 7695 1575 + 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 + 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 + 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 + 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 + 1.000 1.000 1.000 1.000 1.000 1.000 1.000 1.000 + 1.000 +4 0 0 100 0 0 12 0.0000 4 180 1440 10575 675 Ralf S. Engelschall\001 +4 0 0 100 0 18 20 0.0000 4 270 3840 4275 675 Apache+mod_ssl+OpenSSL\001 +4 0 0 100 0 0 10 0.0000 4 135 1320 10575 855 rse@engelschall.com\001 +4 0 0 100 0 0 10 0.0000 4 135 1410 10575 1035 www.engelschall.com\001 +4 0 0 100 0 0 12 0.0000 4 135 870 900 675 Version 1.3\001 +4 0 0 100 0 0 12 0.0000 4 180 1035 900 855 12-Apr-1999\001 +4 0 0 200 0 20 8 0.0000 4 60 390 6210 4680 ->server\001 +4 0 0 200 0 20 8 0.0000 4 120 855 8280 6120 ap_ctx_get(...,"ssl")\001 +4 0 0 200 0 20 8 0.0000 4 120 1170 7740 2700 ap_get_module_config(...\001 +4 0 0 200 0 20 8 0.0000 4 120 810 7740 2835 ->module_config,\001 +4 0 0 200 0 20 8 0.0000 4 120 585 7740 2970 &ssl_module)\001 +4 0 0 100 0 18 20 0.0000 4 270 1200 9000 8100 Chaining\001 +4 0 0 100 0 18 20 0.0000 4 210 1095 2745 8100 Lifetime\001 +4 0 0 100 0 18 12 0.0000 4 180 1215 810 6255 ap_global_ctx\001 +4 0 0 100 0 18 12 0.0000 4 180 1305 990 5805 SSLModConfig\001 +4 0 0 100 0 18 12 0.0000 4 180 840 4050 4455 SSL_CTX\001 +4 0 0 100 0 18 12 0.0000 4 150 975 4455 5355 server_rec\001 +4 0 0 100 0 18 12 0.0000 4 180 1260 3870 4905 SSLSrvConfig\001 +4 0 0 100 0 18 12 0.0000 4 135 480 1845 4005 BUFF\001 +4 0 0 100 0 18 12 0.0000 4 150 810 2070 3555 conn_rec\001 +4 0 0 100 0 18 12 0.0000 4 135 345 2295 3105 BIO\001 +4 0 0 100 0 18 12 0.0000 4 135 375 2565 2655 SSL\001 +4 0 0 100 0 18 12 0.0000 4 180 1185 3645 1620 SSLDirConfig\001 +4 0 0 100 0 18 12 0.0000 4 180 1065 3915 2070 request_rec\001 +4 0 0 200 0 0 8 0.0000 4 120 1440 900 7560 Startup, Runtime, Shutdown\001 +4 0 0 200 0 0 8 0.0000 4 105 975 1350 7335 Configuration Time\001 +4 0 0 200 0 0 8 0.0000 4 90 1050 2025 7110 Connection Duration\001 +4 0 0 200 0 0 8 0.0000 4 120 885 2835 6885 Request Duration\001 +4 0 0 200 0 18 20 0.0000 4 195 90 6345 6795 t\001 +4 0 0 200 0 20 8 0.0000 4 90 345 7110 5985 ->client\001 +4 0 0 100 0 18 12 0.0000 4 180 1305 6795 2430 SSLModConfig\001 +4 0 0 100 0 18 12 0.0000 4 180 1260 8865 2430 SSLSrvConfig\001 +4 0 0 100 0 18 12 0.0000 4 180 1215 6345 3555 ap_global_ctx\001 +4 0 0 100 0 18 12 0.0000 4 150 975 6345 4455 server_rec\001 +4 0 0 100 0 18 12 0.0000 4 150 810 6345 5355 conn_rec\001 +4 0 0 100 0 18 12 0.0000 4 135 375 9720 5355 SSL\001 +4 0 0 100 0 18 12 0.0000 4 180 1185 10665 2430 SSLDirConfig\001 +4 0 0 100 0 18 12 0.0000 4 135 480 7290 6255 BUFF\001 +4 0 0 100 0 18 12 0.0000 4 180 1305 11025 5355 SSL_METHOD\001 +4 0 0 100 0 18 12 0.0000 4 180 840 11475 4455 SSL_CTX\001 +4 0 0 100 0 18 24 0.0000 4 285 4365 3915 1080 Data Structure Overview\001 +4 0 0 200 0 20 8 0.0000 4 90 615 7065 5085 ->connection\001 +4 0 0 200 0 20 8 0.0000 4 60 390 7065 4770 ->server\001 +4 0 0 200 0 20 8 0.0000 4 120 960 8010 5445 SSL_get_app_data()\001 +4 0 0 200 0 20 8 0.0000 4 120 510 10530 4050 ->pSSLCtx\001 +4 0 0 200 0 20 8 0.0000 4 120 1215 7875 4275 SSL_CTX_get_app_data()\001 +4 0 0 200 0 20 8 0.0000 4 120 1155 10305 5535 SSL_get_current_cipher()\001 +4 0 0 100 0 18 12 0.0000 4 180 1170 11025 5760 SSL_CIPHER\001 +4 0 0 100 0 18 12 0.0000 4 180 1350 10980 6165 SSL_SESSION\001 +4 0 0 200 0 20 8 0.0000 4 120 840 10440 5940 SSL_get_session()\001 +4 0 0 100 0 18 12 0.0000 4 180 1665 10575 7110 X509_STORE_CTX\001 +4 0 0 100 0 18 12 0.0000 4 135 345 9720 7110 BIO\001 +4 0 0 200 0 20 8 0.0000 4 120 840 9540 7335 SSL_get_{r,w}bio()\001 +4 0 0 100 0 18 20 0.0000 4 270 1170 8730 3465 mod_ssl\001 +4 0 0 100 0 18 20 0.0000 4 270 1050 8145 6750 Apache\001 +4 0 0 200 0 20 8 0.0000 4 120 945 10125 4680 SSL_get_SSL_CTX()\001 +4 0 0 200 0 20 8 0.0000 4 120 1170 10350 5175 SSL_get_SSL_METHOD()\001 +4 0 0 200 0 20 8 0.0000 4 90 465 11745 4770 ->method\001 +4 0 0 200 0 20 8 0.0000 4 120 1665 9945 6480 X509_STORE_CTX_get_app_data()\001 +4 0 0 200 0 20 8 0.0000 4 120 1215 10980 6705 SSL_CTX_get_cert_store()\001 +4 0 0 200 0 20 8 0.0000 4 120 1020 8280 5130 SSL_get_app_data2()\001 +4 0 0 100 0 18 20 0.0000 4 270 1290 10710 7605 OpenSSL\001 +4 0 0 100 0 18 12 0.0000 4 180 720 10710 7785 [Crypto]\001 +4 0 0 100 0 18 20 0.0000 4 270 1290 10935 3645 OpenSSL\001 +4 0 0 100 0 18 12 0.0000 4 180 495 10935 3825 [SSL]\001 diff --git a/rubbos/app/httpd-2.0.64/modules/ssl/README.dsov.ps b/rubbos/app/httpd-2.0.64/modules/ssl/README.dsov.ps new file mode 100644 index 00000000..def19dbe --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/ssl/README.dsov.ps @@ -0,0 +1,1138 @@ +%!PS-Adobe-2.0 +%%Title: README.dsov.ps +%%Creator: fig2dev Version 3.2 Patchlevel 1 +%%CreationDate: Mon Apr 12 17:09:11 1999 +%%For: rse@en1.engelschall.com (Ralf S. Engelschall) +%%Orientation: Landscape +%%BoundingBox: 59 37 553 755 +%%Pages: 1 +%%BeginSetup +%%IncludeFeature: *PageSize Letter +%%EndSetup +%%Magnification: 0.9340 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def +/col32 {0.380 0.396 0.380 srgb} bind def +/col33 {0.714 0.698 0.714 srgb} bind def +/col34 {0.969 0.953 0.969 srgb} bind def +/col35 {0.812 0.812 0.812 srgb} bind def +/col36 {1.000 1.000 1.000 srgb} bind def + +end +save +48.0 12.0 translate + 90 rotate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def +/reencdict 12 dict def /ReEncode { reencdict begin +/newcodesandnames exch def /newfontname exch def /basefontname exch def +/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def +basefontdict { exch dup /FID ne { dup /Encoding eq +{ exch dup length array copy newfont 3 1 roll put } +{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall +newfont /FontName newfontname put newcodesandnames aload pop +128 1 255 { newfont /Encoding get exch /.notdef put } for +newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat +newfontname newfont definefont pop end } def +/isovec [ +8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde +8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis +8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron +8#220 /dotlessi 8#230 /oe 8#231 /OE +8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling +8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis +8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot +8#255 /endash 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus +8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph +8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine +8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf +8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute +8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring +8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute +8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute +8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve +8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply +8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex +8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave +8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring +8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute +8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute +8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve +8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide +8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex +8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def +/Times-Roman /Times-Roman-iso isovec ReEncode +/Helvetica-Bold /Helvetica-Bold-iso isovec ReEncode +/Helvetica-Narrow /Helvetica-Narrow-iso isovec ReEncode +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def +%%EndProlog + +$F2psBegin +10 setmiterlimit +n -1000 9572 m -1000 -1000 l 13622 -1000 l 13622 9572 l cp clip + 0.05883 0.05883 sc +%%Page: 1 1 +% Polyline +7.500 slw +n 6413 2048 m 6380 2054 l 6348 2061 l 6315 2067 l 6283 2073 l 6250 2079 l + 6217 2084 l 6185 2090 l 6152 2095 l 6120 2101 l 6088 2107 l + 6057 2113 l 6027 2120 l 5998 2126 l 5970 2134 l 5943 2141 l + 5918 2149 l 5894 2158 l 5873 2167 l 5853 2177 l 5835 2187 l + 5819 2198 l 5805 2210 l 5793 2222 l 5782 2235 l 5774 2250 l + 5768 2265 l 5763 2281 l 5760 2299 l 5759 2318 l 5759 2339 l + 5761 2360 l 5764 2383 l 5768 2408 l 5774 2433 l 5780 2460 l + 5788 2488 l 5797 2516 l 5806 2546 l 5815 2575 l 5825 2606 l + 5836 2636 l 5846 2666 l 5856 2696 l 5866 2726 l 5875 2755 l + 5884 2784 l 5892 2812 l 5899 2839 l 5905 2866 l 5910 2891 l + 5915 2916 l 5918 2940 l 5919 2968 l 5920 2995 l 5919 3022 l + 5916 3048 l 5912 3075 l 5908 3101 l 5902 3127 l 5895 3153 l + 5887 3179 l 5880 3205 l 5871 3230 l 5863 3254 l 5855 3278 l + 5848 3302 l 5841 3324 l 5834 3346 l 5829 3367 l 5824 3388 l + 5821 3408 l 5819 3427 l 5819 3446 l 5820 3465 l 5823 3484 l + 5827 3503 l 5833 3522 l 5840 3542 l 5848 3562 l 5858 3582 l + 5868 3603 l 5880 3625 l 5891 3647 l 5904 3669 l 5916 3691 l + 5929 3713 l 5941 3736 l 5953 3758 l 5964 3779 l 5974 3801 l + 5983 3822 l 5991 3843 l 5997 3863 l 6002 3883 l 6006 3903 l + 6008 3923 l 6008 3942 l 6006 3962 l 6003 3983 l 5998 4004 l + 5992 4025 l 5985 4048 l 5977 4070 l 5968 4094 l 5958 4118 l + 5947 4142 l 5936 4167 l 5925 4192 l 5913 4216 l 5902 4241 l + 5892 4266 l 5882 4291 l 5872 4315 l 5864 4339 l 5857 4362 l + 5851 4386 l 5846 4409 l 5843 4433 l 5840 4456 l 5840 4480 l + 5840 4505 l 5842 4530 l 5845 4556 l 5849 4582 l 5854 4609 l + 5860 4636 l 5867 4664 l 5875 4692 l 5883 4720 l 5892 4747 l + 5901 4774 l 5910 4801 l 5920 4827 l 5929 4852 l 5938 4875 l + 5947 4898 l 5955 4920 l 5963 4941 l 5971 4961 l 5978 4980 l + 5985 5002 l 5992 5024 l 5999 5046 l 6005 5067 l 6010 5088 l + 6016 5109 l 6022 5129 l 6027 5150 l 6033 5170 l 6039 5190 l + 6045 5209 l 6052 5228 l 6059 5246 l 6067 5264 l 6075 5281 l + 6084 5298 l 6094 5315 l 6105 5333 l 6115 5347 l 6125 5361 l + 6137 5376 l 6149 5392 l 6162 5408 l 6176 5425 l 6191 5443 l + 6206 5461 l 6221 5480 l 6237 5499 l 6253 5519 l 6269 5539 l + 6284 5559 l 6299 5579 l 6313 5599 l 6327 5619 l 6340 5639 l + 6352 5659 l 6363 5679 l 6373 5698 l 6382 5718 l 6390 5738 l + 6398 5759 l 6404 5782 l 6410 5805 l 6415 5828 l 6420 5852 l + 6424 5877 l 6428 5902 l 6431 5927 l 6435 5952 l 6438 5977 l + 6442 6001 l 6446 6025 l 6450 6048 l 6455 6069 l 6461 6090 l + 6467 6109 l 6474 6127 l 6483 6143 l 6492 6159 l 6503 6173 l + 6515 6185 l 6528 6197 l 6543 6209 l 6560 6220 l 6578 6230 l + 6598 6240 l 6619 6250 l 6641 6260 l 6663 6270 l 6687 6281 l + 6710 6291 l 6733 6302 l 6757 6312 l 6779 6324 l 6801 6335 l + 6821 6348 l 6841 6361 l 6859 6374 l 6876 6389 l 6893 6405 l + 6906 6421 l 6919 6437 l 6932 6455 l 6944 6475 l 6955 6495 l + 6967 6516 l 6979 6538 l 6991 6561 l 7003 6584 l 7015 6608 l + 7027 6631 l 7040 6654 l 7053 6677 l 7067 6699 l 7081 6720 l + 7096 6739 l 7111 6758 l 7127 6774 l 7144 6789 l 7161 6803 l + 7180 6815 l 7200 6825 l 7220 6833 l 7240 6840 l 7263 6845 l + 7286 6850 l 7311 6854 l 7338 6857 l 7365 6859 l 7394 6861 l + 7424 6862 l 7454 6864 l 7485 6865 l 7516 6866 l 7547 6867 l + 7578 6868 l 7609 6870 l 7639 6872 l 7668 6875 l 7696 6879 l + 7723 6883 l 7748 6889 l 7773 6895 l 7795 6903 l 7817 6912 l + 7838 6923 l 7857 6934 l 7875 6948 l 7892 6963 l 7909 6980 l + 7926 6998 l 7941 7017 l 7957 7038 l 7972 7060 l 7987 7083 l + 8002 7106 l 8017 7130 l 8031 7154 l 8046 7178 l 8061 7202 l + 8075 7225 l 8090 7247 l 8105 7269 l 8120 7289 l 8135 7308 l + 8151 7326 l 8167 7342 l 8184 7356 l 8202 7369 l 8220 7380 l + 8239 7390 l 8260 7397 l 8282 7404 l 8305 7409 l 8330 7413 l + 8356 7416 l 8383 7418 l 8412 7420 l 8441 7420 l 8471 7419 l + 8502 7418 l 8534 7417 l 8565 7415 l 8597 7413 l 8629 7411 l + 8660 7409 l 8690 7407 l 8720 7405 l 8749 7404 l 8777 7404 l + 8804 7404 l 8830 7405 l 8856 7407 l 8880 7410 l 8906 7414 l + 8931 7420 l 8956 7427 l 8981 7435 l 9005 7444 l 9029 7455 l + 9053 7466 l 9077 7478 l 9100 7491 l 9123 7504 l 9146 7517 l + 9168 7531 l 9190 7544 l 9210 7557 l 9230 7570 l 9250 7582 l + 9268 7593 l 9286 7604 l 9304 7613 l 9320 7621 l 9336 7629 l + 9353 7635 l 9370 7641 l 9388 7645 l 9406 7648 l 9425 7650 l + 9444 7652 l 9464 7653 l 9485 7653 l 9508 7653 l 9531 7653 l + 9555 7653 l 9579 7653 l 9605 7654 l 9631 7655 l 9658 7656 l + 9685 7659 l 9713 7662 l 9742 7666 l 9771 7672 l 9801 7679 l + 9833 7688 l 9853 7694 l 9874 7700 l 9895 7708 l 9918 7716 l + 9941 7725 l 9966 7734 l 9991 7745 l 10017 7755 l 10045 7767 l + 10073 7779 l 10102 7791 l 10132 7804 l 10163 7818 l 10194 7831 l + 10227 7845 l 10259 7860 l 10293 7874 l 10326 7889 l 10360 7903 l + 10394 7918 l 10429 7932 l 10463 7947 l 10497 7961 l 10531 7974 l + 10565 7988 l 10599 8001 l 10633 8013 l 10667 8025 l 10700 8037 l + 10733 8049 l 10767 8059 l 10800 8070 l 10834 8080 l 10868 8090 l + 10902 8099 l 10937 8108 l 10973 8117 l 11009 8125 l 11045 8133 l + 11083 8141 l 11120 8148 l 11158 8155 l 11197 8161 l 11236 8167 l + 11275 8172 l 11313 8177 l 11352 8181 l 11391 8184 l 11429 8187 l + 11467 8190 l 11504 8191 l 11540 8192 l 11576 8192 l 11610 8192 l + 11644 8191 l 11676 8189 l 11707 8187 l 11738 8184 l 11767 8180 l + 11794 8176 l 11821 8171 l 11847 8165 l 11871 8159 l 11895 8153 l + 11923 8143 l 11950 8133 l 11976 8122 l 12001 8109 l 12025 8096 l + 12048 8081 l 12071 8065 l 12092 8048 l 12113 8031 l 12133 8012 l + 12153 7992 l 12171 7972 l 12188 7951 l 12205 7930 l 12220 7909 l + 12235 7887 l 12248 7865 l 12260 7843 l 12272 7822 l 12282 7800 l + 12292 7779 l 12301 7759 l 12309 7739 l 12316 7719 l 12323 7699 l + 12330 7680 l 12338 7655 l 12345 7631 l 12352 7607 l 12359 7582 l + 12365 7558 l 12371 7533 l 12377 7508 l 12382 7484 l 12388 7460 l + 12392 7436 l 12397 7414 l 12401 7391 l 12405 7370 l 12409 7350 l + 12412 7331 l 12415 7313 l 12418 7297 l 12421 7281 l 12424 7266 l + 12428 7253 l 12432 7234 l 12437 7216 l 12442 7199 l 12446 7183 l + 12451 7166 l 12456 7150 l 12460 7134 l 12463 7117 l 12466 7101 l + 12468 7086 l 12469 7070 l 12469 7054 l 12467 7037 l 12465 7020 l + 12462 7006 l 12459 6991 l 12455 6975 l 12450 6958 l 12445 6940 l + 12440 6921 l 12434 6901 l 12428 6880 l 12422 6859 l 12416 6838 l + 12411 6817 l 12406 6796 l 12401 6776 l 12397 6756 l 12394 6736 l + 12392 6718 l 12390 6700 l 12390 6683 l 12390 6665 l 12392 6649 l + 12394 6631 l 12397 6614 l 12401 6597 l 12406 6579 l 12411 6561 l + 12416 6542 l 12422 6524 l 12428 6505 l 12434 6487 l 12440 6468 l + 12445 6450 l 12450 6432 l 12455 6414 l 12459 6396 l 12462 6378 l + 12465 6360 l 12467 6343 l 12468 6326 l 12469 6308 l 12469 6289 l + 12468 6269 l 12468 6249 l 12466 6227 l 12464 6205 l 12462 6182 l + 12460 6159 l 12457 6135 l 12454 6111 l 12451 6087 l 12447 6063 l + 12444 6040 l 12441 6016 l 12437 5993 l 12434 5970 l 12431 5948 l + 12428 5925 l 12424 5902 l 12421 5879 l 12419 5855 l 12416 5831 l + 12413 5806 l 12411 5781 l 12408 5755 l 12406 5729 l 12404 5702 l + 12403 5676 l 12401 5651 l 12400 5625 l 12400 5601 l 12399 5578 l + 12399 5555 l 12400 5534 l 12401 5514 l 12402 5495 l 12403 5477 l + 12405 5460 l 12408 5440 l 12411 5421 l 12416 5402 l 12420 5384 l + 12426 5365 l 12431 5347 l 12437 5329 l 12444 5311 l 12450 5293 l + 12456 5275 l 12462 5258 l 12468 5240 l 12474 5222 l 12479 5205 l + 12483 5186 l 12488 5168 l 12490 5152 l 12493 5135 l 12496 5117 l + 12498 5099 l 12500 5079 l 12502 5058 l 12504 5036 l 12506 5014 l + 12507 4990 l 12509 4966 l 12510 4942 l 12512 4918 l 12513 4893 l + 12515 4869 l 12516 4845 l 12518 4822 l 12520 4799 l 12521 4776 l + 12523 4754 l 12525 4733 l 12527 4713 l 12529 4693 l 12531 4673 l + 12534 4653 l 12536 4632 l 12539 4610 l 12541 4588 l 12543 4566 l + 12546 4543 l 12548 4520 l 12550 4497 l 12552 4473 l 12553 4450 l + 12554 4426 l 12555 4403 l 12555 4380 l 12555 4357 l 12555 4334 l + 12554 4312 l 12552 4290 l 12550 4267 l 12548 4245 l 12545 4224 l + 12541 4203 l 12537 4181 l 12533 4159 l 12528 4136 l 12523 4112 l + 12517 4088 l 12510 4064 l 12503 4038 l 12496 4013 l 12488 3987 l + 12479 3961 l 12471 3935 l 12462 3909 l 12452 3884 l 12443 3859 l + 12434 3835 l 12424 3811 l 12415 3788 l 12405 3766 l 12396 3744 l + 12386 3723 l 12377 3702 l 12368 3683 l 12357 3661 l 12347 3640 l + 12336 3619 l 12325 3598 l 12314 3576 l 12303 3555 l 12291 3533 l + 12280 3511 l 12269 3489 l 12257 3467 l 12246 3446 l 12235 3424 l + 12225 3402 l 12215 3381 l 12206 3360 l 12197 3340 l 12189 3320 l + 12181 3301 l 12174 3281 l 12168 3262 l 12162 3244 l 12158 3225 l + 12153 3204 l 12149 3183 l 12145 3162 l 12142 3139 l 12140 3117 l + 12138 3094 l 12137 3071 l 12137 3047 l 12138 3024 l 12139 3001 l + 12141 2978 l 12143 2956 l 12146 2935 l 12150 2915 l 12154 2896 l + 12158 2879 l 12163 2862 l 12168 2847 l 12174 2833 l 12180 2820 l + 12188 2805 l 12197 2792 l 12206 2779 l 12216 2766 l 12227 2754 l + 12238 2742 l 12249 2730 l 12260 2717 l 12272 2704 l 12282 2691 l + 12292 2676 l 12302 2661 l 12310 2645 l 12318 2627 l 12324 2608 l + 12330 2588 l 12334 2571 l 12336 2553 l 12339 2534 l 12341 2513 l + 12342 2491 l 12343 2467 l 12343 2442 l 12342 2416 l 12340 2389 l + 12338 2360 l 12335 2332 l 12331 2303 l 12326 2273 l 12320 2244 l + 12314 2215 l 12307 2187 l 12299 2159 l 12290 2132 l 12280 2106 l + 12270 2081 l 12259 2056 l 12248 2033 l 12236 2011 l 12224 1990 l + 12210 1970 l 12196 1949 l 12181 1929 l 12164 1910 l 12147 1890 l + 12129 1871 l 12110 1853 l 12090 1835 l 12070 1818 l 12049 1802 l + 12027 1787 l 12005 1773 l 11983 1761 l 11961 1749 l 11939 1739 l + 11917 1730 l 11895 1722 l 11874 1716 l 11852 1710 l 11831 1707 l + 11811 1704 l 11790 1703 l 11769 1702 l 11748 1703 l 11727 1705 l + 11706 1708 l 11683 1711 l 11660 1716 l 11636 1721 l 11612 1727 l + 11587 1733 l 11560 1740 l 11534 1747 l 11506 1754 l 11479 1761 l + 11450 1768 l 11422 1774 l 11393 1780 l 11364 1786 l 11334 1791 l + 11305 1795 l 11275 1798 l 11245 1800 l 11215 1801 l 11184 1801 l + 11153 1800 l 11128 1798 l 11104 1796 l 11078 1793 l 11052 1790 l + 11025 1785 l 10997 1781 l 10968 1776 l 10939 1770 l 10908 1764 l + 10877 1758 l 10844 1751 l 10811 1744 l 10778 1737 l 10743 1730 l + 10708 1722 l 10673 1715 l 10637 1708 l 10601 1701 l 10565 1695 l + 10530 1688 l 10494 1682 l 10458 1677 l 10422 1672 l 10387 1668 l + 10352 1664 l 10318 1661 l 10284 1658 l 10250 1657 l 10216 1656 l + 10183 1655 l 10150 1656 l 10118 1658 l 10087 1660 l 10055 1663 l + 10024 1666 l 9992 1671 l 9960 1676 l 9927 1682 l 9894 1688 l + 9861 1695 l 9827 1703 l 9792 1711 l 9757 1720 l 9721 1729 l + 9685 1738 l 9649 1748 l 9613 1757 l 9576 1767 l 9539 1778 l + 9502 1788 l 9465 1798 l 9429 1807 l 9392 1817 l 9356 1826 l + 9320 1835 l 9285 1844 l 9250 1852 l 9216 1860 l 9182 1867 l + 9148 1873 l 9115 1879 l 9082 1884 l 9050 1889 l 9018 1892 l + 8987 1895 l 8955 1898 l 8919 1899 l 8883 1900 l 8847 1899 l + 8811 1898 l 8774 1896 l 8737 1893 l 8699 1889 l 8661 1884 l + 8623 1878 l 8585 1872 l 8546 1865 l 8508 1857 l 8470 1849 l + 8432 1840 l 8395 1830 l 8358 1821 l 8322 1811 l 8287 1801 l + 8254 1790 l 8221 1780 l 8189 1770 l 8159 1760 l 8130 1750 l + 8102 1740 l 8076 1730 l 8051 1721 l 8028 1712 l 8006 1703 l + 7985 1695 l 7965 1688 l 7931 1674 l 7899 1662 l 7871 1650 l + 7844 1640 l 7820 1631 l 7798 1623 l 7778 1617 l 7760 1611 l + 7743 1607 l 7728 1603 l 7715 1601 l 7702 1600 l 7691 1600 l + 7680 1601 l 7669 1603 l 7658 1605 l 7648 1607 l 7638 1610 l + 7627 1613 l 7615 1617 l 7601 1621 l 7587 1626 l 7571 1632 l + 7554 1638 l 7536 1645 l 7517 1653 l 7496 1661 l 7474 1670 l + 7452 1679 l 7428 1689 l 7403 1699 l 7378 1709 l 7352 1720 l + 7325 1731 l 7297 1743 l 7268 1755 l 7247 1763 l 7226 1772 l + 7204 1781 l 7182 1790 l 7158 1800 l 7133 1810 l 7108 1820 l + 7081 1831 l 7053 1842 l 7025 1853 l 6996 1864 l 6966 1875 l + 6935 1886 l 6904 1898 l 6873 1909 l 6841 1921 l 6809 1932 l + 6776 1943 l 6744 1954 l 6712 1964 l 6680 1974 l 6649 1984 l + 6618 1994 l 6587 2003 l 6557 2011 l 6527 2019 l 6498 2027 l + 6469 2034 l 6441 2041 l cp gs col34 1.00 shd ef gr gs col34 s gr +% Polyline +n 675 6525 m 5850 6525 l 5850 6075 l 5625 6075 l 5625 5625 l 900 5625 l + 900 6075 l 675 6075 l cp gs col7 1.00 shd ef gr gs col7 s gr +% Polyline +n 1125 6525 m 5355 6525 l 5400 5175 l 5175 5175 l 5175 4725 l 4950 4725 l + 4950 4275 l 1575 4275 l 1575 4725 l 1350 4725 l 1350 5175 l + 1125 5175 l cp gs col34 1.00 shd ef gr gs col34 s gr +% Polyline +75.000 slw +n 9450 4500 m 12465 2205 l gs col7 s gr +% Polyline +n 9450 4500 m 9450 7785 l gs col7 s gr +% Polyline +n 9450 4500 m 6075 1935 l gs col7 s gr +% Polyline +n 12510 6435 m 9450 6435 l gs col7 s gr +% Polyline +7.500 slw +n 1800 6525 m 4725 6525 l 4725 3825 l 4500 3825 l 4500 3375 l 4275 3375 l + 4275 2925 l 4050 2925 l 4050 2475 l 2475 2475 l 2475 2925 l + 2250 2925 l 2250 3375 l 2025 3375 l 2025 3825 l 1800 3825 l + cp gs col35 1.00 shd ef gr gs col35 s gr +% Polyline +n 2700 6525 m 3825 6525 l 3825 2025 l 3600 2025 l 3600 1575 l 2925 1575 l + 2925 2025 l 2700 2025 l cp gs col33 1.00 shd ef gr gs col33 s gr +% Polyline +gs clippath +12068 6810 m 11970 6885 l 12022 6773 l 11937 6878 l 11984 6915 l cp +clip +n 12375 4455 m 12510 4635 l 12510 6210 l 11970 6885 l gs col34 1.00 shd ef gr gs col0 s gr gr + +% arrowhead +n 12068 6810 m 11970 6885 l 12022 6773 l 12045 6791 l 12068 6810 l cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +7113 6004 m 7155 6120 l 7063 6037 l 7138 6149 l 7188 6116 l cp +clip +n 6705 5445 m 7155 6120 l gs col34 1.00 shd ef gr gs col0 s gr gr + +% arrowhead +n 7113 6004 m 7155 6120 l 7063 6037 l 7088 6020 l 7113 6004 l cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +7304 4656 m 7200 4590 l 7323 4599 l 7195 4557 l 7176 4614 l cp +clip +n 7875 4815 m 7200 4590 l gs col34 1.00 shd ef gr gs col0 s gr gr + +% arrowhead +n 7304 4656 m 7200 4590 l 7323 4599 l 7314 4628 l 7304 4656 l cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +11405 4128 m 11475 4230 l 11365 4173 l 11466 4262 l 11506 4217 l cp +clip +n 9585 2565 m 11475 4230 l gs col34 1.00 shd ef gr gs col0 s gr gr + +% arrowhead +n 11405 4128 m 11475 4230 l 11365 4173 l 11385 4151 l 11405 4128 l cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +11712 4556 m 11835 4545 l 11732 4613 l 11859 4568 l 11839 4512 l cp +clip +n 10170 5130 m 11835 4545 l gs col34 1.00 shd ef gr gs col0 s gr gr + +% arrowhead +n 11712 4556 m 11835 4545 l 11732 4613 l 11722 4585 l 11712 4556 l cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +9732 5411 m 9855 5400 l 9752 5468 l 9879 5423 l 9859 5367 l cp +clip +n 7920 6075 m 9855 5400 l gs col34 1.00 shd ef gr gs col0 s gr gr + +% arrowhead +n 9732 5411 m 9855 5400 l 9752 5468 l 9742 5440 l 9732 5411 l cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +10823 5573 m 10935 5625 l 10812 5632 l 10944 5657 l 10955 5598 l cp +clip +n 9990 5445 m 10935 5625 l gs col34 1.00 shd ef gr gs col0 s gr gr + +% arrowhead +n 10823 5573 m 10935 5625 l 10812 5632 l 10817 5603 l 10823 5573 l cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +10815 5280 m 10935 5310 l 10815 5340 l 10950 5340 l 10950 5280 l cp +clip +n 10215 5310 m 10935 5310 l gs col34 1.00 shd ef gr gs col0 s gr gr + +% arrowhead +n 10815 5280 m 10935 5310 l 10815 5340 l 10815 5310 l 10815 5280 l cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +11955 4965 m 11925 5085 l 11895 4965 l 11895 5100 l 11955 5100 l cp +clip +n 11925 4590 m 11925 5085 l gs col34 1.00 shd ef gr gs col0 s gr gr + +% arrowhead +n 11955 4965 m 11925 5085 l 11895 4965 l 11925 4965 l 11955 4965 l cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +9840 6720 m 9810 6840 l 9780 6720 l 9780 6855 l 9840 6855 l cp +clip +n 9810 5490 m 9810 6840 l gs col34 1.00 shd ef gr gs col0 s gr gr + +% arrowhead +n 9840 6720 m 9810 6840 l 9780 6720 l 9810 6720 l 9840 6720 l cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +10847 5943 m 10935 6030 l 10816 5995 l 10933 6063 l 10963 6012 l cp +clip +n 9945 5445 m 10935 6030 l gs col34 1.00 shd ef gr gs col0 s gr gr + +% arrowhead +n 10847 5943 m 10935 6030 l 10816 5995 l 10832 5969 l 10847 5943 l cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +10698 2634 m 10800 2565 l 10742 2674 l 10832 2574 l 10788 2534 l cp +clip +n 8865 4725 m 10800 2565 l gs col34 1.00 shd ef gr gs col0 s gr gr + +% arrowhead +n 10698 2634 m 10800 2565 l 10742 2674 l 10720 2654 l 10698 2634 l cp gs 0.00 setgray ef gr col0 s +% Polyline +30.000 slw +n 675 6075 m 5850 6075 l gs col34 1.00 shd ef gr gs col0 s gr +% Polyline +7.500 slw + [15 15] 15 sd +gs clippath +645 6195 m 675 6075 l 705 6195 l 705 6060 l 645 6060 l cp +clip +n 675 6525 m 675 6075 l gs col34 1.00 shd ef gr gs col0 s gr gr + [] 0 sd +% arrowhead +n 645 6195 m 675 6075 l 705 6195 l 675 6195 l 645 6195 l cp gs 0.00 setgray ef gr col0 s +% Polyline + [15 15] 15 sd +gs clippath +5880 6405 m 5850 6525 l 5820 6405 l 5820 6540 l 5880 6540 l cp +clip +n 5850 6075 m 5850 6525 l gs col34 1.00 shd ef gr gs col0 s gr gr + [] 0 sd +% arrowhead +n 5880 6405 m 5850 6525 l 5820 6405 l 5850 6405 l 5880 6405 l cp gs col7 1.00 shd ef gr col0 s +% Polyline +30.000 slw +n 900 5625 m 5625 5625 l gs col34 1.00 shd ef gr gs col0 s gr +% Polyline +n 1125 5175 m 5400 5175 l gs col34 1.00 shd ef gr gs col0 s gr +% Polyline +n 1350 4725 m 5175 4725 l gs col34 1.00 shd ef gr gs col0 s gr +% Polyline +n 1575 4275 m 4950 4275 l gs col34 1.00 shd ef gr gs col0 s gr +% Polyline +n 1800 3825 m 4725 3825 l gs col34 1.00 shd ef gr gs col0 s gr +% Polyline +n 2025 3375 m 4500 3375 l gs col34 1.00 shd ef gr gs col0 s gr +% Polyline +n 2250 2925 m 4275 2925 l gs col34 1.00 shd ef gr gs col0 s gr +% Polyline +n 2475 2475 m 4050 2475 l gs col34 1.00 shd ef gr gs col0 s gr +% Polyline +n 2700 2025 m 3825 2025 l gs col34 1.00 shd ef gr gs col0 s gr +% Polyline +n 2925 1575 m 3600 1575 l gs col34 1.00 shd ef gr gs col0 s gr +% Polyline +7.500 slw + [15 15] 15 sd +gs clippath +870 5745 m 900 5625 l 930 5745 l 930 5610 l 870 5610 l cp +clip +n 900 6075 m 900 5625 l gs col34 1.00 shd ef gr gs col0 s gr gr + [] 0 sd +% arrowhead +n 870 5745 m 900 5625 l 930 5745 l 900 5745 l 870 5745 l cp gs 0.00 setgray ef gr col0 s +% Polyline + [15 15] 15 sd +gs clippath +1095 5295 m 1125 5175 l 1155 5295 l 1155 5160 l 1095 5160 l cp +clip +n 1125 6525 m 1125 5175 l gs col34 1.00 shd ef gr gs col0 s gr gr + [] 0 sd +% arrowhead +n 1095 5295 m 1125 5175 l 1155 5295 l 1125 5295 l 1095 5295 l cp gs 0.00 setgray ef gr col0 s +% Polyline + [15 15] 15 sd +gs clippath +1320 4845 m 1350 4725 l 1380 4845 l 1380 4710 l 1320 4710 l cp +clip +n 1350 5175 m 1350 4725 l gs col34 1.00 shd ef gr gs col0 s gr gr + [] 0 sd +% arrowhead +n 1320 4845 m 1350 4725 l 1380 4845 l 1350 4845 l 1320 4845 l cp gs 0.00 setgray ef gr col0 s +% Polyline + [15 15] 15 sd +gs clippath +1545 4395 m 1575 4275 l 1605 4395 l 1605 4260 l 1545 4260 l cp +clip +n 1575 4725 m 1575 4275 l gs col34 1.00 shd ef gr gs col0 s gr gr + [] 0 sd +% arrowhead +n 1545 4395 m 1575 4275 l 1605 4395 l 1575 4395 l 1545 4395 l cp gs 0.00 setgray ef gr col0 s +% Polyline + [15 15] 15 sd +gs clippath +1770 3945 m 1800 3825 l 1830 3945 l 1830 3810 l 1770 3810 l cp +clip +n 1800 6525 m 1800 3825 l gs col34 1.00 shd ef gr gs col0 s gr gr + [] 0 sd +% arrowhead +n 1770 3945 m 1800 3825 l 1830 3945 l 1800 3945 l 1770 3945 l cp gs 0.00 setgray ef gr col0 s +% Polyline + [15 15] 15 sd +gs clippath +1995 3495 m 2025 3375 l 2055 3495 l 2055 3360 l 1995 3360 l cp +clip +n 2025 3825 m 2025 3375 l gs col34 1.00 shd ef gr gs col0 s gr gr + [] 0 sd +% arrowhead +n 1995 3495 m 2025 3375 l 2055 3495 l 2025 3495 l 1995 3495 l cp gs 0.00 setgray ef gr col0 s +% Polyline + [15 15] 15 sd +gs clippath +2220 3045 m 2250 2925 l 2280 3045 l 2280 2910 l 2220 2910 l cp +clip +n 2250 3375 m 2250 2925 l gs col34 1.00 shd ef gr gs col0 s gr gr + [] 0 sd +% arrowhead +n 2220 3045 m 2250 2925 l 2280 3045 l 2250 3045 l 2220 3045 l cp gs 0.00 setgray ef gr col0 s +% Polyline + [15 15] 15 sd +gs clippath +2445 2595 m 2475 2475 l 2505 2595 l 2505 2460 l 2445 2460 l cp +clip +n 2475 2925 m 2475 2475 l gs col34 1.00 shd ef gr gs col0 s gr gr + [] 0 sd +% arrowhead +n 2445 2595 m 2475 2475 l 2505 2595 l 2475 2595 l 2445 2595 l cp gs 0.00 setgray ef gr col0 s +% Polyline + [15 15] 15 sd +gs clippath +5655 5955 m 5625 6075 l 5595 5955 l 5595 6090 l 5655 6090 l cp +clip +n 5625 5625 m 5625 6075 l gs col34 1.00 shd ef gr gs col0 s gr gr + [] 0 sd +% arrowhead +n 5655 5955 m 5625 6075 l 5595 5955 l 5625 5955 l 5655 5955 l cp gs col7 1.00 shd ef gr col0 s +% Polyline + [15 15] 15 sd +gs clippath +5430 6405 m 5400 6525 l 5370 6405 l 5370 6540 l 5430 6540 l cp +clip +n 5400 5175 m 5400 6525 l gs col34 1.00 shd ef gr gs col0 s gr gr + [] 0 sd +% arrowhead +n 5430 6405 m 5400 6525 l 5370 6405 l 5400 6405 l 5430 6405 l cp gs col7 1.00 shd ef gr col0 s +% Polyline + [15 15] 15 sd +gs clippath +5205 5055 m 5175 5175 l 5145 5055 l 5145 5190 l 5205 5190 l cp +clip +n 5175 4725 m 5175 5175 l gs col34 1.00 shd ef gr gs col0 s gr gr + [] 0 sd +% arrowhead +n 5205 5055 m 5175 5175 l 5145 5055 l 5175 5055 l 5205 5055 l cp gs col7 1.00 shd ef gr col0 s +% Polyline + [15 15] 15 sd +gs clippath +4980 4605 m 4950 4725 l 4920 4605 l 4920 4740 l 4980 4740 l cp +clip +n 4950 4275 m 4950 4725 l gs col34 1.00 shd ef gr gs col0 s gr gr + [] 0 sd +% arrowhead +n 4980 4605 m 4950 4725 l 4920 4605 l 4950 4605 l 4980 4605 l cp gs col7 1.00 shd ef gr col0 s +% Polyline + [15 15] 15 sd +gs clippath +4755 6405 m 4725 6525 l 4695 6405 l 4695 6540 l 4755 6540 l cp +clip +n 4725 3825 m 4725 6525 l gs col34 1.00 shd ef gr gs col0 s gr gr + [] 0 sd +% arrowhead +n 4755 6405 m 4725 6525 l 4695 6405 l 4725 6405 l 4755 6405 l cp gs col7 1.00 shd ef gr col0 s +% Polyline + [15 15] 15 sd +gs clippath +4530 3705 m 4500 3825 l 4470 3705 l 4470 3840 l 4530 3840 l cp +clip +n 4500 3375 m 4500 3825 l gs col34 1.00 shd ef gr gs col0 s gr gr + [] 0 sd +% arrowhead +n 4530 3705 m 4500 3825 l 4470 3705 l 4500 3705 l 4530 3705 l cp gs col7 1.00 shd ef gr col0 s +% Polyline + [15 15] 15 sd +gs clippath +4305 3255 m 4275 3375 l 4245 3255 l 4245 3390 l 4305 3390 l cp +clip +n 4275 2925 m 4275 3375 l gs col34 1.00 shd ef gr gs col0 s gr gr + [] 0 sd +% arrowhead +n 4305 3255 m 4275 3375 l 4245 3255 l 4275 3255 l 4305 3255 l cp gs col7 1.00 shd ef gr col0 s +% Polyline + [15 15] 15 sd +gs clippath +4080 2805 m 4050 2925 l 4020 2805 l 4020 2940 l 4080 2940 l cp +clip +n 4050 2475 m 4050 2925 l gs col34 1.00 shd ef gr gs col0 s gr gr + [] 0 sd +% arrowhead +n 4080 2805 m 4050 2925 l 4020 2805 l 4050 2805 l 4080 2805 l cp gs col7 1.00 shd ef gr col0 s +% Polyline + [15 15] 15 sd +gs clippath +2670 2145 m 2700 2025 l 2730 2145 l 2730 2010 l 2670 2010 l cp +clip +n 2700 6525 m 2700 2025 l gs col34 1.00 shd ef gr gs col0 s gr gr + [] 0 sd +% arrowhead +n 2670 2145 m 2700 2025 l 2730 2145 l 2700 2145 l 2670 2145 l cp gs 0.00 setgray ef gr col0 s +% Polyline + [15 15] 15 sd +gs clippath +3855 6405 m 3825 6525 l 3795 6405 l 3795 6540 l 3855 6540 l cp +clip +n 3825 2025 m 3825 6525 l gs col34 1.00 shd ef gr gs col0 s gr gr + [] 0 sd +% arrowhead +n 3855 6405 m 3825 6525 l 3795 6405 l 3825 6405 l 3855 6405 l cp gs col7 1.00 shd ef gr col0 s +% Polyline + [15 15] 15 sd +gs clippath +3630 1905 m 3600 2025 l 3570 1905 l 3570 2040 l 3630 2040 l cp +clip +n 3600 1575 m 3600 2025 l gs col34 1.00 shd ef gr gs col0 s gr gr + [] 0 sd +% arrowhead +n 3630 1905 m 3600 2025 l 3570 1905 l 3600 1905 l 3630 1905 l cp gs col7 1.00 shd ef gr col0 s +% Polyline + [15 15] 15 sd +gs clippath +2895 1695 m 2925 1575 l 2955 1695 l 2955 1560 l 2895 1560 l cp +clip +n 2925 2025 m 2925 1575 l gs col34 1.00 shd ef gr gs col0 s gr gr + [] 0 sd +% arrowhead +n 2895 1695 m 2925 1575 l 2955 1695 l 2925 1695 l 2895 1695 l cp gs 0.00 setgray ef gr col0 s +% Polyline +45.000 slw +gs clippath +6087 6495 m 6207 6525 l 6087 6555 l 6360 6555 l 6360 6495 l cp +clip +n 540 6525 m 6300 6525 l gs 0.00 setgray ef gr gs col0 s gr gr + +% arrowhead +n 6087 6495 m 6207 6525 l 6087 6555 l 6087 6525 l 6087 6495 l cp gs 0.00 setgray ef gr col0 s +% Polyline +7.500 slw +gs clippath +3681 6720 m 3825 6750 l 3681 6780 l 3840 6780 l 3840 6720 l cp +2844 6780 m 2700 6750 l 2844 6720 l 2685 6720 l 2685 6780 l cp +clip +n 2700 6750 m 3825 6750 l gs col34 1.00 shd ef gr gs col0 s gr gr + +% arrowhead +n 2844 6780 m 2700 6750 l 2844 6720 l 2820 6750 l 2844 6780 l cp gs col7 1.00 shd ef gr col0 s +% arrowhead +n 3681 6720 m 3825 6750 l 3681 6780 l 3705 6750 l 3681 6720 l cp gs col7 1.00 shd ef gr col0 s +% Polyline +gs clippath +5256 7170 m 5400 7200 l 5256 7230 l 5415 7230 l 5415 7170 l cp +1269 7230 m 1125 7200 l 1269 7170 l 1110 7170 l 1110 7230 l cp +clip +n 1125 7200 m 5400 7200 l gs col34 1.00 shd ef gr gs col0 s gr gr + +% arrowhead +n 1269 7230 m 1125 7200 l 1269 7170 l 1245 7200 l 1269 7230 l cp gs col7 1.00 shd ef gr col0 s +% arrowhead +n 5256 7170 m 5400 7200 l 5256 7230 l 5280 7200 l 5256 7170 l cp gs col7 1.00 shd ef gr col0 s +% Polyline +gs clippath +4581 6945 m 4725 6975 l 4581 7005 l 4740 7005 l 4740 6945 l cp +1944 7005 m 1800 6975 l 1944 6945 l 1785 6945 l 1785 7005 l cp +clip +n 1800 6975 m 4725 6975 l gs col34 1.00 shd ef gr gs col0 s gr gr + +% arrowhead +n 1944 7005 m 1800 6975 l 1944 6945 l 1920 6975 l 1944 7005 l cp gs col7 1.00 shd ef gr col0 s +% arrowhead +n 4581 6945 m 4725 6975 l 4581 7005 l 4605 6975 l 4581 6945 l cp gs col7 1.00 shd ef gr col0 s +% Polyline +gs clippath +5706 7395 m 5850 7425 l 5706 7455 l 5865 7455 l 5865 7395 l cp +819 7455 m 675 7425 l 819 7395 l 660 7395 l 660 7455 l cp +clip +n 675 7425 m 5850 7425 l gs col34 1.00 shd ef gr gs col0 s gr gr + +% arrowhead +n 819 7455 m 675 7425 l 819 7395 l 795 7425 l 819 7455 l cp gs col7 1.00 shd ef gr col0 s +% arrowhead +n 5706 7395 m 5850 7425 l 5706 7455 l 5730 7425 l 5706 7395 l cp gs col7 1.00 shd ef gr col0 s +% Polyline +1 slc + [15 45] 45 sd +n 675 6570 m 675 7650 l gs col34 1.00 shd ef gr gs col0 s gr [] 0 sd +% Polyline + [15 45] 45 sd +n 1125 6570 m 1125 7650 l gs col34 1.00 shd ef gr gs col0 s gr [] 0 sd +% Polyline + [15 45] 45 sd +n 1800 6570 m 1800 7650 l gs col34 1.00 shd ef gr gs col0 s gr [] 0 sd +% Polyline + [15 45] 45 sd +n 2700 6570 m 2700 7650 l gs col34 1.00 shd ef gr gs col0 s gr [] 0 sd +% Polyline + [15 45] 45 sd +n 3825 6570 m 3825 7650 l gs col34 1.00 shd ef gr gs col0 s gr [] 0 sd +% Polyline + [15 45] 45 sd +n 4725 6570 m 4725 7650 l gs col34 1.00 shd ef gr gs col0 s gr [] 0 sd +% Polyline + [15 45] 45 sd +n 5400 6570 m 5400 7650 l gs col34 1.00 shd ef gr gs col0 s gr [] 0 sd +% Polyline + [15 45] 45 sd +n 5850 6570 m 5850 7650 l gs col34 1.00 shd ef gr gs col0 s gr [] 0 sd +% Polyline +0 slc +n 750 225 m 450 225 450 1050 300 arcto 4 {pop} repeat + 450 1350 12300 1350 300 arcto 4 {pop} repeat + 12600 1350 12600 525 300 arcto 4 {pop} repeat + 12600 225 750 225 300 arcto 4 {pop} repeat + cp gs col34 1.00 shd ef gr gs col0 s gr +% Polyline +n 8835 2250 m 8775 2250 8775 2415 60 arcto 4 {pop} repeat + 8775 2475 10110 2475 60 arcto 4 {pop} repeat + 10170 2475 10170 2310 60 arcto 4 {pop} repeat + 10170 2250 8835 2250 60 arcto 4 {pop} repeat + cp gs col35 1.00 shd ef gr gs col35 s gr +% Polyline +n 10635 2250 m 10575 2250 10575 2415 60 arcto 4 {pop} repeat + 10575 2475 11865 2475 60 arcto 4 {pop} repeat + 11925 2475 11925 2310 60 arcto 4 {pop} repeat + 11925 2250 10635 2250 60 arcto 4 {pop} repeat + cp gs col35 1.00 shd ef gr gs col35 s gr +% Polyline +n 11490 4275 m 11430 4275 11430 4440 60 arcto 4 {pop} repeat + 11430 4500 12315 4500 60 arcto 4 {pop} repeat + 12375 4500 12375 4335 60 arcto 4 {pop} repeat + 12375 4275 11490 4275 60 arcto 4 {pop} repeat + cp gs col35 1.00 shd ef gr gs col35 s gr +% Polyline +n 11040 5175 m 10980 5175 10980 5340 60 arcto 4 {pop} repeat + 10980 5400 12315 5400 60 arcto 4 {pop} repeat + 12375 5400 12375 5235 60 arcto 4 {pop} repeat + 12375 5175 11040 5175 60 arcto 4 {pop} repeat + cp gs col35 1.00 shd ef gr gs col35 s gr +% Polyline +n 9735 5175 m 9675 5175 9675 5340 60 arcto 4 {pop} repeat + 9675 5400 10110 5400 60 arcto 4 {pop} repeat + 10170 5400 10170 5235 60 arcto 4 {pop} repeat + 10170 5175 9735 5175 60 arcto 4 {pop} repeat + cp gs col35 1.00 shd ef gr gs col35 s gr +% Polyline +n 7260 6075 m 7200 6075 7200 6240 60 arcto 4 {pop} repeat + 7200 6300 7815 6300 60 arcto 4 {pop} repeat + 7875 6300 7875 6135 60 arcto 4 {pop} repeat + 7875 6075 7260 6075 60 arcto 4 {pop} repeat + cp gs col35 1.00 shd ef gr gs col35 s gr +% Polyline +n 6810 2250 m 6750 2250 6750 2415 60 arcto 4 {pop} repeat + 6750 2475 8130 2475 60 arcto 4 {pop} repeat + 8190 2475 8190 2310 60 arcto 4 {pop} repeat + 8190 2250 6810 2250 60 arcto 4 {pop} repeat + cp gs col35 1.00 shd ef gr gs col35 s gr +% Polyline +n 6360 3375 m 6300 3375 6300 3540 60 arcto 4 {pop} repeat + 6300 3600 7545 3600 60 arcto 4 {pop} repeat + 7605 3600 7605 3435 60 arcto 4 {pop} repeat + 7605 3375 6360 3375 60 arcto 4 {pop} repeat + cp gs col35 1.00 shd ef gr gs col35 s gr +% Polyline +n 6360 4275 m 6300 4275 6300 4440 60 arcto 4 {pop} repeat + 6300 4500 7275 4500 60 arcto 4 {pop} repeat + 7335 4500 7335 4335 60 arcto 4 {pop} repeat + 7335 4275 6360 4275 60 arcto 4 {pop} repeat + cp gs col35 1.00 shd ef gr gs col35 s gr +% Polyline +n 6360 5175 m 6300 5175 6300 5340 60 arcto 4 {pop} repeat + 6300 5400 7140 5400 60 arcto 4 {pop} repeat + 7200 5400 7200 5235 60 arcto 4 {pop} repeat + 7200 5175 6360 5175 60 arcto 4 {pop} repeat + cp gs col35 1.00 shd ef gr gs col35 s gr +% Polyline +gs clippath +7365 5340 m 7245 5310 l 7365 5280 l 7230 5280 l 7230 5340 l cp +clip +n 9630 5310 m 7245 5310 l gs col34 1.00 shd ef gr gs col0 s gr gr + +% arrowhead +n 7365 5340 m 7245 5310 l 7365 5280 l 7365 5310 l 7365 5340 l cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +7500 4395 m 7380 4365 l 7500 4335 l 7365 4335 l 7365 4395 l cp +clip +n 11385 4365 m 7380 4365 l gs col34 1.00 shd ef gr gs col0 s gr gr + +% arrowhead +n 7500 4395 m 7380 4365 l 7500 4335 l 7500 4365 l 7500 4395 l cp gs 0.00 setgray ef gr col0 s +% Polyline +n 11040 5580 m 10980 5580 10980 5745 60 arcto 4 {pop} repeat + 10980 5805 12180 5805 60 arcto 4 {pop} repeat + 12240 5805 12240 5640 60 arcto 4 {pop} repeat + 12240 5580 11040 5580 60 arcto 4 {pop} repeat + cp gs col35 1.00 shd ef gr gs col35 s gr +% Polyline +n 11040 5985 m 10980 5985 10980 6150 60 arcto 4 {pop} repeat + 10980 6210 12315 6210 60 arcto 4 {pop} repeat + 12375 6210 12375 6045 60 arcto 4 {pop} repeat + 12375 5985 11040 5985 60 arcto 4 {pop} repeat + cp gs col35 1.00 shd ef gr gs col35 s gr +% Polyline +gs clippath +9958 5554 m 9900 5445 l 10003 5514 l 9912 5414 l 9868 5454 l cp +clip +n 11205 6885 m 9900 5445 l gs col34 1.00 shd ef gr gs col0 s gr gr + +% arrowhead +n 9958 5554 m 9900 5445 l 10003 5514 l 9981 5534 l 9958 5554 l cp gs 0.00 setgray ef gr col0 s +% Polyline +n 10590 6930 m 10530 6930 10530 7095 60 arcto 4 {pop} repeat + 10530 7155 12225 7155 60 arcto 4 {pop} repeat + 12285 7155 12285 6990 60 arcto 4 {pop} repeat + 12285 6930 10590 6930 60 arcto 4 {pop} repeat + cp gs col35 1.00 shd ef gr gs col35 s gr +% Polyline +n 9690 6930 m 9630 6930 9630 7095 60 arcto 4 {pop} repeat + 9630 7155 10110 7155 60 arcto 4 {pop} repeat + 10170 7155 10170 6990 60 arcto 4 {pop} repeat + 10170 6930 9690 6930 60 arcto 4 {pop} repeat + cp gs col35 1.00 shd ef gr gs col35 s gr +/Times-Roman-iso ff 120.00 scf sf +900 7560 m +gs 1 -1 sc (Startup, Runtime, Shutdown) col0 sh gr +/Helvetica-Narrow-iso ff 120.00 scf sf +6345 2970 m +gs 1 -1 sc (ap_ctx_get\(...,) col0 sh gr +/Helvetica-Narrow-iso ff 120.00 scf sf +10800 2745 m +gs 1 -1 sc (ap_get_module_config\(...) col0 sh gr +/Helvetica-Narrow-iso ff 120.00 scf sf +10800 2880 m +gs 1 -1 sc (->per_dir_config,) col0 sh gr +/Helvetica-Narrow-iso ff 120.00 scf sf +10800 3015 m +gs 1 -1 sc (&ssl_module\)) col0 sh gr +% Polyline +n 7980 4770 m 7920 4770 7920 4935 60 arcto 4 {pop} repeat + 7920 4995 9075 4995 60 arcto 4 {pop} repeat + 9135 4995 9135 4830 60 arcto 4 {pop} repeat + 9135 4770 7980 4770 60 arcto 4 {pop} repeat + cp gs col35 1.00 shd ef gr gs col35 s gr +% Polyline +gs clippath +7340 2610 m 7425 2520 l 7393 2639 l 7459 2521 l 7406 2492 l cp +clip +n 6975 3330 m 7425 2520 l gs col34 1.00 shd ef gr gs col0 s gr gr + +% arrowhead +n 7340 2610 m 7425 2520 l 7393 2639 l 7367 2625 l 7340 2610 l cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +9336 2569 m 9450 2520 l 9373 2616 l 9480 2535 l 9444 2487 l cp +clip +n 7200 4230 m 9450 2520 l gs col34 1.00 shd ef gr gs col0 s gr gr + +% arrowhead +n 9336 2569 m 9450 2520 l 9373 2616 l 9354 2593 l 9336 2569 l cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +7321 5196 m 7200 5220 l 7296 5142 l 7174 5199 l 7199 5254 l cp +clip +n 7875 4905 m 7200 5220 l gs col34 1.00 shd ef gr gs col0 s gr gr + +% arrowhead +n 7321 5196 m 7200 5220 l 7296 5142 l 7309 5169 l 7321 5196 l cp gs 0.00 setgray ef gr col0 s +% Polyline +gs clippath +6720 4665 m 6750 4545 l 6780 4665 l 6780 4530 l 6720 4530 l cp +clip +n 6750 5130 m 6750 4545 l gs col34 1.00 shd ef gr gs col0 s gr gr + +% arrowhead +n 6720 4665 m 6750 4545 l 6780 4665 l 6750 4665 l 6720 4665 l cp gs 0.00 setgray ef gr col0 s +% Polyline + [15 15] 15 sd +gs clippath +9279 4984 m 9175 4918 l 9298 4927 l 9170 4885 l 9151 4942 l cp +clip +n 9850 5143 m 9175 4918 l gs col34 1.00 shd ef gr gs col0 s gr gr + [] 0 sd +% arrowhead +n 9279 4984 m 9175 4918 l 9298 4927 l 9289 4956 l 9279 4984 l cp gs 0.00 setgray ef gr col0 s +/Helvetica-Narrow-iso ff 120.00 scf sf +6210 4680 m +gs 1 -1 sc (->server) col0 sh gr +/Helvetica-Narrow-iso ff 120.00 scf sf +8280 6120 m +gs 1 -1 sc (ap_ctx_get\(...,"ssl"\)) col0 sh gr +/Helvetica-Narrow-iso ff 120.00 scf sf +7740 2700 m +gs 1 -1 sc (ap_get_module_config\(...) col0 sh gr +/Helvetica-Narrow-iso ff 120.00 scf sf +7740 2835 m +gs 1 -1 sc (->module_config,) col0 sh gr +/Helvetica-Narrow-iso ff 120.00 scf sf +7740 2970 m +gs 1 -1 sc (&ssl_module\)) col0 sh gr +/Helvetica-Narrow-iso ff 120.00 scf sf +6345 3105 m +gs 1 -1 sc ("ssl_module"\)) col0 sh gr +/Times-Roman-iso ff 120.00 scf sf +1350 7335 m +gs 1 -1 sc (Configuration Time) col0 sh gr +/Times-Roman-iso ff 120.00 scf sf +2025 7110 m +gs 1 -1 sc (Connection Duration) col0 sh gr +/Times-Roman-iso ff 120.00 scf sf +2835 6885 m +gs 1 -1 sc (Request Duration) col0 sh gr +/Helvetica-Bold-iso ff 300.00 scf sf +6345 6795 m +gs 1 -1 sc (t) col0 sh gr +/Helvetica-Narrow-iso ff 120.00 scf sf +7110 5985 m +gs 1 -1 sc (->client) col0 sh gr +/Helvetica-Narrow-iso ff 120.00 scf sf +7065 5085 m +gs 1 -1 sc (->connection) col0 sh gr +/Helvetica-Narrow-iso ff 120.00 scf sf +7065 4770 m +gs 1 -1 sc (->server) col0 sh gr +/Helvetica-Narrow-iso ff 120.00 scf sf +8010 5445 m +gs 1 -1 sc (SSL_get_app_data\(\)) col0 sh gr +/Helvetica-Narrow-iso ff 120.00 scf sf +10530 4050 m +gs 1 -1 sc (->pSSLCtx) col0 sh gr +/Helvetica-Narrow-iso ff 120.00 scf sf +7875 4275 m +gs 1 -1 sc (SSL_CTX_get_app_data\(\)) col0 sh gr +/Helvetica-Narrow-iso ff 120.00 scf sf +10305 5535 m +gs 1 -1 sc (SSL_get_current_cipher\(\)) col0 sh gr +/Helvetica-Narrow-iso ff 120.00 scf sf +10440 5940 m +gs 1 -1 sc (SSL_get_session\(\)) col0 sh gr +/Helvetica-Narrow-iso ff 120.00 scf sf +9540 7335 m +gs 1 -1 sc (SSL_get_{r,w}bio\(\)) col0 sh gr +/Helvetica-Narrow-iso ff 120.00 scf sf +10125 4680 m +gs 1 -1 sc (SSL_get_SSL_CTX\(\)) col0 sh gr +/Helvetica-Narrow-iso ff 120.00 scf sf +10350 5175 m +gs 1 -1 sc (SSL_get_SSL_METHOD\(\)) col0 sh gr +/Helvetica-Narrow-iso ff 120.00 scf sf +11745 4770 m +gs 1 -1 sc (->method) col0 sh gr +/Helvetica-Narrow-iso ff 120.00 scf sf +9945 6480 m +gs 1 -1 sc (X509_STORE_CTX_get_app_data\(\)) col0 sh gr +/Helvetica-Narrow-iso ff 120.00 scf sf +10980 6705 m +gs 1 -1 sc (SSL_CTX_get_cert_store\(\)) col0 sh gr +/Helvetica-Narrow-iso ff 120.00 scf sf +8280 5130 m +gs 1 -1 sc (SSL_get_app_data2\(\)) col0 sh gr +/Helvetica-Bold-iso ff 180.00 scf sf +3645 1620 m +gs 1 -1 sc (SSLDirConfig) col0 sh gr +/Helvetica-Bold-iso ff 300.00 scf sf +10935 3645 m +gs 1 -1 sc (OpenSSL) col0 sh gr +/Helvetica-Bold-iso ff 180.00 scf sf +10935 3825 m +gs 1 -1 sc ([SSL]) col0 sh gr +/Helvetica-Bold-iso ff 180.00 scf sf +11025 5760 m +gs 1 -1 sc (SSL_CIPHER) col0 sh gr +/Helvetica-Bold-iso ff 180.00 scf sf +10980 6165 m +gs 1 -1 sc (SSL_SESSION) col0 sh gr +/Helvetica-Bold-iso ff 300.00 scf sf +10710 7605 m +gs 1 -1 sc (OpenSSL) col0 sh gr +/Helvetica-Bold-iso ff 180.00 scf sf +10575 7110 m +gs 1 -1 sc (X509_STORE_CTX) col0 sh gr +/Helvetica-Bold-iso ff 180.00 scf sf +6795 2430 m +gs 1 -1 sc (SSLModConfig) col0 sh gr +/Helvetica-Bold-iso ff 180.00 scf sf +8865 2430 m +gs 1 -1 sc (SSLSrvConfig) col0 sh gr +/Helvetica-Bold-iso ff 180.00 scf sf +6345 3555 m +gs 1 -1 sc (ap_global_ctx) col0 sh gr +/Helvetica-Bold-iso ff 180.00 scf sf +6345 4455 m +gs 1 -1 sc (server_rec) col0 sh gr +/Helvetica-Bold-iso ff 180.00 scf sf +6345 5355 m +gs 1 -1 sc (conn_rec) col0 sh gr +/Helvetica-Bold-iso ff 180.00 scf sf +9720 5355 m +gs 1 -1 sc (SSL) col0 sh gr +/Helvetica-Bold-iso ff 180.00 scf sf +10665 2430 m +gs 1 -1 sc (SSLDirConfig) col0 sh gr +/Helvetica-Bold-iso ff 180.00 scf sf +7290 6255 m +gs 1 -1 sc (BUFF) col0 sh gr +/Helvetica-Bold-iso ff 180.00 scf sf +11025 5355 m +gs 1 -1 sc (SSL_METHOD) col0 sh gr +% Polyline +15.000 slw +n 750 225 m 450 225 450 8250 300 arcto 4 {pop} repeat + 450 8550 12300 8550 300 arcto 4 {pop} repeat + 12600 8550 12600 525 300 arcto 4 {pop} repeat + 12600 225 750 225 300 arcto 4 {pop} repeat + cp gs col0 s gr +/Helvetica-Bold-iso ff 180.00 scf sf +11475 4455 m +gs 1 -1 sc (SSL_CTX) col0 sh gr +/Helvetica-Bold-iso ff 180.00 scf sf +8010 4950 m +gs 1 -1 sc (request_rec) col0 sh gr +/Times-Roman-iso ff 180.00 scf sf +10575 675 m +gs 1 -1 sc (Ralf S. Engelschall) col0 sh gr +/Helvetica-Bold-iso ff 300.00 scf sf +4275 675 m +gs 1 -1 sc (Apache+mod_ssl+OpenSSL) col0 sh gr +/Times-Roman-iso ff 150.00 scf sf +10575 855 m +gs 1 -1 sc (rse@engelschall.com) col0 sh gr +/Times-Roman-iso ff 150.00 scf sf +10575 1035 m +gs 1 -1 sc (www.engelschall.com) col0 sh gr +/Times-Roman-iso ff 180.00 scf sf +900 675 m +gs 1 -1 sc (Version 1.3) col0 sh gr +/Times-Roman-iso ff 180.00 scf sf +900 855 m +gs 1 -1 sc (12-Apr-1999) col0 sh gr +/Helvetica-Bold-iso ff 360.00 scf sf +3915 1080 m +gs 1 -1 sc (Data Structure Overview) col0 sh gr +/Helvetica-Bold-iso ff 180.00 scf sf +9720 7110 m +gs 1 -1 sc (BIO) col0 sh gr +/Helvetica-Bold-iso ff 180.00 scf sf +10710 7785 m +gs 1 -1 sc ([Crypto]) col0 sh gr +/Helvetica-Bold-iso ff 300.00 scf sf +8730 3465 m +gs 1 -1 sc (mod_ssl) col0 sh gr +/Helvetica-Bold-iso ff 300.00 scf sf +8145 6750 m +gs 1 -1 sc (Apache) col0 sh gr +/Helvetica-Bold-iso ff 300.00 scf sf +9000 8100 m +gs 1 -1 sc (Chaining) col0 sh gr +/Helvetica-Bold-iso ff 300.00 scf sf +2745 8100 m +gs 1 -1 sc (Lifetime) col0 sh gr +/Helvetica-Bold-iso ff 180.00 scf sf +810 6255 m +gs 1 -1 sc (ap_global_ctx) col0 sh gr +/Helvetica-Bold-iso ff 180.00 scf sf +990 5805 m +gs 1 -1 sc (SSLModConfig) col0 sh gr +/Helvetica-Bold-iso ff 180.00 scf sf +4050 4455 m +gs 1 -1 sc (SSL_CTX) col0 sh gr +/Helvetica-Bold-iso ff 180.00 scf sf +4455 5355 m +gs 1 -1 sc (server_rec) col0 sh gr +/Helvetica-Bold-iso ff 180.00 scf sf +3870 4905 m +gs 1 -1 sc (SSLSrvConfig) col0 sh gr +/Helvetica-Bold-iso ff 180.00 scf sf +1845 4005 m +gs 1 -1 sc (BUFF) col0 sh gr +/Helvetica-Bold-iso ff 180.00 scf sf +2070 3555 m +gs 1 -1 sc (conn_rec) col0 sh gr +/Helvetica-Bold-iso ff 180.00 scf sf +2295 3105 m +gs 1 -1 sc (BIO) col0 sh gr +/Helvetica-Bold-iso ff 180.00 scf sf +2565 2655 m +gs 1 -1 sc (SSL) col0 sh gr +/Helvetica-Bold-iso ff 180.00 scf sf +3915 2070 m +gs 1 -1 sc (request_rec) col0 sh gr +$F2psEnd +rs +showpage diff --git a/rubbos/app/httpd-2.0.64/modules/ssl/config.m4 b/rubbos/app/httpd-2.0.64/modules/ssl/config.m4 new file mode 100644 index 00000000..8cb4b42e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/ssl/config.m4 @@ -0,0 +1,54 @@ +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 # start of module specific part +APACHE_MODPATH_INIT(ssl) + +dnl # list of module object files +ssl_objs="dnl +mod_ssl.lo dnl +ssl_engine_config.lo dnl +ssl_engine_dh.lo dnl +ssl_engine_init.lo dnl +ssl_engine_io.lo dnl +ssl_engine_kernel.lo dnl +ssl_engine_log.lo dnl +ssl_engine_mutex.lo dnl +ssl_engine_pphrase.lo dnl +ssl_engine_rand.lo dnl +ssl_engine_vars.lo dnl +ssl_expr.lo dnl +ssl_expr_eval.lo dnl +ssl_expr_parse.lo dnl +ssl_expr_scan.lo dnl +ssl_scache.lo dnl +ssl_scache_dbm.lo dnl +ssl_scache_shmcb.lo dnl +ssl_scache_shmht.lo dnl +ssl_util.lo dnl +ssl_util_ssl.lo dnl +ssl_util_table.lo dnl +" +dnl # hook module into the Autoconf mechanism (--enable-ssl option) +APACHE_MODULE(ssl, [SSL/TLS support (mod_ssl)], $ssl_objs, , no, [ + APACHE_CHECK_SSL_TOOLKIT + APR_SETVAR(MOD_SSL_LDADD, [\$(SSL_LIBS)]) + AC_CHECK_FUNCS(SSL_set_state) + AC_CHECK_FUNCS(SSL_set_cert_store) +]) + +dnl # end of module specific part +APACHE_MODPATH_FINISH + diff --git a/rubbos/app/httpd-2.0.64/modules/ssl/mod_ssl.c b/rubbos/app/httpd-2.0.64/modules/ssl/mod_ssl.c new file mode 100644 index 00000000..dd22ec9a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/ssl/mod_ssl.c @@ -0,0 +1,428 @@ +/* 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. + */ + +/* _ _ + * _ __ ___ ___ __| | ___ ___| | mod_ssl + * | '_ ` _ \ / _ \ / _` | / __/ __| | Apache Interface to OpenSSL + * | | | | | | (_) | (_| | \__ \__ \ | + * |_| |_| |_|\___/ \__,_|___|___/___/_| + * |_____| + * mod_ssl.c + * Apache API interface structures + */ + +#include "mod_ssl.h" +#include "util_md5.h" +#include + +/* + * the table of configuration directives we provide + */ + +#define SSL_CMD_ALL(name, args, desc) \ + AP_INIT_##args("SSL"#name, ssl_cmd_SSL##name, \ + NULL, RSRC_CONF|OR_AUTHCFG, desc), + +#define SSL_CMD_SRV(name, args, desc) \ + AP_INIT_##args("SSL"#name, ssl_cmd_SSL##name, \ + NULL, RSRC_CONF, desc), + +#define SSL_CMD_DIR(name, type, args, desc) \ + AP_INIT_##args("SSL"#name, ssl_cmd_SSL##name, \ + NULL, OR_##type, desc), + +#define AP_END_CMD { NULL } + +const char ssl_valid_ssl_mutex_string[] = + "Valid SSLMutex mechanisms are: `none', `default'" +#if APR_HAS_FLOCK_SERIALIZE + ", `flock:/path/to/file'" +#endif +#if APR_HAS_FCNTL_SERIALIZE + ", `fcntl:/path/to/file'" +#endif +#if APR_HAS_SYSVSEM_SERIALIZE && !defined(PERCHILD_MPM) + ", `sysvsem'" +#endif +#if APR_HAS_POSIXSEM_SERIALIZE + ", `posixsem'" +#endif +#if APR_HAS_PROC_PTHREAD_SERIALIZE + ", `pthread'" +#endif +#if APR_HAS_FLOCK_SERIALIZE || APR_HAS_FCNTL_SERIALIZE + ", `file:/path/to/file'" +#endif +#if (APR_HAS_SYSVSEM_SERIALIZE && !defined(PERCHILD_MPM)) || APR_HAS_POSIXSEM_SERIALIZE + ", `sem'" +#endif + " "; + +static const command_rec ssl_config_cmds[] = { + /* + * Global (main-server) context configuration directives + */ + SSL_CMD_SRV(Mutex, TAKE1, ssl_valid_ssl_mutex_string) + SSL_CMD_SRV(PassPhraseDialog, TAKE1, + "SSL dialog mechanism for the pass phrase query " + "(`builtin', `|/path/to/pipe_program`, " + "or `exec:/path/to/cgi_program')") + SSL_CMD_SRV(SessionCache, TAKE1, + "SSL Session Cache storage " + "(`none', `dbm:/path/to/file')") +#ifdef SSL_EXPERIMENTAL_ENGINE + SSL_CMD_SRV(CryptoDevice, TAKE1, + "SSL external Crypto Device usage " + "(`builtin', `...')") +#endif + SSL_CMD_SRV(RandomSeed, TAKE23, + "SSL Pseudo Random Number Generator (PRNG) seeding source " + "(`startup|connect builtin|file:/path|exec:/path [bytes]')") + + /* + * Per-server context configuration directives + */ + SSL_CMD_SRV(Engine, FLAG, + "SSL switch for the protocol engine " + "(`on', `off')") + SSL_CMD_ALL(CipherSuite, TAKE1, + "Colon-delimited list of permitted SSL Ciphers " + "(`XXX:...:XXX' - see manual)") + SSL_CMD_SRV(CertificateFile, TAKE1, + "SSL Server Certificate file " + "(`/path/to/file' - PEM or DER encoded)") + SSL_CMD_SRV(CertificateKeyFile, TAKE1, + "SSL Server Private Key file " + "(`/path/to/file' - PEM or DER encoded)") + SSL_CMD_SRV(CertificateChainFile, TAKE1, + "SSL Server CA Certificate Chain file " + "(`/path/to/file' - PEM encoded)") + SSL_CMD_ALL(CACertificatePath, TAKE1, + "SSL CA Certificate path " + "(`/path/to/dir' - contains PEM encoded files)") + SSL_CMD_ALL(CACertificateFile, TAKE1, + "SSL CA Certificate file " + "(`/path/to/file' - PEM encoded)") + SSL_CMD_SRV(CARevocationPath, TAKE1, + "SSL CA Certificate Revocation List (CRL) path " + "(`/path/to/dir' - contains PEM encoded files)") + SSL_CMD_SRV(CARevocationFile, TAKE1, + "SSL CA Certificate Revocation List (CRL) file " + "(`/path/to/file' - PEM encoded)") + SSL_CMD_ALL(VerifyClient, TAKE1, + "SSL Client verify type " + "(`none', `optional', `require', `optional_no_ca')") + SSL_CMD_ALL(VerifyDepth, TAKE1, + "SSL Client verify depth " + "(`N' - number of intermediate certificates)") + SSL_CMD_SRV(SessionCacheTimeout, TAKE1, + "SSL Session Cache object lifetime " + "(`N' - number of seconds)") + SSL_CMD_SRV(Protocol, RAW_ARGS, + "Enable or disable various SSL protocols" + "(`[+-][SSLv2|SSLv3|TLSv1] ...' - see manual)") + SSL_CMD_ALL(UserName, TAKE1, + "Set user name to SSL variable value") + SSL_CMD_SRV(InsecureRenegotiation, FLAG, + "Enable support for insecure renegotiation") + + /* + * Proxy configuration for remote SSL connections + */ + SSL_CMD_SRV(ProxyEngine, FLAG, + "SSL switch for the proxy protocol engine " + "(`on', `off')") + SSL_CMD_SRV(ProxyProtocol, RAW_ARGS, + "SSL Proxy: enable or disable SSL protocol flavors " + "(`[+-][SSLv2|SSLv3|TLSv1] ...' - see manual)") + SSL_CMD_SRV(ProxyCipherSuite, TAKE1, + "SSL Proxy: colon-delimited list of permitted SSL ciphers " + "(`XXX:...:XXX' - see manual)") + SSL_CMD_SRV(ProxyVerify, TAKE1, + "SSL Proxy: whether to verify the remote certificate " + "(`on' or `off')") + SSL_CMD_SRV(ProxyVerifyDepth, TAKE1, + "SSL Proxy: maximum certificate verification depth " + "(`N' - number of intermediate certificates)") + SSL_CMD_SRV(ProxyCACertificateFile, TAKE1, + "SSL Proxy: file containing server certificates " + "(`/path/to/file' - PEM encoded certificates)") + SSL_CMD_SRV(ProxyCACertificatePath, TAKE1, + "SSL Proxy: directory containing server certificates " + "(`/path/to/dir' - contains PEM encoded certificates)") + SSL_CMD_SRV(ProxyCARevocationPath, TAKE1, + "SSL Proxy: CA Certificate Revocation List (CRL) path " + "(`/path/to/dir' - contains PEM encoded files)") + SSL_CMD_SRV(ProxyCARevocationFile, TAKE1, + "SSL Proxy: CA Certificate Revocation List (CRL) file " + "(`/path/to/file' - PEM encoded)") + SSL_CMD_SRV(ProxyMachineCertificateFile, TAKE1, + "SSL Proxy: file containing client certificates " + "(`/path/to/file' - PEM encoded certificates)") + SSL_CMD_SRV(ProxyMachineCertificatePath, TAKE1, + "SSL Proxy: directory containing client certificates " + "(`/path/to/dir' - contains PEM encoded certificates)") + + /* + * Per-directory context configuration directives + */ + SSL_CMD_DIR(Options, OPTIONS, RAW_ARGS, + "Set one or more options to configure the SSL engine" + "(`[+-]option[=value] ...' - see manual)") + SSL_CMD_DIR(RequireSSL, AUTHCFG, NO_ARGS, + "Require the SSL protocol for the per-directory context " + "(no arguments)") + SSL_CMD_DIR(Require, AUTHCFG, RAW_ARGS, + "Require a boolean expression to evaluate to true for granting access" + "(arbitrary complex boolean expression - see manual)") + + /* Deprecated directives. */ + AP_INIT_RAW_ARGS("SSLLog", ap_set_deprecated, NULL, OR_ALL, + "SSLLog directive is no longer supported - use ErrorLog."), + AP_INIT_RAW_ARGS("SSLLogLevel", ap_set_deprecated, NULL, OR_ALL, + "SSLLogLevel directive is no longer supported - use LogLevel."), + + AP_END_CMD +}; + +/* + * the various processing hooks + */ + +static int ssl_hook_pre_config(apr_pool_t *pconf, + apr_pool_t *plog, + apr_pool_t *ptemp) +{ + /* Preregister the malloc callbacks so cmds can make library calls */ + CRYPTO_malloc_init(); + + /* Register us to handle mod_log_config %c/%x variables */ + ssl_var_log_config_register(pconf); +#if 0 /* XXX */ + /* XXX: Register us to handle mod_status extensions that don't exist yet */ + ssl_scache_status_register(pconf); +#endif /* -0- */ + + return OK; +} + +static SSLConnRec *ssl_init_connection_ctx(conn_rec *c) +{ + SSLConnRec *sslconn = myConnConfig(c); + + if (sslconn) { + return sslconn; + } + + sslconn = apr_pcalloc(c->pool, sizeof(*sslconn)); + + myConnConfigSet(c, sslconn); + + return sslconn; +} + +int ssl_proxy_enable(conn_rec *c) +{ + SSLSrvConfigRec *sc = mySrvConfig(c->base_server); + + SSLConnRec *sslconn = ssl_init_connection_ctx(c); + + if (!sc->proxy_enabled) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, c->base_server, + "SSL Proxy requested for %s but not enabled " + "[Hint: SSLProxyEngine]", sc->vhost_id); + + return 0; + } + + sslconn->is_proxy = 1; + sslconn->disabled = 0; + + return 1; +} + +int ssl_engine_disable(conn_rec *c) +{ + SSLSrvConfigRec *sc = mySrvConfig(c->base_server); + + SSLConnRec *sslconn; + + if (!sc->enabled) { + return 0; + } + + sslconn = ssl_init_connection_ctx(c); + + sslconn->disabled = 1; + + return 1; +} + +static int ssl_hook_pre_connection(conn_rec *c, void *csd) +{ + SSLSrvConfigRec *sc = mySrvConfig(c->base_server); + SSL *ssl; + SSLConnRec *sslconn = myConnConfig(c); + char *vhost_md5; + modssl_ctx_t *mctx; + + /* + * Immediately stop processing if SSL is disabled for this connection + */ + if (!(sc && (sc->enabled || + (sslconn && sslconn->is_proxy)))) + { + return DECLINED; + } + + /* + * Create SSL context + */ + if (!sslconn) { + sslconn = ssl_init_connection_ctx(c); + } + + if (sslconn->disabled) { + return DECLINED; + } + + /* + * Remember the connection information for + * later access inside callback functions + */ + + ap_log_error(APLOG_MARK, APLOG_INFO, 0, c->base_server, + "Connection to child %ld established " + "(server %s, client %s)", c->id, sc->vhost_id, + c->remote_ip ? c->remote_ip : "unknown"); + + /* + * Seed the Pseudo Random Number Generator (PRNG) + */ + ssl_rand_seed(c->base_server, c->pool, SSL_RSCTX_CONNECT, ""); + + mctx = sslconn->is_proxy ? sc->proxy : sc->server; + + /* + * Create a new SSL connection with the configured server SSL context and + * attach this to the socket. Additionally we register this attachment + * so we can detach later. + */ + if (!(ssl = SSL_new(mctx->ssl_ctx))) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, c->base_server, + "Unable to create a new SSL connection from the SSL " + "context"); + ssl_log_ssl_error(APLOG_MARK, APLOG_ERR, c->base_server); + + c->aborted = 1; + + return DECLINED; /* XXX */ + } + + vhost_md5 = ap_md5_binary(c->pool, (unsigned char *)sc->vhost_id, + sc->vhost_id_len); + + if (!SSL_set_session_id_context(ssl, (unsigned char *)vhost_md5, + MD5_DIGESTSIZE*2)) + { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, c->base_server, + "Unable to set session id context to `%s'", vhost_md5); + ssl_log_ssl_error(APLOG_MARK, APLOG_ERR, c->base_server); + + c->aborted = 1; + + return DECLINED; /* XXX */ + } + + SSL_set_app_data(ssl, c); + SSL_set_app_data2(ssl, NULL); /* will be request_rec */ + + sslconn->ssl = ssl; + + /* + * Configure callbacks for SSL connection + */ + SSL_set_tmp_rsa_callback(ssl, ssl_callback_TmpRSA); + SSL_set_tmp_dh_callback(ssl, ssl_callback_TmpDH); + + SSL_set_verify_result(ssl, X509_V_OK); + + ssl_io_filter_init(c, ssl); + + return APR_SUCCESS; +} + +static const char *ssl_hook_http_method(const request_rec *r) +{ + SSLSrvConfigRec *sc = mySrvConfig(r->server); + + if (sc->enabled == FALSE) { + return NULL; + } + + return "https"; +} + +static apr_port_t ssl_hook_default_port(const request_rec *r) +{ + SSLSrvConfigRec *sc = mySrvConfig(r->server); + + if (sc->enabled == FALSE) { + return 0; + } + + return 443; +} + +/* + * the module registration phase + */ + +static void ssl_register_hooks(apr_pool_t *p) +{ + /* ssl_hook_ReadReq needs to use the BrowserMatch settings so must + * run after mod_setenvif's post_read_request hook. */ + static const char *pre_prr[] = { "mod_setenvif.c", NULL }; + + ssl_io_filter_register(p); + + ap_hook_pre_connection(ssl_hook_pre_connection,NULL,NULL, APR_HOOK_MIDDLE); + ap_hook_post_config (ssl_init_Module, NULL,NULL, APR_HOOK_MIDDLE); + ap_hook_http_method (ssl_hook_http_method, NULL,NULL, APR_HOOK_MIDDLE); + ap_hook_default_port (ssl_hook_default_port, NULL,NULL, APR_HOOK_MIDDLE); + ap_hook_pre_config (ssl_hook_pre_config, NULL,NULL, APR_HOOK_MIDDLE); + ap_hook_child_init (ssl_init_Child, NULL,NULL, APR_HOOK_MIDDLE); + ap_hook_check_user_id (ssl_hook_UserCheck, NULL,NULL, APR_HOOK_FIRST); + ap_hook_fixups (ssl_hook_Fixup, NULL,NULL, APR_HOOK_MIDDLE); + ap_hook_access_checker(ssl_hook_Access, NULL,NULL, APR_HOOK_MIDDLE); + ap_hook_auth_checker (ssl_hook_Auth, NULL,NULL, APR_HOOK_MIDDLE); + ap_hook_post_read_request(ssl_hook_ReadReq, pre_prr,NULL, APR_HOOK_MIDDLE); + + ssl_var_register(); + + APR_REGISTER_OPTIONAL_FN(ssl_proxy_enable); + APR_REGISTER_OPTIONAL_FN(ssl_engine_disable); +} + +module AP_MODULE_DECLARE_DATA ssl_module = { + STANDARD20_MODULE_STUFF, + ssl_config_perdir_create, /* create per-dir config structures */ + ssl_config_perdir_merge, /* merge per-dir config structures */ + ssl_config_server_create, /* create per-server config structures */ + ssl_config_server_merge, /* merge per-server config structures */ + ssl_config_cmds, /* table of configuration directives */ + ssl_register_hooks /* register hooks */ +}; diff --git a/rubbos/app/httpd-2.0.64/modules/ssl/mod_ssl.dsp b/rubbos/app/httpd-2.0.64/modules/ssl/mod_ssl.dsp new file mode 100644 index 00000000..cf3df14e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/ssl/mod_ssl.dsp @@ -0,0 +1,328 @@ +# Microsoft Developer Studio Project File - Name="mod_ssl" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=mod_ssl - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "mod_ssl.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 "mod_ssl.mak" CFG="mod_ssl - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "mod_ssl - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_ssl - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "mod_ssl - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /I "../../srclib/openssl/inc32/openssl" /I "../../srclib/openssl/inc32" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "NO_IDEA" /D "NO_RC5" /D "NO_MDC2" /D "OPENSSL_NO_IDEA" /D "OPENSSL_NO_RC5" /D "OPENSSL_NO_MDC2" /D "HAVE_SSL_SET_STATE=1" /Fd"Release\mod_ssl_src" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /out:"Release/mod_ssl.so" /base:@..\..\os\win32\BaseAddr.ref,mod_ssl.so +# ADD LINK32 kernel32.lib user32.lib wsock32.lib ws2_32.lib advapi32.lib gdi32.lib ssleay32.lib libeay32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Release/mod_ssl.so" /libpath:"../../srclib/openssl/out32dll" /libpath:"../../srclib/openssl/out32" /base:@..\..\os\win32\BaseAddr.ref,mod_ssl.so /opt:ref + +!ELSEIF "$(CFG)" == "mod_ssl - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /I "../../srclib/openssl/inc32/openssl" /I "../../srclib/openssl/inc32" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "WIN32_LEAN_AND_MEAN" /D "NO_IDEA" /D "NO_RC5" /D "NO_MDC2" /D "OPENSSL_NO_IDEA" /D "OPENSSL_NO_RC5" /D "OPENSSL_NO_MDC2" /D "HAVE_SSL_SET_STATE=1" /Fd"Debug\mod_ssl_src" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_ssl.so" /base:@..\..\os\win32\BaseAddr.ref,mod_ssl.so +# ADD LINK32 kernel32.lib user32.lib wsock32.lib ws2_32.lib advapi32.lib gdi32.lib ssleay32.lib libeay32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_ssl.so" /libpath:"../../srclib/openssl/out32dll.dbg" /libpath:"../../srclib/openssl/out32.dbg" /base:@..\..\os\win32\BaseAddr.ref,mod_ssl.so + +!ENDIF + +# Begin Target + +# Name "mod_ssl - Win32 Release" +# Name "mod_ssl - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "*.c" +# Begin Source File + +SOURCE=.\mod_ssl.c +# End Source File +# Begin Source File + +SOURCE=.\ssl_engine_config.c +# End Source File +# Begin Source File + +SOURCE=.\ssl_engine_dh.c +# End Source File +# Begin Source File + +SOURCE=.\ssl_engine_init.c +# End Source File +# Begin Source File + +SOURCE=.\ssl_engine_io.c +# End Source File +# Begin Source File + +SOURCE=.\ssl_engine_kernel.c +# End Source File +# Begin Source File + +SOURCE=.\ssl_engine_log.c +# End Source File +# Begin Source File + +SOURCE=.\ssl_engine_mutex.c +# End Source File +# Begin Source File + +SOURCE=.\ssl_engine_pphrase.c +# End Source File +# Begin Source File + +SOURCE=.\ssl_engine_rand.c +# End Source File +# Begin Source File + +SOURCE=.\ssl_engine_vars.c +# End Source File +# Begin Source File + +SOURCE=.\ssl_expr.c +# End Source File +# Begin Source File + +SOURCE=.\ssl_expr_eval.c +# End Source File +# Begin Source File + +SOURCE=.\ssl_expr_parse.c +# End Source File +# Begin Source File + +SOURCE=.\ssl_expr_scan.c +# End Source File +# Begin Source File + +SOURCE=.\ssl_scache.c +# End Source File +# Begin Source File + +SOURCE=.\ssl_scache_dbm.c +# End Source File +# Begin Source File + +SOURCE=.\ssl_scache_shmcb.c +# End Source File +# Begin Source File + +SOURCE=.\ssl_scache_shmht.c +# End Source File +# Begin Source File + +SOURCE=.\ssl_util.c +# End Source File +# Begin Source File + +SOURCE=.\ssl_util_ssl.c +# End Source File +# Begin Source File + +SOURCE=.\ssl_util_table.c +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "*.h" +# Begin Source File + +SOURCE=.\mod_ssl.h +# End Source File +# Begin Source File + +SOURCE=.\ssl_expr.h +# End Source File +# Begin Source File + +SOURCE=.\ssl_expr_parse.h +# End Source File +# Begin Source File + +SOURCE=.\ssl_toolkit_compat.h +# End Source File +# Begin Source File + +SOURCE=.\ssl_util_ssl.h +# End Source File +# Begin Source File + +SOURCE=.\ssl_util_table.h +# End Source File +# End Group +# Begin Group "Generated Files" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\ssl_expr_parse.y + +!IF "$(CFG)" == "mod_ssl - Win32 Release" + +# Begin Custom Build - Generating ssl_expr_parse.c/.h from ssl_expr_parse.y +InputPath=.\ssl_expr_parse.y + +BuildCmds= \ + bison -y -d ssl_expr_parse.y \ + sed -e "s;yy;ssl_expr_yy;g" -e "/#if defined(c_plusplus) || defined(__cplusplus)/,/#endif/d" ssl_expr_parse.c \ + del y.tab.c \ + sed -e "s;yy;ssl_expr_yy;g" ssl_expr_parse.h \ + del y.tab.h \ + + +"ssl_expr_parse.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"ssl_expr_parse.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) +# End Custom Build + +!ELSEIF "$(CFG)" == "mod_ssl - Win32 Debug" + +# Begin Custom Build - Generating ssl_expr_parse.c/.h from ssl_expr_parse.y +InputPath=.\ssl_expr_parse.y + +BuildCmds= \ + bison -y -d ssl_expr_parse.y \ + sed -e "s;yy;ssl_expr_yy;g" -e "/#if defined(c_plusplus) || defined(__cplusplus)/,/#endif/d" ssl_expr_parse.c \ + del y.tab.c \ + sed -e "s;yy;ssl_expr_yy;g" ssl_expr_parse.h \ + del y.tab.h \ + + +"ssl_expr_parse.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) + +"ssl_expr_parse.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + $(BuildCmds) +# End Custom Build + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\ssl_expr_scan.l + +!IF "$(CFG)" == "mod_ssl - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Generating ssl_expr_scan.c from ssl_expr_scan.l +InputPath=.\ssl_expr_scan.l + +"ssl_expr_scan.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + flex -Pssl_expr_yy -s -B ssl_expr_scan.l + sed -e "/$$Header:/d" ssl_expr_scan.c + del lex.ssl_expr_yy.c + +# End Custom Build + +!ELSEIF "$(CFG)" == "mod_ssl - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Generating ssl_expr_scan.c from ssl_expr_scan.l +InputPath=.\ssl_expr_scan.l + +"ssl_expr_scan.c" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + flex -Pssl_expr_yy -s -B ssl_expr_scan.l + sed -e "/$$Header:/d" ssl_expr_scan.c + del lex.ssl_expr_yy.c + +# End Custom Build + +!ENDIF + +# End Source File +# End Group +# Begin Source File + +SOURCE=.\mod_ssl.rc +# End Source File +# Begin Source File + +SOURCE=..\..\build\win32\win32ver.awk + +!IF "$(CFG)" == "mod_ssl - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_ssl.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_ssl.so "ssl_module for Apache" ../../include/ap_release.h > .\mod_ssl.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "mod_ssl - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_ssl.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_ssl.so "ssl_module for Apache" ../../include/ap_release.h > .\mod_ssl.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/modules/ssl/mod_ssl.h b/rubbos/app/httpd-2.0.64/modules/ssl/mod_ssl.h new file mode 100644 index 00000000..6f69c26f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/ssl/mod_ssl.h @@ -0,0 +1,724 @@ +/* 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. + */ + +/* _ _ + * _ __ ___ ___ __| | ___ ___| | mod_ssl + * | '_ ` _ \ / _ \ / _` | / __/ __| | Apache Interface to OpenSSL + * | | | | | | (_) | (_| | \__ \__ \ | + * |_| |_| |_|\___/ \__,_|___|___/___/_| + * |_____| + * mod_ssl.h + * Global header + */ + /* ``The Apache Group: a collection + of talented individuals who are + trying to perfect the art of + never finishing something.'' + -- Rob Hartill */ +#ifndef __MOD_SSL_H__ +#define __MOD_SSL_H__ + +/* + * Optionally enable the experimental stuff, but allow the user to + * override the decision which experimental parts are included by using + * CFLAGS="-DSSL_EXPERIMENTAL_xxxx_IGNORE". + */ +#ifdef SSL_EXPERIMENTAL +#ifdef SSL_ENGINE +#ifndef SSL_EXPERIMENTAL_ENGINE_IGNORE +#define SSL_EXPERIMENTAL_ENGINE +#endif +#endif +#endif /* SSL_EXPERIMENTAL */ + +/* + * Power up our brain... + */ + +/* Apache headers */ +#include "httpd.h" +#include "http_config.h" +#include "http_core.h" +#include "http_log.h" +#include "http_main.h" +#include "http_connection.h" +#include "http_request.h" +#include "http_protocol.h" +#include "util_script.h" +#include "util_filter.h" +#include "mpm.h" +#include "apr.h" +#include "apr_strings.h" +#define APR_WANT_STRFUNC +#include "apr_want.h" +#include "apr_tables.h" +#include "apr_lib.h" +#include "apr_fnmatch.h" +#include "apr_strings.h" +#include "apr_dbm.h" +#include "apr_rmm.h" +#include "apr_shm.h" +#include "apr_global_mutex.h" +#include "apr_optional.h" + +#define MOD_SSL_VERSION AP_SERVER_BASEREVISION + +#ifdef HAVE_SSLC + +#include +#include +#include +#include +#include +#include +#include +#include + +#else /* !HAVE_SSLC (implicit HAVE_OPENSSL) */ + +#include +#include +#include +#include +#include +#include +#include +#ifdef SSL_EXPERIMENTAL_ENGINE +#include +#endif +#ifdef HAVE_SSL_X509V3_H +#include +#endif + +#endif /* !HAVE_SSLC (implicit HAVE_OPENSSL) */ + + +/* mod_ssl headers */ +#include "ssl_toolkit_compat.h" +#include "ssl_expr.h" +#include "ssl_util_ssl.h" +#include "ssl_util_table.h" + +/* The #ifdef macros are only defined AFTER including the above + * therefore we cannot include these system files at the top :-( + */ +#if APR_HAVE_SYS_TIME_H +#include +#endif +#if APR_HAVE_UNISTD_H +#include /* needed for STDIN_FILENO et.al., at least on FreeBSD */ +#endif + +/* + * Provide reasonable default for some defines + */ +#ifndef FALSE +#define FALSE (0) +#endif +#ifndef TRUE +#define TRUE (!FALSE) +#endif +#ifndef PFALSE +#define PFALSE ((void *)FALSE) +#endif +#ifndef PTRUE +#define PTRUE ((void *)TRUE) +#endif +#ifndef UNSET +#define UNSET (-1) +#endif +#ifndef NUL +#define NUL '\0' +#endif +#ifndef RAND_MAX +#include +#define RAND_MAX INT_MAX +#endif + +/* + * Provide reasonable defines for some types + */ +#ifndef BOOL +#define BOOL unsigned int +#endif +#ifndef UCHAR +#define UCHAR unsigned char +#endif + +/* + * Provide useful shorthands + */ +#define strEQ(s1,s2) (strcmp(s1,s2) == 0) +#define strNE(s1,s2) (strcmp(s1,s2) != 0) +#define strEQn(s1,s2,n) (strncmp(s1,s2,n) == 0) +#define strNEn(s1,s2,n) (strncmp(s1,s2,n) != 0) + +#define strcEQ(s1,s2) (strcasecmp(s1,s2) == 0) +#define strcNE(s1,s2) (strcasecmp(s1,s2) != 0) +#define strcEQn(s1,s2,n) (strncasecmp(s1,s2,n) == 0) +#define strcNEn(s1,s2,n) (strncasecmp(s1,s2,n) != 0) + +#define strIsEmpty(s) (s == NULL || s[0] == NUL) + +#define myConnConfig(c) \ +(SSLConnRec *)ap_get_module_config(c->conn_config, &ssl_module) +#define myCtxConfig(sslconn, sc) (sslconn->is_proxy ? sc->proxy : sc->server) +#define myConnConfigSet(c, val) \ +ap_set_module_config(c->conn_config, &ssl_module, val) +#define mySrvConfig(srv) (SSLSrvConfigRec *)ap_get_module_config(srv->module_config, &ssl_module) +#define myDirConfig(req) (SSLDirConfigRec *)ap_get_module_config(req->per_dir_config, &ssl_module) +#define myModConfig(srv) (mySrvConfig((srv)))->mc + +#define myCtxVarSet(mc,num,val) mc->rCtx.pV##num = val +#define myCtxVarGet(mc,num,type) (type)(mc->rCtx.pV##num) + +/* + * Defaults for the configuration + */ +#ifndef SSL_SESSION_CACHE_TIMEOUT +#define SSL_SESSION_CACHE_TIMEOUT 300 +#endif + +/* + * Support for MM library + */ +#define SSL_MM_FILE_MODE ( APR_UREAD | APR_UWRITE | APR_GREAD | APR_WREAD ) + +/* + * Support for DBM library + */ +#define SSL_DBM_FILE_MODE ( APR_UREAD | APR_UWRITE | APR_GREAD | APR_WREAD ) + +#if !defined(SSL_DBM_FILE_SUFFIX_DIR) && !defined(SSL_DBM_FILE_SUFFIX_PAG) +#if defined(DBM_SUFFIX) +#define SSL_DBM_FILE_SUFFIX_DIR DBM_SUFFIX +#define SSL_DBM_FILE_SUFFIX_PAG DBM_SUFFIX +#elif defined(__FreeBSD__) || (defined(DB_LOCK) && defined(DB_SHMEM)) +#define SSL_DBM_FILE_SUFFIX_DIR ".db" +#define SSL_DBM_FILE_SUFFIX_PAG ".db" +#else +#define SSL_DBM_FILE_SUFFIX_DIR ".dir" +#define SSL_DBM_FILE_SUFFIX_PAG ".pag" +#endif +#endif + +/* + * Define the certificate algorithm types + */ + +typedef int ssl_algo_t; + +#define SSL_ALGO_UNKNOWN (0) +#define SSL_ALGO_RSA (1<<0) +#define SSL_ALGO_DSA (1<<1) +#define SSL_ALGO_ALL (SSL_ALGO_RSA|SSL_ALGO_DSA) + +#define SSL_AIDX_RSA (0) +#define SSL_AIDX_DSA (1) +#define SSL_AIDX_MAX (2) + + +/* + * Define IDs for the temporary RSA keys and DH params + */ + +#define SSL_TMP_KEY_RSA_512 (0) +#define SSL_TMP_KEY_RSA_1024 (1) +#define SSL_TMP_KEY_DH_512 (2) +#define SSL_TMP_KEY_DH_1024 (3) +#define SSL_TMP_KEY_MAX (4) + +/* + * Define the SSL options + */ +#define SSL_OPT_NONE (0) +#define SSL_OPT_RELSET (1<<0) +#define SSL_OPT_STDENVVARS (1<<1) +#define SSL_OPT_COMPATENVVARS (1<<2) +#define SSL_OPT_EXPORTCERTDATA (1<<3) +#define SSL_OPT_FAKEBASICAUTH (1<<4) +#define SSL_OPT_STRICTREQUIRE (1<<5) +#define SSL_OPT_OPTRENEGOTIATE (1<<6) +#define SSL_OPT_ALL (SSL_OPT_STDENVVARS|SSL_OPT_COMPATENVVAR|SSL_OPT_EXPORTCERTDATA|SSL_OPT_FAKEBASICAUTH|SSL_OPT_STRICTREQUIRE|SSL_OPT_OPTRENEGOTIATE) +typedef int ssl_opt_t; + +/* + * Define the SSL Protocol options + */ +#define SSL_PROTOCOL_NONE (0) +#define SSL_PROTOCOL_SSLV2 (1<<0) +#define SSL_PROTOCOL_SSLV3 (1<<1) +#define SSL_PROTOCOL_TLSV1 (1<<2) +#define SSL_PROTOCOL_ALL (SSL_PROTOCOL_SSLV2|SSL_PROTOCOL_SSLV3|SSL_PROTOCOL_TLSV1) +typedef int ssl_proto_t; + +/* + * Define the SSL verify levels + */ +typedef enum { + SSL_CVERIFY_UNSET = UNSET, + SSL_CVERIFY_NONE = 0, + SSL_CVERIFY_OPTIONAL = 1, + SSL_CVERIFY_REQUIRE = 2, + SSL_CVERIFY_OPTIONAL_NO_CA = 3 +} ssl_verify_t; + +#define SSL_VERIFY_PEER_STRICT \ + (SSL_VERIFY_PEER|SSL_VERIFY_FAIL_IF_NO_PEER_CERT) + +#ifndef X509_V_ERR_CERT_UNTRUSTED +#define X509_V_ERR_CERT_UNTRUSTED 27 +#endif + +#define ssl_verify_error_is_optional(errnum) \ + ((errnum == X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT) \ + || (errnum == X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN) \ + || (errnum == X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY) \ + || (errnum == X509_V_ERR_CERT_UNTRUSTED) \ + || (errnum == X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE)) + +/* + * Define the SSL pass phrase dialog types + */ +typedef enum { + SSL_PPTYPE_UNSET = UNSET, + SSL_PPTYPE_BUILTIN = 0, + SSL_PPTYPE_FILTER = 1, + SSL_PPTYPE_PIPE = 2 +} ssl_pphrase_t; + +/* + * Define the Path Checking modes + */ +#define SSL_PCM_EXISTS 1 +#define SSL_PCM_ISREG 2 +#define SSL_PCM_ISDIR 4 +#define SSL_PCM_ISNONZERO 8 +typedef unsigned int ssl_pathcheck_t; + +/* + * Define the SSL session cache modes and structures + */ +typedef enum { + SSL_SCMODE_UNSET = UNSET, + SSL_SCMODE_NONE = 0, + SSL_SCMODE_DBM = 1, + SSL_SCMODE_SHMHT = 2, + SSL_SCMODE_SHMCB = 3 +} ssl_scmode_t; + +/* + * Define the SSL mutex modes + */ +typedef enum { + SSL_MUTEXMODE_UNSET = UNSET, + SSL_MUTEXMODE_NONE = 0, + SSL_MUTEXMODE_USED = 1 +} ssl_mutexmode_t; + +/* + * Define the SSL requirement structure + */ +typedef struct { + char *cpExpr; + ssl_expr *mpExpr; +} ssl_require_t; + +/* + * Define the SSL random number generator seeding source + */ +typedef enum { + SSL_RSCTX_STARTUP = 1, + SSL_RSCTX_CONNECT = 2 +} ssl_rsctx_t; +typedef enum { + SSL_RSSRC_BUILTIN = 1, + SSL_RSSRC_FILE = 2, + SSL_RSSRC_EXEC = 3, + SSL_RSSRC_EGD = 4 +} ssl_rssrc_t; +typedef struct { + ssl_rsctx_t nCtx; + ssl_rssrc_t nSrc; + char *cpPath; + int nBytes; +} ssl_randseed_t; + +/* + * Define the structure of an ASN.1 anything + */ +typedef struct { + long int nData; + unsigned char *cpData; + apr_time_t source_mtime; +} ssl_asn1_t; + +/* + * Define the mod_ssl per-module configuration structure + * (i.e. the global configuration for each httpd process) + */ + +typedef enum { + SSL_SHUTDOWN_TYPE_UNSET, + SSL_SHUTDOWN_TYPE_STANDARD, + SSL_SHUTDOWN_TYPE_UNCLEAN, + SSL_SHUTDOWN_TYPE_ACCURATE +} ssl_shutdown_type_e; + +typedef struct { + SSL *ssl; + const char *client_dn; + X509 *client_cert; + ssl_shutdown_type_e shutdown_type; + const char *verify_info; + const char *verify_error; + int verify_depth; + int is_proxy; + int disabled; + int non_ssl_request; + + /* Track the handshake/renegotiation state for the connection so + * that all client-initiated renegotiations can be rejected, as a + * partial fix for CVE-2009-3555. */ + enum { + RENEG_INIT = 0, /* Before initial handshake */ + RENEG_REJECT, /* After initial handshake; any client-initiated + * renegotiation should be rejected */ + RENEG_ALLOW, /* A server-initated renegotiation is taking + * place (as dictated by configuration) */ + RENEG_ABORT /* Renegotiation initiated by client, abort the + * connection */ + } reneg_state; +} SSLConnRec; + +typedef struct { + pid_t pid; + apr_pool_t *pPool; + BOOL bFixed; + int nSessionCacheMode; + char *szSessionCacheDataFile; + int nSessionCacheDataSize; + apr_shm_t *pSessionCacheDataMM; + apr_rmm_t *pSessionCacheDataRMM; + apr_table_t *tSessionCacheDataTable; + ssl_mutexmode_t nMutexMode; + apr_lockmech_e nMutexMech; + const char *szMutexFile; + apr_global_mutex_t *pMutex; + apr_array_header_t *aRandSeed; + apr_hash_t *tVHostKeys; + void *pTmpKeys[SSL_TMP_KEY_MAX]; + apr_hash_t *tPublicCert; + apr_hash_t *tPrivateKey; +#ifdef SSL_EXPERIMENTAL_ENGINE + char *szCryptoDevice; +#endif + struct { + void *pV1, *pV2, *pV3, *pV4, *pV5, *pV6, *pV7, *pV8, *pV9, *pV10; + } rCtx; +} SSLModConfigRec; + +/* public cert/private key */ +typedef struct { + /* + * server only has 1-2 certs/keys + * 1 RSA and/or 1 DSA + */ + const char *cert_files[SSL_AIDX_MAX]; + const char *key_files[SSL_AIDX_MAX]; + X509 *certs[SSL_AIDX_MAX]; + EVP_PKEY *keys[SSL_AIDX_MAX]; +} modssl_pk_server_t; + +typedef struct { + /* proxy can have any number of cert/key pairs */ + const char *cert_file; + const char *cert_path; + STACK_OF(X509_INFO) *certs; +} modssl_pk_proxy_t; + +/* stuff related to authentication that can also be per-dir */ +typedef struct { + /* known/trusted CAs */ + const char *ca_cert_path; + const char *ca_cert_file; + + const char *cipher_suite; + + /* for client or downstream server authentication */ + int verify_depth; + ssl_verify_t verify_mode; +} modssl_auth_ctx_t; + +typedef struct SSLSrvConfigRec SSLSrvConfigRec; + +typedef struct { + SSLSrvConfigRec *sc; /* pointer back to server config */ + SSL_CTX *ssl_ctx; + + /* we are one or the other */ + modssl_pk_server_t *pks; + modssl_pk_proxy_t *pkp; + + ssl_proto_t protocol; + + /* config for handling encrypted keys */ + ssl_pphrase_t pphrase_dialog_type; + const char *pphrase_dialog_path; + + const char *cert_chain; + + /* certificate revocation list */ + const char *crl_path; + const char *crl_file; + X509_STORE *crl; + + modssl_auth_ctx_t auth; +} modssl_ctx_t; + +struct SSLSrvConfigRec { + SSLModConfigRec *mc; + BOOL enabled; + BOOL proxy_enabled; + const char *vhost_id; + int vhost_id_len; + int session_cache_timeout; + BOOL insecure_reneg; + modssl_ctx_t *server; + modssl_ctx_t *proxy; +}; + +/* + * Define the mod_ssl per-directory configuration structure + * (i.e. the local configuration for all + * and .htaccess contexts) + */ +typedef struct { + BOOL bSSLRequired; + apr_array_header_t *aRequirement; + ssl_opt_t nOptions; + ssl_opt_t nOptionsAdd; + ssl_opt_t nOptionsDel; + const char *szCipherSuite; + ssl_verify_t nVerifyClient; + int nVerifyDepth; + const char *szCACertificatePath; + const char *szCACertificateFile; + const char *szUserName; +} SSLDirConfigRec; + +/* + * function prototypes + */ + +/* API glue structures */ +extern module AP_MODULE_DECLARE_DATA ssl_module; + +/* "global" stuff */ +extern const char ssl_valid_ssl_mutex_string[]; + +/* configuration handling */ +SSLModConfigRec *ssl_config_global_create(server_rec *); +void ssl_config_global_fix(SSLModConfigRec *); +BOOL ssl_config_global_isfixed(SSLModConfigRec *); +void *ssl_config_server_create(apr_pool_t *, server_rec *); +void *ssl_config_server_merge(apr_pool_t *, void *, void *); +void *ssl_config_perdir_create(apr_pool_t *, char *); +void *ssl_config_perdir_merge(apr_pool_t *, void *, void *); +const char *ssl_cmd_SSLMutex(cmd_parms *, void *, const char *); +const char *ssl_cmd_SSLPassPhraseDialog(cmd_parms *, void *, const char *); +const char *ssl_cmd_SSLCryptoDevice(cmd_parms *, void *, const char *); +const char *ssl_cmd_SSLRandomSeed(cmd_parms *, void *, const char *, const char *, const char *); +const char *ssl_cmd_SSLEngine(cmd_parms *, void *, int); +const char *ssl_cmd_SSLCipherSuite(cmd_parms *, void *, const char *); +const char *ssl_cmd_SSLCertificateFile(cmd_parms *, void *, const char *); +const char *ssl_cmd_SSLCertificateKeyFile(cmd_parms *, void *, const char *); +const char *ssl_cmd_SSLCertificateChainFile(cmd_parms *, void *, const char *); +const char *ssl_cmd_SSLCACertificatePath(cmd_parms *, void *, const char *); +const char *ssl_cmd_SSLCACertificateFile(cmd_parms *, void *, const char *); +const char *ssl_cmd_SSLCARevocationPath(cmd_parms *, void *, const char *); +const char *ssl_cmd_SSLCARevocationFile(cmd_parms *, void *, const char *); +const char *ssl_cmd_SSLVerifyClient(cmd_parms *, void *, const char *); +const char *ssl_cmd_SSLVerifyDepth(cmd_parms *, void *, const char *); +const char *ssl_cmd_SSLSessionCache(cmd_parms *, void *, const char *); +const char *ssl_cmd_SSLSessionCacheTimeout(cmd_parms *, void *, const char *); +const char *ssl_cmd_SSLProtocol(cmd_parms *, void *, const char *); +const char *ssl_cmd_SSLOptions(cmd_parms *, void *, const char *); +const char *ssl_cmd_SSLRequireSSL(cmd_parms *, void *); +const char *ssl_cmd_SSLRequire(cmd_parms *, void *, const char *); +const char *ssl_cmd_SSLUserName(cmd_parms *, void *, const char *); +const char *ssl_cmd_SSLInsecureRenegotiation(cmd_parms *cmd, void *dcfg, int flag); + +const char *ssl_cmd_SSLProxyEngine(cmd_parms *cmd, void *dcfg, int flag); +const char *ssl_cmd_SSLProxyProtocol(cmd_parms *, void *, const char *); +const char *ssl_cmd_SSLProxyCipherSuite(cmd_parms *, void *, const char *); +const char *ssl_cmd_SSLProxyVerify(cmd_parms *, void *, const char *); +const char *ssl_cmd_SSLProxyVerifyDepth(cmd_parms *, void *, const char *); +const char *ssl_cmd_SSLProxyCACertificatePath(cmd_parms *, void *, const char *); +const char *ssl_cmd_SSLProxyCACertificateFile(cmd_parms *, void *, const char *); +const char *ssl_cmd_SSLProxyCARevocationPath(cmd_parms *, void *, const char *); +const char *ssl_cmd_SSLProxyCARevocationFile(cmd_parms *, void *, const char *); +const char *ssl_cmd_SSLProxyMachineCertificatePath(cmd_parms *, void *, const char *); +const char *ssl_cmd_SSLProxyMachineCertificateFile(cmd_parms *, void *, const char *); + +/* module initialization */ +int ssl_init_Module(apr_pool_t *, apr_pool_t *, apr_pool_t *, server_rec *); +void ssl_init_Engine(server_rec *, apr_pool_t *); +void ssl_init_ConfigureServer(server_rec *, apr_pool_t *, apr_pool_t *, SSLSrvConfigRec *); +void ssl_init_CheckServers(server_rec *, apr_pool_t *); +STACK_OF(X509_NAME) + *ssl_init_FindCAList(server_rec *, apr_pool_t *, const char *, const char *); +void ssl_init_Child(apr_pool_t *, server_rec *); +apr_status_t ssl_init_ModuleKill(void *data); + +/* Apache API hooks */ +int ssl_hook_Auth(request_rec *); +int ssl_hook_UserCheck(request_rec *); +int ssl_hook_Access(request_rec *); +int ssl_hook_Fixup(request_rec *); +int ssl_hook_ReadReq(request_rec *); + +/* OpenSSL callbacks */ +RSA *ssl_callback_TmpRSA(SSL *, int, int); +DH *ssl_callback_TmpDH(SSL *, int, int); +int ssl_callback_SSLVerify(int, X509_STORE_CTX *); +int ssl_callback_SSLVerify_CRL(int, X509_STORE_CTX *, conn_rec *); +int ssl_callback_proxy_cert(SSL *ssl, MODSSL_CLIENT_CERT_CB_ARG_TYPE **x509, EVP_PKEY **pkey); +int ssl_callback_NewSessionCacheEntry(SSL *, SSL_SESSION *); +SSL_SESSION *ssl_callback_GetSessionCacheEntry(SSL *, unsigned char *, int, int *); +void ssl_callback_DelSessionCacheEntry(SSL_CTX *, SSL_SESSION *); +void ssl_callback_Info(MODSSL_INFO_CB_ARG_TYPE, int, int); + +/* Session Cache Support */ +void ssl_scache_init(server_rec *, apr_pool_t *); +#if 0 /* XXX */ +void ssl_scache_status_register(apr_pool_t *p); +#endif +void ssl_scache_kill(server_rec *); +BOOL ssl_scache_store(server_rec *, UCHAR *, int, time_t, SSL_SESSION *); +SSL_SESSION *ssl_scache_retrieve(server_rec *, UCHAR *, int); +void ssl_scache_remove(server_rec *, UCHAR *, int); +void ssl_scache_expire(server_rec *); +void ssl_scache_status(server_rec *, apr_pool_t *, void (*)(char *, void *), void *); +char *ssl_scache_id2sz(UCHAR *, int); +void ssl_scache_dbm_init(server_rec *, apr_pool_t *); +void ssl_scache_dbm_kill(server_rec *); +BOOL ssl_scache_dbm_store(server_rec *, UCHAR *, int, time_t, SSL_SESSION *); +SSL_SESSION *ssl_scache_dbm_retrieve(server_rec *, UCHAR *, int); +void ssl_scache_dbm_remove(server_rec *, UCHAR *, int); +void ssl_scache_dbm_expire(server_rec *); +void ssl_scache_dbm_status(server_rec *, apr_pool_t *, void (*)(char *, void *), void *); + +void ssl_scache_shmht_init(server_rec *, apr_pool_t *); +void ssl_scache_shmht_kill(server_rec *); +BOOL ssl_scache_shmht_store(server_rec *, UCHAR *, int, time_t, SSL_SESSION *); +SSL_SESSION *ssl_scache_shmht_retrieve(server_rec *, UCHAR *, int); +void ssl_scache_shmht_remove(server_rec *, UCHAR *, int); +void ssl_scache_shmht_expire(server_rec *); +void ssl_scache_shmht_status(server_rec *, apr_pool_t *, void (*)(char *, void *), void *); + +void ssl_scache_shmcb_init(server_rec *, apr_pool_t *); +void ssl_scache_shmcb_kill(server_rec *); +BOOL ssl_scache_shmcb_store(server_rec *, UCHAR *, int, time_t, SSL_SESSION *); +SSL_SESSION *ssl_scache_shmcb_retrieve(server_rec *, UCHAR *, int); +void ssl_scache_shmcb_remove(server_rec *, UCHAR *, int); +void ssl_scache_shmcb_expire(server_rec *); +void ssl_scache_shmcb_status(server_rec *, apr_pool_t *, void (*)(char *, void *), void *); + +/* Pass Phrase Support */ +void ssl_pphrase_Handle(server_rec *, apr_pool_t *); + +/* Diffie-Hellman Parameter Support */ +DH *ssl_dh_GetTmpParam(int); +DH *ssl_dh_GetParamFromFile(char *); + +unsigned char *ssl_asn1_table_set(apr_hash_t *table, + const char *key, + long int length); + +ssl_asn1_t *ssl_asn1_table_get(apr_hash_t *table, + const char *key); + +void ssl_asn1_table_unset(apr_hash_t *table, + const char *key); + +const char *ssl_asn1_keystr(int keytype); + +const char *ssl_asn1_table_keyfmt(apr_pool_t *p, + const char *id, + int keytype); +/* Mutex Support */ +int ssl_mutex_init(server_rec *, apr_pool_t *); +int ssl_mutex_reinit(server_rec *, apr_pool_t *); +int ssl_mutex_on(server_rec *); +int ssl_mutex_off(server_rec *); + +/* Logfile Support */ +void ssl_die(void); +void ssl_log_ssl_error(const char *, int, int, server_rec *); + +/* Variables */ +void ssl_var_register(void); +char *ssl_var_lookup(apr_pool_t *, server_rec *, conn_rec *, request_rec *, char *); +void ssl_var_log_config_register(apr_pool_t *p); + +APR_DECLARE_OPTIONAL_FN(char *, ssl_var_lookup, + (apr_pool_t *, server_rec *, + conn_rec *, request_rec *, + char *)); + +/* An optional function which returns non-zero if the given connection + * is using SSL/TLS. */ +APR_DECLARE_OPTIONAL_FN(int, ssl_is_https, (conn_rec *)); + +/* Proxy Support */ +int ssl_proxy_enable(conn_rec *c); +int ssl_engine_disable(conn_rec *c); + +APR_DECLARE_OPTIONAL_FN(int, ssl_proxy_enable, (conn_rec *)); + +APR_DECLARE_OPTIONAL_FN(int, ssl_engine_disable, (conn_rec *)); + +/* I/O */ +void ssl_io_filter_init(conn_rec *, SSL *); +void ssl_io_filter_register(apr_pool_t *); +long ssl_io_data_cb(BIO *, int, MODSSL_BIO_CB_ARG_TYPE *, int, long, long); + +/* ssl_io_buffer_fill fills the setaside buffering of the HTTP request + * to allow an SSL renegotiation to take place. */ +int ssl_io_buffer_fill(request_rec *r); + +/* PRNG */ +int ssl_rand_seed(server_rec *, apr_pool_t *, ssl_rsctx_t, char *); + +/* Utility Functions */ +char *ssl_util_vhostid(apr_pool_t *, server_rec *); +void ssl_util_strupper(char *); +void ssl_util_uuencode(char *, const char *, BOOL); +void ssl_util_uuencode_binary(unsigned char *, const unsigned char *, int, BOOL); +apr_file_t *ssl_util_ppopen(server_rec *, apr_pool_t *, const char *, + const char * const *); +void ssl_util_ppclose(server_rec *, apr_pool_t *, apr_file_t *); +char *ssl_util_readfilter(server_rec *, apr_pool_t *, const char *, + const char * const *); +BOOL ssl_util_path_check(ssl_pathcheck_t, const char *, apr_pool_t *); +ssl_algo_t ssl_util_algotypeof(X509 *, EVP_PKEY *); +char *ssl_util_algotypestr(ssl_algo_t); +char *ssl_util_ptxtsub(apr_pool_t *, const char *, const char *, char *); +void ssl_util_thread_setup(apr_pool_t *); + +#define APR_SHM_MAXSIZE (64 * 1024 * 1024) +#endif /* __MOD_SSL_H__ */ diff --git a/rubbos/app/httpd-2.0.64/modules/ssl/modules.mk b/rubbos/app/httpd-2.0.64/modules/ssl/modules.mk new file mode 100644 index 00000000..ceb52a1b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/ssl/modules.mk @@ -0,0 +1,3 @@ +DISTCLEAN_TARGETS = modules.mk +static = +shared = diff --git a/rubbos/app/httpd-2.0.64/modules/ssl/ssl_engine_config.c b/rubbos/app/httpd-2.0.64/modules/ssl/ssl_engine_config.c new file mode 100644 index 00000000..f597d2a4 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/ssl/ssl_engine_config.c @@ -0,0 +1,1420 @@ +/* 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. + */ + +/* _ _ + * _ __ ___ ___ __| | ___ ___| | mod_ssl + * | '_ ` _ \ / _ \ / _` | / __/ __| | Apache Interface to OpenSSL + * | | | | | | (_) | (_| | \__ \__ \ | + * |_| |_| |_|\___/ \__,_|___|___/___/_| + * |_____| + * ssl_engine_config.c + * Apache Configuration Directives + */ + /* ``Damned if you do, + damned if you don't.'' + -- Unknown */ +#include "mod_ssl.h" + +/* _________________________________________________________________ +** +** Support for Global Configuration +** _________________________________________________________________ +*/ + +#define SSL_MOD_CONFIG_KEY "ssl_module" + +SSLModConfigRec *ssl_config_global_create(server_rec *s) +{ + apr_pool_t *pool = s->process->pool; + SSLModConfigRec *mc; + void *vmc; + + apr_pool_userdata_get(&vmc, SSL_MOD_CONFIG_KEY, pool); + if (vmc) { + return vmc; /* reused for lifetime of the server */ + } + + /* + * allocate an own subpool which survives server restarts + */ + mc = (SSLModConfigRec *)apr_palloc(pool, sizeof(*mc)); + mc->pPool = pool; + mc->bFixed = FALSE; + + /* + * initialize per-module configuration + */ + mc->nSessionCacheMode = SSL_SCMODE_UNSET; + mc->szSessionCacheDataFile = NULL; + mc->nSessionCacheDataSize = 0; + mc->pSessionCacheDataMM = NULL; + mc->pSessionCacheDataRMM = NULL; + mc->tSessionCacheDataTable = NULL; + mc->nMutexMode = SSL_MUTEXMODE_UNSET; + mc->nMutexMech = APR_LOCK_DEFAULT; + mc->szMutexFile = NULL; + mc->pMutex = NULL; + mc->aRandSeed = apr_array_make(pool, 4, + sizeof(ssl_randseed_t)); + mc->tVHostKeys = apr_hash_make(pool); + mc->tPrivateKey = apr_hash_make(pool); + mc->tPublicCert = apr_hash_make(pool); +#ifdef SSL_EXPERIMENTAL_ENGINE + mc->szCryptoDevice = NULL; +#endif + + memset(mc->pTmpKeys, 0, sizeof(mc->pTmpKeys)); + + apr_pool_userdata_set(mc, SSL_MOD_CONFIG_KEY, + apr_pool_cleanup_null, + pool); + + return mc; +} + +void ssl_config_global_fix(SSLModConfigRec *mc) +{ + mc->bFixed = TRUE; +} + +BOOL ssl_config_global_isfixed(SSLModConfigRec *mc) +{ + return mc->bFixed; +} + +/* _________________________________________________________________ +** +** Configuration handling +** _________________________________________________________________ +*/ + +static void modssl_ctx_init(modssl_ctx_t *mctx) +{ + mctx->sc = NULL; /* set during module init */ + + mctx->ssl_ctx = NULL; /* set during module init */ + + mctx->pks = NULL; + mctx->pkp = NULL; + + mctx->protocol = SSL_PROTOCOL_ALL; + + mctx->pphrase_dialog_type = SSL_PPTYPE_UNSET; + mctx->pphrase_dialog_path = NULL; + + mctx->cert_chain = NULL; + + mctx->crl_path = NULL; + mctx->crl_file = NULL; + mctx->crl = NULL; /* set during module init */ + + mctx->auth.ca_cert_path = NULL; + mctx->auth.ca_cert_file = NULL; + mctx->auth.cipher_suite = NULL; + mctx->auth.verify_depth = UNSET; + mctx->auth.verify_mode = SSL_CVERIFY_UNSET; +} + +static void modssl_ctx_init_proxy(SSLSrvConfigRec *sc, + apr_pool_t *p) +{ + modssl_ctx_t *mctx; + + mctx = sc->proxy = apr_palloc(p, sizeof(*sc->proxy)); + + modssl_ctx_init(mctx); + + mctx->pkp = apr_palloc(p, sizeof(*mctx->pkp)); + + mctx->pkp->cert_file = NULL; + mctx->pkp->cert_path = NULL; + mctx->pkp->certs = NULL; +} + +static void modssl_ctx_init_server(SSLSrvConfigRec *sc, + apr_pool_t *p) +{ + modssl_ctx_t *mctx; + + mctx = sc->server = apr_palloc(p, sizeof(*sc->server)); + + modssl_ctx_init(mctx); + + mctx->pks = apr_palloc(p, sizeof(*mctx->pks)); + + memset((void*)mctx->pks->cert_files, 0, sizeof(mctx->pks->cert_files)); + + memset((void*)mctx->pks->key_files, 0, sizeof(mctx->pks->key_files)); + + /* certs/keys are set during module init */ + + memset(mctx->pks->certs, 0, sizeof(mctx->pks->certs)); + + memset(mctx->pks->keys, 0, sizeof(mctx->pks->keys)); +} + +static SSLSrvConfigRec *ssl_config_server_new(apr_pool_t *p) +{ + SSLSrvConfigRec *sc = apr_palloc(p, sizeof(*sc)); + + sc->mc = NULL; + sc->enabled = UNSET; + sc->proxy_enabled = UNSET; + sc->vhost_id = NULL; /* set during module init */ + sc->vhost_id_len = 0; /* set during module init */ + sc->session_cache_timeout = UNSET; + sc->insecure_reneg = UNSET; + + modssl_ctx_init_proxy(sc, p); + + modssl_ctx_init_server(sc, p); + + return sc; +} + +/* + * Create per-server SSL configuration + */ +void *ssl_config_server_create(apr_pool_t *p, server_rec *s) +{ + SSLSrvConfigRec *sc = ssl_config_server_new(p); + + sc->mc = ssl_config_global_create(s); + + return sc; +} + +#define cfgMerge(el,unset) mrg->el = (add->el == (unset)) ? base->el : add->el +#define cfgMergeArray(el) mrg->el = apr_array_append(p, add->el, base->el) +#define cfgMergeString(el) cfgMerge(el, NULL) +#define cfgMergeBool(el) cfgMerge(el, UNSET) +#define cfgMergeInt(el) cfgMerge(el, UNSET) + +static void modssl_ctx_cfg_merge(modssl_ctx_t *base, + modssl_ctx_t *add, + modssl_ctx_t *mrg) +{ + cfgMerge(protocol, SSL_PROTOCOL_ALL); + + cfgMerge(pphrase_dialog_type, SSL_PPTYPE_UNSET); + cfgMergeString(pphrase_dialog_path); + + cfgMergeString(cert_chain); + + cfgMerge(crl_path, NULL); + cfgMerge(crl_file, NULL); + + cfgMergeString(auth.ca_cert_path); + cfgMergeString(auth.ca_cert_file); + cfgMergeString(auth.cipher_suite); + cfgMergeInt(auth.verify_depth); + cfgMerge(auth.verify_mode, SSL_CVERIFY_UNSET); +} + +static void modssl_ctx_cfg_merge_proxy(modssl_ctx_t *base, + modssl_ctx_t *add, + modssl_ctx_t *mrg) +{ + modssl_ctx_cfg_merge(base, add, mrg); + + cfgMergeString(pkp->cert_file); + cfgMergeString(pkp->cert_path); +} + +static void modssl_ctx_cfg_merge_server(modssl_ctx_t *base, + modssl_ctx_t *add, + modssl_ctx_t *mrg) +{ + int i; + + modssl_ctx_cfg_merge(base, add, mrg); + + for (i = 0; i < SSL_AIDX_MAX; i++) { + cfgMergeString(pks->cert_files[i]); + cfgMergeString(pks->key_files[i]); + } +} + +/* + * Merge per-server SSL configurations + */ +void *ssl_config_server_merge(apr_pool_t *p, void *basev, void *addv) +{ + SSLSrvConfigRec *base = (SSLSrvConfigRec *)basev; + SSLSrvConfigRec *add = (SSLSrvConfigRec *)addv; + SSLSrvConfigRec *mrg = ssl_config_server_new(p); + + cfgMerge(mc, NULL); + cfgMergeBool(enabled); + cfgMergeBool(proxy_enabled); + cfgMergeInt(session_cache_timeout); + cfgMergeBool(insecure_reneg); + + modssl_ctx_cfg_merge_proxy(base->proxy, add->proxy, mrg->proxy); + + modssl_ctx_cfg_merge_server(base->server, add->server, mrg->server); + + return mrg; +} + +/* + * Create per-directory SSL configuration + */ +void *ssl_config_perdir_create(apr_pool_t *p, char *dir) +{ + SSLDirConfigRec *dc = apr_palloc(p, sizeof(*dc)); + + dc->bSSLRequired = FALSE; + dc->aRequirement = apr_array_make(p, 4, sizeof(ssl_require_t)); + dc->nOptions = SSL_OPT_NONE|SSL_OPT_RELSET; + dc->nOptionsAdd = SSL_OPT_NONE; + dc->nOptionsDel = SSL_OPT_NONE; + + dc->szCipherSuite = NULL; + dc->nVerifyClient = SSL_CVERIFY_UNSET; + dc->nVerifyDepth = UNSET; + + dc->szCACertificatePath = NULL; + dc->szCACertificateFile = NULL; + dc->szUserName = NULL; + + return dc; +} + +/* + * Merge per-directory SSL configurations + */ +void *ssl_config_perdir_merge(apr_pool_t *p, void *basev, void *addv) +{ + SSLDirConfigRec *base = (SSLDirConfigRec *)basev; + SSLDirConfigRec *add = (SSLDirConfigRec *)addv; + SSLDirConfigRec *mrg = (SSLDirConfigRec *)apr_palloc(p, sizeof(*mrg)); + + cfgMerge(bSSLRequired, FALSE); + cfgMergeArray(aRequirement); + + if (add->nOptions & SSL_OPT_RELSET) { + mrg->nOptionsAdd = + (base->nOptionsAdd & ~(add->nOptionsDel)) | add->nOptionsAdd; + mrg->nOptionsDel = + (base->nOptionsDel & ~(add->nOptionsAdd)) | add->nOptionsDel; + mrg->nOptions = + (base->nOptions & ~(mrg->nOptionsDel)) | mrg->nOptionsAdd; + } + else { + mrg->nOptions = add->nOptions; + mrg->nOptionsAdd = add->nOptionsAdd; + mrg->nOptionsDel = add->nOptionsDel; + } + + cfgMergeString(szCipherSuite); + cfgMerge(nVerifyClient, SSL_CVERIFY_UNSET); + cfgMergeInt(nVerifyDepth); + + cfgMergeString(szCACertificatePath); + cfgMergeString(szCACertificateFile); + cfgMergeString(szUserName); + + return mrg; +} + +/* + * Configuration functions for particular directives + */ + +const char *ssl_cmd_SSLMutex(cmd_parms *cmd, + void *dcfg, + const char *arg) +{ + const char *err; + SSLModConfigRec *mc = myModConfig(cmd->server); + + if ((err = ap_check_cmd_context(cmd, GLOBAL_ONLY))) { + return err; + } + + if (ssl_config_global_isfixed(mc)) { + return NULL; + } + + if (strcEQ(arg, "none") || strcEQ(arg, "no")) { + mc->nMutexMode = SSL_MUTEXMODE_NONE; + } + /* NOTE: previously, 'yes' implied 'sem' */ + else if (strcEQ(arg, "default") || strcEQ(arg, "yes")) { + mc->nMutexMode = SSL_MUTEXMODE_USED; + mc->nMutexMech = APR_LOCK_DEFAULT; + mc->szMutexFile = NULL; /* APR determines temporary filename */ + } +#if APR_HAS_FLOCK_SERIALIZE + else if (strlen(arg) > 6 && strcEQn(arg, "flock:", 6)) { + const char *file = ap_server_root_relative(cmd->pool, arg+6); + if (!file) { + return apr_pstrcat(cmd->pool, "Invalid SSLMutex flock: path ", + arg+6, NULL); + } + mc->nMutexMode = SSL_MUTEXMODE_USED; + mc->nMutexMech = APR_LOCK_FLOCK; + mc->szMutexFile = apr_psprintf(mc->pPool, "%s.%lu", + file, (unsigned long)getpid()); + } +#endif +#if APR_HAS_FCNTL_SERIALIZE + else if (strlen(arg) > 6 && strcEQn(arg, "fcntl:", 6)) { + const char *file = ap_server_root_relative(cmd->pool, arg+6); + if (!file) { + return apr_pstrcat(cmd->pool, "Invalid SSLMutex fcntl: path ", + arg+6, NULL); + } + mc->nMutexMode = SSL_MUTEXMODE_USED; + mc->nMutexMech = APR_LOCK_FCNTL; + mc->szMutexFile = apr_psprintf(mc->pPool, "%s.%lu", + file, (unsigned long)getpid()); + } +#endif +#if APR_HAS_SYSVSEM_SERIALIZE && !defined(PERCHILD_MPM) + else if (strcEQ(arg, "sysvsem")) { + mc->nMutexMode = SSL_MUTEXMODE_USED; + mc->nMutexMech = APR_LOCK_SYSVSEM; + mc->szMutexFile = NULL; /* APR determines temporary filename */ + } +#endif +#if APR_HAS_POSIXSEM_SERIALIZE + else if (strcEQ(arg, "posixsem")) { + mc->nMutexMode = SSL_MUTEXMODE_USED; + mc->nMutexMech = APR_LOCK_POSIXSEM; + mc->szMutexFile = NULL; /* APR determines temporary filename */ + } +#endif +#if APR_HAS_PROC_PTHREAD_SERIALIZE + else if (strcEQ(arg, "pthread")) { + mc->nMutexMode = SSL_MUTEXMODE_USED; + mc->nMutexMech = APR_LOCK_PROC_PTHREAD; + mc->szMutexFile = NULL; /* APR determines temporary filename */ + } +#endif +#if APR_HAS_FLOCK_SERIALIZE || APR_HAS_FCNTL_SERIALIZE + else if (strlen(arg) > 5 && strcEQn(arg, "file:", 5)) { + const char *file = ap_server_root_relative(cmd->pool, arg+5); + if (!file) { + return apr_pstrcat(cmd->pool, "Invalid SSLMutex file: path ", + arg+5, NULL); + } + mc->nMutexMode = SSL_MUTEXMODE_USED; +#if APR_HAS_FLOCK_SERIALIZE + mc->nMutexMech = APR_LOCK_FLOCK; +#endif +#if APR_HAS_FCNTL_SERIALIZE + mc->nMutexMech = APR_LOCK_FCNTL; +#endif + mc->szMutexFile = + apr_psprintf(mc->pPool, "%s.%lu", + file, (unsigned long)getpid()); + } +#endif +#if (APR_HAS_SYSVSEM_SERIALIZE && !defined(PERCHILD_MPM)) || APR_HAS_POSIXSEM_SERIALIZE + else if (strcEQ(arg, "sem")) { + mc->nMutexMode = SSL_MUTEXMODE_USED; +#if APR_HAS_SYSVSEM_SERIALIZE && !defined(PERCHILD_MPM) + mc->nMutexMech = APR_LOCK_SYSVSEM; +#endif +#if APR_HAS_POSIXSEM_SERIALIZE + mc->nMutexMech = APR_LOCK_POSIXSEM; +#endif + mc->szMutexFile = NULL; /* APR determines temporary filename */ + } +#endif + else { + return apr_pstrcat(cmd->pool, "Invalid SSLMutex argument ", + arg, " (", ssl_valid_ssl_mutex_string, ")", NULL); + } + + return NULL; +} + +const char *ssl_cmd_SSLPassPhraseDialog(cmd_parms *cmd, + void *dcfg, + const char *arg) +{ + SSLSrvConfigRec *sc = mySrvConfig(cmd->server); + const char *err; + int arglen = strlen(arg); + + if ((err = ap_check_cmd_context(cmd, GLOBAL_ONLY))) { + return err; + } + + if (strcEQ(arg, "builtin")) { + sc->server->pphrase_dialog_type = SSL_PPTYPE_BUILTIN; + sc->server->pphrase_dialog_path = NULL; + } + else if ((arglen > 5) && strEQn(arg, "exec:", 5)) { + sc->server->pphrase_dialog_type = SSL_PPTYPE_FILTER; + /* ### This is broken, exec: may contain args, no? */ + sc->server->pphrase_dialog_path = + ap_server_root_relative(cmd->pool, arg+5); + if (!sc->server->pphrase_dialog_path) { + return apr_pstrcat(cmd->pool, + "Invalid SSLPassPhraseDialog exec: path ", + arg+5, NULL); + } + if (!ssl_util_path_check(SSL_PCM_EXISTS, + sc->server->pphrase_dialog_path, + cmd->pool)) + { + return apr_pstrcat(cmd->pool, + "SSLPassPhraseDialog: file '", + sc->server->pphrase_dialog_path, + "' does not exist", NULL); + } + + } + else if ((arglen > 1) && (arg[0] == '|')) { + sc->server->pphrase_dialog_type = SSL_PPTYPE_PIPE; + sc->server->pphrase_dialog_path = arg + 1; + } + else { + return "SSLPassPhraseDialog: Invalid argument"; + } + + return NULL; +} + +#ifdef SSL_EXPERIMENTAL_ENGINE +const char *ssl_cmd_SSLCryptoDevice(cmd_parms *cmd, + void *dcfg, + const char *arg) +{ + SSLModConfigRec *mc = myModConfig(cmd->server); + const char *err; + ENGINE *e; +#if SSL_LIBRARY_VERSION >= 0x00907000 + static int loaded_engines = FALSE; + + /* early loading to make sure the engines are already + available for ENGINE_by_id() above... */ + if (!loaded_engines) { + ENGINE_load_builtin_engines(); + loaded_engines = TRUE; + } +#endif + if ((err = ap_check_cmd_context(cmd, GLOBAL_ONLY))) { + return err; + } + + if (strcEQ(arg, "builtin")) { + mc->szCryptoDevice = NULL; + } + else if ((e = ENGINE_by_id(arg))) { + mc->szCryptoDevice = arg; + ENGINE_free(e); + } + else { + return "SSLCryptoDevice: Invalid argument"; + } + + return NULL; +} +#endif + +const char *ssl_cmd_SSLRandomSeed(cmd_parms *cmd, + void *dcfg, + const char *arg1, + const char *arg2, + const char *arg3) +{ + SSLModConfigRec *mc = myModConfig(cmd->server); + const char *err; + ssl_randseed_t *seed; + int arg2len = strlen(arg2); + + if ((err = ap_check_cmd_context(cmd, GLOBAL_ONLY))) { + return err; + } + + if (ssl_config_global_isfixed(mc)) { + return NULL; + } + + seed = apr_array_push(mc->aRandSeed); + + if (strcEQ(arg1, "startup")) { + seed->nCtx = SSL_RSCTX_STARTUP; + } + else if (strcEQ(arg1, "connect")) { + seed->nCtx = SSL_RSCTX_CONNECT; + } + else { + return apr_pstrcat(cmd->pool, "SSLRandomSeed: " + "invalid context: `", arg1, "'", + NULL); + } + + if ((arg2len > 5) && strEQn(arg2, "file:", 5)) { + seed->nSrc = SSL_RSSRC_FILE; + seed->cpPath = ap_server_root_relative(mc->pPool, arg2+5); + } + else if ((arg2len > 5) && strEQn(arg2, "exec:", 5)) { + seed->nSrc = SSL_RSSRC_EXEC; + seed->cpPath = ap_server_root_relative(mc->pPool, arg2+5); + } + else if ((arg2len > 4) && strEQn(arg2, "egd:", 4)) { +#ifdef HAVE_SSL_RAND_EGD + seed->nSrc = SSL_RSSRC_EGD; + seed->cpPath = ap_server_root_relative(mc->pPool, arg2+4); +#else + return "egd not supported with this SSL toolkit"; +#endif + } + else if (strcEQ(arg2, "builtin")) { + seed->nSrc = SSL_RSSRC_BUILTIN; + seed->cpPath = NULL; + } + else { + seed->nSrc = SSL_RSSRC_FILE; + seed->cpPath = ap_server_root_relative(mc->pPool, arg2); + } + + if (seed->nSrc != SSL_RSSRC_BUILTIN) { + if (!seed->cpPath) { + return apr_pstrcat(cmd->pool, + "Invalid SSLRandomSeed path ", + arg2, NULL); + } + if (!ssl_util_path_check(SSL_PCM_EXISTS, seed->cpPath, cmd->pool)) { + return apr_pstrcat(cmd->pool, + "SSLRandomSeed: source path '", + seed->cpPath, "' does not exist", NULL); + } + } + + if (!arg3) { + seed->nBytes = 0; /* read whole file */ + } + else { + if (seed->nSrc == SSL_RSSRC_BUILTIN) { + return "SSLRandomSeed: byte specification not " + "allowed for builtin seed source"; + } + + seed->nBytes = atoi(arg3); + + if (seed->nBytes < 0) { + return "SSLRandomSeed: invalid number of bytes specified"; + } + } + + return NULL; +} + +const char *ssl_cmd_SSLEngine(cmd_parms *cmd, void *dcfg, int flag) +{ + SSLSrvConfigRec *sc = mySrvConfig(cmd->server); + + sc->enabled = flag ? TRUE : FALSE; + + return NULL; +} + +const char *ssl_cmd_SSLCipherSuite(cmd_parms *cmd, + void *dcfg, + const char *arg) +{ + SSLSrvConfigRec *sc = mySrvConfig(cmd->server); + SSLDirConfigRec *dc = (SSLDirConfigRec *)dcfg; + + if (cmd->path) { + dc->szCipherSuite = arg; + } + else { + sc->server->auth.cipher_suite = arg; + } + + return NULL; +} + +#define SSL_FLAGS_CHECK_FILE \ + (SSL_PCM_EXISTS|SSL_PCM_ISREG|SSL_PCM_ISNONZERO) + +#define SSL_FLAGS_CHECK_DIR \ + (SSL_PCM_EXISTS|SSL_PCM_ISDIR) + +static const char *ssl_cmd_check_file(cmd_parms *parms, + const char **file) +{ + const char *filepath = ap_server_root_relative(parms->pool, *file); + + if (!filepath) { + return apr_pstrcat(parms->pool, parms->cmd->name, + ": Invalid file path ", *file, NULL); + } + *file = filepath; + + if (ssl_util_path_check(SSL_FLAGS_CHECK_FILE, *file, parms->pool)) { + return NULL; + } + + return apr_pstrcat(parms->pool, parms->cmd->name, + ": file '", *file, + "' does not exist or is empty", NULL); + +} + +const char *ssl_cmd_SSLInsecureRenegotiation(cmd_parms *cmd, void *dcfg, int flag) +{ +#ifdef SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION + SSLSrvConfigRec *sc = mySrvConfig(cmd->server); + sc->insecure_reneg = flag?TRUE:FALSE; + return NULL; +#else + return "The SSLInsecureRenegotiation directive is not available " + "with this SSL library"; +#endif +} + + +static const char *ssl_cmd_check_dir(cmd_parms *parms, + const char **dir) +{ + const char *dirpath = ap_server_root_relative(parms->pool, *dir); + + if (!dirpath) { + return apr_pstrcat(parms->pool, parms->cmd->name, + ": Invalid dir path ", *dir, NULL); + } + *dir = dirpath; + + if (ssl_util_path_check(SSL_FLAGS_CHECK_DIR, *dir, parms->pool)) { + return NULL; + } + + return apr_pstrcat(parms->pool, parms->cmd->name, + ": directory '", *dir, + "' does not exist", NULL); + +} + +#define SSL_AIDX_CERTS 1 +#define SSL_AIDX_KEYS 2 + +static const char *ssl_cmd_check_aidx_max(cmd_parms *parms, + const char *arg, + int idx) +{ + SSLSrvConfigRec *sc = mySrvConfig(parms->server); + const char *err, *desc=NULL, **files=NULL; + int i; + + if ((err = ssl_cmd_check_file(parms, &arg))) { + return err; + } + + switch (idx) { + case SSL_AIDX_CERTS: + desc = "certificates"; + files = sc->server->pks->cert_files; + break; + case SSL_AIDX_KEYS: + desc = "private keys"; + files = sc->server->pks->key_files; + break; + } + + for (i = 0; i < SSL_AIDX_MAX; i++) { + if (!files[i]) { + files[i] = arg; + return NULL; + } + } + + return apr_psprintf(parms->pool, + "%s: only up to %d " + "different %s per virtual host allowed", + parms->cmd->name, SSL_AIDX_MAX, desc); +} + +const char *ssl_cmd_SSLCertificateFile(cmd_parms *cmd, + void *dcfg, + const char *arg) +{ + + const char *err; + + if ((err = ssl_cmd_check_aidx_max(cmd, arg, SSL_AIDX_CERTS))) { + return err; + } + + return NULL; +} + +const char *ssl_cmd_SSLCertificateKeyFile(cmd_parms *cmd, + void *dcfg, + const char *arg) +{ + const char *err; + + if ((err = ssl_cmd_check_aidx_max(cmd, arg, SSL_AIDX_KEYS))) { + return err; + } + + return NULL; +} + +const char *ssl_cmd_SSLCertificateChainFile(cmd_parms *cmd, + void *dcfg, + const char *arg) +{ + SSLSrvConfigRec *sc = mySrvConfig(cmd->server); + const char *err; + + if ((err = ssl_cmd_check_file(cmd, &arg))) { + return err; + } + + sc->server->cert_chain = arg; + + return NULL; +} + +#define NO_PER_DIR_SSL_CA \ + "Your ssl library does not have support for per-directory CA" + +#ifdef HAVE_SSL_SET_CERT_STORE +# define MODSSL_HAVE_SSL_SET_CERT_STORE 1 +#else +# define MODSSL_HAVE_SSL_SET_CERT_STORE 0 +#endif + +#define MODSSL_SET_CA(f) \ + if (cmd->path) \ + if (MODSSL_HAVE_SSL_SET_CERT_STORE) \ + dc->f = arg; \ + else \ + return NO_PER_DIR_SSL_CA; \ + else \ + sc->f = arg \ + +const char *ssl_cmd_SSLCACertificatePath(cmd_parms *cmd, + void *dcfg, + const char *arg) +{ + /*SSLDirConfigRec *dc = (SSLDirConfigRec *)dcfg;*/ + SSLSrvConfigRec *sc = mySrvConfig(cmd->server); + const char *err; + + if ((err = ssl_cmd_check_dir(cmd, &arg))) { + return err; + } + + /* XXX: bring back per-dir */ + sc->server->auth.ca_cert_path = arg; + + return NULL; +} + +const char *ssl_cmd_SSLCACertificateFile(cmd_parms *cmd, + void *dcfg, + const char *arg) +{ + /*SSLDirConfigRec *dc = (SSLDirConfigRec *)dcfg;*/ + SSLSrvConfigRec *sc = mySrvConfig(cmd->server); + const char *err; + + if ((err = ssl_cmd_check_file(cmd, &arg))) { + return err; + } + + /* XXX: bring back per-dir */ + sc->server->auth.ca_cert_file = arg; + + return NULL; +} + +const char *ssl_cmd_SSLCARevocationPath(cmd_parms *cmd, + void *dcfg, + const char *arg) +{ + SSLSrvConfigRec *sc = mySrvConfig(cmd->server); + const char *err; + + if ((err = ssl_cmd_check_dir(cmd, &arg))) { + return err; + } + + sc->server->crl_path = arg; + + return NULL; +} + +const char *ssl_cmd_SSLCARevocationFile(cmd_parms *cmd, + void *dcfg, + const char *arg) +{ + SSLSrvConfigRec *sc = mySrvConfig(cmd->server); + const char *err; + + if ((err = ssl_cmd_check_file(cmd, &arg))) { + return err; + } + + sc->server->crl_file = arg; + + return NULL; +} + +static const char *ssl_cmd_verify_parse(cmd_parms *parms, + const char *arg, + ssl_verify_t *id) +{ + if (strcEQ(arg, "none") || strcEQ(arg, "off")) { + *id = SSL_CVERIFY_NONE; + } + else if (strcEQ(arg, "optional")) { + *id = SSL_CVERIFY_OPTIONAL; + } + else if (strcEQ(arg, "require") || strcEQ(arg, "on")) { + *id = SSL_CVERIFY_REQUIRE; + } + else if (strcEQ(arg, "optional_no_ca")) { + *id = SSL_CVERIFY_OPTIONAL_NO_CA; + } + else { + return apr_pstrcat(parms->temp_pool, parms->cmd->name, + ": Invalid argument '", arg, "'", + NULL); + } + + return NULL; +} + +const char *ssl_cmd_SSLVerifyClient(cmd_parms *cmd, + void *dcfg, + const char *arg) +{ + SSLDirConfigRec *dc = (SSLDirConfigRec *)dcfg; + SSLSrvConfigRec *sc = mySrvConfig(cmd->server); + ssl_verify_t mode; + const char *err; + + if ((err = ssl_cmd_verify_parse(cmd, arg, &mode))) { + return err; + } + + if (cmd->path) { + dc->nVerifyClient = mode; + } + else { + sc->server->auth.verify_mode = mode; + } + + return NULL; +} + +static const char *ssl_cmd_verify_depth_parse(cmd_parms *parms, + const char *arg, + int *depth) +{ + if ((*depth = atoi(arg)) >= 0) { + return NULL; + } + + return apr_pstrcat(parms->temp_pool, parms->cmd->name, + ": Invalid argument '", arg, "'", + NULL); +} + +const char *ssl_cmd_SSLVerifyDepth(cmd_parms *cmd, + void *dcfg, + const char *arg) +{ + SSLDirConfigRec *dc = (SSLDirConfigRec *)dcfg; + SSLSrvConfigRec *sc = mySrvConfig(cmd->server); + int depth; + const char *err; + + if ((err = ssl_cmd_verify_depth_parse(cmd, arg, &depth))) { + return err; + } + + if (cmd->path) { + dc->nVerifyDepth = depth; + } + else { + sc->server->auth.verify_depth = depth; + } + + return NULL; +} + +#define MODSSL_NO_SHARED_MEMORY_ERROR \ + "SSLSessionCache: shared memory cache not useable on this platform" + +const char *ssl_cmd_SSLSessionCache(cmd_parms *cmd, + void *dcfg, + const char *arg) +{ + SSLModConfigRec *mc = myModConfig(cmd->server); + const char *err, *colon; + char *cp, *cp2; + int arglen = strlen(arg); + + if ((err = ap_check_cmd_context(cmd, GLOBAL_ONLY))) { + return err; + } + + if (ssl_config_global_isfixed(mc)) { + return NULL; + } + + if (strcEQ(arg, "none")) { + mc->nSessionCacheMode = SSL_SCMODE_NONE; + mc->szSessionCacheDataFile = NULL; + } + else if ((arglen > 4) && strcEQn(arg, "dbm:", 4)) { + mc->nSessionCacheMode = SSL_SCMODE_DBM; + mc->szSessionCacheDataFile = ap_server_root_relative(mc->pPool, arg+4); + if (!mc->szSessionCacheDataFile) { + return apr_psprintf(cmd->pool, + "SSLSessionCache: Invalid cache file path %s", + arg+4); + } + } + else if ((arglen > 6) && strcEQn(arg, "shmht:", 6)) { +#if !APR_HAS_SHARED_MEMORY + return MODSSL_NO_SHARED_MEMORY_ERROR; +#endif + mc->nSessionCacheMode = SSL_SCMODE_SHMHT; + colon = ap_strchr_c(arg, ':'); + mc->szSessionCacheDataFile = + ap_server_root_relative(mc->pPool, colon+1); + if (!mc->szSessionCacheDataFile) { + return apr_psprintf(cmd->pool, + "SSLSessionCache: Invalid cache file path %s", + colon+1); + } + mc->tSessionCacheDataTable = NULL; + mc->nSessionCacheDataSize = 1024*512; /* 512KB */ + + if ((cp = strchr(mc->szSessionCacheDataFile, '('))) { + *cp++ = NUL; + + if (!(cp2 = strchr(cp, ')'))) { + return "SSLSessionCache: Invalid argument: " + "no closing parenthesis"; + } + + *cp2 = NUL; + + mc->nSessionCacheDataSize = atoi(cp); + + if (mc->nSessionCacheDataSize < 8192) { + return "SSLSessionCache: Invalid argument: " + "size has to be >= 8192 bytes"; + } + + if (mc->nSessionCacheDataSize >= APR_SHM_MAXSIZE) { + return apr_psprintf(cmd->pool, + "SSLSessionCache: Invalid argument: " + "size has to be < %d bytes on this " + "platform", APR_SHM_MAXSIZE); + } + } + } + else if (((arglen > 4) && strcEQn(arg, "shm:", 4)) || + ((arglen > 6) && strcEQn(arg, "shmcb:", 6))) { +#if !APR_HAS_SHARED_MEMORY + return MODSSL_NO_SHARED_MEMORY_ERROR; +#endif + mc->nSessionCacheMode = SSL_SCMODE_SHMCB; + colon = ap_strchr_c(arg, ':'); + mc->szSessionCacheDataFile = + ap_server_root_relative(mc->pPool, colon+1); + if (!mc->szSessionCacheDataFile) { + return apr_psprintf(cmd->pool, + "SSLSessionCache: Invalid cache file path %s", + colon+1); + } + mc->tSessionCacheDataTable = NULL; + mc->nSessionCacheDataSize = 1024*512; /* 512KB */ + + if ((cp = strchr(mc->szSessionCacheDataFile, '('))) { + *cp++ = NUL; + + if (!(cp2 = strchr(cp, ')'))) { + return "SSLSessionCache: Invalid argument: " + "no closing parenthesis"; + } + + *cp2 = NUL; + + mc->nSessionCacheDataSize = atoi(cp); + + if (mc->nSessionCacheDataSize < 8192) { + return "SSLSessionCache: Invalid argument: " + "size has to be >= 8192 bytes"; + + } + + if (mc->nSessionCacheDataSize >= APR_SHM_MAXSIZE) { + return apr_psprintf(cmd->pool, + "SSLSessionCache: Invalid argument: " + "size has to be < %d bytes on this " + "platform", APR_SHM_MAXSIZE); + + } + } + } + else { + return "SSLSessionCache: Invalid argument"; + } + + return NULL; +} + +const char *ssl_cmd_SSLSessionCacheTimeout(cmd_parms *cmd, + void *dcfg, + const char *arg) +{ + SSLSrvConfigRec *sc = mySrvConfig(cmd->server); + + sc->session_cache_timeout = atoi(arg); + + if (sc->session_cache_timeout < 0) { + return "SSLSessionCacheTimeout: Invalid argument"; + } + + return NULL; +} + +const char *ssl_cmd_SSLOptions(cmd_parms *cmd, + void *dcfg, + const char *arg) +{ + SSLDirConfigRec *dc = (SSLDirConfigRec *)dcfg; + ssl_opt_t opt; + int first = TRUE; + char action, *w; + + while (*arg) { + w = ap_getword_conf(cmd->pool, &arg); + action = NUL; + + if ((*w == '+') || (*w == '-')) { + action = *(w++); + } + else if (first) { + dc->nOptions = SSL_OPT_NONE; + first = FALSE; + } + + if (strcEQ(w, "StdEnvVars")) { + opt = SSL_OPT_STDENVVARS; + } + else if (strcEQ(w, "CompatEnvVars")) { + opt = SSL_OPT_COMPATENVVARS; + } + else if (strcEQ(w, "ExportCertData")) { + opt = SSL_OPT_EXPORTCERTDATA; + } + else if (strcEQ(w, "FakeBasicAuth")) { + opt = SSL_OPT_FAKEBASICAUTH; + } + else if (strcEQ(w, "StrictRequire")) { + opt = SSL_OPT_STRICTREQUIRE; + } + else if (strcEQ(w, "OptRenegotiate")) { + opt = SSL_OPT_OPTRENEGOTIATE; + } + else { + return apr_pstrcat(cmd->pool, + "SSLOptions: Illegal option '", w, "'", + NULL); + } + + if (action == '-') { + dc->nOptionsAdd &= ~opt; + dc->nOptionsDel |= opt; + dc->nOptions &= ~opt; + } + else if (action == '+') { + dc->nOptionsAdd |= opt; + dc->nOptionsDel &= ~opt; + dc->nOptions |= opt; + } + else { + dc->nOptions = opt; + dc->nOptionsAdd = opt; + dc->nOptionsDel = SSL_OPT_NONE; + } + } + + return NULL; +} + +const char *ssl_cmd_SSLRequireSSL(cmd_parms *cmd, void *dcfg) +{ + SSLDirConfigRec *dc = (SSLDirConfigRec *)dcfg; + + dc->bSSLRequired = TRUE; + + return NULL; +} + +const char *ssl_cmd_SSLRequire(cmd_parms *cmd, + void *dcfg, + const char *arg) +{ + SSLDirConfigRec *dc = (SSLDirConfigRec *)dcfg; + ssl_expr *expr; + ssl_require_t *require; + + if (!(expr = ssl_expr_comp(cmd->pool, (char *)arg))) { + return apr_pstrcat(cmd->pool, "SSLRequire: ", + ssl_expr_get_error(), NULL); + } + + require = apr_array_push(dc->aRequirement); + require->cpExpr = apr_pstrdup(cmd->pool, arg); + require->mpExpr = expr; + + return NULL; +} + +static const char *ssl_cmd_protocol_parse(cmd_parms *parms, + const char *arg, + ssl_proto_t *options) +{ + ssl_proto_t thisopt; + + *options = SSL_PROTOCOL_NONE; + + while (*arg) { + char *w = ap_getword_conf(parms->temp_pool, &arg); + char action = '\0'; + + if ((*w == '+') || (*w == '-')) { + action = *(w++); + } + + if (strcEQ(w, "SSLv2")) { + thisopt = SSL_PROTOCOL_SSLV2; + } + else if (strcEQ(w, "SSLv3")) { + thisopt = SSL_PROTOCOL_SSLV3; + } + else if (strcEQ(w, "TLSv1")) { + thisopt = SSL_PROTOCOL_TLSV1; + } + else if (strcEQ(w, "all")) { + thisopt = SSL_PROTOCOL_ALL; + } + else { + return apr_pstrcat(parms->temp_pool, + parms->cmd->name, + ": Illegal protocol '", + w, "'", NULL); + } + + if (action == '-') { + *options &= ~thisopt; + } + else if (action == '+') { + *options |= thisopt; + } + else { + *options = thisopt; + } + } + + return NULL; +} + +const char *ssl_cmd_SSLProtocol(cmd_parms *cmd, + void *dcfg, + const char *arg) +{ + SSLSrvConfigRec *sc = mySrvConfig(cmd->server); + + return ssl_cmd_protocol_parse(cmd, arg, &sc->server->protocol); +} + +const char *ssl_cmd_SSLProxyEngine(cmd_parms *cmd, void *dcfg, int flag) +{ + SSLSrvConfigRec *sc = mySrvConfig(cmd->server); + + sc->proxy_enabled = flag ? TRUE : FALSE; + + return NULL; +} + +const char *ssl_cmd_SSLProxyProtocol(cmd_parms *cmd, + void *dcfg, + const char *arg) +{ + SSLSrvConfigRec *sc = mySrvConfig(cmd->server); + + return ssl_cmd_protocol_parse(cmd, arg, &sc->proxy->protocol); +} + +const char *ssl_cmd_SSLProxyCipherSuite(cmd_parms *cmd, + void *dcfg, + const char *arg) +{ + SSLSrvConfigRec *sc = mySrvConfig(cmd->server); + + sc->proxy->auth.cipher_suite = arg; + + return NULL; +} + +const char *ssl_cmd_SSLProxyVerify(cmd_parms *cmd, + void *dcfg, + const char *arg) +{ + SSLSrvConfigRec *sc = mySrvConfig(cmd->server); + ssl_verify_t mode; + const char *err; + + if ((err = ssl_cmd_verify_parse(cmd, arg, &mode))) { + return err; + } + + sc->proxy->auth.verify_mode = mode; + + return NULL; +} + +const char *ssl_cmd_SSLProxyVerifyDepth(cmd_parms *cmd, + void *dcfg, + const char *arg) +{ + SSLSrvConfigRec *sc = mySrvConfig(cmd->server); + int depth; + const char *err; + + if ((err = ssl_cmd_verify_depth_parse(cmd, arg, &depth))) { + return err; + } + + sc->proxy->auth.verify_depth = depth; + + return NULL; +} + +const char *ssl_cmd_SSLProxyCACertificateFile(cmd_parms *cmd, + void *dcfg, + const char *arg) +{ + SSLSrvConfigRec *sc = mySrvConfig(cmd->server); + const char *err; + + if ((err = ssl_cmd_check_file(cmd, &arg))) { + return err; + } + + sc->proxy->auth.ca_cert_file = arg; + + return NULL; +} + +const char *ssl_cmd_SSLProxyCACertificatePath(cmd_parms *cmd, + void *dcfg, + const char *arg) +{ + SSLSrvConfigRec *sc = mySrvConfig(cmd->server); + const char *err; + + if ((err = ssl_cmd_check_dir(cmd, &arg))) { + return err; + } + + sc->proxy->auth.ca_cert_path = arg; + + return NULL; +} + +const char *ssl_cmd_SSLProxyCARevocationPath(cmd_parms *cmd, + void *dcfg, + const char *arg) +{ + SSLSrvConfigRec *sc = mySrvConfig(cmd->server); + const char *err; + + if ((err = ssl_cmd_check_dir(cmd, &arg))) { + return err; + } + + sc->proxy->crl_path = arg; + + return NULL; +} + +const char *ssl_cmd_SSLProxyCARevocationFile(cmd_parms *cmd, + void *dcfg, + const char *arg) +{ + SSLSrvConfigRec *sc = mySrvConfig(cmd->server); + const char *err; + + if ((err = ssl_cmd_check_file(cmd, &arg))) { + return err; + } + + sc->proxy->crl_file = arg; + + return NULL; +} + +const char *ssl_cmd_SSLProxyMachineCertificateFile(cmd_parms *cmd, + void *dcfg, + const char *arg) +{ + SSLSrvConfigRec *sc = mySrvConfig(cmd->server); + const char *err; + + if ((err = ssl_cmd_check_file(cmd, &arg))) { + return err; + } + + sc->proxy->pkp->cert_file = arg; + + return NULL; +} + +const char *ssl_cmd_SSLProxyMachineCertificatePath(cmd_parms *cmd, + void *dcfg, + const char *arg) +{ + SSLSrvConfigRec *sc = mySrvConfig(cmd->server); + const char *err; + + if ((err = ssl_cmd_check_dir(cmd, &arg))) { + return err; + } + + sc->proxy->pkp->cert_path = arg; + + return NULL; +} + + +const char *ssl_cmd_SSLUserName(cmd_parms *cmd, void *dcfg, + const char *arg) +{ + SSLDirConfigRec *dc = (SSLDirConfigRec *)dcfg; + dc->szUserName = arg; + return NULL; +} diff --git a/rubbos/app/httpd-2.0.64/modules/ssl/ssl_engine_dh.c b/rubbos/app/httpd-2.0.64/modules/ssl/ssl_engine_dh.c new file mode 100644 index 00000000..ec66f050 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/ssl/ssl_engine_dh.c @@ -0,0 +1,207 @@ +#if 0 +=pod +#endif +/* 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. + */ + +/* _ _ + * _ __ ___ ___ __| | ___ ___| | mod_ssl + * | '_ ` _ \ / _ \ / _` | / __/ __| | Apache Interface to OpenSSL + * | | | | | | (_) | (_| | \__ \__ \ | + * |_| |_| |_|\___/ \__,_|___|___/___/_| + * |_____| + * ssl_engine_dh.c + * Diffie-Hellman Built-in Temporary Parameters + */ + +#include "mod_ssl.h" + +/* ----BEGIN GENERATED SECTION-------- */ + +/* +** Diffie-Hellman-Parameters: (512 bit) +** prime: +** 00:d4:bc:d5:24:06:f6:9b:35:99:4b:88:de:5d:b8: +** 96:82:c8:15:7f:62:d8:f3:36:33:ee:57:72:f1:1f: +** 05:ab:22:d6:b5:14:5b:9f:24:1e:5a:cc:31:ff:09: +** 0a:4b:c7:11:48:97:6f:76:79:50:94:e7:1e:79:03: +** 52:9f:5a:82:4b +** generator: 2 (0x2) +** Diffie-Hellman-Parameters: (1024 bit) +** prime: +** 00:e6:96:9d:3d:49:5b:e3:2c:7c:f1:80:c3:bd:d4: +** 79:8e:91:b7:81:82:51:bb:05:5e:2a:20:64:90:4a: +** 79:a7:70:fa:15:a2:59:cb:d5:23:a6:a6:ef:09:c4: +** 30:48:d5:a2:2f:97:1f:3c:20:12:9b:48:00:0e:6e: +** dd:06:1c:bc:05:3e:37:1d:79:4e:53:27:df:61:1e: +** bb:be:1b:ac:9b:5c:60:44:cf:02:3d:76:e0:5e:ea: +** 9b:ad:99:1b:13:a6:3c:97:4e:9e:f1:83:9e:b5:db: +** 12:51:36:f7:26:2e:56:a8:87:15:38:df:d8:23:c6: +** 50:50:85:e2:1f:0d:d5:c8:6b +** generator: 2 (0x2) +*/ + +static unsigned char dh512_p[] = +{ + 0xD4, 0xBC, 0xD5, 0x24, 0x06, 0xF6, 0x9B, 0x35, 0x99, 0x4B, 0x88, 0xDE, + 0x5D, 0xB8, 0x96, 0x82, 0xC8, 0x15, 0x7F, 0x62, 0xD8, 0xF3, 0x36, 0x33, + 0xEE, 0x57, 0x72, 0xF1, 0x1F, 0x05, 0xAB, 0x22, 0xD6, 0xB5, 0x14, 0x5B, + 0x9F, 0x24, 0x1E, 0x5A, 0xCC, 0x31, 0xFF, 0x09, 0x0A, 0x4B, 0xC7, 0x11, + 0x48, 0x97, 0x6F, 0x76, 0x79, 0x50, 0x94, 0xE7, 0x1E, 0x79, 0x03, 0x52, + 0x9F, 0x5A, 0x82, 0x4B, +}; +static unsigned char dh512_g[] = +{ + 0x02, +}; + +static DH *get_dh512(void) +{ + return modssl_dh_configure(dh512_p, sizeof(dh512_p), + dh512_g, sizeof(dh512_g)); +} + +static unsigned char dh1024_p[] = +{ + 0xE6, 0x96, 0x9D, 0x3D, 0x49, 0x5B, 0xE3, 0x2C, 0x7C, 0xF1, 0x80, 0xC3, + 0xBD, 0xD4, 0x79, 0x8E, 0x91, 0xB7, 0x81, 0x82, 0x51, 0xBB, 0x05, 0x5E, + 0x2A, 0x20, 0x64, 0x90, 0x4A, 0x79, 0xA7, 0x70, 0xFA, 0x15, 0xA2, 0x59, + 0xCB, 0xD5, 0x23, 0xA6, 0xA6, 0xEF, 0x09, 0xC4, 0x30, 0x48, 0xD5, 0xA2, + 0x2F, 0x97, 0x1F, 0x3C, 0x20, 0x12, 0x9B, 0x48, 0x00, 0x0E, 0x6E, 0xDD, + 0x06, 0x1C, 0xBC, 0x05, 0x3E, 0x37, 0x1D, 0x79, 0x4E, 0x53, 0x27, 0xDF, + 0x61, 0x1E, 0xBB, 0xBE, 0x1B, 0xAC, 0x9B, 0x5C, 0x60, 0x44, 0xCF, 0x02, + 0x3D, 0x76, 0xE0, 0x5E, 0xEA, 0x9B, 0xAD, 0x99, 0x1B, 0x13, 0xA6, 0x3C, + 0x97, 0x4E, 0x9E, 0xF1, 0x83, 0x9E, 0xB5, 0xDB, 0x12, 0x51, 0x36, 0xF7, + 0x26, 0x2E, 0x56, 0xA8, 0x87, 0x15, 0x38, 0xDF, 0xD8, 0x23, 0xC6, 0x50, + 0x50, 0x85, 0xE2, 0x1F, 0x0D, 0xD5, 0xC8, 0x6B, +}; +static unsigned char dh1024_g[] = +{ + 0x02, +}; + +static DH *get_dh1024(void) +{ + return modssl_dh_configure(dh1024_p, sizeof(dh1024_p), + dh1024_g, sizeof(dh1024_g)); +} +/* ----END GENERATED SECTION---------- */ + +DH *ssl_dh_GetTmpParam(int nKeyLen) +{ + DH *dh; + + if (nKeyLen == 512) + dh = get_dh512(); + else if (nKeyLen == 1024) + dh = get_dh1024(); + else + dh = get_dh1024(); + return dh; +} + +DH *ssl_dh_GetParamFromFile(char *file) +{ + DH *dh = NULL; + BIO *bio; + + if ((bio = BIO_new_file(file, "r")) == NULL) + return NULL; +#if SSL_LIBRARY_VERSION < 0x00904000 + dh = PEM_read_bio_DHparams(bio, NULL, NULL); +#else + dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL); +#endif + BIO_free(bio); + return (dh); +} + +/* +=cut +## +## Embedded Perl script for generating the temporary DH parameters +## + +require 5.003; +use strict; + +# configuration +my $file = $0; +my $begin = '----BEGIN GENERATED SECTION--------'; +my $end = '----END GENERATED SECTION----------'; + +# read ourself and keep a backup +open(FP, "<$file") || die; +my $source = ''; +$source .= $_ while (); +close(FP); +open(FP, ">$file.bak") || die; +print FP $source; +close(FP); + +# generate the DH parameters +print "1. Generate 512 and 1024 bit Diffie-Hellman parameters (p, g)\n"; +my $rand = ''; +foreach $file (qw(/var/log/messages /var/adm/messages + /kernel /vmunix /vmlinuz /etc/hosts /etc/resolv.conf)) { + if (-f $file) { + $rand = $file if ($rand eq ''); + $rand .= ":$file" if ($rand ne ''); + } +} +$rand = "-rand $rand" if ($rand ne ''); +system("openssl gendh $rand -out dh512.pem 512"); +system("openssl gendh $rand -out dh1024.pem 1024"); + +# generate DH param info +my $dhinfo = ''; +open(FP, "openssl dh -noout -text -in dh512.pem |") || die; +$dhinfo .= $_ while (); +close(FP); +open(FP, "openssl dh -noout -text -in dh1024.pem |") || die; +$dhinfo .= $_ while (); +close(FP); +$dhinfo =~ s|^|** |mg; +$dhinfo = "\n\/\*\n$dhinfo\*\/\n\n"; + +# generate C source from DH params +my $dhsource = ''; +open(FP, "openssl dh -noout -C -in dh512.pem | indent | expand |") || die; +$dhsource .= $_ while (); +close(FP); +open(FP, "openssl dh -noout -C -in dh1024.pem | indent | expand |") || die; +$dhsource .= $_ while (); +close(FP); +$dhsource =~ s|(DH\s+\*get_dh)|static $1|sg; + +# generate output +my $o = $dhinfo . $dhsource; + +# insert the generated code at the target location +$source =~ s|(\/\* $begin.+?\n).*\n(.*?\/\* $end)|$1$o$2|s; + +# and update the source on disk +print "Updating file `$file'\n"; +open(FP, ">$file") || die; +print FP $source; +close(FP); + +# cleanup +unlink("dh512.pem"); +unlink("dh1024.pem"); + +=pod +*/ diff --git a/rubbos/app/httpd-2.0.64/modules/ssl/ssl_engine_init.c b/rubbos/app/httpd-2.0.64/modules/ssl/ssl_engine_init.c new file mode 100644 index 00000000..92c3395d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/ssl/ssl_engine_init.c @@ -0,0 +1,1243 @@ +/* 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. + */ + +/* _ _ + * _ __ ___ ___ __| | ___ ___| | mod_ssl + * | '_ ` _ \ / _ \ / _` | / __/ __| | Apache Interface to OpenSSL + * | | | | | | (_) | (_| | \__ \__ \ | + * |_| |_| |_|\___/ \__,_|___|___/___/_| + * |_____| + * ssl_engine_init.c + * Initialization of Servers + */ + /* ``Recursive, adj.; + see Recursive.'' + -- Unknown */ +#include "mod_ssl.h" + +/* _________________________________________________________________ +** +** Module Initialization +** _________________________________________________________________ +*/ + + +static void ssl_add_version_components(apr_pool_t *p, + server_rec *s) +{ + char *modver = ssl_var_lookup(p, s, NULL, NULL, "SSL_VERSION_INTERFACE"); + char *libver = ssl_var_lookup(p, s, NULL, NULL, "SSL_VERSION_LIBRARY"); + char *incver = ssl_var_lookup(p, s, NULL, NULL, + "SSL_VERSION_LIBRARY_INTERFACE"); + + ap_add_version_component(p, modver); + ap_add_version_component(p, libver); + + ap_log_error(APLOG_MARK, APLOG_INFO, 0, s, + "%s compiled against Server: %s, Library: %s", + modver, AP_SERVER_BASEVERSION, incver); +} + + +/* + * Initialize SSL library + */ +static void ssl_init_SSLLibrary(server_rec *s) +{ + ap_log_error(APLOG_MARK, APLOG_INFO, 0, s, + "Init: Initializing %s library", SSL_LIBRARY_NAME); + + SSL_load_error_strings(); + SSL_library_init(); + OpenSSL_add_all_algorithms(); /* Required for eg SHA256 client certs */ +} + +/* + * Handle the Temporary RSA Keys and DH Params + */ + +#define MODSSL_TMP_KEY_FREE(mc, type, idx) \ + if (mc->pTmpKeys[idx]) { \ + type##_free((type *)mc->pTmpKeys[idx]); \ + mc->pTmpKeys[idx] = NULL; \ + } + +#define MODSSL_TMP_KEYS_FREE(mc, type) \ + MODSSL_TMP_KEY_FREE(mc, type, SSL_TMP_KEY_##type##_512); \ + MODSSL_TMP_KEY_FREE(mc, type, SSL_TMP_KEY_##type##_1024) + +static void ssl_tmp_keys_free(server_rec *s) +{ + SSLModConfigRec *mc = myModConfig(s); + + MODSSL_TMP_KEYS_FREE(mc, RSA); + MODSSL_TMP_KEYS_FREE(mc, DH); +} + +static int ssl_tmp_key_init_rsa(server_rec *s, + int bits, int idx) +{ + SSLModConfigRec *mc = myModConfig(s); + + if (!(mc->pTmpKeys[idx] = + RSA_generate_key(bits, RSA_F4, NULL, NULL))) + { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, + "Init: Failed to generate temporary " + "%d bit RSA private key", bits); + return !OK; + } + + return OK; +} + +static int ssl_tmp_key_init_dh(server_rec *s, + int bits, int idx) +{ + SSLModConfigRec *mc = myModConfig(s); + + if (!(mc->pTmpKeys[idx] = + ssl_dh_GetTmpParam(bits))) + { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, + "Init: Failed to generate temporary " + "%d bit DH parameters", bits); + return !OK; + } + + return OK; +} + +#define MODSSL_TMP_KEY_INIT_RSA(s, bits) \ + ssl_tmp_key_init_rsa(s, bits, SSL_TMP_KEY_RSA_##bits) + +#define MODSSL_TMP_KEY_INIT_DH(s, bits) \ + ssl_tmp_key_init_dh(s, bits, SSL_TMP_KEY_DH_##bits) + +static int ssl_tmp_keys_init(server_rec *s) +{ + ap_log_error(APLOG_MARK, APLOG_INFO, 0, s, + "Init: Generating temporary RSA private keys (512/1024 bits)"); + + if (MODSSL_TMP_KEY_INIT_RSA(s, 512) || + MODSSL_TMP_KEY_INIT_RSA(s, 1024)) { + return !OK; + } + + ap_log_error(APLOG_MARK, APLOG_INFO, 0, s, + "Init: Generating temporary DH parameters (512/1024 bits)"); + + if (MODSSL_TMP_KEY_INIT_DH(s, 512) || + MODSSL_TMP_KEY_INIT_DH(s, 1024)) { + return !OK; + } + + return OK; +} + +/* + * Per-module initialization + */ +int ssl_init_Module(apr_pool_t *p, apr_pool_t *plog, + apr_pool_t *ptemp, + server_rec *base_server) +{ + SSLModConfigRec *mc = myModConfig(base_server); + SSLSrvConfigRec *sc; + server_rec *s; + + /* + * Let us cleanup on restarts and exists + */ + apr_pool_cleanup_register(p, base_server, + ssl_init_ModuleKill, + apr_pool_cleanup_null); + + /* + * Any init round fixes the global config + */ + ssl_config_global_create(base_server); /* just to avoid problems */ + ssl_config_global_fix(mc); + + /* + * try to fix the configuration and open the dedicated SSL + * logfile as early as possible + */ + for (s = base_server; s; s = s->next) { + sc = mySrvConfig(s); + + if (sc->server) { + sc->server->sc = sc; + } + + if (sc->proxy) { + sc->proxy->sc = sc; + } + + /* + * Create the server host:port string because we need it a lot + */ + sc->vhost_id = ssl_util_vhostid(p, s); + sc->vhost_id_len = strlen(sc->vhost_id); + + /* Fix up stuff that may not have been set */ + if (sc->enabled == UNSET) { + sc->enabled = FALSE; + } + + if (sc->proxy_enabled == UNSET) { + sc->proxy_enabled = FALSE; + } + + if (sc->session_cache_timeout == UNSET) { + sc->session_cache_timeout = SSL_SESSION_CACHE_TIMEOUT; + } + + if (sc->server->pphrase_dialog_type == SSL_PPTYPE_UNSET) { + sc->server->pphrase_dialog_type = SSL_PPTYPE_BUILTIN; + } + + } + +#if APR_HAS_THREADS + ssl_util_thread_setup(p); +#endif + + /* + * SSL external crypto device ("engine") support + */ +#ifdef SSL_EXPERIMENTAL_ENGINE + ssl_init_Engine(base_server, p); +#endif + + ssl_init_SSLLibrary(base_server); + + /* + * Seed the Pseudo Random Number Generator (PRNG) + * only need ptemp here; nothing inside allocated from the pool + * needs to live once we return from ssl_rand_seed(). + */ + ssl_rand_seed(base_server, ptemp, SSL_RSCTX_STARTUP, "Init: "); + + /* + * read server private keys/public certs into memory. + * decrypting any encrypted keys via configured SSLPassPhraseDialogs + * anything that needs to live longer than ptemp needs to also survive + * restarts, in which case they'll live inside s->process->pool. + */ + ssl_pphrase_Handle(base_server, ptemp); + + if (ssl_tmp_keys_init(base_server)) { + return !OK; + } + + /* + * initialize the mutex handling + */ + if (!ssl_mutex_init(base_server, p)) { + return HTTP_INTERNAL_SERVER_ERROR; + } + + /* + * initialize session caching + */ + ssl_scache_init(base_server, p); + + /* + * initialize servers + */ + ap_log_error(APLOG_MARK, APLOG_INFO, 0, base_server, + "Init: Initializing (virtual) servers for SSL"); + + for (s = base_server; s; s = s->next) { + sc = mySrvConfig(s); + /* + * Either now skip this server when SSL is disabled for + * it or give out some information about what we're + * configuring. + */ + + /* + * Read the server certificate and key + */ + ssl_init_ConfigureServer(s, p, ptemp, sc); + } + + /* + * Configuration consistency checks + */ + ssl_init_CheckServers(base_server, ptemp); + + /* + * Announce mod_ssl and SSL library in HTTP Server field + * as ``mod_ssl/X.X.X OpenSSL/X.X.X'' + */ + ssl_add_version_components(p, base_server); + + SSL_init_app_data2_idx(); /* for SSL_get_app_data2() at request time */ + + return OK; +} + +/* + * Support for external a Crypto Device ("engine"), usually + * a hardware accellerator card for crypto operations. + */ +#ifdef SSL_EXPERIMENTAL_ENGINE +void ssl_init_Engine(server_rec *s, apr_pool_t *p) +{ + SSLModConfigRec *mc = myModConfig(s); + ENGINE *e; + + if (mc->szCryptoDevice) { + if (!(e = ENGINE_by_id(mc->szCryptoDevice))) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, + "Init: Failed to load Crypto Device API `%s'", + mc->szCryptoDevice); + ssl_log_ssl_error(APLOG_MARK, APLOG_ERR, s); + ssl_die(); + } + + if (strEQ(mc->szCryptoDevice, "chil")) { + ENGINE_ctrl(e, ENGINE_CTRL_CHIL_SET_FORKCHECK, 1, 0, 0); + } + + if (!ENGINE_set_default(e, ENGINE_METHOD_ALL)) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, + "Init: Failed to enable Crypto Device API `%s'", + mc->szCryptoDevice); + ssl_log_ssl_error(APLOG_MARK, APLOG_ERR, s); + ssl_die(); + } + + ENGINE_free(e); + } +} +#endif + +static void ssl_init_server_check(server_rec *s, + apr_pool_t *p, + apr_pool_t *ptemp, + modssl_ctx_t *mctx) +{ + /* + * check for important parameters and the + * possibility that the user forgot to set them. + */ + if (!mctx->pks->cert_files[0]) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, + "No SSL Certificate set [hint: SSLCertificateFile]"); + ssl_die(); + } + + /* + * Check for problematic re-initializations + */ + if (mctx->pks->certs[SSL_AIDX_RSA] || + mctx->pks->certs[SSL_AIDX_DSA]) + { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, + "Illegal attempt to re-initialise SSL for server " + "(theoretically shouldn't happen!)"); + ssl_die(); + } +} + +static void ssl_init_ctx_protocol(server_rec *s, + apr_pool_t *p, + apr_pool_t *ptemp, + modssl_ctx_t *mctx) +{ + SSL_CTX *ctx = NULL; + SSL_METHOD *method = NULL; + char *cp; + int protocol = mctx->protocol; + SSLSrvConfigRec *sc = mySrvConfig(s); + + /* + * Create the new per-server SSL context + */ + if (protocol == SSL_PROTOCOL_NONE) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, + "No SSL protocols available [hint: SSLProtocol]"); + ssl_die(); + } + + cp = apr_pstrcat(p, + (protocol & SSL_PROTOCOL_SSLV2 ? "SSLv2, " : ""), + (protocol & SSL_PROTOCOL_SSLV3 ? "SSLv3, " : ""), + (protocol & SSL_PROTOCOL_TLSV1 ? "TLSv1, " : ""), + NULL); + cp[strlen(cp)-2] = NUL; + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "Creating new SSL context (protocols: %s)", cp); + + if (protocol == SSL_PROTOCOL_SSLV2) { + method = mctx->pkp ? + SSLv2_client_method() : /* proxy */ + SSLv2_server_method(); /* server */ + ctx = SSL_CTX_new(method); /* only SSLv2 is left */ + } + else { + method = mctx->pkp ? + SSLv23_client_method() : /* proxy */ + SSLv23_server_method(); /* server */ + ctx = SSL_CTX_new(method); /* be more flexible */ + } + + mctx->ssl_ctx = ctx; + + SSL_CTX_set_options(ctx, SSL_OP_ALL); + + if (!(protocol & SSL_PROTOCOL_SSLV2)) { + SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv2); + } + + if (!(protocol & SSL_PROTOCOL_SSLV3)) { + SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv3); + } + + if (!(protocol & SSL_PROTOCOL_TLSV1)) { + SSL_CTX_set_options(ctx, SSL_OP_NO_TLSv1); + } + +#ifdef SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION + if (sc->insecure_reneg == TRUE) { + SSL_CTX_set_options(ctx, SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION); + } +#endif + + SSL_CTX_set_app_data(ctx, s); + + /* + * Configure additional context ingredients + */ + SSL_CTX_set_options(ctx, SSL_OP_SINGLE_DH_USE); + +#ifdef SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION + /* + * Disallow a session from being resumed during a renegotiation, + * so that an acceptable cipher suite can be negotiated. + */ + SSL_CTX_set_options(ctx, SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION); +#endif +} + +static void ssl_init_ctx_session_cache(server_rec *s, + apr_pool_t *p, + apr_pool_t *ptemp, + modssl_ctx_t *mctx) +{ + SSL_CTX *ctx = mctx->ssl_ctx; + SSLModConfigRec *mc = myModConfig(s); + long cache_mode = SSL_SESS_CACHE_OFF; + + if (mc->nSessionCacheMode != SSL_SCMODE_NONE) { + /* SSL_SESS_CACHE_NO_INTERNAL will force OpenSSL + * to ignore process local-caching and + * to always get/set/delete sessions using mod_ssl's callbacks. + */ + cache_mode = SSL_SESS_CACHE_SERVER|SSL_SESS_CACHE_NO_INTERNAL; + } + + SSL_CTX_set_session_cache_mode(ctx, cache_mode); + + SSL_CTX_sess_set_new_cb(ctx, ssl_callback_NewSessionCacheEntry); + SSL_CTX_sess_set_get_cb(ctx, ssl_callback_GetSessionCacheEntry); + SSL_CTX_sess_set_remove_cb(ctx, ssl_callback_DelSessionCacheEntry); +} + +static void ssl_init_ctx_callbacks(server_rec *s, + apr_pool_t *p, + apr_pool_t *ptemp, + modssl_ctx_t *mctx) +{ + SSL_CTX *ctx = mctx->ssl_ctx; + + SSL_CTX_set_tmp_rsa_callback(ctx, ssl_callback_TmpRSA); + SSL_CTX_set_tmp_dh_callback(ctx, ssl_callback_TmpDH); + + SSL_CTX_set_info_callback(ctx, ssl_callback_Info); +} + +static void ssl_init_ctx_verify(server_rec *s, + apr_pool_t *p, + apr_pool_t *ptemp, + modssl_ctx_t *mctx) +{ + SSL_CTX *ctx = mctx->ssl_ctx; + + int verify = SSL_VERIFY_NONE; + STACK_OF(X509_NAME) *ca_list; + + if (mctx->auth.verify_mode == SSL_CVERIFY_UNSET) { + mctx->auth.verify_mode = SSL_CVERIFY_NONE; + } + + if (mctx->auth.verify_depth == UNSET) { + mctx->auth.verify_depth = 1; + } + + /* + * Configure callbacks for SSL context + */ + if (mctx->auth.verify_mode == SSL_CVERIFY_REQUIRE) { + verify |= SSL_VERIFY_PEER_STRICT; + } + + if ((mctx->auth.verify_mode == SSL_CVERIFY_OPTIONAL) || + (mctx->auth.verify_mode == SSL_CVERIFY_OPTIONAL_NO_CA)) + { + verify |= SSL_VERIFY_PEER; + } + + SSL_CTX_set_verify(ctx, verify, ssl_callback_SSLVerify); + + /* + * Configure Client Authentication details + */ + if (mctx->auth.ca_cert_file || mctx->auth.ca_cert_path) { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "Configuring client authentication"); + + if (!SSL_CTX_load_verify_locations(ctx, + MODSSL_PCHAR_CAST mctx->auth.ca_cert_file, + MODSSL_PCHAR_CAST mctx->auth.ca_cert_path)) + { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, + "Unable to configure verify locations " + "for client authentication"); + ssl_log_ssl_error(APLOG_MARK, APLOG_ERR, s); + ssl_die(); + } + + ca_list = ssl_init_FindCAList(s, ptemp, + mctx->auth.ca_cert_file, + mctx->auth.ca_cert_path); + if (!ca_list) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, + "Unable to determine list of available " + "CA certificates for client authentication"); + ssl_die(); + } + + SSL_CTX_set_client_CA_list(ctx, (STACK *)ca_list); + } + + /* + * Give a warning when no CAs were configured but client authentication + * should take place. This cannot work. + */ + if (mctx->auth.verify_mode == SSL_CVERIFY_REQUIRE) { + ca_list = (STACK_OF(X509_NAME) *)SSL_CTX_get_client_CA_list(ctx); + + if (sk_X509_NAME_num(ca_list) == 0) { + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s, + "Init: Oops, you want to request client " + "authentication, but no CAs are known for " + "verification!? [Hint: SSLCACertificate*]"); + } + } +} + +static void ssl_init_ctx_cipher_suite(server_rec *s, + apr_pool_t *p, + apr_pool_t *ptemp, + modssl_ctx_t *mctx) +{ + SSL_CTX *ctx = mctx->ssl_ctx; + const char *suite = mctx->auth.cipher_suite; + + /* + * Configure SSL Cipher Suite + */ + if (!suite) { + return; + } + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "Configuring permitted SSL ciphers [%s]", + suite); + + if (!SSL_CTX_set_cipher_list(ctx, MODSSL_PCHAR_CAST suite)) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, + "Unable to configure permitted SSL ciphers"); + ssl_log_ssl_error(APLOG_MARK, APLOG_ERR, s); + ssl_die(); + } +} + +static void ssl_init_ctx_crl(server_rec *s, + apr_pool_t *p, + apr_pool_t *ptemp, + modssl_ctx_t *mctx) +{ + /* + * Configure Certificate Revocation List (CRL) Details + */ + + if (!(mctx->crl_file || mctx->crl_path)) { + return; + } + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "Configuring certificate revocation facility"); + + mctx->crl = + SSL_X509_STORE_create((char *)mctx->crl_file, + (char *)mctx->crl_path); + + if (!mctx->crl) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, + "Unable to configure X.509 CRL storage " + "for certificate revocation"); + ssl_log_ssl_error(APLOG_MARK, APLOG_ERR, s); + ssl_die(); + } +} + +static void ssl_init_ctx_cert_chain(server_rec *s, + apr_pool_t *p, + apr_pool_t *ptemp, + modssl_ctx_t *mctx) +{ + BOOL skip_first = FALSE; + int i, n; + const char *chain = mctx->cert_chain; + + /* + * Optionally configure extra server certificate chain certificates. + * This is usually done by OpenSSL automatically when one of the + * server cert issuers are found under SSLCACertificatePath or in + * SSLCACertificateFile. But because these are intended for client + * authentication it can conflict. For instance when you use a + * Global ID server certificate you've to send out the intermediate + * CA certificate, too. When you would just configure this with + * SSLCACertificateFile and also use client authentication mod_ssl + * would accept all clients also issued by this CA. Obviously this + * isn't what we want in this situation. So this feature here exists + * to allow one to explicity configure CA certificates which are + * used only for the server certificate chain. + */ + if (!chain) { + return; + } + + for (i = 0; (i < SSL_AIDX_MAX) && mctx->pks->cert_files[i]; i++) { + if (strEQ(mctx->pks->cert_files[i], chain)) { + skip_first = TRUE; + break; + } + } + + n = SSL_CTX_use_certificate_chain(mctx->ssl_ctx, + (char *)chain, + skip_first, NULL); + if (n < 0) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, + "Failed to configure CA certificate chain!"); + ssl_die(); + } + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "Configuring server certificate chain " + "(%d CA certificate%s)", + n, n == 1 ? "" : "s"); +} + +static void ssl_init_ctx(server_rec *s, + apr_pool_t *p, + apr_pool_t *ptemp, + modssl_ctx_t *mctx) +{ + ssl_init_ctx_protocol(s, p, ptemp, mctx); + + ssl_init_ctx_session_cache(s, p, ptemp, mctx); + + ssl_init_ctx_callbacks(s, p, ptemp, mctx); + + ssl_init_ctx_verify(s, p, ptemp, mctx); + + ssl_init_ctx_cipher_suite(s, p, ptemp, mctx); + + ssl_init_ctx_crl(s, p, ptemp, mctx); + + if (mctx->pks) { + /* XXX: proxy support? */ + ssl_init_ctx_cert_chain(s, p, ptemp, mctx); + } +} + +static int ssl_server_import_cert(server_rec *s, + modssl_ctx_t *mctx, + const char *id, + int idx) +{ + SSLModConfigRec *mc = myModConfig(s); + ssl_asn1_t *asn1; + MODSSL_D2I_X509_CONST unsigned char *ptr; + const char *type = ssl_asn1_keystr(idx); + X509 *cert; + + if (!(asn1 = ssl_asn1_table_get(mc->tPublicCert, id))) { + return FALSE; + } + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "Configuring %s server certificate", type); + + ptr = asn1->cpData; + if (!(cert = d2i_X509(NULL, &ptr, asn1->nData))) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, + "Unable to import %s server certificate", type); + ssl_log_ssl_error(APLOG_MARK, APLOG_ERR, s); + ssl_die(); + } + + if (SSL_CTX_use_certificate(mctx->ssl_ctx, cert) <= 0) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, + "Unable to configure %s server certificate", type); + ssl_log_ssl_error(APLOG_MARK, APLOG_ERR, s); + ssl_die(); + } + + mctx->pks->certs[idx] = cert; + + return TRUE; +} + +static int ssl_server_import_key(server_rec *s, + modssl_ctx_t *mctx, + const char *id, + int idx) +{ + SSLModConfigRec *mc = myModConfig(s); + ssl_asn1_t *asn1; + MODSSL_D2I_PrivateKey_CONST unsigned char *ptr; + const char *type = ssl_asn1_keystr(idx); + int pkey_type = (idx == SSL_AIDX_RSA) ? EVP_PKEY_RSA : EVP_PKEY_DSA; + EVP_PKEY *pkey; + + if (!(asn1 = ssl_asn1_table_get(mc->tPrivateKey, id))) { + return FALSE; + } + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "Configuring %s server private key", type); + + ptr = asn1->cpData; + if (!(pkey = d2i_PrivateKey(pkey_type, NULL, &ptr, asn1->nData))) + { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, + "Unable to import %s server private key", type); + ssl_log_ssl_error(APLOG_MARK, APLOG_ERR, s); + ssl_die(); + } + + if (SSL_CTX_use_PrivateKey(mctx->ssl_ctx, pkey) <= 0) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, + "Unable to configure %s server private key", type); + ssl_log_ssl_error(APLOG_MARK, APLOG_ERR, s); + ssl_die(); + } + + /* + * XXX: wonder if this is still needed, this is old todo doc. + * (see http://www.psy.uq.edu.au/~ftp/Crypto/ssleay/TODO.html) + */ + if ((pkey_type == EVP_PKEY_DSA) && mctx->pks->certs[idx]) { + EVP_PKEY *pubkey = X509_get_pubkey(mctx->pks->certs[idx]); + + if (pubkey && EVP_PKEY_missing_parameters(pubkey)) { + EVP_PKEY_copy_parameters(pubkey, pkey); + ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, + "Copying DSA parameters from private key to certificate"); + ssl_log_ssl_error(APLOG_MARK, APLOG_ERR, s); + EVP_PKEY_free(pubkey); + } + } + + mctx->pks->keys[idx] = pkey; + + return TRUE; +} + +static void ssl_check_public_cert(server_rec *s, + apr_pool_t *ptemp, + X509 *cert, + int type) +{ + int is_ca, pathlen; + char *cn; + + if (!cert) { + return; + } + + /* + * Some information about the certificate(s) + */ + + if (SSL_X509_isSGC(cert)) { + ap_log_error(APLOG_MARK, APLOG_INFO, 0, s, + "%s server certificate enables " + "Server Gated Cryptography (SGC)", + ssl_asn1_keystr(type)); + } + + if (SSL_X509_getBC(cert, &is_ca, &pathlen)) { + if (is_ca) { + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s, + "%s server certificate is a CA certificate " + "(BasicConstraints: CA == TRUE !?)", + ssl_asn1_keystr(type)); + } + + if (pathlen > 0) { + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s, + "%s server certificate is not a leaf certificate " + "(BasicConstraints: pathlen == %d > 0 !?)", + ssl_asn1_keystr(type), pathlen); + } + } + + if (SSL_X509_getCN(ptemp, cert, &cn)) { + int fnm_flags = FNM_PERIOD|FNM_CASE_BLIND; + + if (apr_fnmatch_test(cn) && + (apr_fnmatch(cn, s->server_hostname, + fnm_flags) == FNM_NOMATCH)) + { + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s, + "%s server certificate wildcard CommonName (CN) `%s' " + "does NOT match server name!?", + ssl_asn1_keystr(type), cn); + } + else if (strNE(s->server_hostname, cn)) { + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s, + "%s server certificate CommonName (CN) `%s' " + "does NOT match server name!?", + ssl_asn1_keystr(type), cn); + } + } +} + +static void ssl_init_server_certs(server_rec *s, + apr_pool_t *p, + apr_pool_t *ptemp, + modssl_ctx_t *mctx) +{ + const char *rsa_id, *dsa_id; + const char *vhost_id = mctx->sc->vhost_id; + int i; + int have_rsa, have_dsa; + + rsa_id = ssl_asn1_table_keyfmt(ptemp, vhost_id, SSL_AIDX_RSA); + dsa_id = ssl_asn1_table_keyfmt(ptemp, vhost_id, SSL_AIDX_DSA); + + have_rsa = ssl_server_import_cert(s, mctx, rsa_id, SSL_AIDX_RSA); + have_dsa = ssl_server_import_cert(s, mctx, dsa_id, SSL_AIDX_DSA); + + if (!(have_rsa || have_dsa)) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, + "Oops, no RSA or DSA server certificate found?!"); + ssl_die(); + } + + for (i = 0; i < SSL_AIDX_MAX; i++) { + ssl_check_public_cert(s, ptemp, mctx->pks->certs[i], i); + } + + have_rsa = ssl_server_import_key(s, mctx, rsa_id, SSL_AIDX_RSA); + have_dsa = ssl_server_import_key(s, mctx, dsa_id, SSL_AIDX_DSA); + + if (!(have_rsa || have_dsa)) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, + "Oops, no RSA or DSA server private key found?!"); + ssl_die(); + } +} + +static void ssl_init_proxy_certs(server_rec *s, + apr_pool_t *p, + apr_pool_t *ptemp, + modssl_ctx_t *mctx) +{ + int n, ncerts = 0; + STACK_OF(X509_INFO) *sk; + modssl_pk_proxy_t *pkp = mctx->pkp; + + SSL_CTX_set_client_cert_cb(mctx->ssl_ctx, + ssl_callback_proxy_cert); + + if (!(pkp->cert_file || pkp->cert_path)) { + return; + } + + sk = sk_X509_INFO_new_null(); + + if (pkp->cert_file) { + SSL_X509_INFO_load_file(ptemp, sk, pkp->cert_file); + } + + if (pkp->cert_path) { + SSL_X509_INFO_load_path(ptemp, sk, pkp->cert_path); + } + + if ((ncerts = sk_X509_INFO_num(sk)) <= 0) { + sk_X509_INFO_free(sk); + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s, + "no client certs found for SSL proxy"); + return; + } + + /* Check that all client certs have got certificates and private + * keys. */ + for (n = 0; n < ncerts; n++) { + X509_INFO *inf = sk_X509_INFO_value(sk, n); + + if (!inf->x509 || !inf->x_pkey) { + sk_X509_INFO_free(sk); + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, s, + "incomplete client cert configured for SSL proxy " + "(missing or encrypted private key?)"); + ssl_die(); + return; + } + } + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "loaded %d client certs for SSL proxy", + ncerts); + pkp->certs = sk; +} + +static void ssl_init_proxy_ctx(server_rec *s, + apr_pool_t *p, + apr_pool_t *ptemp, + SSLSrvConfigRec *sc) +{ + ssl_init_ctx(s, p, ptemp, sc->proxy); + + ssl_init_proxy_certs(s, p, ptemp, sc->proxy); +} + +static void ssl_init_server_ctx(server_rec *s, + apr_pool_t *p, + apr_pool_t *ptemp, + SSLSrvConfigRec *sc) +{ + ssl_init_server_check(s, p, ptemp, sc->server); + + ssl_init_ctx(s, p, ptemp, sc->server); + + ssl_init_server_certs(s, p, ptemp, sc->server); +} + +/* + * Configure a particular server + */ +void ssl_init_ConfigureServer(server_rec *s, + apr_pool_t *p, + apr_pool_t *ptemp, + SSLSrvConfigRec *sc) +{ + if (sc->enabled) { + ap_log_error(APLOG_MARK, APLOG_INFO, 0, s, + "Configuring server for SSL protocol"); + ssl_init_server_ctx(s, p, ptemp, sc); + } + + if (sc->proxy_enabled) { + ssl_init_proxy_ctx(s, p, ptemp, sc); + } +} + +void ssl_init_CheckServers(server_rec *base_server, apr_pool_t *p) +{ + server_rec *s, *ps; + SSLSrvConfigRec *sc; + apr_hash_t *table; + const char *key; + apr_ssize_t klen; + + BOOL conflict = FALSE; + + /* + * Give out warnings when a server has HTTPS configured + * for the HTTP port or vice versa + */ + for (s = base_server; s; s = s->next) { + sc = mySrvConfig(s); + + if (sc->enabled && (s->port == DEFAULT_HTTP_PORT)) { + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, + base_server, + "Init: (%s) You configured HTTPS(%d) " + "on the standard HTTP(%d) port!", + ssl_util_vhostid(p, s), + DEFAULT_HTTPS_PORT, DEFAULT_HTTP_PORT); + } + + if (!sc->enabled && (s->port == DEFAULT_HTTPS_PORT)) { + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, + base_server, + "Init: (%s) You configured HTTP(%d) " + "on the standard HTTPS(%d) port!", + ssl_util_vhostid(p, s), + DEFAULT_HTTP_PORT, DEFAULT_HTTPS_PORT); + } + } + + /* + * Give out warnings when more than one SSL-aware virtual server uses the + * same IP:port. This doesn't work because mod_ssl then will always use + * just the certificate/keys of one virtual host (which one cannot be said + * easily - but that doesn't matter here). + */ + table = apr_hash_make(p); + + for (s = base_server; s; s = s->next) { + sc = mySrvConfig(s); + + if (!(sc->enabled && s->addrs)) { + continue; + } + + key = apr_psprintf(p, "%pA:%u", + &s->addrs->host_addr, s->addrs->host_port); + klen = strlen(key); + + if ((ps = (server_rec *)apr_hash_get(table, key, klen))) { + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, + base_server, + "Init: SSL server IP/port conflict: " + "%s (%s:%d) vs. %s (%s:%d)", + ssl_util_vhostid(p, s), + (s->defn_name ? s->defn_name : "unknown"), + s->defn_line_number, + ssl_util_vhostid(p, ps), + (ps->defn_name ? ps->defn_name : "unknown"), + ps->defn_line_number); + conflict = TRUE; + continue; + } + + apr_hash_set(table, key, klen, s); + } + + if (conflict) { + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, base_server, + "Init: You should not use name-based " + "virtual hosts in conjunction with SSL!!"); + } +} + +#ifdef SSLC_VERSION_NUMBER +static int ssl_init_FindCAList_X509NameCmp(char **a, char **b) +{ + return(X509_NAME_cmp((void*)*a, (void*)*b)); +} +#else +static int ssl_init_FindCAList_X509NameCmp(X509_NAME **a, X509_NAME **b) +{ + return(X509_NAME_cmp(*a, *b)); +} +#endif + +static void ssl_init_PushCAList(STACK_OF(X509_NAME) *ca_list, + server_rec *s, const char *file) +{ + int n; + STACK_OF(X509_NAME) *sk; + + sk = (STACK_OF(X509_NAME) *) + SSL_load_client_CA_file(MODSSL_PCHAR_CAST file); + + if (!sk) { + return; + } + + for (n = 0; n < sk_X509_NAME_num(sk); n++) { + char name_buf[256]; + X509_NAME *name = sk_X509_NAME_value(sk, n); + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "CA certificate: %s", + X509_NAME_oneline(name, name_buf, sizeof(name_buf))); + + /* + * note that SSL_load_client_CA_file() checks for duplicates, + * but since we call it multiple times when reading a directory + * we must also check for duplicates ourselves. + */ + + if (sk_X509_NAME_find(ca_list, name) < 0) { + /* this will be freed when ca_list is */ + sk_X509_NAME_push(ca_list, name); + } + else { + /* need to free this ourselves, else it will leak */ + X509_NAME_free(name); + } + } + + sk_X509_NAME_free(sk); +} + +STACK_OF(X509_NAME) *ssl_init_FindCAList(server_rec *s, + apr_pool_t *ptemp, + const char *ca_file, + const char *ca_path) +{ + STACK_OF(X509_NAME) *ca_list; + + /* + * Start with a empty stack/list where new + * entries get added in sorted order. + */ + ca_list = sk_X509_NAME_new(ssl_init_FindCAList_X509NameCmp); + + /* + * Process CA certificate bundle file + */ + if (ca_file) { + ssl_init_PushCAList(ca_list, s, ca_file); + } + + /* + * Process CA certificate path files + */ + if (ca_path) { + apr_dir_t *dir; + apr_finfo_t direntry; + apr_int32_t finfo_flags = APR_FINFO_TYPE|APR_FINFO_NAME; + apr_status_t rv; + + if ((rv = apr_dir_open(&dir, ca_path, ptemp)) != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, s, + "Failed to open SSLCACertificatePath `%s'", + ca_path); + ssl_die(); + } + + while ((apr_dir_read(&direntry, finfo_flags, dir)) == APR_SUCCESS) { + const char *file; + if (direntry.filetype == APR_DIR) { + continue; /* don't try to load directories */ + } + file = apr_pstrcat(ptemp, ca_path, "/", direntry.name, NULL); + ssl_init_PushCAList(ca_list, s, file); + } + + apr_dir_close(dir); + } + + /* + * Cleanup + */ + sk_X509_NAME_set_cmp_func(ca_list, NULL); + + return ca_list; +} + +void ssl_init_Child(apr_pool_t *p, server_rec *s) +{ + SSLModConfigRec *mc = myModConfig(s); + mc->pid = getpid(); /* only call getpid() once per-process */ + + /* XXX: there should be an ap_srand() function */ + srand((unsigned int)time(NULL)); + + /* open the mutex lockfile */ + ssl_mutex_reinit(s, p); +} + +#define MODSSL_CFG_ITEM_FREE(func, item) \ + if (item) { \ + func(item); \ + item = NULL; \ + } + +static void ssl_init_ctx_cleanup(modssl_ctx_t *mctx) +{ + MODSSL_CFG_ITEM_FREE(X509_STORE_free, mctx->crl); + + MODSSL_CFG_ITEM_FREE(SSL_CTX_free, mctx->ssl_ctx); +} + +static void ssl_init_ctx_cleanup_proxy(modssl_ctx_t *mctx) +{ + ssl_init_ctx_cleanup(mctx); + + if (mctx->pkp->certs) { + sk_X509_INFO_pop_free(mctx->pkp->certs, X509_INFO_free); + } +} + +static void ssl_init_ctx_cleanup_server(modssl_ctx_t *mctx) +{ + int i; + + ssl_init_ctx_cleanup(mctx); + + for (i=0; i < SSL_AIDX_MAX; i++) { + MODSSL_CFG_ITEM_FREE(X509_free, + mctx->pks->certs[i]); + + MODSSL_CFG_ITEM_FREE(EVP_PKEY_free, + mctx->pks->keys[i]); + } +} + +apr_status_t ssl_init_ModuleKill(void *data) +{ + SSLSrvConfigRec *sc; + server_rec *base_server = (server_rec *)data; + server_rec *s; + + /* + * Drop the session cache and mutex + */ + ssl_scache_kill(base_server); + + /* + * Destroy the temporary keys and params + */ + ssl_tmp_keys_free(base_server); + + /* + * Free the non-pool allocated structures + * in the per-server configurations + */ + for (s = base_server; s; s = s->next) { + sc = mySrvConfig(s); + + ssl_init_ctx_cleanup_proxy(sc->proxy); + + ssl_init_ctx_cleanup_server(sc->server); + } + + /* + * Try to kill the internals of the SSL library. + */ + ERR_remove_state(0); + EVP_cleanup(); + + return APR_SUCCESS; +} + diff --git a/rubbos/app/httpd-2.0.64/modules/ssl/ssl_engine_io.c b/rubbos/app/httpd-2.0.64/modules/ssl/ssl_engine_io.c new file mode 100644 index 00000000..c5fe6b8c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/ssl/ssl_engine_io.c @@ -0,0 +1,1746 @@ +/* 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. + */ + +/* _ _ + * _ __ ___ ___ __| | ___ ___| | mod_ssl + * | '_ ` _ \ / _ \ / _` | / __/ __| | Apache Interface to OpenSSL + * | | | | | | (_) | (_| | \__ \__ \ | + * |_| |_| |_|\___/ \__,_|___|___/___/_| + * |_____| + * ssl_engine_io.c + * I/O Functions + */ + /* ``MY HACK: This universe. + Just one little problem: + core keeps dumping.'' + -- Unknown */ +#include "mod_ssl.h" + +/* _________________________________________________________________ +** +** I/O Hooks +** _________________________________________________________________ +*/ + +/* This file is designed to be the bridge between OpenSSL and httpd. + * However, we really don't expect anyone (let alone ourselves) to + * remember what is in this file. So, first, a quick overview. + * + * In this file, you will find: + * - ssl_io_filter_input (Apache input filter) + * - ssl_io_filter_output (Apache output filter) + * + * - bio_filter_in_* (OpenSSL input filter) + * - bio_filter_out_* (OpenSSL output filter) + * + * The input chain is roughly: + * + * ssl_io_filter_input->ssl_io_input_read->SSL_read->... + * ...->bio_filter_in_read->ap_get_brigade/next-httpd-filter + * + * In mortal terminology, we do the following: + * - Receive a request for data to the SSL input filter + * - Call a helper function once we know we should perform a read + * - Call OpenSSL's SSL_read() + * - SSL_read() will then call bio_filter_in_read + * - bio_filter_in_read will then try to fetch data from the next httpd filter + * - bio_filter_in_read will flatten that data and return it to SSL_read + * - SSL_read will then decrypt the data + * - ssl_io_input_read will then receive decrypted data as a char* and + * ensure that there were no read errors + * - The char* is placed in a brigade and returned + * + * Since connection-level input filters in httpd need to be able to + * handle AP_MODE_GETLINE calls (namely identifying LF-terminated strings), + * ssl_io_input_getline which will handle this special case. + * + * Due to AP_MODE_GETLINE and AP_MODE_SPECULATIVE, we may sometimes have + * 'leftover' decoded data which must be setaside for the next read. That + * is currently handled by the char_buffer_{read|write} functions. So, + * ssl_io_input_read may be able to fulfill reads without invoking + * SSL_read(). + * + * Note that the filter context of ssl_io_filter_input and bio_filter_in_* + * are shared as bio_filter_in_ctx_t. + * + * Note that the filter is by choice limited to reading at most + * AP_IOBUFSIZE (8192 bytes) per call. + * + */ + +/* this custom BIO allows us to hook SSL_write directly into + * an apr_bucket_brigade and use transient buckets with the SSL + * malloc-ed buffer, rather than copying into a mem BIO. + * also allows us to pass the brigade as data is being written + * rather than buffering up the entire response in the mem BIO. + * + * when SSL needs to flush (e.g. SSL_accept()), it will call BIO_flush() + * which will trigger a call to bio_filter_out_ctrl() -> bio_filter_out_flush(). + * so we only need to flush the output ourselves if we receive an + * EOS or FLUSH bucket. this was not possible with the mem BIO where we + * had to flush all over the place not really knowing when it was required + * to do so. + */ + +typedef struct { + SSL *pssl; + BIO *pbioRead; + BIO *pbioWrite; + ap_filter_t *pInputFilter; + ap_filter_t *pOutputFilter; + int nobuffer; /* non-zero to prevent buffering */ + SSLConnRec *config; +} ssl_filter_ctx_t; + +typedef struct { + ssl_filter_ctx_t *filter_ctx; + conn_rec *c; + apr_bucket_brigade *bb; + apr_size_t length; + char buffer[AP_IOBUFSIZE]; + apr_size_t blen; + apr_status_t rc; +} bio_filter_out_ctx_t; + +static bio_filter_out_ctx_t *bio_filter_out_ctx_new(ssl_filter_ctx_t *filter_ctx, + conn_rec *c) +{ + bio_filter_out_ctx_t *outctx = apr_palloc(c->pool, sizeof(*outctx)); + + outctx->filter_ctx = filter_ctx; + outctx->c = c; + outctx->bb = apr_brigade_create(c->pool, c->bucket_alloc); + outctx->blen = 0; + outctx->length = 0; + + return outctx; +} + +static int bio_filter_out_flush(BIO *bio) +{ + bio_filter_out_ctx_t *outctx = (bio_filter_out_ctx_t *)(bio->ptr); + apr_bucket *e; + + if (!(outctx->blen || outctx->length)) { + outctx->rc = APR_SUCCESS; + return 1; + } + + if (outctx->blen) { + e = apr_bucket_transient_create(outctx->buffer, outctx->blen, + outctx->bb->bucket_alloc); + /* we filled this buffer first so add it to the + * head of the brigade + */ + APR_BRIGADE_INSERT_HEAD(outctx->bb, e); + outctx->blen = 0; + } + + outctx->length = 0; + e = apr_bucket_flush_create(outctx->bb->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(outctx->bb, e); + + outctx->rc = ap_pass_brigade(outctx->filter_ctx->pOutputFilter->next, + outctx->bb); + /* Fail if the connection was reset: */ + if (outctx->rc == APR_SUCCESS && outctx->c->aborted) { + outctx->rc = APR_ECONNRESET; + } + return (outctx->rc == APR_SUCCESS) ? 1 : -1; +} + +static int bio_filter_create(BIO *bio) +{ + bio->shutdown = 1; + bio->init = 1; + bio->num = -1; + bio->ptr = NULL; + + return 1; +} + +static int bio_filter_destroy(BIO *bio) +{ + if (bio == NULL) { + return 0; + } + + /* nothing to free here. + * apache will destroy the bucket brigade for us + */ + return 1; +} + +static int bio_filter_out_read(BIO *bio, char *out, int outl) +{ + /* this is never called */ + return -1; +} + +static int bio_filter_out_write(BIO *bio, const char *in, int inl) +{ + bio_filter_out_ctx_t *outctx = (bio_filter_out_ctx_t *)(bio->ptr); + + /* Abort early if the client has initiated a renegotiation. */ + if (outctx->filter_ctx->config->reneg_state == RENEG_ABORT) { + outctx->rc = APR_ECONNABORTED; + return -1; + } + + /* when handshaking we'll have a small number of bytes. + * max size SSL will pass us here is about 16k. + * (16413 bytes to be exact) + */ + BIO_clear_retry_flags(bio); + + if (!outctx->length && (inl + outctx->blen < sizeof(outctx->buffer)) && + !outctx->filter_ctx->nobuffer) { + /* the first two SSL_writes (of 1024 and 261 bytes) + * need to be in the same packet (vec[0].iov_base) + */ + /* XXX: could use apr_brigade_write() to make code look cleaner + * but this way we avoid the malloc(APR_BUCKET_BUFF_SIZE) + * and free() of it later + */ + memcpy(&outctx->buffer[outctx->blen], in, inl); + outctx->blen += inl; + } + else { + /* pass along the encrypted data + * need to flush since we're using SSL's malloc-ed buffer + * which will be overwritten once we leave here + */ + apr_bucket *bucket = apr_bucket_transient_create(in, inl, + outctx->bb->bucket_alloc); + + outctx->length += inl; + APR_BRIGADE_INSERT_TAIL(outctx->bb, bucket); + + if (bio_filter_out_flush(bio) < 0) { + return -1; + } + } + + return inl; +} + +static long bio_filter_out_ctrl(BIO *bio, int cmd, long num, void *ptr) +{ + long ret = 1; + char **pptr; + + bio_filter_out_ctx_t *outctx = (bio_filter_out_ctx_t *)(bio->ptr); + + switch (cmd) { + case BIO_CTRL_RESET: + outctx->blen = outctx->length = 0; + break; + case BIO_CTRL_EOF: + ret = (long)((outctx->blen + outctx->length) == 0); + break; + case BIO_C_SET_BUF_MEM_EOF_RETURN: + outctx->blen = outctx->length = (apr_size_t)num; + break; + case BIO_CTRL_INFO: + ret = (long)(outctx->blen + outctx->length); + if (ptr) { + pptr = (char **)ptr; + *pptr = (char *)&(outctx->buffer[0]); + } + break; + case BIO_CTRL_GET_CLOSE: + ret = (long)bio->shutdown; + break; + case BIO_CTRL_SET_CLOSE: + bio->shutdown = (int)num; + break; + case BIO_CTRL_WPENDING: + ret = 0L; + break; + case BIO_CTRL_PENDING: + ret = (long)(outctx->blen + outctx->length); + break; + case BIO_CTRL_FLUSH: + ret = bio_filter_out_flush(bio); + break; + case BIO_CTRL_DUP: + ret = 1; + break; + /* N/A */ + case BIO_C_SET_BUF_MEM: + case BIO_C_GET_BUF_MEM_PTR: + /* we don't care */ + case BIO_CTRL_PUSH: + case BIO_CTRL_POP: + default: + ret = 0; + break; + } + + return ret; +} + +static int bio_filter_out_gets(BIO *bio, char *buf, int size) +{ + /* this is never called */ + return -1; +} + +static int bio_filter_out_puts(BIO *bio, const char *str) +{ + /* this is never called */ + return -1; +} + +static BIO_METHOD bio_filter_out_method = { + BIO_TYPE_MEM, + "APR output filter", + bio_filter_out_write, + bio_filter_out_read, /* read is never called */ + bio_filter_out_puts, /* puts is never called */ + bio_filter_out_gets, /* gets is never called */ + bio_filter_out_ctrl, + bio_filter_create, + bio_filter_destroy, +#ifdef OPENSSL_VERSION_NUMBER + NULL /* sslc does not have the callback_ctrl field */ +#endif +}; + +typedef struct { + int length; + char *value; +} char_buffer_t; + +typedef struct { + SSL *ssl; + BIO *bio_out; + ap_filter_t *f; + apr_status_t rc; + ap_input_mode_t mode; + apr_read_type_e block; + apr_bucket_brigade *bb; + char_buffer_t cbuf; + apr_pool_t *pool; + char buffer[AP_IOBUFSIZE]; + ssl_filter_ctx_t *filter_ctx; +} bio_filter_in_ctx_t; + +/* + * this char_buffer api might seem silly, but we don't need to copy + * any of this data and we need to remember the length. + */ + +/* Copy up to INL bytes from the char_buffer BUFFER into IN. Note + * that due to the strange way this API is designed/used, the + * char_buffer object is used to cache a segment of inctx->buffer, and + * then this function called to copy (part of) that segment to the + * beginning of inctx->buffer. So the segments to copy cannot be + * presumed to be non-overlapping, and memmove must be used. */ +static int char_buffer_read(char_buffer_t *buffer, char *in, int inl) +{ + if (!buffer->length) { + return 0; + } + + if (buffer->length > inl) { + /* we have have enough to fill the caller's buffer */ + memmove(in, buffer->value, inl); + buffer->value += inl; + buffer->length -= inl; + } + else { + /* swallow remainder of the buffer */ + memmove(in, buffer->value, buffer->length); + inl = buffer->length; + buffer->value = NULL; + buffer->length = 0; + } + + return inl; +} + +static int char_buffer_write(char_buffer_t *buffer, char *in, int inl) +{ + buffer->value = in; + buffer->length = inl; + return inl; +} + +/* This function will read from a brigade and discard the read buckets as it + * proceeds. It will read at most *len bytes. + */ +static apr_status_t brigade_consume(apr_bucket_brigade *bb, + apr_read_type_e block, + char *c, apr_size_t *len) +{ + apr_size_t actual = 0; + apr_status_t status = APR_SUCCESS; + + while (!APR_BRIGADE_EMPTY(bb)) { + apr_bucket *b = APR_BRIGADE_FIRST(bb); + const char *str; + apr_size_t str_len; + apr_size_t consume; + + /* Justin points out this is an http-ism that might + * not fit if brigade_consume is added to APR. Perhaps + * apr_bucket_read(eos_bucket) should return APR_EOF? + * Then this becomes mainline instead of a one-off. + */ + if (APR_BUCKET_IS_EOS(b)) { + status = APR_EOF; + break; + } + + /* The reason I'm not offering brigade_consume yet + * across to apr-util is that the following call + * illustrates how borked that API really is. For + * this sort of case (caller provided buffer) it + * would be much more trivial for apr_bucket_consume + * to do all the work that follows, based on the + * particular characteristics of the bucket we are + * consuming here. + */ + status = apr_bucket_read(b, &str, &str_len, block); + + if (status != APR_SUCCESS) { + if (APR_STATUS_IS_EOF(status)) { + /* This stream bucket was consumed */ + apr_bucket_delete(b); + continue; + } + break; + } + + if (str_len > 0) { + /* Do not block once some data has been consumed */ + block = APR_NONBLOCK_READ; + + /* Assure we don't overflow. */ + consume = (str_len + actual > *len) ? *len - actual : str_len; + + memcpy(c, str, consume); + + c += consume; + actual += consume; + + if (consume >= b->length) { + /* This physical bucket was consumed */ + apr_bucket_delete(b); + } + else { + /* Only part of this physical bucket was consumed */ + b->start += consume; + b->length -= consume; + } + } + else if (b->length == 0) { + apr_bucket_delete(b); + } + + /* This could probably be actual == *len, but be safe from stray + * photons. */ + if (actual >= *len) { + break; + } + } + + *len = actual; + return status; +} + +/* + * this is the function called by SSL_read() + */ +static int bio_filter_in_read(BIO *bio, char *in, int inlen) +{ + apr_size_t inl = inlen; + bio_filter_in_ctx_t *inctx = (bio_filter_in_ctx_t *)(bio->ptr); + apr_read_type_e block = inctx->block; + SSLConnRec *sslconn = myConnConfig(inctx->f->c); + + inctx->rc = APR_SUCCESS; + + /* OpenSSL catches this case, so should we. */ + if (!in) + return 0; + + /* Abort early if the client has initiated a renegotiation. */ + if (inctx->filter_ctx->config->reneg_state == RENEG_ABORT) { + inctx->rc = APR_ECONNABORTED; + return -1; + } + + /* XXX: flush here only required for SSLv2; + * OpenSSL calls BIO_flush() at the appropriate times for + * the other protocols. + */ + if ((SSL_version(inctx->ssl) == SSL2_VERSION) || sslconn->is_proxy) { + if (bio_filter_out_flush(inctx->bio_out) < 0) { + bio_filter_out_ctx_t *outctx = + (bio_filter_out_ctx_t *)(inctx->bio_out->ptr); + inctx->rc = outctx->rc; + return -1; + } + } + + BIO_clear_retry_flags(bio); + + if (!inctx->bb) { + inctx->rc = APR_EOF; + return -1; + } + + if (APR_BRIGADE_EMPTY(inctx->bb)) { + + inctx->rc = ap_get_brigade(inctx->f->next, inctx->bb, + AP_MODE_READBYTES, block, + inl); + + /* Not a problem, there was simply no data ready yet. + */ + if (APR_STATUS_IS_EAGAIN(inctx->rc) || APR_STATUS_IS_EINTR(inctx->rc) + || (inctx->rc == APR_SUCCESS && APR_BRIGADE_EMPTY(inctx->bb))) { + BIO_set_retry_read(bio); + return 0; + } + + if (inctx->rc != APR_SUCCESS) { + /* Unexpected errors discard the brigade */ + apr_brigade_cleanup(inctx->bb); + inctx->bb = NULL; + return -1; + } + } + + inctx->rc = brigade_consume(inctx->bb, block, in, &inl); + + if (inctx->rc == APR_SUCCESS) { + return (int)inl; + } + + if (APR_STATUS_IS_EAGAIN(inctx->rc) + || APR_STATUS_IS_EINTR(inctx->rc)) { + BIO_set_retry_read(bio); + return (int)inl; + } + + /* Unexpected errors and APR_EOF clean out the brigade. + * Subsequent calls will return APR_EOF. + */ + apr_brigade_cleanup(inctx->bb); + inctx->bb = NULL; + + if (APR_STATUS_IS_EOF(inctx->rc) && inl) { + /* Provide the results of this read pass, + * without resetting the BIO retry_read flag + */ + return (int)inl; + } + + return -1; +} + + +static BIO_METHOD bio_filter_in_method = { + BIO_TYPE_MEM, + "APR input filter", + NULL, /* write is never called */ + bio_filter_in_read, + NULL, /* puts is never called */ + NULL, /* gets is never called */ + NULL, /* ctrl is never called */ + bio_filter_create, + bio_filter_destroy, +#ifdef OPENSSL_VERSION_NUMBER + NULL /* sslc does not have the callback_ctrl field */ +#endif +}; + + +static apr_status_t ssl_io_input_read(bio_filter_in_ctx_t *inctx, + char *buf, + apr_size_t *len) +{ + apr_size_t wanted = *len; + apr_size_t bytes = 0; + int rc; + + *len = 0; + + /* If we have something leftover from last time, try that first. */ + if ((bytes = char_buffer_read(&inctx->cbuf, buf, wanted))) { + *len = bytes; + if (inctx->mode == AP_MODE_SPECULATIVE) { + /* We want to rollback this read. */ + if (inctx->cbuf.length > 0) { + inctx->cbuf.value -= bytes; + inctx->cbuf.length += bytes; + } else { + char_buffer_write(&inctx->cbuf, buf, (int)bytes); + } + return APR_SUCCESS; + } + /* This could probably be *len == wanted, but be safe from stray + * photons. + */ + if (*len >= wanted) { + return APR_SUCCESS; + } + if (inctx->mode == AP_MODE_GETLINE) { + if (memchr(buf, APR_ASCII_LF, *len)) { + return APR_SUCCESS; + } + } + else { + /* Down to a nonblock pattern as we have some data already + */ + inctx->block = APR_NONBLOCK_READ; + } + } + + while (1) { + + if (!inctx->filter_ctx->pssl) { + /* Ensure a non-zero error code is returned */ + if (inctx->rc == APR_SUCCESS) { + inctx->rc = APR_EGENERAL; + } + break; + } + + /* SSL_read may not read because we haven't taken enough data + * from the stack. This is where we want to consider all of + * the blocking and SPECULATIVE semantics + */ + rc = SSL_read(inctx->filter_ctx->pssl, buf + bytes, wanted - bytes); + + if (rc > 0) { + *len += rc; + if (inctx->mode == AP_MODE_SPECULATIVE) { + /* We want to rollback this read. */ + char_buffer_write(&inctx->cbuf, buf, rc); + } + return inctx->rc; + } + else if (rc == 0) { + /* If EAGAIN, we will loop given a blocking read, + * otherwise consider ourselves at EOF. + */ + if (APR_STATUS_IS_EAGAIN(inctx->rc) + || APR_STATUS_IS_EINTR(inctx->rc)) { + /* Already read something, return APR_SUCCESS instead. + * On win32 in particular, but perhaps on other kernels, + * a blocking call isn't 'always' blocking. + */ + if (*len > 0) { + inctx->rc = APR_SUCCESS; + break; + } + if (inctx->block == APR_NONBLOCK_READ) { + break; + } + } + else { + if (*len > 0) { + inctx->rc = APR_SUCCESS; + } + else { + inctx->rc = APR_EOF; + } + break; + } + } + else /* (rc < 0) */ { + int ssl_err = SSL_get_error(inctx->filter_ctx->pssl, rc); + conn_rec *c = (conn_rec*)SSL_get_app_data(inctx->filter_ctx->pssl); + + if (ssl_err == SSL_ERROR_WANT_READ) { + /* + * If OpenSSL wants to read more, and we were nonblocking, + * report as an EAGAIN. Otherwise loop, pulling more + * data from network filter. + * + * (This is usually the case when the client forces an SSL + * renegotation which is handled implicitly by OpenSSL.) + */ + inctx->rc = APR_EAGAIN; + + if (*len > 0) { + inctx->rc = APR_SUCCESS; + break; + } + if (inctx->block == APR_NONBLOCK_READ) { + break; + } + continue; /* Blocking and nothing yet? Try again. */ + } + else if (ssl_err == SSL_ERROR_SYSCALL) { + if (APR_STATUS_IS_EAGAIN(inctx->rc) + || APR_STATUS_IS_EINTR(inctx->rc)) { + /* Already read something, return APR_SUCCESS instead. */ + if (*len > 0) { + inctx->rc = APR_SUCCESS; + break; + } + if (inctx->block == APR_NONBLOCK_READ) { + break; + } + continue; /* Blocking and nothing yet? Try again. */ + } + else { + ap_log_error(APLOG_MARK, APLOG_INFO, inctx->rc, c->base_server, + "SSL input filter read failed."); + } + } + else /* if (ssl_err == SSL_ERROR_SSL) */ { + /* + * Log SSL errors and any unexpected conditions. + */ + ap_log_error(APLOG_MARK, APLOG_INFO, inctx->rc, c->base_server, + "SSL library error %d reading data", ssl_err); + ssl_log_ssl_error(APLOG_MARK, APLOG_INFO, c->base_server); + + } + if (inctx->rc == APR_SUCCESS) { + inctx->rc = APR_EGENERAL; + } + break; + } + } + return inctx->rc; +} + +static apr_status_t ssl_io_input_getline(bio_filter_in_ctx_t *inctx, + char *buf, + apr_size_t *len) +{ + const char *pos = NULL; + apr_status_t status; + apr_size_t tmplen = *len, buflen = *len, offset = 0; + + *len = 0; + + /* + * in most cases we get all the headers on the first SSL_read. + * however, in certain cases SSL_read will only get a partial + * chunk of the headers, so we try to read until LF is seen. + */ + + while (tmplen > 0) { + status = ssl_io_input_read(inctx, buf + offset, &tmplen); + + if (status != APR_SUCCESS) { + return status; + } + + *len += tmplen; + + if ((pos = memchr(buf, APR_ASCII_LF, *len))) { + break; + } + + offset += tmplen; + tmplen = buflen - offset; + } + + if (pos) { + char *value; + int length; + apr_size_t bytes = pos - buf; + + bytes += 1; + value = buf + bytes; + length = *len - bytes; + + char_buffer_write(&inctx->cbuf, value, length); + + *len = bytes; + } + + return APR_SUCCESS; +} + + +static apr_status_t ssl_filter_write(ap_filter_t *f, + const char *data, + apr_size_t len) +{ + ssl_filter_ctx_t *filter_ctx = f->ctx; + bio_filter_out_ctx_t *outctx; + int res; + + /* write SSL */ + if (filter_ctx->pssl == NULL) { + return APR_EGENERAL; + } + + outctx = (bio_filter_out_ctx_t *)filter_ctx->pbioWrite->ptr; + res = SSL_write(filter_ctx->pssl, (unsigned char *)data, len); + + if (res < 0) { + int ssl_err = SSL_get_error(filter_ctx->pssl, res); + conn_rec *c = (conn_rec*)SSL_get_app_data(outctx->filter_ctx->pssl); + + if (ssl_err == SSL_ERROR_WANT_WRITE) { + /* + * If OpenSSL wants to write more, and we were nonblocking, + * report as an EAGAIN. Otherwise loop, pushing more + * data at the network filter. + * + * (This is usually the case when the client forces an SSL + * renegotation which is handled implicitly by OpenSSL.) + */ + outctx->rc = APR_EAGAIN; + } + else if (ssl_err == SSL_ERROR_SYSCALL) { + ap_log_error(APLOG_MARK, APLOG_INFO, outctx->rc, c->base_server, + "SSL output filter write failed."); + } + else /* if (ssl_err == SSL_ERROR_SSL) */ { + /* + * Log SSL errors + */ + ap_log_error(APLOG_MARK, APLOG_INFO, outctx->rc, c->base_server, + "SSL library error %d writing data", ssl_err); + ssl_log_ssl_error(APLOG_MARK, APLOG_INFO, c->base_server); + } + if (outctx->rc == APR_SUCCESS) { + outctx->rc = APR_EGENERAL; + } + } + else if ((apr_size_t)res != len) { + conn_rec *c = f->c; + char *reason = "reason unknown"; + + /* XXX: probably a better way to determine this */ + if (SSL_total_renegotiations(filter_ctx->pssl)) { + reason = "likely due to failed renegotiation"; + } + + ap_log_error(APLOG_MARK, APLOG_INFO, outctx->rc, c->base_server, + "failed to write %d of %d bytes (%s)", + len - (apr_size_t)res, len, reason); + + outctx->rc = APR_EGENERAL; + } + return outctx->rc; +} + +/* Just use a simple request. Any request will work for this, because + * we use a flag in the conn_rec->conn_vector now. The fake request just + * gets the request back to the Apache core so that a response can be sent. + * + * To avoid calling back for more data from the socket, use an HTTP/0.9 + * request, and tack on an EOS bucket. + */ +#define HTTP_ON_HTTPS_PORT \ + "GET /" CRLF + +#define HTTP_ON_HTTPS_PORT_BUCKET(alloc) \ + apr_bucket_immortal_create(HTTP_ON_HTTPS_PORT, \ + sizeof(HTTP_ON_HTTPS_PORT) - 1, \ + alloc) + +static void ssl_io_filter_disable(SSLConnRec *sslconn, ap_filter_t *f) +{ + bio_filter_in_ctx_t *inctx = f->ctx; + SSL_free(inctx->ssl); + sslconn->ssl = NULL; + inctx->ssl = NULL; + inctx->filter_ctx->pssl = NULL; +} + +static apr_status_t ssl_io_filter_error(ap_filter_t *f, + apr_bucket_brigade *bb, + apr_status_t status) +{ + SSLConnRec *sslconn = myConnConfig(f->c); + apr_bucket *bucket; + + switch (status) { + case HTTP_BAD_REQUEST: + /* log the situation */ + ap_log_error(APLOG_MARK, APLOG_INFO, 0, + f->c->base_server, + "SSL handshake failed: HTTP spoken on HTTPS port; " + "trying to send HTML error page"); + ssl_log_ssl_error(APLOG_MARK, APLOG_INFO, f->c->base_server); + + sslconn->non_ssl_request = 1; + ssl_io_filter_disable(sslconn, f); + + /* fake the request line */ + bucket = HTTP_ON_HTTPS_PORT_BUCKET(f->c->bucket_alloc); + break; + + default: + return status; + } + + APR_BRIGADE_INSERT_TAIL(bb, bucket); + bucket = apr_bucket_eos_create(f->c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, bucket); + + return APR_SUCCESS; +} + +static const char ssl_io_filter[] = "SSL/TLS Filter"; +static const char ssl_io_buffer[] = "SSL/TLS Buffer"; + +/* + * Close the SSL part of the socket connection + * (called immediately _before_ the socket is closed) + * or called with + */ +static apr_status_t ssl_filter_io_shutdown(ssl_filter_ctx_t *filter_ctx, + conn_rec *c, + int abortive) +{ + SSL *ssl = filter_ctx->pssl; + const char *type = ""; + SSLConnRec *sslconn = myConnConfig(c); + int shutdown_type; + + if (!ssl) { + return APR_SUCCESS; + } + + /* + * Now close the SSL layer of the connection. We've to take + * the TLSv1 standard into account here: + * + * | 7.2.1. Closure alerts + * | + * | The client and the server must share knowledge that the connection is + * | ending in order to avoid a truncation attack. Either party may + * | initiate the exchange of closing messages. + * | + * | close_notify + * | This message notifies the recipient that the sender will not send + * | any more messages on this connection. The session becomes + * | unresumable if any connection is terminated without proper + * | close_notify messages with level equal to warning. + * | + * | Either party may initiate a close by sending a close_notify alert. + * | Any data received after a closure alert is ignored. + * | + * | Each party is required to send a close_notify alert before closing + * | the write side of the connection. It is required that the other party + * | respond with a close_notify alert of its own and close down the + * | connection immediately, discarding any pending writes. It is not + * | required for the initiator of the close to wait for the responding + * | close_notify alert before closing the read side of the connection. + * + * This means we've to send a close notify message, but haven't to wait + * for the close notify of the client. Actually we cannot wait for the + * close notify of the client because some clients (including Netscape + * 4.x) don't send one, so we would hang. + */ + + /* + * exchange close notify messages, but allow the user + * to force the type of handshake via SetEnvIf directive + */ + if (abortive) { + shutdown_type = SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN; + type = "abortive"; + } + else switch (sslconn->shutdown_type) { + case SSL_SHUTDOWN_TYPE_UNCLEAN: + /* perform no close notify handshake at all + (violates the SSL/TLS standard!) */ + shutdown_type = SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN; + type = "unclean"; + break; + case SSL_SHUTDOWN_TYPE_ACCURATE: + /* send close notify and wait for clients close notify + (standard compliant, but usually causes connection hangs) */ + shutdown_type = 0; + type = "accurate"; + break; + default: + /* + * case SSL_SHUTDOWN_TYPE_UNSET: + * case SSL_SHUTDOWN_TYPE_STANDARD: + */ + /* send close notify, but don't wait for clients close notify + (standard compliant and safe, so it's the DEFAULT!) */ + shutdown_type = SSL_RECEIVED_SHUTDOWN; + type = "standard"; + break; + } + + SSL_set_shutdown(ssl, shutdown_type); + SSL_smart_shutdown(ssl); + + /* and finally log the fact that we've closed the connection */ + if (c->base_server->loglevel >= APLOG_INFO) { + ap_log_error(APLOG_MARK, APLOG_INFO, 0, c->base_server, + "Connection to child %ld closed with %s shutdown" + "(server %s, client %s)", + c->id, type, + ssl_util_vhostid(c->pool, c->base_server), + c->remote_ip ? c->remote_ip : "unknown"); + } + + /* deallocate the SSL connection */ + if (sslconn->client_cert) { + X509_free(sslconn->client_cert); + sslconn->client_cert = NULL; + } + SSL_free(ssl); + sslconn->ssl = NULL; + filter_ctx->pssl = NULL; /* so filters know we've been shutdown */ + + if (abortive) { + /* prevent any further I/O */ + c->aborted = 1; + } + + return APR_SUCCESS; +} + +static apr_status_t ssl_io_filter_cleanup(void *data) +{ + ssl_filter_ctx_t *filter_ctx = data; + + if (filter_ctx->pssl) { + conn_rec *c = (conn_rec *)SSL_get_app_data(filter_ctx->pssl); + SSLConnRec *sslconn = myConnConfig(c); + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, NULL, + "SSL connection destroyed without being closed"); + + SSL_free(filter_ctx->pssl); + sslconn->ssl = filter_ctx->pssl = NULL; + } + + return APR_SUCCESS; +} + +/* + * The hook is NOT registered with ap_hook_process_connection. Instead, it is + * called manually from the churn () before it tries to read any data. + * There is some problem if I accept conn_rec *. Still investigating.. + * Adv. if conn_rec * can be accepted is we can hook this function using the + * ap_hook_process_connection hook. + */ +static int ssl_io_filter_connect(ssl_filter_ctx_t *filter_ctx) +{ + conn_rec *c = (conn_rec *)SSL_get_app_data(filter_ctx->pssl); + SSLConnRec *sslconn = myConnConfig(c); + SSLSrvConfigRec *sc = mySrvConfig(c->base_server); + X509 *cert; + int n; + int ssl_err; + long verify_result; + + if (SSL_is_init_finished(filter_ctx->pssl)) { + return APR_SUCCESS; + } + + if (sslconn->is_proxy) { + if ((n = SSL_connect(filter_ctx->pssl)) <= 0) { + ap_log_error(APLOG_MARK, APLOG_INFO, 0, + c->base_server, + "SSL Proxy connect failed"); + ssl_log_ssl_error(APLOG_MARK, APLOG_INFO, c->base_server); + return ssl_filter_io_shutdown(filter_ctx, c, 1); + } + + return APR_SUCCESS; + } + + if ((n = SSL_accept(filter_ctx->pssl)) <= 0) { + bio_filter_in_ctx_t *inctx = (bio_filter_in_ctx_t *) + (filter_ctx->pbioRead->ptr); + bio_filter_out_ctx_t *outctx = (bio_filter_out_ctx_t *) + (filter_ctx->pbioWrite->ptr); + apr_status_t rc = inctx->rc ? inctx->rc : outctx->rc ; + ssl_err = SSL_get_error(filter_ctx->pssl, n); + + if (ssl_err == SSL_ERROR_ZERO_RETURN) { + /* + * The case where the connection was closed before any data + * was transferred. That's not a real error and can occur + * sporadically with some clients. + */ + ap_log_error(APLOG_MARK, APLOG_INFO, rc, + c->base_server, + "SSL handshake stopped: connection was closed"); + } + else if (ssl_err == SSL_ERROR_WANT_READ) { + /* + * This is in addition to what was present earlier. It is + * borrowed from openssl_state_machine.c [mod_tls]. + * TBD. + */ + outctx->rc = APR_EAGAIN; + return SSL_ERROR_WANT_READ; + } + else if (ERR_GET_LIB(ERR_peek_error()) == ERR_LIB_SSL && + ERR_GET_REASON(ERR_peek_error()) == SSL_R_HTTP_REQUEST) { + /* + * The case where OpenSSL has recognized a HTTP request: + * This means the client speaks plain HTTP on our HTTPS port. + * ssl_io_filter_error will disable the ssl filters when it + * sees this status code. + */ + return HTTP_BAD_REQUEST; + } + else if (ssl_err == SSL_ERROR_SYSCALL) { + ap_log_error(APLOG_MARK, APLOG_INFO, rc, c->base_server, + "SSL handshake interrupted by system " + "[Hint: Stop button pressed in browser?!]"); + } + else /* if (ssl_err == SSL_ERROR_SSL) */ { + /* + * Log SSL errors and any unexpected conditions. + */ + ap_log_error(APLOG_MARK, APLOG_INFO, rc, c->base_server, + "SSL library error %d in handshake " + "(server %s, client %s)", ssl_err, + ssl_util_vhostid(c->pool, c->base_server), + c->remote_ip ? c->remote_ip : "unknown"); + ssl_log_ssl_error(APLOG_MARK, APLOG_INFO, c->base_server); + + } + if (inctx->rc == APR_SUCCESS) { + inctx->rc = APR_EGENERAL; + } + + return ssl_filter_io_shutdown(filter_ctx, c, 1); + } + + /* + * Check for failed client authentication + */ + verify_result = SSL_get_verify_result(filter_ctx->pssl); + + if ((verify_result != X509_V_OK) || + sslconn->verify_error) + { + if (ssl_verify_error_is_optional(verify_result) && + (sc->server->auth.verify_mode == SSL_CVERIFY_OPTIONAL_NO_CA)) + { + /* leaving this log message as an error for the moment, + * according to the mod_ssl docs: + * "level optional_no_ca is actually against the idea + * of authentication (but can be used to establish + * SSL test pages, etc.)" + * optional_no_ca doesn't appear to work as advertised + * in 1.x + */ + ap_log_error(APLOG_MARK, APLOG_INFO, 0, + c->base_server, + "SSL client authentication failed, " + "accepting certificate based on " + "\"SSLVerifyClient optional_no_ca\" " + "configuration"); + ssl_log_ssl_error(APLOG_MARK, APLOG_INFO, c->base_server); + } + else { + const char *error = sslconn->verify_error ? + sslconn->verify_error : + X509_verify_cert_error_string(verify_result); + + ap_log_error(APLOG_MARK, APLOG_INFO, 0, + c->base_server, + "SSL client authentication failed: %s", + error ? error : "unknown"); + ssl_log_ssl_error(APLOG_MARK, APLOG_INFO, c->base_server); + + return ssl_filter_io_shutdown(filter_ctx, c, 1); + } + } + + /* + * Remember the peer certificate's DN + */ + if ((cert = SSL_get_peer_certificate(filter_ctx->pssl))) { + if (sslconn->client_cert) { + X509_free(sslconn->client_cert); + } + sslconn->client_cert = cert; + sslconn->client_dn = NULL; + } + + /* + * Make really sure that when a peer certificate + * is required we really got one... (be paranoid) + */ + if ((sc->server->auth.verify_mode == SSL_CVERIFY_REQUIRE) && + !sslconn->client_cert) + { + ap_log_error(APLOG_MARK, APLOG_INFO, 0, c->base_server, + "No acceptable peer certificate available"); + + return ssl_filter_io_shutdown(filter_ctx, c, 1); + } + + return APR_SUCCESS; +} + +static apr_status_t ssl_io_filter_input(ap_filter_t *f, + apr_bucket_brigade *bb, + ap_input_mode_t mode, + apr_read_type_e block, + apr_off_t readbytes) +{ + apr_status_t status; + bio_filter_in_ctx_t *inctx = f->ctx; + + apr_size_t len = sizeof(inctx->buffer); + int is_init = (mode == AP_MODE_INIT); + + if (f->c->aborted) { + /* XXX: Ok, if we aborted, we ARE at the EOS. We also have + * aborted. This 'double protection' is probably redundant, + * but also effective against just about anything. + */ + apr_bucket *bucket = apr_bucket_eos_create(f->c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, bucket); + return APR_ECONNABORTED; + } + + if (!inctx->ssl) { + return ap_get_brigade(f->next, bb, mode, block, readbytes); + } + + /* XXX: we don't currently support anything other than these modes. */ + if (mode != AP_MODE_READBYTES && mode != AP_MODE_GETLINE && + mode != AP_MODE_SPECULATIVE && mode != AP_MODE_INIT) { + return APR_ENOTIMPL; + } + + inctx->mode = mode; + inctx->block = block; + + /* XXX: we could actually move ssl_io_filter_connect to an + * ap_hook_process_connection but would still need to call it for + * AP_MODE_INIT for protocols that may upgrade the connection + * rather than have SSLEngine On configured. + */ + if ((status = ssl_io_filter_connect(inctx->filter_ctx)) != APR_SUCCESS) { + return ssl_io_filter_error(f, bb, status); + } + + if (is_init) { + /* protocol module needs to handshake before sending + * data to client (e.g. NNTP or FTP) + */ + return APR_SUCCESS; + } + + if (inctx->mode == AP_MODE_READBYTES || + inctx->mode == AP_MODE_SPECULATIVE) { + /* Protected from truncation, readbytes < MAX_SIZE_T + * FIXME: No, it's *not* protected. -- jre */ + if (readbytes < len) { + len = (apr_size_t)readbytes; + } + status = ssl_io_input_read(inctx, inctx->buffer, &len); + } + else if (inctx->mode == AP_MODE_GETLINE) { + status = ssl_io_input_getline(inctx, inctx->buffer, &len); + } + else { + /* We have no idea what you are talking about, so return an error. */ + status = APR_ENOTIMPL; + } + + /* It is possible for mod_ssl's BIO to be used outside of the + * direct control of mod_ssl's input or output filter -- notably, + * when mod_ssl initiates a renegotiation. Switching the BIO mode + * back to "blocking" here ensures such operations don't fail with + * SSL_ERROR_WANT_READ. */ + inctx->block = APR_BLOCK_READ; + + /* Handle custom errors. */ + if (status != APR_SUCCESS) { + return ssl_io_filter_error(f, bb, status); + } + + /* Create a transient bucket out of the decrypted data. */ + if (len > 0) { + apr_bucket *bucket = + apr_bucket_transient_create(inctx->buffer, len, f->c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, bucket); + } + + return APR_SUCCESS; +} + +static apr_status_t ssl_io_filter_output(ap_filter_t *f, + apr_bucket_brigade *bb) +{ + apr_status_t status = APR_SUCCESS; + ssl_filter_ctx_t *filter_ctx = f->ctx; + bio_filter_in_ctx_t *inctx; + bio_filter_out_ctx_t *outctx; + apr_read_type_e rblock = APR_NONBLOCK_READ; + + if (f->c->aborted) { + apr_brigade_cleanup(bb); + return APR_ECONNABORTED; + } + + if (!filter_ctx->pssl) { + /* ssl_filter_io_shutdown was called */ + return ap_pass_brigade(f->next, bb); + } + + inctx = (bio_filter_in_ctx_t *)filter_ctx->pbioRead->ptr; + outctx = (bio_filter_out_ctx_t *)filter_ctx->pbioWrite->ptr; + + /* When we are the writer, we must initialize the inctx + * mode so that we block for any required ssl input, because + * output filtering is always nonblocking. + */ + inctx->mode = AP_MODE_READBYTES; + inctx->block = APR_BLOCK_READ; + + if ((status = ssl_io_filter_connect(filter_ctx)) != APR_SUCCESS) { + return ssl_io_filter_error(f, bb, status); + } + + while (!APR_BRIGADE_EMPTY(bb)) { + apr_bucket *bucket = APR_BRIGADE_FIRST(bb); + + /* If it is a flush or EOS, we need to pass this down. + * These types do not require translation by OpenSSL. + */ + if (APR_BUCKET_IS_EOS(bucket) || APR_BUCKET_IS_FLUSH(bucket)) { + if (bio_filter_out_flush(filter_ctx->pbioWrite) < 0) { + status = outctx->rc; + break; + } + + if (APR_BUCKET_IS_EOS(bucket)) { + /* + * By definition, nothing can come after EOS. + * which also means we can pass the rest of this brigade + * without creating a new one since it only contains the + * EOS bucket. + */ + + if ((status = ap_pass_brigade(f->next, bb)) != APR_SUCCESS) { + return status; + } + break; + } + else { + /* bio_filter_out_flush() already passed down a flush bucket + * if there was any data to be flushed. + */ + apr_bucket_delete(bucket); + } + } + else if (AP_BUCKET_IS_EOC(bucket)) { + /* The special "EOC" bucket means a shutdown is needed; + * - turn off buffering in bio_filter_out_write + * - issue the SSL_shutdown + */ + filter_ctx->nobuffer = 1; + status = ssl_filter_io_shutdown(filter_ctx, f->c, 0); + if (status != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_INFO, status, NULL, + "SSL filter error shutting down I/O"); + } + if ((status = ap_pass_brigade(f->next, bb)) != APR_SUCCESS) { + return status; + } + break; + } + else { + /* filter output */ + const char *data; + apr_size_t len; + + status = apr_bucket_read(bucket, &data, &len, rblock); + + if (APR_STATUS_IS_EAGAIN(status)) { + /* No data available: flush... */ + if (bio_filter_out_flush(filter_ctx->pbioWrite) < 0) { + status = outctx->rc; + break; + } + rblock = APR_BLOCK_READ; + continue; /* and try again with a blocking read. */ + } + + rblock = APR_NONBLOCK_READ; + + if (!APR_STATUS_IS_EOF(status) && (status != APR_SUCCESS)) { + break; + } + + status = ssl_filter_write(f, data, len); + apr_bucket_delete(bucket); + + if (status != APR_SUCCESS) { + break; + } + } + } + + return status; +} + +/* 128K maximum buffer size by default. */ +#ifndef SSL_MAX_IO_BUFFER +#define SSL_MAX_IO_BUFFER (128 * 1024) +#endif + +struct modssl_buffer_ctx { + apr_bucket_brigade *bb; + apr_pool_t *pool; +}; + +int ssl_io_buffer_fill(request_rec *r) +{ + conn_rec *c = r->connection; + struct modssl_buffer_ctx *ctx; + apr_bucket_brigade *tempb; + apr_off_t total = 0; /* total length buffered */ + int eos = 0; /* non-zero once EOS is seen */ + + /* Create the context which will be passed to the input filter; + * containing a setaside pool and a brigade which constrain the + * lifetime of the buffered data. */ + ctx = apr_palloc(r->pool, sizeof *ctx); + apr_pool_create(&ctx->pool, r->pool); + ctx->bb = apr_brigade_create(ctx->pool, c->bucket_alloc); + + /* ... and a temporary brigade. */ + tempb = apr_brigade_create(r->pool, c->bucket_alloc); + + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, "filling buffer"); + + do { + apr_status_t rv; + apr_bucket *e, *next; + + /* The request body is read from the protocol-level input + * filters; the buffering filter will reinject it from that + * level, allowing content/resource filters to run later, if + * necessary. */ + + rv = ap_get_brigade(r->proto_input_filters, tempb, AP_MODE_READBYTES, + APR_BLOCK_READ, 8192); + if (rv) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + "could not read request body for SSL buffer"); + return HTTP_INTERNAL_SERVER_ERROR; + } + + /* Iterate through the returned brigade: setaside each bucket + * into the context's pool and move it into the brigade. */ + for (e = APR_BRIGADE_FIRST(tempb); + e != APR_BRIGADE_SENTINEL(tempb) && !eos; e = next) { + const char *data; + apr_size_t len; + + next = APR_BUCKET_NEXT(e); + + if (APR_BUCKET_IS_EOS(e)) { + eos = 1; + } else if (!APR_BUCKET_IS_METADATA(e)) { + rv = apr_bucket_read(e, &data, &len, APR_BLOCK_READ); + if (rv != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + "could not read bucket for SSL buffer"); + return HTTP_INTERNAL_SERVER_ERROR; + } + total += len; + } + + rv = apr_bucket_setaside(e, ctx->pool); + if (rv != APR_SUCCESS) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + "could not setaside bucket for SSL buffer"); + return HTTP_INTERNAL_SERVER_ERROR; + } + + APR_BUCKET_REMOVE(e); + APR_BRIGADE_INSERT_TAIL(ctx->bb, e); + } + + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, + "total of %" APR_OFF_T_FMT " bytes in buffer, eos=%d", + total, eos); + + /* Fail if this exceeds the maximum buffer size. */ + if (total > SSL_MAX_IO_BUFFER) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "request body exceeds maximum size for SSL buffer"); + return HTTP_REQUEST_ENTITY_TOO_LARGE; + } + + } while (!eos); + + apr_brigade_destroy(tempb); + + /* Insert the filter which will supply the buffered data. */ + ap_add_input_filter(ssl_io_buffer, ctx, r, c); + + return 0; +} + +/* This input filter supplies the buffered request body to the caller + * from the brigade stored in f->ctx. */ +static apr_status_t ssl_io_filter_buffer(ap_filter_t *f, + apr_bucket_brigade *bb, + ap_input_mode_t mode, + apr_read_type_e block, + apr_off_t bytes) +{ + struct modssl_buffer_ctx *ctx = f->ctx; + apr_status_t rv; + + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, f->r, + "read from buffered SSL brigade, mode %d, " + "%" APR_OFF_T_FMT " bytes", + mode, bytes); + + if (mode != AP_MODE_READBYTES && mode != AP_MODE_GETLINE) { + return APR_ENOTIMPL; + } + + if (mode == AP_MODE_READBYTES) { + apr_bucket *e; + + /* Partition the buffered brigade. */ + rv = apr_brigade_partition(ctx->bb, bytes, &e); + if (rv && rv != APR_INCOMPLETE) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, f->r, + "could not partition buffered SSL brigade"); + ap_remove_input_filter(f); + return rv; + } + + /* If the buffered brigade contains less then the requested + * length, just pass it all back. */ + if (rv == APR_INCOMPLETE) { + APR_BRIGADE_CONCAT(bb, ctx->bb); + } else { + apr_bucket *d = APR_BRIGADE_FIRST(ctx->bb); + + e = APR_BUCKET_PREV(e); + + /* Unsplice the partitioned segment and move it into the + * passed-in brigade; no convenient way to do this with + * the APR_BRIGADE_* macros. */ + APR_RING_UNSPLICE(d, e, link); + APR_RING_SPLICE_HEAD(&bb->list, d, e, apr_bucket, link); + + APR_BRIGADE_CHECK_CONSISTENCY(bb); + APR_BRIGADE_CHECK_CONSISTENCY(ctx->bb); + } + } + else { + /* Split a line into the passed-in brigade. */ + rv = apr_brigade_split_line(bb, ctx->bb, mode, bytes); + + if (rv) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, f->r, + "could not split line from buffered SSL brigade"); + ap_remove_input_filter(f); + return rv; + } + } + + if (APR_BRIGADE_EMPTY(ctx->bb)) { + apr_bucket *e = APR_BRIGADE_LAST(bb); + + /* Ensure that the brigade is terminated by an EOS if the + * buffered request body has been entirely consumed. */ + if (e == APR_BRIGADE_SENTINEL(bb) || !APR_BUCKET_IS_EOS(e)) { + e = apr_bucket_eos_create(f->c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(bb, e); + } + + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, f->r, + "buffered SSL brigade now exhausted; removing filter"); + ap_remove_input_filter(f); + } + + return APR_SUCCESS; +} + +static void ssl_io_input_add_filter(ssl_filter_ctx_t *filter_ctx, conn_rec *c, + SSL *ssl) +{ + bio_filter_in_ctx_t *inctx; + + inctx = apr_palloc(c->pool, sizeof(*inctx)); + + filter_ctx->pInputFilter = ap_add_input_filter(ssl_io_filter, inctx, NULL, c); + + filter_ctx->pbioRead = BIO_new(&bio_filter_in_method); + filter_ctx->pbioRead->ptr = (void *)inctx; + + inctx->ssl = ssl; + inctx->bio_out = filter_ctx->pbioWrite; + inctx->f = filter_ctx->pInputFilter; + inctx->rc = APR_SUCCESS; + inctx->mode = AP_MODE_READBYTES; + inctx->cbuf.length = 0; + inctx->bb = apr_brigade_create(c->pool, c->bucket_alloc); + inctx->block = APR_BLOCK_READ; + inctx->pool = c->pool; + inctx->filter_ctx = filter_ctx; +} + +void ssl_io_filter_init(conn_rec *c, SSL *ssl) +{ + ssl_filter_ctx_t *filter_ctx; + + filter_ctx = apr_palloc(c->pool, sizeof(ssl_filter_ctx_t)); + + filter_ctx->config = myConnConfig(c); + + filter_ctx->nobuffer = 0; + filter_ctx->pOutputFilter = ap_add_output_filter(ssl_io_filter, + filter_ctx, NULL, c); + + filter_ctx->pbioWrite = BIO_new(&bio_filter_out_method); + filter_ctx->pbioWrite->ptr = (void *)bio_filter_out_ctx_new(filter_ctx, c); + + ssl_io_input_add_filter(filter_ctx, c, ssl); + + SSL_set_bio(ssl, filter_ctx->pbioRead, filter_ctx->pbioWrite); + filter_ctx->pssl = ssl; + + apr_pool_cleanup_register(c->pool, (void*)filter_ctx, + ssl_io_filter_cleanup, apr_pool_cleanup_null); + + if (c->base_server->loglevel >= APLOG_DEBUG) { + BIO_set_callback(SSL_get_rbio(ssl), ssl_io_data_cb); + BIO_set_callback_arg(SSL_get_rbio(ssl), (void *)ssl); + } + + return; +} + +void ssl_io_filter_register(apr_pool_t *p) +{ + ap_register_input_filter (ssl_io_filter, ssl_io_filter_input, NULL, AP_FTYPE_CONNECTION + 5); + ap_register_output_filter (ssl_io_filter, ssl_io_filter_output, NULL, AP_FTYPE_CONNECTION + 5); + + ap_register_input_filter (ssl_io_buffer, ssl_io_filter_buffer, NULL, AP_FTYPE_PROTOCOL - 1); + + return; +} + +/* _________________________________________________________________ +** +** I/O Data Debugging +** _________________________________________________________________ +*/ + +#define DUMP_WIDTH 16 + +static void ssl_io_data_dump(server_rec *srvr, + MODSSL_BIO_CB_ARG_TYPE *s, + long len) +{ + char buf[256]; + char tmp[64]; + int i, j, rows, trunc; + unsigned char ch; + + trunc = 0; + for(; (len > 0) && ((s[len-1] == ' ') || (s[len-1] == '\0')); len--) + trunc++; + rows = (len / DUMP_WIDTH); + if ((rows * DUMP_WIDTH) < len) + rows++; + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, srvr, + "+-------------------------------------------------------------------------+"); + for(i = 0 ; i< rows; i++) { + apr_snprintf(tmp, sizeof(tmp), "| %04x: ", i * DUMP_WIDTH); + apr_cpystrn(buf, tmp, sizeof(buf)); + for (j = 0; j < DUMP_WIDTH; j++) { + if (((i * DUMP_WIDTH) + j) >= len) + apr_cpystrn(buf+strlen(buf), " ", sizeof(buf)-strlen(buf)); + else { + ch = ((unsigned char)*((char *)(s) + i * DUMP_WIDTH + j)) & 0xff; + apr_snprintf(tmp, sizeof(tmp), "%02x%c", ch , j==7 ? '-' : ' '); + apr_cpystrn(buf+strlen(buf), tmp, sizeof(buf)-strlen(buf)); + } + } + apr_cpystrn(buf+strlen(buf), " ", sizeof(buf)-strlen(buf)); + for (j = 0; j < DUMP_WIDTH; j++) { + if (((i * DUMP_WIDTH) + j) >= len) + apr_cpystrn(buf+strlen(buf), " ", sizeof(buf)-strlen(buf)); + else { + ch = ((unsigned char)*((char *)(s) + i * DUMP_WIDTH + j)) & 0xff; + apr_snprintf(tmp, sizeof(tmp), "%c", ((ch >= ' ') && (ch <= '~')) ? ch : '.'); + apr_cpystrn(buf+strlen(buf), tmp, sizeof(buf)-strlen(buf)); + } + } + apr_cpystrn(buf+strlen(buf), " |", sizeof(buf)-strlen(buf)); + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, srvr, + "%s", buf); + } + if (trunc > 0) + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, srvr, + "| %04ld - ", len + trunc); + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, srvr, + "+-------------------------------------------------------------------------+"); + return; +} + +long ssl_io_data_cb(BIO *bio, int cmd, + MODSSL_BIO_CB_ARG_TYPE *argp, + int argi, long argl, long rc) +{ + SSL *ssl; + conn_rec *c; + server_rec *s; + + if ((ssl = (SSL *)BIO_get_callback_arg(bio)) == NULL) + return rc; + if ((c = (conn_rec *)SSL_get_app_data(ssl)) == NULL) + return rc; + s = c->base_server; + + if ( cmd == (BIO_CB_WRITE|BIO_CB_RETURN) + || cmd == (BIO_CB_READ |BIO_CB_RETURN) ) { + if (rc >= 0) { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "%s: %s %ld/%d bytes %s BIO#%pp [mem: %pp] %s", + SSL_LIBRARY_NAME, + (cmd == (BIO_CB_WRITE|BIO_CB_RETURN) ? "write" : "read"), + rc, argi, (cmd == (BIO_CB_WRITE|BIO_CB_RETURN) ? "to" : "from"), + bio, argp, + (argp != NULL ? "(BIO dump follows)" : "(Oops, no memory buffer?)")); + if (argp != NULL) + ssl_io_data_dump(s, argp, rc); + } + else { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "%s: I/O error, %d bytes expected to %s on BIO#%pp [mem: %pp]", + SSL_LIBRARY_NAME, argi, + (cmd == (BIO_CB_WRITE|BIO_CB_RETURN) ? "write" : "read"), + bio, argp); + } + } + return rc; +} diff --git a/rubbos/app/httpd-2.0.64/modules/ssl/ssl_engine_kernel.c b/rubbos/app/httpd-2.0.64/modules/ssl/ssl_engine_kernel.c new file mode 100644 index 00000000..60133f7c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/ssl/ssl_engine_kernel.c @@ -0,0 +1,1876 @@ +/* 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. + */ + +/* _ _ + * _ __ ___ ___ __| | ___ ___| | mod_ssl + * | '_ ` _ \ / _ \ / _` | / __/ __| | Apache Interface to OpenSSL + * | | | | | | (_) | (_| | \__ \__ \ | + * |_| |_| |_|\___/ \__,_|___|___/___/_| + * |_____| + * ssl_engine_kernel.c + * The SSL engine kernel + */ + /* ``It took me fifteen years to discover + I had no talent for programming, but + I couldn't give it up because by that + time I was too famous.'' + -- Unknown */ +#include "mod_ssl.h" + +static void ssl_configure_env(request_rec *r, SSLConnRec *sslconn); + +/* Perform a speculative (and non-blocking) read from the connection + * filters for the given request, to determine whether there is any + * pending data to read. Return non-zero if there is, else zero. */ +static int has_buffered_data(request_rec *r) +{ + apr_bucket_brigade *bb; + apr_off_t len; + apr_status_t rv; + int result; + + bb = apr_brigade_create(r->pool, r->connection->bucket_alloc); + + rv = ap_get_brigade(r->connection->input_filters, bb, AP_MODE_SPECULATIVE, + APR_NONBLOCK_READ, 1); + result = rv == APR_SUCCESS + && apr_brigade_length(bb, 1, &len) == APR_SUCCESS + && len > 0; + + apr_brigade_destroy(bb); + + return result; +} + +/* + * Post Read Request Handler + */ +int ssl_hook_ReadReq(request_rec *r) +{ + SSLConnRec *sslconn = myConnConfig(r->connection); + SSL *ssl; + + if (!sslconn) { + return DECLINED; + } + + if (sslconn->non_ssl_request) { + const char *errmsg; + char *thisurl; + char *thisport = ""; + int port = ap_get_server_port(r); + + if (!ap_is_default_port(port, r)) { + thisport = apr_psprintf(r->pool, ":%u", port); + } + + thisurl = ap_escape_html(r->pool, + apr_psprintf(r->pool, "https://%s%s/", + ap_get_server_name(r), + thisport)); + + errmsg = apr_psprintf(r->pool, + "Reason: You're speaking plain HTTP " + "to an SSL-enabled server port.
    \n" + "Instead use the HTTPS scheme to access " + "this URL, please.
    \n" + "
    Hint: " + "%s
    ", + thisurl, thisurl); + + apr_table_setn(r->notes, "error-notes", errmsg); + + /* Now that we have caught this error, forget it. we are done + * with using SSL on this request. + */ + sslconn->non_ssl_request = 0; + + + return HTTP_BAD_REQUEST; + } + + /* + * Get the SSL connection structure and perform the + * delayed interlinking from SSL back to request_rec + */ + ssl = sslconn->ssl; + if (!ssl) { + return DECLINED; + } + SSL_set_app_data2(ssl, r); + + /* + * Log information about incoming HTTPS requests + */ + if (r->server->loglevel >= APLOG_INFO && ap_is_initial_req(r)) { + ap_log_error(APLOG_MARK, APLOG_INFO, 0, r->server, + "%s HTTPS request received for child %ld (server %s)", + (r->connection->keepalives <= 0 ? + "Initial (No.1)" : + apr_psprintf(r->pool, "Subsequent (No.%d)", + r->connection->keepalives+1)), + r->connection->id, + ssl_util_vhostid(r->pool, r->server)); + } + + /* SetEnvIf ssl-*-shutdown flags can only be per-server, + * so they won't change across keepalive requests + */ + if (sslconn->shutdown_type == SSL_SHUTDOWN_TYPE_UNSET) { + ssl_configure_env(r, sslconn); + } + + return DECLINED; +} + +/* + * Move SetEnvIf information from request_rec to conn_rec/BUFF + * to allow the close connection handler to use them. + */ + +static void ssl_configure_env(request_rec *r, SSLConnRec *sslconn) +{ + int i; + const apr_array_header_t *arr = apr_table_elts(r->subprocess_env); + const apr_table_entry_t *elts = (const apr_table_entry_t *)arr->elts; + + sslconn->shutdown_type = SSL_SHUTDOWN_TYPE_STANDARD; + + for (i = 0; i < arr->nelts; i++) { + const char *key = elts[i].key; + + switch (*key) { + case 's': + /* being case-sensitive here. + * and not checking for the -shutdown since these are the only + * SetEnvIf "flags" we support + */ + if (!strncmp(key+1, "sl-", 3)) { + key += 4; + if (!strncmp(key, "unclean", 7)) { + sslconn->shutdown_type = SSL_SHUTDOWN_TYPE_UNCLEAN; + } + else if (!strncmp(key, "accurate", 8)) { + sslconn->shutdown_type = SSL_SHUTDOWN_TYPE_ACCURATE; + } + return; /* should only ever be one ssl-*-shutdown */ + } + break; + } + } +} + +/* + * Access Handler + */ +int ssl_hook_Access(request_rec *r) +{ + SSLDirConfigRec *dc = myDirConfig(r); + SSLSrvConfigRec *sc = mySrvConfig(r->server); + SSLConnRec *sslconn = myConnConfig(r->connection); + SSL *ssl = sslconn ? sslconn->ssl : NULL; + SSL_CTX *ctx = NULL; + apr_array_header_t *requires; + ssl_require_t *ssl_requires; + char *cp; + int ok, i; + BOOL renegotiate = FALSE, renegotiate_quick = FALSE; + X509 *cert; + X509 *peercert; + X509_STORE *cert_store = NULL; + X509_STORE_CTX cert_store_ctx; + STACK_OF(SSL_CIPHER) *cipher_list_old = NULL, *cipher_list = NULL; + SSL_CIPHER *cipher = NULL; + int depth, verify_old, verify, n; + + if (ssl) { + ctx = SSL_get_SSL_CTX(ssl); + } + + /* + * Support for SSLRequireSSL directive + */ + if (dc->bSSLRequired && !ssl) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "access to %s failed, reason: %s", + r->filename, "SSL connection required"); + + /* remember forbidden access for strict require option */ + apr_table_setn(r->notes, "ssl-access-forbidden", "1"); + + return HTTP_FORBIDDEN; + } + + /* + * Check to see whether SSL is in use; if it's not, then no + * further access control checks are relevant. (the test for + * sc->enabled is probably strictly unnecessary) + */ + if (!sc->enabled || !ssl) { + return DECLINED; + } + + /* + * Support for per-directory reconfigured SSL connection parameters. + * + * This is implemented by forcing an SSL renegotiation with the + * reconfigured parameter suite. But Apache's internal API processing + * makes our life very hard here, because when internal sub-requests occur + * we nevertheless should avoid multiple unnecessary SSL handshakes (they + * require extra network I/O and especially time to perform). + * + * But the optimization for filtering out the unnecessary handshakes isn't + * obvious and trivial. Especially because while Apache is in its + * sub-request processing the client could force additional handshakes, + * too. And these take place perhaps without our notice. So the only + * possibility is to explicitly _ask_ OpenSSL whether the renegotiation + * has to be performed or not. It has to performed when some parameters + * which were previously known (by us) are not those we've now + * reconfigured (as known by OpenSSL) or (in optimized way) at least when + * the reconfigured parameter suite is stronger (more restrictions) than + * the currently active one. + */ + + /* + * Override of SSLCipherSuite + * + * We provide two options here: + * + * o The paranoid and default approach where we force a renegotiation when + * the cipher suite changed in _any_ way (which is straight-forward but + * often forces renegotiations too often and is perhaps not what the + * user actually wanted). + * + * o The optimized and still secure way where we force a renegotiation + * only if the currently active cipher is no longer contained in the + * reconfigured/new cipher suite. Any other changes are not important + * because it's the servers choice to select a cipher from the ones the + * client supports. So as long as the current cipher is still in the new + * cipher suite we're happy. Because we can assume we would have + * selected it again even when other (better) ciphers exists now in the + * new cipher suite. This approach is fine because the user explicitly + * has to enable this via ``SSLOptions +OptRenegotiate''. So we do no + * implicit optimizations. + */ + if (dc->szCipherSuite) { + /* remember old state */ + + if (dc->nOptions & SSL_OPT_OPTRENEGOTIATE) { + cipher = SSL_get_current_cipher(ssl); + } + else { + cipher_list_old = (STACK_OF(SSL_CIPHER) *)SSL_get_ciphers(ssl); + + if (cipher_list_old) { + cipher_list_old = sk_SSL_CIPHER_dup(cipher_list_old); + } + } + + /* configure new state */ + if (!modssl_set_cipher_list(ssl, dc->szCipherSuite)) { + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, + r->server, + "Unable to reconfigure (per-directory) " + "permitted SSL ciphers"); + ssl_log_ssl_error(APLOG_MARK, APLOG_ERR, r->server); + + if (cipher_list_old) { + sk_SSL_CIPHER_free(cipher_list_old); + } + + return HTTP_FORBIDDEN; + } + + /* determine whether a renegotiation has to be forced */ + cipher_list = (STACK_OF(SSL_CIPHER) *)SSL_get_ciphers(ssl); + + if (dc->nOptions & SSL_OPT_OPTRENEGOTIATE) { + /* optimized way */ + if ((!cipher && cipher_list) || + (cipher && !cipher_list)) + { + renegotiate = TRUE; + } + else if (cipher && cipher_list && + (sk_SSL_CIPHER_find(cipher_list, cipher) < 0)) + { + renegotiate = TRUE; + } + } + else { + /* paranoid way */ + if ((!cipher_list_old && cipher_list) || + (cipher_list_old && !cipher_list)) + { + renegotiate = TRUE; + } + else if (cipher_list_old && cipher_list) { + for (n = 0; + !renegotiate && (n < sk_SSL_CIPHER_num(cipher_list)); + n++) + { + SSL_CIPHER *value = sk_SSL_CIPHER_value(cipher_list, n); + + if (sk_SSL_CIPHER_find(cipher_list_old, value) < 0) { + renegotiate = TRUE; + } + } + + for (n = 0; + !renegotiate && (n < sk_SSL_CIPHER_num(cipher_list_old)); + n++) + { + SSL_CIPHER *value = sk_SSL_CIPHER_value(cipher_list_old, n); + + if (sk_SSL_CIPHER_find(cipher_list, value) < 0) { + renegotiate = TRUE; + } + } + } + } + + /* cleanup */ + if (cipher_list_old) { + sk_SSL_CIPHER_free(cipher_list_old); + } + + /* tracing */ + if (renegotiate) { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "Reconfigured cipher suite will force renegotiation"); + } + } + + /* + * override of SSLVerifyDepth + * + * The depth checks are handled by us manually inside the verify callback + * function and not by OpenSSL internally (and our function is aware of + * both the per-server and per-directory contexts). So we cannot ask + * OpenSSL about the currently verify depth. Instead we remember it in our + * ap_ctx attached to the SSL* of OpenSSL. We've to force the + * renegotiation if the reconfigured/new verify depth is less than the + * currently active/remembered verify depth (because this means more + * restriction on the certificate chain). + */ + if (dc->nVerifyDepth != UNSET) { + /* XXX: doesnt look like sslconn->verify_depth is actually used */ + if (!(n = sslconn->verify_depth)) { + sslconn->verify_depth = n = sc->server->auth.verify_depth; + } + + /* determine whether a renegotiation has to be forced */ + if (dc->nVerifyDepth < n) { + renegotiate = TRUE; + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "Reduced client verification depth will force " + "renegotiation"); + } + } + + /* + * override of SSLVerifyClient + * + * We force a renegotiation if the reconfigured/new verify type is + * stronger than the currently active verify type. + * + * The order is: none << optional_no_ca << optional << require + * + * Additionally the following optimization is possible here: When the + * currently active verify type is "none" but a client certificate is + * already known/present, it's enough to manually force a client + * verification but at least skip the I/O-intensive renegotation + * handshake. + */ + if (dc->nVerifyClient != SSL_CVERIFY_UNSET) { + /* remember old state */ + verify_old = SSL_get_verify_mode(ssl); + /* configure new state */ + verify = SSL_VERIFY_NONE; + + if (dc->nVerifyClient == SSL_CVERIFY_REQUIRE) { + verify |= SSL_VERIFY_PEER_STRICT; + } + + if ((dc->nVerifyClient == SSL_CVERIFY_OPTIONAL) || + (dc->nVerifyClient == SSL_CVERIFY_OPTIONAL_NO_CA)) + { + verify |= SSL_VERIFY_PEER; + } + + modssl_set_verify(ssl, verify, ssl_callback_SSLVerify); + SSL_set_verify_result(ssl, X509_V_OK); + + /* determine whether we've to force a renegotiation */ + if (!renegotiate && verify != verify_old) { + if (((verify_old == SSL_VERIFY_NONE) && + (verify != SSL_VERIFY_NONE)) || + + (!(verify_old & SSL_VERIFY_PEER) && + (verify & SSL_VERIFY_PEER)) || + + (!(verify_old & SSL_VERIFY_FAIL_IF_NO_PEER_CERT) && + (verify & SSL_VERIFY_FAIL_IF_NO_PEER_CERT))) + { + renegotiate = TRUE; + /* optimization */ + + if ((dc->nOptions & SSL_OPT_OPTRENEGOTIATE) && + (verify_old == SSL_VERIFY_NONE) && + ((peercert = SSL_get_peer_certificate(ssl)) != NULL)) + { + renegotiate_quick = TRUE; + X509_free(peercert); + } + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, + r->server, + "Changed client verification type will force " + "%srenegotiation", + renegotiate_quick ? "quick " : ""); + } + } + } + + /* + * override SSLCACertificateFile & SSLCACertificatePath + * This is only enabled if the SSL_set_cert_store() function + * is available in the ssl library. the 1.x based mod_ssl + * used SSL_CTX_set_cert_store which is not thread safe. + */ + +#ifdef HAVE_SSL_SET_CERT_STORE + /* + * check if per-dir and per-server config field are not the same. + * if f is defined in per-dir and not defined in per-server + * or f is defined in both but not the equal ... + */ +#define MODSSL_CFG_NE(f) \ + (dc->f && (!sc->f || (sc->f && strNE(dc->f, sc->f)))) + +#define MODSSL_CFG_CA(f) \ + (dc->f ? dc->f : sc->f) + + if (MODSSL_CFG_NE(szCACertificateFile) || + MODSSL_CFG_NE(szCACertificatePath)) + { + STACK_OF(X509_NAME) *ca_list; + const char *ca_file = MODSSL_CFG_CA(szCACertificateFile); + const char *ca_path = MODSSL_CFG_CA(szCACertificatePath); + + cert_store = X509_STORE_new(); + + if (!X509_STORE_load_locations(cert_store, ca_file, ca_path)) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server, + "Unable to reconfigure verify locations " + "for client authentication"); + ssl_log_ssl_error(APLOG_MARK, APLOG_ERR, r->server); + + X509_STORE_free(cert_store); + + return HTTP_FORBIDDEN; + } + + /* SSL_free will free cert_store */ + SSL_set_cert_store(ssl, cert_store); + + if (!(ca_list = ssl_init_FindCAList(r->server, r->pool, + ca_file, ca_path))) + { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server, + "Unable to determine list of available " + "CA certificates for client authentication"); + + return HTTP_FORBIDDEN; + } + + SSL_set_client_CA_list(ssl, ca_list); + renegotiate = TRUE; + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "Changed client verification locations will force " + "renegotiation"); + } +#endif /* HAVE_SSL_SET_CERT_STORE */ + + /* If a renegotiation is now required for this location, and the + * request includes a message body (and the client has not + * requested a "100 Continue" response), then the client will be + * streaming the request body over the wire already. In that + * case, it is not possible to stop and perform a new SSL + * handshake immediately; once the SSL library moves to the + * "accept" state, it will reject the SSL packets which the client + * is sending for the request body. + * + * To allow authentication to complete in this auth hook, the + * solution used here is to fill a (bounded) buffer with the + * request body, and then to reinject that request body later. + */ + if (renegotiate && !renegotiate_quick + && (apr_table_get(r->headers_in, "transfer-encoding") + || (apr_table_get(r->headers_in, "content-length") + && strcmp(apr_table_get(r->headers_in, "content-length"), "0"))) + && !r->expecting_100) { + int rv; + + /* Fill the I/O buffer with the request body if possible. */ + rv = ssl_io_buffer_fill(r); + + if (rv) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "could not buffer message body to allow " + "SSL renegotiation to proceed"); + return rv; + } + } + + /* + * now do the renegotiation if anything was actually reconfigured + */ + if (renegotiate) { + /* + * Now we force the SSL renegotation by sending the Hello Request + * message to the client. Here we have to do a workaround: Actually + * OpenSSL returns immediately after sending the Hello Request (the + * intent AFAIK is because the SSL/TLS protocol says it's not a must + * that the client replies to a Hello Request). But because we insist + * on a reply (anything else is an error for us) we have to go to the + * ACCEPT state manually. Using SSL_set_accept_state() doesn't work + * here because it resets too much of the connection. So we set the + * state explicitly and continue the handshake manually. + */ + ap_log_error(APLOG_MARK, APLOG_INFO, 0, r->server, + "Requesting connection re-negotiation"); + + if (renegotiate_quick) { + STACK_OF(X509) *cert_stack; + + /* perform just a manual re-verification of the peer */ + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, + "Performing quick renegotiation: " + "just re-verifying the peer"); + + cert_stack = (STACK_OF(X509) *)SSL_get_peer_cert_chain(ssl); + + cert = SSL_get_peer_certificate(ssl); + + if (!cert_stack && cert) { + /* client cert is in the session cache, but there is + * no chain, since ssl3_get_client_certificate() + * sk_X509_shift-ed the peer cert out of the chain. + * we put it back here for the purpose of quick_renegotiation. + */ + cert_stack = sk_new_null(); + sk_X509_push(cert_stack, MODSSL_PCHAR_CAST cert); + } + + if (!cert_stack || (sk_X509_num(cert_stack) == 0)) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server, + "Cannot find peer certificate chain"); + + return HTTP_FORBIDDEN; + } + + if (!(cert_store || + (cert_store = SSL_CTX_get_cert_store(ctx)))) + { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server, + "Cannot find certificate storage"); + + return HTTP_FORBIDDEN; + } + + if (!cert) { + cert = sk_X509_value(cert_stack, 0); + } + + X509_STORE_CTX_init(&cert_store_ctx, cert_store, cert, cert_stack); + depth = SSL_get_verify_depth(ssl); + + if (depth >= 0) { + X509_STORE_CTX_set_depth(&cert_store_ctx, depth); + } + + X509_STORE_CTX_set_ex_data(&cert_store_ctx, + SSL_get_ex_data_X509_STORE_CTX_idx(), + (char *)ssl); + + if (!modssl_X509_verify_cert(&cert_store_ctx)) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server, + "Re-negotiation verification step failed"); + ssl_log_ssl_error(APLOG_MARK, APLOG_ERR, r->server); + } + + SSL_set_verify_result(ssl, cert_store_ctx.error); + X509_STORE_CTX_cleanup(&cert_store_ctx); + + if (cert_stack != SSL_get_peer_cert_chain(ssl)) { + /* we created this ourselves, so free it */ + sk_X509_pop_free(cert_stack, X509_free); + } + } + else { + request_rec *id = r->main ? r->main : r; + + /* Additional mitigation for CVE-2009-3555: At this point, + * before renegotiating, an (entire) request has been read + * from the connection. An attacker may have sent further + * data to "prefix" any subsequent request by the victim's + * client after the renegotiation; this data may already + * have been read and buffered. Forcing a connection + * closure after the response ensures such data will be + * discarded. Legimately pipelined HTTP requests will be + * retried anyway with this approach. */ + if (has_buffered_data(r)) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "insecure SSL re-negotiation required, but " + "a pipelined request is present; keepalive " + "disabled"); + r->connection->keepalive = AP_CONN_CLOSE; + } + + /* Perform a full renegotiation. */ + ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, + "Performing full renegotiation: complete handshake " + "protocol (%s support secure renegotiation)", +#if defined(SSL_get_secure_renegotiation_support) + SSL_get_secure_renegotiation_support(ssl) ? + "client does" : "client does not" +#else + "server does not" +#endif + ); + + SSL_set_session_id_context(ssl, + (unsigned char *)&id, + sizeof(id)); + + /* Toggle the renegotiation state to allow the new + * handshake to proceed. */ + sslconn->reneg_state = RENEG_ALLOW; + + SSL_renegotiate(ssl); + SSL_do_handshake(ssl); + + if (SSL_get_state(ssl) != SSL_ST_OK) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server, + "Re-negotiation request failed"); + ssl_log_ssl_error(APLOG_MARK, APLOG_ERR, r->server); + + r->connection->aborted = 1; + return HTTP_FORBIDDEN; + } + + ap_log_error(APLOG_MARK, APLOG_INFO, 0, r->server, + "Awaiting re-negotiation handshake"); + + SSL_set_state(ssl, SSL_ST_ACCEPT); + SSL_do_handshake(ssl); + + sslconn->reneg_state = RENEG_REJECT; + + if (SSL_get_state(ssl) != SSL_ST_OK) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server, + "Re-negotiation handshake failed: " + "Not accepted by client!?"); + + r->connection->aborted = 1; + return HTTP_FORBIDDEN; + } + } + + /* + * Remember the peer certificate's DN + */ + if ((cert = SSL_get_peer_certificate(ssl))) { + if (sslconn->client_cert) { + X509_free(sslconn->client_cert); + } + sslconn->client_cert = cert; + sslconn->client_dn = NULL; + } + + /* + * Finally check for acceptable renegotiation results + */ + if (dc->nVerifyClient != SSL_CVERIFY_NONE) { + BOOL do_verify = (dc->nVerifyClient == SSL_CVERIFY_REQUIRE); + + if (do_verify && (SSL_get_verify_result(ssl) != X509_V_OK)) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server, + "Re-negotiation handshake failed: " + "Client verification failed"); + + return HTTP_FORBIDDEN; + } + + if (do_verify) { + if ((peercert = SSL_get_peer_certificate(ssl)) == NULL) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, r->server, + "Re-negotiation handshake failed: " + "Client certificate missing"); + + return HTTP_FORBIDDEN; + } + + X509_free(peercert); + } + } + + /* + * Also check that SSLCipherSuite has been enforced as expected. + */ + if (cipher_list) { + cipher = SSL_get_current_cipher(ssl); + if (sk_SSL_CIPHER_find(cipher_list, cipher) < 0) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "SSL cipher suite not renegotiated: " + "access to %s denied using cipher %s", + r->filename, + SSL_CIPHER_get_name(cipher)); + return HTTP_FORBIDDEN; + } + } + } + + /* If we're trying to have the user name set from a client + * certificate then we need to set it here. This should be safe as + * the user name probably isn't important from an auth checking point + * of view as the certificate supplied acts in that capacity. + * However, if FakeAuth is being used then this isn't the case so + * we need to postpone setting the username until later. + */ + if ((dc->nOptions & SSL_OPT_FAKEBASICAUTH) == 0 && dc->szUserName) { + char *val = ssl_var_lookup(r->pool, r->server, r->connection, + r, (char *)dc->szUserName); + if (val && val[0]) + r->user = val; + } + + /* + * Check SSLRequire boolean expressions + */ + requires = dc->aRequirement; + ssl_requires = (ssl_require_t *)requires->elts; + + for (i = 0; i < requires->nelts; i++) { + ssl_require_t *req = &ssl_requires[i]; + ok = ssl_expr_exec(r, req->mpExpr); + + if (ok < 0) { + cp = apr_psprintf(r->pool, + "Failed to execute " + "SSL requirement expression: %s", + ssl_expr_get_error()); + + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "access to %s failed, reason: %s", + r->filename, cp); + + /* remember forbidden access for strict require option */ + apr_table_setn(r->notes, "ssl-access-forbidden", "1"); + + return HTTP_FORBIDDEN; + } + + if (ok != 1) { + ap_log_error(APLOG_MARK, APLOG_INFO, 0, r->server, + "Access to %s denied for %s " + "(requirement expression not fulfilled)", + r->filename, r->connection->remote_ip); + + ap_log_error(APLOG_MARK, APLOG_INFO, 0, r->server, + "Failed expression: %s", req->cpExpr); + + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "access to %s failed, reason: %s", + r->filename, + "SSL requirement expression not fulfilled " + "(see SSL logfile for more details)"); + + /* remember forbidden access for strict require option */ + apr_table_setn(r->notes, "ssl-access-forbidden", "1"); + + return HTTP_FORBIDDEN; + } + } + + /* + * Else access is granted from our point of view (except vendor + * handlers override). But we have to return DECLINED here instead + * of OK, because mod_auth and other modules still might want to + * deny access. + */ + + return DECLINED; +} + +/* + * Authentication Handler: + * Fake a Basic authentication from the X509 client certificate. + * + * This must be run fairly early on to prevent a real authentication from + * occuring, in particular it must be run before anything else that + * authenticates a user. This means that the Module statement for this + * module should be LAST in the Configuration file. + */ +int ssl_hook_UserCheck(request_rec *r) +{ + SSLConnRec *sslconn = myConnConfig(r->connection); + SSLSrvConfigRec *sc = mySrvConfig(r->server); + SSLDirConfigRec *dc = myDirConfig(r); + char *clientdn; + const char *auth_line, *username, *password; + + /* + * Additionally forbid access (again) + * when strict require option is used. + */ + if ((dc->nOptions & SSL_OPT_STRICTREQUIRE) && + (apr_table_get(r->notes, "ssl-access-forbidden"))) + { + return HTTP_FORBIDDEN; + } + + /* + * We decline when we are in a subrequest. The Authorization header + * would already be present if it was added in the main request. + */ + if (!ap_is_initial_req(r)) { + return DECLINED; + } + + /* + * Make sure the user is not able to fake the client certificate + * based authentication by just entering an X.509 Subject DN + * ("/XX=YYY/XX=YYY/..") as the username and "password" as the + * password. + */ + if ((auth_line = apr_table_get(r->headers_in, "Authorization"))) { + if (strcEQ(ap_getword(r->pool, &auth_line, ' '), "Basic")) { + while ((*auth_line == ' ') || (*auth_line == '\t')) { + auth_line++; + } + + auth_line = ap_pbase64decode(r->pool, auth_line); + username = ap_getword_nulls(r->pool, &auth_line, ':'); + password = auth_line; + + if ((username[0] == '/') && strEQ(password, "password")) { + ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, + "Encountered FakeBasicAuth spoof: %s", username); + return HTTP_FORBIDDEN; + } + } + } + + /* + * We decline operation in various situations... + * - SSLOptions +FakeBasicAuth not configured + * - r->user already authenticated + * - ssl not enabled + * - client did not present a certificate + */ + if (!(sc->enabled && sslconn && sslconn->ssl && sslconn->client_cert) || + !(dc->nOptions & SSL_OPT_FAKEBASICAUTH) || r->user) + { + return DECLINED; + } + + if (!sslconn->client_dn) { + X509_NAME *name = X509_get_subject_name(sslconn->client_cert); + char *cp = X509_NAME_oneline(name, NULL, 0); + sslconn->client_dn = apr_pstrdup(r->connection->pool, cp); + modssl_free(cp); + } + + clientdn = (char *)sslconn->client_dn; + + /* + * Fake a password - which one would be immaterial, as, it seems, an empty + * password in the users file would match ALL incoming passwords, if only + * we were using the standard crypt library routine. Unfortunately, OpenSSL + * "fixes" a "bug" in crypt and thus prevents blank passwords from + * working. (IMHO what they really fix is a bug in the users of the code + * - failing to program correctly for shadow passwords). We need, + * therefore, to provide a password. This password can be matched by + * adding the string "xxj31ZMTZzkVA" as the password in the user file. + * This is just the crypted variant of the word "password" ;-) + */ + auth_line = apr_pstrcat(r->pool, "Basic ", + ap_pbase64encode(r->pool, + apr_pstrcat(r->pool, clientdn, + ":password", NULL)), + NULL); + apr_table_set(r->headers_in, "Authorization", auth_line); + + ap_log_error(APLOG_MARK, APLOG_INFO, 0, r->server, + "Faking HTTP Basic Auth header: \"Authorization: %s\"", + auth_line); + + return DECLINED; +} + +/* authorization phase */ +int ssl_hook_Auth(request_rec *r) +{ + SSLDirConfigRec *dc = myDirConfig(r); + + /* + * Additionally forbid access (again) + * when strict require option is used. + */ + if ((dc->nOptions & SSL_OPT_STRICTREQUIRE) && + (apr_table_get(r->notes, "ssl-access-forbidden"))) + { + return HTTP_FORBIDDEN; + } + + return DECLINED; +} + +/* + * Fixup Handler + */ + +static const char *ssl_hook_Fixup_vars[] = { + "SSL_VERSION_INTERFACE", + "SSL_VERSION_LIBRARY", + "SSL_PROTOCOL", + "SSL_SECURE_RENEG", + "SSL_CIPHER", + "SSL_CIPHER_EXPORT", + "SSL_CIPHER_USEKEYSIZE", + "SSL_CIPHER_ALGKEYSIZE", + "SSL_CLIENT_VERIFY", + "SSL_CLIENT_M_VERSION", + "SSL_CLIENT_M_SERIAL", + "SSL_CLIENT_V_START", + "SSL_CLIENT_V_END", + "SSL_CLIENT_S_DN", + "SSL_CLIENT_S_DN_C", + "SSL_CLIENT_S_DN_ST", + "SSL_CLIENT_S_DN_L", + "SSL_CLIENT_S_DN_O", + "SSL_CLIENT_S_DN_OU", + "SSL_CLIENT_S_DN_CN", + "SSL_CLIENT_S_DN_T", + "SSL_CLIENT_S_DN_I", + "SSL_CLIENT_S_DN_G", + "SSL_CLIENT_S_DN_S", + "SSL_CLIENT_S_DN_D", + "SSL_CLIENT_S_DN_UID", + "SSL_CLIENT_S_DN_Email", + "SSL_CLIENT_I_DN", + "SSL_CLIENT_I_DN_C", + "SSL_CLIENT_I_DN_ST", + "SSL_CLIENT_I_DN_L", + "SSL_CLIENT_I_DN_O", + "SSL_CLIENT_I_DN_OU", + "SSL_CLIENT_I_DN_CN", + "SSL_CLIENT_I_DN_T", + "SSL_CLIENT_I_DN_I", + "SSL_CLIENT_I_DN_G", + "SSL_CLIENT_I_DN_S", + "SSL_CLIENT_I_DN_D", + "SSL_CLIENT_I_DN_UID", + "SSL_CLIENT_I_DN_Email", + "SSL_CLIENT_A_KEY", + "SSL_CLIENT_A_SIG", + "SSL_SERVER_M_VERSION", + "SSL_SERVER_M_SERIAL", + "SSL_SERVER_V_START", + "SSL_SERVER_V_END", + "SSL_SERVER_S_DN", + "SSL_SERVER_S_DN_C", + "SSL_SERVER_S_DN_ST", + "SSL_SERVER_S_DN_L", + "SSL_SERVER_S_DN_O", + "SSL_SERVER_S_DN_OU", + "SSL_SERVER_S_DN_CN", + "SSL_SERVER_S_DN_T", + "SSL_SERVER_S_DN_I", + "SSL_SERVER_S_DN_G", + "SSL_SERVER_S_DN_S", + "SSL_SERVER_S_DN_D", + "SSL_SERVER_S_DN_UID", + "SSL_SERVER_S_DN_Email", + "SSL_SERVER_I_DN", + "SSL_SERVER_I_DN_C", + "SSL_SERVER_I_DN_ST", + "SSL_SERVER_I_DN_L", + "SSL_SERVER_I_DN_O", + "SSL_SERVER_I_DN_OU", + "SSL_SERVER_I_DN_CN", + "SSL_SERVER_I_DN_T", + "SSL_SERVER_I_DN_I", + "SSL_SERVER_I_DN_G", + "SSL_SERVER_I_DN_S", + "SSL_SERVER_I_DN_D", + "SSL_SERVER_I_DN_UID", + "SSL_SERVER_I_DN_Email", + "SSL_SERVER_A_KEY", + "SSL_SERVER_A_SIG", + "SSL_SESSION_ID", + NULL +}; + +int ssl_hook_Fixup(request_rec *r) +{ + SSLConnRec *sslconn = myConnConfig(r->connection); + SSLSrvConfigRec *sc = mySrvConfig(r->server); + SSLDirConfigRec *dc = myDirConfig(r); + apr_table_t *env = r->subprocess_env; + char *var, *val = ""; + STACK_OF(X509) *peer_certs; + SSL *ssl; + int i; + + /* + * Check to see if SSL is on + */ + if (!(sc->enabled && sslconn && (ssl = sslconn->ssl))) { + return DECLINED; + } + + /* + * Annotate the SSI/CGI environment with standard SSL information + */ + /* the always present HTTPS (=HTTP over SSL) flag! */ + apr_table_setn(env, "HTTPS", "on"); + + /* standard SSL environment variables */ + if (dc->nOptions & SSL_OPT_STDENVVARS) { + for (i = 0; ssl_hook_Fixup_vars[i]; i++) { + var = (char *)ssl_hook_Fixup_vars[i]; + val = ssl_var_lookup(r->pool, r->server, r->connection, r, var); + if (!strIsEmpty(val)) { + apr_table_setn(env, var, val); + } + } + } + + /* + * On-demand bloat up the SSI/CGI environment with certificate data + */ + if (dc->nOptions & SSL_OPT_EXPORTCERTDATA) { + val = ssl_var_lookup(r->pool, r->server, r->connection, + r, "SSL_SERVER_CERT"); + + apr_table_setn(env, "SSL_SERVER_CERT", val); + + val = ssl_var_lookup(r->pool, r->server, r->connection, + r, "SSL_CLIENT_CERT"); + + apr_table_setn(env, "SSL_CLIENT_CERT", val); + + if ((peer_certs = (STACK_OF(X509) *)SSL_get_peer_cert_chain(ssl))) { + for (i = 0; i < sk_X509_num(peer_certs); i++) { + var = apr_psprintf(r->pool, "SSL_CLIENT_CERT_CHAIN_%d", i); + val = ssl_var_lookup(r->pool, r->server, r->connection, + r, var); + if (val) { + apr_table_setn(env, var, val); + } + } + } + } + + +#ifdef SSL_get_secure_renegotiation_support + apr_table_setn(r->notes, "ssl-secure-reneg", + SSL_get_secure_renegotiation_support(ssl) ? "1" : "0"); +#endif + + return DECLINED; +} + +/* _________________________________________________________________ +** +** OpenSSL Callback Functions +** _________________________________________________________________ +*/ + +/* + * Handle out temporary RSA private keys on demand + * + * The background of this as the TLSv1 standard explains it: + * + * | D.1. Temporary RSA keys + * | + * | US Export restrictions limit RSA keys used for encryption to 512 + * | bits, but do not place any limit on lengths of RSA keys used for + * | signing operations. Certificates often need to be larger than 512 + * | bits, since 512-bit RSA keys are not secure enough for high-value + * | transactions or for applications requiring long-term security. Some + * | certificates are also designated signing-only, in which case they + * | cannot be used for key exchange. + * | + * | When the public key in the certificate cannot be used for encryption, + * | the server signs a temporary RSA key, which is then exchanged. In + * | exportable applications, the temporary RSA key should be the maximum + * | allowable length (i.e., 512 bits). Because 512-bit RSA keys are + * | relatively insecure, they should be changed often. For typical + * | electronic commerce applications, it is suggested that keys be + * | changed daily or every 500 transactions, and more often if possible. + * | Note that while it is acceptable to use the same temporary key for + * | multiple transactions, it must be signed each time it is used. + * | + * | RSA key generation is a time-consuming process. In many cases, a + * | low-priority process can be assigned the task of key generation. + * | Whenever a new key is completed, the existing temporary key can be + * | replaced with the new one. + * + * XXX: base on comment above, if thread support is enabled, + * we should spawn a low-priority thread to generate new keys + * on the fly. + * + * So we generated 512 and 1024 bit temporary keys on startup + * which we now just hand out on demand.... + */ + +RSA *ssl_callback_TmpRSA(SSL *ssl, int export, int keylen) +{ + conn_rec *c = (conn_rec *)SSL_get_app_data(ssl); + SSLModConfigRec *mc = myModConfig(c->base_server); + int idx; + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, c->base_server, + "handing out temporary %d bit RSA key", keylen); + + /* doesn't matter if export flag is on, + * we won't be asked for keylen > 512 in that case. + * if we are asked for a keylen > 1024, it is too expensive + * to generate on the fly. + * XXX: any reason not to generate 2048 bit keys at startup? + */ + + switch (keylen) { + case 512: + idx = SSL_TMP_KEY_RSA_512; + break; + + case 1024: + default: + idx = SSL_TMP_KEY_RSA_1024; + } + + return (RSA *)mc->pTmpKeys[idx]; +} + +/* + * Hand out the already generated DH parameters... + */ +DH *ssl_callback_TmpDH(SSL *ssl, int export, int keylen) +{ + conn_rec *c = (conn_rec *)SSL_get_app_data(ssl); + SSLModConfigRec *mc = myModConfig(c->base_server); + int idx; + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, c->base_server, + "handing out temporary %d bit DH key", keylen); + + switch (keylen) { + case 512: + idx = SSL_TMP_KEY_DH_512; + break; + + case 1024: + default: + idx = SSL_TMP_KEY_DH_1024; + } + + return (DH *)mc->pTmpKeys[idx]; +} + +/* + * This OpenSSL callback function is called when OpenSSL + * does client authentication and verifies the certificate chain. + */ +int ssl_callback_SSLVerify(int ok, X509_STORE_CTX *ctx) +{ + /* Get Apache context back through OpenSSL context */ + SSL *ssl = X509_STORE_CTX_get_ex_data(ctx, + SSL_get_ex_data_X509_STORE_CTX_idx()); + conn_rec *conn = (conn_rec *)SSL_get_app_data(ssl); + server_rec *s = conn->base_server; + request_rec *r = (request_rec *)SSL_get_app_data2(ssl); + + SSLSrvConfigRec *sc = mySrvConfig(s); + SSLDirConfigRec *dc = r ? myDirConfig(r) : NULL; + SSLConnRec *sslconn = myConnConfig(conn); + modssl_ctx_t *mctx = myCtxConfig(sslconn, sc); + + /* Get verify ingredients */ + int errnum = X509_STORE_CTX_get_error(ctx); + int errdepth = X509_STORE_CTX_get_error_depth(ctx); + int depth, verify; + + /* + * Log verification information + */ + if (s->loglevel >= APLOG_DEBUG) { + X509 *cert = X509_STORE_CTX_get_current_cert(ctx); + char *sname = X509_NAME_oneline(X509_get_subject_name(cert), NULL, 0); + char *iname = X509_NAME_oneline(X509_get_issuer_name(cert), NULL, 0); + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "Certificate Verification: " + "depth: %d, subject: %s, issuer: %s", + errdepth, + sname ? sname : "-unknown-", + iname ? iname : "-unknown-"); + + if (sname) { + modssl_free(sname); + } + + if (iname) { + modssl_free(iname); + } + } + + /* + * Check for optionally acceptable non-verifiable issuer situation + */ + if (dc && (dc->nVerifyClient != SSL_CVERIFY_UNSET)) { + verify = dc->nVerifyClient; + } + else { + verify = mctx->auth.verify_mode; + } + + if (verify == SSL_CVERIFY_NONE) { + /* + * SSLProxyVerify is either not configured or set to "none". + * (this callback doesn't happen in the server context if SSLVerify + * is not configured or set to "none") + */ + return TRUE; + } + + if (ssl_verify_error_is_optional(errnum) && + (verify == SSL_CVERIFY_OPTIONAL_NO_CA)) + { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "Certificate Verification: Verifiable Issuer is " + "configured as optional, therefore we're accepting " + "the certificate"); + + sslconn->verify_info = "GENEROUS"; + ok = TRUE; + } + + /* + * Additionally perform CRL-based revocation checks + */ + if (ok) { + if (!(ok = ssl_callback_SSLVerify_CRL(ok, ctx, conn))) { + errnum = X509_STORE_CTX_get_error(ctx); + } + } + + /* + * If we already know it's not ok, log the real reason + */ + if (!ok) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, + "Certificate Verification: Error (%d): %s", + errnum, X509_verify_cert_error_string(errnum)); + + if (sslconn->client_cert) { + X509_free(sslconn->client_cert); + sslconn->client_cert = NULL; + } + sslconn->client_dn = NULL; + sslconn->verify_error = X509_verify_cert_error_string(errnum); + } + + /* + * Finally check the depth of the certificate verification + */ + if (dc && (dc->nVerifyDepth != UNSET)) { + depth = dc->nVerifyDepth; + } + else { + depth = mctx->auth.verify_depth; + } + + if (errdepth > depth) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, + "Certificate Verification: Certificate Chain too long " + "(chain has %d certificates, but maximum allowed are " + "only %d)", + errdepth, depth); + + errnum = X509_V_ERR_CERT_CHAIN_TOO_LONG; + sslconn->verify_error = X509_verify_cert_error_string(errnum); + + ok = FALSE; + } + + /* + * And finally signal OpenSSL the (perhaps changed) state + */ + return ok; +} + +int ssl_callback_SSLVerify_CRL(int ok, X509_STORE_CTX *ctx, conn_rec *c) +{ + server_rec *s = c->base_server; + SSLSrvConfigRec *sc = mySrvConfig(s); + SSLConnRec *sslconn = myConnConfig(c); + modssl_ctx_t *mctx = myCtxConfig(sslconn, sc); + X509_OBJECT obj; + X509_NAME *subject, *issuer; + X509 *cert; + X509_CRL *crl; + EVP_PKEY *pubkey; + int i, n, rc; + + /* + * Unless a revocation store for CRLs was created we + * cannot do any CRL-based verification, of course. + */ + if (!mctx->crl) { + return ok; + } + + /* + * Determine certificate ingredients in advance + */ + cert = X509_STORE_CTX_get_current_cert(ctx); + subject = X509_get_subject_name(cert); + issuer = X509_get_issuer_name(cert); + + /* + * OpenSSL provides the general mechanism to deal with CRLs but does not + * use them automatically when verifying certificates, so we do it + * explicitly here. We will check the CRL for the currently checked + * certificate, if there is such a CRL in the store. + * + * We come through this procedure for each certificate in the certificate + * chain, starting with the root-CA's certificate. At each step we've to + * both verify the signature on the CRL (to make sure it's a valid CRL) + * and it's revocation list (to make sure the current certificate isn't + * revoked). But because to check the signature on the CRL we need the + * public key of the issuing CA certificate (which was already processed + * one round before), we've a little problem. But we can both solve it and + * at the same time optimize the processing by using the following + * verification scheme (idea and code snippets borrowed from the GLOBUS + * project): + * + * 1. We'll check the signature of a CRL in each step when we find a CRL + * through the _subject_ name of the current certificate. This CRL + * itself will be needed the first time in the next round, of course. + * But we do the signature processing one round before this where the + * public key of the CA is available. + * + * 2. We'll check the revocation list of a CRL in each step when + * we find a CRL through the _issuer_ name of the current certificate. + * This CRLs signature was then already verified one round before. + * + * This verification scheme allows a CA to revoke its own certificate as + * well, of course. + */ + + /* + * Try to retrieve a CRL corresponding to the _subject_ of + * the current certificate in order to verify it's integrity. + */ + memset((char *)&obj, 0, sizeof(obj)); + rc = SSL_X509_STORE_lookup(mctx->crl, + X509_LU_CRL, subject, &obj); + crl = obj.data.crl; + + if ((rc > 0) && crl) { + /* + * Log information about CRL + * (A little bit complicated because of ASN.1 and BIOs...) + */ + if (s->loglevel >= APLOG_DEBUG) { + char buff[512]; /* should be plenty */ + BIO *bio = BIO_new(BIO_s_mem()); + + BIO_printf(bio, "CA CRL: Issuer: "); + X509_NAME_print(bio, issuer, 0); + + BIO_printf(bio, ", lastUpdate: "); + ASN1_UTCTIME_print(bio, X509_CRL_get_lastUpdate(crl)); + + BIO_printf(bio, ", nextUpdate: "); + ASN1_UTCTIME_print(bio, X509_CRL_get_nextUpdate(crl)); + + n = BIO_read(bio, buff, sizeof(buff) - 1); + buff[n] = '\0'; + + BIO_free(bio); + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, buff); + } + + /* + * Verify the signature on this CRL + */ + pubkey = X509_get_pubkey(cert); + rc = X509_CRL_verify(crl, pubkey); +#ifdef OPENSSL_VERSION_NUMBER + /* Only refcounted in OpenSSL */ + if (pubkey) + EVP_PKEY_free(pubkey); +#endif + if (rc <= 0) { + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s, + "Invalid signature on CRL"); + + X509_STORE_CTX_set_error(ctx, X509_V_ERR_CRL_SIGNATURE_FAILURE); + X509_OBJECT_free_contents(&obj); + return FALSE; + } + + /* + * Check date of CRL to make sure it's not expired + */ + i = X509_cmp_current_time(X509_CRL_get_nextUpdate(crl)); + + if (i == 0) { + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s, + "Found CRL has invalid nextUpdate field"); + + X509_STORE_CTX_set_error(ctx, + X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD); + X509_OBJECT_free_contents(&obj); + + return FALSE; + } + + if (i < 0) { + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s, + "Found CRL is expired - " + "revoking all certificates until you get updated CRL"); + + X509_STORE_CTX_set_error(ctx, X509_V_ERR_CRL_HAS_EXPIRED); + X509_OBJECT_free_contents(&obj); + + return FALSE; + } + + X509_OBJECT_free_contents(&obj); + } + + /* + * Try to retrieve a CRL corresponding to the _issuer_ of + * the current certificate in order to check for revocation. + */ + memset((char *)&obj, 0, sizeof(obj)); + rc = SSL_X509_STORE_lookup(mctx->crl, + X509_LU_CRL, issuer, &obj); + + crl = obj.data.crl; + if ((rc > 0) && crl) { + /* + * Check if the current certificate is revoked by this CRL + */ + n = sk_X509_REVOKED_num(X509_CRL_get_REVOKED(crl)); + + for (i = 0; i < n; i++) { + X509_REVOKED *revoked = + sk_X509_REVOKED_value(X509_CRL_get_REVOKED(crl), i); + + ASN1_INTEGER *sn = X509_REVOKED_get_serialNumber(revoked); + + if (!ASN1_INTEGER_cmp(sn, X509_get_serialNumber(cert))) { + if (s->loglevel >= APLOG_DEBUG) { + char *cp = X509_NAME_oneline(issuer, NULL, 0); + long serial = ASN1_INTEGER_get(sn); + + ap_log_error(APLOG_MARK, APLOG_INFO, 0, s, + "Certificate with serial %ld (0x%lX) " + "revoked per CRL from issuer %s", + serial, serial, cp); + modssl_free(cp); + } + + X509_STORE_CTX_set_error(ctx, X509_V_ERR_CERT_REVOKED); + X509_OBJECT_free_contents(&obj); + + return FALSE; + } + } + + X509_OBJECT_free_contents(&obj); + } + + return ok; +} + +#define SSLPROXY_CERT_CB_LOG_FMT \ + "Proxy client certificate callback: (%s) " + +static void modssl_proxy_info_log(server_rec *s, + X509_INFO *info, + const char *msg) +{ + SSLSrvConfigRec *sc = mySrvConfig(s); + char name_buf[256]; + X509_NAME *name; + char *dn; + + if (s->loglevel < APLOG_DEBUG) { + return; + } + + name = X509_get_subject_name(info->x509); + dn = X509_NAME_oneline(name, name_buf, sizeof(name_buf)); + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + SSLPROXY_CERT_CB_LOG_FMT "%s, sending %s", + sc->vhost_id, msg, dn ? dn : "-uknown-"); +} + +/* + * caller will decrement the cert and key reference + * so we need to increment here to prevent them from + * being freed. + */ +#define modssl_set_cert_info(info, cert, pkey) \ + *cert = info->x509; \ + X509_reference_inc(*cert); \ + *pkey = info->x_pkey->dec_pkey; \ + EVP_PKEY_reference_inc(*pkey) + +int ssl_callback_proxy_cert(SSL *ssl, MODSSL_CLIENT_CERT_CB_ARG_TYPE **x509, EVP_PKEY **pkey) +{ + conn_rec *c = (conn_rec *)SSL_get_app_data(ssl); + server_rec *s = c->base_server; + SSLSrvConfigRec *sc = mySrvConfig(s); + X509_NAME *ca_name, *issuer; + X509_INFO *info; + STACK_OF(X509_NAME) *ca_list; + STACK_OF(X509_INFO) *certs = sc->proxy->pkp->certs; + int i, j; + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + SSLPROXY_CERT_CB_LOG_FMT "entered", + sc->vhost_id); + + if (!certs || (sk_X509_INFO_num(certs) <= 0)) { + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s, + SSLPROXY_CERT_CB_LOG_FMT + "downstream server wanted client certificate " + "but none are configured", sc->vhost_id); + return FALSE; + } + + ca_list = SSL_get_client_CA_list(ssl); + + if (!ca_list || (sk_X509_NAME_num(ca_list) <= 0)) { + /* + * downstream server didn't send us a list of acceptable CA certs, + * so we send the first client cert in the list. + */ + info = sk_X509_INFO_value(certs, 0); + + modssl_proxy_info_log(s, info, "no acceptable CA list"); + + modssl_set_cert_info(info, x509, pkey); + + return TRUE; + } + + for (i = 0; i < sk_X509_NAME_num(ca_list); i++) { + ca_name = sk_X509_NAME_value(ca_list, i); + + for (j = 0; j < sk_X509_INFO_num(certs); j++) { + info = sk_X509_INFO_value(certs, j); + issuer = X509_get_issuer_name(info->x509); + + if (X509_NAME_cmp(issuer, ca_name) == 0) { + modssl_proxy_info_log(s, info, "found acceptable cert"); + + modssl_set_cert_info(info, x509, pkey); + + return TRUE; + } + } + } + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + SSLPROXY_CERT_CB_LOG_FMT + "no client certificate found!?", sc->vhost_id); + + return FALSE; +} + +static void ssl_session_log(server_rec *s, + const char *request, + unsigned char *id, + unsigned int idlen, + const char *status, + const char *result, + long timeout) +{ + char buf[SSL_SESSION_ID_STRING_LEN]; + char timeout_str[56] = {'\0'}; + + if (s->loglevel < APLOG_DEBUG) { + return; + } + + if (timeout) { + apr_snprintf(timeout_str, sizeof(timeout_str), + "timeout=%lds ", (timeout - time(NULL))); + } + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "Inter-Process Session Cache: " + "request=%s status=%s id=%s %s(session %s)", + request, status, + SSL_SESSION_id2sz(id, idlen, buf, sizeof(buf)), + timeout_str, result); +} + +/* + * This callback function is executed by OpenSSL whenever a new SSL_SESSION is + * added to the internal OpenSSL session cache. We use this hook to spread the + * SSL_SESSION also to the inter-process disk-cache to make share it with our + * other Apache pre-forked server processes. + */ +int ssl_callback_NewSessionCacheEntry(SSL *ssl, SSL_SESSION *session) +{ + /* Get Apache context back through OpenSSL context */ + conn_rec *conn = (conn_rec *)SSL_get_app_data(ssl); + server_rec *s = conn->base_server; + SSLSrvConfigRec *sc = mySrvConfig(s); + long timeout = sc->session_cache_timeout; + BOOL rc; + unsigned char *id; + unsigned int idlen; + + /* + * Set the timeout also for the internal OpenSSL cache, because this way + * our inter-process cache is consulted only when it's really necessary. + */ + SSL_set_timeout(session, timeout); + + /* + * Store the SSL_SESSION in the inter-process cache with the + * same expire time, so it expires automatically there, too. + */ + id = SSL_SESSION_get_session_id(session); + idlen = SSL_SESSION_get_session_id_length(session); + + timeout += modssl_session_get_time(session); + + rc = ssl_scache_store(s, id, idlen, timeout, session); + + ssl_session_log(s, "SET", id, idlen, + rc == TRUE ? "OK" : "BAD", + "caching", timeout); + + /* + * return 0 which means to OpenSSL that the session is still + * valid and was not freed by us with SSL_SESSION_free(). + */ + return 0; +} + +/* + * This callback function is executed by OpenSSL whenever a + * SSL_SESSION is looked up in the internal OpenSSL cache and it + * was not found. We use this to lookup the SSL_SESSION in the + * inter-process disk-cache where it was perhaps stored by one + * of our other Apache pre-forked server processes. + */ +SSL_SESSION *ssl_callback_GetSessionCacheEntry(SSL *ssl, + unsigned char *id, + int idlen, int *do_copy) +{ + /* Get Apache context back through OpenSSL context */ + conn_rec *conn = (conn_rec *)SSL_get_app_data(ssl); + server_rec *s = conn->base_server; + SSL_SESSION *session; + + /* + * Try to retrieve the SSL_SESSION from the inter-process cache + */ + session = ssl_scache_retrieve(s, id, idlen); + + ssl_session_log(s, "GET", id, idlen, + session ? "FOUND" : "MISSED", + session ? "reuse" : "renewal", 0); + + /* + * Return NULL or the retrieved SSL_SESSION. But indicate (by + * setting do_copy to 0) that the reference count on the + * SSL_SESSION should not be incremented by the SSL library, + * because we will no longer hold a reference to it ourself. + */ + *do_copy = 0; + + return session; +} + +/* + * This callback function is executed by OpenSSL whenever a + * SSL_SESSION is removed from the the internal OpenSSL cache. + * We use this to remove the SSL_SESSION in the inter-process + * disk-cache, too. + */ +void ssl_callback_DelSessionCacheEntry(SSL_CTX *ctx, + SSL_SESSION *session) +{ + server_rec *s; + SSLSrvConfigRec *sc; + unsigned char *id; + unsigned int idlen; + + /* + * Get Apache context back through OpenSSL context + */ + if (!(s = (server_rec *)SSL_CTX_get_app_data(ctx))) { + return; /* on server shutdown Apache is already gone */ + } + + sc = mySrvConfig(s); + + /* + * Remove the SSL_SESSION from the inter-process cache + */ + id = SSL_SESSION_get_session_id(session); + idlen = SSL_SESSION_get_session_id_length(session); + + ssl_scache_remove(s, id, idlen); + + ssl_session_log(s, "REM", id, idlen, + "OK", "dead", 0); + + return; +} + +/* Dump debugginfo trace to the log file. */ +static void log_tracing_state(MODSSL_INFO_CB_ARG_TYPE ssl, conn_rec *c, + server_rec *s, int where, int rc) +{ + /* + * create the various trace messages + */ + if (where & SSL_CB_HANDSHAKE_START) { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "%s: Handshake: start", SSL_LIBRARY_NAME); + } + else if (where & SSL_CB_HANDSHAKE_DONE) { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "%s: Handshake: done", SSL_LIBRARY_NAME); + } + else if (where & SSL_CB_LOOP) { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "%s: Loop: %s", + SSL_LIBRARY_NAME, SSL_state_string_long(ssl)); + } + else if (where & SSL_CB_READ) { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "%s: Read: %s", + SSL_LIBRARY_NAME, SSL_state_string_long(ssl)); + } + else if (where & SSL_CB_WRITE) { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "%s: Write: %s", + SSL_LIBRARY_NAME, SSL_state_string_long(ssl)); + } + else if (where & SSL_CB_ALERT) { + char *str = (where & SSL_CB_READ) ? "read" : "write"; + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "%s: Alert: %s:%s:%s", + SSL_LIBRARY_NAME, str, + SSL_alert_type_string_long(rc), + SSL_alert_desc_string_long(rc)); + } + else if (where & SSL_CB_EXIT) { + if (rc == 0) { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "%s: Exit: failed in %s", + SSL_LIBRARY_NAME, SSL_state_string_long(ssl)); + } + else if (rc < 0) { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "%s: Exit: error in %s", + SSL_LIBRARY_NAME, SSL_state_string_long(ssl)); + } + } + + /* + * Because SSL renegotations can happen at any time (not only after + * SSL_accept()), the best way to log the current connection details is + * right after a finished handshake. + */ + if (where & SSL_CB_HANDSHAKE_DONE) { + ap_log_error(APLOG_MARK, APLOG_INFO, 0, s, + "Connection: Client IP: %s, Protocol: %s, " + "Cipher: %s (%s/%s bits)", + ssl_var_lookup(NULL, s, c, NULL, "REMOTE_ADDR"), + ssl_var_lookup(NULL, s, c, NULL, "SSL_PROTOCOL"), + ssl_var_lookup(NULL, s, c, NULL, "SSL_CIPHER"), + ssl_var_lookup(NULL, s, c, NULL, "SSL_CIPHER_USEKEYSIZE"), + ssl_var_lookup(NULL, s, c, NULL, "SSL_CIPHER_ALGKEYSIZE")); + } +} + +/* + * This callback function is executed while OpenSSL processes the SSL + * handshake and does SSL record layer stuff. It's used to trap + * client-initiated renegotiations, and for dumping everything to the + * log. + */ +void ssl_callback_Info(MODSSL_INFO_CB_ARG_TYPE ssl, int where, int rc) +{ + conn_rec *c; + server_rec *s; + SSLConnRec *scr; + + /* Retrieve the conn_rec and the associated SSLConnRec. */ + if ((c = (conn_rec *)SSL_get_app_data((SSL *)ssl)) == NULL) { + return; + } + + if ((scr = myConnConfig(c)) == NULL) { + return; + } + + /* If the reneg state is to reject renegotiations, check the SSL + * state machine and move to ABORT if a Client Hello is being + * read. */ + if ((where & SSL_CB_ACCEPT_LOOP) && scr->reneg_state == RENEG_REJECT) { + int state = SSL_get_state((SSL *)ssl); + + if (state == SSL3_ST_SR_CLNT_HELLO_A + || state == SSL23_ST_SR_CLNT_HELLO_A) { + scr->reneg_state = RENEG_ABORT; + ap_log_cerror(APLOG_MARK, APLOG_ERR, 0, c, + "rejecting client initiated renegotiation"); + } + } + /* If the first handshake is complete, change state to reject any + * subsequent client-initated renegotiation. */ + else if ((where & SSL_CB_HANDSHAKE_DONE) && scr->reneg_state == RENEG_INIT) { + scr->reneg_state = RENEG_REJECT; + } + + s = c->base_server; + if (s && s->loglevel >= APLOG_DEBUG) { + log_tracing_state(ssl, c, s, where, rc); + } +} diff --git a/rubbos/app/httpd-2.0.64/modules/ssl/ssl_engine_log.c b/rubbos/app/httpd-2.0.64/modules/ssl/ssl_engine_log.c new file mode 100644 index 00000000..5ca1b6c0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/ssl/ssl_engine_log.c @@ -0,0 +1,101 @@ +/* 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. + */ + +/* _ _ + * _ __ ___ ___ __| | ___ ___| | mod_ssl + * | '_ ` _ \ / _ \ / _` | / __/ __| | Apache Interface to OpenSSL + * | | | | | | (_) | (_| | \__ \__ \ | + * |_| |_| |_|\___/ \__,_|___|___/___/_| + * |_____| + * ssl_engine_log.c + * Logging Facility + */ + /* ``The difference between a computer + industry job and open-source software + hacking is about 30 hours a week.'' + -- Ralf S. Engelschall */ +#include "mod_ssl.h" + +/* _________________________________________________________________ +** +** Logfile Support +** _________________________________________________________________ +*/ + +static const struct { + const char *cpPattern; + const char *cpAnnotation; +} ssl_log_annotate[] = { + { "*envelope*bad*decrypt*", "wrong pass phrase!?" }, + { "*CLIENT_HELLO*unknown*protocol*", "speaking not SSL to HTTPS port!?" }, + { "*CLIENT_HELLO*http*request*", "speaking HTTP to HTTPS port!?" }, + { "*SSL3_READ_BYTES:sslv3*alert*bad*certificate*", "Subject CN in certificate not server name or identical to CA!?" }, + { "*self signed certificate in certificate chain*", "Client certificate signed by CA not known to server?" }, + { "*peer did not return a certificate*", "No CAs known to server for verification?" }, + { "*no shared cipher*", "Too restrictive SSLCipherSuite or using DSA server certificate?" }, + { "*no start line*", "Bad file contents or format - or even just a forgotten SSLCertificateKeyFile?" }, + { "*bad password read*", "You entered an incorrect pass phrase!?" }, + { "*bad mac decode*", "Browser still remembered details of a re-created server certificate?" }, + { NULL, NULL } +}; + +static const char *ssl_log_annotation(const char *error) +{ + int i = 0; + + while (ssl_log_annotate[i].cpPattern != NULL + && ap_strcmp_match(error, ssl_log_annotate[i].cpPattern) != 0) + i++; + + return ssl_log_annotate[i].cpAnnotation; +} + +void ssl_die(void) +{ + /* + * This is used for fatal errors and here + * it is common module practice to really + * exit from the complete program. + */ + exit(1); +} + +/* + * Prints the SSL library error information. + */ +void ssl_log_ssl_error(const char *file, int line, int level, server_rec *s) +{ + unsigned long e; + + while ((e = ERR_get_error())) { + const char *annotation; + char err[256]; + + ERR_error_string_n(e, err, sizeof err); + annotation = ssl_log_annotation(err); + + if (annotation) { + ap_log_error(file, line, level, 0, s, + "SSL Library Error: %lu %s %s", + e, err, annotation); + } + else { + ap_log_error(file, line, level, 0, s, + "SSL Library Error: %lu %s", + e, err); + } + } +} diff --git a/rubbos/app/httpd-2.0.64/modules/ssl/ssl_engine_mutex.c b/rubbos/app/httpd-2.0.64/modules/ssl/ssl_engine_mutex.c new file mode 100644 index 00000000..1e65f4fe --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/ssl/ssl_engine_mutex.c @@ -0,0 +1,120 @@ +/* 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. + */ + +/* _ _ + * _ __ ___ ___ __| | ___ ___| | mod_ssl + * | '_ ` _ \ / _ \ / _` | / __/ __| | Apache Interface to OpenSSL + * | | | | | | (_) | (_| | \__ \__ \ | + * |_| |_| |_|\___/ \__,_|___|___/___/_| + * |_____| + * ssl_engine_mutex.c + * Semaphore for Mutual Exclusion + */ + /* ``Real programmers confuse + Christmas and Halloween + because DEC 25 = OCT 31.'' + -- Unknown */ + +#include "mod_ssl.h" +#if !defined(OS2) && !defined(WIN32) && !defined(BEOS) && !defined(NETWARE) +#include "unixd.h" +#define MOD_SSL_SET_MUTEX_PERMS /* XXX Apache should define something */ +#endif + +int ssl_mutex_init(server_rec *s, apr_pool_t *p) +{ + SSLModConfigRec *mc = myModConfig(s); + apr_status_t rv; + + if (mc->nMutexMode == SSL_MUTEXMODE_NONE) + return TRUE; + + if ((rv = apr_global_mutex_create(&mc->pMutex, mc->szMutexFile, + mc->nMutexMech, p)) != APR_SUCCESS) { + if (mc->szMutexFile) + ap_log_error(APLOG_MARK, APLOG_ERR, rv, s, + "Cannot create SSLMutex with file `%s'", + mc->szMutexFile); + else + ap_log_error(APLOG_MARK, APLOG_ERR, rv, s, + "Cannot create SSLMutex"); + return FALSE; + } + +#ifdef MOD_SSL_SET_MUTEX_PERMS + rv = unixd_set_global_mutex_perms(mc->pMutex); + if (rv != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, s, + "Could not set permissions on ssl_mutex; check User " + "and Group directives"); + return FALSE; + } +#endif + return TRUE; +} + +int ssl_mutex_reinit(server_rec *s, apr_pool_t *p) +{ + SSLModConfigRec *mc = myModConfig(s); + apr_status_t rv; + + if (mc->nMutexMode == SSL_MUTEXMODE_NONE) + return TRUE; + + if ((rv = apr_global_mutex_child_init(&mc->pMutex, + mc->szMutexFile, p)) != APR_SUCCESS) { + if (mc->szMutexFile) + ap_log_error(APLOG_MARK, APLOG_ERR, rv, s, + "Cannot reinit SSLMutex with file `%s'", + mc->szMutexFile); + else + ap_log_error(APLOG_MARK, APLOG_WARNING, rv, s, + "Cannot reinit SSLMutex"); + return FALSE; + } + return TRUE; +} + +int ssl_mutex_on(server_rec *s) +{ + SSLModConfigRec *mc = myModConfig(s); + apr_status_t rv; + + if (mc->nMutexMode == SSL_MUTEXMODE_NONE) + return TRUE; + if ((rv = apr_global_mutex_lock(mc->pMutex)) != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_WARNING, rv, s, + "Failed to acquire global mutex lock"); + return FALSE; + } + return TRUE; +} + +int ssl_mutex_off(server_rec *s) +{ + SSLModConfigRec *mc = myModConfig(s); + apr_status_t rv; + + if (mc->nMutexMode == SSL_MUTEXMODE_NONE) + return TRUE; + if ((rv = apr_global_mutex_unlock(mc->pMutex)) != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_WARNING, rv, s, + "Failed to release global mutex lock"); + return FALSE; + } + return TRUE; +} + diff --git a/rubbos/app/httpd-2.0.64/modules/ssl/ssl_engine_pphrase.c b/rubbos/app/httpd-2.0.64/modules/ssl/ssl_engine_pphrase.c new file mode 100644 index 00000000..1ca3f32f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/ssl/ssl_engine_pphrase.c @@ -0,0 +1,789 @@ +/* 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. + */ + +/* _ _ + * _ __ ___ ___ __| | ___ ___| | mod_ssl + * | '_ ` _ \ / _ \ / _` | / __/ __| | Apache Interface to OpenSSL + * | | | | | | (_) | (_| | \__ \__ \ | + * |_| |_| |_|\___/ \__,_|___|___/___/_| + * |_____| + * ssl_engine_pphrase.c + * Pass Phrase Dialog + */ + /* ``Treat your password like your + toothbrush. Don't let anybody + else use it, and get a new one + every six months.'' + -- Clifford Stoll */ +#include "mod_ssl.h" + +/* + * Return true if the named file exists and is readable + */ + +static apr_status_t exists_and_readable(char *fname, apr_pool_t *pool, apr_time_t *mtime) +{ + apr_status_t stat; + apr_finfo_t sbuf; + apr_file_t *fd; + + if ((stat = apr_stat(&sbuf, fname, APR_FINFO_MIN, pool)) != APR_SUCCESS) + return stat; + + if (sbuf.filetype != APR_REG) + return APR_EGENERAL; + + if ((stat = apr_file_open(&fd, fname, APR_READ, 0, pool)) != APR_SUCCESS) + return stat; + + if (mtime) { + *mtime = sbuf.mtime; + } + + apr_file_close(fd); + return APR_SUCCESS; +} + +/* + * reuse vhost keys for asn1 tables where keys are allocated out + * of s->process->pool to prevent "leaking" each time we format + * a vhost key. since the key is stored in a table with lifetime + * of s->process->pool, the key needs to have the same lifetime. + * + * XXX: probably seems silly to use a hash table with keys and values + * being the same, but it is easier than doing a linear search + * and will make it easier to remove keys if needed in the future. + * also have the problem with apr_array_header_t that if we + * underestimate the number of vhost keys when we apr_array_make(), + * the array will get resized when we push past the initial number + * of elts. this resizing in the s->process->pool means "leaking" + * since apr_array_push() will apr_alloc arr->nalloc * 2 elts, + * leaving the original arr->elts to waste. + */ +static char *asn1_table_vhost_key(SSLModConfigRec *mc, apr_pool_t *p, + char *id, char *an) +{ + /* 'p' pool used here is cleared on restarts (or sooner) */ + char *key = apr_psprintf(p, "%s:%s", id, an); + void *keyptr = apr_hash_get(mc->tVHostKeys, key, + APR_HASH_KEY_STRING); + + if (!keyptr) { + /* make a copy out of s->process->pool */ + keyptr = apr_pstrdup(mc->pPool, key); + apr_hash_set(mc->tVHostKeys, keyptr, + APR_HASH_KEY_STRING, keyptr); + } + + return (char *)keyptr; +} + +/* _________________________________________________________________ +** +** Pass Phrase and Private Key Handling +** _________________________________________________________________ +*/ + +#define BUILTIN_DIALOG_BACKOFF 2 +#define BUILTIN_DIALOG_RETRIES 5 + +static apr_file_t *writetty = NULL; +static apr_file_t *readtty = NULL; + +/* + * sslc has a nasty flaw where its + * PEM_read_bio_PrivateKey does not take a callback arg. + */ +static server_rec *ssl_pphrase_server_rec = NULL; + +#ifdef SSLC_VERSION_NUMBER +int ssl_pphrase_Handle_CB(char *, int, int); +#else +int ssl_pphrase_Handle_CB(char *, int, int, void *); +#endif + +static char *pphrase_array_get(apr_array_header_t *arr, int idx) +{ + if ((idx < 0) || (idx >= arr->nelts)) { + return NULL; + } + + return ((char **)arr->elts)[idx]; +} + +static void pphrase_array_clear(apr_array_header_t *arr) +{ + if (arr->nelts > 0) { + memset(arr->elts, 0, arr->elt_size * arr->nelts); + } + arr->nelts = 0; +} + +void ssl_pphrase_Handle(server_rec *s, apr_pool_t *p) +{ + SSLModConfigRec *mc = myModConfig(s); + SSLSrvConfigRec *sc; + server_rec *pServ; + char *cpVHostID; + char szPath[MAX_STRING_LEN]; + EVP_PKEY *pPrivateKey; + ssl_asn1_t *asn1; + unsigned char *ucp; + long int length; + X509 *pX509Cert; + BOOL bReadable; + apr_array_header_t *aPassPhrase; + int nPassPhrase; + int nPassPhraseCur; + char *cpPassPhraseCur; + int nPassPhraseRetry; + int nPassPhraseDialog; + int nPassPhraseDialogCur; + BOOL bPassPhraseDialogOnce; + char **cpp; + int i, j; + ssl_algo_t algoCert, algoKey, at; + char *an; + char *cp; + apr_time_t pkey_mtime = 0; + int isterm = 1; + apr_status_t rv; + /* + * Start with a fresh pass phrase array + */ + aPassPhrase = apr_array_make(p, 2, sizeof(char *)); + nPassPhrase = 0; + nPassPhraseDialog = 0; + + /* + * Walk through all configured servers + */ + for (pServ = s; pServ != NULL; pServ = pServ->next) { + sc = mySrvConfig(pServ); + + if (!sc->enabled) + continue; + + cpVHostID = ssl_util_vhostid(p, pServ); + ap_log_error(APLOG_MARK, APLOG_INFO, 0, pServ, + "Loading certificate & private key of SSL-aware server"); + + /* + * Read in server certificate(s): This is the easy part + * because this file isn't encrypted in any way. + */ + if (sc->server->pks->cert_files[0] == NULL) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, pServ, + "Server should be SSL-aware but has no certificate " + "configured [Hint: SSLCertificateFile]"); + ssl_die(); + } + algoCert = SSL_ALGO_UNKNOWN; + algoKey = SSL_ALGO_UNKNOWN; + for (i = 0, j = 0; i < SSL_AIDX_MAX && sc->server->pks->cert_files[i] != NULL; i++) { + + apr_cpystrn(szPath, sc->server->pks->cert_files[i], sizeof(szPath)); + if ((rv = exists_and_readable(szPath, p, NULL)) != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, s, + "Init: Can't open server certificate file %s", + szPath); + ssl_die(); + } + if ((pX509Cert = SSL_read_X509(szPath, NULL, NULL)) == NULL) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, + "Init: Unable to read server certificate from file %s", szPath); + ssl_log_ssl_error(APLOG_MARK, APLOG_ERR, s); + ssl_die(); + } + + /* + * check algorithm type of certificate and make + * sure only one certificate per type is used. + */ + at = ssl_util_algotypeof(pX509Cert, NULL); + an = ssl_util_algotypestr(at); + if (algoCert & at) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, + "Init: Multiple %s server certificates not " + "allowed", an); + ssl_log_ssl_error(APLOG_MARK, APLOG_ERR, s); + ssl_die(); + } + algoCert |= at; + + /* + * Insert the certificate into global module configuration to let it + * survive the processing between the 1st Apache API init round (where + * we operate here) and the 2nd Apache init round (where the + * certificate is actually used to configure mod_ssl's per-server + * configuration structures). + */ + cp = asn1_table_vhost_key(mc, p, cpVHostID, an); + length = i2d_X509(pX509Cert, NULL); + ucp = ssl_asn1_table_set(mc->tPublicCert, cp, length); + (void)i2d_X509(pX509Cert, &ucp); /* 2nd arg increments */ + + /* + * Free the X509 structure + */ + X509_free(pX509Cert); + + /* + * Read in the private key: This is the non-trivial part, because the + * key is typically encrypted, so a pass phrase dialog has to be used + * to request it from the user (or it has to be alternatively gathered + * from a dialog program). The important point here is that ISPs + * usually have hundrets of virtual servers configured and a lot of + * them use SSL, so really we have to minimize the pass phrase + * dialogs. + * + * The idea is this: When N virtual hosts are configured and all of + * them use encrypted private keys with different pass phrases, we + * have no chance and have to pop up N pass phrase dialogs. But + * usually the admin is clever enough and uses the same pass phrase + * for more private key files (typically he even uses one single pass + * phrase for all). When this is the case we can minimize the dialogs + * by trying to re-use already known/entered pass phrases. + */ + if (sc->server->pks->key_files[j] != NULL) + apr_cpystrn(szPath, sc->server->pks->key_files[j++], sizeof(szPath)); + + /* + * Try to read the private key file with the help of + * the callback function which serves the pass + * phrases to OpenSSL + */ + myCtxVarSet(mc, 1, pServ); + myCtxVarSet(mc, 2, p); + myCtxVarSet(mc, 3, aPassPhrase); + myCtxVarSet(mc, 4, &nPassPhraseCur); + myCtxVarSet(mc, 5, &cpPassPhraseCur); + myCtxVarSet(mc, 6, cpVHostID); + myCtxVarSet(mc, 7, an); + myCtxVarSet(mc, 8, &nPassPhraseDialog); + myCtxVarSet(mc, 9, &nPassPhraseDialogCur); + myCtxVarSet(mc, 10, &bPassPhraseDialogOnce); + + nPassPhraseCur = 0; + nPassPhraseRetry = 0; + nPassPhraseDialogCur = 0; + bPassPhraseDialogOnce = TRUE; + + pPrivateKey = NULL; + + for (;;) { + /* + * Try to read the private key file with the help of + * the callback function which serves the pass + * phrases to OpenSSL + */ + if ((rv = exists_and_readable(szPath, p, + &pkey_mtime)) != APR_SUCCESS ) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, s, + "Init: Can't open server private key file " + "%s",szPath); + ssl_die(); + } + + /* + * if the private key is encrypted and SSLPassPhraseDialog + * is configured to "builtin" it isn't possible to prompt for + * a password after httpd has detached from the tty. + * in this case if we already have a private key and the + * file name/mtime hasn't changed, then reuse the existing key. + * we also reuse existing private keys that were encrypted for + * exec: and pipe: dialogs to minimize chances to snoop the + * password. that and pipe: dialogs might prompt the user + * for password, which on win32 for example could happen 4 + * times at startup. twice for each child and twice within + * each since apache "restarts itself" on startup. + * of course this will not work for the builtin dialog if + * the server was started without LoadModule ssl_module + * configured, then restarted with it configured. + * but we fall through with a chance of success if the key + * is not encrypted or can be handled via exec or pipe dialog. + * and in the case of fallthrough, pkey_mtime and isatty() + * are used to give a better idea as to what failed. + */ + if (pkey_mtime) { + int i; + + for (i=0; i < SSL_AIDX_MAX; i++) { + const char *key_id = + ssl_asn1_table_keyfmt(p, cpVHostID, i); + ssl_asn1_t *asn1 = + ssl_asn1_table_get(mc->tPrivateKey, key_id); + + if (asn1 && (asn1->source_mtime == pkey_mtime)) { + ap_log_error(APLOG_MARK, APLOG_INFO, + 0, pServ, + "%s reusing existing " + "%s private key on restart", + cpVHostID, ssl_asn1_keystr(i)); + return; + } + } + } + + cpPassPhraseCur = NULL; + ssl_pphrase_server_rec = s; /* to make up for sslc flaw */ + + /* Ensure that the error stack is empty; some SSL + * functions will fail spuriously if the error stack + * is not empty. */ + ERR_clear_error(); + + bReadable = ((pPrivateKey = SSL_read_PrivateKey(szPath, NULL, + ssl_pphrase_Handle_CB, s)) != NULL ? TRUE : FALSE); + + /* + * when the private key file now was readable, + * it's fine and we go out of the loop + */ + if (bReadable) + break; + + /* + * when we have more remembered pass phrases + * try to reuse these first. + */ + if (nPassPhraseCur < nPassPhrase) { + nPassPhraseCur++; + continue; + } + + /* + * else it's not readable and we have no more + * remembered pass phrases. Then this has to mean + * that the callback function popped up the dialog + * but a wrong pass phrase was entered. We give the + * user (but not the dialog program) a few more + * chances... + */ +#ifndef WIN32 + if ((sc->server->pphrase_dialog_type == SSL_PPTYPE_BUILTIN + || sc->server->pphrase_dialog_type == SSL_PPTYPE_PIPE) +#else + if (sc->server->pphrase_dialog_type == SSL_PPTYPE_PIPE +#endif + && cpPassPhraseCur != NULL + && nPassPhraseRetry < BUILTIN_DIALOG_RETRIES ) { + apr_file_printf(writetty, "Apache:mod_ssl:Error: Pass phrase incorrect " + "(%d more retr%s permitted).\n", + (BUILTIN_DIALOG_RETRIES-nPassPhraseRetry), + (BUILTIN_DIALOG_RETRIES-nPassPhraseRetry) == 1 ? "y" : "ies"); + nPassPhraseRetry++; + if (nPassPhraseRetry > BUILTIN_DIALOG_BACKOFF) + apr_sleep((nPassPhraseRetry-BUILTIN_DIALOG_BACKOFF) + * 5 * APR_USEC_PER_SEC); + continue; + } +#ifdef WIN32 + if (sc->server->pphrase_dialog_type == SSL_PPTYPE_BUILTIN) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, + "Init: SSLPassPhraseDialog builtin is not " + "supported on Win32 (key file " + "%s)", szPath); + ssl_die(); + } +#endif /* WIN32 */ + + /* + * Ok, anything else now means a fatal error. + */ + if (cpPassPhraseCur == NULL) { + if (nPassPhraseDialogCur && pkey_mtime && + !(isterm = isatty(fileno(stdout)))) /* XXX: apr_isatty() */ + { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, + pServ, + "Init: Unable to read pass phrase " + "[Hint: key introduced or changed " + "before restart?]"); + ssl_log_ssl_error(APLOG_MARK, APLOG_ERR, pServ); + } + else { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, + pServ, "Init: Private key not found"); + ssl_log_ssl_error(APLOG_MARK, APLOG_ERR, pServ); + } + if (writetty) { + apr_file_printf(writetty, "Apache:mod_ssl:Error: Private key not found.\n"); + apr_file_printf(writetty, "**Stopped\n"); + } + } + else { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, + pServ, "Init: Pass phrase incorrect"); + ssl_log_ssl_error(APLOG_MARK, APLOG_ERR, pServ); + + if (writetty) { + apr_file_printf(writetty, "Apache:mod_ssl:Error: Pass phrase incorrect.\n"); + apr_file_printf(writetty, "**Stopped\n"); + } + } + ssl_die(); + } + + if (pPrivateKey == NULL) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, + "Init: Unable to read server private key from " + "file %s [Hint: Perhaps it is in a separate file? " + " See SSLCertificateKeyFile]", szPath); + ssl_log_ssl_error(APLOG_MARK, APLOG_ERR, s); + ssl_die(); + } + + /* + * check algorithm type of private key and make + * sure only one private key per type is used. + */ + at = ssl_util_algotypeof(NULL, pPrivateKey); + an = ssl_util_algotypestr(at); + if (algoKey & at) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, + "Init: Multiple %s server private keys not " + "allowed", an); + ssl_log_ssl_error(APLOG_MARK, APLOG_ERR, s); + ssl_die(); + } + algoKey |= at; + + /* + * Log the type of reading + */ + if (nPassPhraseDialogCur == 0) { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, pServ, + "unencrypted %s private key - pass phrase not " + "required", an); + } + else { + if (cpPassPhraseCur != NULL) { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, + pServ, + "encrypted %s private key - pass phrase " + "requested", an); + } + else { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, + pServ, + "encrypted %s private key - pass phrase" + " reused", an); + } + } + + /* + * Ok, when we have one more pass phrase store it + */ + if (cpPassPhraseCur != NULL) { + cpp = (char **)apr_array_push(aPassPhrase); + *cpp = cpPassPhraseCur; + nPassPhrase++; + } + + /* + * Insert private key into the global module configuration + * (we convert it to a stand-alone DER byte sequence + * because the SSL library uses static variables inside a + * RSA structure which do not survive DSO reloads!) + */ + cp = asn1_table_vhost_key(mc, p, cpVHostID, an); + length = i2d_PrivateKey(pPrivateKey, NULL); + ucp = ssl_asn1_table_set(mc->tPrivateKey, cp, length); + (void)i2d_PrivateKey(pPrivateKey, &ucp); /* 2nd arg increments */ + + if (nPassPhraseDialogCur != 0) { + /* remember mtime of encrypted keys */ + asn1 = ssl_asn1_table_get(mc->tPrivateKey, cp); + asn1->source_mtime = pkey_mtime; + } + + /* + * Free the private key structure + */ + EVP_PKEY_free(pPrivateKey); + } + } + + /* + * Let the user know when we're successful. + */ + if (nPassPhraseDialog > 0) { + sc = mySrvConfig(s); + if (writetty) { + apr_file_printf(writetty, "\n"); + apr_file_printf(writetty, "Ok: Pass Phrase Dialog successful.\n"); + } + } + + /* + * Wipe out the used memory from the + * pass phrase array and then deallocate it + */ + if (aPassPhrase->nelts) { + pphrase_array_clear(aPassPhrase); + ap_log_error(APLOG_MARK, APLOG_INFO, 0, s, + "Init: Wiped out the queried pass phrases from memory"); + } + + /* Close the pipes if they were opened + */ + if (readtty) { + apr_file_close(readtty); + apr_file_close(writetty); + readtty = writetty = NULL; + } + return; +} + +static apr_status_t ssl_pipe_child_create(apr_pool_t *p, const char *progname) +{ + /* Child process code for 'ErrorLog "|..."'; + * may want a common framework for this, since I expect it will + * be common for other foo-loggers to want this sort of thing... + */ + apr_status_t rc; + apr_procattr_t *procattr; + apr_proc_t *procnew; + + if (((rc = apr_procattr_create(&procattr, p)) == APR_SUCCESS) && + ((rc = apr_procattr_io_set(procattr, + APR_FULL_BLOCK, + APR_FULL_BLOCK, + APR_NO_PIPE)) == APR_SUCCESS)) { + char **args; + const char *pname; + + apr_tokenize_to_argv(progname, &args, p); + pname = apr_pstrdup(p, args[0]); + procnew = (apr_proc_t *)apr_pcalloc(p, sizeof(*procnew)); + rc = apr_proc_create(procnew, pname, (const char * const *)args, + NULL, procattr, p); + if (rc == APR_SUCCESS) { + /* XXX: not sure if we aught to... + * apr_pool_note_subprocess(p, procnew, APR_KILL_AFTER_TIMEOUT); + */ + writetty = procnew->in; + readtty = procnew->out; + } + } + + return rc; +} + +static int pipe_get_passwd_cb(char *buf, int length, char *prompt, int verify) +{ + apr_status_t rc; + char *p; + + apr_file_puts(prompt, writetty); + + buf[0]='\0'; + rc = apr_file_gets(buf, length, readtty); + apr_file_puts(APR_EOL_STR, writetty); + + if (rc != APR_SUCCESS || apr_file_eof(readtty)) { + memset(buf, 0, length); + return 1; /* failure */ + } + if ((p = strchr(buf, '\n')) != NULL) { + *p = '\0'; + } +#ifdef WIN32 + /* XXX: apr_sometest */ + if ((p = strchr(buf, '\r')) != NULL) { + *p = '\0'; + } +#endif + return 0; +} + +#ifdef SSLC_VERSION_NUMBER +int ssl_pphrase_Handle_CB(char *buf, int bufsize, int verify) +{ + void *srv = ssl_pphrase_server_rec; +#else +int ssl_pphrase_Handle_CB(char *buf, int bufsize, int verify, void *srv) +{ +#endif + SSLModConfigRec *mc; + server_rec *s; + apr_pool_t *p; + apr_array_header_t *aPassPhrase; + SSLSrvConfigRec *sc; + int *pnPassPhraseCur; + char **cppPassPhraseCur; + char *cpVHostID; + char *cpAlgoType; + int *pnPassPhraseDialog; + int *pnPassPhraseDialogCur; + BOOL *pbPassPhraseDialogOnce; + char *cpp; + int len = -1; + + mc = myModConfig((server_rec *)srv); + + /* + * Reconnect to the context of ssl_phrase_Handle() + */ + s = myCtxVarGet(mc, 1, server_rec *); + p = myCtxVarGet(mc, 2, apr_pool_t *); + aPassPhrase = myCtxVarGet(mc, 3, apr_array_header_t *); + pnPassPhraseCur = myCtxVarGet(mc, 4, int *); + cppPassPhraseCur = myCtxVarGet(mc, 5, char **); + cpVHostID = myCtxVarGet(mc, 6, char *); + cpAlgoType = myCtxVarGet(mc, 7, char *); + pnPassPhraseDialog = myCtxVarGet(mc, 8, int *); + pnPassPhraseDialogCur = myCtxVarGet(mc, 9, int *); + pbPassPhraseDialogOnce = myCtxVarGet(mc, 10, BOOL *); + sc = mySrvConfig(s); + + (*pnPassPhraseDialog)++; + (*pnPassPhraseDialogCur)++; + + /* + * When remembered pass phrases are available use them... + */ + if ((cpp = pphrase_array_get(aPassPhrase, *pnPassPhraseCur)) != NULL) { + apr_cpystrn(buf, cpp, bufsize); + len = strlen(buf); + return len; + } + + /* + * Builtin or Pipe dialog + */ + if (sc->server->pphrase_dialog_type == SSL_PPTYPE_BUILTIN + || sc->server->pphrase_dialog_type == SSL_PPTYPE_PIPE) { + char *prompt; + int i; + + if (sc->server->pphrase_dialog_type == SSL_PPTYPE_PIPE) { + if (!readtty) { + ap_log_error(APLOG_MARK, APLOG_INFO, 0, s, + "Init: Creating pass phrase dialog pipe child " + "'%s'", sc->server->pphrase_dialog_path); + if (ssl_pipe_child_create(p, sc->server->pphrase_dialog_path) + != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, + "Init: Failed to create pass phrase pipe '%s'", + sc->server->pphrase_dialog_path); + PEMerr(PEM_F_DEF_CALLBACK,PEM_R_PROBLEMS_GETTING_PASSWORD); + memset(buf, 0, (unsigned int)bufsize); + return (-1); + } + } + ap_log_error(APLOG_MARK, APLOG_INFO, 0, s, + "Init: Requesting pass phrase via piped dialog"); + } + else { /* sc->server->pphrase_dialog_type == SSL_PPTYPE_BUILTIN */ +#ifdef WIN32 + PEMerr(PEM_F_DEF_CALLBACK,PEM_R_PROBLEMS_GETTING_PASSWORD); + memset(buf, 0, (unsigned int)bufsize); + return (-1); +#else + /* + * stderr has already been redirected to the error_log. + * rather than attempting to temporarily rehook it to the terminal, + * we print the prompt to stdout before EVP_read_pw_string turns + * off tty echo + */ + apr_file_open_stdout(&writetty, p); + + ap_log_error(APLOG_MARK, APLOG_INFO, 0, s, + "Init: Requesting pass phrase via builtin terminal " + "dialog"); +#endif + } + + /* + * The first time display a header to inform the user about what + * program he actually speaks to, which module is responsible for + * this terminal dialog and why to the hell he has to enter + * something... + */ + if (*pnPassPhraseDialog == 1) { + apr_file_printf(writetty, "%s mod_ssl/%s (Pass Phrase Dialog)\n", + AP_SERVER_BASEVERSION, MOD_SSL_VERSION); + apr_file_printf(writetty, "Some of your private key files are encrypted for security reasons.\n"); + apr_file_printf(writetty, "In order to read them you have to provide us with the pass phrases.\n"); + } + if (*pbPassPhraseDialogOnce) { + *pbPassPhraseDialogOnce = FALSE; + apr_file_printf(writetty, "\n"); + apr_file_printf(writetty, "Server %s (%s)\n", cpVHostID, cpAlgoType); + } + + /* + * Emulate the OpenSSL internal pass phrase dialog + * (see crypto/pem/pem_lib.c:def_callback() for details) + */ + prompt = "Enter pass phrase:"; + + for (;;) { + apr_file_puts(prompt, writetty); + if (sc->server->pphrase_dialog_type == SSL_PPTYPE_PIPE) { + i = pipe_get_passwd_cb(buf, bufsize, "", FALSE); + } + else { /* sc->server->pphrase_dialog_type == SSL_PPTYPE_BUILTIN */ + i = EVP_read_pw_string(buf, bufsize, "", FALSE); + } + if (i != 0) { + PEMerr(PEM_F_DEF_CALLBACK,PEM_R_PROBLEMS_GETTING_PASSWORD); + memset(buf, 0, (unsigned int)bufsize); + return (-1); + } + len = strlen(buf); + if (len < 1) + apr_file_printf(writetty, "Apache:mod_ssl:Error: Pass phrase empty (needs to be at least 1 character).\n"); + else + break; + } + } + + /* + * Filter program + */ + else if (sc->server->pphrase_dialog_type == SSL_PPTYPE_FILTER) { + const char *cmd = sc->server->pphrase_dialog_path; + const char **argv = apr_palloc(p, sizeof(char *) * 4); + char *result; + + ap_log_error(APLOG_MARK, APLOG_INFO, 0, s, + "Init: Requesting pass phrase from dialog filter " + "program (%s)", cmd); + + argv[0] = cmd; + argv[1] = cpVHostID; + argv[2] = cpAlgoType; + argv[3] = NULL; + + result = ssl_util_readfilter(s, p, cmd, argv); + apr_cpystrn(buf, result, bufsize); + len = strlen(buf); + } + + /* + * Ok, we now have the pass phrase, so give it back + */ + *cppPassPhraseCur = apr_pstrdup(p, buf); + + /* + * And return it's length to OpenSSL... + */ + return (len); +} + diff --git a/rubbos/app/httpd-2.0.64/modules/ssl/ssl_engine_rand.c b/rubbos/app/httpd-2.0.64/modules/ssl/ssl_engine_rand.c new file mode 100644 index 00000000..b640e3f9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/ssl/ssl_engine_rand.c @@ -0,0 +1,179 @@ +/* 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. + */ + +/* _ _ + * _ __ ___ ___ __| | ___ ___| | mod_ssl + * | '_ ` _ \ / _ \ / _` | / __/ __| | Apache Interface to OpenSSL + * | | | | | | (_) | (_| | \__ \__ \ | + * |_| |_| |_|\___/ \__,_|___|___/___/_| + * |_____| + * ssl_engine_rand.c + * Random Number Generator Seeding + */ + /* ``The generation of random + numbers is too important + to be left to chance.'' */ + +#include "mod_ssl.h" + +/* _________________________________________________________________ +** +** Support for better seeding of SSL library's RNG +** _________________________________________________________________ +*/ + +static int ssl_rand_choosenum(int, int); +static int ssl_rand_feedfp(apr_pool_t *, apr_file_t *, int); + +int ssl_rand_seed(server_rec *s, apr_pool_t *p, ssl_rsctx_t nCtx, char *prefix) +{ + SSLModConfigRec *mc; + apr_array_header_t *apRandSeed; + ssl_randseed_t *pRandSeeds; + ssl_randseed_t *pRandSeed; + unsigned char stackdata[256]; + int nReq, nDone; + apr_file_t *fp; + int i, n, l; + + mc = myModConfig(s); + nReq = 0; + nDone = 0; + apRandSeed = mc->aRandSeed; + pRandSeeds = (ssl_randseed_t *)apRandSeed->elts; + for (i = 0; i < apRandSeed->nelts; i++) { + pRandSeed = &pRandSeeds[i]; + if (pRandSeed->nCtx == nCtx) { + nReq += pRandSeed->nBytes; + if (pRandSeed->nSrc == SSL_RSSRC_FILE) { + /* + * seed in contents of an external file + */ + if (apr_file_open(&fp, pRandSeed->cpPath, + APR_READ, APR_OS_DEFAULT, p) != APR_SUCCESS) + continue; + nDone += ssl_rand_feedfp(p, fp, pRandSeed->nBytes); + apr_file_close(fp); + } + else if (pRandSeed->nSrc == SSL_RSSRC_EXEC) { + const char *cmd = pRandSeed->cpPath; + const char **argv = apr_palloc(p, sizeof(char *) * 3); + /* + * seed in contents generated by an external program + */ + argv[0] = cmd; + argv[1] = apr_itoa(p, pRandSeed->nBytes); + argv[2] = NULL; + + if ((fp = ssl_util_ppopen(s, p, cmd, argv)) == NULL) + continue; + nDone += ssl_rand_feedfp(p, fp, pRandSeed->nBytes); + ssl_util_ppclose(s, p, fp); + } +#ifdef HAVE_SSL_RAND_EGD + else if (pRandSeed->nSrc == SSL_RSSRC_EGD) { + /* + * seed in contents provided by the external + * Entropy Gathering Daemon (EGD) + */ + if ((n = RAND_egd(pRandSeed->cpPath)) == -1) + continue; + nDone += n; + } +#endif + else if (pRandSeed->nSrc == SSL_RSSRC_BUILTIN) { + struct { + time_t t; + pid_t pid; + } my_seed; + + /* + * seed in the current time (usually just 4 bytes) + */ + my_seed.t = time(NULL); + + /* + * seed in the current process id (usually just 4 bytes) + */ + my_seed.pid = mc->pid; + + l = sizeof(my_seed); + RAND_seed((unsigned char *)&my_seed, l); + nDone += l; + + /* + * seed in some current state of the run-time stack (128 bytes) + */ + n = ssl_rand_choosenum(0, sizeof(stackdata)-128-1); + RAND_seed(stackdata+n, 128); + nDone += 128; + + } + } + } + ap_log_error(APLOG_MARK, APLOG_INFO, 0, s, + "%sSeeding PRNG with %d bytes of entropy", prefix, nDone); + + if (RAND_status() == 0) + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s, + "%sPRNG still contains insufficient entropy!", prefix); + + return nDone; +} + +#define BUFSIZE 8192 + +static int ssl_rand_feedfp(apr_pool_t *p, apr_file_t *fp, int nReq) +{ + apr_size_t nDone; + unsigned char caBuf[BUFSIZE]; + apr_size_t nBuf; + apr_size_t nRead; + apr_size_t nTodo; + + nDone = 0; + nRead = BUFSIZE; + nTodo = nReq; + while (1) { + if (nReq > 0) + nRead = (nTodo < BUFSIZE ? nTodo : BUFSIZE); + nBuf = nRead; + if (apr_file_read(fp, caBuf, &nBuf) != APR_SUCCESS) + break; + RAND_seed(caBuf, nBuf); + nDone += nBuf; + if (nReq > 0) { + nTodo -= nBuf; + if (nTodo <= 0) + break; + } + } + return nDone; +} + +static int ssl_rand_choosenum(int l, int h) +{ + int i; + char buf[50]; + + apr_snprintf(buf, sizeof(buf), "%.0f", + (((double)(rand()%RAND_MAX)/RAND_MAX)*(h-l))); + i = atoi(buf)+1; + if (i < l) i = l; + if (i > h) i = h; + return i; +} + diff --git a/rubbos/app/httpd-2.0.64/modules/ssl/ssl_engine_vars.c b/rubbos/app/httpd-2.0.64/modules/ssl/ssl_engine_vars.c new file mode 100644 index 00000000..661e99d8 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/ssl/ssl_engine_vars.c @@ -0,0 +1,687 @@ +/* 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. + */ + +/* _ _ + * _ __ ___ ___ __| | ___ ___| | mod_ssl + * | '_ ` _ \ / _ \ / _` | / __/ __| | Apache Interface to OpenSSL + * | | | | | | (_) | (_| | \__ \__ \ | + * |_| |_| |_|\___/ \__,_|___|___/___/_| + * |_____| + * ssl_engine_vars.c + * Variable Lookup Facility + */ + /* ``Those of you who think they + know everything are very annoying + to those of us who do.'' + -- Unknown */ +#include "mod_ssl.h" + +/* _________________________________________________________________ +** +** Variable Lookup +** _________________________________________________________________ +*/ + +static char *ssl_var_lookup_header(apr_pool_t *p, request_rec *r, const char *name); +static char *ssl_var_lookup_ssl(apr_pool_t *p, conn_rec *c, char *var); +static char *ssl_var_lookup_ssl_cert(apr_pool_t *p, X509 *xs, char *var); +static char *ssl_var_lookup_ssl_cert_dn(apr_pool_t *p, X509_NAME *xsname, char *var); +static char *ssl_var_lookup_ssl_cert_valid(apr_pool_t *p, ASN1_UTCTIME *tm); +static char *ssl_var_lookup_ssl_cert_serial(apr_pool_t *p, X509 *xs); +static char *ssl_var_lookup_ssl_cert_chain(apr_pool_t *p, STACK_OF(X509) *sk, char *var); +static char *ssl_var_lookup_ssl_cert_PEM(apr_pool_t *p, X509 *xs); +static char *ssl_var_lookup_ssl_cert_verify(apr_pool_t *p, conn_rec *c); +static char *ssl_var_lookup_ssl_cipher(apr_pool_t *p, conn_rec *c, char *var); +static void ssl_var_lookup_ssl_cipher_bits(SSL *ssl, int *usekeysize, int *algkeysize); +static char *ssl_var_lookup_ssl_version(apr_pool_t *pp, apr_pool_t *p, char *var); + +static int ssl_is_https(conn_rec *c) +{ + SSLConnRec *sslconn = myConnConfig(c); + return sslconn && sslconn->ssl; +} + +void ssl_var_register(void) +{ + APR_REGISTER_OPTIONAL_FN(ssl_is_https); + APR_REGISTER_OPTIONAL_FN(ssl_var_lookup); + return; +} + +/* This function must remain safe to use for a non-SSL connection. */ +char *ssl_var_lookup(apr_pool_t *p, server_rec *s, conn_rec *c, request_rec *r, char *var) +{ + SSLModConfigRec *mc = myModConfig(s); + char *result; + BOOL resdup; + apr_time_exp_t tm; + + result = NULL; + resdup = TRUE; + + /* + * When no pool is given try to find one + */ + if (p == NULL) { + if (r != NULL) + p = r->pool; + else if (c != NULL) + p = c->pool; + else + p = mc->pPool; + } + + /* + * Request dependent stuff + */ + if (r != NULL) { + if (strcEQ(var, "HTTP_USER_AGENT")) + result = ssl_var_lookup_header(p, r, "User-Agent"); + else if (strcEQ(var, "HTTP_REFERER")) + result = ssl_var_lookup_header(p, r, "Referer"); + else if (strcEQ(var, "HTTP_COOKIE")) + result = ssl_var_lookup_header(p, r, "Cookie"); + else if (strcEQ(var, "HTTP_FORWARDED")) + result = ssl_var_lookup_header(p, r, "Forwarded"); + else if (strcEQ(var, "HTTP_HOST")) + result = ssl_var_lookup_header(p, r, "Host"); + else if (strcEQ(var, "HTTP_PROXY_CONNECTION")) + result = ssl_var_lookup_header(p, r, "Proxy-Connection"); + else if (strcEQ(var, "HTTP_ACCEPT")) + result = ssl_var_lookup_header(p, r, "Accept"); + else if (strlen(var) > 5 && strcEQn(var, "HTTP:", 5)) + /* all other headers from which we are still not know about */ + result = ssl_var_lookup_header(p, r, var+5); + else if (strcEQ(var, "THE_REQUEST")) + result = r->the_request; + else if (strcEQ(var, "REQUEST_METHOD")) + result = (char *)(r->method); + else if (strcEQ(var, "REQUEST_SCHEME")) + result = (char *)ap_http_method(r); + else if (strcEQ(var, "REQUEST_URI")) + result = r->uri; + else if (strcEQ(var, "SCRIPT_FILENAME") || + strcEQ(var, "REQUEST_FILENAME")) + result = r->filename; + else if (strcEQ(var, "PATH_INFO")) + result = r->path_info; + else if (strcEQ(var, "QUERY_STRING")) + result = r->args; + else if (strcEQ(var, "REMOTE_HOST")) + result = (char *)ap_get_remote_host(r->connection, + r->per_dir_config, REMOTE_NAME, NULL); + else if (strcEQ(var, "REMOTE_IDENT")) + result = (char *)ap_get_remote_logname(r); + else if (strcEQ(var, "IS_SUBREQ")) + result = (r->main != NULL ? "true" : "false"); + else if (strcEQ(var, "DOCUMENT_ROOT")) + result = (char *)ap_document_root(r); + else if (strcEQ(var, "SERVER_ADMIN")) + result = r->server->server_admin; + else if (strcEQ(var, "SERVER_NAME")) + result = (char *)ap_get_server_name(r); + else if (strcEQ(var, "SERVER_PORT")) + result = apr_psprintf(p, "%u", ap_get_server_port(r)); + else if (strcEQ(var, "SERVER_PROTOCOL")) + result = r->protocol; + } + + /* + * Connection stuff + */ + if (result == NULL && c != NULL) { + SSLConnRec *sslconn = myConnConfig(c); + if (strcEQ(var, "REMOTE_ADDR")) + result = c->remote_ip; + else if (strcEQ(var, "REMOTE_USER")) + result = r->user; + else if (strcEQ(var, "AUTH_TYPE")) + result = r->ap_auth_type; + else if (strlen(var) > 4 && strcEQn(var, "SSL_", 4) + && sslconn && sslconn->ssl) + result = ssl_var_lookup_ssl(p, c, var+4); + else if (strcEQ(var, "HTTPS")) { + if (sslconn && sslconn->ssl) + result = "on"; + else + result = "off"; + } + } + + /* + * Totally independent stuff + */ + if (result == NULL) { + if (strlen(var) > 12 && strcEQn(var, "SSL_VERSION_", 12)) + result = ssl_var_lookup_ssl_version(s->process->pool, p, var+12); + else if (strcEQ(var, "SERVER_SOFTWARE")) + result = (char *)ap_get_server_version(); + else if (strcEQ(var, "API_VERSION")) { + result = apr_psprintf(p, "%d", MODULE_MAGIC_NUMBER); + resdup = FALSE; + } + else if (strcEQ(var, "TIME_YEAR")) { + apr_time_exp_lt(&tm, apr_time_now()); + result = apr_psprintf(p, "%02d%02d", + (tm.tm_year / 100) + 19, tm.tm_year % 100); + resdup = FALSE; + } +#define MKTIMESTR(format, tmfield) \ + apr_time_exp_lt(&tm, apr_time_now()); \ + result = apr_psprintf(p, format, tm.tmfield); \ + resdup = FALSE; + else if (strcEQ(var, "TIME_MON")) { + MKTIMESTR("%02d", tm_mon+1) + } + else if (strcEQ(var, "TIME_DAY")) { + MKTIMESTR("%02d", tm_mday) + } + else if (strcEQ(var, "TIME_HOUR")) { + MKTIMESTR("%02d", tm_hour) + } + else if (strcEQ(var, "TIME_MIN")) { + MKTIMESTR("%02d", tm_min) + } + else if (strcEQ(var, "TIME_SEC")) { + MKTIMESTR("%02d", tm_sec) + } + else if (strcEQ(var, "TIME_WDAY")) { + MKTIMESTR("%d", tm_wday) + } + else if (strcEQ(var, "TIME")) { + apr_time_exp_lt(&tm, apr_time_now()); + result = apr_psprintf(p, + "%02d%02d%02d%02d%02d%02d%02d", (tm.tm_year / 100) + 19, + (tm.tm_year % 100), tm.tm_mon+1, tm.tm_mday, + tm.tm_hour, tm.tm_min, tm.tm_sec); + resdup = FALSE; + } + /* all other env-variables from the parent Apache process */ + else if (strlen(var) > 4 && strcEQn(var, "ENV:", 4)) { + result = (char *)apr_table_get(r->notes, var+4); + if (result == NULL) + result = (char *)apr_table_get(r->subprocess_env, var+4); + if (result == NULL) + result = getenv(var+4); + } + } + + if (result != NULL && resdup) + result = apr_pstrdup(p, result); + if (result == NULL) + result = ""; + return result; +} + +static char *ssl_var_lookup_header(apr_pool_t *p, request_rec *r, const char *name) +{ + char *hdr = NULL; + + if ((hdr = (char *)apr_table_get(r->headers_in, name)) != NULL) + hdr = apr_pstrdup(p, hdr); + return hdr; +} + +static char *ssl_var_lookup_ssl(apr_pool_t *p, conn_rec *c, char *var) +{ + SSLConnRec *sslconn = myConnConfig(c); + char *result; + X509 *xs; + STACK_OF(X509) *sk; + SSL *ssl; + + result = NULL; + + ssl = sslconn->ssl; + if (strlen(var) > 8 && strcEQn(var, "VERSION_", 8)) { + result = ssl_var_lookup_ssl_version(c->base_server->process->pool, + p, var+8); + } + else if (ssl != NULL && strcEQ(var, "PROTOCOL")) { + result = (char *)SSL_get_version(ssl); + } + else if (ssl != NULL && strcEQ(var, "SESSION_ID")) { + char buf[SSL_SESSION_ID_STRING_LEN]; + SSL_SESSION *pSession = SSL_get_session(ssl); + if (pSession) { + result = apr_pstrdup(p, SSL_SESSION_id2sz( + SSL_SESSION_get_session_id(pSession), + SSL_SESSION_get_session_id_length(pSession), + buf, sizeof(buf))); + } + } + else if (ssl != NULL && strlen(var) >= 6 && strcEQn(var, "CIPHER", 6)) { + result = ssl_var_lookup_ssl_cipher(p, c, var+6); + } + else if (ssl != NULL && strlen(var) > 18 && strcEQn(var, "CLIENT_CERT_CHAIN_", 18)) { + sk = SSL_get_peer_cert_chain(ssl); + result = ssl_var_lookup_ssl_cert_chain(p, sk, var+18); + } + else if (ssl != NULL && strcEQ(var, "CLIENT_VERIFY")) { + result = ssl_var_lookup_ssl_cert_verify(p, c); + } + else if (ssl != NULL && strlen(var) > 7 && strcEQn(var, "CLIENT_", 7)) { + if ((xs = SSL_get_peer_certificate(ssl)) != NULL) { + result = ssl_var_lookup_ssl_cert(p, xs, var+7); + X509_free(xs); + } + } + else if (ssl != NULL && strlen(var) > 7 && strcEQn(var, "SERVER_", 7)) { + if ((xs = SSL_get_certificate(ssl)) != NULL) + result = ssl_var_lookup_ssl_cert(p, xs, var+7); + } + else if (ssl != NULL && strcEQ(var, "SECURE_RENEG")) { + int flag = 0; +#ifdef SSL_get_secure_renegotiation_support + flag = SSL_get_secure_renegotiation_support(ssl); +#endif + result = apr_pstrdup(p, flag ? "true" : "false"); + } + + return result; +} + +static char *ssl_var_lookup_ssl_cert(apr_pool_t *p, X509 *xs, char *var) +{ + char *result; + BOOL resdup; + X509_NAME *xsname; + int nid; + char *cp; + + result = NULL; + resdup = TRUE; + + if (strcEQ(var, "M_VERSION")) { + result = apr_psprintf(p, "%lu", X509_get_version(xs)+1); + resdup = FALSE; + } + else if (strcEQ(var, "M_SERIAL")) { + result = ssl_var_lookup_ssl_cert_serial(p, xs); + } + else if (strcEQ(var, "V_START")) { + result = ssl_var_lookup_ssl_cert_valid(p, X509_get_notBefore(xs)); + } + else if (strcEQ(var, "V_END")) { + result = ssl_var_lookup_ssl_cert_valid(p, X509_get_notAfter(xs)); + } + else if (strcEQ(var, "S_DN")) { + xsname = X509_get_subject_name(xs); + cp = X509_NAME_oneline(xsname, NULL, 0); + result = apr_pstrdup(p, cp); + modssl_free(cp); + resdup = FALSE; + } + else if (strlen(var) > 5 && strcEQn(var, "S_DN_", 5)) { + xsname = X509_get_subject_name(xs); + result = ssl_var_lookup_ssl_cert_dn(p, xsname, var+5); + resdup = FALSE; + } + else if (strcEQ(var, "I_DN")) { + xsname = X509_get_issuer_name(xs); + cp = X509_NAME_oneline(xsname, NULL, 0); + result = apr_pstrdup(p, cp); + modssl_free(cp); + resdup = FALSE; + } + else if (strlen(var) > 5 && strcEQn(var, "I_DN_", 5)) { + xsname = X509_get_issuer_name(xs); + result = ssl_var_lookup_ssl_cert_dn(p, xsname, var+5); + resdup = FALSE; + } + else if (strcEQ(var, "A_SIG")) { + nid = OBJ_obj2nid((ASN1_OBJECT *)X509_get_signature_algorithm(xs)); + result = apr_pstrdup(p, + (nid == NID_undef) ? "UNKNOWN" : OBJ_nid2ln(nid)); + resdup = FALSE; + } + else if (strcEQ(var, "A_KEY")) { + nid = OBJ_obj2nid((ASN1_OBJECT *)X509_get_key_algorithm(xs)); + result = apr_pstrdup(p, + (nid == NID_undef) ? "UNKNOWN" : OBJ_nid2ln(nid)); + resdup = FALSE; + } + else if (strcEQ(var, "CERT")) { + result = ssl_var_lookup_ssl_cert_PEM(p, xs); + } + + if (result != NULL && resdup) + result = apr_pstrdup(p, result); + return result; +} + +static const struct { + char *name; + int nid; +} ssl_var_lookup_ssl_cert_dn_rec[] = { + { "C", NID_countryName }, + { "ST", NID_stateOrProvinceName }, /* officially (RFC2156) */ + { "SP", NID_stateOrProvinceName }, /* compatibility (SSLeay) */ + { "L", NID_localityName }, + { "O", NID_organizationName }, + { "OU", NID_organizationalUnitName }, + { "CN", NID_commonName }, + { "T", NID_title }, + { "I", NID_initials }, + { "G", NID_givenName }, + { "S", NID_surname }, + { "D", NID_description }, +/* This has been removed in OpenSSL 0.9.8-dev. */ +#ifdef NID_uniqueIdentifier + { "UID", NID_uniqueIdentifier }, +#endif + { "Email", NID_pkcs9_emailAddress }, + { NULL, 0 } +}; + +static char *ssl_var_lookup_ssl_cert_dn(apr_pool_t *p, X509_NAME *xsname, char *var) +{ + char *result; + X509_NAME_ENTRY *xsne; + int i, j, n; + unsigned char *data_ptr; + int data_len; + + result = NULL; + + for (i = 0; ssl_var_lookup_ssl_cert_dn_rec[i].name != NULL; i++) { + if (strEQ(var, ssl_var_lookup_ssl_cert_dn_rec[i].name)) { + for (j = 0; j < sk_X509_NAME_ENTRY_num((STACK_OF(X509_NAME_ENTRY) *) + X509_NAME_get_entries(xsname)); + j++) { + xsne = sk_X509_NAME_ENTRY_value((STACK_OF(X509_NAME_ENTRY) *) + X509_NAME_get_entries(xsname), j); + + n =OBJ_obj2nid((ASN1_OBJECT *)X509_NAME_ENTRY_get_object(xsne)); + data_ptr = X509_NAME_ENTRY_get_data_ptr(xsne); + data_len = X509_NAME_ENTRY_get_data_len(xsne); + + if (n == ssl_var_lookup_ssl_cert_dn_rec[i].nid) { + result = apr_palloc(p, data_len+1); + apr_cpystrn(result, (char *)data_ptr, data_len+1); +#ifdef CHARSET_EBCDIC + ascii2ebcdic(result, result, xsne->value->length); +#endif /* CHARSET_EBCDIC */ + result[data_len] = NUL; + break; + } + } + break; + } + } + return result; +} + +static char *ssl_var_lookup_ssl_cert_valid(apr_pool_t *p, ASN1_UTCTIME *tm) +{ + char *result; + BIO* bio; + int n; + + if ((bio = BIO_new(BIO_s_mem())) == NULL) + return NULL; + ASN1_UTCTIME_print(bio, tm); + n = BIO_pending(bio); + result = apr_pcalloc(p, n+1); + n = BIO_read(bio, result, n); + result[n] = NUL; + BIO_free(bio); + return result; +} + +static char *ssl_var_lookup_ssl_cert_serial(apr_pool_t *p, X509 *xs) +{ + char *result; + BIO *bio; + int n; + + if ((bio = BIO_new(BIO_s_mem())) == NULL) + return NULL; + i2a_ASN1_INTEGER(bio, X509_get_serialNumber(xs)); + n = BIO_pending(bio); + result = apr_pcalloc(p, n+1); + n = BIO_read(bio, result, n); + result[n] = NUL; + BIO_free(bio); + return result; +} + +static char *ssl_var_lookup_ssl_cert_chain(apr_pool_t *p, STACK_OF(X509) *sk, char *var) +{ + char *result; + X509 *xs; + int n; + + result = NULL; + + if (strspn(var, "0123456789") == strlen(var)) { + n = atoi(var); + if (n < sk_X509_num(sk)) { + xs = sk_X509_value(sk, n); + result = ssl_var_lookup_ssl_cert_PEM(p, xs); + } + } + + return result; +} + +static char *ssl_var_lookup_ssl_cert_PEM(apr_pool_t *p, X509 *xs) +{ + char *result; + BIO *bio; + int n; + + if ((bio = BIO_new(BIO_s_mem())) == NULL) + return NULL; + PEM_write_bio_X509(bio, xs); + n = BIO_pending(bio); + result = apr_pcalloc(p, n+1); + n = BIO_read(bio, result, n); + result[n] = NUL; + BIO_free(bio); + return result; +} + +static char *ssl_var_lookup_ssl_cert_verify(apr_pool_t *p, conn_rec *c) +{ + SSLConnRec *sslconn = myConnConfig(c); + char *result; + long vrc; + const char *verr; + const char *vinfo; + SSL *ssl; + X509 *xs; + + result = NULL; + ssl = sslconn->ssl; + verr = sslconn->verify_error; + vinfo = sslconn->verify_info; + vrc = SSL_get_verify_result(ssl); + xs = SSL_get_peer_certificate(ssl); + + if (vrc == X509_V_OK && verr == NULL && vinfo == NULL && xs == NULL) + /* no client verification done at all */ + result = "NONE"; + else if (vrc == X509_V_OK && verr == NULL && vinfo == NULL && xs != NULL) + /* client verification done successful */ + result = "SUCCESS"; + else if (vrc == X509_V_OK && vinfo != NULL && strEQ(vinfo, "GENEROUS")) + /* client verification done in generous way */ + result = "GENEROUS"; + else + /* client verification failed */ + result = apr_psprintf(p, "FAILED:%s", verr); + + if (xs) + X509_free(xs); + return result; +} + +static char *ssl_var_lookup_ssl_cipher(apr_pool_t *p, conn_rec *c, char *var) +{ + SSLConnRec *sslconn = myConnConfig(c); + char *result; + BOOL resdup; + int usekeysize, algkeysize; + SSL *ssl; + + result = NULL; + resdup = TRUE; + + ssl = sslconn->ssl; + ssl_var_lookup_ssl_cipher_bits(ssl, &usekeysize, &algkeysize); + + if (ssl && strEQ(var, "")) { + SSL_CIPHER *cipher = SSL_get_current_cipher(ssl); + result = (cipher != NULL ? (char *)SSL_CIPHER_get_name(cipher) : NULL); + } + else if (strcEQ(var, "_EXPORT")) + result = (usekeysize < 56 ? "true" : "false"); + else if (strcEQ(var, "_USEKEYSIZE")) { + result = apr_psprintf(p, "%d", usekeysize); + resdup = FALSE; + } + else if (strcEQ(var, "_ALGKEYSIZE")) { + result = apr_psprintf(p, "%d", algkeysize); + resdup = FALSE; + } + + if (result != NULL && resdup) + result = apr_pstrdup(p, result); + return result; +} + +static void ssl_var_lookup_ssl_cipher_bits(SSL *ssl, int *usekeysize, int *algkeysize) +{ + SSL_CIPHER *cipher; + + *usekeysize = 0; + *algkeysize = 0; + if (ssl != NULL) + if ((cipher = SSL_get_current_cipher(ssl)) != NULL) + *usekeysize = SSL_CIPHER_get_bits(cipher, algkeysize); + return; +} + +static char *ssl_var_lookup_ssl_version(apr_pool_t *pp, apr_pool_t *p, char *var) +{ + static char interface[] = "mod_ssl/" MOD_SSL_VERSION; + static char library_interface[] = SSL_LIBRARY_TEXT; + static char *library = NULL; + char *result; + + if (!library) { + char *cp, *cp2; + library = apr_pstrdup(pp, SSL_LIBRARY_DYNTEXT); + if ((cp = strchr(library, ' ')) != NULL) { + *cp = '/'; + if ((cp2 = strchr(cp, ' ')) != NULL) + *cp2 = NUL; + } + if ((cp = strchr(library_interface, ' ')) != NULL) { + *cp = '/'; + if ((cp2 = strchr(cp, ' ')) != NULL) + *cp2 = NUL; + } + } + + if (strEQ(var, "INTERFACE")) { + result = apr_pstrdup(p, interface); + } + else if (strEQ(var, "LIBRARY_INTERFACE")) { + result = apr_pstrdup(p, library_interface); + } + else if (strEQ(var, "LIBRARY")) { + result = apr_pstrdup(p, library); + } + else { + result = NULL; + } + return result; +} + + +/* _________________________________________________________________ +** +** SSL Extension to mod_log_config +** _________________________________________________________________ +*/ + +#include "../../modules/loggers/mod_log_config.h" + +static const char *ssl_var_log_handler_c(request_rec *r, char *a); +static const char *ssl_var_log_handler_x(request_rec *r, char *a); + +/* + * register us for the mod_log_config function registering phase + * to establish %{...}c and to be able to expand %{...}x variables. + */ +void ssl_var_log_config_register(apr_pool_t *p) +{ + static APR_OPTIONAL_FN_TYPE(ap_register_log_handler) *log_pfn_register; + + log_pfn_register = APR_RETRIEVE_OPTIONAL_FN(ap_register_log_handler); + + if (log_pfn_register) { + log_pfn_register(p, "c", ssl_var_log_handler_c, 0); + log_pfn_register(p, "x", ssl_var_log_handler_x, 0); + } + return; +} + +/* + * implement the %{..}c log function + * (we are the only function) + */ +static const char *ssl_var_log_handler_c(request_rec *r, char *a) +{ + SSLConnRec *sslconn = myConnConfig(r->connection); + char *result; + + if (sslconn == NULL || sslconn->ssl == NULL) + return NULL; + result = NULL; + if (strEQ(a, "version")) + result = ssl_var_lookup(r->pool, r->server, r->connection, r, "SSL_PROTOCOL"); + else if (strEQ(a, "cipher")) + result = ssl_var_lookup(r->pool, r->server, r->connection, r, "SSL_CIPHER"); + else if (strEQ(a, "subjectdn") || strEQ(a, "clientcert")) + result = ssl_var_lookup(r->pool, r->server, r->connection, r, "SSL_CLIENT_S_DN"); + else if (strEQ(a, "issuerdn") || strEQ(a, "cacert")) + result = ssl_var_lookup(r->pool, r->server, r->connection, r, "SSL_CLIENT_I_DN"); + else if (strEQ(a, "errcode")) + result = "-"; + else if (strEQ(a, "errstr")) + result = (char *)sslconn->verify_error; + if (result != NULL && result[0] == NUL) + result = NULL; + return result; +} + +/* + * extend the implementation of the %{..}x log function + * (there can be more functions) + */ +static const char *ssl_var_log_handler_x(request_rec *r, char *a) +{ + char *result; + + result = ssl_var_lookup(r->pool, r->server, r->connection, r, a); + if (result != NULL && result[0] == NUL) + result = NULL; + return result; +} + diff --git a/rubbos/app/httpd-2.0.64/modules/ssl/ssl_expr.c b/rubbos/app/httpd-2.0.64/modules/ssl/ssl_expr.c new file mode 100644 index 00000000..19e3d757 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/ssl/ssl_expr.c @@ -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. + */ + +/* _ _ + * _ __ ___ ___ __| | ___ ___| | mod_ssl + * | '_ ` _ \ / _ \ / _` | / __/ __| | Apache Interface to OpenSSL + * | | | | | | (_) | (_| | \__ \__ \ | + * |_| |_| |_|\___/ \__,_|___|___/___/_| + * |_____| + * ssl_expr.c + * Expression Handling + */ + /* ``It is hard to fly with + the eagles when you work + with the turkeys.'' + -- Unknown */ +#include "mod_ssl.h" + +/* _________________________________________________________________ +** +** Expression Handling +** _________________________________________________________________ +*/ + +ssl_expr_info_type ssl_expr_info; +char *ssl_expr_error; + +ssl_expr *ssl_expr_comp(apr_pool_t *p, char *expr) +{ + ssl_expr_info.pool = p; + ssl_expr_info.inputbuf = expr; + ssl_expr_info.inputlen = strlen(expr); + ssl_expr_info.inputptr = ssl_expr_info.inputbuf; + ssl_expr_info.expr = FALSE; + + ssl_expr_error = NULL; + if (ssl_expr_yyparse()) + return NULL; + return ssl_expr_info.expr; +} + +char *ssl_expr_get_error(void) +{ + if (ssl_expr_error == NULL) + return ""; + return ssl_expr_error; +} + +ssl_expr *ssl_expr_make(ssl_expr_node_op op, void *a1, void *a2) +{ + ssl_expr *node; + + node = (ssl_expr *)apr_palloc(ssl_expr_info.pool, sizeof(ssl_expr)); + node->node_op = op; + node->node_arg1 = (char *)a1; + node->node_arg2 = (char *)a2; + return node; +} + +int ssl_expr_exec(request_rec *r, ssl_expr *expr) +{ + BOOL rc; + + rc = ssl_expr_eval(r, expr); + if (ssl_expr_error != NULL) + return (-1); + else + return (rc ? 1 : 0); +} diff --git a/rubbos/app/httpd-2.0.64/modules/ssl/ssl_expr.h b/rubbos/app/httpd-2.0.64/modules/ssl/ssl_expr.h new file mode 100644 index 00000000..20b9fbdb --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/ssl/ssl_expr.h @@ -0,0 +1,104 @@ +/* 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. + */ + +/* _ _ + * _ __ ___ ___ __| | ___ ___| | mod_ssl + * | '_ ` _ \ / _ \ / _` | / __/ __| | Apache Interface to OpenSSL + * | | | | | | (_) | (_| | \__ \__ \ | + * |_| |_| |_|\___/ \__,_|___|___/___/_| + * |_____| + * ssl_expr.h + * Expression Handling (Header) + */ + /* ``May all your PUSHes be POPed.'' */ + +#ifndef __SSL_EXPR_H__ +#define __SSL_EXPR_H__ + +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef TRUE +#define TRUE !FALSE +#endif + +#ifndef YY_NULL +#define YY_NULL 0 +#endif + +#ifndef MIN +#define MIN(a,b) (((a)<(b))?(a):(b)) +#endif + +#ifndef BOOL +#define BOOL unsigned int +#endif + +#ifndef NULL +#define NULL (void *)0 +#endif + +#ifndef NUL +#define NUL '\0' +#endif + +#ifndef YYDEBUG +#define YYDEBUG 0 +#endif + +typedef enum { + op_NOP, op_ListElement, + op_True, op_False, op_Not, op_Or, op_And, op_Comp, + op_EQ, op_NE, op_LT, op_LE, op_GT, op_GE, op_IN, op_REG, op_NRE, + op_Digit, op_String, op_Regex, op_Var, op_Func +} ssl_expr_node_op; + +typedef struct { + ssl_expr_node_op node_op; + void *node_arg1; + void *node_arg2; + apr_pool_t *p; +} ssl_expr_node; + +typedef ssl_expr_node ssl_expr; + +typedef struct { + apr_pool_t *pool; + char *inputbuf; + int inputlen; + char *inputptr; + ssl_expr *expr; +} ssl_expr_info_type; + +extern ssl_expr_info_type ssl_expr_info; +extern char *ssl_expr_error; + +#define yylval ssl_expr_yylval +#define yyerror ssl_expr_yyerror +#define yyinput ssl_expr_yyinput + +extern int ssl_expr_yyparse(void); +extern int ssl_expr_yyerror(char *); +extern int ssl_expr_yylex(void); + +extern ssl_expr *ssl_expr_comp(apr_pool_t *, char *); +extern int ssl_expr_exec(request_rec *, ssl_expr *); +extern char *ssl_expr_get_error(void); +extern ssl_expr *ssl_expr_make(ssl_expr_node_op, void *, void *); +extern BOOL ssl_expr_eval(request_rec *, ssl_expr *); + +#endif /* __SSL_EXPR_H__ */ diff --git a/rubbos/app/httpd-2.0.64/modules/ssl/ssl_expr_eval.c b/rubbos/app/httpd-2.0.64/modules/ssl/ssl_expr_eval.c new file mode 100644 index 00000000..30adeefc --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/ssl/ssl_expr_eval.c @@ -0,0 +1,254 @@ +/* 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. + */ + +/* _ _ + * _ __ ___ ___ __| | ___ ___| | mod_ssl + * | '_ ` _ \ / _ \ / _` | / __/ __| | Apache Interface to OpenSSL + * | | | | | | (_) | (_| | \__ \__ \ | + * |_| |_| |_|\___/ \__,_|___|___/___/_| + * |_____| + * ssl_expr_eval.c + * Expression Evaluation + */ + /* ``Make love, + not software!'' + -- Unknown */ +#include "mod_ssl.h" + +/* _________________________________________________________________ +** +** Expression Evaluation +** _________________________________________________________________ +*/ + +static BOOL ssl_expr_eval_comp(request_rec *, ssl_expr *); +static char *ssl_expr_eval_word(request_rec *, ssl_expr *); +static char *ssl_expr_eval_func_file(request_rec *, char *); +static int ssl_expr_eval_strcmplex(char *, char *); + +BOOL ssl_expr_eval(request_rec *r, ssl_expr *node) +{ + switch (node->node_op) { + case op_True: { + return TRUE; + } + case op_False: { + return FALSE; + } + case op_Not: { + ssl_expr *e = (ssl_expr *)node->node_arg1; + return (!ssl_expr_eval(r, e)); + } + case op_Or: { + ssl_expr *e1 = (ssl_expr *)node->node_arg1; + ssl_expr *e2 = (ssl_expr *)node->node_arg2; + return (ssl_expr_eval(r, e1) || ssl_expr_eval(r, e2)); + } + case op_And: { + ssl_expr *e1 = (ssl_expr *)node->node_arg1; + ssl_expr *e2 = (ssl_expr *)node->node_arg2; + return (ssl_expr_eval(r, e1) && ssl_expr_eval(r, e2)); + } + case op_Comp: { + ssl_expr *e = (ssl_expr *)node->node_arg1; + return ssl_expr_eval_comp(r, e); + } + default: { + ssl_expr_error = "Internal evaluation error: Unknown expression node"; + return FALSE; + } + } +} + +static BOOL ssl_expr_eval_comp(request_rec *r, ssl_expr *node) +{ + switch (node->node_op) { + case op_EQ: { + ssl_expr *e1 = (ssl_expr *)node->node_arg1; + ssl_expr *e2 = (ssl_expr *)node->node_arg2; + return (strcmp(ssl_expr_eval_word(r, e1), ssl_expr_eval_word(r, e2)) == 0); + } + case op_NE: { + ssl_expr *e1 = (ssl_expr *)node->node_arg1; + ssl_expr *e2 = (ssl_expr *)node->node_arg2; + return (strcmp(ssl_expr_eval_word(r, e1), ssl_expr_eval_word(r, e2)) != 0); + } + case op_LT: { + ssl_expr *e1 = (ssl_expr *)node->node_arg1; + ssl_expr *e2 = (ssl_expr *)node->node_arg2; + return (ssl_expr_eval_strcmplex(ssl_expr_eval_word(r, e1), ssl_expr_eval_word(r, e2)) < 0); + } + case op_LE: { + ssl_expr *e1 = (ssl_expr *)node->node_arg1; + ssl_expr *e2 = (ssl_expr *)node->node_arg2; + return (ssl_expr_eval_strcmplex(ssl_expr_eval_word(r, e1), ssl_expr_eval_word(r, e2)) <= 0); + } + case op_GT: { + ssl_expr *e1 = (ssl_expr *)node->node_arg1; + ssl_expr *e2 = (ssl_expr *)node->node_arg2; + return (ssl_expr_eval_strcmplex(ssl_expr_eval_word(r, e1), ssl_expr_eval_word(r, e2)) > 0); + } + case op_GE: { + ssl_expr *e1 = (ssl_expr *)node->node_arg1; + ssl_expr *e2 = (ssl_expr *)node->node_arg2; + return (ssl_expr_eval_strcmplex(ssl_expr_eval_word(r, e1), ssl_expr_eval_word(r, e2)) >= 0); + } + case op_IN: { + ssl_expr *e1 = (ssl_expr *)node->node_arg1; + ssl_expr *e2 = (ssl_expr *)node->node_arg2; + ssl_expr *e3; + char *w1 = ssl_expr_eval_word(r, e1); + BOOL found = FALSE; + do { + e3 = (ssl_expr *)e2->node_arg1; + e2 = (ssl_expr *)e2->node_arg2; + if (strcmp(w1, ssl_expr_eval_word(r, e3)) == 0) { + found = TRUE; + break; + } + } while (e2 != NULL); + return found; + } + case op_REG: { + ssl_expr *e1; + ssl_expr *e2; + char *word; + regex_t *regex; + + e1 = (ssl_expr *)node->node_arg1; + e2 = (ssl_expr *)node->node_arg2; + word = ssl_expr_eval_word(r, e1); + regex = (regex_t *)(e2->node_arg1); + return (ap_regexec(regex, word, 0, NULL, 0) == 0); + } + case op_NRE: { + ssl_expr *e1; + ssl_expr *e2; + char *word; + regex_t *regex; + + e1 = (ssl_expr *)node->node_arg1; + e2 = (ssl_expr *)node->node_arg2; + word = ssl_expr_eval_word(r, e1); + regex = (regex_t *)(e2->node_arg1); + return !(ap_regexec(regex, word, 0, NULL, 0) == 0); + } + default: { + ssl_expr_error = "Internal evaluation error: Unknown expression node"; + return FALSE; + } + } +} + +static char *ssl_expr_eval_word(request_rec *r, ssl_expr *node) +{ + switch (node->node_op) { + case op_Digit: { + char *string = (char *)node->node_arg1; + return string; + } + case op_String: { + char *string = (char *)node->node_arg1; + return string; + } + case op_Var: { + char *var = (char *)node->node_arg1; + char *val = ssl_var_lookup(r->pool, r->server, r->connection, r, var); + return (val == NULL ? "" : val); + } + case op_Func: { + char *name = (char *)node->node_arg1; + ssl_expr *args = (ssl_expr *)node->node_arg2; + if (strEQ(name, "file")) + return ssl_expr_eval_func_file(r, (char *)(args->node_arg1)); + else { + ssl_expr_error = "Internal evaluation error: Unknown function name"; + return ""; + } + } + default: { + ssl_expr_error = "Internal evaluation error: Unknown expression node"; + return FALSE; + } + } +} + +static char *ssl_expr_eval_func_file(request_rec *r, char *filename) +{ + apr_file_t *fp; + char *buf; + apr_off_t offset; + apr_size_t len; + apr_finfo_t finfo; + + if (apr_file_open(&fp, filename, APR_READ|APR_BUFFERED, + APR_OS_DEFAULT, r->pool) != APR_SUCCESS) { + ssl_expr_error = "Cannot open file"; + return ""; + } + apr_file_info_get(&finfo, APR_FINFO_SIZE, fp); + if ((finfo.size + 1) != ((apr_size_t)finfo.size + 1)) { + ssl_expr_error = "Huge file cannot be read"; + apr_file_close(fp); + return ""; + } + len = (apr_size_t)finfo.size; + if (len == 0) { + buf = (char *)apr_palloc(r->pool, sizeof(char) * 1); + *buf = NUL; + } + else { + if ((buf = (char *)apr_palloc(r->pool, sizeof(char)*(len+1))) == NULL) { + ssl_expr_error = "Cannot allocate memory"; + apr_file_close(fp); + return ""; + } + offset = 0; + apr_file_seek(fp, APR_SET, &offset); + if (apr_file_read(fp, buf, &len) != APR_SUCCESS) { + ssl_expr_error = "Cannot read from file"; + apr_file_close(fp); + return ""; + } + buf[len] = NUL; + } + apr_file_close(fp); + return buf; +} + +/* a variant of strcmp(3) which works correctly also for number strings */ +static int ssl_expr_eval_strcmplex(char *cpNum1, char *cpNum2) +{ + int i, n1, n2; + + if (cpNum1 == NULL) + return -1; + if (cpNum2 == NULL) + return +1; + n1 = strlen(cpNum1); + n2 = strlen(cpNum2); + if (n1 > n2) + return 1; + if (n1 < n2) + return -1; + for (i = 0; i < n1; i++) { + if (cpNum1[i] > cpNum2[i]) + return 1; + if (cpNum1[i] < cpNum2[i]) + return -1; + } + return 0; +} diff --git a/rubbos/app/httpd-2.0.64/modules/ssl/ssl_expr_parse.c b/rubbos/app/httpd-2.0.64/modules/ssl/ssl_expr_parse.c new file mode 100644 index 00000000..6f3f990e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/ssl/ssl_expr_parse.c @@ -0,0 +1,1081 @@ + +/* A Bison parser, made from ssl_expr_parse.y + by GNU Bison version 1.28 */ + +#define YYBISON 1 /* Identify Bison output. */ + +#define T_TRUE 257 +#define T_FALSE 258 +#define T_DIGIT 259 +#define T_ID 260 +#define T_STRING 261 +#define T_REGEX 262 +#define T_REGEX_I 263 +#define T_FUNC_FILE 264 +#define T_OP_EQ 265 +#define T_OP_NE 266 +#define T_OP_LT 267 +#define T_OP_LE 268 +#define T_OP_GT 269 +#define T_OP_GE 270 +#define T_OP_REG 271 +#define T_OP_NRE 272 +#define T_OP_IN 273 +#define T_OP_OR 274 +#define T_OP_AND 275 +#define T_OP_NOT 276 + +#line 68 "ssl_expr_parse.y" + +#include "mod_ssl.h" + +#line 72 "ssl_expr_parse.y" +typedef union { + char *cpVal; + ssl_expr *exVal; +} YYSTYPE; +#include + +#ifndef __cplusplus +#ifndef __STDC__ +#define const +#endif +#endif + + + +#define YYFINAL 53 +#define YYFLAG -32768 +#define YYNTBASE 29 + +#define YYTRANSLATE(x) ((unsigned)(x) <= 276 ? ssl_expr_yytranslate[x] : 36) + +static const char ssl_expr_yytranslate[] = { 0, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 28, 2, 2, 23, + 24, 2, 2, 27, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 25, 2, 26, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 1, 3, 4, 5, 6, + 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22 +}; + +#if YYDEBUG != 0 +static const short ssl_expr_yyprhs[] = { 0, + 0, 2, 4, 6, 9, 13, 17, 19, 23, 27, + 31, 35, 39, 43, 47, 53, 57, 61, 63, 67, + 69, 71, 76, 78, 80, 82 +}; + +static const short ssl_expr_yyrhs[] = { 30, + 0, 3, 0, 4, 0, 22, 30, 0, 30, 20, + 30, 0, 30, 21, 30, 0, 31, 0, 23, 30, + 24, 0, 33, 11, 33, 0, 33, 12, 33, 0, + 33, 13, 33, 0, 33, 14, 33, 0, 33, 15, + 33, 0, 33, 16, 33, 0, 33, 19, 25, 32, + 26, 0, 33, 17, 34, 0, 33, 18, 34, 0, + 33, 0, 32, 27, 33, 0, 5, 0, 7, 0, + 28, 25, 6, 26, 0, 35, 0, 8, 0, 9, + 0, 10, 23, 7, 24, 0 +}; + +#endif + +#if YYDEBUG != 0 +static const short ssl_expr_yyrline[] = { 0, + 115, 118, 119, 120, 121, 122, 123, 124, 127, 128, + 129, 130, 131, 132, 133, 134, 135, 138, 139, 142, + 143, 144, 145, 148, 158, 170 +}; +#endif + + +#if YYDEBUG != 0 || defined (YYERROR_VERBOSE) + +static const char * const ssl_expr_yytname[] = { "$","error","$undefined.","T_TRUE", +"T_FALSE","T_DIGIT","T_ID","T_STRING","T_REGEX","T_REGEX_I","T_FUNC_FILE","T_OP_EQ", +"T_OP_NE","T_OP_LT","T_OP_LE","T_OP_GT","T_OP_GE","T_OP_REG","T_OP_NRE","T_OP_IN", +"T_OP_OR","T_OP_AND","T_OP_NOT","'('","')'","'{'","'}'","','","'%'","root","expr", +"comparison","words","word","regex","funccall", NULL +}; +#endif + +static const short ssl_expr_yyr1[] = { 0, + 29, 30, 30, 30, 30, 30, 30, 30, 31, 31, + 31, 31, 31, 31, 31, 31, 31, 32, 32, 33, + 33, 33, 33, 34, 34, 35 +}; + +static const short ssl_expr_yyr2[] = { 0, + 1, 1, 1, 2, 3, 3, 1, 3, 3, 3, + 3, 3, 3, 3, 5, 3, 3, 1, 3, 1, + 1, 4, 1, 1, 1, 4 +}; + +static const short ssl_expr_yydefact[] = { 0, + 2, 3, 20, 21, 0, 0, 0, 0, 1, 7, + 0, 23, 0, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, + 5, 6, 9, 10, 11, 12, 13, 14, 24, 25, + 16, 17, 0, 26, 22, 0, 18, 15, 0, 19, + 0, 0, 0 +}; + +static const short ssl_expr_yydefgoto[] = { 51, + 9, 10, 46, 11, 41, 12 +}; + +static const short ssl_expr_yypact[] = { 3, +-32768,-32768,-32768,-32768, -11, 3, 3, -10, 0,-32768, + 22,-32768, 16,-32768, -2, 23, 3, 3, 4, 4, + 4, 4, 4, 4, 34, 34, 21, 24,-32768, 25, + 26,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768,-32768, +-32768,-32768, 4,-32768,-32768, 18,-32768,-32768, 4,-32768, + 49, 50,-32768 +}; + +static const short ssl_expr_yypgoto[] = {-32768, + 10,-32768,-32768, -19, 27,-32768 +}; + + +#define YYLAST 53 + + +static const short ssl_expr_yytable[] = { 33, + 34, 35, 36, 37, 38, 1, 2, 3, 3, 4, + 4, 13, 5, 5, 16, 14, 15, 17, 18, 17, + 18, 29, 28, 47, 6, 7, 31, 32, 30, 50, + 8, 8, 19, 20, 21, 22, 23, 24, 25, 26, + 27, 39, 40, 48, 49, 43, 18, 44, 52, 53, + 45, 0, 42 +}; + +static const short ssl_expr_yycheck[] = { 19, + 20, 21, 22, 23, 24, 3, 4, 5, 5, 7, + 7, 23, 10, 10, 25, 6, 7, 20, 21, 20, + 21, 24, 7, 43, 22, 23, 17, 18, 6, 49, + 28, 28, 11, 12, 13, 14, 15, 16, 17, 18, + 19, 8, 9, 26, 27, 25, 21, 24, 0, 0, + 26, -1, 26 +}; +/* -*-C-*- Note some compilers choke on comments on `#line' lines. */ +#line 3 "/usr/local/share/bison.simple" +/* This file comes from bison-1.28. */ + +/* Skeleton output parser for bison, + Copyright (C) 1984, 1989, 1990 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +/* This is the parser code that is written into each bison parser + when the %semantic_parser declaration is not specified in the grammar. + It was written by Richard Stallman by simplifying the hairy parser + used when %semantic_parser is specified. */ + +#ifndef YYSTACK_USE_ALLOCA +#ifdef alloca +#define YYSTACK_USE_ALLOCA +#else /* alloca not defined */ +#ifdef __GNUC__ +#define YYSTACK_USE_ALLOCA +#define alloca __builtin_alloca +#else /* not GNU C. */ +#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) || defined (__sparc) || defined (__sgi) || (defined (__sun) && defined (__i386)) +#define YYSTACK_USE_ALLOCA +#include +#else /* not sparc */ +/* We think this test detects Watcom and Microsoft C. */ +/* This used to test MSDOS, but that is a bad idea + since that symbol is in the user namespace. */ +#if (defined (_MSDOS) || defined (_MSDOS_)) && !defined (__TURBOC__) +#if 0 /* No need for malloc.h, which pollutes the namespace; + instead, just don't use alloca. */ +#include +#endif +#else /* not MSDOS, or __TURBOC__ */ +#if defined(_AIX) +/* I don't know what this was needed for, but it pollutes the namespace. + So I turned it off. rms, 2 May 1997. */ +/* #include */ +#pragma alloca +#define YYSTACK_USE_ALLOCA +#else /* not MSDOS, or __TURBOC__, or _AIX */ +#if 0 +#ifdef __hpux /* haible@ilog.fr says this works for HPUX 9.05 and up, + and on HPUX 10. Eventually we can turn this on. */ +#define YYSTACK_USE_ALLOCA +#define alloca __builtin_alloca +#endif /* __hpux */ +#endif +#endif /* not _AIX */ +#endif /* not MSDOS, or __TURBOC__ */ +#endif /* not sparc */ +#endif /* not GNU C */ +#endif /* alloca not defined */ +#endif /* YYSTACK_USE_ALLOCA not defined */ + +#ifdef YYSTACK_USE_ALLOCA +#define YYSTACK_ALLOC alloca +#else +#define YYSTACK_ALLOC malloc +#endif + +/* Note: there must be only one dollar sign in this file. + It is replaced by the list of actions, each action + as one case of the switch. */ + +#define ssl_expr_yyerrok (ssl_expr_yyerrstatus = 0) +#define ssl_expr_yyclearin (ssl_expr_yychar = YYEMPTY) +#define YYEMPTY -2 +#define YYEOF 0 +#define YYACCEPT goto ssl_expr_yyacceptlab +#define YYABORT goto ssl_expr_yyabortlab +#define YYERROR goto ssl_expr_yyerrlab1 +/* Like YYERROR except do call ssl_expr_yyerror. + This remains here temporarily to ease the + transition to the new meaning of YYERROR, for GCC. + Once GCC version 2 has supplanted version 1, this can go. */ +#define YYFAIL goto ssl_expr_yyerrlab +#define YYRECOVERING() (!!ssl_expr_yyerrstatus) +#define YYBACKUP(token, value) \ +do \ + if (ssl_expr_yychar == YYEMPTY && ssl_expr_yylen == 1) \ + { ssl_expr_yychar = (token), ssl_expr_yylval = (value); \ + ssl_expr_yychar1 = YYTRANSLATE (ssl_expr_yychar); \ + YYPOPSTACK; \ + goto ssl_expr_yybackup; \ + } \ + else \ + { ssl_expr_yyerror ("syntax error: cannot back up"); YYERROR; } \ +while (0) + +#define YYTERROR 1 +#define YYERRCODE 256 + +#ifndef YYPURE +#define YYLEX ssl_expr_yylex() +#endif + +#ifdef YYPURE +#ifdef YYLSP_NEEDED +#ifdef YYLEX_PARAM +#define YYLEX ssl_expr_yylex(&ssl_expr_yylval, &ssl_expr_yylloc, YYLEX_PARAM) +#else +#define YYLEX ssl_expr_yylex(&ssl_expr_yylval, &ssl_expr_yylloc) +#endif +#else /* not YYLSP_NEEDED */ +#ifdef YYLEX_PARAM +#define YYLEX ssl_expr_yylex(&ssl_expr_yylval, YYLEX_PARAM) +#else +#define YYLEX ssl_expr_yylex(&ssl_expr_yylval) +#endif +#endif /* not YYLSP_NEEDED */ +#endif + +/* If nonreentrant, generate the variables here */ + +#ifndef YYPURE + +int ssl_expr_yychar; /* the lookahead symbol */ +YYSTYPE ssl_expr_yylval; /* the semantic value of the */ + /* lookahead symbol */ + +#ifdef YYLSP_NEEDED +YYLTYPE ssl_expr_yylloc; /* location data for the lookahead */ + /* symbol */ +#endif + +int ssl_expr_yynerrs; /* number of parse errors so far */ +#endif /* not YYPURE */ + +#if YYDEBUG != 0 +int ssl_expr_yydebug; /* nonzero means print parse trace */ +/* Since this is uninitialized, it does not stop multiple parsers + from coexisting. */ +#endif + +/* YYINITDEPTH indicates the initial size of the parser's stacks */ + +#ifndef YYINITDEPTH +#define YYINITDEPTH 200 +#endif + +/* YYMAXDEPTH is the maximum size the stacks can grow to + (effective only if the built-in stack extension method is used). */ + +#if YYMAXDEPTH == 0 +#undef YYMAXDEPTH +#endif + +#ifndef YYMAXDEPTH +#define YYMAXDEPTH 10000 +#endif + +/* Define __ssl_expr_yy_memcpy. Note that the size argument + should be passed with type unsigned int, because that is what the non-GCC + definitions require. With GCC, __builtin_memcpy takes an arg + of type size_t, but it can handle unsigned int. */ + +#if __GNUC__ > 1 /* GNU C and GNU C++ define this. */ +#define __ssl_expr_yy_memcpy(TO,FROM,COUNT) __builtin_memcpy(TO,FROM,COUNT) +#else /* not GNU C or C++ */ +#ifndef __cplusplus + +/* This is the most reliable way to avoid incompatibilities + in available built-in functions on various systems. */ +static void +__ssl_expr_yy_memcpy (to, from, count) + char *to; + char *from; + unsigned int count; +{ + register char *f = from; + register char *t = to; + register int i = count; + + while (i-- > 0) + *t++ = *f++; +} + +#else /* __cplusplus */ + +/* This is the most reliable way to avoid incompatibilities + in available built-in functions on various systems. */ +static void +__ssl_expr_yy_memcpy (char *to, char *from, unsigned int count) +{ + register char *t = to; + register char *f = from; + register int i = count; + + while (i-- > 0) + *t++ = *f++; +} + +#endif +#endif + +#line 217 "/usr/local/share/bison.simple" + +/* The user can define YYPARSE_PARAM as the name of an argument to be passed + into ssl_expr_yyparse. The argument should have type void *. + It should actually point to an object. + Grammar actions can access the variable by casting it + to the proper pointer type. */ + +#ifdef YYPARSE_PARAM +#ifdef __cplusplus +#define YYPARSE_PARAM_ARG void *YYPARSE_PARAM +#define YYPARSE_PARAM_DECL +#else /* not __cplusplus */ +#define YYPARSE_PARAM_ARG YYPARSE_PARAM +#define YYPARSE_PARAM_DECL void *YYPARSE_PARAM; +#endif /* not __cplusplus */ +#else /* not YYPARSE_PARAM */ +#define YYPARSE_PARAM_ARG +#define YYPARSE_PARAM_DECL +#endif /* not YYPARSE_PARAM */ + +/* Prevent warning if -Wstrict-prototypes. */ +#ifdef __GNUC__ +#ifdef YYPARSE_PARAM +int ssl_expr_yyparse (void *); +#else +int ssl_expr_yyparse (void); +#endif +#endif + +int +ssl_expr_yyparse(YYPARSE_PARAM_ARG) + YYPARSE_PARAM_DECL +{ + register int ssl_expr_yystate; + register int ssl_expr_yyn; + register short *ssl_expr_yyssp; + register YYSTYPE *ssl_expr_yyvsp; + int ssl_expr_yyerrstatus; /* number of tokens to shift before error messages enabled */ + int ssl_expr_yychar1 = 0; /* lookahead token as an internal (translated) token number */ + + short ssl_expr_yyssa[YYINITDEPTH]; /* the state stack */ + YYSTYPE ssl_expr_yyvsa[YYINITDEPTH]; /* the semantic value stack */ + + short *ssl_expr_yyss = ssl_expr_yyssa; /* refer to the stacks thru separate pointers */ + YYSTYPE *ssl_expr_yyvs = ssl_expr_yyvsa; /* to allow ssl_expr_yyoverflow to reallocate them elsewhere */ + +#ifdef YYLSP_NEEDED + YYLTYPE ssl_expr_yylsa[YYINITDEPTH]; /* the location stack */ + YYLTYPE *ssl_expr_yyls = ssl_expr_yylsa; + YYLTYPE *ssl_expr_yylsp; + +#define YYPOPSTACK (ssl_expr_yyvsp--, ssl_expr_yyssp--, ssl_expr_yylsp--) +#else +#define YYPOPSTACK (ssl_expr_yyvsp--, ssl_expr_yyssp--) +#endif + + int ssl_expr_yystacksize = YYINITDEPTH; + int ssl_expr_yyfree_stacks = 0; + +#ifdef YYPURE + int ssl_expr_yychar; + YYSTYPE ssl_expr_yylval; + int ssl_expr_yynerrs; +#ifdef YYLSP_NEEDED + YYLTYPE ssl_expr_yylloc; +#endif +#endif + + YYSTYPE ssl_expr_yyval; /* the variable used to return */ + /* semantic values from the action */ + /* routines */ + + int ssl_expr_yylen; + +#if YYDEBUG != 0 + if (ssl_expr_yydebug) + fprintf(stderr, "Starting parse\n"); +#endif + + ssl_expr_yystate = 0; + ssl_expr_yyerrstatus = 0; + ssl_expr_yynerrs = 0; + ssl_expr_yychar = YYEMPTY; /* Cause a token to be read. */ + + /* Initialize stack pointers. + Waste one element of value and location stack + so that they stay on the same level as the state stack. + The wasted elements are never initialized. */ + + ssl_expr_yyssp = ssl_expr_yyss - 1; + ssl_expr_yyvsp = ssl_expr_yyvs; +#ifdef YYLSP_NEEDED + ssl_expr_yylsp = ssl_expr_yyls; +#endif + +/* Push a new state, which is found in ssl_expr_yystate . */ +/* In all cases, when you get here, the value and location stacks + have just been pushed. so pushing a state here evens the stacks. */ +ssl_expr_yynewstate: + + *++ssl_expr_yyssp = ssl_expr_yystate; + + if (ssl_expr_yyssp >= ssl_expr_yyss + ssl_expr_yystacksize - 1) + { + /* Give user a chance to reallocate the stack */ + /* Use copies of these so that the &'s don't force the real ones into memory. */ + YYSTYPE *ssl_expr_yyvs1 = ssl_expr_yyvs; + short *ssl_expr_yyss1 = ssl_expr_yyss; +#ifdef YYLSP_NEEDED + YYLTYPE *ssl_expr_yyls1 = ssl_expr_yyls; +#endif + + /* Get the current used size of the three stacks, in elements. */ + int size = ssl_expr_yyssp - ssl_expr_yyss + 1; + +#ifdef ssl_expr_yyoverflow + /* Each stack pointer address is followed by the size of + the data in use in that stack, in bytes. */ +#ifdef YYLSP_NEEDED + /* This used to be a conditional around just the two extra args, + but that might be undefined if ssl_expr_yyoverflow is a macro. */ + ssl_expr_yyoverflow("parser stack overflow", + &ssl_expr_yyss1, size * sizeof (*ssl_expr_yyssp), + &ssl_expr_yyvs1, size * sizeof (*ssl_expr_yyvsp), + &ssl_expr_yyls1, size * sizeof (*ssl_expr_yylsp), + &ssl_expr_yystacksize); +#else + ssl_expr_yyoverflow("parser stack overflow", + &ssl_expr_yyss1, size * sizeof (*ssl_expr_yyssp), + &ssl_expr_yyvs1, size * sizeof (*ssl_expr_yyvsp), + &ssl_expr_yystacksize); +#endif + + ssl_expr_yyss = ssl_expr_yyss1; ssl_expr_yyvs = ssl_expr_yyvs1; +#ifdef YYLSP_NEEDED + ssl_expr_yyls = ssl_expr_yyls1; +#endif +#else /* no ssl_expr_yyoverflow */ + /* Extend the stack our own way. */ + if (ssl_expr_yystacksize >= YYMAXDEPTH) + { + ssl_expr_yyerror("parser stack overflow"); + if (ssl_expr_yyfree_stacks) + { + free (ssl_expr_yyss); + free (ssl_expr_yyvs); +#ifdef YYLSP_NEEDED + free (ssl_expr_yyls); +#endif + } + return 2; + } + ssl_expr_yystacksize *= 2; + if (ssl_expr_yystacksize > YYMAXDEPTH) + ssl_expr_yystacksize = YYMAXDEPTH; +#ifndef YYSTACK_USE_ALLOCA + ssl_expr_yyfree_stacks = 1; +#endif + ssl_expr_yyss = (short *) YYSTACK_ALLOC (ssl_expr_yystacksize * sizeof (*ssl_expr_yyssp)); + __ssl_expr_yy_memcpy ((char *)ssl_expr_yyss, (char *)ssl_expr_yyss1, + size * (unsigned int) sizeof (*ssl_expr_yyssp)); + ssl_expr_yyvs = (YYSTYPE *) YYSTACK_ALLOC (ssl_expr_yystacksize * sizeof (*ssl_expr_yyvsp)); + __ssl_expr_yy_memcpy ((char *)ssl_expr_yyvs, (char *)ssl_expr_yyvs1, + size * (unsigned int) sizeof (*ssl_expr_yyvsp)); +#ifdef YYLSP_NEEDED + ssl_expr_yyls = (YYLTYPE *) YYSTACK_ALLOC (ssl_expr_yystacksize * sizeof (*ssl_expr_yylsp)); + __ssl_expr_yy_memcpy ((char *)ssl_expr_yyls, (char *)ssl_expr_yyls1, + size * (unsigned int) sizeof (*ssl_expr_yylsp)); +#endif +#endif /* no ssl_expr_yyoverflow */ + + ssl_expr_yyssp = ssl_expr_yyss + size - 1; + ssl_expr_yyvsp = ssl_expr_yyvs + size - 1; +#ifdef YYLSP_NEEDED + ssl_expr_yylsp = ssl_expr_yyls + size - 1; +#endif + +#if YYDEBUG != 0 + if (ssl_expr_yydebug) + fprintf(stderr, "Stack size increased to %d\n", ssl_expr_yystacksize); +#endif + + if (ssl_expr_yyssp >= ssl_expr_yyss + ssl_expr_yystacksize - 1) + YYABORT; + } + +#if YYDEBUG != 0 + if (ssl_expr_yydebug) + fprintf(stderr, "Entering state %d\n", ssl_expr_yystate); +#endif + + goto ssl_expr_yybackup; + ssl_expr_yybackup: + +/* Do appropriate processing given the current state. */ +/* Read a lookahead token if we need one and don't already have one. */ +/* ssl_expr_yyresume: */ + + /* First try to decide what to do without reference to lookahead token. */ + + ssl_expr_yyn = ssl_expr_yypact[ssl_expr_yystate]; + if (ssl_expr_yyn == YYFLAG) + goto ssl_expr_yydefault; + + /* Not known => get a lookahead token if don't already have one. */ + + /* ssl_expr_yychar is either YYEMPTY or YYEOF + or a valid token in external form. */ + + if (ssl_expr_yychar == YYEMPTY) + { +#if YYDEBUG != 0 + if (ssl_expr_yydebug) + fprintf(stderr, "Reading a token: "); +#endif + ssl_expr_yychar = YYLEX; + } + + /* Convert token to internal form (in ssl_expr_yychar1) for indexing tables with */ + + if (ssl_expr_yychar <= 0) /* This means end of input. */ + { + ssl_expr_yychar1 = 0; + ssl_expr_yychar = YYEOF; /* Don't call YYLEX any more */ + +#if YYDEBUG != 0 + if (ssl_expr_yydebug) + fprintf(stderr, "Now at end of input.\n"); +#endif + } + else + { + ssl_expr_yychar1 = YYTRANSLATE(ssl_expr_yychar); + +#if YYDEBUG != 0 + if (ssl_expr_yydebug) + { + fprintf (stderr, "Next token is %d (%s", ssl_expr_yychar, ssl_expr_yytname[ssl_expr_yychar1]); + /* Give the individual parser a way to print the precise meaning + of a token, for further debugging info. */ +#ifdef YYPRINT + YYPRINT (stderr, ssl_expr_yychar, ssl_expr_yylval); +#endif + fprintf (stderr, ")\n"); + } +#endif + } + + ssl_expr_yyn += ssl_expr_yychar1; + if (ssl_expr_yyn < 0 || ssl_expr_yyn > YYLAST || ssl_expr_yycheck[ssl_expr_yyn] != ssl_expr_yychar1) + goto ssl_expr_yydefault; + + ssl_expr_yyn = ssl_expr_yytable[ssl_expr_yyn]; + + /* ssl_expr_yyn is what to do for this token type in this state. + Negative => reduce, -ssl_expr_yyn is rule number. + Positive => shift, ssl_expr_yyn is new state. + New state is final state => don't bother to shift, + just return success. + 0, or most negative number => error. */ + + if (ssl_expr_yyn < 0) + { + if (ssl_expr_yyn == YYFLAG) + goto ssl_expr_yyerrlab; + ssl_expr_yyn = -ssl_expr_yyn; + goto ssl_expr_yyreduce; + } + else if (ssl_expr_yyn == 0) + goto ssl_expr_yyerrlab; + + if (ssl_expr_yyn == YYFINAL) + YYACCEPT; + + /* Shift the lookahead token. */ + +#if YYDEBUG != 0 + if (ssl_expr_yydebug) + fprintf(stderr, "Shifting token %d (%s), ", ssl_expr_yychar, ssl_expr_yytname[ssl_expr_yychar1]); +#endif + + /* Discard the token being shifted unless it is eof. */ + if (ssl_expr_yychar != YYEOF) + ssl_expr_yychar = YYEMPTY; + + *++ssl_expr_yyvsp = ssl_expr_yylval; +#ifdef YYLSP_NEEDED + *++ssl_expr_yylsp = ssl_expr_yylloc; +#endif + + /* count tokens shifted since error; after three, turn off error status. */ + if (ssl_expr_yyerrstatus) ssl_expr_yyerrstatus--; + + ssl_expr_yystate = ssl_expr_yyn; + goto ssl_expr_yynewstate; + +/* Do the default action for the current state. */ +ssl_expr_yydefault: + + ssl_expr_yyn = ssl_expr_yydefact[ssl_expr_yystate]; + if (ssl_expr_yyn == 0) + goto ssl_expr_yyerrlab; + +/* Do a reduction. ssl_expr_yyn is the number of a rule to reduce with. */ +ssl_expr_yyreduce: + ssl_expr_yylen = ssl_expr_yyr2[ssl_expr_yyn]; + if (ssl_expr_yylen > 0) + ssl_expr_yyval = ssl_expr_yyvsp[1-ssl_expr_yylen]; /* implement default value of the action */ + +#if YYDEBUG != 0 + if (ssl_expr_yydebug) + { + int i; + + fprintf (stderr, "Reducing via rule %d (line %d), ", + ssl_expr_yyn, ssl_expr_yyrline[ssl_expr_yyn]); + + /* Print the symbols being reduced, and their result. */ + for (i = ssl_expr_yyprhs[ssl_expr_yyn]; ssl_expr_yyrhs[i] > 0; i++) + fprintf (stderr, "%s ", ssl_expr_yytname[ssl_expr_yyrhs[i]]); + fprintf (stderr, " -> %s\n", ssl_expr_yytname[ssl_expr_yyr1[ssl_expr_yyn]]); + } +#endif + + + switch (ssl_expr_yyn) { + +case 1: +#line 115 "ssl_expr_parse.y" +{ ssl_expr_info.expr = ssl_expr_yyvsp[0].exVal; ; + break;} +case 2: +#line 118 "ssl_expr_parse.y" +{ ssl_expr_yyval.exVal = ssl_expr_make(op_True, NULL, NULL); ; + break;} +case 3: +#line 119 "ssl_expr_parse.y" +{ ssl_expr_yyval.exVal = ssl_expr_make(op_False, NULL, NULL); ; + break;} +case 4: +#line 120 "ssl_expr_parse.y" +{ ssl_expr_yyval.exVal = ssl_expr_make(op_Not, ssl_expr_yyvsp[0].exVal, NULL); ; + break;} +case 5: +#line 121 "ssl_expr_parse.y" +{ ssl_expr_yyval.exVal = ssl_expr_make(op_Or, ssl_expr_yyvsp[-2].exVal, ssl_expr_yyvsp[0].exVal); ; + break;} +case 6: +#line 122 "ssl_expr_parse.y" +{ ssl_expr_yyval.exVal = ssl_expr_make(op_And, ssl_expr_yyvsp[-2].exVal, ssl_expr_yyvsp[0].exVal); ; + break;} +case 7: +#line 123 "ssl_expr_parse.y" +{ ssl_expr_yyval.exVal = ssl_expr_make(op_Comp, ssl_expr_yyvsp[0].exVal, NULL); ; + break;} +case 8: +#line 124 "ssl_expr_parse.y" +{ ssl_expr_yyval.exVal = ssl_expr_yyvsp[-1].exVal; ; + break;} +case 9: +#line 127 "ssl_expr_parse.y" +{ ssl_expr_yyval.exVal = ssl_expr_make(op_EQ, ssl_expr_yyvsp[-2].exVal, ssl_expr_yyvsp[0].exVal); ; + break;} +case 10: +#line 128 "ssl_expr_parse.y" +{ ssl_expr_yyval.exVal = ssl_expr_make(op_NE, ssl_expr_yyvsp[-2].exVal, ssl_expr_yyvsp[0].exVal); ; + break;} +case 11: +#line 129 "ssl_expr_parse.y" +{ ssl_expr_yyval.exVal = ssl_expr_make(op_LT, ssl_expr_yyvsp[-2].exVal, ssl_expr_yyvsp[0].exVal); ; + break;} +case 12: +#line 130 "ssl_expr_parse.y" +{ ssl_expr_yyval.exVal = ssl_expr_make(op_LE, ssl_expr_yyvsp[-2].exVal, ssl_expr_yyvsp[0].exVal); ; + break;} +case 13: +#line 131 "ssl_expr_parse.y" +{ ssl_expr_yyval.exVal = ssl_expr_make(op_GT, ssl_expr_yyvsp[-2].exVal, ssl_expr_yyvsp[0].exVal); ; + break;} +case 14: +#line 132 "ssl_expr_parse.y" +{ ssl_expr_yyval.exVal = ssl_expr_make(op_GE, ssl_expr_yyvsp[-2].exVal, ssl_expr_yyvsp[0].exVal); ; + break;} +case 15: +#line 133 "ssl_expr_parse.y" +{ ssl_expr_yyval.exVal = ssl_expr_make(op_IN, ssl_expr_yyvsp[-4].exVal, ssl_expr_yyvsp[-1].exVal); ; + break;} +case 16: +#line 134 "ssl_expr_parse.y" +{ ssl_expr_yyval.exVal = ssl_expr_make(op_REG, ssl_expr_yyvsp[-2].exVal, ssl_expr_yyvsp[0].exVal); ; + break;} +case 17: +#line 135 "ssl_expr_parse.y" +{ ssl_expr_yyval.exVal = ssl_expr_make(op_NRE, ssl_expr_yyvsp[-2].exVal, ssl_expr_yyvsp[0].exVal); ; + break;} +case 18: +#line 138 "ssl_expr_parse.y" +{ ssl_expr_yyval.exVal = ssl_expr_make(op_ListElement, ssl_expr_yyvsp[0].exVal, NULL); ; + break;} +case 19: +#line 139 "ssl_expr_parse.y" +{ ssl_expr_yyval.exVal = ssl_expr_make(op_ListElement, ssl_expr_yyvsp[0].exVal, ssl_expr_yyvsp[-2].exVal); ; + break;} +case 20: +#line 142 "ssl_expr_parse.y" +{ ssl_expr_yyval.exVal = ssl_expr_make(op_Digit, ssl_expr_yyvsp[0].cpVal, NULL); ; + break;} +case 21: +#line 143 "ssl_expr_parse.y" +{ ssl_expr_yyval.exVal = ssl_expr_make(op_String, ssl_expr_yyvsp[0].cpVal, NULL); ; + break;} +case 22: +#line 144 "ssl_expr_parse.y" +{ ssl_expr_yyval.exVal = ssl_expr_make(op_Var, ssl_expr_yyvsp[-1].cpVal, NULL); ; + break;} +case 23: +#line 145 "ssl_expr_parse.y" +{ ssl_expr_yyval.exVal = ssl_expr_yyvsp[0].exVal; ; + break;} +case 24: +#line 148 "ssl_expr_parse.y" +{ + regex_t *regex; + if ((regex = ap_pregcomp(ssl_expr_info.pool, ssl_expr_yyvsp[0].cpVal, + REG_EXTENDED|REG_NOSUB)) == NULL) { + ssl_expr_error = "Failed to compile regular expression"; + YYERROR; + regex = NULL; + } + ssl_expr_yyval.exVal = ssl_expr_make(op_Regex, regex, NULL); + ; + break;} +case 25: +#line 158 "ssl_expr_parse.y" +{ + regex_t *regex; + if ((regex = ap_pregcomp(ssl_expr_info.pool, ssl_expr_yyvsp[0].cpVal, + REG_EXTENDED|REG_NOSUB|REG_ICASE)) == NULL) { + ssl_expr_error = "Failed to compile regular expression"; + YYERROR; + regex = NULL; + } + ssl_expr_yyval.exVal = ssl_expr_make(op_Regex, regex, NULL); + ; + break;} +case 26: +#line 170 "ssl_expr_parse.y" +{ + ssl_expr *args = ssl_expr_make(op_ListElement, ssl_expr_yyvsp[-1].cpVal, NULL); + ssl_expr_yyval.exVal = ssl_expr_make(op_Func, "file", args); + ; + break;} +} + /* the action file gets copied in in place of this dollarsign */ +#line 543 "/usr/local/share/bison.simple" + + ssl_expr_yyvsp -= ssl_expr_yylen; + ssl_expr_yyssp -= ssl_expr_yylen; +#ifdef YYLSP_NEEDED + ssl_expr_yylsp -= ssl_expr_yylen; +#endif + +#if YYDEBUG != 0 + if (ssl_expr_yydebug) + { + short *ssp1 = ssl_expr_yyss - 1; + fprintf (stderr, "state stack now"); + while (ssp1 != ssl_expr_yyssp) + fprintf (stderr, " %d", *++ssp1); + fprintf (stderr, "\n"); + } +#endif + + *++ssl_expr_yyvsp = ssl_expr_yyval; + +#ifdef YYLSP_NEEDED + ssl_expr_yylsp++; + if (ssl_expr_yylen == 0) + { + ssl_expr_yylsp->first_line = ssl_expr_yylloc.first_line; + ssl_expr_yylsp->first_column = ssl_expr_yylloc.first_column; + ssl_expr_yylsp->last_line = (ssl_expr_yylsp-1)->last_line; + ssl_expr_yylsp->last_column = (ssl_expr_yylsp-1)->last_column; + ssl_expr_yylsp->text = 0; + } + else + { + ssl_expr_yylsp->last_line = (ssl_expr_yylsp+ssl_expr_yylen-1)->last_line; + ssl_expr_yylsp->last_column = (ssl_expr_yylsp+ssl_expr_yylen-1)->last_column; + } +#endif + + /* Now "shift" the result of the reduction. + Determine what state that goes to, + based on the state we popped back to + and the rule number reduced by. */ + + ssl_expr_yyn = ssl_expr_yyr1[ssl_expr_yyn]; + + ssl_expr_yystate = ssl_expr_yypgoto[ssl_expr_yyn - YYNTBASE] + *ssl_expr_yyssp; + if (ssl_expr_yystate >= 0 && ssl_expr_yystate <= YYLAST && ssl_expr_yycheck[ssl_expr_yystate] == *ssl_expr_yyssp) + ssl_expr_yystate = ssl_expr_yytable[ssl_expr_yystate]; + else + ssl_expr_yystate = ssl_expr_yydefgoto[ssl_expr_yyn - YYNTBASE]; + + goto ssl_expr_yynewstate; + +ssl_expr_yyerrlab: /* here on detecting error */ + + if (! ssl_expr_yyerrstatus) + /* If not already recovering from an error, report this error. */ + { + ++ssl_expr_yynerrs; + +#ifdef YYERROR_VERBOSE + ssl_expr_yyn = ssl_expr_yypact[ssl_expr_yystate]; + + if (ssl_expr_yyn > YYFLAG && ssl_expr_yyn < YYLAST) + { + int size = 0; + char *msg; + int x, count; + + count = 0; + /* Start X at -ssl_expr_yyn if nec to avoid negative indexes in ssl_expr_yycheck. */ + for (x = (ssl_expr_yyn < 0 ? -ssl_expr_yyn : 0); + x < (sizeof(ssl_expr_yytname) / sizeof(char *)); x++) + if (ssl_expr_yycheck[x + ssl_expr_yyn] == x) + size += strlen(ssl_expr_yytname[x]) + 15, count++; + msg = (char *) malloc(size + 15); + if (msg != 0) + { + strcpy(msg, "parse error"); + + if (count < 5) + { + count = 0; + for (x = (ssl_expr_yyn < 0 ? -ssl_expr_yyn : 0); + x < (sizeof(ssl_expr_yytname) / sizeof(char *)); x++) + if (ssl_expr_yycheck[x + ssl_expr_yyn] == x) + { + strcat(msg, count == 0 ? ", expecting `" : " or `"); + strcat(msg, ssl_expr_yytname[x]); + strcat(msg, "'"); + count++; + } + } + ssl_expr_yyerror(msg); + free(msg); + } + else + ssl_expr_yyerror ("parse error; also virtual memory exceeded"); + } + else +#endif /* YYERROR_VERBOSE */ + ssl_expr_yyerror("parse error"); + } + + goto ssl_expr_yyerrlab1; +ssl_expr_yyerrlab1: /* here on error raised explicitly by an action */ + + if (ssl_expr_yyerrstatus == 3) + { + /* if just tried and failed to reuse lookahead token after an error, discard it. */ + + /* return failure if at end of input */ + if (ssl_expr_yychar == YYEOF) + YYABORT; + +#if YYDEBUG != 0 + if (ssl_expr_yydebug) + fprintf(stderr, "Discarding token %d (%s).\n", ssl_expr_yychar, ssl_expr_yytname[ssl_expr_yychar1]); +#endif + + ssl_expr_yychar = YYEMPTY; + } + + /* Else will try to reuse lookahead token + after shifting the error token. */ + + ssl_expr_yyerrstatus = 3; /* Each real token shifted decrements this */ + + goto ssl_expr_yyerrhandle; + +ssl_expr_yyerrdefault: /* current state does not do anything special for the error token. */ + +#if 0 + /* This is wrong; only states that explicitly want error tokens + should shift them. */ + ssl_expr_yyn = ssl_expr_yydefact[ssl_expr_yystate]; /* If its default is to accept any token, ok. Otherwise pop it.*/ + if (ssl_expr_yyn) goto ssl_expr_yydefault; +#endif + +ssl_expr_yyerrpop: /* pop the current state because it cannot handle the error token */ + + if (ssl_expr_yyssp == ssl_expr_yyss) YYABORT; + ssl_expr_yyvsp--; + ssl_expr_yystate = *--ssl_expr_yyssp; +#ifdef YYLSP_NEEDED + ssl_expr_yylsp--; +#endif + +#if YYDEBUG != 0 + if (ssl_expr_yydebug) + { + short *ssp1 = ssl_expr_yyss - 1; + fprintf (stderr, "Error: state stack now"); + while (ssp1 != ssl_expr_yyssp) + fprintf (stderr, " %d", *++ssp1); + fprintf (stderr, "\n"); + } +#endif + +ssl_expr_yyerrhandle: + + ssl_expr_yyn = ssl_expr_yypact[ssl_expr_yystate]; + if (ssl_expr_yyn == YYFLAG) + goto ssl_expr_yyerrdefault; + + ssl_expr_yyn += YYTERROR; + if (ssl_expr_yyn < 0 || ssl_expr_yyn > YYLAST || ssl_expr_yycheck[ssl_expr_yyn] != YYTERROR) + goto ssl_expr_yyerrdefault; + + ssl_expr_yyn = ssl_expr_yytable[ssl_expr_yyn]; + if (ssl_expr_yyn < 0) + { + if (ssl_expr_yyn == YYFLAG) + goto ssl_expr_yyerrpop; + ssl_expr_yyn = -ssl_expr_yyn; + goto ssl_expr_yyreduce; + } + else if (ssl_expr_yyn == 0) + goto ssl_expr_yyerrpop; + + if (ssl_expr_yyn == YYFINAL) + YYACCEPT; + +#if YYDEBUG != 0 + if (ssl_expr_yydebug) + fprintf(stderr, "Shifting error token, "); +#endif + + *++ssl_expr_yyvsp = ssl_expr_yylval; +#ifdef YYLSP_NEEDED + *++ssl_expr_yylsp = ssl_expr_yylloc; +#endif + + ssl_expr_yystate = ssl_expr_yyn; + goto ssl_expr_yynewstate; + + ssl_expr_yyacceptlab: + /* YYACCEPT comes here. */ + if (ssl_expr_yyfree_stacks) + { + free (ssl_expr_yyss); + free (ssl_expr_yyvs); +#ifdef YYLSP_NEEDED + free (ssl_expr_yyls); +#endif + } + return 0; + + ssl_expr_yyabortlab: + /* YYABORT comes here. */ + if (ssl_expr_yyfree_stacks) + { + free (ssl_expr_yyss); + free (ssl_expr_yyvs); +#ifdef YYLSP_NEEDED + free (ssl_expr_yyls); +#endif + } + return 1; +} +#line 176 "ssl_expr_parse.y" + + +int ssl_expr_yyerror(char *s) +{ + ssl_expr_error = s; + return 2; +} + diff --git a/rubbos/app/httpd-2.0.64/modules/ssl/ssl_expr_parse.h b/rubbos/app/httpd-2.0.64/modules/ssl/ssl_expr_parse.h new file mode 100644 index 00000000..5378e287 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/ssl/ssl_expr_parse.h @@ -0,0 +1,27 @@ +typedef union { + char *cpVal; + ssl_expr *exVal; +} YYSTYPE; +#define T_TRUE 257 +#define T_FALSE 258 +#define T_DIGIT 259 +#define T_ID 260 +#define T_STRING 261 +#define T_REGEX 262 +#define T_REGEX_I 263 +#define T_FUNC_FILE 264 +#define T_OP_EQ 265 +#define T_OP_NE 266 +#define T_OP_LT 267 +#define T_OP_LE 268 +#define T_OP_GT 269 +#define T_OP_GE 270 +#define T_OP_REG 271 +#define T_OP_NRE 272 +#define T_OP_IN 273 +#define T_OP_OR 274 +#define T_OP_AND 275 +#define T_OP_NOT 276 + + +extern YYSTYPE ssl_expr_yylval; diff --git a/rubbos/app/httpd-2.0.64/modules/ssl/ssl_expr_parse.y b/rubbos/app/httpd-2.0.64/modules/ssl/ssl_expr_parse.y new file mode 100644 index 00000000..649e1541 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/ssl/ssl_expr_parse.y @@ -0,0 +1,148 @@ +/* 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. + */ + +/* _ _ + * _ __ ___ ___ __| | ___ ___| | + * | '_ ` _ \ / _ \ / _` | / __/ __| | + * | | | | | | (_) | (_| | \__ \__ \ | mod_ssl - Apache Interface to OpenSSL + * |_| |_| |_|\___/ \__,_|___|___/___/_| http://www.modssl.org/ + * |_____| + * ssl_expr_parse.y + * Expression LR(1) Parser + */ + /* ``What you see is all you get.'' + -- Brian Kernighan */ + +/* _________________________________________________________________ +** +** Expression Parser +** _________________________________________________________________ +*/ + +%{ +#include "mod_ssl.h" +%} + +%union { + char *cpVal; + ssl_expr *exVal; +} + +%token T_TRUE +%token T_FALSE + +%token T_DIGIT +%token T_ID +%token T_STRING +%token T_REGEX +%token T_REGEX_I + +%token T_FUNC_FILE + +%token T_OP_EQ +%token T_OP_NE +%token T_OP_LT +%token T_OP_LE +%token T_OP_GT +%token T_OP_GE +%token T_OP_REG +%token T_OP_NRE +%token T_OP_IN + +%token T_OP_OR +%token T_OP_AND +%token T_OP_NOT + +%left T_OP_OR +%left T_OP_AND +%left T_OP_NOT + +%type expr +%type comparison +%type funccall +%type regex +%type words +%type word + +%% + +root : expr { ssl_expr_info.expr = $1; } + ; + +expr : T_TRUE { $$ = ssl_expr_make(op_True, NULL, NULL); } + | T_FALSE { $$ = ssl_expr_make(op_False, NULL, NULL); } + | T_OP_NOT expr { $$ = ssl_expr_make(op_Not, $2, NULL); } + | expr T_OP_OR expr { $$ = ssl_expr_make(op_Or, $1, $3); } + | expr T_OP_AND expr { $$ = ssl_expr_make(op_And, $1, $3); } + | comparison { $$ = ssl_expr_make(op_Comp, $1, NULL); } + | '(' expr ')' { $$ = $2; } + ; + +comparison: word T_OP_EQ word { $$ = ssl_expr_make(op_EQ, $1, $3); } + | word T_OP_NE word { $$ = ssl_expr_make(op_NE, $1, $3); } + | word T_OP_LT word { $$ = ssl_expr_make(op_LT, $1, $3); } + | word T_OP_LE word { $$ = ssl_expr_make(op_LE, $1, $3); } + | word T_OP_GT word { $$ = ssl_expr_make(op_GT, $1, $3); } + | word T_OP_GE word { $$ = ssl_expr_make(op_GE, $1, $3); } + | word T_OP_IN '{' words '}' { $$ = ssl_expr_make(op_IN, $1, $4); } + | word T_OP_REG regex { $$ = ssl_expr_make(op_REG, $1, $3); } + | word T_OP_NRE regex { $$ = ssl_expr_make(op_NRE, $1, $3); } + ; + +words : word { $$ = ssl_expr_make(op_ListElement, $1, NULL); } + | words ',' word { $$ = ssl_expr_make(op_ListElement, $3, $1); } + ; + +word : T_DIGIT { $$ = ssl_expr_make(op_Digit, $1, NULL); } + | T_STRING { $$ = ssl_expr_make(op_String, $1, NULL); } + | '%' '{' T_ID '}' { $$ = ssl_expr_make(op_Var, $3, NULL); } + | funccall { $$ = $1; } + ; + +regex : T_REGEX { + regex_t *regex; + if ((regex = ap_pregcomp(ssl_expr_info.pool, $1, + REG_EXTENDED|REG_NOSUB)) == NULL) { + ssl_expr_error = "Failed to compile regular expression"; + YYERROR; + } + $$ = ssl_expr_make(op_Regex, regex, NULL); + } + | T_REGEX_I { + regex_t *regex; + if ((regex = ap_pregcomp(ssl_expr_info.pool, $1, + REG_EXTENDED|REG_NOSUB|REG_ICASE)) == NULL) { + ssl_expr_error = "Failed to compile regular expression"; + YYERROR; + } + $$ = ssl_expr_make(op_Regex, regex, NULL); + } + ; + +funccall : T_FUNC_FILE '(' T_STRING ')' { + ssl_expr *args = ssl_expr_make(op_ListElement, $3, NULL); + $$ = ssl_expr_make(op_Func, "file", args); + } + ; + +%% + +int yyerror(char *s) +{ + ssl_expr_error = s; + return 2; +} + diff --git a/rubbos/app/httpd-2.0.64/modules/ssl/ssl_expr_scan.c b/rubbos/app/httpd-2.0.64/modules/ssl/ssl_expr_scan.c new file mode 100644 index 00000000..12977a3e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/ssl/ssl_expr_scan.c @@ -0,0 +1,1969 @@ +#define yy_create_buffer ssl_expr_yy_create_buffer +#define yy_delete_buffer ssl_expr_yy_delete_buffer +#define yy_scan_buffer ssl_expr_yy_scan_buffer +#define yy_scan_string ssl_expr_yy_scan_string +#define yy_scan_bytes ssl_expr_yy_scan_bytes +#define yy_flex_debug ssl_expr_yy_flex_debug +#define yy_init_buffer ssl_expr_yy_init_buffer +#define yy_flush_buffer ssl_expr_yy_flush_buffer +#define yy_load_buffer_state ssl_expr_yy_load_buffer_state +#define yy_switch_to_buffer ssl_expr_yy_switch_to_buffer +#define yyin ssl_expr_yyin +#define yyleng ssl_expr_yyleng +#define yylex ssl_expr_yylex +#define yyout ssl_expr_yyout +#define yyrestart ssl_expr_yyrestart +#define yytext ssl_expr_yytext + +/* A lexical scanner generated by flex */ + +/* Scanner skeleton version: + * $Header: /home/striker/cvs2svn/dumps/httpd-2.0/../../httpd-2.0/modules/ssl/ssl_expr_scan.c,v 1.12.2.4 2004/02/09 20:53:20 nd Exp $ + */ + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 5 + +#include + + +/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */ +#ifdef c_plusplus +#ifndef __cplusplus +#define __cplusplus +#endif +#endif + + +#ifdef __cplusplus + +#include +#include + +/* Use prototypes in function declarations. */ +#define YY_USE_PROTOS + +/* The "const" storage-class-modifier is valid. */ +#define YY_USE_CONST + +#else /* ! __cplusplus */ + +#if __STDC__ + +#define YY_USE_PROTOS +#define YY_USE_CONST + +#endif /* __STDC__ */ +#endif /* ! __cplusplus */ + +#ifdef __TURBOC__ +#pragma warn -rch +#pragma warn -use +#include +#include +#define YY_USE_CONST +#define YY_USE_PROTOS +#endif + +#ifdef YY_USE_CONST +#define yyconst const +#else +#define yyconst +#endif + + +#ifdef YY_USE_PROTOS +#define YY_PROTO(proto) proto +#else +#define YY_PROTO(proto) () +#endif + +/* Returned upon end-of-file. */ +#define YY_NULL 0 + +/* Promotes a possibly negative, possibly signed char to an unsigned + * integer for use as an array index. If the signed char is negative, + * we want to instead treat it as an 8-bit unsigned char, hence the + * double cast. + */ +#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) + +/* Enter a start condition. This macro really ought to take a parameter, + * but we do it the disgusting crufty way forced on us by the ()-less + * definition of BEGIN. + */ +#define BEGIN yy_start = 1 + 2 * + +/* Translate the current start state into a value that can be later handed + * to BEGIN to return to the state. The YYSTATE alias is for lex + * compatibility. + */ +#define YY_START ((yy_start - 1) / 2) +#define YYSTATE YY_START + +/* Action number for EOF rule of a given start state. */ +#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) + +/* Special action meaning "start processing a new file". */ +#define YY_NEW_FILE yyrestart( yyin ) + +#define YY_END_OF_BUFFER_CHAR 0 + +/* Size of default input buffer. */ +#define YY_BUF_SIZE 16384 + +typedef struct yy_buffer_state *YY_BUFFER_STATE; + +extern int yyleng; +extern FILE *yyin, *yyout; + +#define EOB_ACT_CONTINUE_SCAN 0 +#define EOB_ACT_END_OF_FILE 1 +#define EOB_ACT_LAST_MATCH 2 + +/* The funky do-while in the following #define is used to turn the definition + * int a single C statement (which needs a semi-colon terminator). This + * avoids problems with code like: + * + * if ( condition_holds ) + * yyless( 5 ); + * else + * do_something_else(); + * + * Prior to using the do-while the compiler would get upset at the + * "else" because it interpreted the "if" statement as being all + * done when it reached the ';' after the yyless() call. + */ + +/* Return all but the first 'n' matched characters back to the input stream. */ + +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + *yy_cp = yy_hold_char; \ + YY_RESTORE_YY_MORE_OFFSET \ + yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up yytext again */ \ + } \ + while ( 0 ) + +#define unput(c) yyunput( c, yytext_ptr ) + +/* The following is because we cannot portably get our hands on size_t + * (without autoconf's help, which isn't available because we want + * flex-generated scanners to compile on their own). + */ +typedef unsigned int yy_size_t; + + +struct yy_buffer_state + { + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + yy_size_t yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + int yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; +#define YY_BUFFER_NEW 0 +#define YY_BUFFER_NORMAL 1 + /* When an EOF's been seen but there's still some text to process + * then we mark the buffer as YY_EOF_PENDING, to indicate that we + * shouldn't try reading from the input source any more. We might + * still have a bunch of tokens to match, though, because of + * possible backing-up. + * + * When we actually see the EOF, we change the status to "new" + * (via yyrestart()), so that the user can continue scanning by + * just pointing yyin at a new input file. + */ +#define YY_BUFFER_EOF_PENDING 2 + }; + +static YY_BUFFER_STATE yy_current_buffer = 0; + +/* We provide macros for accessing buffer states in case in the + * future we want to put the buffer states in a more general + * "scanner state". + */ +#define YY_CURRENT_BUFFER yy_current_buffer + + +/* yy_hold_char holds the character lost when yytext is formed. */ +static char yy_hold_char; + +static int yy_n_chars; /* number of characters read into yy_ch_buf */ + + +int yyleng; + +/* Points to current character in buffer. */ +static char *yy_c_buf_p = (char *) 0; +static int yy_init = 1; /* whether we need to initialize */ +static int yy_start = 0; /* start state number */ + +/* Flag which is used to allow yywrap()'s to do buffer switches + * instead of setting up a fresh yyin. A bit of a hack ... + */ +static int yy_did_buffer_switch_on_eof; + +void yyrestart YY_PROTO(( FILE *input_file )); + +void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer )); +void yy_load_buffer_state YY_PROTO(( void )); +YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size )); +void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b )); +void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file )); +void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b )); +#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer ) + +YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size )); +YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str )); +YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len )); + +static void *yy_flex_alloc YY_PROTO(( yy_size_t )); +static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t )); +static void yy_flex_free YY_PROTO(( void * )); + +#define yy_new_buffer yy_create_buffer + +#define yy_set_interactive(is_interactive) \ + { \ + if ( ! yy_current_buffer ) \ + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ + yy_current_buffer->yy_is_interactive = is_interactive; \ + } + +#define yy_set_bol(at_bol) \ + { \ + if ( ! yy_current_buffer ) \ + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ + yy_current_buffer->yy_at_bol = at_bol; \ + } + +#define YY_AT_BOL() (yy_current_buffer->yy_at_bol) + + +#define yywrap() 1 +#define YY_SKIP_YYWRAP +typedef unsigned char YY_CHAR; +FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; +typedef int yy_state_type; +extern char *yytext; +#define yytext_ptr yytext + +static yy_state_type yy_get_previous_state YY_PROTO(( void )); +static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state )); +static int yy_get_next_buffer YY_PROTO(( void )); +static void yy_fatal_error YY_PROTO(( yyconst char msg[] )); + +/* Done after the current pattern has been matched and before the + * corresponding action - sets up yytext. + */ +#define YY_DO_BEFORE_ACTION \ + yytext_ptr = yy_bp; \ + yyleng = (int) (yy_cp - yy_bp); \ + yy_hold_char = *yy_cp; \ + *yy_cp = '\0'; \ + yy_c_buf_p = yy_cp; + +#define YY_NUM_RULES 46 +#define YY_END_OF_BUFFER 47 +static yyconst short int yy_accept[86] = + { 0, + 0, 0, 0, 0, 0, 0, 0, 0, 47, 45, + 1, 38, 2, 45, 43, 24, 45, 28, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 45, + 13, 4, 3, 14, 16, 18, 17, 1, 22, 32, + 34, 43, 26, 20, 31, 30, 44, 44, 19, 44, + 44, 29, 27, 39, 25, 23, 15, 15, 21, 44, + 35, 44, 36, 13, 12, 5, 6, 10, 11, 7, + 8, 9, 33, 44, 44, 37, 44, 5, 6, 44, + 40, 41, 5, 42, 0 + } ; + +static yyconst int yy_ec[256] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 4, 5, 1, 1, 1, 6, 1, 1, + 1, 1, 1, 1, 7, 1, 1, 8, 8, 8, + 8, 8, 8, 8, 8, 9, 9, 7, 1, 10, + 11, 12, 1, 1, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 1, 14, 1, 1, 7, 1, 15, 16, 13, 17, + + 18, 19, 20, 13, 21, 13, 13, 22, 23, 24, + 25, 13, 26, 27, 28, 29, 30, 13, 13, 13, + 13, 13, 1, 31, 1, 32, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1 + } ; + +static yyconst int yy_meta[33] = + { 0, + 1, 1, 2, 1, 3, 1, 4, 4, 4, 1, + 1, 1, 4, 3, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 1, 1 + } ; + +static yyconst short int yy_base[93] = + { 0, + 0, 0, 30, 31, 0, 0, 82, 81, 101, 142, + 35, 28, 142, 94, 32, 88, 31, 87, 0, 69, + 66, 28, 28, 67, 29, 63, 30, 63, 62, 57, + 0, 142, 142, 88, 142, 142, 142, 48, 142, 142, + 142, 44, 142, 142, 142, 142, 0, 70, 0, 64, + 63, 0, 0, 0, 0, 0, 142, 0, 0, 55, + 0, 46, 142, 0, 142, 53, 62, 142, 142, 142, + 142, 142, 0, 44, 48, 0, 41, 70, 72, 38, + 0, 0, 74, 0, 142, 117, 121, 125, 50, 129, + 133, 137 + + } ; + +static yyconst short int yy_def[93] = + { 0, + 85, 1, 86, 86, 87, 87, 88, 88, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 89, 89, + 89, 89, 89, 89, 89, 90, 89, 89, 89, 85, + 91, 85, 85, 92, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 89, 89, 89, 89, + 89, 89, 89, 89, 89, 89, 85, 89, 89, 89, + 89, 89, 85, 91, 85, 85, 85, 85, 85, 85, + 85, 85, 89, 89, 89, 89, 89, 85, 85, 89, + 89, 89, 85, 89, 0, 85, 85, 85, 85, 85, + 85, 85 + + } ; + +static yyconst short int yy_nxt[175] = + { 0, + 10, 11, 11, 12, 13, 14, 10, 15, 15, 16, + 17, 18, 19, 10, 20, 19, 19, 21, 22, 23, + 24, 25, 26, 27, 28, 19, 19, 19, 29, 19, + 30, 10, 32, 32, 33, 33, 38, 38, 39, 42, + 42, 44, 50, 34, 34, 52, 55, 59, 51, 38, + 38, 42, 42, 47, 60, 84, 53, 56, 82, 40, + 78, 79, 45, 57, 57, 81, 57, 57, 57, 79, + 79, 80, 57, 57, 57, 77, 57, 83, 79, 79, + 79, 79, 79, 76, 75, 74, 73, 63, 62, 61, + 54, 49, 48, 57, 57, 66, 67, 46, 43, 41, + + 85, 37, 37, 68, 85, 85, 69, 85, 85, 85, + 85, 70, 85, 85, 71, 85, 72, 31, 31, 31, + 31, 35, 35, 35, 35, 36, 36, 36, 36, 58, + 85, 58, 58, 64, 85, 85, 64, 65, 65, 65, + 65, 9, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85 + } ; + +static yyconst short int yy_chk[175] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 3, 4, 3, 4, 11, 11, 12, 15, + 15, 17, 22, 3, 4, 23, 25, 27, 22, 38, + 38, 42, 42, 89, 27, 80, 23, 25, 77, 12, + 66, 66, 17, 26, 26, 75, 26, 26, 26, 67, + 67, 74, 26, 26, 26, 62, 26, 78, 78, 79, + 79, 83, 83, 60, 51, 50, 48, 30, 29, 28, + 24, 21, 20, 26, 26, 34, 34, 18, 16, 14, + + 9, 8, 7, 34, 0, 0, 34, 0, 0, 0, + 0, 34, 0, 0, 34, 0, 34, 86, 86, 86, + 86, 87, 87, 87, 87, 88, 88, 88, 88, 90, + 0, 90, 90, 91, 0, 0, 91, 92, 92, 92, + 92, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 85, 85, 85 + } ; + +static yy_state_type yy_last_accepting_state; +static char *yy_last_accepting_cpos; + +/* The intent behind this definition is that it'll catch + * any uses of REJECT which flex missed. + */ +#define REJECT reject_used_but_not_detected +#define yymore() yymore_used_but_not_detected +#define YY_MORE_ADJ 0 +#define YY_RESTORE_YY_MORE_OFFSET +char *yytext; +#line 1 "ssl_expr_scan.l" +#define INITIAL 0 +/* 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. + */ + +/* _ _ + * _ __ ___ ___ __| | ___ ___| | + * | '_ ` _ \ / _ \ / _` | / __/ __| | + * | | | | | | (_) | (_| | \__ \__ \ | mod_ssl - Apache Interface to OpenSSL + * |_| |_| |_|\___/ \__,_|___|___/___/_| http://www.modssl.org/ + * |_____| + * ssl_expr_scan.l + * Expression Scanner + */ +/* ``Killing for peace is +like fucking for virginity.'' +-- Unknown */ +/* _________________________________________________________________ +** +** Expression Scanner +** _________________________________________________________________ +*/ +#line 38 "ssl_expr_scan.l" +#include "mod_ssl.h" + +#include "ssl_expr_parse.h" + +#define YY_NO_UNPUT 1 +int yyinput(char *buf, int max_size); + +#undef YY_INPUT +#define YY_INPUT(buf,result,max_size) \ + (result = yyinput(buf, max_size)) + +#define MAX_STR_LEN 2048 +/* %option stack */ +#define YY_NEVER_INTERACTIVE 1 +#define str 1 + +#define regex 2 +#define regex_flags 3 + +#line 535 "lex.ssl_expr_yy.c" + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int yywrap YY_PROTO(( void )); +#else +extern int yywrap YY_PROTO(( void )); +#endif +#endif + +#ifndef YY_NO_UNPUT +static void yyunput YY_PROTO(( int c, char *buf_ptr )); +#endif + +#ifndef yytext_ptr +static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int )); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen YY_PROTO(( yyconst char * )); +#endif + +#ifndef YY_NO_INPUT +#ifdef __cplusplus +static int yyinput YY_PROTO(( void )); +#else +static int input YY_PROTO(( void )); +#endif +#endif + +#if YY_STACK_USED +static int yy_start_stack_ptr = 0; +static int yy_start_stack_depth = 0; +static int *yy_start_stack = 0; +#ifndef YY_NO_PUSH_STATE +static void yy_push_state YY_PROTO(( int new_state )); +#endif +#ifndef YY_NO_POP_STATE +static void yy_pop_state YY_PROTO(( void )); +#endif +#ifndef YY_NO_TOP_STATE +static int yy_top_state YY_PROTO(( void )); +#endif + +#else +#define YY_NO_PUSH_STATE 1 +#define YY_NO_POP_STATE 1 +#define YY_NO_TOP_STATE 1 +#endif + +#ifdef YY_MALLOC_DECL +YY_MALLOC_DECL +#else +#if __STDC__ +#ifndef __cplusplus +#include +#endif +#else +/* Just try to get by without declaring the routines. This will fail + * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int) + * or sizeof(void*) != sizeof(int). + */ +#endif +#endif + +/* Amount of stuff to slurp up with each read. */ +#ifndef YY_READ_BUF_SIZE +#define YY_READ_BUF_SIZE 8192 +#endif + +/* Copy whatever the last rule matched to the standard output. */ + +#ifndef ECHO +/* This used to be an fputs(), but since the string might contain NUL's, + * we now use fwrite(). + */ +#define ECHO (void) fwrite( yytext, yyleng, 1, yyout ) +#endif + +/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, + * is returned in "result". + */ +#ifndef YY_INPUT +#define YY_INPUT(buf,result,max_size) \ + if ( yy_current_buffer->yy_is_interactive ) \ + { \ + int c = '*', n; \ + for ( n = 0; n < max_size && \ + (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ + buf[n] = (char) c; \ + if ( c == '\n' ) \ + buf[n++] = (char) c; \ + if ( c == EOF && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + result = n; \ + } \ + else if ( ((result = fread( buf, 1, max_size, yyin )) == 0) \ + && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); +#endif + +/* No semi-colon after return; correct usage is to write "yyterminate();" - + * we don't want an extra ';' after the "return" because that will cause + * some compilers to complain about unreachable statements. + */ +#ifndef yyterminate +#define yyterminate() return YY_NULL +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Report a fatal error. */ +#ifndef YY_FATAL_ERROR +#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) +#endif + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL int yylex YY_PROTO(( void )) +#endif + +/* Code executed at the beginning of each rule, after yytext and yyleng + * have been set up. + */ +#ifndef YY_USER_ACTION +#define YY_USER_ACTION +#endif + +/* Code executed at the end of each rule. */ +#ifndef YY_BREAK +#define YY_BREAK break; +#endif + +#define YY_RULE_SETUP \ + YY_USER_ACTION + +YY_DECL + { + register yy_state_type yy_current_state; + register char *yy_cp, *yy_bp; + register int yy_act; + +#line 91 "ssl_expr_scan.l" + + + char caStr[MAX_STR_LEN]; + char *cpStr = NULL; + char caRegex[MAX_STR_LEN]; + char *cpRegex = NULL; + char cRegexDel = NUL; + + /* + * Whitespaces + */ +#line 698 "lex.ssl_expr_yy.c" + + if ( yy_init ) + { + yy_init = 0; + +#ifdef YY_USER_INIT + YY_USER_INIT; +#endif + + if ( ! yy_start ) + yy_start = 1; /* first start state */ + + if ( ! yyin ) + yyin = stdin; + + if ( ! yyout ) + yyout = stdout; + + if ( ! yy_current_buffer ) + yy_current_buffer = + yy_create_buffer( yyin, YY_BUF_SIZE ); + + yy_load_buffer_state(); + } + + while ( 1 ) /* loops until end-of-file is reached */ + { + yy_cp = yy_c_buf_p; + + /* Support of yytext. */ + *yy_cp = yy_hold_char; + + /* yy_bp points to the position in yy_ch_buf of the start of + * the current run. + */ + yy_bp = yy_cp; + + yy_current_state = yy_start; +yy_match: + do + { + register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; + if ( yy_accept[yy_current_state] ) + { + yy_last_accepting_state = yy_current_state; + yy_last_accepting_cpos = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 86 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + ++yy_cp; + } + while ( yy_current_state != 85 ); + yy_cp = yy_last_accepting_cpos; + yy_current_state = yy_last_accepting_state; + +yy_find_action: + yy_act = yy_accept[yy_current_state]; + + YY_DO_BEFORE_ACTION; + + +do_action: /* This label is used only to access EOF actions. */ + + + switch ( yy_act ) + { /* beginning of action switch */ + case 0: /* must back up */ + /* undo the effects of YY_DO_BEFORE_ACTION */ + *yy_cp = yy_hold_char; + yy_cp = yy_last_accepting_cpos; + yy_current_state = yy_last_accepting_state; + goto yy_find_action; + +case 1: +YY_RULE_SETUP +#line 102 "ssl_expr_scan.l" +{ + /* NOP */ +} + YY_BREAK +/* + * C-style strings ("...") + */ +case 2: +YY_RULE_SETUP +#line 109 "ssl_expr_scan.l" +{ + cpStr = caStr; + BEGIN(str); +} + YY_BREAK +case 3: +YY_RULE_SETUP +#line 113 "ssl_expr_scan.l" +{ + BEGIN(INITIAL); + *cpStr = NUL; + yylval.cpVal = apr_pstrdup(ssl_expr_info.pool, caStr); + return T_STRING; +} + YY_BREAK +case 4: +YY_RULE_SETUP +#line 119 "ssl_expr_scan.l" +{ + yyerror("Unterminated string"); +} + YY_BREAK +case 5: +YY_RULE_SETUP +#line 122 "ssl_expr_scan.l" +{ + int result; + + (void)sscanf(yytext+1, "%o", &result); + if (result > 0xff) + yyerror("Escape sequence out of bound"); + else + *cpStr++ = result; +} + YY_BREAK +case 6: +YY_RULE_SETUP +#line 131 "ssl_expr_scan.l" +{ + yyerror("Bad escape sequence"); +} + YY_BREAK +case 7: +YY_RULE_SETUP +#line 134 "ssl_expr_scan.l" +{ *cpStr++ = '\n'; } + YY_BREAK +case 8: +YY_RULE_SETUP +#line 135 "ssl_expr_scan.l" +{ *cpStr++ = '\r'; } + YY_BREAK +case 9: +YY_RULE_SETUP +#line 136 "ssl_expr_scan.l" +{ *cpStr++ = '\t'; } + YY_BREAK +case 10: +YY_RULE_SETUP +#line 137 "ssl_expr_scan.l" +{ *cpStr++ = '\b'; } + YY_BREAK +case 11: +YY_RULE_SETUP +#line 138 "ssl_expr_scan.l" +{ *cpStr++ = '\f'; } + YY_BREAK +case 12: +YY_RULE_SETUP +#line 139 "ssl_expr_scan.l" +{ + *cpStr++ = yytext[1]; +} + YY_BREAK +case 13: +YY_RULE_SETUP +#line 142 "ssl_expr_scan.l" +{ + char *cp = yytext; + while (*cp != NUL) + *cpStr++ = *cp++; +} + YY_BREAK +case 14: +YY_RULE_SETUP +#line 147 "ssl_expr_scan.l" +{ + *cpStr++ = yytext[1]; +} + YY_BREAK +/* + * Regular Expression + */ +case 15: +YY_RULE_SETUP +#line 154 "ssl_expr_scan.l" +{ + cRegexDel = yytext[1]; + cpRegex = caRegex; + BEGIN(regex); +} + YY_BREAK +case 16: +YY_RULE_SETUP +#line 159 "ssl_expr_scan.l" +{ + if (yytext[0] == cRegexDel) { + *cpRegex = NUL; + BEGIN(regex_flags); + } + else { + *cpRegex++ = yytext[0]; + } +} + YY_BREAK +case 17: +YY_RULE_SETUP +#line 168 "ssl_expr_scan.l" +{ + yylval.cpVal = apr_pstrdup(ssl_expr_info.pool, caRegex); + BEGIN(INITIAL); + return T_REGEX_I; +} + YY_BREAK +case 18: +YY_RULE_SETUP +#line 173 "ssl_expr_scan.l" +{ + yylval.cpVal = apr_pstrdup(ssl_expr_info.pool, caRegex); + yyless(0); + BEGIN(INITIAL); + return T_REGEX; +} + YY_BREAK +case YY_STATE_EOF(regex_flags): +#line 179 "ssl_expr_scan.l" +{ + yylval.cpVal = apr_pstrdup(ssl_expr_info.pool, caRegex); + BEGIN(INITIAL); + return T_REGEX; +} + YY_BREAK +/* + * Operators + */ +case 19: +YY_RULE_SETUP +#line 188 "ssl_expr_scan.l" +{ return T_OP_EQ; } + YY_BREAK +case 20: +YY_RULE_SETUP +#line 189 "ssl_expr_scan.l" +{ return T_OP_EQ; } + YY_BREAK +case 21: +YY_RULE_SETUP +#line 190 "ssl_expr_scan.l" +{ return T_OP_NE; } + YY_BREAK +case 22: +YY_RULE_SETUP +#line 191 "ssl_expr_scan.l" +{ return T_OP_NE; } + YY_BREAK +case 23: +YY_RULE_SETUP +#line 192 "ssl_expr_scan.l" +{ return T_OP_LT; } + YY_BREAK +case 24: +YY_RULE_SETUP +#line 193 "ssl_expr_scan.l" +{ return T_OP_LT; } + YY_BREAK +case 25: +YY_RULE_SETUP +#line 194 "ssl_expr_scan.l" +{ return T_OP_LE; } + YY_BREAK +case 26: +YY_RULE_SETUP +#line 195 "ssl_expr_scan.l" +{ return T_OP_LE; } + YY_BREAK +case 27: +YY_RULE_SETUP +#line 196 "ssl_expr_scan.l" +{ return T_OP_GT; } + YY_BREAK +case 28: +YY_RULE_SETUP +#line 197 "ssl_expr_scan.l" +{ return T_OP_GT; } + YY_BREAK +case 29: +YY_RULE_SETUP +#line 198 "ssl_expr_scan.l" +{ return T_OP_GE; } + YY_BREAK +case 30: +YY_RULE_SETUP +#line 199 "ssl_expr_scan.l" +{ return T_OP_GE; } + YY_BREAK +case 31: +YY_RULE_SETUP +#line 200 "ssl_expr_scan.l" +{ return T_OP_REG; } + YY_BREAK +case 32: +YY_RULE_SETUP +#line 201 "ssl_expr_scan.l" +{ return T_OP_NRE; } + YY_BREAK +case 33: +YY_RULE_SETUP +#line 202 "ssl_expr_scan.l" +{ return T_OP_AND; } + YY_BREAK +case 34: +YY_RULE_SETUP +#line 203 "ssl_expr_scan.l" +{ return T_OP_AND; } + YY_BREAK +case 35: +YY_RULE_SETUP +#line 204 "ssl_expr_scan.l" +{ return T_OP_OR; } + YY_BREAK +case 36: +YY_RULE_SETUP +#line 205 "ssl_expr_scan.l" +{ return T_OP_OR; } + YY_BREAK +case 37: +YY_RULE_SETUP +#line 206 "ssl_expr_scan.l" +{ return T_OP_NOT; } + YY_BREAK +case 38: +YY_RULE_SETUP +#line 207 "ssl_expr_scan.l" +{ return T_OP_NOT; } + YY_BREAK +case 39: +YY_RULE_SETUP +#line 208 "ssl_expr_scan.l" +{ return T_OP_IN; } + YY_BREAK +/* + * Functions + */ +case 40: +YY_RULE_SETUP +#line 213 "ssl_expr_scan.l" +{ return T_FUNC_FILE; } + YY_BREAK +/* + * Specials + */ +case 41: +YY_RULE_SETUP +#line 218 "ssl_expr_scan.l" +{ return T_TRUE; } + YY_BREAK +case 42: +YY_RULE_SETUP +#line 219 "ssl_expr_scan.l" +{ return T_FALSE; } + YY_BREAK +/* + * Digits + */ +case 43: +YY_RULE_SETUP +#line 224 "ssl_expr_scan.l" +{ + yylval.cpVal = apr_pstrdup(ssl_expr_info.pool, yytext); + return T_DIGIT; +} + YY_BREAK +/* + * Identifiers + */ +case 44: +YY_RULE_SETUP +#line 232 "ssl_expr_scan.l" +{ + yylval.cpVal = apr_pstrdup(ssl_expr_info.pool, yytext); + return T_ID; +} + YY_BREAK +/* + * Anything else is returned as is... + */ +case 45: +YY_RULE_SETUP +#line 240 "ssl_expr_scan.l" +{ + return yytext[0]; +} + YY_BREAK +case 46: +YY_RULE_SETUP +#line 244 "ssl_expr_scan.l" +YY_FATAL_ERROR( "flex scanner jammed" ); + YY_BREAK +#line 1098 "lex.ssl_expr_yy.c" +case YY_STATE_EOF(INITIAL): +case YY_STATE_EOF(str): +case YY_STATE_EOF(regex): + yyterminate(); + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = yy_hold_char; + YY_RESTORE_YY_MORE_OFFSET + + if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW ) + { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed yyin at a new source and called + * yylex(). If so, then we have to assure + * consistency between yy_current_buffer and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + yy_n_chars = yy_current_buffer->yy_n_chars; + yy_current_buffer->yy_input_file = yyin; + yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* Note that here we test for yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] ) + { /* This was really a NUL. */ + yy_state_type yy_next_state; + + yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state(); + + /* Okay, we're now positioned to make the NUL + * transition. We couldn't have + * yy_get_previous_state() go ahead and do it + * for us because it doesn't know how to deal + * with the possibility of jamming (and we don't + * want to build jamming into it because then it + * will run more slowly). + */ + + yy_next_state = yy_try_NUL_trans( yy_current_state ); + + yy_bp = yytext_ptr + YY_MORE_ADJ; + + if ( yy_next_state ) + { + /* Consume the NUL. */ + yy_cp = ++yy_c_buf_p; + yy_current_state = yy_next_state; + goto yy_match; + } + + else + { + yy_cp = yy_last_accepting_cpos; + yy_current_state = yy_last_accepting_state; + goto yy_find_action; + } + } + + else switch ( yy_get_next_buffer() ) + { + case EOB_ACT_END_OF_FILE: + { + yy_did_buffer_switch_on_eof = 0; + + if ( yywrap() ) + { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * yytext, we can now set up + * yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + yy_c_buf_p = yytext_ptr + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(YY_START); + goto do_action; + } + + else + { + if ( ! yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; + } + break; + } + + case EOB_ACT_CONTINUE_SCAN: + yy_c_buf_p = + yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state(); + + yy_cp = yy_c_buf_p; + yy_bp = yytext_ptr + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + yy_c_buf_p = + &yy_current_buffer->yy_ch_buf[yy_n_chars]; + + yy_current_state = yy_get_previous_state(); + + yy_cp = yy_c_buf_p; + yy_bp = yytext_ptr + YY_MORE_ADJ; + goto yy_find_action; + } + break; + } + + default: + YY_FATAL_ERROR( + "fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ + } /* end of yylex */ + + +/* yy_get_next_buffer - try to read in a new buffer + * + * Returns a code representing an action: + * EOB_ACT_LAST_MATCH - + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position + * EOB_ACT_END_OF_FILE - end of file + */ + +static int yy_get_next_buffer() + { + register char *dest = yy_current_buffer->yy_ch_buf; + register char *source = yytext_ptr; + register int number_to_move, i; + int ret_val; + + if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] ) + YY_FATAL_ERROR( + "fatal flex scanner internal error--end of buffer missed" ); + + if ( yy_current_buffer->yy_fill_buffer == 0 ) + { /* Don't try to fill the buffer, so this is an EOF. */ + if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 ) + { + /* We matched a single character, the EOB, so + * treat this as a final EOF. + */ + return EOB_ACT_END_OF_FILE; + } + + else + { + /* We matched some text prior to the EOB, first + * process it. + */ + return EOB_ACT_LAST_MATCH; + } + } + + /* Try to read more data. */ + + /* First move last chars to start of buffer. */ + number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1; + + for ( i = 0; i < number_to_move; ++i ) + *(dest++) = *(source++); + + if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING ) + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + yy_current_buffer->yy_n_chars = yy_n_chars = 0; + + else + { + int num_to_read = + yy_current_buffer->yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) + { /* Not enough room in the buffer - grow it. */ +#ifdef YY_USES_REJECT + YY_FATAL_ERROR( +"input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); +#else + + /* just a shorter name for the current buffer */ + YY_BUFFER_STATE b = yy_current_buffer; + + int yy_c_buf_p_offset = + (int) (yy_c_buf_p - b->yy_ch_buf); + + if ( b->yy_is_our_buffer ) + { + int new_size = b->yy_buf_size * 2; + + if ( new_size <= 0 ) + b->yy_buf_size += b->yy_buf_size / 8; + else + b->yy_buf_size *= 2; + + b->yy_ch_buf = (char *) + /* Include room in for 2 EOB chars. */ + yy_flex_realloc( (void *) b->yy_ch_buf, + b->yy_buf_size + 2 ); + } + else + /* Can't grow it, we don't own it. */ + b->yy_ch_buf = 0; + + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( + "fatal error - scanner input buffer overflow" ); + + yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; + + num_to_read = yy_current_buffer->yy_buf_size - + number_to_move - 1; +#endif + } + + if ( num_to_read > YY_READ_BUF_SIZE ) + num_to_read = YY_READ_BUF_SIZE; + + /* Read in more data. */ + YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]), + yy_n_chars, num_to_read ); + + yy_current_buffer->yy_n_chars = yy_n_chars; + } + + if ( yy_n_chars == 0 ) + { + if ( number_to_move == YY_MORE_ADJ ) + { + ret_val = EOB_ACT_END_OF_FILE; + yyrestart( yyin ); + } + + else + { + ret_val = EOB_ACT_LAST_MATCH; + yy_current_buffer->yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } + + else + ret_val = EOB_ACT_CONTINUE_SCAN; + + yy_n_chars += number_to_move; + yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR; + yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; + + yytext_ptr = &yy_current_buffer->yy_ch_buf[0]; + + return ret_val; + } + + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + +static yy_state_type yy_get_previous_state() + { + register yy_state_type yy_current_state; + register char *yy_cp; + + yy_current_state = yy_start; + + for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp ) + { + register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); + if ( yy_accept[yy_current_state] ) + { + yy_last_accepting_state = yy_current_state; + yy_last_accepting_cpos = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 86 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + } + + return yy_current_state; + } + + +/* yy_try_NUL_trans - try to make a transition on the NUL character + * + * synopsis + * next_state = yy_try_NUL_trans( current_state ); + */ + +#ifdef YY_USE_PROTOS +static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state ) +#else +static yy_state_type yy_try_NUL_trans( yy_current_state ) +yy_state_type yy_current_state; +#endif + { + register int yy_is_jam; + register char *yy_cp = yy_c_buf_p; + + register YY_CHAR yy_c = 1; + if ( yy_accept[yy_current_state] ) + { + yy_last_accepting_state = yy_current_state; + yy_last_accepting_cpos = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 86 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + yy_is_jam = (yy_current_state == 85); + + return yy_is_jam ? 0 : yy_current_state; + } + + +#ifndef YY_NO_UNPUT +#ifdef YY_USE_PROTOS +static void yyunput( int c, register char *yy_bp ) +#else +static void yyunput( c, yy_bp ) +int c; +register char *yy_bp; +#endif + { + register char *yy_cp = yy_c_buf_p; + + /* undo effects of setting up yytext */ + *yy_cp = yy_hold_char; + + if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) + { /* need to shift things up to make room */ + /* +2 for EOB chars. */ + register int number_to_move = yy_n_chars + 2; + register char *dest = &yy_current_buffer->yy_ch_buf[ + yy_current_buffer->yy_buf_size + 2]; + register char *source = + &yy_current_buffer->yy_ch_buf[number_to_move]; + + while ( source > yy_current_buffer->yy_ch_buf ) + *--dest = *--source; + + yy_cp += (int) (dest - source); + yy_bp += (int) (dest - source); + yy_current_buffer->yy_n_chars = + yy_n_chars = yy_current_buffer->yy_buf_size; + + if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) + YY_FATAL_ERROR( "flex scanner push-back overflow" ); + } + + *--yy_cp = (char) c; + + + yytext_ptr = yy_bp; + yy_hold_char = *yy_cp; + yy_c_buf_p = yy_cp; + } +#endif /* ifndef YY_NO_UNPUT */ + + +#ifdef __cplusplus +static int yyinput() +#else +static int input() +#endif + { + int c; + + *yy_c_buf_p = yy_hold_char; + + if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) + { + /* yy_c_buf_p now points to the character we want to return. + * If this occurs *before* the EOB characters, then it's a + * valid NUL; if not, then we've hit the end of the buffer. + */ + if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] ) + /* This was really a NUL. */ + *yy_c_buf_p = '\0'; + + else + { /* need more input */ + int offset = yy_c_buf_p - yytext_ptr; + ++yy_c_buf_p; + + switch ( yy_get_next_buffer() ) + { + case EOB_ACT_LAST_MATCH: + /* This happens because yy_g_n_b() + * sees that we've accumulated a + * token and flags that we need to + * try matching the token before + * proceeding. But for input(), + * there's no matching to consider. + * So convert the EOB_ACT_LAST_MATCH + * to EOB_ACT_END_OF_FILE. + */ + + /* Reset buffer status. */ + yyrestart( yyin ); + + /* fall through */ + + case EOB_ACT_END_OF_FILE: + { + if ( yywrap() ) + return EOF; + + if ( ! yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; +#ifdef __cplusplus + return yyinput(); +#else + return input(); +#endif + } + + case EOB_ACT_CONTINUE_SCAN: + yy_c_buf_p = yytext_ptr + offset; + break; + } + } + } + + c = *(unsigned char *) yy_c_buf_p; /* cast for 8-bit char's */ + *yy_c_buf_p = '\0'; /* preserve yytext */ + yy_hold_char = *++yy_c_buf_p; + + + return c; + } + + +#ifdef YY_USE_PROTOS +void yyrestart( FILE *input_file ) +#else +void yyrestart( input_file ) +FILE *input_file; +#endif + { + if ( ! yy_current_buffer ) + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); + + yy_init_buffer( yy_current_buffer, input_file ); + yy_load_buffer_state(); + } + + +#ifdef YY_USE_PROTOS +void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) +#else +void yy_switch_to_buffer( new_buffer ) +YY_BUFFER_STATE new_buffer; +#endif + { + if ( yy_current_buffer == new_buffer ) + return; + + if ( yy_current_buffer ) + { + /* Flush out information for old buffer. */ + *yy_c_buf_p = yy_hold_char; + yy_current_buffer->yy_buf_pos = yy_c_buf_p; + yy_current_buffer->yy_n_chars = yy_n_chars; + } + + yy_current_buffer = new_buffer; + yy_load_buffer_state(); + + /* We don't actually know whether we did this switch during + * EOF (yywrap()) processing, but the only time this flag + * is looked at is after yywrap() is called, so it's safe + * to go ahead and always set it. + */ + yy_did_buffer_switch_on_eof = 1; + } + + +#ifdef YY_USE_PROTOS +void yy_load_buffer_state( void ) +#else +void yy_load_buffer_state() +#endif + { + yy_n_chars = yy_current_buffer->yy_n_chars; + yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos; + yyin = yy_current_buffer->yy_input_file; + yy_hold_char = *yy_c_buf_p; + } + + +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_create_buffer( FILE *file, int size ) +#else +YY_BUFFER_STATE yy_create_buffer( file, size ) +FILE *file; +int size; +#endif + { + YY_BUFFER_STATE b; + + b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_buf_size = size; + + /* yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 ); + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_is_our_buffer = 1; + + yy_init_buffer( b, file ); + + return b; + } + + +#ifdef YY_USE_PROTOS +void yy_delete_buffer( YY_BUFFER_STATE b ) +#else +void yy_delete_buffer( b ) +YY_BUFFER_STATE b; +#endif + { + if ( ! b ) + return; + + if ( b == yy_current_buffer ) + yy_current_buffer = (YY_BUFFER_STATE) 0; + + if ( b->yy_is_our_buffer ) + yy_flex_free( (void *) b->yy_ch_buf ); + + yy_flex_free( (void *) b ); + } + + +#ifndef YY_ALWAYS_INTERACTIVE +#ifndef YY_NEVER_INTERACTIVE +extern int isatty YY_PROTO(( int )); +#endif +#endif + +#ifdef YY_USE_PROTOS +void yy_init_buffer( YY_BUFFER_STATE b, FILE *file ) +#else +void yy_init_buffer( b, file ) +YY_BUFFER_STATE b; +FILE *file; +#endif + + + { + yy_flush_buffer( b ); + + b->yy_input_file = file; + b->yy_fill_buffer = 1; + +#if YY_ALWAYS_INTERACTIVE + b->yy_is_interactive = 1; +#else +#if YY_NEVER_INTERACTIVE + b->yy_is_interactive = 0; +#else + b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; +#endif +#endif + } + + +#ifdef YY_USE_PROTOS +void yy_flush_buffer( YY_BUFFER_STATE b ) +#else +void yy_flush_buffer( b ) +YY_BUFFER_STATE b; +#endif + + { + if ( ! b ) + return; + + b->yy_n_chars = 0; + + /* We always need two end-of-buffer characters. The first causes + * a transition to the end-of-buffer state. The second causes + * a jam in that state. + */ + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + + b->yy_buf_pos = &b->yy_ch_buf[0]; + + b->yy_at_bol = 1; + b->yy_buffer_status = YY_BUFFER_NEW; + + if ( b == yy_current_buffer ) + yy_load_buffer_state(); + } + + +#ifndef YY_NO_SCAN_BUFFER +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size ) +#else +YY_BUFFER_STATE yy_scan_buffer( base, size ) +char *base; +yy_size_t size; +#endif + { + YY_BUFFER_STATE b; + + if ( size < 2 || + base[size-2] != YY_END_OF_BUFFER_CHAR || + base[size-1] != YY_END_OF_BUFFER_CHAR ) + /* They forgot to leave room for the EOB's. */ + return 0; + + b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); + + b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ + b->yy_buf_pos = b->yy_ch_buf = base; + b->yy_is_our_buffer = 0; + b->yy_input_file = 0; + b->yy_n_chars = b->yy_buf_size; + b->yy_is_interactive = 0; + b->yy_at_bol = 1; + b->yy_fill_buffer = 0; + b->yy_buffer_status = YY_BUFFER_NEW; + + yy_switch_to_buffer( b ); + + return b; + } +#endif + + +#ifndef YY_NO_SCAN_STRING +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str ) +#else +YY_BUFFER_STATE yy_scan_string( yy_str ) +yyconst char *yy_str; +#endif + { + int len; + for ( len = 0; yy_str[len]; ++len ) + ; + + return yy_scan_bytes( yy_str, len ); + } +#endif + + +#ifndef YY_NO_SCAN_BYTES +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len ) +#else +YY_BUFFER_STATE yy_scan_bytes( bytes, len ) +yyconst char *bytes; +int len; +#endif + { + YY_BUFFER_STATE b; + char *buf; + yy_size_t n; + int i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = len + 2; + buf = (char *) yy_flex_alloc( n ); + if ( ! buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); + + for ( i = 0; i < len; ++i ) + buf[i] = bytes[i]; + + buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR; + + b = yy_scan_buffer( buf, n ); + if ( ! b ) + YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); + + /* It's okay to grow etc. this buffer, and we should throw it + * away when we're done. + */ + b->yy_is_our_buffer = 1; + + return b; + } +#endif + + +#ifndef YY_NO_PUSH_STATE +#ifdef YY_USE_PROTOS +static void yy_push_state( int new_state ) +#else +static void yy_push_state( new_state ) +int new_state; +#endif + { + if ( yy_start_stack_ptr >= yy_start_stack_depth ) + { + yy_size_t new_size; + + yy_start_stack_depth += YY_START_STACK_INCR; + new_size = yy_start_stack_depth * sizeof( int ); + + if ( ! yy_start_stack ) + yy_start_stack = (int *) yy_flex_alloc( new_size ); + + else + yy_start_stack = (int *) yy_flex_realloc( + (void *) yy_start_stack, new_size ); + + if ( ! yy_start_stack ) + YY_FATAL_ERROR( + "out of memory expanding start-condition stack" ); + } + + yy_start_stack[yy_start_stack_ptr++] = YY_START; + + BEGIN(new_state); + } +#endif + + +#ifndef YY_NO_POP_STATE +static void yy_pop_state() + { + if ( --yy_start_stack_ptr < 0 ) + YY_FATAL_ERROR( "start-condition stack underflow" ); + + BEGIN(yy_start_stack[yy_start_stack_ptr]); + } +#endif + + +#ifndef YY_NO_TOP_STATE +static int yy_top_state() + { + return yy_start_stack[yy_start_stack_ptr - 1]; + } +#endif + +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 +#endif + +#ifdef YY_USE_PROTOS +static void yy_fatal_error( yyconst char msg[] ) +#else +static void yy_fatal_error( msg ) +char msg[]; +#endif + { + (void) fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); + } + + + +/* Redefine yyless() so it works in section 3 code. */ + +#undef yyless +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + yytext[yyleng] = yy_hold_char; \ + yy_c_buf_p = yytext + n; \ + yy_hold_char = *yy_c_buf_p; \ + *yy_c_buf_p = '\0'; \ + yyleng = n; \ + } \ + while ( 0 ) + + +/* Internal utility routines. */ + +#ifndef yytext_ptr +#ifdef YY_USE_PROTOS +static void yy_flex_strncpy( char *s1, yyconst char *s2, int n ) +#else +static void yy_flex_strncpy( s1, s2, n ) +char *s1; +yyconst char *s2; +int n; +#endif + { + register int i; + for ( i = 0; i < n; ++i ) + s1[i] = s2[i]; + } +#endif + +#ifdef YY_NEED_STRLEN +#ifdef YY_USE_PROTOS +static int yy_flex_strlen( yyconst char *s ) +#else +static int yy_flex_strlen( s ) +yyconst char *s; +#endif + { + register int n; + for ( n = 0; s[n]; ++n ) + ; + + return n; + } +#endif + + +#ifdef YY_USE_PROTOS +static void *yy_flex_alloc( yy_size_t size ) +#else +static void *yy_flex_alloc( size ) +yy_size_t size; +#endif + { + return (void *) malloc( size ); + } + +#ifdef YY_USE_PROTOS +static void *yy_flex_realloc( void *ptr, yy_size_t size ) +#else +static void *yy_flex_realloc( ptr, size ) +void *ptr; +yy_size_t size; +#endif + { + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return (void *) realloc( (char *) ptr, size ); + } + +#ifdef YY_USE_PROTOS +static void yy_flex_free( void *ptr ) +#else +static void yy_flex_free( ptr ) +void *ptr; +#endif + { + free( ptr ); + } + +#if YY_MAIN +int main() + { + yylex(); + return 0; + } +#endif +#line 244 "ssl_expr_scan.l" + + +int yyinput(char *buf, int max_size) +{ + int n; + + if ((n = MIN(max_size, ssl_expr_info.inputbuf + + ssl_expr_info.inputlen + - ssl_expr_info.inputptr)) <= 0) + return YY_NULL; + memcpy(buf, ssl_expr_info.inputptr, n); + ssl_expr_info.inputptr += n; + return n; +} + diff --git a/rubbos/app/httpd-2.0.64/modules/ssl/ssl_expr_scan.l b/rubbos/app/httpd-2.0.64/modules/ssl/ssl_expr_scan.l new file mode 100644 index 00000000..86ba3b49 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/ssl/ssl_expr_scan.l @@ -0,0 +1,225 @@ +/* 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. + */ + +/* _ _ + * _ __ ___ ___ __| | ___ ___| | + * | '_ ` _ \ / _ \ / _` | / __/ __| | + * | | | | | | (_) | (_| | \__ \__ \ | mod_ssl - Apache Interface to OpenSSL + * |_| |_| |_|\___/ \__,_|___|___/___/_| http://www.modssl.org/ + * |_____| + * ssl_expr_scan.l + * Expression Scanner + */ + /* ``Killing for peace is + like fucking for virginity.'' + -- Unknown */ + +/* _________________________________________________________________ +** +** Expression Scanner +** _________________________________________________________________ +*/ + +%{ +#include "mod_ssl.h" + +#include "ssl_expr_parse.h" + +#define YY_NO_UNPUT 1 +int yyinput(char *buf, int max_size); + +#undef YY_INPUT +#define YY_INPUT(buf,result,max_size) \ + (result = yyinput(buf, max_size)) + +#define MAX_STR_LEN 2048 +%} + +%pointer +/* %option stack */ +%option never-interactive +%option noyywrap +%x str +%x regex regex_flags + +%% + + char caStr[MAX_STR_LEN]; + char *cpStr = NULL; + char caRegex[MAX_STR_LEN]; + char *cpRegex = NULL; + char cRegexDel = NUL; + + /* + * Whitespaces + */ +[ \t\n]+ { + /* NOP */ +} + + /* + * C-style strings ("...") + */ +\" { + cpStr = caStr; + BEGIN(str); +} +\" { + BEGIN(INITIAL); + *cpStr = NUL; + yylval.cpVal = apr_pstrdup(ssl_expr_info.pool, caStr); + return T_STRING; +} +\n { + yyerror("Unterminated string"); +} +\\[0-7]{1,3} { + int result; + + (void)sscanf(yytext+1, "%o", &result); + if (result > 0xff) + yyerror("Escape sequence out of bound"); + else + *cpStr++ = result; +} +\\[0-9]+ { + yyerror("Bad escape sequence"); +} +\\n { *cpStr++ = '\n'; } +\\r { *cpStr++ = '\r'; } +\\t { *cpStr++ = '\t'; } +\\b { *cpStr++ = '\b'; } +\\f { *cpStr++ = '\f'; } +\\(.|\n) { + *cpStr++ = yytext[1]; +} +[^\\\n\"]+ { + char *cp = yytext; + while (*cp != NUL) + *cpStr++ = *cp++; +} +. { + *cpStr++ = yytext[1]; +} + + /* + * Regular Expression + */ +"m". { + cRegexDel = yytext[1]; + cpRegex = caRegex; + BEGIN(regex); +} +.|\n { + if (yytext[0] == cRegexDel) { + *cpRegex = NUL; + BEGIN(regex_flags); + } + else { + *cpRegex++ = yytext[0]; + } +} +i { + yylval.cpVal = apr_pstrdup(ssl_expr_info.pool, caRegex); + BEGIN(INITIAL); + return T_REGEX_I; +} +.|\n { + yylval.cpVal = apr_pstrdup(ssl_expr_info.pool, caRegex); + yyless(0); + BEGIN(INITIAL); + return T_REGEX; +} +<> { + yylval.cpVal = apr_pstrdup(ssl_expr_info.pool, caRegex); + BEGIN(INITIAL); + return T_REGEX; +} + + /* + * Operators + */ +"eq" { return T_OP_EQ; } +"==" { return T_OP_EQ; } +"ne" { return T_OP_NE; } +"!=" { return T_OP_NE; } +"lt" { return T_OP_LT; } +"<" { return T_OP_LT; } +"le" { return T_OP_LE; } +"<=" { return T_OP_LE; } +"gt" { return T_OP_GT; } +">" { return T_OP_GT; } +"ge" { return T_OP_GE; } +">=" { return T_OP_GE; } +"=~" { return T_OP_REG; } +"!~" { return T_OP_NRE; } +"and" { return T_OP_AND; } +"&&" { return T_OP_AND; } +"or" { return T_OP_OR; } +"||" { return T_OP_OR; } +"not" { return T_OP_NOT; } +"!" { return T_OP_NOT; } +"in" { return T_OP_IN; } + + /* + * Functions + */ +"file" { return T_FUNC_FILE; } + + /* + * Specials + */ +"true" { return T_TRUE; } +"false" { return T_FALSE; } + + /* + * Digits + */ +[0-9]+ { + yylval.cpVal = apr_pstrdup(ssl_expr_info.pool, yytext); + return T_DIGIT; +} + + /* + * Identifiers + */ +[a-zA-Z][a-zA-Z0-9_:-]* { + yylval.cpVal = apr_pstrdup(ssl_expr_info.pool, yytext); + return T_ID; +} + + /* + * Anything else is returned as is... + */ +.|\n { + return yytext[0]; +} + +%% + +int yyinput(char *buf, int max_size) +{ + int n; + + if ((n = MIN(max_size, ssl_expr_info.inputbuf + + ssl_expr_info.inputlen + - ssl_expr_info.inputptr)) <= 0) + return YY_NULL; + memcpy(buf, ssl_expr_info.inputptr, n); + ssl_expr_info.inputptr += n; + return n; +} + diff --git a/rubbos/app/httpd-2.0.64/modules/ssl/ssl_scache.c b/rubbos/app/httpd-2.0.64/modules/ssl/ssl_scache.c new file mode 100644 index 00000000..d74b853b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/ssl/ssl_scache.c @@ -0,0 +1,199 @@ +/* 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. + */ + +/* _ _ + * _ __ ___ ___ __| | ___ ___| | mod_ssl + * | '_ ` _ \ / _ \ / _` | / __/ __| | Apache Interface to OpenSSL + * | | | | | | (_) | (_| | \__ \__ \ | + * |_| |_| |_|\___/ \__,_|___|___/___/_| + * |_____| + * ssl_scache.c + * Session Cache Abstraction + */ + /* ``Open-Source Software: generous + programmers from around the world all + join forces to help you shoot + yourself in the foot for free.'' + -- Unknown */ +#include "mod_ssl.h" + +/* _________________________________________________________________ +** +** Session Cache: Common Abstraction Layer +** _________________________________________________________________ +*/ + +void ssl_scache_init(server_rec *s, apr_pool_t *p) +{ + SSLModConfigRec *mc = myModConfig(s); + + /* + * Warn the user that he should use the session cache. + * But we can operate without it, of course. + */ + if (mc->nSessionCacheMode == SSL_SCMODE_UNSET) { + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s, + "Init: Session Cache is not configured " + "[hint: SSLSessionCache]"); + mc->nSessionCacheMode = SSL_SCMODE_NONE; + return; + } + + if (mc->nSessionCacheMode == SSL_SCMODE_DBM) + ssl_scache_dbm_init(s, p); + else if ((mc->nSessionCacheMode == SSL_SCMODE_SHMHT) || + (mc->nSessionCacheMode == SSL_SCMODE_SHMCB)) { + void *data; + const char *userdata_key = "ssl_scache_init"; + + apr_pool_userdata_get(&data, userdata_key, s->process->pool); + if (!data) { + apr_pool_userdata_set((const void *)1, userdata_key, + apr_pool_cleanup_null, s->process->pool); + return; + } + if (mc->nSessionCacheMode == SSL_SCMODE_SHMHT) + ssl_scache_shmht_init(s, p); + else if (mc->nSessionCacheMode == SSL_SCMODE_SHMCB) + ssl_scache_shmcb_init(s, p); + } +} + +void ssl_scache_kill(server_rec *s) +{ + SSLModConfigRec *mc = myModConfig(s); + + if (mc->nSessionCacheMode == SSL_SCMODE_DBM) + ssl_scache_dbm_kill(s); + else if (mc->nSessionCacheMode == SSL_SCMODE_SHMHT) + ssl_scache_shmht_kill(s); + else if (mc->nSessionCacheMode == SSL_SCMODE_SHMCB) + ssl_scache_shmcb_kill(s); + return; +} + +BOOL ssl_scache_store(server_rec *s, UCHAR *id, int idlen, time_t expiry, SSL_SESSION *sess) +{ + SSLModConfigRec *mc = myModConfig(s); + BOOL rv = FALSE; + + if (mc->nSessionCacheMode == SSL_SCMODE_DBM) + rv = ssl_scache_dbm_store(s, id, idlen, expiry, sess); + else if (mc->nSessionCacheMode == SSL_SCMODE_SHMHT) + rv = ssl_scache_shmht_store(s, id, idlen, expiry, sess); + else if (mc->nSessionCacheMode == SSL_SCMODE_SHMCB) + rv = ssl_scache_shmcb_store(s, id, idlen, expiry, sess); + return rv; +} + +SSL_SESSION *ssl_scache_retrieve(server_rec *s, UCHAR *id, int idlen) +{ + SSLModConfigRec *mc = myModConfig(s); + SSL_SESSION *sess = NULL; + + if (mc->nSessionCacheMode == SSL_SCMODE_DBM) + sess = ssl_scache_dbm_retrieve(s, id, idlen); + else if (mc->nSessionCacheMode == SSL_SCMODE_SHMHT) + sess = ssl_scache_shmht_retrieve(s, id, idlen); + else if (mc->nSessionCacheMode == SSL_SCMODE_SHMCB) + sess = ssl_scache_shmcb_retrieve(s, id, idlen); + return sess; +} + +void ssl_scache_remove(server_rec *s, UCHAR *id, int idlen) +{ + SSLModConfigRec *mc = myModConfig(s); + + if (mc->nSessionCacheMode == SSL_SCMODE_DBM) + ssl_scache_dbm_remove(s, id, idlen); + else if (mc->nSessionCacheMode == SSL_SCMODE_SHMHT) + ssl_scache_shmht_remove(s, id, idlen); + else if (mc->nSessionCacheMode == SSL_SCMODE_SHMCB) + ssl_scache_shmcb_remove(s, id, idlen); + return; +} + +void ssl_scache_status(server_rec *s, apr_pool_t *p, void (*func)(char *, void *), void *arg) +{ + SSLModConfigRec *mc = myModConfig(s); + + if (mc->nSessionCacheMode == SSL_SCMODE_DBM) + ssl_scache_dbm_status(s, p, func, arg); + else if (mc->nSessionCacheMode == SSL_SCMODE_SHMHT) + ssl_scache_shmht_status(s, p, func, arg); + else if (mc->nSessionCacheMode == SSL_SCMODE_SHMCB) + ssl_scache_shmcb_status(s, p, func, arg); + return; +} + +void ssl_scache_expire(server_rec *s) +{ + SSLModConfigRec *mc = myModConfig(s); + + if (mc->nSessionCacheMode == SSL_SCMODE_DBM) + ssl_scache_dbm_expire(s); + else if (mc->nSessionCacheMode == SSL_SCMODE_SHMHT) + ssl_scache_shmht_expire(s); + else if (mc->nSessionCacheMode == SSL_SCMODE_SHMCB) + ssl_scache_shmcb_expire(s); + return; +} + +/* _________________________________________________________________ +** +** SSL Extension to mod_status +** _________________________________________________________________ +*/ +#if 0 /* NOT YET */ +static void ssl_ext_ms_display(request_rec *, int, int); + +void ssl_scache_status_register(apr_pool_t *p) +{ + /* XXX point mod_status to this update, when it grows the opt fn */ +#if 0 + ap_hook_register("ap::mod_status::display", ssl_ext_ms_display, AP_HOOK_NOCTX); +#endif + return; +} + +static void ssl_ext_ms_display_cb(char *str, void *_r) +{ + request_rec *r = (request_rec *)_r; + if (str != NULL) + ap_rputs(str, r); + return; +} + +static void ssl_ext_ms_display(request_rec *r, int no_table_report, int short_report) +{ + SSLSrvConfigRec *sc = mySrvConfig(r->server); + + if (sc == NULL) + return; + if (short_report) + return; + ap_rputs("
    \n", r); + ap_rputs("\n", r); + ap_rputs("\n", r); + ap_rputs("\n", r); + ap_rputs("
    \n", r); + ap_rputs("SSL/TLS Session Cache Status:\r", r); + ap_rputs("
    \n", r); + ssl_scache_status(r->server, r->pool, ssl_ext_ms_display_cb, r); + ap_rputs("
    \n", r); + return; +} +#endif diff --git a/rubbos/app/httpd-2.0.64/modules/ssl/ssl_scache_dbm.c b/rubbos/app/httpd-2.0.64/modules/ssl/ssl_scache_dbm.c new file mode 100644 index 00000000..10ab9c89 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/ssl/ssl_scache_dbm.c @@ -0,0 +1,462 @@ +/* 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. + */ + +/* _ _ + * _ __ ___ ___ __| | ___ ___| | mod_ssl + * | '_ ` _ \ / _ \ / _` | / __/ __| | Apache Interface to OpenSSL + * | | | | | | (_) | (_| | \__ \__ \ | + * |_| |_| |_|\___/ \__,_|___|___/___/_| + * |_____| + * ssl_scache_dbm.c + * Session Cache via DBM + */ + +#include "mod_ssl.h" + +void ssl_scache_dbm_init(server_rec *s, apr_pool_t *p) +{ + SSLModConfigRec *mc = myModConfig(s); + apr_dbm_t *dbm; + apr_status_t rv; + + /* for the DBM we need the data file */ + if (mc->szSessionCacheDataFile == NULL) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, + "SSLSessionCache required"); + ssl_die(); + } + + /* open it once to create it and to make sure it _can_ be created */ + ssl_mutex_on(s); + if ((rv = apr_dbm_open(&dbm, mc->szSessionCacheDataFile, + APR_DBM_RWCREATE, SSL_DBM_FILE_MODE, mc->pPool)) != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, s, + "Cannot create SSLSessionCache DBM file `%s'", + mc->szSessionCacheDataFile); + ssl_mutex_off(s); + return; + } + apr_dbm_close(dbm); + +#if !defined(OS2) && !defined(WIN32) && !defined(BEOS) && !defined(NETWARE) + /* + * We have to make sure the Apache child processes have access to + * the DBM file. But because there are brain-dead platforms where we + * cannot exactly determine the suffixes we try all possibilities. + */ + if (geteuid() == 0 /* is superuser */) { + chown(mc->szSessionCacheDataFile, unixd_config.user_id, -1 /* no gid change */); + if (chown(apr_pstrcat(p, mc->szSessionCacheDataFile, SSL_DBM_FILE_SUFFIX_DIR, NULL), + unixd_config.user_id, -1) == -1) { + if (chown(apr_pstrcat(p, mc->szSessionCacheDataFile, ".db", NULL), + unixd_config.user_id, -1) == -1) + chown(apr_pstrcat(p, mc->szSessionCacheDataFile, ".dir", NULL), + unixd_config.user_id, -1); + } + if (chown(apr_pstrcat(p, mc->szSessionCacheDataFile, SSL_DBM_FILE_SUFFIX_PAG, NULL), + unixd_config.user_id, -1) == -1) { + if (chown(apr_pstrcat(p, mc->szSessionCacheDataFile, ".db", NULL), + unixd_config.user_id, -1) == -1) + chown(apr_pstrcat(p, mc->szSessionCacheDataFile, ".pag", NULL), + unixd_config.user_id, -1); + } + } +#endif + ssl_mutex_off(s); + ssl_scache_dbm_expire(s); + return; +} + +void ssl_scache_dbm_kill(server_rec *s) +{ + SSLModConfigRec *mc = myModConfig(s); + apr_pool_t *p; + + apr_pool_sub_make(&p, mc->pPool, NULL); + if (p != NULL) { + /* the correct way */ + unlink(apr_pstrcat(p, mc->szSessionCacheDataFile, SSL_DBM_FILE_SUFFIX_DIR, NULL)); + unlink(apr_pstrcat(p, mc->szSessionCacheDataFile, SSL_DBM_FILE_SUFFIX_PAG, NULL)); + /* the additional ways to be sure */ + unlink(apr_pstrcat(p, mc->szSessionCacheDataFile, ".dir", NULL)); + unlink(apr_pstrcat(p, mc->szSessionCacheDataFile, ".pag", NULL)); + unlink(apr_pstrcat(p, mc->szSessionCacheDataFile, ".db", NULL)); + unlink(mc->szSessionCacheDataFile); + apr_pool_destroy(p); + } + return; +} + +BOOL ssl_scache_dbm_store(server_rec *s, UCHAR *id, int idlen, time_t expiry, SSL_SESSION *sess) +{ + SSLModConfigRec *mc = myModConfig(s); + apr_dbm_t *dbm; + apr_datum_t dbmkey; + apr_datum_t dbmval; + UCHAR ucaData[SSL_SESSION_MAX_DER]; + int nData; + UCHAR *ucp; + apr_status_t rv; + + /* streamline session data */ + if ((nData = i2d_SSL_SESSION(sess, NULL)) > sizeof(ucaData)) { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "streamline session data size too large: %d > %d", + nData, sizeof(ucaData)); + return FALSE; + } + ucp = ucaData; + i2d_SSL_SESSION(sess, &ucp); + + /* be careful: do not try to store too much bytes in a DBM file! */ +#ifdef PAIRMAX + if ((idlen + nData) >= PAIRMAX) { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "data size too large for DBM session cache: %d >= %d", + (idlen + nData), PAIRMAX); + return FALSE; + } +#else + if ((idlen + nData) >= 950 /* at least less than approx. 1KB */) { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "data size too large for DBM session cache: %d >= %d", + (idlen + nData), 950); + return FALSE; + } +#endif + + /* create DBM key */ + dbmkey.dptr = (char *)id; + dbmkey.dsize = idlen; + + /* create DBM value */ + dbmval.dsize = sizeof(time_t) + nData; + dbmval.dptr = (char *)malloc(dbmval.dsize); + if (dbmval.dptr == NULL) { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "malloc error creating DBM value"); + return FALSE; + } + memcpy((char *)dbmval.dptr, &expiry, sizeof(time_t)); + memcpy((char *)dbmval.dptr+sizeof(time_t), ucaData, nData); + + /* and store it to the DBM file */ + ssl_mutex_on(s); + if ((rv = apr_dbm_open(&dbm, mc->szSessionCacheDataFile, + APR_DBM_RWCREATE, SSL_DBM_FILE_MODE, mc->pPool)) != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, s, + "Cannot open SSLSessionCache DBM file `%s' for writing " + "(store)", + mc->szSessionCacheDataFile); + ssl_mutex_off(s); + free(dbmval.dptr); + return FALSE; + } + if ((rv = apr_dbm_store(dbm, dbmkey, dbmval)) != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, s, + "Cannot store SSL session to DBM file `%s'", + mc->szSessionCacheDataFile); + apr_dbm_close(dbm); + ssl_mutex_off(s); + free(dbmval.dptr); + return FALSE; + } + apr_dbm_close(dbm); + ssl_mutex_off(s); + + /* free temporary buffers */ + free(dbmval.dptr); + + /* allow the regular expiring to occur */ + ssl_scache_dbm_expire(s); + + return TRUE; +} + +SSL_SESSION *ssl_scache_dbm_retrieve(server_rec *s, UCHAR *id, int idlen) +{ + SSLModConfigRec *mc = myModConfig(s); + apr_dbm_t *dbm; + apr_datum_t dbmkey; + apr_datum_t dbmval; + SSL_SESSION *sess = NULL; + MODSSL_D2I_SSL_SESSION_CONST unsigned char *ucpData; + int nData; + time_t expiry; + time_t now; + apr_status_t rc; + + /* allow the regular expiring to occur */ + ssl_scache_dbm_expire(s); + + /* create DBM key and values */ + dbmkey.dptr = (char *)id; + dbmkey.dsize = idlen; + + /* and fetch it from the DBM file + * XXX: Should we open the dbm against r->pool so the cleanup will + * do the apr_dbm_close? This would make the code a bit cleaner. + */ + ssl_mutex_on(s); + if ((rc = apr_dbm_open(&dbm, mc->szSessionCacheDataFile, + APR_DBM_RWCREATE, SSL_DBM_FILE_MODE, mc->pPool)) != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, rc, s, + "Cannot open SSLSessionCache DBM file `%s' for reading " + "(fetch)", + mc->szSessionCacheDataFile); + ssl_mutex_off(s); + return NULL; + } + rc = apr_dbm_fetch(dbm, dbmkey, &dbmval); + if (rc != APR_SUCCESS) { + apr_dbm_close(dbm); + ssl_mutex_off(s); + return NULL; + } + if (dbmval.dptr == NULL || dbmval.dsize <= sizeof(time_t)) { + apr_dbm_close(dbm); + ssl_mutex_off(s); + return NULL; + } + + /* parse resulting data */ + nData = dbmval.dsize-sizeof(time_t); + ucpData = malloc(nData); + if (ucpData == NULL) { + apr_dbm_close(dbm); + ssl_mutex_off(s); + return NULL; + } + /* Cast needed, ucpData may be const */ + memcpy((unsigned char *)ucpData, + (char *)dbmval.dptr + sizeof(time_t), nData); + memcpy(&expiry, dbmval.dptr, sizeof(time_t)); + + apr_dbm_close(dbm); + ssl_mutex_off(s); + + /* make sure the stuff is still not expired */ + now = time(NULL); + if (expiry <= now) { + ssl_scache_dbm_remove(s, id, idlen); + return NULL; + } + + /* unstreamed SSL_SESSION */ + sess = d2i_SSL_SESSION(NULL, &ucpData, nData); + + return sess; +} + +void ssl_scache_dbm_remove(server_rec *s, UCHAR *id, int idlen) +{ + SSLModConfigRec *mc = myModConfig(s); + apr_dbm_t *dbm; + apr_datum_t dbmkey; + apr_status_t rv; + + /* create DBM key and values */ + dbmkey.dptr = (char *)id; + dbmkey.dsize = idlen; + + /* and delete it from the DBM file */ + ssl_mutex_on(s); + if ((rv = apr_dbm_open(&dbm, mc->szSessionCacheDataFile, + APR_DBM_RWCREATE, SSL_DBM_FILE_MODE, mc->pPool)) != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, s, + "Cannot open SSLSessionCache DBM file `%s' for writing " + "(delete)", + mc->szSessionCacheDataFile); + ssl_mutex_off(s); + return; + } + apr_dbm_delete(dbm, dbmkey); + apr_dbm_close(dbm); + ssl_mutex_off(s); + + return; +} + +void ssl_scache_dbm_expire(server_rec *s) +{ + SSLModConfigRec *mc = myModConfig(s); + SSLSrvConfigRec *sc = mySrvConfig(s); + static time_t tLast = 0; + apr_dbm_t *dbm; + apr_datum_t dbmkey; + apr_datum_t dbmval; + apr_pool_t *p; + time_t tExpiresAt; + int nElements = 0; + int nDeleted = 0; + int bDelete; + apr_datum_t *keylist; + int keyidx; + int i; + time_t tNow; + apr_status_t rv; + + /* + * make sure the expiration for still not-accessed session + * cache entries is done only from time to time + */ + tNow = time(NULL); + if (tNow < tLast+sc->session_cache_timeout) + return; + tLast = tNow; + + /* + * Here we have to be very carefully: Not all DBM libraries are + * smart enough to allow one to iterate over the elements and at the + * same time delete expired ones. Some of them get totally crazy + * while others have no problems. So we have to do it the slower but + * more safe way: we first iterate over all elements and remember + * those which have to be expired. Then in a second pass we delete + * all those expired elements. Additionally we reopen the DBM file + * to be really safe in state. + */ + +#define KEYMAX 1024 + + ssl_mutex_on(s); + for (;;) { + /* allocate the key array in a memory sub pool */ + apr_pool_sub_make(&p, mc->pPool, NULL); + if (p == NULL) + break; + if ((keylist = apr_palloc(p, sizeof(dbmkey)*KEYMAX)) == NULL) { + apr_pool_destroy(p); + break; + } + + /* pass 1: scan DBM database */ + keyidx = 0; + if ((rv = apr_dbm_open(&dbm, mc->szSessionCacheDataFile, + APR_DBM_RWCREATE,SSL_DBM_FILE_MODE, + p)) != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, s, + "Cannot open SSLSessionCache DBM file `%s' for " + "scanning", + mc->szSessionCacheDataFile); + apr_pool_destroy(p); + break; + } + apr_dbm_firstkey(dbm, &dbmkey); + while (dbmkey.dptr != NULL) { + nElements++; + bDelete = FALSE; + apr_dbm_fetch(dbm, dbmkey, &dbmval); + if (dbmval.dsize <= sizeof(time_t) || dbmval.dptr == NULL) + bDelete = TRUE; + else { + memcpy(&tExpiresAt, dbmval.dptr, sizeof(time_t)); + if (tExpiresAt <= tNow) + bDelete = TRUE; + } + if (bDelete) { + if ((keylist[keyidx].dptr = apr_palloc(p, dbmkey.dsize)) != NULL) { + memcpy(keylist[keyidx].dptr, dbmkey.dptr, dbmkey.dsize); + keylist[keyidx].dsize = dbmkey.dsize; + keyidx++; + if (keyidx == KEYMAX) + break; + } + } + apr_dbm_nextkey(dbm, &dbmkey); + } + apr_dbm_close(dbm); + + /* pass 2: delete expired elements */ + if (apr_dbm_open(&dbm, mc->szSessionCacheDataFile, + APR_DBM_RWCREATE,SSL_DBM_FILE_MODE, p) != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, s, + "Cannot re-open SSLSessionCache DBM file `%s' for " + "expiring", + mc->szSessionCacheDataFile); + apr_pool_destroy(p); + break; + } + for (i = 0; i < keyidx; i++) { + apr_dbm_delete(dbm, keylist[i]); + nDeleted++; + } + apr_dbm_close(dbm); + + /* destroy temporary pool */ + apr_pool_destroy(p); + + if (keyidx < KEYMAX) + break; + } + ssl_mutex_off(s); + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "Inter-Process Session Cache (DBM) Expiry: " + "old: %d, new: %d, removed: %d", + nElements, nElements-nDeleted, nDeleted); + return; +} + +void ssl_scache_dbm_status(server_rec *s, apr_pool_t *p, void (*func)(char *, void *), void *arg) +{ + SSLModConfigRec *mc = myModConfig(s); + apr_dbm_t *dbm; + apr_datum_t dbmkey; + apr_datum_t dbmval; + int nElem; + int nSize; + int nAverage; + apr_status_t rv; + + nElem = 0; + nSize = 0; + ssl_mutex_on(s); + /* + * XXX - Check what pool is to be used - TBD + */ + if ((rv = apr_dbm_open(&dbm, mc->szSessionCacheDataFile, + APR_DBM_RWCREATE, SSL_DBM_FILE_MODE, + mc->pPool)) != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, s, + "Cannot open SSLSessionCache DBM file `%s' for status " + "retrival", + mc->szSessionCacheDataFile); + ssl_mutex_off(s); + return; + } + /* + * XXX - Check the return value of apr_dbm_firstkey, apr_dbm_fetch - TBD + */ + apr_dbm_firstkey(dbm, &dbmkey); + for ( ; dbmkey.dptr != NULL; apr_dbm_nextkey(dbm, &dbmkey)) { + apr_dbm_fetch(dbm, dbmkey, &dbmval); + if (dbmval.dptr == NULL) + continue; + nElem += 1; + nSize += dbmval.dsize; + } + apr_dbm_close(dbm); + ssl_mutex_off(s); + if (nSize > 0 && nElem > 0) + nAverage = nSize / nElem; + else + nAverage = 0; + func(apr_psprintf(p, "cache type: DBM, maximum size: unlimited
    "), arg); + func(apr_psprintf(p, "current sessions: %d, current size: %d bytes
    ", nElem, nSize), arg); + func(apr_psprintf(p, "average session size: %d bytes
    ", nAverage), arg); + return; +} + diff --git a/rubbos/app/httpd-2.0.64/modules/ssl/ssl_scache_shmcb.c b/rubbos/app/httpd-2.0.64/modules/ssl/ssl_scache_shmcb.c new file mode 100644 index 00000000..cee66bf5 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/ssl/ssl_scache_shmcb.c @@ -0,0 +1,1362 @@ +/* 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. + */ + +/* _ _ + * _ __ ___ ___ __| | ___ ___| | mod_ssl + * | '_ ` _ \ / _ \ / _` | / __/ __| | Apache Interface to OpenSSL + * | | | | | | (_) | (_| | \__ \__ \ | + * |_| |_| |_|\___/ \__,_|___|___/___/_| + * |_____| + * ssl_scache_shmcb.c + * Session Cache via Shared Memory (Cyclic Buffer Variant) + */ + +#include "mod_ssl.h" + +/* + * This shared memory based SSL session cache implementation was + * originally written by Geoff Thorpe for C2Net + * Europe as a contribution to Ralf Engelschall's mod_ssl project. + */ + +/* + * The shared-memory segment header can be cast to and from the + * SHMCBHeader type, all other structures need to be initialised by + * utility functions. + * + * The "header" looks like this; + * + * data applying to the overall structure: + * - division_offset (unsigned int): + * how far into the shared memory segment the first division is. + * - division_size (unsigned int): + * how many bytes each division occupies. + * (NB: This includes the queue and the cache) + * - division_mask (unsigned char): + * the "mask" in the next line. Add one to this, + * and that's the number of divisions. + * + * data applying to within each division: + * - queue_size (unsigned int): + * how big each "queue" is. NB: The queue is the first block in each + * division and is followed immediately by the cache itself so so + * there's no cache_offset value. + * + * data applying to within each queue: + * - index_num (unsigned char): + * how many indexes in each cache's queue + * - index_offset (unsigned char): + * how far into the queue the first index is. + * - index_size: + * how big each index is. + * + * data applying to within each cache: + * - cache_data_offset (unsigned int): + * how far into the cache the session-data array is stored. + * - cache_data_size (unsigned int): + * how big each cache's data block is. + * + * statistics data (this will eventually be per-division but right now + * there's only one mutex): + * - stores (unsigned long): + * how many stores have been performed in the cache. + * - expiries (unsigned long): + * how many session have been expired from the cache. + * - scrolled (unsigned long): + * how many sessions have been scrolled out of full cache during a + * "store" operation. This is different to the "removes" stats as + * they are requested by mod_ssl/Apache, these are done because of + * cache logistics. (NB: Also, this value should be deducible from + * the others if my code has no bugs, but I count it anyway - plus + * it helps debugging :-). + * - retrieves_hit (unsigned long): + * how many session-retrieves have succeeded. + * - retrieves_miss (unsigned long): + * how many session-retrieves have failed. + * - removes_hit (unsigned long): + * - removes_miss (unsigned long): + * + * Following immediately after the header is an array of "divisions". + * Each division is simply a "queue" immediately followed by its + * corresponding "cache". Each division handles some pre-defined band + * of sessions by using the "division_mask" in the header. Eg. if + * division_mask=0x1f then there are 32 divisions, the first of which + * will store sessions whose least-significant 5 bits are 0, the second + * stores session whose LS 5 bits equal 1, etc. A queue is an indexing + * structure referring to its corresponding cache. + * + * A "queue" looks like this; + * + * - first_pos (unsigned int): + * the location within the array of indexes where the virtual + * "left-hand-edge" of the cyclic buffer is. + * - pos_count (unsigned int): + * the number of indexes occupied from first_pos onwards. + * + * ...followed by an array of indexes, each of which can be + * memcpy'd to and from an SHMCBIndex, and look like this; + * + * - expires (time_t): + * the time() value at which this session expires. + * - offset (unsigned int): + * the offset within the cache data block where the corresponding + * session is stored. + * - s_id2 (unsigned char): + * the second byte of the session_id, stored as an optimisation to + * reduce the number of d2i_SSL_SESSION calls that are made when doing + * a lookup. + * - removed (unsigned char): + * a byte used to indicate whether a session has been "passively" + * removed. Ie. it is still in the cache but is to be disregarded by + * any "retrieve" operation. + * + * A "cache" looks like this; + * + * - first_pos (unsigned int): + * the location within the data block where the virtual + * "left-hand-edge" of the cyclic buffer is. + * - pos_count (unsigned int): + * the number of bytes used in the data block from first_pos onwards. + * + * ...followed by the data block in which actual DER-encoded SSL + * sessions are stored. + */ + +/* + * Header - can be memcpy'd to and from the front of the shared + * memory segment. NB: The first copy (commented out) has the + * elements in a meaningful order, but due to data-alignment + * braindeadness, the second (uncommented) copy has the types grouped + * so as to decrease "struct-bloat". sigh. + */ +typedef struct { + unsigned long num_stores; + unsigned long num_expiries; + unsigned long num_scrolled; + unsigned long num_retrieves_hit; + unsigned long num_retrieves_miss; + unsigned long num_removes_hit; + unsigned long num_removes_miss; + unsigned int division_offset; + unsigned int division_size; + unsigned int queue_size; + unsigned int cache_data_offset; + unsigned int cache_data_size; + unsigned char division_mask; + unsigned int index_num; + unsigned int index_offset; + unsigned int index_size; +} SHMCBHeader; + +/* + * Index - can be memcpy'd to and from an index inside each + * queue's index array. + */ +typedef struct { + time_t expires; + unsigned int offset; + unsigned char s_id2; + unsigned char removed; +} SHMCBIndex; + +/* + * Queue - must be populated by a call to shmcb_get_division + * and the structure's pointers are used for updating (ie. + * the structure doesn't need any "set" to update values). + */ +typedef struct { + SHMCBHeader *header; + unsigned int *first_pos; + unsigned int *pos_count; + SHMCBIndex *indexes; +} SHMCBQueue; + +/* + * Cache - same comment as for Queue. 'Queue's are in a 1-1 + * correspondance with 'Cache's and are usually carried round + * in a pair, they are only seperated for clarity. + */ +typedef struct { + SHMCBHeader *header; + unsigned int *first_pos; + unsigned int *pos_count; + unsigned char *data; +} SHMCBCache; + +/* + * Forward function prototypes. + */ + +/* Functions for working around data-alignment-picky systems (sparcs, + Irix, etc). These use "memcpy" as a way of foxing these systems into + treating the composite types as byte-arrays rather than higher-level + primitives that it prefers to have 4-(or 8-)byte aligned. I don't + envisage this being a performance issue as a couple of 2 or 4 byte + memcpys can hardly make a dent on the massive memmove operations this + cache technique avoids, nor the overheads of ASN en/decoding. */ +static unsigned int shmcb_get_safe_uint(unsigned int *); +static void shmcb_set_safe_uint_ex(unsigned char *, const unsigned char *); +#define shmcb_set_safe_uint(pdest, src) \ + do { \ + unsigned int tmp_uint = src; \ + shmcb_set_safe_uint_ex((unsigned char *)pdest, \ + (const unsigned char *)(&tmp_uint)); \ + } while(0) +#if 0 /* Unused so far */ +static unsigned long shmcb_get_safe_ulong(unsigned long *); +static void shmcb_set_safe_ulong_ex(unsigned char *, const unsigned char *); +#define shmcb_set_safe_ulong(pdest, src) \ + do { \ + unsigned long tmp_ulong = src; \ + shmcb_set_safe_ulong_ex((unsigned char *)pdest, \ + (const unsigned char *)(&tmp_ulong)); \ + } while(0) +#endif +static time_t shmcb_get_safe_time(time_t *); +static void shmcb_set_safe_time_ex(unsigned char *, const unsigned char *); +#define shmcb_set_safe_time(pdest, src) \ + do { \ + time_t tmp_time = src; \ + shmcb_set_safe_time_ex((unsigned char *)pdest, \ + (const unsigned char *)(&tmp_time)); \ + } while(0) + +/* This is necessary simply so that the size passed to memset() is not a + * compile-time constant, preventing the compiler from optimising it. */ +static void shmcb_safe_clear(void *ptr, size_t size) +{ + memset(ptr, 0, size); +} + +/* Underlying functions for session-caching */ +static BOOL shmcb_init_memory(server_rec *, void *, unsigned int); +static BOOL shmcb_store_session(server_rec *, void *, UCHAR *, int, SSL_SESSION *, time_t); +static SSL_SESSION *shmcb_retrieve_session(server_rec *, void *, UCHAR *, int); +static BOOL shmcb_remove_session(server_rec *, void *, UCHAR *, int); + +/* Utility functions for manipulating the structures */ +static void shmcb_get_header(void *, SHMCBHeader **); +static BOOL shmcb_get_division(SHMCBHeader *, SHMCBQueue *, SHMCBCache *, unsigned int); +static SHMCBIndex *shmcb_get_index(const SHMCBQueue *, unsigned int); +static unsigned int shmcb_expire_division(server_rec *, SHMCBQueue *, SHMCBCache *); +static BOOL shmcb_insert_encoded_session(server_rec *, SHMCBQueue *, SHMCBCache *, unsigned char *, unsigned int, unsigned char *, time_t); +static SSL_SESSION *shmcb_lookup_session_id(server_rec *, SHMCBQueue *, SHMCBCache *, UCHAR *, unsigned int); +static BOOL shmcb_remove_session_id(server_rec *, SHMCBQueue *, SHMCBCache *, UCHAR *, unsigned int); + +/* + * Data-alignment functions (a.k.a. avoidance tactics) + * + * NB: On HPUX (and possibly others) there is a *very* mischievous little + * "optimisation" in the compilers where it will convert the following; + * memcpy(dest_ptr, &source, sizeof(unsigned int)); + * (where dest_ptr is of type (unsigned int *) and source is (unsigned int)) + * into; + * *dest_ptr = source; (or *dest_ptr = *(&source), not sure). + * Either way, it completely destroys the whole point of these _safe_ + * functions, because the assignment operation will fall victim to the + * architecture's byte-alignment dictations, whereas the memcpy (as a + * byte-by-byte copy) should not. sigh. So, if you're wondering about the + * apparently unnecessary conversions to (unsigned char *) in these + * functions, you now have an explanation. Don't just revert them back and + * say "ooh look, it still works" - if you try it on HPUX (well, 32-bit + * HPUX 11.00 at least) you may find it fails with a SIGBUS. :-( + */ + +static unsigned int shmcb_get_safe_uint(unsigned int *ptr) +{ + unsigned int ret; + shmcb_set_safe_uint_ex((unsigned char *)(&ret), + (const unsigned char *)ptr); + return ret; +} + +static void shmcb_set_safe_uint_ex(unsigned char *dest, + const unsigned char *src) +{ + memcpy(dest, src, sizeof(unsigned int)); +} + +#if 0 /* Unused so far */ +static unsigned long shmcb_get_safe_ulong(unsigned long *ptr) +{ + unsigned long ret; + shmcb_set_safe_ulong_ex((unsigned char *)(&ret), + (const unsigned char *)ptr); + return ret; +} + +static void shmcb_set_safe_ulong_ex(unsigned char *dest, + const unsigned char *src) +{ + memcpy(dest, src, sizeof(unsigned long)); +} +#endif + +static time_t shmcb_get_safe_time(time_t * ptr) +{ + time_t ret; + shmcb_set_safe_time_ex((unsigned char *)(&ret), + (const unsigned char *)ptr); + return ret; +} + +static void shmcb_set_safe_time_ex(unsigned char *dest, + const unsigned char *src) +{ + memcpy(dest, src, sizeof(time_t)); +} +/* +** +** High-Level "handlers" as per ssl_scache.c +** +*/ + +void ssl_scache_shmcb_init(server_rec *s, apr_pool_t *p) +{ + SSLModConfigRec *mc = myModConfig(s); + void *shm_segment; + apr_size_t shm_segsize; + apr_status_t rv; + + /* + * Create shared memory segment + */ + if (mc->szSessionCacheDataFile == NULL) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, + "SSLSessionCache required"); + ssl_die(); + } + + /* Use anonymous shm by default, fall back on name-based. */ + rv = apr_shm_create(&(mc->pSessionCacheDataMM), + mc->nSessionCacheDataSize, + NULL, mc->pPool); + + if (APR_STATUS_IS_ENOTIMPL(rv)) { + rv = apr_shm_create(&(mc->pSessionCacheDataMM), + mc->nSessionCacheDataSize, + mc->szSessionCacheDataFile, + mc->pPool); + } + + if (rv != APR_SUCCESS) { + char buf[100]; + ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, + "Cannot allocate shared memory: (%d)%s", rv, + apr_strerror(rv, buf, sizeof(buf))); + ssl_die(); + } + shm_segment = apr_shm_baseaddr_get(mc->pSessionCacheDataMM); + shm_segsize = apr_shm_size_get(mc->pSessionCacheDataMM); + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "shmcb_init allocated %" APR_SIZE_T_FMT + " bytes of shared memory", + shm_segsize); + if (!shmcb_init_memory(s, shm_segment, shm_segsize)) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, + "Failure initialising 'shmcb' shared memory"); + ssl_die(); + } + ap_log_error(APLOG_MARK, APLOG_INFO, 0, s, + "Shared memory session cache initialised"); + + /* + * Success ... we hack the memory block into place by cheating for + * now and stealing a member variable the original shared memory + * cache was using. :-) + */ + mc->tSessionCacheDataTable = (table_t *) shm_segment; + return; +} + +void ssl_scache_shmcb_kill(server_rec *s) +{ + SSLModConfigRec *mc = myModConfig(s); + + if (mc->pSessionCacheDataMM != NULL) { + apr_shm_destroy(mc->pSessionCacheDataMM); + mc->pSessionCacheDataMM = NULL; + } + return; +} + +BOOL ssl_scache_shmcb_store(server_rec *s, UCHAR *id, int idlen, + time_t timeout, SSL_SESSION * pSession) +{ + SSLModConfigRec *mc = myModConfig(s); + void *shm_segment; + BOOL to_return = FALSE; + + /* We've kludged our pointer into the other cache's member variable. */ + shm_segment = (void *) mc->tSessionCacheDataTable; + ssl_mutex_on(s); + if (!shmcb_store_session(s, shm_segment, id, idlen, pSession, timeout)) + /* in this cache engine, "stores" should never fail. */ + ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, + "'shmcb' code was unable to store a " + "session in the cache."); + else { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "shmcb_store successful"); + to_return = TRUE; + } + ssl_mutex_off(s); + return to_return; +} + +SSL_SESSION *ssl_scache_shmcb_retrieve(server_rec *s, UCHAR *id, int idlen) +{ + SSLModConfigRec *mc = myModConfig(s); + void *shm_segment; + SSL_SESSION *pSession; + + /* We've kludged our pointer into the other cache's member variable. */ + shm_segment = (void *) mc->tSessionCacheDataTable; + ssl_mutex_on(s); + pSession = shmcb_retrieve_session(s, shm_segment, id, idlen); + ssl_mutex_off(s); + if (pSession) + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "shmcb_retrieve had a hit"); + else { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "shmcb_retrieve had a miss"); + ap_log_error(APLOG_MARK, APLOG_INFO, 0, s, + "Client requested a 'session-resume' but " + "we have no such session."); + } + return pSession; +} + +void ssl_scache_shmcb_remove(server_rec *s, UCHAR *id, int idlen) +{ + SSLModConfigRec *mc = myModConfig(s); + void *shm_segment; + + /* We've kludged our pointer into the other cache's member variable. */ + shm_segment = (void *) mc->tSessionCacheDataTable; + ssl_mutex_on(s); + shmcb_remove_session(s, shm_segment, id, idlen); + ssl_mutex_off(s); +} + +void ssl_scache_shmcb_expire(server_rec *s) +{ + /* NOP */ + return; +} + +void ssl_scache_shmcb_status(server_rec *s, apr_pool_t *p, + void (*func) (char *, void *), void *arg) +{ + SSLModConfigRec *mc = myModConfig(s); + SHMCBHeader *header; + SHMCBQueue queue; + SHMCBCache cache; + SHMCBIndex *idx; + void *shm_segment; + unsigned int loop, total, cache_total, non_empty_divisions; + int index_pct, cache_pct; + double expiry_total; + time_t average_expiry, now, max_expiry, min_expiry, idxexpiry; + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "inside ssl_scache_shmcb_status"); + + /* We've kludged our pointer into the other cache's member variable. */ + shm_segment = (void *) mc->tSessionCacheDataTable; + + /* Get the header structure. */ + shmcb_get_header(shm_segment, &header); + total = cache_total = non_empty_divisions = 0; + average_expiry = max_expiry = min_expiry = 0; + expiry_total = 0; + + /* It may seem strange to grab "now" at this point, but in theory + * we should never have a negative threshold but grabbing "now" after + * the loop (which performs expiries) could allow that chance. */ + now = time(NULL); + for (loop = 0; loop <= header->division_mask; loop++) { + if (shmcb_get_division(header, &queue, &cache, loop)) { + shmcb_expire_division(s, &queue, &cache); + total += shmcb_get_safe_uint(queue.pos_count); + cache_total += shmcb_get_safe_uint(cache.pos_count); + if (shmcb_get_safe_uint(queue.pos_count) > 0) { + idx = shmcb_get_index(&queue, + shmcb_get_safe_uint(queue.first_pos)); + non_empty_divisions++; + idxexpiry = shmcb_get_safe_time(&(idx->expires)); + expiry_total += (double) idxexpiry; + max_expiry = (idxexpiry > max_expiry ? idxexpiry : + max_expiry); + if (min_expiry == 0) + min_expiry = idxexpiry; + else + min_expiry = (idxexpiry < min_expiry ? idxexpiry : + min_expiry); + } + } + } + index_pct = (100 * total) / (header->index_num * (header->division_mask + 1)); + cache_pct = (100 * cache_total) / (header->cache_data_size * (header->division_mask + 1)); + func(apr_psprintf(p, "cache type: SHMCB, shared memory: %d " + "bytes, current sessions: %d
    ", + mc->nSessionCacheDataSize, total), arg); + func(apr_psprintf(p, "sub-caches: %d, indexes per sub-cache: " + "%d
    ", (int) header->division_mask + 1, + (int) header->index_num), arg); + if (non_empty_divisions != 0) { + average_expiry = (time_t)(expiry_total / (double)non_empty_divisions); + func(apr_psprintf(p, "time left on oldest entries' SSL sessions: "), arg); + if (now < average_expiry) + func(apr_psprintf(p, "avg: %d seconds, (range: %d...%d)
    ", + (int)(average_expiry - now), (int) (min_expiry - now), + (int)(max_expiry - now)), arg); + else + func(apr_psprintf(p, "expiry threshold: Calculation Error!" + "
    "), arg); + + } + func(apr_psprintf(p, "index usage: %d%%, cache usage: %d%%" + "
    ", index_pct, cache_pct), arg); + func(apr_psprintf(p, "total sessions stored since starting: %lu
    ", + header->num_stores), arg); + func(apr_psprintf(p,"total sessions expired since starting: %lu
    ", + header->num_expiries), arg); + func(apr_psprintf(p, "total (pre-expiry) sessions scrolled out of the " + "cache: %lu
    ", header->num_scrolled), arg); + func(apr_psprintf(p, "total retrieves since starting: %lu hit, " + "%lu miss
    ", header->num_retrieves_hit, + header->num_retrieves_miss), arg); + func(apr_psprintf(p, "total removes since starting: %lu hit, " + "%lu miss
    ", header->num_removes_hit, + header->num_removes_miss), arg); + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "leaving shmcb_status"); + return; +} + +/* +** +** Memory manipulation and low-level cache operations +** +*/ + +static BOOL shmcb_init_memory( + server_rec *s, void *shm_mem, + unsigned int shm_mem_size) +{ + SHMCBHeader *header; + SHMCBQueue queue; + SHMCBCache cache; + unsigned int temp, loop, granularity; + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "entered shmcb_init_memory()"); + + /* Calculate some sizes... */ + temp = sizeof(SHMCBHeader); + + /* If the segment is ridiculously too small, bail out */ + if (shm_mem_size < (2*temp)) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, + "shared memory segment too small"); + return FALSE; + } + + /* Make temp the amount of memory without the header */ + temp = shm_mem_size - temp; + + /* Work on the basis that you need 10 bytes index for each session + * (approx 150 bytes), which is to divide temp by 160 - and then + * make sure we err on having too index space to burn even when + * the cache is full, which is a lot less stupid than having + * having not enough index space to utilise the whole cache!. */ + temp /= 120; + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "for %u bytes, recommending %u indexes", + shm_mem_size, temp); + + /* We should divide these indexes evenly amongst the queues. Try + * to get it so that there are roughly half the number of divisions + * as there are indexes in each division. */ + granularity = 256; + while ((temp / granularity) < (2 * granularity)) + granularity /= 2; + + /* So we have 'granularity' divisions, set 'temp' equal to the + * number of indexes in each division. */ + temp /= granularity; + + /* Too small? Bail ... */ + if (temp < 5) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, + "shared memory segment too small"); + return FALSE; + } + + /* OK, we're sorted - from here on in, the return should be TRUE */ + header = (SHMCBHeader *)shm_mem; + header->division_mask = (unsigned char)(granularity - 1); + header->division_offset = sizeof(SHMCBHeader); + header->index_num = temp; + header->index_offset = (2 * sizeof(unsigned int)); + header->index_size = sizeof(SHMCBIndex); + header->queue_size = header->index_offset + + (header->index_num * header->index_size); + + /* Now calculate the space for each division */ + temp = shm_mem_size - header->division_offset; + header->division_size = temp / granularity; + + /* Calculate the space left in each division for the cache */ + temp -= header->queue_size; + header->cache_data_offset = (2 * sizeof(unsigned int)); + header->cache_data_size = header->division_size - + header->queue_size - header->cache_data_offset; + + /* Output trace info */ + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "shmcb_init_memory choices follow"); + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "division_mask = 0x%02X", header->division_mask); + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "division_offset = %u", header->division_offset); + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "division_size = %u", header->division_size); + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "queue_size = %u", header->queue_size); + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "index_num = %u", header->index_num); + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "index_offset = %u", header->index_offset); + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "index_size = %u", header->index_size); + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "cache_data_offset = %u", header->cache_data_offset); + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "cache_data_size = %u", header->cache_data_size); + + /* The header is done, make the caches empty */ + for (loop = 0; loop < granularity; loop++) { + if (!shmcb_get_division(header, &queue, &cache, loop)) + ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, "shmcb_init_memory, " "internal error"); + shmcb_set_safe_uint(cache.first_pos, 0); + shmcb_set_safe_uint(cache.pos_count, 0); + shmcb_set_safe_uint(queue.first_pos, 0); + shmcb_set_safe_uint(queue.pos_count, 0); + } + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "leaving shmcb_init_memory()"); + return TRUE; +} + +static BOOL shmcb_store_session( + server_rec *s, void *shm_segment, UCHAR *id, + int idlen, SSL_SESSION * pSession, + time_t timeout) +{ + SHMCBHeader *header; + SHMCBQueue queue; + SHMCBCache cache; + unsigned char masked_index; + unsigned char encoded[SSL_SESSION_MAX_DER]; + unsigned char *ptr_encoded; + unsigned int len_encoded; + time_t expiry_time; + unsigned char *session_id = SSL_SESSION_get_session_id(pSession); + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "inside shmcb_store_session"); + + /* Get the header structure, which division this session will fall into etc. */ + shmcb_get_header(shm_segment, &header); + masked_index = session_id[0] & header->division_mask; + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "session_id[0]=%u, masked index=%u", + session_id[0], masked_index); + if (!shmcb_get_division(header, &queue, &cache, (unsigned int)masked_index)) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, + "shmcb_store_session internal error"); + return FALSE; + } + + /* Serialise the session, work out how much we're dealing + * with. NB: This check could be removed if we're not paranoid + * or we find some assurance that it will never be necessary. */ + len_encoded = i2d_SSL_SESSION(pSession, NULL); + if (len_encoded > SSL_SESSION_MAX_DER) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, + "session is too big (%u bytes)", len_encoded); + return FALSE; + } + ptr_encoded = encoded; + len_encoded = i2d_SSL_SESSION(pSession, &ptr_encoded); + expiry_time = timeout; + if (!shmcb_insert_encoded_session(s, &queue, &cache, encoded, + len_encoded, session_id, + expiry_time)) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, + "can't store a session!"); + return FALSE; + } + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "leaving shmcb_store successfully"); + header->num_stores++; + return TRUE; +} + +static SSL_SESSION *shmcb_retrieve_session( + server_rec *s, void *shm_segment, + UCHAR *id, int idlen) +{ + SHMCBHeader *header; + SHMCBQueue queue; + SHMCBCache cache; + unsigned char masked_index; + SSL_SESSION *pSession; + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "inside shmcb_retrieve_session"); + if (idlen < 2) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, "unusably short session_id provided " + "(%u bytes)", idlen); + return FALSE; + } + + /* Get the header structure, which division this session lookup + * will come from etc. */ + shmcb_get_header(shm_segment, &header); + masked_index = id[0] & header->division_mask; + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "id[0]=%u, masked index=%u", id[0], masked_index); + if (!shmcb_get_division(header, &queue, &cache, (unsigned int) masked_index)) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, + "shmcb_retrieve_session internal error"); + header->num_retrieves_miss++; + return FALSE; + } + + /* Get the session corresponding to the session_id or NULL if it + * doesn't exist (or is flagged as "removed"). */ + pSession = shmcb_lookup_session_id(s, &queue, &cache, id, idlen); + if (pSession) + header->num_retrieves_hit++; + else + header->num_retrieves_miss++; + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "leaving shmcb_retrieve_session"); + return pSession; +} + +static BOOL shmcb_remove_session( + server_rec *s, void *shm_segment, + UCHAR *id, int idlen) +{ + SHMCBHeader *header; + SHMCBQueue queue; + SHMCBCache cache; + unsigned char masked_index; + BOOL res; + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "inside shmcb_remove_session"); + if (id == NULL) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, "remove called with NULL session_id!"); + return FALSE; + } + + /* Get the header structure, which division this session remove + * will happen in etc. */ + shmcb_get_header(shm_segment, &header); + masked_index = id[0] & header->division_mask; + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "id[0]=%u, masked index=%u", id[0], masked_index); + if (!shmcb_get_division(header, &queue, &cache, (unsigned int)masked_index)) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, "shmcb_remove_session, internal error"); + header->num_removes_miss++; + return FALSE; + } + res = shmcb_remove_session_id(s, &queue, &cache, id, idlen); + if (res) + header->num_removes_hit++; + else + header->num_removes_miss++; + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "leaving shmcb_remove_session"); + return res; +} + + +/* +** +** Weirdo cyclic buffer functions +** +*/ + +/* This gets used in the cyclic "index array" (in the 'Queue's) and + * in the cyclic 'Cache's too ... you provide the "width" of the + * cyclic store, the starting position and how far to move (with + * wrapping if necessary). Basically it's addition modulo buf_size. */ +static unsigned int shmcb_cyclic_increment( + unsigned int buf_size, + unsigned int start_pos, + unsigned int to_add) +{ + start_pos += to_add; + while (start_pos >= buf_size) + start_pos -= buf_size; + return start_pos; +} + +/* Given two positions in a cyclic buffer, calculate the "distance". + * This is to cover the case ("non-trivial") where the 'next' offset + * is to the left of the 'start' offset. NB: This calculates the + * space inclusive of one end-point but not the other. There is an + * ambiguous case (which is why we use the + * coordinate system rather than one) when 'start' + * is the same as 'next'. It could indicate the buffer is full or it + * can indicate the buffer is empty ... I choose the latter as it's + * easier and usually necessary to check if the buffer is full anyway + * before doing incremental logic (which is this useful for), but we + * definitely need the empty case handled - in fact it's our starting + * state!! */ +static unsigned int shmcb_cyclic_space( + unsigned int buf_size, + unsigned int start_offset, + unsigned int next_offset) +{ + /* Is it the trivial case? */ + if (start_offset <= next_offset) + return (next_offset - start_offset); /* yes */ + else + return ((buf_size - start_offset) + next_offset); /* no */ +} + +/* A "normal-to-cyclic" memcpy ... this takes a linear block of + * memory and copies it onto a cyclic buffer. The purpose and + * function of this is pretty obvious, you need to cover the case + * that the destination (cyclic) buffer has to wrap round. */ +static void shmcb_cyclic_ntoc_memcpy( + unsigned int buf_size, + unsigned char *data, + unsigned int dest_offset, + unsigned char *src, unsigned int src_len) +{ + /* Cover the case that src_len > buf_size */ + if (src_len > buf_size) + src_len = buf_size; + + /* Can it be copied all in one go? */ + if (dest_offset + src_len < buf_size) + /* yes */ + memcpy(data + dest_offset, src, src_len); + else { + /* no */ + memcpy(data + dest_offset, src, buf_size - dest_offset); + memcpy(data, src + buf_size - dest_offset, + src_len + dest_offset - buf_size); + } + return; +} + +/* A "cyclic-to-normal" memcpy ... given the last function, this + * one's purpose is clear, it copies out of a cyclic buffer handling + * wrapping. */ +static void shmcb_cyclic_cton_memcpy( + unsigned int buf_size, + unsigned char *dest, + unsigned char *data, + unsigned int src_offset, + unsigned int src_len) +{ + /* Cover the case that src_len > buf_size */ + if (src_len > buf_size) + src_len = buf_size; + + /* Can it be copied all in one go? */ + if (src_offset + src_len < buf_size) + /* yes */ + memcpy(dest, data + src_offset, src_len); + else { + /* no */ + memcpy(dest, data + src_offset, buf_size - src_offset); + memcpy(dest + buf_size - src_offset, data, + src_len + src_offset - buf_size); + } + return; +} + +/* Here's the cool hack that makes it all work ... by simply + * making the first collection of bytes *be* our header structure + * (casting it into the C structure), we have the perfect way to + * maintain state in a shared-memory session cache from one call + * (and process) to the next, use the shared memory itself! The + * original mod_ssl shared-memory session cache uses variables + * inside the context, but we simply use that for storing the + * pointer to the shared memory itself. And don't forget, after + * Apache's initialisation, this "header" is constant/read-only + * so we can read it outside any locking. + * - sometimes I just *love* coding y'know?! */ +static void shmcb_get_header(void *shm_mem, SHMCBHeader **header) +{ + *header = (SHMCBHeader *)shm_mem; + return; +} + +/* This is what populates our "interesting" structures. Given a + * pointer to the header, and an index into the appropriate + * division (this must have already been masked using the + * division_mask by the caller!), we can populate the provided + * SHMCBQueue and SHMCBCache structures with values and + * pointers to the underlying shared memory. Upon returning + * (if not FALSE), the caller can meddle with the pointer + * values and they will map into the shared-memory directly, + * as such there's no need to "free" or "set" the Queue or + * Cache values, they were themselves references to the *real* + * data. */ +static BOOL shmcb_get_division( + SHMCBHeader *header, SHMCBQueue *queue, + SHMCBCache *cache, unsigned int idx) +{ + unsigned char *pQueue; + unsigned char *pCache; + + /* bounds check */ + if (idx > (unsigned int) header->division_mask) + return FALSE; + + /* Locate the blocks of memory storing the corresponding data */ + pQueue = ((unsigned char *) header) + header->division_offset + + (idx * header->division_size); + pCache = pQueue + header->queue_size; + + /* Populate the structures with appropriate pointers */ + queue->first_pos = (unsigned int *) pQueue; + + /* Our structures stay packed, no matter what the system's + * data-alignment regime is. */ + queue->pos_count = (unsigned int *) (pQueue + sizeof(unsigned int)); + queue->indexes = (SHMCBIndex *) (pQueue + (2 * sizeof(unsigned int))); + cache->first_pos = (unsigned int *) pCache; + cache->pos_count = (unsigned int *) (pCache + sizeof(unsigned int)); + cache->data = (unsigned char *) (pCache + (2 * sizeof(unsigned int))); + queue->header = cache->header = header; + + return TRUE; +} + +/* This returns a pointer to the piece of shared memory containing + * a specified 'Index'. SHMCBIndex, like SHMCBHeader, is a fixed + * width non-referencing structure of primitive types that can be + * cast onto the corresponding block of shared memory. Thus, by + * returning a cast pointer to that section of shared memory, the + * caller can read and write values to and from the "structure" and + * they are actually reading and writing the underlying shared + * memory. */ +static SHMCBIndex *shmcb_get_index( + const SHMCBQueue *queue, unsigned int idx) +{ + /* bounds check */ + if (idx > queue->header->index_num) + return NULL; + + /* Return a pointer to the index. NB: I am being horribly pendantic + * here so as to avoid any potential data-alignment assumptions being + * placed on the pointer arithmetic by the compiler (sigh). */ + return (SHMCBIndex *)(((unsigned char *) queue->indexes) + + (idx * sizeof(SHMCBIndex))); +} + +/* This functions rolls expired cache (and index) entries off the front + * of the cyclic buffers in a division. The function returns the number + * of expired sessions. */ +static unsigned int shmcb_expire_division( + server_rec *s, SHMCBQueue *queue, SHMCBCache *cache) +{ + SHMCBIndex *idx; + time_t now; + unsigned int loop, index_num, pos_count, new_pos; + SHMCBHeader *header; + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "entering shmcb_expire_division"); + + /* We must calculate num and space ourselves based on expiry times. */ + now = time(NULL); + loop = 0; + new_pos = shmcb_get_safe_uint(queue->first_pos); + + /* Cache useful values */ + header = queue->header; + index_num = header->index_num; + pos_count = shmcb_get_safe_uint(queue->pos_count); + while (loop < pos_count) { + idx = shmcb_get_index(queue, new_pos); + if (shmcb_get_safe_time(&(idx->expires)) > now) + /* it hasn't expired yet, we're done iterating */ + break; + /* This one should be expired too. Shift to the next entry. */ + loop++; + new_pos = shmcb_cyclic_increment(index_num, new_pos, 1); + } + + /* Find the new_offset and make the expiries happen. */ + if (loop > 0) { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "will be expiring %u sessions", loop); + /* We calculate the new_offset by "peeking" (or in the + * case it's the last entry, "sneaking" ;-). */ + if (loop == pos_count) { + /* We are expiring everything! This is easy to do... */ + shmcb_set_safe_uint(queue->pos_count, 0); + shmcb_set_safe_uint(cache->pos_count, 0); + } + else { + /* The Queue is easy to adjust */ + shmcb_set_safe_uint(queue->pos_count, + shmcb_get_safe_uint(queue->pos_count) - loop); + shmcb_set_safe_uint(queue->first_pos, new_pos); + /* peek to the start of the next session */ + idx = shmcb_get_index(queue, new_pos); + /* We can use shmcb_cyclic_space because we've guaranteed + * we don't fit the ambiguous full/empty case. */ + shmcb_set_safe_uint(cache->pos_count, + shmcb_get_safe_uint(cache->pos_count) - + shmcb_cyclic_space(header->cache_data_size, + shmcb_get_safe_uint(cache->first_pos), + shmcb_get_safe_uint(&(idx->offset)))); + shmcb_set_safe_uint(cache->first_pos, shmcb_get_safe_uint(&(idx->offset))); + } + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "we now have %u sessions", + shmcb_get_safe_uint(queue->pos_count)); + } + header->num_expiries += loop; + return loop; +} + +/* Inserts a new encoded session into a queue/cache pair - expiring + * (early or otherwise) any leading sessions as necessary to ensure + * there is room. An error return (FALSE) should only happen in the + * event of surreal values being passed on, or ridiculously small + * cache sizes. NB: For tracing purposes, this function is also given + * the server_rec to allow "ssl_log()". */ +static BOOL shmcb_insert_encoded_session( + server_rec *s, SHMCBQueue * queue, + SHMCBCache * cache, + unsigned char *encoded, + unsigned int encoded_len, + unsigned char *session_id, + time_t expiry_time) +{ + SHMCBHeader *header; + SHMCBIndex *idx = NULL; + unsigned int gap, new_pos, loop, new_offset; + int need; + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "entering shmcb_insert_encoded_session, " + "*queue->pos_count = %u", + shmcb_get_safe_uint(queue->pos_count)); + + /* If there's entries to expire, ditch them first thing. */ + shmcb_expire_division(s, queue, cache); + header = cache->header; + gap = header->cache_data_size - shmcb_get_safe_uint(cache->pos_count); + if (gap < encoded_len) { + new_pos = shmcb_get_safe_uint(queue->first_pos); + loop = 0; + need = (int) encoded_len - (int) gap; + while ((need > 0) && (loop + 1 < shmcb_get_safe_uint(queue->pos_count))) { + new_pos = shmcb_cyclic_increment(header->index_num, new_pos, 1); + loop += 1; + idx = shmcb_get_index(queue, new_pos); + need = (int) encoded_len - (int) gap - + shmcb_cyclic_space(header->cache_data_size, + shmcb_get_safe_uint(cache->first_pos), + shmcb_get_safe_uint(&(idx->offset))); + } + if (loop > 0) { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "about to scroll %u sessions from %u", + loop, shmcb_get_safe_uint(queue->pos_count)); + /* We are removing "loop" items from the cache. */ + shmcb_set_safe_uint(cache->pos_count, + shmcb_get_safe_uint(cache->pos_count) - + shmcb_cyclic_space(header->cache_data_size, + shmcb_get_safe_uint(cache->first_pos), + shmcb_get_safe_uint(&(idx->offset)))); + shmcb_set_safe_uint(cache->first_pos, shmcb_get_safe_uint(&(idx->offset))); + shmcb_set_safe_uint(queue->pos_count, shmcb_get_safe_uint(queue->pos_count) - loop); + shmcb_set_safe_uint(queue->first_pos, new_pos); + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "now only have %u sessions", + shmcb_get_safe_uint(queue->pos_count)); + /* Update the stats!!! */ + header->num_scrolled += loop; + } + } + + /* probably unecessary checks, but I'll leave them until this code + * is verified. */ + if (shmcb_get_safe_uint(cache->pos_count) + encoded_len > + header->cache_data_size) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, + "shmcb_insert_encoded_session internal error"); + return FALSE; + } + if (shmcb_get_safe_uint(queue->pos_count) == header->index_num) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, + "shmcb_insert_encoded_session internal error"); + return FALSE; + } + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "we have %u bytes and %u indexes free - enough", + header->cache_data_size - + shmcb_get_safe_uint(cache->pos_count), header->index_num - + shmcb_get_safe_uint(queue->pos_count)); + + + /* HERE WE ASSUME THAT THE NEW SESSION SHOULD GO ON THE END! I'M NOT + * CHECKING WHETHER IT SHOULD BE GENUINELY "INSERTED" SOMEWHERE. + * + * We either fix that, or find out at a "higher" (read "mod_ssl") + * level whether it is possible to have distinct session caches for + * any attempted tomfoolery to do with different session timeouts. + * Knowing in advance that we can have a cache-wide constant timeout + * would make this stuff *MUCH* more efficient. Mind you, it's very + * efficient right now because I'm ignoring this problem!!! + */ + + /* Increment to the first unused byte */ + new_offset = shmcb_cyclic_increment(header->cache_data_size, + shmcb_get_safe_uint(cache->first_pos), + shmcb_get_safe_uint(cache->pos_count)); + /* Copy the DER-encoded session into place */ + shmcb_cyclic_ntoc_memcpy(header->cache_data_size, cache->data, + new_offset, encoded, encoded_len); + /* Get the new index that this session is stored in. */ + new_pos = shmcb_cyclic_increment(header->index_num, + shmcb_get_safe_uint(queue->first_pos), + shmcb_get_safe_uint(queue->pos_count)); + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "storing in index %u, at offset %u", + new_pos, new_offset); + idx = shmcb_get_index(queue, new_pos); + if (idx == NULL) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, + "shmcb_insert_encoded_session internal error"); + return FALSE; + } + shmcb_safe_clear(idx, sizeof(SHMCBIndex)); + shmcb_set_safe_time(&(idx->expires), expiry_time); + shmcb_set_safe_uint(&(idx->offset), new_offset); + + /* idx->removed = (unsigned char)0; */ /* Not needed given the memset above. */ + idx->s_id2 = session_id[1]; + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "session_id[0]=%u, idx->s_id2=%u", + session_id[0], session_id[1]); + + /* All that remains is to adjust the cache's and queue's "pos_count"s. */ + shmcb_set_safe_uint(cache->pos_count, + shmcb_get_safe_uint(cache->pos_count) + encoded_len); + shmcb_set_safe_uint(queue->pos_count, + shmcb_get_safe_uint(queue->pos_count) + 1); + + /* And just for good debugging measure ... */ + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "leaving now with %u bytes in the cache and %u indexes", + shmcb_get_safe_uint(cache->pos_count), + shmcb_get_safe_uint(queue->pos_count)); + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "leaving shmcb_insert_encoded_session"); + return TRUE; +} + +/* Performs a lookup into a queue/cache pair for a + * session_id. If found, the session is deserialised + * and returned, otherwise NULL. */ +static SSL_SESSION *shmcb_lookup_session_id( + server_rec *s, SHMCBQueue *queue, + SHMCBCache *cache, UCHAR *id, + unsigned int idlen) +{ + unsigned char tempasn[SSL_SESSION_MAX_DER]; + SHMCBIndex *idx; + SHMCBHeader *header; + SSL_SESSION *pSession = NULL; + unsigned int curr_pos, loop, count; + MODSSL_D2I_SSL_SESSION_CONST unsigned char *ptr; + time_t now; + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "entering shmcb_lookup_session_id"); + + /* If there are entries to expire, ditch them first thing. */ + shmcb_expire_division(s, queue, cache); + now = time(NULL); + curr_pos = shmcb_get_safe_uint(queue->first_pos); + count = shmcb_get_safe_uint(queue->pos_count); + header = queue->header; + for (loop = 0; loop < count; loop++) { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "loop=%u, count=%u, curr_pos=%u", + loop, count, curr_pos); + idx = shmcb_get_index(queue, curr_pos); + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "idx->s_id2=%u, id[1]=%u, offset=%u", + idx->s_id2, id[1], shmcb_get_safe_uint(&(idx->offset))); + /* Only look into the session further if; + * (a) the second byte of the session_id matches, + * (b) the "removed" flag isn't set, + * (c) the session hasn't expired yet. + * We do (c) like this so that it saves us having to + * do natural expiries ... naturally expired sessions + * scroll off the front anyway when the cache is full and + * "rotating", the only real issue that remains is the + * removal or disabling of forcibly killed sessions. */ + if ((idx->s_id2 == id[1]) && !idx->removed && + (shmcb_get_safe_time(&(idx->expires)) > now)) { + unsigned int session_id_length; + unsigned char *session_id; + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "at index %u, found possible session match", + curr_pos); + shmcb_cyclic_cton_memcpy(header->cache_data_size, + tempasn, cache->data, + shmcb_get_safe_uint(&(idx->offset)), + SSL_SESSION_MAX_DER); + ptr = tempasn; + pSession = d2i_SSL_SESSION(NULL, &ptr, SSL_SESSION_MAX_DER); + session_id_length = SSL_SESSION_get_session_id_length(pSession); + session_id = SSL_SESSION_get_session_id(pSession); + + if (pSession == NULL) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, + "scach2_lookup_session_id internal error"); + return NULL; + } + if ((session_id_length == idlen) && + (memcmp(session_id, id, idlen) == 0)) { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "a match!"); + return pSession; + } + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "not a match"); + SSL_SESSION_free(pSession); + pSession = NULL; + } + curr_pos = shmcb_cyclic_increment(header->index_num, curr_pos, 1); + } + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "no matching sessions were found"); + return NULL; +} + +static BOOL shmcb_remove_session_id( + server_rec *s, SHMCBQueue *queue, + SHMCBCache *cache, UCHAR *id, unsigned int idlen) +{ + unsigned char tempasn[SSL_SESSION_MAX_DER]; + SSL_SESSION *pSession = NULL; + SHMCBIndex *idx; + SHMCBHeader *header; + unsigned int curr_pos, loop, count; + MODSSL_D2I_SSL_SESSION_CONST unsigned char *ptr; + BOOL to_return = FALSE; + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "entering shmcb_remove_session_id"); + + /* If there's entries to expire, ditch them first thing. */ + /* shmcb_expire_division(s, queue, cache); */ + + /* Regarding the above ... hmmm ... I know my expiry code is slightly + * "faster" than all this remove stuff ... but if the higher level + * code calls a "remove" operation (and this *only* seems to happen + * when it has spotted an expired session before we had a chance to) + * then it should get credit for a remove (stats-wise). Also, in the + * off-chance that the server *requests* a renegotiate and wants to + * wipe the session clean we should give that priority over our own + * routine expiry handling. So I've moved the expiry check to *after* + * this general remove stuff. */ + curr_pos = shmcb_get_safe_uint(queue->first_pos); + count = shmcb_get_safe_uint(queue->pos_count); + header = cache->header; + for (loop = 0; loop < count; loop++) { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "loop=%u, count=%u, curr_pos=%u", + loop, count, curr_pos); + idx = shmcb_get_index(queue, curr_pos); + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "idx->s_id2=%u, id[1]=%u", idx->s_id2, + id[1]); + /* Only look into the session further if the second byte of the + * session_id matches. */ + if (idx->s_id2 == id[1]) { + unsigned int session_id_length; + unsigned char *session_id; + + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "at index %u, found possible " + "session match", curr_pos); + shmcb_cyclic_cton_memcpy(header->cache_data_size, + tempasn, cache->data, + shmcb_get_safe_uint(&(idx->offset)), + SSL_SESSION_MAX_DER); + ptr = tempasn; + pSession = d2i_SSL_SESSION(NULL, &ptr, SSL_SESSION_MAX_DER); + if (pSession == NULL) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, + "shmcb_remove_session_id, internal error"); + goto end; + } + session_id_length = SSL_SESSION_get_session_id_length(pSession); + session_id = SSL_SESSION_get_session_id(pSession); + + if ((session_id_length == idlen) + && (memcmp(id, session_id, idlen) == 0)) { + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "a match!"); + /* Scrub out this session "quietly" */ + idx->removed = (unsigned char) 1; + SSL_SESSION_free(pSession); + to_return = TRUE; + goto end; + } + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "not a match"); + SSL_SESSION_free(pSession); + pSession = NULL; + } + curr_pos = shmcb_cyclic_increment(header->index_num, curr_pos, 1); + } + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "no matching sessions were found"); + + /* If there's entries to expire, ditch them now. */ + shmcb_expire_division(s, queue, cache); +end: + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "leaving shmcb_remove_session_id"); + return to_return; +} diff --git a/rubbos/app/httpd-2.0.64/modules/ssl/ssl_scache_shmht.c b/rubbos/app/httpd-2.0.64/modules/ssl/ssl_scache_shmht.c new file mode 100644 index 00000000..28def647 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/ssl/ssl_scache_shmht.c @@ -0,0 +1,351 @@ +/* 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. + */ + +/* _ _ + * _ __ ___ ___ __| | ___ ___| | mod_ssl + * | '_ ` _ \ / _ \ / _` | / __/ __| | Apache Interface to OpenSSL + * | | | | | | (_) | (_| | \__ \__ \ | + * |_| |_| |_|\___/ \__,_|___|___/___/_| + * |_____| + * ssl_scache_shmht.c + * Session Cache via Shared Memory (Hash Table Variant) + */ + +#include "mod_ssl.h" + +/* + * Wrapper functions for table library which resemble malloc(3) & Co + * but use the variants from the MM shared memory library. + */ + +static void *ssl_scache_shmht_malloc(void *opt_param, size_t size) +{ + SSLModConfigRec *mc = myModConfig((server_rec *)opt_param); + + apr_rmm_off_t off = apr_rmm_calloc(mc->pSessionCacheDataRMM, size); + return apr_rmm_addr_get(mc->pSessionCacheDataRMM, off); +} + +static void *ssl_scache_shmht_calloc(void *opt_param, + size_t number, size_t size) +{ + SSLModConfigRec *mc = myModConfig((server_rec *)opt_param); + + apr_rmm_off_t off = apr_rmm_calloc(mc->pSessionCacheDataRMM, (number*size)); + + return apr_rmm_addr_get(mc->pSessionCacheDataRMM, off); +} + +static void *ssl_scache_shmht_realloc(void *opt_param, void *ptr, size_t size) +{ + SSLModConfigRec *mc = myModConfig((server_rec *)opt_param); + + apr_rmm_off_t off = apr_rmm_realloc(mc->pSessionCacheDataRMM, ptr, size); + return apr_rmm_addr_get(mc->pSessionCacheDataRMM, off); +} + +static void ssl_scache_shmht_free(void *opt_param, void *ptr) +{ + SSLModConfigRec *mc = myModConfig((server_rec *)opt_param); + + apr_rmm_off_t off = apr_rmm_offset_get(mc->pSessionCacheDataRMM, ptr); + apr_rmm_free(mc->pSessionCacheDataRMM, off); + return; +} + +/* + * Now the actual session cache implementation + * based on a hash table inside a shared memory segment. + */ + +void ssl_scache_shmht_init(server_rec *s, apr_pool_t *p) +{ + SSLModConfigRec *mc = myModConfig(s); + table_t *ta; + int ta_errno; + apr_size_t avail; + int n; + apr_status_t rv; + + /* + * Create shared memory segment + */ + if (mc->szSessionCacheDataFile == NULL) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, + "SSLSessionCache required"); + ssl_die(); + } + + if ((rv = apr_shm_create(&(mc->pSessionCacheDataMM), + mc->nSessionCacheDataSize, + mc->szSessionCacheDataFile, mc->pPool)) != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, s, + "Cannot allocate shared memory"); + ssl_die(); + } + + if ((rv = apr_rmm_init(&(mc->pSessionCacheDataRMM), NULL, + apr_shm_baseaddr_get(mc->pSessionCacheDataMM), + mc->nSessionCacheDataSize, mc->pPool)) != APR_SUCCESS) { + ap_log_error(APLOG_MARK, APLOG_ERR, rv, s, + "Cannot initialize rmm"); + ssl_die(); + } + ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, + "initialize MM %pp RMM %pp", + mc->pSessionCacheDataMM, mc->pSessionCacheDataRMM); + + /* + * Create hash table in shared memory segment + */ + avail = mc->nSessionCacheDataSize; + n = (avail/2) / 1024; + n = n < 10 ? 10 : n; + + /* + * Passing server_rec as opt_param to table_alloc so that we can do + * logging if required ssl_util_table. Otherwise, mc is sufficient. + */ + if ((ta = table_alloc(n, &ta_errno, + ssl_scache_shmht_malloc, + ssl_scache_shmht_calloc, + ssl_scache_shmht_realloc, + ssl_scache_shmht_free, s )) == NULL) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, s, + "Cannot allocate hash table in shared memory: %s", + table_strerror(ta_errno)); + ssl_die(); + } + + table_attr(ta, TABLE_FLAG_AUTO_ADJUST|TABLE_FLAG_ADJUST_DOWN); + table_set_data_alignment(ta, sizeof(char *)); + table_clear(ta); + mc->tSessionCacheDataTable = ta; + + /* + * Log the done work + */ + ap_log_error(APLOG_MARK, APLOG_INFO, 0, s, + "Init: Created hash-table (%d buckets) " + "in shared memory (%" APR_SIZE_T_FMT + " bytes) for SSL session cache", + n, avail); + return; +} + +void ssl_scache_shmht_kill(server_rec *s) +{ + SSLModConfigRec *mc = myModConfig(s); + + if (mc->pSessionCacheDataRMM != NULL) { + apr_rmm_destroy(mc->pSessionCacheDataRMM); + mc->pSessionCacheDataRMM = NULL; + } + + if (mc->pSessionCacheDataMM != NULL) { + apr_shm_destroy(mc->pSessionCacheDataMM); + mc->pSessionCacheDataMM = NULL; + } + return; +} + +BOOL ssl_scache_shmht_store(server_rec *s, UCHAR *id, int idlen, time_t expiry, SSL_SESSION *sess) +{ + SSLModConfigRec *mc = myModConfig(s); + void *vp; + UCHAR ucaData[SSL_SESSION_MAX_DER]; + int nData; + UCHAR *ucp; + + /* streamline session data */ + if ((nData = i2d_SSL_SESSION(sess, NULL)) > sizeof(ucaData)) + return FALSE; + ucp = ucaData; + i2d_SSL_SESSION(sess, &ucp); + + ssl_mutex_on(s); + if (table_insert_kd(mc->tSessionCacheDataTable, + id, idlen, NULL, sizeof(time_t)+nData, + NULL, &vp, 1) != TABLE_ERROR_NONE) { + ssl_mutex_off(s); + return FALSE; + } + memcpy(vp, &expiry, sizeof(time_t)); + memcpy((char *)vp+sizeof(time_t), ucaData, nData); + ssl_mutex_off(s); + + /* allow the regular expiring to occur */ + ssl_scache_shmht_expire(s); + + return TRUE; +} + +SSL_SESSION *ssl_scache_shmht_retrieve(server_rec *s, UCHAR *id, int idlen) +{ + SSLModConfigRec *mc = myModConfig(s); + void *vp; + SSL_SESSION *sess = NULL; + MODSSL_D2I_SSL_SESSION_CONST UCHAR *ucpData; + int nData; + time_t expiry; + time_t now; + int n; + + /* allow the regular expiring to occur */ + ssl_scache_shmht_expire(s); + + /* lookup key in table */ + ssl_mutex_on(s); + if (table_retrieve(mc->tSessionCacheDataTable, + id, idlen, &vp, &n) != TABLE_ERROR_NONE) { + ssl_mutex_off(s); + return NULL; + } + + /* copy over the information to the SCI */ + nData = n-sizeof(time_t); + ucpData = (UCHAR *)malloc(nData); + if (ucpData == NULL) { + ssl_mutex_off(s); + return NULL; + } + memcpy(&expiry, vp, sizeof(time_t)); + memcpy((void *)ucpData, (char *)vp+sizeof(time_t), nData); + ssl_mutex_off(s); + + /* make sure the stuff is still not expired */ + now = time(NULL); + if (expiry <= now) { + ssl_scache_shmht_remove(s, id, idlen); + return NULL; + } + + /* unstreamed SSL_SESSION */ + sess = d2i_SSL_SESSION(NULL, &ucpData, nData); + + return sess; +} + +void ssl_scache_shmht_remove(server_rec *s, UCHAR *id, int idlen) +{ + SSLModConfigRec *mc = myModConfig(s); + + /* remove value under key in table */ + ssl_mutex_on(s); + table_delete(mc->tSessionCacheDataTable, id, idlen, NULL, NULL); + ssl_mutex_off(s); + return; +} + +void ssl_scache_shmht_expire(server_rec *s) +{ + SSLModConfigRec *mc = myModConfig(s); + SSLSrvConfigRec *sc = mySrvConfig(s); + static time_t tLast = 0; + table_linear_t iterator; + time_t tExpiresAt; + void *vpKey; + void *vpKeyThis; + void *vpData; + int nKey; + int nKeyThis; + int nData; + int nElements = 0; + int nDeleted = 0; + int bDelete; + int rc; + time_t tNow; + + /* + * make sure the expiration for still not-accessed session + * cache entries is done only from time to time + */ + tNow = time(NULL); + if (tNow < tLast+sc->session_cache_timeout) + return; + tLast = tNow; + + ssl_mutex_on(s); + if (table_first_r(mc->tSessionCacheDataTable, &iterator, + &vpKey, &nKey, &vpData, &nData) == TABLE_ERROR_NONE) { + do { + bDelete = FALSE; + nElements++; + if (nData < sizeof(time_t) || vpData == NULL) + bDelete = TRUE; + else { + memcpy(&tExpiresAt, vpData, sizeof(time_t)); + /* + * XXX : Force the record to be cleaned up. TBD (Madhu) + * tExpiresAt = tNow; + */ + if (tExpiresAt <= tNow) + bDelete = TRUE; + } + vpKeyThis = vpKey; + nKeyThis = nKey; + rc = table_next_r(mc->tSessionCacheDataTable, &iterator, + &vpKey, &nKey, &vpData, &nData); + if (bDelete) { + table_delete(mc->tSessionCacheDataTable, + vpKeyThis, nKeyThis, NULL, NULL); + nDeleted++; + } + } while (rc == TABLE_ERROR_NONE); + /* (vpKeyThis != vpKey) && (nKeyThis != nKey) */ + } + ssl_mutex_off(s); + ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, + "Inter-Process Session Cache (SHMHT) Expiry: " + "old: %d, new: %d, removed: %d", + nElements, nElements-nDeleted, nDeleted); + return; +} + +void ssl_scache_shmht_status(server_rec *s, apr_pool_t *p, void (*func)(char *, void *), void *arg) +{ + SSLModConfigRec *mc = myModConfig(s); + void *vpKey; + void *vpData; + int nKey; + int nData; + int nElem; + int nSize; + int nAverage; + + nElem = 0; + nSize = 0; + ssl_mutex_on(s); + if (table_first(mc->tSessionCacheDataTable, + &vpKey, &nKey, &vpData, &nData) == TABLE_ERROR_NONE) { + do { + if (vpKey == NULL || vpData == NULL) + continue; + nElem += 1; + nSize += nData; + } while (table_next(mc->tSessionCacheDataTable, + &vpKey, &nKey, &vpData, &nData) == TABLE_ERROR_NONE); + } + ssl_mutex_off(s); + if (nSize > 0 && nElem > 0) + nAverage = nSize / nElem; + else + nAverage = 0; + func(apr_psprintf(p, "cache type: SHMHT, maximum size: %d bytes
    ", mc->nSessionCacheDataSize), arg); + func(apr_psprintf(p, "current sessions: %d, current size: %d bytes
    ", nElem, nSize), arg); + func(apr_psprintf(p, "average session size: %d bytes
    ", nAverage), arg); + return; +} diff --git a/rubbos/app/httpd-2.0.64/modules/ssl/ssl_toolkit_compat.h b/rubbos/app/httpd-2.0.64/modules/ssl/ssl_toolkit_compat.h new file mode 100644 index 00000000..72772150 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/ssl/ssl_toolkit_compat.h @@ -0,0 +1,239 @@ +/* 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. + */ + +#ifndef SSL_TOOLKIT_COMPAT_H +#define SSL_TOOLKIT_COMPAT_H + +/* + * this header file provides a compatiblity layer + * between OpenSSL and RSA sslc + */ + +#ifdef OPENSSL_VERSION_NUMBER + +/* + * rsa sslc uses incomplete types for most structures + * so we macroize for OpenSSL those which cannot be dereferenced + * using the same sames as the sslc functions + */ + +#define EVP_PKEY_key_type(k) (EVP_PKEY_type(k->type)) + +#define X509_NAME_get_entries(xs) (xs->entries) +#define X509_REVOKED_get_serialNumber(xs) (xs->serialNumber) + +#define X509_get_signature_algorithm(xs) (xs->cert_info->signature->algorithm) +#define X509_get_key_algorithm(xs) (xs->cert_info->key->algor->algorithm) + +#define X509_NAME_ENTRY_get_data_ptr(xs) (xs->value->data) +#define X509_NAME_ENTRY_get_data_len(xs) (xs->value->length) + +#define SSL_CTX_get_extra_certs(ctx) (ctx->extra_certs) +#define SSL_CTX_set_extra_certs(ctx,value) {ctx->extra_certs = value;} + +#define SSL_CIPHER_get_name(s) (s->name) +#define SSL_CIPHER_get_valid(s) (s->valid) + +#define SSL_SESSION_get_session_id(s) (s->session_id) +#define SSL_SESSION_get_session_id_length(s) (s->session_id_length) + +/* + * Support for retrieving/overriding states + */ +#ifndef SSL_get_state +#define SSL_get_state(ssl) SSL_state(ssl) +#endif + +#define SSL_set_state(ssl,val) (ssl)->state = val + +#define MODSSL_BIO_CB_ARG_TYPE const char +#define MODSSL_CRYPTO_CB_ARG_TYPE const char +#if (OPENSSL_VERSION_NUMBER < 0x00907000) +#define MODSSL_INFO_CB_ARG_TYPE SSL* +#else +#define MODSSL_INFO_CB_ARG_TYPE const SSL* +#endif +#define MODSSL_CLIENT_CERT_CB_ARG_TYPE X509 +#define MODSSL_PCHAR_CAST + +/* ...shifting sands of openssl... */ +#if (OPENSSL_VERSION_NUMBER >= 0x0090707f) +# define MODSSL_D2I_SSL_SESSION_CONST const +#else +# define MODSSL_D2I_SSL_SESSION_CONST +#endif + +#if (OPENSSL_VERSION_NUMBER >= 0x00908000) +# define MODSSL_D2I_PrivateKey_CONST const +# define MODSSL_D2I_X509_CONST const +#else +# define MODSSL_D2I_PrivateKey_CONST +# define MODSSL_D2I_X509_CONST +#endif + +#define modssl_X509_verify_cert X509_verify_cert + +typedef int (modssl_read_bio_cb_fn)(char*,int,int,void*); + +#if (OPENSSL_VERSION_NUMBER < 0x00904000) +#define modssl_PEM_read_bio_X509(b, x, cb, arg) PEM_read_bio_X509(b, x, cb) +#else +#define modssl_PEM_read_bio_X509(b, x, cb, arg) PEM_read_bio_X509(b, x, cb, arg) +#endif + +#define modssl_PEM_X509_INFO_read_bio PEM_X509_INFO_read_bio + +#define modssl_PEM_read_bio_PrivateKey PEM_read_bio_PrivateKey + +#define modssl_set_cipher_list SSL_set_cipher_list + +#define modssl_free OPENSSL_free + +#define EVP_PKEY_reference_inc(pkey) \ + CRYPTO_add(&((pkey)->references), +1, CRYPTO_LOCK_X509_PKEY) + +#define X509_reference_inc(cert) \ + CRYPTO_add(&((cert)->references), +1, CRYPTO_LOCK_X509) + +#define HAVE_SSL_RAND_EGD /* since 9.5.1 */ + +#ifdef HAVE_SSL_X509V3_H +#define HAVE_SSL_X509V3_EXT_d2i +#endif + +#ifndef PEM_F_DEF_CALLBACK +#ifdef PEM_F_PEM_DEF_CALLBACK +/* In OpenSSL 0.9.8 PEM_F_DEF_CALLBACK was renamed */ +#define PEM_F_DEF_CALLBACK PEM_F_PEM_DEF_CALLBACK +#endif +#endif + +#elif defined (SSLC_VERSION_NUMBER) /* RSA */ + +/* sslc does not support this function, OpenSSL has since 9.5.1 */ +#define RAND_status() 1 + +/* sslc names this function a bit differently */ +#define CRYPTO_num_locks() CRYPTO_get_num_locks() + +#ifndef STACK_OF +#define STACK_OF(type) STACK +#endif + +#define MODSSL_BIO_CB_ARG_TYPE char +#define MODSSL_CRYPTO_CB_ARG_TYPE char +#define MODSSL_INFO_CB_ARG_TYPE SSL* +#define MODSSL_CLIENT_CERT_CB_ARG_TYPE void +#define MODSSL_PCHAR_CAST (char *) +#define MODSSL_D2I_SSL_SESSION_CONST +#define MODSSL_D2I_PrivateKey_CONST +#define MODSSL_D2I_X509_CONST + +typedef int (modssl_read_bio_cb_fn)(char*,int,int); + +#define modssl_X509_verify_cert(c) X509_verify_cert(c, NULL) + +#define modssl_PEM_read_bio_X509(b, x, cb, arg) \ + PEM_read_bio_X509(b, x, cb) + +#define modssl_PEM_X509_INFO_read_bio(b, x, cb, arg)\ + PEM_X509_INFO_read_bio(b, x, cb) + +#define modssl_PEM_read_bio_PrivateKey(b, k, cb, arg) \ + PEM_read_bio_PrivateKey(b, k, cb) + +#ifndef HAVE_SSL_SET_STATE +#define SSL_set_state(ssl, state) /* XXX: should throw an error */ +#endif + +#define modssl_set_cipher_list(ssl, l) \ + SSL_set_cipher_list(ssl, (char *)l) + +#define modssl_free free + +#ifndef PEM_F_DEF_CALLBACK +#define PEM_F_DEF_CALLBACK PEM_F_DEF_CB +#endif + +#if SSLC_VERSION_NUMBER < 0x2000 + +#define X509_STORE_CTX_set_depth(st, d) +#define X509_CRL_get_lastUpdate(x) ((x)->crl->lastUpdate) +#define X509_CRL_get_nextUpdate(x) ((x)->crl->nextUpdate) +#define X509_CRL_get_REVOKED(x) ((x)->crl->revoked) +#define X509_REVOKED_get_serialNumber(xs) (xs->serialNumber) + +#define modssl_set_verify(ssl, verify, cb) \ + SSL_set_verify(ssl, verify) + +#define NO_SSL_X509V3_H + +#else /* SSLC_VERSION_NUMBER >= 0x2000 */ + +#define CRYPTO_malloc_init R_malloc_init + +#define EVP_cleanup() + +#endif /* SSLC_VERSION_NUMBER >= 0x2000 */ + +typedef void (*modssl_popfree_fn)(char *data); + +#define sk_SSL_CIPHER_dup sk_dup +#define sk_SSL_CIPHER_find(st, data) sk_find(st, (void *)data) +#define sk_SSL_CIPHER_free sk_free +#define sk_SSL_CIPHER_num sk_num +#define sk_SSL_CIPHER_value (SSL_CIPHER *)sk_value +#define sk_X509_num sk_num +#define sk_X509_push sk_push +#define sk_X509_pop_free(st, free) sk_pop_free((STACK*)(st), (modssl_popfree_fn)(free)) +#define sk_X509_value (X509 *)sk_value +#define sk_X509_INFO_free sk_free +#define sk_X509_INFO_pop_free(st, free) sk_pop_free((STACK*)(st), (modssl_popfree_fn)(free)) +#define sk_X509_INFO_num sk_num +#define sk_X509_INFO_new_null sk_new_null +#define sk_X509_INFO_value (X509_INFO *)sk_value +#define sk_X509_NAME_find(st, data) sk_find(st, (void *)data) +#define sk_X509_NAME_free sk_free +#define sk_X509_NAME_new sk_new +#define sk_X509_NAME_num sk_num +#define sk_X509_NAME_push(st, data) sk_push(st, (void *)data) +#define sk_X509_NAME_value (X509_NAME *)sk_value +#define sk_X509_NAME_ENTRY_num sk_num +#define sk_X509_NAME_ENTRY_value (X509_NAME_ENTRY *)sk_value +#define sk_X509_NAME_set_cmp_func sk_set_cmp_func +#define sk_X509_REVOKED_num sk_num +#define sk_X509_REVOKED_value (X509_REVOKED *)sk_value + +#else /* ! OPENSSL_VERSION_NUMBER && ! SSLC_VERSION_NUMBER */ + +#error "Unrecognized SSL Toolkit!" + +#endif /* ! OPENSSL_VERSION_NUMBER && ! SSLC_VERSION_NUMBER */ + +#ifndef modssl_set_verify +#define modssl_set_verify(ssl, verify, cb) \ + SSL_set_verify(ssl, verify, cb) +#endif + +#ifndef NO_SSL_X509V3_H +#define HAVE_SSL_X509V3_H +#endif + +#ifndef SSL_SESS_CACHE_NO_INTERNAL +#define SSL_SESS_CACHE_NO_INTERNAL SSL_SESS_CACHE_NO_INTERNAL_LOOKUP +#endif + +#endif /* SSL_TOOLKIT_COMPAT_H */ diff --git a/rubbos/app/httpd-2.0.64/modules/ssl/ssl_util.c b/rubbos/app/httpd-2.0.64/modules/ssl/ssl_util.c new file mode 100644 index 00000000..f1319547 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/ssl/ssl_util.c @@ -0,0 +1,449 @@ +/* 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. + */ + +/* _ _ + * _ __ ___ ___ __| | ___ ___| | mod_ssl + * | '_ ` _ \ / _ \ / _` | / __/ __| | Apache Interface to OpenSSL + * | | | | | | (_) | (_| | \__ \__ \ | + * |_| |_| |_|\___/ \__,_|___|___/___/_| + * |_____| + * ssl_util.c + * Utility Functions + */ + /* ``Every day of my life + I am forced to add another + name to the list of people + who piss me off!'' + -- Calvin */ + +#include "mod_ssl.h" +#include "ap_mpm.h" +#include "apr_thread_mutex.h" + +/* _________________________________________________________________ +** +** Utility Functions +** _________________________________________________________________ +*/ + +char *ssl_util_vhostid(apr_pool_t *p, server_rec *s) +{ + char *id; + SSLSrvConfigRec *sc; + char *host; + apr_port_t port; + + host = s->server_hostname; + if (s->port != 0) + port = s->port; + else { + sc = mySrvConfig(s); + if (sc->enabled) + port = DEFAULT_HTTPS_PORT; + else + port = DEFAULT_HTTP_PORT; + } + id = apr_psprintf(p, "%s:%lu", host, (unsigned long)port); + return id; +} + +void ssl_util_strupper(char *s) +{ + for (; *s; ++s) + *s = apr_toupper(*s); + return; +} + +static const char ssl_util_uuencode_six2pr[64+1] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + +void ssl_util_uuencode(char *szTo, const char *szFrom, BOOL bPad) +{ + ssl_util_uuencode_binary((unsigned char *)szTo, + (const unsigned char *)szFrom, + strlen(szFrom), bPad); +} + +void ssl_util_uuencode_binary(unsigned char *szTo, + const unsigned char *szFrom, + int nLength, BOOL bPad) +{ + const unsigned char *s; + int nPad = 0; + + for (s = szFrom; nLength > 0; s += 3) { + *szTo++ = ssl_util_uuencode_six2pr[s[0] >> 2]; + *szTo++ = ssl_util_uuencode_six2pr[(s[0] << 4 | s[1] >> 4) & 0x3f]; + if (--nLength == 0) { + nPad = 2; + break; + } + *szTo++ = ssl_util_uuencode_six2pr[(s[1] << 2 | s[2] >> 6) & 0x3f]; + if (--nLength == 0) { + nPad = 1; + break; + } + *szTo++ = ssl_util_uuencode_six2pr[s[2] & 0x3f]; + --nLength; + } + while(bPad && nPad--) { + *szTo++ = NUL; + } + *szTo = NUL; + return; +} + +apr_file_t *ssl_util_ppopen(server_rec *s, apr_pool_t *p, const char *cmd, + const char * const *argv) +{ + apr_procattr_t *procattr; + apr_proc_t *proc; + + if (apr_procattr_create(&procattr, p) != APR_SUCCESS) + return NULL; + if (apr_procattr_io_set(procattr, APR_FULL_BLOCK, APR_FULL_BLOCK, + APR_FULL_BLOCK) != APR_SUCCESS) + return NULL; + if (apr_procattr_dir_set(procattr, + ap_make_dirstr_parent(p, cmd)) != APR_SUCCESS) + return NULL; + if (apr_procattr_cmdtype_set(procattr, APR_PROGRAM) != APR_SUCCESS) + return NULL; + if ((proc = (apr_proc_t *)apr_pcalloc(p, sizeof(apr_proc_t))) == NULL) + return NULL; + if (apr_proc_create(proc, cmd, argv, NULL, procattr, p) != APR_SUCCESS) + return NULL; + return proc->out; +} + +void ssl_util_ppclose(server_rec *s, apr_pool_t *p, apr_file_t *fp) +{ + apr_file_close(fp); + return; +} + +/* + * Run a filter program and read the first line of its stdout output + */ +char *ssl_util_readfilter(server_rec *s, apr_pool_t *p, const char *cmd, + const char * const *argv) +{ + static char buf[MAX_STRING_LEN]; + apr_file_t *fp; + apr_size_t nbytes = 1; + char c; + int k; + + if ((fp = ssl_util_ppopen(s, p, cmd, argv)) == NULL) + return NULL; + /* XXX: we are reading 1 byte at a time here */ + for (k = 0; apr_file_read(fp, &c, &nbytes) == APR_SUCCESS + && nbytes == 1 && (k < MAX_STRING_LEN-1) ; ) { + if (c == '\n' || c == '\r') + break; + buf[k++] = c; + } + buf[k] = NUL; + ssl_util_ppclose(s, p, fp); + + return buf; +} + +BOOL ssl_util_path_check(ssl_pathcheck_t pcm, const char *path, apr_pool_t *p) +{ + apr_finfo_t finfo; + + if (path == NULL) + return FALSE; + if (pcm & SSL_PCM_EXISTS && apr_stat(&finfo, path, + APR_FINFO_TYPE|APR_FINFO_SIZE, p) != 0) + return FALSE; + if (pcm & SSL_PCM_ISREG && finfo.filetype != APR_REG) + return FALSE; + if (pcm & SSL_PCM_ISDIR && finfo.filetype != APR_DIR) + return FALSE; + if (pcm & SSL_PCM_ISNONZERO && finfo.size <= 0) + return FALSE; + return TRUE; +} + +ssl_algo_t ssl_util_algotypeof(X509 *pCert, EVP_PKEY *pKey) +{ + ssl_algo_t t; + + t = SSL_ALGO_UNKNOWN; + if (pCert != NULL) + pKey = X509_get_pubkey(pCert); + if (pKey != NULL) { + switch (EVP_PKEY_key_type(pKey)) { + case EVP_PKEY_RSA: + t = SSL_ALGO_RSA; + break; + case EVP_PKEY_DSA: + t = SSL_ALGO_DSA; + break; + default: + break; + } + } + return t; +} + +char *ssl_util_algotypestr(ssl_algo_t t) +{ + char *cp; + + cp = "UNKNOWN"; + switch (t) { + case SSL_ALGO_RSA: + cp = "RSA"; + break; + case SSL_ALGO_DSA: + cp = "DSA"; + break; + default: + break; + } + return cp; +} + +char *ssl_util_ptxtsub(apr_pool_t *p, const char *cpLine, + const char *cpMatch, char *cpSubst) +{ +#define MAX_PTXTSUB 100 + char *cppMatch[MAX_PTXTSUB]; + char *cpResult; + int nResult; + int nLine; + int nSubst; + int nMatch; + char *cpI; + char *cpO; + char *cp; + int i; + + /* + * Pass 1: find substitution locations and calculate sizes + */ + nLine = strlen(cpLine); + nMatch = strlen(cpMatch); + nSubst = strlen(cpSubst); + for (cpI = (char *)cpLine, i = 0, nResult = 0; + cpI < cpLine+nLine && i < MAX_PTXTSUB; ) { + if ((cp = strstr(cpI, cpMatch)) != NULL) { + cppMatch[i++] = cp; + nResult += ((cp-cpI)+nSubst); + cpI = (cp+nMatch); + } + else { + nResult += strlen(cpI); + break; + } + } + cppMatch[i] = NULL; + if (i == 0) + return NULL; + + /* + * Pass 2: allocate memory and assemble result + */ + cpResult = apr_pcalloc(p, nResult+1); + for (cpI = (char *)cpLine, cpO = cpResult, i = 0; + cppMatch[i] != NULL; + i++) { + apr_cpystrn(cpO, cpI, cppMatch[i]-cpI+1); + cpO += (cppMatch[i]-cpI); + apr_cpystrn(cpO, cpSubst, nSubst+1); + cpO += nSubst; + cpI = (cppMatch[i]+nMatch); + } + apr_cpystrn(cpO, cpI, cpResult+nResult-cpO+1); + + return cpResult; +} + +/* + * certain key and cert data needs to survive restarts, + * which are stored in the user data table of s->process->pool. + * to prevent "leaking" of this data, we use malloc/free + * rather than apr_palloc and these wrappers to help make sure + * we do not leak the malloc-ed data. + */ +unsigned char *ssl_asn1_table_set(apr_hash_t *table, + const char *key, + long int length) +{ + apr_ssize_t klen = strlen(key); + ssl_asn1_t *asn1 = apr_hash_get(table, key, klen); + + /* + * if a value for this key already exists, + * reuse as much of the already malloc-ed data + * as possible. + */ + if (asn1) { + if (asn1->nData != length) { + free(asn1->cpData); /* XXX: realloc? */ + asn1->cpData = NULL; + } + } + else { + asn1 = malloc(sizeof(*asn1)); + asn1->source_mtime = 0; /* used as a note for encrypted private keys */ + asn1->cpData = NULL; + } + + asn1->nData = length; + if (!asn1->cpData) { + asn1->cpData = malloc(length); + } + + apr_hash_set(table, key, klen, asn1); + + return asn1->cpData; /* caller will assign a value to this */ +} + +ssl_asn1_t *ssl_asn1_table_get(apr_hash_t *table, + const char *key) +{ + return (ssl_asn1_t *)apr_hash_get(table, key, APR_HASH_KEY_STRING); +} + +void ssl_asn1_table_unset(apr_hash_t *table, + const char *key) +{ + apr_ssize_t klen = strlen(key); + ssl_asn1_t *asn1 = apr_hash_get(table, key, klen); + + if (!asn1) { + return; + } + + if (asn1->cpData) { + free(asn1->cpData); + } + free(asn1); + + apr_hash_set(table, key, klen, NULL); +} + +static const char *ssl_asn1_key_types[] = {"RSA", "DSA"}; + +const char *ssl_asn1_keystr(int keytype) +{ + if (keytype >= SSL_AIDX_MAX) { + return NULL; + } + + return ssl_asn1_key_types[keytype]; +} + +const char *ssl_asn1_table_keyfmt(apr_pool_t *p, + const char *id, + int keytype) +{ + const char *keystr = ssl_asn1_keystr(keytype); + + return apr_pstrcat(p, id, ":", keystr, NULL); +} + + +#if APR_HAS_THREADS +/* + * To ensure thread-safetyness in OpenSSL - work in progress + */ + +static apr_thread_mutex_t **lock_cs; +static int lock_num_locks; + +#ifdef SSLC_VERSION_NUMBER +#if SSLC_VERSION_NUMBER >= 0x2000 +static int ssl_util_thr_lock(int mode, int type, + const char *file, int line) +#else +static void ssl_util_thr_lock(int mode, int type, + const char *file, int line) +#endif +#else +static void ssl_util_thr_lock(int mode, int type, + const char *file, int line) +#endif +{ + if (type < lock_num_locks) { + if (mode & CRYPTO_LOCK) { + apr_thread_mutex_lock(lock_cs[type]); + } + else { + apr_thread_mutex_unlock(lock_cs[type]); + } +#ifdef SSLC_VERSION_NUMBER +#if SSLC_VERSION_NUMBER >= 0x2000 + return 1; + } + else { + return -1; +#endif +#endif + } +} + +static unsigned long ssl_util_thr_id(void) +{ + /* OpenSSL needs this to return an unsigned long. On OS/390, the pthread + * id is a structure twice that big. Use the TCB pointer instead as a + * unique unsigned long. + */ +#ifdef __MVS__ + struct PSA { + char unmapped[540]; + unsigned long PSATOLD; + } *psaptr = 0; + + return psaptr->PSATOLD; +#else + return (unsigned long) apr_os_thread_current(); +#endif +} + +static apr_status_t ssl_util_thread_cleanup(void *data) +{ + CRYPTO_set_locking_callback(NULL); + CRYPTO_set_id_callback(NULL); + + /* Let the registered mutex cleanups do their own thing + */ + return APR_SUCCESS; +} + +void ssl_util_thread_setup(apr_pool_t *p) +{ + int i; + + lock_num_locks = CRYPTO_num_locks(); + lock_cs = apr_palloc(p, lock_num_locks * sizeof(*lock_cs)); + + for (i = 0; i < lock_num_locks; i++) { + apr_thread_mutex_create(&(lock_cs[i]), APR_THREAD_MUTEX_DEFAULT, p); + } + + CRYPTO_set_id_callback(ssl_util_thr_id); + + CRYPTO_set_locking_callback(ssl_util_thr_lock); + + apr_pool_cleanup_register(p, NULL, ssl_util_thread_cleanup, + apr_pool_cleanup_null); +} +#endif diff --git a/rubbos/app/httpd-2.0.64/modules/ssl/ssl_util_ssl.c b/rubbos/app/httpd-2.0.64/modules/ssl/ssl_util_ssl.c new file mode 100644 index 00000000..857bc304 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/ssl/ssl_util_ssl.c @@ -0,0 +1,574 @@ +/* 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. + */ + +/* _ _ + * _ __ ___ ___ __| | ___ ___| | mod_ssl + * | '_ ` _ \ / _ \ / _` | / __/ __| | Apache Interface to OpenSSL + * | | | | | | (_) | (_| | \__ \__ \ | + * |_| |_| |_|\___/ \__,_|___|___/___/_| + * |_____| + * ssl_util_ssl.c + * Additional Utility Functions for OpenSSL + */ + +#include "mod_ssl.h" + +/* _________________________________________________________________ +** +** Additional High-Level Functions for OpenSSL +** _________________________________________________________________ +*/ + +/* we initialize this index at startup time + * and never write to it at request time, + * so this static is thread safe. + * also note that OpenSSL increments at static variable when + * SSL_get_ex_new_index() is called, so we _must_ do this at startup. + */ +static int SSL_app_data2_idx = -1; + +void SSL_init_app_data2_idx(void) +{ + int i; + + if (SSL_app_data2_idx > -1) { + return; + } + + /* we _do_ need to call this twice */ + for (i=0; i<=1; i++) { + SSL_app_data2_idx = + SSL_get_ex_new_index(0, + "Second Application Data for SSL", + NULL, NULL, NULL); + } +} + +void *SSL_get_app_data2(SSL *ssl) +{ + return (void *)SSL_get_ex_data(ssl, SSL_app_data2_idx); +} + +void SSL_set_app_data2(SSL *ssl, void *arg) +{ + SSL_set_ex_data(ssl, SSL_app_data2_idx, (char *)arg); + return; +} + +/* _________________________________________________________________ +** +** High-Level Certificate / Private Key Loading +** _________________________________________________________________ +*/ + +X509 *SSL_read_X509(char* filename, X509 **x509, modssl_read_bio_cb_fn *cb) +{ + X509 *rc; + BIO *bioS; + BIO *bioF; + + /* 1. try PEM (= DER+Base64+headers) */ + if ((bioS=BIO_new_file(filename, "r")) == NULL) + return NULL; + rc = modssl_PEM_read_bio_X509 (bioS, x509, cb, NULL); + BIO_free(bioS); + + if (rc == NULL) { + /* 2. try DER+Base64 */ + if ((bioS=BIO_new_file(filename, "r")) == NULL) + return NULL; + + if ((bioF = BIO_new(BIO_f_base64())) == NULL) { + BIO_free(bioS); + return NULL; + } + bioS = BIO_push(bioF, bioS); + rc = d2i_X509_bio(bioS, NULL); + BIO_free_all(bioS); + + if (rc == NULL) { + /* 3. try plain DER */ + if ((bioS=BIO_new_file(filename, "r")) == NULL) + return NULL; + rc = d2i_X509_bio(bioS, NULL); + BIO_free(bioS); + } + } + if (rc != NULL && x509 != NULL) { + if (*x509 != NULL) + X509_free(*x509); + *x509 = rc; + } + return rc; +} + +#if SSL_LIBRARY_VERSION <= 0x00904100 +static EVP_PKEY *d2i_PrivateKey_bio(BIO *bio, EVP_PKEY **key) +{ + return ((EVP_PKEY *)ASN1_d2i_bio( + (char *(*)())EVP_PKEY_new, + (char *(*)())d2i_PrivateKey, + (bio), (unsigned char **)(key))); +} +#endif + +EVP_PKEY *SSL_read_PrivateKey(char* filename, EVP_PKEY **key, modssl_read_bio_cb_fn *cb, void *s) +{ + EVP_PKEY *rc; + BIO *bioS; + BIO *bioF; + + /* 1. try PEM (= DER+Base64+headers) */ + if ((bioS=BIO_new_file(filename, "r")) == NULL) + return NULL; + rc = modssl_PEM_read_bio_PrivateKey(bioS, key, cb, s); + BIO_free(bioS); + + if (rc == NULL) { + /* 2. try DER+Base64 */ + if ((bioS = BIO_new_file(filename, "r")) == NULL) + return NULL; + + if ((bioF = BIO_new(BIO_f_base64())) == NULL) { + BIO_free(bioS); + return NULL; + } + bioS = BIO_push(bioF, bioS); + rc = d2i_PrivateKey_bio(bioS, NULL); + BIO_free_all(bioS); + + if (rc == NULL) { + /* 3. try plain DER */ + if ((bioS = BIO_new_file(filename, "r")) == NULL) + return NULL; + rc = d2i_PrivateKey_bio(bioS, NULL); + BIO_free(bioS); + } + } + if (rc != NULL && key != NULL) { + if (*key != NULL) + EVP_PKEY_free(*key); + *key = rc; + } + return rc; +} + +/* _________________________________________________________________ +** +** Smart shutdown +** _________________________________________________________________ +*/ + +int SSL_smart_shutdown(SSL *ssl) +{ + int i; + int rc; + + /* + * Repeat the calls, because SSL_shutdown internally dispatches through a + * little state machine. Usually only one or two interation should be + * needed, so we restrict the total number of restrictions in order to + * avoid process hangs in case the client played bad with the socket + * connection and OpenSSL cannot recognize it. + */ + rc = 0; + for (i = 0; i < 4 /* max 2x pending + 2x data = 4 */; i++) { + if ((rc = SSL_shutdown(ssl))) + break; + } + return rc; +} + +/* _________________________________________________________________ +** +** Certificate Revocation List (CRL) Storage +** _________________________________________________________________ +*/ + +X509_STORE *SSL_X509_STORE_create(char *cpFile, char *cpPath) +{ + X509_STORE *pStore; + X509_LOOKUP *pLookup; + + if (cpFile == NULL && cpPath == NULL) + return NULL; + if ((pStore = X509_STORE_new()) == NULL) + return NULL; + if (cpFile != NULL) { + pLookup = X509_STORE_add_lookup(pStore, X509_LOOKUP_file()); + if (pLookup == NULL) { + X509_STORE_free(pStore); + return NULL; + } + X509_LOOKUP_load_file(pLookup, cpFile, X509_FILETYPE_PEM); + } + if (cpPath != NULL) { + pLookup = X509_STORE_add_lookup(pStore, X509_LOOKUP_hash_dir()); + if (pLookup == NULL) { + X509_STORE_free(pStore); + return NULL; + } + X509_LOOKUP_add_dir(pLookup, cpPath, X509_FILETYPE_PEM); + } + return pStore; +} + +int SSL_X509_STORE_lookup(X509_STORE *pStore, int nType, + X509_NAME *pName, X509_OBJECT *pObj) +{ + X509_STORE_CTX pStoreCtx; + int rc; + + X509_STORE_CTX_init(&pStoreCtx, pStore, NULL, NULL); + rc = X509_STORE_get_by_subject(&pStoreCtx, nType, pName, pObj); + X509_STORE_CTX_cleanup(&pStoreCtx); + return rc; +} + +/* _________________________________________________________________ +** +** Cipher Suite Spec String Creation +** _________________________________________________________________ +*/ + +char *SSL_make_ciphersuite(apr_pool_t *p, SSL *ssl) +{ + STACK_OF(SSL_CIPHER) *sk; + SSL_CIPHER *c; + int i; + int l; + char *cpCipherSuite; + char *cp; + + if (ssl == NULL) + return ""; + if ((sk = (STACK_OF(SSL_CIPHER) *)SSL_get_ciphers(ssl)) == NULL) + return ""; + l = 0; + for (i = 0; i < sk_SSL_CIPHER_num(sk); i++) { + c = sk_SSL_CIPHER_value(sk, i); + l += strlen(SSL_CIPHER_get_name(c))+2+1; + } + if (l == 0) + return ""; + cpCipherSuite = (char *)apr_palloc(p, l+1); + cp = cpCipherSuite; + for (i = 0; i < sk_SSL_CIPHER_num(sk); i++) { + c = sk_SSL_CIPHER_value(sk, i); + l = strlen(SSL_CIPHER_get_name(c)); + memcpy(cp, SSL_CIPHER_get_name(c), l); + cp += l; + *cp++ = '/'; + *cp++ = (SSL_CIPHER_get_valid(c) == 1 ? '1' : '0'); + *cp++ = ':'; + } + *(cp-1) = NUL; + return cpCipherSuite; +} + +/* _________________________________________________________________ +** +** Certificate Checks +** _________________________________________________________________ +*/ + +/* check whether cert contains extended key usage with a SGC tag */ +BOOL SSL_X509_isSGC(X509 *cert) +{ +#ifdef HAVE_SSL_X509V3_EXT_d2i + X509_EXTENSION *ext; + int ext_nid; + STACK *sk; + BOOL is_sgc; + int idx; + int i; + + is_sgc = FALSE; + idx = X509_get_ext_by_NID(cert, NID_ext_key_usage, -1); + if (idx >= 0) { + ext = X509_get_ext(cert, idx); + if ((sk = (STACK *)X509V3_EXT_d2i(ext)) != NULL) { + for (i = 0; i < sk_num(sk); i++) { + ext_nid = OBJ_obj2nid((ASN1_OBJECT *)sk_value(sk, i)); + if (ext_nid == NID_ms_sgc || ext_nid == NID_ns_sgc) { + is_sgc = TRUE; + break; + } + } + } + } + return is_sgc; +#else + return FALSE; +#endif +} + +/* retrieve basic constraints ingredients */ +BOOL SSL_X509_getBC(X509 *cert, int *ca, int *pathlen) +{ +#ifdef HAVE_SSL_X509V3_EXT_d2i + X509_EXTENSION *ext; + BASIC_CONSTRAINTS *bc; + int idx; + BIGNUM *bn = NULL; + char *cp; + + if ((idx = X509_get_ext_by_NID(cert, NID_basic_constraints, -1)) < 0) + return FALSE; + ext = X509_get_ext(cert, idx); + if (ext == NULL) + return FALSE; + if ((bc = (BASIC_CONSTRAINTS *)X509V3_EXT_d2i(ext)) == NULL) + return FALSE; + *ca = bc->ca; + *pathlen = -1 /* unlimited */; + if (bc->pathlen != NULL) { + if ((bn = ASN1_INTEGER_to_BN(bc->pathlen, NULL)) == NULL) + return FALSE; + if ((cp = BN_bn2dec(bn)) == NULL) + return FALSE; + *pathlen = atoi(cp); + free(cp); + BN_free(bn); + } + BASIC_CONSTRAINTS_free(bc); + return TRUE; +#else + return FALSE; +#endif +} + +/* retrieve subject CommonName of certificate */ +BOOL SSL_X509_getCN(apr_pool_t *p, X509 *xs, char **cppCN) +{ + X509_NAME *xsn; + X509_NAME_ENTRY *xsne; + int i, nid; + unsigned char *data_ptr; + int data_len; + + xsn = X509_get_subject_name(xs); + for (i = 0; i < sk_X509_NAME_ENTRY_num((STACK_OF(X509_NAME_ENTRY) *) + X509_NAME_get_entries(xsn)); i++) { + xsne = sk_X509_NAME_ENTRY_value((STACK_OF(X509_NAME_ENTRY) *) + X509_NAME_get_entries(xsn), i); + nid = OBJ_obj2nid((ASN1_OBJECT *)X509_NAME_ENTRY_get_object(xsne)); + if (nid == NID_commonName) { + data_ptr = X509_NAME_ENTRY_get_data_ptr(xsne); + data_len = X509_NAME_ENTRY_get_data_len(xsne); + *cppCN = apr_palloc(p, data_len+1); + apr_cpystrn(*cppCN, (char *)data_ptr, data_len+1); + (*cppCN)[data_len] = NUL; +#ifdef CHARSET_EBCDIC + ascii2ebcdic(*cppCN, *cppCN, strlen(*cppCN)); +#endif + return TRUE; + } + } + return FALSE; +} + +/* _________________________________________________________________ +** +** Low-Level CA Certificate Loading +** _________________________________________________________________ +*/ + +BOOL SSL_X509_INFO_load_file(apr_pool_t *ptemp, + STACK_OF(X509_INFO) *sk, + const char *filename) +{ + BIO *in; + + if (!(in = BIO_new(BIO_s_file()))) { + return FALSE; + } + + if (BIO_read_filename(in, MODSSL_PCHAR_CAST filename) <= 0) { + BIO_free(in); + return FALSE; + } + + ERR_clear_error(); + + modssl_PEM_X509_INFO_read_bio(in, sk, NULL, NULL); + + BIO_free(in); + + return TRUE; +} + +BOOL SSL_X509_INFO_load_path(apr_pool_t *ptemp, + STACK_OF(X509_INFO) *sk, + const char *pathname) +{ + /* XXX: this dir read code is exactly the same as that in + * ssl_engine_init.c, only the call to handle the fullname is different, + * should fold the duplication. + */ + apr_dir_t *dir; + apr_finfo_t dirent; + apr_int32_t finfo_flags = APR_FINFO_TYPE|APR_FINFO_NAME; + const char *fullname; + BOOL ok = FALSE; + + if (apr_dir_open(&dir, pathname, ptemp) != APR_SUCCESS) { + return FALSE; + } + + while ((apr_dir_read(&dirent, finfo_flags, dir)) == APR_SUCCESS) { + if (dirent.filetype == APR_DIR) { + continue; /* don't try to load directories */ + } + + fullname = apr_pstrcat(ptemp, + pathname, "/", dirent.name, + NULL); + + if (SSL_X509_INFO_load_file(ptemp, sk, fullname)) { + ok = TRUE; + } + } + + apr_dir_close(dir); + + return ok; +} + +/* _________________________________________________________________ +** +** Extra Server Certificate Chain Support +** _________________________________________________________________ +*/ + +/* + * Read a file that optionally contains the server certificate in PEM + * format, possibly followed by a sequence of CA certificates that + * should be sent to the peer in the SSL Certificate message. + */ +int SSL_CTX_use_certificate_chain( + SSL_CTX *ctx, char *file, int skipfirst, modssl_read_bio_cb_fn *cb) +{ + BIO *bio; + X509 *x509; + unsigned long err; + int n; + STACK *extra_certs; + + if ((bio = BIO_new(BIO_s_file_internal())) == NULL) + return -1; + if (BIO_read_filename(bio, file) <= 0) { + BIO_free(bio); + return -1; + } + /* optionally skip a leading server certificate */ + if (skipfirst) { + if ((x509 = modssl_PEM_read_bio_X509(bio, NULL, cb, NULL)) == NULL) { + BIO_free(bio); + return -1; + } + X509_free(x509); + } + /* free a perhaps already configured extra chain */ + extra_certs=SSL_CTX_get_extra_certs(ctx); + if (extra_certs != NULL) { + sk_X509_pop_free((STACK_OF(X509) *)extra_certs, X509_free); + SSL_CTX_set_extra_certs(ctx,NULL); + } + /* create new extra chain by loading the certs */ + n = 0; + while ((x509 = modssl_PEM_read_bio_X509(bio, NULL, cb, NULL)) != NULL) { + if (!SSL_CTX_add_extra_chain_cert(ctx, x509)) { + X509_free(x509); + BIO_free(bio); + return -1; + } + n++; + } + /* Make sure that only the error is just an EOF */ + if ((err = ERR_peek_error()) > 0) { + if (!( ERR_GET_LIB(err) == ERR_LIB_PEM + && ERR_GET_REASON(err) == PEM_R_NO_START_LINE)) { + BIO_free(bio); + return -1; + } + while (ERR_get_error() > 0) ; + } + BIO_free(bio); + return n; +} + +/* _________________________________________________________________ +** +** Session Stuff +** _________________________________________________________________ +*/ + +char *SSL_SESSION_id2sz(unsigned char *id, int idlen, + char *str, int strsize) +{ + char *cp; + int n; + + cp = str; + for (n = 0; n < idlen && n < SSL_MAX_SSL_SESSION_ID_LENGTH; n++) { + apr_snprintf(cp, strsize - (cp-str), "%02X", id[n]); + cp += 2; + } + *cp = NUL; + return str; +} + +/* sslc+OpenSSL compat */ + +int modssl_session_get_time(SSL_SESSION *session) +{ +#ifdef OPENSSL_VERSION_NUMBER + return SSL_SESSION_get_time(session); +#else /* assume sslc */ + CRYPTO_TIME_T ct; + SSL_SESSION_get_time(session, &ct); + return CRYPTO_time_to_int(&ct); +#endif +} + +#ifndef SSLC_VERSION_NUMBER +#define SSLC_VERSION_NUMBER 0x0000 +#endif + +DH *modssl_dh_configure(unsigned char *p, int plen, + unsigned char *g, int glen) +{ + DH *dh; + + if (!(dh = DH_new())) { + return NULL; + } + +#if defined(OPENSSL_VERSION_NUMBER) || (SSLC_VERSION_NUMBER < 0x2000) + dh->p = BN_bin2bn(p, plen, NULL); + dh->g = BN_bin2bn(g, glen, NULL); + if (!(dh->p && dh->g)) { + DH_free(dh); + return NULL; + } +#else + R_EITEMS_add(dh->data, PK_TYPE_DH, PK_DH_P, 0, p, plen, R_EITEMS_PF_COPY); + R_EITEMS_add(dh->data, PK_TYPE_DH, PK_DH_G, 0, g, glen, R_EITEMS_PF_COPY); +#endif + + return dh; +} diff --git a/rubbos/app/httpd-2.0.64/modules/ssl/ssl_util_ssl.h b/rubbos/app/httpd-2.0.64/modules/ssl/ssl_util_ssl.h new file mode 100644 index 00000000..d5c48f16 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/ssl/ssl_util_ssl.h @@ -0,0 +1,93 @@ +/* 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. + */ + +/* _ _ + * _ __ ___ ___ __| | ___ ___| | mod_ssl + * | '_ ` _ \ / _ \ / _` | / __/ __| | Apache Interface to OpenSSL + * | | | | | | (_) | (_| | \__ \__ \ | + * |_| |_| |_|\___/ \__,_|___|___/___/_| + * |_____| + * ssl_util_ssl.h + * Additional Utility Functions for OpenSSL + */ + +#ifndef __SSL_UTIL_SSL_H__ +#define __SSL_UTIL_SSL_H__ + +/* + * Determine SSL library version number + */ +#define SSL_NIBBLE(x,n) ((x >> (n * 4)) & 0xF) + +#ifdef OPENSSL_VERSION_NUMBER +#define SSL_LIBRARY_VERSION OPENSSL_VERSION_NUMBER +#define SSL_LIBRARY_NAME "OpenSSL" +#define SSL_LIBRARY_TEXT OPENSSL_VERSION_TEXT +#define SSL_LIBRARY_DYNTEXT SSLeay_version(SSLEAY_VERSION) +#elif defined(SSLC_VERSION_NUMBER) +#define SSL_LIBRARY_VERSION SSLC_VERSION_NUMBER +#define SSL_LIBRARY_NAME "SSL-C" +#define SSL_LIBRARY_TEXT { 'S', 'S', 'L', '-', 'C', ' ', \ + '0' + SSL_NIBBLE(SSLC_VERSION_NUMBER,3), '.', \ + '0' + SSL_NIBBLE(SSLC_VERSION_NUMBER,2), '.', \ + '0' + SSL_NIBBLE(SSLC_VERSION_NUMBER,1), '.', \ + '0' + SSL_NIBBLE(SSLC_VERSION_NUMBER,0), 0 } +#define SSL_LIBRARY_DYNTEXT SSLC_library_info(SSLC_INFO_VERSION) +#elif !defined(SSL_LIBRARY_VERSION) +#define SSL_LIBRARY_VERSION 0x0000 +#define SSL_LIBRARY_NAME "OtherSSL" +#define SSL_LIBRARY_TEXT "OtherSSL 0.0.0 00 XXX 0000" +#define SSL_LIBRARY_DYNTEXT "OtherSSL 0.0.0 00 XXX 0000" +#endif + +/* + * Maximum length of a DER encoded session. + * FIXME: There is no define in OpenSSL, but OpenSSL uses 1024*10, + * so this value should be ok. Although we have no warm feeling. + */ +#define SSL_SESSION_MAX_DER 1024*10 + +/* max length for SSL_SESSION_id2sz */ +#define SSL_SESSION_ID_STRING_LEN \ + ((SSL_MAX_SSL_SESSION_ID_LENGTH + 1) * 2) + +/* + * Additional Functions + */ +void SSL_init_app_data2_idx(void); +void *SSL_get_app_data2(SSL *); +void SSL_set_app_data2(SSL *, void *); +X509 *SSL_read_X509(char *, X509 **, modssl_read_bio_cb_fn *); +EVP_PKEY *SSL_read_PrivateKey(char *, EVP_PKEY **, modssl_read_bio_cb_fn *, void *); +int SSL_smart_shutdown(SSL *ssl); +X509_STORE *SSL_X509_STORE_create(char *, char *); +int SSL_X509_STORE_lookup(X509_STORE *, int, X509_NAME *, X509_OBJECT *); +char *SSL_make_ciphersuite(apr_pool_t *, SSL *); +BOOL SSL_X509_isSGC(X509 *); +BOOL SSL_X509_getBC(X509 *, int *, int *); +BOOL SSL_X509_getCN(apr_pool_t *, X509 *, char **); +BOOL SSL_X509_INFO_load_file(apr_pool_t *, STACK_OF(X509_INFO) *, const char *); +BOOL SSL_X509_INFO_load_path(apr_pool_t *, STACK_OF(X509_INFO) *, const char *); +int SSL_CTX_use_certificate_chain(SSL_CTX *, char *, int, modssl_read_bio_cb_fn *); +char *SSL_SESSION_id2sz(unsigned char *, int, char *, int); + +/* util functions for OpenSSL+sslc compat */ +int modssl_session_get_time(SSL_SESSION *session); + +DH *modssl_dh_configure(unsigned char *p, int plen, + unsigned char *g, int glen); + +#endif /* __SSL_UTIL_SSL_H__ */ diff --git a/rubbos/app/httpd-2.0.64/modules/ssl/ssl_util_table.c b/rubbos/app/httpd-2.0.64/modules/ssl/ssl_util_table.c new file mode 100644 index 00000000..5eb98ec8 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/ssl/ssl_util_table.c @@ -0,0 +1,2518 @@ +/* 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. + */ + +/* _ _ + * _ __ ___ ___ __| | ___ ___| | mod_ssl + * | '_ ` _ \ / _ \ / _` | / __/ __| | Apache Interface to OpenSSL + * | | | | | | (_) | (_| | \__ \__ \ | + * |_| |_| |_|\___/ \__,_|___|___/___/_| + * |_____| + * ssl_util_table.c + * High Performance Hash Table Functions + */ + +/* + * Generic hash table handler + * Table 4.1.0 July-28-1998 + * + * This library is a generic open hash table with buckets and + * linked lists. It is pretty high performance. Each element + * has a key and a data. The user indexes on the key to find the + * data. + * + * Copyright 1998 by Gray Watson + * + * Permission to use, copy, modify, and distribute this software 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 Gray Watson not be used in advertising or + * publicity pertaining to distribution of the document or software + * without specific, written prior permission. + * + * Gray Watson makes no representations about the suitability of the + * software described herein for any purpose. It is provided "as is" + * without express or implied warranty. + * + * Modified in March 1999 by Ralf S. Engelschall + * for use in the mod_ssl project: + * o merged table_loc.h header into table.c + * o removed fillproto-comments from table.h + * o removed mmap() support because it's too unportable + * o added support for MM library via ta_{malloc,calloc,realloc,free} + */ + +#include +#include + +/* forward definitions for table.h */ +typedef struct table_st table_t; +typedef struct table_entry_st table_entry_t; + +#define TABLE_PRIVATE +#include "ssl_util_table.h" +#include "mod_ssl.h" + +/****************************** local defines ******************************/ + +#ifndef BITSPERBYTE +#define BITSPERBYTE 8 +#endif +#ifndef BITS +#define BITS(type) (BITSPERBYTE * (int)sizeof(type)) +#endif + +#define TABLE_MAGIC 0xBADF00D /* very magic magicness */ +#define LINEAR_MAGIC 0xAD00D00 /* magic value for linear struct */ +#define DEFAULT_SIZE 1024 /* default table size */ +#define MAX_ALIGNMENT 128 /* max alignment value */ +#define MAX_SORT_SPLITS 128 /* qsort can handle 2^128 entries */ + +/* returns 1 when we should grow or shrink the table */ +#define SHOULD_TABLE_GROW(tab) ((tab)->ta_entry_n > (tab)->ta_bucket_n * 2) +#define SHOULD_TABLE_SHRINK(tab) ((tab)->ta_entry_n < (tab)->ta_bucket_n / 2) + +/* + * void HASH_MIX + * + * DESCRIPTION: + * + * Mix 3 32-bit values reversibly. For every delta with one or two bits + * set, and the deltas of all three high bits or all three low bits, + * whether the original value of a,b,c is almost all zero or is + * uniformly distributed. + * + * If HASH_MIX() is run forward or backward, at least 32 bits in a,b,c + * have at least 1/4 probability of changing. If mix() is run + * forward, every bit of c will change between 1/3 and 2/3 of the + * time. (Well, 22/100 and 78/100 for some 2-bit deltas.) + * + * HASH_MIX() takes 36 machine instructions, but only 18 cycles on a + * superscalar machine (like a Pentium or a Sparc). No faster mixer + * seems to work, that's the result of my brute-force search. There + * were about 2^68 hashes to choose from. I only tested about a + * billion of those. + */ +#define HASH_MIX(a, b, c) \ + do { \ + a -= b; a -= c; a ^= (c >> 13); \ + b -= c; b -= a; b ^= (a << 8); \ + c -= a; c -= b; c ^= (b >> 13); \ + a -= b; a -= c; a ^= (c >> 12); \ + b -= c; b -= a; b ^= (a << 16); \ + c -= a; c -= b; c ^= (b >> 5); \ + a -= b; a -= c; a ^= (c >> 3); \ + b -= c; b -= a; b ^= (a << 10); \ + c -= a; c -= b; c ^= (b >> 15); \ + } while(0) + +#define TABLE_POINTER(table, type, pnt) (pnt) + +/* + * Macros to get at the key and the data pointers + */ +#define ENTRY_KEY_BUF(entry_p) ((entry_p)->te_key_buf) +#define ENTRY_DATA_BUF(tab_p, entry_p) \ + (ENTRY_KEY_BUF(entry_p) + (entry_p)->te_key_size) + +/* + * Table structures... + */ + +/* + * HACK: this should be equiv as the table_entry_t without the key_buf + * char. We use this with the ENTRY_SIZE() macro above which solves + * the problem with the lack of the [0] GNU hack. We use the + * table_entry_t structure to better map the memory and make things + * faster. + */ +typedef struct table_shell_st { + unsigned int te_key_size; /* size of data */ + unsigned int te_data_size; /* size of data */ + struct table_shell_st *te_next_p; /* pointer to next in the list */ + /* NOTE: this does not have the te_key_buf field here */ +} table_shell_t; + +/* + * Elements in the bucket linked-lists. The key[1] is the start of + * the key with the rest of the key and all of the data information + * packed in memory directly after the end of this structure. + * + * NOTE: if this structure is changed, the table_shell_t must be changed + * to match. + */ +struct table_entry_st { + unsigned int te_key_size; /* size of data */ + unsigned int te_data_size; /* size of data */ + struct table_entry_st *te_next_p; /* pointer to next in the list */ + unsigned char te_key_buf[1]; /* 1st byte of key buf */ +}; + +/* external structure for debuggers be able to see void */ +typedef table_entry_t table_entry_ext_t; + +/* main table structure */ +struct table_st { + unsigned int ta_magic; /* magic number */ + unsigned int ta_flags; /* table's flags defined in table.h */ + unsigned int ta_bucket_n; /* num of buckets, should be 2^X */ + unsigned int ta_entry_n; /* num of entries in all buckets */ + unsigned int ta_data_align; /* data alignment value */ + table_entry_t **ta_buckets; /* array of linked lists */ + table_linear_t ta_linear; /* linear tracking */ + unsigned long ta_file_size; /* size of on-disk space */ + void *(*ta_malloc)(void *opt_param, size_t size); + void *(*ta_calloc)(void *opt_param, size_t number, size_t size); + void *(*ta_realloc)(void *opt_param, void *ptr, size_t size); + void (*ta_free)(void *opt_param, void *ptr); + void *opt_param; +}; + +/* external table structure for debuggers */ +typedef table_t table_ext_t; + +/* local comparison functions */ +typedef int (*compare_t) (const void *element1_p, const void *element2_p, + table_compare_t user_compare, + const table_t * table_p); + +/* + * to map error to string + */ +typedef struct { + int es_error; /* error number */ + char *es_string; /* assocaited string */ +} error_str_t; + +static error_str_t errors[] = +{ + {TABLE_ERROR_NONE, "no error"}, + {TABLE_ERROR_PNT, "invalid table pointer"}, + {TABLE_ERROR_ARG_NULL, "buffer argument is null"}, + {TABLE_ERROR_SIZE, "incorrect size argument"}, + {TABLE_ERROR_OVERWRITE, "key exists and no overwrite"}, + {TABLE_ERROR_NOT_FOUND, "key does not exist"}, + {TABLE_ERROR_ALLOC, "error allocating memory"}, + {TABLE_ERROR_LINEAR, "linear access not in progress"}, + {TABLE_ERROR_OPEN, "could not open file"}, + {TABLE_ERROR_SEEK, "could not seek to position in file"}, + {TABLE_ERROR_READ, "could not read from file"}, + {TABLE_ERROR_WRITE, "could not write to file"}, + {TABLE_ERROR_EMPTY, "table is empty"}, + {TABLE_ERROR_NOT_EMPTY, "table contains data"}, + {TABLE_ERROR_ALIGNMENT, "invalid alignment value"}, + {0} +}; + +#define INVALID_ERROR "invalid error code" + + +/********************** wrappers for system functions ************************/ +static void *sys_malloc(void *param, size_t size) +{ + return malloc(size); +} + +static void *sys_calloc(void *param, size_t size1, size_t size2) +{ + return calloc(size1, size2); +} + +static void *sys_realloc(void *param, void *ptr, size_t size) +{ + return realloc(ptr, size); +} + +static void sys_free(void *param, void *ptr) +{ + free(ptr); +} + +/****************************** local functions ******************************/ + +/* + * static table_entry_t *first_entry + * + * DESCRIPTION: + * + * Return the first entry in the table. It will set the linear + * structure counter to the position of the first entry. + * + * RETURNS: + * + * Success: A pointer to the first entry in the table. + * + * Failure: NULL if there is no first entry. + * + * ARGUMENTS: + * + * table_p - Table whose next entry we are finding. + * + * linear_p - Pointer to a linear structure which we will advance and + * then find the corresponding entry. + */ +static table_entry_t *first_entry(table_t * table_p, + table_linear_t * linear_p) +{ + table_entry_t *entry_p; + unsigned int bucket_c = 0; + + /* look for the first non-empty bucket */ + for (bucket_c = 0; bucket_c < table_p->ta_bucket_n; bucket_c++) { + entry_p = table_p->ta_buckets[bucket_c]; + if (entry_p != NULL) { + if (linear_p != NULL) { + linear_p->tl_bucket_c = bucket_c; + linear_p->tl_entry_c = 0; + } + return TABLE_POINTER(table_p, table_entry_t *, entry_p); + } + } + + return NULL; +} + +/* + * static table_entry_t *next_entry + * + * DESCRIPTION: + * + * Return the next entry in the table which is past the position in + * our linear pointer. It will advance the linear structure counters. + * + * RETURNS: + * + * Success: A pointer to the next entry in the table. + * + * Failure: NULL. + * + * ARGUMENTS: + * + * table_p - Table whose next entry we are finding. + * + * linear_p - Pointer to a linear structure which we will advance and + * then find the corresponding entry. + * + * error_p - Pointer to an integer which when the routine returns will + * contain a table error code. + */ +static table_entry_t *next_entry(table_t * table_p, table_linear_t * linear_p, + int *error_p) +{ + table_entry_t *entry_p; + int entry_c; + + /* can't next if we haven't first-ed */ + if (linear_p == NULL) { + if (error_p != NULL) + *error_p = TABLE_ERROR_LINEAR; + return NULL; + } + + if (linear_p->tl_bucket_c >= table_p->ta_bucket_n) { + /* + * NOTE: this might happen if we delete an item which shortens the + * table bucket numbers. + */ + if (error_p != NULL) + *error_p = TABLE_ERROR_NOT_FOUND; + return NULL; + } + + linear_p->tl_entry_c++; + + /* find the entry which is the nth in the list */ + entry_p = table_p->ta_buckets[linear_p->tl_bucket_c]; + /* NOTE: we swap the order here to be more efficient */ + for (entry_c = linear_p->tl_entry_c; entry_c > 0; entry_c--) { + /* did we reach the end of the list? */ + if (entry_p == NULL) + break; + entry_p = TABLE_POINTER(table_p, table_entry_t *, entry_p)->te_next_p; + } + + /* did we find an entry in the current bucket? */ + if (entry_p != NULL) { + if (error_p != NULL) + *error_p = TABLE_ERROR_NONE; + return TABLE_POINTER(table_p, table_entry_t *, entry_p); + } + + /* find the first entry in the next non-empty bucket */ + + linear_p->tl_entry_c = 0; + for (linear_p->tl_bucket_c++; linear_p->tl_bucket_c < table_p->ta_bucket_n; + linear_p->tl_bucket_c++) { + entry_p = table_p->ta_buckets[linear_p->tl_bucket_c]; + if (entry_p != NULL) { + if (error_p != NULL) + *error_p = TABLE_ERROR_NONE; + return TABLE_POINTER(table_p, table_entry_t *, entry_p); + } + } + + if (error_p != NULL) + *error_p = TABLE_ERROR_NOT_FOUND; + return NULL; +} + +/* + * static unsigned int hash + * + * DESCRIPTION: + * + * Hash a variable-length key into a 32-bit value. Every bit of the + * key affects every bit of the return value. Every 1-bit and 2-bit + * delta achieves avalanche. About (6 * len + 35) instructions. The + * best hash table sizes are powers of 2. There is no need to use mod + * (sooo slow!). If you need less than 32 bits, use a bitmask. For + * example, if you need only 10 bits, do h = (h & hashmask(10)); In + * which case, the hash table should have hashsize(10) elements. + * + * By Bob Jenkins, 1996. bob_jenkins@compuserve.com. You may use + * this code any way you wish, private, educational, or commercial. + * It's free. See + * http://ourworld.compuserve.com/homepages/bob_jenkins/evahash.htm + * Use for hash table lookup, or anything where one collision in 2^^32 + * is acceptable. Do NOT use for cryptographic purposes. + * + * RETURNS: + * + * Returns a 32-bit hash value. + * + * ARGUMENTS: + * + * key - Key (the unaligned variable-length array of bytes) that we + * are hashing. + * + * length - Length of the key in bytes. + * + * init_val - Initialization value of the hash if you need to hash a + * number of strings together. For instance, if you are hashing N + * strings (unsigned char **)keys, do it like this: + * + * for (i=0, h=0; i= 12; len -= 12) { + a += (key_p[0] + + ((unsigned long) key_p[1] << 8) + + ((unsigned long) key_p[2] << 16) + + ((unsigned long) key_p[3] << 24)); + b += (key_p[4] + + ((unsigned long) key_p[5] << 8) + + ((unsigned long) key_p[6] << 16) + + ((unsigned long) key_p[7] << 24)); + c += (key_p[8] + + ((unsigned long) key_p[9] << 8) + + ((unsigned long) key_p[10] << 16) + + ((unsigned long) key_p[11] << 24)); + HASH_MIX(a, b, c); + key_p += 12; + } + + c += length; + + /* all the case statements fall through to the next */ + switch (len) { + case 11: + c += ((unsigned long) key_p[10] << 24); + case 10: + c += ((unsigned long) key_p[9] << 16); + case 9: + c += ((unsigned long) key_p[8] << 8); + /* the first byte of c is reserved for the length */ + case 8: + b += ((unsigned long) key_p[7] << 24); + case 7: + b += ((unsigned long) key_p[6] << 16); + case 6: + b += ((unsigned long) key_p[5] << 8); + case 5: + b += key_p[4]; + case 4: + a += ((unsigned long) key_p[3] << 24); + case 3: + a += ((unsigned long) key_p[2] << 16); + case 2: + a += ((unsigned long) key_p[1] << 8); + case 1: + a += key_p[0]; + /* case 0: nothing left to add */ + } + HASH_MIX(a, b, c); + + return c; +} + +/* + * static int entry_size + * + * DESCRIPTION: + * + * Calculates the appropriate size of an entry to include the key and + * data sizes as well as any associated alignment to the data. + * + * RETURNS: + * + * The associated size of the entry. + * + * ARGUMENTS: + * + * table_p - Table associated with the entries whose size we are + * determining. + * + * key_size - Size of the entry key. + * + * data - Size of the entry data. + */ +static int entry_size(const table_t * table_p, const unsigned int key_size, + const unsigned int data_size) +{ + int size, left; + + /* initial size -- key is already aligned if right after struct */ + size = sizeof(struct table_shell_st) + key_size; + + /* if there is no alignment then it is easy */ + if (table_p->ta_data_align == 0) + return size + data_size; + /* add in our alignement */ + left = size & (table_p->ta_data_align - 1); + if (left > 0) + size += table_p->ta_data_align - left; + /* we add the data size here after the alignment */ + size += data_size; + + return size; +} + +/* + * static unsigned char *entry_data_buf + * + * DESCRIPTION: + * + * Companion to the ENTRY_DATA_BUF macro but this handles any + * associated alignment to the data in the entry. + * + * RETURNS: + * + * Pointer to the data segment of the entry. + * + * ARGUMENTS: + * + * table_p - Table associated with the entry. + * + * entry_p - Entry whose data pointer we are determining. + */ +static unsigned char *entry_data_buf(const table_t * table_p, + const table_entry_t * entry_p) +{ + const unsigned char *buf_p; + int size, pad; + + buf_p = entry_p->te_key_buf + entry_p->te_key_size; + + /* if there is no alignment then it is easy */ + if (table_p->ta_data_align == 0) + return (unsigned char *) buf_p; + /* we need the size of the space before the data */ + size = sizeof(struct table_shell_st) + entry_p->te_key_size; + + /* add in our alignment */ + pad = size & (table_p->ta_data_align - 1); + if (pad > 0) + pad = table_p->ta_data_align - pad; + return (unsigned char *) buf_p + pad; +} + +/******************************* sort routines *******************************/ + +/* + * static int our_compare + * + * DESCRIPTION: + * + * Compare two entries by calling user's compare program or by using + * memcmp. + * + * RETURNS: + * + * < 0, == 0, or > 0 depending on whether p1 is > p2, == p2, < p2. + * + * ARGUMENTS: + * + * p1 - First entry pointer to compare. + * + * p2 - Second entry pointer to compare. + * + * compare - User comparison function. Ignored. + * + * table_p - Associated table being ordered. Ignored. + */ +static int local_compare(const void *p1, const void *p2, + table_compare_t compare, const table_t * table_p) +{ + const table_entry_t *const *ent1_p = p1, *const *ent2_p = p2; + int cmp; + unsigned int size; + + /* compare as many bytes as we can */ + size = (*ent1_p)->te_key_size; + if ((*ent2_p)->te_key_size < size) + size = (*ent2_p)->te_key_size; + cmp = memcmp(ENTRY_KEY_BUF(*ent1_p), ENTRY_KEY_BUF(*ent2_p), size); + /* if common-size equal, then if next more bytes, it is larger */ + if (cmp == 0) + cmp = (*ent1_p)->te_key_size - (*ent2_p)->te_key_size; + return cmp; +} + +/* + * static int external_compare + * + * DESCRIPTION: + * + * Compare two entries by calling user's compare program or by using + * memcmp. + * + * RETURNS: + * + * < 0, == 0, or > 0 depending on whether p1 is > p2, == p2, < p2. + * + * ARGUMENTS: + * + * p1 - First entry pointer to compare. + * + * p2 - Second entry pointer to compare. + * + * user_compare - User comparison function. + * + * table_p - Associated table being ordered. + */ +static int external_compare(const void *p1, const void *p2, + table_compare_t user_compare, + const table_t * table_p) +{ + const table_entry_t *const *ent1_p = p1, *const *ent2_p = p2; + /* since we know we are not aligned we can use the EXTRY_DATA_BUF macro */ + return user_compare(ENTRY_KEY_BUF(*ent1_p), (*ent1_p)->te_key_size, + ENTRY_DATA_BUF(table_p, *ent1_p), + (*ent1_p)->te_data_size, + ENTRY_KEY_BUF(*ent2_p), (*ent2_p)->te_key_size, + ENTRY_DATA_BUF(table_p, *ent2_p), + (*ent2_p)->te_data_size); +} + +/* + * static int external_compare_align + * + * DESCRIPTION: + * + * Compare two entries by calling user's compare program or by using + * memcmp. Alignment information is necessary. + * + * RETURNS: + * + * < 0, == 0, or > 0 depending on whether p1 is > p2, == p2, < p2. + * + * ARGUMENTS: + * + * p1 - First entry pointer to compare. + * + * p2 - Second entry pointer to compare. + * + * user_compare - User comparison function. + * + * table_p - Associated table being ordered. + */ +static int external_compare_align(const void *p1, const void *p2, + table_compare_t user_compare, + const table_t * table_p) +{ + const table_entry_t *const *ent1_p = p1, *const *ent2_p = p2; + /* since we are aligned we have to use the entry_data_buf function */ + return user_compare(ENTRY_KEY_BUF(*ent1_p), (*ent1_p)->te_key_size, + entry_data_buf(table_p, *ent1_p), + (*ent1_p)->te_data_size, + ENTRY_KEY_BUF(*ent2_p), (*ent2_p)->te_key_size, + entry_data_buf(table_p, *ent2_p), + (*ent2_p)->te_data_size); +} + +/* + * static void split + * + * DESCRIPTION: + * + * This sorts an array of longs via the quick sort algorithm (it's + * pretty quick) + * + * RETURNS: + * + * None. + * + * ARGUMENTS: + * + * first_p - Start of the list that we are splitting. + * + * last_p - Last entry in the list that we are splitting. + * + * compare - Comparison function which is handling the actual + * elements. This is either a local function or a function to setup + * the problem element key and data pointers which then hands off to + * the user function. + * + * user_compare - User comparison function. Could be NULL if we are + * just using a local comparison function. + * + * table_p - Associated table being sorted. + */ +static void split(void *first_p, void *last_p, compare_t compare, + table_compare_t user_compare, table_t * table_p) +{ + void *pivot_p, *left_p, *right_p, *left_last_p, *right_first_p; + void *firsts[MAX_SORT_SPLITS], *lasts[MAX_SORT_SPLITS]; + int split_c = 0; + + for (;;) { + + /* no need to split the list if it is < 2 elements */ + while (first_p >= last_p) { + if (split_c == 0) { + /* we are done */ + return; + } + split_c--; + first_p = firsts[split_c]; + last_p = lasts[split_c]; + } + + left_p = first_p; + right_p = last_p; + pivot_p = first_p; + + do { + /* scan from right hand side */ + while (right_p > left_p + && compare(right_p, pivot_p, user_compare, table_p) > 0) + right_p = (char *) right_p - sizeof(table_entry_t *); + /* scan from left hand side */ + while (right_p > left_p + && compare(pivot_p, left_p, user_compare, table_p) >= 0) + left_p = (char *) left_p + sizeof(table_entry_t *); + /* if the pointers haven't met then swap values */ + if (right_p > left_p) { + /* swap_bytes(left_p, right_p) */ + table_entry_t *temp; + + temp = *(table_entry_t **) left_p; + *(table_entry_t **) left_p = *(table_entry_t **) right_p; + *(table_entry_t **) right_p = temp; + } + } while (right_p > left_p); + + /* now we swap the pivot with the right-hand side */ + { + /* swap_bytes(pivot_p, right_p); */ + table_entry_t *temp; + + temp = *(table_entry_t **) pivot_p; + *(table_entry_t **) pivot_p = *(table_entry_t **) right_p; + *(table_entry_t **) right_p = temp; + } + pivot_p = right_p; + + /* save the section to the right of the pivot in our stack */ + right_first_p = (char *) pivot_p + sizeof(table_entry_t *); + left_last_p = (char *) pivot_p - sizeof(table_entry_t *); + + /* do we need to save the righthand side? */ + if (right_first_p < last_p) { + if (split_c >= MAX_SORT_SPLITS) { + /* sanity check here -- we should never get here */ + abort(); + } + firsts[split_c] = right_first_p; + lasts[split_c] = last_p; + split_c++; + } + + /* do the left hand side of the pivot */ + /* first_p = first_p */ + last_p = left_last_p; + } +} + +/*************************** exported routines *******************************/ + +/* + * table_t *table_alloc + * + * DESCRIPTION: + * + * Allocate a new table structure. + * + * RETURNS: + * + * A pointer to the new table structure which must be passed to + * table_free to be deallocated. On error a NULL is returned. + * + * ARGUMENTS: + * + * bucket_n - Number of buckets for the hash table. Our current hash + * value works best with base two numbers. Set to 0 to take the + * library default of 1024. + * + * error_p - Pointer to an integer which, if not NULL, will contain a + * table error code. + * + * malloc_f, realloc_f, free_f - Pointers to malloc(3)-, realloc(3)- + * and free(3)-style functions. + */ +table_t *table_alloc(const unsigned int bucket_n, int *error_p, + void *(*malloc_f)(void *opt_param, size_t size), + void *(*calloc_f)(void *opt_param, size_t number, size_t size), + void *(*realloc_f)(void *opt_param, void *ptr, size_t size), + void (*free_f)(void *opt_param, void *ptr), void *opt_param) +{ + table_t *table_p = NULL; + unsigned int buck_n; + + /* allocate a table structure */ + if (malloc_f != NULL) + table_p = malloc_f(opt_param, sizeof(table_t)); + else + table_p = malloc(sizeof(table_t)); + if (table_p == NULL) { + if (error_p != NULL) + *error_p = TABLE_ERROR_ALLOC; + return NULL; + } + + if (bucket_n > 0) + buck_n = bucket_n; + else + buck_n = DEFAULT_SIZE; + /* allocate the buckets which are NULLed */ + if (calloc_f != NULL) + table_p->ta_buckets = (table_entry_t **)calloc_f(opt_param, buck_n, + sizeof(table_entry_t *)); + else + table_p->ta_buckets = (table_entry_t **)calloc(buck_n, sizeof(table_entry_t *)); + if (table_p->ta_buckets == NULL) { + if (error_p != NULL) + *error_p = TABLE_ERROR_ALLOC; + if (free_f != NULL) + free_f(opt_param, table_p); + else + free(table_p); + return NULL; + } + + /* initialize structure */ + table_p->ta_magic = TABLE_MAGIC; + table_p->ta_flags = 0; + table_p->ta_bucket_n = buck_n; + table_p->ta_entry_n = 0; + table_p->ta_data_align = 0; + table_p->ta_linear.tl_magic = 0; + table_p->ta_linear.tl_bucket_c = 0; + table_p->ta_linear.tl_entry_c = 0; + table_p->ta_file_size = 0; + table_p->ta_malloc = malloc_f != NULL ? malloc_f : sys_malloc; + table_p->ta_calloc = calloc_f != NULL ? calloc_f : sys_calloc; + table_p->ta_realloc = realloc_f != NULL ? realloc_f : sys_realloc; + table_p->ta_free = free_f != NULL ? free_f : sys_free; + table_p->opt_param = opt_param; + + if (error_p != NULL) + *error_p = TABLE_ERROR_NONE; + return table_p; +} + +/* + * int table_attr + * + * DESCRIPTION: + * + * Set the attributes for the table. The available attributes are + * specified at the top of table.h. + * + * RETURNS: + * + * Success - TABLE_ERROR_NONE + * + * Failure - Table error code. + * + * ARGUMENTS: + * + * table_p - Pointer to a table structure which we will be altering. + * + * attr - Attribute(s) that we will be applying to the table. + */ +int table_attr(table_t * table_p, const int attr) +{ + if (table_p == NULL) + return TABLE_ERROR_ARG_NULL; + if (table_p->ta_magic != TABLE_MAGIC) + return TABLE_ERROR_PNT; + table_p->ta_flags = attr; + + return TABLE_ERROR_NONE; +} + +/* + * int table_set_data_alignment + * + * DESCRIPTION: + * + * Set the alignment for the data in the table. For data elements + * sizeof(long) is recommended unless you use smaller data types + * exclusively. + * + * WARNING: This must be done before any data gets put into the table. + * + * RETURNS: + * + * Success - TABLE_ERROR_NONE + * + * Failure - Table error code. + * + * ARGUMENTS: + * + * table_p - Pointer to a table structure which we will be altering. + * + * alignment - Alignment requested for the data. Must be a power of + * 2. Set to 0 for none. + */ +int table_set_data_alignment(table_t * table_p, const int alignment) +{ + int val; + + if (table_p == NULL) + return TABLE_ERROR_ARG_NULL; + if (table_p->ta_magic != TABLE_MAGIC) + return TABLE_ERROR_PNT; + if (table_p->ta_entry_n > 0) + return TABLE_ERROR_NOT_EMPTY; + /* defaults */ + if (alignment < 2) + table_p->ta_data_align = 0; + else { + /* verify we have a base 2 number */ + for (val = 2; val < MAX_ALIGNMENT; val *= 2) { + if (val == alignment) + break; + } + if (val >= MAX_ALIGNMENT) + return TABLE_ERROR_ALIGNMENT; + table_p->ta_data_align = alignment; + } + + return TABLE_ERROR_NONE; +} + +/* + * int table_clear + * + * DESCRIPTION: + * + * Clear out and free all elements in a table structure. + * + * RETURNS: + * + * Success - TABLE_ERROR_NONE + * + * Failure - Table error code. + * + * ARGUMENTS: + * + * table_p - Table structure pointer that we will be clearing. + */ +int table_clear(table_t * table_p) +{ + table_entry_t *entry_p, *next_p; + table_entry_t **bucket_p, **bounds_p; + + if (table_p == NULL) + return TABLE_ERROR_ARG_NULL; + if (table_p->ta_magic != TABLE_MAGIC) + return TABLE_ERROR_PNT; + /* free the table allocation and table structure */ + bounds_p = table_p->ta_buckets + table_p->ta_bucket_n; + for (bucket_p = table_p->ta_buckets; bucket_p < bounds_p; bucket_p++) { + for (entry_p = *bucket_p; entry_p != NULL; entry_p = next_p) { + /* record the next pointer before we free */ + next_p = entry_p->te_next_p; + table_p->ta_free(table_p->opt_param, entry_p); + } + /* clear the bucket entry after we free its entries */ + *bucket_p = NULL; + } + + /* reset table state info */ + table_p->ta_entry_n = 0; + table_p->ta_linear.tl_magic = 0; + table_p->ta_linear.tl_bucket_c = 0; + table_p->ta_linear.tl_entry_c = 0; + + return TABLE_ERROR_NONE; +} + +/* + * int table_free + * + * DESCRIPTION: + * + * Deallocates a table structure. + * + * RETURNS: + * + * Success - TABLE_ERROR_NONE + * + * Failure - Table error code. + * + * ARGUMENTS: + * + * table_p - Table structure pointer that we will be freeing. + */ +int table_free(table_t * table_p) +{ + int ret; + + if (table_p == NULL) + return TABLE_ERROR_ARG_NULL; + if (table_p->ta_magic != TABLE_MAGIC) + return TABLE_ERROR_PNT; + ret = table_clear(table_p); + + if (table_p->ta_buckets != NULL) + table_p->ta_free(table_p->opt_param, table_p->ta_buckets); + table_p->ta_magic = 0; + table_p->ta_free(table_p->opt_param, table_p); + + return ret; +} + +/* + * int table_insert_kd + * + * DESCRIPTION: + * + * Like table_insert except it passes back a pointer to the key and + * the data buffers after they have been inserted into the table + * structure. + * + * This routine adds a key/data pair both of which are made up of a + * buffer of bytes and an associated size. Both the key and the data + * will be copied into buffers allocated inside the table. If the key + * exists already, the associated data will be replaced if the + * overwrite flag is set, otherwise an error is returned. + * + * NOTE: be very careful changing the values since the table library + * provides the pointers to its memory. The key can _never_ be + * changed otherwise you will not find it again. The data can be + * changed but its length can never be altered unless you delete and + * re-insert it into the table. + * + * WARNING: The pointers to the key and data are not in any specific + * alignment. Accessing the key and/or data as an short, integer, or + * long pointer directly can cause problems. + * + * WARNING: Replacing a data cell (not inserting) will cause the table + * linked list to be temporarily invalid. Care must be taken with + * multiple threaded programs which are relying on the first/next + * linked list to be always valid. + * + * RETURNS: + * + * Success - TABLE_ERROR_NONE + * + * Failure - Table error code. + * + * ARGUMENTS: + * + * table_p - Table structure pointer into which we will be inserting a + * new key/data pair. + * + * key_buf - Buffer of bytes of the key that we are inserting. If you + * are storing an (int) as the key (for example) then key_buf should + * be a (int *). + * + * key_size - Size of the key_buf buffer. If set to < 0 then the + * library will do a strlen of key_buf and add 1 for the '\0'. If you + * are storing an (int) as the key (for example) then key_size should + * be sizeof(int). + * + * data_buf - Buffer of bytes of the data that we are inserting. If + * it is NULL then the library will allocate space for the data in the + * table without copying in any information. If data_buf is NULL and + * data_size is 0 then the library will associate a NULL data pointer + * with the key. If you are storing a (long) as the data (for + * example) then data_buf should be a (long *). + * + * data_size - Size of the data_buf buffer. If set to < 0 then the + * library will do a strlen of data_buf and add 1 for the '\0'. If + * you are storing an (long) as the key (for example) then key_size + * should be sizeof(long). + * + * key_buf_p - Pointer which, if not NULL, will be set to the address + * of the key storage that was allocated in the table. If you are + * storing an (int) as the key (for example) then key_buf_p should be + * (int **) i.e. the address of a (int *). + * + * data_buf_p - Pointer which, if not NULL, will be set to the address + * of the data storage that was allocated in the table. If you are + * storing an (long) as the data (for example) then data_buf_p should + * be (long **) i.e. the address of a (long *). + * + * overwrite - Flag which, if set to 1, will allow the overwriting of + * the data in the table with the new data if the key already exists + * in the table. + */ +int table_insert_kd(table_t * table_p, + const void *key_buf, const int key_size, + const void *data_buf, const int data_size, + void **key_buf_p, void **data_buf_p, + const char overwrite_b) +{ + int bucket; + unsigned int ksize, dsize; + table_entry_t *entry_p, *last_p; + void *key_copy_p, *data_copy_p; + + /* check the arguments */ + if (table_p == NULL) + return TABLE_ERROR_ARG_NULL; + if (table_p->ta_magic != TABLE_MAGIC) + return TABLE_ERROR_PNT; + if (key_buf == NULL) + return TABLE_ERROR_ARG_NULL; + /* data_buf can be null but size must be >= 0, if it isn't null size != 0 */ + if ((data_buf == NULL && data_size < 0) + || (data_buf != NULL && data_size == 0)) + return TABLE_ERROR_SIZE; + /* determine sizes of key and data */ + if (key_size < 0) + ksize = strlen((char *) key_buf) + sizeof(char); + else + ksize = key_size; + if (data_size < 0) + dsize = strlen((char *) data_buf) + sizeof(char); + else + dsize = data_size; + /* get the bucket number via a hash function */ + bucket = hash(key_buf, ksize, 0) % table_p->ta_bucket_n; + + /* look for the entry in this bucket, only check keys of the same size */ + last_p = NULL; + for (entry_p = table_p->ta_buckets[bucket]; + (entry_p != NULL) && (entry_p->te_next_p != last_p); + last_p = entry_p, entry_p = entry_p->te_next_p) { + if (entry_p->te_key_size == ksize + && memcmp(ENTRY_KEY_BUF(entry_p), key_buf, ksize) == 0) + break; + } + + /* did we find it? then we are in replace mode. */ + if (entry_p != NULL) { + + /* can we not overwrite existing data? */ + if (!overwrite_b) { + if (key_buf_p != NULL) + *key_buf_p = ENTRY_KEY_BUF(entry_p); + if (data_buf_p != NULL) { + if (entry_p->te_data_size == 0) + *data_buf_p = NULL; + else { + if (table_p->ta_data_align == 0) + *data_buf_p = ENTRY_DATA_BUF(table_p, entry_p); + else + *data_buf_p = entry_data_buf(table_p, entry_p); + } + } + return TABLE_ERROR_OVERWRITE; + } + + /* re-alloc entry's data if the new size != the old */ + if (dsize != entry_p->te_data_size) { + + /* + * First we delete it from the list to keep the list whole. + * This properly preserves the linked list in case we have a + * thread marching through the linked list while we are + * inserting. Maybe this is an unnecessary protection but it + * should not harm that much. + */ + if (last_p == NULL) + table_p->ta_buckets[bucket] = entry_p->te_next_p; + else + last_p->te_next_p = entry_p->te_next_p; + /* + * Realloc the structure which may change its pointer. NOTE: + * this may change any previous data_key_p and data_copy_p + * pointers. + */ + entry_p = (table_entry_t *) + table_p->ta_realloc(table_p->opt_param, entry_p, + entry_size(table_p, entry_p->te_key_size, dsize)); + if (entry_p == NULL) + return TABLE_ERROR_ALLOC; + /* add it back to the front of the list */ + entry_p->te_data_size = dsize; + entry_p->te_next_p = table_p->ta_buckets[bucket]; + table_p->ta_buckets[bucket] = entry_p; + } + + /* copy or replace data in storage */ + if (dsize > 0) { + if (table_p->ta_data_align == 0) + data_copy_p = ENTRY_DATA_BUF(table_p, entry_p); + else + data_copy_p = entry_data_buf(table_p, entry_p); + if (data_buf != NULL) + memcpy(data_copy_p, data_buf, dsize); + } + else + data_copy_p = NULL; + if (key_buf_p != NULL) + *key_buf_p = ENTRY_KEY_BUF(entry_p); + if (data_buf_p != NULL) + *data_buf_p = data_copy_p; + /* returning from the section where we were overwriting table data */ + return TABLE_ERROR_NONE; + } + + /* + * It is a new entry. + */ + + /* allocate a new entry */ + entry_p = (table_entry_t *) + table_p->ta_malloc(table_p->opt_param, + entry_size(table_p, ksize, dsize)); + if (entry_p == NULL) + return TABLE_ERROR_ALLOC; + /* copy key into storage */ + entry_p->te_key_size = ksize; + key_copy_p = ENTRY_KEY_BUF(entry_p); + memcpy(key_copy_p, key_buf, ksize); + + /* copy data in */ + entry_p->te_data_size = dsize; + if (dsize > 0) { + if (table_p->ta_data_align == 0) + data_copy_p = ENTRY_DATA_BUF(table_p, entry_p); + else + data_copy_p = entry_data_buf(table_p, entry_p); + if (data_buf != NULL) + memcpy(data_copy_p, data_buf, dsize); + } + else + data_copy_p = NULL; + if (key_buf_p != NULL) + *key_buf_p = key_copy_p; + if (data_buf_p != NULL) + *data_buf_p = data_copy_p; + /* insert into list, no need to append */ + entry_p->te_next_p = table_p->ta_buckets[bucket]; + table_p->ta_buckets[bucket] = entry_p; + + table_p->ta_entry_n++; + + /* do we need auto-adjust? */ + if (table_p->ta_flags & TABLE_FLAG_AUTO_ADJUST + && SHOULD_TABLE_GROW(table_p)) + return table_adjust(table_p, table_p->ta_entry_n); + return TABLE_ERROR_NONE; +} + +/* + * int table_insert + * + * DESCRIPTION: + * + * Exactly the same as table_insert_kd except it does not pass back a + * pointer to the key after they have been inserted into the table + * structure. This is still here for backwards compatibility. + * + * See table_insert_kd for more information. + * + * RETURNS: + * + * Success - TABLE_ERROR_NONE + * + * Failure - Table error code. + * + * ARGUMENTS: + * + * table_p - Table structure pointer into which we will be inserting a + * new key/data pair. + * + * key_buf - Buffer of bytes of the key that we are inserting. If you + * are storing an (int) as the key (for example) then key_buf should + * be a (int *). + * + * key_size - Size of the key_buf buffer. If set to < 0 then the + * library will do a strlen of key_buf and add 1 for the '\0'. If you + * are storing an (int) as the key (for example) then key_size should + * be sizeof(int). + * + * data_buf - Buffer of bytes of the data that we are inserting. If + * it is NULL then the library will allocate space for the data in the + * table without copying in any information. If data_buf is NULL and + * data_size is 0 then the library will associate a NULL data pointer + * with the key. If you are storing a (long) as the data (for + * example) then data_buf should be a (long *). + * + * data_size - Size of the data_buf buffer. If set to < 0 then the + * library will do a strlen of data_buf and add 1 for the '\0'. If + * you are storing an (long) as the key (for example) then key_size + * should be sizeof(long). + * + * data_buf_p - Pointer which, if not NULL, will be set to the address + * of the data storage that was allocated in the table. If you are + * storing an (long) as the data (for example) then data_buf_p should + * be (long **) i.e. the address of a (long *). + * + * overwrite - Flag which, if set to 1, will allow the overwriting of + * the data in the table with the new data if the key already exists + * in the table. + */ +int table_insert(table_t * table_p, + const void *key_buf, const int key_size, + const void *data_buf, const int data_size, + void **data_buf_p, const char overwrite_b) +{ + return table_insert_kd(table_p, key_buf, key_size, data_buf, data_size, + NULL, data_buf_p, overwrite_b); +} + +/* + * int table_retrieve + * + * DESCRIPTION: + * + * This routine looks up a key made up of a buffer of bytes and an + * associated size in the table. If found then it returns the + * associated data information. + * + * RETURNS: + * + * Success - TABLE_ERROR_NONE + * + * Failure - Table error code. + * + * ARGUMENTS: + * + * table_p - Table structure pointer into which we will be searching + * for the key. + * + * key_buf - Buffer of bytes of the key that we are searching for. If + * you are looking for an (int) as the key (for example) then key_buf + * should be a (int *). + * + * key_size - Size of the key_buf buffer. If set to < 0 then the + * library will do a strlen of key_buf and add 1 for the '\0'. If you + * are looking for an (int) as the key (for example) then key_size + * should be sizeof(int). + * + * data_buf_p - Pointer which, if not NULL, will be set to the address + * of the data storage that was allocated in the table and that is + * associated with the key. If a (long) was stored as the data (for + * example) then data_buf_p should be (long **) i.e. the address of a + * (long *). + * + * data_size_p - Pointer to an integer which, if not NULL, will be set + * to the size of the data stored in the table that is associated with + * the key. + */ +int table_retrieve(table_t * table_p, + const void *key_buf, const int key_size, + void **data_buf_p, int *data_size_p) +{ + int bucket; + unsigned int ksize; + table_entry_t *entry_p, **buckets; + + if (table_p == NULL) + return TABLE_ERROR_ARG_NULL; + if (table_p->ta_magic != TABLE_MAGIC) + return TABLE_ERROR_PNT; + if (key_buf == NULL) + return TABLE_ERROR_ARG_NULL; + /* find key size */ + if (key_size < 0) + ksize = strlen((char *) key_buf) + sizeof(char); + else + ksize = key_size; + /* get the bucket number via a has function */ + bucket = hash(key_buf, ksize, 0) % table_p->ta_bucket_n; + + /* look for the entry in this bucket, only check keys of the same size */ + buckets = table_p->ta_buckets; + for (entry_p = buckets[bucket]; + entry_p != NULL; + entry_p = entry_p->te_next_p) { + entry_p = TABLE_POINTER(table_p, table_entry_t *, entry_p); + if (entry_p->te_key_size == ksize + && memcmp(ENTRY_KEY_BUF(entry_p), key_buf, ksize) == 0) + break; + } + + /* not found? */ + if (entry_p == NULL) + return TABLE_ERROR_NOT_FOUND; + if (data_buf_p != NULL) { + if (entry_p->te_data_size == 0) + *data_buf_p = NULL; + else { + if (table_p->ta_data_align == 0) + *data_buf_p = ENTRY_DATA_BUF(table_p, entry_p); + else + *data_buf_p = entry_data_buf(table_p, entry_p); + } + } + if (data_size_p != NULL) + *data_size_p = entry_p->te_data_size; + return TABLE_ERROR_NONE; +} + +/* + * int table_delete + * + * DESCRIPTION: + * + * This routine looks up a key made up of a buffer of bytes and an + * associated size in the table. If found then it will be removed + * from the table. The associated data can be passed back to the user + * if requested. + * + * RETURNS: + * + * Success - TABLE_ERROR_NONE + * + * Failure - Table error code. + * + * NOTE: this could be an allocation error if the library is to return + * the data to the user. + * + * ARGUMENTS: + * + * table_p - Table structure pointer from which we will be deleteing + * the key. + * + * key_buf - Buffer of bytes of the key that we are searching for to + * delete. If you are deleting an (int) key (for example) then + * key_buf should be a (int *). + * + * key_size - Size of the key_buf buffer. If set to < 0 then the + * library will do a strlen of key_buf and add 1 for the '\0'. If you + * are deleting an (int) key (for example) then key_size should be + * sizeof(int). + * + * data_buf_p - Pointer which, if not NULL, will be set to the address + * of the data storage that was allocated in the table and that was + * associated with the key. If a (long) was stored as the data (for + * example) then data_buf_p should be (long **) i.e. the address of a + * (long *). If a pointer is passed in, the caller is responsible for + * freeing it after use. If data_buf_p is NULL then the library will + * free up the data allocation itself. + * + * data_size_p - Pointer to an integer which, if not NULL, will be set + * to the size of the data that was stored in the table and that was + * associated with the key. + */ +int table_delete(table_t * table_p, + const void *key_buf, const int key_size, + void **data_buf_p, int *data_size_p) +{ + int bucket; + unsigned int ksize; + unsigned char *data_copy_p; + table_entry_t *entry_p, *last_p; + + if (table_p == NULL) + return TABLE_ERROR_ARG_NULL; + if (table_p->ta_magic != TABLE_MAGIC) + return TABLE_ERROR_PNT; + if (key_buf == NULL) + return TABLE_ERROR_ARG_NULL; + /* get the key size */ + if (key_size < 0) + ksize = strlen((char *) key_buf) + sizeof(char); + else + ksize = key_size; + /* find our bucket */ + bucket = hash(key_buf, ksize, 0) % table_p->ta_bucket_n; + + /* look for the entry in this bucket, only check keys of the same size */ + for (last_p = NULL, entry_p = table_p->ta_buckets[bucket]; entry_p != NULL; + last_p = entry_p, entry_p = entry_p->te_next_p) { + if (entry_p->te_key_size == ksize + && memcmp(ENTRY_KEY_BUF(entry_p), key_buf, ksize) == 0) + break; + } + + /* did we find it? */ + if (entry_p == NULL) + return TABLE_ERROR_NOT_FOUND; + /* + * NOTE: we may want to adjust the linear counters here if the entry + * we are deleting is the one we are pointing on or is ahead of the + * one in the bucket list + */ + + /* remove entry from the linked list */ + if (last_p == NULL) + table_p->ta_buckets[bucket] = entry_p->te_next_p; + else + last_p->te_next_p = entry_p->te_next_p; + /* free entry */ + if (data_buf_p != NULL) { + if (entry_p->te_data_size == 0) + *data_buf_p = NULL; + else { + /* + * if we were storing it compacted, we now need to malloc some + * space if the user wants the value after the delete. + */ + *data_buf_p = table_p->ta_malloc(table_p->opt_param, + entry_p->te_data_size); + if (*data_buf_p == NULL) + return TABLE_ERROR_ALLOC; + if (table_p->ta_data_align == 0) + data_copy_p = ENTRY_DATA_BUF(table_p, entry_p); + else + data_copy_p = entry_data_buf(table_p, entry_p); + memcpy(*data_buf_p, data_copy_p, entry_p->te_data_size); + } + } + if (data_size_p != NULL) + *data_size_p = entry_p->te_data_size; + table_p->ta_free(table_p->opt_param, entry_p); + entry_p = NULL; + + table_p->ta_entry_n--; + + /* do we need auto-adjust down? */ + if ((table_p->ta_flags & TABLE_FLAG_AUTO_ADJUST) + && (table_p->ta_flags & TABLE_FLAG_ADJUST_DOWN) + && SHOULD_TABLE_SHRINK(table_p)) + return table_adjust(table_p, table_p->ta_entry_n); + return TABLE_ERROR_NONE; +} + +/* + * int table_delete_first + * + * DESCRIPTION: + * + * This is like the table_delete routines except it deletes the first + * key/data pair in the table instead of an entry corresponding to a + * particular key. The associated key and data information can be + * passed back to the user if requested. This routines is handy to + * clear out a table. + * + * RETURNS: + * + * Success - TABLE_ERROR_NONE + * + * Failure - Table error code. + * + * NOTE: this could be an allocation error if the library is to return + * the data to the user. + * + * ARGUMENTS: + * + * table_p - Table structure pointer from which we will be deleteing + * the first key. + * + * key_buf_p - Pointer which, if not NULL, will be set to the address + * of the storage of the first key that was allocated in the table. + * If an (int) was stored as the first key (for example) then + * key_buf_p should be (int **) i.e. the address of a (int *). If a + * pointer is passed in, the caller is responsible for freeing it + * after use. If key_buf_p is NULL then the library will free up the + * key allocation itself. + * + * key_size_p - Pointer to an integer which, if not NULL, will be set + * to the size of the key that was stored in the table and that was + * associated with the key. + * + * data_buf_p - Pointer which, if not NULL, will be set to the address + * of the data storage that was allocated in the table and that was + * associated with the key. If a (long) was stored as the data (for + * example) then data_buf_p should be (long **) i.e. the address of a + * (long *). If a pointer is passed in, the caller is responsible for + * freeing it after use. If data_buf_p is NULL then the library will + * free up the data allocation itself. + * + * data_size_p - Pointer to an integer which, if not NULL, will be set + * to the size of the data that was stored in the table and that was + * associated with the key. + */ +int table_delete_first(table_t * table_p, + void **key_buf_p, int *key_size_p, + void **data_buf_p, int *data_size_p) +{ + unsigned char *data_copy_p; + table_entry_t *entry_p; + table_linear_t linear; + + if (table_p == NULL) + return TABLE_ERROR_ARG_NULL; + if (table_p->ta_magic != TABLE_MAGIC) + return TABLE_ERROR_PNT; + /* take the first entry */ + entry_p = first_entry(table_p, &linear); + if (entry_p == NULL) + return TABLE_ERROR_NOT_FOUND; + /* + * NOTE: we may want to adjust the linear counters here if the entry + * we are deleting is the one we are pointing on or is ahead of the + * one in the bucket list + */ + + /* remove entry from the linked list */ + table_p->ta_buckets[linear.tl_bucket_c] = entry_p->te_next_p; + + /* free entry */ + if (key_buf_p != NULL) { + if (entry_p->te_key_size == 0) + *key_buf_p = NULL; + else { + /* + * if we were storing it compacted, we now need to malloc some + * space if the user wants the value after the delete. + */ + *key_buf_p = table_p->ta_malloc(table_p->opt_param, + entry_p->te_key_size); + if (*key_buf_p == NULL) + return TABLE_ERROR_ALLOC; + memcpy(*key_buf_p, ENTRY_KEY_BUF(entry_p), entry_p->te_key_size); + } + } + if (key_size_p != NULL) + *key_size_p = entry_p->te_key_size; + if (data_buf_p != NULL) { + if (entry_p->te_data_size == 0) + *data_buf_p = NULL; + else { + /* + * if we were storing it compacted, we now need to malloc some + * space if the user wants the value after the delete. + */ + *data_buf_p = table_p->ta_malloc(table_p->opt_param, + entry_p->te_data_size); + if (*data_buf_p == NULL) + return TABLE_ERROR_ALLOC; + if (table_p->ta_data_align == 0) + data_copy_p = ENTRY_DATA_BUF(table_p, entry_p); + else + data_copy_p = entry_data_buf(table_p, entry_p); + memcpy(*data_buf_p, data_copy_p, entry_p->te_data_size); + } + } + if (data_size_p != NULL) + *data_size_p = entry_p->te_data_size; + table_p->ta_free(table_p->opt_param, entry_p); + + table_p->ta_entry_n--; + + /* do we need auto-adjust down? */ + if ((table_p->ta_flags & TABLE_FLAG_AUTO_ADJUST) + && (table_p->ta_flags & TABLE_FLAG_ADJUST_DOWN) + && SHOULD_TABLE_SHRINK(table_p)) + return table_adjust(table_p, table_p->ta_entry_n); + return TABLE_ERROR_NONE; +} + +/* + * int table_info + * + * DESCRIPTION: + * + * Get some information about a table_p structure. + * + * RETURNS: + * + * Success - TABLE_ERROR_NONE + * + * Failure - Table error code. + * + * ARGUMENTS: + * + * table_p - Table structure pointer from which we are getting + * information. + * + * num_buckets_p - Pointer to an integer which, if not NULL, will + * contain the number of buckets in the table. + * + * num_entries_p - Pointer to an integer which, if not NULL, will + * contain the number of entries stored in the table. + */ +int table_info(table_t * table_p, int *num_buckets_p, int *num_entries_p) +{ + if (table_p == NULL) + return TABLE_ERROR_ARG_NULL; + if (table_p->ta_magic != TABLE_MAGIC) + return TABLE_ERROR_PNT; + if (num_buckets_p != NULL) + *num_buckets_p = table_p->ta_bucket_n; + if (num_entries_p != NULL) + *num_entries_p = table_p->ta_entry_n; + return TABLE_ERROR_NONE; +} + +/* + * int table_adjust + * + * DESCRIPTION: + * + * Set the number of buckets in a table to a certain value. + * + * RETURNS: + * + * Success - TABLE_ERROR_NONE + * + * Failure - Table error code. + * + * ARGUMENTS: + * + * table_p - Table structure pointer of which we are adjusting. + * + * bucket_n - Number buckets to adjust the table to. Set to 0 to + * adjust the table to its number of entries. + */ +int table_adjust(table_t * table_p, const int bucket_n) +{ + table_entry_t *entry_p, *next_p; + table_entry_t **buckets, **bucket_p, **bounds_p; + int bucket; + unsigned int buck_n; + + if (table_p == NULL) + return TABLE_ERROR_ARG_NULL; + if (table_p->ta_magic != TABLE_MAGIC) + return TABLE_ERROR_PNT; + /* + * NOTE: we walk through the entries and rehash them. If we stored + * the hash value as a full int in the table-entry, all we would + * have to do is remod it. + */ + + /* normalize to the number of entries */ + if (bucket_n == 0) + buck_n = table_p->ta_entry_n; + else + buck_n = bucket_n; + /* we must have at least 1 bucket */ + if (buck_n == 0) + buck_n = 1; + /* make sure we have somethign to do */ + if (buck_n <= table_p->ta_bucket_n) + return TABLE_ERROR_NONE; + /* allocate a new bucket list */ + buckets = (table_entry_t **) + table_p->ta_calloc(table_p->opt_param, + buck_n, sizeof(table_entry_t *)); + if (table_p->ta_buckets == NULL) + return TABLE_ERROR_ALLOC; + /* + * run through each of the items in the current table and rehash + * them into the newest bucket sizes + */ + bounds_p = table_p->ta_buckets + table_p->ta_bucket_n; + for (bucket_p = table_p->ta_buckets; bucket_p < bounds_p; bucket_p++) { + for (entry_p = *bucket_p; entry_p != NULL; entry_p = next_p) { + + /* hash the old data into the new table size */ + bucket = hash(ENTRY_KEY_BUF(entry_p), entry_p->te_key_size, 0) % buck_n; + + /* record the next one now since we overwrite next below */ + next_p = entry_p->te_next_p; + + /* insert into new list, no need to append */ + entry_p->te_next_p = buckets[bucket]; + buckets[bucket] = entry_p; + + /* + * NOTE: we may want to adjust the bucket_c linear entry here to + * keep it current + */ + } + /* remove the old table pointers as we go by */ + *bucket_p = NULL; + } + + /* replace the table buckets with the new ones */ + table_p->ta_free(table_p->opt_param, table_p->ta_buckets); + table_p->ta_buckets = buckets; + table_p->ta_bucket_n = buck_n; + + return TABLE_ERROR_NONE; +} + +/* + * const char *table_strerror + * + * DESCRIPTION: + * + * Return the corresponding string for the error number. + * + * RETURNS: + * + * Success - String equivalient of the error. + * + * Failure - String "invalid error code" + * + * ARGUMENTS: + * + * error - Error number that we are converting. + */ +const char *table_strerror(const int error) +{ + error_str_t *err_p; + + for (err_p = errors; err_p->es_error != 0; err_p++) { + if (err_p->es_error == error) + return err_p->es_string; + } + + return INVALID_ERROR; +} + +/* + * int table_type_size + * + * DESCRIPTION: + * + * Return the size of the internal table type. + * + * RETURNS: + * + * The size of the table_t type. + * + * ARGUMENTS: + * + * None. + */ +int table_type_size(void) +{ + return sizeof(table_t); +} + +/************************* linear access routines ****************************/ + +/* + * int table_first + * + * DESCRIPTION: + * + * Find first element in a table and pass back information about the + * key/data pair. If any of the key/data pointers are NULL then they + * are ignored. + * + * NOTE: This function is not reentrant. More than one thread cannot + * be doing a first and next on the same table at the same time. Use + * the table_first_r version below for this. + * + * RETURNS: + * + * Success - TABLE_ERROR_NONE + * + * Failure - Table error code. + * + * ARGUMENTS: + * + * table_p - Table structure pointer from which we are getting the + * first element. + * + * key_buf_p - Pointer which, if not NULL, will be set to the address + * of the storage of the first key that is allocated in the table. If + * an (int) is stored as the first key (for example) then key_buf_p + * should be (int **) i.e. the address of a (int *). + * + * key_size_p - Pointer to an integer which, if not NULL, will be set + * to the size of the key that is stored in the table and that is + * associated with the first key. + * + * data_buf_p - Pointer which, if not NULL, will be set to the address + * of the data storage that is allocated in the table and that is + * associated with the first key. If a (long) is stored as the data + * (for example) then data_buf_p should be (long **) i.e. the address + * of a (long *). + * + * data_size_p - Pointer to an integer which, if not NULL, will be set + * to the size of the data that is stored in the table and that is + * associated with the first key. + */ +int table_first(table_t * table_p, + void **key_buf_p, int *key_size_p, + void **data_buf_p, int *data_size_p) +{ + table_entry_t *entry_p; + + if (table_p == NULL) + return TABLE_ERROR_ARG_NULL; + if (table_p->ta_magic != TABLE_MAGIC) + return TABLE_ERROR_PNT; + /* initialize our linear magic number */ + table_p->ta_linear.tl_magic = LINEAR_MAGIC; + + entry_p = first_entry(table_p, &table_p->ta_linear); + if (entry_p == NULL) + return TABLE_ERROR_NOT_FOUND; + if (key_buf_p != NULL) + *key_buf_p = ENTRY_KEY_BUF(entry_p); + if (key_size_p != NULL) + *key_size_p = entry_p->te_key_size; + if (data_buf_p != NULL) { + if (entry_p->te_data_size == 0) + *data_buf_p = NULL; + else { + if (table_p->ta_data_align == 0) + *data_buf_p = ENTRY_DATA_BUF(table_p, entry_p); + else + *data_buf_p = entry_data_buf(table_p, entry_p); + } + } + if (data_size_p != NULL) + *data_size_p = entry_p->te_data_size; + return TABLE_ERROR_NONE; +} + +/* + * int table_next + * + * DESCRIPTION: + * + * Find the next element in a table and pass back information about + * the key/data pair. If any of the key/data pointers are NULL then + * they are ignored. + * + * NOTE: This function is not reentrant. More than one thread cannot + * be doing a first and next on the same table at the same time. Use + * the table_next_r version below for this. + * + * RETURNS: + * + * Success - TABLE_ERROR_NONE + * + * Failure - Table error code. + * + * ARGUMENTS: + * + * table_p - Table structure pointer from which we are getting the + * next element. + * + * key_buf_p - Pointer which, if not NULL, will be set to the address + * of the storage of the next key that is allocated in the table. If + * an (int) is stored as the next key (for example) then key_buf_p + * should be (int **) i.e. the address of a (int *). + * + * key_size_p - Pointer to an integer which, if not NULL, will be set + * to the size of the key that is stored in the table and that is + * associated with the next key. + * + * data_buf_p - Pointer which, if not NULL, will be set to the address + * of the data storage that is allocated in the table and that is + * associated with the next key. If a (long) is stored as the data + * (for example) then data_buf_p should be (long **) i.e. the address + * of a (long *). + * + * data_size_p - Pointer to an integer which, if not NULL, will be set + * to the size of the data that is stored in the table and that is + * associated with the next key. + */ +int table_next(table_t * table_p, + void **key_buf_p, int *key_size_p, + void **data_buf_p, int *data_size_p) +{ + table_entry_t *entry_p; + int error; + + if (table_p == NULL) + return TABLE_ERROR_ARG_NULL; + if (table_p->ta_magic != TABLE_MAGIC) + return TABLE_ERROR_PNT; + if (table_p->ta_linear.tl_magic != LINEAR_MAGIC) + return TABLE_ERROR_LINEAR; + /* move to the next entry */ + entry_p = next_entry(table_p, &table_p->ta_linear, &error); + if (entry_p == NULL) + return error; + if (key_buf_p != NULL) + *key_buf_p = ENTRY_KEY_BUF(entry_p); + if (key_size_p != NULL) + *key_size_p = entry_p->te_key_size; + if (data_buf_p != NULL) { + if (entry_p->te_data_size == 0) + *data_buf_p = NULL; + else { + if (table_p->ta_data_align == 0) + *data_buf_p = ENTRY_DATA_BUF(table_p, entry_p); + else + *data_buf_p = entry_data_buf(table_p, entry_p); + } + } + if (data_size_p != NULL) + *data_size_p = entry_p->te_data_size; + return TABLE_ERROR_NONE; +} + +/* + * int table_this + * + * DESCRIPTION: + * + * Find the current element in a table and pass back information about + * the key/data pair. If any of the key/data pointers are NULL then + * they are ignored. + * + * NOTE: This function is not reentrant. Use the table_current_r + * version below. + * + * RETURNS: + * + * Success - TABLE_ERROR_NONE + * + * Failure - Table error code. + * + * ARGUMENTS: + * + * table_p - Table structure pointer from which we are getting the + * current element. + * + * key_buf_p - Pointer which, if not NULL, will be set to the address + * of the storage of the current key that is allocated in the table. + * If an (int) is stored as the current key (for example) then + * key_buf_p should be (int **) i.e. the address of a (int *). + * + * key_size_p - Pointer to an integer which, if not NULL, will be set + * to the size of the key that is stored in the table and that is + * associated with the current key. + * + * data_buf_p - Pointer which, if not NULL, will be set to the address + * of the data storage that is allocated in the table and that is + * associated with the current key. If a (long) is stored as the data + * (for example) then data_buf_p should be (long **) i.e. the address + * of a (long *). + * + * data_size_p - Pointer to an integer which, if not NULL, will be set + * to the size of the data that is stored in the table and that is + * associated with the current key. + */ +int table_this(table_t * table_p, + void **key_buf_p, int *key_size_p, + void **data_buf_p, int *data_size_p) +{ + table_entry_t *entry_p = NULL; + int entry_c; + + if (table_p == NULL) + return TABLE_ERROR_ARG_NULL; + if (table_p->ta_magic != TABLE_MAGIC) + return TABLE_ERROR_PNT; + if (table_p->ta_linear.tl_magic != LINEAR_MAGIC) + return TABLE_ERROR_LINEAR; + /* if we removed an item that shorted the bucket list, we may get this */ + if (table_p->ta_linear.tl_bucket_c >= table_p->ta_bucket_n) { + /* + * NOTE: this might happen if we delete an item which shortens the + * table bucket numbers. + */ + return TABLE_ERROR_NOT_FOUND; + } + + /* find the entry which is the nth in the list */ + entry_p = table_p->ta_buckets[table_p->ta_linear.tl_bucket_c]; + /* NOTE: we swap the order here to be more efficient */ + for (entry_c = table_p->ta_linear.tl_entry_c; entry_c > 0; entry_c--) { + /* did we reach the end of the list? */ + if (entry_p == NULL) + break; + entry_p = TABLE_POINTER(table_p, table_entry_t *, entry_p)->te_next_p; + } + + /* is this a NOT_FOUND or a LINEAR error */ + if (entry_p == NULL) + return TABLE_ERROR_NOT_FOUND; + if (key_buf_p != NULL) + *key_buf_p = ENTRY_KEY_BUF(entry_p); + if (key_size_p != NULL) + *key_size_p = entry_p->te_key_size; + if (data_buf_p != NULL) { + if (entry_p->te_data_size == 0) + *data_buf_p = NULL; + else { + if (table_p->ta_data_align == 0) + *data_buf_p = ENTRY_DATA_BUF(table_p, entry_p); + else + *data_buf_p = entry_data_buf(table_p, entry_p); + } + } + if (data_size_p != NULL) + *data_size_p = entry_p->te_data_size; + return TABLE_ERROR_NONE; +} + +/* + * int table_first_r + * + * DESCRIPTION: + * + * Reetrant version of the table_first routine above. Find first + * element in a table and pass back information about the key/data + * pair. If any of the key/data pointers are NULL then they are + * ignored. + * + * RETURNS: + * + * Success - TABLE_ERROR_NONE + * + * Failure - Table error code. + * + * ARGUMENTS: + * + * table_p - Table structure pointer from which we are getting the + * first element. + * + * linear_p - Pointer to a table linear structure which is initialized + * here. The same pointer should then be passed to table_next_r + * below. + * + * key_buf_p - Pointer which, if not NULL, will be set to the address + * of the storage of the first key that is allocated in the table. If + * an (int) is stored as the first key (for example) then key_buf_p + * should be (int **) i.e. the address of a (int *). + * + * key_size_p - Pointer to an integer which, if not NULL, will be set + * to the size of the key that is stored in the table and that is + * associated with the first key. + * + * data_buf_p - Pointer which, if not NULL, will be set to the address + * of the data storage that is allocated in the table and that is + * associated with the first key. If a (long) is stored as the data + * (for example) then data_buf_p should be (long **) i.e. the address + * of a (long *). + * + * data_size_p - Pointer to an integer which, if not NULL, will be set + * to the size of the data that is stored in the table and that is + * associated with the first key. + */ +int table_first_r(table_t * table_p, table_linear_t * linear_p, + void **key_buf_p, int *key_size_p, + void **data_buf_p, int *data_size_p) +{ + table_entry_t *entry_p; + + if (table_p == NULL) + return TABLE_ERROR_ARG_NULL; + if (table_p->ta_magic != TABLE_MAGIC) + return TABLE_ERROR_PNT; + if (linear_p == NULL) + return TABLE_ERROR_ARG_NULL; + /* initialize our linear magic number */ + linear_p->tl_magic = LINEAR_MAGIC; + + entry_p = first_entry(table_p, linear_p); + if (entry_p == NULL) + return TABLE_ERROR_NOT_FOUND; + if (key_buf_p != NULL) + *key_buf_p = ENTRY_KEY_BUF(entry_p); + if (key_size_p != NULL) + *key_size_p = entry_p->te_key_size; + if (data_buf_p != NULL) { + if (entry_p->te_data_size == 0) + *data_buf_p = NULL; + else { + if (table_p->ta_data_align == 0) + *data_buf_p = ENTRY_DATA_BUF(table_p, entry_p); + else + *data_buf_p = entry_data_buf(table_p, entry_p); + } + } + if (data_size_p != NULL) + *data_size_p = entry_p->te_data_size; + return TABLE_ERROR_NONE; +} + +/* + * int table_next_r + * + * DESCRIPTION: + * + * Reetrant version of the table_next routine above. Find next + * element in a table and pass back information about the key/data + * pair. If any of the key/data pointers are NULL then they are + * ignored. + * + * RETURNS: + * + * Success - TABLE_ERROR_NONE + * + * Failure - Table error code. + * + * ARGUMENTS: + * + * table_p - Table structure pointer from which we are getting the + * next element. + * + * linear_p - Pointer to a table linear structure which is incremented + * here. The same pointer must have been passed to table_first_r + * first so that it can be initialized. + * + * key_buf_p - Pointer which, if not NULL, will be set to the address + * of the storage of the next key that is allocated in the table. If + * an (int) is stored as the next key (for example) then key_buf_p + * should be (int **) i.e. the address of a (int *). + * + * key_size_p - Pointer to an integer which, if not NULL will be set + * to the size of the key that is stored in the table and that is + * associated with the next key. + * + * data_buf_p - Pointer which, if not NULL, will be set to the address + * of the data storage that is allocated in the table and that is + * associated with the next key. If a (long) is stored as the data + * (for example) then data_buf_p should be (long **) i.e. the address + * of a (long *). + * + * data_size_p - Pointer to an integer which, if not NULL, will be set + * to the size of the data that is stored in the table and that is + * associated with the next key. + */ +int table_next_r(table_t * table_p, table_linear_t * linear_p, + void **key_buf_p, int *key_size_p, + void **data_buf_p, int *data_size_p) +{ + table_entry_t *entry_p; + int error; + + if (table_p == NULL) + return TABLE_ERROR_ARG_NULL; + if (table_p->ta_magic != TABLE_MAGIC) + return TABLE_ERROR_PNT; + if (linear_p == NULL) + return TABLE_ERROR_ARG_NULL; + if (linear_p->tl_magic != LINEAR_MAGIC) + return TABLE_ERROR_LINEAR; + /* move to the next entry */ + entry_p = next_entry(table_p, linear_p, &error); + if (entry_p == NULL) + return error; + if (key_buf_p != NULL) + *key_buf_p = ENTRY_KEY_BUF(entry_p); + if (key_size_p != NULL) + *key_size_p = entry_p->te_key_size; + if (data_buf_p != NULL) { + if (entry_p->te_data_size == 0) + *data_buf_p = NULL; + else { + if (table_p->ta_data_align == 0) + *data_buf_p = ENTRY_DATA_BUF(table_p, entry_p); + else + *data_buf_p = entry_data_buf(table_p, entry_p); + } + } + if (data_size_p != NULL) + *data_size_p = entry_p->te_data_size; + return TABLE_ERROR_NONE; +} + +/* + * int table_this_r + * + * DESCRIPTION: + * + * Reetrant version of the table_this routine above. Find current + * element in a table and pass back information about the key/data + * pair. If any of the key/data pointers are NULL then they are + * ignored. + * + * RETURNS: + * + * Success - TABLE_ERROR_NONE + * + * Failure - Table error code. + * + * ARGUMENTS: + * + * table_p - Table structure pointer from which we are getting the + * current element. + * + * linear_p - Pointer to a table linear structure which is accessed + * here. The same pointer must have been passed to table_first_r + * first so that it can be initialized. + * + * key_buf_p - Pointer which, if not NULL, will be set to the address + * of the storage of the current key that is allocated in the table. + * If an (int) is stored as the current key (for example) then + * key_buf_p should be (int **) i.e. the address of a (int *). + * + * key_size_p - Pointer to an integer which, if not NULL, will be set + * to the size of the key that is stored in the table and that is + * associated with the current key. + * + * data_buf_p - Pointer which, if not NULL, will be set to the address + * of the data storage that is allocated in the table and that is + * associated with the current key. If a (long) is stored as the data + * (for example) then data_buf_p should be (long **) i.e. the address + * of a (long *). + * + * data_size_p - Pointer to an integer which, if not NULL, will be set + * to the size of the data that is stored in the table and that is + * associated with the current key. + */ +int table_this_r(table_t * table_p, table_linear_t * linear_p, + void **key_buf_p, int *key_size_p, + void **data_buf_p, int *data_size_p) +{ + table_entry_t *entry_p; + int entry_c; + + if (table_p == NULL) + return TABLE_ERROR_ARG_NULL; + if (table_p->ta_magic != TABLE_MAGIC) + return TABLE_ERROR_PNT; + if (linear_p->tl_magic != LINEAR_MAGIC) + return TABLE_ERROR_LINEAR; + /* if we removed an item that shorted the bucket list, we may get this */ + if (linear_p->tl_bucket_c >= table_p->ta_bucket_n) { + /* + * NOTE: this might happen if we delete an item which shortens the + * table bucket numbers. + */ + return TABLE_ERROR_NOT_FOUND; + } + + /* find the entry which is the nth in the list */ + for (entry_c = linear_p->tl_entry_c, + entry_p = table_p->ta_buckets[linear_p->tl_bucket_c]; + entry_p != NULL && entry_c > 0; + entry_c--, entry_p = TABLE_POINTER(table_p, table_entry_t *, + entry_p)->te_next_p) { + } + + if (entry_p == NULL) + return TABLE_ERROR_NOT_FOUND; + if (key_buf_p != NULL) + *key_buf_p = ENTRY_KEY_BUF(entry_p); + if (key_size_p != NULL) + *key_size_p = entry_p->te_key_size; + if (data_buf_p != NULL) { + if (entry_p->te_data_size == 0) + *data_buf_p = NULL; + else { + if (table_p->ta_data_align == 0) + *data_buf_p = ENTRY_DATA_BUF(table_p, entry_p); + else + *data_buf_p = entry_data_buf(table_p, entry_p); + } + } + if (data_size_p != NULL) + *data_size_p = entry_p->te_data_size; + return TABLE_ERROR_NONE; +} + +/******************************** table order ********************************/ + +/* + * table_entry_t *table_order + * + * DESCRIPTION: + * + * Order a table by building an array of table entry pointers and then + * sorting this array using the qsort function. To retrieve the + * sorted entries, you can then use the table_entry routine to access + * each entry in order. + * + * NOTE: This routine is now thread safe in that two table_order calls + * can now happen at the same time, even on the same table. + * + * RETURNS: + * + * An allocated list of entry pointers which must be freed later. + * Returns null on error. + * + * ARGUMENTS: + * + * table_p - Pointer to the table that we are ordering. + * + * compare - Comparison function defined by the user. Its definition + * is at the top of the table.h file. If this is NULL then it will + * order the table my memcmp-ing the keys. + * + * num_entries_p - Pointer to an integer which, if not NULL, will + * contain the number of entries in the returned entry pointer array. + * + * error_p - Pointer to an integer which, if not NULL, will contain a + * table error code. + */ +table_entry_t **table_order(table_t * table_p, table_compare_t compare, + int *num_entries_p, int *error_p) +{ + table_entry_t *entry_p, **entries, **entries_p; + table_linear_t linear; + compare_t comp_func; + int error; + + if (table_p == NULL) { + if (error_p != NULL) + *error_p = TABLE_ERROR_ARG_NULL; + return NULL; + } + if (table_p->ta_magic != TABLE_MAGIC) { + if (error_p != NULL) + *error_p = TABLE_ERROR_PNT; + return NULL; + } + + /* there must be at least 1 element in the table for this to work */ + if (table_p->ta_entry_n == 0) { + if (error_p != NULL) + *error_p = TABLE_ERROR_EMPTY; + return NULL; + } + + entries = (table_entry_t **) + table_p->ta_malloc(table_p->opt_param, + table_p->ta_entry_n *sizeof(table_entry_t *)); + if (entries == NULL) { + if (error_p != NULL) + *error_p = TABLE_ERROR_ALLOC; + return NULL; + } + + /* get a pointer to all entries */ + entry_p = first_entry(table_p, &linear); + if (entry_p == NULL) { + if (error_p != NULL) + *error_p = TABLE_ERROR_NOT_FOUND; + return NULL; + } + + /* add all of the entries to the array */ + for (entries_p = entries; + entry_p != NULL; + entry_p = next_entry(table_p, &linear, &error)) + *entries_p++ = entry_p; + if (error != TABLE_ERROR_NOT_FOUND) { + if (error_p != NULL) + *error_p = error; + return NULL; + } + + if (compare == NULL) { + /* this is regardless of the alignment */ + comp_func = local_compare; + } + else if (table_p->ta_data_align == 0) + comp_func = external_compare; + else + comp_func = external_compare_align; + /* now qsort the entire entries array from first to last element */ + split(entries, entries + table_p->ta_entry_n - 1, comp_func, compare, + table_p); + + if (num_entries_p != NULL) + *num_entries_p = table_p->ta_entry_n; + if (error_p != NULL) + *error_p = TABLE_ERROR_NONE; + return entries; +} + +/* + * int table_entry + * + * DESCRIPTION: + * + * Get information about an element. The element is one from the + * array returned by the table_order function. If any of the key/data + * pointers are NULL then they are ignored. + * + * RETURNS: + * + * Success - TABLE_ERROR_NONE + * + * Failure - Table error code. + * + * ARGUMENTS: + * + * table_p - Table structure pointer from which we are getting the + * element. + * + * entry_p - Pointer to a table entry from the array returned by the + * table_order function. + * + * key_buf_p - Pointer which, if not NULL, will be set to the address + * of the storage of this entry that is allocated in the table. If an + * (int) is stored as this entry (for example) then key_buf_p should + * be (int **) i.e. the address of a (int *). + * + * key_size_p - Pointer to an integer which, if not NULL, will be set + * to the size of the key that is stored in the table. + * + * data_buf_p - Pointer which, if not NULL, will be set to the address + * of the data storage of this entry that is allocated in the table. + * If a (long) is stored as this entry data (for example) then + * data_buf_p should be (long **) i.e. the address of a (long *). + * + * data_size_p - Pointer to an integer which, if not NULL, will be set + * to the size of the data that is stored in the table. + */ +int table_entry_info(table_t * table_p, table_entry_t * entry_p, + void **key_buf_p, int *key_size_p, + void **data_buf_p, int *data_size_p) +{ + if (table_p == NULL) + return TABLE_ERROR_ARG_NULL; + if (table_p->ta_magic != TABLE_MAGIC) + return TABLE_ERROR_PNT; + if (entry_p == NULL) + return TABLE_ERROR_ARG_NULL; + if (key_buf_p != NULL) + *key_buf_p = ENTRY_KEY_BUF(entry_p); + if (key_size_p != NULL) + *key_size_p = entry_p->te_key_size; + if (data_buf_p != NULL) { + if (entry_p->te_data_size == 0) + *data_buf_p = NULL; + else { + if (table_p->ta_data_align == 0) + *data_buf_p = ENTRY_DATA_BUF(table_p, entry_p); + else + *data_buf_p = entry_data_buf(table_p, entry_p); + } + } + if (data_size_p != NULL) + *data_size_p = entry_p->te_data_size; + return TABLE_ERROR_NONE; +} + diff --git a/rubbos/app/httpd-2.0.64/modules/ssl/ssl_util_table.h b/rubbos/app/httpd-2.0.64/modules/ssl/ssl_util_table.h new file mode 100644 index 00000000..33438b2f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/ssl/ssl_util_table.h @@ -0,0 +1,152 @@ +/* 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. + */ + +/* _ _ + * _ __ ___ ___ __| | ___ ___| | mod_ssl + * | '_ ` _ \ / _ \ / _` | / __/ __| | Apache Interface to OpenSSL + * | | | | | | (_) | (_| | \__ \__ \ | + * |_| |_| |_|\___/ \__,_|___|___/___/_| + * |_____| + * ssl_util_table.h + * High Performance Hash Table Header + */ + +/* + * Generic hash table defines + * Table 4.1.0 July-28-1998 + * + * This library is a generic open hash table with buckets and + * linked lists. It is pretty high performance. Each element + * has a key and a data. The user indexes on the key to find the + * data. + * + * Copyright 1998 by Gray Watson + * + * Permission to use, copy, modify, and distribute this software 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 Gray Watson not be used in advertising or + * publicity pertaining to distribution of the document or software + * without specific, written prior permission. + * + * Gray Watson makes no representations about the suitability of the + * software described herein for any purpose. It is provided "as is" + * without express or implied warranty. + */ + +#ifndef __SSL_UTIL_TABLE_H__ +#define __SSL_UTIL_TABLE_H__ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/* + * To build a "key" in any of the below routines, pass in a pointer to + * the key and its size [i.e. sizeof(int), etc]. With any of the + * "key" or "data" arguments, if their size is < 0, it will do an + * internal strlen of the item and add 1 for the \0. + * + * If you are using firstkey() and nextkey() functions, be careful if, + * after starting your firstkey loop, you use delete or insert, it + * will not crash but may produce interesting results. If you are + * deleting from firstkey to NULL it will work fine. + */ + +/* return types for table functions */ +#define TABLE_ERROR_NONE 1 /* no error from function */ +#define TABLE_ERROR_PNT 2 /* bad table pointer */ +#define TABLE_ERROR_ARG_NULL 3 /* buffer args were null */ +#define TABLE_ERROR_SIZE 4 /* size of data was bad */ +#define TABLE_ERROR_OVERWRITE 5 /* key exists and we cant overwrite */ +#define TABLE_ERROR_NOT_FOUND 6 /* key does not exist */ +#define TABLE_ERROR_ALLOC 7 /* memory allocation error */ +#define TABLE_ERROR_LINEAR 8 /* no linear access started */ +#define TABLE_ERROR_OPEN 9 /* could not open file */ +#define TABLE_ERROR_SEEK 10 /* could not seek to pos in file */ +#define TABLE_ERROR_READ 11 /* could not read from file */ +#define TABLE_ERROR_WRITE 12 /* could not write to file */ +#define TABLE_ERROR_EMPTY 13 /* table is empty */ +#define TABLE_ERROR_NOT_EMPTY 14 /* table contains data */ +#define TABLE_ERROR_ALIGNMENT 15 /* invalid alignment value */ + +/* + * Table flags set with table_attr. + */ + +/* + * Automatically adjust the number of table buckets on the fly. + * Whenever the number of entries gets above some threshold, the + * number of buckets is realloced to a new size and each entry is + * re-hashed. Although this may take some time when it re-hashes, the + * table will perform better over time. + */ +#define TABLE_FLAG_AUTO_ADJUST (1<<0) + +/* + * If the above auto-adjust flag is set, also adjust the number of + * table buckets down as we delete entries. + */ +#define TABLE_FLAG_ADJUST_DOWN (1<<1) + +/* structure to walk through the fields in a linear order */ +typedef struct { + unsigned int tl_magic; /* magic structure to ensure correct init */ + unsigned int tl_bucket_c; /* where in the table buck array we are */ + unsigned int tl_entry_c; /* in the bucket, which entry we are on */ +} table_linear_t; + +typedef int (*table_compare_t)(const void *key1, const int key1_size, + const void *data1, const int data1_size, + const void *key2, const int key2_size, + const void *data2, const int data2_size); + +#ifndef TABLE_PRIVATE +typedef void table_t; +typedef void table_entry_t; +#endif + +/* + * Prototypes + */ +extern table_t *table_alloc(const unsigned int bucket_n, int *error_p, void *(*malloc_f)(void *opt_param, size_t size), void *(*calloc_f)(void *opt_param, size_t number, size_t size), void *(*realloc_f)(void *opt_param, void *ptr, size_t size), void (*free_f)(void *opt_param, void *ptr), void *opt_param); +extern int table_attr(table_t *table_p, const int attr); +extern int table_set_data_alignment(table_t *table_p, const int alignment); +extern int table_clear(table_t *table_p); +extern int table_free(table_t *table_p); +extern int table_insert_kd(table_t *table_p, const void *key_buf, const int key_size, const void *data_buf, const int data_size, void **key_buf_p, void **data_buf_p, const char overwrite_b); +extern int table_insert(table_t *table_p, const void *key_buf, const int key_size, const void *data_buf, const int data_size, void **data_buf_p, const char overwrite_b); +extern int table_retrieve(table_t *table_p, const void *key_buf, const int key_size, void **data_buf_p, int *data_size_p); +extern int table_delete(table_t *table_p, const void *key_buf, const int key_size, void **data_buf_p, int *data_size_p); +extern int table_delete_first(table_t *table_p, void **key_buf_p, int *key_size_p, void **data_buf_p, int *data_size_p); +extern int table_info(table_t *table_p, int *num_buckets_p, int *num_entries_p); +extern int table_adjust(table_t *table_p, const int bucket_n); +extern const char *table_strerror(const int error); +extern int table_type_size(void); +extern int table_first(table_t *table_p, void **key_buf_p, int *key_size_p, void **data_buf_p, int *data_size_p); +extern int table_next(table_t *table_p, void **key_buf_p, int *key_size_p, void **data_buf_p, int *data_size_p); +extern int table_this(table_t *table_p, void **key_buf_p, int *key_size_p, void **data_buf_p, int *data_size_p); +extern int table_first_r(table_t *table_p, table_linear_t *linear_p, void **key_buf_p, int *key_size_p, void **data_buf_p, int *data_size_p); +extern int table_next_r(table_t *table_p, table_linear_t *linear_p, void **key_buf_p, int *key_size_p, void **data_buf_p, int *data_size_p); +extern int table_this_r(table_t *table_p, table_linear_t *linear_p, void **key_buf_p, int *key_size_p, void **data_buf_p, int *data_size_p); +extern table_entry_t **table_order(table_t *table_p, table_compare_t compare, int *num_entries_p, int *error_p); +extern int table_entry_info(table_t *table_p, table_entry_t *entry_p, void **key_buf_p, int *key_size_p, void **data_buf_p, int *data_size_p); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __SSL_UTIL_TABLE_H__ */ diff --git a/rubbos/app/httpd-2.0.64/modules/test/.deps b/rubbos/app/httpd-2.0.64/modules/test/.deps new file mode 100644 index 00000000..e69de29b diff --git a/rubbos/app/httpd-2.0.64/modules/test/.indent.pro b/rubbos/app/httpd-2.0.64/modules/test/.indent.pro new file mode 100644 index 00000000..a9fbe9f9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/test/.indent.pro @@ -0,0 +1,54 @@ +-i4 -npsl -di0 -br -nce -d0 -cli0 -npcs -nfc1 +-TBUFF +-TFILE +-TTRANS +-TUINT4 +-T_trans +-Tallow_options_t +-Tapache_sfio +-Tarray_header +-Tbool_int +-Tbuf_area +-Tbuff_struct +-Tbuffy +-Tcmd_how +-Tcmd_parms +-Tcommand_rec +-Tcommand_struct +-Tconn_rec +-Tcore_dir_config +-Tcore_server_config +-Tdir_maker_func +-Tevent +-Tglobals_s +-Thandler_func +-Thandler_rec +-Tjoblist_s +-Tlisten_rec +-Tmerger_func +-Tmode_t +-Tmodule +-Tmodule_struct +-Tmutex +-Tn_long +-Tother_child_rec +-Toverrides_t +-Tparent_score +-Tpid_t +-Tpiped_log +-Tpool +-Trequest_rec +-Trequire_line +-Trlim_t +-Tscoreboard +-Tsemaphore +-Tserver_addr_rec +-Tserver_rec +-Tserver_rec_chain +-Tshort_score +-Ttable +-Ttable_entry +-Tthread +-Tu_wide_int +-Tvtime_t +-Twide_int diff --git a/rubbos/app/httpd-2.0.64/modules/test/Makefile b/rubbos/app/httpd-2.0.64/modules/test/Makefile new file mode 100644 index 00000000..e5fdd0f2 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/test/Makefile @@ -0,0 +1,8 @@ +top_srcdir = /bottlenecks/rubbos/app/httpd-2.0.64 +top_builddir = /bottlenecks/rubbos/app/httpd-2.0.64 +srcdir = /bottlenecks/rubbos/app/httpd-2.0.64/modules/test +builddir = /bottlenecks/rubbos/app/httpd-2.0.64/modules/test +VPATH = /bottlenecks/rubbos/app/httpd-2.0.64/modules/test +# a modules Makefile has no explicit targets -- they will be defined by +# whatever modules are enabled. just grab special.mk to deal with this. +include $(top_srcdir)/build/special.mk diff --git a/rubbos/app/httpd-2.0.64/modules/test/Makefile.in b/rubbos/app/httpd-2.0.64/modules/test/Makefile.in new file mode 100644 index 00000000..7c5c149d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/test/Makefile.in @@ -0,0 +1,3 @@ +# a modules Makefile has no explicit targets -- they will be defined by +# whatever modules are enabled. just grab special.mk to deal with this. +include $(top_srcdir)/build/special.mk diff --git a/rubbos/app/httpd-2.0.64/modules/test/README b/rubbos/app/httpd-2.0.64/modules/test/README new file mode 100644 index 00000000..f122368a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/test/README @@ -0,0 +1 @@ +test modules have moved to httpd-test/perl-framework/c-modules diff --git a/rubbos/app/httpd-2.0.64/modules/test/config.m4 b/rubbos/app/httpd-2.0.64/modules/test/config.m4 new file mode 100644 index 00000000..337d0957 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/test/config.m4 @@ -0,0 +1,10 @@ + +APACHE_MODPATH_INIT(test) + +APACHE_MODULE(optional_hook_export, example optional hook exporter, , , no) +APACHE_MODULE(optional_hook_import, example optional hook importer, , , no) +APACHE_MODULE(optional_fn_import, example optional function importer, , , no) +APACHE_MODULE(optional_fn_export, example optional function exporter, , , no) +APACHE_MODULE(bucketeer, buckets manipulation filter, , , no) + +APACHE_MODPATH_FINISH diff --git a/rubbos/app/httpd-2.0.64/modules/test/mod_bucketeer.c b/rubbos/app/httpd-2.0.64/modules/test/mod_bucketeer.c new file mode 100644 index 00000000..ec8436b0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/test/mod_bucketeer.c @@ -0,0 +1,181 @@ +/* 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. + */ + +/* + * mod_bucketeer.c: split buckets whenever we find a control-char + * + * Written by Ian Holsman + * + */ + +#include "httpd.h" +#include "http_config.h" +#include "http_log.h" +#include "apr_strings.h" +#include "apr_general.h" +#include "util_filter.h" +#include "apr_buckets.h" +#include "http_request.h" +#include "http_protocol.h" + +static const char bucketeerFilterName[] = "BUCKETEER"; +module AP_MODULE_DECLARE_DATA bucketeer_module; + +typedef struct bucketeer_filter_config_t +{ + char bucketdelimiter; + char passdelimiter; + char flushdelimiter; +} bucketeer_filter_config_t; + + +static void *create_bucketeer_server_config(apr_pool_t *p, server_rec *s) +{ + bucketeer_filter_config_t *c = apr_pcalloc(p, sizeof *c); + + c->bucketdelimiter = 0x02; /* ^B */ + c->passdelimiter = 0x10; /* ^P */ + c->flushdelimiter = 0x06; /* ^F */ + + return c; +} + +typedef struct bucketeer_ctx_t +{ + apr_bucket_brigade *bb; +} bucketeer_ctx_t; + +static apr_status_t bucketeer_out_filter(ap_filter_t *f, + apr_bucket_brigade *bb) +{ + apr_bucket *e; + request_rec *r = f->r; + bucketeer_ctx_t *ctx = f->ctx; + bucketeer_filter_config_t *c; + + c = ap_get_module_config(r->server->module_config, &bucketeer_module); + + /* If have a context, it means we've done this before successfully. */ + if (!ctx) { + if (!r->content_type || strncmp(r->content_type, "text/", 5)) { + ap_remove_output_filter(f); + return ap_pass_brigade(f->next, bb); + } + + /* We're cool with filtering this. */ + ctx = f->ctx = apr_pcalloc(f->r->pool, sizeof(*ctx)); + ctx->bb = apr_brigade_create(f->r->pool, f->c->bucket_alloc); + apr_table_unset(f->r->headers_out, "Content-Length"); + } + + APR_BRIGADE_FOREACH(e, bb) { + const char *data; + apr_size_t len, i, lastpos; + + if (APR_BUCKET_IS_EOS(e)) { + APR_BUCKET_REMOVE(e); + APR_BRIGADE_INSERT_TAIL(ctx->bb, e); + + /* Okay, we've seen the EOS. + * Time to pass it along down the chain. + */ + return ap_pass_brigade(f->next, ctx->bb); + } + + if (APR_BUCKET_IS_FLUSH(e)) { + /* + * Ignore flush buckets for the moment.. + * we decide what to stream + */ + continue; + } + + if (APR_BUCKET_IS_METADATA(e)) { + /* metadata bucket */ + apr_bucket *cpy; + apr_bucket_copy(e, &cpy); + APR_BRIGADE_INSERT_TAIL(ctx->bb, cpy); + continue; + } + + /* read */ + apr_bucket_read(e, &data, &len, APR_BLOCK_READ); + + if (len > 0) { + lastpos = 0; + for (i = 0; i < len; i++) { + if (data[i] == c->flushdelimiter || + data[i] == c->bucketdelimiter || + data[i] == c->passdelimiter) { + apr_bucket *p; + if (i - lastpos > 0) { + p = apr_bucket_pool_create(apr_pmemdup(f->r->pool, + &data[lastpos], + i - lastpos), + i - lastpos, + f->r->pool, + f->c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(ctx->bb, p); + } + lastpos = i + 1; + if (data[i] == c->flushdelimiter) { + p = apr_bucket_flush_create(f->c->bucket_alloc); + APR_BRIGADE_INSERT_TAIL(ctx->bb, p); + } + if (data[i] == c->flushdelimiter || + data[i] == c->passdelimiter) { + ap_pass_brigade(f->next, ctx->bb); + /* apr_brigade_cleanup(ctx->bb);*/ + } + } + } + /* XXX: really should append this to the next 'real' bucket */ + if (lastpos < i) { + apr_bucket *p; + p = apr_bucket_pool_create(apr_pmemdup(f->r->pool, + &data[lastpos], + i - lastpos), + i - lastpos, + f->r->pool, + f->c->bucket_alloc); + lastpos = i; + APR_BRIGADE_INSERT_TAIL(ctx->bb, p); + } + } + } + + return APR_SUCCESS; +} + +static void register_hooks(apr_pool_t * p) +{ + ap_register_output_filter(bucketeerFilterName, bucketeer_out_filter, + NULL, AP_FTYPE_RESOURCE-1); +} + +static const command_rec bucketeer_filter_cmds[] = { + {NULL} +}; + +module AP_MODULE_DECLARE_DATA bucketeer_module = { + STANDARD20_MODULE_STUFF, + NULL, + NULL, + create_bucketeer_server_config, + NULL, + bucketeer_filter_cmds, + register_hooks +}; diff --git a/rubbos/app/httpd-2.0.64/modules/test/mod_bucketeer.dsp b/rubbos/app/httpd-2.0.64/modules/test/mod_bucketeer.dsp new file mode 100644 index 00000000..0a1a1d41 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/test/mod_bucketeer.dsp @@ -0,0 +1,128 @@ +# Microsoft Developer Studio Project File - Name="mod_bucketeer" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=mod_bucketeer - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "mod_bucketeer.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 "mod_bucketeer.mak" CFG="mod_bucketeer - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "mod_bucketeer - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "mod_bucketeer - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "mod_bucketeer - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Release\mod_bucketeer_src" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /out:"Release/mod_bucketeer.so" /base:@..\..\os\win32\BaseAddr.ref,mod_bucketeer.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Release/mod_bucketeer.so" /base:@..\..\os\win32\BaseAddr.ref,mod_bucketeer.so /opt:ref + +!ELSEIF "$(CFG)" == "mod_bucketeer - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../../include" /I "../../srclib/apr/include" /I "../../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /Fd"Debug\mod_bucketeer_src" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_bucketeer.so" /base:@..\..\os\win32\BaseAddr.ref,mod_bucketeer.so +# ADD LINK32 kernel32.lib /nologo /subsystem:windows /dll /incremental:no /debug /out:"Debug/mod_bucketeer.so" /base:@..\..\os\win32\BaseAddr.ref,mod_bucketeer.so + +!ENDIF + +# Begin Target + +# Name "mod_bucketeer - Win32 Release" +# Name "mod_bucketeer - Win32 Debug" +# Begin Source File + +SOURCE=.\mod_bucketeer.c +# End Source File +# Begin Source File + +SOURCE=.\mod_bucketeer.rc +# End Source File +# Begin Source File + +SOURCE=..\..\build\win32\win32ver.awk + +!IF "$(CFG)" == "mod_bucketeer - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_bucketeer.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_bucketeer.so "bucketeer_module for Apache" ../../include/ap_release.h > .\mod_bucketeer.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "mod_bucketeer - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\mod_bucketeer.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk mod_bucketeer.so "bucketeer_module for Apache" ../../include/ap_release.h > .\mod_bucketeer.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/modules/test/mod_optional_fn_export.c b/rubbos/app/httpd-2.0.64/modules/test/mod_optional_fn_export.c new file mode 100644 index 00000000..27db2cc1 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/test/mod_optional_fn_export.c @@ -0,0 +1,48 @@ +/* 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. + */ + +#include "httpd.h" +#include "http_config.h" +#include "http_log.h" +#include "mod_optional_fn_export.h" + +/* The alert will note a strange mirror-image style resemblance to + * mod_optional_hook_import.c. Yes, I _did_ mean import. Think about it. + */ + +static int TestOptionalFn(const char *szStr) +{ + ap_log_error(APLOG_MARK,APLOG_ERR,OK,NULL, + "Optional function test said: %s",szStr); + + return OK; +} + +static void ExportRegisterHooks(apr_pool_t *p) +{ + APR_REGISTER_OPTIONAL_FN(TestOptionalFn); +} + +module AP_MODULE_DECLARE_DATA optional_fn_export_module= +{ + STANDARD20_MODULE_STUFF, + NULL, + NULL, + NULL, + NULL, + NULL, + ExportRegisterHooks +}; diff --git a/rubbos/app/httpd-2.0.64/modules/test/mod_optional_fn_export.h b/rubbos/app/httpd-2.0.64/modules/test/mod_optional_fn_export.h new file mode 100644 index 00000000..f30c0b6c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/test/mod_optional_fn_export.h @@ -0,0 +1,19 @@ +/* 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. + */ + +#include "apr_optional.h" + +APR_DECLARE_OPTIONAL_FN(int,TestOptionalFn,(const char *)); diff --git a/rubbos/app/httpd-2.0.64/modules/test/mod_optional_fn_import.c b/rubbos/app/httpd-2.0.64/modules/test/mod_optional_fn_import.c new file mode 100644 index 00000000..f793fa44 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/test/mod_optional_fn_import.c @@ -0,0 +1,55 @@ +/* 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. + */ + +#include "httpd.h" +#include "http_config.h" +#include "mod_optional_fn_export.h" +#include "http_protocol.h" + +/* The alert will note a strange mirror-image style resemblance to + * mod_optional_hook_export.c. Yes, I _did_ mean export. Think about it. + */ + +static APR_OPTIONAL_FN_TYPE(TestOptionalFn) *pfn; + +static int ImportLogTransaction(request_rec *r) +{ + if(pfn) + return pfn(r->the_request); + return DECLINED; +} + +static void ImportFnRetrieve(void) +{ + pfn=APR_RETRIEVE_OPTIONAL_FN(TestOptionalFn); +} + +static void ImportRegisterHooks(apr_pool_t *p) +{ + ap_hook_log_transaction(ImportLogTransaction,NULL,NULL,APR_HOOK_MIDDLE); + ap_hook_optional_fn_retrieve(ImportFnRetrieve,NULL,NULL,APR_HOOK_MIDDLE); +} + +module AP_MODULE_DECLARE_DATA optional_fn_import_module = +{ + STANDARD20_MODULE_STUFF, + NULL, + NULL, + NULL, + NULL, + NULL, + ImportRegisterHooks +}; diff --git a/rubbos/app/httpd-2.0.64/modules/test/mod_optional_hook_export.c b/rubbos/app/httpd-2.0.64/modules/test/mod_optional_hook_export.c new file mode 100644 index 00000000..b0e6fd53 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/test/mod_optional_hook_export.c @@ -0,0 +1,44 @@ +/* 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. + */ + +#include "httpd.h" +#include "http_config.h" +#include "mod_optional_hook_export.h" +#include "http_protocol.h" + +AP_IMPLEMENT_OPTIONAL_HOOK_RUN_ALL(int,optional_hook_test,(const char *szStr), + (szStr),OK,DECLINED) + +static int ExportLogTransaction(request_rec *r) +{ + return ap_run_optional_hook_test(r->the_request); +} + +static void ExportRegisterHooks(apr_pool_t *p) +{ + ap_hook_log_transaction(ExportLogTransaction,NULL,NULL,APR_HOOK_MIDDLE); +} + +module AP_MODULE_DECLARE_DATA optional_hook_export_module = +{ + STANDARD20_MODULE_STUFF, + NULL, + NULL, + NULL, + NULL, + NULL, + ExportRegisterHooks +}; diff --git a/rubbos/app/httpd-2.0.64/modules/test/mod_optional_hook_export.h b/rubbos/app/httpd-2.0.64/modules/test/mod_optional_hook_export.h new file mode 100644 index 00000000..7af68620 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/test/mod_optional_hook_export.h @@ -0,0 +1,24 @@ +/* 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. + */ + +#ifndef MOD_OPTIONAL_HOOK_EXPORT_H +#define MOD_OPTOPNAL_HOOK_EXPORT_H + +#include "ap_config.h" + +AP_DECLARE_HOOK(int,optional_hook_test,(const char *)) + +#endif /* def MOD_OPTIONAL_HOOK_EXPORT_H */ diff --git a/rubbos/app/httpd-2.0.64/modules/test/mod_optional_hook_import.c b/rubbos/app/httpd-2.0.64/modules/test/mod_optional_hook_import.c new file mode 100644 index 00000000..cd485413 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/test/mod_optional_hook_import.c @@ -0,0 +1,45 @@ +/* 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. + */ + +#include "httpd.h" +#include "http_config.h" +#include "http_log.h" +#include "mod_optional_hook_export.h" + +static int ImportOptionalHookTestHook(const char *szStr) +{ + ap_log_error(APLOG_MARK,APLOG_ERR,OK,NULL,"Optional hook test said: %s", + szStr); + + return OK; +} + +static void ImportRegisterHooks(apr_pool_t *p) +{ + AP_OPTIONAL_HOOK(optional_hook_test,ImportOptionalHookTestHook,NULL, + NULL,APR_HOOK_MIDDLE); +} + +module AP_MODULE_DECLARE_DATA optional_hook_import_module= +{ + STANDARD20_MODULE_STUFF, + NULL, + NULL, + NULL, + NULL, + NULL, + ImportRegisterHooks +}; diff --git a/rubbos/app/httpd-2.0.64/modules/test/modules.mk b/rubbos/app/httpd-2.0.64/modules/test/modules.mk new file mode 100644 index 00000000..ceb52a1b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/modules/test/modules.mk @@ -0,0 +1,3 @@ +DISTCLEAN_TARGETS = modules.mk +static = +shared = diff --git a/rubbos/app/httpd-2.0.64/os/.deps b/rubbos/app/httpd-2.0.64/os/.deps new file mode 100644 index 00000000..e69de29b diff --git a/rubbos/app/httpd-2.0.64/os/.indent.pro b/rubbos/app/httpd-2.0.64/os/.indent.pro new file mode 100644 index 00000000..a9fbe9f9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/os/.indent.pro @@ -0,0 +1,54 @@ +-i4 -npsl -di0 -br -nce -d0 -cli0 -npcs -nfc1 +-TBUFF +-TFILE +-TTRANS +-TUINT4 +-T_trans +-Tallow_options_t +-Tapache_sfio +-Tarray_header +-Tbool_int +-Tbuf_area +-Tbuff_struct +-Tbuffy +-Tcmd_how +-Tcmd_parms +-Tcommand_rec +-Tcommand_struct +-Tconn_rec +-Tcore_dir_config +-Tcore_server_config +-Tdir_maker_func +-Tevent +-Tglobals_s +-Thandler_func +-Thandler_rec +-Tjoblist_s +-Tlisten_rec +-Tmerger_func +-Tmode_t +-Tmodule +-Tmodule_struct +-Tmutex +-Tn_long +-Tother_child_rec +-Toverrides_t +-Tparent_score +-Tpid_t +-Tpiped_log +-Tpool +-Trequest_rec +-Trequire_line +-Trlim_t +-Tscoreboard +-Tsemaphore +-Tserver_addr_rec +-Tserver_rec +-Tserver_rec_chain +-Tshort_score +-Ttable +-Ttable_entry +-Tthread +-Tu_wide_int +-Tvtime_t +-Twide_int diff --git a/rubbos/app/httpd-2.0.64/os/Makefile b/rubbos/app/httpd-2.0.64/os/Makefile new file mode 100644 index 00000000..b95fe05b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/os/Makefile @@ -0,0 +1,9 @@ +top_srcdir = /bottlenecks/rubbos/app/httpd-2.0.64 +top_builddir = /bottlenecks/rubbos/app/httpd-2.0.64 +srcdir = /bottlenecks/rubbos/app/httpd-2.0.64/os +builddir = /bottlenecks/rubbos/app/httpd-2.0.64/os +VPATH = /bottlenecks/rubbos/app/httpd-2.0.64/os + +SUBDIRS = $(OS_DIR) + +include $(top_builddir)/build/rules.mk diff --git a/rubbos/app/httpd-2.0.64/os/Makefile.in b/rubbos/app/httpd-2.0.64/os/Makefile.in new file mode 100644 index 00000000..9b35d491 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/os/Makefile.in @@ -0,0 +1,4 @@ + +SUBDIRS = $(OS_DIR) + +include $(top_builddir)/build/rules.mk diff --git a/rubbos/app/httpd-2.0.64/os/beos/.deps b/rubbos/app/httpd-2.0.64/os/beos/.deps new file mode 100644 index 00000000..e69de29b diff --git a/rubbos/app/httpd-2.0.64/os/beos/Makefile b/rubbos/app/httpd-2.0.64/os/beos/Makefile new file mode 100644 index 00000000..cc4ca876 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/os/beos/Makefile @@ -0,0 +1,10 @@ +top_srcdir = /bottlenecks/rubbos/app/httpd-2.0.64 +top_builddir = /bottlenecks/rubbos/app/httpd-2.0.64 +srcdir = /bottlenecks/rubbos/app/httpd-2.0.64/os/beos +builddir = /bottlenecks/rubbos/app/httpd-2.0.64/os/beos +VPATH = /bottlenecks/rubbos/app/httpd-2.0.64/os/beos + +LTLIBRARY_NAME = libos.la +LTLIBRARY_SOURCES = os.c beosd.c + +include $(top_srcdir)/build/ltlib.mk diff --git a/rubbos/app/httpd-2.0.64/os/beos/Makefile.in b/rubbos/app/httpd-2.0.64/os/beos/Makefile.in new file mode 100644 index 00000000..66272ecc --- /dev/null +++ b/rubbos/app/httpd-2.0.64/os/beos/Makefile.in @@ -0,0 +1,5 @@ + +LTLIBRARY_NAME = libos.la +LTLIBRARY_SOURCES = os.c beosd.c + +include $(top_srcdir)/build/ltlib.mk diff --git a/rubbos/app/httpd-2.0.64/os/beos/beosd.c b/rubbos/app/httpd-2.0.64/os/beos/beosd.c new file mode 100644 index 00000000..0d1755d4 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/os/beos/beosd.c @@ -0,0 +1,166 @@ +/* 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. + */ + +#include +#include "httpd.h" +#include "http_config.h" +#include "http_main.h" +#include "http_log.h" +#include "beosd.h" +#include "mpm_common.h" + +beosd_config_rec beosd_config; + +/* Set group privileges. + * + * Note that until we get the multi-user situation sorted on beos, + * this is just a no-op to allow common configuration files! + */ + +#if B_BEOS_VERSION < 0x0460 +static int set_group_privs(void) +{ + /* no-op */ + return 0; +} +#endif + + +int beosd_setup_child(void) +{ + /* TODO: revisit the whole issue of users/groups for BeOS as + * R5 and below doesn't really have much concept of them. + */ + + return 0; +} + + +AP_DECLARE(const char *) beosd_set_user(cmd_parms *cmd, + void *dummy, const char *arg) +{ + /* no-op */ + return NULL; +} + +AP_DECLARE(const char *) beosd_set_group(cmd_parms *cmd, + void *dummy, const char *arg) +{ + /* no-op */ + return NULL; +} + +void beosd_pre_config(void) +{ + /* Until the multi-user situation on BeOS is fixed, + simply have a no-op here to allow for common conf files + */ +} + +AP_DECLARE(apr_status_t) beosd_accept(void **accepted, ap_listen_rec *lr, + apr_pool_t *ptrans) +{ + apr_socket_t *csd; + apr_status_t status; + int sockdes; + + status = apr_accept(&csd, lr->sd, ptrans); + if (status == APR_SUCCESS) { + *accepted = csd; + apr_os_sock_get(&sockdes, csd); + if (sockdes >= FD_SETSIZE) { + ap_log_error(APLOG_MARK, APLOG_WARNING, 0, NULL, + "new file descriptor %d is too large; you probably need " + "to rebuild Apache with a larger FD_SETSIZE " + "(currently %d)", + sockdes, FD_SETSIZE); + apr_socket_close(csd); + return APR_EINTR; + } + return status; + } + + if (APR_STATUS_IS_EINTR(status)) { + return status; + } + /* Our old behaviour here was to continue after accept() + * errors. But this leads us into lots of troubles + * because most of the errors are quite fatal. For + * example, EMFILE can be caused by slow descriptor + * leaks (say in a 3rd party module, or libc). It's + * foolish for us to continue after an EMFILE. We also + * seem to tickle kernel bugs on some platforms which + * lead to never-ending loops here. So it seems best + * to just exit in most cases. + */ + switch (status) { +#ifdef EPROTO + /* EPROTO on certain older kernels really means + * ECONNABORTED, so we need to ignore it for them. + * See discussion in new-httpd archives nh.9701 + * search for EPROTO. + * + * Also see nh.9603, search for EPROTO: + * There is potentially a bug in Solaris 2.x x<6, + * and other boxes that implement tcp sockets in + * userland (i.e. on top of STREAMS). On these + * systems, EPROTO can actually result in a fatal + * loop. See PR#981 for example. It's hard to + * handle both uses of EPROTO. + */ + case EPROTO: +#endif +#ifdef ECONNABORTED + case ECONNABORTED: +#endif +#ifdef ETIMEDOUT + case ETIMEDOUT: +#endif +#ifdef EHOSTUNREACH + case EHOSTUNREACH: +#endif +#ifdef ENETUNREACH + case ENETUNREACH: +#endif + break; +#ifdef ENETDOWN + case ENETDOWN: + /* + * When the network layer has been shut down, there + * is not much use in simply exiting: the parent + * would simply re-create us (and we'd fail again). + * Use the CHILDFATAL code to tear the server down. + * @@@ Martin's idea for possible improvement: + * A different approach would be to define + * a new APEXIT_NETDOWN exit code, the reception + * of which would make the parent shutdown all + * children, then idle-loop until it detected that + * the network is up again, and restart the children. + * Ben Hyde noted that temporary ENETDOWN situations + * occur in mobile IP. + */ + ap_log_error(APLOG_MARK, APLOG_EMERG, status, ap_server_conf, + "apr_accept: giving up."); + return APR_EGENERAL; +#endif /*ENETDOWN*/ + + default: + ap_log_error(APLOG_MARK, APLOG_ERR, status, ap_server_conf, + "apr_accept: (client socket)"); + return APR_EGENERAL; + } + return status; +} diff --git a/rubbos/app/httpd-2.0.64/os/beos/beosd.h b/rubbos/app/httpd-2.0.64/os/beos/beosd.h new file mode 100644 index 00000000..337b5ced --- /dev/null +++ b/rubbos/app/httpd-2.0.64/os/beos/beosd.h @@ -0,0 +1,60 @@ +/* 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. + */ + +#ifndef BEOSD_H +#define BEOSD_H + +#include "httpd.h" +#include "ap_listen.h" +/* common stuff that beos MPMs will want */ + +/* Default user name and group name. These may be specified as numbers by + * placing a # before a number */ + +#ifndef DEFAULT_USER +#define DEFAULT_USER "#-1" +#endif +#ifndef DEFAULT_GROUP +#define DEFAULT_GROUP "#" +#endif + +typedef struct { + char *user_name; + uid_t user_id; + gid_t group_id; +} beosd_config_rec; +extern beosd_config_rec beosd_config; + +void beosd_detach(void); +int beosd_setup_child(void); +void beosd_pre_config(void); +AP_DECLARE(const char *) beosd_set_user (cmd_parms *cmd, void *dummy, + const char *arg); +AP_DECLARE(const char *) beosd_set_group(cmd_parms *cmd, void *dummy, + const char *arg); +AP_DECLARE(apr_status_t) beosd_accept(void **accepted, ap_listen_rec *lr, + apr_pool_t *ptrans); + +#define beosd_killpg(x, y) (kill (-(x), (y))) +#define ap_os_killpg(x, y) (kill (-(x), (y))) + +#define BEOS_DAEMON_COMMANDS \ +AP_INIT_TAKE1("User", beosd_set_user, NULL, RSRC_CONF, \ + "Effective user id for this server (NO-OP)"), \ +AP_INIT_TAKE1("Group", beosd_set_group, NULL, RSRC_CONF, \ + "Effective group id for this server (NO-OP)") + +#endif /* BEOSD_H */ diff --git a/rubbos/app/httpd-2.0.64/os/beos/config.m4 b/rubbos/app/httpd-2.0.64/os/beos/config.m4 new file mode 100644 index 00000000..4fe95b75 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/os/beos/config.m4 @@ -0,0 +1,3 @@ +if test "$OS" = "beos" ; then + APR_ADDTO(CFLAGS,-DBEOS) +fi diff --git a/rubbos/app/httpd-2.0.64/os/beos/os.c b/rubbos/app/httpd-2.0.64/os/beos/os.c new file mode 100644 index 00000000..a4361f88 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/os/beos/os.c @@ -0,0 +1,37 @@ +/* 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. + */ + +/* + * This file will include OS specific functions which are not inlineable. + * Any inlineable functions should be defined in os-inline.c instead. + */ + +#include "ap_config.h" +#include "os.h" +#include "httpd.h" +#include "apr_thread_proc.h" +#include "ap_mpm.h" /* needed for definition of + * ap_os_create_privileged_process */ + +AP_DECLARE(apr_status_t) ap_os_create_privileged_process( + const request_rec *r, + apr_proc_t *newproc, const char *progname, + const char * const *args, + const char * const *env, + apr_procattr_t *attr, apr_pool_t *p) +{ + return apr_proc_create(newproc, progname, args, env, attr, p); +} diff --git a/rubbos/app/httpd-2.0.64/os/beos/os.h b/rubbos/app/httpd-2.0.64/os/beos/os.h new file mode 100644 index 00000000..f5fa9064 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/os/beos/os.h @@ -0,0 +1,30 @@ +/* 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. + */ + +#ifndef APACHE_OS_H +#define APACHE_OS_H + +#include "ap_config.h" + +#ifndef PLATFORM +# ifdef BONE_VERSION +# define PLATFORM "BeOS BONE" +# else +# define PLATFORM "BeOS R5" +# endif +#endif + +#endif /* !APACHE_OS_H */ diff --git a/rubbos/app/httpd-2.0.64/os/bs2000/bs2login.c b/rubbos/app/httpd-2.0.64/os/bs2000/bs2login.c new file mode 100644 index 00000000..a13ad67c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/os/bs2000/bs2login.c @@ -0,0 +1,266 @@ +/* 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. + */ + +#ifdef _OSD_POSIX +#include "httpd.h" +#include "http_config.h" +#include "http_log.h" +#include +#include + +#define ACCT_LEN 8 +#define USER_LEN 8 + +static const char *bs2000_account = NULL; +typedef enum +{ + bs2_unknown, /* not initialized yet. */ + bs2_noFORK, /* no fork() because -X flag was specified */ + bs2_FORK, /* only fork() because uid != 0 */ + bs2_FORK_RINI, /* prior to A17, regular fork() and _rini() was used. */ + bs2_RFORK_RINI, /* for A17, use of _rfork() and _rini() was required */ + bs2_UFORK /* As of A18, the new ufork() is used. */ +} bs2_ForkType; + +static bs2_ForkType forktype = bs2_unknown; + +#if !defined(_POSIX_SOURCE) && !defined(_XOPEN_SOURCE) +typedef struct { + char *username; + char *account; + char *processor_name; +} _rini_struct; + +extern int _rini(_rini_struct *); +#endif /* !defined(_POSIX_SOURCE) && !defined(_XOPEN_SOURCE) */ + + +static void ap_pad(char *dest, size_t size, char ch) +{ + int i = strlen(dest); /* Leave space for trailing '\0' */ + + while (i < size-1) + dest[i++] = ch; + + dest[size-1] = '\0'; /* Guarantee for trailing '\0' */ +} + +static void ap_str_toupper(char *str) +{ + while (*str) { + *str = apr_toupper(*str); + ++str; + } +} + +/* Determine the method for forking off a child in such a way as to + * set both the POSIX and BS2000 user id's to the unprivileged user. + */ +static bs2_ForkType os_forktype(void) +{ + struct utsname os_version; + + /* have we checked the OS version before? If yes return the previous + * result - the OS release isn't going to change suddenly! + */ + if (forktype != bs2_unknown) { + return forktype; + } + + /* If the user is unprivileged, use the normal fork() only. */ + if (getuid() != 0) { + return forktype = bs2_FORK; + } + + if (uname(&os_version) < 0) + { + ap_log_error(APLOG_MARK, APLOG_ALERT, errno, NULL, + "uname() failed - aborting."); + exit(APEXIT_CHILDFATAL); + } + + /* + * Old BS2000/OSD versions (before XPG4 SPEC1170) don't work with Apache. + * Anyway, simply return a fork(). + */ + if (strcmp(os_version.release, "01.0A") == 0 || + strcmp(os_version.release, "02.0A") == 0 || + strcmp(os_version.release, "02.1A") == 0) + { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, NULL, + "Error: unsupported OS version. " + "You may encounter problems."); + forktype = bs2_FORK; + } + + /* The following versions are special: + * OS versions before A17 needs regular fork() and _rini(). + * A17 requires _rfork() and _rini(), + * and later versions need ufork(). + */ + else if (strcmp(os_version.release, "01.1A") == 0 || + strcmp(os_version.release, "03.0A") == 0 || + strcmp(os_version.release, "03.1A") == 0 || + strcmp(os_version.release, "04.0A") == 0) + { + if (strcmp (os_version.version, "A18") >= 0) + forktype = bs2_UFORK; + + else if (strcmp (os_version.version, "A17") < 0) + forktype = bs2_FORK_RINI; + + else + forktype = bs2_RFORK_RINI; + } + + /* All later OS versions will hopefully use ufork() only ;-) */ + else + forktype = bs2_UFORK; + + return forktype; +} + + + +/* This routine is called by http_core for the BS2000Account directive */ +/* It stores the account name for later use */ +const char *os_set_account(apr_pool_t *p, const char *account) +{ + char account_temp[ACCT_LEN+1]; + + apr_cpystrn(account_temp, account, sizeof account_temp); + + /* Make account all upper case */ + ap_str_toupper(account_temp); + + /* Pad to length 8 */ + ap_pad(account_temp, sizeof account_temp, ' '); + + bs2000_account = apr_pstrdup(p, account_temp); + return NULL; +} + +/* This routine complements the setuid() call: it causes the BS2000 job + * environment to be switched to the target user's user id. + * That is important if CGI scripts try to execute native BS2000 commands. + */ +int os_init_job_environment(server_rec *server, const char *user_name, int one_process) +{ + _rini_struct inittask; + char username[USER_LEN+1]; + int save_errno; + bs2_ForkType type = os_forktype(); + + /* We can be sure that no change to uid==0 is possible because of + * the checks in http_core.c:set_user() + */ + + /* The _rini() function works only after a prior _rfork(). + * In the case of one_process, it would fail. + */ + if (one_process) { + + type = forktype = bs2_noFORK; + + ap_log_error(APLOG_MARK, APLOG_ERR, 0, server, + "The debug mode of Apache should only " + "be started by an unprivileged user!"); + return 0; + } + + /* If no _rini() is required, then return quickly. */ + if (type != bs2_RFORK_RINI && type != bs2_FORK_RINI) + return 0; + + /* An Account is required for _rini() */ + if (bs2000_account == NULL) + { + ap_log_error(APLOG_MARK, APLOG_ALERT, 0, server, + "No BS2000Account configured - cannot switch to User %s", + user_name); + exit(APEXIT_CHILDFATAL); + } + + apr_cpystrn(username, user_name, sizeof username); + + /* Make user name all upper case */ + ap_str_toupper(username); + + /* Pad to length 8 */ + ap_pad(username, sizeof username, ' '); + + inittask.username = username; + inittask.account = bs2000_account; + inittask.processor_name = " "; + + /* Switch to the new logon user (setuid() and setgid() are done later) */ + /* Only the super user can switch identities. */ + if (_rini(&inittask) != 0) { + + ap_log_error(APLOG_MARK, APLOG_ALERT, errno, server, + "_rini: BS2000 auth failed for user \"%s\" acct \"%s\"", + inittask.username, inittask.account); + + exit(APEXIT_CHILDFATAL); + } + + return 0; +} + +/* BS2000 requires a "special" version of fork() before a setuid()/_rini() call */ +pid_t os_fork(const char *user) +{ + pid_t pid; + char username[USER_LEN+1]; + + switch (os_forktype()) { + case bs2_FORK: + case bs2_FORK_RINI: + pid = fork(); + break; + + case bs2_RFORK_RINI: + pid = _rfork(); + break; + + case bs2_UFORK: + apr_cpystrn(username, user, sizeof username); + + /* Make user name all upper case - for some versions of ufork() */ + ap_str_toupper(username); + + pid = ufork(username); + if (pid == -1 && errno == EPERM) { + ap_log_error(APLOG_MARK, APLOG_EMERG, errno, + NULL, "ufork: Possible mis-configuration " + "for user %s - Aborting.", user); + exit(1); + } + break; + + default: + pid = 0; + break; + } + + return pid; +} + +#else /* _OSD_POSIX */ +void bs2login_is_not_here() +{ +} +#endif /* _OSD_POSIX */ diff --git a/rubbos/app/httpd-2.0.64/os/bs2000/ebcdic.c b/rubbos/app/httpd-2.0.64/os/bs2000/ebcdic.c new file mode 100644 index 00000000..f6226d57 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/os/bs2000/ebcdic.c @@ -0,0 +1,210 @@ +/* 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. + */ + +#include "ap_config.h" +#if APR_CHARSET_EBCDIC +#include "ebcdic.h" +/* + Initial Port for Apache-1.3 by + +"BS2000 OSD" is a POSIX on a main frame. It is made by Siemens AG, Germany. +Within the POSIX subsystem, the same character set was chosen as in +"native BS2000", namely EBCDIC. + +EBCDIC Table. (Yes, in EBCDIC, the letters 'a'..'z' are not contiguous!) +This apr_table_t is bijective, i.e. there are no ambigous or duplicate characters +00 00 01 02 03 85 09 86 7f 87 8d 8e 0b 0c 0d 0e 0f *................* +10 10 11 12 13 8f 0a 08 97 18 19 9c 9d 1c 1d 1e 1f *................* +20 80 81 82 83 84 92 17 1b 88 89 8a 8b 8c 05 06 07 *................* +30 90 91 16 93 94 95 96 04 98 99 9a 9b 14 15 9e 1a *................* +40 20 a0 e2 e4 e0 e1 e3 e5 e7 f1 60 2e 3c 28 2b 7c * .........`.<(+|* +50 26 e9 ea eb e8 ed ee ef ec df 21 24 2a 29 3b 9f *&.........!$*);.* +60 2d 2f c2 c4 c0 c1 c3 c5 c7 d1 5e 2c 25 5f 3e 3f *-/........^,%_>?* +70 f8 c9 ca cb c8 cd ce cf cc a8 3a 23 40 27 3d 22 *..........:#@'="* +80 d8 61 62 63 64 65 66 67 68 69 ab bb f0 fd fe b1 *.abcdefghi......* +90 b0 6a 6b 6c 6d 6e 6f 70 71 72 aa ba e6 b8 c6 a4 *.jklmnopqr......* +a0 b5 af 73 74 75 76 77 78 79 7a a1 bf d0 dd de ae *..stuvwxyz......* +b0 a2 a3 a5 b7 a9 a7 b6 bc bd be ac 5b 5c 5d b4 d7 *...........[\]..* +c0 f9 41 42 43 44 45 46 47 48 49 ad f4 f6 f2 f3 f5 *.ABCDEFGHI......* +d0 a6 4a 4b 4c 4d 4e 4f 50 51 52 b9 fb fc db fa ff *.JKLMNOPQR......* +e0 d9 f7 53 54 55 56 57 58 59 5a b2 d4 d6 d2 d3 d5 *..STUVWXYZ......* +f0 30 31 32 33 34 35 36 37 38 39 b3 7b dc 7d da 7e *0123456789.{.}.~* +*/ + +/* The bijective ebcdic-to-ascii table: */ +const unsigned char os_toascii_strictly[256] = { +/*00*/ 0x00, 0x01, 0x02, 0x03, 0x85, 0x09, 0x86, 0x7f, + 0x87, 0x8d, 0x8e, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, /*................*/ +/*10*/ 0x10, 0x11, 0x12, 0x13, 0x8f, 0x0a, 0x08, 0x97, + 0x18, 0x19, 0x9c, 0x9d, 0x1c, 0x1d, 0x1e, 0x1f, /*................*/ +/*20*/ 0x80, 0x81, 0x82, 0x83, 0x84, 0x92, 0x17, 0x1b, + 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x05, 0x06, 0x07, /*................*/ +/*30*/ 0x90, 0x91, 0x16, 0x93, 0x94, 0x95, 0x96, 0x04, + 0x98, 0x99, 0x9a, 0x9b, 0x14, 0x15, 0x9e, 0x1a, /*................*/ +/*40*/ 0x20, 0xa0, 0xe2, 0xe4, 0xe0, 0xe1, 0xe3, 0xe5, + 0xe7, 0xf1, 0x60, 0x2e, 0x3c, 0x28, 0x2b, 0x7c, /* .........`.<(+|*/ +/*50*/ 0x26, 0xe9, 0xea, 0xeb, 0xe8, 0xed, 0xee, 0xef, + 0xec, 0xdf, 0x21, 0x24, 0x2a, 0x29, 0x3b, 0x9f, /*&.........!$*);.*/ +/*60*/ 0x2d, 0x2f, 0xc2, 0xc4, 0xc0, 0xc1, 0xc3, 0xc5, + 0xc7, 0xd1, 0x5e, 0x2c, 0x25, 0x5f, 0x3e, 0x3f, /*-/........^,%_>?*/ +/*70*/ 0xf8, 0xc9, 0xca, 0xcb, 0xc8, 0xcd, 0xce, 0xcf, + 0xcc, 0xa8, 0x3a, 0x23, 0x40, 0x27, 0x3d, 0x22, /*..........:#@'="*/ +/*80*/ 0xd8, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, + 0x68, 0x69, 0xab, 0xbb, 0xf0, 0xfd, 0xfe, 0xb1, /*.abcdefghi......*/ +/*90*/ 0xb0, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, + 0x71, 0x72, 0xaa, 0xba, 0xe6, 0xb8, 0xc6, 0xa4, /*.jklmnopqr......*/ +/*a0*/ 0xb5, 0xaf, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, + 0x79, 0x7a, 0xa1, 0xbf, 0xd0, 0xdd, 0xde, 0xae, /*..stuvwxyz......*/ +/*b0*/ 0xa2, 0xa3, 0xa5, 0xb7, 0xa9, 0xa7, 0xb6, 0xbc, + 0xbd, 0xbe, 0xac, 0x5b, 0x5c, 0x5d, 0xb4, 0xd7, /*...........[\]..*/ +/*c0*/ 0xf9, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, + 0x48, 0x49, 0xad, 0xf4, 0xf6, 0xf2, 0xf3, 0xf5, /*.ABCDEFGHI......*/ +/*d0*/ 0xa6, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, + 0x51, 0x52, 0xb9, 0xfb, 0xfc, 0xdb, 0xfa, 0xff, /*.JKLMNOPQR......*/ +/*e0*/ 0xd9, 0xf7, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, + 0x59, 0x5a, 0xb2, 0xd4, 0xd6, 0xd2, 0xd3, 0xd5, /*..STUVWXYZ......*/ +/*f0*/ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, + 0x38, 0x39, 0xb3, 0x7b, 0xdc, 0x7d, 0xda, 0x7e /*0123456789.{.}.~*/ +}; + +/* This apr_table_t is (almost) identical to the previous one. The only difference + * is the fact that it maps every EBCDIC *except 0x0A* to its ASCII + * equivalent. The reason for this apr_table_t is simple: Throughout the + * server, protocol strings are used in the form + * "Content-Type: text/plain\015\012". Now all the characters in the string + * are stored as EBCDIC, only the semantics of \012 is completely + * different from LF (look it up in the apr_table_t above). \015 happens to be + * mapped to \015 anyway, so there's no special case for it. + * + * In THIS table, EBCDIC-\012 is mapped to ASCII-\012. + * This apr_table_t is therefore used wherever an EBCDIC to ASCII conversion is + * needed in the server. + */ +/* ebcdic-to-ascii with \012 mapped to ASCII-\n */ +const unsigned char os_toascii[256] = { +/*00*/ 0x00, 0x01, 0x02, 0x03, 0x85, 0x09, 0x86, 0x7f, + 0x87, 0x8d, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, /*................*/ +/*10*/ 0x10, 0x11, 0x12, 0x13, 0x8f, 0x0a, 0x08, 0x97, + 0x18, 0x19, 0x9c, 0x9d, 0x1c, 0x1d, 0x1e, 0x1f, /*................*/ +/*20*/ 0x80, 0x81, 0x82, 0x83, 0x84, 0x92, 0x17, 0x1b, + 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x05, 0x06, 0x07, /*................*/ +/*30*/ 0x90, 0x91, 0x16, 0x93, 0x94, 0x95, 0x96, 0x04, + 0x98, 0x99, 0x9a, 0x9b, 0x14, 0x15, 0x9e, 0x1a, /*................*/ +/*40*/ 0x20, 0xa0, 0xe2, 0xe4, 0xe0, 0xe1, 0xe3, 0xe5, + 0xe7, 0xf1, 0x60, 0x2e, 0x3c, 0x28, 0x2b, 0x7c, /* .........`.<(+|*/ +/*50*/ 0x26, 0xe9, 0xea, 0xeb, 0xe8, 0xed, 0xee, 0xef, + 0xec, 0xdf, 0x21, 0x24, 0x2a, 0x29, 0x3b, 0x9f, /*&.........!$*);.*/ +/*60*/ 0x2d, 0x2f, 0xc2, 0xc4, 0xc0, 0xc1, 0xc3, 0xc5, + 0xc7, 0xd1, 0x5e, 0x2c, 0x25, 0x5f, 0x3e, 0x3f, /*-/........^,%_>?*/ +/*70*/ 0xf8, 0xc9, 0xca, 0xcb, 0xc8, 0xcd, 0xce, 0xcf, + 0xcc, 0xa8, 0x3a, 0x23, 0x40, 0x27, 0x3d, 0x22, /*..........:#@'="*/ +/*80*/ 0xd8, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, + 0x68, 0x69, 0xab, 0xbb, 0xf0, 0xfd, 0xfe, 0xb1, /*.abcdefghi......*/ +/*90*/ 0xb0, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, + 0x71, 0x72, 0xaa, 0xba, 0xe6, 0xb8, 0xc6, 0xa4, /*.jklmnopqr......*/ +/*a0*/ 0xb5, 0xaf, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, + 0x79, 0x7a, 0xa1, 0xbf, 0xd0, 0xdd, 0xde, 0xae, /*..stuvwxyz......*/ +/*b0*/ 0xa2, 0xa3, 0xa5, 0xb7, 0xa9, 0xa7, 0xb6, 0xbc, + 0xbd, 0xbe, 0xac, 0x5b, 0x5c, 0x5d, 0xb4, 0xd7, /*...........[\]..*/ +/*c0*/ 0xf9, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, + 0x48, 0x49, 0xad, 0xf4, 0xf6, 0xf2, 0xf3, 0xf5, /*.ABCDEFGHI......*/ +/*d0*/ 0xa6, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, + 0x51, 0x52, 0xb9, 0xfb, 0xfc, 0xdb, 0xfa, 0xff, /*.JKLMNOPQR......*/ +/*e0*/ 0xd9, 0xf7, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, + 0x59, 0x5a, 0xb2, 0xd4, 0xd6, 0xd2, 0xd3, 0xd5, /*..STUVWXYZ......*/ +/*f0*/ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, + 0x38, 0x39, 0xb3, 0x7b, 0xdc, 0x7d, 0xda, 0x7e /*0123456789.{.}.~*/ +}; + +/* The ascii-to-ebcdic table: +00 00 01 02 03 37 2d 2e 2f 16 05 15 0b 0c 0d 0e 0f *................* +10 10 11 12 13 3c 3d 32 26 18 19 3f 27 1c 1d 1e 1f *................* +20 40 5a 7f 7b 5b 6c 50 7d 4d 5d 5c 4e 6b 60 4b 61 * !"#$%&'()*+,-./ +30 f0 f1 f2 f3 f4 f5 f6 f7 f8 f9 7a 5e 4c 7e 6e 6f *0123456789:;<=>?* +40 7c c1 c2 c3 c4 c5 c6 c7 c8 c9 d1 d2 d3 d4 d5 d6 *@ABCDEFGHIJKLMNO* +50 d7 d8 d9 e2 e3 e4 e5 e6 e7 e8 e9 bb bc bd 6a 6d *PQRSTUVWXYZ[\]^_* +60 4a 81 82 83 84 85 86 87 88 89 91 92 93 94 95 96 *`abcdefghijklmno* +70 97 98 99 a2 a3 a4 a5 a6 a7 a8 a9 fb 4f fd ff 07 *pqrstuvwxyz{|}~.* +80 20 21 22 23 24 04 06 08 28 29 2a 2b 2c 09 0a 14 *................* +90 30 31 25 33 34 35 36 17 38 39 3a 3b 1a 1b 3e 5f *................* +a0 41 aa b0 b1 9f b2 d0 b5 79 b4 9a 8a ba ca af a1 *................* +b0 90 8f ea fa be a0 b6 b3 9d da 9b 8b b7 b8 b9 ab *................* +c0 64 65 62 66 63 67 9e 68 74 71 72 73 78 75 76 77 *................* +d0 ac 69 ed ee eb ef ec bf 80 e0 fe dd fc ad ae 59 *................* +e0 44 45 42 46 43 47 9c 48 54 51 52 53 58 55 56 57 *................* +f0 8c 49 cd ce cb cf cc e1 70 c0 de db dc 8d 8e df *................* +*/ +const unsigned char os_toebcdic[256] = { +/*00*/ 0x00, 0x01, 0x02, 0x03, 0x37, 0x2d, 0x2e, 0x2f, + 0x16, 0x05, 0x15, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, /*................*/ +/*10*/ 0x10, 0x11, 0x12, 0x13, 0x3c, 0x3d, 0x32, 0x26, + 0x18, 0x19, 0x3f, 0x27, 0x1c, 0x1d, 0x1e, 0x1f, /*................*/ +/*20*/ 0x40, 0x5a, 0x7f, 0x7b, 0x5b, 0x6c, 0x50, 0x7d, + 0x4d, 0x5d, 0x5c, 0x4e, 0x6b, 0x60, 0x4b, 0x61, /* !"#$%&'()*+,-./ */ +/*30*/ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, + 0xf8, 0xf9, 0x7a, 0x5e, 0x4c, 0x7e, 0x6e, 0x6f, /*0123456789:;<=>?*/ +/*40*/ 0x7c, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, + 0xc8, 0xc9, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, /*@ABCDEFGHIJKLMNO*/ +/*50*/ 0xd7, 0xd8, 0xd9, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, + 0xe7, 0xe8, 0xe9, 0xbb, 0xbc, 0xbd, 0x6a, 0x6d, /*PQRSTUVWXYZ[\]^_*/ +/*60*/ 0x4a, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, + 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, /*`abcdefghijklmno*/ +/*70*/ 0x97, 0x98, 0x99, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, + 0xa7, 0xa8, 0xa9, 0xfb, 0x4f, 0xfd, 0xff, 0x07, /*pqrstuvwxyz{|}~.*/ +/*80*/ 0x20, 0x21, 0x22, 0x23, 0x24, 0x04, 0x06, 0x08, + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x09, 0x0a, 0x14, /*................*/ +/*90*/ 0x30, 0x31, 0x25, 0x33, 0x34, 0x35, 0x36, 0x17, + 0x38, 0x39, 0x3a, 0x3b, 0x1a, 0x1b, 0x3e, 0x5f, /*................*/ +/*a0*/ 0x41, 0xaa, 0xb0, 0xb1, 0x9f, 0xb2, 0xd0, 0xb5, + 0x79, 0xb4, 0x9a, 0x8a, 0xba, 0xca, 0xaf, 0xa1, /*................*/ +/*b0*/ 0x90, 0x8f, 0xea, 0xfa, 0xbe, 0xa0, 0xb6, 0xb3, + 0x9d, 0xda, 0x9b, 0x8b, 0xb7, 0xb8, 0xb9, 0xab, /*................*/ +/*c0*/ 0x64, 0x65, 0x62, 0x66, 0x63, 0x67, 0x9e, 0x68, + 0x74, 0x71, 0x72, 0x73, 0x78, 0x75, 0x76, 0x77, /*................*/ +/*d0*/ 0xac, 0x69, 0xed, 0xee, 0xeb, 0xef, 0xec, 0xbf, + 0x80, 0xe0, 0xfe, 0xdd, 0xfc, 0xad, 0xae, 0x59, /*................*/ +/*e0*/ 0x44, 0x45, 0x42, 0x46, 0x43, 0x47, 0x9c, 0x48, + 0x54, 0x51, 0x52, 0x53, 0x58, 0x55, 0x56, 0x57, /*................*/ +/*f0*/ 0x8c, 0x49, 0xcd, 0xce, 0xcb, 0xcf, 0xcc, 0xe1, + 0x70, 0xc0, 0xde, 0xdb, 0xdc, 0x8d, 0x8e, 0xdf /*................*/ +}; + +/* Translate a memory block from EBCDIC (host charset) to ASCII (net charset) + * dest and srce may be identical, or separate memory blocks, but + * should not overlap. + */ +void +ebcdic2ascii(unsigned char *dest, const unsigned char *srce, size_t count) +{ + while (count-- != 0) { + *dest++ = os_toascii[*srce++]; + } +} +void +ebcdic2ascii_strictly(unsigned char *dest, const unsigned char *srce, size_t count) +{ + while (count-- != 0) { + *dest++ = os_toascii_strictly[*srce++]; + } +} +void +ascii2ebcdic(unsigned char *dest, const unsigned char *srce, size_t count) +{ + while (count-- != 0) { + *dest++ = os_toebcdic[*srce++]; + } +} +#endif /*APR_CHARSET_EBCDIC*/ diff --git a/rubbos/app/httpd-2.0.64/os/bs2000/ebcdic.h b/rubbos/app/httpd-2.0.64/os/bs2000/ebcdic.h new file mode 100644 index 00000000..4ac2f5e3 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/os/bs2000/ebcdic.h @@ -0,0 +1,24 @@ +/* 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. + */ + +#include + +extern const unsigned char os_toascii[256]; +extern const unsigned char os_toebcdic[256]; +void ebcdic2ascii(unsigned char *dest, const unsigned char *srce, size_t count); +void ebcdic2ascii_strictly(unsigned char *dest, const unsigned char *srce, size_t count); +void ascii2ebcdic(unsigned char *dest, const unsigned char *srce, size_t count); + diff --git a/rubbos/app/httpd-2.0.64/os/bs2000/os.c b/rubbos/app/httpd-2.0.64/os/bs2000/os.c new file mode 100644 index 00000000..5afda6db --- /dev/null +++ b/rubbos/app/httpd-2.0.64/os/bs2000/os.c @@ -0,0 +1,34 @@ +/* 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. + */ + +/* + * This file will include OS specific functions which are not inlineable. + * Any inlineable functions should be defined in os-inline.c instead. + */ + +#include "httpd.h" +#include "os.h" + +AP_DECLARE(apr_status_t) ap_os_create_privileged_process( + const request_rec *r, + apr_proc_t *newproc, const char *progname, + const char * const *args, + const char * const *env, + apr_procattr_t *attr, apr_pool_t *p) +{ + return apr_proc_create(newproc, progname, args, env, attr, p); +} + diff --git a/rubbos/app/httpd-2.0.64/os/bs2000/os.h b/rubbos/app/httpd-2.0.64/os/bs2000/os.h new file mode 100644 index 00000000..e6a528f7 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/os/bs2000/os.h @@ -0,0 +1,34 @@ +/* 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. + */ + +#ifndef APACHE_OS_H +#define APACHE_OS_H + +#define PLATFORM "BS2000" + +#include "apr.h" + +/* + * This file in included in all Apache source code. It contains definitions + * of facilities available on _this_ operating system (HAVE_* macros), + * and prototypes of OS specific functions defined in os.c or os-inline.c + */ + +/* Other ap_os_ routines not used by this platform */ + +extern pid_t os_fork(const char *user); + +#endif /*! APACHE_OS_H*/ diff --git a/rubbos/app/httpd-2.0.64/os/config.m4 b/rubbos/app/httpd-2.0.64/os/config.m4 new file mode 100644 index 00000000..70420436 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/os/config.m4 @@ -0,0 +1,26 @@ +AC_MSG_CHECKING(for target platform) + +case $host in +*beos*) + OS="beos" + OS_DIR=$OS + ;; +*pc-os2_emx*) + OS="os2" + OS_DIR=$OS + ;; +bs2000*) + OS="unix" + OS_DIR=bs2000 # only the OS_DIR is platform specific. + ;; +*cygwin*) + OS="cygwin" + OS_DIR="unix" + ;; +*) + OS="unix" + OS_DIR=$OS;; +esac + +AC_MSG_RESULT($OS) +APACHE_FAST_OUTPUT(os/$OS_DIR/Makefile) diff --git a/rubbos/app/httpd-2.0.64/os/netware/Apache.def b/rubbos/app/httpd-2.0.64/os/netware/Apache.def new file mode 100644 index 00000000..6d8bf9f4 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/os/netware/Apache.def @@ -0,0 +1,5 @@ +MODULE APRLIB.NLM +MODULE LIBC.NLM +MODULE WS2_32.NLM +EXPORT @HTTPD.IMP +IMPORT GetCurrentAddressSpace diff --git a/rubbos/app/httpd-2.0.64/os/netware/apache.xdc b/rubbos/app/httpd-2.0.64/os/netware/apache.xdc new file mode 100644 index 0000000000000000000000000000000000000000..12a7f6ba2df41eccb047c2884088c022f9395540 GIT binary patch literal 128 zcmZ>Aba!K7U|?VbVr&2;2Lb{>% + +AP_DECLARE_DATA extern int hold_screen_on_exit; /* Indicates whether the screen should be held open on exit*/ + +#define CASE_BLIND_FILESYSTEM +#define NO_WRITEV + +#define APACHE_MPM_DIR "server/mpm/netware" /* generated on unix */ + +#define getpid NXThreadGetId + +/* Hold the screen open if there is an exit code and the hold_screen_on_exit flag >= 0 or the + hold_screen_on_exit > 0. If the hold_screen_on_exit flag is < 0 then close the screen no + matter what the exit code is. */ +#define exit(s) {if((s||hold_screen_on_exit)&&(hold_screen_on_exit>=0)){pressanykey();}apr_terminate();exit(s);} + +#endif /* ! APACHE_OS_H */ diff --git a/rubbos/app/httpd-2.0.64/os/netware/pre_nw.h b/rubbos/app/httpd-2.0.64/os/netware/pre_nw.h new file mode 100644 index 00000000..da67b3f4 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/os/netware/pre_nw.h @@ -0,0 +1,70 @@ +/* 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. + */ + +#ifndef __pre_nw__ +#define __pre_nw__ + +#include + +#ifndef __GNUC__ +#pragma precompile_target "precomp.mch" +#endif + +#define NETWARE + +#define N_PLAT_NLM + +/* hint for MSL C++ that we're on NetWare platform */ +#define __NETWARE__ + +/* the FAR keyword has no meaning in a 32-bit environment + but is used in the SDK headers so we take it out */ +#define FAR +#define far + +/* no-op for Codewarrior C compiler; a functions are cdecl + by default */ +#define cdecl + +/* if we have wchar_t enabled in C++, predefine this type to avoid + a conflict in Novell's header files */ +#ifndef __GNUC__ +#if (__option(cplusplus) && __option(wchar_type)) +#define _WCHAR_T +#endif +#endif + +/* C9X defintion used by MSL C++ library */ +#define DECIMAL_DIG 17 + +/* some code may want to use the MS convention for long long */ +#ifndef __int64 +#define __int64 long long +#endif + +/* Don't use the DBM rewrite map for mod_rewrite */ +#define NO_DBM_REWRITEMAP + +/* Allow MOD_AUTH_DBM to use APR */ +#define AP_AUTH_DBM_USE_APR + +/* Restrict the number of nested includes */ +#define AP_MAX_INCLUDE_DEPTH 48 + +#endif + + + diff --git a/rubbos/app/httpd-2.0.64/os/netware/util_nw.c b/rubbos/app/httpd-2.0.64/os/netware/util_nw.c new file mode 100644 index 00000000..ef3fbf46 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/os/netware/util_nw.c @@ -0,0 +1,105 @@ +/* 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. + */ + +#include "httpd.h" +#include "http_log.h" + +#include +#include + +int nlmUnloadSignaled(int wait); +event_handle_t eh; +Warn_t ref; +Report_t dum; + +AP_DECLARE(apr_status_t) ap_os_create_privileged_process( + const request_rec *r, + apr_proc_t *newproc, const char *progname, + const char * const *args, + const char * const *env, + apr_procattr_t *attr, apr_pool_t *p) +{ + return apr_proc_create(newproc, progname, args, env, attr, p); +} + +int _NonAppCheckUnload( void ) +{ + return nlmUnloadSignaled(1); +} + +// down server event callback +void ap_down_server_cb(void *, void *) +{ + nlmUnloadSignaled(0); + return; +} + +// Required place holder event callback +void ap_dummy_cb(void *, void *) +{ + return; +} + +// destroy callback resources +void ap_cb_destroy(void *) +{ + // cleanup down event notification + UnRegisterEventNotification(eh); + NX_UNWRAP_INTERFACE(ref); + NX_UNWRAP_INTERFACE(dum); +} + +int _NonAppStart +( + void *NLMHandle, + void *errorScreen, + const char *cmdLine, + const char *loadDirPath, + size_t uninitializedDataLength, + void *NLMFileHandle, + int (*readRoutineP)( int conn, void *fileHandle, size_t offset, + size_t nbytes, size_t *bytesRead, void *buffer ), + size_t customDataOffset, + size_t customDataSize, + int messageCount, + const char **messages +) +{ +#pragma unused(cmdLine) +#pragma unused(loadDirPath) +#pragma unused(uninitializedDataLength) +#pragma unused(NLMFileHandle) +#pragma unused(readRoutineP) +#pragma unused(customDataOffset) +#pragma unused(customDataSize) +#pragma unused(messageCount) +#pragma unused(messages) + + // register for down server event + rtag_t rt = AllocateResourceTag(NLMHandle, "Apache2 Down Server Callback", + EventSignature); + + NX_WRAP_INTERFACE((void *)ap_down_server_cb, 2, (void **)&ref); + NX_WRAP_INTERFACE((void *)ap_dummy_cb, 2, (void **)&dum); + eh = RegisterForEventNotification(rt, EVENT_DOWN_SERVER, + EVENT_PRIORITY_APPLICATION, + ref, dum, NULL); + + // clean-up + NXVmRegisterExitHandler(ap_cb_destroy, NULL); + +} + diff --git a/rubbos/app/httpd-2.0.64/os/os2/.deps b/rubbos/app/httpd-2.0.64/os/os2/.deps new file mode 100644 index 00000000..e69de29b diff --git a/rubbos/app/httpd-2.0.64/os/os2/Makefile b/rubbos/app/httpd-2.0.64/os/os2/Makefile new file mode 100644 index 00000000..1dc8ed6c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/os/os2/Makefile @@ -0,0 +1,10 @@ +top_srcdir = /bottlenecks/rubbos/app/httpd-2.0.64 +top_builddir = /bottlenecks/rubbos/app/httpd-2.0.64 +srcdir = /bottlenecks/rubbos/app/httpd-2.0.64/os/os2 +builddir = /bottlenecks/rubbos/app/httpd-2.0.64/os/os2 +VPATH = /bottlenecks/rubbos/app/httpd-2.0.64/os/os2 + +LTLIBRARY_NAME = libos.la +LTLIBRARY_SOURCES = util_os2.c + +include $(top_srcdir)/build/ltlib.mk diff --git a/rubbos/app/httpd-2.0.64/os/os2/Makefile.in b/rubbos/app/httpd-2.0.64/os/os2/Makefile.in new file mode 100644 index 00000000..fba49727 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/os/os2/Makefile.in @@ -0,0 +1,5 @@ + +LTLIBRARY_NAME = libos.la +LTLIBRARY_SOURCES = util_os2.c + +include $(top_srcdir)/build/ltlib.mk diff --git a/rubbos/app/httpd-2.0.64/os/os2/config.m4 b/rubbos/app/httpd-2.0.64/os/os2/config.m4 new file mode 100644 index 00000000..b62d214e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/os/os2/config.m4 @@ -0,0 +1,3 @@ +if test "$OS" = "os2" ; then + APR_ADDTO(CFLAGS, [-DOS2 -O2]) +fi diff --git a/rubbos/app/httpd-2.0.64/os/os2/core.mk b/rubbos/app/httpd-2.0.64/os/os2/core.mk new file mode 100644 index 00000000..639417e8 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/os/os2/core.mk @@ -0,0 +1,7 @@ +# Some rules for making a shared core dll on OS/2 + +os2core: httpd.dll $(CORE_IMPLIB) + $(LIBTOOL) --mode=link gcc -Zstack 512 $(LDFLAGS) $(EXTRA_LDFLAGS) -o httpd $(CORE_IMPLIB) + +httpd.dll: $(PROGRAM_DEPENDENCIES) $(CORE_IMPLIB) + $(LINK) -Zdll $(EXTRA_LDFLAGS) -s -o $@ server/exports.lo modules.lo $(PROGRAM_DEPENDENCIES) $(AP_LIBS) server/ApacheCoreOS2.def diff --git a/rubbos/app/httpd-2.0.64/os/os2/core_header.def b/rubbos/app/httpd-2.0.64/os/os2/core_header.def new file mode 100644 index 00000000..ec3703a6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/os/os2/core_header.def @@ -0,0 +1,19 @@ +LIBRARY httpd INITINSTANCE +DESCRIPTION "Apache Server Core" +DATA NONSHARED + +EXPORTS + "main" + +; One for mod_dav from socket library + "_swaps" + +; And some more for mod_unique_id + "gethostname" + "gethostbyname" + "_swapl" + "h_errno" + "inet_ntoa" + +; mod_proxy needs this one + "inet_addr" diff --git a/rubbos/app/httpd-2.0.64/os/os2/os.h b/rubbos/app/httpd-2.0.64/os/os2/os.h new file mode 100644 index 00000000..b1307901 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/os/os2/os.h @@ -0,0 +1,33 @@ +/* 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. + */ + +#ifndef APACHE_OS_H +#define APACHE_OS_H + +#define PLATFORM "OS/2" + +/* going away shortly... */ +#define HAVE_DRIVE_LETTERS +#define HAVE_UNC_PATHS +#define CASE_BLIND_FILESYSTEM + +/* + * This file in included in all Apache source code. It contains definitions + * of facilities available on _this_ operating system (HAVE_* macros), + * and prototypes of OS specific functions defined in os.c or os-inline.c + */ + +#endif /* ! APACHE_OS_H */ diff --git a/rubbos/app/httpd-2.0.64/os/os2/util_os2.c b/rubbos/app/httpd-2.0.64/os/os2/util_os2.c new file mode 100644 index 00000000..9156fb39 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/os/os2/util_os2.c @@ -0,0 +1,39 @@ +/* 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. + */ + +#define INCL_DOS +#define INCL_DOSERRORS +#include +#include "ap_config.h" +#include "httpd.h" +#include "http_log.h" +#include "os.h" +#include +#include +#include +#include +#include "apr_strings.h" + + +AP_DECLARE(apr_status_t) ap_os_create_privileged_process( + const request_rec *r, + apr_proc_t *newproc, const char *progname, + const char * const *args, + const char * const *env, + apr_procattr_t *attr, apr_pool_t *p) +{ + return apr_proc_create(newproc, progname, args, env, attr, p); +} diff --git a/rubbos/app/httpd-2.0.64/os/tpf/TPFExport b/rubbos/app/httpd-2.0.64/os/tpf/TPFExport new file mode 100644 index 00000000..449ebf2f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/os/tpf/TPFExport @@ -0,0 +1,7 @@ +#!/bin/sh +echo " Setting TPF/c89 environment variables" +export _C89_CCMODE=1 +# replace the following with the location of your TPF include files +export _C89_INCDIRS="/u/tpf41/currentmaint/include /u/tpf41/currentmaint/include/oco" +export TPF=YES +echo "Done" diff --git a/rubbos/app/httpd-2.0.64/os/tpf/ebcdic.c b/rubbos/app/httpd-2.0.64/os/tpf/ebcdic.c new file mode 100644 index 00000000..6774a31f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/os/tpf/ebcdic.c @@ -0,0 +1,179 @@ +/* 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. + */ + +#include "ap_config.h" +#if APR_CHARSET_EBCDIC +#include "ebcdic.h" +/* +This code does basic character mapping for IBM's TPF operating system. +It is a modified version of 's code for +the BS2000 (apache/src/os/bs2000/ebcdic.c). +*/ + +/* +Bijective EBCDIC (character set IBM-1047) to US-ASCII table: +This apr_table_t is bijective - there are no ambigous or duplicate characters. +*/ +const unsigned char os_toascii_strictly[256] = { + 0x00, 0x01, 0x02, 0x03, 0x85, 0x09, 0x86, 0x7f, /* 00-0f: */ + 0x87, 0x8d, 0x8e, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, /* ................ */ + 0x10, 0x11, 0x12, 0x13, 0x8f, 0x0a, 0x08, 0x97, /* 10-1f: */ + 0x18, 0x19, 0x9c, 0x9d, 0x1c, 0x1d, 0x1e, 0x1f, /* ................ */ + 0x80, 0x81, 0x82, 0x83, 0x84, 0x92, 0x17, 0x1b, /* 20-2f: */ + 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x05, 0x06, 0x07, /* ................ */ + 0x90, 0x91, 0x16, 0x93, 0x94, 0x95, 0x96, 0x04, /* 30-3f: */ + 0x98, 0x99, 0x9a, 0x9b, 0x14, 0x15, 0x9e, 0x1a, /* ................ */ + 0x20, 0xa0, 0xe2, 0xe4, 0xe0, 0xe1, 0xe3, 0xe5, /* 40-4f: */ + 0xe7, 0xf1, 0xa2, 0x2e, 0x3c, 0x28, 0x2b, 0x7c, /* ...........<(+| */ + 0x26, 0xe9, 0xea, 0xeb, 0xe8, 0xed, 0xee, 0xef, /* 50-5f: */ + 0xec, 0xdf, 0x21, 0x24, 0x2a, 0x29, 0x3b, 0x5e, /* &.........!$*);^ */ + 0x2d, 0x2f, 0xc2, 0xc4, 0xc0, 0xc1, 0xc3, 0xc5, /* 60-6f: */ + 0xc7, 0xd1, 0xa6, 0x2c, 0x25, 0x5f, 0x3e, 0x3f, /* -/.........,%_>? */ + 0xf8, 0xc9, 0xca, 0xcb, 0xc8, 0xcd, 0xce, 0xcf, /* 70-7f: */ + 0xcc, 0x60, 0x3a, 0x23, 0x40, 0x27, 0x3d, 0x22, /* .........`:#@'=" */ + 0xd8, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, /* 80-8f: */ + 0x68, 0x69, 0xab, 0xbb, 0xf0, 0xfd, 0xfe, 0xb1, /* .abcdefghi...... */ + 0xb0, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, /* 90-9f: */ + 0x71, 0x72, 0xaa, 0xba, 0xe6, 0xb8, 0xc6, 0xa4, /* .jklmnopqr...... */ + 0xb5, 0x7e, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, /* a0-af: */ + 0x79, 0x7a, 0xa1, 0xbf, 0xd0, 0x5b, 0xde, 0xae, /* .~stuvwxyz...[.. */ + 0xac, 0xa3, 0xa5, 0xb7, 0xa9, 0xa7, 0xb6, 0xbc, /* b0-bf: */ + 0xbd, 0xbe, 0xdd, 0xa8, 0xaf, 0x5d, 0xb4, 0xd7, /* .............].. */ + 0x7b, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, /* c0-cf: */ + 0x48, 0x49, 0xad, 0xf4, 0xf6, 0xf2, 0xf3, 0xf5, /* {ABCDEFGHI...... */ + 0x7d, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, /* d0-df: */ + 0x51, 0x52, 0xb9, 0xfb, 0xfc, 0xf9, 0xfa, 0xff, /* }JKLMNOPQR...... */ + 0x5c, 0xf7, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, /* e0-ef: */ + 0x59, 0x5a, 0xb2, 0xd4, 0xd6, 0xd2, 0xd3, 0xd5, /* \.STUVWXYZ...... */ + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* f0-ff: */ + 0x38, 0x39, 0xb3, 0xdb, 0xdc, 0xd9, 0xda, 0x9f /* 0123456789...... */ +}; + +/* +Server EBCDIC (character set IBM-1047) to US-ASCII table: +This apr_table_t is a copy of the os_toascii_strictly bijective apr_table_t above. +The only change is that hex 0a (\012 octal) is mapped to hex 0a +(ASCII's line feed) instead of hex 8e. This is done because throughout +Apache, protocol string definitions hardcode the linefeed as \012 (octal): +"Content-Type: text/plain\015\012". Without this kludge all protocol +string definitions would need to be changed from ...\012 to ...\025. +*/ +const unsigned char os_toascii[256] = { + 0x00, 0x01, 0x02, 0x03, 0x85, 0x09, 0x86, 0x7f, /* 00-0f: */ + 0x87, 0x8d, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, /* ................ */ + 0x10, 0x11, 0x12, 0x13, 0x8f, 0x0a, 0x08, 0x97, /* 10-1f: */ + 0x18, 0x19, 0x9c, 0x9d, 0x1c, 0x1d, 0x1e, 0x1f, /* ................ */ + 0x80, 0x81, 0x82, 0x83, 0x84, 0x92, 0x17, 0x1b, /* 20-2f: */ + 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x05, 0x06, 0x07, /* ................ */ + 0x90, 0x91, 0x16, 0x93, 0x94, 0x95, 0x96, 0x04, /* 30-3f: */ + 0x98, 0x99, 0x9a, 0x9b, 0x14, 0x15, 0x9e, 0x1a, /* ................ */ + 0x20, 0xa0, 0xe2, 0xe4, 0xe0, 0xe1, 0xe3, 0xe5, /* 40-4f: */ + 0xe7, 0xf1, 0xa2, 0x2e, 0x3c, 0x28, 0x2b, 0x7c, /* ...........<(+| */ + 0x26, 0xe9, 0xea, 0xeb, 0xe8, 0xed, 0xee, 0xef, /* 50-5f: */ + 0xec, 0xdf, 0x21, 0x24, 0x2a, 0x29, 0x3b, 0x5e, /* &.........!$*);^ */ + 0x2d, 0x2f, 0xc2, 0xc4, 0xc0, 0xc1, 0xc3, 0xc5, /* 60-6f: */ + 0xc7, 0xd1, 0xa6, 0x2c, 0x25, 0x5f, 0x3e, 0x3f, /* -/.........,%_>? */ + 0xf8, 0xc9, 0xca, 0xcb, 0xc8, 0xcd, 0xce, 0xcf, /* 70-7f: */ + 0xcc, 0x60, 0x3a, 0x23, 0x40, 0x27, 0x3d, 0x22, /* .........`:#@'=" */ + 0xd8, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, /* 80-8f: */ + 0x68, 0x69, 0xab, 0xbb, 0xf0, 0xfd, 0xfe, 0xb1, /* .abcdefghi...... */ + 0xb0, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, /* 90-9f: */ + 0x71, 0x72, 0xaa, 0xba, 0xe6, 0xb8, 0xc6, 0xa4, /* .jklmnopqr...... */ + 0xb5, 0x7e, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, /* a0-af: */ + 0x79, 0x7a, 0xa1, 0xbf, 0xd0, 0x5b, 0xde, 0xae, /* .~stuvwxyz...[.. */ + 0xac, 0xa3, 0xa5, 0xb7, 0xa9, 0xa7, 0xb6, 0xbc, /* b0-bf: */ + 0xbd, 0xbe, 0xdd, 0xa8, 0xaf, 0x5d, 0xb4, 0xd7, /* .............].. */ + 0x7b, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, /* c0-cf: */ + 0x48, 0x49, 0xad, 0xf4, 0xf6, 0xf2, 0xf3, 0xf5, /* {ABCDEFGHI...... */ + 0x7d, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, /* d0-df: */ + 0x51, 0x52, 0xb9, 0xfb, 0xfc, 0xf9, 0xfa, 0xff, /* }JKLMNOPQR...... */ + 0x5c, 0xf7, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, /* e0-ef: */ + 0x59, 0x5a, 0xb2, 0xd4, 0xd6, 0xd2, 0xd3, 0xd5, /* \.STUVWXYZ...... */ + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, /* f0-ff: */ + 0x38, 0x39, 0xb3, 0xdb, 0xdc, 0xd9, 0xda, 0x9f /* 0123456789...... */ +}; + +/* +The US-ASCII to EBCDIC (character set IBM-1047) table: +This apr_table_t is bijective (no ambiguous or duplicate characters) +*/ +const unsigned char os_toebcdic[256] = { + 0x00, 0x01, 0x02, 0x03, 0x37, 0x2d, 0x2e, 0x2f, /* 00-0f: */ + 0x16, 0x05, 0x15, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, /* ................ */ + 0x10, 0x11, 0x12, 0x13, 0x3c, 0x3d, 0x32, 0x26, /* 10-1f: */ + 0x18, 0x19, 0x3f, 0x27, 0x1c, 0x1d, 0x1e, 0x1f, /* ................ */ + 0x40, 0x5a, 0x7f, 0x7b, 0x5b, 0x6c, 0x50, 0x7d, /* 20-2f: */ + 0x4d, 0x5d, 0x5c, 0x4e, 0x6b, 0x60, 0x4b, 0x61, /* !"#$%&'()*+,-./ */ + 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, /* 30-3f: */ + 0xf8, 0xf9, 0x7a, 0x5e, 0x4c, 0x7e, 0x6e, 0x6f, /* 0123456789:;<=>? */ + 0x7c, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, /* 40-4f: */ + 0xc8, 0xc9, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, /* @ABCDEFGHIJKLMNO */ + 0xd7, 0xd8, 0xd9, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, /* 50-5f: */ + 0xe7, 0xe8, 0xe9, 0xad, 0xe0, 0xbd, 0x5f, 0x6d, /* PQRSTUVWXYZ[\]^_ */ + 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, /* 60-6f: */ + 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, /* `abcdefghijklmno */ + 0x97, 0x98, 0x99, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, /* 70-7f: */ + 0xa7, 0xa8, 0xa9, 0xc0, 0x4f, 0xd0, 0xa1, 0x07, /* pqrstuvwxyz{|}~. */ + 0x20, 0x21, 0x22, 0x23, 0x24, 0x04, 0x06, 0x08, /* 80-8f: */ + 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x09, 0x0a, 0x14, /* ................ */ + 0x30, 0x31, 0x25, 0x33, 0x34, 0x35, 0x36, 0x17, /* 90-9f: */ + 0x38, 0x39, 0x3a, 0x3b, 0x1a, 0x1b, 0x3e, 0xff, /* ................ */ + 0x41, 0xaa, 0x4a, 0xb1, 0x9f, 0xb2, 0x6a, 0xb5, /* a0-af: */ + 0xbb, 0xb4, 0x9a, 0x8a, 0xb0, 0xca, 0xaf, 0xbc, /* ................ */ + 0x90, 0x8f, 0xea, 0xfa, 0xbe, 0xa0, 0xb6, 0xb3, /* b0-bf: */ + 0x9d, 0xda, 0x9b, 0x8b, 0xb7, 0xb8, 0xb9, 0xab, /* ................ */ + 0x64, 0x65, 0x62, 0x66, 0x63, 0x67, 0x9e, 0x68, /* c0-cf: */ + 0x74, 0x71, 0x72, 0x73, 0x78, 0x75, 0x76, 0x77, /* ................ */ + 0xac, 0x69, 0xed, 0xee, 0xeb, 0xef, 0xec, 0xbf, /* d0-df: */ + 0x80, 0xfd, 0xfe, 0xfb, 0xfc, 0xba, 0xae, 0x59, /* ................ */ + 0x44, 0x45, 0x42, 0x46, 0x43, 0x47, 0x9c, 0x48, /* e0-ef: */ + 0x54, 0x51, 0x52, 0x53, 0x58, 0x55, 0x56, 0x57, /* ................ */ + 0x8c, 0x49, 0xcd, 0xce, 0xcb, 0xcf, 0xcc, 0xe1, /* f0-ff: */ + 0x70, 0xdd, 0xde, 0xdb, 0xdc, 0x8d, 0x8e, 0xdf /* ................ */ +}; + +/* Translate a memory block from EBCDIC (host charset) to ASCII (net charset) + * dest and srce may be identical, or separate memory blocks, but + * should not overlap. + */ +void +ebcdic2ascii(void *dest, const void *srce, size_t count) +{ + unsigned char *udest = dest; + const unsigned char *usrce = srce; + while (count-- != 0) { + *udest++ = os_toascii[*usrce++]; + } +} +void +ebcdic2ascii_strictly(unsigned char *dest, const unsigned char *srce, size_t count) +{ + while (count-- != 0) { + *dest++ = os_toascii_strictly[*srce++]; + } +} +void +ascii2ebcdic(void *dest, const void *srce, size_t count) +{ + unsigned char *udest = dest; + const unsigned char *usrce = srce; + + while (count-- != 0) { + *udest++ = os_toebcdic[*usrce++]; + } +} +#endif /*APR_CHARSET_EBCDIC*/ + diff --git a/rubbos/app/httpd-2.0.64/os/tpf/ebcdic.h b/rubbos/app/httpd-2.0.64/os/tpf/ebcdic.h new file mode 100644 index 00000000..1af4825d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/os/tpf/ebcdic.h @@ -0,0 +1,24 @@ +/* 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. + */ + +#include + +extern const unsigned char os_toascii[256]; +extern const unsigned char os_toebcdic[256]; +void ebcdic2ascii(void *dest, const void *srce, size_t count); +void ebcdic2ascii_strictly(unsigned char *dest, const unsigned char *srce, size_t count); +void ascii2ebcdic(void *dest, const void *srce, size_t count); + diff --git a/rubbos/app/httpd-2.0.64/os/tpf/os.c b/rubbos/app/httpd-2.0.64/os/tpf/os.c new file mode 100644 index 00000000..ff46b551 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/os/tpf/os.c @@ -0,0 +1,132 @@ +/* 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. + */ + +/* + * This file will include OS specific functions which are not inlineable. + * Any inlineable functions should be defined in os-inline.c instead. + */ + +#include "httpd.h" +#include "http_core.h" +#include "os.h" +#include "scoreboard.h" +#include "http_log.h" + +static FILE *sock_fp; + +#ifndef __PIPE_ +int pipe(int fildes[2]) +{ + errno = ENOSYS; + return(-1); +} +#endif + +/* fork and exec functions are not defined on + TPF due to the implementation of tpf_fork() */ + +pid_t fork(void) +{ + errno = ENOSYS; + return(-1); +} + +int execl(const char *path, const char *arg0, ...) +{ + errno = ENOSYS; + return(-1); +} + +int execle(const char *path, const char *arg0, ...) +{ + errno = ENOSYS; + return(-1); +} + +int execve(const char *path, char *const argv[], char *const envp[]) +{ + errno = ENOSYS; + return(-1); +} + +int execvp(const char *file, char *const argv[]) +{ + errno = ENOSYS; + return(-1); +} + + +pid_t os_fork(server_rec *s, int slot) +{ + struct tpf_fork_input fork_input; + APACHE_TPF_INPUT input_parms; + int count; + listen_rec *lr; + + fflush(stdin); + if (dup2(fileno(sock_fp), STDIN_FILENO) == -1) + ap_log_error(APLOG_MARK, APLOG_CRIT, errno, s, + "unable to replace stdin with sock device driver"); + fflush(stdout); + if (dup2(fileno(sock_fp), STDOUT_FILENO) == -1) + ap_log_error(APLOG_MARK, APLOG_CRIT, errno, s, + "unable to replace stdout with sock device driver"); + input_parms.generation = ap_my_generation; + input_parms.scoreboard_heap = ap_scoreboard_image; + + lr = ap_listeners; + count = 0; + do { + input_parms.listeners[count] = lr->fd; + lr = lr->next; + count++; + } while(lr != ap_listeners); + + input_parms.slot = slot; + input_parms.restart_time = ap_restart_time; + fork_input.ebw_data = &input_parms; + fork_input.program = ap_server_argv0; + fork_input.prog_type = TPF_FORK_NAME; + fork_input.istream = TPF_FORK_IS_BALANCE; + fork_input.ebw_data_length = sizeof(input_parms); + fork_input.parm_data = "-x"; + return tpf_fork(&fork_input); +} + +int os_check_server(char *server) { +#ifndef USE_TPF_DAEMON + int rv; + int *current_acn; + if((rv = inetd_getServerStatus(server)) == INETD_SERVER_STATUS_INACTIVE) + return 1; + else { + current_acn = (int *)cinfc_fast(CINFC_CMMACNUM); + if(ecbp2()->ce2acn != *current_acn) + return 1; + } +#endif + return 0; +} + +AP_DECLARE(apr_status_t) ap_os_create_privileged_process( + const request_rec *r, + apr_proc_t *newproc, const char *progname, + const char * const *args, + const char * const *env, + apr_procattr_t *attr, apr_pool_t *p) +{ + return apr_proc_create(newproc, progname, args, env, attr, p); +} diff --git a/rubbos/app/httpd-2.0.64/os/tpf/os.h b/rubbos/app/httpd-2.0.64/os/tpf/os.h new file mode 100644 index 00000000..b6cdcec2 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/os/tpf/os.h @@ -0,0 +1,87 @@ +/* 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. + */ + +#ifndef APACHE_OS_H +#define APACHE_OS_H + +#define PLATFORM "TPF" + +#ifdef errno +#undef errno +#endif + +/* + * This file in included in all Apache source code. It contains definitions + * of facilities available on _this_ operating system (HAVE_* macros), + * and prototypes of OS specific functions defined in os.c or os-inline.c + */ + +#include "apr.h" +#include "ap_config.h" +#include +#ifndef __strings_h + +#define FD_SETSIZE 2048 + +typedef long fd_mask; + +#define NBBY 8 /* number of bits in a byte */ +#define NFDBITS (sizeof(fd_mask) * NBBY) +#define howmany(x, y) (((x)+((y)-1))/(y)) + +typedef struct fd_set { + fd_mask fds_bits [howmany(FD_SETSIZE, NFDBITS)]; +} fd_set; + +#define FD_CLR(n, p)((p)->fds_bits[(n)/NFDBITS] &= ~(1 << ((n) % NFDBITS))) +#define FD_ISSET(n, p)((p)->fds_bits[(n)/NFDBITS] & (1 <<((n) % NFDBITS))) +#define FD_ZERO(p) memset((char *)(p), 0, sizeof(*(p))) +#endif + +#ifdef FD_SET +#undef FD_SET +#define FD_SET(n, p) (0) +#endif + +#include +struct apache_input { + INETD_SERVER_INPUT inetd_server; + void *scoreboard_heap; /* scoreboard system heap address */ + int scoreboard_fd; /* scoreboard file descriptor */ + int slot; /* child number */ + int generation; /* server generation number */ + int listeners[10]; + time_t restart_time; +}; + +typedef struct apache_input APACHE_TPF_INPUT; + +extern int tpf_child; + +struct server_rec; +pid_t os_fork(struct server_rec *s, int slot); +int os_check_server(char *server); + +extern char *ap_server_argv0; +extern int scoreboard_fd; +#include +#ifndef SIGPIPE +#define SIGPIPE 14 +#endif +#ifdef NSIG +#undef NSIG +#endif +#endif /*! APACHE_OS_H*/ diff --git a/rubbos/app/httpd-2.0.64/os/tpf/samples/linkdll.jcl b/rubbos/app/httpd-2.0.64/os/tpf/samples/linkdll.jcl new file mode 100644 index 00000000..16524bf3 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/os/tpf/samples/linkdll.jcl @@ -0,0 +1,121 @@ +//APACH JOB MSGLEVEL=(1,1),CLASS=A,MSGCLASS=A +/*ROUTE PRINT XXXXXX.XXXXXX +/*ROUTE PUNCH XXXXXX.XXXXXX +/*NOTIFY XXXXXX.XXXXXX +//CCLE JCLLIB ORDER=(SYS1.CBC.SCBCPRC,SYS1.CEE.SCEEPROC) +//PRELINK EXEC EDCPL,COND.LKED=(0,NE), +// PPARM='OMVS,DLLNAME(pppp)', +// LREGSIZ='2048K', +// LPARM='AMODE=31,RMODE=ANY,LIST,XREF' +//PLKED.SYSLIB DD DISP=SHR,DSN=FSE0000.DEVP.STUB.OB +// DD DISP=SHR,DSN=FSE0000.DEVP.CLIB.OB +// DD DISP=SHR,DSN=ACP.CLIB.RLSE46.WEB +// DD DISP=SHR,DSN=ACP.STUB.RLSE46.WEB +// DD DISP=SHR,DSN=ACP.CLIB.RLSE40 +// DD DISP=SHR,DSN=ACP.STUB.RLSE40 +//PLKED.SYSDEFSD DD DSN=APA0000.DEVP.IMPORTS.DSD(ppppvv),DISP=SHR +//PLKED.DSD DD DSN=APA0000.DEVP.IMPORTS.DSD,DISP=SHR +//PLKED.OBJLIB DD DISP=SHR,DSN=FSE0000.DEVP.TEST.OB +// DD DISP=SHR,DSN=ACP.OBJ.RLSE46.WEB +// DD DISP=SHR,DSN=ACP.OBJ.INTG98.NBS +// DD DISP=SHR,DSN=ACP.MAIN.SYST.OBBSS +// DD DISP=SHR,DSN=ACP.DF.MAIN.SYST.OBBSS +// DD DISP=SHR,DSN=ACP.OBJ.RLSE40.BSS +//PLKED.OBJ1 DD PATH='/usr/local/apache/src/ap/ap_cpystrn.o' +//PLKED.OBJ2 DD PATH='/usr/local/apache/src/ap/ap_execve.o' +//PLKED.OBJ3 DD PATH='/usr/local/apache/src/ap/ap_signal.o' +//PLKED.OBJ4 DD PATH='/usr/local/apache/src/ap/ap_slack.o' +//PLKED.OBJ5 DD PATH='/usr/local/apache/src/ap/ap_snprintf.o' +//PLKED.OBJ6 DD PATH='/usr/local/apache/src/ap/ap_strings.o' +//PLKED.OBJ7 DD PATH='/usr/local/apache/src/os/tpf/ebcdic.o' +//PLKED.OBJ8 DD PATH='/usr/local/apache/src/os/tpf/os.o' +//PLKED.OBJ9 DD PATH='/usr/local/apache/src/os/tpf/os-inline.o' +//PLKED.OBJ10 DD PATH='/usr/local/apache/src/regex/regcomp.o' +//PLKED.OBJ11 DD PATH='/usr/local/apache/src/regex/regerror.o' +//PLKED.OBJ12 DD PATH='/usr/local/apache/src/regex/regexec.o' +//PLKED.OBJ13 DD PATH='/usr/local/apache/src/regex/regfree.o' +//PLKED.OBJ14 DD PATH='/usr/local/apache/src/main/alloc.o' +//PLKED.OBJ15 DD PATH='/usr/local/apache/src/main/buff.o' +//PLKED.OBJ16 DD PATH='/usr/local/apache/src/main/fnmatch.o' +//PLKED.OBJ17 DD PATH='/usr/local/apache/src/main/http_config.o' +//PLKED.OBJ18 DD PATH='/usr/local/apache/src/main/http_core.o' +//PLKED.OBJ19 DD PATH='/usr/local/apache/src/main/http_log.o' +//PLKED.OBJ20 DD PATH='/usr/local/apache/src/main/http_main.o' +//PLKED.OBJ21 DD PATH='/usr/local/apache/src/main/http_protocol.o' +//PLKED.OBJ22 DD PATH='/usr/local/apache/src/main/http_request.o' +//PLKED.OBJ23 DD PATH='/usr/local/apache/src/main/http_vhost.o' +//PLKED.OBJ24 DD PATH='/usr/local/apache/src/main/md5c.o' +//PLKED.OBJ25 DD PATH='/usr/local/apache/src/main/rfc1413.o' +//PLKED.OBJ26 DD PATH='/usr/local/apache/src/main/util.o' +//PLKED.OBJ27 DD PATH='/usr/local/apache/src/main/util_date.o' +//PLKED.OBJ28 DD PATH='/usr/local/apache/src/main/util_md5.o' +//PLKED.OBJ29 DD PATH='/usr/local/apache/src/main/util_script.o' +//PLKED.OBJ30 DD PATH='/usr/local/apache/src/main/util_uri.o' +//PLKED.OBJ31 DD PATH='/usr/local/apache/src/modules.o' +//PLKED.OBJ32 DD PATH='/usr/local/apache/src/buildmark.o' +//PLKED.OBJ33 DD PATH='/usr/local/apache/src/modules/standard/mod_auto\ +// index.o' +//PLKED.OBJ34 DD PATH='/usr/local/apache/src/modules/standard/mod_dir.\ +// o' +//PLKED.OBJ35 DD PATH='/usr/local/apache/src/modules/standard/mod_mime\ +// .o' +//PLKED.OBJ36 DD PATH='/usr/local/apache/src/modules/standard/mod_sete\ +// nvif.o' +//PLKED.OBJ37 DD PATH='/usr/local/apache/src/modules/standard/mod_alia\ +// s.o' +//PLKED.OBJ38 DD PATH='/usr/local/apache/src/modules/standard/mod_acce\ +// ss.o' +//PLKED.OBJ39 DD PATH='/usr/local/apache/src/modules/standard/mod_user\ +// dir.o' +//PLKED.OBJ40 DD PATH='/usr/local/apache/src/modules/standard/mod_spel\ +// ing.o' +//PLKED.OBJ41 DD PATH='/usr/local/apache/src/modules/standard/mod_nego\ +// tiation.o' +//PLKED.SYSIN DD * + ORDER @@DLMHDR + INCLUDE OBJLIB(CSTRTD40) + INCLUDE OBJ1 + INCLUDE OBJ2 + INCLUDE OBJ3 + INCLUDE OBJ4 + INCLUDE OBJ5 + INCLUDE OBJ6 + INCLUDE OBJ7 + INCLUDE OBJ8 + INCLUDE OBJ9 + INCLUDE OBJ10 + INCLUDE OBJ11 + INCLUDE OBJ12 + INCLUDE OBJ13 + INCLUDE OBJ14 + INCLUDE OBJ15 + INCLUDE OBJ16 + INCLUDE OBJ17 + INCLUDE OBJ18 + INCLUDE OBJ19 + INCLUDE OBJ20 + INCLUDE OBJ21 + INCLUDE OBJ22 + INCLUDE OBJ23 + INCLUDE OBJ24 + INCLUDE OBJ25 + INCLUDE OBJ26 + INCLUDE OBJ27 + INCLUDE OBJ28 + INCLUDE OBJ29 + INCLUDE OBJ30 + INCLUDE OBJ31 + INCLUDE OBJ32 + INCLUDE OBJ33 + INCLUDE OBJ34 + INCLUDE OBJ35 + INCLUDE OBJ36 + INCLUDE OBJ37 + INCLUDE OBJ38 + INCLUDE OBJ39 + INCLUDE OBJ40 + INCLUDE OBJ41 +/* +//*** WARNING *** NEVER change .LK to .OB in SYSLMOD!!! +//LKED.SYSLMOD DD DISP=OLD,DSN=xxxxxx.xxxx(ppppvv) +// diff --git a/rubbos/app/httpd-2.0.64/os/tpf/samples/loadset.jcl b/rubbos/app/httpd-2.0.64/os/tpf/samples/loadset.jcl new file mode 100644 index 00000000..405af828 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/os/tpf/samples/loadset.jcl @@ -0,0 +1,58 @@ +//OLDRWEB JOB MSGLEVEL=1,CLASS=A,MSGCLASS=S +//JOBCAT DD DSN=ICFCAT.ESAWK2,DISP=SHR +/*ROUTE PRINT xxxxxx.xxxxxxx +/*ROUTE PUNCH xxxxxx.xxxxxxx +//TLDR EXEC PGM=TPFLDRCA,REGION=8M, +// PARM='OLDR,SYS=ACP,CLMSIZE=8000000' +//STEPLIB DD DSN=ACP.LINK.RLSE46.WEB,DISP=SHR +// DD DSN=ACP.LINK.RLSE40.BSS,DISP=SHR +// DD DSN=VIS0000.DEVP.TEST.LK,DISP=SHR +// DD DSN=SYS1.CEE.SCEERUN,DISP=SHR +//SALTB DD DSN=ACP.SALTBL.RLSE46.WEB,DISP=SHR +// DD DSN=ACP.SALTBL.INTG46.WEB,DISP=SHR +//OBJLIB DD DSN=FSE0000.DEVP.TEST.OB,DISP=SHR +// DD DSN=APA0000.DEVP.TEST.OB,DISP=SHR +// DD DSN=ACP.DRVE.TEST.OB,DISP=SHR +// DD DSN=ACP.OBJ.RLSE46.WEB,DISP=SHR +// DD DSN=ACP.OBJ.INTG36.DRV,DISP=SHR +// DD DSN=ACP.OBJ.INTG46.WEB,DISP=SHR +// DD DSN=ACP.OBJ.INTG40.BSS,DISP=SHR +//LOADMOD DD DSN=FSE0000.DEVP.TEST.LK,DISP=SHR +// DD DSN=APA0000.DEVP.TEST.LK,DISP=SHR +// DD DSN=CWEISS.LINK,DISP=SHR +// DD DSN=ACP.DRVE.TEST.LK,DISP=SHR +// DD DSN=ACP.LINK.RLSE46.WEB,DISP=SHR +// DD DSN=ACP.LINK.INTG98.NBS,DISP=SHR +// DD DSN=ACP.LINK.INTG46.WEB,DISP=SHR +// DD DSN=ACP.LINK.INTG36.DRV,DISP=SHR +// DD DSN=ACP.LINK.INTG40.BSS,DISP=SHR +//LOADSUM DD DSN=&&LOADSUM,DISP=(NEW,PASS),UNIT=SYSDA, +// LRECL=133,SPACE=(TRK,(10,10)),RECFM=FBA +//CPRTEMP DD UNIT=SYSDA, +// DSN=&&CPRTEMP,SPACE=(TRK,(100,20)), +// DCB=(RECFM=FB,BLKSIZE=4095,LRECL=4095), +// DISP=(NEW,DELETE) +//PROGTEMP DD UNIT=SYSDA, +// DSN=&&PRTEMP,SPACE=(TRK,(100,20)), +// DCB=(RECFM=FB,BLKSIZE=4095,LRECL=4095), +// DISP=(NEW,DELETE) +//OUTPUT DD DSN=&&VRDROUT,DISP=(NEW,PASS),UNIT=SYSDA, +// DCB=(RECFM=F,BLKSIZE=4095,LRECL=4095) +//SYSUDUMP DD DUMMY +//SYSABEND DD DUMMY +//SYSOUT DD SYSOUT=A +//SYSPRINT DD SYSOUT=A +//PRINTER DD SYSOUT=A +//CEEDUMP DD SYSOUT=A +//SYSIN DD * +SYSID=BSS +PATVERS=NONE +SALVERS=40 +LOADER LOADSET lllllll +LOADER CALL PROG ppppvv +/* +//TRANSMIT EXEC PGM=IKJEFT01, +// PARM='TRANSMIT xxxxxx.xxxxxx DDNAME(SYSTSIN) NOLOG NONOTIFY SEQ' +//SYSTSIN DD UNIT=SYSDA, +// DSN=&&VRDROUT,DISP=(OLD,DELETE) +//SYSTSPRT DD DUMMY diff --git a/rubbos/app/httpd-2.0.64/os/unix/.deps b/rubbos/app/httpd-2.0.64/os/unix/.deps new file mode 100644 index 00000000..e69de29b diff --git a/rubbos/app/httpd-2.0.64/os/unix/.libs/libos.a b/rubbos/app/httpd-2.0.64/os/unix/.libs/libos.a new file mode 100644 index 0000000000000000000000000000000000000000..a01bda607803acd485224c4456c86e747318ac83 GIT binary patch literal 58996 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 t3Ys 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 Nf8}{Fg3EgM{{YNIT2}x7 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/os/unix/.libs/libos.la b/rubbos/app/httpd-2.0.64/os/unix/.libs/libos.la new file mode 100644 index 00000000..1563fee7 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/os/unix/.libs/libos.la @@ -0,0 +1,35 @@ +# libos.la - a libtool library file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='' + +# Names of this library. +library_names='' + +# The name of the static archive. +old_library='libos.a' + +# Libraries that this one depends upon. +dependency_libs=' -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib' + +# Version information for libos. +current= +age= +revision= + +# Is this an already installed library? +installed=no + +# Should we warn about portability when linking against -modules? +shouldnotlink=no + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='' diff --git a/rubbos/app/httpd-2.0.64/os/unix/.libs/unixd.o b/rubbos/app/httpd-2.0.64/os/unix/.libs/unixd.o new file mode 100644 index 0000000000000000000000000000000000000000..2b69a692e525bb3e1a970af7f2fe23b3f1061f69 GIT binary patch literal 58528 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 +#endif +#ifdef HAVE_SYS_RESOURCE_H +#include +#endif +/* XXX */ +#include +#ifdef HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_GRP_H +#include +#endif +#ifdef HAVE_STRINGS_H +#include +#endif +#ifdef HAVE_SYS_SEM_H +#include +#endif +#ifdef HAVE_SYS_PRCTL_H +#include +#endif + +unixd_config_rec unixd_config; + +/* Set group privileges. + * + * Note that we use the username as set in the config files, rather than + * the lookup of to uid --- the same uid may have multiple passwd entries, + * with different sets of groups for each. + */ + +static int set_group_privs(void) +{ + if (!geteuid()) { + const char *name; + + /* Get username if passed as a uid */ + + if (unixd_config.user_name[0] == '#') { + struct passwd *ent; + uid_t uid = atoi(&unixd_config.user_name[1]); + + if ((ent = getpwuid(uid)) == NULL) { + ap_log_error(APLOG_MARK, APLOG_ALERT, errno, NULL, + "getpwuid: couldn't determine user name from uid %u, " + "you probably need to modify the User directive", + (unsigned)uid); + return -1; + } + + name = ent->pw_name; + } + else + name = unixd_config.user_name; + +#if !defined(OS2) && !defined(TPF) + /* OS/2 and TPF don't support groups. */ + + /* + * Set the GID before initgroups(), since on some platforms + * setgid() is known to zap the group list. + */ + if (setgid(unixd_config.group_id) == -1) { + ap_log_error(APLOG_MARK, APLOG_ALERT, errno, NULL, + "setgid: unable to set group id to Group %u", + (unsigned)unixd_config.group_id); + return -1; + } + + /* Reset `groups' attributes. */ + + if (initgroups(name, unixd_config.group_id) == -1) { + ap_log_error(APLOG_MARK, APLOG_ALERT, errno, NULL, + "initgroups: unable to set groups for User %s " + "and Group %u", name, (unsigned)unixd_config.group_id); + return -1; + } +#endif /* !defined(OS2) && !defined(TPF) */ + } + return 0; +} + + +AP_DECLARE(int) unixd_setup_child(void) +{ + if (set_group_privs()) { + return -1; + } +#ifdef MPE + /* Only try to switch if we're running as MANAGER.SYS */ + if (geteuid() == 1 && unixd_config.user_id > 1) { + GETPRIVMODE(); + if (setuid(unixd_config.user_id) == -1) { + GETUSERMODE(); + ap_log_error(APLOG_MARK, APLOG_ALERT, errno, NULL, + "setuid: unable to change to uid: %ld", + (long) unixd_config.user_id); + exit(1); + } + GETUSERMODE(); + } +#else + /* Only try to switch if we're running as root */ + if (!geteuid() && ( +#ifdef _OSD_POSIX + os_init_job_environment(server_conf, unixd_config.user_name, one_process) != 0 || +#endif + setuid(unixd_config.user_id) == -1)) { + ap_log_error(APLOG_MARK, APLOG_ALERT, errno, NULL, + "setuid: unable to change to uid: %ld", + (long) unixd_config.user_id); + return -1; + } +#if defined(HAVE_PRCTL) && defined(PR_SET_DUMPABLE) + /* this applies to Linux 2.4+ */ +#ifdef AP_MPM_WANT_SET_COREDUMPDIR + if (ap_coredumpdir_configured) { + if (prctl(PR_SET_DUMPABLE, 1)) { + ap_log_error(APLOG_MARK, APLOG_ALERT, errno, NULL, + "set dumpable failed - this child will not coredump" + " after software errors"); + } + } +#endif +#endif +#endif + return 0; +} + + +AP_DECLARE(const char *) unixd_set_user(cmd_parms *cmd, void *dummy, + const char *arg) +{ + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + unixd_config.user_name = arg; + unixd_config.user_id = ap_uname2id(arg); +#if !defined (BIG_SECURITY_HOLE) && !defined (OS2) + if (unixd_config.user_id == 0) { + return "Error:\tApache has not been designed to serve pages while\n" + "\trunning as root. There are known race conditions that\n" + "\twill allow any local user to read any file on the system.\n" + "\tIf you still desire to serve pages as root then\n" + "\tadd -DBIG_SECURITY_HOLE to the CFLAGS env variable\n" + "\tand then rebuild the server.\n" + "\tIt is strongly suggested that you instead modify the User\n" + "\tdirective in your httpd.conf file to list a non-root\n" + "\tuser.\n"; + } +#endif + + return NULL; +} + +AP_DECLARE(const char *) unixd_set_group(cmd_parms *cmd, void *dummy, + const char *arg) +{ + const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); + if (err != NULL) { + return err; + } + + unixd_config.group_id = ap_gname2id(arg); + + return NULL; +} + +AP_DECLARE(void) unixd_pre_config(apr_pool_t *ptemp) +{ + apr_finfo_t wrapper; + + unixd_config.user_name = DEFAULT_USER; + unixd_config.user_id = ap_uname2id(DEFAULT_USER); + unixd_config.group_id = ap_gname2id(DEFAULT_GROUP); + + /* Check for suexec */ + unixd_config.suexec_enabled = 0; + if ((apr_stat(&wrapper, SUEXEC_BIN, + APR_FINFO_NORM, ptemp)) != APR_SUCCESS) { + return; + } + +/* since APR 0.9.5 */ +#ifdef APR_USETID + if ((wrapper.protection & APR_USETID) && wrapper.user == 0) { +#endif + unixd_config.suexec_enabled = 1; +#ifdef APR_USETID + } +#endif +} + + +AP_DECLARE(void) unixd_set_rlimit(cmd_parms *cmd, struct rlimit **plimit, + const char *arg, const char * arg2, int type) +{ +#if (defined(RLIMIT_CPU) || defined(RLIMIT_DATA) || defined(RLIMIT_VMEM) || defined(RLIMIT_NPROC) || defined(RLIMIT_AS)) && APR_HAVE_STRUCT_RLIMIT && APR_HAVE_GETRLIMIT + char *str; + struct rlimit *limit; + /* If your platform doesn't define rlim_t then typedef it in ap_config.h */ + rlim_t cur = 0; + rlim_t max = 0; + + *plimit = (struct rlimit *)apr_pcalloc(cmd->pool, sizeof(**plimit)); + limit = *plimit; + if ((getrlimit(type, limit)) != 0) { + *plimit = NULL; + ap_log_error(APLOG_MARK, APLOG_ERR, errno, cmd->server, + "%s: getrlimit failed", cmd->cmd->name); + return; + } + + if ((str = ap_getword_conf(cmd->pool, &arg))) { + if (!strcasecmp(str, "max")) { + cur = limit->rlim_max; + } + else { + cur = atol(str); + } + } + else { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, cmd->server, + "Invalid parameters for %s", cmd->cmd->name); + return; + } + + if (arg2 && (str = ap_getword_conf(cmd->pool, &arg2))) { + max = atol(str); + } + + /* if we aren't running as root, cannot increase max */ + if (geteuid()) { + limit->rlim_cur = cur; + if (max) { + ap_log_error(APLOG_MARK, APLOG_ERR, 0, cmd->server, + "Must be uid 0 to raise maximum %s", cmd->cmd->name); + } + } + else { + if (cur) { + limit->rlim_cur = cur; + } + if (max) { + limit->rlim_max = max; + } + } +#else + + ap_log_error(APLOG_MARK, APLOG_ERR, 0, cmd->server, + "Platform does not support rlimit for %s", cmd->cmd->name); +#endif +} + +APR_HOOK_STRUCT( + APR_HOOK_LINK(get_suexec_identity) +) + +AP_IMPLEMENT_HOOK_RUN_FIRST(ap_unix_identity_t *, get_suexec_identity, + (const request_rec *r), (r), NULL) + +static apr_status_t ap_unix_create_privileged_process( + apr_proc_t *newproc, const char *progname, + const char * const *args, + const char * const *env, + apr_procattr_t *attr, ap_unix_identity_t *ugid, + apr_pool_t *p) +{ + int i = 0; + const char **newargs; + char *newprogname; + char *execuser, *execgroup; + const char *argv0; + + if (!unixd_config.suexec_enabled) { + return apr_proc_create(newproc, progname, args, env, attr, p); + } + + argv0 = ap_strrchr_c(progname, '/'); + /* Allow suexec's "/" check to succeed */ + if (argv0 != NULL) { + argv0++; + } + else { + argv0 = progname; + } + + + if (ugid->userdir) { + execuser = apr_psprintf(p, "~%ld", (long) ugid->uid); + } + else { + execuser = apr_psprintf(p, "%ld", (long) ugid->uid); + } + execgroup = apr_psprintf(p, "%ld", (long) ugid->gid); + + if (!execuser || !execgroup) { + return APR_ENOMEM; + } + + i = 0; + if (args) { + while (args[i]) { + i++; + } + } + /* allocate space for 4 new args, the input args, and a null terminator */ + newargs = apr_palloc(p, sizeof(char *) * (i + 4)); + newprogname = SUEXEC_BIN; + newargs[0] = SUEXEC_BIN; + newargs[1] = execuser; + newargs[2] = execgroup; + newargs[3] = apr_pstrdup(p, argv0); + + /* + ** using a shell to execute suexec makes no sense thus + ** we force everything to be APR_PROGRAM, and never + ** APR_SHELLCMD + */ + if(apr_procattr_cmdtype_set(attr, APR_PROGRAM) != APR_SUCCESS) { + return APR_EGENERAL; + } + + i = 1; + do { + newargs[i + 3] = args[i]; + } while (args[i++]); + + return apr_proc_create(newproc, newprogname, newargs, env, attr, p); +} + +AP_DECLARE(apr_status_t) ap_os_create_privileged_process( + const request_rec *r, + apr_proc_t *newproc, const char *progname, + const char * const *args, + const char * const *env, + apr_procattr_t *attr, apr_pool_t *p) +{ + ap_unix_identity_t *ugid = ap_run_get_suexec_identity(r); + + if (ugid == NULL) { + return apr_proc_create(newproc, progname, args, env, attr, p); + } + + return ap_unix_create_privileged_process(newproc, progname, args, env, + attr, ugid, p); +} + +/* XXX move to APR and externalize (but implement differently :) ) */ +static apr_lockmech_e proc_mutex_mech(apr_proc_mutex_t *pmutex) +{ + const char *mechname = apr_proc_mutex_name(pmutex); + + if (!strcmp(mechname, "sysvsem")) { + return APR_LOCK_SYSVSEM; + } + else if (!strcmp(mechname, "flock")) { + return APR_LOCK_FLOCK; + } + return APR_LOCK_DEFAULT; +} + +AP_DECLARE(apr_status_t) unixd_set_proc_mutex_perms(apr_proc_mutex_t *pmutex) +{ + if (!geteuid()) { + apr_lockmech_e mech = proc_mutex_mech(pmutex); + + switch(mech) { +#if APR_HAS_SYSVSEM_SERIALIZE + case APR_LOCK_SYSVSEM: + { + apr_os_proc_mutex_t ospmutex; +#if !APR_HAVE_UNION_SEMUN + union semun { + long val; + struct semid_ds *buf; + unsigned short *array; + }; +#endif + union semun ick; + struct semid_ds buf; + + apr_os_proc_mutex_get(&ospmutex, pmutex); + buf.sem_perm.uid = unixd_config.user_id; + buf.sem_perm.gid = unixd_config.group_id; + buf.sem_perm.mode = 0600; + ick.buf = &buf; + if (semctl(ospmutex.crossproc, 0, IPC_SET, ick) < 0) { + return errno; + } + } + break; +#endif +#if APR_HAS_FLOCK_SERIALIZE + case APR_LOCK_FLOCK: + { + const char *lockfile = apr_proc_mutex_lockfile(pmutex); + + if (lockfile) { + if (chown(lockfile, unixd_config.user_id, + -1 /* no gid change */) < 0) { + return errno; + } + } + } + break; +#endif + default: + /* do nothing */ + break; + } + } + return APR_SUCCESS; +} + +AP_DECLARE(apr_status_t) unixd_set_global_mutex_perms(apr_global_mutex_t *gmutex) +{ +#if !APR_PROC_MUTEX_IS_GLOBAL + apr_os_global_mutex_t osgmutex; + apr_os_global_mutex_get(&osgmutex, gmutex); + return unixd_set_proc_mutex_perms(osgmutex.proc_mutex); +#else /* APR_PROC_MUTEX_IS_GLOBAL */ + /* In this case, apr_proc_mutex_t and apr_global_mutex_t are the same. */ + return unixd_set_proc_mutex_perms(gmutex); +#endif /* APR_PROC_MUTEX_IS_GLOBAL */ +} + +AP_DECLARE(apr_status_t) unixd_accept(void **accepted, ap_listen_rec *lr, + apr_pool_t *ptrans) +{ + apr_socket_t *csd; + apr_status_t status; + + *accepted = NULL; + status = apr_accept(&csd, lr->sd, ptrans); + if (status == APR_SUCCESS) { + *accepted = csd; + return APR_SUCCESS; + } + + if (APR_STATUS_IS_EINTR(status)) { + return status; + } + /* Our old behaviour here was to continue after accept() + * errors. But this leads us into lots of troubles + * because most of the errors are quite fatal. For + * example, EMFILE can be caused by slow descriptor + * leaks (say in a 3rd party module, or libc). It's + * foolish for us to continue after an EMFILE. We also + * seem to tickle kernel bugs on some platforms which + * lead to never-ending loops here. So it seems best + * to just exit in most cases. + */ + switch (status) { +#if defined(HPUX11) && defined(ENOBUFS) + /* On HPUX 11.x, the 'ENOBUFS, No buffer space available' + * error occurs because the accept() cannot complete. + * You will not see ENOBUFS with 10.20 because the kernel + * hides any occurrence from being returned to user space. + * ENOBUFS with 11.x's TCP/IP stack is possible, and could + * occur intermittently. As a work-around, we are going to + * ignore ENOBUFS. + */ + case ENOBUFS: +#endif + +#ifdef EPROTO + /* EPROTO on certain older kernels really means + * ECONNABORTED, so we need to ignore it for them. + * See discussion in new-httpd archives nh.9701 + * search for EPROTO. + * + * Also see nh.9603, search for EPROTO: + * There is potentially a bug in Solaris 2.x x<6, + * and other boxes that implement tcp sockets in + * userland (i.e. on top of STREAMS). On these + * systems, EPROTO can actually result in a fatal + * loop. See PR#981 for example. It's hard to + * handle both uses of EPROTO. + */ + case EPROTO: +#endif +#ifdef ECONNABORTED + case ECONNABORTED: +#endif + /* Linux generates the rest of these, other tcp + * stacks (i.e. bsd) tend to hide them behind + * getsockopt() interfaces. They occur when + * the net goes sour or the client disconnects + * after the three-way handshake has been done + * in the kernel but before userland has picked + * up the socket. + */ +#ifdef ECONNRESET + case ECONNRESET: +#endif +#ifdef ETIMEDOUT + case ETIMEDOUT: +#endif +#ifdef EHOSTUNREACH + case EHOSTUNREACH: +#endif +#ifdef ENETUNREACH + case ENETUNREACH: +#endif + /* EAGAIN/EWOULDBLOCK can be returned on BSD-derived + * TCP stacks when the connection is aborted before + * we call connect, but only because our listener + * sockets are non-blocking (AP_NONBLOCK_WHEN_MULTI_LISTEN) + */ +#ifdef EAGAIN + case EAGAIN: +#endif +#ifdef EWOULDBLOCK +#if !defined(EAGAIN) || EAGAIN != EWOULDBLOCK + case EWOULDBLOCK: +#endif +#endif + break; +#ifdef ENETDOWN + case ENETDOWN: + /* + * When the network layer has been shut down, there + * is not much use in simply exiting: the parent + * would simply re-create us (and we'd fail again). + * Use the CHILDFATAL code to tear the server down. + * @@@ Martin's idea for possible improvement: + * A different approach would be to define + * a new APEXIT_NETDOWN exit code, the reception + * of which would make the parent shutdown all + * children, then idle-loop until it detected that + * the network is up again, and restart the children. + * Ben Hyde noted that temporary ENETDOWN situations + * occur in mobile IP. + */ + ap_log_error(APLOG_MARK, APLOG_EMERG, status, ap_server_conf, + "apr_accept: giving up."); + return APR_EGENERAL; +#endif /*ENETDOWN*/ + +#ifdef TPF + case EINACT: + ap_log_error(APLOG_MARK, APLOG_EMERG, status, ap_server_conf, + "offload device inactive"); + return APR_EGENERAL; + break; + default: + ap_log_error(APLOG_MARK, APLOG_ERR, 0, ap_server_conf, + "select/accept error (%d)", status); + return APR_EGENERAL; +#else + default: + ap_log_error(APLOG_MARK, APLOG_ERR, status, ap_server_conf, + "apr_accept: (client socket)"); + return APR_EGENERAL; +#endif + } + return status; +} + diff --git a/rubbos/app/httpd-2.0.64/os/unix/unixd.h b/rubbos/app/httpd-2.0.64/os/unix/unixd.h new file mode 100644 index 00000000..c6bec924 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/os/unix/unixd.h @@ -0,0 +1,109 @@ +/* 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. + */ + +#ifndef UNIXD_H +#define UNIXD_H + +#include "httpd.h" +#include "http_config.h" +#include "ap_listen.h" +#ifdef HAVE_SYS_TIME_H +#include +#endif +#ifdef HAVE_SYS_RESOURCE_H +#include +#endif +#include "apr_hooks.h" +#include "apr_thread_proc.h" +#include "apr_proc_mutex.h" +#include "apr_global_mutex.h" + +#include +#include +#ifdef APR_HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_IPC_H +#include +#endif + +typedef struct { + uid_t uid; + gid_t gid; + int userdir; +} ap_unix_identity_t; + +AP_DECLARE_HOOK(ap_unix_identity_t *, get_suexec_identity,(const request_rec *r)) + +/* common stuff that unix MPMs will want */ + +/* Default user name and group name. These may be specified as numbers by + * placing a # before a number */ + +#ifndef DEFAULT_USER +#define DEFAULT_USER "#-1" +#endif +#ifndef DEFAULT_GROUP +#define DEFAULT_GROUP "#-1" +#endif + +typedef struct { + const char *user_name; + uid_t user_id; + gid_t group_id; + int suexec_enabled; +} unixd_config_rec; +AP_DECLARE_DATA extern unixd_config_rec unixd_config; + +AP_DECLARE(int) unixd_setup_child(void); +AP_DECLARE(void) unixd_pre_config(apr_pool_t *ptemp); +AP_DECLARE(const char *) unixd_set_user(cmd_parms *cmd, void *dummy, + const char *arg); +AP_DECLARE(const char *) unixd_set_group(cmd_parms *cmd, void *dummy, + const char *arg); +#if defined(RLIMIT_CPU) || defined(RLIMIT_DATA) || defined(RLIMIT_VMEM) || defined(RLIMIT_NPROC) || defined(RLIMIT_AS) +AP_DECLARE(void) unixd_set_rlimit(cmd_parms *cmd, struct rlimit **plimit, + const char *arg, const char * arg2, int type); +#endif + +/** + * One of the functions to set mutex permissions should be called in + * the parent process on platforms that switch identity when the + * server is started as root. + * If the child init logic is performed before switching identity + * (e.g., MPM setup for an accept mutex), it should only be called + * for SysV semaphores. Otherwise, it is safe to call it for all + * mutex types. + */ +AP_DECLARE(apr_status_t) unixd_set_proc_mutex_perms(apr_proc_mutex_t *pmutex); +AP_DECLARE(apr_status_t) unixd_set_global_mutex_perms(apr_global_mutex_t *gmutex); +AP_DECLARE(apr_status_t) unixd_accept(void **accepted, ap_listen_rec *lr, apr_pool_t *ptrans); + +#ifdef HAVE_KILLPG +#define unixd_killpg(x, y) (killpg ((x), (y))) +#define ap_os_killpg(x, y) (killpg ((x), (y))) +#else /* HAVE_KILLPG */ +#define unixd_killpg(x, y) (kill (-(x), (y))) +#define ap_os_killpg(x, y) (kill (-(x), (y))) +#endif /* HAVE_KILLPG */ + +#define UNIX_DAEMON_COMMANDS \ +AP_INIT_TAKE1("User", unixd_set_user, NULL, RSRC_CONF, \ + "Effective user id for this server"), \ +AP_INIT_TAKE1("Group", unixd_set_group, NULL, RSRC_CONF, \ + "Effective group id for this server") + +#endif diff --git a/rubbos/app/httpd-2.0.64/os/unix/unixd.lo b/rubbos/app/httpd-2.0.64/os/unix/unixd.lo new file mode 100644 index 00000000..9da439ae --- /dev/null +++ b/rubbos/app/httpd-2.0.64/os/unix/unixd.lo @@ -0,0 +1,12 @@ +# unixd.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/unixd.o' + +# Name of the non-PIC object. +non_pic_object='unixd.o' + diff --git a/rubbos/app/httpd-2.0.64/os/unix/unixd.o b/rubbos/app/httpd-2.0.64/os/unix/unixd.o new file mode 100644 index 0000000000000000000000000000000000000000..2b69a692e525bb3e1a970af7f2fe23b3f1061f69 GIT binary patch literal 58528 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 && regkey->hkey != INVALID_HANDLE_VALUE) { + RegCloseKey(regkey->hkey); + regkey->hkey = INVALID_HANDLE_VALUE; + } + return APR_SUCCESS; +} + + +AP_DECLARE(apr_status_t) ap_regkey_open(ap_regkey_t **newkey, + const ap_regkey_t *parentkey, + const char *keyname, + apr_int32_t flags, + apr_pool_t *pool) +{ + DWORD access = KEY_QUERY_VALUE; + DWORD exists; + HKEY hkey; + LONG rc; + + if (flags & APR_READ) + access |= KEY_READ; + if (flags & APR_WRITE) + access |= KEY_WRITE; + +#if APR_HAS_UNICODE_FS + IF_WIN_OS_IS_UNICODE + { + apr_size_t keylen = strlen(keyname) + 1; + apr_size_t wkeylen = 256; + apr_wchar_t wkeyname[256]; + apr_status_t rv = apr_conv_utf8_to_ucs2(keyname, &keylen, wkeyname, &wkeylen); + if (rv != APR_SUCCESS) + return rv; + else if (keylen) + return APR_ENAMETOOLONG; + + if (flags & APR_CREATE) + rc = RegCreateKeyExW(parentkey->hkey, wkeyname, 0, NULL, 0, + access, NULL, &hkey, &exists); + else + rc = RegOpenKeyExW(parentkey->hkey, wkeyname, 0, access, &hkey); + } +#endif /* APR_HAS_UNICODE_FS */ +#if APR_HAS_ANSI_FS + ELSE_WIN_OS_IS_ANSI + { + if (flags & APR_CREATE) + rc = RegCreateKeyEx(parentkey->hkey, keyname, 0, NULL, 0, + access, NULL, &hkey, &exists); + else + rc = RegOpenKeyEx(parentkey->hkey, keyname, 0, access, &hkey); + } +#endif + if (rc != ERROR_SUCCESS) { + return APR_FROM_OS_ERROR(rc); + } + if ((flags & APR_EXCL) && (exists == REG_OPENED_EXISTING_KEY)) { + RegCloseKey(hkey); + return APR_EEXIST; + } + + *newkey = apr_palloc(pool, sizeof(**newkey)); + (*newkey)->pool = pool; + (*newkey)->hkey = hkey; + apr_pool_cleanup_register((*newkey)->pool, (void *)(*newkey), + regkey_cleanup, apr_pool_cleanup_null); + return APR_SUCCESS; +} + + +AP_DECLARE(apr_status_t) ap_regkey_close(ap_regkey_t *regkey) +{ + apr_status_t stat; + if ((stat = regkey_cleanup(regkey)) == APR_SUCCESS) { + apr_pool_cleanup_kill(regkey->pool, regkey, regkey_cleanup); + } + return stat; +} + + +AP_DECLARE(apr_status_t) ap_regkey_remove(const ap_regkey_t *parent, + const char *keyname, + apr_pool_t *pool) +{ + LONG rc; + +#if APR_HAS_UNICODE_FS + IF_WIN_OS_IS_UNICODE + { + apr_size_t keylen = strlen(keyname) + 1; + apr_size_t wkeylen = 256; + apr_wchar_t wkeyname[256]; + apr_status_t rv = apr_conv_utf8_to_ucs2(keyname, &keylen, wkeyname, &wkeylen); + if (rv != APR_SUCCESS) + return rv; + else if (keylen) + return APR_ENAMETOOLONG; + rc = RegDeleteKeyW(parent->hkey, wkeyname); + } +#endif /* APR_HAS_UNICODE_FS */ +#if APR_HAS_ANSI_FS + ELSE_WIN_OS_IS_ANSI + { + /* We need to determine if subkeys exist on Win9x, to provide + * consistent behavior with NT, which returns access denied + * if subkeys exist when attempting to delete a key. + */ + DWORD subkeys; + HKEY hkey; + rc = RegOpenKeyEx(parent->hkey, keyname, 0, KEY_READ, &hkey); + if (rc != ERROR_SUCCESS) + return APR_FROM_OS_ERROR(rc); + rc = RegQueryInfoKey(hkey, NULL, NULL, NULL, &subkeys, NULL, NULL, + NULL, NULL, NULL, NULL, NULL); + RegCloseKey(hkey); + if (rc != ERROR_SUCCESS) + return APR_FROM_OS_ERROR(rc); + else if (subkeys) + return APR_FROM_OS_ERROR(ERROR_ACCESS_DENIED); + rc = RegDeleteKey(parent->hkey, keyname); + } +#endif + if (rc != ERROR_SUCCESS) { + return APR_FROM_OS_ERROR(rc); + } + return APR_SUCCESS; +} + + +AP_DECLARE(apr_status_t) ap_regkey_value_get(char **result, + ap_regkey_t *key, + const char *valuename, + apr_pool_t *pool) +{ + /* Retrieve a registry string value, and explode any envvars + * that the system has configured (e.g. %SystemRoot%/someapp.exe) + */ + LONG rc; + DWORD type; + DWORD size = 0; + +#if APR_HAS_UNICODE_FS + IF_WIN_OS_IS_UNICODE + { + apr_size_t valuelen = strlen(valuename) + 1; + apr_size_t wvallen = 256; + apr_wchar_t wvalname[256]; + apr_wchar_t *wvalue; + apr_status_t rv; + rv = apr_conv_utf8_to_ucs2(valuename, &valuelen, wvalname, &wvallen); + if (rv != APR_SUCCESS) + return rv; + else if (valuelen) + return APR_ENAMETOOLONG; + /* Read to NULL buffer to determine value size */ + rc = RegQueryValueExW(key->hkey, wvalname, 0, &type, NULL, &size); + if (rc != ERROR_SUCCESS) { + return APR_FROM_OS_ERROR(rc); + } + if ((size < 2) || (type != REG_SZ && type != REG_EXPAND_SZ)) { + return APR_FROM_OS_ERROR(ERROR_INVALID_PARAMETER); + } + + wvalue = apr_palloc(pool, size); + /* Read value based on size query above */ + rc = RegQueryValueExW(key->hkey, wvalname, 0, &type, + (LPBYTE)wvalue, &size); + if (rc != ERROR_SUCCESS) { + return APR_FROM_OS_ERROR(rc); + } + if (type == REG_EXPAND_SZ) { + apr_wchar_t zbuf[1]; + size = ExpandEnvironmentStringsW(wvalue, zbuf, 0); + if (size) { + apr_wchar_t *tmp = wvalue; + /* The size returned by ExpandEnvironmentStringsW is wchars */ + wvalue = apr_palloc(pool, size * 2); + size = ExpandEnvironmentStringsW(tmp, wvalue, size); + } + } + else { + /* count wchars from RegQueryValueExW, rather than bytes */ + size /= 2; + } + /* ###: deliberately overallocate all but the trailing null. + * We could precalculate the exact buffer here instead, the question + * is a matter of storage v.s. cpu cycles. + */ + valuelen = (size - 1) * 3 + 1; + *result = apr_palloc(pool, valuelen); + rv = apr_conv_ucs2_to_utf8(wvalue, &size, *result, &valuelen); + if (rv != APR_SUCCESS) + return rv; + else if (size) + return APR_ENAMETOOLONG; + } +#endif /* APR_HAS_UNICODE_FS */ +#if APR_HAS_ANSI_FS + ELSE_WIN_OS_IS_ANSI + { + /* Read to NULL buffer to determine value size */ + rc = RegQueryValueEx(key->hkey, valuename, 0, &type, NULL, &size); + if (rc != ERROR_SUCCESS) + return APR_FROM_OS_ERROR(rc); + + if ((size < 1) || (type != REG_SZ && type != REG_EXPAND_SZ)) { + return APR_FROM_OS_ERROR(ERROR_INVALID_PARAMETER); + } + + *result = apr_palloc(pool, size); + /* Read value based on size query above */ + rc = RegQueryValueEx(key->hkey, valuename, 0, &type, *result, &size); + if (rc != ERROR_SUCCESS) + return APR_FROM_OS_ERROR(rc); + + if (type == REG_EXPAND_SZ) { + /* Advise ExpandEnvironmentStrings that we have a zero char + * buffer to force computation of the required length. + */ + char zbuf[1]; + size = ExpandEnvironmentStrings(*result, zbuf, 0); + if (size) { + char *tmp = *result; + *result = apr_palloc(pool, size); + size = ExpandEnvironmentStrings(tmp, *result, size); + } + } + } +#endif + return APR_SUCCESS; +} + + +AP_DECLARE(apr_status_t) ap_regkey_value_set(ap_regkey_t *key, + const char *valuename, + const char *value, + apr_int32_t flags, + apr_pool_t *pool) +{ + /* Retrieve a registry string value, and explode any envvars + * that the system has configured (e.g. %SystemRoot%/someapp.exe) + */ + LONG rc; + DWORD size = strlen(value) + 1; + DWORD type = (flags & AP_REGKEY_EXPAND) ? REG_EXPAND_SZ : REG_SZ; + +#if APR_HAS_UNICODE_FS + IF_WIN_OS_IS_UNICODE + { + apr_size_t alloclen; + apr_size_t valuelen = strlen(valuename) + 1; + apr_size_t wvallen = 256; + apr_wchar_t wvalname[256]; + apr_wchar_t *wvalue; + apr_status_t rv; + rv = apr_conv_utf8_to_ucs2(valuename, &valuelen, wvalname, &wvallen); + if (rv != APR_SUCCESS) + return rv; + else if (valuelen) + return APR_ENAMETOOLONG; + + wvallen = alloclen = size; + wvalue = apr_palloc(pool, alloclen * 2); + rv = apr_conv_utf8_to_ucs2(value, &size, wvalue, &wvallen); + if (rv != APR_SUCCESS) + return rv; + else if (size) + return APR_ENAMETOOLONG; + + /* The size is the number of wchars consumed by apr_conv_utf8_to_ucs2 + * converted to bytes; the trailing L'\0' continues to be counted. + */ + size = (alloclen - wvallen) * 2; + rc = RegSetValueExW(key->hkey, wvalname, 0, type, + (LPBYTE)wvalue, size); + if (rc != ERROR_SUCCESS) + return APR_FROM_OS_ERROR(rc); + } +#endif /* APR_HAS_UNICODE_FS */ +#if APR_HAS_ANSI_FS + ELSE_WIN_OS_IS_ANSI + { + rc = RegSetValueEx(key->hkey, valuename, 0, type, value, size); + if (rc != ERROR_SUCCESS) + return APR_FROM_OS_ERROR(rc); + } +#endif + return APR_SUCCESS; +} + + +AP_DECLARE(apr_status_t) ap_regkey_value_raw_get(void **result, + apr_size_t *resultsize, + apr_int32_t *resulttype, + ap_regkey_t *key, + const char *valuename, + apr_pool_t *pool) +{ + /* Retrieve a registry string value, and explode any envvars + * that the system has configured (e.g. %SystemRoot%/someapp.exe) + */ + LONG rc; + +#if APR_HAS_UNICODE_FS + IF_WIN_OS_IS_UNICODE + { + apr_size_t valuelen = strlen(valuename) + 1; + apr_size_t wvallen = 256; + apr_wchar_t wvalname[256]; + apr_status_t rv; + rv = apr_conv_utf8_to_ucs2(valuename, &valuelen, wvalname, &wvallen); + if (rv != APR_SUCCESS) + return rv; + else if (valuelen) + return APR_ENAMETOOLONG; + /* Read to NULL buffer to determine value size */ + rc = RegQueryValueExW(key->hkey, wvalname, 0, resulttype, + NULL, resultsize); + if (rc != ERROR_SUCCESS) { + return APR_FROM_OS_ERROR(rc); + } + + /* Read value based on size query above */ + *result = apr_palloc(pool, *resultsize); + rc = RegQueryValueExW(key->hkey, wvalname, 0, resulttype, + (LPBYTE)*result, resultsize); + } +#endif /* APR_HAS_UNICODE_FS */ +#if APR_HAS_ANSI_FS + ELSE_WIN_OS_IS_ANSI + { + /* Read to NULL buffer to determine value size */ + rc = RegQueryValueEx(key->hkey, valuename, 0, resulttype, + NULL, resultsize); + if (rc != ERROR_SUCCESS) + return APR_FROM_OS_ERROR(rc); + + /* Read value based on size query above */ + *result = apr_palloc(pool, *resultsize); + rc = RegQueryValueEx(key->hkey, valuename, 0, resulttype, + (LPBYTE)*result, resultsize); + if (rc != ERROR_SUCCESS) + return APR_FROM_OS_ERROR(rc); + } +#endif + if (rc != ERROR_SUCCESS) { + return APR_FROM_OS_ERROR(rc); + } + + return APR_SUCCESS; +} + + +AP_DECLARE(apr_status_t) ap_regkey_value_raw_set(ap_regkey_t *key, + const char *valuename, + const void *value, + apr_size_t valuesize, + apr_int32_t valuetype, + apr_pool_t *pool) +{ + LONG rc; + +#if APR_HAS_UNICODE_FS + IF_WIN_OS_IS_UNICODE + { + apr_size_t valuelen = strlen(valuename) + 1; + apr_size_t wvallen = 256; + apr_wchar_t wvalname[256]; + apr_status_t rv; + rv = apr_conv_utf8_to_ucs2(valuename, &valuelen, wvalname, &wvallen); + if (rv != APR_SUCCESS) + return rv; + else if (valuelen) + return APR_ENAMETOOLONG; + + rc = RegSetValueExW(key->hkey, wvalname, 0, valuetype, + (LPBYTE)value, valuesize); + } +#endif /* APR_HAS_UNICODE_FS */ +#if APR_HAS_ANSI_FS + ELSE_WIN_OS_IS_ANSI + { + rc = RegSetValueEx(key->hkey, valuename, 0, valuetype, + (LPBYTE)value, valuesize); + } +#endif + if (rc != ERROR_SUCCESS) { + return APR_FROM_OS_ERROR(rc); + } + return APR_SUCCESS; +} + + +AP_DECLARE(apr_status_t) ap_regkey_value_array_get(apr_array_header_t **result, + ap_regkey_t *key, + const char *valuename, + apr_pool_t *pool) +{ + /* Retrieve a registry string value, and explode any envvars + * that the system has configured (e.g. %SystemRoot%/someapp.exe) + */ + apr_status_t rv; + void *value; + char *buf; + char *tmp; + DWORD type; + DWORD size = 0; + + rv = ap_regkey_value_raw_get(&value, &size, &type, key, valuename, pool); + if (rv != APR_SUCCESS) { + return rv; + } + else if (type != REG_MULTI_SZ) { + return APR_EINVAL; + } + +#if APR_HAS_UNICODE_FS + IF_WIN_OS_IS_UNICODE + { + apr_size_t alloclen; + apr_size_t valuelen = strlen(valuename) + 1; + apr_size_t wvallen = 256; + apr_wchar_t *wvalue = (apr_wchar_t *)value; + + /* ###: deliberately overallocate plus two extra nulls. + * We could precalculate the exact buffer here instead, the question + * is a matter of storage v.s. cpu cycles. + */ + size /= 2; + alloclen = valuelen = size * 3 + 2; + buf = apr_palloc(pool, valuelen); + rv = apr_conv_ucs2_to_utf8(value, &size, buf, &valuelen); + if (rv != APR_SUCCESS) + return rv; + else if (size) + return APR_ENAMETOOLONG; + buf[(alloclen - valuelen)] = '\0'; + buf[(alloclen - valuelen) + 1] = '\0'; + } +#endif /* APR_HAS_UNICODE_FS */ +#if APR_HAS_ANSI_FS + ELSE_WIN_OS_IS_ANSI + { + /* Small possiblity the array is either unterminated + * or single NULL terminated. Avert. + */ + buf = (char *)value; + if (size < 2 || buf[size - 1] != '\0' || buf[size - 2] != '\0') { + buf = apr_palloc(pool, size + 2); + memcpy(buf, value, size); + buf[size + 1] = '\0'; + buf[size] = '\0'; + } + } +#endif + + size = 0; /* Element Count */ + for (tmp = buf; *tmp; ++tmp) { + ++size; + while (*tmp) { + ++tmp; + } + } + + *result = apr_array_make(pool, size, sizeof(char *)); + for (tmp = buf; *tmp; ++tmp) { + char **newelem = (char **) apr_array_push(*result); + *newelem = tmp; + while (*tmp) { + ++tmp; + } + } + + return APR_SUCCESS; +} + + +AP_DECLARE(apr_status_t) ap_regkey_value_array_set(ap_regkey_t *key, + const char *valuename, + int nelts, + const char * const * elts, + apr_pool_t *pool) +{ + /* Retrieve a registry string value, and explode any envvars + * that the system has configured (e.g. %SystemRoot%/someapp.exe) + */ + int i; + const void *value; + apr_size_t bufsize; + +#if APR_HAS_UNICODE_FS + IF_WIN_OS_IS_UNICODE + { + apr_status_t rv; + apr_wchar_t *buf; + apr_wchar_t *tmp; + apr_size_t bufrem; + + bufsize = 1; /* For trailing second null */ + for (i = 0; i < nelts; ++i) { + bufsize += strlen(elts[i]) + 1; + } + if (!nelts) { + ++bufsize; + } + + bufrem = bufsize; + buf = apr_palloc(pool, bufsize * 2); + tmp = buf; + for (i = 0; i < nelts; ++i) { + apr_size_t eltsize = strlen(elts[i]) + 1; + apr_size_t size = eltsize; + rv = apr_conv_utf8_to_ucs2(elts[i], &size, tmp, &bufrem); + if (rv != APR_SUCCESS) + return rv; + else if (size) + return APR_ENAMETOOLONG; + tmp += eltsize; + } + if (!nelts) { + --bufrem; + (*tmp++) = L'\0'; + } + --bufrem; + *tmp = L'\0'; /* Trailing second null */ + + bufsize = (bufsize - bufrem) * 2; + value = (void*)buf; + } +#endif /* APR_HAS_UNICODE_FS */ +#if APR_HAS_ANSI_FS + ELSE_WIN_OS_IS_ANSI + { + char *buf; + char *tmp; + + bufsize = 1; /* For trailing second null */ + for (i = 0; i < nelts; ++i) { + bufsize += strlen(elts[i]) + 1; + } + if (!nelts) { + ++bufsize; + } + buf = apr_palloc(pool, bufsize); + tmp = buf; + for (i = 0; i < nelts; ++i) { + apr_size_t len = strlen(elts[i]) + 1; + memcpy(tmp, elts[i], len); + tmp += len; + } + if (!nelts) { + (*tmp++) = '\0'; + } + *tmp = '\0'; /* Trailing second null */ + value = buf; + } +#endif + return ap_regkey_value_raw_set(key, valuename, value, + bufsize, REG_MULTI_SZ, pool); +} + + +AP_DECLARE(apr_status_t) ap_regkey_value_remove(const ap_regkey_t *key, + const char *valuename, + apr_pool_t *pool) +{ + LONG rc; + +#if APR_HAS_UNICODE_FS + IF_WIN_OS_IS_UNICODE + { + apr_size_t valuelen = strlen(valuename) + 1; + apr_size_t wvallen = 256; + apr_wchar_t wvalname[256]; + apr_status_t rv = apr_conv_utf8_to_ucs2(valuename, &valuelen, wvalname, &wvallen); + if (rv != APR_SUCCESS) + return rv; + else if (valuelen) + return APR_ENAMETOOLONG; + rc = RegDeleteValueW(key->hkey, wvalname); + } +#endif /* APR_HAS_UNICODE_FS */ +#if APR_HAS_ANSI_FS + ELSE_WIN_OS_IS_ANSI + { + rc = RegDeleteValue(key->hkey, valuename); + } +#endif + if (rc != ERROR_SUCCESS) { + return APR_FROM_OS_ERROR(rc); + } + return APR_SUCCESS; +} + +#endif /* defined WIN32 */ diff --git a/rubbos/app/httpd-2.0.64/os/win32/modules.c b/rubbos/app/httpd-2.0.64/os/win32/modules.c new file mode 100644 index 00000000..bf0deb6b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/os/win32/modules.c @@ -0,0 +1,48 @@ +/* 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. + */ + +/* modules.c --- major modules compiled into Apache for Win32. + * Only insert an entry for a module if it must be compiled into + * the core server + */ + +#define CORE_PRIVATE +#include "httpd.h" +#include "http_config.h" + +extern module core_module; +extern module win32_module; +extern module mpm_winnt_module; +extern module http_module; +extern module so_module; + +AP_DECLARE_DATA module *ap_prelinked_modules[] = { + &core_module, + &win32_module, + &mpm_winnt_module, + &http_module, + &so_module, + NULL +}; + +AP_DECLARE_DATA module *ap_preloaded_modules[] = { + &core_module, + &win32_module, + &mpm_winnt_module, + &http_module, + &so_module, + NULL +}; diff --git a/rubbos/app/httpd-2.0.64/os/win32/os.h b/rubbos/app/httpd-2.0.64/os/win32/os.h new file mode 100644 index 00000000..56fc8b6f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/os/win32/os.h @@ -0,0 +1,120 @@ +/* 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. + */ + +#ifdef WIN32 + +#ifndef AP_OS_H +#define AP_OS_H +/* Delegate windows include to the apr.h header, if USER or GDI declarations + * are required (for a window rather than console application), include + * windows.h prior to any other Apache header files. + */ +#include "apr_pools.h" + +#include +#include + +#define PLATFORM "Win32" + +/* going away shortly... */ +#define HAVE_DRIVE_LETTERS +#define HAVE_UNC_PATHS +#define CASE_BLIND_FILESYSTEM + +#define APACHE_MPM_DIR "server/mpm/winnt" /* generated on unix */ + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* BIG RED WARNING: exit() is mapped to allow us to capture the exit + * status. This header must only be included from modules linked into + * the ApacheCore.dll - since it's a horrible behavior to exit() from + * any module outside the main() block, and we -will- assume it's a + * fatal error. + */ + +AP_DECLARE_DATA extern int real_exit_code; + +#define exit(status) ((exit)((real_exit_code==2) ? (real_exit_code = (status)) \ + : ((real_exit_code = 0), (status)))) + + +#ifdef AP_DECLARE_EXPORT + +/* Defined in util_win32.c and available only to the core module for + * win32 MPM design. + */ + +AP_DECLARE(apr_status_t) ap_os_proc_filepath(char **binpath, apr_pool_t *p); + +typedef enum { + AP_DLL_WINBASEAPI = 0, // kernel32 From WinBase.h + AP_DLL_WINADVAPI = 1, // advapi32 From WinBase.h + AP_DLL_WINSOCKAPI = 2, // mswsock From WinSock.h + AP_DLL_WINSOCK2API = 3, // ws2_32 From WinSock2.h + AP_DLL_defined = 4 // must define as last idx_ + 1 +} ap_dlltoken_e; + +FARPROC ap_load_dll_func(ap_dlltoken_e fnLib, char* fnName, int ordinal); + +PSECURITY_ATTRIBUTES GetNullACL(); +void CleanNullACL(void *sa); + +int set_listeners_noninheritable(apr_pool_t *p); + + +#define AP_DECLARE_LATE_DLL_FUNC(lib, rettype, calltype, fn, ord, args, names) \ + typedef rettype (calltype *ap_winapi_fpt_##fn) args; \ + static ap_winapi_fpt_##fn ap_winapi_pfn_##fn = NULL; \ + __inline rettype ap_winapi_##fn args \ + { if (!ap_winapi_pfn_##fn) \ + ap_winapi_pfn_##fn = (ap_winapi_fpt_##fn) ap_load_dll_func(lib, #fn, ord); \ + return (*(ap_winapi_pfn_##fn)) names; }; \ + +/* Win2K kernel only */ +AP_DECLARE_LATE_DLL_FUNC(AP_DLL_WINADVAPI, BOOL, WINAPI, ChangeServiceConfig2A, 0, ( + SC_HANDLE hService, + DWORD dwInfoLevel, + LPVOID lpInfo), + (hService, dwInfoLevel, lpInfo)); +#undef ChangeServiceConfig2 +#define ChangeServiceConfig2 ap_winapi_ChangeServiceConfig2A + +/* WinNT kernel only */ +AP_DECLARE_LATE_DLL_FUNC(AP_DLL_WINBASEAPI, BOOL, WINAPI, CancelIo, 0, ( + IN HANDLE hFile), + (hFile)); +#undef CancelIo +#define CancelIo ap_winapi_CancelIo + +/* Win9x kernel only */ +AP_DECLARE_LATE_DLL_FUNC(AP_DLL_WINBASEAPI, DWORD, WINAPI, RegisterServiceProcess, 0, ( + DWORD dwProcessId, + DWORD dwType), + (dwProcessId, dwType)); +#define RegisterServiceProcess ap_winapi_RegisterServiceProcess + +#endif /* def AP_DECLARE_EXPORT */ + +#ifdef __cplusplus +} +#endif + +#endif /* ndef AP_OS_H */ +#endif /* def WIN32 */ diff --git a/rubbos/app/httpd-2.0.64/os/win32/util_win32.c b/rubbos/app/httpd-2.0.64/os/win32/util_win32.c new file mode 100644 index 00000000..c6c38404 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/os/win32/util_win32.c @@ -0,0 +1,147 @@ +/* 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. + */ + +#include "apr_strings.h" +#include "arch/win32/apr_arch_file_io.h" +#include "arch/win32/apr_arch_misc.h" + +#include "httpd.h" +#include "http_log.h" + +#include +#include +#include + + +AP_DECLARE(apr_status_t) ap_os_proc_filepath(char **binpath, apr_pool_t *p) +{ + apr_wchar_t wbinpath[APR_PATH_MAX]; + +#if APR_HAS_UNICODE_FS + IF_WIN_OS_IS_UNICODE + { + apr_size_t binlen; + apr_size_t wbinlen; + apr_status_t rv; + if (!GetModuleFileNameW(NULL, wbinpath, sizeof(wbinpath) + / sizeof(apr_wchar_t))) { + return apr_get_os_error(); + } + wbinlen = wcslen(wbinpath) + 1; + binlen = (wbinlen - 1) * 3 + 1; + *binpath = apr_palloc(p, binlen); + rv = apr_conv_ucs2_to_utf8(wbinpath, &wbinlen, *binpath, &binlen); + if (rv != APR_SUCCESS) + return rv; + else if (wbinlen) + return APR_ENAMETOOLONG; + } +#endif /* APR_HAS_UNICODE_FS */ +#if APR_HAS_ANSI_FS + ELSE_WIN_OS_IS_ANSI + { + /* share the same scratch buffer */ + char *pathbuf = (char*) wbinpath; + if (!GetModuleFileName(NULL, pathbuf, sizeof(wbinpath))) { + return apr_get_os_error(); + } + *binpath = apr_pstrdup(p, pathbuf); + } +#endif + return APR_SUCCESS; +} + + +AP_DECLARE(apr_status_t) ap_os_create_privileged_process( + const request_rec *r, + apr_proc_t *newproc, const char *progname, + const char * const *args, + const char * const *env, + apr_procattr_t *attr, apr_pool_t *p) +{ + return apr_proc_create(newproc, progname, args, env, attr, p); +} + + +/* This code is stolen from misc/win32/misc.c and apr_private.h + * This helper code resolves late bound entry points + * missing from one or more releases of the Win32 API... + * but it sure would be nice if we didn't duplicate this code + * from the APR ;-) + */ +static const char* const lateDllName[DLL_defined] = { + "kernel32", "advapi32", "mswsock", "ws2_32" }; +static HMODULE lateDllHandle[DLL_defined] = { + NULL, NULL, NULL, NULL }; + + +FARPROC ap_load_dll_func(ap_dlltoken_e fnLib, char* fnName, int ordinal) +{ + if (!lateDllHandle[fnLib]) { + lateDllHandle[fnLib] = LoadLibrary(lateDllName[fnLib]); + if (!lateDllHandle[fnLib]) + return NULL; + } + if (ordinal) + return GetProcAddress(lateDllHandle[fnLib], (char *) ordinal); + else + return GetProcAddress(lateDllHandle[fnLib], fnName); +} + + +/* To share the semaphores with other processes, we need a NULL ACL + * Code from MS KB Q106387 + */ +PSECURITY_ATTRIBUTES GetNullACL() +{ + PSECURITY_DESCRIPTOR pSD; + PSECURITY_ATTRIBUTES sa; + + sa = (PSECURITY_ATTRIBUTES) LocalAlloc(LPTR, sizeof(SECURITY_ATTRIBUTES)); + sa->nLength = sizeof(sizeof(SECURITY_ATTRIBUTES)); + + pSD = (PSECURITY_DESCRIPTOR) LocalAlloc(LPTR, SECURITY_DESCRIPTOR_MIN_LENGTH); + sa->lpSecurityDescriptor = pSD; + + if (pSD == NULL || sa == NULL) { + return NULL; + } + apr_set_os_error(0); + if (!InitializeSecurityDescriptor(pSD, SECURITY_DESCRIPTOR_REVISION) + || apr_get_os_error()) { + LocalFree( pSD ); + LocalFree( sa ); + return NULL; + } + if (!SetSecurityDescriptorDacl(pSD, TRUE, (PACL) NULL, FALSE) + || apr_get_os_error()) { + LocalFree( pSD ); + LocalFree( sa ); + return NULL; + } + + sa->bInheritHandle = FALSE; + return sa; +} + + +void CleanNullACL(void *sa) +{ + if (sa) { + LocalFree(((PSECURITY_ATTRIBUTES)sa)->lpSecurityDescriptor); + LocalFree(sa); + } +} diff --git a/rubbos/app/httpd-2.0.64/server/.deps b/rubbos/app/httpd-2.0.64/server/.deps new file mode 100644 index 00000000..e69de29b diff --git a/rubbos/app/httpd-2.0.64/server/.indent.pro b/rubbos/app/httpd-2.0.64/server/.indent.pro new file mode 100644 index 00000000..a9fbe9f9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/server/.indent.pro @@ -0,0 +1,54 @@ +-i4 -npsl -di0 -br -nce -d0 -cli0 -npcs -nfc1 +-TBUFF +-TFILE +-TTRANS +-TUINT4 +-T_trans +-Tallow_options_t +-Tapache_sfio +-Tarray_header +-Tbool_int +-Tbuf_area +-Tbuff_struct +-Tbuffy +-Tcmd_how +-Tcmd_parms +-Tcommand_rec +-Tcommand_struct +-Tconn_rec +-Tcore_dir_config +-Tcore_server_config +-Tdir_maker_func +-Tevent +-Tglobals_s +-Thandler_func +-Thandler_rec +-Tjoblist_s +-Tlisten_rec +-Tmerger_func +-Tmode_t +-Tmodule +-Tmodule_struct +-Tmutex +-Tn_long +-Tother_child_rec +-Toverrides_t +-Tparent_score +-Tpid_t +-Tpiped_log +-Tpool +-Trequest_rec +-Trequire_line +-Trlim_t +-Tscoreboard +-Tsemaphore +-Tserver_addr_rec +-Tserver_rec +-Tserver_rec_chain +-Tshort_score +-Ttable +-Ttable_entry +-Tthread +-Tu_wide_int +-Tvtime_t +-Twide_int diff --git a/rubbos/app/httpd-2.0.64/server/.libs/buildmark.o b/rubbos/app/httpd-2.0.64/server/.libs/buildmark.o new file mode 100644 index 0000000000000000000000000000000000000000..8dca29136befa9c73224a7f855111d27f10f3eec GIT binary patch literal 5640 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
    ?VRfn+IHnbNWEn*!&Ny`g7 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
  • G*c|;lV8?q^ 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/.libs/libexpat.la b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/.libs/libexpat.la new file mode 100644 index 00000000..5d5897c9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/.libs/libexpat.la @@ -0,0 +1,35 @@ +# libexpat.la - a libtool library file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='libexpat.so.0' + +# Names of this library. +library_names='libexpat.so.0.5.0 libexpat.so.0 libexpat.so' + +# The name of the static archive. +old_library='libexpat.a' + +# Libraries that this one depends upon. +dependency_libs='' + +# Version information for libexpat. +current=5 +age=5 +revision=0 + +# Is this an already installed library? +installed=no + +# Should we warn about portability when linking against -modules? +shouldnotlink=no + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='/bottlenecks/rubbos/app/apache2/lib' diff --git a/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/.libs/libexpat.lai b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/.libs/libexpat.lai new file mode 100644 index 00000000..b5f91d99 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/.libs/libexpat.lai @@ -0,0 +1,35 @@ +# libexpat.la - a libtool library file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='libexpat.so.0' + +# Names of this library. +library_names='libexpat.so.0.5.0 libexpat.so.0 libexpat.so' + +# The name of the static archive. +old_library='libexpat.a' + +# Libraries that this one depends upon. +dependency_libs='' + +# Version information for libexpat. +current=5 +age=5 +revision=0 + +# Is this an already installed library? +installed=yes + +# Should we warn about portability when linking against -modules? +shouldnotlink=no + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='/bottlenecks/rubbos/app/apache2/lib' diff --git a/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/.libs/libexpat.so b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/.libs/libexpat.so new file mode 100755 index 0000000000000000000000000000000000000000..aecd7ef4088efd854c7f382794db3171490618cc GIT binary patch literal 513838 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 z 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 z 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 z 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 aclocal.m4 +echo "dnl edits here will be lost" >> aclocal.m4 + +for m4file in $m4files +do + m4file=conftools/$m4file + if [ -f $m4file ]; then + echo "Incorporating $m4file into aclocal.m4 ..." + cat $m4file >> aclocal.m4 + rm -f $m4file + fi +done + +cross_compile_warning="warning: AC_TRY_RUN called without default to allow cross compiling" + +# +# Generate the autoconf header template (config.h.in) and ./configure +# +echo "Creating config.h.in ..." +${AUTOHEADER:-autoheader} 2>&1 | grep -v "$cross_compile_warning" + +echo "Creating configure ..." +### do some work to toss config.cache? +${AUTOCONF:-autoconf} 2>&1 | grep -v "$cross_compile_warning" + +# Remove autoconf caches +rm -rf autom4te*.cache aclocal.m4 + +exit 0 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/config.log b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/config.log new file mode 100644 index 00000000..ce696c8b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/config.log @@ -0,0 +1,1017 @@ +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by expat configure 1.95.7, which was +generated by GNU Autoconf 2.63. Invocation command line was + + $ /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/configure --disable-option-checking --disable-option-checking --enable-module=so --enable-so --with-mpm=worker --cache-file=/dev/null --srcdir=/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util --with-apr=../apr --prefix=/bottlenecks/rubbos/app/apache2 --exec-prefix=/bottlenecks/rubbos/app/apache2 --libdir=${prefix}/lib --includedir=/bottlenecks/rubbos/app/apache2/include --bindir=${prefix}/bin --cache-file=/dev/null --srcdir=/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat --prefix=/bottlenecks/rubbos/app/apache2 --exec-prefix=/bottlenecks/rubbos/app/apache2 --libdir=/bottlenecks/rubbos/app/apache2/lib --includedir=/bottlenecks/rubbos/app/apache2/include --bindir=/bottlenecks/rubbos/app/apache2/bin + +## --------- ## +## Platform. ## +## --------- ## + +hostname = ubuntu +uname -m = x86_64 +uname -r = 3.16.0-30-generic +uname -s = Linux +uname -v = #40~14.04.1-Ubuntu SMP Thu Jan 15 17:43:14 UTC 2015 + +/usr/bin/uname -p = unknown +/bin/uname -X = unknown + +/bin/arch = unknown +/usr/bin/arch -k = unknown +/usr/convex/getsysinfo = unknown +/usr/bin/hostinfo = unknown +/bin/machine = unknown +/usr/bin/oslevel = unknown +/bin/universe = unknown + +PATH: /bottlenecks/rubbos/app/jdk1.6.0_27/bin +PATH: /bin/unix +PATH: /bottlenecks/rubbos/app/apache-ant-1.6.5/bin +PATH: /bottlenecks/rubbos/app/apache-tomcat-5.5.17/bin +PATH: /usr/local/sbin +PATH: /usr/local/bin +PATH: /usr/sbin +PATH: /usr/bin +PATH: /sbin +PATH: /bin +PATH: /usr/games +PATH: /usr/local/games + + +## ----------- ## +## Core tests. ## +## ----------- ## + +configure:2061: checking build system type +configure:2079: result: x86_64-unknown-linux-gnu +configure:2101: checking host system type +configure:2116: result: x86_64-unknown-linux-gnu +configure:2138: checking target system type +configure:2153: result: x86_64-unknown-linux-gnu +configure:2311: checking for gcc +configure:2327: found /usr/bin/gcc +configure:2338: result: gcc +configure:2570: checking for C compiler version +configure:2578: gcc --version >&5 +gcc (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4 +Copyright (C) 2013 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. + +configure:2582: $? = 0 +configure:2589: gcc -v >&5 +Using built-in specs. +COLLECT_GCC=gcc +COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper +Target: x86_64-linux-gnu +Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.8.4-2ubuntu1~14.04' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.8 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu +Thread model: posix +gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04) +configure:2593: $? = 0 +configure:2600: gcc -V >&5 +gcc: error: unrecognized command line option '-V' +gcc: fatal error: no input files +compilation terminated. +configure:2604: $? = 4 +configure:2627: checking for C compiler default output file name +configure:2649: gcc conftest.c >&5 +configure:2653: $? = 0 +configure:2691: result: a.out +configure:2710: checking whether the C compiler works +configure:2720: ./a.out +configure:2724: $? = 0 +configure:2743: result: yes +configure:2750: checking whether we are cross compiling +configure:2752: result: no +configure:2755: checking for suffix of executables +configure:2762: gcc -o conftest conftest.c >&5 +configure:2766: $? = 0 +configure:2792: result: +configure:2798: checking for suffix of object files +configure:2824: gcc -c conftest.c >&5 +configure:2828: $? = 0 +configure:2853: result: o +configure:2857: checking whether we are using the GNU C compiler +configure:2886: gcc -c conftest.c >&5 +configure:2893: $? = 0 +configure:2910: result: yes +configure:2919: checking whether gcc accepts -g +configure:2949: gcc -c -g conftest.c >&5 +configure:2956: $? = 0 +configure:3057: result: yes +configure:3074: checking for gcc option to accept ISO C89 +configure:3148: gcc -c -g -O2 conftest.c >&5 +configure:3155: $? = 0 +configure:3178: result: none needed +configure:3196: checking for a sed that does not truncate output +configure:3252: result: /bin/sed +configure:3255: checking for grep that handles long lines and -e +configure:3315: result: /bin/grep +configure:3320: checking for egrep +configure:3384: result: /bin/grep -E +configure:3400: checking for ld used by gcc +configure:3467: result: /usr/bin/ld +configure:3476: checking if the linker (/usr/bin/ld) is GNU ld +configure:3491: result: yes +configure:3496: checking for /usr/bin/ld option to reload object files +configure:3503: result: -r +configure:3521: checking for BSD-compatible nm +configure:3570: result: /usr/bin/nm -B +configure:3574: checking whether ln -s works +configure:3578: result: yes +configure:3585: checking how to recognize dependent libraries +configure:3771: result: pass_all +configure:3860: gcc -c -g -O2 conftest.c >&5 +configure:3863: $? = 0 +configure:4299: checking how to run the C preprocessor +configure:4339: gcc -E conftest.c +configure:4346: $? = 0 +configure:4377: gcc -E conftest.c +conftest.c:8:28: fatal error: ac_nonexistent.h: No such file or directory + #include + ^ +compilation terminated. +configure:4384: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "expat" +| #define PACKAGE_TARNAME "expat" +| #define PACKAGE_VERSION "1.95.7" +| #define PACKAGE_STRING "expat 1.95.7" +| #define PACKAGE_BUGREPORT "expat-bugs@mail.libexpat.org" +| /* end confdefs.h. */ +| #include +configure:4417: result: gcc -E +configure:4446: gcc -E conftest.c +configure:4453: $? = 0 +configure:4484: gcc -E conftest.c +conftest.c:8:28: fatal error: ac_nonexistent.h: No such file or directory + #include + ^ +compilation terminated. +configure:4491: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "expat" +| #define PACKAGE_TARNAME "expat" +| #define PACKAGE_VERSION "1.95.7" +| #define PACKAGE_STRING "expat 1.95.7" +| #define PACKAGE_BUGREPORT "expat-bugs@mail.libexpat.org" +| /* end confdefs.h. */ +| #include +configure:4531: checking for ANSI C header files +configure:4561: gcc -c -g -O2 conftest.c >&5 +configure:4568: $? = 0 +configure:4667: gcc -o conftest -g -O2 conftest.c >&5 +configure:4671: $? = 0 +configure:4677: ./conftest +configure:4681: $? = 0 +configure:4699: result: yes +configure:4723: checking for sys/types.h +configure:4744: gcc -c -g -O2 conftest.c >&5 +configure:4751: $? = 0 +configure:4768: result: yes +configure:4723: checking for sys/stat.h +configure:4744: gcc -c -g -O2 conftest.c >&5 +configure:4751: $? = 0 +configure:4768: result: yes +configure:4723: checking for stdlib.h +configure:4744: gcc -c -g -O2 conftest.c >&5 +configure:4751: $? = 0 +configure:4768: result: yes +configure:4723: checking for string.h +configure:4744: gcc -c -g -O2 conftest.c >&5 +configure:4751: $? = 0 +configure:4768: result: yes +configure:4723: checking for memory.h +configure:4744: gcc -c -g -O2 conftest.c >&5 +configure:4751: $? = 0 +configure:4768: result: yes +configure:4723: checking for strings.h +configure:4744: gcc -c -g -O2 conftest.c >&5 +configure:4751: $? = 0 +configure:4768: result: yes +configure:4723: checking for inttypes.h +configure:4744: gcc -c -g -O2 conftest.c >&5 +configure:4751: $? = 0 +configure:4768: result: yes +configure:4723: checking for stdint.h +configure:4744: gcc -c -g -O2 conftest.c >&5 +configure:4751: $? = 0 +configure:4768: result: yes +configure:4723: checking for unistd.h +configure:4744: gcc -c -g -O2 conftest.c >&5 +configure:4751: $? = 0 +configure:4768: result: yes +configure:4798: checking dlfcn.h usability +configure:4815: gcc -c -g -O2 conftest.c >&5 +configure:4822: $? = 0 +configure:4836: result: yes +configure:4840: checking dlfcn.h presence +configure:4855: gcc -E conftest.c +configure:4862: $? = 0 +configure:4876: result: yes +configure:4909: checking for dlfcn.h +configure:4918: result: yes +configure:4991: checking for g++ +configure:5007: found /usr/bin/g++ +configure:5018: result: g++ +configure:5045: checking for C++ compiler version +configure:5053: g++ --version >&5 +g++ (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4 +Copyright (C) 2013 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. + +configure:5057: $? = 0 +configure:5064: g++ -v >&5 +Using built-in specs. +COLLECT_GCC=g++ +COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper +Target: x86_64-linux-gnu +Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.8.4-2ubuntu1~14.04' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.8 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu +Thread model: posix +gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04) +configure:5068: $? = 0 +configure:5075: g++ -V >&5 +g++: error: unrecognized command line option '-V' +g++: fatal error: no input files +compilation terminated. +configure:5079: $? = 4 +configure:5082: checking whether we are using the GNU C++ compiler +configure:5111: g++ -c conftest.cpp >&5 +configure:5118: $? = 0 +configure:5135: result: yes +configure:5144: checking whether g++ accepts -g +configure:5174: g++ -c -g conftest.cpp >&5 +configure:5181: $? = 0 +configure:5282: result: yes +configure:5315: checking how to run the C++ preprocessor +configure:5351: g++ -E conftest.cpp +configure:5358: $? = 0 +configure:5389: g++ -E conftest.cpp +conftest.cpp:19:28: fatal error: ac_nonexistent.h: No such file or directory + #include + ^ +compilation terminated. +configure:5396: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "expat" +| #define PACKAGE_TARNAME "expat" +| #define PACKAGE_VERSION "1.95.7" +| #define PACKAGE_STRING "expat 1.95.7" +| #define PACKAGE_BUGREPORT "expat-bugs@mail.libexpat.org" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_DLFCN_H 1 +| /* end confdefs.h. */ +| #include +configure:5429: result: g++ -E +configure:5458: g++ -E conftest.cpp +configure:5465: $? = 0 +configure:5496: g++ -E conftest.cpp +conftest.cpp:19:28: fatal error: ac_nonexistent.h: No such file or directory + #include + ^ +compilation terminated. +configure:5503: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "expat" +| #define PACKAGE_TARNAME "expat" +| #define PACKAGE_VERSION "1.95.7" +| #define PACKAGE_STRING "expat 1.95.7" +| #define PACKAGE_BUGREPORT "expat-bugs@mail.libexpat.org" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_DLFCN_H 1 +| /* end confdefs.h. */ +| #include +configure:5598: checking for g77 +configure:5628: result: no +configure:5598: checking for xlf +configure:5628: result: no +configure:5598: checking for f77 +configure:5628: result: no +configure:5598: checking for frt +configure:5628: result: no +configure:5598: checking for pgf77 +configure:5628: result: no +configure:5598: checking for cf77 +configure:5628: result: no +configure:5598: checking for fort77 +configure:5628: result: no +configure:5598: checking for fl32 +configure:5628: result: no +configure:5598: checking for af77 +configure:5628: result: no +configure:5598: checking for xlf90 +configure:5628: result: no +configure:5598: checking for f90 +configure:5628: result: no +configure:5598: checking for pgf90 +configure:5628: result: no +configure:5598: checking for pghpf +configure:5628: result: no +configure:5598: checking for epcf90 +configure:5628: result: no +configure:5598: checking for gfortran +configure:5628: result: no +configure:5598: checking for g95 +configure:5628: result: no +configure:5598: checking for xlf95 +configure:5628: result: no +configure:5598: checking for f95 +configure:5628: result: no +configure:5598: checking for fort +configure:5628: result: no +configure:5598: checking for ifort +configure:5628: result: no +configure:5598: checking for ifc +configure:5628: result: no +configure:5598: checking for efc +configure:5628: result: no +configure:5598: checking for pgf95 +configure:5628: result: no +configure:5598: checking for lf95 +configure:5628: result: no +configure:5598: checking for ftn +configure:5628: result: no +configure:5651: checking for Fortran 77 compiler version +configure:5659: --version >&5 +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/configure: line 5661: --version: command not found +configure:5663: $? = 127 +configure:5670: -v >&5 +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/configure: line 5672: -v: command not found +configure:5674: $? = 127 +configure:5681: -V >&5 +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/configure: line 5683: -V: command not found +configure:5685: $? = 127 +configure:5693: checking whether we are using the GNU Fortran 77 compiler +configure:5712: -c conftest.F >&5 +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/configure: line 5714: -c: command not found +configure:5719: $? = 127 +configure: failed program was: +| program main +| #ifndef __GNUC__ +| choke me +| #endif +| +| end +configure:5736: result: no +configure:5742: checking whether accepts -g +configure:5759: -c -g conftest.f >&5 +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/configure: line 5761: -c: command not found +configure:5766: $? = 127 +configure: failed program was: +| program main +| +| end +configure:5782: result: no +configure:5815: checking the maximum length of command line arguments +configure:5927: result: 1572864 +configure:5939: checking command to parse /usr/bin/nm -B output from gcc object +configure:6044: gcc -c -g -O2 conftest.c >&5 +configure:6047: $? = 0 +configure:6051: /usr/bin/nm -B conftest.o \| sed -n -e 's/^.*[ ]\([ABCDGIRSTW][ABCDGIRSTW]*\)[ ][ ]*\([_A-Za-z][_A-Za-z0-9]*\)$/\1 \2 \2/p' \> conftest.nm +configure:6054: $? = 0 +configure:6106: gcc -o conftest -g -O2 conftest.c conftstm.o >&5 +configure:6109: $? = 0 +configure:6147: result: ok +configure:6151: checking for objdir +configure:6166: result: .libs +configure:6258: checking for ar +configure:6274: found /usr/bin/ar +configure:6285: result: ar +configure:6350: checking for ranlib +configure:6366: found /usr/bin/ranlib +configure:6377: result: ranlib +configure:6442: checking for strip +configure:6458: found /usr/bin/strip +configure:6469: result: strip +configure:7063: checking if gcc supports -fno-rtti -fno-exceptions +configure:7081: gcc -c -g -O2 -fno-rtti -fno-exceptions conftest.c >&5 +cc1: warning: command line option '-fno-rtti' is valid for C++/ObjC++ but not for C [enabled by default] +configure:7085: $? = 0 +configure:7098: result: no +configure:7113: checking for gcc option to produce PIC +configure:7345: result: -fPIC +configure:7353: checking if gcc PIC flag -fPIC works +configure:7371: gcc -c -g -O2 -fPIC -DPIC conftest.c >&5 +configure:7375: $? = 0 +configure:7388: result: yes +configure:7416: checking if gcc static flag -static works +configure:7444: result: yes +configure:7454: checking if gcc supports -c -o file.o +configure:7475: gcc -c -g -O2 -o out/conftest2.o conftest.c >&5 +configure:7479: $? = 0 +configure:7501: result: yes +configure:7527: checking whether the gcc linker (/usr/bin/ld -m elf_x86_64) supports shared libraries +configure:8515: result: yes +configure:8536: checking whether -lc should be explicitly linked in +configure:8541: gcc -c -g -O2 conftest.c >&5 +configure:8544: $? = 0 +configure:8559: gcc -shared conftest.o -v -Wl,-soname -Wl,conftest -o conftest 2\>\&1 \| grep -lc \>/dev/null 2\>\&1 +configure:8562: $? = 0 +configure:8574: result: no +configure:8582: checking dynamic linker characteristics +configure:9186: result: GNU/Linux ld.so +configure:9210: checking how to hardcode library paths into programs +configure:9235: result: immediate +configure:9249: checking whether stripping libraries is possible +configure:9254: result: yes +configure:10084: checking if libtool supports shared libraries +configure:10086: result: yes +configure:10089: checking whether to build shared libraries +configure:10110: result: yes +configure:10113: checking whether to build static libraries +configure:10117: result: yes +configure:10211: creating libtool +configure:10804: checking for ld used by g++ +configure:10871: result: /usr/bin/ld -m elf_x86_64 +configure:10880: checking if the linker (/usr/bin/ld -m elf_x86_64) is GNU ld +configure:10895: result: yes +configure:10946: checking whether the g++ linker (/usr/bin/ld -m elf_x86_64) supports shared libraries +configure:11900: result: yes +configure:11921: g++ -c -g -O2 conftest.cpp >&5 +configure:11924: $? = 0 +configure:12080: checking for g++ option to produce PIC +configure:12364: result: -fPIC +configure:12372: checking if g++ PIC flag -fPIC works +configure:12390: g++ -c -g -O2 -fPIC -DPIC conftest.cpp >&5 +configure:12394: $? = 0 +configure:12407: result: yes +configure:12435: checking if g++ static flag -static works +configure:12463: result: yes +configure:12473: checking if g++ supports -c -o file.o +configure:12494: g++ -c -g -O2 -o out/conftest2.o conftest.cpp >&5 +configure:12498: $? = 0 +configure:12520: result: yes +configure:12546: checking whether the g++ linker (/usr/bin/ld -m elf_x86_64) supports shared libraries +configure:12572: result: yes +configure:12639: checking dynamic linker characteristics +configure:13191: result: GNU/Linux ld.so +configure:13215: checking how to hardcode library paths into programs +configure:13240: result: immediate +configure:19540: checking for gcc +configure:19567: result: gcc +configure:19799: checking for C compiler version +configure:19807: gcc --version >&5 +gcc (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4 +Copyright (C) 2013 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. + +configure:19811: $? = 0 +configure:19818: gcc -v >&5 +Using built-in specs. +COLLECT_GCC=gcc +COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper +Target: x86_64-linux-gnu +Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.8.4-2ubuntu1~14.04' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.8 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu +Thread model: posix +gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04) +configure:19822: $? = 0 +configure:19829: gcc -V >&5 +gcc: error: unrecognized command line option '-V' +gcc: fatal error: no input files +compilation terminated. +configure:19833: $? = 4 +configure:19836: checking whether we are using the GNU C compiler +configure:19889: result: yes +configure:19898: checking whether gcc accepts -g +configure:20036: result: yes +configure:20053: checking for gcc option to accept ISO C89 +configure:20157: result: none needed +configure:20189: checking for a BSD-compatible install +configure:20257: result: /usr/bin/install -c +configure:20269: checking for ANSI C header files +configure:20437: result: yes +configure:20450: checking whether byte ordering is bigendian +configure:20475: gcc -c -g -O2 conftest.c >&5 +conftest.c:21:9: error: unknown type name 'not' + not a universal capable compiler + ^ +conftest.c:21:15: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'universal' + not a universal capable compiler + ^ +conftest.c:21:15: error: unknown type name 'universal' +configure:20482: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "expat" +| #define PACKAGE_TARNAME "expat" +| #define PACKAGE_VERSION "1.95.7" +| #define PACKAGE_STRING "expat 1.95.7" +| #define PACKAGE_BUGREPORT "expat-bugs@mail.libexpat.org" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_DLFCN_H 1 +| #define STDC_HEADERS 1 +| /* end confdefs.h. */ +| #ifndef __APPLE_CC__ +| not a universal capable compiler +| #endif +| typedef int dummy; +| +configure:20532: gcc -c -g -O2 conftest.c >&5 +configure:20539: $? = 0 +configure:20571: gcc -c -g -O2 conftest.c >&5 +conftest.c: In function 'main': +conftest.c:27:4: error: unknown type name 'not' + not big endian + ^ +conftest.c:27:12: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'endian' + not big endian + ^ +configure:20578: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "expat" +| #define PACKAGE_TARNAME "expat" +| #define PACKAGE_VERSION "1.95.7" +| #define PACKAGE_STRING "expat 1.95.7" +| #define PACKAGE_BUGREPORT "expat-bugs@mail.libexpat.org" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_DLFCN_H 1 +| #define STDC_HEADERS 1 +| /* end confdefs.h. */ +| #include +| #include +| +| int +| main () +| { +| #if BYTE_ORDER != BIG_ENDIAN +| not big endian +| #endif +| +| ; +| return 0; +| } +configure:20830: result: no +configure:20862: checking for an ANSI C-conforming const +configure:20937: gcc -c -g -O2 conftest.c >&5 +configure:20944: $? = 0 +configure:20959: result: yes +configure:20969: checking for size_t +configure:20997: gcc -c -g -O2 conftest.c >&5 +configure:21004: $? = 0 +configure:21031: gcc -c -g -O2 conftest.c >&5 +conftest.c: In function 'main': +conftest.c:56:21: error: expected expression before ')' token + if (sizeof ((size_t))) + ^ +configure:21038: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "expat" +| #define PACKAGE_TARNAME "expat" +| #define PACKAGE_VERSION "1.95.7" +| #define PACKAGE_STRING "expat 1.95.7" +| #define PACKAGE_BUGREPORT "expat-bugs@mail.libexpat.org" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_DLFCN_H 1 +| #define STDC_HEADERS 1 +| /* end confdefs.h. */ +| #include +| #ifdef HAVE_SYS_TYPES_H +| # include +| #endif +| #ifdef HAVE_SYS_STAT_H +| # include +| #endif +| #ifdef STDC_HEADERS +| # include +| # include +| #else +| # ifdef HAVE_STDLIB_H +| # include +| # endif +| #endif +| #ifdef HAVE_STRING_H +| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H +| # include +| # endif +| # include +| #endif +| #ifdef HAVE_STRINGS_H +| # include +| #endif +| #ifdef HAVE_INTTYPES_H +| # include +| #endif +| #ifdef HAVE_STDINT_H +| # include +| #endif +| #ifdef HAVE_UNISTD_H +| # include +| #endif +| int +| main () +| { +| if (sizeof ((size_t))) +| return 0; +| ; +| return 0; +| } +configure:21061: result: yes +configure:21078: checking for memmove +configure:21134: gcc -o conftest -g -O2 conftest.c >&5 +conftest.c:43:6: warning: conflicting types for built-in function 'memmove' [enabled by default] + char memmove (); + ^ +configure:21141: $? = 0 +configure:21163: result: yes +configure:21078: checking for bcopy +configure:21134: gcc -o conftest -g -O2 conftest.c >&5 +conftest.c:44:6: warning: conflicting types for built-in function 'bcopy' [enabled by default] + char bcopy (); + ^ +configure:21141: $? = 0 +configure:21163: result: yes +configure:21192: checking check.h usability +configure:21209: gcc -c -g -O2 conftest.c >&5 +conftest.c:55:19: fatal error: check.h: No such file or directory + #include + ^ +compilation terminated. +configure:21216: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "expat" +| #define PACKAGE_TARNAME "expat" +| #define PACKAGE_VERSION "1.95.7" +| #define PACKAGE_STRING "expat 1.95.7" +| #define PACKAGE_BUGREPORT "expat-bugs@mail.libexpat.org" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_DLFCN_H 1 +| #define STDC_HEADERS 1 +| #define HAVE_MEMMOVE 1 +| #define HAVE_BCOPY 1 +| /* end confdefs.h. */ +| #include +| #ifdef HAVE_SYS_TYPES_H +| # include +| #endif +| #ifdef HAVE_SYS_STAT_H +| # include +| #endif +| #ifdef STDC_HEADERS +| # include +| # include +| #else +| # ifdef HAVE_STDLIB_H +| # include +| # endif +| #endif +| #ifdef HAVE_STRING_H +| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H +| # include +| # endif +| # include +| #endif +| #ifdef HAVE_STRINGS_H +| # include +| #endif +| #ifdef HAVE_INTTYPES_H +| # include +| #endif +| #ifdef HAVE_STDINT_H +| # include +| #endif +| #ifdef HAVE_UNISTD_H +| # include +| #endif +| #include +configure:21230: result: no +configure:21234: checking check.h presence +configure:21249: gcc -E conftest.c +conftest.c:22:19: fatal error: check.h: No such file or directory + #include + ^ +compilation terminated. +configure:21256: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "expat" +| #define PACKAGE_TARNAME "expat" +| #define PACKAGE_VERSION "1.95.7" +| #define PACKAGE_STRING "expat 1.95.7" +| #define PACKAGE_BUGREPORT "expat-bugs@mail.libexpat.org" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_DLFCN_H 1 +| #define STDC_HEADERS 1 +| #define HAVE_MEMMOVE 1 +| #define HAVE_BCOPY 1 +| /* end confdefs.h. */ +| #include +configure:21270: result: no +configure:21303: checking for check.h +configure:21312: result: no +configure:21449: creating ./config.status + +## ---------------------- ## +## Running config.status. ## +## ---------------------- ## + +This file was extended by expat config.status 1.95.7, which was +generated by GNU Autoconf 2.63. Invocation command line was + + CONFIG_FILES = + CONFIG_HEADERS = + CONFIG_LINKS = + CONFIG_COMMANDS = + $ ./config.status + +on ubuntu + +config.status:766: creating Makefile +config.status:766: creating expat_config.h +config.status:982: expat_config.h is unchanged + +## ---------------- ## +## Cache variables. ## +## ---------------- ## + +ac_cv_build=x86_64-unknown-linux-gnu +ac_cv_c_bigendian=no +ac_cv_c_compiler_gnu=yes +ac_cv_c_const=yes +ac_cv_cxx_compiler_gnu=yes +ac_cv_env_CCC_set= +ac_cv_env_CCC_value= +ac_cv_env_CC_set= +ac_cv_env_CC_value= +ac_cv_env_CFLAGS_set= +ac_cv_env_CFLAGS_value= +ac_cv_env_CPPFLAGS_set= +ac_cv_env_CPPFLAGS_value= +ac_cv_env_CPP_set= +ac_cv_env_CPP_value= +ac_cv_env_CXXCPP_set= +ac_cv_env_CXXCPP_value= +ac_cv_env_CXXFLAGS_set= +ac_cv_env_CXXFLAGS_value= +ac_cv_env_CXX_set= +ac_cv_env_CXX_value= +ac_cv_env_F77_set= +ac_cv_env_F77_value= +ac_cv_env_FFLAGS_set= +ac_cv_env_FFLAGS_value= +ac_cv_env_LDFLAGS_set= +ac_cv_env_LDFLAGS_value= +ac_cv_env_LIBS_set= +ac_cv_env_LIBS_value= +ac_cv_env_build_alias_set= +ac_cv_env_build_alias_value= +ac_cv_env_host_alias_set= +ac_cv_env_host_alias_value= +ac_cv_env_target_alias_set= +ac_cv_env_target_alias_value= +ac_cv_f77_compiler_gnu=no +ac_cv_func_bcopy=yes +ac_cv_func_memmove=yes +ac_cv_header_check_h=no +ac_cv_header_dlfcn_h=yes +ac_cv_header_inttypes_h=yes +ac_cv_header_memory_h=yes +ac_cv_header_stdc=yes +ac_cv_header_stdint_h=yes +ac_cv_header_stdlib_h=yes +ac_cv_header_string_h=yes +ac_cv_header_strings_h=yes +ac_cv_header_sys_stat_h=yes +ac_cv_header_sys_types_h=yes +ac_cv_header_unistd_h=yes +ac_cv_host=x86_64-unknown-linux-gnu +ac_cv_objext=o +ac_cv_path_EGREP='/bin/grep -E' +ac_cv_path_GREP=/bin/grep +ac_cv_path_install='/usr/bin/install -c' +ac_cv_prog_CPP='gcc -E' +ac_cv_prog_CXXCPP='g++ -E' +ac_cv_prog_ac_ct_AR=ar +ac_cv_prog_ac_ct_CC=gcc +ac_cv_prog_ac_ct_CXX=g++ +ac_cv_prog_ac_ct_RANLIB=ranlib +ac_cv_prog_ac_ct_STRIP=strip +ac_cv_prog_cc_c89= +ac_cv_prog_cc_g=yes +ac_cv_prog_cxx_g=yes +ac_cv_prog_f77_g=no +ac_cv_target=x86_64-unknown-linux-gnu +ac_cv_type_size_t=yes +lt_cv_deplibs_check_method=pass_all +lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_ld_reload_flag=-r +lt_cv_objdir=.libs +lt_cv_path_LD=/usr/bin/ld +lt_cv_path_LDCXX='/usr/bin/ld -m elf_x86_64' +lt_cv_path_NM='/usr/bin/nm -B' +lt_cv_path_SED=/bin/sed +lt_cv_prog_compiler_c_o=yes +lt_cv_prog_compiler_c_o_CXX=yes +lt_cv_prog_compiler_pic_works=yes +lt_cv_prog_compiler_pic_works_CXX=yes +lt_cv_prog_compiler_rtti_exceptions=no +lt_cv_prog_compiler_static_works=yes +lt_cv_prog_compiler_static_works_CXX=yes +lt_cv_prog_gnu_ld=yes +lt_cv_prog_gnu_ldcxx=yes +lt_cv_sys_global_symbol_pipe='sed -n -e '\''s/^.*[ ]\([ABCDGIRSTW][ABCDGIRSTW]*\)[ ][ ]*\([_A-Za-z][_A-Za-z0-9]*\)$/\1 \2 \2/p'\''' +lt_cv_sys_global_symbol_to_c_name_address='sed -n -e '\''s/^: \([^ ]*\) $/ {\"\1\", (lt_ptr) 0},/p'\'' -e '\''s/^[BCDEGRST] \([^ ]*\) \([^ ]*\)$/ {"\2", (lt_ptr) \&\2},/p'\''' +lt_cv_sys_global_symbol_to_cdecl='sed -n -e '\''s/^. .* \(.*\)$/extern int \1;/p'\''' +lt_cv_sys_lib_dlsearch_path_spec='/usr/lib64 /lib64 /usr/lib/x86_64-linux-gnu/libfakeroot /usr/local/lib /lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu ' +lt_cv_sys_lib_search_path_spec='/usr/lib64 /lib64 /usr/local/lib64' +lt_cv_sys_max_cmd_len=1572864 +lt_lt_cv_prog_compiler_c_o='"yes"' +lt_lt_cv_prog_compiler_c_o_CXX='"yes"' +lt_lt_cv_sys_global_symbol_pipe='"sed -n -e '\''s/^.*[ ]\\([ABCDGIRSTW][ABCDGIRSTW]*\\)[ ][ ]*\\([_A-Za-z][_A-Za-z0-9]*\\)\$/\\1 \\2 \\2/p'\''"' +lt_lt_cv_sys_global_symbol_to_c_name_address='"sed -n -e '\''s/^: \\([^ ]*\\) \$/ {\\\"\\1\\\", (lt_ptr) 0},/p'\'' -e '\''s/^[BCDEGRST] \\([^ ]*\\) \\([^ ]*\\)\$/ {\"\\2\", (lt_ptr) \\&\\2},/p'\''"' +lt_lt_cv_sys_global_symbol_to_cdecl='"sed -n -e '\''s/^. .* \\(.*\\)\$/extern int \\1;/p'\''"' + +## ----------------- ## +## Output variables. ## +## ----------------- ## + +AR='ar' +AS='as' +CC='gcc' +CFLAGS='-g -O2' +CPP='gcc -E' +CPPFLAGS='' +CXX='g++' +CXXCPP='g++ -E' +CXXFLAGS='-g -O2' +DEFS='-DHAVE_CONFIG_H' +DLLTOOL='dlltool' +DSYMUTIL='' +ECHO='echo' +ECHO_C='' +ECHO_N='-n' +ECHO_T='' +EGREP='/bin/grep -E' +EXEEXT='' +F77='' +FFLAGS='' +GREP='/bin/grep' +INSTALL_DATA='${INSTALL} -m 644' +INSTALL_PROGRAM='${INSTALL}' +INSTALL_SCRIPT='${INSTALL}' +LDFLAGS='' +LIBAGE='5' +LIBCURRENT='5' +LIBOBJS='' +LIBREVISION='0' +LIBS='' +LIBTOOL='$(SHELL) $(top_builddir)/libtool' +LN_S='ln -s' +LTLIBOBJS='' +NMEDIT='' +OBJDUMP='objdump' +OBJEXT='o' +PACKAGE_BUGREPORT='expat-bugs@mail.libexpat.org' +PACKAGE_NAME='expat' +PACKAGE_STRING='expat 1.95.7' +PACKAGE_TARNAME='expat' +PACKAGE_VERSION='1.95.7' +PATH_SEPARATOR=':' +RANLIB='ranlib' +SED='/bin/sed' +SHELL='/bin/bash' +STRIP='strip' +ac_ct_CC='gcc' +ac_ct_CXX='g++' +ac_ct_F77='' +bindir='/bottlenecks/rubbos/app/apache2/bin' +build='x86_64-unknown-linux-gnu' +build_alias='' +build_cpu='x86_64' +build_os='linux-gnu' +build_vendor='unknown' +datadir='${datarootdir}' +datarootdir='${prefix}/share' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +dvidir='${docdir}' +exec_prefix='/bottlenecks/rubbos/app/apache2' +host='x86_64-unknown-linux-gnu' +host_alias='' +host_cpu='x86_64' +host_os='linux-gnu' +host_vendor='unknown' +htmldir='${docdir}' +includedir='/bottlenecks/rubbos/app/apache2/include' +infodir='${datarootdir}/info' +libdir='/bottlenecks/rubbos/app/apache2/lib' +libexecdir='${exec_prefix}/libexec' +localedir='${datarootdir}/locale' +localstatedir='${prefix}/var' +mandir='${datarootdir}/man' +oldincludedir='/usr/include' +pdfdir='${docdir}' +prefix='/bottlenecks/rubbos/app/apache2' +program_transform_name='s,x,x,' +psdir='${docdir}' +sbindir='${exec_prefix}/sbin' +sharedstatedir='${prefix}/com' +sysconfdir='${prefix}/etc' +target='x86_64-unknown-linux-gnu' +target_alias='' +target_cpu='x86_64' +target_os='linux-gnu' +target_vendor='unknown' + +## ----------- ## +## confdefs.h. ## +## ----------- ## + +#define PACKAGE_NAME "expat" +#define PACKAGE_TARNAME "expat" +#define PACKAGE_VERSION "1.95.7" +#define PACKAGE_STRING "expat 1.95.7" +#define PACKAGE_BUGREPORT "expat-bugs@mail.libexpat.org" +#define STDC_HEADERS 1 +#define HAVE_SYS_TYPES_H 1 +#define HAVE_SYS_STAT_H 1 +#define HAVE_STDLIB_H 1 +#define HAVE_STRING_H 1 +#define HAVE_MEMORY_H 1 +#define HAVE_STRINGS_H 1 +#define HAVE_INTTYPES_H 1 +#define HAVE_STDINT_H 1 +#define HAVE_UNISTD_H 1 +#define HAVE_DLFCN_H 1 +#define STDC_HEADERS 1 +#define HAVE_MEMMOVE 1 +#define HAVE_BCOPY 1 +#define XML_NS 1 +#define XML_DTD 1 +#define XML_CONTEXT_BYTES 1024 + +configure: exit 0 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/config.status b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/config.status new file mode 100755 index 00000000..d3c51482 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/config.status @@ -0,0 +1,1006 @@ +#! /bin/bash +# Generated by configure. +# 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-/bin/bash} +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be more Bourne compatible +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 + + + + +# PATH needs CR +# 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_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +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 + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + 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 + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + { (exit 1); exit 1; } +fi + +# Work around bugs in pre-3.0 UWIN ksh. +for as_var in ENV MAIL MAILPATH +do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# Required to use basename. +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 + + +# Name of the executable. +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# CDPATH. +$as_unset CDPATH + + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line after each line using $LINENO; the second 'sed' + # does the real work. The second script uses 'N' to pair each + # line-number line with the line containing $LINENO, and appends + # trailing '-' during substitution so that $LINENO is not a special + # case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # scripts with optimization help from Paolo Bonzini. Blame Lee + # E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + 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" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); exit 1; }; } + + # 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 +} + + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in +-n*) + case `echo 'x\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + *) ECHO_C='\c';; + esac;; +*) + ECHO_N='-n';; +esac +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +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 -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +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=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&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 expat $as_me 1.95.7, which was +generated by GNU Autoconf 2.63. 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` +" + +# Files that config.status was made for. +config_files=" Makefile" +config_headers=" expat_config.h" + +ac_cs_usage="\ +\`$as_me' instantiates files from templates according to the +current configuration. + +Usage: $0 [OPTION]... [FILE]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, 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 + +Report bugs to ." + +ac_cs_version="\ +expat config.status 1.95.7 +configured by /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/configure, generated by GNU Autoconf 2.63, + with options \"'--disable-option-checking' '--enable-module=so' '--enable-so' '--with-mpm=worker' '--srcdir=/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util' '--with-apr=../apr' '--libdir=\${prefix}/lib' '--bindir=\${prefix}/bin' '--cache-file=/dev/null' '--srcdir=/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat' '--prefix=/bottlenecks/rubbos/app/apache2' '--exec-prefix=/bottlenecks/rubbos/app/apache2' '--libdir=/bottlenecks/rubbos/app/apache2/lib' '--includedir=/bottlenecks/rubbos/app/apache2/include' '--bindir=/bottlenecks/rubbos/app/apache2/bin'\" + +Copyright (C) 2008 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='/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat' +srcdir='.' +INSTALL='/usr/bin/install -c' +test -n "$AWK" || AWK=awk +# 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=$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 ) + $as_echo "$ac_cs_version"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + CONFIG_FILES="$CONFIG_FILES '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + CONFIG_HEADERS="$CONFIG_HEADERS '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + { $as_echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; };; + --help | --hel | -h ) + $as_echo "$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_echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } ;; + + *) ac_config_targets="$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 + +if $ac_cs_recheck; then + set X '/bin/bash' '/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/configure' '--disable-option-checking' '--enable-module=so' '--enable-so' '--with-mpm=worker' '--srcdir=/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util' '--with-apr=../apr' '--libdir=${prefix}/lib' '--bindir=${prefix}/bin' '--cache-file=/dev/null' '--srcdir=/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat' '--prefix=/bottlenecks/rubbos/app/apache2' '--exec-prefix=/bottlenecks/rubbos/app/apache2' '--libdir=/bottlenecks/rubbos/app/apache2/lib' '--includedir=/bottlenecks/rubbos/app/apache2/include' '--bindir=/bottlenecks/rubbos/app/apache2/bin' $ac_configure_extra_args --no-create --no-recursion + shift + $as_echo "running CONFIG_SHELL=/bin/bash $*" >&6 + CONFIG_SHELL='/bin/bash' + export CONFIG_SHELL + exec "$@" +fi + +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "expat_config.h") CONFIG_HEADERS="$CONFIG_HEADERS expat_config.h" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + + *) { { $as_echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 +$as_echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; + 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+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers +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= + trap 'exit_status=$? + { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status +' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || +{ + $as_echo "$as_me: cannot create a temporary directory in ." >&2 + { (exit 1); exit 1; } +} + +# 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=' ' +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 {' >"$tmp/subs1.awk" && +cat >>"$tmp/subs1.awk" <<\_ACAWK && +S["LTLIBOBJS"]="" +S["LIBOBJS"]="" +S["INSTALL_DATA"]="${INSTALL} -m 644" +S["INSTALL_SCRIPT"]="${INSTALL}" +S["INSTALL_PROGRAM"]="${INSTALL}" +S["LIBAGE"]="5" +S["LIBREVISION"]="0" +S["LIBCURRENT"]="5" +S["LIBTOOL"]="$(SHELL) $(top_builddir)/libtool" +S["ac_ct_F77"]="" +S["FFLAGS"]="" +S["F77"]="" +S["CXXCPP"]="g++ -E" +S["ac_ct_CXX"]="g++" +S["CXXFLAGS"]="-g -O2" +S["CXX"]="g++" +S["CPP"]="gcc -E" +S["OBJDUMP"]="objdump" +S["AS"]="as" +S["DLLTOOL"]="dlltool" +S["NMEDIT"]="" +S["DSYMUTIL"]="" +S["STRIP"]="strip" +S["RANLIB"]="ranlib" +S["AR"]="ar" +S["ECHO"]="echo" +S["LN_S"]="ln -s" +S["EGREP"]="/bin/grep -E" +S["GREP"]="/bin/grep" +S["SED"]="/bin/sed" +S["OBJEXT"]="o" +S["EXEEXT"]="" +S["ac_ct_CC"]="gcc" +S["CPPFLAGS"]="" +S["LDFLAGS"]="" +S["CFLAGS"]="-g -O2" +S["CC"]="gcc" +S["target_os"]="linux-gnu" +S["target_vendor"]="unknown" +S["target_cpu"]="x86_64" +S["target"]="x86_64-unknown-linux-gnu" +S["host_os"]="linux-gnu" +S["host_vendor"]="unknown" +S["host_cpu"]="x86_64" +S["host"]="x86_64-unknown-linux-gnu" +S["build_os"]="linux-gnu" +S["build_vendor"]="unknown" +S["build_cpu"]="x86_64" +S["build"]="x86_64-unknown-linux-gnu" +S["target_alias"]="" +S["host_alias"]="" +S["build_alias"]="" +S["LIBS"]="" +S["ECHO_T"]="" +S["ECHO_N"]="-n" +S["ECHO_C"]="" +S["DEFS"]="-DHAVE_CONFIG_H" +S["mandir"]="${datarootdir}/man" +S["localedir"]="${datarootdir}/locale" +S["libdir"]="/bottlenecks/rubbos/app/apache2/lib" +S["psdir"]="${docdir}" +S["pdfdir"]="${docdir}" +S["dvidir"]="${docdir}" +S["htmldir"]="${docdir}" +S["infodir"]="${datarootdir}/info" +S["docdir"]="${datarootdir}/doc/${PACKAGE_TARNAME}" +S["oldincludedir"]="/usr/include" +S["includedir"]="/bottlenecks/rubbos/app/apache2/include" +S["localstatedir"]="${prefix}/var" +S["sharedstatedir"]="${prefix}/com" +S["sysconfdir"]="${prefix}/etc" +S["datadir"]="${datarootdir}" +S["datarootdir"]="${prefix}/share" +S["libexecdir"]="${exec_prefix}/libexec" +S["sbindir"]="${exec_prefix}/sbin" +S["bindir"]="/bottlenecks/rubbos/app/apache2/bin" +S["program_transform_name"]="s,x,x," +S["prefix"]="/bottlenecks/rubbos/app/apache2" +S["exec_prefix"]="/bottlenecks/rubbos/app/apache2" +S["PACKAGE_BUGREPORT"]="expat-bugs@mail.libexpat.org" +S["PACKAGE_STRING"]="expat 1.95.7" +S["PACKAGE_VERSION"]="1.95.7" +S["PACKAGE_TARNAME"]="expat" +S["PACKAGE_NAME"]="expat" +S["PATH_SEPARATOR"]=":" +S["SHELL"]="/bin/bash" +_ACAWK +cat >>"$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 +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 < "$tmp/subs1.awk" > "$tmp/subs.awk" \ + || { { $as_echo "$as_me:$LINENO: error: could not setup config files machinery" >&5 +$as_echo "$as_me: error: could not setup config files machinery" >&2;} + { (exit 1); exit 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 >"$tmp/defines.awk" <<\_ACAWK || +BEGIN { +D["PACKAGE_NAME"]=" \"expat\"" +D["PACKAGE_TARNAME"]=" \"expat\"" +D["PACKAGE_VERSION"]=" \"1.95.7\"" +D["PACKAGE_STRING"]=" \"expat 1.95.7\"" +D["PACKAGE_BUGREPORT"]=" \"expat-bugs@mail.libexpat.org\"" +D["STDC_HEADERS"]=" 1" +D["HAVE_SYS_TYPES_H"]=" 1" +D["HAVE_SYS_STAT_H"]=" 1" +D["HAVE_STDLIB_H"]=" 1" +D["HAVE_STRING_H"]=" 1" +D["HAVE_MEMORY_H"]=" 1" +D["HAVE_STRINGS_H"]=" 1" +D["HAVE_INTTYPES_H"]=" 1" +D["HAVE_STDINT_H"]=" 1" +D["HAVE_UNISTD_H"]=" 1" +D["HAVE_DLFCN_H"]=" 1" +D["STDC_HEADERS"]=" 1" +D["HAVE_MEMMOVE"]=" 1" +D["HAVE_BCOPY"]=" 1" +D["XML_NS"]=" 1" +D["XML_DTD"]=" 1" +D["XML_CONTEXT_BYTES"]=" 1024" + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+[_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ][_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789]*([\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 + { { $as_echo "$as_me:$LINENO: error: could not setup config headers machinery" >&5 +$as_echo "$as_me: error: could not setup config headers machinery" >&2;} + { (exit 1); exit 1; }; } +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS " +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_echo "$as_me:$LINENO: error: invalid tag $ac_tag" >&5 +$as_echo "$as_me: error: invalid tag $ac_tag" >&2;} + { (exit 1); exit 1; }; };; + :[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="$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_echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 +$as_echo "$as_me: error: cannot find input file: $ac_f" >&2;} + { (exit 1); exit 1; }; };; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + ac_file_inputs="$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 '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:$LINENO: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$tmp/stdin" \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } ;; + 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 || +$as_echo 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" + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$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 || +$as_echo 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_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 +$as_echo "$as_me: error: cannot create directory $as_dir" >&2;} + { (exit 1); exit 1; }; }; } + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$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 + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac +# 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@*) + { $as_echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} + ac_datarootdir_hack=' + s&@datadir@&${datarootdir}&g + s&@docdir@&${datarootdir}/doc/${PACKAGE_TARNAME}&g + s&@infodir@&${datarootdir}/info&g + s&@localedir@&${datarootdir}/locale&g + s&@mandir@&${datarootdir}/man&g + s&\${datarootdir}&${prefix}/share&g' ;; +esac +ac_sed_extra="/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/ +s/:*\${srcdir}:*/:/ +s/:*@srcdir@:*/:/ +s/^\([^=]*=[ ]*\):*/\1/ +s/:*$// +s/^[^=]*=[ ]*$// +} + +: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 +s&@INSTALL@&$ac_INSTALL&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&5 +$as_echo "$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 "$tmp/stdin" + case $ac_file in + -) cat "$tmp/out" && rm -f "$tmp/out";; + *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; + esac \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" + } >"$tmp/config.h" \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:$LINENO: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$tmp/config.h" "$ac_file" \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ + || { { $as_echo "$as_me:$LINENO: error: could not create -" >&5 +$as_echo "$as_me: error: could not create -" >&2;} + { (exit 1); exit 1; }; } + fi + ;; + + + esac + +done # for ac_tag + + +{ (exit 0); exit 0; } diff --git a/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/configure b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/configure new file mode 100755 index 00000000..c45e0acb --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/configure @@ -0,0 +1,22597 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.63 for expat 1.95.7. +# +# Report bugs to . +# +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +# 2002, 2003, 2004, 2005, 2006, 2007, 2008 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 -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 + + + + +# PATH needs CR +# 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_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +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 + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + 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 + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + { (exit 1); exit 1; } +fi + +# Work around bugs in pre-3.0 UWIN ksh. +for as_var in ENV MAIL MAILPATH +do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# Required to use basename. +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 + + +# Name of the executable. +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# CDPATH. +$as_unset CDPATH + + +if test "x$CONFIG_SHELL" = x; then + if (eval ":") 2>/dev/null; then + as_have_required=yes +else + as_have_required=no +fi + + if test $as_have_required = yes && (eval ": +(as_func_return () { + (exit \$1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = \"\$1\" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test \$exitcode = 0) || { (exit 1); exit 1; } + +( + as_lineno_1=\$LINENO + as_lineno_2=\$LINENO + test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && + test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } +") 2> /dev/null; then + : +else + as_candidate_shells= + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + case $as_dir in + /*) + for as_base in sh bash ksh sh5; do + as_candidate_shells="$as_candidate_shells $as_dir/$as_base" + done;; + esac +done +IFS=$as_save_IFS + + + for as_shell in $as_candidate_shells $SHELL; do + # Try only shells that exist, to save several forks. + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { ("$as_shell") 2> /dev/null <<\_ASEOF +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 + + +: +_ASEOF +}; then + CONFIG_SHELL=$as_shell + as_have_required=yes + if { "$as_shell" 2> /dev/null <<\_ASEOF +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 + + +: +(as_func_return () { + (exit $1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = "$1" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test $exitcode = 0) || { (exit 1); exit 1; } + +( + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } + +_ASEOF +}; then + break +fi + +fi + + done + + if test "x$CONFIG_SHELL" != x; then + for as_var in BASH_ENV ENV + do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var + done + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} +fi + + + if test $as_have_required = no; then + echo This script requires a shell more modern than all the + echo shells that I found on your system. Please install a + echo modern shell, or manually run the script under such a + echo shell if you do have one. + { (exit 1); exit 1; } +fi + + +fi + +fi + + + +(eval "as_func_return () { + (exit \$1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = \"\$1\" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test \$exitcode = 0") || { + echo No shell found that supports shell functions. + echo Please tell bug-autoconf@gnu.org about your system, + echo including any error possibly output before this message. + echo This can help us improve future autoconf versions. + echo Configuration will now proceed without shell functions. +} + + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line after each line using $LINENO; the second 'sed' + # does the real work. The second script uses 'N' to pair each + # line-number line with the line containing $LINENO, and appends + # trailing '-' during substitution so that $LINENO is not a special + # case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # scripts with optimization help from Paolo Bonzini. Blame Lee + # E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + 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" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); exit 1; }; } + + # 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 +} + + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in +-n*) + case `echo 'x\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + *) ECHO_C='\c';; + esac;; +*) + ECHO_N='-n';; +esac +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +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 -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +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=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + + + +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} + +case X$ECHO in +X*--fallback-echo) + # Remove one level of quotation (which was required for Make). + ECHO=`echo "$ECHO" | sed 's,\\\\\$\\$0,'$0','` + ;; +esac + +echo=${ECHO-echo} +if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X$1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then + # Yippee, $echo works! + : +else + # Restart under the correct shell. + exec $SHELL "$0" --no-reexec ${1+"$@"} +fi + +if test "X$1" = X--fallback-echo; then + # used as fallback echo + shift + cat </dev/null 2>&1 && unset CDPATH + +if test -z "$ECHO"; then +if test "X${echo_test_string+set}" != Xset; then +# find a string as large as possible, as long as the shell can cope with it + for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do + # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... + if (echo_test_string=`eval $cmd`) 2>/dev/null && + echo_test_string=`eval $cmd` && + (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null + then + break + fi + done +fi + +if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + : +else + # The Solaris, AIX, and Digital Unix default echo programs unquote + # backslashes. This makes it impossible to quote backslashes using + # echo "$something" | sed 's/\\/\\\\/g' + # + # So, first we look for a working echo in the user's PATH. + + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for dir in $PATH /usr/ucb; do + IFS="$lt_save_ifs" + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$dir/echo" + break + fi + done + IFS="$lt_save_ifs" + + if test "X$echo" = Xecho; then + # We didn't find a better echo, so look for alternatives. + if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # This shell has a builtin print -r that does the trick. + echo='print -r' + elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && + test "X$CONFIG_SHELL" != X/bin/ksh; then + # If we have ksh, try running configure again with it. + ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} + export ORIGINAL_CONFIG_SHELL + CONFIG_SHELL=/bin/ksh + export CONFIG_SHELL + exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"} + else + # Try using printf. + echo='printf %s\n' + if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # Cool, printf works + : + elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL + export CONFIG_SHELL + SHELL="$CONFIG_SHELL" + export SHELL + echo="$CONFIG_SHELL $0 --fallback-echo" + elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$CONFIG_SHELL $0 --fallback-echo" + else + # maybe with a smaller string... + prev=: + + for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do + if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null + then + break + fi + prev="$cmd" + done + + if test "$prev" != 'sed 50q "$0"'; then + echo_test_string=`eval $prev` + export echo_test_string + exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"} + else + # Oops. We lost completely, so just stick with echo. + echo=echo + fi + fi + fi + fi +fi +fi + +# Copy echo and quote the copy suitably for passing to libtool from +# the Makefile, instead of quoting the original, which is used later. +ECHO=$echo +if test "X$ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then + ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo" +fi + + + + +tagnames=${tagnames+${tagnames},}CXX + +tagnames=${tagnames+${tagnames},}F77 + +exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, 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= +SHELL=${CONFIG_SHELL-/bin/sh} + +# Identity of this package. +PACKAGE_NAME='expat' +PACKAGE_TARNAME='expat' +PACKAGE_VERSION='1.95.7' +PACKAGE_STRING='expat 1.95.7' +PACKAGE_BUGREPORT='expat-bugs@mail.libexpat.org' + +ac_unique_file="Makefile.in" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='LTLIBOBJS +LIBOBJS +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +LIBAGE +LIBREVISION +LIBCURRENT +LIBTOOL +ac_ct_F77 +FFLAGS +F77 +CXXCPP +ac_ct_CXX +CXXFLAGS +CXX +CPP +OBJDUMP +AS +DLLTOOL +NMEDIT +DSYMUTIL +STRIP +RANLIB +AR +ECHO +LN_S +EGREP +GREP +SED +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 +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 +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_shared +enable_static +enable_fast_install +with_gnu_ld +enable_libtool_lock +with_pic +with_tags +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CPP +CXX +CXXFLAGS +CCC +CXXCPP +F77 +FFLAGS' + + +# 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' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +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=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + 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_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 + { (exit 1); exit 1; }; } + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$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_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 + { (exit 1); exit 1; }; } + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$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 ;; + + -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_echo "$as_me: error: invalid package name: $ac_useropt" >&2 + { (exit 1); exit 1; }; } + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$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_echo "$as_me: error: invalid package name: $ac_useropt" >&2 + { (exit 1); exit 1; }; } + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$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_echo "$as_me: error: unrecognized option: $ac_option +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && + { $as_echo "$as_me: error: invalid variable name: $ac_envvar" >&2 + { (exit 1); exit 1; }; } + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$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_echo "$as_me: error: missing argument to $ac_option" >&2 + { (exit 1); exit 1; }; } +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) { $as_echo "$as_me: error: unrecognized options: $ac_unrecognized_opts" >&2 + { (exit 1); exit 1; }; } ;; + *) $as_echo "$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 +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_echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; } +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 + $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used." >&2 + 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_echo "$as_me: error: working directory cannot be determined" >&2 + { (exit 1); exit 1; }; } +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + { $as_echo "$as_me: error: pwd does not report name of working directory" >&2 + { (exit 1); exit 1; }; } + + +# 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 || +$as_echo 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_echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 + { (exit 1); exit 1; }; } +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || { $as_echo "$as_me: error: $ac_msg" >&2 + { (exit 1); exit 1; }; } + 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 expat 1.95.7 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] + --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/expat] + --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 + case $ac_init_help in + short | recursive ) echo "Configuration of expat 1.95.7:";; + esac + 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-shared[=PKGS] build shared libraries [default=yes] + --enable-static[=PKGS] build static libraries [default=yes] + --enable-fast-install[=PKGS] + optimize for fast installation [default=yes] + --disable-libtool-lock avoid locking (might break parallel builds) + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-gnu-ld assume the C compiler uses GNU ld [default=no] + --with-pic try to use only PIC/non-PIC objects [default=use + both] + --with-tags[=TAGS] include additional configurations [automatic] + +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 C/C++/Objective C preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CPP C preprocessor + CXX C++ compiler command + CXXFLAGS C++ compiler flags + CXXCPP C++ preprocessor + F77 Fortran 77 compiler command + FFLAGS Fortran 77 compiler flags + +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 . +_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=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$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 guested configure. + 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 + $as_echo "$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 +expat configure 1.95.7 +generated by GNU Autoconf 2.63 + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006, 2007, 2008 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 +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 expat $as_me 1.95.7, which was +generated by GNU Autoconf 2.63. Invocation command line was + + $ $0 $@ + +_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 + test -z "$as_dir" && as_dir=. + $as_echo "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=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; + 2) + ac_configure_args1="$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 + ac_configure_args="$ac_configure_args '$ac_arg'" + ;; + esac + done +done +$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } +$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export 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=$? + # Save into config.log some information that might help in debugging. + { + echo + + cat <<\_ASBOX +## ---------------- ## +## Cache variables. ## +## ---------------- ## +_ASBOX + 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_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$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= ;; #( + *) $as_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 + + cat <<\_ASBOX +## ----------------- ## +## Output variables. ## +## ----------------- ## +_ASBOX + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + cat <<\_ASBOX +## ------------------- ## +## File substitutions. ## +## ------------------- ## +_ASBOX + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + cat <<\_ASBOX +## ----------- ## +## confdefs.h. ## +## ----------- ## +_ASBOX + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$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'; { (exit 1); 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 + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + ac_site_file1=$CONFIG_SITE +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test -r "$ac_site_file"; then + { $as_echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" + 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. + if test -f "$cache_file"; then + { $as_echo "$as_me:$LINENO: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:$LINENO: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +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,) + { $as_echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$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 + { $as_echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:$LINENO: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:$LINENO: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:$LINENO: current value: \`$ac_new_val'" >&5 +$as_echo "$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=`$as_echo "$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. + *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + { { $as_echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 +$as_echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} + { (exit 1); exit 1; }; } +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_aux_dir= +for ac_dir in conftools "$srcdir"/conftools; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + { { $as_echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in conftools \"$srcdir\"/conftools" >&5 +$as_echo "$as_me: error: cannot find install-sh or install.sh in conftools \"$srcdir\"/conftools" >&2;} + { (exit 1); exit 1; }; } +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. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + + + + +LIBCURRENT=5 +LIBREVISION=0 +LIBAGE=5 + +ac_config_headers="$ac_config_headers expat_config.h" + + + + + +# Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + { { $as_echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5 +$as_echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;} + { (exit 1); exit 1; }; } + +{ $as_echo "$as_me:$LINENO: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } +if test "${ac_cv_build+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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_echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 +$as_echo "$as_me: error: cannot guess build type; you must specify one" >&2;} + { (exit 1); exit 1; }; } +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + { { $as_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5 +$as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;} + { (exit 1); exit 1; }; } + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical build" >&5 +$as_echo "$as_me: error: invalid value of canonical build" >&2;} + { (exit 1); exit 1; }; };; +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 + + +{ $as_echo "$as_me:$LINENO: checking host system type" >&5 +$as_echo_n "checking host system type... " >&6; } +if test "${ac_cv_host+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5 +$as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;} + { (exit 1); exit 1; }; } +fi + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical host" >&5 +$as_echo "$as_me: error: invalid value of canonical host" >&2;} + { (exit 1); exit 1; }; };; +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 + + +{ $as_echo "$as_me:$LINENO: checking target system type" >&5 +$as_echo_n "checking target system type... " >&6; } +if test "${ac_cv_target+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $target_alias failed" >&5 +$as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $target_alias failed" >&2;} + { (exit 1); exit 1; }; } +fi + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_target" >&5 +$as_echo "$ac_cv_target" >&6; } +case $ac_cv_target in +*-*-*) ;; +*) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical target" >&5 +$as_echo "$as_me: error: invalid value of canonical target" >&2;} + { (exit 1); exit 1; }; };; +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}- + +case "$host_os" in +*os2*) + # Use a custom made libtool replacement + echo Using aplibtool + LIBTOOL="$srcdir/../../../apr/build/aplibtool" + ;; +*) + + +# Check whether --enable-shared was given. +if test "${enable_shared+set}" = set; then + enableval=$enable_shared; p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_shared=yes +fi + + +# Check whether --enable-static was given. +if test "${enable_static+set}" = set; then + enableval=$enable_static; p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_static=yes +fi + + +# Check whether --enable-fast-install was given. +if test "${enable_fast_install+set}" = set; then + enableval=$enable_fast_install; p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_fast_install=yes +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 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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 + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:$LINENO: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "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 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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 + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$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 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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 + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:$LINENO: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "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 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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 + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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" + $as_echo "$as_me:$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 +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:$LINENO: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "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 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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 + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:$LINENO: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "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 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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 + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "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:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } + +# Provide some information about the compiler. +$as_echo "$as_me:$LINENO: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +{ (ac_try="$ac_compiler --version >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler --version >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -v >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -v >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -V >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -V >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + 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. +{ $as_echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +ac_link_default=`$as_echo "$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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; 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+set}" = set && 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 + ac_file='' +fi + +{ $as_echo "$as_me:$LINENO: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +if test -z "$ac_file"; then + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: C compiler cannot create executables +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: C compiler cannot create executables +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } +fi + +ac_exeext=$ac_cv_exeext + +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:$LINENO: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 +# If not cross compiling, check that we can run a simple program. +if test "$cross_compiling" != yes; then + if { ac_try='./$ac_file' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } + fi + fi +fi +{ $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +{ $as_echo "$as_me:$LINENO: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +{ $as_echo "$as_me:$LINENO: checking for suffix of executables" >&5 +$as_echo_n "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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; 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 + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } +fi + +rm -f conftest$ac_cv_exeext +{ $as_echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +{ $as_echo "$as_me:$LINENO: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if test "${ac_cv_objext+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; 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 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } +fi + +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if test "${ac_cv_c_compiler_gnu+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_compiler_gnu=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_compiler_gnu=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if test "${ac_cv_prog_cc_g+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_g=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + CFLAGS="" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_g=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if test "${ac_cv_prog_cc_c89+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + 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; +} + +/* 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 don't provoke an error unfortunately, instead are silently treated + as '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's necessary to write '\x00'==0 to get something + that's 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 **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_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" + rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_c89=$ac_arg +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:$LINENO: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:$LINENO: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac + + +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 + +{ $as_echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5 +$as_echo_n "checking for a sed that does not truncate output... " >&6; } +if test "${lt_cv_path_SED+set}" = set; then + $as_echo_n "(cached) " >&6 +else + # Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$lt_ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$lt_ac_prog$ac_exec_ext"; }; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +IFS=$as_save_IFS +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f $lt_ac_sed && continue + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test $lt_ac_count -gt 10 && break + lt_ac_count=`expr $lt_ac_count + 1` + if test $lt_ac_count -gt $lt_ac_max; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done + +fi + +SED=$lt_cv_path_SED + +{ $as_echo "$as_me:$LINENO: result: $SED" >&5 +$as_echo "$SED" >&6; } + +{ $as_echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if test "${ac_cv_path_GREP+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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 + test -z "$as_dir" && as_dir=. + 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" + { test -f "$ac_path_GREP" && $as_test_x "$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 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo '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 + ac_count=`expr $ac_count + 1` + 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_echo "$as_me:$LINENO: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 +$as_echo "$as_me: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} + { (exit 1); exit 1; }; } + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:$LINENO: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if test "${ac_cv_path_EGREP+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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 + test -z "$as_dir" && as_dir=. + 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" + { test -f "$ac_path_EGREP" && $as_test_x "$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 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo '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 + ac_count=`expr $ac_count + 1` + 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_echo "$as_me:$LINENO: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 +$as_echo "$as_me: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} + { (exit 1); exit 1; }; } + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:$LINENO: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + { $as_echo "$as_me:$LINENO: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:$LINENO: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if test "${lt_cv_path_LD+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && { { $as_echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 +$as_echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} + { (exit 1); exit 1; }; } +{ $as_echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if test "${lt_cv_prog_gnu_ld+set}" = set; then + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + +{ $as_echo "$as_me:$LINENO: checking for $LD option to reload object files" >&5 +$as_echo_n "checking for $LD option to reload object files... " >&6; } +if test "${lt_cv_ld_reload_flag+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_reload_flag='-r' +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5 +$as_echo "$lt_cv_ld_reload_flag" >&6; } +reload_flag=$lt_cv_ld_reload_flag +case $reload_flag in +"" | " "*) ;; +*) reload_flag=" $reload_flag" ;; +esac +reload_cmds='$LD$reload_flag -o $output$reload_objs' +case $host_os in + darwin*) + if test "$GCC" = yes; then + reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' + else + reload_cmds='$LD$reload_flag -o $output$reload_objs' + fi + ;; +esac + +{ $as_echo "$as_me:$LINENO: checking for BSD-compatible nm" >&5 +$as_echo_n "checking for BSD-compatible nm... " >&6; } +if test "${lt_cv_path_NM+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_nm_to_check="${ac_tool_prefix}nm" + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/$lt_tmp_nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS="$lt_save_ifs" + done + test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm +fi +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_path_NM" >&5 +$as_echo "$lt_cv_path_NM" >&6; } +NM="$lt_cv_path_NM" + +{ $as_echo "$as_me:$LINENO: checking whether ln -s works" >&5 +$as_echo_n "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no, using $LN_S" >&5 +$as_echo "no, using $LN_S" >&6; } +fi + +{ $as_echo "$as_me:$LINENO: checking how to recognize dependent libraries" >&5 +$as_echo_n "checking how to recognize dependent libraries... " >&6; } +if test "${lt_cv_deplibs_check_method+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# `unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# which responds to the $file_magic_cmd with a given extended regex. +# If you have `file' or equivalent on your system and you're not sure +# whether `pass_all' will *always* work, you probably want this one. + +case $host_os in +aix[4-9]*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi[45]*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. + if ( file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]' + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[3-9]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +nto-qnx*) + lt_cv_deplibs_check_method=unknown + ;; + +openbsd*) + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5 +$as_echo "$lt_cv_deplibs_check_method" >&6; } +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# Check whether --enable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then + enableval=$enable_libtool_lock; +fi + +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '#line 3821 "configure"' > conftest.$ac_ext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ +s390*-*linux*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + libsuff=64 + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + { $as_echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5 +$as_echo_n "checking whether the C compiler needs -belf... " >&6; } +if test "${lt_cv_cc_needs_belf+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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 + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + lt_cv_cc_needs_belf=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + lt_cv_cc_needs_belf=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext + 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 + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5 +$as_echo "$lt_cv_cc_needs_belf" >&6; } + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +sparc*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) LD="${LD-ld} -m elf64_sparc" ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-cygwin* | *-*-mingw* | *-*-pw32*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dlltool", so it can be a program name with args. +set dummy ${ac_tool_prefix}dlltool; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_DLLTOOL+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$DLLTOOL"; then + ac_cv_prog_DLLTOOL="$DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_DLLTOOL="${ac_tool_prefix}dlltool" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +DLLTOOL=$ac_cv_prog_DLLTOOL +if test -n "$DLLTOOL"; then + { $as_echo "$as_me:$LINENO: result: $DLLTOOL" >&5 +$as_echo "$DLLTOOL" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DLLTOOL"; then + ac_ct_DLLTOOL=$DLLTOOL + # Extract the first word of "dlltool", so it can be a program name with args. +set dummy dlltool; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_DLLTOOL+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DLLTOOL"; then + ac_cv_prog_ac_ct_DLLTOOL="$ac_ct_DLLTOOL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_DLLTOOL="dlltool" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL +if test -n "$ac_ct_DLLTOOL"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_DLLTOOL" >&5 +$as_echo "$ac_ct_DLLTOOL" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DLLTOOL" = x; then + DLLTOOL="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DLLTOOL=$ac_ct_DLLTOOL + fi +else + DLLTOOL="$ac_cv_prog_DLLTOOL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. +set dummy ${ac_tool_prefix}as; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_AS+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$AS"; then + ac_cv_prog_AS="$AS" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_AS="${ac_tool_prefix}as" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +AS=$ac_cv_prog_AS +if test -n "$AS"; then + { $as_echo "$as_me:$LINENO: result: $AS" >&5 +$as_echo "$AS" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_AS"; then + ac_ct_AS=$AS + # Extract the first word of "as", so it can be a program name with args. +set dummy as; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_AS+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AS"; then + ac_cv_prog_ac_ct_AS="$ac_ct_AS" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_AS="as" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_AS=$ac_cv_prog_ac_ct_AS +if test -n "$ac_ct_AS"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_AS" >&5 +$as_echo "$ac_ct_AS" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_AS" = x; then + AS="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AS=$ac_ct_AS + fi +else + AS="$ac_cv_prog_AS" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}objdump", so it can be a program name with args. +set dummy ${ac_tool_prefix}objdump; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_OBJDUMP+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_OBJDUMP="${ac_tool_prefix}objdump" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { $as_echo "$as_me:$LINENO: result: $OBJDUMP" >&5 +$as_echo "$OBJDUMP" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + # Extract the first word of "objdump", so it can be a program name with args. +set dummy objdump; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_OBJDUMP="objdump" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_OBJDUMP" >&5 +$as_echo "$ac_ct_OBJDUMP" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJDUMP=$ac_ct_OBJDUMP + fi +else + OBJDUMP="$ac_cv_prog_OBJDUMP" +fi + + ;; + +esac + +need_locks="$enable_libtool_lock" + + +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 +{ $as_echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 +$as_echo_n "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+set}" = set; then + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-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. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # 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 >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi + +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + # Broken: success on invalid input. +continue +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi + +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:$LINENO: result: $CPP" >&5 +$as_echo "$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. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # 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 >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi + +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + # Broken: success on invalid input. +continue +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi + +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + : +else + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } +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 + + +{ $as_echo "$as_me:$LINENO: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if test "${ac_cv_header_stdc+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_header_stdc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_header_stdc=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then + : +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_header_stdc=no +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +cat >>confdefs.h <<\_ACEOF +#define STDC_HEADERS 1 +_ACEOF + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. + + + + + + + + + +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + eval "$as_ac_Header=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_Header=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + +for ac_header in dlfcn.h +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 +$as_echo_n "checking $ac_header usability... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 +$as_echo_n "checking $ac_header presence... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( cat <<\_ASBOX +## ------------------------------------------- ## +## Report this to expat-bugs@mail.libexpat.org ## +## ------------------------------------------- ## +_ASBOX + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + +fi +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -z "$CXX"; then + if test -n "$CCC"; then + CXX=$CCC + else + if test -n "$ac_tool_prefix"; then + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC + 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 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CXX+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + { $as_echo "$as_me:$LINENO: result: $CXX" >&5 +$as_echo "$CXX" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 +$as_echo "$ac_ct_CXX" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CXX" && break +done + + if test "x$ac_ct_CXX" = x; then + CXX="g++" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CXX=$ac_ct_CXX + fi +fi + + fi +fi +# Provide some information about the compiler. +$as_echo "$as_me:$LINENO: checking for C++ compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +{ (ac_try="$ac_compiler --version >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler --version >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -v >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -v >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -V >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -V >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +{ $as_echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 +$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } +if test "${ac_cv_cxx_compiler_gnu+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_compiler_gnu=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_compiler_gnu=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 +$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GXX=yes +else + GXX= +fi +ac_test_CXXFLAGS=${CXXFLAGS+set} +ac_save_CXXFLAGS=$CXXFLAGS +{ $as_echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 +$as_echo_n "checking whether $CXX accepts -g... " >&6; } +if test "${ac_cv_prog_cxx_g+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cxx_g=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + CXXFLAGS="" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cxx_g=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cxx_werror_flag=$ac_save_cxx_werror_flag +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 +$as_echo "$ac_cv_prog_cxx_g" >&6; } +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + + +if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +{ $as_echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5 +$as_echo_n "checking how to run the C++ preprocessor... " >&6; } +if test -z "$CXXCPP"; then + if test "${ac_cv_prog_CXXCPP+set}" = set; then + $as_echo_n "(cached) " >&6 +else + # Double quotes because CXXCPP needs to be expanded + for CXXCPP in "$CXX -E" "/lib/cpp" + do + ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # 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 >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi + +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then + # Broken: success on invalid input. +continue +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi + +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + break +fi + + done + ac_cv_prog_CXXCPP=$CXXCPP + +fi + CXXCPP=$ac_cv_prog_CXXCPP +else + ac_cv_prog_CXXCPP=$CXXCPP +fi +{ $as_echo "$as_me:$LINENO: result: $CXXCPP" >&5 +$as_echo "$CXXCPP" >&6; } +ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # 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 >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi + +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then + # Broken: success on invalid input. +continue +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi + +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + : +else + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } +fi + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +fi + + +ac_ext=f +ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' +ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_f77_compiler_gnu +if test -n "$ac_tool_prefix"; then + for ac_prog in g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 xlf90 f90 pgf90 pghpf epcf90 gfortran g95 xlf95 f95 fort ifort ifc efc pgf95 lf95 ftn + 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 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_F77+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$F77"; then + ac_cv_prog_F77="$F77" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_F77="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +F77=$ac_cv_prog_F77 +if test -n "$F77"; then + { $as_echo "$as_me:$LINENO: result: $F77" >&5 +$as_echo "$F77" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$F77" && break + done +fi +if test -z "$F77"; then + ac_ct_F77=$F77 + for ac_prog in g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 xlf90 f90 pgf90 pghpf epcf90 gfortran g95 xlf95 f95 fort ifort ifc efc pgf95 lf95 ftn +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_F77+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_F77"; then + ac_cv_prog_ac_ct_F77="$ac_ct_F77" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_F77="$ac_prog" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_F77=$ac_cv_prog_ac_ct_F77 +if test -n "$ac_ct_F77"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_F77" >&5 +$as_echo "$ac_ct_F77" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_F77" && break +done + + if test "x$ac_ct_F77" = x; then + F77="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + F77=$ac_ct_F77 + fi +fi + + +# Provide some information about the compiler. +$as_echo "$as_me:$LINENO: checking for Fortran 77 compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +{ (ac_try="$ac_compiler --version >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler --version >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -v >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -v >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -V >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -V >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +rm -f a.out + +# If we don't use `.F' as extension, the preprocessor is not run on the +# input file. (Note that this only needs to work for GNU compilers.) +ac_save_ext=$ac_ext +ac_ext=F +{ $as_echo "$as_me:$LINENO: checking whether we are using the GNU Fortran 77 compiler" >&5 +$as_echo_n "checking whether we are using the GNU Fortran 77 compiler... " >&6; } +if test "${ac_cv_f77_compiler_gnu+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF + program main +#ifndef __GNUC__ + choke me +#endif + + end +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_f77_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_compiler_gnu=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_compiler_gnu=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_f77_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_f77_compiler_gnu" >&5 +$as_echo "$ac_cv_f77_compiler_gnu" >&6; } +ac_ext=$ac_save_ext +ac_test_FFLAGS=${FFLAGS+set} +ac_save_FFLAGS=$FFLAGS +FFLAGS= +{ $as_echo "$as_me:$LINENO: checking whether $F77 accepts -g" >&5 +$as_echo_n "checking whether $F77 accepts -g... " >&6; } +if test "${ac_cv_prog_f77_g+set}" = set; then + $as_echo_n "(cached) " >&6 +else + FFLAGS=-g +cat >conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_f77_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_f77_g=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_prog_f77_g=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_f77_g" >&5 +$as_echo "$ac_cv_prog_f77_g" >&6; } +if test "$ac_test_FFLAGS" = set; then + FFLAGS=$ac_save_FFLAGS +elif test $ac_cv_prog_f77_g = yes; then + if test "x$ac_cv_f77_compiler_gnu" = xyes; then + FFLAGS="-g -O2" + else + FFLAGS="-g" + fi +else + if test "x$ac_cv_f77_compiler_gnu" = xyes; then + FFLAGS="-O2" + else + FFLAGS= + fi +fi + +if test $ac_compiler_gnu = yes; then + G77=yes +else + G77= +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 + + + +# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! +# find the maximum length of command line arguments +{ $as_echo "$as_me:$LINENO: checking the maximum length of command line arguments" >&5 +$as_echo_n "checking the maximum length of command line arguments... " >&6; } +if test "${lt_cv_sys_max_cmd_len+set}" = set; then + $as_echo_n "(cached) " >&6 +else + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + while (test "X"`$SHELL $0 --fallback-echo "X$teststring" 2>/dev/null` \ + = "XX$teststring") >/dev/null 2>&1 && + new_result=`expr "X$teststring" : ".*" 2>&1` && + lt_cv_sys_max_cmd_len=$new_result && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + teststring= + # Add a significant safety factor because C++ compilers can tack on massive + # amounts of additional arguments before passing them to the linker. + # It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac + +fi + +if test -n $lt_cv_sys_max_cmd_len ; then + { $as_echo "$as_me:$LINENO: result: $lt_cv_sys_max_cmd_len" >&5 +$as_echo "$lt_cv_sys_max_cmd_len" >&6; } +else + { $as_echo "$as_me:$LINENO: result: none" >&5 +$as_echo "none" >&6; } +fi + + + + + +# Check for command to grab the raw symbol name followed by C symbol from nm. +{ $as_echo "$as_me:$LINENO: checking command to parse $NM output from $compiler object" >&5 +$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } +if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then + $as_echo_n "(cached) " >&6 +else + +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[BCDEGRST]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([_A-Za-z][_A-Za-z0-9]*\)' + +# Transform an extracted symbol line into a proper C declaration +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[BCDT]' + ;; +cygwin* | mingw* | pw32*) + symcode='[ABCDGISTW]' + ;; +hpux*) # Its linker distinguishes data from code symbols + if test "$host_cpu" = ia64; then + symcode='[ABCDEGRST]' + fi + lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + ;; +linux* | k*bsd*-gnu) + if test "$host_cpu" = ia64; then + symcode='[ABCDGIRSTW]' + lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + fi + ;; +irix* | nonstopux*) + symcode='[BCDEGRST]' + ;; +osf*) + symcode='[BCDEGQRST]' + ;; +solaris*) + symcode='[BDRT]' + ;; +sco3.2v5*) + symcode='[DT]' + ;; +sysv4.2uw2*) + symcode='[DT]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[ABDT]' + ;; +sysv4) + symcode='[DFNSTU]' + ;; +esac + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[ABCDGIRSTW]' ;; +esac + +# Try without a prefix undercore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Now try to grab the symbols. + nlist=conftest.nm + if { (eval echo "$as_me:$LINENO: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\"") >&5 + (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if grep ' nm_test_var$' "$nlist" >/dev/null; then + if grep ' nm_test_func$' "$nlist" >/dev/null; then + cat < conftest.$ac_ext +#ifdef __cplusplus +extern "C" { +#endif + +EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' + + cat <> conftest.$ac_ext +#if defined (__STDC__) && __STDC__ +# define lt_ptr_t void * +#else +# define lt_ptr_t char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + lt_ptr_t address; +} +lt_preloaded_symbols[] = +{ +EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext + cat <<\EOF >> conftest.$ac_ext + {0, (lt_ptr_t) 0} +}; + +#ifdef __cplusplus +} +#endif +EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_save_LIBS="$LIBS" + lt_save_CFLAGS="$CFLAGS" + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS="$lt_save_LIBS" + CFLAGS="$lt_save_CFLAGS" + else + echo "cannot find nm_test_func in $nlist" >&5 + fi + else + echo "cannot find nm_test_var in $nlist" >&5 + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 + fi + else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done + +fi + +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + { $as_echo "$as_me:$LINENO: result: failed" >&5 +$as_echo "failed" >&6; } +else + { $as_echo "$as_me:$LINENO: result: ok" >&5 +$as_echo "ok" >&6; } +fi + +{ $as_echo "$as_me:$LINENO: checking for objdir" >&5 +$as_echo_n "checking for objdir... " >&6; } +if test "${lt_cv_objdir+set}" = set; then + $as_echo_n "(cached) " >&6 +else + rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_objdir" >&5 +$as_echo "$lt_cv_objdir" >&6; } +objdir=$lt_cv_objdir + + + + + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='sed -e 1s/^X//' +sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +# Constants: +rm="rm -f" + +# Global variables: +default_ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a +ltmain="$ac_aux_dir/ltmain.sh" +ofile="$default_ofile" +with_gnu_ld="$lt_cv_prog_gnu_ld" + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. +set dummy ${ac_tool_prefix}ar; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_AR+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_AR="${ac_tool_prefix}ar" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { $as_echo "$as_me:$LINENO: result: $AR" >&5 +$as_echo "$AR" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_AR"; then + ac_ct_AR=$AR + # Extract the first word of "ar", so it can be a program name with args. +set dummy ar; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_AR+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_AR="ar" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_AR" >&5 +$as_echo "$ac_ct_AR" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +else + AR="$ac_cv_prog_AR" +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 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_RANLIB+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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 + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { $as_echo "$as_me:$LINENO: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "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 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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 + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$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 + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_STRIP+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:$LINENO: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$AR" && AR=ar +test -z "$AR_FLAGS" && AR_FLAGS=cru +test -z "$AS" && AS=as +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$DLLTOOL" && DLLTOOL=dlltool +test -z "$LD" && LD=ld +test -z "$LN_S" && LN_S="ln -s" +test -z "$MAGIC_CMD" && MAGIC_CMD=file +test -z "$NM" && NM=nm +test -z "$SED" && SED=sed +test -z "$OBJDUMP" && OBJDUMP=objdump +test -z "$RANLIB" && RANLIB=: +test -z "$STRIP" && STRIP=: +test -z "$ac_objext" && ac_objext=o + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi + +for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + + +# Only perform the check for file, if the check method requires it +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + { $as_echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5 +$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } +if test "${lt_cv_path_MAGIC_CMD+set}" = set; then + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/${ac_tool_prefix}file; then + lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + { $as_echo "$as_me:$LINENO: checking for file" >&5 +$as_echo_n "checking for file... " >&6; } +if test "${lt_cv_path_MAGIC_CMD+set}" = set; then + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/file; then + lt_cv_path_MAGIC_CMD="$ac_dir/file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + else + MAGIC_CMD=: + fi +fi + + fi + ;; +esac + + + case $host_os in + rhapsody* | darwin*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. +set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_DSYMUTIL+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$DSYMUTIL"; then + ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +DSYMUTIL=$ac_cv_prog_DSYMUTIL +if test -n "$DSYMUTIL"; then + { $as_echo "$as_me:$LINENO: result: $DSYMUTIL" >&5 +$as_echo "$DSYMUTIL" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DSYMUTIL"; then + ac_ct_DSYMUTIL=$DSYMUTIL + # Extract the first word of "dsymutil", so it can be a program name with args. +set dummy dsymutil; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_DSYMUTIL+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DSYMUTIL"; then + ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL +if test -n "$ac_ct_DSYMUTIL"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_DSYMUTIL" >&5 +$as_echo "$ac_ct_DSYMUTIL" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DSYMUTIL" = x; then + DSYMUTIL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DSYMUTIL=$ac_ct_DSYMUTIL + fi +else + DSYMUTIL="$ac_cv_prog_DSYMUTIL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. +set dummy ${ac_tool_prefix}nmedit; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_NMEDIT+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$NMEDIT"; then + ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +NMEDIT=$ac_cv_prog_NMEDIT +if test -n "$NMEDIT"; then + { $as_echo "$as_me:$LINENO: result: $NMEDIT" >&5 +$as_echo "$NMEDIT" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_NMEDIT"; then + ac_ct_NMEDIT=$NMEDIT + # Extract the first word of "nmedit", so it can be a program name with args. +set dummy nmedit; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_NMEDIT+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_NMEDIT"; then + ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_NMEDIT="nmedit" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT +if test -n "$ac_ct_NMEDIT"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_NMEDIT" >&5 +$as_echo "$ac_ct_NMEDIT" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_NMEDIT" = x; then + NMEDIT=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + NMEDIT=$ac_ct_NMEDIT + fi +else + NMEDIT="$ac_cv_prog_NMEDIT" +fi + + + { $as_echo "$as_me:$LINENO: checking for -single_module linker flag" >&5 +$as_echo_n "checking for -single_module linker flag... " >&6; } +if test "${lt_cv_apple_cc_single_mod+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_apple_cc_single_mod=no + if test -z "${LT_MULTI_MODULE}"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + echo "int foo(void){return 1;}" > conftest.c + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib ${wl}-single_module conftest.c + if test -f libconftest.dylib; then + lt_cv_apple_cc_single_mod=yes + rm -rf libconftest.dylib* + fi + rm conftest.c + fi +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_apple_cc_single_mod" >&5 +$as_echo "$lt_cv_apple_cc_single_mod" >&6; } + { $as_echo "$as_me:$LINENO: checking for -exported_symbols_list linker flag" >&5 +$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } +if test "${lt_cv_ld_exported_symbols_list+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + lt_cv_ld_exported_symbols_list=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + lt_cv_ld_exported_symbols_list=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_ld_exported_symbols_list" >&5 +$as_echo "$lt_cv_ld_exported_symbols_list" >&6; } + case $host_os in + rhapsody* | darwin1.[0123]) + _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + darwin*) + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[91]*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + 10.[012]*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test "$lt_cv_apple_cc_single_mod" = "yes"; then + _lt_dar_single_mod='$single_module' + fi + if test "$lt_cv_ld_exported_symbols_list" = "yes"; then + _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' + else + _lt_dar_export_syms="~$NMEDIT -s \$output_objdir/\${libname}-symbols.expsym \${lib}" + fi + if test "$DSYMUTIL" != ":"; then + _lt_dsymutil="~$DSYMUTIL \$lib || :" + else + _lt_dsymutil= + fi + ;; + esac + + +enable_dlopen=no +enable_win32_dll=yes + +# Check whether --enable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then + enableval=$enable_libtool_lock; +fi + +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + + +# Check whether --with-pic was given. +if test "${with_pic+set}" = set; then + withval=$with_pic; pic_mode="$withval" +else + pic_mode=default +fi + +test -z "$pic_mode" && pic_mode=default + +# Use C for the default configuration in the libtool script +tagname= +lt_save_CC="$CC" +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 + + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +objext=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$rm conftest* + +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$rm -r conftest* + + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... + +lt_prog_compiler_no_builtin_flag= + +if test "$GCC" = yes; then + lt_prog_compiler_no_builtin_flag=' -fno-builtin' + + +{ $as_echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:7081: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:7085: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $rm conftest* + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } + +if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then + lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" +else + : +fi + +fi + +lt_prog_compiler_wl= +lt_prog_compiler_pic= +lt_prog_compiler_static= + +{ $as_echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } + + if test "$GCC" = yes; then + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_static='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + fi + ;; + + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + ;; + + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared=no + enable_shared=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic=-Kconform_pic + fi + ;; + + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + ;; + + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + else + lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case $cc_basename in + xlc*) + lt_prog_compiler_pic='-qnocommon' + lt_prog_compiler_wl='-Wl,' + ;; + esac + ;; + + mingw* | cygwin* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static='-non_shared' + ;; + + newsos6) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + linux* | k*bsd*-gnu) + case $cc_basename in + icc* | ecc*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C 5.9 + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Wl,' + ;; + *Sun\ F*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='' + ;; + esac + ;; + esac + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + + rdos*) + lt_prog_compiler_static='-non_shared' + ;; + + solaris*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + case $cc_basename in + f77* | f90* | f95*) + lt_prog_compiler_wl='-Qoption ld ';; + *) + lt_prog_compiler_wl='-Wl,';; + esac + ;; + + sunos4*) + lt_prog_compiler_wl='-Qoption ld ' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_prog_compiler_pic='-Kconform_pic' + lt_prog_compiler_static='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + unicos*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_can_build_shared=no + ;; + + uts4*) + lt_prog_compiler_pic='-pic' + lt_prog_compiler_static='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared=no + ;; + esac + fi + +{ $as_echo "$as_me:$LINENO: result: $lt_prog_compiler_pic" >&5 +$as_echo "$lt_prog_compiler_pic" >&6; } + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic"; then + +{ $as_echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } +if test "${lt_cv_prog_compiler_pic_works+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic -DPIC" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:7371: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:7375: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works=yes + fi + fi + $rm conftest* + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_pic_works" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works" >&6; } + +if test x"$lt_cv_prog_compiler_pic_works" = xyes; then + case $lt_prog_compiler_pic in + "" | " "*) ;; + *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; + esac +else + lt_prog_compiler_pic= + lt_prog_compiler_can_build_shared=no +fi + +fi +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic= + ;; + *) + lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" + ;; +esac + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" +{ $as_echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if test "${lt_cv_prog_compiler_static_works+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works=yes + fi + else + lt_cv_prog_compiler_static_works=yes + fi + fi + $rm -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_static_works" >&5 +$as_echo "$lt_cv_prog_compiler_static_works" >&6; } + +if test x"$lt_cv_prog_compiler_static_works" = xyes; then + : +else + lt_prog_compiler_static= +fi + + +{ $as_echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test "${lt_cv_prog_compiler_c_o+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:7475: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:7479: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:$LINENO: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test "$hard_links" = no; then + { $as_echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + +{ $as_echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + runpath_var= + allow_undefined_flag= + enable_shared_with_static_runtimes=no + archive_cmds= + archive_expsym_cmds= + old_archive_From_new_cmds= + old_archive_from_expsyms_cmds= + export_dynamic_flag_spec= + whole_archive_flag_spec= + thread_safe_flag_spec= + hardcode_libdir_flag_spec= + hardcode_libdir_flag_spec_ld= + hardcode_libdir_separator= + hardcode_direct=no + hardcode_minus_L=no + hardcode_shlibpath_var=unsupported + link_all_deplibs=unknown + hardcode_automatic=no + module_cmds= + module_expsym_cmds= + always_export_symbols=no + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. + extract_expsyms_cmds= + # Just being paranoid about ensuring that cc_basename is set. + for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + + case $host_os in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + ld_shlibs=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec= + fi + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[3-9]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs=no + cat <&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + fi + ;; + + amigaos*) + archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can't use + # them. + ld_shlibs=no + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + allow_undefined_flag=unsupported + always_export_symbols=no + enable_shared_with_static_runtimes=yes + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs=no + fi + ;; + + interix[3-9]*) + hardcode_direct=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | k*bsd*-gnu) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + tmp_addflag= + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + *) + tmp_sharedflag='-shared' ;; + esac + archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test $supports_anon_versioning = yes; then + archive_expsym_cmds='$echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + $echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + else + ld_shlibs=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test "$ld_shlibs" = no; then + runpath_var= + hardcode_libdir_flag_spec= + export_dynamic_flag_spec= + whole_archive_flag_spec= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix[4-9]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds='' + hardcode_direct=yes + hardcode_libdir_separator=':' + link_all_deplibs=yes + + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='-berok' + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag="-z nodefs" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag=' ${wl}-bernotok' + allow_undefined_flag=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec='$convenience' + archive_cmds_need_lc=yes + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + # see comment about different semantics on the GNU ld section + ld_shlibs=no + ;; + + bsdi[45]*) + export_dynamic_flag_spec=-rdynamic + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_From_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path='`cygpath -w "$srcfile"`' + enable_shared_with_static_runtimes=yes + ;; + + darwin* | rhapsody*) + case $host_os in + rhapsody* | darwin1.[012]) + allow_undefined_flag='${wl}-undefined ${wl}suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + ;; + 10.*) + allow_undefined_flag='${wl}-undefined ${wl}dynamic_lookup' + ;; + esac + fi + ;; + esac + archive_cmds_need_lc=no + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported + whole_archive_flag_spec='' + link_all_deplibs=yes + if test "$GCC" = yes ; then + output_verbose_link_cmd='echo' + archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + else + case $cc_basename in + xlc*) + output_verbose_link_cmd='echo' + archive_cmds='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring' + module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + ld_shlibs=no + ;; + esac + fi + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + freebsd1*) + ld_shlibs=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9*) + if test "$GCC" = yes; then + archive_cmds='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + archive_cmds='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + export_dynamic_flag_spec='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + + hardcode_direct=yes + export_dynamic_flag_spec='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_libdir_flag_spec_ld='+b $libdir' + hardcode_direct=no + hardcode_shlibpath_var=no + ;; + *) + hardcode_direct=yes + export_dynamic_flag_spec='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_ld='-rpath $libdir' + fi + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + link_all_deplibs=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + newsos6) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_shlibpath_var=no + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + hardcode_direct=yes + hardcode_shlibpath_var=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + else + case $host_os in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-R$libdir' + ;; + *) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + esac + fi + else + ld_shlibs=no + fi + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_From_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + hardcode_libdir_separator=: + ;; + + solaris*) + no_undefined_flag=' -z text' + if test "$GCC" = yes; then + wlarc='${wl}' + archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' + else + wlarc='' + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. GCC discards it without `$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test "$GCC" = yes; then + whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + else + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' + fi + ;; + esac + link_all_deplibs=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds='$CC -r -o $output$reload_objs' + hardcode_direct=no + ;; + motorola) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag='${wl}-z,text' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag='${wl}-z,text' + allow_undefined_flag='${wl}-z,nodefs' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + hardcode_libdir_separator=':' + link_all_deplibs=yes + export_dynamic_flag_spec='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; + esac + fi + +{ $as_echo "$as_me:$LINENO: result: $ld_shlibs" >&5 +$as_echo "$ld_shlibs" >&6; } +test "$ld_shlibs" = no && can_build_shared=no + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } + $rm conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl + pic_flag=$lt_prog_compiler_pic + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if { (eval echo "$as_me:$LINENO: \"$archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 + (eval $archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + then + archive_cmds_need_lc=no + else + archive_cmds_need_lc=yes + fi + allow_undefined_flag=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + { $as_echo "$as_me:$LINENO: result: $archive_cmds_need_lc" >&5 +$as_echo "$archive_cmds_need_lc" >&6; } + ;; + esac + fi + ;; +esac + +{ $as_echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" + +if test "$GCC" = yes; then + case $host_os in + darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; + *) lt_awk_arg="/^libraries:/" ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$lt_search_path_spec" | grep ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`echo "$lt_search_path_spec" | $SED -e 's/;/ /g'` + else + lt_search_path_spec=`echo "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary. + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path/$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" + else + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`echo $lt_tmp_lt_search_path_spec | awk ' +BEGIN {RS=" "; FS="/|\n";} { + lt_foo=""; + lt_count=0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo="/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[lt_foo]++; } + if (lt_freq[lt_foo] == 1) { print lt_foo; } +}'` + sys_lib_search_path_spec=`echo $lt_search_path_spec` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[4-9]*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[123]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +interix[3-9]*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + shlibpath_overrides_runpath=no + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + shlibpath_overrides_runpath=yes + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:$LINENO: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_sys_lib_search_path_spec="$sys_lib_search_path_spec" +fi + +sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec" +fi + +sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +{ $as_echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || \ + test -n "$runpath_var" || \ + test "X$hardcode_automatic" = "Xyes" ; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, )" != no && + test "$hardcode_minus_L" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action=unsupported +fi +{ $as_echo "$as_me:$LINENO: result: $hardcode_action" >&5 +$as_echo "$hardcode_action" >&6; } + +if test "$hardcode_action" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + +striplib= +old_striplib= +{ $as_echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 +$as_echo_n "checking whether stripping libraries is possible... " >&6; } +if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + ;; + *) + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } + ;; + esac +fi + +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + { $as_echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if test "${ac_cv_lib_dl_dlopen+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_lib_dl_dlopen=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_dl_dlopen=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = x""yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + *) + { $as_echo "$as_me:$LINENO: checking for shl_load" >&5 +$as_echo_n "checking for shl_load... " >&6; } +if test "${ac_cv_func_shl_load+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define shl_load to an innocuous variant, in case declares shl_load. + For example, HP-UX 11i declares gettimeofday. */ +#define shl_load innocuous_shl_load + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char shl_load (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef shl_load + +/* 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 shl_load (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_shl_load || defined __stub___shl_load +choke me +#endif + +int +main () +{ +return shl_load (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_func_shl_load=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_func_shl_load=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 +$as_echo "$ac_cv_func_shl_load" >&6; } +if test "x$ac_cv_func_shl_load" = x""yes; then + lt_cv_dlopen="shl_load" +else + { $as_echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 +$as_echo_n "checking for shl_load in -ldld... " >&6; } +if test "${ac_cv_lib_dld_shl_load+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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. */ +#ifdef __cplusplus +extern "C" +#endif +char shl_load (); +int +main () +{ +return shl_load (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_lib_dld_shl_load=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_dld_shl_load=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 +$as_echo "$ac_cv_lib_dld_shl_load" >&6; } +if test "x$ac_cv_lib_dld_shl_load" = x""yes; then + lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" +else + { $as_echo "$as_me:$LINENO: checking for dlopen" >&5 +$as_echo_n "checking for dlopen... " >&6; } +if test "${ac_cv_func_dlopen+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define dlopen to an innocuous variant, in case declares dlopen. + For example, HP-UX 11i declares gettimeofday. */ +#define dlopen innocuous_dlopen + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char dlopen (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef dlopen + +/* 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 dlopen (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_dlopen || defined __stub___dlopen +choke me +#endif + +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_func_dlopen=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_func_dlopen=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 +$as_echo "$ac_cv_func_dlopen" >&6; } +if test "x$ac_cv_func_dlopen" = x""yes; then + lt_cv_dlopen="dlopen" +else + { $as_echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if test "${ac_cv_lib_dl_dlopen+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_lib_dl_dlopen=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_dl_dlopen=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = x""yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + { $as_echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 +$as_echo_n "checking for dlopen in -lsvld... " >&6; } +if test "${ac_cv_lib_svld_dlopen+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_lib_svld_dlopen=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_svld_dlopen=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 +$as_echo "$ac_cv_lib_svld_dlopen" >&6; } +if test "x$ac_cv_lib_svld_dlopen" = x""yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" +else + { $as_echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 +$as_echo_n "checking for dld_link in -ldld... " >&6; } +if test "${ac_cv_lib_dld_dld_link+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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. */ +#ifdef __cplusplus +extern "C" +#endif +char dld_link (); +int +main () +{ +return dld_link (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_lib_dld_dld_link=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_dld_dld_link=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 +$as_echo "$ac_cv_lib_dld_dld_link" >&6; } +if test "x$ac_cv_lib_dld_dld_link" = x""yes; then + lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + { $as_echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 +$as_echo_n "checking whether a program can dlopen itself... " >&6; } +if test "${lt_cv_dlopen_self+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + else + puts (dlerror ()); + + exit (status); +} +EOF + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 +$as_echo "$lt_cv_dlopen_self" >&6; } + + if test "x$lt_cv_dlopen_self" = xyes; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + { $as_echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 +$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } +if test "${lt_cv_dlopen_self_static+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + else + puts (dlerror ()); + + exit (status); +} +EOF + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 +$as_echo "$lt_cv_dlopen_self_static" >&6; } + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + +# Report which library types will actually be built +{ $as_echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 +$as_echo_n "checking if libtool supports shared libraries... " >&6; } +{ $as_echo "$as_me:$LINENO: result: $can_build_shared" >&5 +$as_echo "$can_build_shared" >&6; } + +{ $as_echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 +$as_echo_n "checking whether to build shared libraries... " >&6; } +test "$can_build_shared" = "no" && enable_shared=no + +# On AIX, shared libraries and static libraries use the same namespace, and +# are all built from PIC. +case $host_os in +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + +aix[4-9]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; +esac +{ $as_echo "$as_me:$LINENO: result: $enable_shared" >&5 +$as_echo "$enable_shared" >&6; } + +{ $as_echo "$as_me:$LINENO: checking whether to build static libraries" >&5 +$as_echo_n "checking whether to build static libraries... " >&6; } +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes +{ $as_echo "$as_me:$LINENO: result: $enable_static" >&5 +$as_echo "$enable_static" >&6; } + +# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + compiler \ + CC \ + LD \ + lt_prog_compiler_wl \ + lt_prog_compiler_pic \ + lt_prog_compiler_static \ + lt_prog_compiler_no_builtin_flag \ + export_dynamic_flag_spec \ + thread_safe_flag_spec \ + whole_archive_flag_spec \ + enable_shared_with_static_runtimes \ + old_archive_cmds \ + old_archive_from_new_cmds \ + predep_objects \ + postdep_objects \ + predeps \ + postdeps \ + compiler_lib_search_path \ + compiler_lib_search_dirs \ + archive_cmds \ + archive_expsym_cmds \ + postinstall_cmds \ + postuninstall_cmds \ + old_archive_from_expsyms_cmds \ + allow_undefined_flag \ + no_undefined_flag \ + export_symbols_cmds \ + hardcode_libdir_flag_spec \ + hardcode_libdir_flag_spec_ld \ + hardcode_libdir_separator \ + hardcode_automatic \ + module_cmds \ + module_expsym_cmds \ + lt_cv_prog_compiler_c_o \ + fix_srcfile_path \ + exclude_expsyms \ + include_expsyms; do + + case $var in + old_archive_cmds | \ + old_archive_from_new_cmds | \ + archive_cmds | \ + archive_expsym_cmds | \ + module_cmds | \ + module_expsym_cmds | \ + old_archive_from_expsyms_cmds | \ + export_symbols_cmds | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\$0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + +cfgfile="${ofile}T" + trap "$rm \"$cfgfile\"; exit 1" 1 2 15 + $rm -f "$cfgfile" + { $as_echo "$as_me:$LINENO: creating $ofile" >&5 +$as_echo "$as_me: creating $ofile" >&6;} + + cat <<__EOF__ >> "$cfgfile" +#! $SHELL + +# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 +# Free Software Foundation, Inc. +# +# This file is part of GNU Libtool: +# Originally by Gordon Matzigkeit , 1996 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="$SED -e 1s/^X//" + +# 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 + +# The names of the tagged configurations supported by this script. +available_tags= + +# ### BEGIN LIBTOOL CONFIG + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# LTCC compiler flags. +LTCFLAGS=$lt_LTCFLAGS + +# A language-specific compiler. +CC=$lt_compiler + +# Is the compiler the GNU C compiler? +with_gcc=$GCC + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_LD + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds +archive_expsym_cmds=$lt_archive_expsym_cmds +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_module_cmds +module_expsym_cmds=$lt_module_expsym_cmds + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_predep_objects + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_postdep_objects + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_predeps + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_postdeps + +# The directories searched by this compiler when creating a shared +# library +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$hardcode_automatic + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path=$lt_fix_srcfile_path + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms + +# ### END LIBTOOL CONFIG + +__EOF__ + + + case $host_os in + aix3*) + cat <<\EOF >> "$cfgfile" + +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +EOF + ;; + esac + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || \ + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" + +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + 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 + +CC="$lt_save_CC" + + +# Check whether --with-tags was given. +if test "${with_tags+set}" = set; then + withval=$with_tags; tagnames="$withval" +fi + + +if test -f "$ltmain" && test -n "$tagnames"; then + if test ! -f "${ofile}"; then + { $as_echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not exist" >&5 +$as_echo "$as_me: WARNING: output file \`$ofile' does not exist" >&2;} + fi + + if test -z "$LTCC"; then + eval "`$SHELL ${ofile} --config | grep '^LTCC='`" + if test -z "$LTCC"; then + { $as_echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not look like a libtool script" >&5 +$as_echo "$as_me: WARNING: output file \`$ofile' does not look like a libtool script" >&2;} + else + { $as_echo "$as_me:$LINENO: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&5 +$as_echo "$as_me: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&2;} + fi + fi + if test -z "$LTCFLAGS"; then + eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`" + fi + + # Extract list of available tagged configurations in $ofile. + # Note that this assumes the entire list is on one line. + available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` + + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for tagname in $tagnames; do + IFS="$lt_save_ifs" + # Check whether tagname contains only valid characters + case `$echo "X$tagname" | $Xsed -e 's:[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]::g'` in + "") ;; + *) { { $as_echo "$as_me:$LINENO: error: invalid tag name: $tagname" >&5 +$as_echo "$as_me: error: invalid tag name: $tagname" >&2;} + { (exit 1); exit 1; }; } + ;; + esac + + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null + then + { { $as_echo "$as_me:$LINENO: error: tag name \"$tagname\" already exists" >&5 +$as_echo "$as_me: error: tag name \"$tagname\" already exists" >&2;} + { (exit 1); exit 1; }; } + fi + + # Update the list of available tags. + if test -n "$tagname"; then + echo appending configuration tag \"$tagname\" to $ofile + + case $tagname in + CXX) + if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + + + +archive_cmds_need_lc_CXX=no +allow_undefined_flag_CXX= +always_export_symbols_CXX=no +archive_expsym_cmds_CXX= +export_dynamic_flag_spec_CXX= +hardcode_direct_CXX=no +hardcode_libdir_flag_spec_CXX= +hardcode_libdir_flag_spec_ld_CXX= +hardcode_libdir_separator_CXX= +hardcode_minus_L_CXX=no +hardcode_shlibpath_var_CXX=unsupported +hardcode_automatic_CXX=no +module_cmds_CXX= +module_expsym_cmds_CXX= +link_all_deplibs_CXX=unknown +old_archive_cmds_CXX=$old_archive_cmds +no_undefined_flag_CXX= +whole_archive_flag_spec_CXX= +enable_shared_with_static_runtimes_CXX=no + +# Dependencies to place before and after the object being linked: +predep_objects_CXX= +postdep_objects_CXX= +predeps_CXX= +postdeps_CXX= +compiler_lib_search_path_CXX= +compiler_lib_search_dirs_CXX= + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +objext_CXX=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(int, char *[]) { return(0); }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$rm conftest* + +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$rm -r conftest* + + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_LD=$LD +lt_save_GCC=$GCC +GCC=$GXX +lt_save_with_gnu_ld=$with_gnu_ld +lt_save_path_LD=$lt_cv_path_LD +if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx +else + $as_unset lt_cv_prog_gnu_ld +fi +if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX +else + $as_unset lt_cv_path_LD +fi +test -z "${LDCXX+set}" || LD=$LDCXX +CC=${CXX-"c++"} +compiler=$CC +compiler_CXX=$CC +for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + + +# We don't want -fno-exception wen compiling C++ code, so set the +# no_builtin_flag separately +if test "$GXX" = yes; then + lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' +else + lt_prog_compiler_no_builtin_flag_CXX= +fi + +if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:$LINENO: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + { $as_echo "$as_me:$LINENO: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:$LINENO: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if test "${lt_cv_path_LD+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && { { $as_echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 +$as_echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} + { (exit 1); exit 1; }; } +{ $as_echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if test "${lt_cv_prog_gnu_ld+set}" = set; then + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ + grep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec_CXX= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + +else + GXX=no + with_gnu_ld=no + wlarc= +fi + +# PORTME: fill in a description of your system's C++ link characteristics +{ $as_echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } +ld_shlibs_CXX=yes +case $host_os in + aix3*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aix[4-9]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_CXX='' + hardcode_direct_CXX=yes + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + + if test "$GXX" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct_CXX=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_CXX=yes + hardcode_libdir_flag_spec_CXX='-L$libdir' + hardcode_libdir_separator_CXX= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols_CXX=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag_CXX='-berok' + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" + + archive_expsym_cmds_CXX="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag_CXX="-z nodefs" + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_CXX=' ${wl}-bernotok' + allow_undefined_flag_CXX=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_CXX='$convenience' + archive_cmds_need_lc_CXX=yes + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_CXX=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs_CXX=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_CXX='-L$libdir' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=no + enable_shared_with_static_runtimes_CXX=yes + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs_CXX=no + fi + ;; + darwin* | rhapsody*) + archive_cmds_need_lc_CXX=no + hardcode_direct_CXX=no + hardcode_automatic_CXX=yes + hardcode_shlibpath_var_CXX=unsupported + whole_archive_flag_spec_CXX='' + link_all_deplibs_CXX=yes + allow_undefined_flag_CXX="$_lt_dar_allow_undefined" + if test "$GXX" = yes ; then + output_verbose_link_cmd='echo' + archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + if test "$lt_cv_apple_cc_single_mod" != "yes"; then + archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" + archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" + fi + else + case $cc_basename in + xlc*) + output_verbose_link_cmd='echo' + archive_cmds_CXX='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring' + module_cmds_CXX='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + ld_shlibs_CXX=no + ;; + esac + fi + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + freebsd[12]*) + # C++ shared libraries reported to be fairly broken before switch to ELF + ld_shlibs_CXX=no + ;; + freebsd-elf*) + archive_cmds_need_lc_CXX=no + ;; + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + ld_shlibs_CXX=yes + ;; + gnu*) + ;; + hpux9*) + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_CXX=: + export_dynamic_flag_spec_CXX='${wl}-E' + hardcode_direct_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + archive_cmds_CXX='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[-]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + archive_cmds_CXX='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + case $host_cpu in + hppa*64*|ia64*) ;; + *) + export_dynamic_flag_spec_CXX='${wl}-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + ;; + *) + hardcode_direct_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + interix[3-9]*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' + fi + fi + link_all_deplibs_CXX=yes + ;; + esac + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + ;; + linux* | k*bsd*-gnu) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + + hardcode_libdir_flag_spec_CXX='${wl}--rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc*) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + archive_cmds_need_lc_CXX=no + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + ;; + cxx*) + # Compaq C++ + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' + hardcode_libdir_flag_spec_CXX='-R$libdir' + whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='echo' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + lynxos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + m88k*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + openbsd2*) + # C++ shared libraries are fairly broken + ld_shlibs_CXX=no + ;; + openbsd*) + if test -f /usr/libexec/ld.so; then + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + export_dynamic_flag_spec_CXX='${wl}-E' + whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd='echo' + else + ld_shlibs_CXX=no + fi + ;; + osf3*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + hardcode_libdir_separator_CXX=: + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' + + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + cxx*) + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + hardcode_libdir_separator_CXX=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + cxx*) + allow_undefined_flag_CXX=' -expect_unresolved \*' + archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~ + $rm $lib.exp' + + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + psos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + solaris*) + case $cc_basename in + CC*) + # Sun C++ 4.2, 5.x and Centerline C++ + archive_cmds_need_lc_CXX=yes + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_shlibpath_var_CXX=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' + ;; + esac + link_all_deplibs_CXX=yes + + output_verbose_link_cmd='echo' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + no_undefined_flag_CXX=' ${wl}-z ${wl}defs' + if $CC --version | grep -v '^2\.7' > /dev/null; then + archive_cmds_CXX='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + fi + + hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag_CXX='${wl}-z,text' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + # So that behaviour is only enabled if SCOABSPATH is set to a + # non-empty value in the environment. Most likely only useful for + # creating official distributions of packages. + # This is a hack until libtool officially supports absolute path + # names for shared libraries. + no_undefined_flag_CXX='${wl}-z,text' + allow_undefined_flag_CXX='${wl}-z,nodefs' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + export_dynamic_flag_spec_CXX='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + vxworks*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; +esac +{ $as_echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 +$as_echo "$ld_shlibs_CXX" >&6; } +test "$ld_shlibs_CXX" = no && can_build_shared=no + +GCC_CXX="$GXX" +LD_CXX="$LD" + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +cat > conftest.$ac_ext <&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + # The `*' in the case matches for architectures that use `case' in + # $output_verbose_cmd can trigger glob expansion during the loop + # eval without this substitution. + output_verbose_link_cmd=`$echo "X$output_verbose_link_cmd" | $Xsed -e "$no_glob_subst"` + + for p in `eval $output_verbose_link_cmd`; do + case $p in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test $p = "-L" \ + || test $p = "-R"; then + prev=$p + continue + else + prev= + fi + + if test "$pre_test_object_deps_done" = no; then + case $p in + -L* | -R*) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$compiler_lib_search_path_CXX"; then + compiler_lib_search_path_CXX="${prev}${p}" + else + compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$postdeps_CXX"; then + postdeps_CXX="${prev}${p}" + else + postdeps_CXX="${postdeps_CXX} ${prev}${p}" + fi + fi + ;; + + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test "$pre_test_object_deps_done" = no; then + if test -z "$predep_objects_CXX"; then + predep_objects_CXX="$p" + else + predep_objects_CXX="$predep_objects_CXX $p" + fi + else + if test -z "$postdep_objects_CXX"; then + postdep_objects_CXX="$p" + else + postdep_objects_CXX="$postdep_objects_CXX $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling CXX test program" +fi + +$rm -f confest.$objext + +compiler_lib_search_dirs_CXX= +if test -n "$compiler_lib_search_path_CXX"; then + compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` +fi + +# PORTME: override above test on systems where it is broken +case $host_os in +interix[3-9]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + predep_objects_CXX= + postdep_objects_CXX= + postdeps_CXX= + ;; + +linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + # + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + if test "$solaris_use_stlport4" != yes; then + postdeps_CXX='-library=Cstd -library=Crun' + fi + ;; + esac + ;; + +solaris*) + case $cc_basename in + CC*) + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + # Adding this requires a known-good setup of shared libraries for + # Sun compiler versions before 5.6, else PIC objects from an old + # archive will be linked into the output, leading to subtle bugs. + if test "$solaris_use_stlport4" != yes; then + postdeps_CXX='-library=Cstd -library=Crun' + fi + ;; + esac + ;; +esac + +case " $postdeps_CXX " in +*" -lc "*) archive_cmds_need_lc_CXX=no ;; +esac + +lt_prog_compiler_wl_CXX= +lt_prog_compiler_pic_CXX= +lt_prog_compiler_static_CXX= + +{ $as_echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } + + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + fi + ;; + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' + ;; + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_CXX='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + lt_prog_compiler_pic_CXX= + ;; + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_CXX=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + else + case $host_os in + aix[4-9]*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + else + lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_AC_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case $cc_basename in + xlc*) + lt_prog_compiler_pic_CXX='-qnocommon' + lt_prog_compiler_wl_CXX='-Wl,' + ;; + esac + ;; + dgux*) + case $cc_basename in + ec++*) + lt_prog_compiler_pic_CXX='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' + if test "$host_cpu" != ia64; then + lt_prog_compiler_pic_CXX='+Z' + fi + ;; + aCC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_CXX='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu) + case $cc_basename in + KCC*) + # KAI C++ Compiler + lt_prog_compiler_wl_CXX='--backend -Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + ;; + icpc* | ecpc*) + # Intel C++ + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fpic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + lt_prog_compiler_pic_CXX='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd*) + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + lt_prog_compiler_wl_CXX='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + lt_prog_compiler_pic_CXX='-pic' + ;; + cxx*) + # Digital/Compaq C++ + lt_prog_compiler_wl_CXX='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC*) + # Sun C++ 4.2, 5.x and Centerline C++ + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + lt_prog_compiler_pic_CXX='-pic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + lcc*) + # Lucid + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + lt_prog_compiler_pic_CXX='-KPIC' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + esac + ;; + vxworks*) + ;; + *) + lt_prog_compiler_can_build_shared_CXX=no + ;; + esac + fi + +{ $as_echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_CXX" >&5 +$as_echo "$lt_prog_compiler_pic_CXX" >&6; } + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_CXX"; then + +{ $as_echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } +if test "${lt_cv_prog_compiler_pic_works_CXX+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works_CXX=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:12390: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:12394: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works_CXX=yes + fi + fi + $rm conftest* + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } + +if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then + case $lt_prog_compiler_pic_CXX in + "" | " "*) ;; + *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; + esac +else + lt_prog_compiler_pic_CXX= + lt_prog_compiler_can_build_shared_CXX=no +fi + +fi +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_CXX= + ;; + *) + lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" + ;; +esac + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" +{ $as_echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if test "${lt_cv_prog_compiler_static_works_CXX+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works_CXX=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works_CXX=yes + fi + else + lt_cv_prog_compiler_static_works_CXX=yes + fi + fi + $rm -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_static_works_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } + +if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then + : +else + lt_prog_compiler_static_CXX= +fi + + +{ $as_echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_CXX=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:12494: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:12498: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:$LINENO: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test "$hard_links" = no; then + { $as_echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + +{ $as_echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + case $host_os in + aix[4-9]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + export_symbols_cmds_CXX="$ltdll_cmds" + ;; + cygwin* | mingw*) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;/^.*[ ]__nm__/s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac + exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + +{ $as_echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 +$as_echo "$ld_shlibs_CXX" >&6; } +test "$ld_shlibs_CXX" = no && can_build_shared=no + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_CXX" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_CXX=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds_CXX in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } + $rm conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_CXX + pic_flag=$lt_prog_compiler_pic_CXX + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_CXX + allow_undefined_flag_CXX= + if { (eval echo "$as_me:$LINENO: \"$archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 + (eval $archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + then + archive_cmds_need_lc_CXX=no + else + archive_cmds_need_lc_CXX=yes + fi + allow_undefined_flag_CXX=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + { $as_echo "$as_me:$LINENO: result: $archive_cmds_need_lc_CXX" >&5 +$as_echo "$archive_cmds_need_lc_CXX" >&6; } + ;; + esac + fi + ;; +esac + +{ $as_echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" + +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[4-9]*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[123]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +interix[3-9]*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + shlibpath_overrides_runpath=no + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + shlibpath_overrides_runpath=yes + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:$LINENO: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_sys_lib_search_path_spec="$sys_lib_search_path_spec" +fi + +sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec" +fi + +sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +{ $as_echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action_CXX= +if test -n "$hardcode_libdir_flag_spec_CXX" || \ + test -n "$runpath_var_CXX" || \ + test "X$hardcode_automatic_CXX" = "Xyes" ; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct_CXX" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, CXX)" != no && + test "$hardcode_minus_L_CXX" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action_CXX=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_CXX=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_CXX=unsupported +fi +{ $as_echo "$as_me:$LINENO: result: $hardcode_action_CXX" >&5 +$as_echo "$hardcode_action_CXX" >&6; } + +if test "$hardcode_action_CXX" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + +# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + compiler_CXX \ + CC_CXX \ + LD_CXX \ + lt_prog_compiler_wl_CXX \ + lt_prog_compiler_pic_CXX \ + lt_prog_compiler_static_CXX \ + lt_prog_compiler_no_builtin_flag_CXX \ + export_dynamic_flag_spec_CXX \ + thread_safe_flag_spec_CXX \ + whole_archive_flag_spec_CXX \ + enable_shared_with_static_runtimes_CXX \ + old_archive_cmds_CXX \ + old_archive_from_new_cmds_CXX \ + predep_objects_CXX \ + postdep_objects_CXX \ + predeps_CXX \ + postdeps_CXX \ + compiler_lib_search_path_CXX \ + compiler_lib_search_dirs_CXX \ + archive_cmds_CXX \ + archive_expsym_cmds_CXX \ + postinstall_cmds_CXX \ + postuninstall_cmds_CXX \ + old_archive_from_expsyms_cmds_CXX \ + allow_undefined_flag_CXX \ + no_undefined_flag_CXX \ + export_symbols_cmds_CXX \ + hardcode_libdir_flag_spec_CXX \ + hardcode_libdir_flag_spec_ld_CXX \ + hardcode_libdir_separator_CXX \ + hardcode_automatic_CXX \ + module_cmds_CXX \ + module_expsym_cmds_CXX \ + lt_cv_prog_compiler_c_o_CXX \ + fix_srcfile_path_CXX \ + exclude_expsyms_CXX \ + include_expsyms_CXX; do + + case $var in + old_archive_cmds_CXX | \ + old_archive_from_new_cmds_CXX | \ + archive_cmds_CXX | \ + archive_expsym_cmds_CXX | \ + module_cmds_CXX | \ + module_expsym_cmds_CXX | \ + old_archive_from_expsyms_cmds_CXX | \ + export_symbols_cmds_CXX | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\$0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + +cfgfile="$ofile" + + cat <<__EOF__ >> "$cfgfile" +# ### BEGIN LIBTOOL TAG CONFIG: $tagname + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_CXX + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# LTCC compiler flags. +LTCFLAGS=$lt_LTCFLAGS + +# A language-specific compiler. +CC=$lt_compiler_CXX + +# Is the compiler the GNU C compiler? +with_gcc=$GCC_CXX + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_LD_CXX + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_CXX + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_CXX +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_CXX + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec_CXX + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds_CXX +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds_CXX +archive_expsym_cmds=$lt_archive_expsym_cmds_CXX +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_module_cmds_CXX +module_expsym_cmds=$lt_module_expsym_cmds_CXX + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_predep_objects_CXX + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_postdep_objects_CXX + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_predeps_CXX + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_postdeps_CXX + +# The directories searched by this compiler when creating a shared +# library +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_CXX + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_CXX + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_CXX + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_CXX + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct_CXX + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L_CXX + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$hardcode_automatic_CXX + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_CXX + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path=$lt_fix_srcfile_path + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols_CXX + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_CXX + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_CXX + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_CXX + +# ### END LIBTOOL TAG CONFIG: $tagname + +__EOF__ + + +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + 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 + +CC=$lt_save_CC +LDCXX=$LD +LD=$lt_save_LD +GCC=$lt_save_GCC +with_gnu_ldcxx=$with_gnu_ld +with_gnu_ld=$lt_save_with_gnu_ld +lt_cv_path_LDCXX=$lt_cv_path_LD +lt_cv_path_LD=$lt_save_path_LD +lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld +lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld + + else + tagname="" + fi + ;; + + F77) + if test -n "$F77" && test "X$F77" != "Xno"; then + +ac_ext=f +ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' +ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_f77_compiler_gnu + + +archive_cmds_need_lc_F77=no +allow_undefined_flag_F77= +always_export_symbols_F77=no +archive_expsym_cmds_F77= +export_dynamic_flag_spec_F77= +hardcode_direct_F77=no +hardcode_libdir_flag_spec_F77= +hardcode_libdir_flag_spec_ld_F77= +hardcode_libdir_separator_F77= +hardcode_minus_L_F77=no +hardcode_automatic_F77=no +module_cmds_F77= +module_expsym_cmds_F77= +link_all_deplibs_F77=unknown +old_archive_cmds_F77=$old_archive_cmds +no_undefined_flag_F77= +whole_archive_flag_spec_F77= +enable_shared_with_static_runtimes_F77=no + +# Source file extension for f77 test sources. +ac_ext=f + +# Object file extension for compiled f77 test sources. +objext=o +objext_F77=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="\ + subroutine t + return + end +" + +# Code to be used in simple link tests +lt_simple_link_test_code="\ + program t + end +" + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$rm conftest* + +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$rm -r conftest* + + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +CC=${F77-"f77"} +compiler=$CC +compiler_F77=$CC +for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + + +{ $as_echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 +$as_echo_n "checking if libtool supports shared libraries... " >&6; } +{ $as_echo "$as_me:$LINENO: result: $can_build_shared" >&5 +$as_echo "$can_build_shared" >&6; } + +{ $as_echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 +$as_echo_n "checking whether to build shared libraries... " >&6; } +test "$can_build_shared" = "no" && enable_shared=no + +# On AIX, shared libraries and static libraries use the same namespace, and +# are all built from PIC. +case $host_os in +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; +aix[4-9]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; +esac +{ $as_echo "$as_me:$LINENO: result: $enable_shared" >&5 +$as_echo "$enable_shared" >&6; } + +{ $as_echo "$as_me:$LINENO: checking whether to build static libraries" >&5 +$as_echo_n "checking whether to build static libraries... " >&6; } +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes +{ $as_echo "$as_me:$LINENO: result: $enable_static" >&5 +$as_echo "$enable_static" >&6; } + +GCC_F77="$G77" +LD_F77="$LD" + +lt_prog_compiler_wl_F77= +lt_prog_compiler_pic_F77= +lt_prog_compiler_static_F77= + +{ $as_echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } + + if test "$GCC" = yes; then + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_static_F77='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_F77='-Bstatic' + fi + ;; + + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic_F77='-m68020 -resident32 -malways-restore-a4' + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic_F77='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_F77='-fno-common' + ;; + + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared_F77=no + enable_shared=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_F77=-Kconform_pic + fi + ;; + + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_F77='-fPIC' + ;; + esac + ;; + + *) + lt_prog_compiler_pic_F77='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl_F77='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_F77='-Bstatic' + else + lt_prog_compiler_static_F77='-bnso -bI:/lib/syscalls.exp' + fi + ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case $cc_basename in + xlc*) + lt_prog_compiler_pic_F77='-qnocommon' + lt_prog_compiler_wl_F77='-Wl,' + ;; + esac + ;; + + mingw* | cygwin* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_F77='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl_F77='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_F77='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static_F77='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl_F77='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static_F77='-non_shared' + ;; + + newsos6) + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + linux* | k*bsd*-gnu) + case $cc_basename in + icc* | ecc*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-fpic' + lt_prog_compiler_static_F77='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl_F77='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static_F77='-non_shared' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C 5.9 + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + lt_prog_compiler_wl_F77='-Wl,' + ;; + *Sun\ F*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + lt_prog_compiler_wl_F77='' + ;; + esac + ;; + esac + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl_F77='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static_F77='-non_shared' + ;; + + rdos*) + lt_prog_compiler_static_F77='-non_shared' + ;; + + solaris*) + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + case $cc_basename in + f77* | f90* | f95*) + lt_prog_compiler_wl_F77='-Qoption ld ';; + *) + lt_prog_compiler_wl_F77='-Wl,';; + esac + ;; + + sunos4*) + lt_prog_compiler_wl_F77='-Qoption ld ' + lt_prog_compiler_pic_F77='-PIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_prog_compiler_pic_F77='-Kconform_pic' + lt_prog_compiler_static_F77='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + unicos*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_can_build_shared_F77=no + ;; + + uts4*) + lt_prog_compiler_pic_F77='-pic' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared_F77=no + ;; + esac + fi + +{ $as_echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_F77" >&5 +$as_echo "$lt_prog_compiler_pic_F77" >&6; } + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_F77"; then + +{ $as_echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works... " >&6; } +if test "${lt_cv_prog_compiler_pic_works_F77+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works_F77=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_F77" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:14079: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:14083: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works_F77=yes + fi + fi + $rm conftest* + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_pic_works_F77" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works_F77" >&6; } + +if test x"$lt_cv_prog_compiler_pic_works_F77" = xyes; then + case $lt_prog_compiler_pic_F77 in + "" | " "*) ;; + *) lt_prog_compiler_pic_F77=" $lt_prog_compiler_pic_F77" ;; + esac +else + lt_prog_compiler_pic_F77= + lt_prog_compiler_can_build_shared_F77=no +fi + +fi +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_F77= + ;; + *) + lt_prog_compiler_pic_F77="$lt_prog_compiler_pic_F77" + ;; +esac + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl_F77 eval lt_tmp_static_flag=\"$lt_prog_compiler_static_F77\" +{ $as_echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if test "${lt_cv_prog_compiler_static_works_F77+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works_F77=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works_F77=yes + fi + else + lt_cv_prog_compiler_static_works_F77=yes + fi + fi + $rm -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_static_works_F77" >&5 +$as_echo "$lt_cv_prog_compiler_static_works_F77" >&6; } + +if test x"$lt_cv_prog_compiler_static_works_F77" = xyes; then + : +else + lt_prog_compiler_static_F77= +fi + + +{ $as_echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test "${lt_cv_prog_compiler_c_o_F77+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_F77=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:14183: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:14187: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_F77=yes + fi + fi + chmod u+w . 2>&5 + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_F77" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_F77" >&6; } + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o_F77" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:$LINENO: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test "$hard_links" = no; then + { $as_echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + +{ $as_echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + runpath_var= + allow_undefined_flag_F77= + enable_shared_with_static_runtimes_F77=no + archive_cmds_F77= + archive_expsym_cmds_F77= + old_archive_From_new_cmds_F77= + old_archive_from_expsyms_cmds_F77= + export_dynamic_flag_spec_F77= + whole_archive_flag_spec_F77= + thread_safe_flag_spec_F77= + hardcode_libdir_flag_spec_F77= + hardcode_libdir_flag_spec_ld_F77= + hardcode_libdir_separator_F77= + hardcode_direct_F77=no + hardcode_minus_L_F77=no + hardcode_shlibpath_var_F77=unsupported + link_all_deplibs_F77=unknown + hardcode_automatic_F77=no + module_cmds_F77= + module_expsym_cmds_F77= + always_export_symbols_F77=no + export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms_F77= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + exclude_expsyms_F77='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. + extract_expsyms_cmds= + # Just being paranoid about ensuring that cc_basename is set. + for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + + case $host_os in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + ld_shlibs_F77=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_F77='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec_F77='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_F77="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec_F77= + fi + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[3-9]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs_F77=no + cat <&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + fi + ;; + + amigaos*) + archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_minus_L_F77=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can't use + # them. + ld_shlibs_F77=no + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_F77=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_F77='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs_F77=no + fi + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, F77) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_F77='-L$libdir' + allow_undefined_flag_F77=unsupported + always_export_symbols_F77=no + enable_shared_with_static_runtimes_F77=yes + export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds_F77='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs_F77=no + fi + ;; + + interix[3-9]*) + hardcode_direct_F77=no + hardcode_shlibpath_var_F77=no + hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' + export_dynamic_flag_spec_F77='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds_F77='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | k*bsd*-gnu) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + tmp_addflag= + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers + whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + whole_archive_flag_spec_F77='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + *) + tmp_sharedflag='-shared' ;; + esac + archive_cmds_F77='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test $supports_anon_versioning = yes; then + archive_expsym_cmds_F77='$echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + $echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + else + ld_shlibs_F77=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds_F77='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + ld_shlibs_F77=no + cat <&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_F77=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs_F77=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec_F77='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' + archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' + else + ld_shlibs_F77=no + fi + ;; + esac + ;; + + sunos4*) + archive_cmds_F77='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_F77=no + fi + ;; + esac + + if test "$ld_shlibs_F77" = no; then + runpath_var= + hardcode_libdir_flag_spec_F77= + export_dynamic_flag_spec_F77= + whole_archive_flag_spec_F77= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag_F77=unsupported + always_export_symbols_F77=yes + archive_expsym_cmds_F77='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L_F77=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct_F77=unsupported + fi + ;; + + aix[4-9]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + export_symbols_cmds_F77='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_F77='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_F77='' + hardcode_direct_F77=yes + hardcode_libdir_separator_F77=':' + link_all_deplibs_F77=yes + + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct_F77=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_F77=yes + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_libdir_separator_F77= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols_F77=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag_F77='-berok' + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_f77_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds_F77="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec_F77='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag_F77="-z nodefs" + archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_f77_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_F77=' ${wl}-bernotok' + allow_undefined_flag_F77=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_F77='$convenience' + archive_cmds_need_lc_F77=yes + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_minus_L_F77=yes + # see comment about different semantics on the GNU ld section + ld_shlibs_F77=no + ;; + + bsdi[45]*) + export_dynamic_flag_spec_F77=-rdynamic + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec_F77=' ' + allow_undefined_flag_F77=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds_F77='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_From_new_cmds_F77='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds_F77='lib -OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path_F77='`cygpath -w "$srcfile"`' + enable_shared_with_static_runtimes_F77=yes + ;; + + darwin* | rhapsody*) + case $host_os in + rhapsody* | darwin1.[012]) + allow_undefined_flag_F77='${wl}-undefined ${wl}suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + ;; + 10.*) + allow_undefined_flag_F77='${wl}-undefined ${wl}dynamic_lookup' + ;; + esac + fi + ;; + esac + archive_cmds_need_lc_F77=no + hardcode_direct_F77=no + hardcode_automatic_F77=yes + hardcode_shlibpath_var_F77=unsupported + whole_archive_flag_spec_F77='' + link_all_deplibs_F77=yes + if test "$GCC" = yes ; then + output_verbose_link_cmd='echo' + archive_cmds_F77="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + module_cmds_F77="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + archive_expsym_cmds_F77="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + module_expsym_cmds_F77="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + else + case $cc_basename in + xlc*) + output_verbose_link_cmd='echo' + archive_cmds_F77='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring' + module_cmds_F77='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + ld_shlibs_F77=no + ;; + esac + fi + ;; + + dgux*) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_shlibpath_var_F77=no + ;; + + freebsd1*) + ld_shlibs_F77=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=yes + hardcode_minus_L_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + archive_cmds_F77='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + hpux9*) + if test "$GCC" = yes; then + archive_cmds_F77='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + archive_cmds_F77='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_F77=: + hardcode_direct_F77=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_F77=yes + export_dynamic_flag_spec_F77='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_F77='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_F77=: + + hardcode_direct_F77=yes + export_dynamic_flag_spec_F77='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_F77=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_F77=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_libdir_flag_spec_ld_F77='+b $libdir' + hardcode_direct_F77=no + hardcode_shlibpath_var_F77=no + ;; + *) + hardcode_direct_F77=yes + export_dynamic_flag_spec_F77='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_F77=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds_F77='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_ld_F77='-rpath $libdir' + fi + hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_F77=: + link_all_deplibs_F77=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds_F77='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + newsos6) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=yes + hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_F77=: + hardcode_shlibpath_var_F77=no + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' + export_dynamic_flag_spec_F77='${wl}-E' + else + case $host_os in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_F77='-R$libdir' + ;; + *) + archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' + ;; + esac + fi + else + ld_shlibs_F77=no + fi + ;; + + os2*) + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_minus_L_F77=yes + allow_undefined_flag_F77=unsupported + archive_cmds_F77='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_From_new_cmds_F77='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag_F77=' -expect_unresolved \*' + archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_F77=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag_F77=' -expect_unresolved \*' + archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds_F77='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec_F77='-rpath $libdir' + fi + hardcode_libdir_separator_F77=: + ;; + + solaris*) + no_undefined_flag_F77=' -z text' + if test "$GCC" = yes; then + wlarc='${wl}' + archive_cmds_F77='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' + else + wlarc='' + archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + fi + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_shlibpath_var_F77=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. GCC discards it without `$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test "$GCC" = yes; then + whole_archive_flag_spec_F77='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + else + whole_archive_flag_spec_F77='-z allextract$convenience -z defaultextract' + fi + ;; + esac + link_all_deplibs_F77=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds_F77='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_F77='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_direct_F77=yes + hardcode_minus_L_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds_F77='$CC -r -o $output$reload_objs' + hardcode_direct_F77=no + ;; + motorola) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var_F77=no + ;; + + sysv4.3*) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_F77=no + export_dynamic_flag_spec_F77='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_F77=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs_F77=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag_F77='${wl}-z,text' + archive_cmds_need_lc_F77=no + hardcode_shlibpath_var_F77=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds_F77='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_F77='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag_F77='${wl}-z,text' + allow_undefined_flag_F77='${wl}-z,nodefs' + archive_cmds_need_lc_F77=no + hardcode_shlibpath_var_F77=no + hardcode_libdir_flag_spec_F77='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + hardcode_libdir_separator_F77=':' + link_all_deplibs_F77=yes + export_dynamic_flag_spec_F77='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds_F77='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_F77='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_shlibpath_var_F77=no + ;; + + *) + ld_shlibs_F77=no + ;; + esac + fi + +{ $as_echo "$as_me:$LINENO: result: $ld_shlibs_F77" >&5 +$as_echo "$ld_shlibs_F77" >&6; } +test "$ld_shlibs_F77" = no && can_build_shared=no + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_F77" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_F77=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds_F77 in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } + $rm conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_F77 + pic_flag=$lt_prog_compiler_pic_F77 + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_F77 + allow_undefined_flag_F77= + if { (eval echo "$as_me:$LINENO: \"$archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 + (eval $archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + then + archive_cmds_need_lc_F77=no + else + archive_cmds_need_lc_F77=yes + fi + allow_undefined_flag_F77=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + { $as_echo "$as_me:$LINENO: result: $archive_cmds_need_lc_F77" >&5 +$as_echo "$archive_cmds_need_lc_F77" >&6; } + ;; + esac + fi + ;; +esac + +{ $as_echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" + +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[4-9]*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[123]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +interix[3-9]*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + shlibpath_overrides_runpath=no + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + shlibpath_overrides_runpath=yes + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:$LINENO: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_sys_lib_search_path_spec="$sys_lib_search_path_spec" +fi + +sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec" +fi + +sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +{ $as_echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action_F77= +if test -n "$hardcode_libdir_flag_spec_F77" || \ + test -n "$runpath_var_F77" || \ + test "X$hardcode_automatic_F77" = "Xyes" ; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct_F77" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, F77)" != no && + test "$hardcode_minus_L_F77" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action_F77=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_F77=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_F77=unsupported +fi +{ $as_echo "$as_me:$LINENO: result: $hardcode_action_F77" >&5 +$as_echo "$hardcode_action_F77" >&6; } + +if test "$hardcode_action_F77" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + +# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + compiler_F77 \ + CC_F77 \ + LD_F77 \ + lt_prog_compiler_wl_F77 \ + lt_prog_compiler_pic_F77 \ + lt_prog_compiler_static_F77 \ + lt_prog_compiler_no_builtin_flag_F77 \ + export_dynamic_flag_spec_F77 \ + thread_safe_flag_spec_F77 \ + whole_archive_flag_spec_F77 \ + enable_shared_with_static_runtimes_F77 \ + old_archive_cmds_F77 \ + old_archive_from_new_cmds_F77 \ + predep_objects_F77 \ + postdep_objects_F77 \ + predeps_F77 \ + postdeps_F77 \ + compiler_lib_search_path_F77 \ + compiler_lib_search_dirs_F77 \ + archive_cmds_F77 \ + archive_expsym_cmds_F77 \ + postinstall_cmds_F77 \ + postuninstall_cmds_F77 \ + old_archive_from_expsyms_cmds_F77 \ + allow_undefined_flag_F77 \ + no_undefined_flag_F77 \ + export_symbols_cmds_F77 \ + hardcode_libdir_flag_spec_F77 \ + hardcode_libdir_flag_spec_ld_F77 \ + hardcode_libdir_separator_F77 \ + hardcode_automatic_F77 \ + module_cmds_F77 \ + module_expsym_cmds_F77 \ + lt_cv_prog_compiler_c_o_F77 \ + fix_srcfile_path_F77 \ + exclude_expsyms_F77 \ + include_expsyms_F77; do + + case $var in + old_archive_cmds_F77 | \ + old_archive_from_new_cmds_F77 | \ + archive_cmds_F77 | \ + archive_expsym_cmds_F77 | \ + module_cmds_F77 | \ + module_expsym_cmds_F77 | \ + old_archive_from_expsyms_cmds_F77 | \ + export_symbols_cmds_F77 | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\$0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + +cfgfile="$ofile" + + cat <<__EOF__ >> "$cfgfile" +# ### BEGIN LIBTOOL TAG CONFIG: $tagname + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_F77 + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_F77 + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# LTCC compiler flags. +LTCFLAGS=$lt_LTCFLAGS + +# A language-specific compiler. +CC=$lt_compiler_F77 + +# Is the compiler the GNU C compiler? +with_gcc=$GCC_F77 + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_LD_F77 + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_F77 + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_F77 +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_F77 + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_F77 + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_F77 + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_F77 + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_F77 + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec_F77 + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds_F77 +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_F77 + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_F77 + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds_F77 +archive_expsym_cmds=$lt_archive_expsym_cmds_F77 +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_module_cmds_F77 +module_expsym_cmds=$lt_module_expsym_cmds_F77 + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_predep_objects_F77 + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_postdep_objects_F77 + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_predeps_F77 + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_postdeps_F77 + +# The directories searched by this compiler when creating a shared +# library +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_F77 + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_F77 + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_F77 + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_F77 + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_F77 + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_F77 + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_F77 + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_F77 + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct_F77 + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L_F77 + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_F77 + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$hardcode_automatic_F77 + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_F77 + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path=$lt_fix_srcfile_path + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols_F77 + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_F77 + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_F77 + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_F77 + +# ### END LIBTOOL TAG CONFIG: $tagname + +__EOF__ + + +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + 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 + +CC="$lt_save_CC" + + else + tagname="" + fi + ;; + + GCJ) + if test -n "$GCJ" && test "X$GCJ" != "Xno"; then + + +# Source file extension for Java test sources. +ac_ext=java + +# Object file extension for compiled Java test sources. +objext=o +objext_GCJ=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="class foo {}" + +# Code to be used in simple link tests +lt_simple_link_test_code='public class conftest { public static void main(String[] argv) {}; }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$rm conftest* + +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$rm -r conftest* + + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +CC=${GCJ-"gcj"} +compiler=$CC +compiler_GCJ=$CC +for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + + +# GCJ did not exist at the time GCC didn't implicitly link libc in. +archive_cmds_need_lc_GCJ=no + +old_archive_cmds_GCJ=$old_archive_cmds + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... + +lt_prog_compiler_no_builtin_flag_GCJ= + +if test "$GCC" = yes; then + lt_prog_compiler_no_builtin_flag_GCJ=' -fno-builtin' + + +{ $as_echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:16404: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:16408: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $rm conftest* + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } + +if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then + lt_prog_compiler_no_builtin_flag_GCJ="$lt_prog_compiler_no_builtin_flag_GCJ -fno-rtti -fno-exceptions" +else + : +fi + +fi + +lt_prog_compiler_wl_GCJ= +lt_prog_compiler_pic_GCJ= +lt_prog_compiler_static_GCJ= + +{ $as_echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } + + if test "$GCC" = yes; then + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_static_GCJ='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_GCJ='-Bstatic' + fi + ;; + + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic_GCJ='-m68020 -resident32 -malways-restore-a4' + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_GCJ='-fno-common' + ;; + + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared_GCJ=no + enable_shared=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_GCJ=-Kconform_pic + fi + ;; + + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_GCJ='-fPIC' + ;; + esac + ;; + + *) + lt_prog_compiler_pic_GCJ='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl_GCJ='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_GCJ='-Bstatic' + else + lt_prog_compiler_static_GCJ='-bnso -bI:/lib/syscalls.exp' + fi + ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case $cc_basename in + xlc*) + lt_prog_compiler_pic_GCJ='-qnocommon' + lt_prog_compiler_wl_GCJ='-Wl,' + ;; + esac + ;; + + mingw* | cygwin* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl_GCJ='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_GCJ='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static_GCJ='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl_GCJ='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static_GCJ='-non_shared' + ;; + + newsos6) + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + linux* | k*bsd*-gnu) + case $cc_basename in + icc* | ecc*) + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_pic_GCJ='-fpic' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl_GCJ='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static_GCJ='-non_shared' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C 5.9 + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-Bstatic' + lt_prog_compiler_wl_GCJ='-Wl,' + ;; + *Sun\ F*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-Bstatic' + lt_prog_compiler_wl_GCJ='' + ;; + esac + ;; + esac + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl_GCJ='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static_GCJ='-non_shared' + ;; + + rdos*) + lt_prog_compiler_static_GCJ='-non_shared' + ;; + + solaris*) + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-Bstatic' + case $cc_basename in + f77* | f90* | f95*) + lt_prog_compiler_wl_GCJ='-Qoption ld ';; + *) + lt_prog_compiler_wl_GCJ='-Wl,';; + esac + ;; + + sunos4*) + lt_prog_compiler_wl_GCJ='-Qoption ld ' + lt_prog_compiler_pic_GCJ='-PIC' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_prog_compiler_pic_GCJ='-Kconform_pic' + lt_prog_compiler_static_GCJ='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + unicos*) + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_can_build_shared_GCJ=no + ;; + + uts4*) + lt_prog_compiler_pic_GCJ='-pic' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared_GCJ=no + ;; + esac + fi + +{ $as_echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_GCJ" >&5 +$as_echo "$lt_prog_compiler_pic_GCJ" >&6; } + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_GCJ"; then + +{ $as_echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works... " >&6; } +if test "${lt_cv_prog_compiler_pic_works_GCJ+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works_GCJ=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_GCJ" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:16694: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:16698: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works_GCJ=yes + fi + fi + $rm conftest* + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_pic_works_GCJ" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works_GCJ" >&6; } + +if test x"$lt_cv_prog_compiler_pic_works_GCJ" = xyes; then + case $lt_prog_compiler_pic_GCJ in + "" | " "*) ;; + *) lt_prog_compiler_pic_GCJ=" $lt_prog_compiler_pic_GCJ" ;; + esac +else + lt_prog_compiler_pic_GCJ= + lt_prog_compiler_can_build_shared_GCJ=no +fi + +fi +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_GCJ= + ;; + *) + lt_prog_compiler_pic_GCJ="$lt_prog_compiler_pic_GCJ" + ;; +esac + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl_GCJ eval lt_tmp_static_flag=\"$lt_prog_compiler_static_GCJ\" +{ $as_echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if test "${lt_cv_prog_compiler_static_works_GCJ+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works_GCJ=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works_GCJ=yes + fi + else + lt_cv_prog_compiler_static_works_GCJ=yes + fi + fi + $rm -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_static_works_GCJ" >&5 +$as_echo "$lt_cv_prog_compiler_static_works_GCJ" >&6; } + +if test x"$lt_cv_prog_compiler_static_works_GCJ" = xyes; then + : +else + lt_prog_compiler_static_GCJ= +fi + + +{ $as_echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test "${lt_cv_prog_compiler_c_o_GCJ+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_GCJ=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:16798: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:16802: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_GCJ=yes + fi + fi + chmod u+w . 2>&5 + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_GCJ" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_GCJ" >&6; } + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o_GCJ" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:$LINENO: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test "$hard_links" = no; then + { $as_echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + +{ $as_echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + runpath_var= + allow_undefined_flag_GCJ= + enable_shared_with_static_runtimes_GCJ=no + archive_cmds_GCJ= + archive_expsym_cmds_GCJ= + old_archive_From_new_cmds_GCJ= + old_archive_from_expsyms_cmds_GCJ= + export_dynamic_flag_spec_GCJ= + whole_archive_flag_spec_GCJ= + thread_safe_flag_spec_GCJ= + hardcode_libdir_flag_spec_GCJ= + hardcode_libdir_flag_spec_ld_GCJ= + hardcode_libdir_separator_GCJ= + hardcode_direct_GCJ=no + hardcode_minus_L_GCJ=no + hardcode_shlibpath_var_GCJ=unsupported + link_all_deplibs_GCJ=unknown + hardcode_automatic_GCJ=no + module_cmds_GCJ= + module_expsym_cmds_GCJ= + always_export_symbols_GCJ=no + export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms_GCJ= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + exclude_expsyms_GCJ='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. + extract_expsyms_cmds= + # Just being paranoid about ensuring that cc_basename is set. + for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + + case $host_os in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + ld_shlibs_GCJ=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_GCJ='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec_GCJ='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_GCJ="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec_GCJ= + fi + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[3-9]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs_GCJ=no + cat <&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + fi + ;; + + amigaos*) + archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_minus_L_GCJ=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can't use + # them. + ld_shlibs_GCJ=no + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_GCJ=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_GCJ='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs_GCJ=no + fi + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, GCJ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_GCJ='-L$libdir' + allow_undefined_flag_GCJ=unsupported + always_export_symbols_GCJ=no + enable_shared_with_static_runtimes_GCJ=yes + export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds_GCJ='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs_GCJ=no + fi + ;; + + interix[3-9]*) + hardcode_direct_GCJ=no + hardcode_shlibpath_var_GCJ=no + hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' + export_dynamic_flag_spec_GCJ='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds_GCJ='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds_GCJ='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | k*bsd*-gnu) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + tmp_addflag= + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec_GCJ='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers + whole_archive_flag_spec_GCJ='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + whole_archive_flag_spec_GCJ='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + *) + tmp_sharedflag='-shared' ;; + esac + archive_cmds_GCJ='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test $supports_anon_versioning = yes; then + archive_expsym_cmds_GCJ='$echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + $echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + else + ld_shlibs_GCJ=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds_GCJ='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + ld_shlibs_GCJ=no + cat <&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_GCJ=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs_GCJ=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec_GCJ='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' + archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' + else + ld_shlibs_GCJ=no + fi + ;; + esac + ;; + + sunos4*) + archive_cmds_GCJ='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_GCJ=no + fi + ;; + esac + + if test "$ld_shlibs_GCJ" = no; then + runpath_var= + hardcode_libdir_flag_spec_GCJ= + export_dynamic_flag_spec_GCJ= + whole_archive_flag_spec_GCJ= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag_GCJ=unsupported + always_export_symbols_GCJ=yes + archive_expsym_cmds_GCJ='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L_GCJ=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct_GCJ=unsupported + fi + ;; + + aix[4-9]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + export_symbols_cmds_GCJ='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_GCJ='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_GCJ='' + hardcode_direct_GCJ=yes + hardcode_libdir_separator_GCJ=':' + link_all_deplibs_GCJ=yes + + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct_GCJ=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_GCJ=yes + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_libdir_separator_GCJ= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols_GCJ=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag_GCJ='-berok' + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds_GCJ="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec_GCJ='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag_GCJ="-z nodefs" + archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_GCJ=' ${wl}-bernotok' + allow_undefined_flag_GCJ=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_GCJ='$convenience' + archive_cmds_need_lc_GCJ=yes + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_minus_L_GCJ=yes + # see comment about different semantics on the GNU ld section + ld_shlibs_GCJ=no + ;; + + bsdi[45]*) + export_dynamic_flag_spec_GCJ=-rdynamic + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec_GCJ=' ' + allow_undefined_flag_GCJ=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds_GCJ='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_From_new_cmds_GCJ='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds_GCJ='lib -OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path_GCJ='`cygpath -w "$srcfile"`' + enable_shared_with_static_runtimes_GCJ=yes + ;; + + darwin* | rhapsody*) + case $host_os in + rhapsody* | darwin1.[012]) + allow_undefined_flag_GCJ='${wl}-undefined ${wl}suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + allow_undefined_flag_GCJ='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + allow_undefined_flag_GCJ='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + ;; + 10.*) + allow_undefined_flag_GCJ='${wl}-undefined ${wl}dynamic_lookup' + ;; + esac + fi + ;; + esac + archive_cmds_need_lc_GCJ=no + hardcode_direct_GCJ=no + hardcode_automatic_GCJ=yes + hardcode_shlibpath_var_GCJ=unsupported + whole_archive_flag_spec_GCJ='' + link_all_deplibs_GCJ=yes + if test "$GCC" = yes ; then + output_verbose_link_cmd='echo' + archive_cmds_GCJ="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + module_cmds_GCJ="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + archive_expsym_cmds_GCJ="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + module_expsym_cmds_GCJ="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + else + case $cc_basename in + xlc*) + output_verbose_link_cmd='echo' + archive_cmds_GCJ='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring' + module_cmds_GCJ='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + ld_shlibs_GCJ=no + ;; + esac + fi + ;; + + dgux*) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_shlibpath_var_GCJ=no + ;; + + freebsd1*) + ld_shlibs_GCJ=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec_GCJ='-R$libdir' + hardcode_direct_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_GCJ=yes + hardcode_minus_L_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + archive_cmds_GCJ='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_GCJ='-R$libdir' + hardcode_direct_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + hpux9*) + if test "$GCC" = yes; then + archive_cmds_GCJ='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + archive_cmds_GCJ='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + hardcode_direct_GCJ=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_GCJ=yes + export_dynamic_flag_spec_GCJ='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + archive_cmds_GCJ='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_GCJ='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + + hardcode_direct_GCJ=yes + export_dynamic_flag_spec_GCJ='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_GCJ=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_GCJ='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_libdir_flag_spec_ld_GCJ='+b $libdir' + hardcode_direct_GCJ=no + hardcode_shlibpath_var_GCJ=no + ;; + *) + hardcode_direct_GCJ=yes + export_dynamic_flag_spec_GCJ='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_GCJ=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds_GCJ='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_ld_GCJ='-rpath $libdir' + fi + hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + link_all_deplibs_GCJ=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds_GCJ='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec_GCJ='-R$libdir' + hardcode_direct_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + newsos6) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_GCJ=yes + hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + hardcode_shlibpath_var_GCJ=no + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + hardcode_direct_GCJ=yes + hardcode_shlibpath_var_GCJ=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' + export_dynamic_flag_spec_GCJ='${wl}-E' + else + case $host_os in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_GCJ='-R$libdir' + ;; + *) + archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' + ;; + esac + fi + else + ld_shlibs_GCJ=no + fi + ;; + + os2*) + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_minus_L_GCJ=yes + allow_undefined_flag_GCJ=unsupported + archive_cmds_GCJ='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_From_new_cmds_GCJ='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag_GCJ=' -expect_unresolved \*' + archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag_GCJ=' -expect_unresolved \*' + archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds_GCJ='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec_GCJ='-rpath $libdir' + fi + hardcode_libdir_separator_GCJ=: + ;; + + solaris*) + no_undefined_flag_GCJ=' -z text' + if test "$GCC" = yes; then + wlarc='${wl}' + archive_cmds_GCJ='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' + else + wlarc='' + archive_cmds_GCJ='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + fi + hardcode_libdir_flag_spec_GCJ='-R$libdir' + hardcode_shlibpath_var_GCJ=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. GCC discards it without `$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test "$GCC" = yes; then + whole_archive_flag_spec_GCJ='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + else + whole_archive_flag_spec_GCJ='-z allextract$convenience -z defaultextract' + fi + ;; + esac + link_all_deplibs_GCJ=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds_GCJ='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_GCJ='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_direct_GCJ=yes + hardcode_minus_L_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_GCJ=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds_GCJ='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds_GCJ='$CC -r -o $output$reload_objs' + hardcode_direct_GCJ=no + ;; + motorola) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_GCJ=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var_GCJ=no + ;; + + sysv4.3*) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_GCJ=no + export_dynamic_flag_spec_GCJ='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_GCJ=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs_GCJ=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag_GCJ='${wl}-z,text' + archive_cmds_need_lc_GCJ=no + hardcode_shlibpath_var_GCJ=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds_GCJ='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_GCJ='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_GCJ='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_GCJ='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag_GCJ='${wl}-z,text' + allow_undefined_flag_GCJ='${wl}-z,nodefs' + archive_cmds_need_lc_GCJ=no + hardcode_shlibpath_var_GCJ=no + hardcode_libdir_flag_spec_GCJ='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + hardcode_libdir_separator_GCJ=':' + link_all_deplibs_GCJ=yes + export_dynamic_flag_spec_GCJ='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds_GCJ='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_GCJ='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_GCJ='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_GCJ='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_shlibpath_var_GCJ=no + ;; + + *) + ld_shlibs_GCJ=no + ;; + esac + fi + +{ $as_echo "$as_me:$LINENO: result: $ld_shlibs_GCJ" >&5 +$as_echo "$ld_shlibs_GCJ" >&6; } +test "$ld_shlibs_GCJ" = no && can_build_shared=no + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_GCJ" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_GCJ=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds_GCJ in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } + $rm conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_GCJ + pic_flag=$lt_prog_compiler_pic_GCJ + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_GCJ + allow_undefined_flag_GCJ= + if { (eval echo "$as_me:$LINENO: \"$archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 + (eval $archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + then + archive_cmds_need_lc_GCJ=no + else + archive_cmds_need_lc_GCJ=yes + fi + allow_undefined_flag_GCJ=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + { $as_echo "$as_me:$LINENO: result: $archive_cmds_need_lc_GCJ" >&5 +$as_echo "$archive_cmds_need_lc_GCJ" >&6; } + ;; + esac + fi + ;; +esac + +{ $as_echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" + +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[4-9]*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[123]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +interix[3-9]*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + shlibpath_overrides_runpath=no + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + shlibpath_overrides_runpath=yes + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:$LINENO: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_sys_lib_search_path_spec="$sys_lib_search_path_spec" +fi + +sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec" +fi + +sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +{ $as_echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action_GCJ= +if test -n "$hardcode_libdir_flag_spec_GCJ" || \ + test -n "$runpath_var_GCJ" || \ + test "X$hardcode_automatic_GCJ" = "Xyes" ; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct_GCJ" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, GCJ)" != no && + test "$hardcode_minus_L_GCJ" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action_GCJ=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_GCJ=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_GCJ=unsupported +fi +{ $as_echo "$as_me:$LINENO: result: $hardcode_action_GCJ" >&5 +$as_echo "$hardcode_action_GCJ" >&6; } + +if test "$hardcode_action_GCJ" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + +# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + compiler_GCJ \ + CC_GCJ \ + LD_GCJ \ + lt_prog_compiler_wl_GCJ \ + lt_prog_compiler_pic_GCJ \ + lt_prog_compiler_static_GCJ \ + lt_prog_compiler_no_builtin_flag_GCJ \ + export_dynamic_flag_spec_GCJ \ + thread_safe_flag_spec_GCJ \ + whole_archive_flag_spec_GCJ \ + enable_shared_with_static_runtimes_GCJ \ + old_archive_cmds_GCJ \ + old_archive_from_new_cmds_GCJ \ + predep_objects_GCJ \ + postdep_objects_GCJ \ + predeps_GCJ \ + postdeps_GCJ \ + compiler_lib_search_path_GCJ \ + compiler_lib_search_dirs_GCJ \ + archive_cmds_GCJ \ + archive_expsym_cmds_GCJ \ + postinstall_cmds_GCJ \ + postuninstall_cmds_GCJ \ + old_archive_from_expsyms_cmds_GCJ \ + allow_undefined_flag_GCJ \ + no_undefined_flag_GCJ \ + export_symbols_cmds_GCJ \ + hardcode_libdir_flag_spec_GCJ \ + hardcode_libdir_flag_spec_ld_GCJ \ + hardcode_libdir_separator_GCJ \ + hardcode_automatic_GCJ \ + module_cmds_GCJ \ + module_expsym_cmds_GCJ \ + lt_cv_prog_compiler_c_o_GCJ \ + fix_srcfile_path_GCJ \ + exclude_expsyms_GCJ \ + include_expsyms_GCJ; do + + case $var in + old_archive_cmds_GCJ | \ + old_archive_from_new_cmds_GCJ | \ + archive_cmds_GCJ | \ + archive_expsym_cmds_GCJ | \ + module_cmds_GCJ | \ + module_expsym_cmds_GCJ | \ + old_archive_from_expsyms_cmds_GCJ | \ + export_symbols_cmds_GCJ | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\$0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + +cfgfile="$ofile" + + cat <<__EOF__ >> "$cfgfile" +# ### BEGIN LIBTOOL TAG CONFIG: $tagname + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_GCJ + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_GCJ + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# LTCC compiler flags. +LTCFLAGS=$lt_LTCFLAGS + +# A language-specific compiler. +CC=$lt_compiler_GCJ + +# Is the compiler the GNU C compiler? +with_gcc=$GCC_GCJ + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_LD_GCJ + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_GCJ + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_GCJ +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_GCJ + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_GCJ + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_GCJ + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_GCJ + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_GCJ + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec_GCJ + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds_GCJ +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_GCJ + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_GCJ + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds_GCJ +archive_expsym_cmds=$lt_archive_expsym_cmds_GCJ +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_module_cmds_GCJ +module_expsym_cmds=$lt_module_expsym_cmds_GCJ + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_predep_objects_GCJ + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_postdep_objects_GCJ + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_predeps_GCJ + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_postdeps_GCJ + +# The directories searched by this compiler when creating a shared +# library +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_GCJ + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_GCJ + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_GCJ + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_GCJ + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_GCJ + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_GCJ + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_GCJ + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_GCJ + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct_GCJ + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L_GCJ + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_GCJ + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$hardcode_automatic_GCJ + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_GCJ + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path=$lt_fix_srcfile_path + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols_GCJ + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_GCJ + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_GCJ + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_GCJ + +# ### END LIBTOOL TAG CONFIG: $tagname + +__EOF__ + + +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + 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 + +CC="$lt_save_CC" + + else + tagname="" + fi + ;; + + RC) + + +# Source file extension for RC test sources. +ac_ext=rc + +# Object file extension for compiled RC test sources. +objext=o +objext_RC=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' + +# Code to be used in simple link tests +lt_simple_link_test_code="$lt_simple_compile_test_code" + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$rm conftest* + +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$rm -r conftest* + + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +CC=${RC-"windres"} +compiler=$CC +compiler_RC=$CC +for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + +lt_cv_prog_compiler_c_o_RC=yes + +# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + compiler_RC \ + CC_RC \ + LD_RC \ + lt_prog_compiler_wl_RC \ + lt_prog_compiler_pic_RC \ + lt_prog_compiler_static_RC \ + lt_prog_compiler_no_builtin_flag_RC \ + export_dynamic_flag_spec_RC \ + thread_safe_flag_spec_RC \ + whole_archive_flag_spec_RC \ + enable_shared_with_static_runtimes_RC \ + old_archive_cmds_RC \ + old_archive_from_new_cmds_RC \ + predep_objects_RC \ + postdep_objects_RC \ + predeps_RC \ + postdeps_RC \ + compiler_lib_search_path_RC \ + compiler_lib_search_dirs_RC \ + archive_cmds_RC \ + archive_expsym_cmds_RC \ + postinstall_cmds_RC \ + postuninstall_cmds_RC \ + old_archive_from_expsyms_cmds_RC \ + allow_undefined_flag_RC \ + no_undefined_flag_RC \ + export_symbols_cmds_RC \ + hardcode_libdir_flag_spec_RC \ + hardcode_libdir_flag_spec_ld_RC \ + hardcode_libdir_separator_RC \ + hardcode_automatic_RC \ + module_cmds_RC \ + module_expsym_cmds_RC \ + lt_cv_prog_compiler_c_o_RC \ + fix_srcfile_path_RC \ + exclude_expsyms_RC \ + include_expsyms_RC; do + + case $var in + old_archive_cmds_RC | \ + old_archive_from_new_cmds_RC | \ + archive_cmds_RC | \ + archive_expsym_cmds_RC | \ + module_cmds_RC | \ + module_expsym_cmds_RC | \ + old_archive_from_expsyms_cmds_RC | \ + export_symbols_cmds_RC | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\$0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + +cfgfile="$ofile" + + cat <<__EOF__ >> "$cfgfile" +# ### BEGIN LIBTOOL TAG CONFIG: $tagname + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_RC + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_RC + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# LTCC compiler flags. +LTCFLAGS=$lt_LTCFLAGS + +# A language-specific compiler. +CC=$lt_compiler_RC + +# Is the compiler the GNU C compiler? +with_gcc=$GCC_RC + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_LD_RC + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_RC + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_RC +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_RC + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_RC + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_RC + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_RC + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_RC + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec_RC + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds_RC +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_RC + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_RC + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds_RC +archive_expsym_cmds=$lt_archive_expsym_cmds_RC +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_module_cmds_RC +module_expsym_cmds=$lt_module_expsym_cmds_RC + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_predep_objects_RC + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_postdep_objects_RC + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_predeps_RC + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_postdeps_RC + +# The directories searched by this compiler when creating a shared +# library +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_RC + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_RC + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_RC + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_RC + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_RC + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_RC + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_RC + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_RC + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct_RC + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L_RC + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_RC + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$hardcode_automatic_RC + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_RC + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path=$lt_fix_srcfile_path + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols_RC + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_RC + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_RC + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_RC + +# ### END LIBTOOL TAG CONFIG: $tagname + +__EOF__ + + +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + 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 + +CC="$lt_save_CC" + + ;; + + *) + { { $as_echo "$as_me:$LINENO: error: Unsupported tag name: $tagname" >&5 +$as_echo "$as_me: error: Unsupported tag name: $tagname" >&2;} + { (exit 1); exit 1; }; } + ;; + esac + + # Append the new tag name to the list of available tags. + if test -n "$tagname" ; then + available_tags="$available_tags $tagname" + fi + fi + done + IFS="$lt_save_ifs" + + # Now substitute the updated list of available tags. + if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then + mv "${ofile}T" "$ofile" + chmod +x "$ofile" + else + rm -f "${ofile}T" + { { $as_echo "$as_me:$LINENO: error: unable to update list of available tagged configurations." >&5 +$as_echo "$as_me: error: unable to update list of available tagged configurations." >&2;} + { (exit 1); exit 1; }; } + fi +fi + + + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(top_builddir)/libtool' + +# Prevent multiple expansion + + + + + + + + + + + + + + + + + + + + + ;; +esac + + + + + +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 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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 + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:$LINENO: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "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 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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 + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$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 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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 + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:$LINENO: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "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 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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 + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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" + $as_echo "$as_me:$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 +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:$LINENO: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "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 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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 + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:$LINENO: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "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 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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 + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "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:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } + +# Provide some information about the compiler. +$as_echo "$as_me:$LINENO: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +{ (ac_try="$ac_compiler --version >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler --version >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -v >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -v >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -V >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -V >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +{ $as_echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if test "${ac_cv_c_compiler_gnu+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_compiler_gnu=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_compiler_gnu=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if test "${ac_cv_prog_cc_g+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_g=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + CFLAGS="" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_g=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if test "${ac_cv_prog_cc_c89+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + 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; +} + +/* 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 don't provoke an error unfortunately, instead are silently treated + as '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's necessary to write '\x00'==0 to get something + that's 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 **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_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" + rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_c89=$ac_arg +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:$LINENO: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:$LINENO: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac + + +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 + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if test "${ac_cv_path_install+set}" = set; then + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in + ./ | .// | /cC/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + +done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:$LINENO: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + + +{ $as_echo "$as_me:$LINENO: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if test "${ac_cv_header_stdc+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_header_stdc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_header_stdc=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then + : +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_header_stdc=no +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +cat >>confdefs.h <<\_ACEOF +#define STDC_HEADERS 1 +_ACEOF + +fi + + +if test "$cross_compiling" = "no"; then + + { $as_echo "$as_me:$LINENO: checking whether byte ordering is bigendian" >&5 +$as_echo_n "checking whether byte ordering is bigendian... " >&6; } +if test "${ac_cv_c_bigendian+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_c_bigendian=unknown + # See if we're dealing with a universal compiler. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifndef __APPLE_CC__ + not a universal capable compiler + #endif + typedef int dummy; + +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + + # Check for potential -arch flags. It is not universal unless + # there are some -arch flags. Note that *ppc* also matches + # ppc64. This check is also rather less than ideal. + case "${CC} ${CFLAGS} ${CPPFLAGS} ${LDFLAGS}" in #( + *-arch*ppc*|*-arch*i386*|*-arch*x86_64*) ac_cv_c_bigendian=universal;; + esac +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + if test $ac_cv_c_bigendian = unknown; then + # See if sys/param.h defines the BYTE_ORDER macro. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + #include + +int +main () +{ +#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \ + && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \ + && LITTLE_ENDIAN) + bogus endian macros + #endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + # It does; now see whether it defined to BIG_ENDIAN or not. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + #include + +int +main () +{ +#if BYTE_ORDER != BIG_ENDIAN + not big endian + #endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_c_bigendian=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_c_bigendian=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + fi + if test $ac_cv_c_bigendian = unknown; then + # See if defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris). + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +int +main () +{ +#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN) + bogus endian macros + #endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + # It does; now see whether it defined to _BIG_ENDIAN or not. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +int +main () +{ +#ifndef _BIG_ENDIAN + not big endian + #endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_c_bigendian=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_c_bigendian=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + fi + if test $ac_cv_c_bigendian = unknown; then + # Compile a test program. + if test "$cross_compiling" = yes; then + # Try to guess by grepping values from an object file. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +short int ascii_mm[] = + { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 }; + short int ascii_ii[] = + { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 }; + int use_ascii (int i) { + return ascii_mm[i] + ascii_ii[i]; + } + short int ebcdic_ii[] = + { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 }; + short int ebcdic_mm[] = + { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 }; + int use_ebcdic (int i) { + return ebcdic_mm[i] + ebcdic_ii[i]; + } + extern int foo; + +int +main () +{ +return use_ascii (foo) == use_ebcdic (foo); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then + ac_cv_c_bigendian=yes + fi + if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then + if test "$ac_cv_c_bigendian" = unknown; then + ac_cv_c_bigendian=no + else + # finding both strings is unlikely to happen, but who knows? + ac_cv_c_bigendian=unknown + fi + fi +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ + + /* Are we little or big endian? From Harbison&Steele. */ + union + { + long int l; + char c[sizeof (long int)]; + } u; + u.l = 1; + return u.c[sizeof (long int) - 1] == 1; + + ; + return 0; +} +_ACEOF +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_c_bigendian=no +else + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_c_bigendian=yes +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + + fi +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_bigendian" >&5 +$as_echo "$ac_cv_c_bigendian" >&6; } + case $ac_cv_c_bigendian in #( + yes) + cat >>confdefs.h <<\_ACEOF +#define WORDS_BIGENDIAN 1 +_ACEOF +;; #( + no) + ;; #( + universal) + +cat >>confdefs.h <<\_ACEOF +#define AC_APPLE_UNIVERSAL_BUILD 1 +_ACEOF + + ;; #( + *) + { { $as_echo "$as_me:$LINENO: error: unknown endianness + presetting ac_cv_c_bigendian=no (or yes) will help" >&5 +$as_echo "$as_me: error: unknown endianness + presetting ac_cv_c_bigendian=no (or yes) will help" >&2;} + { (exit 1); exit 1; }; } ;; + esac + +else + +cat >>confdefs.h <<\_ACEOF +#define AP_UNKNOWN_BYTE_ORDER 1 +_ACEOF + +fi +{ $as_echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5 +$as_echo_n "checking for an ANSI C-conforming const... " >&6; } +if test "${ac_cv_c_const+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +/* FIXME: Include the comments suggested by Paul. */ +#ifndef __cplusplus + /* Ultrix mips cc rejects this. */ + typedef int charset[2]; + const charset cs; + /* 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}; + /* AIX XL C 1.02.0.0 rejects this. + It does not let you subtract one const X* pointer from another in + an arm of an if-expression whose if-part is not a constant + expression */ + const char *g = "string"; + 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. */ + char *t; + 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; + } + { /* AIX XL C 1.02.0.0 rejects this saying + "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ + struct s { int j; const int *ap[3]; }; + struct s *b; b->j = 5; + } + { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ + const int foo = 10; + if (!foo) return 0; + } + return !cs[0] && !zero.x; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_c_const=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_c_const=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5 +$as_echo "$ac_cv_c_const" >&6; } +if test $ac_cv_c_const = no; then + +cat >>confdefs.h <<\_ACEOF +#define const /**/ +_ACEOF + +fi + +{ $as_echo "$as_me:$LINENO: checking for size_t" >&5 +$as_echo_n "checking for size_t... " >&6; } +if test "${ac_cv_type_size_t+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_type_size_t=no +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if (sizeof (size_t)) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if (sizeof ((size_t))) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_type_size_t=yes +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5 +$as_echo "$ac_cv_type_size_t" >&6; } +if test "x$ac_cv_type_size_t" = x""yes; then + : +else + +cat >>confdefs.h <<_ACEOF +#define size_t unsigned int +_ACEOF + +fi + + + +for ac_func in memmove bcopy +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* 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 $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + + +for ac_header in check.h +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 +$as_echo_n "checking $ac_header usability... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 +$as_echo_n "checking $ac_header presence... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( cat <<\_ASBOX +## ------------------------------------------- ## +## Report this to expat-bugs@mail.libexpat.org ## +## ------------------------------------------- ## +_ASBOX + ) | sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + +fi +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + +cat >>confdefs.h <<\_ACEOF +#define XML_NS 1 +_ACEOF + + +cat >>confdefs.h <<\_ACEOF +#define XML_DTD 1 +_ACEOF + + +cat >>confdefs.h <<\_ACEOF +#define XML_CONTEXT_BYTES 1024 +_ACEOF + + +ac_config_files="$ac_config_files Makefile" + +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_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$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= ;; #( + *) $as_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+set}" = set || &/ + 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 + test "x$cache_file" != "x/dev/null" && + { $as_echo "$as_me:$LINENO: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + cat confcache >$cache_file + else + { $as_echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 +$as_echo "$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= +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=`$as_echo "$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. + ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" + ac_ltlibobjs="$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" +{ $as_echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +cat >$CONFIG_STATUS <<_ACEOF || ac_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} +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be more Bourne compatible +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 + + + + +# PATH needs CR +# 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_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +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 + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + 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 + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + { (exit 1); exit 1; } +fi + +# Work around bugs in pre-3.0 UWIN ksh. +for as_var in ENV MAIL MAILPATH +do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# Required to use basename. +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 + + +# Name of the executable. +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# CDPATH. +$as_unset CDPATH + + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line after each line using $LINENO; the second 'sed' + # does the real work. The second script uses 'N' to pair each + # line-number line with the line containing $LINENO, and appends + # trailing '-' during substitution so that $LINENO is not a special + # case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # scripts with optimization help from Paolo Bonzini. Blame Lee + # E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + 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" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); exit 1; }; } + + # 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 +} + + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in +-n*) + case `echo 'x\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + *) ECHO_C='\c';; + esac;; +*) + ECHO_N='-n';; +esac +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +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 -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +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=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&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 expat $as_me 1.95.7, which was +generated by GNU Autoconf 2.63. 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" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files from templates according to the +current configuration. + +Usage: $0 [OPTION]... [FILE]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, 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 + +Report bugs to ." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_version="\\ +expat config.status 1.95.7 +configured by $0, generated by GNU Autoconf 2.63, + with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" + +Copyright (C) 2008 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' +INSTALL='$INSTALL' +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=$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 ) + $as_echo "$ac_cs_version"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + CONFIG_FILES="$CONFIG_FILES '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + CONFIG_HEADERS="$CONFIG_HEADERS '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + { $as_echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; };; + --help | --hel | -h ) + $as_echo "$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_echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } ;; + + *) ac_config_targets="$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 + \$as_echo "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 + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_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 + "expat_config.h") CONFIG_HEADERS="$CONFIG_HEADERS expat_config.h" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + + *) { { $as_echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 +$as_echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; + 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+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers +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= + trap 'exit_status=$? + { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status +' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || +{ + $as_echo "$as_me: cannot create a temporary directory in ." >&2 + { (exit 1); exit 1; } +} + +# 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=' ' +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 {' >"$tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } +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_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } + + 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_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } + 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 >>"\$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 >>"\$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 < "$tmp/subs1.awk" > "$tmp/subs.awk" \ + || { { $as_echo "$as_me:$LINENO: error: could not setup config files machinery" >&5 +$as_echo "$as_me: error: could not setup config files machinery" >&2;} + { (exit 1); exit 1; }; } +_ACEOF + +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ 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[ ]*=/{ +s/:*\$(srcdir):*/:/ +s/:*\${srcdir}:*/:/ +s/:*@srcdir@:*/:/ +s/^\([^=]*=[ ]*\):*/\1/ +s/:*$// +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 >"$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_t=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_t"; then + break + elif $ac_last_try; then + { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_HEADERS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_HEADERS" >&2;} + { (exit 1); exit 1; }; } + 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_echo "$as_me:$LINENO: error: could not setup config headers machinery" >&5 +$as_echo "$as_me: error: could not setup config headers machinery" >&2;} + { (exit 1); exit 1; }; } +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS " +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_echo "$as_me:$LINENO: error: invalid tag $ac_tag" >&5 +$as_echo "$as_me: error: invalid tag $ac_tag" >&2;} + { (exit 1); exit 1; }; };; + :[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="$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_echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 +$as_echo "$as_me: error: cannot find input file: $ac_f" >&2;} + { (exit 1); exit 1; }; };; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + ac_file_inputs="$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 '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:$LINENO: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$tmp/stdin" \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } ;; + 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 || +$as_echo 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" + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$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 || +$as_echo 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_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 +$as_echo "$as_me: error: cannot create directory $as_dir" >&2;} + { (exit 1); exit 1; }; }; } + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$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 + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac +_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@*) + { $as_echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$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 +s&@INSTALL@&$ac_INSTALL&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&5 +$as_echo "$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 "$tmp/stdin" + case $ac_file in + -) cat "$tmp/out" && rm -f "$tmp/out";; + *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; + esac \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" + } >"$tmp/config.h" \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:$LINENO: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$tmp/config.h" "$ac_file" \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ + || { { $as_echo "$as_me:$LINENO: error: could not create -" >&5 +$as_echo "$as_me: error: could not create -" >&2;} + { (exit 1); exit 1; }; } + fi + ;; + + + esac + +done # for ac_tag + + +{ (exit 0); exit 0; } +_ACEOF +chmod +x $CONFIG_STATUS +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + { { $as_echo "$as_me:$LINENO: error: write failure creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: write failure creating $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } + + +# 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 || { (exit 1); exit 1; } +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:$LINENO: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + + +abs_srcdir="`cd $srcdir && pwd`" +abs_builddir="`pwd`" +if test "$abs_srcdir" != "$abs_builddir"; then + mkdir lib +fi + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/configure.in b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/configure.in new file mode 100644 index 00000000..c8d76e51 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/configure.in @@ -0,0 +1,99 @@ +dnl configuration script for expat +dnl Process this file with autoconf to produce a configure script. +dnl +dnl Copyright 2000 Clark Cooper +dnl +dnl This file is part of EXPAT. +dnl +dnl EXPAT is free software; you can redistribute it and/or modify it +dnl under the terms of the License (based on the MIT/X license) contained +dnl in the file COPYING that comes with this distribution. +dnl + +dnl Ensure that Expat is configured with autoconf 2.52 or newer +AC_PREREQ(2.52) + + +dnl ### apr-util hack: just hard-code the version here, as is done in expat.h. +AC_INIT(expat, 1.95.7, expat-bugs@mail.libexpat.org) + +AC_CONFIG_SRCDIR(Makefile.in) +AC_CONFIG_AUX_DIR(conftools) +AC_CONFIG_MACRO_DIR(conftools) + +dnl +dnl Increment LIBREVISION if source code has changed at all +dnl +dnl If the API has changed, increment LIBCURRENT and set LIBREVISION to 0 +dnl +dnl If the API changes compatibly (i.e. simply adding a new function +dnl without changing or removing earlier interfaces), then increment LIBAGE. +dnl +dnl If the API changes incompatibly set LIBAGE back to 0 +dnl + +LIBCURRENT=5 +LIBREVISION=0 +LIBAGE=5 + +AC_CONFIG_HEADER(expat_config.h) + +sinclude(conftools/ac_c_bigendian_cross.m4) + +AC_CANONICAL_SYSTEM + +case "$host_os" in +*os2*) + # Use a custom made libtool replacement + echo Using aplibtool + LIBTOOL="$srcdir/../../../apr/build/aplibtool" + ;; +*) +AC_LIBTOOL_WIN32_DLL +AC_PROG_LIBTOOL + ;; +esac + +AC_SUBST(LIBCURRENT) +AC_SUBST(LIBREVISION) +AC_SUBST(LIBAGE) + +dnl Checks for programs. +AC_PROG_CC +AC_PROG_INSTALL + +dnl Checks for header files. +AC_HEADER_STDC + +dnl Checks for typedefs, structures, and compiler characteristics. +dnl check for endianness +if test "$cross_compiling" = "no"; then + AC_C_BIGENDIAN +else + AC_DEFINE(AP_UNKNOWN_BYTE_ORDER,1, + [byte order is unknown due to cross-compilation]) +fi +AC_C_CONST +AC_TYPE_SIZE_T +AC_CHECK_FUNCS(memmove bcopy) + +dnl Only needed for regression tests: +AC_CHECK_HEADERS(check.h) + +dnl Some basic configuration: +AC_DEFINE([XML_NS], 1, + [Define to make XML Namespaces functionality available.]) +AC_DEFINE([XML_DTD], 1, + [Define to make parameter entity parsing functionality available.]) +AC_DEFINE([XML_CONTEXT_BYTES], 1024, + [Define to specify how much context to retain around the current parse point.]) + +AC_CONFIG_FILES(Makefile) +AC_OUTPUT + +abs_srcdir="`cd $srcdir && pwd`" +abs_builddir="`pwd`" +if test "$abs_srcdir" != "$abs_builddir"; then + mkdir lib +fi + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/conftools/PrintPath b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/conftools/PrintPath new file mode 100755 index 00000000..68435f37 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/conftools/PrintPath @@ -0,0 +1,116 @@ +#!/bin/sh +# 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) +# +# This script falls under the Apache License. +# See http://www.apache.org/docs/LICENSE + +## +# 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 seperated 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/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/conftools/ac_c_bigendian_cross.m4 b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/conftools/ac_c_bigendian_cross.m4 new file mode 100644 index 00000000..8ed3edb2 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/conftools/ac_c_bigendian_cross.m4 @@ -0,0 +1,81 @@ +dnl @synopsis AC_C_BIGENDIAN_CROSS +dnl +dnl Check endianess even when crosscompiling +dnl (partially based on the original AC_C_BIGENDIAN). +dnl +dnl The implementation will create a binary, and instead of running +dnl the binary it will be grep'ed for some symbols that will look +dnl different for different endianess of the binary. +dnl +dnl @version $Id: ac_c_bigendian_cross.m4,v 1.2 2001/10/01 20:03:13 fdrake Exp $ +dnl @author Guido Draheim +dnl +AC_DEFUN([AC_C_BIGENDIAN_CROSS], +[AC_CACHE_CHECK(whether byte ordering is bigendian, ac_cv_c_bigendian, +[ac_cv_c_bigendian=unknown +# See if sys/param.h defines the BYTE_ORDER macro. +AC_TRY_COMPILE([#include +#include ], [ +#if !BYTE_ORDER || !BIG_ENDIAN || !LITTLE_ENDIAN + bogus endian macros +#endif], [# It does; now see whether it defined to BIG_ENDIAN or not. +AC_TRY_COMPILE([#include +#include ], [ +#if BYTE_ORDER != BIG_ENDIAN + not big endian +#endif], ac_cv_c_bigendian=yes, ac_cv_c_bigendian=no)]) +if test $ac_cv_c_bigendian = unknown; then +AC_TRY_RUN([main () { + /* Are we little or big endian? From Harbison&Steele. */ + union + { + long l; + char c[sizeof (long)]; + } u; + u.l = 1; + exit (u.c[sizeof (long) - 1] == 1); +}], ac_cv_c_bigendian=no, ac_cv_c_bigendian=yes, +[ echo $ac_n "cross-compiling... " 2>&AC_FD_MSG ]) +fi]) +if test $ac_cv_c_bigendian = unknown; then +AC_MSG_CHECKING(to probe for byte ordering) +[ +cat >conftest.c <&AC_FD_MSG + ac_cv_c_bigendian=yes + fi + if test `grep -l LiTTleEnDian conftest.o` ; then + echo $ac_n ' little endian probe OK, ' 1>&AC_FD_MSG + if test $ac_cv_c_bigendian = yes ; then + ac_cv_c_bigendian=unknown; + else + ac_cv_c_bigendian=no + fi + fi + echo $ac_n 'guessing bigendian ... ' >&AC_FD_MSG + fi + fi +AC_MSG_RESULT($ac_cv_c_bigendian) +fi +if test $ac_cv_c_bigendian = yes; then + AC_DEFINE(WORDS_BIGENDIAN, 1, [whether byteorder is bigendian]) + BYTEORDER=4321 +else + BYTEORDER=1234 +fi +AC_DEFINE_UNQUOTED(BYTEORDER, $BYTEORDER, [1234 = LIL_ENDIAN, 4321 = BIGENDIAN]) +if test $ac_cv_c_bigendian = unknown; then + AC_MSG_ERROR(unknown endianess - sorry, please pre-set ac_cv_c_bigendian) +fi +]) diff --git a/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/conftools/config.guess b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/conftools/config.guess new file mode 100755 index 00000000..115f944a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/conftools/config.guess @@ -0,0 +1,1502 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 +# Free Software Foundation, Inc. + +timestamp='2010-04-03' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA +# 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + + +# Originally written by Per Bothner. Please send patches (context +# diff format) to and include a ChangeLog +# entry. +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, +2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free +Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +trap 'exit 1' HUP INT TERM + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +set_cc_for_build=' +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" HUP INT PIPE TERM ; +: ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +dummy=$tmp/dummy ; +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > $dummy.c ; + for c in cc gcc c89 c99 ; do + if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac ; set_cc_for_build= ;' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE_ARCH}" in + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ELF__ + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "${UNAME_VERSION}" in + Debian*) + release='-gnu' + ;; + *) + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} + exit ;; + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + exit ;; + *:SolidBSD:*:*) + echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} + exit ;; + macppc:MirBSD:*:*) + echo powerpc-unknown-mirbsd${UNAME_RELEASE} + exit ;; + *:MirBSD:*:*) + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE="alpha" ;; + "EV4.5 (21064)") + UNAME_MACHINE="alpha" ;; + "LCA4 (21066/21068)") + UNAME_MACHINE="alpha" ;; + "EV5 (21164)") + UNAME_MACHINE="alphaev5" ;; + "EV5.6 (21164A)") + UNAME_MACHINE="alphaev56" ;; + "EV5.6 (21164PC)") + UNAME_MACHINE="alphapca56" ;; + "EV5.7 (21164PC)") + UNAME_MACHINE="alphapca57" ;; + "EV6 (21264)") + UNAME_MACHINE="alphaev6" ;; + "EV6.7 (21264A)") + UNAME_MACHINE="alphaev67" ;; + "EV6.8CB (21264C)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8AL (21264B)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8CX (21264D)") + UNAME_MACHINE="alphaev68" ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE="alphaev69" ;; + "EV7 (21364)") + UNAME_MACHINE="alphaev7" ;; + "EV7.9 (21364A)") + UNAME_MACHINE="alphaev79" ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + exit ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit ;; + arm:riscos:*:*|arm:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + s390x:SunOS:*:*) + echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) + echo i386-pc-auroraux${UNAME_RELEASE} + exit ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + eval $set_cc_for_build + SUN_ARCH="i386" + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH="x86_64" + fi + fi + echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && + dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`$dummy $dummyarg` && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos${UNAME_RELEASE} + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit ;; + *:AIX:*:[456]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include + #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 [ ${HP_ARCH} = "hppa2.0w" ] + then + eval $set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | + grep -q __LP64__ + then + HP_ARCH="hppa2.0w" + else + HP_ARCH="hppa64" + fi + fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:FreeBSD:*:*) + case ${UNAME_MACHINE} in + pc98) + echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + amd64) + echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + *) + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + esac + exit ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit ;; + *:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit ;; + i*:windows32*:*) + # uname -m includes "-pc" on this system. + echo ${UNAME_MACHINE}-mingw32 + exit ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit ;; + *:Interix*:*) + case ${UNAME_MACHINE} in + x86) + echo i586-pc-interix${UNAME_RELEASE} + exit ;; + authenticamd | genuineintel | EM64T) + echo x86_64-unknown-interix${UNAME_RELEASE} + exit ;; + IA64) + echo ia64-unknown-interix${UNAME_RELEASE} + exit ;; + esac ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit ;; + 8664:Windows_NT:*) + echo x86_64-pc-mks + exit ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-unknown-cygwin + exit ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + *:GNU:*:*) + # the GNU system + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu + exit ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep -q ld.so.1 + if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + exit ;; + arm*:Linux:*:*) + eval $set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + echo ${UNAME_MACHINE}-unknown-linux-gnu + else + echo ${UNAME_MACHINE}-unknown-linux-gnueabi + fi + exit ;; + avr32*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + cris:Linux:*:*) + echo cris-axis-linux-gnu + exit ;; + crisv32:Linux:*:*) + echo crisv32-axis-linux-gnu + exit ;; + frv:Linux:*:*) + echo frv-unknown-linux-gnu + exit ;; + i*86:Linux:*:*) + LIBC=gnu + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #ifdef __dietlibc__ + LIBC=dietlibc + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` + echo "${UNAME_MACHINE}-pc-linux-${LIBC}" + exit ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + mips:Linux:*:* | mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef ${UNAME_MACHINE} + #undef ${UNAME_MACHINE}el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=${UNAME_MACHINE}el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=${UNAME_MACHINE} + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + ;; + or32:Linux:*:*) + echo or32-unknown-linux-gnu + exit ;; + padre:Linux:*:*) + echo sparc-unknown-linux-gnu + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-gnu + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-gnu ;; + PA8*) echo hppa2.0-unknown-linux-gnu ;; + *) echo hppa-unknown-linux-gnu ;; + esac + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-gnu + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-gnu + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + vax:Linux:*:*) + echo ${UNAME_MACHINE}-dec-linux-gnu + exit ;; + x86_64:Linux:*:*) + echo x86_64-unknown-linux-gnu + exit ;; + xtensa*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo ${UNAME_MACHINE}-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i586. + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configury will decide that + # this is a cross-build. + echo i586-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + NCR*:*:4.2:* | MPRAS*:*:4.2:*) + OS_REL='.3' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo ${UNAME_MACHINE}-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + echo i586-pc-haiku + exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} + exit ;; + SX-7:SUPER-UX:*:*) + echo sx7-nec-superux${UNAME_RELEASE} + exit ;; + SX-8:SUPER-UX:*:*) + echo sx8-nec-superux${UNAME_RELEASE} + exit ;; + SX-8R:SUPER-UX:*:*) + echo sx8r-nec-superux${UNAME_RELEASE} + exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + case $UNAME_PROCESSOR in + i386) + eval $set_cc_for_build + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + UNAME_PROCESSOR="x86_64" + fi + fi ;; + unknown) UNAME_PROCESSOR=powerpc ;; + esac + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = "x86"; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NSE-?:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk${UNAME_RELEASE} + exit ;; + NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} + exit ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "${UNAME_MACHINE}" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' + exit ;; + i*86:rdos:*:*) + echo ${UNAME_MACHINE}-pc-rdos + exit ;; + i*86:AROS:*:*) + echo ${UNAME_MACHINE}-pc-aros + exit ;; +esac + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +eval $set_cc_for_build +cat >$dummy.c < +# include +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix\n"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +# if !defined (ultrix) +# include +# if defined (BSD) +# if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +# else +# if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# endif +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# else + printf ("vax-dec-ultrix\n"); exit (0); +# endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + c34*) + echo c34-convex-bsd + exit ;; + c38*) + echo c38-convex-bsd + exit ;; + c4*) + echo c4-convex-bsd + exit ;; + esac +fi + +cat >&2 < in order to provide the needed +information to handle your system. + +config.guess timestamp = $timestamp + +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/conftools/config.sub b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/conftools/config.sub new file mode 100755 index 00000000..204218c0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/conftools/config.sub @@ -0,0 +1,1731 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 +# Free Software Foundation, Inc. + +timestamp='2010-05-21' + +# This file is (in principle) common to ALL GNU software. +# The presence of a machine in this file suggests that SOME GNU software +# can handle that machine. It does not imply ALL GNU software can. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA +# 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + + +# Please send patches to . Submit a context +# diff and a properly formatted GNU ChangeLog entry. +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, +2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free +Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ + linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ + knetbsd*-gnu* | netbsd*-gnu* | \ + kopensolaris*-gnu* | \ + storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis | -knuth | -cray | -microblaze) + os= + basic_machine=$1 + ;; + -bluegene*) + os=-cnk + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco6) + os=-sco5v6 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ + | bfin \ + | c4x | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | fido | fr30 | frv \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ + | lm32 \ + | m32c | m32r | m32rle | m68000 | m68k | m88k \ + | maxq | mb | microblaze | mcore | mep | metag \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64octeon | mips64octeonel \ + | mips64orion | mips64orionel \ + | mips64r5900 | mips64r5900el \ + | mips64vr | mips64vrel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | moxie \ + | mt \ + | msp430 \ + | nios | nios2 \ + | ns16k | ns32k \ + | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ + | pyramid \ + | rx \ + | score \ + | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ + | spu | strongarm \ + | tahoe | thumb | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ + | ubicom32 \ + | v850 | v850e \ + | we32k \ + | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ + | z8k | z80) + basic_machine=$basic_machine-unknown + ;; + c54x) + basic_machine=tic54x-unknown + ;; + c55x) + basic_machine=tic55x-unknown + ;; + c6x) + basic_machine=tic6x-unknown + ;; + m6811 | m68hc11 | m6812 | m68hc12 | picochip) + # Motorola 68HC11/12. + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + ms1) + basic_machine=mt-unknown + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* | avr32-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* \ + | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ + | lm32-* \ + | m32c-* | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64octeon-* | mips64octeonel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64r5900-* | mips64r5900el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mips64vr5900-* | mips64vr5900el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | mt-* \ + | msp430-* \ + | nios-* | nios2-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ + | pyramid-* \ + | romp-* | rs6000-* | rx-* \ + | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ + | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ + | tahoe-* | thumb-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tile-* | tilegx-* \ + | tron-* \ + | ubicom32-* \ + | v850-* | v850e-* | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ + | xstormy16-* | xtensa*-* \ + | ymp-* \ + | z8k-* | z80-*) + ;; + # Recognize the basic CPU types without company name, with glob match. + xtensa*) + basic_machine=$basic_machine-unknown + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + abacus) + basic_machine=abacus-unknown + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amd64) + basic_machine=x86_64-pc + ;; + amd64-*) + basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aros) + basic_machine=i386-pc + os=-aros + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + blackfin) + basic_machine=bfin-unknown + os=-linux + ;; + blackfin-*) + basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + bluegene*) + basic_machine=powerpc-ibm + os=-cnk + ;; + c54x-*) + basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c55x-*) + basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c6x-*) + basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + cegcc) + basic_machine=arm-unknown + os=-cegcc + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + craynv) + basic_machine=craynv-cray + os=-unicosmp + ;; + cr16) + basic_machine=cr16-unknown + os=-elf + ;; + crds | unos) + basic_machine=m68k-crds + ;; + crisv32 | crisv32-* | etraxfs*) + basic_machine=crisv32-axis + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + crx) + basic_machine=crx-unknown + os=-elf + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dicos) + basic_machine=i686-pc + os=-dicos + ;; + djgpp) + basic_machine=i586-pc + os=-msdosdjgpp + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; +# I'm not sure what "Sysv32" means. Should this be sysv3.2? + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m68knommu) + basic_machine=m68k-unknown + os=-linux + ;; + m68knommu-*) + basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + microblaze) + basic_machine=microblaze-xilinx + ;; + mingw32) + basic_machine=i386-pc + os=-mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + os=-mingw32ce + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + ms1-*) + basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + openrisc | openrisc-*) + basic_machine=or32-unknown + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + parisc) + basic_machine=hppa-unknown + os=-linux + ;; + parisc-*) + basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pc98) + basic_machine=i386-pc + ;; + pc98-*) + basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2 | pentiumiii | pentium3) + basic_machine=i686-pc + ;; + pentium4) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium4-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc) basic_machine=powerpc-unknown + ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rdos) + basic_machine=i386-pc + os=-rdos + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sde) + basic_machine=mipsisa32-sde + os=-elf + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sh5el) + basic_machine=sh5le-unknown + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + # This must be matched before tile*. + tilegx*) + basic_machine=tilegx-unknown + os=-linux-gnu + ;; + tile*) + basic_machine=tile-unknown + os=-linux-gnu + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xbox) + basic_machine=i686-pc + os=-mingw32 + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + z80-*-coff) + basic_machine=z80-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + mmix) + basic_machine=mmix-knuth + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -auroraux) + os=-auroraux + ;; + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ + | -sym* | -kopensolaris* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* | -aros* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ + | -openbsd* | -solidbsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* | -cegcc* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -linux-android* \ + | -linux-newlib* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ + | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -os400*) + os=-os400 + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -syllable*) + os=-syllable + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -tpf*) + os=-tpf + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -aros*) + os=-aros + ;; + -kaos*) + os=-kaos + ;; + -zvmoe) + os=-zvmoe + ;; + -dicos*) + os=-dicos + ;; + -nacl*) + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + score-*) + os=-elf + ;; + spu-*) + os=-elf + ;; + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + c4x-* | tic4x-*) + os=-coff + ;; + tic54x-*) + os=-coff + ;; + tic55x-*) + os=-coff + ;; + tic6x-*) + os=-coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + # This also exists in the configure program, but was not the + # default. + # os=-sunos4 + ;; + m68*-cisco) + os=-aout + ;; + mep-*) + os=-elf + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-haiku) + os=-haiku + ;; + *-ibm) + os=-aix + ;; + *-knuth) + os=-mmixware + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -cnk*|-aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -os400*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -tpf*) + vendor=ibm + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/conftools/install-sh b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/conftools/install-sh new file mode 100755 index 00000000..e9de2384 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/conftools/install-sh @@ -0,0 +1,251 @@ +#!/bin/sh +# +# install - install a program, script, or datafile +# This comes from X11R5 (mit/util/scripts/install.sh). +# +# Copyright 1991 by the Massachusetts Institute of Technology +# +# Permission to use, copy, modify, distribute, and sell this software and its +# documentation for any purpose is hereby granted without fee, provided that +# the above copyright notice appear in all copies and that both that +# copyright notice and this permission notice appear in supporting +# documentation, and that the name of M.I.T. not be used in advertising or +# publicity pertaining to distribution of the software without specific, +# written prior permission. M.I.T. makes no representations about the +# suitability of this software for any purpose. It is provided "as is" +# without express or implied warranty. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# `make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. It can only install one file at a time, a restriction +# shared with many OS's install programs. + + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit="${DOITPROG-}" + + +# put in absolute paths if you don't have them in your path; or use env. vars. + +mvprog="${MVPROG-mv}" +cpprog="${CPPROG-cp}" +chmodprog="${CHMODPROG-chmod}" +chownprog="${CHOWNPROG-chown}" +chgrpprog="${CHGRPPROG-chgrp}" +stripprog="${STRIPPROG-strip}" +rmprog="${RMPROG-rm}" +mkdirprog="${MKDIRPROG-mkdir}" + +transformbasename="" +transform_arg="" +instcmd="$mvprog" +chmodcmd="$chmodprog 0755" +chowncmd="" +chgrpcmd="" +stripcmd="" +rmcmd="$rmprog -f" +mvcmd="$mvprog" +src="" +dst="" +dir_arg="" + +while [ x"$1" != x ]; do + case $1 in + -c) instcmd="$cpprog" + shift + continue;; + + -d) dir_arg=true + shift + continue;; + + -m) chmodcmd="$chmodprog $2" + shift + shift + continue;; + + -o) chowncmd="$chownprog $2" + shift + shift + continue;; + + -g) chgrpcmd="$chgrpprog $2" + shift + shift + continue;; + + -s) stripcmd="$stripprog" + shift + continue;; + + -t=*) transformarg=`echo $1 | sed 's/-t=//'` + shift + continue;; + + -b=*) transformbasename=`echo $1 | sed 's/-b=//'` + shift + continue;; + + *) if [ x"$src" = x ] + then + src=$1 + else + # this colon is to work around a 386BSD /bin/sh bug + : + dst=$1 + fi + shift + continue;; + esac +done + +if [ x"$src" = x ] +then + echo "install: no input file specified" + exit 1 +else + true +fi + +if [ x"$dir_arg" != x ]; then + dst=$src + src="" + + if [ -d $dst ]; then + instcmd=: + chmodcmd="" + else + instcmd=mkdir + fi +else + +# Waiting for this to be detected by the "$instcmd $src $dsttmp" command +# might cause directories to be created, which would be especially bad +# if $src (and thus $dsttmp) contains '*'. + + if [ -f $src -o -d $src ] + then + true + else + echo "install: $src does not exist" + exit 1 + fi + + if [ x"$dst" = x ] + then + echo "install: no destination specified" + exit 1 + else + true + fi + +# If destination is a directory, append the input filename; if your system +# does not like double slashes in filenames, you may need to add some logic + + if [ -d $dst ] + then + dst="$dst"/`basename $src` + else + true + fi +fi + +## this sed command emulates the dirname command +dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` + +# Make sure that the destination directory exists. +# this part is taken from Noah Friedman's mkinstalldirs script + +# Skip lots of stat calls in the usual case. +if [ ! -d "$dstdir" ]; then +defaultIFS=' +' +IFS="${IFS-${defaultIFS}}" + +oIFS="${IFS}" +# Some sh's can't handle IFS=/ for some reason. +IFS='%' +set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` +IFS="${oIFS}" + +pathcomp='' + +while [ $# -ne 0 ] ; do + pathcomp="${pathcomp}${1}" + shift + + if [ ! -d "${pathcomp}" ] ; + then + $mkdirprog "${pathcomp}" + else + true + fi + + pathcomp="${pathcomp}/" +done +fi + +if [ x"$dir_arg" != x ] +then + $doit $instcmd $dst && + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi +else + +# If we're going to rename the final executable, determine the name now. + + if [ x"$transformarg" = x ] + then + dstfile=`basename $dst` + else + dstfile=`basename $dst $transformbasename | + sed $transformarg`$transformbasename + fi + +# don't allow the sed command to completely eliminate the filename + + if [ x"$dstfile" = x ] + then + dstfile=`basename $dst` + else + true + fi + +# Make a temp file name in the proper directory. + + dsttmp=$dstdir/#inst.$$# + +# Move or copy the file name to the temp name + + $doit $instcmd $src $dsttmp && + + trap "rm -f ${dsttmp}" 0 && + +# and set any options; do chmod last to preserve setuid bits + +# If any of these fail, we abort the whole thing. If we want to +# ignore errors from any of these, just make sure not to ignore +# errors from the above "$doit $instcmd $src $dsttmp" command. + + if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && + if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && + if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && + if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && + +# Now rename the file to the real destination. + + $doit $rmcmd -f $dstdir/$dstfile && + $doit $mvcmd $dsttmp $dstdir/$dstfile + +fi && + + +exit 0 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/conftools/ltmain.sh b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/conftools/ltmain.sh new file mode 100644 index 00000000..2bcb8482 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/conftools/ltmain.sh @@ -0,0 +1,6956 @@ +# ltmain.sh - Provide generalized library-building support services. +# NOTE: Changing this file will not affect anything until you rerun configure. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, +# 2007, 2008 Free Software Foundation, Inc. +# Originally by Gordon Matzigkeit , 1996 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +basename="s,^.*/,,g" + +# 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 $basename` +modename="$progname" + +# Global variables: +EXIT_SUCCESS=0 +EXIT_FAILURE=1 + +PROGRAM=ltmain.sh +PACKAGE=libtool +VERSION=1.5.26 +TIMESTAMP=" (1.1220.2.493 2008/02/01 16:58:18)" + +# Be Bourne compatible (taken from Autoconf:_AS_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 + +# Check that we have a working $echo. +if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X$1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then + # Yippee, $echo works! + : +else + # Restart under the correct shell, and then maybe $echo will work. + exec $SHELL "$progpath" --no-reexec ${1+"$@"} +fi + +if test "X$1" = X--fallback-echo; then + # used as fallback echo + shift + cat <&2 + $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit $EXIT_FAILURE +fi + +# Global variables. +mode=$default_mode +nonopt= +prev= +prevopt= +run= +show="$echo" +show_help= +execute_dlfiles= +duplicate_deps=no +preserve_args= +lo2o="s/\\.lo\$/.${objext}/" +o2lo="s/\\.${objext}\$/.lo/" +extracted_archives= +extracted_serial=0 + +##################################### +# Shell function definitions: +# This seems to be the best place for them + +# func_mktempdir [string] +# Make a temporary directory that won't clash with other running +# libtool processes, and avoids race conditions if possible. If +# given, STRING is the basename for that directory. +func_mktempdir () +{ + my_template="${TMPDIR-/tmp}/${1-$progname}" + + if test "$run" = ":"; then + # Return a directory name, but don't create it in dry-run mode + my_tmpdir="${my_template}-$$" + else + + # If mktemp works, use that first and foremost + my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` + + if test ! -d "$my_tmpdir"; then + # Failing that, at least try and use $RANDOM to avoid a race + my_tmpdir="${my_template}-${RANDOM-0}$$" + + save_mktempdir_umask=`umask` + umask 0077 + $mkdir "$my_tmpdir" + umask $save_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$my_tmpdir" || { + $echo "cannot create temporary directory \`$my_tmpdir'" 1>&2 + exit $EXIT_FAILURE + } + fi + + $echo "X$my_tmpdir" | $Xsed +} + + +# 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. +func_win32_libid () +{ + 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 + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | \ + $EGREP -e 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then + win32_nmres=`eval $NM -f posix -A $1 | \ + $SED -n -e '1,100{ + / I /{ + s,.*,import, + p + q + } + }'` + 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_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 () +{ + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + CC_quoted="$CC_quoted $arg" + done + 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 "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) ;; + # 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. + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + CC_quoted="$CC_quoted $arg" + done + case "$@ " in + " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) + # 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 + $echo "$modename: unable to infer tagged configuration" + $echo "$modename: specify a tag with \`--tag'" 1>&2 + exit $EXIT_FAILURE +# else +# $echo "$modename: using $tagname tagged configuration" + fi + ;; + esac + fi +} + + +# func_extract_an_archive dir oldlib +func_extract_an_archive () +{ + f_ex_an_ar_dir="$1"; shift + f_ex_an_ar_oldlib="$1" + + $show "(cd $f_ex_an_ar_dir && $AR x $f_ex_an_ar_oldlib)" + $run eval "(cd \$f_ex_an_ar_dir && $AR x \$f_ex_an_ar_oldlib)" || exit $? + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then + : + else + $echo "$modename: ERROR: object name conflicts: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" 1>&2 + exit $EXIT_FAILURE + fi +} + +# func_extract_archives gentop oldlib ... +func_extract_archives () +{ + my_gentop="$1"; shift + my_oldlibs=${1+"$@"} + my_oldobjs="" + my_xlib="" + my_xabs="" + my_xdir="" + my_status="" + + $show "${rm}r $my_gentop" + $run ${rm}r "$my_gentop" + $show "$mkdir $my_gentop" + $run $mkdir "$my_gentop" + my_status=$? + if test "$my_status" -ne 0 && test ! -d "$my_gentop"; then + exit $my_status + fi + + 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 + my_xlib=`$echo "X$my_xlib" | $Xsed -e 's%^.*/%%'` + my_xlib_u=$my_xlib + while :; do + case " $extracted_archives " in + *" $my_xlib_u "*) + extracted_serial=`expr $extracted_serial + 1` + 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" + + $show "${rm}r $my_xdir" + $run ${rm}r "$my_xdir" + $show "$mkdir $my_xdir" + $run $mkdir "$my_xdir" + exit_status=$? + if test "$exit_status" -ne 0 && test ! -d "$my_xdir"; then + exit $exit_status + fi + case $host in + *-darwin*) + $show "Extracting $my_xabs" + # Do not bother doing anything if just a dry run + if test -z "$run"; then + darwin_orig_dir=`pwd` + cd $my_xdir || exit $? + darwin_archive=$my_xabs + darwin_curdir=`pwd` + darwin_base_archive=`$echo "X$darwin_archive" | $Xsed -e 's%^.*/%%'` + darwin_arches=`lipo -info "$darwin_archive" 2>/dev/null | $EGREP Architectures 2>/dev/null` + if test -n "$darwin_arches"; then + darwin_arches=`echo "$darwin_arches" | $SED -e 's/.*are://'` + darwin_arch= + $show "$darwin_base_archive has multiple architectures $darwin_arches" + for darwin_arch in $darwin_arches ; do + 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 have a bunch of thin objects, gotta fatten them up :) + darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print| xargs basename | sort -u | $NL2SP` + darwin_file= + darwin_files= + for darwin_file in $darwin_filelist; do + darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP` + lipo -create -output "$darwin_file" $darwin_files + done # $darwin_filelist + ${rm}r unfat-$$ + cd "$darwin_orig_dir" + else + cd "$darwin_orig_dir" + func_extract_an_archive "$my_xdir" "$my_xabs" + fi # $darwin_arches + fi # $run + ;; + *) + func_extract_an_archive "$my_xdir" "$my_xabs" + ;; + esac + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` + done + func_extract_archives_result="$my_oldobjs" +} +# End of Shell function definitions +##################################### + +# Darwin sucks +eval std_shrext=\"$shrext_cmds\" + +disable_libs=no + +# Parse our command line options once, thoroughly. +while test "$#" -gt 0 +do + arg="$1" + shift + + case $arg in + -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;; + *) optarg= ;; + esac + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + execute_dlfiles) + execute_dlfiles="$execute_dlfiles $arg" + ;; + tag) + tagname="$arg" + preserve_args="${preserve_args}=$arg" + + # Check whether tagname contains only valid characters + case $tagname in + *[!-_A-Za-z0-9,/]*) + $echo "$progname: invalid tag name: $tagname" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + case $tagname in + CC) + # Don't test for the "default" C tag, as we know, it's there, but + # not specially marked. + ;; + *) + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "$progpath" > /dev/null; then + taglist="$taglist $tagname" + # Evaluate the configuration. + eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$tagname'$/,/^# ### END LIBTOOL TAG CONFIG: '$tagname'$/p' < $progpath`" + else + $echo "$progname: ignoring unknown tag $tagname" 1>&2 + fi + ;; + esac + ;; + *) + eval "$prev=\$arg" + ;; + esac + + prev= + prevopt= + continue + fi + + # Have we seen a non-optional argument yet? + case $arg in + --help) + show_help=yes + ;; + + --version) + echo "\ +$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP + +Copyright (C) 2008 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." + exit $? + ;; + + --config) + ${SED} -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $progpath + # Now print the configurations for the tags. + for tagname in $taglist; do + ${SED} -n -e "/^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$/,/^# ### END LIBTOOL TAG CONFIG: $tagname$/p" < "$progpath" + done + exit $? + ;; + + --debug) + $echo "$progname: enabling shell trace mode" + set -x + preserve_args="$preserve_args $arg" + ;; + + --dry-run | -n) + run=: + ;; + + --features) + $echo "host: $host" + if test "$build_libtool_libs" = yes; then + $echo "enable shared libraries" + else + $echo "disable shared libraries" + fi + if test "$build_old_libs" = yes; then + $echo "enable static libraries" + else + $echo "disable static libraries" + fi + exit $? + ;; + + --finish) mode="finish" ;; + + --mode) prevopt="--mode" prev=mode ;; + --mode=*) mode="$optarg" ;; + + --preserve-dup-deps) duplicate_deps="yes" ;; + + --quiet | --silent) + show=: + preserve_args="$preserve_args $arg" + ;; + + --tag) + prevopt="--tag" + prev=tag + preserve_args="$preserve_args --tag" + ;; + --tag=*) + set tag "$optarg" ${1+"$@"} + shift + prev=tag + preserve_args="$preserve_args --tag" + ;; + + -dlopen) + prevopt="-dlopen" + prev=execute_dlfiles + ;; + + -*) + $echo "$modename: unrecognized option \`$arg'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + + *) + nonopt="$arg" + break + ;; + esac +done + +if test -n "$prevopt"; then + $echo "$modename: option \`$prevopt' requires an argument" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE +fi + +case $disable_libs in +no) + ;; +shared) + build_libtool_libs=no + build_old_libs=yes + ;; +static) + build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` + ;; +esac + +# 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= + +if test -z "$show_help"; then + + # Infer the operation mode. + if test -z "$mode"; then + $echo "*** Warning: inferring the mode of operation is deprecated." 1>&2 + $echo "*** Future versions of Libtool will require --mode=MODE be specified." 1>&2 + case $nonopt in + *cc | cc* | *++ | gcc* | *-gcc* | g++* | xlc*) + mode=link + for arg + do + case $arg in + -c) + mode=compile + break + ;; + esac + done + ;; + *db | *dbx | *strace | *truss) + mode=execute + ;; + *install*|cp|mv) + mode=install + ;; + *rm) + mode=uninstall + ;; + *) + # If we have no mode, but dlfiles were specified, then do execute mode. + test -n "$execute_dlfiles" && mode=execute + + # Just use the default operation mode. + if test -z "$mode"; then + if test -n "$nonopt"; then + $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2 + else + $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2 + fi + fi + ;; + esac + fi + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$execute_dlfiles" && test "$mode" != execute; then + $echo "$modename: unrecognized option \`-dlopen'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Change the help message to a mode-specific one. + generic_help="$help" + help="Try \`$modename --help --mode=$mode' for more information." + + # These modes are in order of execution frequency so that they run quickly. + case $mode in + # libtool compile mode + compile) + modename="$modename: compile" + # Get the compilation command and the source file. + base_compile= + srcfile="$nonopt" # always keep a non-empty value in "srcfile" + suppress_opt=yes + suppress_output= + arg_mode=normal + libobj= + later= + + 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) + if test -n "$libobj" ; then + $echo "$modename: you cannot specify \`-o' more than once" 1>&2 + exit $EXIT_FAILURE + fi + arg_mode=target + continue + ;; + + -static | -prefer-pic | -prefer-non-pic) + later="$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,*) + args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"` + lastarg= + save_ifs="$IFS"; IFS=',' + for arg in $args; do + IFS="$save_ifs" + + # Double-quote args containing other shell metacharacters. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + lastarg="$lastarg $arg" + done + IFS="$save_ifs" + lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"` + + # Add the arguments to base_compile. + base_compile="$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. + lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"` + + case $lastarg in + # Double-quote args containing other shell metacharacters. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, and some SunOS ksh mistreat backslash-escaping + # in scan sets (worked around with variable expansion), + # and furthermore cannot handle '|' '&' '(' ')' in scan sets + # at all, so we specify them separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + lastarg="\"$lastarg\"" + ;; + esac + + base_compile="$base_compile $lastarg" + done # for arg + + case $arg_mode in + arg) + $echo "$modename: you must specify an argument for -Xcompile" + exit $EXIT_FAILURE + ;; + target) + $echo "$modename: you must specify a target with \`-o'" 1>&2 + exit $EXIT_FAILURE + ;; + *) + # Get the name of the library object. + [ -z "$libobj" ] && libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'` + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + xform='[cCFSifmso]' + case $libobj in + *.ada) xform=ada ;; + *.adb) xform=adb ;; + *.ads) xform=ads ;; + *.asm) xform=asm ;; + *.c++) xform=c++ ;; + *.cc) xform=cc ;; + *.ii) xform=ii ;; + *.class) xform=class ;; + *.cpp) xform=cpp ;; + *.cxx) xform=cxx ;; + *.[fF][09]?) xform=[fF][09]. ;; + *.for) xform=for ;; + *.java) xform=java ;; + *.obj) xform=obj ;; + *.sx) xform=sx ;; + esac + + libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"` + + case $libobj in + *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;; + *) + $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + func_infer_tag $base_compile + + for arg in $later; do + case $arg in + -static) + build_old_libs=yes + continue + ;; + + -prefer-pic) + pic_mode=yes + continue + ;; + + -prefer-non-pic) + pic_mode=no + continue + ;; + esac + done + + qlibobj=`$echo "X$libobj" | $Xsed -e "$sed_quote_subst"` + case $qlibobj in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + qlibobj="\"$qlibobj\"" ;; + esac + test "X$libobj" != "X$qlibobj" \ + && $echo "X$libobj" | grep '[]~#^*{};<>?"'"'"' &()|`$[]' \ + && $echo "$modename: libobj name \`$libobj' may not contain shell special characters." + objname=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` + xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$obj"; then + xdir= + else + xdir=$xdir/ + fi + lobj=${xdir}$objdir/$objname + + if test -z "$base_compile"; then + $echo "$modename: you must specify a compilation command" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Delete any leftover library objects. + if test "$build_old_libs" = yes; then + removelist="$obj $lobj $libobj ${libobj}T" + else + removelist="$lobj $libobj ${libobj}T" + fi + + $run $rm $removelist + trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | pw32* | os2*) + pic_mode=default + ;; + esac + if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; 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 "$compiler_c_o" = no; then + output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext} + lockfile="$output_obj.lock" + removelist="$removelist $output_obj $lockfile" + trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 + 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 "$need_locks" = yes; then + until $run ln "$progpath" "$lockfile" 2>/dev/null; do + $show "Waiting for $lockfile to be removed" + sleep 2 + done + elif test "$need_locks" = warn; then + if test -f "$lockfile"; then + $echo "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit $EXIT_FAILURE + fi + $echo "$srcfile" > "$lockfile" + fi + + if test -n "$fix_srcfile_path"; then + eval srcfile=\"$fix_srcfile_path\" + fi + qsrcfile=`$echo "X$srcfile" | $Xsed -e "$sed_quote_subst"` + case $qsrcfile in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + qsrcfile="\"$qsrcfile\"" ;; + esac + + $run $rm "$libobj" "${libobj}T" + + # Create a libtool object file (analogous to a ".la" file), + # but don't create it if we're doing a dry run. + test -z "$run" && cat > ${libobj}T </dev/null`" != "X$srcfile"; then + $echo "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit $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 + $show "$mv $output_obj $lobj" + if $run $mv $output_obj $lobj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + fi + + # Append the name of the PIC object to the libtool object file. + test -z "$run" && cat >> ${libobj}T <> ${libobj}T </dev/null`" != "X$srcfile"; then + $echo "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then + $show "$mv $output_obj $obj" + if $run $mv $output_obj $obj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + fi + + # Append the name of the non-PIC object the libtool object file. + # Only append if the libtool object file exists. + test -z "$run" && cat >> ${libobj}T <> ${libobj}T <&2 + 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 + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + qarg=\"`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`\" ### testsuite: skip nested quoting test + ;; + *) qarg=$arg ;; + esac + libtool_args="$libtool_args $qarg" + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + output) + compile_command="$compile_command @OUTPUT@" + finalize_command="$finalize_command @OUTPUT@" + ;; + esac + + case $prev in + dlfiles|dlprefiles) + if test "$preload" = no; then + # Add the symbol object into the linking commands. + compile_command="$compile_command @SYMFILE@" + finalize_command="$finalize_command @SYMFILE@" + preload=yes + fi + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test "$dlself" = no; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test "$prev" = dlprefiles; then + dlself=yes + elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test "$prev" = dlfiles; then + dlfiles="$dlfiles $arg" + else + dlprefiles="$dlprefiles $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols="$arg" + if test ! -f "$arg"; then + $echo "$modename: symbol file \`$arg' does not exist" + exit $EXIT_FAILURE + fi + prev= + continue + ;; + expsyms_regex) + export_symbols_regex="$arg" + prev= + continue + ;; + inst_prefix) + inst_prefix_dir="$arg" + prev= + continue + ;; + precious_regex) + precious_files_regex="$arg" + prev= + continue + ;; + release) + release="-$arg" + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat $save_arg` + do +# moreargs="$moreargs $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + pic_object= + non_pic_object= + + # Read the .lo file + # If there is no directory component, then add one. + case $arg in + */* | *\\*) . $arg ;; + *) . ./$arg ;; + esac + + if test -z "$pic_object" || \ + test -z "$non_pic_object" || + test "$pic_object" = none && \ + test "$non_pic_object" = none; then + $echo "$modename: cannot find name of object for \`$arg'" 1>&2 + exit $EXIT_FAILURE + fi + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles="$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 "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles $pic_object" + prev= + fi + + # A PIC object. + libobjs="$libobjs $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + non_pic_objects="$non_pic_objects $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; 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" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if test -z "$run"; then + $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 + exit $EXIT_FAILURE + else + # Dry-run case. + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` + non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` + libobjs="$libobjs $pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + fi + done + else + $echo "$modename: link input file \`$save_arg' does not exist" + exit $EXIT_FAILURE + fi + arg=$save_arg + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + $echo "$modename: only absolute run-paths are allowed" 1>&2 + exit $EXIT_FAILURE + ;; + esac + if test "$prev" = rpath; then + case "$rpath " in + *" $arg "*) ;; + *) rpath="$rpath $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) xrpath="$xrpath $arg" ;; + esac + fi + prev= + continue + ;; + xcompiler) + compiler_flags="$compiler_flags $qarg" + prev= + compile_command="$compile_command $qarg" + finalize_command="$finalize_command $qarg" + continue + ;; + xlinker) + linker_flags="$linker_flags $qarg" + compiler_flags="$compiler_flags $wl$qarg" + prev= + compile_command="$compile_command $wl$qarg" + finalize_command="$finalize_command $wl$qarg" + continue + ;; + xcclinker) + linker_flags="$linker_flags $qarg" + compiler_flags="$compiler_flags $qarg" + prev= + compile_command="$compile_command $qarg" + finalize_command="$finalize_command $qarg" + continue + ;; + shrext) + shrext_cmds="$arg" + prev= + continue + ;; + darwin_framework|darwin_framework_skip) + test "$prev" = "darwin_framework" && compiler_flags="$compiler_flags $arg" + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + prev= + 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 + compile_command="$compile_command $link_static_flag" + finalize_command="$finalize_command $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + $echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2 + continue + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + $echo "$modename: more than one -exported-symbols argument is not allowed" + exit $EXIT_FAILURE + fi + if test "X$arg" = "X-export-symbols"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -framework|-arch|-isysroot) + case " $CC " in + *" ${arg} ${1} "* | *" ${arg} ${1} "*) + prev=darwin_framework_skip ;; + *) compiler_flags="$compiler_flags $arg" + prev=darwin_framework ;; + esac + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + 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*) + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + ;; + esac + continue + ;; + + -L*) + dir=`$echo "X$arg" | $Xsed -e 's/^-L//'` + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2 + absdir="$dir" + notinst_path="$notinst_path $dir" + fi + dir="$absdir" + ;; + esac + case "$deplibs " in + *" -L$dir "*) ;; + *) + deplibs="$deplibs -L$dir" + lib_search_path="$lib_search_path $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) + testbindir=`$echo "X$dir" | $Xsed -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + *) dllsearchpath="$dllsearchpath:$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + *) dllsearchpath="$dllsearchpath:$testbindir";; + esac + ;; + esac + continue + ;; + + -l*) + if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos*) + # 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$arg" = "X-lc" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + test "X$arg" = "X-lc" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + deplibs="$deplibs -framework System" + continue + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + test "X$arg" = "X-lc" && continue + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + test "X$arg" = "X-lc" && continue + ;; + esac + elif test "X$arg" = "X-lc_r"; then + case $host in + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + deplibs="$deplibs $arg" + continue + ;; + + # Tru64 UNIX uses -model [arg] to determine the layout of C++ + # classes, name mangling, and exception handling. + -model) + compile_command="$compile_command $arg" + compiler_flags="$compiler_flags $arg" + finalize_command="$finalize_command $arg" + prev=xcompiler + continue + ;; + + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) + compiler_flags="$compiler_flags $arg" + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + continue + ;; + + -multi_module) + single_module="${wl}-multi_module" + continue + ;; + + -module) + module=yes + continue + ;; + + # -64, -mips[0-9] enable 64-bit mode on the SGI compiler + # -r[0-9][0-9]* specifies the processor on the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler + # +DA*, +DD* enable 64-bit mode on the HP compiler + # -q* pass through compiler args for the IBM compiler + # -m* pass through architecture-specific compiler args for GCC + # -m*, -t[45]*, -txscale* pass through architecture-specific + # compiler args for GCC + # -p, -pg, --coverage, -fprofile-* pass through profiling flag for GCC + # -F/path gives path to uninstalled frameworks, gcc on darwin + # @file GCC response files + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*) + + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + compiler_flags="$compiler_flags $arg" + continue + ;; + + -shrext) + prev=shrext + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin*) + # The PATH hackery in wrapper scripts is required on Windows + # and Darwin in order for the loader to find any dlls it needs. + $echo "$modename: warning: \`-no-install' is ignored for $host" 1>&2 + $echo "$modename: warning: assuming \`-no-fast-install' instead" 1>&2 + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -objectlist) + prev=objectlist + continue + ;; + + -o) prev=output ;; + + -precious-files-regex) + prev=precious_regex + continue + ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + dir=`$echo "X$arg" | $Xsed -e 's/^-R//'` + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + $echo "$modename: only absolute run-paths are allowed" 1>&2 + exit $EXIT_FAILURE + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$xrpath $dir" ;; + esac + 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 + ;; + + -Wc,*) + args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'` + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + case $flag in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + flag="\"$flag\"" + ;; + esac + arg="$arg $wl$flag" + compiler_flags="$compiler_flags $flag" + done + IFS="$save_ifs" + arg=`$echo "X$arg" | $Xsed -e "s/^ //"` + ;; + + -Wl,*) + args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'` + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + case $flag in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + flag="\"$flag\"" + ;; + esac + arg="$arg $wl$flag" + compiler_flags="$compiler_flags $wl$flag" + linker_flags="$linker_flags $flag" + done + IFS="$save_ifs" + arg=`$echo "X$arg" | $Xsed -e "s/^ //"` + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + continue + ;; + + # Some other compiler flag. + -* | +*) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + ;; + + *.$objext) + # A standard object. + objs="$objs $arg" + ;; + + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + pic_object= + non_pic_object= + + # Read the .lo file + # If there is no directory component, then add one. + case $arg in + */* | *\\*) . $arg ;; + *) . ./$arg ;; + esac + + if test -z "$pic_object" || \ + test -z "$non_pic_object" || + test "$pic_object" = none && \ + test "$non_pic_object" = none; then + $echo "$modename: cannot find name of object for \`$arg'" 1>&2 + exit $EXIT_FAILURE + fi + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles="$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 "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles $pic_object" + prev= + fi + + # A PIC object. + libobjs="$libobjs $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + non_pic_objects="$non_pic_objects $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; 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" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if test -z "$run"; then + $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 + exit $EXIT_FAILURE + else + # Dry-run case. + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` + non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` + libobjs="$libobjs $pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + fi + ;; + + *.$libext) + # An archive. + deplibs="$deplibs $arg" + old_deplibs="$old_deplibs $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + if test "$prev" = dlfiles; then + # This library was specified with -dlopen. + dlfiles="$dlfiles $arg" + prev= + elif test "$prev" = dlprefiles; then + # The library was specified with -dlpreopen. + dlprefiles="$dlprefiles $arg" + prev= + else + deplibs="$deplibs $arg" + 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. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + ;; + esac # arg + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + fi + done # argument parsing loop + + if test -n "$prev"; then + $echo "$modename: the \`$prevarg' option requires an argument" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'` + libobjs_save="$libobjs" + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$echo \"X\${$shlibpath_var}\" \| \$Xsed -e \'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\" + + output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'` + if test "X$output_objdir" = "X$output"; then + output_objdir="$objdir" + else + output_objdir="$output_objdir/$objdir" + fi + # Create the object directory. + if test ! -d "$output_objdir"; then + $show "$mkdir $output_objdir" + $run $mkdir $output_objdir + exit_status=$? + if test "$exit_status" -ne 0 && test ! -d "$output_objdir"; then + exit $exit_status + fi + fi + + # Determine the type of output + case $output in + "") + $echo "$modename: you must specify an output file" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + esac + + case $host in + *cygwin* | *mingw* | *pw32*) + # don't eliminate duplications in $postdeps and $predeps + duplicate_compiler_generated_deps=yes + ;; + *) + duplicate_compiler_generated_deps=$duplicate_deps + ;; + 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 test "X$duplicate_deps" = "Xyes" ; then + case "$libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + libs="$libs $deplib" + done + + if test "$linkmode" = lib; 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 test "X$duplicate_compiler_generated_deps" = "Xyes" ; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;; + esac + pre_post_deps="$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 + case $linkmode in + lib) + passes="conv link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + $echo "$modename: libraries can \`-dlopen' only libtool libraries: $file" 1>&2 + exit $EXIT_FAILURE + ;; + esac + done + ;; + prog) + compile_deplibs= + finalize_deplibs= + alldeplibs=no + newdlfiles= + newdlprefiles= + passes="conv scan dlopen dlpreopen link" + ;; + *) passes="conv" + ;; + esac + for pass in $passes; do + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan"; then + libs="$deplibs" + deplibs= + fi + if test "$linkmode" = prog; then + case $pass in + dlopen) libs="$dlfiles" ;; + dlpreopen) libs="$dlprefiles" ;; + link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; + esac + fi + if test "$pass" = dlopen; then + # Collect dlpreopened libraries + save_deplibs="$deplibs" + deplibs= + fi + for deplib in $libs; do + lib= + found=no + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + compiler_flags="$compiler_flags $deplib" + fi + continue + ;; + -l*) + if test "$linkmode" != lib && test "$linkmode" != prog; then + $echo "$modename: warning: \`-l' is ignored for archives/objects" 1>&2 + continue + fi + name=`$echo "X$deplib" | $Xsed -e 's/^-l//'` + if test "$linkmode" = lib; 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 "$search_ext" = ".la"; then + found=yes + else + found=no + fi + break 2 + fi + done + done + if test "$found" != yes; then + # deplib doesn't seem to be a libtool library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + else # 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 "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $deplib "*) + if (${SED} -e '2q' $lib | + grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + library_names= + old_library= + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + for l in $old_library $library_names; do + ll="$l" + done + if test "X$ll" = "X$old_library" ; then # only static version available + found=no + ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` + test "X$ladir" = "X$lib" && ladir="." + lib=$ladir/$old_library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + fi + ;; # -l + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test "$pass" = conv && continue + newdependency_libs="$deplib $newdependency_libs" + newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` + ;; + prog) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + if test "$pass" = scan; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` + ;; + *) + $echo "$modename: warning: \`-L' is ignored for archives/objects" 1>&2 + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test "$pass" = link; then + dir=`$echo "X$deplib" | $Xsed -e 's/^-R//'` + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$xrpath $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) lib="$deplib" ;; + *.$libext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + valid_a_lib=no + case $deplibs_check_method in + match_pattern*) + set dummy $deplibs_check_method + match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` + if eval $echo \"$deplib\" 2>/dev/null \ + | $SED 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + valid_a_lib=yes + fi + ;; + pass_all) + valid_a_lib=yes + ;; + esac + if test "$valid_a_lib" != yes; then + $echo + $echo "*** Warning: Trying to link with static lib archive $deplib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because the file extensions .$libext of this argument makes me believe" + $echo "*** that it is just a static archive that I should not used here." + else + $echo + $echo "*** Warning: Linking the shared library $output against the" + $echo "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + fi + continue + ;; + prog) + if test "$pass" != link; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + elif test "$linkmode" = prog; then + if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + newdlprefiles="$newdlprefiles $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + newdlfiles="$newdlfiles $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=yes + continue + ;; + esac # case $deplib + if test "$found" = yes || test -f "$lib"; then : + else + $echo "$modename: cannot find the library \`$lib' or unhandled argument \`$deplib'" 1>&2 + exit $EXIT_FAILURE + fi + + # Check to see that this really is a libtool archive. + if (${SED} -e '2q' $lib | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + + ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` + test "X$ladir" = "X$lib" && ladir="." + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= + # 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 + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan" || + { test "$linkmode" != prog && test "$linkmode" != lib; }; then + test -n "$dlopen" && dlfiles="$dlfiles $dlopen" + test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen" + fi + + if test "$pass" = conv; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + # It is a libtool convenience library, so add in its objects. + convenience="$convenience $ladir/$objdir/$old_library" + old_convenience="$old_convenience $ladir/$objdir/$old_library" + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if test "X$duplicate_deps" = "Xyes" ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done + elif test "$linkmode" != prog && test "$linkmode" != lib; then + $echo "$modename: \`$lib' is not a convenience library" 1>&2 + exit $EXIT_FAILURE + fi + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + for l in $old_library $library_names; do + linklib="$l" + done + if test -z "$linklib"; then + $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + + # This library was specified with -dlopen. + if test "$pass" = dlopen; then + if test -z "$libdir"; then + $echo "$modename: cannot -dlopen a convenience library: \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + if test -z "$dlname" || + test "$dlopen_support" != yes || + test "$build_libtool_libs" = no; 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. + dlprefiles="$dlprefiles $lib $dependency_libs" + else + newdlfiles="$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 + $echo "$modename: warning: cannot determine absolute directory name of \`$ladir'" 1>&2 + $echo "$modename: passing it literally to the linker, although it might fail" 1>&2 + abs_ladir="$ladir" + fi + ;; + esac + laname=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` + + # Find the relevant object directory and library name. + if test "X$installed" = Xyes; then + if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + $echo "$modename: warning: library \`$lib' was moved." 1>&2 + dir="$ladir" + absdir="$abs_ladir" + libdir="$abs_ladir" + else + dir="$libdir" + absdir="$libdir" + fi + test "X$hardcode_automatic" = Xyes && 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 + notinst_path="$notinst_path $abs_ladir" + else + dir="$ladir/$objdir" + absdir="$abs_ladir/$objdir" + # Remove this search path later + notinst_path="$notinst_path $abs_ladir" + fi + fi # $installed = yes + name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` + + # This library was specified with -dlpreopen. + if test "$pass" = dlpreopen; then + if test -z "$libdir"; then + $echo "$modename: cannot -dlpreopen a convenience library: \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + newdlprefiles="$newdlprefiles $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + newdlprefiles="$newdlprefiles $dir/$dlname" + else + newdlprefiles="$newdlprefiles $dir/$linklib" + fi + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test "$linkmode" = lib; then + deplibs="$dir/$old_library $deplibs" + elif test "$linkmode,$pass" = "prog,link"; 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 "$linkmode" = prog && test "$pass" != link; then + newlib_search_path="$newlib_search_path $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=no + if test "$link_all_deplibs" != no || test -z "$library_names" || + test "$build_libtool_libs" = no; then + linkalldeplibs=yes + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test + esac + # Need to link against all dependency_libs? + if test "$linkalldeplibs" = yes; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi + if test "X$duplicate_deps" = "Xyes" ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test "$linkmode,$pass" = "prog,link"; then + if test -n "$library_names" && + { { test "$prefer_static_libs" = no || + test "$prefer_static_libs,$installed" = "built,yes"; } || + 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 + *" $dir "*) ;; + *" $absdir "*) ;; + *) temp_rpath="$temp_rpath $absdir" ;; + 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 "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if test "$alldeplibs" = yes && + { test "$deplibs_check_method" = pass_all || + { test "$build_libtool_libs" = yes && + 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 "$use_static_libs" = built && test "$installed" = yes ; then + use_static_libs=no + fi + if test -n "$library_names" && + { test "$use_static_libs" = no || test -z "$old_library"; }; then + if test "$installed" = no; then + notinst_deplibs="$notinst_deplibs $lib" + need_relink=yes + fi + # This is a shared library + + # Warn about portability, can't link against -module's on + # some systems (darwin) + if test "$shouldnotlink" = yes && test "$pass" = link ; then + $echo + if test "$linkmode" = prog; then + $echo "*** Warning: Linking the executable $output against the loadable module" + else + $echo "*** Warning: Linking the shared library $output against the loadable module" + fi + $echo "*** $linklib is not portable!" + fi + if test "$linkmode" = lib && + test "$hardcode_into_libs" = yes; 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 "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + realname="$2" + shift; 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 in + *cygwin* | mingw*) + major=`expr $current - $age` + versuffix="-$major" + ;; + esac + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot="$soname" + soname=`$echo $soroot | ${SED} -e 's/^.*\///'` + newlib="libimp-`$echo $soname | ${SED} 's/^lib//;s/\.dll$//'`.a" + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + $show "extracting exported symbol list from \`$soname'" + save_ifs="$IFS"; IFS='~' + cmds=$extract_expsyms_cmds + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + $show "generating import library for \`$soname'" + save_ifs="$IFS"; IFS='~' + cmds=$old_archive_from_expsyms_cmds + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + 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 "$linkmode" = prog || test "$mode" != relink; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test "$hardcode_direct" = no; 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 module then we can not link against + # it, someone is ignoring the new warnings I added + if /usr/bin/file -L $add 2> /dev/null | + $EGREP ": [^:]* bundle" >/dev/null ; then + $echo "** Warning, lib $linklib is a module, not a shared library" + if test -z "$old_library" ; then + $echo + $echo "** And there doesn't seem to be a static archive available" + $echo "** The link will probably fail, sorry" + else + add="$dir/$old_library" + fi + fi + esac + elif test "$hardcode_minus_L" = no; then + case $host in + *-*-sunos*) add_shlibpath="$dir" ;; + esac + add_dir="-L$dir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = no; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + relink) + if test "$hardcode_direct" = yes; then + add="$dir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$dir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + add_dir="$add_dir -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test "$lib_linked" != yes; then + $echo "$modename: configuration error: unsupported hardcode properties" + exit $EXIT_FAILURE + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;; + esac + fi + if test "$linkmode" = prog; 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 "$hardcode_direct" != yes && \ + test "$hardcode_minus_L" != yes && \ + test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; + esac + fi + fi + fi + + if test "$linkmode" = prog || test "$mode" = relink; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test "$hardcode_direct" = yes; then + add="$libdir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$libdir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; + esac + add="-l$name" + elif test "$hardcode_automatic" = yes; 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$libdir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + add_dir="$add_dir -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + fi + + if test "$linkmode" = prog; 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 "$linkmode" = prog; 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 "$hardcode_direct" != unsupported; 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 "$build_libtool_libs" = yes; then + # Not a shared library + if test "$deplibs_check_method" != pass_all; 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. + $echo + $echo "*** Warning: This system can not link to static lib archive $lib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have." + if test "$module" = yes; then + $echo "*** But as you try to build a module library, libtool will still create " + $echo "*** a static module, that should work as long as the dlopening application" + $echo "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then + $echo + $echo "*** However, this would only work if libtool was able to extract symbol" + $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + $echo "*** not find such a program. So, this module is probably useless." + $echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + 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 "$linkmode" = lib; then + if test -n "$dependency_libs" && + { test "$hardcode_into_libs" != yes || + test "$build_old_libs" = yes || + test "$link_static" = yes; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) temp_xrpath=`$echo "X$libdir" | $Xsed -e 's/^-R//'` + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) xrpath="$xrpath $temp_xrpath";; + esac;; + *) temp_deplibs="$temp_deplibs $libdir";; + esac + done + dependency_libs="$temp_deplibs" + fi + + newlib_search_path="$newlib_search_path $absdir" + # Link against this library + test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + if test "X$duplicate_deps" = "Xyes" ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done + + if test "$link_all_deplibs" != no; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + case $deplib in + -L*) path="$deplib" ;; + *.la) + dir=`$echo "X$deplib" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$deplib" && dir="." + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2 + absdir="$dir" + fi + ;; + esac + if grep "^installed=no" $deplib > /dev/null; then + path="$absdir/$objdir" + else + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + if test -z "$libdir"; then + $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + if test "$absdir" != "$libdir"; then + $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2 + fi + path="$absdir" + fi + depdepl= + case $host in + *-*-darwin*) + # we do not want to link against static libs, + # but need to link against shared + eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + eval deplibdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names" ; then + for tmp in $deplibrary_names ; do + depdepl=$tmp + done + if test -f "$deplibdir/$depdepl" ; then + depdepl="$deplibdir/$depdepl" + elif test -f "$path/$depdepl" ; then + depdepl="$path/$depdepl" + else + # Can't find it, oh well... + depdepl= + fi + # do not add paths which are already there + case " $newlib_search_path " in + *" $path "*) ;; + *) newlib_search_path="$newlib_search_path $path";; + esac + fi + path="" + ;; + *) + path="-L$path" + ;; + esac + ;; + -l*) + case $host in + *-*-darwin*) + # Again, we only want to link against shared libraries + eval tmp_libs=`$echo "X$deplib" | $Xsed -e "s,^\-l,,"` + for tmp in $newlib_search_path ; do + if test -f "$tmp/lib$tmp_libs.dylib" ; then + eval depdepl="$tmp/lib$tmp_libs.dylib" + break + fi + done + path="" + ;; + *) continue ;; + esac + ;; + *) continue ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$path $deplibs" ;; + esac + case " $deplibs " in + *" $depdepl "*) ;; + *) deplibs="$depdepl $deplibs" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + dependency_libs="$newdependency_libs" + if test "$pass" = dlpreopen; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test "$pass" != dlopen; then + if test "$pass" != conv; then + # 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 "*) ;; + *) lib_search_path="$lib_search_path $dir" ;; + esac + done + newlib_search_path= + fi + + if test "$linkmode,$pass" != "prog,link"; then + vars="deplibs" + else + vars="compile_deplibs finalize_deplibs" + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # 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. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) tmp_libs="$tmp_libs $deplib" ;; + esac + ;; + *) tmp_libs="$tmp_libs $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + # 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 + tmp_libs="$tmp_libs $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test "$linkmode" = prog; then + dlfiles="$newdlfiles" + dlprefiles="$newdlprefiles" + fi + + case $linkmode in + oldlib) + case " $deplibs" in + *\ -l* | *\ -L*) + $echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2 ;; + esac + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2 + fi + + if test -n "$rpath"; then + $echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2 + fi + + if test -n "$xrpath"; then + $echo "$modename: warning: \`-R' is ignored for archives" 1>&2 + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info/-version-number' is ignored for archives" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for archives" 1>&2 + fi + + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + $echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2 + fi + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs="$output" + objs="$objs$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form `libNAME.la'. + case $outputname in + lib*) + name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + ;; + *) + if test "$module" = no; then + $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + if test "$need_lib_prefix" != no; then + # Add the "lib" prefix for modules if required + name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + else + libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` + fi + ;; + esac + + if test -n "$objs"; then + if test "$deplibs_check_method" != pass_all; then + $echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1 + exit $EXIT_FAILURE + else + $echo + $echo "*** Warning: Linking the shared library $output against the non-libtool" + $echo "*** objects $objs is not portable!" + libobjs="$libobjs $objs" + fi + fi + + if test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen self' is ignored for libtool libraries" 1>&2 + fi + + set dummy $rpath + if test "$#" -gt 2; then + $echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2 + fi + install_libdir="$2" + + oldlibs= + if test -z "$rpath"; then + if test "$build_libtool_libs" = yes; then + # Building a libtool convenience library. + # 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 + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info/-version-number' is ignored for convenience libraries" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2 + fi + else + + # Parse the version information argument. + save_ifs="$IFS"; IFS=':' + set dummy $vinfo 0 0 0 + IFS="$save_ifs" + + if test -n "$8"; then + $echo "$modename: too many parameters to \`-version-info'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # 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="$2" + number_minor="$3" + number_revision="$4" + # + # 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 + # which has an extra 1 added just for fun + # + case $version_type in + darwin|linux|osf|windows|none) + current=`expr $number_major + $number_minor` + age="$number_minor" + revision="$number_revision" + ;; + freebsd-aout|freebsd-elf|sunos) + current="$number_major" + revision="$number_minor" + age="0" + ;; + irix|nonstopux) + current=`expr $number_major + $number_minor` + age="$number_minor" + revision="$number_minor" + lt_irix_increment=no + ;; + esac + ;; + no) + current="$2" + revision="$3" + age="$4" + ;; + 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]) ;; + *) + $echo "$modename: CURRENT \`$current' must be a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + ;; + 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]) ;; + *) + $echo "$modename: REVISION \`$revision' must be a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + ;; + 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]) ;; + *) + $echo "$modename: AGE \`$age' must be a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + if test "$age" -gt "$current"; then + $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + 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 + major=.`expr $current - $age` + versuffix="$major.$age.$revision" + # Darwin ld doesn't like 0 for these options... + minor_current=`expr $current + 1` + xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + + freebsd-aout) + major=".$current" + versuffix=".$current.$revision"; + ;; + + freebsd-elf) + major=".$current" + versuffix=".$current"; + ;; + + irix | nonstopux) + if test "X$lt_irix_increment" = "Xno"; then + major=`expr $current - $age` + else + major=`expr $current - $age + 1` + fi + 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 "$loop" -ne 0; do + iface=`expr $revision - $loop` + loop=`expr $loop - 1` + verstring="$verstring_prefix$major.$iface:$verstring" + done + + # Before this point, $major must not contain `.'. + major=.$major + versuffix="$major.$revision" + ;; + + linux) + major=.`expr $current - $age` + versuffix="$major.$age.$revision" + ;; + + osf) + major=.`expr $current - $age` + versuffix=".$current.$age.$revision" + verstring="$current.$age.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$age + while test "$loop" -ne 0; do + iface=`expr $current - $loop` + loop=`expr $loop - 1` + verstring="$verstring:${iface}.0" + done + + # Make executables depend on our current version. + verstring="$verstring:${current}.0" + ;; + + sunos) + major=".$current" + versuffix=".$current.$revision" + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 filesystems. + major=`expr $current - $age` + versuffix="-$major" + ;; + + *) + $echo "$modename: unknown library version type \`$version_type'" 1>&2 + $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit $EXIT_FAILURE + ;; + 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 "$need_version" = no; then + versuffix= + else + versuffix=".0.0" + fi + fi + + # Remove version info from name if versioning should be avoided + if test "$avoid_version" = yes && test "$need_version" = no; then + major= + versuffix= + verstring="" + fi + + # Check to see if the archive will have undefined symbols. + if test "$allow_undefined" = yes; then + if test "$allow_undefined_flag" = unsupported; then + $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2 + build_libtool_libs=no + build_old_libs=yes + fi + else + # Don't allow undefined symbols. + allow_undefined_flag="$no_undefined_flag" + fi + fi + + if test "$mode" != relink; 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) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) + if test "X$precious_files_regex" != "X"; then + if echo $p | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + removelist="$removelist $p" + ;; + *) ;; + esac + done + if test -n "$removelist"; then + $show "${rm}r $removelist" + $run ${rm}r $removelist + fi + fi + + # Now set the variables for building old libraries. + if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then + oldlibs="$oldlibs $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + #for path in $notinst_path; do + # lib_search_path=`$echo "$lib_search_path " | ${SED} -e "s% $path % %g"` + # deplibs=`$echo "$deplibs " | ${SED} -e "s% -L$path % %g"` + # dependency_libs=`$echo "$dependency_libs " | ${SED} -e "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 + temp_xrpath="$temp_xrpath -R$libdir" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; 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 "*) ;; + *) dlfiles="$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 "*) ;; + *) dlprefiles="$dlprefiles $lib" ;; + esac + done + + if test "$build_libtool_libs" = yes; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + deplibs="$deplibs -framework System" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # 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 "$build_libtool_need_lc" = "yes"; then + deplibs="$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 + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $rm conftest.c + cat > conftest.c </dev/null` + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null \ + | grep " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib="$potent_lib" + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; + *) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \ + | ${SED} 10q \ + | $EGREP "$file_magic_regex" > /dev/null; then + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + $echo + $echo "*** Warning: linker path does not have real file for library $a_deplib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $echo "*** with $libname but no candidates were found. (...for file magic test)" + else + $echo "*** with $libname and none of the candidates passed a file format test" + $echo "*** using a file magic. Last file checked: $potlib" + fi + fi + else + # Add a -L argument. + newdeplibs="$newdeplibs $a_deplib" + fi + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method + match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` + for a_deplib in $deplibs; do + name=`expr $a_deplib : '-l\(.*\)'` + # If $name is empty we are operating on a -L argument. + if test -n "$name" && test "$name" != "0"; then + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $a_deplib "*) + newdeplibs="$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 + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + $echo + $echo "*** Warning: linker path does not have real file for library $a_deplib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $echo "*** with $libname but no candidates were found. (...for regex pattern test)" + else + $echo "*** with $libname and none of the candidates passed a file format test" + $echo "*** using a regex pattern. Last file checked: $potlib" + fi + fi + else + # Add a -L argument. + newdeplibs="$newdeplibs $a_deplib" + fi + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs="" + tmp_deplibs=`$echo "X $deplibs" | $Xsed -e 's/ -lc$//' \ + -e 's/ -[LR][^ ]*//g'` + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + for i in $predeps $postdeps ; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$echo "X $tmp_deplibs" | ${SED} -e "1s,^X,," -e "s,$i,,"` + done + fi + if $echo "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' \ + | grep . >/dev/null; then + $echo + if test "X$deplibs_check_method" = "Xnone"; then + $echo "*** Warning: inter-library dependencies are not supported in this platform." + else + $echo "*** Warning: inter-library dependencies are not known to be supported." + fi + $echo "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + fi + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + newdeplibs=`$echo "X $newdeplibs" | $Xsed -e 's/ -lc / -framework System /'` + ;; + esac + + if test "$droppeddeps" = yes; then + if test "$module" = yes; then + $echo + $echo "*** Warning: libtool could not satisfy all declared inter-library" + $echo "*** dependencies of module $libname. Therefore, libtool will create" + $echo "*** a static module, that should work as long as the dlopening" + $echo "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + $echo + $echo "*** However, this would only work if libtool was able to extract symbol" + $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + $echo "*** not find such a program. So, this module is probably useless." + $echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + $echo "*** The inter-library dependencies that have been dropped here will be" + $echo "*** automatically added whenever a program is linked with this library" + $echo "*** or is declared to -dlopen it." + + if test "$allow_undefined" = no; 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 "$build_old_libs" = no; 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 + + + # 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 "*) + new_libs="$new_libs -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$new_libs $deplib" ;; + esac + ;; + *) new_libs="$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 "$build_libtool_libs" = yes; then + if test "$hardcode_into_libs" = yes; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath="$finalize_rpath" + test "$mode" != relink && rpath="$compile_rpath$rpath" + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + dep_rpath="$dep_rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + if test -n "$hardcode_libdir_flag_spec_ld"; then + case $archive_cmds in + *\$LD*) eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" ;; + *) eval dep_rpath=\"$hardcode_libdir_flag_spec\" ;; + esac + else + eval dep_rpath=\"$hardcode_libdir_flag_spec\" + fi + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath="$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 "$mode" != relink && 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 + realname="$2" + shift; 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 + linknames="$linknames $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then + $show "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $run $rm $export_symbols + cmds=$export_symbols_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + if len=`expr "X$cmd" : ".*"` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then + $show "$cmd" + $run eval "$cmd" || exit $? + skipped_export=false + else + # The command line is too long to execute in one step. + $show "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"; then + $show "$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"" + $run eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + $show "$mv \"${export_symbols}T\" \"$export_symbols\"" + $run eval '$mv "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"' + fi + + tmp_deplibs= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + tmp_deplibs="$tmp_deplibs $test_deplib" + ;; + esac + done + deplibs="$tmp_deplibs" + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + else + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + func_extract_archives $gentop $convenience + libobjs="$libobjs $func_extract_archives_result" + fi + fi + + if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + linker_flags="$linker_flags $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test "$mode" = relink; then + $run eval '(cd $output_objdir && $rm ${realname}U && $mv $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test "$module" = yes && 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 "X$skipped_export" != "X:" && + len=`expr "X$test_cmds" : ".*" 2>/dev/null` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # The command line is too long to link in one step, link piecewise. + $echo "creating reloadable object files..." + + # 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 + output_la=`$echo "X$output" | $Xsed -e "$basename"` + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + delfiles= + last_robj= + k=1 + output=$output_objdir/$output_la-${k}.$objext + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + eval test_cmds=\"$reload_cmds $objlist $last_robj\" + if test "X$objlist" = X || + { len=`expr "X$test_cmds" : ".*" 2>/dev/null` && + test "$len" -le "$max_cmd_len"; }; then + objlist="$objlist $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test "$k" -eq 1 ; then + # The first file doesn't have a previous command to add. + eval concat_cmds=\"$reload_cmds $objlist $last_robj\" + else + # All subsequent reloadable object files will link in + # the last one created. + eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj\" + fi + last_robj=$output_objdir/$output_la-${k}.$objext + k=`expr $k + 1` + output=$output_objdir/$output_la-${k}.$objext + objlist=$obj + len=1 + 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~ + eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\" + + if ${skipped_export-false}; then + $show "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $run $rm $export_symbols + libobjs=$output + # Append the command to create the export file. + eval concat_cmds=\"\$concat_cmds~$export_symbols_cmds\" + fi + + # Set up a command to remove the reloadable object files + # after they are used. + i=0 + while test "$i" -lt "$k" + do + i=`expr $i + 1` + delfiles="$delfiles $output_objdir/$output_la-${i}.$objext" + done + + $echo "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" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + 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\" + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test "$module" = yes && 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 + + # Append the command to remove the reloadable object files + # to the just-reset $cmds. + eval cmds=\"\$cmds~\$rm $delfiles\" + fi + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$mode" = relink; then + $run eval '(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 "$mode" = relink; then + $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 + $show "${rm}r $gentop" + $run ${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 + $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)" + $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $? + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test "$module" = yes || test "$export_dynamic" = yes; then + # On all known operating systems, these are identical. + dlname="$soname" + fi + fi + ;; + + obj) + case " $deplibs" in + *\ -l* | *\ -L*) + $echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2 ;; + esac + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2 + fi + + if test -n "$rpath"; then + $echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2 + fi + + if test -n "$xrpath"; then + $echo "$modename: warning: \`-R' is ignored for objects" 1>&2 + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for objects" 1>&2 + fi + + case $output in + *.lo) + if test -n "$objs$old_deplibs"; then + $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2 + exit $EXIT_FAILURE + fi + libobj="$output" + obj=`$echo "X$output" | $Xsed -e "$lo2o"` + ;; + *) + libobj= + obj="$output" + ;; + esac + + # Delete the old objects. + $run $rm $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # reload_cmds runs $LD directly, so let us get rid of + # -Wl from whole_archive_flag_spec and hope we can get by with + # turning comma into space.. + wl= + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" + reload_conv_objs=$reload_objs\ `$echo "X$tmp_whole_archive_flags" | $Xsed -e 's|,| |g'` + else + gentop="$output_objdir/${obj}x" + generated="$generated $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + + # Create the old-style object. + reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test + + output="$obj" + cmds=$reload_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + exit $EXIT_SUCCESS + fi + + if test "$build_libtool_libs" != yes; then + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. + # $show "echo timestamp > $libobj" + # $run eval "echo timestamp > $libobj" || exit $? + exit $EXIT_SUCCESS + fi + + if test -n "$pic_flag" || test "$pic_mode" != default; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output="$libobj" + cmds=$reload_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + exit $EXIT_SUCCESS + ;; + + prog) + case $host in + *cygwin*) output=`$echo $output | ${SED} -e 's,.exe$,,;s,$,.exe,'` ;; + esac + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for programs" 1>&2 + fi + + if test "$preload" = yes; then + if test "$dlopen_support" = unknown && test "$dlopen_self" = unknown && + test "$dlopen_self_static" = unknown; then + $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support." + fi + fi + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$echo "X $compile_deplibs" | $Xsed -e 's/ -lc / -framework System /'` + finalize_deplibs=`$echo "X $finalize_deplibs" | $Xsed -e 's/ -lc / -framework System /'` + ;; + esac + + case $host in + *darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + if test "$tagname" = CXX ; then + compile_command="$compile_command ${wl}-bind_at_load" + finalize_command="$finalize_command ${wl}-bind_at_load" + fi + ;; + 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 "*) + new_libs="$new_libs -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$new_libs $deplib" ;; + esac + ;; + *) new_libs="$new_libs $deplib" ;; + esac + done + compile_deplibs="$new_libs" + + + compile_command="$compile_command $compile_deplibs" + finalize_command="$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 "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) + testbindir=`$echo "X$libdir" | $Xsed -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$libdir:"*) ;; + *) dllsearchpath="$dllsearchpath:$libdir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + *) dllsearchpath="$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"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath="$rpath" + + if test -n "$libobjs" && test "$build_old_libs" = yes; then + # Transform all the library objects into standard objects. + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + fi + + dlsyms= + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + dlsyms="${outputname}S.c" + else + $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2 + fi + fi + + if test -n "$dlsyms"; then + case $dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist="$output_objdir/${outputname}.nm" + + $show "$rm $nlist ${nlist}S ${nlist}T" + $run $rm "$nlist" "${nlist}S" "${nlist}T" + + # Parse the name list into a source file. + $show "creating $output_objdir/$dlsyms" + + test -z "$run" && $echo > "$output_objdir/$dlsyms" "\ +/* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */ +/* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +/* Prevent the only kind of declaration conflicts we can make. */ +#define lt_preloaded_symbols some_other_symbol + +/* External symbol declarations for the compiler. */\ +" + + if test "$dlself" = yes; then + $show "generating symbol list for \`$output'" + + test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$echo "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + for arg in $progfiles; do + $show "extracting global C symbols from \`$arg'" + $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $run eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + $run eval '$mv "$nlist"T "$nlist"' + fi + + if test -n "$export_symbols_regex"; then + $run eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + $run eval '$mv "$nlist"T "$nlist"' + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols="$output_objdir/$outputname.exp" + $run $rm $export_symbols + $run eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + case $host in + *cygwin* | *mingw* ) + $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + $run eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' + ;; + esac + else + $run eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + $run eval 'grep -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' + $run eval 'mv "$nlist"T "$nlist"' + case $host in + *cygwin* | *mingw* ) + $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + $run eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' + ;; + esac + fi + fi + + for arg in $dlprefiles; do + $show "extracting global C symbols from \`$arg'" + name=`$echo "$arg" | ${SED} -e 's%^.*/%%'` + $run eval '$echo ": $name " >> "$nlist"' + $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" + done + + if test -z "$run"; then + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $mv "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if grep -v "^: " < "$nlist" | + 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/$dlsyms"' + else + $echo '/* NONE */' >> "$output_objdir/$dlsyms" + fi + + $echo >> "$output_objdir/$dlsyms" "\ + +#undef lt_preloaded_symbols + +#if defined (__STDC__) && __STDC__ +# define lt_ptr void * +#else +# define lt_ptr char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +" + + case $host in + *cygwin* | *mingw* ) + $echo >> "$output_objdir/$dlsyms" "\ +/* DATA imports from DLLs on WIN32 can't be const, because + runtime relocations are performed -- see ld's documentation + on pseudo-relocs */ +struct { +" + ;; + * ) + $echo >> "$output_objdir/$dlsyms" "\ +const struct { +" + ;; + esac + + + $echo >> "$output_objdir/$dlsyms" "\ + const char *name; + lt_ptr address; +} +lt_preloaded_symbols[] = +{\ +" + + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$dlsyms" + + $echo >> "$output_objdir/$dlsyms" "\ + {0, (lt_ptr) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + fi + + pic_flag_for_symtable= + case $host in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + case "$compile_command " in + *" -static "*) ;; + *) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND";; + esac;; + *-*-hpux*) + case "$compile_command " in + *" -static "*) ;; + *) pic_flag_for_symtable=" $pic_flag";; + esac + esac + + # Now compile the dynamic symbol file. + $show "(cd $output_objdir && $LTCC $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")" + $run eval '(cd $output_objdir && $LTCC $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $? + + # Clean up the generated files. + $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T" + $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T" + + # Transform the symbol file into the correct name. + case $host in + *cygwin* | *mingw* ) + if test -f "$output_objdir/${outputname}.def" ; then + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%" | $NL2SP` + else + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` + fi + ;; + * ) + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` + ;; + esac + ;; + *) + $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2 + exit $EXIT_FAILURE + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s% @SYMFILE@%%" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s% @SYMFILE@%%" | $NL2SP` + fi + + if test "$need_relink" = no || test "$build_libtool_libs" != yes; then + # Replace the output file specification. + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e 's%@OUTPUT@%'"$output"'%g' | $NL2SP` + link_command="$compile_command$compile_rpath" + + # We have no uninstalled library dependencies, so finalize right now. + $show "$link_command" + $run eval "$link_command" + exit_status=$? + + # Delete the generated files. + if test -n "$dlsyms"; then + $show "$rm $output_objdir/${outputname}S.${objext}" + $run $rm "$output_objdir/${outputname}S.${objext}" + fi + + exit $exit_status + fi + + if test -n "$shlibpath_var"; then + # We should set the shlibpath_var + rpath= + for dir in $temp_rpath; do + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) + # Absolute path. + rpath="$rpath$dir:" + ;; + *) + # Relative path: add a thisdir entry. + rpath="$rpath\$thisdir/$dir:" + ;; + esac + done + temp_rpath="$rpath" + fi + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath="$rpath$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + rpath="$rpath$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test "$no_install" = yes; 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 "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $run $rm $output + # Link the executable and exit + $show "$link_command" + $run eval "$link_command" || exit $? + exit $EXIT_SUCCESS + fi + + if test "$hardcode_action" = relink; then + # Fast installation is not supported + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + + $echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2 + $echo "$modename: \`$output' will be relinked during installation" 1>&2 + else + if test "$fast_install" != no; then + link_command="$finalize_var$compile_command$finalize_rpath" + if test "$fast_install" = yes; then + relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $SP2NL | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g' | $NL2SP` + else + # fast_install is set to needless + relink_command= + fi + else + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + fi + fi + + # Replace the output file specification. + link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname + + $show "$link_command" + $run eval "$link_command" || exit $? + + # Now create the wrapper script. + $show "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + # 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}\" || 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 + var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` + relink_command="$var=\"$var_value\"; export $var; $relink_command" + fi + done + relink_command="(cd `pwd`; $relink_command)" + relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e "$sed_quote_subst" | $NL2SP` + fi + + # Quote $echo for shipping. + if test "X$echo" = "X$SHELL $progpath --fallback-echo"; then + case $progpath in + [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";; + *) qecho="$SHELL `pwd`/$progpath --fallback-echo";; + esac + qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"` + else + qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"` + fi + + # Only actually do things if our run command is non-null. + if test -z "$run"; then + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) output=`$echo $output|${SED} 's,.exe$,,'` ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) + exeext=.exe + outputname=`$echo $outputname|${SED} 's,.exe$,,'` ;; + *) exeext= ;; + esac + case $host in + *cygwin* | *mingw* ) + output_name=`basename $output` + output_path=`dirname $output` + 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 + + cat > $cwrappersource <> $cwrappersource<<"EOF" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(PATH_MAX) +# define LT_PATHMAX PATH_MAX +#elif defined(MAXPATHLEN) +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#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 +# 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 */ + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free ((void *) stale); stale = 0; } \ +} while (0) + +/* -DDEBUG is fairly common in CFLAGS. */ +#undef DEBUG +#if defined DEBUGWRAPPER +# define DEBUG(format, ...) fprintf(stderr, format, __VA_ARGS__) +#else +# define DEBUG(format, ...) +#endif + +const char *program_name = NULL; + +void * xmalloc (size_t num); +char * xstrdup (const char *string); +const char * base_name (const char *name); +char * find_executable(const char *wrapper); +int check_executable(const char *path); +char * strendzap(char *str, const char *pat); +void lt_fatal (const char *message, ...); + +int +main (int argc, char *argv[]) +{ + char **newargz; + int i; + + program_name = (char *) xstrdup (base_name (argv[0])); + DEBUG("(main) argv[0] : %s\n",argv[0]); + DEBUG("(main) program_name : %s\n",program_name); + newargz = XMALLOC(char *, argc+2); +EOF + + cat >> $cwrappersource <> $cwrappersource <<"EOF" + newargz[1] = find_executable(argv[0]); + if (newargz[1] == NULL) + lt_fatal("Couldn't find %s", argv[0]); + DEBUG("(main) found exe at : %s\n",newargz[1]); + /* we know the script has the same name, without the .exe */ + /* so make sure newargz[1] doesn't end in .exe */ + strendzap(newargz[1],".exe"); + for (i = 1; i < argc; i++) + newargz[i+1] = xstrdup(argv[i]); + newargz[argc+1] = NULL; + + for (i=0; i> $cwrappersource <> $cwrappersource <> $cwrappersource <<"EOF" + return 127; +} + +void * +xmalloc (size_t num) +{ + void * p = (void *) malloc (num); + if (!p) + lt_fatal ("Memory exhausted"); + + return p; +} + +char * +xstrdup (const char *string) +{ + return string ? strcpy ((char *) xmalloc (strlen (string) + 1), string) : NULL +; +} + +const char * +base_name (const char *name) +{ + const char *base; + +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + /* Skip over the disk name in MSDOS pathnames. */ + if (isalpha ((unsigned char)name[0]) && name[1] == ':') + name += 2; +#endif + + for (base = name; *name; name++) + if (IS_DIR_SEPARATOR (*name)) + base = name + 1; + return base; +} + +int +check_executable(const char * path) +{ + struct stat st; + + DEBUG("(check_executable) : %s\n", path ? (*path ? path : "EMPTY!") : "NULL!"); + if ((!path) || (!*path)) + return 0; + + if ((stat (path, &st) >= 0) && + ( + /* MinGW & native WIN32 do not support S_IXOTH or S_IXGRP */ +#if defined (S_IXOTH) + ((st.st_mode & S_IXOTH) == S_IXOTH) || +#endif +#if defined (S_IXGRP) + ((st.st_mode & S_IXGRP) == S_IXGRP) || +#endif + ((st.st_mode & S_IXUSR) == S_IXUSR)) + ) + return 1; + else + return 0; +} + +/* Searches for the full path of the wrapper. Returns + newly allocated full path name if found, NULL otherwise */ +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]; + int tmp_len; + char* concat_name; + + DEBUG("(find_executable) : %s\n", wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!"); + + 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 = 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 ("getcwd failed"); + 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 ("getcwd failed"); + 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 * +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 (strcmp(str, pat) == 0) + *str = '\0'; + } + return str; +} + +static void +lt_error_core (int exit_status, const char * mode, + const char * message, va_list ap) +{ + fprintf (stderr, "%s: %s: ", program_name, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, "FATAL", message, ap); + va_end (ap); +} +EOF + # we should really use a build-platform specific compiler + # here, but OTOH, the wrappers (shell script and this C one) + # are only useful if you want to execute the "real" binary. + # Since the "real" binary is built for $host, then this + # wrapper might as well be built for $host, too. + $run $LTCC $LTCFLAGS -s -o $cwrapper $cwrappersource + ;; + esac + $rm $output + trap "$rm $output; exit $EXIT_FAILURE" 1 2 15 + + $echo > $output "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP +# +# The $output program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='${SED} -e 1s/^X//' +sed_quote_subst='$sed_quote_subst' + +# Be Bourne compatible (taken from Autoconf:_AS_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 variable: + 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 + echo=\"$qecho\" + file=\"\$0\" + # Make sure echo works. + if test \"X\$1\" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift + elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then + # Yippee, \$echo works! + : + else + # Restart under the correct shell, and then maybe \$echo will work. + exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"} + fi + fi\ +" + $echo >> $output "\ + + # Find the directory that this script lives in. + thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\` + done + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test "$fast_install" = yes; then + $echo >> $output "\ + program=lt-'$outputname'$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 >> $output "\ + + # 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 $EXIT_FAILURE + fi + fi + + $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $rm \"\$progdir/\$program\"; + $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $rm \"\$progdir/\$file\" + fi" + else + $echo >> $output "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + $echo >> $output "\ + + if test -f \"\$progdir/\$program\"; then" + + # Export our shlibpath_var if we have one. + if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $echo >> $output "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` + + export $shlibpath_var +" + fi + + # fixup the dll searchpath if we need to. + if test -n "$dllsearchpath"; then + $echo >> $output "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + $echo >> $output "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2*) + $echo >> $output "\ + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $echo >> $output "\ + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $echo >> $output "\ + \$echo \"\$0: cannot exec \$program \$*\" + exit $EXIT_FAILURE + 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 $EXIT_FAILURE + fi +fi\ +" + chmod +x $output + fi + exit $EXIT_SUCCESS + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + if test "$build_libtool_libs" = convenience; then + oldobjs="$libobjs_save" + addlibs="$convenience" + build_libtool_libs=no + else + if test "$build_libtool_libs" = module; then + oldobjs="$libobjs_save" + build_libtool_libs=no + else + oldobjs="$old_deplibs $non_pic_objects" + fi + addlibs="$old_convenience" + fi + + if test -n "$addlibs"; then + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + func_extract_archives $gentop $addlibs + oldobjs="$oldobjs $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then + cmds=$old_archive_from_new_cmds + else + # 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 + $echo "X$obj" | $Xsed -e 's%^.*/%%' + done | sort | sort -uc >/dev/null 2>&1); then + : + else + $echo "copying selected object files to avoid basename conflicts..." + + if test -z "$gentop"; then + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + $show "${rm}r $gentop" + $run ${rm}r "$gentop" + $show "$mkdir $gentop" + $run $mkdir "$gentop" + exit_status=$? + if test "$exit_status" -ne 0 && test ! -d "$gentop"; then + exit $exit_status + fi + fi + + save_oldobjs=$oldobjs + oldobjs= + counter=1 + for obj in $save_oldobjs + do + objbase=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` + case " $oldobjs " in + " ") oldobjs=$obj ;; + *[\ /]"$objbase "*) + while :; do + # Make sure we don't pick an alternate name that also + # overlaps. + newobj=lt$counter-$objbase + counter=`expr $counter + 1` + case " $oldobjs " in + *[\ /]"$newobj "*) ;; + *) if test ! -f "$gentop/$newobj"; then break; fi ;; + esac + done + $show "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" + $run ln "$obj" "$gentop/$newobj" || + $run cp "$obj" "$gentop/$newobj" + oldobjs="$oldobjs $gentop/$newobj" + ;; + *) oldobjs="$oldobjs $obj" ;; + esac + done + fi + + eval cmds=\"$old_archive_cmds\" + + if len=`expr "X$cmds" : ".*"` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + $echo "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_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 + for obj in $save_oldobjs + do + oldobjs="$objlist $obj" + objlist="$objlist $obj" + eval test_cmds=\"$old_archive_cmds\" + if len=`expr "X$test_cmds" : ".*" 2>/dev/null` && + test "$len" -le "$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= + fi + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test "X$oldobjs" = "X" ; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" + fi + fi + fi + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + eval cmd=\"$cmd\" + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + done + + if test -n "$generated"; then + $show "${rm}r$generated" + $run ${rm}r$generated + fi + + # Now create the libtool archive. + case $output in + *.la) + old_library= + test "$build_old_libs" = yes && old_library="$libname.$libext" + $show "creating $output" + + # 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}\" || 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 + var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` + relink_command="$var=\"$var_value\"; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e "$sed_quote_subst" | $NL2SP` + if test "$hardcode_automatic" = yes ; then + relink_command= + fi + + + # Only create the output if not a dry run. + if test -z "$run"; then + for installed in no yes; do + if test "$installed" = yes; then + if test -z "$install_libdir"; then + break + fi + output="$output_objdir/$outputname"i + # Replace all uninstalled libtool libraries with the installed ones + newdependency_libs= + for deplib in $dependency_libs; do + case $deplib in + *.la) + name=`$echo "X$deplib" | $Xsed -e 's%^.*/%%'` + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + if test -z "$libdir"; then + $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + newdependency_libs="$newdependency_libs $libdir/$name" + ;; + *) newdependency_libs="$newdependency_libs $deplib" ;; + esac + done + dependency_libs="$newdependency_libs" + newdlfiles= + for lib in $dlfiles; do + name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + if test -z "$libdir"; then + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + newdlfiles="$newdlfiles $libdir/$name" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + if test -z "$libdir"; then + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + newdlprefiles="$newdlprefiles $libdir/$name" + done + dlprefiles="$newdlprefiles" + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + newdlfiles="$newdlfiles $abs" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + newdlprefiles="$newdlprefiles $abs" + done + dlprefiles="$newdlprefiles" + fi + $rm $output + # place dlname in correct position for cygwin + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; + esac + $echo > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='$tdlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# 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 "$installed" = no && test "$need_relink" = yes; then + $echo >> $output "\ +relink_command=\"$relink_command\"" + fi + done + fi + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" + $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $? + ;; + esac + exit $EXIT_SUCCESS + ;; + + # libtool install mode + install) + modename="$modename: install" + + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || + # Allow the use of GNU shtool's install command. + $echo "X$nonopt" | grep shtool > /dev/null; then + # Aesthetically quote it. + arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + install_prog="$arg " + arg="$1" + shift + else + install_prog= + arg=$nonopt + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + install_prog="$install_prog$arg" + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=no + stripme= + for arg + do + if test -n "$dest"; then + files="$files $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=yes ;; + -f) + case " $install_prog " in + *[\\\ /]cp\ *) ;; + *) prev=$arg ;; + esac + ;; + -g | -m | -o) prev=$arg ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + install_prog="$install_prog $arg" + done + + if test -z "$install_prog"; then + $echo "$modename: you must specify an install program" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + if test -n "$prev"; then + $echo "$modename: the \`$prev' option requires an argument" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + if test -z "$files"; then + if test -z "$dest"; then + $echo "$modename: no file or destination specified" 1>&2 + else + $echo "$modename: you must specify a destination" 1>&2 + fi + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Strip any trailing slash from the destination. + dest=`$echo "X$dest" | $Xsed -e 's%/$%%'` + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=yes + if test "$isdir" = yes; then + destdir="$dest" + destname= + else + destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'` + test "X$destdir" = "X$dest" && destdir=. + destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'` + + # Not a directory, so check to see that there is only one file specified. + set dummy $files + if test "$#" -gt 2; then + $echo "$modename: \`$dest' is not a directory" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + 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. + staticlibs="$staticlibs $file" + ;; + + *.la) + # Check to see that this really is a libtool archive. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$file' is not a valid libtool archive" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + library_names= + old_library= + relink_command= + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) current_libdirs="$current_libdirs $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) future_libdirs="$future_libdirs $libdir" ;; + esac + fi + + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/ + test "X$dir" = "X$file/" && dir= + dir="$dir$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$echo "$destdir" | $SED "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. + if test "$inst_prefix_dir" = "$destdir"; then + $echo "$modename: error: cannot install \`$file' to a directory not ending in $libdir" 1>&2 + exit $EXIT_FAILURE + fi + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$echo "$relink_command" | $SP2NL | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%" | $NL2SP` + else + relink_command=`$echo "$relink_command" | $SP2NL | $SED "s%@inst_prefix_dir@%%" | $NL2SP` + fi + + $echo "$modename: warning: relinking \`$file'" 1>&2 + $show "$relink_command" + if $run eval "$relink_command"; then : + else + $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 + exit $EXIT_FAILURE + fi + fi + + # See the names of the shared library. + set dummy $library_names + if test -n "$2"; then + realname="$2" + shift + shift + + srcname="$realname" + test -n "$relink_command" && srcname="$realname"T + + # Install the shared library and build the symlinks. + $show "$install_prog $dir/$srcname $destdir/$realname" + $run eval "$install_prog $dir/$srcname $destdir/$realname" || exit $? + if test -n "$stripme" && test -n "$striplib"; then + $show "$striplib $destdir/$realname" + $run 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 + if test "$linkname" != "$realname"; then + $show "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })" + $run eval "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })" + fi + done + fi + + # Do each command in the postinstall commands. + lib="$destdir/$realname" + cmds=$postinstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$mode" = relink; then + $run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)' + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + fi + + # Install the pseudo-library for information purposes. + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + instname="$dir/$name"i + $show "$install_prog $instname $destdir/$name" + $run eval "$install_prog $instname $destdir/$name" || exit $? + + # Maybe install the static library, too. + test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + destfile="$destdir/$destfile" + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"` + ;; + *.$objext) + staticdest="$destfile" + destfile= + ;; + *) + $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + # Install the libtool object if requested. + if test -n "$destfile"; then + $show "$install_prog $file $destfile" + $run eval "$install_prog $file $destfile" || exit $? + fi + + # Install the old object if enabled. + if test "$build_old_libs" = yes; then + # Deduce the name of the old-style object file. + staticobj=`$echo "X$file" | $Xsed -e "$lo2o"` + + $show "$install_prog $staticobj $staticdest" + $run eval "$install_prog \$staticobj \$staticdest" || exit $? + fi + exit $EXIT_SUCCESS + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + destfile="$destdir/$destfile" + fi + + # 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 + file=`$echo $file|${SED} 's,.exe$,,'` + stripped_ext=".exe" + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin*|*mingw*) + wrapper=`$echo $file | ${SED} -e 's,.exe$,,'` + ;; + *) + wrapper=$file + ;; + esac + if (${SED} -e '4q' $wrapper | grep "^# Generated by .*$PACKAGE")>/dev/null 2>&1; then + notinst_deplibs= + relink_command= + + # Note that it is not necessary on cygwin/mingw to append a dot to + # foo even if both foo 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. + # + # If there is no directory component, then add one. + case $wrapper in + */* | *\\*) . ${wrapper} ;; + *) . ./${wrapper} ;; + esac + + # Check the variables that should have been set. + if test -z "$notinst_deplibs"; then + $echo "$modename: invalid libtool wrapper script \`$wrapper'" 1>&2 + exit $EXIT_FAILURE + fi + + finalize=yes + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + # If there is no directory component, then add one. + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + fi + libfile="$libdir/"`$echo "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test + if test -n "$libdir" && test ! -f "$libfile"; then + $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2 + finalize=no + fi + done + + relink_command= + # Note that it is not necessary on cygwin/mingw to append a dot to + # foo even if both foo 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. + # + # If there is no directory component, then add one. + case $wrapper in + */* | *\\*) . ${wrapper} ;; + *) . ./${wrapper} ;; + esac + + outputname= + if test "$fast_install" = no && test -n "$relink_command"; then + if test "$finalize" = yes && test -z "$run"; then + tmpdir=`func_mktempdir` + file=`$echo "X$file$stripped_ext" | $Xsed -e 's%^.*/%%'` + outputname="$tmpdir/$file" + # Replace the output file specification. + relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g' | $NL2SP` + + $show "$relink_command" + if $run eval "$relink_command"; then : + else + $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 + ${rm}r "$tmpdir" + continue + fi + file="$outputname" + else + $echo "$modename: warning: cannot relink \`$file'" 1>&2 + fi + else + # Install the binary that we compiled earlier. + file=`$echo "X$file$stripped_ext" | $Xsed -e "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) + destfile=`$echo $destfile | ${SED} -e 's,.exe$,,'` + ;; + esac + ;; + esac + $show "$install_prog$stripme $file $destfile" + $run eval "$install_prog\$stripme \$file \$destfile" || exit $? + test -n "$outputname" && ${rm}r "$tmpdir" + ;; + esac + done + + for file in $staticlibs; do + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + + # Set up the ranlib parameters. + oldlib="$destdir/$name" + + $show "$install_prog $file $oldlib" + $run eval "$install_prog \$file \$oldlib" || exit $? + + if test -n "$stripme" && test -n "$old_striplib"; then + $show "$old_striplib $oldlib" + $run eval "$old_striplib $oldlib" || exit $? + fi + + # Do each command in the postinstall commands. + cmds=$old_postinstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + done + + if test -n "$future_libdirs"; then + $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2 + fi + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + test -n "$run" && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi + ;; + + # libtool finish mode + finish) + modename="$modename: finish" + libdirs="$nonopt" + admincmds= + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for dir + do + libdirs="$libdirs $dir" + done + + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + cmds=$finish_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || admincmds="$admincmds + $cmd" + done + IFS="$save_ifs" + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $run eval "$cmds" || admincmds="$admincmds + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + test "$show" = : && exit $EXIT_SUCCESS + + $echo "X----------------------------------------------------------------------" | $Xsed + $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" + $echo "more information, such as the ld(1) and ld.so(8) manual pages." + $echo "X----------------------------------------------------------------------" | $Xsed + exit $EXIT_SUCCESS + ;; + + # libtool execute mode + execute) + modename="$modename: execute" + + # The first argument is the command name. + cmd="$nonopt" + if test -z "$cmd"; then + $echo "$modename: you must specify a COMMAND" 1>&2 + $echo "$help" + exit $EXIT_FAILURE + fi + + # Handle -dlopen flags immediately. + for file in $execute_dlfiles; do + if test ! -f "$file"; then + $echo "$modename: \`$file' is not a file" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + dir= + case $file in + *.la) + # Check to see that this really is a libtool archive. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Read the libtool library. + dlname= + library_names= + + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'" + continue + fi + + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$file" && dir=. + + if test -f "$dir/$objdir/$dlname"; then + dir="$dir/$objdir" + else + if test ! -f "$dir/$dlname"; then + $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2 + exit $EXIT_FAILURE + fi + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$file" && dir=. + ;; + + *) + $echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2 + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir="$absdir" + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic="$magic" + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case $file in + -*) ;; + *) + # Do a test to see if this is really a libtool program. + if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Transform arg to wrapped name. + file="$progdir/$program" + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"` + args="$args \"$file\"" + done + + if test -z "$run"; then + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved 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 + fi" + done + + # Now prepare to actually exec the command. + exec_cmd="\$cmd$args" + else + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\"" + $echo "export $shlibpath_var" + fi + $echo "$cmd$args" + exit $EXIT_SUCCESS + fi + ;; + + # libtool clean and uninstall mode + clean | uninstall) + modename="$modename: $mode" + rm="$nonopt" + files= + rmforce= + 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) rm="$rm $arg"; rmforce=yes ;; + -*) rm="$rm $arg" ;; + *) files="$files $arg" ;; + esac + done + + if test -z "$rm"; then + $echo "$modename: you must specify an RM program" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + rmdirs= + + origobjdir="$objdir" + for file in $files; do + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + if test "X$dir" = "X$file"; then + dir=. + objdir="$origobjdir" + else + objdir="$dir/$origobjdir" + fi + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + test "$mode" = uninstall && objdir="$dir" + + # Remember objdir for removal later, being careful to avoid duplicates + if test "$mode" = clean; then + case " $rmdirs " in + *" $objdir "*) ;; + *) rmdirs="$rmdirs $objdir" ;; + 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 test "$rmforce" = yes; then + continue + fi + + rmfiles="$file" + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + . $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + rmfiles="$rmfiles $objdir/$n" + done + test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library" + + case "$mode" in + clean) + case " $library_names " in + # " " in the beginning catches empty $dlname + *" $dlname "*) ;; + *) rmfiles="$rmfiles $objdir/$dlname" ;; + esac + test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" + ;; + uninstall) + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + cmds=$postuninstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" + if test "$?" -ne 0 && test "$rmforce" != yes; then + exit_status=1 + fi + done + IFS="$save_ifs" + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + cmds=$old_postuninstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" + if test "$?" -ne 0 && test "$rmforce" != yes; then + exit_status=1 + fi + done + IFS="$save_ifs" + fi + # FIXME: should reinstall the best remaining shared library. + ;; + esac + fi + ;; + + *.lo) + # Possibly a libtool object, so verify it. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + + # Read the .lo file + . $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" \ + && test "$pic_object" != none; then + rmfiles="$rmfiles $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" \ + && test "$non_pic_object" != none; then + rmfiles="$rmfiles $dir/$non_pic_object" + fi + fi + ;; + + *) + if test "$mode" = clean ; then + noexename=$name + case $file in + *.exe) + file=`$echo $file|${SED} 's,.exe$,,'` + noexename=`$echo $name|${SED} 's,.exe$,,'` + # $file with .exe has already been added to rmfiles, + # add $file without .exe + rmfiles="$rmfiles $file" + ;; + esac + # Do a test to see if this is a libtool program. + if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + relink_command= + . $dir/$noexename + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" + if test "$fast_install" = yes && test -n "$relink_command"; then + rmfiles="$rmfiles $objdir/lt-$name" + fi + if test "X$noexename" != "X$name" ; then + rmfiles="$rmfiles $objdir/lt-${noexename}.c" + fi + fi + fi + ;; + esac + $show "$rm $rmfiles" + $run $rm $rmfiles || exit_status=1 + done + objdir="$origobjdir" + + # Try to remove the ${objdir}s in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + $show "rmdir $dir" + $run rmdir $dir >/dev/null 2>&1 + fi + done + + exit $exit_status + ;; + + "") + $echo "$modename: you must specify a MODE" 1>&2 + $echo "$generic_help" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + if test -z "$exec_cmd"; then + $echo "$modename: invalid operation mode \`$mode'" 1>&2 + $echo "$generic_help" 1>&2 + exit $EXIT_FAILURE + fi +fi # test -z "$show_help" + +if test -n "$exec_cmd"; then + eval exec $exec_cmd + exit $EXIT_FAILURE +fi + +# We need to display help for each of the modes. +case $mode in +"") $echo \ +"Usage: $modename [OPTION]... [MODE-ARG]... + +Provide generalized library-building support services. + + --config show all configuration variables + --debug enable verbose shell tracing +-n, --dry-run display commands without modifying any files + --features display basic configuration information and exit + --finish same as \`--mode=finish' + --help display this help message and exit + --mode=MODE use operation mode MODE [default=inferred from MODE-ARGS] + --quiet same as \`--silent' + --silent don't print informational messages + --tag=TAG use configuration variables from tag TAG + --version print version information + +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. Try \`$modename --help --mode=MODE' for +a more detailed description of MODE. + +Report bugs to ." + exit $EXIT_SUCCESS + ;; + +clean) + $echo \ +"Usage: $modename [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: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -prefer-pic try to building PIC objects only + -prefer-non-pic try to building non-PIC objects only + -static always build a \`.o' file suitable for static linking + +COMPILE-COMMAND is a command to be used in creating a \`standard' object file +from the given SOURCEFILE. + +The output file name is determined by removing the directory component from +SOURCEFILE, then substituting the C source code suffix \`.c' with the +library object suffix, \`.lo'." + ;; + +execute) + $echo \ +"Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]... + +Automatically set library path, then run a program. + +This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + +This mode sets the library path environment variable according to \`-dlopen' +flags. + +If any of the ARGS are libtool executable wrappers, then they are translated +into their corresponding uninstalled binary, and any of their required library +directories are added to the library path. + +Then, COMMAND is executed, with ARGS as arguments." + ;; + +finish) + $echo \ +"Usage: $modename [OPTION]... --mode=finish [LIBDIR]... + +Complete the installation of libtool libraries. + +Each LIBDIR is a directory that contains libtool libraries. + +The commands that this mode executes may require superuser privileges. Use +the \`--dry-run' option if you just want to see what would be executed." + ;; + +install) + $echo \ +"Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND... + +Install executables or libraries. + +INSTALL-COMMAND is the installation command. The first component should be +either the \`install' or \`cp' program. + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + +link) + $echo \ +"Usage: $modename [OPTION]... --mode=link LINK-COMMAND... + +Link object files or libraries together to form another library, or to +create an executable program. + +LINK-COMMAND is a command using the C compiler that you would use to create +a program from several object files. + +The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-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 + -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 + -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] + +All other options (arguments beginning with \`-') are ignored. + +Every other argument is treated as a filename. Files ending in \`.la' are +treated as uninstalled libtool libraries, other files are standard or library +object files. + +If the OUTPUT-FILE ends in \`.la', then a libtool library is created, +only library objects (\`.lo' files) may be specified, and \`-rpath' is +required, except when creating a convenience library. + +If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created +using \`ar' and \`ranlib', or on Windows using \`lib'. + +If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file +is created, otherwise an executable program is created." + ;; + +uninstall) + $echo \ +"Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + +Remove libraries from an installation directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, all the files associated with it are deleted. +Otherwise, only FILE itself is deleted using RM." + ;; + +*) + $echo "$modename: invalid operation mode \`$mode'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; +esac + +$echo +$echo "Try \`$modename --help' for more information about other modes." + +exit $? + +# The TAGs below are defined such that we never get into a situation +# in which 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 +disable_libs=shared +# ### END LIBTOOL TAG CONFIG: disable-shared + +# ### BEGIN LIBTOOL TAG CONFIG: disable-static +disable_libs=static +# ### END LIBTOOL TAG CONFIG: disable-static + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: diff --git a/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/conftools/mkinstalldirs b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/conftools/mkinstalldirs new file mode 100755 index 00000000..d0aa5646 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/conftools/mkinstalldirs @@ -0,0 +1,40 @@ +#! /bin/sh +# mkinstalldirs --- make directory hierarchy +# Author: Noah Friedman +# Created: 1993-05-16 +# Public domain + +# $Id: mkinstalldirs 106503 2004-11-24 23:45:40Z nd $ + +errstatus=0 + +for file +do + set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` + shift + + pathcomp= + for d + do + pathcomp="$pathcomp$d" + case "$pathcomp" in + -* ) pathcomp=./$pathcomp ;; + esac + + if test ! -d "$pathcomp"; then + echo "mkdir $pathcomp" + + mkdir "$pathcomp" || lasterr=$? + + if test ! -d "$pathcomp"; then + errstatus=$lasterr + fi + fi + + pathcomp="$pathcomp/" + done +done + +exit $errstatus + +# mkinstalldirs ends here diff --git a/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/expat_config.h b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/expat_config.h new file mode 100644 index 00000000..b380d0c7 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/expat_config.h @@ -0,0 +1,93 @@ +/* expat_config.h. Generated from expat_config.h.in by configure. */ +/* expat_config.h.in. Generated from configure.in by autoheader. */ + +/* Define if building universal (internal helper macro) */ +/* #undef AC_APPLE_UNIVERSAL_BUILD */ + +/* byte order is unknown due to cross-compilation */ +/* #undef AP_UNKNOWN_BYTE_ORDER */ + +/* Define to 1 if you have the `bcopy' function. */ +#define HAVE_BCOPY 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_CHECK_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_DLFCN_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define to 1 if you have the `memmove' function. */ +#define HAVE_MEMMOVE 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "expat-bugs@mail.libexpat.org" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "expat" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "expat 1.95.7" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "expat" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "1.95.7" + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most + significant byte first (like Motorola and SPARC, unlike Intel). */ +#if defined AC_APPLE_UNIVERSAL_BUILD +# if defined __BIG_ENDIAN__ +# define WORDS_BIGENDIAN 1 +# endif +#else +# ifndef WORDS_BIGENDIAN +/* # undef WORDS_BIGENDIAN */ +# endif +#endif + +/* Define to specify how much context to retain around the current parse + point. */ +#define XML_CONTEXT_BYTES 1024 + +/* Define to make parameter entity parsing functionality available. */ +#define XML_DTD 1 + +/* Define to make XML Namespaces functionality available. */ +#define XML_NS 1 + +/* Define to empty if `const' does not conform to ANSI C. */ +/* #undef const */ + +/* Define to `unsigned int' if does not define. */ +/* #undef size_t */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/expat_config.h.in b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/expat_config.h.in new file mode 100644 index 00000000..d1dd9713 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/expat_config.h.in @@ -0,0 +1,92 @@ +/* expat_config.h.in. Generated from configure.in by autoheader. */ + +/* Define if building universal (internal helper macro) */ +#undef AC_APPLE_UNIVERSAL_BUILD + +/* byte order is unknown due to cross-compilation */ +#undef AP_UNKNOWN_BYTE_ORDER + +/* Define to 1 if you have the `bcopy' function. */ +#undef HAVE_BCOPY + +/* Define to 1 if you have the header file. */ +#undef HAVE_CHECK_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_DLFCN_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the `memmove' function. */ +#undef HAVE_MEMMOVE + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most + significant byte first (like Motorola and SPARC, unlike Intel). */ +#if defined AC_APPLE_UNIVERSAL_BUILD +# if defined __BIG_ENDIAN__ +# define WORDS_BIGENDIAN 1 +# endif +#else +# ifndef WORDS_BIGENDIAN +# undef WORDS_BIGENDIAN +# endif +#endif + +/* Define to specify how much context to retain around the current parse + point. */ +#undef XML_CONTEXT_BYTES + +/* Define to make parameter entity parsing functionality available. */ +#undef XML_DTD + +/* Define to make XML Namespaces functionality available. */ +#undef XML_NS + +/* Define to empty if `const' does not conform to ANSI C. */ +#undef const + +/* Define to `unsigned int' if does not define. */ +#undef size_t diff --git a/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/.libs/xmlparse.o b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/.libs/xmlparse.o new file mode 100644 index 0000000000000000000000000000000000000000..1e3b92f88feb66456e4dbf4a3b7c4b20b9a16c83 GIT binary patch literal 271432 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%0AEM@&xX6!qQWO9PqD-`JJ4ale?@dl+OVREvxh z5S=0dN5q*!qO4m?JR;5=6h))vWOv?@tIbsRayk3%idE~3IU5_56V6=HhYh)6A$srF z=DI!xMr;7gF=}>}eYl`ZGQ!Gd-VfGGeJIqqBDt>yJTj*h#{G2zvi|km;$pS%{=vXt z;ev^RAb=MfVplc_ah<};<9E$^!<^>c1vq3p6XcQN7oMk;kQ#dhQ)jBvgz2w*gdYx&eGgiXUw2 zO_IhIzcM77j2JP?P<|F(Wb_&N#%oebkOA4KD=9|AcMQY4frg%vEx$UY!v}>Y*Ox-8 zho_Xfu7v&J$L-ayq3RH4T8dsl)zMamZz+^oh3(*JUw1;(mCn z0`kQljE-2dIu<5=hj@D{jQ9s2;^D1k!m#+Rt9wt^OX3{^Wvzot*e2B9nY!y4cXF=y z;WmtIo#wYsiOJPwr+96vIch$8)yA4(vD&PDUu^0SAGn6Z&aH#*9{{$w;t#Gt@#I!> z67EsWoONC^>wx%^VWxa2CiOPAB^Pz3!V2uZK5N-bb9(9yFsM10TTNu4iu$BdeD{wJJ7@vVi^X}^V;V1_4`8y zY7Urb*`0UqkP`@;q#O~u$0^9ZwO7P3Aqr3KqU&joNfS;R#w*$|F97vJx**YY4#B}$7 zFZU$7*NIc@aFp?D!|d?2ne%Tf>MT3(^rlzKX8KNu+g+f{&TYNR-Qv&frANj6=az1I z&ozBY*Y-vGQ_Upvcd4^rvaffgf}+oE1CN>6J0kwi*3whr)pJKzh{18C;=gX_5PQa% zL$CTmkN4azet!eRu+X6B8B)!T{gv>mhFDg=el+ZG@jd%>poyUgsW}x6mbYQi)(rx6o*~C;sZFIc&080@wzu8 z{t5Z>E91bq#Sk>~^g2`SmtGwaFP;NBOfrZ1LD-0tJ7pw(F(fzO)aj>z0Gu z8~c`Ie>kpNTr?=Eg5ttN;SY)nj^oKnJuG*z zbGP>=C)ak~xjYq*Ok(VfQi1>pDimyXv z^n2Jq;Vi;E)gv3s_je5+fcvn59vVNm#+-I^Pau?Bb7EGic=n9yP3HAAkRq*kr*8g% zU1Bg$>J}S&#px+89e|Z;k`#g}dLeH+*gk5OrJ8S;U83`bQt{7m)je+4CFkv^c|BFU zxn*eNff4aU46Qk!+MWWm?-ScxSuy4%EoR**@yymzG32U-*4+!YyF*F&tzt8*@UF!% z;!`mS$y=}R42iGNqH`qnjh1Ip11r}6lUuxb1|G8oR+@`A9DUScR&U?4r^c*-gl|$c zxGwCYpWb512#m%#W%fZ@v}2^k(xPuC%PgA}+OwlZ z{CdlA6WmdJW8A<9BDE*_#F2KhG|yWP>z0WJ6}ZoN_`rzxGj!|D@zvtTh8zc(NCbBI zyTngmyv?s{7!I7szPan+me$)_Vbek5a0)`k>D}%<0Wln}dVn^Z2mtn zs(ZvO6U|<*G$pcsX&MlBPK4v7Q%wUS(ib6@88M&T1zG52*CTZjKF#*V;@N2k}Jg5%HI; zX0XqkZ5|LW!D%T}beWgoRWy}~zqbWX>=94KD3?1Di$=I5WX=kSJ4MiK*4()~bl|03 z;*lH7A@S}w5DyOa&+6CoJOvpSaJFh@S45i zHrJ5vhGh5s+dIp8c4clp@l2}O=Mx`n?GSgn5&;IqW9{G_Fq3P|t_7{Nsms?N&BnZX z9ITTPq>9dVv-_yIS9GwE;TQOh4iMaqjEF+*+SC5 zAK`4NS9}*j#t|^m5to@*wp8tBt7A{$h<^YB^!N7C5%Io(!x96>YrWz*89ZFBE6)~h z!xc_}w@6bW;Tr-83BBTDBWSt?uW$jgi??^&;uFGmQwMAFcUDCeM$U%h1va;t!X$Mv3M>z z4wvBZu_kU=#?Q)KaUeOg4p1Rl@rEnbgfwsCQ%R7f4Lo5MxU)Nb@R+1E)YC4`D;2FB z!$1G6sOi{?@NoaEPQUnIOUj)2uN1AQoxNaTUAEi3G*_IR(|P0a zJ{bLVoyqR?wF`3l(86NUfM|vk|EvKKNWp`sR}ir$@vpLAnbfH?_BTDD z18<4%OdApdaH{?5X*sFl@zvdXLw(|ktW&(bB?#je#Dg>O?v@~^0%v1=ef<#5yH^Lr#eNbcKL2*s@OOR&mymOhD5)^eQ?w(!XL;N{$ z;>69{=Z9`u22ayMH)d^43hi9Gu_^T4QLzs;(7!4#6??%O54m#8%fydiQa|Sc!#oEg z1tCj3>w>e=7lHacSNBfw`qu7Wyneg6P(0)^gK(nw%dMrbqtqL*Z=La{WD~yHosiYd5y=d#LxLUB6qF4F?WMX07>~ z&@db!nN$3!zsog~-V(2_hWzHQ36Navabd1|Kg3FNv+I&`#UH`4_e|^9I5P73$O!n3 zcx&~MyUcew;k3YP3V^@nCf|ZR zKG@M*vu<+euE{lzOs;u!viteTpG^K#{`a@Zp}S=vbkF3_yxq89E1&0?b6cYy*B9DyiNp9Frty{P>w+9UJL~syf{W@+C z@PVL-hrO@GmA3A1*T9x_BDha(M`vmu+p#B^{w1qPe;cmIg@1rorRM zpTM~{Y^x@@UkugEs+m0^79J7lIU*I#5n+G30_uMv>)#ePkhS8f>$7fy{CN~Dd7vkh zhk+}Gj&(xANpC3Qz^Re1=lwUP1yX%x-_g*;sn0R`F&O)knABGQ^c^tocFmqDE{^Fm zLrJfTvtvF!|J29gyqG9{>;WIqjXtrdAir<$t+LH^BE20 z{>ETkur0%1S--TRv8vwR0<;Ey16)G^e@jM1utHYxq!p$uE6>dHW_x|*P$W%X+=xRy=jYcGt0BRnT1l9B5#_vxTrke zZM67hqvh3=jYe}*Q+;~9zoNyctq9b5E7sQgRncGXZ-8EUv9X47DHath!fn7}t!n+!4LqUIb6=+cvtTN<#9I7p8o{W6uKY96inMRt|TbRAL*qdnt zDl4k1bN#LUdIL-p1dC&R@GDDVAiawHX^f=oJQ&)%wA}Kd;>AUoUISn3r~(UA`NMih zW5A|pY6d&#A=7G9UP`y8oSZc;;*jTIk~yiR!*Pny!8CSLYOoVdeZYVAn1VaZ}c>6 zgg7N9d{c8+GY_0EfRPAic7~Ce zo4E|?%jp0iw$Yy#YFGqat!-{U{edM zEVzoOAOgNw3qhw6dWy>jj{vw%WGHHEYH6sbhkkk3LJ;n166zp$pgP=Wab7lzerEad z^rdNq&SHBpMtwyfDBWGz zg4UzO`Neq|b}94)$IT0FiMatRy-Q*3G$86{D4AjFuVr-jYb4nlIgj-S=7N(2 znK=~mRp<&BN_BJG|%~F+t4Spf*Jj1@;|o4e z538HqJY!}O6lA)Xmsvs?+?ds0>JIu7xPN_?{w{6wyC@Tw}Zh0k|r0d7Hq5U(K{miGzuH-;Ky zypwAtWrJZ^5)Yb3CVtj}48aDHU_BSg)l8Q9f{gVLwEP>T zA7Tw#*td*l)tC8eI4`bA`Af=?l#8o`QC-)<;ST~T=d=)AtExET0XhsJx=~p4g^4mY zr746B1m@%@S|#s*IuLv(~T0*?BUv1GQkS#yLkhCZM*lAh*=pQfXrf zflKqV(=#pGa#Xiw8YYZIn5|GofQp9+D9S7-hAcA^c0sTar7Rso4{nmHoRT~(0Q@pH zyNGga^8J8O)f8R{#He|QD=lo3AgHJ?u69$=Ju%_C~P%->L`_Rcu0#k|uWo3-Me61RlX zH(-k@cX+^#8IVl&ErqR#Y3;v!IHzSkQ7gB~ww(et3|fb;97;!6e=_SEXr$phAmGRK z3S>dHB=d_j2vd!)SHZt2uvFj~Cg+sp$9jzPOkC#i`eZfewhHEH0cs65V!?_U>^Sdl zq=VSHrzW9Httu%~rQKXDObi#q%4L7HkBM=)<~OIn9z-|J%;Fj>pFY7>Q#|1 z&zn|i;Gf^X2~49BMn?&lUpCZLw!j`}Oaec~L|4;+k&HoTUL_aK)YKUdB|uAIcb$v- zc^H)F<7;JEke%`jhSQcMOY(D7x{c|cI-Rpm6FMf8%^TG%O%2%5ydq3Oq=j(J;=l(= zfc@+TWqJmL#bdBxMdYLg*M;%Ir9!RQ>V%>kcET_@0xgx0zQU=A-0AYbsd=QgyY)>? z>qE^_vC3wcm-3*L^RzJCwCRgNYXknE9DbN)oE`HFvkYIH=g!Mto@X7PAa@<4&@>mJ z>!7+lN@0Cl(g`aT@A36~khwu~8|n*d&lo?jyijl7WYU(MmmPMR6E2kZb1*Q{BWPSX zWT`RYG~6jJ(@98Jf~6M)Ts1?G`GV`i9$dv4DFQnx&wBmV87~}av{b6|M`)D7ZIpdU zLq%Y{Q5VQkIfL3sqn&UTK8KQ8d94Xjgr(x18jRT<~Ea~G3UZu_sirNBoZ~{y5 zw4uCKuAwcsLg6x@-2hwz;?!8nH-htH!~8lu?6exUKn~|$YI)DCYk&lbwpr@L z3|qIH0S{8bPV1zXQqUYbldxK@+-@NT-Ik9Iz&M!mNmDH5DJ6wOoHNiajB1ZfE0nv3 zc?79|b0w`1+yc%4Ju2OXmTkEmPg!|PRHz<}z>Y&7Hc2n2t`5M0FOy2W;eo|WK9_;x zD=;ChP>{=TaN~z8VM!oNFF5eUBX;@VL2kgn+bDd}!77ef2#?j^NG>u&z;YmS_c5UY zO`=?M%&HP~1D&UQ6f6Pxi2dkK39E9r@(X?RK!L(7q`P6Ke@10} zQ@{_2AFUeDcIKE>*?PVZHj0bW;87GFqGG-ROH;6-ay_h4>&vSv>ToCQyx+2(SMj+Z zo-9BE%N{BJab}Ac{-IqrjJo^e^r33?WPgeNO? zm`2>I!?<7^ZkGEf-i^W10K#ogE(3V5XsI7&23uapc{KZqO#0w?>|&o69wN(hDRKi6 zY{HRl^!uyu+fbRN1z_ z>-}y14YK1L5}cx!zqt;wds>BHupr*4$qbd8_@O^h5&~YzGv)ag%vs6|*)VGTg9pCF z@W`MfGkkL`PZBU3<90c}+SUN?nCJ{cE%wS*Mz#$2D*M2%nP|j)8d?Iv0-p;@8%X14 z(CZD>%+BOT&#-}*a~(LI+(9(*#v6=K=!eI#jc`n&9^t8^UrV==Jk>pT{ss@<@?b)f zf}v&z@O}@Udg`&x%7mwquwe0+<0b}!9E3Rxr+9iUPv5Zu1cXeTht`dGtE0TU-a7VM zCgUO={J;tbnI<`~+?@n!;q3+a@Rc6{NwY|A<>U(@0=itZ1e>O1d4Y_<;0TVnFe)6L zxXQ)I!Gk5AdW}IIgJOurEexIg;VVVBt10wja6snhhtPO8eA=laSd4FQ3foYRPetS! z?}vq5ej$p=D9gc7V3OfGO0ofZ@}3D#e`wQdO$*%D=wy{%tg`%S%p)16(rv@tm4!D%GcKg@d@3&qq9*jN^%uzNt=OFn&uKjGg1EnzXhF&NE;? z4v&?RT0(2rHU*MkB}l3b2Aiv9%}t!0c-=Kgu))V?e-+IwvqHhTdVC0&KFMNit`U@wZV?<`=DUq@UJgvsJG~|Yc zGiz{0aH;T<{IQ-Pr9pD6Px?T)uyI8n=S)m#1rNltA=X$am&)S!s7fA9f$QVqx(p99 zu){KxNKDNcm~imUfg$%-@&yG9pS<+gR$cIA#}tqZsWWLT)8qk#!*({jd#qIH8u3t) zKu3}4G!tf!<pUYq@mHS^A&VjSUP$78C={g?8f}XHyS&#J~ z9O146$@H+^o`J}*r;S$R;IHLgfWnlku+^>14i+7b59*^N^K#bkx(D{$hd(= zOzKTB%n6I|l|UE|Fcqp=*I4Usfk?{FUse1;_x-G=gX(P$d0dWzN%Ka%_Jgmm!c2qA z6`O-&0DiJ-IXk_o04Kd+FFyqIFyWgZbozwSA!Jd6m(R~-QW<4k;D+)~7MR{2C04?nXsw|t z(#K)ri7zRwty6DMVydQcDVf)dJ$Y1bvF6uTNmVe*lIMHuTUAZj;ZLqXG1}SUOelgk zN#UhpPkw$b9&sW`nnTXs95}`qc}S6AWTmGsNSIN)7S1q3YNebt zHzZ4Q+UH!8IQyC_6cxT6YzloxSj^@^BWBaYm$EU^5z9}{%eqQHkS@COJ_fLqQ2b8q< z8NdOYP-Ahtxg^f#M8z)%FjgknPcUrq5O>a?iknip@H;>2D0N^?>M%c z8Mnrfz9g<5=u095WyXOT-S963?1Y~}gjT(CnaKXSRfis|~mBhCY+aJsK?Fr176(@aYC-GjaZJF&b#^ggD7u0v~ zp{%$qPGt1i_ep*l$-mXLB!22mA}v0lb6igRVbj$$AwD5ZDh1A%7KgUF2)>aIKYye; zx1nF(igj)p2j1H`J}Z8MYPmo>*a`pU3i(3{yJ6*P=X&@8l=ub#4k8h`|WVv-Q9HA7oMk&;C5k~2?W}R(oQs^u0JpFY-NgF};L2CQ zzBK1xj;J~JD7Ym=FYT&nad0a=jG$z_NwW4v>x1+?S~ondUpo#J*kcW-GJ_Vue{28B z)$vLC*HRpJDGSy(@s_h2Eskr1Mj{ z$`HlCq7bsum7a%5MuqOP6-O;SWgJBx_}Eb$u&3jA!YsgF-nzzw3w$2Hixp3-xCnN2 z<%Ne1&<}zjj&C#7l|OZC%~R=DQa|aV(vHg@SGd7(OhAuKAnPE>>ePL;%^%C(!AHfp z&eJD5N@thGt#JxP&@Qeg^G=5gd_Ker^y5|+j8&(=VLG5)O~4Kq@Yme%0Z;05ZGg37iCjBo04ag) zx6%EZaNWdyCe-OrkLw$*Gr7cjKL$%H{@7x@9NXOZLownE4CzjpAj*P&50X6iOJyB z^1^cs>aXX9u^E#w6YA}xdh(YtB5k`>26q+dWG=Oz_}_)PsQ2xd)7*x8f?F{+)47z# zRTh~`Es1LYqAi)qj>Gsg@k|tG7$tad)_*n*PI$_f6}NgU0ji>`mH&&fc9Sgm%LY;O z3V>d)Smbajni=Pf&?^`8`jBM(L+69m8cTWYA`IW*4hR`ogRu1*H$pgXGUDL^pL_8l zV~8tXPOSEL6W5C>x}Q&LXGGo$F`zS6T%72cS2^`*qOQ#c>62&5BEhUZ}cLQ7C+{j2|q{BpRg{lD5c! z<|P{23yZZx3-8Ak2U@oS?NOqI>$2a0_A=3^i&DR14tyUv(9E;3mxd8u_aX<{YzJBf z(ZcmBb)eNd(6&3!?jl;aF1sE04m!{dJJ60h&^{$vcpGO-QZ@+hM*`8p`L1!`Tk1et z=|F3Cpmh?r-B(5Ahbtc?8M0`bKb7lwyo#R{|=}ZhxM<5=< zzmvrOBH${%%h(4qSnq{r!(6b%cNsXs!{O4n3Sd%ukW3kHveo&E2XhtpgwK&GqJ2r- zl76{~XqSZ1ZY3J7qxhK$|N4oRi3DYbML0?E-a)!&B8AK~ow`3nuh!)-l57EMXsETM8hSl9fv@a9QNDQUB+{CqkfRQMvElrA|Al99eIEU`x9pp-suWLQw8D=&kxlm5-ql*Bc}kNTtTcKz1^4coWtKd&E%@cAbzs*1WklUsp~xLyB6kEjaA z6wucMjVWXU04Mzqlm2{ujQV4&x9g9;NW{7Tsy_+eROlt&&?Jf2d2a!#Q~RZtsvgZg zrRrn*m|ol4$FmZi*^X`dK|NV5u`R9paYm6-!#%`$Zr2o$I6!jQY zK>cy<+x34oO8c*Q)r^`A_rpK-_V>e0r}k^lS5&T#?N5S#_V!-}nq4N4jPb>){r*d^ zWPR+sZ^JD+4Y|LyN!52HV9EN}dEbCrPWs;D1JP$u^iQ2F`JeX9Kv z7~sM_+&;sP;ht0dTYswRUl~>xQLe}E-(j?H)*n*+a2n!VkLgo@fHc(_Qw?K3)!#|$ zIp5*_bNMW&>}0=vWWW39YzFOj0sQ0oY*$QI)l6fF3NCs>Y4l~A!nUHL?kFMQcd9<` zi!dKq4*%@!V=m;>{=`$N{$m()!anx)!)}d1k#C&wR~(**kBArr#UdOvLH!~vdfj&J*H9jjE2;1^SVZ4P^h}~-JVt&_v*KMkyW z&Iq(8iGBzN7(Vj(Aix*lAIh0X<0_v40_`x-WsnDa8~nr1Z{Q#DZ>O^r)*t6R(hn0| zK7#|=--*5t9UDI73K*wDmt?yb1mPo}n*qe|j`Tz4O0prJa{-z_^piAENmUjg)|OsBXgpNRndO_noD@yq8NfPPB!Ly3z1fC9#8 zFg?+3YmyW}K6e20OGKYY2@U68^NHSnwc`Jfb8OXK>m}(ia^zjXNbOt_?do` z=o4`Q!smzr#z#ayN%ZH4J_&*y%HKyFnwg+(TnO|SnC}N@UUQtBMf4vNou-qqi0Cg9 zou;KxK=l8z(bp3F4WiSuH(H2(jOb95pKV0{osItvqW^*D&`tUI4$=47=+6-SDWbFf zFBARSM5krSI7W1ypDh1FprhRu(SXbIY-l+S>dW!PfCeA-lM9L7PyFwy+s4&I@3zga ze4=}9P>ckO^+3mQ;ZRJ|$+&^|4|OPhd5#L`PRVaATF2CFc@-Q~!)SL)ejaTVm-)8P zt0hwu6b4(%PPf_(zau!Ph7$o7`c!W04WU;rJDq~(STe}5B`I`Y$c)X#3`Jp_7fF=# z^P|u&h@gKH?4}nf+g%|~amEsN13$0H;dh>kLLZ4jKN*F78n}p){P-yJgeY`;55h^# zSEJA~qtHvD(Cebm+oI6F9)-RO=#yY(9HxmPpLu{`A7MHz;P;ZTpCWqmc14iSEC78W ziu~V3p`VCC|8o@jXcYRH5CBpCgqxK}lVStCt_$kG(bmZqqPG=7#8 zWfWPU%oz>|9QR4xbOMQ_j%59mV55G_nd*pk$(k`hwJ&)pWz9V&*%z< z#)muzPog@t;K}42;3?#>@KmZl1D-~{0v?#{2i`plO}pS>yvC-ap|UJjl@ULT$c*X^Yf zJo+_1zB@6_ec-`49zySTxc?4!9)^tlHWvAKc|qi+ul%>bi&}r42e25*Y|C3qBew2k2T+@XMsTLRn-Z)hq5Pb9AnPlD_6l@I8J z#-H+!!c*WKP+vZm5n2xyc+mNZgU7&iJ)Z!NgBL}edGG|doIeOn?g|?BS@zIhe5Mb|G5ak+*!EaU2jSyza6@n zlKjWtXexAdj=gVKoWESbU8o};#1H-0T$F|zx$sr+cfA%hbbkc@nSOtfp!s0^?aN*a z-uY?!(0Ka`L0q5ya|4z;?!Hj%*ioaAG4S_H)=L%mQqyPud*7VUY~AXkA2+qoP1kUh_cQW- z*njSk_n(W3?z{j3SEQN2zvKFdJI4Q^TQ_0xi|~#gR(H49a#h?yx#PwY)oRqNUDI5h z>h6p#RKrjgfrmVVZbThQxFsj|l?Z_Z9@NM3Ai_Tg-IvTgu2tt&&u-r(NIcSAxuLhM z>>Ve+8R>shZ;K&Ri*5iaR@?ldTx~2?Cy?H42t%{|-yw8YlemHUuis_#ZuQ^)&K)EB zpSwl)%|P!^?eCdet;T~7)zaHg4s(xc)DBc@(>NmVRP#3N8o6s~+cj(EZZ(cu%cp-? zvD?U{ak|=AZufE5AL#v%+)rK4hxNuj!so5%740ryE;cWiLBinK_hac4O6`***qpH#l{8ZZ$z z9DM0E_|~1l@c7p46ZA4Gargi9E^x(<|8pxil%tCTp`mNU?*1cpHPqdIaM$Y;Q4gEi z-LI}hhOTQ>HTzDzc*}P3Zdd)|=dP#!&rj)ML;TL2YHmH`7En5u-?^WpcS+stj->y) z|Nn*JuDH8|HFWECd#xP`-}S0v{4CU`|1aQ%=l}ch|9j=^9b1OELR@D!ouBJ{$EmG92!y_-=QPa~1uL{Vu=aHsrgg+t&5!blL3nD(28G02d+3oXQsH zFG+Mey3pMwMMJ634#55V_MH&$3;(&#+JD_&m=3?=evo%&BaWndHZv-9ODwf=dlK_p83o zcvs^a-0KIKq)s>YPxHldi~iTc@p)LOFP~@A{21dsj6aFbd`bN$jlYdkq3ly}YE$Po z7UMD*r#2-o?^S8LAK-9iphW6G%^_a7MfpMCu^zO9^?M2^)KLsnbhxT zyh<7Oz)j*$yMLPBTTb-9<949@-F+ioxN1KWwV$*!1TF2WSW4yntly1`c{WAH-^T=alVBIuK z8grB8KZegB{}jHZ-<^5AE^j~ix5%F(KLpS8?45Ov!b_7MgHP>$XZ|F-e(c@7+`zm0 z4D!{elWWkO`L*y-gYR^0_u7!Vd&ZG>`rD|JgFF#lef*vI8}R9qy~{%xLS60|rrdTJ zD)lh9tj{u3>V=Hkd@17tOumk(FGH(!@=SFP+$8;9=XhU@yH{qK@a{$=B`D6~$F zSKI?Pas5c+GUS^7ZB8g2%G>>F9h?u7ItxucFV0tq%c&f#Q_{GtQxE5RWWHn*)ciBX z<*ixu*NnGxp56VEX$g5Sq=CRna;-BWo$-k@{ghK(nn$_N_A7l&!1gZlDU+D|TMyTM zsq6j$Pe-@%i;>rJkD8B$rwtLtk&_Q{ZLD55Oys zr$|F?s^Y)hs=pW>L7s{_cv`rX*K4RFDSsOI`sC-~QRHdxCgk$Iu}m%ew_ELAg|{KU z0gomRt?LVDZ7;JwJh;r+-9!)0F~lh!W=kMn%X zgYeox7u$Rm-TNnRhGKpq93L*4|wfV>5KF?kz!B6&1? zDS1cu3UYnFe>Hh`pdS$>cNPJIJHqJIPnW_mC&SQ^?oD z50Gz!A12=lKT4hqPbJ?0KS90|ewtjb$v;n?f_xhJ0r(~I!|gV03ccfj1$q0B=EF1>S}{0 z$S08}z}J({fo~*V0N+Z!7@ka?2;V`z6uy&u1$+5SrHZ0>O;MvJf!}Z=! zx;>tUhfzKa9!`DnuMdwSkAe>;Zvr1h-U2?BybU~_JQ_Zkyd!)X zd1v@c^6u~i@)-CW@?P)-pOzLmT)Jej;Zd5JoamXJg&kR3Gz7us)$+iC{$m3Dx zH2GxsdGcxSH1e77OXLagtK@UwH^>*j-G`V%ll)lzErw?%PlRVDUkcAnuIo=2`D*0D z$#wh-ldnf!&vR=(7hwE@l#g%X=LeTvhUQ6rXHGNk6)3+GUWL3$bDxhOkA~ME9}bTs zUjVO9z8D@w9w#UN+|-18IJ^aUG|un0A#c*u*NG-igLfn^gK_9gJ__EQ`~=21hCBlG zdy)4-z8`raJeEAJm+yZZd6PKr!^tbaN0B$d`S-Ep5%75OUj2Oi$>h^wy-y=QFDJj< zG?P3Io1-_zGgCNG2W-$A|r1 zkCIn_r;^{mxSb$B4L?mj8SfjNCr`!uOljmN;FriZVjQlLyT6kWnr@IMpiJ;xjc`35tUej8=Y!Qp;r%~7AFN&j z)wTb6K3M$*wj(_stbQ1-=Y!QxU_YtngVi^}^?a~;6ZBKh2dhuRa*xUE$4`AG zychYju0Gd~d=EU9JOv&{egHn4{4jhJ`BC^-@>F;{`3d-B^3(8X-9u^MKQ=q2(p}IGrluKT^NFqWd0UT-ufE-ekhd zmCzNh;v+)p#v9+YpN|#r5KX=ikDn$_LPv&^-^6^4A#W@VxoM*RcB?;Y3VV2o{J|U^ z63DBT@vw}15e9NK`M227=z5~_+ZO%YMfnC5JbXu92aivXe^toCALN;^BHSd$<@0sY@g{&PuRM?Y7obsnzl zUC)!NKY{#Zs&fqMe@1ManwR^@$dr#f3;I)x{A1)Rl9xcf7Ww30sC=L?`Qz9wqRFcj z^Z6d+r?A`ykaxg#G@87GFB6zbel5HI!Cdkg*q^*ZUhrO@|A71?+WnOLTYOIR8}gkP z|0CpOaKLefJc#@i^1)c{xLw+<{nEC)zMloLKI-zVj{3O0*R6aDY>y96{!$TNrvdrX z$hRg>EamfE$X~>MvM;&ZcR{8RPejV>>NH`B~WC>gQ`TzX?yY)hK@z+n0WhM)Mo6UDc)hb2zTh z&&z0jJeFfK%J0Sa>*r!LUk&^14wTo=t8^xxgmHM1T;I3tMV=Mg`vCHsSiU34?=R<< z`wQgy`f3vS5RB(bq@fGqU>?h}vzlr=}@>p!|E6A^4Kfji|5ypQ#`8U{3Hr$g9QPh3KZosC?n@$*_A?gkrjhG?)Nhba!G5(W=0odD#{Rqxd2RSO@^e_< z){|$$e*Pr+XINf;kbhUs&(A;PgR#EdFCBD~_Va!8|1t9NSnkh}UqpT~x!%ulHhJ5M zzP;V#Php(DBkzIbk{$CcKknfE>HUQ7As>d{FG^lSw+r$nzB_>j$=?q8A3RL{H}*fF zKe*x|+Mo8=pLC&oHuS$Yd7HAn{!sEM<-Lz0{{Z7Zj$HRslgX>2&UEq(Sndhra{nip z3rqF@xx;BAJL!HP!~W$N@>Fct z&ysJ${%0`xM_3<5kdMLg9Yfw0$H^1Om*M$wD*0;6?=12!us**=-T=pY3(4~a{kZAz zwXSdXqyNh&zXJJH z+@;&G&hIrmZyu-o<%)iMPLXHA`HkPm$7B5eBtMSvxkmmM=J#LnZz}nAv*7o%pBb{uitxtb5v+IGA3ZKAPp;>Q znvnNFooMoD*gtnC*ZZ^2B#**!{D?d`w3fL0v65$y4!h|a@->*x@5xVB^7)hG_;Un- zKgfSZJ_nvxb$nh3`a1WJzk=uGQsmm7YUDc3b;)(U^nGJ(ca*Nrl-D`~$hF;(E!{T*vuu@*G&cdcSlXpKv@MmB4;Z z{dp{x%H-c*KVO@?ANCK8$#tB&k$+spuMd66v*USo7P;10NS*=nwTxWfXZ?V@J)So| zAum+P_h%RRZ`gkxB(II*^W)^-V?2K&zl`nV8u@1!&#c&Q>G-nT_S=t>cSHYslJ~}XJBWM_9*-vf9rHVd{CH(Q{;!hj{%{-lIjrCN z$lKz1;Yac%nBNR|p4V~S?3)b)$yZ_he31MK){}PR&EVb0^>zI)@}+nlf06t+#&b4# zc^uy^A^#BlUqv2<$J@wtefXMO_cMpczb@q)_?cWk=l47Lbv%DvC%+HdT^=0Y>GXPg0-sa>bu%2`zuZ;b0Px3@O9z;GJ<2;r;7mmB8lV8Ab&I0m* zSiZ~2-@^L8p8QR`&i$Nx9_A~Bybbn;KaqFDayd`_7LMnyvtv8Wj`7yzC4a9&rhCbE zV82$IJQl}YO~_xtdexqMmo((2C&_jHFn~NKo`0v17r^%ND)|+R&q?w(us&QQ*Uz=w zB-iJuLRdaJJ}0pMEJLpO2y(68k~{{>qYHTy#>r+Mi|Q zT`KwI@&S1kEXPmCS7Lqmn*0#9>+i`6;Cc2ex%THTa@}8L#Q6pte?9&zLf#7d^9JPF zpZ4VI(SQA1jMmrZ-$9hucAqEL=YjM67pl% z|8F4II(y0Q#q-NCa$T>^k!QjhPf|WNw%@_z zd$IkFAzy~)yV>NrKD2)X88BG>))8gkvPH<6#i`GGIV%VIviBiD9+A=mZf zZ}PvfUS`8_ijI%A8&2LA#}8%6wcY0Ahp@drMy~Z^$iK(&kba&;`=j+=qrBFClU(bs zCjS)mx037g)K}zs{PRC@eV+P>9p`7xz-9Kas|v0EfuR4!^HqUd=c_h(PwclJhHHHs zeg>X2`L==EQ!M#f{Aj504$cPQJjrOd)=zXllPMt>`gZI6Yh5mjj7z)vdHq%7`g!+F z;6gmv&*$1)3IRa+pYf0$8q3U42!_7h$``@$z;)x2k4FAq zxV9U*P{sXR?<1niu>{Tw=>0!5uYVV{O-c7lZqoc%^z#Y0<`d*UZW=^+9p}-;rJuvl z&zH#cey}eam*sl{j~5!3I-g=cvyxo?&Xr7SjY}O}KQ|edI;HVCWsh;m>vH+dxa21x zf7H0-b-A1}F8Rt>|IZtbcCOPO#-)zFzRO+8CuIDk&KlIo56|FCRyF;+bPaO(JCHK9 zAy0+(gzNIv^&W$U;rqx-XZHR14X*9JjMpPqDX-UI<}2-gPxHE7 z6)`U3lY;T7ME)M0e;+U|dw=*tvbiLB&ZCzfUApaEQb@@JT zT-wc^+kJ7-xFExa4!-_Z5|j7z)CaU3!huI(nF-Pb6u?JhAc?PkG#bv3zuUg1OI((dx| z?u(l?!L?oe6PziO*WbY#-+ZV_pEGO@*9wkFfREYOS&&^s%KpCzat-I zT=HGBO4{8++qmSP!Fj4^M zokn;*+D$$Re$~{G{!hX7lBvARg}-iH7GW~-Mc}-=${LsX&4|~Dm5fV$J)ct3xa4~x zU)Q)CwXztpHS=T=X85fyLx;wnd(eLomrF*$8pG9 zlb7)clZM>%mT{TiWvKHW`A+zHs$UZIx0}4wk3#*O#_c#CqB@_W&S}aYEF!%O1pcJF z-Z&#?MgMbMuXH`R$GFVbIrP6Q`3RiXs!9G2yeau4oR4k=*X0$7_2+5wcJOKBvG94O zzKl<9Jn!rKU|K&O`Hhs<`Q2_@<~J9{Z9jQD{1@^~I?m)5;aB0>pO?^|vX%V!t8awY zh3j%TgVz;JDW8ITcgpMYU0>reUzKrwHP*O{TOTank;Wyz4*4nMdYy}2SDMphrH&qN z%%%Ju>{nkmE_vN=zehd+{n=n#`tvi+qir@Wbvj|a`kMTB(EZR&-;?Y6XZm@loGv4E zUdkqEx4oFWw0i{Sm983>yuL4-yR!V&?dP>_SP#SDQeU=fy-!FP<5GWZ(0y@JMXECh zb@cuLQb+Q?1>F}nHKx3N?zS`4Z&}jkV~k6G5@p46)3e59zVtlaaO2YMc+`0TuIp`K zJRj+GLOQ=Gs6UtLY(SmYsZM3o(d%_|evcr(p7QmO-$nInV|&?0`Q>3Uw}HS(@*VJ- zbIf83jVD||Hh5AfOKWw3np^C?q4Y<)hKhQ*ap{SzdebI_Dzg zlQ2Fxs`~zFUiW+9#%1{q#JH6r-vciX*M6Qw{rV;^{aK0QisqCLE8zR_B<1yW<+H}6 zKhb!7KFGM#*YgykjZ6L<^5cw4Uatpx$++YT;q}9O@(DFV_r(5c zvvH}fpHKeOxa2F!f^gH<#wDK*$6@>7I?np~=mO1bT?D|7q&Q^qA<7|)}< zj7z>U>I^n6`JTuRH!k^V82|CcC9lT;lZ{J$73#cVT=I`sa$nrE0IuUXAFrF%Q~m?w zKOsK{|B}2m_D8#^{&Lj+&E#eL<1qez8JGUQfc-|U2c);{Wa7Nhim_{WBV;; z@=`wq^(z>cI!95bs&SjIWnA**u%CJuuIa; zF8P14U2Hcl`7OxrG%k64AAi4b$zMYLuyM%`#(MaRamjy%$ES@;ex)o3H~nc`@WtPsj1bKJpFlH1b36ENEZbJr6Gn*ZshkXtxsO zFCpL1d0J zkhjHr?IM2`ei1I?)4~1wC+Pe059QO)ZaC&c^ZI(cgmIbQOf`L-2go0R*Dx;a>gQM* z8kaijkZ(tR4*nGR^xD4NUdE-q?r#Sh4=oqu$CI~+^mQg1m-QhL>%%PLQeV#xtS~P1 z=c3LU<5DM>)qQc(N5-X&ZttHNmpU6!N7r8+fBjtXKFS|K{*ZC0e<+vx;-=%qrT)-5 zAr7RG&xKz$F8xnN|8E+X`uh4h2i9NR?tVg@yv8NJ5XYbQ8JGTKsO!GC>3+Db|F!Y_ z*oZs>&gXO@e+B*=`MdDBOW?83(=pOPX=%e|_}-Ci#nS-9B`_y5f9V zaje(s`uCn{k{?3875ONfFB(FwpMRZ8o{af=k9-5pYw6$3(Dm(UEcgACPeJ}HT=Tkr zxNKa;=Q742OD*@nO}d^uUk{Is%X%^s^LvkRsgtq3&lfQ+`4ZW^mo+Z=Pmr%k-m-zu z*EKG6bidKmxYQYsd@JLU*Y*E#0bsuEr%_9LHC^jZ6Ln^8JlVex5F0xUMJv z!}-JKO>}yuu^iXOK^YCm5IIqMzGYWL)b1ihQDR z$#3@M1FMWnzG)->gCygU*Y$t5amkNCUY|d8zw`k-75NMOTjY6#ko+j_o*txvxLVxYSQT{nw34{il$B6Rz_WR^HcHPyQw5YY){~ zfjS4t_rrf8zXJb->i-Y*uaHNhKLv37qT6+m7QUZF$-jV?A=kfGRh7JGD_^G;`Iqp9 z^3 zgWAuj$RDCQdOrUwc?$B`a6G7WF2M`Kb^kCB%eOS;_5P@JDX;s7rp9Hx9gqIEGA{dv zi}(5YecZU@8^{+o^(N2L&igR(>F`m;WjoT(@lG%+%Z2`w`B2>rw(~!HD9+g`CIToaOs9D^2SooO{1ei z-vU}c8TkbGt$aqGTV!08SFIyGK&H z`|n!k8vGvPGM=dz&r-%^y`Aus|NYA3zrbsd-xuTa4ai@HH!^P9ZEalI&D7J^=}6uN z-h+H1yboNL`#y~4Ad{DN^>f1Gj7z&4QD+j>Ie|J0D1QX`Hz@xn@*h&Z_S1g8HdFp_ z^#kVGH?k_!rdfMzs4A<@N6;o+5vwm#?2j{yh8|`8xPbxQ?f`TM(~*!}0lb7`^Dwpq14db%DmFVrg4%Nwn_XFBezA5sLQNAeh{V4wy@^O?uf_^5D{{~+{ zuJg5-d>Y#Q7B1t{!ToDm%Fovilutzd56bK7mm9`qe7@`L>*U1icpd)_`gkuwKDe*< z62_%JdY-V7ajD<3pU*#FT$Y#KZ?lGRsiWru+ZmTSrJwb6I>L2*xQ6*1P99a$=Vz10 z!js4^!uOIFsO9VYP96i#(cJ%B$E_LqS%7>mypVAjhhT31`(=#F{ATX&UC*OPeVcy> zc^!w1=ua#18SuX3$?%EPZZz7RLH-ha4*BQsH^~2nFDI`tz|YtFWrqmZts(g%Q(zOKj)C28|dpVG%oF~&g*@taj8>vu=kb5 zC0{+i_w~jle+l_b#wD-!S=wP-@>Sw|ode{(;NKgUI(q+^6UL>^V&u;lm%QGO?vioI zml@)|xapd4$?N^LGPex<_}1&VdxrYQIgCqweKzmm#-)CpVczdEE_uD*W*Os>FEzsF ztCPP5k0P%)(&wYee}q47T-yC6lh4N(mv(!O^4{CHd;5pr|OS@?phnvP_92TRWnOggHv_Elm{o`=B)Uo4VCY^kJlb8A@ zQNJm9&KG?Bw&YdePmo8$W5|cWd&9Z^@#M2GUvHT@GComxeSg*&m;TR3{f)+D9F7Ow z7dLG;F8M~|LLAs>T=H!zdEakb@*9vpY+U-2g8rN}F8NC1eVq%&B_ET|`%UALFBtDV zcN_m*mZNyBc>g%Rap`B(?B0tRmwarz_mak?-9VW4O2(y*UVl;3xYVgQ!RPB5m%Luz z(bTx)UqrqYT$k^pM|_>$l>Z;{!^tnh#~7FX>-9dfj7z(PC;Ixc;o5F&l=qb;FLe?z z4qJ>%ot~(ZOm)U#d;gC7Ts>d^CV6xt@Ap3Hzsquzc2m%9QR6b6dLMvt#-%^o(4VSs zov#%1r;*7^9X;RpsBx)t9CbQSoinI2nEWPu7J0=6u9%yW$?L%n!gc@CG>gxt8khcL zp5*GZg ziu$w3^?i%AROd_7`Ix-KWZ%zZ@+R;vsD5dj_fIu>S>FOUzP)H%{yP?R{-!#sqU4v{ z@o78%UDw+P)G26Oe)U7tDMo$~UY7ixDZXwcxGt~Hqr5jHUkvX|J^`;IMv#9DUjf(k zQ2)-vCUSkhd7?*K= z65|$cT(+0gBEJ3%Q$rm1o_sg_ zC*x8_?{{>@xYT)kny>S_amnlbj;N=UY4_oo zk`4sg8Mpb)#wA~VRwy3mN&Y#!KY92oK0nyF)Yre4FxI%#Pey(UdCml1XF6QxSNBIt z$$MkH+D85&*5fZted$lkJ-+@Sn+?M51xe8j!pA2BZZ!N|9OYr8EmKTnhY z3Li^86OZSS|BT0L@LjjNIP_<;ap_N$*L**BQk|e|9Bw*6`RT}?p?q27Z&Lni*@SHi^nC%-^Am(uN&=PT;}VUIljGa>3A>lB;@Xd@(@{Mfa+k1$7DEujMeg9(&)jxsy@sz)UI&&$XbG~o)b;@VL@!tEC?}Plul>Z*< z+ivo0X!kGje{kL>9G{cYad-gxlM3Wb;PuH{VgLRpT-Wo2!hXJb8kg~3jQ;mAF3U?_ zj|?#``A?CbK%RYpum2)k`@ah3B^Q~z)UOuw`Q^r?etXneWnA+5y7(jGk{^!zm*n%| zdyLEanOfL=ann!6rA{jHC*a!u;^=>_uAyJMb^QMvye#?4@CM|+N+WLSOx_AU5YGGO z7brgj`DNrEHTLy)l4rzm{;%Y5@XX!(@9F$z$Nsz&c|6v)=Hzv8JoYSkb*zUY;W}Si zEBN*%Qa#-&c! z>%M{SjZ0pSD^3`fe0Su}z;&E+b@FwJcK6@aE5IY+I&MYs`dnkmMECat&?%7 zQ~3>Fr<-v*ZheeP{te^@z;%89bUV#wTJ<5H(hqWj{e&Qxau>Wm_90AD~p6#h23Ztq{fbsTCG^zEilJ`HtFQC^qV zMdQ-{!HK@k72|e!Wqiv2T-ufVl|=uz0Qu~Y_!D9X2&j=AYk%BLdViSl*w`usDL z{{i_}%5TQ;@My~G-*?c@zw3Iae~050%I`t_1yp~m?@nMD<+mfhmhwMk@xQQz@>`JK zLHS%oeSRP1KScfq%Gbbno}&D6KdZTM$(LT?zPPE4ajCC=2l)x(lJA0i zcjJ=ZnBRSI(=%|HuZ-?r_CccVb0UdoGj7$Cxw>&Z}f9=P_iDW2CGn!L1|f_}Cz zF7vC;JC7Nc{%k<~&QyOyobSh2^4ajUrjE25R>bE&HZJYz`%Rx4mv+yg-LI(ryy3o1 z8u@y7!CwC7GCtC76xuCkTS&e^19b z4&xkdT;@yHE4@xd*V{H|w+!++U(qqXZX@y&@TbZ3dajYwuKr!giN<9-=cC=JRA*36 z-|oBQi{aa;&SuovN%{AY|B>>k$p1|F?Z{uDeEpAne=_y)-!r&x8Qs6b$mfFV_$Ooh ziyD{t9f~?Zs#CF_uUnJy3y`l%`FhB=qx>c0pD-@lT^jl`z_|3M(#O8tII92Bv)*4J ze*?ah{8eoKn@oMX9qlkK?Z%+pT~ucw>ilH#(*GcyzfKvK`o(cvchR`ie;@U)7`N+x z#=b7(CSCupBA*Mc%U73QdCC{v=zqTo<*T8+M=1XY^35n;5BYACe*^hvDBl_D`#AME>U4o?Kj#i~ zKXg-1lb8Atc-=k3xYSvVI?t2m+#*%nd0DFe8|u#^e`L7NZy-N5$ooF3-v#v#QT{LF z&ryCn@@bUMG}zbAg5|Hv@d)yHjLSI0U>xo>Zr9I}#$|l+Z}s)d!F8NpM7xcQ=WtP7 zKRXzg_45b!wEdi|ob zE6X>bnET?U1|~0c^tio+ajA0>H*jO?;PrVsL4wmU5=B} z$3hqhZ z{wwJJ&*baj*|A^L`R(4t*NGti2i}qVo~}MWj(iyWee#>|qvWHy`#S%UpMsYds%bCmL_$p1-sJ#T;0cw1K@8ryGf>_4Qw_+of5^3(8=#%2GY=hdqimpV0)-4{1K zXk7C8{zz-%l8;YzU)&T8*Y!E~Xzy|4RpARvoenN~D38y-L-{D=H&b56=L_S~pLddd zov)2|aD>Caz(M1ZzkvKn^0uG(I%kbb9ep3|vT>=i2Knp8C9ltqS+F0~<(2z$Uq2^Y z$88|yw+49v{9$rkf4Z6a((Wr+eEmL@Peh#;D6iu=&A80h1L)^G@{i%m$?I?T?XEH| z{n7R9BjZwk2l88tOJ0}Pm&PUEW{3OYrrpLRuj}VYUj_)PNXuY7(k`C<6$#-m*{8pi|g8kceS z8~G&i<~x1;P2{h^KPNv1|H`;+cOP8G^H+?|5psQhJQMb>nqP%{G4eEcZMcqeLjF1O&G7N$S@-z*)5tr(XBoHc z&WG!`H5=pWyhX12hh5~kkpG!H8vYMl$9W0*lNHCO>gB%i?dBt23olGwYp>7iajw?c z1}}%a&Q}up(~#<1LcRrgp>KWt_T+WpUCDdEpMrC{BgqG#Kd+Flfq!J`%YLa-Mc<## zD4&A-Van@%_!r}{Ud5xIr;ST}y)X2i#wC9d`K!hyf3~pu;-*Y^J)z^@FvWXzTzKJcK$il&`YS*N>(AK;)-Uz8&(flCOo& zqdJpNXBFjh{?E7j5#_%@ew)e5xTRs-_8OOQtBN}NsZJ{DoTmH&vGBdg75#mCNKRA-tWDfap`BJ{oX56o#v<$MfthNH>Lbz$akguAISHi{0ig; znY{Ef2K^joT>4r5fbZv2@|WQ=joUhNjZ2*!$S;BGxM_bjQ@+MQ-|qHwe6R5~E}DSH z2aQXAk}zMV;M(qo7>5g#PeuL)<>SZu{^Zx=8uw7=3yM)OnHW zJcBxmD8B%CJucRM4nuweDNxPLP$$Pe9p1x#LE&!(WxYn0dLsU^l`{40GYRov?^<5FLr zr`8&m{9@$S!F3$+#k(K6DaGWa&aVYS9Qcm%aq-@Nr@Z#_nsI6OG}^sMb;h7hF+4x( zezo~wU%xC|`?(VNM=0MP`Bvn!;O)|>(~I(Fkbjo)JJIeK@`LaM@+=d4|5sD}rr&$t zK>jLxb2@dtrTlNmAE0~%w0oAkCOj*i$8?-q{^0wQk9;mX9IoT9bt+Q+59F&+zBAfw zLcR#z#?+DhOfvQ}-Hpro^XL)Z&)(!i;e*H*!iO2R^~V~Q`dg8o0@wM~e$Fy^sgs6& zzF}PIG(PJ4xjY?zpS&OP8{pdRDvZzmbo_{^BmD^meY>YA{~7B1WAf6^grh#61^Y8? z_bl?o$^U}aBL5fOmOT4JU%xMTet0~2ari>=ig0~?)_%5y@1T5t^yf$Nk?_CBKSiDF zc>dA-^WaLp{|}Hi%Iv)^T>F!ZI_)X1`{C}!W&FRy`1dp(+TRxQ^<#}oe&mndhZvXq zrEK2E8kc;9pS;f`KM#M^xYW`8_G05wC+V24^OkX0-=c%w-!mTSe=hHO-!I+IG)?us z8F?MI6BxG?@{^N%{=BI#{TYusm&td+|D`&mC;K`@$NTTvpJvDX<1*y0z^lQvpGl}w z%j9Jo;)A|UGvm_FJU@GHZQSNN8kc-yzh9H; zEJXfc@~!X|RHriP^rHOF$PXmXav~6#M#8l}PomCil&_5ZV)C}|x2euntZy600~oij zO&z=4>G8;|aYOwds7@BtIZa-1QXn+_L;eW7zy$wuo!>s_X9W4n@CM|k;O)s9pg&KN z=b!4^8x5EFlKBlU?0qujgUIXiw&ry|yxi20?QSi`N1tys|10*xA5s1k@>`5ce{?_m zrE#erJn8$n+qmR)e|yNdWoI6nIi03GcfoUl;iwsomLV_om59Kbr-8ogCN>bo>*M55l$G-S_%@W#iJ%sc1LC zxYWORpU>AbF8N1Kd5Q zUu9hK`;kvFF8RrMeSV8^$q)a{d$MuK@4#`+ZsU?aiF}H2$^TKn*EwQb@-P1GJ=M76 zZ|3)Y&bZ{uU+|u0T=HGBdH>tElH;_i!V zT=Fgd@cE!|$-f=$y|Qu1CnFzWT=KIqzx9kuzV=05C(5|whvEE5YvYn%i+r?k$-j&J zTQ}p9FZ-wa;-(nml5d?i#DM|ECBGQ?IOCEZQOf7X7?*s(OWxy+OJ4uZ>H0ri z*Z(R0_rxXtJ@R43rGEK)e6FZ*$=AH-2ru+N~Q(s<>BnQ23G%oGFi*`Rt$G;{oblun4Pd*xc*tl)? zxN&JW!{5HnS-8%x_CM>3{^z>9rrq$5^QGg3+5hqR`{7#uJB&|l%BLdVG@bmTCNJ|9 zQPS7f*8y5T74?Uiyv%Q=n?C#TrsF@6UqSwaahb0; z%-0{rrT^{z_5Ha{z5t$ms{gr;!vpAN7+jX4)K5hHl9YcH`C29~?f!!L4Jbbz`R?Rj z!iSR|hwE{l_Ve&8-|tnFuRGKGI=J>f4gKG4T>9BCbfoU~$LaV%^7oNHVqC^2i07Bn z#-)C?4ANtFd_mqGew};`Jo~iJuibhb(FpSu2G{wDL%Ss@|2*=wOkVnvg8B_8KM#4m zPpyvg2k;S;KMtQmo&(Ee9eEUd5BUr5Gvwo6@$-M3JovKrAoio$&&Kd3$d!{3L?_{;M`VH_8IMEL~dzoEPy=N~1{T-ndpDXNo*IyWh=b#hPlzo-5A zJj_2XO8!)7?|MI49k;Lq?{z4z^_!CyF5vT>$P3~5w+CG7$D{sm%4_{s$bZG_tkw4ijK7m)gM^awrt2y~V9M^TAI$@~uEakP%DDnXneY?6p*8T)hXCCFX z&QkKtzD(dV@+2G&?}Tgp2-H7Dd9D8&xz@iyo}AG)oC*6OtsjN@Mc}+#YLgGb`lk2g z)jH9r^Elc=<*Z%h)*ZQ&K5jZa~jOr(% z{&dP~{ddWWVL7g)I!UPW1?9EQesUe>pUKM<@yqcH)lWwK0G_XSob!@v{o>^Pi~9Oy z;5yDJs9%rr+W(g1I?jE_-z?+n52X63s6UzVT7NdV)_;pUHk+@%g6gNC{->1J`bWv1 z$?NOer;a)^AL%^*fMH!1~;U>IYFj zj`CW69J!A3BJu+F`*C=i>PMjdCdzC5ugJCjA@ZMOK-}~r)sI5`OO)68`SE-c|)@%+@}ZU6P}73gyBi#q$M&TiB>V(Q3z1u<@?j7xvMM4dG9qS<{vuaS>|--K)b z|3JIp_^$pY9+xGrFxNHirdn_v=hv~Hf5f=-^Fy@Tit0q7PG8Dr%HjJTNB%H;1l4JP zIxm{MjDHl?pI0d#kNgVC>-xXWxb(j#+Wm~YY);?LedLGWhm1>qbUJQa>L=&&b$&H2 z%RL&){ep3+a{%v;TsJOt-plRlWWxN(qm1rfk$LWmn@YfSJxoPjm#2DM9$)7{%CCgi zqWWb~{|WK}@WJHu;jfYJ#p9LuuItrFjKg}$>;3$9Q(l+j59A9lZYQZu4El3}@>(Ys zey;s_CyyV`d*M3H@pxR7@>)mdTk8Z1`Z~?2P7)qJnNFQpa^3EpC!dDr&6miR;XKA1 zxb{B{k5^G%`~Q(~S>N_xeb_>Eiq7}*^^M7g)?2(DIZXK|d>xae@0~H_7sqI^Q6l4X*vyzxxn0d8xA>$ED>d zuk-UT<+cAUjZ3>(!~D2)A#VtOlIrim{KT2O^k-N}_r*;kDW8J;%aqstEHp0t8HIM2 zP@QY2^D%i5JpRVik^WrID!p;{=c9ZC9$%pR<2dg6hx`*9f9721>&a-f_Wuoitq9lc zv>MKf)-ZW_{)$1}=9GUJ^*c~r$M;#v9}k9_4NNAljMtB^P@M#{yPWdF^7%UJOunV3 z(AU$HUyj$0mrXv0B(Y!0^t%6L9fuT*XFl?ndws47`By>jEy>H4_1=rTIQsJ}`Dx5o zJozKVeVygxP4asGf_ygKFE~Q}D9)3dBF~Ne=bz*sVmr;e$hV{8)4Kp3lYd&sdp7er zw~eFjk9jYVj@M4dE6qkb?whUCC>`&bj=y1!!)=`n>G*bYTxat~((y4z@9gKuvHtNQ zeBMFEP3j!Q=P=f#y%2z>!#zMScUGvG{Wc71LVlXX`SS1-iMRNJm5WMtAC=6xeLbzCe-EM~dFm*in@Juu+WS^=y)HT&>$}$1``*Nm>wQ{Qlk0s&u9EA0 zFk0YwSnKO`$Nk9T;(b4tlI!(u+420Zb@cj+3gmhnL49)loPS4h{apQ0a{b)PMsoce z%N}z5{7EXges1Ivxqc3$7svS&R0DA1mzRpSIHCMx%2z=LhB^KgXGEZ8ssVP7UZe$?&N9kIC6a-VlsIc zj;j`s2jQ#9BjCy8QSbxg(eTscG4LDYad3TJ(s7H2mnm@PcqYIj$rIsi$dlkPFYQ?H&iT^wZ~e&ieA-xYJwKK}uIIa!lI!`XWO6-U zbd+4r=cJMA`IF4yclKY;R}?1K^8i)I_4RlZxxOy$NUpD2`;qJG)3N0Gdh`DPrq9l} literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/.libs/xmlrole.o b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/.libs/xmlrole.o new file mode 100644 index 0000000000000000000000000000000000000000..19d8f6ea546592f781517233bc602f782a7e8cc5 GIT binary patch literal 83432 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 Ut_sI>c%{N|T{m6fxK8`O0DKsT9RL6T literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/.libs/xmltok.o b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/.libs/xmltok.o new file mode 100644 index 0000000000000000000000000000000000000000..9a8132a614b866759dee335e33c27d581fa05598 GIT binary patch literal 423856 zcmeEv3w%_?_5a@8O-KN_JR$}JL5TuBNlTSTge)ZVuH7J3P^;pjQGC=YmAeFAVPSVo zu5mS1tyrJ6w)I)5+87_j1mvmm^npqRv0|60qrNG!Yn@turlR+Yt-N+!WY;ErEZ%Sd zdcBl}OYK+c@kCl4oQgqdETm%UosIL?=6dH!J08hxHx@3X3z`VexJWV1zIyS%sRKC8UwaQGHL`jT_R_}OrZ zdh2AOkF2Ya>r&(AQC@VOH+icIehbMj8ZGJ4hc9FQ0-Q)5S>7+Pm;M+Vb1 zo&G-c)>$+fvP&rJ*B6=*1{VCGCB}fR>-4LMbwGMA5h(KVAxzVtS~@>4Q8VOtV4UiJ zLP^G)@j`iTu;^9&gh-Wlgc`pTl>v*dVG!Dk;WK-ou7-aj*HkG*jWM$*g+$8yYIiC{ z;>f{g^W$5A@e|I_jBRSH$jy%!UFN`Ob5?PF7x>7{ zw{@Y!B&EFQV>NaMVN3L-)&wBh3M@>bp@MF1glpBvNKSM^dHdv1PG@wk~ z^(cPhjiE$^H~hO~#D4EpZ#|pe&$izC)c7?-)L-DoZm$gwRv5(aBwQGuUyY9<_`z=Y zVDwe)Py8h0V&0iA5qbN0D8C^WX*Aq5hcL#?p~35D{;0Pu!t0Q+f#=XeT#Fj(gTE;2 zPd;w(wS-6eXSv{KN%)P(1H8|y6!qKqm8vT(+;tMRQNVi5pD}C%k2Ihd_kXJK6ToC> zx8Sp%;X(3+(XFu29PT^=zM&%_G7d8fxD4YFoZ7>IV?Lj+KaF{U)$C55Akk0rBP~kh zXqxD#RR1leqBZWt-St1JGv5G%N1OAD6}5UUlCpK-cg%~q$t6Ti^C@~`D20tg?}vCw z*!yw#( zpJ~g#Rizd`3f|Q<;@jlSZQzuuJ{FwdTfINvyygYW03N|-wcxXcPmyEJK#F+cT4u!( zPvESeu`Fm8(4zm9im{qkT%-kl+3 zeQLcUza~Nl)S|EESQHCf0A0dUS_IAP3`LDSg@T%~Dp<5O{3O#Yxsuk;kg-#)lj^Mz z21#2h9|dRolS?Mm*>K*f^Q<*au7@$2Cdofr^pW_Ks-YH~SmD(8*&qa9y;25Hbv&<4 zT3zJ2E$B8B8Ns4=^x;8c0=hdIs^=}d_!l-t&D_YYgVpM803jCgXsgy8*&)9_Fzr-& zHSSm*U3aMY1=0OuK$xFOdP5shV}8Jgq>5{7DOKw|qvWyygiC;Hj5X~}tMJb#R~7|G zs7LU^qZKVsW6x6pt0pNNQh($5jr9}n!~fEv3ly{aF36-hE!ybSispuYuNmFa;G>Pc z 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 z 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 u&iZ55x07&wYHru7Bjk3yHDH{_}r}bmJ@l literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/ascii.h b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/ascii.h new file mode 100644 index 00000000..337e5bb7 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/ascii.h @@ -0,0 +1,85 @@ +/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +#define ASCII_A 0x41 +#define ASCII_B 0x42 +#define ASCII_C 0x43 +#define ASCII_D 0x44 +#define ASCII_E 0x45 +#define ASCII_F 0x46 +#define ASCII_G 0x47 +#define ASCII_H 0x48 +#define ASCII_I 0x49 +#define ASCII_J 0x4A +#define ASCII_K 0x4B +#define ASCII_L 0x4C +#define ASCII_M 0x4D +#define ASCII_N 0x4E +#define ASCII_O 0x4F +#define ASCII_P 0x50 +#define ASCII_Q 0x51 +#define ASCII_R 0x52 +#define ASCII_S 0x53 +#define ASCII_T 0x54 +#define ASCII_U 0x55 +#define ASCII_V 0x56 +#define ASCII_W 0x57 +#define ASCII_X 0x58 +#define ASCII_Y 0x59 +#define ASCII_Z 0x5A + +#define ASCII_a 0x61 +#define ASCII_b 0x62 +#define ASCII_c 0x63 +#define ASCII_d 0x64 +#define ASCII_e 0x65 +#define ASCII_f 0x66 +#define ASCII_g 0x67 +#define ASCII_h 0x68 +#define ASCII_i 0x69 +#define ASCII_j 0x6A +#define ASCII_k 0x6B +#define ASCII_l 0x6C +#define ASCII_m 0x6D +#define ASCII_n 0x6E +#define ASCII_o 0x6F +#define ASCII_p 0x70 +#define ASCII_q 0x71 +#define ASCII_r 0x72 +#define ASCII_s 0x73 +#define ASCII_t 0x74 +#define ASCII_u 0x75 +#define ASCII_v 0x76 +#define ASCII_w 0x77 +#define ASCII_x 0x78 +#define ASCII_y 0x79 +#define ASCII_z 0x7A + +#define ASCII_0 0x30 +#define ASCII_1 0x31 +#define ASCII_2 0x32 +#define ASCII_3 0x33 +#define ASCII_4 0x34 +#define ASCII_5 0x35 +#define ASCII_6 0x36 +#define ASCII_7 0x37 +#define ASCII_8 0x38 +#define ASCII_9 0x39 + +#define ASCII_TAB 0x09 +#define ASCII_SPACE 0x20 +#define ASCII_EXCL 0x21 +#define ASCII_QUOT 0x22 +#define ASCII_AMP 0x26 +#define ASCII_APOS 0x27 +#define ASCII_MINUS 0x2D +#define ASCII_PERIOD 0x2E +#define ASCII_COLON 0x3A +#define ASCII_SEMI 0x3B +#define ASCII_LT 0x3C +#define ASCII_EQUALS 0x3D +#define ASCII_GT 0x3E +#define ASCII_LSQB 0x5B +#define ASCII_RSQB 0x5D +#define ASCII_UNDERSCORE 0x5F diff --git a/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/asciitab.h b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/asciitab.h new file mode 100644 index 00000000..79a15c28 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/asciitab.h @@ -0,0 +1,36 @@ +/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +/* 0x00 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, +/* 0x04 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, +/* 0x08 */ BT_NONXML, BT_S, BT_LF, BT_NONXML, +/* 0x0C */ BT_NONXML, BT_CR, BT_NONXML, BT_NONXML, +/* 0x10 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, +/* 0x14 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, +/* 0x18 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, +/* 0x1C */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, +/* 0x20 */ BT_S, BT_EXCL, BT_QUOT, BT_NUM, +/* 0x24 */ BT_OTHER, BT_PERCNT, BT_AMP, BT_APOS, +/* 0x28 */ BT_LPAR, BT_RPAR, BT_AST, BT_PLUS, +/* 0x2C */ BT_COMMA, BT_MINUS, BT_NAME, BT_SOL, +/* 0x30 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT, +/* 0x34 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT, +/* 0x38 */ BT_DIGIT, BT_DIGIT, BT_COLON, BT_SEMI, +/* 0x3C */ BT_LT, BT_EQUALS, BT_GT, BT_QUEST, +/* 0x40 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX, +/* 0x44 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT, +/* 0x48 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x4C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x50 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x54 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x58 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_LSQB, +/* 0x5C */ BT_OTHER, BT_RSQB, BT_OTHER, BT_NMSTRT, +/* 0x60 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX, +/* 0x64 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT, +/* 0x68 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x6C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x70 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x74 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x78 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER, +/* 0x7C */ BT_VERBAR, BT_OTHER, BT_OTHER, BT_OTHER, diff --git a/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/expat.dsp b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/expat.dsp new file mode 100644 index 00000000..ef485712 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/expat.dsp @@ -0,0 +1,227 @@ +# Microsoft Developer Studio Project File - Name="expat" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=expat - 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 "expat.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 "expat.mak" CFG="expat - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "expat - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "expat - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "expat - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /EHsc /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "EXPAT_EXPORTS" /Yu"stdafx.h" /FD /c +# ADD CPP /nologo /MT /W3 /EHsc /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "EXPAT_EXPORTS" /D "COMPILED_FROM_DSP" /Yu"stdafx.h" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 + +!ELSEIF "$(CFG)" == "expat - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MTd /W3 /Gm /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "EXPAT_EXPORTS" /Yu"stdafx.h" /FD /GZ /c +# ADD CPP /nologo /MTd /W3 /EHsc /Zi /Od /D "_DEBUG" /D "COMPILED_FROM_DSP" /D "WIN32" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "EXPAT_EXPORTS" /FD /GZ /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "expat - Win32 Release" +# Name "expat - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\xmlparse.c + +!IF "$(CFG)" == "expat - Win32 Release" + +# ADD CPP /D VERSION=\"expat_1.95.7\" + +!ELSEIF "$(CFG)" == "expat - Win32 Debug" + +# ADD CPP /GX- /Od /D VERSION=\"expat_1.95.7\" + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\xmlrole.c + +!IF "$(CFG)" == "expat - Win32 Release" + +# ADD CPP /D VERSION=\"expat_1.95.7\" + +!ELSEIF "$(CFG)" == "expat - Win32 Debug" + +# ADD CPP /D VERSION=\"expat_1.95.7\" + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\xmltok.c + +!IF "$(CFG)" == "expat - Win32 Release" + +# ADD CPP /D VERSION=\"expat_1.95.7\" + +!ELSEIF "$(CFG)" == "expat - Win32 Debug" + +# ADD CPP /D VERSION=\"expat_1.95.7\" + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=xmltok_impl.c + +!IF "$(CFG)" == "expat - Win32 Release" + +# ADD CPP /D VERSION=\"expat_1.95.7\" + +!ELSEIF "$(CFG)" == "expat - Win32 Debug" + +# PROP Exclude_From_Build 1 +# ADD CPP /D VERSION=\"expat_1.95.7\" + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=xmltok_ns.c + +!IF "$(CFG)" == "expat - Win32 Release" + +# ADD CPP /D VERSION=\"expat_1.95.7\" + +!ELSEIF "$(CFG)" == "expat - Win32 Debug" + +# PROP Exclude_From_Build 1 +# ADD CPP /D VERSION=\"expat_1.95.7\" + +!ENDIF + +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\ascii.h +# End Source File +# Begin Source File + +SOURCE=.\asciitab.h +# End Source File +# Begin Source File + +SOURCE=.\config.h +# End Source File +# Begin Source File + +SOURCE=.\expat.h +# End Source File +# Begin Source File + +SOURCE=.\iasciitab.h +# End Source File +# Begin Source File + +SOURCE=.\latin1tab.h +# End Source File +# Begin Source File + +SOURCE=.\nametab.h +# End Source File +# Begin Source File + +SOURCE=.\utf8tab.h +# End Source File +# Begin Source File + +SOURCE=.\xmlrole.h +# End Source File +# Begin Source File + +SOURCE=.\xmltok.h +# End Source File +# Begin Source File + +SOURCE=.\xmltok_impl.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# End Group +# Begin Source File + +SOURCE=.\ReadMe.txt +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/expat.h b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/expat.h new file mode 100644 index 00000000..f3130d45 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/expat.h @@ -0,0 +1,1001 @@ +/* Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +#ifndef XmlParse_INCLUDED +#define XmlParse_INCLUDED 1 + +#ifdef __VMS +/* 0 1 2 3 0 1 2 3 + 1234567890123456789012345678901 1234567890123456789012345678901 */ +#define XML_SetProcessingInstructionHandler XML_SetProcessingInstrHandler +#define XML_SetUnparsedEntityDeclHandler XML_SetUnparsedEntDeclHandler +#define XML_SetStartNamespaceDeclHandler XML_SetStartNamespcDeclHandler +#define XML_SetExternalEntityRefHandlerArg XML_SetExternalEntRefHandlerArg +#endif + +#include + +#if defined(_MSC_EXTENSIONS) && !defined(__BEOS__) && !defined(__CYGWIN__) +#define XML_USE_MSC_EXTENSIONS 1 +#endif + +/* Expat tries very hard to make the API boundary very specifically + defined. There are two macros defined to control this boundary; + each of these can be defined before including this header to + achieve some different behavior, but doing so it not recommended or + tested frequently. + + XMLCALL - The calling convention to use for all calls across the + "library boundary." This will default to cdecl, and + try really hard to tell the compiler that's what we + want. + + XMLIMPORT - Whatever magic is needed to note that a function is + to be imported from a dynamically loaded library + (.dll, .so, or .sl, depending on your platform). + + The XMLCALL macro was added in Expat 1.95.7. The only one which is + expected to be directly useful in client code is XMLCALL. + + Note that on at least some Unix versions, the Expat library must be + compiled with the cdecl calling convention as the default since + system headers may assume the cdecl convention. +*/ +#ifndef XMLCALL +#if defined(XML_USE_MSC_EXTENSIONS) +#define XMLCALL __cdecl +#elif defined(__GNUC__) && defined(__i386) +#define XMLCALL __attribute__((cdecl)) +#else +/* For any platform which uses this definition and supports more than + one calling convention, we need to extend this definition to + declare the convention used on that platform, if it's possible to + do so. + + If this is the case for your platform, please file a bug report + with information on how to identify your platform via the C + pre-processor and how to specify the same calling convention as the + platform's malloc() implementation. +*/ +#define XMLCALL +#endif +#endif /* not defined XMLCALL */ + + +#if !defined(XML_STATIC) && !defined(XMLIMPORT) +#ifndef XML_BUILDING_EXPAT +/* using Expat from an application */ + +#ifdef XML_USE_MSC_EXTENSIONS +#define XMLIMPORT __declspec(dllimport) +#endif + +#endif +#endif /* not defined XML_STATIC */ + +/* If we didn't define it above, define it away: */ +#ifndef XMLIMPORT +#define XMLIMPORT +#endif + + +#define XMLPARSEAPI(type) XMLIMPORT type XMLCALL + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef XML_UNICODE_WCHAR_T +#define XML_UNICODE +#endif + +struct XML_ParserStruct; +typedef struct XML_ParserStruct *XML_Parser; + +#ifdef XML_UNICODE /* Information is UTF-16 encoded. */ +#ifdef XML_UNICODE_WCHAR_T +typedef wchar_t XML_Char; +typedef wchar_t XML_LChar; +#else +typedef unsigned short XML_Char; +typedef char XML_LChar; +#endif /* XML_UNICODE_WCHAR_T */ +#else /* Information is UTF-8 encoded. */ +typedef char XML_Char; +typedef char XML_LChar; +#endif /* XML_UNICODE */ + +/* Should this be defined using stdbool.h when C99 is available? */ +typedef unsigned char XML_Bool; +#define XML_TRUE ((XML_Bool) 1) +#define XML_FALSE ((XML_Bool) 0) + +/* The XML_Status enum gives the possible return values for several + API functions. The preprocessor #defines are included so this + stanza can be added to code that still needs to support older + versions of Expat 1.95.x: + + #ifndef XML_STATUS_OK + #define XML_STATUS_OK 1 + #define XML_STATUS_ERROR 0 + #endif + + Otherwise, the #define hackery is quite ugly and would have been + dropped. +*/ +enum XML_Status { + XML_STATUS_ERROR = 0, +#define XML_STATUS_ERROR XML_STATUS_ERROR + XML_STATUS_OK = 1 +#define XML_STATUS_OK XML_STATUS_OK +}; + +enum XML_Error { + XML_ERROR_NONE, + XML_ERROR_NO_MEMORY, + XML_ERROR_SYNTAX, + XML_ERROR_NO_ELEMENTS, + XML_ERROR_INVALID_TOKEN, + XML_ERROR_UNCLOSED_TOKEN, + XML_ERROR_PARTIAL_CHAR, + XML_ERROR_TAG_MISMATCH, + XML_ERROR_DUPLICATE_ATTRIBUTE, + XML_ERROR_JUNK_AFTER_DOC_ELEMENT, + XML_ERROR_PARAM_ENTITY_REF, + XML_ERROR_UNDEFINED_ENTITY, + XML_ERROR_RECURSIVE_ENTITY_REF, + XML_ERROR_ASYNC_ENTITY, + XML_ERROR_BAD_CHAR_REF, + XML_ERROR_BINARY_ENTITY_REF, + XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF, + XML_ERROR_MISPLACED_XML_PI, + XML_ERROR_UNKNOWN_ENCODING, + XML_ERROR_INCORRECT_ENCODING, + XML_ERROR_UNCLOSED_CDATA_SECTION, + XML_ERROR_EXTERNAL_ENTITY_HANDLING, + XML_ERROR_NOT_STANDALONE, + XML_ERROR_UNEXPECTED_STATE, + XML_ERROR_ENTITY_DECLARED_IN_PE, + XML_ERROR_FEATURE_REQUIRES_XML_DTD, + XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING, + XML_ERROR_UNBOUND_PREFIX +}; + +enum XML_Content_Type { + XML_CTYPE_EMPTY = 1, + XML_CTYPE_ANY, + XML_CTYPE_MIXED, + XML_CTYPE_NAME, + XML_CTYPE_CHOICE, + XML_CTYPE_SEQ +}; + +enum XML_Content_Quant { + XML_CQUANT_NONE, + XML_CQUANT_OPT, + XML_CQUANT_REP, + XML_CQUANT_PLUS +}; + +/* If type == XML_CTYPE_EMPTY or XML_CTYPE_ANY, then quant will be + XML_CQUANT_NONE, and the other fields will be zero or NULL. + If type == XML_CTYPE_MIXED, then quant will be NONE or REP and + numchildren will contain number of elements that may be mixed in + and children point to an array of XML_Content cells that will be + all of XML_CTYPE_NAME type with no quantification. + + If type == XML_CTYPE_NAME, then the name points to the name, and + the numchildren field will be zero and children will be NULL. The + quant fields indicates any quantifiers placed on the name. + + CHOICE and SEQ will have name NULL, the number of children in + numchildren and children will point, recursively, to an array + of XML_Content cells. + + The EMPTY, ANY, and MIXED types will only occur at top level. +*/ + +typedef struct XML_cp XML_Content; + +struct XML_cp { + enum XML_Content_Type type; + enum XML_Content_Quant quant; + XML_Char * name; + unsigned int numchildren; + XML_Content * children; +}; + + +/* This is called for an element declaration. See above for + description of the model argument. It's the caller's responsibility + to free model when finished with it. +*/ +typedef void (XMLCALL *XML_ElementDeclHandler) (void *userData, + const XML_Char *name, + XML_Content *model); + +XMLPARSEAPI(void) +XML_SetElementDeclHandler(XML_Parser parser, + XML_ElementDeclHandler eldecl); + +/* The Attlist declaration handler is called for *each* attribute. So + a single Attlist declaration with multiple attributes declared will + generate multiple calls to this handler. The "default" parameter + may be NULL in the case of the "#IMPLIED" or "#REQUIRED" + keyword. The "isrequired" parameter will be true and the default + value will be NULL in the case of "#REQUIRED". If "isrequired" is + true and default is non-NULL, then this is a "#FIXED" default. +*/ +typedef void (XMLCALL *XML_AttlistDeclHandler) ( + void *userData, + const XML_Char *elname, + const XML_Char *attname, + const XML_Char *att_type, + const XML_Char *dflt, + int isrequired); + +XMLPARSEAPI(void) +XML_SetAttlistDeclHandler(XML_Parser parser, + XML_AttlistDeclHandler attdecl); + +/* The XML declaration handler is called for *both* XML declarations + and text declarations. The way to distinguish is that the version + parameter will be NULL for text declarations. The encoding + parameter may be NULL for XML declarations. The standalone + parameter will be -1, 0, or 1 indicating respectively that there + was no standalone parameter in the declaration, that it was given + as no, or that it was given as yes. +*/ +typedef void (XMLCALL *XML_XmlDeclHandler) (void *userData, + const XML_Char *version, + const XML_Char *encoding, + int standalone); + +XMLPARSEAPI(void) +XML_SetXmlDeclHandler(XML_Parser parser, + XML_XmlDeclHandler xmldecl); + + +typedef struct { + void *(XMLCALL *malloc_fcn)(size_t size); + void *(XMLCALL *realloc_fcn)(void *ptr, size_t size); + void (XMLCALL *free_fcn)(void *ptr); +} XML_Memory_Handling_Suite; + +/* Constructs a new parser; encoding is the encoding specified by the + external protocol or NULL if there is none specified. +*/ +XMLPARSEAPI(XML_Parser) +XML_ParserCreate(const XML_Char *encoding); + +/* Constructs a new parser and namespace processor. Element type + names and attribute names that belong to a namespace will be + expanded; unprefixed attribute names are never expanded; unprefixed + element type names are expanded only if there is a default + namespace. The expanded name is the concatenation of the namespace + URI, the namespace separator character, and the local part of the + name. If the namespace separator is '\0' then the namespace URI + and the local part will be concatenated without any separator. + When a namespace is not declared, the name and prefix will be + passed through without expansion. +*/ +XMLPARSEAPI(XML_Parser) +XML_ParserCreateNS(const XML_Char *encoding, XML_Char namespaceSeparator); + + +/* Constructs a new parser using the memory management suite referred to + by memsuite. If memsuite is NULL, then use the standard library memory + suite. If namespaceSeparator is non-NULL it creates a parser with + namespace processing as described above. The character pointed at + will serve as the namespace separator. + + All further memory operations used for the created parser will come from + the given suite. +*/ +XMLPARSEAPI(XML_Parser) +XML_ParserCreate_MM(const XML_Char *encoding, + const XML_Memory_Handling_Suite *memsuite, + const XML_Char *namespaceSeparator); + +/* Prepare a parser object to be re-used. This is particularly + valuable when memory allocation overhead is disproportionatly high, + such as when a large number of small documnents need to be parsed. + All handlers are cleared from the parser, except for the + unknownEncodingHandler. The parser's external state is re-initialized + except for the values of ns and ns_triplets. + + Added in Expat 1.95.3. +*/ +XMLPARSEAPI(XML_Bool) +XML_ParserReset(XML_Parser parser, const XML_Char *encoding); + +/* atts is array of name/value pairs, terminated by 0; + names and values are 0 terminated. +*/ +typedef void (XMLCALL *XML_StartElementHandler) (void *userData, + const XML_Char *name, + const XML_Char **atts); + +typedef void (XMLCALL *XML_EndElementHandler) (void *userData, + const XML_Char *name); + + +/* s is not 0 terminated. */ +typedef void (XMLCALL *XML_CharacterDataHandler) (void *userData, + const XML_Char *s, + int len); + +/* target and data are 0 terminated */ +typedef void (XMLCALL *XML_ProcessingInstructionHandler) ( + void *userData, + const XML_Char *target, + const XML_Char *data); + +/* data is 0 terminated */ +typedef void (XMLCALL *XML_CommentHandler) (void *userData, + const XML_Char *data); + +typedef void (XMLCALL *XML_StartCdataSectionHandler) (void *userData); +typedef void (XMLCALL *XML_EndCdataSectionHandler) (void *userData); + +/* This is called for any characters in the XML document for which + there is no applicable handler. This includes both characters that + are part of markup which is of a kind that is not reported + (comments, markup declarations), or characters that are part of a + construct which could be reported but for which no handler has been + supplied. The characters are passed exactly as they were in the XML + document except that they will be encoded in UTF-8 or UTF-16. + Line boundaries are not normalized. Note that a byte order mark + character is not passed to the default handler. There are no + guarantees about how characters are divided between calls to the + default handler: for example, a comment might be split between + multiple calls. +*/ +typedef void (XMLCALL *XML_DefaultHandler) (void *userData, + const XML_Char *s, + int len); + +/* This is called for the start of the DOCTYPE declaration, before + any DTD or internal subset is parsed. +*/ +typedef void (XMLCALL *XML_StartDoctypeDeclHandler) ( + void *userData, + const XML_Char *doctypeName, + const XML_Char *sysid, + const XML_Char *pubid, + int has_internal_subset); + +/* This is called for the start of the DOCTYPE declaration when the + closing > is encountered, but after processing any external + subset. +*/ +typedef void (XMLCALL *XML_EndDoctypeDeclHandler)(void *userData); + +/* This is called for entity declarations. The is_parameter_entity + argument will be non-zero if the entity is a parameter entity, zero + otherwise. + + For internal entities (), value will + be non-NULL and systemId, publicID, and notationName will be NULL. + The value string is NOT nul-terminated; the length is provided in + the value_length argument. Since it is legal to have zero-length + values, do not use this argument to test for internal entities. + + For external entities, value will be NULL and systemId will be + non-NULL. The publicId argument will be NULL unless a public + identifier was provided. The notationName argument will have a + non-NULL value only for unparsed entity declarations. + + Note that is_parameter_entity can't be changed to XML_Bool, since + that would break binary compatibility. +*/ +typedef void (XMLCALL *XML_EntityDeclHandler) ( + void *userData, + const XML_Char *entityName, + int is_parameter_entity, + const XML_Char *value, + int value_length, + const XML_Char *base, + const XML_Char *systemId, + const XML_Char *publicId, + const XML_Char *notationName); + +XMLPARSEAPI(void) +XML_SetEntityDeclHandler(XML_Parser parser, + XML_EntityDeclHandler handler); + +/* OBSOLETE -- OBSOLETE -- OBSOLETE + This handler has been superceded by the EntityDeclHandler above. + It is provided here for backward compatibility. + + This is called for a declaration of an unparsed (NDATA) entity. + The base argument is whatever was set by XML_SetBase. The + entityName, systemId and notationName arguments will never be + NULL. The other arguments may be. +*/ +typedef void (XMLCALL *XML_UnparsedEntityDeclHandler) ( + void *userData, + const XML_Char *entityName, + const XML_Char *base, + const XML_Char *systemId, + const XML_Char *publicId, + const XML_Char *notationName); + +/* This is called for a declaration of notation. The base argument is + whatever was set by XML_SetBase. The notationName will never be + NULL. The other arguments can be. +*/ +typedef void (XMLCALL *XML_NotationDeclHandler) ( + void *userData, + const XML_Char *notationName, + const XML_Char *base, + const XML_Char *systemId, + const XML_Char *publicId); + +/* When namespace processing is enabled, these are called once for + each namespace declaration. The call to the start and end element + handlers occur between the calls to the start and end namespace + declaration handlers. For an xmlns attribute, prefix will be + NULL. For an xmlns="" attribute, uri will be NULL. +*/ +typedef void (XMLCALL *XML_StartNamespaceDeclHandler) ( + void *userData, + const XML_Char *prefix, + const XML_Char *uri); + +typedef void (XMLCALL *XML_EndNamespaceDeclHandler) ( + void *userData, + const XML_Char *prefix); + +/* This is called if the document is not standalone, that is, it has an + external subset or a reference to a parameter entity, but does not + have standalone="yes". If this handler returns XML_STATUS_ERROR, + then processing will not continue, and the parser will return a + XML_ERROR_NOT_STANDALONE error. + If parameter entity parsing is enabled, then in addition to the + conditions above this handler will only be called if the referenced + entity was actually read. +*/ +typedef int (XMLCALL *XML_NotStandaloneHandler) (void *userData); + +/* This is called for a reference to an external parsed general + entity. The referenced entity is not automatically parsed. The + application can parse it immediately or later using + XML_ExternalEntityParserCreate. + + The parser argument is the parser parsing the entity containing the + reference; it can be passed as the parser argument to + XML_ExternalEntityParserCreate. The systemId argument is the + system identifier as specified in the entity declaration; it will + not be NULL. + + The base argument is the system identifier that should be used as + the base for resolving systemId if systemId was relative; this is + set by XML_SetBase; it may be NULL. + + The publicId argument is the public identifier as specified in the + entity declaration, or NULL if none was specified; the whitespace + in the public identifier will have been normalized as required by + the XML spec. + + The context argument specifies the parsing context in the format + expected by the context argument to XML_ExternalEntityParserCreate; + context is valid only until the handler returns, so if the + referenced entity is to be parsed later, it must be copied. + context is NULL only when the entity is a parameter entity. + + The handler should return XML_STATUS_ERROR if processing should not + continue because of a fatal error in the handling of the external + entity. In this case the calling parser will return an + XML_ERROR_EXTERNAL_ENTITY_HANDLING error. + + Note that unlike other handlers the first argument is the parser, + not userData. +*/ +typedef int (XMLCALL *XML_ExternalEntityRefHandler) ( + XML_Parser parser, + const XML_Char *context, + const XML_Char *base, + const XML_Char *systemId, + const XML_Char *publicId); + +/* This is called in two situations: + 1) An entity reference is encountered for which no declaration + has been read *and* this is not an error. + 2) An internal entity reference is read, but not expanded, because + XML_SetDefaultHandler has been called. + Note: skipped parameter entities in declarations and skipped general + entities in attribute values cannot be reported, because + the event would be out of sync with the reporting of the + declarations or attribute values +*/ +typedef void (XMLCALL *XML_SkippedEntityHandler) ( + void *userData, + const XML_Char *entityName, + int is_parameter_entity); + +/* This structure is filled in by the XML_UnknownEncodingHandler to + provide information to the parser about encodings that are unknown + to the parser. + + The map[b] member gives information about byte sequences whose + first byte is b. + + If map[b] is c where c is >= 0, then b by itself encodes the + Unicode scalar value c. + + If map[b] is -1, then the byte sequence is malformed. + + If map[b] is -n, where n >= 2, then b is the first byte of an + n-byte sequence that encodes a single Unicode scalar value. + + The data member will be passed as the first argument to the convert + function. + + The convert function is used to convert multibyte sequences; s will + point to a n-byte sequence where map[(unsigned char)*s] == -n. The + convert function must return the Unicode scalar value represented + by this byte sequence or -1 if the byte sequence is malformed. + + The convert function may be NULL if the encoding is a single-byte + encoding, that is if map[b] >= -1 for all bytes b. + + When the parser is finished with the encoding, then if release is + not NULL, it will call release passing it the data member; once + release has been called, the convert function will not be called + again. + + Expat places certain restrictions on the encodings that are supported + using this mechanism. + + 1. Every ASCII character that can appear in a well-formed XML document, + other than the characters + + $@\^`{}~ + + must be represented by a single byte, and that byte must be the + same byte that represents that character in ASCII. + + 2. No character may require more than 4 bytes to encode. + + 3. All characters encoded must have Unicode scalar values <= + 0xFFFF, (i.e., characters that would be encoded by surrogates in + UTF-16 are not allowed). Note that this restriction doesn't + apply to the built-in support for UTF-8 and UTF-16. + + 4. No Unicode character may be encoded by more than one distinct + sequence of bytes. +*/ +typedef struct { + int map[256]; + void *data; + int (XMLCALL *convert)(void *data, const char *s); + void (XMLCALL *release)(void *data); +} XML_Encoding; + +/* This is called for an encoding that is unknown to the parser. + + The encodingHandlerData argument is that which was passed as the + second argument to XML_SetUnknownEncodingHandler. + + The name argument gives the name of the encoding as specified in + the encoding declaration. + + If the callback can provide information about the encoding, it must + fill in the XML_Encoding structure, and return XML_STATUS_OK. + Otherwise it must return XML_STATUS_ERROR. + + If info does not describe a suitable encoding, then the parser will + return an XML_UNKNOWN_ENCODING error. +*/ +typedef int (XMLCALL *XML_UnknownEncodingHandler) ( + void *encodingHandlerData, + const XML_Char *name, + XML_Encoding *info); + +XMLPARSEAPI(void) +XML_SetElementHandler(XML_Parser parser, + XML_StartElementHandler start, + XML_EndElementHandler end); + +XMLPARSEAPI(void) +XML_SetStartElementHandler(XML_Parser, XML_StartElementHandler); + +XMLPARSEAPI(void) +XML_SetEndElementHandler(XML_Parser, XML_EndElementHandler); + +XMLPARSEAPI(void) +XML_SetCharacterDataHandler(XML_Parser parser, + XML_CharacterDataHandler handler); + +XMLPARSEAPI(void) +XML_SetProcessingInstructionHandler(XML_Parser parser, + XML_ProcessingInstructionHandler handler); +XMLPARSEAPI(void) +XML_SetCommentHandler(XML_Parser parser, + XML_CommentHandler handler); + +XMLPARSEAPI(void) +XML_SetCdataSectionHandler(XML_Parser parser, + XML_StartCdataSectionHandler start, + XML_EndCdataSectionHandler end); + +XMLPARSEAPI(void) +XML_SetStartCdataSectionHandler(XML_Parser parser, + XML_StartCdataSectionHandler start); + +XMLPARSEAPI(void) +XML_SetEndCdataSectionHandler(XML_Parser parser, + XML_EndCdataSectionHandler end); + +/* This sets the default handler and also inhibits expansion of + internal entities. These entity references will be passed to the + default handler, or to the skipped entity handler, if one is set. +*/ +XMLPARSEAPI(void) +XML_SetDefaultHandler(XML_Parser parser, + XML_DefaultHandler handler); + +/* This sets the default handler but does not inhibit expansion of + internal entities. The entity reference will not be passed to the + default handler. +*/ +XMLPARSEAPI(void) +XML_SetDefaultHandlerExpand(XML_Parser parser, + XML_DefaultHandler handler); + +XMLPARSEAPI(void) +XML_SetDoctypeDeclHandler(XML_Parser parser, + XML_StartDoctypeDeclHandler start, + XML_EndDoctypeDeclHandler end); + +XMLPARSEAPI(void) +XML_SetStartDoctypeDeclHandler(XML_Parser parser, + XML_StartDoctypeDeclHandler start); + +XMLPARSEAPI(void) +XML_SetEndDoctypeDeclHandler(XML_Parser parser, + XML_EndDoctypeDeclHandler end); + +XMLPARSEAPI(void) +XML_SetUnparsedEntityDeclHandler(XML_Parser parser, + XML_UnparsedEntityDeclHandler handler); + +XMLPARSEAPI(void) +XML_SetNotationDeclHandler(XML_Parser parser, + XML_NotationDeclHandler handler); + +XMLPARSEAPI(void) +XML_SetNamespaceDeclHandler(XML_Parser parser, + XML_StartNamespaceDeclHandler start, + XML_EndNamespaceDeclHandler end); + +XMLPARSEAPI(void) +XML_SetStartNamespaceDeclHandler(XML_Parser parser, + XML_StartNamespaceDeclHandler start); + +XMLPARSEAPI(void) +XML_SetEndNamespaceDeclHandler(XML_Parser parser, + XML_EndNamespaceDeclHandler end); + +XMLPARSEAPI(void) +XML_SetNotStandaloneHandler(XML_Parser parser, + XML_NotStandaloneHandler handler); + +XMLPARSEAPI(void) +XML_SetExternalEntityRefHandler(XML_Parser parser, + XML_ExternalEntityRefHandler handler); + +/* If a non-NULL value for arg is specified here, then it will be + passed as the first argument to the external entity ref handler + instead of the parser object. +*/ +XMLPARSEAPI(void) +XML_SetExternalEntityRefHandlerArg(XML_Parser, void *arg); + +XMLPARSEAPI(void) +XML_SetSkippedEntityHandler(XML_Parser parser, + XML_SkippedEntityHandler handler); + +XMLPARSEAPI(void) +XML_SetUnknownEncodingHandler(XML_Parser parser, + XML_UnknownEncodingHandler handler, + void *encodingHandlerData); + +/* This can be called within a handler for a start element, end + element, processing instruction or character data. It causes the + corresponding markup to be passed to the default handler. +*/ +XMLPARSEAPI(void) +XML_DefaultCurrent(XML_Parser parser); + +/* If do_nst is non-zero, and namespace processing is in effect, and + a name has a prefix (i.e. an explicit namespace qualifier) then + that name is returned as a triplet in a single string separated by + the separator character specified when the parser was created: URI + + sep + local_name + sep + prefix. + + If do_nst is zero, then namespace information is returned in the + default manner (URI + sep + local_name) whether or not the name + has a prefix. + + Note: Calling XML_SetReturnNSTriplet after XML_Parse or + XML_ParseBuffer has no effect. +*/ + +XMLPARSEAPI(void) +XML_SetReturnNSTriplet(XML_Parser parser, int do_nst); + +/* This value is passed as the userData argument to callbacks. */ +XMLPARSEAPI(void) +XML_SetUserData(XML_Parser parser, void *userData); + +/* Returns the last value set by XML_SetUserData or NULL. */ +#define XML_GetUserData(parser) (*(void **)(parser)) + +/* This is equivalent to supplying an encoding argument to + XML_ParserCreate. On success XML_SetEncoding returns non-zero, + zero otherwise. + Note: Calling XML_SetEncoding after XML_Parse or XML_ParseBuffer + has no effect and returns XML_STATUS_ERROR. +*/ +XMLPARSEAPI(enum XML_Status) +XML_SetEncoding(XML_Parser parser, const XML_Char *encoding); + +/* If this function is called, then the parser will be passed as the + first argument to callbacks instead of userData. The userData will + still be accessible using XML_GetUserData. +*/ +XMLPARSEAPI(void) +XML_UseParserAsHandlerArg(XML_Parser parser); + +/* If useDTD == XML_TRUE is passed to this function, then the parser + will assume that there is an external subset, even if none is + specified in the document. In such a case the parser will call the + externalEntityRefHandler with a value of NULL for the systemId + argument (the publicId and context arguments will be NULL as well). + Note: If this function is called, then this must be done before + the first call to XML_Parse or XML_ParseBuffer, since it will + have no effect after that. Returns + XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING. + Note: If the document does not have a DOCTYPE declaration at all, + then startDoctypeDeclHandler and endDoctypeDeclHandler will not + be called, despite an external subset being parsed. + Note: If XML_DTD is not defined when Expat is compiled, returns + XML_ERROR_FEATURE_REQUIRES_XML_DTD. +*/ +XMLPARSEAPI(enum XML_Error) +XML_UseForeignDTD(XML_Parser parser, XML_Bool useDTD); + + +/* Sets the base to be used for resolving relative URIs in system + identifiers in declarations. Resolving relative identifiers is + left to the application: this value will be passed through as the + base argument to the XML_ExternalEntityRefHandler, + XML_NotationDeclHandler and XML_UnparsedEntityDeclHandler. The base + argument will be copied. Returns XML_STATUS_ERROR if out of memory, + XML_STATUS_OK otherwise. +*/ +XMLPARSEAPI(enum XML_Status) +XML_SetBase(XML_Parser parser, const XML_Char *base); + +XMLPARSEAPI(const XML_Char *) +XML_GetBase(XML_Parser parser); + +/* Returns the number of the attribute/value pairs passed in last call + to the XML_StartElementHandler that were specified in the start-tag + rather than defaulted. Each attribute/value pair counts as 2; thus + this correspondds to an index into the atts array passed to the + XML_StartElementHandler. +*/ +XMLPARSEAPI(int) +XML_GetSpecifiedAttributeCount(XML_Parser parser); + +/* Returns the index of the ID attribute passed in the last call to + XML_StartElementHandler, or -1 if there is no ID attribute. Each + attribute/value pair counts as 2; thus this correspondds to an + index into the atts array passed to the XML_StartElementHandler. +*/ +XMLPARSEAPI(int) +XML_GetIdAttributeIndex(XML_Parser parser); + +/* Parses some input. Returns XML_STATUS_ERROR if a fatal error is + detected. The last call to XML_Parse must have isFinal true; len + may be zero for this call (or any other). + + Though the return values for these functions has always been + described as a Boolean value, the implementation, at least for the + 1.95.x series, has always returned exactly one of the XML_Status + values. +*/ +XMLPARSEAPI(enum XML_Status) +XML_Parse(XML_Parser parser, const char *s, int len, int isFinal); + +XMLPARSEAPI(void *) +XML_GetBuffer(XML_Parser parser, int len); + +XMLPARSEAPI(enum XML_Status) +XML_ParseBuffer(XML_Parser parser, int len, int isFinal); + +/* Creates an XML_Parser object that can parse an external general + entity; context is a '\0'-terminated string specifying the parse + context; encoding is a '\0'-terminated string giving the name of + the externally specified encoding, or NULL if there is no + externally specified encoding. The context string consists of a + sequence of tokens separated by formfeeds (\f); a token consisting + of a name specifies that the general entity of the name is open; a + token of the form prefix=uri specifies the namespace for a + particular prefix; a token of the form =uri specifies the default + namespace. This can be called at any point after the first call to + an ExternalEntityRefHandler so longer as the parser has not yet + been freed. The new parser is completely independent and may + safely be used in a separate thread. The handlers and userData are + initialized from the parser argument. Returns NULL if out of memory. + Otherwise returns a new XML_Parser object. +*/ +XMLPARSEAPI(XML_Parser) +XML_ExternalEntityParserCreate(XML_Parser parser, + const XML_Char *context, + const XML_Char *encoding); + +enum XML_ParamEntityParsing { + XML_PARAM_ENTITY_PARSING_NEVER, + XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE, + XML_PARAM_ENTITY_PARSING_ALWAYS +}; + +/* Controls parsing of parameter entities (including the external DTD + subset). If parsing of parameter entities is enabled, then + references to external parameter entities (including the external + DTD subset) will be passed to the handler set with + XML_SetExternalEntityRefHandler. The context passed will be 0. + + Unlike external general entities, external parameter entities can + only be parsed synchronously. If the external parameter entity is + to be parsed, it must be parsed during the call to the external + entity ref handler: the complete sequence of + XML_ExternalEntityParserCreate, XML_Parse/XML_ParseBuffer and + XML_ParserFree calls must be made during this call. After + XML_ExternalEntityParserCreate has been called to create the parser + for the external parameter entity (context must be 0 for this + call), it is illegal to make any calls on the old parser until + XML_ParserFree has been called on the newly created parser. + If the library has been compiled without support for parameter + entity parsing (ie without XML_DTD being defined), then + XML_SetParamEntityParsing will return 0 if parsing of parameter + entities is requested; otherwise it will return non-zero. + Note: If XML_SetParamEntityParsing is called after XML_Parse or + XML_ParseBuffer, then it has no effect and will always return 0. +*/ +XMLPARSEAPI(int) +XML_SetParamEntityParsing(XML_Parser parser, + enum XML_ParamEntityParsing parsing); + +/* If XML_Parse or XML_ParseBuffer have returned XML_STATUS_ERROR, then + XML_GetErrorCode returns information about the error. +*/ +XMLPARSEAPI(enum XML_Error) +XML_GetErrorCode(XML_Parser parser); + +/* These functions return information about the current parse + location. They may be called from any callback called to report + some parse event; in this case the location is the location of the + first of the sequence of characters that generated the event. When + called from callbacks generated by declarations in the document + prologue, the location identified isn't as neatly defined, but will + be within the relevant markup. When called outside of the callback + functions, the position indicated will be just past the last parse + event (regardless of whether there was an associated callback). + + They may also be called after returning from a call to XML_Parse + or XML_ParseBuffer. If the return value is XML_STATUS_ERROR then + the location is the location of the character at which the error + was detected; otherwise the location is the location of the last + parse event, as described above. +*/ +XMLPARSEAPI(int) XML_GetCurrentLineNumber(XML_Parser parser); +XMLPARSEAPI(int) XML_GetCurrentColumnNumber(XML_Parser parser); +XMLPARSEAPI(long) XML_GetCurrentByteIndex(XML_Parser parser); + +/* Return the number of bytes in the current event. + Returns 0 if the event is in an internal entity. +*/ +XMLPARSEAPI(int) +XML_GetCurrentByteCount(XML_Parser parser); + +/* If XML_CONTEXT_BYTES is defined, returns the input buffer, sets + the integer pointed to by offset to the offset within this buffer + of the current parse position, and sets the integer pointed to by size + to the size of this buffer (the number of input bytes). Otherwise + returns a NULL pointer. Also returns a NULL pointer if a parse isn't + active. + + NOTE: The character pointer returned should not be used outside + the handler that makes the call. +*/ +XMLPARSEAPI(const char *) +XML_GetInputContext(XML_Parser parser, + int *offset, + int *size); + +/* For backwards compatibility with previous versions. */ +#define XML_GetErrorLineNumber XML_GetCurrentLineNumber +#define XML_GetErrorColumnNumber XML_GetCurrentColumnNumber +#define XML_GetErrorByteIndex XML_GetCurrentByteIndex + +/* Frees the content model passed to the element declaration handler */ +XMLPARSEAPI(void) +XML_FreeContentModel(XML_Parser parser, XML_Content *model); + +/* Exposing the memory handling functions used in Expat */ +XMLPARSEAPI(void *) +XML_MemMalloc(XML_Parser parser, size_t size); + +XMLPARSEAPI(void *) +XML_MemRealloc(XML_Parser parser, void *ptr, size_t size); + +XMLPARSEAPI(void) +XML_MemFree(XML_Parser parser, void *ptr); + +/* Frees memory used by the parser. */ +XMLPARSEAPI(void) +XML_ParserFree(XML_Parser parser); + +/* Returns a string describing the error. */ +XMLPARSEAPI(const XML_LChar *) +XML_ErrorString(enum XML_Error code); + +/* Return a string containing the version number of this expat */ +XMLPARSEAPI(const XML_LChar *) +XML_ExpatVersion(void); + +typedef struct { + int major; + int minor; + int micro; +} XML_Expat_Version; + +/* Return an XML_Expat_Version structure containing numeric version + number information for this version of expat. +*/ +XMLPARSEAPI(XML_Expat_Version) +XML_ExpatVersionInfo(void); + +/* Added in Expat 1.95.5. */ +enum XML_FeatureEnum { + XML_FEATURE_END = 0, + XML_FEATURE_UNICODE, + XML_FEATURE_UNICODE_WCHAR_T, + XML_FEATURE_DTD, + XML_FEATURE_CONTEXT_BYTES, + XML_FEATURE_MIN_SIZE, + XML_FEATURE_SIZEOF_XML_CHAR, + XML_FEATURE_SIZEOF_XML_LCHAR + /* Additional features must be added to the end of this enum. */ +}; + +typedef struct { + enum XML_FeatureEnum feature; + const XML_LChar *name; + long int value; +} XML_Feature; + +XMLPARSEAPI(const XML_Feature *) +XML_GetFeatureList(void); + + +/* Expat follows the GNU/Linux convention of odd number minor version for + beta/development releases and even number minor version for stable + releases. Micro is bumped with each release, and set to 0 with each + change to major or minor version. +*/ +#define XML_MAJOR_VERSION 1 +#define XML_MINOR_VERSION 95 +#define XML_MICRO_VERSION 7 + +#ifdef __cplusplus +} +#endif + +#endif /* not XmlParse_INCLUDED */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/expat_config.hnw b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/expat_config.hnw new file mode 100644 index 00000000..ca9a9489 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/expat_config.hnw @@ -0,0 +1,25 @@ +/*================================================================ +** Copyright 2000, Clark Cooper +** All rights reserved. +** +** This is free software. You are permitted to copy, distribute, or modify +** it under the terms of the MIT/X license (contained in the COPYING file +** with this distribution.) +** +** +*/ + +#ifndef EXPAT_CONFIG_HNW +#define EXPAT_CONFIG_HNW + +#include +#include + +#define HAVE_MEMMOVE + +#define XML_NS 1 +#define XML_DTD 1 +#define XML_BYTE_ORDER 12 +#define XML_CONTEXT_BYTES 1024 + +#endif /* ndef EXPAT_CONFIG_HNW */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/iasciitab.h b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/iasciitab.h new file mode 100644 index 00000000..24a1d5cc --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/iasciitab.h @@ -0,0 +1,37 @@ +/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +/* Like asciitab.h, except that 0xD has code BT_S rather than BT_CR */ +/* 0x00 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, +/* 0x04 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, +/* 0x08 */ BT_NONXML, BT_S, BT_LF, BT_NONXML, +/* 0x0C */ BT_NONXML, BT_S, BT_NONXML, BT_NONXML, +/* 0x10 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, +/* 0x14 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, +/* 0x18 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, +/* 0x1C */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, +/* 0x20 */ BT_S, BT_EXCL, BT_QUOT, BT_NUM, +/* 0x24 */ BT_OTHER, BT_PERCNT, BT_AMP, BT_APOS, +/* 0x28 */ BT_LPAR, BT_RPAR, BT_AST, BT_PLUS, +/* 0x2C */ BT_COMMA, BT_MINUS, BT_NAME, BT_SOL, +/* 0x30 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT, +/* 0x34 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT, +/* 0x38 */ BT_DIGIT, BT_DIGIT, BT_COLON, BT_SEMI, +/* 0x3C */ BT_LT, BT_EQUALS, BT_GT, BT_QUEST, +/* 0x40 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX, +/* 0x44 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT, +/* 0x48 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x4C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x50 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x54 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x58 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_LSQB, +/* 0x5C */ BT_OTHER, BT_RSQB, BT_OTHER, BT_NMSTRT, +/* 0x60 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX, +/* 0x64 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT, +/* 0x68 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x6C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x70 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x74 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0x78 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER, +/* 0x7C */ BT_VERBAR, BT_OTHER, BT_OTHER, BT_OTHER, diff --git a/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/internal.h b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/internal.h new file mode 100644 index 00000000..ff056c65 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/internal.h @@ -0,0 +1,73 @@ +/* internal.h + + Internal definitions used by Expat. This is not needed to compile + client code. + + The following calling convention macros are defined for frequently + called functions: + + FASTCALL - Used for those internal functions that have a simple + body and a low number of arguments and local variables. + + PTRCALL - Used for functions called though function pointers. + + PTRFASTCALL - Like PTRCALL, but for low number of arguments. + + inline - Used for selected internal functions for which inlining + may improve performance on some platforms. + + Note: Use of these macros is based on judgement, not hard rules, + and therefore subject to change. +*/ + +#if defined(__GNUC__) && defined(__i386__) +/* We'll use this version by default only where we know it helps. + + regparm() generates warnings on Solaris boxes. See SF bug #692878. + + Instability reported with egcs on a RedHat Linux 7.3. + Let's comment out: + #define FASTCALL __attribute__((stdcall, regparm(3))) + and let's try this: +*/ +#define FASTCALL __attribute__((regparm(3))) +#define PTRFASTCALL __attribute__((regparm(3))) +#endif + +/* Using __fastcall seems to have an unexpected negative effect under + MS VC++, especially for function pointers, so we won't use it for + now on that platform. It may be reconsidered for a future release + if it can be made more effective. + Likely reason: __fastcall on Windows is like stdcall, therefore + the compiler cannot perform stack optimizations for call clusters. +*/ + +/* Make sure all of these are defined if they aren't already. */ + +#ifndef FASTCALL +#define FASTCALL +#endif + +#ifndef PTRCALL +#define PTRCALL +#endif + +#ifndef PTRFASTCALL +#define PTRFASTCALL +#endif + +#ifndef XML_MIN_SIZE +#if !defined(__cplusplus) && !defined(inline) +#ifdef __GNUC__ +#define inline __inline +#endif /* __GNUC__ */ +#endif +#endif /* XML_MIN_SIZE */ + +#ifdef __cplusplus +#define inline inline +#else +#ifndef inline +#define inline +#endif +#endif diff --git a/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/latin1tab.h b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/latin1tab.h new file mode 100644 index 00000000..53c25d76 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/latin1tab.h @@ -0,0 +1,36 @@ +/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +/* 0x80 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, +/* 0x84 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, +/* 0x88 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, +/* 0x8C */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, +/* 0x90 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, +/* 0x94 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, +/* 0x98 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, +/* 0x9C */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, +/* 0xA0 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, +/* 0xA4 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, +/* 0xA8 */ BT_OTHER, BT_OTHER, BT_NMSTRT, BT_OTHER, +/* 0xAC */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, +/* 0xB0 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, +/* 0xB4 */ BT_OTHER, BT_NMSTRT, BT_OTHER, BT_NAME, +/* 0xB8 */ BT_OTHER, BT_OTHER, BT_NMSTRT, BT_OTHER, +/* 0xBC */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER, +/* 0xC0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0xC4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0xC8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0xCC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0xD0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0xD4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER, +/* 0xD8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0xDC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0xE0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0xE4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0xE8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0xEC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0xF0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0xF4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER, +/* 0xF8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, +/* 0xFC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, diff --git a/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/nametab.h b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/nametab.h new file mode 100644 index 00000000..b05e62c7 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/nametab.h @@ -0,0 +1,150 @@ +static const unsigned namingBitmap[] = { +0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, +0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, +0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, +0x00000000, 0x04000000, 0x87FFFFFE, 0x07FFFFFE, +0x00000000, 0x00000000, 0xFF7FFFFF, 0xFF7FFFFF, +0xFFFFFFFF, 0x7FF3FFFF, 0xFFFFFDFE, 0x7FFFFFFF, +0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFE00F, 0xFC31FFFF, +0x00FFFFFF, 0x00000000, 0xFFFF0000, 0xFFFFFFFF, +0xFFFFFFFF, 0xF80001FF, 0x00000003, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, +0xFFFFD740, 0xFFFFFFFB, 0x547F7FFF, 0x000FFFFD, +0xFFFFDFFE, 0xFFFFFFFF, 0xDFFEFFFF, 0xFFFFFFFF, +0xFFFF0003, 0xFFFFFFFF, 0xFFFF199F, 0x033FCFFF, +0x00000000, 0xFFFE0000, 0x027FFFFF, 0xFFFFFFFE, +0x0000007F, 0x00000000, 0xFFFF0000, 0x000707FF, +0x00000000, 0x07FFFFFE, 0x000007FE, 0xFFFE0000, +0xFFFFFFFF, 0x7CFFFFFF, 0x002F7FFF, 0x00000060, +0xFFFFFFE0, 0x23FFFFFF, 0xFF000000, 0x00000003, +0xFFF99FE0, 0x03C5FDFF, 0xB0000000, 0x00030003, +0xFFF987E0, 0x036DFDFF, 0x5E000000, 0x001C0000, +0xFFFBAFE0, 0x23EDFDFF, 0x00000000, 0x00000001, +0xFFF99FE0, 0x23CDFDFF, 0xB0000000, 0x00000003, +0xD63DC7E0, 0x03BFC718, 0x00000000, 0x00000000, +0xFFFDDFE0, 0x03EFFDFF, 0x00000000, 0x00000003, +0xFFFDDFE0, 0x03EFFDFF, 0x40000000, 0x00000003, +0xFFFDDFE0, 0x03FFFDFF, 0x00000000, 0x00000003, +0x00000000, 0x00000000, 0x00000000, 0x00000000, +0xFFFFFFFE, 0x000D7FFF, 0x0000003F, 0x00000000, +0xFEF02596, 0x200D6CAE, 0x0000001F, 0x00000000, +0x00000000, 0x00000000, 0xFFFFFEFF, 0x000003FF, +0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0xFFFFFFFF, 0xFFFF003F, 0x007FFFFF, +0x0007DAED, 0x50000000, 0x82315001, 0x002C62AB, +0x40000000, 0xF580C900, 0x00000007, 0x02010800, +0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, +0x0FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFFFFF, +0x3F3FFFFF, 0xFFFFFFFF, 0xAAFF3F3F, 0x3FFFFFFF, +0xFFFFFFFF, 0x5FDFFFFF, 0x0FCF1FDC, 0x1FDC1FFF, +0x00000000, 0x00004C40, 0x00000000, 0x00000000, +0x00000007, 0x00000000, 0x00000000, 0x00000000, +0x00000080, 0x000003FE, 0xFFFFFFFE, 0xFFFFFFFF, +0x001FFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0x07FFFFFF, +0xFFFFFFE0, 0x00001FFF, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, +0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, +0xFFFFFFFF, 0x0000003F, 0x00000000, 0x00000000, +0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, +0xFFFFFFFF, 0x0000000F, 0x00000000, 0x00000000, +0x00000000, 0x07FF6000, 0x87FFFFFE, 0x07FFFFFE, +0x00000000, 0x00800000, 0xFF7FFFFF, 0xFF7FFFFF, +0x00FFFFFF, 0x00000000, 0xFFFF0000, 0xFFFFFFFF, +0xFFFFFFFF, 0xF80001FF, 0x00030003, 0x00000000, +0xFFFFFFFF, 0xFFFFFFFF, 0x0000003F, 0x00000003, +0xFFFFD7C0, 0xFFFFFFFB, 0x547F7FFF, 0x000FFFFD, +0xFFFFDFFE, 0xFFFFFFFF, 0xDFFEFFFF, 0xFFFFFFFF, +0xFFFF007B, 0xFFFFFFFF, 0xFFFF199F, 0x033FCFFF, +0x00000000, 0xFFFE0000, 0x027FFFFF, 0xFFFFFFFE, +0xFFFE007F, 0xBBFFFFFB, 0xFFFF0016, 0x000707FF, +0x00000000, 0x07FFFFFE, 0x0007FFFF, 0xFFFF03FF, +0xFFFFFFFF, 0x7CFFFFFF, 0xFFEF7FFF, 0x03FF3DFF, +0xFFFFFFEE, 0xF3FFFFFF, 0xFF1E3FFF, 0x0000FFCF, +0xFFF99FEE, 0xD3C5FDFF, 0xB080399F, 0x0003FFCF, +0xFFF987E4, 0xD36DFDFF, 0x5E003987, 0x001FFFC0, +0xFFFBAFEE, 0xF3EDFDFF, 0x00003BBF, 0x0000FFC1, +0xFFF99FEE, 0xF3CDFDFF, 0xB0C0398F, 0x0000FFC3, +0xD63DC7EC, 0xC3BFC718, 0x00803DC7, 0x0000FF80, +0xFFFDDFEE, 0xC3EFFDFF, 0x00603DDF, 0x0000FFC3, +0xFFFDDFEC, 0xC3EFFDFF, 0x40603DDF, 0x0000FFC3, +0xFFFDDFEC, 0xC3FFFDFF, 0x00803DCF, 0x0000FFC3, +0x00000000, 0x00000000, 0x00000000, 0x00000000, +0xFFFFFFFE, 0x07FF7FFF, 0x03FF7FFF, 0x00000000, +0xFEF02596, 0x3BFF6CAE, 0x03FF3F5F, 0x00000000, +0x03000000, 0xC2A003FF, 0xFFFFFEFF, 0xFFFE03FF, +0xFEBF0FDF, 0x02FE3FFF, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x00000000, 0x00000000, +0x00000000, 0x00000000, 0x1FFF0000, 0x00000002, +0x000000A0, 0x003EFFFE, 0xFFFFFFFE, 0xFFFFFFFF, +0x661FFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0x77FFFFFF, +}; +static const unsigned char nmstrtPages[] = { +0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x00, +0x00, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, +0x10, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x13, +0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x15, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x17, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x18, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; +static const unsigned char namePages[] = { +0x19, 0x03, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x00, +0x00, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, +0x10, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x13, +0x26, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x27, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x17, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, +0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x18, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; diff --git a/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/utf8tab.h b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/utf8tab.h new file mode 100644 index 00000000..7bb3e776 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/utf8tab.h @@ -0,0 +1,37 @@ +/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + + +/* 0x80 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0x84 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0x88 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0x8C */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0x90 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0x94 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0x98 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0x9C */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0xA0 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0xA4 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0xA8 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0xAC */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0xB0 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0xB4 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0xB8 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0xBC */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL, +/* 0xC0 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, +/* 0xC4 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, +/* 0xC8 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, +/* 0xCC */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, +/* 0xD0 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, +/* 0xD4 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, +/* 0xD8 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, +/* 0xDC */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2, +/* 0xE0 */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3, +/* 0xE4 */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3, +/* 0xE8 */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3, +/* 0xEC */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3, +/* 0xF0 */ BT_LEAD4, BT_LEAD4, BT_LEAD4, BT_LEAD4, +/* 0xF4 */ BT_LEAD4, BT_NONXML, BT_NONXML, BT_NONXML, +/* 0xF8 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML, +/* 0xFC */ BT_NONXML, BT_NONXML, BT_MALFORM, BT_MALFORM, diff --git a/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/winconfig.h b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/winconfig.h new file mode 100644 index 00000000..c1b791d6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/winconfig.h @@ -0,0 +1,30 @@ +/*================================================================ +** Copyright 2000, Clark Cooper +** All rights reserved. +** +** This is free software. You are permitted to copy, distribute, or modify +** it under the terms of the MIT/X license (contained in the COPYING file +** with this distribution.) +*/ + +#ifndef WINCONFIG_H +#define WINCONFIG_H + +#define WIN32_LEAN_AND_MEAN +#include +#undef WIN32_LEAN_AND_MEAN + +#include +#include + +#define XML_NS 1 +#define XML_DTD 1 +#define XML_CONTEXT_BYTES 1024 + +/* we will assume all Windows platforms are little endian */ +#define BYTEORDER 1234 + +/* Windows has memmove() available. */ +#define HAVE_MEMMOVE + +#endif /* ndef WINCONFIG_H */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xml.dep b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xml.dep new file mode 100644 index 00000000..05e840c1 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xml.dep @@ -0,0 +1,45 @@ +# Microsoft Developer Studio Generated Dependency File, included by xml.mak + +.\xmlparse.c : \ + ".\config.h"\ + ".\expat.h"\ + ".\winconfig.h"\ + ".\xmlrole.h"\ + ".\xmltok.h"\ + + +.\xmlrole.c : \ + ".\ascii.h"\ + ".\config.h"\ + ".\winconfig.h"\ + ".\xmlrole.h"\ + ".\xmltok.h"\ + + +.\xmltok.c : \ + ".\ascii.h"\ + ".\asciitab.h"\ + ".\config.h"\ + ".\iasciitab.h"\ + ".\latin1tab.h"\ + ".\nametab.h"\ + ".\utf8tab.h"\ + ".\winconfig.h"\ + ".\xmltok.h"\ + ".\xmltok_impl.c"\ + ".\xmltok_impl.h"\ + ".\xmltok_ns.c"\ + + +!IF "$(CFG)" == "xml - Win32 Release" + +!ELSEIF "$(CFG)" == "xml - Win32 Debug" + +!ENDIF + +!IF "$(CFG)" == "xml - Win32 Release" + +!ELSEIF "$(CFG)" == "xml - Win32 Debug" + +!ENDIF + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xml.dsp b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xml.dsp new file mode 100644 index 00000000..c8772f01 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xml.dsp @@ -0,0 +1,214 @@ +# Microsoft Developer Studio Project File - Name="xml" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Static Library" 0x0104 + +CFG=xml - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "xml.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 "xml.mak" CFG="xml - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "xml - Win32 Release" (based on "Win32 (x86) Static Library") +!MESSAGE "xml - Win32 Debug" (based on "Win32 (x86) Static Library") +!MESSAGE "xml - x64 Release" (based on "Win32 (x86) Static Library") +!MESSAGE "xml - x64 Debug" (based on "Win32 (x86) Static Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "xml - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "LibR" +# PROP BASE Intermediate_Dir "LibR" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "LibR" +# PROP Intermediate_Dir "LibR" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /Oy- /I "." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "COMPILED_FROM_DSP" /D "XML_STATIC" /Fo"$(INTDIR)\" /Fd"$(OUTDIR)\xml" /FD /c +# ADD BASE RSC /l 0x409 +# ADD RSC /l 0x409 +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo /out:"LibR\xml.lib" + +!ELSEIF "$(CFG)" == "xml - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "LibD" +# PROP BASE Intermediate_Dir "LibD" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "LibD" +# PROP Intermediate_Dir "LibD" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /FD /EHsc /c +# ADD CPP /nologo /MDd /W3 /Zi /Od /I "." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "COMPILED_FROM_DSP" /D "XML_STATIC" /Fo"$(INTDIR)\" /Fd"$(OUTDIR)\xml" /FD /EHsc /c +# ADD BASE RSC /l 0x409 +# ADD RSC /l 0x409 +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo /out:"LibD\xml.lib" + +!ELSEIF "$(CFG)" == "xml - x64 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "x64\LibR" +# PROP BASE Intermediate_Dir "x64\LibR" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "x64\LibR" +# PROP Intermediate_Dir "x64\LibR" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /Oy- /I "." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "COMPILED_FROM_DSP" /D "XML_STATIC" /Fo"$(INTDIR)\" /Fd"$(OUTDIR)\xml" /FD /c +# ADD BASE RSC /l 0x409 +# ADD RSC /l 0x409 +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo /out:"x64\LibR\xml.lib" + +!ELSEIF "$(CFG)" == "xml - x64 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "x64\LibD" +# PROP BASE Intermediate_Dir "x64\LibD" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "x64\LibD" +# PROP Intermediate_Dir "x64\LibD" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /FD /EHsc /c +# ADD CPP /nologo /MDd /W3 /Zi /Od /I "." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "COMPILED_FROM_DSP" /D "XML_STATIC" /Fo"$(INTDIR)\" /Fd"$(OUTDIR)\xml" /FD /EHsc /c +# ADD BASE RSC /l 0x409 +# ADD RSC /l 0x409 +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo /out:"x64\LibD\xml.lib" + +!ENDIF + +# Begin Target + +# Name "xml - Win32 Release" +# Name "xml - Win32 Debug" +# Name "xml - x64 Release" +# Name "xml - x64 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\xmlparse.c +# End Source File +# Begin Source File + +SOURCE=.\xmlrole.c +# End Source File +# Begin Source File + +SOURCE=.\xmltok.c +# End Source File +# Begin Source File + +SOURCE=xmltok_impl.c +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File + +SOURCE=xmltok_ns.c +# PROP Exclude_From_Build 1 +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\ascii.h +# End Source File +# Begin Source File + +SOURCE=.\asciitab.h +# End Source File +# Begin Source File + +SOURCE=.\expat.h +# End Source File +# Begin Source File + +SOURCE=.\iasciitab.h +# End Source File +# Begin Source File + +SOURCE=.\latin1tab.h +# End Source File +# Begin Source File + +SOURCE=.\nametab.h +# End Source File +# Begin Source File + +SOURCE=.\utf8tab.h +# End Source File +# Begin Source File + +SOURCE=.\winconfig.h +# End Source File +# Begin Source File + +SOURCE=.\xmlrole.h +# End Source File +# Begin Source File + +SOURCE=.\xmltok.h +# End Source File +# Begin Source File + +SOURCE=.\xmltok_impl.h +# End Source File +# End Group +# Begin Source File + +SOURCE=.\ReadMe.txt +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xml.mak b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xml.mak new file mode 100644 index 00000000..156e56b4 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xml.mak @@ -0,0 +1,258 @@ +# Microsoft Developer Studio Generated NMAKE File, Based on xml.dsp +!IF "$(CFG)" == "" +CFG=xml - Win32 Debug +!MESSAGE No configuration specified. Defaulting to xml - Win32 Debug. +!ENDIF + +!IF "$(CFG)" != "xml - Win32 Release" && "$(CFG)" != "xml - Win32 Debug" +!MESSAGE Invalid configuration "$(CFG)" specified. +!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 "xml.mak" CFG="xml - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "xml - Win32 Release" (based on "Win32 (x86) Static Library") +!MESSAGE "xml - Win32 Debug" (based on "Win32 (x86) Static Library") +!MESSAGE +!ERROR An invalid configuration is specified. +!ENDIF + +!IF "$(OS)" == "Windows_NT" +NULL= +!ELSE +NULL=nul +!ENDIF + +!IF "$(CFG)" == "xml - Win32 Release" + +OUTDIR=.\LibR +INTDIR=.\LibR +# Begin Custom Macros +OutDir=.\LibR +# End Custom Macros + +ALL : "$(OUTDIR)\xml.lib" + + +CLEAN : + -@erase "$(INTDIR)\xml_src.idb" + -@erase "$(INTDIR)\xml_src.pdb" + -@erase "$(INTDIR)\xmlparse.obj" + -@erase "$(INTDIR)\xmlrole.obj" + -@erase "$(INTDIR)\xmltok.obj" + -@erase "$(OUTDIR)\xml.lib" + +"$(OUTDIR)" : + if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" + +CPP=cl.exe +CPP_PROJ=/nologo /MD /W3 /Zi /O2 /Oy- /I "." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D VERSION=\"expat_1.95.2\" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\xml_src" /FD /c + +.c{$(INTDIR)}.obj:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.cpp{$(INTDIR)}.obj:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.cxx{$(INTDIR)}.obj:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.c{$(INTDIR)}.sbr:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.cpp{$(INTDIR)}.sbr:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.cxx{$(INTDIR)}.sbr:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +RSC=rc.exe +BSC32=bscmake.exe +BSC32_FLAGS=/nologo /o"$(OUTDIR)\xml.bsc" +BSC32_SBRS= \ + +LIB32=link.exe -lib +LIB32_FLAGS=/nologo /out:"$(OUTDIR)\xml.lib" +LIB32_OBJS= \ + "$(INTDIR)\xmlparse.obj" \ + "$(INTDIR)\xmlrole.obj" \ + "$(INTDIR)\xmltok.obj" + +"$(OUTDIR)\xml.lib" : "$(OUTDIR)" $(DEF_FILE) $(LIB32_OBJS) + $(LIB32) @<< + $(LIB32_FLAGS) $(DEF_FLAGS) $(LIB32_OBJS) +<< + +!ELSEIF "$(CFG)" == "xml - Win32 Debug" + +OUTDIR=.\LibD +INTDIR=.\LibD +# Begin Custom Macros +OutDir=.\LibD +# End Custom Macros + +ALL : ".\expat.h" ".\config.h" "$(OUTDIR)\xml.lib" + + +CLEAN : + -@erase "$(INTDIR)\xml_src.idb" + -@erase "$(INTDIR)\xml_src.pdb" + -@erase "$(INTDIR)\xmlparse.obj" + -@erase "$(INTDIR)\xmlrole.obj" + -@erase "$(INTDIR)\xmltok.obj" + -@erase "$(OUTDIR)\xml.lib" + -@erase ".\config.h" + -@erase ".\expat.h" + +"$(OUTDIR)" : + if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" + +CPP=cl.exe +CPP_PROJ=/nologo /MDd /W3 /Zi /Od /I "." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D VERSION=\"expat_1.95.2\" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\xml_src" /FD /EHsc /c + +.c{$(INTDIR)}.obj:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.cpp{$(INTDIR)}.obj:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.cxx{$(INTDIR)}.obj:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.c{$(INTDIR)}.sbr:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.cpp{$(INTDIR)}.sbr:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +.cxx{$(INTDIR)}.sbr:: + $(CPP) @<< + $(CPP_PROJ) $< +<< + +RSC=rc.exe +BSC32=bscmake.exe +BSC32_FLAGS=/nologo /o"$(OUTDIR)\xml.bsc" +BSC32_SBRS= \ + +LIB32=link.exe -lib +LIB32_FLAGS=/nologo /out:"$(OUTDIR)\xml.lib" +LIB32_OBJS= \ + "$(INTDIR)\xmlparse.obj" \ + "$(INTDIR)\xmlrole.obj" \ + "$(INTDIR)\xmltok.obj" + +"$(OUTDIR)\xml.lib" : "$(OUTDIR)" $(DEF_FILE) $(LIB32_OBJS) + $(LIB32) @<< + $(LIB32_FLAGS) $(DEF_FLAGS) $(LIB32_OBJS) +<< + +!ENDIF + + +!IF "$(NO_EXTERNAL_DEPS)" != "1" +!IF EXISTS("xml.dep") +!INCLUDE "xml.dep" +!ELSE +!MESSAGE Warning: cannot find "xml.dep" +!ENDIF +!ENDIF + + +!IF "$(CFG)" == "xml - Win32 Release" || "$(CFG)" == "xml - Win32 Debug" +SOURCE=.\xmlparse.c + +"$(INTDIR)\xmlparse.obj" : $(SOURCE) "$(INTDIR)" ".\winconfig.h" ".\expat.h" ".\config.h" + + +SOURCE=.\xmlrole.c + +"$(INTDIR)\xmlrole.obj" : $(SOURCE) "$(INTDIR)" ".\winconfig.h" ".\config.h" + + +SOURCE=.\xmltok.c + +"$(INTDIR)\xmltok.obj" : $(SOURCE) "$(INTDIR)" ".\winconfig.h" ".\config.h" + + +SOURCE=xmltok_impl.c +SOURCE=xmltok_ns.c +SOURCE=.\expat.h.in + +!IF "$(CFG)" == "xml - Win32 Release" + +InputPath=.\expat.h.in + +".\expat.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + < .\expat.h +<< + + +!ELSEIF "$(CFG)" == "xml - Win32 Debug" + +InputPath=.\expat.h.in + +".\expat.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + < .\expat.h +<< + + +!ENDIF + +SOURCE=.\winconfig.h + +!IF "$(CFG)" == "xml - Win32 Release" + +InputPath=.\winconfig.h + +".\config.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + < .\config.h +<< + + +!ELSEIF "$(CFG)" == "xml - Win32 Debug" + +InputPath=.\winconfig.h + +".\config.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + < .\config.h +<< + + +!ENDIF + + +!ENDIF + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xmlparse.c b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xmlparse.c new file mode 100644 index 00000000..4a86edc3 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xmlparse.c @@ -0,0 +1,5817 @@ +/* Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +#include +#include /* memset(), memcpy() */ + +#define XML_BUILDING_EXPAT 1 + +#ifdef COMPILED_FROM_DSP +#include "winconfig.h" +#elif defined(MACOS_CLASSIC) +#include "macconfig.h" +#else +#ifdef HAVE_EXPAT_CONFIG_H +#include +#endif +#endif /* ndef COMPILED_FROM_DSP */ + +#include "expat.h" + +#ifdef XML_UNICODE +#define XML_ENCODE_MAX XML_UTF16_ENCODE_MAX +#define XmlConvert XmlUtf16Convert +#define XmlGetInternalEncoding XmlGetUtf16InternalEncoding +#define XmlGetInternalEncodingNS XmlGetUtf16InternalEncodingNS +#define XmlEncode XmlUtf16Encode +#define MUST_CONVERT(enc, s) (!(enc)->isUtf16 || (((unsigned long)s) & 1)) +typedef unsigned short ICHAR; +#else +#define XML_ENCODE_MAX XML_UTF8_ENCODE_MAX +#define XmlConvert XmlUtf8Convert +#define XmlGetInternalEncoding XmlGetUtf8InternalEncoding +#define XmlGetInternalEncodingNS XmlGetUtf8InternalEncodingNS +#define XmlEncode XmlUtf8Encode +#define MUST_CONVERT(enc, s) (!(enc)->isUtf8) +typedef char ICHAR; +#endif + + +#ifndef XML_NS + +#define XmlInitEncodingNS XmlInitEncoding +#define XmlInitUnknownEncodingNS XmlInitUnknownEncoding +#undef XmlGetInternalEncodingNS +#define XmlGetInternalEncodingNS XmlGetInternalEncoding +#define XmlParseXmlDeclNS XmlParseXmlDecl + +#endif + +#ifdef XML_UNICODE + +#ifdef XML_UNICODE_WCHAR_T +#define XML_T(x) (const wchar_t)x +#define XML_L(x) L ## x +#else +#define XML_T(x) (const unsigned short)x +#define XML_L(x) x +#endif + +#else + +#define XML_T(x) x +#define XML_L(x) x + +#endif + +/* Round up n to be a multiple of sz, where sz is a power of 2. */ +#define ROUND_UP(n, sz) (((n) + ((sz) - 1)) & ~((sz) - 1)) + +/* Handle the case where memmove() doesn't exist. */ +#ifndef HAVE_MEMMOVE +#ifdef HAVE_BCOPY +#define memmove(d,s,l) bcopy((s),(d),(l)) +#else +#error memmove does not exist on this platform, nor is a substitute available +#endif /* HAVE_BCOPY */ +#endif /* HAVE_MEMMOVE */ + +#include "internal.h" +#include "xmltok.h" +#include "xmlrole.h" + +typedef const XML_Char *KEY; + +typedef struct { + KEY name; +} NAMED; + +typedef struct { + NAMED **v; + unsigned char power; + size_t size; + size_t used; + const XML_Memory_Handling_Suite *mem; +} HASH_TABLE; + +/* Basic character hash algorithm, taken from Python's string hash: + h = h * 1000003 ^ character, the constant being a prime number. + +*/ +#ifdef XML_UNICODE +#define CHAR_HASH(h, c) \ + (((h) * 0xF4243) ^ (unsigned short)(c)) +#else +#define CHAR_HASH(h, c) \ + (((h) * 0xF4243) ^ (unsigned char)(c)) +#endif + +/* For probing (after a collision) we need a step size relative prime + to the hash table size, which is a power of 2. We use double-hashing, + since we can calculate a second hash value cheaply by taking those bits + of the first hash value that were discarded (masked out) when the table + index was calculated: index = hash & mask, where mask = table->size - 1. + We limit the maximum step size to table->size / 4 (mask >> 2) and make + it odd, since odd numbers are always relative prime to a power of 2. +*/ +#define SECOND_HASH(hash, mask, power) \ + ((((hash) & ~(mask)) >> ((power) - 1)) & ((mask) >> 2)) +#define PROBE_STEP(hash, mask, power) \ + ((unsigned char)((SECOND_HASH(hash, mask, power)) | 1)) + +typedef struct { + NAMED **p; + NAMED **end; +} HASH_TABLE_ITER; + +#define INIT_TAG_BUF_SIZE 32 /* must be a multiple of sizeof(XML_Char) */ +#define INIT_DATA_BUF_SIZE 1024 +#define INIT_ATTS_SIZE 16 +#define INIT_ATTS_VERSION 0xFFFFFFFF +#define INIT_BLOCK_SIZE 1024 +#define INIT_BUFFER_SIZE 1024 + +#define EXPAND_SPARE 24 + +typedef struct binding { + struct prefix *prefix; + struct binding *nextTagBinding; + struct binding *prevPrefixBinding; + const struct attribute_id *attId; + XML_Char *uri; + int uriLen; + int uriAlloc; +} BINDING; + +typedef struct prefix { + const XML_Char *name; + BINDING *binding; +} PREFIX; + +typedef struct { + const XML_Char *str; + const XML_Char *localPart; + const XML_Char *prefix; + int strLen; + int uriLen; + int prefixLen; +} TAG_NAME; + +/* TAG represents an open element. + The name of the element is stored in both the document and API + encodings. The memory buffer 'buf' is a separately-allocated + memory area which stores the name. During the XML_Parse()/ + XMLParseBuffer() when the element is open, the memory for the 'raw' + version of the name (in the document encoding) is shared with the + document buffer. If the element is open across calls to + XML_Parse()/XML_ParseBuffer(), the buffer is re-allocated to + contain the 'raw' name as well. + + A parser re-uses these structures, maintaining a list of allocated + TAG objects in a free list. +*/ +typedef struct tag { + struct tag *parent; /* parent of this element */ + const char *rawName; /* tagName in the original encoding */ + int rawNameLength; + TAG_NAME name; /* tagName in the API encoding */ + char *buf; /* buffer for name components */ + char *bufEnd; /* end of the buffer */ + BINDING *bindings; +} TAG; + +typedef struct { + const XML_Char *name; + const XML_Char *textPtr; + int textLen; + const XML_Char *systemId; + const XML_Char *base; + const XML_Char *publicId; + const XML_Char *notation; + XML_Bool open; + XML_Bool is_param; + XML_Bool is_internal; /* true if declared in internal subset outside PE */ +} ENTITY; + +typedef struct { + enum XML_Content_Type type; + enum XML_Content_Quant quant; + const XML_Char * name; + int firstchild; + int lastchild; + int childcnt; + int nextsib; +} CONTENT_SCAFFOLD; + +#define INIT_SCAFFOLD_ELEMENTS 32 + +typedef struct block { + struct block *next; + int size; + XML_Char s[1]; +} BLOCK; + +typedef struct { + BLOCK *blocks; + BLOCK *freeBlocks; + const XML_Char *end; + XML_Char *ptr; + XML_Char *start; + const XML_Memory_Handling_Suite *mem; +} STRING_POOL; + +/* The XML_Char before the name is used to determine whether + an attribute has been specified. */ +typedef struct attribute_id { + XML_Char *name; + PREFIX *prefix; + XML_Bool maybeTokenized; + XML_Bool xmlns; +} ATTRIBUTE_ID; + +typedef struct { + const ATTRIBUTE_ID *id; + XML_Bool isCdata; + const XML_Char *value; +} DEFAULT_ATTRIBUTE; + +typedef struct { + unsigned long version; + unsigned long hash; + const XML_Char *uriName; +} NS_ATT; + +typedef struct { + const XML_Char *name; + PREFIX *prefix; + const ATTRIBUTE_ID *idAtt; + int nDefaultAtts; + int allocDefaultAtts; + DEFAULT_ATTRIBUTE *defaultAtts; +} ELEMENT_TYPE; + +typedef struct { + HASH_TABLE generalEntities; + HASH_TABLE elementTypes; + HASH_TABLE attributeIds; + HASH_TABLE prefixes; + STRING_POOL pool; + STRING_POOL entityValuePool; + /* false once a parameter entity reference has been skipped */ + XML_Bool keepProcessing; + /* true once an internal or external PE reference has been encountered; + this includes the reference to an external subset */ + XML_Bool hasParamEntityRefs; + XML_Bool standalone; +#ifdef XML_DTD + /* indicates if external PE has been read */ + XML_Bool paramEntityRead; + HASH_TABLE paramEntities; +#endif /* XML_DTD */ + PREFIX defaultPrefix; + /* === scaffolding for building content model === */ + XML_Bool in_eldecl; + CONTENT_SCAFFOLD *scaffold; + unsigned contentStringLen; + unsigned scaffSize; + unsigned scaffCount; + int scaffLevel; + int *scaffIndex; +} DTD; + +typedef struct open_internal_entity { + const char *internalEventPtr; + const char *internalEventEndPtr; + struct open_internal_entity *next; + ENTITY *entity; +} OPEN_INTERNAL_ENTITY; + +typedef enum XML_Error PTRCALL Processor(XML_Parser parser, + const char *start, + const char *end, + const char **endPtr); + +static Processor prologProcessor; +static Processor prologInitProcessor; +static Processor contentProcessor; +static Processor cdataSectionProcessor; +#ifdef XML_DTD +static Processor ignoreSectionProcessor; +static Processor externalParEntProcessor; +static Processor externalParEntInitProcessor; +static Processor entityValueProcessor; +static Processor entityValueInitProcessor; +#endif /* XML_DTD */ +static Processor epilogProcessor; +static Processor errorProcessor; +static Processor externalEntityInitProcessor; +static Processor externalEntityInitProcessor2; +static Processor externalEntityInitProcessor3; +static Processor externalEntityContentProcessor; + +static enum XML_Error +handleUnknownEncoding(XML_Parser parser, const XML_Char *encodingName); +static enum XML_Error +processXmlDecl(XML_Parser parser, int isGeneralTextEntity, + const char *, const char *); +static enum XML_Error +initializeEncoding(XML_Parser parser); +static enum XML_Error +doProlog(XML_Parser parser, const ENCODING *enc, const char *s, + const char *end, int tok, const char *next, const char **nextPtr); +static enum XML_Error +processInternalParamEntity(XML_Parser parser, ENTITY *entity); +static enum XML_Error +doContent(XML_Parser parser, int startTagLevel, const ENCODING *enc, + const char *start, const char *end, const char **endPtr); +static enum XML_Error +doCdataSection(XML_Parser parser, const ENCODING *, const char **startPtr, + const char *end, const char **nextPtr); +#ifdef XML_DTD +static enum XML_Error +doIgnoreSection(XML_Parser parser, const ENCODING *, const char **startPtr, + const char *end, const char **nextPtr); +#endif /* XML_DTD */ + +static enum XML_Error +storeAtts(XML_Parser parser, const ENCODING *, const char *s, + TAG_NAME *tagNamePtr, BINDING **bindingsPtr); +static enum XML_Error +addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId, + const XML_Char *uri, BINDING **bindingsPtr); +static int +defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *, + XML_Bool isCdata, XML_Bool isId, const XML_Char *dfltValue, + XML_Parser parser); +static enum XML_Error +storeAttributeValue(XML_Parser parser, const ENCODING *, XML_Bool isCdata, + const char *, const char *, STRING_POOL *); +static enum XML_Error +appendAttributeValue(XML_Parser parser, const ENCODING *, XML_Bool isCdata, + const char *, const char *, STRING_POOL *); +static ATTRIBUTE_ID * +getAttributeId(XML_Parser parser, const ENCODING *enc, const char *start, + const char *end); +static int +setElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *); +static enum XML_Error +storeEntityValue(XML_Parser parser, const ENCODING *enc, const char *start, + const char *end); +static int +reportProcessingInstruction(XML_Parser parser, const ENCODING *enc, + const char *start, const char *end); +static int +reportComment(XML_Parser parser, const ENCODING *enc, const char *start, + const char *end); +static void +reportDefault(XML_Parser parser, const ENCODING *enc, const char *start, + const char *end); + +static const XML_Char * getContext(XML_Parser parser); +static XML_Bool +setContext(XML_Parser parser, const XML_Char *context); + +static void FASTCALL normalizePublicId(XML_Char *s); + +static DTD * dtdCreate(const XML_Memory_Handling_Suite *ms); +/* do not call if parentParser != NULL */ +static void dtdReset(DTD *p, const XML_Memory_Handling_Suite *ms); +static void +dtdDestroy(DTD *p, XML_Bool isDocEntity, const XML_Memory_Handling_Suite *ms); +static int +dtdCopy(DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms); +static int +copyEntityTable(HASH_TABLE *, STRING_POOL *, const HASH_TABLE *); + +static NAMED * +lookup(HASH_TABLE *table, KEY name, size_t createSize); +static void FASTCALL +hashTableInit(HASH_TABLE *, const XML_Memory_Handling_Suite *ms); +static void FASTCALL hashTableClear(HASH_TABLE *); +static void FASTCALL hashTableDestroy(HASH_TABLE *); +static void FASTCALL +hashTableIterInit(HASH_TABLE_ITER *, const HASH_TABLE *); +static NAMED * FASTCALL hashTableIterNext(HASH_TABLE_ITER *); + +static void FASTCALL +poolInit(STRING_POOL *, const XML_Memory_Handling_Suite *ms); +static void FASTCALL poolClear(STRING_POOL *); +static void FASTCALL poolDestroy(STRING_POOL *); +static XML_Char * +poolAppend(STRING_POOL *pool, const ENCODING *enc, + const char *ptr, const char *end); +static XML_Char * +poolStoreString(STRING_POOL *pool, const ENCODING *enc, + const char *ptr, const char *end); +static XML_Bool FASTCALL poolGrow(STRING_POOL *pool); +static const XML_Char * FASTCALL +poolCopyString(STRING_POOL *pool, const XML_Char *s); +static const XML_Char * +poolCopyStringN(STRING_POOL *pool, const XML_Char *s, int n); +static const XML_Char * FASTCALL +poolAppendString(STRING_POOL *pool, const XML_Char *s); + +static int FASTCALL nextScaffoldPart(XML_Parser parser); +static XML_Content * build_model(XML_Parser parser); +static ELEMENT_TYPE * +getElementType(XML_Parser parser, const ENCODING *enc, + const char *ptr, const char *end); + +static XML_Parser +parserCreate(const XML_Char *encodingName, + const XML_Memory_Handling_Suite *memsuite, + const XML_Char *nameSep, + DTD *dtd); +static void +parserInit(XML_Parser parser, const XML_Char *encodingName); + +#define poolStart(pool) ((pool)->start) +#define poolEnd(pool) ((pool)->ptr) +#define poolLength(pool) ((pool)->ptr - (pool)->start) +#define poolChop(pool) ((void)--(pool->ptr)) +#define poolLastChar(pool) (((pool)->ptr)[-1]) +#define poolDiscard(pool) ((pool)->ptr = (pool)->start) +#define poolFinish(pool) ((pool)->start = (pool)->ptr) +#define poolAppendChar(pool, c) \ + (((pool)->ptr == (pool)->end && !poolGrow(pool)) \ + ? 0 \ + : ((*((pool)->ptr)++ = c), 1)) + +struct XML_ParserStruct { + /* The first member must be userData so that the XML_GetUserData + macro works. */ + void *m_userData; + void *m_handlerArg; + char *m_buffer; + const XML_Memory_Handling_Suite m_mem; + /* first character to be parsed */ + const char *m_bufferPtr; + /* past last character to be parsed */ + char *m_bufferEnd; + /* allocated end of buffer */ + const char *m_bufferLim; + long m_parseEndByteIndex; + const char *m_parseEndPtr; + XML_Char *m_dataBuf; + XML_Char *m_dataBufEnd; + XML_StartElementHandler m_startElementHandler; + XML_EndElementHandler m_endElementHandler; + XML_CharacterDataHandler m_characterDataHandler; + XML_ProcessingInstructionHandler m_processingInstructionHandler; + XML_CommentHandler m_commentHandler; + XML_StartCdataSectionHandler m_startCdataSectionHandler; + XML_EndCdataSectionHandler m_endCdataSectionHandler; + XML_DefaultHandler m_defaultHandler; + XML_StartDoctypeDeclHandler m_startDoctypeDeclHandler; + XML_EndDoctypeDeclHandler m_endDoctypeDeclHandler; + XML_UnparsedEntityDeclHandler m_unparsedEntityDeclHandler; + XML_NotationDeclHandler m_notationDeclHandler; + XML_StartNamespaceDeclHandler m_startNamespaceDeclHandler; + XML_EndNamespaceDeclHandler m_endNamespaceDeclHandler; + XML_NotStandaloneHandler m_notStandaloneHandler; + XML_ExternalEntityRefHandler m_externalEntityRefHandler; + XML_Parser m_externalEntityRefHandlerArg; + XML_SkippedEntityHandler m_skippedEntityHandler; + XML_UnknownEncodingHandler m_unknownEncodingHandler; + XML_ElementDeclHandler m_elementDeclHandler; + XML_AttlistDeclHandler m_attlistDeclHandler; + XML_EntityDeclHandler m_entityDeclHandler; + XML_XmlDeclHandler m_xmlDeclHandler; + const ENCODING *m_encoding; + INIT_ENCODING m_initEncoding; + const ENCODING *m_internalEncoding; + const XML_Char *m_protocolEncodingName; + XML_Bool m_ns; + XML_Bool m_ns_triplets; + void *m_unknownEncodingMem; + void *m_unknownEncodingData; + void *m_unknownEncodingHandlerData; + void (*m_unknownEncodingRelease)(void *); + PROLOG_STATE m_prologState; + Processor *m_processor; + enum XML_Error m_errorCode; + const char *m_eventPtr; + const char *m_eventEndPtr; + const char *m_positionPtr; + OPEN_INTERNAL_ENTITY *m_openInternalEntities; + XML_Bool m_defaultExpandInternalEntities; + int m_tagLevel; + ENTITY *m_declEntity; + const XML_Char *m_doctypeName; + const XML_Char *m_doctypeSysid; + const XML_Char *m_doctypePubid; + const XML_Char *m_declAttributeType; + const XML_Char *m_declNotationName; + const XML_Char *m_declNotationPublicId; + ELEMENT_TYPE *m_declElementType; + ATTRIBUTE_ID *m_declAttributeId; + XML_Bool m_declAttributeIsCdata; + XML_Bool m_declAttributeIsId; + DTD *m_dtd; + const XML_Char *m_curBase; + TAG *m_tagStack; + TAG *m_freeTagList; + BINDING *m_inheritedBindings; + BINDING *m_freeBindingList; + int m_attsSize; + int m_nSpecifiedAtts; + int m_idAttIndex; + ATTRIBUTE *m_atts; + NS_ATT *m_nsAtts; + unsigned long m_nsAttsVersion; + unsigned char m_nsAttsPower; + POSITION m_position; + STRING_POOL m_tempPool; + STRING_POOL m_temp2Pool; + char *m_groupConnector; + unsigned int m_groupSize; + XML_Char m_namespaceSeparator; + XML_Parser m_parentParser; +#ifdef XML_DTD + XML_Bool m_isParamEntity; + XML_Bool m_useForeignDTD; + enum XML_ParamEntityParsing m_paramEntityParsing; +#endif +}; + +#define MALLOC(s) (parser->m_mem.malloc_fcn((s))) +#define REALLOC(p,s) (parser->m_mem.realloc_fcn((p),(s))) +#define FREE(p) (parser->m_mem.free_fcn((p))) + +#define userData (parser->m_userData) +#define handlerArg (parser->m_handlerArg) +#define startElementHandler (parser->m_startElementHandler) +#define endElementHandler (parser->m_endElementHandler) +#define characterDataHandler (parser->m_characterDataHandler) +#define processingInstructionHandler \ + (parser->m_processingInstructionHandler) +#define commentHandler (parser->m_commentHandler) +#define startCdataSectionHandler \ + (parser->m_startCdataSectionHandler) +#define endCdataSectionHandler (parser->m_endCdataSectionHandler) +#define defaultHandler (parser->m_defaultHandler) +#define startDoctypeDeclHandler (parser->m_startDoctypeDeclHandler) +#define endDoctypeDeclHandler (parser->m_endDoctypeDeclHandler) +#define unparsedEntityDeclHandler \ + (parser->m_unparsedEntityDeclHandler) +#define notationDeclHandler (parser->m_notationDeclHandler) +#define startNamespaceDeclHandler \ + (parser->m_startNamespaceDeclHandler) +#define endNamespaceDeclHandler (parser->m_endNamespaceDeclHandler) +#define notStandaloneHandler (parser->m_notStandaloneHandler) +#define externalEntityRefHandler \ + (parser->m_externalEntityRefHandler) +#define externalEntityRefHandlerArg \ + (parser->m_externalEntityRefHandlerArg) +#define internalEntityRefHandler \ + (parser->m_internalEntityRefHandler) +#define skippedEntityHandler (parser->m_skippedEntityHandler) +#define unknownEncodingHandler (parser->m_unknownEncodingHandler) +#define elementDeclHandler (parser->m_elementDeclHandler) +#define attlistDeclHandler (parser->m_attlistDeclHandler) +#define entityDeclHandler (parser->m_entityDeclHandler) +#define xmlDeclHandler (parser->m_xmlDeclHandler) +#define encoding (parser->m_encoding) +#define initEncoding (parser->m_initEncoding) +#define internalEncoding (parser->m_internalEncoding) +#define unknownEncodingMem (parser->m_unknownEncodingMem) +#define unknownEncodingData (parser->m_unknownEncodingData) +#define unknownEncodingHandlerData \ + (parser->m_unknownEncodingHandlerData) +#define unknownEncodingRelease (parser->m_unknownEncodingRelease) +#define protocolEncodingName (parser->m_protocolEncodingName) +#define ns (parser->m_ns) +#define ns_triplets (parser->m_ns_triplets) +#define prologState (parser->m_prologState) +#define processor (parser->m_processor) +#define errorCode (parser->m_errorCode) +#define eventPtr (parser->m_eventPtr) +#define eventEndPtr (parser->m_eventEndPtr) +#define positionPtr (parser->m_positionPtr) +#define position (parser->m_position) +#define openInternalEntities (parser->m_openInternalEntities) +#define defaultExpandInternalEntities \ + (parser->m_defaultExpandInternalEntities) +#define tagLevel (parser->m_tagLevel) +#define buffer (parser->m_buffer) +#define bufferPtr (parser->m_bufferPtr) +#define bufferEnd (parser->m_bufferEnd) +#define parseEndByteIndex (parser->m_parseEndByteIndex) +#define parseEndPtr (parser->m_parseEndPtr) +#define bufferLim (parser->m_bufferLim) +#define dataBuf (parser->m_dataBuf) +#define dataBufEnd (parser->m_dataBufEnd) +#define _dtd (parser->m_dtd) +#define curBase (parser->m_curBase) +#define declEntity (parser->m_declEntity) +#define doctypeName (parser->m_doctypeName) +#define doctypeSysid (parser->m_doctypeSysid) +#define doctypePubid (parser->m_doctypePubid) +#define declAttributeType (parser->m_declAttributeType) +#define declNotationName (parser->m_declNotationName) +#define declNotationPublicId (parser->m_declNotationPublicId) +#define declElementType (parser->m_declElementType) +#define declAttributeId (parser->m_declAttributeId) +#define declAttributeIsCdata (parser->m_declAttributeIsCdata) +#define declAttributeIsId (parser->m_declAttributeIsId) +#define freeTagList (parser->m_freeTagList) +#define freeBindingList (parser->m_freeBindingList) +#define inheritedBindings (parser->m_inheritedBindings) +#define tagStack (parser->m_tagStack) +#define atts (parser->m_atts) +#define attsSize (parser->m_attsSize) +#define nSpecifiedAtts (parser->m_nSpecifiedAtts) +#define idAttIndex (parser->m_idAttIndex) +#define nsAtts (parser->m_nsAtts) +#define nsAttsVersion (parser->m_nsAttsVersion) +#define nsAttsPower (parser->m_nsAttsPower) +#define tempPool (parser->m_tempPool) +#define temp2Pool (parser->m_temp2Pool) +#define groupConnector (parser->m_groupConnector) +#define groupSize (parser->m_groupSize) +#define namespaceSeparator (parser->m_namespaceSeparator) +#define parentParser (parser->m_parentParser) +#ifdef XML_DTD +#define isParamEntity (parser->m_isParamEntity) +#define useForeignDTD (parser->m_useForeignDTD) +#define paramEntityParsing (parser->m_paramEntityParsing) +#endif /* XML_DTD */ + +#ifdef XML_DTD +#define parsing \ + (parentParser \ + ? \ + (isParamEntity \ + ? \ + (processor != externalParEntInitProcessor) \ + : \ + (processor != externalEntityInitProcessor)) \ + : \ + (processor != prologInitProcessor)) +#else +#define parsing \ + (parentParser \ + ? \ + (processor != externalEntityInitProcessor) \ + : \ + (processor != prologInitProcessor)) +#endif /* XML_DTD */ + +XML_Parser XMLCALL +XML_ParserCreate(const XML_Char *encodingName) +{ + return XML_ParserCreate_MM(encodingName, NULL, NULL); +} + +XML_Parser XMLCALL +XML_ParserCreateNS(const XML_Char *encodingName, XML_Char nsSep) +{ + XML_Char tmp[2]; + *tmp = nsSep; + return XML_ParserCreate_MM(encodingName, NULL, tmp); +} + +static const XML_Char implicitContext[] = { + 'x', 'm', 'l', '=', 'h', 't', 't', 'p', ':', '/', '/', + 'w', 'w', 'w', '.', 'w', '3', '.', 'o', 'r', 'g', '/', + 'X', 'M', 'L', '/', '1', '9', '9', '8', '/', + 'n', 'a', 'm', 'e', 's', 'p', 'a', 'c', 'e', '\0' +}; + +XML_Parser XMLCALL +XML_ParserCreate_MM(const XML_Char *encodingName, + const XML_Memory_Handling_Suite *memsuite, + const XML_Char *nameSep) +{ + XML_Parser parser = parserCreate(encodingName, memsuite, nameSep, NULL); + if (parser != NULL && ns) { + /* implicit context only set for root parser, since child + parsers (i.e. external entity parsers) will inherit it + */ + if (!setContext(parser, implicitContext)) { + XML_ParserFree(parser); + return NULL; + } + } + return parser; +} + +static XML_Parser +parserCreate(const XML_Char *encodingName, + const XML_Memory_Handling_Suite *memsuite, + const XML_Char *nameSep, + DTD *dtd) +{ + XML_Parser parser; + + if (memsuite) { + XML_Memory_Handling_Suite *mtemp; + parser = (XML_Parser) + memsuite->malloc_fcn(sizeof(struct XML_ParserStruct)); + if (parser != NULL) { + mtemp = (XML_Memory_Handling_Suite *)&(parser->m_mem); + mtemp->malloc_fcn = memsuite->malloc_fcn; + mtemp->realloc_fcn = memsuite->realloc_fcn; + mtemp->free_fcn = memsuite->free_fcn; + } + } + else { + XML_Memory_Handling_Suite *mtemp; + parser = (XML_Parser)malloc(sizeof(struct XML_ParserStruct)); + if (parser != NULL) { + mtemp = (XML_Memory_Handling_Suite *)&(parser->m_mem); + mtemp->malloc_fcn = malloc; + mtemp->realloc_fcn = realloc; + mtemp->free_fcn = free; + } + } + + if (!parser) + return parser; + + buffer = NULL; + bufferLim = NULL; + + attsSize = INIT_ATTS_SIZE; + atts = (ATTRIBUTE *)MALLOC(attsSize * sizeof(ATTRIBUTE)); + if (atts == NULL) { + FREE(parser); + return NULL; + } + dataBuf = (XML_Char *)MALLOC(INIT_DATA_BUF_SIZE * sizeof(XML_Char)); + if (dataBuf == NULL) { + FREE(atts); + FREE(parser); + return NULL; + } + dataBufEnd = dataBuf + INIT_DATA_BUF_SIZE; + + if (dtd) + _dtd = dtd; + else { + _dtd = dtdCreate(&parser->m_mem); + if (_dtd == NULL) { + FREE(dataBuf); + FREE(atts); + FREE(parser); + return NULL; + } + } + + freeBindingList = NULL; + freeTagList = NULL; + + groupSize = 0; + groupConnector = NULL; + + unknownEncodingHandler = NULL; + unknownEncodingHandlerData = NULL; + + namespaceSeparator = '!'; + ns = XML_FALSE; + ns_triplets = XML_FALSE; + + nsAtts = NULL; + nsAttsVersion = 0; + nsAttsPower = 0; + + poolInit(&tempPool, &(parser->m_mem)); + poolInit(&temp2Pool, &(parser->m_mem)); + parserInit(parser, encodingName); + + if (encodingName && !protocolEncodingName) { + XML_ParserFree(parser); + return NULL; + } + + if (nameSep) { + ns = XML_TRUE; + internalEncoding = XmlGetInternalEncodingNS(); + namespaceSeparator = *nameSep; + } + else { + internalEncoding = XmlGetInternalEncoding(); + } + + return parser; +} + +static void +parserInit(XML_Parser parser, const XML_Char *encodingName) +{ + processor = prologInitProcessor; + XmlPrologStateInit(&prologState); + protocolEncodingName = (encodingName != NULL + ? poolCopyString(&tempPool, encodingName) + : NULL); + curBase = NULL; + XmlInitEncoding(&initEncoding, &encoding, 0); + userData = NULL; + handlerArg = NULL; + startElementHandler = NULL; + endElementHandler = NULL; + characterDataHandler = NULL; + processingInstructionHandler = NULL; + commentHandler = NULL; + startCdataSectionHandler = NULL; + endCdataSectionHandler = NULL; + defaultHandler = NULL; + startDoctypeDeclHandler = NULL; + endDoctypeDeclHandler = NULL; + unparsedEntityDeclHandler = NULL; + notationDeclHandler = NULL; + startNamespaceDeclHandler = NULL; + endNamespaceDeclHandler = NULL; + notStandaloneHandler = NULL; + externalEntityRefHandler = NULL; + externalEntityRefHandlerArg = parser; + skippedEntityHandler = NULL; + elementDeclHandler = NULL; + attlistDeclHandler = NULL; + entityDeclHandler = NULL; + xmlDeclHandler = NULL; + bufferPtr = buffer; + bufferEnd = buffer; + parseEndByteIndex = 0; + parseEndPtr = NULL; + declElementType = NULL; + declAttributeId = NULL; + declEntity = NULL; + doctypeName = NULL; + doctypeSysid = NULL; + doctypePubid = NULL; + declAttributeType = NULL; + declNotationName = NULL; + declNotationPublicId = NULL; + declAttributeIsCdata = XML_FALSE; + declAttributeIsId = XML_FALSE; + memset(&position, 0, sizeof(POSITION)); + errorCode = XML_ERROR_NONE; + eventPtr = NULL; + eventEndPtr = NULL; + positionPtr = NULL; + openInternalEntities = 0; + defaultExpandInternalEntities = XML_TRUE; + tagLevel = 0; + tagStack = NULL; + inheritedBindings = NULL; + nSpecifiedAtts = 0; + unknownEncodingMem = NULL; + unknownEncodingRelease = NULL; + unknownEncodingData = NULL; + parentParser = NULL; +#ifdef XML_DTD + isParamEntity = XML_FALSE; + useForeignDTD = XML_FALSE; + paramEntityParsing = XML_PARAM_ENTITY_PARSING_NEVER; +#endif +} + +/* moves list of bindings to freeBindingList */ +static void FASTCALL +moveToFreeBindingList(XML_Parser parser, BINDING *bindings) +{ + while (bindings) { + BINDING *b = bindings; + bindings = bindings->nextTagBinding; + b->nextTagBinding = freeBindingList; + freeBindingList = b; + } +} + +XML_Bool XMLCALL +XML_ParserReset(XML_Parser parser, const XML_Char *encodingName) +{ + TAG *tStk; + if (parentParser) + return XML_FALSE; + /* move tagStack to freeTagList */ + tStk = tagStack; + while (tStk) { + TAG *tag = tStk; + tStk = tStk->parent; + tag->parent = freeTagList; + moveToFreeBindingList(parser, tag->bindings); + tag->bindings = NULL; + freeTagList = tag; + } + moveToFreeBindingList(parser, inheritedBindings); + FREE(unknownEncodingMem); + if (unknownEncodingRelease) + unknownEncodingRelease(unknownEncodingData); + poolClear(&tempPool); + poolClear(&temp2Pool); + parserInit(parser, encodingName); + dtdReset(_dtd, &parser->m_mem); + return setContext(parser, implicitContext); +} + +enum XML_Status XMLCALL +XML_SetEncoding(XML_Parser parser, const XML_Char *encodingName) +{ + /* Block after XML_Parse()/XML_ParseBuffer() has been called. + XXX There's no way for the caller to determine which of the + XXX possible error cases caused the XML_STATUS_ERROR return. + */ + if (parsing) + return XML_STATUS_ERROR; + if (encodingName == NULL) + protocolEncodingName = NULL; + else { + protocolEncodingName = poolCopyString(&tempPool, encodingName); + if (!protocolEncodingName) + return XML_STATUS_ERROR; + } + return XML_STATUS_OK; +} + +XML_Parser XMLCALL +XML_ExternalEntityParserCreate(XML_Parser oldParser, + const XML_Char *context, + const XML_Char *encodingName) +{ + XML_Parser parser = oldParser; + DTD *newDtd = NULL; + DTD *oldDtd = _dtd; + XML_StartElementHandler oldStartElementHandler = startElementHandler; + XML_EndElementHandler oldEndElementHandler = endElementHandler; + XML_CharacterDataHandler oldCharacterDataHandler = characterDataHandler; + XML_ProcessingInstructionHandler oldProcessingInstructionHandler + = processingInstructionHandler; + XML_CommentHandler oldCommentHandler = commentHandler; + XML_StartCdataSectionHandler oldStartCdataSectionHandler + = startCdataSectionHandler; + XML_EndCdataSectionHandler oldEndCdataSectionHandler + = endCdataSectionHandler; + XML_DefaultHandler oldDefaultHandler = defaultHandler; + XML_UnparsedEntityDeclHandler oldUnparsedEntityDeclHandler + = unparsedEntityDeclHandler; + XML_NotationDeclHandler oldNotationDeclHandler = notationDeclHandler; + XML_StartNamespaceDeclHandler oldStartNamespaceDeclHandler + = startNamespaceDeclHandler; + XML_EndNamespaceDeclHandler oldEndNamespaceDeclHandler + = endNamespaceDeclHandler; + XML_NotStandaloneHandler oldNotStandaloneHandler = notStandaloneHandler; + XML_ExternalEntityRefHandler oldExternalEntityRefHandler + = externalEntityRefHandler; + XML_SkippedEntityHandler oldSkippedEntityHandler = skippedEntityHandler; + XML_UnknownEncodingHandler oldUnknownEncodingHandler + = unknownEncodingHandler; + XML_ElementDeclHandler oldElementDeclHandler = elementDeclHandler; + XML_AttlistDeclHandler oldAttlistDeclHandler = attlistDeclHandler; + XML_EntityDeclHandler oldEntityDeclHandler = entityDeclHandler; + XML_XmlDeclHandler oldXmlDeclHandler = xmlDeclHandler; + ELEMENT_TYPE * oldDeclElementType = declElementType; + + void *oldUserData = userData; + void *oldHandlerArg = handlerArg; + XML_Bool oldDefaultExpandInternalEntities = defaultExpandInternalEntities; + XML_Parser oldExternalEntityRefHandlerArg = externalEntityRefHandlerArg; +#ifdef XML_DTD + enum XML_ParamEntityParsing oldParamEntityParsing = paramEntityParsing; + int oldInEntityValue = prologState.inEntityValue; +#endif + XML_Bool oldns_triplets = ns_triplets; + +#ifdef XML_DTD + if (!context) + newDtd = oldDtd; +#endif /* XML_DTD */ + + /* Note that the magical uses of the pre-processor to make field + access look more like C++ require that `parser' be overwritten + here. This makes this function more painful to follow than it + would be otherwise. + */ + if (ns) { + XML_Char tmp[2]; + *tmp = namespaceSeparator; + parser = parserCreate(encodingName, &parser->m_mem, tmp, newDtd); + } + else { + parser = parserCreate(encodingName, &parser->m_mem, NULL, newDtd); + } + + if (!parser) + return NULL; + + startElementHandler = oldStartElementHandler; + endElementHandler = oldEndElementHandler; + characterDataHandler = oldCharacterDataHandler; + processingInstructionHandler = oldProcessingInstructionHandler; + commentHandler = oldCommentHandler; + startCdataSectionHandler = oldStartCdataSectionHandler; + endCdataSectionHandler = oldEndCdataSectionHandler; + defaultHandler = oldDefaultHandler; + unparsedEntityDeclHandler = oldUnparsedEntityDeclHandler; + notationDeclHandler = oldNotationDeclHandler; + startNamespaceDeclHandler = oldStartNamespaceDeclHandler; + endNamespaceDeclHandler = oldEndNamespaceDeclHandler; + notStandaloneHandler = oldNotStandaloneHandler; + externalEntityRefHandler = oldExternalEntityRefHandler; + skippedEntityHandler = oldSkippedEntityHandler; + unknownEncodingHandler = oldUnknownEncodingHandler; + elementDeclHandler = oldElementDeclHandler; + attlistDeclHandler = oldAttlistDeclHandler; + entityDeclHandler = oldEntityDeclHandler; + xmlDeclHandler = oldXmlDeclHandler; + declElementType = oldDeclElementType; + userData = oldUserData; + if (oldUserData == oldHandlerArg) + handlerArg = userData; + else + handlerArg = parser; + if (oldExternalEntityRefHandlerArg != oldParser) + externalEntityRefHandlerArg = oldExternalEntityRefHandlerArg; + defaultExpandInternalEntities = oldDefaultExpandInternalEntities; + ns_triplets = oldns_triplets; + parentParser = oldParser; +#ifdef XML_DTD + paramEntityParsing = oldParamEntityParsing; + prologState.inEntityValue = oldInEntityValue; + if (context) { +#endif /* XML_DTD */ + if (!dtdCopy(_dtd, oldDtd, &parser->m_mem) + || !setContext(parser, context)) { + XML_ParserFree(parser); + return NULL; + } + processor = externalEntityInitProcessor; +#ifdef XML_DTD + } + else { + /* The DTD instance referenced by _dtd is shared between the document's + root parser and external PE parsers, therefore one does not need to + call setContext. In addition, one also *must* not call setContext, + because this would overwrite existing prefix->binding pointers in + _dtd with ones that get destroyed with the external PE parser. + This would leave those prefixes with dangling pointers. + */ + isParamEntity = XML_TRUE; + XmlPrologStateInitExternalEntity(&prologState); + processor = externalParEntInitProcessor; + } +#endif /* XML_DTD */ + return parser; +} + +static void FASTCALL +destroyBindings(BINDING *bindings, XML_Parser parser) +{ + for (;;) { + BINDING *b = bindings; + if (!b) + break; + bindings = b->nextTagBinding; + FREE(b->uri); + FREE(b); + } +} + +void XMLCALL +XML_ParserFree(XML_Parser parser) +{ + for (;;) { + TAG *p; + if (tagStack == NULL) { + if (freeTagList == NULL) + break; + tagStack = freeTagList; + freeTagList = NULL; + } + p = tagStack; + tagStack = tagStack->parent; + FREE(p->buf); + destroyBindings(p->bindings, parser); + FREE(p); + } + destroyBindings(freeBindingList, parser); + destroyBindings(inheritedBindings, parser); + poolDestroy(&tempPool); + poolDestroy(&temp2Pool); +#ifdef XML_DTD + /* external parameter entity parsers share the DTD structure + parser->m_dtd with the root parser, so we must not destroy it + */ + if (!isParamEntity && _dtd) +#else + if (_dtd) +#endif /* XML_DTD */ + dtdDestroy(_dtd, (XML_Bool)!parentParser, &parser->m_mem); + FREE((void *)atts); + FREE(groupConnector); + FREE(buffer); + FREE(dataBuf); + FREE(nsAtts); + FREE(unknownEncodingMem); + if (unknownEncodingRelease) + unknownEncodingRelease(unknownEncodingData); + FREE(parser); +} + +void XMLCALL +XML_UseParserAsHandlerArg(XML_Parser parser) +{ + handlerArg = parser; +} + +enum XML_Error XMLCALL +XML_UseForeignDTD(XML_Parser parser, XML_Bool useDTD) +{ +#ifdef XML_DTD + /* block after XML_Parse()/XML_ParseBuffer() has been called */ + if (parsing) + return XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING; + useForeignDTD = useDTD; + return XML_ERROR_NONE; +#else + return XML_ERROR_FEATURE_REQUIRES_XML_DTD; +#endif +} + +void XMLCALL +XML_SetReturnNSTriplet(XML_Parser parser, int do_nst) +{ + /* block after XML_Parse()/XML_ParseBuffer() has been called */ + if (parsing) + return; + ns_triplets = do_nst ? XML_TRUE : XML_FALSE; +} + +void XMLCALL +XML_SetUserData(XML_Parser parser, void *p) +{ + if (handlerArg == userData) + handlerArg = userData = p; + else + userData = p; +} + +enum XML_Status XMLCALL +XML_SetBase(XML_Parser parser, const XML_Char *p) +{ + if (p) { + p = poolCopyString(&_dtd->pool, p); + if (!p) + return XML_STATUS_ERROR; + curBase = p; + } + else + curBase = NULL; + return XML_STATUS_OK; +} + +const XML_Char * XMLCALL +XML_GetBase(XML_Parser parser) +{ + return curBase; +} + +int XMLCALL +XML_GetSpecifiedAttributeCount(XML_Parser parser) +{ + return nSpecifiedAtts; +} + +int XMLCALL +XML_GetIdAttributeIndex(XML_Parser parser) +{ + return idAttIndex; +} + +void XMLCALL +XML_SetElementHandler(XML_Parser parser, + XML_StartElementHandler start, + XML_EndElementHandler end) +{ + startElementHandler = start; + endElementHandler = end; +} + +void XMLCALL +XML_SetStartElementHandler(XML_Parser parser, + XML_StartElementHandler start) { + startElementHandler = start; +} + +void XMLCALL +XML_SetEndElementHandler(XML_Parser parser, + XML_EndElementHandler end) { + endElementHandler = end; +} + +void XMLCALL +XML_SetCharacterDataHandler(XML_Parser parser, + XML_CharacterDataHandler handler) +{ + characterDataHandler = handler; +} + +void XMLCALL +XML_SetProcessingInstructionHandler(XML_Parser parser, + XML_ProcessingInstructionHandler handler) +{ + processingInstructionHandler = handler; +} + +void XMLCALL +XML_SetCommentHandler(XML_Parser parser, + XML_CommentHandler handler) +{ + commentHandler = handler; +} + +void XMLCALL +XML_SetCdataSectionHandler(XML_Parser parser, + XML_StartCdataSectionHandler start, + XML_EndCdataSectionHandler end) +{ + startCdataSectionHandler = start; + endCdataSectionHandler = end; +} + +void XMLCALL +XML_SetStartCdataSectionHandler(XML_Parser parser, + XML_StartCdataSectionHandler start) { + startCdataSectionHandler = start; +} + +void XMLCALL +XML_SetEndCdataSectionHandler(XML_Parser parser, + XML_EndCdataSectionHandler end) { + endCdataSectionHandler = end; +} + +void XMLCALL +XML_SetDefaultHandler(XML_Parser parser, + XML_DefaultHandler handler) +{ + defaultHandler = handler; + defaultExpandInternalEntities = XML_FALSE; +} + +void XMLCALL +XML_SetDefaultHandlerExpand(XML_Parser parser, + XML_DefaultHandler handler) +{ + defaultHandler = handler; + defaultExpandInternalEntities = XML_TRUE; +} + +void XMLCALL +XML_SetDoctypeDeclHandler(XML_Parser parser, + XML_StartDoctypeDeclHandler start, + XML_EndDoctypeDeclHandler end) +{ + startDoctypeDeclHandler = start; + endDoctypeDeclHandler = end; +} + +void XMLCALL +XML_SetStartDoctypeDeclHandler(XML_Parser parser, + XML_StartDoctypeDeclHandler start) { + startDoctypeDeclHandler = start; +} + +void XMLCALL +XML_SetEndDoctypeDeclHandler(XML_Parser parser, + XML_EndDoctypeDeclHandler end) { + endDoctypeDeclHandler = end; +} + +void XMLCALL +XML_SetUnparsedEntityDeclHandler(XML_Parser parser, + XML_UnparsedEntityDeclHandler handler) +{ + unparsedEntityDeclHandler = handler; +} + +void XMLCALL +XML_SetNotationDeclHandler(XML_Parser parser, + XML_NotationDeclHandler handler) +{ + notationDeclHandler = handler; +} + +void XMLCALL +XML_SetNamespaceDeclHandler(XML_Parser parser, + XML_StartNamespaceDeclHandler start, + XML_EndNamespaceDeclHandler end) +{ + startNamespaceDeclHandler = start; + endNamespaceDeclHandler = end; +} + +void XMLCALL +XML_SetStartNamespaceDeclHandler(XML_Parser parser, + XML_StartNamespaceDeclHandler start) { + startNamespaceDeclHandler = start; +} + +void XMLCALL +XML_SetEndNamespaceDeclHandler(XML_Parser parser, + XML_EndNamespaceDeclHandler end) { + endNamespaceDeclHandler = end; +} + +void XMLCALL +XML_SetNotStandaloneHandler(XML_Parser parser, + XML_NotStandaloneHandler handler) +{ + notStandaloneHandler = handler; +} + +void XMLCALL +XML_SetExternalEntityRefHandler(XML_Parser parser, + XML_ExternalEntityRefHandler handler) +{ + externalEntityRefHandler = handler; +} + +void XMLCALL +XML_SetExternalEntityRefHandlerArg(XML_Parser parser, void *arg) +{ + if (arg) + externalEntityRefHandlerArg = (XML_Parser)arg; + else + externalEntityRefHandlerArg = parser; +} + +void XMLCALL +XML_SetSkippedEntityHandler(XML_Parser parser, + XML_SkippedEntityHandler handler) +{ + skippedEntityHandler = handler; +} + +void XMLCALL +XML_SetUnknownEncodingHandler(XML_Parser parser, + XML_UnknownEncodingHandler handler, + void *data) +{ + unknownEncodingHandler = handler; + unknownEncodingHandlerData = data; +} + +void XMLCALL +XML_SetElementDeclHandler(XML_Parser parser, + XML_ElementDeclHandler eldecl) +{ + elementDeclHandler = eldecl; +} + +void XMLCALL +XML_SetAttlistDeclHandler(XML_Parser parser, + XML_AttlistDeclHandler attdecl) +{ + attlistDeclHandler = attdecl; +} + +void XMLCALL +XML_SetEntityDeclHandler(XML_Parser parser, + XML_EntityDeclHandler handler) +{ + entityDeclHandler = handler; +} + +void XMLCALL +XML_SetXmlDeclHandler(XML_Parser parser, + XML_XmlDeclHandler handler) { + xmlDeclHandler = handler; +} + +int XMLCALL +XML_SetParamEntityParsing(XML_Parser parser, + enum XML_ParamEntityParsing peParsing) +{ + /* block after XML_Parse()/XML_ParseBuffer() has been called */ + if (parsing) + return 0; +#ifdef XML_DTD + paramEntityParsing = peParsing; + return 1; +#else + return peParsing == XML_PARAM_ENTITY_PARSING_NEVER; +#endif +} + +enum XML_Status XMLCALL +XML_Parse(XML_Parser parser, const char *s, int len, int isFinal) +{ + if (len == 0) { + if (!isFinal) + return XML_STATUS_OK; + positionPtr = bufferPtr; + errorCode = processor(parser, bufferPtr, parseEndPtr = bufferEnd, 0); + if (errorCode == XML_ERROR_NONE) + return XML_STATUS_OK; + eventEndPtr = eventPtr; + processor = errorProcessor; + return XML_STATUS_ERROR; + } +#ifndef XML_CONTEXT_BYTES + else if (bufferPtr == bufferEnd) { + const char *end; + int nLeftOver; + parseEndByteIndex += len; + positionPtr = s; + if (isFinal) { + errorCode = processor(parser, s, parseEndPtr = s + len, 0); + if (errorCode == XML_ERROR_NONE) + return XML_STATUS_OK; + eventEndPtr = eventPtr; + processor = errorProcessor; + return XML_STATUS_ERROR; + } + errorCode = processor(parser, s, parseEndPtr = s + len, &end); + if (errorCode != XML_ERROR_NONE) { + eventEndPtr = eventPtr; + processor = errorProcessor; + return XML_STATUS_ERROR; + } + XmlUpdatePosition(encoding, positionPtr, end, &position); + positionPtr = end; + nLeftOver = s + len - end; + if (nLeftOver) { + if (buffer == NULL || nLeftOver > bufferLim - buffer) { + /* FIXME avoid integer overflow */ + char *temp; + temp = (buffer == NULL + ? (char *)MALLOC(len * 2) + : (char *)REALLOC(buffer, len * 2)); + if (temp == NULL) { + errorCode = XML_ERROR_NO_MEMORY; + return XML_STATUS_ERROR; + } + buffer = temp; + if (!buffer) { + errorCode = XML_ERROR_NO_MEMORY; + eventPtr = eventEndPtr = NULL; + processor = errorProcessor; + return XML_STATUS_ERROR; + } + bufferLim = buffer + len * 2; + } + memcpy(buffer, end, nLeftOver); + bufferPtr = buffer; + bufferEnd = buffer + nLeftOver; + } + return XML_STATUS_OK; + } +#endif /* not defined XML_CONTEXT_BYTES */ + else { + void *buff = XML_GetBuffer(parser, len); + if (buff == NULL) + return XML_STATUS_ERROR; + else { + memcpy(buff, s, len); + return XML_ParseBuffer(parser, len, isFinal); + } + } +} + +enum XML_Status XMLCALL +XML_ParseBuffer(XML_Parser parser, int len, int isFinal) +{ + const char *start = bufferPtr; + positionPtr = start; + bufferEnd += len; + parseEndByteIndex += len; + errorCode = processor(parser, start, parseEndPtr = bufferEnd, + isFinal ? (const char **)NULL : &bufferPtr); + if (errorCode == XML_ERROR_NONE) { + if (!isFinal) { + XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position); + positionPtr = bufferPtr; + } + return XML_STATUS_OK; + } + else { + eventEndPtr = eventPtr; + processor = errorProcessor; + return XML_STATUS_ERROR; + } +} + +void * XMLCALL +XML_GetBuffer(XML_Parser parser, int len) +{ + if (len > bufferLim - bufferEnd) { + /* FIXME avoid integer overflow */ + int neededSize = len + (bufferEnd - bufferPtr); +#ifdef XML_CONTEXT_BYTES + int keep = bufferPtr - buffer; + + if (keep > XML_CONTEXT_BYTES) + keep = XML_CONTEXT_BYTES; + neededSize += keep; +#endif /* defined XML_CONTEXT_BYTES */ + if (neededSize <= bufferLim - buffer) { +#ifdef XML_CONTEXT_BYTES + if (keep < bufferPtr - buffer) { + int offset = (bufferPtr - buffer) - keep; + memmove(buffer, &buffer[offset], bufferEnd - bufferPtr + keep); + bufferEnd -= offset; + bufferPtr -= offset; + } +#else + memmove(buffer, bufferPtr, bufferEnd - bufferPtr); + bufferEnd = buffer + (bufferEnd - bufferPtr); + bufferPtr = buffer; +#endif /* not defined XML_CONTEXT_BYTES */ + } + else { + char *newBuf; + int bufferSize = bufferLim - bufferPtr; + if (bufferSize == 0) + bufferSize = INIT_BUFFER_SIZE; + do { + bufferSize *= 2; + } while (bufferSize < neededSize); + newBuf = (char *)MALLOC(bufferSize); + if (newBuf == 0) { + errorCode = XML_ERROR_NO_MEMORY; + return NULL; + } + bufferLim = newBuf + bufferSize; +#ifdef XML_CONTEXT_BYTES + if (bufferPtr) { + int keep = bufferPtr - buffer; + if (keep > XML_CONTEXT_BYTES) + keep = XML_CONTEXT_BYTES; + memcpy(newBuf, &bufferPtr[-keep], bufferEnd - bufferPtr + keep); + FREE(buffer); + buffer = newBuf; + bufferEnd = buffer + (bufferEnd - bufferPtr) + keep; + bufferPtr = buffer + keep; + } + else { + bufferEnd = newBuf + (bufferEnd - bufferPtr); + bufferPtr = buffer = newBuf; + } +#else + if (bufferPtr) { + memcpy(newBuf, bufferPtr, bufferEnd - bufferPtr); + FREE(buffer); + } + bufferEnd = newBuf + (bufferEnd - bufferPtr); + bufferPtr = buffer = newBuf; +#endif /* not defined XML_CONTEXT_BYTES */ + } + } + return bufferEnd; +} + +enum XML_Error XMLCALL +XML_GetErrorCode(XML_Parser parser) +{ + return errorCode; +} + +long XMLCALL +XML_GetCurrentByteIndex(XML_Parser parser) +{ + if (eventPtr) + return parseEndByteIndex - (parseEndPtr - eventPtr); + return -1; +} + +int XMLCALL +XML_GetCurrentByteCount(XML_Parser parser) +{ + if (eventEndPtr && eventPtr) + return eventEndPtr - eventPtr; + return 0; +} + +const char * XMLCALL +XML_GetInputContext(XML_Parser parser, int *offset, int *size) +{ +#ifdef XML_CONTEXT_BYTES + if (eventPtr && buffer) { + *offset = eventPtr - buffer; + *size = bufferEnd - buffer; + return buffer; + } +#endif /* defined XML_CONTEXT_BYTES */ + return (char *) 0; +} + +int XMLCALL +XML_GetCurrentLineNumber(XML_Parser parser) +{ + if (eventPtr) { + XmlUpdatePosition(encoding, positionPtr, eventPtr, &position); + positionPtr = eventPtr; + } + return position.lineNumber + 1; +} + +int XMLCALL +XML_GetCurrentColumnNumber(XML_Parser parser) +{ + if (eventPtr) { + XmlUpdatePosition(encoding, positionPtr, eventPtr, &position); + positionPtr = eventPtr; + } + return position.columnNumber; +} + +void XMLCALL +XML_FreeContentModel(XML_Parser parser, XML_Content *model) +{ + FREE(model); +} + +void * XMLCALL +XML_MemMalloc(XML_Parser parser, size_t size) +{ + return MALLOC(size); +} + +void * XMLCALL +XML_MemRealloc(XML_Parser parser, void *ptr, size_t size) +{ + return REALLOC(ptr, size); +} + +void XMLCALL +XML_MemFree(XML_Parser parser, void *ptr) +{ + FREE(ptr); +} + +void XMLCALL +XML_DefaultCurrent(XML_Parser parser) +{ + if (defaultHandler) { + if (openInternalEntities) + reportDefault(parser, + internalEncoding, + openInternalEntities->internalEventPtr, + openInternalEntities->internalEventEndPtr); + else + reportDefault(parser, encoding, eventPtr, eventEndPtr); + } +} + +const XML_LChar * XMLCALL +XML_ErrorString(enum XML_Error code) +{ + static const XML_LChar *message[] = { + 0, + XML_L("out of memory"), + XML_L("syntax error"), + XML_L("no element found"), + XML_L("not well-formed (invalid token)"), + XML_L("unclosed token"), + XML_L("partial character"), + XML_L("mismatched tag"), + XML_L("duplicate attribute"), + XML_L("junk after document element"), + XML_L("illegal parameter entity reference"), + XML_L("undefined entity"), + XML_L("recursive entity reference"), + XML_L("asynchronous entity"), + XML_L("reference to invalid character number"), + XML_L("reference to binary entity"), + XML_L("reference to external entity in attribute"), + XML_L("xml declaration not at start of external entity"), + XML_L("unknown encoding"), + XML_L("encoding specified in XML declaration is incorrect"), + XML_L("unclosed CDATA section"), + XML_L("error in processing external entity reference"), + XML_L("document is not standalone"), + XML_L("unexpected parser state - please send a bug report"), + XML_L("entity declared in parameter entity"), + XML_L("requested feature requires XML_DTD support in Expat"), + XML_L("cannot change setting once parsing has begun"), + XML_L("unbound prefix") + }; + if (code > 0 && code < sizeof(message)/sizeof(message[0])) + return message[code]; + return NULL; +} + +const XML_LChar * XMLCALL +XML_ExpatVersion(void) { + + /* V1 is used to string-ize the version number. However, it would + string-ize the actual version macro *names* unless we get them + substituted before being passed to V1. CPP is defined to expand + a macro, then rescan for more expansions. Thus, we use V2 to expand + the version macros, then CPP will expand the resulting V1() macro + with the correct numerals. */ + /* ### I'm assuming cpp is portable in this respect... */ + +#define V1(a,b,c) XML_L(#a)XML_L(".")XML_L(#b)XML_L(".")XML_L(#c) +#define V2(a,b,c) XML_L("expat_")V1(a,b,c) + + return V2(XML_MAJOR_VERSION, XML_MINOR_VERSION, XML_MICRO_VERSION); + +#undef V1 +#undef V2 +} + +XML_Expat_Version XMLCALL +XML_ExpatVersionInfo(void) +{ + XML_Expat_Version version; + + version.major = XML_MAJOR_VERSION; + version.minor = XML_MINOR_VERSION; + version.micro = XML_MICRO_VERSION; + + return version; +} + +const XML_Feature * XMLCALL +XML_GetFeatureList(void) +{ + static XML_Feature features[] = { + {XML_FEATURE_SIZEOF_XML_CHAR, XML_L("sizeof(XML_Char)"), 0}, + {XML_FEATURE_SIZEOF_XML_LCHAR, XML_L("sizeof(XML_LChar)"), 0}, +#ifdef XML_UNICODE + {XML_FEATURE_UNICODE, XML_L("XML_UNICODE"), 0}, +#endif +#ifdef XML_UNICODE_WCHAR_T + {XML_FEATURE_UNICODE_WCHAR_T, XML_L("XML_UNICODE_WCHAR_T"), 0}, +#endif +#ifdef XML_DTD + {XML_FEATURE_DTD, XML_L("XML_DTD"), 0}, +#endif +#ifdef XML_CONTEXT_BYTES + {XML_FEATURE_CONTEXT_BYTES, XML_L("XML_CONTEXT_BYTES"), + XML_CONTEXT_BYTES}, +#endif +#ifdef XML_MIN_SIZE + {XML_FEATURE_MIN_SIZE, XML_L("XML_MIN_SIZE"), 0}, +#endif + {XML_FEATURE_END, NULL, 0} + }; + + features[0].value = sizeof(XML_Char); + features[1].value = sizeof(XML_LChar); + return features; +} + +/* Initially tag->rawName always points into the parse buffer; + for those TAG instances opened while the current parse buffer was + processed, and not yet closed, we need to store tag->rawName in a more + permanent location, since the parse buffer is about to be discarded. +*/ +static XML_Bool +storeRawNames(XML_Parser parser) +{ + TAG *tag = tagStack; + while (tag) { + int bufSize; + int nameLen = sizeof(XML_Char) * (tag->name.strLen + 1); + char *rawNameBuf = tag->buf + nameLen; + /* Stop if already stored. Since tagStack is a stack, we can stop + at the first entry that has already been copied; everything + below it in the stack is already been accounted for in a + previous call to this function. + */ + if (tag->rawName == rawNameBuf) + break; + /* For re-use purposes we need to ensure that the + size of tag->buf is a multiple of sizeof(XML_Char). + */ + bufSize = nameLen + ROUND_UP(tag->rawNameLength, sizeof(XML_Char)); + if (bufSize > tag->bufEnd - tag->buf) { + char *temp = (char *)REALLOC(tag->buf, bufSize); + if (temp == NULL) + return XML_FALSE; + /* if tag->name.str points to tag->buf (only when namespace + processing is off) then we have to update it + */ + if (tag->name.str == (XML_Char *)tag->buf) + tag->name.str = (XML_Char *)temp; + /* if tag->name.localPart is set (when namespace processing is on) + then update it as well, since it will always point into tag->buf + */ + if (tag->name.localPart) + tag->name.localPart = (XML_Char *)temp + (tag->name.localPart - + (XML_Char *)tag->buf); + tag->buf = temp; + tag->bufEnd = temp + bufSize; + rawNameBuf = temp + nameLen; + } + memcpy(rawNameBuf, tag->rawName, tag->rawNameLength); + tag->rawName = rawNameBuf; + tag = tag->parent; + } + return XML_TRUE; +} + +static enum XML_Error PTRCALL +contentProcessor(XML_Parser parser, + const char *start, + const char *end, + const char **endPtr) +{ + enum XML_Error result = + doContent(parser, 0, encoding, start, end, endPtr); + if (result != XML_ERROR_NONE) + return result; + if (!storeRawNames(parser)) + return XML_ERROR_NO_MEMORY; + return result; +} + +static enum XML_Error PTRCALL +externalEntityInitProcessor(XML_Parser parser, + const char *start, + const char *end, + const char **endPtr) +{ + enum XML_Error result = initializeEncoding(parser); + if (result != XML_ERROR_NONE) + return result; + processor = externalEntityInitProcessor2; + return externalEntityInitProcessor2(parser, start, end, endPtr); +} + +static enum XML_Error PTRCALL +externalEntityInitProcessor2(XML_Parser parser, + const char *start, + const char *end, + const char **endPtr) +{ + const char *next = start; /* XmlContentTok doesn't always set the last arg */ + int tok = XmlContentTok(encoding, start, end, &next); + switch (tok) { + case XML_TOK_BOM: + /* If we are at the end of the buffer, this would cause the next stage, + i.e. externalEntityInitProcessor3, to pass control directly to + doContent (by detecting XML_TOK_NONE) without processing any xml text + declaration - causing the error XML_ERROR_MISPLACED_XML_PI in doContent. + */ + if (next == end && endPtr) { + *endPtr = next; + return XML_ERROR_NONE; + } + start = next; + break; + case XML_TOK_PARTIAL: + if (endPtr) { + *endPtr = start; + return XML_ERROR_NONE; + } + eventPtr = start; + return XML_ERROR_UNCLOSED_TOKEN; + case XML_TOK_PARTIAL_CHAR: + if (endPtr) { + *endPtr = start; + return XML_ERROR_NONE; + } + eventPtr = start; + return XML_ERROR_PARTIAL_CHAR; + } + processor = externalEntityInitProcessor3; + return externalEntityInitProcessor3(parser, start, end, endPtr); +} + +static enum XML_Error PTRCALL +externalEntityInitProcessor3(XML_Parser parser, + const char *start, + const char *end, + const char **endPtr) +{ + const char *next = start; /* XmlContentTok doesn't always set the last arg */ + int tok = XmlContentTok(encoding, start, end, &next); + switch (tok) { + case XML_TOK_XML_DECL: + { + enum XML_Error result = processXmlDecl(parser, 1, start, next); + if (result != XML_ERROR_NONE) + return result; + start = next; + } + break; + case XML_TOK_PARTIAL: + if (endPtr) { + *endPtr = start; + return XML_ERROR_NONE; + } + eventPtr = start; + return XML_ERROR_UNCLOSED_TOKEN; + case XML_TOK_PARTIAL_CHAR: + if (endPtr) { + *endPtr = start; + return XML_ERROR_NONE; + } + eventPtr = start; + return XML_ERROR_PARTIAL_CHAR; + } + processor = externalEntityContentProcessor; + tagLevel = 1; + return externalEntityContentProcessor(parser, start, end, endPtr); +} + +static enum XML_Error PTRCALL +externalEntityContentProcessor(XML_Parser parser, + const char *start, + const char *end, + const char **endPtr) +{ + enum XML_Error result = + doContent(parser, 1, encoding, start, end, endPtr); + if (result != XML_ERROR_NONE) + return result; + if (!storeRawNames(parser)) + return XML_ERROR_NO_MEMORY; + return result; +} + +static enum XML_Error +doContent(XML_Parser parser, + int startTagLevel, + const ENCODING *enc, + const char *s, + const char *end, + const char **nextPtr) +{ + DTD * const dtd = _dtd; /* save one level of indirection */ + const char **eventPP; + const char **eventEndPP; + if (enc == encoding) { + eventPP = &eventPtr; + eventEndPP = &eventEndPtr; + } + else { + eventPP = &(openInternalEntities->internalEventPtr); + eventEndPP = &(openInternalEntities->internalEventEndPtr); + } + *eventPP = s; + for (;;) { + const char *next = s; /* XmlContentTok doesn't always set the last arg */ + int tok = XmlContentTok(enc, s, end, &next); + *eventEndPP = next; + switch (tok) { + case XML_TOK_TRAILING_CR: + if (nextPtr) { + *nextPtr = s; + return XML_ERROR_NONE; + } + *eventEndPP = end; + if (characterDataHandler) { + XML_Char c = 0xA; + characterDataHandler(handlerArg, &c, 1); + } + else if (defaultHandler) + reportDefault(parser, enc, s, end); + if (startTagLevel == 0) + return XML_ERROR_NO_ELEMENTS; + if (tagLevel != startTagLevel) + return XML_ERROR_ASYNC_ENTITY; + return XML_ERROR_NONE; + case XML_TOK_NONE: + if (nextPtr) { + *nextPtr = s; + return XML_ERROR_NONE; + } + if (startTagLevel > 0) { + if (tagLevel != startTagLevel) + return XML_ERROR_ASYNC_ENTITY; + return XML_ERROR_NONE; + } + return XML_ERROR_NO_ELEMENTS; + case XML_TOK_INVALID: + *eventPP = next; + return XML_ERROR_INVALID_TOKEN; + case XML_TOK_PARTIAL: + if (nextPtr) { + *nextPtr = s; + return XML_ERROR_NONE; + } + return XML_ERROR_UNCLOSED_TOKEN; + case XML_TOK_PARTIAL_CHAR: + if (nextPtr) { + *nextPtr = s; + return XML_ERROR_NONE; + } + return XML_ERROR_PARTIAL_CHAR; + case XML_TOK_ENTITY_REF: + { + const XML_Char *name; + ENTITY *entity; + XML_Char ch = (XML_Char) XmlPredefinedEntityName(enc, + s + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (ch) { + if (characterDataHandler) + characterDataHandler(handlerArg, &ch, 1); + else if (defaultHandler) + reportDefault(parser, enc, s, next); + break; + } + name = poolStoreString(&dtd->pool, enc, + s + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (!name) + return XML_ERROR_NO_MEMORY; + entity = (ENTITY *)lookup(&dtd->generalEntities, name, 0); + poolDiscard(&dtd->pool); + /* First, determine if a check for an existing declaration is needed; + if yes, check that the entity exists, and that it is internal, + otherwise call the skipped entity or default handler. + */ + if (!dtd->hasParamEntityRefs || dtd->standalone) { + if (!entity) + return XML_ERROR_UNDEFINED_ENTITY; + else if (!entity->is_internal) + return XML_ERROR_ENTITY_DECLARED_IN_PE; + } + else if (!entity) { + if (skippedEntityHandler) + skippedEntityHandler(handlerArg, name, 0); + else if (defaultHandler) + reportDefault(parser, enc, s, next); + break; + } + if (entity->open) + return XML_ERROR_RECURSIVE_ENTITY_REF; + if (entity->notation) + return XML_ERROR_BINARY_ENTITY_REF; + if (entity->textPtr) { + enum XML_Error result; + OPEN_INTERNAL_ENTITY openEntity; + if (!defaultExpandInternalEntities) { + if (skippedEntityHandler) + skippedEntityHandler(handlerArg, entity->name, 0); + else if (defaultHandler) + reportDefault(parser, enc, s, next); + break; + } + entity->open = XML_TRUE; + openEntity.next = openInternalEntities; + openInternalEntities = &openEntity; + openEntity.entity = entity; + openEntity.internalEventPtr = NULL; + openEntity.internalEventEndPtr = NULL; + result = doContent(parser, + tagLevel, + internalEncoding, + (char *)entity->textPtr, + (char *)(entity->textPtr + entity->textLen), + 0); + entity->open = XML_FALSE; + openInternalEntities = openEntity.next; + if (result) + return result; + } + else if (externalEntityRefHandler) { + const XML_Char *context; + entity->open = XML_TRUE; + context = getContext(parser); + entity->open = XML_FALSE; + if (!context) + return XML_ERROR_NO_MEMORY; + if (!externalEntityRefHandler((XML_Parser)externalEntityRefHandlerArg, + context, + entity->base, + entity->systemId, + entity->publicId)) + return XML_ERROR_EXTERNAL_ENTITY_HANDLING; + poolDiscard(&tempPool); + } + else if (defaultHandler) + reportDefault(parser, enc, s, next); + break; + } + case XML_TOK_START_TAG_NO_ATTS: + /* fall through */ + case XML_TOK_START_TAG_WITH_ATTS: + { + TAG *tag; + enum XML_Error result; + XML_Char *toPtr; + if (freeTagList) { + tag = freeTagList; + freeTagList = freeTagList->parent; + } + else { + tag = (TAG *)MALLOC(sizeof(TAG)); + if (!tag) + return XML_ERROR_NO_MEMORY; + tag->buf = (char *)MALLOC(INIT_TAG_BUF_SIZE); + if (!tag->buf) { + FREE(tag); + return XML_ERROR_NO_MEMORY; + } + tag->bufEnd = tag->buf + INIT_TAG_BUF_SIZE; + } + tag->bindings = NULL; + tag->parent = tagStack; + tagStack = tag; + tag->name.localPart = NULL; + tag->name.prefix = NULL; + tag->rawName = s + enc->minBytesPerChar; + tag->rawNameLength = XmlNameLength(enc, tag->rawName); + ++tagLevel; + { + const char *rawNameEnd = tag->rawName + tag->rawNameLength; + const char *fromPtr = tag->rawName; + toPtr = (XML_Char *)tag->buf; + for (;;) { + int bufSize; + int convLen; + XmlConvert(enc, + &fromPtr, rawNameEnd, + (ICHAR **)&toPtr, (ICHAR *)tag->bufEnd - 1); + convLen = toPtr - (XML_Char *)tag->buf; + if (fromPtr == rawNameEnd) { + tag->name.strLen = convLen; + break; + } + bufSize = (tag->bufEnd - tag->buf) << 1; + { + char *temp = (char *)REALLOC(tag->buf, bufSize); + if (temp == NULL) + return XML_ERROR_NO_MEMORY; + tag->buf = temp; + tag->bufEnd = temp + bufSize; + toPtr = (XML_Char *)temp + convLen; + } + } + } + tag->name.str = (XML_Char *)tag->buf; + *toPtr = XML_T('\0'); + result = storeAtts(parser, enc, s, &(tag->name), &(tag->bindings)); + if (result) + return result; + if (startElementHandler) + startElementHandler(handlerArg, tag->name.str, + (const XML_Char **)atts); + else if (defaultHandler) + reportDefault(parser, enc, s, next); + poolClear(&tempPool); + break; + } + case XML_TOK_EMPTY_ELEMENT_NO_ATTS: + /* fall through */ + case XML_TOK_EMPTY_ELEMENT_WITH_ATTS: + { + const char *rawName = s + enc->minBytesPerChar; + enum XML_Error result; + BINDING *bindings = NULL; + XML_Bool noElmHandlers = XML_TRUE; + TAG_NAME name; + name.str = poolStoreString(&tempPool, enc, rawName, + rawName + XmlNameLength(enc, rawName)); + if (!name.str) + return XML_ERROR_NO_MEMORY; + poolFinish(&tempPool); + result = storeAtts(parser, enc, s, &name, &bindings); + if (result) + return result; + poolFinish(&tempPool); + if (startElementHandler) { + startElementHandler(handlerArg, name.str, (const XML_Char **)atts); + noElmHandlers = XML_FALSE; + } + if (endElementHandler) { + if (startElementHandler) + *eventPP = *eventEndPP; + endElementHandler(handlerArg, name.str); + noElmHandlers = XML_FALSE; + } + if (noElmHandlers && defaultHandler) + reportDefault(parser, enc, s, next); + poolClear(&tempPool); + while (bindings) { + BINDING *b = bindings; + if (endNamespaceDeclHandler) + endNamespaceDeclHandler(handlerArg, b->prefix->name); + bindings = bindings->nextTagBinding; + b->nextTagBinding = freeBindingList; + freeBindingList = b; + b->prefix->binding = b->prevPrefixBinding; + } + } + if (tagLevel == 0) + return epilogProcessor(parser, next, end, nextPtr); + break; + case XML_TOK_END_TAG: + if (tagLevel == startTagLevel) + return XML_ERROR_ASYNC_ENTITY; + else { + int len; + const char *rawName; + TAG *tag = tagStack; + tagStack = tag->parent; + tag->parent = freeTagList; + freeTagList = tag; + rawName = s + enc->minBytesPerChar*2; + len = XmlNameLength(enc, rawName); + if (len != tag->rawNameLength + || memcmp(tag->rawName, rawName, len) != 0) { + *eventPP = rawName; + return XML_ERROR_TAG_MISMATCH; + } + --tagLevel; + if (endElementHandler) { + const XML_Char *localPart; + const XML_Char *prefix; + XML_Char *uri; + localPart = tag->name.localPart; + if (ns && localPart) { + /* localPart and prefix may have been overwritten in + tag->name.str, since this points to the binding->uri + buffer which gets re-used; so we have to add them again + */ + uri = (XML_Char *)tag->name.str + tag->name.uriLen; + /* don't need to check for space - already done in storeAtts() */ + while (*localPart) *uri++ = *localPart++; + prefix = (XML_Char *)tag->name.prefix; + if (ns_triplets && prefix) { + *uri++ = namespaceSeparator; + while (*prefix) *uri++ = *prefix++; + } + *uri = XML_T('\0'); + } + endElementHandler(handlerArg, tag->name.str); + } + else if (defaultHandler) + reportDefault(parser, enc, s, next); + while (tag->bindings) { + BINDING *b = tag->bindings; + if (endNamespaceDeclHandler) + endNamespaceDeclHandler(handlerArg, b->prefix->name); + tag->bindings = tag->bindings->nextTagBinding; + b->nextTagBinding = freeBindingList; + freeBindingList = b; + b->prefix->binding = b->prevPrefixBinding; + } + if (tagLevel == 0) + return epilogProcessor(parser, next, end, nextPtr); + } + break; + case XML_TOK_CHAR_REF: + { + int n = XmlCharRefNumber(enc, s); + if (n < 0) + return XML_ERROR_BAD_CHAR_REF; + if (characterDataHandler) { + XML_Char buf[XML_ENCODE_MAX]; + characterDataHandler(handlerArg, buf, XmlEncode(n, (ICHAR *)buf)); + } + else if (defaultHandler) + reportDefault(parser, enc, s, next); + } + break; + case XML_TOK_XML_DECL: + return XML_ERROR_MISPLACED_XML_PI; + case XML_TOK_DATA_NEWLINE: + if (characterDataHandler) { + XML_Char c = 0xA; + characterDataHandler(handlerArg, &c, 1); + } + else if (defaultHandler) + reportDefault(parser, enc, s, next); + break; + case XML_TOK_CDATA_SECT_OPEN: + { + enum XML_Error result; + if (startCdataSectionHandler) + startCdataSectionHandler(handlerArg); +#if 0 + /* Suppose you doing a transformation on a document that involves + changing only the character data. You set up a defaultHandler + and a characterDataHandler. The defaultHandler simply copies + characters through. The characterDataHandler does the + transformation and writes the characters out escaping them as + necessary. This case will fail to work if we leave out the + following two lines (because & and < inside CDATA sections will + be incorrectly escaped). + + However, now we have a start/endCdataSectionHandler, so it seems + easier to let the user deal with this. + */ + else if (characterDataHandler) + characterDataHandler(handlerArg, dataBuf, 0); +#endif + else if (defaultHandler) + reportDefault(parser, enc, s, next); + result = doCdataSection(parser, enc, &next, end, nextPtr); + if (!next) { + processor = cdataSectionProcessor; + return result; + } + } + break; + case XML_TOK_TRAILING_RSQB: + if (nextPtr) { + *nextPtr = s; + return XML_ERROR_NONE; + } + if (characterDataHandler) { + if (MUST_CONVERT(enc, s)) { + ICHAR *dataPtr = (ICHAR *)dataBuf; + XmlConvert(enc, &s, end, &dataPtr, (ICHAR *)dataBufEnd); + characterDataHandler(handlerArg, dataBuf, + dataPtr - (ICHAR *)dataBuf); + } + else + characterDataHandler(handlerArg, + (XML_Char *)s, + (XML_Char *)end - (XML_Char *)s); + } + else if (defaultHandler) + reportDefault(parser, enc, s, end); + if (startTagLevel == 0) { + *eventPP = end; + return XML_ERROR_NO_ELEMENTS; + } + if (tagLevel != startTagLevel) { + *eventPP = end; + return XML_ERROR_ASYNC_ENTITY; + } + return XML_ERROR_NONE; + case XML_TOK_DATA_CHARS: + if (characterDataHandler) { + if (MUST_CONVERT(enc, s)) { + for (;;) { + ICHAR *dataPtr = (ICHAR *)dataBuf; + XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd); + *eventEndPP = s; + characterDataHandler(handlerArg, dataBuf, + dataPtr - (ICHAR *)dataBuf); + if (s == next) + break; + *eventPP = s; + } + } + else + characterDataHandler(handlerArg, + (XML_Char *)s, + (XML_Char *)next - (XML_Char *)s); + } + else if (defaultHandler) + reportDefault(parser, enc, s, next); + break; + case XML_TOK_PI: + if (!reportProcessingInstruction(parser, enc, s, next)) + return XML_ERROR_NO_MEMORY; + break; + case XML_TOK_COMMENT: + if (!reportComment(parser, enc, s, next)) + return XML_ERROR_NO_MEMORY; + break; + default: + if (defaultHandler) + reportDefault(parser, enc, s, next); + break; + } + *eventPP = s = next; + } + /* not reached */ +} + +/* Precondition: all arguments must be non-NULL; + Purpose: + - normalize attributes + - check attributes for well-formedness + - generate namespace aware attribute names (URI, prefix) + - build list of attributes for startElementHandler + - default attributes + - process namespace declarations (check and report them) + - generate namespace aware element name (URI, prefix) +*/ +static enum XML_Error +storeAtts(XML_Parser parser, const ENCODING *enc, + const char *attStr, TAG_NAME *tagNamePtr, + BINDING **bindingsPtr) +{ + DTD * const dtd = _dtd; /* save one level of indirection */ + ELEMENT_TYPE *elementType; + int nDefaultAtts; + const XML_Char **appAtts; /* the attribute list for the application */ + int attIndex = 0; + int prefixLen; + int i; + int n; + XML_Char *uri; + int nPrefixes = 0; + BINDING *binding; + const XML_Char *localPart; + + /* lookup the element type name */ + elementType = (ELEMENT_TYPE *)lookup(&dtd->elementTypes, tagNamePtr->str,0); + if (!elementType) { + const XML_Char *name = poolCopyString(&dtd->pool, tagNamePtr->str); + if (!name) + return XML_ERROR_NO_MEMORY; + elementType = (ELEMENT_TYPE *)lookup(&dtd->elementTypes, name, + sizeof(ELEMENT_TYPE)); + if (!elementType) + return XML_ERROR_NO_MEMORY; + if (ns && !setElementTypePrefix(parser, elementType)) + return XML_ERROR_NO_MEMORY; + } + nDefaultAtts = elementType->nDefaultAtts; + + /* get the attributes from the tokenizer */ + n = XmlGetAttributes(enc, attStr, attsSize, atts); + if (n + nDefaultAtts > attsSize) { + int oldAttsSize = attsSize; + ATTRIBUTE *temp; + attsSize = n + nDefaultAtts + INIT_ATTS_SIZE; + temp = (ATTRIBUTE *)REALLOC((void *)atts, attsSize * sizeof(ATTRIBUTE)); + if (temp == NULL) + return XML_ERROR_NO_MEMORY; + atts = temp; + if (n > oldAttsSize) + XmlGetAttributes(enc, attStr, n, atts); + } + + appAtts = (const XML_Char **)atts; + for (i = 0; i < n; i++) { + /* add the name and value to the attribute list */ + ATTRIBUTE_ID *attId = getAttributeId(parser, enc, atts[i].name, + atts[i].name + + XmlNameLength(enc, atts[i].name)); + if (!attId) + return XML_ERROR_NO_MEMORY; + /* Detect duplicate attributes by their QNames. This does not work when + namespace processing is turned on and different prefixes for the same + namespace are used. For this case we have a check further down. + */ + if ((attId->name)[-1]) { + if (enc == encoding) + eventPtr = atts[i].name; + return XML_ERROR_DUPLICATE_ATTRIBUTE; + } + (attId->name)[-1] = 1; + appAtts[attIndex++] = attId->name; + if (!atts[i].normalized) { + enum XML_Error result; + XML_Bool isCdata = XML_TRUE; + + /* figure out whether declared as other than CDATA */ + if (attId->maybeTokenized) { + int j; + for (j = 0; j < nDefaultAtts; j++) { + if (attId == elementType->defaultAtts[j].id) { + isCdata = elementType->defaultAtts[j].isCdata; + break; + } + } + } + + /* normalize the attribute value */ + result = storeAttributeValue(parser, enc, isCdata, + atts[i].valuePtr, atts[i].valueEnd, + &tempPool); + if (result) + return result; + appAtts[attIndex] = poolStart(&tempPool); + poolFinish(&tempPool); + } + else { + /* the value did not need normalizing */ + appAtts[attIndex] = poolStoreString(&tempPool, enc, atts[i].valuePtr, + atts[i].valueEnd); + if (appAtts[attIndex] == 0) + return XML_ERROR_NO_MEMORY; + poolFinish(&tempPool); + } + /* handle prefixed attribute names */ + if (attId->prefix) { + if (attId->xmlns) { + /* deal with namespace declarations here */ + enum XML_Error result = addBinding(parser, attId->prefix, attId, + appAtts[attIndex], bindingsPtr); + if (result) + return result; + --attIndex; + } + else { + /* deal with other prefixed names later */ + attIndex++; + nPrefixes++; + (attId->name)[-1] = 2; + } + } + else + attIndex++; + } + + /* set-up for XML_GetSpecifiedAttributeCount and XML_GetIdAttributeIndex */ + nSpecifiedAtts = attIndex; + if (elementType->idAtt && (elementType->idAtt->name)[-1]) { + for (i = 0; i < attIndex; i += 2) + if (appAtts[i] == elementType->idAtt->name) { + idAttIndex = i; + break; + } + } + else + idAttIndex = -1; + + /* do attribute defaulting */ + for (i = 0; i < nDefaultAtts; i++) { + const DEFAULT_ATTRIBUTE *da = elementType->defaultAtts + i; + if (!(da->id->name)[-1] && da->value) { + if (da->id->prefix) { + if (da->id->xmlns) { + enum XML_Error result = addBinding(parser, da->id->prefix, da->id, + da->value, bindingsPtr); + if (result) + return result; + } + else { + (da->id->name)[-1] = 2; + nPrefixes++; + appAtts[attIndex++] = da->id->name; + appAtts[attIndex++] = da->value; + } + } + else { + (da->id->name)[-1] = 1; + appAtts[attIndex++] = da->id->name; + appAtts[attIndex++] = da->value; + } + } + } + appAtts[attIndex] = 0; + + /* expand prefixed attribute names, check for duplicates, + and clear flags that say whether attributes were specified */ + i = 0; + if (nPrefixes) { + int j; /* hash table index */ + unsigned long version = nsAttsVersion; + int nsAttsSize = (int)1 << nsAttsPower; + /* size of hash table must be at least 2 * (# of prefixed attributes) */ + if ((nPrefixes << 1) >> nsAttsPower) { /* true for nsAttsPower = 0 */ + NS_ATT *temp; + /* hash table size must also be a power of 2 and >= 8 */ + while (nPrefixes >> nsAttsPower++); + if (nsAttsPower < 3) + nsAttsPower = 3; + nsAttsSize = (int)1 << nsAttsPower; + temp = (NS_ATT *)REALLOC(nsAtts, nsAttsSize * sizeof(NS_ATT)); + if (!temp) + return XML_ERROR_NO_MEMORY; + nsAtts = temp; + version = 0; /* force re-initialization of nsAtts hash table */ + } + /* using a version flag saves us from initializing nsAtts every time */ + if (!version) { /* initialize version flags when version wraps around */ + version = INIT_ATTS_VERSION; + for (j = nsAttsSize; j != 0; ) + nsAtts[--j].version = version; + } + nsAttsVersion = --version; + + /* expand prefixed names and check for duplicates */ + for (; i < attIndex; i += 2) { + const XML_Char *s = appAtts[i]; + if (s[-1] == 2) { /* prefixed */ + ATTRIBUTE_ID *id; + const BINDING *b; + unsigned long uriHash = 0; + ((XML_Char *)s)[-1] = 0; /* clear flag */ + id = (ATTRIBUTE_ID *)lookup(&dtd->attributeIds, s, 0); + b = id->prefix->binding; + if (!b) + return XML_ERROR_UNBOUND_PREFIX; + + /* as we expand the name we also calculate its hash value */ + for (j = 0; j < b->uriLen; j++) { + const XML_Char c = b->uri[j]; + if (!poolAppendChar(&tempPool, c)) + return XML_ERROR_NO_MEMORY; + uriHash = CHAR_HASH(uriHash, c); + } + while (*s++ != XML_T(':')) + ; + do { /* copies null terminator */ + const XML_Char c = *s; + if (!poolAppendChar(&tempPool, *s)) + return XML_ERROR_NO_MEMORY; + uriHash = CHAR_HASH(uriHash, c); + } while (*s++); + + { /* Check hash table for duplicate of expanded name (uriName). + Derived from code in lookup(HASH_TABLE *table, ...). + */ + unsigned char step = 0; + unsigned long mask = nsAttsSize - 1; + j = uriHash & mask; /* index into hash table */ + while (nsAtts[j].version == version) { + /* for speed we compare stored hash values first */ + if (uriHash == nsAtts[j].hash) { + const XML_Char *s1 = poolStart(&tempPool); + const XML_Char *s2 = nsAtts[j].uriName; + /* s1 is null terminated, but not s2 */ + for (; *s1 == *s2 && *s1 != 0; s1++, s2++); + if (*s1 == 0) + return XML_ERROR_DUPLICATE_ATTRIBUTE; + } + if (!step) + step = PROBE_STEP(uriHash, mask, nsAttsPower); + j < step ? ( j += nsAttsSize - step) : (j -= step); + } + } + + if (ns_triplets) { /* append namespace separator and prefix */ + tempPool.ptr[-1] = namespaceSeparator; + s = b->prefix->name; + do { + if (!poolAppendChar(&tempPool, *s)) + return XML_ERROR_NO_MEMORY; + } while (*s++); + } + + /* store expanded name in attribute list */ + s = poolStart(&tempPool); + poolFinish(&tempPool); + appAtts[i] = s; + + /* fill empty slot with new version, uriName and hash value */ + nsAtts[j].version = version; + nsAtts[j].hash = uriHash; + nsAtts[j].uriName = s; + + if (!--nPrefixes) + break; + } + else /* not prefixed */ + ((XML_Char *)s)[-1] = 0; /* clear flag */ + } + } + /* clear flags for the remaining attributes */ + for (; i < attIndex; i += 2) + ((XML_Char *)(appAtts[i]))[-1] = 0; + for (binding = *bindingsPtr; binding; binding = binding->nextTagBinding) + binding->attId->name[-1] = 0; + + if (!ns) + return XML_ERROR_NONE; + + /* expand the element type name */ + if (elementType->prefix) { + binding = elementType->prefix->binding; + if (!binding) + return XML_ERROR_UNBOUND_PREFIX; + localPart = tagNamePtr->str; + while (*localPart++ != XML_T(':')) + ; + } + else if (dtd->defaultPrefix.binding) { + binding = dtd->defaultPrefix.binding; + localPart = tagNamePtr->str; + } + else + return XML_ERROR_NONE; + prefixLen = 0; + if (ns_triplets && binding->prefix->name) { + for (; binding->prefix->name[prefixLen++];) + ; + } + tagNamePtr->localPart = localPart; + tagNamePtr->uriLen = binding->uriLen; + tagNamePtr->prefix = binding->prefix->name; + tagNamePtr->prefixLen = prefixLen; + for (i = 0; localPart[i++];) + ; + n = i + binding->uriLen + prefixLen; + if (n > binding->uriAlloc) { + TAG *p; + uri = (XML_Char *)MALLOC((n + EXPAND_SPARE) * sizeof(XML_Char)); + if (!uri) + return XML_ERROR_NO_MEMORY; + binding->uriAlloc = n + EXPAND_SPARE; + memcpy(uri, binding->uri, binding->uriLen * sizeof(XML_Char)); + for (p = tagStack; p; p = p->parent) + if (p->name.str == binding->uri) + p->name.str = uri; + FREE(binding->uri); + binding->uri = uri; + } + uri = binding->uri + binding->uriLen; + memcpy(uri, localPart, i * sizeof(XML_Char)); + if (prefixLen) { + uri = uri + (i - 1); + if (namespaceSeparator) + *uri = namespaceSeparator; + memcpy(uri + 1, binding->prefix->name, prefixLen * sizeof(XML_Char)); + } + tagNamePtr->str = binding->uri; + return XML_ERROR_NONE; +} + +/* addBinding() overwrites the value of prefix->binding without checking. + Therefore one must keep track of the old value outside of addBinding(). +*/ +static enum XML_Error +addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId, + const XML_Char *uri, BINDING **bindingsPtr) +{ + BINDING *b; + int len; + + /* empty string is only valid when there is no prefix per XML NS 1.0 */ + if (*uri == XML_T('\0') && prefix->name) + return XML_ERROR_SYNTAX; + + for (len = 0; uri[len]; len++) + ; + if (namespaceSeparator) + len++; + if (freeBindingList) { + b = freeBindingList; + if (len > b->uriAlloc) { + XML_Char *temp = (XML_Char *)REALLOC(b->uri, + sizeof(XML_Char) * (len + EXPAND_SPARE)); + if (temp == NULL) + return XML_ERROR_NO_MEMORY; + b->uri = temp; + b->uriAlloc = len + EXPAND_SPARE; + } + freeBindingList = b->nextTagBinding; + } + else { + b = (BINDING *)MALLOC(sizeof(BINDING)); + if (!b) + return XML_ERROR_NO_MEMORY; + b->uri = (XML_Char *)MALLOC(sizeof(XML_Char) * (len + EXPAND_SPARE)); + if (!b->uri) { + FREE(b); + return XML_ERROR_NO_MEMORY; + } + b->uriAlloc = len + EXPAND_SPARE; + } + b->uriLen = len; + memcpy(b->uri, uri, len * sizeof(XML_Char)); + if (namespaceSeparator) + b->uri[len - 1] = namespaceSeparator; + b->prefix = prefix; + b->attId = attId; + b->prevPrefixBinding = prefix->binding; + /* NULL binding when default namespace undeclared */ + if (*uri == XML_T('\0') && prefix == &_dtd->defaultPrefix) + prefix->binding = NULL; + else + prefix->binding = b; + b->nextTagBinding = *bindingsPtr; + *bindingsPtr = b; + if (startNamespaceDeclHandler) + startNamespaceDeclHandler(handlerArg, prefix->name, + prefix->binding ? uri : 0); + return XML_ERROR_NONE; +} + +/* The idea here is to avoid using stack for each CDATA section when + the whole file is parsed with one call. +*/ +static enum XML_Error PTRCALL +cdataSectionProcessor(XML_Parser parser, + const char *start, + const char *end, + const char **endPtr) +{ + enum XML_Error result = doCdataSection(parser, encoding, &start, + end, endPtr); + if (start) { + if (parentParser) { /* we are parsing an external entity */ + processor = externalEntityContentProcessor; + return externalEntityContentProcessor(parser, start, end, endPtr); + } + else { + processor = contentProcessor; + return contentProcessor(parser, start, end, endPtr); + } + } + return result; +} + +/* startPtr gets set to non-null is the section is closed, and to null if + the section is not yet closed. +*/ +static enum XML_Error +doCdataSection(XML_Parser parser, + const ENCODING *enc, + const char **startPtr, + const char *end, + const char **nextPtr) +{ + const char *s = *startPtr; + const char **eventPP; + const char **eventEndPP; + if (enc == encoding) { + eventPP = &eventPtr; + *eventPP = s; + eventEndPP = &eventEndPtr; + } + else { + eventPP = &(openInternalEntities->internalEventPtr); + eventEndPP = &(openInternalEntities->internalEventEndPtr); + } + *eventPP = s; + *startPtr = NULL; + for (;;) { + const char *next; + int tok = XmlCdataSectionTok(enc, s, end, &next); + *eventEndPP = next; + switch (tok) { + case XML_TOK_CDATA_SECT_CLOSE: + if (endCdataSectionHandler) + endCdataSectionHandler(handlerArg); +#if 0 + /* see comment under XML_TOK_CDATA_SECT_OPEN */ + else if (characterDataHandler) + characterDataHandler(handlerArg, dataBuf, 0); +#endif + else if (defaultHandler) + reportDefault(parser, enc, s, next); + *startPtr = next; + return XML_ERROR_NONE; + case XML_TOK_DATA_NEWLINE: + if (characterDataHandler) { + XML_Char c = 0xA; + characterDataHandler(handlerArg, &c, 1); + } + else if (defaultHandler) + reportDefault(parser, enc, s, next); + break; + case XML_TOK_DATA_CHARS: + if (characterDataHandler) { + if (MUST_CONVERT(enc, s)) { + for (;;) { + ICHAR *dataPtr = (ICHAR *)dataBuf; + XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd); + *eventEndPP = next; + characterDataHandler(handlerArg, dataBuf, + dataPtr - (ICHAR *)dataBuf); + if (s == next) + break; + *eventPP = s; + } + } + else + characterDataHandler(handlerArg, + (XML_Char *)s, + (XML_Char *)next - (XML_Char *)s); + } + else if (defaultHandler) + reportDefault(parser, enc, s, next); + break; + case XML_TOK_INVALID: + *eventPP = next; + return XML_ERROR_INVALID_TOKEN; + case XML_TOK_PARTIAL_CHAR: + if (nextPtr) { + *nextPtr = s; + return XML_ERROR_NONE; + } + return XML_ERROR_PARTIAL_CHAR; + case XML_TOK_PARTIAL: + case XML_TOK_NONE: + if (nextPtr) { + *nextPtr = s; + return XML_ERROR_NONE; + } + return XML_ERROR_UNCLOSED_CDATA_SECTION; + default: + *eventPP = next; + return XML_ERROR_UNEXPECTED_STATE; + } + *eventPP = s = next; + } + /* not reached */ +} + +#ifdef XML_DTD + +/* The idea here is to avoid using stack for each IGNORE section when + the whole file is parsed with one call. +*/ +static enum XML_Error PTRCALL +ignoreSectionProcessor(XML_Parser parser, + const char *start, + const char *end, + const char **endPtr) +{ + enum XML_Error result = doIgnoreSection(parser, encoding, &start, + end, endPtr); + if (start) { + processor = prologProcessor; + return prologProcessor(parser, start, end, endPtr); + } + return result; +} + +/* startPtr gets set to non-null is the section is closed, and to null + if the section is not yet closed. +*/ +static enum XML_Error +doIgnoreSection(XML_Parser parser, + const ENCODING *enc, + const char **startPtr, + const char *end, + const char **nextPtr) +{ + const char *next; + int tok; + const char *s = *startPtr; + const char **eventPP; + const char **eventEndPP; + if (enc == encoding) { + eventPP = &eventPtr; + *eventPP = s; + eventEndPP = &eventEndPtr; + } + else { + eventPP = &(openInternalEntities->internalEventPtr); + eventEndPP = &(openInternalEntities->internalEventEndPtr); + } + *eventPP = s; + *startPtr = NULL; + tok = XmlIgnoreSectionTok(enc, s, end, &next); + *eventEndPP = next; + switch (tok) { + case XML_TOK_IGNORE_SECT: + if (defaultHandler) + reportDefault(parser, enc, s, next); + *startPtr = next; + return XML_ERROR_NONE; + case XML_TOK_INVALID: + *eventPP = next; + return XML_ERROR_INVALID_TOKEN; + case XML_TOK_PARTIAL_CHAR: + if (nextPtr) { + *nextPtr = s; + return XML_ERROR_NONE; + } + return XML_ERROR_PARTIAL_CHAR; + case XML_TOK_PARTIAL: + case XML_TOK_NONE: + if (nextPtr) { + *nextPtr = s; + return XML_ERROR_NONE; + } + return XML_ERROR_SYNTAX; /* XML_ERROR_UNCLOSED_IGNORE_SECTION */ + default: + *eventPP = next; + return XML_ERROR_UNEXPECTED_STATE; + } + /* not reached */ +} + +#endif /* XML_DTD */ + +static enum XML_Error +initializeEncoding(XML_Parser parser) +{ + const char *s; +#ifdef XML_UNICODE + char encodingBuf[128]; + if (!protocolEncodingName) + s = NULL; + else { + int i; + for (i = 0; protocolEncodingName[i]; i++) { + if (i == sizeof(encodingBuf) - 1 + || (protocolEncodingName[i] & ~0x7f) != 0) { + encodingBuf[0] = '\0'; + break; + } + encodingBuf[i] = (char)protocolEncodingName[i]; + } + encodingBuf[i] = '\0'; + s = encodingBuf; + } +#else + s = protocolEncodingName; +#endif + if ((ns ? XmlInitEncodingNS : XmlInitEncoding)(&initEncoding, &encoding, s)) + return XML_ERROR_NONE; + return handleUnknownEncoding(parser, protocolEncodingName); +} + +static enum XML_Error +processXmlDecl(XML_Parser parser, int isGeneralTextEntity, + const char *s, const char *next) +{ + const char *encodingName = NULL; + const XML_Char *storedEncName = NULL; + const ENCODING *newEncoding = NULL; + const char *version = NULL; + const char *versionend; + const XML_Char *storedversion = NULL; + int standalone = -1; + if (!(ns + ? XmlParseXmlDeclNS + : XmlParseXmlDecl)(isGeneralTextEntity, + encoding, + s, + next, + &eventPtr, + &version, + &versionend, + &encodingName, + &newEncoding, + &standalone)) + return XML_ERROR_SYNTAX; + if (!isGeneralTextEntity && standalone == 1) { + _dtd->standalone = XML_TRUE; +#ifdef XML_DTD + if (paramEntityParsing == XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE) + paramEntityParsing = XML_PARAM_ENTITY_PARSING_NEVER; +#endif /* XML_DTD */ + } + if (xmlDeclHandler) { + if (encodingName != NULL) { + storedEncName = poolStoreString(&temp2Pool, + encoding, + encodingName, + encodingName + + XmlNameLength(encoding, encodingName)); + if (!storedEncName) + return XML_ERROR_NO_MEMORY; + poolFinish(&temp2Pool); + } + if (version) { + storedversion = poolStoreString(&temp2Pool, + encoding, + version, + versionend - encoding->minBytesPerChar); + if (!storedversion) + return XML_ERROR_NO_MEMORY; + } + xmlDeclHandler(handlerArg, storedversion, storedEncName, standalone); + } + else if (defaultHandler) + reportDefault(parser, encoding, s, next); + if (protocolEncodingName == NULL) { + if (newEncoding) { + if (newEncoding->minBytesPerChar != encoding->minBytesPerChar) { + eventPtr = encodingName; + return XML_ERROR_INCORRECT_ENCODING; + } + encoding = newEncoding; + } + else if (encodingName) { + enum XML_Error result; + if (!storedEncName) { + storedEncName = poolStoreString( + &temp2Pool, encoding, encodingName, + encodingName + XmlNameLength(encoding, encodingName)); + if (!storedEncName) + return XML_ERROR_NO_MEMORY; + } + result = handleUnknownEncoding(parser, storedEncName); + poolClear(&temp2Pool); + if (result == XML_ERROR_UNKNOWN_ENCODING) + eventPtr = encodingName; + return result; + } + } + + if (storedEncName || storedversion) + poolClear(&temp2Pool); + + return XML_ERROR_NONE; +} + +static enum XML_Error +handleUnknownEncoding(XML_Parser parser, const XML_Char *encodingName) +{ + if (unknownEncodingHandler) { + XML_Encoding info; + int i; + for (i = 0; i < 256; i++) + info.map[i] = -1; + info.convert = NULL; + info.data = NULL; + info.release = NULL; + if (unknownEncodingHandler(unknownEncodingHandlerData, encodingName, + &info)) { + ENCODING *enc; + unknownEncodingMem = MALLOC(XmlSizeOfUnknownEncoding()); + if (!unknownEncodingMem) { + if (info.release) + info.release(info.data); + return XML_ERROR_NO_MEMORY; + } + enc = (ns + ? XmlInitUnknownEncodingNS + : XmlInitUnknownEncoding)(unknownEncodingMem, + info.map, + info.convert, + info.data); + if (enc) { + unknownEncodingData = info.data; + unknownEncodingRelease = info.release; + encoding = enc; + return XML_ERROR_NONE; + } + } + if (info.release != NULL) + info.release(info.data); + } + return XML_ERROR_UNKNOWN_ENCODING; +} + +static enum XML_Error PTRCALL +prologInitProcessor(XML_Parser parser, + const char *s, + const char *end, + const char **nextPtr) +{ + enum XML_Error result = initializeEncoding(parser); + if (result != XML_ERROR_NONE) + return result; + processor = prologProcessor; + return prologProcessor(parser, s, end, nextPtr); +} + +#ifdef XML_DTD + +static enum XML_Error PTRCALL +externalParEntInitProcessor(XML_Parser parser, + const char *s, + const char *end, + const char **nextPtr) +{ + enum XML_Error result = initializeEncoding(parser); + if (result != XML_ERROR_NONE) + return result; + + /* we know now that XML_Parse(Buffer) has been called, + so we consider the external parameter entity read */ + _dtd->paramEntityRead = XML_TRUE; + + if (prologState.inEntityValue) { + processor = entityValueInitProcessor; + return entityValueInitProcessor(parser, s, end, nextPtr); + } + else { + processor = externalParEntProcessor; + return externalParEntProcessor(parser, s, end, nextPtr); + } +} + +static enum XML_Error PTRCALL +entityValueInitProcessor(XML_Parser parser, + const char *s, + const char *end, + const char **nextPtr) +{ + const char *start = s; + const char *next = s; + int tok; + + for (;;) { + tok = XmlPrologTok(encoding, start, end, &next); + if (tok <= 0) { + if (nextPtr != 0 && tok != XML_TOK_INVALID) { + *nextPtr = s; + return XML_ERROR_NONE; + } + switch (tok) { + case XML_TOK_INVALID: + return XML_ERROR_INVALID_TOKEN; + case XML_TOK_PARTIAL: + return XML_ERROR_UNCLOSED_TOKEN; + case XML_TOK_PARTIAL_CHAR: + return XML_ERROR_PARTIAL_CHAR; + case XML_TOK_NONE: /* start == end */ + default: + break; + } + return storeEntityValue(parser, encoding, s, end); + } + else if (tok == XML_TOK_XML_DECL) { + enum XML_Error result = processXmlDecl(parser, 0, start, next); + if (result != XML_ERROR_NONE) + return result; + if (nextPtr) *nextPtr = next; + /* stop scanning for text declaration - we found one */ + processor = entityValueProcessor; + return entityValueProcessor(parser, next, end, nextPtr); + } + /* If we are at the end of the buffer, this would cause XmlPrologTok to + return XML_TOK_NONE on the next call, which would then cause the + function to exit with *nextPtr set to s - that is what we want for other + tokens, but not for the BOM - we would rather like to skip it; + then, when this routine is entered the next time, XmlPrologTok will + return XML_TOK_INVALID, since the BOM is still in the buffer + */ + else if (tok == XML_TOK_BOM && next == end && nextPtr) { + *nextPtr = next; + return XML_ERROR_NONE; + } + start = next; + } +} + +static enum XML_Error PTRCALL +externalParEntProcessor(XML_Parser parser, + const char *s, + const char *end, + const char **nextPtr) +{ + const char *start = s; + const char *next = s; + int tok; + + tok = XmlPrologTok(encoding, start, end, &next); + if (tok <= 0) { + if (nextPtr != 0 && tok != XML_TOK_INVALID) { + *nextPtr = s; + return XML_ERROR_NONE; + } + switch (tok) { + case XML_TOK_INVALID: + return XML_ERROR_INVALID_TOKEN; + case XML_TOK_PARTIAL: + return XML_ERROR_UNCLOSED_TOKEN; + case XML_TOK_PARTIAL_CHAR: + return XML_ERROR_PARTIAL_CHAR; + case XML_TOK_NONE: /* start == end */ + default: + break; + } + } + /* This would cause the next stage, i.e. doProlog to be passed XML_TOK_BOM. + However, when parsing an external subset, doProlog will not accept a BOM + as valid, and report a syntax error, so we have to skip the BOM + */ + else if (tok == XML_TOK_BOM) { + s = next; + tok = XmlPrologTok(encoding, s, end, &next); + } + + processor = prologProcessor; + return doProlog(parser, encoding, s, end, tok, next, nextPtr); +} + +static enum XML_Error PTRCALL +entityValueProcessor(XML_Parser parser, + const char *s, + const char *end, + const char **nextPtr) +{ + const char *start = s; + const char *next = s; + const ENCODING *enc = encoding; + int tok; + + for (;;) { + tok = XmlPrologTok(enc, start, end, &next); + if (tok <= 0) { + if (nextPtr != 0 && tok != XML_TOK_INVALID) { + *nextPtr = s; + return XML_ERROR_NONE; + } + switch (tok) { + case XML_TOK_INVALID: + return XML_ERROR_INVALID_TOKEN; + case XML_TOK_PARTIAL: + return XML_ERROR_UNCLOSED_TOKEN; + case XML_TOK_PARTIAL_CHAR: + return XML_ERROR_PARTIAL_CHAR; + case XML_TOK_NONE: /* start == end */ + default: + break; + } + return storeEntityValue(parser, enc, s, end); + } + start = next; + } +} + +#endif /* XML_DTD */ + +static enum XML_Error PTRCALL +prologProcessor(XML_Parser parser, + const char *s, + const char *end, + const char **nextPtr) +{ + const char *next = s; + int tok = XmlPrologTok(encoding, s, end, &next); + return doProlog(parser, encoding, s, end, tok, next, nextPtr); +} + +static enum XML_Error +doProlog(XML_Parser parser, + const ENCODING *enc, + const char *s, + const char *end, + int tok, + const char *next, + const char **nextPtr) +{ +#ifdef XML_DTD + static const XML_Char externalSubsetName[] = { '#' , '\0' }; +#endif /* XML_DTD */ + static const XML_Char atypeCDATA[] = { 'C', 'D', 'A', 'T', 'A', '\0' }; + static const XML_Char atypeID[] = { 'I', 'D', '\0' }; + static const XML_Char atypeIDREF[] = { 'I', 'D', 'R', 'E', 'F', '\0' }; + static const XML_Char atypeIDREFS[] = { 'I', 'D', 'R', 'E', 'F', 'S', '\0' }; + static const XML_Char atypeENTITY[] = { 'E', 'N', 'T', 'I', 'T', 'Y', '\0' }; + static const XML_Char atypeENTITIES[] = + { 'E', 'N', 'T', 'I', 'T', 'I', 'E', 'S', '\0' }; + static const XML_Char atypeNMTOKEN[] = { + 'N', 'M', 'T', 'O', 'K', 'E', 'N', '\0' }; + static const XML_Char atypeNMTOKENS[] = { + 'N', 'M', 'T', 'O', 'K', 'E', 'N', 'S', '\0' }; + static const XML_Char notationPrefix[] = { + 'N', 'O', 'T', 'A', 'T', 'I', 'O', 'N', '(', '\0' }; + static const XML_Char enumValueSep[] = { '|', '\0' }; + static const XML_Char enumValueStart[] = { '(', '\0' }; + + DTD * const dtd = _dtd; /* save one level of indirection */ + + const char **eventPP; + const char **eventEndPP; + enum XML_Content_Quant quant; + + if (enc == encoding) { + eventPP = &eventPtr; + eventEndPP = &eventEndPtr; + } + else { + eventPP = &(openInternalEntities->internalEventPtr); + eventEndPP = &(openInternalEntities->internalEventEndPtr); + } + for (;;) { + int role; + XML_Bool handleDefault = XML_TRUE; + *eventPP = s; + *eventEndPP = next; + if (tok <= 0) { + if (nextPtr != 0 && tok != XML_TOK_INVALID) { + *nextPtr = s; + return XML_ERROR_NONE; + } + switch (tok) { + case XML_TOK_INVALID: + *eventPP = next; + return XML_ERROR_INVALID_TOKEN; + case XML_TOK_PARTIAL: + return XML_ERROR_UNCLOSED_TOKEN; + case XML_TOK_PARTIAL_CHAR: + return XML_ERROR_PARTIAL_CHAR; + case -XML_TOK_PROLOG_S: + tok = -tok; + break; + case XML_TOK_NONE: +#ifdef XML_DTD + if (enc != encoding) + return XML_ERROR_NONE; + if (isParamEntity) { + if (XmlTokenRole(&prologState, XML_TOK_NONE, end, end, enc) + == XML_ROLE_ERROR) + return XML_ERROR_SYNTAX; + return XML_ERROR_NONE; + } +#endif /* XML_DTD */ + return XML_ERROR_NO_ELEMENTS; + default: + tok = -tok; + next = end; + break; + } + } + role = XmlTokenRole(&prologState, tok, s, next, enc); + switch (role) { + case XML_ROLE_XML_DECL: + { + enum XML_Error result = processXmlDecl(parser, 0, s, next); + if (result != XML_ERROR_NONE) + return result; + enc = encoding; + handleDefault = XML_FALSE; + } + break; + case XML_ROLE_DOCTYPE_NAME: + if (startDoctypeDeclHandler) { + doctypeName = poolStoreString(&tempPool, enc, s, next); + if (!doctypeName) + return XML_ERROR_NO_MEMORY; + poolFinish(&tempPool); + doctypePubid = NULL; + handleDefault = XML_FALSE; + } + doctypeSysid = NULL; /* always initialize to NULL */ + break; + case XML_ROLE_DOCTYPE_INTERNAL_SUBSET: + if (startDoctypeDeclHandler) { + startDoctypeDeclHandler(handlerArg, doctypeName, doctypeSysid, + doctypePubid, 1); + doctypeName = NULL; + poolClear(&tempPool); + handleDefault = XML_FALSE; + } + break; +#ifdef XML_DTD + case XML_ROLE_TEXT_DECL: + { + enum XML_Error result = processXmlDecl(parser, 1, s, next); + if (result != XML_ERROR_NONE) + return result; + enc = encoding; + handleDefault = XML_FALSE; + } + break; +#endif /* XML_DTD */ + case XML_ROLE_DOCTYPE_PUBLIC_ID: +#ifdef XML_DTD + useForeignDTD = XML_FALSE; +#endif /* XML_DTD */ + dtd->hasParamEntityRefs = XML_TRUE; + if (startDoctypeDeclHandler) { + doctypePubid = poolStoreString(&tempPool, enc, + s + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (!doctypePubid) + return XML_ERROR_NO_MEMORY; + poolFinish(&tempPool); + handleDefault = XML_FALSE; + } +#ifdef XML_DTD + declEntity = (ENTITY *)lookup(&dtd->paramEntities, + externalSubsetName, + sizeof(ENTITY)); + if (!declEntity) + return XML_ERROR_NO_MEMORY; +#endif /* XML_DTD */ + /* fall through */ + case XML_ROLE_ENTITY_PUBLIC_ID: + if (!XmlIsPublicId(enc, s, next, eventPP)) + return XML_ERROR_SYNTAX; + if (dtd->keepProcessing && declEntity) { + XML_Char *tem = poolStoreString(&dtd->pool, + enc, + s + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (!tem) + return XML_ERROR_NO_MEMORY; + normalizePublicId(tem); + declEntity->publicId = tem; + poolFinish(&dtd->pool); + if (entityDeclHandler) + handleDefault = XML_FALSE; + } + break; + case XML_ROLE_DOCTYPE_CLOSE: + if (doctypeName) { + startDoctypeDeclHandler(handlerArg, doctypeName, + doctypeSysid, doctypePubid, 0); + poolClear(&tempPool); + handleDefault = XML_FALSE; + } + /* doctypeSysid will be non-NULL in the case of a previous + XML_ROLE_DOCTYPE_SYSTEM_ID, even if startDoctypeDeclHandler + was not set, indicating an external subset + */ +#ifdef XML_DTD + if (doctypeSysid || useForeignDTD) { + dtd->hasParamEntityRefs = XML_TRUE; /* when docTypeSysid == NULL */ + if (paramEntityParsing && externalEntityRefHandler) { + ENTITY *entity = (ENTITY *)lookup(&dtd->paramEntities, + externalSubsetName, + sizeof(ENTITY)); + if (!entity) + return XML_ERROR_NO_MEMORY; + if (useForeignDTD) + entity->base = curBase; + dtd->paramEntityRead = XML_FALSE; + if (!externalEntityRefHandler(externalEntityRefHandlerArg, + 0, + entity->base, + entity->systemId, + entity->publicId)) + return XML_ERROR_EXTERNAL_ENTITY_HANDLING; + if (dtd->paramEntityRead && + !dtd->standalone && + notStandaloneHandler && + !notStandaloneHandler(handlerArg)) + return XML_ERROR_NOT_STANDALONE; + /* end of DTD - no need to update dtd->keepProcessing */ + } + useForeignDTD = XML_FALSE; + } +#endif /* XML_DTD */ + if (endDoctypeDeclHandler) { + endDoctypeDeclHandler(handlerArg); + handleDefault = XML_FALSE; + } + break; + case XML_ROLE_INSTANCE_START: +#ifdef XML_DTD + /* if there is no DOCTYPE declaration then now is the + last chance to read the foreign DTD + */ + if (useForeignDTD) { + dtd->hasParamEntityRefs = XML_TRUE; + if (paramEntityParsing && externalEntityRefHandler) { + ENTITY *entity = (ENTITY *)lookup(&dtd->paramEntities, + externalSubsetName, + sizeof(ENTITY)); + if (!entity) + return XML_ERROR_NO_MEMORY; + entity->base = curBase; + dtd->paramEntityRead = XML_FALSE; + if (!externalEntityRefHandler(externalEntityRefHandlerArg, + 0, + entity->base, + entity->systemId, + entity->publicId)) + return XML_ERROR_EXTERNAL_ENTITY_HANDLING; + if (dtd->paramEntityRead && + !dtd->standalone && + notStandaloneHandler && + !notStandaloneHandler(handlerArg)) + return XML_ERROR_NOT_STANDALONE; + /* end of DTD - no need to update dtd->keepProcessing */ + } + } +#endif /* XML_DTD */ + processor = contentProcessor; + return contentProcessor(parser, s, end, nextPtr); + case XML_ROLE_ATTLIST_ELEMENT_NAME: + declElementType = getElementType(parser, enc, s, next); + if (!declElementType) + return XML_ERROR_NO_MEMORY; + goto checkAttListDeclHandler; + case XML_ROLE_ATTRIBUTE_NAME: + declAttributeId = getAttributeId(parser, enc, s, next); + if (!declAttributeId) + return XML_ERROR_NO_MEMORY; + declAttributeIsCdata = XML_FALSE; + declAttributeType = NULL; + declAttributeIsId = XML_FALSE; + goto checkAttListDeclHandler; + case XML_ROLE_ATTRIBUTE_TYPE_CDATA: + declAttributeIsCdata = XML_TRUE; + declAttributeType = atypeCDATA; + goto checkAttListDeclHandler; + case XML_ROLE_ATTRIBUTE_TYPE_ID: + declAttributeIsId = XML_TRUE; + declAttributeType = atypeID; + goto checkAttListDeclHandler; + case XML_ROLE_ATTRIBUTE_TYPE_IDREF: + declAttributeType = atypeIDREF; + goto checkAttListDeclHandler; + case XML_ROLE_ATTRIBUTE_TYPE_IDREFS: + declAttributeType = atypeIDREFS; + goto checkAttListDeclHandler; + case XML_ROLE_ATTRIBUTE_TYPE_ENTITY: + declAttributeType = atypeENTITY; + goto checkAttListDeclHandler; + case XML_ROLE_ATTRIBUTE_TYPE_ENTITIES: + declAttributeType = atypeENTITIES; + goto checkAttListDeclHandler; + case XML_ROLE_ATTRIBUTE_TYPE_NMTOKEN: + declAttributeType = atypeNMTOKEN; + goto checkAttListDeclHandler; + case XML_ROLE_ATTRIBUTE_TYPE_NMTOKENS: + declAttributeType = atypeNMTOKENS; + checkAttListDeclHandler: + if (dtd->keepProcessing && attlistDeclHandler) + handleDefault = XML_FALSE; + break; + case XML_ROLE_ATTRIBUTE_ENUM_VALUE: + case XML_ROLE_ATTRIBUTE_NOTATION_VALUE: + if (dtd->keepProcessing && attlistDeclHandler) { + const XML_Char *prefix; + if (declAttributeType) { + prefix = enumValueSep; + } + else { + prefix = (role == XML_ROLE_ATTRIBUTE_NOTATION_VALUE + ? notationPrefix + : enumValueStart); + } + if (!poolAppendString(&tempPool, prefix)) + return XML_ERROR_NO_MEMORY; + if (!poolAppend(&tempPool, enc, s, next)) + return XML_ERROR_NO_MEMORY; + declAttributeType = tempPool.start; + handleDefault = XML_FALSE; + } + break; + case XML_ROLE_IMPLIED_ATTRIBUTE_VALUE: + case XML_ROLE_REQUIRED_ATTRIBUTE_VALUE: + if (dtd->keepProcessing) { + if (!defineAttribute(declElementType, declAttributeId, + declAttributeIsCdata, declAttributeIsId, + 0, parser)) + return XML_ERROR_NO_MEMORY; + if (attlistDeclHandler && declAttributeType) { + if (*declAttributeType == XML_T('(') + || (*declAttributeType == XML_T('N') + && declAttributeType[1] == XML_T('O'))) { + /* Enumerated or Notation type */ + if (!poolAppendChar(&tempPool, XML_T(')')) + || !poolAppendChar(&tempPool, XML_T('\0'))) + return XML_ERROR_NO_MEMORY; + declAttributeType = tempPool.start; + poolFinish(&tempPool); + } + *eventEndPP = s; + attlistDeclHandler(handlerArg, declElementType->name, + declAttributeId->name, declAttributeType, + 0, role == XML_ROLE_REQUIRED_ATTRIBUTE_VALUE); + poolClear(&tempPool); + handleDefault = XML_FALSE; + } + } + break; + case XML_ROLE_DEFAULT_ATTRIBUTE_VALUE: + case XML_ROLE_FIXED_ATTRIBUTE_VALUE: + if (dtd->keepProcessing) { + const XML_Char *attVal; + enum XML_Error result = + storeAttributeValue(parser, enc, declAttributeIsCdata, + s + enc->minBytesPerChar, + next - enc->minBytesPerChar, + &dtd->pool); + if (result) + return result; + attVal = poolStart(&dtd->pool); + poolFinish(&dtd->pool); + /* ID attributes aren't allowed to have a default */ + if (!defineAttribute(declElementType, declAttributeId, + declAttributeIsCdata, XML_FALSE, attVal, parser)) + return XML_ERROR_NO_MEMORY; + if (attlistDeclHandler && declAttributeType) { + if (*declAttributeType == XML_T('(') + || (*declAttributeType == XML_T('N') + && declAttributeType[1] == XML_T('O'))) { + /* Enumerated or Notation type */ + if (!poolAppendChar(&tempPool, XML_T(')')) + || !poolAppendChar(&tempPool, XML_T('\0'))) + return XML_ERROR_NO_MEMORY; + declAttributeType = tempPool.start; + poolFinish(&tempPool); + } + *eventEndPP = s; + attlistDeclHandler(handlerArg, declElementType->name, + declAttributeId->name, declAttributeType, + attVal, + role == XML_ROLE_FIXED_ATTRIBUTE_VALUE); + poolClear(&tempPool); + handleDefault = XML_FALSE; + } + } + break; + case XML_ROLE_ENTITY_VALUE: + if (dtd->keepProcessing) { + enum XML_Error result = storeEntityValue(parser, enc, + s + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (declEntity) { + declEntity->textPtr = poolStart(&dtd->entityValuePool); + declEntity->textLen = poolLength(&dtd->entityValuePool); + poolFinish(&dtd->entityValuePool); + if (entityDeclHandler) { + *eventEndPP = s; + entityDeclHandler(handlerArg, + declEntity->name, + declEntity->is_param, + declEntity->textPtr, + declEntity->textLen, + curBase, 0, 0, 0); + handleDefault = XML_FALSE; + } + } + else + poolDiscard(&dtd->entityValuePool); + if (result != XML_ERROR_NONE) + return result; + } + break; + case XML_ROLE_DOCTYPE_SYSTEM_ID: +#ifdef XML_DTD + useForeignDTD = XML_FALSE; +#endif /* XML_DTD */ + dtd->hasParamEntityRefs = XML_TRUE; + if (startDoctypeDeclHandler) { + doctypeSysid = poolStoreString(&tempPool, enc, + s + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (doctypeSysid == NULL) + return XML_ERROR_NO_MEMORY; + poolFinish(&tempPool); + handleDefault = XML_FALSE; + } +#ifdef XML_DTD + else + /* use externalSubsetName to make doctypeSysid non-NULL + for the case where no startDoctypeDeclHandler is set */ + doctypeSysid = externalSubsetName; +#endif /* XML_DTD */ + if (!dtd->standalone +#ifdef XML_DTD + && !paramEntityParsing +#endif /* XML_DTD */ + && notStandaloneHandler + && !notStandaloneHandler(handlerArg)) + return XML_ERROR_NOT_STANDALONE; +#ifndef XML_DTD + break; +#else /* XML_DTD */ + if (!declEntity) { + declEntity = (ENTITY *)lookup(&dtd->paramEntities, + externalSubsetName, + sizeof(ENTITY)); + if (!declEntity) + return XML_ERROR_NO_MEMORY; + declEntity->publicId = NULL; + } + /* fall through */ +#endif /* XML_DTD */ + case XML_ROLE_ENTITY_SYSTEM_ID: + if (dtd->keepProcessing && declEntity) { + declEntity->systemId = poolStoreString(&dtd->pool, enc, + s + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (!declEntity->systemId) + return XML_ERROR_NO_MEMORY; + declEntity->base = curBase; + poolFinish(&dtd->pool); + if (entityDeclHandler) + handleDefault = XML_FALSE; + } + break; + case XML_ROLE_ENTITY_COMPLETE: + if (dtd->keepProcessing && declEntity && entityDeclHandler) { + *eventEndPP = s; + entityDeclHandler(handlerArg, + declEntity->name, + declEntity->is_param, + 0,0, + declEntity->base, + declEntity->systemId, + declEntity->publicId, + 0); + handleDefault = XML_FALSE; + } + break; + case XML_ROLE_ENTITY_NOTATION_NAME: + if (dtd->keepProcessing && declEntity) { + declEntity->notation = poolStoreString(&dtd->pool, enc, s, next); + if (!declEntity->notation) + return XML_ERROR_NO_MEMORY; + poolFinish(&dtd->pool); + if (unparsedEntityDeclHandler) { + *eventEndPP = s; + unparsedEntityDeclHandler(handlerArg, + declEntity->name, + declEntity->base, + declEntity->systemId, + declEntity->publicId, + declEntity->notation); + handleDefault = XML_FALSE; + } + else if (entityDeclHandler) { + *eventEndPP = s; + entityDeclHandler(handlerArg, + declEntity->name, + 0,0,0, + declEntity->base, + declEntity->systemId, + declEntity->publicId, + declEntity->notation); + handleDefault = XML_FALSE; + } + } + break; + case XML_ROLE_GENERAL_ENTITY_NAME: + { + if (XmlPredefinedEntityName(enc, s, next)) { + declEntity = NULL; + break; + } + if (dtd->keepProcessing) { + const XML_Char *name = poolStoreString(&dtd->pool, enc, s, next); + if (!name) + return XML_ERROR_NO_MEMORY; + declEntity = (ENTITY *)lookup(&dtd->generalEntities, name, + sizeof(ENTITY)); + if (!declEntity) + return XML_ERROR_NO_MEMORY; + if (declEntity->name != name) { + poolDiscard(&dtd->pool); + declEntity = NULL; + } + else { + poolFinish(&dtd->pool); + declEntity->publicId = NULL; + declEntity->is_param = XML_FALSE; + /* if we have a parent parser or are reading an internal parameter + entity, then the entity declaration is not considered "internal" + */ + declEntity->is_internal = !(parentParser || openInternalEntities); + if (entityDeclHandler) + handleDefault = XML_FALSE; + } + } + else { + poolDiscard(&dtd->pool); + declEntity = NULL; + } + } + break; + case XML_ROLE_PARAM_ENTITY_NAME: +#ifdef XML_DTD + if (dtd->keepProcessing) { + const XML_Char *name = poolStoreString(&dtd->pool, enc, s, next); + if (!name) + return XML_ERROR_NO_MEMORY; + declEntity = (ENTITY *)lookup(&dtd->paramEntities, + name, sizeof(ENTITY)); + if (!declEntity) + return XML_ERROR_NO_MEMORY; + if (declEntity->name != name) { + poolDiscard(&dtd->pool); + declEntity = NULL; + } + else { + poolFinish(&dtd->pool); + declEntity->publicId = NULL; + declEntity->is_param = XML_TRUE; + /* if we have a parent parser or are reading an internal parameter + entity, then the entity declaration is not considered "internal" + */ + declEntity->is_internal = !(parentParser || openInternalEntities); + if (entityDeclHandler) + handleDefault = XML_FALSE; + } + } + else { + poolDiscard(&dtd->pool); + declEntity = NULL; + } +#else /* not XML_DTD */ + declEntity = NULL; +#endif /* XML_DTD */ + break; + case XML_ROLE_NOTATION_NAME: + declNotationPublicId = NULL; + declNotationName = NULL; + if (notationDeclHandler) { + declNotationName = poolStoreString(&tempPool, enc, s, next); + if (!declNotationName) + return XML_ERROR_NO_MEMORY; + poolFinish(&tempPool); + handleDefault = XML_FALSE; + } + break; + case XML_ROLE_NOTATION_PUBLIC_ID: + if (!XmlIsPublicId(enc, s, next, eventPP)) + return XML_ERROR_SYNTAX; + if (declNotationName) { /* means notationDeclHandler != NULL */ + XML_Char *tem = poolStoreString(&tempPool, + enc, + s + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (!tem) + return XML_ERROR_NO_MEMORY; + normalizePublicId(tem); + declNotationPublicId = tem; + poolFinish(&tempPool); + handleDefault = XML_FALSE; + } + break; + case XML_ROLE_NOTATION_SYSTEM_ID: + if (declNotationName && notationDeclHandler) { + const XML_Char *systemId + = poolStoreString(&tempPool, enc, + s + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (!systemId) + return XML_ERROR_NO_MEMORY; + *eventEndPP = s; + notationDeclHandler(handlerArg, + declNotationName, + curBase, + systemId, + declNotationPublicId); + handleDefault = XML_FALSE; + } + poolClear(&tempPool); + break; + case XML_ROLE_NOTATION_NO_SYSTEM_ID: + if (declNotationPublicId && notationDeclHandler) { + *eventEndPP = s; + notationDeclHandler(handlerArg, + declNotationName, + curBase, + 0, + declNotationPublicId); + handleDefault = XML_FALSE; + } + poolClear(&tempPool); + break; + case XML_ROLE_ERROR: + switch (tok) { + case XML_TOK_PARAM_ENTITY_REF: + return XML_ERROR_PARAM_ENTITY_REF; + case XML_TOK_XML_DECL: + return XML_ERROR_MISPLACED_XML_PI; + default: + return XML_ERROR_SYNTAX; + } +#ifdef XML_DTD + case XML_ROLE_IGNORE_SECT: + { + enum XML_Error result; + if (defaultHandler) + reportDefault(parser, enc, s, next); + handleDefault = XML_FALSE; + result = doIgnoreSection(parser, enc, &next, end, nextPtr); + if (!next) { + processor = ignoreSectionProcessor; + return result; + } + } + break; +#endif /* XML_DTD */ + case XML_ROLE_GROUP_OPEN: + if (prologState.level >= groupSize) { + if (groupSize) { + char *temp = (char *)REALLOC(groupConnector, groupSize *= 2); + if (temp == NULL) + return XML_ERROR_NO_MEMORY; + groupConnector = temp; + if (dtd->scaffIndex) { + int *temp = (int *)REALLOC(dtd->scaffIndex, + groupSize * sizeof(int)); + if (temp == NULL) + return XML_ERROR_NO_MEMORY; + dtd->scaffIndex = temp; + } + } + else { + groupConnector = (char *)MALLOC(groupSize = 32); + if (!groupConnector) + return XML_ERROR_NO_MEMORY; + } + } + groupConnector[prologState.level] = 0; + if (dtd->in_eldecl) { + int myindex = nextScaffoldPart(parser); + if (myindex < 0) + return XML_ERROR_NO_MEMORY; + dtd->scaffIndex[dtd->scaffLevel] = myindex; + dtd->scaffLevel++; + dtd->scaffold[myindex].type = XML_CTYPE_SEQ; + if (elementDeclHandler) + handleDefault = XML_FALSE; + } + break; + case XML_ROLE_GROUP_SEQUENCE: + if (groupConnector[prologState.level] == '|') + return XML_ERROR_SYNTAX; + groupConnector[prologState.level] = ','; + if (dtd->in_eldecl && elementDeclHandler) + handleDefault = XML_FALSE; + break; + case XML_ROLE_GROUP_CHOICE: + if (groupConnector[prologState.level] == ',') + return XML_ERROR_SYNTAX; + if (dtd->in_eldecl + && !groupConnector[prologState.level] + && (dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]].type + != XML_CTYPE_MIXED) + ) { + dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]].type + = XML_CTYPE_CHOICE; + if (elementDeclHandler) + handleDefault = XML_FALSE; + } + groupConnector[prologState.level] = '|'; + break; + case XML_ROLE_PARAM_ENTITY_REF: +#ifdef XML_DTD + case XML_ROLE_INNER_PARAM_ENTITY_REF: + /* PE references in internal subset are + not allowed within declarations */ + if (prologState.documentEntity && + role == XML_ROLE_INNER_PARAM_ENTITY_REF) + return XML_ERROR_PARAM_ENTITY_REF; + dtd->hasParamEntityRefs = XML_TRUE; + if (!paramEntityParsing) + dtd->keepProcessing = dtd->standalone; + else { + const XML_Char *name; + ENTITY *entity; + name = poolStoreString(&dtd->pool, enc, + s + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (!name) + return XML_ERROR_NO_MEMORY; + entity = (ENTITY *)lookup(&dtd->paramEntities, name, 0); + poolDiscard(&dtd->pool); + /* first, determine if a check for an existing declaration is needed; + if yes, check that the entity exists, and that it is internal, + otherwise call the skipped entity handler + */ + if (prologState.documentEntity && + (dtd->standalone + ? !openInternalEntities + : !dtd->hasParamEntityRefs)) { + if (!entity) + return XML_ERROR_UNDEFINED_ENTITY; + else if (!entity->is_internal) + return XML_ERROR_ENTITY_DECLARED_IN_PE; + } + else if (!entity) { + dtd->keepProcessing = dtd->standalone; + /* cannot report skipped entities in declarations */ + if ((role == XML_ROLE_PARAM_ENTITY_REF) && skippedEntityHandler) { + skippedEntityHandler(handlerArg, name, 1); + handleDefault = XML_FALSE; + } + break; + } + if (entity->open) + return XML_ERROR_RECURSIVE_ENTITY_REF; + if (entity->textPtr) { + enum XML_Error result; + result = processInternalParamEntity(parser, entity); + if (result != XML_ERROR_NONE) + return result; + handleDefault = XML_FALSE; + break; + } + if (externalEntityRefHandler) { + dtd->paramEntityRead = XML_FALSE; + entity->open = XML_TRUE; + if (!externalEntityRefHandler(externalEntityRefHandlerArg, + 0, + entity->base, + entity->systemId, + entity->publicId)) { + entity->open = XML_FALSE; + return XML_ERROR_EXTERNAL_ENTITY_HANDLING; + } + entity->open = XML_FALSE; + handleDefault = XML_FALSE; + if (!dtd->paramEntityRead) { + dtd->keepProcessing = dtd->standalone; + break; + } + } + else { + dtd->keepProcessing = dtd->standalone; + break; + } + } +#endif /* XML_DTD */ + if (!dtd->standalone && + notStandaloneHandler && + !notStandaloneHandler(handlerArg)) + return XML_ERROR_NOT_STANDALONE; + break; + + /* Element declaration stuff */ + + case XML_ROLE_ELEMENT_NAME: + if (elementDeclHandler) { + declElementType = getElementType(parser, enc, s, next); + if (!declElementType) + return XML_ERROR_NO_MEMORY; + dtd->scaffLevel = 0; + dtd->scaffCount = 0; + dtd->in_eldecl = XML_TRUE; + handleDefault = XML_FALSE; + } + break; + + case XML_ROLE_CONTENT_ANY: + case XML_ROLE_CONTENT_EMPTY: + if (dtd->in_eldecl) { + if (elementDeclHandler) { + XML_Content * content = (XML_Content *) MALLOC(sizeof(XML_Content)); + if (!content) + return XML_ERROR_NO_MEMORY; + content->quant = XML_CQUANT_NONE; + content->name = NULL; + content->numchildren = 0; + content->children = NULL; + content->type = ((role == XML_ROLE_CONTENT_ANY) ? + XML_CTYPE_ANY : + XML_CTYPE_EMPTY); + *eventEndPP = s; + elementDeclHandler(handlerArg, declElementType->name, content); + handleDefault = XML_FALSE; + } + dtd->in_eldecl = XML_FALSE; + } + break; + + case XML_ROLE_CONTENT_PCDATA: + if (dtd->in_eldecl) { + dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]].type + = XML_CTYPE_MIXED; + if (elementDeclHandler) + handleDefault = XML_FALSE; + } + break; + + case XML_ROLE_CONTENT_ELEMENT: + quant = XML_CQUANT_NONE; + goto elementContent; + case XML_ROLE_CONTENT_ELEMENT_OPT: + quant = XML_CQUANT_OPT; + goto elementContent; + case XML_ROLE_CONTENT_ELEMENT_REP: + quant = XML_CQUANT_REP; + goto elementContent; + case XML_ROLE_CONTENT_ELEMENT_PLUS: + quant = XML_CQUANT_PLUS; + elementContent: + if (dtd->in_eldecl) { + ELEMENT_TYPE *el; + const XML_Char *name; + int nameLen; + const char *nxt = (quant == XML_CQUANT_NONE + ? next + : next - enc->minBytesPerChar); + int myindex = nextScaffoldPart(parser); + if (myindex < 0) + return XML_ERROR_NO_MEMORY; + dtd->scaffold[myindex].type = XML_CTYPE_NAME; + dtd->scaffold[myindex].quant = quant; + el = getElementType(parser, enc, s, nxt); + if (!el) + return XML_ERROR_NO_MEMORY; + name = el->name; + dtd->scaffold[myindex].name = name; + nameLen = 0; + for (; name[nameLen++]; ); + dtd->contentStringLen += nameLen; + if (elementDeclHandler) + handleDefault = XML_FALSE; + } + break; + + case XML_ROLE_GROUP_CLOSE: + quant = XML_CQUANT_NONE; + goto closeGroup; + case XML_ROLE_GROUP_CLOSE_OPT: + quant = XML_CQUANT_OPT; + goto closeGroup; + case XML_ROLE_GROUP_CLOSE_REP: + quant = XML_CQUANT_REP; + goto closeGroup; + case XML_ROLE_GROUP_CLOSE_PLUS: + quant = XML_CQUANT_PLUS; + closeGroup: + if (dtd->in_eldecl) { + if (elementDeclHandler) + handleDefault = XML_FALSE; + dtd->scaffLevel--; + dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel]].quant = quant; + if (dtd->scaffLevel == 0) { + if (!handleDefault) { + XML_Content *model = build_model(parser); + if (!model) + return XML_ERROR_NO_MEMORY; + *eventEndPP = s; + elementDeclHandler(handlerArg, declElementType->name, model); + } + dtd->in_eldecl = XML_FALSE; + dtd->contentStringLen = 0; + } + } + break; + /* End element declaration stuff */ + + case XML_ROLE_PI: + if (!reportProcessingInstruction(parser, enc, s, next)) + return XML_ERROR_NO_MEMORY; + handleDefault = XML_FALSE; + break; + case XML_ROLE_COMMENT: + if (!reportComment(parser, enc, s, next)) + return XML_ERROR_NO_MEMORY; + handleDefault = XML_FALSE; + break; + case XML_ROLE_NONE: + switch (tok) { + case XML_TOK_BOM: + handleDefault = XML_FALSE; + break; + } + break; + case XML_ROLE_DOCTYPE_NONE: + if (startDoctypeDeclHandler) + handleDefault = XML_FALSE; + break; + case XML_ROLE_ENTITY_NONE: + if (dtd->keepProcessing && entityDeclHandler) + handleDefault = XML_FALSE; + break; + case XML_ROLE_NOTATION_NONE: + if (notationDeclHandler) + handleDefault = XML_FALSE; + break; + case XML_ROLE_ATTLIST_NONE: + if (dtd->keepProcessing && attlistDeclHandler) + handleDefault = XML_FALSE; + break; + case XML_ROLE_ELEMENT_NONE: + if (elementDeclHandler) + handleDefault = XML_FALSE; + break; + } /* end of big switch */ + + if (handleDefault && defaultHandler) + reportDefault(parser, enc, s, next); + + s = next; + tok = XmlPrologTok(enc, s, end, &next); + } + /* not reached */ +} + +static enum XML_Error PTRCALL +epilogProcessor(XML_Parser parser, + const char *s, + const char *end, + const char **nextPtr) +{ + processor = epilogProcessor; + eventPtr = s; + for (;;) { + const char *next = NULL; + int tok = XmlPrologTok(encoding, s, end, &next); + eventEndPtr = next; + switch (tok) { + /* report partial linebreak - it might be the last token */ + case -XML_TOK_PROLOG_S: + if (defaultHandler) { + eventEndPtr = next; + reportDefault(parser, encoding, s, next); + } + if (nextPtr) + *nextPtr = next; + return XML_ERROR_NONE; + case XML_TOK_NONE: + if (nextPtr) + *nextPtr = s; + return XML_ERROR_NONE; + case XML_TOK_PROLOG_S: + if (defaultHandler) + reportDefault(parser, encoding, s, next); + break; + case XML_TOK_PI: + if (!reportProcessingInstruction(parser, encoding, s, next)) + return XML_ERROR_NO_MEMORY; + break; + case XML_TOK_COMMENT: + if (!reportComment(parser, encoding, s, next)) + return XML_ERROR_NO_MEMORY; + break; + case XML_TOK_INVALID: + eventPtr = next; + return XML_ERROR_INVALID_TOKEN; + case XML_TOK_PARTIAL: + if (nextPtr) { + *nextPtr = s; + return XML_ERROR_NONE; + } + return XML_ERROR_UNCLOSED_TOKEN; + case XML_TOK_PARTIAL_CHAR: + if (nextPtr) { + *nextPtr = s; + return XML_ERROR_NONE; + } + return XML_ERROR_PARTIAL_CHAR; + default: + return XML_ERROR_JUNK_AFTER_DOC_ELEMENT; + } + eventPtr = s = next; + } +} + +#ifdef XML_DTD + +static enum XML_Error +processInternalParamEntity(XML_Parser parser, ENTITY *entity) +{ + const char *s, *end, *next; + int tok; + enum XML_Error result; + OPEN_INTERNAL_ENTITY openEntity; + entity->open = XML_TRUE; + openEntity.next = openInternalEntities; + openInternalEntities = &openEntity; + openEntity.entity = entity; + openEntity.internalEventPtr = NULL; + openEntity.internalEventEndPtr = NULL; + s = (char *)entity->textPtr; + end = (char *)(entity->textPtr + entity->textLen); + tok = XmlPrologTok(internalEncoding, s, end, &next); + result = doProlog(parser, internalEncoding, s, end, tok, next, 0); + entity->open = XML_FALSE; + openInternalEntities = openEntity.next; + return result; +} + +#endif /* XML_DTD */ + +static enum XML_Error PTRCALL +errorProcessor(XML_Parser parser, + const char *s, + const char *end, + const char **nextPtr) +{ + return errorCode; +} + +static enum XML_Error +storeAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata, + const char *ptr, const char *end, + STRING_POOL *pool) +{ + enum XML_Error result = appendAttributeValue(parser, enc, isCdata, ptr, + end, pool); + if (result) + return result; + if (!isCdata && poolLength(pool) && poolLastChar(pool) == 0x20) + poolChop(pool); + if (!poolAppendChar(pool, XML_T('\0'))) + return XML_ERROR_NO_MEMORY; + return XML_ERROR_NONE; +} + +static enum XML_Error +appendAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata, + const char *ptr, const char *end, + STRING_POOL *pool) +{ + DTD * const dtd = _dtd; /* save one level of indirection */ + for (;;) { + const char *next; + int tok = XmlAttributeValueTok(enc, ptr, end, &next); + switch (tok) { + case XML_TOK_NONE: + return XML_ERROR_NONE; + case XML_TOK_INVALID: + if (enc == encoding) + eventPtr = next; + return XML_ERROR_INVALID_TOKEN; + case XML_TOK_PARTIAL: + if (enc == encoding) + eventPtr = ptr; + return XML_ERROR_INVALID_TOKEN; + case XML_TOK_CHAR_REF: + { + XML_Char buf[XML_ENCODE_MAX]; + int i; + int n = XmlCharRefNumber(enc, ptr); + if (n < 0) { + if (enc == encoding) + eventPtr = ptr; + return XML_ERROR_BAD_CHAR_REF; + } + if (!isCdata + && n == 0x20 /* space */ + && (poolLength(pool) == 0 || poolLastChar(pool) == 0x20)) + break; + n = XmlEncode(n, (ICHAR *)buf); + if (!n) { + if (enc == encoding) + eventPtr = ptr; + return XML_ERROR_BAD_CHAR_REF; + } + for (i = 0; i < n; i++) { + if (!poolAppendChar(pool, buf[i])) + return XML_ERROR_NO_MEMORY; + } + } + break; + case XML_TOK_DATA_CHARS: + if (!poolAppend(pool, enc, ptr, next)) + return XML_ERROR_NO_MEMORY; + break; + case XML_TOK_TRAILING_CR: + next = ptr + enc->minBytesPerChar; + /* fall through */ + case XML_TOK_ATTRIBUTE_VALUE_S: + case XML_TOK_DATA_NEWLINE: + if (!isCdata && (poolLength(pool) == 0 || poolLastChar(pool) == 0x20)) + break; + if (!poolAppendChar(pool, 0x20)) + return XML_ERROR_NO_MEMORY; + break; + case XML_TOK_ENTITY_REF: + { + const XML_Char *name; + ENTITY *entity; + char checkEntityDecl; + XML_Char ch = (XML_Char) XmlPredefinedEntityName(enc, + ptr + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (ch) { + if (!poolAppendChar(pool, ch)) + return XML_ERROR_NO_MEMORY; + break; + } + name = poolStoreString(&temp2Pool, enc, + ptr + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (!name) + return XML_ERROR_NO_MEMORY; + entity = (ENTITY *)lookup(&dtd->generalEntities, name, 0); + poolDiscard(&temp2Pool); + /* first, determine if a check for an existing declaration is needed; + if yes, check that the entity exists, and that it is internal, + otherwise call the default handler (if called from content) + */ + if (pool == &dtd->pool) /* are we called from prolog? */ + checkEntityDecl = +#ifdef XML_DTD + prologState.documentEntity && +#endif /* XML_DTD */ + (dtd->standalone + ? !openInternalEntities + : !dtd->hasParamEntityRefs); + else /* if (pool == &tempPool): we are called from content */ + checkEntityDecl = !dtd->hasParamEntityRefs || dtd->standalone; + if (checkEntityDecl) { + if (!entity) + return XML_ERROR_UNDEFINED_ENTITY; + else if (!entity->is_internal) + return XML_ERROR_ENTITY_DECLARED_IN_PE; + } + else if (!entity) { + /* cannot report skipped entity here - see comments on + skippedEntityHandler + if (skippedEntityHandler) + skippedEntityHandler(handlerArg, name, 0); + */ + if ((pool == &tempPool) && defaultHandler) + reportDefault(parser, enc, ptr, next); + break; + } + if (entity->open) { + if (enc == encoding) + eventPtr = ptr; + return XML_ERROR_RECURSIVE_ENTITY_REF; + } + if (entity->notation) { + if (enc == encoding) + eventPtr = ptr; + return XML_ERROR_BINARY_ENTITY_REF; + } + if (!entity->textPtr) { + if (enc == encoding) + eventPtr = ptr; + return XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF; + } + else { + enum XML_Error result; + const XML_Char *textEnd = entity->textPtr + entity->textLen; + entity->open = XML_TRUE; + result = appendAttributeValue(parser, internalEncoding, isCdata, + (char *)entity->textPtr, + (char *)textEnd, pool); + entity->open = XML_FALSE; + if (result) + return result; + } + } + break; + default: + if (enc == encoding) + eventPtr = ptr; + return XML_ERROR_UNEXPECTED_STATE; + } + ptr = next; + } + /* not reached */ +} + +static enum XML_Error +storeEntityValue(XML_Parser parser, + const ENCODING *enc, + const char *entityTextPtr, + const char *entityTextEnd) +{ + DTD * const dtd = _dtd; /* save one level of indirection */ + STRING_POOL *pool = &(dtd->entityValuePool); + enum XML_Error result = XML_ERROR_NONE; +#ifdef XML_DTD + int oldInEntityValue = prologState.inEntityValue; + prologState.inEntityValue = 1; +#endif /* XML_DTD */ + /* never return Null for the value argument in EntityDeclHandler, + since this would indicate an external entity; therefore we + have to make sure that entityValuePool.start is not null */ + if (!pool->blocks) { + if (!poolGrow(pool)) + return XML_ERROR_NO_MEMORY; + } + + for (;;) { + const char *next; + int tok = XmlEntityValueTok(enc, entityTextPtr, entityTextEnd, &next); + switch (tok) { + case XML_TOK_PARAM_ENTITY_REF: +#ifdef XML_DTD + if (isParamEntity || enc != encoding) { + const XML_Char *name; + ENTITY *entity; + name = poolStoreString(&tempPool, enc, + entityTextPtr + enc->minBytesPerChar, + next - enc->minBytesPerChar); + if (!name) { + result = XML_ERROR_NO_MEMORY; + goto endEntityValue; + } + entity = (ENTITY *)lookup(&dtd->paramEntities, name, 0); + poolDiscard(&tempPool); + if (!entity) { + /* not a well-formedness error - see XML 1.0: WFC Entity Declared */ + /* cannot report skipped entity here - see comments on + skippedEntityHandler + if (skippedEntityHandler) + skippedEntityHandler(handlerArg, name, 0); + */ + dtd->keepProcessing = dtd->standalone; + goto endEntityValue; + } + if (entity->open) { + if (enc == encoding) + eventPtr = entityTextPtr; + result = XML_ERROR_RECURSIVE_ENTITY_REF; + goto endEntityValue; + } + if (entity->systemId) { + if (externalEntityRefHandler) { + dtd->paramEntityRead = XML_FALSE; + entity->open = XML_TRUE; + if (!externalEntityRefHandler(externalEntityRefHandlerArg, + 0, + entity->base, + entity->systemId, + entity->publicId)) { + entity->open = XML_FALSE; + result = XML_ERROR_EXTERNAL_ENTITY_HANDLING; + goto endEntityValue; + } + entity->open = XML_FALSE; + if (!dtd->paramEntityRead) + dtd->keepProcessing = dtd->standalone; + } + else + dtd->keepProcessing = dtd->standalone; + } + else { + entity->open = XML_TRUE; + result = storeEntityValue(parser, + internalEncoding, + (char *)entity->textPtr, + (char *)(entity->textPtr + + entity->textLen)); + entity->open = XML_FALSE; + if (result) + goto endEntityValue; + } + break; + } +#endif /* XML_DTD */ + /* in the internal subset, PE references are not legal + within markup declarations, e.g entity values in this case */ + eventPtr = entityTextPtr; + result = XML_ERROR_PARAM_ENTITY_REF; + goto endEntityValue; + case XML_TOK_NONE: + result = XML_ERROR_NONE; + goto endEntityValue; + case XML_TOK_ENTITY_REF: + case XML_TOK_DATA_CHARS: + if (!poolAppend(pool, enc, entityTextPtr, next)) { + result = XML_ERROR_NO_MEMORY; + goto endEntityValue; + } + break; + case XML_TOK_TRAILING_CR: + next = entityTextPtr + enc->minBytesPerChar; + /* fall through */ + case XML_TOK_DATA_NEWLINE: + if (pool->end == pool->ptr && !poolGrow(pool)) { + result = XML_ERROR_NO_MEMORY; + goto endEntityValue; + } + *(pool->ptr)++ = 0xA; + break; + case XML_TOK_CHAR_REF: + { + XML_Char buf[XML_ENCODE_MAX]; + int i; + int n = XmlCharRefNumber(enc, entityTextPtr); + if (n < 0) { + if (enc == encoding) + eventPtr = entityTextPtr; + result = XML_ERROR_BAD_CHAR_REF; + goto endEntityValue; + } + n = XmlEncode(n, (ICHAR *)buf); + if (!n) { + if (enc == encoding) + eventPtr = entityTextPtr; + result = XML_ERROR_BAD_CHAR_REF; + goto endEntityValue; + } + for (i = 0; i < n; i++) { + if (pool->end == pool->ptr && !poolGrow(pool)) { + result = XML_ERROR_NO_MEMORY; + goto endEntityValue; + } + *(pool->ptr)++ = buf[i]; + } + } + break; + case XML_TOK_PARTIAL: + if (enc == encoding) + eventPtr = entityTextPtr; + result = XML_ERROR_INVALID_TOKEN; + goto endEntityValue; + case XML_TOK_INVALID: + if (enc == encoding) + eventPtr = next; + result = XML_ERROR_INVALID_TOKEN; + goto endEntityValue; + default: + if (enc == encoding) + eventPtr = entityTextPtr; + result = XML_ERROR_UNEXPECTED_STATE; + goto endEntityValue; + } + entityTextPtr = next; + } +endEntityValue: +#ifdef XML_DTD + prologState.inEntityValue = oldInEntityValue; +#endif /* XML_DTD */ + return result; +} + +static void FASTCALL +normalizeLines(XML_Char *s) +{ + XML_Char *p; + for (;; s++) { + if (*s == XML_T('\0')) + return; + if (*s == 0xD) + break; + } + p = s; + do { + if (*s == 0xD) { + *p++ = 0xA; + if (*++s == 0xA) + s++; + } + else + *p++ = *s++; + } while (*s); + *p = XML_T('\0'); +} + +static int +reportProcessingInstruction(XML_Parser parser, const ENCODING *enc, + const char *start, const char *end) +{ + const XML_Char *target; + XML_Char *data; + const char *tem; + if (!processingInstructionHandler) { + if (defaultHandler) + reportDefault(parser, enc, start, end); + return 1; + } + start += enc->minBytesPerChar * 2; + tem = start + XmlNameLength(enc, start); + target = poolStoreString(&tempPool, enc, start, tem); + if (!target) + return 0; + poolFinish(&tempPool); + data = poolStoreString(&tempPool, enc, + XmlSkipS(enc, tem), + end - enc->minBytesPerChar*2); + if (!data) + return 0; + normalizeLines(data); + processingInstructionHandler(handlerArg, target, data); + poolClear(&tempPool); + return 1; +} + +static int +reportComment(XML_Parser parser, const ENCODING *enc, + const char *start, const char *end) +{ + XML_Char *data; + if (!commentHandler) { + if (defaultHandler) + reportDefault(parser, enc, start, end); + return 1; + } + data = poolStoreString(&tempPool, + enc, + start + enc->minBytesPerChar * 4, + end - enc->minBytesPerChar * 3); + if (!data) + return 0; + normalizeLines(data); + commentHandler(handlerArg, data); + poolClear(&tempPool); + return 1; +} + +static void +reportDefault(XML_Parser parser, const ENCODING *enc, + const char *s, const char *end) +{ + if (MUST_CONVERT(enc, s)) { + const char **eventPP; + const char **eventEndPP; + if (enc == encoding) { + eventPP = &eventPtr; + eventEndPP = &eventEndPtr; + } + else { + eventPP = &(openInternalEntities->internalEventPtr); + eventEndPP = &(openInternalEntities->internalEventEndPtr); + } + do { + ICHAR *dataPtr = (ICHAR *)dataBuf; + XmlConvert(enc, &s, end, &dataPtr, (ICHAR *)dataBufEnd); + *eventEndPP = s; + defaultHandler(handlerArg, dataBuf, dataPtr - (ICHAR *)dataBuf); + *eventPP = s; + } while (s != end); + } + else + defaultHandler(handlerArg, (XML_Char *)s, (XML_Char *)end - (XML_Char *)s); +} + + +static int +defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *attId, XML_Bool isCdata, + XML_Bool isId, const XML_Char *value, XML_Parser parser) +{ + DEFAULT_ATTRIBUTE *att; + if (value || isId) { + /* The handling of default attributes gets messed up if we have + a default which duplicates a non-default. */ + int i; + for (i = 0; i < type->nDefaultAtts; i++) + if (attId == type->defaultAtts[i].id) + return 1; + if (isId && !type->idAtt && !attId->xmlns) + type->idAtt = attId; + } + if (type->nDefaultAtts == type->allocDefaultAtts) { + if (type->allocDefaultAtts == 0) { + type->allocDefaultAtts = 8; + type->defaultAtts = (DEFAULT_ATTRIBUTE *)MALLOC(type->allocDefaultAtts + * sizeof(DEFAULT_ATTRIBUTE)); + if (!type->defaultAtts) + return 0; + } + else { + DEFAULT_ATTRIBUTE *temp; + int count = type->allocDefaultAtts * 2; + temp = (DEFAULT_ATTRIBUTE *) + REALLOC(type->defaultAtts, (count * sizeof(DEFAULT_ATTRIBUTE))); + if (temp == NULL) + return 0; + type->allocDefaultAtts = count; + type->defaultAtts = temp; + } + } + att = type->defaultAtts + type->nDefaultAtts; + att->id = attId; + att->value = value; + att->isCdata = isCdata; + if (!isCdata) + attId->maybeTokenized = XML_TRUE; + type->nDefaultAtts += 1; + return 1; +} + +static int +setElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *elementType) +{ + DTD * const dtd = _dtd; /* save one level of indirection */ + const XML_Char *name; + for (name = elementType->name; *name; name++) { + if (*name == XML_T(':')) { + PREFIX *prefix; + const XML_Char *s; + for (s = elementType->name; s != name; s++) { + if (!poolAppendChar(&dtd->pool, *s)) + return 0; + } + if (!poolAppendChar(&dtd->pool, XML_T('\0'))) + return 0; + prefix = (PREFIX *)lookup(&dtd->prefixes, poolStart(&dtd->pool), + sizeof(PREFIX)); + if (!prefix) + return 0; + if (prefix->name == poolStart(&dtd->pool)) + poolFinish(&dtd->pool); + else + poolDiscard(&dtd->pool); + elementType->prefix = prefix; + + } + } + return 1; +} + +static ATTRIBUTE_ID * +getAttributeId(XML_Parser parser, const ENCODING *enc, + const char *start, const char *end) +{ + DTD * const dtd = _dtd; /* save one level of indirection */ + ATTRIBUTE_ID *id; + const XML_Char *name; + if (!poolAppendChar(&dtd->pool, XML_T('\0'))) + return NULL; + name = poolStoreString(&dtd->pool, enc, start, end); + if (!name) + return NULL; + /* skip quotation mark - its storage will be re-used (like in name[-1]) */ + ++name; + id = (ATTRIBUTE_ID *)lookup(&dtd->attributeIds, name, sizeof(ATTRIBUTE_ID)); + if (!id) + return NULL; + if (id->name != name) + poolDiscard(&dtd->pool); + else { + poolFinish(&dtd->pool); + if (!ns) + ; + else if (name[0] == XML_T('x') + && name[1] == XML_T('m') + && name[2] == XML_T('l') + && name[3] == XML_T('n') + && name[4] == XML_T('s') + && (name[5] == XML_T('\0') || name[5] == XML_T(':'))) { + if (name[5] == XML_T('\0')) + id->prefix = &dtd->defaultPrefix; + else + id->prefix = (PREFIX *)lookup(&dtd->prefixes, name + 6, sizeof(PREFIX)); + id->xmlns = XML_TRUE; + } + else { + int i; + for (i = 0; name[i]; i++) { + /* attributes without prefix are *not* in the default namespace */ + if (name[i] == XML_T(':')) { + int j; + for (j = 0; j < i; j++) { + if (!poolAppendChar(&dtd->pool, name[j])) + return NULL; + } + if (!poolAppendChar(&dtd->pool, XML_T('\0'))) + return NULL; + id->prefix = (PREFIX *)lookup(&dtd->prefixes, poolStart(&dtd->pool), + sizeof(PREFIX)); + if (id->prefix->name == poolStart(&dtd->pool)) + poolFinish(&dtd->pool); + else + poolDiscard(&dtd->pool); + break; + } + } + } + } + return id; +} + +#define CONTEXT_SEP XML_T('\f') + +static const XML_Char * +getContext(XML_Parser parser) +{ + DTD * const dtd = _dtd; /* save one level of indirection */ + HASH_TABLE_ITER iter; + XML_Bool needSep = XML_FALSE; + + if (dtd->defaultPrefix.binding) { + int i; + int len; + if (!poolAppendChar(&tempPool, XML_T('='))) + return NULL; + len = dtd->defaultPrefix.binding->uriLen; + if (namespaceSeparator != XML_T('\0')) + len--; + for (i = 0; i < len; i++) + if (!poolAppendChar(&tempPool, dtd->defaultPrefix.binding->uri[i])) + return NULL; + needSep = XML_TRUE; + } + + hashTableIterInit(&iter, &(dtd->prefixes)); + for (;;) { + int i; + int len; + const XML_Char *s; + PREFIX *prefix = (PREFIX *)hashTableIterNext(&iter); + if (!prefix) + break; + if (!prefix->binding) + continue; + if (needSep && !poolAppendChar(&tempPool, CONTEXT_SEP)) + return NULL; + for (s = prefix->name; *s; s++) + if (!poolAppendChar(&tempPool, *s)) + return NULL; + if (!poolAppendChar(&tempPool, XML_T('='))) + return NULL; + len = prefix->binding->uriLen; + if (namespaceSeparator != XML_T('\0')) + len--; + for (i = 0; i < len; i++) + if (!poolAppendChar(&tempPool, prefix->binding->uri[i])) + return NULL; + needSep = XML_TRUE; + } + + + hashTableIterInit(&iter, &(dtd->generalEntities)); + for (;;) { + const XML_Char *s; + ENTITY *e = (ENTITY *)hashTableIterNext(&iter); + if (!e) + break; + if (!e->open) + continue; + if (needSep && !poolAppendChar(&tempPool, CONTEXT_SEP)) + return NULL; + for (s = e->name; *s; s++) + if (!poolAppendChar(&tempPool, *s)) + return 0; + needSep = XML_TRUE; + } + + if (!poolAppendChar(&tempPool, XML_T('\0'))) + return NULL; + return tempPool.start; +} + +static XML_Bool +setContext(XML_Parser parser, const XML_Char *context) +{ + DTD * const dtd = _dtd; /* save one level of indirection */ + const XML_Char *s = context; + + while (*context != XML_T('\0')) { + if (*s == CONTEXT_SEP || *s == XML_T('\0')) { + ENTITY *e; + if (!poolAppendChar(&tempPool, XML_T('\0'))) + return XML_FALSE; + e = (ENTITY *)lookup(&dtd->generalEntities, poolStart(&tempPool), 0); + if (e) + e->open = XML_TRUE; + if (*s != XML_T('\0')) + s++; + context = s; + poolDiscard(&tempPool); + } + else if (*s == XML_T('=')) { + PREFIX *prefix; + if (poolLength(&tempPool) == 0) + prefix = &dtd->defaultPrefix; + else { + if (!poolAppendChar(&tempPool, XML_T('\0'))) + return XML_FALSE; + prefix = (PREFIX *)lookup(&dtd->prefixes, poolStart(&tempPool), + sizeof(PREFIX)); + if (!prefix) + return XML_FALSE; + if (prefix->name == poolStart(&tempPool)) { + prefix->name = poolCopyString(&dtd->pool, prefix->name); + if (!prefix->name) + return XML_FALSE; + } + poolDiscard(&tempPool); + } + for (context = s + 1; + *context != CONTEXT_SEP && *context != XML_T('\0'); + context++) + if (!poolAppendChar(&tempPool, *context)) + return XML_FALSE; + if (!poolAppendChar(&tempPool, XML_T('\0'))) + return XML_FALSE; + if (addBinding(parser, prefix, 0, poolStart(&tempPool), + &inheritedBindings) != XML_ERROR_NONE) + return XML_FALSE; + poolDiscard(&tempPool); + if (*context != XML_T('\0')) + ++context; + s = context; + } + else { + if (!poolAppendChar(&tempPool, *s)) + return XML_FALSE; + s++; + } + } + return XML_TRUE; +} + +static void FASTCALL +normalizePublicId(XML_Char *publicId) +{ + XML_Char *p = publicId; + XML_Char *s; + for (s = publicId; *s; s++) { + switch (*s) { + case 0x20: + case 0xD: + case 0xA: + if (p != publicId && p[-1] != 0x20) + *p++ = 0x20; + break; + default: + *p++ = *s; + } + } + if (p != publicId && p[-1] == 0x20) + --p; + *p = XML_T('\0'); +} + +static DTD * +dtdCreate(const XML_Memory_Handling_Suite *ms) +{ + DTD *p = (DTD *)ms->malloc_fcn(sizeof(DTD)); + if (p == NULL) + return p; + poolInit(&(p->pool), ms); +#ifdef XML_DTD + poolInit(&(p->entityValuePool), ms); +#endif /* XML_DTD */ + hashTableInit(&(p->generalEntities), ms); + hashTableInit(&(p->elementTypes), ms); + hashTableInit(&(p->attributeIds), ms); + hashTableInit(&(p->prefixes), ms); +#ifdef XML_DTD + p->paramEntityRead = XML_FALSE; + hashTableInit(&(p->paramEntities), ms); +#endif /* XML_DTD */ + p->defaultPrefix.name = NULL; + p->defaultPrefix.binding = NULL; + + p->in_eldecl = XML_FALSE; + p->scaffIndex = NULL; + p->scaffold = NULL; + p->scaffLevel = 0; + p->scaffSize = 0; + p->scaffCount = 0; + p->contentStringLen = 0; + + p->keepProcessing = XML_TRUE; + p->hasParamEntityRefs = XML_FALSE; + p->standalone = XML_FALSE; + return p; +} + +static void +dtdReset(DTD *p, const XML_Memory_Handling_Suite *ms) +{ + HASH_TABLE_ITER iter; + hashTableIterInit(&iter, &(p->elementTypes)); + for (;;) { + ELEMENT_TYPE *e = (ELEMENT_TYPE *)hashTableIterNext(&iter); + if (!e) + break; + if (e->allocDefaultAtts != 0) + ms->free_fcn(e->defaultAtts); + } + hashTableClear(&(p->generalEntities)); +#ifdef XML_DTD + p->paramEntityRead = XML_FALSE; + hashTableClear(&(p->paramEntities)); +#endif /* XML_DTD */ + hashTableClear(&(p->elementTypes)); + hashTableClear(&(p->attributeIds)); + hashTableClear(&(p->prefixes)); + poolClear(&(p->pool)); +#ifdef XML_DTD + poolClear(&(p->entityValuePool)); +#endif /* XML_DTD */ + p->defaultPrefix.name = NULL; + p->defaultPrefix.binding = NULL; + + p->in_eldecl = XML_FALSE; + + ms->free_fcn(p->scaffIndex); + p->scaffIndex = NULL; + ms->free_fcn(p->scaffold); + p->scaffold = NULL; + + p->scaffLevel = 0; + p->scaffSize = 0; + p->scaffCount = 0; + p->contentStringLen = 0; + + p->keepProcessing = XML_TRUE; + p->hasParamEntityRefs = XML_FALSE; + p->standalone = XML_FALSE; +} + +static void +dtdDestroy(DTD *p, XML_Bool isDocEntity, const XML_Memory_Handling_Suite *ms) +{ + HASH_TABLE_ITER iter; + hashTableIterInit(&iter, &(p->elementTypes)); + for (;;) { + ELEMENT_TYPE *e = (ELEMENT_TYPE *)hashTableIterNext(&iter); + if (!e) + break; + if (e->allocDefaultAtts != 0) + ms->free_fcn(e->defaultAtts); + } + hashTableDestroy(&(p->generalEntities)); +#ifdef XML_DTD + hashTableDestroy(&(p->paramEntities)); +#endif /* XML_DTD */ + hashTableDestroy(&(p->elementTypes)); + hashTableDestroy(&(p->attributeIds)); + hashTableDestroy(&(p->prefixes)); + poolDestroy(&(p->pool)); +#ifdef XML_DTD + poolDestroy(&(p->entityValuePool)); +#endif /* XML_DTD */ + if (isDocEntity) { + ms->free_fcn(p->scaffIndex); + ms->free_fcn(p->scaffold); + } + ms->free_fcn(p); +} + +/* Do a deep copy of the DTD. Return 0 for out of memory, non-zero otherwise. + The new DTD has already been initialized. +*/ +static int +dtdCopy(DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms) +{ + HASH_TABLE_ITER iter; + + /* Copy the prefix table. */ + + hashTableIterInit(&iter, &(oldDtd->prefixes)); + for (;;) { + const XML_Char *name; + const PREFIX *oldP = (PREFIX *)hashTableIterNext(&iter); + if (!oldP) + break; + name = poolCopyString(&(newDtd->pool), oldP->name); + if (!name) + return 0; + if (!lookup(&(newDtd->prefixes), name, sizeof(PREFIX))) + return 0; + } + + hashTableIterInit(&iter, &(oldDtd->attributeIds)); + + /* Copy the attribute id table. */ + + for (;;) { + ATTRIBUTE_ID *newA; + const XML_Char *name; + const ATTRIBUTE_ID *oldA = (ATTRIBUTE_ID *)hashTableIterNext(&iter); + + if (!oldA) + break; + /* Remember to allocate the scratch byte before the name. */ + if (!poolAppendChar(&(newDtd->pool), XML_T('\0'))) + return 0; + name = poolCopyString(&(newDtd->pool), oldA->name); + if (!name) + return 0; + ++name; + newA = (ATTRIBUTE_ID *)lookup(&(newDtd->attributeIds), name, + sizeof(ATTRIBUTE_ID)); + if (!newA) + return 0; + newA->maybeTokenized = oldA->maybeTokenized; + if (oldA->prefix) { + newA->xmlns = oldA->xmlns; + if (oldA->prefix == &oldDtd->defaultPrefix) + newA->prefix = &newDtd->defaultPrefix; + else + newA->prefix = (PREFIX *)lookup(&(newDtd->prefixes), + oldA->prefix->name, 0); + } + } + + /* Copy the element type table. */ + + hashTableIterInit(&iter, &(oldDtd->elementTypes)); + + for (;;) { + int i; + ELEMENT_TYPE *newE; + const XML_Char *name; + const ELEMENT_TYPE *oldE = (ELEMENT_TYPE *)hashTableIterNext(&iter); + if (!oldE) + break; + name = poolCopyString(&(newDtd->pool), oldE->name); + if (!name) + return 0; + newE = (ELEMENT_TYPE *)lookup(&(newDtd->elementTypes), name, + sizeof(ELEMENT_TYPE)); + if (!newE) + return 0; + if (oldE->nDefaultAtts) { + newE->defaultAtts = (DEFAULT_ATTRIBUTE *) + ms->malloc_fcn(oldE->nDefaultAtts * sizeof(DEFAULT_ATTRIBUTE)); + if (!newE->defaultAtts) { + ms->free_fcn(newE); + return 0; + } + } + if (oldE->idAtt) + newE->idAtt = (ATTRIBUTE_ID *) + lookup(&(newDtd->attributeIds), oldE->idAtt->name, 0); + newE->allocDefaultAtts = newE->nDefaultAtts = oldE->nDefaultAtts; + if (oldE->prefix) + newE->prefix = (PREFIX *)lookup(&(newDtd->prefixes), + oldE->prefix->name, 0); + for (i = 0; i < newE->nDefaultAtts; i++) { + newE->defaultAtts[i].id = (ATTRIBUTE_ID *) + lookup(&(newDtd->attributeIds), oldE->defaultAtts[i].id->name, 0); + newE->defaultAtts[i].isCdata = oldE->defaultAtts[i].isCdata; + if (oldE->defaultAtts[i].value) { + newE->defaultAtts[i].value + = poolCopyString(&(newDtd->pool), oldE->defaultAtts[i].value); + if (!newE->defaultAtts[i].value) + return 0; + } + else + newE->defaultAtts[i].value = NULL; + } + } + + /* Copy the entity tables. */ + if (!copyEntityTable(&(newDtd->generalEntities), + &(newDtd->pool), + &(oldDtd->generalEntities))) + return 0; + +#ifdef XML_DTD + if (!copyEntityTable(&(newDtd->paramEntities), + &(newDtd->pool), + &(oldDtd->paramEntities))) + return 0; + newDtd->paramEntityRead = oldDtd->paramEntityRead; +#endif /* XML_DTD */ + + newDtd->keepProcessing = oldDtd->keepProcessing; + newDtd->hasParamEntityRefs = oldDtd->hasParamEntityRefs; + newDtd->standalone = oldDtd->standalone; + + /* Don't want deep copying for scaffolding */ + newDtd->in_eldecl = oldDtd->in_eldecl; + newDtd->scaffold = oldDtd->scaffold; + newDtd->contentStringLen = oldDtd->contentStringLen; + newDtd->scaffSize = oldDtd->scaffSize; + newDtd->scaffLevel = oldDtd->scaffLevel; + newDtd->scaffIndex = oldDtd->scaffIndex; + + return 1; +} /* End dtdCopy */ + +static int +copyEntityTable(HASH_TABLE *newTable, + STRING_POOL *newPool, + const HASH_TABLE *oldTable) +{ + HASH_TABLE_ITER iter; + const XML_Char *cachedOldBase = NULL; + const XML_Char *cachedNewBase = NULL; + + hashTableIterInit(&iter, oldTable); + + for (;;) { + ENTITY *newE; + const XML_Char *name; + const ENTITY *oldE = (ENTITY *)hashTableIterNext(&iter); + if (!oldE) + break; + name = poolCopyString(newPool, oldE->name); + if (!name) + return 0; + newE = (ENTITY *)lookup(newTable, name, sizeof(ENTITY)); + if (!newE) + return 0; + if (oldE->systemId) { + const XML_Char *tem = poolCopyString(newPool, oldE->systemId); + if (!tem) + return 0; + newE->systemId = tem; + if (oldE->base) { + if (oldE->base == cachedOldBase) + newE->base = cachedNewBase; + else { + cachedOldBase = oldE->base; + tem = poolCopyString(newPool, cachedOldBase); + if (!tem) + return 0; + cachedNewBase = newE->base = tem; + } + } + if (oldE->publicId) { + tem = poolCopyString(newPool, oldE->publicId); + if (!tem) + return 0; + newE->publicId = tem; + } + } + else { + const XML_Char *tem = poolCopyStringN(newPool, oldE->textPtr, + oldE->textLen); + if (!tem) + return 0; + newE->textPtr = tem; + newE->textLen = oldE->textLen; + } + if (oldE->notation) { + const XML_Char *tem = poolCopyString(newPool, oldE->notation); + if (!tem) + return 0; + newE->notation = tem; + } + newE->is_param = oldE->is_param; + newE->is_internal = oldE->is_internal; + } + return 1; +} + +#define INIT_POWER 6 + +static XML_Bool FASTCALL +keyeq(KEY s1, KEY s2) +{ + for (; *s1 == *s2; s1++, s2++) + if (*s1 == 0) + return XML_TRUE; + return XML_FALSE; +} + +static unsigned long FASTCALL +hash(KEY s) +{ + unsigned long h = 0; + while (*s) + h = CHAR_HASH(h, *s++); + return h; +} + +static NAMED * +lookup(HASH_TABLE *table, KEY name, size_t createSize) +{ + size_t i; + if (table->size == 0) { + size_t tsize; + if (!createSize) + return NULL; + table->power = INIT_POWER; + /* table->size is a power of 2 */ + table->size = (size_t)1 << INIT_POWER; + tsize = table->size * sizeof(NAMED *); + table->v = (NAMED **)table->mem->malloc_fcn(tsize); + if (!table->v) + return NULL; + memset(table->v, 0, tsize); + i = hash(name) & ((unsigned long)table->size - 1); + } + else { + unsigned long h = hash(name); + unsigned long mask = (unsigned long)table->size - 1; + unsigned char step = 0; + i = h & mask; + while (table->v[i]) { + if (keyeq(name, table->v[i]->name)) + return table->v[i]; + if (!step) + step = PROBE_STEP(h, mask, table->power); + i < step ? (i += table->size - step) : (i -= step); + } + if (!createSize) + return NULL; + + /* check for overflow (table is half full) */ + if (table->used >> (table->power - 1)) { + unsigned char newPower = table->power + 1; + size_t newSize = (size_t)1 << newPower; + unsigned long newMask = (unsigned long)newSize - 1; + size_t tsize = newSize * sizeof(NAMED *); + NAMED **newV = (NAMED **)table->mem->malloc_fcn(tsize); + if (!newV) + return NULL; + memset(newV, 0, tsize); + for (i = 0; i < table->size; i++) + if (table->v[i]) { + unsigned long newHash = hash(table->v[i]->name); + size_t j = newHash & newMask; + step = 0; + while (newV[j]) { + if (!step) + step = PROBE_STEP(newHash, newMask, newPower); + j < step ? (j += newSize - step) : (j -= step); + } + newV[j] = table->v[i]; + } + table->mem->free_fcn(table->v); + table->v = newV; + table->power = newPower; + table->size = newSize; + i = h & newMask; + step = 0; + while (table->v[i]) { + if (!step) + step = PROBE_STEP(h, newMask, newPower); + i < step ? (i += newSize - step) : (i -= step); + } + } + } + table->v[i] = (NAMED *)table->mem->malloc_fcn(createSize); + if (!table->v[i]) + return NULL; + memset(table->v[i], 0, createSize); + table->v[i]->name = name; + (table->used)++; + return table->v[i]; +} + +static void FASTCALL +hashTableClear(HASH_TABLE *table) +{ + size_t i; + for (i = 0; i < table->size; i++) { + table->mem->free_fcn(table->v[i]); + table->v[i] = NULL; + } + table->used = 0; +} + +static void FASTCALL +hashTableDestroy(HASH_TABLE *table) +{ + size_t i; + for (i = 0; i < table->size; i++) + table->mem->free_fcn(table->v[i]); + table->mem->free_fcn(table->v); +} + +static void FASTCALL +hashTableInit(HASH_TABLE *p, const XML_Memory_Handling_Suite *ms) +{ + p->power = 0; + p->size = 0; + p->used = 0; + p->v = NULL; + p->mem = ms; +} + +static void FASTCALL +hashTableIterInit(HASH_TABLE_ITER *iter, const HASH_TABLE *table) +{ + iter->p = table->v; + iter->end = iter->p + table->size; +} + +static NAMED * FASTCALL +hashTableIterNext(HASH_TABLE_ITER *iter) +{ + while (iter->p != iter->end) { + NAMED *tem = *(iter->p)++; + if (tem) + return tem; + } + return NULL; +} + +static void FASTCALL +poolInit(STRING_POOL *pool, const XML_Memory_Handling_Suite *ms) +{ + pool->blocks = NULL; + pool->freeBlocks = NULL; + pool->start = NULL; + pool->ptr = NULL; + pool->end = NULL; + pool->mem = ms; +} + +static void FASTCALL +poolClear(STRING_POOL *pool) +{ + if (!pool->freeBlocks) + pool->freeBlocks = pool->blocks; + else { + BLOCK *p = pool->blocks; + while (p) { + BLOCK *tem = p->next; + p->next = pool->freeBlocks; + pool->freeBlocks = p; + p = tem; + } + } + pool->blocks = NULL; + pool->start = NULL; + pool->ptr = NULL; + pool->end = NULL; +} + +static void FASTCALL +poolDestroy(STRING_POOL *pool) +{ + BLOCK *p = pool->blocks; + while (p) { + BLOCK *tem = p->next; + pool->mem->free_fcn(p); + p = tem; + } + p = pool->freeBlocks; + while (p) { + BLOCK *tem = p->next; + pool->mem->free_fcn(p); + p = tem; + } +} + +static XML_Char * +poolAppend(STRING_POOL *pool, const ENCODING *enc, + const char *ptr, const char *end) +{ + if (!pool->ptr && !poolGrow(pool)) + return NULL; + for (;;) { + XmlConvert(enc, &ptr, end, (ICHAR **)&(pool->ptr), (ICHAR *)pool->end); + if (ptr == end) + break; + if (!poolGrow(pool)) + return NULL; + } + return pool->start; +} + +static const XML_Char * FASTCALL +poolCopyString(STRING_POOL *pool, const XML_Char *s) +{ + do { + if (!poolAppendChar(pool, *s)) + return NULL; + } while (*s++); + s = pool->start; + poolFinish(pool); + return s; +} + +static const XML_Char * +poolCopyStringN(STRING_POOL *pool, const XML_Char *s, int n) +{ + if (!pool->ptr && !poolGrow(pool)) + return NULL; + for (; n > 0; --n, s++) { + if (!poolAppendChar(pool, *s)) + return NULL; + } + s = pool->start; + poolFinish(pool); + return s; +} + +static const XML_Char * FASTCALL +poolAppendString(STRING_POOL *pool, const XML_Char *s) +{ + while (*s) { + if (!poolAppendChar(pool, *s)) + return NULL; + s++; + } + return pool->start; +} + +static XML_Char * +poolStoreString(STRING_POOL *pool, const ENCODING *enc, + const char *ptr, const char *end) +{ + if (!poolAppend(pool, enc, ptr, end)) + return NULL; + if (pool->ptr == pool->end && !poolGrow(pool)) + return NULL; + *(pool->ptr)++ = 0; + return pool->start; +} + +static XML_Bool FASTCALL +poolGrow(STRING_POOL *pool) +{ + if (pool->freeBlocks) { + if (pool->start == 0) { + pool->blocks = pool->freeBlocks; + pool->freeBlocks = pool->freeBlocks->next; + pool->blocks->next = NULL; + pool->start = pool->blocks->s; + pool->end = pool->start + pool->blocks->size; + pool->ptr = pool->start; + return XML_TRUE; + } + if (pool->end - pool->start < pool->freeBlocks->size) { + BLOCK *tem = pool->freeBlocks->next; + pool->freeBlocks->next = pool->blocks; + pool->blocks = pool->freeBlocks; + pool->freeBlocks = tem; + memcpy(pool->blocks->s, pool->start, + (pool->end - pool->start) * sizeof(XML_Char)); + pool->ptr = pool->blocks->s + (pool->ptr - pool->start); + pool->start = pool->blocks->s; + pool->end = pool->start + pool->blocks->size; + return XML_TRUE; + } + } + if (pool->blocks && pool->start == pool->blocks->s) { + int blockSize = (pool->end - pool->start)*2; + pool->blocks = (BLOCK *) + pool->mem->realloc_fcn(pool->blocks, + (offsetof(BLOCK, s) + + blockSize * sizeof(XML_Char))); + if (pool->blocks == NULL) + return XML_FALSE; + pool->blocks->size = blockSize; + pool->ptr = pool->blocks->s + (pool->ptr - pool->start); + pool->start = pool->blocks->s; + pool->end = pool->start + blockSize; + } + else { + BLOCK *tem; + int blockSize = pool->end - pool->start; + if (blockSize < INIT_BLOCK_SIZE) + blockSize = INIT_BLOCK_SIZE; + else + blockSize *= 2; + tem = (BLOCK *)pool->mem->malloc_fcn(offsetof(BLOCK, s) + + blockSize * sizeof(XML_Char)); + if (!tem) + return XML_FALSE; + tem->size = blockSize; + tem->next = pool->blocks; + pool->blocks = tem; + if (pool->ptr != pool->start) + memcpy(tem->s, pool->start, + (pool->ptr - pool->start) * sizeof(XML_Char)); + pool->ptr = tem->s + (pool->ptr - pool->start); + pool->start = tem->s; + pool->end = tem->s + blockSize; + } + return XML_TRUE; +} + +static int FASTCALL +nextScaffoldPart(XML_Parser parser) +{ + DTD * const dtd = _dtd; /* save one level of indirection */ + CONTENT_SCAFFOLD * me; + int next; + + if (!dtd->scaffIndex) { + dtd->scaffIndex = (int *)MALLOC(groupSize * sizeof(int)); + if (!dtd->scaffIndex) + return -1; + dtd->scaffIndex[0] = 0; + } + + if (dtd->scaffCount >= dtd->scaffSize) { + CONTENT_SCAFFOLD *temp; + if (dtd->scaffold) { + temp = (CONTENT_SCAFFOLD *) + REALLOC(dtd->scaffold, dtd->scaffSize * 2 * sizeof(CONTENT_SCAFFOLD)); + if (temp == NULL) + return -1; + dtd->scaffSize *= 2; + } + else { + temp = (CONTENT_SCAFFOLD *)MALLOC(INIT_SCAFFOLD_ELEMENTS + * sizeof(CONTENT_SCAFFOLD)); + if (temp == NULL) + return -1; + dtd->scaffSize = INIT_SCAFFOLD_ELEMENTS; + } + dtd->scaffold = temp; + } + next = dtd->scaffCount++; + me = &dtd->scaffold[next]; + if (dtd->scaffLevel) { + CONTENT_SCAFFOLD *parent = &dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel-1]]; + if (parent->lastchild) { + dtd->scaffold[parent->lastchild].nextsib = next; + } + if (!parent->childcnt) + parent->firstchild = next; + parent->lastchild = next; + parent->childcnt++; + } + me->firstchild = me->lastchild = me->childcnt = me->nextsib = 0; + return next; +} + +static void +build_node(XML_Parser parser, + int src_node, + XML_Content *dest, + XML_Content **contpos, + XML_Char **strpos) +{ + DTD * const dtd = _dtd; /* save one level of indirection */ + dest->type = dtd->scaffold[src_node].type; + dest->quant = dtd->scaffold[src_node].quant; + if (dest->type == XML_CTYPE_NAME) { + const XML_Char *src; + dest->name = *strpos; + src = dtd->scaffold[src_node].name; + for (;;) { + *(*strpos)++ = *src; + if (!*src) + break; + src++; + } + dest->numchildren = 0; + dest->children = NULL; + } + else { + unsigned int i; + int cn; + dest->numchildren = dtd->scaffold[src_node].childcnt; + dest->children = *contpos; + *contpos += dest->numchildren; + for (i = 0, cn = dtd->scaffold[src_node].firstchild; + i < dest->numchildren; + i++, cn = dtd->scaffold[cn].nextsib) { + build_node(parser, cn, &(dest->children[i]), contpos, strpos); + } + dest->name = NULL; + } +} + +static XML_Content * +build_model (XML_Parser parser) +{ + DTD * const dtd = _dtd; /* save one level of indirection */ + XML_Content *ret; + XML_Content *cpos; + XML_Char * str; + int allocsize = (dtd->scaffCount * sizeof(XML_Content) + + (dtd->contentStringLen * sizeof(XML_Char))); + + ret = (XML_Content *)MALLOC(allocsize); + if (!ret) + return NULL; + + str = (XML_Char *) (&ret[dtd->scaffCount]); + cpos = &ret[1]; + + build_node(parser, 0, ret, &cpos, &str); + return ret; +} + +static ELEMENT_TYPE * +getElementType(XML_Parser parser, + const ENCODING *enc, + const char *ptr, + const char *end) +{ + DTD * const dtd = _dtd; /* save one level of indirection */ + const XML_Char *name = poolStoreString(&dtd->pool, enc, ptr, end); + ELEMENT_TYPE *ret; + + if (!name) + return NULL; + ret = (ELEMENT_TYPE *) lookup(&dtd->elementTypes, name, sizeof(ELEMENT_TYPE)); + if (!ret) + return NULL; + if (ret->name != name) + poolDiscard(&dtd->pool); + else { + poolFinish(&dtd->pool); + if (!setElementTypePrefix(parser, ret)) + return NULL; + } + return ret; +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xmlparse.lo b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xmlparse.lo new file mode 100644 index 00000000..be3d0204 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xmlparse.lo @@ -0,0 +1,12 @@ +# lib/xmlparse.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/xmlparse.o' + +# Name of the non-PIC object. +non_pic_object='xmlparse.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xmlparse.o b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xmlparse.o new file mode 100644 index 0000000000000000000000000000000000000000..1171fd329a745909e3b01d4487cdcc6f12daca72 GIT binary patch literal 272664 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%0ABy;Lrx`Bs=r}yjaPiNB{iB88 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 HfA;?XwZwr8 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xmlrole.c b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xmlrole.c new file mode 100644 index 00000000..83c0d71f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xmlrole.c @@ -0,0 +1,1323 @@ +/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +#ifdef COMPILED_FROM_DSP +#include "winconfig.h" +#elif defined(MACOS_CLASSIC) +#include "macconfig.h" +#else +#ifdef HAVE_EXPAT_CONFIG_H +#include +#endif +#endif /* ndef COMPILED_FROM_DSP */ + +#include "internal.h" +#include "xmlrole.h" +#include "ascii.h" + +/* Doesn't check: + + that ,| are not mixed in a model group + content of literals + +*/ + +static const char KW_ANY[] = { + ASCII_A, ASCII_N, ASCII_Y, '\0' }; +static const char KW_ATTLIST[] = { + ASCII_A, ASCII_T, ASCII_T, ASCII_L, ASCII_I, ASCII_S, ASCII_T, '\0' }; +static const char KW_CDATA[] = { + ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' }; +static const char KW_DOCTYPE[] = { + ASCII_D, ASCII_O, ASCII_C, ASCII_T, ASCII_Y, ASCII_P, ASCII_E, '\0' }; +static const char KW_ELEMENT[] = { + ASCII_E, ASCII_L, ASCII_E, ASCII_M, ASCII_E, ASCII_N, ASCII_T, '\0' }; +static const char KW_EMPTY[] = { + ASCII_E, ASCII_M, ASCII_P, ASCII_T, ASCII_Y, '\0' }; +static const char KW_ENTITIES[] = { + ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_I, ASCII_E, ASCII_S, + '\0' }; +static const char KW_ENTITY[] = { + ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_Y, '\0' }; +static const char KW_FIXED[] = { + ASCII_F, ASCII_I, ASCII_X, ASCII_E, ASCII_D, '\0' }; +static const char KW_ID[] = { + ASCII_I, ASCII_D, '\0' }; +static const char KW_IDREF[] = { + ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, '\0' }; +static const char KW_IDREFS[] = { + ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, ASCII_S, '\0' }; +static const char KW_IGNORE[] = { + ASCII_I, ASCII_G, ASCII_N, ASCII_O, ASCII_R, ASCII_E, '\0' }; +static const char KW_IMPLIED[] = { + ASCII_I, ASCII_M, ASCII_P, ASCII_L, ASCII_I, ASCII_E, ASCII_D, '\0' }; +static const char KW_INCLUDE[] = { + ASCII_I, ASCII_N, ASCII_C, ASCII_L, ASCII_U, ASCII_D, ASCII_E, '\0' }; +static const char KW_NDATA[] = { + ASCII_N, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' }; +static const char KW_NMTOKEN[] = { + ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, '\0' }; +static const char KW_NMTOKENS[] = { + ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, ASCII_S, + '\0' }; +static const char KW_NOTATION[] = + { ASCII_N, ASCII_O, ASCII_T, ASCII_A, ASCII_T, ASCII_I, ASCII_O, ASCII_N, + '\0' }; +static const char KW_PCDATA[] = { + ASCII_P, ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' }; +static const char KW_PUBLIC[] = { + ASCII_P, ASCII_U, ASCII_B, ASCII_L, ASCII_I, ASCII_C, '\0' }; +static const char KW_REQUIRED[] = { + ASCII_R, ASCII_E, ASCII_Q, ASCII_U, ASCII_I, ASCII_R, ASCII_E, ASCII_D, + '\0' }; +static const char KW_SYSTEM[] = { + ASCII_S, ASCII_Y, ASCII_S, ASCII_T, ASCII_E, ASCII_M, '\0' }; + +#ifndef MIN_BYTES_PER_CHAR +#define MIN_BYTES_PER_CHAR(enc) ((enc)->minBytesPerChar) +#endif + +#ifdef XML_DTD +#define setTopLevel(state) \ + ((state)->handler = ((state)->documentEntity \ + ? internalSubset \ + : externalSubset1)) +#else /* not XML_DTD */ +#define setTopLevel(state) ((state)->handler = internalSubset) +#endif /* not XML_DTD */ + +typedef int PTRCALL PROLOG_HANDLER(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc); + +static PROLOG_HANDLER + prolog0, prolog1, prolog2, + doctype0, doctype1, doctype2, doctype3, doctype4, doctype5, + internalSubset, + entity0, entity1, entity2, entity3, entity4, entity5, entity6, + entity7, entity8, entity9, entity10, + notation0, notation1, notation2, notation3, notation4, + attlist0, attlist1, attlist2, attlist3, attlist4, attlist5, attlist6, + attlist7, attlist8, attlist9, + element0, element1, element2, element3, element4, element5, element6, + element7, +#ifdef XML_DTD + externalSubset0, externalSubset1, + condSect0, condSect1, condSect2, +#endif /* XML_DTD */ + declClose, + error; + +static int FASTCALL common(PROLOG_STATE *state, int tok); + +static int PTRCALL +prolog0(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + state->handler = prolog1; + return XML_ROLE_NONE; + case XML_TOK_XML_DECL: + state->handler = prolog1; + return XML_ROLE_XML_DECL; + case XML_TOK_PI: + state->handler = prolog1; + return XML_ROLE_PI; + case XML_TOK_COMMENT: + state->handler = prolog1; + return XML_ROLE_COMMENT; + case XML_TOK_BOM: + return XML_ROLE_NONE; + case XML_TOK_DECL_OPEN: + if (!XmlNameMatchesAscii(enc, + ptr + 2 * MIN_BYTES_PER_CHAR(enc), + end, + KW_DOCTYPE)) + break; + state->handler = doctype0; + return XML_ROLE_DOCTYPE_NONE; + case XML_TOK_INSTANCE_START: + state->handler = error; + return XML_ROLE_INSTANCE_START; + } + return common(state, tok); +} + +static int PTRCALL +prolog1(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_NONE; + case XML_TOK_PI: + return XML_ROLE_PI; + case XML_TOK_COMMENT: + return XML_ROLE_COMMENT; + case XML_TOK_BOM: + return XML_ROLE_NONE; + case XML_TOK_DECL_OPEN: + if (!XmlNameMatchesAscii(enc, + ptr + 2 * MIN_BYTES_PER_CHAR(enc), + end, + KW_DOCTYPE)) + break; + state->handler = doctype0; + return XML_ROLE_DOCTYPE_NONE; + case XML_TOK_INSTANCE_START: + state->handler = error; + return XML_ROLE_INSTANCE_START; + } + return common(state, tok); +} + +static int PTRCALL +prolog2(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_NONE; + case XML_TOK_PI: + return XML_ROLE_PI; + case XML_TOK_COMMENT: + return XML_ROLE_COMMENT; + case XML_TOK_INSTANCE_START: + state->handler = error; + return XML_ROLE_INSTANCE_START; + } + return common(state, tok); +} + +static int PTRCALL +doctype0(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_DOCTYPE_NONE; + case XML_TOK_NAME: + case XML_TOK_PREFIXED_NAME: + state->handler = doctype1; + return XML_ROLE_DOCTYPE_NAME; + } + return common(state, tok); +} + +static int PTRCALL +doctype1(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_DOCTYPE_NONE; + case XML_TOK_OPEN_BRACKET: + state->handler = internalSubset; + return XML_ROLE_DOCTYPE_INTERNAL_SUBSET; + case XML_TOK_DECL_CLOSE: + state->handler = prolog2; + return XML_ROLE_DOCTYPE_CLOSE; + case XML_TOK_NAME: + if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) { + state->handler = doctype3; + return XML_ROLE_DOCTYPE_NONE; + } + if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) { + state->handler = doctype2; + return XML_ROLE_DOCTYPE_NONE; + } + break; + } + return common(state, tok); +} + +static int PTRCALL +doctype2(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_DOCTYPE_NONE; + case XML_TOK_LITERAL: + state->handler = doctype3; + return XML_ROLE_DOCTYPE_PUBLIC_ID; + } + return common(state, tok); +} + +static int PTRCALL +doctype3(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_DOCTYPE_NONE; + case XML_TOK_LITERAL: + state->handler = doctype4; + return XML_ROLE_DOCTYPE_SYSTEM_ID; + } + return common(state, tok); +} + +static int PTRCALL +doctype4(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_DOCTYPE_NONE; + case XML_TOK_OPEN_BRACKET: + state->handler = internalSubset; + return XML_ROLE_DOCTYPE_INTERNAL_SUBSET; + case XML_TOK_DECL_CLOSE: + state->handler = prolog2; + return XML_ROLE_DOCTYPE_CLOSE; + } + return common(state, tok); +} + +static int PTRCALL +doctype5(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_DOCTYPE_NONE; + case XML_TOK_DECL_CLOSE: + state->handler = prolog2; + return XML_ROLE_DOCTYPE_CLOSE; + } + return common(state, tok); +} + +static int PTRCALL +internalSubset(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_NONE; + case XML_TOK_DECL_OPEN: + if (XmlNameMatchesAscii(enc, + ptr + 2 * MIN_BYTES_PER_CHAR(enc), + end, + KW_ENTITY)) { + state->handler = entity0; + return XML_ROLE_ENTITY_NONE; + } + if (XmlNameMatchesAscii(enc, + ptr + 2 * MIN_BYTES_PER_CHAR(enc), + end, + KW_ATTLIST)) { + state->handler = attlist0; + return XML_ROLE_ATTLIST_NONE; + } + if (XmlNameMatchesAscii(enc, + ptr + 2 * MIN_BYTES_PER_CHAR(enc), + end, + KW_ELEMENT)) { + state->handler = element0; + return XML_ROLE_ELEMENT_NONE; + } + if (XmlNameMatchesAscii(enc, + ptr + 2 * MIN_BYTES_PER_CHAR(enc), + end, + KW_NOTATION)) { + state->handler = notation0; + return XML_ROLE_NOTATION_NONE; + } + break; + case XML_TOK_PI: + return XML_ROLE_PI; + case XML_TOK_COMMENT: + return XML_ROLE_COMMENT; + case XML_TOK_PARAM_ENTITY_REF: + return XML_ROLE_PARAM_ENTITY_REF; + case XML_TOK_CLOSE_BRACKET: + state->handler = doctype5; + return XML_ROLE_DOCTYPE_NONE; + } + return common(state, tok); +} + +#ifdef XML_DTD + +static int PTRCALL +externalSubset0(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + state->handler = externalSubset1; + if (tok == XML_TOK_XML_DECL) + return XML_ROLE_TEXT_DECL; + return externalSubset1(state, tok, ptr, end, enc); +} + +static int PTRCALL +externalSubset1(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_COND_SECT_OPEN: + state->handler = condSect0; + return XML_ROLE_NONE; + case XML_TOK_COND_SECT_CLOSE: + if (state->includeLevel == 0) + break; + state->includeLevel -= 1; + return XML_ROLE_NONE; + case XML_TOK_PROLOG_S: + return XML_ROLE_NONE; + case XML_TOK_CLOSE_BRACKET: + break; + case XML_TOK_NONE: + if (state->includeLevel) + break; + return XML_ROLE_NONE; + default: + return internalSubset(state, tok, ptr, end, enc); + } + return common(state, tok); +} + +#endif /* XML_DTD */ + +static int PTRCALL +entity0(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ENTITY_NONE; + case XML_TOK_PERCENT: + state->handler = entity1; + return XML_ROLE_ENTITY_NONE; + case XML_TOK_NAME: + state->handler = entity2; + return XML_ROLE_GENERAL_ENTITY_NAME; + } + return common(state, tok); +} + +static int PTRCALL +entity1(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ENTITY_NONE; + case XML_TOK_NAME: + state->handler = entity7; + return XML_ROLE_PARAM_ENTITY_NAME; + } + return common(state, tok); +} + +static int PTRCALL +entity2(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ENTITY_NONE; + case XML_TOK_NAME: + if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) { + state->handler = entity4; + return XML_ROLE_ENTITY_NONE; + } + if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) { + state->handler = entity3; + return XML_ROLE_ENTITY_NONE; + } + break; + case XML_TOK_LITERAL: + state->handler = declClose; + state->role_none = XML_ROLE_ENTITY_NONE; + return XML_ROLE_ENTITY_VALUE; + } + return common(state, tok); +} + +static int PTRCALL +entity3(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ENTITY_NONE; + case XML_TOK_LITERAL: + state->handler = entity4; + return XML_ROLE_ENTITY_PUBLIC_ID; + } + return common(state, tok); +} + +static int PTRCALL +entity4(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ENTITY_NONE; + case XML_TOK_LITERAL: + state->handler = entity5; + return XML_ROLE_ENTITY_SYSTEM_ID; + } + return common(state, tok); +} + +static int PTRCALL +entity5(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ENTITY_NONE; + case XML_TOK_DECL_CLOSE: + setTopLevel(state); + return XML_ROLE_ENTITY_COMPLETE; + case XML_TOK_NAME: + if (XmlNameMatchesAscii(enc, ptr, end, KW_NDATA)) { + state->handler = entity6; + return XML_ROLE_ENTITY_NONE; + } + break; + } + return common(state, tok); +} + +static int PTRCALL +entity6(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ENTITY_NONE; + case XML_TOK_NAME: + state->handler = declClose; + state->role_none = XML_ROLE_ENTITY_NONE; + return XML_ROLE_ENTITY_NOTATION_NAME; + } + return common(state, tok); +} + +static int PTRCALL +entity7(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ENTITY_NONE; + case XML_TOK_NAME: + if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) { + state->handler = entity9; + return XML_ROLE_ENTITY_NONE; + } + if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) { + state->handler = entity8; + return XML_ROLE_ENTITY_NONE; + } + break; + case XML_TOK_LITERAL: + state->handler = declClose; + state->role_none = XML_ROLE_ENTITY_NONE; + return XML_ROLE_ENTITY_VALUE; + } + return common(state, tok); +} + +static int PTRCALL +entity8(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ENTITY_NONE; + case XML_TOK_LITERAL: + state->handler = entity9; + return XML_ROLE_ENTITY_PUBLIC_ID; + } + return common(state, tok); +} + +static int PTRCALL +entity9(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ENTITY_NONE; + case XML_TOK_LITERAL: + state->handler = entity10; + return XML_ROLE_ENTITY_SYSTEM_ID; + } + return common(state, tok); +} + +static int PTRCALL +entity10(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ENTITY_NONE; + case XML_TOK_DECL_CLOSE: + setTopLevel(state); + return XML_ROLE_ENTITY_COMPLETE; + } + return common(state, tok); +} + +static int PTRCALL +notation0(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_NOTATION_NONE; + case XML_TOK_NAME: + state->handler = notation1; + return XML_ROLE_NOTATION_NAME; + } + return common(state, tok); +} + +static int PTRCALL +notation1(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_NOTATION_NONE; + case XML_TOK_NAME: + if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) { + state->handler = notation3; + return XML_ROLE_NOTATION_NONE; + } + if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) { + state->handler = notation2; + return XML_ROLE_NOTATION_NONE; + } + break; + } + return common(state, tok); +} + +static int PTRCALL +notation2(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_NOTATION_NONE; + case XML_TOK_LITERAL: + state->handler = notation4; + return XML_ROLE_NOTATION_PUBLIC_ID; + } + return common(state, tok); +} + +static int PTRCALL +notation3(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_NOTATION_NONE; + case XML_TOK_LITERAL: + state->handler = declClose; + state->role_none = XML_ROLE_NOTATION_NONE; + return XML_ROLE_NOTATION_SYSTEM_ID; + } + return common(state, tok); +} + +static int PTRCALL +notation4(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_NOTATION_NONE; + case XML_TOK_LITERAL: + state->handler = declClose; + state->role_none = XML_ROLE_NOTATION_NONE; + return XML_ROLE_NOTATION_SYSTEM_ID; + case XML_TOK_DECL_CLOSE: + setTopLevel(state); + return XML_ROLE_NOTATION_NO_SYSTEM_ID; + } + return common(state, tok); +} + +static int PTRCALL +attlist0(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ATTLIST_NONE; + case XML_TOK_NAME: + case XML_TOK_PREFIXED_NAME: + state->handler = attlist1; + return XML_ROLE_ATTLIST_ELEMENT_NAME; + } + return common(state, tok); +} + +static int PTRCALL +attlist1(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ATTLIST_NONE; + case XML_TOK_DECL_CLOSE: + setTopLevel(state); + return XML_ROLE_ATTLIST_NONE; + case XML_TOK_NAME: + case XML_TOK_PREFIXED_NAME: + state->handler = attlist2; + return XML_ROLE_ATTRIBUTE_NAME; + } + return common(state, tok); +} + +static int PTRCALL +attlist2(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ATTLIST_NONE; + case XML_TOK_NAME: + { + static const char *types[] = { + KW_CDATA, + KW_ID, + KW_IDREF, + KW_IDREFS, + KW_ENTITY, + KW_ENTITIES, + KW_NMTOKEN, + KW_NMTOKENS, + }; + int i; + for (i = 0; i < (int)(sizeof(types)/sizeof(types[0])); i++) + if (XmlNameMatchesAscii(enc, ptr, end, types[i])) { + state->handler = attlist8; + return XML_ROLE_ATTRIBUTE_TYPE_CDATA + i; + } + } + if (XmlNameMatchesAscii(enc, ptr, end, KW_NOTATION)) { + state->handler = attlist5; + return XML_ROLE_ATTLIST_NONE; + } + break; + case XML_TOK_OPEN_PAREN: + state->handler = attlist3; + return XML_ROLE_ATTLIST_NONE; + } + return common(state, tok); +} + +static int PTRCALL +attlist3(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ATTLIST_NONE; + case XML_TOK_NMTOKEN: + case XML_TOK_NAME: + case XML_TOK_PREFIXED_NAME: + state->handler = attlist4; + return XML_ROLE_ATTRIBUTE_ENUM_VALUE; + } + return common(state, tok); +} + +static int PTRCALL +attlist4(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ATTLIST_NONE; + case XML_TOK_CLOSE_PAREN: + state->handler = attlist8; + return XML_ROLE_ATTLIST_NONE; + case XML_TOK_OR: + state->handler = attlist3; + return XML_ROLE_ATTLIST_NONE; + } + return common(state, tok); +} + +static int PTRCALL +attlist5(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ATTLIST_NONE; + case XML_TOK_OPEN_PAREN: + state->handler = attlist6; + return XML_ROLE_ATTLIST_NONE; + } + return common(state, tok); +} + +static int PTRCALL +attlist6(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ATTLIST_NONE; + case XML_TOK_NAME: + state->handler = attlist7; + return XML_ROLE_ATTRIBUTE_NOTATION_VALUE; + } + return common(state, tok); +} + +static int PTRCALL +attlist7(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ATTLIST_NONE; + case XML_TOK_CLOSE_PAREN: + state->handler = attlist8; + return XML_ROLE_ATTLIST_NONE; + case XML_TOK_OR: + state->handler = attlist6; + return XML_ROLE_ATTLIST_NONE; + } + return common(state, tok); +} + +/* default value */ +static int PTRCALL +attlist8(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ATTLIST_NONE; + case XML_TOK_POUND_NAME: + if (XmlNameMatchesAscii(enc, + ptr + MIN_BYTES_PER_CHAR(enc), + end, + KW_IMPLIED)) { + state->handler = attlist1; + return XML_ROLE_IMPLIED_ATTRIBUTE_VALUE; + } + if (XmlNameMatchesAscii(enc, + ptr + MIN_BYTES_PER_CHAR(enc), + end, + KW_REQUIRED)) { + state->handler = attlist1; + return XML_ROLE_REQUIRED_ATTRIBUTE_VALUE; + } + if (XmlNameMatchesAscii(enc, + ptr + MIN_BYTES_PER_CHAR(enc), + end, + KW_FIXED)) { + state->handler = attlist9; + return XML_ROLE_ATTLIST_NONE; + } + break; + case XML_TOK_LITERAL: + state->handler = attlist1; + return XML_ROLE_DEFAULT_ATTRIBUTE_VALUE; + } + return common(state, tok); +} + +static int PTRCALL +attlist9(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ATTLIST_NONE; + case XML_TOK_LITERAL: + state->handler = attlist1; + return XML_ROLE_FIXED_ATTRIBUTE_VALUE; + } + return common(state, tok); +} + +static int PTRCALL +element0(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ELEMENT_NONE; + case XML_TOK_NAME: + case XML_TOK_PREFIXED_NAME: + state->handler = element1; + return XML_ROLE_ELEMENT_NAME; + } + return common(state, tok); +} + +static int PTRCALL +element1(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ELEMENT_NONE; + case XML_TOK_NAME: + if (XmlNameMatchesAscii(enc, ptr, end, KW_EMPTY)) { + state->handler = declClose; + state->role_none = XML_ROLE_ELEMENT_NONE; + return XML_ROLE_CONTENT_EMPTY; + } + if (XmlNameMatchesAscii(enc, ptr, end, KW_ANY)) { + state->handler = declClose; + state->role_none = XML_ROLE_ELEMENT_NONE; + return XML_ROLE_CONTENT_ANY; + } + break; + case XML_TOK_OPEN_PAREN: + state->handler = element2; + state->level = 1; + return XML_ROLE_GROUP_OPEN; + } + return common(state, tok); +} + +static int PTRCALL +element2(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ELEMENT_NONE; + case XML_TOK_POUND_NAME: + if (XmlNameMatchesAscii(enc, + ptr + MIN_BYTES_PER_CHAR(enc), + end, + KW_PCDATA)) { + state->handler = element3; + return XML_ROLE_CONTENT_PCDATA; + } + break; + case XML_TOK_OPEN_PAREN: + state->level = 2; + state->handler = element6; + return XML_ROLE_GROUP_OPEN; + case XML_TOK_NAME: + case XML_TOK_PREFIXED_NAME: + state->handler = element7; + return XML_ROLE_CONTENT_ELEMENT; + case XML_TOK_NAME_QUESTION: + state->handler = element7; + return XML_ROLE_CONTENT_ELEMENT_OPT; + case XML_TOK_NAME_ASTERISK: + state->handler = element7; + return XML_ROLE_CONTENT_ELEMENT_REP; + case XML_TOK_NAME_PLUS: + state->handler = element7; + return XML_ROLE_CONTENT_ELEMENT_PLUS; + } + return common(state, tok); +} + +static int PTRCALL +element3(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ELEMENT_NONE; + case XML_TOK_CLOSE_PAREN: + state->handler = declClose; + state->role_none = XML_ROLE_ELEMENT_NONE; + return XML_ROLE_GROUP_CLOSE; + case XML_TOK_CLOSE_PAREN_ASTERISK: + state->handler = declClose; + state->role_none = XML_ROLE_ELEMENT_NONE; + return XML_ROLE_GROUP_CLOSE_REP; + case XML_TOK_OR: + state->handler = element4; + return XML_ROLE_ELEMENT_NONE; + } + return common(state, tok); +} + +static int PTRCALL +element4(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ELEMENT_NONE; + case XML_TOK_NAME: + case XML_TOK_PREFIXED_NAME: + state->handler = element5; + return XML_ROLE_CONTENT_ELEMENT; + } + return common(state, tok); +} + +static int PTRCALL +element5(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ELEMENT_NONE; + case XML_TOK_CLOSE_PAREN_ASTERISK: + state->handler = declClose; + state->role_none = XML_ROLE_ELEMENT_NONE; + return XML_ROLE_GROUP_CLOSE_REP; + case XML_TOK_OR: + state->handler = element4; + return XML_ROLE_ELEMENT_NONE; + } + return common(state, tok); +} + +static int PTRCALL +element6(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ELEMENT_NONE; + case XML_TOK_OPEN_PAREN: + state->level += 1; + return XML_ROLE_GROUP_OPEN; + case XML_TOK_NAME: + case XML_TOK_PREFIXED_NAME: + state->handler = element7; + return XML_ROLE_CONTENT_ELEMENT; + case XML_TOK_NAME_QUESTION: + state->handler = element7; + return XML_ROLE_CONTENT_ELEMENT_OPT; + case XML_TOK_NAME_ASTERISK: + state->handler = element7; + return XML_ROLE_CONTENT_ELEMENT_REP; + case XML_TOK_NAME_PLUS: + state->handler = element7; + return XML_ROLE_CONTENT_ELEMENT_PLUS; + } + return common(state, tok); +} + +static int PTRCALL +element7(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_ELEMENT_NONE; + case XML_TOK_CLOSE_PAREN: + state->level -= 1; + if (state->level == 0) { + state->handler = declClose; + state->role_none = XML_ROLE_ELEMENT_NONE; + } + return XML_ROLE_GROUP_CLOSE; + case XML_TOK_CLOSE_PAREN_ASTERISK: + state->level -= 1; + if (state->level == 0) { + state->handler = declClose; + state->role_none = XML_ROLE_ELEMENT_NONE; + } + return XML_ROLE_GROUP_CLOSE_REP; + case XML_TOK_CLOSE_PAREN_QUESTION: + state->level -= 1; + if (state->level == 0) { + state->handler = declClose; + state->role_none = XML_ROLE_ELEMENT_NONE; + } + return XML_ROLE_GROUP_CLOSE_OPT; + case XML_TOK_CLOSE_PAREN_PLUS: + state->level -= 1; + if (state->level == 0) { + state->handler = declClose; + state->role_none = XML_ROLE_ELEMENT_NONE; + } + return XML_ROLE_GROUP_CLOSE_PLUS; + case XML_TOK_COMMA: + state->handler = element6; + return XML_ROLE_GROUP_SEQUENCE; + case XML_TOK_OR: + state->handler = element6; + return XML_ROLE_GROUP_CHOICE; + } + return common(state, tok); +} + +#ifdef XML_DTD + +static int PTRCALL +condSect0(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_NONE; + case XML_TOK_NAME: + if (XmlNameMatchesAscii(enc, ptr, end, KW_INCLUDE)) { + state->handler = condSect1; + return XML_ROLE_NONE; + } + if (XmlNameMatchesAscii(enc, ptr, end, KW_IGNORE)) { + state->handler = condSect2; + return XML_ROLE_NONE; + } + break; + } + return common(state, tok); +} + +static int PTRCALL +condSect1(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_NONE; + case XML_TOK_OPEN_BRACKET: + state->handler = externalSubset1; + state->includeLevel += 1; + return XML_ROLE_NONE; + } + return common(state, tok); +} + +static int PTRCALL +condSect2(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return XML_ROLE_NONE; + case XML_TOK_OPEN_BRACKET: + state->handler = externalSubset1; + return XML_ROLE_IGNORE_SECT; + } + return common(state, tok); +} + +#endif /* XML_DTD */ + +static int PTRCALL +declClose(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + switch (tok) { + case XML_TOK_PROLOG_S: + return state->role_none; + case XML_TOK_DECL_CLOSE: + setTopLevel(state); + return state->role_none; + } + return common(state, tok); +} + +static int PTRCALL +error(PROLOG_STATE *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc) +{ + return XML_ROLE_NONE; +} + +static int FASTCALL +common(PROLOG_STATE *state, int tok) +{ +#ifdef XML_DTD + if (!state->documentEntity && tok == XML_TOK_PARAM_ENTITY_REF) + return XML_ROLE_INNER_PARAM_ENTITY_REF; +#endif + state->handler = error; + return XML_ROLE_ERROR; +} + +void +XmlPrologStateInit(PROLOG_STATE *state) +{ + state->handler = prolog0; +#ifdef XML_DTD + state->documentEntity = 1; + state->includeLevel = 0; + state->inEntityValue = 0; +#endif /* XML_DTD */ +} + +#ifdef XML_DTD + +void +XmlPrologStateInitExternalEntity(PROLOG_STATE *state) +{ + state->handler = externalSubset0; + state->documentEntity = 0; + state->includeLevel = 0; +} + +#endif /* XML_DTD */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xmlrole.h b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xmlrole.h new file mode 100644 index 00000000..4dd9f06f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xmlrole.h @@ -0,0 +1,114 @@ +/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +#ifndef XmlRole_INCLUDED +#define XmlRole_INCLUDED 1 + +#ifdef __VMS +/* 0 1 2 3 0 1 2 3 + 1234567890123456789012345678901 1234567890123456789012345678901 */ +#define XmlPrologStateInitExternalEntity XmlPrologStateInitExternalEnt +#endif + +#include "xmltok.h" + +#ifdef __cplusplus +extern "C" { +#endif + +enum { + XML_ROLE_ERROR = -1, + XML_ROLE_NONE = 0, + XML_ROLE_XML_DECL, + XML_ROLE_INSTANCE_START, + XML_ROLE_DOCTYPE_NONE, + XML_ROLE_DOCTYPE_NAME, + XML_ROLE_DOCTYPE_SYSTEM_ID, + XML_ROLE_DOCTYPE_PUBLIC_ID, + XML_ROLE_DOCTYPE_INTERNAL_SUBSET, + XML_ROLE_DOCTYPE_CLOSE, + XML_ROLE_GENERAL_ENTITY_NAME, + XML_ROLE_PARAM_ENTITY_NAME, + XML_ROLE_ENTITY_NONE, + XML_ROLE_ENTITY_VALUE, + XML_ROLE_ENTITY_SYSTEM_ID, + XML_ROLE_ENTITY_PUBLIC_ID, + XML_ROLE_ENTITY_COMPLETE, + XML_ROLE_ENTITY_NOTATION_NAME, + XML_ROLE_NOTATION_NONE, + XML_ROLE_NOTATION_NAME, + XML_ROLE_NOTATION_SYSTEM_ID, + XML_ROLE_NOTATION_NO_SYSTEM_ID, + XML_ROLE_NOTATION_PUBLIC_ID, + XML_ROLE_ATTRIBUTE_NAME, + XML_ROLE_ATTRIBUTE_TYPE_CDATA, + XML_ROLE_ATTRIBUTE_TYPE_ID, + XML_ROLE_ATTRIBUTE_TYPE_IDREF, + XML_ROLE_ATTRIBUTE_TYPE_IDREFS, + XML_ROLE_ATTRIBUTE_TYPE_ENTITY, + XML_ROLE_ATTRIBUTE_TYPE_ENTITIES, + XML_ROLE_ATTRIBUTE_TYPE_NMTOKEN, + XML_ROLE_ATTRIBUTE_TYPE_NMTOKENS, + XML_ROLE_ATTRIBUTE_ENUM_VALUE, + XML_ROLE_ATTRIBUTE_NOTATION_VALUE, + XML_ROLE_ATTLIST_NONE, + XML_ROLE_ATTLIST_ELEMENT_NAME, + XML_ROLE_IMPLIED_ATTRIBUTE_VALUE, + XML_ROLE_REQUIRED_ATTRIBUTE_VALUE, + XML_ROLE_DEFAULT_ATTRIBUTE_VALUE, + XML_ROLE_FIXED_ATTRIBUTE_VALUE, + XML_ROLE_ELEMENT_NONE, + XML_ROLE_ELEMENT_NAME, + XML_ROLE_CONTENT_ANY, + XML_ROLE_CONTENT_EMPTY, + XML_ROLE_CONTENT_PCDATA, + XML_ROLE_GROUP_OPEN, + XML_ROLE_GROUP_CLOSE, + XML_ROLE_GROUP_CLOSE_REP, + XML_ROLE_GROUP_CLOSE_OPT, + XML_ROLE_GROUP_CLOSE_PLUS, + XML_ROLE_GROUP_CHOICE, + XML_ROLE_GROUP_SEQUENCE, + XML_ROLE_CONTENT_ELEMENT, + XML_ROLE_CONTENT_ELEMENT_REP, + XML_ROLE_CONTENT_ELEMENT_OPT, + XML_ROLE_CONTENT_ELEMENT_PLUS, + XML_ROLE_PI, + XML_ROLE_COMMENT, +#ifdef XML_DTD + XML_ROLE_TEXT_DECL, + XML_ROLE_IGNORE_SECT, + XML_ROLE_INNER_PARAM_ENTITY_REF, +#endif /* XML_DTD */ + XML_ROLE_PARAM_ENTITY_REF +}; + +typedef struct prolog_state { + int (PTRCALL *handler) (struct prolog_state *state, + int tok, + const char *ptr, + const char *end, + const ENCODING *enc); + unsigned level; + int role_none; +#ifdef XML_DTD + unsigned includeLevel; + int documentEntity; + int inEntityValue; +#endif /* XML_DTD */ +} PROLOG_STATE; + +void XmlPrologStateInit(PROLOG_STATE *); +#ifdef XML_DTD +void XmlPrologStateInitExternalEntity(PROLOG_STATE *); +#endif /* XML_DTD */ + +#define XmlTokenRole(state, tok, ptr, end, enc) \ + (((state)->handler)(state, tok, ptr, end, enc)) + +#ifdef __cplusplus +} +#endif + +#endif /* not XmlRole_INCLUDED */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xmlrole.lo b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xmlrole.lo new file mode 100644 index 00000000..17800e9d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xmlrole.lo @@ -0,0 +1,12 @@ +# lib/xmlrole.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/xmlrole.o' + +# Name of the non-PIC object. +non_pic_object='xmlrole.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xmlrole.o b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xmlrole.o new file mode 100644 index 0000000000000000000000000000000000000000..b5ddd5b680780d25b525d46926950acc5fc39188 GIT binary patch literal 86432 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 +#endif +#endif /* ndef COMPILED_FROM_DSP */ + +#include "internal.h" +#include "xmltok.h" +#include "nametab.h" + +#ifdef XML_DTD +#define IGNORE_SECTION_TOK_VTABLE , PREFIX(ignoreSectionTok) +#else +#define IGNORE_SECTION_TOK_VTABLE /* as nothing */ +#endif + +#define VTABLE1 \ + { PREFIX(prologTok), PREFIX(contentTok), \ + PREFIX(cdataSectionTok) IGNORE_SECTION_TOK_VTABLE }, \ + { PREFIX(attributeValueTok), PREFIX(entityValueTok) }, \ + PREFIX(sameName), \ + PREFIX(nameMatchesAscii), \ + PREFIX(nameLength), \ + PREFIX(skipS), \ + PREFIX(getAtts), \ + PREFIX(charRefNumber), \ + PREFIX(predefinedEntityName), \ + PREFIX(updatePosition), \ + PREFIX(isPublicId) + +#define VTABLE VTABLE1, PREFIX(toUtf8), PREFIX(toUtf16) + +#define UCS2_GET_NAMING(pages, hi, lo) \ + (namingBitmap[(pages[hi] << 3) + ((lo) >> 5)] & (1 << ((lo) & 0x1F))) + +/* A 2 byte UTF-8 representation splits the characters 11 bits between + the bottom 5 and 6 bits of the bytes. We need 8 bits to index into + pages, 3 bits to add to that index and 5 bits to generate the mask. +*/ +#define UTF8_GET_NAMING2(pages, byte) \ + (namingBitmap[((pages)[(((byte)[0]) >> 2) & 7] << 3) \ + + ((((byte)[0]) & 3) << 1) \ + + ((((byte)[1]) >> 5) & 1)] \ + & (1 << (((byte)[1]) & 0x1F))) + +/* A 3 byte UTF-8 representation splits the characters 16 bits between + the bottom 4, 6 and 6 bits of the bytes. We need 8 bits to index + into pages, 3 bits to add to that index and 5 bits to generate the + mask. +*/ +#define UTF8_GET_NAMING3(pages, byte) \ + (namingBitmap[((pages)[((((byte)[0]) & 0xF) << 4) \ + + ((((byte)[1]) >> 2) & 0xF)] \ + << 3) \ + + ((((byte)[1]) & 3) << 1) \ + + ((((byte)[2]) >> 5) & 1)] \ + & (1 << (((byte)[2]) & 0x1F))) + +#define UTF8_GET_NAMING(pages, p, n) \ + ((n) == 2 \ + ? UTF8_GET_NAMING2(pages, (const unsigned char *)(p)) \ + : ((n) == 3 \ + ? UTF8_GET_NAMING3(pages, (const unsigned char *)(p)) \ + : 0)) + +/* Detection of invalid UTF-8 sequences is based on Table 3.1B + of Unicode 3.2: http://www.unicode.org/unicode/reports/tr28/ + with the additional restriction of not allowing the Unicode + code points 0xFFFF and 0xFFFE (sequences EF,BF,BF and EF,BF,BE). + Implementation details: + (A & 0x80) == 0 means A < 0x80 + and + (A & 0xC0) == 0xC0 means A > 0xBF +*/ + +#define UTF8_INVALID2(p) \ + ((*p) < 0xC2 || ((p)[1] & 0x80) == 0 || ((p)[1] & 0xC0) == 0xC0) + +#define UTF8_INVALID3(p) \ + (((p)[2] & 0x80) == 0 \ + || \ + ((*p) == 0xEF && (p)[1] == 0xBF \ + ? \ + (p)[2] > 0xBD \ + : \ + ((p)[2] & 0xC0) == 0xC0) \ + || \ + ((*p) == 0xE0 \ + ? \ + (p)[1] < 0xA0 || ((p)[1] & 0xC0) == 0xC0 \ + : \ + ((p)[1] & 0x80) == 0 \ + || \ + ((*p) == 0xED ? (p)[1] > 0x9F : ((p)[1] & 0xC0) == 0xC0))) + +#define UTF8_INVALID4(p) \ + (((p)[3] & 0x80) == 0 || ((p)[3] & 0xC0) == 0xC0 \ + || \ + ((p)[2] & 0x80) == 0 || ((p)[2] & 0xC0) == 0xC0 \ + || \ + ((*p) == 0xF0 \ + ? \ + (p)[1] < 0x90 || ((p)[1] & 0xC0) == 0xC0 \ + : \ + ((p)[1] & 0x80) == 0 \ + || \ + ((*p) == 0xF4 ? (p)[1] > 0x8F : ((p)[1] & 0xC0) == 0xC0))) + +static int PTRFASTCALL +isNever(const ENCODING *enc, const char *p) +{ + return 0; +} + +static int PTRFASTCALL +utf8_isName2(const ENCODING *enc, const char *p) +{ + return UTF8_GET_NAMING2(namePages, (const unsigned char *)p); +} + +static int PTRFASTCALL +utf8_isName3(const ENCODING *enc, const char *p) +{ + return UTF8_GET_NAMING3(namePages, (const unsigned char *)p); +} + +#define utf8_isName4 isNever + +static int PTRFASTCALL +utf8_isNmstrt2(const ENCODING *enc, const char *p) +{ + return UTF8_GET_NAMING2(nmstrtPages, (const unsigned char *)p); +} + +static int PTRFASTCALL +utf8_isNmstrt3(const ENCODING *enc, const char *p) +{ + return UTF8_GET_NAMING3(nmstrtPages, (const unsigned char *)p); +} + +#define utf8_isNmstrt4 isNever + +static int PTRFASTCALL +utf8_isInvalid2(const ENCODING *enc, const char *p) +{ + return UTF8_INVALID2((const unsigned char *)p); +} + +static int PTRFASTCALL +utf8_isInvalid3(const ENCODING *enc, const char *p) +{ + return UTF8_INVALID3((const unsigned char *)p); +} + +static int PTRFASTCALL +utf8_isInvalid4(const ENCODING *enc, const char *p) +{ + return UTF8_INVALID4((const unsigned char *)p); +} + +struct normal_encoding { + ENCODING enc; + unsigned char type[256]; +#ifdef XML_MIN_SIZE + int (PTRFASTCALL *byteType)(const ENCODING *, const char *); + int (PTRFASTCALL *isNameMin)(const ENCODING *, const char *); + int (PTRFASTCALL *isNmstrtMin)(const ENCODING *, const char *); + int (PTRFASTCALL *byteToAscii)(const ENCODING *, const char *); + int (PTRCALL *charMatches)(const ENCODING *, const char *, int); +#endif /* XML_MIN_SIZE */ + int (PTRFASTCALL *isName2)(const ENCODING *, const char *); + int (PTRFASTCALL *isName3)(const ENCODING *, const char *); + int (PTRFASTCALL *isName4)(const ENCODING *, const char *); + int (PTRFASTCALL *isNmstrt2)(const ENCODING *, const char *); + int (PTRFASTCALL *isNmstrt3)(const ENCODING *, const char *); + int (PTRFASTCALL *isNmstrt4)(const ENCODING *, const char *); + int (PTRFASTCALL *isInvalid2)(const ENCODING *, const char *); + int (PTRFASTCALL *isInvalid3)(const ENCODING *, const char *); + int (PTRFASTCALL *isInvalid4)(const ENCODING *, const char *); +}; + +#define AS_NORMAL_ENCODING(enc) ((const struct normal_encoding *) (enc)) + +#ifdef XML_MIN_SIZE + +#define STANDARD_VTABLE(E) \ + E ## byteType, \ + E ## isNameMin, \ + E ## isNmstrtMin, \ + E ## byteToAscii, \ + E ## charMatches, + +#else + +#define STANDARD_VTABLE(E) /* as nothing */ + +#endif + +#define NORMAL_VTABLE(E) \ + E ## isName2, \ + E ## isName3, \ + E ## isName4, \ + E ## isNmstrt2, \ + E ## isNmstrt3, \ + E ## isNmstrt4, \ + E ## isInvalid2, \ + E ## isInvalid3, \ + E ## isInvalid4 + +static int FASTCALL checkCharRefNumber(int); + +#include "xmltok_impl.h" +#include "ascii.h" + +#ifdef XML_MIN_SIZE +#define sb_isNameMin isNever +#define sb_isNmstrtMin isNever +#endif + +#ifdef XML_MIN_SIZE +#define MINBPC(enc) ((enc)->minBytesPerChar) +#else +/* minimum bytes per character */ +#define MINBPC(enc) 1 +#endif + +#define SB_BYTE_TYPE(enc, p) \ + (((struct normal_encoding *)(enc))->type[(unsigned char)*(p)]) + +#ifdef XML_MIN_SIZE +static int PTRFASTCALL +sb_byteType(const ENCODING *enc, const char *p) +{ + return SB_BYTE_TYPE(enc, p); +} +#define BYTE_TYPE(enc, p) \ + (AS_NORMAL_ENCODING(enc)->byteType(enc, p)) +#else +#define BYTE_TYPE(enc, p) SB_BYTE_TYPE(enc, p) +#endif + +#ifdef XML_MIN_SIZE +#define BYTE_TO_ASCII(enc, p) \ + (AS_NORMAL_ENCODING(enc)->byteToAscii(enc, p)) +static int PTRFASTCALL +sb_byteToAscii(const ENCODING *enc, const char *p) +{ + return *p; +} +#else +#define BYTE_TO_ASCII(enc, p) (*(p)) +#endif + +#define IS_NAME_CHAR(enc, p, n) \ + (AS_NORMAL_ENCODING(enc)->isName ## n(enc, p)) +#define IS_NMSTRT_CHAR(enc, p, n) \ + (AS_NORMAL_ENCODING(enc)->isNmstrt ## n(enc, p)) +#define IS_INVALID_CHAR(enc, p, n) \ + (AS_NORMAL_ENCODING(enc)->isInvalid ## n(enc, p)) + +#ifdef XML_MIN_SIZE +#define IS_NAME_CHAR_MINBPC(enc, p) \ + (AS_NORMAL_ENCODING(enc)->isNameMin(enc, p)) +#define IS_NMSTRT_CHAR_MINBPC(enc, p) \ + (AS_NORMAL_ENCODING(enc)->isNmstrtMin(enc, p)) +#else +#define IS_NAME_CHAR_MINBPC(enc, p) (0) +#define IS_NMSTRT_CHAR_MINBPC(enc, p) (0) +#endif + +#ifdef XML_MIN_SIZE +#define CHAR_MATCHES(enc, p, c) \ + (AS_NORMAL_ENCODING(enc)->charMatches(enc, p, c)) +static int PTRCALL +sb_charMatches(const ENCODING *enc, const char *p, int c) +{ + return *p == c; +} +#else +/* c is an ASCII character */ +#define CHAR_MATCHES(enc, p, c) (*(p) == c) +#endif + +#define PREFIX(ident) normal_ ## ident +#include "xmltok_impl.c" + +#undef MINBPC +#undef BYTE_TYPE +#undef BYTE_TO_ASCII +#undef CHAR_MATCHES +#undef IS_NAME_CHAR +#undef IS_NAME_CHAR_MINBPC +#undef IS_NMSTRT_CHAR +#undef IS_NMSTRT_CHAR_MINBPC +#undef IS_INVALID_CHAR + +enum { /* UTF8_cvalN is value of masked first byte of N byte sequence */ + UTF8_cval1 = 0x00, + UTF8_cval2 = 0xc0, + UTF8_cval3 = 0xe0, + UTF8_cval4 = 0xf0 +}; + +static void PTRCALL +utf8_toUtf8(const ENCODING *enc, + const char **fromP, const char *fromLim, + char **toP, const char *toLim) +{ + char *to; + const char *from; + if (fromLim - *fromP > toLim - *toP) { + /* Avoid copying partial characters. */ + for (fromLim = *fromP + (toLim - *toP); fromLim > *fromP; fromLim--) + if (((unsigned char)fromLim[-1] & 0xc0) != 0x80) + break; + } + for (to = *toP, from = *fromP; from != fromLim; from++, to++) + *to = *from; + *fromP = from; + *toP = to; +} + +static void PTRCALL +utf8_toUtf16(const ENCODING *enc, + const char **fromP, const char *fromLim, + unsigned short **toP, const unsigned short *toLim) +{ + unsigned short *to = *toP; + const char *from = *fromP; + while (from != fromLim && to != toLim) { + switch (((struct normal_encoding *)enc)->type[(unsigned char)*from]) { + case BT_LEAD2: + *to++ = (unsigned short)(((from[0] & 0x1f) << 6) | (from[1] & 0x3f)); + from += 2; + break; + case BT_LEAD3: + *to++ = (unsigned short)(((from[0] & 0xf) << 12) + | ((from[1] & 0x3f) << 6) | (from[2] & 0x3f)); + from += 3; + break; + case BT_LEAD4: + { + unsigned long n; + if (to + 1 == toLim) + goto after; + n = ((from[0] & 0x7) << 18) | ((from[1] & 0x3f) << 12) + | ((from[2] & 0x3f) << 6) | (from[3] & 0x3f); + n -= 0x10000; + to[0] = (unsigned short)((n >> 10) | 0xD800); + to[1] = (unsigned short)((n & 0x3FF) | 0xDC00); + to += 2; + from += 4; + } + break; + default: + *to++ = *from++; + break; + } + } +after: + *fromP = from; + *toP = to; +} + +#ifdef XML_NS +static const struct normal_encoding utf8_encoding_ns = { + { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 }, + { +#include "asciitab.h" +#include "utf8tab.h" + }, + STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_) +}; +#endif + +static const struct normal_encoding utf8_encoding = { + { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 }, + { +#define BT_COLON BT_NMSTRT +#include "asciitab.h" +#undef BT_COLON +#include "utf8tab.h" + }, + STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_) +}; + +#ifdef XML_NS + +static const struct normal_encoding internal_utf8_encoding_ns = { + { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 }, + { +#include "iasciitab.h" +#include "utf8tab.h" + }, + STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_) +}; + +#endif + +static const struct normal_encoding internal_utf8_encoding = { + { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 }, + { +#define BT_COLON BT_NMSTRT +#include "iasciitab.h" +#undef BT_COLON +#include "utf8tab.h" + }, + STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_) +}; + +static void PTRCALL +latin1_toUtf8(const ENCODING *enc, + const char **fromP, const char *fromLim, + char **toP, const char *toLim) +{ + for (;;) { + unsigned char c; + if (*fromP == fromLim) + break; + c = (unsigned char)**fromP; + if (c & 0x80) { + if (toLim - *toP < 2) + break; + *(*toP)++ = (char)((c >> 6) | UTF8_cval2); + *(*toP)++ = (char)((c & 0x3f) | 0x80); + (*fromP)++; + } + else { + if (*toP == toLim) + break; + *(*toP)++ = *(*fromP)++; + } + } +} + +static void PTRCALL +latin1_toUtf16(const ENCODING *enc, + const char **fromP, const char *fromLim, + unsigned short **toP, const unsigned short *toLim) +{ + while (*fromP != fromLim && *toP != toLim) + *(*toP)++ = (unsigned char)*(*fromP)++; +} + +#ifdef XML_NS + +static const struct normal_encoding latin1_encoding_ns = { + { VTABLE1, latin1_toUtf8, latin1_toUtf16, 1, 0, 0 }, + { +#include "asciitab.h" +#include "latin1tab.h" + }, + STANDARD_VTABLE(sb_) +}; + +#endif + +static const struct normal_encoding latin1_encoding = { + { VTABLE1, latin1_toUtf8, latin1_toUtf16, 1, 0, 0 }, + { +#define BT_COLON BT_NMSTRT +#include "asciitab.h" +#undef BT_COLON +#include "latin1tab.h" + }, + STANDARD_VTABLE(sb_) +}; + +static void PTRCALL +ascii_toUtf8(const ENCODING *enc, + const char **fromP, const char *fromLim, + char **toP, const char *toLim) +{ + while (*fromP != fromLim && *toP != toLim) + *(*toP)++ = *(*fromP)++; +} + +#ifdef XML_NS + +static const struct normal_encoding ascii_encoding_ns = { + { VTABLE1, ascii_toUtf8, latin1_toUtf16, 1, 1, 0 }, + { +#include "asciitab.h" +/* BT_NONXML == 0 */ + }, + STANDARD_VTABLE(sb_) +}; + +#endif + +static const struct normal_encoding ascii_encoding = { + { VTABLE1, ascii_toUtf8, latin1_toUtf16, 1, 1, 0 }, + { +#define BT_COLON BT_NMSTRT +#include "asciitab.h" +#undef BT_COLON +/* BT_NONXML == 0 */ + }, + STANDARD_VTABLE(sb_) +}; + +static int PTRFASTCALL +unicode_byte_type(char hi, char lo) +{ + switch ((unsigned char)hi) { + case 0xD8: case 0xD9: case 0xDA: case 0xDB: + return BT_LEAD4; + case 0xDC: case 0xDD: case 0xDE: case 0xDF: + return BT_TRAIL; + case 0xFF: + switch ((unsigned char)lo) { + case 0xFF: + case 0xFE: + return BT_NONXML; + } + break; + } + return BT_NONASCII; +} + +#define DEFINE_UTF16_TO_UTF8(E) \ +static void PTRCALL \ +E ## toUtf8(const ENCODING *enc, \ + const char **fromP, const char *fromLim, \ + char **toP, const char *toLim) \ +{ \ + const char *from; \ + for (from = *fromP; from != fromLim; from += 2) { \ + int plane; \ + unsigned char lo2; \ + unsigned char lo = GET_LO(from); \ + unsigned char hi = GET_HI(from); \ + switch (hi) { \ + case 0: \ + if (lo < 0x80) { \ + if (*toP == toLim) { \ + *fromP = from; \ + return; \ + } \ + *(*toP)++ = lo; \ + break; \ + } \ + /* fall through */ \ + case 0x1: case 0x2: case 0x3: \ + case 0x4: case 0x5: case 0x6: case 0x7: \ + if (toLim - *toP < 2) { \ + *fromP = from; \ + return; \ + } \ + *(*toP)++ = ((lo >> 6) | (hi << 2) | UTF8_cval2); \ + *(*toP)++ = ((lo & 0x3f) | 0x80); \ + break; \ + default: \ + if (toLim - *toP < 3) { \ + *fromP = from; \ + return; \ + } \ + /* 16 bits divided 4, 6, 6 amongst 3 bytes */ \ + *(*toP)++ = ((hi >> 4) | UTF8_cval3); \ + *(*toP)++ = (((hi & 0xf) << 2) | (lo >> 6) | 0x80); \ + *(*toP)++ = ((lo & 0x3f) | 0x80); \ + break; \ + case 0xD8: case 0xD9: case 0xDA: case 0xDB: \ + if (toLim - *toP < 4) { \ + *fromP = from; \ + return; \ + } \ + plane = (((hi & 0x3) << 2) | ((lo >> 6) & 0x3)) + 1; \ + *(*toP)++ = ((plane >> 2) | UTF8_cval4); \ + *(*toP)++ = (((lo >> 2) & 0xF) | ((plane & 0x3) << 4) | 0x80); \ + from += 2; \ + lo2 = GET_LO(from); \ + *(*toP)++ = (((lo & 0x3) << 4) \ + | ((GET_HI(from) & 0x3) << 2) \ + | (lo2 >> 6) \ + | 0x80); \ + *(*toP)++ = ((lo2 & 0x3f) | 0x80); \ + break; \ + } \ + } \ + *fromP = from; \ +} + +#define DEFINE_UTF16_TO_UTF16(E) \ +static void PTRCALL \ +E ## toUtf16(const ENCODING *enc, \ + const char **fromP, const char *fromLim, \ + unsigned short **toP, const unsigned short *toLim) \ +{ \ + /* Avoid copying first half only of surrogate */ \ + if (fromLim - *fromP > ((toLim - *toP) << 1) \ + && (GET_HI(fromLim - 2) & 0xF8) == 0xD8) \ + fromLim -= 2; \ + for (; *fromP != fromLim && *toP != toLim; *fromP += 2) \ + *(*toP)++ = (GET_HI(*fromP) << 8) | GET_LO(*fromP); \ +} + +#define SET2(ptr, ch) \ + (((ptr)[0] = ((ch) & 0xff)), ((ptr)[1] = ((ch) >> 8))) +#define GET_LO(ptr) ((unsigned char)(ptr)[0]) +#define GET_HI(ptr) ((unsigned char)(ptr)[1]) + +DEFINE_UTF16_TO_UTF8(little2_) +DEFINE_UTF16_TO_UTF16(little2_) + +#undef SET2 +#undef GET_LO +#undef GET_HI + +#define SET2(ptr, ch) \ + (((ptr)[0] = ((ch) >> 8)), ((ptr)[1] = ((ch) & 0xFF))) +#define GET_LO(ptr) ((unsigned char)(ptr)[1]) +#define GET_HI(ptr) ((unsigned char)(ptr)[0]) + +DEFINE_UTF16_TO_UTF8(big2_) +DEFINE_UTF16_TO_UTF16(big2_) + +#undef SET2 +#undef GET_LO +#undef GET_HI + +#define LITTLE2_BYTE_TYPE(enc, p) \ + ((p)[1] == 0 \ + ? ((struct normal_encoding *)(enc))->type[(unsigned char)*(p)] \ + : unicode_byte_type((p)[1], (p)[0])) +#define LITTLE2_BYTE_TO_ASCII(enc, p) ((p)[1] == 0 ? (p)[0] : -1) +#define LITTLE2_CHAR_MATCHES(enc, p, c) ((p)[1] == 0 && (p)[0] == c) +#define LITTLE2_IS_NAME_CHAR_MINBPC(enc, p) \ + UCS2_GET_NAMING(namePages, (unsigned char)p[1], (unsigned char)p[0]) +#define LITTLE2_IS_NMSTRT_CHAR_MINBPC(enc, p) \ + UCS2_GET_NAMING(nmstrtPages, (unsigned char)p[1], (unsigned char)p[0]) + +#ifdef XML_MIN_SIZE + +static int PTRFASTCALL +little2_byteType(const ENCODING *enc, const char *p) +{ + return LITTLE2_BYTE_TYPE(enc, p); +} + +static int PTRFASTCALL +little2_byteToAscii(const ENCODING *enc, const char *p) +{ + return LITTLE2_BYTE_TO_ASCII(enc, p); +} + +static int PTRCALL +little2_charMatches(const ENCODING *enc, const char *p, int c) +{ + return LITTLE2_CHAR_MATCHES(enc, p, c); +} + +static int PTRFASTCALL +little2_isNameMin(const ENCODING *enc, const char *p) +{ + return LITTLE2_IS_NAME_CHAR_MINBPC(enc, p); +} + +static int PTRFASTCALL +little2_isNmstrtMin(const ENCODING *enc, const char *p) +{ + return LITTLE2_IS_NMSTRT_CHAR_MINBPC(enc, p); +} + +#undef VTABLE +#define VTABLE VTABLE1, little2_toUtf8, little2_toUtf16 + +#else /* not XML_MIN_SIZE */ + +#undef PREFIX +#define PREFIX(ident) little2_ ## ident +#define MINBPC(enc) 2 +/* CHAR_MATCHES is guaranteed to have MINBPC bytes available. */ +#define BYTE_TYPE(enc, p) LITTLE2_BYTE_TYPE(enc, p) +#define BYTE_TO_ASCII(enc, p) LITTLE2_BYTE_TO_ASCII(enc, p) +#define CHAR_MATCHES(enc, p, c) LITTLE2_CHAR_MATCHES(enc, p, c) +#define IS_NAME_CHAR(enc, p, n) 0 +#define IS_NAME_CHAR_MINBPC(enc, p) LITTLE2_IS_NAME_CHAR_MINBPC(enc, p) +#define IS_NMSTRT_CHAR(enc, p, n) (0) +#define IS_NMSTRT_CHAR_MINBPC(enc, p) LITTLE2_IS_NMSTRT_CHAR_MINBPC(enc, p) + +#include "xmltok_impl.c" + +#undef MINBPC +#undef BYTE_TYPE +#undef BYTE_TO_ASCII +#undef CHAR_MATCHES +#undef IS_NAME_CHAR +#undef IS_NAME_CHAR_MINBPC +#undef IS_NMSTRT_CHAR +#undef IS_NMSTRT_CHAR_MINBPC +#undef IS_INVALID_CHAR + +#endif /* not XML_MIN_SIZE */ + +#ifdef XML_NS + +static const struct normal_encoding little2_encoding_ns = { + { VTABLE, 2, 0, +#if BYTEORDER == 1234 + 1 +#else + 0 +#endif + }, + { +#include "asciitab.h" +#include "latin1tab.h" + }, + STANDARD_VTABLE(little2_) +}; + +#endif + +static const struct normal_encoding little2_encoding = { + { VTABLE, 2, 0, +#if BYTEORDER == 1234 + 1 +#else + 0 +#endif + }, + { +#define BT_COLON BT_NMSTRT +#include "asciitab.h" +#undef BT_COLON +#include "latin1tab.h" + }, + STANDARD_VTABLE(little2_) +}; + +#if BYTEORDER != 4321 + +#ifdef XML_NS + +static const struct normal_encoding internal_little2_encoding_ns = { + { VTABLE, 2, 0, 1 }, + { +#include "iasciitab.h" +#include "latin1tab.h" + }, + STANDARD_VTABLE(little2_) +}; + +#endif + +static const struct normal_encoding internal_little2_encoding = { + { VTABLE, 2, 0, 1 }, + { +#define BT_COLON BT_NMSTRT +#include "iasciitab.h" +#undef BT_COLON +#include "latin1tab.h" + }, + STANDARD_VTABLE(little2_) +}; + +#endif + + +#define BIG2_BYTE_TYPE(enc, p) \ + ((p)[0] == 0 \ + ? ((struct normal_encoding *)(enc))->type[(unsigned char)(p)[1]] \ + : unicode_byte_type((p)[0], (p)[1])) +#define BIG2_BYTE_TO_ASCII(enc, p) ((p)[0] == 0 ? (p)[1] : -1) +#define BIG2_CHAR_MATCHES(enc, p, c) ((p)[0] == 0 && (p)[1] == c) +#define BIG2_IS_NAME_CHAR_MINBPC(enc, p) \ + UCS2_GET_NAMING(namePages, (unsigned char)p[0], (unsigned char)p[1]) +#define BIG2_IS_NMSTRT_CHAR_MINBPC(enc, p) \ + UCS2_GET_NAMING(nmstrtPages, (unsigned char)p[0], (unsigned char)p[1]) + +#ifdef XML_MIN_SIZE + +static int PTRFASTCALL +big2_byteType(const ENCODING *enc, const char *p) +{ + return BIG2_BYTE_TYPE(enc, p); +} + +static int PTRFASTCALL +big2_byteToAscii(const ENCODING *enc, const char *p) +{ + return BIG2_BYTE_TO_ASCII(enc, p); +} + +static int PTRCALL +big2_charMatches(const ENCODING *enc, const char *p, int c) +{ + return BIG2_CHAR_MATCHES(enc, p, c); +} + +static int PTRFASTCALL +big2_isNameMin(const ENCODING *enc, const char *p) +{ + return BIG2_IS_NAME_CHAR_MINBPC(enc, p); +} + +static int PTRFASTCALL +big2_isNmstrtMin(const ENCODING *enc, const char *p) +{ + return BIG2_IS_NMSTRT_CHAR_MINBPC(enc, p); +} + +#undef VTABLE +#define VTABLE VTABLE1, big2_toUtf8, big2_toUtf16 + +#else /* not XML_MIN_SIZE */ + +#undef PREFIX +#define PREFIX(ident) big2_ ## ident +#define MINBPC(enc) 2 +/* CHAR_MATCHES is guaranteed to have MINBPC bytes available. */ +#define BYTE_TYPE(enc, p) BIG2_BYTE_TYPE(enc, p) +#define BYTE_TO_ASCII(enc, p) BIG2_BYTE_TO_ASCII(enc, p) +#define CHAR_MATCHES(enc, p, c) BIG2_CHAR_MATCHES(enc, p, c) +#define IS_NAME_CHAR(enc, p, n) 0 +#define IS_NAME_CHAR_MINBPC(enc, p) BIG2_IS_NAME_CHAR_MINBPC(enc, p) +#define IS_NMSTRT_CHAR(enc, p, n) (0) +#define IS_NMSTRT_CHAR_MINBPC(enc, p) BIG2_IS_NMSTRT_CHAR_MINBPC(enc, p) + +#include "xmltok_impl.c" + +#undef MINBPC +#undef BYTE_TYPE +#undef BYTE_TO_ASCII +#undef CHAR_MATCHES +#undef IS_NAME_CHAR +#undef IS_NAME_CHAR_MINBPC +#undef IS_NMSTRT_CHAR +#undef IS_NMSTRT_CHAR_MINBPC +#undef IS_INVALID_CHAR + +#endif /* not XML_MIN_SIZE */ + +#ifdef XML_NS + +static const struct normal_encoding big2_encoding_ns = { + { VTABLE, 2, 0, +#if BYTEORDER == 4321 + 1 +#else + 0 +#endif + }, + { +#include "asciitab.h" +#include "latin1tab.h" + }, + STANDARD_VTABLE(big2_) +}; + +#endif + +static const struct normal_encoding big2_encoding = { + { VTABLE, 2, 0, +#if BYTEORDER == 4321 + 1 +#else + 0 +#endif + }, + { +#define BT_COLON BT_NMSTRT +#include "asciitab.h" +#undef BT_COLON +#include "latin1tab.h" + }, + STANDARD_VTABLE(big2_) +}; + +#if BYTEORDER != 1234 + +#ifdef XML_NS + +static const struct normal_encoding internal_big2_encoding_ns = { + { VTABLE, 2, 0, 1 }, + { +#include "iasciitab.h" +#include "latin1tab.h" + }, + STANDARD_VTABLE(big2_) +}; + +#endif + +static const struct normal_encoding internal_big2_encoding = { + { VTABLE, 2, 0, 1 }, + { +#define BT_COLON BT_NMSTRT +#include "iasciitab.h" +#undef BT_COLON +#include "latin1tab.h" + }, + STANDARD_VTABLE(big2_) +}; + +#endif + +#undef PREFIX + +static int FASTCALL +streqci(const char *s1, const char *s2) +{ + for (;;) { + char c1 = *s1++; + char c2 = *s2++; + if (ASCII_a <= c1 && c1 <= ASCII_z) + c1 += ASCII_A - ASCII_a; + if (ASCII_a <= c2 && c2 <= ASCII_z) + c2 += ASCII_A - ASCII_a; + if (c1 != c2) + return 0; + if (!c1) + break; + } + return 1; +} + +static void PTRCALL +initUpdatePosition(const ENCODING *enc, const char *ptr, + const char *end, POSITION *pos) +{ + normal_updatePosition(&utf8_encoding.enc, ptr, end, pos); +} + +static int +toAscii(const ENCODING *enc, const char *ptr, const char *end) +{ + char buf[1]; + char *p = buf; + XmlUtf8Convert(enc, &ptr, end, &p, p + 1); + if (p == buf) + return -1; + else + return buf[0]; +} + +static int FASTCALL +isSpace(int c) +{ + switch (c) { + case 0x20: + case 0xD: + case 0xA: + case 0x9: + return 1; + } + return 0; +} + +/* Return 1 if there's just optional white space or there's an S + followed by name=val. +*/ +static int +parsePseudoAttribute(const ENCODING *enc, + const char *ptr, + const char *end, + const char **namePtr, + const char **nameEndPtr, + const char **valPtr, + const char **nextTokPtr) +{ + int c; + char open; + if (ptr == end) { + *namePtr = NULL; + return 1; + } + if (!isSpace(toAscii(enc, ptr, end))) { + *nextTokPtr = ptr; + return 0; + } + do { + ptr += enc->minBytesPerChar; + } while (isSpace(toAscii(enc, ptr, end))); + if (ptr == end) { + *namePtr = NULL; + return 1; + } + *namePtr = ptr; + for (;;) { + c = toAscii(enc, ptr, end); + if (c == -1) { + *nextTokPtr = ptr; + return 0; + } + if (c == ASCII_EQUALS) { + *nameEndPtr = ptr; + break; + } + if (isSpace(c)) { + *nameEndPtr = ptr; + do { + ptr += enc->minBytesPerChar; + } while (isSpace(c = toAscii(enc, ptr, end))); + if (c != ASCII_EQUALS) { + *nextTokPtr = ptr; + return 0; + } + break; + } + ptr += enc->minBytesPerChar; + } + if (ptr == *namePtr) { + *nextTokPtr = ptr; + return 0; + } + ptr += enc->minBytesPerChar; + c = toAscii(enc, ptr, end); + while (isSpace(c)) { + ptr += enc->minBytesPerChar; + c = toAscii(enc, ptr, end); + } + if (c != ASCII_QUOT && c != ASCII_APOS) { + *nextTokPtr = ptr; + return 0; + } + open = (char)c; + ptr += enc->minBytesPerChar; + *valPtr = ptr; + for (;; ptr += enc->minBytesPerChar) { + c = toAscii(enc, ptr, end); + if (c == open) + break; + if (!(ASCII_a <= c && c <= ASCII_z) + && !(ASCII_A <= c && c <= ASCII_Z) + && !(ASCII_0 <= c && c <= ASCII_9) + && c != ASCII_PERIOD + && c != ASCII_MINUS + && c != ASCII_UNDERSCORE) { + *nextTokPtr = ptr; + return 0; + } + } + *nextTokPtr = ptr + enc->minBytesPerChar; + return 1; +} + +static const char KW_version[] = { + ASCII_v, ASCII_e, ASCII_r, ASCII_s, ASCII_i, ASCII_o, ASCII_n, '\0' +}; + +static const char KW_encoding[] = { + ASCII_e, ASCII_n, ASCII_c, ASCII_o, ASCII_d, ASCII_i, ASCII_n, ASCII_g, '\0' +}; + +static const char KW_standalone[] = { + ASCII_s, ASCII_t, ASCII_a, ASCII_n, ASCII_d, ASCII_a, ASCII_l, ASCII_o, + ASCII_n, ASCII_e, '\0' +}; + +static const char KW_yes[] = { + ASCII_y, ASCII_e, ASCII_s, '\0' +}; + +static const char KW_no[] = { + ASCII_n, ASCII_o, '\0' +}; + +static int +doParseXmlDecl(const ENCODING *(*encodingFinder)(const ENCODING *, + const char *, + const char *), + int isGeneralTextEntity, + const ENCODING *enc, + const char *ptr, + const char *end, + const char **badPtr, + const char **versionPtr, + const char **versionEndPtr, + const char **encodingName, + const ENCODING **encoding, + int *standalone) +{ + const char *val = NULL; + const char *name = NULL; + const char *nameEnd = NULL; + ptr += 5 * enc->minBytesPerChar; + end -= 2 * enc->minBytesPerChar; + if (!parsePseudoAttribute(enc, ptr, end, &name, &nameEnd, &val, &ptr) + || !name) { + *badPtr = ptr; + return 0; + } + if (!XmlNameMatchesAscii(enc, name, nameEnd, KW_version)) { + if (!isGeneralTextEntity) { + *badPtr = name; + return 0; + } + } + else { + if (versionPtr) + *versionPtr = val; + if (versionEndPtr) + *versionEndPtr = ptr; + if (!parsePseudoAttribute(enc, ptr, end, &name, &nameEnd, &val, &ptr)) { + *badPtr = ptr; + return 0; + } + if (!name) { + if (isGeneralTextEntity) { + /* a TextDecl must have an EncodingDecl */ + *badPtr = ptr; + return 0; + } + return 1; + } + } + if (XmlNameMatchesAscii(enc, name, nameEnd, KW_encoding)) { + int c = toAscii(enc, val, end); + if (!(ASCII_a <= c && c <= ASCII_z) && !(ASCII_A <= c && c <= ASCII_Z)) { + *badPtr = val; + return 0; + } + if (encodingName) + *encodingName = val; + if (encoding) + *encoding = encodingFinder(enc, val, ptr - enc->minBytesPerChar); + if (!parsePseudoAttribute(enc, ptr, end, &name, &nameEnd, &val, &ptr)) { + *badPtr = ptr; + return 0; + } + if (!name) + return 1; + } + if (!XmlNameMatchesAscii(enc, name, nameEnd, KW_standalone) + || isGeneralTextEntity) { + *badPtr = name; + return 0; + } + if (XmlNameMatchesAscii(enc, val, ptr - enc->minBytesPerChar, KW_yes)) { + if (standalone) + *standalone = 1; + } + else if (XmlNameMatchesAscii(enc, val, ptr - enc->minBytesPerChar, KW_no)) { + if (standalone) + *standalone = 0; + } + else { + *badPtr = val; + return 0; + } + while (isSpace(toAscii(enc, ptr, end))) + ptr += enc->minBytesPerChar; + if (ptr != end) { + *badPtr = ptr; + return 0; + } + return 1; +} + +static int FASTCALL +checkCharRefNumber(int result) +{ + switch (result >> 8) { + case 0xD8: case 0xD9: case 0xDA: case 0xDB: + case 0xDC: case 0xDD: case 0xDE: case 0xDF: + return -1; + case 0: + if (latin1_encoding.type[result] == BT_NONXML) + return -1; + break; + case 0xFF: + if (result == 0xFFFE || result == 0xFFFF) + return -1; + break; + } + return result; +} + +int FASTCALL +XmlUtf8Encode(int c, char *buf) +{ + enum { + /* minN is minimum legal resulting value for N byte sequence */ + min2 = 0x80, + min3 = 0x800, + min4 = 0x10000 + }; + + if (c < 0) + return 0; + if (c < min2) { + buf[0] = (char)(c | UTF8_cval1); + return 1; + } + if (c < min3) { + buf[0] = (char)((c >> 6) | UTF8_cval2); + buf[1] = (char)((c & 0x3f) | 0x80); + return 2; + } + if (c < min4) { + buf[0] = (char)((c >> 12) | UTF8_cval3); + buf[1] = (char)(((c >> 6) & 0x3f) | 0x80); + buf[2] = (char)((c & 0x3f) | 0x80); + return 3; + } + if (c < 0x110000) { + buf[0] = (char)((c >> 18) | UTF8_cval4); + buf[1] = (char)(((c >> 12) & 0x3f) | 0x80); + buf[2] = (char)(((c >> 6) & 0x3f) | 0x80); + buf[3] = (char)((c & 0x3f) | 0x80); + return 4; + } + return 0; +} + +int FASTCALL +XmlUtf16Encode(int charNum, unsigned short *buf) +{ + if (charNum < 0) + return 0; + if (charNum < 0x10000) { + buf[0] = (unsigned short)charNum; + return 1; + } + if (charNum < 0x110000) { + charNum -= 0x10000; + buf[0] = (unsigned short)((charNum >> 10) + 0xD800); + buf[1] = (unsigned short)((charNum & 0x3FF) + 0xDC00); + return 2; + } + return 0; +} + +struct unknown_encoding { + struct normal_encoding normal; + int (*convert)(void *userData, const char *p); + void *userData; + unsigned short utf16[256]; + char utf8[256][4]; +}; + +#define AS_UNKNOWN_ENCODING(enc) ((const struct unknown_encoding *) (enc)) + +int +XmlSizeOfUnknownEncoding(void) +{ + return sizeof(struct unknown_encoding); +} + +static int PTRFASTCALL +unknown_isName(const ENCODING *enc, const char *p) +{ + const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc); + int c = uenc->convert(uenc->userData, p); + if (c & ~0xFFFF) + return 0; + return UCS2_GET_NAMING(namePages, c >> 8, c & 0xFF); +} + +static int PTRFASTCALL +unknown_isNmstrt(const ENCODING *enc, const char *p) +{ + const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc); + int c = uenc->convert(uenc->userData, p); + if (c & ~0xFFFF) + return 0; + return UCS2_GET_NAMING(nmstrtPages, c >> 8, c & 0xFF); +} + +static int PTRFASTCALL +unknown_isInvalid(const ENCODING *enc, const char *p) +{ + const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc); + int c = uenc->convert(uenc->userData, p); + return (c & ~0xFFFF) || checkCharRefNumber(c) < 0; +} + +static void PTRCALL +unknown_toUtf8(const ENCODING *enc, + const char **fromP, const char *fromLim, + char **toP, const char *toLim) +{ + const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc); + char buf[XML_UTF8_ENCODE_MAX]; + for (;;) { + const char *utf8; + int n; + if (*fromP == fromLim) + break; + utf8 = uenc->utf8[(unsigned char)**fromP]; + n = *utf8++; + if (n == 0) { + int c = uenc->convert(uenc->userData, *fromP); + n = XmlUtf8Encode(c, buf); + if (n > toLim - *toP) + break; + utf8 = buf; + *fromP += (AS_NORMAL_ENCODING(enc)->type[(unsigned char)**fromP] + - (BT_LEAD2 - 2)); + } + else { + if (n > toLim - *toP) + break; + (*fromP)++; + } + do { + *(*toP)++ = *utf8++; + } while (--n != 0); + } +} + +static void PTRCALL +unknown_toUtf16(const ENCODING *enc, + const char **fromP, const char *fromLim, + unsigned short **toP, const unsigned short *toLim) +{ + const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc); + while (*fromP != fromLim && *toP != toLim) { + unsigned short c = uenc->utf16[(unsigned char)**fromP]; + if (c == 0) { + c = (unsigned short) + uenc->convert(uenc->userData, *fromP); + *fromP += (AS_NORMAL_ENCODING(enc)->type[(unsigned char)**fromP] + - (BT_LEAD2 - 2)); + } + else + (*fromP)++; + *(*toP)++ = c; + } +} + +ENCODING * +XmlInitUnknownEncoding(void *mem, + int *table, + CONVERTER convert, + void *userData) +{ + int i; + struct unknown_encoding *e = (struct unknown_encoding *)mem; + for (i = 0; i < (int)sizeof(struct normal_encoding); i++) + ((char *)mem)[i] = ((char *)&latin1_encoding)[i]; + for (i = 0; i < 128; i++) + if (latin1_encoding.type[i] != BT_OTHER + && latin1_encoding.type[i] != BT_NONXML + && table[i] != i) + return 0; + for (i = 0; i < 256; i++) { + int c = table[i]; + if (c == -1) { + e->normal.type[i] = BT_MALFORM; + /* This shouldn't really get used. */ + e->utf16[i] = 0xFFFF; + e->utf8[i][0] = 1; + e->utf8[i][1] = 0; + } + else if (c < 0) { + if (c < -4) + return 0; + e->normal.type[i] = (unsigned char)(BT_LEAD2 - (c + 2)); + e->utf8[i][0] = 0; + e->utf16[i] = 0; + } + else if (c < 0x80) { + if (latin1_encoding.type[c] != BT_OTHER + && latin1_encoding.type[c] != BT_NONXML + && c != i) + return 0; + e->normal.type[i] = latin1_encoding.type[c]; + e->utf8[i][0] = 1; + e->utf8[i][1] = (char)c; + e->utf16[i] = (unsigned short)(c == 0 ? 0xFFFF : c); + } + else if (checkCharRefNumber(c) < 0) { + e->normal.type[i] = BT_NONXML; + /* This shouldn't really get used. */ + e->utf16[i] = 0xFFFF; + e->utf8[i][0] = 1; + e->utf8[i][1] = 0; + } + else { + if (c > 0xFFFF) + return 0; + if (UCS2_GET_NAMING(nmstrtPages, c >> 8, c & 0xff)) + e->normal.type[i] = BT_NMSTRT; + else if (UCS2_GET_NAMING(namePages, c >> 8, c & 0xff)) + e->normal.type[i] = BT_NAME; + else + e->normal.type[i] = BT_OTHER; + e->utf8[i][0] = (char)XmlUtf8Encode(c, e->utf8[i] + 1); + e->utf16[i] = (unsigned short)c; + } + } + e->userData = userData; + e->convert = convert; + if (convert) { + e->normal.isName2 = unknown_isName; + e->normal.isName3 = unknown_isName; + e->normal.isName4 = unknown_isName; + e->normal.isNmstrt2 = unknown_isNmstrt; + e->normal.isNmstrt3 = unknown_isNmstrt; + e->normal.isNmstrt4 = unknown_isNmstrt; + e->normal.isInvalid2 = unknown_isInvalid; + e->normal.isInvalid3 = unknown_isInvalid; + e->normal.isInvalid4 = unknown_isInvalid; + } + e->normal.enc.utf8Convert = unknown_toUtf8; + e->normal.enc.utf16Convert = unknown_toUtf16; + return &(e->normal.enc); +} + +/* If this enumeration is changed, getEncodingIndex and encodings +must also be changed. */ +enum { + UNKNOWN_ENC = -1, + ISO_8859_1_ENC = 0, + US_ASCII_ENC, + UTF_8_ENC, + UTF_16_ENC, + UTF_16BE_ENC, + UTF_16LE_ENC, + /* must match encodingNames up to here */ + NO_ENC +}; + +static const char KW_ISO_8859_1[] = { + ASCII_I, ASCII_S, ASCII_O, ASCII_MINUS, ASCII_8, ASCII_8, ASCII_5, ASCII_9, + ASCII_MINUS, ASCII_1, '\0' +}; +static const char KW_US_ASCII[] = { + ASCII_U, ASCII_S, ASCII_MINUS, ASCII_A, ASCII_S, ASCII_C, ASCII_I, ASCII_I, + '\0' +}; +static const char KW_UTF_8[] = { + ASCII_U, ASCII_T, ASCII_F, ASCII_MINUS, ASCII_8, '\0' +}; +static const char KW_UTF_16[] = { + ASCII_U, ASCII_T, ASCII_F, ASCII_MINUS, ASCII_1, ASCII_6, '\0' +}; +static const char KW_UTF_16BE[] = { + ASCII_U, ASCII_T, ASCII_F, ASCII_MINUS, ASCII_1, ASCII_6, ASCII_B, ASCII_E, + '\0' +}; +static const char KW_UTF_16LE[] = { + ASCII_U, ASCII_T, ASCII_F, ASCII_MINUS, ASCII_1, ASCII_6, ASCII_L, ASCII_E, + '\0' +}; + +static int FASTCALL +getEncodingIndex(const char *name) +{ + static const char *encodingNames[] = { + KW_ISO_8859_1, + KW_US_ASCII, + KW_UTF_8, + KW_UTF_16, + KW_UTF_16BE, + KW_UTF_16LE, + }; + int i; + if (name == NULL) + return NO_ENC; + for (i = 0; i < (int)(sizeof(encodingNames)/sizeof(encodingNames[0])); i++) + if (streqci(name, encodingNames[i])) + return i; + return UNKNOWN_ENC; +} + +/* For binary compatibility, we store the index of the encoding + specified at initialization in the isUtf16 member. +*/ + +#define INIT_ENC_INDEX(enc) ((int)(enc)->initEnc.isUtf16) +#define SET_INIT_ENC_INDEX(enc, i) ((enc)->initEnc.isUtf16 = (char)i) + +/* This is what detects the encoding. encodingTable maps from + encoding indices to encodings; INIT_ENC_INDEX(enc) is the index of + the external (protocol) specified encoding; state is + XML_CONTENT_STATE if we're parsing an external text entity, and + XML_PROLOG_STATE otherwise. +*/ + + +static int +initScan(const ENCODING **encodingTable, + const INIT_ENCODING *enc, + int state, + const char *ptr, + const char *end, + const char **nextTokPtr) +{ + const ENCODING **encPtr; + + if (ptr == end) + return XML_TOK_NONE; + encPtr = enc->encPtr; + if (ptr + 1 == end) { + /* only a single byte available for auto-detection */ +#ifndef XML_DTD /* FIXME */ + /* a well-formed document entity must have more than one byte */ + if (state != XML_CONTENT_STATE) + return XML_TOK_PARTIAL; +#endif + /* so we're parsing an external text entity... */ + /* if UTF-16 was externally specified, then we need at least 2 bytes */ + switch (INIT_ENC_INDEX(enc)) { + case UTF_16_ENC: + case UTF_16LE_ENC: + case UTF_16BE_ENC: + return XML_TOK_PARTIAL; + } + switch ((unsigned char)*ptr) { + case 0xFE: + case 0xFF: + case 0xEF: /* possibly first byte of UTF-8 BOM */ + if (INIT_ENC_INDEX(enc) == ISO_8859_1_ENC + && state == XML_CONTENT_STATE) + break; + /* fall through */ + case 0x00: + case 0x3C: + return XML_TOK_PARTIAL; + } + } + else { + switch (((unsigned char)ptr[0] << 8) | (unsigned char)ptr[1]) { + case 0xFEFF: + if (INIT_ENC_INDEX(enc) == ISO_8859_1_ENC + && state == XML_CONTENT_STATE) + break; + *nextTokPtr = ptr + 2; + *encPtr = encodingTable[UTF_16BE_ENC]; + return XML_TOK_BOM; + /* 00 3C is handled in the default case */ + case 0x3C00: + if ((INIT_ENC_INDEX(enc) == UTF_16BE_ENC + || INIT_ENC_INDEX(enc) == UTF_16_ENC) + && state == XML_CONTENT_STATE) + break; + *encPtr = encodingTable[UTF_16LE_ENC]; + return XmlTok(*encPtr, state, ptr, end, nextTokPtr); + case 0xFFFE: + if (INIT_ENC_INDEX(enc) == ISO_8859_1_ENC + && state == XML_CONTENT_STATE) + break; + *nextTokPtr = ptr + 2; + *encPtr = encodingTable[UTF_16LE_ENC]; + return XML_TOK_BOM; + case 0xEFBB: + /* Maybe a UTF-8 BOM (EF BB BF) */ + /* If there's an explicitly specified (external) encoding + of ISO-8859-1 or some flavour of UTF-16 + and this is an external text entity, + don't look for the BOM, + because it might be a legal data. + */ + if (state == XML_CONTENT_STATE) { + int e = INIT_ENC_INDEX(enc); + if (e == ISO_8859_1_ENC || e == UTF_16BE_ENC + || e == UTF_16LE_ENC || e == UTF_16_ENC) + break; + } + if (ptr + 2 == end) + return XML_TOK_PARTIAL; + if ((unsigned char)ptr[2] == 0xBF) { + *nextTokPtr = ptr + 3; + *encPtr = encodingTable[UTF_8_ENC]; + return XML_TOK_BOM; + } + break; + default: + if (ptr[0] == '\0') { + /* 0 isn't a legal data character. Furthermore a document + entity can only start with ASCII characters. So the only + way this can fail to be big-endian UTF-16 if it it's an + external parsed general entity that's labelled as + UTF-16LE. + */ + if (state == XML_CONTENT_STATE && INIT_ENC_INDEX(enc) == UTF_16LE_ENC) + break; + *encPtr = encodingTable[UTF_16BE_ENC]; + return XmlTok(*encPtr, state, ptr, end, nextTokPtr); + } + else if (ptr[1] == '\0') { + /* We could recover here in the case: + - parsing an external entity + - second byte is 0 + - no externally specified encoding + - no encoding declaration + by assuming UTF-16LE. But we don't, because this would mean when + presented just with a single byte, we couldn't reliably determine + whether we needed further bytes. + */ + if (state == XML_CONTENT_STATE) + break; + *encPtr = encodingTable[UTF_16LE_ENC]; + return XmlTok(*encPtr, state, ptr, end, nextTokPtr); + } + break; + } + } + *encPtr = encodingTable[INIT_ENC_INDEX(enc)]; + return XmlTok(*encPtr, state, ptr, end, nextTokPtr); +} + + +#define NS(x) x +#define ns(x) x +#include "xmltok_ns.c" +#undef NS +#undef ns + +#ifdef XML_NS + +#define NS(x) x ## NS +#define ns(x) x ## _ns + +#include "xmltok_ns.c" + +#undef NS +#undef ns + +ENCODING * +XmlInitUnknownEncodingNS(void *mem, + int *table, + CONVERTER convert, + void *userData) +{ + ENCODING *enc = XmlInitUnknownEncoding(mem, table, convert, userData); + if (enc) + ((struct normal_encoding *)enc)->type[ASCII_COLON] = BT_COLON; + return enc; +} + +#endif /* XML_NS */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xmltok.h b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xmltok.h new file mode 100644 index 00000000..3d776be7 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xmltok.h @@ -0,0 +1,315 @@ +/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd + See the file COPYING for copying permission. +*/ + +#ifndef XmlTok_INCLUDED +#define XmlTok_INCLUDED 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/* The following token may be returned by XmlContentTok */ +#define XML_TOK_TRAILING_RSQB -5 /* ] or ]] at the end of the scan; might be + start of illegal ]]> sequence */ +/* The following tokens may be returned by both XmlPrologTok and + XmlContentTok. +*/ +#define XML_TOK_NONE -4 /* The string to be scanned is empty */ +#define XML_TOK_TRAILING_CR -3 /* A CR at the end of the scan; + might be part of CRLF sequence */ +#define XML_TOK_PARTIAL_CHAR -2 /* only part of a multibyte sequence */ +#define XML_TOK_PARTIAL -1 /* only part of a token */ +#define XML_TOK_INVALID 0 + +/* The following tokens are returned by XmlContentTok; some are also + returned by XmlAttributeValueTok, XmlEntityTok, XmlCdataSectionTok. +*/ +#define XML_TOK_START_TAG_WITH_ATTS 1 +#define XML_TOK_START_TAG_NO_ATTS 2 +#define XML_TOK_EMPTY_ELEMENT_WITH_ATTS 3 /* empty element tag */ +#define XML_TOK_EMPTY_ELEMENT_NO_ATTS 4 +#define XML_TOK_END_TAG 5 +#define XML_TOK_DATA_CHARS 6 +#define XML_TOK_DATA_NEWLINE 7 +#define XML_TOK_CDATA_SECT_OPEN 8 +#define XML_TOK_ENTITY_REF 9 +#define XML_TOK_CHAR_REF 10 /* numeric character reference */ + +/* The following tokens may be returned by both XmlPrologTok and + XmlContentTok. +*/ +#define XML_TOK_PI 11 /* processing instruction */ +#define XML_TOK_XML_DECL 12 /* XML decl or text decl */ +#define XML_TOK_COMMENT 13 +#define XML_TOK_BOM 14 /* Byte order mark */ + +/* The following tokens are returned only by XmlPrologTok */ +#define XML_TOK_PROLOG_S 15 +#define XML_TOK_DECL_OPEN 16 /* */ +#define XML_TOK_NAME 18 +#define XML_TOK_NMTOKEN 19 +#define XML_TOK_POUND_NAME 20 /* #name */ +#define XML_TOK_OR 21 /* | */ +#define XML_TOK_PERCENT 22 +#define XML_TOK_OPEN_PAREN 23 +#define XML_TOK_CLOSE_PAREN 24 +#define XML_TOK_OPEN_BRACKET 25 +#define XML_TOK_CLOSE_BRACKET 26 +#define XML_TOK_LITERAL 27 +#define XML_TOK_PARAM_ENTITY_REF 28 +#define XML_TOK_INSTANCE_START 29 + +/* The following occur only in element type declarations */ +#define XML_TOK_NAME_QUESTION 30 /* name? */ +#define XML_TOK_NAME_ASTERISK 31 /* name* */ +#define XML_TOK_NAME_PLUS 32 /* name+ */ +#define XML_TOK_COND_SECT_OPEN 33 /* */ +#define XML_TOK_CLOSE_PAREN_QUESTION 35 /* )? */ +#define XML_TOK_CLOSE_PAREN_ASTERISK 36 /* )* */ +#define XML_TOK_CLOSE_PAREN_PLUS 37 /* )+ */ +#define XML_TOK_COMMA 38 + +/* The following token is returned only by XmlAttributeValueTok */ +#define XML_TOK_ATTRIBUTE_VALUE_S 39 + +/* The following token is returned only by XmlCdataSectionTok */ +#define XML_TOK_CDATA_SECT_CLOSE 40 + +/* With namespace processing this is returned by XmlPrologTok for a + name with a colon. +*/ +#define XML_TOK_PREFIXED_NAME 41 + +#ifdef XML_DTD +#define XML_TOK_IGNORE_SECT 42 +#endif /* XML_DTD */ + +#ifdef XML_DTD +#define XML_N_STATES 4 +#else /* not XML_DTD */ +#define XML_N_STATES 3 +#endif /* not XML_DTD */ + +#define XML_PROLOG_STATE 0 +#define XML_CONTENT_STATE 1 +#define XML_CDATA_SECTION_STATE 2 +#ifdef XML_DTD +#define XML_IGNORE_SECTION_STATE 3 +#endif /* XML_DTD */ + +#define XML_N_LITERAL_TYPES 2 +#define XML_ATTRIBUTE_VALUE_LITERAL 0 +#define XML_ENTITY_VALUE_LITERAL 1 + +/* The size of the buffer passed to XmlUtf8Encode must be at least this. */ +#define XML_UTF8_ENCODE_MAX 4 +/* The size of the buffer passed to XmlUtf16Encode must be at least this. */ +#define XML_UTF16_ENCODE_MAX 2 + +typedef struct position { + /* first line and first column are 0 not 1 */ + unsigned long lineNumber; + unsigned long columnNumber; +} POSITION; + +typedef struct { + const char *name; + const char *valuePtr; + const char *valueEnd; + char normalized; +} ATTRIBUTE; + +struct encoding; +typedef struct encoding ENCODING; + +typedef int (PTRCALL *SCANNER)(const ENCODING *, + const char *, + const char *, + const char **); + +struct encoding { + SCANNER scanners[XML_N_STATES]; + SCANNER literalScanners[XML_N_LITERAL_TYPES]; + int (PTRCALL *sameName)(const ENCODING *, + const char *, + const char *); + int (PTRCALL *nameMatchesAscii)(const ENCODING *, + const char *, + const char *, + const char *); + int (PTRFASTCALL *nameLength)(const ENCODING *, const char *); + const char *(PTRFASTCALL *skipS)(const ENCODING *, const char *); + int (PTRCALL *getAtts)(const ENCODING *enc, + const char *ptr, + int attsMax, + ATTRIBUTE *atts); + int (PTRFASTCALL *charRefNumber)(const ENCODING *enc, const char *ptr); + int (PTRCALL *predefinedEntityName)(const ENCODING *, + const char *, + const char *); + void (PTRCALL *updatePosition)(const ENCODING *, + const char *ptr, + const char *end, + POSITION *); + int (PTRCALL *isPublicId)(const ENCODING *enc, + const char *ptr, + const char *end, + const char **badPtr); + void (PTRCALL *utf8Convert)(const ENCODING *enc, + const char **fromP, + const char *fromLim, + char **toP, + const char *toLim); + void (PTRCALL *utf16Convert)(const ENCODING *enc, + const char **fromP, + const char *fromLim, + unsigned short **toP, + const unsigned short *toLim); + int minBytesPerChar; + char isUtf8; + char isUtf16; +}; + +/* Scan the string starting at ptr until the end of the next complete + token, but do not scan past eptr. Return an integer giving the + type of token. + + Return XML_TOK_NONE when ptr == eptr; nextTokPtr will not be set. + + Return XML_TOK_PARTIAL when the string does not contain a complete + token; nextTokPtr will not be set. + + Return XML_TOK_INVALID when the string does not start a valid + token; nextTokPtr will be set to point to the character which made + the token invalid. + + Otherwise the string starts with a valid token; nextTokPtr will be + set to point to the character following the end of that token. + + Each data character counts as a single token, but adjacent data + characters may be returned together. Similarly for characters in + the prolog outside literals, comments and processing instructions. +*/ + + +#define XmlTok(enc, state, ptr, end, nextTokPtr) \ + (((enc)->scanners[state])(enc, ptr, end, nextTokPtr)) + +#define XmlPrologTok(enc, ptr, end, nextTokPtr) \ + XmlTok(enc, XML_PROLOG_STATE, ptr, end, nextTokPtr) + +#define XmlContentTok(enc, ptr, end, nextTokPtr) \ + XmlTok(enc, XML_CONTENT_STATE, ptr, end, nextTokPtr) + +#define XmlCdataSectionTok(enc, ptr, end, nextTokPtr) \ + XmlTok(enc, XML_CDATA_SECTION_STATE, ptr, end, nextTokPtr) + +#ifdef XML_DTD + +#define XmlIgnoreSectionTok(enc, ptr, end, nextTokPtr) \ + XmlTok(enc, XML_IGNORE_SECTION_STATE, ptr, end, nextTokPtr) + +#endif /* XML_DTD */ + +/* This is used for performing a 2nd-level tokenization on the content + of a literal that has already been returned by XmlTok. +*/ +#define XmlLiteralTok(enc, literalType, ptr, end, nextTokPtr) \ + (((enc)->literalScanners[literalType])(enc, ptr, end, nextTokPtr)) + +#define XmlAttributeValueTok(enc, ptr, end, nextTokPtr) \ + XmlLiteralTok(enc, XML_ATTRIBUTE_VALUE_LITERAL, ptr, end, nextTokPtr) + +#define XmlEntityValueTok(enc, ptr, end, nextTokPtr) \ + XmlLiteralTok(enc, XML_ENTITY_VALUE_LITERAL, ptr, end, nextTokPtr) + +#define XmlSameName(enc, ptr1, ptr2) (((enc)->sameName)(enc, ptr1, ptr2)) + +#define XmlNameMatchesAscii(enc, ptr1, end1, ptr2) \ + (((enc)->nameMatchesAscii)(enc, ptr1, end1, ptr2)) + +#define XmlNameLength(enc, ptr) \ + (((enc)->nameLength)(enc, ptr)) + +#define XmlSkipS(enc, ptr) \ + (((enc)->skipS)(enc, ptr)) + +#define XmlGetAttributes(enc, ptr, attsMax, atts) \ + (((enc)->getAtts)(enc, ptr, attsMax, atts)) + +#define XmlCharRefNumber(enc, ptr) \ + (((enc)->charRefNumber)(enc, ptr)) + +#define XmlPredefinedEntityName(enc, ptr, end) \ + (((enc)->predefinedEntityName)(enc, ptr, end)) + +#define XmlUpdatePosition(enc, ptr, end, pos) \ + (((enc)->updatePosition)(enc, ptr, end, pos)) + +#define XmlIsPublicId(enc, ptr, end, badPtr) \ + (((enc)->isPublicId)(enc, ptr, end, badPtr)) + +#define XmlUtf8Convert(enc, fromP, fromLim, toP, toLim) \ + (((enc)->utf8Convert)(enc, fromP, fromLim, toP, toLim)) + +#define XmlUtf16Convert(enc, fromP, fromLim, toP, toLim) \ + (((enc)->utf16Convert)(enc, fromP, fromLim, toP, toLim)) + +typedef struct { + ENCODING initEnc; + const ENCODING **encPtr; +} INIT_ENCODING; + +int XmlParseXmlDecl(int isGeneralTextEntity, + const ENCODING *enc, + const char *ptr, + const char *end, + const char **badPtr, + const char **versionPtr, + const char **versionEndPtr, + const char **encodingNamePtr, + const ENCODING **namedEncodingPtr, + int *standalonePtr); + +int XmlInitEncoding(INIT_ENCODING *, const ENCODING **, const char *name); +const ENCODING *XmlGetUtf8InternalEncoding(void); +const ENCODING *XmlGetUtf16InternalEncoding(void); +int FASTCALL XmlUtf8Encode(int charNumber, char *buf); +int FASTCALL XmlUtf16Encode(int charNumber, unsigned short *buf); +int XmlSizeOfUnknownEncoding(void); + +typedef int (*CONVERTER)(void *userData, const char *p); + +ENCODING * +XmlInitUnknownEncoding(void *mem, + int *table, + CONVERTER convert, + void *userData); + +int XmlParseXmlDeclNS(int isGeneralTextEntity, + const ENCODING *enc, + const char *ptr, + const char *end, + const char **badPtr, + const char **versionPtr, + const char **versionEndPtr, + const char **encodingNamePtr, + const ENCODING **namedEncodingPtr, + int *standalonePtr); + +int XmlInitEncodingNS(INIT_ENCODING *, const ENCODING **, const char *name); +const ENCODING *XmlGetUtf8InternalEncodingNS(void); +const ENCODING *XmlGetUtf16InternalEncodingNS(void); +ENCODING * +XmlInitUnknownEncodingNS(void *mem, + int *table, + CONVERTER convert, + void *userData); +#ifdef __cplusplus +} +#endif + +#endif /* not XmlTok_INCLUDED */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xmltok.lo b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xmltok.lo new file mode 100644 index 00000000..8522abf9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xmltok.lo @@ -0,0 +1,12 @@ +# lib/xmltok.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/xmltok.o' + +# Name of the non-PIC object. +non_pic_object='xmltok.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xmltok.o b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xmltok.o new file mode 100644 index 0000000000000000000000000000000000000000..28b8cf9483d418445febe0530eb91f2a9df95690 GIT binary patch literal 443464 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 */ + switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) { + case BT_S: case BT_CR: case BT_LF: case BT_PERCNT: + *nextTokPtr = ptr; + return XML_TOK_INVALID; + } + /* fall through */ + case BT_S: case BT_CR: case BT_LF: + *nextTokPtr = ptr; + return XML_TOK_DECL_OPEN; + case BT_NMSTRT: + case BT_HEX: + ptr += MINBPC(enc); + break; + default: + *nextTokPtr = ptr; + return XML_TOK_INVALID; + } + } + return XML_TOK_PARTIAL; +} + +static int PTRCALL +PREFIX(checkPiTarget)(const ENCODING *enc, const char *ptr, + const char *end, int *tokPtr) +{ + int upper = 0; + *tokPtr = XML_TOK_PI; + if (end - ptr != MINBPC(enc)*3) + return 1; + switch (BYTE_TO_ASCII(enc, ptr)) { + case ASCII_x: + break; + case ASCII_X: + upper = 1; + break; + default: + return 1; + } + ptr += MINBPC(enc); + switch (BYTE_TO_ASCII(enc, ptr)) { + case ASCII_m: + break; + case ASCII_M: + upper = 1; + break; + default: + return 1; + } + ptr += MINBPC(enc); + switch (BYTE_TO_ASCII(enc, ptr)) { + case ASCII_l: + break; + case ASCII_L: + upper = 1; + break; + default: + return 1; + } + if (upper) + return 0; + *tokPtr = XML_TOK_XML_DECL; + return 1; +} + +/* ptr points to character following " 1) { + size_t n = end - ptr; + if (n & (MINBPC(enc) - 1)) { + n &= ~(MINBPC(enc) - 1); + if (n == 0) + return XML_TOK_PARTIAL; + end = ptr + n; + } + } + switch (BYTE_TYPE(enc, ptr)) { + case BT_RSQB: + ptr += MINBPC(enc); + if (ptr == end) + return XML_TOK_PARTIAL; + if (!CHAR_MATCHES(enc, ptr, ASCII_RSQB)) + break; + ptr += MINBPC(enc); + if (ptr == end) + return XML_TOK_PARTIAL; + if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) { + ptr -= MINBPC(enc); + break; + } + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_CDATA_SECT_CLOSE; + case BT_CR: + ptr += MINBPC(enc); + if (ptr == end) + return XML_TOK_PARTIAL; + if (BYTE_TYPE(enc, ptr) == BT_LF) + ptr += MINBPC(enc); + *nextTokPtr = ptr; + return XML_TOK_DATA_NEWLINE; + case BT_LF: + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_DATA_NEWLINE; + INVALID_CASES(ptr, nextTokPtr) + default: + ptr += MINBPC(enc); + break; + } + while (ptr != end) { + switch (BYTE_TYPE(enc, ptr)) { +#define LEAD_CASE(n) \ + case BT_LEAD ## n: \ + if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) { \ + *nextTokPtr = ptr; \ + return XML_TOK_DATA_CHARS; \ + } \ + ptr += n; \ + break; + LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) +#undef LEAD_CASE + case BT_NONXML: + case BT_MALFORM: + case BT_TRAIL: + case BT_CR: + case BT_LF: + case BT_RSQB: + *nextTokPtr = ptr; + return XML_TOK_DATA_CHARS; + default: + ptr += MINBPC(enc); + break; + } + } + *nextTokPtr = ptr; + return XML_TOK_DATA_CHARS; +} + +/* ptr points to character following " 1) { + size_t n = end - ptr; + if (n & (MINBPC(enc) - 1)) { + n &= ~(MINBPC(enc) - 1); + if (n == 0) + return XML_TOK_PARTIAL; + end = ptr + n; + } + } + switch (BYTE_TYPE(enc, ptr)) { + case BT_LT: + return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr); + case BT_AMP: + return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr); + case BT_CR: + ptr += MINBPC(enc); + if (ptr == end) + return XML_TOK_TRAILING_CR; + if (BYTE_TYPE(enc, ptr) == BT_LF) + ptr += MINBPC(enc); + *nextTokPtr = ptr; + return XML_TOK_DATA_NEWLINE; + case BT_LF: + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_DATA_NEWLINE; + case BT_RSQB: + ptr += MINBPC(enc); + if (ptr == end) + return XML_TOK_TRAILING_RSQB; + if (!CHAR_MATCHES(enc, ptr, ASCII_RSQB)) + break; + ptr += MINBPC(enc); + if (ptr == end) + return XML_TOK_TRAILING_RSQB; + if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) { + ptr -= MINBPC(enc); + break; + } + *nextTokPtr = ptr; + return XML_TOK_INVALID; + INVALID_CASES(ptr, nextTokPtr) + default: + ptr += MINBPC(enc); + break; + } + while (ptr != end) { + switch (BYTE_TYPE(enc, ptr)) { +#define LEAD_CASE(n) \ + case BT_LEAD ## n: \ + if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) { \ + *nextTokPtr = ptr; \ + return XML_TOK_DATA_CHARS; \ + } \ + ptr += n; \ + break; + LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) +#undef LEAD_CASE + case BT_RSQB: + if (ptr + MINBPC(enc) != end) { + if (!CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) { + ptr += MINBPC(enc); + break; + } + if (ptr + 2*MINBPC(enc) != end) { + if (!CHAR_MATCHES(enc, ptr + 2*MINBPC(enc), ASCII_GT)) { + ptr += MINBPC(enc); + break; + } + *nextTokPtr = ptr + 2*MINBPC(enc); + return XML_TOK_INVALID; + } + } + /* fall through */ + case BT_AMP: + case BT_LT: + case BT_NONXML: + case BT_MALFORM: + case BT_TRAIL: + case BT_CR: + case BT_LF: + *nextTokPtr = ptr; + return XML_TOK_DATA_CHARS; + default: + ptr += MINBPC(enc); + break; + } + } + *nextTokPtr = ptr; + return XML_TOK_DATA_CHARS; +} + +/* ptr points to character following "%" */ + +static int PTRCALL +PREFIX(scanPercent)(const ENCODING *enc, const char *ptr, const char *end, + const char **nextTokPtr) +{ + if (ptr == end) + return -XML_TOK_PERCENT; + switch (BYTE_TYPE(enc, ptr)) { + CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) + case BT_S: case BT_LF: case BT_CR: case BT_PERCNT: + *nextTokPtr = ptr; + return XML_TOK_PERCENT; + default: + *nextTokPtr = ptr; + return XML_TOK_INVALID; + } + while (ptr != end) { + switch (BYTE_TYPE(enc, ptr)) { + CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) + case BT_SEMI: + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_PARAM_ENTITY_REF; + default: + *nextTokPtr = ptr; + return XML_TOK_INVALID; + } + } + return XML_TOK_PARTIAL; +} + +static int PTRCALL +PREFIX(scanPoundName)(const ENCODING *enc, const char *ptr, const char *end, + const char **nextTokPtr) +{ + if (ptr == end) + return XML_TOK_PARTIAL; + switch (BYTE_TYPE(enc, ptr)) { + CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) + default: + *nextTokPtr = ptr; + return XML_TOK_INVALID; + } + while (ptr != end) { + switch (BYTE_TYPE(enc, ptr)) { + CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) + case BT_CR: case BT_LF: case BT_S: + case BT_RPAR: case BT_GT: case BT_PERCNT: case BT_VERBAR: + *nextTokPtr = ptr; + return XML_TOK_POUND_NAME; + default: + *nextTokPtr = ptr; + return XML_TOK_INVALID; + } + } + return -XML_TOK_POUND_NAME; +} + +static int PTRCALL +PREFIX(scanLit)(int open, const ENCODING *enc, + const char *ptr, const char *end, + const char **nextTokPtr) +{ + while (ptr != end) { + int t = BYTE_TYPE(enc, ptr); + switch (t) { + INVALID_CASES(ptr, nextTokPtr) + case BT_QUOT: + case BT_APOS: + ptr += MINBPC(enc); + if (t != open) + break; + if (ptr == end) + return -XML_TOK_LITERAL; + *nextTokPtr = ptr; + switch (BYTE_TYPE(enc, ptr)) { + case BT_S: case BT_CR: case BT_LF: + case BT_GT: case BT_PERCNT: case BT_LSQB: + return XML_TOK_LITERAL; + default: + return XML_TOK_INVALID; + } + default: + ptr += MINBPC(enc); + break; + } + } + return XML_TOK_PARTIAL; +} + +static int PTRCALL +PREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end, + const char **nextTokPtr) +{ + int tok; + if (ptr == end) + return XML_TOK_NONE; + if (MINBPC(enc) > 1) { + size_t n = end - ptr; + if (n & (MINBPC(enc) - 1)) { + n &= ~(MINBPC(enc) - 1); + if (n == 0) + return XML_TOK_PARTIAL; + end = ptr + n; + } + } + switch (BYTE_TYPE(enc, ptr)) { + case BT_QUOT: + return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr); + case BT_APOS: + return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr); + case BT_LT: + { + ptr += MINBPC(enc); + if (ptr == end) + return XML_TOK_PARTIAL; + switch (BYTE_TYPE(enc, ptr)) { + case BT_EXCL: + return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr); + case BT_QUEST: + return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr); + case BT_NMSTRT: + case BT_HEX: + case BT_NONASCII: + case BT_LEAD2: + case BT_LEAD3: + case BT_LEAD4: + *nextTokPtr = ptr - MINBPC(enc); + return XML_TOK_INSTANCE_START; + } + *nextTokPtr = ptr; + return XML_TOK_INVALID; + } + case BT_CR: + if (ptr + MINBPC(enc) == end) { + *nextTokPtr = end; + /* indicate that this might be part of a CR/LF pair */ + return -XML_TOK_PROLOG_S; + } + /* fall through */ + case BT_S: case BT_LF: + for (;;) { + ptr += MINBPC(enc); + if (ptr == end) + break; + switch (BYTE_TYPE(enc, ptr)) { + case BT_S: case BT_LF: + break; + case BT_CR: + /* don't split CR/LF pair */ + if (ptr + MINBPC(enc) != end) + break; + /* fall through */ + default: + *nextTokPtr = ptr; + return XML_TOK_PROLOG_S; + } + } + *nextTokPtr = ptr; + return XML_TOK_PROLOG_S; + case BT_PERCNT: + return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr); + case BT_COMMA: + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_COMMA; + case BT_LSQB: + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_OPEN_BRACKET; + case BT_RSQB: + ptr += MINBPC(enc); + if (ptr == end) + return -XML_TOK_CLOSE_BRACKET; + if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) { + if (ptr + MINBPC(enc) == end) + return XML_TOK_PARTIAL; + if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) { + *nextTokPtr = ptr + 2*MINBPC(enc); + return XML_TOK_COND_SECT_CLOSE; + } + } + *nextTokPtr = ptr; + return XML_TOK_CLOSE_BRACKET; + case BT_LPAR: + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_OPEN_PAREN; + case BT_RPAR: + ptr += MINBPC(enc); + if (ptr == end) + return -XML_TOK_CLOSE_PAREN; + switch (BYTE_TYPE(enc, ptr)) { + case BT_AST: + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_CLOSE_PAREN_ASTERISK; + case BT_QUEST: + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_CLOSE_PAREN_QUESTION; + case BT_PLUS: + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_CLOSE_PAREN_PLUS; + case BT_CR: case BT_LF: case BT_S: + case BT_GT: case BT_COMMA: case BT_VERBAR: + case BT_RPAR: + *nextTokPtr = ptr; + return XML_TOK_CLOSE_PAREN; + } + *nextTokPtr = ptr; + return XML_TOK_INVALID; + case BT_VERBAR: + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_OR; + case BT_GT: + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_DECL_CLOSE; + case BT_NUM: + return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr); +#define LEAD_CASE(n) \ + case BT_LEAD ## n: \ + if (end - ptr < n) \ + return XML_TOK_PARTIAL_CHAR; \ + if (IS_NMSTRT_CHAR(enc, ptr, n)) { \ + ptr += n; \ + tok = XML_TOK_NAME; \ + break; \ + } \ + if (IS_NAME_CHAR(enc, ptr, n)) { \ + ptr += n; \ + tok = XML_TOK_NMTOKEN; \ + break; \ + } \ + *nextTokPtr = ptr; \ + return XML_TOK_INVALID; + LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) +#undef LEAD_CASE + case BT_NMSTRT: + case BT_HEX: + tok = XML_TOK_NAME; + ptr += MINBPC(enc); + break; + case BT_DIGIT: + case BT_NAME: + case BT_MINUS: +#ifdef XML_NS + case BT_COLON: +#endif + tok = XML_TOK_NMTOKEN; + ptr += MINBPC(enc); + break; + case BT_NONASCII: + if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) { + ptr += MINBPC(enc); + tok = XML_TOK_NAME; + break; + } + if (IS_NAME_CHAR_MINBPC(enc, ptr)) { + ptr += MINBPC(enc); + tok = XML_TOK_NMTOKEN; + break; + } + /* fall through */ + default: + *nextTokPtr = ptr; + return XML_TOK_INVALID; + } + while (ptr != end) { + switch (BYTE_TYPE(enc, ptr)) { + CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) + case BT_GT: case BT_RPAR: case BT_COMMA: + case BT_VERBAR: case BT_LSQB: case BT_PERCNT: + case BT_S: case BT_CR: case BT_LF: + *nextTokPtr = ptr; + return tok; +#ifdef XML_NS + case BT_COLON: + ptr += MINBPC(enc); + switch (tok) { + case XML_TOK_NAME: + if (ptr == end) + return XML_TOK_PARTIAL; + tok = XML_TOK_PREFIXED_NAME; + switch (BYTE_TYPE(enc, ptr)) { + CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) + default: + tok = XML_TOK_NMTOKEN; + break; + } + break; + case XML_TOK_PREFIXED_NAME: + tok = XML_TOK_NMTOKEN; + break; + } + break; +#endif + case BT_PLUS: + if (tok == XML_TOK_NMTOKEN) { + *nextTokPtr = ptr; + return XML_TOK_INVALID; + } + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_NAME_PLUS; + case BT_AST: + if (tok == XML_TOK_NMTOKEN) { + *nextTokPtr = ptr; + return XML_TOK_INVALID; + } + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_NAME_ASTERISK; + case BT_QUEST: + if (tok == XML_TOK_NMTOKEN) { + *nextTokPtr = ptr; + return XML_TOK_INVALID; + } + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_NAME_QUESTION; + default: + *nextTokPtr = ptr; + return XML_TOK_INVALID; + } + } + return -tok; +} + +static int PTRCALL +PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr, + const char *end, const char **nextTokPtr) +{ + const char *start; + if (ptr == end) + return XML_TOK_NONE; + start = ptr; + while (ptr != end) { + switch (BYTE_TYPE(enc, ptr)) { +#define LEAD_CASE(n) \ + case BT_LEAD ## n: ptr += n; break; + LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) +#undef LEAD_CASE + case BT_AMP: + if (ptr == start) + return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr); + *nextTokPtr = ptr; + return XML_TOK_DATA_CHARS; + case BT_LT: + /* this is for inside entity references */ + *nextTokPtr = ptr; + return XML_TOK_INVALID; + case BT_LF: + if (ptr == start) { + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_DATA_NEWLINE; + } + *nextTokPtr = ptr; + return XML_TOK_DATA_CHARS; + case BT_CR: + if (ptr == start) { + ptr += MINBPC(enc); + if (ptr == end) + return XML_TOK_TRAILING_CR; + if (BYTE_TYPE(enc, ptr) == BT_LF) + ptr += MINBPC(enc); + *nextTokPtr = ptr; + return XML_TOK_DATA_NEWLINE; + } + *nextTokPtr = ptr; + return XML_TOK_DATA_CHARS; + case BT_S: + if (ptr == start) { + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_ATTRIBUTE_VALUE_S; + } + *nextTokPtr = ptr; + return XML_TOK_DATA_CHARS; + default: + ptr += MINBPC(enc); + break; + } + } + *nextTokPtr = ptr; + return XML_TOK_DATA_CHARS; +} + +static int PTRCALL +PREFIX(entityValueTok)(const ENCODING *enc, const char *ptr, + const char *end, const char **nextTokPtr) +{ + const char *start; + if (ptr == end) + return XML_TOK_NONE; + start = ptr; + while (ptr != end) { + switch (BYTE_TYPE(enc, ptr)) { +#define LEAD_CASE(n) \ + case BT_LEAD ## n: ptr += n; break; + LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) +#undef LEAD_CASE + case BT_AMP: + if (ptr == start) + return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr); + *nextTokPtr = ptr; + return XML_TOK_DATA_CHARS; + case BT_PERCNT: + if (ptr == start) { + int tok = PREFIX(scanPercent)(enc, ptr + MINBPC(enc), + end, nextTokPtr); + return (tok == XML_TOK_PERCENT) ? XML_TOK_INVALID : tok; + } + *nextTokPtr = ptr; + return XML_TOK_DATA_CHARS; + case BT_LF: + if (ptr == start) { + *nextTokPtr = ptr + MINBPC(enc); + return XML_TOK_DATA_NEWLINE; + } + *nextTokPtr = ptr; + return XML_TOK_DATA_CHARS; + case BT_CR: + if (ptr == start) { + ptr += MINBPC(enc); + if (ptr == end) + return XML_TOK_TRAILING_CR; + if (BYTE_TYPE(enc, ptr) == BT_LF) + ptr += MINBPC(enc); + *nextTokPtr = ptr; + return XML_TOK_DATA_NEWLINE; + } + *nextTokPtr = ptr; + return XML_TOK_DATA_CHARS; + default: + ptr += MINBPC(enc); + break; + } + } + *nextTokPtr = ptr; + return XML_TOK_DATA_CHARS; +} + +#ifdef XML_DTD + +static int PTRCALL +PREFIX(ignoreSectionTok)(const ENCODING *enc, const char *ptr, + const char *end, const char **nextTokPtr) +{ + int level = 0; + if (MINBPC(enc) > 1) { + size_t n = end - ptr; + if (n & (MINBPC(enc) - 1)) { + n &= ~(MINBPC(enc) - 1); + end = ptr + n; + } + } + while (ptr != end) { + switch (BYTE_TYPE(enc, ptr)) { + INVALID_CASES(ptr, nextTokPtr) + case BT_LT: + if ((ptr += MINBPC(enc)) == end) + return XML_TOK_PARTIAL; + if (CHAR_MATCHES(enc, ptr, ASCII_EXCL)) { + if ((ptr += MINBPC(enc)) == end) + return XML_TOK_PARTIAL; + if (CHAR_MATCHES(enc, ptr, ASCII_LSQB)) { + ++level; + ptr += MINBPC(enc); + } + } + break; + case BT_RSQB: + if ((ptr += MINBPC(enc)) == end) + return XML_TOK_PARTIAL; + if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) { + if ((ptr += MINBPC(enc)) == end) + return XML_TOK_PARTIAL; + if (CHAR_MATCHES(enc, ptr, ASCII_GT)) { + ptr += MINBPC(enc); + if (level == 0) { + *nextTokPtr = ptr; + return XML_TOK_IGNORE_SECT; + } + --level; + } + } + break; + default: + ptr += MINBPC(enc); + break; + } + } + return XML_TOK_PARTIAL; +} + +#endif /* XML_DTD */ + +static int PTRCALL +PREFIX(isPublicId)(const ENCODING *enc, const char *ptr, const char *end, + const char **badPtr) +{ + ptr += MINBPC(enc); + end -= MINBPC(enc); + for (; ptr != end; ptr += MINBPC(enc)) { + switch (BYTE_TYPE(enc, ptr)) { + case BT_DIGIT: + case BT_HEX: + case BT_MINUS: + case BT_APOS: + case BT_LPAR: + case BT_RPAR: + case BT_PLUS: + case BT_COMMA: + case BT_SOL: + case BT_EQUALS: + case BT_QUEST: + case BT_CR: + case BT_LF: + case BT_SEMI: + case BT_EXCL: + case BT_AST: + case BT_PERCNT: + case BT_NUM: +#ifdef XML_NS + case BT_COLON: +#endif + break; + case BT_S: + if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) { + *badPtr = ptr; + return 0; + } + break; + case BT_NAME: + case BT_NMSTRT: + if (!(BYTE_TO_ASCII(enc, ptr) & ~0x7f)) + break; + default: + switch (BYTE_TO_ASCII(enc, ptr)) { + case 0x24: /* $ */ + case 0x40: /* @ */ + break; + default: + *badPtr = ptr; + return 0; + } + break; + } + } + return 1; +} + +/* This must only be called for a well-formed start-tag or empty + element tag. Returns the number of attributes. Pointers to the + first attsMax attributes are stored in atts. +*/ + +static int PTRCALL +PREFIX(getAtts)(const ENCODING *enc, const char *ptr, + int attsMax, ATTRIBUTE *atts) +{ + enum { other, inName, inValue } state = inName; + int nAtts = 0; + int open = 0; /* defined when state == inValue; + initialization just to shut up compilers */ + + for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) { + switch (BYTE_TYPE(enc, ptr)) { +#define START_NAME \ + if (state == other) { \ + if (nAtts < attsMax) { \ + atts[nAtts].name = ptr; \ + atts[nAtts].normalized = 1; \ + } \ + state = inName; \ + } +#define LEAD_CASE(n) \ + case BT_LEAD ## n: START_NAME ptr += (n - MINBPC(enc)); break; + LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) +#undef LEAD_CASE + case BT_NONASCII: + case BT_NMSTRT: + case BT_HEX: + START_NAME + break; +#undef START_NAME + case BT_QUOT: + if (state != inValue) { + if (nAtts < attsMax) + atts[nAtts].valuePtr = ptr + MINBPC(enc); + state = inValue; + open = BT_QUOT; + } + else if (open == BT_QUOT) { + state = other; + if (nAtts < attsMax) + atts[nAtts].valueEnd = ptr; + nAtts++; + } + break; + case BT_APOS: + if (state != inValue) { + if (nAtts < attsMax) + atts[nAtts].valuePtr = ptr + MINBPC(enc); + state = inValue; + open = BT_APOS; + } + else if (open == BT_APOS) { + state = other; + if (nAtts < attsMax) + atts[nAtts].valueEnd = ptr; + nAtts++; + } + break; + case BT_AMP: + if (nAtts < attsMax) + atts[nAtts].normalized = 0; + break; + case BT_S: + if (state == inName) + state = other; + else if (state == inValue + && nAtts < attsMax + && atts[nAtts].normalized + && (ptr == atts[nAtts].valuePtr + || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE + || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE + || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open)) + atts[nAtts].normalized = 0; + break; + case BT_CR: case BT_LF: + /* This case ensures that the first attribute name is counted + Apart from that we could just change state on the quote. */ + if (state == inName) + state = other; + else if (state == inValue && nAtts < attsMax) + atts[nAtts].normalized = 0; + break; + case BT_GT: + case BT_SOL: + if (state != inValue) + return nAtts; + break; + default: + break; + } + } + /* not reached */ +} + +static int PTRFASTCALL +PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr) +{ + int result = 0; + /* skip &# */ + ptr += 2*MINBPC(enc); + if (CHAR_MATCHES(enc, ptr, ASCII_x)) { + for (ptr += MINBPC(enc); + !CHAR_MATCHES(enc, ptr, ASCII_SEMI); + ptr += MINBPC(enc)) { + int c = BYTE_TO_ASCII(enc, ptr); + switch (c) { + case ASCII_0: case ASCII_1: case ASCII_2: case ASCII_3: case ASCII_4: + case ASCII_5: case ASCII_6: case ASCII_7: case ASCII_8: case ASCII_9: + result <<= 4; + result |= (c - ASCII_0); + break; + case ASCII_A: case ASCII_B: case ASCII_C: + case ASCII_D: case ASCII_E: case ASCII_F: + result <<= 4; + result += 10 + (c - ASCII_A); + break; + case ASCII_a: case ASCII_b: case ASCII_c: + case ASCII_d: case ASCII_e: case ASCII_f: + result <<= 4; + result += 10 + (c - ASCII_a); + break; + } + if (result >= 0x110000) + return -1; + } + } + else { + for (; !CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) { + int c = BYTE_TO_ASCII(enc, ptr); + result *= 10; + result += (c - ASCII_0); + if (result >= 0x110000) + return -1; + } + } + return checkCharRefNumber(result); +} + +static int PTRCALL +PREFIX(predefinedEntityName)(const ENCODING *enc, const char *ptr, + const char *end) +{ + switch ((end - ptr)/MINBPC(enc)) { + case 2: + if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) { + switch (BYTE_TO_ASCII(enc, ptr)) { + case ASCII_l: + return ASCII_LT; + case ASCII_g: + return ASCII_GT; + } + } + break; + case 3: + if (CHAR_MATCHES(enc, ptr, ASCII_a)) { + ptr += MINBPC(enc); + if (CHAR_MATCHES(enc, ptr, ASCII_m)) { + ptr += MINBPC(enc); + if (CHAR_MATCHES(enc, ptr, ASCII_p)) + return ASCII_AMP; + } + } + break; + case 4: + switch (BYTE_TO_ASCII(enc, ptr)) { + case ASCII_q: + ptr += MINBPC(enc); + if (CHAR_MATCHES(enc, ptr, ASCII_u)) { + ptr += MINBPC(enc); + if (CHAR_MATCHES(enc, ptr, ASCII_o)) { + ptr += MINBPC(enc); + if (CHAR_MATCHES(enc, ptr, ASCII_t)) + return ASCII_QUOT; + } + } + break; + case ASCII_a: + ptr += MINBPC(enc); + if (CHAR_MATCHES(enc, ptr, ASCII_p)) { + ptr += MINBPC(enc); + if (CHAR_MATCHES(enc, ptr, ASCII_o)) { + ptr += MINBPC(enc); + if (CHAR_MATCHES(enc, ptr, ASCII_s)) + return ASCII_APOS; + } + } + break; + } + } + return 0; +} + +static int PTRCALL +PREFIX(sameName)(const ENCODING *enc, const char *ptr1, const char *ptr2) +{ + for (;;) { + switch (BYTE_TYPE(enc, ptr1)) { +#define LEAD_CASE(n) \ + case BT_LEAD ## n: \ + if (*ptr1++ != *ptr2++) \ + return 0; + LEAD_CASE(4) LEAD_CASE(3) LEAD_CASE(2) +#undef LEAD_CASE + /* fall through */ + if (*ptr1++ != *ptr2++) + return 0; + break; + case BT_NONASCII: + case BT_NMSTRT: +#ifdef XML_NS + case BT_COLON: +#endif + case BT_HEX: + case BT_DIGIT: + case BT_NAME: + case BT_MINUS: + if (*ptr2++ != *ptr1++) + return 0; + if (MINBPC(enc) > 1) { + if (*ptr2++ != *ptr1++) + return 0; + if (MINBPC(enc) > 2) { + if (*ptr2++ != *ptr1++) + return 0; + if (MINBPC(enc) > 3) { + if (*ptr2++ != *ptr1++) + return 0; + } + } + } + break; + default: + if (MINBPC(enc) == 1 && *ptr1 == *ptr2) + return 1; + switch (BYTE_TYPE(enc, ptr2)) { + case BT_LEAD2: + case BT_LEAD3: + case BT_LEAD4: + case BT_NONASCII: + case BT_NMSTRT: +#ifdef XML_NS + case BT_COLON: +#endif + case BT_HEX: + case BT_DIGIT: + case BT_NAME: + case BT_MINUS: + return 0; + default: + return 1; + } + } + } + /* not reached */ +} + +static int PTRCALL +PREFIX(nameMatchesAscii)(const ENCODING *enc, const char *ptr1, + const char *end1, const char *ptr2) +{ + for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) { + if (ptr1 == end1) + return 0; + if (!CHAR_MATCHES(enc, ptr1, *ptr2)) + return 0; + } + return ptr1 == end1; +} + +static int PTRFASTCALL +PREFIX(nameLength)(const ENCODING *enc, const char *ptr) +{ + const char *start = ptr; + for (;;) { + switch (BYTE_TYPE(enc, ptr)) { +#define LEAD_CASE(n) \ + case BT_LEAD ## n: ptr += n; break; + LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) +#undef LEAD_CASE + case BT_NONASCII: + case BT_NMSTRT: +#ifdef XML_NS + case BT_COLON: +#endif + case BT_HEX: + case BT_DIGIT: + case BT_NAME: + case BT_MINUS: + ptr += MINBPC(enc); + break; + default: + return ptr - start; + } + } +} + +static const char * PTRFASTCALL +PREFIX(skipS)(const ENCODING *enc, const char *ptr) +{ + for (;;) { + switch (BYTE_TYPE(enc, ptr)) { + case BT_LF: + case BT_CR: + case BT_S: + ptr += MINBPC(enc); + break; + default: + return ptr; + } + } +} + +static void PTRCALL +PREFIX(updatePosition)(const ENCODING *enc, + const char *ptr, + const char *end, + POSITION *pos) +{ + while (ptr < end) { + switch (BYTE_TYPE(enc, ptr)) { +#define LEAD_CASE(n) \ + case BT_LEAD ## n: \ + ptr += n; \ + break; + LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4) +#undef LEAD_CASE + case BT_LF: + pos->columnNumber = (unsigned)-1; + pos->lineNumber++; + ptr += MINBPC(enc); + break; + case BT_CR: + pos->lineNumber++; + ptr += MINBPC(enc); + if (ptr != end && BYTE_TYPE(enc, ptr) == BT_LF) + ptr += MINBPC(enc); + pos->columnNumber = (unsigned)-1; + break; + default: + ptr += MINBPC(enc); + break; + } + pos->columnNumber++; + } +} + +#undef DO_LEAD_CASE +#undef MULTIBYTE_CASES +#undef INVALID_CASES +#undef CHECK_NAME_CASE +#undef CHECK_NAME_CASES +#undef CHECK_NMSTRT_CASE +#undef CHECK_NMSTRT_CASES + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xmltok_impl.h b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xmltok_impl.h new file mode 100644 index 00000000..da0ea60a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xmltok_impl.h @@ -0,0 +1,46 @@ +/* +Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd +See the file COPYING for copying permission. +*/ + +enum { + BT_NONXML, + BT_MALFORM, + BT_LT, + BT_AMP, + BT_RSQB, + BT_LEAD2, + BT_LEAD3, + BT_LEAD4, + BT_TRAIL, + BT_CR, + BT_LF, + BT_GT, + BT_QUOT, + BT_APOS, + BT_EQUALS, + BT_QUEST, + BT_EXCL, + BT_SOL, + BT_SEMI, + BT_NUM, + BT_LSQB, + BT_S, + BT_NMSTRT, + BT_COLON, + BT_HEX, + BT_DIGIT, + BT_NAME, + BT_MINUS, + BT_OTHER, /* known not to be a name or name start character */ + BT_NONASCII, /* might be a name or name start character */ + BT_PERCNT, + BT_LPAR, + BT_RPAR, + BT_AST, + BT_PLUS, + BT_COMMA, + BT_VERBAR +}; + +#include diff --git a/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xmltok_ns.c b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xmltok_ns.c new file mode 100644 index 00000000..5610eb95 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib/xmltok_ns.c @@ -0,0 +1,106 @@ +const ENCODING * +NS(XmlGetUtf8InternalEncoding)(void) +{ + return &ns(internal_utf8_encoding).enc; +} + +const ENCODING * +NS(XmlGetUtf16InternalEncoding)(void) +{ +#if BYTEORDER == 1234 + return &ns(internal_little2_encoding).enc; +#elif BYTEORDER == 4321 + return &ns(internal_big2_encoding).enc; +#else + const short n = 1; + return (*(const char *)&n + ? &ns(internal_little2_encoding).enc + : &ns(internal_big2_encoding).enc); +#endif +} + +static const ENCODING *NS(encodings)[] = { + &ns(latin1_encoding).enc, + &ns(ascii_encoding).enc, + &ns(utf8_encoding).enc, + &ns(big2_encoding).enc, + &ns(big2_encoding).enc, + &ns(little2_encoding).enc, + &ns(utf8_encoding).enc /* NO_ENC */ +}; + +static int PTRCALL +NS(initScanProlog)(const ENCODING *enc, const char *ptr, const char *end, + const char **nextTokPtr) +{ + return initScan(NS(encodings), (const INIT_ENCODING *)enc, + XML_PROLOG_STATE, ptr, end, nextTokPtr); +} + +static int PTRCALL +NS(initScanContent)(const ENCODING *enc, const char *ptr, const char *end, + const char **nextTokPtr) +{ + return initScan(NS(encodings), (const INIT_ENCODING *)enc, + XML_CONTENT_STATE, ptr, end, nextTokPtr); +} + +int +NS(XmlInitEncoding)(INIT_ENCODING *p, const ENCODING **encPtr, + const char *name) +{ + int i = getEncodingIndex(name); + if (i == UNKNOWN_ENC) + return 0; + SET_INIT_ENC_INDEX(p, i); + p->initEnc.scanners[XML_PROLOG_STATE] = NS(initScanProlog); + p->initEnc.scanners[XML_CONTENT_STATE] = NS(initScanContent); + p->initEnc.updatePosition = initUpdatePosition; + p->encPtr = encPtr; + *encPtr = &(p->initEnc); + return 1; +} + +static const ENCODING * +NS(findEncoding)(const ENCODING *enc, const char *ptr, const char *end) +{ +#define ENCODING_MAX 128 + char buf[ENCODING_MAX]; + char *p = buf; + int i; + XmlUtf8Convert(enc, &ptr, end, &p, p + ENCODING_MAX - 1); + if (ptr != end) + return 0; + *p = 0; + if (streqci(buf, KW_UTF_16) && enc->minBytesPerChar == 2) + return enc; + i = getEncodingIndex(buf); + if (i == UNKNOWN_ENC) + return 0; + return NS(encodings)[i]; +} + +int +NS(XmlParseXmlDecl)(int isGeneralTextEntity, + const ENCODING *enc, + const char *ptr, + const char *end, + const char **badPtr, + const char **versionPtr, + const char **versionEndPtr, + const char **encodingName, + const ENCODING **encoding, + int *standalone) +{ + return doParseXmlDecl(NS(findEncoding), + isGeneralTextEntity, + enc, + ptr, + end, + badPtr, + versionPtr, + versionEndPtr, + encodingName, + encoding, + standalone); +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/libexpat.la b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/libexpat.la new file mode 100644 index 00000000..5d5897c9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/libexpat.la @@ -0,0 +1,35 @@ +# libexpat.la - a libtool library file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='libexpat.so.0' + +# Names of this library. +library_names='libexpat.so.0.5.0 libexpat.so.0 libexpat.so' + +# The name of the static archive. +old_library='libexpat.a' + +# Libraries that this one depends upon. +dependency_libs='' + +# Version information for libexpat. +current=5 +age=5 +revision=0 + +# Is this an already installed library? +installed=no + +# Should we warn about portability when linking against -modules? +shouldnotlink=no + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='/bottlenecks/rubbos/app/apache2/lib' diff --git a/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/libtool b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/libtool new file mode 100755 index 00000000..5ae0c56c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/libtool @@ -0,0 +1,7621 @@ +#! /bin/bash + +# libtoolT - Provide generalized library-building support services. +# Generated automatically by (GNU ) +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 +# Free Software Foundation, Inc. +# +# This file is part of GNU Libtool: +# Originally by Gordon Matzigkeit , 1996 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# A sed program that does not truncate output. +SED="/bin/sed" + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="/bin/sed -e 1s/^X//" + +# 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 + +# The names of the tagged configurations supported by this script. +available_tags=" CXX" + +# ### BEGIN LIBTOOL CONFIG + +# Libtool was configured on host ubuntu: + +# Shell to use when invoking shell scripts. +SHELL="/bin/bash" + +# Whether or not to build shared libraries. +build_libtool_libs=yes + +# Whether or not to build static libraries. +build_old_libs=yes + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=no + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=no + +# Whether or not to optimize for fast installation. +fast_install=yes + +# The host system. +host_alias= +host=x86_64-unknown-linux-gnu +host_os=linux-gnu + +# The build system. +build_alias= +build=x86_64-unknown-linux-gnu +build_os=linux-gnu + +# An echo program that does not interpret backslashes. +echo="echo" + +# The archiver. +AR="ar" +AR_FLAGS="cru" + +# A C compiler. +LTCC="gcc" + +# LTCC compiler flags. +LTCFLAGS="-g -O2" + +# A language-specific compiler. +CC="gcc" + +# Is the compiler the GNU C compiler? +with_gcc=yes + +# An ERE matcher. +EGREP="/bin/grep -E" + +# The linker used to build libraries. +LD="/usr/bin/ld -m elf_x86_64" + +# Whether we need hard or soft links. +LN_S="ln -s" + +# A BSD-compatible nm program. +NM="/usr/bin/nm -B" + +# A symbol stripping program +STRIP="strip" + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=file + +# Used on cygwin: DLL creation program. +DLLTOOL="dlltool" + +# Used on cygwin: object dumper. +OBJDUMP="objdump" + +# Used on cygwin: assembler. +AS="as" + +# The name of the directory that contains temporary libtool files. +objdir=.libs + +# How to create reloadable object files. +reload_flag=" -r" +reload_cmds="\$LD\$reload_flag -o \$output\$reload_objs" + +# How to pass a linker flag through the compiler. +wl="-Wl," + +# Object file suffix (normally "o"). +objext="o" + +# Old archive suffix (normally "a"). +libext="a" + +# Shared library suffix (normally ".so"). +shrext_cmds='.so' + +# Executable file suffix (normally ""). +exeext="" + +# Additional compiler flags for building library objects. +pic_flag=" -fPIC -DPIC" +pic_mode=default + +# What is the maximum length of a command? +max_cmd_len=1572864 + +# Does compiler simultaneously support -c and -o options? +compiler_c_o="yes" + +# Must we lock files when doing compilation? +need_locks="no" + +# Do we need the lib prefix for modules? +need_lib_prefix=no + +# Do we need a version for libraries? +need_version=no + +# Whether dlopen is supported. +dlopen_support=unknown + +# Whether dlopen of programs is supported. +dlopen_self=unknown + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=unknown + +# Compiler flag to prevent dynamic linking. +link_static_flag="-static" + +# Compiler flag to turn off builtin functions. +no_builtin_flag=" -fno-builtin" + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec="\${wl}--export-dynamic" + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec="\${wl}--whole-archive\$convenience \${wl}--no-whole-archive" + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec="" + +# Library versioning type. +version_type=linux + +# Format of library name prefix. +libname_spec="lib\$name" + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec="\${libname}\${release}\${shared_ext}\$versuffix \${libname}\${release}\${shared_ext}\$major \$libname\${shared_ext}" + +# The coded name of the library, if different from the real name. +soname_spec="\${libname}\${release}\${shared_ext}\$major" + +# Commands used to build and install an old-style archive. +RANLIB="ranlib" +old_archive_cmds="\$AR \$AR_FLAGS \$oldlib\$oldobjs~\$RANLIB \$oldlib" +old_postinstall_cmds="chmod 644 \$oldlib~\$RANLIB \$oldlib" +old_postuninstall_cmds="" + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds="" + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds="" + +# Commands used to build and install a shared archive. +archive_cmds="\$CC -shared \$libobjs \$deplibs \$compiler_flags \${wl}-soname \$wl\$soname -o \$lib" +archive_expsym_cmds="\$echo \\\"{ global:\\\" > \$output_objdir/\$libname.ver~ + cat \$export_symbols | sed -e \\\"s/\\\\(.*\\\\)/\\\\1;/\\\" >> \$output_objdir/\$libname.ver~ + \$echo \\\"local: *; };\\\" >> \$output_objdir/\$libname.ver~ + \$CC -shared \$libobjs \$deplibs \$compiler_flags \${wl}-soname \$wl\$soname \${wl}-version-script \${wl}\$output_objdir/\$libname.ver -o \$lib" +postinstall_cmds="" +postuninstall_cmds="" + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds="" +module_expsym_cmds="" + +# Commands to strip libraries. +old_striplib="strip --strip-debug" +striplib="strip --strip-unneeded" + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects="" + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects="" + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps="" + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps="" + +# The directories searched by this compiler when creating a shared +# library +compiler_lib_search_dirs="" + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path="" + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method="pass_all" + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd="\$MAGIC_CMD" + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag="" + +# Flag that forces no undefined symbols. +no_undefined_flag="" + +# Commands used to finish a libtool library installation in a directory. +finish_cmds="PATH=\\\"\\\$PATH:/sbin\\\" ldconfig -n \$libdir" + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval="" + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe="sed -n -e 's/^.*[ ]\\([ABCDGIRSTW][ABCDGIRSTW]*\\)[ ][ ]*\\([_A-Za-z][_A-Za-z0-9]*\\)\$/\\1 \\2 \\2/p'" + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl="sed -n -e 's/^. .* \\(.*\\)\$/extern int \\1;/p'" + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address="sed -n -e 's/^: \\([^ ]*\\) \$/ {\\\"\\1\\\", (lt_ptr) 0},/p' -e 's/^[BCDEGRST] \\([^ ]*\\) \\([^ ]*\\)\$/ {\"\\2\", (lt_ptr) \\&\\2},/p'" + +# This is the shared library runtime path variable. +runpath_var=LD_RUN_PATH + +# This is the shared library path variable. +shlibpath_var=LD_LIBRARY_PATH + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=no + +# How to hardcode a shared library path into an executable. +hardcode_action=immediate + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=yes + +# Flag to hardcode $libdir into a binary during linking. +# This must work even if $libdir does not exist. +hardcode_libdir_flag_spec="\${wl}--rpath \${wl}\$libdir" + +# If ld is used when linking, flag to hardcode $libdir into +# a binary during linking. This must work even if $libdir does +# not exist. +hardcode_libdir_flag_spec_ld="" + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator="" + +# Set to yes if using DIR/libNAME during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=no + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=no + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=unsupported + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=no + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="PATH LD_LIBRARY_PATH LD_RUN_PATH GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=unknown + +# Compile-time system search path for libraries +sys_lib_search_path_spec="/usr/lib64 /lib64 /usr/local/lib64" + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec="/usr/lib64 /lib64 /usr/lib/x86_64-linux-gnu/libfakeroot /usr/local/lib /lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu " + +# Fix the shell variable $srcfile for the compiler. +fix_srcfile_path="" + +# Set to yes if exported symbols are required. +always_export_symbols=no + +# The commands to list exported symbols. +export_symbols_cmds="\$NM \$libobjs \$convenience | \$global_symbol_pipe | \$SED 's/.* //' | sort | uniq > \$export_symbols" + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds="" + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms="_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*" + +# Symbols that must always be exported. +include_expsyms="" + +# ### END LIBTOOL CONFIG + +# ltmain.sh - Provide generalized library-building support services. +# NOTE: Changing this file will not affect anything until you rerun configure. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, +# 2007, 2008 Free Software Foundation, Inc. +# Originally by Gordon Matzigkeit , 1996 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +basename="s,^.*/,,g" + +# 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 $basename` +modename="$progname" + +# Global variables: +EXIT_SUCCESS=0 +EXIT_FAILURE=1 + +PROGRAM=ltmain.sh +PACKAGE=libtool +VERSION=1.5.26 +TIMESTAMP=" (1.1220.2.493 2008/02/01 16:58:18)" + +# Be Bourne compatible (taken from Autoconf:_AS_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 + +# Check that we have a working $echo. +if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X$1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then + # Yippee, $echo works! + : +else + # Restart under the correct shell, and then maybe $echo will work. + exec $SHELL "$progpath" --no-reexec ${1+"$@"} +fi + +if test "X$1" = X--fallback-echo; then + # used as fallback echo + shift + cat <&2 + $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit $EXIT_FAILURE +fi + +# Global variables. +mode=$default_mode +nonopt= +prev= +prevopt= +run= +show="$echo" +show_help= +execute_dlfiles= +duplicate_deps=no +preserve_args= +lo2o="s/\\.lo\$/.${objext}/" +o2lo="s/\\.${objext}\$/.lo/" +extracted_archives= +extracted_serial=0 + +##################################### +# Shell function definitions: +# This seems to be the best place for them + +# func_mktempdir [string] +# Make a temporary directory that won't clash with other running +# libtool processes, and avoids race conditions if possible. If +# given, STRING is the basename for that directory. +func_mktempdir () +{ + my_template="${TMPDIR-/tmp}/${1-$progname}" + + if test "$run" = ":"; then + # Return a directory name, but don't create it in dry-run mode + my_tmpdir="${my_template}-$$" + else + + # If mktemp works, use that first and foremost + my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` + + if test ! -d "$my_tmpdir"; then + # Failing that, at least try and use $RANDOM to avoid a race + my_tmpdir="${my_template}-${RANDOM-0}$$" + + save_mktempdir_umask=`umask` + umask 0077 + $mkdir "$my_tmpdir" + umask $save_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$my_tmpdir" || { + $echo "cannot create temporary directory \`$my_tmpdir'" 1>&2 + exit $EXIT_FAILURE + } + fi + + $echo "X$my_tmpdir" | $Xsed +} + + +# 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. +func_win32_libid () +{ + 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 + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | \ + $EGREP -e 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then + win32_nmres=`eval $NM -f posix -A $1 | \ + $SED -n -e '1,100{ + / I /{ + s,.*,import, + p + q + } + }'` + 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_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 () +{ + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + CC_quoted="$CC_quoted $arg" + done + 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 "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) ;; + # 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. + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + CC_quoted="$CC_quoted $arg" + done + case "$@ " in + " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) + # 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 + $echo "$modename: unable to infer tagged configuration" + $echo "$modename: specify a tag with \`--tag'" 1>&2 + exit $EXIT_FAILURE +# else +# $echo "$modename: using $tagname tagged configuration" + fi + ;; + esac + fi +} + + +# func_extract_an_archive dir oldlib +func_extract_an_archive () +{ + f_ex_an_ar_dir="$1"; shift + f_ex_an_ar_oldlib="$1" + + $show "(cd $f_ex_an_ar_dir && $AR x $f_ex_an_ar_oldlib)" + $run eval "(cd \$f_ex_an_ar_dir && $AR x \$f_ex_an_ar_oldlib)" || exit $? + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then + : + else + $echo "$modename: ERROR: object name conflicts: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" 1>&2 + exit $EXIT_FAILURE + fi +} + +# func_extract_archives gentop oldlib ... +func_extract_archives () +{ + my_gentop="$1"; shift + my_oldlibs=${1+"$@"} + my_oldobjs="" + my_xlib="" + my_xabs="" + my_xdir="" + my_status="" + + $show "${rm}r $my_gentop" + $run ${rm}r "$my_gentop" + $show "$mkdir $my_gentop" + $run $mkdir "$my_gentop" + my_status=$? + if test "$my_status" -ne 0 && test ! -d "$my_gentop"; then + exit $my_status + fi + + 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 + my_xlib=`$echo "X$my_xlib" | $Xsed -e 's%^.*/%%'` + my_xlib_u=$my_xlib + while :; do + case " $extracted_archives " in + *" $my_xlib_u "*) + extracted_serial=`expr $extracted_serial + 1` + 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" + + $show "${rm}r $my_xdir" + $run ${rm}r "$my_xdir" + $show "$mkdir $my_xdir" + $run $mkdir "$my_xdir" + exit_status=$? + if test "$exit_status" -ne 0 && test ! -d "$my_xdir"; then + exit $exit_status + fi + case $host in + *-darwin*) + $show "Extracting $my_xabs" + # Do not bother doing anything if just a dry run + if test -z "$run"; then + darwin_orig_dir=`pwd` + cd $my_xdir || exit $? + darwin_archive=$my_xabs + darwin_curdir=`pwd` + darwin_base_archive=`$echo "X$darwin_archive" | $Xsed -e 's%^.*/%%'` + darwin_arches=`lipo -info "$darwin_archive" 2>/dev/null | $EGREP Architectures 2>/dev/null` + if test -n "$darwin_arches"; then + darwin_arches=`echo "$darwin_arches" | $SED -e 's/.*are://'` + darwin_arch= + $show "$darwin_base_archive has multiple architectures $darwin_arches" + for darwin_arch in $darwin_arches ; do + 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 have a bunch of thin objects, gotta fatten them up :) + darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print| xargs basename | sort -u | $NL2SP` + darwin_file= + darwin_files= + for darwin_file in $darwin_filelist; do + darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP` + lipo -create -output "$darwin_file" $darwin_files + done # $darwin_filelist + ${rm}r unfat-$$ + cd "$darwin_orig_dir" + else + cd "$darwin_orig_dir" + func_extract_an_archive "$my_xdir" "$my_xabs" + fi # $darwin_arches + fi # $run + ;; + *) + func_extract_an_archive "$my_xdir" "$my_xabs" + ;; + esac + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` + done + func_extract_archives_result="$my_oldobjs" +} +# End of Shell function definitions +##################################### + +# Darwin sucks +eval std_shrext=\"$shrext_cmds\" + +disable_libs=no + +# Parse our command line options once, thoroughly. +while test "$#" -gt 0 +do + arg="$1" + shift + + case $arg in + -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;; + *) optarg= ;; + esac + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + execute_dlfiles) + execute_dlfiles="$execute_dlfiles $arg" + ;; + tag) + tagname="$arg" + preserve_args="${preserve_args}=$arg" + + # Check whether tagname contains only valid characters + case $tagname in + *[!-_A-Za-z0-9,/]*) + $echo "$progname: invalid tag name: $tagname" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + case $tagname in + CC) + # Don't test for the "default" C tag, as we know, it's there, but + # not specially marked. + ;; + *) + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "$progpath" > /dev/null; then + taglist="$taglist $tagname" + # Evaluate the configuration. + eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$tagname'$/,/^# ### END LIBTOOL TAG CONFIG: '$tagname'$/p' < $progpath`" + else + $echo "$progname: ignoring unknown tag $tagname" 1>&2 + fi + ;; + esac + ;; + *) + eval "$prev=\$arg" + ;; + esac + + prev= + prevopt= + continue + fi + + # Have we seen a non-optional argument yet? + case $arg in + --help) + show_help=yes + ;; + + --version) + echo "\ +$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP + +Copyright (C) 2008 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." + exit $? + ;; + + --config) + ${SED} -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $progpath + # Now print the configurations for the tags. + for tagname in $taglist; do + ${SED} -n -e "/^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$/,/^# ### END LIBTOOL TAG CONFIG: $tagname$/p" < "$progpath" + done + exit $? + ;; + + --debug) + $echo "$progname: enabling shell trace mode" + set -x + preserve_args="$preserve_args $arg" + ;; + + --dry-run | -n) + run=: + ;; + + --features) + $echo "host: $host" + if test "$build_libtool_libs" = yes; then + $echo "enable shared libraries" + else + $echo "disable shared libraries" + fi + if test "$build_old_libs" = yes; then + $echo "enable static libraries" + else + $echo "disable static libraries" + fi + exit $? + ;; + + --finish) mode="finish" ;; + + --mode) prevopt="--mode" prev=mode ;; + --mode=*) mode="$optarg" ;; + + --preserve-dup-deps) duplicate_deps="yes" ;; + + --quiet | --silent) + show=: + preserve_args="$preserve_args $arg" + ;; + + --tag) + prevopt="--tag" + prev=tag + preserve_args="$preserve_args --tag" + ;; + --tag=*) + set tag "$optarg" ${1+"$@"} + shift + prev=tag + preserve_args="$preserve_args --tag" + ;; + + -dlopen) + prevopt="-dlopen" + prev=execute_dlfiles + ;; + + -*) + $echo "$modename: unrecognized option \`$arg'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + + *) + nonopt="$arg" + break + ;; + esac +done + +if test -n "$prevopt"; then + $echo "$modename: option \`$prevopt' requires an argument" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE +fi + +case $disable_libs in +no) + ;; +shared) + build_libtool_libs=no + build_old_libs=yes + ;; +static) + build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` + ;; +esac + +# 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= + +if test -z "$show_help"; then + + # Infer the operation mode. + if test -z "$mode"; then + $echo "*** Warning: inferring the mode of operation is deprecated." 1>&2 + $echo "*** Future versions of Libtool will require --mode=MODE be specified." 1>&2 + case $nonopt in + *cc | cc* | *++ | gcc* | *-gcc* | g++* | xlc*) + mode=link + for arg + do + case $arg in + -c) + mode=compile + break + ;; + esac + done + ;; + *db | *dbx | *strace | *truss) + mode=execute + ;; + *install*|cp|mv) + mode=install + ;; + *rm) + mode=uninstall + ;; + *) + # If we have no mode, but dlfiles were specified, then do execute mode. + test -n "$execute_dlfiles" && mode=execute + + # Just use the default operation mode. + if test -z "$mode"; then + if test -n "$nonopt"; then + $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2 + else + $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2 + fi + fi + ;; + esac + fi + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$execute_dlfiles" && test "$mode" != execute; then + $echo "$modename: unrecognized option \`-dlopen'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Change the help message to a mode-specific one. + generic_help="$help" + help="Try \`$modename --help --mode=$mode' for more information." + + # These modes are in order of execution frequency so that they run quickly. + case $mode in + # libtool compile mode + compile) + modename="$modename: compile" + # Get the compilation command and the source file. + base_compile= + srcfile="$nonopt" # always keep a non-empty value in "srcfile" + suppress_opt=yes + suppress_output= + arg_mode=normal + libobj= + later= + + 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) + if test -n "$libobj" ; then + $echo "$modename: you cannot specify \`-o' more than once" 1>&2 + exit $EXIT_FAILURE + fi + arg_mode=target + continue + ;; + + -static | -prefer-pic | -prefer-non-pic) + later="$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,*) + args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"` + lastarg= + save_ifs="$IFS"; IFS=',' + for arg in $args; do + IFS="$save_ifs" + + # Double-quote args containing other shell metacharacters. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + lastarg="$lastarg $arg" + done + IFS="$save_ifs" + lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"` + + # Add the arguments to base_compile. + base_compile="$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. + lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"` + + case $lastarg in + # Double-quote args containing other shell metacharacters. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, and some SunOS ksh mistreat backslash-escaping + # in scan sets (worked around with variable expansion), + # and furthermore cannot handle '|' '&' '(' ')' in scan sets + # at all, so we specify them separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + lastarg="\"$lastarg\"" + ;; + esac + + base_compile="$base_compile $lastarg" + done # for arg + + case $arg_mode in + arg) + $echo "$modename: you must specify an argument for -Xcompile" + exit $EXIT_FAILURE + ;; + target) + $echo "$modename: you must specify a target with \`-o'" 1>&2 + exit $EXIT_FAILURE + ;; + *) + # Get the name of the library object. + [ -z "$libobj" ] && libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'` + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + xform='[cCFSifmso]' + case $libobj in + *.ada) xform=ada ;; + *.adb) xform=adb ;; + *.ads) xform=ads ;; + *.asm) xform=asm ;; + *.c++) xform=c++ ;; + *.cc) xform=cc ;; + *.ii) xform=ii ;; + *.class) xform=class ;; + *.cpp) xform=cpp ;; + *.cxx) xform=cxx ;; + *.[fF][09]?) xform=[fF][09]. ;; + *.for) xform=for ;; + *.java) xform=java ;; + *.obj) xform=obj ;; + *.sx) xform=sx ;; + esac + + libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"` + + case $libobj in + *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;; + *) + $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + func_infer_tag $base_compile + + for arg in $later; do + case $arg in + -static) + build_old_libs=yes + continue + ;; + + -prefer-pic) + pic_mode=yes + continue + ;; + + -prefer-non-pic) + pic_mode=no + continue + ;; + esac + done + + qlibobj=`$echo "X$libobj" | $Xsed -e "$sed_quote_subst"` + case $qlibobj in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + qlibobj="\"$qlibobj\"" ;; + esac + test "X$libobj" != "X$qlibobj" \ + && $echo "X$libobj" | grep '[]~#^*{};<>?"'"'"' &()|`$[]' \ + && $echo "$modename: libobj name \`$libobj' may not contain shell special characters." + objname=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` + xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$obj"; then + xdir= + else + xdir=$xdir/ + fi + lobj=${xdir}$objdir/$objname + + if test -z "$base_compile"; then + $echo "$modename: you must specify a compilation command" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Delete any leftover library objects. + if test "$build_old_libs" = yes; then + removelist="$obj $lobj $libobj ${libobj}T" + else + removelist="$lobj $libobj ${libobj}T" + fi + + $run $rm $removelist + trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | pw32* | os2*) + pic_mode=default + ;; + esac + if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; 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 "$compiler_c_o" = no; then + output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext} + lockfile="$output_obj.lock" + removelist="$removelist $output_obj $lockfile" + trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 + 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 "$need_locks" = yes; then + until $run ln "$progpath" "$lockfile" 2>/dev/null; do + $show "Waiting for $lockfile to be removed" + sleep 2 + done + elif test "$need_locks" = warn; then + if test -f "$lockfile"; then + $echo "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit $EXIT_FAILURE + fi + $echo "$srcfile" > "$lockfile" + fi + + if test -n "$fix_srcfile_path"; then + eval srcfile=\"$fix_srcfile_path\" + fi + qsrcfile=`$echo "X$srcfile" | $Xsed -e "$sed_quote_subst"` + case $qsrcfile in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + qsrcfile="\"$qsrcfile\"" ;; + esac + + $run $rm "$libobj" "${libobj}T" + + # Create a libtool object file (analogous to a ".la" file), + # but don't create it if we're doing a dry run. + test -z "$run" && cat > ${libobj}T </dev/null`" != "X$srcfile"; then + $echo "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit $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 + $show "$mv $output_obj $lobj" + if $run $mv $output_obj $lobj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + fi + + # Append the name of the PIC object to the libtool object file. + test -z "$run" && cat >> ${libobj}T <> ${libobj}T </dev/null`" != "X$srcfile"; then + $echo "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then + $show "$mv $output_obj $obj" + if $run $mv $output_obj $obj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + fi + + # Append the name of the non-PIC object the libtool object file. + # Only append if the libtool object file exists. + test -z "$run" && cat >> ${libobj}T <> ${libobj}T <&2 + 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 + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + qarg=\"`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`\" ### testsuite: skip nested quoting test + ;; + *) qarg=$arg ;; + esac + libtool_args="$libtool_args $qarg" + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + output) + compile_command="$compile_command @OUTPUT@" + finalize_command="$finalize_command @OUTPUT@" + ;; + esac + + case $prev in + dlfiles|dlprefiles) + if test "$preload" = no; then + # Add the symbol object into the linking commands. + compile_command="$compile_command @SYMFILE@" + finalize_command="$finalize_command @SYMFILE@" + preload=yes + fi + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test "$dlself" = no; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test "$prev" = dlprefiles; then + dlself=yes + elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test "$prev" = dlfiles; then + dlfiles="$dlfiles $arg" + else + dlprefiles="$dlprefiles $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols="$arg" + if test ! -f "$arg"; then + $echo "$modename: symbol file \`$arg' does not exist" + exit $EXIT_FAILURE + fi + prev= + continue + ;; + expsyms_regex) + export_symbols_regex="$arg" + prev= + continue + ;; + inst_prefix) + inst_prefix_dir="$arg" + prev= + continue + ;; + precious_regex) + precious_files_regex="$arg" + prev= + continue + ;; + release) + release="-$arg" + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat $save_arg` + do +# moreargs="$moreargs $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + pic_object= + non_pic_object= + + # Read the .lo file + # If there is no directory component, then add one. + case $arg in + */* | *\\*) . $arg ;; + *) . ./$arg ;; + esac + + if test -z "$pic_object" || \ + test -z "$non_pic_object" || + test "$pic_object" = none && \ + test "$non_pic_object" = none; then + $echo "$modename: cannot find name of object for \`$arg'" 1>&2 + exit $EXIT_FAILURE + fi + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles="$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 "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles $pic_object" + prev= + fi + + # A PIC object. + libobjs="$libobjs $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + non_pic_objects="$non_pic_objects $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; 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" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if test -z "$run"; then + $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 + exit $EXIT_FAILURE + else + # Dry-run case. + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` + non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` + libobjs="$libobjs $pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + fi + done + else + $echo "$modename: link input file \`$save_arg' does not exist" + exit $EXIT_FAILURE + fi + arg=$save_arg + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + $echo "$modename: only absolute run-paths are allowed" 1>&2 + exit $EXIT_FAILURE + ;; + esac + if test "$prev" = rpath; then + case "$rpath " in + *" $arg "*) ;; + *) rpath="$rpath $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) xrpath="$xrpath $arg" ;; + esac + fi + prev= + continue + ;; + xcompiler) + compiler_flags="$compiler_flags $qarg" + prev= + compile_command="$compile_command $qarg" + finalize_command="$finalize_command $qarg" + continue + ;; + xlinker) + linker_flags="$linker_flags $qarg" + compiler_flags="$compiler_flags $wl$qarg" + prev= + compile_command="$compile_command $wl$qarg" + finalize_command="$finalize_command $wl$qarg" + continue + ;; + xcclinker) + linker_flags="$linker_flags $qarg" + compiler_flags="$compiler_flags $qarg" + prev= + compile_command="$compile_command $qarg" + finalize_command="$finalize_command $qarg" + continue + ;; + shrext) + shrext_cmds="$arg" + prev= + continue + ;; + darwin_framework|darwin_framework_skip) + test "$prev" = "darwin_framework" && compiler_flags="$compiler_flags $arg" + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + prev= + 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 + compile_command="$compile_command $link_static_flag" + finalize_command="$finalize_command $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + $echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2 + continue + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + $echo "$modename: more than one -exported-symbols argument is not allowed" + exit $EXIT_FAILURE + fi + if test "X$arg" = "X-export-symbols"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -framework|-arch|-isysroot) + case " $CC " in + *" ${arg} ${1} "* | *" ${arg} ${1} "*) + prev=darwin_framework_skip ;; + *) compiler_flags="$compiler_flags $arg" + prev=darwin_framework ;; + esac + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + 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*) + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + ;; + esac + continue + ;; + + -L*) + dir=`$echo "X$arg" | $Xsed -e 's/^-L//'` + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2 + absdir="$dir" + notinst_path="$notinst_path $dir" + fi + dir="$absdir" + ;; + esac + case "$deplibs " in + *" -L$dir "*) ;; + *) + deplibs="$deplibs -L$dir" + lib_search_path="$lib_search_path $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) + testbindir=`$echo "X$dir" | $Xsed -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + *) dllsearchpath="$dllsearchpath:$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + *) dllsearchpath="$dllsearchpath:$testbindir";; + esac + ;; + esac + continue + ;; + + -l*) + if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos*) + # 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$arg" = "X-lc" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + test "X$arg" = "X-lc" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + deplibs="$deplibs -framework System" + continue + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + test "X$arg" = "X-lc" && continue + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + test "X$arg" = "X-lc" && continue + ;; + esac + elif test "X$arg" = "X-lc_r"; then + case $host in + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + deplibs="$deplibs $arg" + continue + ;; + + # Tru64 UNIX uses -model [arg] to determine the layout of C++ + # classes, name mangling, and exception handling. + -model) + compile_command="$compile_command $arg" + compiler_flags="$compiler_flags $arg" + finalize_command="$finalize_command $arg" + prev=xcompiler + continue + ;; + + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) + compiler_flags="$compiler_flags $arg" + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + continue + ;; + + -multi_module) + single_module="${wl}-multi_module" + continue + ;; + + -module) + module=yes + continue + ;; + + # -64, -mips[0-9] enable 64-bit mode on the SGI compiler + # -r[0-9][0-9]* specifies the processor on the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler + # +DA*, +DD* enable 64-bit mode on the HP compiler + # -q* pass through compiler args for the IBM compiler + # -m* pass through architecture-specific compiler args for GCC + # -m*, -t[45]*, -txscale* pass through architecture-specific + # compiler args for GCC + # -p, -pg, --coverage, -fprofile-* pass through profiling flag for GCC + # -F/path gives path to uninstalled frameworks, gcc on darwin + # @file GCC response files + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*) + + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + compiler_flags="$compiler_flags $arg" + continue + ;; + + -shrext) + prev=shrext + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin*) + # The PATH hackery in wrapper scripts is required on Windows + # and Darwin in order for the loader to find any dlls it needs. + $echo "$modename: warning: \`-no-install' is ignored for $host" 1>&2 + $echo "$modename: warning: assuming \`-no-fast-install' instead" 1>&2 + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -objectlist) + prev=objectlist + continue + ;; + + -o) prev=output ;; + + -precious-files-regex) + prev=precious_regex + continue + ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + dir=`$echo "X$arg" | $Xsed -e 's/^-R//'` + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + $echo "$modename: only absolute run-paths are allowed" 1>&2 + exit $EXIT_FAILURE + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$xrpath $dir" ;; + esac + 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 + ;; + + -Wc,*) + args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'` + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + case $flag in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + flag="\"$flag\"" + ;; + esac + arg="$arg $wl$flag" + compiler_flags="$compiler_flags $flag" + done + IFS="$save_ifs" + arg=`$echo "X$arg" | $Xsed -e "s/^ //"` + ;; + + -Wl,*) + args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'` + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + case $flag in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + flag="\"$flag\"" + ;; + esac + arg="$arg $wl$flag" + compiler_flags="$compiler_flags $wl$flag" + linker_flags="$linker_flags $flag" + done + IFS="$save_ifs" + arg=`$echo "X$arg" | $Xsed -e "s/^ //"` + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + continue + ;; + + # Some other compiler flag. + -* | +*) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + ;; + + *.$objext) + # A standard object. + objs="$objs $arg" + ;; + + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + pic_object= + non_pic_object= + + # Read the .lo file + # If there is no directory component, then add one. + case $arg in + */* | *\\*) . $arg ;; + *) . ./$arg ;; + esac + + if test -z "$pic_object" || \ + test -z "$non_pic_object" || + test "$pic_object" = none && \ + test "$non_pic_object" = none; then + $echo "$modename: cannot find name of object for \`$arg'" 1>&2 + exit $EXIT_FAILURE + fi + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles="$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 "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles $pic_object" + prev= + fi + + # A PIC object. + libobjs="$libobjs $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + non_pic_objects="$non_pic_objects $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; 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" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if test -z "$run"; then + $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 + exit $EXIT_FAILURE + else + # Dry-run case. + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` + non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` + libobjs="$libobjs $pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + fi + ;; + + *.$libext) + # An archive. + deplibs="$deplibs $arg" + old_deplibs="$old_deplibs $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + if test "$prev" = dlfiles; then + # This library was specified with -dlopen. + dlfiles="$dlfiles $arg" + prev= + elif test "$prev" = dlprefiles; then + # The library was specified with -dlpreopen. + dlprefiles="$dlprefiles $arg" + prev= + else + deplibs="$deplibs $arg" + 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. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + ;; + esac # arg + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + fi + done # argument parsing loop + + if test -n "$prev"; then + $echo "$modename: the \`$prevarg' option requires an argument" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'` + libobjs_save="$libobjs" + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$echo \"X\${$shlibpath_var}\" \| \$Xsed -e \'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\" + + output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'` + if test "X$output_objdir" = "X$output"; then + output_objdir="$objdir" + else + output_objdir="$output_objdir/$objdir" + fi + # Create the object directory. + if test ! -d "$output_objdir"; then + $show "$mkdir $output_objdir" + $run $mkdir $output_objdir + exit_status=$? + if test "$exit_status" -ne 0 && test ! -d "$output_objdir"; then + exit $exit_status + fi + fi + + # Determine the type of output + case $output in + "") + $echo "$modename: you must specify an output file" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + esac + + case $host in + *cygwin* | *mingw* | *pw32*) + # don't eliminate duplications in $postdeps and $predeps + duplicate_compiler_generated_deps=yes + ;; + *) + duplicate_compiler_generated_deps=$duplicate_deps + ;; + 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 test "X$duplicate_deps" = "Xyes" ; then + case "$libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + libs="$libs $deplib" + done + + if test "$linkmode" = lib; 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 test "X$duplicate_compiler_generated_deps" = "Xyes" ; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;; + esac + pre_post_deps="$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 + case $linkmode in + lib) + passes="conv link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + $echo "$modename: libraries can \`-dlopen' only libtool libraries: $file" 1>&2 + exit $EXIT_FAILURE + ;; + esac + done + ;; + prog) + compile_deplibs= + finalize_deplibs= + alldeplibs=no + newdlfiles= + newdlprefiles= + passes="conv scan dlopen dlpreopen link" + ;; + *) passes="conv" + ;; + esac + for pass in $passes; do + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan"; then + libs="$deplibs" + deplibs= + fi + if test "$linkmode" = prog; then + case $pass in + dlopen) libs="$dlfiles" ;; + dlpreopen) libs="$dlprefiles" ;; + link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; + esac + fi + if test "$pass" = dlopen; then + # Collect dlpreopened libraries + save_deplibs="$deplibs" + deplibs= + fi + for deplib in $libs; do + lib= + found=no + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + compiler_flags="$compiler_flags $deplib" + fi + continue + ;; + -l*) + if test "$linkmode" != lib && test "$linkmode" != prog; then + $echo "$modename: warning: \`-l' is ignored for archives/objects" 1>&2 + continue + fi + name=`$echo "X$deplib" | $Xsed -e 's/^-l//'` + if test "$linkmode" = lib; 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 "$search_ext" = ".la"; then + found=yes + else + found=no + fi + break 2 + fi + done + done + if test "$found" != yes; then + # deplib doesn't seem to be a libtool library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + else # 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 "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $deplib "*) + if (${SED} -e '2q' $lib | + grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + library_names= + old_library= + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + for l in $old_library $library_names; do + ll="$l" + done + if test "X$ll" = "X$old_library" ; then # only static version available + found=no + ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` + test "X$ladir" = "X$lib" && ladir="." + lib=$ladir/$old_library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + fi + ;; # -l + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test "$pass" = conv && continue + newdependency_libs="$deplib $newdependency_libs" + newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` + ;; + prog) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + if test "$pass" = scan; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` + ;; + *) + $echo "$modename: warning: \`-L' is ignored for archives/objects" 1>&2 + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test "$pass" = link; then + dir=`$echo "X$deplib" | $Xsed -e 's/^-R//'` + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$xrpath $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) lib="$deplib" ;; + *.$libext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + valid_a_lib=no + case $deplibs_check_method in + match_pattern*) + set dummy $deplibs_check_method + match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` + if eval $echo \"$deplib\" 2>/dev/null \ + | $SED 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + valid_a_lib=yes + fi + ;; + pass_all) + valid_a_lib=yes + ;; + esac + if test "$valid_a_lib" != yes; then + $echo + $echo "*** Warning: Trying to link with static lib archive $deplib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because the file extensions .$libext of this argument makes me believe" + $echo "*** that it is just a static archive that I should not used here." + else + $echo + $echo "*** Warning: Linking the shared library $output against the" + $echo "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + fi + continue + ;; + prog) + if test "$pass" != link; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + elif test "$linkmode" = prog; then + if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + newdlprefiles="$newdlprefiles $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + newdlfiles="$newdlfiles $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=yes + continue + ;; + esac # case $deplib + if test "$found" = yes || test -f "$lib"; then : + else + $echo "$modename: cannot find the library \`$lib' or unhandled argument \`$deplib'" 1>&2 + exit $EXIT_FAILURE + fi + + # Check to see that this really is a libtool archive. + if (${SED} -e '2q' $lib | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + + ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` + test "X$ladir" = "X$lib" && ladir="." + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= + # 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 + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan" || + { test "$linkmode" != prog && test "$linkmode" != lib; }; then + test -n "$dlopen" && dlfiles="$dlfiles $dlopen" + test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen" + fi + + if test "$pass" = conv; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + # It is a libtool convenience library, so add in its objects. + convenience="$convenience $ladir/$objdir/$old_library" + old_convenience="$old_convenience $ladir/$objdir/$old_library" + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if test "X$duplicate_deps" = "Xyes" ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done + elif test "$linkmode" != prog && test "$linkmode" != lib; then + $echo "$modename: \`$lib' is not a convenience library" 1>&2 + exit $EXIT_FAILURE + fi + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + for l in $old_library $library_names; do + linklib="$l" + done + if test -z "$linklib"; then + $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + + # This library was specified with -dlopen. + if test "$pass" = dlopen; then + if test -z "$libdir"; then + $echo "$modename: cannot -dlopen a convenience library: \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + if test -z "$dlname" || + test "$dlopen_support" != yes || + test "$build_libtool_libs" = no; 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. + dlprefiles="$dlprefiles $lib $dependency_libs" + else + newdlfiles="$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 + $echo "$modename: warning: cannot determine absolute directory name of \`$ladir'" 1>&2 + $echo "$modename: passing it literally to the linker, although it might fail" 1>&2 + abs_ladir="$ladir" + fi + ;; + esac + laname=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` + + # Find the relevant object directory and library name. + if test "X$installed" = Xyes; then + if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + $echo "$modename: warning: library \`$lib' was moved." 1>&2 + dir="$ladir" + absdir="$abs_ladir" + libdir="$abs_ladir" + else + dir="$libdir" + absdir="$libdir" + fi + test "X$hardcode_automatic" = Xyes && 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 + notinst_path="$notinst_path $abs_ladir" + else + dir="$ladir/$objdir" + absdir="$abs_ladir/$objdir" + # Remove this search path later + notinst_path="$notinst_path $abs_ladir" + fi + fi # $installed = yes + name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` + + # This library was specified with -dlpreopen. + if test "$pass" = dlpreopen; then + if test -z "$libdir"; then + $echo "$modename: cannot -dlpreopen a convenience library: \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + newdlprefiles="$newdlprefiles $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + newdlprefiles="$newdlprefiles $dir/$dlname" + else + newdlprefiles="$newdlprefiles $dir/$linklib" + fi + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test "$linkmode" = lib; then + deplibs="$dir/$old_library $deplibs" + elif test "$linkmode,$pass" = "prog,link"; 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 "$linkmode" = prog && test "$pass" != link; then + newlib_search_path="$newlib_search_path $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=no + if test "$link_all_deplibs" != no || test -z "$library_names" || + test "$build_libtool_libs" = no; then + linkalldeplibs=yes + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test + esac + # Need to link against all dependency_libs? + if test "$linkalldeplibs" = yes; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi + if test "X$duplicate_deps" = "Xyes" ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test "$linkmode,$pass" = "prog,link"; then + if test -n "$library_names" && + { { test "$prefer_static_libs" = no || + test "$prefer_static_libs,$installed" = "built,yes"; } || + 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 + *" $dir "*) ;; + *" $absdir "*) ;; + *) temp_rpath="$temp_rpath $absdir" ;; + 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 "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if test "$alldeplibs" = yes && + { test "$deplibs_check_method" = pass_all || + { test "$build_libtool_libs" = yes && + 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 "$use_static_libs" = built && test "$installed" = yes ; then + use_static_libs=no + fi + if test -n "$library_names" && + { test "$use_static_libs" = no || test -z "$old_library"; }; then + if test "$installed" = no; then + notinst_deplibs="$notinst_deplibs $lib" + need_relink=yes + fi + # This is a shared library + + # Warn about portability, can't link against -module's on + # some systems (darwin) + if test "$shouldnotlink" = yes && test "$pass" = link ; then + $echo + if test "$linkmode" = prog; then + $echo "*** Warning: Linking the executable $output against the loadable module" + else + $echo "*** Warning: Linking the shared library $output against the loadable module" + fi + $echo "*** $linklib is not portable!" + fi + if test "$linkmode" = lib && + test "$hardcode_into_libs" = yes; 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 "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + realname="$2" + shift; 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 in + *cygwin* | mingw*) + major=`expr $current - $age` + versuffix="-$major" + ;; + esac + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot="$soname" + soname=`$echo $soroot | ${SED} -e 's/^.*\///'` + newlib="libimp-`$echo $soname | ${SED} 's/^lib//;s/\.dll$//'`.a" + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + $show "extracting exported symbol list from \`$soname'" + save_ifs="$IFS"; IFS='~' + cmds=$extract_expsyms_cmds + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + $show "generating import library for \`$soname'" + save_ifs="$IFS"; IFS='~' + cmds=$old_archive_from_expsyms_cmds + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + 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 "$linkmode" = prog || test "$mode" != relink; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test "$hardcode_direct" = no; 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 module then we can not link against + # it, someone is ignoring the new warnings I added + if /usr/bin/file -L $add 2> /dev/null | + $EGREP ": [^:]* bundle" >/dev/null ; then + $echo "** Warning, lib $linklib is a module, not a shared library" + if test -z "$old_library" ; then + $echo + $echo "** And there doesn't seem to be a static archive available" + $echo "** The link will probably fail, sorry" + else + add="$dir/$old_library" + fi + fi + esac + elif test "$hardcode_minus_L" = no; then + case $host in + *-*-sunos*) add_shlibpath="$dir" ;; + esac + add_dir="-L$dir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = no; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + relink) + if test "$hardcode_direct" = yes; then + add="$dir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$dir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + add_dir="$add_dir -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test "$lib_linked" != yes; then + $echo "$modename: configuration error: unsupported hardcode properties" + exit $EXIT_FAILURE + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;; + esac + fi + if test "$linkmode" = prog; 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 "$hardcode_direct" != yes && \ + test "$hardcode_minus_L" != yes && \ + test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; + esac + fi + fi + fi + + if test "$linkmode" = prog || test "$mode" = relink; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test "$hardcode_direct" = yes; then + add="$libdir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$libdir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; + esac + add="-l$name" + elif test "$hardcode_automatic" = yes; 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$libdir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + add_dir="$add_dir -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + fi + + if test "$linkmode" = prog; 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 "$linkmode" = prog; 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 "$hardcode_direct" != unsupported; 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 "$build_libtool_libs" = yes; then + # Not a shared library + if test "$deplibs_check_method" != pass_all; 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. + $echo + $echo "*** Warning: This system can not link to static lib archive $lib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have." + if test "$module" = yes; then + $echo "*** But as you try to build a module library, libtool will still create " + $echo "*** a static module, that should work as long as the dlopening application" + $echo "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then + $echo + $echo "*** However, this would only work if libtool was able to extract symbol" + $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + $echo "*** not find such a program. So, this module is probably useless." + $echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + 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 "$linkmode" = lib; then + if test -n "$dependency_libs" && + { test "$hardcode_into_libs" != yes || + test "$build_old_libs" = yes || + test "$link_static" = yes; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) temp_xrpath=`$echo "X$libdir" | $Xsed -e 's/^-R//'` + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) xrpath="$xrpath $temp_xrpath";; + esac;; + *) temp_deplibs="$temp_deplibs $libdir";; + esac + done + dependency_libs="$temp_deplibs" + fi + + newlib_search_path="$newlib_search_path $absdir" + # Link against this library + test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + if test "X$duplicate_deps" = "Xyes" ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done + + if test "$link_all_deplibs" != no; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + case $deplib in + -L*) path="$deplib" ;; + *.la) + dir=`$echo "X$deplib" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$deplib" && dir="." + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2 + absdir="$dir" + fi + ;; + esac + if grep "^installed=no" $deplib > /dev/null; then + path="$absdir/$objdir" + else + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + if test -z "$libdir"; then + $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + if test "$absdir" != "$libdir"; then + $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2 + fi + path="$absdir" + fi + depdepl= + case $host in + *-*-darwin*) + # we do not want to link against static libs, + # but need to link against shared + eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + eval deplibdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names" ; then + for tmp in $deplibrary_names ; do + depdepl=$tmp + done + if test -f "$deplibdir/$depdepl" ; then + depdepl="$deplibdir/$depdepl" + elif test -f "$path/$depdepl" ; then + depdepl="$path/$depdepl" + else + # Can't find it, oh well... + depdepl= + fi + # do not add paths which are already there + case " $newlib_search_path " in + *" $path "*) ;; + *) newlib_search_path="$newlib_search_path $path";; + esac + fi + path="" + ;; + *) + path="-L$path" + ;; + esac + ;; + -l*) + case $host in + *-*-darwin*) + # Again, we only want to link against shared libraries + eval tmp_libs=`$echo "X$deplib" | $Xsed -e "s,^\-l,,"` + for tmp in $newlib_search_path ; do + if test -f "$tmp/lib$tmp_libs.dylib" ; then + eval depdepl="$tmp/lib$tmp_libs.dylib" + break + fi + done + path="" + ;; + *) continue ;; + esac + ;; + *) continue ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$path $deplibs" ;; + esac + case " $deplibs " in + *" $depdepl "*) ;; + *) deplibs="$depdepl $deplibs" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + dependency_libs="$newdependency_libs" + if test "$pass" = dlpreopen; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test "$pass" != dlopen; then + if test "$pass" != conv; then + # 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 "*) ;; + *) lib_search_path="$lib_search_path $dir" ;; + esac + done + newlib_search_path= + fi + + if test "$linkmode,$pass" != "prog,link"; then + vars="deplibs" + else + vars="compile_deplibs finalize_deplibs" + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # 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. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) tmp_libs="$tmp_libs $deplib" ;; + esac + ;; + *) tmp_libs="$tmp_libs $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + # 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 + tmp_libs="$tmp_libs $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test "$linkmode" = prog; then + dlfiles="$newdlfiles" + dlprefiles="$newdlprefiles" + fi + + case $linkmode in + oldlib) + case " $deplibs" in + *\ -l* | *\ -L*) + $echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2 ;; + esac + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2 + fi + + if test -n "$rpath"; then + $echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2 + fi + + if test -n "$xrpath"; then + $echo "$modename: warning: \`-R' is ignored for archives" 1>&2 + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info/-version-number' is ignored for archives" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for archives" 1>&2 + fi + + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + $echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2 + fi + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs="$output" + objs="$objs$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form `libNAME.la'. + case $outputname in + lib*) + name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + ;; + *) + if test "$module" = no; then + $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + if test "$need_lib_prefix" != no; then + # Add the "lib" prefix for modules if required + name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + else + libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` + fi + ;; + esac + + if test -n "$objs"; then + if test "$deplibs_check_method" != pass_all; then + $echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1 + exit $EXIT_FAILURE + else + $echo + $echo "*** Warning: Linking the shared library $output against the non-libtool" + $echo "*** objects $objs is not portable!" + libobjs="$libobjs $objs" + fi + fi + + if test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen self' is ignored for libtool libraries" 1>&2 + fi + + set dummy $rpath + if test "$#" -gt 2; then + $echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2 + fi + install_libdir="$2" + + oldlibs= + if test -z "$rpath"; then + if test "$build_libtool_libs" = yes; then + # Building a libtool convenience library. + # 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 + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info/-version-number' is ignored for convenience libraries" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2 + fi + else + + # Parse the version information argument. + save_ifs="$IFS"; IFS=':' + set dummy $vinfo 0 0 0 + IFS="$save_ifs" + + if test -n "$8"; then + $echo "$modename: too many parameters to \`-version-info'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # 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="$2" + number_minor="$3" + number_revision="$4" + # + # 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 + # which has an extra 1 added just for fun + # + case $version_type in + darwin|linux|osf|windows|none) + current=`expr $number_major + $number_minor` + age="$number_minor" + revision="$number_revision" + ;; + freebsd-aout|freebsd-elf|sunos) + current="$number_major" + revision="$number_minor" + age="0" + ;; + irix|nonstopux) + current=`expr $number_major + $number_minor` + age="$number_minor" + revision="$number_minor" + lt_irix_increment=no + ;; + esac + ;; + no) + current="$2" + revision="$3" + age="$4" + ;; + 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]) ;; + *) + $echo "$modename: CURRENT \`$current' must be a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + ;; + 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]) ;; + *) + $echo "$modename: REVISION \`$revision' must be a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + ;; + 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]) ;; + *) + $echo "$modename: AGE \`$age' must be a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + if test "$age" -gt "$current"; then + $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + 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 + major=.`expr $current - $age` + versuffix="$major.$age.$revision" + # Darwin ld doesn't like 0 for these options... + minor_current=`expr $current + 1` + xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + + freebsd-aout) + major=".$current" + versuffix=".$current.$revision"; + ;; + + freebsd-elf) + major=".$current" + versuffix=".$current"; + ;; + + irix | nonstopux) + if test "X$lt_irix_increment" = "Xno"; then + major=`expr $current - $age` + else + major=`expr $current - $age + 1` + fi + 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 "$loop" -ne 0; do + iface=`expr $revision - $loop` + loop=`expr $loop - 1` + verstring="$verstring_prefix$major.$iface:$verstring" + done + + # Before this point, $major must not contain `.'. + major=.$major + versuffix="$major.$revision" + ;; + + linux) + major=.`expr $current - $age` + versuffix="$major.$age.$revision" + ;; + + osf) + major=.`expr $current - $age` + versuffix=".$current.$age.$revision" + verstring="$current.$age.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$age + while test "$loop" -ne 0; do + iface=`expr $current - $loop` + loop=`expr $loop - 1` + verstring="$verstring:${iface}.0" + done + + # Make executables depend on our current version. + verstring="$verstring:${current}.0" + ;; + + sunos) + major=".$current" + versuffix=".$current.$revision" + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 filesystems. + major=`expr $current - $age` + versuffix="-$major" + ;; + + *) + $echo "$modename: unknown library version type \`$version_type'" 1>&2 + $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit $EXIT_FAILURE + ;; + 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 "$need_version" = no; then + versuffix= + else + versuffix=".0.0" + fi + fi + + # Remove version info from name if versioning should be avoided + if test "$avoid_version" = yes && test "$need_version" = no; then + major= + versuffix= + verstring="" + fi + + # Check to see if the archive will have undefined symbols. + if test "$allow_undefined" = yes; then + if test "$allow_undefined_flag" = unsupported; then + $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2 + build_libtool_libs=no + build_old_libs=yes + fi + else + # Don't allow undefined symbols. + allow_undefined_flag="$no_undefined_flag" + fi + fi + + if test "$mode" != relink; 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) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) + if test "X$precious_files_regex" != "X"; then + if echo $p | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + removelist="$removelist $p" + ;; + *) ;; + esac + done + if test -n "$removelist"; then + $show "${rm}r $removelist" + $run ${rm}r $removelist + fi + fi + + # Now set the variables for building old libraries. + if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then + oldlibs="$oldlibs $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + #for path in $notinst_path; do + # lib_search_path=`$echo "$lib_search_path " | ${SED} -e "s% $path % %g"` + # deplibs=`$echo "$deplibs " | ${SED} -e "s% -L$path % %g"` + # dependency_libs=`$echo "$dependency_libs " | ${SED} -e "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 + temp_xrpath="$temp_xrpath -R$libdir" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; 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 "*) ;; + *) dlfiles="$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 "*) ;; + *) dlprefiles="$dlprefiles $lib" ;; + esac + done + + if test "$build_libtool_libs" = yes; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + deplibs="$deplibs -framework System" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # 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 "$build_libtool_need_lc" = "yes"; then + deplibs="$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 + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $rm conftest.c + cat > conftest.c </dev/null` + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null \ + | grep " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib="$potent_lib" + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; + *) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \ + | ${SED} 10q \ + | $EGREP "$file_magic_regex" > /dev/null; then + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + $echo + $echo "*** Warning: linker path does not have real file for library $a_deplib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $echo "*** with $libname but no candidates were found. (...for file magic test)" + else + $echo "*** with $libname and none of the candidates passed a file format test" + $echo "*** using a file magic. Last file checked: $potlib" + fi + fi + else + # Add a -L argument. + newdeplibs="$newdeplibs $a_deplib" + fi + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method + match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` + for a_deplib in $deplibs; do + name=`expr $a_deplib : '-l\(.*\)'` + # If $name is empty we are operating on a -L argument. + if test -n "$name" && test "$name" != "0"; then + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $a_deplib "*) + newdeplibs="$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 + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + $echo + $echo "*** Warning: linker path does not have real file for library $a_deplib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $echo "*** with $libname but no candidates were found. (...for regex pattern test)" + else + $echo "*** with $libname and none of the candidates passed a file format test" + $echo "*** using a regex pattern. Last file checked: $potlib" + fi + fi + else + # Add a -L argument. + newdeplibs="$newdeplibs $a_deplib" + fi + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs="" + tmp_deplibs=`$echo "X $deplibs" | $Xsed -e 's/ -lc$//' \ + -e 's/ -[LR][^ ]*//g'` + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + for i in $predeps $postdeps ; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$echo "X $tmp_deplibs" | ${SED} -e "1s,^X,," -e "s,$i,,"` + done + fi + if $echo "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' \ + | grep . >/dev/null; then + $echo + if test "X$deplibs_check_method" = "Xnone"; then + $echo "*** Warning: inter-library dependencies are not supported in this platform." + else + $echo "*** Warning: inter-library dependencies are not known to be supported." + fi + $echo "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + fi + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + newdeplibs=`$echo "X $newdeplibs" | $Xsed -e 's/ -lc / -framework System /'` + ;; + esac + + if test "$droppeddeps" = yes; then + if test "$module" = yes; then + $echo + $echo "*** Warning: libtool could not satisfy all declared inter-library" + $echo "*** dependencies of module $libname. Therefore, libtool will create" + $echo "*** a static module, that should work as long as the dlopening" + $echo "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + $echo + $echo "*** However, this would only work if libtool was able to extract symbol" + $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + $echo "*** not find such a program. So, this module is probably useless." + $echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + $echo "*** The inter-library dependencies that have been dropped here will be" + $echo "*** automatically added whenever a program is linked with this library" + $echo "*** or is declared to -dlopen it." + + if test "$allow_undefined" = no; 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 "$build_old_libs" = no; 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 + + + # 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 "*) + new_libs="$new_libs -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$new_libs $deplib" ;; + esac + ;; + *) new_libs="$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 "$build_libtool_libs" = yes; then + if test "$hardcode_into_libs" = yes; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath="$finalize_rpath" + test "$mode" != relink && rpath="$compile_rpath$rpath" + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + dep_rpath="$dep_rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + if test -n "$hardcode_libdir_flag_spec_ld"; then + case $archive_cmds in + *\$LD*) eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" ;; + *) eval dep_rpath=\"$hardcode_libdir_flag_spec\" ;; + esac + else + eval dep_rpath=\"$hardcode_libdir_flag_spec\" + fi + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath="$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 "$mode" != relink && 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 + realname="$2" + shift; 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 + linknames="$linknames $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then + $show "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $run $rm $export_symbols + cmds=$export_symbols_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + if len=`expr "X$cmd" : ".*"` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then + $show "$cmd" + $run eval "$cmd" || exit $? + skipped_export=false + else + # The command line is too long to execute in one step. + $show "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"; then + $show "$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"" + $run eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + $show "$mv \"${export_symbols}T\" \"$export_symbols\"" + $run eval '$mv "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"' + fi + + tmp_deplibs= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + tmp_deplibs="$tmp_deplibs $test_deplib" + ;; + esac + done + deplibs="$tmp_deplibs" + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + else + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + func_extract_archives $gentop $convenience + libobjs="$libobjs $func_extract_archives_result" + fi + fi + + if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + linker_flags="$linker_flags $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test "$mode" = relink; then + $run eval '(cd $output_objdir && $rm ${realname}U && $mv $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test "$module" = yes && 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 "X$skipped_export" != "X:" && + len=`expr "X$test_cmds" : ".*" 2>/dev/null` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # The command line is too long to link in one step, link piecewise. + $echo "creating reloadable object files..." + + # 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 + output_la=`$echo "X$output" | $Xsed -e "$basename"` + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + delfiles= + last_robj= + k=1 + output=$output_objdir/$output_la-${k}.$objext + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + eval test_cmds=\"$reload_cmds $objlist $last_robj\" + if test "X$objlist" = X || + { len=`expr "X$test_cmds" : ".*" 2>/dev/null` && + test "$len" -le "$max_cmd_len"; }; then + objlist="$objlist $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test "$k" -eq 1 ; then + # The first file doesn't have a previous command to add. + eval concat_cmds=\"$reload_cmds $objlist $last_robj\" + else + # All subsequent reloadable object files will link in + # the last one created. + eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj\" + fi + last_robj=$output_objdir/$output_la-${k}.$objext + k=`expr $k + 1` + output=$output_objdir/$output_la-${k}.$objext + objlist=$obj + len=1 + 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~ + eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\" + + if ${skipped_export-false}; then + $show "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $run $rm $export_symbols + libobjs=$output + # Append the command to create the export file. + eval concat_cmds=\"\$concat_cmds~$export_symbols_cmds\" + fi + + # Set up a command to remove the reloadable object files + # after they are used. + i=0 + while test "$i" -lt "$k" + do + i=`expr $i + 1` + delfiles="$delfiles $output_objdir/$output_la-${i}.$objext" + done + + $echo "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" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + 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\" + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test "$module" = yes && 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 + + # Append the command to remove the reloadable object files + # to the just-reset $cmds. + eval cmds=\"\$cmds~\$rm $delfiles\" + fi + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$mode" = relink; then + $run eval '(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 "$mode" = relink; then + $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 + $show "${rm}r $gentop" + $run ${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 + $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)" + $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $? + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test "$module" = yes || test "$export_dynamic" = yes; then + # On all known operating systems, these are identical. + dlname="$soname" + fi + fi + ;; + + obj) + case " $deplibs" in + *\ -l* | *\ -L*) + $echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2 ;; + esac + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2 + fi + + if test -n "$rpath"; then + $echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2 + fi + + if test -n "$xrpath"; then + $echo "$modename: warning: \`-R' is ignored for objects" 1>&2 + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for objects" 1>&2 + fi + + case $output in + *.lo) + if test -n "$objs$old_deplibs"; then + $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2 + exit $EXIT_FAILURE + fi + libobj="$output" + obj=`$echo "X$output" | $Xsed -e "$lo2o"` + ;; + *) + libobj= + obj="$output" + ;; + esac + + # Delete the old objects. + $run $rm $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # reload_cmds runs $LD directly, so let us get rid of + # -Wl from whole_archive_flag_spec and hope we can get by with + # turning comma into space.. + wl= + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" + reload_conv_objs=$reload_objs\ `$echo "X$tmp_whole_archive_flags" | $Xsed -e 's|,| |g'` + else + gentop="$output_objdir/${obj}x" + generated="$generated $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + + # Create the old-style object. + reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test + + output="$obj" + cmds=$reload_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + exit $EXIT_SUCCESS + fi + + if test "$build_libtool_libs" != yes; then + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. + # $show "echo timestamp > $libobj" + # $run eval "echo timestamp > $libobj" || exit $? + exit $EXIT_SUCCESS + fi + + if test -n "$pic_flag" || test "$pic_mode" != default; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output="$libobj" + cmds=$reload_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + exit $EXIT_SUCCESS + ;; + + prog) + case $host in + *cygwin*) output=`$echo $output | ${SED} -e 's,.exe$,,;s,$,.exe,'` ;; + esac + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for programs" 1>&2 + fi + + if test "$preload" = yes; then + if test "$dlopen_support" = unknown && test "$dlopen_self" = unknown && + test "$dlopen_self_static" = unknown; then + $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support." + fi + fi + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$echo "X $compile_deplibs" | $Xsed -e 's/ -lc / -framework System /'` + finalize_deplibs=`$echo "X $finalize_deplibs" | $Xsed -e 's/ -lc / -framework System /'` + ;; + esac + + case $host in + *darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + if test "$tagname" = CXX ; then + compile_command="$compile_command ${wl}-bind_at_load" + finalize_command="$finalize_command ${wl}-bind_at_load" + fi + ;; + 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 "*) + new_libs="$new_libs -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$new_libs $deplib" ;; + esac + ;; + *) new_libs="$new_libs $deplib" ;; + esac + done + compile_deplibs="$new_libs" + + + compile_command="$compile_command $compile_deplibs" + finalize_command="$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 "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) + testbindir=`$echo "X$libdir" | $Xsed -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$libdir:"*) ;; + *) dllsearchpath="$dllsearchpath:$libdir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + *) dllsearchpath="$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"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath="$rpath" + + if test -n "$libobjs" && test "$build_old_libs" = yes; then + # Transform all the library objects into standard objects. + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + fi + + dlsyms= + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + dlsyms="${outputname}S.c" + else + $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2 + fi + fi + + if test -n "$dlsyms"; then + case $dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist="$output_objdir/${outputname}.nm" + + $show "$rm $nlist ${nlist}S ${nlist}T" + $run $rm "$nlist" "${nlist}S" "${nlist}T" + + # Parse the name list into a source file. + $show "creating $output_objdir/$dlsyms" + + test -z "$run" && $echo > "$output_objdir/$dlsyms" "\ +/* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */ +/* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +/* Prevent the only kind of declaration conflicts we can make. */ +#define lt_preloaded_symbols some_other_symbol + +/* External symbol declarations for the compiler. */\ +" + + if test "$dlself" = yes; then + $show "generating symbol list for \`$output'" + + test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$echo "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + for arg in $progfiles; do + $show "extracting global C symbols from \`$arg'" + $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $run eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + $run eval '$mv "$nlist"T "$nlist"' + fi + + if test -n "$export_symbols_regex"; then + $run eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + $run eval '$mv "$nlist"T "$nlist"' + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols="$output_objdir/$outputname.exp" + $run $rm $export_symbols + $run eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + case $host in + *cygwin* | *mingw* ) + $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + $run eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' + ;; + esac + else + $run eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + $run eval 'grep -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' + $run eval 'mv "$nlist"T "$nlist"' + case $host in + *cygwin* | *mingw* ) + $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + $run eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' + ;; + esac + fi + fi + + for arg in $dlprefiles; do + $show "extracting global C symbols from \`$arg'" + name=`$echo "$arg" | ${SED} -e 's%^.*/%%'` + $run eval '$echo ": $name " >> "$nlist"' + $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" + done + + if test -z "$run"; then + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $mv "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if grep -v "^: " < "$nlist" | + 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/$dlsyms"' + else + $echo '/* NONE */' >> "$output_objdir/$dlsyms" + fi + + $echo >> "$output_objdir/$dlsyms" "\ + +#undef lt_preloaded_symbols + +#if defined (__STDC__) && __STDC__ +# define lt_ptr void * +#else +# define lt_ptr char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +" + + case $host in + *cygwin* | *mingw* ) + $echo >> "$output_objdir/$dlsyms" "\ +/* DATA imports from DLLs on WIN32 can't be const, because + runtime relocations are performed -- see ld's documentation + on pseudo-relocs */ +struct { +" + ;; + * ) + $echo >> "$output_objdir/$dlsyms" "\ +const struct { +" + ;; + esac + + + $echo >> "$output_objdir/$dlsyms" "\ + const char *name; + lt_ptr address; +} +lt_preloaded_symbols[] = +{\ +" + + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$dlsyms" + + $echo >> "$output_objdir/$dlsyms" "\ + {0, (lt_ptr) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + fi + + pic_flag_for_symtable= + case $host in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + case "$compile_command " in + *" -static "*) ;; + *) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND";; + esac;; + *-*-hpux*) + case "$compile_command " in + *" -static "*) ;; + *) pic_flag_for_symtable=" $pic_flag";; + esac + esac + + # Now compile the dynamic symbol file. + $show "(cd $output_objdir && $LTCC $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")" + $run eval '(cd $output_objdir && $LTCC $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $? + + # Clean up the generated files. + $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T" + $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T" + + # Transform the symbol file into the correct name. + case $host in + *cygwin* | *mingw* ) + if test -f "$output_objdir/${outputname}.def" ; then + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%" | $NL2SP` + else + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` + fi + ;; + * ) + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` + ;; + esac + ;; + *) + $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2 + exit $EXIT_FAILURE + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s% @SYMFILE@%%" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s% @SYMFILE@%%" | $NL2SP` + fi + + if test "$need_relink" = no || test "$build_libtool_libs" != yes; then + # Replace the output file specification. + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e 's%@OUTPUT@%'"$output"'%g' | $NL2SP` + link_command="$compile_command$compile_rpath" + + # We have no uninstalled library dependencies, so finalize right now. + $show "$link_command" + $run eval "$link_command" + exit_status=$? + + # Delete the generated files. + if test -n "$dlsyms"; then + $show "$rm $output_objdir/${outputname}S.${objext}" + $run $rm "$output_objdir/${outputname}S.${objext}" + fi + + exit $exit_status + fi + + if test -n "$shlibpath_var"; then + # We should set the shlibpath_var + rpath= + for dir in $temp_rpath; do + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) + # Absolute path. + rpath="$rpath$dir:" + ;; + *) + # Relative path: add a thisdir entry. + rpath="$rpath\$thisdir/$dir:" + ;; + esac + done + temp_rpath="$rpath" + fi + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath="$rpath$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + rpath="$rpath$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test "$no_install" = yes; 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 "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $run $rm $output + # Link the executable and exit + $show "$link_command" + $run eval "$link_command" || exit $? + exit $EXIT_SUCCESS + fi + + if test "$hardcode_action" = relink; then + # Fast installation is not supported + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + + $echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2 + $echo "$modename: \`$output' will be relinked during installation" 1>&2 + else + if test "$fast_install" != no; then + link_command="$finalize_var$compile_command$finalize_rpath" + if test "$fast_install" = yes; then + relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $SP2NL | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g' | $NL2SP` + else + # fast_install is set to needless + relink_command= + fi + else + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + fi + fi + + # Replace the output file specification. + link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname + + $show "$link_command" + $run eval "$link_command" || exit $? + + # Now create the wrapper script. + $show "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + # 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}\" || 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 + var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` + relink_command="$var=\"$var_value\"; export $var; $relink_command" + fi + done + relink_command="(cd `pwd`; $relink_command)" + relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e "$sed_quote_subst" | $NL2SP` + fi + + # Quote $echo for shipping. + if test "X$echo" = "X$SHELL $progpath --fallback-echo"; then + case $progpath in + [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";; + *) qecho="$SHELL `pwd`/$progpath --fallback-echo";; + esac + qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"` + else + qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"` + fi + + # Only actually do things if our run command is non-null. + if test -z "$run"; then + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) output=`$echo $output|${SED} 's,.exe$,,'` ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) + exeext=.exe + outputname=`$echo $outputname|${SED} 's,.exe$,,'` ;; + *) exeext= ;; + esac + case $host in + *cygwin* | *mingw* ) + output_name=`basename $output` + output_path=`dirname $output` + 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 + + cat > $cwrappersource <> $cwrappersource<<"EOF" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(PATH_MAX) +# define LT_PATHMAX PATH_MAX +#elif defined(MAXPATHLEN) +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#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 +# 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 */ + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free ((void *) stale); stale = 0; } \ +} while (0) + +/* -DDEBUG is fairly common in CFLAGS. */ +#undef DEBUG +#if defined DEBUGWRAPPER +# define DEBUG(format, ...) fprintf(stderr, format, __VA_ARGS__) +#else +# define DEBUG(format, ...) +#endif + +const char *program_name = NULL; + +void * xmalloc (size_t num); +char * xstrdup (const char *string); +const char * base_name (const char *name); +char * find_executable(const char *wrapper); +int check_executable(const char *path); +char * strendzap(char *str, const char *pat); +void lt_fatal (const char *message, ...); + +int +main (int argc, char *argv[]) +{ + char **newargz; + int i; + + program_name = (char *) xstrdup (base_name (argv[0])); + DEBUG("(main) argv[0] : %s\n",argv[0]); + DEBUG("(main) program_name : %s\n",program_name); + newargz = XMALLOC(char *, argc+2); +EOF + + cat >> $cwrappersource <> $cwrappersource <<"EOF" + newargz[1] = find_executable(argv[0]); + if (newargz[1] == NULL) + lt_fatal("Couldn't find %s", argv[0]); + DEBUG("(main) found exe at : %s\n",newargz[1]); + /* we know the script has the same name, without the .exe */ + /* so make sure newargz[1] doesn't end in .exe */ + strendzap(newargz[1],".exe"); + for (i = 1; i < argc; i++) + newargz[i+1] = xstrdup(argv[i]); + newargz[argc+1] = NULL; + + for (i=0; i> $cwrappersource <> $cwrappersource <> $cwrappersource <<"EOF" + return 127; +} + +void * +xmalloc (size_t num) +{ + void * p = (void *) malloc (num); + if (!p) + lt_fatal ("Memory exhausted"); + + return p; +} + +char * +xstrdup (const char *string) +{ + return string ? strcpy ((char *) xmalloc (strlen (string) + 1), string) : NULL +; +} + +const char * +base_name (const char *name) +{ + const char *base; + +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + /* Skip over the disk name in MSDOS pathnames. */ + if (isalpha ((unsigned char)name[0]) && name[1] == ':') + name += 2; +#endif + + for (base = name; *name; name++) + if (IS_DIR_SEPARATOR (*name)) + base = name + 1; + return base; +} + +int +check_executable(const char * path) +{ + struct stat st; + + DEBUG("(check_executable) : %s\n", path ? (*path ? path : "EMPTY!") : "NULL!"); + if ((!path) || (!*path)) + return 0; + + if ((stat (path, &st) >= 0) && + ( + /* MinGW & native WIN32 do not support S_IXOTH or S_IXGRP */ +#if defined (S_IXOTH) + ((st.st_mode & S_IXOTH) == S_IXOTH) || +#endif +#if defined (S_IXGRP) + ((st.st_mode & S_IXGRP) == S_IXGRP) || +#endif + ((st.st_mode & S_IXUSR) == S_IXUSR)) + ) + return 1; + else + return 0; +} + +/* Searches for the full path of the wrapper. Returns + newly allocated full path name if found, NULL otherwise */ +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]; + int tmp_len; + char* concat_name; + + DEBUG("(find_executable) : %s\n", wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!"); + + 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 = 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 ("getcwd failed"); + 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 ("getcwd failed"); + 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 * +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 (strcmp(str, pat) == 0) + *str = '\0'; + } + return str; +} + +static void +lt_error_core (int exit_status, const char * mode, + const char * message, va_list ap) +{ + fprintf (stderr, "%s: %s: ", program_name, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, "FATAL", message, ap); + va_end (ap); +} +EOF + # we should really use a build-platform specific compiler + # here, but OTOH, the wrappers (shell script and this C one) + # are only useful if you want to execute the "real" binary. + # Since the "real" binary is built for $host, then this + # wrapper might as well be built for $host, too. + $run $LTCC $LTCFLAGS -s -o $cwrapper $cwrappersource + ;; + esac + $rm $output + trap "$rm $output; exit $EXIT_FAILURE" 1 2 15 + + $echo > $output "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP +# +# The $output program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='${SED} -e 1s/^X//' +sed_quote_subst='$sed_quote_subst' + +# Be Bourne compatible (taken from Autoconf:_AS_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 variable: + 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 + echo=\"$qecho\" + file=\"\$0\" + # Make sure echo works. + if test \"X\$1\" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift + elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then + # Yippee, \$echo works! + : + else + # Restart under the correct shell, and then maybe \$echo will work. + exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"} + fi + fi\ +" + $echo >> $output "\ + + # Find the directory that this script lives in. + thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\` + done + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test "$fast_install" = yes; then + $echo >> $output "\ + program=lt-'$outputname'$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 >> $output "\ + + # 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 $EXIT_FAILURE + fi + fi + + $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $rm \"\$progdir/\$program\"; + $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $rm \"\$progdir/\$file\" + fi" + else + $echo >> $output "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + $echo >> $output "\ + + if test -f \"\$progdir/\$program\"; then" + + # Export our shlibpath_var if we have one. + if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $echo >> $output "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` + + export $shlibpath_var +" + fi + + # fixup the dll searchpath if we need to. + if test -n "$dllsearchpath"; then + $echo >> $output "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + $echo >> $output "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2*) + $echo >> $output "\ + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $echo >> $output "\ + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $echo >> $output "\ + \$echo \"\$0: cannot exec \$program \$*\" + exit $EXIT_FAILURE + 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 $EXIT_FAILURE + fi +fi\ +" + chmod +x $output + fi + exit $EXIT_SUCCESS + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + if test "$build_libtool_libs" = convenience; then + oldobjs="$libobjs_save" + addlibs="$convenience" + build_libtool_libs=no + else + if test "$build_libtool_libs" = module; then + oldobjs="$libobjs_save" + build_libtool_libs=no + else + oldobjs="$old_deplibs $non_pic_objects" + fi + addlibs="$old_convenience" + fi + + if test -n "$addlibs"; then + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + func_extract_archives $gentop $addlibs + oldobjs="$oldobjs $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then + cmds=$old_archive_from_new_cmds + else + # 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 + $echo "X$obj" | $Xsed -e 's%^.*/%%' + done | sort | sort -uc >/dev/null 2>&1); then + : + else + $echo "copying selected object files to avoid basename conflicts..." + + if test -z "$gentop"; then + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + $show "${rm}r $gentop" + $run ${rm}r "$gentop" + $show "$mkdir $gentop" + $run $mkdir "$gentop" + exit_status=$? + if test "$exit_status" -ne 0 && test ! -d "$gentop"; then + exit $exit_status + fi + fi + + save_oldobjs=$oldobjs + oldobjs= + counter=1 + for obj in $save_oldobjs + do + objbase=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` + case " $oldobjs " in + " ") oldobjs=$obj ;; + *[\ /]"$objbase "*) + while :; do + # Make sure we don't pick an alternate name that also + # overlaps. + newobj=lt$counter-$objbase + counter=`expr $counter + 1` + case " $oldobjs " in + *[\ /]"$newobj "*) ;; + *) if test ! -f "$gentop/$newobj"; then break; fi ;; + esac + done + $show "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" + $run ln "$obj" "$gentop/$newobj" || + $run cp "$obj" "$gentop/$newobj" + oldobjs="$oldobjs $gentop/$newobj" + ;; + *) oldobjs="$oldobjs $obj" ;; + esac + done + fi + + eval cmds=\"$old_archive_cmds\" + + if len=`expr "X$cmds" : ".*"` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + $echo "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_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 + for obj in $save_oldobjs + do + oldobjs="$objlist $obj" + objlist="$objlist $obj" + eval test_cmds=\"$old_archive_cmds\" + if len=`expr "X$test_cmds" : ".*" 2>/dev/null` && + test "$len" -le "$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= + fi + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test "X$oldobjs" = "X" ; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" + fi + fi + fi + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + eval cmd=\"$cmd\" + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + done + + if test -n "$generated"; then + $show "${rm}r$generated" + $run ${rm}r$generated + fi + + # Now create the libtool archive. + case $output in + *.la) + old_library= + test "$build_old_libs" = yes && old_library="$libname.$libext" + $show "creating $output" + + # 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}\" || 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 + var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` + relink_command="$var=\"$var_value\"; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e "$sed_quote_subst" | $NL2SP` + if test "$hardcode_automatic" = yes ; then + relink_command= + fi + + + # Only create the output if not a dry run. + if test -z "$run"; then + for installed in no yes; do + if test "$installed" = yes; then + if test -z "$install_libdir"; then + break + fi + output="$output_objdir/$outputname"i + # Replace all uninstalled libtool libraries with the installed ones + newdependency_libs= + for deplib in $dependency_libs; do + case $deplib in + *.la) + name=`$echo "X$deplib" | $Xsed -e 's%^.*/%%'` + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + if test -z "$libdir"; then + $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + newdependency_libs="$newdependency_libs $libdir/$name" + ;; + *) newdependency_libs="$newdependency_libs $deplib" ;; + esac + done + dependency_libs="$newdependency_libs" + newdlfiles= + for lib in $dlfiles; do + name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + if test -z "$libdir"; then + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + newdlfiles="$newdlfiles $libdir/$name" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + if test -z "$libdir"; then + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + newdlprefiles="$newdlprefiles $libdir/$name" + done + dlprefiles="$newdlprefiles" + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + newdlfiles="$newdlfiles $abs" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + newdlprefiles="$newdlprefiles $abs" + done + dlprefiles="$newdlprefiles" + fi + $rm $output + # place dlname in correct position for cygwin + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; + esac + $echo > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='$tdlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# 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 "$installed" = no && test "$need_relink" = yes; then + $echo >> $output "\ +relink_command=\"$relink_command\"" + fi + done + fi + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" + $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $? + ;; + esac + exit $EXIT_SUCCESS + ;; + + # libtool install mode + install) + modename="$modename: install" + + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || + # Allow the use of GNU shtool's install command. + $echo "X$nonopt" | grep shtool > /dev/null; then + # Aesthetically quote it. + arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + install_prog="$arg " + arg="$1" + shift + else + install_prog= + arg=$nonopt + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + install_prog="$install_prog$arg" + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=no + stripme= + for arg + do + if test -n "$dest"; then + files="$files $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=yes ;; + -f) + case " $install_prog " in + *[\\\ /]cp\ *) ;; + *) prev=$arg ;; + esac + ;; + -g | -m | -o) prev=$arg ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + install_prog="$install_prog $arg" + done + + if test -z "$install_prog"; then + $echo "$modename: you must specify an install program" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + if test -n "$prev"; then + $echo "$modename: the \`$prev' option requires an argument" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + if test -z "$files"; then + if test -z "$dest"; then + $echo "$modename: no file or destination specified" 1>&2 + else + $echo "$modename: you must specify a destination" 1>&2 + fi + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Strip any trailing slash from the destination. + dest=`$echo "X$dest" | $Xsed -e 's%/$%%'` + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=yes + if test "$isdir" = yes; then + destdir="$dest" + destname= + else + destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'` + test "X$destdir" = "X$dest" && destdir=. + destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'` + + # Not a directory, so check to see that there is only one file specified. + set dummy $files + if test "$#" -gt 2; then + $echo "$modename: \`$dest' is not a directory" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + 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. + staticlibs="$staticlibs $file" + ;; + + *.la) + # Check to see that this really is a libtool archive. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$file' is not a valid libtool archive" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + library_names= + old_library= + relink_command= + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) current_libdirs="$current_libdirs $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) future_libdirs="$future_libdirs $libdir" ;; + esac + fi + + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/ + test "X$dir" = "X$file/" && dir= + dir="$dir$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$echo "$destdir" | $SED "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. + if test "$inst_prefix_dir" = "$destdir"; then + $echo "$modename: error: cannot install \`$file' to a directory not ending in $libdir" 1>&2 + exit $EXIT_FAILURE + fi + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$echo "$relink_command" | $SP2NL | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%" | $NL2SP` + else + relink_command=`$echo "$relink_command" | $SP2NL | $SED "s%@inst_prefix_dir@%%" | $NL2SP` + fi + + $echo "$modename: warning: relinking \`$file'" 1>&2 + $show "$relink_command" + if $run eval "$relink_command"; then : + else + $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 + exit $EXIT_FAILURE + fi + fi + + # See the names of the shared library. + set dummy $library_names + if test -n "$2"; then + realname="$2" + shift + shift + + srcname="$realname" + test -n "$relink_command" && srcname="$realname"T + + # Install the shared library and build the symlinks. + $show "$install_prog $dir/$srcname $destdir/$realname" + $run eval "$install_prog $dir/$srcname $destdir/$realname" || exit $? + if test -n "$stripme" && test -n "$striplib"; then + $show "$striplib $destdir/$realname" + $run 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 + if test "$linkname" != "$realname"; then + $show "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })" + $run eval "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })" + fi + done + fi + + # Do each command in the postinstall commands. + lib="$destdir/$realname" + cmds=$postinstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$mode" = relink; then + $run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)' + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + fi + + # Install the pseudo-library for information purposes. + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + instname="$dir/$name"i + $show "$install_prog $instname $destdir/$name" + $run eval "$install_prog $instname $destdir/$name" || exit $? + + # Maybe install the static library, too. + test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + destfile="$destdir/$destfile" + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"` + ;; + *.$objext) + staticdest="$destfile" + destfile= + ;; + *) + $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + # Install the libtool object if requested. + if test -n "$destfile"; then + $show "$install_prog $file $destfile" + $run eval "$install_prog $file $destfile" || exit $? + fi + + # Install the old object if enabled. + if test "$build_old_libs" = yes; then + # Deduce the name of the old-style object file. + staticobj=`$echo "X$file" | $Xsed -e "$lo2o"` + + $show "$install_prog $staticobj $staticdest" + $run eval "$install_prog \$staticobj \$staticdest" || exit $? + fi + exit $EXIT_SUCCESS + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + destfile="$destdir/$destfile" + fi + + # 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 + file=`$echo $file|${SED} 's,.exe$,,'` + stripped_ext=".exe" + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin*|*mingw*) + wrapper=`$echo $file | ${SED} -e 's,.exe$,,'` + ;; + *) + wrapper=$file + ;; + esac + if (${SED} -e '4q' $wrapper | grep "^# Generated by .*$PACKAGE")>/dev/null 2>&1; then + notinst_deplibs= + relink_command= + + # Note that it is not necessary on cygwin/mingw to append a dot to + # foo even if both foo 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. + # + # If there is no directory component, then add one. + case $wrapper in + */* | *\\*) . ${wrapper} ;; + *) . ./${wrapper} ;; + esac + + # Check the variables that should have been set. + if test -z "$notinst_deplibs"; then + $echo "$modename: invalid libtool wrapper script \`$wrapper'" 1>&2 + exit $EXIT_FAILURE + fi + + finalize=yes + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + # If there is no directory component, then add one. + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + fi + libfile="$libdir/"`$echo "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test + if test -n "$libdir" && test ! -f "$libfile"; then + $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2 + finalize=no + fi + done + + relink_command= + # Note that it is not necessary on cygwin/mingw to append a dot to + # foo even if both foo 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. + # + # If there is no directory component, then add one. + case $wrapper in + */* | *\\*) . ${wrapper} ;; + *) . ./${wrapper} ;; + esac + + outputname= + if test "$fast_install" = no && test -n "$relink_command"; then + if test "$finalize" = yes && test -z "$run"; then + tmpdir=`func_mktempdir` + file=`$echo "X$file$stripped_ext" | $Xsed -e 's%^.*/%%'` + outputname="$tmpdir/$file" + # Replace the output file specification. + relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g' | $NL2SP` + + $show "$relink_command" + if $run eval "$relink_command"; then : + else + $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 + ${rm}r "$tmpdir" + continue + fi + file="$outputname" + else + $echo "$modename: warning: cannot relink \`$file'" 1>&2 + fi + else + # Install the binary that we compiled earlier. + file=`$echo "X$file$stripped_ext" | $Xsed -e "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) + destfile=`$echo $destfile | ${SED} -e 's,.exe$,,'` + ;; + esac + ;; + esac + $show "$install_prog$stripme $file $destfile" + $run eval "$install_prog\$stripme \$file \$destfile" || exit $? + test -n "$outputname" && ${rm}r "$tmpdir" + ;; + esac + done + + for file in $staticlibs; do + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + + # Set up the ranlib parameters. + oldlib="$destdir/$name" + + $show "$install_prog $file $oldlib" + $run eval "$install_prog \$file \$oldlib" || exit $? + + if test -n "$stripme" && test -n "$old_striplib"; then + $show "$old_striplib $oldlib" + $run eval "$old_striplib $oldlib" || exit $? + fi + + # Do each command in the postinstall commands. + cmds=$old_postinstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + done + + if test -n "$future_libdirs"; then + $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2 + fi + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + test -n "$run" && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi + ;; + + # libtool finish mode + finish) + modename="$modename: finish" + libdirs="$nonopt" + admincmds= + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for dir + do + libdirs="$libdirs $dir" + done + + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + cmds=$finish_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || admincmds="$admincmds + $cmd" + done + IFS="$save_ifs" + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $run eval "$cmds" || admincmds="$admincmds + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + test "$show" = : && exit $EXIT_SUCCESS + + $echo "X----------------------------------------------------------------------" | $Xsed + $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" + $echo "more information, such as the ld(1) and ld.so(8) manual pages." + $echo "X----------------------------------------------------------------------" | $Xsed + exit $EXIT_SUCCESS + ;; + + # libtool execute mode + execute) + modename="$modename: execute" + + # The first argument is the command name. + cmd="$nonopt" + if test -z "$cmd"; then + $echo "$modename: you must specify a COMMAND" 1>&2 + $echo "$help" + exit $EXIT_FAILURE + fi + + # Handle -dlopen flags immediately. + for file in $execute_dlfiles; do + if test ! -f "$file"; then + $echo "$modename: \`$file' is not a file" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + dir= + case $file in + *.la) + # Check to see that this really is a libtool archive. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Read the libtool library. + dlname= + library_names= + + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'" + continue + fi + + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$file" && dir=. + + if test -f "$dir/$objdir/$dlname"; then + dir="$dir/$objdir" + else + if test ! -f "$dir/$dlname"; then + $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2 + exit $EXIT_FAILURE + fi + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$file" && dir=. + ;; + + *) + $echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2 + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir="$absdir" + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic="$magic" + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case $file in + -*) ;; + *) + # Do a test to see if this is really a libtool program. + if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Transform arg to wrapped name. + file="$progdir/$program" + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"` + args="$args \"$file\"" + done + + if test -z "$run"; then + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved 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 + fi" + done + + # Now prepare to actually exec the command. + exec_cmd="\$cmd$args" + else + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\"" + $echo "export $shlibpath_var" + fi + $echo "$cmd$args" + exit $EXIT_SUCCESS + fi + ;; + + # libtool clean and uninstall mode + clean | uninstall) + modename="$modename: $mode" + rm="$nonopt" + files= + rmforce= + 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) rm="$rm $arg"; rmforce=yes ;; + -*) rm="$rm $arg" ;; + *) files="$files $arg" ;; + esac + done + + if test -z "$rm"; then + $echo "$modename: you must specify an RM program" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + rmdirs= + + origobjdir="$objdir" + for file in $files; do + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + if test "X$dir" = "X$file"; then + dir=. + objdir="$origobjdir" + else + objdir="$dir/$origobjdir" + fi + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + test "$mode" = uninstall && objdir="$dir" + + # Remember objdir for removal later, being careful to avoid duplicates + if test "$mode" = clean; then + case " $rmdirs " in + *" $objdir "*) ;; + *) rmdirs="$rmdirs $objdir" ;; + 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 test "$rmforce" = yes; then + continue + fi + + rmfiles="$file" + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + . $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + rmfiles="$rmfiles $objdir/$n" + done + test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library" + + case "$mode" in + clean) + case " $library_names " in + # " " in the beginning catches empty $dlname + *" $dlname "*) ;; + *) rmfiles="$rmfiles $objdir/$dlname" ;; + esac + test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" + ;; + uninstall) + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + cmds=$postuninstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" + if test "$?" -ne 0 && test "$rmforce" != yes; then + exit_status=1 + fi + done + IFS="$save_ifs" + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + cmds=$old_postuninstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" + if test "$?" -ne 0 && test "$rmforce" != yes; then + exit_status=1 + fi + done + IFS="$save_ifs" + fi + # FIXME: should reinstall the best remaining shared library. + ;; + esac + fi + ;; + + *.lo) + # Possibly a libtool object, so verify it. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + + # Read the .lo file + . $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" \ + && test "$pic_object" != none; then + rmfiles="$rmfiles $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" \ + && test "$non_pic_object" != none; then + rmfiles="$rmfiles $dir/$non_pic_object" + fi + fi + ;; + + *) + if test "$mode" = clean ; then + noexename=$name + case $file in + *.exe) + file=`$echo $file|${SED} 's,.exe$,,'` + noexename=`$echo $name|${SED} 's,.exe$,,'` + # $file with .exe has already been added to rmfiles, + # add $file without .exe + rmfiles="$rmfiles $file" + ;; + esac + # Do a test to see if this is a libtool program. + if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + relink_command= + . $dir/$noexename + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" + if test "$fast_install" = yes && test -n "$relink_command"; then + rmfiles="$rmfiles $objdir/lt-$name" + fi + if test "X$noexename" != "X$name" ; then + rmfiles="$rmfiles $objdir/lt-${noexename}.c" + fi + fi + fi + ;; + esac + $show "$rm $rmfiles" + $run $rm $rmfiles || exit_status=1 + done + objdir="$origobjdir" + + # Try to remove the ${objdir}s in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + $show "rmdir $dir" + $run rmdir $dir >/dev/null 2>&1 + fi + done + + exit $exit_status + ;; + + "") + $echo "$modename: you must specify a MODE" 1>&2 + $echo "$generic_help" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + if test -z "$exec_cmd"; then + $echo "$modename: invalid operation mode \`$mode'" 1>&2 + $echo "$generic_help" 1>&2 + exit $EXIT_FAILURE + fi +fi # test -z "$show_help" + +if test -n "$exec_cmd"; then + eval exec $exec_cmd + exit $EXIT_FAILURE +fi + +# We need to display help for each of the modes. +case $mode in +"") $echo \ +"Usage: $modename [OPTION]... [MODE-ARG]... + +Provide generalized library-building support services. + + --config show all configuration variables + --debug enable verbose shell tracing +-n, --dry-run display commands without modifying any files + --features display basic configuration information and exit + --finish same as \`--mode=finish' + --help display this help message and exit + --mode=MODE use operation mode MODE [default=inferred from MODE-ARGS] + --quiet same as \`--silent' + --silent don't print informational messages + --tag=TAG use configuration variables from tag TAG + --version print version information + +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. Try \`$modename --help --mode=MODE' for +a more detailed description of MODE. + +Report bugs to ." + exit $EXIT_SUCCESS + ;; + +clean) + $echo \ +"Usage: $modename [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: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -prefer-pic try to building PIC objects only + -prefer-non-pic try to building non-PIC objects only + -static always build a \`.o' file suitable for static linking + +COMPILE-COMMAND is a command to be used in creating a \`standard' object file +from the given SOURCEFILE. + +The output file name is determined by removing the directory component from +SOURCEFILE, then substituting the C source code suffix \`.c' with the +library object suffix, \`.lo'." + ;; + +execute) + $echo \ +"Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]... + +Automatically set library path, then run a program. + +This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + +This mode sets the library path environment variable according to \`-dlopen' +flags. + +If any of the ARGS are libtool executable wrappers, then they are translated +into their corresponding uninstalled binary, and any of their required library +directories are added to the library path. + +Then, COMMAND is executed, with ARGS as arguments." + ;; + +finish) + $echo \ +"Usage: $modename [OPTION]... --mode=finish [LIBDIR]... + +Complete the installation of libtool libraries. + +Each LIBDIR is a directory that contains libtool libraries. + +The commands that this mode executes may require superuser privileges. Use +the \`--dry-run' option if you just want to see what would be executed." + ;; + +install) + $echo \ +"Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND... + +Install executables or libraries. + +INSTALL-COMMAND is the installation command. The first component should be +either the \`install' or \`cp' program. + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + +link) + $echo \ +"Usage: $modename [OPTION]... --mode=link LINK-COMMAND... + +Link object files or libraries together to form another library, or to +create an executable program. + +LINK-COMMAND is a command using the C compiler that you would use to create +a program from several object files. + +The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-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 + -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 + -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] + +All other options (arguments beginning with \`-') are ignored. + +Every other argument is treated as a filename. Files ending in \`.la' are +treated as uninstalled libtool libraries, other files are standard or library +object files. + +If the OUTPUT-FILE ends in \`.la', then a libtool library is created, +only library objects (\`.lo' files) may be specified, and \`-rpath' is +required, except when creating a convenience library. + +If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created +using \`ar' and \`ranlib', or on Windows using \`lib'. + +If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file +is created, otherwise an executable program is created." + ;; + +uninstall) + $echo \ +"Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + +Remove libraries from an installation directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, all the files associated with it are deleted. +Otherwise, only FILE itself is deleted using RM." + ;; + +*) + $echo "$modename: invalid operation mode \`$mode'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; +esac + +$echo +$echo "Try \`$modename --help' for more information about other modes." + +exit $? + +# The TAGs below are defined such that we never get into a situation +# in which 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 +disable_libs=shared +# ### END LIBTOOL TAG CONFIG: disable-shared + +# ### BEGIN LIBTOOL TAG CONFIG: disable-static +disable_libs=static +# ### END LIBTOOL TAG CONFIG: disable-static + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: +# ### BEGIN LIBTOOL TAG CONFIG: CXX + +# Libtool was configured on host ubuntu: + +# Shell to use when invoking shell scripts. +SHELL="/bin/bash" + +# Whether or not to build shared libraries. +build_libtool_libs=yes + +# Whether or not to build static libraries. +build_old_libs=yes + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=no + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=no + +# Whether or not to optimize for fast installation. +fast_install=yes + +# The host system. +host_alias= +host=x86_64-unknown-linux-gnu +host_os=linux-gnu + +# The build system. +build_alias= +build=x86_64-unknown-linux-gnu +build_os=linux-gnu + +# An echo program that does not interpret backslashes. +echo="echo" + +# The archiver. +AR="ar" +AR_FLAGS="cru" + +# A C compiler. +LTCC="gcc" + +# LTCC compiler flags. +LTCFLAGS="-g -O2" + +# A language-specific compiler. +CC="g++" + +# Is the compiler the GNU C compiler? +with_gcc=yes + +# An ERE matcher. +EGREP="/bin/grep -E" + +# The linker used to build libraries. +LD="/usr/bin/ld -m elf_x86_64" + +# Whether we need hard or soft links. +LN_S="ln -s" + +# A BSD-compatible nm program. +NM="/usr/bin/nm -B" + +# A symbol stripping program +STRIP="strip" + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=file + +# Used on cygwin: DLL creation program. +DLLTOOL="dlltool" + +# Used on cygwin: object dumper. +OBJDUMP="objdump" + +# Used on cygwin: assembler. +AS="as" + +# The name of the directory that contains temporary libtool files. +objdir=.libs + +# How to create reloadable object files. +reload_flag=" -r" +reload_cmds="\$LD\$reload_flag -o \$output\$reload_objs" + +# How to pass a linker flag through the compiler. +wl="-Wl," + +# Object file suffix (normally "o"). +objext="o" + +# Old archive suffix (normally "a"). +libext="a" + +# Shared library suffix (normally ".so"). +shrext_cmds='.so' + +# Executable file suffix (normally ""). +exeext="" + +# Additional compiler flags for building library objects. +pic_flag=" -fPIC -DPIC" +pic_mode=default + +# What is the maximum length of a command? +max_cmd_len=1572864 + +# Does compiler simultaneously support -c and -o options? +compiler_c_o="yes" + +# Must we lock files when doing compilation? +need_locks="no" + +# Do we need the lib prefix for modules? +need_lib_prefix=no + +# Do we need a version for libraries? +need_version=no + +# Whether dlopen is supported. +dlopen_support=unknown + +# Whether dlopen of programs is supported. +dlopen_self=unknown + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=unknown + +# Compiler flag to prevent dynamic linking. +link_static_flag="-static" + +# Compiler flag to turn off builtin functions. +no_builtin_flag=" -fno-builtin" + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec="\${wl}--export-dynamic" + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec="\${wl}--whole-archive\$convenience \${wl}--no-whole-archive" + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec="" + +# Library versioning type. +version_type=linux + +# Format of library name prefix. +libname_spec="lib\$name" + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec="\${libname}\${release}\${shared_ext}\$versuffix \${libname}\${release}\${shared_ext}\$major \$libname\${shared_ext}" + +# The coded name of the library, if different from the real name. +soname_spec="\${libname}\${release}\${shared_ext}\$major" + +# Commands used to build and install an old-style archive. +RANLIB="ranlib" +old_archive_cmds="\$AR \$AR_FLAGS \$oldlib\$oldobjs~\$RANLIB \$oldlib" +old_postinstall_cmds="chmod 644 \$oldlib~\$RANLIB \$oldlib" +old_postuninstall_cmds="" + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds="" + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds="" + +# Commands used to build and install a shared archive. +archive_cmds="\$CC -shared -nostdlib \$predep_objects \$libobjs \$deplibs \$postdep_objects \$compiler_flags \${wl}-soname \$wl\$soname -o \$lib" +archive_expsym_cmds="\$CC -shared -nostdlib \$predep_objects \$libobjs \$deplibs \$postdep_objects \$compiler_flags \${wl}-soname \$wl\$soname \${wl}-retain-symbols-file \$wl\$export_symbols -o \$lib" +postinstall_cmds="" +postuninstall_cmds="" + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds="" +module_expsym_cmds="" + +# Commands to strip libraries. +old_striplib="strip --strip-debug" +striplib="strip --strip-unneeded" + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects="/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/4.8/crtbeginS.o" + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects="/usr/lib/gcc/x86_64-linux-gnu/4.8/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crtn.o" + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps="" + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps="-lstdc++ -lm -lgcc_s -lc -lgcc_s" + +# The directories searched by this compiler when creating a shared +# library +compiler_lib_search_dirs="/usr/lib/gcc/x86_64-linux-gnu/4.8 /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib /lib/x86_64-linux-gnu /lib/../lib /usr/lib/x86_64-linux-gnu /usr/lib/../lib /usr/lib/gcc/x86_64-linux-gnu/4.8/../../.." + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path="-L/usr/lib/gcc/x86_64-linux-gnu/4.8 -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../.." + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method="pass_all" + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd="\$MAGIC_CMD" + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag="" + +# Flag that forces no undefined symbols. +no_undefined_flag="" + +# Commands used to finish a libtool library installation in a directory. +finish_cmds="PATH=\\\"\\\$PATH:/sbin\\\" ldconfig -n \$libdir" + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval="" + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe="sed -n -e 's/^.*[ ]\\([ABCDGIRSTW][ABCDGIRSTW]*\\)[ ][ ]*\\([_A-Za-z][_A-Za-z0-9]*\\)\$/\\1 \\2 \\2/p'" + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl="sed -n -e 's/^. .* \\(.*\\)\$/extern int \\1;/p'" + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address="sed -n -e 's/^: \\([^ ]*\\) \$/ {\\\"\\1\\\", (lt_ptr) 0},/p' -e 's/^[BCDEGRST] \\([^ ]*\\) \\([^ ]*\\)\$/ {\"\\2\", (lt_ptr) \\&\\2},/p'" + +# This is the shared library runtime path variable. +runpath_var=LD_RUN_PATH + +# This is the shared library path variable. +shlibpath_var=LD_LIBRARY_PATH + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=no + +# How to hardcode a shared library path into an executable. +hardcode_action=immediate + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=yes + +# Flag to hardcode $libdir into a binary during linking. +# This must work even if $libdir does not exist. +hardcode_libdir_flag_spec="\${wl}--rpath \${wl}\$libdir" + +# If ld is used when linking, flag to hardcode $libdir into +# a binary during linking. This must work even if $libdir does +# not exist. +hardcode_libdir_flag_spec_ld="" + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator="" + +# Set to yes if using DIR/libNAME during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=no + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=no + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=unsupported + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=no + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="PATH LD_LIBRARY_PATH LD_RUN_PATH GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=unknown + +# Compile-time system search path for libraries +sys_lib_search_path_spec="/usr/lib64 /lib64 /usr/local/lib64" + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec="/usr/lib64 /lib64 /usr/lib/x86_64-linux-gnu/libfakeroot /usr/local/lib /lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu " + +# Fix the shell variable $srcfile for the compiler. +fix_srcfile_path="" + +# Set to yes if exported symbols are required. +always_export_symbols=no + +# The commands to list exported symbols. +export_symbols_cmds="\$NM \$libobjs \$convenience | \$global_symbol_pipe | \$SED 's/.* //' | sort | uniq > \$export_symbols" + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds="" + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms="_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*" + +# Symbols that must always be exported. +include_expsyms="" + +# ### END LIBTOOL TAG CONFIG: CXX + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/win32/MANIFEST.txt b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/win32/MANIFEST.txt new file mode 100644 index 00000000..66b780ed --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/win32/MANIFEST.txt @@ -0,0 +1,29 @@ + Overview of the Expat distribution + +The Expat distribution creates several subdirectories on your system. +Some of these directories contain components of interest to all Expat +users, and some contain material of interest to developers who wish to +use Expat in their applications. In the list below, is the +directory you specified to the installer. + + Directory Contents + -------------------------------------------------------------------- + \ The XML well-formedness checker and some general + information files. + + \Doc\ API documentation for developers. + + \Libs\ Pre-compiled dynamic libraries for developers. + + \StaticLibs\ Pre-compiled static libraries for developers. + + \Source\ Source code, which may interest some developers, + including a workspace for Microsft Visual C++. + The source code includes the parser, the well- + formedness checker, and a couple of small sample + applications. + + \Source\bcb5\ Project files for Borland C++ Builder 5 and BCC + 5.5. + + \Unistall\ The uninstaller and its data files. diff --git a/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/win32/expat.iss b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/win32/expat.iss new file mode 100644 index 00000000..5bb96399 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/win32/expat.iss @@ -0,0 +1,62 @@ +; Basic setup script for the Inno Setep installer builder. For more +; information on the free installer builder, see www.jrsoftware.org. +; +; This script was contributed by Tim Peters. +; The current version is used with Inno Setup 2.0.19. + +[Setup] +AppName=expat +AppId=expat +AppVersion=1.95.7 +AppVerName=expat 1.95.7 +AppCopyright=Copyright © 1998-2003 Thai Open Source Software Center, Clark Cooper, and the Expat maintainers +DefaultDirName={sd}\Expat-1.95.7 +AppPublisher=The Expat Developers +AppPublisherURL=http://www.libexpat.org/ +AppSupportURL=http://www.libexpat.org/ +AppUpdatesURL=http://www.libexpat.org/ +UninstallDisplayName=Expat XML Parser (version 1.95.7) +UninstallFilesDir={app}\Uninstall + +Compression=bzip/9 +SourceDir=.. +OutputDir=win32 +DisableStartupPrompt=yes +AllowNoIcons=yes +DisableProgramGroupPage=yes +DisableReadyPage=yes + +[Files] +CopyMode: alwaysoverwrite; Source: xmlwf\Release\*.exe; DestDir: "{app}" +CopyMode: alwaysoverwrite; Source: win32\MANIFEST.txt; DestDir: "{app}" +CopyMode: alwaysoverwrite; Source: Changes; DestDir: "{app}"; DestName: Changes.txt +CopyMode: alwaysoverwrite; Source: COPYING; DestDir: "{app}"; DestName: COPYING.txt +CopyMode: alwaysoverwrite; Source: README; DestDir: "{app}"; DestName: README.txt +CopyMode: alwaysoverwrite; Source: doc\*.html; DestDir: "{app}\Doc" +CopyMode: alwaysoverwrite; Source: doc\*.css; DestDir: "{app}\Doc" +CopyMode: alwaysoverwrite; Source: doc\*.png; DestDir: "{app}\Doc" +CopyMode: alwaysoverwrite; Source: lib\Release\*.dll; DestDir: "{app}\Libs" +CopyMode: alwaysoverwrite; Source: lib\Release\*.lib; DestDir: "{app}\Libs" +CopyMode: alwaysoverwrite; Source: lib\Release-w\*.dll; DestDir: "{app}\Libs" +CopyMode: alwaysoverwrite; Source: lib\Release-w\*.lib; DestDir: "{app}\Libs" +CopyMode: alwaysoverwrite; Source: lib\Release_static\*.lib; DestDir: "{app}\StaticLibs" +CopyMode: alwaysoverwrite; Source: lib\Release-w_static\*.lib; DestDir: "{app}\StaticLibs" +CopyMode: alwaysoverwrite; Source: expat.dsw; DestDir: "{app}\Source" +CopyMode: alwaysoverwrite; Source: win32\README.txt; DestDir: "{app}\Source" +CopyMode: alwaysoverwrite; Source: bcb5\*.*; DestDir: "{app}\Source\bcb5" +CopyMode: alwaysoverwrite; Source: lib\*.c; DestDir: "{app}\Source\lib" +CopyMode: alwaysoverwrite; Source: lib\*.h; DestDir: "{app}\Source\lib" +CopyMode: alwaysoverwrite; Source: lib\*.def; DestDir: "{app}\Source\lib" +CopyMode: alwaysoverwrite; Source: lib\*.dsp; DestDir: "{app}\Source\lib" +CopyMode: alwaysoverwrite; Source: examples\*.c; DestDir: "{app}\Source\examples" +CopyMode: alwaysoverwrite; Source: examples\*.dsp; DestDir: "{app}\Source\examples" +CopyMode: alwaysoverwrite; Source: tests\*.c; DestDir: "{app}\Source\tests" +CopyMode: alwaysoverwrite; Source: tests\*.h; DestDir: "{app}\Source\tests" +CopyMode: alwaysoverwrite; Source: tests\README.txt; DestDir: "{app}\Source\tests" +CopyMode: alwaysoverwrite; Source: xmlwf\*.c*; DestDir: "{app}\Source\xmlwf" +CopyMode: alwaysoverwrite; Source: xmlwf\*.h; DestDir: "{app}\Source\xmlwf" +CopyMode: alwaysoverwrite; Source: xmlwf\*.dsp; DestDir: "{app}\Source\xmlwf" + +[Messages] +WelcomeLabel1=Welcome to the Expat XML Parser Setup Wizard +WelcomeLabel2=This will install [name/ver] on your computer.%n%nExpat is an XML parser with a C-language API, and is primarily made available to allow developers to build applications which use XML using a portable API and fast implementation.%n%nIt is strongly recommended that you close all other applications you have running before continuing. This will help prevent any conflicts during the installation process. diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/.libs/libapr-0.a b/rubbos/app/httpd-2.0.64/srclib/apr/.libs/libapr-0.a new file mode 100644 index 0000000000000000000000000000000000000000..581e7eff11ec5c3776452c2b484bd82a055136e9 GIT binary patch literal 1237804 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%0AMg!@k72p*D|{%A=fg%?eML|4=K}`8$18j? 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ν@ysn;~ruZWwUz_B@5h=#|S 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

    r&-($Z13YY7E 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

    ~cjc=kdOV>hvxus76f85e_Xq!q)F9U8L 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
  • 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%0AP{kpQWTd3TprCELekO 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 z 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/.libs/libapr-0.so.0 b/rubbos/app/httpd-2.0.64/srclib/apr/.libs/libapr-0.so.0 new file mode 100755 index 0000000000000000000000000000000000000000..605582aaee0a7cae30fab1cf3d697661d448c8ab GIT binary patch literal 708933 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%0AP{kpQWTd3TprCELekO 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 z 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/.libs/libapr-0.so.0.9.19 b/rubbos/app/httpd-2.0.64/srclib/apr/.libs/libapr-0.so.0.9.19 new file mode 100755 index 0000000000000000000000000000000000000000..605582aaee0a7cae30fab1cf3d697661d448c8ab GIT binary patch literal 708933 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%0AP{kpQWTd3TprCELekO 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 z zj3$ugR)!@1wEpx+rA6Yq0pbp13@XD!l@dKsrDzjXiZ)TDXveDZOXVAE@=q>=Z#bLW zNvWrdWA~JV=9~XLCEs=AoBur}-}PsT^ptUqJ!O?h_@Bu^pXI9yKw2(-OBazf4HY|J zt&pXQ;@0+@6V)wUM0K^Cmo7@=ywrVk>T_O|FHqvOuKo616UZ-2NU|$zd?-&AD`2hC z6=x@kT5&c-)rM@v*$mmA^ws)an8c8+;@i^{a&|a&h^o0Rf* z!X~J2kSXN_8iaFIDV+d**i;#iU+xeqCd+ZJtR|Wqb&??xU6iGi9v*0&S=d(~=x8i{htf7tQL2#6v5r{z^TNc-sT|A5^eBFK!BlSUk((#A0=?N~uzluQ<< za$dYB=IdFGMHh1J0ErNO)+f$8?1^KAJu44*L~Oz$bdt^F47ku{vb>YY_%ry@Zy<+g z>h5i-a_};`+(rRe*k+VXoqWZlsk7%!oxR1>H*RjRAodn<75}Z13r@LKJ9P^&B5Rn? zugqVj!w(m^JSy$Vd?m&?W5n+1SLR=~G0r>HT58@fj2w_QtU0Q+jy2jnR${PL`^Lte0k<_(XTHLHP37*66GUV*j@NWuMmdM}mY&2# z$3=@+B&n%q883r9Wn3aLxat}6GCGc1tx<8{N*hP6v}1*?mABX~6gi{!maaHTPZ zdv3*7Igb_fC?m^(pEOk)Na*UXCm^k*5#*g2U_EF)W~oQ;jD%LiCSa`fb|G|2z-QADnhI95n8DTEjNu`uetAK zH8f9DcxF(=?MBwevGTWNI=~%upZrE0a934TotE%cG(zRyjItl%d zndHE$Ow|QKSalL9(C6x68|aTWt_(=ZvY>e)cZG3*5`4gjpte{iC^~;^6Ig1o&0T>v z>Bc6@RPms0WpV?5uBxj4NKXetMYe(KUNgyoKQmPq2w~NKq(JZb4?X$G!UFt}(YJvR zmh@SH6zJWkJfs}oH!e3Sm=GiJ&ZjqVEq_J>@E571<-koQRQsxyBh6K<7^ra`5b9~GFOkUs=3)dA<5Rc8-{ zCz`5znnF@dv}GeT!CNM4OI0TrQQH%_=8aRz$wo8?giy{iz>uW-O_F$E%G*^&=A+iS zHt)GRN%fUI9_3}~@MUw%fqm*IwXLaej;S&r^ob7KrJUb4 z?xy#09e7Z!F_m)uu+C9Xt^o=s+NJd{aFVL3 z;~VKnJ4p`%k5W}-h{R2U{HZ$N>7xwECf<^gT;>3;CQJDxy%B^HEaeq9^qJ*9D8WBa)a8=Ik^hvH6rw(}Ld zOSf{^Ua0WTK}C%O7b_q1+|fbrvjm$DDm=vc(WFIh3n~p~n_Cq9O1JCFx18lm!BgjL zeX?#h6|o?<{WZuKX571y));1_`XT@jOWlCI5 zLYRME(}B0Oes;D~7}(w8x`#E~6S|cgfpmR(;~e>mC*=zbr!_XSX73s5j5CH40$JSR zAxfMd7b+oB*5+_bzgVk!cPJEip{mjsLf$b?Ir-~*;&HBv>`kesaSz!pK?-WMIV#NDQ%}_;{;7a8=GSAlE%*o*nnGB?MT@umick zlMf()b*{0eIs`HzKvpZM23Y6vH`wcFVlUUN)C^=MB(B$XQ0q4aFGaS&gfn!x2-{8t zu}vZpF2^d6h66ums$t;gRaK1v((}O(_-b2=JHXvdH4NO>R5VkW!iHpIJb^b`xIrM9 zlzHU^63NJi2tbk%Iv~l26)@z*7=?rs?Py74z|Wd$$Y(G_2GgzP3`i!`5r{-Ga>)hU zBlrSIH8uPsy{#qI0+LPdVifM`xo3w!%*55hpoaRig&Y9V6FCBa1ePN+4w(3h zc84qHRmR05c_RhFR+hd^h%gelhH@KnE++{1O_o=eR5@+P!bVd`SyVt$F3G?f zTUuQ*4PEU5$uu=jeW&f1qP?rjFBdIr%sNjl_fV1fG}|S=gc+CL)Z`AcBy-?Ns;btE z*l~gGJ)V%&eMD@v{ajyD*QlD#WQ`W z?)r?GbbvhEmWv;YZ{oF^HQU_-kQIY4 z=6J;6p4Bk_4B>$5Sh&tc3dtm~Wc*4Ao(e?3@W+V;fDo-FJ?+ey8fQgE=UNI~;Al_I z&PMQe4ZoIpPHmjgIA!V;ll-sGEl`UqEJg>&b7r}W1o9Vu<)Uuch(%KX)jNzT2jVYJ zZGkna8^)v}6(c9HpG4tB^x~!tXZcccqs95o<#ec&uCc7PA5s+{!x zp@w(NQ;z;@;vKV;qd&~n)ghd%+p>jV#yPQIa$7lH-6l6qDIbRyD%xg&qSJLN*O9>U zP1Ocos;a6vNGpP&BHMgM(O1pHom?=vTTSHW1ZP|^shm%n=(kbW6G+_U6eO6)8z&oD z5(=KtEw@QhDzIbM-UGlxRaIX3#{XcNVs1Hbrm4C>n98R4i2)a>$dU{^*tiCPa7k9~ zw6>0#hnG&9z?Lz!fiNZJ4nzc%1rvzZc=6j7tP8BU&4`;xG#W3@8Gtpn*sHOPMmfZy z4FPeRAx)AsOJ)-@DQ1CW7b9uLCfpz%YbG7wJ51FEUZkq(071Gu7y_>tWf%uts(WuS z#}4o=Q?-F#AH{{VtKAW~lgLZzFxgC+z~JRx8pW$mz5Id79>`=a$CW`6Ox$ylHI;uO z-L5ScS@NXelm?^7j#+B(vdW;oWUy-sHA!UR!<-^vG{!mdSc5R!9=}Z9Vk=L9H4}D) zFz&G_Z$!V>GU)(cFjW`G&15xykS6P8r>t0UKcUZ!D+m6?R0BW=tEC7j(7Q3`v+y4n z*P!=ums6*z^&{rxrr_1igp-+77@MRXRAIv#mWkEuQyS?jx?QVrhO7wZGK>ZKyDV8Z zX`#TRuW^PuyTmq$OlSwqoZdKBuELnrztQ+lkDUhunDjNyad}|#n9{5*K~5&fDKf2p z>EgIaHACmymSNrjKW(Z(AUC(woVDRo0M};bm;=LmgI!>q%bzQEP>x-Us|mc`RBa$! ziIITlX7h5h50g)si90wjp%HSP1QI*llhc*+9No@noFOaA8Pmr;QNb^(= zUanhN(&Si>#r1S%NWrd;smZ#S)R)(IkYips^U5n)IK^}j|fuNa4_9zZaMHbrfLIWsus?;e4dYBE%(sC@g1MhNdK^i z9pDCfo130N-Z4)(`a{S&W;m{IH`ZNXJqdqnGDRJxnPU^Uo~hbExDwNHwpt%*ULD{P zQw;-oS|DQ&TwU)kt7ajst6DJx^7fxRFad5m$~PWbpIT08lZ<{4NaSjoAZ=)dIq+4c z8U)t!@Z;w5$jGD5xCVekF7wC=q*-Q|0qa5i0Dn}Q&x^M*bikW!T)Mz7sA^*4j0puo z!(zH;k>jwFu{=xh4}z%sDodda)k{GY4mR|=L-eVmA-lA6Jx(U9|Jl%N^@)OM@2cB=L zE)c@%7(u!>7y^k{8OBAQr4E;vV-xsUQ?-F`B^DoumYG)H;CGibe|b zZVEoDwA1XFTNC)8CDjH7B6mj)(Zl97K={Xl3J8&0F}X(%FwwIAo9=C`W$mupH5=vi zT=fKNzfIh8x7a*&K^NO3ChuMvjRweXsxEf1FkH#gP5Rthf;DxaY{S*)wpd+L@4)3Gc1xYOiDba`zD*ISgb_qSva z9tg_50)Y;SoR9iC0XRy35?DyKGUQ zB%Qz1K)NsZ0{2{l zMh*h^HB}BIuZk|7zZWU(rAFTbl8;;={7Lt&Y4k(uD11{;0iQP2An@<1n%Fq^*aBf4 zYwe(KqI-(>yyozru@87JcYMD@UFx-#TtjjeEWaDTA9Pw>b6H2Ou)}#$F8AeO0s9EI zZuzlzY{X95og#{x{|`NyCXr;L3Eb0E{rf3AA*g`2nrirVptYx;+BUF0564-`jc1(H zfl8D?*k}To5po}N>j<;(FdN#$cb%B|(~T?#zEV}a=cv}?RcUgOhdpEE#i3_76`WmJCazM+YHCd_8k^62Y%mFT_E|D^tomGYctG&ueOL?Ajwp|NFgB3Rsf!*D)|_CA($-6-29`K2Q(U??;r!1?5DW*VHT5W^qv3ioeWO z;8{vFYQaZI9I@wEqR7;Ozd+kc14a`AmKiVV%=ts*f_~RvU zfkhkyUTP7~-LOFTey}5nxpt5Z`Xt=7SW~UPVO|~JXY`v;a%BPhys0|CTU1po+DH$W z;V|%PqYRPy)@F@!9~S!5a#Fj==!bwru2yKI`+^~m$dw^d$ivOaJG3=x8dn=Q+f-fP zE~=7eA;%U7hX*_0(RDk7^Mf7min<-b^}#Mag6`35Z!i;gCB3@t+R#kez`3fD^?$|KOz00Og2E4>ngYQ##qY(}IzPqV;vU)M-+_=ZC=;Pez#5EeVJjlV!kJK-H zP!n0pGDXOrTYKb(xe=ZZ%Dw`D`ILMRK!nhu4EO;px=fa+k6PO@AYo*^1O8R5My-!1 zNk{DCHZdF8AqsHNDwEqM1P**zdAW;0TDiM<<-mhf)w>!&I5a5x3WNngIkBMWq@1`Kp=SK$=m8EX)u^Kl zC2_=_D3qAG8d<1i|Jus$0M~h0HRkf+9B_SARZ}17&1TpEe!^5k!0Si(#?#5?k(0*^ z;~E4Kx%`X?OlavP@MFOfSkJ;AG-R>dx{(11(>oXtUTFa`AOVsG%?rwlzYNlzN^!MO zxg%s>-Bp;0J3`*C#8+72P2hC%>H-O0egrsEcV83C;<0&DN!K%zVXD0@sA4aAd9|gK z13#sz-cf__#h~mf5bg-di3Mqsa^k3=5BN)ifnQOoQAZ6*;)p#_C^2=^EYq^TX61K) z;SYGWfkW$5y{V2Gq~la8cffJ$pnt^ZbKt?|)dfOWokNfUy;}vL|EbYuz(J!Q0zz2Q zX9ZHAcTYxkRgTviR}*-csoWLUvzp9{mQ)kCsd)_m|4mhE$WOGq?1{Ty`scYb3v`DB zb0Bg18t2Y9Qg??6+|l%q=CG}ra+Mbsk3Js1->d)Mt(Gouno{=OCqbAQlzjyPrHbW5 zYdgs&z6D1E@t3I#+(h}O36*_LgOWI6AJ>c@}5>q%vSC&5KQLQj^bFuqN;^ zQ+0ult7;8-?VAaW?&)9-ByPEa|4Da;blnkuzM9YgCN4C%qK|9&l=^?cGHCzZQ@Jj7I8V4cffi@-%PGJk=C#x)46bNL6cv(;fsb8G_pP1Od% zm6+6X)S41x9RlK2ordDh;7C~E1`<}L01&Q31`9NU8!Yb*@Z;-OQRUKW*$Bcds+3`k zbMjPqg6g&em3vMD)gsF(141d!Oo8N9ol=oPrtX9UJp}T#R3P3ZSF1n@T&=k3rJCX% z>s5Q?5gYJps*(m?H1azYo(p!HXfL<1o(==|P*u+rfou|=4_>NSTwx7s0;#P0A^;dB zpjFP#swR+T%OM2( zwvo*%;$D{lX!aYe@Gh-BMpdO5_);@#zE>f2CJwAOXz=SS)j=Rt$mi}O1p-OSI|t-N zGNK}fYb*zMQu>+>J#FLU6IYHtp2&}?KYu)2Y63zj-(&{fYh?}0(VR$Itbn^&y6zYx z+|O;s4g+6M)x^fggaToT1{7sqfv|Q^PP8E=pTuE8Q2eDv;B=*$)))!rK$OH0`?#H{ zbKr6cC4atSYJqUFHFY2^I`IJ_0il$s z3#5y^lS@q1Q^x(fObekfxp)HJY&EukUoce$e9Tnt1nLuQktmf*dBD(w!8mhSCgZ$6 zs9~?P@J%53%g68f!CP=<0+2^}jDz28qc!|Kg=^@*lqU;t$a6T(vos5_Ds-17SR0zF zM`A}A8vio|cwVO8@{>smyiQf(cf$z6O=i~wQm(iHYkAy|%ESL`2zfBl@|PW#jp*CG zq1vBloxchL0wn8Rwg@*^w!=VD?AZn83c>%P@|PpmQV#yet}GhB6OF!khr;E$O|9#j z=~}UqZu=VB7hp1$w3dz_EDij?FRH3%hj3f41F{(P?BX(CrU`6higVP%qzc1;jKXh{DP{al}knt?p5Vf zc_t`odCeBhcLPIQfR8&w+-2r91cXq2B=am|e>m9vK;fT*3b>YCLW(N_*L{iayg~I7 zqiO>2>Qx^XG>+ddluEwLGNC{q6`3r+S8A$>Ir+P&z}4h8_9xGoN|FE2-Q|fV-<|V&miu3xsgN_lwU%m=n zy#c<%COgb6uN>x--w2OOnWt@CWbN$$w|PZnEC&W~S5tL>yQ!+W{X*Ku4BNoBn5qN3 z$5idH@;ce_%7L#ouP%_VWfFOT#1EdAmnZ7;x!?=@qN#FV$jc2q{W{O`%7EJ$(IAi} zNd`cYD^tx9sb)UaK~fEQxf!va=CiFOF+imKf(pn0^fgYO4i4n*$_H{rps#V-bTHM+ zSLvn`krGNfa;LYY4ot|>H=Y1*)`E7j?1!QM_n-n&gs?ZjuqRIZM=ALybX#70kSK1c z%T@2UU&3!cca+6`va}NJ4l8B|NCs2ov%~W1jQ*(ge8ceJJWkad;PS*7NF(G}_eAdC z{HV6=9p^6M1H+ym}qswVLMQNOK)Z@ks(&4x@N;DyFD09>QSl^00ix5oy6H;ytyx?Q#M z!~|H+&ObOLOMO>Svde&9wCsj}Us6?dIzS>q;t~w{U5u**%uUq>Qf^7#vf}w6c$xM< zB36b3iMNc;ghoGbkp=An>p}Z1C~cON0Z5O_p#23BZ5BgdJ-dE4nfKNdC|WMZPEpnQ zmR%FbypZBabaNYH`;B~36s`+&?~-5zBxT_Ol5*mjko-taymnB|5Y8>O%!%)YQh>iU zReQ1$QIdp*bAHGhNJ)}`QrPAPiUN0&A1_=Gh=8Y>Y5=&{R81hgNjy|tq1Hb!uMY4D zRh6^D|0bw+%u|m3_{8yt7BK@tAfH|W>q+=${ct^ITrD63a;O07TrD??pHz-N7*_}Q zM^&Xe;T`joqwfTcPg%qa2!V70SWm)t0gR|^P%bOKoC@||EVamVFzzzN#uNq`AQm_^MHcNT&ot4QCtj*xmBTf$ucc01%=w z4?mP}y~P|e;0(*43#5vYD=UyT4~9Uhs0@)vC2?nbsmA}j<*0b`G7|f9^=N;hR)VzGAZ`jgk5|H206i?uPs8tzYh2l%J+ocX1ezLB4i|$@- zgW~4Te#&&9ZsmFRI`VFo{5&(7j_#35HXx}4V-n);R)jrh_+`&&@_xwVIU2*Jo`QWe z(aaLgfQP6`o(7E+2!{td;K`=y#Oy0{*M9{Q;4f5_J}~&Dy61x8Q)?JQOY$X|b! zP678&tEy8-{JCW@1iodIA<~-m>ridrdZy|C*H={)1Zgufbd~xVa%z}wWeotyy6Okg zzXwAgSyzTgGc1n*Ac@Nz9FVLlU!+ijTa|nb88y7YQtJZAx}?tvqyvH>kgO|1q_wPu zE|A1!k^;%P@O-l_8Kk!s>!wV-f|gruTB^ zpLsfWcCk6s0Uo5Pa>Dpq9q*W@9Q_itP-!m<5rO<22^kvTkH<{{uBFD61AkHcu^A+aidOTZwZq=<^+XHV?Rl3JGzDljiBM^*d;y_xi=1sfe z>Hu?9rQ_lFP%R!9&qTZhN_tF)2RwG%c-}EjIr_1}@koo90qYU{xp<*EjF@8wc>cJl z;&_HR=D>HEstK%f`Rw63+Z;0>1aj^H*15(m=p5r}0U?lc0I<$A_ATxfI{Y$Efy|8Z z6#(6Pziz9kg!CiTiZ5`wUBC|NPPbuFOWDBNji?PIMj0_LkOIBCk{}M8(h1;wMn4RM zu%yq7{z)^;fFa_r?sOZ%$kGkG%ZLVm^@y!R#Fmfft~9n&+I@_^`BQ~|2&(54PO@pz z1TrV&vF>BKHx%f;rnZKf;3dB@xv+@+dP+>g7X-c<(DF~Jac+$ck&CxT&I0C^m2dE~%7 z&8rP0a@7o^K<^e8=!cCy19BTJkCuTDR*MT#pm)dhQA$gGa!mxpdzDj#>wA`}yGG&O zoIi*+y>aT-?Z@~Ev_G=GxzG9`z(l^Uwmcq@Mr^d2JV}~7XMSwQUkE5PoN%p(Z5j!q z;{@p?N6qj(N(_ zFSg5+-~rvrI0C<^swyJVkAtB>JIA=YVNah!{|zH*1Bp=$Ez$&|cdH5X_ZU}ZP`#?5 z)%~`?k!0kG14!7?QU0E&y8P54v<%iF_{+i>y0@uYX)JJws(SB~BHS75fREJe5dIYG zfJ^Lvmv>$f{!^6_7dUaXs)$}(YlVUt%1e@R#sl(bUKUfby}`0*13z!79QZX;wMqZ? zK{Zj=Rnijrv67l)UK#NHrWz)x&jl5bOlFiJVjl@(v zWlYvn#shMn4#YQgEAMIox3GCK$fO8omO&uHB#uC`k;g{VMlOl3@y*aMwV{ub#AFl8 zCDC7zw4mee(^$a`2+?@|5o2bbejfs!^rkZ^2VFtF- z)s{?qInL0lA^wt+lmUE&?kdk8{u#b^%u|m3S{ug=m0ljK0U;=t zY~5Q=!apvUtybF@R|oiNRi(4{j(N(_XOH7n7BK@tAlU=!N%-s;3;l7q^6nA1Lifo` z2R^2%svsoZZc7{z&~IT}IS{Xs%h%`~vy|i51z|0n0G@A23;{1ORR>5_WnQfUiEI;R zf>$fYUdCmw+;Vdxmz{jx@fEcy9~FWhHqWk)*VLW1xmFRM!N`dL2%)UDz=w>x3FIa( zu_nJ?tsgb7VIY}JEDuH9ZJW3UWp(u9bmMBnK{r#+OP_?)uCY2YD|`QVeXN>(NV^6@ zV7N~j0zRcyl`qmi&DWjaeI7Y^tY%(qAjwp-87a`a8!AtqL63LIl@&-ESkMd@=-nq1 zp1zf$Zy7zUlj8+=rbaCPavYe(mASPFBoayejk!3Ja?GiTNTm+E!0PM*8ACaR$RE`> zBXJ5@q)z9Wa})TbS{2}MJKS2KyD24A!n$fhiefAOZ>lzsHD^-e^czMBBvzp6U_|$-hNVLAjj_!ho zBXPEka0hshsk*?Hs;XuoT@(y~3ul&vT;*7hesK zpX%VvYMl#>#!`*5+~ReB;W=Cv_$RfhMjUA?yRqp4cT`nnXwei9^gauk1D`e3AdoQC zh$Hc_om|@i>p}g9`=A*?pSGZFAYrNzN7~XVZ3F8;{fOVM%nw=wH{$I2g_#^oI36X* zhyz2o)QH3NU&@slaXwz#*J|kik2X~sc+9v13D*JUm;>vMelXsw4!JqHzAV&T=bK3f zc&Dibf%mGans7*~>3wP91_1hNjVlMiBt3#d$8(T_h)KG4NC7%LXubxk2!CWz_Y^*s;8q4S4W!v3RDksm;O; z@Kvg+rYq8}!4UXvQ+0vw8Rd&~Q!tGC>+{G{dE^Co>|tCv@B~v00I#m)krzlIk5%YL zMjqioSQ|((Ws5RP?G2Vk20YqSZ6L{1zDOZ8chlor)FQQd9xcmb9}C(7LSG#~@gVH0 z4kPB+^h4(s!DVXwhPJ{d&dyH!<{ zjr56N2)urjp$cw8B>AuhSazMM?4|tH8Pi~yrI7>deLgti`ctGd_v!=^bt|(2_=u?nf!|YAdTcyb z4i`^26IX5CE5nPgqf5hqcWMTV4RUx^+*S+Q_y8>ed{>R+sSvPUq8}R^uQtc#XBFa@ z7@IhQa%^DwrZKsbq3&s{XC@tBmDN@cL4bDQHDq~SQcF19it3YaGR}E zBkL&eC{uNT*4jk)HS0c(db^tYN-8wmY+E{hKg*nKoOi}3g8QL zpPV*e`mm}>GjL#U>R#I{P_#(5r5kuebuvJ(!<6d7QZ>KU+&aMPR86)ms(rHN0pDe+4)79F4FEr&swyJV$IY+SjR8jdNy~zs5fuW|sv1)ozcgS-X;AG3T z?Q6<>su`*7Xc@GDBv+=I6-Xhk_E>q*U|HIMBvW$9I<8sLV=)AhVr7U#mSPAbpUM!a zWo5L0N2yBQ`MGHXfhsERl^4<<7b4d|zKVXTc)tz95Rg*Ji2aF4(@$Zqvl51YR9E>T zQK0;E2avK7pWSu!pgz_P?k4cZrs|T!kF9|2W}447mRA$Flc~CKV-pw99Ev~Fc9&}x z_}4a-yTIS8YO;JqV(R=&3*=`^zp$rAe%>gWKx&p`;=w9|Gb9vU>ekVcs9Id)TX5>%qJte6yC6ZrBi|NV^#B8N5CM$Ju z_Hgl8mz=GD4_M8%G=>S5$K>J|b5mJuR90@{n#UtE9$Cp51bC0l*}Tzd5!- z_wxH4!Ug>Ozv!5!9Q}3rGfMlSZY3gc%}G@^(y4mKJmt755wnz|f6T=XC%jhkl2n0z zG}Qp``BB*;@j{whaR9eltzIV5yHqQN@th!!S6R>;_-9iM0f}68F)xsK3r?0)AdxFW zq>zVuwSqk6ThI*nQ&SBBAuQ>$0x8hDdF|<2(Er}(yFdyn>04Ij7S_csaGt3$Ajwp| zNFlXuJOZ0*eA+G-M?l&xjRn?I``;abeKijrNy{1o{GGMvP~uOw$`AE5y2WXkT0dl7 z9pDO8mHqN-2#$A|V-AEsE_i@-E`O}D_bKD*0G}B*2^@c7jyVtlNdj2s@=36FjmgzK zkmDXWLsjWc;P}sw1P}sA0$AtrNwD|LAqimHR5@^P+`Ja(-lNR11AObajth0~r-LK# z7E|TGJICc(u6yq@#}4rRaUD4rc@!qY0o+*k$;~_P6{@O62?ig1RF%8{u@(4a)m6?&7YAqHlA1G^d@E-)u+8?0-m2Tg^Xa{G*Z#VlBCpD? z(U`iayWY7>4Y;{44X3^I!c1rQq#E)|F$f;K;o8Jvx9Okz94rxZ0Za=#Aad#c&Mt%=J?a0cg$0ce#OU;Uk8*41%yD(9>97M z{?c`Urg&P&9{8kPcz1!LFT9bivnz@&@CH>?l_PC$r#m+-$m1-_BL}W-^lc!KOZvP( zx;7XBiCh^Xg*@Cd9iK-=9#>jF27td(Rr!PeV6rJgW|rG0Ew=$6*;Ix|Avd>>T%o=B zpmOzYabv&aeQ)ep-p|I4se4@fzG9=&1U_r3{2LtQf>SD4~*>D|cBi;lu%2Fc(O#z~!rv#MC?l@lJZhyWuXa-c%I6J86|!$CKL$In%yvPk{;DPJA{qxP#*^Jma)uv zU`U@nX|fHuP^|uuvz)MiXIc(JK*}h)liAlsK4^v+kYwbJ8aT&N&43{<_nhK3&5JJ% zlv4yeZ1I}kRY;R${9mSV*0X-C{!&3FUaQKI4!nozCO4*^_p%9%0-1ApX$$6LE^&aI zmP)f@mFgq9U0wQH{f(vKSE~A*ZiV3`g%fRdHEmoJ(C|yO&N2x2v!>gw0P`-oTrC1= zO`m+t7R>Z1|1KtY152z6Wavs)Fr6$jq0HY0SKu?MDqa7q_^-hXNDE3c@KkGuyA)Zf zZDESa90z_|cgev9PONK<9VRYNnRIb2a%i`A!|0Fy6U^ zSAcUc>BJ`YD(}PAtt>X-z~ji0`N09j5hE%_BrJGtA&z6E>ivR_$L(QU{;ZILM@BDB z@tbP$L*16gTKo@2R;k1^_cZ>iK{NEw4L@el0d8wYbrZ;Ec4J&5s6+UmB?m$vM=`L@ zmAHaZuA?o94)9359G0sb;EAfL@e0PVg%6ujPW^YN@R)AJ`ALOO2Nm#7swy*y50WD^ zb;efCKEQDAF#zNZaF zx3=TC1Ke3v0HD8Lhps|&1i`MegY!)4~!0p4t?Ht;@GRe2%JwvP+i!0kqTT!8eZUsD z$)_?z;$tMaXa&}@^G^qS?^^Wk9?Nb3NIqrImSy)E%WeQjK9wO-77T&)?EFjHpU@P( zXsI-TcbTdU{D!IA@xGx(o@*I2Nowz)iYL}jl<;XIcIz6S$em#<9bjRqHt=JrD%;|p z4Z-z3wJJ|P;13&F6S&k=T_F643&3S+{S))*05_OY6)smln<(7WRGrr za6?#DoEJ!eJ_kZy8O9^wBVueLa zn&wuTfk{rr2uM1m8A<%RmDL22S82BL2HEhw!kC7D1TO3DBpTEqqn(2t}c*#)-Gp9^^8P*Piwnb1v^Nz{E+U_RI^cKr(f#>>z2+%ASJ* zYh2C(-F2^-bbxcFR>pE|1$?8bs&0+N^`LR(z>SP+09fbp=NTeyX^u_c4yJOKZr{|% z-?j{zz}K0VJK)La6=u=|hFI=OiRw2{Aa`!S?M&4M?x3owb4YIuhQMP+86uq%41wJ7 zR*Xp32SY_}LzZ$01>}=^8EPOYmh^dnbhOcTfuy)vdGyU$fOu}O1d?M#iFCdh=D<)y zH_rYQs+g_Y$&Hicf#hZd@;0iMhrZXVJhv)m%Yvw0}Xg=&F1 zQe~;TKz0AA+tlewcYVi9I>6fZ6@jC_`-t>Ldt%cD?xm_~3Lx>0LEuxjY0PnW04g&efqH5fbrr0y&LEv;%Rfb5P42BxcHstYM%OeNgZh6?> z=q7U2AEb#!-vtu6GDHe_xHakb8o$qi+Mns(IjAgc1(S8x8o>m}j}pp>knz_V^o4&=zDL-N{EG^0zuC6bM6BbOwZMN=Y_(&IEUcg%F2wDU1JM1DX8%?fkcG z*0XYaXKUH#>sJ0q-h={SiS@*N;(=dbCPQ%=vB`L8Fue4+ud$O$HMSAH=XEVu727de zaIp@<2X)(P0m8?^7{&D=zg&T=F~E&gHL-E}gaYB~!4CL6RaM8D3T}h7tXROhqhCB= zARU>lz%SM!W(5+oVhF59@K23=gq#R-b)S3-47i7?CN|ERP#_#@b}is(W_QYj0)a1` z3Lo&DW_Q*|fw08*`hk=uFWUhrZNbUeRGOFo`#5-p)-+_b0FD@l{U#Xq`IYbEd!FDoDf!=hd_oheSie+*&&3l zp=Cg_=-F8U3dnt6Y@ zO^Zhgq_5j78UX&-RKq}CDUjX*-(bTu4BTH;6B{EF3WVWc2RyQFhwwJDI|NASJw7Vk z%0B380pAz~@4wDFNCmzJET2aL`7FA}hcIk>!+e+;CWF*5)?{FOR&U5>yq8as-)5PF zs;dp0+~~i2(jk{mLgtT-phxDSXSLG)@=5PicP?-+M_y+1?H)Zc13kIXl9-oILhfp3 zS8Is<<&)xB1U(I=TWU^!PSie4E?J}~WSZ8~OVs~Czqn&1apVKF(5YoXXN*XP(a=#m zkZB!yl-DlAR;@btO(@XOk+83?KzDiYGtRiq zy5Gu1OkRhbVM9jmCN|EU;m-IyCH^(2xEhir`^obPq|n3;kcLf@CT>6Xvc_gp zub$<)C_6`NCv7}N+YvmM&MHvSv#?WWQPRj!v~ed#dB$auJ-NseA|6zI-R5*NrW7kC zA2ToUXz6sF?Tkp`1GU&Bd6h%XJdBnrN?`bdid`U={}UUsTp@g3Iplf$?Fy$_d0hg; zTcXIJ0>n!ayB zT`MAl8d|`&t80%BfjLtx6^y}?bg!^(U^ARFW1m<(?vyd zH?fut0co8~Iv`bxV_b6L5}jGjZGfDoeFlSM5V!|Dw>z6t9WlzjfoX~i>-i&3YKNHC zJte{fo8v7Y?dsXZ>GqT)%xvo^5$IHz517h&hH-5@n0@myH$3r6q7jQ?-G+sH(a)MB<}Mp$9G=Wr(y~wX2jz zP9Co{uK^&Dt4ltlkzfd1tg6ZoX}M|>cU`)tL2$YH0`6p9T_BN5`pkYG_uOCzT&$|f z5NWw;6B8O{-q(@|eVAJRhj}%Dgpof5CV%a>`nOoOy*FYI&R3<-eMI3Wf(p1?RTIm{ zv5IZ8rJ{e+ZQ>lgTz5TgCLQ1lrfLKKrmC_xodSuMePpfx_t%5GGDKRU+Qg(p}b7DoX_3tddpsDVBcnxtOxD4pce&0U_Gdx;?V4( zj=kA-mI{mO%6MSN?QWZ2gAXWVO3CFnkT`OgEPteT&MeFLV#|0CNXBNn^3X$sW+MFW z&j}*@m(`oCJg;HAm@EJL(}oBkFZZhp+iQ;*>!c?h#w(;V9QPlSK>g6;jJd?O9805J)oBs)@9#(GLPirZPk#9~o3&NXCvMd@vlBo=l z$VUu;A+=UK9W9s*N^_>dHv|=s$mNfTfQegP{I?Je48BJwd|OZf$uD{NK+|}nQa<1V zf780whJzYQv$)6<)vEaYTEpksj9bZB7Dn~!bi_$ zTF?4{`>U!K7h%|x@*EF=F83@E=v?AS%p7D0N`wr(A9VnV+Q@c)7K6 zn5OS&JsAelPI(Lq{7J9^(wCASOu3Q<@JMT01`Kt(D>~}gQxh%8!Ed$X-94i+sIa(-%i;9AuwjMM$)1tPt;+jCFfi#a693QOWq?YKeE6k(={Gh7J zBiDb|!8_(DNB_o!cg#|b{vO#owo;D%KG!?;ryTvF;~fu4IUeG!QI=}!t_@uUUN>%6 zyh5$j(N(_r|KQEl;f(T+DbY439wuXxi8cRynoyp zy=W8*f*JLV}z-yH9lr5t^8ykjfn z=$qpm`%{j-IZtW_ei51j{N=dK@s4@Q(Kp9CW+_MC99H%<6v)S3z_nG?*EoGc%-HIA zUVi(t`nQU1Gt_)zbF)v7w=7Aks|1?T{8HdPn+8C6vsLV6?^ zDzXjqi_Ihl-ejsa5WlZa|L};Wc{aUzsAcRogSwQfx!wycQ!92>3P4MxGV{ zNwn%N5&;q)E<%5mab-Z#E4i`)X)jGyF6w~LSB93k0wNq`5n8|pO*IItbNSU1E>e_R zNZ|d()df<1nOA>-M1;hx#$(FC7|Kx|kDRCu)D8q9H)n~(6e+LW!5^}R=tIEkO*IVs zw5f)^q%dSPE)&^2^nMYP2-D-vzkfLQ_0aCP_QGrw}R=`PCdXjkgOybg=&0PO@64`zQ)4MVw-WQAPK30JjN+(drdWXxqRlR34f3?mCr)8 zxyCB*0Eg|NSQmJ#s>;#r6i9!xhhXlgg8p`+&w)o8{U8v+Y7!#_diSXW^zSnI40yQF z4*(&o<|b00cOL~nPs;Ly9~d4y4gn!7>062BxX-{neLwUhC0D{1jl^^493x{qE-11Ri0kLxC5os#iEw!k@U%pf`N>Aqy5TP>qbZiy!>{!{RNPP$0k{rzjv~ z@}|xbd8^0&wgiMYByzo8V^LOOA;;uK>r4*BOTO^$qkBL1Sl~h(dVYajIt3gx1>-4> zA4c*TH3utI_AceN5E_lA_FG zAo*2vNJpD*4!porUEqgIl>CEnvMe|0uMUt6!Q}ZKkUsoh&NU*0LjS)yPTygZY5>Rpt@5FpcwkEb ztQ)d8(i+x2Q32}_vjXXIODzL3LCVzpCprWTUHkv-S%y?OLCZB2FtqG{ey%=MTgQ;f zF%}<7%hlv*>v9Kp#?;DKUOfe#sj9N^odRj+)y;6_^f~k=8+{uHVM(7S=-tJL&pv~G z9i#68KU~W`E0F#X41pAso?ov~hrP_P3Ea;jENpC4ARS=ZQ$$OV7YFwl+Q3=X$R=>E zsoZO;6tKRU$d%+)?oMI8?mWbJI>0MT)dgOqs%m`W!Gx=AjydpyrfLK0T>kUg!`0zv zb8G@hCb6EJqt@pKuQK z6Cc+2h&d5|U_@;oF{Zmc$wKJ30^OfPC^b+s1E> zk%0UAvjgOtT}J%sq)bs8tPiTJSeMO zJRcC4JqMy?)71v*j1T%wAJ=IIFU7e;!2g;Xq47w$)c)r$%lxbl}n7^(Gj znJjhSt!?RaQ)x5Z^}o~`=>D}v91$ha*VwNhq3134Vc=w2H%6uw2qEHd+~}c2xBp9XuC+EcfoNB4M_=Py{SYZwvTv_ovtHO+Ar1|W2l*EH zB)2wC(}RV>wfqSk9I3C=krXGO)KBfiTyolY$&vMxFthSSm&#rptERVIIiM6k5hkEKDoXd%j9@9P4(_DonY_Ot#sskg|`LO_Z2=9RB^C` zS8Rg3jsp4A19+0Xl+^~FVsBTK&mxeHwAX>$asj>0_=bG00DQaAcYzSf2l5SYAa|b^ z%u@C}E%zqyB2)E4bg#v8r=0hxHKuZC^cUEZKu@WLwuwE<;fx(qLyX_8mS@wT<=GF@ zI@Vy9`V_Sul{)t0rXG8iX~vGJ)bZQa@@xW0LPj}eN?h?S)T%D9>N>#dOw|T{QdQ;I z#ec;Iu1m}@2lBF)+(rZIT>dc$T>QeB9DYDJ<$bg1;5wPV<%0}sSrUMCM}OP4Oe^7S zIyo?b4_J|H;De*OgA{)Dpbg}Q?$T{st~Aifg#r-HwBs}CxW2v6)B*BC8Pb0sziv`- zA>CoVUEn>cstl1HHp31ud{f%35~Q}KdF4QUPE*PR5~GZm7f6BLt#Hs&uFMwTJ1yb> zkXlQ6dEBlBcLhTrkt;(a%9S9%keYi<$EVgJwS6_Be0p^tm~6_BEz9llnkATYDoZ3X zk|_=(xiXBcnF@S%{bUDY$=`2-0I7WD1BAaaj3fL_Cnduz%M$Qq*6}uwHuN=iv*NF{ z;7@S<=>iYX*K(>Pklt%=J9U8{7-bkYoS;9m zpgC~1akYWG&Q=D^3#3bfA+R2FRVvM>baUex1QMnUnpx1xf+4UT)F0X3*7u(HSpd26 z0{&Tdt=2eW_T)Jm5^ygKq3XDGUsJE|>9((N@@C+lj$+&_c3rB>U$i1Rz&ZBeXBW7Y zs;Z$z+9wzS4;W>LbX_o9c^)}=Y;IlyK)#+XH}4Ay1k$Od1k#&=H*kMd^}G?tvGPU= z8M|{g>D_0YYd)cn*ZO2&chgu9_I{b+2vxqva%*0!@B=}0wZe}ERot~@y6a&x=>VTM z)d27XRaK+6a;_Y%KN(jSSm*MGmCq}KtM2Fzjk`3`vlh{v!W;St@htnKxC1=YRBhl< zs!G=k*V^Wo1BXpD2&{AYn&Fyljv4SsQw;&@T)qvSs|DAfaSZ_LT>jj@r8@8dy-Z5r zVaDaI$rtOc%gv+%e64*n+Xe12>ce291;H?$Y|vj~^f{2%4CLw!2w`<>A_aOkN1!KV zxf%!JRdV^pKcM+Ms9X6P_q*G7oKQYuNxSD@_y-fd)N38U_ z|8eZ-KZ#8G8mG7g|G(AddEJhx5amC|j)8wLaTQ|nS7qr{h!Ff-g=_14S=Z)`>+h7v zBvm0Je45d8fFCkd8+fIvss#dx*ANo75S~7V{=-J!1wvR&U8GN#VGaxt-LdE+W<-Rr zn$1X`H2Mq(eR|rjP={&u8EFT&uBme1D^yjr%qF&i*}8YGId*`XkLx&3_Z}4-fp0fe z4m^8YuEo0dd~@soFBsQxiSE53I08TTFFNKaM}OYnm4jiRU5dos?rDF%XII0x}74=>DOpX-PC1f=-F)4}6K%;0czW;x zo}sFAUM%FCE6Tj4z4U_r-th5Cb4rMy$To`=eOR}W7w~3NwSk{eRh1Xge+NV0bE6EA zX4^A#f03aM1ea$cK*E$k!!Kk!WI=P_4^<_P-;Myig9`X!E#bUC+D#uq%J>2K74vEckS+^`K>kWwWr#G{D$9Xe)hf#iTCiU* zq}VHi3V8h}U!+HaA#go?bW&x5G%q|*0rrnFL^?7U0#6)eh;&sj1TG(Ci1edi2>kmf zL!@o=DTRyyaGKssSH&Rli*{lNWO`JFHkTDJLzu^MD*$Asl+V7w-?mwk0huSI8F(j~ z3K@`DQksD;4Q9X(s!Fb08(`*5=?b1;!&E70i4qUBOH^aRvU!TrWEi%p>fQ4$Q19>A?SH(v|H?G zyGJx-pRV!5xEY=7*!-2$UzSX{e6-kZn*zISBD)`|pI1|ssc(L}Jt-6KG=NWJW}NsA5Qf*7VI3GQ0oH(zWPH_|lzwft zHDESqyfz$?LAavW0KSxo5N8`3){6|6CStY7FkU$G6Tr8ujtwBM?@eduIMvv&USt@j z8XH!N4C7Q2U0qz&t}-@&+Z$B_?kLJU_sxK`z;fy0c0&8)3GJIU;rMl|QwP!xS#`MH zP#+*^W!3X@7s*i-cLo5Y(_Cu<$?gAH|0&%z$;|m24;8uWfQzK%v!lfF-6`fPPg$32 z61Nfpe$gU!196zTuiGckgZt=W(+2Xfhxw`i@#Sti1B0Uqc_9Y{UNJ`v;NOj^0mo#P z=8Yz$c3VG1%@Dh<q|A4=7HeN)oPLT7T&?+=7Hn zlc-u9iR=`CHM6Y(LlV&=;c*gOBr)0?%>-tX=qgBJCP~aP+b&>8Vy2qd#Cp=^LwoLg z6Np1MC-h3|BJ*7V^0ii{HK47}1TEmJMs)-KVN?Z}*s$pa@(DAS7qBg80oO6A0t|JI zb`>^##H<>?{f(*tKQ7Ae=#5s4ZB!jde%_W+NbLiAFMX1-Q+^5U zMhhP~BaWkR-jsG~2@U}(`EDAJ`p+!+2Jji9YCv9NnAWG!q%={hZ+Bb(t}4naQsVru z-~bZmQ74b*ERP-_kyH0|%VR~$qX$T2uSjWAQ>+6+YSC~ZwZ)c475J=C-N0;WRZDGo zi`WeepRcL|$uG?|d}=ME77Z6tqp8wPA5=~x;>N~bL=nePg!-@&OD(}6U^HAhrGA*z zrvc=w-gPc;wzT{xpmdGd)_^yTP^9!|P|Oe8IFCAcoNQJ-KqC85K<9RfxJx6D^mJ&Pz0Vn!ef3U$Jy1%E^8Q9Yi+sZ&4sR)$o61M zq5>pq_Xv6dCg=21SPcsEf^9z40c~1AS5I7T0uME+2gtXPeEU%1yvO}E3%L7;GgL~) z+gVr-@JXFg6ps(GThmgh13Bq(yAzNwsjqsI5)qtYS>@L?_f=r#?Sk(vpg@Jw0M#a? z*HtU`*12~VQ26i!AIz&#;sKwQDur*3P^I*Y*p@1VNtxEFHYx2bwxvqp;1Q~nXpEL> zS#$9DA@}q)@Hcj?r3R$>E4#+%a__Zs|MKZ7Hf?PET?5i91y*c2Hdp}}Ed^F=I#=!G z4pqQwL={-E=^nL`vjWmY1y*GZ#-MTMtH7PD5;K6*FC7xo3x;QOzQyQ&#&+LBfE{u_ zIyo%?mbQiXBJLU)sRgfH)T`XwQX?C1hUJz_b@JuTEdzB2i}9LOZyh)8@0gIYuX#ab5Ru_*%i(T z*zuN}f;K>9e5i1~BJ7hF+HP6_vM&~#K@7>^df^!f;BiKE19@U6-N717O4kNO;BBJ3 zBBlF-BJiORij;m76!X<2;c=!?2cBfq3?M1CxrFPNPILb-gR+H3Z`^1Hl5T9omIp&5 zAgRYjYzdW$<{>JziutVqXB#yWNa|^*>ZJ#|fAW>OH5dU&JvL$suflQf{sfYGY{ZsO zspvWqm0Hh|=>lSv4v+XTSF|RZVdW!&GXn)YLX`WxMncQX4{E?GGioHyV?+h}az6Rd z$+k`MI@Y|`fCOGOS@!)7S0{HZz2ieuMkQ;kI%$mUC)Wf!AZ=f0$Hx1D9grFn+Od&V zF4*mP!s!`v-2gr-%I~`Q-7hw*7a7J2@7S*gCg*O5sH-F4vIo1E)lxMR4Q0K6sX05OSpdjE2+FHnf~Ov z>`yvC|y@+;OC68j~CG%#p7m?46Y1@zyVQ9HvEbi)`3~Wc)+oBu^BcD+I8mc zQG&}z7AJwPN6l9qm^F-(=#bk3EMfzAlTkguo0pix4*wT@4awJwmP7;i(h`$U10-5D zq{9TrK2qF-ZL-|Rny>*3gSi{{Q)zi$l)@8m-9VnS^NN%vS+%-J7)c)MSRQrY_l@cS z5;=8WZ&G?XC<2M>6)A;0q6=PAY zsSM|vVI7z?j8pBCLBAO`fYZW7Z(u`|Z!bzm21VdWBNQpk3yS%+CXXvDk2>%`vzh@U zvLCyYjtz=HB6~$jA&+QXOCEgc%006H4EJSb0*RcuuQn+iZ+XlF64@(K3VB3J(KwGT z@~D{mSwJGE?z=3H6N4g<$X=0B$YWMnzYyGA&H!?6(Vf!+vw2LnJdU{B_fQugb#d2)C*(6vxqJ%!s?{A zOH3j*tQQ%^5!u&Q7jUTpKVno3_%TtwB`EQm8aFor4;`VXLL` zpBXlQ_lqj7V{BM2GK^D=4XZ_l<*9z#Qtbj}Q;jF1R2HmnyJ#RQ;!+McnoT>sPJBEnBT}3UEoZ9#IEt(W-qJ1KiW(9lTCr2n!`bW0&-i`Nn!pxG&f#NCSACD4zhObH;ivE&;iV z1a0D$3_#W#ndJv<Z%c`B;o<`C z4z@s=%G*-9*v3m0c&$<0KpN27QVPwrIL@ts8tmmc6awb}b)?F)h3H1!7oGo0XJOyX3g!Gw#94^_rA_ zFMd>VDDV|gW0KE|Zc^AnHCQ$|b#ZdV*wn>VqIQ$SwaiVdF7!*uQORMz;PrIxH+bF7 zn(Q#(?iT2DSBrR7o1y?rj_z;^+*6yzB=bf$Dbz)#iJ#$~l~U0J{?KzRZrcPVO9mC@ zFw;Ct=rqZKm!`AnR#U;qyu>O|F0o3K3&a2C7AR7oYZwh5G%)x@RAyjU(gL_d)eV3T zR*4dusNN4Z$|99csT^fvrvW_Ms2cDRQGRdEXN0fg%&-pptWh(7Szqz$IrdeJea$TL zRj~F~a2&Yd1iZlV>H(5h!OXBo+T0Cs^BgeTZKwfzmUyKYUro!P4m?nm<7 zeBEijs=#-R>IROJdv|?nGC1o$Zot@o7yb{kTxS5YzT&g|@iJK545PKp#7L!zc0-%S zB%hvd_nHXUdj4zDDE|xL?I!OWPj`4GRrfd@5GU!-jK+*iSmk+K5u7G(VRveS6R?H@P4Ca0EwKsuQw_E*c9u)S(e%i zAjx=JN+Gow`3WLUtx9U#CvsyRNHVGWs-^a@rB(&bu+(~hB;#!2a==@LutRD2>fHF zZuKUm6~I^LGjSA!z(woF@9o0RSfia?std!$6exEZ9ZRTw31=LTk*pv#)zQEP%O zV73XmtO*zp&LfZ-rrC8hDcx+<=mJthuSn@fK@ms|y&|RUY;1G^dqla3WndwNbAuj` z;pH7tVuZQ60KXzzuSn_H;1T$zY-9?533|YPXZ0wAo{OeF2JaJLJWo~M946^rsy(Vn zfo^qY<@78a=%|&|w(D9OSLvU_0tGzYs0whdDEBp}QB7X>&P#dRber$QmL458!Rqc3 zrm%vwQ3XhUv#C%Ct7vS?o%>@2llsnC7 z1HT~7w+*E?g0YYZLY{3Zb>ROPH3LW(7ji8yLDG=*CZ!NES|k(la`RsWK4nxlkT5P} zJD4D8$ZA2zXrGKjb`kO!3)utAy6-A*A02*U_tSCzq`9vFsfDXi0?vkft@XJr3Ma7>KnWrj&v& z?ogPo6P3@omRA=LpRS*A^ss4Fej*rrGg+GN1(ELxzArXM(}7nTRRM+z%F~yS!DGP? z_}`-3izju;V@V}L+V+;2HGu1m_G)fG0@oMi`<~KvK@qsa2t`WA2E~wpN96IIVK;D{FxIV~QVJ}PMC>o`Z77Me-} zc)L;EKpu?sZJqap;dy4*0A6lX4S1bVjq3$(G%A`h3LJ3}WeHY19s8&`ZUBEGs<Mnc4*00UY=Vqk5Q@&j}QUd5N`43b=|{)wqkYf1vQqg@3pA zTCOc0RjEbDGT>D7lDNNFR< z%qFPKwaN7iaPL@~G-!;BBPp989h%ggWRnJt9fiX_*%h3M<7jPD>BbQaTHLm=?`U?Y z$S0~rXEJ#mw@jVzrk~ZK(+}DuR3{oN+bQHuR-MXjf?-4xQyY?`PbiG=2Jl>MD&84m z!+McnyywM+)gr_A(!bJ4RuFKzEO1k!YCs;&^Vw6PMcmE?WKSus=34T+g+-{~Yx_U} z!w%RD#J!vOrEj8Bh;tBEA>jSmZ^69F(AG`>4?x;%f@B2@lc@b`fdGBHnReoz74X;h6ApA3|ciD99?no0xsPf^9g z0>k&runx=`#$6j5R*MYd?n(Sqm#iR}?#_by8r2P)Dylg9b+vVUGptMz{79gHJn~R* z#H~nshFLX${2tH^1>l#YRh$&(2q&Ab%6vfPVtW9ni1>|Gh#d&sW z!0u-Qw*h3aRcy#~%?A6QJF5CdFU{npbqA1@olsI2@ zL4iAuP|OEiTU$4`2+`pBur}dvseO0Ku*-ZmfZW`72LoX57@wQ35TylTonk(9+<(m6 z*MV3S_t4!k_>mb_fR7o~1I)aj75HM%0={Wf1^BK}J-}tGHWlDRqk4d=8C3zUZB!5N zBSuw#okrDYzhjN60D0Z2TYUoO1ufv|Mn%WdK5e?hR2snlGO7mTQ3l_y`A)>}3Nx(m z^413fmA6`~O+Pi21~9yLv^8_plZf1W&1|(51+4ELcVif0z z7H#eZ05EG952i%7VR=(B1Wer4kC7?tWJ%QGB%(tAEwheURe!2$GKS+_=-_Iz}H22UzFYoia=hn>J=&N zx~#8?+p~dtit>t-&JT+D%9HR%ENC6bH@w}v1SG}OeZ5KPO|$I=lA>3nw6o>W4J1Xc zNGT*7&2%K(X+f(%ULotQ!2)rVx{t4D#lE`m^(S*b14wmKUtLytzC!Nid?3~Jij;P< z%Fh5&U9U)qoC}U3A5~VfExQWvC8KI2`bMBgVkb+Y24v`rPR>lgq|%zODTKVDGqwRm zVx0Ux95VRNNh%|{$ke&p+B%dM2(j+STC_KURX zW>aYZZxNM_uXsg>;g`*@4#a_boD-P!6<>qE*R|%W3dDh1@c^^F;=OV}J{~Y%4d8b~ z6<27nw(|LSH~9j8xS`-#A7oY);Q2<`4~OZA^iTk% zrmaH(g-e4isooJNArniXLKV1;=|&3hzvQQQh+!D6me+v~%Fz8xV}6rD)?3^=i)HeJ zq)P+1vt7CE0q!EIIJ4MS9bf#y)}0Fgv%Z!luPVN_x4gQ6Szqz=$`3ksG{cH&YvLK9 zl}x3}wh44<6Ibe8O9A)Ors8JdhF#r!H-LvM(U5EJCj~>`6-L#7OTN>`oq~(Z&_3<= zMN#gf$NcI)U-zV7BGjQf8Iznkzezzy2d7_j{B4upO(k6u0tb!i2GZZ&7o`WR0?|Sl z_Zyn8I7l@Lr?rxdCdC`l>c5y&M#Q+#>Rd zl(x0(W&latD^enNx1t7Ss}b)bJYx`Yu8_)~Lv}!Jw7K~gNQy2Za7)X!LblxBc7{Mw z&ZK%{Fa+LV)C^$eDOTX!K}$)Sm@0I#)usacxluKGBqUV>(vB{5AWiCKHH#y#SeZO* z88v{9ifZjR6nN-1?Z$ZFIw+H;f;S*{%39ti{7rhr-njieY~CvQ^tn+s)^4ygfD=Ud z{a%G-C5r>LX=`{8wE^5no7`F%xbYHwkts8dn?r!BXq)Q};F_X}^J>@DZOpI%&O`d&~3J~YCk3MSfxww82F1U%KKZXo%jLF-LQHv~msHfVg@ z#oZUpuma>k0C%cOo$d=-K$aa&3rNI*)!OcIz|~`?0=&w6*MRgyx>^HM)7EN@!dHVW zsq$n}(Y`9}hs~-1{E4XI@xzhosbC0veTjy{+WJ;71pa-AhVD$H^*6zG-3D-dQN^jY zYwP4-2>j3z4Lh`Tw_peiPYu<8vzO>=e{DU|d{uzQiCWSkMAso*8`Oa-WLhg8%$?eL zk))d|fb^3a4!~zJzTznuUkl7v9hfyNPl7{)d&(I2wE5}=;%k}oI52676ihHt=4j8vqU9IY!lh{G_Bf34Cp0hIL@pFizrX89Z%< z(OREpJyx}&Qx(Y1N0xIxxcXGG@p3mExn2`)lBrh?6y)_LTdo%c2~a&JXlm} z7%xhDwe{#=2;_^b#fAei_@fy%fV|G3IMsHY=uDP$y996(QA=xBFEWfj)}+7>EgiW^lfuV?`KnC{Jk#eiS8r0dIB2fX zq`(Q8(_E`b;jW;$c9X(=f!v@;;eL_hTF18ynyO$VRubcm^*~J19WWj$41z6WxMp%` z&lO|+kASwFJZABmKJdm(6c`|__qkADfH*RYmQJ~JGvfx3vst(H0=_LRH>yT8Df}ytqni{~($U9hj%iZZAdt&6DQptR zaZL)l1#*0oLM4#PHYv;qjE(?-gOxSud2UuyHwb9QDA_y_7n;Xkk+0;VU)F)+jS{0YI1SHu8RU|zT6%Y zc3l)0a;=0YFyvYZQTR|cAqq54E>8KLN#A#?pWL1a#8>&AIY&kpn{fm9icyCG-x5{4 z?7`QWW>^RQ)unonY@wLzlt3Z-*LkgJn6)%qPb%FWn0^-1(Isvo3;@?Z*3vKs- zCt%hv{^sQ86nxl{I2afV-MfdPJ&753Jpq?0aAQ$vcf{4ka4R#kSIl=9RReOZ%XclM zgM%XQP*KHWU>R)qMTJu)%TD}+xsdVx4h-PfCxxP0Xlfx&%ryCZgAEplHq_uo-I zZa4v-6qSDH9Q?3ql;&1#Qu?vjR1-{cUQ@12^a_!bo1}neYLn|JAZ?KP>MBUNiPuOwmIo(jympI+d8I_{s84|gHzKrn5P<~F^cMJ_$Cs72xlAkh;1nw84Rz*KTU#z75BI&LX1GhF$hX8S&UL($XFSr0bBoEv%aeFp!kI_D$ z8)(3NMWq8FzC?(xzgt#y;GX8I8<_PK9}MyJC-YSW?qj}sfLUMhQ2}2h<90+~)-XQu zu@vsMhz;Q3M%95wh$?OzbzZWX^Cu%MEP)(x`HCGHbRjS{p4Zc2|^zeLjm3IE0t zt^@gLYx-)u1r%7^j!xz!VBEJ9ttkWuFk}I$Kz4n1I}J!1q%BfyQmR;s^Z;oCuSn_E zpa`T5ydov8#JZy%@OEpY9v~I-wyJ=MxMp3{YJ3HbxDJEH7Rvk zcHKbg;uR@T9k)LNsfG(;$qW2J@(oEh83MPnI@IWg1C6Qx4>GDos?23>imWN?FIe^! zU`Q%DVs9p&3<{SNzK^nSmDS{Pli+((!Hz)XD}1yZoE049RR(4K8}rft{?4d6@b{w9 zUWjM^VQpQ_R{IU$zDCUi)#vQ&0A_Z1*M-P9I4iYBqW7aN zz6usUB*_(4xA+0h*EY9j13x3mCq-#tP{dtcwwp>FxSLT8AddWy)%HlNYlcOXM zT1XYhZ4=);s;!CGuwG;sry3hpiwxsb+m+(vkSdUy+Qq5HhV>%DIMvv&T4WffN-MS5 z7_ryVvHQ7619*nCeD;+3%r=@!wI$ieRO&!>Qn%*;aa6n?;A=heW!KS|6Wm+?B)QaA zwMmHx1(U`ua!WF9g$cxJY;x(~8PWB<*sxw;*uOM}OW6{8DAoNX3l0XPyvS4F!y!fre;+G;?NINO2K`!AK?Bmb6*8=G;#X@5J!IO%ESb|9yDKFz^q|>0pO1^ zAdDN~z+hN3!ehgFfnmW2j}4cyj(=9F|FAk%giLg(Tewc<+7EbJ=rJIV8T$c2>03e3 z{0iW{Vk&juNk%n*IPwFc%+~>CSOwm0R5y_1eD6~tLcz>+vV6=pUr}QXXw%)M(g5Bg z%C}5D_1LgpWEk)0v0=5yFy7G@E1!o$s=!B94d})cP#)kDG!#LI0uv%mor^?t}LBP!j zz`c!%rslkrdlJ6Ai5-uZxZCmV_N>W1GV!<0+oJ^mH^bJqpp}gUI|3zSf_?T_Q?ZZQ zZ)j~_1MWAX?J2zy6wR*yZm%`>-M0$M3EIQz+s2VV&9vz!$8S+hUD}X}^J)}SocZCB;kkk_VvgOdDnwdCKn=l`nEVu4`O-fIj z;Y{FjMm2Z~VW>}h@kiR99ql8!aSG&fSFS~YU3M9w0pxzO(*piWT7DL%#IuJk0&s7Q zPG@WN71&Jq+-P~#Na9>eq6WOks0Q%AjH)~$_-CVPB=vE-s!`iT$?$3&H)`@p@lr-! z0OfiWN1-ZF53ZpqJZ0f$#8xx%u{M;|7p(y*KpJ8*_ac>TCQoQj|DDvw->8+Fz=c~( z8I`QDY7+ylmAN%KkffH{7pbpnEmr~3221TLUuW8v7E6EerRp;%M<=HyVA>=7MhR8i zT#cOSkt)M2<-pr2{i5%ikOuzURdC!hlpKY3JUJ>~pLlpy7@jxTV5kD|?d~sf|H>Th z_kVFTkT~7uMg#EwxChCT_Hu8GARN9OWz`aRQnd?KwVl*IVF#@M53`Y11I{$60zA^F z+7|@-jj90OHmbIq_Wx~cQnD!_q|WqjHQ-UZKZe~jpZb_&L3@+rLt2%eEB3D}hYC3` z7rCwhl0(azg%==;?^zbJfd4Y83-6(ZT|lCYN@nGK&x<-|){4qFwB9UylV*VT%);(i2XYC!@bg^kbxeeA&dH~M%CBsnt$&cpX!i_r zUZF+i?Sr%*MsxB1b-GN;A5i3yDvPPnru8N>ObDV zw)HsQu5KX%JjSRR@Kd6E`jk!&ioml*DCWB?4q7MZN#?5uNSHKey-DfJpa{$cjn8_j zGMHnAbs#>MO(RTtf5Y82u`u{__ZRZD*g=l=FozZ32}X4TiRBuYaGwcUdEb57^q8qM zfX9uer@DbBi}Kw<=}V^A0P;;gw>AZ?KEb>5wv_f0>lA^#BNQoJ9u&*!@PyT&4kSh2 zrIfC>gzG@ud&PW&i{%-&u9JZH{J#|8YgUJDAd%dYZ_|lJ+9{V$c0<+fSgU0Xh`Bp5 z-l(njm{tY&W20)opBhyG{@keAOM-N&a}T6b-T44LdA9Xr?IJ;1-x=m>^CvaPP8P13 zPu+b+yS+*BA+1WgyoVgB`}@p&9r!DwYCs$n&llg6 z0S?@J0Sqsus{vm%_f_C}mS+vfdkWq7+*@0FOshMtV08XX>cnu4crRbZckC!y2vIv6 zrmF|=3s#qIAn%xTQvi?(xLF@~fYqf2{De{6z)<5_oM?0zgrq`^D{+l0v7=}b`o3xv z+UZcN!n+6$&5tOoNTXnO`;i>4WmWBp`@4%+47!4oWnO#t4|CK2et9`|jv2t~MfshB z(t|+}`27)zls43lJ>3!m_>fUEfX^A#0RCWkOC{e}RN!r^KpjX}zpqhR#oX6{MD~i5 z27@AyJc{?;dzHdf)*d}TnrgKBf-H$V71V&g73Ho#4<-}{S}_0e+P}KFssRr%ssSVk zw*%vQFRNpXYLBhA(M#1onldO{DJj=TaNF%0~Xu!l<#x>}; zNzs)X-qSeRymbSy^lRzy%f7o#6Y8#@4Wu#|ZK$6GZ6H-1m&|K9rX0F3nrlu|577K> zwi^}|dZGecH}nK>1EVUyNk-K^E;!$)3h+*&tfNDo(Ns27NnL0orjpOIb&-TjLk<@3 z3=3GfK#&pU#t4uc3NN{kMUQ1M3m6is;yu)`3M5Lwm6Da@GxWr){C;0xwPVySb;5^O z(W%*+8arEAJ-UE6Y+W}Ym!AbaAh}IQK7DKZ#AJA#Cd{ir8Tb!Tg%@K6)fvxO|1^OA z66GiS{LUX6)-n92`RWE{eZ^iW3UtW=8SP$@8QNDF4{WvHB|9gZYrRRcTzGog({P!)7T5J_% zkJUBicm_%RBv8P|jcUZcqgD9!%H-pgQKc?;M4a=e#$>52zV7qK1;TKUfH(9_v_NxInr_;;hafe*HM`{KFyei?j8T5h#? zwIGHC3&tD)}ydT}>C-=}@fhvm~RP2`kbl*qPptspd`&Ttv;H{#(Ev1KpV!rW6?KP`o9k{JU zoCVxR)R<)9{3e;*V%}%P0i(Nz1e{=PQ3diUO?Sr)-^W@GRp1R4Zblp~+OG&V(ZY2B z8|Hf^;XY+l7w{$vH!}_w-MGF>VfHge-EDHPi8+dP1sZ@f+#@|tZP+9Ode5`@4#bvP zxeF=4Oa<}vpVelTYBSMlQ@cj+>qb?8-!rNP{Jv2Y;E#-|JugTLxm^%=o;6ktc$ra^ zI|UyKRK8iZRO+9yey`+HZ=J=Fd`PRZjl3Qiywmdpc9{adBdx-7Lb8~uEJi2WG{H2k zn+)>qQ?-1B=x4@Asza|bLW=ArEA;8s5M5O85UXHUK7)eGarp$?a7@~x6g-&Y;bL*=Y7KM$UQ~j7Kd6;DD zJwvlpc*H6;14u)=T>?lmxOqHo-DrlMo(nj^z3uX>WW7nFnnXQP8sprS^qLsuW5gF6 zx?j+cp~alaZp!_Bt3#DUX|4iCdrA8Ov#J9xF{%L!zAO1b6kAoWy51ah0deFm%BqsV z-+VFOwCdM@-!`fX_?l5Q;4&fJDuP=Y)gAX@E$+oyNXH|R3XW#Rj%LP=q9f?_%9s4z zO!R=LOy05YuGn{1S(3y^*T&$lSvz$D2aKu#X)m`n2Ci#OR|9TnR5viROD)d5JI=j3 zpF4SmcB#hgQjL9AW8c-h?@OWvJ~Vc8D2{frnKD{bgJ0QBN$nmICq+lRMf1cMe+lJbSh2I8$i=7aCOq_KEUMOzEPa z2)uZNVp-7nW>^Q}(;qM?;m);vnXh@~s|v(A^;KMzx)dR$#A6%4935vjlM%95KiRd|$ zIEgAre9Rnm0}1O#B_$%eqYjYBuD5|9iS7?>i7t}(s3lPY5;jeut4WE-Zt4IM*&U;S zA&F>-aF`;^v53(kX^}SFY$^@l(?<0GpAqE;1f}De9|Iz1Bu}~mJ(rHF9JivXecG?_*Pv( z(w)8nR}lCO{bem9AssY~@ zRooKzdfp7{z<(Om4aApwf-m1)37$yBRT}tj^V9>(c+#Uq8Hek7JXX?;M&L4Ra_yWj5{ngtQHx@UD2jUt69VbaCMR?Of@#F7a7K>#)j1*!#LG;M$S|&BzuevwA_8w-V#EP$y*n5J?^&YZVr_jm z7y=*p4-M-@hH)J^80dOJ;tm181GLSpn}G+4Dn7)mr>z@E7Cn8#w$03WWe35jff6#o zg5+9LX#j6Ass_A6l+TjVgFzAa@CZc}Oc1nRj5|XH-fEQn(w;DB(0Y^713?j(4I1~y zmt}Cf8TR1op+EtDXjHVS8`P%t!td9Cyz0iSh=H3+%QqP%-ihiIft@216~hEU+bw7v z$m@IDXaW+(HyNc}%(ff2rzro;cNMak#O=7Yw0LuXJBcR%-?MZSkN|G$>=$d(^7bRq25>#2YQPOd z`J^aq9u$E)k5J5KzpS>dZ-(9Y+9^CvDF5WGjQT}-78tQyq~B(fg> zl#U3BKq7lZN+FMEq>#rl=Bo;<7*zuj*$)6phX+L&X?U$0r+ukb0Y=#2~lZ<3(l0aRVU_&n-_pt!}tJ3 z5-gb9Sw4_em^+jLv%ca}pbh1WWt=;n12J4Norxxm@}J?_VRG~U1unLbtAeSR^%6G@ zU9$ntlT~pWEz;Jj&9}V;^`{xbxLzzbo-)G*a9thviX&n;(TBx0PZEKxcxBHdlZs%c!057!d`euhzGoMiSfvs5s=0M zV_6WdUrt{S@qquWu5m8~>ICy@F855$z(NYITOSfo&XOc{Z||pEXjU~KQQYsdZ(B%# zD6PkMD1?wv*T*64U7EOb{s)Tu_ZL(tnlNJjUHKMs{_ijHe_Mh7Xo7fNjfc~;Bf%?M zo6Q1phUA_~U1%Sq+$reI7d&4wb(e3&lv7j_RP!b=6O(y~KfG+SUK8>M+UTB>TG*sO zE00fmah%hJpwq^u4`ihqESLaQf5>t@Edk@iwe7TV6!`9)d;RbI3&&AT;XrRhGjU$CbkA}u2J2<(?k_dQTX~t z$P>7S`I-UD`ij>(_*%&ftH4hgRRd;y#p{CDR~NprhVdoeMT+#aMQi}yHL3>ur>Nq_ z!PjeMSO;be8NHtt)hu`N&e3@|1*IPn*Rk0 zn-qQ$^p+;%QgkmW8_V-V_ZFxt#xDQ9`&*|88HPvn@DcW#%HF+gZ~{1(Me7Ad8AnC8 z^8mk~ZGK!+3Kv?J!dJb>SKU4$9ehRAA+K=$R0WcWABdE~lB){Dy;sB|^1}ibOS)6k z8w4?Q6xv8C#7VGQ;my&u&q)?6`X*@;)=mX@iCN76Ql-_CW#8{`yRTaXbbP4wD$VWI zaStl9Ib_LFRIY;HG~D$nu-)R-fE$VO9ZhM6pa|S?grW*2I)xY)E-3JHZE`2lz_Ud8 zpemT?6xv_X9npbj8r1{L`ihSa_&UT4tH93~Wgkn(`ihT~hsxj-GmP4Pkv3g#Dh(hP z+1-T*;09U>_-3HAy)6(5zr7Wo8x!reI;H(lvuXgVM%95`qKZd2tKB(f*Z^`j!wnPQMI(Gsy2)(2fj5s(%vXS*r$(V1ZIQAR)JZ=xV=_YcdsGIQD;+? zH<#Q}avRC*C3lnTlzdm2|BD)EW!^c)EA&e8Iq0iZUMwj$Cfa2`O_I;(U8?f3vRhG- z&%p7uIddd1TXv^N&X+txGOs^Ye#_$I_193nnd;hAo+O#qFVow!M1OhZL;bc?c{fS! zCCpX%F3E!a+>6klE+9M zCz-dWo#@|JSMVAut>h)Yv*MRqhp+AV`I0=vNIQ3{oj)TMl+*4eZ|A&>|c9OeE?jgCiWZC{i{11v(X8(fne_8Ss$-KX_w14x)&L>p4q$vY%}QKAq3du`uY3yK9SEOG&UGtm?8OSUcV%TpzD>dCXx zdnu>Ch4i2PdD;_9nZz(^Wj$3^RjzI^7Rt` z+o@f9Bze^A7?o#Bo+_D-huth~=P4}g=8He8#Gdo;bG7|C$s0=aeGg@=D2DCGVGfSTbMVH^i^1^VfAGH;~*|vO{uE>(Zf;_34_@EAz9nw(l;P z&u1O2Yd~{H)~pk{3x{A~_^EESdM$t98{&l5a~+*7|6QB4x22wh2%k!Rmon-<0bR{ZWsToR9NzpW{`uO#o*`MJvNtNVyINao`|P~vZ6+3#B7|HnE1(@OmR`u}JD z)PK*C{C3d#>r$-T2T4(Gmd52_P zA3g2}p~sc|y#DzjE|mPd<0H$9nBz9e)=|a$Q|+OjLCJcX=I0d8%ULlH)D< zzn9%w()%ENK6BSAyX%(Hei_wsyyS9{Qzco?a=+;*@%-Y(Dk^Y^+T&8mUrYX0GOy1v zjpYLOMcBQzl)*N6LzTZF2a6>imfTeF`X%>Nd(ggbsGN7peFv^)7aH7-;%p~G&nshG_qJ0v?L_m-R{*&~@3`zlVCWL>hmBtGX~Cu%$AVSGmX zHZ=(6nfwIi7WHF3J|7C)NB#Lx$*)T8to@a5^yTf>)Amgyx0J*#uYa6~`I3E-cS`2P z7}b;gn)B5oX&=>h9|l6s!577IzwZi_pOs|)xmxvoRFZiu=PubEw#^rx5TZz8=Zk{oC9PfYAV`{ok7MSfqF{F~%B z)jy}6a6a0hb~sh?0?F4T-;~VTbH4Z!`5%(xeDP(KUoDA$Ye}3@CGG#;N?=XZf12b# zNqbx(edd`5RpvUzD=Kqemxn;Mk-sTwzvCpOZsNV1{Rin!m7l64KdvbAf4cJMlRQWA zQb|ih;3D~DfBKTjw@T*qIgR7=M9azKL@CaeWInh+<;9YD(XPB0$D65qf#N?Z`IIE< z8$Lpu_s4ajiu^F|UZQf|U*4W!OFa*i!nu<9@$nV$*Gevyd_yuXW{LPu{SD?Fsm!xO z=c;|4ki1{}&woj>zvbQJk2`0ooftn?s(g*)b&^ApiTvNWl<~A|Pqt7ZeUi836I1zF z`DH$srVg4zN9F9E6FyIPoyGy{PSy|XKOJgU{2*759oI!yQTZsz z53)a2dY_cc|EPgD$N}XsEZM1kn@<0sC|Rceu@e2C%kQrwe<%4z$(;Knk)M1X$Cvmo z)1OtM&m-28w0(0)KJ=W=r(NTBs^oZ$OTNgN*XP5tr%3M%Nj@=~*S}WVZ;-r2lJB18 z^%p1)){p0_e3@ikpXZ5o(f+f$LGgV&|^Ps#Ts$Cv2m^(IQMO>(j% zaUWIrUCGsTU33Fo7o8+IO){5Wa#+sa#{Z!`{x_5V?Id?7iFf?+K7$h_FO(dwxcU4p zke@3hua;a~;-B>k=kq)!Ggpr1Yd(EcG9T|k5f@8-LGt&K*sZ1cP_&8B@;g?N>l`yx z#_q@xd*=5?wEahttaB`o0QVh!Gr<$jNb(ufy#DF(cbDYdlEi&V`~7cA_J8h+a=f`s zdVJ74AMb~nmsild$a&io*;OR3m+Y6s??laC`%C8iAN2wDdHu1PN5)I8B)MA2{K7b5 zox}B$ljWH6il5~Jsobsn68WDa`DDp_!xxD=)Q{X>nj(Gf6Y)IKt>Sr(D4)jbiuaD> zfc)a`gY1W-KT&boBv+Hn$J`DuH}9VB;>%R0Y}-=XsVNHVX!pmN@x^OHXHGtXu6CHB02nI2yQ&+G4{{dphBk4k=3vQzstUtrGL zqj$6PnNMC+`EAMfBoq1TD48$H{PB6`|J2`Giu0c2za__%%s1`gCrfT7xoe63Kg8$P zX$NW@b*SVylKJ-Q6tTDDR7tKkOw)dFb;*+te<7I{!y^7A`ESYmdT65Zxa`Nd7kA9D(B-@Mda&qNM2Fp z?@Ioco3|24^PO7^IO zj+5jo^LcyDBmbazO^qkk{OQn1^v|r~zd`L5|&&L>fZl%A?Yw)~EUY~Dl-LSIX z!Uw+E^xVW0Nxq53XS?_aS>9j%t2~2RXz<~qy#DVQ(0YzxisUYmd41Lm&uU;kFS(7z zS+C@cl6m`N>r+lYdEVhiI5}^wm&bu-e{$Z@TOT|7)UA&=_4t#H+UoeDl2+-s!%sOb z+4`u{XFE$T=gsw7K7I7uQ;z@S>=A`oZrj|WPdYp`5Snw+ykzU+XCLqWop^7=>}98l-tvz0HBJ?)>otay?i z%3U>UH%kvL%h_-FS8tEJDfg6PzWw@h_Jex-8acV<vhS6BYopWQuN@%yYbVpO zOZ?s$zW%*4eEpdiXm{$*IC{?6j)*@?_OrZwzuTVu!yfs2w=rv<^m_ZG*V|9fY6BnG zAz#hePdLHbPdGvL7)oLX{e}Z6NB!Gn-zNKEDk_6^NyOU@r1^J1NMiq?9G~i@f5`VU zxV1t5?4tNwMQ0m!lvi{_o=dmgeyXqkJ=~s^L0)&A68o74_~q>5R}jg|y#16C`z?mN z{o1!I**<+|Na{1+e*2#1XVe!ppW}u2$USAxcI1@zz5V7qzNQV>p|^jDeU}Da`%Y+j znYT|Dp^TlZ=G;B~z@45m$Q4_4_dS)hPLjd>ynUZelP0;%-*^8remQ=n^K()BiY{mV zO~-${=i|c{$uTZF)-l=bW89>``eYjW;*R~vIGaJUZl@!O#4DH%?`Gn))NZuXXINoJ8jB!U4j$awt`B^F9 zxHOV)OE~U~YLGaJSvYbMOE z8QRrrt%P}VB+s?lESrwk{Hn-rACsi3>G*Fd+%P8Da3rCU z8?_Oi?k8iDH`3{O#9w+da8weve_GSg1>+}O-=}>0w??>0_7dNl;}3THs7!mZzaG=# zLSL z(zk=A^=(TV*8M%=Me@fI{l7>*Nf#3CZ==?~N%Ed6rv1{d_UHIK*7avm`>a^Pr+1Un zeCFtJXr7W!fAv`8XR8u^_Y!`Z{4Z+v`KRM7{hL{$e@qFVp1>C6GrxpSpE^(LHK@l2 zdwkgB^CkM1m+;LJK7C3y_20Xjuh%W|pFZ7Rl;?fu@8R`Nlz#g3e>$IZYF#_3&2RX1 ziJu|)Y1_;D;i~JaCHn73zkgq^Kf#M+v|E&<<7cmQ;JLr_8b$h-z9p$O4~S`IBzueRz1R~6`D!KU(|bjE)}`NZnb)5!{o@>;_TwV;BkS>l#7xJ3VP=@00(9mngJ#V;1`y0!I}KHZ-B zAI$NS#Si89PVvc?eYwT2SEb*k&l_AV{n5^0THgWjJBv?$&7JbY;x)Y{dx`J3*4LNzKh*JQp8bm3 zE>&On^u=#4{@>y|uJ`&s z6~B&KXr=W{nx6lv_-(}xh^JrDrznf|qeGWxDtQ@!GwUptmEkbnIAphW+%52oNPD@4g8sm0^QSLgxaKkN}GJh+#`1rgsRVnhb zeoH?-A5Y&pHY$nF_qUUNo7RDZ-m}HW=lc!Euj1;}zm>07yA0B|iKTq6?h~vc{&ew+ zPWAe3dTIS#CVoK2-^aw?Aigg>@o|5wAJVr=;8UtCkv@%>#vQt1r2d;F`s19#RDW0l z8UO3U>&#xKsmT`N=lsz}-BrQUr)*L`73~-9@X`7^Kz!%dd_K>J?-4(6yXU$6F-TPVUSFa=&K)Y!_F1gQ6dBd)ws<9x5j#o0@&lhI?fHok{gb5MzqQwQ z%azvO0{rN_ay9XbO8nd={q|fxK2)NgzV$7wSMT%QF~`k6h@W%($o&5;zE6(}Qm<9r z1*6nYyVhwu#ki690k^lNf9Lx!Nr(7O?H6v(Z2j%u;#J6qVY2uSh$*;rMphX2l9_2WgETJr1VjLb9gg zIXBGer*CCxwWs=pb;z#bhtC;V-!Ab(3p~&GJfg*CJ$rnH^cQRYog|eD#CPa^>L%i^ zEb()P^!u*zai>auvG_J!H+WF|p!hkOKe-b6lK6f--bH)9DL#4CJGfPT-f!_LWJLNa zh@$;{#}@C-Bi8hJy4}3>w~zRa2RzSw-X*^BhS$4Z`iF~e(>N#3dEy6tG$U5hwqB-&~>W4y}RU5@xwYUxWhr~@Au;Sa^vA0@fEcv^T|XvA*bW2qJGCu z`gWd_@6>gJ+48@u_&KUC``1C@7w3+fhl?ND!Y7XYr^GMPy73g%>$5Fh!7}1X=_g~o z;zinaV~PHEq~9^<^?9oJQT#mOc^&qWXT=YF%R6RW`Ummt?|7c4<^Cpq(MI0S70PEt zccPcJ+hA_|Z|3--{d(7yzKk=XOMVu8*!$;K`$voK(>j^4eX95l9WNM%7nS(G4nH@0 z|MdIa;uoubZ&Xf?iEn@0>+^Q*--_?}>_|WV6yJHS=eYxsKE;-{Pun)0|D`6T^~HDO z_V%G-{KJ?>NC4TOc{;isZExz+RUY~LM za*6-Rx2M!GkBT4ozK^@TVmv3lPwSkm#lJ2-In3*)*IU!SQLcii z|GwP(yoUHr9WUHrqV?Ayevyuk+;QAP{IHG}Uy=UDTf7Pxak%schCF$!ww)k;DA!*L z#80ef& z|3C@bKO2nnkD*oN`Lt4K2NT{JyN3owDbp$_xj}d zCVq0`e>vx{wV$5p^*^RuHxj=%r@y`U{@i)WH1WyP-p?HQIavIl&c_cIe`1TzG>qWq zOZacePv8G|{|89_Ve$PsAODj0^zF)Nz53N|Tz`8-e5ckMw9h-}f6n`dAMY-`6^*wo zO8E3G$7$Tb@A^c>wR?G>`1U{hGVA{tC4NrB&#^wAA#avkAikn{9VkA13wBYScS?WG zo!-wm(*K_L;iFYwFOpxB_<2S86 z@4S;f`Kp)b&z62=$mesu^wYN;rv0+$Jx}N~Ah}e0qV?F-(!W{!@UOie_KSza4`_Y0 zt@Ixk-#^Oh*R+8!~hSINc6ph2@q+hwo>-Q_4w@UQK zyA$)YzY>i%e71{k>-T={k)J(Vyb2jnE8&lopU&L*??Um3=9wMk>+%vm50vna$zTYU0c@Bbh#l8wa=W-AMIbS ziSN|<;UMXcae>nD)1JGovWoaQI^MYv*81CAe4CC_wDWf2D_Xa|DEZ181 zo~QlKYw_7kJifJr|Ec^W&v`x8Cr_2=4@-a14L&Z{E5^DD3q|d)S&Mh)%TIg#`ATia z68-(9-#*|KH_`ksOZF3eU67`6&9@(OI_~ihl0C!`v26 z5<#Bl`1VjV^d6E^nk)~}zBZ!JHo!%y;Yua(Ud@pIJg9A`UQe8#ch^b-C={LJd_CjNHuy}9c@i(9;uGU5-?Uwn%9!+tSpl5dB>l|An+3$*^) z#P@0*CKXN#rJC* zvOi966C-0%skFp;E#B?#Z+LcBZTztKIjR@OyJ_N+&-s9JrGIFN|Jl;-+tusuCH=F+ zx9NCsrT8z3?|st~+C7r5miWK7gny!h|F`^C)Xp0z?kbyT9KPa-{l&M7AJFxae(^iC zcoj0@0Q9x)9j$G%#1B2|i4A>oBqx>lIY;`7HUDtjze0TfFTH~=%KukO{QRJVe^Gvh z_xFBi=Xb@oYoRw@{#SPsc)Bhf(0cV=@gHvSDr7{r^edXrkJ7diO7zbu;jfmTfmgkQ zvGQ}P_&N9a{2AN#mG~Kye!q^tKa-yq#kc47uRn`lG{^h@kn~4w=G&oD$K_?juPMI& zFP_+5{3hb($p3!gcfrpQ-v4{zKaL-*t9KB8Op8|`BhJKsZr=L>{wI6?-;>Q(OZ?m; z{dOG(_mKYM_|bS6BmNcfgSoixmH1zIN_zigt)xxQYf*(Y9N!vOnosE8&BgcXIz0Wm zllaBA`g*zH+WM=A@6&#b{^97$|Dn=ffWFRC=$EU+5BGWhtgr5D@iNYcUrT?^6tB;C z7#82I_MzRzxq(D(88^wgEq-E>=mL*BT(PKQ7Cw`9f zPnQ4F#4px3pDO-B@dJ9^;CS&@iSO0?#yt7e7B8iYxVMCVPJSvU`gYq~6&n^msO$Mk zHyO8ial5Tw!f)5&CnoLcU(T=h7eD7JAD4CYG2%Ne_k3M-I8Xc{tv47y*NAU>%PY2N zqQ66Yr>>{Xl%EI1531eh$H&F@YJJ7}^J(2E52k>;6Y#dnHtf7=tR11pYi?Z3I_1AFkV^IXmgPQZ_@_qw!Oe+yf@3K?-# z3I8qmsT}O<`$O40QlkH~^oKMLe_8skh#&Zs_oMDf{^|JiI%K{oTdS(RpZ}_%89uB=3jo{D+Aj)cWcg?ZC&jco}EJ`HoNX?AP!2 zJGJe0`DuIE6XV6-C%%$95B+6{{})U6cS`tWxAN^%(GI%0;;torv5t?de?HXWrIZnS zO20$*7nsMY_|bS?PBzDiujKACeg^&feLK5uZT(#+zE9(yuOMC}epvGZ`(r=;l|TE% z-SAg>|L*c#>u)jswSZ#2{crI@@-spDzZaiq-Svw2x5W46&hM7rx_I8(w8gvUj#l^i z;D2ZFz5lDRYmK$zy2=ATilTr>8v$w~g-ZkykK#Jlc5FmjIdPLVshxzxrAmJ=o_o%m zdr$71Gt-$l_xdJOxJCI_jS zgv8_f)??3}GjpK+;WM*l&E9LT_gZ_ObIl$xto(au!#GbH{w<4}KVbMjy8-`WhJV)T zdUJotZ#(=|rRTVQB)@C$OIBBI+4wIT{HpbJf6m~4C2+fmKECGowy!<4XRjOlhV@0w zZ6)9FHr3CqHz^_CZuH!3@Jl9_@3nD`2|Sw6E+5|j-`M~^*Z}_pfn#6qmz0nX+xRa! z{HqFgJ^zBik6ZqLTlx1lxL`ed{Tqt!dialmZ%EO{f7v)UKB4&M?AiCA5O!US(32n8 z06z!#R*Y!Z?-zX3k2iJv!r;3b#(CE8&su-!vxfgMgKvFW$8o#+jKPza6mI67eBR(M z{Jz4iOiKR3;8(w*1HVrnCx0z)n=JbHx{v<>MYM7{`EP@twfz*Yi|@Qw_3HZ9brAm< zm3s`n^`egBe(dc6k0!Ls$2Y*I8{i+>0RI(%V}H={mX(eFxefR)8~#=6zxlde+kpT2 z2KepUpjNcmm<8Rh+K5F>S8T`sE z1-xSLUv{|Vw{BmbF?eEm*Ga?w6M@@J^znBa;QwmlZ2hw$KWgv%r@_x!-tPYG_7kc< zcbHv&r{VvQz@rK6@|}i%{mTltXz=$M{OlhqA3T2jjKQxyrSPW=zcTo(wfysn!Eac9 z=2M3Myuj@y`gqCkw_a7Ch0o-V4F339{`qGc#`&V*U$MCGKAYno41Vj2NOG{ks2Y41V4E7#?ST-r!en>Z~ru=MBDP z`Izh5RfFI0Z;J16=XV4iQ?A!vHvGi$^CLrf-Qd@(;dj;Gx1CbGN~~^jKX4b|TZR*V zoHG1t4=Q8+(CqP?!LOU%*7nk42ETES;-k!$e>*;o&FgyjA%j=e=(4mX`3=CC$KG7a zWB=6g&2Kp0zGU#@Cw1PRvUzVA{Dogt_%jCoAA=_bf6m}bG>8^HU$uL?XO&@TVo@T)&iz{KEhIIaA-WdYXbz02S)n4k1t3IAb(-~4f< z=Yoy%4ufB{eA4~l1;@8~!R4D8{J7bR`|YO4M(+~C)qSNIi!zbJ4UH2U~U!@ut->{J8bo-Ov23!IOIx-{t-_gI}{e@Y6okq;8vbHJcrqBx(A{xhK-| z4?lS^O_OO}=ezT!&Fi#Xq?4jt;@4kCKxsNH)7_%n$%=H^mUWY6tIG*~J+>5z{n#=DSy;ff1)BqtnjJo+M=@pzm2PFJ2r3X?3j*$ zUm7lQz9koFo#T!CvJ5Z3@S9dxOu8&5MV{5*cXed*&E`d(w)m0VW`^}m%4G}YHpz5e z0|Ea-mU*^ZRmr(0-+%Gkdybt1F@Q`aLROJaS6mT8hO9C$^onMY9dxx9PGixsGssQZK8vrGl5JAHinzHqzZ?P*Z4oYwi|0PinL{Pr>^YOua+Iwfl-5G2IZlm&j|*%`p+IrIxE zDq_}qt|!&Y^dPGn83rI{#BRRK>-hv)&#}{Nc_bKRMNT*6vRv+vvAERFsxB!#el#Mz zX1=@33Qk++i}D~(o1^6<1++=pJ@OY%#LUvevfj_ZS%Jc2xVXt4Xv#TPzT|yg*JV8^ zr=pHfXQczyvskq`)`H&RESJ}A!?;{?>KNS(3yik49^Gy_wyjNCfIh(}`5DG>{Am(y_IDsNSew!$DW!(6D z@VYW*gwoZL>YDbsZLA#fOCO9ZWAh+GQUrH|6!AzS+JoRg5>;u}6~mrwn8hh|#VJL# zqq{Jj!CYPA+jX4!kn}+74N31itoefOahe@L1!$|M&zw1xw16TM;Q@cWT^!wFk51H@v$9U}%Q+l- zo#&~j4!p@6%GYQ-j)JfZAd%fo-wd7)-1x<9X2>fv^0g&?wI0MXjH*E=Raq1oy?BLZ z@K9-fz~8Rt6@HqYmxmcVOo^w{#{T!kBhz^3iTf`+m_GREyO8&266DvwPWRxeiabf* z_0*&HUwHT&FfLv==h*K)|JVcfpHClq=%FVcyqI3R|AF%lrb4PjHbyyQ5K{z30dhDR zLpGIL@&~L(NM20aqY7?1S3GsH!kd6-{!48ML`>w37V=>p18q5b_TA?ne&AfXee6W{ zQsj4`+&O{<#)ez(khhPW>d-|s17|2^O+OHa1WEWlo7YXCGo@NA@y7_{IW-UpP^Flq z10WZfBVSR7hfF9;jVNe%1@j1{gMk!(Er642rnAWQ*GFG;V?oB?V_QzjLT07r4Od6b zOB_SIT7bAAhLDat7hYfwF{4RBBoMnFz7SN?B*P{9I|#Lltl1yFBx*qg4;<1&3xAwJ zcmeaBAU+_i9KMSQ(!CN4Mv{|HU=v4SzG+Sa9==j7@&%JPGSdKh^E#{M!Te-U=U!3?Ih91>GDq8h?z*9LQM{KFH%5vcck zIl{M&*`#08RA>?IK|s@#Ii@7yqr3xO+j4&2$s~RF;sq?!D;bzFOPh<#wq?Kx$-_9b z+2Il@j1#dGE1KrBY*oPHERi9FN=J z;!;(+WlT_1!XhI6i6bP2gPiR$!UMVSi~TpiXN|_9YJsAy9IhG-GdVr zt5?hU<#d4(Ynx?NgYdrht+-RA*aEA{*L6%xJXoNz1-Z87QF1#+t7bVt!f45r48}-4 zjd_sf@<)NlTOvsL&o!h?RiGy`N1sOoBDtQX4>CIGaPMNtE7R(3>C8JEL8QwRt$R$* zL;IzLZ}2`sOI_kG7?HYA>8pM~vm|+y)C9y-xuz-I3^4&E7}0++RHi6Af_2tzlF6v< zT}*Td2pd#$9ONwuQ8_w^QO^o&$*S<@q?)}IBGKWR>5(>-Hv4SIRT?3qv;Rnc&3>LP z%@@t9X0^ixNrWSkcb~;_UM7&1039aV0!Rgd%?LWOifzU7l&^gzsTZRQnzv;pxULzg zx?O<Bo7Ur-OFXbstfWTnfD5M_j<6h;xhBj zzU1*vb-0>O*VWFI)wCI|v7XX7_TMJ!;1O08jU7!G3p{A5jIu^J;w9An94U-XBeo=7 z3yqhyF4xk56hQ~h3^8;+on`Z)qvB*>D{76{!(w4rR)87V%ENkh|h|Qg4PU29D0q z1Wh25QKxi6XN~YQBC7+G{Aj$RV30W^?4aXV7x*J|yV;znktoin6v?7ae`2wcX1uyV zu5CTz%49|pGD64_MNu+q>(vq!$cQ`d>tW>oYzX#ulih{zY)zY>hy4W!@ZW;1t?SV+KKb4t%edKA3DDtxh8`Np-L`_@=DR9MBZqZML`%*3@12 zQSRqUmX~db-sP@IMdCGmh6)Lr!Ps?EtHDMpTK3&qM}3ia8V;|XMMk07O;$CV7jiG$ zq_lNwldX#WsMM2nxpPcy)u2Pe;3sPkzq-h4>_RHRaDSp1+O9z~4=Ijuxf62dD6~)G z24#w(ZOTBf6mX$&mZsFr>WC?ANBaqGQ0v}72PB)2USq?zJ%TIfKj0!n6@$70#g-DK zPE5KrXJHZ>ITNMTGHys9ln0-*B2T4sVzCUo5{g1Y)&G=x$B zm|+#J)u7z2GIVEzqLBO8wg@*!xG6?PMdgdBU=;3nTwzw1TFI$KsN85IB4Sf~ z479r*lRNjoK9c;gX@8CD!|pTc_;ycxC?7yC&CVGR8}#}nYg*y2N4tQwG_;+0!lRqg z0vl@dkrLgdF7cutu;OSTHVjdz+hL_Y;-m|rF-Ze#@ zSIM*(sq~x)?%<>qNV@v6jD$gTceRZeYjVJoT3TNH_h~d-U>_Qd>O%98drS8)>-)^C zqT}Rgwd}Pqf)R?I^!7BuHikwpZ!eJ$FIpv#OnDpt$G1|qO7eTYTlD-{&& zXz=`FtTm?YV%K4(RPdE5%_q}zr$NTVM6S~hNL&Lqsg%APx=f-k47)V~?|QEp@ahnO zbsg@!S5IWScgbRfv#(LU$)qK@vkZ0ft&#z8=aAR!iBc&JA^HofJI>7SnpH){vs9^MPCkQ%G}ai(E$SQ- z3%MhWauF;e%|E!xbi2)Vp5-~6ie~m)gi#&huB!|(#i)LyS$Da-?BxX^A#)pP^opnJ zRW|~GZg&koF%ByEbhw!p(V;O-&SX_%NvE4y7rwn|%1>FdD2wcua9mcyfw8n5)YwBo zS^n#%iDZbVA|)G{^Pv_*8qmxS;@}0V*3l8`K0>C{7|vpcGELBW#);oPt}mS% ziTx+(BM0dd_FaK<1vqa-i_46j0)2|nezOoC*Xbf$<8rUrBM<7?w?@4m2Sva)cBp&iZ!cD0ZDoV}cu9dNBG02#M@{7>)LCH%R17DiS0p*BTaij3*?b*5U#N zOG0mR1?(;mOLJ!QP>p0~;uYKz$C**&#p6m$NRh8S#V5ShQb75(3D0-%OBv-N-8lk7 zgtowViJSs*!Fds*?2Su1vSEg=KlPOhQ2O2Rf?dcI?F%d+>oV*TshXR<%2N}ldZeh1 z?CV-Moq+-hCmH(0P|fW84!%U>!bdFGf!0ZQa9O&8?&w-CdCXIVWKGu6^C=hu?C3_& zX13g88Wd*Xk?29!pVOz19KL_%LbsS`3HfkYkdHCKm(UeFaur4r;|0?H*&LJA$c}n= zPZ{5Dy3woSMEd27XLaOzJVVO5Mqkox;>!3^-bq9nzGbN*CDy50$U<2w58si9ZgPqG z`Z8Cqqvb4;C#xlHtxVI_N1xYg3}CXF4;6^@i*;T;K{8PJu9ZmMF64^_g(aZ@H3ZcQGh6@xL-)I2ix{ literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/CHANGES b/rubbos/app/httpd-2.0.64/srclib/apr/CHANGES new file mode 100644 index 00000000..96e7b4e2 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/CHANGES @@ -0,0 +1,1909 @@ + -*- coding: utf-8 -*- +Changes with APR 0.9.19 + + *) SECURITY: CVE-2009-2412 (cve.mitre.org) + Fix overflow in pools and rmm, where size alignment was taking place. + [Matt Lewis , Sander Striker, William Rowe] + + *) Improve platform detection by updating config.guess and config.sub. + [Rainer Jung] + +Changes with APR 0.9.18 + + *) z/OS: return standard apr_status_t codes from apr_dso_load() + and apr_dso_sym(). [David Jones ] + + *) Fix apr_tokenize_to_argv parsing. PR 46128 + [Edward Rudd ] + +Changes with APR 0.9.17 + + *) Fix DSO-related crash on z/OS caused by incorrect memory + allocation. [David Jones ] + + *) Define apr_ino_t in such a way that it doesn't change definition + based on the library consumer's -D'efines to the filesystem. + [Lucian Adrian Grijincu ] + + *) Cause apr_file_dup2() on Win32 to update the MSVCRT psuedo-stdio + handles for fd-based and FILE * based I/O. [William Rowe] + + *) Revert Win32 to the 0.9.14 behavior of apr_proc_create() for any + of the three stdio streams which are not initialized, through either + apr_procattr_io_set() or apr_procattr_child_XXX_set(), when given a + procattr_t with one or two streams which were initialized through + apr_procattr_child_XXX_set(). Once again, these do not inherit the + parent process stdio stream to WIN32 child processes (passing + INVALID_HANDLE_VALUE instead) as on Unix. Note APR 1.3.0 adopts + the Unix behavior of inheriting any uninitialized streams as the + parent's corresponding stdio stream, in such cases. [William Rowe] + +Changes with APR 0.9.16 + + *) Win32 apr_file_read: Correctly handle completion-based read-to-EOF. + [Steven Naim ] + + *) Fixed Win32 regression of StdOutput inheritance in apr_proc_create. + [William Rowe] + +Changes with APR 0.9.15 + + *) Solve WinNT inherited pipe leaks by mutexing apr_proc_create calls, + on WinNT (not WinCE, nor 9x) so that we toggle the inherited state + of the stdin/out/err pipes. All other file handles are treated as + not-inherited until apr_file_dup2'ed a std handle of this process, + or while they are used by apr_proc_create. [William Rowe] + + *) Define the Mac OS/X filesystem_encoding as utf-8 (in previous + releases the interpretation would vary). [Branko Čibej] + + *) Fix day of year (tm_day) calculation for July. The bug only affects + Windows builds. PR 42953. [Davi Arnaut] + +Changes with APR 0.9.14 + + *) Register a cleanup only if APR_FILE_NOCLEANUP was not flagged in + apr_file_mktemp. [Brian J. France ] + + *) Numerous build fixes for non-GCC builds and GCC builds on Win32, + as well as WinCE builds. [Davi Arnaut , + Curt Arnold , John Mark Vandenberg, + Kouhei Sutou , William Rowe] + + *) Discard file buffers when running cleanups for exec. + PR 41119. [Davi Arnaut , Bojan Smojver] + + *) Improve thread safety of assorted file_io functions. + PR 42400. [Davi Arnaut ] + + *) Fix file pointer position calculation in apr_file_writev() on + buffered file. PR 40963. [Davi Arnaut ] + +Changes with APR 0.9.13 + + *) Fix detection of pthread cross-process robust mutexes. + PR 39833. [Tsuyoshi SASAMOTO ] + + *) Correctly retrieve 'empty' environment values with apr_env_get + on Win32 (e.g. "VAR="), and added validation to testall suite. + PR 40764. [Issac Goldstand ] + + *) Portably check for EEXIST in mktemp code. PR 40818 + [Kenneth Golomb ] + + *) Fix apr_atomic_cas on platforms with 64 bit longs. + [Philip Martin ] + + *) Provide folding in autogenerated .manifest files for Win32 builders + using VisualStudio 2005 [William Rowe] + +Changes with APR 0.9.12 + + *) Netware - add missing apu_version.c parsing for apu_version_string() + to the Netware specific builds. Unix platforms supporte this API + since 0.9.1. [Brad Nicholes] + +Changes with APR 0.9.11 + + *) Synced get-version.sh to trunk to correctly retrieve 2 digit subversion, + which broke the 0.9.10 candidate. [William Rowe] + + *) Fixed 'make check' target to avoid invoking sub-programs of testshm, + testshmconsumer and testshmproducer. [William Rowe] + + *) Permit Win32 to seek to the point 2^32-1, by checking that result + against the actual error and continuing on success. [William Rowe] + +Changes with APR 0.9.10 + + *) Minor bug fixes to address various platform build and run time issues. + + *) Permit 'make check' binaries to run on Darwin by omitting -no-install + flag [William Rowe, Joe Orton] + +Changes with APR 0.9.9 + + *) Prevent detection of robust mutex support with glibc 2.4, + fixing APR_LOCK_PROC_PTHREAD locks. PR 38442. [Joe Orton] + + *) Fix apr_strerror() with glibc 2.4. [Joe Orton] + + *) Install mkdir.sh, make_exports.awk, make_var_export.awk to the APR + installbuilddir, and provide working accessor variables in + apr_rules.mk. + [Max Bowsher] + + *) Fix seeks with files opened in xthread mode for append on win32. + [M Joonas Pihlaja , Garrett Rooney] + + *) Keep testpipe.c from hanging on win32. [Garrett Rooney] + + *) Cause apr_file_write_full on win32 to consider the timeout value set by + apr_file_pipe_timeout_set. PR 30182 + [] + + *) Fix assertion from double close of a handle with a rwlock on win32. + [Evgueni Brevnov ] + + *) Fix EOF handling for unbuffered reads on win32. + [Konstantin Sharenkov ] + + *) Documented that apr_stat and apr_dir_read can return APR_INCOMPLETE, + and how to determine which parts of the resulting apr_finfo_t can be + used in such a case. + [Garrett Rooney] + + *) Fix passing "" as an argument to the program started by apr_proc_create + on Win32. + [Philip Martin + + *) Fix warning when compiling on FreeBSD by correcting the type of + the final argument passed to sysctlbyname. [Garrett Rooney] + +Changes with APR 0.9.7 + + *) Fix crash in apr_dir_make_recursive() for relative path + when the working directory has been deleted. [Joe Orton] + + *) Win32: fix apr_proc_mutex_trylock() to handle WAIT_TIMEOUT, + returning APR_EBUSY. [Ronen Mizrahi ] + + *) Fix apr_file_read() to catch write failures when flushing pending + writes for a buffered file. [Joe Orton] + + *) Fix apr_file_write() infinite loop on write failure for buffered + files. [Erik Huelsmann ] + + *) Fix error handling where apr_uid_* and apr_gid_* could segfault + or return APR_SUCCESS in failure cases. PR 34053. [Joe Orton, + Paul Querna] + + *) Refactor Win32 condition variables code to address bugs 27654, 34336. + [Henry Jen , E Holyat ] + + *) Support APR_SO_SNDBUF and APR_SO_RCVBUF on Windows. PR 32177. + [Sim , Jeff Trawick] + + *) Fix detection of rwlocks on Mac OS X. [Aaron Bannert] + + *) Fix issue with poll() followed by net I/O yielding EAGAIN on + Mac OS 10.4 (Darwin 8). [Wilfredo Sanchez] + +Changes with APR 0.9.6 + + *) Add apr_threadattr_stacksize_set() for overriding the default + stack size for threads created by apr_thread_create(). + [Jeff Trawick] + + *) Add an RPM spec file. [Graham Leggett] + + *) Add a build script to create a solaris package. [Graham Leggett] + +Changes with APR 0.9.5 + + *) Prevent unbounded memory use during repeated operations on a hash table. + [Julian Foad + + *) fix apr_file_dup and apr_file_dup2 win32 implementations + to create a mutex [Steve Hay ] + + *) Makes the threads to behave like on posix. If the thread is created + without APR_DETACH expect that the thread_join will be called, so don't + close the handle in advance, if the thread has already finished. + [Mladen Turk] + + *) The apr/test/Makefile.win is missing a target to build a + readchild.exe that test is depending on but is never built. + [Mladen Turk] + + *) Fix build issues in paths containing symlinks. PR 8867. + [Joe Orton] + + *) Update config.{guess,sub} for DragonFly BSD. PR 29858. + [Joe Orton] + + *) Win32: Fix bug in apr_socket_sendfile that interferred with + Win32 LSPs. Bug is described in Apache 2.0 bugzilla report + 23982 [Jan Bilek, Bill Stoddard] + + *) apr_proc_create() on Unix: Remove unnecessary check for read + access to the working directory of the child process. + PR 30137. [Jeremy Chadwick ] + + *) Win32: Fix bug tracking the file pointer on a file opened for + overlapped/APR_XTHREAD io. [Bill Stoddard] + + *) Fix FreeBSD atomics. [Paul Querna ] + + *) Fix apr_snprintf() to respect precision for small floating point + numbers. PR 29621. [Artur Zaprzala ] + + *) Add command type APR_SHELLCMD_ENV for creating a process + which is started by the shell and which inherits the parent's + environment variables. [Jeff Trawick] + + *) Change default inter-process locking mechanisms: POSIX semaphores + and pthread cross-process mutexes are not used by default; on + Solaris, fcntl locks are used by default. [Joe Orton] + + *) Don't try to enable run-time linking on AIX < 4.2, as this + results in invalid linker options being used. PR 29170. + [Jeff Trawick] + + *) Remove apr_file_copy()'s 2Gb file size limit on some platforms. + [Joe Orton] + + *) Don't assume getnameinfo() can handle IPv4-mapped IPv6 addresses + on any platforms. + [Jeff Trawick, Joe Orton, Colm MacCárthaigh ] + + *) Support setuid, setgid and sticky file permissions bits on Unix. + [André Malo] + + *) Fix sign error in apr_file_seek(APR_END). + [Greg Hudson ] + + *) Provide workaround for socklen_t declaration problem with 64-bit + build on HP-UX. Stop setting a PA-RISC-specific compile option + on ia64. Look for -mt thread option, which is used with HP-UX + vendor compiler on ia64. [Jeff Trawick, based on idea from + Madhusudan Mathihalli] + + *) Return an error instead of silently failing when apr_poll() is + used with file descriptors >= FD_SETSIZE. (Unix systems with + no native poll()) [Jeff Trawick, Brad Nicholes] + + *) Fix handling of negative numbers in apr_strtoi64() on platforms + without strtoll. [Joe Orton] + + *) Fix printing apr_int64_t values smaller than LONG_MIN on 32-bit + platforms in apr_vformatter. [Joe Orton] + + *) Fix apr_socket_opt_set with APR_IPV6_V6ONLY flag. Fixes httpd + Listen IPv6 socket behavior on FreeBSD 5.x, OpenBSD, NetBSD. + [Justin Erenkrantz] + + *) Fix apr_time_exp_get() for dates in 2038. + [Philip Martin ] + + *) Add APR_LARGEFILE flag to allow opening files with the + O_LARGEFILE flag; not recommended for general use, see + include/apr_file_io.h. [Joe Orton] + + *) Various build fixes: thread_rwlock.c on some Solaris platforms + (PR 22990); filestat.c on ReliantUnix (PR 22990); config.status + on IRIX (PR 19251). [Various] + + *) Use NI_NAMEREQD instead of NI_NUMERICHOST in + APR_CHECK_GETNAMEINFO_IPV4_MAPPED. PR 24469. [Justin Erenkrantz] + + *) Ensure that apr_sockaddr_info_get() does not return anything + other than AF_INET and AF_INET6 addresses. [Joe Orton] + + *) Clarify that apr_dir_read() does not guarantee order of returned + entries as previously claimed. [Joe Orton] + + *) The whole codebase was relicensed and is now available under + the Apache License, Version 2.0 (http://www.apache.org/licenses). + [Apache Software Foundation] + + *) Define apr_off_t as long rather than as off_t on platforms with a + 32-bit off_t to prevent incompatibility with packages such as + Perl which redefine the size of off_t via _FILE_OFFSET_BITS on + some platforms. [Ben Reser ] + + *) apr_socket_connect(): allow app to make subsequent call on + non-blocking socket. [Jeff Trawick] + + *) Add apr_os_pipe_put_ex(), which allows the caller to tell APR + to establish a cleanup on the pipe. [Jeff Trawick, Brad Nicholes] + + *) Fix make_exports.awk to work with apr-iconv. [Justin Erenkrantz] + +Changes with APR 0.9.4 + + *) win32: fix apr_file_dup() and apr_file_dup2() to dup the + ungetchar member [Stas Bekman] + + *) Preserve leading '../' segments as when merging to an empty and + unrooted path - fixes a bug observed in SVN with Win32/Netware/OS2. + [Mike Pilato , William Rowe] + + *) Work around a bug in Darwin when calling getnameinfo() on IPv4-mapped + IPv6-addresses. [Colm MacCárthaigh , Jeff Trawick, + Justin Erenkrantz] + + *) Add apr_temp_dir_get() for getting the most suitable temp directory + [Mike Pilato , Thom May] + + *) Modify apr_sockaddr_info_get to call the resolver when we + do not have a hostname. Also, fix bugs in the getaddrinfo() + implementation. + [Colm MacCárthaigh , Justin Erenkrantz] + + *) Change the behavior of unix process 'trylock's to return + APR_ENOTIMPL instead of segfaulting, consistent with the + other lock implementations. [William Rowe] + + *) Fix a subtle race where the ownership of a unix nested + thread lock could be corrupted when the prior owner released + the lock with another thread waiting on the same lock. + [William Rowe] + + *) apr_socket_data_set(): allow the same key to be used for + multiple sockets in the same pool. [Jeff Trawick] + + *) Add new table function apr_table_compress() and replace + red-black trees with mergesort in apr_table_overlap() + [Joe Schaefer , Brian Pane] + + *) Win32: Adopt Brian Havard's OS/2 rwlock implementation for + Windows [Marc Adkins, Bill Stoddard] + + *) Add apr_proc_mutex_lockfile() for retrieving the name of the + file associated with a mutex. [Jeff Trawick] + + *) Don't require the lock file name to be passed into + apr_proc_mutex_child_init() or apr_global_mutex_child_init(). + This allows child init to work when the lock file was a temp + file created by APR. (The problem only occurred with flock- + based mutexes.) [Jeff Trawick] + + *) When using a temporary file for flock- and fcntl-based mutexes, + don't let the file be deleted on close. For flock-based mutexes, + this corrects a fatal problem, since the file would disappear + when a program was spawned and cleanup-for-exec was performed, + and a subsequent attempt to perform child process mutex + initialization would fail. For fcntl-based mutexes, this was a + very minor issue that resulted in a failing unlink() when the + file was closed, since fcntl lock initialization always removes + the file immediately. [Jeff Trawick] + + *) When writing to pipes with a timeout set, handle the situation + where the kernel says the pipe is writable but an attempt to + write <= PIPE_BUF bytes gets EAGAIN. APR will now write whatever + data will fit. APR applications that relied on the atomic nature + of relatively small pipe write requests may be affected. + PR 20295 [Mark Street , Jeff Trawick] + + *) Define _THREAD_SAFE for all compilations on AIX. Previously + those of us who used the vendor compiler had it defined + implicitly and others did not. The difference became obvious + with the recent thread safety fixes to apr_password_validate(). + PR 20420 [Jeff Trawick] + + *) For apr_proc_detach(APR_PROC_DETACH_FOREGROUND), don't treat + a setsid() failure as fatal, as the usual cause is that the + caller is already a process group leader. PR 18519 + [Jeff Trawick] + + *) Fix some problems with non-blocking socket handling on unix + that resulted in infinite timeouts being used for non-blocking + sockets with apr_socket_connect() and some read/write calls. + [Jeff Trawick] + + *) Fix a bug in socket timeout handling on unix that left the + socket non-blocking after disabling the timeout. + [Jacob Craig Lewallen ] + + *) Added flag APR_FILE_ATTR_HIDDEN for manipulating the "hidden" + file attribute on Windows and OS/2. [Branko Čibej] + + *) SECURITY [CAN-2003-0245]: Fixed a bug that could be triggered + remotely through mod_dav and possibly other mechanisms, causing + an Apache child process to crash. The crash was first reported + by David Endler and was researched and + fixed by Joe Orton . Details will be released + on 30 May 2003. + + *) apr_proc_wait(): Handle interrupted waitpid(2) calls by calling + it repeatedly until it succeeds or fails with errno other than + EINTR. This hides this UNIX-specific behavior from APR clients. + + *) Removed the solaris-specific atomic code, due to licence + concerns (it was MPL 1.0, and the author could not be contacted) + [Ian Holsman] + + *) apr_file_gets(): Return APR_SUCCESS if any characters are + returned. Any I/O errors or EOF will be reported on the + next call. Callers that are coded to expect returned + data + APR_EOF when there is no final newline are affected + by this change. [Jeff Trawick] + + *) apr_proc_create() on Unix: Make the APR_SHELLCMD mode work + when there is more than one program argument passed in. + [Jeff Trawick] + + *) Add --cc and --cpp flags to apr-config. [Jeff Trawick] + + *) Don't segfault trying to close a file in error paths of flock + and fcntl mutex creation. PR 19036 [Jeff Trawick] + + *) Add %pT support to apr_snprintf() for printing an apr_os_thread_t. + [Jeff Trawick] + + *) Add APR_TCP_NODELAY_INHERITED & APR_O_NONBLOCK_INHERITED to apr.hw + [Allan Edwards] + + *) Add APR_UINT64_T_HEX_FMT. [Jeff Trawick] + + *) Add parameter to APR_SUBDIR_CONFIG to drop options passed to configure + before the subdir's configure is invoked. + [Jeff Trawick, Justin Erenkrantz] + + *) Implement APR_SO_RCVBUF socket option on Unix. + [Adam Sussman ] + + *) Don't add the math library (-lm) if the modf() function + is already available via libc. [Roy Fielding] + + *) Solaris cc: Don't use the -mt option for threaded builds. That + is for non-Posix threading, and the use of it prevented us from + linking with -lpthread, which in turn caused weird problems for + APR applications. [Kristofer Spinka ] + + *) OS/2: apr_stat() fixes - When a character device is stat'ed, + fill in finfo.name if it was asked for. Return APR_INCOMPLETE + when appropriate. Addresses httpd incident [CAN-2003-0134]. + [Brian Havard] + +Changes with APR 0.9.3 + + *) Don't enable posixsem, at build time, on systems where sem_t * + won't "fit" into an int (sizeof-wise). Also, better error handling + when we fail to create a posixsem. PR 17186 [Scott Herod + , Jim Jagielski] + + *) Default hpux 10.x to disable threading, since if it exists at all + the pthread implementation should not be trusted, while hpux 10 + had its own threads implementation that is no longer supported. + PR 9457 [William Rowe] + + *) Fix error in apr-config when symlinks are involved. + [Garrett Rooney ] + +Changes with APR 0.9.2 + + *) Numerous bug fixes for file and socket inheritence by child + processes on Unix, correcting bugs that affected the correct + behavior of apr_[file|socket]_inherit_[un]set() API. + [Bjoern A. Zeeb , William Rowe, Joe Orton] + + *) Define APR_UINT64_T_FMT and APR_UINT64_T_FMT_LEN. + Define APR_INT64_T_FMT_LEN on Windows and Netware. [Branko Čibej] + + *) Correct apr_file_gets() on OS2 and Win32 so that '\r's are no longer + eaten, and apr_file_gets() -> apr_file_puts() moves the contents + uncorrupted. [William Rowe] + + *) Alter Win32's handling of the apr_proc_t hproc member, so that we + close that system handle wherever an apr function would invoke the + final waitpid() against a zombie process on Unix. [William Rowe] + + *) APR_MAX_SECONDS_TO_LINGER and APR_FNM_* #defines replace their + old undecorated names (missing APR_ prefix). The old names will + disappear with APR 1.0.0. + [Craig Rodrigues , William Rowe] + + + *) When generating a semaphore name for posixsem locking, try to + be a little more robust (and unique). [Jim Jagielski] + + *) Add functions apr_env_get, apr_env_set and apr_env_delete for + manipulating the environment. [Branko Čibej] + + *) Fix APR_LAYOUT to work with layout files with no preceding blank lines + and emit errors when layout is not found. PR 15679. + [Justin Erenkrantz] + + *) Add functions apr_filepath_list_split and apr_filepath_list_merge + for managing search paths. [Branko Čibej] + + *) Introduce Release mode debugging symbols for Win32 builds of apr. + All library builds gain /Zi for debug symbols (which are discarded + at link time if some flavor of the /debug flag isn't passed to link) + and .dll builds gain .pdb symbols. [Allen Edwards, William Rowe] + + *) Add two new proc attributes to improve diagnostics for + apr_proc_create() failures on platforms where fork()+exec() is used. + See the doc for apr_procattr_child_errfn_set() and + apr_procattr_error_check_set(). [Jeff Trawick] + + *) Rename rules.mk to apr_rules.mk and make apr_rules.mk be installed. + [Thom May] + + *) Fix a bug in apr_proc_create() that could cause a new child process + to run the parent's code if setrlimit() fails. [Jeff Trawick] + + *) Disable apr_socket_sendfile() on 64-bit AIX to avoid an apparent + system problem. PR 11408. [Jeff Trawick] + + *) Add --includedir flag to apr-config. [Justin Erenkrantz] + + *) Only include sys/syslimits.h if we don't have limits.h + [Craig Rodrigues , Garrett Rooney + , Thom May] + + *) Allow apr-config to work in symlinked install directories when + 'realpath' is available. [Justin Erenkrantz] + + *) Namespace protect the header files in include/arch + [Thom May] + + *) Add function apr_filepath_encoding and associated constants. + [Branko Čibej] + + *) Allow apr_hash to have greater than int number of elements. + [Justin Erenkrantz] + + *) Allow generation of dependencies by non-GCC compilers. + [Justin Erenkrantz] + + *) Prevent obscenely large values of precision in apr_vformatter + from clobbering a buffer. [Sander Striker, Jim Jagielski] + + *) limit the renames performed in apr_rename.pl to the most recent renames. + [Thom May] + + *) Changed apr_mmap_dup() and friends so that there's no longer any + is_owner concept on the mmaped region, but rather something more + along the lines of a reference count. This allows the old apr_mmap_t + to still be used safely when the new apr_mmap_t is in a disjoint pool. + [Cliff Woolley, Sander Striker] + + *) Fix a bug in apr_hash_merge() which caused the last entry in the + overlay hash to be lost. PR 10522 [Jeff Trawick] + + *) Add DougM's apr_rename.pl script into helpers, and update for the new + batch of updates [Thom May] + + *) Renames done (deprecated functions wrapped): + apr_filename_of_pathname -> apr_filepath_name_get + apr_get_groupid -> apr_gid_get + apr_get_groupname -> apr_gid_name_get + apr_compare_groups -> apr_gid_compare + apr_parse_addr_port -> apr_port_addr_parse + apr_shutdown -> apr_socket_shutdown + apr_bind -> apr_socket_bind + apr_listen -> apr_socket_listen + apr_accept -> apr_socket_accept + apr_connect -> apr_socket_connect + apr_send -> apr_socket_send + apr_sendv -> apr_socket_sendv + apr_sendto -> apr_socket_sendto + apr_implode_gmt -> apr_time_exp_gmt_get + apr_get_home_directory -> apr_uid_homepath_get + apr_get_userid -> apr_uid_get + apr_current_userid -> apr_uid_current + apr_compare_users -> apr_uid_compare + apr_get_username -> apr_uid_name_get + apr_recvfrom -> apr_socket_recvfrom + apr_sendfile -> apr_socket_sendfile + apr_recv -> apr_socket_recv + [Thom May] + + *) Add APR_IPV6_V6ONLY socket option. [Jeff Trawick] + + *) Update timeout algorithm in free_proc_chain. If a subprocess + did not exit immediately, the thread would sleep for 3 seconds + before checking the subprocess exit status again. In a very + common case when the subprocess was an HTTP server CGI script, + the CGI script actually exited a fraction of a second into the 3 + second sleep, which effectively limited the server to serving one + CGI request every 3 seconds across a persistent connection. + [Bill Stoddard, Kai.Risku@arrak.fi] + + *) Update doxygen tags. [Justin Erenkrantz] + + *) NetWare: implemented a file IO path context scheme to directly + reference directory paths and files in the file system rather + than having to traverse the file system on every stat() or + open() call. (Performance enhancement) [Brad Nicholes] + + *) ReliantUnix: recognize that dlsym() is in libdl and dlopen() is in + libc. The check is generic so maybe this fixes some other system. + PR 14189 [Jeff Trawick] + + *) Win32: Fix APR_APPEND file i/o. [Bill Stoddard] + + *) Fix a problem retrieving the remote socket address for sockets + created via apr_os_sock_put() or apr_os_sock_make(). [Jeff Trawick] + + *) Add recognition of and socket API support for the SCTP protocol. + [Randall Stewart ] + + *) Win32: apr_shutdown was not honoring apr_shutdown_how_e and + always shutting down the socket for read. This could result + in Apache HTTPD 2.0 clients getting early connection closures + because lingering_close() was broken. [Bill Stoddard, Allan Edwards] + + *) Add apr_atomic_casptr() to support atomic compare-and-swap + of pointers [Brian Pane] + + *) Add apr_socket_create_ex() to allow protocol to be specified for the + socket. With APR 1.0, this function will be removed and apr_socket_create() + will have the additional parameter. + [Randall Stewart ] + + *) Fix the detection of INT64_C() when defined in . + [Joe Orton ] + + *) Don't use whitespace before preprocessor directives in the configure + logic. Such whitespace breaks with some older preprocessors; a + particularly nasty break occurs on Tru64 4.0f where APR_CHECK_DEFINE + will always succeed. [Joe Orton ] + + *) Add APR_IPV4_ADDR_OK flag to apr_sockaddr_info_get() to allow + apps to avoid lookup of IPv6 address if IPv4 address is sufficient. + (New APR_IPV6_ADDR_OK flag is similar.) [Jeff Trawick] + + *) Disable IPv6 support on Darwin. The current IPv6 support has a + problem in getnameinfo() which breaks certain applications. + [Sander Temme , Jeff Trawick] + + *) Support for SCO OpenServer Release 5 [Kean Johnston ] + + *) Faster (inline and mutex-free) implementations of all apr_atomic + operations for Linux/x86 (requires a 486 or later; to enable, + configure APR with --enable-nonportable-atomics=yes ) [Brian Pane] + + *) Add --bindir option to apr-config. [Justin Erenkrantz] + + *) Begin to rehash the test suite. There is now a new test program called + testall. This program currently runs testtime and teststr with the + CuTest framework. The stand-alone programs for testtime and teststr + can be built, but only if a special flag is specified when building. + [Ryan Bloom] + + *) Fix a broken check for a failure to read from the random device file. + PR 12615 [tenthumbs@cybernex.net] + + *) Print informative link errors on Darwin. [Justin Erenkrantz] + +Changes with APR 0.9.1 + + *) Fixed usage of alloca in apr_poll() on Tru64 + [Dave Hill ] + + *) Running "make check" in the toplevel directory or the test/ directory + will build and run all test programs. [Aaron Bannert] + + *) Add apr_array_pop(). [Justin Erenkrantz] + + *) Fixed the native SPARC v8plus version of apr_atomic_dec + to match the semantics of the default C version [Brian Pane] + +Changes with APR 0.9.0 + + *) If the length argument to apr_snprintf is 0, then we should return the + length that the string would be if we actually were going to fill it out. + However, if the length argument is 0, we can also accept a NULL string. + Also, added a test case for this. [Ryan Bloom] + + *) Printing a string with apr_snprintf can seg fault, if a precision is + specified for the string, and the string being printed doesn't have a + trailing '\0'. Fix that seg fault by not calling strlen if a precision + is specified when printing a string. Also add a test to the test suite + for this case. + [R Samuel Klatchko ] + + *) handle leak related to threads on Windows2000/XP + [INOUE Seiichiro ] + + *) Includes moved to INCLUDEDIR/apr-{major} (e.g. /usr/include/apr-0) + [Greg Stein] + + *) libtool versioning is used to give the library sonames a real + value. The libraries will be libapr-{major}.so.0.{minor}.{patch} + [Greg Stein] + + *) Fix apr_tokenize_to_argv() to remove the escape character + (backslash) from the argument tokens. PR 11793 [Paul J. Reder] + + *) Add APR_PARSE_ARGUMENTS and APR_LAYOUT macros for better layout + support. [Thom May] + + *) Add parallel-apr layout which utilizes the major version number in + directories and library names. [Justin Erenkrantz] + + *) Add a version number to the library name (e.g. libapr-1.so) so + that apps can do things like: -lapr-1 or -lapr-2, depending on + which version they want to use and link against. [Greg Stein] + + *) Add --version to apr-config so that apps can retrieve the version + information of the (installed) APR. [Greg Stein] + + *) Remove the APRVARS system; apps should use apr-config. [Greg Stein] + + *) EBCDIC: fix compile failure in strings/apr_strings.c in + httpd-2.0.40 with the following error message: + CANNOT COMPILE apr_strtoi64(), only ASCII and EBCDIC supported + + *) In apr_signal_thread() remove synchronous signals from the mask + passed to sigwait(). It is never valid for them to be there. + Some platforms silently ignore them, some return EINVAL, some + don't process it as desired. [Jeff Trawick] + + *) Change config.nice generation to always expand variables. + [Justin Erenkrantz] + + *) Renamed apr_strtoll()/apr_atoll() to follow int64 convention, + so these new helpers are apr_strtoi64/apr_atoi64(), since + 'll' (long long) is a nonportable and aspecific construct. + Used ac/m4 tests to choose the appropriate fn behind strtoi64. + [William Rowe] + + *) don't perform a strlen on that name value without checking for NULL + first (in getopt) + [David Waite , Ian Holsman] + + *) Added apr_strtoll() and apr_atoll() to strings lib. + [Shantonu Sen , Wilfredo Sanchez] + + *) Added a lightweight internal index to apr_table_t to speed up + table lookup operations [Brian Pane] + + *) initalize handle members to invalid before calling createprocess + on win32 [Rob Saccoccio ] + + *) Removed apr/i18n to apr-util/xlate for inclusion of apr-iconv + as required by missing libiconv. [William Rowe] + + *) Removed apr/md5 and apr/uuid into apr-util/crypto. [William Rowe] + + *) Add APR_BUFFERED support to apr_os_file_put(). [Justin Erenkrantz] + + *) Fix misinterpretation of timeout for select() on Win32/Netware. + Identified by [TANAKA Koichi ] + + *) Re-write apr_poll() on Unix. This improves the performance by + giving the user back control over the memory in the pollset. + [Ryan Bloom] + + *) Added APR_LIMIT_NOFILE option to apr_procattr_limit_set() to + control the file descriptor limit on platforms that support + RLIMIT_NOFILE. [Brian Pane] + + *) FreeBSD: change apr_sendfile to accomodate a 4.6 kernel patch. + [Greg Ames] + + *) Faster code for the apr_table get/set functions [Brian Pane] + + *) Fix the userid functions on Irix to handle the way that Irix + reports a failure from getpwnam_r(). PR 10095. + [Robert I. Cowles , Jeff Trawick] + + *) apr_table_do() and apr_table_vdo() now return an int rather than + void to indicate whether or not any of its iterations returned 0. + [Cliff Woolley] + + *) Fix the definition of union semun so that it is valid on systems + where sizeof(long) != sizeof(int). This resolves a hang on + HP-UX/Itanium. + [Madhusudan Mathihalli ] + + *) Correct shared library support on Darwin to not fatally error out + when a shared library does not exist. [Justin Erenkrantz] + + *) Added optimized atomic CAS support for Linux/x86 (available only + when APR is configured with --enable-nonportable-atomics=yes) + [Brian Pane] + + *) Fix a compile error in the EGD support in rand.c on older Solaris + versions. PR 9976 [Jim Morris ] + + *) Fixed apr_file_seek() to unset the eof_hit flag. [Stas Bekman] + + *) Removed --disable-atomics flag and added --enable-nonportable-atomics, + thereby defaulting to portable binaries on those systems that could + be optimized at the expense of portability. PR: 9507 [Aaron Bannert] + + *) Added 2 additional lock functions: apr_proc_mutex_name and + apr_proc_mutex_defname which returns the type name of the mutex + (eg: "sysvsem") as well as the default mutex type (APR_LOCK_DEFAULT). + Mostly useful under Unix were the locktypes are selectable. + [Jim Jagielski] + + *) Fixed apr_generate_random_bytes() for Win32 on Win NT or 9x by + dropping the 0x40 bit (CRYPT_SILENT) for earlier OS'es. + PR 9286 [William Rowe] + + *) Added --with-devrandom=[DEV] configure flag which allows a particular + "/dev/random"-compatible device to be specified, overriding the + default search path (/dev/random then /dev/arandom then /dev/urandom). + Also, if --with-egd= is specified, it now implies + --without-devrandom. [Cliff Woolley] + + *) Darwin/Mac OS X: Don't leave zombie processes when the app calls + apr_signal(SIGCHLD, SIG_IGN). This fixes a problem with Apache's + mod_cgid. PR 9168. [Jeff Trawick] + + *) Win32: Fix bug where apr_sendfile() was incorrectly returning + APR_SUCCESS on a TransmitFile call that was interrupted by + the client closing its end of the connection. Always call + GetOverlappedResults() to get results of async TransmitFile() + completion notification. [Bill Stoddard] + + *) Renamed APR_XtOffset -> APR_OFFSET and APR_XtOffsetOf -> APR_OFFSETOF. + [Cliff Woolley] + + *) Cygwin: the unix version of apr_file_open() must respect the + APR_BINARY flag if the underlying platform requires it (in + which case we assume O_BINARY is defined). PR 9185. + [Cliff Woolley] + + *) Linux, AIX: Use crypt_r() instead of crypt() because the native + crypt() is not thread-safe. The misuse of crypt() led to + intermittent failures with Apache basic authentication when crypt + passwords were being used. [Jeff Trawick] + + *) AIX: Global mutexes don't need an intraprocess mutex when SysV + sems are used for the crossprocess mutex. + Darwin: The same optimization was applied for Posix sems. + [Jeff Trawick] + + *) Fix a problem with global mutexes on OS/390 when something other + than the default mechanism (SysV sem) was used. The mutexes didn't + necessarily block out other threads in the same process. + [Jeff Trawick] + + *) Fixed apr_strfsize formatting of values over 1 gig + [Matsuzaki Yoshinobu ] + + *) Renamed --disable-atomics as --disable-optimized-atomics, + since it doesn't really disable the atomics. [Aaron Bannert] + + *) Converted apr_pcalloc to a macro [Brian Pane] + + *) Fixed APR_STATUS_IS_ETIMEDOUT macro. + [Dagfinn Aarvaag ] + + *) Add --disable-atomics switch to override our handcoded assembly + optimizations. Note that this has no effect if your operating + system has a userspace atomic interface. [Justin Erenkrantz] + + *) Remove Linux atomic support since it does not have a usable + userspace atomic interface. [Justin Erenkrantz] + + *) Don't require that the DNS can map 127.0.0.1 when checking for + the presence/usability of getnameinfo(). PR 7642. [Jeff Trawick] + + *) Remove APR_WANT_SIGNAL from apr_want.h because code must include + apr_signal.h in order to get consistent definitions. [Roy Fielding] + + *) Don't try to use /dev/zero and mmap on platforms that don't + support that (such as HP-UX). PR 8537. [Justin Erenkrantz] + + *) Reduce the number of apr_sendfile calls on AIX and OS/390 by + remembering when the kernel tells us the next one will block. + [Jeff Trawick] + + *) Reduce the number of apr_sendfile calls on FreeBSD by remembering + when the kernel tells us the next one will block. [Greg Ames] + + *) To support modules like PHP, which implement their own + loaded extensions, Darwin needs to place their public + symbols in the global table. [Marko Karppinen , + Jim Jagielski] + + *) Rename apr_get_groupname to apr_group_name_get. + [Thom May ] + + *) Allow VPATH builds to properly build dependencies and switch to + a .deps dependency model to mimic httpd-2.0. [Justin Erenkrantz] + + *) Tru64: Stop leaving zombies in APR apps like mod_cgid which + tell APR to ignore SIGCHLD. + [Dave Hill ] + + *) Ensure that the ATOMIC_HASH can not be negative. + [Joe Orton ] + + *) Fix a problem with eof reporting with Unix file I/O on + unbuffered files. [Stas Bekman ] + + *) Rename apr_explode_time to apr_time_exp_tz. + [Thom May ] + + *) Rename apr_explode_localtime to apr_time_exp_lt. + [Thom May ] + + *) Set precompiler for Solaris atomics when using GNU binutils. + PR 7876. [solomon@conceptshopping.com (Marvin Solomon)] + + *) AIX: Fix breakage with 64-bit builds on versions of AIX prior + to 5L. PR 7957 [Jeff Trawick] + + *) On socket write functions (apr_sendfile, apr_send, apr_sendv), + added a select to wait for writability on the socket if the + previous write was incomplete. [Jeff Trawick, Brian Pane] + + *) Deprecated the apr_lock.h API. Please see the following files + for the improved thread and process locking and signaling: + apr_proc_mutex.h, apr_thread_mutex.h, apr_thread_rwlock.h, + apr_thread_cond.h, and apr_global_mutex.h. [Aaron Bannert] + + *) Fix some daylight savings time breakage on (at least) AIX, + Solaris, and HP-UX. [Jeff Trawick] + + *) Added support for Posix semaphores (sem_open, et.al.) for mutex + locking. We use named semaphores in this implementation. The + default priority is between pthread and sysvsem. + [Jim Jagielski] + + *) Get flock-based mutexes to work in apps like Apache. Use the + same permissions on flock- and fcntl-based mutexes as Apache + 1.3. [Jeff Trawick] + + *) Fix apr-config so that it will not attempt to cd to a non-existent + directory. [Justin Erenkrantz] + + *) Change the ordering of the apr_lock implementation method to + better match what's done in Apache 1.3. The ordering is + now (highest to lowest): pthread -> sysvsem -> fcntl -> flock. + [Jim Jagielski] + + *) Improve detection of the INT64_C macro to prevent problems + with HP-UX's ANSI C compiler. PR 8932. [Justin Erenkrantz] + + *) Make sure gethostbyname() can handle 255.255.255.255 if we + are to trust it to handle numeric address strings in + apr_sockaddr_info_get(). This fixes a problem on HP-UX + which led to an assertion failure at Apache startup when + using vhosts. [Jeff Trawick] + + *) Don't mask SIGUSR2 [Jin Hong ] + + *) Load libraries if they not MH_BUNDLE, but if they are not, it + just attempts to link them as shared libs. + [Pier Fumagalli ] + + *) apr_atomic_dec now returns a zero value if the value of + the atomic is zero, non-zero otherwise [Ian Holsman] + + *) When opening a file, only create an internal thread mutex + if APR_XTHREAD is set. [Brian Pane] + + *) Move the kill_conditions enum in apr_thread_proc.h into the + APR namespace. kill_after_timeout et al have been renamed + appropriately (e.g., APR_KILL_AFTER_TIMEOUT). [Jeff Trawick] + + *) Fix a segfault in apr_thread_rwlock_destroy() on Win32. + [INOUE Seiichiro ] + + *) configure now checks to see if we can change DNS timeout values + [Ian Holsman] + + *) Fix a bug in apr_file_seek() on Unix when using buffered + files. PR 10003 [Jeff Trawick] + + *) Small table performance optimization: eliminate the + zero-fill of newly allocated elements when expanding + a table's size. [Brian Pane] + + *) Allow APR to install its generated libtool(s) via the + --with-installbuilddir option (defaults to ${datadir}/build). + [Justin Erenkrantz] + + *) renames: apr_ansi_time_to_apr_time becomes apr_time_ansi_put + ap_exploded_time_t becomes apr_time_exp_t + [Thom May ] + + *) Add the APR_FILE_NOCLEANUP flag to apr_file_open(). + Adding the flag will prevent the file from being closed + when the pool passed in on apr_file_open() is destroyed. + This feature is useful when using apr_os_file_get|put() + to manage the apr_os_file_t in apr_file_t (ie, file handle + caching in the HTTP server) [Bill Stoddard] + + *) Win32: Fix APR_XTHREAD problems in apr_file_read() + and apr_file_write(). Multiple threads were using the + same overlapped structure and io event handle created + in the open call, which could cause unpredictable + file i/o results. [Bill Stoddard] + + *) Win32: apr_proc_mutex_trylock and apr_proc_mutex_lock were + incorrectly returning APR_BUSY if the lock was previously + held by a thread that exited before releasing the lock + (ie, if the process holding the lock segfaults). The MSDN + doc says when WaitForSingleObject returns WAIT_ABANDONED, + the calling thread takes ownership of the mutex, so these + two routines should return APR_SUCCESS in this case, not + APR_BUSY. [Bill Stoddard] + + *) Added a new m4 function APR_EXPAND_VAR that will iteratively + interpolate the contents of a variable, such as $sysconfdir, + for use in a borne script. [Aaron Bannert] + + *) apr-atomic support for old-sparc's and gas on solaris + [Dale Ghent , jean-frederic clere, Ian Holsman] + + *) Change apr_proc_detach to take a parameter that can enable/disable + automatic forking (aka, to "daemonize"). + [Jos Backus , Aaron Bannert] + + *) Implement apr_global_lock_foo() on Win32 + [Bill Stoddard] + + *) Fix select() argument call when waiting for IO. PR 9674. + [David MacKenzie ] + + *) Add a new lock API (apr_global_mutex_t) to provide guaranteed + cross-process AND cross-thread mutual exclusion. [Aaron Bannert] + + *) Note: We are in the process of deprecating the apr_lock.h API. + The new and improved lock/synchronization APIs now reside + in apr_thread_mutex.h, apr_proc_mutex.h, apr_thread_rwlock.h, + and apr_thread_cond.h. [Aaron Bannert] + + *) Enable autoconf 2.52{f,g} build support. + [Blair Zajac ] + + *) Added new functions for atomic operations. These are experimental + at the moment, so use in apps is discouraged [Ian Holsman] + + *) Correct serious problems with the Win32 apr_file_dup2 + and apr_file_open_stdxxx() fns. [William Rowe] + + *) Begin implementation of the WinCE port. + [Mladen Turk ] + + *) Disable SHMEM_MMAP_ZERO on HPUX 11.x where it is not supported. + Use SHMEM_SHMGET_ANON instead. [Aaron Bannert] + + *) Fix a few attempts to add to a void * ptr in the Unix shared + memory support code. PR #9710 Per Ekman [pek@pdc.kth.se] + + *) In the Linux apr_sendfile(), fix the types of some parameters + to apr_send() and apr_recv(). Breakage was seen in 64-bit mode + on s/390. PR #9712 [Neale.Ferguson@SoftwareAG-usa.coom] + + *) added APR_PROGRAM_ENV and APR_PROGRAM_PATH options for starting + processes via apr_proc_create() [Greg Stein] + + *) Deprecated apr_pool_free_blocks_num_bytes() [Sander Striker] + + *) Add --enable-pool-debug to make it easier for people to + enable pool debug mode. Removed the APR_POOL_DEBUG_VERBOSE + define that was previously being used. [Sander Striker] + + *) Changed the apr_file_dup2() function prototype. It can only + take and reuse an apr_file_t*, and will no longer create one + if *new_file == NULL (use apr_file_dup() for that). [Aaron Bannert] + + *) Implemented name-based shared memory on Unix. [Aaron Bannert] + + *) Fix spelling mistakes in APRDesign. + [Blair Zajac ] + + *) Ensure that apr_file_mktemp creates the temp file if it isn't there. + [John Sterling ] + + *) Make sure to pre-mark anon SysV shared memory segments as + removed. [Jim Jagielski] + + *) Add --with-efence to allow usage of Electric Fence. + [Justin Erenkrantz] + + *) Updated the pools debug code. Check if a pool is still + valid on the most common apr_pool_xxx functions. + Fix the way APR_POOL_DEBUG_VERBOSE was using stderr. + Make the output somewhat nicer in this debug mode. [Sander Striker] + + *) Add new define APR_POOL_DEBUG_VERBOSE which spits out info + about pool creation/destruction [Ian Holsman] + + *) Fix GMT offset adjustments for platforms that do not have native + GMT offset adjustments. [Jon Travis ] + + *) Add new apr_shm_t API and remove old apr_shmem_t API. The new + API handles both anonymous and name-based shared memory. Anonymous + shared memory segments are only usable on systems with process + inheritance, and so the new API with name-based segments is + usable on platforms like Win32. [Aaron Bannert and William Rowe + with much help from Justin Erenkrantz and Sander Striker] + + *) Add --with-egd to support EGD-compatible entropy gatherers for + those platforms without native support. [Justin Erenkrantz] + + *) apr_lock_create() and apr_proc_mutex_create() now have an + additional parameter for specifying the lock mechanism. + apr_lock_create_np() and apr_proc_mutex_create_np() have been + removed. [Jeff Trawick] + + *) Change the prototype of apr_thread_exit() so that the apr_status_t + is no longer a pointer. It was difficult and sometimes hazardous + to return a apr_status_t* at times, and this allows us to return + the APR_* error codes directly. [Aaron Bannert] + + *) Add apr_sockaddr_equal() for comparing APR sockaddrs. + [Jeff Trawick] + + *) Win32: apr_sendfile() should return APR_ENOTIMPL if + oslevel < WINNT. [Bill Stoddard] + + *) Put new pools code in place which allows applications to + switch off locking on pools operations in case a pool is + guaranteed to never being used in more than one thread + at the same time. We've seen a significant performance + improvement over the old code. [Sander Striker] + + *) Add apr-config - a shell script to allow third-party programs + easy access to APR configuration parameters. [Justin Erenkrantz] + + *) Add find_apr.m4 to allow third-party programs that use APR to + have a standard m4 macro for detection. [Greg Stein] + + *) SEGV in apr_table_overlap [Brian Pane] + + *) apr_array_copy speedup by removing the zero-fill [Brian Pane] + + *) Fix build breakage on systems with getaddrinfo() but not + gai_strerror() (e.g., RedHat 5.2). [Jeff Trawick] + + *) Fix a problem in Unix apr_file_dup() which caused 0 to be returned + by the first read. [Stas Bekman ] + + *) Fix a buglet that caused APR_FILE_BASED_SHM to be set inadvertently + on some platforms (e.g., Linux, AIX). [Jeff Trawick] + + *) Speed up apr_table operations by using a cache/checksum and a + red-black tree in the overlay. + [Brian Pane , Cliff Woolley] + + *) Speed up apr_pool_userdata_set[n] by letting hash_set figure out + the strings length. [Brian Pane ] + + *) New function apr_mmap_dup. This is called in the mmap_setaside. + [Brian Pane ] + + *) Speed up the apr_hash_t implementation's handling of APR_HASH_KEY_STRING. + [Brian Pane ] + + *) Tweak apr_gethostname() so that it detects truncation of the + name and returns an error. [Jeff Trawick] + + *) Fix bug in Darwin DSO code. [Sander Temme] + + *) Fix apr_setup_signal_thread() to grab the right error code from + a sigprocmask() failure. This only affects platforms that use + sigprocmask() in lieu of pthread_sigmask(). [Jeff Trawick] + + *) Fix the Unix HAVE_POLL flavor of apr_poll_socket_mask() so that + it doesn't segfault. Avoid some wasted storage in a poll-related + APR structure. [INOUE Seiichiro ] + + *) Fix apr_setup_signal_thread() so that threads don't block + synchronous signals (e.g., SIGSEGV). It is a programming error + to do so, and some platforms (e.g., Solaris, AIX) don't call any + registered signal handler when such signals are blocked. + [Jeff Trawick] + + *) Change the apr_table_elts macro so that it provides access via + a const pointer instead of a non-const pointer. + [Brian Pane ] + + *) Use strerror_r() where available, since strerror() isn't always + thread-safe. Example systems where strerror() isn't thread-safe: + Linux+glibc, AIX [Jeff Trawick] + + *) Fix some file cleanup problems in apr_proc_create() which could + result in the pipes for stdin/stdout/stderr being closed + immediately. [Jeff Trawick] + + *) New functions apr_hash_[merge|copy], change to overlay fn + so that it calls merge, which does a inline iteration instead + of calling the iterator function. [Brian Pane ] + + *) Introduce the apr_pool_userdata_setn() variant that doesn't + strdup the key. Allows both the _setn() and _set() variant to + accept NULL for the cleanup. [Brian Pane ] + + *) Re-vamp the apr_proc_wait and apr_proc_wait_all functions. We + now return the exit code from the program and a reason that the + program died, either normal exit or signalled. + [Jeff Trawick and Ryan Bloom] + + *) Implement portable accessors for proc mutex. These are equivalent + to apr_os_lock_get/set, but they work for apr_proc_mutex_t types + instead. [Aaron Bannert] + + *) Added a new parameter to apr_thread_mutex_init(). Now, by default, + thread mutexes are not nested (sometimes called "recursive"). To + enable nested mutexes, a flag must be passed to the init script. + Non-nested mutexes are much faster than nested ones. + [Aaron Bannert] + + *) read_with_timeout in apr/file_io/win32/readwrite.c incorrectly + returned APR_SUCCESS instead of APR_EOF when PeekNamedPipe failed + and the result from GetLastError() was ERROR_BROKEN_PIPE. Because + of this, the pipe wasn't closed as soon as it could be. + [Tim Costello ] + + *) Fix a problem in the Win32 pipe creation code called by + apr_proc_create(): It didn't register cleanups for either the + read or the write ends of the pipe, so file handles (and event + handles for pipes with asynchronous I/O mode set) are never + closed. [Tim Costello ] + + *) Add support for QNX 6. [J.T. Conklin ] + + *) We now create exports.c and export_vars.h, which in turn create + exports.c. From this we generate two more files with different + purposes: apr.exp - list of exported symbols; and exports.lo + (exports.o) - an object file that can be linked with an executable + to force resolution of all apr symbols. [Aaron Bannert] + + *) Add the apr_thread_cond_timedwait function to the condition + variable API. [Aaron Bannert] + + *) Fixed apr_file_mktemp on systems without mkstemp (Win32, etc). + [Mladen Turk, Cliff Woolley] + + *) Fix a segfault in apr_poll_clear on Unix. Also fix the logic + for the case where there are multiple events ORed together in + the events list. [Jamshid Mahdavi ] + + *) Files opened on Unix with the flag APR_DELONCLOSE are now + not unlinked until they are actually closed, rather than as + soon as they're opened. The old approach worked but made + handling temp files harder. [Cliff Woolley] + + *) Fix potential segfault when closing a file on Unix. If + apr_file_close() was called and it failed, it would not + deregister the file cleanup. Therefore the cleanup would + be run again later on a now-invalid descriptor. [Cliff Woolley] + + *) Introduce apr_pool_lock for debugging, in combination with + ALLOC_USE_MALLOC + DEBUG_WITH_MPROTECT. Only implemented + on Win32 today, very effective for debugging pool constness. + [William Rowe] + + *) Optimize apr_pstrcat by caching lengths of first 6 strings + [Brian Pane ] + + *) Add pool accessors to the apr_thread_mutex_t datatype. + [Aaron Bannert ] + + *) Add the apr_file_mktemp function. This creates and opens a + temporary file, for use by the program. This file is created + delete_on_close. The initial implementation only works on + Unix, but Windows is coming soon. [Ryan Bloom] + + *) Make the unix version of apr_proc_wait_all_procs a simple wrapper + around apr_proc_wait, and which extracts the exit code from the + status returned by waitpid. + [Kevin Pilch-Bisson ] + + *) Add process locking API to APR. [Aaron Bannert ] + + *) Add condition variables for Windows. [Ryan Bloom] + + *) Add condition variables to the APR set of locking functions. + This does Unix, and provides stubs for all other platforms. + [Aaron Bannert ] + + *) Don't search for IPv6 names in apr_sockaddr_info_get() if the + application doesn't specify the family (i.e., the application + passes in AF_UNSPEC) and APR isn't built with IPv6 support. + [Jeff Trawick] + + *) Fix the API for the apr_proc_create() call on Win32. Several + bad assumptions are gone, including a mismatch between unix and + win32, where win32 was defaulting to create detached. Also fixes + the apr_proc_t's pid member to a real pid (identity that works + across processes) instead of the handle (which is a new hproc + member value.) [William Rowe] + + *) Modify the external apr_filepath_get() fn to take a flags arg, + currently only for APR_FILEPATH_NATIVE. This returns c:\foo + format on Win32, and should do the same on OS2, or sys\vol:\foo + on Netware. Primarily for internals, but possibly useful to + others (and it mirrors some of the other apr_filepath_*() calls.) + [William Rowe] + + *) Add the new thread read/write lock API to APR. + [Aaron Bannert ] + + *) Add the new thread mutex lock API to APR. + [Aaron Bannert ] + + *) Cache GMT offset on platforms that don't store it in the tm struct. + This offset is normalized to be independent of daylight savings + time. [Brian Pane ] + + *) Initial support for cygwin. [Stipe Tolj ] + + *) Fix a problem with buffered files on Unix. [Brian Havard] + + *) Fix the bungling of getaddrinfo() error codes. [Jeff Trawick] + + *) Add an apr_thread_once function to APR. This allows a + program to ensure that a function is only called once. + [Ryan Bloom] + + *) APR Documentation is now in Doxygen format. + [Ian Holsman] + + *) Get apr_ungetc() to work with buffered files on Unix. + [Jeff Trawick] + + *) Fixed apr_filepath_root on Unix [William Rowe, Cliff Woolley]. + + *) Rename XtOffset to APR_XtOffset. This namespace protection + is important to keep from conflicting with other packages. + [Perl] + + *) Introduce a new --disable-ipv6 option to disable IPv6 support. + [Sterling Hughes , Jeff + Trawick] + + *) Fix the new shared memory code. We need to pass a pointer to + an apr_file_t to apr_file_open. Also, apr_os_file_get returns + a status value, not the OS file descriptor. [Ryan Bloom] + + *) Fix the new shared memory configure script. The APR_DECIDE + macros go in order, so the last set of dependancies that are + met are the ones used. That means that when using those macros, + options should be listed with the least desirable option first, + and the most desirable last. The new shared memory routines did + the opposite, so we chose the wrong shared memory option on Linux. + [Ryan Bloom] + + *) Move the necessary shared memory code from MM into APR and remove + our dependency upon MM. [Justin Erenkrantz] + + *) Get apr_lock_file and apr_unlock_file working on Windows 9x. + [Mladen Turk, Bill Stoddard] + + *) Make all APR pools be allocated out of the permanent pool. + This brings APR pools back to a tree structure. There are + no longer any way to create a pool that is not a decendant + of the permanent_pool. [Ryan Bloom] + + *) Wrap all functions in APR_DECLARE macro. + [Sterling Hughes ] + + *) Non-blocking connects shouldn't be calling connect a second + time. According to Single Unix, a non-blocking connect has + succeeded when the select pops successfully. It has failed + if the select failed. The second connect was causing 502's + in the httpd-proxy. [John Barbee barbee@veribox.net] + + *) Fix apr_dir_rewind() for Win32 to avoid returning a bogus error. + [Jeff Trawick, William Rowe] + + *) Detect required libraries first. This minimizes the libraries + needed in apr_hints.m4. [Justin Erenkrantz] + + *) Support the AIX, glibc2, and Solaris variants of gethostby{name|addr}_r. + Use gethostbyaddr_r function when available. + [Sterling Hughes ] + + *) Add new socket option, APR_INCOMPLETE_READ, that should be + set when you expect the first non-blocking read to fail with + EAGAIN. Setting APR_INCOMPLETE_READ prior to calling apr_read + will cause select() to be called first to wait for bytes + to read. [Brian Pane, Dean Gaudet] + + *) Better installation. This makes us install the APRVARS file, + as well as MM. [Ryan Bloom] + + *) Provide new number conversion functions apr_itoa, apr_ltoa, and + apr_off_t_toa, and inline code in inet_ntop4, to reduce CPU + consumption. [Brian Pane] + + *) Updated APR to pass the thread worker_function prototype + (apr_thread_start_t) two parameters, the apr private data + (apr_thread_t*) and the application private data (void*). + Applications' worker_thread() routines may use apr_thread_pool_get + to access the pool (implemented using APR_POOL_*_ACCESSOR() macros.) + [Aaron Bannert ] + + *) Add Solaris 8's sendfilev() support. This requires the following + patches from Sun: 111297 (Sparc), 111298 (x86). You'll need the + other patches listed in the patch description. [Justin Erenkrantz] + + *) Close file descriptor when we are done with fcntl or flock-based + cross-process lock. Otherwise, we leak descriptors. + [Justin Erenkrantz] + + *) Fix a possible data corruption problem with the use of getpwnam_r() on + all platforms where that function is used. + Use getpwnam_r() and getgrgid_r() instead of getpwnam() and getgrgid() + with threaded builds on glibc (2.1, at least) to avoid thread safety + issues. [Jeff Trawick] + + *) Added apr_lock_tryacquire. It will attempt to acquire the lock, but + will not block if it can not acquire the lock. Returns APR_EBUSY if + acquistion can not happen. [Justin Erenkrantz] + + *) Added an inherit flag to apr_socket_create and other socket creation + functions. This allows APR programs to specify that a socket should + be passed to any child processes that are created. The inherit flag + is only meaningful if programs use apr_process_create(). This + also adds a couple of macros that allow APR types to set and unset + the inherit flag. [Ryan Bloom] + + *) apr_connect()on Windows: Handle timeouts and returning the proper + status code when a connect is in progress. [Bill Stoddard] + + *) apr_connect() on Unix: Handle EINTR during connect(). Handle timeouts. + [Jeff Trawick] + + *) Handle the weird case where getpwnam() returns NULL but errno is zero. + [Jeff Trawick] + + *) Add apr_file_flags_get() which returns the flags that were originally + passed in to apr_file_open(). [Cliff Woolley] + + *) Added APR_HAS_XTHREAD_FILES macro that indicates whether or not the + platform handles files opened in APR_XTHREAD mode natively. Currently + only Win32 has such native support. [Cliff Woolley] + + *) Fix gmt offset handling on Solaris. Apache log messages now show + local time again. PR #7902 [Taketo Kabe ] + + *) apr_pstrcat() optimizations [Doug MacEachern, Jeff Trawick] + + *) Make the apr_pool_is_ancestor logic public. This is required for + some new logic that is going into HTTPD. I have left the join logic + in that function debug only. [Ryan Bloom] + + *) Clean up Win32 locks when the pool goes away. + [Justin Erenkrantz, Jeff Trawick] + + *) Implement apr_get_home_directory for Win32. [William Rowe] + + *) Complete the implementation of LARGEFILE support on Win32, although + the mmap semantics still need a touch of work. [William Rowe] + + *) Fix the APR_XTHREAD support, and apr_sendfile mechanics, so we can + handle cross-threaded file handles on Win32. [William Rowe] + + *) Implement APR_READWRITE locks on Unix with POSIX rwlocks. + Introduce new apr_lock_acquire_rw() function which takes in + APR_READER or APR_WRITER. [Justin Erenkrantz] + + *) Add apr_open_stdin. This mirrors apr_open_stderr, except it works + on stdin. [Aaron Bannert ] + + *) Add apr_strtok(), a thread-safe flavor of strtok() which has the + same interface as strtok_r(). [Jeff Trawick] + + *) Add other child support to Win32 [Bill Stoddard] + + *) Other-child registrations are automatically removed when the + associated pool is destroyed. This avoids garbage in the list + of registrations when a pool with a registration is freed. + [Jeff Trawick] + + *) Allow LTFLAGS to be overridden by the configure command-line + (default="--silent") and introduce LT_LDFLAGS. [Roy Fielding] + + *) Add memory code kindly donated to APR by + Elrond + Luke Kenneth Casson Leighton + Sander Striker + [David Reid] + + *) Fix a problem with the FreeBSD flavor of apr_sendfile() where we + could return APR_EAGAIN+bytes_sent. [Jeff Trawick] + + *) Fix a problem on unixware where clearing h_errno wouldn't work. + Use set_h_errno() instead. PR #7651 [Jeff Trawick] + + *) Add the test and build directories (when present) to the recursive + make process, being sure that they are run last. test is only done + recursively for make *clean targets. [Roy Fielding] + + *) Make the apr_mmap_create() function use the native_flags variable. + This allows us to actually create WRITEABLE MMAPs. + [Ed Korthof ] + + *) Completely revamp configure so that it preserves the standard make + variables CPPFLAGS, CFLAGS, CXXFLAGS, LDFLAGS and LIBS by moving + the configure additions to EXTRA_* variables. Also, allow the user + to specify NOTEST_* values for all of the above, which eliminates the + need for THREAD_CPPFLAGS, THREAD_CFLAGS, and OPTIM. Fix the setting + of INCLUDES and EXTRA_INCLUDES. Check flags as they are added to + avoid pointless duplications. Fix the order in which flags are given + on the compile and link lines. [Roy Fielding] + + *) Fix DSO code on HP/UX. We have to use == not =, and it makes more + sense to actually return errno, so that the return code means + something. [Ryan Bloom] + + *) Clean up conditionals in unix DSO code so that we decide based on + the dynamic loading implementation, which we noticed at configure + time, instead of by operating system. + [Wilfredo Sanchez] + + *) Add DSO support for dyld platforms (Darwin/Mac OS and OpenStep). + [Wilfredo Sanchez] + + *) Amend the time code to better deal with time zones. + [David Reid] + + *) Carefully select an appropriate native type for apr_int64_t and + define its format as APR_INT64_T_FMT and literal using APR_INT64_C(). + [Justin Erenkrantz, William Rowe] + + *) Make clean, distclean, and extraclean consistently according to the + Gnu makefile guidelines. [Justin Erenkrantz ] + + *) Initial implementation of of apr_filepath (get/set/parse_root and + merge) for Windows. [William Rowe] + + *) Cleaned up implementation of of apr_filepath (get/set/parse_root + and merge) for Unix. [Greg Stein, William Rowe] + + *) Fixup the --enable-libtool option. This allows the test directory + to compile again. The test directory still doesn't work when + APR is configured without libtool. [Ryan Bloom] + + *) If we don't have sigwait() in the system, see if sigsuspend() is + available, and use that instead. [Wilfredo Sanchez] + + *) Make libtool optional at configure time. This is done with + --disable-libtool. [Ryan Bloom] + + *) Recognize systems where the TCP_NODELAY setting is inherited from + the listening socket, and optimize apr_setsockopt(APR_TCP_NODELAY) + accordingly. [Jeff Trawick] + + *) Recognize the presence of getnameinfo() on Tru64. [David Reid] + + *) Allow APR to be installed. [Ryan Bloom] + + *) Generate config.nice for easy re-run of configure. [Roy Fielding] + + *) Define preprocessor flags in CPPFLAGS instead of CFLAGS and + bring some sanity to the compiler command-lines. [Roy Fielding] + + *) Use the dso/aix subdirectory for older versions of AIX and fix + a number of bugs in the dso code in that directory. + [Victor Orlikowski] + + *) Allow libtool 1.3b to be used. [Victor Orlikowski] + + *) Misc. Win32 fixes: Set the pool pointer in apr_sockaddr_t + structures created with the apr_socket_t to prevent segfault + in certain apps. Flush unwritten buffered data when the file + is closed. [Jeff Trawick] + + *) Win32: Get APR to compile with MSVC 5.0 (a.k.a. VC97). + PR #7489 [Jeff Trawick] + + *) First draft implementation of apr_filepath (get/set/parse_root + and merge) for Unix. [William Rowe] + + *) Add apr_ipsubnet_create() and apr_ipsubnet_test() for testing + whether or not an address is within a subnet. [Jeff Trawick] + + *) Add apr_sendto and apr_recvfrom for Unix. Start of adding UDP + support. [David Reid] + + *) Add a method to get the password from the system for a given + user. [John Barbee ] + + *) Change the include path order, so that we look for included files + in the APR paths first, and the system paths second. + [jean-frederic clere ] + + *) Add a with-sendfile option, so that people on platforms without a + sendfile implementation for APR can easily disable it from the + configure line. [Ryan Bloom] + + *) Change the check for netinet/tcp.h to work around an issue with + that header file on IRIX 6.5 which prevented it from being + detected. PR #6459 [Jeff Trawick] + + *) Introduce apr_get_userid to return a named user's apr_uid_t and + apr_gid_t across platforms [Cliff Woolley, William Rowe] + + *) In apr_shm_init(), check the retcode from mm_malloc(). Previously, + we segfaulted here if mm_malloc() failed to get a lock. An example + error scenario is when the lock file lives on a filesystem which + doesn't support locking. [Jeff Trawick] + + *) Name protected the autoconf macros defined by APR. Moved the + REENTRANCY_FLAGS settings into apr_hints.m4. Inlined the + APR_PREPARE_MM_DIR macro because it could only be used once. + Removed the unused macros MY_TRY_RUN, MY_TRY_RUN_NATIVE, and + AC_USE_FUNCTION. Added some macro comments. [Roy Fielding] + + *) Cope with BSDi installations where the default make has been + replaced with GNU make. [Joe Orton ] + + *) Changed apr/helpers to apr/build to be consistent with other Apache + source trees. Added make variables to rules.mk.in that point to the + builders directory and its scripts. Updated buildconf, configure.in, + and Makefile.in files to create and use the new scripts. Moved scandoc + to scandoc.pl and its default.pl template to scandoc_template.pl. + [Roy Fielding] + + *) Updated config.guess and config.sub to GNU libtool 1.3.5 features, + with the Apache additions for OS/390 and OS/2 emx. [Roy Fielding] + + *) Moved hints.m4, apr_common.m4, and helpers/apr-conf.m4 into the + new build directory as apr_hints.m4, apr_common.m4, apr_network.m4, + and apr_threads.m4. [Roy Fielding] + + *) Get apr_sendfile() working on HP-UX. This gets APR to build on + HP-UX without having to turn off APR_HAS_SENDFILE. [Jeff Trawick] + + *) Force FreeBSD to compile without threads by default. To enable + threads, use --enable-threads on the configure line. + [Ryan Bloom] + + *) Purge system password buffer before returning from apr_password_get. + No longer abuses bufsize argument on return. [William Rowe] + + *) Moved the prototypes for apr_snprintf and apr_vsnprintf to the + apr_strings.h header, from apr_lib.h. This location makes more + sense. [Ryan Bloom] + + *) Added the APR_TRY_COMPILE_NO_WARNING configure macro for testing a + compile with -Werror as well as the APR_CHECK_ICONV_INBUF macro to + test for annoying iconv prototype differences. + [Jeff Trawick, Roy Fielding] + + *) Fix a problem with configure on NetBSD. We must include sys/types.h + for some platforms. [jun-ichiro hagino ] + + *) Some fixes in the Win32 time support. + (IsLeapYear): New macro for quickly figgerin' out if a given year is a + leap year. (SystemTimeToAprExpTime): Perform the calculation of + tm_yday. Also, negate the sign of the tm_gmtoff field to be + consistent with Unix platforms and APR header file comments. + [Mike Pilato] + + *) Implement WinNT Unix'ish permissions. [William Rowe] + + *) Corrected an OS2'ism of apr_get_home_directory. OS2 now returns the + proper directory, including the user's name. + + *) Removed private os2errno.h and integrated the OS2 network error codes + into apr_errno.h for optimized error tests (APR_STATUS_IS_EFOO(rv)). + [William Rowe] + + *) Moved inclusion of header from multiple modules into apr.h + [William Rowe] + + *) Added apr_compare_users() and apr_compare_groups() for more complex + apr_uid_t and apr_gid_t structures. Enabled both .user and .group + results from WinNT/2000 stat/getfileinfo, but expect to find that + .group is 'None' in most cases. [William Rowe] + + *) Replace configure --with-optim option by using the environment + variable OPTIM instead. This is needed because configure options + do not support multiple flags separated by spaces. [Roy Fielding] + + *) Eliminate the APR_SIG* aliases for standard signal names, + since they serve no useful purpose. [Roy Fielding] + + *) Abstracted apr_get_username and apr_get_groupname for unix and win32. + Modified Win32 apr_uid_t and apr_gid_t to use PSIDs, and elimintated + the uid_t and gid_t definitions. [William Rowe] + + *) Radically refactored apr_stat/lstat/getfileinfo/dir_read for Win32 + to assure we are retrieving what we expect to retrieve, and reporting + the correct result (APR_SUCCESS or APR_INCOMPLETE). The potential + for a bit more optimization still remains. [William Rowe] + + *) While we have the future opportunity to cache the apr_stat'ed file + handle for a very fast open (dup handle) on Win32, patched to close + that file after a stat always. Needs a new semantic before we leave + handles dangling when the user intends to rm. [William Rowe] + + *) Correct Win32 apr_stat/lstat/getfileinfo/dir_read to all zero out + the finfo buffer on success (or incomplete success). [William Rowe] + + *) Fix Win32/Unix apr_lstat to throw the .valid bit APR_FINFO_LINK to + indicate we attempted to open the link. Only the .filetype APR_LNK + reflects if the file found was, in fact, a link. [William Rowe] + + *) Fixed apr_open and apr_rename to function on Win9x. + [Mike Pilato ] + + *) Add apr_open_stdout. This mirrors apr_open_stderr, except it works + on stdout. [Mike Pilato ] + + *) Fix bug in file_io/unix/dir.c. There is no such thing as a dirent, + it must be a struct dirent. + [Kevin Pilch-Bisson ] + + *) Fix the configure script so that we can build from a different + directory. [Kevin Pilch-Bisson ] + + *) Introduce the wanted flag argument to the apr_stat/lstat/getfileinfo + family of functions. This change allows the user to determine what + platform-specific file information is retrieved, to optimize both + portability and performance. [William Rowe] + + *) Fix make depend. [Ryan Bloom] + + *) All dso implementations now register a cleanup to unload the DSO + when it is loaded. If the pool is removed, we really do need to + remove the DSO. In the past, different platforms behaved differently + it this respect. [Ryan Bloom] + + *) Add linkage declarations to the DSO code. + [Gregory Nicholls ] + + *) Some adjustment of hints.m4 setting flags (used to check if null + first) and added some verbosity. [Jim Jagielski] + + *) Specify APR_DECLARE to some of the APR functions. This helps linking + on some operating systems. [Gregory Nicholls ] + + *) Libtool'ized APR and converted all the makefiles to share rules + from helpers/rules.mk. [Greg Stein] + + *) Remove a warning on FreeBSD. FreeBSD defines TCP_NO_PUSH, but we + don't actually use it. This causes os_cork to be defined but not + used. This patch keeps us from defining os_cork and os_uncork on + FreeBSD. [Ryan Bloom] + + *) Keep apr_terminate from seg faulting on terminate. This is + happening on systems that do not NULL out locks when they are + destroyed. To keep this from happening, we set the locks to + NULL after destroying them in apr_terminate, and we have to + check for NULL in free_blocks. + [Allan Edwards and Gregory Nicholls ] + + *) Remove the ability to allocate memory out of a NULL pool. + [Ryan Bloom] + + *) Add an APR_GET_POOL macro to get a pool from any APR type that has + a pool. This requires that ALL apr types put the pool as the first + field in their structure. [Ryan Bloom] + + *) Begin to remove the ability to allocate out of NULL pools. The first + problem to solve, is that we need an apr_lock in order to allocate + pools, so that we can lock things out when allocating. So, how do we + allocate locks without a pool to allocate from? The answer is to create + a global_apr_pool, which is a bootstrapping pool. There should NEVER + be a sub-pool off this pool, and it is static to an APR file. This is + only used to allow us to allocate the locks cleanly, without using the + NULL pool hack. [Ryan Bloom] + + *) Fix a logic error in the poll code when implemented using select. + [Nick Caruso ] + + *) FreeBSD does not support sendfile() in combination with threads + before version 4.2. We no longer even try to support it. + [Ryan Bloom] + + *) On FreeBSD, it is possible for the first call to sendfile to + get EAGAIN, but still send some data. This means that we cannot + call sendfile and then check for EAGAIN, and then wait and call + sendfile again. If we do that, then we are likely to send the + first chunk of data twice, once in the first call and once in the + second. If we are using a timed write, then we check to make sure + we can send data before trying to send it. [Ryan Bloom] + + *) Cleanup to help Apache support programs build cleanly. + [Cliff Woolley ] + + *) Cleanup some compiler warnings on Solaris + [Dale Ghent ] + + *) apr_getaddrinfo() can now return multiple addresses for a host + via the next field in apr_sockaddr_t. [Jeff Trawick] + + *) Tighten up the check for getaddrinfo(). If it can't figure out + the appropriate address family for 127.0.0.1, it fails. + Unfortunately, Tru64 fails this test so we won't do IPv6 on + Tru64. [Jeff Trawick] + + *) Rename apr_opendir to apr_dir_open. [Ryan Bloom] + + *) apr_snprintf()'s %pI format string now takes apr_sockaddr_t * + instead of sockaddr_in *. [Jeff Trawick] + + *) Fix a bug in apr_accept() for Win32 and Unix where the local + apr_sockaddr_t in the new connected socket was not initialized + properly. This could result in a bad string for apr_get_ipaddr(), + among other things. [Jeff Trawick] + + *) Add apr_getnameinfo(), a replacement for apr_get_hostname() which + supports IPv6 and will be friendlier for use with eventual + SOCK_DGRAM support. apr_get_hostname() is gone. [Jeff Trawick] + + +Changes with APR a9 + + *) Removed the iconv implementation from the i18n/unix/iconv branch. + This now resides in the apr-iconv repository, and will be ported + over time to use native apr types (e.g. apr_dso) for portability. + + *) Only support IPv6 if we have sockaddr_in and a working + getaddrinfo(). [Jeff Trawick] + + *) Add apr_parse_addr_port() for parsing the hostname:port portion + of URLs and similar strings. [Jeff Trawick] + + *) Add Win32 MMAP support [William Rowe] + + *) Allow the APR programmer to specify if the MMAP is read-only or + write-able. + [Ryan Bloom and Will Rowe] + + *) Check more carefully for getaddrinfo(). Accept those that + require to be included (e.g., Tru64). Reject those that + fail a very basic operational test (e.g., AIX). [Jeff Trawick] + + *) Add apr_make_os_sock() for constructing a fully-capable APR + socket. [Jeff Trawick] + + *) Make APR's shared memory routines always allocate enough memory + for the requested segment, the MM internal types, and the APR + internal types. + [Ryan Bloom] + + *) Add APR_SIZE_T_FMT. Get the other APR_xx_T_FMT variables + defined properly on AIX. [Jeff Trawick] + + *) network API changes: get rid of apr_get_socket_inaddr(), + apr_get_remote_name(), and apr_get_local_name() [Jeff Trawick] + + *) Add a step at configure time to create a file at the top-level, + apr.exports, which lists every function exported by APR. The + file is generated by a script in helpers, that reads each header + file. + [Ryan Bloom] + + *) Lock config changes: Detect SysV sem capability by the presence of + sempaphore functions, not by the presence of union semun. New + config variable apr_lock_method can override autodetection of the + apr_lock implementation method. For now, hints.m4 uses it to select + SysV semaphores for OS/390. New config variable + apr_process_lock_is_global specifies that the selected inter-process + lock method is sufficient for APR_LOCKALL (i.e., it blocks all + threads and processes). For now, hints.m4 turns on this flag for + OS/390. [Jeff Trawick] + + *) Get APR_OFF_T_FMT defined properly on Solaris Sparc. + [Jeff Trawick] + + +Changes with APR a8 + + *) Change the name of the sa_len field in apr_sockaddr_t to salen. + Some platforms have a macro named sa_len. + [Tony Finch] + + *) apr_set_port(), apr_get_port(), apr_set_ipaddr(), and apr_get_ipaddr() + now take apr_sockaddr_t as a parameter instead of apr_socket_t + + apr_interface_e. This will allow the same routines to be used with + datagram APIs to be added later. Note that code which calls + apr_set_ipaddr() should probably be changed to call apr_getaddrinfo() + for protocol independence. [Jeff Trawick] + + *) apr_create_tcp_socket() has been removed. Use apr_create_socket() + instead. [Jeff Trawick] + + *) Source was moved from the apache-2.0 repository. For all CHANGES + prior to this time, please see the apache-2.0 repository diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/LICENSE b/rubbos/app/httpd-2.0.64/srclib/apr/LICENSE new file mode 100644 index 00000000..af1c4695 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/LICENSE @@ -0,0 +1,370 @@ + 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 PORTABLE RUNTIME SUBCOMPONENTS: + +The Apache Portable Runtime 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. + +From strings/apr_fnmatch.c, include/apr_fnmatch.h, misc/unix/getopt.c, +file_io/unix/mktemp.c, strings/apr_strings.c: + +/* + * Copyright (c) 1987, 1993, 1994 + * The Regents of the University of California. 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University 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 REGENTS 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 REGENTS 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. + +From network_io/unix/inet_ntop.c, network_io/unix/inet_pton.c: + +/* Copyright (c) 1996 by Internet Software Consortium. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS + * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE + * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR + * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS + * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + +From dso/aix/dso.c: + + * Based on libdl (dlfcn.c/dlfcn.h) which is + * Copyright (c) 1992,1993,1995,1996,1997,1988 + * Jens-Uwe Mager, Helios Software GmbH, Hannover, Germany. + * + * Not derived from licensed software. + * + * Permission is granted to freely use, copy, modify, and redistribute + * this software, provided that the author is not construed to be liable + * for any results of using the software, alterations are clearly marked + * as such, and this notice is not modified. + +From strings/apr_strnatcmp.c, include/apr_strings.h: + + strnatcmp.c -- Perform 'natural order' comparisons of strings in C. + Copyright (C) 2000 by Martin Pool + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + +From test/CuTest.c, test/CuTest.h: + + * Copyright (c) 2002-2006 Asim Jalis + * + * This library is released under the zlib/libpng license as described at + * + * http://www.opensource.org/licenses/zlib-license.html + * + * Here is the statement of the license: + * + * This software is provided 'as-is', without any express or implied warranty. + * In no event will the authors be held liable for any damages arising from + * the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software in a + * product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source distribution. + + +From strings/apr_snprintf.c: + + * + * cvt - IEEE floating point formatting routines. + * Derived from UNIX V7, Copyright(C) Caldera International Inc. + * + + Copyright(C) Caldera International Inc. 2001-2002. All rights reserved. + + 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 and documentation 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. + + All advertising materials mentioning features or use of this software + must display the following acknowledgement: + + This product includes software developed or owned by Caldera + International, Inc. + + Neither the name of Caldera International, Inc. nor the names of other + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + USE OF THE SOFTWARE PROVIDED FOR UNDER THIS LICENSE BY CALDERA + INTERNATIONAL, INC. 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 CALDERA INTERNATIONAL, INC. 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. + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/Makefile b/rubbos/app/httpd-2.0.64/srclib/apr/Makefile new file mode 100644 index 00000000..ad3c4319 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/Makefile @@ -0,0 +1,149 @@ +# +# APR (Apache Portable Runtime) library Makefile. +# +CPP = gcc -E + +# get substituted into some targets +APR_MAJOR_VERSION=0 + +# +# Macros for supporting directories +# +INCDIR=./include +INCDIR1=../include +INCLUDES=-I$(INCDIR) -I$(INCDIR1) + +# +# Macros for target determination +# +SUBDIRS=strings passwd tables file_io/unix network_io/unix threadproc/unix misc/unix locks/unix time/unix mmap/unix shmem/unix user/unix memory/unix atomic/unix poll/unix support/unix dso/unix +CLEAN_SUBDIRS= . test build +INSTALL_SUBDIRS=none + +TARGET_LIB = libapr-${APR_MAJOR_VERSION}.la + +# +# Rules for building specific targets, starting with 'all' for +# building the entire package. +# +TARGETS = delete-lib $(TARGET_LIB) delete-exports export_vars.c apr.exp + +# bring in rules.mk for standard functionality +include /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/build/apr_rules.mk + +CLEAN_TARGETS = apr.exp exports.c export_vars.c apr-config.out \ + build/apr_rules.out +DISTCLEAN_TARGETS = config.cache config.log config.status \ + include/apr.h include/arch/unix/apr_private.h \ + libtool apr-config +EXTRACLEAN_TARGETS = configure aclocal.m4 include/arch/unix/apr_private.h.in + +prefix=/bottlenecks/rubbos/app/apache2 +exec_prefix=/bottlenecks/rubbos/app/apache2 +bindir=${prefix}/bin +libdir=${prefix}/lib +includedir=/bottlenecks/rubbos/app/apache2/include +installbuilddir=${prefix}/build +srcdir=. + +top_srcdir=/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr +top_blddir=/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr + +EXPORT_FILES = $(top_srcdir)/include/*.h + +delete-lib: + @if test -f $(TARGET_LIB); then \ + for i in $(SUBDIRS); do objects="$$objects $$i/*.lo"; done ; \ + if test -n "`find $$objects -newer $(TARGET_LIB)`"; then \ + echo Found newer objects. Will relink $(TARGET_LIB). ; \ + echo $(RM) -f $(TARGET_LIB) ; \ + $(RM) -f $(TARGET_LIB) ; \ + fi \ + fi + +# Create apr-config script suitable for the install tree +apr-config.out: apr-config + sed 's,^\(location=\).*$$,\1installed,' < apr-config > $@ + +# Create apr_rules.mk suitable for the install tree +build/apr_rules.out: build/apr_rules.mk + sed 's,^\(apr_build.*=\).*$$,\1$(installbuilddir),' < build/apr_rules.mk > $@ + +install: $(TARGET_LIB) apr-config.out build/apr_rules.out + if [ ! -d $(DESTDIR)$(includedir) ]; then \ + $(top_srcdir)/build/mkdir.sh $(DESTDIR)$(includedir); \ + fi; + cp -p $(top_srcdir)/include/*.h $(DESTDIR)$(includedir); + + if test -n "$(top_blddir)"; then \ + cp -p $(top_blddir)/include/*.h $(DESTDIR)$(includedir); \ + fi; + if [ ! -d $(DESTDIR)$(libdir) ]; then \ + $(top_srcdir)/build/mkdir.sh $(DESTDIR)$(libdir); \ + fi; + $(LIBTOOL) --mode=install cp $(TARGET_LIB) $(DESTDIR)$(libdir) + $(LIBTOOL) --mode=install cp apr.exp $(DESTDIR)$(libdir) + if [ ! -d $(DESTDIR)$(installbuilddir) ]; then \ + $(top_srcdir)/build/mkdir.sh $(DESTDIR)$(installbuilddir); \ + fi; + if [ -f libtool ]; then \ + $(LIBTOOL) --mode=install cp libtool $(DESTDIR)$(installbuilddir); \ + fi; + if [ -f shlibtool ]; then \ + $(LIBTOOL) --mode=install cp shlibtool $(DESTDIR)$(installbuilddir); \ + fi; + for f in mkdir.sh make_exports.awk make_var_export.awk; do \ + cp $(top_srcdir)/build/$${f} $(DESTDIR)$(installbuilddir); \ + done + cp build/apr_rules.out $(DESTDIR)$(installbuilddir)/apr_rules.mk + if [ ! -d $(DESTDIR)$(bindir) ]; then \ + $(top_srcdir)/build/mkdir.sh $(DESTDIR)$(bindir); \ + fi; + $(LIBTOOL) --mode=install cp apr-config.out $(DESTDIR)$(bindir)/apr-config + chmod 755 $(DESTDIR)$(bindir)/apr-config + @if [ $(INSTALL_SUBDIRS) != "none" ]; then \ + for i in $(INSTALL_SUBDIRS); do \ + ( cd $$i ; $(MAKE) DESTDIR=$(DESTDIR) install ); \ + done \ + fi + +$(TARGET_LIB): + @for i in $(SUBDIRS); do objects="$$objects $$i/*.lo"; done ; \ + tmpcmd="$(LINK) -rpath $(libdir) $$objects $(ALL_LIBS)"; \ + echo $$tmpcmd; \ + $$tmpcmd && touch $@ + +delete-exports: + @if test -f apr.exp; then \ + headers="`find include/*.h -newer apr.exp`" ; \ + if test -n "$$headers"; then \ + echo Found newer headers. Will rebuild apr.exp. ; \ + echo $(RM) -f apr.exp exports.c export_vars.h ; \ + $(RM) -f apr.exp exports.c export_vars.h ; \ + fi \ + fi + +exports.c: + $(APR_MKEXPORT) $(EXPORT_FILES) > $@ + +export_vars.c: + $(APR_MKVAREXPORT) $(EXPORT_FILES) > $@ + +apr.exp: exports.c export_vars.c + @echo "#! libapr-${APR_MAJOR_VERSION}.so" > $@ + @echo "* This file was AUTOGENERATED at build time." >> $@ + @echo "* Please do not edit by hand." >> $@ + $(CPP) $(ALL_CPPFLAGS) $(ALL_INCLUDES) exports.c | grep "ap_hack_" | sed -e 's/^.*[)]\(.*\);$$/\1/' >> $@ + $(CPP) $(ALL_CPPFLAGS) $(ALL_INCLUDES) export_vars.c | sed -e 's/^\#[^!]*//' | sed -e '/^$$/d' >> $@ + +dox: + doxygen $(top_srcdir)/docs/doxygen.conf + +check: $(TARGET_LIB) + (cd test && $(MAKE) check) + +# DO NOT REMOVE +docs: $(INCDIR)/*.h + +.PHONY: delete-lib delete-exports +.NOTPARALLEL: delete-lib delete-exports diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/Makefile.in b/rubbos/app/httpd-2.0.64/srclib/apr/Makefile.in new file mode 100644 index 00000000..42139ea9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/Makefile.in @@ -0,0 +1,149 @@ +# +# APR (Apache Portable Runtime) library Makefile. +# +CPP = @CPP@ + +# get substituted into some targets +APR_MAJOR_VERSION=@APR_MAJOR_VERSION@ + +# +# Macros for supporting directories +# +INCDIR=./include +INCDIR1=../include +INCLUDES=-I$(INCDIR) -I$(INCDIR1) + +# +# Macros for target determination +# +SUBDIRS=@SUBDIRS@ +CLEAN_SUBDIRS= . test build +INSTALL_SUBDIRS=@INSTALL_SUBDIRS@ + +TARGET_LIB = lib@APR_LIBNAME@.la + +# +# Rules for building specific targets, starting with 'all' for +# building the entire package. +# +TARGETS = delete-lib $(TARGET_LIB) delete-exports export_vars.c apr.exp + +# bring in rules.mk for standard functionality +@INCLUDE_RULES@ + +CLEAN_TARGETS = apr.exp exports.c export_vars.c apr-config.out \ + build/apr_rules.out +DISTCLEAN_TARGETS = config.cache config.log config.status \ + include/apr.h include/arch/unix/apr_private.h \ + libtool apr-config +EXTRACLEAN_TARGETS = configure aclocal.m4 include/arch/unix/apr_private.h.in + +prefix=@prefix@ +exec_prefix=@exec_prefix@ +bindir=@bindir@ +libdir=@libdir@ +includedir=@includedir@ +installbuilddir=@installbuilddir@ +srcdir=@srcdir@ +VPATH=@srcdir@ +top_srcdir=@apr_srcdir@ +top_blddir=@apr_builddir@ + +EXPORT_FILES = $(top_srcdir)/include/*.h + +delete-lib: + @if test -f $(TARGET_LIB); then \ + for i in $(SUBDIRS); do objects="$$objects $$i/*.@so_ext@"; done ; \ + if test -n "`find $$objects -newer $(TARGET_LIB)`"; then \ + echo Found newer objects. Will relink $(TARGET_LIB). ; \ + echo $(RM) -f $(TARGET_LIB) ; \ + $(RM) -f $(TARGET_LIB) ; \ + fi \ + fi + +# Create apr-config script suitable for the install tree +apr-config.out: apr-config + sed 's,^\(location=\).*$$,\1installed,' < apr-config > $@ + +# Create apr_rules.mk suitable for the install tree +build/apr_rules.out: build/apr_rules.mk + sed 's,^\(apr_build.*=\).*$$,\1$(installbuilddir),' < build/apr_rules.mk > $@ + +install: $(TARGET_LIB) apr-config.out build/apr_rules.out + if [ ! -d $(DESTDIR)$(includedir) ]; then \ + $(top_srcdir)/build/mkdir.sh $(DESTDIR)$(includedir); \ + fi; + cp -p $(top_srcdir)/include/*.h $(DESTDIR)$(includedir); + + if test -n "$(top_blddir)"; then \ + cp -p $(top_blddir)/include/*.h $(DESTDIR)$(includedir); \ + fi; + if [ ! -d $(DESTDIR)$(libdir) ]; then \ + $(top_srcdir)/build/mkdir.sh $(DESTDIR)$(libdir); \ + fi; + $(LIBTOOL) --mode=install cp $(TARGET_LIB) $(DESTDIR)$(libdir) + $(LIBTOOL) --mode=install cp apr.exp $(DESTDIR)$(libdir) + if [ ! -d $(DESTDIR)$(installbuilddir) ]; then \ + $(top_srcdir)/build/mkdir.sh $(DESTDIR)$(installbuilddir); \ + fi; + if [ -f libtool ]; then \ + $(LIBTOOL) --mode=install cp libtool $(DESTDIR)$(installbuilddir); \ + fi; + if [ -f shlibtool ]; then \ + $(LIBTOOL) --mode=install cp shlibtool $(DESTDIR)$(installbuilddir); \ + fi; + for f in mkdir.sh make_exports.awk make_var_export.awk; do \ + cp $(top_srcdir)/build/$${f} $(DESTDIR)$(installbuilddir); \ + done + cp build/apr_rules.out $(DESTDIR)$(installbuilddir)/apr_rules.mk + if [ ! -d $(DESTDIR)$(bindir) ]; then \ + $(top_srcdir)/build/mkdir.sh $(DESTDIR)$(bindir); \ + fi; + $(LIBTOOL) --mode=install cp apr-config.out $(DESTDIR)$(bindir)/apr-config + chmod 755 $(DESTDIR)$(bindir)/apr-config + @if [ $(INSTALL_SUBDIRS) != "none" ]; then \ + for i in $(INSTALL_SUBDIRS); do \ + ( cd $$i ; $(MAKE) DESTDIR=$(DESTDIR) install ); \ + done \ + fi + +$(TARGET_LIB): + @for i in $(SUBDIRS); do objects="$$objects $$i/*.@so_ext@"; done ; \ + tmpcmd="$(LINK) @lib_target@ $(ALL_LIBS)"; \ + echo $$tmpcmd; \ + $$tmpcmd && touch $@ + +delete-exports: + @if test -f apr.exp; then \ + headers="`find include/*.h -newer apr.exp`" ; \ + if test -n "$$headers"; then \ + echo Found newer headers. Will rebuild apr.exp. ; \ + echo $(RM) -f apr.exp exports.c export_vars.h ; \ + $(RM) -f apr.exp exports.c export_vars.h ; \ + fi \ + fi + +exports.c: + $(APR_MKEXPORT) $(EXPORT_FILES) > $@ + +export_vars.c: + $(APR_MKVAREXPORT) $(EXPORT_FILES) > $@ + +apr.exp: exports.c export_vars.c + @echo "#! lib@APR_LIBNAME@.so" > $@ + @echo "* This file was AUTOGENERATED at build time." >> $@ + @echo "* Please do not edit by hand." >> $@ + $(CPP) $(ALL_CPPFLAGS) $(ALL_INCLUDES) exports.c | grep "ap_hack_" | sed -e 's/^.*[)]\(.*\);$$/\1/' >> $@ + $(CPP) $(ALL_CPPFLAGS) $(ALL_INCLUDES) export_vars.c | sed -e 's/^\#[^!]*//' | sed -e '/^$$/d' >> $@ + +dox: + doxygen $(top_srcdir)/docs/doxygen.conf + +check: $(TARGET_LIB) + (cd test && $(MAKE) check) + +# DO NOT REMOVE +docs: $(INCDIR)/*.h + +.PHONY: delete-lib delete-exports +.NOTPARALLEL: delete-lib delete-exports diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/NOTICE b/rubbos/app/httpd-2.0.64/srclib/apr/NOTICE new file mode 100644 index 00000000..1e0abd3a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/NOTICE @@ -0,0 +1,15 @@ +Apache Portable Runtime +Copyright (c) 2009 The Apache Software Foundation. + +This product includes software developed by +The Apache Software Foundation (http://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. + +This software contains code derived from UNIX V7, Copyright(C) +Caldera International Inc. diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/NWGNUmakefile b/rubbos/app/httpd-2.0.64/srclib/apr/NWGNUmakefile new file mode 100644 index 00000000..49830ca8 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/NWGNUmakefile @@ -0,0 +1,440 @@ +# +# Declare the sub-directories to be built here +# + +SUBDIRS = \ + build \ + ..\apr-util \ + $(EOLIST) + +# +# Get the 'head' of the build environment. This includes default targets and +# paths to tools +# + +include $(APR_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_WORK)/include \ + $(APR_WORK)/include/arch/NetWare \ + $(APR_WORK)/include/arch/unix \ + $(APR_WORK)/memory/unix \ + $(APRUTIL)/xml \ + $(EOLIST) + +# +# These flags will come after CFLAGS +# +XCFLAGS += \ + $(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 = aprlib + +# +# This is used by the link '-desc ' directive. +# If left blank, NLM_NAME will be used. +# +NLM_DESCRIPTION = Apache Portability Runtime Library $(VERSION_STR) + +# +# This is used by the '-threadname' directive. If left blank, +# NLM_NAME Thread will be used. +# +NLM_THREAD_NAME = +# +# If this is specified, it will override VERSION value in +# $(APR_WORK)\build\NWGNUenvironment.inc +# +NLM_VERSION = + +# +# If this is specified, it will override the default of 64K +# +NLM_STACK_SIZE = + +# +# If this is specified it will be used by the link '-entry' directive +# +NLM_ENTRY_SYM = _LibCPrelude + +# +# If this is specified it will be used by the link '-exit' directive +# +NLM_EXIT_SYM = _LibCPostlude + +# +# If this is specified it will be used by the link '-check' directive +# +NLM_CHECK_SYM = + +# +# If this is specified it will be used by the link '-flags' directive +# +NLM_FLAGS = AUTOUNLOAD, PSEUDOPREEMPTION + +# +# If this is specified it will be linked in with the XDCData option in the def +# file instead of the default of $(APR)/misc/netware/apache.xdc. XDCData can +# be disabled by setting APACHE_UNIPROC in the environment +# +XDCDATA = + +# +# Declare all target files (you must add your files here) +# + +# +# If there is an NLM target, put it here +# +TARGET_nlm = \ + $(OBJDIR)/aprlib.nlm \ + $(EOLIST) + +# +# If there is an LIB target, put it here +# +TARGET_lib = \ + $(OBJDIR)/aprlib.lib \ + $(EOLIST) + +# +# These are the OBJ files needed to create the NLM target above. +# Paths must all use the '/' character +# +FILES_nlm_objs = \ + $(OBJDIR)/libprews.o \ + $(EOLIST) + +# +# 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 = \ + libcpre.o \ + $(APRLIB) \ + $(APRUTLIB) \ + $(XMLLIB) \ + $(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 = \ + Libc \ + ws2_32 \ + $(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 = \ + @libc.imp \ + @ws2nlm.imp \ + @netware.imp \ + WSAStartupRTags \ + WSACleanupRTag \ + $(EOLIST) + +# +# Any symbols exported to here +# +FILES_nlm_exports = \ + @aprlib.imp \ + $(EOLIST) + +# +# These are the OBJ files needed to create the LIB target above. +# Paths must all use the '/' character +# +FILES_lib_objs = \ + $(OBJDIR)/apr_cpystrn.o \ + $(OBJDIR)/apr_fnmatch.o \ + $(OBJDIR)/apr_getpass.o \ + $(OBJDIR)/apr_hash.o \ + $(OBJDIR)/apr_pools.o \ + $(OBJDIR)/apr_snprintf.o \ + $(OBJDIR)/apr_strings.o \ + $(OBJDIR)/apr_strnatcmp.o \ + $(OBJDIR)/apr_strtok.o \ + $(OBJDIR)/apr_tables.o \ + $(OBJDIR)/charset.o \ + $(OBJDIR)/copy.o \ + $(OBJDIR)/common.o \ + $(OBJDIR)/dir.o \ + $(OBJDIR)/dso.o \ + $(OBJDIR)/errorcodes.o \ + $(OBJDIR)/env.o \ + $(OBJDIR)/fileacc.o \ + $(OBJDIR)/filedup.o \ + $(OBJDIR)/filepath.o \ + $(OBJDIR)/filepath_util.o \ + $(OBJDIR)/filestat.o \ + $(OBJDIR)/filesys.o \ + $(OBJDIR)/flock.o \ + $(OBJDIR)/fullrw.o \ + $(OBJDIR)/getopt.o \ + $(OBJDIR)/groupinfo.o \ + $(OBJDIR)/inet_pton.o \ + $(OBJDIR)/inet_ntop.o \ + $(OBJDIR)/libprews.o \ + $(OBJDIR)/mktemp.o \ + $(OBJDIR)/mmap.o \ + $(OBJDIR)/open.o \ + $(OBJDIR)/pipe.o \ + $(OBJDIR)/otherchild.o \ + $(OBJDIR)/poll.o \ + $(OBJDIR)/pollacc.o \ + $(OBJDIR)/proc.o \ + $(OBJDIR)/procsup.o \ + $(OBJDIR)/proc_mutex.o \ + $(OBJDIR)/rand.o \ + $(OBJDIR)/readwrite.o \ + $(OBJDIR)/seek.o \ + $(OBJDIR)/sendrecv.o \ + $(OBJDIR)/shm.o \ + $(OBJDIR)/signals.o \ + $(OBJDIR)/sockaddr.o \ + $(OBJDIR)/sockets.o \ + $(OBJDIR)/sockopt.o \ + $(OBJDIR)/start.o \ + $(OBJDIR)/tempdir.o \ + $(OBJDIR)/thread.o \ + $(OBJDIR)/thread_cond.o \ + $(OBJDIR)/thread_mutex.o \ + $(OBJDIR)/thread_rwlock.o \ + $(OBJDIR)/threadpriv.o \ + $(OBJDIR)/time.o \ + $(OBJDIR)/timestr.o \ + $(OBJDIR)/userinfo.o \ + $(OBJDIR)/version.o \ + $(OBJDIR)/waitio.o \ + $(EOLIST) + + +# +# 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 $(APR_WORK)\build\NWGNUhead.inc for examples) +# +install :: nlms $(INSTDIRS) FORCE + copy $(OBJDIR)\aprlib.nlm $(INSTALLBASE)\*.* +ifndef DEST + -copy $(subst /,\,$(APR))\STATUS $(INSTALLBASE)\*.apr + -copy $(subst /,\,$(APR))\LICENSE $(INSTALLBASE)\* + -copy $(subst /,\,$(APR))\CHANGES $(INSTALLBASE)\*.apr + -copy $(subst /,\,$(APRUTIL))\STATUS $(INSTALLBASE)\*.apu + -copy $(subst /,\,$(APRUTIL))\CHANGES $(INSTALLBASE)\*.apu + @echo rem copying the docs directories > xc.bat + @echo xcopy docs $(INSTALLBASE)\docs\*.* $(XCOPYSW) >> xc.bat + $(CMD) xc.bat + $(DEL) xc.bat + +endif + +$(INSTDIRS) :: + $(CHKNOT) $@\NUL mkdir $@ + +ifndef DEST +installdev :: $(INSTDEVDIRS) FORCE + -copy $(subst /,\,$(APR))\include\*.h $(INSTALLBASE)\include\*.* + -copy $(subst /,\,$(APRUTIL))\include\*.h $(INSTALLBASE)\include\*.* + -copy $(subst /,\,$(APR))\*.imp $(INSTALLBASE)\lib\*.* + -copy $(subst /,\,$(APR))\misc\netware\*.xdc $(INSTALLBASE)\lib\*.* + +$(INSTDEVDIRS) :: + $(CHKNOT) $@\NUL mkdir $@ +endif + +# +# Any specialized rules here +# + +$(OBJDIR)/%.o: strings/%.c $(OBJDIR)\$(NLM_NAME)_cc.opt + @echo Compiling $< + $(CC) strings\$( +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Static Library" 0x0104 + +CFG=apr - 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 "apr.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 "apr.mak" CFG="apr - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "apr - Win32 Release" (based on "Win32 (x86) Static Library") +!MESSAGE "apr - Win32 Debug" (based on "Win32 (x86) Static Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "apr - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "LibR" +# PROP BASE Intermediate_Dir "LibR" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "LibR" +# PROP Intermediate_Dir "LibR" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "./include" /I "./include/arch" /I "./include/arch/win32" /I "./include/arch/unix" /D "NDEBUG" /D "APR_DECLARE_STATIC" /D "WIN32" /D "_WINDOWS" /Fd"LibR\apr_src" /FD /c +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo + +!ELSEIF "$(CFG)" == "apr - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "LibD" +# PROP BASE Intermediate_Dir "LibD" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "LibD" +# PROP Intermediate_Dir "LibD" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "./include" /I "./include/arch" /I "./include/arch/win32" /I "./include/arch/unix" /D "_DEBUG" /D "APR_DECLARE_STATIC" /D "WIN32" /D "_WINDOWS" /Fd"LibD\apr_src" /FD /c +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo + +!ENDIF + +# Begin Target + +# Name "apr - Win32 Release" +# Name "apr - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter ".c" +# Begin Group "dso" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\dso\win32\dso.c +# End Source File +# End Group +# Begin Group "file_io" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\file_io\unix\copy.c +# End Source File +# Begin Source File + +SOURCE=.\file_io\win32\dir.c +# End Source File +# Begin Source File + +SOURCE=.\file_io\unix\fileacc.c +# End Source File +# Begin Source File + +SOURCE=.\file_io\win32\filedup.c +# End Source File +# Begin Source File + +SOURCE=.\file_io\win32\filepath.c +# End Source File +# Begin Source File + +SOURCE=.\file_io\unix\filepath_util.c +# End Source File +# Begin Source File + +SOURCE=.\file_io\win32\filestat.c +# End Source File +# Begin Source File + +SOURCE=.\file_io\win32\filesys.c +# End Source File +# Begin Source File + +SOURCE=.\file_io\win32\flock.c +# End Source File +# Begin Source File + +SOURCE=.\file_io\unix\fullrw.c +# End Source File +# Begin Source File + +SOURCE=.\file_io\unix\mktemp.c +# End Source File +# Begin Source File + +SOURCE=.\file_io\win32\open.c +# End Source File +# Begin Source File + +SOURCE=.\file_io\win32\pipe.c +# End Source File +# Begin Source File + +SOURCE=.\file_io\win32\readwrite.c +# End Source File +# Begin Source File + +SOURCE=.\file_io\win32\seek.c +# End Source File +# Begin Source File + +SOURCE=.\file_io\unix\tempdir.c +# End Source File +# End Group +# Begin Group "locks" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\locks\win32\proc_mutex.c +# End Source File +# Begin Source File + +SOURCE=.\locks\win32\thread_cond.c +# End Source File +# Begin Source File + +SOURCE=.\locks\win32\thread_mutex.c +# End Source File +# Begin Source File + +SOURCE=.\locks\win32\thread_rwlock.c +# End Source File +# End Group +# Begin Group "memory" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\memory\unix\apr_pools.c +# End Source File +# End Group +# Begin Group "misc" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\misc\win32\apr_app.c +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File + +SOURCE=.\misc\win32\charset.c +# End Source File +# Begin Source File + +SOURCE=.\misc\win32\env.c +# End Source File +# Begin Source File + +SOURCE=.\misc\unix\errorcodes.c +# End Source File +# Begin Source File + +SOURCE=.\misc\unix\getopt.c +# End Source File +# Begin Source File + +SOURCE=.\misc\win32\internal.c +# End Source File +# Begin Source File + +SOURCE=.\misc\win32\misc.c +# End Source File +# Begin Source File + +SOURCE=.\misc\unix\otherchild.c +# End Source File +# Begin Source File + +SOURCE=.\misc\win32\rand.c +# End Source File +# Begin Source File + +SOURCE=.\misc\win32\start.c +# End Source File +# Begin Source File + +SOURCE=.\misc\win32\utf8.c +# End Source File +# Begin Source File + +SOURCE=.\misc\unix\version.c +# End Source File +# End Group +# Begin Group "mmap" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\mmap\unix\common.c +# End Source File +# Begin Source File + +SOURCE=.\mmap\win32\mmap.c +# End Source File +# End Group +# Begin Group "network_io" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\network_io\unix\inet_ntop.c +# End Source File +# Begin Source File + +SOURCE=.\network_io\unix\inet_pton.c +# End Source File +# Begin Source File + +SOURCE=.\poll\unix\poll.c +# End Source File +# Begin Source File + +SOURCE=.\poll\unix\pollacc.c +# End Source File +# Begin Source File + +SOURCE=.\network_io\win32\sendrecv.c +# End Source File +# Begin Source File + +SOURCE=.\network_io\unix\sockaddr.c +# End Source File +# Begin Source File + +SOURCE=.\network_io\win32\sockets.c +# End Source File +# Begin Source File + +SOURCE=.\network_io\win32\sockopt.c +# End Source File +# End Group +# Begin Group "passwd" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\passwd\apr_getpass.c +# End Source File +# End Group +# Begin Group "shmem" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\shmem\win32\shm.c +# End Source File +# End Group +# Begin Group "strings" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\strings\apr_cpystrn.c +# End Source File +# Begin Source File + +SOURCE=.\strings\apr_fnmatch.c +# End Source File +# Begin Source File + +SOURCE=.\strings\apr_snprintf.c +# End Source File +# Begin Source File + +SOURCE=.\strings\apr_strings.c +# End Source File +# Begin Source File + +SOURCE=.\strings\apr_strnatcmp.c +# End Source File +# Begin Source File + +SOURCE=.\strings\apr_strtok.c +# End Source File +# End Group +# Begin Group "tables" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\tables\apr_hash.c +# End Source File +# Begin Source File + +SOURCE=.\tables\apr_tables.c +# End Source File +# End Group +# Begin Group "threadproc" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\threadproc\win32\proc.c +# End Source File +# Begin Source File + +SOURCE=.\threadproc\win32\signals.c +# End Source File +# Begin Source File + +SOURCE=.\threadproc\win32\thread.c +# End Source File +# Begin Source File + +SOURCE=.\threadproc\win32\threadpriv.c +# End Source File +# End Group +# Begin Group "time" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\time\win32\access.c +# End Source File +# Begin Source File + +SOURCE=.\time\win32\time.c +# End Source File +# Begin Source File + +SOURCE=.\time\win32\timestr.c +# End Source File +# End Group +# Begin Group "user" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\user\win32\groupinfo.c +# End Source File +# Begin Source File + +SOURCE=.\user\win32\userinfo.c +# End Source File +# End Group +# End Group +# Begin Group "Private Header Files" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\include\arch\win32\apr_arch_atime.h +# End Source File +# Begin Source File + +SOURCE=.\include\arch\win32\apr_arch_dso.h +# End Source File +# Begin Source File + +SOURCE=.\include\arch\win32\apr_arch_file_io.h +# End Source File +# Begin Source File + +SOURCE=.\include\arch\win32\apr_arch_inherit.h +# End Source File +# Begin Source File + +SOURCE=.\include\arch\win32\apr_arch_misc.h +# End Source File +# Begin Source File + +SOURCE=.\include\arch\win32\apr_arch_networkio.h +# End Source File +# Begin Source File + +SOURCE=.\include\arch\win32\apr_arch_thread_mutex.h +# End Source File +# Begin Source File + +SOURCE=.\include\arch\win32\apr_arch_thread_rwlock.h +# End Source File +# Begin Source File + +SOURCE=.\include\arch\win32\apr_arch_threadproc.h +# End Source File +# Begin Source File + +SOURCE=.\include\arch\win32\apr_arch_utf8.h +# End Source File +# Begin Source File + +SOURCE=.\include\arch\win32\apr_private.h +# End Source File +# Begin Source File + +SOURCE=.\include\arch\apr_private_common.h +# End Source File +# End Group +# Begin Group "Public Header Files" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\include\apr.h.in +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File + +SOURCE=.\include\apr.hnw +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File + +SOURCE=.\include\apr.hw + +!IF "$(CFG)" == "apr - Win32 Release" + +# Begin Custom Build - Creating apr.h from apr.hw +InputPath=.\include\apr.hw + +".\include\apr.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + type .\include\apr.hw > .\include\apr.h + +# End Custom Build + +!ELSEIF "$(CFG)" == "apr - Win32 Debug" + +# Begin Custom Build - Creating apr.h from apr.hw +InputPath=.\include\apr.hw + +".\include\apr.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + type .\include\apr.hw > .\include\apr.h + +# End Custom Build + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\include\apr_allocator.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_atomic.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_compat.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_dso.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_env.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_errno.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_file_info.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_file_io.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_fnmatch.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_general.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_getopt.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_global_mutex.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_hash.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_inherit.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_lib.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_mmap.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_network_io.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_poll.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_pools.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_portable.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_proc_mutex.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_ring.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_shm.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_signal.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_strings.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_support.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_tables.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_thread_cond.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_thread_mutex.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_thread_proc.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_thread_rwlock.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_time.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_user.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_version.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_want.h +# End Source File +# End Group +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/apr.dsw b/rubbos/app/httpd-2.0.64/srclib/apr/apr.dsw new file mode 100644 index 00000000..dc0871bb --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/apr.dsw @@ -0,0 +1,71 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "apr"=".\apr.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "apr_app"=".\build\apr_app.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name apr + End Project Dependency +}}} + +############################################################################### + +Project: "libapr"=".\libapr.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "libapr_app"=".\build\libapr_app.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/apr.exp b/rubbos/app/httpd-2.0.64/srclib/apr/apr.exp new file mode 100644 index 00000000..830875dc --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/apr.exp @@ -0,0 +1,419 @@ +#! libapr-0.so +* This file was AUTOGENERATED at build time. +* Please do not edit by hand. +apr_allocator_create +apr_allocator_destroy +apr_allocator_alloc +apr_allocator_free +apr_allocator_owner_set +apr_allocator_set_owner +apr_allocator_owner_get +apr_allocator_get_owner +apr_allocator_max_free_set +apr_allocator_set_max_free +apr_allocator_mutex_set +apr_allocator_set_mutex +apr_allocator_mutex_get +apr_allocator_get_mutex +apr_dso_load +apr_dso_unload +apr_dso_sym +apr_dso_error +apr_env_get +apr_env_set +apr_env_delete +apr_strerror +apr_stat +apr_lstat +apr_dir_open +apr_dir_close +apr_dir_read +apr_dir_rewind +apr_filepath_root +apr_filepath_merge +apr_filepath_list_split +apr_filepath_list_merge +apr_filepath_get +apr_filepath_set +apr_filepath_encoding +apr_file_open +apr_file_close +apr_file_remove +apr_file_rename +apr_file_copy +apr_file_append +apr_file_eof +apr_file_open_stderr +apr_file_open_stdout +apr_file_open_stdin +apr_file_read +apr_file_write +apr_file_writev +apr_file_read_full +apr_file_write_full +apr_file_putc +apr_file_getc +apr_file_ungetc +apr_file_gets +apr_file_puts +apr_file_flush +apr_file_dup +apr_file_dup2 +apr_file_setaside +apr_file_seek +apr_file_pipe_create +apr_file_namedpipe_create +apr_file_pipe_timeout_get +apr_file_pipe_timeout_set +apr_file_lock +apr_file_unlock +apr_file_name_get +apr_file_data_get +apr_file_data_set +apr_file_printf +apr_file_perms_set +apr_file_attrs_set +apr_file_mtime_set +apr_dir_make +apr_dir_make_recursive +apr_dir_remove +apr_file_info_get +apr_file_trunc +apr_file_flags_get +apr_file_pool_get +apr_file_inherit_set +apr_file_set_inherit +apr_file_inherit_unset +apr_file_unset_inherit +apr_file_mktemp +apr_temp_dir_get +apr_fnmatch +apr_fnmatch_test +apr_is_fnmatch +apr_initialize +apr_app_initialize +apr_terminate +apr_terminate2 +apr_generate_random_bytes +apr_getopt_init +apr_getopt +apr_getopt_long +apr_global_mutex_create +apr_global_mutex_child_init +apr_global_mutex_lock +apr_global_mutex_trylock +apr_global_mutex_unlock +apr_global_mutex_destroy +apr_global_mutex_pool_get +apr_hash_make +apr_hash_copy +apr_hash_set +apr_hash_get +apr_hash_first +apr_hash_next +apr_hash_this +apr_hash_count +apr_hash_overlay +apr_hash_merge +apr_hash_pool_get +apr_filepath_name_get +apr_filename_of_pathname +apr_vformatter +apr_password_get +apr_mmap_create +apr_mmap_dup +apr_mmap_delete +apr_mmap_offset +apr_socket_create +apr_socket_create_ex +apr_socket_shutdown +apr_shutdown +apr_socket_close +apr_socket_bind +apr_bind +apr_socket_listen +apr_listen +apr_socket_accept +apr_accept +apr_socket_connect +apr_connect +apr_sockaddr_info_get +apr_getnameinfo +apr_parse_addr_port +apr_gethostname +apr_socket_data_get +apr_socket_data_set +apr_socket_send +apr_send +apr_socket_sendv +apr_sendv +apr_socket_sendto +apr_sendto +apr_socket_recvfrom +apr_recvfrom +apr_socket_sendfile +apr_sendfile +apr_socket_recv +apr_recv +apr_socket_opt_set +apr_setsocketopt +apr_socket_timeout_set +apr_socket_opt_get +apr_getsocketopt +apr_socket_timeout_get +apr_socket_atmark +apr_socket_addr_get +apr_sockaddr_port_set +apr_sockaddr_port_get +apr_sockaddr_ip_set +apr_sockaddr_ip_get +apr_sockaddr_equal +apr_socket_from_file +apr_getservbyname +apr_ipsubnet_create +apr_ipsubnet_test +apr_socket_protocol_get +apr_socket_inherit_set +apr_socket_set_inherit +apr_socket_inherit_unset +apr_socket_unset_inherit +apr_poll_setup +apr_poll +apr_poll_socket_add +apr_poll_socket_mask +apr_poll_socket_remove +apr_poll_socket_clear +apr_poll_revents_get +apr_pollset_create +apr_pollset_destroy +apr_pollset_add +apr_pollset_remove +apr_pollset_poll +apr_pool_initialize +apr_pool_terminate +apr_pool_create_ex +apr_pool_create_ex_debug +apr_pool_allocator_get +apr_pool_clear +apr_pool_clear_debug +apr_pool_destroy +apr_pool_destroy_debug +apr_palloc +apr_palloc_debug +apr_pcalloc_debug +apr_pool_abort_set +apr_pool_set_abort +apr_pool_abort_get +apr_pool_get_abort +apr_pool_parent_get +apr_pool_get_parent +apr_pool_is_ancestor +apr_pool_tag +apr_pool_userdata_set +apr_pool_userdata_setn +apr_pool_userdata_get +apr_pool_cleanup_register +apr_pool_cleanup_kill +apr_pool_child_cleanup_set +apr_pool_cleanup_run +apr_pool_cleanup_null +apr_pool_cleanup_for_exec +apr_os_global_mutex_get +apr_os_file_get +apr_os_dir_get +apr_os_sock_get +apr_os_proc_mutex_get +apr_os_exp_time_get +apr_os_imp_time_get +apr_os_shm_get +apr_os_thread_get +apr_os_threadkey_get +apr_os_thread_put +apr_os_threadkey_put +apr_os_thread_current +apr_os_thread_equal +apr_os_file_put +apr_os_pipe_put +apr_os_pipe_put_ex +apr_os_dir_put +apr_os_sock_put +apr_os_sock_make +apr_os_proc_mutex_put +apr_os_imp_time_put +apr_os_exp_time_put +apr_os_shm_put +apr_os_dso_handle_put +apr_os_dso_handle_get +apr_os_default_encoding +apr_os_locale_encoding +apr_proc_mutex_create +apr_proc_mutex_child_init +apr_proc_mutex_lock +apr_proc_mutex_trylock +apr_proc_mutex_unlock +apr_proc_mutex_destroy +apr_proc_mutex_cleanup +apr_proc_mutex_lockfile +apr_proc_mutex_name +apr_proc_mutex_defname +apr_proc_mutex_pool_get +apr_shm_create +apr_shm_destroy +apr_shm_attach +apr_shm_detach +apr_shm_baseaddr_get +apr_shm_size_get +apr_shm_pool_get +apr_signal +apr_signal_description_get +apr_signal_get_description +apr_strnatcmp +apr_strnatcasecmp +apr_pstrdup +apr_pstrmemdup +apr_pstrndup +apr_pmemdup +apr_pstrcat +apr_pstrcatv +apr_pvsprintf +apr_psprintf +apr_cpystrn +apr_collapse_spaces +apr_tokenize_to_argv +apr_strtok +apr_snprintf +apr_vsnprintf +apr_itoa +apr_ltoa +apr_off_t_toa +apr_strtoi64 +apr_atoi64 +apr_strfsize +apr_table_elts +apr_is_empty_table +apr_is_empty_array +apr_array_make +apr_array_push +apr_array_pop +apr_array_cat +apr_array_copy +apr_array_copy_hdr +apr_array_append +apr_array_pstrcat +apr_table_make +apr_table_copy +apr_table_clear +apr_table_get +apr_table_set +apr_table_setn +apr_table_unset +apr_table_merge +apr_table_mergen +apr_table_add +apr_table_addn +apr_table_overlay +apr_table_do +apr_table_vdo +apr_table_overlap +apr_table_compress +apr_thread_cond_create +apr_thread_cond_wait +apr_thread_cond_timedwait +apr_thread_cond_signal +apr_thread_cond_broadcast +apr_thread_cond_destroy +apr_thread_cond_pool_get +apr_thread_mutex_create +apr_thread_mutex_lock +apr_thread_mutex_trylock +apr_thread_mutex_unlock +apr_thread_mutex_destroy +apr_thread_mutex_pool_get +apr_threadattr_create +apr_threadattr_detach_set +apr_threadattr_detach_get +apr_threadattr_stacksize_set +apr_thread_create +apr_thread_exit +apr_thread_join +apr_thread_yield +apr_thread_once_init +apr_thread_once +apr_thread_detach +apr_thread_data_get +apr_thread_data_set +apr_threadkey_private_create +apr_threadkey_private_get +apr_threadkey_private_set +apr_threadkey_private_delete +apr_threadkey_data_get +apr_threadkey_data_set +apr_procattr_create +apr_procattr_io_set +apr_procattr_child_in_set +apr_procattr_child_out_set +apr_procattr_child_err_set +apr_procattr_dir_set +apr_procattr_cmdtype_set +apr_procattr_detach_set +apr_procattr_limit_set +apr_procattr_child_errfn_set +apr_procattr_error_check_set +apr_procattr_addrspace_set +apr_proc_fork +apr_proc_create +apr_proc_wait +apr_proc_wait_all_procs +apr_proc_detach +apr_proc_other_child_register +apr_proc_other_child_unregister +apr_proc_other_child_alert +apr_proc_other_child_refresh +apr_proc_other_child_refresh_all +apr_proc_other_child_check +apr_proc_other_child_read +apr_proc_kill +apr_pool_note_subprocess +apr_setup_signal_thread +apr_signal_thread +apr_thread_pool_get +apr_thread_rwlock_create +apr_thread_rwlock_rdlock +apr_thread_rwlock_tryrdlock +apr_thread_rwlock_wrlock +apr_thread_rwlock_trywrlock +apr_thread_rwlock_unlock +apr_thread_rwlock_destroy +apr_thread_rwlock_pool_get +apr_time_now +apr_time_ansi_put +apr_time_exp_tz +apr_explode_time +apr_time_exp_gmt +apr_time_exp_lt +apr_explode_localtime +apr_time_exp_get +apr_time_exp_gmt_get +apr_implode_gmt +apr_sleep +apr_rfc822_date +apr_ctime +apr_strftime +apr_time_clock_hires +apr_uid_current +apr_current_userid +apr_uid_name_get +apr_get_username +apr_uid_get +apr_get_userid +apr_uid_homepath_get +apr_get_home_directory +apr_gid_name_get +apr_group_name_get +apr_get_groupname +apr_gid_get +apr_get_groupid +apr_version +apr_version_string +apr_month_snames +apr_day_snames diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/atomic/netware/apr_atomic.c b/rubbos/app/httpd-2.0.64/srclib/apr/atomic/netware/apr_atomic.c new file mode 100644 index 00000000..82336cde --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/atomic/netware/apr_atomic.c @@ -0,0 +1,26 @@ +/* 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. + */ + + +#include "apr.h" +#include "apr_atomic.h" + +int apr_atomic_dec(apr_atomic_t *mem) +{ + atomic_dec(mem); + return *mem; +} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/atomic/os390/Makefile.in b/rubbos/app/httpd-2.0.64/srclib/apr/atomic/os390/Makefile.in new file mode 100644 index 00000000..28cc1b6d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/atomic/os390/Makefile.in @@ -0,0 +1,14 @@ +srcdir = @srcdir@ +VPATH = @srcdir@ + +TARGETS = atomic.lo + +# bring in rules.mk for standard functionality +@INCLUDE_RULES@ + +INCDIR=../../include +OSDIR=$(INCDIR)/arch/@OSDIR@ +DEFOSDIR=$(INCDIR)/arch/@DEFAULT_OSDIR@ +INCLUDES=-I$(INCDIR) -I$(OSDIR) -I$(DEFOSDIR) + +# DO NOT REMOVE diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/atomic/os390/atomic.c b/rubbos/app/httpd-2.0.64/srclib/apr/atomic/os390/atomic.c new file mode 100644 index 00000000..ce971e3f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/atomic/os390/atomic.c @@ -0,0 +1,44 @@ +/* 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. + */ + + +#include "apr.h" +#include "apr_atomic.h" + +#if APR_HAS_THREADS + +apr_int32_t apr_atomic_add(volatile apr_atomic_t *mem, apr_int32_t val) +{ + apr_atomic_t old, new_val; + + old = *mem; /* old is automatically updated on cs failure */ + do { + new_val = old + val; + } while (__cs(&old, (cs_t *)mem, new_val)); + + return new_val; +} + +apr_uint32_t apr_atomic_cas(volatile apr_atomic_t *mem, apr_uint32_t swap, + apr_uint32_t cmp) +{ + apr_uint32_t old = cmp; + + __cs(&old, (cs_t *)mem, swap); + return old; /* old is automatically updated from mem on cs failure */ +} + +#endif /* APR_HAS_THREADS */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/atomic/unix/.libs/apr_atomic.o b/rubbos/app/httpd-2.0.64/srclib/apr/atomic/unix/.libs/apr_atomic.o new file mode 100644 index 0000000000000000000000000000000000000000..f31389f78a954c9b5744569a17e847d0b9a759f8 GIT binary patch literal 11888 zcmcgydw5*Mb)UOevR4nTBWaWUO7um4&g5t(7Hv1;Un*Rw402S*=!}E*P7BV^jWT z&9kxTr-S??uT@rviAO8^_rlDF=ewdcDFFO#oa&AtQC{pW@kT-qVTj635(lk@Gum5BZv z`wkBehZkJ>J{12S{1>hS|Jrxac;hr&IZ8QROzH0)Z)|4$`B>rK^mvVY;&`EHde$kp z3RXidJKjHx{~0$|MG*|2n7-(M`+_^OLahv#>B0+gu2sIH{auA$cb&Z$h{n4Mv(dh; z!kh6};a8A>ANuP6<{la;565c*GEK)To|O~UaK5WymL`7p%=+1GorwIJ&Y70A(X0O< z*T5j=J$j&{@OtzhEH_vW0L)aZMNlFlT3EmK)#v>6@P8ZM^$=fIX?)#gd|gHHb;?)2X zRwkM_n8Fm5M5CPdv-2a``E%NNKRZ`re^;@$cbD;Yj=Vv}i^s0!e}v~0olR+v-LRNd z@<)n2-pn4W)2SoE8RO9x<@+k=trmel{g`jUgmQh9`=ZyA+V#I^*GJj)5^Qvi9wbgx zavYYXR#htQU~5V}#&H$}c7X!BU6cj}7zK86j2vO*2X+UHK;`5lida-&ny&&oIYX@~ zlD}YUN`0hkV55|sxdQWo?*oPxya%pJz2JRNEmP}##m7Ldf^n(h1=0T7P^pYL=o

    @BWwy%pX< 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 XzVE$e;e3Ax(Ky&I@4HD0=k@l#0Tj}t literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/atomic/unix/Makefile b/rubbos/app/httpd-2.0.64/srclib/apr/atomic/unix/Makefile new file mode 100644 index 00000000..b7002192 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/atomic/unix/Makefile @@ -0,0 +1,13 @@ +srcdir = . + + +TARGETS = apr_atomic.lo + +# bring in rules.mk for standard functionality +include /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/build/apr_rules.mk + +DEFOSDIR=$(INCDIR)/arch/unix +INCDIR=../../include +INCLUDES=-I$(INCDIR) -I$(DEFOSDIR) + +# DO NOT REMOVE diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/atomic/unix/Makefile.in b/rubbos/app/httpd-2.0.64/srclib/apr/atomic/unix/Makefile.in new file mode 100644 index 00000000..188d0d24 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/atomic/unix/Makefile.in @@ -0,0 +1,13 @@ +srcdir = @srcdir@ +VPATH = @srcdir@ + +TARGETS = apr_atomic.lo + +# bring in rules.mk for standard functionality +@INCLUDE_RULES@ + +DEFOSDIR=$(INCDIR)/arch/@DEFAULT_OSDIR@ +INCDIR=../../include +INCLUDES=-I$(INCDIR) -I$(DEFOSDIR) + +# DO NOT REMOVE diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/atomic/unix/apr_atomic.c b/rubbos/app/httpd-2.0.64/srclib/apr/atomic/unix/apr_atomic.c new file mode 100644 index 00000000..d7a223a0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/atomic/unix/apr_atomic.c @@ -0,0 +1,173 @@ +/* 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. + */ + +#include "apr.h" +#include "apr_atomic.h" +#include "apr_thread_mutex.h" + +#if !defined(apr_atomic_init) && !defined(APR_OVERRIDE_ATOMIC_INIT) + +#if APR_HAS_THREADS +#define NUM_ATOMIC_HASH 7 +/* shift by 2 to get rid of alignment issues */ +#define ATOMIC_HASH(x) (unsigned int)(((unsigned long)(x)>>2)%(unsigned int)NUM_ATOMIC_HASH) +static apr_thread_mutex_t **hash_mutex; +#endif /* APR_HAS_THREADS */ + +apr_status_t apr_atomic_init(apr_pool_t *p) +{ +#if APR_HAS_THREADS + int i; + apr_status_t rv; + hash_mutex = apr_palloc(p, sizeof(apr_thread_mutex_t*) * NUM_ATOMIC_HASH); + + for (i = 0; i < NUM_ATOMIC_HASH; i++) { + rv = apr_thread_mutex_create(&(hash_mutex[i]), + APR_THREAD_MUTEX_DEFAULT, p); + if (rv != APR_SUCCESS) { + return rv; + } + } +#endif /* APR_HAS_THREADS */ + return APR_SUCCESS; +} +#endif /*!defined(apr_atomic_init) && !defined(APR_OVERRIDE_ATOMIC_INIT) */ + +#if !defined(apr_atomic_add) && !defined(APR_OVERRIDE_ATOMIC_ADD) +void apr_atomic_add(volatile apr_atomic_t *mem, apr_uint32_t val) +{ +#if APR_HAS_THREADS + apr_thread_mutex_t *lock = hash_mutex[ATOMIC_HASH(mem)]; + apr_uint32_t prev; + + if (apr_thread_mutex_lock(lock) == APR_SUCCESS) { + prev = *mem; + *mem += val; + apr_thread_mutex_unlock(lock); + } +#else + *mem += val; +#endif /* APR_HAS_THREADS */ +} +#endif /*!defined(apr_atomic_add) && !defined(APR_OVERRIDE_ATOMIC_ADD) */ + +#if !defined(apr_atomic_set) && !defined(APR_OVERRIDE_ATOMIC_SET) +void apr_atomic_set(volatile apr_atomic_t *mem, apr_uint32_t val) +{ +#if APR_HAS_THREADS + apr_thread_mutex_t *lock = hash_mutex[ATOMIC_HASH(mem)]; + apr_uint32_t prev; + + if (apr_thread_mutex_lock(lock) == APR_SUCCESS) { + prev = *mem; + *mem = val; + apr_thread_mutex_unlock(lock); + } +#else + *mem = val; +#endif /* APR_HAS_THREADS */ +} +#endif /*!defined(apr_atomic_set) && !defined(APR_OVERRIDE_ATOMIC_SET) */ + +#if !defined(apr_atomic_inc) && !defined(APR_OVERRIDE_ATOMIC_INC) +void apr_atomic_inc(volatile apr_uint32_t *mem) +{ +#if APR_HAS_THREADS + apr_thread_mutex_t *lock = hash_mutex[ATOMIC_HASH(mem)]; + apr_uint32_t prev; + + if (apr_thread_mutex_lock(lock) == APR_SUCCESS) { + prev = *mem; + (*mem)++; + apr_thread_mutex_unlock(lock); + } +#else + (*mem)++; +#endif /* APR_HAS_THREADS */ +} +#endif /*!defined(apr_atomic_inc) && !defined(APR_OVERRIDE_ATOMIC_INC) */ + +#if !defined(apr_atomic_dec) && !defined(APR_OVERRIDE_ATOMIC_DEC) +int apr_atomic_dec(volatile apr_atomic_t *mem) +{ +#if APR_HAS_THREADS + apr_thread_mutex_t *lock = hash_mutex[ATOMIC_HASH(mem)]; + apr_uint32_t new; + + if (apr_thread_mutex_lock(lock) == APR_SUCCESS) { + (*mem)--; + new = *mem; + apr_thread_mutex_unlock(lock); + return new; + } +#else + (*mem)--; +#endif /* APR_HAS_THREADS */ + return *mem; +} +#endif /*!defined(apr_atomic_dec) && !defined(APR_OVERRIDE_ATOMIC_DEC) */ + +#if !defined(apr_atomic_cas) && !defined(APR_OVERRIDE_ATOMIC_CAS) +apr_uint32_t apr_atomic_cas(volatile apr_uint32_t *mem, long with, long cmp) +{ + apr_uint32_t prev; +#if APR_HAS_THREADS + apr_thread_mutex_t *lock = hash_mutex[ATOMIC_HASH(mem)]; + + if (apr_thread_mutex_lock(lock) == APR_SUCCESS) { + prev = *mem; + if (prev == (apr_uint32_t)cmp) { + *mem = (apr_uint32_t)with; + } + apr_thread_mutex_unlock(lock); + return prev; + } + return *mem; +#else + prev = *mem; + if (prev == (apr_uint32_t)cmp) { + *mem = (apr_uint32_t)with; + } + return prev; +#endif /* APR_HAS_THREADS */ +} +#endif /*!defined(apr_atomic_cas) && !defined(APR_OVERRIDE_ATOMIC_CAS) */ + +#if !defined(apr_atomic_casptr) && !defined(APR_OVERRIDE_ATOMIC_CASPTR) +void *apr_atomic_casptr(volatile void **mem, void *with, const void *cmp) +{ + void *prev; +#if APR_HAS_THREADS + apr_thread_mutex_t *lock = hash_mutex[ATOMIC_HASH(mem)]; + + if (apr_thread_mutex_lock(lock) == APR_SUCCESS) { + prev = *(void **)mem; + if (prev == cmp) { + *mem = with; + } + apr_thread_mutex_unlock(lock); + return prev; + } + return *(void **)mem; +#else + prev = *(void **)mem; + if (prev == cmp) { + *mem = with; + } + return prev; +#endif /* APR_HAS_THREADS */ +} +#endif /*!defined(apr_atomic_cas) && !defined(APR_OVERRIDE_ATOMIC_CAS) */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/atomic/unix/apr_atomic.lo b/rubbos/app/httpd-2.0.64/srclib/apr/atomic/unix/apr_atomic.lo new file mode 100644 index 00000000..3b16143d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/atomic/unix/apr_atomic.lo @@ -0,0 +1,12 @@ +# apr_atomic.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/apr_atomic.o' + +# Name of the non-PIC object. +non_pic_object='apr_atomic.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/atomic/unix/apr_atomic.o b/rubbos/app/httpd-2.0.64/srclib/apr/atomic/unix/apr_atomic.o new file mode 100644 index 0000000000000000000000000000000000000000..f5cb149187ad4dfb79de0e8544007ebc39405727 GIT binary patch literal 11832 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 YaK7)oW8i#$2++9MFYmh%1LyVjZ+dgb`v3p{ literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/build/MakeEtags b/rubbos/app/httpd-2.0.64/srclib/apr/build/MakeEtags new file mode 100755 index 00000000..c4e957c9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/build/MakeEtags @@ -0,0 +1,39 @@ +#!/bin/sh + +# This file illustrates how to generate a useful TAGS file via etags +# for emacs. This should be invoked from the top source directory i.e.: +# > build/MakeEtags +# and will create a TAGS file in the top source directory. + +# This script falls under the Apache License. +# See http://www.apache.org/docs/LICENSE + +# Once you have created ./TAGS in emacs you'll need to setup +# tag-table-alist with an entry to assure it finds the single ./TAGS +# file from the many source directories. Something along these lines: +# (setq tag-table-alist +# '(("/home/me/work/httpd-2.0/" +# . "/home/me/work/httpd-2.0/") +# )) + +# This requires a special version of etags, i.e. the +# one called "Exuberant ctags" available at: +# http://fly.hiwaay.net/~darren/ctags/ +# Once that is setup you'll need to point to the +# executable here: + +etags=~/local/bin/etags + +# Exuberant etags is necessary since it can ignore some defined symbols +# that obscure the function signatures. + +ignore=AP_DECLARE,AP_DECLARE_NONSTD,__declspec + +# Create an etags file at the root of the source +# tree, then create symbol links to it from each +# directory in the source tree. By passing etags +# absolute pathnames we get a tag file that is +# NOT portable when we move the directory tree. + +find . -name '*.[ch]' -print | $etags -I "$ignore" -L - + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/build/Makefile b/rubbos/app/httpd-2.0.64/srclib/apr/build/Makefile new file mode 100644 index 00000000..8d888e70 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/build/Makefile @@ -0,0 +1,12 @@ +srcdir = . + + +TARGETS= +INCLUDES= +DISTCLEAN_TARGETS = apr_rules.mk +EXTRACLEAN_TARGETS = ltcf-c.sh ltmain.sh libtool.m4 + +# bring in rules.mk for standard functionality +include /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/build/apr_rules.mk + +# DO NOT REMOVE diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/build/Makefile.in b/rubbos/app/httpd-2.0.64/srclib/apr/build/Makefile.in new file mode 100644 index 00000000..c05665a1 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/build/Makefile.in @@ -0,0 +1,12 @@ +srcdir = @srcdir@ +VPATH = @srcdir@ + +TARGETS= +INCLUDES= +DISTCLEAN_TARGETS = apr_rules.mk +EXTRACLEAN_TARGETS = ltcf-c.sh ltmain.sh libtool.m4 + +# bring in rules.mk for standard functionality +@INCLUDE_RULES@ + +# DO NOT REMOVE diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/build/NWGNUenvironment.inc b/rubbos/app/httpd-2.0.64/srclib/apr/build/NWGNUenvironment.inc new file mode 100644 index 00000000..c93b940c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/build/NWGNUenvironment.inc @@ -0,0 +1,302 @@ +# +# Setup needed Tools and Libraries +# + +ifeq "$(wildcard $(APR_WORK)\build\NWGNUcustom.inc)" "$(APR_WORK)\build\NWGNUcustom.inc" +include $(APR_WORK)\build\NWGNUcustom.inc +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 + +# This is a placeholder +# ifndef LDAPSDK +# LDAPSDK = C:/novell/ndk/cldapsdk +# endif + +ifndef METROWERKS +METROWERKS = C:\Program Files\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 (default) +# optimized - optimization switches are set + +ifdef reltype +RELEASE=$(reltype) +endif + +ifdef RELTYPE +RELEASE=$(RELTYPE) +endif + +ifdef debug +RELEASE=debug +endif + +ifdef DEBUG +RELEASE=debug +endif + +ifdef optimized +RELEASE=optimized +endif + +ifdef OPTIMIZED +RELEASE=optimized +endif + +ifndef RELEASE +RELEASE = optimized +endif + +ifeq "$(RELEASE)" "debug" +OBJDIR = Debug +endif + +ifeq "$(RELEASE)" "noopt" +OBJDIR = Noopt +endif + +ifeq "$(RELEASE)" "optimized" +OBJDIR = Release +endif + +# +# 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 + +NOVI = $(NOVELLLIBC)\imports + +INCDIRS = $(NOVELLLIBC)\include;$(NOVELLLIBC)\include\nks;$(NOVELLLIBC)\include\winsock; + +DEFINES = -DNETWARE +ifndef DEBUG +DEFINES += -DNDEBUG +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 + +# MetroWerks Win32 build flags to create build tool +MWCW_MSL = "$(METROWERKS)/MSL" +MWCW_W32 = "$(METROWERKS)/Win32-x86 Support" +WIN_CFLAGS = -O2 -gccinc -nodefaults -proc 586 -w off +WIN_CFLAGS += -ir $(MWCW_MSL) -ir $(MWCW_W32) -lr $(MWCW_MSL) -lr $(MWCW_W32) +WIN_CFLAGS += -lMSL_All_x86.lib -lkernel32.lib -luser32.lib + +# Base compile flags +# and prefix or precompiled header added here. + +# The default flags are as follows: +# +# -c compile only, no link +# -nosyspath treat #include <...> like #include "..." +# -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 -nosyspath -Cpp_exceptions off -RTTI off -align 4 -w nocmdline -proc PII + +# -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)" "optimized" +CFLAGS += -O4,p +endif + +# -prefix apr_arch_pre_nw.h #include pre_nw.h for all files + +CFLAGS += -prefix apr_arch_pre_nw.h + + +PATH:=$(PATH);$(METROWERKS)\bin;$(METROWERKS)\Other Metrowerks Tools\Command Line Tools + +# +# Declare major project deliverables output directories here +# + +ifdef DEST +INSTALL = $(DEST) +ifeq (\, $(findstring \,$(INSTALL))) +INSTDIRS = $(DEST) +endif +endif + +ifdef dest +INSTALL = $(dest) +ifeq (\, $(findstring \,$(INSTALL))) +INSTDIRS = $(dest) +endif +endif + +ifndef INSTALL +INSTALL = $(APR_WORK)\Dist +INSTDIRS = $(APR_WORK)\Dist +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 + +ifdef DEST +INSTALLBASE := $(INSTALL)\Apache2 + +INSTDEVDIRS := \ + $(INSTDIRS) \ + $(INSTALLBASE) \ + $(INSTALLBASE)\include \ + $(INSTALLBASE)\lib \ + +INSTDIRS += \ + $(INSTALLBASE) \ + +else +INSTALLBASE := $(INSTALL)\apr + +INSTDEVDIRS := \ + $(INSTDIRS) \ + $(INSTALLBASE) \ + $(INSTALLBASE)\include \ + $(INSTALLBASE)\lib \ + +INSTDIRS += \ + $(INSTALLBASE) \ + +endif + +# +# Declare Command and tool macros here +# + +# Os2LibPath is an extra check to see if we are on NT +ifdef Os2LibPath +OS = Windows_NT +endif + +ifeq "$(OS)" "Windows_NT" +CMD=cmd /C +CHK=cmd /C if exist +CHKNOT=cmd /C if not exist +DEL = del /F +DELTREE = cmd /C rd /s/q +WINNT=1 +XCOPYSW = /E +else +CMD=command /C +CHK=command /C if exist +CHKNOT=command /C if not exist +DEL = del +DELTREE = deltree /y +XCOPYSW = /E /Y +endif + + +# +# Setup base C compiler flags +# + +# +# Common directories +# + +APR = $(APR_WORK) +APRTEST = $(APR_WORK)/test +APRUTIL = $(APR_WORK)/../apr-util +XML = $(APRUTIL)/xml + +# +# Internal Libraries +# + +APRLIB = $(APR)/$(OBJDIR)/aprlib.lib +APRUTLIB = $(APRUTIL)/$(OBJDIR)/aprutil.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/rubbos/app/httpd-2.0.64/srclib/apr/build/NWGNUhead.inc b/rubbos/app/httpd-2.0.64/srclib/apr/build/NWGNUhead.inc new file mode 100644 index 00000000..17f149ca --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/build/NWGNUhead.inc @@ -0,0 +1,96 @@ +# +# Obtain the global build environment +# + +include $(APR_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) + +endif #NO_LICENSE_FILE check + +help : + @echo targets for RELEASE=$(RELEASE): + @echo (default) . . . . libs nlms + @echo all . . . . . . . does everything (libs nlms install) + @echo libs. . . . . . . builds all libs + @echo nlms. . . . . . . builds all nlms + @echo install . . . . . builds libs and nlms and copies install files to + @echo "$(INSTALL)" + @echo installdev. . . . copies headers and files needed for development to + @echo "$(INSTALL)" + @echo clean . . . . . . deletes $(OBJDIR) dirs, *.err, and *.map + @echo clobber_all . . . deletes all possible output from the make + @echo clobber_install . deletes all files in $(INSTALL) + @$(CMD) echo. + @echo Multiple targets can be used on a single nmake command line - + @echo (i.e. $(MAKE) clean all) + @$(CMD) echo. + @echo You can also specify RELEASE=debug, RELEASE=noopt, or RELEASE=optimized + @echo The default is RELEASE=optimized + +clobber_all :: clean clobber_install + +clobber_install :: + -$(DELTREE) $(INSTALL) 2>NUL + +# +# build recursive targets +# + +$(SUBDIRS) : FORCE +ifneq "$(MAKECMDGOALS)" "clean" + $(CMD) echo. + @echo Building $(CURDIR)/$@ +endif + $(MAKE) -C $@ $(MAKECMDGOALS) -f NWGNUmakefile RELEASE=$(RELEASE) DEST="$(INSTALL)" LM_LICENSE_FILE="$(LM_LICENSE_FILE)" + $(CMD) echo. + +FORCE: + +# +# Standard targets +# + +clean :: $(SUBDIRS) + @echo Cleaning up $(CURDIR) + -$(DELTREE) $(OBJDIR) 2> NUL + $(CHK) *.err $(DEL) *.err + $(CHK) *.map $(DEL) *.map + $(CHK) *.d $(DEL) *.d + $(CHK) *.tmp $(DEL) *.tmp + $(CHK) xc.bat $(DEL) xc.bat + -$(DELTREE) $(OBJDIR) 2> NUL + +$(OBJDIR) :: + $(CHKNOT) $(OBJDIR)\nul mkdir $(OBJDIR) + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/build/NWGNUmakefile b/rubbos/app/httpd-2.0.64/srclib/apr/build/NWGNUmakefile new file mode 100644 index 00000000..b097bcb0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/build/NWGNUmakefile @@ -0,0 +1,107 @@ +# +# Declare the sub-directories to be built here +# + +SUBDIRS = \ + $(EOLIST) + +# +# Get the 'head' of the build environment. This includes default targets and +# paths to tools +# + +include $(APR_WORK)\build\NWGNUhead.inc + +# +# build this level's files + +FILES_prebuild_headers = \ + $(APR)/include/apr.h \ + $(APRUTIL)/include/apu.h \ + $(APRUTIL)/include/apu_want.h \ + $(APRUTIL)/include/apr_ldap.h \ + $(APRUTIL)/include/private/apu_config.h \ + $(APRUTIL)/include/private/apu_select_dbm.h \ + $(APRUTIL)/xml/expat/lib/expat_config.h \ + $(APRUTIL)/uri/uri_delims.h \ + $(EOLIST) + +nlms :: $(APR)/aprlib.imp + +$(APR)/aprlib.imp : make_nw_export.awk nw_export.i + @echo Generating $(subst /,\,$@) + awk -f make_nw_export.awk nw_export.i | sort >$(APR)/aprlib.imp + +nw_export.i : nw_export.inc $(FILES_prebuild_headers) $(NLM_NAME)_cc.opt + @echo Generating $(subst /,\,$@) + $(CC) $< @$(NLM_NAME)_cc.opt + +$(NLM_NAME)_cc.opt : NWGNUmakefile $(APR_WORK)\build\NWGNUenvironment.inc $(APR_WORK)\build\NWGNUhead.inc $(APR_WORK)\build\NWGNUtail.inc $(CUSTOM_INI) + $(CHK) $@ $(DEL) $@ + @echo -P >> $@ + @echo -EP >> $@ + @echo -nosyspath >> $@ + @echo -w nocmdline >> $@ + @echo -DNETWARE >> $@ + @echo -I..\include >> $@ + @echo -I..\include\arch\netware >> $@ + @echo -I..\include\arch\unix >> $@ + @echo -I$(APRUTIL)\include >> $@ + @echo -ir $(NOVELLLIBC)\include >> $@ + +$(APR)/include/%.h: $(subst /,\,$(APR))\include\%.hnw + @echo Creating $(subst /,\,$@) + copy $< $(subst /,\,$(APR))\include\$(@F) + +$(APRUTIL)/include/%.h: $(subst /,\,$(APRUTIL))\include\%.hnw + @echo Creating $(subst /,\,$@) + copy $< $(subst /,\,$(APRUTIL))\include\$(@F) + +$(APRUTIL)/include/private/%.h: $(subst /,\,$(APRUTIL))\include\private\%.hw + @echo Creating $(subst /,\,$@) + copy $< $(subst /,\,$(APRUTIL))\include\private\$(@F) + +$(APRUTIL)/xml/expat/lib/%.h: $(subst /,\,$(APRUTIL))\xml\expat\lib\%.hnw + @echo Creating $(subst /,\,$@) + copy $< $(subst /,\,$(APRUTIL))\xml\expat\lib\$(@F) + +ifneq "$(BUILDTOOL_AS_NLM)" "1" + +$(APRUTIL)/uri/uri_delims.h: gen_uri_delims.exe $(APRUTIL)/uri/gen_uri_delims.c + @echo Creating $(subst /,\,$@) + @$< > $@ + +%.exe: $(APRUTIL)/uri/%.c + @echo Creating $@ + @$(WIN_CC) $(WIN_CFLAGS) $< -o $@ + +else + +ifneq "$(wildcard $(APRUTIL)/uri/uri_delims.h)" "$(APRUTIL)/uri/uri_delims.h" +$(error Error: required header $(abspath $(APRUTIL)/uri/uri_delims.h) not found!) +endif + +endif + +# +# You can use this target if all that is needed is to copy files to the +# installation area +# +install :: nlms FORCE + +clean :: + $(CHK) nw_export.i $(DEL) nw_export.i + $(CHK) $(NLM_NAME)_cc.opt $(DEL) $(NLM_NAME)_cc.opt + $(CHK) NWGNUversion.inc $(DEL) NWGNUversion.inc + $(CHK) $(subst /,\,$(APR))\include\apr.h $(DEL) $(subst /,\,$(APR))\include\apr.h + $(CHK) $(subst /,\,$(APRUTIL))\include\apu.h $(DEL) $(subst /,\,$(APRUTIL))\include\apu.h + $(CHK) $(subst /,\,$(APRUTIL))\include\apr_ldap.h $(DEL) $(subst /,\,$(APRUTIL))\include\apr_ldap.h + $(CHK) $(subst /,\,$(APRUTIL))\include\private\apu_config.h $(DEL) $(subst /,\,$(APRUTIL))\include\private\apu_config.h + $(CHK) $(subst /,\,$(APRUTIL))\include\private\apu_select_dbm.h $(DEL) $(subst /,\,$(APRUTIL))\include\private\apu_select_dbm.h + $(CHK) $(subst /,\,$(APRUTIL))\xml\expat\lib\expat_config.h $(DEL) $(subst /,\,$(APRUTIL))\xml\expat\lib\expat_config.h + $(CHK) $(subst /,\,$(APR))\aprlib.imp $(DEL) $(subst /,\,$(APR))\aprlib.imp +ifneq "$(BUILDTOOL_AS_NLM)" "1" + $(CHK) $(subst /,\,$(APRUTIL))\uri\uri_delims.h $(DEL) $(subst /,\,$(APRUTIL))\uri\uri_delims.h + $(CHK) gen_uri_delims.exe $(DEL) gen_uri_delims.exe +endif + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/build/NWGNUtail.inc b/rubbos/app/httpd-2.0.64/srclib/apr/build/NWGNUtail.inc new file mode 100644 index 00000000..6d76df67 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/build/NWGNUtail.inc @@ -0,0 +1,323 @@ +# +# 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. +# +echo NLM_NAME=$(NLM_NAME) +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 + +# +# Create dependency lists based on the files available +# + + +CCOPT_DEPENDS = \ + $(APR_WORK)\build\NWGNUhead.inc \ + $(APR_WORK)\build\NWGNUenvironment.inc \ + $(APR_WORK)\build\NWGNUtail.inc \ + NWGNUmakefile \ + $(CUSTOM_INI) \ + $(EOLIST) + +CPPOPT_DEPENDS = \ + $(APR_WORK)\build\NWGNUhead.inc \ + $(APR_WORK)\build\NWGNUenvironment.inc \ + $(APR_WORK)\build\NWGNUtail.inc \ + NWGNUmakefile \ + $(CUSTOM_INI) \ + $(EOLIST) + +$(NLM_NAME)_LINKOPT_DEPENDS = \ + $(TARGET_lib) \ + $(APR_WORK)\build\NWGNUenvironment.inc \ + NWGNUmakefile \ + $(APR_WORK)\build\NWGNUtail.inc \ + $(CUSTOM_INI) \ + $(VERSION_INC) \ + $(EOLIST) + +ifeq "$(words $(strip $(TARGET_lib)))" "1" +LIB_NAME = $(basename $(notdir $(TARGET_lib))) +$(LIB_NAME)_LIBLST_DEPENDS = \ + $(FILES_lib_objs) \ + $(APR_WORK)\build\NWGNUenvironment.inc \ + NWGNUmakefile \ + $(APR_WORK)\build\NWGNUtail.inc \ + $(CUSTOM_INI) \ + $(EOLIST) +endif + +ifeq "$(wildcard NWGNU$(LIB_NAME))" "NWGNU$(LIB_NAME)" +$(LIB_NAME)_LIBLST_DEPENDS += NWGNU$(LIB_NAME) +endif + +ifeq "$(wildcard NWGNU$(NLM_NAME))" "NWGNU$(NLM_NAME)" +$(NLM_NAME)_LINKOPT_DEPENDS += NWGNU$(NLM_NAME) +CCOPT_DEPENDS += NWGNU$(NLM_NAME) +CPPOPT_DEPENDS += NWGNU$(NLM_NAME) +endif + +# +# Generic compiler rules +# + +ifneq ($(MAKECMDGOALS),clean) +$(APR_WORK)\build\NWGNUversion.inc : $(APR_WORK)\build\nw_ver.awk $(APR_WORK)\include\apr_version.h + @echo Generating $(subst /,\,$@) + @$(AWK) -f $^ > $@ + +-include $(APR_WORK)\build\NWGNUversion.inc + +ifneq "$(strip $(VERSION_STR))" "" +VERSION_INC = $(APR_WORK)\build\NWGNUversion.inc +else +VERSION = 0,9,0 +VERSION_STR = 0.9.0 +endif +endif + +ifeq "$(words $(strip $(TARGET_nlm)))" "1" +INCLUDE_BLDCMDS=1 +endif + +ifeq "$(words $(strip $(TARGET_lib)))" "1" +INCLUDE_BLDCMDS=1 +endif + +ifeq "$(INCLUDE_BLDCMDS)" "1" + +$(OBJDIR)/%.o: %.c $(OBJDIR)\$(NLM_NAME)_cc.opt + @echo Compiling $< + $(CC) $< -o=$(OBJDIR)\$(@F) @$(OBJDIR)\$(NLM_NAME)_cc.opt + +$(OBJDIR)\$(NLM_NAME)_cc.opt: $(CCOPT_DEPENDS) + @echo CCOPT_DEPENDS=$(CCOPT_DEPENDS) + $(CHK) $@ $(DEL) $@ + @echo Generating $@ +ifneq "$(strip $(CFLAGS))" "" + @echo $(CFLAGS) >> $@ +endif +ifneq "$(strip $(XCFLAGS))" "" + @echo $(XCFLAGS) >> $@ +endif +ifneq "$(strip $(XINCDIRS))" "" + @echo $(foreach xincdir,$(strip $(subst ;,$(SPACE),$(XINCDIRS))),-I$(xincdir)) >> $@ +endif +ifneq "$(strip $(INCDIRS))" "" + @echo $(foreach incdir,$(strip $(subst ;,$(SPACE),$(INCDIRS))),-I$(incdir)) >> $@ +endif +ifneq "$(strip $(DEFINES))" "" + @echo $(DEFINES) >> $@ +endif +ifneq "$(strip $(XDEFINES))" "" + @echo $(XDEFINES) >> $@ +endif + +$(OBJDIR)/%.o: %.cpp $(OBJDIR)\cpp.opt + @echo Compiling $< + $(CPP) $< -o=$(OBJDIR)\$(@F) @$(OBJDIR)\cpp.opt + +$(OBJDIR)\cpp.opt: $(CPPOPT_DEPENDS) + $(CHK) $@ $(DEL) $@ + @echo Generating $@ +ifneq "$(strip $(CFLAGS))" "" + @echo $(CFLAGS) >> $@ +endif +ifneq "$(strip $(XCFLAGS))" "" + @echo $(XCFLAGS) >> $@ +endif +ifneq "$(strip $(XINCDIRS))" "" + @echo $(foreach xincdir,$(strip $(subst ;,$(SPACE),$(XINCDIRS))),-I$(xincdir)) >> $@ +endif +ifneq "$(strip $(INCDIRS))" "" + @echo $(foreach incdir,$(strip $(subst ;,$(SPACE),$(INCDIRS))),-I$(incdir)) >> $@ +endif +ifneq "$(strip $(DEFINES))" "" + @echo $(DEFINES) >> $@ +endif +ifneq "$(strip $(XDEFINES))" "" + @echo $(XDEFINES) >> $@ +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 + @echo Generating $@ + $(CHK) $(OBJDIR)\$(@F) $(DEL) $(OBJDIR)\$(@F) + $(LIB) -o $(OBJDIR)\$(@F) @$? + +$(OBJDIR)\$(LIB_NAME)_lib.lst: $($(LIB_NAME)_LIBLST_DEPENDS) + $(CHK) $@ $(DEL) $@ + @echo Generating $@ +ifneq "$(strip $(FILES_lib_objs))" "" + @echo $(foreach objfile,$(FILES_lib_objs),$(subst /,\,$(objfile)) ) >> $@ +endif + +else # We must have more than one target library so load the individual makefiles + +$(OBJDIR)/%.lib: NWGNU% $(APR_WORK)\build\NWGNUhead.inc $(APR_WORK)\build\NWGNUtail.inc $(APR_WORK)\build\NWGNUenvironment.inc FORCE + @echo Calling $< + $(MAKE) -f $< $(MAKECMDGOALS) RELEASE=$(RELEASE) + +endif + +# +# Rules to build nlms. +# + +vpath libcpre.o $(NOVELLLIBC)\imports + +# 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 Linking $@ + $(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) + $(CHK) $(OBJDIR)\$(@F) $(DEL) $(OBJDIR)\$(@F) + $(CHK) $(OBJDIR)\$(NLM_NAME)_link.def $(DEL) $(OBJDIR)\$(NLM_NAME)_link.def + @echo Generating $@ + @echo -warnings off >> $@ + @echo -zerobss >> $@ + @echo -desc "$(NLM_DESCRIPTION)" >> $@ + @echo -o $(TARGET_nlm) >> $@ +ifneq "$(FILE_nlm_copyright)" "" + @-type $(FILE_nlm_copyright) >> $@ +else + @echo -copy "$(NLM_COPYRIGHT)" >> $@ +endif +ifeq "$(RELEASE)" "debug" + @echo -g >> $@ + @echo -sym internal >> $@ + @echo -sym codeview4 >> $@ + @echo -osym $(OBJDIR)\$(NLM_NAME).sym >> $@ +else + @echo -sym internal >> $@ +endif + @echo -screenname "$(NLM_SCREEN_NAME)" >> $@ +ifneq "$(NLM_VERSION)" "" + @echo -nlmversion=$(NLM_VERSION) >> $@ +else + @echo -nlmversion=$(VERSION) >> $@ +endif + @echo -l $(APR)/$(OBJDIR) >> $@ + @echo -l $(APRUTIL)/$(OBJDIR) >> $@ + @echo -l $(XML)/$(OBJDIR) >> $@ + @echo -l "$(METROWERKS)/Novell Support/Metrowerks Support/Libraries/Runtime" >> $@ + @echo -l "$(METROWERKS)/Novell Support/Metrowerks Support/Libraries/MSL C++" >> $@ +ifneq "$(IPV6)" "" + @echo -l $(NOVELLLIBC)\include\winsock\IPV6 >> $@ +endif + @echo -l $(NOVELLLIBC)/imports >> $@ +ifneq "$(LDAPSDK)" "" + @echo -l $(LDAPSDK)/lib/nlm >> $@ +endif + @echo -nodefaults >> $@ + @echo -map $(OBJDIR)\$(NLM_NAME).map>> $@ + @echo -threadname "$(NLM_THREAD_NAME)" >> $@ +ifneq "$(NLM_STACK_SIZE)" "" + @echo -stacksize $(subst K,000,$(subst k,K,$(strip $(NLM_STACK_SIZE)))) >> $@ +else + @echo -stacksize 64000 >> $@ +endif +ifneq "$(NLM_ENTRY_SYM)" "" + @echo -entry $(NLM_ENTRY_SYM) >> $@ +endif +ifneq "$(NLM_EXIT_SYM)" "" + @echo -exit $(NLM_EXIT_SYM) >> $@ +endif +ifneq "$(NLM_CHECK_SYM)" "" + @echo -check $(NLM_CHECK_SYM) >> $@ +endif +ifneq "$(NLM_FLAGS)" "" + @echo -flags $(NLM_FLAGS) >> $@ +endif +ifneq "$(strip $(XLFLAGS))" "" + @echo $(XLFLAGS) >> $@ +endif +ifneq "$(strip $(FILES_nlm_objs))" "" + @echo $(foreach objfile,$(strip $(FILES_nlm_objs)),$(subst /,\,$(objfile))) >> $@ +endif +ifneq "$(FILES_nlm_libs)" "" + @echo $(foreach libfile, $(notdir $(strip $(FILES_nlm_libs))),-l$(subst /,\,$(libfile))) >> $@ +endif + @echo -commandfile $(OBJDIR)\$(NLM_NAME)_link.def >> $@ +ifneq "$(FILE_nlm_msg)" "" + @echo Messages $(FILE_nlm_msg) >> $(OBJDIR)\$(NLM_NAME)_link.def +endif +ifneq "$(FILE_nlm_hlp)" "" + @echo Help $(FILE_nlm_hlp) >> $(OBJDIR)\$(NLM_NAME)_link.def +endif +ifneq "$(FILES_nlm_modules)" "" + @echo module $(foreach module,$(subst $(SPACE),$(COMMA),$(strip $(FILES_nlm_modules))),$(subst /,\,$(module))) >> $(OBJDIR)\$(NLM_NAME)_link.def +endif +ifneq "$(FILES_nlm_Ximports)" "" + @echo Import $(foreach import,$(subst $(SPACE),$(COMMA),$(strip $(FILES_nlm_Ximports))),$(subst /,\,$(import))) >> $(OBJDIR)\$(NLM_NAME)_link.def +endif +ifneq "$(FILES_nlm_exports)" "" + @echo Export $(foreach export,$(subst $(SPACE),$(COMMA),$(strip $(FILES_nlm_exports))),$(subst /,\,$(export))) >> $(OBJDIR)\$(NLM_NAME)_link.def +endif + +# if APACHE_UNIPROC is defined, don't include XDCData +ifndef APACHE_UNIPROC +ifneq "$(string $(XDCDATA))" "" + @echo XDCData $(XDCDATA) >> $(OBJDIR)\$(NLM_NAME)_link.def +else + @echo XDCData $(APR)\misc\netware\apr.xdc >> $(OBJDIR)\$(NLM_NAME)_link.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% $(APR_WORK)\build\NWGNUhead.inc $(APR_WORK)\build\NWGNUtail.inc $(APR_WORK)\build\NWGNUenvironment.inc $(CUSTOM_INI) $(VERSION_INC) FORCE + @echo Calling $< + $(MAKE) -f $< $(MAKECMDGOALS) RELEASE=$(RELEASE) + $(CMD) echo. + +else + +$(TARGET_nlm): + +endif # NO_LICENSE_FILE + +endif # multiple targets + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/build/PrintPath b/rubbos/app/httpd-2.0.64/srclib/apr/build/PrintPath new file mode 100755 index 00000000..2a2b48b6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/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/rubbos/app/httpd-2.0.64/srclib/apr/build/aplibtool.c b/rubbos/app/httpd-2.0.64/srclib/apr/build/aplibtool.c new file mode 100644 index 00000000..110700ab --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/build/aplibtool.c @@ -0,0 +1,751 @@ +/* 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. + */ + +#include +#include +#include +#include +#include +#include + +typedef char bool; +#define false 0 +#define true (!false) + +bool silent = false; +bool shared = false; +bool export_all = false; +enum mode_t { mCompile, mLink, mInstall }; +enum output_type_t { otGeneral, otObject, otProgram, otStaticLibrary, otDynamicLibrary }; + +#ifdef __EMX__ +# define SHELL_CMD "sh" +# define CC "gcc" +# define GEN_EXPORTS "emxexp" +# define DEF2IMPLIB_CMD "emximp" +# define SHARE_SW "-Zdll -Zmtd" +# define USE_OMF true +# define TRUNCATE_DLL_NAME +# define DYNAMIC_LIB_EXT "dll" +# define EXE_EXT ".exe" + +# if USE_OMF + /* OMF is the native format under OS/2 */ +# define STATIC_LIB_EXT "lib" +# define OBJECT_EXT "obj" +# define LIBRARIAN "emxomfar" +# else + /* but the alternative, a.out, can fork() which is sometimes necessary */ +# define STATIC_LIB_EXT "a" +# define OBJECT_EXT "o" +# define LIBRARIAN "ar" +# endif +#endif + + +typedef struct { + char *arglist[1024]; + int num_args; + enum mode_t mode; + enum output_type_t output_type; + char *output_name; + char *stub_name; + char *tmp_dirs[1024]; + int num_tmp_dirs; + char *obj_files[1024]; + int num_obj_files; +} cmd_data_t; + +void parse_args(int argc, char *argv[], cmd_data_t *cmd_data); +bool parse_long_opt(char *arg, cmd_data_t *cmd_data); +int parse_short_opt(char *arg, cmd_data_t *cmd_data); +bool parse_input_file_name(char *arg, cmd_data_t *cmd_data); +bool parse_output_file_name(char *arg, cmd_data_t *cmd_data); +void post_parse_fixup(cmd_data_t *cmd_data); +bool explode_static_lib(char *lib, cmd_data_t *cmd_data); +int execute_command(cmd_data_t *cmd_data); +char *shell_esc(const char *str); +void cleanup_tmp_dirs(cmd_data_t *cmd_data); +void generate_def_file(cmd_data_t *cmd_data); +char *nameof(char *fullpath); +char *truncate_dll_name(char *path); + + +int main(int argc, char *argv[]) +{ + int rc; + cmd_data_t cmd_data; + + memset(&cmd_data, 0, sizeof(cmd_data)); + cmd_data.mode = mCompile; + cmd_data.output_type = otGeneral; + + parse_args(argc, argv, &cmd_data); + rc = execute_command(&cmd_data); + + if (rc == 0 && cmd_data.stub_name) { + fopen(cmd_data.stub_name, "w"); + } + + cleanup_tmp_dirs(&cmd_data); + return rc; +} + + + +void parse_args(int argc, char *argv[], cmd_data_t *cmd_data) +{ + int a; + char *arg; + bool argused; + + for (a=1; a < argc; a++) { + arg = argv[a]; + argused = false; + + if (arg[0] == '-') { + if (arg[1] == '-') { + argused = parse_long_opt(arg + 2, cmd_data); + } else if (arg[1] == 'o' && a+1 < argc) { + cmd_data->arglist[cmd_data->num_args++] = arg; + arg = argv[++a]; + argused = parse_output_file_name(arg, cmd_data); + } else { + int num_used = parse_short_opt(arg + 1, cmd_data); + argused = num_used > 0; + + if (num_used > 1) { + a += num_used - 1; + } + } + } else { + argused = parse_input_file_name(arg, cmd_data); + } + + if (!argused) { + cmd_data->arglist[cmd_data->num_args++] = arg; + } + } + + post_parse_fixup(cmd_data); +} + + + +bool parse_long_opt(char *arg, cmd_data_t *cmd_data) +{ + char *equal_pos = strchr(arg, '='); + char var[50]; + char value[500]; + + if (equal_pos) { + strncpy(var, arg, equal_pos - arg); + var[equal_pos - arg] = 0; + strcpy(value, equal_pos + 1); + } else { + strcpy(var, arg); + } + + if (strcmp(var, "silent") == 0) { + silent = true; + } else if (strcmp(var, "mode") == 0) { + if (strcmp(value, "compile") == 0) { + cmd_data->mode = mCompile; + cmd_data->output_type = otObject; + } + + if (strcmp(value, "link") == 0) { + cmd_data->mode = mLink; + } + + if (strcmp(value, "install") == 0) { + cmd_data->mode = mInstall; + } + } else if (strcmp(var, "shared") == 0) { + shared = true; + } else if (strcmp(var, "export-all") == 0) { + export_all = true; + } else { + return false; + } + + return true; +} + + + +int parse_short_opt(char *arg, cmd_data_t *cmd_data) +{ + if (strcmp(arg, "export-dynamic") == 0) { + return 1; + } + + if (strcmp(arg, "module") == 0) { + return 1; + } + + if (strcmp(arg, "Zexe") == 0) { + return 1; + } + + if (strcmp(arg, "avoid-version") == 0) { + return 1; + } + + if (strcmp(arg, "prefer-pic") == 0) { + return 1; + } + + if (strcmp(arg, "prefer-non-pic") == 0) { + return 1; + } + + if (strcmp(arg, "version-info") == 0 ) { + return 2; + } + + return 0; +} + + + +bool parse_input_file_name(char *arg, cmd_data_t *cmd_data) +{ + char *ext = strrchr(arg, '.'); + char *name = strrchr(arg, '/'); + int pathlen; + char *newarg; + + if (!ext) { + return false; + } + + ext++; + + if (name == NULL) { + name = strrchr(arg, '\\'); + + if (name == NULL) { + name = arg; + } else { + name++; + } + } else { + name++; + } + + pathlen = name - arg; + + if (strcmp(ext, "lo") == 0) { + newarg = (char *)malloc(strlen(arg) + 10); + strcpy(newarg, arg); + strcpy(newarg + (ext - arg), OBJECT_EXT); + cmd_data->arglist[cmd_data->num_args++] = newarg; + cmd_data->obj_files[cmd_data->num_obj_files++] = newarg; + return true; + } + + if (strcmp(ext, "la") == 0) { + newarg = (char *)malloc(strlen(arg) + 10); + strcpy(newarg, arg); + newarg[pathlen] = 0; + strcat(newarg, ".libs/"); + + if (strncmp(name, "lib", 3) == 0) { + name += 3; + } + + strcat(newarg, name); + ext = strrchr(newarg, '.') + 1; + + if (shared && cmd_data->mode == mInstall) { + strcpy(ext, DYNAMIC_LIB_EXT); + newarg = truncate_dll_name(newarg); + } else { + strcpy(ext, STATIC_LIB_EXT); + } + + cmd_data->arglist[cmd_data->num_args++] = newarg; + return true; + } + + if (strcmp(ext, "c") == 0) { + if (cmd_data->stub_name == NULL) { + cmd_data->stub_name = (char *)malloc(strlen(arg) + 4); + strcpy(cmd_data->stub_name, arg); + strcpy(strrchr(cmd_data->stub_name, '.') + 1, "lo"); + } + } + + if (strcmp(name, CC) == 0 || strcmp(name, CC EXE_EXT) == 0) { + if (cmd_data->output_type == otGeneral) { + cmd_data->output_type = otObject; + } + } + + return false; +} + + + +bool parse_output_file_name(char *arg, cmd_data_t *cmd_data) +{ + char *name = strrchr(arg, '/'); + char *ext = strrchr(arg, '.'); + char *newarg = NULL, *newext; + int pathlen; + + if (name == NULL) { + name = strrchr(arg, '\\'); + + if (name == NULL) { + name = arg; + } else { + name++; + } + } else { + name++; + } + + if (!ext) { + cmd_data->stub_name = arg; + cmd_data->output_type = otProgram; + newarg = (char *)malloc(strlen(arg) + 5); + strcpy(newarg, arg); + strcat(newarg, EXE_EXT); + cmd_data->arglist[cmd_data->num_args++] = newarg; + cmd_data->output_name = newarg; + return true; + } + + ext++; + pathlen = name - arg; + + if (strcmp(ext, "la") == 0) { + cmd_data->stub_name = arg; + cmd_data->output_type = shared ? otDynamicLibrary : otStaticLibrary; + newarg = (char *)malloc(strlen(arg) + 10); + mkdir(".libs", 0); + strcpy(newarg, ".libs/"); + + if (strncmp(arg, "lib", 3) == 0) { + arg += 3; + } + + strcat(newarg, arg); + newext = strrchr(newarg, '.') + 1; + strcpy(newext, shared ? DYNAMIC_LIB_EXT : STATIC_LIB_EXT); + +#ifdef TRUNCATE_DLL_NAME + if (shared) { + newarg = truncate_dll_name(newarg); + } +#endif + + cmd_data->arglist[cmd_data->num_args++] = newarg; + cmd_data->output_name = newarg; + return true; + } + + if (strcmp(ext, "lo") == 0) { + cmd_data->stub_name = arg; + cmd_data->output_type = otObject; + newarg = (char *)malloc(strlen(arg) + 2); + strcpy(newarg, arg); + ext = strrchr(newarg, '.') + 1; + strcpy(ext, OBJECT_EXT); + cmd_data->arglist[cmd_data->num_args++] = newarg; + cmd_data->output_name = newarg; + return true; + } + + return false; +} + + + +void post_parse_fixup(cmd_data_t *cmd_data) +{ + int a; + char *arg; + char *ext; + + if (cmd_data->output_type == otStaticLibrary && cmd_data->mode == mLink) { + /* We do a real hatchet job on the args when making a static library + * removing all compiler switches & any other cruft that ar won't like + * We also need to explode any libraries listed + */ + + for (a=0; a < cmd_data->num_args; a++) { + arg = cmd_data->arglist[a]; + + if (arg) { + ext = strrchr(arg, '.'); + + if (ext) { + ext++; + } + + if (arg[0] == '-') { + cmd_data->arglist[a] = NULL; + + if (strcmp(arg, "-rpath") == 0 && a+1 < cmd_data->num_args) { + cmd_data->arglist[a+1] = NULL; + } + + if (strcmp(arg, "-R") == 0 && a+1 < cmd_data->num_args) { + cmd_data->arglist[a+1] = NULL; + } + + if (strcmp(arg, "-version-info") == 0 && a+1 < cmd_data->num_args) { + cmd_data->arglist[a+1] = NULL; + } + + if (strcmp(arg, "-Zstack") == 0 && a+1 < cmd_data->num_args) { + cmd_data->arglist[a+1] = NULL; + } + + if (strcmp(arg, "-o") == 0) { + a++; + } + } + + if (strcmp(arg, CC) == 0 || strcmp(arg, CC EXE_EXT) == 0) { + cmd_data->arglist[a] = LIBRARIAN " cr"; + } + + if (ext) { + if (strcmp(ext, "h") == 0 || strcmp(ext, "c") == 0) { + /* ignore source files, they don't belong in a library */ + cmd_data->arglist[a] = NULL; + } + + if (strcmp(ext, STATIC_LIB_EXT) == 0) { + cmd_data->arglist[a] = NULL; + explode_static_lib(arg, cmd_data); + } + } + } + } + } + + if (cmd_data->output_type == otDynamicLibrary) { + for (a=0; a < cmd_data->num_args; a++) { + arg = cmd_data->arglist[a]; + + if (arg) { + if (strcmp(arg, "-rpath") == 0 && a+1 < cmd_data->num_args) { + cmd_data->arglist[a] = NULL; + cmd_data->arglist[a+1] = NULL; + } + } + } + + if (export_all) { + generate_def_file(cmd_data); + } + } + +#if USE_OMF + if (cmd_data->output_type == otObject || + cmd_data->output_type == otProgram || + cmd_data->output_type == otDynamicLibrary) { + cmd_data->arglist[cmd_data->num_args++] = "-Zomf"; + } +#endif + + if (shared && (cmd_data->output_type == otObject || cmd_data->output_type == otDynamicLibrary)) { + cmd_data->arglist[cmd_data->num_args++] = SHARE_SW; + } +} + + + +int execute_command(cmd_data_t *cmd_data) +{ + int target = 0; + char *command; + int a, total_len = 0; + char *args[4]; + + for (a=0; a < cmd_data->num_args; a++) { + if (cmd_data->arglist[a]) { + total_len += strlen(cmd_data->arglist[a]) + 1; + } + } + + command = (char *)malloc( total_len ); + command[0] = 0; + + for (a=0; a < cmd_data->num_args; a++) { + if (cmd_data->arglist[a]) { + strcat(command, cmd_data->arglist[a]); + strcat(command, " "); + } + } + + command[strlen(command)-1] = 0; + + if (!silent) { + puts(command); + } + + cmd_data->num_args = target; + cmd_data->arglist[cmd_data->num_args] = NULL; + command = shell_esc(command); + + args[0] = SHELL_CMD; + args[1] = "-c"; + args[2] = command; + args[3] = NULL; + return spawnvp(P_WAIT, args[0], args); +} + + + +char *shell_esc(const char *str) +{ + char *cmd; + unsigned char *d; + const unsigned char *s; + + cmd = (char *)malloc(2 * strlen(str) + 1); + d = (unsigned char *)cmd; + s = (const unsigned char *)str; + + for (; *s; ++s) { + if (*s == '"' || *s == '\\') { + *d++ = '\\'; + } + *d++ = *s; + } + + *d = '\0'; + return cmd; +} + + + +bool explode_static_lib(char *lib, cmd_data_t *cmd_data) +{ + char tmpdir[1024]; + char savewd[1024]; + char cmd[1024]; + char *name; + DIR *dir; + struct dirent *entry; + + strcpy(tmpdir, lib); + strcat(tmpdir, ".exploded"); + + mkdir(tmpdir, 0); + cmd_data->tmp_dirs[cmd_data->num_tmp_dirs++] = strdup(tmpdir); + getcwd(savewd, sizeof(savewd)); + + if (chdir(tmpdir) != 0) + return false; + + strcpy(cmd, LIBRARIAN " x "); + name = strrchr(lib, '/'); + + if (name) { + name++; + } else { + name = lib; + } + + strcat(cmd, "../"); + strcat(cmd, name); + system(cmd); + chdir(savewd); + dir = opendir(tmpdir); + + while ((entry = readdir(dir)) != NULL) { + if (entry->d_name[0] != '.') { + strcpy(cmd, tmpdir); + strcat(cmd, "/"); + strcat(cmd, entry->d_name); + cmd_data->arglist[cmd_data->num_args++] = strdup(cmd); + } + } + + closedir(dir); + return true; +} + + + +void cleanup_tmp_dir(char *dirname) +{ + DIR *dir; + struct dirent *entry; + char fullname[1024]; + + dir = opendir(dirname); + + if (dir == NULL) + return; + + while ((entry = readdir(dir)) != NULL) { + if (entry->d_name[0] != '.') { + strcpy(fullname, dirname); + strcat(fullname, "/"); + strcat(fullname, entry->d_name); + remove(fullname); + } + } + + rmdir(dirname); +} + + + +void cleanup_tmp_dirs(cmd_data_t *cmd_data) +{ + int d; + + for (d=0; d < cmd_data->num_tmp_dirs; d++) { + cleanup_tmp_dir(cmd_data->tmp_dirs[d]); + } +} + + + +void generate_def_file(cmd_data_t *cmd_data) +{ + char def_file[1024]; + char implib_file[1024]; + char *ext; + FILE *hDef; + char *export_args[1024]; + int num_export_args = 0; + char *cmd; + int cmd_size = 0; + int a; + + if (cmd_data->output_name) { + strcpy(def_file, cmd_data->output_name); + strcat(def_file, ".def"); + hDef = fopen(def_file, "w"); + + if (hDef != NULL) { + fprintf(hDef, "LIBRARY '%s' INITINSTANCE\n", nameof(cmd_data->output_name)); + fprintf(hDef, "DATA NONSHARED\n"); + fprintf(hDef, "EXPORTS\n"); + fclose(hDef); + + for (a=0; a < cmd_data->num_obj_files; a++) { + cmd_size += strlen(cmd_data->obj_files[a]) + 1; + } + + cmd_size += strlen(GEN_EXPORTS) + strlen(def_file) + 3; + cmd = (char *)malloc(cmd_size); + strcpy(cmd, GEN_EXPORTS); + + for (a=0; a < cmd_data->num_obj_files; a++) { + strcat(cmd, " "); + strcat(cmd, cmd_data->obj_files[a] ); + } + + strcat(cmd, ">>"); + strcat(cmd, def_file); + puts(cmd); + export_args[num_export_args++] = SHELL_CMD; + export_args[num_export_args++] = "-c"; + export_args[num_export_args++] = cmd; + export_args[num_export_args++] = NULL; + spawnvp(P_WAIT, export_args[0], export_args); + cmd_data->arglist[cmd_data->num_args++] = strdup(def_file); + + /* Now make an import library for the dll */ + num_export_args = 0; + export_args[num_export_args++] = DEF2IMPLIB_CMD; + export_args[num_export_args++] = "-o"; + + strcpy(implib_file, ".libs/"); + strcat(implib_file, cmd_data->stub_name); + ext = strrchr(implib_file, '.'); + + if (ext) + *ext = 0; + + strcat(implib_file, "."); + strcat(implib_file, STATIC_LIB_EXT); + + export_args[num_export_args++] = implib_file; + export_args[num_export_args++] = def_file; + export_args[num_export_args++] = NULL; + spawnvp(P_WAIT, export_args[0], export_args); + } + } +} + + + +/* returns just a file's name without path or extension */ +char *nameof(char *fullpath) +{ + char buffer[1024]; + char *ext; + char *name = strrchr(fullpath, '/'); + + if (name == NULL) { + name = strrchr(fullpath, '\\'); + } + + if (name == NULL) { + name = fullpath; + } else { + name++; + } + + strcpy(buffer, name); + ext = strrchr(buffer, '.'); + + if (ext) { + *ext = 0; + return strdup(buffer); + } + + return name; +} + + + +char *truncate_dll_name(char *path) +{ + /* Cut DLL name down to 8 characters after removing any mod_ prefix */ + char *tmppath = strdup(path); + char *newname = strrchr(tmppath, '/') + 1; + char *ext = strrchr(tmppath, '.'); + int len; + + if (ext == NULL) + return tmppath; + + len = ext - newname; + + if (strncmp(newname, "mod_", 4) == 0) { + strcpy(newname, newname + 4); + len -= 4; + } + + if (len > 8) { + strcpy(newname + 8, strchr(newname, '.')); + } + + return tmppath; +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/build/apr_app.dsp b/rubbos/app/httpd-2.0.64/srclib/apr/build/apr_app.dsp new file mode 100644 index 00000000..9956a0c7 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/build/apr_app.dsp @@ -0,0 +1,89 @@ +# Microsoft Developer Studio Project File - Name="apr_app" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Static Library" 0x0104 + +CFG=apr_app - 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 "apr_app.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 "apr_app.mak" CFG="apr_app - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "apr_app - Win32 Release" (based on "Win32 (x86) Static Library") +!MESSAGE "apr_app - Win32 Debug" (based on "Win32 (x86) Static Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "apr_app - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "LibR" +# PROP BASE Intermediate_Dir "LibR" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "LibR" +# PROP Intermediate_Dir "LibR" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../include" /I "../include/arch" /I "../include/arch/win32" /I "../include/arch/unix" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "APR_APP" /D "APR_DECLARE_STATIC" /Fd"LibR\apr_app_src" /FD /c +# ADD BASE RSC /l 0x409 +# ADD RSC /l 0x409 +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo + +!ELSEIF "$(CFG)" == "apr_app - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "LibD" +# PROP BASE Intermediate_Dir "LibD" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "LibD" +# PROP Intermediate_Dir "LibD" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../include" /I "../include/arch" /I "../include/arch/win32" /I "../include/arch/unix" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "APR_APP" /D "APR_DECLARE_STATIC" /Fd"LibD\apr_app_src" /FD /c +# ADD BASE RSC /l 0x409 +# ADD RSC /l 0x409 +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo + +!ENDIF + +# Begin Target + +# Name "apr_app - Win32 Release" +# Name "apr_app - Win32 Debug" +# Begin Source File + +SOURCE=..\misc\win32\apr_app.c +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/build/apr_common.m4 b/rubbos/app/httpd-2.0.64/srclib/apr/build/apr_common.m4 new file mode 100644 index 00000000..ace88c44 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/build/apr_common.m4 @@ -0,0 +1,993 @@ +dnl ----------------------------------------------------------------- +dnl apr_common.m4: APR's general-purpose autoconf macros +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 "$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 $2 where the + dnl 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,[ +if test "x$apr_ste_save_$1" = "x"; 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 +echo " restoring $1 to \"$$1\"" +echo " setting $2$1 to \"$$2$1\"" +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 + 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,[ + 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 + 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 + 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 + 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 + 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='' +]) + + +define(APR_DECIDE,[dnl +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_CHECK_SIZEOF_EXTENDED(INCLUDES, TYPE [, CROSS_SIZE]) +dnl +dnl A variant of AC_CHECK_SIZEOF which allows the checking of +dnl sizes of non-builtin types +dnl +AC_DEFUN(APR_CHECK_SIZEOF_EXTENDED, +[changequote(<<,>>)dnl +dnl The name to #define +define(<>, translit(sizeof_$2, [a-z *], [A-Z_P]))dnl +dnl The cache variable +define(<>, translit(ac_cv_sizeof_$2, [ *],[

    ]))dnl +changequote([, ])dnl +AC_MSG_CHECKING(size of $2) +AC_CACHE_VAL(AC_CV_NAME, +[AC_TRY_RUN([#include +$1 +main() +{ + FILE *f=fopen("conftestval","w"); + if (!f) exit(1); + fprintf(f, "%d\n", sizeof($2)); + exit(0); +}], AC_CV_NAME=`cat conftestval`, AC_CV_NAME=0, ifelse([$3],,, +AC_CV_NAME=$3))])dnl +AC_MSG_RESULT($AC_CV_NAME) +AC_DEFINE_UNQUOTED(AC_TYPE_NAME, $AC_CV_NAME, [The size of ]$2) +undefine([AC_TYPE_NAME])dnl +undefine([AC_CV_NAME])dnl +]) + + +dnl +dnl APR_TRY_COMPILE_NO_WARNING(INCLUDES, FUNCTION-BODY, +dnl [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) +dnl +dnl Tries a compile test with warnings activated so that the result +dnl is false if the code doesn't compile cleanly. +dnl +AC_DEFUN(APR_TRY_COMPILE_NO_WARNING, +[if test "x$CFLAGS_WARN" = "x"; then + apr_tcnw_flags="" +else + apr_tcnw_flags=$CFLAGS_WARN +fi +if test "$ac_cv_prog_gcc" = "yes"; then + apr_tcnw_flags="$apr_tcnw_flags -Werror" +fi +changequote(', ') +cat > conftest.$ac_ext <&AC_FD_CC ; then + ifelse([$3], , :, [rm -rf conftest* + $3]) +else + echo "configure: failed or warning program:" >&AC_FD_CC + cat conftest.$ac_ext >&AC_FD_CC + ifelse([$4], , , [rm -rf conftest* + $4]) +fi +rm -f conftest* +])dnl + +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_MSG_CHECKING(for type of return code from strerror_r) +AC_TRY_RUN([ +#include +#include +#include +main() +{ + 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]) + msg="int" +else + msg="pointer" +fi +AC_MSG_RESULT([$msg]) +] ) +dnl +dnl APR_CHECK_CRYPT_R_STYLE +dnl +dnl Decide which of a couple of flavors of crypt_r() is necessary for +dnl this platform. +dnl +AC_DEFUN(APR_CHECK_CRYPT_R_STYLE,[ +AC_CACHE_CHECK(style of crypt_r, ac_cv_crypt_r_style,[ +dnl +ac_cv_crypt_r_style=none +dnl +AC_TRY_COMPILE([ +#include +],[ +CRYPTD buffer; +crypt_r("passwd", "hash", &buffer); +], ac_cv_crypt_r_style=cryptd) +dnl +if test "$ac_cv_crypt_r_style" = "none"; then +AC_TRY_COMPILE([ +#include +],[ +struct crypt_data buffer; +crypt_r("passwd", "hash", &buffer); +], ac_cv_crypt_r_style=struct_crypt_data) +fi +dnl +]) +if test "$ac_cv_crypt_r_style" = "cryptd"; then + AC_DEFINE(CRYPT_R_CRYPTD, 1, [Define if crypt_r has uses CRYPTD]) +fi +# if we don't combine these conditions, CRYPT_R_STRUCT_CRYPT_DATA +# will end up defined twice +if test "$ac_cv_crypt_r_style" = "struct_crypt_data"; then + AC_DEFINE(CRYPT_R_STRUCT_CRYPT_DATA, 1, [Define if crypt_r uses struct crypt_data]) +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) +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) +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 + 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() { 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_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 +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/rubbos/app/httpd-2.0.64/srclib/apr/build/apr_hints.m4 b/rubbos/app/httpd-2.0.64/srclib/apr/build/apr_hints.m4 new file mode 100644 index 00000000..a36be247 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/build/apr_hints.m4 @@ -0,0 +1,439 @@ +dnl ----------------------------------------------------------------- +dnl apr_hints.m4: APR's autoconf macros for platform-specific hints +dnl +dnl We preload various configure settings depending +dnl on previously obtained platform knowledge. +dnl We allow all settings to be overridden from +dnl the command-line. +dnl +dnl We maintain the "format" that we've used +dnl under 1.3.x, so we don't exactly follow +dnl what is "recommended" by autoconf. + +dnl +dnl APR_PRELOAD +dnl +dnl Preload various ENV/makefile params such as CC, CFLAGS, etc +dnl based on outside knowledge +dnl +dnl Generally, we force the setting of CC, and add flags +dnl to CFLAGS, CPPFLAGS, LIBS and LDFLAGS. +dnl +AC_DEFUN(APR_PRELOAD, [ +if test "x$apr_preload_done" != "xyes" ; then + + apr_preload_done="yes" + + echo "Applying APR hints file rules for $host" + + case "$host" in + *mint) + APR_ADDTO(CPPFLAGS, [-DMINT]) + APR_ADDTO(LIBS, [-lportlib]) + ;; + *MPE/iX*) + APR_ADDTO(CPPFLAGS, [-DMPE -D_POSIX_SOURCE -D_SOCKET_SOURCE]) + APR_ADDTO(LIBS, [-lsvipc -lcurses]) + APR_ADDTO(LDFLAGS, [-Xlinker \"-WL,cap=ia,ba,ph;nmstack=1024000\"]) + ;; + *-apple-aux3*) + APR_ADDTO(CPPFLAGS, [-DAUX3 -D_POSIX_SOURCE]) + APR_ADDTO(LIBS, [-lposix -lbsd]) + APR_ADDTO(LDFLAGS, [-s]) + APR_SETVAR(SHELL, [/bin/ksh]) + ;; + *-ibm-aix*) + APR_ADDTO(CPPFLAGS, [-U__STR__ -D_THREAD_SAFE]) + dnl _USR_IRS gets us the hstrerror() proto in netdb.h + case $host in + *-ibm-aix4.3) + APR_ADDTO(CPPFLAGS, [-D_USE_IRS]) + ;; + *-ibm-aix5*) + APR_ADDTO(CPPFLAGS, [-D_USE_IRS]) + ;; + *-ibm-aix4.3.*) + APR_ADDTO(CPPFLAGS, [-D_USE_IRS]) + ;; + esac + dnl If using xlc, remember it, and give it the right options. + if $CC 2>&1 | grep 'xlc' > /dev/null; then + APR_SETIFNULL(AIX_XLC, [yes]) + APR_ADDTO(CFLAGS, [-qHALT=E]) + fi + APR_SETIFNULL(apr_sysvsem_is_global, [yes]) + APR_SETIFNULL(apr_lock_method, [USE_SYSVSEM_SERIALIZE]) + case $host in + *-ibm-aix3* | *-ibm-aix4.1.*) + ;; + *) + APR_ADDTO(LDFLAGS, [-Wl,-brtl]) + ;; + esac + ;; + *-apollo-*) + APR_ADDTO(CPPFLAGS, [-DAPOLLO]) + ;; + *-dg-dgux*) + APR_ADDTO(CPPFLAGS, [-DDGUX]) + ;; + *os2_emx*) + APR_SETVAR(SHELL, [sh]) + APR_SETIFNULL(apr_gethostbyname_is_thread_safe, [yes]) + APR_SETIFNULL(apr_gethostbyaddr_is_thread_safe, [yes]) + ;; + *-hi-hiux) + APR_ADDTO(CPPFLAGS, [-DHIUX]) + ;; + *-hp-hpux11.*) + APR_ADDTO(CPPFLAGS, [-DHPUX11 -D_REENTRANT -D_XOPEN_SOURCE_EXTENDED]) + ;; + *-hp-hpux10.*) + case $host in + *-hp-hpux10.01) +dnl # We know this is a problem in 10.01. +dnl # Not a problem in 10.20. Otherwise, who knows? + APR_ADDTO(CPPFLAGS, [-DSELECT_NEEDS_CAST]) + ;; + esac + APR_ADDTO(CPPFLAGS, [-D_REENTRANT]) + ;; + *-hp-hpux*) + APR_ADDTO(CPPFLAGS, [-DHPUX -D_REENTRANT]) + ;; + *-linux*) + case `uname -r` in + 2.* ) APR_ADDTO(CPPFLAGS, [-DLINUX=2]) + ;; + 1.* ) APR_ADDTO(CPPFLAGS, [-DLINUX=1]) + ;; + * ) + ;; + esac + APR_ADDTO(CPPFLAGS, [-D_REENTRANT -D_GNU_SOURCE]) + ;; + *-GNU*) + APR_ADDTO(CPPFLAGS, [-DHURD -D_GNU_SOURCE]) + ;; + *-lynx-lynxos) + APR_ADDTO(CPPFLAGS, [-D__NO_INCLUDE_WARN__ -DLYNXOS]) + APR_ADDTO(LIBS, [-lbsd]) + ;; + *486-*-bsdi*) + APR_ADDTO(CFLAGS, [-m486]) + ;; + *-*-bsdi*) + case $host in + *bsdi4.1) + APR_ADDTO(CFLAGS, [-D_REENTRANT]) + ;; + esac + ;; + *-openbsd*) + APR_ADDTO(CPPFLAGS, [-D_POSIX_THREADS]) + # getsockname() reports the wrong address on a socket + # bound to an ephmeral port so the test fails. + APR_SETIFNULL(ac_cv_o_nonblock_inherited, [yes]) + ;; + *-netbsd*) + APR_ADDTO(CPPFLAGS, [-DNETBSD]) + # fcntl() lies about O_NONBLOCK on an accept()ed socket (PR kern/26950) + APR_SETIFNULL(ac_cv_o_nonblock_inherited, [yes]) + ;; + *-freebsd*) + case $host in + *freebsd[2345]*) + APR_ADDTO(CFLAGS, [-funsigned-char]) + ;; + esac + APR_SETIFNULL(enable_threads, [no]) + APR_SETIFNULL(apr_lock_method, [USE_FLOCK_SERIALIZE]) + APR_ADDTO(CPPFLAGS, [-D_REENTRANT -D_THREAD_SAFE]) + ;; + *-next-nextstep*) + APR_SETIFNULL(CFLAGS, [-O]) + APR_ADDTO(CPPFLAGS, [-DNEXT]) + ;; + *-next-openstep*) + APR_SETIFNULL(CFLAGS, [-O]) + APR_ADDTO(CPPFLAGS, [-DNEXT]) + ;; + *-apple-rhapsody*) + APR_ADDTO(CPPFLAGS, [-DRHAPSODY]) + ;; + *-apple-darwin*) + APR_ADDTO(CPPFLAGS, [-DDARWIN -DSIGPROCMASK_SETS_THREAD_MASK -no-cpp-precomp]) + APR_SETIFNULL(apr_posixsem_is_global, [yes]) + APR_SETIFNULL(ac_cv_func_poll, [no]) # See issue 34332 + ;; + *-dec-osf*) + APR_ADDTO(CPPFLAGS, [-DOSF1]) + # process-shared mutexes don't seem to work in Tru64 5.0 + APR_SETIFNULL(apr_cv_process_shared_works, [no]) + ;; + *-nto-qnx*) + ;; + *-qnx) + APR_ADDTO(CPPFLAGS, [-DQNX]) + APR_ADDTO(LIBS, [-N128k -lunix]) + ;; + *-qnx32) + APR_ADDTO(CPPFLAGS, [-DQNX]) + APR_ADDTO(CFLAGS, [-mf -3]) + APR_ADDTO(LIBS, [-N128k -lunix]) + ;; + *-isc4*) + APR_ADDTO(CPPFLAGS, [-posix -DISC]) + APR_ADDTO(LDFLAGS, [-posix]) + APR_ADDTO(LIBS, [-linet]) + ;; + *-sco3.2v[[234]]*) + APR_ADDTO(CPPFLAGS, [-DSCO -D_REENTRANT]) + if test "$GCC" = "no"; then + APR_ADDTO(CFLAGS, [-Oacgiltz]) + fi + APR_ADDTO(LIBS, [-lPW -lmalloc]) + ;; + *-sco3.2v5*) + APR_ADDTO(CPPFLAGS, [-DSCO5 -D_REENTRANT]) + ;; + *-sco_sv*|*-SCO_SV*) + APR_ADDTO(CPPFLAGS, [-DSCO -D_REENTRANT]) + APR_ADDTO(LIBS, [-lPW -lmalloc]) + ;; + *-solaris2*) + PLATOSVERS=`echo $host | sed 's/^.*solaris2.//'` + APR_ADDTO(CPPFLAGS, [-DSOLARIS2=$PLATOSVERS -D_POSIX_PTHREAD_SEMANTICS -D_REENTRANT]) + APR_SETIFNULL(apr_lock_method, [USE_FCNTL_SERIALIZE]) + ;; + *-sunos4*) + APR_ADDTO(CPPFLAGS, [-DSUNOS4]) + ;; + *-unixware1) + APR_ADDTO(CPPFLAGS, [-DUW=100]) + ;; + *-unixware2) + APR_ADDTO(CPPFLAGS, [-DUW=200]) + APR_ADDTO(LIBS, [-lgen]) + ;; + *-unixware211) + APR_ADDTO(CPPFLAGS, [-DUW=211]) + APR_ADDTO(LIBS, [-lgen]) + ;; + *-unixware212) + APR_ADDTO(CPPFLAGS, [-DUW=212]) + APR_ADDTO(LIBS, [-lgen]) + ;; + *-unixware7) + APR_ADDTO(CPPFLAGS, [-DUW=700]) + APR_ADDTO(LIBS, [-lgen]) + ;; + maxion-*-sysv4*) + APR_ADDTO(CPPFLAGS, [-DSVR4]) + APR_ADDTO(LIBS, [-lc -lgen]) + ;; + *-*-powermax*) + APR_ADDTO(CPPFLAGS, [-DSVR4]) + APR_ADDTO(LIBS, [-lgen]) + ;; + TPF) + APR_ADDTO(CPPFLAGS, [-DTPF -D_POSIX_SOURCE]) + ;; + bs2000*-siemens-sysv*) + APR_SETIFNULL(CFLAGS, [-O]) + APR_ADDTO(CPPFLAGS, [-DSVR4 -D_XPG_IV -D_KMEMUSER]) + APR_ADDTO(LIBS, [-lsocket]) + APR_SETIFNULL(enable_threads, [no]) + ;; + *-siemens-sysv4*) + APR_ADDTO(CPPFLAGS, [-DSVR4 -D_XPG_IV -DHAS_DLFCN -DUSE_MMAP_FILES -DUSE_SYSVSEM_SERIALIZED_ACCEPT]) + APR_ADDTO(LIBS, [-lc]) + ;; + pyramid-pyramid-svr4) + APR_ADDTO(CPPFLAGS, [-DSVR4 -DNO_LONG_DOUBLE]) + APR_ADDTO(LIBS, [-lc]) + ;; + DS/90\ 7000-*-sysv4*) + APR_ADDTO(CPPFLAGS, [-DUXPDS]) + ;; + *-tandem-sysv4*) + APR_ADDTO(CPPFLAGS, [-DSVR4]) + ;; + *-ncr-sysv4) + APR_ADDTO(CPPFLAGS, [-DSVR4 -DMPRAS]) + APR_ADDTO(LIBS, [-lc -L/usr/ucblib -lucb]) + ;; + *-sysv4*) + APR_ADDTO(CPPFLAGS, [-DSVR4]) + APR_ADDTO(LIBS, [-lc]) + ;; + 88k-encore-sysv4) + APR_ADDTO(CPPFLAGS, [-DSVR4 -DENCORE]) + APR_ADDTO(LIBS, [-lPW]) + ;; + *-uts*) + PLATOSVERS=`echo $host | sed 's/^.*,//'` + case $PLATOSVERS in + 2*) APR_ADDTO(CPPFLAGS, [-DUTS21]) + APR_ADDTO(CFLAGS, [-Xa -eft]) + APR_ADDTO(LIBS, [-lbsd -la]) + ;; + *) APR_ADDTO(CPPFLAGS, [-DSVR4]) + APR_ADDTO(CFLAGS, [-Xa]) + ;; + esac + ;; + *-ultrix) + APR_ADDTO(CPPFLAGS, [-DULTRIX]) + APR_SETVAR(SHELL, [/bin/sh5]) + ;; + *powerpc-tenon-machten*) + APR_ADDTO(LDFLAGS, [-Xlstack=0x14000 -Xldelcsect]) + ;; + *-machten*) + APR_ADDTO(LDFLAGS, [-stack 0x14000]) + ;; + *convex-v11*) + APR_ADDTO(CPPFLAGS, [-DCONVEXOS11]) + APR_SETIFNULL(CFLAGS, [-O1]) + APR_ADDTO(CFLAGS, [-ext]) + ;; + i860-intel-osf1) + APR_ADDTO(CPPFLAGS, [-DPARAGON]) + ;; + *-sequent-ptx2.*.*) + APR_ADDTO(CPPFLAGS, [-DSEQUENT=20]) + APR_ADDTO(CFLAGS, [-Wc,-pw]) + APR_ADDTO(LIBS, [-linet -lc -lseq]) + ;; + *-sequent-ptx4.0.*) + APR_ADDTO(CPPFLAGS, [-DSEQUENT=40]) + APR_ADDTO(CFLAGS, [-Wc,-pw]) + APR_ADDTO(LIBS, [-linet -lc]) + ;; + *-sequent-ptx4.[[123]].*) + APR_ADDTO(CPPFLAGS, [-DSEQUENT=41]) + APR_ADDTO(CFLAGS, [-Wc,-pw]) + APR_ADDTO(LIBS, [-lc]) + ;; + *-sequent-ptx4.4.*) + APR_ADDTO(CPPFLAGS, [-DSEQUENT=44]) + APR_ADDTO(CFLAGS, [-Wc,-pw]) + APR_ADDTO(LIBS, [-lc]) + ;; + *-sequent-ptx4.5.*) + APR_ADDTO(CPPFLAGS, [-DSEQUENT=45]) + APR_ADDTO(CFLAGS, [-Wc,-pw]) + APR_ADDTO(LIBS, [-lc]) + ;; + *-sequent-ptx5.0.*) + APR_ADDTO(CPPFLAGS, [-DSEQUENT=50]) + APR_ADDTO(CFLAGS, [-Wc,-pw]) + APR_ADDTO(LIBS, [-lc]) + ;; + *NEWS-OS*) + APR_ADDTO(CPPFLAGS, [-DNEWSOS]) + ;; + *-riscix) + APR_ADDTO(CPPFLAGS, [-DRISCIX]) + APR_SETIFNULL(CFLAGS, [-O]) + ;; + *-irix*) + APR_ADDTO(CPPFLAGS, [-D_POSIX_THREAD_SAFE_FUNCTIONS]) + ;; + *beos*) + APR_ADDTO(CPPFLAGS, [-DBEOS]) + PLATOSVERS=`uname -r` + APR_SETIFNULL(apr_process_lock_is_global, [yes]) + case $PLATOSVERS in + 5.0.4) + APR_ADDTO(LDFLAGS, [-L/boot/beos/system/lib]) + APR_ADDTO(LIBS, [-lbind -lsocket]) + APR_ADDTO(CPPFLAGS,[-DBONE7]) + ;; + 5.1) + APR_ADDTO(LDFLAGS, [-L/boot/beos/system/lib]) + APR_ADDTO(LIBS, [-lbind -lsocket]) + ;; + esac + APR_ADDTO(CPPFLAGS, [-DSIGPROCMASK_SETS_THREAD_MASK -DAP_AUTH_DBM_USE_APR]) + ;; + 4850-*.*) + APR_ADDTO(CPPFLAGS, [-DSVR4 -DMPRAS]) + APR_ADDTO(LIBS, [-lc -L/usr/ucblib -lucb]) + ;; + drs6000*) + APR_ADDTO(CPPFLAGS, [-DSVR4]) + APR_ADDTO(LIBS, [-lc -L/usr/ucblib -lucb]) + ;; + m88k-*-CX/SX|CYBER) + APR_ADDTO(CPPFLAGS, [-D_CX_SX]) + APR_ADDTO(CFLAGS, [-Xa]) + ;; + *-tandem-oss) + APR_ADDTO(CPPFLAGS, [-D_TANDEM_SOURCE -D_XOPEN_SOURCE_EXTENDED=1]) + ;; + *-ibm-os390) + APR_SETIFNULL(apr_lock_method, [USE_SYSVSEM_SERIALIZE]) + APR_SETIFNULL(apr_sysvsem_is_global, [yes]) + APR_SETIFNULL(apr_gethostbyname_is_thread_safe, [yes]) + APR_SETIFNULL(apr_gethostbyaddr_is_thread_safe, [yes]) + APR_ADDTO(CPPFLAGS, [-U_NO_PROTO -DPTHREAD_ATTR_SETDETACHSTATE_ARG2_ADDR -DPTHREAD_SETS_ERRNO -DPTHREAD_DETACH_ARG1_ADDR -DSIGPROCMASK_SETS_THREAD_MASK -DTCP_NODELAY=1]) + ;; + *-ibm-as400) + APR_SETIFNULL(apr_lock_method, [USE_SYSVSEM_SERIALIZE]) + APR_SETIFNULL(apr_process_lock_is_global, [yes]) + APR_SETIFNULL(apr_gethostbyname_is_thread_safe, [yes]) + APR_SETIFNULL(apr_gethostbyaddr_is_thread_safe, [yes]) + ;; + *cygwin*) + APR_ADDTO(CPPFLAGS, [-DCYGWIN]) + APR_ADDTO(LIBS, [-lcrypt]) + ;; + esac + +fi +]) + +dnl +dnl APR_CC_HINTS +dnl +dnl Allows us to provide a default choice of compiler which +dnl the user can override. +AC_DEFUN(APR_CC_HINTS, [ +case "$host" in + *-apple-aux3*) + APR_SETIFNULL(CC, [gcc]) + ;; + bs2000*-siemens-sysv*) + APR_SETIFNULL(CC, [c89 -XLLML -XLLMK -XL -Kno_integer_overflow]) + ;; + *convex-v11*) + APR_SETIFNULL(CC, [cc]) + ;; + *-ibm-os390) + APR_SETIFNULL(CC, [cc]) + ;; + *-ibm-as400) + APR_SETIFNULL(CC, [icc]) + ;; + *-isc4*) + APR_SETIFNULL(CC, [gcc]) + ;; + m88k-*-CX/SX|CYBER) + APR_SETIFNULL(CC, [cc]) + ;; + *-next-openstep*) + APR_SETIFNULL(CC, [cc]) + ;; + *-qnx32) + APR_SETIFNULL(CC, [cc -F]) + ;; + *-tandem-oss) + APR_SETIFNULL(CC, [c89]) + ;; + TPF) + APR_SETIFNULL(CC, [c89]) + ;; +esac +]) diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/build/apr_network.m4 b/rubbos/app/httpd-2.0.64/srclib/apr/build/apr_network.m4 new file mode 100644 index 00000000..16eb92b8 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/build/apr_network.m4 @@ -0,0 +1,724 @@ +dnl ----------------------------------------------------------------- +dnl apr_network.m4: APR's autoconf macros for testing network support +dnl + +dnl +dnl check for working getaddrinfo() +dnl +dnl Note that if the system doesn't have gai_strerror(), we +dnl can't use getaddrinfo() because we can't get strings +dnl describing the error codes. +dnl +AC_DEFUN(APR_CHECK_WORKING_GETADDRINFO,[ + AC_CACHE_CHECK(for working getaddrinfo, ac_cv_working_getaddrinfo,[ + AC_TRY_RUN( [ +#ifdef HAVE_NETDB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif + +void main(void) { + struct addrinfo hints, *ai; + int error; + + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + error = getaddrinfo("127.0.0.1", NULL, &hints, &ai); + if (error) { + exit(1); + } + if (ai->ai_addr->sa_family != AF_INET) { + exit(1); + } + exit(0); +} +],[ + ac_cv_working_getaddrinfo="yes" +],[ + ac_cv_working_getaddrinfo="no" +],[ + ac_cv_working_getaddrinfo="yes" +])]) +if test "$ac_cv_working_getaddrinfo" = "yes"; then + if test "$ac_cv_func_gai_strerror" != "yes"; then + ac_cv_working_getaddrinfo="no" + else + AC_DEFINE(HAVE_GETADDRINFO, 1, [Define if getaddrinfo exists and works well enough for APR]) + fi +fi +]) + +dnl +dnl check for working getnameinfo() +dnl +AC_DEFUN(APR_CHECK_WORKING_GETNAMEINFO,[ + AC_CACHE_CHECK(for working getnameinfo, ac_cv_working_getnameinfo,[ + AC_TRY_RUN( [ +#ifdef HAVE_NETDB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif + +void main(void) { + struct sockaddr_in sa; + char hbuf[256]; + int error; + + sa.sin_family = AF_INET; + sa.sin_port = 0; + sa.sin_addr.s_addr = inet_addr("127.0.0.1"); +#ifdef SIN6_LEN + sa.sin_len = sizeof(sa); +#endif + + error = getnameinfo((const struct sockaddr *)&sa, sizeof(sa), + hbuf, 256, NULL, 0, + NI_NUMERICHOST); + if (error) { + exit(1); + } else { + exit(0); + } +} +],[ + ac_cv_working_getnameinfo="yes" +],[ + ac_cv_working_getnameinfo="no" +],[ + ac_cv_working_getnameinfo="yes" +])]) +if test "$ac_cv_working_getnameinfo" = "yes"; then + AC_DEFINE(HAVE_GETNAMEINFO, 1, [Define if getnameinfo exists]) +fi +]) + +dnl +dnl check for negative error codes for getaddrinfo() +dnl +AC_DEFUN(APR_CHECK_NEGATIVE_EAI,[ + AC_CACHE_CHECK(for negative error codes for getaddrinfo, ac_cv_negative_eai,[ + AC_TRY_RUN( [ +#ifdef HAVE_NETDB_H +#include +#endif + +void main(void) { + if (EAI_ADDRFAMILY < 0) { + exit(0); + } + exit(1); +} +],[ + ac_cv_negative_eai="yes" +],[ + ac_cv_negative_eai="no" +],[ + ac_cv_negative_eai="no" +])]) +if test "$ac_cv_negative_eai" = "yes"; then + AC_DEFINE(NEGATIVE_EAI, 1, [Define if EAI_ error codes from getaddrinfo are negative]) +fi +]) + +dnl +dnl check for presence of retrans/retry variables in the res_state structure +dnl +AC_DEFUN(APR_CHECK_RESOLV_RETRANS,[ + AC_CACHE_CHECK(for presence of retrans/retry fields in res_state/resolv.h , ac_cv_retransretry,[ + AC_TRY_RUN( [ +#include +#if defined(__sun__) +#include +#endif +#include +/* _res is a global defined in resolv.h */ +int main(void) { + _res.retrans = 2; + _res.retry = 1; + exit(0); + return 0; +} +],[ + ac_cv_retransretry="yes" +],[ + ac_cv_retransretry="no" +],[ + ac_cv_retransretry="no" +])]) +if test "$ac_cv_retransretry" = "yes"; then + AC_DEFINE(RESOLV_RETRANSRETRY, 1, [Define if resolv.h's res_state has the fields retrans/rety]) +fi +]) + +dnl +dnl Checks the definition of gethostbyname_r and gethostbyaddr_r +dnl which are different for glibc, solaris and assorted other operating +dnl systems +dnl +dnl Note that this test is executed too early to see if we have all of +dnl the headers. +AC_DEFUN(APR_CHECK_GETHOSTBYNAME_R_STYLE,[ + +dnl Try and compile a glibc2 gethostbyname_r piece of code, and set the +dnl style of the routines to glibc2 on success +AC_CACHE_CHECK([style of gethostbyname_r routine], ac_cv_gethostbyname_r_style, +APR_TRY_COMPILE_NO_WARNING([ +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_ARPA_INET_H +#include +#endif +#ifdef HAVE_NETDB_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +],[ +int tmp = gethostbyname_r((const char *) 0, (struct hostent *) 0, + (char *) 0, 0, (struct hostent **) 0, &tmp); +], ac_cv_gethostbyname_r_style=glibc2, ac_cv_gethostbyname_r_style=none)) + +if test "$ac_cv_gethostbyname_r_style" = "glibc2"; then + AC_DEFINE(GETHOSTBYNAME_R_GLIBC2, 1, [Define if gethostbyname_r has the glibc style]) +fi + +AC_CACHE_CHECK([3rd argument to the gethostbyname_r routines], ac_cv_gethostbyname_r_arg, +APR_TRY_COMPILE_NO_WARNING([ +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_ARPA_INET_H +#include +#endif +#ifdef HAVE_NETDB_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif +],[ +int tmp = gethostbyname_r((const char *) 0, (struct hostent *) 0, + (struct hostent_data *) 0);], +ac_cv_gethostbyname_r_arg=hostent_data, ac_cv_gethostbyname_r_arg=char)) + +if test "$ac_cv_gethostbyname_r_arg" = "hostent_data"; then + AC_DEFINE(GETHOSTBYNAME_R_HOSTENT_DATA, 1, [Define if gethostbyname_r has the hostent_data for the third argument]) +fi +]) + +dnl +dnl see if TCP_NODELAY setting is inherited from listening sockets +dnl +AC_DEFUN(APR_CHECK_TCP_NODELAY_INHERITED,[ + AC_CACHE_CHECK(if TCP_NODELAY setting is inherited from listening sockets, ac_cv_tcp_nodelay_inherited,[ + AC_TRY_RUN( [ +#include +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_NETINET_TCP_H +#include +#endif +#ifndef HAVE_SOCKLEN_T +typedef int socklen_t; +#endif +int main(void) { + int listen_s, connected_s, client_s; + int listen_port, rc; + struct sockaddr_in sa; + socklen_t sa_len; + socklen_t option_len; + int option; + + listen_s = socket(AF_INET, SOCK_STREAM, 0); + if (listen_s < 0) { + perror("socket"); + exit(1); + } + option = 1; + rc = setsockopt(listen_s, IPPROTO_TCP, TCP_NODELAY, &option, sizeof option); + if (rc < 0) { + perror("setsockopt TCP_NODELAY"); + exit(1); + } + memset(&sa, 0, sizeof sa); + sa.sin_family = AF_INET; +#ifdef BEOS + sa.sin_addr.s_addr = htonl(INADDR_LOOPBACK); +#endif + /* leave port 0 to get ephemeral */ + rc = bind(listen_s, (struct sockaddr *)&sa, sizeof sa); + if (rc < 0) { + perror("bind for ephemeral port"); + exit(1); + } + /* find ephemeral port */ + sa_len = sizeof(sa); + rc = getsockname(listen_s, (struct sockaddr *)&sa, &sa_len); + if (rc < 0) { + perror("getsockname"); + exit(1); + } + listen_port = sa.sin_port; + rc = listen(listen_s, 5); + if (rc < 0) { + perror("listen"); + exit(1); + } + client_s = socket(AF_INET, SOCK_STREAM, 0); + if (client_s < 0) { + perror("socket"); + exit(1); + } + memset(&sa, 0, sizeof sa); + sa.sin_family = AF_INET; + sa.sin_port = listen_port; +#ifdef BEOS + sa.sin_addr.s_addr = htonl(INADDR_LOOPBACK); +#endif + /* leave sin_addr all zeros to use loopback */ + rc = connect(client_s, (struct sockaddr *)&sa, sizeof sa); + if (rc < 0) { + perror("connect"); + exit(1); + } + sa_len = sizeof sa; + connected_s = accept(listen_s, (struct sockaddr *)&sa, &sa_len); + if (connected_s < 0) { + perror("accept"); + exit(1); + } + option_len = sizeof option; + rc = getsockopt(connected_s, IPPROTO_TCP, TCP_NODELAY, &option, &option_len); + if (rc < 0) { + perror("getsockopt"); + exit(1); + } + if (!option) { + fprintf(stderr, "TCP_NODELAY is not set in the child.\n"); + exit(1); + } + return 0; +} +],[ + ac_cv_tcp_nodelay_inherited="yes" +],[ + ac_cv_tcp_nodelay_inherited="no" +],[ + ac_cv_tcp_nodelay_inherited="yes" +])]) +if test "$ac_cv_tcp_nodelay_inherited" = "yes"; then + tcp_nodelay_inherited=1 +else + tcp_nodelay_inherited=0 +fi +]) + +dnl +dnl see if O_NONBLOCK setting is inherited from listening sockets +dnl +AC_DEFUN(APR_CHECK_O_NONBLOCK_INHERITED,[ + AC_CACHE_CHECK(if O_NONBLOCK setting is inherited from listening sockets, ac_cv_o_nonblock_inherited,[ + AC_TRY_RUN( [ +#include +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_NETINET_TCP_H +#include +#endif +#ifndef HAVE_SOCKLEN_T +typedef int socklen_t; +#endif +#ifdef HAVE_FCNTL_H +#include +#endif +int main(void) { + int listen_s, connected_s, client_s; + int listen_port, rc; + struct sockaddr_in sa; + socklen_t sa_len; + + listen_s = socket(AF_INET, SOCK_STREAM, 0); + if (listen_s < 0) { + perror("socket"); + exit(1); + } + memset(&sa, 0, sizeof sa); + sa.sin_family = AF_INET; +#ifdef BEOS + sa.sin_addr.s_addr = htonl(INADDR_LOOPBACK); +#endif + /* leave port 0 to get ephemeral */ + rc = bind(listen_s, (struct sockaddr *)&sa, sizeof sa); + if (rc < 0) { + perror("bind for ephemeral port"); + exit(1); + } + /* find ephemeral port */ + sa_len = sizeof(sa); + rc = getsockname(listen_s, (struct sockaddr *)&sa, &sa_len); + if (rc < 0) { + perror("getsockname"); + exit(1); + } + listen_port = sa.sin_port; + rc = listen(listen_s, 5); + if (rc < 0) { + perror("listen"); + exit(1); + } + rc = fcntl(listen_s, F_SETFL, O_NONBLOCK); + if (rc < 0) { + perror("fcntl(F_SETFL)"); + exit(1); + } + client_s = socket(AF_INET, SOCK_STREAM, 0); + if (client_s < 0) { + perror("socket"); + exit(1); + } + memset(&sa, 0, sizeof sa); + sa.sin_family = AF_INET; + sa.sin_port = listen_port; +#ifdef BEOS + sa.sin_addr.s_addr = htonl(INADDR_LOOPBACK); +#endif + /* leave sin_addr all zeros to use loopback */ + rc = connect(client_s, (struct sockaddr *)&sa, sizeof sa); + if (rc < 0) { + perror("connect"); + exit(1); + } + sa_len = sizeof sa; + connected_s = accept(listen_s, (struct sockaddr *)&sa, &sa_len); + if (connected_s < 0) { + perror("accept"); + exit(1); + } + rc = fcntl(connected_s, F_GETFL, 0); + if (rc < 0) { + perror("fcntl(F_GETFL)"); + exit(1); + } + if (!(rc & O_NONBLOCK)) { + fprintf(stderr, "O_NONBLOCK is not set in the child.\n"); + exit(1); + } + return 0; +} +],[ + ac_cv_o_nonblock_inherited="yes" +],[ + ac_cv_o_nonblock_inherited="no" +],[ + ac_cv_o_nonblock_inherited="yes" +])]) +if test "$ac_cv_o_nonblock_inherited" = "yes"; then + o_nonblock_inherited=1 +else + o_nonblock_inherited=0 +fi +]) + +dnl +dnl check for socklen_t, fall back to unsigned int +dnl +AC_DEFUN(APR_CHECK_SOCKLEN_T,[ +AC_CACHE_CHECK(for socklen_t, ac_cv_socklen_t,[ +AC_TRY_COMPILE([ +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +],[ +socklen_t foo = (socklen_t) 0; +],[ + ac_cv_socklen_t=yes +],[ + ac_cv_socklen_t=no +]) +]) + +if test "$ac_cv_socklen_t" = "yes"; then + AC_DEFINE(HAVE_SOCKLEN_T, 1, [Whether you have socklen_t]) +fi +]) + + +AC_DEFUN(APR_CHECK_INET_ADDR,[ +AC_CACHE_CHECK(for inet_addr, ac_cv_func_inet_addr,[ +AC_TRY_COMPILE([ +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_ARPA_INET_H +#include +#endif +],[ +inet_addr("127.0.0.1"); +],[ + ac_cv_func_inet_addr=yes +],[ + ac_cv_func_inet_addr=no +]) +]) + +if test "$ac_cv_func_inet_addr" = "yes"; then + have_inet_addr=1 +else + have_inet_addr=0 +fi +]) + + +AC_DEFUN(APR_CHECK_INET_NETWORK,[ +AC_CACHE_CHECK(for inet_network, ac_cv_func_inet_network,[ +AC_TRY_COMPILE([ +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_ARPA_INET_H +#include +#endif +],[ +inet_network("127.0.0.1"); +],[ + ac_cv_func_inet_network=yes +],[ + ac_cv_func_inet_network=no +]) +]) + +if test "$ac_cv_func_inet_network" = "yes"; then + have_inet_network=1 +else + have_inet_network=0 +fi +]) + + +AC_DEFUN(APR_CHECK_SOCKADDR_IN6,[ +AC_CACHE_CHECK(for sockaddr_in6, ac_cv_define_sockaddr_in6,[ +AC_TRY_COMPILE([ +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +],[ +struct sockaddr_in6 sa; +],[ + ac_cv_define_sockaddr_in6=yes +],[ + ac_cv_define_sockaddr_in6=no +]) +]) + +if test "$ac_cv_define_sockaddr_in6" = "yes"; then + have_sockaddr_in6=1 +else + have_sockaddr_in6=0 +fi +]) + +dnl +dnl APR_INADDR_NONE +dnl +dnl checks for missing INADDR_NONE macro +dnl +AC_DEFUN(APR_INADDR_NONE,[ + AC_CACHE_CHECK(whether system defines INADDR_NONE, ac_cv_inaddr_none,[ + AC_TRY_COMPILE([ +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_ARPA_INET_H +#include +#endif +],[ +unsigned long foo = INADDR_NONE; +],[ + ac_cv_inaddr_none=yes +],[ + ac_cv_inaddr_none=no +])]) + if test "$ac_cv_inaddr_none" = "no"; then + apr_inaddr_none="((unsigned int) 0xffffffff)" + else + apr_inaddr_none="INADDR_NONE" + fi +]) + + +dnl +dnl APR_H_ERRNO_COMPILE_CHECK +dnl +AC_DEFUN(APR_H_ERRNO_COMPILE_CHECK,[ + if test x$1 != x; then + CPPFLAGS="-D$1 $CPPFLAGS" + fi + AC_TRY_COMPILE([ +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_NETDB_H +#include +#endif +],[ +int h_e = h_errno; +],[ + if test x$1 != x; then + ac_cv_h_errno_cppflags="$1" + else + ac_cv_h_errno_cppflags=yes + fi +],[ + ac_cv_h_errno_cppflags=no +])]) + + +dnl +dnl APR_CHECK_SCTP +dnl +dnl check for presence of SCTP protocol support +dnl +AC_DEFUN([APR_CHECK_SCTP], +[ + AC_CACHE_CHECK([whether SCTP is supported], [apr_cv_sctp], [ + AC_TRY_RUN([ +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_NETINET_SCTP_H +#include +#endif +#ifdef HAVE_NETINET_SCTP_UIO_H +#include +#endif +#include +int main(void) { + int s, opt = 1; + if ((s = socket(AF_INET, SOCK_STREAM, IPPROTO_SCTP)) < 0) + exit(1); + if (setsockopt(s, IPPROTO_SCTP, SCTP_NODELAY, &opt, sizeof(int)) < 0) + exit(2); + exit(0); +}], [apr_cv_sctp=yes], [apr_cv_sctp=no], [apr_cv_sctp=no])]) + +if test "$apr_cv_sctp" = "yes"; then + have_sctp=1 +else + have_sctp=0 +fi +]) + +dnl +dnl APR_CHECK_H_ERRNO_FLAG +dnl +dnl checks which flags are necessary for to define h_errno +dnl +AC_DEFUN(APR_CHECK_H_ERRNO_FLAG,[ + AC_MSG_CHECKING([for h_errno in netdb.h]) + AC_CACHE_VAL(ac_cv_h_errno_cppflags,[ + APR_H_ERRNO_COMPILE_CHECK + if test "$ac_cv_h_errno_cppflags" = "no"; then + ac_save="$CPPFLAGS" + for flag in _XOPEN_SOURCE_EXTENDED; do + APR_H_ERRNO_COMPILE_CHECK($flag) + if test "$ac_cv_h_errno_cppflags" != "no"; then + break + fi + done + CPPFLAGS="$ac_save" + fi + ]) + if test "$ac_cv_h_errno_cppflags" != "no"; then + if test "$ac_cv_h_errno_cppflags" != "yes"; then + CPPFLAGS="-D$ac_cv_h_errno_cppflags $CPPFLAGS" + AC_MSG_RESULT([yes, with -D$ac_cv_h_errno_cppflags]) + else + AC_MSG_RESULT([$ac_cv_h_errno_cppflags]) + fi + else + AC_MSG_RESULT([$ac_cv_h_errno_cppflags]) + fi +]) + + +AC_DEFUN(APR_EBCDIC,[ + AC_CACHE_CHECK([whether system uses EBCDIC],ac_cv_ebcdic,[ + AC_TRY_RUN( [ +int main(void) { + return (unsigned char)'A' != (unsigned char)0xC1; +} +],[ + ac_cv_ebcdic="yes" +],[ + ac_cv_ebcdic="no" +],[ + ac_cv_ebcdic="no" +])]) + if test "$ac_cv_ebcdic" = "yes"; then + apr_charset_ebcdic=1 + else + apr_charset_ebcdic=0 + fi + AC_SUBST(apr_charset_ebcdic) +]) + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/build/apr_rules.mk b/rubbos/app/httpd-2.0.64/srclib/apr/build/apr_rules.mk new file mode 100644 index 00000000..78f0ef18 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/build/apr_rules.mk @@ -0,0 +1,194 @@ +# 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. +# +# + +# +# rules.mk: standard rules for APR +# + + + +# +# Configuration variables +# +apr_builddir=/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr +apr_builders=/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/build + +# Some layouts require knowing what version we are at. +APR_MAJOR_VERSION=0 +APR_DOTTED_VERSION=0.9.19 + +CC=gcc +RM=rm +AWK=gawk +SHELL=/bin/bash +LIBTOOL=$(SHELL) $(apr_builddir)/libtool + +# compilation and linking flags that are supposed to be set only by the user. +# configure adds to them for tests, but we restore them at the end. +# +CFLAGS= +CPPFLAGS= +LDFLAGS= +LIBS= +DEFS=-DHAVE_CONFIG_H + +# anything added to the standard flags by configure is moved to EXTRA_* +# at the end of the process. +# +EXTRA_CFLAGS=-g -O2 -pthread +EXTRA_CPPFLAGS=-D_REENTRANT -D_GNU_SOURCE +EXTRA_LDFLAGS= +EXTRA_LIBS=-lrt -lm -lcrypt -lnsl -lpthread -ldl +EXTRA_INCLUDES= + +# NOTEST_* are flags and libraries that can be added by the user without +# causing them to be used in configure tests (necessary for things like +# -Werror and other strict warnings that maintainers like to use). +# +NOTEST_CFLAGS= +NOTEST_CPPFLAGS= +NOTEST_LDFLAGS= +NOTEST_LIBS= + +# Finally, 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. +# +ALL_CFLAGS = $(EXTRA_CFLAGS) $(NOTEST_CFLAGS) $(CFLAGS) +ALL_CPPFLAGS = $(DEFS) $(EXTRA_CPPFLAGS) $(NOTEST_CPPFLAGS) $(CPPFLAGS) +ALL_LDFLAGS = $(EXTRA_LDFLAGS) $(NOTEST_LDFLAGS) $(LDFLAGS) +ALL_LIBS = $(LIBS) $(NOTEST_LIBS) $(EXTRA_LIBS) +ALL_INCLUDES = $(INCLUDES) $(EXTRA_INCLUDES) + +LTFLAGS = --silent +LT_LDFLAGS = + +# +# Basic macro setup +# +COMPILE = $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(ALL_INCLUDES) +LT_COMPILE = $(LIBTOOL) $(LTFLAGS) --mode=compile $(COMPILE) -c $< && touch $@ + +LINK = $(LIBTOOL) $(LTFLAGS) --mode=link $(LT_LDFLAGS) $(COMPILE) -version-info 9:19:9 $(ALL_LDFLAGS) -o $@ + +APR_MKDIR = $(apr_builders)/mkdir.sh +APR_MKEXPORT = $(AWK) -f $(apr_builders)/make_exports.awk +APR_MKVAREXPORT = $(AWK) -f $(apr_builders)/make_var_export.awk +MKDEP = $(CC) -MM + +# +# Standard build rules +# +all: all-recursive +depend: depend-recursive +clean: clean-recursive +distclean: distclean-recursive +extraclean: extraclean-recursive + +install: all-recursive + + +all-recursive depend-recursive: + @otarget=`echo $@ | sed s/-recursive//`; \ + list='$(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='$(SUBDIRS) $(CLEAN_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 + +# autoconf 2.5x is creating a 'autom4te.cache' directory +# In case someone ran autoconf by hand, get rid of that directory +# aswell. +local-clean: x-local-clean + $(RM) -f *.o *.lo *.a *.la *.so *.obj $(CLEAN_TARGETS) $(PROGRAMS) + $(RM) -rf .libs autom4te.cache + +local-distclean: local-clean x-local-distclean + $(RM) -f 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 + +local-all: $(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; \ + fi + +# to be filled in by the actual Makefile +x-local-depend x-local-clean x-local-distclean x-local-extraclean: + +# +# Implicit rules for creating outputs from input files +# +.SUFFIXES: +.SUFFIXES: .c .lo .o + +.c.o: + $(COMPILE) -c $< + +.c.lo: + $(LT_COMPILE) + +.PHONY: all all-recursive local-all install \ + 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 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/build/apr_rules.mk.in b/rubbos/app/httpd-2.0.64/srclib/apr/build/apr_rules.mk.in new file mode 100644 index 00000000..a5433367 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/build/apr_rules.mk.in @@ -0,0 +1,194 @@ +# 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. +# +# + +# +# rules.mk: standard rules for APR +# + +@SET_MAKE@ + +# +# Configuration variables +# +apr_builddir=@apr_builddir@ +apr_builders=@apr_builders@ + +# Some layouts require knowing what version we are at. +APR_MAJOR_VERSION=@APR_MAJOR_VERSION@ +APR_DOTTED_VERSION=@APR_DOTTED_VERSION@ + +CC=@CC@ +RM=@RM@ +AWK=@AWK@ +SHELL=@SHELL@ +LIBTOOL=@LIBTOOL@ + +# compilation and linking flags that are supposed to be set only by the user. +# configure adds to them for tests, but we restore them at the end. +# +CFLAGS=@CFLAGS@ +CPPFLAGS=@CPPFLAGS@ +LDFLAGS=@LDFLAGS@ +LIBS=@LIBS@ +DEFS=@DEFS@ + +# anything added to the standard flags by configure is moved to EXTRA_* +# at the end of the process. +# +EXTRA_CFLAGS=@EXTRA_CFLAGS@ +EXTRA_CPPFLAGS=@EXTRA_CPPFLAGS@ +EXTRA_LDFLAGS=@EXTRA_LDFLAGS@ +EXTRA_LIBS=@EXTRA_LIBS@ +EXTRA_INCLUDES=@EXTRA_INCLUDES@ + +# NOTEST_* are flags and libraries that can be added by the user without +# causing them to be used in configure tests (necessary for things like +# -Werror and other strict warnings that maintainers like to use). +# +NOTEST_CFLAGS=@NOTEST_CFLAGS@ +NOTEST_CPPFLAGS=@NOTEST_CPPFLAGS@ +NOTEST_LDFLAGS=@NOTEST_LDFLAGS@ +NOTEST_LIBS=@NOTEST_LIBS@ + +# Finally, 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. +# +ALL_CFLAGS = $(EXTRA_CFLAGS) $(NOTEST_CFLAGS) $(CFLAGS) +ALL_CPPFLAGS = $(DEFS) $(EXTRA_CPPFLAGS) $(NOTEST_CPPFLAGS) $(CPPFLAGS) +ALL_LDFLAGS = $(EXTRA_LDFLAGS) $(NOTEST_LDFLAGS) $(LDFLAGS) +ALL_LIBS = $(LIBS) $(NOTEST_LIBS) $(EXTRA_LIBS) +ALL_INCLUDES = $(INCLUDES) $(EXTRA_INCLUDES) + +LTFLAGS = @LTFLAGS@ +LT_LDFLAGS = @LT_LDFLAGS@ + +# +# Basic macro setup +# +COMPILE = $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(ALL_INCLUDES) +LT_COMPILE = @lt_compile@ + +LINK = @link@ + +APR_MKDIR = $(apr_builders)/mkdir.sh +APR_MKEXPORT = $(AWK) -f $(apr_builders)/make_exports.awk +APR_MKVAREXPORT = $(AWK) -f $(apr_builders)/make_var_export.awk +MKDEP = @MKDEP@ + +# +# Standard build rules +# +all: all-recursive +depend: depend-recursive +clean: clean-recursive +distclean: distclean-recursive +extraclean: extraclean-recursive + +install: all-recursive + + +all-recursive depend-recursive: + @otarget=`echo $@ | sed s/-recursive//`; \ + list='$(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='$(SUBDIRS) $(CLEAN_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 + +# autoconf 2.5x is creating a 'autom4te.cache' directory +# In case someone ran autoconf by hand, get rid of that directory +# aswell. +local-clean: x-local-clean + $(RM) -f *.o *.lo *.a *.la *.so *.obj $(CLEAN_TARGETS) $(PROGRAMS) + $(RM) -rf .libs autom4te.cache + +local-distclean: local-clean x-local-distclean + $(RM) -f 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 + +local-all: $(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; \ + fi + +# to be filled in by the actual Makefile +x-local-depend x-local-clean x-local-distclean x-local-extraclean: + +# +# Implicit rules for creating outputs from input files +# +.SUFFIXES: +.SUFFIXES: .c .lo .o + +.c.o: + $(COMPILE) -c $< + +.c.lo: + $(LT_COMPILE) + +.PHONY: all all-recursive local-all install \ + 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 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/build/apr_rules.out b/rubbos/app/httpd-2.0.64/srclib/apr/build/apr_rules.out new file mode 100644 index 00000000..fc2d641f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/build/apr_rules.out @@ -0,0 +1,194 @@ +# 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. +# +# + +# +# rules.mk: standard rules for APR +# + + + +# +# Configuration variables +# +apr_builddir=/bottlenecks/rubbos/app/apache2/build +apr_builders=/bottlenecks/rubbos/app/apache2/build + +# Some layouts require knowing what version we are at. +APR_MAJOR_VERSION=0 +APR_DOTTED_VERSION=0.9.19 + +CC=gcc +RM=rm +AWK=gawk +SHELL=/bin/bash +LIBTOOL=$(SHELL) $(apr_builddir)/libtool + +# compilation and linking flags that are supposed to be set only by the user. +# configure adds to them for tests, but we restore them at the end. +# +CFLAGS= +CPPFLAGS= +LDFLAGS= +LIBS= +DEFS=-DHAVE_CONFIG_H + +# anything added to the standard flags by configure is moved to EXTRA_* +# at the end of the process. +# +EXTRA_CFLAGS=-g -O2 -pthread +EXTRA_CPPFLAGS=-D_REENTRANT -D_GNU_SOURCE +EXTRA_LDFLAGS= +EXTRA_LIBS=-lrt -lm -lcrypt -lnsl -lpthread -ldl +EXTRA_INCLUDES= + +# NOTEST_* are flags and libraries that can be added by the user without +# causing them to be used in configure tests (necessary for things like +# -Werror and other strict warnings that maintainers like to use). +# +NOTEST_CFLAGS= +NOTEST_CPPFLAGS= +NOTEST_LDFLAGS= +NOTEST_LIBS= + +# Finally, 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. +# +ALL_CFLAGS = $(EXTRA_CFLAGS) $(NOTEST_CFLAGS) $(CFLAGS) +ALL_CPPFLAGS = $(DEFS) $(EXTRA_CPPFLAGS) $(NOTEST_CPPFLAGS) $(CPPFLAGS) +ALL_LDFLAGS = $(EXTRA_LDFLAGS) $(NOTEST_LDFLAGS) $(LDFLAGS) +ALL_LIBS = $(LIBS) $(NOTEST_LIBS) $(EXTRA_LIBS) +ALL_INCLUDES = $(INCLUDES) $(EXTRA_INCLUDES) + +LTFLAGS = --silent +LT_LDFLAGS = + +# +# Basic macro setup +# +COMPILE = $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(ALL_INCLUDES) +LT_COMPILE = $(LIBTOOL) $(LTFLAGS) --mode=compile $(COMPILE) -c $< && touch $@ + +LINK = $(LIBTOOL) $(LTFLAGS) --mode=link $(LT_LDFLAGS) $(COMPILE) -version-info 9:19:9 $(ALL_LDFLAGS) -o $@ + +APR_MKDIR = $(apr_builders)/mkdir.sh +APR_MKEXPORT = $(AWK) -f $(apr_builders)/make_exports.awk +APR_MKVAREXPORT = $(AWK) -f $(apr_builders)/make_var_export.awk +MKDEP = $(CC) -MM + +# +# Standard build rules +# +all: all-recursive +depend: depend-recursive +clean: clean-recursive +distclean: distclean-recursive +extraclean: extraclean-recursive + +install: all-recursive + + +all-recursive depend-recursive: + @otarget=`echo $@ | sed s/-recursive//`; \ + list='$(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='$(SUBDIRS) $(CLEAN_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 + +# autoconf 2.5x is creating a 'autom4te.cache' directory +# In case someone ran autoconf by hand, get rid of that directory +# aswell. +local-clean: x-local-clean + $(RM) -f *.o *.lo *.a *.la *.so *.obj $(CLEAN_TARGETS) $(PROGRAMS) + $(RM) -rf .libs autom4te.cache + +local-distclean: local-clean x-local-distclean + $(RM) -f 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 + +local-all: $(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; \ + fi + +# to be filled in by the actual Makefile +x-local-depend x-local-clean x-local-distclean x-local-extraclean: + +# +# Implicit rules for creating outputs from input files +# +.SUFFIXES: +.SUFFIXES: .c .lo .o + +.c.o: + $(COMPILE) -c $< + +.c.lo: + $(LT_COMPILE) + +.PHONY: all all-recursive local-all install \ + 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 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/build/apr_threads.m4 b/rubbos/app/httpd-2.0.64/srclib/apr/build/apr_threads.m4 new file mode 100644 index 00000000..8491105a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/build/apr_threads.m4 @@ -0,0 +1,267 @@ +dnl ----------------------------------------------------------------- +dnl apr_threads.m4: APR's autoconf macros for testing thread support +dnl + +dnl +dnl APR_CHECK_PTHREADS_H([ ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) +dnl +dnl gcc issues warnings when parsing AIX 4.3.3's pthread.h +dnl which causes autoconf to incorrectly conclude that +dnl pthreads is not available. +dnl Turn off warnings if we're using gcc. +dnl +AC_DEFUN(APR_CHECK_PTHREADS_H, [ + if test "$GCC" = "yes"; then + SAVE_FL="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS -w" + AC_CHECK_HEADERS(pthread.h, [ $1 ] , [ $2 ] ) + CPPFLAGS="$SAVE_FL" + else + AC_CHECK_HEADERS(pthread.h, [ $1 ] , [ $2 ] ) + fi +])dnl + + +dnl +dnl APR_CHECK_PTHREAD_GETSPECIFIC_TWO_ARGS +dnl +AC_DEFUN(APR_CHECK_PTHREAD_GETSPECIFIC_TWO_ARGS, [ +AC_CACHE_CHECK(whether pthread_getspecific takes two arguments, ac_cv_pthread_getspecific_two_args,[ +AC_TRY_COMPILE([ +#include +],[ +pthread_key_t key; +void *tmp; +pthread_getspecific(key,&tmp); +],[ + ac_cv_pthread_getspecific_two_args=yes +],[ + ac_cv_pthread_getspecific_two_args=no +]) +]) + +if test "$ac_cv_pthread_getspecific_two_args" = "yes"; then + AC_DEFINE(PTHREAD_GETSPECIFIC_TAKES_TWO_ARGS, 1, [Define if pthread_getspecific() has two args]) +fi +])dnl + + +dnl +dnl APR_CHECK_PTHREAD_ATTR_GETDETACHSTATE_ONE_ARG +dnl +AC_DEFUN(APR_CHECK_PTHREAD_ATTR_GETDETACHSTATE_ONE_ARG, [ +AC_CACHE_CHECK(whether pthread_attr_getdetachstate takes one argument, ac_cv_pthread_attr_getdetachstate_one_arg,[ +AC_TRY_COMPILE([ +#include +],[ +pthread_attr_t *attr; +pthread_attr_getdetachstate(attr); +],[ + ac_cv_pthread_attr_getdetachstate_one_arg=yes +],[ + ac_cv_pthread_attr_getdetachstate_one_arg=no +]) +]) + +if test "$ac_cv_pthread_attr_getdetachstate_one_arg" = "yes"; then + AC_DEFINE(PTHREAD_ATTR_GETDETACHSTATE_TAKES_ONE_ARG, 1, [Define if pthread_attr_getdetachstate() has one arg]) +fi +])dnl + + +dnl +dnl APR_PTHREADS_TRY_RUN(actions-if-success) +dnl +dnl Try running a program which uses pthreads, executing the +dnl actions-if-success commands on success. +dnl +AC_DEFUN(APR_PTHREADS_TRY_RUN, [ +AC_TRY_RUN( [ +#include +#include + +void *thread_routine(void *data) { + return data; +} + +int main() { + pthread_t thd; + pthread_mutexattr_t mattr; + pthread_once_t once_init = PTHREAD_ONCE_INIT; + int data = 1; + pthread_mutexattr_init(&mattr); + return pthread_create(&thd, NULL, thread_routine, &data); +} ], [apr_p_t_r=yes], [apr_p_t_r=no], [apr_p_t_r=no]) + +if test $apr_p_t_r = yes; then + $1 +fi + +])dnl + + +dnl +dnl APR_PTHREADS_CHECK() +dnl +dnl Try to find a way to enable POSIX threads. Sets the +dnl pthreads_working variable to "yes" on success. +dnl +AC_DEFUN(APR_PTHREADS_CHECK,[ + +AC_CACHE_CHECK([for CFLAGS needed for pthreads], [apr_cv_pthreads_cflags], +[apr_ptc_cflags=$CFLAGS + for flag in none -kthread -pthread -pthreads -mt -mthreads -Kthread -threads; do + CFLAGS=$apr_ptc_cflags + test "x$flag" != "xnone" && CFLAGS="$CFLAGS $flag" + APR_PTHREADS_TRY_RUN([ + apr_cv_pthreads_cflags="$flag" + break + ]) + done + CFLAGS=$apr_ptc_cflags +]) + +if test -n "$apr_cv_pthreads_cflags"; then + pthreads_working=yes + if test "x$apr_cv_pthreads_cflags" != "xnone"; then + APR_ADDTO(CFLAGS,[$apr_cv_pthreads_cflags]) + fi +fi + +# The CFLAGS may or may not be sufficient to ensure that libapr +# depends on the pthreads library: some versions of libtool +# drop -pthread when passed on the link line; some versions of +# gcc ignore -pthread when linking a shared object. So always +# try and add the relevant library to LIBS too. + +AC_CACHE_CHECK([for LIBS needed for pthreads], [apr_cv_pthreads_lib], [ + apr_ptc_libs=$LIBS + for lib in -lpthread -lpthreads -lc_r; do + LIBS="$apr_ptc_libs $lib" + APR_PTHREADS_TRY_RUN([ + apr_cv_pthreads_lib=$lib + break + ]) + done + LIBS=$apr_ptc_libs +]) + +if test -n "$apr_cv_pthreads_lib"; then + pthreads_working=yes + APR_ADDTO(LIBS,[$apr_cv_pthreads_lib]) +fi + +if test "$pthreads_working" = "yes"; then + threads_result="POSIX Threads found" +else + threads_result="POSIX Threads not found" +fi +])dnl + +dnl +dnl APR_PTHREADS_CHECK_SAVE +dnl APR_PTHREADS_CHECK_RESTORE +dnl +dnl Save the global environment variables that might be modified during +dnl the checks for threading support so that they can restored if the +dnl result is not what the caller wanted. +dnl +AC_DEFUN(APR_PTHREADS_CHECK_SAVE, [ + apr_pthsv_CFLAGS="$CFLAGS" + apr_pthsv_LIBS="$LIBS" +])dnl + +AC_DEFUN(APR_PTHREADS_CHECK_RESTORE, [ + CFLAGS="$apr_pthsv_CFLAGS" + LIBS="$apr_pthsv_LIBS" +])dnl + +dnl +dnl APR_CHECK_SIGWAIT_ONE_ARG +dnl +AC_DEFUN(APR_CHECK_SIGWAIT_ONE_ARG,[ + AC_CACHE_CHECK(whether sigwait takes one argument,ac_cv_sigwait_one_arg,[ + AC_TRY_COMPILE([ +#if defined(__NETBSD__) || defined(DARWIN) + /* When using the unproven-pthreads package, we need to pull in this + * header to get a prototype for sigwait(). Else things will fail later + * on. XXX Should probably be fixed in the unproven-pthreads package. + * Darwin is declaring sigwait() in the wrong place as well. + */ +#include +#endif +#include +],[ + sigset_t set; + + sigwait(&set); +],[ + ac_cv_sigwait_one_arg=yes +],[ + ac_cv_sigwait_one_arg=no +])]) + if test "$ac_cv_sigwait_one_arg" = "yes"; then + AC_DEFINE(SIGWAIT_TAKES_ONE_ARG,1,[ ]) + fi +]) + +dnl Check for recursive mutex support (per SUSv3). +AC_DEFUN([APR_CHECK_PTHREAD_RECURSIVE_MUTEX], [ + AC_CACHE_CHECK([for recursive mutex support], [apr_cv_mutex_recursive], +[AC_TRY_RUN([#include +#include +#include + +int main() { + pthread_mutexattr_t attr; + pthread_mutex_t m; + + exit (pthread_mutexattr_init(&attr) + || pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE) + || pthread_mutex_init(&m, &attr)); +}], [apr_cv_mutex_recursive=yes], [apr_cv_mutex_recursive=no], +[apr_cv_mutex_recursive=no])]) + +if test "$apr_cv_mutex_recursive" = "yes"; then + AC_DEFINE([HAVE_PTHREAD_MUTEX_RECURSIVE], 1, + [Define if recursive pthread mutexes are available]) +fi +]) + +dnl Check for robust process-shared mutex support +AC_DEFUN([APR_CHECK_PTHREAD_ROBUST_SHARED_MUTEX], [ +AC_CACHE_CHECK([for robust cross-process mutex support], +[apr_cv_mutex_robust_shared], +[AC_TRY_RUN([ +#include +#include +#include + +int main(int argc, char **argv) +{ + pthread_mutex_t mutex; + pthread_mutexattr_t attr; + + if (pthread_mutexattr_init(&attr)) + exit(1); + if (pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED)) + exit(2); + if (pthread_mutexattr_setrobust_np(&attr, PTHREAD_MUTEX_ROBUST_NP)) + exit(3); + if (pthread_mutexattr_setprotocol(&attr, PTHREAD_PRIO_INHERIT)) + exit(4); + if (pthread_mutex_init(&mutex, &attr)) + exit(5); + if (pthread_mutexattr_destroy(&attr)) + exit(6); + if (pthread_mutex_destroy(&mutex)) + exit(7); + + exit(0); +}], [apr_cv_mutex_robust_shared=yes], [apr_cv_mutex_robust_shared=no])]) + +if test "$apr_cv_mutex_robust_shared" = "yes"; then + AC_DEFINE([HAVE_PTHREAD_MUTEX_ROBUST], 1, + [Define if cross-process robust mutexes are available]) +fi +]) diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/build/buildcheck.sh b/rubbos/app/httpd-2.0.64/srclib/apr/build/buildcheck.sh new file mode 100755 index 00000000..5670c0f6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/build/buildcheck.sh @@ -0,0 +1,60 @@ +#! /bin/sh + +echo "buildconf: checking installation..." + +# autoconf 2.13 or newer +ac_version=`${AUTOCONF:-autoconf} --version 2>/dev/null|sed -e 's/^[^0-9]*//;s/[a-z]* *$//;q'` +if test -z "$ac_version"; then +echo "buildconf: autoconf not found." +echo " You need autoconf version 2.13 or newer installed" +echo " to build Apache from CVS." +exit 1 +fi +IFS=.; set $ac_version; IFS=' ' +if test "$1" = "2" -a "$2" -lt "13" || test "$1" -lt "2"; then +echo "buildconf: autoconf version $ac_version found." +echo " You need autoconf version 2.13 or newer installed" +echo " to build Apache from CVS." +exit 1 +else +echo "buildconf: autoconf version $ac_version (ok)" +fi + +# Sample libtool --version outputs: +# ltmain.sh (GNU libtool) 1.3.3 (1.385.2.181 1999/07/02 15:49:11) +# ltmain.sh (GNU libtool 1.1361 2004/01/02 23:10:52) 1.5a +# output is multiline from 1.5 onwards + +# Require libtool 1.3.3 or newer +libtool=`build/PrintPath glibtool libtool` +lt_pversion=`$libtool --version 2>/dev/null|sed -e 's/([^)]*)//g;s/^[^0-9]*//;s/[- ].*//g;q'` +if test -z "$lt_pversion"; then +echo "buildconf: libtool not found." +echo " You need libtool version 1.3.3 or newer installed" +echo " to build Apache from CVS." +exit 1 +fi +lt_version=`echo $lt_pversion|sed -e 's/\([a-z]*\)$/.\1/'` +IFS=.; set $lt_version; IFS=' ' +lt_status="good" +if test "$1" = "1"; then + if test "$2" -lt "3"; then + lt_status="bad" + else + if test "$2" = "3"; then + if test -z "$3" -o "$3" = "1" -o "$3" = "2"; then + lt_status="bad" + fi + fi + fi +fi +if test $lt_status = "good"; then + echo "buildconf: libtool version $lt_pversion (ok)" + exit 0 +fi + +echo "buildconf: libtool version $lt_pversion found." +echo " You need libtool version 1.3.3 or newer installed" +echo " to build Apache from CVS." + +exit 1 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/build/config.guess b/rubbos/app/httpd-2.0.64/srclib/apr/build/config.guess new file mode 100755 index 00000000..115f944a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/build/config.guess @@ -0,0 +1,1502 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 +# Free Software Foundation, Inc. + +timestamp='2010-04-03' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA +# 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + + +# Originally written by Per Bothner. Please send patches (context +# diff format) to and include a ChangeLog +# entry. +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, +2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free +Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +trap 'exit 1' HUP INT TERM + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +set_cc_for_build=' +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" HUP INT PIPE TERM ; +: ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +dummy=$tmp/dummy ; +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > $dummy.c ; + for c in cc gcc c89 c99 ; do + if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac ; set_cc_for_build= ;' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE_ARCH}" in + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ELF__ + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "${UNAME_VERSION}" in + Debian*) + release='-gnu' + ;; + *) + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} + exit ;; + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + exit ;; + *:SolidBSD:*:*) + echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} + exit ;; + macppc:MirBSD:*:*) + echo powerpc-unknown-mirbsd${UNAME_RELEASE} + exit ;; + *:MirBSD:*:*) + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE="alpha" ;; + "EV4.5 (21064)") + UNAME_MACHINE="alpha" ;; + "LCA4 (21066/21068)") + UNAME_MACHINE="alpha" ;; + "EV5 (21164)") + UNAME_MACHINE="alphaev5" ;; + "EV5.6 (21164A)") + UNAME_MACHINE="alphaev56" ;; + "EV5.6 (21164PC)") + UNAME_MACHINE="alphapca56" ;; + "EV5.7 (21164PC)") + UNAME_MACHINE="alphapca57" ;; + "EV6 (21264)") + UNAME_MACHINE="alphaev6" ;; + "EV6.7 (21264A)") + UNAME_MACHINE="alphaev67" ;; + "EV6.8CB (21264C)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8AL (21264B)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8CX (21264D)") + UNAME_MACHINE="alphaev68" ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE="alphaev69" ;; + "EV7 (21364)") + UNAME_MACHINE="alphaev7" ;; + "EV7.9 (21364A)") + UNAME_MACHINE="alphaev79" ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + exit ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit ;; + arm:riscos:*:*|arm:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + s390x:SunOS:*:*) + echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) + echo i386-pc-auroraux${UNAME_RELEASE} + exit ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + eval $set_cc_for_build + SUN_ARCH="i386" + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH="x86_64" + fi + fi + echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && + dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`$dummy $dummyarg` && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos${UNAME_RELEASE} + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit ;; + *:AIX:*:[456]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include + #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 [ ${HP_ARCH} = "hppa2.0w" ] + then + eval $set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | + grep -q __LP64__ + then + HP_ARCH="hppa2.0w" + else + HP_ARCH="hppa64" + fi + fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:FreeBSD:*:*) + case ${UNAME_MACHINE} in + pc98) + echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + amd64) + echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + *) + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + esac + exit ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit ;; + *:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit ;; + i*:windows32*:*) + # uname -m includes "-pc" on this system. + echo ${UNAME_MACHINE}-mingw32 + exit ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit ;; + *:Interix*:*) + case ${UNAME_MACHINE} in + x86) + echo i586-pc-interix${UNAME_RELEASE} + exit ;; + authenticamd | genuineintel | EM64T) + echo x86_64-unknown-interix${UNAME_RELEASE} + exit ;; + IA64) + echo ia64-unknown-interix${UNAME_RELEASE} + exit ;; + esac ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit ;; + 8664:Windows_NT:*) + echo x86_64-pc-mks + exit ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-unknown-cygwin + exit ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + *:GNU:*:*) + # the GNU system + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu + exit ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep -q ld.so.1 + if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + exit ;; + arm*:Linux:*:*) + eval $set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + echo ${UNAME_MACHINE}-unknown-linux-gnu + else + echo ${UNAME_MACHINE}-unknown-linux-gnueabi + fi + exit ;; + avr32*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + cris:Linux:*:*) + echo cris-axis-linux-gnu + exit ;; + crisv32:Linux:*:*) + echo crisv32-axis-linux-gnu + exit ;; + frv:Linux:*:*) + echo frv-unknown-linux-gnu + exit ;; + i*86:Linux:*:*) + LIBC=gnu + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #ifdef __dietlibc__ + LIBC=dietlibc + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` + echo "${UNAME_MACHINE}-pc-linux-${LIBC}" + exit ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + mips:Linux:*:* | mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef ${UNAME_MACHINE} + #undef ${UNAME_MACHINE}el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=${UNAME_MACHINE}el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=${UNAME_MACHINE} + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + ;; + or32:Linux:*:*) + echo or32-unknown-linux-gnu + exit ;; + padre:Linux:*:*) + echo sparc-unknown-linux-gnu + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-gnu + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-gnu ;; + PA8*) echo hppa2.0-unknown-linux-gnu ;; + *) echo hppa-unknown-linux-gnu ;; + esac + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-gnu + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-gnu + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + vax:Linux:*:*) + echo ${UNAME_MACHINE}-dec-linux-gnu + exit ;; + x86_64:Linux:*:*) + echo x86_64-unknown-linux-gnu + exit ;; + xtensa*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo ${UNAME_MACHINE}-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i586. + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configury will decide that + # this is a cross-build. + echo i586-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + NCR*:*:4.2:* | MPRAS*:*:4.2:*) + OS_REL='.3' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo ${UNAME_MACHINE}-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + echo i586-pc-haiku + exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} + exit ;; + SX-7:SUPER-UX:*:*) + echo sx7-nec-superux${UNAME_RELEASE} + exit ;; + SX-8:SUPER-UX:*:*) + echo sx8-nec-superux${UNAME_RELEASE} + exit ;; + SX-8R:SUPER-UX:*:*) + echo sx8r-nec-superux${UNAME_RELEASE} + exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + case $UNAME_PROCESSOR in + i386) + eval $set_cc_for_build + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + UNAME_PROCESSOR="x86_64" + fi + fi ;; + unknown) UNAME_PROCESSOR=powerpc ;; + esac + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = "x86"; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NSE-?:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk${UNAME_RELEASE} + exit ;; + NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} + exit ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "${UNAME_MACHINE}" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' + exit ;; + i*86:rdos:*:*) + echo ${UNAME_MACHINE}-pc-rdos + exit ;; + i*86:AROS:*:*) + echo ${UNAME_MACHINE}-pc-aros + exit ;; +esac + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +eval $set_cc_for_build +cat >$dummy.c < +# include +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix\n"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +# if !defined (ultrix) +# include +# if defined (BSD) +# if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +# else +# if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# endif +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# else + printf ("vax-dec-ultrix\n"); exit (0); +# endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + c34*) + echo c34-convex-bsd + exit ;; + c38*) + echo c38-convex-bsd + exit ;; + c4*) + echo c4-convex-bsd + exit ;; + esac +fi + +cat >&2 < in order to provide the needed +information to handle your system. + +config.guess timestamp = $timestamp + +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/build/config.sub b/rubbos/app/httpd-2.0.64/srclib/apr/build/config.sub new file mode 100755 index 00000000..204218c0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/build/config.sub @@ -0,0 +1,1731 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 +# Free Software Foundation, Inc. + +timestamp='2010-05-21' + +# This file is (in principle) common to ALL GNU software. +# The presence of a machine in this file suggests that SOME GNU software +# can handle that machine. It does not imply ALL GNU software can. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA +# 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + + +# Please send patches to . Submit a context +# diff and a properly formatted GNU ChangeLog entry. +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, +2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free +Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ + linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ + knetbsd*-gnu* | netbsd*-gnu* | \ + kopensolaris*-gnu* | \ + storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis | -knuth | -cray | -microblaze) + os= + basic_machine=$1 + ;; + -bluegene*) + os=-cnk + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco6) + os=-sco5v6 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ + | bfin \ + | c4x | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | fido | fr30 | frv \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ + | lm32 \ + | m32c | m32r | m32rle | m68000 | m68k | m88k \ + | maxq | mb | microblaze | mcore | mep | metag \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64octeon | mips64octeonel \ + | mips64orion | mips64orionel \ + | mips64r5900 | mips64r5900el \ + | mips64vr | mips64vrel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | moxie \ + | mt \ + | msp430 \ + | nios | nios2 \ + | ns16k | ns32k \ + | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ + | pyramid \ + | rx \ + | score \ + | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ + | spu | strongarm \ + | tahoe | thumb | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ + | ubicom32 \ + | v850 | v850e \ + | we32k \ + | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ + | z8k | z80) + basic_machine=$basic_machine-unknown + ;; + c54x) + basic_machine=tic54x-unknown + ;; + c55x) + basic_machine=tic55x-unknown + ;; + c6x) + basic_machine=tic6x-unknown + ;; + m6811 | m68hc11 | m6812 | m68hc12 | picochip) + # Motorola 68HC11/12. + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + ms1) + basic_machine=mt-unknown + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* | avr32-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* \ + | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ + | lm32-* \ + | m32c-* | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64octeon-* | mips64octeonel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64r5900-* | mips64r5900el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mips64vr5900-* | mips64vr5900el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | mt-* \ + | msp430-* \ + | nios-* | nios2-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ + | pyramid-* \ + | romp-* | rs6000-* | rx-* \ + | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ + | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ + | tahoe-* | thumb-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tile-* | tilegx-* \ + | tron-* \ + | ubicom32-* \ + | v850-* | v850e-* | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ + | xstormy16-* | xtensa*-* \ + | ymp-* \ + | z8k-* | z80-*) + ;; + # Recognize the basic CPU types without company name, with glob match. + xtensa*) + basic_machine=$basic_machine-unknown + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + abacus) + basic_machine=abacus-unknown + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amd64) + basic_machine=x86_64-pc + ;; + amd64-*) + basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aros) + basic_machine=i386-pc + os=-aros + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + blackfin) + basic_machine=bfin-unknown + os=-linux + ;; + blackfin-*) + basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + bluegene*) + basic_machine=powerpc-ibm + os=-cnk + ;; + c54x-*) + basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c55x-*) + basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c6x-*) + basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + cegcc) + basic_machine=arm-unknown + os=-cegcc + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + craynv) + basic_machine=craynv-cray + os=-unicosmp + ;; + cr16) + basic_machine=cr16-unknown + os=-elf + ;; + crds | unos) + basic_machine=m68k-crds + ;; + crisv32 | crisv32-* | etraxfs*) + basic_machine=crisv32-axis + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + crx) + basic_machine=crx-unknown + os=-elf + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dicos) + basic_machine=i686-pc + os=-dicos + ;; + djgpp) + basic_machine=i586-pc + os=-msdosdjgpp + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; +# I'm not sure what "Sysv32" means. Should this be sysv3.2? + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m68knommu) + basic_machine=m68k-unknown + os=-linux + ;; + m68knommu-*) + basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + microblaze) + basic_machine=microblaze-xilinx + ;; + mingw32) + basic_machine=i386-pc + os=-mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + os=-mingw32ce + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + ms1-*) + basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + openrisc | openrisc-*) + basic_machine=or32-unknown + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + parisc) + basic_machine=hppa-unknown + os=-linux + ;; + parisc-*) + basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pc98) + basic_machine=i386-pc + ;; + pc98-*) + basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2 | pentiumiii | pentium3) + basic_machine=i686-pc + ;; + pentium4) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium4-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc) basic_machine=powerpc-unknown + ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rdos) + basic_machine=i386-pc + os=-rdos + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sde) + basic_machine=mipsisa32-sde + os=-elf + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sh5el) + basic_machine=sh5le-unknown + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + # This must be matched before tile*. + tilegx*) + basic_machine=tilegx-unknown + os=-linux-gnu + ;; + tile*) + basic_machine=tile-unknown + os=-linux-gnu + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xbox) + basic_machine=i686-pc + os=-mingw32 + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + z80-*-coff) + basic_machine=z80-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + mmix) + basic_machine=mmix-knuth + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -auroraux) + os=-auroraux + ;; + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ + | -sym* | -kopensolaris* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* | -aros* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ + | -openbsd* | -solidbsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* | -cegcc* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -linux-android* \ + | -linux-newlib* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ + | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -os400*) + os=-os400 + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -syllable*) + os=-syllable + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -tpf*) + os=-tpf + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -aros*) + os=-aros + ;; + -kaos*) + os=-kaos + ;; + -zvmoe) + os=-zvmoe + ;; + -dicos*) + os=-dicos + ;; + -nacl*) + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + score-*) + os=-elf + ;; + spu-*) + os=-elf + ;; + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + c4x-* | tic4x-*) + os=-coff + ;; + tic54x-*) + os=-coff + ;; + tic55x-*) + os=-coff + ;; + tic6x-*) + os=-coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + # This also exists in the configure program, but was not the + # default. + # os=-sunos4 + ;; + m68*-cisco) + os=-aout + ;; + mep-*) + os=-elf + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-haiku) + os=-haiku + ;; + *-ibm) + os=-aix + ;; + *-knuth) + os=-mmixware + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -cnk*|-aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -os400*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -tpf*) + vendor=ibm + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/build/cvtdsp.pl b/rubbos/app/httpd-2.0.64/srclib/apr/build/cvtdsp.pl new file mode 100644 index 00000000..becb75bd --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/build/cvtdsp.pl @@ -0,0 +1,605 @@ +use IO::File; +use File::Find; + +if ($ARGV[0] eq '-6') { + find(\&tovc6, '.'); +} +elsif ($ARGV[0] eq '-5') { + find(\&tovc5, '.'); +} +elsif ($ARGV[0] eq '-2005') { + find(\&tovc2005, '.'); +} +elsif ($ARGV[0] eq '-w3') { + find(\&tow3, '.'); +} +elsif ($ARGV[0] eq '-w4') { + find(\&tow4, '.'); +} +elsif ($ARGV[0] eq '-ia64') { + find(\&tovc64, '.'); +} +elsif ($ARGV[0] eq '-d') { + find(\&todebugpools, '.'); +} +elsif ($ARGV[0] eq '-b') { + find(\&tobrowse, '.'); +} +elsif ($ARGV[0] eq '-mt') { + find(\&addmt, '.'); +} +elsif ($ARGV[0] eq '-m') { + ## 0 - conapp, 1 - dll lib, 2 - static lib + $dsptype = 2; + $name = "apr"; + onemake(); +} +else { + print "Specify -5 or -6 for Visual Studio 5 or 6 (98) .dsp format\n"; + print "Specify -w3 or -w4 for .dsp build with warning level 3 or 4 (strict)\n\n"; + print "Specify -ia64 for build targeted at Itanium (req's psdk tools)\n\n"; + print "Specify -p for extreme pool debugging\n\n"; + print "Specify -mt to add .manifest embedding\n\n"; + die "Missing argument"; +} + +sub addmt { + my $outpath, $outtype; + + if (m|\.dsp$|) { + $oname = $_; + $tname = '.#' . $_; + $verchg = 0; + $srcfl = new IO::File $oname, "r" || die; + $dstfl = new IO::File $tname, "w" || die; + while ($src = <$srcfl>) { + if ($src =~ m|^# TARGTYPE .+ Application|) { + $outtype = ".exe" + } + if ($src =~ m|^# TARGTYPE .+ Dynamic-Link|) { + $outtype = ".dll" + } + if ($src =~ m|^# PROP Output_Dir "(.+)"|) { + $outdir = $1; + $outpath = $oname; + $outpath =~ s|\.dsp||; + $outpath = ".\\" . $outdir . "\\" . $outpath . $outtype; + } + if ($src =~ m|^# ADD (BASE )?LINK32 .+ /out:"([^"]+)"|) { + $outpath = $2; + $outpath =~ s|/|\\|; + $outpath = ".\\" . $outpath if (!($outpath =~ m|^\.|)); + $src =~ s|/out:"([^"]+)"|/out:"$outpath"|; + } + if (defined($outpath) && ($src =~ m|^# Begin Special Build Tool|)) { + undef $outpath; + } + if (defined($outpath) && defined($outtype) && ($src =~ m|^\s*$|)) { + print $dstfl '# Begin Special Build Tool' . "\n"; + print $dstfl 'TargetPath=' . $outpath . "\n"; + print $dstfl 'SOURCE="$(InputPath)"' . "\n"; + print $dstfl 'PostBuild_Desc=Embed .manifest' . "\n"; + print $dstfl 'PostBuild_Cmds=if exist $(TargetPath).manifest mt.exe -manifest $(TargetPath).manifest -outputresource:$(TargetPath);2' . "\n"; + print $dstfl '# End Special Build Tool' . "\n"; + $verchg = -1; + undef $outpath; + } + print $dstfl $src; + } + undef $outtype if (defined($outtype)); + undef $outpath if (defined($outpath)); + undef $srcfl; + undef $dstfl; + if ($verchg) { + unlink $oname || die; + rename $tname, $oname || die; + print "Added manifest to " . $oname . " in " . $File::Find::dir . "\n"; + } + else { + unlink $tname; + } + } +} +sub tovc5 { + + if (m|\.dsp$|) { + $oname = $_; + $tname = '.#' . $_; + $verchg = 0; + $srcfl = new IO::File $oname, "r" || die; + $dstfl = new IO::File $tname, "w" || die; + while ($src = <$srcfl>) { + if ($src =~ s|Format Version 6\.00|Format Version 5\.00|) { + $verchg = -1; + } + if ($src =~ s|^(# ADD CPP .*)/ZI (.*)|$1/Zi $2|) { + $verchg = -1; + } + if ($src =~ s|^(# ADD BASE CPP .*)/ZI (.*)|$1/Zi $2|) { + $verchg = -1; + } + if ($src =~ s|^(# ADD CPP .*)/EHsc (.*)|$1/GX $2|) { + $verchg = -1; + } + if ($src =~ s|^(# ADD BASE CPP .*)/EHsc (.*)|$1/GX $2|) { + $verchg = -1; + } + while ($src =~ s|^(# ADD RSC .*)/d "([^ ="]+)=([^"]+)"|$1/d $2="$3"|) { + $verchg = -1; + } + if ($src !~ m|^# PROP AllowPerConfigDependencies|) { + print $dstfl $src; } + else { + $verchg = -1; + } + } + undef $srcfl; + undef $dstfl; + if ($verchg) { + unlink $oname || die; + rename $tname, $oname || die; + print "Converted VC6 project " . $oname . " to VC5 in " . $File::Find::dir . "\n"; + } + else { + unlink $tname; + } + } +} + +sub tovc6 { + + if (m|\.dsp$|) { + $oname = $_; + $tname = '.#' . $_; + $verchg = 0; + $srcfl = new IO::File $_, "r" || die; + $dstfl = new IO::File $tname, "w" || die; + while ($src = <$srcfl>) { + if ($src =~ s|Format Version 5\.00|Format Version 6\.00|) { + $verchg = -1; + } + if ($src =~ s|^(!MESSAGE .*)\\\n|$1|) { + $cont = <$srcfl>; + $src = $src . $cont; + $verchg = -1; + } + if ($src =~ s|^(# ADD CPP .*)/GX (.*)|$1/EHsc $2|) { + $verchg = -1; + } + if ($src =~ s|^(# ADD BASE CPP .*)/GX (.*)|$1/EHsc $2|) { + $verchg = -1; + } + while ($src =~ s|^(# ADD RSC .*)/d "([^ ="]+)=([^"]+)"|$1/d $2="$3"|) { + $verchg = -1; + } + print $dstfl $src; + if ($verchg && $src =~ m|^# Begin Project|) { + print $dstfl "# PROP AllowPerConfigDependencies 0\n"; + } + } + undef $srcfl; + undef $dstfl; + if ($verchg) { + unlink $oname || die; + rename $tname, $oname || die; + print "Converted VC5 project " . $oname . " to VC6 in " . $File::Find::dir . "\n"; + } + else { + unlink $tname; + } + } +} + +sub tovc2005 { + + if (m|\.dsp$| || m|\.mak$|) { + $oname = $_; + $tname = '.#' . $_; + $verchg = 0; + $srcfl = new IO::File $_, "r" || die; + $dstfl = new IO::File $tname, "w" || die; + while ($src = <$srcfl>) { + if ($src =~ s|(\bCPP.*) /GX(.*)|$1 /EHsc$2|) { + $verchg = -1; + } + if ($src =~ s|(\bLINK32.*) /machine:I386(.*)|$1$2|) { + $verchg = -1; + } + while ($src =~ s|^(# ADD RSC .*)/d ([^ ="]+)="([^"]+)"|$1/d "$2=$3"|) { + $verchg = -1; + } + print $dstfl $src; + } + undef $srcfl; + undef $dstfl; + if ($verchg) { + unlink $oname || die; + rename $tname, $oname || die; + print "Converted project " . $oname . " to 2005 in " . $File::Find::dir . "\n"; + } + else { + unlink $tname; + } + } +} + +sub tow3 { + + if (m|\.dsp$| || m|\.mak$|) { + $oname = $_; + $tname = '.#' . $_; + $verchg = 0; + $srcfl = new IO::File $_, "r" || die; + $dstfl = new IO::File $tname, "w" || die; + while ($src = <$srcfl>) { + while ($src =~ m|\\\n$|) { + $src = $src . <$srcfl> + } + if ($src =~ s|(\bCPP.*) /W4(.*)|$1 /W3$2|) { + $verchg = -1; + } + print $dstfl $src; + } + undef $srcfl; + undef $dstfl; + if ($verchg) { + unlink $oname || die; + rename $tname, $oname || die; + print "Converted project " . $oname . " to warn:3 in " . $File::Find::dir . "\n"; + } + else { + unlink $tname; + } + } +} + +sub tow4 { + + if (m|\.dsp$| || m|\.mak$|) { + $oname = $_; + $tname = '.#' . $_; + $verchg = 0; + $srcfl = new IO::File $_, "r" || die; + $dstfl = new IO::File $tname, "w" || die; + while ($src = <$srcfl>) { + while ($src =~ m|\\\n$|) { + $src = $src . <$srcfl> + } + if ($src =~ s|(\bCPP.*) /W3(.*)|$1 /W4$2|) { + $verchg = -1; + } + print $dstfl $src; + } + undef $srcfl; + undef $dstfl; + if ($verchg) { + unlink $oname || die; + rename $tname, $oname || die; + print "Converted project " . $oname . " to warn:4 " . $File::Find::dir . "\n"; + } + else { + unlink $tname; + } + } +} + +sub tovc64 { + + if (m|\.dsp$| || m|\.mak$|) { + $oname = $_; + $tname = '.#' . $_; + $verchg = 0; + $srcfl = new IO::File $_, "r" || die; + $dstfl = new IO::File $tname, "w" || die; + while ($src = <$srcfl>) { + while ($src =~ m|\\\n$|) { + $src = $src . <$srcfl> + } + if ($src =~ s|Win32 \(x86\) (Release)|Win32 (IA64) $1|s) { + $verchg = -1; + } + if ($src =~ s|Win32 \(x86\) (Debug)|Win32 (IA64) $1|s) { + $verchg = -1; + } + if ($src =~ s| - Win32 (Release)| - Win32 (IA64) $1|s) { + $verchg = -1; + } + if ($src =~ s| - Win32 (Debug)| - Win32 (IA64) $1|s) { + $verchg = -1; + } + # Cross compilation exceptions + if (!(m|gen[^/]*$| || m|dftables[^/]*$|)) { + if ($src =~ s|(\bCPP.* /W3)(.*) /FD(.*)|$1 /As64 /Wp64$2$3|s) { + $verchg = -1; + } + if ($src =~ s|(\bLINK.*/machine):I386(.*)|$1:IA64$2|s) { + $verchg = -1; + } + } + else { + if ($src =~ s|(\bCPP.* /W3)(.*) /FD(.*)|$1 /As32 /Wp64$2$3|s) { + $verchg = -1; + } + } + print $dstfl $src; + } + undef $srcfl; + undef $dstfl; + if ($verchg) { + unlink $oname || die; + rename $tname, $oname || die; + print "Converted build file " . $oname . " to Win64 in " . $File::Find::dir . "\n"; + } + else { + unlink $tname; + } + } +} + +sub todebugpools { + + if (m|\.dsp$|) { + $oname = $_; + $tname = '.#' . $_; + $verchg = 0; + $srcfl = new IO::File $oname, "r" || die; + $dstfl = new IO::File $tname, "w" || die; + while ($src = <$srcfl>) { + if ($src =~ s|^(# ADD CPP .* /D "_DEBUG" )|$1/D "APR_POOL_DEBUG" |) { + $verchg = -1; + if ($oname =~ /apr\.dsp$/) { + $src =~ s|^(# ADD CPP .* /D "_DEBUG" )|$1/D "POOL_DEBUG" |; + } + } + print $dstfl $src; + } + undef $srcfl; + undef $dstfl; + if ($verchg) { + unlink $oname || die; + rename $tname, $oname || die; + print "Converted project " . $oname . " to debug pools in " . $File::Find::dir . "\n"; + } + else { + unlink $tname; + } + } +} + +sub tobrowsesources { + + if (m|\.dsp$|) { + $oname = $_; + $tname = '.#' . $_; + $verchg = 0; + $srcfl = new IO::File $oname, "r" || die; + $dstfl = new IO::File $tname, "w" || die; + while ($src = <$srcfl>) { + if ($src =~ s|^(# ADD CPP .*)( /Fd)|$1 /Fr "/httpd-2.0/srclib/apr"$2|) { + $verchg = -1; + } + print $dstfl $src; + } + undef $srcfl; + undef $dstfl; + if ($verchg) { + unlink $oname || die; + rename $tname, $oname || die; + print "Converted project " . $oname . " to browse sources in " . $File::Find::dir . "\n"; + } + else { + unlink $tname; + } + } +} + +sub frommakefiles { + + if (m|\.mak\.in$|) { + $oname = $_; + $dname = $_; + $_ =~ s/\.mak\.in/.dsp/; + $verchg = 0; + $srcfl = new IO::File $oname, "r" || die; + $dstfl = new IO::File $tname, "w" || die; + while ($src = <$srcfl>) { + if ($src =~ s|^(# ADD CPP .*)( /Fd)|$1 /Fr "/httpd-2.0/srclib/apr"$2|) { + $verchg = -1; + } + print $dstfl $src; + } + undef $srcfl; + undef $dstfl; + if ($verchg) { + unlink $oname || die; + rename $tname, $oname || die; + print "Converted project " . $oname . " to browse sources in " . $File::Find::dir . "\n"; + } + else { + unlink $tname; + } + } +} + + +sub onemake { + + if ($dsptype == 0) { + $cdefs = qq{/D "WIN32" /D "_CONSOLE"}; + $lmodel = qq{/subsystem:console}; + $targname = "Win32 (x86) Console Application"; + $targid = "0x0103"; + $debpath = "Debug"; $relpath = "Release"; + } elsif ($dsptype == 1) { + $cdefs = qq{/D "WIN32" /D "_WINDOWS"}; + $lmodel = qq{/subsystem:windows /dll}; + $targname = "Win32 (x86) Dynamic-Link Library"; + $targid = "0x0102"; + $debpath = "Debug"; $relpath = "Release"; + } elsif($dsptype == 2) { + $cdefs = qq{/D "WIN32" /D "_CONSOLE"}; + $lmodel = qq{/subsystem:console}; + $targname = "Win32 (x86) Static Library"; + $targid = "0x0104"; + $debpath = "LibD"; $relpath = "LibR"; + } + $file = dspheader(); + + + $second = ""; + + $model = "Release"; + $usedebuglib = "0"; + $debugdef = "NDEBUG"; + $cflags = "/MD /W3 /O2"; + $cincl = qq{/I "./include" /I "./os/win32" /I "./srclib/apr/include" /I "./srclib/apr-util/include"}; + $lflags = qq{/map}; + $file .= dsponemodel(); + + $second = "ELSE"; + $model = "Debug"; + $usedebuglib = "1"; + $debugdef = "_DEBUG"; + $cflags = "/MDd /W3 /GX /Zi /Od"; + $cincl = qq{/I "./include" /I "./os/win32" /I "./srclib/apr/include" /I "./srclib/apr-util/include"}; + $lflags = qq{/incremental:no /debug}; + $file .= dsponemodel(); + + $file .= qq{ +!ENDIF + +# Begin Target + +# Name "$name - Win32 Release" +# Name "$name - Win32 Debug" +}; + + $toroot = "."; + +#HERE IS OUR FOREACH! + $file .= qq{# Begin Source File + +SOURCE=./server/main.c +# End Source File +}; + + if ($dsptype == 0) { + #HERE IS OUR ICON! + $icon="$toroot/build/win32/apache.ico"; + $file .= qq{# Begin Source File + +SOURCE=$icon +# End Source File +}; + $icon = "icon=" . $icon . " "; + } + if ($dsptype == 0 || $dsptype == 1) { + $file .= qq{ +# Begin Source File + +SOURCE=./$name.rc +# End Source File +# Begin Source File + +SOURCE=$toroot/include/ap_release.h +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=$toroot/include/ap_release.h $toroot/build/win32/win32ver.awk + +"./$name.rc" : \$(SOURCE) "\$(INTDIR)" "\$(OUTDIR)" + awk -f $toroot/build/win32/win32ver.awk $name "Apache HTTP Server" $toroot/include/ap_release.h $icon> ./Apache.rc + +# End Custom Build +# End Source File +}; + } + $file .= qq{ +# End Target +# End Project +}; + print $file; +} + +sub dspheader { + if ($dsptype == 1) { + $midl = "MTL=midl.exe\n"; + } else { + $midl = "" + } +qq{# Microsoft Developer Studio Project File - Name="$name" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "$targname" $targid + +CFG=$name - Win32 Release +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "$name.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 "$name.mak" CFG="$name - Win32 Release" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "$name - Win32 Release" (based on "$targname") +!MESSAGE "$name - Win32 Debug" (based on "$targname") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +${midl}RSC=rc.exe +}; +} +sub dsponemodel { + if ($model eq "Release") { + $targpath = $relpath; + } else { + $targpath = $debpath; + } + if ($dsptype == 1) { + $midl = +qq{# ADD BASE MTL /nologo /D "$debugdef" /win32 +# ADD MTL /nologo /D "$debugdef" /mktyplib203 /win32 +}; } + if ($dsptype == 2) { + $linkop = qq{LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo +}; + } else { + $linkop = qq{LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib ws2_32.lib mswsock.lib /nologo $lmodel $lflags /machine:I386 +# ADD LINK32 kernel32.lib user32.lib advapi32.lib ws2_32.lib mswsock.lib /nologo $lmodel $lflags /machine:I386 +}; + } + +qq{ +!${second}IF "\$(CFG)" == "$name - Win32 $model" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries $usedebuglib +# PROP BASE Output_Dir "$targpath" +# PROP BASE Intermediate_Dir "$targpath" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries $usedebuglib +# PROP Output_Dir "$targpath" +# PROP Intermediate_Dir "$targpath" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo $cflags $cincl /D "$debugdef" $cdefs /FD /c +# ADD CPP /nologo $cflags $cincl /D "$debugdef" $cdefs /Fd"$targpath/$name" /FD /c +${midl}# ADD BASE RSC /l 0x409 /d "$debugdef" +# ADD RSC /l 0x409 /d "$debugdef" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +$linkop}; +} \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/build/find_apr.m4 b/rubbos/app/httpd-2.0.64/srclib/apr/build/find_apr.m4 new file mode 100644 index 00000000..90865aec --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/build/find_apr.m4 @@ -0,0 +1,104 @@ +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]]) +dnl +dnl where srcdir is the location of the bundled APR source directory, or +dnl empty if source is not bundled. +dnl +dnl where blddir 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 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 "$ac_cv_emxos2" = "yes"; then + # Scripts don't pass test -x on OS/2 + TEST_X="test -f" + else + TEST_X="test -x" + fi + + AC_MSG_CHECKING(for APR) + AC_ARG_WITH(apr, + [ --with-apr=DIR|FILE prefix for installed APR, path to APR build tree, + or the full path to apr-config], + [ + if test "$withval" = "no" || test "$withval" = "yes"; then + AC_MSG_ERROR([--with-apr requires a directory to be provided]) + fi + + if $TEST_X "$withval/bin/apr-config"; then + apr_found="yes" + apr_config="$withval/bin/apr-config" + elif $TEST_X "$withval/apr-config"; then + apr_found="yes" + apr_config="$withval/apr-config" + elif $TEST_X "$withval" && $withval --help > /dev/null 2>&1 ; then + apr_found="yes" + apr_config="$withval" + fi + + dnl if --with-apr is used, then the target prefix/directory must be valid + 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 have a bundled source directory, use it + if test -d "$1"; then + apr_temp_abs_srcdir="`cd $1 && pwd`" + apr_found="reconfig" + if test -n "$2"; then + apr_config="$2/apr-config" + else + apr_config="$1/apr-config" + fi + fi + if test "$apr_found" = "no" && test -n "$3" && test "$3" = "1"; then + if apr-config --help > /dev/null 2>&1 ; then + apr_found="yes" + apr_config="apr-config" + else + dnl look in some standard places (apparently not in builtin/default) + for lookdir in /usr /usr/local /opt/apr /usr/local/apache2 ; do + if $TEST_X "$lookdir/bin/apr-config"; then + apr_found="yes" + apr_config="$lookdir/bin/apr-config" + break + fi + done + fi + fi + ]) + + AC_MSG_RESULT($apr_found) +]) diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/build/fixwin32mak.pl b/rubbos/app/httpd-2.0.64/srclib/apr/build/fixwin32mak.pl new file mode 100644 index 00000000..7efdc11b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/build/fixwin32mak.pl @@ -0,0 +1,81 @@ +# +# fixwin32mak.pl ::: Apache/Win32 maintanace program +# +# This program, launched from the build/ directory, replaces all nasty absoulute paths +# in the win32 .mak files with the appropriate relative root. +# +# Run this program prior to committing or packaging any newly exported make files. + +use Cwd; +use IO::File; +use File::Find; + +$root = cwd; +# ignore our own direcory (allowing us to move into any parallel tree) +$root =~ s|^.:(.*)?$|cd "$1|; +$root =~ s|/|\\\\|g; +$altroot = $root; +$altroot =~ s| ".:| "|; +print "Stripping " . $root . " and " . $altroot . "\n"; +find(\&fixcwd, '.'); + +sub fixcwd { + if (m|.mak$|) { + $thisroot = $File::Find::dir; + $thisroot =~ s|^./(.*)$|$1|; + $thisroot =~ s|/|\\\\|g; + $thisroot = $root . "\\\\" . $thisroot; + $thisaltroot = $altroot . "\\\\" . $thisroot; + $oname = $_; + $tname = '.#' . $_; + $verchg = 0; + $srcfl = new IO::File $_, "r" || die; + $dstfl = new IO::File $tname, "w" || die; + while ($src = <$srcfl>) { + if ($src =~ m|^\s*($root[^\"]*)\".*$|) { + $orig = $thisroot; + } elsif ($src =~ m|^\s*($altroot[^\"]*)\".*$|) { + $orig = $thisaltroot; + } + if (defined($orig)) { + $repl = "cd \"."; + while (!($src =~ s|$orig|$repl|)) { + if (!($orig =~ s|^(.*)\\\\[^\\]+$|$1|)) { + break; + } + $repl .= "\\.."; + } + print "Replaced " . $orig . " with " . $repl . "\n"; + $verchg = -1; + undef $orig; + } + print $dstfl $src; + } + undef $srcfl; + undef $dstfl; + if ($verchg) { + unlink $oname || die; + rename $tname, $oname || die; + print "Corrected absolute paths within " . $oname . " in " . $File::Find::dir . "\n"; + } + else { + unlink $tname; + } + $dname = $oname; + $dname =~ s/.mak$/.dsp/; + @dstat = stat($dname); + @ostat = stat($oname); + if ($ostat[9] && $dstat[9] && ($ostat[9] != $dstat[9])) { + @onames = ($oname); + utime $dstat[9], $dstat[9], @onames; + print "Touched datestamp for " . $oname . " in " . $File::Find::dir . "\n"; + } + $oname =~ s/.mak$/.dep/; + @ostat = stat($oname); + if ($ostat[9] && $dstat[9] && ($ostat[9] != $dstat[9])) { + @onames = ($oname); + utime $dstat[9], $dstat[9], @onames; + print "Touched datestamp for " . $oname . " in " . $File::Find::dir . "\n"; + } + } +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/build/get-version.sh b/rubbos/app/httpd-2.0.64/srclib/apr/build/get-version.sh new file mode 100755 index 00000000..fd685b22 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/build/get-version.sh @@ -0,0 +1,37 @@ +#!/bin/sh +# +# 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 VERSION_HEADER PREFIX" + echo " where CMD is one of: all, major, libtool" + exit 1 +fi + +major_sed="/#define.*$3_MAJOR_VERSION/s/^[^0-9]*\([0-9]*\).*$/\1/p" +minor_sed="/#define.*$3_MINOR_VERSION/s/^[^0-9]*\([0-9]*\).*$/\1/p" +patch_sed="/#define.*$3_PATCH_VERSION/s/^[^0-9]*\([0-9]*\).*$/\1/p" +major="`sed -n $major_sed $2`" +minor="`sed -n $minor_sed $2`" +patch="`sed -n $patch_sed $2`" + +if test "$1" = "all"; then + echo ${major}.${minor}.${patch} +elif test "$1" = "major"; then + echo ${major} +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/rubbos/app/httpd-2.0.64/srclib/apr/build/install.sh b/rubbos/app/httpd-2.0.64/srclib/apr/build/install.sh new file mode 100755 index 00000000..9a8821fa --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/build/install.sh @@ -0,0 +1,112 @@ +#!/bin/sh +## +## 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 +## +# +# This script falls under the Apache License. +# See http://www.apache.org/docs/LICENSE + + +# +# 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/rubbos/app/httpd-2.0.64/srclib/apr/build/libapr_app.dsp b/rubbos/app/httpd-2.0.64/srclib/apr/build/libapr_app.dsp new file mode 100644 index 00000000..2067fe30 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/build/libapr_app.dsp @@ -0,0 +1,93 @@ +# Microsoft Developer Studio Project File - Name="libapr_app" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Static Library" 0x0104 + +CFG=libapr_app - 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 "libapr_app.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 "libapr_app.mak" CFG="libapr_app - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "libapr_app - Win32 Release" (based on "Win32 (x86) Static Library") +!MESSAGE "libapr_app - Win32 Debug" (based on "Win32 (x86) Static Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "libapr_app - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../include" /I "../include/arch" /I "../include/arch/win32" /I "../include/arch/unix" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "APR_APP" /Fd"Release\libapr_app_src" /FD /c +# ADD BASE RSC /l 0x409 +# ADD RSC /l 0x409 +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo + +!ELSEIF "$(CFG)" == "libapr_app - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../include" /I "../include/arch" /I "../include/arch/win32" /I "../include/arch/unix" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "APR_APP" /Fd"Debug\libapr_app_src" /FD /c +# ADD BASE RSC /l 0x409 +# ADD RSC /l 0x409 +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo + +!ENDIF + +# Begin Target + +# Name "libapr_app - Win32 Release" +# Name "libapr_app - Win32 Debug" +# Begin Source File + +SOURCE=..\misc\win32\apr_app.c +# End Source File +# Begin Source File + +SOURCE=..\misc\win32\internal.c +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/build/libtool.m4 b/rubbos/app/httpd-2.0.64/srclib/apr/build/libtool.m4 new file mode 100644 index 00000000..1b0d7c9f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/build/libtool.m4 @@ -0,0 +1,6659 @@ +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- +## Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007, +## 2008 Free Software Foundation, Inc. +## Originally by Gordon Matzigkeit , 1996 +## +## This file is free software; the Free Software Foundation gives +## unlimited permission to copy and/or distribute it, with or without +## modifications, as long as this notice is preserved. + +# serial 52 AC_PROG_LIBTOOL + + +# AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED) +# ----------------------------------------------------------- +# If this macro is not defined by Autoconf, define it here. +m4_ifdef([AC_PROVIDE_IFELSE], + [], + [m4_define([AC_PROVIDE_IFELSE], + [m4_ifdef([AC_PROVIDE_$1], + [$2], [$3])])]) + + +# AC_PROG_LIBTOOL +# --------------- +AC_DEFUN([AC_PROG_LIBTOOL], +[AC_REQUIRE([_AC_PROG_LIBTOOL])dnl +dnl If AC_PROG_CXX has already been expanded, run AC_LIBTOOL_CXX +dnl immediately, otherwise, hook it in at the end of AC_PROG_CXX. + AC_PROVIDE_IFELSE([AC_PROG_CXX], + [AC_LIBTOOL_CXX], + [define([AC_PROG_CXX], defn([AC_PROG_CXX])[AC_LIBTOOL_CXX + ])]) +dnl And a similar setup for Fortran 77 support + AC_PROVIDE_IFELSE([AC_PROG_F77], + [AC_LIBTOOL_F77], + [define([AC_PROG_F77], defn([AC_PROG_F77])[AC_LIBTOOL_F77 +])]) + +dnl Quote A][M_PROG_GCJ so that aclocal doesn't bring it in needlessly. +dnl If either AC_PROG_GCJ or A][M_PROG_GCJ have already been expanded, run +dnl AC_LIBTOOL_GCJ immediately, otherwise, hook it in at the end of both. + AC_PROVIDE_IFELSE([AC_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ], + [AC_LIBTOOL_GCJ], + [ifdef([AC_PROG_GCJ], + [define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[AC_LIBTOOL_GCJ])]) + ifdef([A][M_PROG_GCJ], + [define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[AC_LIBTOOL_GCJ])]) + ifdef([LT_AC_PROG_GCJ], + [define([LT_AC_PROG_GCJ], + defn([LT_AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])])]) +])])# AC_PROG_LIBTOOL + + +# _AC_PROG_LIBTOOL +# ---------------- +AC_DEFUN([_AC_PROG_LIBTOOL], +[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl +AC_BEFORE([$0],[AC_LIBTOOL_CXX])dnl +AC_BEFORE([$0],[AC_LIBTOOL_F77])dnl +AC_BEFORE([$0],[AC_LIBTOOL_GCJ])dnl + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(apr_builddir)/libtool' +AC_SUBST(LIBTOOL)dnl + +# Prevent multiple expansion +define([AC_PROG_LIBTOOL], []) +])# _AC_PROG_LIBTOOL + + +# AC_LIBTOOL_SETUP +# ---------------- +AC_DEFUN([AC_LIBTOOL_SETUP], +[AC_PREREQ(2.50)dnl +AC_REQUIRE([AC_ENABLE_SHARED])dnl +AC_REQUIRE([AC_ENABLE_STATIC])dnl +AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_PROG_LD])dnl +AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl +AC_REQUIRE([AC_PROG_NM])dnl + +AC_REQUIRE([AC_PROG_LN_S])dnl +AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl +# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! +AC_REQUIRE([AC_OBJEXT])dnl +AC_REQUIRE([AC_EXEEXT])dnl +dnl +AC_LIBTOOL_SYS_MAX_CMD_LEN +AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE +AC_LIBTOOL_OBJDIR + +AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl +_LT_AC_PROG_ECHO_BACKSLASH + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='sed -e 1s/^X//' +[sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g'] + +# Same as above, but do not quote variable references. +[double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g'] + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +# Constants: +rm="rm -f" + +# Global variables: +default_ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a +ltmain="$ac_aux_dir/ltmain.sh" +ofile="$default_ofile" +with_gnu_ld="$lt_cv_prog_gnu_ld" + +AC_CHECK_TOOL(AR, ar, false) +AC_CHECK_TOOL(RANLIB, ranlib, :) +AC_CHECK_TOOL(STRIP, strip, :) + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$AR" && AR=ar +test -z "$AR_FLAGS" && AR_FLAGS=cru +test -z "$AS" && AS=as +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$DLLTOOL" && DLLTOOL=dlltool +test -z "$LD" && LD=ld +test -z "$LN_S" && LN_S="ln -s" +test -z "$MAGIC_CMD" && MAGIC_CMD=file +test -z "$NM" && NM=nm +test -z "$SED" && SED=sed +test -z "$OBJDUMP" && OBJDUMP=objdump +test -z "$RANLIB" && RANLIB=: +test -z "$STRIP" && STRIP=: +test -z "$ac_objext" && ac_objext=o + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi + +_LT_CC_BASENAME([$compiler]) + +# Only perform the check for file, if the check method requires it +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + AC_PATH_MAGIC + fi + ;; +esac + +_LT_REQUIRED_DARWIN_CHECKS + +AC_PROVIDE_IFELSE([AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no) +AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], +enable_win32_dll=yes, enable_win32_dll=no) + +AC_ARG_ENABLE([libtool-lock], + [AC_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +AC_ARG_WITH([pic], + [AC_HELP_STRING([--with-pic], + [try to use only PIC/non-PIC objects @<:@default=use both@:>@])], + [pic_mode="$withval"], + [pic_mode=default]) +test -z "$pic_mode" && pic_mode=default + +# Use C for the default configuration in the libtool script +tagname= +AC_LIBTOOL_LANG_C_CONFIG +_LT_AC_TAGCONFIG +])# AC_LIBTOOL_SETUP + + +# _LT_AC_SYS_COMPILER +# ------------------- +AC_DEFUN([_LT_AC_SYS_COMPILER], +[AC_REQUIRE([AC_PROG_CC])dnl + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC +])# _LT_AC_SYS_COMPILER + + +# _LT_CC_BASENAME(CC) +# ------------------- +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. +AC_DEFUN([_LT_CC_BASENAME], +[for cc_temp in $1""; do + case $cc_temp in + compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;; + distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` +]) + + +# _LT_COMPILER_BOILERPLATE +# ------------------------ +# Check for compiler boilerplate output or warnings with +# the simple compiler test code. +AC_DEFUN([_LT_COMPILER_BOILERPLATE], +[AC_REQUIRE([LT_AC_PROG_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$rm conftest* +])# _LT_COMPILER_BOILERPLATE + + +# _LT_LINKER_BOILERPLATE +# ---------------------- +# Check for linker boilerplate output or warnings with +# the simple link test code. +AC_DEFUN([_LT_LINKER_BOILERPLATE], +[AC_REQUIRE([LT_AC_PROG_SED])dnl +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$rm -r conftest* +])# _LT_LINKER_BOILERPLATE + +# _LT_REQUIRED_DARWIN_CHECKS +# -------------------------- +# Check for some things on darwin +AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS],[ + case $host_os in + rhapsody* | darwin*) + AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:]) + AC_CHECK_TOOL([NMEDIT], [nmedit], [:]) + + AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod], + [lt_cv_apple_cc_single_mod=no + if test -z "${LT_MULTI_MODULE}"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + echo "int foo(void){return 1;}" > conftest.c + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib ${wl}-single_module conftest.c + if test -f libconftest.dylib; then + lt_cv_apple_cc_single_mod=yes + rm -rf libconftest.dylib* + fi + rm conftest.c + fi]) + AC_CACHE_CHECK([for -exported_symbols_list linker flag], + [lt_cv_ld_exported_symbols_list], + [lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])], + [lt_cv_ld_exported_symbols_list=yes], + [lt_cv_ld_exported_symbols_list=no]) + LDFLAGS="$save_LDFLAGS" + ]) + case $host_os in + rhapsody* | darwin1.[[0123]]) + _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + darwin*) + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[[91]]*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + 10.[[012]]*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test "$lt_cv_apple_cc_single_mod" = "yes"; then + _lt_dar_single_mod='$single_module' + fi + if test "$lt_cv_ld_exported_symbols_list" = "yes"; then + _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' + else + _lt_dar_export_syms="~$NMEDIT -s \$output_objdir/\${libname}-symbols.expsym \${lib}" + fi + if test "$DSYMUTIL" != ":"; then + _lt_dsymutil="~$DSYMUTIL \$lib || :" + else + _lt_dsymutil= + fi + ;; + esac +]) + +# _LT_AC_SYS_LIBPATH_AIX +# ---------------------- +# Links a minimal program and checks the executable +# for the system default hardcoded library path. In most cases, +# this is /usr/lib:/lib, but when the MPI compilers are used +# the location of the communication and MPI libs are included too. +# If we don't find anything, use the default library path according +# to the aix ld manual. +AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX], +[AC_REQUIRE([LT_AC_PROG_SED])dnl +AC_LINK_IFELSE(AC_LANG_PROGRAM,[ +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi],[]) +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi +])# _LT_AC_SYS_LIBPATH_AIX + + +# _LT_AC_SHELL_INIT(ARG) +# ---------------------- +AC_DEFUN([_LT_AC_SHELL_INIT], +[ifdef([AC_DIVERSION_NOTICE], + [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)], + [AC_DIVERT_PUSH(NOTICE)]) +$1 +AC_DIVERT_POP +])# _LT_AC_SHELL_INIT + + +# _LT_AC_PROG_ECHO_BACKSLASH +# -------------------------- +# Add some code to the start of the generated configure script which +# will find an echo command which doesn't interpret backslashes. +AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH], +[_LT_AC_SHELL_INIT([ +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} + +case X$ECHO in +X*--fallback-echo) + # Remove one level of quotation (which was required for Make). + ECHO=`echo "$ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','` + ;; +esac + +echo=${ECHO-echo} +if test "X[$]1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X[$]1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then + # Yippee, $echo works! + : +else + # Restart under the correct shell. + exec $SHELL "[$]0" --no-reexec ${1+"[$]@"} +fi + +if test "X[$]1" = X--fallback-echo; then + # used as fallback echo + shift + cat </dev/null 2>&1 && unset CDPATH + +if test -z "$ECHO"; then +if test "X${echo_test_string+set}" != Xset; then +# find a string as large as possible, as long as the shell can cope with it + for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do + # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... + if (echo_test_string=`eval $cmd`) 2>/dev/null && + echo_test_string=`eval $cmd` && + (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null + then + break + fi + done +fi + +if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + : +else + # The Solaris, AIX, and Digital Unix default echo programs unquote + # backslashes. This makes it impossible to quote backslashes using + # echo "$something" | sed 's/\\/\\\\/g' + # + # So, first we look for a working echo in the user's PATH. + + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for dir in $PATH /usr/ucb; do + IFS="$lt_save_ifs" + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$dir/echo" + break + fi + done + IFS="$lt_save_ifs" + + if test "X$echo" = Xecho; then + # We didn't find a better echo, so look for alternatives. + if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # This shell has a builtin print -r that does the trick. + echo='print -r' + elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && + test "X$CONFIG_SHELL" != X/bin/ksh; then + # If we have ksh, try running configure again with it. + ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} + export ORIGINAL_CONFIG_SHELL + CONFIG_SHELL=/bin/ksh + export CONFIG_SHELL + exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"} + else + # Try using printf. + echo='printf %s\n' + if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # Cool, printf works + : + elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL + export CONFIG_SHELL + SHELL="$CONFIG_SHELL" + export SHELL + echo="$CONFIG_SHELL [$]0 --fallback-echo" + elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$CONFIG_SHELL [$]0 --fallback-echo" + else + # maybe with a smaller string... + prev=: + + for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do + if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null + then + break + fi + prev="$cmd" + done + + if test "$prev" != 'sed 50q "[$]0"'; then + echo_test_string=`eval $prev` + export echo_test_string + exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"} + else + # Oops. We lost completely, so just stick with echo. + echo=echo + fi + fi + fi + fi +fi +fi + +# Copy echo and quote the copy suitably for passing to libtool from +# the Makefile, instead of quoting the original, which is used later. +ECHO=$echo +if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then + ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo" +fi + +AC_SUBST(ECHO) +])])# _LT_AC_PROG_ECHO_BACKSLASH + + +# _LT_AC_LOCK +# ----------- +AC_DEFUN([_LT_AC_LOCK], +[AC_ARG_ENABLE([libtool-lock], + [AC_HELP_STRING([--disable-libtool-lock], + [avoid locking (might break parallel builds)])]) +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '[#]line __oline__ "configure"' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ +s390*-*linux*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + libsuff=64 + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf, + [AC_LANG_PUSH(C) + AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no]) + AC_LANG_POP]) + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +sparc*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if AC_TRY_EVAL(ac_compile); then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) LD="${LD-ld} -m elf64_sparc" ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL], +[*-*-cygwin* | *-*-mingw* | *-*-pw32*) + AC_CHECK_TOOL(DLLTOOL, dlltool, false) + AC_CHECK_TOOL(AS, as, false) + AC_CHECK_TOOL(OBJDUMP, objdump, false) + ;; + ]) +esac + +need_locks="$enable_libtool_lock" + +])# _LT_AC_LOCK + + +# AC_LIBTOOL_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------------------- +# Check whether the given compiler option works +AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], +[AC_REQUIRE([LT_AC_PROG_SED]) +AC_CACHE_CHECK([$1], [$2], + [$2=no + ifelse([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4]) + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$3" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + fi + $rm conftest* +]) + +if test x"[$]$2" = xyes; then + ifelse([$5], , :, [$5]) +else + ifelse([$6], , :, [$6]) +fi +])# AC_LIBTOOL_COMPILER_OPTION + + +# AC_LIBTOOL_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [ACTION-SUCCESS], [ACTION-FAILURE]) +# ------------------------------------------------------------ +# Check whether the given compiler option works +AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], +[AC_REQUIRE([LT_AC_PROG_SED])dnl +AC_CACHE_CHECK([$1], [$2], + [$2=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $3" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&AS_MESSAGE_LOG_FD + $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + $2=yes + fi + else + $2=yes + fi + fi + $rm -r conftest* + LDFLAGS="$save_LDFLAGS" +]) + +if test x"[$]$2" = xyes; then + ifelse([$4], , :, [$4]) +else + ifelse([$5], , :, [$5]) +fi +])# AC_LIBTOOL_LINKER_OPTION + + +# AC_LIBTOOL_SYS_MAX_CMD_LEN +# -------------------------- +AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], +[# find the maximum length of command line arguments +AC_MSG_CHECKING([the maximum length of command line arguments]) +AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + while (test "X"`$SHELL [$]0 --fallback-echo "X$teststring" 2>/dev/null` \ + = "XX$teststring") >/dev/null 2>&1 && + new_result=`expr "X$teststring" : ".*" 2>&1` && + lt_cv_sys_max_cmd_len=$new_result && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + teststring= + # Add a significant safety factor because C++ compilers can tack on massive + # amounts of additional arguments before passing them to the linker. + # It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac +]) +if test -n $lt_cv_sys_max_cmd_len ; then + AC_MSG_RESULT($lt_cv_sys_max_cmd_len) +else + AC_MSG_RESULT(none) +fi +])# AC_LIBTOOL_SYS_MAX_CMD_LEN + + +# _LT_AC_CHECK_DLFCN +# ------------------ +AC_DEFUN([_LT_AC_CHECK_DLFCN], +[AC_CHECK_HEADERS(dlfcn.h)dnl +])# _LT_AC_CHECK_DLFCN + + +# _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# --------------------------------------------------------------------- +AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF], +[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl +if test "$cross_compiling" = yes; then : + [$4] +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + else + puts (dlerror ()); + + exit (status); +}] +EOF + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) $1 ;; + x$lt_dlneed_uscore) $2 ;; + x$lt_dlunknown|x*) $3 ;; + esac + else : + # compilation failed + $3 + fi +fi +rm -fr conftest* +])# _LT_AC_TRY_DLOPEN_SELF + + +# AC_LIBTOOL_DLOPEN_SELF +# ---------------------- +AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], +[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[ + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ]) + ;; + + *) + AC_CHECK_FUNC([shl_load], + [lt_cv_dlopen="shl_load"], + [AC_CHECK_LIB([dld], [shl_load], + [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld"], + [AC_CHECK_FUNC([dlopen], + [lt_cv_dlopen="dlopen"], + [AC_CHECK_LIB([dl], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"], + [AC_CHECK_LIB([svld], [dlopen], + [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"], + [AC_CHECK_LIB([dld], [dld_link], + [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld"]) + ]) + ]) + ]) + ]) + ]) + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + AC_CACHE_CHECK([whether a program can dlopen itself], + lt_cv_dlopen_self, [dnl + _LT_AC_TRY_DLOPEN_SELF( + lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes, + lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross) + ]) + + if test "x$lt_cv_dlopen_self" = xyes; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + AC_CACHE_CHECK([whether a statically linked program can dlopen itself], + lt_cv_dlopen_self_static, [dnl + _LT_AC_TRY_DLOPEN_SELF( + lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes, + lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross) + ]) + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi +])# AC_LIBTOOL_DLOPEN_SELF + + +# AC_LIBTOOL_PROG_CC_C_O([TAGNAME]) +# --------------------------------- +# Check to see if options -c and -o are simultaneously supported by compiler +AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O], +[AC_REQUIRE([LT_AC_PROG_SED])dnl +AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl +AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext], + [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)], + [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&AS_MESSAGE_LOG_FD + echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + fi + fi + chmod u+w . 2>&AS_MESSAGE_LOG_FD + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* +]) +])# AC_LIBTOOL_PROG_CC_C_O + + +# AC_LIBTOOL_SYS_HARD_LINK_LOCKS([TAGNAME]) +# ----------------------------------------- +# Check to see if we can do hard links to lock some files if needed +AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], +[AC_REQUIRE([_LT_AC_LOCK])dnl + +hard_links="nottested" +if test "$_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + AC_MSG_CHECKING([if we can lock with hard links]) + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + AC_MSG_RESULT([$hard_links]) + if test "$hard_links" = no; then + AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe]) + need_locks=warn + fi +else + need_locks=no +fi +])# AC_LIBTOOL_SYS_HARD_LINK_LOCKS + + +# AC_LIBTOOL_OBJDIR +# ----------------- +AC_DEFUN([AC_LIBTOOL_OBJDIR], +[AC_CACHE_CHECK([for objdir], [lt_cv_objdir], +[rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null]) +objdir=$lt_cv_objdir +])# AC_LIBTOOL_OBJDIR + + +# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH([TAGNAME]) +# ---------------------------------------------- +# Check hardcoding attributes. +AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], +[AC_MSG_CHECKING([how to hardcode library paths into programs]) +_LT_AC_TAGVAR(hardcode_action, $1)= +if test -n "$_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)" || \ + test -n "$_LT_AC_TAGVAR(runpath_var, $1)" || \ + test "X$_LT_AC_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then + + # We can hardcode non-existant directories. + if test "$_LT_AC_TAGVAR(hardcode_direct, $1)" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)" != no && + test "$_LT_AC_TAGVAR(hardcode_minus_L, $1)" != no; then + # Linking always hardcodes the temporary library directory. + _LT_AC_TAGVAR(hardcode_action, $1)=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + _LT_AC_TAGVAR(hardcode_action, $1)=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + _LT_AC_TAGVAR(hardcode_action, $1)=unsupported +fi +AC_MSG_RESULT([$_LT_AC_TAGVAR(hardcode_action, $1)]) + +if test "$_LT_AC_TAGVAR(hardcode_action, $1)" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi +])# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH + + +# AC_LIBTOOL_SYS_LIB_STRIP +# ------------------------ +AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP], +[striplib= +old_striplib= +AC_MSG_CHECKING([whether stripping libraries is possible]) +if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + AC_MSG_RESULT([yes]) +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) +fi + ;; + *) + AC_MSG_RESULT([no]) + ;; + esac +fi +])# AC_LIBTOOL_SYS_LIB_STRIP + + +# AC_LIBTOOL_SYS_DYNAMIC_LINKER +# ----------------------------- +# PORTME Fill in your ld.so characteristics +AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER], +[AC_REQUIRE([LT_AC_PROG_SED])dnl +AC_MSG_CHECKING([dynamic linker characteristics]) +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" +m4_if($1,[],[ +if test "$GCC" = yes; then + case $host_os in + darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; + *) lt_awk_arg="/^libraries:/" ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$lt_search_path_spec" | grep ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`echo "$lt_search_path_spec" | $SED -e 's/;/ /g'` + else + lt_search_path_spec=`echo "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary. + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path/$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" + else + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`echo $lt_tmp_lt_search_path_spec | awk ' +BEGIN {RS=" "; FS="/|\n";} { + lt_foo=""; + lt_count=0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo="/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[[lt_foo]]++; } + if (lt_freq[[lt_foo]] == 1) { print lt_foo; } +}'` + sys_lib_search_path_spec=`echo $lt_search_path_spec` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi]) +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[[4-9]]*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[[01]] | aix4.[[01]].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[[45]]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | [grep ';[c-zC-Z]:/' >/dev/null]; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + m4_if([$1], [],[ + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"]) + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[[123]]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[[01]]* | freebsdelf3.[[01]]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \ + freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +interix[[3-9]]*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[[89]] | openbsd2.[[89]].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + shlibpath_overrides_runpath=no + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + shlibpath_overrides_runpath=yes + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +AC_MSG_RESULT([$dynamic_linker]) +test "$dynamic_linker" = no && can_build_shared=no + +AC_CACHE_VAL([lt_cv_sys_lib_search_path_spec], +[lt_cv_sys_lib_search_path_spec="$sys_lib_search_path_spec"]) +sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +AC_CACHE_VAL([lt_cv_sys_lib_dlsearch_path_spec], +[lt_cv_sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec"]) +sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi +])# AC_LIBTOOL_SYS_DYNAMIC_LINKER + + +# _LT_AC_TAGCONFIG +# ---------------- +AC_DEFUN([_LT_AC_TAGCONFIG], +[AC_REQUIRE([LT_AC_PROG_SED])dnl +AC_ARG_WITH([tags], + [AC_HELP_STRING([--with-tags@<:@=TAGS@:>@], + [include additional configurations @<:@automatic@:>@])], + [tagnames="$withval"]) + +if test -f "$ltmain" && test -n "$tagnames"; then + if test ! -f "${ofile}"; then + AC_MSG_WARN([output file `$ofile' does not exist]) + fi + + if test -z "$LTCC"; then + eval "`$SHELL ${ofile} --config | grep '^LTCC='`" + if test -z "$LTCC"; then + AC_MSG_WARN([output file `$ofile' does not look like a libtool script]) + else + AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile']) + fi + fi + if test -z "$LTCFLAGS"; then + eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`" + fi + + # Extract list of available tagged configurations in $ofile. + # Note that this assumes the entire list is on one line. + available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` + + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for tagname in $tagnames; do + IFS="$lt_save_ifs" + # Check whether tagname contains only valid characters + case `$echo "X$tagname" | $Xsed -e 's:[[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]]::g'` in + "") ;; + *) AC_MSG_ERROR([invalid tag name: $tagname]) + ;; + esac + + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null + then + AC_MSG_ERROR([tag name \"$tagname\" already exists]) + fi + + # Update the list of available tags. + if test -n "$tagname"; then + echo appending configuration tag \"$tagname\" to $ofile + + case $tagname in + CXX) + if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + AC_LIBTOOL_LANG_CXX_CONFIG + else + tagname="" + fi + ;; + + F77) + if test -n "$F77" && test "X$F77" != "Xno"; then + AC_LIBTOOL_LANG_F77_CONFIG + else + tagname="" + fi + ;; + + GCJ) + if test -n "$GCJ" && test "X$GCJ" != "Xno"; then + AC_LIBTOOL_LANG_GCJ_CONFIG + else + tagname="" + fi + ;; + + RC) + AC_LIBTOOL_LANG_RC_CONFIG + ;; + + *) + AC_MSG_ERROR([Unsupported tag name: $tagname]) + ;; + esac + + # Append the new tag name to the list of available tags. + if test -n "$tagname" ; then + available_tags="$available_tags $tagname" + fi + fi + done + IFS="$lt_save_ifs" + + # Now substitute the updated list of available tags. + if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then + mv "${ofile}T" "$ofile" + chmod +x "$ofile" + else + rm -f "${ofile}T" + AC_MSG_ERROR([unable to update list of available tagged configurations.]) + fi +fi +])# _LT_AC_TAGCONFIG + + +# AC_LIBTOOL_DLOPEN +# ----------------- +# enable checks for dlopen support +AC_DEFUN([AC_LIBTOOL_DLOPEN], + [AC_BEFORE([$0],[AC_LIBTOOL_SETUP]) +])# AC_LIBTOOL_DLOPEN + + +# AC_LIBTOOL_WIN32_DLL +# -------------------- +# declare package support for building win32 DLLs +AC_DEFUN([AC_LIBTOOL_WIN32_DLL], +[AC_BEFORE([$0], [AC_LIBTOOL_SETUP]) +])# AC_LIBTOOL_WIN32_DLL + + +# AC_ENABLE_SHARED([DEFAULT]) +# --------------------------- +# implement the --enable-shared flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_SHARED], +[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([shared], + [AC_HELP_STRING([--enable-shared@<:@=PKGS@:>@], + [build shared libraries @<:@default=]AC_ENABLE_SHARED_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_shared=]AC_ENABLE_SHARED_DEFAULT) +])# AC_ENABLE_SHARED + + +# AC_DISABLE_SHARED +# ----------------- +# set the default shared flag to --disable-shared +AC_DEFUN([AC_DISABLE_SHARED], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_SHARED(no) +])# AC_DISABLE_SHARED + + +# AC_ENABLE_STATIC([DEFAULT]) +# --------------------------- +# implement the --enable-static flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_STATIC], +[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([static], + [AC_HELP_STRING([--enable-static@<:@=PKGS@:>@], + [build static libraries @<:@default=]AC_ENABLE_STATIC_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_static=]AC_ENABLE_STATIC_DEFAULT) +])# AC_ENABLE_STATIC + + +# AC_DISABLE_STATIC +# ----------------- +# set the default static flag to --disable-static +AC_DEFUN([AC_DISABLE_STATIC], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_STATIC(no) +])# AC_DISABLE_STATIC + + +# AC_ENABLE_FAST_INSTALL([DEFAULT]) +# --------------------------------- +# implement the --enable-fast-install flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +AC_DEFUN([AC_ENABLE_FAST_INSTALL], +[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl +AC_ARG_ENABLE([fast-install], + [AC_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@], + [optimize for fast installation @<:@default=]AC_ENABLE_FAST_INSTALL_DEFAULT[@:>@])], + [p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac], + [enable_fast_install=]AC_ENABLE_FAST_INSTALL_DEFAULT) +])# AC_ENABLE_FAST_INSTALL + + +# AC_DISABLE_FAST_INSTALL +# ----------------------- +# set the default to --disable-fast-install +AC_DEFUN([AC_DISABLE_FAST_INSTALL], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +AC_ENABLE_FAST_INSTALL(no) +])# AC_DISABLE_FAST_INSTALL + + +# AC_LIBTOOL_PICMODE([MODE]) +# -------------------------- +# implement the --with-pic flag +# MODE is either `yes' or `no'. If omitted, it defaults to `both'. +AC_DEFUN([AC_LIBTOOL_PICMODE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl +pic_mode=ifelse($#,1,$1,default) +])# AC_LIBTOOL_PICMODE + + +# AC_PROG_EGREP +# ------------- +# This is predefined starting with Autoconf 2.54, so this conditional +# definition can be removed once we require Autoconf 2.54 or later. +m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP], +[AC_CACHE_CHECK([for egrep], [ac_cv_prog_egrep], + [if echo a | (grep -E '(a|b)') >/dev/null 2>&1 + then ac_cv_prog_egrep='grep -E' + else ac_cv_prog_egrep='egrep' + fi]) + EGREP=$ac_cv_prog_egrep + AC_SUBST([EGREP]) +])]) + + +# AC_PATH_TOOL_PREFIX +# ------------------- +# find a file program which can recognize shared library +AC_DEFUN([AC_PATH_TOOL_PREFIX], +[AC_REQUIRE([AC_PROG_EGREP])dnl +AC_MSG_CHECKING([for $1]) +AC_CACHE_VAL(lt_cv_path_MAGIC_CMD, +[case $MAGIC_CMD in +[[\\/*] | ?:[\\/]*]) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR +dnl $ac_dummy forces splitting on constant user-supplied paths. +dnl POSIX.2 word splitting is done only on the output of word expansions, +dnl not every word. This closes a longstanding sh security hole. + ac_dummy="ifelse([$2], , $PATH, [$2])" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$1; then + lt_cv_path_MAGIC_CMD="$ac_dir/$1" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac]) +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + AC_MSG_RESULT($MAGIC_CMD) +else + AC_MSG_RESULT(no) +fi +])# AC_PATH_TOOL_PREFIX + + +# AC_PATH_MAGIC +# ------------- +# find a file program which can recognize a shared library +AC_DEFUN([AC_PATH_MAGIC], +[AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH) +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + AC_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH) + else + MAGIC_CMD=: + fi +fi +])# AC_PATH_MAGIC + + +# AC_PROG_LD +# ---------- +# find the pathname to the GNU or non-GNU linker +AC_DEFUN([AC_PROG_LD], +[AC_ARG_WITH([gnu-ld], + [AC_HELP_STRING([--with-gnu-ld], + [assume the C compiler uses GNU ld @<:@default=no@:>@])], + [test "$withval" = no || with_gnu_ld=yes], + [with_gnu_ld=no]) +AC_REQUIRE([LT_AC_PROG_SED])dnl +AC_REQUIRE([AC_PROG_CC])dnl +AC_REQUIRE([AC_CANONICAL_HOST])dnl +AC_REQUIRE([AC_CANONICAL_BUILD])dnl +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by $CC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]]* | ?:[[\\/]]*) + re_direlt='/[[^/]][[^/]]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(lt_cv_path_LD, +[if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &1 /dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'] + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[[3-9]]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +nto-qnx*) + lt_cv_deplibs_check_method=unknown + ;; + +openbsd*) + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac +]) +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown +])# AC_DEPLIBS_CHECK_METHOD + + +# AC_PROG_NM +# ---------- +# find the pathname to a BSD-compatible name lister +AC_DEFUN([AC_PROG_NM], +[AC_CACHE_CHECK([for BSD-compatible nm], lt_cv_path_NM, +[if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_nm_to_check="${ac_tool_prefix}nm" + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/$lt_tmp_nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS="$lt_save_ifs" + done + test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm +fi]) +NM="$lt_cv_path_NM" +])# AC_PROG_NM + + +# AC_CHECK_LIBM +# ------------- +# check for math library +AC_DEFUN([AC_CHECK_LIBM], +[AC_REQUIRE([AC_CANONICAL_HOST])dnl +LIBM= +case $host in +*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*) + # These system don't have libm, or don't need it + ;; +*-ncr-sysv4.3*) + AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw") + AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm") + ;; +*) + AC_CHECK_LIB(m, cos, LIBM="-lm") + ;; +esac +])# AC_CHECK_LIBM + + +# AC_LIBLTDL_CONVENIENCE([DIRECTORY]) +# ----------------------------------- +# sets LIBLTDL to the link flags for the libltdl convenience library and +# LTDLINCL to the include flags for the libltdl header and adds +# --enable-ltdl-convenience to the configure arguments. Note that +# AC_CONFIG_SUBDIRS is not called here. If DIRECTORY is not provided, +# it is assumed to be `libltdl'. LIBLTDL will be prefixed with +# '${top_builddir}/' and LTDLINCL will be prefixed with '${top_srcdir}/' +# (note the single quotes!). If your package is not flat and you're not +# using automake, define top_builddir and top_srcdir appropriately in +# the Makefiles. +AC_DEFUN([AC_LIBLTDL_CONVENIENCE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + case $enable_ltdl_convenience in + no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;; + "") enable_ltdl_convenience=yes + ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;; + esac + LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la + LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) + # For backwards non-gettext consistent compatibility... + INCLTDL="$LTDLINCL" +])# AC_LIBLTDL_CONVENIENCE + + +# AC_LIBLTDL_INSTALLABLE([DIRECTORY]) +# ----------------------------------- +# sets LIBLTDL to the link flags for the libltdl installable library and +# LTDLINCL to the include flags for the libltdl header and adds +# --enable-ltdl-install to the configure arguments. Note that +# AC_CONFIG_SUBDIRS is not called here. If DIRECTORY is not provided, +# and an installed libltdl is not found, it is assumed to be `libltdl'. +# LIBLTDL will be prefixed with '${top_builddir}/'# and LTDLINCL with +# '${top_srcdir}/' (note the single quotes!). If your package is not +# flat and you're not using automake, define top_builddir and top_srcdir +# appropriately in the Makefiles. +# In the future, this macro may have to be called after AC_PROG_LIBTOOL. +AC_DEFUN([AC_LIBLTDL_INSTALLABLE], +[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl + AC_CHECK_LIB(ltdl, lt_dlinit, + [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no], + [if test x"$enable_ltdl_install" = xno; then + AC_MSG_WARN([libltdl not installed, but installation disabled]) + else + enable_ltdl_install=yes + fi + ]) + if test x"$enable_ltdl_install" = x"yes"; then + ac_configure_args="$ac_configure_args --enable-ltdl-install" + LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la + LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl']) + else + ac_configure_args="$ac_configure_args --enable-ltdl-install=no" + LIBLTDL="-lltdl" + LTDLINCL= + fi + # For backwards non-gettext consistent compatibility... + INCLTDL="$LTDLINCL" +])# AC_LIBLTDL_INSTALLABLE + + +# AC_LIBTOOL_CXX +# -------------- +# enable support for C++ libraries +AC_DEFUN([AC_LIBTOOL_CXX], +[AC_REQUIRE([_LT_AC_LANG_CXX]) +])# AC_LIBTOOL_CXX + + +# _LT_AC_LANG_CXX +# --------------- +AC_DEFUN([_LT_AC_LANG_CXX], +[AC_REQUIRE([AC_PROG_CXX]) +AC_REQUIRE([_LT_AC_PROG_CXXCPP]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}CXX]) +])# _LT_AC_LANG_CXX + +# _LT_AC_PROG_CXXCPP +# ------------------ +AC_DEFUN([_LT_AC_PROG_CXXCPP], +[ +AC_REQUIRE([AC_PROG_CXX]) +if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + AC_PROG_CXXCPP +fi +])# _LT_AC_PROG_CXXCPP + +# AC_LIBTOOL_F77 +# -------------- +# enable support for Fortran 77 libraries +AC_DEFUN([AC_LIBTOOL_F77], +[AC_REQUIRE([_LT_AC_LANG_F77]) +])# AC_LIBTOOL_F77 + + +# _LT_AC_LANG_F77 +# --------------- +AC_DEFUN([_LT_AC_LANG_F77], +[AC_REQUIRE([AC_PROG_F77]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}F77]) +])# _LT_AC_LANG_F77 + + +# AC_LIBTOOL_GCJ +# -------------- +# enable support for GCJ libraries +AC_DEFUN([AC_LIBTOOL_GCJ], +[AC_REQUIRE([_LT_AC_LANG_GCJ]) +])# AC_LIBTOOL_GCJ + + +# _LT_AC_LANG_GCJ +# --------------- +AC_DEFUN([_LT_AC_LANG_GCJ], +[AC_PROVIDE_IFELSE([AC_PROG_GCJ],[], + [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],[], + [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],[], + [ifdef([AC_PROG_GCJ],[AC_REQUIRE([AC_PROG_GCJ])], + [ifdef([A][M_PROG_GCJ],[AC_REQUIRE([A][M_PROG_GCJ])], + [AC_REQUIRE([A][C_PROG_GCJ_OR_A][M_PROG_GCJ])])])])])]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}GCJ]) +])# _LT_AC_LANG_GCJ + + +# AC_LIBTOOL_RC +# ------------- +# enable support for Windows resource files +AC_DEFUN([AC_LIBTOOL_RC], +[AC_REQUIRE([LT_AC_PROG_RC]) +_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}RC]) +])# AC_LIBTOOL_RC + + +# AC_LIBTOOL_LANG_C_CONFIG +# ------------------------ +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG], [_LT_AC_LANG_C_CONFIG]) +AC_DEFUN([_LT_AC_LANG_C_CONFIG], +[lt_save_CC="$CC" +AC_LANG_PUSH(C) + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + +_LT_AC_SYS_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1) +AC_LIBTOOL_PROG_COMPILER_PIC($1) +AC_LIBTOOL_PROG_CC_C_O($1) +AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) +AC_LIBTOOL_PROG_LD_SHLIBS($1) +AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) +AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) +AC_LIBTOOL_SYS_LIB_STRIP +AC_LIBTOOL_DLOPEN_SELF + +# Report which library types will actually be built +AC_MSG_CHECKING([if libtool supports shared libraries]) +AC_MSG_RESULT([$can_build_shared]) + +AC_MSG_CHECKING([whether to build shared libraries]) +test "$can_build_shared" = "no" && enable_shared=no + +# On AIX, shared libraries and static libraries use the same namespace, and +# are all built from PIC. +case $host_os in +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + +aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; +esac +AC_MSG_RESULT([$enable_shared]) + +AC_MSG_CHECKING([whether to build static libraries]) +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes +AC_MSG_RESULT([$enable_static]) + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_POP +CC="$lt_save_CC" +])# AC_LIBTOOL_LANG_C_CONFIG + + +# AC_LIBTOOL_LANG_CXX_CONFIG +# -------------------------- +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG], [_LT_AC_LANG_CXX_CONFIG(CXX)]) +AC_DEFUN([_LT_AC_LANG_CXX_CONFIG], +[AC_LANG_PUSH(C++) +AC_REQUIRE([AC_PROG_CXX]) +AC_REQUIRE([_LT_AC_PROG_CXXCPP]) + +_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_AC_TAGVAR(allow_undefined_flag, $1)= +_LT_AC_TAGVAR(always_export_symbols, $1)=no +_LT_AC_TAGVAR(archive_expsym_cmds, $1)= +_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_AC_TAGVAR(hardcode_direct, $1)=no +_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +_LT_AC_TAGVAR(hardcode_libdir_separator, $1)= +_LT_AC_TAGVAR(hardcode_minus_L, $1)=no +_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported +_LT_AC_TAGVAR(hardcode_automatic, $1)=no +_LT_AC_TAGVAR(module_cmds, $1)= +_LT_AC_TAGVAR(module_expsym_cmds, $1)= +_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown +_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_AC_TAGVAR(no_undefined_flag, $1)= +_LT_AC_TAGVAR(whole_archive_flag_spec, $1)= +_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Dependencies to place before and after the object being linked: +_LT_AC_TAGVAR(predep_objects, $1)= +_LT_AC_TAGVAR(postdep_objects, $1)= +_LT_AC_TAGVAR(predeps, $1)= +_LT_AC_TAGVAR(postdeps, $1)= +_LT_AC_TAGVAR(compiler_lib_search_path, $1)= +_LT_AC_TAGVAR(compiler_lib_search_dirs, $1)= + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_AC_SYS_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_LD=$LD +lt_save_GCC=$GCC +GCC=$GXX +lt_save_with_gnu_ld=$with_gnu_ld +lt_save_path_LD=$lt_cv_path_LD +if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx +else + $as_unset lt_cv_prog_gnu_ld +fi +if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX +else + $as_unset lt_cv_path_LD +fi +test -z "${LDCXX+set}" || LD=$LDCXX +CC=${CXX-"c++"} +compiler=$CC +_LT_AC_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) + +# We don't want -fno-exception wen compiling C++ code, so set the +# no_builtin_flag separately +if test "$GXX" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' +else + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= +fi + +if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + AC_PROG_LD + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ + grep 'no-whole-archive' > /dev/null; then + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + +else + GXX=no + with_gnu_ld=no + wlarc= +fi + +# PORTME: fill in a description of your system's C++ link characteristics +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +_LT_AC_TAGVAR(ld_shlibs, $1)=yes +case $host_os in + aix3*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aix[[4-9]]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_AC_TAGVAR(archive_cmds, $1)='' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + if test "$GXX" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared libraries. + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + darwin* | rhapsody*) + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_automatic, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + _LT_AC_TAGVAR(allow_undefined_flag, $1)="$_lt_dar_allow_undefined" + if test "$GXX" = yes ; then + output_verbose_link_cmd='echo' + _LT_AC_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + _LT_AC_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + _LT_AC_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + if test "$lt_cv_apple_cc_single_mod" != "yes"; then + _LT_AC_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" + fi + else + case $cc_basename in + xlc*) + output_verbose_link_cmd='echo' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring' + _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + fi + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + freebsd[[12]]*) + # C++ shared libraries reported to be fairly broken before switch to ELF + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + freebsd-elf*) + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + ;; + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + ;; + gnu*) + ;; + hpux9*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[[-]]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) ;; + *) + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case $host_cpu in + hppa*64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + interix[[3-9]]*) + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' + fi + fi + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + esac + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + linux* | k*bsd*-gnu) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc*) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + ;; + cxx*) + # Compaq C++ + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='echo' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + lynxos*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + m88k*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + openbsd2*) + # C++ shared libraries are fairly broken + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + openbsd*) + if test -f /usr/libexec/ld.so; then + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd='echo' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + osf3*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' + + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + cxx*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + cxx*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~ + $rm $lib.exp' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + psos*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + solaris*) + case $cc_basename in + CC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_AC_TAGVAR(archive_cmds_need_lc,$1)=yes + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + ;; + esac + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + output_verbose_link_cmd='echo' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs' + if $CC --version | grep -v '^2\.7' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + fi + + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir' + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + # So that behaviour is only enabled if SCOABSPATH is set to a + # non-empty value in the environment. Most likely only useful for + # creating official distributions of packages. + # This is a hack until libtool officially supports absolute path + # names for shared libraries. + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + ;; + vxworks*) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + *) + # FIXME: insert proper C++ library support + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; +esac +AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) +test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +_LT_AC_TAGVAR(GCC, $1)="$GXX" +_LT_AC_TAGVAR(LD, $1)="$LD" + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +AC_LIBTOOL_POSTDEP_PREDEP($1) +AC_LIBTOOL_PROG_COMPILER_PIC($1) +AC_LIBTOOL_PROG_CC_C_O($1) +AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) +AC_LIBTOOL_PROG_LD_SHLIBS($1) +AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) +AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_POP +CC=$lt_save_CC +LDCXX=$LD +LD=$lt_save_LD +GCC=$lt_save_GCC +with_gnu_ldcxx=$with_gnu_ld +with_gnu_ld=$lt_save_with_gnu_ld +lt_cv_path_LDCXX=$lt_cv_path_LD +lt_cv_path_LD=$lt_save_path_LD +lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld +lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld +])# AC_LIBTOOL_LANG_CXX_CONFIG + +# AC_LIBTOOL_POSTDEP_PREDEP([TAGNAME]) +# ------------------------------------ +# Figure out "hidden" library dependencies from verbose +# compiler output when linking a shared library. +# Parse the compiler output and extract the necessary +# objects, libraries and library flags. +AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP], +[AC_REQUIRE([LT_AC_PROG_SED])dnl +dnl we can't use the lt_simple_compile_test_code here, +dnl because it contains code intended for an executable, +dnl not a library. It's possible we should let each +dnl tag define a new lt_????_link_test_code variable, +dnl but it's only used here... +ifelse([$1],[],[cat > conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext < conftest.$ac_ext <&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + # + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + if test "$solaris_use_stlport4" != yes; then + _LT_AC_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' + fi + ;; + esac + ;; + +solaris*) + case $cc_basename in + CC*) + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + # Adding this requires a known-good setup of shared libraries for + # Sun compiler versions before 5.6, else PIC objects from an old + # archive will be linked into the output, leading to subtle bugs. + if test "$solaris_use_stlport4" != yes; then + _LT_AC_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun' + fi + ;; + esac + ;; +esac +]) +case " $_LT_AC_TAGVAR(postdeps, $1) " in +*" -lc "*) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no ;; +esac +])# AC_LIBTOOL_POSTDEP_PREDEP + +# AC_LIBTOOL_LANG_F77_CONFIG +# -------------------------- +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG], [_LT_AC_LANG_F77_CONFIG(F77)]) +AC_DEFUN([_LT_AC_LANG_F77_CONFIG], +[AC_REQUIRE([AC_PROG_F77]) +AC_LANG_PUSH(Fortran 77) + +_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no +_LT_AC_TAGVAR(allow_undefined_flag, $1)= +_LT_AC_TAGVAR(always_export_symbols, $1)=no +_LT_AC_TAGVAR(archive_expsym_cmds, $1)= +_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= +_LT_AC_TAGVAR(hardcode_direct, $1)=no +_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= +_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= +_LT_AC_TAGVAR(hardcode_libdir_separator, $1)= +_LT_AC_TAGVAR(hardcode_minus_L, $1)=no +_LT_AC_TAGVAR(hardcode_automatic, $1)=no +_LT_AC_TAGVAR(module_cmds, $1)= +_LT_AC_TAGVAR(module_expsym_cmds, $1)= +_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown +_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds +_LT_AC_TAGVAR(no_undefined_flag, $1)= +_LT_AC_TAGVAR(whole_archive_flag_spec, $1)= +_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no + +# Source file extension for f77 test sources. +ac_ext=f + +# Object file extension for compiled f77 test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="\ + subroutine t + return + end +" + +# Code to be used in simple link tests +lt_simple_link_test_code="\ + program t + end +" + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_AC_SYS_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +CC=${F77-"f77"} +compiler=$CC +_LT_AC_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) + +AC_MSG_CHECKING([if libtool supports shared libraries]) +AC_MSG_RESULT([$can_build_shared]) + +AC_MSG_CHECKING([whether to build shared libraries]) +test "$can_build_shared" = "no" && enable_shared=no + +# On AIX, shared libraries and static libraries use the same namespace, and +# are all built from PIC. +case $host_os in +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; +aix[[4-9]]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; +esac +AC_MSG_RESULT([$enable_shared]) + +AC_MSG_CHECKING([whether to build static libraries]) +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes +AC_MSG_RESULT([$enable_static]) + +_LT_AC_TAGVAR(GCC, $1)="$G77" +_LT_AC_TAGVAR(LD, $1)="$LD" + +AC_LIBTOOL_PROG_COMPILER_PIC($1) +AC_LIBTOOL_PROG_CC_C_O($1) +AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) +AC_LIBTOOL_PROG_LD_SHLIBS($1) +AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) +AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_POP +CC="$lt_save_CC" +])# AC_LIBTOOL_LANG_F77_CONFIG + + +# AC_LIBTOOL_LANG_GCJ_CONFIG +# -------------------------- +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG], [_LT_AC_LANG_GCJ_CONFIG(GCJ)]) +AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG], +[AC_LANG_SAVE + +# Source file extension for Java test sources. +ac_ext=java + +# Object file extension for compiled Java test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="class foo {}" + +# Code to be used in simple link tests +lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_AC_SYS_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +CC=${GCJ-"gcj"} +compiler=$CC +_LT_AC_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) + +# GCJ did not exist at the time GCC didn't implicitly link libc in. +_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + +_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1) +AC_LIBTOOL_PROG_COMPILER_PIC($1) +AC_LIBTOOL_PROG_CC_C_O($1) +AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1) +AC_LIBTOOL_PROG_LD_SHLIBS($1) +AC_LIBTOOL_SYS_DYNAMIC_LINKER($1) +AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1) + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_RESTORE +CC="$lt_save_CC" +])# AC_LIBTOOL_LANG_GCJ_CONFIG + + +# AC_LIBTOOL_LANG_RC_CONFIG +# ------------------------- +# Ensure that the configuration vars for the Windows resource compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. +AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG], [_LT_AC_LANG_RC_CONFIG(RC)]) +AC_DEFUN([_LT_AC_LANG_RC_CONFIG], +[AC_LANG_SAVE + +# Source file extension for RC test sources. +ac_ext=rc + +# Object file extension for compiled RC test sources. +objext=o +_LT_AC_TAGVAR(objext, $1)=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' + +# Code to be used in simple link tests +lt_simple_link_test_code="$lt_simple_compile_test_code" + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. +_LT_AC_SYS_COMPILER + +# save warnings/boilerplate of simple test code +_LT_COMPILER_BOILERPLATE +_LT_LINKER_BOILERPLATE + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +CC=${RC-"windres"} +compiler=$CC +_LT_AC_TAGVAR(compiler, $1)=$CC +_LT_CC_BASENAME([$compiler]) +_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes + +AC_LIBTOOL_CONFIG($1) + +AC_LANG_RESTORE +CC="$lt_save_CC" +])# AC_LIBTOOL_LANG_RC_CONFIG + + +# AC_LIBTOOL_CONFIG([TAGNAME]) +# ---------------------------- +# If TAGNAME is not passed, then create an initial libtool script +# with a default configuration from the untagged config vars. Otherwise +# add code to config.status for appending the configuration named by +# TAGNAME from the matching tagged config vars. +AC_DEFUN([AC_LIBTOOL_CONFIG], +[# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + _LT_AC_TAGVAR(compiler, $1) \ + _LT_AC_TAGVAR(CC, $1) \ + _LT_AC_TAGVAR(LD, $1) \ + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1) \ + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1) \ + _LT_AC_TAGVAR(lt_prog_compiler_static, $1) \ + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) \ + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1) \ + _LT_AC_TAGVAR(thread_safe_flag_spec, $1) \ + _LT_AC_TAGVAR(whole_archive_flag_spec, $1) \ + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) \ + _LT_AC_TAGVAR(old_archive_cmds, $1) \ + _LT_AC_TAGVAR(old_archive_from_new_cmds, $1) \ + _LT_AC_TAGVAR(predep_objects, $1) \ + _LT_AC_TAGVAR(postdep_objects, $1) \ + _LT_AC_TAGVAR(predeps, $1) \ + _LT_AC_TAGVAR(postdeps, $1) \ + _LT_AC_TAGVAR(compiler_lib_search_path, $1) \ + _LT_AC_TAGVAR(compiler_lib_search_dirs, $1) \ + _LT_AC_TAGVAR(archive_cmds, $1) \ + _LT_AC_TAGVAR(archive_expsym_cmds, $1) \ + _LT_AC_TAGVAR(postinstall_cmds, $1) \ + _LT_AC_TAGVAR(postuninstall_cmds, $1) \ + _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) \ + _LT_AC_TAGVAR(allow_undefined_flag, $1) \ + _LT_AC_TAGVAR(no_undefined_flag, $1) \ + _LT_AC_TAGVAR(export_symbols_cmds, $1) \ + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) \ + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) \ + _LT_AC_TAGVAR(hardcode_libdir_separator, $1) \ + _LT_AC_TAGVAR(hardcode_automatic, $1) \ + _LT_AC_TAGVAR(module_cmds, $1) \ + _LT_AC_TAGVAR(module_expsym_cmds, $1) \ + _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) \ + _LT_AC_TAGVAR(fix_srcfile_path, $1) \ + _LT_AC_TAGVAR(exclude_expsyms, $1) \ + _LT_AC_TAGVAR(include_expsyms, $1); do + + case $var in + _LT_AC_TAGVAR(old_archive_cmds, $1) | \ + _LT_AC_TAGVAR(old_archive_from_new_cmds, $1) | \ + _LT_AC_TAGVAR(archive_cmds, $1) | \ + _LT_AC_TAGVAR(archive_expsym_cmds, $1) | \ + _LT_AC_TAGVAR(module_cmds, $1) | \ + _LT_AC_TAGVAR(module_expsym_cmds, $1) | \ + _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) | \ + _LT_AC_TAGVAR(export_symbols_cmds, $1) | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\[$]0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\[$]0 --fallback-echo"[$]/[$]0 --fallback-echo"/'` + ;; + esac + +ifelse([$1], [], + [cfgfile="${ofile}T" + trap "$rm \"$cfgfile\"; exit 1" 1 2 15 + $rm -f "$cfgfile" + AC_MSG_NOTICE([creating $ofile])], + [cfgfile="$ofile"]) + + cat <<__EOF__ >> "$cfgfile" +ifelse([$1], [], +[#! $SHELL + +# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 +# Free Software Foundation, Inc. +# +# This file is part of GNU Libtool: +# Originally by Gordon Matzigkeit , 1996 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="$SED -e 1s/^X//" + +# 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 + +# The names of the tagged configurations supported by this script. +available_tags= + +# ### BEGIN LIBTOOL CONFIG], +[# ### BEGIN LIBTOOL TAG CONFIG: $tagname]) + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$_LT_AC_TAGVAR(archive_cmds_need_lc, $1) + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# LTCC compiler flags. +LTCFLAGS=$lt_LTCFLAGS + +# A language-specific compiler. +CC=$lt_[]_LT_AC_TAGVAR(compiler, $1) + +# Is the compiler the GNU C compiler? +with_gcc=$_LT_AC_TAGVAR(GCC, $1) + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_[]_LT_AC_TAGVAR(LD, $1) + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_[]_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_static, $1) + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_[]_LT_AC_TAGVAR(export_dynamic_flag_spec, $1) + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_[]_LT_AC_TAGVAR(whole_archive_flag_spec, $1) + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_[]_LT_AC_TAGVAR(thread_safe_flag_spec, $1) + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_cmds, $1) +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_new_cmds, $1) + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) + +# Commands used to build and install a shared archive. +archive_cmds=$lt_[]_LT_AC_TAGVAR(archive_cmds, $1) +archive_expsym_cmds=$lt_[]_LT_AC_TAGVAR(archive_expsym_cmds, $1) +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_[]_LT_AC_TAGVAR(module_cmds, $1) +module_expsym_cmds=$lt_[]_LT_AC_TAGVAR(module_expsym_cmds, $1) + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_[]_LT_AC_TAGVAR(predep_objects, $1) + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_[]_LT_AC_TAGVAR(postdep_objects, $1) + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_[]_LT_AC_TAGVAR(predeps, $1) + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_[]_LT_AC_TAGVAR(postdeps, $1) + +# The directories searched by this compiler when creating a shared +# library +compiler_lib_search_dirs=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_dirs, $1) + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_path, $1) + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_[]_LT_AC_TAGVAR(allow_undefined_flag, $1) + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_[]_LT_AC_TAGVAR(no_undefined_flag, $1) + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$_LT_AC_TAGVAR(hardcode_action, $1) + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_separator, $1) + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$_LT_AC_TAGVAR(hardcode_direct, $1) + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$_LT_AC_TAGVAR(hardcode_minus_L, $1) + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1) + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$_LT_AC_TAGVAR(hardcode_automatic, $1) + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$_LT_AC_TAGVAR(link_all_deplibs, $1) + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path=$lt_fix_srcfile_path + +# Set to yes if exported symbols are required. +always_export_symbols=$_LT_AC_TAGVAR(always_export_symbols, $1) + +# The commands to list exported symbols. +export_symbols_cmds=$lt_[]_LT_AC_TAGVAR(export_symbols_cmds, $1) + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_[]_LT_AC_TAGVAR(exclude_expsyms, $1) + +# Symbols that must always be exported. +include_expsyms=$lt_[]_LT_AC_TAGVAR(include_expsyms, $1) + +ifelse([$1],[], +[# ### END LIBTOOL CONFIG], +[# ### END LIBTOOL TAG CONFIG: $tagname]) + +__EOF__ + +ifelse([$1],[], [ + case $host_os in + aix3*) + cat <<\EOF >> "$cfgfile" + +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +EOF + ;; + esac + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || \ + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" +]) +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + fi +fi +])# AC_LIBTOOL_CONFIG + + +# AC_LIBTOOL_PROG_COMPILER_NO_RTTI([TAGNAME]) +# ------------------------------------------- +AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], +[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl + +_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)= + +if test "$GCC" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' + + AC_LIBTOOL_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions], + lt_cv_prog_compiler_rtti_exceptions, + [-fno-rtti -fno-exceptions], [], + [_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"]) +fi +])# AC_LIBTOOL_PROG_COMPILER_NO_RTTI + + +# AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE +# --------------------------------- +AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], +[AC_REQUIRE([AC_CANONICAL_HOST]) +AC_REQUIRE([LT_AC_PROG_SED]) +AC_REQUIRE([AC_PROG_NM]) +AC_REQUIRE([AC_OBJEXT]) +# Check for command to grab the raw symbol name followed by C symbol from nm. +AC_MSG_CHECKING([command to parse $NM output from $compiler object]) +AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe], +[ +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[[BCDEGRST]]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)' + +# Transform an extracted symbol line into a proper C declaration +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[[BCDT]]' + ;; +cygwin* | mingw* | pw32*) + symcode='[[ABCDGISTW]]' + ;; +hpux*) # Its linker distinguishes data from code symbols + if test "$host_cpu" = ia64; then + symcode='[[ABCDEGRST]]' + fi + lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + ;; +linux* | k*bsd*-gnu) + if test "$host_cpu" = ia64; then + symcode='[[ABCDGIRSTW]]' + lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + fi + ;; +irix* | nonstopux*) + symcode='[[BCDEGRST]]' + ;; +osf*) + symcode='[[BCDEGQRST]]' + ;; +solaris*) + symcode='[[BDRT]]' + ;; +sco3.2v5*) + symcode='[[DT]]' + ;; +sysv4.2uw2*) + symcode='[[DT]]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[[ABDT]]' + ;; +sysv4) + symcode='[[DFNSTU]]' + ;; +esac + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[[ABCDGIRSTW]]' ;; +esac + +# Try without a prefix undercore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext < $nlist) && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if grep ' nm_test_var$' "$nlist" >/dev/null; then + if grep ' nm_test_func$' "$nlist" >/dev/null; then + cat < conftest.$ac_ext +#ifdef __cplusplus +extern "C" { +#endif + +EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' + + cat <> conftest.$ac_ext +#if defined (__STDC__) && __STDC__ +# define lt_ptr_t void * +#else +# define lt_ptr_t char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + lt_ptr_t address; +} +lt_preloaded_symbols[[]] = +{ +EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext + cat <<\EOF >> conftest.$ac_ext + {0, (lt_ptr_t) 0} +}; + +#ifdef __cplusplus +} +#endif +EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_save_LIBS="$LIBS" + lt_save_CFLAGS="$CFLAGS" + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)" + if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS="$lt_save_LIBS" + CFLAGS="$lt_save_CFLAGS" + else + echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD + fi + else + echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done +]) +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + AC_MSG_RESULT(failed) +else + AC_MSG_RESULT(ok) +fi +]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE + + +# AC_LIBTOOL_PROG_COMPILER_PIC([TAGNAME]) +# --------------------------------------- +AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC], +[_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)= +_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= +_LT_AC_TAGVAR(lt_prog_compiler_static, $1)= + +AC_MSG_CHECKING([for $compiler option to produce PIC]) + ifelse([$1],[CXX],[ + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + case $host_os in + aix[[4-9]]*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case $cc_basename in + xlc*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + esac + ;; + dgux*) + case $cc_basename in + ec++*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + if test "$host_cpu" != ia64; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + fi + ;; + aCC*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu) + case $cc_basename in + KCC*) + # KAI C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + icpc* | ecpc*) + # Intel C++ + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler. + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd*) + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + cxx*) + # Digital/Compaq C++ + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC*) + # Sun C++ 4.2, 5.x and Centerline C++ + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + lcc*) + # Lucid + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + ;; + *) + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + esac + ;; + vxworks*) + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +], +[ + if test "$GCC" = yes; then + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4' + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + m4_if([$1], [GCJ], [], + [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common' + ;; + + interix[[3-9]]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + enable_shared=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic + fi + ;; + + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + ;; + + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + else + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp' + fi + ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case $cc_basename in + xlc*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + esac + ;; + + mingw* | cygwin* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + m4_if([$1], [GCJ], [], + [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT']) + ;; + + hpux9* | hpux10* | hpux11*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # PIC (with -KPIC) is the default. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + newsos6) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + linux* | k*bsd*-gnu) + case $cc_basename in + icc* | ecc*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + ccc*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All Alpha code is PIC. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C 5.9 + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + ;; + *Sun\ F*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='' + ;; + esac + ;; + esac + ;; + + osf3* | osf4* | osf5*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + # All OSF/1 code is PIC. + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + rdos*) + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared' + ;; + + solaris*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + case $cc_basename in + f77* | f90* | f95*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';; + *) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';; + esac + ;; + + sunos4*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + unicos*) + _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,' + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + + uts4*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic' + _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic' + ;; + + *) + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no + ;; + esac + fi +]) +AC_MSG_RESULT([$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)]) + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)"; then + AC_LIBTOOL_COMPILER_OPTION([if $compiler PIC flag $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) works], + _LT_AC_TAGVAR(lt_cv_prog_compiler_pic_works, $1), + [$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])], [], + [case $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) in + "" | " "*) ;; + *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)" ;; + esac], + [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no]) +fi +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)= + ;; + *) + _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])" + ;; +esac + +# +# Check to make sure the static flag actually works. +# +wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_AC_TAGVAR(lt_prog_compiler_static, $1)\" +AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works], + _LT_AC_TAGVAR(lt_cv_prog_compiler_static_works, $1), + $lt_tmp_static_flag, + [], + [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=]) +]) + + +# AC_LIBTOOL_PROG_LD_SHLIBS([TAGNAME]) +# ------------------------------------ +# See if the linker supports building shared libraries. +AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS], +[AC_REQUIRE([LT_AC_PROG_SED])dnl +AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries]) +ifelse([$1],[CXX],[ + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + case $host_os in + aix[[4-9]]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + else + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + _LT_AC_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds" + ;; + cygwin* | mingw*) + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' + ;; + *) + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac + _LT_AC_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] +],[ + runpath_var= + _LT_AC_TAGVAR(allow_undefined_flag, $1)= + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no + _LT_AC_TAGVAR(archive_cmds, $1)= + _LT_AC_TAGVAR(archive_expsym_cmds, $1)= + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)= + _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)= + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + _LT_AC_TAGVAR(thread_safe_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)= + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_minus_L, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown + _LT_AC_TAGVAR(hardcode_automatic, $1)=no + _LT_AC_TAGVAR(module_cmds, $1)= + _LT_AC_TAGVAR(module_expsym_cmds, $1)= + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + _LT_AC_TAGVAR(include_expsyms, $1)= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + _LT_AC_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'] + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. +dnl Note also adjust exclude_expsyms for C++ above. + extract_expsyms_cmds= + # Just being paranoid about ensuring that cc_basename is set. + _LT_CC_BASENAME([$compiler]) + case $host_os in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + fi + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[[3-9]]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + _LT_AC_TAGVAR(ld_shlibs, $1)=no + cat <&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + fi + ;; + + amigaos*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can't use + # them. + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless, + # as there is no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=no + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/'\'' -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + interix[[3-9]]*) + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | k*bsd*-gnu) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + tmp_addflag= + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + *) + tmp_sharedflag='-shared' ;; + esac + _LT_AC_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test $supports_anon_versioning = yes; then + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + $echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + _LT_AC_TAGVAR(ld_shlibs, $1)=no + cat <&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + ;; + + sunos4*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + esac + + if test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no; then + runpath_var= + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)= + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)= + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + fi + ;; + + aix[[4-9]]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + else + _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + _LT_AC_TAGVAR(archive_cmds, $1)='' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + + if test "$GCC" = yes; then + case $host_os in aix4.[[012]]|aix4.[[012]].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + _LT_AC_TAGVAR(always_export_symbols, $1)=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok' + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib' + _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + _LT_AC_SYS_LIBPATH_AIX + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='$convenience' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + # This is similar to how AIX traditionally builds its shared libraries. + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + # see comment about different semantics on the GNU ld section + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + bsdi[[45]]*) + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=' ' + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='true' + # FIXME: Should let the user specify the lib program. + _LT_AC_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs' + _LT_AC_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`' + _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes + ;; + + darwin* | rhapsody*) + case $host_os in + rhapsody* | darwin1.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[[012]]) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + ;; + 10.*) + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup' + ;; + esac + fi + ;; + esac + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_automatic, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + if test "$GCC" = yes ; then + output_verbose_link_cmd='echo' + _LT_AC_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + _LT_AC_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + _LT_AC_TAGVAR(archive_expsym_cmds, $1)="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + _LT_AC_TAGVAR(module_expsym_cmds, $1)="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + else + case $cc_basename in + xlc*) + output_verbose_link_cmd='echo' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring' + _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + fi + ;; + + dgux*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + freebsd1*) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + hpux9*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + + case $host_cpu in + hppa*64*|ia64*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + *) + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + newsos6) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E' + else + case $host_os in + openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + ;; + *) + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir' + ;; + esac + fi + else + _LT_AC_TAGVAR(ld_shlibs, $1)=no + fi + ;; + + os2*) + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported + _LT_AC_TAGVAR(archive_cmds, $1)='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir' + else + _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir' + fi + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=: + ;; + + solaris*) + _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text' + if test "$GCC" = yes; then + wlarc='${wl}' + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' + else + wlarc='' + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + case $host_os in + solaris2.[[0-5]] | solaris2.[[0-5]].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. GCC discards it without `$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test "$GCC" = yes; then + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + else + _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract' + fi + ;; + esac + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes + _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4) + case $host_vendor in + sni) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs' + _LT_AC_TAGVAR(hardcode_direct, $1)=no + ;; + motorola) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + sysv4.3*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + _LT_AC_TAGVAR(ld_shlibs, $1)=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*) + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text' + _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs' + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':' + _LT_AC_TAGVAR(link_all_deplibs, $1)=yes + _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir' + _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no + ;; + + *) + _LT_AC_TAGVAR(ld_shlibs, $1)=no + ;; + esac + fi +]) +AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)]) +test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no + +# +# Do we need to explicitly link libc? +# +case "x$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)" in +x|xyes) + # Assume -lc should be added + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $_LT_AC_TAGVAR(archive_cmds, $1) in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + AC_MSG_CHECKING([whether -lc should be explicitly linked in]) + $rm conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if AC_TRY_EVAL(ac_compile) 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) + pic_flag=$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$_LT_AC_TAGVAR(allow_undefined_flag, $1) + _LT_AC_TAGVAR(allow_undefined_flag, $1)= + if AC_TRY_EVAL(_LT_AC_TAGVAR(archive_cmds, $1) 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) + then + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no + else + _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes + fi + _LT_AC_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + AC_MSG_RESULT([$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)]) + ;; + esac + fi + ;; +esac +])# AC_LIBTOOL_PROG_LD_SHLIBS + + +# _LT_AC_FILE_LTDLL_C +# ------------------- +# Be careful that the start marker always follows a newline. +AC_DEFUN([_LT_AC_FILE_LTDLL_C], [ +# /* ltdll.c starts here */ +# #define WIN32_LEAN_AND_MEAN +# #include +# #undef WIN32_LEAN_AND_MEAN +# #include +# +# #ifndef __CYGWIN__ +# # ifdef __CYGWIN32__ +# # define __CYGWIN__ __CYGWIN32__ +# # endif +# #endif +# +# #ifdef __cplusplus +# extern "C" { +# #endif +# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved); +# #ifdef __cplusplus +# } +# #endif +# +# #ifdef __CYGWIN__ +# #include +# DECLARE_CYGWIN_DLL( DllMain ); +# #endif +# HINSTANCE __hDllInstance_base; +# +# BOOL APIENTRY +# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) +# { +# __hDllInstance_base = hInst; +# return TRUE; +# } +# /* ltdll.c ends here */ +])# _LT_AC_FILE_LTDLL_C + + +# _LT_AC_TAGVAR(VARNAME, [TAGNAME]) +# --------------------------------- +AC_DEFUN([_LT_AC_TAGVAR], [ifelse([$2], [], [$1], [$1_$2])]) + + +# old names +AC_DEFUN([AM_PROG_LIBTOOL], [AC_PROG_LIBTOOL]) +AC_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)]) +AC_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)]) +AC_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)]) +AC_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)]) +AC_DEFUN([AM_PROG_LD], [AC_PROG_LD]) +AC_DEFUN([AM_PROG_NM], [AC_PROG_NM]) + +# This is just to silence aclocal about the macro not being used +ifelse([AC_DISABLE_FAST_INSTALL]) + +AC_DEFUN([LT_AC_PROG_GCJ], +[AC_CHECK_TOOL(GCJ, gcj, no) + test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2" + AC_SUBST(GCJFLAGS) +]) + +AC_DEFUN([LT_AC_PROG_RC], +[AC_CHECK_TOOL(RC, windres, no) +]) + + +# Cheap backport of AS_EXECUTABLE_P and required macros +# from Autoconf 2.59; we should not use $as_executable_p directly. + +# _AS_TEST_PREPARE +# ---------------- +m4_ifndef([_AS_TEST_PREPARE], +[m4_defun([_AS_TEST_PREPARE], +[if test -x / >/dev/null 2>&1; then + as_executable_p='test -x' +else + as_executable_p='test -f' +fi +])])# _AS_TEST_PREPARE + +# AS_EXECUTABLE_P +# --------------- +# Check whether a file is executable. +m4_ifndef([AS_EXECUTABLE_P], +[m4_defun([AS_EXECUTABLE_P], +[AS_REQUIRE([_AS_TEST_PREPARE])dnl +$as_executable_p $1[]dnl +])])# AS_EXECUTABLE_P + +############################################################ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_SED. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +############################################################ +# LT_AC_PROG_SED +# -------------- +# Check for a fully-functional sed program, that truncates +# as few characters as possible. Prefer GNU sed if found. +AC_DEFUN([LT_AC_PROG_SED], +[AC_MSG_CHECKING([for a sed that does not truncate output]) +AC_CACHE_VAL(lt_cv_path_SED, +[# Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if AS_EXECUTABLE_P(["$as_dir/$lt_ac_prog$ac_exec_ext"]); then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +IFS=$as_save_IFS +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f $lt_ac_sed && continue + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test $lt_ac_count -gt 10 && break + lt_ac_count=`expr $lt_ac_count + 1` + if test $lt_ac_count -gt $lt_ac_max; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done +]) +SED=$lt_cv_path_SED +AC_SUBST([SED]) +AC_MSG_RESULT([$SED]) +]) diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/build/lineends.pl b/rubbos/app/httpd-2.0.64/srclib/apr/build/lineends.pl new file mode 100644 index 00000000..3e3067f7 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/build/lineends.pl @@ -0,0 +1,150 @@ +#!/usr/local/bin/perl +# +# Heuristically converts line endings to the current OS's preferred format +# +# All existing line endings must be identical (e.g. lf's only, or even +# the accedental cr.cr.lf sequence.) If some lines end lf, and others as +# cr.lf, the file is presumed binary. If the cr character appears anywhere +# except prefixed to an lf, the file is presumed binary. If there is no +# change in the resulting file size, or the file is binary, the conversion +# is discarded. +# +# Todo: Handle NULL stdin characters gracefully. +# + +use IO::File; +use File::Find; + +# The ignore list is '-' seperated, with this leading hyphen and +# trailing hyphens in ever concatinated list below. +$ignore = "-"; + +# Image formats +$ignore .= "gif-jpg-jpeg-png-ico-bmp-"; + +# Archive formats +$ignore .= "tar-gz-z-zip-jar-war-bz2-tgz-"; + +# Many document formats +$ignore .= "eps-psd-pdf-chm-ai-"; + +# Some encodings +$ignore .= "ucs2-ucs4-"; + +# Some binary objects +$ignore .= "class-so-dll-exe-obj-lib-a-o-lo-slo-sl-dylib-"; + +# Some build env files +$ignore .= "mcp-xdc-ncb-opt-pdb-ilk-exp-res-pch-idb-sbr-"; + +$preservedate = 1; + +$forceending = 0; + +$givenpaths = 0; + +$notnative = 0; + +while (defined @ARGV[0]) { + if (@ARGV[0] eq '--touch') { + $preservedate = 0; + } + elsif (@ARGV[0] eq '--nocr') { + $notnative = -1; + } + elsif (@ARGV[0] eq '--cr') { + $notnative = 1; + } + elsif (@ARGV[0] eq '--force') { + $forceending = 1; + } + elsif (@ARGV[0] eq '--FORCE') { + $forceending = 2; + } + elsif (@ARGV[0] =~ m/^-/) { + die "What is " . @ARGV[0] . " supposed to mean?\n\n" + . "Syntax:\t$0 [option()s] [path(s)]\n\n" . <<'OUTCH' +Where: paths specifies the top level directory to convert (default of '.') + options are; + + --cr keep/add one ^M + --nocr remove ^M's + --touch the datestamp (default: keeps date/attribs) + --force mismatched corrections (unbalanced ^M's) + --FORCE all files regardless of file name! + +OUTCH + } + else { + find(\&totxt, @ARGV[0]); + print "scanned " . @ARGV[0] . "\n"; + $givenpaths = 1; + } + shift @ARGV; +} + +if (!$givenpaths) { + find(\&totxt, '.'); + print "did .\n"; +} + +sub totxt { + $oname = $_; + $tname = '.#' . $_; + if (!-f) { + return; + } + @exts = split /\./; + if ($forceending < 2) { + while ($#exts && ($ext = pop(@exts))) { + if ($ignore =~ m|-$ext-|i) { + return; + } + } + } + return if ($File::Find::dir =~ m|^(.+/)?.svn(/.+)?$|); + @ostat = stat($oname); + $srcfl = new IO::File $oname, "r" or die; + $dstfl = new IO::File $tname, "w" or die; + binmode $srcfl; + if ($notnative) { + binmode $dstfl; + } + undef $t; + while (<$srcfl>) { + if (s/(\r*)\n$/\n/) { + $n = length $1; + if (!defined $t) { + $t = $n; + } + if (!$forceending && (($n != $t) || m/\r/)) { + print "mismatch in " .$oname. ":" .$n. " expected " .$t. "\n"; + undef $t; + last; + } + elsif ($notnative > 0) { + s/\n$/\r\n/; + } + } + print $dstfl $_; + } + if (defined $t && (tell $srcfl == tell $dstfl)) { + undef $t; + } + undef $srcfl; + undef $dstfl; + if (defined $t) { + unlink $oname or die; + rename $tname, $oname or die; + @anames = ($oname); + if ($preservedate) { + utime $ostat[9], $ostat[9], @anames; + } + chmod $ostat[2] & 07777, @anames; + chown $ostat[5], $ostat[6], @anames; + print "Converted file " . $oname . " to text in " . $File::Find::dir . "\n"; + } + else { + unlink $tname or die; + } +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/build/ltmain.sh b/rubbos/app/httpd-2.0.64/srclib/apr/build/ltmain.sh new file mode 100644 index 00000000..2bcb8482 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/build/ltmain.sh @@ -0,0 +1,6956 @@ +# ltmain.sh - Provide generalized library-building support services. +# NOTE: Changing this file will not affect anything until you rerun configure. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, +# 2007, 2008 Free Software Foundation, Inc. +# Originally by Gordon Matzigkeit , 1996 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +basename="s,^.*/,,g" + +# 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 $basename` +modename="$progname" + +# Global variables: +EXIT_SUCCESS=0 +EXIT_FAILURE=1 + +PROGRAM=ltmain.sh +PACKAGE=libtool +VERSION=1.5.26 +TIMESTAMP=" (1.1220.2.493 2008/02/01 16:58:18)" + +# Be Bourne compatible (taken from Autoconf:_AS_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 + +# Check that we have a working $echo. +if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X$1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then + # Yippee, $echo works! + : +else + # Restart under the correct shell, and then maybe $echo will work. + exec $SHELL "$progpath" --no-reexec ${1+"$@"} +fi + +if test "X$1" = X--fallback-echo; then + # used as fallback echo + shift + cat <&2 + $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit $EXIT_FAILURE +fi + +# Global variables. +mode=$default_mode +nonopt= +prev= +prevopt= +run= +show="$echo" +show_help= +execute_dlfiles= +duplicate_deps=no +preserve_args= +lo2o="s/\\.lo\$/.${objext}/" +o2lo="s/\\.${objext}\$/.lo/" +extracted_archives= +extracted_serial=0 + +##################################### +# Shell function definitions: +# This seems to be the best place for them + +# func_mktempdir [string] +# Make a temporary directory that won't clash with other running +# libtool processes, and avoids race conditions if possible. If +# given, STRING is the basename for that directory. +func_mktempdir () +{ + my_template="${TMPDIR-/tmp}/${1-$progname}" + + if test "$run" = ":"; then + # Return a directory name, but don't create it in dry-run mode + my_tmpdir="${my_template}-$$" + else + + # If mktemp works, use that first and foremost + my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` + + if test ! -d "$my_tmpdir"; then + # Failing that, at least try and use $RANDOM to avoid a race + my_tmpdir="${my_template}-${RANDOM-0}$$" + + save_mktempdir_umask=`umask` + umask 0077 + $mkdir "$my_tmpdir" + umask $save_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$my_tmpdir" || { + $echo "cannot create temporary directory \`$my_tmpdir'" 1>&2 + exit $EXIT_FAILURE + } + fi + + $echo "X$my_tmpdir" | $Xsed +} + + +# 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. +func_win32_libid () +{ + 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 + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | \ + $EGREP -e 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then + win32_nmres=`eval $NM -f posix -A $1 | \ + $SED -n -e '1,100{ + / I /{ + s,.*,import, + p + q + } + }'` + 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_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 () +{ + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + CC_quoted="$CC_quoted $arg" + done + 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 "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) ;; + # 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. + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + CC_quoted="$CC_quoted $arg" + done + case "$@ " in + " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) + # 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 + $echo "$modename: unable to infer tagged configuration" + $echo "$modename: specify a tag with \`--tag'" 1>&2 + exit $EXIT_FAILURE +# else +# $echo "$modename: using $tagname tagged configuration" + fi + ;; + esac + fi +} + + +# func_extract_an_archive dir oldlib +func_extract_an_archive () +{ + f_ex_an_ar_dir="$1"; shift + f_ex_an_ar_oldlib="$1" + + $show "(cd $f_ex_an_ar_dir && $AR x $f_ex_an_ar_oldlib)" + $run eval "(cd \$f_ex_an_ar_dir && $AR x \$f_ex_an_ar_oldlib)" || exit $? + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then + : + else + $echo "$modename: ERROR: object name conflicts: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" 1>&2 + exit $EXIT_FAILURE + fi +} + +# func_extract_archives gentop oldlib ... +func_extract_archives () +{ + my_gentop="$1"; shift + my_oldlibs=${1+"$@"} + my_oldobjs="" + my_xlib="" + my_xabs="" + my_xdir="" + my_status="" + + $show "${rm}r $my_gentop" + $run ${rm}r "$my_gentop" + $show "$mkdir $my_gentop" + $run $mkdir "$my_gentop" + my_status=$? + if test "$my_status" -ne 0 && test ! -d "$my_gentop"; then + exit $my_status + fi + + 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 + my_xlib=`$echo "X$my_xlib" | $Xsed -e 's%^.*/%%'` + my_xlib_u=$my_xlib + while :; do + case " $extracted_archives " in + *" $my_xlib_u "*) + extracted_serial=`expr $extracted_serial + 1` + 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" + + $show "${rm}r $my_xdir" + $run ${rm}r "$my_xdir" + $show "$mkdir $my_xdir" + $run $mkdir "$my_xdir" + exit_status=$? + if test "$exit_status" -ne 0 && test ! -d "$my_xdir"; then + exit $exit_status + fi + case $host in + *-darwin*) + $show "Extracting $my_xabs" + # Do not bother doing anything if just a dry run + if test -z "$run"; then + darwin_orig_dir=`pwd` + cd $my_xdir || exit $? + darwin_archive=$my_xabs + darwin_curdir=`pwd` + darwin_base_archive=`$echo "X$darwin_archive" | $Xsed -e 's%^.*/%%'` + darwin_arches=`lipo -info "$darwin_archive" 2>/dev/null | $EGREP Architectures 2>/dev/null` + if test -n "$darwin_arches"; then + darwin_arches=`echo "$darwin_arches" | $SED -e 's/.*are://'` + darwin_arch= + $show "$darwin_base_archive has multiple architectures $darwin_arches" + for darwin_arch in $darwin_arches ; do + 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 have a bunch of thin objects, gotta fatten them up :) + darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print| xargs basename | sort -u | $NL2SP` + darwin_file= + darwin_files= + for darwin_file in $darwin_filelist; do + darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP` + lipo -create -output "$darwin_file" $darwin_files + done # $darwin_filelist + ${rm}r unfat-$$ + cd "$darwin_orig_dir" + else + cd "$darwin_orig_dir" + func_extract_an_archive "$my_xdir" "$my_xabs" + fi # $darwin_arches + fi # $run + ;; + *) + func_extract_an_archive "$my_xdir" "$my_xabs" + ;; + esac + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` + done + func_extract_archives_result="$my_oldobjs" +} +# End of Shell function definitions +##################################### + +# Darwin sucks +eval std_shrext=\"$shrext_cmds\" + +disable_libs=no + +# Parse our command line options once, thoroughly. +while test "$#" -gt 0 +do + arg="$1" + shift + + case $arg in + -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;; + *) optarg= ;; + esac + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + execute_dlfiles) + execute_dlfiles="$execute_dlfiles $arg" + ;; + tag) + tagname="$arg" + preserve_args="${preserve_args}=$arg" + + # Check whether tagname contains only valid characters + case $tagname in + *[!-_A-Za-z0-9,/]*) + $echo "$progname: invalid tag name: $tagname" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + case $tagname in + CC) + # Don't test for the "default" C tag, as we know, it's there, but + # not specially marked. + ;; + *) + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "$progpath" > /dev/null; then + taglist="$taglist $tagname" + # Evaluate the configuration. + eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$tagname'$/,/^# ### END LIBTOOL TAG CONFIG: '$tagname'$/p' < $progpath`" + else + $echo "$progname: ignoring unknown tag $tagname" 1>&2 + fi + ;; + esac + ;; + *) + eval "$prev=\$arg" + ;; + esac + + prev= + prevopt= + continue + fi + + # Have we seen a non-optional argument yet? + case $arg in + --help) + show_help=yes + ;; + + --version) + echo "\ +$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP + +Copyright (C) 2008 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." + exit $? + ;; + + --config) + ${SED} -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $progpath + # Now print the configurations for the tags. + for tagname in $taglist; do + ${SED} -n -e "/^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$/,/^# ### END LIBTOOL TAG CONFIG: $tagname$/p" < "$progpath" + done + exit $? + ;; + + --debug) + $echo "$progname: enabling shell trace mode" + set -x + preserve_args="$preserve_args $arg" + ;; + + --dry-run | -n) + run=: + ;; + + --features) + $echo "host: $host" + if test "$build_libtool_libs" = yes; then + $echo "enable shared libraries" + else + $echo "disable shared libraries" + fi + if test "$build_old_libs" = yes; then + $echo "enable static libraries" + else + $echo "disable static libraries" + fi + exit $? + ;; + + --finish) mode="finish" ;; + + --mode) prevopt="--mode" prev=mode ;; + --mode=*) mode="$optarg" ;; + + --preserve-dup-deps) duplicate_deps="yes" ;; + + --quiet | --silent) + show=: + preserve_args="$preserve_args $arg" + ;; + + --tag) + prevopt="--tag" + prev=tag + preserve_args="$preserve_args --tag" + ;; + --tag=*) + set tag "$optarg" ${1+"$@"} + shift + prev=tag + preserve_args="$preserve_args --tag" + ;; + + -dlopen) + prevopt="-dlopen" + prev=execute_dlfiles + ;; + + -*) + $echo "$modename: unrecognized option \`$arg'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + + *) + nonopt="$arg" + break + ;; + esac +done + +if test -n "$prevopt"; then + $echo "$modename: option \`$prevopt' requires an argument" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE +fi + +case $disable_libs in +no) + ;; +shared) + build_libtool_libs=no + build_old_libs=yes + ;; +static) + build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` + ;; +esac + +# 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= + +if test -z "$show_help"; then + + # Infer the operation mode. + if test -z "$mode"; then + $echo "*** Warning: inferring the mode of operation is deprecated." 1>&2 + $echo "*** Future versions of Libtool will require --mode=MODE be specified." 1>&2 + case $nonopt in + *cc | cc* | *++ | gcc* | *-gcc* | g++* | xlc*) + mode=link + for arg + do + case $arg in + -c) + mode=compile + break + ;; + esac + done + ;; + *db | *dbx | *strace | *truss) + mode=execute + ;; + *install*|cp|mv) + mode=install + ;; + *rm) + mode=uninstall + ;; + *) + # If we have no mode, but dlfiles were specified, then do execute mode. + test -n "$execute_dlfiles" && mode=execute + + # Just use the default operation mode. + if test -z "$mode"; then + if test -n "$nonopt"; then + $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2 + else + $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2 + fi + fi + ;; + esac + fi + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$execute_dlfiles" && test "$mode" != execute; then + $echo "$modename: unrecognized option \`-dlopen'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Change the help message to a mode-specific one. + generic_help="$help" + help="Try \`$modename --help --mode=$mode' for more information." + + # These modes are in order of execution frequency so that they run quickly. + case $mode in + # libtool compile mode + compile) + modename="$modename: compile" + # Get the compilation command and the source file. + base_compile= + srcfile="$nonopt" # always keep a non-empty value in "srcfile" + suppress_opt=yes + suppress_output= + arg_mode=normal + libobj= + later= + + 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) + if test -n "$libobj" ; then + $echo "$modename: you cannot specify \`-o' more than once" 1>&2 + exit $EXIT_FAILURE + fi + arg_mode=target + continue + ;; + + -static | -prefer-pic | -prefer-non-pic) + later="$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,*) + args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"` + lastarg= + save_ifs="$IFS"; IFS=',' + for arg in $args; do + IFS="$save_ifs" + + # Double-quote args containing other shell metacharacters. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + lastarg="$lastarg $arg" + done + IFS="$save_ifs" + lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"` + + # Add the arguments to base_compile. + base_compile="$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. + lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"` + + case $lastarg in + # Double-quote args containing other shell metacharacters. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, and some SunOS ksh mistreat backslash-escaping + # in scan sets (worked around with variable expansion), + # and furthermore cannot handle '|' '&' '(' ')' in scan sets + # at all, so we specify them separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + lastarg="\"$lastarg\"" + ;; + esac + + base_compile="$base_compile $lastarg" + done # for arg + + case $arg_mode in + arg) + $echo "$modename: you must specify an argument for -Xcompile" + exit $EXIT_FAILURE + ;; + target) + $echo "$modename: you must specify a target with \`-o'" 1>&2 + exit $EXIT_FAILURE + ;; + *) + # Get the name of the library object. + [ -z "$libobj" ] && libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'` + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + xform='[cCFSifmso]' + case $libobj in + *.ada) xform=ada ;; + *.adb) xform=adb ;; + *.ads) xform=ads ;; + *.asm) xform=asm ;; + *.c++) xform=c++ ;; + *.cc) xform=cc ;; + *.ii) xform=ii ;; + *.class) xform=class ;; + *.cpp) xform=cpp ;; + *.cxx) xform=cxx ;; + *.[fF][09]?) xform=[fF][09]. ;; + *.for) xform=for ;; + *.java) xform=java ;; + *.obj) xform=obj ;; + *.sx) xform=sx ;; + esac + + libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"` + + case $libobj in + *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;; + *) + $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + func_infer_tag $base_compile + + for arg in $later; do + case $arg in + -static) + build_old_libs=yes + continue + ;; + + -prefer-pic) + pic_mode=yes + continue + ;; + + -prefer-non-pic) + pic_mode=no + continue + ;; + esac + done + + qlibobj=`$echo "X$libobj" | $Xsed -e "$sed_quote_subst"` + case $qlibobj in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + qlibobj="\"$qlibobj\"" ;; + esac + test "X$libobj" != "X$qlibobj" \ + && $echo "X$libobj" | grep '[]~#^*{};<>?"'"'"' &()|`$[]' \ + && $echo "$modename: libobj name \`$libobj' may not contain shell special characters." + objname=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` + xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$obj"; then + xdir= + else + xdir=$xdir/ + fi + lobj=${xdir}$objdir/$objname + + if test -z "$base_compile"; then + $echo "$modename: you must specify a compilation command" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Delete any leftover library objects. + if test "$build_old_libs" = yes; then + removelist="$obj $lobj $libobj ${libobj}T" + else + removelist="$lobj $libobj ${libobj}T" + fi + + $run $rm $removelist + trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | pw32* | os2*) + pic_mode=default + ;; + esac + if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; 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 "$compiler_c_o" = no; then + output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext} + lockfile="$output_obj.lock" + removelist="$removelist $output_obj $lockfile" + trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 + 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 "$need_locks" = yes; then + until $run ln "$progpath" "$lockfile" 2>/dev/null; do + $show "Waiting for $lockfile to be removed" + sleep 2 + done + elif test "$need_locks" = warn; then + if test -f "$lockfile"; then + $echo "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit $EXIT_FAILURE + fi + $echo "$srcfile" > "$lockfile" + fi + + if test -n "$fix_srcfile_path"; then + eval srcfile=\"$fix_srcfile_path\" + fi + qsrcfile=`$echo "X$srcfile" | $Xsed -e "$sed_quote_subst"` + case $qsrcfile in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + qsrcfile="\"$qsrcfile\"" ;; + esac + + $run $rm "$libobj" "${libobj}T" + + # Create a libtool object file (analogous to a ".la" file), + # but don't create it if we're doing a dry run. + test -z "$run" && cat > ${libobj}T </dev/null`" != "X$srcfile"; then + $echo "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit $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 + $show "$mv $output_obj $lobj" + if $run $mv $output_obj $lobj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + fi + + # Append the name of the PIC object to the libtool object file. + test -z "$run" && cat >> ${libobj}T <> ${libobj}T </dev/null`" != "X$srcfile"; then + $echo "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then + $show "$mv $output_obj $obj" + if $run $mv $output_obj $obj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + fi + + # Append the name of the non-PIC object the libtool object file. + # Only append if the libtool object file exists. + test -z "$run" && cat >> ${libobj}T <> ${libobj}T <&2 + 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 + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + qarg=\"`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`\" ### testsuite: skip nested quoting test + ;; + *) qarg=$arg ;; + esac + libtool_args="$libtool_args $qarg" + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + output) + compile_command="$compile_command @OUTPUT@" + finalize_command="$finalize_command @OUTPUT@" + ;; + esac + + case $prev in + dlfiles|dlprefiles) + if test "$preload" = no; then + # Add the symbol object into the linking commands. + compile_command="$compile_command @SYMFILE@" + finalize_command="$finalize_command @SYMFILE@" + preload=yes + fi + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test "$dlself" = no; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test "$prev" = dlprefiles; then + dlself=yes + elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test "$prev" = dlfiles; then + dlfiles="$dlfiles $arg" + else + dlprefiles="$dlprefiles $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols="$arg" + if test ! -f "$arg"; then + $echo "$modename: symbol file \`$arg' does not exist" + exit $EXIT_FAILURE + fi + prev= + continue + ;; + expsyms_regex) + export_symbols_regex="$arg" + prev= + continue + ;; + inst_prefix) + inst_prefix_dir="$arg" + prev= + continue + ;; + precious_regex) + precious_files_regex="$arg" + prev= + continue + ;; + release) + release="-$arg" + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat $save_arg` + do +# moreargs="$moreargs $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + pic_object= + non_pic_object= + + # Read the .lo file + # If there is no directory component, then add one. + case $arg in + */* | *\\*) . $arg ;; + *) . ./$arg ;; + esac + + if test -z "$pic_object" || \ + test -z "$non_pic_object" || + test "$pic_object" = none && \ + test "$non_pic_object" = none; then + $echo "$modename: cannot find name of object for \`$arg'" 1>&2 + exit $EXIT_FAILURE + fi + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles="$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 "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles $pic_object" + prev= + fi + + # A PIC object. + libobjs="$libobjs $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + non_pic_objects="$non_pic_objects $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; 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" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if test -z "$run"; then + $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 + exit $EXIT_FAILURE + else + # Dry-run case. + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` + non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` + libobjs="$libobjs $pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + fi + done + else + $echo "$modename: link input file \`$save_arg' does not exist" + exit $EXIT_FAILURE + fi + arg=$save_arg + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + $echo "$modename: only absolute run-paths are allowed" 1>&2 + exit $EXIT_FAILURE + ;; + esac + if test "$prev" = rpath; then + case "$rpath " in + *" $arg "*) ;; + *) rpath="$rpath $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) xrpath="$xrpath $arg" ;; + esac + fi + prev= + continue + ;; + xcompiler) + compiler_flags="$compiler_flags $qarg" + prev= + compile_command="$compile_command $qarg" + finalize_command="$finalize_command $qarg" + continue + ;; + xlinker) + linker_flags="$linker_flags $qarg" + compiler_flags="$compiler_flags $wl$qarg" + prev= + compile_command="$compile_command $wl$qarg" + finalize_command="$finalize_command $wl$qarg" + continue + ;; + xcclinker) + linker_flags="$linker_flags $qarg" + compiler_flags="$compiler_flags $qarg" + prev= + compile_command="$compile_command $qarg" + finalize_command="$finalize_command $qarg" + continue + ;; + shrext) + shrext_cmds="$arg" + prev= + continue + ;; + darwin_framework|darwin_framework_skip) + test "$prev" = "darwin_framework" && compiler_flags="$compiler_flags $arg" + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + prev= + 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 + compile_command="$compile_command $link_static_flag" + finalize_command="$finalize_command $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + $echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2 + continue + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + $echo "$modename: more than one -exported-symbols argument is not allowed" + exit $EXIT_FAILURE + fi + if test "X$arg" = "X-export-symbols"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -framework|-arch|-isysroot) + case " $CC " in + *" ${arg} ${1} "* | *" ${arg} ${1} "*) + prev=darwin_framework_skip ;; + *) compiler_flags="$compiler_flags $arg" + prev=darwin_framework ;; + esac + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + 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*) + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + ;; + esac + continue + ;; + + -L*) + dir=`$echo "X$arg" | $Xsed -e 's/^-L//'` + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2 + absdir="$dir" + notinst_path="$notinst_path $dir" + fi + dir="$absdir" + ;; + esac + case "$deplibs " in + *" -L$dir "*) ;; + *) + deplibs="$deplibs -L$dir" + lib_search_path="$lib_search_path $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) + testbindir=`$echo "X$dir" | $Xsed -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + *) dllsearchpath="$dllsearchpath:$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + *) dllsearchpath="$dllsearchpath:$testbindir";; + esac + ;; + esac + continue + ;; + + -l*) + if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos*) + # 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$arg" = "X-lc" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + test "X$arg" = "X-lc" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + deplibs="$deplibs -framework System" + continue + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + test "X$arg" = "X-lc" && continue + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + test "X$arg" = "X-lc" && continue + ;; + esac + elif test "X$arg" = "X-lc_r"; then + case $host in + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + deplibs="$deplibs $arg" + continue + ;; + + # Tru64 UNIX uses -model [arg] to determine the layout of C++ + # classes, name mangling, and exception handling. + -model) + compile_command="$compile_command $arg" + compiler_flags="$compiler_flags $arg" + finalize_command="$finalize_command $arg" + prev=xcompiler + continue + ;; + + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) + compiler_flags="$compiler_flags $arg" + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + continue + ;; + + -multi_module) + single_module="${wl}-multi_module" + continue + ;; + + -module) + module=yes + continue + ;; + + # -64, -mips[0-9] enable 64-bit mode on the SGI compiler + # -r[0-9][0-9]* specifies the processor on the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler + # +DA*, +DD* enable 64-bit mode on the HP compiler + # -q* pass through compiler args for the IBM compiler + # -m* pass through architecture-specific compiler args for GCC + # -m*, -t[45]*, -txscale* pass through architecture-specific + # compiler args for GCC + # -p, -pg, --coverage, -fprofile-* pass through profiling flag for GCC + # -F/path gives path to uninstalled frameworks, gcc on darwin + # @file GCC response files + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*) + + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + compiler_flags="$compiler_flags $arg" + continue + ;; + + -shrext) + prev=shrext + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin*) + # The PATH hackery in wrapper scripts is required on Windows + # and Darwin in order for the loader to find any dlls it needs. + $echo "$modename: warning: \`-no-install' is ignored for $host" 1>&2 + $echo "$modename: warning: assuming \`-no-fast-install' instead" 1>&2 + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -objectlist) + prev=objectlist + continue + ;; + + -o) prev=output ;; + + -precious-files-regex) + prev=precious_regex + continue + ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + dir=`$echo "X$arg" | $Xsed -e 's/^-R//'` + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + $echo "$modename: only absolute run-paths are allowed" 1>&2 + exit $EXIT_FAILURE + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$xrpath $dir" ;; + esac + 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 + ;; + + -Wc,*) + args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'` + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + case $flag in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + flag="\"$flag\"" + ;; + esac + arg="$arg $wl$flag" + compiler_flags="$compiler_flags $flag" + done + IFS="$save_ifs" + arg=`$echo "X$arg" | $Xsed -e "s/^ //"` + ;; + + -Wl,*) + args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'` + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + case $flag in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + flag="\"$flag\"" + ;; + esac + arg="$arg $wl$flag" + compiler_flags="$compiler_flags $wl$flag" + linker_flags="$linker_flags $flag" + done + IFS="$save_ifs" + arg=`$echo "X$arg" | $Xsed -e "s/^ //"` + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + continue + ;; + + # Some other compiler flag. + -* | +*) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + ;; + + *.$objext) + # A standard object. + objs="$objs $arg" + ;; + + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + pic_object= + non_pic_object= + + # Read the .lo file + # If there is no directory component, then add one. + case $arg in + */* | *\\*) . $arg ;; + *) . ./$arg ;; + esac + + if test -z "$pic_object" || \ + test -z "$non_pic_object" || + test "$pic_object" = none && \ + test "$non_pic_object" = none; then + $echo "$modename: cannot find name of object for \`$arg'" 1>&2 + exit $EXIT_FAILURE + fi + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles="$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 "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles $pic_object" + prev= + fi + + # A PIC object. + libobjs="$libobjs $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + non_pic_objects="$non_pic_objects $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; 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" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if test -z "$run"; then + $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 + exit $EXIT_FAILURE + else + # Dry-run case. + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` + non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` + libobjs="$libobjs $pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + fi + ;; + + *.$libext) + # An archive. + deplibs="$deplibs $arg" + old_deplibs="$old_deplibs $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + if test "$prev" = dlfiles; then + # This library was specified with -dlopen. + dlfiles="$dlfiles $arg" + prev= + elif test "$prev" = dlprefiles; then + # The library was specified with -dlpreopen. + dlprefiles="$dlprefiles $arg" + prev= + else + deplibs="$deplibs $arg" + 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. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + ;; + esac # arg + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + fi + done # argument parsing loop + + if test -n "$prev"; then + $echo "$modename: the \`$prevarg' option requires an argument" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'` + libobjs_save="$libobjs" + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$echo \"X\${$shlibpath_var}\" \| \$Xsed -e \'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\" + + output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'` + if test "X$output_objdir" = "X$output"; then + output_objdir="$objdir" + else + output_objdir="$output_objdir/$objdir" + fi + # Create the object directory. + if test ! -d "$output_objdir"; then + $show "$mkdir $output_objdir" + $run $mkdir $output_objdir + exit_status=$? + if test "$exit_status" -ne 0 && test ! -d "$output_objdir"; then + exit $exit_status + fi + fi + + # Determine the type of output + case $output in + "") + $echo "$modename: you must specify an output file" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + esac + + case $host in + *cygwin* | *mingw* | *pw32*) + # don't eliminate duplications in $postdeps and $predeps + duplicate_compiler_generated_deps=yes + ;; + *) + duplicate_compiler_generated_deps=$duplicate_deps + ;; + 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 test "X$duplicate_deps" = "Xyes" ; then + case "$libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + libs="$libs $deplib" + done + + if test "$linkmode" = lib; 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 test "X$duplicate_compiler_generated_deps" = "Xyes" ; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;; + esac + pre_post_deps="$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 + case $linkmode in + lib) + passes="conv link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + $echo "$modename: libraries can \`-dlopen' only libtool libraries: $file" 1>&2 + exit $EXIT_FAILURE + ;; + esac + done + ;; + prog) + compile_deplibs= + finalize_deplibs= + alldeplibs=no + newdlfiles= + newdlprefiles= + passes="conv scan dlopen dlpreopen link" + ;; + *) passes="conv" + ;; + esac + for pass in $passes; do + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan"; then + libs="$deplibs" + deplibs= + fi + if test "$linkmode" = prog; then + case $pass in + dlopen) libs="$dlfiles" ;; + dlpreopen) libs="$dlprefiles" ;; + link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; + esac + fi + if test "$pass" = dlopen; then + # Collect dlpreopened libraries + save_deplibs="$deplibs" + deplibs= + fi + for deplib in $libs; do + lib= + found=no + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + compiler_flags="$compiler_flags $deplib" + fi + continue + ;; + -l*) + if test "$linkmode" != lib && test "$linkmode" != prog; then + $echo "$modename: warning: \`-l' is ignored for archives/objects" 1>&2 + continue + fi + name=`$echo "X$deplib" | $Xsed -e 's/^-l//'` + if test "$linkmode" = lib; 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 "$search_ext" = ".la"; then + found=yes + else + found=no + fi + break 2 + fi + done + done + if test "$found" != yes; then + # deplib doesn't seem to be a libtool library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + else # 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 "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $deplib "*) + if (${SED} -e '2q' $lib | + grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + library_names= + old_library= + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + for l in $old_library $library_names; do + ll="$l" + done + if test "X$ll" = "X$old_library" ; then # only static version available + found=no + ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` + test "X$ladir" = "X$lib" && ladir="." + lib=$ladir/$old_library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + fi + ;; # -l + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test "$pass" = conv && continue + newdependency_libs="$deplib $newdependency_libs" + newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` + ;; + prog) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + if test "$pass" = scan; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` + ;; + *) + $echo "$modename: warning: \`-L' is ignored for archives/objects" 1>&2 + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test "$pass" = link; then + dir=`$echo "X$deplib" | $Xsed -e 's/^-R//'` + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$xrpath $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) lib="$deplib" ;; + *.$libext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + valid_a_lib=no + case $deplibs_check_method in + match_pattern*) + set dummy $deplibs_check_method + match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` + if eval $echo \"$deplib\" 2>/dev/null \ + | $SED 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + valid_a_lib=yes + fi + ;; + pass_all) + valid_a_lib=yes + ;; + esac + if test "$valid_a_lib" != yes; then + $echo + $echo "*** Warning: Trying to link with static lib archive $deplib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because the file extensions .$libext of this argument makes me believe" + $echo "*** that it is just a static archive that I should not used here." + else + $echo + $echo "*** Warning: Linking the shared library $output against the" + $echo "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + fi + continue + ;; + prog) + if test "$pass" != link; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + elif test "$linkmode" = prog; then + if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + newdlprefiles="$newdlprefiles $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + newdlfiles="$newdlfiles $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=yes + continue + ;; + esac # case $deplib + if test "$found" = yes || test -f "$lib"; then : + else + $echo "$modename: cannot find the library \`$lib' or unhandled argument \`$deplib'" 1>&2 + exit $EXIT_FAILURE + fi + + # Check to see that this really is a libtool archive. + if (${SED} -e '2q' $lib | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + + ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` + test "X$ladir" = "X$lib" && ladir="." + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= + # 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 + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan" || + { test "$linkmode" != prog && test "$linkmode" != lib; }; then + test -n "$dlopen" && dlfiles="$dlfiles $dlopen" + test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen" + fi + + if test "$pass" = conv; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + # It is a libtool convenience library, so add in its objects. + convenience="$convenience $ladir/$objdir/$old_library" + old_convenience="$old_convenience $ladir/$objdir/$old_library" + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if test "X$duplicate_deps" = "Xyes" ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done + elif test "$linkmode" != prog && test "$linkmode" != lib; then + $echo "$modename: \`$lib' is not a convenience library" 1>&2 + exit $EXIT_FAILURE + fi + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + for l in $old_library $library_names; do + linklib="$l" + done + if test -z "$linklib"; then + $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + + # This library was specified with -dlopen. + if test "$pass" = dlopen; then + if test -z "$libdir"; then + $echo "$modename: cannot -dlopen a convenience library: \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + if test -z "$dlname" || + test "$dlopen_support" != yes || + test "$build_libtool_libs" = no; 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. + dlprefiles="$dlprefiles $lib $dependency_libs" + else + newdlfiles="$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 + $echo "$modename: warning: cannot determine absolute directory name of \`$ladir'" 1>&2 + $echo "$modename: passing it literally to the linker, although it might fail" 1>&2 + abs_ladir="$ladir" + fi + ;; + esac + laname=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` + + # Find the relevant object directory and library name. + if test "X$installed" = Xyes; then + if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + $echo "$modename: warning: library \`$lib' was moved." 1>&2 + dir="$ladir" + absdir="$abs_ladir" + libdir="$abs_ladir" + else + dir="$libdir" + absdir="$libdir" + fi + test "X$hardcode_automatic" = Xyes && 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 + notinst_path="$notinst_path $abs_ladir" + else + dir="$ladir/$objdir" + absdir="$abs_ladir/$objdir" + # Remove this search path later + notinst_path="$notinst_path $abs_ladir" + fi + fi # $installed = yes + name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` + + # This library was specified with -dlpreopen. + if test "$pass" = dlpreopen; then + if test -z "$libdir"; then + $echo "$modename: cannot -dlpreopen a convenience library: \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + newdlprefiles="$newdlprefiles $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + newdlprefiles="$newdlprefiles $dir/$dlname" + else + newdlprefiles="$newdlprefiles $dir/$linklib" + fi + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test "$linkmode" = lib; then + deplibs="$dir/$old_library $deplibs" + elif test "$linkmode,$pass" = "prog,link"; 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 "$linkmode" = prog && test "$pass" != link; then + newlib_search_path="$newlib_search_path $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=no + if test "$link_all_deplibs" != no || test -z "$library_names" || + test "$build_libtool_libs" = no; then + linkalldeplibs=yes + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test + esac + # Need to link against all dependency_libs? + if test "$linkalldeplibs" = yes; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi + if test "X$duplicate_deps" = "Xyes" ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test "$linkmode,$pass" = "prog,link"; then + if test -n "$library_names" && + { { test "$prefer_static_libs" = no || + test "$prefer_static_libs,$installed" = "built,yes"; } || + 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 + *" $dir "*) ;; + *" $absdir "*) ;; + *) temp_rpath="$temp_rpath $absdir" ;; + 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 "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if test "$alldeplibs" = yes && + { test "$deplibs_check_method" = pass_all || + { test "$build_libtool_libs" = yes && + 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 "$use_static_libs" = built && test "$installed" = yes ; then + use_static_libs=no + fi + if test -n "$library_names" && + { test "$use_static_libs" = no || test -z "$old_library"; }; then + if test "$installed" = no; then + notinst_deplibs="$notinst_deplibs $lib" + need_relink=yes + fi + # This is a shared library + + # Warn about portability, can't link against -module's on + # some systems (darwin) + if test "$shouldnotlink" = yes && test "$pass" = link ; then + $echo + if test "$linkmode" = prog; then + $echo "*** Warning: Linking the executable $output against the loadable module" + else + $echo "*** Warning: Linking the shared library $output against the loadable module" + fi + $echo "*** $linklib is not portable!" + fi + if test "$linkmode" = lib && + test "$hardcode_into_libs" = yes; 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 "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + realname="$2" + shift; 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 in + *cygwin* | mingw*) + major=`expr $current - $age` + versuffix="-$major" + ;; + esac + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot="$soname" + soname=`$echo $soroot | ${SED} -e 's/^.*\///'` + newlib="libimp-`$echo $soname | ${SED} 's/^lib//;s/\.dll$//'`.a" + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + $show "extracting exported symbol list from \`$soname'" + save_ifs="$IFS"; IFS='~' + cmds=$extract_expsyms_cmds + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + $show "generating import library for \`$soname'" + save_ifs="$IFS"; IFS='~' + cmds=$old_archive_from_expsyms_cmds + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + 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 "$linkmode" = prog || test "$mode" != relink; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test "$hardcode_direct" = no; 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 module then we can not link against + # it, someone is ignoring the new warnings I added + if /usr/bin/file -L $add 2> /dev/null | + $EGREP ": [^:]* bundle" >/dev/null ; then + $echo "** Warning, lib $linklib is a module, not a shared library" + if test -z "$old_library" ; then + $echo + $echo "** And there doesn't seem to be a static archive available" + $echo "** The link will probably fail, sorry" + else + add="$dir/$old_library" + fi + fi + esac + elif test "$hardcode_minus_L" = no; then + case $host in + *-*-sunos*) add_shlibpath="$dir" ;; + esac + add_dir="-L$dir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = no; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + relink) + if test "$hardcode_direct" = yes; then + add="$dir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$dir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + add_dir="$add_dir -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test "$lib_linked" != yes; then + $echo "$modename: configuration error: unsupported hardcode properties" + exit $EXIT_FAILURE + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;; + esac + fi + if test "$linkmode" = prog; 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 "$hardcode_direct" != yes && \ + test "$hardcode_minus_L" != yes && \ + test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; + esac + fi + fi + fi + + if test "$linkmode" = prog || test "$mode" = relink; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test "$hardcode_direct" = yes; then + add="$libdir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$libdir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; + esac + add="-l$name" + elif test "$hardcode_automatic" = yes; 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$libdir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + add_dir="$add_dir -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + fi + + if test "$linkmode" = prog; 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 "$linkmode" = prog; 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 "$hardcode_direct" != unsupported; 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 "$build_libtool_libs" = yes; then + # Not a shared library + if test "$deplibs_check_method" != pass_all; 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. + $echo + $echo "*** Warning: This system can not link to static lib archive $lib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have." + if test "$module" = yes; then + $echo "*** But as you try to build a module library, libtool will still create " + $echo "*** a static module, that should work as long as the dlopening application" + $echo "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then + $echo + $echo "*** However, this would only work if libtool was able to extract symbol" + $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + $echo "*** not find such a program. So, this module is probably useless." + $echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + 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 "$linkmode" = lib; then + if test -n "$dependency_libs" && + { test "$hardcode_into_libs" != yes || + test "$build_old_libs" = yes || + test "$link_static" = yes; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) temp_xrpath=`$echo "X$libdir" | $Xsed -e 's/^-R//'` + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) xrpath="$xrpath $temp_xrpath";; + esac;; + *) temp_deplibs="$temp_deplibs $libdir";; + esac + done + dependency_libs="$temp_deplibs" + fi + + newlib_search_path="$newlib_search_path $absdir" + # Link against this library + test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + if test "X$duplicate_deps" = "Xyes" ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done + + if test "$link_all_deplibs" != no; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + case $deplib in + -L*) path="$deplib" ;; + *.la) + dir=`$echo "X$deplib" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$deplib" && dir="." + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2 + absdir="$dir" + fi + ;; + esac + if grep "^installed=no" $deplib > /dev/null; then + path="$absdir/$objdir" + else + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + if test -z "$libdir"; then + $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + if test "$absdir" != "$libdir"; then + $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2 + fi + path="$absdir" + fi + depdepl= + case $host in + *-*-darwin*) + # we do not want to link against static libs, + # but need to link against shared + eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + eval deplibdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names" ; then + for tmp in $deplibrary_names ; do + depdepl=$tmp + done + if test -f "$deplibdir/$depdepl" ; then + depdepl="$deplibdir/$depdepl" + elif test -f "$path/$depdepl" ; then + depdepl="$path/$depdepl" + else + # Can't find it, oh well... + depdepl= + fi + # do not add paths which are already there + case " $newlib_search_path " in + *" $path "*) ;; + *) newlib_search_path="$newlib_search_path $path";; + esac + fi + path="" + ;; + *) + path="-L$path" + ;; + esac + ;; + -l*) + case $host in + *-*-darwin*) + # Again, we only want to link against shared libraries + eval tmp_libs=`$echo "X$deplib" | $Xsed -e "s,^\-l,,"` + for tmp in $newlib_search_path ; do + if test -f "$tmp/lib$tmp_libs.dylib" ; then + eval depdepl="$tmp/lib$tmp_libs.dylib" + break + fi + done + path="" + ;; + *) continue ;; + esac + ;; + *) continue ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$path $deplibs" ;; + esac + case " $deplibs " in + *" $depdepl "*) ;; + *) deplibs="$depdepl $deplibs" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + dependency_libs="$newdependency_libs" + if test "$pass" = dlpreopen; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test "$pass" != dlopen; then + if test "$pass" != conv; then + # 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 "*) ;; + *) lib_search_path="$lib_search_path $dir" ;; + esac + done + newlib_search_path= + fi + + if test "$linkmode,$pass" != "prog,link"; then + vars="deplibs" + else + vars="compile_deplibs finalize_deplibs" + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # 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. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) tmp_libs="$tmp_libs $deplib" ;; + esac + ;; + *) tmp_libs="$tmp_libs $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + # 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 + tmp_libs="$tmp_libs $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test "$linkmode" = prog; then + dlfiles="$newdlfiles" + dlprefiles="$newdlprefiles" + fi + + case $linkmode in + oldlib) + case " $deplibs" in + *\ -l* | *\ -L*) + $echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2 ;; + esac + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2 + fi + + if test -n "$rpath"; then + $echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2 + fi + + if test -n "$xrpath"; then + $echo "$modename: warning: \`-R' is ignored for archives" 1>&2 + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info/-version-number' is ignored for archives" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for archives" 1>&2 + fi + + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + $echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2 + fi + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs="$output" + objs="$objs$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form `libNAME.la'. + case $outputname in + lib*) + name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + ;; + *) + if test "$module" = no; then + $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + if test "$need_lib_prefix" != no; then + # Add the "lib" prefix for modules if required + name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + else + libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` + fi + ;; + esac + + if test -n "$objs"; then + if test "$deplibs_check_method" != pass_all; then + $echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1 + exit $EXIT_FAILURE + else + $echo + $echo "*** Warning: Linking the shared library $output against the non-libtool" + $echo "*** objects $objs is not portable!" + libobjs="$libobjs $objs" + fi + fi + + if test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen self' is ignored for libtool libraries" 1>&2 + fi + + set dummy $rpath + if test "$#" -gt 2; then + $echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2 + fi + install_libdir="$2" + + oldlibs= + if test -z "$rpath"; then + if test "$build_libtool_libs" = yes; then + # Building a libtool convenience library. + # 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 + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info/-version-number' is ignored for convenience libraries" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2 + fi + else + + # Parse the version information argument. + save_ifs="$IFS"; IFS=':' + set dummy $vinfo 0 0 0 + IFS="$save_ifs" + + if test -n "$8"; then + $echo "$modename: too many parameters to \`-version-info'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # 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="$2" + number_minor="$3" + number_revision="$4" + # + # 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 + # which has an extra 1 added just for fun + # + case $version_type in + darwin|linux|osf|windows|none) + current=`expr $number_major + $number_minor` + age="$number_minor" + revision="$number_revision" + ;; + freebsd-aout|freebsd-elf|sunos) + current="$number_major" + revision="$number_minor" + age="0" + ;; + irix|nonstopux) + current=`expr $number_major + $number_minor` + age="$number_minor" + revision="$number_minor" + lt_irix_increment=no + ;; + esac + ;; + no) + current="$2" + revision="$3" + age="$4" + ;; + 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]) ;; + *) + $echo "$modename: CURRENT \`$current' must be a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + ;; + 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]) ;; + *) + $echo "$modename: REVISION \`$revision' must be a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + ;; + 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]) ;; + *) + $echo "$modename: AGE \`$age' must be a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + if test "$age" -gt "$current"; then + $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + 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 + major=.`expr $current - $age` + versuffix="$major.$age.$revision" + # Darwin ld doesn't like 0 for these options... + minor_current=`expr $current + 1` + xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + + freebsd-aout) + major=".$current" + versuffix=".$current.$revision"; + ;; + + freebsd-elf) + major=".$current" + versuffix=".$current"; + ;; + + irix | nonstopux) + if test "X$lt_irix_increment" = "Xno"; then + major=`expr $current - $age` + else + major=`expr $current - $age + 1` + fi + 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 "$loop" -ne 0; do + iface=`expr $revision - $loop` + loop=`expr $loop - 1` + verstring="$verstring_prefix$major.$iface:$verstring" + done + + # Before this point, $major must not contain `.'. + major=.$major + versuffix="$major.$revision" + ;; + + linux) + major=.`expr $current - $age` + versuffix="$major.$age.$revision" + ;; + + osf) + major=.`expr $current - $age` + versuffix=".$current.$age.$revision" + verstring="$current.$age.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$age + while test "$loop" -ne 0; do + iface=`expr $current - $loop` + loop=`expr $loop - 1` + verstring="$verstring:${iface}.0" + done + + # Make executables depend on our current version. + verstring="$verstring:${current}.0" + ;; + + sunos) + major=".$current" + versuffix=".$current.$revision" + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 filesystems. + major=`expr $current - $age` + versuffix="-$major" + ;; + + *) + $echo "$modename: unknown library version type \`$version_type'" 1>&2 + $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit $EXIT_FAILURE + ;; + 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 "$need_version" = no; then + versuffix= + else + versuffix=".0.0" + fi + fi + + # Remove version info from name if versioning should be avoided + if test "$avoid_version" = yes && test "$need_version" = no; then + major= + versuffix= + verstring="" + fi + + # Check to see if the archive will have undefined symbols. + if test "$allow_undefined" = yes; then + if test "$allow_undefined_flag" = unsupported; then + $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2 + build_libtool_libs=no + build_old_libs=yes + fi + else + # Don't allow undefined symbols. + allow_undefined_flag="$no_undefined_flag" + fi + fi + + if test "$mode" != relink; 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) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) + if test "X$precious_files_regex" != "X"; then + if echo $p | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + removelist="$removelist $p" + ;; + *) ;; + esac + done + if test -n "$removelist"; then + $show "${rm}r $removelist" + $run ${rm}r $removelist + fi + fi + + # Now set the variables for building old libraries. + if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then + oldlibs="$oldlibs $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + #for path in $notinst_path; do + # lib_search_path=`$echo "$lib_search_path " | ${SED} -e "s% $path % %g"` + # deplibs=`$echo "$deplibs " | ${SED} -e "s% -L$path % %g"` + # dependency_libs=`$echo "$dependency_libs " | ${SED} -e "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 + temp_xrpath="$temp_xrpath -R$libdir" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; 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 "*) ;; + *) dlfiles="$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 "*) ;; + *) dlprefiles="$dlprefiles $lib" ;; + esac + done + + if test "$build_libtool_libs" = yes; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + deplibs="$deplibs -framework System" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # 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 "$build_libtool_need_lc" = "yes"; then + deplibs="$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 + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $rm conftest.c + cat > conftest.c </dev/null` + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null \ + | grep " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib="$potent_lib" + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; + *) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \ + | ${SED} 10q \ + | $EGREP "$file_magic_regex" > /dev/null; then + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + $echo + $echo "*** Warning: linker path does not have real file for library $a_deplib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $echo "*** with $libname but no candidates were found. (...for file magic test)" + else + $echo "*** with $libname and none of the candidates passed a file format test" + $echo "*** using a file magic. Last file checked: $potlib" + fi + fi + else + # Add a -L argument. + newdeplibs="$newdeplibs $a_deplib" + fi + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method + match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` + for a_deplib in $deplibs; do + name=`expr $a_deplib : '-l\(.*\)'` + # If $name is empty we are operating on a -L argument. + if test -n "$name" && test "$name" != "0"; then + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $a_deplib "*) + newdeplibs="$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 + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + $echo + $echo "*** Warning: linker path does not have real file for library $a_deplib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $echo "*** with $libname but no candidates were found. (...for regex pattern test)" + else + $echo "*** with $libname and none of the candidates passed a file format test" + $echo "*** using a regex pattern. Last file checked: $potlib" + fi + fi + else + # Add a -L argument. + newdeplibs="$newdeplibs $a_deplib" + fi + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs="" + tmp_deplibs=`$echo "X $deplibs" | $Xsed -e 's/ -lc$//' \ + -e 's/ -[LR][^ ]*//g'` + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + for i in $predeps $postdeps ; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$echo "X $tmp_deplibs" | ${SED} -e "1s,^X,," -e "s,$i,,"` + done + fi + if $echo "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' \ + | grep . >/dev/null; then + $echo + if test "X$deplibs_check_method" = "Xnone"; then + $echo "*** Warning: inter-library dependencies are not supported in this platform." + else + $echo "*** Warning: inter-library dependencies are not known to be supported." + fi + $echo "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + fi + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + newdeplibs=`$echo "X $newdeplibs" | $Xsed -e 's/ -lc / -framework System /'` + ;; + esac + + if test "$droppeddeps" = yes; then + if test "$module" = yes; then + $echo + $echo "*** Warning: libtool could not satisfy all declared inter-library" + $echo "*** dependencies of module $libname. Therefore, libtool will create" + $echo "*** a static module, that should work as long as the dlopening" + $echo "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + $echo + $echo "*** However, this would only work if libtool was able to extract symbol" + $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + $echo "*** not find such a program. So, this module is probably useless." + $echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + $echo "*** The inter-library dependencies that have been dropped here will be" + $echo "*** automatically added whenever a program is linked with this library" + $echo "*** or is declared to -dlopen it." + + if test "$allow_undefined" = no; 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 "$build_old_libs" = no; 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 + + + # 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 "*) + new_libs="$new_libs -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$new_libs $deplib" ;; + esac + ;; + *) new_libs="$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 "$build_libtool_libs" = yes; then + if test "$hardcode_into_libs" = yes; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath="$finalize_rpath" + test "$mode" != relink && rpath="$compile_rpath$rpath" + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + dep_rpath="$dep_rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + if test -n "$hardcode_libdir_flag_spec_ld"; then + case $archive_cmds in + *\$LD*) eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" ;; + *) eval dep_rpath=\"$hardcode_libdir_flag_spec\" ;; + esac + else + eval dep_rpath=\"$hardcode_libdir_flag_spec\" + fi + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath="$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 "$mode" != relink && 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 + realname="$2" + shift; 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 + linknames="$linknames $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then + $show "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $run $rm $export_symbols + cmds=$export_symbols_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + if len=`expr "X$cmd" : ".*"` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then + $show "$cmd" + $run eval "$cmd" || exit $? + skipped_export=false + else + # The command line is too long to execute in one step. + $show "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"; then + $show "$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"" + $run eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + $show "$mv \"${export_symbols}T\" \"$export_symbols\"" + $run eval '$mv "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"' + fi + + tmp_deplibs= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + tmp_deplibs="$tmp_deplibs $test_deplib" + ;; + esac + done + deplibs="$tmp_deplibs" + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + else + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + func_extract_archives $gentop $convenience + libobjs="$libobjs $func_extract_archives_result" + fi + fi + + if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + linker_flags="$linker_flags $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test "$mode" = relink; then + $run eval '(cd $output_objdir && $rm ${realname}U && $mv $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test "$module" = yes && 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 "X$skipped_export" != "X:" && + len=`expr "X$test_cmds" : ".*" 2>/dev/null` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # The command line is too long to link in one step, link piecewise. + $echo "creating reloadable object files..." + + # 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 + output_la=`$echo "X$output" | $Xsed -e "$basename"` + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + delfiles= + last_robj= + k=1 + output=$output_objdir/$output_la-${k}.$objext + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + eval test_cmds=\"$reload_cmds $objlist $last_robj\" + if test "X$objlist" = X || + { len=`expr "X$test_cmds" : ".*" 2>/dev/null` && + test "$len" -le "$max_cmd_len"; }; then + objlist="$objlist $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test "$k" -eq 1 ; then + # The first file doesn't have a previous command to add. + eval concat_cmds=\"$reload_cmds $objlist $last_robj\" + else + # All subsequent reloadable object files will link in + # the last one created. + eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj\" + fi + last_robj=$output_objdir/$output_la-${k}.$objext + k=`expr $k + 1` + output=$output_objdir/$output_la-${k}.$objext + objlist=$obj + len=1 + 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~ + eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\" + + if ${skipped_export-false}; then + $show "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $run $rm $export_symbols + libobjs=$output + # Append the command to create the export file. + eval concat_cmds=\"\$concat_cmds~$export_symbols_cmds\" + fi + + # Set up a command to remove the reloadable object files + # after they are used. + i=0 + while test "$i" -lt "$k" + do + i=`expr $i + 1` + delfiles="$delfiles $output_objdir/$output_la-${i}.$objext" + done + + $echo "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" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + 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\" + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test "$module" = yes && 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 + + # Append the command to remove the reloadable object files + # to the just-reset $cmds. + eval cmds=\"\$cmds~\$rm $delfiles\" + fi + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$mode" = relink; then + $run eval '(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 "$mode" = relink; then + $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 + $show "${rm}r $gentop" + $run ${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 + $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)" + $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $? + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test "$module" = yes || test "$export_dynamic" = yes; then + # On all known operating systems, these are identical. + dlname="$soname" + fi + fi + ;; + + obj) + case " $deplibs" in + *\ -l* | *\ -L*) + $echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2 ;; + esac + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2 + fi + + if test -n "$rpath"; then + $echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2 + fi + + if test -n "$xrpath"; then + $echo "$modename: warning: \`-R' is ignored for objects" 1>&2 + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for objects" 1>&2 + fi + + case $output in + *.lo) + if test -n "$objs$old_deplibs"; then + $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2 + exit $EXIT_FAILURE + fi + libobj="$output" + obj=`$echo "X$output" | $Xsed -e "$lo2o"` + ;; + *) + libobj= + obj="$output" + ;; + esac + + # Delete the old objects. + $run $rm $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # reload_cmds runs $LD directly, so let us get rid of + # -Wl from whole_archive_flag_spec and hope we can get by with + # turning comma into space.. + wl= + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" + reload_conv_objs=$reload_objs\ `$echo "X$tmp_whole_archive_flags" | $Xsed -e 's|,| |g'` + else + gentop="$output_objdir/${obj}x" + generated="$generated $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + + # Create the old-style object. + reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test + + output="$obj" + cmds=$reload_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + exit $EXIT_SUCCESS + fi + + if test "$build_libtool_libs" != yes; then + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. + # $show "echo timestamp > $libobj" + # $run eval "echo timestamp > $libobj" || exit $? + exit $EXIT_SUCCESS + fi + + if test -n "$pic_flag" || test "$pic_mode" != default; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output="$libobj" + cmds=$reload_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + exit $EXIT_SUCCESS + ;; + + prog) + case $host in + *cygwin*) output=`$echo $output | ${SED} -e 's,.exe$,,;s,$,.exe,'` ;; + esac + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for programs" 1>&2 + fi + + if test "$preload" = yes; then + if test "$dlopen_support" = unknown && test "$dlopen_self" = unknown && + test "$dlopen_self_static" = unknown; then + $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support." + fi + fi + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$echo "X $compile_deplibs" | $Xsed -e 's/ -lc / -framework System /'` + finalize_deplibs=`$echo "X $finalize_deplibs" | $Xsed -e 's/ -lc / -framework System /'` + ;; + esac + + case $host in + *darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + if test "$tagname" = CXX ; then + compile_command="$compile_command ${wl}-bind_at_load" + finalize_command="$finalize_command ${wl}-bind_at_load" + fi + ;; + 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 "*) + new_libs="$new_libs -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$new_libs $deplib" ;; + esac + ;; + *) new_libs="$new_libs $deplib" ;; + esac + done + compile_deplibs="$new_libs" + + + compile_command="$compile_command $compile_deplibs" + finalize_command="$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 "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) + testbindir=`$echo "X$libdir" | $Xsed -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$libdir:"*) ;; + *) dllsearchpath="$dllsearchpath:$libdir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + *) dllsearchpath="$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"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath="$rpath" + + if test -n "$libobjs" && test "$build_old_libs" = yes; then + # Transform all the library objects into standard objects. + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + fi + + dlsyms= + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + dlsyms="${outputname}S.c" + else + $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2 + fi + fi + + if test -n "$dlsyms"; then + case $dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist="$output_objdir/${outputname}.nm" + + $show "$rm $nlist ${nlist}S ${nlist}T" + $run $rm "$nlist" "${nlist}S" "${nlist}T" + + # Parse the name list into a source file. + $show "creating $output_objdir/$dlsyms" + + test -z "$run" && $echo > "$output_objdir/$dlsyms" "\ +/* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */ +/* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +/* Prevent the only kind of declaration conflicts we can make. */ +#define lt_preloaded_symbols some_other_symbol + +/* External symbol declarations for the compiler. */\ +" + + if test "$dlself" = yes; then + $show "generating symbol list for \`$output'" + + test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$echo "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + for arg in $progfiles; do + $show "extracting global C symbols from \`$arg'" + $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $run eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + $run eval '$mv "$nlist"T "$nlist"' + fi + + if test -n "$export_symbols_regex"; then + $run eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + $run eval '$mv "$nlist"T "$nlist"' + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols="$output_objdir/$outputname.exp" + $run $rm $export_symbols + $run eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + case $host in + *cygwin* | *mingw* ) + $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + $run eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' + ;; + esac + else + $run eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + $run eval 'grep -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' + $run eval 'mv "$nlist"T "$nlist"' + case $host in + *cygwin* | *mingw* ) + $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + $run eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' + ;; + esac + fi + fi + + for arg in $dlprefiles; do + $show "extracting global C symbols from \`$arg'" + name=`$echo "$arg" | ${SED} -e 's%^.*/%%'` + $run eval '$echo ": $name " >> "$nlist"' + $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" + done + + if test -z "$run"; then + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $mv "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if grep -v "^: " < "$nlist" | + 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/$dlsyms"' + else + $echo '/* NONE */' >> "$output_objdir/$dlsyms" + fi + + $echo >> "$output_objdir/$dlsyms" "\ + +#undef lt_preloaded_symbols + +#if defined (__STDC__) && __STDC__ +# define lt_ptr void * +#else +# define lt_ptr char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +" + + case $host in + *cygwin* | *mingw* ) + $echo >> "$output_objdir/$dlsyms" "\ +/* DATA imports from DLLs on WIN32 can't be const, because + runtime relocations are performed -- see ld's documentation + on pseudo-relocs */ +struct { +" + ;; + * ) + $echo >> "$output_objdir/$dlsyms" "\ +const struct { +" + ;; + esac + + + $echo >> "$output_objdir/$dlsyms" "\ + const char *name; + lt_ptr address; +} +lt_preloaded_symbols[] = +{\ +" + + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$dlsyms" + + $echo >> "$output_objdir/$dlsyms" "\ + {0, (lt_ptr) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + fi + + pic_flag_for_symtable= + case $host in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + case "$compile_command " in + *" -static "*) ;; + *) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND";; + esac;; + *-*-hpux*) + case "$compile_command " in + *" -static "*) ;; + *) pic_flag_for_symtable=" $pic_flag";; + esac + esac + + # Now compile the dynamic symbol file. + $show "(cd $output_objdir && $LTCC $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")" + $run eval '(cd $output_objdir && $LTCC $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $? + + # Clean up the generated files. + $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T" + $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T" + + # Transform the symbol file into the correct name. + case $host in + *cygwin* | *mingw* ) + if test -f "$output_objdir/${outputname}.def" ; then + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%" | $NL2SP` + else + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` + fi + ;; + * ) + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` + ;; + esac + ;; + *) + $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2 + exit $EXIT_FAILURE + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s% @SYMFILE@%%" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s% @SYMFILE@%%" | $NL2SP` + fi + + if test "$need_relink" = no || test "$build_libtool_libs" != yes; then + # Replace the output file specification. + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e 's%@OUTPUT@%'"$output"'%g' | $NL2SP` + link_command="$compile_command$compile_rpath" + + # We have no uninstalled library dependencies, so finalize right now. + $show "$link_command" + $run eval "$link_command" + exit_status=$? + + # Delete the generated files. + if test -n "$dlsyms"; then + $show "$rm $output_objdir/${outputname}S.${objext}" + $run $rm "$output_objdir/${outputname}S.${objext}" + fi + + exit $exit_status + fi + + if test -n "$shlibpath_var"; then + # We should set the shlibpath_var + rpath= + for dir in $temp_rpath; do + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) + # Absolute path. + rpath="$rpath$dir:" + ;; + *) + # Relative path: add a thisdir entry. + rpath="$rpath\$thisdir/$dir:" + ;; + esac + done + temp_rpath="$rpath" + fi + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath="$rpath$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + rpath="$rpath$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test "$no_install" = yes; 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 "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $run $rm $output + # Link the executable and exit + $show "$link_command" + $run eval "$link_command" || exit $? + exit $EXIT_SUCCESS + fi + + if test "$hardcode_action" = relink; then + # Fast installation is not supported + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + + $echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2 + $echo "$modename: \`$output' will be relinked during installation" 1>&2 + else + if test "$fast_install" != no; then + link_command="$finalize_var$compile_command$finalize_rpath" + if test "$fast_install" = yes; then + relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $SP2NL | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g' | $NL2SP` + else + # fast_install is set to needless + relink_command= + fi + else + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + fi + fi + + # Replace the output file specification. + link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname + + $show "$link_command" + $run eval "$link_command" || exit $? + + # Now create the wrapper script. + $show "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + # 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}\" || 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 + var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` + relink_command="$var=\"$var_value\"; export $var; $relink_command" + fi + done + relink_command="(cd `pwd`; $relink_command)" + relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e "$sed_quote_subst" | $NL2SP` + fi + + # Quote $echo for shipping. + if test "X$echo" = "X$SHELL $progpath --fallback-echo"; then + case $progpath in + [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";; + *) qecho="$SHELL `pwd`/$progpath --fallback-echo";; + esac + qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"` + else + qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"` + fi + + # Only actually do things if our run command is non-null. + if test -z "$run"; then + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) output=`$echo $output|${SED} 's,.exe$,,'` ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) + exeext=.exe + outputname=`$echo $outputname|${SED} 's,.exe$,,'` ;; + *) exeext= ;; + esac + case $host in + *cygwin* | *mingw* ) + output_name=`basename $output` + output_path=`dirname $output` + 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 + + cat > $cwrappersource <> $cwrappersource<<"EOF" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(PATH_MAX) +# define LT_PATHMAX PATH_MAX +#elif defined(MAXPATHLEN) +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#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 +# 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 */ + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free ((void *) stale); stale = 0; } \ +} while (0) + +/* -DDEBUG is fairly common in CFLAGS. */ +#undef DEBUG +#if defined DEBUGWRAPPER +# define DEBUG(format, ...) fprintf(stderr, format, __VA_ARGS__) +#else +# define DEBUG(format, ...) +#endif + +const char *program_name = NULL; + +void * xmalloc (size_t num); +char * xstrdup (const char *string); +const char * base_name (const char *name); +char * find_executable(const char *wrapper); +int check_executable(const char *path); +char * strendzap(char *str, const char *pat); +void lt_fatal (const char *message, ...); + +int +main (int argc, char *argv[]) +{ + char **newargz; + int i; + + program_name = (char *) xstrdup (base_name (argv[0])); + DEBUG("(main) argv[0] : %s\n",argv[0]); + DEBUG("(main) program_name : %s\n",program_name); + newargz = XMALLOC(char *, argc+2); +EOF + + cat >> $cwrappersource <> $cwrappersource <<"EOF" + newargz[1] = find_executable(argv[0]); + if (newargz[1] == NULL) + lt_fatal("Couldn't find %s", argv[0]); + DEBUG("(main) found exe at : %s\n",newargz[1]); + /* we know the script has the same name, without the .exe */ + /* so make sure newargz[1] doesn't end in .exe */ + strendzap(newargz[1],".exe"); + for (i = 1; i < argc; i++) + newargz[i+1] = xstrdup(argv[i]); + newargz[argc+1] = NULL; + + for (i=0; i> $cwrappersource <> $cwrappersource <> $cwrappersource <<"EOF" + return 127; +} + +void * +xmalloc (size_t num) +{ + void * p = (void *) malloc (num); + if (!p) + lt_fatal ("Memory exhausted"); + + return p; +} + +char * +xstrdup (const char *string) +{ + return string ? strcpy ((char *) xmalloc (strlen (string) + 1), string) : NULL +; +} + +const char * +base_name (const char *name) +{ + const char *base; + +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + /* Skip over the disk name in MSDOS pathnames. */ + if (isalpha ((unsigned char)name[0]) && name[1] == ':') + name += 2; +#endif + + for (base = name; *name; name++) + if (IS_DIR_SEPARATOR (*name)) + base = name + 1; + return base; +} + +int +check_executable(const char * path) +{ + struct stat st; + + DEBUG("(check_executable) : %s\n", path ? (*path ? path : "EMPTY!") : "NULL!"); + if ((!path) || (!*path)) + return 0; + + if ((stat (path, &st) >= 0) && + ( + /* MinGW & native WIN32 do not support S_IXOTH or S_IXGRP */ +#if defined (S_IXOTH) + ((st.st_mode & S_IXOTH) == S_IXOTH) || +#endif +#if defined (S_IXGRP) + ((st.st_mode & S_IXGRP) == S_IXGRP) || +#endif + ((st.st_mode & S_IXUSR) == S_IXUSR)) + ) + return 1; + else + return 0; +} + +/* Searches for the full path of the wrapper. Returns + newly allocated full path name if found, NULL otherwise */ +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]; + int tmp_len; + char* concat_name; + + DEBUG("(find_executable) : %s\n", wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!"); + + 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 = 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 ("getcwd failed"); + 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 ("getcwd failed"); + 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 * +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 (strcmp(str, pat) == 0) + *str = '\0'; + } + return str; +} + +static void +lt_error_core (int exit_status, const char * mode, + const char * message, va_list ap) +{ + fprintf (stderr, "%s: %s: ", program_name, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, "FATAL", message, ap); + va_end (ap); +} +EOF + # we should really use a build-platform specific compiler + # here, but OTOH, the wrappers (shell script and this C one) + # are only useful if you want to execute the "real" binary. + # Since the "real" binary is built for $host, then this + # wrapper might as well be built for $host, too. + $run $LTCC $LTCFLAGS -s -o $cwrapper $cwrappersource + ;; + esac + $rm $output + trap "$rm $output; exit $EXIT_FAILURE" 1 2 15 + + $echo > $output "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP +# +# The $output program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='${SED} -e 1s/^X//' +sed_quote_subst='$sed_quote_subst' + +# Be Bourne compatible (taken from Autoconf:_AS_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 variable: + 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 + echo=\"$qecho\" + file=\"\$0\" + # Make sure echo works. + if test \"X\$1\" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift + elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then + # Yippee, \$echo works! + : + else + # Restart under the correct shell, and then maybe \$echo will work. + exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"} + fi + fi\ +" + $echo >> $output "\ + + # Find the directory that this script lives in. + thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\` + done + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test "$fast_install" = yes; then + $echo >> $output "\ + program=lt-'$outputname'$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 >> $output "\ + + # 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 $EXIT_FAILURE + fi + fi + + $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $rm \"\$progdir/\$program\"; + $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $rm \"\$progdir/\$file\" + fi" + else + $echo >> $output "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + $echo >> $output "\ + + if test -f \"\$progdir/\$program\"; then" + + # Export our shlibpath_var if we have one. + if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $echo >> $output "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` + + export $shlibpath_var +" + fi + + # fixup the dll searchpath if we need to. + if test -n "$dllsearchpath"; then + $echo >> $output "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + $echo >> $output "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2*) + $echo >> $output "\ + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $echo >> $output "\ + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $echo >> $output "\ + \$echo \"\$0: cannot exec \$program \$*\" + exit $EXIT_FAILURE + 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 $EXIT_FAILURE + fi +fi\ +" + chmod +x $output + fi + exit $EXIT_SUCCESS + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + if test "$build_libtool_libs" = convenience; then + oldobjs="$libobjs_save" + addlibs="$convenience" + build_libtool_libs=no + else + if test "$build_libtool_libs" = module; then + oldobjs="$libobjs_save" + build_libtool_libs=no + else + oldobjs="$old_deplibs $non_pic_objects" + fi + addlibs="$old_convenience" + fi + + if test -n "$addlibs"; then + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + func_extract_archives $gentop $addlibs + oldobjs="$oldobjs $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then + cmds=$old_archive_from_new_cmds + else + # 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 + $echo "X$obj" | $Xsed -e 's%^.*/%%' + done | sort | sort -uc >/dev/null 2>&1); then + : + else + $echo "copying selected object files to avoid basename conflicts..." + + if test -z "$gentop"; then + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + $show "${rm}r $gentop" + $run ${rm}r "$gentop" + $show "$mkdir $gentop" + $run $mkdir "$gentop" + exit_status=$? + if test "$exit_status" -ne 0 && test ! -d "$gentop"; then + exit $exit_status + fi + fi + + save_oldobjs=$oldobjs + oldobjs= + counter=1 + for obj in $save_oldobjs + do + objbase=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` + case " $oldobjs " in + " ") oldobjs=$obj ;; + *[\ /]"$objbase "*) + while :; do + # Make sure we don't pick an alternate name that also + # overlaps. + newobj=lt$counter-$objbase + counter=`expr $counter + 1` + case " $oldobjs " in + *[\ /]"$newobj "*) ;; + *) if test ! -f "$gentop/$newobj"; then break; fi ;; + esac + done + $show "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" + $run ln "$obj" "$gentop/$newobj" || + $run cp "$obj" "$gentop/$newobj" + oldobjs="$oldobjs $gentop/$newobj" + ;; + *) oldobjs="$oldobjs $obj" ;; + esac + done + fi + + eval cmds=\"$old_archive_cmds\" + + if len=`expr "X$cmds" : ".*"` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + $echo "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_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 + for obj in $save_oldobjs + do + oldobjs="$objlist $obj" + objlist="$objlist $obj" + eval test_cmds=\"$old_archive_cmds\" + if len=`expr "X$test_cmds" : ".*" 2>/dev/null` && + test "$len" -le "$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= + fi + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test "X$oldobjs" = "X" ; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" + fi + fi + fi + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + eval cmd=\"$cmd\" + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + done + + if test -n "$generated"; then + $show "${rm}r$generated" + $run ${rm}r$generated + fi + + # Now create the libtool archive. + case $output in + *.la) + old_library= + test "$build_old_libs" = yes && old_library="$libname.$libext" + $show "creating $output" + + # 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}\" || 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 + var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` + relink_command="$var=\"$var_value\"; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e "$sed_quote_subst" | $NL2SP` + if test "$hardcode_automatic" = yes ; then + relink_command= + fi + + + # Only create the output if not a dry run. + if test -z "$run"; then + for installed in no yes; do + if test "$installed" = yes; then + if test -z "$install_libdir"; then + break + fi + output="$output_objdir/$outputname"i + # Replace all uninstalled libtool libraries with the installed ones + newdependency_libs= + for deplib in $dependency_libs; do + case $deplib in + *.la) + name=`$echo "X$deplib" | $Xsed -e 's%^.*/%%'` + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + if test -z "$libdir"; then + $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + newdependency_libs="$newdependency_libs $libdir/$name" + ;; + *) newdependency_libs="$newdependency_libs $deplib" ;; + esac + done + dependency_libs="$newdependency_libs" + newdlfiles= + for lib in $dlfiles; do + name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + if test -z "$libdir"; then + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + newdlfiles="$newdlfiles $libdir/$name" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + if test -z "$libdir"; then + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + newdlprefiles="$newdlprefiles $libdir/$name" + done + dlprefiles="$newdlprefiles" + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + newdlfiles="$newdlfiles $abs" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + newdlprefiles="$newdlprefiles $abs" + done + dlprefiles="$newdlprefiles" + fi + $rm $output + # place dlname in correct position for cygwin + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; + esac + $echo > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='$tdlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# 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 "$installed" = no && test "$need_relink" = yes; then + $echo >> $output "\ +relink_command=\"$relink_command\"" + fi + done + fi + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" + $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $? + ;; + esac + exit $EXIT_SUCCESS + ;; + + # libtool install mode + install) + modename="$modename: install" + + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || + # Allow the use of GNU shtool's install command. + $echo "X$nonopt" | grep shtool > /dev/null; then + # Aesthetically quote it. + arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + install_prog="$arg " + arg="$1" + shift + else + install_prog= + arg=$nonopt + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + install_prog="$install_prog$arg" + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=no + stripme= + for arg + do + if test -n "$dest"; then + files="$files $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=yes ;; + -f) + case " $install_prog " in + *[\\\ /]cp\ *) ;; + *) prev=$arg ;; + esac + ;; + -g | -m | -o) prev=$arg ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + install_prog="$install_prog $arg" + done + + if test -z "$install_prog"; then + $echo "$modename: you must specify an install program" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + if test -n "$prev"; then + $echo "$modename: the \`$prev' option requires an argument" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + if test -z "$files"; then + if test -z "$dest"; then + $echo "$modename: no file or destination specified" 1>&2 + else + $echo "$modename: you must specify a destination" 1>&2 + fi + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Strip any trailing slash from the destination. + dest=`$echo "X$dest" | $Xsed -e 's%/$%%'` + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=yes + if test "$isdir" = yes; then + destdir="$dest" + destname= + else + destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'` + test "X$destdir" = "X$dest" && destdir=. + destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'` + + # Not a directory, so check to see that there is only one file specified. + set dummy $files + if test "$#" -gt 2; then + $echo "$modename: \`$dest' is not a directory" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + 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. + staticlibs="$staticlibs $file" + ;; + + *.la) + # Check to see that this really is a libtool archive. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$file' is not a valid libtool archive" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + library_names= + old_library= + relink_command= + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) current_libdirs="$current_libdirs $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) future_libdirs="$future_libdirs $libdir" ;; + esac + fi + + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/ + test "X$dir" = "X$file/" && dir= + dir="$dir$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$echo "$destdir" | $SED "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. + if test "$inst_prefix_dir" = "$destdir"; then + $echo "$modename: error: cannot install \`$file' to a directory not ending in $libdir" 1>&2 + exit $EXIT_FAILURE + fi + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$echo "$relink_command" | $SP2NL | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%" | $NL2SP` + else + relink_command=`$echo "$relink_command" | $SP2NL | $SED "s%@inst_prefix_dir@%%" | $NL2SP` + fi + + $echo "$modename: warning: relinking \`$file'" 1>&2 + $show "$relink_command" + if $run eval "$relink_command"; then : + else + $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 + exit $EXIT_FAILURE + fi + fi + + # See the names of the shared library. + set dummy $library_names + if test -n "$2"; then + realname="$2" + shift + shift + + srcname="$realname" + test -n "$relink_command" && srcname="$realname"T + + # Install the shared library and build the symlinks. + $show "$install_prog $dir/$srcname $destdir/$realname" + $run eval "$install_prog $dir/$srcname $destdir/$realname" || exit $? + if test -n "$stripme" && test -n "$striplib"; then + $show "$striplib $destdir/$realname" + $run 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 + if test "$linkname" != "$realname"; then + $show "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })" + $run eval "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })" + fi + done + fi + + # Do each command in the postinstall commands. + lib="$destdir/$realname" + cmds=$postinstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$mode" = relink; then + $run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)' + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + fi + + # Install the pseudo-library for information purposes. + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + instname="$dir/$name"i + $show "$install_prog $instname $destdir/$name" + $run eval "$install_prog $instname $destdir/$name" || exit $? + + # Maybe install the static library, too. + test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + destfile="$destdir/$destfile" + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"` + ;; + *.$objext) + staticdest="$destfile" + destfile= + ;; + *) + $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + # Install the libtool object if requested. + if test -n "$destfile"; then + $show "$install_prog $file $destfile" + $run eval "$install_prog $file $destfile" || exit $? + fi + + # Install the old object if enabled. + if test "$build_old_libs" = yes; then + # Deduce the name of the old-style object file. + staticobj=`$echo "X$file" | $Xsed -e "$lo2o"` + + $show "$install_prog $staticobj $staticdest" + $run eval "$install_prog \$staticobj \$staticdest" || exit $? + fi + exit $EXIT_SUCCESS + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + destfile="$destdir/$destfile" + fi + + # 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 + file=`$echo $file|${SED} 's,.exe$,,'` + stripped_ext=".exe" + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin*|*mingw*) + wrapper=`$echo $file | ${SED} -e 's,.exe$,,'` + ;; + *) + wrapper=$file + ;; + esac + if (${SED} -e '4q' $wrapper | grep "^# Generated by .*$PACKAGE")>/dev/null 2>&1; then + notinst_deplibs= + relink_command= + + # Note that it is not necessary on cygwin/mingw to append a dot to + # foo even if both foo 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. + # + # If there is no directory component, then add one. + case $wrapper in + */* | *\\*) . ${wrapper} ;; + *) . ./${wrapper} ;; + esac + + # Check the variables that should have been set. + if test -z "$notinst_deplibs"; then + $echo "$modename: invalid libtool wrapper script \`$wrapper'" 1>&2 + exit $EXIT_FAILURE + fi + + finalize=yes + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + # If there is no directory component, then add one. + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + fi + libfile="$libdir/"`$echo "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test + if test -n "$libdir" && test ! -f "$libfile"; then + $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2 + finalize=no + fi + done + + relink_command= + # Note that it is not necessary on cygwin/mingw to append a dot to + # foo even if both foo 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. + # + # If there is no directory component, then add one. + case $wrapper in + */* | *\\*) . ${wrapper} ;; + *) . ./${wrapper} ;; + esac + + outputname= + if test "$fast_install" = no && test -n "$relink_command"; then + if test "$finalize" = yes && test -z "$run"; then + tmpdir=`func_mktempdir` + file=`$echo "X$file$stripped_ext" | $Xsed -e 's%^.*/%%'` + outputname="$tmpdir/$file" + # Replace the output file specification. + relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g' | $NL2SP` + + $show "$relink_command" + if $run eval "$relink_command"; then : + else + $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 + ${rm}r "$tmpdir" + continue + fi + file="$outputname" + else + $echo "$modename: warning: cannot relink \`$file'" 1>&2 + fi + else + # Install the binary that we compiled earlier. + file=`$echo "X$file$stripped_ext" | $Xsed -e "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) + destfile=`$echo $destfile | ${SED} -e 's,.exe$,,'` + ;; + esac + ;; + esac + $show "$install_prog$stripme $file $destfile" + $run eval "$install_prog\$stripme \$file \$destfile" || exit $? + test -n "$outputname" && ${rm}r "$tmpdir" + ;; + esac + done + + for file in $staticlibs; do + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + + # Set up the ranlib parameters. + oldlib="$destdir/$name" + + $show "$install_prog $file $oldlib" + $run eval "$install_prog \$file \$oldlib" || exit $? + + if test -n "$stripme" && test -n "$old_striplib"; then + $show "$old_striplib $oldlib" + $run eval "$old_striplib $oldlib" || exit $? + fi + + # Do each command in the postinstall commands. + cmds=$old_postinstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + done + + if test -n "$future_libdirs"; then + $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2 + fi + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + test -n "$run" && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi + ;; + + # libtool finish mode + finish) + modename="$modename: finish" + libdirs="$nonopt" + admincmds= + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for dir + do + libdirs="$libdirs $dir" + done + + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + cmds=$finish_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || admincmds="$admincmds + $cmd" + done + IFS="$save_ifs" + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $run eval "$cmds" || admincmds="$admincmds + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + test "$show" = : && exit $EXIT_SUCCESS + + $echo "X----------------------------------------------------------------------" | $Xsed + $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" + $echo "more information, such as the ld(1) and ld.so(8) manual pages." + $echo "X----------------------------------------------------------------------" | $Xsed + exit $EXIT_SUCCESS + ;; + + # libtool execute mode + execute) + modename="$modename: execute" + + # The first argument is the command name. + cmd="$nonopt" + if test -z "$cmd"; then + $echo "$modename: you must specify a COMMAND" 1>&2 + $echo "$help" + exit $EXIT_FAILURE + fi + + # Handle -dlopen flags immediately. + for file in $execute_dlfiles; do + if test ! -f "$file"; then + $echo "$modename: \`$file' is not a file" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + dir= + case $file in + *.la) + # Check to see that this really is a libtool archive. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Read the libtool library. + dlname= + library_names= + + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'" + continue + fi + + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$file" && dir=. + + if test -f "$dir/$objdir/$dlname"; then + dir="$dir/$objdir" + else + if test ! -f "$dir/$dlname"; then + $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2 + exit $EXIT_FAILURE + fi + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$file" && dir=. + ;; + + *) + $echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2 + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir="$absdir" + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic="$magic" + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case $file in + -*) ;; + *) + # Do a test to see if this is really a libtool program. + if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Transform arg to wrapped name. + file="$progdir/$program" + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"` + args="$args \"$file\"" + done + + if test -z "$run"; then + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved 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 + fi" + done + + # Now prepare to actually exec the command. + exec_cmd="\$cmd$args" + else + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\"" + $echo "export $shlibpath_var" + fi + $echo "$cmd$args" + exit $EXIT_SUCCESS + fi + ;; + + # libtool clean and uninstall mode + clean | uninstall) + modename="$modename: $mode" + rm="$nonopt" + files= + rmforce= + 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) rm="$rm $arg"; rmforce=yes ;; + -*) rm="$rm $arg" ;; + *) files="$files $arg" ;; + esac + done + + if test -z "$rm"; then + $echo "$modename: you must specify an RM program" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + rmdirs= + + origobjdir="$objdir" + for file in $files; do + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + if test "X$dir" = "X$file"; then + dir=. + objdir="$origobjdir" + else + objdir="$dir/$origobjdir" + fi + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + test "$mode" = uninstall && objdir="$dir" + + # Remember objdir for removal later, being careful to avoid duplicates + if test "$mode" = clean; then + case " $rmdirs " in + *" $objdir "*) ;; + *) rmdirs="$rmdirs $objdir" ;; + 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 test "$rmforce" = yes; then + continue + fi + + rmfiles="$file" + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + . $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + rmfiles="$rmfiles $objdir/$n" + done + test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library" + + case "$mode" in + clean) + case " $library_names " in + # " " in the beginning catches empty $dlname + *" $dlname "*) ;; + *) rmfiles="$rmfiles $objdir/$dlname" ;; + esac + test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" + ;; + uninstall) + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + cmds=$postuninstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" + if test "$?" -ne 0 && test "$rmforce" != yes; then + exit_status=1 + fi + done + IFS="$save_ifs" + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + cmds=$old_postuninstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" + if test "$?" -ne 0 && test "$rmforce" != yes; then + exit_status=1 + fi + done + IFS="$save_ifs" + fi + # FIXME: should reinstall the best remaining shared library. + ;; + esac + fi + ;; + + *.lo) + # Possibly a libtool object, so verify it. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + + # Read the .lo file + . $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" \ + && test "$pic_object" != none; then + rmfiles="$rmfiles $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" \ + && test "$non_pic_object" != none; then + rmfiles="$rmfiles $dir/$non_pic_object" + fi + fi + ;; + + *) + if test "$mode" = clean ; then + noexename=$name + case $file in + *.exe) + file=`$echo $file|${SED} 's,.exe$,,'` + noexename=`$echo $name|${SED} 's,.exe$,,'` + # $file with .exe has already been added to rmfiles, + # add $file without .exe + rmfiles="$rmfiles $file" + ;; + esac + # Do a test to see if this is a libtool program. + if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + relink_command= + . $dir/$noexename + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" + if test "$fast_install" = yes && test -n "$relink_command"; then + rmfiles="$rmfiles $objdir/lt-$name" + fi + if test "X$noexename" != "X$name" ; then + rmfiles="$rmfiles $objdir/lt-${noexename}.c" + fi + fi + fi + ;; + esac + $show "$rm $rmfiles" + $run $rm $rmfiles || exit_status=1 + done + objdir="$origobjdir" + + # Try to remove the ${objdir}s in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + $show "rmdir $dir" + $run rmdir $dir >/dev/null 2>&1 + fi + done + + exit $exit_status + ;; + + "") + $echo "$modename: you must specify a MODE" 1>&2 + $echo "$generic_help" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + if test -z "$exec_cmd"; then + $echo "$modename: invalid operation mode \`$mode'" 1>&2 + $echo "$generic_help" 1>&2 + exit $EXIT_FAILURE + fi +fi # test -z "$show_help" + +if test -n "$exec_cmd"; then + eval exec $exec_cmd + exit $EXIT_FAILURE +fi + +# We need to display help for each of the modes. +case $mode in +"") $echo \ +"Usage: $modename [OPTION]... [MODE-ARG]... + +Provide generalized library-building support services. + + --config show all configuration variables + --debug enable verbose shell tracing +-n, --dry-run display commands without modifying any files + --features display basic configuration information and exit + --finish same as \`--mode=finish' + --help display this help message and exit + --mode=MODE use operation mode MODE [default=inferred from MODE-ARGS] + --quiet same as \`--silent' + --silent don't print informational messages + --tag=TAG use configuration variables from tag TAG + --version print version information + +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. Try \`$modename --help --mode=MODE' for +a more detailed description of MODE. + +Report bugs to ." + exit $EXIT_SUCCESS + ;; + +clean) + $echo \ +"Usage: $modename [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: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -prefer-pic try to building PIC objects only + -prefer-non-pic try to building non-PIC objects only + -static always build a \`.o' file suitable for static linking + +COMPILE-COMMAND is a command to be used in creating a \`standard' object file +from the given SOURCEFILE. + +The output file name is determined by removing the directory component from +SOURCEFILE, then substituting the C source code suffix \`.c' with the +library object suffix, \`.lo'." + ;; + +execute) + $echo \ +"Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]... + +Automatically set library path, then run a program. + +This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + +This mode sets the library path environment variable according to \`-dlopen' +flags. + +If any of the ARGS are libtool executable wrappers, then they are translated +into their corresponding uninstalled binary, and any of their required library +directories are added to the library path. + +Then, COMMAND is executed, with ARGS as arguments." + ;; + +finish) + $echo \ +"Usage: $modename [OPTION]... --mode=finish [LIBDIR]... + +Complete the installation of libtool libraries. + +Each LIBDIR is a directory that contains libtool libraries. + +The commands that this mode executes may require superuser privileges. Use +the \`--dry-run' option if you just want to see what would be executed." + ;; + +install) + $echo \ +"Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND... + +Install executables or libraries. + +INSTALL-COMMAND is the installation command. The first component should be +either the \`install' or \`cp' program. + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + +link) + $echo \ +"Usage: $modename [OPTION]... --mode=link LINK-COMMAND... + +Link object files or libraries together to form another library, or to +create an executable program. + +LINK-COMMAND is a command using the C compiler that you would use to create +a program from several object files. + +The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-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 + -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 + -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] + +All other options (arguments beginning with \`-') are ignored. + +Every other argument is treated as a filename. Files ending in \`.la' are +treated as uninstalled libtool libraries, other files are standard or library +object files. + +If the OUTPUT-FILE ends in \`.la', then a libtool library is created, +only library objects (\`.lo' files) may be specified, and \`-rpath' is +required, except when creating a convenience library. + +If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created +using \`ar' and \`ranlib', or on Windows using \`lib'. + +If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file +is created, otherwise an executable program is created." + ;; + +uninstall) + $echo \ +"Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + +Remove libraries from an installation directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, all the files associated with it are deleted. +Otherwise, only FILE itself is deleted using RM." + ;; + +*) + $echo "$modename: invalid operation mode \`$mode'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; +esac + +$echo +$echo "Try \`$modename --help' for more information about other modes." + +exit $? + +# The TAGs below are defined such that we never get into a situation +# in which 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 +disable_libs=shared +# ### END LIBTOOL TAG CONFIG: disable-shared + +# ### BEGIN LIBTOOL TAG CONFIG: disable-static +disable_libs=static +# ### END LIBTOOL TAG CONFIG: disable-static + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/build/make_exports.awk b/rubbos/app/httpd-2.0.64/srclib/apr/build/make_exports.awk new file mode 100644 index 00000000..1d12fc65 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/build/make_exports.awk @@ -0,0 +1,150 @@ + +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") + printf("#define CORE_PRIVATE\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[RUI]?_(CORE_)?DECLARE[^(]*[(][^)]*[)]([^ ]* )*[^(]+[(]/ { + sub("[ \t]*AP[RUI]?_(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/rubbos/app/httpd-2.0.64/srclib/apr/build/make_nw_export.awk b/rubbos/app/httpd-2.0.64/srclib/apr/build/make_nw_export.awk new file mode 100644 index 00000000..291ecc0b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/build/make_nw_export.awk @@ -0,0 +1,78 @@ +# Based on apr's make_export.awk, which is +# based on Ryan Bloom's make_export.pl + +BEGIN { + printf(" (APRLIB)\n") +} + +# List of functions that we don't support, yet?? +#/apr_##name##_set_inherit/{next} +#/apr_##name##_unset_inherit/{next} + + +function add_symbol (sym_name) { + if (count) { + found++ + } + gsub (/ /, "", sym_name) + line = line sym_name ",\n" + + if (count == 0) { + printf(" %s", line) + line = "" + } +} + +/^[ \t]*AP[RUI]?_DECLARE[^(]*[(][^)]*[)]([^ ]* )*[^(]+[(]/ { + sub("[ \t]*AP[RUI]?_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]*AP[RUI]?_DECLARE_DATA .*;$/ { + varname = $NF; + gsub( /[*;]/, "", varname); + gsub( /\[.*\]/, "", varname); + add_symbol(varname); +} + + +#END { +# printf(" %s", line) +#} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/build/make_var_export.awk b/rubbos/app/httpd-2.0.64/srclib/apr/build/make_var_export.awk new file mode 100644 index 00000000..59922758 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/build/make_var_export.awk @@ -0,0 +1,59 @@ +# Based on apr's make_export.awk, which is +# based on Ryan Bloom's make_export.pl + +/^#[ \t]*if(def)? (AP[RUI]?_|!?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[RUI]?_DECLARE_DATA .*;$/ { + varname = $NF; + gsub( /[*;]/, "", varname); + gsub( /\[.*\]/, "", varname); + add_symbol(varname); +} + +END { + printf("%s", line) +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/build/mkdir.sh b/rubbos/app/httpd-2.0.64/srclib/apr/build/mkdir.sh new file mode 100755 index 00000000..b947c926 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/build/mkdir.sh @@ -0,0 +1,37 @@ +#!/bin/sh +## +## 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 +## +# +# This script falls under the Apache License. +# See http://www.apache.org/docs/LICENSE + + +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/rubbos/app/httpd-2.0.64/srclib/apr/build/nw_export.inc b/rubbos/app/httpd-2.0.64/srclib/apr/build/nw_export.inc new file mode 100644 index 00000000..38e225cb --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/build/nw_export.inc @@ -0,0 +1,82 @@ +/* Must include apr.h first so that we can undefine + the standard prototypes macros after it messes with + them. */ +#include "apr.h" + +#undef APR_DECLARE +#undef APR_DECLARE_NONSTD +#undef APR_DECLARE_HOOK +#undef APR_POOL_DECLARE_ACCESSOR +#undef APR_DECLARE_DATA + +/* Preprocess all of the standard APR headers. */ +#include "apr_allocator.h" +#include "apr_atomic.h" +#include "apr_compat.h" +#include "apr_dso.h" +#include "apr_env.h" +#include "apr_errno.h" +#include "apr_file_info.h" +#include "apr_file_io.h" +#include "apr_fnmatch.h" +#include "apr_general.h" +#include "apr_getopt.h" +#include "apr_global_mutex.h" +#include "apr_hash.h" +#include "apr_inherit.h" +#include "apr_lib.h" +#include "apr_mmap.h" +#include "apr_network_io.h" +#include "apr_poll.h" +#include "apr_pools.h" +#include "apr_portable.h" +#include "apr_proc_mutex.h" +#include "apr_ring.h" +#include "apr_shm.h" +#include "apr_signal.h" +#include "apr_strings.h" +#include "apr_support.h" +#include "apr_tables.h" +#include "apr_thread_cond.h" +#include "apr_thread_mutex.h" +#include "apr_thread_proc.h" +#include "apr_thread_rwlock.h" +#include "apr_time.h" +#include "apr_user.h" +#include "apr_version.h" +#include "apr_want.h" + + +/* Must include apu.h first so that we can undefine + the standard prototypes macros after it messes with + them. */ +#include "apu.h" + +#undef APU_DECLARE +#undef APU_DECLARE_NONSTD +#undef APU_DECLARE_DATA + +/* Preprocess all of the standard APR headers. */ +#include "apr_anylock.h" +#include "apr_base64.h" +#include "apr_buckets.h" +#include "apr_date.h" +#include "apr_dbm.h" +#include "apr_hooks.h" +#include "apr_md4.h" +#include "apr_md5.h" +#include "apr_optional.h" +#include "apr_optional_hooks.h" +#include "apr_queue.h" +#include "apr_reslist.h" +#include "apr_rmm.h" +#include "apr_sdbm.h" +#include "apr_sha1.h" +#include "apr_strmatch.h" +#include "apr_uri.h" +#include "apr_uuid.h" +#include "apr_xlate.h" +#include "apr_xml.h" +#include "apu_compat.h" +#include "apu_version.h" +#include "apu_want.h" diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/build/nw_ver.awk b/rubbos/app/httpd-2.0.64/srclib/apr/build/nw_ver.awk new file mode 100644 index 00000000..7eef25fe --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/build/nw_ver.awk @@ -0,0 +1,40 @@ +BEGIN { + + # fetch APR version numbers from input file and writes them to STDOUT + + while ((getline < ARGV[1]) > 0) { + if (match ($0, /^#define APR_MAJOR_VERSION/)) { + ver_major = $3; + } + else if (match ($0, /^#define APR_MINOR_VERSION/)) { + ver_minor = $3; + } + else if (match ($0, /^#define APR_PATCH_VERSION/)) { + ver_patch = $3; + } + else if (match ($0, /^#define APR_IS_DEV_VERSION/)) { + ver_devbuild = 1; + } + } + ver_str = ver_major "." ver_minor "." ver_patch (ver_devbuild ? "-dev" : ""); + if (WANTED) { + ver_num = ver_major * 1000000 + ver_minor * 1000 + ver_patch; + if (ver_num < WANTED) { + print "ERROR: APR version " ver_str " does NOT match!"; + exit 1; + } else if (ver_num >= 1000000) { + print "ERROR: APR version " ver_str " higher than expected!"; + exit 1; + } else { + print "OK: APR version " ver_str ""; + exit 0; + } + } else { + ver_nlm = ver_major "," ver_minor "," ver_patch; + print "VERSION = " ver_nlm ""; + print "VERSION_STR = " ver_str ""; + } + +} + + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/build/pkg/README b/rubbos/app/httpd-2.0.64/srclib/apr/build/pkg/README new file mode 100644 index 00000000..f6b0e633 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/build/pkg/README @@ -0,0 +1,17 @@ +The script in this directory will attempt to build a Solaris package +out of a source tree for APR. + +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 apr---local.gz will be +created in the root of the source tree. + +By default, if you attempt to build packages for apr-util, it will +search for the sources for apr in: + +../apr- + + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/build/pkg/buildpkg.sh b/rubbos/app/httpd-2.0.64/srclib/apr/build/pkg/buildpkg.sh new file mode 100755 index 00000000..073e89d7 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/build/pkg/buildpkg.sh @@ -0,0 +1,72 @@ +#!/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. + +PREFIX=/usr/local +TEMPDIR=/var/tmp/$USER/apr-root +rm -rf $TEMPDIR + +apr_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 + ;; + esac + + shift +done + +if [ -f "$apr_src_dir/configure.in" ]; then + cd $apr_src_dir +else + echo "The apr source could not be found within $apr_src_dir" + echo "Usage: buildpkg [--with-apr=dir]" + exit 1 +fi + +./configure --prefix=$PREFIX +make +make install DESTDIR=$TEMPDIR +rm $TEMPDIR$PREFIX/lib/apr.exp +. 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/rubbos/app/httpd-2.0.64/srclib/apr/build/pkg/pkginfo b/rubbos/app/httpd-2.0.64/srclib/apr/build/pkg/pkginfo new file mode 100644 index 00000000..4fd66333 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/build/pkg/pkginfo @@ -0,0 +1,11 @@ +PKG="ASFapr-0" +NAME="apr" +ARCH="x86_64" +VERSION="0.9.19" +CATEGORY="application" +VENDOR="Apache Software Foundation" +EMAIL="dev@apr.apache.org" +PSTAMP="dev@apr.apache.org" +BASEDIR="/bottlenecks/rubbos/app/apache2" +CLASSES="none" + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/build/pkg/pkginfo.in b/rubbos/app/httpd-2.0.64/srclib/apr/build/pkg/pkginfo.in new file mode 100644 index 00000000..91fbc2b7 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/build/pkg/pkginfo.in @@ -0,0 +1,11 @@ +PKG="ASFapr-0" +NAME="apr" +ARCH="@target_cpu@" +VERSION="@APR_DOTTED_VERSION@" +CATEGORY="application" +VENDOR="Apache Software Foundation" +EMAIL="dev@apr.apache.org" +PSTAMP="dev@apr.apache.org" +BASEDIR="@prefix@" +CLASSES="none" + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/build/prebuildNW.bat b/rubbos/app/httpd-2.0.64/srclib/apr/build/prebuildNW.bat new file mode 100755 index 00000000..941d920c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/build/prebuildNW.bat @@ -0,0 +1,48 @@ +@echo off + +if not "%NovellLibC%" == "" goto CheckNDK +set NovellLibC=\novell\ndk\libc +@echo Could not find the NovellLibC environment variable +@echo Setting NovellLibC = %NovellLibC% +@echo --------------------- + +:CheckNDK +if exist %NovellLibC%\include\netware.h goto NDKOK +@echo The path to the NDK "%NovellLibC%" is invalid. +@echo Please set then NovellLibC environment variable to the location of the NDK +@echo --------------------- +goto Done + +:NDKOK +@echo # As part of the pre-build process, the utility GenURI.NLM +@echo # (Gen URI Delims) must be built, copied to a NetWare server +@echo # and run using the following command: +@echo # +@echo # "sys:\genuri >sys:\uri_delims.h" +@echo # +@echo # The file "sys:\uri_delims.h" must then be copied to +@echo # "apr-util\uri\uri_delims.h" on the build machine. + +@echo Fixing up the APR headers +copy ..\include\apr.hnw ..\include\apr.h + +@echo Fixing up the APR-Util headers +copy ..\..\apr-util\include\apu.hnw ..\..\apr-util\include\apu.h +copy ..\..\apr-util\include\apu_want.hnw ..\..\apr-util\include\apu_want.h +copy ..\..\apr-util\include\apr_ldap.hnw ..\..\apr-util\include\apr_ldap.h +copy ..\..\apr-util\include\private\apu_config.hw ..\..\apr-util\include\private\apu_config.h +copy ..\..\apr-util\xml\expat\lib\expat.h.in ..\..\apr-util\xml\expat\lib\expat.h +copy ..\..\apr-util\xml\expat\lib\config.hnw ..\..\apr-util\xml\expat\lib\config.h +copy ..\..\apr-util\include\private\apu_select_dbm.hw ..\..\apr-util\include\private\apu_select_dbm.h + +@echo Fixing up the pcre headers +copy ..\..\pcre\config.hw ..\..\pcre\config.h +copy ..\..\pcre\pcre.hw ..\..\pcre\pcre.h + +@echo Generating the import list... +set MWCIncludes=..\include;..\include\arch\netware;..\include\arch\unix;..\..\apr-util\include;+%NovellLibC% +mwccnlm -P nw_export.inc -d NETWARE -EP +awk -f make_nw_export.awk nw_export.i |sort >..\aprlib.imp + +:Done +pause diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/build/rpm/apr.spec.in b/rubbos/app/httpd-2.0.64/srclib/apr/build/rpm/apr.spec.in new file mode 100644 index 00000000..dd0c2735 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/build/rpm/apr.spec.in @@ -0,0 +1,105 @@ + +%define aprver 0 + +Summary: Apache Portable Runtime library +Name: apr +Version: APR_VERSION +Release: APR_RELEASE +License: Apache Software License +Group: System Environment/Libraries +URL: http://apr.apache.org/ +Source0: %{name}-%{version}.tar.gz +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot +BuildPrereq: autoconf, libtool, doxygen + +%description +The mission of the Apache Portable Runtime (APR) is to provide a +free library of C data structures and routines, forming a system +portability layer to as many operating systems as possible, +including Unices, MS Win32, BeOS and OS/2. + +%package devel +Group: Development/Libraries +Summary: APR library development kit +Requires: apr = %{version} + +%description devel +This package provides the support files which can be used to +build applications using the APR library. The mission of the +Apache Portable Runtime (APR) is to provide a free library of +C data structures and routines. + +%prep +%setup -q + +%build +# regenerate configure script etc. +./buildconf +%configure \ + --prefix=/usr \ + --includedir=%{_includedir}/apr-%{aprver} \ + --with-installbuilddir=%{_libdir}/apr/build-%{aprver} \ + --with-devrandom=/dev/urandom \ + CC=gcc CXX=g++ +make %{?_smp_mflags} && make dox + +%check +# Run non-interactive tests +pushd test +make %{?_smp_mflags} testall CFLAGS=-fno-strict-aliasing +#./testall -v || exit 1 +popd + +%install +rm -rf $RPM_BUILD_ROOT +make install DESTDIR=$RPM_BUILD_ROOT + +# Move docs to more convenient location +mv docs/dox/html html + +# Copy helper files for apr-util +#mkdir $RPM_BUILD_ROOT%{_libdir}/apr/build-%{aprver} +cp build/apr_common.m4 build/find_apr.m4 build/install.sh \ + build/config.guess build/config.sub \ + $RPM_BUILD_ROOT%{_libdir}/apr/build-%{aprver} + +# Unpackaged files: +rm -f $RPM_BUILD_ROOT%{_libdir}/apr.exp + +%clean +rm -rf $RPM_BUILD_ROOT + +%post -p /sbin/ldconfig + +%postun -p /sbin/ldconfig + +%files +%defattr(-,root,root,-) +%doc CHANGES LICENSE NOTICE +%{_libdir}/libapr-%{aprver}.so.* + +%files devel +%defattr(-,root,root,-) +%doc docs/APRDesign.html docs/canonical_filenames.html +%doc docs/incomplete_types docs/non_apr_programs +%doc --parents html +%{_bindir}/apr*config +%{_libdir}/libapr-%{aprver}.*a +%{_libdir}/libapr-%{aprver}.so +%dir %{_libdir}/apr +%dir %{_libdir}/apr/build-%{aprver} +%{_libdir}/apr/build-%{aprver}/* +#%{_libdir}/pkgconfig/apr-%{aprver}.pc +%dir %{_includedir}/apr-%{aprver} +%{_includedir}/apr-%{aprver}/*.h + +%changelog +* Mon Dec 13 2004 Graham Leggett 0.9.6-1 +- backport to support v0.9.6 of APR + +* Tue Jun 22 2004 Graham Leggett 1.0.0-1 +- update to support v1.0.0 of APR + +* Tue Jun 22 2004 Graham Leggett 1.0.0-1 +- derived from Fedora Core apr.spec + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/build/win32ver.awk b/rubbos/app/httpd-2.0.64/srclib/apr/build/win32ver.awk new file mode 100644 index 00000000..e41811df --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/build/win32ver.awk @@ -0,0 +1,117 @@ +BEGIN { + + # ff bits: 1(debug), 2(prerelease), 4(patched), 8(vendor) and 32(special) + # debug is summed based on the /Define _DEBUG + # prerelease is based on the -dev extension, + # patched is based on a non-standard "-ver" extension, + # special and vendor are toggled by their args. + # + ff = 0; + + file=ARGV[1]; + desc=ARGV[2]; + rel_h=ARGV[3]; + + filename = file; + if (match(file, /\./)) { + sub(/\.[^\.]*$/, "", file); + } + + i = 4; + while (length(ARGV[i])) { + if (match(ARGV[i], /icon=/)) { + icon = substr(ARGV[i], 6); + } + if (match(ARGV[i], /vendor=/)) { + vendor = substr(ARGV[i], 8); + ff = ff + 8; + } + if (match(ARGV[i], /special=/)) { + special = substr(ARGV[i], 9); + ff = ff + 32; + } + i = i + 1 + } + + i = i - 1; + while (i) { + delete ARGV[i]; + i = i - 1; + } + + while ((getline < rel_h) > 0) { + if (match ($0, /^#define AP_SERVER_BASEREVISION "[^"]+"/)) { + ver = substr($0, RSTART + 32, RLENGTH - 33); + } + } + if (ver) { + verc = ver; + gsub(/\./, ",", verc); + if (build) { + sub(/-.*/, "", verc) + verc = verc "," build; + } else if (sub(/-dev/, ",0", verc)) { + ff = ff + 2; + } else if (!sub(/-alpha/, ",10", verc) \ + && !sub(/-beta/, ",100", verc) \ + && !sub(/-gold/, ",200", verc)) { + sub(/-.*/, "", verc); + verc = verc "," 0; + } + } else { +# XXX Gotta fix this for non-httpd installs :( + ver = "0.0.0.0" + verc = "0,0,0,0" + ff = ff + 2; + } + + if (length(vendor)) { + ff = ff + 8; + } + + if (length(icon)) { + print "1 ICON DISCARDABLE \"" icon "\""; + } + print "1 VERSIONINFO"; + print " FILEVERSION " verc ""; + print " PRODUCTVERSION " verc ""; + print " FILEFLAGSMASK 0x3fL"; + print "#if defined(_DEBUG)" + print " FILEFLAGS 0x" sprintf("%02x", ff + 1) "L"; + print "#else" + print " FILEFLAGS 0x" sprintf("%02x", ff) "L"; + print "#endif" + print " FILEOS 0x40004L"; + print " FILETYPE 0x1L"; + print " FILESUBTYPE 0x0L"; + print "BEGIN"; + print " BLOCK \"StringFileInfo\""; + print " BEGIN"; + print " BLOCK \"040904b0\""; + print " BEGIN"; + print " VALUE \"Comments\", \"All rights reserved. The "\ + "license is available at . "\ + "The APR project pages are at .\\0\""; + print " VALUE \"CompanyName\", \"Apache Software Foundation\\0\""; + print " VALUE \"FileDescription\", \"" desc "\\0\""; + print " VALUE \"FileVersion\", \"" ver "\\0\""; + print " VALUE \"InternalName\", \"" file "\\0\""; + print " VALUE \"LegalCopyright\", \"Copyright © 2000-2003 "\ + "The Apache Software Foundation.\\0\""; + print " VALUE \"OriginalFilename\", \"" filename "\\0\""; + if (vendor) { + print " VALUE \"PrivateBuild\", \"" vendor "\\0\""; + } + if (special) { + print " VALUE \"SpecialBuild\", \"" vendor "\\0\""; + } + print " VALUE \"ProductName\", \"Apache Portable Runtime\\0\""; + print " VALUE \"ProductVersion\", \"" ver "\\0\""; + print " END"; + print " END"; + print " BLOCK \"VarFileInfo\""; + print " BEGIN"; + print " VALUE \"Translation\", 0x409, 1200"; + print " END"; + print "END"; +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/buildconf b/rubbos/app/httpd-2.0.64/srclib/apr/buildconf new file mode 100755 index 00000000..2afd04de --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/buildconf @@ -0,0 +1,91 @@ +#!/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. +# +# + +# buildconf: Build the support scripts needed to compile from a +# checked-out version of the source code. + +# Verify that the builder has the right config tools installed +# +build/buildcheck.sh || exit 1 + +libtoolize=`build/PrintPath glibtoolize libtoolize` +if [ "x$libtoolize" = "x" ]; then + echo "libtoolize not found in path" + exit 1 +fi + +# Create the libtool helper files +# +# Note: we copy (rather than link) them to simplify distribution. +# Note: APR supplies its own config.guess and config.sub -- we do not +# rely on libtool's versions +# +echo "Copying libtool helper files ..." + +# 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 libtool.m4) + +$libtoolize --copy --automake + +ltpath=`dirname $libtoolize` +ltfile=${LIBTOOL_M4-`cd $ltpath/../share/aclocal ; pwd`/libtool.m4} + +if [ ! -f $ltfile ]; then + echo "$ltfile not found" + exit 1 +fi + +echo "buildconf: Using libtool.m4 at ${ltfile}." + +cat $ltfile | sed -e 's/LIBTOOL=\(.*\)top_build/LIBTOOL=\1apr_build/' > build/libtool.m4 + +# This is just temporary until people's workspaces are cleared -- remove +# any old aclocal.m4 left over from prior build so it doesn't cause errors. +rm -f aclocal.m4 + +# +# Generate the autoconf header and ./configure +# +echo "Creating include/arch/unix/apr_private.h.in ..." +${AUTOHEADER:-autoheader} + +echo "Creating configure ..." +### do some work to toss config.cache? +${AUTOCONF:-autoconf} + +# Remove autoconf 2.5x's cache directory +rm -rf autom4te*.cache + +# Create RPM Spec file +if [ -f `which cut` ]; then + echo rebuilding rpm spec file + ( REVISION=`build/get-version.sh all include/apr_version.h APR` + 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/apr.spec.in | \ + sed -e "s/APR_VERSION/$VERSION/" \ + -e "s/APR_RELEASE/$RELEASE/" \ + > apr.spec ) +fi + +exit 0 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/config.layout b/rubbos/app/httpd-2.0.64/srclib/apr/config.layout new file mode 100644 index 00000000..731710bd --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/config.layout @@ -0,0 +1,231 @@ +## +## 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 `apr' +## - a trailing plus character (`+') on paths is replaced with a +## `/' suffix where is currently hardcoded to 'apr'. +## (This may become a configurable parameter at some point.) +## + +# Classical APR path layout designed for parallel installs. + + prefix: /usr/local/apr + 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 + includedir: ${prefix}/include/apr-${APR_MAJOR_VERSION} + localstatedir: ${prefix} + libsuffix: -${APR_MAJOR_VERSION} + + +# Classical single-installation APR path layout. + + prefix: /usr/local/apr + 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 + includedir: ${prefix}/include + localstatedir: ${prefix} + + +# 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 + includedir: ${prefix}/include+ + localstatedir: ${prefix}/var+ + runtimedir: ${localstatedir}/run + + +# 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/apr/Modules + mandir: ${exec_prefix}/share/man + sysconfdir: ${prefix}/Configuration + datadir: ${prefix} + installbuilddir: /System/Library/apr/Build + includedir: /System/Library/Frameworks/apr.framework/Versions/2.0/Headers + localstatedir: /var + runtimedir: ${prefix}/Logs + + +# 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 + includedir: ${prefix}/include+ + localstatedir: /var + runtimedir: ${localstatedir}/run + + +# Red Hat Linux 7.x layout + + prefix: /usr + exec_prefix: ${prefix} + bindir: ${prefix}/bin + sbindir: ${prefix}/sbin + libdir: ${prefix}/lib + libexecdir: ${prefix}/lib/apr + mandir: ${prefix}/man + sysconfdir: /etc/httpd/conf + datadir: /var/www + installbuilddir: ${datadir}/build + includedir: ${prefix}/include/apr + localstatedir: /var + runtimedir: ${localstatedir}/run + + +# According to the /opt filesystem conventions + + prefix: /opt/apr + 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 + includedir: ${prefix}/include + localstatedir: /var${prefix} + runtimedir: ${localstatedir}/run + + +# BeOS layout... + + prefix: /boot/home/apr + exec_prefix: ${prefix} + bindir: ${exec_prefix}/bin + sbindir: ${exec_prefix}/bin + libdir: ${exec_prefix}/lib + libexecdir: ${exec_prefix}/libexec + mandir: ${prefix}/man + sysconfdir: ${prefix}/conf + datadir: ${prefix} + installbuilddir: ${datadir}/build + includedir: ${prefix}/include + localstatedir: ${prefix} + runtimedir: ${localstatedir}/logs + + +# SuSE 6.x layout + + prefix: /usr + exec_prefix: ${prefix} + bindir: ${prefix}/bin + sbindir: ${prefix}/sbin + libdir: ${prefix}/lib + libexecdir: ${prefix}/lib/apr + mandir: ${prefix}/share/man + sysconfdir: /etc/httpd + datadir: /usr/local/httpd + installbuilddir: ${datadir}/build + includedir: ${prefix}/include/apr + localstatedir: /var/lib/httpd + runtimedir: /var/run + + +# 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/apr + mandir: ${exec_prefix}/man + sysconfdir: ${prefix}/conf + datadir: ${prefix} + installbuilddir: ${datadir}/build + includedir: ${exec_prefix}/include/apr + localstatedir: /var + runtimedir: ${localstatedir}/run + + +# Solaris 8 Layout + + prefix: /usr/apr + 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/apr + datadir: /var/apr + installbuilddir: ${datadir}/build + includedir: ${exec_prefix}/include + localstatedir: ${prefix} + runtimedir: /var/run + + +# OpenBSD Layout + + prefix: /var/www + exec_prefix: /usr + bindir: ${exec_prefix}/bin + sbindir: ${exec_prefix}/sbin + libdir: ${exec_prefix}/lib + libexecdir: ${exec_prefix}/lib/apr/modules + mandir: ${exec_prefix}/share/man + sysconfdir: ${prefix}/conf + datadir: ${prefix} + installbuilddir: ${prefix}/build + includedir: ${exec_prefix}/lib/apr/include + localstatedir: ${prefix} + runtimedir: ${prefix}/logs + + +# Debian layout + + prefix: + exec_prefix: ${prefix}/usr + bindir: ${exec_prefix}/bin + sbindir: ${exec_prefix}/sbin + libdir: ${exec_prefix}/lib + libexecdir: ${exec_prefix}/lib/apr/modules + mandir: ${exec_prefix}/share/man + datadir: ${exec_prefix}/share/apr + includedir: ${exec_prefix}/include/apr-${APR_MAJOR_VERSION} + localstatedir: ${prefix}/var/run + runtimedir: ${prefix}/var/run + infodir: ${exec_prefix}/share/info + libsuffix: -${APR_MAJOR_VERSION} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/config.log b/rubbos/app/httpd-2.0.64/srclib/apr/config.log new file mode 100644 index 00000000..ab60c1ba --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/config.log @@ -0,0 +1,12911 @@ +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by configure, which was +generated by GNU Autoconf 2.63. Invocation command line was + + $ /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/configure --disable-option-checking --prefix=/bottlenecks/rubbos/app/apache2 --enable-module=so --enable-so --with-mpm=worker --cache-file=/dev/null --srcdir=/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr --prefix=/bottlenecks/rubbos/app/apache2 --exec-prefix=/bottlenecks/rubbos/app/apache2 --libdir=${prefix}/lib --includedir=/bottlenecks/rubbos/app/apache2/include --bindir=${prefix}/bin --datadir=/bottlenecks/rubbos/app/apache2 --with-installbuilddir=${prefix}/build + +## --------- ## +## Platform. ## +## --------- ## + +hostname = ubuntu +uname -m = x86_64 +uname -r = 3.16.0-30-generic +uname -s = Linux +uname -v = #40~14.04.1-Ubuntu SMP Thu Jan 15 17:43:14 UTC 2015 + +/usr/bin/uname -p = unknown +/bin/uname -X = unknown + +/bin/arch = unknown +/usr/bin/arch -k = unknown +/usr/convex/getsysinfo = unknown +/usr/bin/hostinfo = unknown +/bin/machine = unknown +/usr/bin/oslevel = unknown +/bin/universe = unknown + +PATH: /bottlenecks/rubbos/app/jdk1.6.0_27/bin +PATH: /bin/unix +PATH: /bottlenecks/rubbos/app/apache-ant-1.6.5/bin +PATH: /bottlenecks/rubbos/app/apache-tomcat-5.5.17/bin +PATH: /usr/local/sbin +PATH: /usr/local/bin +PATH: /usr/sbin +PATH: /usr/bin +PATH: /sbin +PATH: /bin +PATH: /usr/games +PATH: /usr/local/games + + +## ----------- ## +## Core tests. ## +## ----------- ## + +configure:2931: checking build system type +configure:2949: result: x86_64-unknown-linux-gnu +configure:2971: checking host system type +configure:2986: result: x86_64-unknown-linux-gnu +configure:3008: checking target system type +configure:3023: result: x86_64-unknown-linux-gnu +configure:3087: checking for working mkdir -p +configure:3103: result: yes +configure:3188: checking for chosen layout +configure:3190: result: apr +configure:3457: checking for gcc +configure:3473: found /usr/bin/gcc +configure:3484: result: gcc +configure:3716: checking for C compiler version +configure:3724: gcc --version >&5 +gcc (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4 +Copyright (C) 2013 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. + +configure:3728: $? = 0 +configure:3735: gcc -v >&5 +Using built-in specs. +COLLECT_GCC=gcc +COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper +Target: x86_64-linux-gnu +Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.8.4-2ubuntu1~14.04' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.8 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu +Thread model: posix +gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04) +configure:3739: $? = 0 +configure:3746: gcc -V >&5 +gcc: error: unrecognized command line option '-V' +gcc: fatal error: no input files +compilation terminated. +configure:3750: $? = 4 +configure:3773: checking for C compiler default output file name +configure:3795: gcc conftest.c >&5 +configure:3799: $? = 0 +configure:3837: result: a.out +configure:3856: checking whether the C compiler works +configure:3866: ./a.out +configure:3870: $? = 0 +configure:3889: result: yes +configure:3896: checking whether we are cross compiling +configure:3898: result: no +configure:3901: checking for suffix of executables +configure:3908: gcc -o conftest conftest.c >&5 +configure:3912: $? = 0 +configure:3938: result: +configure:3944: checking for suffix of object files +configure:3970: gcc -c conftest.c >&5 +configure:3974: $? = 0 +configure:3999: result: o +configure:4003: checking whether we are using the GNU C compiler +configure:4032: gcc -c conftest.c >&5 +configure:4039: $? = 0 +configure:4056: result: yes +configure:4065: checking whether gcc accepts -g +configure:4095: gcc -c -g conftest.c >&5 +configure:4102: $? = 0 +configure:4203: result: yes +configure:4220: checking for gcc option to accept ISO C89 +configure:4294: gcc -c -g -O2 conftest.c >&5 +configure:4301: $? = 0 +configure:4324: result: none needed +configure:7489: checking whether make sets $(MAKE) +configure:7511: result: yes +configure:7525: checking how to run the C preprocessor +configure:7565: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +configure:7572: $? = 0 +configure:7603: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +conftest.c:8:28: fatal error: ac_nonexistent.h: No such file or directory + #include + ^ +compilation terminated. +configure:7610: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| /* end confdefs.h. */ +| #include +configure:7643: result: gcc -E +configure:7672: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +configure:7679: $? = 0 +configure:7710: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +conftest.c:8:28: fatal error: ac_nonexistent.h: No such file or directory + #include + ^ +compilation terminated. +configure:7717: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| /* end confdefs.h. */ +| #include +configure:7760: checking for gawk +configure:7776: found /usr/bin/gawk +configure:7787: result: gawk +configure:7798: checking whether ln -s works +configure:7802: result: yes +configure:7852: checking for ranlib +configure:7868: found /usr/bin/ranlib +configure:7879: result: ranlib +configure:7915: checking for a BSD-compatible install +configure:7983: result: /usr/bin/install -c +configure:7996: checking for rm +configure:8012: found /bin/rm +configure:8023: result: rm +configure:8033: checking for as +configure:8049: found /usr/bin/as +configure:8060: result: as +configure:8070: checking for cpp +configure:8086: found /usr/bin/cpp +configure:8097: result: cpp +configure:8148: checking for ar +configure:8164: found /usr/bin/ar +configure:8175: result: ar +configure:8201: checking for grep that handles long lines and -e +configure:8261: result: /bin/grep +configure:8266: checking for egrep +configure:8330: result: /bin/grep -E +configure:8335: checking for ANSI C header files +configure:8365: gcc -c -g -O2 -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:8372: $? = 0 +configure:8471: gcc -o conftest -g -O2 -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:8475: $? = 0 +configure:8481: ./conftest +configure:8485: $? = 0 +configure:8503: result: yes +configure:8527: checking for sys/types.h +configure:8548: gcc -c -g -O2 -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:8555: $? = 0 +configure:8572: result: yes +configure:8527: checking for sys/stat.h +configure:8548: gcc -c -g -O2 -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:8555: $? = 0 +configure:8572: result: yes +configure:8527: checking for stdlib.h +configure:8548: gcc -c -g -O2 -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:8555: $? = 0 +configure:8572: result: yes +configure:8527: checking for string.h +configure:8548: gcc -c -g -O2 -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:8555: $? = 0 +configure:8572: result: yes +configure:8527: checking for memory.h +configure:8548: gcc -c -g -O2 -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:8555: $? = 0 +configure:8572: result: yes +configure:8527: checking for strings.h +configure:8548: gcc -c -g -O2 -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:8555: $? = 0 +configure:8572: result: yes +configure:8527: checking for inttypes.h +configure:8548: gcc -c -g -O2 -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:8555: $? = 0 +configure:8572: result: yes +configure:8527: checking for stdint.h +configure:8548: gcc -c -g -O2 -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:8555: $? = 0 +configure:8572: result: yes +configure:8527: checking for unistd.h +configure:8548: gcc -c -g -O2 -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:8555: $? = 0 +configure:8572: result: yes +configure:8597: checking minix/config.h usability +configure:8614: gcc -c -g -O2 -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +conftest.c:51:26: fatal error: minix/config.h: No such file or directory + #include + ^ +compilation terminated. +configure:8621: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| /* end confdefs.h. */ +| #include +| #ifdef HAVE_SYS_TYPES_H +| # include +| #endif +| #ifdef HAVE_SYS_STAT_H +| # include +| #endif +| #ifdef STDC_HEADERS +| # include +| # include +| #else +| # ifdef HAVE_STDLIB_H +| # include +| # endif +| #endif +| #ifdef HAVE_STRING_H +| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H +| # include +| # endif +| # include +| #endif +| #ifdef HAVE_STRINGS_H +| # include +| #endif +| #ifdef HAVE_INTTYPES_H +| # include +| #endif +| #ifdef HAVE_STDINT_H +| # include +| #endif +| #ifdef HAVE_UNISTD_H +| # include +| #endif +| #include +configure:8635: result: no +configure:8639: checking minix/config.h presence +configure:8654: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +conftest.c:18:26: fatal error: minix/config.h: No such file or directory + #include + ^ +compilation terminated. +configure:8661: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| /* end confdefs.h. */ +| #include +configure:8675: result: no +configure:8703: checking for minix/config.h +configure:8710: result: no +configure:8741: checking whether it is safe to define __EXTENSIONS__ +configure:8769: gcc -c -g -O2 -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:8776: $? = 0 +configure:8791: result: yes +configure:8817: checking for library containing strerror +configure:8858: gcc -o conftest -g -O2 -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:8865: $? = 0 +configure:8896: result: none required +configure:8905: checking whether system uses EBCDIC +configure:8934: gcc -o conftest -g -O2 -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:8938: $? = 0 +configure:8944: ./conftest +configure:8948: $? = 1 +configure: program exited with status 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| /* end confdefs.h. */ +| +| int main(void) { +| return (unsigned char)'A' != (unsigned char)0xC1; +| } +| +configure:8969: result: no +configure:9087: checking for a sed that does not truncate output +configure:9143: result: /bin/sed +configure:9157: checking for ld used by gcc +configure:9224: result: /usr/bin/ld +configure:9233: checking if the linker (/usr/bin/ld) is GNU ld +configure:9248: result: yes +configure:9253: checking for /usr/bin/ld option to reload object files +configure:9260: result: -r +configure:9278: checking for BSD-compatible nm +configure:9327: result: /usr/bin/nm -B +configure:9331: checking how to recognize dependent libraries +configure:9517: result: pass_all +configure:9605: gcc -c -g -O2 -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:9608: $? = 0 +configure:9777: checking dlfcn.h usability +configure:9794: gcc -c -g -O2 -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:9801: $? = 0 +configure:9815: result: yes +configure:9819: checking dlfcn.h presence +configure:9834: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +configure:9841: $? = 0 +configure:9855: result: yes +configure:9883: checking for dlfcn.h +configure:9892: result: yes +configure:9965: checking for g++ +configure:9981: found /usr/bin/g++ +configure:9992: result: g++ +configure:10019: checking for C++ compiler version +configure:10027: g++ --version >&5 +g++ (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4 +Copyright (C) 2013 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. + +configure:10031: $? = 0 +configure:10038: g++ -v >&5 +Using built-in specs. +COLLECT_GCC=g++ +COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper +Target: x86_64-linux-gnu +Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.8.4-2ubuntu1~14.04' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.8 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu +Thread model: posix +gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04) +configure:10042: $? = 0 +configure:10049: g++ -V >&5 +g++: error: unrecognized command line option '-V' +g++: fatal error: no input files +compilation terminated. +configure:10053: $? = 4 +configure:10056: checking whether we are using the GNU C++ compiler +configure:10085: g++ -c -D_REENTRANT -D_GNU_SOURCE conftest.cpp >&5 +configure:10092: $? = 0 +configure:10109: result: yes +configure:10118: checking whether g++ accepts -g +configure:10148: g++ -c -g -D_REENTRANT -D_GNU_SOURCE conftest.cpp >&5 +configure:10155: $? = 0 +configure:10256: result: yes +configure:10289: checking how to run the C++ preprocessor +configure:10325: g++ -E -D_REENTRANT -D_GNU_SOURCE conftest.cpp +configure:10332: $? = 0 +configure:10363: g++ -E -D_REENTRANT -D_GNU_SOURCE conftest.cpp +conftest.cpp:24:28: fatal error: ac_nonexistent.h: No such file or directory + #include + ^ +compilation terminated. +configure:10370: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| /* end confdefs.h. */ +| #include +configure:10403: result: g++ -E +configure:10432: g++ -E -D_REENTRANT -D_GNU_SOURCE conftest.cpp +configure:10439: $? = 0 +configure:10470: g++ -E -D_REENTRANT -D_GNU_SOURCE conftest.cpp +conftest.cpp:24:28: fatal error: ac_nonexistent.h: No such file or directory + #include + ^ +compilation terminated. +configure:10477: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| /* end confdefs.h. */ +| #include +configure:10572: checking for g77 +configure:10602: result: no +configure:10572: checking for xlf +configure:10602: result: no +configure:10572: checking for f77 +configure:10602: result: no +configure:10572: checking for frt +configure:10602: result: no +configure:10572: checking for pgf77 +configure:10602: result: no +configure:10572: checking for cf77 +configure:10602: result: no +configure:10572: checking for fort77 +configure:10602: result: no +configure:10572: checking for fl32 +configure:10602: result: no +configure:10572: checking for af77 +configure:10602: result: no +configure:10572: checking for xlf90 +configure:10602: result: no +configure:10572: checking for f90 +configure:10602: result: no +configure:10572: checking for pgf90 +configure:10602: result: no +configure:10572: checking for pghpf +configure:10602: result: no +configure:10572: checking for epcf90 +configure:10602: result: no +configure:10572: checking for gfortran +configure:10602: result: no +configure:10572: checking for g95 +configure:10602: result: no +configure:10572: checking for xlf95 +configure:10602: result: no +configure:10572: checking for f95 +configure:10602: result: no +configure:10572: checking for fort +configure:10602: result: no +configure:10572: checking for ifort +configure:10602: result: no +configure:10572: checking for ifc +configure:10602: result: no +configure:10572: checking for efc +configure:10602: result: no +configure:10572: checking for pgf95 +configure:10602: result: no +configure:10572: checking for lf95 +configure:10602: result: no +configure:10572: checking for ftn +configure:10602: result: no +configure:10625: checking for Fortran 77 compiler version +configure:10633: --version >&5 +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/configure: line 10635: --version: command not found +configure:10637: $? = 127 +configure:10644: -v >&5 +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/configure: line 10646: -v: command not found +configure:10648: $? = 127 +configure:10655: -V >&5 +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/configure: line 10657: -V: command not found +configure:10659: $? = 127 +configure:10667: checking whether we are using the GNU Fortran 77 compiler +configure:10686: -c conftest.F >&5 +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/configure: line 10688: -c: command not found +configure:10693: $? = 127 +configure: failed program was: +| program main +| #ifndef __GNUC__ +| choke me +| #endif +| +| end +configure:10710: result: no +configure:10716: checking whether accepts -g +configure:10733: -c -g conftest.f >&5 +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/configure: line 10735: -c: command not found +configure:10740: $? = 127 +configure: failed program was: +| program main +| +| end +configure:10756: result: no +configure:10789: checking the maximum length of command line arguments +configure:10901: result: 1572864 +configure:10913: checking command to parse /usr/bin/nm -B output from gcc object +configure:11018: gcc -c -g -O2 -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:11021: $? = 0 +configure:11025: /usr/bin/nm -B conftest.o \| sed -n -e 's/^.*[ ]\([ABCDGIRSTW][ABCDGIRSTW]*\)[ ][ ]*\([_A-Za-z][_A-Za-z0-9]*\)$/\1 \2 \2/p' \> conftest.nm +configure:11028: $? = 0 +configure:11080: gcc -o conftest -g -O2 -D_REENTRANT -D_GNU_SOURCE conftest.c conftstm.o >&5 +configure:11083: $? = 0 +configure:11121: result: ok +configure:11125: checking for objdir +configure:11140: result: .libs +configure:11232: checking for ar +configure:11259: result: ar +configure:11324: checking for ranlib +configure:11351: result: ranlib +configure:11416: checking for strip +configure:11432: found /usr/bin/strip +configure:11443: result: strip +configure:12037: checking if gcc supports -fno-rtti -fno-exceptions +configure:12055: gcc -c -g -O2 -D_REENTRANT -D_GNU_SOURCE -fno-rtti -fno-exceptions conftest.c >&5 +cc1: warning: command line option '-fno-rtti' is valid for C++/ObjC++ but not for C [enabled by default] +configure:12059: $? = 0 +configure:12072: result: no +configure:12087: checking for gcc option to produce PIC +configure:12319: result: -fPIC +configure:12327: checking if gcc PIC flag -fPIC works +configure:12345: gcc -c -g -O2 -D_REENTRANT -D_GNU_SOURCE -fPIC -DPIC conftest.c >&5 +configure:12349: $? = 0 +configure:12362: result: yes +configure:12390: checking if gcc static flag -static works +configure:12418: result: yes +configure:12428: checking if gcc supports -c -o file.o +configure:12449: gcc -c -g -O2 -D_REENTRANT -D_GNU_SOURCE -o out/conftest2.o conftest.c >&5 +configure:12453: $? = 0 +configure:12475: result: yes +configure:12501: checking whether the gcc linker (/usr/bin/ld -m elf_x86_64) supports shared libraries +configure:13489: result: yes +configure:13510: checking whether -lc should be explicitly linked in +configure:13515: gcc -c -g -O2 -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:13518: $? = 0 +configure:13533: gcc -shared conftest.o -v -Wl,-soname -Wl,conftest -o conftest 2\>\&1 \| grep -lc \>/dev/null 2\>\&1 +configure:13536: $? = 0 +configure:13548: result: no +configure:13556: checking dynamic linker characteristics +configure:14160: result: GNU/Linux ld.so +configure:14184: checking how to hardcode library paths into programs +configure:14209: result: immediate +configure:14223: checking whether stripping libraries is possible +configure:14228: result: yes +configure:15058: checking if libtool supports shared libraries +configure:15060: result: yes +configure:15063: checking whether to build shared libraries +configure:15084: result: yes +configure:15087: checking whether to build static libraries +configure:15091: result: yes +configure:15185: creating libtool +configure:15778: checking for ld used by g++ +configure:15845: result: /usr/bin/ld -m elf_x86_64 +configure:15854: checking if the linker (/usr/bin/ld -m elf_x86_64) is GNU ld +configure:15869: result: yes +configure:15920: checking whether the g++ linker (/usr/bin/ld -m elf_x86_64) supports shared libraries +configure:16874: result: yes +configure:16895: g++ -c -g -O2 -D_REENTRANT -D_GNU_SOURCE conftest.cpp >&5 +configure:16898: $? = 0 +configure:17054: checking for g++ option to produce PIC +configure:17338: result: -fPIC +configure:17346: checking if g++ PIC flag -fPIC works +configure:17364: g++ -c -g -O2 -D_REENTRANT -D_GNU_SOURCE -fPIC -DPIC conftest.cpp >&5 +configure:17368: $? = 0 +configure:17381: result: yes +configure:17409: checking if g++ static flag -static works +configure:17437: result: yes +configure:17447: checking if g++ supports -c -o file.o +configure:17468: g++ -c -g -O2 -D_REENTRANT -D_GNU_SOURCE -o out/conftest2.o conftest.cpp >&5 +configure:17472: $? = 0 +configure:17494: result: yes +configure:17520: checking whether the g++ linker (/usr/bin/ld -m elf_x86_64) supports shared libraries +configure:17546: result: yes +configure:17613: checking dynamic linker characteristics +configure:18165: result: GNU/Linux ld.so +configure:18189: checking how to hardcode library paths into programs +configure:18214: result: immediate +configure:25518: checking for res_init in -lresolv +configure:25553: gcc -o conftest -g -O2 -D_REENTRANT -D_GNU_SOURCE conftest.c -lresolv >&5 +/tmp/cc8dGFK1.o: In function `main': +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/conftest.c:35: undefined reference to `res_init' +collect2: error: ld returned 1 exit status +configure:25560: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| /* 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. */ +| #ifdef __cplusplus +| extern "C" +| #endif +| char res_init (); +| int +| main () +| { +| return res_init (); +| ; +| return 0; +| } +configure:25581: result: no +configure:25593: checking for gethostbyname in -lnsl +configure:25628: gcc -o conftest -g -O2 -D_REENTRANT -D_GNU_SOURCE conftest.c -lnsl >&5 +configure:25635: $? = 0 +configure:25656: result: yes +configure:25667: checking for library containing gethostname +configure:25708: gcc -o conftest -g -O2 -D_REENTRANT -D_GNU_SOURCE conftest.c -lnsl >&5 +configure:25715: $? = 0 +configure:25746: result: none required +configure:25755: checking for socket in -lsocket +configure:25790: gcc -o conftest -g -O2 -D_REENTRANT -D_GNU_SOURCE conftest.c -lsocket -lnsl >&5 +/usr/bin/ld: cannot find -lsocket +collect2: error: ld returned 1 exit status +configure:25797: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| /* 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. */ +| #ifdef __cplusplus +| extern "C" +| #endif +| char socket (); +| int +| main () +| { +| return socket (); +| ; +| return 0; +| } +configure:25818: result: no +configure:25829: checking for library containing crypt +configure:25870: gcc -o conftest -g -O2 -D_REENTRANT -D_GNU_SOURCE conftest.c -lnsl >&5 +/tmp/ccTRafjf.o: In function `main': +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/conftest.c:36: undefined reference to `crypt' +collect2: error: ld returned 1 exit status +configure:25877: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| /* 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. */ +| #ifdef __cplusplus +| extern "C" +| #endif +| char crypt (); +| int +| main () +| { +| return crypt (); +| ; +| return 0; +| } +configure:25870: gcc -o conftest -g -O2 -D_REENTRANT -D_GNU_SOURCE conftest.c -lcrypt -lnsl >&5 +configure:25877: $? = 0 +configure:25908: result: -lcrypt +configure:25917: checking for main in -ltruerand +configure:25946: gcc -o conftest -g -O2 -D_REENTRANT -D_GNU_SOURCE conftest.c -ltruerand -lcrypt -lnsl >&5 +/usr/bin/ld: cannot find -ltruerand +collect2: error: ld returned 1 exit status +configure:25953: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| /* end confdefs.h. */ +| +| +| int +| main () +| { +| return main (); +| ; +| return 0; +| } +configure:25974: result: no +configure:25985: checking for library containing modf +configure:26026: gcc -o conftest -g -O2 -D_REENTRANT -D_GNU_SOURCE conftest.c -lcrypt -lnsl >&5 +conftest.c:32:6: warning: conflicting types for built-in function 'modf' [enabled by default] + char modf (); + ^ +configure:26033: $? = 0 +configure:26064: result: none required +configure:26072: checking for library containing sqrt +configure:26113: gcc -o conftest -g -O2 -D_REENTRANT -D_GNU_SOURCE conftest.c -lcrypt -lnsl >&5 +conftest.c:32:6: warning: conflicting types for built-in function 'sqrt' [enabled by default] + char sqrt (); + ^ +/tmp/cciET2lf.o: In function `main': +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/conftest.c:36: undefined reference to `sqrt' +collect2: error: ld returned 1 exit status +configure:26120: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| /* 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. */ +| #ifdef __cplusplus +| extern "C" +| #endif +| char sqrt (); +| int +| main () +| { +| return sqrt (); +| ; +| return 0; +| } +configure:26113: gcc -o conftest -g -O2 -D_REENTRANT -D_GNU_SOURCE conftest.c -lm -lcrypt -lnsl >&5 +conftest.c:32:6: warning: conflicting types for built-in function 'sqrt' [enabled by default] + char sqrt (); + ^ +configure:26120: $? = 0 +configure:26151: result: -lm +configure:26187: checking pthread.h usability +configure:26204: gcc -c -g -O2 -D_REENTRANT -D_GNU_SOURCE -w conftest.c >&5 +configure:26211: $? = 0 +configure:26225: result: yes +configure:26229: checking pthread.h presence +configure:26244: gcc -E -D_REENTRANT -D_GNU_SOURCE -w conftest.c +configure:26251: $? = 0 +configure:26265: result: yes +configure:26293: checking for pthread.h +configure:26302: result: yes +configure:26489: checking for CFLAGS needed for pthreads +configure:26531: gcc -o conftest -g -O2 -D_REENTRANT -D_GNU_SOURCE conftest.c -lm -lcrypt -lnsl >&5 +/tmp/ccKuAZUs.o: In function `main': +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/conftest.c:39: undefined reference to `pthread_mutexattr_init' +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/conftest.c:40: undefined reference to `pthread_create' +collect2: error: ld returned 1 exit status +configure:26535: $? = 1 +configure: program exited with status 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| /* end confdefs.h. */ +| +| #include +| #include +| +| void *thread_routine(void *data) { +| return data; +| } +| +| int main() { +| pthread_t thd; +| pthread_mutexattr_t mattr; +| pthread_once_t once_init = PTHREAD_ONCE_INIT; +| int data = 1; +| pthread_mutexattr_init(&mattr); +| return pthread_create(&thd, NULL, thread_routine, &data); +| } +configure:26531: gcc -o conftest -g -O2 -kthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lm -lcrypt -lnsl >&5 +gcc: error: unrecognized command line option '-kthread' +configure:26535: $? = 1 +configure: program exited with status 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| /* end confdefs.h. */ +| +| #include +| #include +| +| void *thread_routine(void *data) { +| return data; +| } +| +| int main() { +| pthread_t thd; +| pthread_mutexattr_t mattr; +| pthread_once_t once_init = PTHREAD_ONCE_INIT; +| int data = 1; +| pthread_mutexattr_init(&mattr); +| return pthread_create(&thd, NULL, thread_routine, &data); +| } +configure:26531: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lm -lcrypt -lnsl >&5 +configure:26535: $? = 0 +configure:26541: ./conftest +configure:26545: $? = 0 +configure:26574: result: -pthread +configure:26610: checking for LIBS needed for pthreads +configure:26652: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lm -lcrypt -lnsl -lpthread >&5 +configure:26656: $? = 0 +configure:26662: ./conftest +configure:26666: $? = 0 +configure:26695: result: -lpthread +configure:26738: checking for pthread.h +configure:26745: result: yes +configure:27652: checking whether pthread_getspecific takes two arguments +configure:27685: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +conftest.c: In function 'main': +conftest.c:37:1: error: too many arguments to function 'pthread_getspecific' + pthread_getspecific(key,&tmp); + ^ +In file included from conftest.c:29:0: +/usr/include/pthread.h:1130:14: note: declared here + extern void *pthread_getspecific (pthread_key_t __key) __THROW; + ^ +configure:27692: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| /* end confdefs.h. */ +| +| #include +| +| int +| main () +| { +| +| pthread_key_t key; +| void *tmp; +| pthread_getspecific(key,&tmp); +| +| ; +| return 0; +| } +configure:27712: result: no +configure:27724: checking whether pthread_attr_getdetachstate takes one argument +configure:27756: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +conftest.c: In function 'main': +conftest.c:36:1: error: too few arguments to function 'pthread_attr_getdetachstate' + pthread_attr_getdetachstate(attr); + ^ +In file included from conftest.c:29:0: +/usr/include/pthread.h:305:12: note: declared here + extern int pthread_attr_getdetachstate (const pthread_attr_t *__attr, + ^ +configure:27763: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| /* end confdefs.h. */ +| +| #include +| +| int +| main () +| { +| +| pthread_attr_t *attr; +| pthread_attr_getdetachstate(attr); +| +| ; +| return 0; +| } +configure:27783: result: no +configure:27799: checking for pthread_key_delete +configure:27855: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lm -lcrypt -lnsl -lpthread >&5 +configure:27862: $? = 0 +configure:27884: result: yes +configure:27799: checking for pthread_rwlock_init +configure:27855: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lm -lcrypt -lnsl -lpthread >&5 +configure:27862: $? = 0 +configure:27884: result: yes +configure:27898: checking for pthread_rwlock_t +configure:27925: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:27932: $? = 0 +configure:27947: result: yes +configure:27960: checking for recursive mutex support +configure:27993: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lm -lcrypt -lnsl -lpthread >&5 +configure:27997: $? = 0 +configure:28003: ./conftest +configure:28007: $? = 0 +configure:28024: result: yes +configure:28043: checking for readdir in -lc_r +configure:28078: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lc_r -lm -lcrypt -lnsl -lpthread >&5 +/usr/bin/ld: cannot find -lc_r +collect2: error: ld returned 1 exit status +configure:28085: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| /* 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. */ +| #ifdef __cplusplus +| extern "C" +| #endif +| char readdir (); +| int +| main () +| { +| return readdir (); +| ; +| return 0; +| } +configure:28106: result: no +configure:28117: checking for gethostbyname in -lc_r +configure:28152: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lc_r -lm -lcrypt -lnsl -lpthread >&5 +/usr/bin/ld: cannot find -lc_r +collect2: error: ld returned 1 exit status +configure:28159: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| /* 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. */ +| #ifdef __cplusplus +| extern "C" +| #endif +| char gethostbyname (); +| int +| main () +| { +| return gethostbyname (); +| ; +| return 0; +| } +configure:28180: result: no +configure:28195: checking for gethostbyaddr in -lc_r +configure:28230: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lc_r -lm -lcrypt -lnsl -lpthread >&5 +/usr/bin/ld: cannot find -lc_r +collect2: error: ld returned 1 exit status +configure:28237: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| /* 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. */ +| #ifdef __cplusplus +| extern "C" +| #endif +| char gethostbyaddr (); +| int +| main () +| { +| return gethostbyaddr (); +| ; +| return 0; +| } +configure:28258: result: no +configure:28277: checking for gethostbyname_r +configure:28333: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lm -lcrypt -lnsl -lpthread >&5 +configure:28340: $? = 0 +configure:28362: result: yes +configure:28277: checking for gethostbyaddr_r +configure:28333: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lm -lcrypt -lnsl -lpthread >&5 +configure:28340: $? = 0 +configure:28362: result: yes +configure:28382: checking for sigsuspend +configure:28438: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lm -lcrypt -lnsl -lpthread >&5 +configure:28445: $? = 0 +configure:28467: result: yes +configure:28485: checking for sigwait +configure:28541: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lm -lcrypt -lnsl -lpthread >&5 +configure:28548: $? = 0 +configure:28570: result: yes +configure:28598: checking for poll +configure:28654: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lm -lcrypt -lnsl -lpthread >&5 +configure:28661: $? = 0 +configure:28683: result: yes +configure:28703: checking for getpwnam_r +configure:28759: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lm -lcrypt -lnsl -lpthread >&5 +configure:28766: $? = 0 +configure:28788: result: yes +configure:28703: checking for getpwuid_r +configure:28759: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lm -lcrypt -lnsl -lpthread >&5 +configure:28766: $? = 0 +configure:28788: result: yes +configure:28703: checking for getgrnam_r +configure:28759: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lm -lcrypt -lnsl -lpthread >&5 +configure:28766: $? = 0 +configure:28788: result: yes +configure:28703: checking for getgrgid_r +configure:28759: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lm -lcrypt -lnsl -lpthread >&5 +configure:28766: $? = 0 +configure:28788: result: yes +configure:28805: checking for library containing shm_open +configure:28846: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lm -lcrypt -lnsl -lpthread >&5 +/tmp/ccz1UcbD.o: In function `main': +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/conftest.c:52: undefined reference to `shm_open' +collect2: error: ld returned 1 exit status +configure:28853: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| /* 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. */ +| #ifdef __cplusplus +| extern "C" +| #endif +| char shm_open (); +| int +| main () +| { +| return shm_open (); +| ; +| return 0; +| } +configure:28846: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +configure:28853: $? = 0 +configure:28884: result: -lrt +configure:28923: checking sys/mman.h usability +configure:28940: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:28947: $? = 0 +configure:28961: result: yes +configure:28965: checking sys/mman.h presence +configure:28980: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +configure:28987: $? = 0 +configure:29001: result: yes +configure:29029: checking for sys/mman.h +configure:29038: result: yes +configure:28923: checking sys/ipc.h usability +configure:28940: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:28947: $? = 0 +configure:28961: result: yes +configure:28965: checking sys/ipc.h presence +configure:28980: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +configure:28987: $? = 0 +configure:29001: result: yes +configure:29029: checking for sys/ipc.h +configure:29038: result: yes +configure:28923: checking sys/mutex.h usability +configure:28940: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +conftest.c:76:23: fatal error: sys/mutex.h: No such file or directory + #include + ^ +compilation terminated. +configure:28947: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| /* end confdefs.h. */ +| #include +| #ifdef HAVE_SYS_TYPES_H +| # include +| #endif +| #ifdef HAVE_SYS_STAT_H +| # include +| #endif +| #ifdef STDC_HEADERS +| # include +| # include +| #else +| # ifdef HAVE_STDLIB_H +| # include +| # endif +| #endif +| #ifdef HAVE_STRING_H +| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H +| # include +| # endif +| # include +| #endif +| #ifdef HAVE_STRINGS_H +| # include +| #endif +| #ifdef HAVE_INTTYPES_H +| # include +| #endif +| #ifdef HAVE_STDINT_H +| # include +| #endif +| #ifdef HAVE_UNISTD_H +| # include +| #endif +| #include +configure:28961: result: no +configure:28965: checking sys/mutex.h presence +configure:28980: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +conftest.c:43:23: fatal error: sys/mutex.h: No such file or directory + #include + ^ +compilation terminated. +configure:28987: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| /* end confdefs.h. */ +| #include +configure:29001: result: no +configure:29029: checking for sys/mutex.h +configure:29038: result: no +configure:28923: checking sys/shm.h usability +configure:28940: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:28947: $? = 0 +configure:28961: result: yes +configure:28965: checking sys/shm.h presence +configure:28980: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +configure:28987: $? = 0 +configure:29001: result: yes +configure:29029: checking for sys/shm.h +configure:29038: result: yes +configure:28923: checking sys/file.h usability +configure:28940: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:28947: $? = 0 +configure:28961: result: yes +configure:28965: checking sys/file.h presence +configure:28980: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +configure:28987: $? = 0 +configure:29001: result: yes +configure:29029: checking for sys/file.h +configure:29038: result: yes +configure:28923: checking kernel/OS.h usability +configure:28940: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +conftest.c:78:23: fatal error: kernel/OS.h: No such file or directory + #include + ^ +compilation terminated. +configure:28947: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| /* end confdefs.h. */ +| #include +| #ifdef HAVE_SYS_TYPES_H +| # include +| #endif +| #ifdef HAVE_SYS_STAT_H +| # include +| #endif +| #ifdef STDC_HEADERS +| # include +| # include +| #else +| # ifdef HAVE_STDLIB_H +| # include +| # endif +| #endif +| #ifdef HAVE_STRING_H +| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H +| # include +| # endif +| # include +| #endif +| #ifdef HAVE_STRINGS_H +| # include +| #endif +| #ifdef HAVE_INTTYPES_H +| # include +| #endif +| #ifdef HAVE_STDINT_H +| # include +| #endif +| #ifdef HAVE_UNISTD_H +| # include +| #endif +| #include +configure:28961: result: no +configure:28965: checking kernel/OS.h presence +configure:28980: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +conftest.c:45:23: fatal error: kernel/OS.h: No such file or directory + #include + ^ +compilation terminated. +configure:28987: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| /* end confdefs.h. */ +| #include +configure:29001: result: no +configure:29029: checking for kernel/OS.h +configure:29038: result: no +configure:28923: checking os2.h usability +configure:28940: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +conftest.c:78:17: fatal error: os2.h: No such file or directory + #include + ^ +compilation terminated. +configure:28947: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| /* end confdefs.h. */ +| #include +| #ifdef HAVE_SYS_TYPES_H +| # include +| #endif +| #ifdef HAVE_SYS_STAT_H +| # include +| #endif +| #ifdef STDC_HEADERS +| # include +| # include +| #else +| # ifdef HAVE_STDLIB_H +| # include +| # endif +| #endif +| #ifdef HAVE_STRING_H +| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H +| # include +| # endif +| # include +| #endif +| #ifdef HAVE_STRINGS_H +| # include +| #endif +| #ifdef HAVE_INTTYPES_H +| # include +| #endif +| #ifdef HAVE_STDINT_H +| # include +| #endif +| #ifdef HAVE_UNISTD_H +| # include +| #endif +| #include +configure:28961: result: no +configure:28965: checking os2.h presence +configure:28980: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +conftest.c:45:17: fatal error: os2.h: No such file or directory + #include + ^ +compilation terminated. +configure:28987: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| /* end confdefs.h. */ +| #include +configure:29001: result: no +configure:29029: checking for os2.h +configure:29038: result: no +configure:29066: checking for mmap +configure:29122: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +configure:29129: $? = 0 +configure:29151: result: yes +configure:29066: checking for munmap +configure:29122: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +configure:29129: $? = 0 +configure:29151: result: yes +configure:29066: checking for shm_open +configure:29122: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +configure:29129: $? = 0 +configure:29151: result: yes +configure:29066: checking for shm_unlink +configure:29122: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +configure:29129: $? = 0 +configure:29151: result: yes +configure:29066: checking for shmget +configure:29122: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +configure:29129: $? = 0 +configure:29151: result: yes +configure:29066: checking for shmat +configure:29122: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +configure:29129: $? = 0 +configure:29151: result: yes +configure:29066: checking for shmdt +configure:29122: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +configure:29129: $? = 0 +configure:29151: result: yes +configure:29066: checking for shmctl +configure:29122: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +configure:29129: $? = 0 +configure:29151: result: yes +configure:29066: checking for create_area +configure:29122: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +/tmp/cc3UymK3.o: In function `main': +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/conftest.c:87: undefined reference to `create_area' +collect2: error: ld returned 1 exit status +configure:29129: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| /* end confdefs.h. */ +| /* Define create_area to an innocuous variant, in case declares create_area. +| For example, HP-UX 11i declares gettimeofday. */ +| #define create_area innocuous_create_area +| +| /* System header to define __stub macros and hopefully few prototypes, +| which can conflict with char create_area (); below. +| Prefer to if __STDC__ is defined, since +| exists even on freestanding compilers. */ +| +| #ifdef __STDC__ +| # include +| #else +| # include +| #endif +| +| #undef create_area +| +| /* 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 create_area (); +| /* 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_create_area || defined __stub___create_area +| choke me +| #endif +| +| int +| main () +| { +| return create_area (); +| ; +| return 0; +| } +configure:29151: result: no +configure:29164: checking for MAP_ANON in sys/mman.h +configure:29193: result: yes +configure:29203: checking for /dev/zero +configure:29218: result: yes +configure:29225: checking for mmap that can map /dev/zero +configure:29267: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +configure:29271: $? = 0 +configure:29277: ./conftest +configure:29281: $? = 0 +configure:29298: result: yes +configure:29536: result: decision on anonymous shared memory allocation method... 4.4BSD-style mmap() via MAP_ANON +configure:29793: result: decision on namebased memory allocation method... SysV IPC shmget() +configure:29855: checking for alloca +configure:29911: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +conftest.c:81:6: warning: conflicting types for built-in function 'alloca' [enabled by default] + char alloca (); + ^ +/tmp/cclYoRWq.o: In function `main': +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/conftest.c:92: undefined reference to `alloca' +collect2: error: ld returned 1 exit status +configure:29918: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| /* end confdefs.h. */ +| /* Define alloca to an innocuous variant, in case declares alloca. +| For example, HP-UX 11i declares gettimeofday. */ +| #define alloca innocuous_alloca +| +| /* System header to define __stub macros and hopefully few prototypes, +| which can conflict with char alloca (); below. +| Prefer to if __STDC__ is defined, since +| exists even on freestanding compilers. */ +| +| #ifdef __STDC__ +| # include +| #else +| # include +| #endif +| +| #undef alloca +| +| /* 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 alloca (); +| /* 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_alloca || defined __stub___alloca +| choke me +| #endif +| +| int +| main () +| { +| return alloca (); +| ; +| return 0; +| } +configure:29940: result: no +configure:29855: checking for calloc +configure:29911: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +conftest.c:81:6: warning: conflicting types for built-in function 'calloc' [enabled by default] + char calloc (); + ^ +configure:29918: $? = 0 +configure:29940: result: yes +configure:29855: checking for strcasecmp +configure:29911: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +conftest.c:82:6: warning: conflicting types for built-in function 'strcasecmp' [enabled by default] + char strcasecmp (); + ^ +configure:29918: $? = 0 +configure:29940: result: yes +configure:29855: checking for stricmp +configure:29911: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +/tmp/ccdtbwHC.o: In function `main': +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/conftest.c:94: undefined reference to `stricmp' +collect2: error: ld returned 1 exit status +configure:29918: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| /* end confdefs.h. */ +| /* Define stricmp to an innocuous variant, in case declares stricmp. +| For example, HP-UX 11i declares gettimeofday. */ +| #define stricmp innocuous_stricmp +| +| /* System header to define __stub macros and hopefully few prototypes, +| which can conflict with char stricmp (); below. +| Prefer to if __STDC__ is defined, since +| exists even on freestanding compilers. */ +| +| #ifdef __STDC__ +| # include +| #else +| # include +| #endif +| +| #undef stricmp +| +| /* 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 stricmp (); +| /* 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_stricmp || defined __stub___stricmp +| choke me +| #endif +| +| int +| main () +| { +| return stricmp (); +| ; +| return 0; +| } +configure:29940: result: no +configure:29855: checking for setsid +configure:29911: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +configure:29918: $? = 0 +configure:29940: result: yes +configure:29855: checking for isinf +configure:29911: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +conftest.c:84:6: warning: conflicting types for built-in function 'isinf' [enabled by default] + char isinf (); + ^ +configure:29918: $? = 0 +configure:29940: result: yes +configure:29855: checking for isnan +configure:29911: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +conftest.c:85:6: warning: conflicting types for built-in function 'isnan' [enabled by default] + char isnan (); + ^ +configure:29918: $? = 0 +configure:29940: result: yes +configure:29959: checking for getenv +configure:30015: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +configure:30022: $? = 0 +configure:30044: result: yes +configure:29959: checking for putenv +configure:30015: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +configure:30022: $? = 0 +configure:30044: result: yes +configure:29959: checking for setenv +configure:30015: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +configure:30022: $? = 0 +configure:30044: result: yes +configure:29959: checking for unsetenv +configure:30015: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +configure:30022: $? = 0 +configure:30044: result: yes +configure:30060: checking for setrlimit +configure:30116: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +configure:30123: $? = 0 +configure:30145: result: yes +configure:30163: checking for getrlimit +configure:30219: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +configure:30226: $? = 0 +configure:30248: result: yes +configure:30266: checking for writev +configure:30322: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +configure:30329: $? = 0 +configure:30351: result: yes +configure:30365: checking for sendfilev in -lsendfile +configure:30400: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lsendfile -lrt -lm -lcrypt -lnsl -lpthread >&5 +/usr/bin/ld: cannot find -lsendfile +collect2: error: ld returned 1 exit status +configure:30407: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| /* 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. */ +| #ifdef __cplusplus +| extern "C" +| #endif +| char sendfilev (); +| int +| main () +| { +| return sendfilev (); +| ; +| return 0; +| } +configure:30428: result: no +configure:30445: checking for sendfile +configure:30501: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +configure:30508: $? = 0 +configure:30530: result: yes +configure:30445: checking for send_file +configure:30501: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +/tmp/ccNZPzzj.o: In function `main': +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/conftest.c:105: undefined reference to `send_file' +collect2: error: ld returned 1 exit status +configure:30508: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| /* end confdefs.h. */ +| /* Define send_file to an innocuous variant, in case declares send_file. +| For example, HP-UX 11i declares gettimeofday. */ +| #define send_file innocuous_send_file +| +| /* System header to define __stub macros and hopefully few prototypes, +| which can conflict with char send_file (); below. +| Prefer to if __STDC__ is defined, since +| exists even on freestanding compilers. */ +| +| #ifdef __STDC__ +| # include +| #else +| # include +| #endif +| +| #undef send_file +| +| /* 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 send_file (); +| /* 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_send_file || defined __stub___send_file +| choke me +| #endif +| +| int +| main () +| { +| return send_file (); +| ; +| return 0; +| } +configure:30530: result: no +configure:30445: checking for sendfilev +configure:30501: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +/tmp/ccZjyf0k.o: In function `main': +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/conftest.c:105: undefined reference to `sendfilev' +collect2: error: ld returned 1 exit status +configure:30508: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| /* end confdefs.h. */ +| /* Define sendfilev to an innocuous variant, in case declares sendfilev. +| For example, HP-UX 11i declares gettimeofday. */ +| #define sendfilev innocuous_sendfilev +| +| /* System header to define __stub macros and hopefully few prototypes, +| which can conflict with char sendfilev (); below. +| Prefer to if __STDC__ is defined, since +| exists even on freestanding compilers. */ +| +| #ifdef __STDC__ +| # include +| #else +| # include +| #endif +| +| #undef sendfilev +| +| /* 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 sendfilev (); +| /* 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_sendfilev || defined __stub___sendfilev +| choke me +| #endif +| +| int +| main () +| { +| return sendfilev (); +| ; +| return 0; +| } +configure:30530: result: no +configure:30547: checking for utime +configure:30603: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +configure:30610: $? = 0 +configure:30632: result: yes +configure:30547: checking for utimes +configure:30603: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +configure:30610: $? = 0 +configure:30632: result: yes +configure:31057: checking for sigaction +configure:31113: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +configure:31120: $? = 0 +configure:31142: result: yes +configure:31156: checking whether sys_siglist is declared +configure:31191: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:31198: $? = 0 +configure:31213: result: yes +configure:31237: checking for fork +configure:31293: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +conftest.c:98:6: warning: conflicting types for built-in function 'fork' [enabled by default] + char fork (); + ^ +configure:31300: $? = 0 +configure:31322: result: yes +configure:31337: checking for inet_addr +configure:31373: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:31380: $? = 0 +configure:31400: result: yes +configure:31410: checking for inet_network +configure:31446: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:31453: $? = 0 +configure:31473: result: yes +configure:31483: checking for _getch +configure:31539: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +/tmp/ccERY85F.o: In function `main': +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/conftest.c:110: undefined reference to `_getch' +collect2: error: ld returned 1 exit status +configure:31546: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| /* end confdefs.h. */ +| /* Define _getch to an innocuous variant, in case declares _getch. +| For example, HP-UX 11i declares gettimeofday. */ +| #define _getch innocuous__getch +| +| /* System header to define __stub macros and hopefully few prototypes, +| which can conflict with char _getch (); below. +| Prefer to if __STDC__ is defined, since +| exists even on freestanding compilers. */ +| +| #ifdef __STDC__ +| # include +| #else +| # include +| #endif +| +| #undef _getch +| +| /* 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 _getch (); +| /* 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__getch || defined __stub____getch +| choke me +| #endif +| +| int +| main () +| { +| return _getch (); +| ; +| return 0; +| } +configure:31566: result: no +configure:31573: checking for strerror_r +configure:31629: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +configure:31636: $? = 0 +configure:31658: result: yes +configure:31674: checking for type of return code from strerror_r +configure:31707: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +conftest.c: In function 'main': +conftest.c:84:43: warning: comparison between pointer and integer [enabled by default] + if (strerror_r(ERANGE, buf, sizeof buf) < 1) { + ^ +conftest.c:85:5: warning: incompatible implicit declaration of built-in function 'exit' [enabled by default] + exit(0); + ^ +conftest.c:88:5: warning: incompatible implicit declaration of built-in function 'exit' [enabled by default] + exit(1); + ^ +configure:31711: $? = 0 +configure:31717: ./conftest +configure:31721: $? = 1 +configure: program exited with status 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| #define HAVE_STRERROR_R 1 +| /* end confdefs.h. */ +| +| #include +| #include +| #include +| main() +| { +| char buf[1024]; +| if (strerror_r(ERANGE, buf, sizeof buf) < 1) { +| exit(0); +| } +| else { +| exit(1); +| } +| } +configure:31749: result: pointer +configure:31757: checking for crypt_r +configure:31813: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +configure:31820: $? = 0 +configure:31842: result: yes +configure:31858: checking style of crypt_r +configure:31891: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +conftest.c: In function 'main': +conftest.c:85:1: error: unknown type name 'CRYPTD' + CRYPTD buffer; + ^ +conftest.c:86:1: warning: passing argument 3 of 'crypt_r' from incompatible pointer type [enabled by default] + crypt_r("passwd", "hash", &buffer); + ^ +In file included from conftest.c:79:0: +/usr/include/crypt.h:60:14: note: expected 'struct crypt_data * __restrict__' but argument is of type 'int *' + extern char *crypt_r (const char *__key, const char *__salt, + ^ +configure:31898: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| #define HAVE_STRERROR_R 1 +| #define HAVE_CRYPT_R 1 +| /* end confdefs.h. */ +| +| #include +| +| int +| main () +| { +| +| CRYPTD buffer; +| crypt_r("passwd", "hash", &buffer); +| +| ; +| return 0; +| } +configure:31939: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:31946: $? = 0 +configure:31963: result: struct_crypt_data +configure:31987: checking for mmap +configure:32072: result: yes +configure:32093: checking for memmove +configure:32149: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +conftest.c:103:6: warning: conflicting types for built-in function 'memmove' [enabled by default] + char memmove (); + ^ +configure:32156: $? = 0 +configure:32178: result: yes +configure:32201: checking for getpass +configure:32257: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +configure:32264: $? = 0 +configure:32286: result: yes +configure:32201: checking for getpassphrase +configure:32257: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +/tmp/ccL1vv5a.o: In function `main': +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/conftest.c:116: undefined reference to `getpassphrase' +collect2: error: ld returned 1 exit status +configure:32264: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| #define HAVE_STRERROR_R 1 +| #define HAVE_CRYPT_R 1 +| #define CRYPT_R_STRUCT_CRYPT_DATA 1 +| #define HAVE_MMAP 1 +| #define HAVE_MEMMOVE 1 +| #define HAVE_GETPASS 1 +| /* end confdefs.h. */ +| /* Define getpassphrase to an innocuous variant, in case declares getpassphrase. +| For example, HP-UX 11i declares gettimeofday. */ +| #define getpassphrase innocuous_getpassphrase +| +| /* System header to define __stub macros and hopefully few prototypes, +| which can conflict with char getpassphrase (); below. +| Prefer to if __STDC__ is defined, since +| exists even on freestanding compilers. */ +| +| #ifdef __STDC__ +| # include +| #else +| # include +| #endif +| +| #undef getpassphrase +| +| /* 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 getpassphrase (); +| /* 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_getpassphrase || defined __stub___getpassphrase +| choke me +| #endif +| +| int +| main () +| { +| return getpassphrase (); +| ; +| return 0; +| } +configure:32286: result: no +configure:32201: checking for gmtime_r +configure:32257: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +configure:32264: $? = 0 +configure:32286: result: yes +configure:32201: checking for localtime_r +configure:32257: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +configure:32264: $? = 0 +configure:32286: result: yes +configure:32201: checking for hstrerror +configure:32257: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +configure:32264: $? = 0 +configure:32286: result: yes +configure:32201: checking for mkstemp +configure:32257: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +configure:32264: $? = 0 +configure:32286: result: yes +configure:32311: checking whether sigwait takes one argument +configure:32352: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +conftest.c: In function 'main': +conftest.c:103:3: error: too few arguments to function 'sigwait' + sigwait(&set); + ^ +In file included from conftest.c:95:0: +/usr/include/signal.h:270:12: note: declared here + extern int sigwait (const sigset_t *__restrict __set, int *__restrict __sig) + ^ +configure:32359: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| #define HAVE_STRERROR_R 1 +| #define HAVE_CRYPT_R 1 +| #define CRYPT_R_STRUCT_CRYPT_DATA 1 +| #define HAVE_MMAP 1 +| #define HAVE_MEMMOVE 1 +| #define HAVE_GETPASS 1 +| #define HAVE_GMTIME_R 1 +| #define HAVE_LOCALTIME_R 1 +| #define HAVE_HSTRERROR 1 +| #define HAVE_MKSTEMP 1 +| /* end confdefs.h. */ +| +| #if defined(__NETBSD__) || defined(DARWIN) +| /* When using the unproven-pthreads package, we need to pull in this +| * header to get a prototype for sigwait(). Else things will fail later +| * on. XXX Should probably be fixed in the unproven-pthreads package. +| * Darwin is declaring sigwait() in the wrong place as well. +| */ +| #include +| #endif +| #include +| +| int +| main () +| { +| +| sigset_t set; +| +| sigwait(&set); +| +| ; +| return 0; +| } +configure:32378: result: no +configure:32389: checking for inode member of struct dirent +configure:32425: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:32432: $? = 0 +configure:32500: result: d_fileno +configure:32510: checking for file type member of struct dirent +configure:32543: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:32550: $? = 0 +configure:32566: result: d_type +configure:32576: checking for ANSI C header files +configure:32744: result: yes +configure:32896: checking alloca.h usability +configure:32913: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:32920: $? = 0 +configure:32934: result: yes +configure:32938: checking alloca.h presence +configure:32953: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +configure:32960: $? = 0 +configure:32974: result: yes +configure:33002: checking for alloca.h +configure:33011: result: yes +configure:32896: checking ByteOrder.h usability +configure:32913: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +conftest.c:123:23: fatal error: ByteOrder.h: No such file or directory + #include + ^ +compilation terminated. +configure:32920: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| #define HAVE_STRERROR_R 1 +| #define HAVE_CRYPT_R 1 +| #define CRYPT_R_STRUCT_CRYPT_DATA 1 +| #define HAVE_MMAP 1 +| #define HAVE_MEMMOVE 1 +| #define HAVE_GETPASS 1 +| #define HAVE_GMTIME_R 1 +| #define HAVE_LOCALTIME_R 1 +| #define HAVE_HSTRERROR 1 +| #define HAVE_MKSTEMP 1 +| #define DIRENT_INODE d_fileno +| #define DIRENT_TYPE d_type +| #define STDC_HEADERS 1 +| #define HAVE_ALLOCA_H 1 +| /* end confdefs.h. */ +| #include +| #ifdef HAVE_SYS_TYPES_H +| # include +| #endif +| #ifdef HAVE_SYS_STAT_H +| # include +| #endif +| #ifdef STDC_HEADERS +| # include +| # include +| #else +| # ifdef HAVE_STDLIB_H +| # include +| # endif +| #endif +| #ifdef HAVE_STRING_H +| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H +| # include +| # endif +| # include +| #endif +| #ifdef HAVE_STRINGS_H +| # include +| #endif +| #ifdef HAVE_INTTYPES_H +| # include +| #endif +| #ifdef HAVE_STDINT_H +| # include +| #endif +| #ifdef HAVE_UNISTD_H +| # include +| #endif +| #include +configure:32934: result: no +configure:32938: checking ByteOrder.h presence +configure:32953: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +conftest.c:90:23: fatal error: ByteOrder.h: No such file or directory + #include + ^ +compilation terminated. +configure:32960: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| #define HAVE_STRERROR_R 1 +| #define HAVE_CRYPT_R 1 +| #define CRYPT_R_STRUCT_CRYPT_DATA 1 +| #define HAVE_MMAP 1 +| #define HAVE_MEMMOVE 1 +| #define HAVE_GETPASS 1 +| #define HAVE_GMTIME_R 1 +| #define HAVE_LOCALTIME_R 1 +| #define HAVE_HSTRERROR 1 +| #define HAVE_MKSTEMP 1 +| #define DIRENT_INODE d_fileno +| #define DIRENT_TYPE d_type +| #define STDC_HEADERS 1 +| #define HAVE_ALLOCA_H 1 +| /* end confdefs.h. */ +| #include +configure:32974: result: no +configure:33002: checking for ByteOrder.h +configure:33011: result: no +configure:32896: checking conio.h usability +configure:32913: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +conftest.c:123:19: fatal error: conio.h: No such file or directory + #include + ^ +compilation terminated. +configure:32920: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| #define HAVE_STRERROR_R 1 +| #define HAVE_CRYPT_R 1 +| #define CRYPT_R_STRUCT_CRYPT_DATA 1 +| #define HAVE_MMAP 1 +| #define HAVE_MEMMOVE 1 +| #define HAVE_GETPASS 1 +| #define HAVE_GMTIME_R 1 +| #define HAVE_LOCALTIME_R 1 +| #define HAVE_HSTRERROR 1 +| #define HAVE_MKSTEMP 1 +| #define DIRENT_INODE d_fileno +| #define DIRENT_TYPE d_type +| #define STDC_HEADERS 1 +| #define HAVE_ALLOCA_H 1 +| /* end confdefs.h. */ +| #include +| #ifdef HAVE_SYS_TYPES_H +| # include +| #endif +| #ifdef HAVE_SYS_STAT_H +| # include +| #endif +| #ifdef STDC_HEADERS +| # include +| # include +| #else +| # ifdef HAVE_STDLIB_H +| # include +| # endif +| #endif +| #ifdef HAVE_STRING_H +| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H +| # include +| # endif +| # include +| #endif +| #ifdef HAVE_STRINGS_H +| # include +| #endif +| #ifdef HAVE_INTTYPES_H +| # include +| #endif +| #ifdef HAVE_STDINT_H +| # include +| #endif +| #ifdef HAVE_UNISTD_H +| # include +| #endif +| #include +configure:32934: result: no +configure:32938: checking conio.h presence +configure:32953: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +conftest.c:90:19: fatal error: conio.h: No such file or directory + #include + ^ +compilation terminated. +configure:32960: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| #define HAVE_STRERROR_R 1 +| #define HAVE_CRYPT_R 1 +| #define CRYPT_R_STRUCT_CRYPT_DATA 1 +| #define HAVE_MMAP 1 +| #define HAVE_MEMMOVE 1 +| #define HAVE_GETPASS 1 +| #define HAVE_GMTIME_R 1 +| #define HAVE_LOCALTIME_R 1 +| #define HAVE_HSTRERROR 1 +| #define HAVE_MKSTEMP 1 +| #define DIRENT_INODE d_fileno +| #define DIRENT_TYPE d_type +| #define STDC_HEADERS 1 +| #define HAVE_ALLOCA_H 1 +| /* end confdefs.h. */ +| #include +configure:32974: result: no +configure:33002: checking for conio.h +configure:33011: result: no +configure:32896: checking crypt.h usability +configure:32913: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:32920: $? = 0 +configure:32934: result: yes +configure:32938: checking crypt.h presence +configure:32953: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +configure:32960: $? = 0 +configure:32974: result: yes +configure:33002: checking for crypt.h +configure:33011: result: yes +configure:32896: checking ctype.h usability +configure:32913: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:32920: $? = 0 +configure:32934: result: yes +configure:32938: checking ctype.h presence +configure:32953: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +configure:32960: $? = 0 +configure:32974: result: yes +configure:33002: checking for ctype.h +configure:33011: result: yes +configure:32896: checking dir.h usability +configure:32913: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +conftest.c:125:17: fatal error: dir.h: No such file or directory + #include + ^ +compilation terminated. +configure:32920: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| #define HAVE_STRERROR_R 1 +| #define HAVE_CRYPT_R 1 +| #define CRYPT_R_STRUCT_CRYPT_DATA 1 +| #define HAVE_MMAP 1 +| #define HAVE_MEMMOVE 1 +| #define HAVE_GETPASS 1 +| #define HAVE_GMTIME_R 1 +| #define HAVE_LOCALTIME_R 1 +| #define HAVE_HSTRERROR 1 +| #define HAVE_MKSTEMP 1 +| #define DIRENT_INODE d_fileno +| #define DIRENT_TYPE d_type +| #define STDC_HEADERS 1 +| #define HAVE_ALLOCA_H 1 +| #define HAVE_CRYPT_H 1 +| #define HAVE_CTYPE_H 1 +| /* end confdefs.h. */ +| #include +| #ifdef HAVE_SYS_TYPES_H +| # include +| #endif +| #ifdef HAVE_SYS_STAT_H +| # include +| #endif +| #ifdef STDC_HEADERS +| # include +| # include +| #else +| # ifdef HAVE_STDLIB_H +| # include +| # endif +| #endif +| #ifdef HAVE_STRING_H +| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H +| # include +| # endif +| # include +| #endif +| #ifdef HAVE_STRINGS_H +| # include +| #endif +| #ifdef HAVE_INTTYPES_H +| # include +| #endif +| #ifdef HAVE_STDINT_H +| # include +| #endif +| #ifdef HAVE_UNISTD_H +| # include +| #endif +| #include +configure:32934: result: no +configure:32938: checking dir.h presence +configure:32953: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +conftest.c:92:17: fatal error: dir.h: No such file or directory + #include + ^ +compilation terminated. +configure:32960: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| #define HAVE_STRERROR_R 1 +| #define HAVE_CRYPT_R 1 +| #define CRYPT_R_STRUCT_CRYPT_DATA 1 +| #define HAVE_MMAP 1 +| #define HAVE_MEMMOVE 1 +| #define HAVE_GETPASS 1 +| #define HAVE_GMTIME_R 1 +| #define HAVE_LOCALTIME_R 1 +| #define HAVE_HSTRERROR 1 +| #define HAVE_MKSTEMP 1 +| #define DIRENT_INODE d_fileno +| #define DIRENT_TYPE d_type +| #define STDC_HEADERS 1 +| #define HAVE_ALLOCA_H 1 +| #define HAVE_CRYPT_H 1 +| #define HAVE_CTYPE_H 1 +| /* end confdefs.h. */ +| #include +configure:32974: result: no +configure:33002: checking for dir.h +configure:33011: result: no +configure:32896: checking dirent.h usability +configure:32913: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:32920: $? = 0 +configure:32934: result: yes +configure:32938: checking dirent.h presence +configure:32953: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +configure:32960: $? = 0 +configure:32974: result: yes +configure:33002: checking for dirent.h +configure:33011: result: yes +configure:32896: checking dl.h usability +configure:32913: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +conftest.c:126:16: fatal error: dl.h: No such file or directory + #include + ^ +compilation terminated. +configure:32920: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| #define HAVE_STRERROR_R 1 +| #define HAVE_CRYPT_R 1 +| #define CRYPT_R_STRUCT_CRYPT_DATA 1 +| #define HAVE_MMAP 1 +| #define HAVE_MEMMOVE 1 +| #define HAVE_GETPASS 1 +| #define HAVE_GMTIME_R 1 +| #define HAVE_LOCALTIME_R 1 +| #define HAVE_HSTRERROR 1 +| #define HAVE_MKSTEMP 1 +| #define DIRENT_INODE d_fileno +| #define DIRENT_TYPE d_type +| #define STDC_HEADERS 1 +| #define HAVE_ALLOCA_H 1 +| #define HAVE_CRYPT_H 1 +| #define HAVE_CTYPE_H 1 +| #define HAVE_DIRENT_H 1 +| /* end confdefs.h. */ +| #include +| #ifdef HAVE_SYS_TYPES_H +| # include +| #endif +| #ifdef HAVE_SYS_STAT_H +| # include +| #endif +| #ifdef STDC_HEADERS +| # include +| # include +| #else +| # ifdef HAVE_STDLIB_H +| # include +| # endif +| #endif +| #ifdef HAVE_STRING_H +| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H +| # include +| # endif +| # include +| #endif +| #ifdef HAVE_STRINGS_H +| # include +| #endif +| #ifdef HAVE_INTTYPES_H +| # include +| #endif +| #ifdef HAVE_STDINT_H +| # include +| #endif +| #ifdef HAVE_UNISTD_H +| # include +| #endif +| #include +configure:32934: result: no +configure:32938: checking dl.h presence +configure:32953: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +conftest.c:93:16: fatal error: dl.h: No such file or directory + #include + ^ +compilation terminated. +configure:32960: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| #define HAVE_STRERROR_R 1 +| #define HAVE_CRYPT_R 1 +| #define CRYPT_R_STRUCT_CRYPT_DATA 1 +| #define HAVE_MMAP 1 +| #define HAVE_MEMMOVE 1 +| #define HAVE_GETPASS 1 +| #define HAVE_GMTIME_R 1 +| #define HAVE_LOCALTIME_R 1 +| #define HAVE_HSTRERROR 1 +| #define HAVE_MKSTEMP 1 +| #define DIRENT_INODE d_fileno +| #define DIRENT_TYPE d_type +| #define STDC_HEADERS 1 +| #define HAVE_ALLOCA_H 1 +| #define HAVE_CRYPT_H 1 +| #define HAVE_CTYPE_H 1 +| #define HAVE_DIRENT_H 1 +| /* end confdefs.h. */ +| #include +configure:32974: result: no +configure:33002: checking for dl.h +configure:33011: result: no +configure:32885: checking for dlfcn.h +configure:32892: result: yes +configure:32896: checking errno.h usability +configure:32913: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:32920: $? = 0 +configure:32934: result: yes +configure:32938: checking errno.h presence +configure:32953: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +configure:32960: $? = 0 +configure:32974: result: yes +configure:33002: checking for errno.h +configure:33011: result: yes +configure:32896: checking fcntl.h usability +configure:32913: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:32920: $? = 0 +configure:32934: result: yes +configure:32938: checking fcntl.h presence +configure:32953: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +configure:32960: $? = 0 +configure:32974: result: yes +configure:33002: checking for fcntl.h +configure:33011: result: yes +configure:32896: checking grp.h usability +configure:32913: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:32920: $? = 0 +configure:32934: result: yes +configure:32938: checking grp.h presence +configure:32953: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +configure:32960: $? = 0 +configure:32974: result: yes +configure:33002: checking for grp.h +configure:33011: result: yes +configure:32896: checking io.h usability +configure:32913: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +conftest.c:130:16: fatal error: io.h: No such file or directory + #include + ^ +compilation terminated. +configure:32920: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| #define HAVE_STRERROR_R 1 +| #define HAVE_CRYPT_R 1 +| #define CRYPT_R_STRUCT_CRYPT_DATA 1 +| #define HAVE_MMAP 1 +| #define HAVE_MEMMOVE 1 +| #define HAVE_GETPASS 1 +| #define HAVE_GMTIME_R 1 +| #define HAVE_LOCALTIME_R 1 +| #define HAVE_HSTRERROR 1 +| #define HAVE_MKSTEMP 1 +| #define DIRENT_INODE d_fileno +| #define DIRENT_TYPE d_type +| #define STDC_HEADERS 1 +| #define HAVE_ALLOCA_H 1 +| #define HAVE_CRYPT_H 1 +| #define HAVE_CTYPE_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_ERRNO_H 1 +| #define HAVE_FCNTL_H 1 +| #define HAVE_GRP_H 1 +| /* end confdefs.h. */ +| #include +| #ifdef HAVE_SYS_TYPES_H +| # include +| #endif +| #ifdef HAVE_SYS_STAT_H +| # include +| #endif +| #ifdef STDC_HEADERS +| # include +| # include +| #else +| # ifdef HAVE_STDLIB_H +| # include +| # endif +| #endif +| #ifdef HAVE_STRING_H +| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H +| # include +| # endif +| # include +| #endif +| #ifdef HAVE_STRINGS_H +| # include +| #endif +| #ifdef HAVE_INTTYPES_H +| # include +| #endif +| #ifdef HAVE_STDINT_H +| # include +| #endif +| #ifdef HAVE_UNISTD_H +| # include +| #endif +| #include +configure:32934: result: no +configure:32938: checking io.h presence +configure:32953: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +conftest.c:97:16: fatal error: io.h: No such file or directory + #include + ^ +compilation terminated. +configure:32960: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| #define HAVE_STRERROR_R 1 +| #define HAVE_CRYPT_R 1 +| #define CRYPT_R_STRUCT_CRYPT_DATA 1 +| #define HAVE_MMAP 1 +| #define HAVE_MEMMOVE 1 +| #define HAVE_GETPASS 1 +| #define HAVE_GMTIME_R 1 +| #define HAVE_LOCALTIME_R 1 +| #define HAVE_HSTRERROR 1 +| #define HAVE_MKSTEMP 1 +| #define DIRENT_INODE d_fileno +| #define DIRENT_TYPE d_type +| #define STDC_HEADERS 1 +| #define HAVE_ALLOCA_H 1 +| #define HAVE_CRYPT_H 1 +| #define HAVE_CTYPE_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_ERRNO_H 1 +| #define HAVE_FCNTL_H 1 +| #define HAVE_GRP_H 1 +| /* end confdefs.h. */ +| #include +configure:32974: result: no +configure:33002: checking for io.h +configure:33011: result: no +configure:32896: checking limits.h usability +configure:32913: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:32920: $? = 0 +configure:32934: result: yes +configure:32938: checking limits.h presence +configure:32953: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +configure:32960: $? = 0 +configure:32974: result: yes +configure:33002: checking for limits.h +configure:33011: result: yes +configure:32896: checking mach-o/dyld.h usability +configure:32913: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +conftest.c:131:25: fatal error: mach-o/dyld.h: No such file or directory + #include + ^ +compilation terminated. +configure:32920: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| #define HAVE_STRERROR_R 1 +| #define HAVE_CRYPT_R 1 +| #define CRYPT_R_STRUCT_CRYPT_DATA 1 +| #define HAVE_MMAP 1 +| #define HAVE_MEMMOVE 1 +| #define HAVE_GETPASS 1 +| #define HAVE_GMTIME_R 1 +| #define HAVE_LOCALTIME_R 1 +| #define HAVE_HSTRERROR 1 +| #define HAVE_MKSTEMP 1 +| #define DIRENT_INODE d_fileno +| #define DIRENT_TYPE d_type +| #define STDC_HEADERS 1 +| #define HAVE_ALLOCA_H 1 +| #define HAVE_CRYPT_H 1 +| #define HAVE_CTYPE_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_ERRNO_H 1 +| #define HAVE_FCNTL_H 1 +| #define HAVE_GRP_H 1 +| #define HAVE_LIMITS_H 1 +| /* end confdefs.h. */ +| #include +| #ifdef HAVE_SYS_TYPES_H +| # include +| #endif +| #ifdef HAVE_SYS_STAT_H +| # include +| #endif +| #ifdef STDC_HEADERS +| # include +| # include +| #else +| # ifdef HAVE_STDLIB_H +| # include +| # endif +| #endif +| #ifdef HAVE_STRING_H +| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H +| # include +| # endif +| # include +| #endif +| #ifdef HAVE_STRINGS_H +| # include +| #endif +| #ifdef HAVE_INTTYPES_H +| # include +| #endif +| #ifdef HAVE_STDINT_H +| # include +| #endif +| #ifdef HAVE_UNISTD_H +| # include +| #endif +| #include +configure:32934: result: no +configure:32938: checking mach-o/dyld.h presence +configure:32953: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +conftest.c:98:25: fatal error: mach-o/dyld.h: No such file or directory + #include + ^ +compilation terminated. +configure:32960: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| #define HAVE_STRERROR_R 1 +| #define HAVE_CRYPT_R 1 +| #define CRYPT_R_STRUCT_CRYPT_DATA 1 +| #define HAVE_MMAP 1 +| #define HAVE_MEMMOVE 1 +| #define HAVE_GETPASS 1 +| #define HAVE_GMTIME_R 1 +| #define HAVE_LOCALTIME_R 1 +| #define HAVE_HSTRERROR 1 +| #define HAVE_MKSTEMP 1 +| #define DIRENT_INODE d_fileno +| #define DIRENT_TYPE d_type +| #define STDC_HEADERS 1 +| #define HAVE_ALLOCA_H 1 +| #define HAVE_CRYPT_H 1 +| #define HAVE_CTYPE_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_ERRNO_H 1 +| #define HAVE_FCNTL_H 1 +| #define HAVE_GRP_H 1 +| #define HAVE_LIMITS_H 1 +| /* end confdefs.h. */ +| #include +configure:32974: result: no +configure:33002: checking for mach-o/dyld.h +configure:33011: result: no +configure:32896: checking malloc.h usability +configure:32913: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:32920: $? = 0 +configure:32934: result: yes +configure:32938: checking malloc.h presence +configure:32953: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +configure:32960: $? = 0 +configure:32974: result: yes +configure:33002: checking for malloc.h +configure:33011: result: yes +configure:32885: checking for memory.h +configure:32892: result: yes +configure:32896: checking netdb.h usability +configure:32913: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:32920: $? = 0 +configure:32934: result: yes +configure:32938: checking netdb.h presence +configure:32953: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +configure:32960: $? = 0 +configure:32974: result: yes +configure:33002: checking for netdb.h +configure:33011: result: yes +configure:32896: checking osreldate.h usability +configure:32913: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +conftest.c:134:23: fatal error: osreldate.h: No such file or directory + #include + ^ +compilation terminated. +configure:32920: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| #define HAVE_STRERROR_R 1 +| #define HAVE_CRYPT_R 1 +| #define CRYPT_R_STRUCT_CRYPT_DATA 1 +| #define HAVE_MMAP 1 +| #define HAVE_MEMMOVE 1 +| #define HAVE_GETPASS 1 +| #define HAVE_GMTIME_R 1 +| #define HAVE_LOCALTIME_R 1 +| #define HAVE_HSTRERROR 1 +| #define HAVE_MKSTEMP 1 +| #define DIRENT_INODE d_fileno +| #define DIRENT_TYPE d_type +| #define STDC_HEADERS 1 +| #define HAVE_ALLOCA_H 1 +| #define HAVE_CRYPT_H 1 +| #define HAVE_CTYPE_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_ERRNO_H 1 +| #define HAVE_FCNTL_H 1 +| #define HAVE_GRP_H 1 +| #define HAVE_LIMITS_H 1 +| #define HAVE_MALLOC_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_NETDB_H 1 +| /* end confdefs.h. */ +| #include +| #ifdef HAVE_SYS_TYPES_H +| # include +| #endif +| #ifdef HAVE_SYS_STAT_H +| # include +| #endif +| #ifdef STDC_HEADERS +| # include +| # include +| #else +| # ifdef HAVE_STDLIB_H +| # include +| # endif +| #endif +| #ifdef HAVE_STRING_H +| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H +| # include +| # endif +| # include +| #endif +| #ifdef HAVE_STRINGS_H +| # include +| #endif +| #ifdef HAVE_INTTYPES_H +| # include +| #endif +| #ifdef HAVE_STDINT_H +| # include +| #endif +| #ifdef HAVE_UNISTD_H +| # include +| #endif +| #include +configure:32934: result: no +configure:32938: checking osreldate.h presence +configure:32953: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +conftest.c:101:23: fatal error: osreldate.h: No such file or directory + #include + ^ +compilation terminated. +configure:32960: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| #define HAVE_STRERROR_R 1 +| #define HAVE_CRYPT_R 1 +| #define CRYPT_R_STRUCT_CRYPT_DATA 1 +| #define HAVE_MMAP 1 +| #define HAVE_MEMMOVE 1 +| #define HAVE_GETPASS 1 +| #define HAVE_GMTIME_R 1 +| #define HAVE_LOCALTIME_R 1 +| #define HAVE_HSTRERROR 1 +| #define HAVE_MKSTEMP 1 +| #define DIRENT_INODE d_fileno +| #define DIRENT_TYPE d_type +| #define STDC_HEADERS 1 +| #define HAVE_ALLOCA_H 1 +| #define HAVE_CRYPT_H 1 +| #define HAVE_CTYPE_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_ERRNO_H 1 +| #define HAVE_FCNTL_H 1 +| #define HAVE_GRP_H 1 +| #define HAVE_LIMITS_H 1 +| #define HAVE_MALLOC_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_NETDB_H 1 +| /* end confdefs.h. */ +| #include +configure:32974: result: no +configure:33002: checking for osreldate.h +configure:33011: result: no +configure:32896: checking poll.h usability +configure:32913: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:32920: $? = 0 +configure:32934: result: yes +configure:32938: checking poll.h presence +configure:32953: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +configure:32960: $? = 0 +configure:32974: result: yes +configure:33002: checking for poll.h +configure:33011: result: yes +configure:32896: checking process.h usability +configure:32913: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +conftest.c:135:21: fatal error: process.h: No such file or directory + #include + ^ +compilation terminated. +configure:32920: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| #define HAVE_STRERROR_R 1 +| #define HAVE_CRYPT_R 1 +| #define CRYPT_R_STRUCT_CRYPT_DATA 1 +| #define HAVE_MMAP 1 +| #define HAVE_MEMMOVE 1 +| #define HAVE_GETPASS 1 +| #define HAVE_GMTIME_R 1 +| #define HAVE_LOCALTIME_R 1 +| #define HAVE_HSTRERROR 1 +| #define HAVE_MKSTEMP 1 +| #define DIRENT_INODE d_fileno +| #define DIRENT_TYPE d_type +| #define STDC_HEADERS 1 +| #define HAVE_ALLOCA_H 1 +| #define HAVE_CRYPT_H 1 +| #define HAVE_CTYPE_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_ERRNO_H 1 +| #define HAVE_FCNTL_H 1 +| #define HAVE_GRP_H 1 +| #define HAVE_LIMITS_H 1 +| #define HAVE_MALLOC_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_NETDB_H 1 +| #define HAVE_POLL_H 1 +| /* end confdefs.h. */ +| #include +| #ifdef HAVE_SYS_TYPES_H +| # include +| #endif +| #ifdef HAVE_SYS_STAT_H +| # include +| #endif +| #ifdef STDC_HEADERS +| # include +| # include +| #else +| # ifdef HAVE_STDLIB_H +| # include +| # endif +| #endif +| #ifdef HAVE_STRING_H +| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H +| # include +| # endif +| # include +| #endif +| #ifdef HAVE_STRINGS_H +| # include +| #endif +| #ifdef HAVE_INTTYPES_H +| # include +| #endif +| #ifdef HAVE_STDINT_H +| # include +| #endif +| #ifdef HAVE_UNISTD_H +| # include +| #endif +| #include +configure:32934: result: no +configure:32938: checking process.h presence +configure:32953: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +conftest.c:102:21: fatal error: process.h: No such file or directory + #include + ^ +compilation terminated. +configure:32960: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| #define HAVE_STRERROR_R 1 +| #define HAVE_CRYPT_R 1 +| #define CRYPT_R_STRUCT_CRYPT_DATA 1 +| #define HAVE_MMAP 1 +| #define HAVE_MEMMOVE 1 +| #define HAVE_GETPASS 1 +| #define HAVE_GMTIME_R 1 +| #define HAVE_LOCALTIME_R 1 +| #define HAVE_HSTRERROR 1 +| #define HAVE_MKSTEMP 1 +| #define DIRENT_INODE d_fileno +| #define DIRENT_TYPE d_type +| #define STDC_HEADERS 1 +| #define HAVE_ALLOCA_H 1 +| #define HAVE_CRYPT_H 1 +| #define HAVE_CTYPE_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_ERRNO_H 1 +| #define HAVE_FCNTL_H 1 +| #define HAVE_GRP_H 1 +| #define HAVE_LIMITS_H 1 +| #define HAVE_MALLOC_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_NETDB_H 1 +| #define HAVE_POLL_H 1 +| /* end confdefs.h. */ +| #include +configure:32974: result: no +configure:33002: checking for process.h +configure:33011: result: no +configure:32896: checking pwd.h usability +configure:32913: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:32920: $? = 0 +configure:32934: result: yes +configure:32938: checking pwd.h presence +configure:32953: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +configure:32960: $? = 0 +configure:32974: result: yes +configure:33002: checking for pwd.h +configure:33011: result: yes +configure:32896: checking semaphore.h usability +configure:32913: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:32920: $? = 0 +configure:32934: result: yes +configure:32938: checking semaphore.h presence +configure:32953: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +configure:32960: $? = 0 +configure:32974: result: yes +configure:33002: checking for semaphore.h +configure:33011: result: yes +configure:32896: checking signal.h usability +configure:32913: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:32920: $? = 0 +configure:32934: result: yes +configure:32938: checking signal.h presence +configure:32953: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +configure:32960: $? = 0 +configure:32974: result: yes +configure:33002: checking for signal.h +configure:33011: result: yes +configure:32896: checking stdarg.h usability +configure:32913: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:32920: $? = 0 +configure:32934: result: yes +configure:32938: checking stdarg.h presence +configure:32953: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +configure:32960: $? = 0 +configure:32974: result: yes +configure:33002: checking for stdarg.h +configure:33011: result: yes +configure:32896: checking stddef.h usability +configure:32913: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:32920: $? = 0 +configure:32934: result: yes +configure:32938: checking stddef.h presence +configure:32953: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +configure:32960: $? = 0 +configure:32974: result: yes +configure:33002: checking for stddef.h +configure:33011: result: yes +configure:32896: checking stdio.h usability +configure:32913: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:32920: $? = 0 +configure:32934: result: yes +configure:32938: checking stdio.h presence +configure:32953: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +configure:32960: $? = 0 +configure:32974: result: yes +configure:33002: checking for stdio.h +configure:33011: result: yes +configure:32885: checking for stdlib.h +configure:32892: result: yes +configure:32885: checking for string.h +configure:32892: result: yes +configure:32885: checking for strings.h +configure:32892: result: yes +configure:32896: checking sysapi.h usability +configure:32913: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +conftest.c:144:20: fatal error: sysapi.h: No such file or directory + #include + ^ +compilation terminated. +configure:32920: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| #define HAVE_STRERROR_R 1 +| #define HAVE_CRYPT_R 1 +| #define CRYPT_R_STRUCT_CRYPT_DATA 1 +| #define HAVE_MMAP 1 +| #define HAVE_MEMMOVE 1 +| #define HAVE_GETPASS 1 +| #define HAVE_GMTIME_R 1 +| #define HAVE_LOCALTIME_R 1 +| #define HAVE_HSTRERROR 1 +| #define HAVE_MKSTEMP 1 +| #define DIRENT_INODE d_fileno +| #define DIRENT_TYPE d_type +| #define STDC_HEADERS 1 +| #define HAVE_ALLOCA_H 1 +| #define HAVE_CRYPT_H 1 +| #define HAVE_CTYPE_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_ERRNO_H 1 +| #define HAVE_FCNTL_H 1 +| #define HAVE_GRP_H 1 +| #define HAVE_LIMITS_H 1 +| #define HAVE_MALLOC_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_NETDB_H 1 +| #define HAVE_POLL_H 1 +| #define HAVE_PWD_H 1 +| #define HAVE_SEMAPHORE_H 1 +| #define HAVE_SIGNAL_H 1 +| #define HAVE_STDARG_H 1 +| #define HAVE_STDDEF_H 1 +| #define HAVE_STDIO_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_STRINGS_H 1 +| /* end confdefs.h. */ +| #include +| #ifdef HAVE_SYS_TYPES_H +| # include +| #endif +| #ifdef HAVE_SYS_STAT_H +| # include +| #endif +| #ifdef STDC_HEADERS +| # include +| # include +| #else +| # ifdef HAVE_STDLIB_H +| # include +| # endif +| #endif +| #ifdef HAVE_STRING_H +| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H +| # include +| # endif +| # include +| #endif +| #ifdef HAVE_STRINGS_H +| # include +| #endif +| #ifdef HAVE_INTTYPES_H +| # include +| #endif +| #ifdef HAVE_STDINT_H +| # include +| #endif +| #ifdef HAVE_UNISTD_H +| # include +| #endif +| #include +configure:32934: result: no +configure:32938: checking sysapi.h presence +configure:32953: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +conftest.c:111:20: fatal error: sysapi.h: No such file or directory + #include + ^ +compilation terminated. +configure:32960: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| #define HAVE_STRERROR_R 1 +| #define HAVE_CRYPT_R 1 +| #define CRYPT_R_STRUCT_CRYPT_DATA 1 +| #define HAVE_MMAP 1 +| #define HAVE_MEMMOVE 1 +| #define HAVE_GETPASS 1 +| #define HAVE_GMTIME_R 1 +| #define HAVE_LOCALTIME_R 1 +| #define HAVE_HSTRERROR 1 +| #define HAVE_MKSTEMP 1 +| #define DIRENT_INODE d_fileno +| #define DIRENT_TYPE d_type +| #define STDC_HEADERS 1 +| #define HAVE_ALLOCA_H 1 +| #define HAVE_CRYPT_H 1 +| #define HAVE_CTYPE_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_ERRNO_H 1 +| #define HAVE_FCNTL_H 1 +| #define HAVE_GRP_H 1 +| #define HAVE_LIMITS_H 1 +| #define HAVE_MALLOC_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_NETDB_H 1 +| #define HAVE_POLL_H 1 +| #define HAVE_PWD_H 1 +| #define HAVE_SEMAPHORE_H 1 +| #define HAVE_SIGNAL_H 1 +| #define HAVE_STDARG_H 1 +| #define HAVE_STDDEF_H 1 +| #define HAVE_STDIO_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_STRINGS_H 1 +| /* end confdefs.h. */ +| #include +configure:32974: result: no +configure:33002: checking for sysapi.h +configure:33011: result: no +configure:32896: checking sysgtime.h usability +configure:32913: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +conftest.c:144:22: fatal error: sysgtime.h: No such file or directory + #include + ^ +compilation terminated. +configure:32920: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| #define HAVE_STRERROR_R 1 +| #define HAVE_CRYPT_R 1 +| #define CRYPT_R_STRUCT_CRYPT_DATA 1 +| #define HAVE_MMAP 1 +| #define HAVE_MEMMOVE 1 +| #define HAVE_GETPASS 1 +| #define HAVE_GMTIME_R 1 +| #define HAVE_LOCALTIME_R 1 +| #define HAVE_HSTRERROR 1 +| #define HAVE_MKSTEMP 1 +| #define DIRENT_INODE d_fileno +| #define DIRENT_TYPE d_type +| #define STDC_HEADERS 1 +| #define HAVE_ALLOCA_H 1 +| #define HAVE_CRYPT_H 1 +| #define HAVE_CTYPE_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_ERRNO_H 1 +| #define HAVE_FCNTL_H 1 +| #define HAVE_GRP_H 1 +| #define HAVE_LIMITS_H 1 +| #define HAVE_MALLOC_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_NETDB_H 1 +| #define HAVE_POLL_H 1 +| #define HAVE_PWD_H 1 +| #define HAVE_SEMAPHORE_H 1 +| #define HAVE_SIGNAL_H 1 +| #define HAVE_STDARG_H 1 +| #define HAVE_STDDEF_H 1 +| #define HAVE_STDIO_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_STRINGS_H 1 +| /* end confdefs.h. */ +| #include +| #ifdef HAVE_SYS_TYPES_H +| # include +| #endif +| #ifdef HAVE_SYS_STAT_H +| # include +| #endif +| #ifdef STDC_HEADERS +| # include +| # include +| #else +| # ifdef HAVE_STDLIB_H +| # include +| # endif +| #endif +| #ifdef HAVE_STRING_H +| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H +| # include +| # endif +| # include +| #endif +| #ifdef HAVE_STRINGS_H +| # include +| #endif +| #ifdef HAVE_INTTYPES_H +| # include +| #endif +| #ifdef HAVE_STDINT_H +| # include +| #endif +| #ifdef HAVE_UNISTD_H +| # include +| #endif +| #include +configure:32934: result: no +configure:32938: checking sysgtime.h presence +configure:32953: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +conftest.c:111:22: fatal error: sysgtime.h: No such file or directory + #include + ^ +compilation terminated. +configure:32960: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| #define HAVE_STRERROR_R 1 +| #define HAVE_CRYPT_R 1 +| #define CRYPT_R_STRUCT_CRYPT_DATA 1 +| #define HAVE_MMAP 1 +| #define HAVE_MEMMOVE 1 +| #define HAVE_GETPASS 1 +| #define HAVE_GMTIME_R 1 +| #define HAVE_LOCALTIME_R 1 +| #define HAVE_HSTRERROR 1 +| #define HAVE_MKSTEMP 1 +| #define DIRENT_INODE d_fileno +| #define DIRENT_TYPE d_type +| #define STDC_HEADERS 1 +| #define HAVE_ALLOCA_H 1 +| #define HAVE_CRYPT_H 1 +| #define HAVE_CTYPE_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_ERRNO_H 1 +| #define HAVE_FCNTL_H 1 +| #define HAVE_GRP_H 1 +| #define HAVE_LIMITS_H 1 +| #define HAVE_MALLOC_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_NETDB_H 1 +| #define HAVE_POLL_H 1 +| #define HAVE_PWD_H 1 +| #define HAVE_SEMAPHORE_H 1 +| #define HAVE_SIGNAL_H 1 +| #define HAVE_STDARG_H 1 +| #define HAVE_STDDEF_H 1 +| #define HAVE_STDIO_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_STRINGS_H 1 +| /* end confdefs.h. */ +| #include +configure:32974: result: no +configure:33002: checking for sysgtime.h +configure:33011: result: no +configure:32896: checking termios.h usability +configure:32913: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:32920: $? = 0 +configure:32934: result: yes +configure:32938: checking termios.h presence +configure:32953: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +configure:32960: $? = 0 +configure:32974: result: yes +configure:33002: checking for termios.h +configure:33011: result: yes +configure:32896: checking time.h usability +configure:32913: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:32920: $? = 0 +configure:32934: result: yes +configure:32938: checking time.h presence +configure:32953: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +configure:32960: $? = 0 +configure:32974: result: yes +configure:33002: checking for time.h +configure:33011: result: yes +configure:32896: checking tpfeq.h usability +configure:32913: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +conftest.c:146:19: fatal error: tpfeq.h: No such file or directory + #include + ^ +compilation terminated. +configure:32920: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| #define HAVE_STRERROR_R 1 +| #define HAVE_CRYPT_R 1 +| #define CRYPT_R_STRUCT_CRYPT_DATA 1 +| #define HAVE_MMAP 1 +| #define HAVE_MEMMOVE 1 +| #define HAVE_GETPASS 1 +| #define HAVE_GMTIME_R 1 +| #define HAVE_LOCALTIME_R 1 +| #define HAVE_HSTRERROR 1 +| #define HAVE_MKSTEMP 1 +| #define DIRENT_INODE d_fileno +| #define DIRENT_TYPE d_type +| #define STDC_HEADERS 1 +| #define HAVE_ALLOCA_H 1 +| #define HAVE_CRYPT_H 1 +| #define HAVE_CTYPE_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_ERRNO_H 1 +| #define HAVE_FCNTL_H 1 +| #define HAVE_GRP_H 1 +| #define HAVE_LIMITS_H 1 +| #define HAVE_MALLOC_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_NETDB_H 1 +| #define HAVE_POLL_H 1 +| #define HAVE_PWD_H 1 +| #define HAVE_SEMAPHORE_H 1 +| #define HAVE_SIGNAL_H 1 +| #define HAVE_STDARG_H 1 +| #define HAVE_STDDEF_H 1 +| #define HAVE_STDIO_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_TERMIOS_H 1 +| #define HAVE_TIME_H 1 +| /* end confdefs.h. */ +| #include +| #ifdef HAVE_SYS_TYPES_H +| # include +| #endif +| #ifdef HAVE_SYS_STAT_H +| # include +| #endif +| #ifdef STDC_HEADERS +| # include +| # include +| #else +| # ifdef HAVE_STDLIB_H +| # include +| # endif +| #endif +| #ifdef HAVE_STRING_H +| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H +| # include +| # endif +| # include +| #endif +| #ifdef HAVE_STRINGS_H +| # include +| #endif +| #ifdef HAVE_INTTYPES_H +| # include +| #endif +| #ifdef HAVE_STDINT_H +| # include +| #endif +| #ifdef HAVE_UNISTD_H +| # include +| #endif +| #include +configure:32934: result: no +configure:32938: checking tpfeq.h presence +configure:32953: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +conftest.c:113:19: fatal error: tpfeq.h: No such file or directory + #include + ^ +compilation terminated. +configure:32960: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| #define HAVE_STRERROR_R 1 +| #define HAVE_CRYPT_R 1 +| #define CRYPT_R_STRUCT_CRYPT_DATA 1 +| #define HAVE_MMAP 1 +| #define HAVE_MEMMOVE 1 +| #define HAVE_GETPASS 1 +| #define HAVE_GMTIME_R 1 +| #define HAVE_LOCALTIME_R 1 +| #define HAVE_HSTRERROR 1 +| #define HAVE_MKSTEMP 1 +| #define DIRENT_INODE d_fileno +| #define DIRENT_TYPE d_type +| #define STDC_HEADERS 1 +| #define HAVE_ALLOCA_H 1 +| #define HAVE_CRYPT_H 1 +| #define HAVE_CTYPE_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_ERRNO_H 1 +| #define HAVE_FCNTL_H 1 +| #define HAVE_GRP_H 1 +| #define HAVE_LIMITS_H 1 +| #define HAVE_MALLOC_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_NETDB_H 1 +| #define HAVE_POLL_H 1 +| #define HAVE_PWD_H 1 +| #define HAVE_SEMAPHORE_H 1 +| #define HAVE_SIGNAL_H 1 +| #define HAVE_STDARG_H 1 +| #define HAVE_STDDEF_H 1 +| #define HAVE_STDIO_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_TERMIOS_H 1 +| #define HAVE_TIME_H 1 +| /* end confdefs.h. */ +| #include +configure:32974: result: no +configure:33002: checking for tpfeq.h +configure:33011: result: no +configure:32896: checking tpfio.h usability +configure:32913: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +conftest.c:146:19: fatal error: tpfio.h: No such file or directory + #include + ^ +compilation terminated. +configure:32920: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| #define HAVE_STRERROR_R 1 +| #define HAVE_CRYPT_R 1 +| #define CRYPT_R_STRUCT_CRYPT_DATA 1 +| #define HAVE_MMAP 1 +| #define HAVE_MEMMOVE 1 +| #define HAVE_GETPASS 1 +| #define HAVE_GMTIME_R 1 +| #define HAVE_LOCALTIME_R 1 +| #define HAVE_HSTRERROR 1 +| #define HAVE_MKSTEMP 1 +| #define DIRENT_INODE d_fileno +| #define DIRENT_TYPE d_type +| #define STDC_HEADERS 1 +| #define HAVE_ALLOCA_H 1 +| #define HAVE_CRYPT_H 1 +| #define HAVE_CTYPE_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_ERRNO_H 1 +| #define HAVE_FCNTL_H 1 +| #define HAVE_GRP_H 1 +| #define HAVE_LIMITS_H 1 +| #define HAVE_MALLOC_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_NETDB_H 1 +| #define HAVE_POLL_H 1 +| #define HAVE_PWD_H 1 +| #define HAVE_SEMAPHORE_H 1 +| #define HAVE_SIGNAL_H 1 +| #define HAVE_STDARG_H 1 +| #define HAVE_STDDEF_H 1 +| #define HAVE_STDIO_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_TERMIOS_H 1 +| #define HAVE_TIME_H 1 +| /* end confdefs.h. */ +| #include +| #ifdef HAVE_SYS_TYPES_H +| # include +| #endif +| #ifdef HAVE_SYS_STAT_H +| # include +| #endif +| #ifdef STDC_HEADERS +| # include +| # include +| #else +| # ifdef HAVE_STDLIB_H +| # include +| # endif +| #endif +| #ifdef HAVE_STRING_H +| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H +| # include +| # endif +| # include +| #endif +| #ifdef HAVE_STRINGS_H +| # include +| #endif +| #ifdef HAVE_INTTYPES_H +| # include +| #endif +| #ifdef HAVE_STDINT_H +| # include +| #endif +| #ifdef HAVE_UNISTD_H +| # include +| #endif +| #include +configure:32934: result: no +configure:32938: checking tpfio.h presence +configure:32953: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +conftest.c:113:19: fatal error: tpfio.h: No such file or directory + #include + ^ +compilation terminated. +configure:32960: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| #define HAVE_STRERROR_R 1 +| #define HAVE_CRYPT_R 1 +| #define CRYPT_R_STRUCT_CRYPT_DATA 1 +| #define HAVE_MMAP 1 +| #define HAVE_MEMMOVE 1 +| #define HAVE_GETPASS 1 +| #define HAVE_GMTIME_R 1 +| #define HAVE_LOCALTIME_R 1 +| #define HAVE_HSTRERROR 1 +| #define HAVE_MKSTEMP 1 +| #define DIRENT_INODE d_fileno +| #define DIRENT_TYPE d_type +| #define STDC_HEADERS 1 +| #define HAVE_ALLOCA_H 1 +| #define HAVE_CRYPT_H 1 +| #define HAVE_CTYPE_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_ERRNO_H 1 +| #define HAVE_FCNTL_H 1 +| #define HAVE_GRP_H 1 +| #define HAVE_LIMITS_H 1 +| #define HAVE_MALLOC_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_NETDB_H 1 +| #define HAVE_POLL_H 1 +| #define HAVE_PWD_H 1 +| #define HAVE_SEMAPHORE_H 1 +| #define HAVE_SIGNAL_H 1 +| #define HAVE_STDARG_H 1 +| #define HAVE_STDDEF_H 1 +| #define HAVE_STDIO_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_TERMIOS_H 1 +| #define HAVE_TIME_H 1 +| /* end confdefs.h. */ +| #include +configure:32974: result: no +configure:33002: checking for tpfio.h +configure:33011: result: no +configure:32885: checking for unistd.h +configure:32892: result: yes +configure:32896: checking unix.h usability +configure:32913: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +conftest.c:147:18: fatal error: unix.h: No such file or directory + #include + ^ +compilation terminated. +configure:32920: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| #define HAVE_STRERROR_R 1 +| #define HAVE_CRYPT_R 1 +| #define CRYPT_R_STRUCT_CRYPT_DATA 1 +| #define HAVE_MMAP 1 +| #define HAVE_MEMMOVE 1 +| #define HAVE_GETPASS 1 +| #define HAVE_GMTIME_R 1 +| #define HAVE_LOCALTIME_R 1 +| #define HAVE_HSTRERROR 1 +| #define HAVE_MKSTEMP 1 +| #define DIRENT_INODE d_fileno +| #define DIRENT_TYPE d_type +| #define STDC_HEADERS 1 +| #define HAVE_ALLOCA_H 1 +| #define HAVE_CRYPT_H 1 +| #define HAVE_CTYPE_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_ERRNO_H 1 +| #define HAVE_FCNTL_H 1 +| #define HAVE_GRP_H 1 +| #define HAVE_LIMITS_H 1 +| #define HAVE_MALLOC_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_NETDB_H 1 +| #define HAVE_POLL_H 1 +| #define HAVE_PWD_H 1 +| #define HAVE_SEMAPHORE_H 1 +| #define HAVE_SIGNAL_H 1 +| #define HAVE_STDARG_H 1 +| #define HAVE_STDDEF_H 1 +| #define HAVE_STDIO_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_TERMIOS_H 1 +| #define HAVE_TIME_H 1 +| #define HAVE_UNISTD_H 1 +| /* end confdefs.h. */ +| #include +| #ifdef HAVE_SYS_TYPES_H +| # include +| #endif +| #ifdef HAVE_SYS_STAT_H +| # include +| #endif +| #ifdef STDC_HEADERS +| # include +| # include +| #else +| # ifdef HAVE_STDLIB_H +| # include +| # endif +| #endif +| #ifdef HAVE_STRING_H +| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H +| # include +| # endif +| # include +| #endif +| #ifdef HAVE_STRINGS_H +| # include +| #endif +| #ifdef HAVE_INTTYPES_H +| # include +| #endif +| #ifdef HAVE_STDINT_H +| # include +| #endif +| #ifdef HAVE_UNISTD_H +| # include +| #endif +| #include +configure:32934: result: no +configure:32938: checking unix.h presence +configure:32953: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +conftest.c:114:18: fatal error: unix.h: No such file or directory + #include + ^ +compilation terminated. +configure:32960: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| #define HAVE_STRERROR_R 1 +| #define HAVE_CRYPT_R 1 +| #define CRYPT_R_STRUCT_CRYPT_DATA 1 +| #define HAVE_MMAP 1 +| #define HAVE_MEMMOVE 1 +| #define HAVE_GETPASS 1 +| #define HAVE_GMTIME_R 1 +| #define HAVE_LOCALTIME_R 1 +| #define HAVE_HSTRERROR 1 +| #define HAVE_MKSTEMP 1 +| #define DIRENT_INODE d_fileno +| #define DIRENT_TYPE d_type +| #define STDC_HEADERS 1 +| #define HAVE_ALLOCA_H 1 +| #define HAVE_CRYPT_H 1 +| #define HAVE_CTYPE_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_ERRNO_H 1 +| #define HAVE_FCNTL_H 1 +| #define HAVE_GRP_H 1 +| #define HAVE_LIMITS_H 1 +| #define HAVE_MALLOC_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_NETDB_H 1 +| #define HAVE_POLL_H 1 +| #define HAVE_PWD_H 1 +| #define HAVE_SEMAPHORE_H 1 +| #define HAVE_SIGNAL_H 1 +| #define HAVE_STDARG_H 1 +| #define HAVE_STDDEF_H 1 +| #define HAVE_STDIO_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_TERMIOS_H 1 +| #define HAVE_TIME_H 1 +| #define HAVE_UNISTD_H 1 +| /* end confdefs.h. */ +| #include +configure:32974: result: no +configure:33002: checking for unix.h +configure:33011: result: no +configure:32896: checking arpa/inet.h usability +configure:32913: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:32920: $? = 0 +configure:32934: result: yes +configure:32938: checking arpa/inet.h presence +configure:32953: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +configure:32960: $? = 0 +configure:32974: result: yes +configure:33002: checking for arpa/inet.h +configure:33011: result: yes +configure:32885: checking for kernel/OS.h +configure:32892: result: no +configure:32896: checking net/errno.h usability +configure:32913: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +conftest.c:148:23: fatal error: net/errno.h: No such file or directory + #include + ^ +compilation terminated. +configure:32920: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| #define HAVE_STRERROR_R 1 +| #define HAVE_CRYPT_R 1 +| #define CRYPT_R_STRUCT_CRYPT_DATA 1 +| #define HAVE_MMAP 1 +| #define HAVE_MEMMOVE 1 +| #define HAVE_GETPASS 1 +| #define HAVE_GMTIME_R 1 +| #define HAVE_LOCALTIME_R 1 +| #define HAVE_HSTRERROR 1 +| #define HAVE_MKSTEMP 1 +| #define DIRENT_INODE d_fileno +| #define DIRENT_TYPE d_type +| #define STDC_HEADERS 1 +| #define HAVE_ALLOCA_H 1 +| #define HAVE_CRYPT_H 1 +| #define HAVE_CTYPE_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_ERRNO_H 1 +| #define HAVE_FCNTL_H 1 +| #define HAVE_GRP_H 1 +| #define HAVE_LIMITS_H 1 +| #define HAVE_MALLOC_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_NETDB_H 1 +| #define HAVE_POLL_H 1 +| #define HAVE_PWD_H 1 +| #define HAVE_SEMAPHORE_H 1 +| #define HAVE_SIGNAL_H 1 +| #define HAVE_STDARG_H 1 +| #define HAVE_STDDEF_H 1 +| #define HAVE_STDIO_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_TERMIOS_H 1 +| #define HAVE_TIME_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_ARPA_INET_H 1 +| /* end confdefs.h. */ +| #include +| #ifdef HAVE_SYS_TYPES_H +| # include +| #endif +| #ifdef HAVE_SYS_STAT_H +| # include +| #endif +| #ifdef STDC_HEADERS +| # include +| # include +| #else +| # ifdef HAVE_STDLIB_H +| # include +| # endif +| #endif +| #ifdef HAVE_STRING_H +| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H +| # include +| # endif +| # include +| #endif +| #ifdef HAVE_STRINGS_H +| # include +| #endif +| #ifdef HAVE_INTTYPES_H +| # include +| #endif +| #ifdef HAVE_STDINT_H +| # include +| #endif +| #ifdef HAVE_UNISTD_H +| # include +| #endif +| #include +configure:32934: result: no +configure:32938: checking net/errno.h presence +configure:32953: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +conftest.c:115:23: fatal error: net/errno.h: No such file or directory + #include + ^ +compilation terminated. +configure:32960: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| #define HAVE_STRERROR_R 1 +| #define HAVE_CRYPT_R 1 +| #define CRYPT_R_STRUCT_CRYPT_DATA 1 +| #define HAVE_MMAP 1 +| #define HAVE_MEMMOVE 1 +| #define HAVE_GETPASS 1 +| #define HAVE_GMTIME_R 1 +| #define HAVE_LOCALTIME_R 1 +| #define HAVE_HSTRERROR 1 +| #define HAVE_MKSTEMP 1 +| #define DIRENT_INODE d_fileno +| #define DIRENT_TYPE d_type +| #define STDC_HEADERS 1 +| #define HAVE_ALLOCA_H 1 +| #define HAVE_CRYPT_H 1 +| #define HAVE_CTYPE_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_ERRNO_H 1 +| #define HAVE_FCNTL_H 1 +| #define HAVE_GRP_H 1 +| #define HAVE_LIMITS_H 1 +| #define HAVE_MALLOC_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_NETDB_H 1 +| #define HAVE_POLL_H 1 +| #define HAVE_PWD_H 1 +| #define HAVE_SEMAPHORE_H 1 +| #define HAVE_SIGNAL_H 1 +| #define HAVE_STDARG_H 1 +| #define HAVE_STDDEF_H 1 +| #define HAVE_STDIO_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_TERMIOS_H 1 +| #define HAVE_TIME_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_ARPA_INET_H 1 +| /* end confdefs.h. */ +| #include +configure:32974: result: no +configure:33002: checking for net/errno.h +configure:33011: result: no +configure:32896: checking netinet/in.h usability +configure:32913: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:32920: $? = 0 +configure:32934: result: yes +configure:32938: checking netinet/in.h presence +configure:32953: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +configure:32960: $? = 0 +configure:32974: result: yes +configure:33002: checking for netinet/in.h +configure:33011: result: yes +configure:32896: checking netinet/sctp.h usability +configure:32913: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +conftest.c:149:26: fatal error: netinet/sctp.h: No such file or directory + #include + ^ +compilation terminated. +configure:32920: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| #define HAVE_STRERROR_R 1 +| #define HAVE_CRYPT_R 1 +| #define CRYPT_R_STRUCT_CRYPT_DATA 1 +| #define HAVE_MMAP 1 +| #define HAVE_MEMMOVE 1 +| #define HAVE_GETPASS 1 +| #define HAVE_GMTIME_R 1 +| #define HAVE_LOCALTIME_R 1 +| #define HAVE_HSTRERROR 1 +| #define HAVE_MKSTEMP 1 +| #define DIRENT_INODE d_fileno +| #define DIRENT_TYPE d_type +| #define STDC_HEADERS 1 +| #define HAVE_ALLOCA_H 1 +| #define HAVE_CRYPT_H 1 +| #define HAVE_CTYPE_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_ERRNO_H 1 +| #define HAVE_FCNTL_H 1 +| #define HAVE_GRP_H 1 +| #define HAVE_LIMITS_H 1 +| #define HAVE_MALLOC_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_NETDB_H 1 +| #define HAVE_POLL_H 1 +| #define HAVE_PWD_H 1 +| #define HAVE_SEMAPHORE_H 1 +| #define HAVE_SIGNAL_H 1 +| #define HAVE_STDARG_H 1 +| #define HAVE_STDDEF_H 1 +| #define HAVE_STDIO_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_TERMIOS_H 1 +| #define HAVE_TIME_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_ARPA_INET_H 1 +| #define HAVE_NETINET_IN_H 1 +| /* end confdefs.h. */ +| #include +| #ifdef HAVE_SYS_TYPES_H +| # include +| #endif +| #ifdef HAVE_SYS_STAT_H +| # include +| #endif +| #ifdef STDC_HEADERS +| # include +| # include +| #else +| # ifdef HAVE_STDLIB_H +| # include +| # endif +| #endif +| #ifdef HAVE_STRING_H +| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H +| # include +| # endif +| # include +| #endif +| #ifdef HAVE_STRINGS_H +| # include +| #endif +| #ifdef HAVE_INTTYPES_H +| # include +| #endif +| #ifdef HAVE_STDINT_H +| # include +| #endif +| #ifdef HAVE_UNISTD_H +| # include +| #endif +| #include +configure:32934: result: no +configure:32938: checking netinet/sctp.h presence +configure:32953: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +conftest.c:116:26: fatal error: netinet/sctp.h: No such file or directory + #include + ^ +compilation terminated. +configure:32960: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| #define HAVE_STRERROR_R 1 +| #define HAVE_CRYPT_R 1 +| #define CRYPT_R_STRUCT_CRYPT_DATA 1 +| #define HAVE_MMAP 1 +| #define HAVE_MEMMOVE 1 +| #define HAVE_GETPASS 1 +| #define HAVE_GMTIME_R 1 +| #define HAVE_LOCALTIME_R 1 +| #define HAVE_HSTRERROR 1 +| #define HAVE_MKSTEMP 1 +| #define DIRENT_INODE d_fileno +| #define DIRENT_TYPE d_type +| #define STDC_HEADERS 1 +| #define HAVE_ALLOCA_H 1 +| #define HAVE_CRYPT_H 1 +| #define HAVE_CTYPE_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_ERRNO_H 1 +| #define HAVE_FCNTL_H 1 +| #define HAVE_GRP_H 1 +| #define HAVE_LIMITS_H 1 +| #define HAVE_MALLOC_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_NETDB_H 1 +| #define HAVE_POLL_H 1 +| #define HAVE_PWD_H 1 +| #define HAVE_SEMAPHORE_H 1 +| #define HAVE_SIGNAL_H 1 +| #define HAVE_STDARG_H 1 +| #define HAVE_STDDEF_H 1 +| #define HAVE_STDIO_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_TERMIOS_H 1 +| #define HAVE_TIME_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_ARPA_INET_H 1 +| #define HAVE_NETINET_IN_H 1 +| /* end confdefs.h. */ +| #include +configure:32974: result: no +configure:33002: checking for netinet/sctp.h +configure:33011: result: no +configure:32896: checking netinet/sctp_uio.h usability +configure:32913: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +conftest.c:149:30: fatal error: netinet/sctp_uio.h: No such file or directory + #include + ^ +compilation terminated. +configure:32920: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| #define HAVE_STRERROR_R 1 +| #define HAVE_CRYPT_R 1 +| #define CRYPT_R_STRUCT_CRYPT_DATA 1 +| #define HAVE_MMAP 1 +| #define HAVE_MEMMOVE 1 +| #define HAVE_GETPASS 1 +| #define HAVE_GMTIME_R 1 +| #define HAVE_LOCALTIME_R 1 +| #define HAVE_HSTRERROR 1 +| #define HAVE_MKSTEMP 1 +| #define DIRENT_INODE d_fileno +| #define DIRENT_TYPE d_type +| #define STDC_HEADERS 1 +| #define HAVE_ALLOCA_H 1 +| #define HAVE_CRYPT_H 1 +| #define HAVE_CTYPE_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_ERRNO_H 1 +| #define HAVE_FCNTL_H 1 +| #define HAVE_GRP_H 1 +| #define HAVE_LIMITS_H 1 +| #define HAVE_MALLOC_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_NETDB_H 1 +| #define HAVE_POLL_H 1 +| #define HAVE_PWD_H 1 +| #define HAVE_SEMAPHORE_H 1 +| #define HAVE_SIGNAL_H 1 +| #define HAVE_STDARG_H 1 +| #define HAVE_STDDEF_H 1 +| #define HAVE_STDIO_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_TERMIOS_H 1 +| #define HAVE_TIME_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_ARPA_INET_H 1 +| #define HAVE_NETINET_IN_H 1 +| /* end confdefs.h. */ +| #include +| #ifdef HAVE_SYS_TYPES_H +| # include +| #endif +| #ifdef HAVE_SYS_STAT_H +| # include +| #endif +| #ifdef STDC_HEADERS +| # include +| # include +| #else +| # ifdef HAVE_STDLIB_H +| # include +| # endif +| #endif +| #ifdef HAVE_STRING_H +| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H +| # include +| # endif +| # include +| #endif +| #ifdef HAVE_STRINGS_H +| # include +| #endif +| #ifdef HAVE_INTTYPES_H +| # include +| #endif +| #ifdef HAVE_STDINT_H +| # include +| #endif +| #ifdef HAVE_UNISTD_H +| # include +| #endif +| #include +configure:32934: result: no +configure:32938: checking netinet/sctp_uio.h presence +configure:32953: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +conftest.c:116:30: fatal error: netinet/sctp_uio.h: No such file or directory + #include + ^ +compilation terminated. +configure:32960: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| #define HAVE_STRERROR_R 1 +| #define HAVE_CRYPT_R 1 +| #define CRYPT_R_STRUCT_CRYPT_DATA 1 +| #define HAVE_MMAP 1 +| #define HAVE_MEMMOVE 1 +| #define HAVE_GETPASS 1 +| #define HAVE_GMTIME_R 1 +| #define HAVE_LOCALTIME_R 1 +| #define HAVE_HSTRERROR 1 +| #define HAVE_MKSTEMP 1 +| #define DIRENT_INODE d_fileno +| #define DIRENT_TYPE d_type +| #define STDC_HEADERS 1 +| #define HAVE_ALLOCA_H 1 +| #define HAVE_CRYPT_H 1 +| #define HAVE_CTYPE_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_ERRNO_H 1 +| #define HAVE_FCNTL_H 1 +| #define HAVE_GRP_H 1 +| #define HAVE_LIMITS_H 1 +| #define HAVE_MALLOC_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_NETDB_H 1 +| #define HAVE_POLL_H 1 +| #define HAVE_PWD_H 1 +| #define HAVE_SEMAPHORE_H 1 +| #define HAVE_SIGNAL_H 1 +| #define HAVE_STDARG_H 1 +| #define HAVE_STDDEF_H 1 +| #define HAVE_STDIO_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_TERMIOS_H 1 +| #define HAVE_TIME_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_ARPA_INET_H 1 +| #define HAVE_NETINET_IN_H 1 +| /* end confdefs.h. */ +| #include +configure:32974: result: no +configure:33002: checking for netinet/sctp_uio.h +configure:33011: result: no +configure:32885: checking for sys/file.h +configure:32892: result: yes +configure:32896: checking sys/ioctl.h usability +configure:32913: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:32920: $? = 0 +configure:32934: result: yes +configure:32938: checking sys/ioctl.h presence +configure:32953: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +configure:32960: $? = 0 +configure:32974: result: yes +configure:33002: checking for sys/ioctl.h +configure:33011: result: yes +configure:32885: checking for sys/mman.h +configure:32892: result: yes +configure:32896: checking sys/poll.h usability +configure:32913: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:32920: $? = 0 +configure:32934: result: yes +configure:32938: checking sys/poll.h presence +configure:32953: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +configure:32960: $? = 0 +configure:32974: result: yes +configure:33002: checking for sys/poll.h +configure:33011: result: yes +configure:32896: checking sys/resource.h usability +configure:32913: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:32920: $? = 0 +configure:32934: result: yes +configure:32938: checking sys/resource.h presence +configure:32953: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +configure:32960: $? = 0 +configure:32974: result: yes +configure:33002: checking for sys/resource.h +configure:33011: result: yes +configure:32896: checking sys/select.h usability +configure:32913: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:32920: $? = 0 +configure:32934: result: yes +configure:32938: checking sys/select.h presence +configure:32953: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +configure:32960: $? = 0 +configure:32974: result: yes +configure:33002: checking for sys/select.h +configure:33011: result: yes +configure:32896: checking sys/sem.h usability +configure:32913: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:32920: $? = 0 +configure:32934: result: yes +configure:32938: checking sys/sem.h presence +configure:32953: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +configure:32960: $? = 0 +configure:32974: result: yes +configure:33002: checking for sys/sem.h +configure:33011: result: yes +configure:32896: checking sys/sendfile.h usability +configure:32913: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:32920: $? = 0 +configure:32934: result: yes +configure:32938: checking sys/sendfile.h presence +configure:32953: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +configure:32960: $? = 0 +configure:32974: result: yes +configure:33002: checking for sys/sendfile.h +configure:33011: result: yes +configure:32896: checking sys/signal.h usability +configure:32913: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:32920: $? = 0 +configure:32934: result: yes +configure:32938: checking sys/signal.h presence +configure:32953: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +configure:32960: $? = 0 +configure:32974: result: yes +configure:33002: checking for sys/signal.h +configure:33011: result: yes +configure:32896: checking sys/socket.h usability +configure:32913: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:32920: $? = 0 +configure:32934: result: yes +configure:32938: checking sys/socket.h presence +configure:32953: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +configure:32960: $? = 0 +configure:32974: result: yes +configure:33002: checking for sys/socket.h +configure:33011: result: yes +configure:32896: checking sys/sockio.h usability +configure:32913: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +conftest.c:159:24: fatal error: sys/sockio.h: No such file or directory + #include + ^ +compilation terminated. +configure:32920: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| #define HAVE_STRERROR_R 1 +| #define HAVE_CRYPT_R 1 +| #define CRYPT_R_STRUCT_CRYPT_DATA 1 +| #define HAVE_MMAP 1 +| #define HAVE_MEMMOVE 1 +| #define HAVE_GETPASS 1 +| #define HAVE_GMTIME_R 1 +| #define HAVE_LOCALTIME_R 1 +| #define HAVE_HSTRERROR 1 +| #define HAVE_MKSTEMP 1 +| #define DIRENT_INODE d_fileno +| #define DIRENT_TYPE d_type +| #define STDC_HEADERS 1 +| #define HAVE_ALLOCA_H 1 +| #define HAVE_CRYPT_H 1 +| #define HAVE_CTYPE_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_ERRNO_H 1 +| #define HAVE_FCNTL_H 1 +| #define HAVE_GRP_H 1 +| #define HAVE_LIMITS_H 1 +| #define HAVE_MALLOC_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_NETDB_H 1 +| #define HAVE_POLL_H 1 +| #define HAVE_PWD_H 1 +| #define HAVE_SEMAPHORE_H 1 +| #define HAVE_SIGNAL_H 1 +| #define HAVE_STDARG_H 1 +| #define HAVE_STDDEF_H 1 +| #define HAVE_STDIO_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_TERMIOS_H 1 +| #define HAVE_TIME_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_ARPA_INET_H 1 +| #define HAVE_NETINET_IN_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_SYS_IOCTL_H 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_POLL_H 1 +| #define HAVE_SYS_RESOURCE_H 1 +| #define HAVE_SYS_SELECT_H 1 +| #define HAVE_SYS_SEM_H 1 +| #define HAVE_SYS_SENDFILE_H 1 +| #define HAVE_SYS_SIGNAL_H 1 +| #define HAVE_SYS_SOCKET_H 1 +| /* end confdefs.h. */ +| #include +| #ifdef HAVE_SYS_TYPES_H +| # include +| #endif +| #ifdef HAVE_SYS_STAT_H +| # include +| #endif +| #ifdef STDC_HEADERS +| # include +| # include +| #else +| # ifdef HAVE_STDLIB_H +| # include +| # endif +| #endif +| #ifdef HAVE_STRING_H +| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H +| # include +| # endif +| # include +| #endif +| #ifdef HAVE_STRINGS_H +| # include +| #endif +| #ifdef HAVE_INTTYPES_H +| # include +| #endif +| #ifdef HAVE_STDINT_H +| # include +| #endif +| #ifdef HAVE_UNISTD_H +| # include +| #endif +| #include +configure:32934: result: no +configure:32938: checking sys/sockio.h presence +configure:32953: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +conftest.c:126:24: fatal error: sys/sockio.h: No such file or directory + #include + ^ +compilation terminated. +configure:32960: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| #define HAVE_STRERROR_R 1 +| #define HAVE_CRYPT_R 1 +| #define CRYPT_R_STRUCT_CRYPT_DATA 1 +| #define HAVE_MMAP 1 +| #define HAVE_MEMMOVE 1 +| #define HAVE_GETPASS 1 +| #define HAVE_GMTIME_R 1 +| #define HAVE_LOCALTIME_R 1 +| #define HAVE_HSTRERROR 1 +| #define HAVE_MKSTEMP 1 +| #define DIRENT_INODE d_fileno +| #define DIRENT_TYPE d_type +| #define STDC_HEADERS 1 +| #define HAVE_ALLOCA_H 1 +| #define HAVE_CRYPT_H 1 +| #define HAVE_CTYPE_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_ERRNO_H 1 +| #define HAVE_FCNTL_H 1 +| #define HAVE_GRP_H 1 +| #define HAVE_LIMITS_H 1 +| #define HAVE_MALLOC_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_NETDB_H 1 +| #define HAVE_POLL_H 1 +| #define HAVE_PWD_H 1 +| #define HAVE_SEMAPHORE_H 1 +| #define HAVE_SIGNAL_H 1 +| #define HAVE_STDARG_H 1 +| #define HAVE_STDDEF_H 1 +| #define HAVE_STDIO_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_TERMIOS_H 1 +| #define HAVE_TIME_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_ARPA_INET_H 1 +| #define HAVE_NETINET_IN_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_SYS_IOCTL_H 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_POLL_H 1 +| #define HAVE_SYS_RESOURCE_H 1 +| #define HAVE_SYS_SELECT_H 1 +| #define HAVE_SYS_SEM_H 1 +| #define HAVE_SYS_SENDFILE_H 1 +| #define HAVE_SYS_SIGNAL_H 1 +| #define HAVE_SYS_SOCKET_H 1 +| /* end confdefs.h. */ +| #include +configure:32974: result: no +configure:33002: checking for sys/sockio.h +configure:33011: result: no +configure:32885: checking for sys/stat.h +configure:32892: result: yes +configure:32896: checking sys/sysctl.h usability +configure:32913: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:32920: $? = 0 +configure:32934: result: yes +configure:32938: checking sys/sysctl.h presence +configure:32953: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +configure:32960: $? = 0 +configure:32974: result: yes +configure:33002: checking for sys/sysctl.h +configure:33011: result: yes +configure:32896: checking sys/syslimits.h usability +configure:32913: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +conftest.c:161:27: fatal error: sys/syslimits.h: No such file or directory + #include + ^ +compilation terminated. +configure:32920: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| #define HAVE_STRERROR_R 1 +| #define HAVE_CRYPT_R 1 +| #define CRYPT_R_STRUCT_CRYPT_DATA 1 +| #define HAVE_MMAP 1 +| #define HAVE_MEMMOVE 1 +| #define HAVE_GETPASS 1 +| #define HAVE_GMTIME_R 1 +| #define HAVE_LOCALTIME_R 1 +| #define HAVE_HSTRERROR 1 +| #define HAVE_MKSTEMP 1 +| #define DIRENT_INODE d_fileno +| #define DIRENT_TYPE d_type +| #define STDC_HEADERS 1 +| #define HAVE_ALLOCA_H 1 +| #define HAVE_CRYPT_H 1 +| #define HAVE_CTYPE_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_ERRNO_H 1 +| #define HAVE_FCNTL_H 1 +| #define HAVE_GRP_H 1 +| #define HAVE_LIMITS_H 1 +| #define HAVE_MALLOC_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_NETDB_H 1 +| #define HAVE_POLL_H 1 +| #define HAVE_PWD_H 1 +| #define HAVE_SEMAPHORE_H 1 +| #define HAVE_SIGNAL_H 1 +| #define HAVE_STDARG_H 1 +| #define HAVE_STDDEF_H 1 +| #define HAVE_STDIO_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_TERMIOS_H 1 +| #define HAVE_TIME_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_ARPA_INET_H 1 +| #define HAVE_NETINET_IN_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_SYS_IOCTL_H 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_POLL_H 1 +| #define HAVE_SYS_RESOURCE_H 1 +| #define HAVE_SYS_SELECT_H 1 +| #define HAVE_SYS_SEM_H 1 +| #define HAVE_SYS_SENDFILE_H 1 +| #define HAVE_SYS_SIGNAL_H 1 +| #define HAVE_SYS_SOCKET_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_SYS_SYSCTL_H 1 +| /* end confdefs.h. */ +| #include +| #ifdef HAVE_SYS_TYPES_H +| # include +| #endif +| #ifdef HAVE_SYS_STAT_H +| # include +| #endif +| #ifdef STDC_HEADERS +| # include +| # include +| #else +| # ifdef HAVE_STDLIB_H +| # include +| # endif +| #endif +| #ifdef HAVE_STRING_H +| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H +| # include +| # endif +| # include +| #endif +| #ifdef HAVE_STRINGS_H +| # include +| #endif +| #ifdef HAVE_INTTYPES_H +| # include +| #endif +| #ifdef HAVE_STDINT_H +| # include +| #endif +| #ifdef HAVE_UNISTD_H +| # include +| #endif +| #include +configure:32934: result: no +configure:32938: checking sys/syslimits.h presence +configure:32953: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +conftest.c:128:27: fatal error: sys/syslimits.h: No such file or directory + #include + ^ +compilation terminated. +configure:32960: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| #define HAVE_STRERROR_R 1 +| #define HAVE_CRYPT_R 1 +| #define CRYPT_R_STRUCT_CRYPT_DATA 1 +| #define HAVE_MMAP 1 +| #define HAVE_MEMMOVE 1 +| #define HAVE_GETPASS 1 +| #define HAVE_GMTIME_R 1 +| #define HAVE_LOCALTIME_R 1 +| #define HAVE_HSTRERROR 1 +| #define HAVE_MKSTEMP 1 +| #define DIRENT_INODE d_fileno +| #define DIRENT_TYPE d_type +| #define STDC_HEADERS 1 +| #define HAVE_ALLOCA_H 1 +| #define HAVE_CRYPT_H 1 +| #define HAVE_CTYPE_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_ERRNO_H 1 +| #define HAVE_FCNTL_H 1 +| #define HAVE_GRP_H 1 +| #define HAVE_LIMITS_H 1 +| #define HAVE_MALLOC_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_NETDB_H 1 +| #define HAVE_POLL_H 1 +| #define HAVE_PWD_H 1 +| #define HAVE_SEMAPHORE_H 1 +| #define HAVE_SIGNAL_H 1 +| #define HAVE_STDARG_H 1 +| #define HAVE_STDDEF_H 1 +| #define HAVE_STDIO_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_TERMIOS_H 1 +| #define HAVE_TIME_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_ARPA_INET_H 1 +| #define HAVE_NETINET_IN_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_SYS_IOCTL_H 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_POLL_H 1 +| #define HAVE_SYS_RESOURCE_H 1 +| #define HAVE_SYS_SELECT_H 1 +| #define HAVE_SYS_SEM_H 1 +| #define HAVE_SYS_SENDFILE_H 1 +| #define HAVE_SYS_SIGNAL_H 1 +| #define HAVE_SYS_SOCKET_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_SYS_SYSCTL_H 1 +| /* end confdefs.h. */ +| #include +configure:32974: result: no +configure:33002: checking for sys/syslimits.h +configure:33011: result: no +configure:32896: checking sys/time.h usability +configure:32913: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:32920: $? = 0 +configure:32934: result: yes +configure:32938: checking sys/time.h presence +configure:32953: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +configure:32960: $? = 0 +configure:32974: result: yes +configure:33002: checking for sys/time.h +configure:33011: result: yes +configure:32885: checking for sys/types.h +configure:32892: result: yes +configure:32896: checking sys/uio.h usability +configure:32913: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:32920: $? = 0 +configure:32934: result: yes +configure:32938: checking sys/uio.h presence +configure:32953: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +configure:32960: $? = 0 +configure:32974: result: yes +configure:33002: checking for sys/uio.h +configure:33011: result: yes +configure:32896: checking sys/un.h usability +configure:32913: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:32920: $? = 0 +configure:32934: result: yes +configure:32938: checking sys/un.h presence +configure:32953: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +configure:32960: $? = 0 +configure:32974: result: yes +configure:33002: checking for sys/un.h +configure:33011: result: yes +configure:32896: checking sys/wait.h usability +configure:32913: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:32920: $? = 0 +configure:32934: result: yes +configure:32938: checking sys/wait.h presence +configure:32953: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +configure:32960: $? = 0 +configure:32974: result: yes +configure:33002: checking for sys/wait.h +configure:33011: result: yes +configure:33103: checking for netinet/tcp.h +configure:33125: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +configure:33132: $? = 0 +configure:33147: result: yes +configure:33199: checking for h_errno in netdb.h +configure:33239: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:33246: $? = 0 +configure:33349: result: yes +configure:33364: checking for off_t +configure:33392: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:33399: $? = 0 +configure:33426: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +conftest.c: In function 'main': +conftest.c:170:20: error: expected expression before ')' token + if (sizeof ((off_t))) + ^ +configure:33433: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| #define HAVE_STRERROR_R 1 +| #define HAVE_CRYPT_R 1 +| #define CRYPT_R_STRUCT_CRYPT_DATA 1 +| #define HAVE_MMAP 1 +| #define HAVE_MEMMOVE 1 +| #define HAVE_GETPASS 1 +| #define HAVE_GMTIME_R 1 +| #define HAVE_LOCALTIME_R 1 +| #define HAVE_HSTRERROR 1 +| #define HAVE_MKSTEMP 1 +| #define DIRENT_INODE d_fileno +| #define DIRENT_TYPE d_type +| #define STDC_HEADERS 1 +| #define HAVE_ALLOCA_H 1 +| #define HAVE_CRYPT_H 1 +| #define HAVE_CTYPE_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_ERRNO_H 1 +| #define HAVE_FCNTL_H 1 +| #define HAVE_GRP_H 1 +| #define HAVE_LIMITS_H 1 +| #define HAVE_MALLOC_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_NETDB_H 1 +| #define HAVE_POLL_H 1 +| #define HAVE_PWD_H 1 +| #define HAVE_SEMAPHORE_H 1 +| #define HAVE_SIGNAL_H 1 +| #define HAVE_STDARG_H 1 +| #define HAVE_STDDEF_H 1 +| #define HAVE_STDIO_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_TERMIOS_H 1 +| #define HAVE_TIME_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_ARPA_INET_H 1 +| #define HAVE_NETINET_IN_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_SYS_IOCTL_H 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_POLL_H 1 +| #define HAVE_SYS_RESOURCE_H 1 +| #define HAVE_SYS_SELECT_H 1 +| #define HAVE_SYS_SEM_H 1 +| #define HAVE_SYS_SENDFILE_H 1 +| #define HAVE_SYS_SIGNAL_H 1 +| #define HAVE_SYS_SOCKET_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_SYS_SYSCTL_H 1 +| #define HAVE_SYS_TIME_H 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_UIO_H 1 +| #define HAVE_SYS_UN_H 1 +| #define HAVE_SYS_WAIT_H 1 +| #define HAVE_NETINET_TCP_H 1 +| /* end confdefs.h. */ +| #include +| #ifdef HAVE_SYS_TYPES_H +| # include +| #endif +| #ifdef HAVE_SYS_STAT_H +| # include +| #endif +| #ifdef STDC_HEADERS +| # include +| # include +| #else +| # ifdef HAVE_STDLIB_H +| # include +| # endif +| #endif +| #ifdef HAVE_STRING_H +| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H +| # include +| # endif +| # include +| #endif +| #ifdef HAVE_STRINGS_H +| # include +| #endif +| #ifdef HAVE_INTTYPES_H +| # include +| #endif +| #ifdef HAVE_STDINT_H +| # include +| #endif +| #ifdef HAVE_UNISTD_H +| # include +| #endif +| int +| main () +| { +| if (sizeof ((off_t))) +| return 0; +| ; +| return 0; +| } +configure:33456: result: yes +configure:33468: checking for pid_t +configure:33496: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:33503: $? = 0 +configure:33530: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +conftest.c: In function 'main': +conftest.c:170:20: error: expected expression before ')' token + if (sizeof ((pid_t))) + ^ +configure:33537: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| #define HAVE_STRERROR_R 1 +| #define HAVE_CRYPT_R 1 +| #define CRYPT_R_STRUCT_CRYPT_DATA 1 +| #define HAVE_MMAP 1 +| #define HAVE_MEMMOVE 1 +| #define HAVE_GETPASS 1 +| #define HAVE_GMTIME_R 1 +| #define HAVE_LOCALTIME_R 1 +| #define HAVE_HSTRERROR 1 +| #define HAVE_MKSTEMP 1 +| #define DIRENT_INODE d_fileno +| #define DIRENT_TYPE d_type +| #define STDC_HEADERS 1 +| #define HAVE_ALLOCA_H 1 +| #define HAVE_CRYPT_H 1 +| #define HAVE_CTYPE_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_ERRNO_H 1 +| #define HAVE_FCNTL_H 1 +| #define HAVE_GRP_H 1 +| #define HAVE_LIMITS_H 1 +| #define HAVE_MALLOC_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_NETDB_H 1 +| #define HAVE_POLL_H 1 +| #define HAVE_PWD_H 1 +| #define HAVE_SEMAPHORE_H 1 +| #define HAVE_SIGNAL_H 1 +| #define HAVE_STDARG_H 1 +| #define HAVE_STDDEF_H 1 +| #define HAVE_STDIO_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_TERMIOS_H 1 +| #define HAVE_TIME_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_ARPA_INET_H 1 +| #define HAVE_NETINET_IN_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_SYS_IOCTL_H 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_POLL_H 1 +| #define HAVE_SYS_RESOURCE_H 1 +| #define HAVE_SYS_SELECT_H 1 +| #define HAVE_SYS_SEM_H 1 +| #define HAVE_SYS_SENDFILE_H 1 +| #define HAVE_SYS_SIGNAL_H 1 +| #define HAVE_SYS_SOCKET_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_SYS_SYSCTL_H 1 +| #define HAVE_SYS_TIME_H 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_UIO_H 1 +| #define HAVE_SYS_UN_H 1 +| #define HAVE_SYS_WAIT_H 1 +| #define HAVE_NETINET_TCP_H 1 +| /* end confdefs.h. */ +| #include +| #ifdef HAVE_SYS_TYPES_H +| # include +| #endif +| #ifdef HAVE_SYS_STAT_H +| # include +| #endif +| #ifdef STDC_HEADERS +| # include +| # include +| #else +| # ifdef HAVE_STDLIB_H +| # include +| # endif +| #endif +| #ifdef HAVE_STRING_H +| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H +| # include +| # endif +| # include +| #endif +| #ifdef HAVE_STRINGS_H +| # include +| #endif +| #ifdef HAVE_INTTYPES_H +| # include +| #endif +| #ifdef HAVE_STDINT_H +| # include +| #endif +| #ifdef HAVE_UNISTD_H +| # include +| #endif +| int +| main () +| { +| if (sizeof ((pid_t))) +| return 0; +| ; +| return 0; +| } +configure:33560: result: yes +configure:33572: checking for size_t +configure:33600: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:33607: $? = 0 +configure:33634: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +conftest.c: In function 'main': +conftest.c:170:21: error: expected expression before ')' token + if (sizeof ((size_t))) + ^ +configure:33641: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| #define HAVE_STRERROR_R 1 +| #define HAVE_CRYPT_R 1 +| #define CRYPT_R_STRUCT_CRYPT_DATA 1 +| #define HAVE_MMAP 1 +| #define HAVE_MEMMOVE 1 +| #define HAVE_GETPASS 1 +| #define HAVE_GMTIME_R 1 +| #define HAVE_LOCALTIME_R 1 +| #define HAVE_HSTRERROR 1 +| #define HAVE_MKSTEMP 1 +| #define DIRENT_INODE d_fileno +| #define DIRENT_TYPE d_type +| #define STDC_HEADERS 1 +| #define HAVE_ALLOCA_H 1 +| #define HAVE_CRYPT_H 1 +| #define HAVE_CTYPE_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_ERRNO_H 1 +| #define HAVE_FCNTL_H 1 +| #define HAVE_GRP_H 1 +| #define HAVE_LIMITS_H 1 +| #define HAVE_MALLOC_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_NETDB_H 1 +| #define HAVE_POLL_H 1 +| #define HAVE_PWD_H 1 +| #define HAVE_SEMAPHORE_H 1 +| #define HAVE_SIGNAL_H 1 +| #define HAVE_STDARG_H 1 +| #define HAVE_STDDEF_H 1 +| #define HAVE_STDIO_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_TERMIOS_H 1 +| #define HAVE_TIME_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_ARPA_INET_H 1 +| #define HAVE_NETINET_IN_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_SYS_IOCTL_H 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_POLL_H 1 +| #define HAVE_SYS_RESOURCE_H 1 +| #define HAVE_SYS_SELECT_H 1 +| #define HAVE_SYS_SEM_H 1 +| #define HAVE_SYS_SENDFILE_H 1 +| #define HAVE_SYS_SIGNAL_H 1 +| #define HAVE_SYS_SOCKET_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_SYS_SYSCTL_H 1 +| #define HAVE_SYS_TIME_H 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_UIO_H 1 +| #define HAVE_SYS_UN_H 1 +| #define HAVE_SYS_WAIT_H 1 +| #define HAVE_NETINET_TCP_H 1 +| /* end confdefs.h. */ +| #include +| #ifdef HAVE_SYS_TYPES_H +| # include +| #endif +| #ifdef HAVE_SYS_STAT_H +| # include +| #endif +| #ifdef STDC_HEADERS +| # include +| # include +| #else +| # ifdef HAVE_STDLIB_H +| # include +| # endif +| #endif +| #ifdef HAVE_STRING_H +| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H +| # include +| # endif +| # include +| #endif +| #ifdef HAVE_STRINGS_H +| # include +| #endif +| #ifdef HAVE_INTTYPES_H +| # include +| #endif +| #ifdef HAVE_STDINT_H +| # include +| #endif +| #ifdef HAVE_UNISTD_H +| # include +| #endif +| int +| main () +| { +| if (sizeof ((size_t))) +| return 0; +| ; +| return 0; +| } +configure:33664: result: yes +configure:33676: checking for uid_t in sys/types.h +configure:33699: result: yes +configure:33714: checking for ssize_t +configure:33742: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:33749: $? = 0 +configure:33776: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +conftest.c: In function 'main': +conftest.c:170:22: error: expected expression before ')' token + if (sizeof ((ssize_t))) + ^ +configure:33783: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| #define HAVE_STRERROR_R 1 +| #define HAVE_CRYPT_R 1 +| #define CRYPT_R_STRUCT_CRYPT_DATA 1 +| #define HAVE_MMAP 1 +| #define HAVE_MEMMOVE 1 +| #define HAVE_GETPASS 1 +| #define HAVE_GMTIME_R 1 +| #define HAVE_LOCALTIME_R 1 +| #define HAVE_HSTRERROR 1 +| #define HAVE_MKSTEMP 1 +| #define DIRENT_INODE d_fileno +| #define DIRENT_TYPE d_type +| #define STDC_HEADERS 1 +| #define HAVE_ALLOCA_H 1 +| #define HAVE_CRYPT_H 1 +| #define HAVE_CTYPE_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_ERRNO_H 1 +| #define HAVE_FCNTL_H 1 +| #define HAVE_GRP_H 1 +| #define HAVE_LIMITS_H 1 +| #define HAVE_MALLOC_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_NETDB_H 1 +| #define HAVE_POLL_H 1 +| #define HAVE_PWD_H 1 +| #define HAVE_SEMAPHORE_H 1 +| #define HAVE_SIGNAL_H 1 +| #define HAVE_STDARG_H 1 +| #define HAVE_STDDEF_H 1 +| #define HAVE_STDIO_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_TERMIOS_H 1 +| #define HAVE_TIME_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_ARPA_INET_H 1 +| #define HAVE_NETINET_IN_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_SYS_IOCTL_H 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_POLL_H 1 +| #define HAVE_SYS_RESOURCE_H 1 +| #define HAVE_SYS_SELECT_H 1 +| #define HAVE_SYS_SEM_H 1 +| #define HAVE_SYS_SENDFILE_H 1 +| #define HAVE_SYS_SIGNAL_H 1 +| #define HAVE_SYS_SOCKET_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_SYS_SYSCTL_H 1 +| #define HAVE_SYS_TIME_H 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_UIO_H 1 +| #define HAVE_SYS_UN_H 1 +| #define HAVE_SYS_WAIT_H 1 +| #define HAVE_NETINET_TCP_H 1 +| /* end confdefs.h. */ +| #include +| #ifdef HAVE_SYS_TYPES_H +| # include +| #endif +| #ifdef HAVE_SYS_STAT_H +| # include +| #endif +| #ifdef STDC_HEADERS +| # include +| # include +| #else +| # ifdef HAVE_STDLIB_H +| # include +| # endif +| #endif +| #ifdef HAVE_STRING_H +| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H +| # include +| # endif +| # include +| #endif +| #ifdef HAVE_STRINGS_H +| # include +| #endif +| #ifdef HAVE_INTTYPES_H +| # include +| #endif +| #ifdef HAVE_STDINT_H +| # include +| #endif +| #ifdef HAVE_UNISTD_H +| # include +| #endif +| int +| main () +| { +| if (sizeof ((ssize_t))) +| return 0; +| ; +| return 0; +| } +configure:33806: result: yes +configure:33818: checking for inline +configure:33844: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:33851: $? = 0 +configure:33869: result: inline +configure:33888: checking for an ANSI C-conforming const +configure:33963: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:33970: $? = 0 +configure:33985: result: yes +configure:33995: checking for size_t +configure:34087: result: yes +configure:34099: checking whether setpgrp takes no argument +configure:34133: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +conftest.c: In function 'main': +conftest.c:173:3: error: too many arguments to function 'setpgrp' + return setpgrp (1,1) != -1; + ^ +In file included from conftest.c:165:0: +/usr/include/unistd.h:660:12: note: declared here + extern int setpgrp (void) __THROW; + ^ +configure:34137: $? = 1 +configure: program exited with status 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| #define HAVE_STRERROR_R 1 +| #define HAVE_CRYPT_R 1 +| #define CRYPT_R_STRUCT_CRYPT_DATA 1 +| #define HAVE_MMAP 1 +| #define HAVE_MEMMOVE 1 +| #define HAVE_GETPASS 1 +| #define HAVE_GMTIME_R 1 +| #define HAVE_LOCALTIME_R 1 +| #define HAVE_HSTRERROR 1 +| #define HAVE_MKSTEMP 1 +| #define DIRENT_INODE d_fileno +| #define DIRENT_TYPE d_type +| #define STDC_HEADERS 1 +| #define HAVE_ALLOCA_H 1 +| #define HAVE_CRYPT_H 1 +| #define HAVE_CTYPE_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_ERRNO_H 1 +| #define HAVE_FCNTL_H 1 +| #define HAVE_GRP_H 1 +| #define HAVE_LIMITS_H 1 +| #define HAVE_MALLOC_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_NETDB_H 1 +| #define HAVE_POLL_H 1 +| #define HAVE_PWD_H 1 +| #define HAVE_SEMAPHORE_H 1 +| #define HAVE_SIGNAL_H 1 +| #define HAVE_STDARG_H 1 +| #define HAVE_STDDEF_H 1 +| #define HAVE_STDIO_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_TERMIOS_H 1 +| #define HAVE_TIME_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_ARPA_INET_H 1 +| #define HAVE_NETINET_IN_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_SYS_IOCTL_H 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_POLL_H 1 +| #define HAVE_SYS_RESOURCE_H 1 +| #define HAVE_SYS_SELECT_H 1 +| #define HAVE_SYS_SEM_H 1 +| #define HAVE_SYS_SENDFILE_H 1 +| #define HAVE_SYS_SIGNAL_H 1 +| #define HAVE_SYS_SOCKET_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_SYS_SYSCTL_H 1 +| #define HAVE_SYS_TIME_H 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_UIO_H 1 +| #define HAVE_SYS_UN_H 1 +| #define HAVE_SYS_WAIT_H 1 +| #define HAVE_NETINET_TCP_H 1 +| /* end confdefs.h. */ +| #include +| #ifdef HAVE_SYS_TYPES_H +| # include +| #endif +| #ifdef HAVE_SYS_STAT_H +| # include +| #endif +| #ifdef STDC_HEADERS +| # include +| # include +| #else +| # ifdef HAVE_STDLIB_H +| # include +| # endif +| #endif +| #ifdef HAVE_STRING_H +| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H +| # include +| # endif +| # include +| #endif +| #ifdef HAVE_STRINGS_H +| # include +| #endif +| #ifdef HAVE_INTTYPES_H +| # include +| #endif +| #ifdef HAVE_STDINT_H +| # include +| #endif +| #ifdef HAVE_UNISTD_H +| # include +| #endif +| int +| main () +| { +| /* If this system has a BSD-style setpgrp which takes arguments, +| setpgrp(1, 1) will fail with ESRCH and return -1, in that case +| exit successfully. */ +| return setpgrp (1,1) != -1; +| ; +| return 0; +| } +configure:34164: result: yes +configure:34176: checking for socklen_t +configure:34212: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:34219: $? = 0 +configure:34239: result: yes +configure:34252: checking whether system defines INADDR_NONE +configure:34294: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:34301: $? = 0 +configure:34320: result: yes +configure:34333: checking size of void* +configure:34638: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +configure:34642: $? = 0 +configure:34648: ./conftest +configure:34652: $? = 0 +configure:34678: result: 8 +configure:34701: checking size of char +configure:35006: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +configure:35010: $? = 0 +configure:35016: ./conftest +configure:35020: $? = 0 +configure:35046: result: 1 +configure:35060: checking size of int +configure:35365: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +configure:35369: $? = 0 +configure:35375: ./conftest +configure:35379: $? = 0 +configure:35405: result: 4 +configure:35419: checking size of long +configure:35724: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +configure:35728: $? = 0 +configure:35734: ./conftest +configure:35738: $? = 0 +configure:35764: result: 8 +configure:35778: checking size of short +configure:36083: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +configure:36087: $? = 0 +configure:36093: ./conftest +configure:36097: $? = 0 +configure:36123: result: 2 +configure:36137: checking size of long double +configure:36442: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +configure:36446: $? = 0 +configure:36452: ./conftest +configure:36456: $? = 0 +configure:36482: result: 16 +configure:36496: checking size of long long +configure:36801: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +configure:36805: $? = 0 +configure:36811: ./conftest +configure:36815: $? = 0 +configure:36841: result: 8 +configure:36929: checking for INT64_C +configure:36974: result: yes +configure:37012: checking size of ssize_t +configure:37042: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +conftest.c: In function 'main': +conftest.c:148:11: warning: incompatible implicit declaration of built-in function 'exit' [enabled by default] + if (!f) exit(1); + ^ +conftest.c:149:3: warning: format '%d' expects argument of type 'int', but argument 3 has type 'long unsigned int' [-Wformat=] + fprintf(f, "%d\n", sizeof(ssize_t)); + ^ +configure:37046: $? = 0 +configure:37052: ./conftest +configure:37056: $? = 0 +configure:37073: result: 8 +configure:37090: checking size of size_t +configure:37120: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +conftest.c: In function 'main': +conftest.c:149:11: warning: incompatible implicit declaration of built-in function 'exit' [enabled by default] + if (!f) exit(1); + ^ +conftest.c:150:3: warning: format '%d' expects argument of type 'int', but argument 3 has type 'long unsigned int' [-Wformat=] + fprintf(f, "%d\n", sizeof(size_t)); + ^ +configure:37124: $? = 0 +configure:37130: ./conftest +configure:37134: $? = 0 +configure:37151: result: 8 +configure:37169: checking size of off_t +configure:37199: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +conftest.c: In function 'main': +conftest.c:150:11: warning: incompatible implicit declaration of built-in function 'exit' [enabled by default] + if (!f) exit(1); + ^ +conftest.c:151:3: warning: format '%d' expects argument of type 'int', but argument 3 has type 'long unsigned int' [-Wformat=] + fprintf(f, "%d\n", sizeof(off_t)); + ^ +configure:37203: $? = 0 +configure:37209: ./conftest +configure:37213: $? = 0 +configure:37230: result: 8 +configure:37238: checking which type to use for apr_off_t +configure:37263: result: off_t +configure:37269: checking whether ino_t and unsigned long long are the same +configure:37298: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +conftest.c: In function 'main': +conftest.c:183:9: error: size of array 'foo' is negative + int foo[0 - !__builtin_types_compatible_p(ino_t, unsigned long long)]; + ^ +configure:37305: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| #define HAVE_STRERROR_R 1 +| #define HAVE_CRYPT_R 1 +| #define CRYPT_R_STRUCT_CRYPT_DATA 1 +| #define HAVE_MMAP 1 +| #define HAVE_MEMMOVE 1 +| #define HAVE_GETPASS 1 +| #define HAVE_GMTIME_R 1 +| #define HAVE_LOCALTIME_R 1 +| #define HAVE_HSTRERROR 1 +| #define HAVE_MKSTEMP 1 +| #define DIRENT_INODE d_fileno +| #define DIRENT_TYPE d_type +| #define STDC_HEADERS 1 +| #define HAVE_ALLOCA_H 1 +| #define HAVE_CRYPT_H 1 +| #define HAVE_CTYPE_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_ERRNO_H 1 +| #define HAVE_FCNTL_H 1 +| #define HAVE_GRP_H 1 +| #define HAVE_LIMITS_H 1 +| #define HAVE_MALLOC_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_NETDB_H 1 +| #define HAVE_POLL_H 1 +| #define HAVE_PWD_H 1 +| #define HAVE_SEMAPHORE_H 1 +| #define HAVE_SIGNAL_H 1 +| #define HAVE_STDARG_H 1 +| #define HAVE_STDDEF_H 1 +| #define HAVE_STDIO_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_TERMIOS_H 1 +| #define HAVE_TIME_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_ARPA_INET_H 1 +| #define HAVE_NETINET_IN_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_SYS_IOCTL_H 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_POLL_H 1 +| #define HAVE_SYS_RESOURCE_H 1 +| #define HAVE_SYS_SELECT_H 1 +| #define HAVE_SYS_SEM_H 1 +| #define HAVE_SYS_SENDFILE_H 1 +| #define HAVE_SYS_SIGNAL_H 1 +| #define HAVE_SYS_SOCKET_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_SYS_SYSCTL_H 1 +| #define HAVE_SYS_TIME_H 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_UIO_H 1 +| #define HAVE_SYS_UN_H 1 +| #define HAVE_SYS_WAIT_H 1 +| #define HAVE_NETINET_TCP_H 1 +| #define SETPGRP_VOID 1 +| #define HAVE_SOCKLEN_T 1 +| #define SIZEOF_VOIDP 8 +| #define SIZEOF_CHAR 1 +| #define SIZEOF_INT 4 +| #define SIZEOF_LONG 8 +| #define SIZEOF_SHORT 2 +| #define SIZEOF_LONG_DOUBLE 16 +| #define SIZEOF_LONG_LONG 8 +| #define SIZEOF_SSIZE_T 8 +| #define SIZEOF_SIZE_T 8 +| #define SIZEOF_OFF_T 8 +| /* end confdefs.h. */ +| #include +| #ifdef HAVE_SYS_TYPES_H +| # include +| #endif +| #ifdef HAVE_SYS_STAT_H +| # include +| #endif +| #ifdef STDC_HEADERS +| # include +| # include +| #else +| # ifdef HAVE_STDLIB_H +| # include +| # endif +| #endif +| #ifdef HAVE_STRING_H +| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H +| # include +| # endif +| # include +| #endif +| #ifdef HAVE_STRINGS_H +| # include +| #endif +| #ifdef HAVE_INTTYPES_H +| # include +| #endif +| #ifdef HAVE_STDINT_H +| # include +| #endif +| #ifdef HAVE_UNISTD_H +| # include +| #endif +| int +| main () +| { +| +| int foo[0 - !__builtin_types_compatible_p(ino_t, unsigned long long)]; +| +| ; +| return 0; +| } +configure:37320: result: no +configure:37325: checking whether ino_t and unsigned long are the same +configure:37354: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:37361: $? = 0 +configure:37376: result: yes +configure:37381: checking whether ino_t and unsigned int are the same +configure:37410: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +conftest.c: In function 'main': +conftest.c:183:9: error: size of array 'foo' is negative + int foo[0 - !__builtin_types_compatible_p(ino_t, unsigned int)]; + ^ +configure:37417: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| #define HAVE_STRERROR_R 1 +| #define HAVE_CRYPT_R 1 +| #define CRYPT_R_STRUCT_CRYPT_DATA 1 +| #define HAVE_MMAP 1 +| #define HAVE_MEMMOVE 1 +| #define HAVE_GETPASS 1 +| #define HAVE_GMTIME_R 1 +| #define HAVE_LOCALTIME_R 1 +| #define HAVE_HSTRERROR 1 +| #define HAVE_MKSTEMP 1 +| #define DIRENT_INODE d_fileno +| #define DIRENT_TYPE d_type +| #define STDC_HEADERS 1 +| #define HAVE_ALLOCA_H 1 +| #define HAVE_CRYPT_H 1 +| #define HAVE_CTYPE_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_ERRNO_H 1 +| #define HAVE_FCNTL_H 1 +| #define HAVE_GRP_H 1 +| #define HAVE_LIMITS_H 1 +| #define HAVE_MALLOC_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_NETDB_H 1 +| #define HAVE_POLL_H 1 +| #define HAVE_PWD_H 1 +| #define HAVE_SEMAPHORE_H 1 +| #define HAVE_SIGNAL_H 1 +| #define HAVE_STDARG_H 1 +| #define HAVE_STDDEF_H 1 +| #define HAVE_STDIO_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_TERMIOS_H 1 +| #define HAVE_TIME_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_ARPA_INET_H 1 +| #define HAVE_NETINET_IN_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_SYS_IOCTL_H 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_POLL_H 1 +| #define HAVE_SYS_RESOURCE_H 1 +| #define HAVE_SYS_SELECT_H 1 +| #define HAVE_SYS_SEM_H 1 +| #define HAVE_SYS_SENDFILE_H 1 +| #define HAVE_SYS_SIGNAL_H 1 +| #define HAVE_SYS_SOCKET_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_SYS_SYSCTL_H 1 +| #define HAVE_SYS_TIME_H 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_UIO_H 1 +| #define HAVE_SYS_UN_H 1 +| #define HAVE_SYS_WAIT_H 1 +| #define HAVE_NETINET_TCP_H 1 +| #define SETPGRP_VOID 1 +| #define HAVE_SOCKLEN_T 1 +| #define SIZEOF_VOIDP 8 +| #define SIZEOF_CHAR 1 +| #define SIZEOF_INT 4 +| #define SIZEOF_LONG 8 +| #define SIZEOF_SHORT 2 +| #define SIZEOF_LONG_DOUBLE 16 +| #define SIZEOF_LONG_LONG 8 +| #define SIZEOF_SSIZE_T 8 +| #define SIZEOF_SIZE_T 8 +| #define SIZEOF_OFF_T 8 +| /* end confdefs.h. */ +| #include +| #ifdef HAVE_SYS_TYPES_H +| # include +| #endif +| #ifdef HAVE_SYS_STAT_H +| # include +| #endif +| #ifdef STDC_HEADERS +| # include +| # include +| #else +| # ifdef HAVE_STDLIB_H +| # include +| # endif +| #endif +| #ifdef HAVE_STRING_H +| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H +| # include +| # endif +| # include +| #endif +| #ifdef HAVE_STRINGS_H +| # include +| #endif +| #ifdef HAVE_INTTYPES_H +| # include +| #endif +| #ifdef HAVE_STDINT_H +| # include +| #endif +| #ifdef HAVE_UNISTD_H +| # include +| #endif +| int +| main () +| { +| +| int foo[0 - !__builtin_types_compatible_p(ino_t, unsigned int)]; +| +| ; +| return 0; +| } +configure:37432: result: no +configure:37441: checking size of pid_t +configure:37471: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +conftest.c: In function 'main': +conftest.c:151:11: warning: incompatible implicit declaration of built-in function 'exit' [enabled by default] + if (!f) exit(1); + ^ +conftest.c:152:3: warning: format '%d' expects argument of type 'int', but argument 3 has type 'long unsigned int' [-Wformat=] + fprintf(f, "%d\n", sizeof(pid_t)); + ^ +configure:37475: $? = 0 +configure:37481: ./conftest +configure:37485: $? = 0 +configure:37502: result: 4 +configure:37589: checking for strnicmp +configure:37645: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +/tmp/ccjxStEC.o: In function `main': +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/conftest.c:181: undefined reference to `strnicmp' +collect2: error: ld returned 1 exit status +configure:37652: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| #define HAVE_STRERROR_R 1 +| #define HAVE_CRYPT_R 1 +| #define CRYPT_R_STRUCT_CRYPT_DATA 1 +| #define HAVE_MMAP 1 +| #define HAVE_MEMMOVE 1 +| #define HAVE_GETPASS 1 +| #define HAVE_GMTIME_R 1 +| #define HAVE_LOCALTIME_R 1 +| #define HAVE_HSTRERROR 1 +| #define HAVE_MKSTEMP 1 +| #define DIRENT_INODE d_fileno +| #define DIRENT_TYPE d_type +| #define STDC_HEADERS 1 +| #define HAVE_ALLOCA_H 1 +| #define HAVE_CRYPT_H 1 +| #define HAVE_CTYPE_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_ERRNO_H 1 +| #define HAVE_FCNTL_H 1 +| #define HAVE_GRP_H 1 +| #define HAVE_LIMITS_H 1 +| #define HAVE_MALLOC_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_NETDB_H 1 +| #define HAVE_POLL_H 1 +| #define HAVE_PWD_H 1 +| #define HAVE_SEMAPHORE_H 1 +| #define HAVE_SIGNAL_H 1 +| #define HAVE_STDARG_H 1 +| #define HAVE_STDDEF_H 1 +| #define HAVE_STDIO_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_TERMIOS_H 1 +| #define HAVE_TIME_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_ARPA_INET_H 1 +| #define HAVE_NETINET_IN_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_SYS_IOCTL_H 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_POLL_H 1 +| #define HAVE_SYS_RESOURCE_H 1 +| #define HAVE_SYS_SELECT_H 1 +| #define HAVE_SYS_SEM_H 1 +| #define HAVE_SYS_SENDFILE_H 1 +| #define HAVE_SYS_SIGNAL_H 1 +| #define HAVE_SYS_SOCKET_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_SYS_SYSCTL_H 1 +| #define HAVE_SYS_TIME_H 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_UIO_H 1 +| #define HAVE_SYS_UN_H 1 +| #define HAVE_SYS_WAIT_H 1 +| #define HAVE_NETINET_TCP_H 1 +| #define SETPGRP_VOID 1 +| #define HAVE_SOCKLEN_T 1 +| #define SIZEOF_VOIDP 8 +| #define SIZEOF_CHAR 1 +| #define SIZEOF_INT 4 +| #define SIZEOF_LONG 8 +| #define SIZEOF_SHORT 2 +| #define SIZEOF_LONG_DOUBLE 16 +| #define SIZEOF_LONG_LONG 8 +| #define SIZEOF_SSIZE_T 8 +| #define SIZEOF_SIZE_T 8 +| #define SIZEOF_OFF_T 8 +| #define SIZEOF_PID_T 4 +| /* end confdefs.h. */ +| /* Define strnicmp to an innocuous variant, in case declares strnicmp. +| For example, HP-UX 11i declares gettimeofday. */ +| #define strnicmp innocuous_strnicmp +| +| /* System header to define __stub macros and hopefully few prototypes, +| which can conflict with char strnicmp (); below. +| Prefer to if __STDC__ is defined, since +| exists even on freestanding compilers. */ +| +| #ifdef __STDC__ +| # include +| #else +| # include +| #endif +| +| #undef strnicmp +| +| /* 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 strnicmp (); +| /* 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_strnicmp || defined __stub___strnicmp +| choke me +| #endif +| +| int +| main () +| { +| return strnicmp (); +| ; +| return 0; +| } +configure:37674: result: no +configure:37692: checking for strncasecmp +configure:37748: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +conftest.c:170:6: warning: conflicting types for built-in function 'strncasecmp' [enabled by default] + char strncasecmp (); + ^ +configure:37755: $? = 0 +configure:37777: result: yes +configure:37795: checking for stricmp +configure:37880: result: no +configure:37898: checking for strcasecmp +configure:37983: result: yes +configure:38001: checking for strdup +configure:38057: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +conftest.c:172:6: warning: conflicting types for built-in function 'strdup' [enabled by default] + char strdup (); + ^ +configure:38064: $? = 0 +configure:38086: result: yes +configure:38104: checking for strstr +configure:38160: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +conftest.c:173:6: warning: conflicting types for built-in function 'strstr' [enabled by default] + char strstr (); + ^ +configure:38167: $? = 0 +configure:38189: result: yes +configure:38207: checking for memchr +configure:38263: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +conftest.c:174:6: warning: conflicting types for built-in function 'memchr' [enabled by default] + char memchr (); + ^ +configure:38270: $? = 0 +configure:38292: result: yes +configure:38310: checking for strtol +configure:38366: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +configure:38373: $? = 0 +configure:38395: result: yes +configure:38537: checking for NSLinkModule +configure:38593: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +/tmp/ccKVb5F5.o: In function `main': +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/conftest.c:187: undefined reference to `NSLinkModule' +collect2: error: ld returned 1 exit status +configure:38600: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| #define HAVE_STRERROR_R 1 +| #define HAVE_CRYPT_R 1 +| #define CRYPT_R_STRUCT_CRYPT_DATA 1 +| #define HAVE_MMAP 1 +| #define HAVE_MEMMOVE 1 +| #define HAVE_GETPASS 1 +| #define HAVE_GMTIME_R 1 +| #define HAVE_LOCALTIME_R 1 +| #define HAVE_HSTRERROR 1 +| #define HAVE_MKSTEMP 1 +| #define DIRENT_INODE d_fileno +| #define DIRENT_TYPE d_type +| #define STDC_HEADERS 1 +| #define HAVE_ALLOCA_H 1 +| #define HAVE_CRYPT_H 1 +| #define HAVE_CTYPE_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_ERRNO_H 1 +| #define HAVE_FCNTL_H 1 +| #define HAVE_GRP_H 1 +| #define HAVE_LIMITS_H 1 +| #define HAVE_MALLOC_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_NETDB_H 1 +| #define HAVE_POLL_H 1 +| #define HAVE_PWD_H 1 +| #define HAVE_SEMAPHORE_H 1 +| #define HAVE_SIGNAL_H 1 +| #define HAVE_STDARG_H 1 +| #define HAVE_STDDEF_H 1 +| #define HAVE_STDIO_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_TERMIOS_H 1 +| #define HAVE_TIME_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_ARPA_INET_H 1 +| #define HAVE_NETINET_IN_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_SYS_IOCTL_H 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_POLL_H 1 +| #define HAVE_SYS_RESOURCE_H 1 +| #define HAVE_SYS_SELECT_H 1 +| #define HAVE_SYS_SEM_H 1 +| #define HAVE_SYS_SENDFILE_H 1 +| #define HAVE_SYS_SIGNAL_H 1 +| #define HAVE_SYS_SOCKET_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_SYS_SYSCTL_H 1 +| #define HAVE_SYS_TIME_H 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_UIO_H 1 +| #define HAVE_SYS_UN_H 1 +| #define HAVE_SYS_WAIT_H 1 +| #define HAVE_NETINET_TCP_H 1 +| #define SETPGRP_VOID 1 +| #define HAVE_SOCKLEN_T 1 +| #define SIZEOF_VOIDP 8 +| #define SIZEOF_CHAR 1 +| #define SIZEOF_INT 4 +| #define SIZEOF_LONG 8 +| #define SIZEOF_SHORT 2 +| #define SIZEOF_LONG_DOUBLE 16 +| #define SIZEOF_LONG_LONG 8 +| #define SIZEOF_SSIZE_T 8 +| #define SIZEOF_SIZE_T 8 +| #define SIZEOF_OFF_T 8 +| #define SIZEOF_PID_T 4 +| #define HAVE_STRNCASECMP 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_STRDUP 1 +| #define HAVE_STRSTR 1 +| #define HAVE_MEMCHR 1 +| #define HAVE_STRTOL 1 +| /* end confdefs.h. */ +| /* Define NSLinkModule to an innocuous variant, in case declares NSLinkModule. +| For example, HP-UX 11i declares gettimeofday. */ +| #define NSLinkModule innocuous_NSLinkModule +| +| /* System header to define __stub macros and hopefully few prototypes, +| which can conflict with char NSLinkModule (); below. +| Prefer to if __STDC__ is defined, since +| exists even on freestanding compilers. */ +| +| #ifdef __STDC__ +| # include +| #else +| # include +| #endif +| +| #undef NSLinkModule +| +| /* 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 NSLinkModule (); +| /* 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_NSLinkModule || defined __stub___NSLinkModule +| choke me +| #endif +| +| int +| main () +| { +| return NSLinkModule (); +| ; +| return 0; +| } +configure:38622: result: no +configure:38637: checking for shl_load in -ldld +configure:38672: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -ldld -lrt -lm -lcrypt -lnsl -lpthread >&5 +/usr/bin/ld: cannot find -ldld +collect2: error: ld returned 1 exit status +configure:38679: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| #define HAVE_STRERROR_R 1 +| #define HAVE_CRYPT_R 1 +| #define CRYPT_R_STRUCT_CRYPT_DATA 1 +| #define HAVE_MMAP 1 +| #define HAVE_MEMMOVE 1 +| #define HAVE_GETPASS 1 +| #define HAVE_GMTIME_R 1 +| #define HAVE_LOCALTIME_R 1 +| #define HAVE_HSTRERROR 1 +| #define HAVE_MKSTEMP 1 +| #define DIRENT_INODE d_fileno +| #define DIRENT_TYPE d_type +| #define STDC_HEADERS 1 +| #define HAVE_ALLOCA_H 1 +| #define HAVE_CRYPT_H 1 +| #define HAVE_CTYPE_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_ERRNO_H 1 +| #define HAVE_FCNTL_H 1 +| #define HAVE_GRP_H 1 +| #define HAVE_LIMITS_H 1 +| #define HAVE_MALLOC_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_NETDB_H 1 +| #define HAVE_POLL_H 1 +| #define HAVE_PWD_H 1 +| #define HAVE_SEMAPHORE_H 1 +| #define HAVE_SIGNAL_H 1 +| #define HAVE_STDARG_H 1 +| #define HAVE_STDDEF_H 1 +| #define HAVE_STDIO_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_TERMIOS_H 1 +| #define HAVE_TIME_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_ARPA_INET_H 1 +| #define HAVE_NETINET_IN_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_SYS_IOCTL_H 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_POLL_H 1 +| #define HAVE_SYS_RESOURCE_H 1 +| #define HAVE_SYS_SELECT_H 1 +| #define HAVE_SYS_SEM_H 1 +| #define HAVE_SYS_SENDFILE_H 1 +| #define HAVE_SYS_SIGNAL_H 1 +| #define HAVE_SYS_SOCKET_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_SYS_SYSCTL_H 1 +| #define HAVE_SYS_TIME_H 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_UIO_H 1 +| #define HAVE_SYS_UN_H 1 +| #define HAVE_SYS_WAIT_H 1 +| #define HAVE_NETINET_TCP_H 1 +| #define SETPGRP_VOID 1 +| #define HAVE_SOCKLEN_T 1 +| #define SIZEOF_VOIDP 8 +| #define SIZEOF_CHAR 1 +| #define SIZEOF_INT 4 +| #define SIZEOF_LONG 8 +| #define SIZEOF_SHORT 2 +| #define SIZEOF_LONG_DOUBLE 16 +| #define SIZEOF_LONG_LONG 8 +| #define SIZEOF_SSIZE_T 8 +| #define SIZEOF_SIZE_T 8 +| #define SIZEOF_OFF_T 8 +| #define SIZEOF_PID_T 4 +| #define HAVE_STRNCASECMP 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_STRDUP 1 +| #define HAVE_STRSTR 1 +| #define HAVE_MEMCHR 1 +| #define HAVE_STRTOL 1 +| /* 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. */ +| #ifdef __cplusplus +| extern "C" +| #endif +| char shl_load (); +| int +| main () +| { +| return shl_load (); +| ; +| return 0; +| } +configure:38700: result: no +configure:38734: checking for dlopen +configure:38790: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread >&5 +/tmp/ccYBIJVc.o: In function `main': +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/conftest.c:187: undefined reference to `dlopen' +collect2: error: ld returned 1 exit status +configure:38797: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| #define HAVE_STRERROR_R 1 +| #define HAVE_CRYPT_R 1 +| #define CRYPT_R_STRUCT_CRYPT_DATA 1 +| #define HAVE_MMAP 1 +| #define HAVE_MEMMOVE 1 +| #define HAVE_GETPASS 1 +| #define HAVE_GMTIME_R 1 +| #define HAVE_LOCALTIME_R 1 +| #define HAVE_HSTRERROR 1 +| #define HAVE_MKSTEMP 1 +| #define DIRENT_INODE d_fileno +| #define DIRENT_TYPE d_type +| #define STDC_HEADERS 1 +| #define HAVE_ALLOCA_H 1 +| #define HAVE_CRYPT_H 1 +| #define HAVE_CTYPE_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_ERRNO_H 1 +| #define HAVE_FCNTL_H 1 +| #define HAVE_GRP_H 1 +| #define HAVE_LIMITS_H 1 +| #define HAVE_MALLOC_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_NETDB_H 1 +| #define HAVE_POLL_H 1 +| #define HAVE_PWD_H 1 +| #define HAVE_SEMAPHORE_H 1 +| #define HAVE_SIGNAL_H 1 +| #define HAVE_STDARG_H 1 +| #define HAVE_STDDEF_H 1 +| #define HAVE_STDIO_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_TERMIOS_H 1 +| #define HAVE_TIME_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_ARPA_INET_H 1 +| #define HAVE_NETINET_IN_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_SYS_IOCTL_H 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_POLL_H 1 +| #define HAVE_SYS_RESOURCE_H 1 +| #define HAVE_SYS_SELECT_H 1 +| #define HAVE_SYS_SEM_H 1 +| #define HAVE_SYS_SENDFILE_H 1 +| #define HAVE_SYS_SIGNAL_H 1 +| #define HAVE_SYS_SOCKET_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_SYS_SYSCTL_H 1 +| #define HAVE_SYS_TIME_H 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_UIO_H 1 +| #define HAVE_SYS_UN_H 1 +| #define HAVE_SYS_WAIT_H 1 +| #define HAVE_NETINET_TCP_H 1 +| #define SETPGRP_VOID 1 +| #define HAVE_SOCKLEN_T 1 +| #define SIZEOF_VOIDP 8 +| #define SIZEOF_CHAR 1 +| #define SIZEOF_INT 4 +| #define SIZEOF_LONG 8 +| #define SIZEOF_SHORT 2 +| #define SIZEOF_LONG_DOUBLE 16 +| #define SIZEOF_LONG_LONG 8 +| #define SIZEOF_SSIZE_T 8 +| #define SIZEOF_SIZE_T 8 +| #define SIZEOF_OFF_T 8 +| #define SIZEOF_PID_T 4 +| #define HAVE_STRNCASECMP 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_STRDUP 1 +| #define HAVE_STRSTR 1 +| #define HAVE_MEMCHR 1 +| #define HAVE_STRTOL 1 +| /* end confdefs.h. */ +| /* Define dlopen to an innocuous variant, in case declares dlopen. +| For example, HP-UX 11i declares gettimeofday. */ +| #define dlopen innocuous_dlopen +| +| /* System header to define __stub macros and hopefully few prototypes, +| which can conflict with char dlopen (); below. +| Prefer to if __STDC__ is defined, since +| exists even on freestanding compilers. */ +| +| #ifdef __STDC__ +| # include +| #else +| # include +| #endif +| +| #undef dlopen +| +| /* 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 dlopen (); +| /* The GNU C library defines this for functions which it implements +| to always fail with ENOSYS. Some functions are actually named +| something starting with __ and the normal name is an alias. */ +| #if defined __stub_dlopen || defined __stub___dlopen +| choke me +| #endif +| +| int +| main () +| { +| return dlopen (); +| ; +| return 0; +| } +configure:38819: result: no +configure:38835: checking for dlopen in -ldl +configure:38870: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -ldl -lrt -lm -lcrypt -lnsl -lpthread >&5 +configure:38877: $? = 0 +configure:38898: result: yes +configure:38933: checking for dlsym +configure:38989: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread -ldl >&5 +configure:38996: $? = 0 +configure:39018: result: yes +configure:39245: checking for waitpid +configure:39301: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread -ldl >&5 +configure:39308: $? = 0 +configure:39330: result: yes +configure:39357: checking for Variable Length Arrays +configure:39390: result: yes +configure:39400: checking struct rlimit +configure:39434: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread -ldl >&5 +conftest.c: In function 'main': +conftest.c:166:5: warning: incompatible implicit declaration of built-in function 'exit' [enabled by default] + exit(0); + ^ +configure:39438: $? = 0 +configure:39444: ./conftest +configure:39448: $? = 0 +configure:39467: result: yes +configure:39481: checking for semget +configure:39537: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread -ldl >&5 +configure:39544: $? = 0 +configure:39566: result: yes +configure:39481: checking for semctl +configure:39537: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread -ldl >&5 +configure:39544: $? = 0 +configure:39566: result: yes +configure:39481: checking for flock +configure:39537: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread -ldl >&5 +configure:39544: $? = 0 +configure:39566: result: yes +configure:39583: checking for semaphore.h +configure:39590: result: yes +configure:39731: checking for sem_close +configure:39787: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread -ldl >&5 +configure:39794: $? = 0 +configure:39816: result: yes +configure:39731: checking for sem_unlink +configure:39787: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread -ldl >&5 +configure:39794: $? = 0 +configure:39816: result: yes +configure:39731: checking for sem_post +configure:39787: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread -ldl >&5 +configure:39794: $? = 0 +configure:39816: result: yes +configure:39731: checking for sem_wait +configure:39787: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread -ldl >&5 +configure:39794: $? = 0 +configure:39816: result: yes +configure:39830: checking for working sem_open +configure:39872: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread -ldl >&5 +configure:39876: $? = 0 +configure:39882: ./conftest +configure:39886: $? = 1 +configure: program exited with status 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| #define HAVE_STRERROR_R 1 +| #define HAVE_CRYPT_R 1 +| #define CRYPT_R_STRUCT_CRYPT_DATA 1 +| #define HAVE_MMAP 1 +| #define HAVE_MEMMOVE 1 +| #define HAVE_GETPASS 1 +| #define HAVE_GMTIME_R 1 +| #define HAVE_LOCALTIME_R 1 +| #define HAVE_HSTRERROR 1 +| #define HAVE_MKSTEMP 1 +| #define DIRENT_INODE d_fileno +| #define DIRENT_TYPE d_type +| #define STDC_HEADERS 1 +| #define HAVE_ALLOCA_H 1 +| #define HAVE_CRYPT_H 1 +| #define HAVE_CTYPE_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_ERRNO_H 1 +| #define HAVE_FCNTL_H 1 +| #define HAVE_GRP_H 1 +| #define HAVE_LIMITS_H 1 +| #define HAVE_MALLOC_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_NETDB_H 1 +| #define HAVE_POLL_H 1 +| #define HAVE_PWD_H 1 +| #define HAVE_SEMAPHORE_H 1 +| #define HAVE_SIGNAL_H 1 +| #define HAVE_STDARG_H 1 +| #define HAVE_STDDEF_H 1 +| #define HAVE_STDIO_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_TERMIOS_H 1 +| #define HAVE_TIME_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_ARPA_INET_H 1 +| #define HAVE_NETINET_IN_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_SYS_IOCTL_H 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_POLL_H 1 +| #define HAVE_SYS_RESOURCE_H 1 +| #define HAVE_SYS_SELECT_H 1 +| #define HAVE_SYS_SEM_H 1 +| #define HAVE_SYS_SENDFILE_H 1 +| #define HAVE_SYS_SIGNAL_H 1 +| #define HAVE_SYS_SOCKET_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_SYS_SYSCTL_H 1 +| #define HAVE_SYS_TIME_H 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_UIO_H 1 +| #define HAVE_SYS_UN_H 1 +| #define HAVE_SYS_WAIT_H 1 +| #define HAVE_NETINET_TCP_H 1 +| #define SETPGRP_VOID 1 +| #define HAVE_SOCKLEN_T 1 +| #define SIZEOF_VOIDP 8 +| #define SIZEOF_CHAR 1 +| #define SIZEOF_INT 4 +| #define SIZEOF_LONG 8 +| #define SIZEOF_SHORT 2 +| #define SIZEOF_LONG_DOUBLE 16 +| #define SIZEOF_LONG_LONG 8 +| #define SIZEOF_SSIZE_T 8 +| #define SIZEOF_SIZE_T 8 +| #define SIZEOF_OFF_T 8 +| #define SIZEOF_PID_T 4 +| #define HAVE_STRNCASECMP 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_STRDUP 1 +| #define HAVE_STRSTR 1 +| #define HAVE_MEMCHR 1 +| #define HAVE_STRTOL 1 +| #define HAVE_DLSYM 1 +| #define DSO_USE_DLFCN 1 +| #define HAVE_WAITPID 1 +| #define HAVE_VLA 1 +| #define HAVE_SEMGET 1 +| #define HAVE_SEMCTL 1 +| #define HAVE_FLOCK 1 +| #define HAVE_SEMAPHORE_H 1 +| #define HAVE_SEM_CLOSE 1 +| #define HAVE_SEM_UNLINK 1 +| #define HAVE_SEM_POST 1 +| #define HAVE_SEM_WAIT 1 +| /* end confdefs.h. */ +| +| #include +| #include +| #include +| #include +| main() +| { +| sem_t *psem; +| const char *sem_name = "/apr_autoconf"; +| +| if (sizeof(int) < sizeof(sem_t *)) +| exit(1); +| psem = sem_open(sem_name, O_CREAT, 0644, 1); +| if (psem == (sem_t *)SEM_FAILED) { +| exit(1); +| } +| sem_close(psem); +| sem_unlink(sem_name); +| exit(0); +| } +configure:39903: result: no +configure:39907: checking for union semun in sys/sem.h +configure:39937: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +conftest.c: In function 'main': +conftest.c:174:13: error: storage size of 'arg' isn't known + union semun arg; + ^ +configure:39944: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| #define HAVE_STRERROR_R 1 +| #define HAVE_CRYPT_R 1 +| #define CRYPT_R_STRUCT_CRYPT_DATA 1 +| #define HAVE_MMAP 1 +| #define HAVE_MEMMOVE 1 +| #define HAVE_GETPASS 1 +| #define HAVE_GMTIME_R 1 +| #define HAVE_LOCALTIME_R 1 +| #define HAVE_HSTRERROR 1 +| #define HAVE_MKSTEMP 1 +| #define DIRENT_INODE d_fileno +| #define DIRENT_TYPE d_type +| #define STDC_HEADERS 1 +| #define HAVE_ALLOCA_H 1 +| #define HAVE_CRYPT_H 1 +| #define HAVE_CTYPE_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_ERRNO_H 1 +| #define HAVE_FCNTL_H 1 +| #define HAVE_GRP_H 1 +| #define HAVE_LIMITS_H 1 +| #define HAVE_MALLOC_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_NETDB_H 1 +| #define HAVE_POLL_H 1 +| #define HAVE_PWD_H 1 +| #define HAVE_SEMAPHORE_H 1 +| #define HAVE_SIGNAL_H 1 +| #define HAVE_STDARG_H 1 +| #define HAVE_STDDEF_H 1 +| #define HAVE_STDIO_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_TERMIOS_H 1 +| #define HAVE_TIME_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_ARPA_INET_H 1 +| #define HAVE_NETINET_IN_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_SYS_IOCTL_H 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_POLL_H 1 +| #define HAVE_SYS_RESOURCE_H 1 +| #define HAVE_SYS_SELECT_H 1 +| #define HAVE_SYS_SEM_H 1 +| #define HAVE_SYS_SENDFILE_H 1 +| #define HAVE_SYS_SIGNAL_H 1 +| #define HAVE_SYS_SOCKET_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_SYS_SYSCTL_H 1 +| #define HAVE_SYS_TIME_H 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_UIO_H 1 +| #define HAVE_SYS_UN_H 1 +| #define HAVE_SYS_WAIT_H 1 +| #define HAVE_NETINET_TCP_H 1 +| #define SETPGRP_VOID 1 +| #define HAVE_SOCKLEN_T 1 +| #define SIZEOF_VOIDP 8 +| #define SIZEOF_CHAR 1 +| #define SIZEOF_INT 4 +| #define SIZEOF_LONG 8 +| #define SIZEOF_SHORT 2 +| #define SIZEOF_LONG_DOUBLE 16 +| #define SIZEOF_LONG_LONG 8 +| #define SIZEOF_SSIZE_T 8 +| #define SIZEOF_SIZE_T 8 +| #define SIZEOF_OFF_T 8 +| #define SIZEOF_PID_T 4 +| #define HAVE_STRNCASECMP 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_STRDUP 1 +| #define HAVE_STRSTR 1 +| #define HAVE_MEMCHR 1 +| #define HAVE_STRTOL 1 +| #define HAVE_DLSYM 1 +| #define DSO_USE_DLFCN 1 +| #define HAVE_WAITPID 1 +| #define HAVE_VLA 1 +| #define HAVE_SEMGET 1 +| #define HAVE_SEMCTL 1 +| #define HAVE_FLOCK 1 +| #define HAVE_SEMAPHORE_H 1 +| #define HAVE_SEM_CLOSE 1 +| #define HAVE_SEM_UNLINK 1 +| #define HAVE_SEM_POST 1 +| #define HAVE_SEM_WAIT 1 +| /* end confdefs.h. */ +| +| #include +| #include +| #include +| +| int +| main () +| { +| +| union semun arg; +| semctl(0, 0, 0, arg); +| +| ; +| return 0; +| } +configure:39961: result: no +configure:39966: checking for LOCK_EX in sys/file.h +configure:39995: result: yes +configure:40006: checking for F_SETLK in fcntl.h +configure:40035: result: yes +configure:40046: checking for SEM_UNDO in sys/sem.h +configure:40075: result: yes +configure:40089: checking for POLLIN in poll.h sys/poll.h +configure:40120: result: yes +configure:40133: checking for PTHREAD_PROCESS_SHARED in pthread.h +configure:40162: result: yes +configure:40176: checking for pthread_mutexattr_setpshared +configure:40232: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread -ldl >&5 +configure:40239: $? = 0 +configure:40261: result: yes +configure:40304: checking for working PROCESS_SHARED locks +configure:40351: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread -ldl >&5 +conftest.c: In function 'main': +conftest.c:179:17: warning: incompatible implicit declaration of built-in function 'exit' [enabled by default] + exit(1); + ^ +configure:40355: $? = 0 +configure:40361: ./conftest +configure:40365: $? = 0 +configure:40382: result: yes +configure:40394: checking for robust cross-process mutex support +configure:40448: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread -ldl >&5 +configure:40452: $? = 0 +configure:40458: ./conftest +configure:40462: $? = 0 +configure:40479: result: yes +configure:40823: result: decision on apr_lock implementation method... SysV IPC semget() +configure:40868: checking if all interprocess locks affect threads +configure:40876: result: no +configure:40882: checking if POSIX sems affect threads in the same process +configure:40893: result: no +configure:40897: checking if SysV sems affect threads in the same process +configure:40908: result: no +configure:40912: checking if fcntl locks affect threads in the same process +configure:40923: result: no +configure:40927: checking if flock locks affect threads in the same process +configure:40938: result: no +configure:40942: checking for entropy source +configure:41008: result: /dev/random +configure:41044: checking for tm_gmtoff in struct tm +configure:41071: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:41078: $? = 0 +configure:41093: result: yes +configure:41105: checking for in_addr in netinet/in.h +configure:41134: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:41141: $? = 0 +configure:41157: result: yes +configure:41160: checking if fd == socket on this platform +configure:41176: checking style of gethostbyname_r routine +configure:41229: result: glibc2 +configure:41240: checking 3rd argument to the gethostbyname_r routines +conftest.c: In function 'main': +conftest.c:22:35: error: passing argument 3 of 'gethostbyname_r' from incompatible pointer type [-Werror] + (struct hostent_data *) 0); + ^ +In file included from conftest.c:13:0: +/usr/include/netdb.h:179:12: note: expected 'char * __restrict__' but argument is of type 'struct hostent_data *' + extern int gethostbyname_r (const char *__restrict __name, + ^ +conftest.c:22:35: error: too few arguments to function 'gethostbyname_r' + (struct hostent_data *) 0); + ^ +In file included from conftest.c:13:0: +/usr/include/netdb.h:179:12: note: declared here + extern int gethostbyname_r (const char *__restrict __name, + ^ +cc1: all warnings being treated as errors +configure: failed or warning program: +#include "confdefs.h" + +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_ARPA_INET_H +#include +#endif +#ifdef HAVE_NETDB_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif + +int main(int argc, const char * const *argv) { + +int tmp = gethostbyname_r((const char *) 0, (struct hostent *) 0, + (struct hostent_data *) 0); +; return 0; } +configure:41292: result: char +configure:41306: checking if TCP_NODELAY setting is inherited from listening sockets +configure:41426: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread -ldl >&5 +conftest.c: In function 'main': +conftest.c:205:9: warning: incompatible implicit declaration of built-in function 'exit' [enabled by default] + exit(1); + ^ +conftest.c:211:9: warning: incompatible implicit declaration of built-in function 'exit' [enabled by default] + exit(1); + ^ +conftest.c:213:5: warning: incompatible implicit declaration of built-in function 'memset' [enabled by default] + memset(&sa, 0, sizeof sa); + ^ +conftest.c:222:9: warning: incompatible implicit declaration of built-in function 'exit' [enabled by default] + exit(1); + ^ +conftest.c:229:9: warning: incompatible implicit declaration of built-in function 'exit' [enabled by default] + exit(1); + ^ +conftest.c:235:9: warning: incompatible implicit declaration of built-in function 'exit' [enabled by default] + exit(1); + ^ +conftest.c:240:9: warning: incompatible implicit declaration of built-in function 'exit' [enabled by default] + exit(1); + ^ +conftest.c:252:9: warning: incompatible implicit declaration of built-in function 'exit' [enabled by default] + exit(1); + ^ +conftest.c:258:9: warning: incompatible implicit declaration of built-in function 'exit' [enabled by default] + exit(1); + ^ +conftest.c:264:9: warning: incompatible implicit declaration of built-in function 'exit' [enabled by default] + exit(1); + ^ +conftest.c:268:9: warning: incompatible implicit declaration of built-in function 'exit' [enabled by default] + exit(1); + ^ +configure:41430: $? = 0 +configure:41436: ./conftest +configure:41440: $? = 0 +configure:41461: result: yes +configure:41470: checking if O_NONBLOCK setting is inherited from listening sockets +configure:41589: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread -ldl >&5 +conftest.c: In function 'main': +conftest.c:206:9: warning: incompatible implicit declaration of built-in function 'exit' [enabled by default] + exit(1); + ^ +conftest.c:208:5: warning: incompatible implicit declaration of built-in function 'memset' [enabled by default] + memset(&sa, 0, sizeof sa); + ^ +conftest.c:217:9: warning: incompatible implicit declaration of built-in function 'exit' [enabled by default] + exit(1); + ^ +conftest.c:224:9: warning: incompatible implicit declaration of built-in function 'exit' [enabled by default] + exit(1); + ^ +conftest.c:230:9: warning: incompatible implicit declaration of built-in function 'exit' [enabled by default] + exit(1); + ^ +conftest.c:235:9: warning: incompatible implicit declaration of built-in function 'exit' [enabled by default] + exit(1); + ^ +conftest.c:240:9: warning: incompatible implicit declaration of built-in function 'exit' [enabled by default] + exit(1); + ^ +conftest.c:252:9: warning: incompatible implicit declaration of built-in function 'exit' [enabled by default] + exit(1); + ^ +conftest.c:258:9: warning: incompatible implicit declaration of built-in function 'exit' [enabled by default] + exit(1); + ^ +conftest.c:263:9: warning: incompatible implicit declaration of built-in function 'exit' [enabled by default] + exit(1); + ^ +conftest.c:267:9: warning: incompatible implicit declaration of built-in function 'exit' [enabled by default] + exit(1); + ^ +configure:41593: $? = 0 +configure:41599: ./conftest +O_NONBLOCK is not set in the child. +configure:41603: $? = 1 +configure: program exited with status 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| #define HAVE_STRERROR_R 1 +| #define HAVE_CRYPT_R 1 +| #define CRYPT_R_STRUCT_CRYPT_DATA 1 +| #define HAVE_MMAP 1 +| #define HAVE_MEMMOVE 1 +| #define HAVE_GETPASS 1 +| #define HAVE_GMTIME_R 1 +| #define HAVE_LOCALTIME_R 1 +| #define HAVE_HSTRERROR 1 +| #define HAVE_MKSTEMP 1 +| #define DIRENT_INODE d_fileno +| #define DIRENT_TYPE d_type +| #define STDC_HEADERS 1 +| #define HAVE_ALLOCA_H 1 +| #define HAVE_CRYPT_H 1 +| #define HAVE_CTYPE_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_ERRNO_H 1 +| #define HAVE_FCNTL_H 1 +| #define HAVE_GRP_H 1 +| #define HAVE_LIMITS_H 1 +| #define HAVE_MALLOC_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_NETDB_H 1 +| #define HAVE_POLL_H 1 +| #define HAVE_PWD_H 1 +| #define HAVE_SEMAPHORE_H 1 +| #define HAVE_SIGNAL_H 1 +| #define HAVE_STDARG_H 1 +| #define HAVE_STDDEF_H 1 +| #define HAVE_STDIO_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_TERMIOS_H 1 +| #define HAVE_TIME_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_ARPA_INET_H 1 +| #define HAVE_NETINET_IN_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_SYS_IOCTL_H 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_POLL_H 1 +| #define HAVE_SYS_RESOURCE_H 1 +| #define HAVE_SYS_SELECT_H 1 +| #define HAVE_SYS_SEM_H 1 +| #define HAVE_SYS_SENDFILE_H 1 +| #define HAVE_SYS_SIGNAL_H 1 +| #define HAVE_SYS_SOCKET_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_SYS_SYSCTL_H 1 +| #define HAVE_SYS_TIME_H 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_UIO_H 1 +| #define HAVE_SYS_UN_H 1 +| #define HAVE_SYS_WAIT_H 1 +| #define HAVE_NETINET_TCP_H 1 +| #define SETPGRP_VOID 1 +| #define HAVE_SOCKLEN_T 1 +| #define SIZEOF_VOIDP 8 +| #define SIZEOF_CHAR 1 +| #define SIZEOF_INT 4 +| #define SIZEOF_LONG 8 +| #define SIZEOF_SHORT 2 +| #define SIZEOF_LONG_DOUBLE 16 +| #define SIZEOF_LONG_LONG 8 +| #define SIZEOF_SSIZE_T 8 +| #define SIZEOF_SIZE_T 8 +| #define SIZEOF_OFF_T 8 +| #define SIZEOF_PID_T 4 +| #define HAVE_STRNCASECMP 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_STRDUP 1 +| #define HAVE_STRSTR 1 +| #define HAVE_MEMCHR 1 +| #define HAVE_STRTOL 1 +| #define HAVE_DLSYM 1 +| #define DSO_USE_DLFCN 1 +| #define HAVE_WAITPID 1 +| #define HAVE_VLA 1 +| #define HAVE_SEMGET 1 +| #define HAVE_SEMCTL 1 +| #define HAVE_FLOCK 1 +| #define HAVE_SEMAPHORE_H 1 +| #define HAVE_SEM_CLOSE 1 +| #define HAVE_SEM_UNLINK 1 +| #define HAVE_SEM_POST 1 +| #define HAVE_SEM_WAIT 1 +| #define HAVE_LOCK_EX 1 +| #define HAVE_F_SETLK 1 +| #define HAVE_SEM_UNDO 1 +| #define HAVE_POLLIN 1 +| #define HAVE_PTHREAD_PROCESS_SHARED 1 +| #define HAVE_PTHREAD_MUTEXATTR_SETPSHARED 1 +| #define HAVE_PTHREAD_MUTEX_ROBUST 1 +| #define apr_lock implementation method 1 +| #define USE_SYSVSEM_SERIALIZE 1 +| #define DEV_RANDOM "/dev/random" +| #define HAVE_GMTOFF 1 +| #define GETHOSTBYNAME_R_GLIBC2 1 +| /* end confdefs.h. */ +| +| #include +| #ifdef HAVE_SYS_TYPES_H +| #include +| #endif +| #ifdef HAVE_SYS_SOCKET_H +| #include +| #endif +| #ifdef HAVE_NETINET_IN_H +| #include +| #endif +| #ifdef HAVE_NETINET_TCP_H +| #include +| #endif +| #ifndef HAVE_SOCKLEN_T +| typedef int socklen_t; +| #endif +| #ifdef HAVE_FCNTL_H +| #include +| #endif +| int main(void) { +| int listen_s, connected_s, client_s; +| int listen_port, rc; +| struct sockaddr_in sa; +| socklen_t sa_len; +| +| listen_s = socket(AF_INET, SOCK_STREAM, 0); +| if (listen_s < 0) { +| perror("socket"); +| exit(1); +| } +| memset(&sa, 0, sizeof sa); +| sa.sin_family = AF_INET; +| #ifdef BEOS +| sa.sin_addr.s_addr = htonl(INADDR_LOOPBACK); +| #endif +| /* leave port 0 to get ephemeral */ +| rc = bind(listen_s, (struct sockaddr *)&sa, sizeof sa); +| if (rc < 0) { +| perror("bind for ephemeral port"); +| exit(1); +| } +| /* find ephemeral port */ +| sa_len = sizeof(sa); +| rc = getsockname(listen_s, (struct sockaddr *)&sa, &sa_len); +| if (rc < 0) { +| perror("getsockname"); +| exit(1); +| } +| listen_port = sa.sin_port; +| rc = listen(listen_s, 5); +| if (rc < 0) { +| perror("listen"); +| exit(1); +| } +| rc = fcntl(listen_s, F_SETFL, O_NONBLOCK); +| if (rc < 0) { +| perror("fcntl(F_SETFL)"); +| exit(1); +| } +| client_s = socket(AF_INET, SOCK_STREAM, 0); +| if (client_s < 0) { +| perror("socket"); +| exit(1); +| } +| memset(&sa, 0, sizeof sa); +| sa.sin_family = AF_INET; +| sa.sin_port = listen_port; +| #ifdef BEOS +| sa.sin_addr.s_addr = htonl(INADDR_LOOPBACK); +| #endif +| /* leave sin_addr all zeros to use loopback */ +| rc = connect(client_s, (struct sockaddr *)&sa, sizeof sa); +| if (rc < 0) { +| perror("connect"); +| exit(1); +| } +| sa_len = sizeof sa; +| connected_s = accept(listen_s, (struct sockaddr *)&sa, &sa_len); +| if (connected_s < 0) { +| perror("accept"); +| exit(1); +| } +| rc = fcntl(connected_s, F_GETFL, 0); +| if (rc < 0) { +| perror("fcntl(F_GETFL)"); +| exit(1); +| } +| if (!(rc & O_NONBLOCK)) { +| fprintf(stderr, "O_NONBLOCK is not set in the child.\n"); +| exit(1); +| } +| return 0; +| } +| +configure:41624: result: no +configure:41635: checking for TCP_CORK in netinet/tcp.h +configure:41664: result: yes +configure:41675: checking for TCP_NOPUSH in netinet/tcp.h +configure:41704: result: no +configure:41755: checking for SO_ACCEPTFILTER in sys/socket.h +configure:41784: result: no +configure:41801: checking whether SCTP is supported +configure:41848: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread -ldl >&5 +conftest.c: In function 'main': +conftest.c:199:37: error: 'SCTP_NODELAY' undeclared (first use in this function) + if (setsockopt(s, IPPROTO_SCTP, SCTP_NODELAY, &opt, sizeof(int)) < 0) + ^ +conftest.c:199:37: note: each undeclared identifier is reported only once for each function it appears in +configure:41852: $? = 1 +configure: program exited with status 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| #define HAVE_STRERROR_R 1 +| #define HAVE_CRYPT_R 1 +| #define CRYPT_R_STRUCT_CRYPT_DATA 1 +| #define HAVE_MMAP 1 +| #define HAVE_MEMMOVE 1 +| #define HAVE_GETPASS 1 +| #define HAVE_GMTIME_R 1 +| #define HAVE_LOCALTIME_R 1 +| #define HAVE_HSTRERROR 1 +| #define HAVE_MKSTEMP 1 +| #define DIRENT_INODE d_fileno +| #define DIRENT_TYPE d_type +| #define STDC_HEADERS 1 +| #define HAVE_ALLOCA_H 1 +| #define HAVE_CRYPT_H 1 +| #define HAVE_CTYPE_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_ERRNO_H 1 +| #define HAVE_FCNTL_H 1 +| #define HAVE_GRP_H 1 +| #define HAVE_LIMITS_H 1 +| #define HAVE_MALLOC_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_NETDB_H 1 +| #define HAVE_POLL_H 1 +| #define HAVE_PWD_H 1 +| #define HAVE_SEMAPHORE_H 1 +| #define HAVE_SIGNAL_H 1 +| #define HAVE_STDARG_H 1 +| #define HAVE_STDDEF_H 1 +| #define HAVE_STDIO_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_TERMIOS_H 1 +| #define HAVE_TIME_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_ARPA_INET_H 1 +| #define HAVE_NETINET_IN_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_SYS_IOCTL_H 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_POLL_H 1 +| #define HAVE_SYS_RESOURCE_H 1 +| #define HAVE_SYS_SELECT_H 1 +| #define HAVE_SYS_SEM_H 1 +| #define HAVE_SYS_SENDFILE_H 1 +| #define HAVE_SYS_SIGNAL_H 1 +| #define HAVE_SYS_SOCKET_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_SYS_SYSCTL_H 1 +| #define HAVE_SYS_TIME_H 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_UIO_H 1 +| #define HAVE_SYS_UN_H 1 +| #define HAVE_SYS_WAIT_H 1 +| #define HAVE_NETINET_TCP_H 1 +| #define SETPGRP_VOID 1 +| #define HAVE_SOCKLEN_T 1 +| #define SIZEOF_VOIDP 8 +| #define SIZEOF_CHAR 1 +| #define SIZEOF_INT 4 +| #define SIZEOF_LONG 8 +| #define SIZEOF_SHORT 2 +| #define SIZEOF_LONG_DOUBLE 16 +| #define SIZEOF_LONG_LONG 8 +| #define SIZEOF_SSIZE_T 8 +| #define SIZEOF_SIZE_T 8 +| #define SIZEOF_OFF_T 8 +| #define SIZEOF_PID_T 4 +| #define HAVE_STRNCASECMP 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_STRDUP 1 +| #define HAVE_STRSTR 1 +| #define HAVE_MEMCHR 1 +| #define HAVE_STRTOL 1 +| #define HAVE_DLSYM 1 +| #define DSO_USE_DLFCN 1 +| #define HAVE_WAITPID 1 +| #define HAVE_VLA 1 +| #define HAVE_SEMGET 1 +| #define HAVE_SEMCTL 1 +| #define HAVE_FLOCK 1 +| #define HAVE_SEMAPHORE_H 1 +| #define HAVE_SEM_CLOSE 1 +| #define HAVE_SEM_UNLINK 1 +| #define HAVE_SEM_POST 1 +| #define HAVE_SEM_WAIT 1 +| #define HAVE_LOCK_EX 1 +| #define HAVE_F_SETLK 1 +| #define HAVE_SEM_UNDO 1 +| #define HAVE_POLLIN 1 +| #define HAVE_PTHREAD_PROCESS_SHARED 1 +| #define HAVE_PTHREAD_MUTEXATTR_SETPSHARED 1 +| #define HAVE_PTHREAD_MUTEX_ROBUST 1 +| #define apr_lock implementation method 1 +| #define USE_SYSVSEM_SERIALIZE 1 +| #define DEV_RANDOM "/dev/random" +| #define HAVE_GMTOFF 1 +| #define GETHOSTBYNAME_R_GLIBC2 1 +| #define HAVE_TCP_CORK 1 +| /* end confdefs.h. */ +| +| #ifdef HAVE_SYS_TYPES_H +| #include +| #endif +| #ifdef HAVE_SYS_SOCKET_H +| #include +| #endif +| #ifdef HAVE_NETINET_IN_H +| #include +| #endif +| #ifdef HAVE_NETINET_SCTP_H +| #include +| #endif +| #ifdef HAVE_NETINET_SCTP_UIO_H +| #include +| #endif +| #include +| int main(void) { +| int s, opt = 1; +| if ((s = socket(AF_INET, SOCK_STREAM, IPPROTO_SCTP)) < 0) +| exit(1); +| if (setsockopt(s, IPPROTO_SCTP, SCTP_NODELAY, &opt, sizeof(int)) < 0) +| exit(2); +| exit(0); +| } +configure:41879: result: no +configure:41898: checking for set_h_errno +configure:41954: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread -ldl >&5 +/tmp/cc6cYjpL.o: In function `main': +/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/conftest.c:212: undefined reference to `set_h_errno' +collect2: error: ld returned 1 exit status +configure:41961: $? = 1 +configure: failed program was: +| /* confdefs.h. */ +| #define PACKAGE_NAME "" +| #define PACKAGE_TARNAME "" +| #define PACKAGE_VERSION "" +| #define PACKAGE_STRING "" +| #define PACKAGE_BUGREPORT "" +| #define STDC_HEADERS 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_INTTYPES_H 1 +| #define HAVE_STDINT_H 1 +| #define HAVE_UNISTD_H 1 +| #define __EXTENSIONS__ 1 +| #define _ALL_SOURCE 1 +| #define _GNU_SOURCE 1 +| #define _POSIX_PTHREAD_SEMANTICS 1 +| #define _TANDEM_SOURCE 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_LIBNSL 1 +| #define HAVE_PTHREAD_H 1 +| #define HAVE_PTHREAD_H 1 +| #define USE_THREADS 1 +| #define HAVE_PTHREAD_KEY_DELETE 1 +| #define HAVE_PTHREAD_RWLOCK_INIT 1 +| #define HAVE_PTHREAD_RWLOCKS 1 +| #define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +| #define HAVE_GETHOSTBYNAME_R 1 +| #define HAVE_GETHOSTBYADDR_R 1 +| #define HAVE_SIGSUSPEND 1 +| #define HAVE_SIGWAIT 1 +| #define HAVE_POLL 1 +| #define HAVE_GETPWNAM_R 1 +| #define HAVE_GETPWUID_R 1 +| #define HAVE_GETGRNAM_R 1 +| #define HAVE_GETGRGID_R 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_IPC_H 1 +| #define HAVE_SYS_SHM_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_MMAP 1 +| #define HAVE_MUNMAP 1 +| #define HAVE_SHM_OPEN 1 +| #define HAVE_SHM_UNLINK 1 +| #define HAVE_SHMGET 1 +| #define HAVE_SHMAT 1 +| #define HAVE_SHMDT 1 +| #define HAVE_SHMCTL 1 +| #define HAVE_MAP_ANON 1 +| #define anonymous shared memory allocation method 1 +| #define USE_SHMEM_MMAP_ANON 1 +| #define namebased memory allocation method 1 +| #define USE_SHMEM_SHMGET 1 +| #define HAVE_CALLOC 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_SETSID 1 +| #define HAVE_ISINF 1 +| #define HAVE_ISNAN 1 +| #define HAVE_GETENV 1 +| #define HAVE_PUTENV 1 +| #define HAVE_SETENV 1 +| #define HAVE_UNSETENV 1 +| #define HAVE_SETRLIMIT 1 +| #define HAVE_GETRLIMIT 1 +| #define HAVE_WRITEV 1 +| #define HAVE_SENDFILE 1 +| #define HAVE_UTIME 1 +| #define HAVE_UTIMES 1 +| #define HAVE_SIGACTION 1 +| #define HAVE_DECL_SYS_SIGLIST 1 +| #define HAVE_FORK 1 +| #define HAVE_STRERROR_R 1 +| #define HAVE_CRYPT_R 1 +| #define CRYPT_R_STRUCT_CRYPT_DATA 1 +| #define HAVE_MMAP 1 +| #define HAVE_MEMMOVE 1 +| #define HAVE_GETPASS 1 +| #define HAVE_GMTIME_R 1 +| #define HAVE_LOCALTIME_R 1 +| #define HAVE_HSTRERROR 1 +| #define HAVE_MKSTEMP 1 +| #define DIRENT_INODE d_fileno +| #define DIRENT_TYPE d_type +| #define STDC_HEADERS 1 +| #define HAVE_ALLOCA_H 1 +| #define HAVE_CRYPT_H 1 +| #define HAVE_CTYPE_H 1 +| #define HAVE_DIRENT_H 1 +| #define HAVE_DLFCN_H 1 +| #define HAVE_ERRNO_H 1 +| #define HAVE_FCNTL_H 1 +| #define HAVE_GRP_H 1 +| #define HAVE_LIMITS_H 1 +| #define HAVE_MALLOC_H 1 +| #define HAVE_MEMORY_H 1 +| #define HAVE_NETDB_H 1 +| #define HAVE_POLL_H 1 +| #define HAVE_PWD_H 1 +| #define HAVE_SEMAPHORE_H 1 +| #define HAVE_SIGNAL_H 1 +| #define HAVE_STDARG_H 1 +| #define HAVE_STDDEF_H 1 +| #define HAVE_STDIO_H 1 +| #define HAVE_STDLIB_H 1 +| #define HAVE_STRING_H 1 +| #define HAVE_STRINGS_H 1 +| #define HAVE_TERMIOS_H 1 +| #define HAVE_TIME_H 1 +| #define HAVE_UNISTD_H 1 +| #define HAVE_ARPA_INET_H 1 +| #define HAVE_NETINET_IN_H 1 +| #define HAVE_SYS_FILE_H 1 +| #define HAVE_SYS_IOCTL_H 1 +| #define HAVE_SYS_MMAN_H 1 +| #define HAVE_SYS_POLL_H 1 +| #define HAVE_SYS_RESOURCE_H 1 +| #define HAVE_SYS_SELECT_H 1 +| #define HAVE_SYS_SEM_H 1 +| #define HAVE_SYS_SENDFILE_H 1 +| #define HAVE_SYS_SIGNAL_H 1 +| #define HAVE_SYS_SOCKET_H 1 +| #define HAVE_SYS_STAT_H 1 +| #define HAVE_SYS_SYSCTL_H 1 +| #define HAVE_SYS_TIME_H 1 +| #define HAVE_SYS_TYPES_H 1 +| #define HAVE_SYS_UIO_H 1 +| #define HAVE_SYS_UN_H 1 +| #define HAVE_SYS_WAIT_H 1 +| #define HAVE_NETINET_TCP_H 1 +| #define SETPGRP_VOID 1 +| #define HAVE_SOCKLEN_T 1 +| #define SIZEOF_VOIDP 8 +| #define SIZEOF_CHAR 1 +| #define SIZEOF_INT 4 +| #define SIZEOF_LONG 8 +| #define SIZEOF_SHORT 2 +| #define SIZEOF_LONG_DOUBLE 16 +| #define SIZEOF_LONG_LONG 8 +| #define SIZEOF_SSIZE_T 8 +| #define SIZEOF_SIZE_T 8 +| #define SIZEOF_OFF_T 8 +| #define SIZEOF_PID_T 4 +| #define HAVE_STRNCASECMP 1 +| #define HAVE_STRCASECMP 1 +| #define HAVE_STRDUP 1 +| #define HAVE_STRSTR 1 +| #define HAVE_MEMCHR 1 +| #define HAVE_STRTOL 1 +| #define HAVE_DLSYM 1 +| #define DSO_USE_DLFCN 1 +| #define HAVE_WAITPID 1 +| #define HAVE_VLA 1 +| #define HAVE_SEMGET 1 +| #define HAVE_SEMCTL 1 +| #define HAVE_FLOCK 1 +| #define HAVE_SEMAPHORE_H 1 +| #define HAVE_SEM_CLOSE 1 +| #define HAVE_SEM_UNLINK 1 +| #define HAVE_SEM_POST 1 +| #define HAVE_SEM_WAIT 1 +| #define HAVE_LOCK_EX 1 +| #define HAVE_F_SETLK 1 +| #define HAVE_SEM_UNDO 1 +| #define HAVE_POLLIN 1 +| #define HAVE_PTHREAD_PROCESS_SHARED 1 +| #define HAVE_PTHREAD_MUTEXATTR_SETPSHARED 1 +| #define HAVE_PTHREAD_MUTEX_ROBUST 1 +| #define apr_lock implementation method 1 +| #define USE_SYSVSEM_SERIALIZE 1 +| #define DEV_RANDOM "/dev/random" +| #define HAVE_GMTOFF 1 +| #define GETHOSTBYNAME_R_GLIBC2 1 +| #define HAVE_TCP_CORK 1 +| /* end confdefs.h. */ +| /* Define set_h_errno to an innocuous variant, in case declares set_h_errno. +| For example, HP-UX 11i declares gettimeofday. */ +| #define set_h_errno innocuous_set_h_errno +| +| /* System header to define __stub macros and hopefully few prototypes, +| which can conflict with char set_h_errno (); below. +| Prefer to if __STDC__ is defined, since +| exists even on freestanding compilers. */ +| +| #ifdef __STDC__ +| # include +| #else +| # include +| #endif +| +| #undef set_h_errno +| +| /* 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 set_h_errno (); +| /* 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_set_h_errno || defined __stub___set_h_errno +| choke me +| #endif +| +| int +| main () +| { +| return set_h_errno (); +| ; +| return 0; +| } +configure:41983: result: no +configure:41996: checking for presence of retrans/retry fields in res_state/resolv.h +configure:42034: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread -ldl >&5 +conftest.c: In function 'main': +conftest.c:188:5: warning: incompatible implicit declaration of built-in function 'exit' [enabled by default] + exit(0); + ^ +configure:42038: $? = 0 +configure:42044: ./conftest +configure:42048: $? = 0 +configure:42069: result: yes +configure:42097: checking for library containing getaddrinfo +configure:42138: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread -ldl >&5 +configure:42145: $? = 0 +configure:42176: result: none required +configure:42184: checking for library containing gai_strerror +configure:42225: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread -ldl >&5 +configure:42232: $? = 0 +configure:42263: result: none required +configure:42271: checking for library containing getnameinfo +configure:42312: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread -ldl >&5 +configure:42319: $? = 0 +configure:42350: result: none required +configure:42362: checking for gai_strerror +configure:42418: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread -ldl >&5 +configure:42425: $? = 0 +configure:42447: result: yes +configure:42460: checking for working getaddrinfo +configure:42515: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread -ldl >&5 +conftest.c: In function 'main': +conftest.c:203:9: warning: incompatible implicit declaration of built-in function 'exit' [enabled by default] + exit(1); + ^ +conftest.c:206:9: warning: incompatible implicit declaration of built-in function 'exit' [enabled by default] + exit(1); + ^ +conftest.c:208:5: warning: incompatible implicit declaration of built-in function 'exit' [enabled by default] + exit(0); + ^ +configure:42519: $? = 0 +configure:42525: ./conftest +configure:42529: $? = 0 +configure:42550: result: yes +configure:42565: checking for negative error codes for getaddrinfo +configure:42601: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread -ldl >&5 +conftest.c: In function 'main': +conftest.c:188:9: warning: incompatible implicit declaration of built-in function 'exit' [enabled by default] + exit(0); + ^ +conftest.c:190:5: warning: incompatible implicit declaration of built-in function 'exit' [enabled by default] + exit(1); + ^ +configure:42605: $? = 0 +configure:42611: ./conftest +configure:42615: $? = 0 +configure:42636: result: yes +configure:42647: checking for working getnameinfo +configure:42710: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread -ldl >&5 +conftest.c: In function 'main': +conftest.c:215:9: warning: incompatible implicit declaration of built-in function 'exit' [enabled by default] + exit(1); + ^ +conftest.c:217:9: warning: incompatible implicit declaration of built-in function 'exit' [enabled by default] + exit(0); + ^ +configure:42714: $? = 0 +configure:42720: ./conftest +configure:42724: $? = 0 +configure:42745: result: yes +configure:42756: checking for sockaddr_in6 +configure:42792: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:42799: $? = 0 +configure:42819: result: yes +configure:42853: checking if APR supports IPv6 +configure:42855: result: yes +configure:42877: checking langinfo.h usability +configure:42894: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:42901: $? = 0 +configure:42915: result: yes +configure:42919: checking langinfo.h presence +configure:42934: gcc -E -D_REENTRANT -D_GNU_SOURCE conftest.c +configure:42941: $? = 0 +configure:42955: result: yes +configure:42983: checking for langinfo.h +configure:42992: result: yes +configure:43011: checking for nl_langinfo +configure:43067: gcc -o conftest -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c -lrt -lm -lcrypt -lnsl -lpthread -ldl >&5 +configure:43074: $? = 0 +configure:43096: result: yes +configure:43114: checking for usable fstat64 +configure:43142: gcc -c -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE conftest.c >&5 +configure:43149: $? = 0 +configure:43164: result: yes +configure:43427: creating ./config.status + +## ---------------------- ## +## Running config.status. ## +## ---------------------- ## + +This file was extended by config.status, which was +generated by GNU Autoconf 2.63. Invocation command line was + + CONFIG_FILES = + CONFIG_HEADERS = + CONFIG_LINKS = + CONFIG_COMMANDS = + $ ./config.status + +on ubuntu + +config.status:1101: creating Makefile +config.status:1101: creating strings/Makefile +config.status:1101: creating passwd/Makefile +config.status:1101: creating tables/Makefile +config.status:1101: creating build/Makefile +config.status:1101: creating file_io/unix/Makefile +config.status:1101: creating network_io/unix/Makefile +config.status:1101: creating threadproc/unix/Makefile +config.status:1101: creating misc/unix/Makefile +config.status:1101: creating locks/unix/Makefile +config.status:1101: creating time/unix/Makefile +config.status:1101: creating mmap/unix/Makefile +config.status:1101: creating shmem/unix/Makefile +config.status:1101: creating user/unix/Makefile +config.status:1101: creating memory/unix/Makefile +config.status:1101: creating atomic/unix/Makefile +config.status:1101: creating poll/unix/Makefile +config.status:1101: creating support/unix/Makefile +config.status:1101: creating dso/unix/Makefile +config.status:1101: creating test/Makefile +config.status:1101: creating test/internal/Makefile +config.status:1101: creating include/apr.h +config.status:1101: creating build/apr_rules.mk +config.status:1101: creating build/pkg/pkginfo +config.status:1101: creating apr-config +config.status:1101: creating include/arch/unix/apr_private.h +config.status:1335: executing default commands + +## ---------------- ## +## Cache variables. ## +## ---------------- ## + +ac_cv_build=x86_64-unknown-linux-gnu +ac_cv_c_compiler_gnu=yes +ac_cv_c_const=yes +ac_cv_c_inline=inline +ac_cv_crypt_r_style=struct_crypt_data +ac_cv_cxx_compiler_gnu=yes +ac_cv_define_F_SETLK=yes +ac_cv_define_GETHOSTBYADDR_IS_THREAD_SAFE=no +ac_cv_define_GETHOSTBYNAME_IS_THREAD_SAFE=no +ac_cv_define_LOCK_EX=yes +ac_cv_define_MAP_ANON=yes +ac_cv_define_POLLIN=yes +ac_cv_define_PTHREAD_PROCESS_SHARED=yes +ac_cv_define_READDIR_IS_THREAD_SAFE=no +ac_cv_define_SEM_UNDO=yes +ac_cv_define_SO_ACCEPTFILTER=no +ac_cv_define_TCP_CORK=yes +ac_cv_define_TCP_NOPUSH=no +ac_cv_define_sockaddr_in6=yes +ac_cv_ebcdic=no +ac_cv_env_CCC_set= +ac_cv_env_CCC_value= +ac_cv_env_CC_set= +ac_cv_env_CC_value= +ac_cv_env_CFLAGS_set= +ac_cv_env_CFLAGS_value= +ac_cv_env_CPPFLAGS_set= +ac_cv_env_CPPFLAGS_value= +ac_cv_env_CPP_set= +ac_cv_env_CPP_value= +ac_cv_env_CXXCPP_set= +ac_cv_env_CXXCPP_value= +ac_cv_env_CXXFLAGS_set= +ac_cv_env_CXXFLAGS_value= +ac_cv_env_CXX_set= +ac_cv_env_CXX_value= +ac_cv_env_F77_set= +ac_cv_env_F77_value= +ac_cv_env_FFLAGS_set= +ac_cv_env_FFLAGS_value= +ac_cv_env_LDFLAGS_set= +ac_cv_env_LDFLAGS_value= +ac_cv_env_LIBS_set= +ac_cv_env_LIBS_value= +ac_cv_env_build_alias_set= +ac_cv_env_build_alias_value= +ac_cv_env_host_alias_set= +ac_cv_env_host_alias_value= +ac_cv_env_target_alias_set= +ac_cv_env_target_alias_value= +ac_cv_f77_compiler_gnu=no +ac_cv_file__dev_zero=yes +ac_cv_func_NSLinkModule=no +ac_cv_func__getch=no +ac_cv_func_alloca=no +ac_cv_func_calloc=yes +ac_cv_func_create_area=no +ac_cv_func_crypt_r=yes +ac_cv_func_dlopen=no +ac_cv_func_dlsym=yes +ac_cv_func_flock=yes +ac_cv_func_fork=yes +ac_cv_func_gai_strerror=yes +ac_cv_func_getenv=yes +ac_cv_func_getgrgid_r=yes +ac_cv_func_getgrnam_r=yes +ac_cv_func_gethostbyaddr_r=yes +ac_cv_func_gethostbyname_r=yes +ac_cv_func_getpass=yes +ac_cv_func_getpassphrase=no +ac_cv_func_getpwnam_r=yes +ac_cv_func_getpwuid_r=yes +ac_cv_func_getrlimit=yes +ac_cv_func_gmtime_r=yes +ac_cv_func_hstrerror=yes +ac_cv_func_inet_addr=yes +ac_cv_func_inet_network=yes +ac_cv_func_isinf=yes +ac_cv_func_isnan=yes +ac_cv_func_localtime_r=yes +ac_cv_func_memchr=yes +ac_cv_func_memmove=yes +ac_cv_func_mkstemp=yes +ac_cv_func_mmap=yes +ac_cv_func_munmap=yes +ac_cv_func_nl_langinfo=yes +ac_cv_func_poll=yes +ac_cv_func_pthread_key_delete=yes +ac_cv_func_pthread_mutexattr_setpshared=yes +ac_cv_func_pthread_rwlock_init=yes +ac_cv_func_putenv=yes +ac_cv_func_sem_close=yes +ac_cv_func_sem_open=no +ac_cv_func_sem_post=yes +ac_cv_func_sem_unlink=yes +ac_cv_func_sem_wait=yes +ac_cv_func_semctl=yes +ac_cv_func_semget=yes +ac_cv_func_send_file=no +ac_cv_func_sendfile=yes +ac_cv_func_sendfilev=no +ac_cv_func_set_h_errno=no +ac_cv_func_setenv=yes +ac_cv_func_setpgrp_void=yes +ac_cv_func_setrlimit=yes +ac_cv_func_setsid=yes +ac_cv_func_shm_open=yes +ac_cv_func_shm_unlink=yes +ac_cv_func_shmat=yes +ac_cv_func_shmctl=yes +ac_cv_func_shmdt=yes +ac_cv_func_shmget=yes +ac_cv_func_sigaction=yes +ac_cv_func_sigsuspend=yes +ac_cv_func_sigwait=yes +ac_cv_func_strcasecmp=yes +ac_cv_func_strdup=yes +ac_cv_func_strerror_r=yes +ac_cv_func_stricmp=no +ac_cv_func_strncasecmp=yes +ac_cv_func_strnicmp=no +ac_cv_func_strstr=yes +ac_cv_func_strtol=yes +ac_cv_func_unsetenv=yes +ac_cv_func_utime=yes +ac_cv_func_utimes=yes +ac_cv_func_waitpid=yes +ac_cv_func_writev=yes +ac_cv_gethostbyname_r_arg=char +ac_cv_gethostbyname_r_style=glibc2 +ac_cv_h_errno_cppflags=yes +ac_cv_have_decl_sys_siglist=yes +ac_cv_header_ByteOrder_h=no +ac_cv_header_alloca_h=yes +ac_cv_header_arpa_inet_h=yes +ac_cv_header_conio_h=no +ac_cv_header_crypt_h=yes +ac_cv_header_ctype_h=yes +ac_cv_header_dir_h=no +ac_cv_header_dirent_h=yes +ac_cv_header_dl_h=no +ac_cv_header_dlfcn_h=yes +ac_cv_header_errno_h=yes +ac_cv_header_fcntl_h=yes +ac_cv_header_grp_h=yes +ac_cv_header_inttypes_h=yes +ac_cv_header_io_h=no +ac_cv_header_kernel_OS_h=no +ac_cv_header_langinfo_h=yes +ac_cv_header_limits_h=yes +ac_cv_header_mach_o_dyld_h=no +ac_cv_header_malloc_h=yes +ac_cv_header_memory_h=yes +ac_cv_header_minix_config_h=no +ac_cv_header_net_errno_h=no +ac_cv_header_netdb_h=yes +ac_cv_header_netinet_in_h=yes +ac_cv_header_netinet_sctp_h=no +ac_cv_header_netinet_sctp_uio_h=no +ac_cv_header_os2_h=no +ac_cv_header_osreldate_h=no +ac_cv_header_poll_h=yes +ac_cv_header_process_h=no +ac_cv_header_pthread_h=yes +ac_cv_header_pwd_h=yes +ac_cv_header_semaphore_h=yes +ac_cv_header_signal_h=yes +ac_cv_header_stdarg_h=yes +ac_cv_header_stdc=yes +ac_cv_header_stddef_h=yes +ac_cv_header_stdint_h=yes +ac_cv_header_stdio_h=yes +ac_cv_header_stdlib_h=yes +ac_cv_header_string_h=yes +ac_cv_header_strings_h=yes +ac_cv_header_sys_file_h=yes +ac_cv_header_sys_ioctl_h=yes +ac_cv_header_sys_ipc_h=yes +ac_cv_header_sys_mman_h=yes +ac_cv_header_sys_mutex_h=no +ac_cv_header_sys_poll_h=yes +ac_cv_header_sys_resource_h=yes +ac_cv_header_sys_select_h=yes +ac_cv_header_sys_sem_h=yes +ac_cv_header_sys_sendfile_h=yes +ac_cv_header_sys_shm_h=yes +ac_cv_header_sys_signal_h=yes +ac_cv_header_sys_socket_h=yes +ac_cv_header_sys_sockio_h=no +ac_cv_header_sys_stat_h=yes +ac_cv_header_sys_sysctl_h=yes +ac_cv_header_sys_syslimits_h=no +ac_cv_header_sys_time_h=yes +ac_cv_header_sys_types_h=yes +ac_cv_header_sys_uio_h=yes +ac_cv_header_sys_un_h=yes +ac_cv_header_sys_wait_h=yes +ac_cv_header_sysapi_h=no +ac_cv_header_sysgtime_h=no +ac_cv_header_termios_h=yes +ac_cv_header_time_h=yes +ac_cv_header_tpfeq_h=no +ac_cv_header_tpfio_h=no +ac_cv_header_unistd_h=yes +ac_cv_header_unix_h=no +ac_cv_host=x86_64-unknown-linux-gnu +ac_cv_inaddr_none=yes +ac_cv_lib_c_r_gethostbyaddr=no +ac_cv_lib_c_r_gethostbyname=no +ac_cv_lib_c_r_readdir=no +ac_cv_lib_dl_dlopen=yes +ac_cv_lib_dld_shl_load=no +ac_cv_lib_nsl_gethostbyname=yes +ac_cv_lib_resolv_res_init=no +ac_cv_lib_sendfile_sendfilev=no +ac_cv_lib_socket_socket=no +ac_cv_lib_truerand_main=no +ac_cv_mkdir_p=yes +ac_cv_negative_eai=yes +ac_cv_o_nonblock_inherited=no +ac_cv_objext=o +ac_cv_path_EGREP='/bin/grep -E' +ac_cv_path_GREP=/bin/grep +ac_cv_path_install='/usr/bin/install -c' +ac_cv_prog_AS=as +ac_cv_prog_ASCPP=cpp +ac_cv_prog_AWK=gawk +ac_cv_prog_CPP='gcc -E' +ac_cv_prog_CXXCPP='g++ -E' +ac_cv_prog_RM=rm +ac_cv_prog_ac_ct_AR=ar +ac_cv_prog_ac_ct_CC=gcc +ac_cv_prog_ac_ct_CXX=g++ +ac_cv_prog_ac_ct_RANLIB=ranlib +ac_cv_prog_ac_ct_STRIP=strip +ac_cv_prog_cc_c89= +ac_cv_prog_cc_g=yes +ac_cv_prog_cxx_g=yes +ac_cv_prog_f77_g=no +ac_cv_prog_make_make_set=yes +ac_cv_pthread_attr_getdetachstate_one_arg=no +ac_cv_pthread_getspecific_two_args=no +ac_cv_retransretry=yes +ac_cv_safe_to_define___extensions__=yes +ac_cv_search_crypt=-lcrypt +ac_cv_search_gai_strerror='none required' +ac_cv_search_getaddrinfo='none required' +ac_cv_search_gethostname='none required' +ac_cv_search_getnameinfo='none required' +ac_cv_search_modf='none required' +ac_cv_search_shm_open=-lrt +ac_cv_search_sqrt=-lm +ac_cv_search_strerror='none required' +ac_cv_sigwait_one_arg=no +ac_cv_sizeof_char=1 +ac_cv_sizeof_int=4 +ac_cv_sizeof_long=8 +ac_cv_sizeof_long_double=16 +ac_cv_sizeof_long_long=8 +ac_cv_sizeof_off_t=8 +ac_cv_sizeof_pid_t=4 +ac_cv_sizeof_short=2 +ac_cv_sizeof_size_t=8 +ac_cv_sizeof_ssize_t=8 +ac_cv_sizeof_voidp=8 +ac_cv_socklen_t=yes +ac_cv_strerror_r_rc_int=no +ac_cv_struct_rlimit=yes +ac_cv_struct_tm_gmtoff=yes +ac_cv_target=x86_64-unknown-linux-gnu +ac_cv_tcp_nodelay_inherited=yes +ac_cv_type_off_t=yes +ac_cv_type_pid_t=yes +ac_cv_type_size_t=yes +ac_cv_type_ssize_t=yes +ac_cv_type_uid_t=yes +ac_cv_working_getaddrinfo=yes +ac_cv_working_getnameinfo=yes +apr_cv_define_INT64_C=yes +apr_cv_dirent_inode=d_fileno +apr_cv_dirent_type=d_type +apr_cv_func_fstat64=yes +apr_cv_hdr_netinet_tcp_h=yes +apr_cv_mutex_recursive=yes +apr_cv_mutex_robust_shared=yes +apr_cv_process_shared_works=yes +apr_cv_pthreads_cflags=-pthread +apr_cv_pthreads_lib=-lpthread +apr_cv_sctp=no +apr_cv_type_rwlock_t=yes +apr_cv_typematch_ino_t_unsigned_int=no +apr_cv_typematch_ino_t_unsigned_long=yes +apr_cv_typematch_ino_t_unsigned_long_long=no +lt_cv_deplibs_check_method=pass_all +lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_ld_reload_flag=-r +lt_cv_objdir=.libs +lt_cv_path_LD=/usr/bin/ld +lt_cv_path_LDCXX='/usr/bin/ld -m elf_x86_64' +lt_cv_path_NM='/usr/bin/nm -B' +lt_cv_path_SED=/bin/sed +lt_cv_prog_compiler_c_o=yes +lt_cv_prog_compiler_c_o_CXX=yes +lt_cv_prog_compiler_pic_works=yes +lt_cv_prog_compiler_pic_works_CXX=yes +lt_cv_prog_compiler_rtti_exceptions=no +lt_cv_prog_compiler_static_works=yes +lt_cv_prog_compiler_static_works_CXX=yes +lt_cv_prog_gnu_ld=yes +lt_cv_prog_gnu_ldcxx=yes +lt_cv_sys_global_symbol_pipe='sed -n -e '\''s/^.*[ ]\([ABCDGIRSTW][ABCDGIRSTW]*\)[ ][ ]*\([_A-Za-z][_A-Za-z0-9]*\)$/\1 \2 \2/p'\''' +lt_cv_sys_global_symbol_to_c_name_address='sed -n -e '\''s/^: \([^ ]*\) $/ {\"\1\", (lt_ptr) 0},/p'\'' -e '\''s/^[BCDEGRST] \([^ ]*\) \([^ ]*\)$/ {"\2", (lt_ptr) \&\2},/p'\''' +lt_cv_sys_global_symbol_to_cdecl='sed -n -e '\''s/^. .* \(.*\)$/extern int \1;/p'\''' +lt_cv_sys_lib_dlsearch_path_spec='/usr/lib64 /lib64 /usr/lib/x86_64-linux-gnu/libfakeroot /usr/local/lib /lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu ' +lt_cv_sys_lib_search_path_spec='/usr/lib64 /lib64 /usr/local/lib64' +lt_cv_sys_max_cmd_len=1572864 +lt_lt_cv_prog_compiler_c_o='"yes"' +lt_lt_cv_prog_compiler_c_o_CXX='"yes"' +lt_lt_cv_sys_global_symbol_pipe='"sed -n -e '\''s/^.*[ ]\\([ABCDGIRSTW][ABCDGIRSTW]*\\)[ ][ ]*\\([_A-Za-z][_A-Za-z0-9]*\\)\$/\\1 \\2 \\2/p'\''"' +lt_lt_cv_sys_global_symbol_to_c_name_address='"sed -n -e '\''s/^: \\([^ ]*\\) \$/ {\\\"\\1\\\", (lt_ptr) 0},/p'\'' -e '\''s/^[BCDEGRST] \\([^ ]*\\) \\([^ ]*\\)\$/ {\"\\2\", (lt_ptr) \\&\\2},/p'\''"' +lt_lt_cv_sys_global_symbol_to_cdecl='"sed -n -e '\''s/^. .* \\(.*\\)\$/extern int \\1;/p'\''"' + +## ----------------- ## +## Output variables. ## +## ----------------- ## + +APR_CONFIG_LOCATION='source' +APR_DOTTED_VERSION='0.9.19' +APR_LIBNAME='apr-${APR_MAJOR_VERSION}' +APR_MAJOR_VERSION='0' +AR='ar' +AS='as' +ASCPP='cpp' +AWK='gawk' +CC='gcc' +CFLAGS='' +CPP='gcc -E' +CPPFLAGS='' +CXX='g++' +CXXCPP='g++ -E' +CXXFLAGS='-g -O2' +DEFAULT_OSDIR='unix' +DEFS='-DHAVE_CONFIG_H' +DSYMUTIL='' +ECHO='echo' +ECHO_C='' +ECHO_N='-n' +ECHO_T='' +EGREP='/bin/grep -E' +EXEEXT='' +EXTRA_CFLAGS='-g -O2 -pthread' +EXTRA_CPPFLAGS='-D_REENTRANT -D_GNU_SOURCE' +EXTRA_INCLUDES='' +EXTRA_LDFLAGS='' +EXTRA_LIBS='-lrt -lm -lcrypt -lnsl -lpthread -ldl' +F77='' +FFLAGS='' +GREP='/bin/grep' +INCLUDE_RULES='include /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/build/apr_rules.mk' +INSTALL_DATA='${INSTALL} -m 644' +INSTALL_PROGRAM='${INSTALL}' +INSTALL_SCRIPT='${INSTALL}' +INSTALL_SUBDIRS='none' +LDFLAGS='' +LDLIBS='' +LIBOBJS='' +LIBS='' +LIBTOOL='$(SHELL) $(apr_builddir)/libtool' +LIBTOOL_LIBS='' +LN_S='ln -s' +LTFLAGS='--silent' +LTLIBOBJS='' +LT_LDFLAGS='' +MKDEP='$(CC) -MM' +NMEDIT='' +NOTEST_CFLAGS='' +NOTEST_CPPFLAGS='' +NOTEST_INCLUDES='' +NOTEST_LDFLAGS='' +NOTEST_LIBS='' +OBJEXT='o' +OSDIR='unix' +PACKAGE_BUGREPORT='' +PACKAGE_NAME='' +PACKAGE_STRING='' +PACKAGE_TARNAME='' +PACKAGE_VERSION='' +PATH_SEPARATOR=':' +RANLIB='ranlib' +RM='rm' +SED='/bin/sed' +SET_MAKE='' +SHELL='/bin/bash' +STRIP='strip' +SUBDIRS='strings passwd tables file_io/unix network_io/unix threadproc/unix misc/unix locks/unix time/unix mmap/unix shmem/unix user/unix memory/unix atomic/unix poll/unix support/unix dso/unix ' +ac_ct_CC='gcc' +ac_ct_CXX='g++' +ac_ct_F77='' +acceptfilter='0' +apr_builddir='/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr' +apr_builders='/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/build' +apr_charset_ebcdic='0' +apr_force_atomic_generic='1' +apr_inaddr_none='INADDR_NONE' +apr_srcdir='/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr' +apr_tcp_nopush_flag='TCP_CORK' +aprdso='1' +arpa_ineth='1' +bindir='${prefix}/bin' +build='x86_64-unknown-linux-gnu' +build_alias='' +build_cpu='x86_64' +build_os='linux-gnu' +build_vendor='unknown' +conioh='0' +crypth='1' +ctypeh='1' +datadir='/bottlenecks/rubbos/app/apache2' +datarootdir='${prefix}/share' +direnth='1' +docdir='${datarootdir}/doc/${PACKAGE}' +dvidir='${docdir}' +eolstr='\n' +errnoh='1' +exec_prefix='/bottlenecks/rubbos/app/apache2' +export_lib_target='-rpath \$(libdir) \$\$objects' +fcntlh='1' +fcntlser='0' +file_as_socket='1' +flockser='0' +fork='1' +hasfcntlser='1' +hasflockser='1' +hasposixser='0' +hasprocpthreadser='1' +hasrwlockser='0' +hassysvser='1' +have_corkable_tcp='1' +have_getrlimit='1' +have_in_addr='1' +have_inet_addr='1' +have_inet_network='1' +have_int64_strfn='1' +have_ipv6='1' +have_memchr='1' +have_memmove='1' +have_sctp='0' +have_setrlimit='1' +have_sigaction='1' +have_sigsuspend='1' +have_sigwait='1' +have_strcasecmp='1' +have_strdup='1' +have_stricmp='0' +have_strncasecmp='1' +have_strnicmp='0' +have_strstr='1' +have_union_semun='0' +havebeosarea='0' +havemmapanon='1' +havemmapshm='1' +havemmaptmp='1' +havemmapzero='1' +haveos2shm='0' +haveshmget='1' +haveshmgetanon='1' +host='x86_64-unknown-linux-gnu' +host_alias='' +host_cpu='x86_64' +host_os='linux-gnu' +host_vendor='unknown' +htmldir='${docdir}' +includedir='/bottlenecks/rubbos/app/apache2/include' +infodir='${datarootdir}/info' +ino_t_value='unsigned long' +installbuilddir='${prefix}/build' +int64_literal='#define APR_INT64_C(val) INT64_C(val)' +int64_strfn='strtol' +int64_t_fmt='#define APR_INT64_T_FMT "ld"' +int64_t_fmt_len='#define APR_INT64_T_FMT_LEN 2' +int64_value='long' +int_value='int' +ioh='0' +lib_target='-rpath $(libdir) $$objects' +libdir='${prefix}/lib' +libexecdir='${exec_prefix}/modules' +limitsh='1' +link='$(LIBTOOL) $(LTFLAGS) --mode=link $(LT_LDFLAGS) $(COMPILE) -version-info 9:19:9 $(ALL_LDFLAGS) -o $@' +localedir='${datarootdir}/locale' +localstatedir='${prefix}' +long_value='long' +lt_compile='$(LIBTOOL) $(LTFLAGS) --mode=compile $(COMPILE) -c $< && touch $@' +mandir='${prefix}/man' +mmap='1' +netdbh='1' +netinet_inh='1' +netinet_sctp_uioh='0' +netinet_sctph='0' +netinet_tcph='1' +o_nonblock_inherited='0' +oc='1' +off_t_fmt='#define APR_OFF_T_FMT "ld"' +off_t_value='off_t' +oldincludedir='/usr/include' +pdfdir='${docdir}' +pid_t_fmt='#define APR_PID_T_FMT "d"' +posixser='0' +prefix='/bottlenecks/rubbos/app/apache2' +proc_mutex_is_global='0' +proclockglobal='0' +procpthreadser='0' +program_transform_name='s,x,x,' +psdir='${docdir}' +pthreadh='1' +pthreadser='1' +rand='1' +sbindir='${exec_prefix}/bin' +semaphoreh='1' +sendfile='1' +sharedmem='1' +sharedstatedir='${prefix}/com' +shlibpath_var='LD_LIBRARY_PATH' +short_value='short' +signalh='1' +size_t_fmt='#define APR_SIZE_T_FMT "ld"' +size_t_value='size_t' +so_ext='lo' +socklen_t_value='socklen_t' +ssize_t_fmt='#define APR_SSIZE_T_FMT "ld"' +ssize_t_value='ssize_t' +stdargh='1' +stdint='1' +stdioh='1' +stdlibh='1' +stringh='1' +stringsh='1' +struct_rlimit='1' +sys_ioctlh='1' +sys_sendfileh='1' +sys_signalh='1' +sys_socketh='1' +sys_sockioh='0' +sys_syslimitsh='0' +sys_timeh='1' +sys_typesh='1' +sys_uioh='1' +sys_unh='1' +sys_waith='1' +sysconfdir='${prefix}/conf' +sysvser='1' +target='x86_64-unknown-linux-gnu' +target_alias='' +target_cpu='x86_64' +target_os='linux-gnu' +target_vendor='unknown' +tcp_nodelay_inherited='1' +threads='1' +timeh='1' +top_builddir='/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr' +uint64_t_fmt='#define APR_UINT64_T_FMT "lu"' +uint64_t_fmt_len='#define APR_UINT64_T_FMT_LEN 2' +uint64_t_hex_fmt='#define APR_UINT64_T_HEX_FMT "lx"' +unistdh='1' +usebeosarea='0' +usemmapanon='1' +usemmapshm='0' +usemmaptmp='0' +usemmapzero='0' +useos2shm='0' +useshmget='1' +useshmgetanon='0' +voidp_size='8' + +## ----------- ## +## confdefs.h. ## +## ----------- ## + +#define PACKAGE_NAME "" +#define PACKAGE_TARNAME "" +#define PACKAGE_VERSION "" +#define PACKAGE_STRING "" +#define PACKAGE_BUGREPORT "" +#define STDC_HEADERS 1 +#define HAVE_SYS_TYPES_H 1 +#define HAVE_SYS_STAT_H 1 +#define HAVE_STDLIB_H 1 +#define HAVE_STRING_H 1 +#define HAVE_MEMORY_H 1 +#define HAVE_STRINGS_H 1 +#define HAVE_INTTYPES_H 1 +#define HAVE_STDINT_H 1 +#define HAVE_UNISTD_H 1 +#define __EXTENSIONS__ 1 +#define _ALL_SOURCE 1 +#define _GNU_SOURCE 1 +#define _POSIX_PTHREAD_SEMANTICS 1 +#define _TANDEM_SOURCE 1 +#define HAVE_DLFCN_H 1 +#define HAVE_LIBNSL 1 +#define HAVE_PTHREAD_H 1 +#define HAVE_PTHREAD_H 1 +#define USE_THREADS 1 +#define HAVE_PTHREAD_KEY_DELETE 1 +#define HAVE_PTHREAD_RWLOCK_INIT 1 +#define HAVE_PTHREAD_RWLOCKS 1 +#define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +#define HAVE_GETHOSTBYNAME_R 1 +#define HAVE_GETHOSTBYADDR_R 1 +#define HAVE_SIGSUSPEND 1 +#define HAVE_SIGWAIT 1 +#define HAVE_POLL 1 +#define HAVE_GETPWNAM_R 1 +#define HAVE_GETPWUID_R 1 +#define HAVE_GETGRNAM_R 1 +#define HAVE_GETGRGID_R 1 +#define HAVE_SYS_MMAN_H 1 +#define HAVE_SYS_IPC_H 1 +#define HAVE_SYS_SHM_H 1 +#define HAVE_SYS_FILE_H 1 +#define HAVE_MMAP 1 +#define HAVE_MUNMAP 1 +#define HAVE_SHM_OPEN 1 +#define HAVE_SHM_UNLINK 1 +#define HAVE_SHMGET 1 +#define HAVE_SHMAT 1 +#define HAVE_SHMDT 1 +#define HAVE_SHMCTL 1 +#define HAVE_MAP_ANON 1 +#define anonymous shared memory allocation method 1 +#define USE_SHMEM_MMAP_ANON 1 +#define namebased memory allocation method 1 +#define USE_SHMEM_SHMGET 1 +#define HAVE_CALLOC 1 +#define HAVE_STRCASECMP 1 +#define HAVE_SETSID 1 +#define HAVE_ISINF 1 +#define HAVE_ISNAN 1 +#define HAVE_GETENV 1 +#define HAVE_PUTENV 1 +#define HAVE_SETENV 1 +#define HAVE_UNSETENV 1 +#define HAVE_SETRLIMIT 1 +#define HAVE_GETRLIMIT 1 +#define HAVE_WRITEV 1 +#define HAVE_SENDFILE 1 +#define HAVE_UTIME 1 +#define HAVE_UTIMES 1 +#define HAVE_SIGACTION 1 +#define HAVE_DECL_SYS_SIGLIST 1 +#define HAVE_FORK 1 +#define HAVE_STRERROR_R 1 +#define HAVE_CRYPT_R 1 +#define CRYPT_R_STRUCT_CRYPT_DATA 1 +#define HAVE_MMAP 1 +#define HAVE_MEMMOVE 1 +#define HAVE_GETPASS 1 +#define HAVE_GMTIME_R 1 +#define HAVE_LOCALTIME_R 1 +#define HAVE_HSTRERROR 1 +#define HAVE_MKSTEMP 1 +#define DIRENT_INODE d_fileno +#define DIRENT_TYPE d_type +#define STDC_HEADERS 1 +#define HAVE_ALLOCA_H 1 +#define HAVE_CRYPT_H 1 +#define HAVE_CTYPE_H 1 +#define HAVE_DIRENT_H 1 +#define HAVE_DLFCN_H 1 +#define HAVE_ERRNO_H 1 +#define HAVE_FCNTL_H 1 +#define HAVE_GRP_H 1 +#define HAVE_LIMITS_H 1 +#define HAVE_MALLOC_H 1 +#define HAVE_MEMORY_H 1 +#define HAVE_NETDB_H 1 +#define HAVE_POLL_H 1 +#define HAVE_PWD_H 1 +#define HAVE_SEMAPHORE_H 1 +#define HAVE_SIGNAL_H 1 +#define HAVE_STDARG_H 1 +#define HAVE_STDDEF_H 1 +#define HAVE_STDIO_H 1 +#define HAVE_STDLIB_H 1 +#define HAVE_STRING_H 1 +#define HAVE_STRINGS_H 1 +#define HAVE_TERMIOS_H 1 +#define HAVE_TIME_H 1 +#define HAVE_UNISTD_H 1 +#define HAVE_ARPA_INET_H 1 +#define HAVE_NETINET_IN_H 1 +#define HAVE_SYS_FILE_H 1 +#define HAVE_SYS_IOCTL_H 1 +#define HAVE_SYS_MMAN_H 1 +#define HAVE_SYS_POLL_H 1 +#define HAVE_SYS_RESOURCE_H 1 +#define HAVE_SYS_SELECT_H 1 +#define HAVE_SYS_SEM_H 1 +#define HAVE_SYS_SENDFILE_H 1 +#define HAVE_SYS_SIGNAL_H 1 +#define HAVE_SYS_SOCKET_H 1 +#define HAVE_SYS_STAT_H 1 +#define HAVE_SYS_SYSCTL_H 1 +#define HAVE_SYS_TIME_H 1 +#define HAVE_SYS_TYPES_H 1 +#define HAVE_SYS_UIO_H 1 +#define HAVE_SYS_UN_H 1 +#define HAVE_SYS_WAIT_H 1 +#define HAVE_NETINET_TCP_H 1 +#define SETPGRP_VOID 1 +#define HAVE_SOCKLEN_T 1 +#define SIZEOF_VOIDP 8 +#define SIZEOF_CHAR 1 +#define SIZEOF_INT 4 +#define SIZEOF_LONG 8 +#define SIZEOF_SHORT 2 +#define SIZEOF_LONG_DOUBLE 16 +#define SIZEOF_LONG_LONG 8 +#define SIZEOF_SSIZE_T 8 +#define SIZEOF_SIZE_T 8 +#define SIZEOF_OFF_T 8 +#define SIZEOF_PID_T 4 +#define HAVE_STRNCASECMP 1 +#define HAVE_STRCASECMP 1 +#define HAVE_STRDUP 1 +#define HAVE_STRSTR 1 +#define HAVE_MEMCHR 1 +#define HAVE_STRTOL 1 +#define HAVE_DLSYM 1 +#define DSO_USE_DLFCN 1 +#define HAVE_WAITPID 1 +#define HAVE_VLA 1 +#define HAVE_SEMGET 1 +#define HAVE_SEMCTL 1 +#define HAVE_FLOCK 1 +#define HAVE_SEMAPHORE_H 1 +#define HAVE_SEM_CLOSE 1 +#define HAVE_SEM_UNLINK 1 +#define HAVE_SEM_POST 1 +#define HAVE_SEM_WAIT 1 +#define HAVE_LOCK_EX 1 +#define HAVE_F_SETLK 1 +#define HAVE_SEM_UNDO 1 +#define HAVE_POLLIN 1 +#define HAVE_PTHREAD_PROCESS_SHARED 1 +#define HAVE_PTHREAD_MUTEXATTR_SETPSHARED 1 +#define HAVE_PTHREAD_MUTEX_ROBUST 1 +#define apr_lock implementation method 1 +#define USE_SYSVSEM_SERIALIZE 1 +#define DEV_RANDOM "/dev/random" +#define HAVE_GMTOFF 1 +#define GETHOSTBYNAME_R_GLIBC2 1 +#define HAVE_TCP_CORK 1 +#define RESOLV_RETRANSRETRY 1 +#define HAVE_GAI_STRERROR 1 +#define HAVE_GETADDRINFO 1 +#define NEGATIVE_EAI 1 +#define HAVE_GETNAMEINFO 1 +#define HAVE_LANGINFO_H 1 +#define HAVE_NL_LANGINFO 1 +#define HAVE_FSTAT64 1 + +configure: exit 0 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/config.nice b/rubbos/app/httpd-2.0.64/srclib/apr/config.nice new file mode 100755 index 00000000..0f57ab55 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/config.nice @@ -0,0 +1,19 @@ +#! /bin/sh +# +# Created by configure + +"/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/configure" \ +"--disable-option-checking" \ +"--enable-module=so" \ +"--enable-so" \ +"--with-mpm=worker" \ +"--cache-file=/dev/null" \ +"--srcdir=/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr" \ +"--prefix=/bottlenecks/rubbos/app/apache2" \ +"--exec-prefix=/bottlenecks/rubbos/app/apache2" \ +"--libdir=/bottlenecks/rubbos/app/apache2/lib" \ +"--includedir=/bottlenecks/rubbos/app/apache2/include" \ +"--bindir=/bottlenecks/rubbos/app/apache2/bin" \ +"--datadir=/bottlenecks/rubbos/app/apache2" \ +"--with-installbuilddir=/bottlenecks/rubbos/app/apache2/build" \ +"$@" diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/config.status b/rubbos/app/httpd-2.0.64/srclib/apr/config.status new file mode 100755 index 00000000..e5a5a822 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/config.status @@ -0,0 +1,1357 @@ +#! /bin/bash +# Generated by configure. +# 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-/bin/bash} +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be more Bourne compatible +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 + + + + +# PATH needs CR +# 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_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +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 + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + 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 + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + { (exit 1); exit 1; } +fi + +# Work around bugs in pre-3.0 UWIN ksh. +for as_var in ENV MAIL MAILPATH +do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# Required to use basename. +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 + + +# Name of the executable. +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# CDPATH. +$as_unset CDPATH + + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line after each line using $LINENO; the second 'sed' + # does the real work. The second script uses 'N' to pair each + # line-number line with the line containing $LINENO, and appends + # trailing '-' during substitution so that $LINENO is not a special + # case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # scripts with optimization help from Paolo Bonzini. Blame Lee + # E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + 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" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); exit 1; }; } + + # 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 +} + + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in +-n*) + case `echo 'x\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + *) ECHO_C='\c';; + esac;; +*) + ECHO_N='-n';; +esac +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +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 -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +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=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&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.63. 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` +" + +# Files that config.status was made for. +config_files=" Makefile strings/Makefile passwd/Makefile tables/Makefile build/Makefile file_io/unix/Makefile network_io/unix/Makefile threadproc/unix/Makefile misc/unix/Makefile locks/unix/Makefile time/unix/Makefile mmap/unix/Makefile shmem/unix/Makefile user/unix/Makefile memory/unix/Makefile atomic/unix/Makefile poll/unix/Makefile support/unix/Makefile dso/unix/Makefile test/Makefile test/internal/Makefile include/apr.h build/apr_rules.mk build/pkg/pkginfo apr-config" +config_headers=" include/arch/unix/apr_private.h" +config_commands=" default" + +ac_cs_usage="\ +\`$as_me' instantiates files from templates according to the +current configuration. + +Usage: $0 [OPTION]... [FILE]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, 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 ." + +ac_cs_version="\ +config.status +configured by /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/configure, generated by GNU Autoconf 2.63, + with options \"'--disable-option-checking' '--enable-module=so' '--enable-so' '--with-mpm=worker' '--cache-file=/dev/null' '--srcdir=/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr' '--prefix=/bottlenecks/rubbos/app/apache2' '--exec-prefix=/bottlenecks/rubbos/app/apache2' '--libdir=\${prefix}/lib' '--includedir=/bottlenecks/rubbos/app/apache2/include' '--bindir=\${prefix}/bin' '--datadir=/bottlenecks/rubbos/app/apache2' '--with-installbuilddir=\${prefix}/build'\" + +Copyright (C) 2008 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='/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr' +srcdir='.' +INSTALL='/usr/bin/install -c' +AWK='gawk' +test -n "$AWK" || AWK=awk +# 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=$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 ) + $as_echo "$ac_cs_version"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + CONFIG_FILES="$CONFIG_FILES '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + CONFIG_HEADERS="$CONFIG_HEADERS '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + { $as_echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; };; + --help | --hel | -h ) + $as_echo "$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_echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } ;; + + *) ac_config_targets="$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 + +if $ac_cs_recheck; then + set X '/bin/bash' '/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/configure' '--disable-option-checking' '--enable-module=so' '--enable-so' '--with-mpm=worker' '--cache-file=/dev/null' '--srcdir=/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr' '--prefix=/bottlenecks/rubbos/app/apache2' '--exec-prefix=/bottlenecks/rubbos/app/apache2' '--libdir=${prefix}/lib' '--includedir=/bottlenecks/rubbos/app/apache2/include' '--bindir=${prefix}/bin' '--datadir=/bottlenecks/rubbos/app/apache2' '--with-installbuilddir=${prefix}/build' $ac_configure_extra_args --no-create --no-recursion + shift + $as_echo "running CONFIG_SHELL=/bin/bash $*" >&6 + CONFIG_SHELL='/bin/bash' + export CONFIG_SHELL + exec "$@" +fi + +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "include/arch/unix/apr_private.h") CONFIG_HEADERS="$CONFIG_HEADERS include/arch/unix/apr_private.h" ;; + "$MAKEFILE1") CONFIG_FILES="$CONFIG_FILES $MAKEFILE1" ;; + "$MAKEFILE2") CONFIG_FILES="$CONFIG_FILES $MAKEFILE2" ;; + "$MAKEFILE3") CONFIG_FILES="$CONFIG_FILES $MAKEFILE3" ;; + "include/apr.h") CONFIG_FILES="$CONFIG_FILES include/apr.h" ;; + "build/apr_rules.mk") CONFIG_FILES="$CONFIG_FILES build/apr_rules.mk" ;; + "build/pkg/pkginfo") CONFIG_FILES="$CONFIG_FILES build/pkg/pkginfo" ;; + "apr-config") CONFIG_FILES="$CONFIG_FILES apr-config" ;; + "default") CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;; + + *) { { $as_echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 +$as_echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; + 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+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || 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= + trap 'exit_status=$? + { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status +' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || +{ + $as_echo "$as_me: cannot create a temporary directory in ." >&2 + { (exit 1); exit 1; } +} + +# 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=' ' +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 {' >"$tmp/subs1.awk" && +cat >>"$tmp/subs1.awk" <<\_ACAWK && +S["LTLIBOBJS"]="" +S["LIBOBJS"]="" +S["INCLUDE_RULES"]="include /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/build/apr_rules.mk" +S["SUBDIRS"]="strings passwd tables file_io/unix network_io/unix threadproc/unix misc/unix locks/unix time/unix mmap/unix shmem/unix user/unix memory/un"\ +"ix atomic/unix poll/unix support/unix dso/unix " +S["LIBTOOL_LIBS"]="" +S["DEFAULT_OSDIR"]="unix" +S["OSDIR"]="unix" +S["LDLIBS"]="" +S["NOTEST_INCLUDES"]="" +S["NOTEST_LIBS"]="" +S["NOTEST_LDFLAGS"]="" +S["NOTEST_CFLAGS"]="" +S["NOTEST_CPPFLAGS"]="" +S["EXTRA_INCLUDES"]="" +S["EXTRA_LIBS"]="-lrt -lm -lcrypt -lnsl -lpthread -ldl" +S["EXTRA_LDFLAGS"]="" +S["EXTRA_CFLAGS"]="-g -O2 -pthread" +S["EXTRA_CPPFLAGS"]="-D_REENTRANT -D_GNU_SOURCE" +S["have_ipv6"]="1" +S["have_sctp"]="0" +S["acceptfilter"]="0" +S["have_corkable_tcp"]="1" +S["apr_tcp_nopush_flag"]="TCP_CORK" +S["file_as_socket"]="1" +S["have_in_addr"]="1" +S["rand"]="1" +S["proclockglobal"]="0" +S["pthreadser"]="1" +S["procpthreadser"]="0" +S["fcntlser"]="0" +S["posixser"]="0" +S["sysvser"]="1" +S["flockser"]="0" +S["hasrwlockser"]="0" +S["hasprocpthreadser"]="1" +S["hasfcntlser"]="1" +S["hasposixser"]="0" +S["hassysvser"]="1" +S["hasflockser"]="1" +S["have_union_semun"]="0" +S["struct_rlimit"]="1" +S["oc"]="1" +S["aprdso"]="1" +S["int64_strfn"]="strtol" +S["have_int64_strfn"]="1" +S["have_memchr"]="1" +S["have_strstr"]="1" +S["have_strdup"]="1" +S["have_strcasecmp"]="1" +S["have_stricmp"]="0" +S["have_strncasecmp"]="1" +S["have_strnicmp"]="0" +S["ino_t_value"]="unsigned long" +S["stdint"]="1" +S["int64_literal"]="#define APR_INT64_C(val) INT64_C(val)" +S["pid_t_fmt"]="#define APR_PID_T_FMT \"d\"" +S["off_t_fmt"]="#define APR_OFF_T_FMT \"ld\"" +S["size_t_fmt"]="#define APR_SIZE_T_FMT \"ld\"" +S["ssize_t_fmt"]="#define APR_SSIZE_T_FMT \"ld\"" +S["uint64_t_hex_fmt"]="#define APR_UINT64_T_HEX_FMT \"lx\"" +S["uint64_t_fmt_len"]="#define APR_UINT64_T_FMT_LEN 2" +S["uint64_t_fmt"]="#define APR_UINT64_T_FMT \"lu\"" +S["int64_t_fmt_len"]="#define APR_INT64_T_FMT_LEN 2" +S["int64_t_fmt"]="#define APR_INT64_T_FMT \"ld\"" +S["socklen_t_value"]="socklen_t" +S["ssize_t_value"]="ssize_t" +S["size_t_value"]="size_t" +S["off_t_value"]="off_t" +S["int64_value"]="long" +S["long_value"]="long" +S["int_value"]="int" +S["short_value"]="short" +S["voidp_size"]="8" +S["semaphoreh"]="1" +S["pthreadh"]="1" +S["sys_waith"]="1" +S["signalh"]="1" +S["unistdh"]="1" +S["timeh"]="1" +S["sys_unh"]="1" +S["sys_uioh"]="1" +S["sys_timeh"]="1" +S["sys_typesh"]="1" +S["sys_sockioh"]="0" +S["sys_socketh"]="1" +S["sys_signalh"]="1" +S["sys_sendfileh"]="1" +S["sys_ioctlh"]="1" +S["stringsh"]="1" +S["stringh"]="1" +S["stdlibh"]="1" +S["stdioh"]="1" +S["stdargh"]="1" +S["netinet_tcph"]="1" +S["netinet_sctp_uioh"]="0" +S["netinet_sctph"]="0" +S["netinet_inh"]="1" +S["sys_syslimitsh"]="0" +S["netdbh"]="1" +S["limitsh"]="1" +S["ioh"]="0" +S["fcntlh"]="1" +S["direnth"]="1" +S["errnoh"]="1" +S["crypth"]="1" +S["ctypeh"]="1" +S["conioh"]="0" +S["arpa_ineth"]="1" +S["have_memmove"]="1" +S["mmap"]="1" +S["have_getrlimit"]="1" +S["have_setrlimit"]="1" +S["have_sigaction"]="1" +S["have_inet_network"]="1" +S["o_nonblock_inherited"]="0" +S["tcp_nodelay_inherited"]="1" +S["have_inet_addr"]="1" +S["fork"]="1" +S["apr_inaddr_none"]="INADDR_NONE" +S["sendfile"]="1" +S["sharedmem"]="1" +S["haveos2shm"]="0" +S["havebeosarea"]="0" +S["haveshmget"]="1" +S["havemmapshm"]="1" +S["havemmaptmp"]="1" +S["useos2shm"]="0" +S["usebeosarea"]="0" +S["useshmget"]="1" +S["usemmapshm"]="0" +S["usemmaptmp"]="0" +S["havemmapanon"]="1" +S["havemmapzero"]="1" +S["haveshmgetanon"]="1" +S["usemmapanon"]="1" +S["usemmapzero"]="0" +S["useshmgetanon"]="0" +S["have_sigwait"]="1" +S["have_sigsuspend"]="1" +S["threads"]="1" +S["INSTALL_SUBDIRS"]="none" +S["eolstr"]="\\n" +S["proc_mutex_is_global"]="0" +S["apr_force_atomic_generic"]="1" +S["MKDEP"]="$(CC) -MM" +S["LT_LDFLAGS"]="" +S["LTFLAGS"]="--silent" +S["shlibpath_var"]="LD_LIBRARY_PATH" +S["export_lib_target"]="-rpath \\$(libdir) \\$\\$objects" +S["lib_target"]="-rpath $(libdir) $$objects" +S["so_ext"]="lo" +S["link"]="$(LIBTOOL) $(LTFLAGS) --mode=link $(LT_LDFLAGS) $(COMPILE) -version-info 9:19:9 $(ALL_LDFLAGS) -o $@" +S["lt_compile"]="$(LIBTOOL) $(LTFLAGS) --mode=compile $(COMPILE) -c $< && touch $@" +S["installbuilddir"]="${prefix}/build" +S["LIBTOOL"]="$(SHELL) $(apr_builddir)/libtool" +S["ac_ct_F77"]="" +S["FFLAGS"]="" +S["F77"]="" +S["CXXCPP"]="g++ -E" +S["ac_ct_CXX"]="g++" +S["CXXFLAGS"]="-g -O2" +S["CXX"]="g++" +S["NMEDIT"]="" +S["DSYMUTIL"]="" +S["STRIP"]="strip" +S["ECHO"]="echo" +S["SED"]="/bin/sed" +S["APR_LIBNAME"]="apr-${APR_MAJOR_VERSION}" +S["apr_charset_ebcdic"]="0" +S["EGREP"]="/bin/grep -E" +S["GREP"]="/bin/grep" +S["AR"]="ar" +S["ASCPP"]="cpp" +S["AS"]="as" +S["RM"]="rm" +S["INSTALL_DATA"]="${INSTALL} -m 644" +S["INSTALL_SCRIPT"]="${INSTALL}" +S["INSTALL_PROGRAM"]="${INSTALL}" +S["RANLIB"]="ranlib" +S["LN_S"]="ln -s" +S["AWK"]="gawk" +S["CPP"]="gcc -E" +S["SET_MAKE"]="" +S["OBJEXT"]="o" +S["EXEEXT"]="" +S["ac_ct_CC"]="gcc" +S["CPPFLAGS"]="" +S["LDFLAGS"]="" +S["CFLAGS"]="" +S["CC"]="gcc" +S["APR_MAJOR_VERSION"]="0" +S["APR_DOTTED_VERSION"]="0.9.19" +S["apr_builders"]="/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/build" +S["top_builddir"]="/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr" +S["APR_CONFIG_LOCATION"]="source" +S["apr_builddir"]="/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr" +S["apr_srcdir"]="/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr" +S["target_os"]="linux-gnu" +S["target_vendor"]="unknown" +S["target_cpu"]="x86_64" +S["target"]="x86_64-unknown-linux-gnu" +S["host_os"]="linux-gnu" +S["host_vendor"]="unknown" +S["host_cpu"]="x86_64" +S["host"]="x86_64-unknown-linux-gnu" +S["build_os"]="linux-gnu" +S["build_vendor"]="unknown" +S["build_cpu"]="x86_64" +S["build"]="x86_64-unknown-linux-gnu" +S["target_alias"]="" +S["host_alias"]="" +S["build_alias"]="" +S["LIBS"]="" +S["ECHO_T"]="" +S["ECHO_N"]="-n" +S["ECHO_C"]="" +S["DEFS"]="-DHAVE_CONFIG_H" +S["mandir"]="${prefix}/man" +S["localedir"]="${datarootdir}/locale" +S["libdir"]="${prefix}/lib" +S["psdir"]="${docdir}" +S["pdfdir"]="${docdir}" +S["dvidir"]="${docdir}" +S["htmldir"]="${docdir}" +S["infodir"]="${datarootdir}/info" +S["docdir"]="${datarootdir}/doc/${PACKAGE}" +S["oldincludedir"]="/usr/include" +S["includedir"]="/bottlenecks/rubbos/app/apache2/include" +S["localstatedir"]="${prefix}" +S["sharedstatedir"]="${prefix}/com" +S["sysconfdir"]="${prefix}/conf" +S["datadir"]="/bottlenecks/rubbos/app/apache2" +S["datarootdir"]="${prefix}/share" +S["libexecdir"]="${exec_prefix}/modules" +S["sbindir"]="${exec_prefix}/bin" +S["bindir"]="${prefix}/bin" +S["program_transform_name"]="s,x,x," +S["prefix"]="/bottlenecks/rubbos/app/apache2" +S["exec_prefix"]="/bottlenecks/rubbos/app/apache2" +S["PACKAGE_BUGREPORT"]="" +S["PACKAGE_STRING"]="" +S["PACKAGE_VERSION"]="" +S["PACKAGE_TARNAME"]="" +S["PACKAGE_NAME"]="" +S["PATH_SEPARATOR"]=":" +S["SHELL"]="/bin/bash" +_ACAWK +cat >>"$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 +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 < "$tmp/subs1.awk" > "$tmp/subs.awk" \ + || { { $as_echo "$as_me:$LINENO: error: could not setup config files machinery" >&5 +$as_echo "$as_me: error: could not setup config files machinery" >&2;} + { (exit 1); exit 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 >"$tmp/defines.awk" <<\_ACAWK || +BEGIN { +D["PACKAGE_NAME"]=" \"\"" +D["PACKAGE_TARNAME"]=" \"\"" +D["PACKAGE_VERSION"]=" \"\"" +D["PACKAGE_STRING"]=" \"\"" +D["PACKAGE_BUGREPORT"]=" \"\"" +D["STDC_HEADERS"]=" 1" +D["HAVE_SYS_TYPES_H"]=" 1" +D["HAVE_SYS_STAT_H"]=" 1" +D["HAVE_STDLIB_H"]=" 1" +D["HAVE_STRING_H"]=" 1" +D["HAVE_MEMORY_H"]=" 1" +D["HAVE_STRINGS_H"]=" 1" +D["HAVE_INTTYPES_H"]=" 1" +D["HAVE_STDINT_H"]=" 1" +D["HAVE_UNISTD_H"]=" 1" +D["__EXTENSIONS__"]=" 1" +D["_ALL_SOURCE"]=" 1" +D["_GNU_SOURCE"]=" 1" +D["_POSIX_PTHREAD_SEMANTICS"]=" 1" +D["_TANDEM_SOURCE"]=" 1" +D["HAVE_DLFCN_H"]=" 1" +D["HAVE_LIBNSL"]=" 1" +D["HAVE_PTHREAD_H"]=" 1" +D["HAVE_PTHREAD_H"]=" 1" +D["USE_THREADS"]=" 1" +D["HAVE_PTHREAD_KEY_DELETE"]=" 1" +D["HAVE_PTHREAD_RWLOCK_INIT"]=" 1" +D["HAVE_PTHREAD_RWLOCKS"]=" 1" +D["HAVE_PTHREAD_MUTEX_RECURSIVE"]=" 1" +D["HAVE_GETHOSTBYNAME_R"]=" 1" +D["HAVE_GETHOSTBYADDR_R"]=" 1" +D["HAVE_SIGSUSPEND"]=" 1" +D["HAVE_SIGWAIT"]=" 1" +D["HAVE_POLL"]=" 1" +D["HAVE_GETPWNAM_R"]=" 1" +D["HAVE_GETPWUID_R"]=" 1" +D["HAVE_GETGRNAM_R"]=" 1" +D["HAVE_GETGRGID_R"]=" 1" +D["HAVE_SYS_MMAN_H"]=" 1" +D["HAVE_SYS_IPC_H"]=" 1" +D["HAVE_SYS_SHM_H"]=" 1" +D["HAVE_SYS_FILE_H"]=" 1" +D["HAVE_MMAP"]=" 1" +D["HAVE_MUNMAP"]=" 1" +D["HAVE_SHM_OPEN"]=" 1" +D["HAVE_SHM_UNLINK"]=" 1" +D["HAVE_SHMGET"]=" 1" +D["HAVE_SHMAT"]=" 1" +D["HAVE_SHMDT"]=" 1" +D["HAVE_SHMCTL"]=" 1" +D["HAVE_MAP_ANON"]=" 1" +D["anonymous"]=" shared memory allocation method 1" +D["USE_SHMEM_MMAP_ANON"]=" 1" +D["namebased"]=" memory allocation method 1" +D["USE_SHMEM_SHMGET"]=" 1" +D["HAVE_CALLOC"]=" 1" +D["HAVE_STRCASECMP"]=" 1" +D["HAVE_SETSID"]=" 1" +D["HAVE_ISINF"]=" 1" +D["HAVE_ISNAN"]=" 1" +D["HAVE_GETENV"]=" 1" +D["HAVE_PUTENV"]=" 1" +D["HAVE_SETENV"]=" 1" +D["HAVE_UNSETENV"]=" 1" +D["HAVE_SETRLIMIT"]=" 1" +D["HAVE_GETRLIMIT"]=" 1" +D["HAVE_WRITEV"]=" 1" +D["HAVE_SENDFILE"]=" 1" +D["HAVE_UTIME"]=" 1" +D["HAVE_UTIMES"]=" 1" +D["HAVE_SIGACTION"]=" 1" +D["HAVE_DECL_SYS_SIGLIST"]=" 1" +D["HAVE_FORK"]=" 1" +D["HAVE_STRERROR_R"]=" 1" +D["HAVE_CRYPT_R"]=" 1" +D["CRYPT_R_STRUCT_CRYPT_DATA"]=" 1" +D["HAVE_MMAP"]=" 1" +D["HAVE_MEMMOVE"]=" 1" +D["HAVE_GETPASS"]=" 1" +D["HAVE_GMTIME_R"]=" 1" +D["HAVE_LOCALTIME_R"]=" 1" +D["HAVE_HSTRERROR"]=" 1" +D["HAVE_MKSTEMP"]=" 1" +D["DIRENT_INODE"]=" d_fileno" +D["DIRENT_TYPE"]=" d_type" +D["STDC_HEADERS"]=" 1" +D["HAVE_ALLOCA_H"]=" 1" +D["HAVE_CRYPT_H"]=" 1" +D["HAVE_CTYPE_H"]=" 1" +D["HAVE_DIRENT_H"]=" 1" +D["HAVE_DLFCN_H"]=" 1" +D["HAVE_ERRNO_H"]=" 1" +D["HAVE_FCNTL_H"]=" 1" +D["HAVE_GRP_H"]=" 1" +D["HAVE_LIMITS_H"]=" 1" +D["HAVE_MALLOC_H"]=" 1" +D["HAVE_MEMORY_H"]=" 1" +D["HAVE_NETDB_H"]=" 1" +D["HAVE_POLL_H"]=" 1" +D["HAVE_PWD_H"]=" 1" +D["HAVE_SEMAPHORE_H"]=" 1" +D["HAVE_SIGNAL_H"]=" 1" +D["HAVE_STDARG_H"]=" 1" +D["HAVE_STDDEF_H"]=" 1" +D["HAVE_STDIO_H"]=" 1" +D["HAVE_STDLIB_H"]=" 1" +D["HAVE_STRING_H"]=" 1" +D["HAVE_STRINGS_H"]=" 1" +D["HAVE_TERMIOS_H"]=" 1" +D["HAVE_TIME_H"]=" 1" +D["HAVE_UNISTD_H"]=" 1" +D["HAVE_ARPA_INET_H"]=" 1" +D["HAVE_NETINET_IN_H"]=" 1" +D["HAVE_SYS_FILE_H"]=" 1" +D["HAVE_SYS_IOCTL_H"]=" 1" +D["HAVE_SYS_MMAN_H"]=" 1" +D["HAVE_SYS_POLL_H"]=" 1" +D["HAVE_SYS_RESOURCE_H"]=" 1" +D["HAVE_SYS_SELECT_H"]=" 1" +D["HAVE_SYS_SEM_H"]=" 1" +D["HAVE_SYS_SENDFILE_H"]=" 1" +D["HAVE_SYS_SIGNAL_H"]=" 1" +D["HAVE_SYS_SOCKET_H"]=" 1" +D["HAVE_SYS_STAT_H"]=" 1" +D["HAVE_SYS_SYSCTL_H"]=" 1" +D["HAVE_SYS_TIME_H"]=" 1" +D["HAVE_SYS_TYPES_H"]=" 1" +D["HAVE_SYS_UIO_H"]=" 1" +D["HAVE_SYS_UN_H"]=" 1" +D["HAVE_SYS_WAIT_H"]=" 1" +D["HAVE_NETINET_TCP_H"]=" 1" +D["SETPGRP_VOID"]=" 1" +D["HAVE_SOCKLEN_T"]=" 1" +D["SIZEOF_VOIDP"]=" 8" +D["SIZEOF_CHAR"]=" 1" +D["SIZEOF_INT"]=" 4" +D["SIZEOF_LONG"]=" 8" +D["SIZEOF_SHORT"]=" 2" +D["SIZEOF_LONG_DOUBLE"]=" 16" +D["SIZEOF_LONG_LONG"]=" 8" +D["SIZEOF_SSIZE_T"]=" 8" +D["SIZEOF_SIZE_T"]=" 8" +D["SIZEOF_OFF_T"]=" 8" +D["SIZEOF_PID_T"]=" 4" +D["HAVE_STRNCASECMP"]=" 1" +D["HAVE_STRCASECMP"]=" 1" +D["HAVE_STRDUP"]=" 1" +D["HAVE_STRSTR"]=" 1" +D["HAVE_MEMCHR"]=" 1" +D["HAVE_STRTOL"]=" 1" +D["HAVE_DLSYM"]=" 1" +D["DSO_USE_DLFCN"]=" 1" +D["HAVE_WAITPID"]=" 1" +D["HAVE_VLA"]=" 1" +D["HAVE_SEMGET"]=" 1" +D["HAVE_SEMCTL"]=" 1" +D["HAVE_FLOCK"]=" 1" +D["HAVE_SEMAPHORE_H"]=" 1" +D["HAVE_SEM_CLOSE"]=" 1" +D["HAVE_SEM_UNLINK"]=" 1" +D["HAVE_SEM_POST"]=" 1" +D["HAVE_SEM_WAIT"]=" 1" +D["HAVE_LOCK_EX"]=" 1" +D["HAVE_F_SETLK"]=" 1" +D["HAVE_SEM_UNDO"]=" 1" +D["HAVE_POLLIN"]=" 1" +D["HAVE_PTHREAD_PROCESS_SHARED"]=" 1" +D["HAVE_PTHREAD_MUTEXATTR_SETPSHARED"]=" 1" +D["HAVE_PTHREAD_MUTEX_ROBUST"]=" 1" +D["apr_lock"]=" implementation method 1" +D["USE_SYSVSEM_SERIALIZE"]=" 1" +D["DEV_RANDOM"]=" \"/dev/random\"" +D["HAVE_GMTOFF"]=" 1" +D["GETHOSTBYNAME_R_GLIBC2"]=" 1" +D["HAVE_TCP_CORK"]=" 1" +D["RESOLV_RETRANSRETRY"]=" 1" +D["HAVE_GAI_STRERROR"]=" 1" +D["HAVE_GETADDRINFO"]=" 1" +D["NEGATIVE_EAI"]=" 1" +D["HAVE_GETNAMEINFO"]=" 1" +D["HAVE_LANGINFO_H"]=" 1" +D["HAVE_NL_LANGINFO"]=" 1" +D["HAVE_FSTAT64"]=" 1" + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+[_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ][_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789]*([\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 + { { $as_echo "$as_me:$LINENO: error: could not setup config headers machinery" >&5 +$as_echo "$as_me: error: could not setup config headers machinery" >&2;} + { (exit 1); exit 1; }; } +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_echo "$as_me:$LINENO: error: invalid tag $ac_tag" >&5 +$as_echo "$as_me: error: invalid tag $ac_tag" >&2;} + { (exit 1); exit 1; }; };; + :[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="$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_echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 +$as_echo "$as_me: error: cannot find input file: $ac_f" >&2;} + { (exit 1); exit 1; }; };; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + ac_file_inputs="$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 '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:$LINENO: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$tmp/stdin" \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } ;; + 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 || +$as_echo 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" + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$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 || +$as_echo 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_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 +$as_echo "$as_me: error: cannot create directory $as_dir" >&2;} + { (exit 1); exit 1; }; }; } + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$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 + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac +# 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@*) + { $as_echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} + ac_datarootdir_hack=' + s&@datadir@&/bottlenecks/rubbos/app/apache2&g + s&@docdir@&${datarootdir}/doc/${PACKAGE}&g + s&@infodir@&${datarootdir}/info&g + s&@localedir@&${datarootdir}/locale&g + s&@mandir@&${prefix}/man&g + s&\${datarootdir}&${prefix}/share&g' ;; +esac +ac_sed_extra="/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/ +s/:*\${srcdir}:*/:/ +s/:*@srcdir@:*/:/ +s/^\([^=]*=[ ]*\):*/\1/ +s/:*$// +s/^[^=]*=[ ]*$// +} + +: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 +s&@INSTALL@&$ac_INSTALL&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&5 +$as_echo "$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 "$tmp/stdin" + case $ac_file in + -) cat "$tmp/out" && rm -f "$tmp/out";; + *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; + esac \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" + } >"$tmp/config.h" \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:$LINENO: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$tmp/config.h" "$ac_file" \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ + || { { $as_echo "$as_me:$LINENO: error: could not create -" >&5 +$as_echo "$as_me: error: could not create -" >&2;} + { (exit 1); exit 1; }; } + fi + ;; + + :C) { $as_echo "$as_me:$LINENO: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "default":C) +for i in $SAVE_FILES; do + if cmp -s $i $i.save 2>/dev/null; then + mv $i.save $i + echo "$i is unchanged" + fi + rm -f $i.save +done +chmod +x apr-config + ;; + + esac +done # for ac_tag + + +{ (exit 0); exit 0; } diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/configure b/rubbos/app/httpd-2.0.64/srclib/apr/configure new file mode 100755 index 00000000..98751c30 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/configure @@ -0,0 +1,44615 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.63. +# +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +# 2002, 2003, 2004, 2005, 2006, 2007, 2008 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 -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 + + + + +# PATH needs CR +# 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_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +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 + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + 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 + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + { (exit 1); exit 1; } +fi + +# Work around bugs in pre-3.0 UWIN ksh. +for as_var in ENV MAIL MAILPATH +do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# Required to use basename. +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 + + +# Name of the executable. +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# CDPATH. +$as_unset CDPATH + + +if test "x$CONFIG_SHELL" = x; then + if (eval ":") 2>/dev/null; then + as_have_required=yes +else + as_have_required=no +fi + + if test $as_have_required = yes && (eval ": +(as_func_return () { + (exit \$1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = \"\$1\" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test \$exitcode = 0) || { (exit 1); exit 1; } + +( + as_lineno_1=\$LINENO + as_lineno_2=\$LINENO + test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && + test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } +") 2> /dev/null; then + : +else + as_candidate_shells= + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + case $as_dir in + /*) + for as_base in sh bash ksh sh5; do + as_candidate_shells="$as_candidate_shells $as_dir/$as_base" + done;; + esac +done +IFS=$as_save_IFS + + + for as_shell in $as_candidate_shells $SHELL; do + # Try only shells that exist, to save several forks. + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { ("$as_shell") 2> /dev/null <<\_ASEOF +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 + + +: +_ASEOF +}; then + CONFIG_SHELL=$as_shell + as_have_required=yes + if { "$as_shell" 2> /dev/null <<\_ASEOF +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 + + +: +(as_func_return () { + (exit $1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = "$1" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test $exitcode = 0) || { (exit 1); exit 1; } + +( + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } + +_ASEOF +}; then + break +fi + +fi + + done + + if test "x$CONFIG_SHELL" != x; then + for as_var in BASH_ENV ENV + do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var + done + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} +fi + + + if test $as_have_required = no; then + echo This script requires a shell more modern than all the + echo shells that I found on your system. Please install a + echo modern shell, or manually run the script under such a + echo shell if you do have one. + { (exit 1); exit 1; } +fi + + +fi + +fi + + + +(eval "as_func_return () { + (exit \$1) +} +as_func_success () { + as_func_return 0 +} +as_func_failure () { + as_func_return 1 +} +as_func_ret_success () { + return 0 +} +as_func_ret_failure () { + return 1 +} + +exitcode=0 +if as_func_success; then + : +else + exitcode=1 + echo as_func_success failed. +fi + +if as_func_failure; then + exitcode=1 + echo as_func_failure succeeded. +fi + +if as_func_ret_success; then + : +else + exitcode=1 + echo as_func_ret_success failed. +fi + +if as_func_ret_failure; then + exitcode=1 + echo as_func_ret_failure succeeded. +fi + +if ( set x; as_func_ret_success y && test x = \"\$1\" ); then + : +else + exitcode=1 + echo positional parameters were not saved. +fi + +test \$exitcode = 0") || { + echo No shell found that supports shell functions. + echo Please tell bug-autoconf@gnu.org about your system, + echo including any error possibly output before this message. + echo This can help us improve future autoconf versions. + echo Configuration will now proceed without shell functions. +} + + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line after each line using $LINENO; the second 'sed' + # does the real work. The second script uses 'N' to pair each + # line-number line with the line containing $LINENO, and appends + # trailing '-' during substitution so that $LINENO is not a special + # case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # scripts with optimization help from Paolo Bonzini. Blame Lee + # E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + 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" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); exit 1; }; } + + # 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 +} + + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in +-n*) + case `echo 'x\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + *) ECHO_C='\c';; + esac;; +*) + ECHO_N='-n';; +esac +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +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 -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +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=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + + + +# Check that we are running under the correct shell. +SHELL=${CONFIG_SHELL-/bin/sh} + +case X$ECHO in +X*--fallback-echo) + # Remove one level of quotation (which was required for Make). + ECHO=`echo "$ECHO" | sed 's,\\\\\$\\$0,'$0','` + ;; +esac + +echo=${ECHO-echo} +if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X$1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then + # Yippee, $echo works! + : +else + # Restart under the correct shell. + exec $SHELL "$0" --no-reexec ${1+"$@"} +fi + +if test "X$1" = X--fallback-echo; then + # used as fallback echo + shift + cat </dev/null 2>&1 && unset CDPATH + +if test -z "$ECHO"; then +if test "X${echo_test_string+set}" != Xset; then +# find a string as large as possible, as long as the shell can cope with it + for cmd in 'sed 50q "$0"' 'sed 20q "$0"' 'sed 10q "$0"' 'sed 2q "$0"' 'echo test'; do + # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ... + if (echo_test_string=`eval $cmd`) 2>/dev/null && + echo_test_string=`eval $cmd` && + (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null + then + break + fi + done +fi + +if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + : +else + # The Solaris, AIX, and Digital Unix default echo programs unquote + # backslashes. This makes it impossible to quote backslashes using + # echo "$something" | sed 's/\\/\\\\/g' + # + # So, first we look for a working echo in the user's PATH. + + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for dir in $PATH /usr/ucb; do + IFS="$lt_save_ifs" + if (test -f $dir/echo || test -f $dir/echo$ac_exeext) && + test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$dir/echo" + break + fi + done + IFS="$lt_save_ifs" + + if test "X$echo" = Xecho; then + # We didn't find a better echo, so look for alternatives. + if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # This shell has a builtin print -r that does the trick. + echo='print -r' + elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) && + test "X$CONFIG_SHELL" != X/bin/ksh; then + # If we have ksh, try running configure again with it. + ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh} + export ORIGINAL_CONFIG_SHELL + CONFIG_SHELL=/bin/ksh + export CONFIG_SHELL + exec $CONFIG_SHELL "$0" --no-reexec ${1+"$@"} + else + # Try using printf. + echo='printf %s\n' + if test "X`($echo '\t') 2>/dev/null`" = 'X\t' && + echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + # Cool, printf works + : + elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($ORIGINAL_CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL + export CONFIG_SHELL + SHELL="$CONFIG_SHELL" + export SHELL + echo="$CONFIG_SHELL $0 --fallback-echo" + elif echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo '\t') 2>/dev/null` && + test "X$echo_testing_string" = 'X\t' && + echo_testing_string=`($CONFIG_SHELL "$0" --fallback-echo "$echo_test_string") 2>/dev/null` && + test "X$echo_testing_string" = "X$echo_test_string"; then + echo="$CONFIG_SHELL $0 --fallback-echo" + else + # maybe with a smaller string... + prev=: + + for cmd in 'echo test' 'sed 2q "$0"' 'sed 10q "$0"' 'sed 20q "$0"' 'sed 50q "$0"'; do + if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null + then + break + fi + prev="$cmd" + done + + if test "$prev" != 'sed 50q "$0"'; then + echo_test_string=`eval $prev` + export echo_test_string + exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "$0" ${1+"$@"} + else + # Oops. We lost completely, so just stick with echo. + echo=echo + fi + fi + fi + fi +fi +fi + +# Copy echo and quote the copy suitably for passing to libtool from +# the Makefile, instead of quoting the original, which is used later. +ECHO=$echo +if test "X$ECHO" = "X$CONFIG_SHELL $0 --fallback-echo"; then + ECHO="$CONFIG_SHELL \\\$\$0 --fallback-echo" +fi + + + + +tagnames=${tagnames+${tagnames},}CXX + +tagnames=${tagnames+${tagnames},}F77 + +exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, 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= +SHELL=${CONFIG_SHELL-/bin/sh} + +# Identity of this package. +PACKAGE_NAME= +PACKAGE_TARNAME= +PACKAGE_VERSION= +PACKAGE_STRING= +PACKAGE_BUGREPORT= + +ac_unique_file="build/apr_common.m4" +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#ifdef HAVE_SYS_TYPES_H +# include +#endif +#ifdef HAVE_SYS_STAT_H +# include +#endif +#ifdef STDC_HEADERS +# include +# include +#else +# ifdef HAVE_STDLIB_H +# include +# endif +#endif +#ifdef HAVE_STRING_H +# if !defined STDC_HEADERS && defined HAVE_MEMORY_H +# include +# endif +# include +#endif +#ifdef HAVE_STRINGS_H +# include +#endif +#ifdef HAVE_INTTYPES_H +# include +#endif +#ifdef HAVE_STDINT_H +# include +#endif +#ifdef HAVE_UNISTD_H +# include +#endif" + +ac_subst_vars='LTLIBOBJS +LIBOBJS +INCLUDE_RULES +SUBDIRS +LIBTOOL_LIBS +DEFAULT_OSDIR +OSDIR +LDLIBS +NOTEST_INCLUDES +NOTEST_LIBS +NOTEST_LDFLAGS +NOTEST_CFLAGS +NOTEST_CPPFLAGS +EXTRA_INCLUDES +EXTRA_LIBS +EXTRA_LDFLAGS +EXTRA_CFLAGS +EXTRA_CPPFLAGS +have_ipv6 +have_sctp +acceptfilter +have_corkable_tcp +apr_tcp_nopush_flag +file_as_socket +have_in_addr +rand +proclockglobal +pthreadser +procpthreadser +fcntlser +posixser +sysvser +flockser +hasrwlockser +hasprocpthreadser +hasfcntlser +hasposixser +hassysvser +hasflockser +have_union_semun +struct_rlimit +oc +aprdso +int64_strfn +have_int64_strfn +have_memchr +have_strstr +have_strdup +have_strcasecmp +have_stricmp +have_strncasecmp +have_strnicmp +ino_t_value +stdint +int64_literal +pid_t_fmt +off_t_fmt +size_t_fmt +ssize_t_fmt +uint64_t_hex_fmt +uint64_t_fmt_len +uint64_t_fmt +int64_t_fmt_len +int64_t_fmt +socklen_t_value +ssize_t_value +size_t_value +off_t_value +int64_value +long_value +int_value +short_value +voidp_size +semaphoreh +pthreadh +sys_waith +signalh +unistdh +timeh +sys_unh +sys_uioh +sys_timeh +sys_typesh +sys_sockioh +sys_socketh +sys_signalh +sys_sendfileh +sys_ioctlh +stringsh +stringh +stdlibh +stdioh +stdargh +netinet_tcph +netinet_sctp_uioh +netinet_sctph +netinet_inh +sys_syslimitsh +netdbh +limitsh +ioh +fcntlh +direnth +errnoh +crypth +ctypeh +conioh +arpa_ineth +have_memmove +mmap +have_getrlimit +have_setrlimit +have_sigaction +have_inet_network +o_nonblock_inherited +tcp_nodelay_inherited +have_inet_addr +fork +apr_inaddr_none +sendfile +sharedmem +haveos2shm +havebeosarea +haveshmget +havemmapshm +havemmaptmp +useos2shm +usebeosarea +useshmget +usemmapshm +usemmaptmp +havemmapanon +havemmapzero +haveshmgetanon +usemmapanon +usemmapzero +useshmgetanon +have_sigwait +have_sigsuspend +threads +INSTALL_SUBDIRS +eolstr +proc_mutex_is_global +apr_force_atomic_generic +MKDEP +LT_LDFLAGS +LTFLAGS +shlibpath_var +export_lib_target +lib_target +so_ext +link +lt_compile +installbuilddir +LIBTOOL +ac_ct_F77 +FFLAGS +F77 +CXXCPP +ac_ct_CXX +CXXFLAGS +CXX +NMEDIT +DSYMUTIL +STRIP +ECHO +SED +APR_LIBNAME +apr_charset_ebcdic +EGREP +GREP +AR +ASCPP +AS +RM +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +RANLIB +LN_S +AWK +CPP +SET_MAKE +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +APR_MAJOR_VERSION +APR_DOTTED_VERSION +apr_builders +top_builddir +APR_CONFIG_LOCATION +apr_builddir +apr_srcdir +target_os +target_vendor +target_cpu +target +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +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 +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_layout +enable_experimental_libtool +enable_shared +enable_static +enable_fast_install +with_gnu_ld +enable_libtool_lock +with_pic +with_tags +with_installbuilddir +with_libtool +enable_debug +enable_maintainer_mode +enable_profile +enable_pool_debug +with_efence +enable_malloc_debug +enable_nonportable_atomics +enable_threads +with_sendfile +enable_dso +enable_other_child +with_egd +with_devrandom +enable_ipv6 +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CPP +CXX +CXXFLAGS +CCC +CXXCPP +F77 +FFLAGS' + + +# 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' +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=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + 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_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 + { (exit 1); exit 1; }; } + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$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_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 + { (exit 1); exit 1; }; } + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$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 ;; + + -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_echo "$as_me: error: invalid package name: $ac_useropt" >&2 + { (exit 1); exit 1; }; } + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$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_echo "$as_me: error: invalid package name: $ac_useropt" >&2 + { (exit 1); exit 1; }; } + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$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_echo "$as_me: error: unrecognized option: $ac_option +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && + { $as_echo "$as_me: error: invalid variable name: $ac_envvar" >&2 + { (exit 1); exit 1; }; } + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$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_echo "$as_me: error: missing argument to $ac_option" >&2 + { (exit 1); exit 1; }; } +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) { $as_echo "$as_me: error: unrecognized options: $ac_unrecognized_opts" >&2 + { (exit 1); exit 1; }; } ;; + *) $as_echo "$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 +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_echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; } +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 + $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used." >&2 + 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_echo "$as_me: error: working directory cannot be determined" >&2 + { (exit 1); exit 1; }; } +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + { $as_echo "$as_me: error: pwd does not report name of working directory" >&2 + { (exit 1); exit 1; }; } + + +# 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 || +$as_echo 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_echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 + { (exit 1); exit 1; }; } +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || { $as_echo "$as_me: error: $ac_msg" >&2 + { (exit 1); exit 1; }; } + 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] + --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 + --experimental-libtool Use experimental custom libtool (not included in source distribution) + --enable-shared[=PKGS] build shared libraries [default=yes] + --enable-static[=PKGS] build static libraries [default=yes] + --enable-fast-install[=PKGS] + optimize for fast installation [default=yes] + --disable-libtool-lock avoid locking (might break parallel builds) + --enable-debug Turn on debugging and compile time warnings + --enable-maintainer-mode Turn on debugging and compile time warnings + --enable-profile Turn on profiling for the build (GCC) + --enable-pool-debug[=yes|no|verbose|verbose-alloc|lifetime|owner|all] Turn on pools debugging + --enable-malloc-debug Switch on malloc_debug for BeOS + --enable-nonportable-atomics Turn on optimized atomic code which may produce nonportable binaries + --enable-threads Enable threading support in APR. + --disable-dso Disable DSO support + --enable-other-child Enable reliable child processes + --disable-ipv6 Disable IPv6 support in APR. + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-gnu-ld assume the C compiler uses GNU ld [default=no] + --with-pic try to use only PIC/non-PIC objects [default=use + both] + --with-tags[=TAGS] include additional configurations [automatic] + --with-installbuilddir=DIR location to store APR build files (defaults to '${datadir}/build') + --without-libtool avoid using libtool to link the library + --with-efence[=DIR] path to Electric Fence installation + --with-sendfile Override decision to use sendfile + --with-egd[=DIR] use EGD-compatible socket + --with-devrandom[=DEV] use /dev/random or compatible [searches by default] + +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 C/C++/Objective C preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CPP C preprocessor + CXX C++ compiler command + CXXFLAGS C++ compiler flags + CXXCPP C++ preprocessor + F77 Fortran 77 compiler command + FFLAGS Fortran 77 compiler flags + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +_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=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$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 guested configure. + 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 + $as_echo "$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.63 + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, +2002, 2003, 2004, 2005, 2006, 2007, 2008 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 +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.63. Invocation command line was + + $ $0 $@ + +_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 + test -z "$as_dir" && as_dir=. + $as_echo "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=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; + 2) + ac_configure_args1="$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 + ac_configure_args="$ac_configure_args '$ac_arg'" + ;; + esac + done +done +$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } +$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export 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=$? + # Save into config.log some information that might help in debugging. + { + echo + + cat <<\_ASBOX +## ---------------- ## +## Cache variables. ## +## ---------------- ## +_ASBOX + 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_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$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= ;; #( + *) $as_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 + + cat <<\_ASBOX +## ----------------- ## +## Output variables. ## +## ----------------- ## +_ASBOX + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + cat <<\_ASBOX +## ------------------- ## +## File substitutions. ## +## ------------------- ## +_ASBOX + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + cat <<\_ASBOX +## ----------- ## +## confdefs.h. ## +## ----------- ## +_ASBOX + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$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'; { (exit 1); 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 + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + ac_site_file1=$CONFIG_SITE +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test -r "$ac_site_file"; then + { $as_echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" + 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. + if test -f "$cache_file"; then + { $as_echo "$as_me:$LINENO: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:$LINENO: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +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,) + { $as_echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$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 + { $as_echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:$LINENO: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:$LINENO: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:$LINENO: current value: \`$ac_new_val'" >&5 +$as_echo "$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=`$as_echo "$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. + *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + { { $as_echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 +$as_echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} + { (exit 1); exit 1; }; } +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_config_headers="$ac_config_headers include/arch/unix/apr_private.h" + +ac_aux_dir= +for ac_dir in build "$srcdir"/build; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + { { $as_echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in build \"$srcdir\"/build" >&5 +$as_echo "$as_me: error: cannot find install-sh or install.sh in build \"$srcdir\"/build" >&2;} + { (exit 1); exit 1; }; } +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. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*- +## Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007, +## 2008 Free Software Foundation, Inc. +## Originally by Gordon Matzigkeit , 1996 +## +## This file is free software; the Free Software Foundation gives +## unlimited permission to copy and/or distribute it, with or without +## modifications, as long as this notice is preserved. + +# serial 52 AC_PROG_LIBTOOL + + +# AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED) +# ----------------------------------------------------------- +# If this macro is not defined by Autoconf, define it here. + + + +# AC_PROG_LIBTOOL +# --------------- +# AC_PROG_LIBTOOL + + +# _AC_PROG_LIBTOOL +# ---------------- +# _AC_PROG_LIBTOOL + + +# AC_LIBTOOL_SETUP +# ---------------- +# AC_LIBTOOL_SETUP + + +# _LT_AC_SYS_COMPILER +# ------------------- +# _LT_AC_SYS_COMPILER + + +# _LT_CC_BASENAME(CC) +# ------------------- +# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. + + + +# _LT_COMPILER_BOILERPLATE +# ------------------------ +# Check for compiler boilerplate output or warnings with +# the simple compiler test code. +# _LT_COMPILER_BOILERPLATE + + +# _LT_LINKER_BOILERPLATE +# ---------------------- +# Check for linker boilerplate output or warnings with +# the simple link test code. +# _LT_LINKER_BOILERPLATE + +# _LT_REQUIRED_DARWIN_CHECKS +# -------------------------- +# Check for some things on darwin + + +# _LT_AC_SYS_LIBPATH_AIX +# ---------------------- +# Links a minimal program and checks the executable +# for the system default hardcoded library path. In most cases, +# this is /usr/lib:/lib, but when the MPI compilers are used +# the location of the communication and MPI libs are included too. +# If we don't find anything, use the default library path according +# to the aix ld manual. +# _LT_AC_SYS_LIBPATH_AIX + + +# _LT_AC_SHELL_INIT(ARG) +# ---------------------- +# _LT_AC_SHELL_INIT + + +# _LT_AC_PROG_ECHO_BACKSLASH +# -------------------------- +# Add some code to the start of the generated configure script which +# will find an echo command which doesn't interpret backslashes. +# _LT_AC_PROG_ECHO_BACKSLASH + + +# _LT_AC_LOCK +# ----------- +# _LT_AC_LOCK + + +# AC_LIBTOOL_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE]) +# ---------------------------------------------------------------- +# Check whether the given compiler option works +# AC_LIBTOOL_COMPILER_OPTION + + +# AC_LIBTOOL_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS, +# [ACTION-SUCCESS], [ACTION-FAILURE]) +# ------------------------------------------------------------ +# Check whether the given compiler option works +# AC_LIBTOOL_LINKER_OPTION + + +# AC_LIBTOOL_SYS_MAX_CMD_LEN +# -------------------------- +# AC_LIBTOOL_SYS_MAX_CMD_LEN + + +# _LT_AC_CHECK_DLFCN +# ------------------ +# _LT_AC_CHECK_DLFCN + + +# _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE, +# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING) +# --------------------------------------------------------------------- +# _LT_AC_TRY_DLOPEN_SELF + + +# AC_LIBTOOL_DLOPEN_SELF +# ---------------------- +# AC_LIBTOOL_DLOPEN_SELF + + +# AC_LIBTOOL_PROG_CC_C_O([TAGNAME]) +# --------------------------------- +# Check to see if options -c and -o are simultaneously supported by compiler +# AC_LIBTOOL_PROG_CC_C_O + + +# AC_LIBTOOL_SYS_HARD_LINK_LOCKS([TAGNAME]) +# ----------------------------------------- +# Check to see if we can do hard links to lock some files if needed +# AC_LIBTOOL_SYS_HARD_LINK_LOCKS + + +# AC_LIBTOOL_OBJDIR +# ----------------- +# AC_LIBTOOL_OBJDIR + + +# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH([TAGNAME]) +# ---------------------------------------------- +# Check hardcoding attributes. +# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH + + +# AC_LIBTOOL_SYS_LIB_STRIP +# ------------------------ +# AC_LIBTOOL_SYS_LIB_STRIP + + +# AC_LIBTOOL_SYS_DYNAMIC_LINKER +# ----------------------------- +# PORTME Fill in your ld.so characteristics +# AC_LIBTOOL_SYS_DYNAMIC_LINKER + + +# _LT_AC_TAGCONFIG +# ---------------- +# _LT_AC_TAGCONFIG + + +# AC_LIBTOOL_DLOPEN +# ----------------- +# enable checks for dlopen support +# AC_LIBTOOL_DLOPEN + + +# AC_LIBTOOL_WIN32_DLL +# -------------------- +# declare package support for building win32 DLLs +# AC_LIBTOOL_WIN32_DLL + + +# AC_ENABLE_SHARED([DEFAULT]) +# --------------------------- +# implement the --enable-shared flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +# AC_ENABLE_SHARED + + +# AC_DISABLE_SHARED +# ----------------- +# set the default shared flag to --disable-shared +# AC_DISABLE_SHARED + + +# AC_ENABLE_STATIC([DEFAULT]) +# --------------------------- +# implement the --enable-static flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +# AC_ENABLE_STATIC + + +# AC_DISABLE_STATIC +# ----------------- +# set the default static flag to --disable-static +# AC_DISABLE_STATIC + + +# AC_ENABLE_FAST_INSTALL([DEFAULT]) +# --------------------------------- +# implement the --enable-fast-install flag +# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'. +# AC_ENABLE_FAST_INSTALL + + +# AC_DISABLE_FAST_INSTALL +# ----------------------- +# set the default to --disable-fast-install +# AC_DISABLE_FAST_INSTALL + + +# AC_LIBTOOL_PICMODE([MODE]) +# -------------------------- +# implement the --with-pic flag +# MODE is either `yes' or `no'. If omitted, it defaults to `both'. +# AC_LIBTOOL_PICMODE + + +# AC_PROG_EGREP +# ------------- +# This is predefined starting with Autoconf 2.54, so this conditional +# definition can be removed once we require Autoconf 2.54 or later. + + + +# AC_PATH_TOOL_PREFIX +# ------------------- +# find a file program which can recognize shared library +# AC_PATH_TOOL_PREFIX + + +# AC_PATH_MAGIC +# ------------- +# find a file program which can recognize a shared library +# AC_PATH_MAGIC + + +# AC_PROG_LD +# ---------- +# find the pathname to the GNU or non-GNU linker +# AC_PROG_LD + + +# AC_PROG_LD_GNU +# -------------- +# AC_PROG_LD_GNU + + +# AC_PROG_LD_RELOAD_FLAG +# ---------------------- +# find reload flag for linker +# -- PORTME Some linkers may need a different reload flag. +# AC_PROG_LD_RELOAD_FLAG + + +# AC_DEPLIBS_CHECK_METHOD +# ----------------------- +# how to check for library dependencies +# -- PORTME fill in with the dynamic library characteristics +# AC_DEPLIBS_CHECK_METHOD + + +# AC_PROG_NM +# ---------- +# find the pathname to a BSD-compatible name lister +# AC_PROG_NM + + +# AC_CHECK_LIBM +# ------------- +# check for math library +# AC_CHECK_LIBM + + +# AC_LIBLTDL_CONVENIENCE([DIRECTORY]) +# ----------------------------------- +# sets LIBLTDL to the link flags for the libltdl convenience library and +# LTDLINCL to the include flags for the libltdl header and adds +# --enable-ltdl-convenience to the configure arguments. Note that +# AC_CONFIG_SUBDIRS is not called here. If DIRECTORY is not provided, +# it is assumed to be `libltdl'. LIBLTDL will be prefixed with +# '${top_builddir}/' and LTDLINCL will be prefixed with '${top_srcdir}/' +# (note the single quotes!). If your package is not flat and you're not +# using automake, define top_builddir and top_srcdir appropriately in +# the Makefiles. +# AC_LIBLTDL_CONVENIENCE + + +# AC_LIBLTDL_INSTALLABLE([DIRECTORY]) +# ----------------------------------- +# sets LIBLTDL to the link flags for the libltdl installable library and +# LTDLINCL to the include flags for the libltdl header and adds +# --enable-ltdl-install to the configure arguments. Note that +# AC_CONFIG_SUBDIRS is not called here. If DIRECTORY is not provided, +# and an installed libltdl is not found, it is assumed to be `libltdl'. +# LIBLTDL will be prefixed with '${top_builddir}/'# and LTDLINCL with +# '${top_srcdir}/' (note the single quotes!). If your package is not +# flat and you're not using automake, define top_builddir and top_srcdir +# appropriately in the Makefiles. +# In the future, this macro may have to be called after AC_PROG_LIBTOOL. +# AC_LIBLTDL_INSTALLABLE + + +# AC_LIBTOOL_CXX +# -------------- +# enable support for C++ libraries +# AC_LIBTOOL_CXX + + +# _LT_AC_LANG_CXX +# --------------- +# _LT_AC_LANG_CXX + +# _LT_AC_PROG_CXXCPP +# ------------------ +# _LT_AC_PROG_CXXCPP + +# AC_LIBTOOL_F77 +# -------------- +# enable support for Fortran 77 libraries +# AC_LIBTOOL_F77 + + +# _LT_AC_LANG_F77 +# --------------- +# _LT_AC_LANG_F77 + + +# AC_LIBTOOL_GCJ +# -------------- +# enable support for GCJ libraries +# AC_LIBTOOL_GCJ + + +# _LT_AC_LANG_GCJ +# --------------- +# _LT_AC_LANG_GCJ + + +# AC_LIBTOOL_RC +# ------------- +# enable support for Windows resource files +# AC_LIBTOOL_RC + + +# AC_LIBTOOL_LANG_C_CONFIG +# ------------------------ +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. + +# AC_LIBTOOL_LANG_C_CONFIG + + +# AC_LIBTOOL_LANG_CXX_CONFIG +# -------------------------- +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. + +# AC_LIBTOOL_LANG_CXX_CONFIG + +# AC_LIBTOOL_POSTDEP_PREDEP([TAGNAME]) +# ------------------------------------ +# Figure out "hidden" library dependencies from verbose +# compiler output when linking a shared library. +# Parse the compiler output and extract the necessary +# objects, libraries and library flags. +# AC_LIBTOOL_POSTDEP_PREDEP + +# AC_LIBTOOL_LANG_F77_CONFIG +# -------------------------- +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. + +# AC_LIBTOOL_LANG_F77_CONFIG + + +# AC_LIBTOOL_LANG_GCJ_CONFIG +# -------------------------- +# Ensure that the configuration vars for the C compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. + +# AC_LIBTOOL_LANG_GCJ_CONFIG + + +# AC_LIBTOOL_LANG_RC_CONFIG +# ------------------------- +# Ensure that the configuration vars for the Windows resource compiler are +# suitably defined. Those variables are subsequently used by +# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'. + +# AC_LIBTOOL_LANG_RC_CONFIG + + +# AC_LIBTOOL_CONFIG([TAGNAME]) +# ---------------------------- +# If TAGNAME is not passed, then create an initial libtool script +# with a default configuration from the untagged config vars. Otherwise +# add code to config.status for appending the configuration named by +# TAGNAME from the matching tagged config vars. +# AC_LIBTOOL_CONFIG + + +# AC_LIBTOOL_PROG_COMPILER_NO_RTTI([TAGNAME]) +# ------------------------------------------- +# AC_LIBTOOL_PROG_COMPILER_NO_RTTI + + +# AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE +# --------------------------------- + # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE + + +# AC_LIBTOOL_PROG_COMPILER_PIC([TAGNAME]) +# --------------------------------------- + + + +# AC_LIBTOOL_PROG_LD_SHLIBS([TAGNAME]) +# ------------------------------------ +# See if the linker supports building shared libraries. +# AC_LIBTOOL_PROG_LD_SHLIBS + + +# _LT_AC_FILE_LTDLL_C +# ------------------- +# Be careful that the start marker always follows a newline. +# _LT_AC_FILE_LTDLL_C + + +# _LT_AC_TAGVAR(VARNAME, [TAGNAME]) +# --------------------------------- + + + +# old names + + + + + + + + +# This is just to silence aclocal about the macro not being used + + + + + + + +# Cheap backport of AS_EXECUTABLE_P and required macros +# from Autoconf 2.59; we should not use $as_executable_p directly. + +# _AS_TEST_PREPARE +# ---------------- +# _AS_TEST_PREPARE + +# AS_EXECUTABLE_P +# --------------- +# Check whether a file is executable. +# AS_EXECUTABLE_P + +############################################################ +# NOTE: This macro has been submitted for inclusion into # +# GNU Autoconf as AC_PROG_SED. When it is available in # +# a released version of Autoconf we should remove this # +# macro and use it instead. # +############################################################ +# LT_AC_PROG_SED +# -------------- +# Check for a fully-functional sed program, that truncates +# as few characters as possible. Prefer GNU sed if found. + + + + + apr_ste_save_CPPFLAGS="$CPPFLAGS" + + + apr_ste_save_CFLAGS="$CFLAGS" + + + 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 "$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 + + +# Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + { { $as_echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5 +$as_echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;} + { (exit 1); exit 1; }; } + +{ $as_echo "$as_me:$LINENO: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } +if test "${ac_cv_build+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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_echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 +$as_echo "$as_me: error: cannot guess build type; you must specify one" >&2;} + { (exit 1); exit 1; }; } +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + { { $as_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5 +$as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;} + { (exit 1); exit 1; }; } + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical build" >&5 +$as_echo "$as_me: error: invalid value of canonical build" >&2;} + { (exit 1); exit 1; }; };; +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 + + +{ $as_echo "$as_me:$LINENO: checking host system type" >&5 +$as_echo_n "checking host system type... " >&6; } +if test "${ac_cv_host+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&5 +$as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $host_alias failed" >&2;} + { (exit 1); exit 1; }; } +fi + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical host" >&5 +$as_echo "$as_me: error: invalid value of canonical host" >&2;} + { (exit 1); exit 1; }; };; +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 + + +{ $as_echo "$as_me:$LINENO: checking target system type" >&5 +$as_echo_n "checking target system type... " >&6; } +if test "${ac_cv_target+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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_echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $target_alias failed" >&5 +$as_echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $target_alias failed" >&2;} + { (exit 1); exit 1; }; } +fi + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_target" >&5 +$as_echo "$ac_cv_target" >&6; } +case $ac_cv_target in +*-*-*) ;; +*) { { $as_echo "$as_me:$LINENO: error: invalid value of canonical target" >&5 +$as_echo "$as_me: error: invalid value of canonical target" >&2;} + { (exit 1); exit 1; }; };; +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}- +echo "Configuring APR library" +echo "Platform: $host" + + + +# Absolute source/build directory +apr_srcdir=`(cd $srcdir && pwd)` +apr_builddir=`pwd` + + + +if test "$apr_builddir" != "$apr_srcdir"; then + USE_VPATH=1 + APR_CONFIG_LOCATION=build +else + APR_CONFIG_LOCATION=source +fi + + + +# Libtool might need this symbol -- it must point to the location of +# the generated libtool script (not necessarily the "top" build dir). +# +top_builddir="$apr_builddir" + + +# Directory containing apr build macros, helpers, and make rules +# NOTE: make rules (apr_rules.mk) will be in the builddir for vpath +# +apr_buildout=$apr_builddir/build +apr_builders=$apr_srcdir/build + + +MKDIR=$apr_builders/mkdir.sh + + + { $as_echo "$as_me:$LINENO: checking for working mkdir -p" >&5 +$as_echo_n "checking for working mkdir -p... " >&6; } +if test "${ac_cv_mkdir_p+set}" = set; then + $as_echo_n "(cached) " >&6 +else + + 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 + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_mkdir_p" >&5 +$as_echo "$ac_cv_mkdir_p" >&6; } + if test "$ac_cv_mkdir_p" = "yes"; then + mkdir_p="mkdir -p" + else + mkdir_p="$apr_builders/mkdir.sh" + fi + + +# get our version information +get_version="$apr_builders/get-version.sh" +version_hdr="$apr_srcdir/include/apr_version.h" +APR_MAJOR_VERSION="`$get_version major $version_hdr APR`" +APR_DOTTED_VERSION="`$get_version all $version_hdr APR`" + + + + +echo "APR Version: ${APR_DOTTED_VERSION}" + + +# Check whether --enable-layout was given. +if test "${enable_layout+set}" = set; then + enableval=$enable_layout; + LAYOUT=$enableval + +fi + + +if test -z "$LAYOUT"; then + LAYOUT="apr" +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 + 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 ; 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 + + + +{ $as_echo "$as_me:$LINENO: checking for chosen layout" >&5 +$as_echo_n "checking for chosen layout... " >&6; } +{ $as_echo "$as_me:$LINENO: result: $layout_name" >&5 +$as_echo "$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_echo "$as_me:$LINENO: error: expected an absolute path for --$ac_var: $ac_val" >&5 +$as_echo "$as_me: error: expected an absolute path for --$ac_var: $ac_val" >&2;} + { (exit 1); exit 1; }; };; + esac +done + + + + +case "$host" in + *-apple-aux3*) + + if test -z "$CC"; then + echo " setting CC to \"gcc\"" + CC="gcc" + fi + + ;; + bs2000*-siemens-sysv*) + + if test -z "$CC"; then + echo " setting CC to \"c89 -XLLML -XLLMK -XL -Kno_integer_overflow\"" + CC="c89 -XLLML -XLLMK -XL -Kno_integer_overflow" + fi + + ;; + *convex-v11*) + + if test -z "$CC"; then + echo " setting CC to \"cc\"" + CC="cc" + fi + + ;; + *-ibm-os390) + + if test -z "$CC"; then + echo " setting CC to \"cc\"" + CC="cc" + fi + + ;; + *-ibm-as400) + + if test -z "$CC"; then + echo " setting CC to \"icc\"" + CC="icc" + fi + + ;; + *-isc4*) + + if test -z "$CC"; then + echo " setting CC to \"gcc\"" + CC="gcc" + fi + + ;; + m88k-*-CX/SX|CYBER) + + if test -z "$CC"; then + echo " setting CC to \"cc\"" + CC="cc" + fi + + ;; + *-next-openstep*) + + if test -z "$CC"; then + echo " setting CC to \"cc\"" + CC="cc" + fi + + ;; + *-qnx32) + + if test -z "$CC"; then + echo " setting CC to \"cc -F\"" + CC="cc -F" + fi + + ;; + *-tandem-oss) + + if test -z "$CC"; then + echo " setting CC to \"c89\"" + CC="c89" + fi + + ;; + TPF) + + if test -z "$CC"; then + echo " setting CC to \"c89\"" + CC="c89" + fi + + ;; +esac + + +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 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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 + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:$LINENO: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "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 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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 + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$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 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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 + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:$LINENO: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "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 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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 + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$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" + $as_echo "$as_me:$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 +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:$LINENO: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "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 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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 + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:$LINENO: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "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 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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 + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "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:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } + +# Provide some information about the compiler. +$as_echo "$as_me:$LINENO: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +{ (ac_try="$ac_compiler --version >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler --version >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -v >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -v >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -V >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -V >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + 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. +{ $as_echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +ac_link_default=`$as_echo "$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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; 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+set}" = set && 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 + ac_file='' +fi + +{ $as_echo "$as_me:$LINENO: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +if test -z "$ac_file"; then + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: C compiler cannot create executables +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: C compiler cannot create executables +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } +fi + +ac_exeext=$ac_cv_exeext + +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:$LINENO: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 +# If not cross compiling, check that we can run a simple program. +if test "$cross_compiling" != yes; then + if { ac_try='./$ac_file' + { (case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } + fi + fi +fi +{ $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +{ $as_echo "$as_me:$LINENO: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +{ $as_echo "$as_me:$LINENO: checking for suffix of executables" >&5 +$as_echo_n "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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; 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 + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } +fi + +rm -f conftest$ac_cv_exeext +{ $as_echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +{ $as_echo "$as_me:$LINENO: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if test "${ac_cv_objext+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; 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 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } +fi + +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if test "${ac_cv_c_compiler_gnu+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_compiler_gnu=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_compiler_gnu=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if test "${ac_cv_prog_cc_g+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_g=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + CFLAGS="" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_g=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if test "${ac_cv_prog_cc_c89+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + 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; +} + +/* 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 don't provoke an error unfortunately, instead are silently treated + as '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's necessary to write '\x00'==0 to get something + that's 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 **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_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" + rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cc_c89=$ac_arg +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:$LINENO: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:$LINENO: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac + + +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$apr_preload_done" != "xyes" ; then + + apr_preload_done="yes" + + echo "Applying APR hints file rules for $host" + + case "$host" in + *mint) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DMINT\"" + CPPFLAGS="-DMINT" + else + apr_addto_bugger="-DMINT" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + + if test "x$LIBS" = "x"; then + echo " setting LIBS to \"-lportlib\"" + LIBS="-lportlib" + else + apr_addto_bugger="-lportlib" + 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 + echo " adding \"$i\" to LIBS" + LIBS="$LIBS $i" + fi + done + fi + + ;; + *MPE/iX*) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DMPE -D_POSIX_SOURCE -D_SOCKET_SOURCE\"" + CPPFLAGS="-DMPE -D_POSIX_SOURCE -D_SOCKET_SOURCE" + else + apr_addto_bugger="-DMPE -D_POSIX_SOURCE -D_SOCKET_SOURCE" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + + if test "x$LIBS" = "x"; then + echo " setting LIBS to \"-lsvipc -lcurses\"" + LIBS="-lsvipc -lcurses" + else + apr_addto_bugger="-lsvipc -lcurses" + 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 + echo " adding \"$i\" to LIBS" + LIBS="$LIBS $i" + fi + done + fi + + + if test "x$LDFLAGS" = "x"; then + echo " setting LDFLAGS to \"-Xlinker \"-WL,cap=ia,ba,ph;nmstack=1024000\"\"" + LDFLAGS="-Xlinker \"-WL,cap=ia,ba,ph;nmstack=1024000\"" + else + apr_addto_bugger="-Xlinker \"-WL,cap=ia,ba,ph;nmstack=1024000\"" + 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 + echo " adding \"$i\" to LDFLAGS" + LDFLAGS="$LDFLAGS $i" + fi + done + fi + + ;; + *-apple-aux3*) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DAUX3 -D_POSIX_SOURCE\"" + CPPFLAGS="-DAUX3 -D_POSIX_SOURCE" + else + apr_addto_bugger="-DAUX3 -D_POSIX_SOURCE" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + + if test "x$LIBS" = "x"; then + echo " setting LIBS to \"-lposix -lbsd\"" + LIBS="-lposix -lbsd" + else + apr_addto_bugger="-lposix -lbsd" + 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 + echo " adding \"$i\" to LIBS" + LIBS="$LIBS $i" + fi + done + fi + + + if test "x$LDFLAGS" = "x"; then + echo " setting LDFLAGS to \"-s\"" + LDFLAGS="-s" + else + apr_addto_bugger="-s" + 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 + echo " adding \"$i\" to LDFLAGS" + LDFLAGS="$LDFLAGS $i" + fi + done + fi + + + echo " forcing SHELL to \"/bin/ksh\"" + SHELL="/bin/ksh" + + ;; + *-ibm-aix*) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-U__STR__ -D_THREAD_SAFE\"" + CPPFLAGS="-U__STR__ -D_THREAD_SAFE" + else + apr_addto_bugger="-U__STR__ -D_THREAD_SAFE" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + case $host in + *-ibm-aix4.3) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-D_USE_IRS\"" + CPPFLAGS="-D_USE_IRS" + else + apr_addto_bugger="-D_USE_IRS" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + ;; + *-ibm-aix5*) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-D_USE_IRS\"" + CPPFLAGS="-D_USE_IRS" + else + apr_addto_bugger="-D_USE_IRS" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + ;; + *-ibm-aix4.3.*) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-D_USE_IRS\"" + CPPFLAGS="-D_USE_IRS" + else + apr_addto_bugger="-D_USE_IRS" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + ;; + esac + if $CC 2>&1 | grep 'xlc' > /dev/null; then + + if test -z "$AIX_XLC"; then + echo " setting AIX_XLC to \"yes\"" + AIX_XLC="yes" + fi + + + if test "x$CFLAGS" = "x"; then + echo " setting CFLAGS to \"-qHALT=E\"" + CFLAGS="-qHALT=E" + else + apr_addto_bugger="-qHALT=E" + 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 + echo " adding \"$i\" to CFLAGS" + CFLAGS="$CFLAGS $i" + fi + done + fi + + fi + + if test -z "$apr_sysvsem_is_global"; then + echo " setting apr_sysvsem_is_global to \"yes\"" + apr_sysvsem_is_global="yes" + fi + + + if test -z "$apr_lock_method"; then + echo " setting apr_lock_method to \"USE_SYSVSEM_SERIALIZE\"" + apr_lock_method="USE_SYSVSEM_SERIALIZE" + fi + + case $host in + *-ibm-aix3* | *-ibm-aix4.1.*) + ;; + *) + + if test "x$LDFLAGS" = "x"; then + echo " setting LDFLAGS to \"-Wl,-brtl\"" + LDFLAGS="-Wl,-brtl" + else + apr_addto_bugger="-Wl,-brtl" + 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 + echo " adding \"$i\" to LDFLAGS" + LDFLAGS="$LDFLAGS $i" + fi + done + fi + + ;; + esac + ;; + *-apollo-*) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DAPOLLO\"" + CPPFLAGS="-DAPOLLO" + else + apr_addto_bugger="-DAPOLLO" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + ;; + *-dg-dgux*) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DDGUX\"" + CPPFLAGS="-DDGUX" + else + apr_addto_bugger="-DDGUX" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + ;; + *os2_emx*) + + echo " forcing SHELL to \"sh\"" + SHELL="sh" + + + if test -z "$apr_gethostbyname_is_thread_safe"; then + echo " setting apr_gethostbyname_is_thread_safe to \"yes\"" + apr_gethostbyname_is_thread_safe="yes" + fi + + + if test -z "$apr_gethostbyaddr_is_thread_safe"; then + echo " setting apr_gethostbyaddr_is_thread_safe to \"yes\"" + apr_gethostbyaddr_is_thread_safe="yes" + fi + + ;; + *-hi-hiux) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DHIUX\"" + CPPFLAGS="-DHIUX" + else + apr_addto_bugger="-DHIUX" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + ;; + *-hp-hpux11.*) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DHPUX11 -D_REENTRANT -D_XOPEN_SOURCE_EXTENDED\"" + CPPFLAGS="-DHPUX11 -D_REENTRANT -D_XOPEN_SOURCE_EXTENDED" + else + apr_addto_bugger="-DHPUX11 -D_REENTRANT -D_XOPEN_SOURCE_EXTENDED" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + ;; + *-hp-hpux10.*) + case $host in + *-hp-hpux10.01) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DSELECT_NEEDS_CAST\"" + CPPFLAGS="-DSELECT_NEEDS_CAST" + else + apr_addto_bugger="-DSELECT_NEEDS_CAST" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + ;; + esac + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-D_REENTRANT\"" + CPPFLAGS="-D_REENTRANT" + else + apr_addto_bugger="-D_REENTRANT" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + ;; + *-hp-hpux*) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DHPUX -D_REENTRANT\"" + CPPFLAGS="-DHPUX -D_REENTRANT" + else + apr_addto_bugger="-DHPUX -D_REENTRANT" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + ;; + *-linux*) + case `uname -r` in + 2.* ) + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DLINUX=2\"" + CPPFLAGS="-DLINUX=2" + else + apr_addto_bugger="-DLINUX=2" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + ;; + 1.* ) + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DLINUX=1\"" + CPPFLAGS="-DLINUX=1" + else + apr_addto_bugger="-DLINUX=1" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + ;; + * ) + ;; + esac + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-D_REENTRANT -D_GNU_SOURCE\"" + CPPFLAGS="-D_REENTRANT -D_GNU_SOURCE" + else + apr_addto_bugger="-D_REENTRANT -D_GNU_SOURCE" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + ;; + *-GNU*) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DHURD -D_GNU_SOURCE\"" + CPPFLAGS="-DHURD -D_GNU_SOURCE" + else + apr_addto_bugger="-DHURD -D_GNU_SOURCE" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + ;; + *-lynx-lynxos) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-D__NO_INCLUDE_WARN__ -DLYNXOS\"" + CPPFLAGS="-D__NO_INCLUDE_WARN__ -DLYNXOS" + else + apr_addto_bugger="-D__NO_INCLUDE_WARN__ -DLYNXOS" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + + if test "x$LIBS" = "x"; then + echo " setting LIBS to \"-lbsd\"" + LIBS="-lbsd" + else + apr_addto_bugger="-lbsd" + 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 + echo " adding \"$i\" to LIBS" + LIBS="$LIBS $i" + fi + done + fi + + ;; + *486-*-bsdi*) + + if test "x$CFLAGS" = "x"; then + echo " setting CFLAGS to \"-m486\"" + CFLAGS="-m486" + else + apr_addto_bugger="-m486" + 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 + echo " adding \"$i\" to CFLAGS" + CFLAGS="$CFLAGS $i" + fi + done + fi + + ;; + *-*-bsdi*) + case $host in + *bsdi4.1) + + if test "x$CFLAGS" = "x"; then + echo " setting CFLAGS to \"-D_REENTRANT\"" + CFLAGS="-D_REENTRANT" + else + apr_addto_bugger="-D_REENTRANT" + 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 + echo " adding \"$i\" to CFLAGS" + CFLAGS="$CFLAGS $i" + fi + done + fi + + ;; + esac + ;; + *-openbsd*) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-D_POSIX_THREADS\"" + CPPFLAGS="-D_POSIX_THREADS" + else + apr_addto_bugger="-D_POSIX_THREADS" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + # getsockname() reports the wrong address on a socket + # bound to an ephmeral port so the test fails. + + if test -z "$ac_cv_o_nonblock_inherited"; then + echo " setting ac_cv_o_nonblock_inherited to \"yes\"" + ac_cv_o_nonblock_inherited="yes" + fi + + ;; + *-netbsd*) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DNETBSD\"" + CPPFLAGS="-DNETBSD" + else + apr_addto_bugger="-DNETBSD" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + # fcntl() lies about O_NONBLOCK on an accept()ed socket (PR kern/26950) + + if test -z "$ac_cv_o_nonblock_inherited"; then + echo " setting ac_cv_o_nonblock_inherited to \"yes\"" + ac_cv_o_nonblock_inherited="yes" + fi + + ;; + *-freebsd*) + case $host in + *freebsd2345*) + + if test "x$CFLAGS" = "x"; then + echo " setting CFLAGS to \"-funsigned-char\"" + CFLAGS="-funsigned-char" + else + apr_addto_bugger="-funsigned-char" + 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 + echo " adding \"$i\" to CFLAGS" + CFLAGS="$CFLAGS $i" + fi + done + fi + + ;; + esac + + if test -z "$enable_threads"; then + echo " setting enable_threads to \"no\"" + enable_threads="no" + fi + + + if test -z "$apr_lock_method"; then + echo " setting apr_lock_method to \"USE_FLOCK_SERIALIZE\"" + apr_lock_method="USE_FLOCK_SERIALIZE" + fi + + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-D_REENTRANT -D_THREAD_SAFE\"" + CPPFLAGS="-D_REENTRANT -D_THREAD_SAFE" + else + apr_addto_bugger="-D_REENTRANT -D_THREAD_SAFE" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + ;; + *-next-nextstep*) + + if test -z "$CFLAGS"; then + echo " setting CFLAGS to \"-O\"" + CFLAGS="-O" + fi + + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DNEXT\"" + CPPFLAGS="-DNEXT" + else + apr_addto_bugger="-DNEXT" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + ;; + *-next-openstep*) + + if test -z "$CFLAGS"; then + echo " setting CFLAGS to \"-O\"" + CFLAGS="-O" + fi + + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DNEXT\"" + CPPFLAGS="-DNEXT" + else + apr_addto_bugger="-DNEXT" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + ;; + *-apple-rhapsody*) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DRHAPSODY\"" + CPPFLAGS="-DRHAPSODY" + else + apr_addto_bugger="-DRHAPSODY" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + ;; + *-apple-darwin*) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DDARWIN -DSIGPROCMASK_SETS_THREAD_MASK -no-cpp-precomp\"" + CPPFLAGS="-DDARWIN -DSIGPROCMASK_SETS_THREAD_MASK -no-cpp-precomp" + else + apr_addto_bugger="-DDARWIN -DSIGPROCMASK_SETS_THREAD_MASK -no-cpp-precomp" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + + if test -z "$apr_posixsem_is_global"; then + echo " setting apr_posixsem_is_global to \"yes\"" + apr_posixsem_is_global="yes" + fi + + + if test -z "$ac_cv_func_poll"; then + echo " setting ac_cv_func_poll to \"no\"" + ac_cv_func_poll="no" + fi + # See issue 34332 + ;; + *-dec-osf*) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DOSF1\"" + CPPFLAGS="-DOSF1" + else + apr_addto_bugger="-DOSF1" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + # process-shared mutexes don't seem to work in Tru64 5.0 + + if test -z "$apr_cv_process_shared_works"; then + echo " setting apr_cv_process_shared_works to \"no\"" + apr_cv_process_shared_works="no" + fi + + ;; + *-nto-qnx*) + ;; + *-qnx) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DQNX\"" + CPPFLAGS="-DQNX" + else + apr_addto_bugger="-DQNX" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + + if test "x$LIBS" = "x"; then + echo " setting LIBS to \"-N128k -lunix\"" + LIBS="-N128k -lunix" + else + apr_addto_bugger="-N128k -lunix" + 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 + echo " adding \"$i\" to LIBS" + LIBS="$LIBS $i" + fi + done + fi + + ;; + *-qnx32) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DQNX\"" + CPPFLAGS="-DQNX" + else + apr_addto_bugger="-DQNX" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + + if test "x$CFLAGS" = "x"; then + echo " setting CFLAGS to \"-mf -3\"" + CFLAGS="-mf -3" + else + apr_addto_bugger="-mf -3" + 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 + echo " adding \"$i\" to CFLAGS" + CFLAGS="$CFLAGS $i" + fi + done + fi + + + if test "x$LIBS" = "x"; then + echo " setting LIBS to \"-N128k -lunix\"" + LIBS="-N128k -lunix" + else + apr_addto_bugger="-N128k -lunix" + 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 + echo " adding \"$i\" to LIBS" + LIBS="$LIBS $i" + fi + done + fi + + ;; + *-isc4*) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-posix -DISC\"" + CPPFLAGS="-posix -DISC" + else + apr_addto_bugger="-posix -DISC" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + + if test "x$LDFLAGS" = "x"; then + echo " setting LDFLAGS to \"-posix\"" + LDFLAGS="-posix" + else + apr_addto_bugger="-posix" + 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 + echo " adding \"$i\" to LDFLAGS" + LDFLAGS="$LDFLAGS $i" + fi + done + fi + + + if test "x$LIBS" = "x"; then + echo " setting LIBS to \"-linet\"" + LIBS="-linet" + else + apr_addto_bugger="-linet" + 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 + echo " adding \"$i\" to LIBS" + LIBS="$LIBS $i" + fi + done + fi + + ;; + *-sco3.2v[234]*) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DSCO -D_REENTRANT\"" + CPPFLAGS="-DSCO -D_REENTRANT" + else + apr_addto_bugger="-DSCO -D_REENTRANT" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + if test "$GCC" = "no"; then + + if test "x$CFLAGS" = "x"; then + echo " setting CFLAGS to \"-Oacgiltz\"" + CFLAGS="-Oacgiltz" + else + apr_addto_bugger="-Oacgiltz" + 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 + echo " adding \"$i\" to CFLAGS" + CFLAGS="$CFLAGS $i" + fi + done + fi + + fi + + if test "x$LIBS" = "x"; then + echo " setting LIBS to \"-lPW -lmalloc\"" + LIBS="-lPW -lmalloc" + else + apr_addto_bugger="-lPW -lmalloc" + 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 + echo " adding \"$i\" to LIBS" + LIBS="$LIBS $i" + fi + done + fi + + ;; + *-sco3.2v5*) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DSCO5 -D_REENTRANT\"" + CPPFLAGS="-DSCO5 -D_REENTRANT" + else + apr_addto_bugger="-DSCO5 -D_REENTRANT" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + ;; + *-sco_sv*|*-SCO_SV*) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DSCO -D_REENTRANT\"" + CPPFLAGS="-DSCO -D_REENTRANT" + else + apr_addto_bugger="-DSCO -D_REENTRANT" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + + if test "x$LIBS" = "x"; then + echo " setting LIBS to \"-lPW -lmalloc\"" + LIBS="-lPW -lmalloc" + else + apr_addto_bugger="-lPW -lmalloc" + 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 + echo " adding \"$i\" to LIBS" + LIBS="$LIBS $i" + fi + done + fi + + ;; + *-solaris2*) + PLATOSVERS=`echo $host | sed 's/^.*solaris2.//'` + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DSOLARIS2=$PLATOSVERS -D_POSIX_PTHREAD_SEMANTICS -D_REENTRANT\"" + CPPFLAGS="-DSOLARIS2=$PLATOSVERS -D_POSIX_PTHREAD_SEMANTICS -D_REENTRANT" + else + apr_addto_bugger="-DSOLARIS2=$PLATOSVERS -D_POSIX_PTHREAD_SEMANTICS -D_REENTRANT" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + + if test -z "$apr_lock_method"; then + echo " setting apr_lock_method to \"USE_FCNTL_SERIALIZE\"" + apr_lock_method="USE_FCNTL_SERIALIZE" + fi + + ;; + *-sunos4*) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DSUNOS4\"" + CPPFLAGS="-DSUNOS4" + else + apr_addto_bugger="-DSUNOS4" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + ;; + *-unixware1) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DUW=100\"" + CPPFLAGS="-DUW=100" + else + apr_addto_bugger="-DUW=100" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + ;; + *-unixware2) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DUW=200\"" + CPPFLAGS="-DUW=200" + else + apr_addto_bugger="-DUW=200" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + + if test "x$LIBS" = "x"; then + echo " setting LIBS to \"-lgen\"" + LIBS="-lgen" + else + apr_addto_bugger="-lgen" + 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 + echo " adding \"$i\" to LIBS" + LIBS="$LIBS $i" + fi + done + fi + + ;; + *-unixware211) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DUW=211\"" + CPPFLAGS="-DUW=211" + else + apr_addto_bugger="-DUW=211" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + + if test "x$LIBS" = "x"; then + echo " setting LIBS to \"-lgen\"" + LIBS="-lgen" + else + apr_addto_bugger="-lgen" + 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 + echo " adding \"$i\" to LIBS" + LIBS="$LIBS $i" + fi + done + fi + + ;; + *-unixware212) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DUW=212\"" + CPPFLAGS="-DUW=212" + else + apr_addto_bugger="-DUW=212" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + + if test "x$LIBS" = "x"; then + echo " setting LIBS to \"-lgen\"" + LIBS="-lgen" + else + apr_addto_bugger="-lgen" + 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 + echo " adding \"$i\" to LIBS" + LIBS="$LIBS $i" + fi + done + fi + + ;; + *-unixware7) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DUW=700\"" + CPPFLAGS="-DUW=700" + else + apr_addto_bugger="-DUW=700" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + + if test "x$LIBS" = "x"; then + echo " setting LIBS to \"-lgen\"" + LIBS="-lgen" + else + apr_addto_bugger="-lgen" + 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 + echo " adding \"$i\" to LIBS" + LIBS="$LIBS $i" + fi + done + fi + + ;; + maxion-*-sysv4*) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DSVR4\"" + CPPFLAGS="-DSVR4" + else + apr_addto_bugger="-DSVR4" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + + if test "x$LIBS" = "x"; then + echo " setting LIBS to \"-lc -lgen\"" + LIBS="-lc -lgen" + else + apr_addto_bugger="-lc -lgen" + 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 + echo " adding \"$i\" to LIBS" + LIBS="$LIBS $i" + fi + done + fi + + ;; + *-*-powermax*) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DSVR4\"" + CPPFLAGS="-DSVR4" + else + apr_addto_bugger="-DSVR4" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + + if test "x$LIBS" = "x"; then + echo " setting LIBS to \"-lgen\"" + LIBS="-lgen" + else + apr_addto_bugger="-lgen" + 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 + echo " adding \"$i\" to LIBS" + LIBS="$LIBS $i" + fi + done + fi + + ;; + TPF) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DTPF -D_POSIX_SOURCE\"" + CPPFLAGS="-DTPF -D_POSIX_SOURCE" + else + apr_addto_bugger="-DTPF -D_POSIX_SOURCE" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + ;; + bs2000*-siemens-sysv*) + + if test -z "$CFLAGS"; then + echo " setting CFLAGS to \"-O\"" + CFLAGS="-O" + fi + + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DSVR4 -D_XPG_IV -D_KMEMUSER\"" + CPPFLAGS="-DSVR4 -D_XPG_IV -D_KMEMUSER" + else + apr_addto_bugger="-DSVR4 -D_XPG_IV -D_KMEMUSER" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + + if test "x$LIBS" = "x"; then + echo " setting LIBS to \"-lsocket\"" + LIBS="-lsocket" + else + apr_addto_bugger="-lsocket" + 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 + echo " adding \"$i\" to LIBS" + LIBS="$LIBS $i" + fi + done + fi + + + if test -z "$enable_threads"; then + echo " setting enable_threads to \"no\"" + enable_threads="no" + fi + + ;; + *-siemens-sysv4*) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DSVR4 -D_XPG_IV -DHAS_DLFCN -DUSE_MMAP_FILES -DUSE_SYSVSEM_SERIALIZED_ACCEPT\"" + CPPFLAGS="-DSVR4 -D_XPG_IV -DHAS_DLFCN -DUSE_MMAP_FILES -DUSE_SYSVSEM_SERIALIZED_ACCEPT" + else + apr_addto_bugger="-DSVR4 -D_XPG_IV -DHAS_DLFCN -DUSE_MMAP_FILES -DUSE_SYSVSEM_SERIALIZED_ACCEPT" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + + if test "x$LIBS" = "x"; then + echo " setting LIBS to \"-lc\"" + LIBS="-lc" + else + apr_addto_bugger="-lc" + 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 + echo " adding \"$i\" to LIBS" + LIBS="$LIBS $i" + fi + done + fi + + ;; + pyramid-pyramid-svr4) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DSVR4 -DNO_LONG_DOUBLE\"" + CPPFLAGS="-DSVR4 -DNO_LONG_DOUBLE" + else + apr_addto_bugger="-DSVR4 -DNO_LONG_DOUBLE" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + + if test "x$LIBS" = "x"; then + echo " setting LIBS to \"-lc\"" + LIBS="-lc" + else + apr_addto_bugger="-lc" + 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 + echo " adding \"$i\" to LIBS" + LIBS="$LIBS $i" + fi + done + fi + + ;; + DS/90\ 7000-*-sysv4*) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DUXPDS\"" + CPPFLAGS="-DUXPDS" + else + apr_addto_bugger="-DUXPDS" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + ;; + *-tandem-sysv4*) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DSVR4\"" + CPPFLAGS="-DSVR4" + else + apr_addto_bugger="-DSVR4" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + ;; + *-ncr-sysv4) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DSVR4 -DMPRAS\"" + CPPFLAGS="-DSVR4 -DMPRAS" + else + apr_addto_bugger="-DSVR4 -DMPRAS" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + + if test "x$LIBS" = "x"; then + echo " setting LIBS to \"-lc -L/usr/ucblib -lucb\"" + LIBS="-lc -L/usr/ucblib -lucb" + else + apr_addto_bugger="-lc -L/usr/ucblib -lucb" + 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 + echo " adding \"$i\" to LIBS" + LIBS="$LIBS $i" + fi + done + fi + + ;; + *-sysv4*) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DSVR4\"" + CPPFLAGS="-DSVR4" + else + apr_addto_bugger="-DSVR4" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + + if test "x$LIBS" = "x"; then + echo " setting LIBS to \"-lc\"" + LIBS="-lc" + else + apr_addto_bugger="-lc" + 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 + echo " adding \"$i\" to LIBS" + LIBS="$LIBS $i" + fi + done + fi + + ;; + 88k-encore-sysv4) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DSVR4 -DENCORE\"" + CPPFLAGS="-DSVR4 -DENCORE" + else + apr_addto_bugger="-DSVR4 -DENCORE" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + + if test "x$LIBS" = "x"; then + echo " setting LIBS to \"-lPW\"" + LIBS="-lPW" + else + apr_addto_bugger="-lPW" + 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 + echo " adding \"$i\" to LIBS" + LIBS="$LIBS $i" + fi + done + fi + + ;; + *-uts*) + PLATOSVERS=`echo $host | sed 's/^.*,//'` + case $PLATOSVERS in + 2*) + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DUTS21\"" + CPPFLAGS="-DUTS21" + else + apr_addto_bugger="-DUTS21" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + + if test "x$CFLAGS" = "x"; then + echo " setting CFLAGS to \"-Xa -eft\"" + CFLAGS="-Xa -eft" + else + apr_addto_bugger="-Xa -eft" + 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 + echo " adding \"$i\" to CFLAGS" + CFLAGS="$CFLAGS $i" + fi + done + fi + + + if test "x$LIBS" = "x"; then + echo " setting LIBS to \"-lbsd -la\"" + LIBS="-lbsd -la" + else + apr_addto_bugger="-lbsd -la" + 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 + echo " adding \"$i\" to LIBS" + LIBS="$LIBS $i" + fi + done + fi + + ;; + *) + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DSVR4\"" + CPPFLAGS="-DSVR4" + else + apr_addto_bugger="-DSVR4" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + + if test "x$CFLAGS" = "x"; then + echo " setting CFLAGS to \"-Xa\"" + CFLAGS="-Xa" + else + apr_addto_bugger="-Xa" + 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 + echo " adding \"$i\" to CFLAGS" + CFLAGS="$CFLAGS $i" + fi + done + fi + + ;; + esac + ;; + *-ultrix) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DULTRIX\"" + CPPFLAGS="-DULTRIX" + else + apr_addto_bugger="-DULTRIX" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + + echo " forcing SHELL to \"/bin/sh5\"" + SHELL="/bin/sh5" + + ;; + *powerpc-tenon-machten*) + + if test "x$LDFLAGS" = "x"; then + echo " setting LDFLAGS to \"-Xlstack=0x14000 -Xldelcsect\"" + LDFLAGS="-Xlstack=0x14000 -Xldelcsect" + else + apr_addto_bugger="-Xlstack=0x14000 -Xldelcsect" + 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 + echo " adding \"$i\" to LDFLAGS" + LDFLAGS="$LDFLAGS $i" + fi + done + fi + + ;; + *-machten*) + + if test "x$LDFLAGS" = "x"; then + echo " setting LDFLAGS to \"-stack 0x14000\"" + LDFLAGS="-stack 0x14000" + else + apr_addto_bugger="-stack 0x14000" + 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 + echo " adding \"$i\" to LDFLAGS" + LDFLAGS="$LDFLAGS $i" + fi + done + fi + + ;; + *convex-v11*) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DCONVEXOS11\"" + CPPFLAGS="-DCONVEXOS11" + else + apr_addto_bugger="-DCONVEXOS11" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + + if test -z "$CFLAGS"; then + echo " setting CFLAGS to \"-O1\"" + CFLAGS="-O1" + fi + + + if test "x$CFLAGS" = "x"; then + echo " setting CFLAGS to \"-ext\"" + CFLAGS="-ext" + else + apr_addto_bugger="-ext" + 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 + echo " adding \"$i\" to CFLAGS" + CFLAGS="$CFLAGS $i" + fi + done + fi + + ;; + i860-intel-osf1) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DPARAGON\"" + CPPFLAGS="-DPARAGON" + else + apr_addto_bugger="-DPARAGON" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + ;; + *-sequent-ptx2.*.*) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DSEQUENT=20\"" + CPPFLAGS="-DSEQUENT=20" + else + apr_addto_bugger="-DSEQUENT=20" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + + if test "x$CFLAGS" = "x"; then + echo " setting CFLAGS to \"-Wc,-pw\"" + CFLAGS="-Wc,-pw" + else + apr_addto_bugger="-Wc,-pw" + 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 + echo " adding \"$i\" to CFLAGS" + CFLAGS="$CFLAGS $i" + fi + done + fi + + + if test "x$LIBS" = "x"; then + echo " setting LIBS to \"-linet -lc -lseq\"" + LIBS="-linet -lc -lseq" + else + apr_addto_bugger="-linet -lc -lseq" + 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 + echo " adding \"$i\" to LIBS" + LIBS="$LIBS $i" + fi + done + fi + + ;; + *-sequent-ptx4.0.*) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DSEQUENT=40\"" + CPPFLAGS="-DSEQUENT=40" + else + apr_addto_bugger="-DSEQUENT=40" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + + if test "x$CFLAGS" = "x"; then + echo " setting CFLAGS to \"-Wc,-pw\"" + CFLAGS="-Wc,-pw" + else + apr_addto_bugger="-Wc,-pw" + 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 + echo " adding \"$i\" to CFLAGS" + CFLAGS="$CFLAGS $i" + fi + done + fi + + + if test "x$LIBS" = "x"; then + echo " setting LIBS to \"-linet -lc\"" + LIBS="-linet -lc" + else + apr_addto_bugger="-linet -lc" + 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 + echo " adding \"$i\" to LIBS" + LIBS="$LIBS $i" + fi + done + fi + + ;; + *-sequent-ptx4.[123].*) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DSEQUENT=41\"" + CPPFLAGS="-DSEQUENT=41" + else + apr_addto_bugger="-DSEQUENT=41" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + + if test "x$CFLAGS" = "x"; then + echo " setting CFLAGS to \"-Wc,-pw\"" + CFLAGS="-Wc,-pw" + else + apr_addto_bugger="-Wc,-pw" + 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 + echo " adding \"$i\" to CFLAGS" + CFLAGS="$CFLAGS $i" + fi + done + fi + + + if test "x$LIBS" = "x"; then + echo " setting LIBS to \"-lc\"" + LIBS="-lc" + else + apr_addto_bugger="-lc" + 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 + echo " adding \"$i\" to LIBS" + LIBS="$LIBS $i" + fi + done + fi + + ;; + *-sequent-ptx4.4.*) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DSEQUENT=44\"" + CPPFLAGS="-DSEQUENT=44" + else + apr_addto_bugger="-DSEQUENT=44" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + + if test "x$CFLAGS" = "x"; then + echo " setting CFLAGS to \"-Wc,-pw\"" + CFLAGS="-Wc,-pw" + else + apr_addto_bugger="-Wc,-pw" + 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 + echo " adding \"$i\" to CFLAGS" + CFLAGS="$CFLAGS $i" + fi + done + fi + + + if test "x$LIBS" = "x"; then + echo " setting LIBS to \"-lc\"" + LIBS="-lc" + else + apr_addto_bugger="-lc" + 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 + echo " adding \"$i\" to LIBS" + LIBS="$LIBS $i" + fi + done + fi + + ;; + *-sequent-ptx4.5.*) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DSEQUENT=45\"" + CPPFLAGS="-DSEQUENT=45" + else + apr_addto_bugger="-DSEQUENT=45" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + + if test "x$CFLAGS" = "x"; then + echo " setting CFLAGS to \"-Wc,-pw\"" + CFLAGS="-Wc,-pw" + else + apr_addto_bugger="-Wc,-pw" + 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 + echo " adding \"$i\" to CFLAGS" + CFLAGS="$CFLAGS $i" + fi + done + fi + + + if test "x$LIBS" = "x"; then + echo " setting LIBS to \"-lc\"" + LIBS="-lc" + else + apr_addto_bugger="-lc" + 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 + echo " adding \"$i\" to LIBS" + LIBS="$LIBS $i" + fi + done + fi + + ;; + *-sequent-ptx5.0.*) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DSEQUENT=50\"" + CPPFLAGS="-DSEQUENT=50" + else + apr_addto_bugger="-DSEQUENT=50" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + + if test "x$CFLAGS" = "x"; then + echo " setting CFLAGS to \"-Wc,-pw\"" + CFLAGS="-Wc,-pw" + else + apr_addto_bugger="-Wc,-pw" + 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 + echo " adding \"$i\" to CFLAGS" + CFLAGS="$CFLAGS $i" + fi + done + fi + + + if test "x$LIBS" = "x"; then + echo " setting LIBS to \"-lc\"" + LIBS="-lc" + else + apr_addto_bugger="-lc" + 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 + echo " adding \"$i\" to LIBS" + LIBS="$LIBS $i" + fi + done + fi + + ;; + *NEWS-OS*) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DNEWSOS\"" + CPPFLAGS="-DNEWSOS" + else + apr_addto_bugger="-DNEWSOS" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + ;; + *-riscix) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DRISCIX\"" + CPPFLAGS="-DRISCIX" + else + apr_addto_bugger="-DRISCIX" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + + if test -z "$CFLAGS"; then + echo " setting CFLAGS to \"-O\"" + CFLAGS="-O" + fi + + ;; + *-irix*) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-D_POSIX_THREAD_SAFE_FUNCTIONS\"" + CPPFLAGS="-D_POSIX_THREAD_SAFE_FUNCTIONS" + else + apr_addto_bugger="-D_POSIX_THREAD_SAFE_FUNCTIONS" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + ;; + *beos*) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DBEOS\"" + CPPFLAGS="-DBEOS" + else + apr_addto_bugger="-DBEOS" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + PLATOSVERS=`uname -r` + + if test -z "$apr_process_lock_is_global"; then + echo " setting apr_process_lock_is_global to \"yes\"" + apr_process_lock_is_global="yes" + fi + + case $PLATOSVERS in + 5.0.4) + + if test "x$LDFLAGS" = "x"; then + echo " setting LDFLAGS to \"-L/boot/beos/system/lib\"" + LDFLAGS="-L/boot/beos/system/lib" + else + apr_addto_bugger="-L/boot/beos/system/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 + echo " adding \"$i\" to LDFLAGS" + LDFLAGS="$LDFLAGS $i" + fi + done + fi + + + if test "x$LIBS" = "x"; then + echo " setting LIBS to \"-lbind -lsocket\"" + LIBS="-lbind -lsocket" + else + apr_addto_bugger="-lbind -lsocket" + 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 + echo " adding \"$i\" to LIBS" + LIBS="$LIBS $i" + fi + done + fi + + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DBONE7\"" + CPPFLAGS="-DBONE7" + else + apr_addto_bugger="-DBONE7" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + ;; + 5.1) + + if test "x$LDFLAGS" = "x"; then + echo " setting LDFLAGS to \"-L/boot/beos/system/lib\"" + LDFLAGS="-L/boot/beos/system/lib" + else + apr_addto_bugger="-L/boot/beos/system/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 + echo " adding \"$i\" to LDFLAGS" + LDFLAGS="$LDFLAGS $i" + fi + done + fi + + + if test "x$LIBS" = "x"; then + echo " setting LIBS to \"-lbind -lsocket\"" + LIBS="-lbind -lsocket" + else + apr_addto_bugger="-lbind -lsocket" + 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 + echo " adding \"$i\" to LIBS" + LIBS="$LIBS $i" + fi + done + fi + + ;; + esac + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DSIGPROCMASK_SETS_THREAD_MASK -DAP_AUTH_DBM_USE_APR\"" + CPPFLAGS="-DSIGPROCMASK_SETS_THREAD_MASK -DAP_AUTH_DBM_USE_APR" + else + apr_addto_bugger="-DSIGPROCMASK_SETS_THREAD_MASK -DAP_AUTH_DBM_USE_APR" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + ;; + 4850-*.*) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DSVR4 -DMPRAS\"" + CPPFLAGS="-DSVR4 -DMPRAS" + else + apr_addto_bugger="-DSVR4 -DMPRAS" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + + if test "x$LIBS" = "x"; then + echo " setting LIBS to \"-lc -L/usr/ucblib -lucb\"" + LIBS="-lc -L/usr/ucblib -lucb" + else + apr_addto_bugger="-lc -L/usr/ucblib -lucb" + 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 + echo " adding \"$i\" to LIBS" + LIBS="$LIBS $i" + fi + done + fi + + ;; + drs6000*) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DSVR4\"" + CPPFLAGS="-DSVR4" + else + apr_addto_bugger="-DSVR4" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + + if test "x$LIBS" = "x"; then + echo " setting LIBS to \"-lc -L/usr/ucblib -lucb\"" + LIBS="-lc -L/usr/ucblib -lucb" + else + apr_addto_bugger="-lc -L/usr/ucblib -lucb" + 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 + echo " adding \"$i\" to LIBS" + LIBS="$LIBS $i" + fi + done + fi + + ;; + m88k-*-CX/SX|CYBER) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-D_CX_SX\"" + CPPFLAGS="-D_CX_SX" + else + apr_addto_bugger="-D_CX_SX" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + + if test "x$CFLAGS" = "x"; then + echo " setting CFLAGS to \"-Xa\"" + CFLAGS="-Xa" + else + apr_addto_bugger="-Xa" + 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 + echo " adding \"$i\" to CFLAGS" + CFLAGS="$CFLAGS $i" + fi + done + fi + + ;; + *-tandem-oss) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-D_TANDEM_SOURCE -D_XOPEN_SOURCE_EXTENDED=1\"" + CPPFLAGS="-D_TANDEM_SOURCE -D_XOPEN_SOURCE_EXTENDED=1" + else + apr_addto_bugger="-D_TANDEM_SOURCE -D_XOPEN_SOURCE_EXTENDED=1" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + ;; + *-ibm-os390) + + if test -z "$apr_lock_method"; then + echo " setting apr_lock_method to \"USE_SYSVSEM_SERIALIZE\"" + apr_lock_method="USE_SYSVSEM_SERIALIZE" + fi + + + if test -z "$apr_sysvsem_is_global"; then + echo " setting apr_sysvsem_is_global to \"yes\"" + apr_sysvsem_is_global="yes" + fi + + + if test -z "$apr_gethostbyname_is_thread_safe"; then + echo " setting apr_gethostbyname_is_thread_safe to \"yes\"" + apr_gethostbyname_is_thread_safe="yes" + fi + + + if test -z "$apr_gethostbyaddr_is_thread_safe"; then + echo " setting apr_gethostbyaddr_is_thread_safe to \"yes\"" + apr_gethostbyaddr_is_thread_safe="yes" + fi + + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-U_NO_PROTO -DPTHREAD_ATTR_SETDETACHSTATE_ARG2_ADDR -DPTHREAD_SETS_ERRNO -DPTHREAD_DETACH_ARG1_ADDR -DSIGPROCMASK_SETS_THREAD_MASK -DTCP_NODELAY=1\"" + CPPFLAGS="-U_NO_PROTO -DPTHREAD_ATTR_SETDETACHSTATE_ARG2_ADDR -DPTHREAD_SETS_ERRNO -DPTHREAD_DETACH_ARG1_ADDR -DSIGPROCMASK_SETS_THREAD_MASK -DTCP_NODELAY=1" + else + apr_addto_bugger="-U_NO_PROTO -DPTHREAD_ATTR_SETDETACHSTATE_ARG2_ADDR -DPTHREAD_SETS_ERRNO -DPTHREAD_DETACH_ARG1_ADDR -DSIGPROCMASK_SETS_THREAD_MASK -DTCP_NODELAY=1" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + ;; + *-ibm-as400) + + if test -z "$apr_lock_method"; then + echo " setting apr_lock_method to \"USE_SYSVSEM_SERIALIZE\"" + apr_lock_method="USE_SYSVSEM_SERIALIZE" + fi + + + if test -z "$apr_process_lock_is_global"; then + echo " setting apr_process_lock_is_global to \"yes\"" + apr_process_lock_is_global="yes" + fi + + + if test -z "$apr_gethostbyname_is_thread_safe"; then + echo " setting apr_gethostbyname_is_thread_safe to \"yes\"" + apr_gethostbyname_is_thread_safe="yes" + fi + + + if test -z "$apr_gethostbyaddr_is_thread_safe"; then + echo " setting apr_gethostbyaddr_is_thread_safe to \"yes\"" + apr_gethostbyaddr_is_thread_safe="yes" + fi + + ;; + *cygwin*) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DCYGWIN\"" + CPPFLAGS="-DCYGWIN" + else + apr_addto_bugger="-DCYGWIN" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + + if test "x$LIBS" = "x"; then + echo " setting LIBS to \"-lcrypt\"" + LIBS="-lcrypt" + else + apr_addto_bugger="-lcrypt" + 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 + echo " adding \"$i\" to LIBS" + LIBS="$LIBS $i" + fi + done + fi + + ;; + esac + +fi + + +DEFAULT_OSDIR="unix" +echo "(Default will be ${DEFAULT_OSDIR})" + +apr_modules="file_io network_io threadproc misc locks time mmap shmem user memory atomic poll support" + +{ $as_echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +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 +{ $as_echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 +$as_echo_n "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+set}" = set; then + $as_echo_n "(cached) " >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-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. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # 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 >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi + +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + # Broken: success on invalid input. +continue +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi + +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +{ $as_echo "$as_me:$LINENO: result: $CPP" >&5 +$as_echo "$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. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # 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 >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi + +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + # Broken: success on invalid input. +continue +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi + +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + : +else + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } +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 + +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 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_AWK+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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 + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { $as_echo "$as_me:$LINENO: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ $as_echo "$as_me:$LINENO: checking whether ln -s works" >&5 +$as_echo_n "checking whether ln -s works... " >&6; } +LN_S=$as_ln_s +if test "$LN_S" = "ln -s"; then + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no, using $LN_S" >&5 +$as_echo "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 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_RANLIB+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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 + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { $as_echo "$as_me:$LINENO: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "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 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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 + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$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 + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if test "${ac_cv_path_install+set}" = set; then + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in + ./ | .// | /cC/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + +done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:$LINENO: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +# Extract the first word of "rm", so it can be a program name with args. +set dummy rm; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_RM+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$RM"; then + ac_cv_prog_RM="$RM" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_RM="rm" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +RM=$ac_cv_prog_RM +if test -n "$RM"; then + { $as_echo "$as_me:$LINENO: result: $RM" >&5 +$as_echo "$RM" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of "as", so it can be a program name with args. +set dummy as; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_AS+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$AS"; then + ac_cv_prog_AS="$AS" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_AS="as" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +AS=$ac_cv_prog_AS +if test -n "$AS"; then + { $as_echo "$as_me:$LINENO: result: $AS" >&5 +$as_echo "$AS" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of "cpp", so it can be a program name with args. +set dummy cpp; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ASCPP+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$ASCPP"; then + ac_cv_prog_ASCPP="$ASCPP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ASCPP="cpp" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ASCPP=$ac_cv_prog_ASCPP +if test -n "$ASCPP"; then + { $as_echo "$as_me:$LINENO: result: $ASCPP" >&5 +$as_echo "$ASCPP" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. +set dummy ${ac_tool_prefix}ar; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_AR+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_AR="${ac_tool_prefix}ar" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { $as_echo "$as_me:$LINENO: result: $AR" >&5 +$as_echo "$AR" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_AR"; then + ac_ct_AR=$AR + # Extract the first word of "ar", so it can be a program name with args. +set dummy ar; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_AR+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_AR="ar" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_AR" >&5 +$as_echo "$ac_ct_AR" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_AR" = x; then + AR="ar" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +else + AR="$ac_cv_prog_AR" +fi + + + + + +{ $as_echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5 +$as_echo_n "checking for grep that handles long lines and -e... " >&6; } +if test "${ac_cv_path_GREP+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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 + test -z "$as_dir" && as_dir=. + 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" + { test -f "$ac_path_GREP" && $as_test_x "$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 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo '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 + ac_count=`expr $ac_count + 1` + 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_echo "$as_me:$LINENO: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 +$as_echo "$as_me: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} + { (exit 1); exit 1; }; } + fi +else + ac_cv_path_GREP=$GREP +fi + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5 +$as_echo "$ac_cv_path_GREP" >&6; } + GREP="$ac_cv_path_GREP" + + +{ $as_echo "$as_me:$LINENO: checking for egrep" >&5 +$as_echo_n "checking for egrep... " >&6; } +if test "${ac_cv_path_EGREP+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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 + test -z "$as_dir" && as_dir=. + 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" + { test -f "$ac_path_EGREP" && $as_test_x "$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 + $as_echo_n 0123456789 >"conftest.in" + while : + do + cat "conftest.in" "conftest.in" >"conftest.tmp" + mv "conftest.tmp" "conftest.in" + cp "conftest.in" "conftest.nl" + $as_echo '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 + ac_count=`expr $ac_count + 1` + 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_echo "$as_me:$LINENO: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 +$as_echo "$as_me: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} + { (exit 1); exit 1; }; } + fi +else + ac_cv_path_EGREP=$EGREP +fi + + fi +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5 +$as_echo "$ac_cv_path_EGREP" >&6; } + EGREP="$ac_cv_path_EGREP" + + +{ $as_echo "$as_me:$LINENO: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if test "${ac_cv_header_stdc+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_header_stdc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_header_stdc=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then + : +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_header_stdc=no +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +cat >>confdefs.h <<\_ACEOF +#define STDC_HEADERS 1 +_ACEOF + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. + + + + + + + + + +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + eval "$as_ac_Header=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_Header=no" +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + + if test "${ac_cv_header_minix_config_h+set}" = set; then + { $as_echo "$as_me:$LINENO: checking for minix/config.h" >&5 +$as_echo_n "checking for minix/config.h... " >&6; } +if test "${ac_cv_header_minix_config_h+set}" = set; then + $as_echo_n "(cached) " >&6 +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_minix_config_h" >&5 +$as_echo "$ac_cv_header_minix_config_h" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:$LINENO: checking minix/config.h usability" >&5 +$as_echo_n "checking minix/config.h usability... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:$LINENO: checking minix/config.h presence" >&5 +$as_echo_n "checking minix/config.h presence... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: minix/config.h: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: minix/config.h: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: minix/config.h: present but cannot be compiled" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: minix/config.h: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: minix/config.h: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: minix/config.h: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: proceeding with the preprocessor's result" >&5 +$as_echo "$as_me: WARNING: minix/config.h: proceeding with the preprocessor's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: minix/config.h: in the future, the compiler will take precedence" >&5 +$as_echo "$as_me: WARNING: minix/config.h: in the future, the compiler will take precedence" >&2;} + + ;; +esac +{ $as_echo "$as_me:$LINENO: checking for minix/config.h" >&5 +$as_echo_n "checking for minix/config.h... " >&6; } +if test "${ac_cv_header_minix_config_h+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_header_minix_config_h=$ac_header_preproc +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_minix_config_h" >&5 +$as_echo "$ac_cv_header_minix_config_h" >&6; } + +fi +if test "x$ac_cv_header_minix_config_h" = x""yes; then + MINIX=yes +else + MINIX= +fi + + + if test "$MINIX" = yes; then + +cat >>confdefs.h <<\_ACEOF +#define _POSIX_SOURCE 1 +_ACEOF + + +cat >>confdefs.h <<\_ACEOF +#define _POSIX_1_SOURCE 2 +_ACEOF + + +cat >>confdefs.h <<\_ACEOF +#define _MINIX 1 +_ACEOF + + fi + + + + { $as_echo "$as_me:$LINENO: checking whether it is safe to define __EXTENSIONS__" >&5 +$as_echo_n "checking whether it is safe to define __EXTENSIONS__... " >&6; } +if test "${ac_cv_safe_to_define___extensions__+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +# define __EXTENSIONS__ 1 + $ac_includes_default +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_safe_to_define___extensions__=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_safe_to_define___extensions__=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_safe_to_define___extensions__" >&5 +$as_echo "$ac_cv_safe_to_define___extensions__" >&6; } + test $ac_cv_safe_to_define___extensions__ = yes && + cat >>confdefs.h <<\_ACEOF +#define __EXTENSIONS__ 1 +_ACEOF + + cat >>confdefs.h <<\_ACEOF +#define _ALL_SOURCE 1 +_ACEOF + + cat >>confdefs.h <<\_ACEOF +#define _GNU_SOURCE 1 +_ACEOF + + cat >>confdefs.h <<\_ACEOF +#define _POSIX_PTHREAD_SEMANTICS 1 +_ACEOF + + cat >>confdefs.h <<\_ACEOF +#define _TANDEM_SOURCE 1 +_ACEOF + + + + +{ $as_echo "$as_me:$LINENO: checking for library containing strerror" >&5 +$as_echo_n "checking for library containing strerror... " >&6; } +if test "${ac_cv_search_strerror+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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. */ +#ifdef __cplusplus +extern "C" +#endif +char strerror (); +int +main () +{ +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 + rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_search_strerror=$ac_res +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext + if test "${ac_cv_search_strerror+set}" = set; then + break +fi +done +if test "${ac_cv_search_strerror+set}" = set; then + : +else + ac_cv_search_strerror=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_search_strerror" >&5 +$as_echo "$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 + + + { $as_echo "$as_me:$LINENO: checking whether system uses EBCDIC" >&5 +$as_echo_n "checking whether system uses EBCDIC... " >&6; } +if test "${ac_cv_ebcdic+set}" = set; then + $as_echo_n "(cached) " >&6 +else + + if test "$cross_compiling" = yes; then + + ac_cv_ebcdic="no" + +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int main(void) { + return (unsigned char)'A' != (unsigned char)0xC1; +} + +_ACEOF +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + + ac_cv_ebcdic="yes" + +else + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) + + ac_cv_ebcdic="no" + +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_ebcdic" >&5 +$as_echo "$ac_cv_ebcdic" >&6; } + if test "$ac_cv_ebcdic" = "yes"; then + apr_charset_ebcdic=1 + else + apr_charset_ebcdic=0 + fi + + + +APR_LIBNAME="apr${libsuffix}" + + +echo "performing libtool configuration..." + +# Check whether --enable-experimental-libtool was given. +if test "${enable_experimental_libtool+set}" = set; then + enableval=$enable_experimental_libtool; experimental_libtool=$enableval +else + experimental_libtool=no +fi + + +case $host in +*os2*) + # Use a custom-made libtool replacement + echo "using aplibtool" + LIBTOOL="$srcdir/build/aplibtool" + gcc $CFLAGS $CPPFLAGS -o $LIBTOOL.exe $LIBTOOL.c + ;; +*) + if test "x$LTFLAGS" = "x"; then + LTFLAGS='--silent' + fi + if test "$experimental_libtool" = "yes"; then + # Use a custom-made libtool replacement + echo "using jlibtool" + LIBTOOL="$apr_builddir/libtool" + LIBTOOL_SRC="$apr_srcdir/build/jlibtool.c" + if test ! -f $LIBTOOL_SRC; then + { { $as_echo "$as_me:$LINENO: error: Experimental libtool source not found. It is not included with APR by default." >&5 +$as_echo "$as_me: error: Experimental libtool source not found. It is not included with APR by default." >&2;} + { (exit 1); exit 1; }; } + fi + $CC $CFLAGS $CPPFLAGS -o $LIBTOOL $LIBTOOL_SRC + else + # Check whether --enable-shared was given. +if test "${enable_shared+set}" = set; then + enableval=$enable_shared; p=${PACKAGE-default} + case $enableval in + yes) enable_shared=yes ;; + no) enable_shared=no ;; + *) + enable_shared=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_shared=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_shared=yes +fi + + +# Check whether --enable-static was given. +if test "${enable_static+set}" = set; then + enableval=$enable_static; p=${PACKAGE-default} + case $enableval in + yes) enable_static=yes ;; + no) enable_static=no ;; + *) + enable_static=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_static=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_static=yes +fi + + +# Check whether --enable-fast-install was given. +if test "${enable_fast_install+set}" = set; then + enableval=$enable_fast_install; p=${PACKAGE-default} + case $enableval in + yes) enable_fast_install=yes ;; + no) enable_fast_install=no ;; + *) + enable_fast_install=no + # Look at the argument we got. We use all the common list separators. + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for pkg in $enableval; do + IFS="$lt_save_ifs" + if test "X$pkg" = "X$p"; then + enable_fast_install=yes + fi + done + IFS="$lt_save_ifs" + ;; + esac +else + enable_fast_install=yes +fi + + +{ $as_echo "$as_me:$LINENO: checking for a sed that does not truncate output" >&5 +$as_echo_n "checking for a sed that does not truncate output... " >&6; } +if test "${lt_cv_path_SED+set}" = set; then + $as_echo_n "(cached) " >&6 +else + # Loop through the user's path and test for sed and gsed. +# Then use that list of sed's as ones to test for truncation. +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for lt_ac_prog in sed gsed; do + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$lt_ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$lt_ac_prog$ac_exec_ext"; }; then + lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext" + fi + done + done +done +IFS=$as_save_IFS +lt_ac_max=0 +lt_ac_count=0 +# Add /usr/xpg4/bin/sed as it is typically found on Solaris +# along with /bin/sed that truncates output. +for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do + test ! -f $lt_ac_sed && continue + cat /dev/null > conftest.in + lt_ac_count=0 + echo $ECHO_N "0123456789$ECHO_C" >conftest.in + # Check for GNU sed and select it if it is found. + if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then + lt_cv_path_SED=$lt_ac_sed + break + fi + while true; do + cat conftest.in conftest.in >conftest.tmp + mv conftest.tmp conftest.in + cp conftest.in conftest.nl + echo >>conftest.nl + $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break + cmp -s conftest.out conftest.nl || break + # 10000 chars as input seems more than enough + test $lt_ac_count -gt 10 && break + lt_ac_count=`expr $lt_ac_count + 1` + if test $lt_ac_count -gt $lt_ac_max; then + lt_ac_max=$lt_ac_count + lt_cv_path_SED=$lt_ac_sed + fi + done +done + +fi + +SED=$lt_cv_path_SED + +{ $as_echo "$as_me:$LINENO: result: $SED" >&5 +$as_echo "$SED" >&6; } + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:$LINENO: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + { $as_echo "$as_me:$LINENO: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:$LINENO: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if test "${lt_cv_path_LD+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && { { $as_echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 +$as_echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} + { (exit 1); exit 1; }; } +{ $as_echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if test "${lt_cv_prog_gnu_ld+set}" = set; then + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + +{ $as_echo "$as_me:$LINENO: checking for $LD option to reload object files" >&5 +$as_echo_n "checking for $LD option to reload object files... " >&6; } +if test "${lt_cv_ld_reload_flag+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_reload_flag='-r' +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_ld_reload_flag" >&5 +$as_echo "$lt_cv_ld_reload_flag" >&6; } +reload_flag=$lt_cv_ld_reload_flag +case $reload_flag in +"" | " "*) ;; +*) reload_flag=" $reload_flag" ;; +esac +reload_cmds='$LD$reload_flag -o $output$reload_objs' +case $host_os in + darwin*) + if test "$GCC" = yes; then + reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs' + else + reload_cmds='$LD$reload_flag -o $output$reload_objs' + fi + ;; +esac + +{ $as_echo "$as_me:$LINENO: checking for BSD-compatible nm" >&5 +$as_echo_n "checking for BSD-compatible nm... " >&6; } +if test "${lt_cv_path_NM+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$NM"; then + # Let the user override the test. + lt_cv_path_NM="$NM" +else + lt_nm_to_check="${ac_tool_prefix}nm" + if test -n "$ac_tool_prefix" && test "$build" = "$host"; then + lt_nm_to_check="$lt_nm_to_check nm" + fi + for lt_tmp_nm in $lt_nm_to_check; do + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + tmp_nm="$ac_dir/$lt_tmp_nm" + if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then + # Check to see if the nm accepts a BSD-compat flag. + # Adding the `sed 1q' prevents false positives on HP-UX, which says: + # nm: unknown option "B" ignored + # Tru64's nm complains that /dev/null is an invalid object file + case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in + */dev/null* | *'Invalid file or object type'*) + lt_cv_path_NM="$tmp_nm -B" + break + ;; + *) + case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in + */dev/null*) + lt_cv_path_NM="$tmp_nm -p" + break + ;; + *) + lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but + continue # so that we can try to find one that supports BSD flags + ;; + esac + ;; + esac + fi + done + IFS="$lt_save_ifs" + done + test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm +fi +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_path_NM" >&5 +$as_echo "$lt_cv_path_NM" >&6; } +NM="$lt_cv_path_NM" + +{ $as_echo "$as_me:$LINENO: checking how to recognize dependent libraries" >&5 +$as_echo_n "checking how to recognize dependent libraries... " >&6; } +if test "${lt_cv_deplibs_check_method+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_file_magic_cmd='$MAGIC_CMD' +lt_cv_file_magic_test_file= +lt_cv_deplibs_check_method='unknown' +# Need to set the preceding variable on all platforms that support +# interlibrary dependencies. +# 'none' -- dependencies not supported. +# `unknown' -- same as none, but documents that we really don't know. +# 'pass_all' -- all dependencies passed with no checks. +# 'test_compile' -- check by making test program. +# 'file_magic [[regex]]' -- check by looking for files in library path +# which responds to the $file_magic_cmd with a given extended regex. +# If you have `file' or equivalent on your system and you're not sure +# whether `pass_all' will *always* work, you probably want this one. + +case $host_os in +aix[4-9]*) + lt_cv_deplibs_check_method=pass_all + ;; + +beos*) + lt_cv_deplibs_check_method=pass_all + ;; + +bsdi[45]*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)' + lt_cv_file_magic_cmd='/usr/bin/file -L' + lt_cv_file_magic_test_file=/shlib/libc.so + ;; + +cygwin*) + # func_win32_libid is a shell function defined in ltmain.sh + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + ;; + +mingw* | pw32*) + # Base MSYS/MinGW do not provide the 'file' command needed by + # func_win32_libid shell function, so use a weaker test based on 'objdump', + # unless we find 'file', for example because we are cross-compiling. + if ( file / ) >/dev/null 2>&1; then + lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL' + lt_cv_file_magic_cmd='func_win32_libid' + else + lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?' + lt_cv_file_magic_cmd='$OBJDUMP -f' + fi + ;; + +darwin* | rhapsody*) + lt_cv_deplibs_check_method=pass_all + ;; + +freebsd* | dragonfly*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + case $host_cpu in + i*86 ) + # Not sure whether the presence of OpenBSD here was a mistake. + # Let's accept both of them until this is cleared up. + lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*` + ;; + esac + else + lt_cv_deplibs_check_method=pass_all + fi + ;; + +gnu*) + lt_cv_deplibs_check_method=pass_all + ;; + +hpux10.20* | hpux11*) + lt_cv_file_magic_cmd=/usr/bin/file + case $host_cpu in + ia64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64' + lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so + ;; + hppa*64*) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]' + lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl + ;; + *) + lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library' + lt_cv_file_magic_test_file=/usr/lib/libc.sl + ;; + esac + ;; + +interix[3-9]*) + # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|\.a)$' + ;; + +irix5* | irix6* | nonstopux*) + case $LD in + *-32|*"-32 ") libmagic=32-bit;; + *-n32|*"-n32 ") libmagic=N32;; + *-64|*"-64 ") libmagic=64-bit;; + *) libmagic=never-match;; + esac + lt_cv_deplibs_check_method=pass_all + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu) + lt_cv_deplibs_check_method=pass_all + ;; + +netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so|_pic\.a)$' + fi + ;; + +newos6*) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)' + lt_cv_file_magic_cmd=/usr/bin/file + lt_cv_file_magic_test_file=/usr/lib/libnls.so + ;; + +nto-qnx*) + lt_cv_deplibs_check_method=unknown + ;; + +openbsd*) + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|\.so|_pic\.a)$' + else + lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\.so\.[0-9]+\.[0-9]+|_pic\.a)$' + fi + ;; + +osf3* | osf4* | osf5*) + lt_cv_deplibs_check_method=pass_all + ;; + +rdos*) + lt_cv_deplibs_check_method=pass_all + ;; + +solaris*) + lt_cv_deplibs_check_method=pass_all + ;; + +sysv4 | sysv4.3*) + case $host_vendor in + motorola) + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]' + lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*` + ;; + ncr) + lt_cv_deplibs_check_method=pass_all + ;; + sequent) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )' + ;; + sni) + lt_cv_file_magic_cmd='/bin/file' + lt_cv_deplibs_check_method="file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib" + lt_cv_file_magic_test_file=/lib/libc.so + ;; + siemens) + lt_cv_deplibs_check_method=pass_all + ;; + pc) + lt_cv_deplibs_check_method=pass_all + ;; + esac + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + lt_cv_deplibs_check_method=pass_all + ;; +esac + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_deplibs_check_method" >&5 +$as_echo "$lt_cv_deplibs_check_method" >&6; } +file_magic_cmd=$lt_cv_file_magic_cmd +deplibs_check_method=$lt_cv_deplibs_check_method +test -z "$deplibs_check_method" && deplibs_check_method=unknown + + + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + +# Check whether --enable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then + enableval=$enable_libtool_lock; +fi + +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + +# Some flags need to be propagated to the compiler or linker for good +# libtool support. +case $host in +ia64-*-hpux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + case `/usr/bin/file conftest.$ac_objext` in + *ELF-32*) + HPUX_IA64_MODE="32" + ;; + *ELF-64*) + HPUX_IA64_MODE="64" + ;; + esac + fi + rm -rf conftest* + ;; +*-*-irix6*) + # Find out which ABI we are using. + echo '#line 9566 "configure"' > conftest.$ac_ext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + if test "$lt_cv_prog_gnu_ld" = yes; then + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -melf32bsmip" + ;; + *N32*) + LD="${LD-ld} -melf32bmipn32" + ;; + *64-bit*) + LD="${LD-ld} -melf64bmip" + ;; + esac + else + case `/usr/bin/file conftest.$ac_objext` in + *32-bit*) + LD="${LD-ld} -32" + ;; + *N32*) + LD="${LD-ld} -n32" + ;; + *64-bit*) + LD="${LD-ld} -64" + ;; + esac + fi + fi + rm -rf conftest* + ;; + +x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \ +s390*-*linux*|sparc*-*linux*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + case `/usr/bin/file conftest.o` in + *32-bit*) + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_i386_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_i386" + ;; + ppc64-*linux*|powerpc64-*linux*) + LD="${LD-ld} -m elf32ppclinux" + ;; + s390x-*linux*) + LD="${LD-ld} -m elf_s390" + ;; + sparc64-*linux*) + LD="${LD-ld} -m elf32_sparc" + ;; + esac + ;; + *64-bit*) + libsuff=64 + case $host in + x86_64-*kfreebsd*-gnu) + LD="${LD-ld} -m elf_x86_64_fbsd" + ;; + x86_64-*linux*) + LD="${LD-ld} -m elf_x86_64" + ;; + ppc*-*linux*|powerpc*-*linux*) + LD="${LD-ld} -m elf64ppc" + ;; + s390*-*linux*) + LD="${LD-ld} -m elf64_s390" + ;; + sparc*-*linux*) + LD="${LD-ld} -m elf64_sparc" + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + +*-*-sco3.2v5*) + # On SCO OpenServer 5, we need -belf to get full-featured binaries. + SAVE_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS -belf" + { $as_echo "$as_me:$LINENO: checking whether the C compiler needs -belf" >&5 +$as_echo_n "checking whether the C compiler needs -belf... " >&6; } +if test "${lt_cv_cc_needs_belf+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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 + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + lt_cv_cc_needs_belf=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + lt_cv_cc_needs_belf=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext + 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 + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_cc_needs_belf" >&5 +$as_echo "$lt_cv_cc_needs_belf" >&6; } + if test x"$lt_cv_cc_needs_belf" != x"yes"; then + # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf + CFLAGS="$SAVE_CFLAGS" + fi + ;; +sparc*-*solaris*) + # Find out which ABI we are using. + echo 'int i;' > conftest.$ac_ext + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + case `/usr/bin/file conftest.o` in + *64-bit*) + case $lt_cv_prog_gnu_ld in + yes*) LD="${LD-ld} -m elf64_sparc" ;; + *) + if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then + LD="${LD-ld} -64" + fi + ;; + esac + ;; + esac + fi + rm -rf conftest* + ;; + + +esac + +need_locks="$enable_libtool_lock" + + + +for ac_header in dlfcn.h +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 +$as_echo_n "checking $ac_header usability... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 +$as_echo_n "checking $ac_header presence... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + + ;; +esac +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + +fi +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -z "$CXX"; then + if test -n "$CCC"; then + CXX=$CCC + else + if test -n "$ac_tool_prefix"; then + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC + 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 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_CXX+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + { $as_echo "$as_me:$LINENO: result: $CXX" >&5 +$as_echo "$CXX" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 +$as_echo "$ac_ct_CXX" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CXX" && break +done + + if test "x$ac_ct_CXX" = x; then + CXX="g++" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CXX=$ac_ct_CXX + fi +fi + + fi +fi +# Provide some information about the compiler. +$as_echo "$as_me:$LINENO: checking for C++ compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +{ (ac_try="$ac_compiler --version >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler --version >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -v >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -v >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -V >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -V >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +{ $as_echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 +$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } +if test "${ac_cv_cxx_compiler_gnu+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_compiler_gnu=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_compiler_gnu=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 +$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GXX=yes +else + GXX= +fi +ac_test_CXXFLAGS=${CXXFLAGS+set} +ac_save_CXXFLAGS=$CXXFLAGS +{ $as_echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 +$as_echo_n "checking whether $CXX accepts -g... " >&6; } +if test "${ac_cv_prog_cxx_g+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cxx_g=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + CXXFLAGS="" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_cxx_g=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cxx_werror_flag=$ac_save_cxx_werror_flag +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 +$as_echo "$ac_cv_prog_cxx_g" >&6; } +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + + +if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +{ $as_echo "$as_me:$LINENO: checking how to run the C++ preprocessor" >&5 +$as_echo_n "checking how to run the C++ preprocessor... " >&6; } +if test -z "$CXXCPP"; then + if test "${ac_cv_prog_CXXCPP+set}" = set; then + $as_echo_n "(cached) " >&6 +else + # Double quotes because CXXCPP needs to be expanded + for CXXCPP in "$CXX -E" "/lib/cpp" + do + ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # 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 >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi + +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then + # Broken: success on invalid input. +continue +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi + +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + break +fi + + done + ac_cv_prog_CXXCPP=$CXXCPP + +fi + CXXCPP=$ac_cv_prog_CXXCPP +else + ac_cv_prog_CXXCPP=$CXXCPP +fi +{ $as_echo "$as_me:$LINENO: result: $CXXCPP" >&5 +$as_echo "$CXXCPP" >&6; } +ac_preproc_ok=false +for ac_cxx_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # 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 >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi + +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether nonexistent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_cxx_preproc_warn_flag$ac_cxx_werror_flag" || + test ! -s conftest.err + }; then + # Broken: success on invalid input. +continue +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi + +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + : +else + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: C++ preprocessor \"$CXXCPP\" fails sanity check +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } +fi + +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + +fi + + +ac_ext=f +ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' +ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_f77_compiler_gnu +if test -n "$ac_tool_prefix"; then + for ac_prog in g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 xlf90 f90 pgf90 pghpf epcf90 gfortran g95 xlf95 f95 fort ifort ifc efc pgf95 lf95 ftn + 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 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_F77+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$F77"; then + ac_cv_prog_F77="$F77" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_F77="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +F77=$ac_cv_prog_F77 +if test -n "$F77"; then + { $as_echo "$as_me:$LINENO: result: $F77" >&5 +$as_echo "$F77" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$F77" && break + done +fi +if test -z "$F77"; then + ac_ct_F77=$F77 + for ac_prog in g77 xlf f77 frt pgf77 cf77 fort77 fl32 af77 xlf90 f90 pgf90 pghpf epcf90 gfortran g95 xlf95 f95 fort ifort ifc efc pgf95 lf95 ftn +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_F77+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_F77"; then + ac_cv_prog_ac_ct_F77="$ac_ct_F77" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_F77="$ac_prog" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_F77=$ac_cv_prog_ac_ct_F77 +if test -n "$ac_ct_F77"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_F77" >&5 +$as_echo "$ac_ct_F77" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_F77" && break +done + + if test "x$ac_ct_F77" = x; then + F77="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + F77=$ac_ct_F77 + fi +fi + + +# Provide some information about the compiler. +$as_echo "$as_me:$LINENO: checking for Fortran 77 compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +{ (ac_try="$ac_compiler --version >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler --version >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -v >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -v >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (ac_try="$ac_compiler -V >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compiler -V >&5") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +rm -f a.out + +# If we don't use `.F' as extension, the preprocessor is not run on the +# input file. (Note that this only needs to work for GNU compilers.) +ac_save_ext=$ac_ext +ac_ext=F +{ $as_echo "$as_me:$LINENO: checking whether we are using the GNU Fortran 77 compiler" >&5 +$as_echo_n "checking whether we are using the GNU Fortran 77 compiler... " >&6; } +if test "${ac_cv_f77_compiler_gnu+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF + program main +#ifndef __GNUC__ + choke me +#endif + + end +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_f77_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_compiler_gnu=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_compiler_gnu=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_f77_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_f77_compiler_gnu" >&5 +$as_echo "$ac_cv_f77_compiler_gnu" >&6; } +ac_ext=$ac_save_ext +ac_test_FFLAGS=${FFLAGS+set} +ac_save_FFLAGS=$FFLAGS +FFLAGS= +{ $as_echo "$as_me:$LINENO: checking whether $F77 accepts -g" >&5 +$as_echo_n "checking whether $F77 accepts -g... " >&6; } +if test "${ac_cv_prog_f77_g+set}" = set; then + $as_echo_n "(cached) " >&6 +else + FFLAGS=-g +cat >conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_f77_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_prog_f77_g=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_prog_f77_g=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_prog_f77_g" >&5 +$as_echo "$ac_cv_prog_f77_g" >&6; } +if test "$ac_test_FFLAGS" = set; then + FFLAGS=$ac_save_FFLAGS +elif test $ac_cv_prog_f77_g = yes; then + if test "x$ac_cv_f77_compiler_gnu" = xyes; then + FFLAGS="-g -O2" + else + FFLAGS="-g" + fi +else + if test "x$ac_cv_f77_compiler_gnu" = xyes; then + FFLAGS="-O2" + else + FFLAGS= + fi +fi + +if test $ac_compiler_gnu = yes; then + G77=yes +else + G77= +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 + + + +# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers! +# find the maximum length of command line arguments +{ $as_echo "$as_me:$LINENO: checking the maximum length of command line arguments" >&5 +$as_echo_n "checking the maximum length of command line arguments... " >&6; } +if test "${lt_cv_sys_max_cmd_len+set}" = set; then + $as_echo_n "(cached) " >&6 +else + i=0 + teststring="ABCD" + + case $build_os in + msdosdjgpp*) + # On DJGPP, this test can blow up pretty badly due to problems in libc + # (any single argument exceeding 2000 bytes causes a buffer overrun + # during glob expansion). Even if it were fixed, the result of this + # check would be larger than it should be. + lt_cv_sys_max_cmd_len=12288; # 12K is about right + ;; + + gnu*) + # Under GNU Hurd, this test is not required because there is + # no limit to the length of command line arguments. + # Libtool will interpret -1 as no limit whatsoever + lt_cv_sys_max_cmd_len=-1; + ;; + + cygwin* | mingw*) + # On Win9x/ME, this test blows up -- it succeeds, but takes + # about 5 minutes as the teststring grows exponentially. + # Worse, since 9x/ME are not pre-emptively multitasking, + # you end up with a "frozen" computer, even though with patience + # the test eventually succeeds (with a max line length of 256k). + # Instead, let's just punt: use the minimum linelength reported by + # all of the supported platforms: 8192 (on NT/2K/XP). + lt_cv_sys_max_cmd_len=8192; + ;; + + amigaos*) + # On AmigaOS with pdksh, this test takes hours, literally. + # So we just punt and use a minimum line length of 8192. + lt_cv_sys_max_cmd_len=8192; + ;; + + netbsd* | freebsd* | openbsd* | darwin* | dragonfly*) + # This has been around since 386BSD, at least. Likely further. + if test -x /sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax` + elif test -x /usr/sbin/sysctl; then + lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax` + else + lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs + fi + # And add a safety zone + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + ;; + + interix*) + # We know the value 262144 and hardcode it with a safety zone (like BSD) + lt_cv_sys_max_cmd_len=196608 + ;; + + osf*) + # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure + # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not + # nice to cause kernel panics so lets avoid the loop below. + # First set a reasonable default. + lt_cv_sys_max_cmd_len=16384 + # + if test -x /sbin/sysconfig; then + case `/sbin/sysconfig -q proc exec_disable_arg_limit` in + *1*) lt_cv_sys_max_cmd_len=-1 ;; + esac + fi + ;; + sco3.2v5*) + lt_cv_sys_max_cmd_len=102400 + ;; + sysv5* | sco5v6* | sysv4.2uw2*) + kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null` + if test -n "$kargmax"; then + lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[ ]//'` + else + lt_cv_sys_max_cmd_len=32768 + fi + ;; + *) + lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null` + if test -n "$lt_cv_sys_max_cmd_len"; then + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4` + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3` + else + SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}} + while (test "X"`$SHELL $0 --fallback-echo "X$teststring" 2>/dev/null` \ + = "XX$teststring") >/dev/null 2>&1 && + new_result=`expr "X$teststring" : ".*" 2>&1` && + lt_cv_sys_max_cmd_len=$new_result && + test $i != 17 # 1/2 MB should be enough + do + i=`expr $i + 1` + teststring=$teststring$teststring + done + teststring= + # Add a significant safety factor because C++ compilers can tack on massive + # amounts of additional arguments before passing them to the linker. + # It appears as though 1/2 is a usable value. + lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2` + fi + ;; + esac + +fi + +if test -n $lt_cv_sys_max_cmd_len ; then + { $as_echo "$as_me:$LINENO: result: $lt_cv_sys_max_cmd_len" >&5 +$as_echo "$lt_cv_sys_max_cmd_len" >&6; } +else + { $as_echo "$as_me:$LINENO: result: none" >&5 +$as_echo "none" >&6; } +fi + + + + + +# Check for command to grab the raw symbol name followed by C symbol from nm. +{ $as_echo "$as_me:$LINENO: checking command to parse $NM output from $compiler object" >&5 +$as_echo_n "checking command to parse $NM output from $compiler object... " >&6; } +if test "${lt_cv_sys_global_symbol_pipe+set}" = set; then + $as_echo_n "(cached) " >&6 +else + +# These are sane defaults that work on at least a few old systems. +# [They come from Ultrix. What could be older than Ultrix?!! ;)] + +# Character class describing NM global symbol codes. +symcode='[BCDEGRST]' + +# Regexp to match symbols that can be accessed directly from C. +sympat='\([_A-Za-z][_A-Za-z0-9]*\)' + +# Transform an extracted symbol line into a proper C declaration +lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'" + +# Transform an extracted symbol line into symbol name and symbol address +lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + +# Define system-specific variables. +case $host_os in +aix*) + symcode='[BCDT]' + ;; +cygwin* | mingw* | pw32*) + symcode='[ABCDGISTW]' + ;; +hpux*) # Its linker distinguishes data from code symbols + if test "$host_cpu" = ia64; then + symcode='[ABCDEGRST]' + fi + lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + ;; +linux* | k*bsd*-gnu) + if test "$host_cpu" = ia64; then + symcode='[ABCDGIRSTW]' + lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'" + lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([^ ]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([^ ]*\) \([^ ]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'" + fi + ;; +irix* | nonstopux*) + symcode='[BCDEGRST]' + ;; +osf*) + symcode='[BCDEGQRST]' + ;; +solaris*) + symcode='[BDRT]' + ;; +sco3.2v5*) + symcode='[DT]' + ;; +sysv4.2uw2*) + symcode='[DT]' + ;; +sysv5* | sco5v6* | unixware* | OpenUNIX*) + symcode='[ABDT]' + ;; +sysv4) + symcode='[DFNSTU]' + ;; +esac + +# Handle CRLF in mingw tool chain +opt_cr= +case $build_os in +mingw*) + opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp + ;; +esac + +# If we're using GNU nm, then use its standard symbol codes. +case `$NM -V 2>&1` in +*GNU* | *'with BFD'*) + symcode='[ABCDGIRSTW]' ;; +esac + +# Try without a prefix undercore, then with it. +for ac_symprfx in "" "_"; do + + # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol. + symxfrm="\\1 $ac_symprfx\\2 \\2" + + # Write the raw and C identifiers. + lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[ ]\($symcode$symcode*\)[ ][ ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'" + + # Check to see that the pipe works correctly. + pipe_works=no + + rm -f conftest* + cat > conftest.$ac_ext <&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Now try to grab the symbols. + nlist=conftest.nm + if { (eval echo "$as_me:$LINENO: \"$NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist\"") >&5 + (eval $NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s "$nlist"; then + # Try sorting and uniquifying the output. + if sort "$nlist" | uniq > "$nlist"T; then + mv -f "$nlist"T "$nlist" + else + rm -f "$nlist"T + fi + + # Make sure that we snagged all the symbols we need. + if grep ' nm_test_var$' "$nlist" >/dev/null; then + if grep ' nm_test_func$' "$nlist" >/dev/null; then + cat < conftest.$ac_ext +#ifdef __cplusplus +extern "C" { +#endif + +EOF + # Now generate the symbol file. + eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext' + + cat <> conftest.$ac_ext +#if defined (__STDC__) && __STDC__ +# define lt_ptr_t void * +#else +# define lt_ptr_t char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +const struct { + const char *name; + lt_ptr_t address; +} +lt_preloaded_symbols[] = +{ +EOF + $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext + cat <<\EOF >> conftest.$ac_ext + {0, (lt_ptr_t) 0} +}; + +#ifdef __cplusplus +} +#endif +EOF + # Now try linking the two files. + mv conftest.$ac_objext conftstm.$ac_objext + lt_save_LIBS="$LIBS" + lt_save_CFLAGS="$CFLAGS" + LIBS="conftstm.$ac_objext" + CFLAGS="$CFLAGS$lt_prog_compiler_no_builtin_flag" + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s conftest${ac_exeext}; then + pipe_works=yes + fi + LIBS="$lt_save_LIBS" + CFLAGS="$lt_save_CFLAGS" + else + echo "cannot find nm_test_func in $nlist" >&5 + fi + else + echo "cannot find nm_test_var in $nlist" >&5 + fi + else + echo "cannot run $lt_cv_sys_global_symbol_pipe" >&5 + fi + else + echo "$progname: failed program was:" >&5 + cat conftest.$ac_ext >&5 + fi + rm -rf conftest* conftst* + + # Do not use the global_symbol_pipe unless it works. + if test "$pipe_works" = yes; then + break + else + lt_cv_sys_global_symbol_pipe= + fi +done + +fi + +if test -z "$lt_cv_sys_global_symbol_pipe"; then + lt_cv_sys_global_symbol_to_cdecl= +fi +if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then + { $as_echo "$as_me:$LINENO: result: failed" >&5 +$as_echo "failed" >&6; } +else + { $as_echo "$as_me:$LINENO: result: ok" >&5 +$as_echo "ok" >&6; } +fi + +{ $as_echo "$as_me:$LINENO: checking for objdir" >&5 +$as_echo_n "checking for objdir... " >&6; } +if test "${lt_cv_objdir+set}" = set; then + $as_echo_n "(cached) " >&6 +else + rm -f .libs 2>/dev/null +mkdir .libs 2>/dev/null +if test -d .libs; then + lt_cv_objdir=.libs +else + # MS-DOS does not allow filenames that begin with a dot. + lt_cv_objdir=_libs +fi +rmdir .libs 2>/dev/null +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_objdir" >&5 +$as_echo "$lt_cv_objdir" >&6; } +objdir=$lt_cv_objdir + + + + + +case $host_os in +aix3*) + # AIX sometimes has problems with the GCC collect2 program. For some + # reason, if we set the COLLECT_NAMES environment variable, the problems + # vanish in a puff of smoke. + if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES + fi + ;; +esac + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='sed -e 1s/^X//' +sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g' + +# Same as above, but do not quote variable references. +double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g' + +# Sed substitution to delay expansion of an escaped shell variable in a +# double_quote_subst'ed string. +delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g' + +# Sed substitution to avoid accidental globbing in evaled expressions +no_glob_subst='s/\*/\\\*/g' + +# Constants: +rm="rm -f" + +# Global variables: +default_ofile=libtool +can_build_shared=yes + +# All known linkers require a `.a' archive for static linking (except MSVC, +# which needs '.lib'). +libext=a +ltmain="$ac_aux_dir/ltmain.sh" +ofile="$default_ofile" +with_gnu_ld="$lt_cv_prog_gnu_ld" + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. +set dummy ${ac_tool_prefix}ar; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_AR+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_AR="${ac_tool_prefix}ar" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { $as_echo "$as_me:$LINENO: result: $AR" >&5 +$as_echo "$AR" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_AR"; then + ac_ct_AR=$AR + # Extract the first word of "ar", so it can be a program name with args. +set dummy ar; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_AR+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_AR="ar" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_AR" >&5 +$as_echo "$ac_ct_AR" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_AR" = x; then + AR="false" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +else + AR="$ac_cv_prog_AR" +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 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_RANLIB+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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 + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { $as_echo "$as_me:$LINENO: result: $RANLIB" >&5 +$as_echo "$RANLIB" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "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 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then + $as_echo_n "(cached) " >&6 +else + 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 + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 +$as_echo "$ac_ct_RANLIB" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$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 + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_STRIP+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:$LINENO: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + + +old_CC="$CC" +old_CFLAGS="$CFLAGS" + +# Set sane defaults for various variables +test -z "$AR" && AR=ar +test -z "$AR_FLAGS" && AR_FLAGS=cru +test -z "$AS" && AS=as +test -z "$CC" && CC=cc +test -z "$LTCC" && LTCC=$CC +test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS +test -z "$DLLTOOL" && DLLTOOL=dlltool +test -z "$LD" && LD=ld +test -z "$LN_S" && LN_S="ln -s" +test -z "$MAGIC_CMD" && MAGIC_CMD=file +test -z "$NM" && NM=nm +test -z "$SED" && SED=sed +test -z "$OBJDUMP" && OBJDUMP=objdump +test -z "$RANLIB" && RANLIB=: +test -z "$STRIP" && STRIP=: +test -z "$ac_objext" && ac_objext=o + +# Determine commands to create old-style static archives. +old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs' +old_postinstall_cmds='chmod 644 $oldlib' +old_postuninstall_cmds= + +if test -n "$RANLIB"; then + case $host_os in + openbsd*) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib" + ;; + *) + old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib" + ;; + esac + old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib" +fi + +for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + + +# Only perform the check for file, if the check method requires it +case $deplibs_check_method in +file_magic*) + if test "$file_magic_cmd" = '$MAGIC_CMD'; then + { $as_echo "$as_me:$LINENO: checking for ${ac_tool_prefix}file" >&5 +$as_echo_n "checking for ${ac_tool_prefix}file... " >&6; } +if test "${lt_cv_path_MAGIC_CMD+set}" = set; then + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/${ac_tool_prefix}file; then + lt_cv_path_MAGIC_CMD="$ac_dir/${ac_tool_prefix}file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + +if test -z "$lt_cv_path_MAGIC_CMD"; then + if test -n "$ac_tool_prefix"; then + { $as_echo "$as_me:$LINENO: checking for file" >&5 +$as_echo_n "checking for file... " >&6; } +if test "${lt_cv_path_MAGIC_CMD+set}" = set; then + $as_echo_n "(cached) " >&6 +else + case $MAGIC_CMD in +[\\/*] | ?:[\\/]*) + lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path. + ;; +*) + lt_save_MAGIC_CMD="$MAGIC_CMD" + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + ac_dummy="/usr/bin$PATH_SEPARATOR$PATH" + for ac_dir in $ac_dummy; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/file; then + lt_cv_path_MAGIC_CMD="$ac_dir/file" + if test -n "$file_magic_test_file"; then + case $deplibs_check_method in + "file_magic "*) + file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"` + MAGIC_CMD="$lt_cv_path_MAGIC_CMD" + if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null | + $EGREP "$file_magic_regex" > /dev/null; then + : + else + cat <&2 + +*** Warning: the command libtool uses to detect shared libraries, +*** $file_magic_cmd, produces output that libtool cannot recognize. +*** The result is that libtool may fail to recognize shared libraries +*** as such. This will affect the creation of libtool libraries that +*** depend on shared libraries, but programs linked with such libtool +*** libraries will work regardless of this problem. Nevertheless, you +*** may want to report the problem to your system manager and/or to +*** bug-libtool@gnu.org + +EOF + fi ;; + esac + fi + break + fi + done + IFS="$lt_save_ifs" + MAGIC_CMD="$lt_save_MAGIC_CMD" + ;; +esac +fi + +MAGIC_CMD="$lt_cv_path_MAGIC_CMD" +if test -n "$MAGIC_CMD"; then + { $as_echo "$as_me:$LINENO: result: $MAGIC_CMD" >&5 +$as_echo "$MAGIC_CMD" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + else + MAGIC_CMD=: + fi +fi + + fi + ;; +esac + + + case $host_os in + rhapsody* | darwin*) + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}dsymutil", so it can be a program name with args. +set dummy ${ac_tool_prefix}dsymutil; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_DSYMUTIL+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$DSYMUTIL"; then + ac_cv_prog_DSYMUTIL="$DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_DSYMUTIL="${ac_tool_prefix}dsymutil" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +DSYMUTIL=$ac_cv_prog_DSYMUTIL +if test -n "$DSYMUTIL"; then + { $as_echo "$as_me:$LINENO: result: $DSYMUTIL" >&5 +$as_echo "$DSYMUTIL" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_DSYMUTIL"; then + ac_ct_DSYMUTIL=$DSYMUTIL + # Extract the first word of "dsymutil", so it can be a program name with args. +set dummy dsymutil; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_DSYMUTIL+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_DSYMUTIL"; then + ac_cv_prog_ac_ct_DSYMUTIL="$ac_ct_DSYMUTIL" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_DSYMUTIL="dsymutil" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL +if test -n "$ac_ct_DSYMUTIL"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_DSYMUTIL" >&5 +$as_echo "$ac_ct_DSYMUTIL" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_DSYMUTIL" = x; then + DSYMUTIL=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + DSYMUTIL=$ac_ct_DSYMUTIL + fi +else + DSYMUTIL="$ac_cv_prog_DSYMUTIL" +fi + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}nmedit", so it can be a program name with args. +set dummy ${ac_tool_prefix}nmedit; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_NMEDIT+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$NMEDIT"; then + ac_cv_prog_NMEDIT="$NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_NMEDIT="${ac_tool_prefix}nmedit" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +NMEDIT=$ac_cv_prog_NMEDIT +if test -n "$NMEDIT"; then + { $as_echo "$as_me:$LINENO: result: $NMEDIT" >&5 +$as_echo "$NMEDIT" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_NMEDIT"; then + ac_ct_NMEDIT=$NMEDIT + # Extract the first word of "nmedit", so it can be a program name with args. +set dummy nmedit; ac_word=$2 +{ $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_NMEDIT+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_NMEDIT"; then + ac_cv_prog_ac_ct_NMEDIT="$ac_ct_NMEDIT" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_NMEDIT="nmedit" + $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done +IFS=$as_save_IFS + +fi +fi +ac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT +if test -n "$ac_ct_NMEDIT"; then + { $as_echo "$as_me:$LINENO: result: $ac_ct_NMEDIT" >&5 +$as_echo "$ac_ct_NMEDIT" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_NMEDIT" = x; then + NMEDIT=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + NMEDIT=$ac_ct_NMEDIT + fi +else + NMEDIT="$ac_cv_prog_NMEDIT" +fi + + + { $as_echo "$as_me:$LINENO: checking for -single_module linker flag" >&5 +$as_echo_n "checking for -single_module linker flag... " >&6; } +if test "${lt_cv_apple_cc_single_mod+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_apple_cc_single_mod=no + if test -z "${LT_MULTI_MODULE}"; then + # By default we will add the -single_module flag. You can override + # by either setting the environment variable LT_MULTI_MODULE + # non-empty at configure time, or by adding -multi_module to the + # link flags. + echo "int foo(void){return 1;}" > conftest.c + $LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \ + -dynamiclib ${wl}-single_module conftest.c + if test -f libconftest.dylib; then + lt_cv_apple_cc_single_mod=yes + rm -rf libconftest.dylib* + fi + rm conftest.c + fi +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_apple_cc_single_mod" >&5 +$as_echo "$lt_cv_apple_cc_single_mod" >&6; } + { $as_echo "$as_me:$LINENO: checking for -exported_symbols_list linker flag" >&5 +$as_echo_n "checking for -exported_symbols_list linker flag... " >&6; } +if test "${lt_cv_ld_exported_symbols_list+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_ld_exported_symbols_list=no + save_LDFLAGS=$LDFLAGS + echo "_main" > conftest.sym + LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + lt_cv_ld_exported_symbols_list=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + lt_cv_ld_exported_symbols_list=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_ld_exported_symbols_list" >&5 +$as_echo "$lt_cv_ld_exported_symbols_list" >&6; } + case $host_os in + rhapsody* | darwin1.[0123]) + _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;; + darwin1.*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + darwin*) + # if running on 10.5 or later, the deployment target defaults + # to the OS version, if on x86, and 10.4, the deployment + # target defaults to 10.4. Don't you love it? + case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in + 10.0,*86*-darwin8*|10.0,*-darwin[91]*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + 10.[012]*) + _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;; + 10.*) + _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;; + esac + ;; + esac + if test "$lt_cv_apple_cc_single_mod" = "yes"; then + _lt_dar_single_mod='$single_module' + fi + if test "$lt_cv_ld_exported_symbols_list" = "yes"; then + _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym' + else + _lt_dar_export_syms="~$NMEDIT -s \$output_objdir/\${libname}-symbols.expsym \${lib}" + fi + if test "$DSYMUTIL" != ":"; then + _lt_dsymutil="~$DSYMUTIL \$lib || :" + else + _lt_dsymutil= + fi + ;; + esac + + +enable_dlopen=no +enable_win32_dll=no + +# Check whether --enable-libtool-lock was given. +if test "${enable_libtool_lock+set}" = set; then + enableval=$enable_libtool_lock; +fi + +test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes + + +# Check whether --with-pic was given. +if test "${with_pic+set}" = set; then + withval=$with_pic; pic_mode="$withval" +else + pic_mode=default +fi + +test -z "$pic_mode" && pic_mode=default + +# Use C for the default configuration in the libtool script +tagname= +lt_save_CC="$CC" +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 + + +# Source file extension for C test sources. +ac_ext=c + +# Object file extension for compiled C test sources. +objext=o +objext=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(){return(0);}' + + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$rm conftest* + +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$rm -r conftest* + + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... + +lt_prog_compiler_no_builtin_flag= + +if test "$GCC" = yes; then + lt_prog_compiler_no_builtin_flag=' -fno-builtin' + + +{ $as_echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:12055: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:12059: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $rm conftest* + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } + +if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then + lt_prog_compiler_no_builtin_flag="$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions" +else + : +fi + +fi + +lt_prog_compiler_wl= +lt_prog_compiler_pic= +lt_prog_compiler_static= + +{ $as_echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } + + if test "$GCC" = yes; then + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_static='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + fi + ;; + + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4' + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic='-fno-common' + ;; + + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared=no + enable_shared=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic=-Kconform_pic + fi + ;; + + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + ;; + + *) + lt_prog_compiler_pic='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static='-Bstatic' + else + lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp' + fi + ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case $cc_basename in + xlc*) + lt_prog_compiler_pic='-qnocommon' + lt_prog_compiler_wl='-Wl,' + ;; + esac + ;; + + mingw* | cygwin* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static='-non_shared' + ;; + + newsos6) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + linux* | k*bsd*-gnu) + case $cc_basename in + icc* | ecc*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-fpic' + lt_prog_compiler_static='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C 5.9 + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='-Wl,' + ;; + *Sun\ F*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + lt_prog_compiler_wl='' + ;; + esac + ;; + esac + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static='-non_shared' + ;; + + rdos*) + lt_prog_compiler_static='-non_shared' + ;; + + solaris*) + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + case $cc_basename in + f77* | f90* | f95*) + lt_prog_compiler_wl='-Qoption ld ';; + *) + lt_prog_compiler_wl='-Wl,';; + esac + ;; + + sunos4*) + lt_prog_compiler_wl='-Qoption ld ' + lt_prog_compiler_pic='-PIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_prog_compiler_pic='-Kconform_pic' + lt_prog_compiler_static='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_pic='-KPIC' + lt_prog_compiler_static='-Bstatic' + ;; + + unicos*) + lt_prog_compiler_wl='-Wl,' + lt_prog_compiler_can_build_shared=no + ;; + + uts4*) + lt_prog_compiler_pic='-pic' + lt_prog_compiler_static='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared=no + ;; + esac + fi + +{ $as_echo "$as_me:$LINENO: result: $lt_prog_compiler_pic" >&5 +$as_echo "$lt_prog_compiler_pic" >&6; } + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic"; then + +{ $as_echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic works... " >&6; } +if test "${lt_cv_prog_compiler_pic_works+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic -DPIC" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:12345: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:12349: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works=yes + fi + fi + $rm conftest* + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_pic_works" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works" >&6; } + +if test x"$lt_cv_prog_compiler_pic_works" = xyes; then + case $lt_prog_compiler_pic in + "" | " "*) ;; + *) lt_prog_compiler_pic=" $lt_prog_compiler_pic" ;; + esac +else + lt_prog_compiler_pic= + lt_prog_compiler_can_build_shared=no +fi + +fi +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic= + ;; + *) + lt_prog_compiler_pic="$lt_prog_compiler_pic -DPIC" + ;; +esac + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\"$lt_prog_compiler_static\" +{ $as_echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if test "${lt_cv_prog_compiler_static_works+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works=yes + fi + else + lt_cv_prog_compiler_static_works=yes + fi + fi + $rm -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_static_works" >&5 +$as_echo "$lt_cv_prog_compiler_static_works" >&6; } + +if test x"$lt_cv_prog_compiler_static_works" = xyes; then + : +else + lt_prog_compiler_static= +fi + + +{ $as_echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test "${lt_cv_prog_compiler_c_o+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:12449: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:12453: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o=yes + fi + fi + chmod u+w . 2>&5 + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o" >&5 +$as_echo "$lt_cv_prog_compiler_c_o" >&6; } + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:$LINENO: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test "$hard_links" = no; then + { $as_echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + +{ $as_echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + runpath_var= + allow_undefined_flag= + enable_shared_with_static_runtimes=no + archive_cmds= + archive_expsym_cmds= + old_archive_From_new_cmds= + old_archive_from_expsyms_cmds= + export_dynamic_flag_spec= + whole_archive_flag_spec= + thread_safe_flag_spec= + hardcode_libdir_flag_spec= + hardcode_libdir_flag_spec_ld= + hardcode_libdir_separator= + hardcode_direct=no + hardcode_minus_L=no + hardcode_shlibpath_var=unsupported + link_all_deplibs=unknown + hardcode_automatic=no + module_cmds= + module_expsym_cmds= + always_export_symbols=no + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. + extract_expsyms_cmds= + # Just being paranoid about ensuring that cc_basename is set. + for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + + case $host_os in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + ld_shlibs=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec= + fi + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[3-9]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs=no + cat <&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + fi + ;; + + amigaos*) + archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can't use + # them. + ld_shlibs=no + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs=no + fi + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + allow_undefined_flag=unsupported + always_export_symbols=no + enable_shared_with_static_runtimes=yes + export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs=no + fi + ;; + + interix[3-9]*) + hardcode_direct=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | k*bsd*-gnu) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + tmp_addflag= + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers + whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + *) + tmp_sharedflag='-shared' ;; + esac + archive_cmds='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test $supports_anon_versioning = yes; then + archive_expsym_cmds='$echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + $echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + else + ld_shlibs=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + cat <&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + ;; + + sunos4*) + archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs=no + fi + ;; + esac + + if test "$ld_shlibs" = no; then + runpath_var= + hardcode_libdir_flag_spec= + export_dynamic_flag_spec= + whole_archive_flag_spec= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag=unsupported + always_export_symbols=yes + archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + + aix[4-9]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds='' + hardcode_direct=yes + hardcode_libdir_separator=':' + link_all_deplibs=yes + + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag='-berok' + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag="-z nodefs" + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag=' ${wl}-bernotok' + allow_undefined_flag=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec='$convenience' + archive_cmds_need_lc=yes + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + archive_cmds='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + # see comment about different semantics on the GNU ld section + ld_shlibs=no + ;; + + bsdi[45]*) + export_dynamic_flag_spec=-rdynamic + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec=' ' + allow_undefined_flag=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_From_new_cmds='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path='`cygpath -w "$srcfile"`' + enable_shared_with_static_runtimes=yes + ;; + + darwin* | rhapsody*) + case $host_os in + rhapsody* | darwin1.[012]) + allow_undefined_flag='${wl}-undefined ${wl}suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + allow_undefined_flag='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + ;; + 10.*) + allow_undefined_flag='${wl}-undefined ${wl}dynamic_lookup' + ;; + esac + fi + ;; + esac + archive_cmds_need_lc=no + hardcode_direct=no + hardcode_automatic=yes + hardcode_shlibpath_var=unsupported + whole_archive_flag_spec='' + link_all_deplibs=yes + if test "$GCC" = yes ; then + output_verbose_link_cmd='echo' + archive_cmds="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + module_cmds="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + archive_expsym_cmds="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + module_expsym_cmds="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + else + case $cc_basename in + xlc*) + output_verbose_link_cmd='echo' + archive_cmds='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring' + module_cmds='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + archive_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + module_expsym_cmds='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + ld_shlibs=no + ;; + esac + fi + ;; + + dgux*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + freebsd1*) + ld_shlibs=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + hpux9*) + if test "$GCC" = yes; then + archive_cmds='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + archive_cmds='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + export_dynamic_flag_spec='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + + hardcode_direct=yes + export_dynamic_flag_spec='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_libdir_flag_spec_ld='+b $libdir' + hardcode_direct=no + hardcode_shlibpath_var=no + ;; + *) + hardcode_direct=yes + export_dynamic_flag_spec='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_ld='-rpath $libdir' + fi + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + link_all_deplibs=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + hardcode_shlibpath_var=no + ;; + + newsos6) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_shlibpath_var=no + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + hardcode_direct=yes + hardcode_shlibpath_var=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + export_dynamic_flag_spec='${wl}-E' + else + case $host_os in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-R$libdir' + ;; + *) + archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + esac + fi + else + ld_shlibs=no + fi + ;; + + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + allow_undefined_flag=unsupported + archive_cmds='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_From_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag=' -expect_unresolved \*' + archive_cmds='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + hardcode_libdir_separator=: + ;; + + solaris*) + no_undefined_flag=' -z text' + if test "$GCC" = yes; then + wlarc='${wl}' + archive_cmds='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' + else + wlarc='' + archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + fi + hardcode_libdir_flag_spec='-R$libdir' + hardcode_shlibpath_var=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. GCC discards it without `$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test "$GCC" = yes; then + whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + else + whole_archive_flag_spec='-z allextract$convenience -z defaultextract' + fi + ;; + esac + link_all_deplibs=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + hardcode_shlibpath_var=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds='$CC -r -o $output$reload_objs' + hardcode_direct=no + ;; + motorola) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var=no + ;; + + sysv4.3*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + export_dynamic_flag_spec='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag='${wl}-z,text' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag='${wl}-z,text' + allow_undefined_flag='${wl}-z,nodefs' + archive_cmds_need_lc=no + hardcode_shlibpath_var=no + hardcode_libdir_flag_spec='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + hardcode_libdir_separator=':' + link_all_deplibs=yes + export_dynamic_flag_spec='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec='-L$libdir' + hardcode_shlibpath_var=no + ;; + + *) + ld_shlibs=no + ;; + esac + fi + +{ $as_echo "$as_me:$LINENO: result: $ld_shlibs" >&5 +$as_echo "$ld_shlibs" >&6; } +test "$ld_shlibs" = no && can_build_shared=no + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } + $rm conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl + pic_flag=$lt_prog_compiler_pic + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag + allow_undefined_flag= + if { (eval echo "$as_me:$LINENO: \"$archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 + (eval $archive_cmds 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + then + archive_cmds_need_lc=no + else + archive_cmds_need_lc=yes + fi + allow_undefined_flag=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + { $as_echo "$as_me:$LINENO: result: $archive_cmds_need_lc" >&5 +$as_echo "$archive_cmds_need_lc" >&6; } + ;; + esac + fi + ;; +esac + +{ $as_echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" + +if test "$GCC" = yes; then + case $host_os in + darwin*) lt_awk_arg="/^libraries:/,/LR/" ;; + *) lt_awk_arg="/^libraries:/" ;; + esac + lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$lt_search_path_spec" | grep ';' >/dev/null ; then + # if the path contains ";" then we assume it to be the separator + # otherwise default to the standard path separator (i.e. ":") - it is + # assumed that no part of a normal pathname contains ";" but that should + # okay in the real world where ";" in dirpaths is itself problematic. + lt_search_path_spec=`echo "$lt_search_path_spec" | $SED -e 's/;/ /g'` + else + lt_search_path_spec=`echo "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + # Ok, now we have the path, separated by spaces, we can step through it + # and add multilib dir if necessary. + lt_tmp_lt_search_path_spec= + lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null` + for lt_sys_path in $lt_search_path_spec; do + if test -d "$lt_sys_path/$lt_multi_os_dir"; then + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir" + else + test -d "$lt_sys_path" && \ + lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path" + fi + done + lt_search_path_spec=`echo $lt_tmp_lt_search_path_spec | awk ' +BEGIN {RS=" "; FS="/|\n";} { + lt_foo=""; + lt_count=0; + for (lt_i = NF; lt_i > 0; lt_i--) { + if ($lt_i != "" && $lt_i != ".") { + if ($lt_i == "..") { + lt_count++; + } else { + if (lt_count == 0) { + lt_foo="/" $lt_i lt_foo; + } else { + lt_count--; + } + } + } + } + if (lt_foo != "") { lt_freq[lt_foo]++; } + if (lt_freq[lt_foo] == 1) { print lt_foo; } +}'` + sys_lib_search_path_spec=`echo $lt_search_path_spec` +else + sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib" +fi +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[4-9]*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib" + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[123]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +interix[3-9]*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + shlibpath_overrides_runpath=no + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + shlibpath_overrides_runpath=yes + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:$LINENO: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_sys_lib_search_path_spec="$sys_lib_search_path_spec" +fi + +sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec" +fi + +sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +{ $as_echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action= +if test -n "$hardcode_libdir_flag_spec" || \ + test -n "$runpath_var" || \ + test "X$hardcode_automatic" = "Xyes" ; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, )" != no && + test "$hardcode_minus_L" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action=unsupported +fi +{ $as_echo "$as_me:$LINENO: result: $hardcode_action" >&5 +$as_echo "$hardcode_action" >&6; } + +if test "$hardcode_action" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + +striplib= +old_striplib= +{ $as_echo "$as_me:$LINENO: checking whether stripping libraries is possible" >&5 +$as_echo_n "checking whether stripping libraries is possible... " >&6; } +if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then + test -z "$old_striplib" && old_striplib="$STRIP --strip-debug" + test -z "$striplib" && striplib="$STRIP --strip-unneeded" + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } +else +# FIXME - insert some real tests, host_os isn't really good enough + case $host_os in + darwin*) + if test -n "$STRIP" ; then + striplib="$STRIP -x" + old_striplib="$STRIP -S" + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + ;; + *) + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } + ;; + esac +fi + +if test "x$enable_dlopen" != xyes; then + enable_dlopen=unknown + enable_dlopen_self=unknown + enable_dlopen_self_static=unknown +else + lt_cv_dlopen=no + lt_cv_dlopen_libs= + + case $host_os in + beos*) + lt_cv_dlopen="load_add_on" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + ;; + + mingw* | pw32*) + lt_cv_dlopen="LoadLibrary" + lt_cv_dlopen_libs= + ;; + + cygwin*) + lt_cv_dlopen="dlopen" + lt_cv_dlopen_libs= + ;; + + darwin*) + # if libdl is installed we need to link against it + { $as_echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if test "${ac_cv_lib_dl_dlopen+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_lib_dl_dlopen=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_dl_dlopen=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = x""yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + + lt_cv_dlopen="dyld" + lt_cv_dlopen_libs= + lt_cv_dlopen_self=yes + +fi + + ;; + + *) + { $as_echo "$as_me:$LINENO: checking for shl_load" >&5 +$as_echo_n "checking for shl_load... " >&6; } +if test "${ac_cv_func_shl_load+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define shl_load to an innocuous variant, in case declares shl_load. + For example, HP-UX 11i declares gettimeofday. */ +#define shl_load innocuous_shl_load + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char shl_load (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef shl_load + +/* 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 shl_load (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_shl_load || defined __stub___shl_load +choke me +#endif + +int +main () +{ +return shl_load (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_func_shl_load=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_func_shl_load=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_shl_load" >&5 +$as_echo "$ac_cv_func_shl_load" >&6; } +if test "x$ac_cv_func_shl_load" = x""yes; then + lt_cv_dlopen="shl_load" +else + { $as_echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 +$as_echo_n "checking for shl_load in -ldld... " >&6; } +if test "${ac_cv_lib_dld_shl_load+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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. */ +#ifdef __cplusplus +extern "C" +#endif +char shl_load (); +int +main () +{ +return shl_load (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_lib_dld_shl_load=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_dld_shl_load=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 +$as_echo "$ac_cv_lib_dld_shl_load" >&6; } +if test "x$ac_cv_lib_dld_shl_load" = x""yes; then + lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-ldld" +else + { $as_echo "$as_me:$LINENO: checking for dlopen" >&5 +$as_echo_n "checking for dlopen... " >&6; } +if test "${ac_cv_func_dlopen+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define dlopen to an innocuous variant, in case declares dlopen. + For example, HP-UX 11i declares gettimeofday. */ +#define dlopen innocuous_dlopen + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char dlopen (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef dlopen + +/* 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 dlopen (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_dlopen || defined __stub___dlopen +choke me +#endif + +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_func_dlopen=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_func_dlopen=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_dlopen" >&5 +$as_echo "$ac_cv_func_dlopen" >&6; } +if test "x$ac_cv_func_dlopen" = x""yes; then + lt_cv_dlopen="dlopen" +else + { $as_echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if test "${ac_cv_lib_dl_dlopen+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_lib_dl_dlopen=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_dl_dlopen=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = x""yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl" +else + { $as_echo "$as_me:$LINENO: checking for dlopen in -lsvld" >&5 +$as_echo_n "checking for dlopen in -lsvld... " >&6; } +if test "${ac_cv_lib_svld_dlopen+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsvld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_lib_svld_dlopen=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_svld_dlopen=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_svld_dlopen" >&5 +$as_echo "$ac_cv_lib_svld_dlopen" >&6; } +if test "x$ac_cv_lib_svld_dlopen" = x""yes; then + lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld" +else + { $as_echo "$as_me:$LINENO: checking for dld_link in -ldld" >&5 +$as_echo_n "checking for dld_link in -ldld... " >&6; } +if test "${ac_cv_lib_dld_dld_link+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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. */ +#ifdef __cplusplus +extern "C" +#endif +char dld_link (); +int +main () +{ +return dld_link (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_lib_dld_dld_link=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_dld_dld_link=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dld_dld_link" >&5 +$as_echo "$ac_cv_lib_dld_dld_link" >&6; } +if test "x$ac_cv_lib_dld_dld_link" = x""yes; then + lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-ldld" +fi + + +fi + + +fi + + +fi + + +fi + + +fi + + ;; + esac + + if test "x$lt_cv_dlopen" != xno; then + enable_dlopen=yes + else + enable_dlopen=no + fi + + case $lt_cv_dlopen in + dlopen) + save_CPPFLAGS="$CPPFLAGS" + test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H" + + save_LDFLAGS="$LDFLAGS" + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\" + + save_LIBS="$LIBS" + LIBS="$lt_cv_dlopen_libs $LIBS" + + { $as_echo "$as_me:$LINENO: checking whether a program can dlopen itself" >&5 +$as_echo_n "checking whether a program can dlopen itself... " >&6; } +if test "${lt_cv_dlopen_self+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + else + puts (dlerror ()); + + exit (status); +} +EOF + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_dlopen_self" >&5 +$as_echo "$lt_cv_dlopen_self" >&6; } + + if test "x$lt_cv_dlopen_self" = xyes; then + wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\" + { $as_echo "$as_me:$LINENO: checking whether a statically linked program can dlopen itself" >&5 +$as_echo_n "checking whether a statically linked program can dlopen itself... " >&6; } +if test "${lt_cv_dlopen_self_static+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then : + lt_cv_dlopen_self_static=cross +else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext < +#endif + +#include + +#ifdef RTLD_GLOBAL +# define LT_DLGLOBAL RTLD_GLOBAL +#else +# ifdef DL_GLOBAL +# define LT_DLGLOBAL DL_GLOBAL +# else +# define LT_DLGLOBAL 0 +# endif +#endif + +/* We may have to define LT_DLLAZY_OR_NOW in the command line if we + find out it does not work in some platform. */ +#ifndef LT_DLLAZY_OR_NOW +# ifdef RTLD_LAZY +# define LT_DLLAZY_OR_NOW RTLD_LAZY +# else +# ifdef DL_LAZY +# define LT_DLLAZY_OR_NOW DL_LAZY +# else +# ifdef RTLD_NOW +# define LT_DLLAZY_OR_NOW RTLD_NOW +# else +# ifdef DL_NOW +# define LT_DLLAZY_OR_NOW DL_NOW +# else +# define LT_DLLAZY_OR_NOW 0 +# endif +# endif +# endif +# endif +#endif + +#ifdef __cplusplus +extern "C" void exit (int); +#endif + +void fnord() { int i=42;} +int main () +{ + void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW); + int status = $lt_dlunknown; + + if (self) + { + if (dlsym (self,"fnord")) status = $lt_dlno_uscore; + else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore; + /* dlclose (self); */ + } + else + puts (dlerror ()); + + exit (status); +} +EOF + if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && test -s conftest${ac_exeext} 2>/dev/null; then + (./conftest; exit; ) >&5 2>/dev/null + lt_status=$? + case x$lt_status in + x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;; + x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;; + esac + else : + # compilation failed + lt_cv_dlopen_self_static=no + fi +fi +rm -fr conftest* + + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_dlopen_self_static" >&5 +$as_echo "$lt_cv_dlopen_self_static" >&6; } + fi + + CPPFLAGS="$save_CPPFLAGS" + LDFLAGS="$save_LDFLAGS" + LIBS="$save_LIBS" + ;; + esac + + case $lt_cv_dlopen_self in + yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;; + *) enable_dlopen_self=unknown ;; + esac + + case $lt_cv_dlopen_self_static in + yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;; + *) enable_dlopen_self_static=unknown ;; + esac +fi + + +# Report which library types will actually be built +{ $as_echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 +$as_echo_n "checking if libtool supports shared libraries... " >&6; } +{ $as_echo "$as_me:$LINENO: result: $can_build_shared" >&5 +$as_echo "$can_build_shared" >&6; } + +{ $as_echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 +$as_echo_n "checking whether to build shared libraries... " >&6; } +test "$can_build_shared" = "no" && enable_shared=no + +# On AIX, shared libraries and static libraries use the same namespace, and +# are all built from PIC. +case $host_os in +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; + +aix[4-9]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; +esac +{ $as_echo "$as_me:$LINENO: result: $enable_shared" >&5 +$as_echo "$enable_shared" >&6; } + +{ $as_echo "$as_me:$LINENO: checking whether to build static libraries" >&5 +$as_echo_n "checking whether to build static libraries... " >&6; } +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes +{ $as_echo "$as_me:$LINENO: result: $enable_static" >&5 +$as_echo "$enable_static" >&6; } + +# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + compiler \ + CC \ + LD \ + lt_prog_compiler_wl \ + lt_prog_compiler_pic \ + lt_prog_compiler_static \ + lt_prog_compiler_no_builtin_flag \ + export_dynamic_flag_spec \ + thread_safe_flag_spec \ + whole_archive_flag_spec \ + enable_shared_with_static_runtimes \ + old_archive_cmds \ + old_archive_from_new_cmds \ + predep_objects \ + postdep_objects \ + predeps \ + postdeps \ + compiler_lib_search_path \ + compiler_lib_search_dirs \ + archive_cmds \ + archive_expsym_cmds \ + postinstall_cmds \ + postuninstall_cmds \ + old_archive_from_expsyms_cmds \ + allow_undefined_flag \ + no_undefined_flag \ + export_symbols_cmds \ + hardcode_libdir_flag_spec \ + hardcode_libdir_flag_spec_ld \ + hardcode_libdir_separator \ + hardcode_automatic \ + module_cmds \ + module_expsym_cmds \ + lt_cv_prog_compiler_c_o \ + fix_srcfile_path \ + exclude_expsyms \ + include_expsyms; do + + case $var in + old_archive_cmds | \ + old_archive_from_new_cmds | \ + archive_cmds | \ + archive_expsym_cmds | \ + module_cmds | \ + module_expsym_cmds | \ + old_archive_from_expsyms_cmds | \ + export_symbols_cmds | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\$0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + +cfgfile="${ofile}T" + trap "$rm \"$cfgfile\"; exit 1" 1 2 15 + $rm -f "$cfgfile" + { $as_echo "$as_me:$LINENO: creating $ofile" >&5 +$as_echo "$as_me: creating $ofile" >&6;} + + cat <<__EOF__ >> "$cfgfile" +#! $SHELL + +# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services. +# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP) +# NOTE: Changes made to this file will be lost: look at ltmain.sh. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 +# Free Software Foundation, Inc. +# +# This file is part of GNU Libtool: +# Originally by Gordon Matzigkeit , 1996 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# A sed program that does not truncate output. +SED=$lt_SED + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="$SED -e 1s/^X//" + +# 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 + +# The names of the tagged configurations supported by this script. +available_tags= + +# ### BEGIN LIBTOOL CONFIG + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# LTCC compiler flags. +LTCFLAGS=$lt_LTCFLAGS + +# A language-specific compiler. +CC=$lt_compiler + +# Is the compiler the GNU C compiler? +with_gcc=$GCC + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_LD + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds +archive_expsym_cmds=$lt_archive_expsym_cmds +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_module_cmds +module_expsym_cmds=$lt_module_expsym_cmds + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_predep_objects + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_postdep_objects + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_predeps + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_postdeps + +# The directories searched by this compiler when creating a shared +# library +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$hardcode_automatic + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path=$lt_fix_srcfile_path + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms + +# ### END LIBTOOL CONFIG + +__EOF__ + + + case $host_os in + aix3*) + cat <<\EOF >> "$cfgfile" + +# AIX sometimes has problems with the GCC collect2 program. For some +# reason, if we set the COLLECT_NAMES environment variable, the problems +# vanish in a puff of smoke. +if test "X${COLLECT_NAMES+set}" != Xset; then + COLLECT_NAMES= + export COLLECT_NAMES +fi +EOF + ;; + esac + + # We use sed instead of cat because bash on DJGPP gets confused if + # if finds mixed CR/LF and LF-only lines. Since sed operates in + # text mode, it properly converts lines to CR/LF. This bash problem + # is reportedly fixed, but why not run on old versions too? + sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1) + + mv -f "$cfgfile" "$ofile" || \ + (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") + chmod +x "$ofile" + +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + 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 + +CC="$lt_save_CC" + + +# Check whether --with-tags was given. +if test "${with_tags+set}" = set; then + withval=$with_tags; tagnames="$withval" +fi + + +if test -f "$ltmain" && test -n "$tagnames"; then + if test ! -f "${ofile}"; then + { $as_echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not exist" >&5 +$as_echo "$as_me: WARNING: output file \`$ofile' does not exist" >&2;} + fi + + if test -z "$LTCC"; then + eval "`$SHELL ${ofile} --config | grep '^LTCC='`" + if test -z "$LTCC"; then + { $as_echo "$as_me:$LINENO: WARNING: output file \`$ofile' does not look like a libtool script" >&5 +$as_echo "$as_me: WARNING: output file \`$ofile' does not look like a libtool script" >&2;} + else + { $as_echo "$as_me:$LINENO: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&5 +$as_echo "$as_me: WARNING: using \`LTCC=$LTCC', extracted from \`$ofile'" >&2;} + fi + fi + if test -z "$LTCFLAGS"; then + eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`" + fi + + # Extract list of available tagged configurations in $ofile. + # Note that this assumes the entire list is on one line. + available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'` + + lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR," + for tagname in $tagnames; do + IFS="$lt_save_ifs" + # Check whether tagname contains only valid characters + case `$echo "X$tagname" | $Xsed -e 's:[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]::g'` in + "") ;; + *) { { $as_echo "$as_me:$LINENO: error: invalid tag name: $tagname" >&5 +$as_echo "$as_me: error: invalid tag name: $tagname" >&2;} + { (exit 1); exit 1; }; } + ;; + esac + + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null + then + { { $as_echo "$as_me:$LINENO: error: tag name \"$tagname\" already exists" >&5 +$as_echo "$as_me: error: tag name \"$tagname\" already exists" >&2;} + { (exit 1); exit 1; }; } + fi + + # Update the list of available tags. + if test -n "$tagname"; then + echo appending configuration tag \"$tagname\" to $ofile + + case $tagname in + CXX) + if test -n "$CXX" && ( test "X$CXX" != "Xno" && + ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) || + (test "X$CXX" != "Xg++"))) ; then + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + + + +archive_cmds_need_lc_CXX=no +allow_undefined_flag_CXX= +always_export_symbols_CXX=no +archive_expsym_cmds_CXX= +export_dynamic_flag_spec_CXX= +hardcode_direct_CXX=no +hardcode_libdir_flag_spec_CXX= +hardcode_libdir_flag_spec_ld_CXX= +hardcode_libdir_separator_CXX= +hardcode_minus_L_CXX=no +hardcode_shlibpath_var_CXX=unsupported +hardcode_automatic_CXX=no +module_cmds_CXX= +module_expsym_cmds_CXX= +link_all_deplibs_CXX=unknown +old_archive_cmds_CXX=$old_archive_cmds +no_undefined_flag_CXX= +whole_archive_flag_spec_CXX= +enable_shared_with_static_runtimes_CXX=no + +# Dependencies to place before and after the object being linked: +predep_objects_CXX= +postdep_objects_CXX= +predeps_CXX= +postdeps_CXX= +compiler_lib_search_path_CXX= +compiler_lib_search_dirs_CXX= + +# Source file extension for C++ test sources. +ac_ext=cpp + +# Object file extension for compiled C++ test sources. +objext=o +objext_CXX=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="int some_variable = 0;" + +# Code to be used in simple link tests +lt_simple_link_test_code='int main(int, char *[]) { return(0); }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$rm conftest* + +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$rm -r conftest* + + +# Allow CC to be a program name with arguments. +lt_save_CC=$CC +lt_save_LD=$LD +lt_save_GCC=$GCC +GCC=$GXX +lt_save_with_gnu_ld=$with_gnu_ld +lt_save_path_LD=$lt_cv_path_LD +if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then + lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx +else + $as_unset lt_cv_prog_gnu_ld +fi +if test -n "${lt_cv_path_LDCXX+set}"; then + lt_cv_path_LD=$lt_cv_path_LDCXX +else + $as_unset lt_cv_path_LD +fi +test -z "${LDCXX+set}" || LD=$LDCXX +CC=${CXX-"c++"} +compiler=$CC +compiler_CXX=$CC +for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + + +# We don't want -fno-exception wen compiling C++ code, so set the +# no_builtin_flag separately +if test "$GXX" = yes; then + lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' +else + lt_prog_compiler_no_builtin_flag_CXX= +fi + +if test "$GXX" = yes; then + # Set up default GNU C++ configuration + + +# Check whether --with-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then + withval=$with_gnu_ld; test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi + +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + { $as_echo "$as_me:$LINENO: checking for ld used by $CC" >&5 +$as_echo_n "checking for ld used by $CC... " >&6; } + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | ?:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the pathname of ld + ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + { $as_echo "$as_me:$LINENO: checking for GNU ld" >&5 +$as_echo_n "checking for GNU ld... " >&6; } +else + { $as_echo "$as_me:$LINENO: checking for non-GNU ld" >&5 +$as_echo_n "checking for non-GNU ld... " >&6; } +fi +if test "${lt_cv_path_LD+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test -z "$LD"; then + lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$lt_save_ifs" + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + lt_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some variants of GNU ld only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$lt_cv_path_LD" -v 2>&1 &5 +$as_echo "$LD" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi +test -z "$LD" && { { $as_echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 +$as_echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} + { (exit 1); exit 1; }; } +{ $as_echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 +$as_echo_n "checking if the linker ($LD) is GNU ld... " >&6; } +if test "${lt_cv_prog_gnu_ld+set}" = set; then + $as_echo_n "(cached) " >&6 +else + # I'd rather use --version here, but apparently some GNU lds only accept -v. +case `$LD -v 2>&1 &5 +$as_echo "$lt_cv_prog_gnu_ld" >&6; } +with_gnu_ld=$lt_cv_prog_gnu_ld + + + + # Check if GNU C++ uses GNU ld as the underlying linker, since the + # archiving commands below assume that GNU ld is being used. + if test "$with_gnu_ld" = yes; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + + # If archive_cmds runs LD, not CC, wlarc should be empty + # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to + # investigate it a little bit more. (MM) + wlarc='${wl}' + + # ancient GNU ld didn't support --whole-archive et. al. + if eval "`$CC -print-prog-name=ld` --help 2>&1" | \ + grep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec_CXX= + fi + else + with_gnu_ld=no + wlarc= + + # A generic and very simple default shared library creation + # command for GNU C++ for the case where it uses the native + # linker, instead of GNU ld. If possible, this setting should + # overridden to take advantage of the native linker features on + # the platform it is being used on. + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + fi + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + +else + GXX=no + with_gnu_ld=no + wlarc= +fi + +# PORTME: fill in a description of your system's C++ link characteristics +{ $as_echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } +ld_shlibs_CXX=yes +case $host_os in + aix3*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aix[4-9]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + case $ld_flag in + *-brtl*) + aix_use_runtimelinking=yes + break + ;; + esac + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_CXX='' + hardcode_direct_CXX=yes + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + + if test "$GXX" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct_CXX=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_CXX=yes + hardcode_libdir_flag_spec_CXX='-L$libdir' + hardcode_libdir_separator_CXX= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols_CXX=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag_CXX='-berok' + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" + + archive_expsym_cmds_CXX="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec_CXX='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag_CXX="-z nodefs" + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_CXX='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_CXX=' ${wl}-bernotok' + allow_undefined_flag_CXX=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_CXX='$convenience' + archive_cmds_need_lc_CXX=yes + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds_CXX="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_CXX=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_CXX='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs_CXX=no + fi + ;; + + chorus*) + case $cc_basename in + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, CXX) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_CXX='-L$libdir' + allow_undefined_flag_CXX=unsupported + always_export_symbols_CXX=no + enable_shared_with_static_runtimes_CXX=yes + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds_CXX='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs_CXX=no + fi + ;; + darwin* | rhapsody*) + archive_cmds_need_lc_CXX=no + hardcode_direct_CXX=no + hardcode_automatic_CXX=yes + hardcode_shlibpath_var_CXX=unsupported + whole_archive_flag_spec_CXX='' + link_all_deplibs_CXX=yes + allow_undefined_flag_CXX="$_lt_dar_allow_undefined" + if test "$GXX" = yes ; then + output_verbose_link_cmd='echo' + archive_cmds_CXX="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + module_cmds_CXX="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + module_expsym_cmds_CXX="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + if test "$lt_cv_apple_cc_single_mod" != "yes"; then + archive_cmds_CXX="\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dsymutil}" + archive_expsym_cmds_CXX="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \${lib}-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \${lib}-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring${_lt_dar_export_syms}${_lt_dsymutil}" + fi + else + case $cc_basename in + xlc*) + output_verbose_link_cmd='echo' + archive_cmds_CXX='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring' + module_cmds_CXX='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + archive_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + module_expsym_cmds_CXX='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + ld_shlibs_CXX=no + ;; + esac + fi + ;; + + dgux*) + case $cc_basename in + ec++*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + ghcx*) + # Green Hills C++ Compiler + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + freebsd[12]*) + # C++ shared libraries reported to be fairly broken before switch to ELF + ld_shlibs_CXX=no + ;; + freebsd-elf*) + archive_cmds_need_lc_CXX=no + ;; + freebsd* | dragonfly*) + # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF + # conventions + ld_shlibs_CXX=yes + ;; + gnu*) + ;; + hpux9*) + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_CXX=: + export_dynamic_flag_spec_CXX='${wl}-E' + hardcode_direct_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + archive_cmds_CXX='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[-]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + archive_cmds_CXX='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + hpux10*|hpux11*) + if test $with_gnu_ld = no; then + hardcode_libdir_flag_spec_CXX='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + case $host_cpu in + hppa*64*|ia64*) ;; + *) + export_dynamic_flag_spec_CXX='${wl}-E' + ;; + esac + fi + case $host_cpu in + hppa*64*|ia64*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + ;; + *) + hardcode_direct_CXX=yes + hardcode_minus_L_CXX=yes # Not in the search PATH, + # but as the default + # location of the library. + ;; + esac + + case $cc_basename in + CC*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + aCC*) + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes; then + if test $with_gnu_ld = no; then + case $host_cpu in + hppa*64*) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + ia64*) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + ;; + esac + fi + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + interix[3-9]*) + hardcode_direct_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds_CXX='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds_CXX='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + irix5* | irix6*) + case $cc_basename in + CC*) + # SGI C++ + archive_cmds_CXX='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + + # Archives containing C++ object files must be created using + # "CC -ar", where "CC" is the IRIX C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -ar -WR,-u -o $oldlib $oldobjs' + ;; + *) + if test "$GXX" = yes; then + if test "$with_gnu_ld" = no; then + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds_CXX='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib' + fi + fi + link_all_deplibs_CXX=yes + ;; + esac + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + ;; + linux* | k*bsd*-gnu) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + archive_expsym_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib' + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + + hardcode_libdir_flag_spec_CXX='${wl}--rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' + ;; + icpc*) + # Intel C++ + with_gnu_ld=yes + # version 8.0 and above of icpc choke on multiply defined symbols + # if we add $predep_objects and $postdep_objects, however 7.1 and + # earlier do not add the objects themselves. + case `$CC -V 2>&1` in + *"Version 7."*) + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + *) # Version 8.0 or newer + tmp_idyn= + case $host_cpu in + ia64*) tmp_idyn=' -i_dynamic';; + esac + archive_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + ;; + esac + archive_cmds_need_lc_CXX=no + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + whole_archive_flag_spec_CXX='${wl}--whole-archive$convenience ${wl}--no-whole-archive' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec_CXX='${wl}--export-dynamic' + whole_archive_flag_spec_CXX='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + ;; + cxx*) + # Compaq C++ + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols' + + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols' + hardcode_libdir_flag_spec_CXX='-R$libdir' + whole_archive_flag_spec_CXX='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + + # Not sure whether something based on + # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 + # would be better. + output_verbose_link_cmd='echo' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + esac + ;; + esac + ;; + lynxos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + m88k*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + mvs*) + case $cc_basename in + cxx*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds_CXX='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags' + wlarc= + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + fi + # Workaround some broken pre-1.5 toolchains + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"' + ;; + openbsd2*) + # C++ shared libraries are fairly broken + ld_shlibs_CXX=no + ;; + openbsd*) + if test -f /usr/libexec/ld.so; then + hardcode_direct_CXX=yes + hardcode_shlibpath_var_CXX=no + archive_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib' + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_expsym_cmds_CXX='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib' + export_dynamic_flag_spec_CXX='${wl}-E' + whole_archive_flag_spec_CXX="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + fi + output_verbose_link_cmd='echo' + else + ld_shlibs_CXX=no + fi + ;; + osf3*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + hardcode_libdir_separator_CXX=: + + # Archives containing C++ object files must be created using + # "CC -Bstatic", where "CC" is the KAI C++ compiler. + old_archive_cmds_CXX='$CC -Bstatic -o $oldlib $oldobjs' + + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + cxx*) + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + osf4* | osf5*) + case $cc_basename in + KCC*) + # Kuck and Associates, Inc. (KAI) C++ Compiler + + # KCC will only create a shared library if the output file + # ends with ".so" (or ".sl" for HP-UX), so rename the library + # to its proper name (with version) after linking. + archive_cmds_CXX='tempext=`echo $shared_ext | $SED -e '\''s/\([^()0-9A-Za-z{}]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath,$libdir' + hardcode_libdir_separator_CXX=: + + # Archives containing C++ object files must be created using + # the KAI C++ compiler. + old_archive_cmds_CXX='$CC -o $oldlib $oldobjs' + ;; + RCC*) + # Rational C++ 2.4.1 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + cxx*) + allow_undefined_flag_CXX=' -expect_unresolved \*' + archive_cmds_CXX='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds_CXX='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~ + echo "-hidden">> $lib.exp~ + $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~ + $rm $lib.exp' + + hardcode_libdir_flag_spec_CXX='-rpath $libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + # + # There doesn't appear to be a way to prevent this compiler from + # explicitly linking system object files so we need to strip them + # from the output so that they don't get included in the library + # dependencies. + output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list' + ;; + *) + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + allow_undefined_flag_CXX=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_CXX='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + + hardcode_libdir_flag_spec_CXX='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_CXX=: + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"' + + else + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + fi + ;; + esac + ;; + psos*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + lcc*) + # Lucid + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + solaris*) + case $cc_basename in + CC*) + # Sun C++ 4.2, 5.x and Centerline C++ + archive_cmds_need_lc_CXX=yes + no_undefined_flag_CXX=' -zdefs' + archive_cmds_CXX='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags' + archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + hardcode_libdir_flag_spec_CXX='-R$libdir' + hardcode_shlibpath_var_CXX=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. + # Supported since Solaris 2.6 (maybe 2.5.1?) + whole_archive_flag_spec_CXX='-z allextract$convenience -z defaultextract' + ;; + esac + link_all_deplibs_CXX=yes + + output_verbose_link_cmd='echo' + + # Archives containing C++ object files must be created using + # "CC -xar", where "CC" is the Sun C++ compiler. This is + # necessary to make sure instantiated templates are included + # in the archive. + old_archive_cmds_CXX='$CC -xar -o $oldlib $oldobjs' + ;; + gcx*) + # Green Hills C++ Compiler + archive_cmds_CXX='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + + # The C++ compiler must be used to create the archive. + old_archive_cmds_CXX='$CC $LDFLAGS -archive -o $oldlib $oldobjs' + ;; + *) + # GNU C++ compiler with Solaris linker + if test "$GXX" = yes && test "$with_gnu_ld" = no; then + no_undefined_flag_CXX=' ${wl}-z ${wl}defs' + if $CC --version | grep -v '^2\.7' > /dev/null; then + archive_cmds_CXX='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + else + # g++ 2.7 appears to require `-G' NOT `-shared' on this + # platform. + archive_cmds_CXX='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib' + archive_expsym_cmds_CXX='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp' + + # Commands to make compiler produce verbose output that lists + # what "hidden" libraries, object files and flags are used when + # linking a shared library. + output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\"" + fi + + hardcode_libdir_flag_spec_CXX='${wl}-R $wl$libdir' + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + whole_archive_flag_spec_CXX='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + ;; + esac + fi + ;; + esac + ;; + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag_CXX='${wl}-z,text' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + # For security reasons, it is highly recommended that you always + # use absolute paths for naming shared libraries, and exclude the + # DT_RUNPATH tag from executables and libraries. But doing so + # requires that you compile everything twice, which is a pain. + # So that behaviour is only enabled if SCOABSPATH is set to a + # non-empty value in the environment. Most likely only useful for + # creating official distributions of packages. + # This is a hack until libtool officially supports absolute path + # names for shared libraries. + no_undefined_flag_CXX='${wl}-z,text' + allow_undefined_flag_CXX='${wl}-z,nodefs' + archive_cmds_need_lc_CXX=no + hardcode_shlibpath_var_CXX=no + hardcode_libdir_flag_spec_CXX='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + hardcode_libdir_separator_CXX=':' + link_all_deplibs_CXX=yes + export_dynamic_flag_spec_CXX='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + case $cc_basename in + CC*) + archive_cmds_CXX='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_CXX='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_CXX='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + esac + ;; + vxworks*) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; + *) + # FIXME: insert proper C++ library support + ld_shlibs_CXX=no + ;; +esac +{ $as_echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 +$as_echo "$ld_shlibs_CXX" >&6; } +test "$ld_shlibs_CXX" = no && can_build_shared=no + +GCC_CXX="$GXX" +LD_CXX="$LD" + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... +cat > conftest.$ac_ext <&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Parse the compiler output and extract the necessary + # objects, libraries and library flags. + + # Sentinel used to keep track of whether or not we are before + # the conftest object file. + pre_test_object_deps_done=no + + # The `*' in the case matches for architectures that use `case' in + # $output_verbose_cmd can trigger glob expansion during the loop + # eval without this substitution. + output_verbose_link_cmd=`$echo "X$output_verbose_link_cmd" | $Xsed -e "$no_glob_subst"` + + for p in `eval $output_verbose_link_cmd`; do + case $p in + + -L* | -R* | -l*) + # Some compilers place space between "-{L,R}" and the path. + # Remove the space. + if test $p = "-L" \ + || test $p = "-R"; then + prev=$p + continue + else + prev= + fi + + if test "$pre_test_object_deps_done" = no; then + case $p in + -L* | -R*) + # Internal compiler library paths should come after those + # provided the user. The postdeps already come after the + # user supplied libs so there is no need to process them. + if test -z "$compiler_lib_search_path_CXX"; then + compiler_lib_search_path_CXX="${prev}${p}" + else + compiler_lib_search_path_CXX="${compiler_lib_search_path_CXX} ${prev}${p}" + fi + ;; + # The "-l" case would never come before the object being + # linked, so don't bother handling this case. + esac + else + if test -z "$postdeps_CXX"; then + postdeps_CXX="${prev}${p}" + else + postdeps_CXX="${postdeps_CXX} ${prev}${p}" + fi + fi + ;; + + *.$objext) + # This assumes that the test object file only shows up + # once in the compiler output. + if test "$p" = "conftest.$objext"; then + pre_test_object_deps_done=yes + continue + fi + + if test "$pre_test_object_deps_done" = no; then + if test -z "$predep_objects_CXX"; then + predep_objects_CXX="$p" + else + predep_objects_CXX="$predep_objects_CXX $p" + fi + else + if test -z "$postdep_objects_CXX"; then + postdep_objects_CXX="$p" + else + postdep_objects_CXX="$postdep_objects_CXX $p" + fi + fi + ;; + + *) ;; # Ignore the rest. + + esac + done + + # Clean up. + rm -f a.out a.exe +else + echo "libtool.m4: error: problem compiling CXX test program" +fi + +$rm -f confest.$objext + +compiler_lib_search_dirs_CXX= +if test -n "$compiler_lib_search_path_CXX"; then + compiler_lib_search_dirs_CXX=`echo " ${compiler_lib_search_path_CXX}" | ${SED} -e 's! -L! !g' -e 's!^ !!'` +fi + +# PORTME: override above test on systems where it is broken +case $host_os in +interix[3-9]*) + # Interix 3.5 installs completely hosed .la files for C++, so rather than + # hack all around it, let's just trust "g++" to DTRT. + predep_objects_CXX= + postdep_objects_CXX= + postdeps_CXX= + ;; + +linux*) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + # + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + if test "$solaris_use_stlport4" != yes; then + postdeps_CXX='-library=Cstd -library=Crun' + fi + ;; + esac + ;; + +solaris*) + case $cc_basename in + CC*) + # The more standards-conforming stlport4 library is + # incompatible with the Cstd library. Avoid specifying + # it if it's in CXXFLAGS. Ignore libCrun as + # -library=stlport4 depends on it. + case " $CXX $CXXFLAGS " in + *" -library=stlport4 "*) + solaris_use_stlport4=yes + ;; + esac + + # Adding this requires a known-good setup of shared libraries for + # Sun compiler versions before 5.6, else PIC objects from an old + # archive will be linked into the output, leading to subtle bugs. + if test "$solaris_use_stlport4" != yes; then + postdeps_CXX='-library=Cstd -library=Crun' + fi + ;; + esac + ;; +esac + +case " $postdeps_CXX " in +*" -lc "*) archive_cmds_need_lc_CXX=no ;; +esac + +lt_prog_compiler_wl_CXX= +lt_prog_compiler_pic_CXX= +lt_prog_compiler_static_CXX= + +{ $as_echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } + + # C++ specific cases for pic, static, wl, etc. + if test "$GXX" = yes; then + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + fi + ;; + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic_CXX='-m68020 -resident32 -malways-restore-a4' + ;; + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + mingw* | cygwin* | os2* | pw32*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic_CXX='-DDLL_EXPORT' + ;; + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_CXX='-fno-common' + ;; + *djgpp*) + # DJGPP does not support shared libraries at all + lt_prog_compiler_pic_CXX= + ;; + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_CXX=-Kconform_pic + fi + ;; + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + ;; + *) + lt_prog_compiler_pic_CXX='-fPIC' + ;; + esac + else + case $host_os in + aix[4-9]*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_CXX='-Bstatic' + else + lt_prog_compiler_static_CXX='-bnso -bI:/lib/syscalls.exp' + fi + ;; + chorus*) + case $cc_basename in + cxch68*) + # Green Hills C++ Compiler + # _LT_AC_TAGVAR(lt_prog_compiler_static, CXX)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a" + ;; + esac + ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case $cc_basename in + xlc*) + lt_prog_compiler_pic_CXX='-qnocommon' + lt_prog_compiler_wl_CXX='-Wl,' + ;; + esac + ;; + dgux*) + case $cc_basename in + ec++*) + lt_prog_compiler_pic_CXX='-KPIC' + ;; + ghcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + freebsd* | dragonfly*) + # FreeBSD uses GNU C++ + ;; + hpux9* | hpux10* | hpux11*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' + if test "$host_cpu" != ia64; then + lt_prog_compiler_pic_CXX='+Z' + fi + ;; + aCC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='${wl}-a ${wl}archive' + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_CXX='+Z' + ;; + esac + ;; + *) + ;; + esac + ;; + interix*) + # This is c89, which is MS Visual C++ (no shared libs) + # Anyone wants to do a port? + ;; + irix5* | irix6* | nonstopux*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_static_CXX='-non_shared' + # CC pic flag -KPIC is the default. + ;; + *) + ;; + esac + ;; + linux* | k*bsd*-gnu) + case $cc_basename in + KCC*) + # KAI C++ Compiler + lt_prog_compiler_wl_CXX='--backend -Wl,' + lt_prog_compiler_pic_CXX='-fPIC' + ;; + icpc* | ecpc*) + # Intel C++ + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-static' + ;; + pgCC* | pgcpp*) + # Portland Group C++ compiler. + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-fpic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + cxx*) + # Compaq C++ + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C++ 5.9 + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + esac + ;; + esac + ;; + lynxos*) + ;; + m88k*) + ;; + mvs*) + case $cc_basename in + cxx*) + lt_prog_compiler_pic_CXX='-W c,exportall' + ;; + *) + ;; + esac + ;; + netbsd*) + ;; + osf3* | osf4* | osf5*) + case $cc_basename in + KCC*) + lt_prog_compiler_wl_CXX='--backend -Wl,' + ;; + RCC*) + # Rational C++ 2.4.1 + lt_prog_compiler_pic_CXX='-pic' + ;; + cxx*) + # Digital/Compaq C++ + lt_prog_compiler_wl_CXX='-Wl,' + # Make sure the PIC flag is empty. It appears that all Alpha + # Linux and Compaq Tru64 Unix objects are PIC. + lt_prog_compiler_pic_CXX= + lt_prog_compiler_static_CXX='-non_shared' + ;; + *) + ;; + esac + ;; + psos*) + ;; + solaris*) + case $cc_basename in + CC*) + # Sun C++ 4.2, 5.x and Centerline C++ + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + lt_prog_compiler_wl_CXX='-Qoption ld ' + ;; + gcx*) + # Green Hills C++ Compiler + lt_prog_compiler_pic_CXX='-PIC' + ;; + *) + ;; + esac + ;; + sunos4*) + case $cc_basename in + CC*) + # Sun C++ 4.x + lt_prog_compiler_pic_CXX='-pic' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + lcc*) + # Lucid + lt_prog_compiler_pic_CXX='-pic' + ;; + *) + ;; + esac + ;; + tandem*) + case $cc_basename in + NCC*) + # NonStop-UX NCC 3.20 + lt_prog_compiler_pic_CXX='-KPIC' + ;; + *) + ;; + esac + ;; + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + case $cc_basename in + CC*) + lt_prog_compiler_wl_CXX='-Wl,' + lt_prog_compiler_pic_CXX='-KPIC' + lt_prog_compiler_static_CXX='-Bstatic' + ;; + esac + ;; + vxworks*) + ;; + *) + lt_prog_compiler_can_build_shared_CXX=no + ;; + esac + fi + +{ $as_echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_CXX" >&5 +$as_echo "$lt_prog_compiler_pic_CXX" >&6; } + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_CXX"; then + +{ $as_echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_CXX works... " >&6; } +if test "${lt_cv_prog_compiler_pic_works_CXX+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works_CXX=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_CXX -DPIC" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:17364: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:17368: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works_CXX=yes + fi + fi + $rm conftest* + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_pic_works_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works_CXX" >&6; } + +if test x"$lt_cv_prog_compiler_pic_works_CXX" = xyes; then + case $lt_prog_compiler_pic_CXX in + "" | " "*) ;; + *) lt_prog_compiler_pic_CXX=" $lt_prog_compiler_pic_CXX" ;; + esac +else + lt_prog_compiler_pic_CXX= + lt_prog_compiler_can_build_shared_CXX=no +fi + +fi +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_CXX= + ;; + *) + lt_prog_compiler_pic_CXX="$lt_prog_compiler_pic_CXX -DPIC" + ;; +esac + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl_CXX eval lt_tmp_static_flag=\"$lt_prog_compiler_static_CXX\" +{ $as_echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if test "${lt_cv_prog_compiler_static_works_CXX+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works_CXX=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works_CXX=yes + fi + else + lt_cv_prog_compiler_static_works_CXX=yes + fi + fi + $rm -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_static_works_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_static_works_CXX" >&6; } + +if test x"$lt_cv_prog_compiler_static_works_CXX" = xyes; then + : +else + lt_prog_compiler_static_CXX= +fi + + +{ $as_echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test "${lt_cv_prog_compiler_c_o_CXX+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_CXX=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:17468: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:17472: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_CXX=yes + fi + fi + chmod u+w . 2>&5 + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_CXX" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_CXX" >&6; } + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o_CXX" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:$LINENO: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test "$hard_links" = no; then + { $as_echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + +{ $as_echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + case $host_os in + aix[4-9]*) + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + export_symbols_cmds_CXX='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_CXX='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + fi + ;; + pw32*) + export_symbols_cmds_CXX="$ltdll_cmds" + ;; + cygwin* | mingw*) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/;/^.*[ ]__nm__/s/^.*[ ]__nm__\([^ ]*\)[ ][^ ]*/\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + ;; + *) + export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + ;; + esac + exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + +{ $as_echo "$as_me:$LINENO: result: $ld_shlibs_CXX" >&5 +$as_echo "$ld_shlibs_CXX" >&6; } +test "$ld_shlibs_CXX" = no && can_build_shared=no + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_CXX" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_CXX=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds_CXX in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } + $rm conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_CXX + pic_flag=$lt_prog_compiler_pic_CXX + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_CXX + allow_undefined_flag_CXX= + if { (eval echo "$as_me:$LINENO: \"$archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 + (eval $archive_cmds_CXX 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + then + archive_cmds_need_lc_CXX=no + else + archive_cmds_need_lc_CXX=yes + fi + allow_undefined_flag_CXX=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + { $as_echo "$as_me:$LINENO: result: $archive_cmds_need_lc_CXX" >&5 +$as_echo "$archive_cmds_need_lc_CXX" >&6; } + ;; + esac + fi + ;; +esac + +{ $as_echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" + +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[4-9]*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[123]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +interix[3-9]*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + shlibpath_overrides_runpath=no + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + shlibpath_overrides_runpath=yes + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:$LINENO: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_sys_lib_search_path_spec="$sys_lib_search_path_spec" +fi + +sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec" +fi + +sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +{ $as_echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action_CXX= +if test -n "$hardcode_libdir_flag_spec_CXX" || \ + test -n "$runpath_var_CXX" || \ + test "X$hardcode_automatic_CXX" = "Xyes" ; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct_CXX" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, CXX)" != no && + test "$hardcode_minus_L_CXX" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action_CXX=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_CXX=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_CXX=unsupported +fi +{ $as_echo "$as_me:$LINENO: result: $hardcode_action_CXX" >&5 +$as_echo "$hardcode_action_CXX" >&6; } + +if test "$hardcode_action_CXX" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + +# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + compiler_CXX \ + CC_CXX \ + LD_CXX \ + lt_prog_compiler_wl_CXX \ + lt_prog_compiler_pic_CXX \ + lt_prog_compiler_static_CXX \ + lt_prog_compiler_no_builtin_flag_CXX \ + export_dynamic_flag_spec_CXX \ + thread_safe_flag_spec_CXX \ + whole_archive_flag_spec_CXX \ + enable_shared_with_static_runtimes_CXX \ + old_archive_cmds_CXX \ + old_archive_from_new_cmds_CXX \ + predep_objects_CXX \ + postdep_objects_CXX \ + predeps_CXX \ + postdeps_CXX \ + compiler_lib_search_path_CXX \ + compiler_lib_search_dirs_CXX \ + archive_cmds_CXX \ + archive_expsym_cmds_CXX \ + postinstall_cmds_CXX \ + postuninstall_cmds_CXX \ + old_archive_from_expsyms_cmds_CXX \ + allow_undefined_flag_CXX \ + no_undefined_flag_CXX \ + export_symbols_cmds_CXX \ + hardcode_libdir_flag_spec_CXX \ + hardcode_libdir_flag_spec_ld_CXX \ + hardcode_libdir_separator_CXX \ + hardcode_automatic_CXX \ + module_cmds_CXX \ + module_expsym_cmds_CXX \ + lt_cv_prog_compiler_c_o_CXX \ + fix_srcfile_path_CXX \ + exclude_expsyms_CXX \ + include_expsyms_CXX; do + + case $var in + old_archive_cmds_CXX | \ + old_archive_from_new_cmds_CXX | \ + archive_cmds_CXX | \ + archive_expsym_cmds_CXX | \ + module_cmds_CXX | \ + module_expsym_cmds_CXX | \ + old_archive_from_expsyms_cmds_CXX | \ + export_symbols_cmds_CXX | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\$0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + +cfgfile="$ofile" + + cat <<__EOF__ >> "$cfgfile" +# ### BEGIN LIBTOOL TAG CONFIG: $tagname + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_CXX + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# LTCC compiler flags. +LTCFLAGS=$lt_LTCFLAGS + +# A language-specific compiler. +CC=$lt_compiler_CXX + +# Is the compiler the GNU C compiler? +with_gcc=$GCC_CXX + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_LD_CXX + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_CXX + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_CXX +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_CXX + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec_CXX + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds_CXX +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds_CXX +archive_expsym_cmds=$lt_archive_expsym_cmds_CXX +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_module_cmds_CXX +module_expsym_cmds=$lt_module_expsym_cmds_CXX + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_predep_objects_CXX + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_postdep_objects_CXX + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_predeps_CXX + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_postdeps_CXX + +# The directories searched by this compiler when creating a shared +# library +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_CXX + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_CXX + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_CXX + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_CXX + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_CXX + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_CXX + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct_CXX + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L_CXX + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$hardcode_automatic_CXX + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_CXX + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path=$lt_fix_srcfile_path + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols_CXX + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_CXX + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_CXX + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_CXX + +# ### END LIBTOOL TAG CONFIG: $tagname + +__EOF__ + + +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + 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 + +CC=$lt_save_CC +LDCXX=$LD +LD=$lt_save_LD +GCC=$lt_save_GCC +with_gnu_ldcxx=$with_gnu_ld +with_gnu_ld=$lt_save_with_gnu_ld +lt_cv_path_LDCXX=$lt_cv_path_LD +lt_cv_path_LD=$lt_save_path_LD +lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld +lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld + + else + tagname="" + fi + ;; + + F77) + if test -n "$F77" && test "X$F77" != "Xno"; then + +ac_ext=f +ac_compile='$F77 -c $FFLAGS conftest.$ac_ext >&5' +ac_link='$F77 -o conftest$ac_exeext $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_f77_compiler_gnu + + +archive_cmds_need_lc_F77=no +allow_undefined_flag_F77= +always_export_symbols_F77=no +archive_expsym_cmds_F77= +export_dynamic_flag_spec_F77= +hardcode_direct_F77=no +hardcode_libdir_flag_spec_F77= +hardcode_libdir_flag_spec_ld_F77= +hardcode_libdir_separator_F77= +hardcode_minus_L_F77=no +hardcode_automatic_F77=no +module_cmds_F77= +module_expsym_cmds_F77= +link_all_deplibs_F77=unknown +old_archive_cmds_F77=$old_archive_cmds +no_undefined_flag_F77= +whole_archive_flag_spec_F77= +enable_shared_with_static_runtimes_F77=no + +# Source file extension for f77 test sources. +ac_ext=f + +# Object file extension for compiled f77 test sources. +objext=o +objext_F77=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="\ + subroutine t + return + end +" + +# Code to be used in simple link tests +lt_simple_link_test_code="\ + program t + end +" + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$rm conftest* + +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$rm -r conftest* + + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +CC=${F77-"f77"} +compiler=$CC +compiler_F77=$CC +for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + + +{ $as_echo "$as_me:$LINENO: checking if libtool supports shared libraries" >&5 +$as_echo_n "checking if libtool supports shared libraries... " >&6; } +{ $as_echo "$as_me:$LINENO: result: $can_build_shared" >&5 +$as_echo "$can_build_shared" >&6; } + +{ $as_echo "$as_me:$LINENO: checking whether to build shared libraries" >&5 +$as_echo_n "checking whether to build shared libraries... " >&6; } +test "$can_build_shared" = "no" && enable_shared=no + +# On AIX, shared libraries and static libraries use the same namespace, and +# are all built from PIC. +case $host_os in +aix3*) + test "$enable_shared" = yes && enable_static=no + if test -n "$RANLIB"; then + archive_cmds="$archive_cmds~\$RANLIB \$lib" + postinstall_cmds='$RANLIB $lib' + fi + ;; +aix[4-9]*) + if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then + test "$enable_shared" = yes && enable_static=no + fi + ;; +esac +{ $as_echo "$as_me:$LINENO: result: $enable_shared" >&5 +$as_echo "$enable_shared" >&6; } + +{ $as_echo "$as_me:$LINENO: checking whether to build static libraries" >&5 +$as_echo_n "checking whether to build static libraries... " >&6; } +# Make sure either enable_shared or enable_static is yes. +test "$enable_shared" = yes || enable_static=yes +{ $as_echo "$as_me:$LINENO: result: $enable_static" >&5 +$as_echo "$enable_static" >&6; } + +GCC_F77="$G77" +LD_F77="$LD" + +lt_prog_compiler_wl_F77= +lt_prog_compiler_pic_F77= +lt_prog_compiler_static_F77= + +{ $as_echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } + + if test "$GCC" = yes; then + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_static_F77='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_F77='-Bstatic' + fi + ;; + + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic_F77='-m68020 -resident32 -malways-restore-a4' + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + lt_prog_compiler_pic_F77='-DDLL_EXPORT' + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_F77='-fno-common' + ;; + + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared_F77=no + enable_shared=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_F77=-Kconform_pic + fi + ;; + + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_F77='-fPIC' + ;; + esac + ;; + + *) + lt_prog_compiler_pic_F77='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl_F77='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_F77='-Bstatic' + else + lt_prog_compiler_static_F77='-bnso -bI:/lib/syscalls.exp' + fi + ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case $cc_basename in + xlc*) + lt_prog_compiler_pic_F77='-qnocommon' + lt_prog_compiler_wl_F77='-Wl,' + ;; + esac + ;; + + mingw* | cygwin* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + lt_prog_compiler_pic_F77='-DDLL_EXPORT' + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl_F77='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_F77='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static_F77='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl_F77='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static_F77='-non_shared' + ;; + + newsos6) + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + linux* | k*bsd*-gnu) + case $cc_basename in + icc* | ecc*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-fpic' + lt_prog_compiler_static_F77='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl_F77='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static_F77='-non_shared' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C 5.9 + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + lt_prog_compiler_wl_F77='-Wl,' + ;; + *Sun\ F*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + lt_prog_compiler_wl_F77='' + ;; + esac + ;; + esac + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl_F77='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static_F77='-non_shared' + ;; + + rdos*) + lt_prog_compiler_static_F77='-non_shared' + ;; + + solaris*) + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + case $cc_basename in + f77* | f90* | f95*) + lt_prog_compiler_wl_F77='-Qoption ld ';; + *) + lt_prog_compiler_wl_F77='-Wl,';; + esac + ;; + + sunos4*) + lt_prog_compiler_wl_F77='-Qoption ld ' + lt_prog_compiler_pic_F77='-PIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_prog_compiler_pic_F77='-Kconform_pic' + lt_prog_compiler_static_F77='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_pic_F77='-KPIC' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + unicos*) + lt_prog_compiler_wl_F77='-Wl,' + lt_prog_compiler_can_build_shared_F77=no + ;; + + uts4*) + lt_prog_compiler_pic_F77='-pic' + lt_prog_compiler_static_F77='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared_F77=no + ;; + esac + fi + +{ $as_echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_F77" >&5 +$as_echo "$lt_prog_compiler_pic_F77" >&6; } + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_F77"; then + +{ $as_echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_F77 works... " >&6; } +if test "${lt_cv_prog_compiler_pic_works_F77+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works_F77=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_F77" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:19053: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:19057: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works_F77=yes + fi + fi + $rm conftest* + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_pic_works_F77" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works_F77" >&6; } + +if test x"$lt_cv_prog_compiler_pic_works_F77" = xyes; then + case $lt_prog_compiler_pic_F77 in + "" | " "*) ;; + *) lt_prog_compiler_pic_F77=" $lt_prog_compiler_pic_F77" ;; + esac +else + lt_prog_compiler_pic_F77= + lt_prog_compiler_can_build_shared_F77=no +fi + +fi +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_F77= + ;; + *) + lt_prog_compiler_pic_F77="$lt_prog_compiler_pic_F77" + ;; +esac + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl_F77 eval lt_tmp_static_flag=\"$lt_prog_compiler_static_F77\" +{ $as_echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if test "${lt_cv_prog_compiler_static_works_F77+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works_F77=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works_F77=yes + fi + else + lt_cv_prog_compiler_static_works_F77=yes + fi + fi + $rm -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_static_works_F77" >&5 +$as_echo "$lt_cv_prog_compiler_static_works_F77" >&6; } + +if test x"$lt_cv_prog_compiler_static_works_F77" = xyes; then + : +else + lt_prog_compiler_static_F77= +fi + + +{ $as_echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test "${lt_cv_prog_compiler_c_o_F77+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_F77=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:19157: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:19161: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_F77=yes + fi + fi + chmod u+w . 2>&5 + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_F77" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_F77" >&6; } + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o_F77" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:$LINENO: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test "$hard_links" = no; then + { $as_echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + +{ $as_echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + runpath_var= + allow_undefined_flag_F77= + enable_shared_with_static_runtimes_F77=no + archive_cmds_F77= + archive_expsym_cmds_F77= + old_archive_From_new_cmds_F77= + old_archive_from_expsyms_cmds_F77= + export_dynamic_flag_spec_F77= + whole_archive_flag_spec_F77= + thread_safe_flag_spec_F77= + hardcode_libdir_flag_spec_F77= + hardcode_libdir_flag_spec_ld_F77= + hardcode_libdir_separator_F77= + hardcode_direct_F77=no + hardcode_minus_L_F77=no + hardcode_shlibpath_var_F77=unsupported + link_all_deplibs_F77=unknown + hardcode_automatic_F77=no + module_cmds_F77= + module_expsym_cmds_F77= + always_export_symbols_F77=no + export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms_F77= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + exclude_expsyms_F77='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. + extract_expsyms_cmds= + # Just being paranoid about ensuring that cc_basename is set. + for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + + case $host_os in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + ld_shlibs_F77=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_F77='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec_F77='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_F77="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec_F77= + fi + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[3-9]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs_F77=no + cat <&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + fi + ;; + + amigaos*) + archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_minus_L_F77=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can't use + # them. + ld_shlibs_F77=no + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_F77=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_F77='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs_F77=no + fi + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, F77) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_F77='-L$libdir' + allow_undefined_flag_F77=unsupported + always_export_symbols_F77=no + enable_shared_with_static_runtimes_F77=yes + export_symbols_cmds_F77='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds_F77='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs_F77=no + fi + ;; + + interix[3-9]*) + hardcode_direct_F77=no + hardcode_shlibpath_var_F77=no + hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' + export_dynamic_flag_spec_F77='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds_F77='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds_F77='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | k*bsd*-gnu) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + tmp_addflag= + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers + whole_archive_flag_spec_F77='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + whole_archive_flag_spec_F77='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + *) + tmp_sharedflag='-shared' ;; + esac + archive_cmds_F77='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test $supports_anon_versioning = yes; then + archive_expsym_cmds_F77='$echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + $echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + else + ld_shlibs_F77=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds_F77='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + ld_shlibs_F77=no + cat <&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_F77=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs_F77=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec_F77='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' + archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' + else + ld_shlibs_F77=no + fi + ;; + esac + ;; + + sunos4*) + archive_cmds_F77='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_F77=no + fi + ;; + esac + + if test "$ld_shlibs_F77" = no; then + runpath_var= + hardcode_libdir_flag_spec_F77= + export_dynamic_flag_spec_F77= + whole_archive_flag_spec_F77= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag_F77=unsupported + always_export_symbols_F77=yes + archive_expsym_cmds_F77='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L_F77=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct_F77=unsupported + fi + ;; + + aix[4-9]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + export_symbols_cmds_F77='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_F77='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_F77='' + hardcode_direct_F77=yes + hardcode_libdir_separator_F77=':' + link_all_deplibs_F77=yes + + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct_F77=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_F77=yes + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_libdir_separator_F77= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols_F77=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag_F77='-berok' + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_f77_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds_F77="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec_F77='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag_F77="-z nodefs" + archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF + program main + + end +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_f77_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_F77='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_F77=' ${wl}-bernotok' + allow_undefined_flag_F77=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_F77='$convenience' + archive_cmds_need_lc_F77=yes + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds_F77="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + archive_cmds_F77='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_minus_L_F77=yes + # see comment about different semantics on the GNU ld section + ld_shlibs_F77=no + ;; + + bsdi[45]*) + export_dynamic_flag_spec_F77=-rdynamic + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec_F77=' ' + allow_undefined_flag_F77=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds_F77='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_From_new_cmds_F77='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds_F77='lib -OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path_F77='`cygpath -w "$srcfile"`' + enable_shared_with_static_runtimes_F77=yes + ;; + + darwin* | rhapsody*) + case $host_os in + rhapsody* | darwin1.[012]) + allow_undefined_flag_F77='${wl}-undefined ${wl}suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + allow_undefined_flag_F77='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + ;; + 10.*) + allow_undefined_flag_F77='${wl}-undefined ${wl}dynamic_lookup' + ;; + esac + fi + ;; + esac + archive_cmds_need_lc_F77=no + hardcode_direct_F77=no + hardcode_automatic_F77=yes + hardcode_shlibpath_var_F77=unsupported + whole_archive_flag_spec_F77='' + link_all_deplibs_F77=yes + if test "$GCC" = yes ; then + output_verbose_link_cmd='echo' + archive_cmds_F77="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + module_cmds_F77="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + archive_expsym_cmds_F77="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + module_expsym_cmds_F77="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + else + case $cc_basename in + xlc*) + output_verbose_link_cmd='echo' + archive_cmds_F77='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring' + module_cmds_F77='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + archive_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + module_expsym_cmds_F77='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + ld_shlibs_F77=no + ;; + esac + fi + ;; + + dgux*) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_shlibpath_var_F77=no + ;; + + freebsd1*) + ld_shlibs_F77=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=yes + hardcode_minus_L_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + archive_cmds_F77='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + hpux9*) + if test "$GCC" = yes; then + archive_cmds_F77='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + archive_cmds_F77='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_F77=: + hardcode_direct_F77=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_F77=yes + export_dynamic_flag_spec_F77='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_F77='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_F77=: + + hardcode_direct_F77=yes + export_dynamic_flag_spec_F77='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_F77=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds_F77='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_F77='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_F77='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec_F77='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_F77=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_libdir_flag_spec_ld_F77='+b $libdir' + hardcode_direct_F77=no + hardcode_shlibpath_var_F77=no + ;; + *) + hardcode_direct_F77=yes + export_dynamic_flag_spec_F77='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_F77=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + archive_cmds_F77='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds_F77='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_ld_F77='-rpath $libdir' + fi + hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_F77=: + link_all_deplibs_F77=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds_F77='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + newsos6) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=yes + hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_F77=: + hardcode_shlibpath_var_F77=no + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + hardcode_direct_F77=yes + hardcode_shlibpath_var_F77=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' + export_dynamic_flag_spec_F77='${wl}-E' + else + case $host_os in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + archive_cmds_F77='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_F77='-R$libdir' + ;; + *) + archive_cmds_F77='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_F77='${wl}-rpath,$libdir' + ;; + esac + fi + else + ld_shlibs_F77=no + fi + ;; + + os2*) + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_minus_L_F77=yes + allow_undefined_flag_F77=unsupported + archive_cmds_F77='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_From_new_cmds_F77='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag_F77=' -expect_unresolved \*' + archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_F77=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag_F77=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_F77='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_F77='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag_F77=' -expect_unresolved \*' + archive_cmds_F77='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds_F77='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec_F77='-rpath $libdir' + fi + hardcode_libdir_separator_F77=: + ;; + + solaris*) + no_undefined_flag_F77=' -z text' + if test "$GCC" = yes; then + wlarc='${wl}' + archive_cmds_F77='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' + else + wlarc='' + archive_cmds_F77='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds_F77='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + fi + hardcode_libdir_flag_spec_F77='-R$libdir' + hardcode_shlibpath_var_F77=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. GCC discards it without `$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test "$GCC" = yes; then + whole_archive_flag_spec_F77='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + else + whole_archive_flag_spec_F77='-z allextract$convenience -z defaultextract' + fi + ;; + esac + link_all_deplibs_F77=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds_F77='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_F77='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_direct_F77=yes + hardcode_minus_L_F77=yes + hardcode_shlibpath_var_F77=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds_F77='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds_F77='$CC -r -o $output$reload_objs' + hardcode_direct_F77=no + ;; + motorola) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_F77=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var_F77=no + ;; + + sysv4.3*) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_F77=no + export_dynamic_flag_spec_F77='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_F77=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs_F77=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag_F77='${wl}-z,text' + archive_cmds_need_lc_F77=no + hardcode_shlibpath_var_F77=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds_F77='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_F77='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag_F77='${wl}-z,text' + allow_undefined_flag_F77='${wl}-z,nodefs' + archive_cmds_need_lc_F77=no + hardcode_shlibpath_var_F77=no + hardcode_libdir_flag_spec_F77='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + hardcode_libdir_separator_F77=':' + link_all_deplibs_F77=yes + export_dynamic_flag_spec_F77='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds_F77='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_F77='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_F77='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + archive_cmds_F77='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_F77='-L$libdir' + hardcode_shlibpath_var_F77=no + ;; + + *) + ld_shlibs_F77=no + ;; + esac + fi + +{ $as_echo "$as_me:$LINENO: result: $ld_shlibs_F77" >&5 +$as_echo "$ld_shlibs_F77" >&6; } +test "$ld_shlibs_F77" = no && can_build_shared=no + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_F77" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_F77=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds_F77 in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } + $rm conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_F77 + pic_flag=$lt_prog_compiler_pic_F77 + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_F77 + allow_undefined_flag_F77= + if { (eval echo "$as_me:$LINENO: \"$archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 + (eval $archive_cmds_F77 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + then + archive_cmds_need_lc_F77=no + else + archive_cmds_need_lc_F77=yes + fi + allow_undefined_flag_F77=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + { $as_echo "$as_me:$LINENO: result: $archive_cmds_need_lc_F77" >&5 +$as_echo "$archive_cmds_need_lc_F77" >&6; } + ;; + esac + fi + ;; +esac + +{ $as_echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" + +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[4-9]*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[123]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +interix[3-9]*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + shlibpath_overrides_runpath=no + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + shlibpath_overrides_runpath=yes + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:$LINENO: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_sys_lib_search_path_spec="$sys_lib_search_path_spec" +fi + +sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec" +fi + +sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +{ $as_echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action_F77= +if test -n "$hardcode_libdir_flag_spec_F77" || \ + test -n "$runpath_var_F77" || \ + test "X$hardcode_automatic_F77" = "Xyes" ; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct_F77" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, F77)" != no && + test "$hardcode_minus_L_F77" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action_F77=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_F77=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_F77=unsupported +fi +{ $as_echo "$as_me:$LINENO: result: $hardcode_action_F77" >&5 +$as_echo "$hardcode_action_F77" >&6; } + +if test "$hardcode_action_F77" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + +# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + compiler_F77 \ + CC_F77 \ + LD_F77 \ + lt_prog_compiler_wl_F77 \ + lt_prog_compiler_pic_F77 \ + lt_prog_compiler_static_F77 \ + lt_prog_compiler_no_builtin_flag_F77 \ + export_dynamic_flag_spec_F77 \ + thread_safe_flag_spec_F77 \ + whole_archive_flag_spec_F77 \ + enable_shared_with_static_runtimes_F77 \ + old_archive_cmds_F77 \ + old_archive_from_new_cmds_F77 \ + predep_objects_F77 \ + postdep_objects_F77 \ + predeps_F77 \ + postdeps_F77 \ + compiler_lib_search_path_F77 \ + compiler_lib_search_dirs_F77 \ + archive_cmds_F77 \ + archive_expsym_cmds_F77 \ + postinstall_cmds_F77 \ + postuninstall_cmds_F77 \ + old_archive_from_expsyms_cmds_F77 \ + allow_undefined_flag_F77 \ + no_undefined_flag_F77 \ + export_symbols_cmds_F77 \ + hardcode_libdir_flag_spec_F77 \ + hardcode_libdir_flag_spec_ld_F77 \ + hardcode_libdir_separator_F77 \ + hardcode_automatic_F77 \ + module_cmds_F77 \ + module_expsym_cmds_F77 \ + lt_cv_prog_compiler_c_o_F77 \ + fix_srcfile_path_F77 \ + exclude_expsyms_F77 \ + include_expsyms_F77; do + + case $var in + old_archive_cmds_F77 | \ + old_archive_from_new_cmds_F77 | \ + archive_cmds_F77 | \ + archive_expsym_cmds_F77 | \ + module_cmds_F77 | \ + module_expsym_cmds_F77 | \ + old_archive_from_expsyms_cmds_F77 | \ + export_symbols_cmds_F77 | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\$0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + +cfgfile="$ofile" + + cat <<__EOF__ >> "$cfgfile" +# ### BEGIN LIBTOOL TAG CONFIG: $tagname + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_F77 + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_F77 + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# LTCC compiler flags. +LTCFLAGS=$lt_LTCFLAGS + +# A language-specific compiler. +CC=$lt_compiler_F77 + +# Is the compiler the GNU C compiler? +with_gcc=$GCC_F77 + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_LD_F77 + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_F77 + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_F77 +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_F77 + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_F77 + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_F77 + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_F77 + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_F77 + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec_F77 + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds_F77 +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_F77 + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_F77 + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds_F77 +archive_expsym_cmds=$lt_archive_expsym_cmds_F77 +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_module_cmds_F77 +module_expsym_cmds=$lt_module_expsym_cmds_F77 + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_predep_objects_F77 + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_postdep_objects_F77 + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_predeps_F77 + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_postdeps_F77 + +# The directories searched by this compiler when creating a shared +# library +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_F77 + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_F77 + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_F77 + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_F77 + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_F77 + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_F77 + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_F77 + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_F77 + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct_F77 + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L_F77 + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_F77 + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$hardcode_automatic_F77 + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_F77 + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path=$lt_fix_srcfile_path + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols_F77 + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_F77 + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_F77 + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_F77 + +# ### END LIBTOOL TAG CONFIG: $tagname + +__EOF__ + + +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + 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 + +CC="$lt_save_CC" + + else + tagname="" + fi + ;; + + GCJ) + if test -n "$GCJ" && test "X$GCJ" != "Xno"; then + + +# Source file extension for Java test sources. +ac_ext=java + +# Object file extension for compiled Java test sources. +objext=o +objext_GCJ=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code="class foo {}" + +# Code to be used in simple link tests +lt_simple_link_test_code='public class conftest { public static void main(String[] argv) {}; }' + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$rm conftest* + +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$rm -r conftest* + + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +CC=${GCJ-"gcj"} +compiler=$CC +compiler_GCJ=$CC +for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + + +# GCJ did not exist at the time GCC didn't implicitly link libc in. +archive_cmds_need_lc_GCJ=no + +old_archive_cmds_GCJ=$old_archive_cmds + +## CAVEAT EMPTOR: +## There is no encapsulation within the following macros, do not change +## the running order or otherwise move them around unless you know exactly +## what you are doing... + +lt_prog_compiler_no_builtin_flag_GCJ= + +if test "$GCC" = yes; then + lt_prog_compiler_no_builtin_flag_GCJ=' -fno-builtin' + + +{ $as_echo "$as_me:$LINENO: checking if $compiler supports -fno-rtti -fno-exceptions" >&5 +$as_echo_n "checking if $compiler supports -fno-rtti -fno-exceptions... " >&6; } +if test "${lt_cv_prog_compiler_rtti_exceptions+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_rtti_exceptions=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="-fno-rtti -fno-exceptions" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:21378: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:21382: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_rtti_exceptions=yes + fi + fi + $rm conftest* + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_rtti_exceptions" >&5 +$as_echo "$lt_cv_prog_compiler_rtti_exceptions" >&6; } + +if test x"$lt_cv_prog_compiler_rtti_exceptions" = xyes; then + lt_prog_compiler_no_builtin_flag_GCJ="$lt_prog_compiler_no_builtin_flag_GCJ -fno-rtti -fno-exceptions" +else + : +fi + +fi + +lt_prog_compiler_wl_GCJ= +lt_prog_compiler_pic_GCJ= +lt_prog_compiler_static_GCJ= + +{ $as_echo "$as_me:$LINENO: checking for $compiler option to produce PIC" >&5 +$as_echo_n "checking for $compiler option to produce PIC... " >&6; } + + if test "$GCC" = yes; then + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_static_GCJ='-static' + + case $host_os in + aix*) + # All AIX code is PIC. + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_GCJ='-Bstatic' + fi + ;; + + amigaos*) + # FIXME: we need at least 68020 code to build shared libraries, but + # adding the `-m68020' flag to GCC prevents building anything better, + # like `-m68040'. + lt_prog_compiler_pic_GCJ='-m68020 -resident32 -malways-restore-a4' + ;; + + beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*) + # PIC is the default for these OSes. + ;; + + mingw* | cygwin* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + # Although the cygwin gcc ignores -fPIC, still need this for old-style + # (--disable-auto-import) libraries + + ;; + + darwin* | rhapsody*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + lt_prog_compiler_pic_GCJ='-fno-common' + ;; + + interix[3-9]*) + # Interix 3.x gcc -fpic/-fPIC options generate broken code. + # Instead, we relocate shared libraries at runtime. + ;; + + msdosdjgpp*) + # Just because we use GCC doesn't mean we suddenly get shared libraries + # on systems that don't support them. + lt_prog_compiler_can_build_shared_GCJ=no + enable_shared=no + ;; + + sysv4*MP*) + if test -d /usr/nec; then + lt_prog_compiler_pic_GCJ=-Kconform_pic + fi + ;; + + hpux*) + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_GCJ='-fPIC' + ;; + esac + ;; + + *) + lt_prog_compiler_pic_GCJ='-fPIC' + ;; + esac + else + # PORTME Check for flag to pass linker flags through the system compiler. + case $host_os in + aix*) + lt_prog_compiler_wl_GCJ='-Wl,' + if test "$host_cpu" = ia64; then + # AIX 5 now supports IA64 processor + lt_prog_compiler_static_GCJ='-Bstatic' + else + lt_prog_compiler_static_GCJ='-bnso -bI:/lib/syscalls.exp' + fi + ;; + darwin*) + # PIC is the default on this platform + # Common symbols not allowed in MH_DYLIB files + case $cc_basename in + xlc*) + lt_prog_compiler_pic_GCJ='-qnocommon' + lt_prog_compiler_wl_GCJ='-Wl,' + ;; + esac + ;; + + mingw* | cygwin* | pw32* | os2*) + # This hack is so that the source file can tell whether it is being + # built for inclusion in a dll (and should export symbols for example). + + ;; + + hpux9* | hpux10* | hpux11*) + lt_prog_compiler_wl_GCJ='-Wl,' + # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but + # not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + # +Z the default + ;; + *) + lt_prog_compiler_pic_GCJ='+Z' + ;; + esac + # Is there a better lt_prog_compiler_static that works with the bundled CC? + lt_prog_compiler_static_GCJ='${wl}-a ${wl}archive' + ;; + + irix5* | irix6* | nonstopux*) + lt_prog_compiler_wl_GCJ='-Wl,' + # PIC (with -KPIC) is the default. + lt_prog_compiler_static_GCJ='-non_shared' + ;; + + newsos6) + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + linux* | k*bsd*-gnu) + case $cc_basename in + icc* | ecc*) + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-static' + ;; + pgcc* | pgf77* | pgf90* | pgf95*) + # Portland Group compilers (*not* the Pentium gcc compiler, + # which looks to be a dead project) + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_pic_GCJ='-fpic' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + ccc*) + lt_prog_compiler_wl_GCJ='-Wl,' + # All Alpha code is PIC. + lt_prog_compiler_static_GCJ='-non_shared' + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) + # Sun C 5.9 + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-Bstatic' + lt_prog_compiler_wl_GCJ='-Wl,' + ;; + *Sun\ F*) + # Sun Fortran 8.3 passes all unrecognized flags to the linker + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-Bstatic' + lt_prog_compiler_wl_GCJ='' + ;; + esac + ;; + esac + ;; + + osf3* | osf4* | osf5*) + lt_prog_compiler_wl_GCJ='-Wl,' + # All OSF/1 code is PIC. + lt_prog_compiler_static_GCJ='-non_shared' + ;; + + rdos*) + lt_prog_compiler_static_GCJ='-non_shared' + ;; + + solaris*) + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-Bstatic' + case $cc_basename in + f77* | f90* | f95*) + lt_prog_compiler_wl_GCJ='-Qoption ld ';; + *) + lt_prog_compiler_wl_GCJ='-Wl,';; + esac + ;; + + sunos4*) + lt_prog_compiler_wl_GCJ='-Qoption ld ' + lt_prog_compiler_pic_GCJ='-PIC' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + sysv4 | sysv4.2uw2* | sysv4.3*) + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + sysv4*MP*) + if test -d /usr/nec ;then + lt_prog_compiler_pic_GCJ='-Kconform_pic' + lt_prog_compiler_static_GCJ='-Bstatic' + fi + ;; + + sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*) + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_pic_GCJ='-KPIC' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + unicos*) + lt_prog_compiler_wl_GCJ='-Wl,' + lt_prog_compiler_can_build_shared_GCJ=no + ;; + + uts4*) + lt_prog_compiler_pic_GCJ='-pic' + lt_prog_compiler_static_GCJ='-Bstatic' + ;; + + *) + lt_prog_compiler_can_build_shared_GCJ=no + ;; + esac + fi + +{ $as_echo "$as_me:$LINENO: result: $lt_prog_compiler_pic_GCJ" >&5 +$as_echo "$lt_prog_compiler_pic_GCJ" >&6; } + +# +# Check to make sure the PIC flag actually works. +# +if test -n "$lt_prog_compiler_pic_GCJ"; then + +{ $as_echo "$as_me:$LINENO: checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works" >&5 +$as_echo_n "checking if $compiler PIC flag $lt_prog_compiler_pic_GCJ works... " >&6; } +if test "${lt_cv_prog_compiler_pic_works_GCJ+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_pic_works_GCJ=no + ac_outfile=conftest.$ac_objext + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + lt_compiler_flag="$lt_prog_compiler_pic_GCJ" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + # The option is referenced via a variable to avoid confusing sed. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:21668: $lt_compile\"" >&5) + (eval "$lt_compile" 2>conftest.err) + ac_status=$? + cat conftest.err >&5 + echo "$as_me:21672: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s "$ac_outfile"; then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings other than the usual output. + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_pic_works_GCJ=yes + fi + fi + $rm conftest* + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_pic_works_GCJ" >&5 +$as_echo "$lt_cv_prog_compiler_pic_works_GCJ" >&6; } + +if test x"$lt_cv_prog_compiler_pic_works_GCJ" = xyes; then + case $lt_prog_compiler_pic_GCJ in + "" | " "*) ;; + *) lt_prog_compiler_pic_GCJ=" $lt_prog_compiler_pic_GCJ" ;; + esac +else + lt_prog_compiler_pic_GCJ= + lt_prog_compiler_can_build_shared_GCJ=no +fi + +fi +case $host_os in + # For platforms which do not support PIC, -DPIC is meaningless: + *djgpp*) + lt_prog_compiler_pic_GCJ= + ;; + *) + lt_prog_compiler_pic_GCJ="$lt_prog_compiler_pic_GCJ" + ;; +esac + +# +# Check to make sure the static flag actually works. +# +wl=$lt_prog_compiler_wl_GCJ eval lt_tmp_static_flag=\"$lt_prog_compiler_static_GCJ\" +{ $as_echo "$as_me:$LINENO: checking if $compiler static flag $lt_tmp_static_flag works" >&5 +$as_echo_n "checking if $compiler static flag $lt_tmp_static_flag works... " >&6; } +if test "${lt_cv_prog_compiler_static_works_GCJ+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_static_works_GCJ=no + save_LDFLAGS="$LDFLAGS" + LDFLAGS="$LDFLAGS $lt_tmp_static_flag" + echo "$lt_simple_link_test_code" > conftest.$ac_ext + if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then + # The linker can only warn and ignore the option if not recognized + # So say no if there are warnings + if test -s conftest.err; then + # Append any errors to the config.log. + cat conftest.err 1>&5 + $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp + $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2 + if diff conftest.exp conftest.er2 >/dev/null; then + lt_cv_prog_compiler_static_works_GCJ=yes + fi + else + lt_cv_prog_compiler_static_works_GCJ=yes + fi + fi + $rm -r conftest* + LDFLAGS="$save_LDFLAGS" + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_static_works_GCJ" >&5 +$as_echo "$lt_cv_prog_compiler_static_works_GCJ" >&6; } + +if test x"$lt_cv_prog_compiler_static_works_GCJ" = xyes; then + : +else + lt_prog_compiler_static_GCJ= +fi + + +{ $as_echo "$as_me:$LINENO: checking if $compiler supports -c -o file.$ac_objext" >&5 +$as_echo_n "checking if $compiler supports -c -o file.$ac_objext... " >&6; } +if test "${lt_cv_prog_compiler_c_o_GCJ+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_prog_compiler_c_o_GCJ=no + $rm -r conftest 2>/dev/null + mkdir conftest + cd conftest + mkdir out + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + lt_compiler_flag="-o out/conftest2.$ac_objext" + # Insert the option either (1) after the last *FLAGS variable, or + # (2) before a word containing "conftest.", or (3) at the end. + # Note that $ac_compile itself does not contain backslashes and begins + # with a dollar sign (not a hyphen), so the echo should work correctly. + lt_compile=`echo "$ac_compile" | $SED \ + -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ + -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ + -e 's:$: $lt_compiler_flag:'` + (eval echo "\"\$as_me:21772: $lt_compile\"" >&5) + (eval "$lt_compile" 2>out/conftest.err) + ac_status=$? + cat out/conftest.err >&5 + echo "$as_me:21776: \$? = $ac_status" >&5 + if (exit $ac_status) && test -s out/conftest2.$ac_objext + then + # The compiler can only warn and ignore the option if not recognized + # So say no if there are warnings + $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp + $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2 + if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then + lt_cv_prog_compiler_c_o_GCJ=yes + fi + fi + chmod u+w . 2>&5 + $rm conftest* + # SGI C++ compiler will create directory out/ii_files/ for + # template instantiation + test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files + $rm out/* && rmdir out + cd .. + rmdir conftest + $rm conftest* + +fi +{ $as_echo "$as_me:$LINENO: result: $lt_cv_prog_compiler_c_o_GCJ" >&5 +$as_echo "$lt_cv_prog_compiler_c_o_GCJ" >&6; } + + +hard_links="nottested" +if test "$lt_cv_prog_compiler_c_o_GCJ" = no && test "$need_locks" != no; then + # do not overwrite the value of need_locks provided by the user + { $as_echo "$as_me:$LINENO: checking if we can lock with hard links" >&5 +$as_echo_n "checking if we can lock with hard links... " >&6; } + hard_links=yes + $rm conftest* + ln conftest.a conftest.b 2>/dev/null && hard_links=no + touch conftest.a + ln conftest.a conftest.b 2>&5 || hard_links=no + ln conftest.a conftest.b 2>/dev/null && hard_links=no + { $as_echo "$as_me:$LINENO: result: $hard_links" >&5 +$as_echo "$hard_links" >&6; } + if test "$hard_links" = no; then + { $as_echo "$as_me:$LINENO: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&5 +$as_echo "$as_me: WARNING: \`$CC' does not support \`-c -o', so \`make -j' may be unsafe" >&2;} + need_locks=warn + fi +else + need_locks=no +fi + +{ $as_echo "$as_me:$LINENO: checking whether the $compiler linker ($LD) supports shared libraries" >&5 +$as_echo_n "checking whether the $compiler linker ($LD) supports shared libraries... " >&6; } + + runpath_var= + allow_undefined_flag_GCJ= + enable_shared_with_static_runtimes_GCJ=no + archive_cmds_GCJ= + archive_expsym_cmds_GCJ= + old_archive_From_new_cmds_GCJ= + old_archive_from_expsyms_cmds_GCJ= + export_dynamic_flag_spec_GCJ= + whole_archive_flag_spec_GCJ= + thread_safe_flag_spec_GCJ= + hardcode_libdir_flag_spec_GCJ= + hardcode_libdir_flag_spec_ld_GCJ= + hardcode_libdir_separator_GCJ= + hardcode_direct_GCJ=no + hardcode_minus_L_GCJ=no + hardcode_shlibpath_var_GCJ=unsupported + link_all_deplibs_GCJ=unknown + hardcode_automatic_GCJ=no + module_cmds_GCJ= + module_expsym_cmds_GCJ= + always_export_symbols_GCJ=no + export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' + # include_expsyms should be a list of space-separated symbols to be *always* + # included in the symbol list + include_expsyms_GCJ= + # exclude_expsyms can be an extended regexp of symbols to exclude + # it will be wrapped by ` (' and `)$', so one must not match beginning or + # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc', + # as well as any symbol that contains `d'. + exclude_expsyms_GCJ='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' + # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out + # platforms (ab)use it in PIC code, but their linkers get confused if + # the symbol is explicitly referenced. Since portable code cannot + # rely on this symbol name, it's probably fine to never include it in + # preloaded symbol tables. + # Exclude shared library initialization/finalization symbols. + extract_expsyms_cmds= + # Just being paranoid about ensuring that cc_basename is set. + for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + + case $host_os in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + interix*) + # we just hope/assume this is gcc and not c89 (= MSVC++) + with_gnu_ld=yes + ;; + openbsd*) + with_gnu_ld=no + ;; + esac + + ld_shlibs_GCJ=yes + if test "$with_gnu_ld" = yes; then + # If archive_cmds runs LD, not CC, wlarc should be empty + wlarc='${wl}' + + # Set some defaults for GNU ld with shared library support. These + # are reset later if shared libraries are not supported. Putting them + # here allows them to be overridden if necessary. + runpath_var=LD_RUN_PATH + hardcode_libdir_flag_spec_GCJ='${wl}--rpath ${wl}$libdir' + export_dynamic_flag_spec_GCJ='${wl}--export-dynamic' + # ancient GNU ld didn't support --whole-archive et. al. + if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then + whole_archive_flag_spec_GCJ="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive' + else + whole_archive_flag_spec_GCJ= + fi + supports_anon_versioning=no + case `$LD -v 2>/dev/null` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.10.*) ;; # catch versions < 2.11 + *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ... + *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ... + *\ 2.11.*) ;; # other 2.11 versions + *) supports_anon_versioning=yes ;; + esac + + # See if GNU ld supports shared libraries. + case $host_os in + aix[3-9]*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs_GCJ=no + cat <&2 + +*** Warning: the GNU linker, at least up to release 2.9.1, is reported +*** to be unable to reliably create shared libraries on AIX. +*** Therefore, libtool is disabling shared libraries support. If you +*** really care for shared libraries, you may want to modify your PATH +*** so that a non-GNU linker is found, and then restart. + +EOF + fi + ;; + + amigaos*) + archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_minus_L_GCJ=yes + + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can't use + # them. + ld_shlibs_GCJ=no + ;; + + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + allow_undefined_flag_GCJ=unsupported + # Joseph Beckenbach says some releases of gcc + # support --undefined. This deserves some investigation. FIXME + archive_cmds_GCJ='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + else + ld_shlibs_GCJ=no + fi + ;; + + cygwin* | mingw* | pw32*) + # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, GCJ) is actually meaningless, + # as there is no search path for DLLs. + hardcode_libdir_flag_spec_GCJ='-L$libdir' + allow_undefined_flag_GCJ=unsupported + always_export_symbols_GCJ=no + enable_shared_with_static_runtimes_GCJ=yes + export_symbols_cmds_GCJ='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[BCDGRS][ ]/s/.*[ ]\([^ ]*\)/\1 DATA/'\'' -e '\''/^[AITW][ ]/s/.*[ ]//'\'' | sort | uniq > $export_symbols' + + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + # If the export-symbols file already is a .def file (1st line + # is EXPORTS), use it as is; otherwise, prepend... + archive_expsym_cmds_GCJ='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + cp $export_symbols $output_objdir/$soname.def; + else + echo EXPORTS > $output_objdir/$soname.def; + cat $export_symbols >> $output_objdir/$soname.def; + fi~ + $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' + else + ld_shlibs_GCJ=no + fi + ;; + + interix[3-9]*) + hardcode_direct_GCJ=no + hardcode_shlibpath_var_GCJ=no + hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' + export_dynamic_flag_spec_GCJ='${wl}-E' + # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc. + # Instead, shared libraries are loaded at an image base (0x10000000 by + # default) and relocated if they conflict, which is a slow very memory + # consuming and fragmenting process. To avoid this, we pick a random, + # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link + # time. Moving up from 0x10000000 also allows more sbrk(2) space. + archive_cmds_GCJ='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + archive_expsym_cmds_GCJ='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib' + ;; + + gnu* | linux* | k*bsd*-gnu) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + tmp_addflag= + case $cc_basename,$host_cpu in + pgcc*) # Portland Group C compiler + whole_archive_flag_spec_GCJ='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag' + ;; + pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers + whole_archive_flag_spec_GCJ='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_addflag=' $pic_flag -Mnomain' ;; + ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64 + tmp_addflag=' -i_dynamic' ;; + efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64 + tmp_addflag=' -i_dynamic -nofor_main' ;; + ifc* | ifort*) # Intel Fortran compiler + tmp_addflag=' -nofor_main' ;; + esac + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*) # Sun C 5.9 + whole_archive_flag_spec_GCJ='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive' + tmp_sharedflag='-G' ;; + *Sun\ F*) # Sun Fortran 8.3 + tmp_sharedflag='-G' ;; + *) + tmp_sharedflag='-shared' ;; + esac + archive_cmds_GCJ='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + + if test $supports_anon_versioning = yes; then + archive_expsym_cmds_GCJ='$echo "{ global:" > $output_objdir/$libname.ver~ + cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~ + $echo "local: *; };" >> $output_objdir/$libname.ver~ + $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib' + fi + else + ld_shlibs_GCJ=no + fi + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds_GCJ='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib' + wlarc= + else + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + fi + ;; + + solaris*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + ld_shlibs_GCJ=no + cat <&2 + +*** Warning: The releases 2.8.* of the GNU linker cannot reliably +*** create shared libraries on Solaris systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.9.1 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +EOF + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_GCJ=no + fi + ;; + + sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*) + case `$LD -v 2>&1` in + *\ [01].* | *\ 2.[0-9].* | *\ 2.1[0-5].*) + ld_shlibs_GCJ=no + cat <<_LT_EOF 1>&2 + +*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not +*** reliably create shared libraries on SCO systems. Therefore, libtool +*** is disabling shared libraries support. We urge you to upgrade GNU +*** binutils to release 2.16.91.0.3 or newer. Another option is to modify +*** your PATH or compiler configuration so that the native linker is +*** used, and then restart. + +_LT_EOF + ;; + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + hardcode_libdir_flag_spec_GCJ='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`' + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib' + archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib' + else + ld_shlibs_GCJ=no + fi + ;; + esac + ;; + + sunos4*) + archive_cmds_GCJ='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags' + wlarc= + hardcode_direct_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib' + archive_expsym_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib' + else + ld_shlibs_GCJ=no + fi + ;; + esac + + if test "$ld_shlibs_GCJ" = no; then + runpath_var= + hardcode_libdir_flag_spec_GCJ= + export_dynamic_flag_spec_GCJ= + whole_archive_flag_spec_GCJ= + fi + else + # PORTME fill in a description of your system's linker (not GNU ld) + case $host_os in + aix3*) + allow_undefined_flag_GCJ=unsupported + always_export_symbols_GCJ=yes + archive_expsym_cmds_GCJ='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname' + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L_GCJ=yes + if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct_GCJ=unsupported + fi + ;; + + aix[4-9]*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + exp_sym_flag='-Bexport' + no_entry_flag="" + else + # If we're using GNU nm, then we don't want the "-C" option. + # -C means demangle to AIX nm, but means don't demangle with GNU nm + if $NM -V 2>&1 | grep 'GNU' > /dev/null; then + export_symbols_cmds_GCJ='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + else + export_symbols_cmds_GCJ='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\$2 == "T") || (\$2 == "D") || (\$2 == "B")) && (substr(\$3,1,1) != ".")) { print \$3 } }'\'' | sort -u > $export_symbols' + fi + aix_use_runtimelinking=no + + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + ;; + esac + + exp_sym_flag='-bexport' + no_entry_flag='-bnoentry' + fi + + # When large executables or shared objects are built, AIX ld can + # have problems creating the table of contents. If linking a library + # or program results in "error TOC overflow" add -mminimal-toc to + # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not + # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS. + + archive_cmds_GCJ='' + hardcode_direct_GCJ=yes + hardcode_libdir_separator_GCJ=':' + link_all_deplibs_GCJ=yes + + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + # We only want to do this on AIX 4.2 and lower, the check + # below for broken collect2 doesn't work under 4.3+ + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + : + else + # We have old collect2 + hardcode_direct_GCJ=unsupported + # It fails to find uninstalled libraries when the uninstalled + # path is not listed in the libpath. Setting hardcode_minus_L + # to unsupported forces relinking + hardcode_minus_L_GCJ=yes + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_libdir_separator_GCJ= + fi + ;; + esac + shared_flag='-shared' + if test "$aix_use_runtimelinking" = yes; then + shared_flag="$shared_flag "'${wl}-G' + fi + else + # not using gcc + if test "$host_cpu" = ia64; then + # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release + # chokes on -Wl,-G. The following line is correct: + shared_flag='-G' + else + if test "$aix_use_runtimelinking" = yes; then + shared_flag='${wl}-G' + else + shared_flag='${wl}-bM:SRE' + fi + fi + fi + + # It seems that -bexpall does not export symbols beginning with + # underscore (_), so it is better to generate a list of symbols to export. + always_export_symbols_GCJ=yes + if test "$aix_use_runtimelinking" = yes; then + # Warning - without using the other runtime loading flags (-brtl), + # -berok will link without error, but may produce a broken library. + allow_undefined_flag_GCJ='-berok' + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath" + archive_expsym_cmds_GCJ="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec_GCJ='${wl}-R $libdir:/usr/lib:/lib' + allow_undefined_flag_GCJ="-z nodefs" + archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols" + else + # Determine the default libpath from the value encoded in an empty executable. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + +lt_aix_libpath_sed=' + /Import File Strings/,/^$/ { + /^0/ { + s/^0 *\(.*\)$/\1/ + p + } + }' +aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +# Check for a 64-bit object if we didn't find anything. +if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"` +fi +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi + + hardcode_libdir_flag_spec_GCJ='${wl}-blibpath:$libdir:'"$aix_libpath" + # Warning - without using the other run time loading flags, + # -berok will link without error, but may produce a broken library. + no_undefined_flag_GCJ=' ${wl}-bernotok' + allow_undefined_flag_GCJ=' ${wl}-berok' + # Exported symbols can be pulled into shared objects from archives + whole_archive_flag_spec_GCJ='$convenience' + archive_cmds_need_lc_GCJ=yes + # This is similar to how AIX traditionally builds its shared libraries. + archive_expsym_cmds_GCJ="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname' + fi + fi + ;; + + amigaos*) + archive_cmds_GCJ='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)' + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_minus_L_GCJ=yes + # see comment about different semantics on the GNU ld section + ld_shlibs_GCJ=no + ;; + + bsdi[45]*) + export_dynamic_flag_spec_GCJ=-rdynamic + ;; + + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec_GCJ=' ' + allow_undefined_flag_GCJ=unsupported + # Tell ltmain to make .lib files, not .a files. + libext=lib + # Tell ltmain to make .dll files, not .so files. + shrext_cmds=".dll" + # FIXME: Setting linknames here is a bad hack. + archive_cmds_GCJ='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames=' + # The linker will automatically build a .lib file if we build a DLL. + old_archive_From_new_cmds_GCJ='true' + # FIXME: Should let the user specify the lib program. + old_archive_cmds_GCJ='lib -OUT:$oldlib$oldobjs$old_deplibs' + fix_srcfile_path_GCJ='`cygpath -w "$srcfile"`' + enable_shared_with_static_runtimes_GCJ=yes + ;; + + darwin* | rhapsody*) + case $host_os in + rhapsody* | darwin1.[012]) + allow_undefined_flag_GCJ='${wl}-undefined ${wl}suppress' + ;; + *) # Darwin 1.3 on + if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then + allow_undefined_flag_GCJ='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + else + case ${MACOSX_DEPLOYMENT_TARGET} in + 10.[012]) + allow_undefined_flag_GCJ='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' + ;; + 10.*) + allow_undefined_flag_GCJ='${wl}-undefined ${wl}dynamic_lookup' + ;; + esac + fi + ;; + esac + archive_cmds_need_lc_GCJ=no + hardcode_direct_GCJ=no + hardcode_automatic_GCJ=yes + hardcode_shlibpath_var_GCJ=unsupported + whole_archive_flag_spec_GCJ='' + link_all_deplibs_GCJ=yes + if test "$GCC" = yes ; then + output_verbose_link_cmd='echo' + archive_cmds_GCJ="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod${_lt_dsymutil}" + module_cmds_GCJ="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dsymutil}" + archive_expsym_cmds_GCJ="sed 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}" + module_expsym_cmds_GCJ="sed -e 's,^,_,' < \$export_symbols > \$output_objdir/\${libname}-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}" + else + case $cc_basename in + xlc*) + output_verbose_link_cmd='echo' + archive_cmds_GCJ='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring' + module_cmds_GCJ='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags' + # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds + archive_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + module_expsym_cmds_GCJ='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}' + ;; + *) + ld_shlibs_GCJ=no + ;; + esac + fi + ;; + + dgux*) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_shlibpath_var_GCJ=no + ;; + + freebsd1*) + ld_shlibs_GCJ=no + ;; + + # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor + # support. Future versions do this automatically, but an explicit c++rt0.o + # does not break anything, and helps significantly (at the cost of a little + # extra space). + freebsd2.2*) + archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o' + hardcode_libdir_flag_spec_GCJ='-R$libdir' + hardcode_direct_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + # Unfortunately, older versions of FreeBSD 2 do not have this feature. + freebsd2*) + archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_GCJ=yes + hardcode_minus_L_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + # FreeBSD 3 and greater uses gcc -shared to do shared libraries. + freebsd* | dragonfly*) + archive_cmds_GCJ='$CC -shared -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_GCJ='-R$libdir' + hardcode_direct_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + hpux9*) + if test "$GCC" = yes; then + archive_cmds_GCJ='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + else + archive_cmds_GCJ='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib' + fi + hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + hardcode_direct_GCJ=yes + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_GCJ=yes + export_dynamic_flag_spec_GCJ='${wl}-E' + ;; + + hpux10*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + archive_cmds_GCJ='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_GCJ='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags' + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + + hardcode_direct_GCJ=yes + export_dynamic_flag_spec_GCJ='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_GCJ=yes + fi + ;; + + hpux11*) + if test "$GCC" = yes -a "$with_gnu_ld" = no; then + case $host_cpu in + hppa*64*) + archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds_GCJ='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_GCJ='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + else + case $host_cpu in + hppa*64*) + archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + ;; + ia64*) + archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags' + ;; + *) + archive_cmds_GCJ='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags' + ;; + esac + fi + if test "$with_gnu_ld" = no; then + hardcode_libdir_flag_spec_GCJ='${wl}+b ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + + case $host_cpu in + hppa*64*|ia64*) + hardcode_libdir_flag_spec_ld_GCJ='+b $libdir' + hardcode_direct_GCJ=no + hardcode_shlibpath_var_GCJ=no + ;; + *) + hardcode_direct_GCJ=yes + export_dynamic_flag_spec_GCJ='${wl}-E' + + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L_GCJ=yes + ;; + esac + fi + ;; + + irix5* | irix6* | nonstopux*) + if test "$GCC" = yes; then + archive_cmds_GCJ='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + archive_cmds_GCJ='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_ld_GCJ='-rpath $libdir' + fi + hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + link_all_deplibs_GCJ=yes + ;; + + netbsd*) + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out + else + archive_cmds_GCJ='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF + fi + hardcode_libdir_flag_spec_GCJ='-R$libdir' + hardcode_direct_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + newsos6) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_GCJ=yes + hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + hardcode_shlibpath_var_GCJ=no + ;; + + openbsd*) + if test -f /usr/libexec/ld.so; then + hardcode_direct_GCJ=yes + hardcode_shlibpath_var_GCJ=no + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols' + hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' + export_dynamic_flag_spec_GCJ='${wl}-E' + else + case $host_os in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + archive_cmds_GCJ='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_GCJ='-R$libdir' + ;; + *) + archive_cmds_GCJ='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags' + hardcode_libdir_flag_spec_GCJ='${wl}-rpath,$libdir' + ;; + esac + fi + else + ld_shlibs_GCJ=no + fi + ;; + + os2*) + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_minus_L_GCJ=yes + allow_undefined_flag_GCJ=unsupported + archive_cmds_GCJ='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def' + old_archive_From_new_cmds_GCJ='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def' + ;; + + osf3*) + if test "$GCC" = yes; then + allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + else + allow_undefined_flag_GCJ=' -expect_unresolved \*' + archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + fi + hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator_GCJ=: + ;; + + osf4* | osf5*) # as osf3* with the addition of -msym flag + if test "$GCC" = yes; then + allow_undefined_flag_GCJ=' ${wl}-expect_unresolved ${wl}\*' + archive_cmds_GCJ='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib' + hardcode_libdir_flag_spec_GCJ='${wl}-rpath ${wl}$libdir' + else + allow_undefined_flag_GCJ=' -expect_unresolved \*' + archive_cmds_GCJ='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib' + archive_expsym_cmds_GCJ='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~ + $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp' + + # Both c and cxx compiler support -rpath directly + hardcode_libdir_flag_spec_GCJ='-rpath $libdir' + fi + hardcode_libdir_separator_GCJ=: + ;; + + solaris*) + no_undefined_flag_GCJ=' -z text' + if test "$GCC" = yes; then + wlarc='${wl}' + archive_cmds_GCJ='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp' + else + wlarc='' + archive_cmds_GCJ='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags' + archive_expsym_cmds_GCJ='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~ + $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp' + fi + hardcode_libdir_flag_spec_GCJ='-R$libdir' + hardcode_shlibpath_var_GCJ=no + case $host_os in + solaris2.[0-5] | solaris2.[0-5].*) ;; + *) + # The compiler driver will combine and reorder linker options, + # but understands `-z linker_flag'. GCC discards it without `$wl', + # but is careful enough not to reorder. + # Supported since Solaris 2.6 (maybe 2.5.1?) + if test "$GCC" = yes; then + whole_archive_flag_spec_GCJ='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract' + else + whole_archive_flag_spec_GCJ='-z allextract$convenience -z defaultextract' + fi + ;; + esac + link_all_deplibs_GCJ=yes + ;; + + sunos4*) + if test "x$host_vendor" = xsequent; then + # Use $CC to link under sequent, because it throws in some extra .o + # files that make .init and .fini sections work. + archive_cmds_GCJ='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_GCJ='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags' + fi + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_direct_GCJ=yes + hardcode_minus_L_GCJ=yes + hardcode_shlibpath_var_GCJ=no + ;; + + sysv4) + case $host_vendor in + sni) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_GCJ=yes # is this really true??? + ;; + siemens) + ## LD is ld it makes a PLAMLIB + ## CC just makes a GrossModule. + archive_cmds_GCJ='$LD -G -o $lib $libobjs $deplibs $linker_flags' + reload_cmds_GCJ='$CC -r -o $output$reload_objs' + hardcode_direct_GCJ=no + ;; + motorola) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_direct_GCJ=no #Motorola manual says yes, but my tests say they lie + ;; + esac + runpath_var='LD_RUN_PATH' + hardcode_shlibpath_var_GCJ=no + ;; + + sysv4.3*) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_GCJ=no + export_dynamic_flag_spec_GCJ='-Bexport' + ;; + + sysv4*MP*) + if test -d /usr/nec; then + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_shlibpath_var_GCJ=no + runpath_var=LD_RUN_PATH + hardcode_runpath_var=yes + ld_shlibs_GCJ=yes + fi + ;; + + sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*) + no_undefined_flag_GCJ='${wl}-z,text' + archive_cmds_need_lc_GCJ=no + hardcode_shlibpath_var_GCJ=no + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds_GCJ='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_GCJ='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_GCJ='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_GCJ='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + sysv5* | sco3.2v5* | sco5v6*) + # Note: We can NOT use -z defs as we might desire, because we do not + # link with -lc, and that would cause any symbols used from libc to + # always be unresolved, which means just about no library would + # ever link correctly. If we're not using GNU ld we use -z text + # though, which does catch some bad symbols but isn't as heavy-handed + # as -z defs. + no_undefined_flag_GCJ='${wl}-z,text' + allow_undefined_flag_GCJ='${wl}-z,nodefs' + archive_cmds_need_lc_GCJ=no + hardcode_shlibpath_var_GCJ=no + hardcode_libdir_flag_spec_GCJ='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`' + hardcode_libdir_separator_GCJ=':' + link_all_deplibs_GCJ=yes + export_dynamic_flag_spec_GCJ='${wl}-Bexport' + runpath_var='LD_RUN_PATH' + + if test "$GCC" = yes; then + archive_cmds_GCJ='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_GCJ='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + else + archive_cmds_GCJ='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + archive_expsym_cmds_GCJ='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags' + fi + ;; + + uts4*) + archive_cmds_GCJ='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags' + hardcode_libdir_flag_spec_GCJ='-L$libdir' + hardcode_shlibpath_var_GCJ=no + ;; + + *) + ld_shlibs_GCJ=no + ;; + esac + fi + +{ $as_echo "$as_me:$LINENO: result: $ld_shlibs_GCJ" >&5 +$as_echo "$ld_shlibs_GCJ" >&6; } +test "$ld_shlibs_GCJ" = no && can_build_shared=no + +# +# Do we need to explicitly link libc? +# +case "x$archive_cmds_need_lc_GCJ" in +x|xyes) + # Assume -lc should be added + archive_cmds_need_lc_GCJ=yes + + if test "$enable_shared" = yes && test "$GCC" = yes; then + case $archive_cmds_GCJ in + *'~'*) + # FIXME: we may have to deal with multi-command sequences. + ;; + '$CC '*) + # Test whether the compiler implicitly links with -lc since on some + # systems, -lgcc has to come before -lc. If gcc already passes -lc + # to ld, don't add -lc before -lgcc. + { $as_echo "$as_me:$LINENO: checking whether -lc should be explicitly linked in" >&5 +$as_echo_n "checking whether -lc should be explicitly linked in... " >&6; } + $rm conftest* + echo "$lt_simple_compile_test_code" > conftest.$ac_ext + + if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } 2>conftest.err; then + soname=conftest + lib=conftest + libobjs=conftest.$ac_objext + deplibs= + wl=$lt_prog_compiler_wl_GCJ + pic_flag=$lt_prog_compiler_pic_GCJ + compiler_flags=-v + linker_flags=-v + verstring= + output_objdir=. + libname=conftest + lt_save_allow_undefined_flag=$allow_undefined_flag_GCJ + allow_undefined_flag_GCJ= + if { (eval echo "$as_me:$LINENO: \"$archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1\"") >&5 + (eval $archive_cmds_GCJ 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1) 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + then + archive_cmds_need_lc_GCJ=no + else + archive_cmds_need_lc_GCJ=yes + fi + allow_undefined_flag_GCJ=$lt_save_allow_undefined_flag + else + cat conftest.err 1>&5 + fi + $rm conftest* + { $as_echo "$as_me:$LINENO: result: $archive_cmds_need_lc_GCJ" >&5 +$as_echo "$archive_cmds_need_lc_GCJ" >&6; } + ;; + esac + fi + ;; +esac + +{ $as_echo "$as_me:$LINENO: checking dynamic linker characteristics" >&5 +$as_echo_n "checking dynamic linker characteristics... " >&6; } +library_names_spec= +libname_spec='lib$name' +soname_spec= +shrext_cmds=".so" +postinstall_cmds= +postuninstall_cmds= +finish_cmds= +finish_eval= +shlibpath_var= +shlibpath_overrides_runpath=unknown +version_type=none +dynamic_linker="$host_os ld.so" +sys_lib_dlsearch_path_spec="/lib /usr/lib" + +need_lib_prefix=unknown +hardcode_into_libs=no + +# when you set need_version to no, make sure it does not cause -set_version +# flags to be left without arguments +need_version=unknown + +case $host_os in +aix3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a' + shlibpath_var=LIBPATH + + # AIX 3 has no versioning support, so we append a major version to the name. + soname_spec='${libname}${release}${shared_ext}$major' + ;; + +aix[4-9]*) + version_type=linux + need_lib_prefix=no + need_version=no + hardcode_into_libs=yes + if test "$host_cpu" = ia64; then + # AIX 5 supports IA64 + library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + else + # With GCC up to 2.95.x, collect2 would create an import file + # for dependence libraries. The import file would start with + # the line `#! .'. This would cause the generated library to + # depend on `.', always an invalid library. This was fixed in + # development snapshots of GCC prior to 3.0. + case $host_os in + aix4 | aix4.[01] | aix4.[01].*) + if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)' + echo ' yes ' + echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then + : + else + can_build_shared=no + fi + ;; + esac + # AIX (on Power*) has no versioning support, so currently we can not hardcode correct + # soname into executable. Probably we can add versioning support to + # collect2, so additional links can be useful in future. + if test "$aix_use_runtimelinking" = yes; then + # If using run time linking (on AIX 4.2 or later) use lib.so + # instead of lib.a to let people know that these are not + # typical AIX shared libraries. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + else + # We preserve .a as extension for shared libraries through AIX4.2 + # and later when we are not doing run time linking. + library_names_spec='${libname}${release}.a $libname.a' + soname_spec='${libname}${release}${shared_ext}$major' + fi + shlibpath_var=LIBPATH + fi + ;; + +amigaos*) + library_names_spec='$libname.ixlibrary $libname.a' + # Create ${libname}_ixlibrary.a entries in /sys/libs. + finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([^/]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done' + ;; + +beos*) + library_names_spec='${libname}${shared_ext}' + dynamic_linker="$host_os ld.so" + shlibpath_var=LIBRARY_PATH + ;; + +bsdi[45]*) + version_type=linux + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib" + sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib" + # the default ld.so.conf also contains /usr/contrib/lib and + # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow + # libtool to hard-code these into programs + ;; + +cygwin* | mingw* | pw32*) + version_type=windows + shrext_cmds=".dll" + need_version=no + need_lib_prefix=no + + case $GCC,$host_os in + yes,cygwin* | yes,mingw* | yes,pw32*) + library_names_spec='$libname.dll.a' + # DLL is installed to $(libdir)/../bin by postinstall_cmds + postinstall_cmds='base_file=`basename \${file}`~ + dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~ + dldir=$destdir/`dirname \$dlpath`~ + test -d \$dldir || mkdir -p \$dldir~ + $install_prog $dir/$dlname \$dldir/$dlname~ + chmod a+x \$dldir/$dlname' + postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~ + dlpath=$dir/\$dldll~ + $rm \$dlpath' + shlibpath_overrides_runpath=yes + + case $host_os in + cygwin*) + # Cygwin DLLs use 'cyg' prefix rather than 'lib' + soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib" + ;; + mingw*) + # MinGW DLLs use traditional 'lib' prefix + soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"` + if echo "$sys_lib_search_path_spec" | grep ';[c-zC-Z]:/' >/dev/null; then + # It is most probably a Windows format PATH printed by + # mingw gcc, but we are running on Cygwin. Gcc prints its search + # path with ; separators, and with drive letters. We can handle the + # drive letters (cygwin fileutils understands them), so leave them, + # especially as we might pass files found there to a mingw objdump, + # which wouldn't understand a cygwinified path. Ahh. + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'` + else + sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"` + fi + ;; + pw32*) + # pw32 DLLs use 'pw' prefix rather than 'lib' + library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}' + ;; + esac + ;; + + *) + library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib' + ;; + esac + dynamic_linker='Win32 ld.exe' + # FIXME: first we should search . and the directory the executable is in + shlibpath_var=PATH + ;; + +darwin* | rhapsody*) + dynamic_linker="$host_os dyld" + version_type=darwin + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext' + soname_spec='${libname}${release}${major}$shared_ext' + shlibpath_overrides_runpath=yes + shlibpath_var=DYLD_LIBRARY_PATH + shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`' + + sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib' + ;; + +dgux*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +freebsd1*) + dynamic_linker=no + ;; + +freebsd* | dragonfly*) + # DragonFly does not have aout. When/if they implement a new + # versioning mechanism, adjust this. + if test -x /usr/bin/objformat; then + objformat=`/usr/bin/objformat` + else + case $host_os in + freebsd[123]*) objformat=aout ;; + *) objformat=elf ;; + esac + fi + version_type=freebsd-$objformat + case $version_type in + freebsd-elf*) + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + need_version=no + need_lib_prefix=no + ;; + freebsd-*) + library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix' + need_version=yes + ;; + esac + shlibpath_var=LD_LIBRARY_PATH + case $host_os in + freebsd2*) + shlibpath_overrides_runpath=yes + ;; + freebsd3.[01]* | freebsdelf3.[01]*) + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + freebsd3.[2-9]* | freebsdelf3.[2-9]* | \ + freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1) + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + *) # from 4.6 on, and DragonFly + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + esac + ;; + +gnu*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + ;; + +hpux9* | hpux10* | hpux11*) + # Give a soname corresponding to the major version so that dld.sl refuses to + # link against other versions. + version_type=sunos + need_lib_prefix=no + need_version=no + case $host_cpu in + ia64*) + shrext_cmds='.so' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.so" + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + if test "X$HPUX_IA64_MODE" = X32; then + sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib" + else + sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64" + fi + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + hppa*64*) + shrext_cmds='.sl' + hardcode_into_libs=yes + dynamic_linker="$host_os dld.sl" + shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH + shlibpath_overrides_runpath=yes # Unless +noenvvar is specified. + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64" + sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec + ;; + *) + shrext_cmds='.sl' + dynamic_linker="$host_os dld.sl" + shlibpath_var=SHLIB_PATH + shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + ;; + esac + # HP-UX runs *really* slowly unless shared libraries are mode 555. + postinstall_cmds='chmod 555 $lib' + ;; + +interix[3-9]*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + hardcode_into_libs=yes + ;; + +irix5* | irix6* | nonstopux*) + case $host_os in + nonstopux*) version_type=nonstopux ;; + *) + if test "$lt_cv_prog_gnu_ld" = yes; then + version_type=linux + else + version_type=irix + fi ;; + esac + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}' + case $host_os in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in # libtool.m4 will add one of these switches to LD + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") + libsuff= shlibsuff= libmagic=32-bit;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") + libsuff=32 shlibsuff=N32 libmagic=N32;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") + libsuff=64 shlibsuff=64 libmagic=64-bit;; + *) libsuff= shlibsuff= libmagic=never-match;; + esac + ;; + esac + shlibpath_var=LD_LIBRARY${shlibsuff}_PATH + shlibpath_overrides_runpath=no + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + hardcode_into_libs=yes + ;; + +# No shared lib support for Linux oldld, aout, or coff. +linux*oldld* | linux*aout* | linux*coff*) + dynamic_linker=no + ;; + +# This must be Linux ELF. +linux* | k*bsd*-gnu) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=no + # This implies no fast_install, which is unacceptable. + # Some rework will be needed to allow for fast_install + # before this can be enabled. + hardcode_into_libs=yes + sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}" + sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}" + + # Append ld.so.conf contents to the search path + if test -f /etc/ld.so.conf; then + lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \$2)); skip = 1; } { if (!skip) print \$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '` + sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec $lt_ld_extra" + fi + + # We used to test for /lib/ld.so.1 and disable shared libraries on + # powerpc, because MkLinux only supported shared libraries with the + # GNU dynamic linker. Since this was broken with cross compilers, + # most powerpc-linux boxes support dynamic linking these days and + # people can always --disable-shared, the test was removed, and we + # assume the GNU/Linux dynamic linker is in use. + dynamic_linker='GNU/Linux ld.so' + ;; + +netbsd*) + version_type=sunos + need_lib_prefix=no + need_version=no + if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + dynamic_linker='NetBSD (a.out) ld.so' + else + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + dynamic_linker='NetBSD ld.elf_so' + fi + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + ;; + +newsos6) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +nto-qnx*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + ;; + +openbsd*) + version_type=sunos + sys_lib_dlsearch_path_spec="/usr/lib" + need_lib_prefix=no + # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs. + case $host_os in + openbsd3.3 | openbsd3.3.*) need_version=yes ;; + *) need_version=no ;; + esac + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir' + shlibpath_var=LD_LIBRARY_PATH + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + case $host_os in + openbsd2.[89] | openbsd2.[89].*) + shlibpath_overrides_runpath=no + ;; + *) + shlibpath_overrides_runpath=yes + ;; + esac + else + shlibpath_overrides_runpath=yes + fi + ;; + +os2*) + libname_spec='$name' + shrext_cmds=".dll" + need_lib_prefix=no + library_names_spec='$libname${shared_ext} $libname.a' + dynamic_linker='OS/2 ld.exe' + shlibpath_var=LIBPATH + ;; + +osf3* | osf4* | osf5*) + version_type=osf + need_lib_prefix=no + need_version=no + soname_spec='${libname}${release}${shared_ext}$major' + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + shlibpath_var=LD_LIBRARY_PATH + sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib" + sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec" + ;; + +rdos*) + dynamic_linker=no + ;; + +solaris*) + version_type=linux + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + hardcode_into_libs=yes + # ldd complains unless libraries are executable + postinstall_cmds='chmod +x $lib' + ;; + +sunos4*) + version_type=sunos + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix' + finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir' + shlibpath_var=LD_LIBRARY_PATH + shlibpath_overrides_runpath=yes + if test "$with_gnu_ld" = yes; then + need_lib_prefix=no + fi + need_version=yes + ;; + +sysv4 | sysv4.3*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + case $host_vendor in + sni) + shlibpath_overrides_runpath=no + need_lib_prefix=no + export_dynamic_flag_spec='${wl}-Blargedynsym' + runpath_var=LD_RUN_PATH + ;; + siemens) + need_lib_prefix=no + ;; + motorola) + need_lib_prefix=no + need_version=no + shlibpath_overrides_runpath=no + sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib' + ;; + esac + ;; + +sysv4*MP*) + if test -d /usr/nec ;then + version_type=linux + library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}' + soname_spec='$libname${shared_ext}.$major' + shlibpath_var=LD_LIBRARY_PATH + fi + ;; + +sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*) + version_type=freebsd-elf + need_lib_prefix=no + need_version=no + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + hardcode_into_libs=yes + if test "$with_gnu_ld" = yes; then + sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib' + shlibpath_overrides_runpath=no + else + sys_lib_search_path_spec='/usr/ccs/lib /usr/lib' + shlibpath_overrides_runpath=yes + case $host_os in + sco3.2v5*) + sys_lib_search_path_spec="$sys_lib_search_path_spec /lib" + ;; + esac + fi + sys_lib_dlsearch_path_spec='/usr/lib' + ;; + +uts4*) + version_type=linux + library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}' + soname_spec='${libname}${release}${shared_ext}$major' + shlibpath_var=LD_LIBRARY_PATH + ;; + +*) + dynamic_linker=no + ;; +esac +{ $as_echo "$as_me:$LINENO: result: $dynamic_linker" >&5 +$as_echo "$dynamic_linker" >&6; } +test "$dynamic_linker" = no && can_build_shared=no + +if test "${lt_cv_sys_lib_search_path_spec+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_sys_lib_search_path_spec="$sys_lib_search_path_spec" +fi + +sys_lib_search_path_spec="$lt_cv_sys_lib_search_path_spec" +if test "${lt_cv_sys_lib_dlsearch_path_spec+set}" = set; then + $as_echo_n "(cached) " >&6 +else + lt_cv_sys_lib_dlsearch_path_spec="$sys_lib_dlsearch_path_spec" +fi + +sys_lib_dlsearch_path_spec="$lt_cv_sys_lib_dlsearch_path_spec" + +variables_saved_for_relink="PATH $shlibpath_var $runpath_var" +if test "$GCC" = yes; then + variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" +fi + +{ $as_echo "$as_me:$LINENO: checking how to hardcode library paths into programs" >&5 +$as_echo_n "checking how to hardcode library paths into programs... " >&6; } +hardcode_action_GCJ= +if test -n "$hardcode_libdir_flag_spec_GCJ" || \ + test -n "$runpath_var_GCJ" || \ + test "X$hardcode_automatic_GCJ" = "Xyes" ; then + + # We can hardcode non-existant directories. + if test "$hardcode_direct_GCJ" != no && + # If the only mechanism to avoid hardcoding is shlibpath_var, we + # have to relink, otherwise we might link with an installed library + # when we should be linking with a yet-to-be-installed one + ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, GCJ)" != no && + test "$hardcode_minus_L_GCJ" != no; then + # Linking always hardcodes the temporary library directory. + hardcode_action_GCJ=relink + else + # We can link without hardcoding, and we can hardcode nonexisting dirs. + hardcode_action_GCJ=immediate + fi +else + # We cannot hardcode anything, or else we can only hardcode existing + # directories. + hardcode_action_GCJ=unsupported +fi +{ $as_echo "$as_me:$LINENO: result: $hardcode_action_GCJ" >&5 +$as_echo "$hardcode_action_GCJ" >&6; } + +if test "$hardcode_action_GCJ" = relink; then + # Fast installation is not supported + enable_fast_install=no +elif test "$shlibpath_overrides_runpath" = yes || + test "$enable_shared" = no; then + # Fast installation is not necessary + enable_fast_install=needless +fi + + +# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + compiler_GCJ \ + CC_GCJ \ + LD_GCJ \ + lt_prog_compiler_wl_GCJ \ + lt_prog_compiler_pic_GCJ \ + lt_prog_compiler_static_GCJ \ + lt_prog_compiler_no_builtin_flag_GCJ \ + export_dynamic_flag_spec_GCJ \ + thread_safe_flag_spec_GCJ \ + whole_archive_flag_spec_GCJ \ + enable_shared_with_static_runtimes_GCJ \ + old_archive_cmds_GCJ \ + old_archive_from_new_cmds_GCJ \ + predep_objects_GCJ \ + postdep_objects_GCJ \ + predeps_GCJ \ + postdeps_GCJ \ + compiler_lib_search_path_GCJ \ + compiler_lib_search_dirs_GCJ \ + archive_cmds_GCJ \ + archive_expsym_cmds_GCJ \ + postinstall_cmds_GCJ \ + postuninstall_cmds_GCJ \ + old_archive_from_expsyms_cmds_GCJ \ + allow_undefined_flag_GCJ \ + no_undefined_flag_GCJ \ + export_symbols_cmds_GCJ \ + hardcode_libdir_flag_spec_GCJ \ + hardcode_libdir_flag_spec_ld_GCJ \ + hardcode_libdir_separator_GCJ \ + hardcode_automatic_GCJ \ + module_cmds_GCJ \ + module_expsym_cmds_GCJ \ + lt_cv_prog_compiler_c_o_GCJ \ + fix_srcfile_path_GCJ \ + exclude_expsyms_GCJ \ + include_expsyms_GCJ; do + + case $var in + old_archive_cmds_GCJ | \ + old_archive_from_new_cmds_GCJ | \ + archive_cmds_GCJ | \ + archive_expsym_cmds_GCJ | \ + module_cmds_GCJ | \ + module_expsym_cmds_GCJ | \ + old_archive_from_expsyms_cmds_GCJ | \ + export_symbols_cmds_GCJ | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\$0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + +cfgfile="$ofile" + + cat <<__EOF__ >> "$cfgfile" +# ### BEGIN LIBTOOL TAG CONFIG: $tagname + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_GCJ + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_GCJ + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# LTCC compiler flags. +LTCFLAGS=$lt_LTCFLAGS + +# A language-specific compiler. +CC=$lt_compiler_GCJ + +# Is the compiler the GNU C compiler? +with_gcc=$GCC_GCJ + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_LD_GCJ + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_GCJ + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_GCJ +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_GCJ + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_GCJ + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_GCJ + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_GCJ + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_GCJ + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec_GCJ + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds_GCJ +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_GCJ + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_GCJ + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds_GCJ +archive_expsym_cmds=$lt_archive_expsym_cmds_GCJ +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_module_cmds_GCJ +module_expsym_cmds=$lt_module_expsym_cmds_GCJ + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_predep_objects_GCJ + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_postdep_objects_GCJ + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_predeps_GCJ + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_postdeps_GCJ + +# The directories searched by this compiler when creating a shared +# library +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_GCJ + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_GCJ + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_GCJ + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_GCJ + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_GCJ + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_GCJ + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_GCJ + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_GCJ + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct_GCJ + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L_GCJ + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_GCJ + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$hardcode_automatic_GCJ + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_GCJ + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path=$lt_fix_srcfile_path + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols_GCJ + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_GCJ + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_GCJ + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_GCJ + +# ### END LIBTOOL TAG CONFIG: $tagname + +__EOF__ + + +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + 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 + +CC="$lt_save_CC" + + else + tagname="" + fi + ;; + + RC) + + +# Source file extension for RC test sources. +ac_ext=rc + +# Object file extension for compiled RC test sources. +objext=o +objext_RC=$objext + +# Code to be used in simple compile tests +lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }' + +# Code to be used in simple link tests +lt_simple_link_test_code="$lt_simple_compile_test_code" + +# ltmain only uses $CC for tagged configurations so make sure $CC is set. + +# If no C compiler was specified, use CC. +LTCC=${LTCC-"$CC"} + +# If no C compiler flags were specified, use CFLAGS. +LTCFLAGS=${LTCFLAGS-"$CFLAGS"} + +# Allow CC to be a program name with arguments. +compiler=$CC + + +# save warnings/boilerplate of simple test code +ac_outfile=conftest.$ac_objext +echo "$lt_simple_compile_test_code" >conftest.$ac_ext +eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_compiler_boilerplate=`cat conftest.err` +$rm conftest* + +ac_outfile=conftest.$ac_objext +echo "$lt_simple_link_test_code" >conftest.$ac_ext +eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err +_lt_linker_boilerplate=`cat conftest.err` +$rm -r conftest* + + +# Allow CC to be a program name with arguments. +lt_save_CC="$CC" +CC=${RC-"windres"} +compiler=$CC +compiler_RC=$CC +for cc_temp in $compiler""; do + case $cc_temp in + compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; + distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; + \-*) ;; + *) break;; + esac +done +cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"` + +lt_cv_prog_compiler_c_o_RC=yes + +# The else clause should only fire when bootstrapping the +# libtool distribution, otherwise you forgot to ship ltmain.sh +# with your package, and you will get complaints that there are +# no rules to generate ltmain.sh. +if test -f "$ltmain"; then + # See if we are running on zsh, and set the options which allow our commands through + # without removal of \ escapes. + if test -n "${ZSH_VERSION+set}" ; then + setopt NO_GLOB_SUBST + fi + # Now quote all the things that may contain metacharacters while being + # careful not to overquote the AC_SUBSTed values. We take copies of the + # variables and quote the copies for generation of the libtool script. + for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \ + SED SHELL STRIP \ + libname_spec library_names_spec soname_spec extract_expsyms_cmds \ + old_striplib striplib file_magic_cmd finish_cmds finish_eval \ + deplibs_check_method reload_flag reload_cmds need_locks \ + lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \ + lt_cv_sys_global_symbol_to_c_name_address \ + sys_lib_search_path_spec sys_lib_dlsearch_path_spec \ + old_postinstall_cmds old_postuninstall_cmds \ + compiler_RC \ + CC_RC \ + LD_RC \ + lt_prog_compiler_wl_RC \ + lt_prog_compiler_pic_RC \ + lt_prog_compiler_static_RC \ + lt_prog_compiler_no_builtin_flag_RC \ + export_dynamic_flag_spec_RC \ + thread_safe_flag_spec_RC \ + whole_archive_flag_spec_RC \ + enable_shared_with_static_runtimes_RC \ + old_archive_cmds_RC \ + old_archive_from_new_cmds_RC \ + predep_objects_RC \ + postdep_objects_RC \ + predeps_RC \ + postdeps_RC \ + compiler_lib_search_path_RC \ + compiler_lib_search_dirs_RC \ + archive_cmds_RC \ + archive_expsym_cmds_RC \ + postinstall_cmds_RC \ + postuninstall_cmds_RC \ + old_archive_from_expsyms_cmds_RC \ + allow_undefined_flag_RC \ + no_undefined_flag_RC \ + export_symbols_cmds_RC \ + hardcode_libdir_flag_spec_RC \ + hardcode_libdir_flag_spec_ld_RC \ + hardcode_libdir_separator_RC \ + hardcode_automatic_RC \ + module_cmds_RC \ + module_expsym_cmds_RC \ + lt_cv_prog_compiler_c_o_RC \ + fix_srcfile_path_RC \ + exclude_expsyms_RC \ + include_expsyms_RC; do + + case $var in + old_archive_cmds_RC | \ + old_archive_from_new_cmds_RC | \ + archive_cmds_RC | \ + archive_expsym_cmds_RC | \ + module_cmds_RC | \ + module_expsym_cmds_RC | \ + old_archive_from_expsyms_cmds_RC | \ + export_symbols_cmds_RC | \ + extract_expsyms_cmds | reload_cmds | finish_cmds | \ + postinstall_cmds | postuninstall_cmds | \ + old_postinstall_cmds | old_postuninstall_cmds | \ + sys_lib_search_path_spec | sys_lib_dlsearch_path_spec) + # Double-quote double-evaled strings. + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" + ;; + *) + eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\"" + ;; + esac + done + + case $lt_echo in + *'\$0 --fallback-echo"') + lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\$0 --fallback-echo"$/$0 --fallback-echo"/'` + ;; + esac + +cfgfile="$ofile" + + cat <<__EOF__ >> "$cfgfile" +# ### BEGIN LIBTOOL TAG CONFIG: $tagname + +# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`: + +# Shell to use when invoking shell scripts. +SHELL=$lt_SHELL + +# Whether or not to build shared libraries. +build_libtool_libs=$enable_shared + +# Whether or not to build static libraries. +build_old_libs=$enable_static + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=$archive_cmds_need_lc_RC + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_RC + +# Whether or not to optimize for fast installation. +fast_install=$enable_fast_install + +# The host system. +host_alias=$host_alias +host=$host +host_os=$host_os + +# The build system. +build_alias=$build_alias +build=$build +build_os=$build_os + +# An echo program that does not interpret backslashes. +echo=$lt_echo + +# The archiver. +AR=$lt_AR +AR_FLAGS=$lt_AR_FLAGS + +# A C compiler. +LTCC=$lt_LTCC + +# LTCC compiler flags. +LTCFLAGS=$lt_LTCFLAGS + +# A language-specific compiler. +CC=$lt_compiler_RC + +# Is the compiler the GNU C compiler? +with_gcc=$GCC_RC + +# An ERE matcher. +EGREP=$lt_EGREP + +# The linker used to build libraries. +LD=$lt_LD_RC + +# Whether we need hard or soft links. +LN_S=$lt_LN_S + +# A BSD-compatible nm program. +NM=$lt_NM + +# A symbol stripping program +STRIP=$lt_STRIP + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=$MAGIC_CMD + +# Used on cygwin: DLL creation program. +DLLTOOL="$DLLTOOL" + +# Used on cygwin: object dumper. +OBJDUMP="$OBJDUMP" + +# Used on cygwin: assembler. +AS="$AS" + +# The name of the directory that contains temporary libtool files. +objdir=$objdir + +# How to create reloadable object files. +reload_flag=$lt_reload_flag +reload_cmds=$lt_reload_cmds + +# How to pass a linker flag through the compiler. +wl=$lt_lt_prog_compiler_wl_RC + +# Object file suffix (normally "o"). +objext="$ac_objext" + +# Old archive suffix (normally "a"). +libext="$libext" + +# Shared library suffix (normally ".so"). +shrext_cmds='$shrext_cmds' + +# Executable file suffix (normally ""). +exeext="$exeext" + +# Additional compiler flags for building library objects. +pic_flag=$lt_lt_prog_compiler_pic_RC +pic_mode=$pic_mode + +# What is the maximum length of a command? +max_cmd_len=$lt_cv_sys_max_cmd_len + +# Does compiler simultaneously support -c and -o options? +compiler_c_o=$lt_lt_cv_prog_compiler_c_o_RC + +# Must we lock files when doing compilation? +need_locks=$lt_need_locks + +# Do we need the lib prefix for modules? +need_lib_prefix=$need_lib_prefix + +# Do we need a version for libraries? +need_version=$need_version + +# Whether dlopen is supported. +dlopen_support=$enable_dlopen + +# Whether dlopen of programs is supported. +dlopen_self=$enable_dlopen_self + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=$enable_dlopen_self_static + +# Compiler flag to prevent dynamic linking. +link_static_flag=$lt_lt_prog_compiler_static_RC + +# Compiler flag to turn off builtin functions. +no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_RC + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_RC + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec=$lt_whole_archive_flag_spec_RC + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec=$lt_thread_safe_flag_spec_RC + +# Library versioning type. +version_type=$version_type + +# Format of library name prefix. +libname_spec=$lt_libname_spec + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec=$lt_library_names_spec + +# The coded name of the library, if different from the real name. +soname_spec=$lt_soname_spec + +# Commands used to build and install an old-style archive. +RANLIB=$lt_RANLIB +old_archive_cmds=$lt_old_archive_cmds_RC +old_postinstall_cmds=$lt_old_postinstall_cmds +old_postuninstall_cmds=$lt_old_postuninstall_cmds + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_RC + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_RC + +# Commands used to build and install a shared archive. +archive_cmds=$lt_archive_cmds_RC +archive_expsym_cmds=$lt_archive_expsym_cmds_RC +postinstall_cmds=$lt_postinstall_cmds +postuninstall_cmds=$lt_postuninstall_cmds + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds=$lt_module_cmds_RC +module_expsym_cmds=$lt_module_expsym_cmds_RC + +# Commands to strip libraries. +old_striplib=$lt_old_striplib +striplib=$lt_striplib + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects=$lt_predep_objects_RC + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects=$lt_postdep_objects_RC + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps=$lt_predeps_RC + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps=$lt_postdeps_RC + +# The directories searched by this compiler when creating a shared +# library +compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_RC + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path=$lt_compiler_lib_search_path_RC + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method=$lt_deplibs_check_method + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd=$lt_file_magic_cmd + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag=$lt_allow_undefined_flag_RC + +# Flag that forces no undefined symbols. +no_undefined_flag=$lt_no_undefined_flag_RC + +# Commands used to finish a libtool library installation in a directory. +finish_cmds=$lt_finish_cmds + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval=$lt_finish_eval + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address + +# This is the shared library runtime path variable. +runpath_var=$runpath_var + +# This is the shared library path variable. +shlibpath_var=$shlibpath_var + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=$shlibpath_overrides_runpath + +# How to hardcode a shared library path into an executable. +hardcode_action=$hardcode_action_RC + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=$hardcode_into_libs + +# Flag to hardcode \$libdir into a binary during linking. +# This must work even if \$libdir does not exist. +hardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec_RC + +# If ld is used when linking, flag to hardcode \$libdir into +# a binary during linking. This must work even if \$libdir does +# not exist. +hardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld_RC + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator=$lt_hardcode_libdir_separator_RC + +# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=$hardcode_direct_RC + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=$hardcode_minus_L_RC + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=$hardcode_shlibpath_var_RC + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=$hardcode_automatic_RC + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="$variables_saved_for_relink" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=$link_all_deplibs_RC + +# Compile-time system search path for libraries +sys_lib_search_path_spec=$lt_sys_lib_search_path_spec + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec + +# Fix the shell variable \$srcfile for the compiler. +fix_srcfile_path=$lt_fix_srcfile_path + +# Set to yes if exported symbols are required. +always_export_symbols=$always_export_symbols_RC + +# The commands to list exported symbols. +export_symbols_cmds=$lt_export_symbols_cmds_RC + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds=$lt_extract_expsyms_cmds + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms=$lt_exclude_expsyms_RC + +# Symbols that must always be exported. +include_expsyms=$lt_include_expsyms_RC + +# ### END LIBTOOL TAG CONFIG: $tagname + +__EOF__ + + +else + # If there is no Makefile yet, we rely on a make rule to execute + # `config.status --recheck' to rerun these tests and create the + # libtool script then. + ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'` + if test -f "$ltmain_in"; then + test -f Makefile && make "$ltmain" + 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 + +CC="$lt_save_CC" + + ;; + + *) + { { $as_echo "$as_me:$LINENO: error: Unsupported tag name: $tagname" >&5 +$as_echo "$as_me: error: Unsupported tag name: $tagname" >&2;} + { (exit 1); exit 1; }; } + ;; + esac + + # Append the new tag name to the list of available tags. + if test -n "$tagname" ; then + available_tags="$available_tags $tagname" + fi + fi + done + IFS="$lt_save_ifs" + + # Now substitute the updated list of available tags. + if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then + mv "${ofile}T" "$ofile" + chmod +x "$ofile" + else + rm -f "${ofile}T" + { { $as_echo "$as_me:$LINENO: error: unable to update list of available tagged configurations." >&5 +$as_echo "$as_me: error: unable to update list of available tagged configurations." >&2;} + { (exit 1); exit 1; }; } + fi +fi + + + +# This can be used to rebuild libtool when needed +LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh" + +# Always use our own libtool. +LIBTOOL='$(SHELL) $(apr_builddir)/libtool' + +# Prevent multiple expansion + + + + + + + + + + + + + + + + + + + + + # get libtool's setting of shlibpath_var + eval `grep "^shlibpath_var=[A-Z_]*$" $apr_builddir/libtool` + if test "x$shlibpath_var" = "x"; then + shlibpath_var=REPLACE_WITH_YOUR_SHLIBPATH_VAR + fi + fi + ;; +esac + + +# Check whether --with-installbuilddir was given. +if test "${with_installbuilddir+set}" = set; then + withval=$with_installbuilddir; installbuilddir=$withval +else + installbuilddir="${datadir}/build" +fi + + + + +# Check whether --with-libtool was given. +if test "${with_libtool+set}" = set; then + withval=$with_libtool; use_libtool=$withval +else + use_libtool="yes" +fi + + +if test "x$use_libtool" = "xyes"; then + lt_compile='$(LIBTOOL) $(LTFLAGS) --mode=compile $(COMPILE) -c $< && touch $@' + LT_VERSION="-version-info `$get_version libtool $version_hdr APR`" + link="\$(LIBTOOL) \$(LTFLAGS) --mode=link \$(LT_LDFLAGS) \$(COMPILE) ${LT_VERSION} \$(ALL_LDFLAGS) -o \$@" + so_ext='lo' + lib_target='-rpath $(libdir) $$objects' + export_lib_target='-rpath \$(libdir) \$\$objects' +else + lt_compile='$(COMPILE) -c $<' + link='$(AR) cr $(TARGET_LIB) $$objects; $(RANLIB) $(TARGET_LIB)' + so_ext='o' + lib_target='' + export_lib_target='' +fi + +case $host in + *-solaris2*) + apr_platform_runtime_link_flag="-R" + ;; + *) + ;; +esac + + + + + + + + + + +nl=' +' +echo "${nl}Check for compiler flags..." + + +case $host in + *os390) + if test "$ac_test_CFLAGS" != set; then + + if test "x$CFLAGS" = "x-g"; then + echo " nulling CFLAGS" + CFLAGS="" + else + apr_new_bugger="" + apr_removed=0 + for i in $CFLAGS; do + if test "x$i" != "x-g"; then + apr_new_bugger="$apr_new_bugger $i" + else + apr_removed=1 + fi + done + if test $apr_removed = "1"; then + echo " removed \"-g\" from CFLAGS" + CFLAGS=$apr_new_bugger + fi + fi + + fi + ;; +esac + +# Check whether --enable-debug was given. +if test "${enable_debug+set}" = set; then + enableval=$enable_debug; + if test "x$CFLAGS" = "x"; then + echo " setting CFLAGS to \"-g\"" + CFLAGS="-g" + else + apr_addto_bugger="-g" + 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 + echo " adding \"$i\" to CFLAGS" + CFLAGS="$CFLAGS $i" + fi + done + fi + + if test "$GCC" = "yes"; then + + if test "x$CFLAGS" = "x"; then + echo " setting CFLAGS to \"-Wall\"" + CFLAGS="-Wall" + else + apr_addto_bugger="-Wall" + 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 + echo " adding \"$i\" to CFLAGS" + CFLAGS="$CFLAGS $i" + fi + done + fi + + elif test "$AIX_XLC" = "yes"; then + + if test "x$CFLAGS" = "x"; then + echo " setting CFLAGS to \"-qfullpath\"" + CFLAGS="-qfullpath" + else + apr_addto_bugger="-qfullpath" + 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 + echo " adding \"$i\" to CFLAGS" + CFLAGS="$CFLAGS $i" + fi + done + fi + + fi + +fi + +# Check whether --enable-maintainer-mode was given. +if test "${enable_maintainer_mode+set}" = set; then + enableval=$enable_maintainer_mode; + if test "x$CFLAGS" = "x"; then + echo " setting CFLAGS to \"-g\"" + CFLAGS="-g" + else + apr_addto_bugger="-g" + 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 + echo " adding \"$i\" to CFLAGS" + CFLAGS="$CFLAGS $i" + fi + done + fi + + if test "$GCC" = "yes"; then + + if test "x$CFLAGS" = "x"; then + echo " setting CFLAGS to \"-Wall -Wmissing-prototypes -Wstrict-prototypes -Wmissing-declarations\"" + CFLAGS="-Wall -Wmissing-prototypes -Wstrict-prototypes -Wmissing-declarations" + else + apr_addto_bugger="-Wall -Wmissing-prototypes -Wstrict-prototypes -Wmissing-declarations" + 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 + echo " adding \"$i\" to CFLAGS" + CFLAGS="$CFLAGS $i" + fi + done + fi + + elif test "$AIX_XLC" = "yes"; then + + if test "x$CFLAGS" = "x"; then + echo " setting CFLAGS to \"-qfullpath -qinitauto=FE -qcheck=all -qinfo=pro\"" + 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 $CFLAGS; do + if test "x$i" = "x$j"; then + apr_addto_duplicate="1" + break + fi + done + if test $apr_addto_duplicate = "0"; then + echo " adding \"$i\" to CFLAGS" + CFLAGS="$CFLAGS $i" + fi + done + fi + + fi + +fi + +# Check whether --enable-profile was given. +if test "${enable_profile+set}" = set; then + enableval=$enable_profile; if test "$GCC" = "yes"; then + + if test "x$CFLAGS" = "x"; then + echo " setting CFLAGS to \"-pg\"" + CFLAGS="-pg" + else + apr_addto_bugger="-pg" + 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 + echo " adding \"$i\" to CFLAGS" + CFLAGS="$CFLAGS $i" + fi + done + fi + + + if test "x$CFLAGS" = "x-g"; then + echo " nulling CFLAGS" + CFLAGS="" + else + apr_new_bugger="" + apr_removed=0 + for i in $CFLAGS; do + if test "x$i" != "x-g"; then + apr_new_bugger="$apr_new_bugger $i" + else + apr_removed=1 + fi + done + if test $apr_removed = "1"; then + echo " removed \"-g\" from CFLAGS" + CFLAGS=$apr_new_bugger + fi + fi + + if test "$host" = "i586-pc-beos"; then + + if test "x$CFLAGS" = "x-O2"; then + echo " nulling CFLAGS" + CFLAGS="" + else + apr_new_bugger="" + apr_removed=0 + for i in $CFLAGS; do + if test "x$i" != "x-O2"; then + apr_new_bugger="$apr_new_bugger $i" + else + apr_removed=1 + fi + done + if test $apr_removed = "1"; then + echo " removed \"-O2\" from CFLAGS" + CFLAGS=$apr_new_bugger + fi + fi + + + if test "x$CFLAGS" = "x"; then + echo " setting CFLAGS to \"-O1\"" + CFLAGS="-O1" + else + apr_addto_bugger="-O1" + 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 + echo " adding \"$i\" to CFLAGS" + CFLAGS="$CFLAGS $i" + fi + done + fi + + + if test "x$LDFLAGS" = "x"; then + echo " setting LDFLAGS to \"-p\"" + LDFLAGS="-p" + else + apr_addto_bugger="-p" + 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 + echo " adding \"$i\" to LDFLAGS" + LDFLAGS="$LDFLAGS $i" + fi + done + fi + + fi + fi + +fi + +# Check whether --enable-pool-debug was given. +if test "${enable_pool_debug+set}" = set; then + enableval=$enable_pool_debug; if test -z "$enableval"; then + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DAPR_POOL_DEBUG=1\"" + CPPFLAGS="-DAPR_POOL_DEBUG=1" + else + apr_addto_bugger="-DAPR_POOL_DEBUG=1" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + elif test ! "$enableval" = "no"; then + apr_pool_debug=1 + + for i in $enableval + do + flag=0 + + case $i in + yes) + flag=1 + ;; + verbose) + flag=2 + ;; + lifetime) + flag=4 + ;; + owner) + flag=8 + ;; + verbose-alloc) + flag=16 + ;; + all) + apr_pool_debug=31 + ;; + *) + ;; + esac + + if test $flag -gt 0; then + apr_pool_debug=`expr '(' $apr_pool_debug - $apr_pool_debug % \ + '(' $flag '*' 2 ')' ')' + $flag + $apr_pool_debug % $flag` + fi + done + + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DAPR_POOL_DEBUG=$apr_pool_debug\"" + CPPFLAGS="-DAPR_POOL_DEBUG=$apr_pool_debug" + else + apr_addto_bugger="-DAPR_POOL_DEBUG=$apr_pool_debug" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + fi + +fi + + + +# Check whether --with-efence was given. +if test "${with_efence+set}" = set; then + withval=$with_efence; apr_efence_dir="$withval" + if test "$apr_efence_dir" != "yes"; then + + if test "x$LDFLAGS" = "x"; then + echo " setting LDFLAGS to \"-L$apr_efence_dir/lib\"" + LDFLAGS="-L$apr_efence_dir/lib" + else + apr_addto_bugger="-L$apr_efence_dir/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 + echo " adding \"$i\" to LDFLAGS" + LDFLAGS="$LDFLAGS $i" + fi + done + fi + + if test "x$apr_platform_runtime_link_flag" != "x"; then + + if test "x$LDFLAGS" = "x"; then + echo " setting LDFLAGS to \"$apr_platform_runtime_link_flag$apr_efence_dir/lib\"" + LDFLAGS="$apr_platform_runtime_link_flag$apr_efence_dir/lib" + else + apr_addto_bugger="$apr_platform_runtime_link_flag$apr_efence_dir/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 + echo " adding \"$i\" to LDFLAGS" + LDFLAGS="$LDFLAGS $i" + fi + done + fi + + fi + fi + { $as_echo "$as_me:$LINENO: checking for malloc in -lefence" >&5 +$as_echo_n "checking for malloc in -lefence... " >&6; } +if test "${ac_cv_lib_efence_malloc+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lefence $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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. */ +#ifdef __cplusplus +extern "C" +#endif +char malloc (); +int +main () +{ +return malloc (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_lib_efence_malloc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_efence_malloc=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_efence_malloc" >&5 +$as_echo "$ac_cv_lib_efence_malloc" >&6; } +if test "x$ac_cv_lib_efence_malloc" = x""yes; then + + if test "x$LIBS" = "x"; then + echo " setting LIBS to \"-lefence\"" + LIBS="-lefence" + else + apr_addto_bugger="-lefence" + 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 + echo " adding \"$i\" to LIBS" + LIBS="$LIBS $i" + fi + done + fi + +else + { { $as_echo "$as_me:$LINENO: error: Electric Fence requested but not detected" >&5 +$as_echo "$as_me: error: Electric Fence requested but not detected" >&2;} + { (exit 1); exit 1; }; } +fi + + +fi + + +if test "$host" = "i586-pc-beos"; then + # Check whether --enable-malloc-debug was given. +if test "${enable_malloc_debug+set}" = set; then + enableval=$enable_malloc_debug; + if test "x$CFLAGS" = "x-O2"; then + echo " nulling CFLAGS" + CFLAGS="" + else + apr_new_bugger="" + apr_removed=0 + for i in $CFLAGS; do + if test "x$i" != "x-O2"; then + apr_new_bugger="$apr_new_bugger $i" + else + apr_removed=1 + fi + done + if test $apr_removed = "1"; then + echo " removed \"-O2\" from CFLAGS" + CFLAGS=$apr_new_bugger + fi + fi + + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-fcheck-memory-usage -D_KERNEL_MODE\"" + CPPFLAGS="-fcheck-memory-usage -D_KERNEL_MODE" + else + apr_addto_bugger="-fcheck-memory-usage -D_KERNEL_MODE" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + +fi + fi + +# this is the place to put specific options for platform/compiler +# combinations +case "$host:$CC" in + *-hp-hpux*:cc ) + + if test "x$CFLAGS" = "x"; then + echo " setting CFLAGS to \"-Ae +Z\"" + CFLAGS="-Ae +Z" + else + apr_addto_bugger="-Ae +Z" + 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 + echo " adding \"$i\" to CFLAGS" + CFLAGS="$CFLAGS $i" + fi + done + fi + + case $host in + ia64-* ) + ;; + * ) + if echo "$CFLAGS " | grep '+DA' >/dev/null; then : + else + + if test "x$CFLAGS" = "x"; then + echo " setting CFLAGS to \"+DAportable\"" + CFLAGS="+DAportable" + else + apr_addto_bugger="+DAportable" + 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 + echo " adding \"$i\" to CFLAGS" + CFLAGS="$CFLAGS $i" + fi + done + fi + + fi + ;; + esac + ;; + powerpc-*-beos:mwcc* ) + + echo " forcing CPP to \"mwcc -E\"" + CPP="mwcc -E" + + + echo " forcing CC to \"mwcc\"" + CC="mwcc" + + + echo " forcing AR to \"ar\"" + AR="ar" + + ;; +esac + + +if test "$GCC" = "yes"; then + MKDEP='$(CC) -MM' +else + rm -f conftest.c + cat > conftest.c < + int main() { return 0; } +EOF + MKDEP="true" + for i in "$CC -MM" "$CC -M" "$CPP -MM" "$CPP -M" "cpp -M"; do + { $as_echo "$as_me:$LINENO: checking if $i can create proper make dependencies" >&5 +$as_echo_n "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 + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } + break; + fi + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } + done + rm -f conftest.c +fi + + + + +# force_atomic_generic flag +# this will be set we find a cpu/OS combo +# which is historical and doesn't work with the method +# we are using for the more up to date cpu/OS +# (ie.. old sparcs) +apr_force_atomic_generic=0 +proc_mutex_is_global=0 +nonportable_atomics_enabled=0 + +# Check whether --enable-nonportable-atomics was given. +if test "${enable_nonportable_atomics+set}" = set; then + enableval=$enable_nonportable_atomics; + if test "$enableval" = "yes"; then + nonportable_atomics_enabled=1 + fi + +fi + + +config_subdirs="none" +INSTALL_SUBDIRS="none" +case $host in + i386-ibm-aix* | *-ibm-aix[1-2].* | *-ibm-aix3.* | *-ibm-aix4.1 | *-ibm-aix4.1.* | *-ibm-aix4.2 | *-ibm-aix4.2.*) + OSDIR="aix" + + if test "x$LDFLAGS" = "x"; then + echo " setting LDFLAGS to \"-lld\"" + LDFLAGS="-lld" + else + apr_addto_bugger="-lld" + 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 + echo " adding \"$i\" to LDFLAGS" + LDFLAGS="$LDFLAGS $i" + fi + done + fi + + eolstr="\\n" + ;; + *-os2*) + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DOS2\"" + CPPFLAGS="-DOS2" + else + apr_addto_bugger="-DOS2" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + + if test "x$CFLAGS" = "x"; then + echo " setting CFLAGS to \"-Zmt\"" + CFLAGS="-Zmt" + else + apr_addto_bugger="-Zmt" + 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 + echo " adding \"$i\" to CFLAGS" + CFLAGS="$CFLAGS $i" + fi + done + fi + + +{ $as_echo "$as_me:$LINENO: checking for random in -lbsd" >&5 +$as_echo_n "checking for random in -lbsd... " >&6; } +if test "${ac_cv_lib_bsd_random+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lbsd $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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. */ +#ifdef __cplusplus +extern "C" +#endif +char random (); +int +main () +{ +return random (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_lib_bsd_random=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_bsd_random=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_bsd_random" >&5 +$as_echo "$ac_cv_lib_bsd_random" >&6; } +if test "x$ac_cv_lib_bsd_random" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBBSD 1 +_ACEOF + + LIBS="-lbsd $LIBS" + +fi + + OSDIR="os2" + enable_threads="system_threads" + eolstr="\\r\\n" + file_as_socket="0" + proc_mutex_is_global=1 + ;; + *beos*) + OSDIR="beos" + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DBEOS\"" + CPPFLAGS="-DBEOS" + else + apr_addto_bugger="-DBEOS" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + enable_threads="system_threads" + native_mmap_emul="1" + + { $as_echo "$as_me:$LINENO: checking for BONE_VERSION in sys/socket.h" >&5 +$as_echo_n "checking for BONE_VERSION in sys/socket.h... " >&6; } +if test "${ac_cv_define_BONE_VERSION+set}" = set; then + $as_echo_n "(cached) " >&6 +else + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#ifdef BONE_VERSION +YES_IS_DEFINED +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "YES_IS_DEFINED" >/dev/null 2>&1; then + ac_cv_define_BONE_VERSION=yes +else + ac_cv_define_BONE_VERSION=no +fi +rm -f conftest* + + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_define_BONE_VERSION" >&5 +$as_echo "$ac_cv_define_BONE_VERSION" >&6; } + if test "$ac_cv_define_BONE_VERSION" = "yes"; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_BONE_VERSION 1 +_ACEOF + + fi + + eolstr="\\n" + osver=`uname -r` + proc_mutex_is_global=1 + case $osver in + 5.0.4) + file_as_socket="1" + ;; + *) + file_as_socket="0" + ;; + esac + ;; + *os390) + OSDIR="os390" + eolstr="\\n" + ;; + *os400) + OSDIR="as400" + eolstr="\\n" + ;; + *cygwin*) + OSDIR="unix" + + if test "x$CPPFLAGS" = "x"; then + echo " setting CPPFLAGS to \"-DCYGWIN\"" + CPPFLAGS="-DCYGWIN" + else + apr_addto_bugger="-DCYGWIN" + 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 + echo " adding \"$i\" to CPPFLAGS" + CPPFLAGS="$CPPFLAGS $i" + fi + done + fi + + enable_threads="no" + eolstr="\\n" + ;; + *linux*) + apr_force_atomic_generic=1 + case $host_cpu in + i486|i586|i686) + if test "$nonportable_atomics_enabled" = 1; then + apr_force_atomic_generic=0 + fi + ;; + esac + OSDIR="unix" + eolstr="\\n" + ;; + *hpux10* ) + enable_threads="no" + OSDIR="unix" + eolstr="\\n" + ;; + *) + OSDIR="unix" + eolstr="\\n" + ;; +esac + + + + + + +# For some platforms we need a version string which allows easy numeric +# comparisons. +case $host in + *freebsd*) + if test -x /sbin/sysctl; then + os_version=`/sbin/sysctl -n kern.osreldate` + else + os_version=000000 + fi + ;; + *linux*) + os_version=`uname -r | sed -e 's/\(.\)\.\(.\)\.\(.\).*/\1\2\3/'` + ;; + *darwin*) + os_version=`uname -r | sed -e 's/\(.\)\.\(.\).*/\1\2/'` + ;; + *) + os_version=OS_VERSION_IS_NOT_SET + ;; +esac + + +{ $as_echo "$as_me:$LINENO: checking for res_init in -lresolv" >&5 +$as_echo_n "checking for res_init in -lresolv... " >&6; } +if test "${ac_cv_lib_resolv_res_init+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lresolv $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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. */ +#ifdef __cplusplus +extern "C" +#endif +char res_init (); +int +main () +{ +return res_init (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_lib_resolv_res_init=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_resolv_res_init=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_resolv_res_init" >&5 +$as_echo "$ac_cv_lib_resolv_res_init" >&6; } +if test "x$ac_cv_lib_resolv_res_init" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBRESOLV 1 +_ACEOF + + LIBS="-lresolv $LIBS" + +fi + + +{ $as_echo "$as_me:$LINENO: checking for gethostbyname in -lnsl" >&5 +$as_echo_n "checking for gethostbyname in -lnsl... " >&6; } +if test "${ac_cv_lib_nsl_gethostbyname+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lnsl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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. */ +#ifdef __cplusplus +extern "C" +#endif +char gethostbyname (); +int +main () +{ +return gethostbyname (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_lib_nsl_gethostbyname=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_nsl_gethostbyname=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_nsl_gethostbyname" >&5 +$as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; } +if test "x$ac_cv_lib_nsl_gethostbyname" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBNSL 1 +_ACEOF + + LIBS="-lnsl $LIBS" + +fi + +{ $as_echo "$as_me:$LINENO: checking for library containing gethostname" >&5 +$as_echo_n "checking for library containing gethostname... " >&6; } +if test "${ac_cv_search_gethostname+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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. */ +#ifdef __cplusplus +extern "C" +#endif +char gethostname (); +int +main () +{ +return gethostname (); + ; + return 0; +} +_ACEOF +for ac_lib in '' nsl; 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 + rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_search_gethostname=$ac_res +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext + if test "${ac_cv_search_gethostname+set}" = set; then + break +fi +done +if test "${ac_cv_search_gethostname+set}" = set; then + : +else + ac_cv_search_gethostname=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_search_gethostname" >&5 +$as_echo "$ac_cv_search_gethostname" >&6; } +ac_res=$ac_cv_search_gethostname +if test "$ac_res" != no; then + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + + +{ $as_echo "$as_me:$LINENO: checking for socket in -lsocket" >&5 +$as_echo_n "checking for socket in -lsocket... " >&6; } +if test "${ac_cv_lib_socket_socket+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsocket $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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. */ +#ifdef __cplusplus +extern "C" +#endif +char socket (); +int +main () +{ +return socket (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_lib_socket_socket=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_socket_socket=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_socket_socket" >&5 +$as_echo "$ac_cv_lib_socket_socket" >&6; } +if test "x$ac_cv_lib_socket_socket" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBSOCKET 1 +_ACEOF + + LIBS="-lsocket $LIBS" + +fi + +{ $as_echo "$as_me:$LINENO: checking for library containing crypt" >&5 +$as_echo_n "checking for library containing crypt... " >&6; } +if test "${ac_cv_search_crypt+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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. */ +#ifdef __cplusplus +extern "C" +#endif +char crypt (); +int +main () +{ +return crypt (); + ; + return 0; +} +_ACEOF +for ac_lib in '' crypt ufc; 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 + rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_search_crypt=$ac_res +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext + if test "${ac_cv_search_crypt+set}" = set; then + break +fi +done +if test "${ac_cv_search_crypt+set}" = set; then + : +else + ac_cv_search_crypt=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_search_crypt" >&5 +$as_echo "$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 + + +{ $as_echo "$as_me:$LINENO: checking for main in -ltruerand" >&5 +$as_echo_n "checking for main in -ltruerand... " >&6; } +if test "${ac_cv_lib_truerand_main+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ltruerand $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + +int +main () +{ +return main (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_lib_truerand_main=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_truerand_main=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_truerand_main" >&5 +$as_echo "$ac_cv_lib_truerand_main" >&6; } +if test "x$ac_cv_lib_truerand_main" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBTRUERAND 1 +_ACEOF + + LIBS="-ltruerand $LIBS" + +fi + +{ $as_echo "$as_me:$LINENO: checking for library containing modf" >&5 +$as_echo_n "checking for library containing modf... " >&6; } +if test "${ac_cv_search_modf+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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. */ +#ifdef __cplusplus +extern "C" +#endif +char modf (); +int +main () +{ +return modf (); + ; + 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 + rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_search_modf=$ac_res +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext + if test "${ac_cv_search_modf+set}" = set; then + break +fi +done +if test "${ac_cv_search_modf+set}" = set; then + : +else + ac_cv_search_modf=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_search_modf" >&5 +$as_echo "$ac_cv_search_modf" >&6; } +ac_res=$ac_cv_search_modf +if test "$ac_res" != no; then + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + +{ $as_echo "$as_me:$LINENO: checking for library containing sqrt" >&5 +$as_echo_n "checking for library containing sqrt... " >&6; } +if test "${ac_cv_search_sqrt+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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. */ +#ifdef __cplusplus +extern "C" +#endif +char sqrt (); +int +main () +{ +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 + rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_search_sqrt=$ac_res +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext + if test "${ac_cv_search_sqrt+set}" = set; then + break +fi +done +if test "${ac_cv_search_sqrt+set}" = set; then + : +else + ac_cv_search_sqrt=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_search_sqrt" >&5 +$as_echo "$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 + + +echo "${nl}Checking for Threads..." + +if test -z "$enable_threads"; then + # Check whether --enable-threads was given. +if test "${enable_threads+set}" = set; then + enableval=$enable_threads; enable_threads=$enableval +else + + if test "$GCC" = "yes"; then + SAVE_FL="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS -w" + +for ac_header in pthread.h +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 +$as_echo_n "checking $ac_header usability... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 +$as_echo_n "checking $ac_header presence... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + + ;; +esac +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + +fi +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + enable_threads="pthread" +else + enable_threads="no" +fi + +done + + CPPFLAGS="$SAVE_FL" + else + +for ac_header in pthread.h +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 +$as_echo_n "checking $ac_header usability... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 +$as_echo_n "checking $ac_header presence... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + + ;; +esac +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + +fi +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + enable_threads="pthread" +else + enable_threads="no" +fi + +done + + fi + +fi + +fi + +if test "$enable_threads" = "no"; then + threads="0" + pthreadh="0" + pthreadser="0" +else + if test "$enable_threads" = "pthread"; then +# We have specified pthreads for our threading library, just make sure +# that we have everything we need + + apr_pthsv_CFLAGS="$CFLAGS" + apr_pthsv_LIBS="$LIBS" + + + +{ $as_echo "$as_me:$LINENO: checking for CFLAGS needed for pthreads" >&5 +$as_echo_n "checking for CFLAGS needed for pthreads... " >&6; } +if test "${apr_cv_pthreads_cflags+set}" = set; then + $as_echo_n "(cached) " >&6 +else + apr_ptc_cflags=$CFLAGS + for flag in none -kthread -pthread -pthreads -mt -mthreads -Kthread -threads; do + CFLAGS=$apr_ptc_cflags + test "x$flag" != "xnone" && CFLAGS="$CFLAGS $flag" + +if test "$cross_compiling" = yes; then + apr_p_t_r=no +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#include + +void *thread_routine(void *data) { + return data; +} + +int main() { + pthread_t thd; + pthread_mutexattr_t mattr; + pthread_once_t once_init = PTHREAD_ONCE_INIT; + int data = 1; + pthread_mutexattr_init(&mattr); + return pthread_create(&thd, NULL, thread_routine, &data); +} +_ACEOF +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + apr_p_t_r=yes +else + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +apr_p_t_r=no +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + + +if test $apr_p_t_r = yes; then + + apr_cv_pthreads_cflags="$flag" + break + +fi + + + done + CFLAGS=$apr_ptc_cflags + +fi +{ $as_echo "$as_me:$LINENO: result: $apr_cv_pthreads_cflags" >&5 +$as_echo "$apr_cv_pthreads_cflags" >&6; } + +if test -n "$apr_cv_pthreads_cflags"; then + pthreads_working=yes + if test "x$apr_cv_pthreads_cflags" != "xnone"; then + + if test "x$CFLAGS" = "x"; then + echo " setting CFLAGS to \"$apr_cv_pthreads_cflags\"" + CFLAGS="$apr_cv_pthreads_cflags" + else + apr_addto_bugger="$apr_cv_pthreads_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 + echo " adding \"$i\" to CFLAGS" + CFLAGS="$CFLAGS $i" + fi + done + fi + + fi +fi + +# The CFLAGS may or may not be sufficient to ensure that libapr +# depends on the pthreads library: some versions of libtool +# drop -pthread when passed on the link line; some versions of +# gcc ignore -pthread when linking a shared object. So always +# try and add the relevant library to LIBS too. + +{ $as_echo "$as_me:$LINENO: checking for LIBS needed for pthreads" >&5 +$as_echo_n "checking for LIBS needed for pthreads... " >&6; } +if test "${apr_cv_pthreads_lib+set}" = set; then + $as_echo_n "(cached) " >&6 +else + + apr_ptc_libs=$LIBS + for lib in -lpthread -lpthreads -lc_r; do + LIBS="$apr_ptc_libs $lib" + +if test "$cross_compiling" = yes; then + apr_p_t_r=no +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#include + +void *thread_routine(void *data) { + return data; +} + +int main() { + pthread_t thd; + pthread_mutexattr_t mattr; + pthread_once_t once_init = PTHREAD_ONCE_INIT; + int data = 1; + pthread_mutexattr_init(&mattr); + return pthread_create(&thd, NULL, thread_routine, &data); +} +_ACEOF +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + apr_p_t_r=yes +else + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +apr_p_t_r=no +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + + +if test $apr_p_t_r = yes; then + + apr_cv_pthreads_lib=$lib + break + +fi + + + done + LIBS=$apr_ptc_libs + +fi +{ $as_echo "$as_me:$LINENO: result: $apr_cv_pthreads_lib" >&5 +$as_echo "$apr_cv_pthreads_lib" >&6; } + +if test -n "$apr_cv_pthreads_lib"; then + pthreads_working=yes + + if test "x$LIBS" = "x"; then + echo " setting LIBS to \"$apr_cv_pthreads_lib\"" + LIBS="$apr_cv_pthreads_lib" + else + apr_addto_bugger="$apr_cv_pthreads_lib" + 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 + echo " adding \"$i\" to LIBS" + LIBS="$LIBS $i" + fi + done + fi + +fi + +if test "$pthreads_working" = "yes"; then + threads_result="POSIX Threads found" +else + threads_result="POSIX Threads not found" +fi + + + if test "$GCC" = "yes"; then + SAVE_FL="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS -w" + +for ac_header in pthread.h +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 +$as_echo_n "checking $ac_header usability... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 +$as_echo_n "checking $ac_header presence... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + + ;; +esac +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + +fi +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + + threads="1" + pthreadh="1" + pthreadser="1" + +cat >>confdefs.h <<\_ACEOF +#define USE_THREADS 1 +_ACEOF + +else + + threads="0" + pthreadh="0" + pthreadser="0" + + CFLAGS="$apr_pthsv_CFLAGS" + LIBS="$apr_pthsv_LIBS" + +fi + +done + + CPPFLAGS="$SAVE_FL" + else + +for ac_header in pthread.h +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 +$as_echo_n "checking $ac_header usability... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 +$as_echo_n "checking $ac_header presence... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + + ;; +esac +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + +fi +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + + threads="1" + pthreadh="1" + pthreadser="1" + +cat >>confdefs.h <<\_ACEOF +#define USE_THREADS 1 +_ACEOF + +else + + threads="0" + pthreadh="0" + pthreadser="0" + + CFLAGS="$apr_pthsv_CFLAGS" + LIBS="$apr_pthsv_LIBS" + +fi + +done + + fi + + elif test "$enable_threads" = "system_threads"; then + threads="1" + pthreadh="0" + pthreadser="0" + else +# We basically specified that we wanted threads, but not how to implement +# them. In this case, just look for pthreads. In the future, we can check +# for other threading libraries as well. + + apr_pthsv_CFLAGS="$CFLAGS" + apr_pthsv_LIBS="$LIBS" + + + +{ $as_echo "$as_me:$LINENO: checking for CFLAGS needed for pthreads" >&5 +$as_echo_n "checking for CFLAGS needed for pthreads... " >&6; } +if test "${apr_cv_pthreads_cflags+set}" = set; then + $as_echo_n "(cached) " >&6 +else + apr_ptc_cflags=$CFLAGS + for flag in none -kthread -pthread -pthreads -mt -mthreads -Kthread -threads; do + CFLAGS=$apr_ptc_cflags + test "x$flag" != "xnone" && CFLAGS="$CFLAGS $flag" + +if test "$cross_compiling" = yes; then + apr_p_t_r=no +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#include + +void *thread_routine(void *data) { + return data; +} + +int main() { + pthread_t thd; + pthread_mutexattr_t mattr; + pthread_once_t once_init = PTHREAD_ONCE_INIT; + int data = 1; + pthread_mutexattr_init(&mattr); + return pthread_create(&thd, NULL, thread_routine, &data); +} +_ACEOF +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + apr_p_t_r=yes +else + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +apr_p_t_r=no +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + + +if test $apr_p_t_r = yes; then + + apr_cv_pthreads_cflags="$flag" + break + +fi + + + done + CFLAGS=$apr_ptc_cflags + +fi +{ $as_echo "$as_me:$LINENO: result: $apr_cv_pthreads_cflags" >&5 +$as_echo "$apr_cv_pthreads_cflags" >&6; } + +if test -n "$apr_cv_pthreads_cflags"; then + pthreads_working=yes + if test "x$apr_cv_pthreads_cflags" != "xnone"; then + + if test "x$CFLAGS" = "x"; then + echo " setting CFLAGS to \"$apr_cv_pthreads_cflags\"" + CFLAGS="$apr_cv_pthreads_cflags" + else + apr_addto_bugger="$apr_cv_pthreads_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 + echo " adding \"$i\" to CFLAGS" + CFLAGS="$CFLAGS $i" + fi + done + fi + + fi +fi + +# The CFLAGS may or may not be sufficient to ensure that libapr +# depends on the pthreads library: some versions of libtool +# drop -pthread when passed on the link line; some versions of +# gcc ignore -pthread when linking a shared object. So always +# try and add the relevant library to LIBS too. + +{ $as_echo "$as_me:$LINENO: checking for LIBS needed for pthreads" >&5 +$as_echo_n "checking for LIBS needed for pthreads... " >&6; } +if test "${apr_cv_pthreads_lib+set}" = set; then + $as_echo_n "(cached) " >&6 +else + + apr_ptc_libs=$LIBS + for lib in -lpthread -lpthreads -lc_r; do + LIBS="$apr_ptc_libs $lib" + +if test "$cross_compiling" = yes; then + apr_p_t_r=no +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#include + +void *thread_routine(void *data) { + return data; +} + +int main() { + pthread_t thd; + pthread_mutexattr_t mattr; + pthread_once_t once_init = PTHREAD_ONCE_INIT; + int data = 1; + pthread_mutexattr_init(&mattr); + return pthread_create(&thd, NULL, thread_routine, &data); +} +_ACEOF +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + apr_p_t_r=yes +else + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +apr_p_t_r=no +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + + +if test $apr_p_t_r = yes; then + + apr_cv_pthreads_lib=$lib + break + +fi + + + done + LIBS=$apr_ptc_libs + +fi +{ $as_echo "$as_me:$LINENO: result: $apr_cv_pthreads_lib" >&5 +$as_echo "$apr_cv_pthreads_lib" >&6; } + +if test -n "$apr_cv_pthreads_lib"; then + pthreads_working=yes + + if test "x$LIBS" = "x"; then + echo " setting LIBS to \"$apr_cv_pthreads_lib\"" + LIBS="$apr_cv_pthreads_lib" + else + apr_addto_bugger="$apr_cv_pthreads_lib" + 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 + echo " adding \"$i\" to LIBS" + LIBS="$LIBS $i" + fi + done + fi + +fi + +if test "$pthreads_working" = "yes"; then + threads_result="POSIX Threads found" +else + threads_result="POSIX Threads not found" +fi + + + if test "$GCC" = "yes"; then + SAVE_FL="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS -w" + +for ac_header in pthread.h +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 +$as_echo_n "checking $ac_header usability... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 +$as_echo_n "checking $ac_header presence... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + + ;; +esac +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + +fi +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + + threads="1" + pthreadh="1" + pthreadser="1" + cat >>confdefs.h <<\_ACEOF +#define USE_THREADS 1 +_ACEOF + +else + + threads="0" + pthreadser="0" + pthreadh="0" + + CFLAGS="$apr_pthsv_CFLAGS" + LIBS="$apr_pthsv_LIBS" + +fi + +done + + CPPFLAGS="$SAVE_FL" + else + +for ac_header in pthread.h +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 +$as_echo_n "checking $ac_header usability... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 +$as_echo_n "checking $ac_header presence... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + + ;; +esac +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + +fi +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + + threads="1" + pthreadh="1" + pthreadser="1" + cat >>confdefs.h <<\_ACEOF +#define USE_THREADS 1 +_ACEOF + +else + + threads="0" + pthreadser="0" + pthreadh="0" + + CFLAGS="$apr_pthsv_CFLAGS" + LIBS="$apr_pthsv_LIBS" + +fi + +done + + fi + + fi + if test "$pthreadh" = "1"; then + +{ $as_echo "$as_me:$LINENO: checking whether pthread_getspecific takes two arguments" >&5 +$as_echo_n "checking whether pthread_getspecific takes two arguments... " >&6; } +if test "${ac_cv_pthread_getspecific_two_args+set}" = set; then + $as_echo_n "(cached) " >&6 +else + +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include + +int +main () +{ + +pthread_key_t key; +void *tmp; +pthread_getspecific(key,&tmp); + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + + ac_cv_pthread_getspecific_two_args=yes + +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + + ac_cv_pthread_getspecific_two_args=no + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_pthread_getspecific_two_args" >&5 +$as_echo "$ac_cv_pthread_getspecific_two_args" >&6; } + +if test "$ac_cv_pthread_getspecific_two_args" = "yes"; then + +cat >>confdefs.h <<\_ACEOF +#define PTHREAD_GETSPECIFIC_TAKES_TWO_ARGS 1 +_ACEOF + +fi + + +{ $as_echo "$as_me:$LINENO: checking whether pthread_attr_getdetachstate takes one argument" >&5 +$as_echo_n "checking whether pthread_attr_getdetachstate takes one argument... " >&6; } +if test "${ac_cv_pthread_attr_getdetachstate_one_arg+set}" = set; then + $as_echo_n "(cached) " >&6 +else + +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include + +int +main () +{ + +pthread_attr_t *attr; +pthread_attr_getdetachstate(attr); + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + + ac_cv_pthread_attr_getdetachstate_one_arg=yes + +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + + ac_cv_pthread_attr_getdetachstate_one_arg=no + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_pthread_attr_getdetachstate_one_arg" >&5 +$as_echo "$ac_cv_pthread_attr_getdetachstate_one_arg" >&6; } + +if test "$ac_cv_pthread_attr_getdetachstate_one_arg" = "yes"; then + +cat >>confdefs.h <<\_ACEOF +#define PTHREAD_ATTR_GETDETACHSTATE_TAKES_ONE_ARG 1 +_ACEOF + +fi + + + +for ac_func in pthread_key_delete pthread_rwlock_init +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* 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 $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + + if test "$ac_cv_func_pthread_rwlock_init" = "yes"; then + { $as_echo "$as_me:$LINENO: checking for pthread_rwlock_t" >&5 +$as_echo_n "checking for pthread_rwlock_t... " >&6; } +if test "${apr_cv_type_rwlock_t+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +int +main () +{ +pthread_rwlock_t *rwlock; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + apr_cv_type_rwlock_t=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + apr_cv_type_rwlock_t=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $apr_cv_type_rwlock_t" >&5 +$as_echo "$apr_cv_type_rwlock_t" >&6; } + if test "$apr_cv_type_rwlock_t" = "yes"; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_PTHREAD_RWLOCKS 1 +_ACEOF + + fi + fi + # this might also require -DXOPEN_SOURCE=500, so leave after the + # rwlock check. + + { $as_echo "$as_me:$LINENO: checking for recursive mutex support" >&5 +$as_echo_n "checking for recursive mutex support... " >&6; } +if test "${apr_cv_mutex_recursive+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then + apr_cv_mutex_recursive=no +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include + +int main() { + pthread_mutexattr_t attr; + pthread_mutex_t m; + + exit (pthread_mutexattr_init(&attr) + || pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE) + || pthread_mutex_init(&m, &attr)); +} +_ACEOF +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + apr_cv_mutex_recursive=yes +else + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +apr_cv_mutex_recursive=no +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi +{ $as_echo "$as_me:$LINENO: result: $apr_cv_mutex_recursive" >&5 +$as_echo "$apr_cv_mutex_recursive" >&6; } + +if test "$apr_cv_mutex_recursive" = "yes"; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_PTHREAD_MUTEX_RECURSIVE 1 +_ACEOF + +fi + + fi +fi + +ac_cv_define_READDIR_IS_THREAD_SAFE=no +ac_cv_define_GETHOSTBYNAME_IS_THREAD_SAFE=no +ac_cv_define_GETHOSTBYADDR_IS_THREAD_SAFE=no +if test "$threads" = "1"; then + echo "APR will use threads" + { $as_echo "$as_me:$LINENO: checking for readdir in -lc_r" >&5 +$as_echo_n "checking for readdir in -lc_r... " >&6; } +if test "${ac_cv_lib_c_r_readdir+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lc_r $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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. */ +#ifdef __cplusplus +extern "C" +#endif +char readdir (); +int +main () +{ +return readdir (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_lib_c_r_readdir=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_c_r_readdir=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_c_r_readdir" >&5 +$as_echo "$ac_cv_lib_c_r_readdir" >&6; } +if test "x$ac_cv_lib_c_r_readdir" = x""yes; then + +cat >>confdefs.h <<\_ACEOF +#define READDIR_IS_THREAD_SAFE 1 +_ACEOF + +fi + + if test "x$apr_gethostbyname_is_thread_safe" = "x"; then + { $as_echo "$as_me:$LINENO: checking for gethostbyname in -lc_r" >&5 +$as_echo_n "checking for gethostbyname in -lc_r... " >&6; } +if test "${ac_cv_lib_c_r_gethostbyname+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lc_r $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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. */ +#ifdef __cplusplus +extern "C" +#endif +char gethostbyname (); +int +main () +{ +return gethostbyname (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_lib_c_r_gethostbyname=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_c_r_gethostbyname=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_c_r_gethostbyname" >&5 +$as_echo "$ac_cv_lib_c_r_gethostbyname" >&6; } +if test "x$ac_cv_lib_c_r_gethostbyname" = x""yes; then + apr_gethostbyname_is_thread_safe=yes +fi + + fi + if test "$apr_gethostbyname_is_thread_safe" = "yes"; then + +cat >>confdefs.h <<\_ACEOF +#define GETHOSTBYNAME_IS_THREAD_SAFE 1 +_ACEOF + + fi + if test "x$apr_gethostbyaddr_is_thread_safe" = "x"; then + { $as_echo "$as_me:$LINENO: checking for gethostbyaddr in -lc_r" >&5 +$as_echo_n "checking for gethostbyaddr in -lc_r... " >&6; } +if test "${ac_cv_lib_c_r_gethostbyaddr+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lc_r $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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. */ +#ifdef __cplusplus +extern "C" +#endif +char gethostbyaddr (); +int +main () +{ +return gethostbyaddr (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_lib_c_r_gethostbyaddr=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_c_r_gethostbyaddr=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_c_r_gethostbyaddr" >&5 +$as_echo "$ac_cv_lib_c_r_gethostbyaddr" >&6; } +if test "x$ac_cv_lib_c_r_gethostbyaddr" = x""yes; then + apr_gethostbyaddr_is_thread_safe=yes +fi + + fi + if test "$apr_gethostbyaddr_is_thread_safe" = "yes"; then + +cat >>confdefs.h <<\_ACEOF +#define GETHOSTBYADDR_IS_THREAD_SAFE 1 +_ACEOF + + fi + + +for ac_func in gethostbyname_r gethostbyaddr_r +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* 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 $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + +else + echo "APR will be non-threaded" +fi + + +for ac_func in sigsuspend +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* 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 $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + have_sigsuspend="1" +else + have_sigsuspend="0" +fi +done + + +for ac_func in sigwait +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* 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 $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + have_sigwait="1" +else + have_sigwait="0" +fi +done + +case $host in + *alpha*-dec-osf* ) + have_sigwait="1" + ;; +esac + + + + + + +for ac_func in poll +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* 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 $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + + + + + +for ac_func in getpwnam_r getpwuid_r getgrnam_r getgrgid_r +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* 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 $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + +echo "${nl}Checking for Shared Memory Support..." + +# The real-time POSIX extensions (e.g. shm_*, sem_*) may only +# be available if linking against librt. +{ $as_echo "$as_me:$LINENO: checking for library containing shm_open" >&5 +$as_echo_n "checking for library containing shm_open... " >&6; } +if test "${ac_cv_search_shm_open+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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. */ +#ifdef __cplusplus +extern "C" +#endif +char shm_open (); +int +main () +{ +return shm_open (); + ; + return 0; +} +_ACEOF +for ac_lib in '' rt; 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 + rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_search_shm_open=$ac_res +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext + if test "${ac_cv_search_shm_open+set}" = set; then + break +fi +done +if test "${ac_cv_search_shm_open+set}" = set; then + : +else + ac_cv_search_shm_open=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_search_shm_open" >&5 +$as_echo "$ac_cv_search_shm_open" >&6; } +ac_res=$ac_cv_search_shm_open +if test "$ac_res" != no; then + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + + +case $host in + *-sysv*) + ac_includes_default="$ac_includes_default +#if HAVE_SYS_MUTEX_H /* needed to define lock_t for sys/shm.h */ +# include +#endif";; +esac + + + + + + + + +for ac_header in sys/mman.h sys/ipc.h sys/mutex.h sys/shm.h sys/file.h kernel/OS.h os2.h +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 +$as_echo_n "checking $ac_header usability... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 +$as_echo_n "checking $ac_header presence... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + + ;; +esac +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + +fi +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + + + + + + + + +for ac_func in mmap munmap shm_open shm_unlink shmget shmat shmdt shmctl \ + create_area +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* 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 $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + + { $as_echo "$as_me:$LINENO: checking for MAP_ANON in sys/mman.h" >&5 +$as_echo_n "checking for MAP_ANON in sys/mman.h... " >&6; } +if test "${ac_cv_define_MAP_ANON+set}" = set; then + $as_echo_n "(cached) " >&6 +else + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#ifdef MAP_ANON +YES_IS_DEFINED +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "YES_IS_DEFINED" >/dev/null 2>&1; then + ac_cv_define_MAP_ANON=yes +else + ac_cv_define_MAP_ANON=no +fi +rm -f conftest* + + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_define_MAP_ANON" >&5 +$as_echo "$ac_cv_define_MAP_ANON" >&6; } + if test "$ac_cv_define_MAP_ANON" = "yes"; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_MAP_ANON 1 +_ACEOF + + fi + +{ $as_echo "$as_me:$LINENO: checking for /dev/zero" >&5 +$as_echo_n "checking for /dev/zero... " >&6; } +if test "${ac_cv_file__dev_zero+set}" = set; then + $as_echo_n "(cached) " >&6 +else + test "$cross_compiling" = yes && + { { $as_echo "$as_me:$LINENO: error: cannot check for file existence when cross compiling" >&5 +$as_echo "$as_me: error: cannot check for file existence when cross compiling" >&2;} + { (exit 1); exit 1; }; } +if test -r "/dev/zero"; then + ac_cv_file__dev_zero=yes +else + ac_cv_file__dev_zero=no +fi +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_file__dev_zero" >&5 +$as_echo "$ac_cv_file__dev_zero" >&6; } + + +# Not all systems can mmap /dev/zero (such as HP-UX). Check for that. +if test "$ac_cv_func_mmap" = "yes" && + test "$ac_cv_file__dev_zero" = "yes"; then + { $as_echo "$as_me:$LINENO: checking for mmap that can map /dev/zero" >&5 +$as_echo_n "checking for mmap that can map /dev/zero... " >&6; } + if test "$cross_compiling" = yes; then + ac_cv_file__dev_zero=no +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#include +#include +#ifdef HAVE_SYS_MMAN_H +#include +#endif + int main() + { + int fd; + void *m; + fd = open("/dev/zero", O_RDWR); + if (fd < 0) { + return 1; + } + m = mmap(0, sizeof(void*), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); + if (m == (void *)-1) { /* aka MAP_FAILED */ + return 2; + } + if (munmap(m, sizeof(void*)) < 0) { + return 3; + } + return 0; + } +_ACEOF +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_file__dev_zero=no +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + + + { $as_echo "$as_me:$LINENO: result: $ac_cv_file__dev_zero" >&5 +$as_echo "$ac_cv_file__dev_zero" >&6; } +fi + +# Now we determine which one is our anonymous shmem preference. +haveshmgetanon="0" +havemmapzero="0" +havemmapanon="0" +ac_decision_item='anonymous shared memory allocation method' +ac_decision_msg='FAILED' +ac_decision='' + +ac_rc=yes +for ac_spec in header:sys/ipc.h header:sys/shm.h header:sys/file.h func:shmget func:shmat func:shmdt func:shmctl; 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 + : + haveshmgetanon="1" + ac_decision='USE_SHMEM_SHMGET_ANON' +ac_decision_msg='SysV IPC shmget()' +ac_decision_USE_SHMEM_SHMGET_ANON=yes +ac_decision_USE_SHMEM_SHMGET_ANON_msg='SysV IPC shmget()' + +else + : + +fi + +ac_rc=yes +for ac_spec in header:sys/mman.h func:mmap func:munmap file:/dev/zero; 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 + : + havemmapzero="1" + ac_decision='USE_SHMEM_MMAP_ZERO' +ac_decision_msg='SVR4-style mmap() on /dev/zero' +ac_decision_USE_SHMEM_MMAP_ZERO=yes +ac_decision_USE_SHMEM_MMAP_ZERO_msg='SVR4-style mmap() on /dev/zero' + +else + : + +fi + +ac_rc=yes +for ac_spec in header:sys/mman.h func:mmap func:munmap define:MAP_ANON; 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 + : + havemmapanon="1" + ac_decision='USE_SHMEM_MMAP_ANON' +ac_decision_msg='4.4BSD-style mmap() via MAP_ANON' +ac_decision_USE_SHMEM_MMAP_ANON=yes +ac_decision_USE_SHMEM_MMAP_ANON_msg='4.4BSD-style mmap() via MAP_ANON' + +else + : + +fi + +ac_rc=yes +for ac_spec in header:os2.h; 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 + : + haveos2shm="1" + ac_decision='USE_SHMEM_OS2_ANON' +ac_decision_msg='OS/2 DosAllocSharedMem()' +ac_decision_USE_SHMEM_OS2_ANON=yes +ac_decision_USE_SHMEM_OS2_ANON_msg='OS/2 DosAllocSharedMem()' + +else + : + +fi + +ac_rc=yes +for ac_spec in header:kernel/OS.h func:create_area; 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 + : + havebeosshm="1" + ac_decision='USE_SHMEM_BEOS_ANON' +ac_decision_msg='BeOS areas' +ac_decision_USE_SHMEM_BEOS_ANON=yes +ac_decision_USE_SHMEM_BEOS_ANON_msg='BeOS areas' + +else + : + +fi + +case $host in + *linux* ) + # Linux has problems with MM_SHMT_MMANON even though it reports + # that it has it. + # FIXME - find exact 2.3 version that MMANON was fixed in. It is + # confirmed fixed in 2.4 series. + if test $os_version -le "240"; then + ac_decision='' + for ac_item in USE_SHMEM_MMAP_ZERO USE_SHMEM_SHMGET_ANON; 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 + + fi + ;; + *hpux11* ) + ac_decision='' + for ac_item in USE_SHMEM_SHMGET_ANON; 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 + + ;; +esac +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 + cat >>confdefs.h <<_ACEOF +#define ${ac_decision_item} 1 +_ACEOF + + { $as_echo "$as_me:$LINENO: result: decision on $ac_decision_item... $ac_decision_msg" >&5 +$as_echo "decision on $ac_decision_item... $ac_decision_msg" >&6; } +fi + +cat >>confdefs.h <<_ACEOF +#define $ac_decision 1 +_ACEOF + + +useshmgetanon="0" +usemmapzero="0" +usemmapanon="0" + +case $ac_decision in + USE_SHMEM_SHMGET_ANON ) + useshmgetanon="1" + ;; + USE_SHMEM_MMAP_ZERO ) + usemmapzero="1" + ;; + USE_SHMEM_MMAP_ANON ) + usemmapanon="1" + ;; +esac + + + + + + + + +# Now we determine which one is our name-based shmem preference. +havemmaptmp="0" +havemmapshm="0" +haveshmget="0" +havebeosarea="0" +haveos2shm="0" +ac_decision_item='namebased memory allocation method' +ac_decision_msg='FAILED' +ac_decision='' + +ac_rc=yes +for ac_spec in header:sys/mman.h func:mmap func:munmap; 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 + : + havemmaptmp="1" + ac_decision='USE_SHMEM_MMAP_TMP' +ac_decision_msg='Classical mmap() on temporary file' +ac_decision_USE_SHMEM_MMAP_TMP=yes +ac_decision_USE_SHMEM_MMAP_TMP_msg='Classical mmap() on temporary file' + +else + : + +fi + +ac_rc=yes +for ac_spec in header:sys/mman.h func:mmap func:munmap func:shm_open func:shm_unlink; 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 + : + havemmapshm="1" + ac_decision='USE_SHMEM_MMAP_SHM' +ac_decision_msg='mmap() via POSIX.1 shm_open() on temporary file' +ac_decision_USE_SHMEM_MMAP_SHM=yes +ac_decision_USE_SHMEM_MMAP_SHM_msg='mmap() via POSIX.1 shm_open() on temporary file' + +else + : + +fi + +ac_rc=yes +for ac_spec in header:sys/ipc.h header:sys/shm.h header:sys/file.h func:shmget func:shmat func:shmdt func:shmctl; 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 + : + haveshmget="1" + ac_decision='USE_SHMEM_SHMGET' +ac_decision_msg='SysV IPC shmget()' +ac_decision_USE_SHMEM_SHMGET=yes +ac_decision_USE_SHMEM_SHMGET_msg='SysV IPC shmget()' + +else + : + +fi + +ac_rc=yes +for ac_spec in header:kernel/OS.h func:create_area; 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 + : + havebeosshm="1" + ac_decision='USE_SHMEM_BEOS' +ac_decision_msg='BeOS areas' +ac_decision_USE_SHMEM_BEOS=yes +ac_decision_USE_SHMEM_BEOS_msg='BeOS areas' + +else + : + +fi + +ac_rc=yes +for ac_spec in header:os2.h; 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 + : + haveos2shm="1" + ac_decision='USE_SHMEM_OS2' +ac_decision_msg='OS/2 DosAllocSharedMem()' +ac_decision_USE_SHMEM_OS2=yes +ac_decision_USE_SHMEM_OS2_msg='OS/2 DosAllocSharedMem()' + +else + : + +fi + +case $host in + *linux* ) + # Linux has problems with MM_SHMT_MMANON even though it reports + # that it has it. + # FIXME - find exact 2.3 version that MMANON was fixed in. It is + # confirmed fixed in 2.4 series. + if test $os_version -le "240"; then + ac_decision='' + for ac_item in USE_SHMEM_MMAP_TMP USE_SHMEM_MMAP_SHM USE_SHMEM_SHMGET; 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 + + fi + ;; +esac +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 + cat >>confdefs.h <<_ACEOF +#define ${ac_decision_item} 1 +_ACEOF + + { $as_echo "$as_me:$LINENO: result: decision on $ac_decision_item... $ac_decision_msg" >&5 +$as_echo "decision on $ac_decision_item... $ac_decision_msg" >&6; } +fi + +cat >>confdefs.h <<_ACEOF +#define $ac_decision 1 +_ACEOF + + +usemmaptmp="0" +usemmapshm="0" +useshmget="0" +usebeosarea="0" +useos2shm="0" + +case $ac_decision in + USE_SHMEM_MMAP_TMP ) + usemmaptmp="1" + ;; + USE_SHMEM_MMAP_SHM ) + usemmapshm="1" + ;; + USE_SHMEM_SHMGET ) + useshmget="1" + ;; + USE_SHMEM_BEOS ) + usebeosarea="1" + ;; + USE_SHMEM_OS2 ) + useos2shm="1" + ;; +esac + +# Do we have any shared memory support? +if test "$usemmaptmp$usemmapshm$usemmapzero$useshmget$usemmapanon$usebeosarea$useos2shm" = "0000000"; then + sharedmem="0" +else + sharedmem="1" +fi + + + + + + + + + + + + + + + + + + + + +for ac_func in alloca calloc strcasecmp stricmp setsid isinf isnan +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* 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 $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + + + + +for ac_func in getenv putenv setenv unsetenv +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* 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 $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + +for ac_func in setrlimit +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* 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 $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + have_setrlimit="1" +else + have_setrlimit="0" +fi +done + + +for ac_func in getrlimit +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* 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 $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + have_getrlimit="1" +else + have_getrlimit="0" +fi +done + + +for ac_func in writev +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* 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 $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + +sendfile="0" + +{ $as_echo "$as_me:$LINENO: checking for sendfilev in -lsendfile" >&5 +$as_echo_n "checking for sendfilev in -lsendfile... " >&6; } +if test "${ac_cv_lib_sendfile_sendfilev+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lsendfile $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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. */ +#ifdef __cplusplus +extern "C" +#endif +char sendfilev (); +int +main () +{ +return sendfilev (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_lib_sendfile_sendfilev=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_sendfile_sendfilev=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_sendfile_sendfilev" >&5 +$as_echo "$ac_cv_lib_sendfile_sendfilev" >&6; } +if test "x$ac_cv_lib_sendfile_sendfilev" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBSENDFILE 1 +_ACEOF + + LIBS="-lsendfile $LIBS" + +fi + + + + +for ac_func in sendfile send_file sendfilev +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* 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 $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + sendfile="1" +fi +done + + + +for ac_func in utime utimes +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* 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 $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + + + +# Check whether --with-sendfile was given. +if test "${with_sendfile+set}" = set; then + withval=$with_sendfile; if test "$withval" = "yes"; then + sendfile="1" + else + sendfile="0" + fi +else + + orig_sendfile=$sendfile + case $host in + *freebsd*) + # FreeBSD < 4.2 has issues with threads+sendfile + if test $os_version -le "401999"; then + if test "$threads" = "1"; then + sendfile="0" + fi + fi + ;; + *alpha*-dec-osf* ) + sendfile="0" + ;; + s390-*-linux-gnu) + # disable sendfile support for 2.2 on S/390 + if test $os_version -lt 240; then + sendfile="0" + fi + ;; + *aix*) + # compiler-independent check for 64-bit build + # The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:$LINENO: checking size of void*" >&5 +$as_echo_n "checking size of void*... " >&6; } +if test "${ac_cv_sizeof_voidp+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (void*))) >= 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_lo=0 ac_mid=0 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (void*))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=$ac_mid; break +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo=`expr $ac_mid + 1` + if test $ac_lo -le $ac_mid; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid + 1` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (void*))) < 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=-1 ac_mid=-1 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (void*))) >= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_lo=$ac_mid; break +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_hi=`expr '(' $ac_mid ')' - 1` + if test $ac_mid -le $ac_hi; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo= ac_hi= +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +# Binary search between lo and hi bounds. +while test "x$ac_lo" != "x$ac_hi"; do + ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (void*))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=$ac_mid +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo=`expr '(' $ac_mid ')' + 1` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done +case $ac_lo in +?*) ac_cv_sizeof_voidp=$ac_lo;; +'') if test "$ac_cv_type_voidp" = yes; then + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute sizeof (void*) +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute sizeof (void*) +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } + else + ac_cv_sizeof_voidp=0 + fi ;; +esac +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +static long int longval () { return (long int) (sizeof (void*)); } +static unsigned long int ulongval () { return (long int) (sizeof (void*)); } +#include +#include +int +main () +{ + + FILE *f = fopen ("conftest.val", "w"); + if (! f) + return 1; + if (((long int) (sizeof (void*))) < 0) + { + long int i = longval (); + if (i != ((long int) (sizeof (void*)))) + return 1; + fprintf (f, "%ld", i); + } + else + { + unsigned long int i = ulongval (); + if (i != ((long int) (sizeof (void*)))) + return 1; + fprintf (f, "%lu", i); + } + /* Do not output a trailing newline, as this causes \r\n confusion + on some platforms. */ + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_sizeof_voidp=`cat conftest.val` +else + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +if test "$ac_cv_type_voidp" = yes; then + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute sizeof (void*) +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute sizeof (void*) +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } + else + ac_cv_sizeof_voidp=0 + fi +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +rm -f conftest.val +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_sizeof_voidp" >&5 +$as_echo "$ac_cv_sizeof_voidp" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_VOIDP $ac_cv_sizeof_voidp +_ACEOF + + + if test "x$ac_cv_sizeof_voidp" = "x8"; then + # sendfile not working for 64-bit build + sendfile="0" + fi + ;; + *darwin*) + # darwin semantics in 9.0.0 appear to be fubar + sendfile="0" + ;; + esac + if test "$orig_sendfile" != "$sendfile"; then + echo "sendfile support disabled to avoid system problem" + fi +fi + + + + +for ac_func in sigaction +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* 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 $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + have_sigaction="1" +else + have_sigaction="0" +fi +done + +{ $as_echo "$as_me:$LINENO: checking whether sys_siglist is declared" >&5 +$as_echo_n "checking whether sys_siglist is declared... " >&6; } +if test "${ac_cv_have_decl_sys_siglist+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +/* NetBSD declares sys_siglist in unistd.h. */ +#ifdef HAVE_UNISTD_H +# include +#endif + + +int +main () +{ +#ifndef sys_siglist + (void) sys_siglist; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_have_decl_sys_siglist=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_have_decl_sys_siglist=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_have_decl_sys_siglist" >&5 +$as_echo "$ac_cv_have_decl_sys_siglist" >&6; } +if test "x$ac_cv_have_decl_sys_siglist" = x""yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_SYS_SIGLIST 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_SYS_SIGLIST 0 +_ACEOF + + +fi + + + + + +for ac_func in fork +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* 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 $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + fork="1" +else + fork="0" +fi +done + + +{ $as_echo "$as_me:$LINENO: checking for inet_addr" >&5 +$as_echo_n "checking for inet_addr... " >&6; } +if test "${ac_cv_func_inet_addr+set}" = set; then + $as_echo_n "(cached) " >&6 +else + +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_ARPA_INET_H +#include +#endif + +int +main () +{ + +inet_addr("127.0.0.1"); + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + + ac_cv_func_inet_addr=yes + +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + + ac_cv_func_inet_addr=no + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_inet_addr" >&5 +$as_echo "$ac_cv_func_inet_addr" >&6; } + +if test "$ac_cv_func_inet_addr" = "yes"; then + have_inet_addr=1 +else + have_inet_addr=0 +fi + + +{ $as_echo "$as_me:$LINENO: checking for inet_network" >&5 +$as_echo_n "checking for inet_network... " >&6; } +if test "${ac_cv_func_inet_network+set}" = set; then + $as_echo_n "(cached) " >&6 +else + +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_ARPA_INET_H +#include +#endif + +int +main () +{ + +inet_network("127.0.0.1"); + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + + ac_cv_func_inet_network=yes + +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + + ac_cv_func_inet_network=no + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_inet_network" >&5 +$as_echo "$ac_cv_func_inet_network" >&6; } + +if test "$ac_cv_func_inet_network" = "yes"; then + have_inet_network=1 +else + have_inet_network=0 +fi + + +{ $as_echo "$as_me:$LINENO: checking for _getch" >&5 +$as_echo_n "checking for _getch... " >&6; } +if test "${ac_cv_func__getch+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define _getch to an innocuous variant, in case declares _getch. + For example, HP-UX 11i declares gettimeofday. */ +#define _getch innocuous__getch + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char _getch (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef _getch + +/* 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 _getch (); +/* 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__getch || defined __stub____getch +choke me +#endif + +int +main () +{ +return _getch (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_func__getch=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_func__getch=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_func__getch" >&5 +$as_echo "$ac_cv_func__getch" >&6; } + + +for ac_func in strerror_r +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* 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 $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + strerror_r="1" +else + strerror_r="0" +fi +done + +if test "$strerror_r" = "1"; then + +{ $as_echo "$as_me:$LINENO: checking for type of return code from strerror_r" >&5 +$as_echo_n "checking for type of return code from strerror_r... " >&6; } +if test "$cross_compiling" = yes; then + + ac_cv_strerror_r_rc_int=no +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#include +#include +main() +{ + char buf[1024]; + if (strerror_r(ERANGE, buf, sizeof buf) < 1) { + exit(0); + } + else { + exit(1); + } +} +_ACEOF +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + + ac_cv_strerror_r_rc_int=yes +else + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) + + ac_cv_strerror_r_rc_int=no +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +if test "x$ac_cv_strerror_r_rc_int" = xyes; then + +cat >>confdefs.h <<\_ACEOF +#define STRERROR_R_RC_INT 1 +_ACEOF + + msg="int" +else + msg="pointer" +fi +{ $as_echo "$as_me:$LINENO: result: $msg" >&5 +$as_echo "$msg" >&6; } + +fi + +for ac_func in crypt_r +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* 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 $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + crypt_r="1" +else + crypt_r="0" +fi +done + +if test "$crypt_r" = "1"; then + +{ $as_echo "$as_me:$LINENO: checking style of crypt_r" >&5 +$as_echo_n "checking style of crypt_r... " >&6; } +if test "${ac_cv_crypt_r_style+set}" = set; then + $as_echo_n "(cached) " >&6 +else + +ac_cv_crypt_r_style=none +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include + +int +main () +{ + +CRYPTD buffer; +crypt_r("passwd", "hash", &buffer); + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_crypt_r_style=cryptd +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +if test "$ac_cv_crypt_r_style" = "none"; then +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include + +int +main () +{ + +struct crypt_data buffer; +crypt_r("passwd", "hash", &buffer); + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_crypt_r_style=struct_crypt_data +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_crypt_r_style" >&5 +$as_echo "$ac_cv_crypt_r_style" >&6; } +if test "$ac_cv_crypt_r_style" = "cryptd"; then + +cat >>confdefs.h <<\_ACEOF +#define CRYPT_R_CRYPTD 1 +_ACEOF + +fi +# if we don't combine these conditions, CRYPT_R_STRUCT_CRYPT_DATA +# will end up defined twice +if test "$ac_cv_crypt_r_style" = "struct_crypt_data"; then + +cat >>confdefs.h <<\_ACEOF +#define CRYPT_R_STRUCT_CRYPT_DATA 1 +_ACEOF + +fi + +fi + +for ac_func in mmap +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* 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 $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + mmap="1" +else + mmap="0" +fi +done + +if test "$native_mmap_emul" = "1"; then + mmap="1" +fi + +for ac_func in memmove +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* 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 $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + have_memmove="1" +else + have_memmove="0" +fi +done + + + + + + + +for ac_func in getpass getpassphrase gmtime_r localtime_r hstrerror mkstemp +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* 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 $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + + + + + + + + + + + + + + { $as_echo "$as_me:$LINENO: checking whether sigwait takes one argument" >&5 +$as_echo_n "checking whether sigwait takes one argument... " >&6; } +if test "${ac_cv_sigwait_one_arg+set}" = set; then + $as_echo_n "(cached) " >&6 +else + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#if defined(__NETBSD__) || defined(DARWIN) + /* When using the unproven-pthreads package, we need to pull in this + * header to get a prototype for sigwait(). Else things will fail later + * on. XXX Should probably be fixed in the unproven-pthreads package. + * Darwin is declaring sigwait() in the wrong place as well. + */ +#include +#endif +#include + +int +main () +{ + + sigset_t set; + + sigwait(&set); + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + + ac_cv_sigwait_one_arg=yes + +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + + ac_cv_sigwait_one_arg=no + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_sigwait_one_arg" >&5 +$as_echo "$ac_cv_sigwait_one_arg" >&6; } + if test "$ac_cv_sigwait_one_arg" = "yes"; then + +cat >>confdefs.h <<\_ACEOF +#define SIGWAIT_TAKES_ONE_ARG 1 +_ACEOF + + fi + + +{ $as_echo "$as_me:$LINENO: checking for inode member of struct dirent" >&5 +$as_echo_n "checking for inode member of struct dirent... " >&6; } +if test "${apr_cv_dirent_inode+set}" = set; then + $as_echo_n "(cached) " >&6 +else + +apr_cv_dirent_inode=no +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#include + +int +main () +{ + +#ifdef d_ino +#undef d_ino +#endif +struct dirent de; de.d_fileno; + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + apr_cv_dirent_inode=d_fileno +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +if test "$apr_cv_dirent_inode" = "no"; then +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#include + +int +main () +{ + +#ifdef d_fileno +#undef d_fileno +#endif +struct dirent de; de.d_ino; + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + apr_cv_dirent_inode=d_ino +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +fi +{ $as_echo "$as_me:$LINENO: result: $apr_cv_dirent_inode" >&5 +$as_echo "$apr_cv_dirent_inode" >&6; } +if test "$apr_cv_dirent_inode" != "no"; then + cat >>confdefs.h <<_ACEOF +#define DIRENT_INODE $apr_cv_dirent_inode +_ACEOF + +fi + + +{ $as_echo "$as_me:$LINENO: checking for file type member of struct dirent" >&5 +$as_echo_n "checking for file type member of struct dirent... " >&6; } +if test "${apr_cv_dirent_type+set}" = set; then + $as_echo_n "(cached) " >&6 +else + +apr_cv_dirent_type=no +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#include + +int +main () +{ + +struct dirent de; de.d_type = DT_REG; + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + apr_cv_dirent_type=d_type +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:$LINENO: result: $apr_cv_dirent_type" >&5 +$as_echo "$apr_cv_dirent_type" >&6; } +if test "$apr_cv_dirent_type" != "no"; then + cat >>confdefs.h <<_ACEOF +#define DIRENT_TYPE $apr_cv_dirent_type +_ACEOF + +fi + + +{ $as_echo "$as_me:$LINENO: checking for ANSI C header files" >&5 +$as_echo_n "checking for ANSI C header files... " >&6; } +if test "${ac_cv_header_stdc+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_header_stdc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_header_stdc=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then + : +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + return 2; + return 0; +} +_ACEOF +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_header_stdc=no +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 +$as_echo "$ac_cv_header_stdc" >&6; } +if test $ac_cv_header_stdc = yes; then + +cat >>confdefs.h <<\_ACEOF +#define STDC_HEADERS 1 +_ACEOF + +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +for ac_header in alloca.h \ + ByteOrder.h \ + conio.h \ + crypt.h \ + ctype.h \ + dir.h \ + dirent.h \ + dl.h \ + dlfcn.h \ + errno.h \ + fcntl.h \ + grp.h \ + io.h \ + limits.h \ + mach-o/dyld.h \ + malloc.h \ + memory.h \ + netdb.h \ + osreldate.h \ + poll.h \ + process.h \ + pwd.h \ + semaphore.h \ + signal.h \ + stdarg.h \ + stddef.h \ + stdio.h \ + stdlib.h \ + string.h \ + strings.h \ + sysapi.h \ + sysgtime.h \ + termios.h \ + time.h \ + tpfeq.h \ + tpfio.h \ + unistd.h \ + unix.h \ + arpa/inet.h \ + kernel/OS.h \ + net/errno.h \ + netinet/in.h \ + netinet/sctp.h \ + netinet/sctp_uio.h \ + sys/file.h \ + sys/ioctl.h \ + sys/mman.h \ + sys/poll.h \ + sys/resource.h \ + sys/select.h \ + sys/sem.h \ + sys/sendfile.h \ + sys/signal.h \ + sys/socket.h \ + sys/sockio.h \ + sys/stat.h \ + sys/sysctl.h \ + sys/syslimits.h \ + sys/time.h \ + sys/types.h \ + sys/uio.h \ + sys/un.h \ + sys/wait.h +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 +$as_echo_n "checking $ac_header usability... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 +$as_echo_n "checking $ac_header presence... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + + ;; +esac +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + +fi +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + +for aprt_i in alloca.h \ + ByteOrder.h \ + conio.h \ + crypt.h \ + ctype.h \ + dir.h \ + dirent.h \ + dl.h \ + dlfcn.h \ + errno.h \ + fcntl.h \ + grp.h \ + io.h \ + limits.h \ + mach-o/dyld.h \ + malloc.h \ + memory.h \ + netdb.h \ + osreldate.h \ + poll.h \ + process.h \ + pwd.h \ + semaphore.h \ + signal.h \ + stdarg.h \ + stddef.h \ + stdio.h \ + stdlib.h \ + string.h \ + strings.h \ + sysapi.h \ + sysgtime.h \ + termios.h \ + time.h \ + tpfeq.h \ + tpfio.h \ + unistd.h \ + unix.h \ + arpa/inet.h \ + kernel/OS.h \ + net/errno.h \ + netinet/in.h \ + netinet/sctp.h \ + netinet/sctp_uio.h \ + sys/file.h \ + sys/ioctl.h \ + sys/mman.h \ + sys/poll.h \ + sys/resource.h \ + sys/select.h \ + sys/sem.h \ + sys/sendfile.h \ + sys/signal.h \ + sys/socket.h \ + sys/sockio.h \ + sys/stat.h \ + sys/sysctl.h \ + sys/syslimits.h \ + sys/time.h \ + sys/types.h \ + sys/uio.h \ + sys/un.h \ + sys/wait.h +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 "$aprt_2=1" + else + eval "$aprt_2=0" + fi +done + + +# IRIX 6.5 has a problem in which prevents it from +# being included by itself. Check for manually, +# including another header file first. +{ $as_echo "$as_me:$LINENO: checking for netinet/tcp.h" >&5 +$as_echo_n "checking for netinet/tcp.h... " >&6; } +if test "${apr_cv_hdr_netinet_tcp_h+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef HAVE_NETINET_IN_H +#include +#endif +#include + +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + apr_cv_hdr_netinet_tcp_h=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + apr_cv_hdr_netinet_tcp_h=no +fi + +rm -f conftest.err conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $apr_cv_hdr_netinet_tcp_h" >&5 +$as_echo "$apr_cv_hdr_netinet_tcp_h" >&6; } +if test "$apr_cv_hdr_netinet_tcp_h" = "yes"; then + netinet_tcph=1 + +cat >>confdefs.h <<\_ACEOF +#define HAVE_NETINET_TCP_H 1 +_ACEOF + +else + netinet_tcph=0 +fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +# Checking for h_errno in +if test "$netdbh" = "1"; then + + { $as_echo "$as_me:$LINENO: checking for h_errno in netdb.h" >&5 +$as_echo_n "checking for h_errno in netdb.h... " >&6; } + if test "${ac_cv_h_errno_cppflags+set}" = set; then + $as_echo_n "(cached) " >&6 +else + + + if test x != x; then + CPPFLAGS="-D $CPPFLAGS" + fi + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_NETDB_H +#include +#endif + +int +main () +{ + +int h_e = h_errno; + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + + if test x != x; then + ac_cv_h_errno_cppflags="" + else + ac_cv_h_errno_cppflags=yes + fi + +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + + ac_cv_h_errno_cppflags=no + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + if test "$ac_cv_h_errno_cppflags" = "no"; then + ac_save="$CPPFLAGS" + for flag in _XOPEN_SOURCE_EXTENDED; do + + if test x$flag != x; then + CPPFLAGS="-D$flag $CPPFLAGS" + fi + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_NETDB_H +#include +#endif + +int +main () +{ + +int h_e = h_errno; + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + + if test x$flag != x; then + ac_cv_h_errno_cppflags="$flag" + else + ac_cv_h_errno_cppflags=yes + fi + +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + + ac_cv_h_errno_cppflags=no + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + if test "$ac_cv_h_errno_cppflags" != "no"; then + break + fi + done + CPPFLAGS="$ac_save" + fi + +fi + + if test "$ac_cv_h_errno_cppflags" != "no"; then + if test "$ac_cv_h_errno_cppflags" != "yes"; then + CPPFLAGS="-D$ac_cv_h_errno_cppflags $CPPFLAGS" + { $as_echo "$as_me:$LINENO: result: yes, with -D$ac_cv_h_errno_cppflags" >&5 +$as_echo "yes, with -D$ac_cv_h_errno_cppflags" >&6; } + else + { $as_echo "$as_me:$LINENO: result: $ac_cv_h_errno_cppflags" >&5 +$as_echo "$ac_cv_h_errno_cppflags" >&6; } + fi + else + { $as_echo "$as_me:$LINENO: result: $ac_cv_h_errno_cppflags" >&5 +$as_echo "$ac_cv_h_errno_cppflags" >&6; } + fi + + if test "$ac_cv_h_errno_cflags" = "no"; then + { { $as_echo "$as_me:$LINENO: error: can not find h_errno in netdb.h" >&5 +$as_echo "$as_me: error: can not find h_errno in netdb.h" >&2;} + { (exit 1); exit 1; }; } + fi +fi + +{ $as_echo "$as_me:$LINENO: checking for off_t" >&5 +$as_echo_n "checking for off_t... " >&6; } +if test "${ac_cv_type_off_t+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_type_off_t=no +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if (sizeof (off_t)) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if (sizeof ((off_t))) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_type_off_t=yes +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_off_t" >&5 +$as_echo "$ac_cv_type_off_t" >&6; } +if test "x$ac_cv_type_off_t" = x""yes; then + : +else + +cat >>confdefs.h <<_ACEOF +#define off_t long int +_ACEOF + +fi + +{ $as_echo "$as_me:$LINENO: checking for pid_t" >&5 +$as_echo_n "checking for pid_t... " >&6; } +if test "${ac_cv_type_pid_t+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_type_pid_t=no +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if (sizeof (pid_t)) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if (sizeof ((pid_t))) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_type_pid_t=yes +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_pid_t" >&5 +$as_echo "$ac_cv_type_pid_t" >&6; } +if test "x$ac_cv_type_pid_t" = x""yes; then + : +else + +cat >>confdefs.h <<_ACEOF +#define pid_t int +_ACEOF + +fi + +{ $as_echo "$as_me:$LINENO: checking for size_t" >&5 +$as_echo_n "checking for size_t... " >&6; } +if test "${ac_cv_type_size_t+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_type_size_t=no +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if (sizeof (size_t)) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if (sizeof ((size_t))) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_type_size_t=yes +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5 +$as_echo "$ac_cv_type_size_t" >&6; } +if test "x$ac_cv_type_size_t" = x""yes; then + : +else + +cat >>confdefs.h <<_ACEOF +#define size_t unsigned int +_ACEOF + +fi + +{ $as_echo "$as_me:$LINENO: checking for uid_t in sys/types.h" >&5 +$as_echo_n "checking for uid_t in sys/types.h... " >&6; } +if test "${ac_cv_type_uid_t+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "uid_t" >/dev/null 2>&1; then + ac_cv_type_uid_t=yes +else + ac_cv_type_uid_t=no +fi +rm -f conftest* + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_uid_t" >&5 +$as_echo "$ac_cv_type_uid_t" >&6; } +if test $ac_cv_type_uid_t = no; then + +cat >>confdefs.h <<\_ACEOF +#define uid_t int +_ACEOF + + +cat >>confdefs.h <<\_ACEOF +#define gid_t int +_ACEOF + +fi + +{ $as_echo "$as_me:$LINENO: checking for ssize_t" >&5 +$as_echo_n "checking for ssize_t... " >&6; } +if test "${ac_cv_type_ssize_t+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_type_ssize_t=no +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if (sizeof (ssize_t)) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if (sizeof ((ssize_t))) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_type_ssize_t=yes +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_ssize_t" >&5 +$as_echo "$ac_cv_type_ssize_t" >&6; } +if test "x$ac_cv_type_ssize_t" = x""yes; then + : +else + +cat >>confdefs.h <<_ACEOF +#define ssize_t int +_ACEOF + +fi + +{ $as_echo "$as_me:$LINENO: checking for inline" >&5 +$as_echo_n "checking for inline... " >&6; } +if test "${ac_cv_c_inline+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_c_inline=no +for ac_kw in inline __inline__ __inline; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifndef __cplusplus +typedef int foo_t; +static $ac_kw foo_t static_foo () {return 0; } +$ac_kw foo_t foo () {return 0; } +#endif + +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_c_inline=$ac_kw +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + test "$ac_cv_c_inline" != no && break +done + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_inline" >&5 +$as_echo "$ac_cv_c_inline" >&6; } + + +case $ac_cv_c_inline in + inline | yes) ;; + *) + case $ac_cv_c_inline in + no) ac_val=;; + *) ac_val=$ac_cv_c_inline;; + esac + cat >>confdefs.h <<_ACEOF +#ifndef __cplusplus +#define inline $ac_val +#endif +_ACEOF + ;; +esac + +{ $as_echo "$as_me:$LINENO: checking for an ANSI C-conforming const" >&5 +$as_echo_n "checking for an ANSI C-conforming const... " >&6; } +if test "${ac_cv_c_const+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +/* FIXME: Include the comments suggested by Paul. */ +#ifndef __cplusplus + /* Ultrix mips cc rejects this. */ + typedef int charset[2]; + const charset cs; + /* 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}; + /* AIX XL C 1.02.0.0 rejects this. + It does not let you subtract one const X* pointer from another in + an arm of an if-expression whose if-part is not a constant + expression */ + const char *g = "string"; + 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. */ + char *t; + 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; + } + { /* AIX XL C 1.02.0.0 rejects this saying + "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ + struct s { int j; const int *ap[3]; }; + struct s *b; b->j = 5; + } + { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ + const int foo = 10; + if (!foo) return 0; + } + return !cs[0] && !zero.x; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_c_const=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_c_const=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_c_const" >&5 +$as_echo "$ac_cv_c_const" >&6; } +if test $ac_cv_c_const = no; then + +cat >>confdefs.h <<\_ACEOF +#define const /**/ +_ACEOF + +fi + +{ $as_echo "$as_me:$LINENO: checking for size_t" >&5 +$as_echo_n "checking for size_t... " >&6; } +if test "${ac_cv_type_size_t+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_cv_type_size_t=no +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if (sizeof (size_t)) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if (sizeof ((size_t))) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + : +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_type_size_t=yes +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_type_size_t" >&5 +$as_echo "$ac_cv_type_size_t" >&6; } +if test "x$ac_cv_type_size_t" = x""yes; then + : +else + +cat >>confdefs.h <<_ACEOF +#define size_t unsigned int +_ACEOF + +fi + +{ $as_echo "$as_me:$LINENO: checking whether setpgrp takes no argument" >&5 +$as_echo_n "checking whether setpgrp takes no argument... " >&6; } +if test "${ac_cv_func_setpgrp_void+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then + { { $as_echo "$as_me:$LINENO: error: cannot check setpgrp when cross compiling" >&5 +$as_echo "$as_me: error: cannot check setpgrp when cross compiling" >&2;} + { (exit 1); exit 1; }; } +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +/* If this system has a BSD-style setpgrp which takes arguments, + setpgrp(1, 1) will fail with ESRCH and return -1, in that case + exit successfully. */ + return setpgrp (1,1) != -1; + ; + return 0; +} +_ACEOF +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_setpgrp_void=no +else + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_func_setpgrp_void=yes +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_setpgrp_void" >&5 +$as_echo "$ac_cv_func_setpgrp_void" >&6; } +if test $ac_cv_func_setpgrp_void = yes; then + +cat >>confdefs.h <<\_ACEOF +#define SETPGRP_VOID 1 +_ACEOF + +fi + + + +{ $as_echo "$as_me:$LINENO: checking for socklen_t" >&5 +$as_echo_n "checking for socklen_t... " >&6; } +if test "${ac_cv_socklen_t+set}" = set; then + $as_echo_n "(cached) " >&6 +else + +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif + +int +main () +{ + +socklen_t foo = (socklen_t) 0; + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + + ac_cv_socklen_t=yes + +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + + ac_cv_socklen_t=no + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_socklen_t" >&5 +$as_echo "$ac_cv_socklen_t" >&6; } + +if test "$ac_cv_socklen_t" = "yes"; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_SOCKLEN_T 1 +_ACEOF + +fi + + + + { $as_echo "$as_me:$LINENO: checking whether system defines INADDR_NONE" >&5 +$as_echo_n "checking whether system defines INADDR_NONE... " >&6; } +if test "${ac_cv_inaddr_none+set}" = set; then + $as_echo_n "(cached) " >&6 +else + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_ARPA_INET_H +#include +#endif + +int +main () +{ + +unsigned long foo = INADDR_NONE; + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + + ac_cv_inaddr_none=yes + +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + + ac_cv_inaddr_none=no + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_inaddr_none" >&5 +$as_echo "$ac_cv_inaddr_none" >&6; } + if test "$ac_cv_inaddr_none" = "no"; then + apr_inaddr_none="((unsigned int) 0xffffffff)" + else + apr_inaddr_none="INADDR_NONE" + fi + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:$LINENO: checking size of void*" >&5 +$as_echo_n "checking size of void*... " >&6; } +if test "${ac_cv_sizeof_voidp+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (void*))) >= 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_lo=0 ac_mid=0 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (void*))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=$ac_mid; break +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo=`expr $ac_mid + 1` + if test $ac_lo -le $ac_mid; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid + 1` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (void*))) < 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=-1 ac_mid=-1 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (void*))) >= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_lo=$ac_mid; break +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_hi=`expr '(' $ac_mid ')' - 1` + if test $ac_mid -le $ac_hi; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo= ac_hi= +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +# Binary search between lo and hi bounds. +while test "x$ac_lo" != "x$ac_hi"; do + ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (void*))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=$ac_mid +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo=`expr '(' $ac_mid ')' + 1` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done +case $ac_lo in +?*) ac_cv_sizeof_voidp=$ac_lo;; +'') if test "$ac_cv_type_voidp" = yes; then + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute sizeof (void*) +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute sizeof (void*) +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } + else + ac_cv_sizeof_voidp=0 + fi ;; +esac +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +static long int longval () { return (long int) (sizeof (void*)); } +static unsigned long int ulongval () { return (long int) (sizeof (void*)); } +#include +#include +int +main () +{ + + FILE *f = fopen ("conftest.val", "w"); + if (! f) + return 1; + if (((long int) (sizeof (void*))) < 0) + { + long int i = longval (); + if (i != ((long int) (sizeof (void*)))) + return 1; + fprintf (f, "%ld", i); + } + else + { + unsigned long int i = ulongval (); + if (i != ((long int) (sizeof (void*)))) + return 1; + fprintf (f, "%lu", i); + } + /* Do not output a trailing newline, as this causes \r\n confusion + on some platforms. */ + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_sizeof_voidp=`cat conftest.val` +else + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +if test "$ac_cv_type_voidp" = yes; then + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute sizeof (void*) +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute sizeof (void*) +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } + else + ac_cv_sizeof_voidp=0 + fi +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +rm -f conftest.val +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_sizeof_voidp" >&5 +$as_echo "$ac_cv_sizeof_voidp" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_VOIDP $ac_cv_sizeof_voidp +_ACEOF + + + +if test "x$ac_cv_sizeof_voidp" != "x"; then + voidp_size=$ac_cv_sizeof_voidp +else + { { $as_echo "$as_me:$LINENO: error: Cannot determine size of void*" >&5 +$as_echo "$as_me: error: Cannot determine size of void*" >&2;} + { (exit 1); exit 1; }; } +fi + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:$LINENO: checking size of char" >&5 +$as_echo_n "checking size of char... " >&6; } +if test "${ac_cv_sizeof_char+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (char))) >= 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_lo=0 ac_mid=0 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (char))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=$ac_mid; break +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo=`expr $ac_mid + 1` + if test $ac_lo -le $ac_mid; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid + 1` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (char))) < 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=-1 ac_mid=-1 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (char))) >= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_lo=$ac_mid; break +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_hi=`expr '(' $ac_mid ')' - 1` + if test $ac_mid -le $ac_hi; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo= ac_hi= +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +# Binary search between lo and hi bounds. +while test "x$ac_lo" != "x$ac_hi"; do + ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (char))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=$ac_mid +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo=`expr '(' $ac_mid ')' + 1` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done +case $ac_lo in +?*) ac_cv_sizeof_char=$ac_lo;; +'') if test "$ac_cv_type_char" = yes; then + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute sizeof (char) +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute sizeof (char) +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } + else + ac_cv_sizeof_char=0 + fi ;; +esac +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +static long int longval () { return (long int) (sizeof (char)); } +static unsigned long int ulongval () { return (long int) (sizeof (char)); } +#include +#include +int +main () +{ + + FILE *f = fopen ("conftest.val", "w"); + if (! f) + return 1; + if (((long int) (sizeof (char))) < 0) + { + long int i = longval (); + if (i != ((long int) (sizeof (char)))) + return 1; + fprintf (f, "%ld", i); + } + else + { + unsigned long int i = ulongval (); + if (i != ((long int) (sizeof (char)))) + return 1; + fprintf (f, "%lu", i); + } + /* Do not output a trailing newline, as this causes \r\n confusion + on some platforms. */ + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_sizeof_char=`cat conftest.val` +else + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +if test "$ac_cv_type_char" = yes; then + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute sizeof (char) +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute sizeof (char) +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } + else + ac_cv_sizeof_char=0 + fi +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +rm -f conftest.val +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_sizeof_char" >&5 +$as_echo "$ac_cv_sizeof_char" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_CHAR $ac_cv_sizeof_char +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:$LINENO: checking size of int" >&5 +$as_echo_n "checking size of int... " >&6; } +if test "${ac_cv_sizeof_int+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (int))) >= 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_lo=0 ac_mid=0 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (int))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=$ac_mid; break +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo=`expr $ac_mid + 1` + if test $ac_lo -le $ac_mid; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid + 1` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (int))) < 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=-1 ac_mid=-1 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (int))) >= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_lo=$ac_mid; break +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_hi=`expr '(' $ac_mid ')' - 1` + if test $ac_mid -le $ac_hi; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo= ac_hi= +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +# Binary search between lo and hi bounds. +while test "x$ac_lo" != "x$ac_hi"; do + ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (int))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=$ac_mid +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo=`expr '(' $ac_mid ')' + 1` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done +case $ac_lo in +?*) ac_cv_sizeof_int=$ac_lo;; +'') if test "$ac_cv_type_int" = yes; then + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute sizeof (int) +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute sizeof (int) +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } + else + ac_cv_sizeof_int=0 + fi ;; +esac +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +static long int longval () { return (long int) (sizeof (int)); } +static unsigned long int ulongval () { return (long int) (sizeof (int)); } +#include +#include +int +main () +{ + + FILE *f = fopen ("conftest.val", "w"); + if (! f) + return 1; + if (((long int) (sizeof (int))) < 0) + { + long int i = longval (); + if (i != ((long int) (sizeof (int)))) + return 1; + fprintf (f, "%ld", i); + } + else + { + unsigned long int i = ulongval (); + if (i != ((long int) (sizeof (int)))) + return 1; + fprintf (f, "%lu", i); + } + /* Do not output a trailing newline, as this causes \r\n confusion + on some platforms. */ + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_sizeof_int=`cat conftest.val` +else + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +if test "$ac_cv_type_int" = yes; then + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute sizeof (int) +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute sizeof (int) +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } + else + ac_cv_sizeof_int=0 + fi +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +rm -f conftest.val +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_sizeof_int" >&5 +$as_echo "$ac_cv_sizeof_int" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_INT $ac_cv_sizeof_int +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:$LINENO: checking size of long" >&5 +$as_echo_n "checking size of long... " >&6; } +if test "${ac_cv_sizeof_long+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (long))) >= 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_lo=0 ac_mid=0 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (long))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=$ac_mid; break +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo=`expr $ac_mid + 1` + if test $ac_lo -le $ac_mid; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid + 1` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (long))) < 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=-1 ac_mid=-1 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (long))) >= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_lo=$ac_mid; break +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_hi=`expr '(' $ac_mid ')' - 1` + if test $ac_mid -le $ac_hi; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo= ac_hi= +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +# Binary search between lo and hi bounds. +while test "x$ac_lo" != "x$ac_hi"; do + ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (long))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=$ac_mid +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo=`expr '(' $ac_mid ')' + 1` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done +case $ac_lo in +?*) ac_cv_sizeof_long=$ac_lo;; +'') if test "$ac_cv_type_long" = yes; then + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute sizeof (long) +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute sizeof (long) +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } + else + ac_cv_sizeof_long=0 + fi ;; +esac +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +static long int longval () { return (long int) (sizeof (long)); } +static unsigned long int ulongval () { return (long int) (sizeof (long)); } +#include +#include +int +main () +{ + + FILE *f = fopen ("conftest.val", "w"); + if (! f) + return 1; + if (((long int) (sizeof (long))) < 0) + { + long int i = longval (); + if (i != ((long int) (sizeof (long)))) + return 1; + fprintf (f, "%ld", i); + } + else + { + unsigned long int i = ulongval (); + if (i != ((long int) (sizeof (long)))) + return 1; + fprintf (f, "%lu", i); + } + /* Do not output a trailing newline, as this causes \r\n confusion + on some platforms. */ + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_sizeof_long=`cat conftest.val` +else + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +if test "$ac_cv_type_long" = yes; then + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute sizeof (long) +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute sizeof (long) +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } + else + ac_cv_sizeof_long=0 + fi +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +rm -f conftest.val +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_sizeof_long" >&5 +$as_echo "$ac_cv_sizeof_long" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_LONG $ac_cv_sizeof_long +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:$LINENO: checking size of short" >&5 +$as_echo_n "checking size of short... " >&6; } +if test "${ac_cv_sizeof_short+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (short))) >= 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_lo=0 ac_mid=0 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (short))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=$ac_mid; break +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo=`expr $ac_mid + 1` + if test $ac_lo -le $ac_mid; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid + 1` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (short))) < 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=-1 ac_mid=-1 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (short))) >= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_lo=$ac_mid; break +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_hi=`expr '(' $ac_mid ')' - 1` + if test $ac_mid -le $ac_hi; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo= ac_hi= +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +# Binary search between lo and hi bounds. +while test "x$ac_lo" != "x$ac_hi"; do + ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (short))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=$ac_mid +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo=`expr '(' $ac_mid ')' + 1` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done +case $ac_lo in +?*) ac_cv_sizeof_short=$ac_lo;; +'') if test "$ac_cv_type_short" = yes; then + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute sizeof (short) +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute sizeof (short) +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } + else + ac_cv_sizeof_short=0 + fi ;; +esac +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +static long int longval () { return (long int) (sizeof (short)); } +static unsigned long int ulongval () { return (long int) (sizeof (short)); } +#include +#include +int +main () +{ + + FILE *f = fopen ("conftest.val", "w"); + if (! f) + return 1; + if (((long int) (sizeof (short))) < 0) + { + long int i = longval (); + if (i != ((long int) (sizeof (short)))) + return 1; + fprintf (f, "%ld", i); + } + else + { + unsigned long int i = ulongval (); + if (i != ((long int) (sizeof (short)))) + return 1; + fprintf (f, "%lu", i); + } + /* Do not output a trailing newline, as this causes \r\n confusion + on some platforms. */ + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_sizeof_short=`cat conftest.val` +else + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +if test "$ac_cv_type_short" = yes; then + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute sizeof (short) +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute sizeof (short) +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } + else + ac_cv_sizeof_short=0 + fi +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +rm -f conftest.val +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_sizeof_short" >&5 +$as_echo "$ac_cv_sizeof_short" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_SHORT $ac_cv_sizeof_short +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:$LINENO: checking size of long double" >&5 +$as_echo_n "checking size of long double... " >&6; } +if test "${ac_cv_sizeof_long_double+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (long double))) >= 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_lo=0 ac_mid=0 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (long double))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=$ac_mid; break +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo=`expr $ac_mid + 1` + if test $ac_lo -le $ac_mid; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid + 1` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (long double))) < 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=-1 ac_mid=-1 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (long double))) >= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_lo=$ac_mid; break +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_hi=`expr '(' $ac_mid ')' - 1` + if test $ac_mid -le $ac_hi; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo= ac_hi= +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +# Binary search between lo and hi bounds. +while test "x$ac_lo" != "x$ac_hi"; do + ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (long double))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=$ac_mid +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo=`expr '(' $ac_mid ')' + 1` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done +case $ac_lo in +?*) ac_cv_sizeof_long_double=$ac_lo;; +'') if test "$ac_cv_type_long_double" = yes; then + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute sizeof (long double) +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute sizeof (long double) +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } + else + ac_cv_sizeof_long_double=0 + fi ;; +esac +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +static long int longval () { return (long int) (sizeof (long double)); } +static unsigned long int ulongval () { return (long int) (sizeof (long double)); } +#include +#include +int +main () +{ + + FILE *f = fopen ("conftest.val", "w"); + if (! f) + return 1; + if (((long int) (sizeof (long double))) < 0) + { + long int i = longval (); + if (i != ((long int) (sizeof (long double)))) + return 1; + fprintf (f, "%ld", i); + } + else + { + unsigned long int i = ulongval (); + if (i != ((long int) (sizeof (long double)))) + return 1; + fprintf (f, "%lu", i); + } + /* Do not output a trailing newline, as this causes \r\n confusion + on some platforms. */ + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_sizeof_long_double=`cat conftest.val` +else + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +if test "$ac_cv_type_long_double" = yes; then + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute sizeof (long double) +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute sizeof (long double) +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } + else + ac_cv_sizeof_long_double=0 + fi +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +rm -f conftest.val +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_sizeof_long_double" >&5 +$as_echo "$ac_cv_sizeof_long_double" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_LONG_DOUBLE $ac_cv_sizeof_long_double +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:$LINENO: checking size of long long" >&5 +$as_echo_n "checking size of long long... " >&6; } +if test "${ac_cv_sizeof_long_long+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (long long))) >= 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_lo=0 ac_mid=0 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (long long))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=$ac_mid; break +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo=`expr $ac_mid + 1` + if test $ac_lo -le $ac_mid; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid + 1` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (long long))) < 0)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=-1 ac_mid=-1 + while :; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (long long))) >= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_lo=$ac_mid; break +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_hi=`expr '(' $ac_mid ')' - 1` + if test $ac_mid -le $ac_hi; then + ac_lo= ac_hi= + break + fi + ac_mid=`expr 2 '*' $ac_mid` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo= ac_hi= +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +# Binary search between lo and hi bounds. +while test "x$ac_lo" != "x$ac_hi"; do + ac_mid=`expr '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo` + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +static int test_array [1 - 2 * !(((long int) (sizeof (long long))) <= $ac_mid)]; +test_array [0] = 0 + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_hi=$ac_mid +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_lo=`expr '(' $ac_mid ')' + 1` +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done +case $ac_lo in +?*) ac_cv_sizeof_long_long=$ac_lo;; +'') if test "$ac_cv_type_long_long" = yes; then + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute sizeof (long long) +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute sizeof (long long) +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } + else + ac_cv_sizeof_long_long=0 + fi ;; +esac +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +static long int longval () { return (long int) (sizeof (long long)); } +static unsigned long int ulongval () { return (long int) (sizeof (long long)); } +#include +#include +int +main () +{ + + FILE *f = fopen ("conftest.val", "w"); + if (! f) + return 1; + if (((long int) (sizeof (long long))) < 0) + { + long int i = longval (); + if (i != ((long int) (sizeof (long long)))) + return 1; + fprintf (f, "%ld", i); + } + else + { + unsigned long int i = ulongval (); + if (i != ((long int) (sizeof (long long)))) + return 1; + fprintf (f, "%lu", i); + } + /* Do not output a trailing newline, as this causes \r\n confusion + on some platforms. */ + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_sizeof_long_long=`cat conftest.val` +else + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +if test "$ac_cv_type_long_long" = yes; then + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot compute sizeof (long long) +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot compute sizeof (long long) +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; }; } + else + ac_cv_sizeof_long_long=0 + fi +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +rm -f conftest.val +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_sizeof_long_long" >&5 +$as_echo "$ac_cv_sizeof_long_long" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_LONG_LONG $ac_cv_sizeof_long_long +_ACEOF + + + +if test "$ac_cv_sizeof_short" = "2"; then + short_value=short +fi +if test "$ac_cv_sizeof_int" = "4"; then + int_value=int +fi +# Now we need to find what apr_int64_t (sizeof == 8) will be. +# The first match is our preference. +if test "$ac_cv_sizeof_int" = "8"; then + int64_literal='#define APR_INT64_C(val) (val)' + int64_t_fmt='#define APR_INT64_T_FMT "d"' + int64_t_fmt_len='#define APR_INT64_T_FMT_LEN 1' + uint64_t_fmt='#define APR_UINT64_T_FMT "u"' + uint64_t_fmt_len='#define APR_UINT64_T_FMT_LEN 1' + uint64_t_hex_fmt='#define APR_UINT64_T_HEX_FMT "x"' + int64_value="int" + long_value=int + int64_strfn="strtoi" +elif test "$ac_cv_sizeof_long" = "8"; then + int64_literal='#define APR_INT64_C(val) (val##L)' + int64_t_fmt='#define APR_INT64_T_FMT "ld"' + int64_t_fmt_len='#define APR_INT64_T_FMT_LEN 2' + uint64_t_fmt='#define APR_UINT64_T_FMT "lu"' + uint64_t_fmt_len='#define APR_UINT64_T_FMT_LEN 2' + uint64_t_hex_fmt='#define APR_UINT64_T_HEX_FMT "lx"' + int64_value="long" + long_value=long + int64_strfn="strtol" +elif test "$ac_cv_sizeof_long_long" = "8"; then + int64_literal='#define APR_INT64_C(val) (val##LL)' + # Linux, Solaris, FreeBSD all support ll with printf. + # BSD 4.4 originated 'q'. Solaris is more popular and + # doesn't support 'q'. Solaris wins. Exceptions can + # go to the OS-dependent section. + int64_t_fmt='#define APR_INT64_T_FMT "lld"' + int64_t_fmt_len='#define APR_INT64_T_FMT_LEN 3' + uint64_t_fmt='#define APR_UINT64_T_FMT "llu"' + uint64_t_fmt_len='#define APR_UINT64_T_FMT_LEN 3' + uint64_t_hex_fmt='#define APR_UINT64_T_HEX_FMT "llx"' + int64_value="long long" + long_value="long long" + int64_strfn="strtoll" +elif test "$ac_cv_sizeof_long_double" = "8"; then + int64_literal='#define APR_INT64_C(val) (val##LD)' + int64_t_fmt='#define APR_INT64_T_FMT "Ld"' + int64_t_fmt_len='#define APR_INT64_T_FMT_LEN 2' + uint64_t_fmt='#define APR_UINT64_T_FMT "Lu"' + uint64_t_fmt_len='#define APR_UINT64_T_FMT_LEN 2' + uint64_t_hex_fmt='#define APR_UINT64_T_HEX_FMT "Lx"' + int64_value="long double" + long_value="long double" + int64_strfn="strtoll" +elif test "$ac_cv_sizeof_longlong" = "8"; then + int64_literal='#define APR_INT64_C(val) (val##LL)' + int64_t_fmt='#define APR_INT64_T_FMT "qd"' + int64_t_fmt_len='#define APR_INT64_T_FMT_LEN 2' + uint64_t_fmt='#define APR_UINT64_T_FMT "qu"' + uint64_t_fmt_len='#define APR_UINT64_T_FMT_LEN 2' + uint64_t_hex_fmt='#define APR_UINT64_T_HEX_FMT "qx"' + int64_value="__int64" + long_value="__int64" + int64_strfn="strtoll" +else + # int64_literal may be overriden if your compiler thinks you have + # a 64-bit value but APR does not agree. + int64_literal='#error Can not determine the proper size for apr_int64_t' + int64_t_fmt='#error Can not determine the proper size for apr_int64_t' + int64_t_fmt_len='#error Can not determine the proper size for apr_int64_t' + uint64_t_fmt='#error Can not determine the proper size for apr_int64_t' + uint64_t_fmt_len='#error Can not determine the proper size for apr_int64_t' + uint64_t_hex_fmt='#error Can not determine the proper size for apr_uint64_t' +fi + +# If present, allow the C99 macro INT64_C to override our conversion. +# +# HP-UX's ANSI C compiler provides this without any includes, so we +# will first look for INT64_C without adding stdint.h +{ $as_echo "$as_me:$LINENO: checking for INT64_C" >&5 +$as_echo_n "checking for INT64_C... " >&6; } +if test "${apr_cv_define_INT64_C+set}" = set; then + $as_echo_n "(cached) " >&6 +else + +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef INT64_C +YES_IS_DEFINED +#endif +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "YES_IS_DEFINED" >/dev/null 2>&1; then + apr_cv_define_INT64_C=yes +else + + # Now check for INT64_C in stdint.h + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#ifdef INT64_C +YES_IS_DEFINED +#endif +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "YES_IS_DEFINED" >/dev/null 2>&1; then + apr_cv_define_INT64_C=yes +else + apr_cv_define_INT64_C=no +fi +rm -f conftest* + +fi +rm -f conftest* + +fi +{ $as_echo "$as_me:$LINENO: result: $apr_cv_define_INT64_C" >&5 +$as_echo "$apr_cv_define_INT64_C" >&6; } + +if test "$apr_cv_define_INT64_C" = "yes"; then + int64_literal='#define APR_INT64_C(val) INT64_C(val)' + stdint=1 +else + stdint=0 +fi + +if test "$ac_cv_type_size_t" = "yes"; then + size_t_value="size_t" +else + size_t_value="apr_int32_t" +fi +if test "$ac_cv_type_ssize_t" = "yes"; then + ssize_t_value="ssize_t" +else + ssize_t_value="apr_int32_t" +fi +if test "$ac_cv_socklen_t" = "yes"; then + socklen_t_value="socklen_t" + case $host in + *-hp-hpux*) + if test "$ac_cv_sizeof_long" = "8"; then + # 64-bit HP-UX requires 32-bit socklens in + # kernel, but user-space declarations say + # 64-bit (socklen_t == size_t == long). + # This will result in many compile warnings, + # but we're functionally busted otherwise. + socklen_t_value="int" + fi + ;; + esac +else + socklen_t_value="int" +fi + +{ $as_echo "$as_me:$LINENO: checking size of ssize_t" >&5 +$as_echo_n "checking size of ssize_t... " >&6; } +if test "${ac_cv_sizeof_ssize_t+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then + ac_cv_sizeof_ssize_t=8 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +main() +{ + FILE *f=fopen("conftestval","w"); + if (!f) exit(1); + fprintf(f, "%d\n", sizeof(ssize_t)); + exit(0); +} +_ACEOF +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_sizeof_ssize_t=`cat conftestval` +else + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_sizeof_ssize_t=0 +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_sizeof_ssize_t" >&5 +$as_echo "$ac_cv_sizeof_ssize_t" >&6; } + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_SSIZE_T $ac_cv_sizeof_ssize_t +_ACEOF + + + +if test "$ac_cv_sizeof_ssize_t" = "$ac_cv_sizeof_int"; then + ssize_t_fmt='#define APR_SSIZE_T_FMT "d"' +elif test "$ac_cv_sizeof_ssize_t" = "$ac_cv_sizeof_long"; then + ssize_t_fmt='#define APR_SSIZE_T_FMT "ld"' +else + ssize_t_fmt='#error Can not determine the proper size for ssize_t' +fi + +{ $as_echo "$as_me:$LINENO: checking size of size_t" >&5 +$as_echo_n "checking size of size_t... " >&6; } +if test "${ac_cv_sizeof_size_t+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then + ac_cv_sizeof_size_t=8 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +main() +{ + FILE *f=fopen("conftestval","w"); + if (!f) exit(1); + fprintf(f, "%d\n", sizeof(size_t)); + exit(0); +} +_ACEOF +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_sizeof_size_t=`cat conftestval` +else + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_sizeof_size_t=0 +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_sizeof_size_t" >&5 +$as_echo "$ac_cv_sizeof_size_t" >&6; } + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_SIZE_T $ac_cv_sizeof_size_t +_ACEOF + + + +if test "$ac_cv_sizeof_size_t" = "$ac_cv_sizeof_int"; then + size_t_fmt='#define APR_SIZE_T_FMT "d"' +elif test "$ac_cv_sizeof_size_t" = "$ac_cv_sizeof_long"; then + size_t_fmt='#define APR_SIZE_T_FMT "ld"' +else + size_t_fmt='#error Can not determine the proper size for size_t' +fi + +if test "$ac_cv_type_off_t" = "yes"; then + { $as_echo "$as_me:$LINENO: checking size of off_t" >&5 +$as_echo_n "checking size of off_t... " >&6; } +if test "${ac_cv_sizeof_off_t+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then + ac_cv_sizeof_off_t=8 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +main() +{ + FILE *f=fopen("conftestval","w"); + if (!f) exit(1); + fprintf(f, "%d\n", sizeof(off_t)); + exit(0); +} +_ACEOF +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_sizeof_off_t=`cat conftestval` +else + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_sizeof_off_t=0 +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_sizeof_off_t" >&5 +$as_echo "$ac_cv_sizeof_off_t" >&6; } + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_OFF_T $ac_cv_sizeof_off_t +_ACEOF + + + { $as_echo "$as_me:$LINENO: checking which type to use for apr_off_t" >&5 +$as_echo_n "checking which type to use for apr_off_t... " >&6; } + if test "${ac_cv_sizeof_off_t}${ac_cv_sizeof_long}" = "44"; then + # Special case: off_t may change size with _FILE_OFFSET_BITS + # on 32-bit systems with LFS support. To avoid compatibility + # issues when other packages do define _FILE_OFFSET_BITS, + # hard-code apr_off_t to long. + off_t_value=long + off_t_fmt='#define APR_OFF_T_FMT "ld"' + else + off_t_value=off_t + # off_t is more commonly a long than an int; prefer that case + # where int and long are the same size. + if test "$ac_cv_sizeof_off_t" = "$ac_cv_sizeof_long"; then + off_t_fmt='#define APR_OFF_T_FMT "ld"' + elif test "$ac_cv_sizeof_off_t" = "$ac_cv_sizeof_int"; then + off_t_fmt='#define APR_OFF_T_FMT "d"' + elif test "$ac_cv_sizeof_off_t" = "$ac_cv_sizeof_long_long"; then + off_t_fmt='#define APR_OFF_T_FMT APR_INT64_T_FMT' + else + { { $as_echo "$as_me:$LINENO: error: could not determine the size of off_t" >&5 +$as_echo "$as_me: error: could not determine the size of off_t" >&2;} + { (exit 1); exit 1; }; } + fi + fi + { $as_echo "$as_me:$LINENO: result: $off_t_value" >&5 +$as_echo "$off_t_value" >&6; } + + ino_t_value=ino_t + + +{ $as_echo "$as_me:$LINENO: checking whether ino_t and unsigned long long are the same" >&5 +$as_echo_n "checking whether ino_t and unsigned long long are the same... " >&6; } +if test "${apr_cv_typematch_ino_t_unsigned_long_long+set}" = set; then + $as_echo_n "(cached) " >&6 +else + +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ + + int foo[0 - !__builtin_types_compatible_p(ino_t, unsigned long long)]; + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + apr_cv_typematch_ino_t_unsigned_long_long=yes ino_t_value="unsigned long long" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + apr_cv_typematch_ino_t_unsigned_long_long=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $apr_cv_typematch_ino_t_unsigned_long_long" >&5 +$as_echo "$apr_cv_typematch_ino_t_unsigned_long_long" >&6; } + + + +{ $as_echo "$as_me:$LINENO: checking whether ino_t and unsigned long are the same" >&5 +$as_echo_n "checking whether ino_t and unsigned long are the same... " >&6; } +if test "${apr_cv_typematch_ino_t_unsigned_long+set}" = set; then + $as_echo_n "(cached) " >&6 +else + +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ + + int foo[0 - !__builtin_types_compatible_p(ino_t, unsigned long)]; + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + apr_cv_typematch_ino_t_unsigned_long=yes ino_t_value="unsigned long" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + apr_cv_typematch_ino_t_unsigned_long=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $apr_cv_typematch_ino_t_unsigned_long" >&5 +$as_echo "$apr_cv_typematch_ino_t_unsigned_long" >&6; } + + + +{ $as_echo "$as_me:$LINENO: checking whether ino_t and unsigned int are the same" >&5 +$as_echo_n "checking whether ino_t and unsigned int are the same... " >&6; } +if test "${apr_cv_typematch_ino_t_unsigned_int+set}" = set; then + $as_echo_n "(cached) " >&6 +else + +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ + + int foo[0 - !__builtin_types_compatible_p(ino_t, unsigned int)]; + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + apr_cv_typematch_ino_t_unsigned_int=yes ino_t_value="unsigned int" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + apr_cv_typematch_ino_t_unsigned_int=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $apr_cv_typematch_ino_t_unsigned_int" >&5 +$as_echo "$apr_cv_typematch_ino_t_unsigned_int" >&6; } + + +else + off_t_value='apr_int32_t' + off_t_fmt='#define APR_OFF_T_FMT "d"' +fi + +{ $as_echo "$as_me:$LINENO: checking size of pid_t" >&5 +$as_echo_n "checking size of pid_t... " >&6; } +if test "${ac_cv_sizeof_pid_t+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then + ac_cv_sizeof_pid_t=8 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +main() +{ + FILE *f=fopen("conftestval","w"); + if (!f) exit(1); + fprintf(f, "%d\n", sizeof(pid_t)); + exit(0); +} +_ACEOF +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_sizeof_pid_t=`cat conftestval` +else + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_sizeof_pid_t=0 +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_sizeof_pid_t" >&5 +$as_echo "$ac_cv_sizeof_pid_t" >&6; } + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_PID_T $ac_cv_sizeof_pid_t +_ACEOF + + + +if test "$ac_cv_sizeof_pid_t" = "$ac_cv_sizeof_short"; then + pid_t_fmt='#define APR_PID_T_FMT "hd"' +elif test "$ac_cv_sizeof_pid_t" = "$ac_cv_sizeof_int"; then + pid_t_fmt='#define APR_PID_T_FMT "d"' +elif test "$ac_cv_sizeof_pid_t" = "$ac_cv_sizeof_long"; then + pid_t_fmt='#define APR_PID_T_FMT "ld"' +elif test "$ac_cv_sizeof_pid_t" = "$ac_cv_sizeof_long_long"; then + pid_t_fmt='#define APR_PID_T_FMT APR_INT64_T_FMT' +else + pid_t_fmt='#error Can not determine the proper size for pid_t' +fi + +# Basically, we have tried to figure out the correct format strings +# for APR types which vary between platforms, but we don't always get +# it right. If you find that we don't get it right for your platform, +# you can override our decision below. +case $host in + *linux*) + case $host in + s390*) + size_t_fmt='#define APR_SIZE_T_FMT "ld"' + ;; + esac + ;; + *os2_emx) + size_t_fmt='#define APR_SIZE_T_FMT "lu"' + ;; + *-solaris*) + pid_t_fmt='#define APR_PID_T_FMT "ld"' + ;; + *aix4*|*aix5*) + ssize_t_fmt='#define APR_SSIZE_T_FMT "ld"' + size_t_fmt='#define APR_SIZE_T_FMT "lu"' + ;; + *beos*) + ssize_t_fmt='#define APR_SSIZE_T_FMT "ld"' + size_t_fmt='#define APR_SIZE_T_FMT "ld"' + ;; + *apple-darwin*) + osver=`uname -r` + case $osver in + [0-7].*) + ssize_t_fmt='#define APR_SSIZE_T_FMT "d"' + ;; + *) + ssize_t_fmt='#define APR_SSIZE_T_FMT "ld"' + ;; + esac + size_t_fmt='#define APR_SIZE_T_FMT "lu"' + ;; +esac + + + + + + + + + + + + + + + + + + + + + + + + +for ac_func in strnicmp +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* 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 $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + have_strnicmp="1" +else + have_strnicmp="0" +fi +done + + +for ac_func in strncasecmp +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* 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 $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + have_strncasecmp="1" +else + have_strncasecmp="0" +fi +done + + +for ac_func in stricmp +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* 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 $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + have_stricmp="1" +else + have_stricmp="0" +fi +done + + +for ac_func in strcasecmp +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* 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 $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + have_strcasecmp="1" +else + have_strcasecmp="0" +fi +done + + +for ac_func in strdup +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* 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 $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + have_strdup="1" +else + have_strdup="0" +fi +done + + +for ac_func in strstr +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* 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 $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + have_strstr="1" +else + have_strstr="0" +fi +done + + +for ac_func in memchr +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* 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 $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + have_memchr="1" +else + have_memchr="0" +fi +done + + +for ac_func in $int64_strfn +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* 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 $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + have_int64_strfn="1" +else + have_int64_strfn="0" +fi +done + + +if test "$have_int64_strfn" = "0" && test "$int64_strfn" = "strtoll"; then + int64_strfn="strtoq" + +for ac_func in $int64_strfn +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* 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 $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + have_int64_strfn="1" +else + have_int64_strfn="0" +fi +done + +fi + + + + + + + + + + + +echo "${nl}Checking for DSO..." +# Check whether --enable-dso was given. +if test "${enable_dso+set}" = set; then + enableval=$enable_dso; tempdso=$enableval +else + + +for ac_func in NSLinkModule +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* 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 $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + tempdso="dyld" +else + tempdso="no" +fi +done + + if test "$tempdso" = "no"; then + { $as_echo "$as_me:$LINENO: checking for shl_load in -ldld" >&5 +$as_echo_n "checking for shl_load in -ldld... " >&6; } +if test "${ac_cv_lib_dld_shl_load+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldld $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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. */ +#ifdef __cplusplus +extern "C" +#endif +char shl_load (); +int +main () +{ +return shl_load (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_lib_dld_shl_load=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_dld_shl_load=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dld_shl_load" >&5 +$as_echo "$ac_cv_lib_dld_shl_load" >&6; } +if test "x$ac_cv_lib_dld_shl_load" = x""yes; then + tempdso="shl" + if test "x$LIBS" = "x"; then + echo " setting LIBS to \"-ldld\"" + LIBS="-ldld" + else + apr_addto_bugger="-ldld" + 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 + echo " adding \"$i\" to LIBS" + LIBS="$LIBS $i" + fi + done + fi + +else + tempdso="no" +fi + + fi + if test "$tempdso" = "no"; then + +for ac_func in dlopen +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* 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 $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + tempdso="dlfcn" +else + tempdso="no" +fi +done + + fi + if test "$tempdso" = "no"; then + { $as_echo "$as_me:$LINENO: checking for dlopen in -ldl" >&5 +$as_echo_n "checking for dlopen in -ldl... " >&6; } +if test "${ac_cv_lib_dl_dlopen+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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. */ +#ifdef __cplusplus +extern "C" +#endif +char dlopen (); +int +main () +{ +return dlopen (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_lib_dl_dlopen=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_dl_dlopen=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlopen" >&5 +$as_echo "$ac_cv_lib_dl_dlopen" >&6; } +if test "x$ac_cv_lib_dl_dlopen" = x""yes; then + tempdso="dlfcn" + if test "x$LIBS" = "x"; then + echo " setting LIBS to \"-ldl\"" + LIBS="-ldl" + else + apr_addto_bugger="-ldl" + 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 + echo " adding \"$i\" to LIBS" + LIBS="$LIBS $i" + fi + done + fi + +else + tempdso="no" +fi + + fi + if test "$tempdso" = "dlfcn"; then + # ReliantUnix has dlopen() in libc but dlsym() in libdl :( + +for ac_func in dlsym +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* 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 $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + tempdso="dlfcn" +else + tempdso="no" +fi +done + + if test "$tempdso" = "no"; then + { $as_echo "$as_me:$LINENO: checking for dlsym in -ldl" >&5 +$as_echo_n "checking for dlsym in -ldl... " >&6; } +if test "${ac_cv_lib_dl_dlsym+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ldl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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. */ +#ifdef __cplusplus +extern "C" +#endif +char dlsym (); +int +main () +{ +return dlsym (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_lib_dl_dlsym=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_dl_dlsym=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dl_dlsym" >&5 +$as_echo "$ac_cv_lib_dl_dlsym" >&6; } +if test "x$ac_cv_lib_dl_dlsym" = x""yes; then + tempdso="dlfcn" + if test "x$LIBS" = "x"; then + echo " setting LIBS to \"-ldl\"" + LIBS="-ldl" + else + apr_addto_bugger="-ldl" + 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 + echo " adding \"$i\" to LIBS" + LIBS="$LIBS $i" + fi + done + fi + +else + tempdso="no" +fi + + fi + if test "$tempdso" = "no"; then + echo "Weird: dlopen() was found but dlsym() was not found!" + fi + fi + if test "$tempdso" = "no"; then + { $as_echo "$as_me:$LINENO: checking for load_image in -lroot" >&5 +$as_echo_n "checking for load_image in -lroot... " >&6; } +if test "${ac_cv_lib_root_load_image+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lroot $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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. */ +#ifdef __cplusplus +extern "C" +#endif +char load_image (); +int +main () +{ +return load_image (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_lib_root_load_image=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_lib_root_load_image=no +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_lib_root_load_image" >&5 +$as_echo "$ac_cv_lib_root_load_image" >&6; } +if test "x$ac_cv_lib_root_load_image" = x""yes; then + tempdso="yes" +else + tempdso="no" +fi + + fi + if test "$tempdso" = "no"; then + case $host in + *os390|*-os2*|*os400) + tempdso="yes" + ;; + esac + fi + +fi + + +if test "$tempdso" = "no"; then + aprdso="0" +else + case "$tempdso" in + dlfcn) +cat >>confdefs.h <<\_ACEOF +#define DSO_USE_DLFCN 1 +_ACEOF +;; + shl) +cat >>confdefs.h <<\_ACEOF +#define DSO_USE_SHL 1 +_ACEOF +;; + dyld) +cat >>confdefs.h <<\_ACEOF +#define DSO_USE_DYLD 1 +_ACEOF +;; + esac + aprdso="1" + apr_modules="$apr_modules dso" +fi + + + +echo "${nl}Checking for Processes..." + + +for ac_func in waitpid +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* 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 $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + +# Check whether --enable-other-child was given. +if test "${enable_other_child+set}" = set; then + enableval=$enable_other_child; if test "$enableval" = "yes"; then + oc="1" + else + oc="0" + fi +else + oc=1 +fi + + + + +{ $as_echo "$as_me:$LINENO: checking for Variable Length Arrays" >&5 +$as_echo_n "checking for Variable Length Arrays... " >&6; } +if test "x$CFLAGS_WARN" = "x"; then + apr_tcnw_flags="" +else + apr_tcnw_flags=$CFLAGS_WARN +fi +if test "$ac_cv_c_compiler_gnu" = "yes"; then + apr_tcnw_flags="$apr_tcnw_flags -Werror" +fi + +cat > conftest.$ac_ext <&5 ; then + rm -rf conftest* + vla_msg=yes +else + echo "configure: failed or warning program:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + vla_msg=no +fi +rm -f conftest* + +{ $as_echo "$as_me:$LINENO: result: $vla_msg" >&5 +$as_echo "$vla_msg" >&6; } +if test "$vla_msg" = "yes"; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_VLA 1 +_ACEOF + +fi + +{ $as_echo "$as_me:$LINENO: checking struct rlimit" >&5 +$as_echo_n "checking struct rlimit... " >&6; } +if test "${ac_cv_struct_rlimit+set}" = set; then + $as_echo_n "(cached) " >&6 +else + +if test "$cross_compiling" = yes; then + + ac_cv_struct_rlimit=no +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#include +#include +main() +{ + struct rlimit limit; + limit.rlim_cur = 0; + limit.rlim_max = 0; + exit(0); +} +_ACEOF +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + + ac_cv_struct_rlimit=yes +else + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) + + ac_cv_struct_rlimit=no +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_struct_rlimit" >&5 +$as_echo "$ac_cv_struct_rlimit" >&6; } +struct_rlimit=0 +test "x$ac_cv_struct_rlimit" = xyes && struct_rlimit=1 + + +echo "${nl}Checking for Locking..." + + + + +for ac_func in semget semctl flock +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* 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 $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + +for ac_header in semaphore.h +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 +$as_echo_n "checking $ac_header usability... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 +$as_echo_n "checking $ac_header presence... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + + ;; +esac +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + +fi +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + + + +for ac_func in sem_close sem_unlink sem_post sem_wait +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* 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 $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + +# Some systems return ENOSYS from sem_open. +{ $as_echo "$as_me:$LINENO: checking for working sem_open" >&5 +$as_echo_n "checking for working sem_open... " >&6; } +if test "${ac_cv_func_sem_open+set}" = set; then + $as_echo_n "(cached) " >&6 +else + +if test "$cross_compiling" = yes; then + ac_cv_func_sem_open=no +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#include +#include +#include +main() +{ + sem_t *psem; + const char *sem_name = "/apr_autoconf"; + + if (sizeof(int) < sizeof(sem_t *)) + exit(1); + psem = sem_open(sem_name, O_CREAT, 0644, 1); + if (psem == (sem_t *)SEM_FAILED) { + exit(1); + } + sem_close(psem); + sem_unlink(sem_name); + exit(0); +} +_ACEOF +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_sem_open=yes +else + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_func_sem_open=no +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_func_sem_open" >&5 +$as_echo "$ac_cv_func_sem_open" >&6; } + +# It's stupid, but not all platforms have union semun, even those that need it. +{ $as_echo "$as_me:$LINENO: checking for union semun in sys/sem.h" >&5 +$as_echo_n "checking for union semun in sys/sem.h... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#include +#include + +int +main () +{ + +union semun arg; +semctl(0, 0, 0, arg); + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + have_union_semun="1" union_semun=yes +msg=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +have_union_semun="0" +msg=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $msg" >&5 +$as_echo "$msg" >&6; } + + + + { $as_echo "$as_me:$LINENO: checking for LOCK_EX in sys/file.h" >&5 +$as_echo_n "checking for LOCK_EX in sys/file.h... " >&6; } +if test "${ac_cv_define_LOCK_EX+set}" = set; then + $as_echo_n "(cached) " >&6 +else + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#ifdef LOCK_EX +YES_IS_DEFINED +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "YES_IS_DEFINED" >/dev/null 2>&1; then + ac_cv_define_LOCK_EX=yes +else + ac_cv_define_LOCK_EX=no +fi +rm -f conftest* + + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_define_LOCK_EX" >&5 +$as_echo "$ac_cv_define_LOCK_EX" >&6; } + if test "$ac_cv_define_LOCK_EX" = "yes"; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_LOCK_EX 1 +_ACEOF + + fi + + + { $as_echo "$as_me:$LINENO: checking for F_SETLK in fcntl.h" >&5 +$as_echo_n "checking for F_SETLK in fcntl.h... " >&6; } +if test "${ac_cv_define_F_SETLK+set}" = set; then + $as_echo_n "(cached) " >&6 +else + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#ifdef F_SETLK +YES_IS_DEFINED +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "YES_IS_DEFINED" >/dev/null 2>&1; then + ac_cv_define_F_SETLK=yes +else + ac_cv_define_F_SETLK=no +fi +rm -f conftest* + + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_define_F_SETLK" >&5 +$as_echo "$ac_cv_define_F_SETLK" >&6; } + if test "$ac_cv_define_F_SETLK" = "yes"; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_F_SETLK 1 +_ACEOF + + fi + + + { $as_echo "$as_me:$LINENO: checking for SEM_UNDO in sys/sem.h" >&5 +$as_echo_n "checking for SEM_UNDO in sys/sem.h... " >&6; } +if test "${ac_cv_define_SEM_UNDO+set}" = set; then + $as_echo_n "(cached) " >&6 +else + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#ifdef SEM_UNDO +YES_IS_DEFINED +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "YES_IS_DEFINED" >/dev/null 2>&1; then + ac_cv_define_SEM_UNDO=yes +else + ac_cv_define_SEM_UNDO=no +fi +rm -f conftest* + + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_define_SEM_UNDO" >&5 +$as_echo "$ac_cv_define_SEM_UNDO" >&6; } + if test "$ac_cv_define_SEM_UNDO" = "yes"; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_SEM_UNDO 1 +_ACEOF + + fi + + +# We are assuming that if the platform doesn't have POLLIN, it doesn't have +# any POLL definitions. + + { $as_echo "$as_me:$LINENO: checking for POLLIN in poll.h sys/poll.h" >&5 +$as_echo_n "checking for POLLIN in poll.h sys/poll.h... " >&6; } +if test "${ac_cv_define_POLLIN+set}" = set; then + $as_echo_n "(cached) " >&6 +else + + ac_cv_define_POLLIN=no + for curhdr in poll.h sys/poll.h + do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include <$curhdr> +#ifdef POLLIN +YES_IS_DEFINED +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "YES_IS_DEFINED" >/dev/null 2>&1; then + ac_cv_define_POLLIN=yes +fi +rm -f conftest* + + done + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_define_POLLIN" >&5 +$as_echo "$ac_cv_define_POLLIN" >&6; } + if test "$ac_cv_define_POLLIN" = "yes"; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_POLLIN 1 +_ACEOF + + fi + + +if test "$threads" = "1"; then + + { $as_echo "$as_me:$LINENO: checking for PTHREAD_PROCESS_SHARED in pthread.h" >&5 +$as_echo_n "checking for PTHREAD_PROCESS_SHARED in pthread.h... " >&6; } +if test "${ac_cv_define_PTHREAD_PROCESS_SHARED+set}" = set; then + $as_echo_n "(cached) " >&6 +else + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#ifdef PTHREAD_PROCESS_SHARED +YES_IS_DEFINED +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "YES_IS_DEFINED" >/dev/null 2>&1; then + ac_cv_define_PTHREAD_PROCESS_SHARED=yes +else + ac_cv_define_PTHREAD_PROCESS_SHARED=no +fi +rm -f conftest* + + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_define_PTHREAD_PROCESS_SHARED" >&5 +$as_echo "$ac_cv_define_PTHREAD_PROCESS_SHARED" >&6; } + if test "$ac_cv_define_PTHREAD_PROCESS_SHARED" = "yes"; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_PTHREAD_PROCESS_SHARED 1 +_ACEOF + + fi + + +for ac_func in pthread_mutexattr_setpshared +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* 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 $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + # Some systems have setpshared and define PROCESS_SHARED, but don't + # really support PROCESS_SHARED locks. So, we must validate that we + # can go through the steps without receiving some sort of system error. + # Linux and older versions of AIX have this problem. + ac_rc=yes +for ac_spec in header:pthread.h define:PTHREAD_PROCESS_SHARED func:pthread_mutexattr_setpshared; 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 + : + + { $as_echo "$as_me:$LINENO: checking for working PROCESS_SHARED locks" >&5 +$as_echo_n "checking for working PROCESS_SHARED locks... " >&6; } +if test "${apr_cv_process_shared_works+set}" = set; then + $as_echo_n "(cached) " >&6 +else + + if test "$cross_compiling" = yes; then + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot run test program while cross compiling +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot run test program while cross compiling +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#include + int main() + { + pthread_mutex_t mutex; + pthread_mutexattr_t attr; + if (pthread_mutexattr_init(&attr)) + exit(1); + if (pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED)) + exit(2); + if (pthread_mutex_init(&mutex, &attr)) + exit(3); + if (pthread_mutexattr_destroy(&attr)) + exit(4); + if (pthread_mutex_destroy(&mutex)) + exit(5); + exit(0); + } +_ACEOF +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + apr_cv_process_shared_works=yes +else + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +apr_cv_process_shared_works=no +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi +{ $as_echo "$as_me:$LINENO: result: $apr_cv_process_shared_works" >&5 +$as_echo "$apr_cv_process_shared_works" >&6; } + # Override detection of pthread_mutexattr_setpshared + ac_cv_func_pthread_mutexattr_setpshared=$apr_cv_process_shared_works +else + : + +fi + + + if test "$ac_cv_func_pthread_mutexattr_setpshared" = "yes"; then + +{ $as_echo "$as_me:$LINENO: checking for robust cross-process mutex support" >&5 +$as_echo_n "checking for robust cross-process mutex support... " >&6; } +if test "${apr_cv_mutex_robust_shared+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test "$cross_compiling" = yes; then + { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +{ { $as_echo "$as_me:$LINENO: error: cannot run test program while cross compiling +See \`config.log' for more details." >&5 +$as_echo "$as_me: error: cannot run test program while cross compiling +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; }; } +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#include +#include + +int main(int argc, char **argv) +{ + pthread_mutex_t mutex; + pthread_mutexattr_t attr; + + if (pthread_mutexattr_init(&attr)) + exit(1); + if (pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED)) + exit(2); + if (pthread_mutexattr_setrobust_np(&attr, PTHREAD_MUTEX_ROBUST_NP)) + exit(3); + if (pthread_mutexattr_setprotocol(&attr, PTHREAD_PRIO_INHERIT)) + exit(4); + if (pthread_mutex_init(&mutex, &attr)) + exit(5); + if (pthread_mutexattr_destroy(&attr)) + exit(6); + if (pthread_mutex_destroy(&mutex)) + exit(7); + + exit(0); +} +_ACEOF +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + apr_cv_mutex_robust_shared=yes +else + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +apr_cv_mutex_robust_shared=no +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi +{ $as_echo "$as_me:$LINENO: result: $apr_cv_mutex_robust_shared" >&5 +$as_echo "$apr_cv_mutex_robust_shared" >&6; } + +if test "$apr_cv_mutex_robust_shared" = "yes"; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_PTHREAD_MUTEX_ROBUST 1 +_ACEOF + +fi + + fi +fi + +# See which lock mechanisms we can support on this system. +ac_rc=yes +for ac_spec in header:semaphore.h func:sem_open func:sem_close func:sem_unlink func:sem_post func:sem_wait; 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 + : + hasposixser="1" +else + : + hasposixser="0" +fi + +ac_rc=yes +for ac_spec in func:semget func:semctl define:SEM_UNDO; 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 + : + hassysvser="1" +else + : + hassysvser="0" +fi + +ac_rc=yes +for ac_spec in func:flock define:LOCK_EX; 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 + : + hasflockser="1" +else + : + hasflockser="0" +fi + +ac_rc=yes +for ac_spec in header:fcntl.h define:F_SETLK; 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 + : + hasfcntlser="1" +else + : + hasfcntlser="0" +fi + +# note: the current APR use of shared mutex requires /dev/zero +ac_rc=yes +for ac_spec in header:pthread.h define:PTHREAD_PROCESS_SHARED func:pthread_mutexattr_setpshared file:/dev/zero; 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 + : + hasprocpthreadser="1" +else + : + hasprocpthreadser="0" +fi + +ac_rc=yes +for ac_spec in struct:pthread_rw; 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 + : + hasrwlockser="1" +else + : + hasrwlockser="0" +fi + + +# See which lock mechanism we'll select by default on this system. +# The last APR_DECIDE to execute sets the default. +# At this stage, we match the ordering in Apache 1.3 +# which is (highest to lowest): sysvsem -> fcntl -> flock. +# POSIX semaphores and cross-process pthread mutexes are not +# used by default since they have less desirable behaviour when +# e.g. a process holding the mutex segfaults. +ac_decision_item='apr_lock implementation method' +ac_decision_msg='FAILED' +ac_decision='' + +ac_rc=yes +for ac_spec in func:flock define:LOCK_EX; 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 + : + ac_decision='USE_FLOCK_SERIALIZE' +ac_decision_msg='4.2BSD-style flock()' +ac_decision_USE_FLOCK_SERIALIZE=yes +ac_decision_USE_FLOCK_SERIALIZE_msg='4.2BSD-style flock()' + +else + : + +fi + +ac_rc=yes +for ac_spec in header:fcntl.h define:F_SETLK; 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 + : + ac_decision='USE_FCNTL_SERIALIZE' +ac_decision_msg='SVR4-style fcntl()' +ac_decision_USE_FCNTL_SERIALIZE=yes +ac_decision_USE_FCNTL_SERIALIZE_msg='SVR4-style fcntl()' + +else + : + +fi + +ac_rc=yes +for ac_spec in func:semget func:semctl define:SEM_UNDO; 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 + : + ac_decision='USE_SYSVSEM_SERIALIZE' +ac_decision_msg='SysV IPC semget()' +ac_decision_USE_SYSVSEM_SERIALIZE=yes +ac_decision_USE_SYSVSEM_SERIALIZE_msg='SysV IPC semget()' + +else + : + +fi + +if test "x$apr_lock_method" != "x"; then + ac_decision="$apr_lock_method" +eval "ac_decision_msg=\"\$ac_decision_${ac_decision}_msg\"" + +fi +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 + cat >>confdefs.h <<_ACEOF +#define ${ac_decision_item} 1 +_ACEOF + + { $as_echo "$as_me:$LINENO: result: decision on $ac_decision_item... $ac_decision_msg" >&5 +$as_echo "decision on $ac_decision_item... $ac_decision_msg" >&6; } +fi + +cat >>confdefs.h <<_ACEOF +#define $ac_decision 1 +_ACEOF + + +flockser="0" +sysvser="0" +posixser="0" +procpthreadser="0" +fcntlser="0" +case $ac_decision in + USE_FLOCK_SERIALIZE ) + flockser="1" + ;; + USE_FCNTL_SERIALIZE ) + fcntlser="1" + ;; + USE_SYSVSEM_SERIALIZE ) + sysvser="1" + ;; + USE_POSIXSEM_SERIALIZE ) + posixser="1" + ;; + USE_PROC_PTHREAD_SERIALIZE ) + procpthreadser="1" + ;; +esac + + + + + + + + + + + + + + +{ $as_echo "$as_me:$LINENO: checking if all interprocess locks affect threads" >&5 +$as_echo_n "checking if all interprocess locks affect threads... " >&6; } +if test "x$apr_process_lock_is_global" = "xyes"; then + proclockglobal="1" + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } +else + proclockglobal="0" + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + + + +{ $as_echo "$as_me:$LINENO: checking if POSIX sems affect threads in the same process" >&5 +$as_echo_n "checking if POSIX sems affect threads in the same process... " >&6; } +if test "x$apr_posixsem_is_global" = "xyes"; then + +cat >>confdefs.h <<\_ACEOF +#define POSIXSEM_IS_GLOBAL 1 +_ACEOF + + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + +{ $as_echo "$as_me:$LINENO: checking if SysV sems affect threads in the same process" >&5 +$as_echo_n "checking if SysV sems affect threads in the same process... " >&6; } +if test "x$apr_sysvsem_is_global" = "xyes"; then + +cat >>confdefs.h <<\_ACEOF +#define SYSVSEM_IS_GLOBAL 1 +_ACEOF + + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + +{ $as_echo "$as_me:$LINENO: checking if fcntl locks affect threads in the same process" >&5 +$as_echo_n "checking if fcntl locks affect threads in the same process... " >&6; } +if test "x$apr_fcntl_is_global" = "xyes"; then + +cat >>confdefs.h <<\_ACEOF +#define FCNTL_IS_GLOBAL 1 +_ACEOF + + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + +{ $as_echo "$as_me:$LINENO: checking if flock locks affect threads in the same process" >&5 +$as_echo_n "checking if flock locks affect threads in the same process... " >&6; } +if test "x$apr_flock_is_global" = "xyes"; then + +cat >>confdefs.h <<\_ACEOF +#define FLOCK_IS_GLOBAL 1 +_ACEOF + + { $as_echo "$as_me:$LINENO: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:$LINENO: result: no" >&5 +$as_echo "no" >&6; } +fi + +{ $as_echo "$as_me:$LINENO: checking for entropy source" >&5 +$as_echo_n "checking for entropy source... " >&6; } + + +# Check whether --with-egd was given. +if test "${with_egd+set}" = set; then + withval=$with_egd; +cat >>confdefs.h <<\_ACEOF +#define HAVE_EGD 1 +_ACEOF + + if test "$withval" = "yes"; then + +cat >>confdefs.h <<_ACEOF +#define EGD_DEFAULT_SOCKET "/var/run/egd-pool","/dev/egd-pool","/etc/egd-pool","/etc/entropy" +_ACEOF + + else + cat >>confdefs.h <<_ACEOF +#define EGD_DEFAULT_SOCKET "$withval" +_ACEOF + + fi + { $as_echo "$as_me:$LINENO: result: EGD-compatible daemon" >&5 +$as_echo "EGD-compatible daemon" >&6; } + rand="1" + +fi + + +if test "$rand" != "1"; then + +# Check whether --with-devrandom was given. +if test "${with_devrandom+set}" = set; then + withval=$with_devrandom; apr_devrandom="$withval" +else + apr_devrandom="yes" +fi + + + if test "$apr_devrandom" = "yes"; then + # /dev/random on OpenBSD doesn't provide random data, so + # prefer /dev/arandom, which does; see random(4). + for f in /dev/arandom /dev/random /dev/urandom; do + if test -r $f; then + apr_devrandom=$f + rand=1 + break + fi + done + elif test "$apr_devrandom" != "no"; then + if test -r "$apr_devrandom"; then + rand="1" + else + { { $as_echo "$as_me:$LINENO: error: $apr_devrandom not found or unreadable." >&5 +$as_echo "$as_me: error: $apr_devrandom not found or unreadable." >&2;} + { (exit 1); exit 1; }; } + fi + fi + + if test "$rand" = "1"; then + +cat >>confdefs.h <<_ACEOF +#define DEV_RANDOM "$apr_devrandom" +_ACEOF + + { $as_echo "$as_me:$LINENO: result: $apr_devrandom" >&5 +$as_echo "$apr_devrandom" >&6; } + fi +fi + +if test "$rand" != "1"; then + case $host in + # we have built in support for OS/2 + *-os2*) + { $as_echo "$as_me:$LINENO: result: Using OS/2 builtin random" >&5 +$as_echo "Using OS/2 builtin random" >&6; } + rand="1" + ;; + *) + if test "$rand" != "1"; then + if test "$ac_cv_lib_truerand_main" = "yes"; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_TRUERAND 1 +_ACEOF + + { $as_echo "$as_me:$LINENO: result: truerand" >&5 +$as_echo "truerand" >&6; } + rand="1" + else + { $as_echo "$as_me:$LINENO: result: not found" >&5 +$as_echo "not found" >&6; } + rand="0" + fi + fi + ;; + esac +fi + + +echo "${nl}Checking for Time Support..." +{ $as_echo "$as_me:$LINENO: checking for tm_gmtoff in struct tm" >&5 +$as_echo_n "checking for tm_gmtoff in struct tm... " >&6; } +if test "${ac_cv_struct_tm_gmtoff+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +int +main () +{ +struct tm tm; tm.tm_gmtoff; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_struct_tm_gmtoff=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_struct_tm_gmtoff=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_struct_tm_gmtoff" >&5 +$as_echo "$ac_cv_struct_tm_gmtoff" >&6; } + +if test "$ac_cv_struct_tm_gmtoff" = "yes"; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_GMTOFF 1 +_ACEOF + +fi + +echo "${nl}Checking for Networking support..." +{ $as_echo "$as_me:$LINENO: checking for in_addr in netinet/in.h" >&5 +$as_echo_n "checking for in_addr in netinet/in.h... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#include + +int +main () +{ + +struct in_addr arg; +arg.s_addr = htonl(INADDR_ANY); + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + have_in_addr="1" +msg=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + have_in_addr="0" +msg=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $msg" >&5 +$as_echo "$msg" >&6; } + +{ $as_echo "$as_me:$LINENO: checking if fd == socket on this platform" >&5 +$as_echo_n "checking if fd == socket on this platform... " >&6; } +if test "x$file_as_socket" != "x0" ; then + file_as_socket="1"; + echo "yes" +else + echo "no" +fi + + + + +# Check the types only if we have gethostbyname_r +if test "$ac_cv_func_gethostbyname_r" = "yes"; then + + +{ $as_echo "$as_me:$LINENO: checking style of gethostbyname_r routine" >&5 +$as_echo_n "checking style of gethostbyname_r routine... " >&6; } +if test "${ac_cv_gethostbyname_r_style+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test "x$CFLAGS_WARN" = "x"; then + apr_tcnw_flags="" +else + apr_tcnw_flags=$CFLAGS_WARN +fi +if test "$ac_cv_c_compiler_gnu" = "yes"; then + apr_tcnw_flags="$apr_tcnw_flags -Werror" +fi + +cat > conftest.$ac_ext < +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_ARPA_INET_H +#include +#endif +#ifdef HAVE_NETDB_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif + +int main(int argc, const char * const *argv) { + +int tmp = gethostbyname_r((const char *) 0, (struct hostent *) 0, + (char *) 0, 0, (struct hostent **) 0, &tmp); + +; return 0; } +EOTEST + +if ${CC-cc} -c $CFLAGS $CPPFLAGS $apr_tcnw_flags conftest.$ac_ext 2>&5 ; then + rm -rf conftest* + ac_cv_gethostbyname_r_style=glibc2 +else + echo "configure: failed or warning program:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_gethostbyname_r_style=none +fi +rm -f conftest* + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_gethostbyname_r_style" >&5 +$as_echo "$ac_cv_gethostbyname_r_style" >&6; } + +if test "$ac_cv_gethostbyname_r_style" = "glibc2"; then + +cat >>confdefs.h <<\_ACEOF +#define GETHOSTBYNAME_R_GLIBC2 1 +_ACEOF + +fi + +{ $as_echo "$as_me:$LINENO: checking 3rd argument to the gethostbyname_r routines" >&5 +$as_echo_n "checking 3rd argument to the gethostbyname_r routines... " >&6; } +if test "${ac_cv_gethostbyname_r_arg+set}" = set; then + $as_echo_n "(cached) " >&6 +else + if test "x$CFLAGS_WARN" = "x"; then + apr_tcnw_flags="" +else + apr_tcnw_flags=$CFLAGS_WARN +fi +if test "$ac_cv_c_compiler_gnu" = "yes"; then + apr_tcnw_flags="$apr_tcnw_flags -Werror" +fi + +cat > conftest.$ac_ext < +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_ARPA_INET_H +#include +#endif +#ifdef HAVE_NETDB_H +#include +#endif +#ifdef HAVE_STDLIB_H +#include +#endif + +int main(int argc, const char * const *argv) { + +int tmp = gethostbyname_r((const char *) 0, (struct hostent *) 0, + (struct hostent_data *) 0); +; return 0; } +EOTEST + +if ${CC-cc} -c $CFLAGS $CPPFLAGS $apr_tcnw_flags conftest.$ac_ext 2>&5 ; then + rm -rf conftest* + ac_cv_gethostbyname_r_arg=hostent_data +else + echo "configure: failed or warning program:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_gethostbyname_r_arg=char +fi +rm -f conftest* + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_gethostbyname_r_arg" >&5 +$as_echo "$ac_cv_gethostbyname_r_arg" >&6; } + +if test "$ac_cv_gethostbyname_r_arg" = "hostent_data"; then + +cat >>confdefs.h <<\_ACEOF +#define GETHOSTBYNAME_R_HOSTENT_DATA 1 +_ACEOF + +fi + +fi + + + { $as_echo "$as_me:$LINENO: checking if TCP_NODELAY setting is inherited from listening sockets" >&5 +$as_echo_n "checking if TCP_NODELAY setting is inherited from listening sockets... " >&6; } +if test "${ac_cv_tcp_nodelay_inherited+set}" = set; then + $as_echo_n "(cached) " >&6 +else + + if test "$cross_compiling" = yes; then + + ac_cv_tcp_nodelay_inherited="yes" + +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_NETINET_TCP_H +#include +#endif +#ifndef HAVE_SOCKLEN_T +typedef int socklen_t; +#endif +int main(void) { + int listen_s, connected_s, client_s; + int listen_port, rc; + struct sockaddr_in sa; + socklen_t sa_len; + socklen_t option_len; + int option; + + listen_s = socket(AF_INET, SOCK_STREAM, 0); + if (listen_s < 0) { + perror("socket"); + exit(1); + } + option = 1; + rc = setsockopt(listen_s, IPPROTO_TCP, TCP_NODELAY, &option, sizeof option); + if (rc < 0) { + perror("setsockopt TCP_NODELAY"); + exit(1); + } + memset(&sa, 0, sizeof sa); + sa.sin_family = AF_INET; +#ifdef BEOS + sa.sin_addr.s_addr = htonl(INADDR_LOOPBACK); +#endif + /* leave port 0 to get ephemeral */ + rc = bind(listen_s, (struct sockaddr *)&sa, sizeof sa); + if (rc < 0) { + perror("bind for ephemeral port"); + exit(1); + } + /* find ephemeral port */ + sa_len = sizeof(sa); + rc = getsockname(listen_s, (struct sockaddr *)&sa, &sa_len); + if (rc < 0) { + perror("getsockname"); + exit(1); + } + listen_port = sa.sin_port; + rc = listen(listen_s, 5); + if (rc < 0) { + perror("listen"); + exit(1); + } + client_s = socket(AF_INET, SOCK_STREAM, 0); + if (client_s < 0) { + perror("socket"); + exit(1); + } + memset(&sa, 0, sizeof sa); + sa.sin_family = AF_INET; + sa.sin_port = listen_port; +#ifdef BEOS + sa.sin_addr.s_addr = htonl(INADDR_LOOPBACK); +#endif + /* leave sin_addr all zeros to use loopback */ + rc = connect(client_s, (struct sockaddr *)&sa, sizeof sa); + if (rc < 0) { + perror("connect"); + exit(1); + } + sa_len = sizeof sa; + connected_s = accept(listen_s, (struct sockaddr *)&sa, &sa_len); + if (connected_s < 0) { + perror("accept"); + exit(1); + } + option_len = sizeof option; + rc = getsockopt(connected_s, IPPROTO_TCP, TCP_NODELAY, &option, &option_len); + if (rc < 0) { + perror("getsockopt"); + exit(1); + } + if (!option) { + fprintf(stderr, "TCP_NODELAY is not set in the child.\n"); + exit(1); + } + return 0; +} + +_ACEOF +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + + ac_cv_tcp_nodelay_inherited="yes" + +else + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) + + ac_cv_tcp_nodelay_inherited="no" + +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_tcp_nodelay_inherited" >&5 +$as_echo "$ac_cv_tcp_nodelay_inherited" >&6; } +if test "$ac_cv_tcp_nodelay_inherited" = "yes"; then + tcp_nodelay_inherited=1 +else + tcp_nodelay_inherited=0 +fi + + + { $as_echo "$as_me:$LINENO: checking if O_NONBLOCK setting is inherited from listening sockets" >&5 +$as_echo_n "checking if O_NONBLOCK setting is inherited from listening sockets... " >&6; } +if test "${ac_cv_o_nonblock_inherited+set}" = set; then + $as_echo_n "(cached) " >&6 +else + + if test "$cross_compiling" = yes; then + + ac_cv_o_nonblock_inherited="yes" + +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_NETINET_TCP_H +#include +#endif +#ifndef HAVE_SOCKLEN_T +typedef int socklen_t; +#endif +#ifdef HAVE_FCNTL_H +#include +#endif +int main(void) { + int listen_s, connected_s, client_s; + int listen_port, rc; + struct sockaddr_in sa; + socklen_t sa_len; + + listen_s = socket(AF_INET, SOCK_STREAM, 0); + if (listen_s < 0) { + perror("socket"); + exit(1); + } + memset(&sa, 0, sizeof sa); + sa.sin_family = AF_INET; +#ifdef BEOS + sa.sin_addr.s_addr = htonl(INADDR_LOOPBACK); +#endif + /* leave port 0 to get ephemeral */ + rc = bind(listen_s, (struct sockaddr *)&sa, sizeof sa); + if (rc < 0) { + perror("bind for ephemeral port"); + exit(1); + } + /* find ephemeral port */ + sa_len = sizeof(sa); + rc = getsockname(listen_s, (struct sockaddr *)&sa, &sa_len); + if (rc < 0) { + perror("getsockname"); + exit(1); + } + listen_port = sa.sin_port; + rc = listen(listen_s, 5); + if (rc < 0) { + perror("listen"); + exit(1); + } + rc = fcntl(listen_s, F_SETFL, O_NONBLOCK); + if (rc < 0) { + perror("fcntl(F_SETFL)"); + exit(1); + } + client_s = socket(AF_INET, SOCK_STREAM, 0); + if (client_s < 0) { + perror("socket"); + exit(1); + } + memset(&sa, 0, sizeof sa); + sa.sin_family = AF_INET; + sa.sin_port = listen_port; +#ifdef BEOS + sa.sin_addr.s_addr = htonl(INADDR_LOOPBACK); +#endif + /* leave sin_addr all zeros to use loopback */ + rc = connect(client_s, (struct sockaddr *)&sa, sizeof sa); + if (rc < 0) { + perror("connect"); + exit(1); + } + sa_len = sizeof sa; + connected_s = accept(listen_s, (struct sockaddr *)&sa, &sa_len); + if (connected_s < 0) { + perror("accept"); + exit(1); + } + rc = fcntl(connected_s, F_GETFL, 0); + if (rc < 0) { + perror("fcntl(F_GETFL)"); + exit(1); + } + if (!(rc & O_NONBLOCK)) { + fprintf(stderr, "O_NONBLOCK is not set in the child.\n"); + exit(1); + } + return 0; +} + +_ACEOF +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + + ac_cv_o_nonblock_inherited="yes" + +else + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) + + ac_cv_o_nonblock_inherited="no" + +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_o_nonblock_inherited" >&5 +$as_echo "$ac_cv_o_nonblock_inherited" >&6; } +if test "$ac_cv_o_nonblock_inherited" = "yes"; then + o_nonblock_inherited=1 +else + o_nonblock_inherited=0 +fi + + +# Look for a way of corking TCP... + + { $as_echo "$as_me:$LINENO: checking for TCP_CORK in netinet/tcp.h" >&5 +$as_echo_n "checking for TCP_CORK in netinet/tcp.h... " >&6; } +if test "${ac_cv_define_TCP_CORK+set}" = set; then + $as_echo_n "(cached) " >&6 +else + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#ifdef TCP_CORK +YES_IS_DEFINED +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "YES_IS_DEFINED" >/dev/null 2>&1; then + ac_cv_define_TCP_CORK=yes +else + ac_cv_define_TCP_CORK=no +fi +rm -f conftest* + + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_define_TCP_CORK" >&5 +$as_echo "$ac_cv_define_TCP_CORK" >&6; } + if test "$ac_cv_define_TCP_CORK" = "yes"; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_TCP_CORK 1 +_ACEOF + + fi + + + { $as_echo "$as_me:$LINENO: checking for TCP_NOPUSH in netinet/tcp.h" >&5 +$as_echo_n "checking for TCP_NOPUSH in netinet/tcp.h... " >&6; } +if test "${ac_cv_define_TCP_NOPUSH+set}" = set; then + $as_echo_n "(cached) " >&6 +else + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#ifdef TCP_NOPUSH +YES_IS_DEFINED +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "YES_IS_DEFINED" >/dev/null 2>&1; then + ac_cv_define_TCP_NOPUSH=yes +else + ac_cv_define_TCP_NOPUSH=no +fi +rm -f conftest* + + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_define_TCP_NOPUSH" >&5 +$as_echo "$ac_cv_define_TCP_NOPUSH" >&6; } + if test "$ac_cv_define_TCP_NOPUSH" = "yes"; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_TCP_NOPUSH 1 +_ACEOF + + fi + +apr_tcp_nopush_flag="0" +have_corkable_tcp="0" +if test "x$ac_cv_define_TCP_CORK" = "xyes"; then + apr_tcp_nopush_flag="TCP_CORK" + have_corkable_tcp="1" +else + case $host in + *linux*) + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#ifdef TCP_CORK +yes +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "yes" >/dev/null 2>&1; then + + apr_tcp_nopush_flag="3" + have_corkable_tcp="1" + +fi +rm -f conftest* + + ;; + *) + ;; + esac +fi +if test "x$ac_cv_define_TCP_NOPUSH" = "xyes"; then + apr_tcp_nopush_flag="TCP_NOPUSH" + have_corkable_tcp="1" +fi + + + { $as_echo "$as_me:$LINENO: checking for SO_ACCEPTFILTER in sys/socket.h" >&5 +$as_echo_n "checking for SO_ACCEPTFILTER in sys/socket.h... " >&6; } +if test "${ac_cv_define_SO_ACCEPTFILTER+set}" = set; then + $as_echo_n "(cached) " >&6 +else + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#ifdef SO_ACCEPTFILTER +YES_IS_DEFINED +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "YES_IS_DEFINED" >/dev/null 2>&1; then + ac_cv_define_SO_ACCEPTFILTER=yes +else + ac_cv_define_SO_ACCEPTFILTER=no +fi +rm -f conftest* + + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_define_SO_ACCEPTFILTER" >&5 +$as_echo "$ac_cv_define_SO_ACCEPTFILTER" >&6; } + if test "$ac_cv_define_SO_ACCEPTFILTER" = "yes"; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_SO_ACCEPTFILTER 1 +_ACEOF + + fi + +if test "x$ac_cv_define_SO_ACCEPTFILTER" = "xyes"; then + acceptfilter="1" +else + acceptfilter="0" +fi + + + { $as_echo "$as_me:$LINENO: checking whether SCTP is supported" >&5 +$as_echo_n "checking whether SCTP is supported... " >&6; } +if test "${apr_cv_sctp+set}" = set; then + $as_echo_n "(cached) " >&6 +else + + if test "$cross_compiling" = yes; then + apr_cv_sctp=no +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif +#ifdef HAVE_NETINET_SCTP_H +#include +#endif +#ifdef HAVE_NETINET_SCTP_UIO_H +#include +#endif +#include +int main(void) { + int s, opt = 1; + if ((s = socket(AF_INET, SOCK_STREAM, IPPROTO_SCTP)) < 0) + exit(1); + if (setsockopt(s, IPPROTO_SCTP, SCTP_NODELAY, &opt, sizeof(int)) < 0) + exit(2); + exit(0); +} +_ACEOF +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + apr_cv_sctp=yes +else + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +apr_cv_sctp=no +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi +{ $as_echo "$as_me:$LINENO: result: $apr_cv_sctp" >&5 +$as_echo "$apr_cv_sctp" >&6; } + +if test "$apr_cv_sctp" = "yes"; then + have_sctp=1 +else + have_sctp=0 +fi + + + + + + + + +for ac_func in set_h_errno +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* 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 $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + + { $as_echo "$as_me:$LINENO: checking for presence of retrans/retry fields in res_state/resolv.h " >&5 +$as_echo_n "checking for presence of retrans/retry fields in res_state/resolv.h ... " >&6; } +if test "${ac_cv_retransretry+set}" = set; then + $as_echo_n "(cached) " >&6 +else + + if test "$cross_compiling" = yes; then + + ac_cv_retransretry="no" + +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#include +#if defined(__sun__) +#include +#endif +#include +/* _res is a global defined in resolv.h */ +int main(void) { + _res.retrans = 2; + _res.retry = 1; + exit(0); + return 0; +} + +_ACEOF +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + + ac_cv_retransretry="yes" + +else + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) + + ac_cv_retransretry="no" + +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_retransretry" >&5 +$as_echo "$ac_cv_retransretry" >&6; } +if test "$ac_cv_retransretry" = "yes"; then + +cat >>confdefs.h <<\_ACEOF +#define RESOLV_RETRANSRETRY 1 +_ACEOF + +fi + + +echo "${nl}Checking for IPv6 Networking support..." + +# Check whether --enable-ipv6 was given. +if test "${enable_ipv6+set}" = set; then + enableval=$enable_ipv6; if test "$enableval" = "no"; then + user_disabled_ipv6=1 + fi +else + user_disabled_ipv6=0 +fi + + +case $host in + *) + broken_ipv6=0 +esac + +{ $as_echo "$as_me:$LINENO: checking for library containing getaddrinfo" >&5 +$as_echo_n "checking for library containing getaddrinfo... " >&6; } +if test "${ac_cv_search_getaddrinfo+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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. */ +#ifdef __cplusplus +extern "C" +#endif +char getaddrinfo (); +int +main () +{ +return getaddrinfo (); + ; + return 0; +} +_ACEOF +for ac_lib in '' socket inet6; 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 + rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_search_getaddrinfo=$ac_res +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext + if test "${ac_cv_search_getaddrinfo+set}" = set; then + break +fi +done +if test "${ac_cv_search_getaddrinfo+set}" = set; then + : +else + ac_cv_search_getaddrinfo=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_search_getaddrinfo" >&5 +$as_echo "$ac_cv_search_getaddrinfo" >&6; } +ac_res=$ac_cv_search_getaddrinfo +if test "$ac_res" != no; then + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + +{ $as_echo "$as_me:$LINENO: checking for library containing gai_strerror" >&5 +$as_echo_n "checking for library containing gai_strerror... " >&6; } +if test "${ac_cv_search_gai_strerror+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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. */ +#ifdef __cplusplus +extern "C" +#endif +char gai_strerror (); +int +main () +{ +return gai_strerror (); + ; + return 0; +} +_ACEOF +for ac_lib in '' socket inet6; 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 + rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_search_gai_strerror=$ac_res +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext + if test "${ac_cv_search_gai_strerror+set}" = set; then + break +fi +done +if test "${ac_cv_search_gai_strerror+set}" = set; then + : +else + ac_cv_search_gai_strerror=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_search_gai_strerror" >&5 +$as_echo "$ac_cv_search_gai_strerror" >&6; } +ac_res=$ac_cv_search_gai_strerror +if test "$ac_res" != no; then + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + +{ $as_echo "$as_me:$LINENO: checking for library containing getnameinfo" >&5 +$as_echo_n "checking for library containing getnameinfo... " >&6; } +if test "${ac_cv_search_getnameinfo+set}" = set; then + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* 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. */ +#ifdef __cplusplus +extern "C" +#endif +char getnameinfo (); +int +main () +{ +return getnameinfo (); + ; + return 0; +} +_ACEOF +for ac_lib in '' socket inet6; 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 + rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + ac_cv_search_getnameinfo=$ac_res +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext + if test "${ac_cv_search_getnameinfo+set}" = set; then + break +fi +done +if test "${ac_cv_search_getnameinfo+set}" = set; then + : +else + ac_cv_search_getnameinfo=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_search_getnameinfo" >&5 +$as_echo "$ac_cv_search_getnameinfo" >&6; } +ac_res=$ac_cv_search_getnameinfo +if test "$ac_res" != no; then + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + + +for ac_func in gai_strerror +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* 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 $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + + { $as_echo "$as_me:$LINENO: checking for working getaddrinfo" >&5 +$as_echo_n "checking for working getaddrinfo... " >&6; } +if test "${ac_cv_working_getaddrinfo+set}" = set; then + $as_echo_n "(cached) " >&6 +else + + if test "$cross_compiling" = yes; then + + ac_cv_working_getaddrinfo="yes" + +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#ifdef HAVE_NETDB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif + +void main(void) { + struct addrinfo hints, *ai; + int error; + + memset(&hints, 0, sizeof(hints)); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + error = getaddrinfo("127.0.0.1", NULL, &hints, &ai); + if (error) { + exit(1); + } + if (ai->ai_addr->sa_family != AF_INET) { + exit(1); + } + exit(0); +} + +_ACEOF +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + + ac_cv_working_getaddrinfo="yes" + +else + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) + + ac_cv_working_getaddrinfo="no" + +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_working_getaddrinfo" >&5 +$as_echo "$ac_cv_working_getaddrinfo" >&6; } +if test "$ac_cv_working_getaddrinfo" = "yes"; then + if test "$ac_cv_func_gai_strerror" != "yes"; then + ac_cv_working_getaddrinfo="no" + else + +cat >>confdefs.h <<\_ACEOF +#define HAVE_GETADDRINFO 1 +_ACEOF + + fi +fi + + + { $as_echo "$as_me:$LINENO: checking for negative error codes for getaddrinfo" >&5 +$as_echo_n "checking for negative error codes for getaddrinfo... " >&6; } +if test "${ac_cv_negative_eai+set}" = set; then + $as_echo_n "(cached) " >&6 +else + + if test "$cross_compiling" = yes; then + + ac_cv_negative_eai="no" + +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#ifdef HAVE_NETDB_H +#include +#endif + +void main(void) { + if (EAI_ADDRFAMILY < 0) { + exit(0); + } + exit(1); +} + +_ACEOF +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + + ac_cv_negative_eai="yes" + +else + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) + + ac_cv_negative_eai="no" + +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_negative_eai" >&5 +$as_echo "$ac_cv_negative_eai" >&6; } +if test "$ac_cv_negative_eai" = "yes"; then + +cat >>confdefs.h <<\_ACEOF +#define NEGATIVE_EAI 1 +_ACEOF + +fi + + + { $as_echo "$as_me:$LINENO: checking for working getnameinfo" >&5 +$as_echo_n "checking for working getnameinfo... " >&6; } +if test "${ac_cv_working_getnameinfo+set}" = set; then + $as_echo_n "(cached) " >&6 +else + + if test "$cross_compiling" = yes; then + + ac_cv_working_getnameinfo="yes" + +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#ifdef HAVE_NETDB_H +#include +#endif +#ifdef HAVE_STRING_H +#include +#endif +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_SOCKET_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif + +void main(void) { + struct sockaddr_in sa; + char hbuf[256]; + int error; + + sa.sin_family = AF_INET; + sa.sin_port = 0; + sa.sin_addr.s_addr = inet_addr("127.0.0.1"); +#ifdef SIN6_LEN + sa.sin_len = sizeof(sa); +#endif + + error = getnameinfo((const struct sockaddr *)&sa, sizeof(sa), + hbuf, 256, NULL, 0, + NI_NUMERICHOST); + if (error) { + exit(1); + } else { + exit(0); + } +} + +_ACEOF +rm -f 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + + ac_cv_working_getnameinfo="yes" + +else + $as_echo "$as_me: program exited with status $ac_status" >&5 +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) + + ac_cv_working_getnameinfo="no" + +fi +rm -rf conftest.dSYM +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_working_getnameinfo" >&5 +$as_echo "$ac_cv_working_getnameinfo" >&6; } +if test "$ac_cv_working_getnameinfo" = "yes"; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_GETNAMEINFO 1 +_ACEOF + +fi + + +{ $as_echo "$as_me:$LINENO: checking for sockaddr_in6" >&5 +$as_echo_n "checking for sockaddr_in6... " >&6; } +if test "${ac_cv_define_sockaddr_in6+set}" = set; then + $as_echo_n "(cached) " >&6 +else + +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#ifdef HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_NETINET_IN_H +#include +#endif + +int +main () +{ + +struct sockaddr_in6 sa; + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + + ac_cv_define_sockaddr_in6=yes + +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + + ac_cv_define_sockaddr_in6=no + +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +{ $as_echo "$as_me:$LINENO: result: $ac_cv_define_sockaddr_in6" >&5 +$as_echo "$ac_cv_define_sockaddr_in6" >&6; } + +if test "$ac_cv_define_sockaddr_in6" = "yes"; then + have_sockaddr_in6=1 +else + have_sockaddr_in6=0 +fi + + +have_ipv6="0" +if test "$user_disabled_ipv6" = 1; then + ipv6_result="no -- disabled by user" +else + if test "x$broken_ipv6" = "x0"; then + if test "x$have_sockaddr_in6" = "x1"; then + if test "x$ac_cv_working_getaddrinfo" = "xyes"; then + if test "x$ac_cv_working_getnameinfo" = "xyes"; then + have_ipv6="1" + ipv6_result="yes" + else + ipv6_result="no -- no getnameinfo" + fi + else + ipv6_result="no -- no working getaddrinfo" + fi + else + ipv6_result="no -- no sockaddr_in6" + fi + else + ipv6_result="no -- the platform has known problems supporting IPv6" + fi +fi + +{ $as_echo "$as_me:$LINENO: checking if APR supports IPv6" >&5 +$as_echo_n "checking if APR supports IPv6... " >&6; } +{ $as_echo "$as_me:$LINENO: result: $ipv6_result" >&5 +$as_echo "$ipv6_result" >&6; } + + + + + +for ac_header in langinfo.h +do +as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +else + # Is the header compilable? +{ $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 +$as_echo_n "checking $ac_header usability... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_header_compiler=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_compiler=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +$as_echo "$ac_header_compiler" >&6; } + +# Is the header present? +{ $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 +$as_echo_n "checking $ac_header presence... " >&6; } +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null && { + test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || + test ! -s conftest.err + }; then + ac_header_preproc=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi + +rm -f conftest.err conftest.$ac_ext +{ $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +$as_echo "$ac_header_preproc" >&6; } + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +$as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +$as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +$as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +$as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +$as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +$as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +$as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + + ;; +esac +{ $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 +$as_echo_n "checking for $ac_header... " >&6; } +if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +ac_res=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + +fi +as_val=`eval 'as_val=${'$as_ac_Header'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +for ac_func in nl_langinfo +do +as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +{ $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 +$as_echo_n "checking for $ac_func... " >&6; } +if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* 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 $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined __stub_$ac_func || defined __stub___$ac_func +choke me +#endif + +int +main () +{ +return $ac_func (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext 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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_link") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest$ac_exeext && { + test "$cross_compiling" = yes || + $as_test_x conftest$ac_exeext + }; then + eval "$as_ac_var=yes" +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + eval "$as_ac_var=no" +fi + +rm -rf conftest.dSYM +rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ + conftest$ac_exeext conftest.$ac_ext +fi +ac_res=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } +as_val=`eval 'as_val=${'$as_ac_var'} + $as_echo "$as_val"'` + if test "x$as_val" = x""yes; then + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + + +# AC_CHECK_FUNCS is not sufficient since the function may be usable when +# struct stat64 is not exposed (e.g. HP-UX). Note that fstat64 only +# happens to be usable on Linux because -D_GNU_SOURCE is picked up +# by the earlier crypt_r check. +{ $as_echo "$as_me:$LINENO: checking for usable fstat64" >&5 +$as_echo_n "checking for usable fstat64... " >&6; } +if test "${apr_cv_func_fstat64+set}" = set; then + $as_echo_n "(cached) " >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +int +main () +{ +struct stat64 st; fstat64(0, &st); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +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:$LINENO: $ac_try_echo\"" +$as_echo "$ac_try_echo") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + apr_cv_func_fstat64=yes +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + apr_cv_func_fstat64=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:$LINENO: result: $apr_cv_func_fstat64" >&5 +$as_echo "$apr_cv_func_fstat64" >&6; } +if test $apr_cv_func_fstat64 = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_FSTAT64 1 +_ACEOF + +fi + + + +echo "${nl}Restore user-defined environment settings..." + + +if test "x$apr_ste_save_CPPFLAGS" = "x"; 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 +echo " restoring CPPFLAGS to \"$CPPFLAGS\"" +echo " setting EXTRA_CPPFLAGS to \"$EXTRA_CPPFLAGS\"" + + + +if test "x$apr_ste_save_CFLAGS" = "x"; 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 +echo " restoring CFLAGS to \"$CFLAGS\"" +echo " setting EXTRA_CFLAGS to \"$EXTRA_CFLAGS\"" + + + +if test "x$apr_ste_save_LDFLAGS" = "x"; 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 +echo " restoring LDFLAGS to \"$LDFLAGS\"" +echo " setting EXTRA_LDFLAGS to \"$EXTRA_LDFLAGS\"" + + + +if test "x$apr_ste_save_LIBS" = "x"; 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 +echo " restoring LIBS to \"$LIBS\"" +echo " setting EXTRA_LIBS to \"$EXTRA_LIBS\"" + + + +if test "x$apr_ste_save_INCLUDES" = "x"; 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 +echo " restoring INCLUDES to \"$INCLUDES\"" +echo " setting EXTRA_INCLUDES to \"$EXTRA_INCLUDES\"" + + + + + + + + + + + + + + + + + +echo "${nl}Construct Makefiles and header files." +MAKEFILE1="Makefile strings/Makefile passwd/Makefile tables/Makefile build/Makefile" +SUBDIRS="strings passwd tables " +for dir in $apr_modules +do + test -d $dir || $MKDIR $dir + if test -f $srcdir/$dir/$OSDIR/Makefile.in; then + MAKEFILE2="$MAKEFILE2 $dir/$OSDIR/Makefile " + SUBDIRS="$SUBDIRS $dir/$OSDIR " + else + MAKEFILE2="$MAKEFILE2 $dir/$DEFAULT_OSDIR/Makefile " + SUBDIRS="$SUBDIRS $dir/$DEFAULT_OSDIR " + fi +done + +if test -d $srcdir/test; then + MAKEFILE3="test/Makefile test/internal/Makefile" +fi + + +# +# BSD/OS (BSDi) needs to use a different include syntax in the Makefiles +# +case $host in +*bsdi*) + # Check whether they've installed GNU make + if make --version > /dev/null 2>&1; then + INCLUDE_RULES="include $apr_buildout/apr_rules.mk" + else + # BSDi make + INCLUDE_RULES=".include \"$apr_buildout/apr_rules.mk\"" + fi + ;; +*) + INCLUDE_RULES="include $apr_buildout/apr_rules.mk" + ;; +esac + + +SAVE_FILES="include/apr.h include/arch/unix/apr_private.h" + +for i in $SAVE_FILES; do + test -r $i && mv $i $i.save +done + +dir=include/arch/unix +test -d $dir || $MKDIR $dir + +ac_config_files="$ac_config_files $MAKEFILE1 $MAKEFILE2 $MAKEFILE3 include/apr.h build/apr_rules.mk build/pkg/pkginfo apr-config" + +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_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$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= ;; #( + *) $as_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+set}" = set || &/ + 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 + test "x$cache_file" != "x/dev/null" && + { $as_echo "$as_me:$LINENO: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + cat confcache >$cache_file + else + { $as_echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 +$as_echo "$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= +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=`$as_echo "$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. + ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" + ac_ltlibobjs="$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" +{ $as_echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +cat >$CONFIG_STATUS <<_ACEOF || ac_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} +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be more Bourne compatible +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 + + + + +# PATH needs CR +# 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_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +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 + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + 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 + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + { (exit 1); exit 1; } +fi + +# Work around bugs in pre-3.0 UWIN ksh. +for as_var in ENV MAIL MAILPATH +do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# Required to use basename. +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 + + +# Name of the executable. +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# CDPATH. +$as_unset CDPATH + + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line after each line using $LINENO; the second 'sed' + # does the real work. The second script uses 'N' to pair each + # line-number line with the line containing $LINENO, and appends + # trailing '-' during substitution so that $LINENO is not a special + # case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # scripts with optimization help from Paolo Bonzini. Blame Lee + # E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + 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" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); exit 1; }; } + + # 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 +} + + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in +-n*) + case `echo 'x\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + *) ECHO_C='\c';; + esac;; +*) + ECHO_N='-n';; +esac +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +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 -p'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -p' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -p' + fi +else + as_ln_s='cp -p' +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=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +if test -x / >/dev/null 2>&1; then + as_test_x='test -x' +else + if ls -dL / >/dev/null 2>&1; then + as_ls_L_option=L + else + as_ls_L_option= + fi + as_test_x=' + eval sh -c '\'' + if test -d "$1"; then + test -d "$1/."; + else + case $1 in + -*)set "./$1";; + esac; + case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in + ???[sx]*):;;*)false;;esac;fi + '\'' sh + ' +fi +as_executable_p=$as_test_x + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&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.63. 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 from templates according to the +current configuration. + +Usage: $0 [OPTION]... [FILE]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, 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 ." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_version="\\ +config.status +configured by $0, generated by GNU Autoconf 2.63, + with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" + +Copyright (C) 2008 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' +INSTALL='$INSTALL' +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=$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 ) + $as_echo "$ac_cs_version"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + CONFIG_FILES="$CONFIG_FILES '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + CONFIG_HEADERS="$CONFIG_HEADERS '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + { $as_echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; };; + --help | --hel | -h ) + $as_echo "$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_echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } ;; + + *) ac_config_targets="$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 + \$as_echo "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 + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_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/arch/unix/apr_private.h") CONFIG_HEADERS="$CONFIG_HEADERS include/arch/unix/apr_private.h" ;; + "$MAKEFILE1") CONFIG_FILES="$CONFIG_FILES $MAKEFILE1" ;; + "$MAKEFILE2") CONFIG_FILES="$CONFIG_FILES $MAKEFILE2" ;; + "$MAKEFILE3") CONFIG_FILES="$CONFIG_FILES $MAKEFILE3" ;; + "include/apr.h") CONFIG_FILES="$CONFIG_FILES include/apr.h" ;; + "build/apr_rules.mk") CONFIG_FILES="$CONFIG_FILES build/apr_rules.mk" ;; + "build/pkg/pkginfo") CONFIG_FILES="$CONFIG_FILES build/pkg/pkginfo" ;; + "apr-config") CONFIG_FILES="$CONFIG_FILES apr-config" ;; + "default") CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;; + + *) { { $as_echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 +$as_echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; + 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+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || 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= + trap 'exit_status=$? + { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status +' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || +{ + $as_echo "$as_me: cannot create a temporary directory in ." >&2 + { (exit 1); exit 1; } +} + +# 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=' ' +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 {' >"$tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } +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_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } + + 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_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } + 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 >>"\$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 >>"\$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 < "$tmp/subs1.awk" > "$tmp/subs.awk" \ + || { { $as_echo "$as_me:$LINENO: error: could not setup config files machinery" >&5 +$as_echo "$as_me: error: could not setup config files machinery" >&2;} + { (exit 1); exit 1; }; } +_ACEOF + +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ 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[ ]*=/{ +s/:*\$(srcdir):*/:/ +s/:*\${srcdir}:*/:/ +s/:*@srcdir@:*/:/ +s/^\([^=]*=[ ]*\):*/\1/ +s/:*$// +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 >"$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_t=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_t"; then + break + elif $ac_last_try; then + { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_HEADERS" >&5 +$as_echo "$as_me: error: could not make $CONFIG_HEADERS" >&2;} + { (exit 1); exit 1; }; } + 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_echo "$as_me:$LINENO: error: could not setup config headers machinery" >&5 +$as_echo "$as_me: error: could not setup config headers machinery" >&2;} + { (exit 1); exit 1; }; } +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_echo "$as_me:$LINENO: error: invalid tag $ac_tag" >&5 +$as_echo "$as_me: error: invalid tag $ac_tag" >&2;} + { (exit 1); exit 1; }; };; + :[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="$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_echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 +$as_echo "$as_me: error: cannot find input file: $ac_f" >&2;} + { (exit 1); exit 1; }; };; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + ac_file_inputs="$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 '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:$LINENO: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$tmp/stdin" \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } ;; + 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 || +$as_echo 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" + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$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 || +$as_echo 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_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 +$as_echo "$as_me: error: cannot create directory $as_dir" >&2;} + { (exit 1); exit 1; }; }; } + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$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 + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac +_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@*) + { $as_echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$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 +s&@INSTALL@&$ac_INSTALL&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined." >&5 +$as_echo "$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 "$tmp/stdin" + case $ac_file in + -) cat "$tmp/out" && rm -f "$tmp/out";; + *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; + esac \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" + } >"$tmp/config.h" \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:$LINENO: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$tmp/config.h" "$ac_file" \ + || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 +$as_echo "$as_me: error: could not create $ac_file" >&2;} + { (exit 1); exit 1; }; } + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ + || { { $as_echo "$as_me:$LINENO: error: could not create -" >&5 +$as_echo "$as_me: error: could not create -" >&2;} + { (exit 1); exit 1; }; } + fi + ;; + + :C) { $as_echo "$as_me:$LINENO: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "default":C) +for i in $SAVE_FILES; do + if cmp -s $i $i.save 2>/dev/null; then + mv $i.save $i + echo "$i is unchanged" + fi + rm -f $i.save +done +chmod +x apr-config + ;; + + esac +done # for ac_tag + + +{ (exit 0); exit 0; } +_ACEOF +chmod +x $CONFIG_STATUS +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + { { $as_echo "$as_me:$LINENO: error: write failure creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: error: write failure creating $CONFIG_STATUS" >&2;} + { (exit 1); exit 1; }; } + + +# 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 || { (exit 1); exit 1; } +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:$LINENO: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + + + + + +if test -n "$USE_VPATH"; then + for makefile in $MAKEFILE1 $MAKEFILE2 $MAKEFILE3; do + cat $makefile | \ + sed \ + -e 's#-I\($(INCDIR[0-9]*)\)#-I\1 -I$(srcdir)/\1#g' \ + -e 's#-I\($(OSDIR[0-9]*)\)#-I\1 -I$(srcdir)/\1#g' \ + -e 's#-I\($(DEFOSDIR[0-9]*)\)#-I\1 -I$(srcdir)/\1#g' \ + > tmp + cp tmp $makefile + done + rm -f tmp +fi + + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/configure.in b/rubbos/app/httpd-2.0.64/srclib/apr/configure.in new file mode 100644 index 00000000..3e63c9fa --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/configure.in @@ -0,0 +1,1998 @@ +dnl +dnl Autoconf configuration file for APR +dnl +dnl Process this file with autoconf to produce a configure script. +dnl Use ./buildconf to prepare build files and run autoconf for APR. + +AC_INIT(build/apr_common.m4) +AC_CONFIG_HEADER(include/arch/unix/apr_private.h) +AC_CONFIG_AUX_DIR(build) + +dnl +dnl Include our own M4 macros along with those for libtool +dnl +sinclude(build/apr_common.m4) +sinclude(build/apr_network.m4) +sinclude(build/apr_threads.m4) +sinclude(build/apr_hints.m4) +sinclude(build/libtool.m4) + +dnl Save user-defined environment settings for later restoration +dnl +APR_SAVE_THE_ENVIRONMENT(CPPFLAGS) +APR_SAVE_THE_ENVIRONMENT(CFLAGS) +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) + +AC_CANONICAL_SYSTEM +echo "Configuring APR library" +echo "Platform: $host" + +dnl Some initial steps for configuration. We setup the default directory +dnl and which files are to be configured. + +dnl Setup the directory macros now + +# Absolute source/build directory +apr_srcdir=`(cd $srcdir && pwd)` +apr_builddir=`pwd` +AC_SUBST(apr_srcdir) +AC_SUBST(apr_builddir) + +if test "$apr_builddir" != "$apr_srcdir"; then + USE_VPATH=1 + APR_CONFIG_LOCATION=build +else + APR_CONFIG_LOCATION=source +fi + +AC_SUBST(APR_CONFIG_LOCATION) + +# Libtool might need this symbol -- it must point to the location of +# the generated libtool script (not necessarily the "top" build dir). +# +top_builddir="$apr_builddir" +AC_SUBST(top_builddir) + +# Directory containing apr build macros, helpers, and make rules +# NOTE: make rules (apr_rules.mk) will be in the builddir for vpath +# +apr_buildout=$apr_builddir/build +apr_builders=$apr_srcdir/build +AC_SUBST(apr_builders) + +MKDIR=$apr_builders/mkdir.sh + +dnl Initialize mkdir -p functionality. +APR_MKDIR_P_CHECK($apr_builders/mkdir.sh) + +# get our version information +get_version="$apr_builders/get-version.sh" +version_hdr="$apr_srcdir/include/apr_version.h" +APR_MAJOR_VERSION="`$get_version major $version_hdr APR`" +APR_DOTTED_VERSION="`$get_version all $version_hdr APR`" + +AC_SUBST(APR_DOTTED_VERSION) +AC_SUBST(APR_MAJOR_VERSION) + +echo "APR Version: ${APR_DOTTED_VERSION}" + +dnl Enable the layout handling code, then reparse the prefix-style +dnl arguments due to autoconf being a PITA. +APR_ENABLE_LAYOUT(apr) +APR_PARSE_ARGUMENTS + +dnl Set optional CC hints here in case autoconf makes an inappropriate choice. +dnl This allows us to suggest what the compiler should be, but still +dnl allows the user to override CC externally. +APR_CC_HINTS + +dnl Do the various CC checks *before* preloading values. The preload code +dnl may need to use compiler characteristics to make decisions. This macro +dnl can only be used once within a configure script, so this prevents a +dnl preload section from invoking the macro to get compiler info. +AC_PROG_CC + +dnl Preload +APR_PRELOAD + +dnl These added to allow default directories to be used... +DEFAULT_OSDIR="unix" +echo "(Default will be ${DEFAULT_OSDIR})" + +apr_modules="file_io network_io threadproc misc locks time mmap shmem user memory atomic poll support" + +dnl Checks for programs. +AC_PROG_MAKE_SET +AC_PROG_CPP +AC_PROG_AWK +AC_PROG_LN_S +AC_PROG_RANLIB +AC_PROG_INSTALL +AC_CHECK_PROG(RM, rm, rm) +AC_CHECK_PROG(AS, as, as) +AC_CHECK_PROG(ASCPP, cpp, cpp) +AC_CHECK_TOOL(AR, ar, ar) + +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 +APR_EBCDIC + +dnl this is our library name +APR_LIBNAME="apr${libsuffix}" +AC_SUBST(APR_LIBNAME) + +dnl prep libtool +dnl +echo "performing libtool configuration..." + +AC_ARG_ENABLE(experimental-libtool,[ --experimental-libtool Use experimental custom libtool (not included in source distribution)], + [experimental_libtool=$enableval],[experimental_libtool=no]) + +case $host in +*os2*) + # Use a custom-made libtool replacement + echo "using aplibtool" + LIBTOOL="$srcdir/build/aplibtool" + gcc $CFLAGS $CPPFLAGS -o $LIBTOOL.exe $LIBTOOL.c + ;; +*) + if test "x$LTFLAGS" = "x"; then + LTFLAGS='--silent' + fi + if test "$experimental_libtool" = "yes"; then + # Use a custom-made libtool replacement + echo "using jlibtool" + LIBTOOL="$apr_builddir/libtool" + LIBTOOL_SRC="$apr_srcdir/build/jlibtool.c" + if test ! -f $LIBTOOL_SRC; then + AC_MSG_ERROR([Experimental libtool source not found. It is not included with APR by default.]) + fi + $CC $CFLAGS $CPPFLAGS -o $LIBTOOL $LIBTOOL_SRC + else + dnl libtoolize requires that the following not be indented +AC_PROG_LIBTOOL + # get libtool's setting of shlibpath_var + eval `grep "^shlibpath_var=[[A-Z_]]*$" $apr_builddir/libtool` + if test "x$shlibpath_var" = "x"; then + shlibpath_var=REPLACE_WITH_YOUR_SHLIBPATH_VAR + fi + fi + ;; +esac + +AC_ARG_WITH(installbuilddir, [ --with-installbuilddir=DIR location to store APR build files (defaults to '${datadir}/build')], + [ installbuilddir=$withval ], [ installbuilddir="${datadir}/build" ] ) +AC_SUBST(installbuilddir) + +AC_ARG_WITH(libtool, [ --without-libtool avoid using libtool to link the library], + [ use_libtool=$withval ], [ use_libtool="yes" ] ) + +if test "x$use_libtool" = "xyes"; then + lt_compile='$(LIBTOOL) $(LTFLAGS) --mode=compile $(COMPILE) -c $< && touch $@' + LT_VERSION="-version-info `$get_version libtool $version_hdr APR`" + link="\$(LIBTOOL) \$(LTFLAGS) --mode=link \$(LT_LDFLAGS) \$(COMPILE) ${LT_VERSION} \$(ALL_LDFLAGS) -o \$@" + so_ext='lo' + lib_target='-rpath $(libdir) $$objects' + export_lib_target='-rpath \$(libdir) \$\$objects' +else + lt_compile='$(COMPILE) -c $<' + link='$(AR) cr $(TARGET_LIB) $$objects; $(RANLIB) $(TARGET_LIB)' + so_ext='o' + lib_target='' + export_lib_target='' +fi + +case $host in + *-solaris2*) + apr_platform_runtime_link_flag="-R" + ;; + *) + ;; +esac + +AC_SUBST(lt_compile) +AC_SUBST(link) +AC_SUBST(so_ext) +AC_SUBST(lib_target) +AC_SUBST(export_lib_target) +AC_SUBST(shlibpath_var) +AC_SUBST(LTFLAGS) +AC_SUBST(LT_LDFLAGS) + +dnl ----------------------------- Checks for compiler flags +nl=' +' +echo "${nl}Check for compiler flags..." + +dnl AC_PROG_CC sets -g in CFLAGS (and -O2 for gcc) by default. +dnl On OS/390 this causes the compiler to insert extra debugger +dnl hook instructions. That's fine for debug/maintainer builds, not fine +dnl otherwise. + +case $host in + *os390) + if test "$ac_test_CFLAGS" != set; then + APR_REMOVEFROM(CFLAGS,-g) + fi + ;; +esac + +AC_ARG_ENABLE(debug,[ --enable-debug Turn on debugging and compile time warnings], + [APR_ADDTO(CFLAGS,-g) + if test "$GCC" = "yes"; then + APR_ADDTO(CFLAGS,-Wall) + elif test "$AIX_XLC" = "yes"; then + APR_ADDTO(CFLAGS,-qfullpath) + fi +])dnl + +AC_ARG_ENABLE(maintainer-mode,[ --enable-maintainer-mode Turn on debugging and compile time warnings], + [APR_ADDTO(CFLAGS,-g) + if test "$GCC" = "yes"; then + APR_ADDTO(CFLAGS,[-Wall -Wmissing-prototypes -Wstrict-prototypes -Wmissing-declarations]) + elif test "$AIX_XLC" = "yes"; then + APR_ADDTO(CFLAGS,-qfullpath -qinitauto=FE -qcheck=all -qinfo=pro) + fi +])dnl + +AC_ARG_ENABLE(profile,[ --enable-profile Turn on profiling for the build (GCC)], + if test "$GCC" = "yes"; then + APR_ADDTO(CFLAGS, -pg) + APR_REMOVEFROM(CFLAGS, -g) + if test "$host" = "i586-pc-beos"; then + APR_REMOVEFROM(CFLAGS, -O2) + APR_ADDTO(CFLAGS, -O1) + APR_ADDTO(LDFLAGS, -p) + fi + fi +)dnl + +AC_ARG_ENABLE(pool-debug, + [ --enable-pool-debug[[=yes|no|verbose|verbose-alloc|lifetime|owner|all]] Turn on pools debugging], + [ if test -z "$enableval"; then + APR_ADDTO(CPPFLAGS, -DAPR_POOL_DEBUG=1) + elif test ! "$enableval" = "no"; then + apr_pool_debug=1 + + for i in $enableval + do + flag=0 + + case $i in + yes) + flag=1 + ;; + verbose) + flag=2 + ;; + lifetime) + flag=4 + ;; + owner) + flag=8 + ;; + verbose-alloc) + flag=16 + ;; + all) + apr_pool_debug=31 + ;; + *) + ;; + esac + + if test $flag -gt 0; then + apr_pool_debug=`expr '(' $apr_pool_debug - $apr_pool_debug % \ + '(' $flag '*' 2 ')' ')' + $flag + $apr_pool_debug % $flag` + fi + done + + APR_ADDTO(CPPFLAGS, -DAPR_POOL_DEBUG=$apr_pool_debug) + fi + ]) + +dnl Electric Fence malloc checker. +dnl --with-efence specifies the path to Electric Fence +AC_ARG_WITH(efence, + [ --with-efence[[=DIR]] path to Electric Fence installation], + [ apr_efence_dir="$withval" + if test "$apr_efence_dir" != "yes"; then + APR_ADDTO(LDFLAGS,[-L$apr_efence_dir/lib]) + if test "x$apr_platform_runtime_link_flag" != "x"; then + APR_ADDTO(LDFLAGS, + [$apr_platform_runtime_link_flag$apr_efence_dir/lib]) + fi + fi + AC_CHECK_LIB(efence, malloc, + [ APR_ADDTO(LIBS,-lefence) ], + [ AC_MSG_ERROR(Electric Fence requested but not detected) ]) + ]) + +if test "$host" = "i586-pc-beos"; then + AC_ARG_ENABLE(malloc-debug,[ --enable-malloc-debug Switch on malloc_debug for BeOS], + APR_REMOVEFROM(CFLAGS, -O2) + APR_ADDTO(CPPFLAGS, -fcheck-memory-usage -D_KERNEL_MODE) + ) dnl +fi + +# this is the place to put specific options for platform/compiler +# combinations +case "$host:$CC" in + *-hp-hpux*:cc ) + APR_ADDTO(CFLAGS,[-Ae +Z]) + case $host in + ia64-* ) + ;; + * ) + if echo "$CFLAGS " | grep '+DA' >/dev/null; then : + else + APR_ADDTO(CFLAGS,[+DAportable]) + fi + ;; + esac + ;; + powerpc-*-beos:mwcc* ) + APR_SETVAR(CPP,[mwcc -E]) + APR_SETVAR(CC,mwcc) + APR_SETVAR(AR,ar) + ;; +esac + +dnl Check the depend program we can use +APR_CHECK_DEPEND + +# force_atomic_generic flag +# this will be set we find a cpu/OS combo +# which is historical and doesn't work with the method +# we are using for the more up to date cpu/OS +# (ie.. old sparcs) +apr_force_atomic_generic=0 +proc_mutex_is_global=0 +nonportable_atomics_enabled=0 + +AC_ARG_ENABLE(nonportable-atomics, +[ --enable-nonportable-atomics Turn on optimized atomic code which may produce nonportable binaries], +[ + if test "$enableval" = "yes"; then + nonportable_atomics_enabled=1 + fi +]) + +config_subdirs="none" +INSTALL_SUBDIRS="none" +case $host in + i386-ibm-aix* | *-ibm-aix[[1-2]].* | *-ibm-aix3.* | *-ibm-aix4.1 | *-ibm-aix4.1.* | *-ibm-aix4.2 | *-ibm-aix4.2.*) + OSDIR="aix" + APR_ADDTO(LDFLAGS,-lld) + eolstr="\\n" + ;; + *-os2*) + APR_ADDTO(CPPFLAGS,-DOS2) + APR_ADDTO(CFLAGS,-Zmt) + AC_CHECK_LIB(bsd, random) + OSDIR="os2" + enable_threads="system_threads" + eolstr="\\r\\n" + file_as_socket="0" + proc_mutex_is_global=1 + ;; + *beos*) + OSDIR="beos" + APR_ADDTO(CPPFLAGS,-DBEOS) + enable_threads="system_threads" + native_mmap_emul="1" + APR_CHECK_DEFINE(BONE_VERSION, sys/socket.h) + eolstr="\\n" + osver=`uname -r` + proc_mutex_is_global=1 + case $osver in + 5.0.4) + file_as_socket="1" + ;; + *) + file_as_socket="0" + ;; + esac + ;; + *os390) + OSDIR="os390" + eolstr="\\n" + ;; + *os400) + OSDIR="as400" + eolstr="\\n" + ;; + *cygwin*) + OSDIR="unix" + APR_ADDTO(CPPFLAGS,-DCYGWIN) + enable_threads="no" + eolstr="\\n" + ;; + *linux*) + apr_force_atomic_generic=1 + case $host_cpu in + i486|i586|i686) + if test "$nonportable_atomics_enabled" = 1; then + apr_force_atomic_generic=0 + fi + ;; + esac + OSDIR="unix" + eolstr="\\n" + ;; + *hpux10* ) + enable_threads="no" + OSDIR="unix" + eolstr="\\n" + ;; + *) + OSDIR="unix" + eolstr="\\n" + ;; +esac + +AC_SUBST(apr_force_atomic_generic) +AC_SUBST(proc_mutex_is_global) +AC_SUBST(eolstr) +AC_SUBST(INSTALL_SUBDIRS) + +# For some platforms we need a version string which allows easy numeric +# comparisons. +case $host in + *freebsd*) + if test -x /sbin/sysctl; then + os_version=`/sbin/sysctl -n kern.osreldate` + else + os_version=000000 + fi + ;; + *linux*) + os_version=`uname -r | sed -e 's/\(.\)\.\(.\)\.\(.\).*/\1\2\3/'` + ;; + *darwin*) + os_version=`uname -r | sed -e 's/\(.\)\.\(.\).*/\1\2/'` + ;; + *) + os_version=OS_VERSION_IS_NOT_SET + ;; +esac + +dnl ----------------------------- Checks for Any required Libraries +dnl Note: Autoconf will always append LIBS with an extra " " in AC_CHECK_LIB. +dnl It should check for LIBS being empty and set LIBS equal to the new value +dnl without the extra " " in that case, but they didn't do that. So, we +dnl end up LIBS="-lm -lcrypt -lnsl -ldl" which is an annoyance. +AC_CHECK_LIB(resolv, res_init) +AC_CHECK_LIB(nsl, gethostbyname) +AC_SEARCH_LIBS(gethostname, nsl) +AC_CHECK_LIB(socket, socket) +AC_SEARCH_LIBS(crypt, crypt ufc) +AC_CHECK_LIB(truerand, main) +AC_SEARCH_LIBS(modf, m) +AC_SEARCH_LIBS(sqrt, m) + +dnl ----------------------------- Checking for Threads +echo "${nl}Checking for Threads..." + +if test -z "$enable_threads"; then + AC_ARG_ENABLE(threads, + [ --enable-threads Enable threading support in APR.], + [ enable_threads=$enableval] , + [ APR_CHECK_PTHREADS_H([ enable_threads="pthread" ] , + [ enable_threads="no" ] ) ] ) +fi + +if test "$enable_threads" = "no"; then + threads="0" + pthreadh="0" + pthreadser="0" +else + if test "$enable_threads" = "pthread"; then +# We have specified pthreads for our threading library, just make sure +# that we have everything we need + APR_PTHREADS_CHECK_SAVE + APR_PTHREADS_CHECK + APR_CHECK_PTHREADS_H([ + threads="1" + pthreadh="1" + pthreadser="1" + AC_DEFINE(USE_THREADS, 1, [Define if APR supports threads]) ], [ + threads="0" + pthreadh="0" + pthreadser="0" + APR_PTHREADS_CHECK_RESTORE ] ) + elif test "$enable_threads" = "system_threads"; then + threads="1" + pthreadh="0" + pthreadser="0" + else +# We basically specified that we wanted threads, but not how to implement +# them. In this case, just look for pthreads. In the future, we can check +# for other threading libraries as well. + APR_PTHREADS_CHECK_SAVE + APR_PTHREADS_CHECK + APR_CHECK_PTHREADS_H([ + threads="1" + pthreadh="1" + pthreadser="1" + AC_DEFINE(USE_THREADS) ], [ + threads="0" + pthreadser="0" + pthreadh="0" + APR_PTHREADS_CHECK_RESTORE ] ) + fi + if test "$pthreadh" = "1"; then + APR_CHECK_PTHREAD_GETSPECIFIC_TWO_ARGS + APR_CHECK_PTHREAD_ATTR_GETDETACHSTATE_ONE_ARG + AC_CHECK_FUNCS(pthread_key_delete pthread_rwlock_init) + + if test "$ac_cv_func_pthread_rwlock_init" = "yes"; then + dnl ----------------------------- Checking for pthread_rwlock_t + AC_CACHE_CHECK([for pthread_rwlock_t], [apr_cv_type_rwlock_t], + AC_TRY_COMPILE([#include +#include ], [pthread_rwlock_t *rwlock;], + [apr_cv_type_rwlock_t=yes], [apr_cv_type_rwlock_t=no], + [apr_cv_type_rwlock_t=no])) + if test "$apr_cv_type_rwlock_t" = "yes"; then + AC_DEFINE(HAVE_PTHREAD_RWLOCKS, 1, [Define if pthread rwlocks are available]) + fi + fi + # this might also require -DXOPEN_SOURCE=500, so leave after the + # rwlock check. + APR_CHECK_PTHREAD_RECURSIVE_MUTEX + fi +fi + +ac_cv_define_READDIR_IS_THREAD_SAFE=no +ac_cv_define_GETHOSTBYNAME_IS_THREAD_SAFE=no +ac_cv_define_GETHOSTBYADDR_IS_THREAD_SAFE=no +if test "$threads" = "1"; then + echo "APR will use threads" + AC_CHECK_LIB(c_r, readdir, + AC_DEFINE(READDIR_IS_THREAD_SAFE, 1, + [Define if readdir is thread safe])) + if test "x$apr_gethostbyname_is_thread_safe" = "x"; then + AC_CHECK_LIB(c_r, gethostbyname, apr_gethostbyname_is_thread_safe=yes) + fi + if test "$apr_gethostbyname_is_thread_safe" = "yes"; then + AC_DEFINE(GETHOSTBYNAME_IS_THREAD_SAFE, 1, + [Define if gethostbyname is thread safe]) + fi + if test "x$apr_gethostbyaddr_is_thread_safe" = "x"; then + AC_CHECK_LIB(c_r, gethostbyaddr, apr_gethostbyaddr_is_thread_safe=yes) + fi + if test "$apr_gethostbyaddr_is_thread_safe" = "yes"; then + AC_DEFINE(GETHOSTBYADDR_IS_THREAD_SAFE, 1, + [Define if gethostbyaddr is thread safe]) + fi + AC_CHECK_FUNCS(gethostbyname_r gethostbyaddr_r) +else + echo "APR will be non-threaded" +fi + +AC_CHECK_FUNCS(sigsuspend, [ have_sigsuspend="1" ], [ have_sigsuspend="0" ]) +AC_CHECK_FUNCS(sigwait, [ have_sigwait="1" ], [ have_sigwait="0" ]) +dnl AC_CHECK_FUNCS doesn't work for this on Tru64 since the function +dnl is renamed in signal.h. Todo: Autodetect +case $host in + *alpha*-dec-osf* ) + have_sigwait="1" + ;; +esac + +AC_SUBST(threads) +AC_SUBST(have_sigsuspend) +AC_SUBST(have_sigwait) + +AC_CHECK_FUNCS(poll) + +dnl ----------------------------- Checking for missing POSIX thread functions +AC_CHECK_FUNCS([getpwnam_r getpwuid_r getgrnam_r getgrgid_r]) + +dnl ----------------------------- Checking for Shared Memory Support +echo "${nl}Checking for Shared Memory Support..." + +# The real-time POSIX extensions (e.g. shm_*, sem_*) may only +# be available if linking against librt. +AC_SEARCH_LIBS(shm_open, rt) + +case $host in + *-sysv*) + ac_includes_default="$ac_includes_default +#if HAVE_SYS_MUTEX_H /* needed to define lock_t for sys/shm.h */ +# include +#endif";; +esac + +AC_CHECK_HEADERS([sys/mman.h sys/ipc.h sys/mutex.h sys/shm.h sys/file.h kernel/OS.h os2.h]) +AC_CHECK_FUNCS([mmap munmap shm_open shm_unlink shmget shmat shmdt shmctl \ + create_area]) +APR_CHECK_DEFINE(MAP_ANON, sys/mman.h) +AC_CHECK_FILE(/dev/zero) + +# Not all systems can mmap /dev/zero (such as HP-UX). Check for that. +if test "$ac_cv_func_mmap" = "yes" && + test "$ac_cv_file__dev_zero" = "yes"; then + AC_MSG_CHECKING(for mmap that can map /dev/zero) + AC_TRY_RUN([ +#include +#include +#include +#ifdef HAVE_SYS_MMAN_H +#include +#endif + int main() + { + int fd; + void *m; + fd = open("/dev/zero", O_RDWR); + if (fd < 0) { + return 1; + } + m = mmap(0, sizeof(void*), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); + if (m == (void *)-1) { /* aka MAP_FAILED */ + return 2; + } + if (munmap(m, sizeof(void*)) < 0) { + return 3; + } + return 0; + }], [], [ac_cv_file__dev_zero=no], [ac_cv_file__dev_zero=no]) + + AC_MSG_RESULT($ac_cv_file__dev_zero) +fi + +# Now we determine which one is our anonymous shmem preference. +haveshmgetanon="0" +havemmapzero="0" +havemmapanon="0" +APR_BEGIN_DECISION([anonymous shared memory allocation method]) +APR_IFALLYES(header:sys/ipc.h header:sys/shm.h header:sys/file.h dnl + func:shmget func:shmat func:shmdt func:shmctl, + [haveshmgetanon="1" + APR_DECIDE(USE_SHMEM_SHMGET_ANON, [SysV IPC shmget()])]) +APR_IFALLYES(header:sys/mman.h func:mmap func:munmap file:/dev/zero, + [havemmapzero="1" + APR_DECIDE(USE_SHMEM_MMAP_ZERO, + [SVR4-style mmap() on /dev/zero])]) +APR_IFALLYES(header:sys/mman.h func:mmap func:munmap define:MAP_ANON, + [havemmapanon="1" + APR_DECIDE(USE_SHMEM_MMAP_ANON, + [4.4BSD-style mmap() via MAP_ANON])]) +APR_IFALLYES(header:os2.h, + [haveos2shm="1" + APR_DECIDE(USE_SHMEM_OS2_ANON, [OS/2 DosAllocSharedMem()])]) +APR_IFALLYES(header:kernel/OS.h func:create_area, + [havebeosshm="1" + APR_DECIDE(USE_SHMEM_BEOS_ANON, + [BeOS areas])]) +case $host in + *linux* ) + # Linux has problems with MM_SHMT_MMANON even though it reports + # that it has it. + # FIXME - find exact 2.3 version that MMANON was fixed in. It is + # confirmed fixed in 2.4 series. + if test $os_version -le "240"; then + APR_DECISION_OVERRIDE(USE_SHMEM_MMAP_ZERO USE_SHMEM_SHMGET_ANON) + fi + ;; + *hpux11* ) + APR_DECISION_OVERRIDE(USE_SHMEM_SHMGET_ANON) + ;; +esac +APR_END_DECISION +AC_DEFINE_UNQUOTED($ac_decision) + +useshmgetanon="0" +usemmapzero="0" +usemmapanon="0" + +case $ac_decision in + USE_SHMEM_SHMGET_ANON ) + useshmgetanon="1" + ;; + USE_SHMEM_MMAP_ZERO ) + usemmapzero="1" + ;; + USE_SHMEM_MMAP_ANON ) + usemmapanon="1" + ;; +esac + +AC_SUBST(useshmgetanon) +AC_SUBST(usemmapzero) +AC_SUBST(usemmapanon) +AC_SUBST(haveshmgetanon) +AC_SUBST(havemmapzero) +AC_SUBST(havemmapanon) + +# Now we determine which one is our name-based shmem preference. +havemmaptmp="0" +havemmapshm="0" +haveshmget="0" +havebeosarea="0" +haveos2shm="0" +APR_BEGIN_DECISION([namebased memory allocation method]) +APR_IFALLYES(header:sys/mman.h func:mmap func:munmap, + [havemmaptmp="1" + APR_DECIDE(USE_SHMEM_MMAP_TMP, + [Classical mmap() on temporary file])]) +APR_IFALLYES(header:sys/mman.h func:mmap func:munmap func:shm_open dnl + func:shm_unlink, + [havemmapshm="1" + APR_DECIDE(USE_SHMEM_MMAP_SHM, + [mmap() via POSIX.1 shm_open() on temporary file])]) +APR_IFALLYES(header:sys/ipc.h header:sys/shm.h header:sys/file.h dnl + func:shmget func:shmat func:shmdt func:shmctl, + [haveshmget="1" + APR_DECIDE(USE_SHMEM_SHMGET, [SysV IPC shmget()])]) +APR_IFALLYES(header:kernel/OS.h func:create_area, + [havebeosshm="1" + APR_DECIDE(USE_SHMEM_BEOS, [BeOS areas])]) +APR_IFALLYES(header:os2.h, + [haveos2shm="1" + APR_DECIDE(USE_SHMEM_OS2, [OS/2 DosAllocSharedMem()])]) +case $host in + *linux* ) + # Linux has problems with MM_SHMT_MMANON even though it reports + # that it has it. + # FIXME - find exact 2.3 version that MMANON was fixed in. It is + # confirmed fixed in 2.4 series. + if test $os_version -le "240"; then + APR_DECISION_OVERRIDE(USE_SHMEM_MMAP_TMP USE_SHMEM_MMAP_SHM dnl + USE_SHMEM_SHMGET) + fi + ;; +esac +APR_END_DECISION +AC_DEFINE_UNQUOTED($ac_decision) + +usemmaptmp="0" +usemmapshm="0" +useshmget="0" +usebeosarea="0" +useos2shm="0" + +case $ac_decision in + USE_SHMEM_MMAP_TMP ) + usemmaptmp="1" + ;; + USE_SHMEM_MMAP_SHM ) + usemmapshm="1" + ;; + USE_SHMEM_SHMGET ) + useshmget="1" + ;; + USE_SHMEM_BEOS ) + usebeosarea="1" + ;; + USE_SHMEM_OS2 ) + useos2shm="1" + ;; +esac + +# Do we have any shared memory support? +if test "$usemmaptmp$usemmapshm$usemmapzero$useshmget$usemmapanon$usebeosarea$useos2shm" = "0000000"; then + sharedmem="0" +else + sharedmem="1" +fi + +AC_SUBST(usemmaptmp) +AC_SUBST(usemmapshm) +AC_SUBST(useshmget) +AC_SUBST(usebeosarea) +AC_SUBST(useos2shm) +AC_SUBST(havemmaptmp) +AC_SUBST(havemmapshm) +AC_SUBST(haveshmget) +AC_SUBST(havebeosarea) +AC_SUBST(haveos2shm) +AC_SUBST(sharedmem) + +dnl ----------------------------- Checks for Any required Functions +dnl Checks for library functions. (N.B. poll is further down) +AC_CHECK_FUNCS(alloca calloc strcasecmp stricmp setsid isinf isnan) +AC_CHECK_FUNCS(getenv putenv setenv unsetenv) +AC_CHECK_FUNCS(setrlimit, [ have_setrlimit="1" ], [ have_setrlimit="0" ]) +AC_CHECK_FUNCS(getrlimit, [ have_getrlimit="1" ], [ have_getrlimit="0" ]) +AC_CHECK_FUNCS(writev) +sendfile="0" +AC_CHECK_LIB(sendfile, sendfilev) +AC_CHECK_FUNCS(sendfile send_file sendfilev, [ sendfile="1" ]) +AC_CHECK_FUNCS(utime utimes) + +dnl THIS MUST COME AFTER THE THREAD TESTS - FreeBSD doesn't always have a +dnl threaded poll() and we don't want to use sendfile on early FreeBSD +dnl systems if we are also using threads. + +AC_ARG_WITH(sendfile, [ --with-sendfile Override decision to use sendfile], + [ if test "$withval" = "yes"; then + sendfile="1" + else + sendfile="0" + fi ], [ + orig_sendfile=$sendfile + case $host in + *freebsd*) + # FreeBSD < 4.2 has issues with threads+sendfile + if test $os_version -le "401999"; then + if test "$threads" = "1"; then + sendfile="0" + fi + fi + ;; + *alpha*-dec-osf* ) + sendfile="0" + ;; + s390-*-linux-gnu) + # disable sendfile support for 2.2 on S/390 + if test $os_version -lt 240; then + sendfile="0" + fi + ;; + *aix*) + # compiler-independent check for 64-bit build + AC_CHECK_SIZEOF(void*, 4) + if test "x$ac_cv_sizeof_voidp" = "x8"; then + # sendfile not working for 64-bit build + sendfile="0" + fi + ;; + *darwin*) + # darwin semantics in 9.0.0 appear to be fubar + sendfile="0" + ;; + esac + if test "$orig_sendfile" != "$sendfile"; then + echo "sendfile support disabled to avoid system problem" + fi ] ) +AC_SUBST(sendfile) + +AC_CHECK_FUNCS(sigaction, [ have_sigaction="1" ], [ have_sigaction="0" ]) +AC_DECL_SYS_SIGLIST + +AC_CHECK_FUNCS(fork, [ fork="1" ], [ fork="0" ]) +APR_CHECK_INET_ADDR +APR_CHECK_INET_NETWORK +AC_SUBST(apr_inaddr_none) +AC_CHECK_FUNC(_getch) +AC_CHECK_FUNCS(strerror_r, [ strerror_r="1" ], [ strerror_r="0" ]) +if test "$strerror_r" = "1"; then + APR_CHECK_STRERROR_R_RC +fi +AC_CHECK_FUNCS(crypt_r, [ crypt_r="1" ], [ crypt_r="0" ]) +if test "$crypt_r" = "1"; then + APR_CHECK_CRYPT_R_STYLE +fi +AC_CHECK_FUNCS(mmap, [ mmap="1" ], [ mmap="0" ]) +if test "$native_mmap_emul" = "1"; then + mmap="1" +fi +AC_CHECK_FUNCS(memmove, [ have_memmove="1" ], [have_memmove="0" ]) +AC_CHECK_FUNCS([getpass getpassphrase gmtime_r localtime_r hstrerror mkstemp]) + +AC_SUBST(fork) +AC_SUBST(have_inet_addr) +AC_SUBST(tcp_nodelay_inherited) +AC_SUBST(o_nonblock_inherited) +AC_SUBST(have_inet_network) +AC_SUBST(have_sigaction) +AC_SUBST(have_setrlimit) +AC_SUBST(have_getrlimit) +AC_SUBST(mmap) +AC_SUBST(have_memmove) + +APR_CHECK_SIGWAIT_ONE_ARG +APR_CHECK_DIRENT_INODE +APR_CHECK_DIRENT_TYPE + +dnl ----------------------------- Checks for Any required Headers +AC_HEADER_STDC + +APR_FLAG_HEADERS( + alloca.h \ + ByteOrder.h \ + conio.h \ + crypt.h \ + ctype.h \ + dir.h \ + dirent.h \ + dl.h \ + dlfcn.h \ + errno.h \ + fcntl.h \ + grp.h \ + io.h \ + limits.h \ + mach-o/dyld.h \ + malloc.h \ + memory.h \ + netdb.h \ + osreldate.h \ + poll.h \ + process.h \ + pwd.h \ + semaphore.h \ + signal.h \ + stdarg.h \ + stddef.h \ + stdio.h \ + stdlib.h \ + string.h \ + strings.h \ + sysapi.h \ + sysgtime.h \ + termios.h \ + time.h \ + tpfeq.h \ + tpfio.h \ + unistd.h \ + unix.h \ + arpa/inet.h \ + kernel/OS.h \ + net/errno.h \ + netinet/in.h \ + netinet/sctp.h \ + netinet/sctp_uio.h \ + sys/file.h \ + sys/ioctl.h \ + sys/mman.h \ + sys/poll.h \ + sys/resource.h \ + sys/select.h \ + sys/sem.h \ + sys/sendfile.h \ + sys/signal.h \ + sys/socket.h \ + sys/sockio.h \ + sys/stat.h \ + sys/sysctl.h \ + sys/syslimits.h \ + sys/time.h \ + sys/types.h \ + sys/uio.h \ + sys/un.h \ + sys/wait.h) + +# IRIX 6.5 has a problem in which prevents it from +# being included by itself. Check for manually, +# including another header file first. +AC_CACHE_CHECK([for netinet/tcp.h], [apr_cv_hdr_netinet_tcp_h], +[AC_TRY_CPP( +[#ifdef HAVE_NETINET_IN_H +#include +#endif +#include +], [apr_cv_hdr_netinet_tcp_h=yes], [apr_cv_hdr_netinet_tcp_h=no])]) +if test "$apr_cv_hdr_netinet_tcp_h" = "yes"; then + netinet_tcph=1 + AC_DEFINE([HAVE_NETINET_TCP_H], 1, [Defined if netinet/tcp.h is present]) +else + netinet_tcph=0 +fi + +AC_SUBST(arpa_ineth) +AC_SUBST(conioh) +AC_SUBST(ctypeh) +AC_SUBST(crypth) +AC_SUBST(errnoh) +AC_SUBST(direnth) +AC_SUBST(fcntlh) +AC_SUBST(ioh) +AC_SUBST(limitsh) +AC_SUBST(netdbh) +AC_SUBST(sys_syslimitsh) +AC_SUBST(netinet_inh) +AC_SUBST(netinet_sctph) +AC_SUBST(netinet_sctp_uioh) +AC_SUBST(netinet_tcph) +AC_SUBST(stdargh) +AC_SUBST(stdioh) +AC_SUBST(stdlibh) +AC_SUBST(stringh) +AC_SUBST(stringsh) +AC_SUBST(sys_ioctlh) +AC_SUBST(sys_sendfileh) +AC_SUBST(sys_signalh) +AC_SUBST(sys_socketh) +AC_SUBST(sys_sockioh) +AC_SUBST(sys_typesh) +AC_SUBST(sys_timeh) +AC_SUBST(sys_uioh) +AC_SUBST(sys_unh) +AC_SUBST(timeh) +AC_SUBST(unistdh) +AC_SUBST(signalh) +AC_SUBST(sys_waith) +AC_SUBST(pthreadh) +AC_SUBST(semaphoreh) + +# Checking for h_errno in +if test "$netdbh" = "1"; then + APR_CHECK_H_ERRNO_FLAG + if test "$ac_cv_h_errno_cflags" = "no"; then + AC_MSG_ERROR([can not find h_errno in netdb.h]) + fi +fi + +dnl ----------------------------- Checks for standard typedefs +AC_TYPE_OFF_T +AC_TYPE_PID_T +AC_TYPE_SIZE_T +AC_TYPE_UID_T +AC_CHECK_TYPE(ssize_t, int) +AC_C_INLINE +AC_C_CONST +AC_TYPE_SIZE_T +AC_FUNC_SETPGRP + +APR_CHECK_SOCKLEN_T + +APR_INADDR_NONE + +dnl Checks for pointer size +AC_CHECK_SIZEOF(void*, 4) + +if test "x$ac_cv_sizeof_voidp" != "x"; then + voidp_size=$ac_cv_sizeof_voidp +else + AC_ERROR([Cannot determine size of void*]) +fi + +dnl Checks for integer size +AC_CHECK_SIZEOF(char, 1) +AC_CHECK_SIZEOF(int, 4) +AC_CHECK_SIZEOF(long, 4) +AC_CHECK_SIZEOF(short, 2) +AC_CHECK_SIZEOF(long double, 12) +AC_CHECK_SIZEOF(long long, 8) + +if test "$ac_cv_sizeof_short" = "2"; then + short_value=short +fi +if test "$ac_cv_sizeof_int" = "4"; then + int_value=int +fi +# Now we need to find what apr_int64_t (sizeof == 8) will be. +# The first match is our preference. +if test "$ac_cv_sizeof_int" = "8"; then + int64_literal='#define APR_INT64_C(val) (val)' + int64_t_fmt='#define APR_INT64_T_FMT "d"' + int64_t_fmt_len='#define APR_INT64_T_FMT_LEN 1' + uint64_t_fmt='#define APR_UINT64_T_FMT "u"' + uint64_t_fmt_len='#define APR_UINT64_T_FMT_LEN 1' + uint64_t_hex_fmt='#define APR_UINT64_T_HEX_FMT "x"' + int64_value="int" + long_value=int + int64_strfn="strtoi" +elif test "$ac_cv_sizeof_long" = "8"; then + int64_literal='#define APR_INT64_C(val) (val##L)' + int64_t_fmt='#define APR_INT64_T_FMT "ld"' + int64_t_fmt_len='#define APR_INT64_T_FMT_LEN 2' + uint64_t_fmt='#define APR_UINT64_T_FMT "lu"' + uint64_t_fmt_len='#define APR_UINT64_T_FMT_LEN 2' + uint64_t_hex_fmt='#define APR_UINT64_T_HEX_FMT "lx"' + int64_value="long" + long_value=long + int64_strfn="strtol" +elif test "$ac_cv_sizeof_long_long" = "8"; then + int64_literal='#define APR_INT64_C(val) (val##LL)' + # Linux, Solaris, FreeBSD all support ll with printf. + # BSD 4.4 originated 'q'. Solaris is more popular and + # doesn't support 'q'. Solaris wins. Exceptions can + # go to the OS-dependent section. + int64_t_fmt='#define APR_INT64_T_FMT "lld"' + int64_t_fmt_len='#define APR_INT64_T_FMT_LEN 3' + uint64_t_fmt='#define APR_UINT64_T_FMT "llu"' + uint64_t_fmt_len='#define APR_UINT64_T_FMT_LEN 3' + uint64_t_hex_fmt='#define APR_UINT64_T_HEX_FMT "llx"' + int64_value="long long" + long_value="long long" + int64_strfn="strtoll" +elif test "$ac_cv_sizeof_long_double" = "8"; then + int64_literal='#define APR_INT64_C(val) (val##LD)' + int64_t_fmt='#define APR_INT64_T_FMT "Ld"' + int64_t_fmt_len='#define APR_INT64_T_FMT_LEN 2' + uint64_t_fmt='#define APR_UINT64_T_FMT "Lu"' + uint64_t_fmt_len='#define APR_UINT64_T_FMT_LEN 2' + uint64_t_hex_fmt='#define APR_UINT64_T_HEX_FMT "Lx"' + int64_value="long double" + long_value="long double" + int64_strfn="strtoll" +elif test "$ac_cv_sizeof_longlong" = "8"; then + int64_literal='#define APR_INT64_C(val) (val##LL)' + int64_t_fmt='#define APR_INT64_T_FMT "qd"' + int64_t_fmt_len='#define APR_INT64_T_FMT_LEN 2' + uint64_t_fmt='#define APR_UINT64_T_FMT "qu"' + uint64_t_fmt_len='#define APR_UINT64_T_FMT_LEN 2' + uint64_t_hex_fmt='#define APR_UINT64_T_HEX_FMT "qx"' + int64_value="__int64" + long_value="__int64" + int64_strfn="strtoll" +else + # int64_literal may be overriden if your compiler thinks you have + # a 64-bit value but APR does not agree. + int64_literal='#error Can not determine the proper size for apr_int64_t' + int64_t_fmt='#error Can not determine the proper size for apr_int64_t' + int64_t_fmt_len='#error Can not determine the proper size for apr_int64_t' + uint64_t_fmt='#error Can not determine the proper size for apr_int64_t' + uint64_t_fmt_len='#error Can not determine the proper size for apr_int64_t' + uint64_t_hex_fmt='#error Can not determine the proper size for apr_uint64_t' +fi + +# If present, allow the C99 macro INT64_C to override our conversion. +# +# HP-UX's ANSI C compiler provides this without any includes, so we +# will first look for INT64_C without adding stdint.h +AC_CACHE_CHECK([for INT64_C], [apr_cv_define_INT64_C], [ +AC_EGREP_CPP(YES_IS_DEFINED, +[#ifdef INT64_C +YES_IS_DEFINED +#endif], [apr_cv_define_INT64_C=yes], [ + # Now check for INT64_C in stdint.h + AC_EGREP_CPP(YES_IS_DEFINED, [#include +#ifdef INT64_C +YES_IS_DEFINED +#endif], [apr_cv_define_INT64_C=yes], [apr_cv_define_INT64_C=no])])]) + +if test "$apr_cv_define_INT64_C" = "yes"; then + int64_literal='#define APR_INT64_C(val) INT64_C(val)' + stdint=1 +else + stdint=0 +fi + +if test "$ac_cv_type_size_t" = "yes"; then + size_t_value="size_t" +else + size_t_value="apr_int32_t" +fi +if test "$ac_cv_type_ssize_t" = "yes"; then + ssize_t_value="ssize_t" +else + ssize_t_value="apr_int32_t" +fi +if test "$ac_cv_socklen_t" = "yes"; then + socklen_t_value="socklen_t" + case $host in + *-hp-hpux*) + if test "$ac_cv_sizeof_long" = "8"; then + # 64-bit HP-UX requires 32-bit socklens in + # kernel, but user-space declarations say + # 64-bit (socklen_t == size_t == long). + # This will result in many compile warnings, + # but we're functionally busted otherwise. + socklen_t_value="int" + fi + ;; + esac +else + socklen_t_value="int" +fi + +APR_CHECK_SIZEOF_EXTENDED([#include ], ssize_t, 8) + +if test "$ac_cv_sizeof_ssize_t" = "$ac_cv_sizeof_int"; then + ssize_t_fmt='#define APR_SSIZE_T_FMT "d"' +elif test "$ac_cv_sizeof_ssize_t" = "$ac_cv_sizeof_long"; then + ssize_t_fmt='#define APR_SSIZE_T_FMT "ld"' +else + ssize_t_fmt='#error Can not determine the proper size for ssize_t' +fi + +APR_CHECK_SIZEOF_EXTENDED([#include ], size_t, 8) + +if test "$ac_cv_sizeof_size_t" = "$ac_cv_sizeof_int"; then + size_t_fmt='#define APR_SIZE_T_FMT "d"' +elif test "$ac_cv_sizeof_size_t" = "$ac_cv_sizeof_long"; then + size_t_fmt='#define APR_SIZE_T_FMT "ld"' +else + size_t_fmt='#error Can not determine the proper size for size_t' +fi + +if test "$ac_cv_type_off_t" = "yes"; then + APR_CHECK_SIZEOF_EXTENDED([#include ], off_t, 8) + AC_MSG_CHECKING([which type to use for apr_off_t]) + if test "${ac_cv_sizeof_off_t}${ac_cv_sizeof_long}" = "44"; then + # Special case: off_t may change size with _FILE_OFFSET_BITS + # on 32-bit systems with LFS support. To avoid compatibility + # issues when other packages do define _FILE_OFFSET_BITS, + # hard-code apr_off_t to long. + off_t_value=long + off_t_fmt='#define APR_OFF_T_FMT "ld"' + else + off_t_value=off_t + # off_t is more commonly a long than an int; prefer that case + # where int and long are the same size. + if test "$ac_cv_sizeof_off_t" = "$ac_cv_sizeof_long"; then + off_t_fmt='#define APR_OFF_T_FMT "ld"' + elif test "$ac_cv_sizeof_off_t" = "$ac_cv_sizeof_int"; then + off_t_fmt='#define APR_OFF_T_FMT "d"' + elif test "$ac_cv_sizeof_off_t" = "$ac_cv_sizeof_long_long"; then + off_t_fmt='#define APR_OFF_T_FMT APR_INT64_T_FMT' + else + AC_ERROR([could not determine the size of off_t]) + fi + fi + AC_MSG_RESULT([$off_t_value]) + + dnl define apr_ino_t in a manner independent of _FILE_OFFSET_BITS setting + dnl default fallback + ino_t_value=ino_t + APR_CHECK_TYPES_COMPATIBLE(ino_t, unsigned long long, ino_t_value="unsigned long long") + APR_CHECK_TYPES_COMPATIBLE(ino_t, unsigned long, ino_t_value="unsigned long") + APR_CHECK_TYPES_COMPATIBLE(ino_t, unsigned int, ino_t_value="unsigned int") + +else + off_t_value='apr_int32_t' + off_t_fmt='#define APR_OFF_T_FMT "d"' +fi + +APR_CHECK_SIZEOF_EXTENDED([#include ], pid_t, 8) + +if test "$ac_cv_sizeof_pid_t" = "$ac_cv_sizeof_short"; then + pid_t_fmt='#define APR_PID_T_FMT "hd"' +elif test "$ac_cv_sizeof_pid_t" = "$ac_cv_sizeof_int"; then + pid_t_fmt='#define APR_PID_T_FMT "d"' +elif test "$ac_cv_sizeof_pid_t" = "$ac_cv_sizeof_long"; then + pid_t_fmt='#define APR_PID_T_FMT "ld"' +elif test "$ac_cv_sizeof_pid_t" = "$ac_cv_sizeof_long_long"; then + pid_t_fmt='#define APR_PID_T_FMT APR_INT64_T_FMT' +else + pid_t_fmt='#error Can not determine the proper size for pid_t' +fi + +# Basically, we have tried to figure out the correct format strings +# for APR types which vary between platforms, but we don't always get +# it right. If you find that we don't get it right for your platform, +# you can override our decision below. +case $host in + *linux*) + case $host in + s390*) + size_t_fmt='#define APR_SIZE_T_FMT "ld"' + ;; + esac + ;; + *os2_emx) + size_t_fmt='#define APR_SIZE_T_FMT "lu"' + ;; + *-solaris*) + pid_t_fmt='#define APR_PID_T_FMT "ld"' + ;; + *aix4*|*aix5*) + ssize_t_fmt='#define APR_SSIZE_T_FMT "ld"' + size_t_fmt='#define APR_SIZE_T_FMT "lu"' + ;; + *beos*) + ssize_t_fmt='#define APR_SSIZE_T_FMT "ld"' + size_t_fmt='#define APR_SIZE_T_FMT "ld"' + ;; + *apple-darwin*) + osver=`uname -r` + case $osver in + [[0-7]].*) + ssize_t_fmt='#define APR_SSIZE_T_FMT "d"' + ;; + *) + ssize_t_fmt='#define APR_SSIZE_T_FMT "ld"' + ;; + esac + size_t_fmt='#define APR_SIZE_T_FMT "lu"' + ;; +esac + +AC_SUBST(voidp_size) +AC_SUBST(short_value) +AC_SUBST(int_value) +AC_SUBST(long_value) +AC_SUBST(int64_value) +AC_SUBST(off_t_value) +AC_SUBST(size_t_value) +AC_SUBST(ssize_t_value) +AC_SUBST(socklen_t_value) +AC_SUBST(int64_t_fmt) +AC_SUBST(int64_t_fmt_len) +AC_SUBST(uint64_t_fmt) +AC_SUBST(uint64_t_fmt_len) +AC_SUBST(uint64_t_hex_fmt) +AC_SUBST(ssize_t_fmt) +AC_SUBST(size_t_fmt) +AC_SUBST(off_t_fmt) +AC_SUBST(pid_t_fmt) +AC_SUBST(int64_literal) +AC_SUBST(stdint) +AC_SUBST(ino_t_value) + +dnl ----------------------------- Checking for string functions +AC_CHECK_FUNCS(strnicmp, have_strnicmp="1", have_strnicmp="0") +AC_CHECK_FUNCS(strncasecmp, have_strncasecmp="1", have_strncasecmp="0") +AC_CHECK_FUNCS(stricmp, have_stricmp="1", have_stricmp="0") +AC_CHECK_FUNCS(strcasecmp, have_strcasecmp="1", have_strcasecmp="0") +AC_CHECK_FUNCS(strdup, have_strdup="1", have_strdup="0") +AC_CHECK_FUNCS(strstr, have_strstr="1", have_strstr="0") +AC_CHECK_FUNCS(memchr, have_memchr="1", have_memchr="0") +AC_CHECK_FUNCS($int64_strfn, have_int64_strfn="1", have_int64_strfn="0") + +dnl ----------------------------- We have a fallback position +if test "$have_int64_strfn" = "0" && test "$int64_strfn" = "strtoll"; then + int64_strfn="strtoq" + AC_CHECK_FUNCS($int64_strfn, have_int64_strfn="1", have_int64_strfn="0") +fi + +AC_SUBST(have_strnicmp) +AC_SUBST(have_strncasecmp) +AC_SUBST(have_stricmp) +AC_SUBST(have_strcasecmp) +AC_SUBST(have_strdup) +AC_SUBST(have_strstr) +AC_SUBST(have_memchr) +AC_SUBST(have_int64_strfn) +AC_SUBST(int64_strfn) + +dnl ----------------------------- Checking for DSO support +echo "${nl}Checking for DSO..." +AC_ARG_ENABLE(dso, + [ --disable-dso Disable DSO support ], + [ tempdso=$enableval], + [ + AC_CHECK_FUNCS(NSLinkModule, [ tempdso="dyld" ], [ tempdso="no" ]) + if test "$tempdso" = "no"; then + AC_CHECK_LIB(dld, shl_load, [ tempdso="shl" APR_ADDTO(LIBS,-ldld) ], + tempdso="no") + fi + if test "$tempdso" = "no"; then + AC_CHECK_FUNCS(dlopen, [ tempdso="dlfcn" ], [ tempdso="no" ]) + fi + if test "$tempdso" = "no"; then + AC_CHECK_LIB(dl, dlopen, [ tempdso="dlfcn" APR_ADDTO(LIBS,-ldl) ], + tempdso="no") + fi + if test "$tempdso" = "dlfcn"; then + # ReliantUnix has dlopen() in libc but dlsym() in libdl :( + AC_CHECK_FUNCS(dlsym, [ tempdso="dlfcn" ], [ tempdso="no" ]) + if test "$tempdso" = "no"; then + AC_CHECK_LIB(dl, dlsym, [ tempdso="dlfcn" APR_ADDTO(LIBS, -ldl) ], + tempdso="no") + fi + if test "$tempdso" = "no"; then + echo "Weird: dlopen() was found but dlsym() was not found!" + fi + fi + if test "$tempdso" = "no"; then + AC_CHECK_LIB(root, load_image, tempdso="yes", tempdso="no") + fi + if test "$tempdso" = "no"; then + case $host in + *os390|*-os2*|*os400) + tempdso="yes" + ;; + esac + fi + ] ) + +if test "$tempdso" = "no"; then + aprdso="0" +else + case "$tempdso" in + dlfcn) AC_DEFINE(DSO_USE_DLFCN, 1, [Define if DSO support uses dlfcn.h]);; + shl) AC_DEFINE(DSO_USE_SHL, 1, [Define if DSO support uses shl_load]);; + dyld) AC_DEFINE(DSO_USE_DYLD, 1, [Define if DSO support uses dyld.h]);; + esac + aprdso="1" + apr_modules="$apr_modules dso" +fi + +AC_SUBST(aprdso) + +dnl ----------------------------- Checking for Processes +echo "${nl}Checking for Processes..." + +AC_CHECK_FUNCS(waitpid) + +AC_ARG_ENABLE(other-child, + [ --enable-other-child Enable reliable child processes ], + [ if test "$enableval" = "yes"; then + oc="1" + else + oc="0" + fi ], + [ oc=1 ] ) + +AC_SUBST(oc) + +AC_MSG_CHECKING(for Variable Length Arrays) +APR_TRY_COMPILE_NO_WARNING([], +[ + int foo[argc]; + foo[0] = 0; +], vla_msg=yes, vla_msg=no ) +AC_MSG_RESULT([$vla_msg]) +if test "$vla_msg" = "yes"; then + AC_DEFINE(HAVE_VLA, 1, [Define if C compiler supports VLA]) +fi + +AC_CACHE_CHECK(struct rlimit,ac_cv_struct_rlimit,[ +AC_TRY_RUN([ +#include +#include +#include +main() +{ + struct rlimit limit; + limit.rlim_cur = 0; + limit.rlim_max = 0; + exit(0); +}], [ + ac_cv_struct_rlimit=yes ], [ + ac_cv_struct_rlimit=no ], [ + ac_cv_struct_rlimit=no ] ) ] ) +struct_rlimit=0 +test "x$ac_cv_struct_rlimit" = xyes && struct_rlimit=1 +AC_SUBST(struct_rlimit) + +dnl ----------------------------- Checking for Locking Characteristics +echo "${nl}Checking for Locking..." + +AC_CHECK_FUNCS(semget semctl flock) +AC_CHECK_HEADERS(semaphore.h) +AC_CHECK_FUNCS(sem_close sem_unlink sem_post sem_wait) + +# Some systems return ENOSYS from sem_open. +AC_CACHE_CHECK(for working sem_open,ac_cv_func_sem_open,[ +AC_TRY_RUN([ +#include +#include +#include +#include +main() +{ + sem_t *psem; + const char *sem_name = "/apr_autoconf"; + + if (sizeof(int) < sizeof(sem_t *)) + exit(1); + psem = sem_open(sem_name, O_CREAT, 0644, 1); + if (psem == (sem_t *)SEM_FAILED) { + exit(1); + } + sem_close(psem); + sem_unlink(sem_name); + exit(0); +}], [ac_cv_func_sem_open=yes], [ac_cv_func_sem_open=no], +[ac_cv_func_sem_open=no])]) + +# It's stupid, but not all platforms have union semun, even those that need it. +AC_MSG_CHECKING(for union semun in sys/sem.h) +AC_TRY_COMPILE([ +#include +#include +#include +],[ +union semun arg; +semctl(0, 0, 0, arg); +], [have_union_semun="1" union_semun=yes ] +msg=yes, [ +have_union_semun="0" +msg=no ] ) +AC_MSG_RESULT([$msg]) +AC_SUBST(have_union_semun) + +dnl Checks for libraries. +APR_CHECK_DEFINE(LOCK_EX, sys/file.h) +APR_CHECK_DEFINE(F_SETLK, fcntl.h) +APR_CHECK_DEFINE(SEM_UNDO, sys/sem.h) + +# We are assuming that if the platform doesn't have POLLIN, it doesn't have +# any POLL definitions. +APR_CHECK_DEFINE_FILES(POLLIN, poll.h sys/poll.h) + +if test "$threads" = "1"; then + APR_CHECK_DEFINE(PTHREAD_PROCESS_SHARED, pthread.h) + AC_CHECK_FUNCS(pthread_mutexattr_setpshared) + # Some systems have setpshared and define PROCESS_SHARED, but don't + # really support PROCESS_SHARED locks. So, we must validate that we + # can go through the steps without receiving some sort of system error. + # Linux and older versions of AIX have this problem. + APR_IFALLYES(header:pthread.h define:PTHREAD_PROCESS_SHARED func:pthread_mutexattr_setpshared, [ + AC_CACHE_CHECK([for working PROCESS_SHARED locks], apr_cv_process_shared_works, [ + AC_TRY_RUN([ +#include +#include + int main() + { + pthread_mutex_t mutex; + pthread_mutexattr_t attr; + if (pthread_mutexattr_init(&attr)) + exit(1); + if (pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED)) + exit(2); + if (pthread_mutex_init(&mutex, &attr)) + exit(3); + if (pthread_mutexattr_destroy(&attr)) + exit(4); + if (pthread_mutex_destroy(&mutex)) + exit(5); + exit(0); + }], [apr_cv_process_shared_works=yes], [apr_cv_process_shared_works=no])]) + # Override detection of pthread_mutexattr_setpshared + ac_cv_func_pthread_mutexattr_setpshared=$apr_cv_process_shared_works]) + + if test "$ac_cv_func_pthread_mutexattr_setpshared" = "yes"; then + APR_CHECK_PTHREAD_ROBUST_SHARED_MUTEX + fi +fi + +# See which lock mechanisms we can support on this system. +APR_IFALLYES(header:semaphore.h func:sem_open func:sem_close dnl + func:sem_unlink func:sem_post func:sem_wait, + hasposixser="1", hasposixser="0") +APR_IFALLYES(func:semget func:semctl define:SEM_UNDO, hassysvser="1", + hassysvser="0") +APR_IFALLYES(func:flock define:LOCK_EX, hasflockser="1", hasflockser="0") +APR_IFALLYES(header:fcntl.h define:F_SETLK, hasfcntlser="1", hasfcntlser="0") +# note: the current APR use of shared mutex requires /dev/zero +APR_IFALLYES(header:pthread.h define:PTHREAD_PROCESS_SHARED dnl + func:pthread_mutexattr_setpshared dnl + file:/dev/zero, + hasprocpthreadser="1", hasprocpthreadser="0") +APR_IFALLYES(struct:pthread_rw, hasrwlockser="1", hasrwlockser="0") + +# See which lock mechanism we'll select by default on this system. +# The last APR_DECIDE to execute sets the default. +# At this stage, we match the ordering in Apache 1.3 +# which is (highest to lowest): sysvsem -> fcntl -> flock. +# POSIX semaphores and cross-process pthread mutexes are not +# used by default since they have less desirable behaviour when +# e.g. a process holding the mutex segfaults. +APR_BEGIN_DECISION([apr_lock implementation method]) +APR_IFALLYES(func:flock define:LOCK_EX, + APR_DECIDE(USE_FLOCK_SERIALIZE, [4.2BSD-style flock()])) +APR_IFALLYES(header:fcntl.h define:F_SETLK, + APR_DECIDE(USE_FCNTL_SERIALIZE, [SVR4-style fcntl()])) +APR_IFALLYES(func:semget func:semctl define:SEM_UNDO, + APR_DECIDE(USE_SYSVSEM_SERIALIZE, [SysV IPC semget()])) +if test "x$apr_lock_method" != "x"; then + APR_DECISION_FORCE($apr_lock_method) +fi +APR_END_DECISION +AC_DEFINE_UNQUOTED($ac_decision) + +flockser="0" +sysvser="0" +posixser="0" +procpthreadser="0" +fcntlser="0" +case $ac_decision in + USE_FLOCK_SERIALIZE ) + flockser="1" + ;; + USE_FCNTL_SERIALIZE ) + fcntlser="1" + ;; + USE_SYSVSEM_SERIALIZE ) + sysvser="1" + ;; + USE_POSIXSEM_SERIALIZE ) + posixser="1" + ;; + USE_PROC_PTHREAD_SERIALIZE ) + procpthreadser="1" + ;; +esac + +AC_SUBST(hasflockser) +AC_SUBST(hassysvser) +AC_SUBST(hasposixser) +AC_SUBST(hasfcntlser) +AC_SUBST(hasprocpthreadser) +AC_SUBST(hasrwlockser) +AC_SUBST(flockser) +AC_SUBST(sysvser) +AC_SUBST(posixser) +AC_SUBST(fcntlser) +AC_SUBST(procpthreadser) +AC_SUBST(pthreadser) + +AC_MSG_CHECKING(if all interprocess locks affect threads) +if test "x$apr_process_lock_is_global" = "xyes"; then + proclockglobal="1" + AC_MSG_RESULT(yes) +else + proclockglobal="0" + AC_MSG_RESULT(no) +fi + +AC_SUBST(proclockglobal) + +AC_MSG_CHECKING(if POSIX sems affect threads in the same process) +if test "x$apr_posixsem_is_global" = "xyes"; then + AC_DEFINE(POSIXSEM_IS_GLOBAL, 1, + [Define if POSIX semaphores affect threads within the process]) + AC_MSG_RESULT(yes) +else + AC_MSG_RESULT(no) +fi + +AC_MSG_CHECKING(if SysV sems affect threads in the same process) +if test "x$apr_sysvsem_is_global" = "xyes"; then + AC_DEFINE(SYSVSEM_IS_GLOBAL, 1, + [Define if SysV semaphores affect threads within the process]) + AC_MSG_RESULT(yes) +else + AC_MSG_RESULT(no) +fi + +AC_MSG_CHECKING(if fcntl locks affect threads in the same process) +if test "x$apr_fcntl_is_global" = "xyes"; then + AC_DEFINE(FCNTL_IS_GLOBAL, 1, + [Define if fcntl locks affect threads within the process]) + AC_MSG_RESULT(yes) +else + AC_MSG_RESULT(no) +fi + +AC_MSG_CHECKING(if flock locks affect threads in the same process) +if test "x$apr_flock_is_global" = "xyes"; then + AC_DEFINE(FLOCK_IS_GLOBAL, 1, + [Define if flock locks affect threads within the process]) + AC_MSG_RESULT(yes) +else + AC_MSG_RESULT(no) +fi + +dnl ----------------------------- Checking for /dev/random +AC_MSG_CHECKING(for entropy source) + +AC_ARG_WITH(egd, + [ --with-egd[[=DIR]] use EGD-compatible socket], + [ AC_DEFINE(HAVE_EGD, 1, [Define if EGD is supported]) + if test "$withval" = "yes"; then + AC_DEFINE_UNQUOTED(EGD_DEFAULT_SOCKET, ["/var/run/egd-pool","/dev/egd-pool","/etc/egd-pool","/etc/entropy"], + [Define to list of paths to EGD sockets]) + else + AC_DEFINE_UNQUOTED(EGD_DEFAULT_SOCKET, ["$withval"]) + fi + AC_MSG_RESULT(EGD-compatible daemon) + rand="1" + ]) + +if test "$rand" != "1"; then + AC_ARG_WITH(devrandom, + [ --with-devrandom[[=DEV]] use /dev/random or compatible [[searches by default]]], + [ apr_devrandom="$withval" ], [ apr_devrandom="yes" ]) + + if test "$apr_devrandom" = "yes"; then + # /dev/random on OpenBSD doesn't provide random data, so + # prefer /dev/arandom, which does; see random(4). + for f in /dev/arandom /dev/random /dev/urandom; do + if test -r $f; then + apr_devrandom=$f + rand=1 + break + fi + done + elif test "$apr_devrandom" != "no"; then + if test -r "$apr_devrandom"; then + rand="1" + else + AC_ERROR([$apr_devrandom not found or unreadable.]) + fi + fi + + if test "$rand" = "1"; then + AC_DEFINE_UNQUOTED(DEV_RANDOM, ["$apr_devrandom"], [Define to path of random device]) + AC_MSG_RESULT([$apr_devrandom]) + fi +fi + +if test "$rand" != "1"; then + case $host in + # we have built in support for OS/2 + *-os2*) + AC_MSG_RESULT([Using OS/2 builtin random]) + rand="1" + ;; + *) + if test "$rand" != "1"; then + if test "$ac_cv_lib_truerand_main" = "yes"; then + AC_DEFINE(HAVE_TRUERAND, 1, [Define if truerand is supported]) + AC_MSG_RESULT(truerand) + rand="1" + else + AC_MSG_RESULT(not found) + rand="0" + fi + fi + ;; + esac +fi + +AC_SUBST(rand) +dnl ----------------------------- Checking for Time Support +echo "${nl}Checking for Time Support..." +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 + +dnl ----------------------------- Checking for Networking Support +echo "${nl}Checking for Networking support..." +AC_MSG_CHECKING(for in_addr in netinet/in.h) +AC_TRY_COMPILE([ +#include +#include +],[ +struct in_addr arg; +arg.s_addr = htonl(INADDR_ANY); +], [ have_in_addr="1" +msg=yes ] , [ have_in_addr="0" +msg=no ]) +AC_MSG_RESULT([$msg]) + +AC_MSG_CHECKING([if fd == socket on this platform]) +if test "x$file_as_socket" != "x0" ; then + file_as_socket="1"; + echo "yes" +else + echo "no" +fi + +AC_SUBST(have_in_addr) +AC_SUBST(file_as_socket) + +# Check the types only if we have gethostbyname_r +if test "$ac_cv_func_gethostbyname_r" = "yes"; then + APR_CHECK_GETHOSTBYNAME_R_STYLE +fi + +APR_CHECK_TCP_NODELAY_INHERITED +APR_CHECK_O_NONBLOCK_INHERITED + +# Look for a way of corking TCP... +APR_CHECK_DEFINE(TCP_CORK, netinet/tcp.h) +APR_CHECK_DEFINE(TCP_NOPUSH, netinet/tcp.h) +apr_tcp_nopush_flag="0" +have_corkable_tcp="0" +if test "x$ac_cv_define_TCP_CORK" = "xyes"; then + apr_tcp_nopush_flag="TCP_CORK" + have_corkable_tcp="1" +else + case $host in + *linux*) + AC_EGREP_CPP(yes,[ +#include +#ifdef TCP_CORK +yes +#endif + ],[ + apr_tcp_nopush_flag="3" + have_corkable_tcp="1" + ]) + ;; + *) + ;; + esac +fi +if test "x$ac_cv_define_TCP_NOPUSH" = "xyes"; then + apr_tcp_nopush_flag="TCP_NOPUSH" + have_corkable_tcp="1" +fi + +APR_CHECK_DEFINE(SO_ACCEPTFILTER, sys/socket.h) +if test "x$ac_cv_define_SO_ACCEPTFILTER" = "xyes"; then + acceptfilter="1" +else + acceptfilter="0" +fi + +APR_CHECK_SCTP + +AC_SUBST(apr_tcp_nopush_flag) +AC_SUBST(have_corkable_tcp) +AC_SUBST(acceptfilter) +AC_SUBST(have_sctp) + +AC_CHECK_FUNCS(set_h_errno) +APR_CHECK_RESOLV_RETRANS + +echo "${nl}Checking for IPv6 Networking support..." +dnl Start of checking for IPv6 support... + +AC_ARG_ENABLE(ipv6, + [ --disable-ipv6 Disable IPv6 support in APR.], + [ if test "$enableval" = "no"; then + user_disabled_ipv6=1 + fi ], + [ user_disabled_ipv6=0 ] ) + +case $host in + *) + broken_ipv6=0 +esac + +AC_SEARCH_LIBS(getaddrinfo, socket inet6) +AC_SEARCH_LIBS(gai_strerror, socket inet6) +AC_SEARCH_LIBS(getnameinfo, socket inet6) +AC_CHECK_FUNCS(gai_strerror) +APR_CHECK_WORKING_GETADDRINFO +APR_CHECK_NEGATIVE_EAI +APR_CHECK_WORKING_GETNAMEINFO +APR_CHECK_SOCKADDR_IN6 + +have_ipv6="0" +if test "$user_disabled_ipv6" = 1; then + ipv6_result="no -- disabled by user" +else + if test "x$broken_ipv6" = "x0"; then + if test "x$have_sockaddr_in6" = "x1"; then + if test "x$ac_cv_working_getaddrinfo" = "xyes"; then + if test "x$ac_cv_working_getnameinfo" = "xyes"; then + have_ipv6="1" + ipv6_result="yes" + else + ipv6_result="no -- no getnameinfo" + fi + else + ipv6_result="no -- no working getaddrinfo" + fi + else + ipv6_result="no -- no sockaddr_in6" + fi + else + ipv6_result="no -- the platform has known problems supporting IPv6" + fi +fi + +AC_MSG_CHECKING(if APR supports IPv6) +AC_MSG_RESULT($ipv6_result) + +AC_SUBST(have_ipv6) + +dnl Check for langinfo support + +AC_CHECK_HEADERS(langinfo.h) +AC_CHECK_FUNCS(nl_langinfo) + +dnl Random late checks... + +# AC_CHECK_FUNCS is not sufficient since the function may be usable when +# struct stat64 is not exposed (e.g. HP-UX). Note that fstat64 only +# happens to be usable on Linux because -D_GNU_SOURCE is picked up +# by the earlier crypt_r check. +AC_CACHE_CHECK([for usable fstat64], [apr_cv_func_fstat64], + [AC_TRY_COMPILE([#include +#include +#include ], [struct stat64 st; fstat64(0, &st);], + [apr_cv_func_fstat64=yes], [apr_cv_func_fstat64=no])]) +if test $apr_cv_func_fstat64 = yes; then + AC_DEFINE(HAVE_FSTAT64, 1, [Define if fstat64 can be used]) +fi + + +dnl ----------------------------- Finalize the variables + +echo "${nl}Restore user-defined environment settings..." + +APR_RESTORE_THE_ENVIRONMENT(CPPFLAGS, EXTRA_) +APR_RESTORE_THE_ENVIRONMENT(CFLAGS, EXTRA_) +APR_RESTORE_THE_ENVIRONMENT(LDFLAGS, EXTRA_) +APR_RESTORE_THE_ENVIRONMENT(LIBS, EXTRA_) +APR_RESTORE_THE_ENVIRONMENT(INCLUDES, EXTRA_) +AC_SUBST(NOTEST_CPPFLAGS) +AC_SUBST(NOTEST_CFLAGS) +AC_SUBST(NOTEST_LDFLAGS) +AC_SUBST(NOTEST_LIBS) +AC_SUBST(NOTEST_INCLUDES) + +dnl ----------------------------- Construct the files + +AC_SUBST(LDLIBS) +AC_SUBST(AR) +AC_SUBST(RM) +AC_SUBST(OSDIR) +AC_SUBST(DEFAULT_OSDIR) +AC_SUBST(EXEEXT) +AC_SUBST(LIBTOOL_LIBS) + +echo "${nl}Construct Makefiles and header files." +MAKEFILE1="Makefile strings/Makefile passwd/Makefile tables/Makefile build/Makefile" +SUBDIRS="strings passwd tables " +for dir in $apr_modules +do + test -d $dir || $MKDIR $dir + if test -f $srcdir/$dir/$OSDIR/Makefile.in; then + MAKEFILE2="$MAKEFILE2 $dir/$OSDIR/Makefile " + SUBDIRS="$SUBDIRS $dir/$OSDIR " + else + MAKEFILE2="$MAKEFILE2 $dir/$DEFAULT_OSDIR/Makefile " + SUBDIRS="$SUBDIRS $dir/$DEFAULT_OSDIR " + fi +done + +if test -d $srcdir/test; then + MAKEFILE3="test/Makefile test/internal/Makefile" +fi +AC_SUBST(SUBDIRS) + +# +# BSD/OS (BSDi) needs to use a different include syntax in the Makefiles +# +case $host in +*bsdi*) + # Check whether they've installed GNU make + if make --version > /dev/null 2>&1; then + INCLUDE_RULES="include $apr_buildout/apr_rules.mk" + else + # BSDi make + INCLUDE_RULES=".include \"$apr_buildout/apr_rules.mk\"" + fi + ;; +*) + INCLUDE_RULES="include $apr_buildout/apr_rules.mk" + ;; +esac +AC_SUBST(INCLUDE_RULES) + +SAVE_FILES="include/apr.h include/arch/unix/apr_private.h" + +for i in $SAVE_FILES; do + test -r $i && mv $i $i.save +done + +dir=include/arch/unix +test -d $dir || $MKDIR $dir + +AC_OUTPUT([ + $MAKEFILE1 $MAKEFILE2 $MAKEFILE3 + include/apr.h + build/apr_rules.mk + build/pkg/pkginfo + apr-config +],[ +for i in $SAVE_FILES; do + if cmp -s $i $i.save 2>/dev/null; then + mv $i.save $i + echo "$i is unchanged" + fi + rm -f $i.save +done +chmod +x apr-config +]) + +dnl ----------------------------- Fixup Makefiles for VPATH support + +changequote({,}) + +if test -n "$USE_VPATH"; then + for makefile in $MAKEFILE1 $MAKEFILE2 $MAKEFILE3; do + cat $makefile | \ + sed \ + -e 's#-I\($(INCDIR[0-9]*)\)#-I\1 -I$(srcdir)/\1#g' \ + -e 's#-I\($(OSDIR[0-9]*)\)#-I\1 -I$(srcdir)/\1#g' \ + -e 's#-I\($(DEFOSDIR[0-9]*)\)#-I\1 -I$(srcdir)/\1#g' \ + > tmp + cp tmp $makefile + done + rm -f tmp +fi + +changequote([,]) diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/docs/APRDesign.html b/rubbos/app/httpd-2.0.64/srclib/apr/docs/APRDesign.html new file mode 100644 index 00000000..7d1caeb8 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/docs/APRDesign.html @@ -0,0 +1,399 @@ + +APR Design Document + +

    Design of APR

    + +

    The Apache Portable Run-time libraries have been designed to provide a common +interface to low level routines across any platform. The original goal of APR +was to combine all code in Apache to one common code base. This is not the +correct approach however, so the goal of APR has changed. There are places +where common code is not a good thing. For example, how to map requests +to either threads or processes should be platform specific. APR's place +is now to combine any code that can be safely combined without sacrificing +performance.

    + +

    To this end we have created a set of operations that are required for cross +platform development. There may be other types that are desired and those +will be implemented in the future.

    + +

    This document will discuss the structure of APR, and how best to contribute +code to the effort.

    + +

    APR On Windows and Netware

    + +

    APR on Windows and Netware is different from APR on all other systems, +because those platforms don't use autoconf. On Unix, apr_private.h (private to +APR) and apr.h (public, used by applications that use APR) are generated by +autoconf from acconfig.h and apr.h.in respectively. On Windows (and Netware), +apr_private.h and apr.h are created from apr_private.hw (apr_private.hwn) +and apr.hw (apr.hwn) respectively.

    + +

    + If you add code to acconfig.h or tests to configure.in or aclocal.m4, + please give some thought to whether or not Windows and Netware need + these additions as well. A general rule of thumb, is that if it is + a feature macro, such as APR_HAS_THREADS, Windows and Netware need it. + In other words, if the definition is going to be used in a public APR + header file, such as apr_general.h, Windows needs it. + + The only time it is safe to add a macro or test without also adding + the macro to apr*.h[n]w, is if the macro tells APR how to build. For + example, a test for a header file does not need to be added to Windows. +

    + +

    APR Features

    + +

    One of the goals of APR is to provide a common set of features across all +platforms. This is an admirable goal, it is also not realistic. We cannot +expect to be able to implement ALL features on ALL platforms. So we are +going to do the next best thing. Provide a common interface to ALL APR +features on MOST platforms.

    + +

    APR developers should create FEATURE MACROS for any feature that is not +available on ALL platforms. This should be a simple definition which has +the form:

    + +APR_HAS_FEATURE + +

    This macro should evaluate to true if APR has this feature on this platform. +For example, Linux and Windows have mmap'ed files, and APR is providing an +interface for mmapp'ing a file. On both Linux and Windows, APR_HAS_MMAP +should evaluate to one, and the ap_mmap_* functions should map files into +memory and return the appropriate status codes.

    + +

    If your OS of choice does not have mmap'ed files, APR_HAS_MMAP should +evaluate to zero, and all ap_mmap_* functions should not be defined. The +second step is a precaution that will allow us to break at compile time if a +programmer tries to use unsupported functions.

    + +

    APR types

    + +

    The base types in APR

    + +
      +
    • dso
      + Shared library routines +
    • mmap
      + Memory-mapped files +
    • poll
      + Polling I/O +
    • time
      + Time +
    • user
      + Users and groups +
    • locks
      + Process and thread locks (critical sections) +
    • shmem
      + Shared memory +
    • file_io
      + File I/O, including pipes +
    • atomic
      + Atomic integer operations +
    • strings
      + String handling routines +
    • memory
      + Pool-based memory allocation +
    • passwd
      + Reading passwords from the terminal +
    • tables
      + Tables and hashes +
    • network_io
      + Network I/O +
    • threadproc
      + Threads and processes +
    • misc
      + Any APR type which doesn't have any other place to belong. This + should be used sparingly. +
    • support
      + Functions meant to be used across multiple APR types. This area + is for internal functions only. If a function is exposed, it should + not be put here. +
    + +

    Directory Structure

    + +

    Each type has a base directory. Inside this base directory, are +subdirectories, which contain the actual code. These subdirectories are named +after the platforms the are compiled on. Unix is also used as a common +directory. If the code you are writing is POSIX based, you should look at the +code in the unix directory. A good rule of thumb, is that if more than half +your code needs to be ifdef'ed out, and the structures required for your code +are substantively different from the POSIX code, you should create a new +directory.

    + +

    Currently, the APR code is written for Unix, BeOS, Windows, and OS/2. An +example of the directory structure is the file I/O directory:

    + +
    +apr
    +  |
    +   ->  file_io
    +          |
    +           -> unix            The Unix and common base code
    +          |
    +           -> win32           The Windows code
    +          | 
    +           -> os2             The OS/2 code
    +
    + +

    Obviously, BeOS does not have a directory. This is because BeOS is currently +using the Unix directory for it's file_io.

    + +

    There are a few special top level directories. These are test and include. +Test is a directory which stores all test programs. It is expected +that if a new type is developed, there will also be a new test program, to +help people port this new type to different platforms. A small document +describing how to create new tests that integrate with the test suite can be +found in the test/ directory. Include is a directory which stores all +required APR header files for external use.

    + +

    Creating an APR Type

    + +

    The current design of APR requires that most APR types be incomplete. +It is not possible to write flexible portable code if programs can access +the internals of APR types. This is because different platforms are +likely to define different native types. There are only two execptions to +this rule:

    + +
      +
    • The first exception to this rule is if the type can only reasonably be +implemented one way. For example, time is a complete type because there +is only one reasonable time implementation. + +
    • The second exception to the incomplete type rule can be found in +apr_portable.h. This file defines the native types for each platform. +Using these types, it is possible to extract native types for any APR type.

      +
    + +

    For this reason, each platform defines a structure in their own directories. +Those structures are then typedef'ed in an external header file. For example +in file_io/unix/fileio.h:

    + +
    +    struct ap_file_t {
    +        apr_pool_t *cntxt;
    +        int filedes;
    +        FILE *filehand;
    +        ...
    +    }
    +
    + +

    In include/apr_file_io.h:

    + + typedef struct ap_file_t ap_file_t; + + +

    This will cause a compiler error if somebody tries to access the filedes +field in this structure. Windows does not have a filedes field, so obviously, +it is important that programs not be able to access these.

    + +

    You may notice the apr_pool_t field. Most APR types have this field. This +type is used to allocate memory within APR. Because every APR type has a pool, +any APR function can allocate memory if it needs to. This is very important +and it is one of the reasons that APR works. If you create a new type, you +must add a pool to it. If you do not, then all functions that operate on that +type will need a pool argument.

    + +

    New Function

    + +

    When creating a new function, please try to adhere to these rules.

    + +
      +
    • Result arguments should be the first arguments. +
    • If a function needs a pool, it should be the last argument. +
    • These rules are flexible, especially if it makes the code easier + to understand because it mimics a standard function. +
    + +

    Documentation

    + +

    Whenever a new function is added to APR, it MUST be documented. New +functions will not be committed unless there are docs to go along with them. +The documentation should be a comment block above the function in the header +file.

    + +

    The format for the comment block is:

    + +
    +    /**
    +     * Brief description of the function
    +     * @param parma_1_name explanation
    +     * @param parma_2_name explanation
    +     * @param parma_n_name explanation
    +     * @tip Any extra information people should know.
    +     * @deffunc function prototype if required
    +     */ 
    +
    + +

    For an actual example, look at any file in the include directory. The +reason the docs are in the header files is to ensure that the docs always +reflect the current code. If you change paramters or return values for a +function, please be sure to update the documentation.

    + +

    APR Error reporting

    + +

    Most APR functions should return an ap_status_t type. The only time an +APR function does not return an ap_status_t is if it absolutely CAN NOT +fail. Examples of this would be filling out an array when you know you are +not beyond the array's range. If it cannot fail on your platform, but it +could conceivably fail on another platform, it should return an ap_status_t. +Unless you are sure, return an ap_status_t.

    + + + This includes functions that return TRUE/FALSE values. How that + is handled is discussed below + + +

    All platforms return errno values unchanged. Each platform can also have +one system error type, which can be returned after an offset is added. +There are five types of error values in APR, each with it's own offset.

    + + +
    +    Name			Purpose
    +0) 			This is 0 for all platforms and isn't really defined
    + 			anywhere, but it is the offset for errno values.
    +			(This has no name because it isn't actually defined, 
    +                        but for completeness we are discussing it here).
    +
    +1) APR_OS_START_ERROR	This is platform dependent, and is the offset at which
    +			APR errors start to be defined.  Error values are 
    +			defined as anything which caused the APR function to 
    +			fail.  APR errors in this range should be named 
    +			APR_E* (i.e. APR_ENOSOCKET)
    +
    +2) APR_OS_START_STATUS	This is platform dependent, and is the offset at which
    +			APR status values start.  Status values do not indicate
    +			success or failure, and should be returned if 
    +			APR_SUCCESS does not make sense.  APR status codes in 
    +			this range should be name APR_* (i.e. APR_DETACH)
    +
    +4) APR_OS_START_USEERR	This is platform dependent, and is the offset at which
    +			APR apps can begin to add their own error codes.
    +
    +3) APR_OS_START_SYSERR	This is platform dependent, and is the offset at which
    +			system error values begin.
    +
    + +The difference in naming between APR_OS_START_ERROR and +APR_OS_START_STATUS mentioned above allows programmers to easily determine if +the error code indicates an error condition or a status codition. + +

    If your function has multiple return codes that all indicate success, but +with different results, or if your function can only return PASS/FAIL, you +should still return an apr_status_t. In the first case, define one +APR status code for each return value, an example of this is +apr_proc_wait, which can only return APR_CHILDDONE, +APR_CHILDNOTDONE, or an error code. In the second case, please return +APR_SUCCESS for PASS, and define a new APR status code for failure, an +example of this is apr_compare_users, which can only return +APR_SUCCESS, APR_EMISMATCH, or an error code.

    + +

    All of these definitions can be found in apr_errno.h for all platforms. When +an error occurs in an APR function, the function must return an error code. +If the error occurred in a system call and that system call uses errno to +report an error, then the code is returned unchanged. For example:

    + +
    +    if (open(fname, oflags, 0777) < 0)
    +        return errno;
    +
    + +

    The next place an error can occur is a system call that uses some error value +other than the primary error value on a platform. This can also be handled +by APR applications. For example:

    + +
    +    if (CreateFile(fname, oflags, sharemod, NULL, 
    +                   createflags, attributes, 0) == INVALID_HANDLE_VALUE
    +        return (GetLAstError() + APR_OS_START_SYSERR);
    +
    + +

    These two examples implement the same function for two different platforms. +Obviously even if the underlying problem is the same on both platforms, this +will result in two different error codes being returned. This is OKAY, and +is correct for APR. APR relies on the fact that most of the time an error +occurs, the program logs the error and continues, it does not try to +programatically solve the problem. This does not mean we have not provided +support for programmatically solving the problem, it just isn't the default +case. We'll get to how this problem is solved in a little while.

    + +

    If the error occurs in an APR function but it is not due to a system call, +but it is actually an APR error or just a status code from APR, then the +appropriate code should be returned. These codes are defined in apr_errno.h +and should be self explanatory.

    + +

    No APR code should ever return a code between APR_OS_START_USEERR and +APR_OS_START_SYSERR, those codes are reserved for APR applications.

    + +

    To programmatically correct an error in a running application, the error +codes need to be consistent across platforms. This should make sense. APR +has provided macros to test for status code equivalency. For example, to +determine if the code that you received from the APR function means EOF, you +would use the macro APR_STATUS_IS_EOF().

    + +

    Why did APR take this approach? There are two ways to deal with error +codes portably.

    + +
      +
    1. Return the same error code across all platforms. +
    2. Return platform specific error codes and convert them when necessary. +
    + +

    The problem with option number one is that it takes time to convert error +codes to a common code, and most of the time programs want to just output +an error string. If we convert all errors to a common subset, we have four +steps to output an error string:

    + +

    The seocnd problem with option 1, is that it is a lossy conversion. For +example, Windows and OS/2 have a couple hundred error codes, but POSIX errno +only defines about 50 errno values. This means that if we convert to a +canonical error value immediately, there is no way for the programmer to +get the actual system error.

    + +
    +    make syscall that fails
    +        convert to common error code                 step 1
    +        return common error code
    +            check for success
    +            call error output function               step 2
    +                convert back to system error         step 3
    +                output error string                  step 4
    +
    + +

    By keeping the errors platform specific, we can output error strings in two +steps.

    + +
    +    make syscall that fails
    +        return error code
    +            check for success
    +            call error output function               step 1
    +                output error string                  step 2
    +
    + +

    Less often, programs change their execution based on what error was returned. +This is no more expensive using option 2 than it is using option 1, but we +put the onus of converting the error code on the programmer themselves. +For example, using option 1:

    + +
    +    make syscall that fails
    +        convert to common error code
    +        return common error code
    +            decide execution based on common error code
    +
    + +

    Using option 2:

    + +
    +    make syscall that fails
    +        return error code
    +            convert to common error code (using ap_canonical_error)
    +            decide execution based on common error code
    +
    + +

    Finally, there is one more operation on error codes. You can get a string +that explains in human readable form what has happened. To do this using +APR, call ap_strerror().

    + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/docs/canonical_filenames.html b/rubbos/app/httpd-2.0.64/srclib/apr/docs/canonical_filenames.html new file mode 100644 index 00000000..10867d37 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/docs/canonical_filenames.html @@ -0,0 +1,156 @@ + +APR Canonical Filenames + +

    APR Canonical Filename

    + +

    Requirements

    + +

    APR porters need to address the underlying discrepancies between +file systems. To achieve a reasonable degree of security, the +program depending upon APR needs to know that two paths may be +compared, and that a mismatch is guarenteed to reflect that the +two paths do not return the same resource

    . + +

    The first discrepancy is in volume roots. Unix and pure deriviates +have only one root path, "/". Win32 and OS2 share root paths of +the form "D:/", D: is the volume designation. However, this can +be specified as "//./D:/" as well, indicating D: volume of the +'this' machine. Win32 and OS2 also may employ a UNC root path, +of the form "//server/share/" where share is a share-point of the +specified network server. Finally, NetWare root paths are of the +form "server/volume:/", or the simpler "volume:/" syntax for 'this' +machine. All these non-Unix file systems accept volume:path, +without a slash following the colon, as a path relative to the +current working directory, which APR will treat as ambigious, that +is, neither an absolute nor a relative path per se.

    + +

    The second discrepancy is in the meaning of the 'this' directory. +In general, 'this' must be eliminated from the path where it occurs. +The syntax "path/./" and "path/" are both aliases to path. However, +this isn't file system independent, since the double slash "//" has +a special meaning on OS2 and Win32 at the start of the path name, +and is invalid on those platforms before the "//server/share/" UNC +root path is completed. Finally, as noted above, "//./volume/" is +legal root syntax on WinNT, and perhaps others.

    + +

    The third discrepancy is in the context of the 'parent' directory. +When "parent/path/.." occurs, the path must be unwound to "parent". +It's also critical to simply truncate leading "/../" paths to "/", +since the parent of the root is root. This gets tricky on the +Win32 and OS2 platforms, since the ".." element is invalid before +the "//server/share/" is complete, and the "//server/share/../" +seqence is the complete UNC root "//server/share/". In relative +paths, leading ".." elements are significant, until they are merged +with an absolute path. The relative form must only retain the ".." +segments as leading segments, to be resolved once merged to another +relative or an absolute path.

    + +

    The fourth discrepancy occurs with acceptance of alternate character +codes for the same element. Path seperators are not retained within +the APR canonical forms. The OS filesystem and APR (slashed) forms +can both be returned as strings, to be used in the proper context. +Unix, Win32 and Netware all accept slashes and backslashes as the +same path seperator symbol, although unix strictly accepts slashes. +While the APR form of the name strictly uses slashes, always consider +that there could be a platform that actually accepts slashes as a +character within a segment name.

    + +

    The fifth and worst discrepancy plauges Win32, OS2, Netware, and some +filesystems mounted in Unix. Case insensitivity can permit the same +file to slip through in both it's proper case and alternate cases. +Simply changing the case is insufficient for any character set beyond +ASCII, since various dilectic forms of characters suffer from one to +many or many to one translations. An example would be u-umlaut, which +might be accepted as a single character u-umlaut, a two character +sequence u and the zero-width umlaut, the upper case form of the same, +or perhaps even a captial U alone. This can be handled in different +ways depending on the purposes of the APR based program, but the one +requirement is that the path must be absolute in order to resolve these +ambiguities. Methods employed include comparison of device and inode +file uniqifiers, which is a fairly fast operation, or quering the OS +for the true form of the name, which can be much slower. Only the +acknowledgement of the file names by the OS can validate the equality +of two different cases of the same filename.

    + +

    The sixth discrepancy, illegal or insignificant characters, is especially +significant in non-unix file systems. Trailing periods are accepted +but never stored, therefore trailing periods must be ignored for any +form of comparison. And all OS's have certain expectations of what +characters are illegal (or undesireable due to confusion.)

    + +

    A final warning, canonical functions don't transform or resolve case +or character ambiguity issues until they are resolved into an absolute +path. The relative canonical path, while useful, while useful for URL +or similar identifiers, cannot be used for testing or comparison of file +system objects.

    + +
    + +

    Canonical API

    + +Functions to manipulate the apr_canon_file_t (an opaque type) include: + +
      +
    • Create canon_file_t (from char* path and canon_file_t parent path) +
    • Merged canon_file_t (from path and parent, both canon_file_t) +
    • Get char* path of all or some segments +
    • Get path flags of IsRelative, IsVirtualRoot, and IsAbsolute +
    • Compare two canon_file_t structures for file equality +
    + +

    The path is corrected to the file system case only if is in absolute +form. The apr_canon_file_t should be preserved as long as possible and +used as the parent to create child entries to reduce the number of expensive +stat and case canonicalization calls to the OS.

    + +

    The comparison operation provides that the APR can postpone correction +of case by simply relying upon the device and inode for equivilance. The +stat implementation provides that two files are the same, while their +strings are not equivilant, and eliminates the need for the operating +system to return the proper form of the name.

    + +

    In any case, returning the char* path, with a flag to request the proper +case, forces the OS calls to resolve the true names of each segment. Where +there is a penality for this operation and the stat device and inode test +is faster, case correction is postponed until the char* result is requested. +On platforms that identify the inode, device, or proper name interchangably +with no penalities, this may occur when the name is initially processed.

    + +
    + +

    Unix Example

    + +

    First the simplest case:

    + +
    +Parse Canonical Name 
    +accepts parent path as canonical_t
    +        this path as string
    +
    +Split this path Segments on '/'
    +
    +For each of this path Segments
    +  If first Segment
    +    If this Segment is Empty ([nothing]/)
    +      Append this Root Segment (don't merge)
    +      Continue to next Segment
    +    Else is relative
    +      Append parent Segments (to merge)
    +      Continue with this Segment
    +  If Segment is '.' or empty (2 slashes)
    +    Discard this Segment
    +    Continue with next Segment
    +  If Segment is '..'
    +    If no previous Segment or previous Segment is '..'
    +      Append this Segment
    +      Continue with next Segment
    +    If previous Segment and previous is not Root Segment
    +      Discard previous Segment
    +    Discard this Segment
    +    Continue with next Segment
    +  Append this Relative Segment
    +  Continue with next Segment        
    +
    + + + \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/docs/doxygen.conf b/rubbos/app/httpd-2.0.64/srclib/apr/docs/doxygen.conf new file mode 100644 index 00000000..2efb5547 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/docs/doxygen.conf @@ -0,0 +1,33 @@ +PROJECT_NAME="Apache Portable Runtime" + +INPUT=. +QUIET=YES +RECURSIVE=YES +FILE_PATTERNS=*.h + +OUTPUT_DIRECTORY=docs/dox + +MACRO_EXPANSION=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" \ + "APR_DECLARE_DATA" \ + "APR_POOL_DECLARE_ACCESSOR(x)=apr_pool_t* apr_##x##_pool_get (const apr_##x##_t *the##x)" \ + "APR_DECLARE_INHERIT_SET(x)=apr_status_t apr_##x##_inherit_set(apr_##x##_t *the##x)" \ + "APR_DECLARE_INHERIT_UNSET(x)=apr_status_t apr_##x##_inherit_unset(apr_##x##_t *the##x)" \ + "APR_HAS_THREADS" \ + "__attribute__(x)=" \ + DOXYGEN= + +OPTIMIZE_OUTPUT_FOR_C=YES + +FULL_PATH_NAMES=NO +# some autoconf guru needs to make configure set this correctly... +# in the meantime, simply listing the headers should be alright +STRIP_FROM_PATH=/buildpath/apr + +EXCLUDE_PATTERNS="*/acconfig.h" \ + "*/test/*" \ + "*/arch/*" diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/docs/incomplete_types b/rubbos/app/httpd-2.0.64/srclib/apr/docs/incomplete_types new file mode 100644 index 00000000..cbed7774 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/docs/incomplete_types @@ -0,0 +1,84 @@ +The question has been asked multiple times, "Why is APR using Incomplete +types?" This document will try to explain that. + +Incomplete types are used in APR because they can enforce portability, and +they make the APR developers job easier, as well as allowing APR to use native +types on all platforms. Imagine a scenario where APR wasn't using incomplete +types. The ap_file_t type would have to be defined as: + +typedef struct ap_file_t { + ap_pool_t *pool + char *fname; + int eof_hit; + int pipe; + ap_interval_time_t timeout; +#ifdef WIN32 + HANDLE file_handle; + DWORD dwFileAttributes; +#elif defined(OS2) + HFILE filedes; + HEV PipeSem +#else + int filedes; + int ungetchar; +#endif + +#ifndef WIN32 + int buffered; + ap_int32_flags + int isopen; + + /* Stuff for buffered mode */ + char *buffer; + int bufpos; + unsigned long dataRead; + int direction; + unsigned long filePtr; + ap_lock_t *mutex; +#endif +} ap_file_t; + +This captures the essense of what is currently being defined for ap_file_t +using incomplete types. However, using this structure leads developers to +believe that they are safe accessing any of the fields in this structure. +This is not true. On some platforms, such as Windows, about half of the +structure disappears. We could combine some of these definitions with +macros, for example: + +#ifdef WIN32 +#define filetype HANDLE +#elif OS2 +#define filetype HFILE +#else +#define filetype int +#endif + +And then in the defintion for ap_file_t, we could say: + filetype filedes; + +This gets rid of some of the complexity, by moving it off to the side, but +it is still not safe for a programmers to access the filedes field directly +outside of APR, because the programmer has no way of knowing what the actual +type is. So for example printing the filedes using printf would yield wildly +varying results on Windows and OS2 when compared to Unix. + +Another option also presents itself. Stick strictly to POSIX. This means +that all code can be shared on any POSIX compliant platform. The problem +with this is performance. One of the benefits to APR, is that it allows +developers to easily use native types on all platforms with the same code. +This has proven to provide a substantial performance boost on most non-Unix +platforms. + +Having said all of that, sometimes incomplete types just don't make sense. +For example, the first implementation of time functions used incomplete types, +which added a layer of complexity that turned out to be unnecessary. If +a platform cannot provide a simple number that represents the number of seconds +elapsed since a specifed date and time, then APR doesn't really want to +provide support for that platform. + +APR is trying hard to provide a balance of incomplete and complete types, +but like all things, sometimes the developers make mistakes. If you are +using APR and find that there is an incomplete type that doesn't need to be +an incomplete type, please let us know, we are more than willing to listen +and design parts of APR that do not use incomplete types. + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/docs/non_apr_programs b/rubbos/app/httpd-2.0.64/srclib/apr/docs/non_apr_programs new file mode 100644 index 00000000..5003a8bd --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/docs/non_apr_programs @@ -0,0 +1,47 @@ +How do I use APR'ized programs in connection with programs that don't +use APR? These darn incomplete types don't let me fill out the APR types. + +The APR developers acknowledge that most programs are not using APR, and +we don't expect them to migrate to using APR just because APR has been +released. So, we have provided a way for non-APR'ized programs to interact +very cleanly with APR. + +There are a set of functions, all documented in apr_portable.h, which allow +a programmer to either get a native type from an APR type, or to setup an +APR type from a native type. + +For example, if you are writing an add-on to another program that does not use +APR for file I/O, but you (in your infinite wisdom) want to use APR to make +sure your section is portable. Assume the program provides a type foo_t with +a file descriptor in it (fd). + +void function_using_apr(foo_t non_apr_struct, ap_pool_t *p) +{ + ap_file_t *apr_file = NULL; + + ap_put_os_file(&apr_file, &non_apr_struct->fd, p); + + ... +} + +There are portable functions for each APR incomplete type. They are all +called ap_put_os_foobar(), and they each take the same basic arguments, a +pointer to a pointer to the incomplete type (the last pointer in that list +should be NULL), a pointer to the native type, and a pool. Each of these can +be found in apr_portable.h. + +If you have to do the exact opposite (take an APR type and convert it to a +native type, there are functions for that too. For example: + +void function_not_using_apr(apr_file_t *apr_file) +{ + int unix_file_desc; + + ap_get_os_file(&unix_file_desc, apr_file); + + ... +} + +For each ap_put_os_foobar, there is a corresponding ap_get_os_file. These are +also documented in apr_portable.h. + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/docs/pool-design.html b/rubbos/app/httpd-2.0.64/srclib/apr/docs/pool-design.html new file mode 100644 index 00000000..d862ff9c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/docs/pool-design.html @@ -0,0 +1,100 @@ + + + Using APR Pools + + +
    + Last modified at [$Date: 2004-11-24 23:02:04 +0000 (Wed, 24 Nov 2004) $] +
    + +

    Using APR Pools

    + +

    + From Subversion, we + have learned a lot about how to use pools in a heavily + structured/object-based environment. + Apache httpd is a + completely different beast: "allocate a request pool. use + it. destroy it." +

    + +

    + In a complex app, that request-style of behavior is not + present. Luckily, the "proper" use of pools can be described in + just a few rules: +

    + +
      +
    • + Objects should not have their own pools. An object is + allocated into a pool defined by the constructor's caller. The + caller knows the lifetime of the object and + will manage it via the pool. Generally, this also means that + objects will not have a "close" or a "free" since those + operations will happen implicitly as part of the destruction + of the pool the objects live within. +
    • + +
    • +

      + Functions should not create/destroy pools for their + operation; they should use a pool provided by the + caller. Again, the caller knows more about + how the function will be used, how often, how many times, + etc. Thus, it should be in charge of the function's memory + usage. +

      +

      + As an example, the caller might know that the app will exit + upon the function's return. Thus, the function would be + creating extra work if it built and destroyed a + pool. Instead, it should use the passed-in pool, which the + caller is going to be tossing as part of app-exit anyways. +

      +
    • + +
    • +

      + Whenever an unbounded iteration occurs, a subpool should be + used. The general pattern is: +

      +
      +
      +subpool = apr_create_subpool(pool);
      +for (i = 0; i < n; ++i) {
      +  apr_pool_clear(subpool);
      +
      +  do_operation(..., subpool);
      +}
      +apr_pool_destroy(subpool);
      +
      +

      + This pattern prevents the 'pool' from growing unbounded and + consuming all of memory. Note that it is slightly more + optimal to clear the pool on loop-entry. This pattern also + allows for a 'continue' to occur within the loop, + yet still ensure the pool will be cleared. +

      +
    • + +
    • + Given all of the above, it is pretty well mandatory to pass a + pool to every function. Since objects are not + recording pools for themselves, and the caller is always + supposed to be managing memory, then each function needs a + pool, rather than relying on some hidden magic pool. In + limited cases, objects may record the pool used for their + construction so that they can construct sub-parts, but these + cases should be examined carefully. Internal pools can lead to + unbounded pool usage if the object is not careful. +
    • +
    + +
    +
    Greg Stein
    + + +Last modified: Wed Jun 25 14:50:19 PDT 2003 + + + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/docs/win32_builds.html b/rubbos/app/httpd-2.0.64/srclib/apr/docs/win32_builds.html new file mode 100644 index 00000000..ad57d8e1 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/docs/win32_builds.html @@ -0,0 +1,57 @@ + +APR Win32 Builds and Debugging + +

    APR Win32 Builds and Debugging

    + +

    Configuration and Flavors

    + +

    The Win32 APR Developer Studio projects consist of

    + +
    +
    apr/apr.dsp
    +
    Builds the static apr.lib library (-D APR_DECLARE_STATIC)
    +
    apr/libapr.dsp
    +
    Builds the dynamic libapr.dll library (no define required)
    +
    apr-util/aprutil.dsp
    +
    Builds the static aprutil.lib library (-D APU_DECLARE_STATIC)
    +
    apr-util/libaprutil.dsp
    +
    Builds the dynamic libaprutil.dll library (no define required)
    +
    apr-iconv/apriconv.dsp
    +
    Builds the static apriconv.lib library (-D API_DECLARE_STATIC)
    +
    apr-iconv/libapriconv.dsp
    +
    Builds the dynamic libapriconv.dll library (no define required)
    +
    + +

    In order to prepare to use one of the static libraries above, + your application must be compiled with the define shown above, so that the + correct linkage is created. The APR authors intended the use of dynamic + libraries by default, so application authors do not need any special + defines in order to link to the dynamic library flavors.

    + +

    In order to build APR, you must use the proper dependencies. A good + example of those dependencies is given in the apr-util/aprutil.dsw + Developer Studio workspace. You can borrow the parts of that structure + your application needs, that workspace defines both the dynamic and static + library dependencies.

    + +

    The APR libraries (dynamic and static) are compiled with debugging symbols, + even in Release builds. The dynamic library symbols are always usable, + simply keep the correspond .pdb file in the same path as the library .dll. + (E.g. both libapr.dll and libapr.pdb should be copied to the same path.)

    + +

    The static symbols will only be fully usable if your application does not + link with the /pdbtype:sept flag! At the time your application links to + an APR library, the corresponding _src.pdb file should exist in the original + path the library was built, or it may be sufficient to keep the _src.pdb file + in the same path as the library file. (E.g. apr.lib and apr_src.pdb should + reside together in your lib directory.) The later option is unconfirmed.

    + +

    In order to keep the symbols compiled into the static library, your application + must use the linker's /debug flag. If you do not want the application to be + debuggable with its corresponding .pdb file, omit the /debug flag and all debug + symbolic information is discarded. Note that your application can only be + debugged with the corresponding .pdb file created by the linker, unless you use + /debugtype:coff or /debugtype:both in your link options.

    + + + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/dso/aix/Makefile.in b/rubbos/app/httpd-2.0.64/srclib/apr/dso/aix/Makefile.in new file mode 100644 index 00000000..7d42bded --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/dso/aix/Makefile.in @@ -0,0 +1,14 @@ +srcdir = @srcdir@ +VPATH = @srcdir@ + +TARGETS = dso.lo + +# bring in rules.mk for standard functionality +@INCLUDE_RULES@ + +INCDIR=../../include +OSDIR=$(INCDIR)/arch/@OSDIR@ +DEFOSDIR=$(INCDIR)/arch/@DEFAULT_OSDIR@ +INCLUDES=-I$(INCDIR) -I$(OSDIR) -I$(DEFOSDIR) + +# DO NOT REMOVE diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/dso/aix/dso.c b/rubbos/app/httpd-2.0.64/srclib/apr/dso/aix/dso.c new file mode 100644 index 00000000..25f6262a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/dso/aix/dso.c @@ -0,0 +1,714 @@ +/* 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. + */ + +/* + * dso.c -- DSO system function emulation for AIX + * + * This is *only* intended for AIX < 4.3. + */ + +/* + * Based on libdl (dlfcn.c/dlfcn.h) which is + * Copyright (c) 1992,1993,1995,1996,1997,1988 + * Jens-Uwe Mager, Helios Software GmbH, Hannover, Germany. + * + * Not derived from licensed software. + * + * Permission is granted to freely use, copy, modify, and redistribute + * this software, provided that the author is not construed to be liable + * for any results of using the software, alterations are clearly marked + * as such, and this notice is not modified. + * + * Changes marked with `--jwe' were made on April 7 1996 by + * John W. Eaton to support g++ + * + * Bundled, stripped and adjusted on April 1998 as one single source file + * for inclusion into the Apache HTTP server by + * Ralf S. Engelschall + * + * Added to APR by David Reid April 2000 + */ + +#include +#include +#include +#include +#include +#include +#include +#include "apr_arch_dso.h" +#include "apr_portable.h" + +#if APR_HAS_DSO + +#undef FREAD +#undef FWRITE +#include + +/* + * AIX 4.3 does remove some useful definitions from ldfcn.h. Define + * these here to compensate for that lossage. + */ +#ifndef BEGINNING +#define BEGINNING SEEK_SET +#endif +#ifndef FSEEK +#define FSEEK(ldptr,o,p) fseek(IOPTR(ldptr),(p==BEGINNING)?(OFFSET(ldptr) +o):o,p) +#endif +#ifndef FREAD +#define FREAD(p,s,n,ldptr) fread(p,s,n,IOPTR(ldptr)) +#endif + +/* + * Mode flags for the dlopen routine. + */ +#undef RTLD_LAZY +#define RTLD_LAZY 1 /* lazy function call binding */ +#undef RTLD_NOW +#define RTLD_NOW 2 /* immediate function call binding */ +#undef RTLD_GLOBAL +#define RTLD_GLOBAL 0x100 /* allow symbols to be global */ + +/* + * To be able to initialize, a library may provide a dl_info structure + * that contains functions to be called to initialize and terminate. + */ +struct dl_info { + void (*init) (void); + void (*fini) (void); +}; + +/* APR functions... + * + * As the AIX functions have been declared in the header file we just + * add the basic "wrappers" here. + */ + +APR_DECLARE(apr_status_t) apr_os_dso_handle_put(apr_dso_handle_t **aprdso, + apr_os_dso_handle_t osdso, + apr_pool_t *pool) +{ + *aprdso = apr_pcalloc(pool, sizeof **aprdso); + (*aprdso)->handle = osdso; + (*aprdso)->pool = pool; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_os_dso_handle_get(apr_os_dso_handle_t *osdso, + apr_dso_handle_t *aprdso) +{ + *osdso = aprdso->handle; + return APR_SUCCESS; +} + +static apr_status_t dso_cleanup(void *thedso) +{ + apr_dso_handle_t *dso = thedso; + + if (dso->handle != NULL && dlclose(dso->handle) != 0) + return APR_EINIT; + dso->handle = NULL; + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_dso_load(apr_dso_handle_t **res_handle, + const char *path, apr_pool_t *ctx) +{ + void *os_handle = dlopen((char *)path, RTLD_NOW | RTLD_GLOBAL); + + *res_handle = apr_pcalloc(ctx, sizeof(*res_handle)); + + if(os_handle == NULL) { + (*res_handle)->errormsg = dlerror(); + return APR_EDSOOPEN; + } + + (*res_handle)->handle = (void*)os_handle; + (*res_handle)->pool = ctx; + (*res_handle)->errormsg = NULL; + + apr_pool_cleanup_register(ctx, *res_handle, dso_cleanup, apr_pool_cleanup_null); + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_dso_unload(apr_dso_handle_t *handle) +{ + return apr_pool_cleanup_run(handle->pool, handle, dso_cleanup); +} + +APR_DECLARE(apr_status_t) apr_dso_sym(apr_dso_handle_sym_t *ressym, + apr_dso_handle_t *handle, + const char *symname) +{ + void *retval = dlsym(handle->handle, symname); + + if (retval == NULL) { + handle->errormsg = dlerror(); + return APR_ESYMNOTFOUND; + } + + *ressym = retval; + return APR_SUCCESS; +} + +APR_DECLARE(const char *) apr_dso_error(apr_dso_handle_t *dso, char *buffer, apr_size_t buflen) +{ + if (dso->errormsg) { + apr_cpystrn(buffer, dso->errormsg, buflen); + return dso->errormsg; + } + return "No Error"; +} + + + +/* + * We simulate dlopen() et al. through a call to load. Because AIX has + * no call to find an exported symbol we read the loader section of the + * loaded module and build a list of exported symbols and their virtual + * address. + */ + +typedef struct { + char *name; /* the symbols's name */ + void *addr; /* its relocated virtual address */ +} Export, *ExportPtr; + +/* + * xlC uses the following structure to list its constructors and + * destructors. This is gleaned from the output of munch. + */ +typedef struct { + void (*init) (void); /* call static constructors */ + void (*term) (void); /* call static destructors */ +} Cdtor, *CdtorPtr; + +typedef void (*GccCDtorPtr) (void); + +/* + * The void * handle returned from dlopen is actually a ModulePtr. + */ +typedef struct Module { + struct Module *next; + char *name; /* module name for refcounting */ + int refCnt; /* the number of references */ + void *entry; /* entry point from load */ + struct dl_info *info; /* optional init/terminate functions */ + CdtorPtr cdtors; /* optional C++ constructors */ + GccCDtorPtr gcc_ctor; /* g++ constructors --jwe */ + GccCDtorPtr gcc_dtor; /* g++ destructors --jwe */ + int nExports; /* the number of exports found */ + ExportPtr exports; /* the array of exports */ +} Module, *ModulePtr; + +/* + * We keep a list of all loaded modules to be able to call the fini + * handlers and destructors at atexit() time. + */ +static ModulePtr modList; + +/* + * The last error from one of the dl* routines is kept in static + * variables here. Each error is returned only once to the caller. + */ +static char errbuf[BUFSIZ]; +static int errvalid; + +/* + * The `fixed' gcc header files on AIX 3.2.5 provide a prototype for + * strdup(). --jwe + */ +extern char *strdup(const char *); +static void caterr(char *); +static int readExports(ModulePtr); +static void terminate(void); +static void *findMain(void); + +void *dlopen(const char *path, int mode) +{ + register ModulePtr mp; + static void *mainModule; + + /* + * Upon the first call register a terminate handler that will + * close all libraries. Also get a reference to the main module + * for use with loadbind. + */ + if (!mainModule) { + if ((mainModule = findMain()) == NULL) + return NULL; + atexit(terminate); + } + /* + * Scan the list of modules if we have the module already loaded. + */ + for (mp = modList; mp; mp = mp->next) + if (strcmp(mp->name, path) == 0) { + mp->refCnt++; + return mp; + } + if ((mp = (ModulePtr) calloc(1, sizeof(*mp))) == NULL) { + errvalid++; + strcpy(errbuf, "calloc: "); + strcat(errbuf, strerror(errno)); + return NULL; + } + if ((mp->name = strdup(path)) == NULL) { + errvalid++; + strcpy(errbuf, "strdup: "); + strcat(errbuf, strerror(errno)); + free(mp); + return NULL; + } + /* + * load should be declared load(const char *...). Thus we + * cast the path to a normal char *. Ugly. + */ + if ((mp->entry = (void *) loadAndInit((char *) path, L_NOAUTODEFER, NULL)) == NULL) { + free(mp->name); + free(mp); + errvalid++; + strcpy(errbuf, "dlopen: "); + strcat(errbuf, path); + strcat(errbuf, ": "); + /* + * If AIX says the file is not executable, the error + * can be further described by querying the loader about + * the last error. + */ + if (errno == ENOEXEC) { + char *tmp[BUFSIZ / sizeof(char *)]; + if (loadquery(L_GETMESSAGES, tmp, sizeof(tmp)) == -1) + strcpy(errbuf, strerror(errno)); + else { + char **p; + for (p = tmp; *p; p++) + caterr(*p); + } + } + else + strcat(errbuf, strerror(errno)); + return NULL; + } + mp->refCnt = 1; + mp->next = modList; + modList = mp; + if (loadbind(0, mainModule, mp->entry) == -1) { + dlclose(mp); + errvalid++; + strcpy(errbuf, "loadbind: "); + strcat(errbuf, strerror(errno)); + return NULL; + } + /* + * If the user wants global binding, loadbind against all other + * loaded modules. + */ + if (mode & RTLD_GLOBAL) { + register ModulePtr mp1; + for (mp1 = mp->next; mp1; mp1 = mp1->next) + if (loadbind(0, mp1->entry, mp->entry) == -1) { + dlclose(mp); + errvalid++; + strcpy(errbuf, "loadbind: "); + strcat(errbuf, strerror(errno)); + return NULL; + } + } + if (readExports(mp) == -1) { + dlclose(mp); + return NULL; + } + /* + * If there is a dl_info structure, call the init function. + */ + if (mp->info = (struct dl_info *) dlsym(mp, "dl_info")) { + if (mp->info->init) + (*mp->info->init) (); + } + else + errvalid = 0; + /* + * If the shared object was compiled using xlC we will need + * to call static constructors (and later on dlclose destructors). + */ + if (mp->cdtors = (CdtorPtr) dlsym(mp, "__cdtors")) { + CdtorPtr cp = mp->cdtors; + while (cp->init || cp->term) { + if (cp->init && cp->init != (void (*)(void)) 0xffffffff) + (*cp->init) (); + cp++; + } + /* + * If the shared object was compiled using g++, we will need + * to call global constructors using the _GLOBAL__DI function, + * and later, global destructors using the _GLOBAL_DD + * funciton. --jwe + */ + } + else if (mp->gcc_ctor = (GccCDtorPtr) dlsym(mp, "_GLOBAL__DI")) { + (*mp->gcc_ctor) (); + mp->gcc_dtor = (GccCDtorPtr) dlsym(mp, "_GLOBAL__DD"); + } + else + errvalid = 0; + return mp; +} + +/* + * Attempt to decipher an AIX loader error message and append it + * to our static error message buffer. + */ +static void caterr(char *s) +{ + register char *p = s; + + while (*p >= '0' && *p <= '9') + p++; + switch (atoi(s)) { + case L_ERROR_TOOMANY: + strcat(errbuf, "to many errors"); + break; + case L_ERROR_NOLIB: + strcat(errbuf, "can't load library"); + strcat(errbuf, p); + break; + case L_ERROR_UNDEF: + strcat(errbuf, "can't find symbol"); + strcat(errbuf, p); + break; + case L_ERROR_RLDBAD: + strcat(errbuf, "bad RLD"); + strcat(errbuf, p); + break; + case L_ERROR_FORMAT: + strcat(errbuf, "bad exec format in"); + strcat(errbuf, p); + break; + case L_ERROR_ERRNO: + strcat(errbuf, strerror(atoi(++p))); + break; + default: + strcat(errbuf, s); + break; + } +} + +void *dlsym(void *handle, const char *symbol) +{ + register ModulePtr mp = (ModulePtr) handle; + register ExportPtr ep; + register int i; + + /* + * Could speed up the search, but I assume that one assigns + * the result to function pointers anyways. + */ + for (ep = mp->exports, i = mp->nExports; i; i--, ep++) + if (strcmp(ep->name, symbol) == 0) + return ep->addr; + errvalid++; + strcpy(errbuf, "dlsym: undefined symbol "); + strcat(errbuf, symbol); + return NULL; +} + +const char *dlerror(void) +{ + if (errvalid) { + errvalid = 0; + return errbuf; + } + return NULL; +} + +int dlclose(void *handle) +{ + register ModulePtr mp = (ModulePtr) handle; + int result; + register ModulePtr mp1; + + if (--mp->refCnt > 0) + return 0; + if (mp->info && mp->info->fini) + (*mp->info->fini) (); + if (mp->cdtors) { + CdtorPtr cp = mp->cdtors; + while (cp->init || cp->term) { + if (cp->term && cp->init != (void (*)(void)) 0xffffffff) + (*cp->term) (); + cp++; + } + /* + * If the function to handle global destructors for g++ + * exists, call it. --jwe + */ + } + else if (mp->gcc_dtor) { + (*mp->gcc_dtor) (); + } + result = unload(mp->entry); + if (result == -1) { + errvalid++; + strcpy(errbuf, strerror(errno)); + } + if (mp->exports) { + register ExportPtr ep; + register int i; + for (ep = mp->exports, i = mp->nExports; i; i--, ep++) + if (ep->name) + free(ep->name); + free(mp->exports); + } + if (mp == modList) + modList = mp->next; + else { + for (mp1 = modList; mp1; mp1 = mp1->next) + if (mp1->next == mp) { + mp1->next = mp->next; + break; + } + } + free(mp->name); + free(mp); + return result; +} + +static void terminate(void) +{ + while (modList) + dlclose(modList); +} + +/* + * Build the export table from the XCOFF .loader section. + */ +static int readExports(ModulePtr mp) +{ + LDFILE *ldp = NULL; + SCNHDR sh, shdata; + LDHDR *lhp; + char *ldbuf; + LDSYM *ls; + int i; + ExportPtr ep; + struct ld_info *lp; + char *buf; + int size = 4 * 1024; + void *dataorg; + + /* + * The module might be loaded due to the LIBPATH + * environment variable. Search for the loaded + * module using L_GETINFO. + */ + if ((buf = malloc(size)) == NULL) { + errvalid++; + strcpy(errbuf, "readExports: "); + strcat(errbuf, strerror(errno)); + return -1; + } + while ((i = loadquery(L_GETINFO, buf, size)) == -1 && errno == ENOMEM) { + free(buf); + size += 4 * 1024; + if ((buf = malloc(size)) == NULL) { + errvalid++; + strcpy(errbuf, "readExports: "); + strcat(errbuf, strerror(errno)); + return -1; + } + } + if (i == -1) { + errvalid++; + strcpy(errbuf, "readExports: "); + strcat(errbuf, strerror(errno)); + free(buf); + return -1; + } + /* + * Traverse the list of loaded modules. The entry point + * returned by load() does actually point to the TOC + * entry contained in the data segment. + */ + lp = (struct ld_info *) buf; + while (lp) { + if ((unsigned long) mp->entry >= (unsigned long) lp->ldinfo_dataorg && + (unsigned long) mp->entry < (unsigned long) lp->ldinfo_dataorg + + lp->ldinfo_datasize) { + dataorg = lp->ldinfo_dataorg; + ldp = ldopen(lp->ldinfo_filename, ldp); + break; + } + if (lp->ldinfo_next == 0) + lp = NULL; + else + lp = (struct ld_info *) ((char *) lp + lp->ldinfo_next); + } + free(buf); + if (!ldp) { + errvalid++; + strcpy(errbuf, "readExports: "); + strcat(errbuf, strerror(errno)); + return -1; + } + if (TYPE(ldp) != U802TOCMAGIC) { + errvalid++; + strcpy(errbuf, "readExports: bad magic"); + while (ldclose(ldp) == FAILURE); + return -1; + } + /* + * Get the padding for the data section. This is needed for + * AIX 4.1 compilers. This is used when building the final + * function pointer to the exported symbol. + */ + if (ldnshread(ldp, _DATA, &shdata) != SUCCESS) { + errvalid++; + strcpy(errbuf, "readExports: cannot read data section header"); + while (ldclose(ldp) == FAILURE); + return -1; + } + if (ldnshread(ldp, _LOADER, &sh) != SUCCESS) { + errvalid++; + strcpy(errbuf, "readExports: cannot read loader section header"); + while (ldclose(ldp) == FAILURE); + return -1; + } + /* + * We read the complete loader section in one chunk, this makes + * finding long symbol names residing in the string table easier. + */ + if ((ldbuf = (char *) malloc(sh.s_size)) == NULL) { + errvalid++; + strcpy(errbuf, "readExports: "); + strcat(errbuf, strerror(errno)); + while (ldclose(ldp) == FAILURE); + return -1; + } + if (FSEEK(ldp, sh.s_scnptr, BEGINNING) != OKFSEEK) { + errvalid++; + strcpy(errbuf, "readExports: cannot seek to loader section"); + free(ldbuf); + while (ldclose(ldp) == FAILURE); + return -1; + } + if (FREAD(ldbuf, sh.s_size, 1, ldp) != 1) { + errvalid++; + strcpy(errbuf, "readExports: cannot read loader section"); + free(ldbuf); + while (ldclose(ldp) == FAILURE); + return -1; + } + lhp = (LDHDR *) ldbuf; + ls = (LDSYM *) (ldbuf + LDHDRSZ); + /* + * Count the number of exports to include in our export table. + */ + for (i = lhp->l_nsyms; i; i--, ls++) { + if (!LDR_EXPORT(*ls)) + continue; + mp->nExports++; + } + if ((mp->exports = (ExportPtr) calloc(mp->nExports, sizeof(*mp->exports))) == NULL) { + errvalid++; + strcpy(errbuf, "readExports: "); + strcat(errbuf, strerror(errno)); + free(ldbuf); + while (ldclose(ldp) == FAILURE); + return -1; + } + /* + * Fill in the export table. All entries are relative to + * the beginning of the data origin. + */ + ep = mp->exports; + ls = (LDSYM *) (ldbuf + LDHDRSZ); + for (i = lhp->l_nsyms; i; i--, ls++) { + char *symname; + char tmpsym[SYMNMLEN + 1]; + if (!LDR_EXPORT(*ls)) + continue; + if (ls->l_zeroes == 0) + symname = ls->l_offset + lhp->l_stoff + ldbuf; + else { + /* + * The l_name member is not zero terminated, we + * must copy the first SYMNMLEN chars and make + * sure we have a zero byte at the end. + */ + strncpy(tmpsym, ls->l_name, SYMNMLEN); + tmpsym[SYMNMLEN] = '\0'; + symname = tmpsym; + } + ep->name = strdup(symname); + ep->addr = (void *) ((unsigned long) dataorg + + ls->l_value - shdata.s_vaddr); + ep++; + } + free(ldbuf); + while (ldclose(ldp) == FAILURE); + return 0; +} + +/* + * Find the main modules data origin. This is used as export pointer + * for loadbind() to be able to resolve references to the main part. + */ +static void *findMain(void) +{ + struct ld_info *lp; + char *buf; + int size = 4 * 1024; + int i; + void *ret; + + if ((buf = malloc(size)) == NULL) { + errvalid++; + strcpy(errbuf, "findMain: "); + strcat(errbuf, strerror(errno)); + return NULL; + } + while ((i = loadquery(L_GETINFO, buf, size)) == -1 && errno == ENOMEM) { + free(buf); + size += 4 * 1024; + if ((buf = malloc(size)) == NULL) { + errvalid++; + strcpy(errbuf, "findMain: "); + strcat(errbuf, strerror(errno)); + return NULL; + } + } + if (i == -1) { + errvalid++; + strcpy(errbuf, "findMain: "); + strcat(errbuf, strerror(errno)); + free(buf); + return NULL; + } + /* + * The first entry is the main module. The data segment + * starts with the TOC entries for all exports, so the + * data segment origin works as argument for loadbind. + */ + lp = (struct ld_info *) buf; + ret = lp->ldinfo_dataorg; + free(buf); + return ret; +} + +#endif diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/dso/beos/Makefile.in b/rubbos/app/httpd-2.0.64/srclib/apr/dso/beos/Makefile.in new file mode 100644 index 00000000..02326f80 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/dso/beos/Makefile.in @@ -0,0 +1,13 @@ +srcdir = @srcdir@ +VPATH = @srcdir@ + +TARGETS = dso.lo + +# bring in rules.mk for standard functionality +@INCLUDE_RULES@ + +INCDIR=../../include +DEFOSDIR=$(INCDIR)/arch/@DEFAULT_OSDIR@ +INCLUDES=-I$(INCDIR) -I$(INCDIR)/arch -I$(DEFOSDIR) + +# DO NOT REMOVE diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/dso/beos/dso.c b/rubbos/app/httpd-2.0.64/srclib/apr/dso/beos/dso.c new file mode 100644 index 00000000..832d860e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/dso/beos/dso.c @@ -0,0 +1,95 @@ +/* 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. + */ + +#include "beos/apr_arch_dso.h" +#include "apr_portable.h" + +#if APR_HAS_DSO + +static apr_status_t dso_cleanup(void *thedso) +{ + apr_dso_handle_t *dso = thedso; + + if (dso->handle > 0 && unload_add_on(dso->handle) < B_NO_ERROR) + return APR_EINIT; + dso->handle = -1; + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_dso_load(apr_dso_handle_t **res_handle, + const char *path, apr_pool_t *pool) +{ + image_id newid; + + if((newid = load_add_on(path)) < B_NO_ERROR) + return APR_EDSOOPEN; + + *res_handle = apr_pcalloc(pool, sizeof(*res_handle)); + (*res_handle)->handle = newid; + (*res_handle)->pool = pool; + + apr_pool_cleanup_register(pool, *res_handle, dso_cleanup, apr_pool_cleanup_null); + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_dso_unload(apr_dso_handle_t *handle) +{ + return apr_pool_cleanup_run(handle->pool, handle, dso_cleanup); +} + +APR_DECLARE(apr_status_t) apr_dso_sym(apr_dso_handle_sym_t *ressym, apr_dso_handle_t *handle, + const char *symname) +{ + int err; + + if (symname == NULL) + return APR_ESYMNOTFOUND; + + err = get_image_symbol(handle->handle, symname, B_SYMBOL_TYPE_ANY, + ressym); + + if(err != B_OK) + return APR_ESYMNOTFOUND; + + return APR_SUCCESS; +} + +APR_DECLARE(const char *) apr_dso_error(apr_dso_handle_t *dso, char *buffer, apr_size_t buflen) +{ + strncpy(buffer, strerror(errno), buflen); + return buffer; +} + +APR_DECLARE(apr_status_t) apr_os_dso_handle_put(apr_dso_handle_t **aprdso, + apr_os_dso_handle_t osdso, + apr_pool_t *pool) +{ + *aprdso = apr_pcalloc(pool, sizeof **aprdso); + (*aprdso)->handle = osdso; + (*aprdso)->pool = pool; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_os_dso_handle_get(apr_os_dso_handle_t *osdso, + apr_dso_handle_t *aprdso) +{ + *osdso = aprdso->handle; + return APR_SUCCESS; +} + +#endif diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/dso/netware/dso.c b/rubbos/app/httpd-2.0.64/srclib/apr/dso/netware/dso.c new file mode 100644 index 00000000..4cd2ad61 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/dso/netware/dso.c @@ -0,0 +1,137 @@ +/* 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. + */ + +#include "apr_arch_dso.h" +#include "apr_strings.h" +#include "apr_portable.h" + +#include +#include + +APR_DECLARE(apr_status_t) apr_os_dso_handle_put(apr_dso_handle_t **aprdso, + apr_os_dso_handle_t osdso, + apr_pool_t *pool) +{ + *aprdso = apr_pcalloc(pool, sizeof **aprdso); + (*aprdso)->handle = osdso; + (*aprdso)->pool = pool; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_os_dso_handle_get(apr_os_dso_handle_t *osdso, + apr_dso_handle_t *aprdso) +{ + *osdso = aprdso->handle; + return APR_SUCCESS; +} + +static apr_status_t dso_cleanup(void *thedso) +{ + apr_dso_handle_t *dso = thedso; + sym_list *symbol = NULL; + void *NLMHandle = getnlmhandle(); + + if (dso->handle == NULL) + return APR_SUCCESS; + + if (dso->symbols != NULL) { + symbol = dso->symbols; + while (symbol) { + UnImportPublicObject(NLMHandle, symbol->symbol); + symbol = symbol->next; + } + } + + if (dlclose(dso->handle) != 0) + return APR_EINIT; + + dso->handle = NULL; + dso->symbols = NULL; + dso->path = NULL; + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_dso_load(apr_dso_handle_t **res_handle, + const char *path, apr_pool_t *pool) +{ + + void *os_handle = NULL; + char *fullpath = NULL; + apr_status_t rv; + + if ((rv = apr_filepath_merge(&fullpath, NULL, path, + APR_FILEPATH_NATIVE, pool)) != APR_SUCCESS) { + return rv; + } + + os_handle = dlopen(fullpath, RTLD_NOW | RTLD_LOCAL); + + *res_handle = apr_pcalloc(pool, sizeof(**res_handle)); + + if(os_handle == NULL) { + (*res_handle)->errormsg = dlerror(); + return APR_EDSOOPEN; + } + + (*res_handle)->handle = (void*)os_handle; + (*res_handle)->pool = pool; + (*res_handle)->errormsg = NULL; + (*res_handle)->symbols = NULL; + (*res_handle)->path = apr_pstrdup(pool, fullpath); + + apr_pool_cleanup_register(pool, *res_handle, dso_cleanup, apr_pool_cleanup_null); + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_dso_unload(apr_dso_handle_t *handle) +{ + return apr_pool_cleanup_run(handle->pool, handle, dso_cleanup); +} + +APR_DECLARE(apr_status_t) apr_dso_sym(apr_dso_handle_sym_t *ressym, + apr_dso_handle_t *handle, + const char *symname) +{ + sym_list *symbol = NULL; + void *retval = dlsym(handle->handle, symname); + + if (retval == NULL) { + handle->errormsg = dlerror(); + return APR_ESYMNOTFOUND; + } + + symbol = apr_pcalloc(handle->pool, sizeof(sym_list)); + symbol->next = handle->symbols; + handle->symbols = symbol; + symbol->symbol = apr_pstrdup(handle->pool, symname); + + *ressym = retval; + + return APR_SUCCESS; +} + +APR_DECLARE(const char *) apr_dso_error(apr_dso_handle_t *dso, char *buffer, + apr_size_t buflen) +{ + if (dso->errormsg) { + apr_cpystrn(buffer, dso->errormsg, buflen); + return dso->errormsg; + } + return "No Error"; +} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/dso/os2/Makefile.in b/rubbos/app/httpd-2.0.64/srclib/apr/dso/os2/Makefile.in new file mode 100644 index 00000000..7d42bded --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/dso/os2/Makefile.in @@ -0,0 +1,14 @@ +srcdir = @srcdir@ +VPATH = @srcdir@ + +TARGETS = dso.lo + +# bring in rules.mk for standard functionality +@INCLUDE_RULES@ + +INCDIR=../../include +OSDIR=$(INCDIR)/arch/@OSDIR@ +DEFOSDIR=$(INCDIR)/arch/@DEFAULT_OSDIR@ +INCLUDES=-I$(INCDIR) -I$(OSDIR) -I$(DEFOSDIR) + +# DO NOT REMOVE diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/dso/os2/dso.c b/rubbos/app/httpd-2.0.64/srclib/apr/dso/os2/dso.c new file mode 100644 index 00000000..1a7f7de8 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/dso/os2/dso.c @@ -0,0 +1,132 @@ +/* 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. + */ + +#include "apr_arch_dso.h" +#include "apr_strings.h" +#include "apr_portable.h" +#include +#include + +#if APR_HAS_DSO + +static apr_status_t dso_cleanup(void *thedso) +{ + apr_dso_handle_t *dso = thedso; + int rc; + + if (dso->handle == 0) + return APR_SUCCESS; + + rc = DosFreeModule(dso->handle); + + if (rc == 0) + dso->handle = 0; + + return APR_FROM_OS_ERROR(rc); +} + + +APR_DECLARE(apr_status_t) apr_dso_load(apr_dso_handle_t **res_handle, const char *path, apr_pool_t *ctx) +{ + char failed_module[200]; + HMODULE handle; + int rc; + + *res_handle = apr_pcalloc(ctx, sizeof(**res_handle)); + (*res_handle)->cont = ctx; + (*res_handle)->load_error = APR_SUCCESS; + (*res_handle)->failed_module = NULL; + + if ((rc = DosLoadModule(failed_module, sizeof(failed_module), path, &handle)) != 0) { + (*res_handle)->load_error = APR_FROM_OS_ERROR(rc); + (*res_handle)->failed_module = apr_pstrdup(ctx, failed_module); + return APR_FROM_OS_ERROR(rc); + } + + (*res_handle)->handle = handle; + apr_pool_cleanup_register(ctx, *res_handle, dso_cleanup, apr_pool_cleanup_null); + return APR_SUCCESS; +} + + + +APR_DECLARE(apr_status_t) apr_dso_unload(apr_dso_handle_t *handle) +{ + return apr_pool_cleanup_run(handle->cont, handle, dso_cleanup); +} + + + +APR_DECLARE(apr_status_t) apr_dso_sym(apr_dso_handle_sym_t *ressym, + apr_dso_handle_t *handle, + const char *symname) +{ + PFN func; + int rc; + + if (symname == NULL || ressym == NULL) + return APR_ESYMNOTFOUND; + + if ((rc = DosQueryProcAddr(handle->handle, 0, symname, &func)) != 0) { + handle->load_error = APR_FROM_OS_ERROR(rc); + return handle->load_error; + } + + *ressym = func; + return APR_SUCCESS; +} + + + +APR_DECLARE(const char *) apr_dso_error(apr_dso_handle_t *dso, char *buffer, apr_size_t buflen) +{ + char message[200]; + apr_strerror(dso->load_error, message, sizeof(message)); + + if (dso->failed_module != NULL) { + strcat(message, " ("); + strcat(message, dso->failed_module); + strcat(message, ")"); + } + + apr_cpystrn(buffer, message, buflen); + return buffer; +} + + + +APR_DECLARE(apr_status_t) apr_os_dso_handle_put(apr_dso_handle_t **aprdso, + apr_os_dso_handle_t osdso, + apr_pool_t *pool) +{ + *aprdso = apr_pcalloc(pool, sizeof **aprdso); + (*aprdso)->handle = osdso; + (*aprdso)->cont = pool; + (*aprdso)->load_error = APR_SUCCESS; + (*aprdso)->failed_module = NULL; + return APR_SUCCESS; +} + + + +APR_DECLARE(apr_status_t) apr_os_dso_handle_get(apr_os_dso_handle_t *osdso, + apr_dso_handle_t *aprdso) +{ + *osdso = aprdso->handle; + return APR_SUCCESS; +} + +#endif diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/dso/os390/Makefile.in b/rubbos/app/httpd-2.0.64/srclib/apr/dso/os390/Makefile.in new file mode 100644 index 00000000..7d42bded --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/dso/os390/Makefile.in @@ -0,0 +1,14 @@ +srcdir = @srcdir@ +VPATH = @srcdir@ + +TARGETS = dso.lo + +# bring in rules.mk for standard functionality +@INCLUDE_RULES@ + +INCDIR=../../include +OSDIR=$(INCDIR)/arch/@OSDIR@ +DEFOSDIR=$(INCDIR)/arch/@DEFAULT_OSDIR@ +INCLUDES=-I$(INCDIR) -I$(OSDIR) -I$(DEFOSDIR) + +# DO NOT REMOVE diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/dso/os390/dso.c b/rubbos/app/httpd-2.0.64/srclib/apr/dso/os390/dso.c new file mode 100644 index 00000000..9344c71a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/dso/os390/dso.c @@ -0,0 +1,109 @@ +/* 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. + */ + +#include "apr_portable.h" +#include "apr_strings.h" +#include "apr_arch_dso.h" +#include +#include + +#if APR_HAS_DSO + +APR_DECLARE(apr_status_t) apr_os_dso_handle_put(apr_dso_handle_t **aprdso, + apr_os_dso_handle_t osdso, + apr_pool_t *pool) +{ + *aprdso = apr_pcalloc(pool, sizeof **aprdso); + (*aprdso)->handle = osdso; + (*aprdso)->pool = pool; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_os_dso_handle_get(apr_os_dso_handle_t *osdso, + apr_dso_handle_t *aprdso) +{ + *osdso = aprdso->handle; + return APR_SUCCESS; +} + +static apr_status_t dso_cleanup(void *thedso) +{ + apr_dso_handle_t *dso = thedso; + int rc; + + if (dso->handle == 0) + return APR_SUCCESS; + + rc = dllfree(dso->handle); + + if (rc == 0) { + dso->handle = 0; + return APR_SUCCESS; + } + dso->failing_errno = errno; + return errno; +} + +APR_DECLARE(apr_status_t) apr_dso_load(apr_dso_handle_t **res_handle, + const char *path, apr_pool_t *ctx) +{ + dllhandle *handle; + int rc; + + *res_handle = apr_pcalloc(ctx, sizeof(**res_handle)); + (*res_handle)->pool = ctx; + if ((handle = dllload(path)) != NULL) { + (*res_handle)->handle = handle; + apr_pool_cleanup_register(ctx, *res_handle, dso_cleanup, apr_pool_cleanup_null); + return APR_SUCCESS; + } + + (*res_handle)->failing_errno = errno; + return APR_EDSOOPEN; +} + +APR_DECLARE(apr_status_t) apr_dso_unload(apr_dso_handle_t *handle) +{ + return apr_pool_cleanup_run(handle->pool, handle, dso_cleanup); +} + +APR_DECLARE(apr_status_t) apr_dso_sym(apr_dso_handle_sym_t *ressym, + apr_dso_handle_t *handle, + const char *symname) +{ + void *func_ptr; + void *var_ptr; + + if ((var_ptr = dllqueryvar(handle->handle, symname)) != NULL) { + *ressym = var_ptr; + return APR_SUCCESS; + } + if ((func_ptr = (void *)dllqueryfn(handle->handle, symname)) != NULL) { + *ressym = func_ptr; + return APR_SUCCESS; + } + handle->failing_errno = errno; + return APR_ESYMNOTFOUND; +} + +APR_DECLARE(const char *) apr_dso_error(apr_dso_handle_t *handle, char *buffer, + apr_size_t buflen) +{ + apr_cpystrn(buffer, strerror(handle->failing_errno), buflen); + return buffer; +} + +#endif diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/dso/unix/.libs/dso.o b/rubbos/app/httpd-2.0.64/srclib/apr/dso/unix/.libs/dso.o new file mode 100644 index 0000000000000000000000000000000000000000..0835f7396aebcf1a3dc186a9d40a5669da110cff GIT binary patch literal 13312 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/dso/unix/Makefile b/rubbos/app/httpd-2.0.64/srclib/apr/dso/unix/Makefile new file mode 100644 index 00000000..786f8829 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/dso/unix/Makefile @@ -0,0 +1,14 @@ +srcdir = . + + +TARGETS = dso.lo + +# bring in rules.mk for standard functionality +include /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/build/apr_rules.mk + +INCDIR=../../include +INCDIR2=$(INCDIR)/arch +INCDIR3=$(INCDIR)/arch/unix +INCLUDES=-I$(INCDIR) -I$(INCDIR2) -I$(INCDIR3) + +# DO NOT REMOVE diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/dso/unix/Makefile.in b/rubbos/app/httpd-2.0.64/srclib/apr/dso/unix/Makefile.in new file mode 100644 index 00000000..89c6b25b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/dso/unix/Makefile.in @@ -0,0 +1,14 @@ +srcdir = @srcdir@ +VPATH = @srcdir@ + +TARGETS = dso.lo + +# bring in rules.mk for standard functionality +@INCLUDE_RULES@ + +INCDIR=../../include +INCDIR2=$(INCDIR)/arch +INCDIR3=$(INCDIR)/arch/unix +INCLUDES=-I$(INCDIR) -I$(INCDIR2) -I$(INCDIR3) + +# DO NOT REMOVE diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/dso/unix/dso.c b/rubbos/app/httpd-2.0.64/srclib/apr/dso/unix/dso.c new file mode 100644 index 00000000..bbe87c6c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/dso/unix/dso.c @@ -0,0 +1,250 @@ +/* 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. + */ + +#include "apr_arch_dso.h" +#include "apr_strings.h" +#include "apr_portable.h" + +#if APR_HAS_DSO + +#if !defined(DSO_USE_DLFCN) && !defined(DSO_USE_SHL) && !defined(DSO_USE_DYLD) +#error No DSO implementation specified. +#endif + +#ifdef HAVE_STDDEF_H +#include +#endif +#if APR_HAVE_STDLIB_H +#include /* malloc(), free() */ +#endif +#if APR_HAVE_STRING_H +#include /* for strerror() on HP-UX */ +#endif + +#if defined(DSO_USE_DYLD) +#define DYLD_LIBRARY_HANDLE (void *)-1 +#endif + +APR_DECLARE(apr_status_t) apr_os_dso_handle_put(apr_dso_handle_t **aprdso, + apr_os_dso_handle_t osdso, + apr_pool_t *pool) +{ + *aprdso = apr_pcalloc(pool, sizeof **aprdso); + (*aprdso)->handle = osdso; + (*aprdso)->pool = pool; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_os_dso_handle_get(apr_os_dso_handle_t *osdso, + apr_dso_handle_t *aprdso) +{ + *osdso = aprdso->handle; + return APR_SUCCESS; +} + +static apr_status_t dso_cleanup(void *thedso) +{ + apr_dso_handle_t *dso = thedso; + + if (dso->handle == NULL) + return APR_SUCCESS; + +#if defined(DSO_USE_SHL) + shl_unload((shl_t)dso->handle); +#elif defined(DSO_USE_DYLD) + if (dso->handle != DYLD_LIBRARY_HANDLE) { + NSUnLinkModule(dso->handle, FALSE); + } +#elif defined(DSO_USE_DLFCN) + if (dlclose(dso->handle) != 0) + return APR_EINIT; +#endif + dso->handle = NULL; + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_dso_load(apr_dso_handle_t **res_handle, + const char *path, apr_pool_t *pool) +{ +#if defined(DSO_USE_SHL) + shl_t os_handle = shl_load(path, BIND_IMMEDIATE, 0L); + +#elif defined(DSO_USE_DYLD) + NSObjectFileImage image; + NSModule os_handle = NULL; + NSObjectFileImageReturnCode dsoerr; + const char* err_msg = NULL; + dsoerr = NSCreateObjectFileImageFromFile(path, &image); + + if (dsoerr == NSObjectFileImageSuccess) { +#if defined(NSLINKMODULE_OPTION_RETURN_ON_ERROR) && defined(NSLINKMODULE_OPTION_NONE) + os_handle = NSLinkModule(image, path, + NSLINKMODULE_OPTION_RETURN_ON_ERROR | + NSLINKMODULE_OPTION_NONE); + /* If something went wrong, get the errors... */ + if (!os_handle) { + NSLinkEditErrors errors; + int errorNumber; + const char *fileName; + NSLinkEditError(&errors, &errorNumber, &fileName, &err_msg); + } +#else + os_handle = NSLinkModule(image, path, FALSE); +#endif + NSDestroyObjectFileImage(image); + } + else if ((dsoerr == NSObjectFileImageFormat || + dsoerr == NSObjectFileImageInappropriateFile) && + NSAddLibrary(path) == TRUE) { + os_handle = (NSModule)DYLD_LIBRARY_HANDLE; + } + else { + err_msg = "cannot create object file image or add library"; + } + +#elif defined(DSO_USE_DLFCN) +#if defined(OSF1) || defined(SEQUENT) || defined(SNI) ||\ + (defined(__FreeBSD_version) && (__FreeBSD_version >= 220000)) + void *os_handle = dlopen((char *)path, RTLD_NOW | RTLD_GLOBAL); + +#else + int flags = RTLD_NOW | RTLD_GLOBAL; + void *os_handle; +#ifdef _AIX + if (strchr(path + 1, '(') && path[strlen(path) - 1] == ')') + { + /* This special archive.a(dso.so) syntax is required for + * the way libtool likes to build shared libraries on AIX. + * dlopen() support for such a library requires that the + * RTLD_MEMBER flag be enabled. + */ + flags |= RTLD_MEMBER; + } +#endif + os_handle = dlopen(path, flags); +#endif +#endif /* DSO_USE_x */ + + *res_handle = apr_pcalloc(pool, sizeof(**res_handle)); + + if(os_handle == NULL) { +#if defined(DSO_USE_SHL) + (*res_handle)->errormsg = strerror(errno); + return APR_EDSOOPEN; +#elif defined(DSO_USE_DYLD) + (*res_handle)->errormsg = (err_msg) ? err_msg : "link failed"; + return APR_EDSOOPEN; +#elif defined(DSO_USE_DLFCN) + (*res_handle)->errormsg = dlerror(); + return APR_EDSOOPEN; +#endif + } + + (*res_handle)->handle = (void*)os_handle; + (*res_handle)->pool = pool; + (*res_handle)->errormsg = NULL; + + apr_pool_cleanup_register(pool, *res_handle, dso_cleanup, apr_pool_cleanup_null); + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_dso_unload(apr_dso_handle_t *handle) +{ + return apr_pool_cleanup_run(handle->pool, handle, dso_cleanup); +} + +APR_DECLARE(apr_status_t) apr_dso_sym(apr_dso_handle_sym_t *ressym, + apr_dso_handle_t *handle, + const char *symname) +{ +#if defined(DSO_USE_SHL) + void *symaddr = NULL; + int status; + + errno = 0; + status = shl_findsym((shl_t *)&handle->handle, symname, TYPE_PROCEDURE, &symaddr); + if (status == -1 && errno == 0) /* try TYPE_DATA instead */ + status = shl_findsym((shl_t *)&handle->handle, symname, TYPE_DATA, &symaddr); + if (status == -1) + return APR_ESYMNOTFOUND; + *ressym = symaddr; + return APR_SUCCESS; + +#elif defined(DSO_USE_DYLD) + void *retval = NULL; + NSSymbol symbol; + char *symname2 = (char*)malloc(sizeof(char)*(strlen(symname)+2)); + sprintf(symname2, "_%s", symname); +#ifdef NSLINKMODULE_OPTION_PRIVATE + if (handle->handle == DYLD_LIBRARY_HANDLE) { + symbol = NSLookupAndBindSymbol(symname2); + } + else { + symbol = NSLookupSymbolInModule((NSModule)handle->handle, symname2); + } +#else + symbol = NSLookupAndBindSymbol(symname2); +#endif + free(symname2); + if (symbol == NULL) { + handle->errormsg = "undefined symbol"; + return APR_ESYMNOTFOUND; + } + retval = NSAddressOfSymbol(symbol); + if (retval == NULL) { + handle->errormsg = "cannot resolve symbol"; + return APR_ESYMNOTFOUND; + } + *ressym = retval; + return APR_SUCCESS; +#elif defined(DSO_USE_DLFCN) + +#if defined(DLSYM_NEEDS_UNDERSCORE) + void *retval; + char *symbol = (char*)malloc(sizeof(char)*(strlen(symname)+2)); + sprintf(symbol, "_%s", symname); + retval = dlsym(handle->handle, symbol); + free(symbol); +#elif defined(SEQUENT) || defined(SNI) + void *retval = dlsym(handle->handle, (char *)symname); +#else + void *retval = dlsym(handle->handle, symname); +#endif /* DLSYM_NEEDS_UNDERSCORE */ + + if (retval == NULL) { + handle->errormsg = dlerror(); + return APR_ESYMNOTFOUND; + } + + *ressym = retval; + + return APR_SUCCESS; +#endif /* DSO_USE_x */ +} + +APR_DECLARE(const char *) apr_dso_error(apr_dso_handle_t *dso, char *buffer, + apr_size_t buflen) +{ + if (dso->errormsg) { + apr_cpystrn(buffer, dso->errormsg, buflen); + return dso->errormsg; + } + return "No Error"; +} + +#endif diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/dso/unix/dso.lo b/rubbos/app/httpd-2.0.64/srclib/apr/dso/unix/dso.lo new file mode 100644 index 00000000..96207a16 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/dso/unix/dso.lo @@ -0,0 +1,12 @@ +# dso.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/dso.o' + +# Name of the non-PIC object. +non_pic_object='dso.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/dso/unix/dso.o b/rubbos/app/httpd-2.0.64/srclib/apr/dso/unix/dso.o new file mode 100644 index 0000000000000000000000000000000000000000..7ac432e72f79fd325b8a810fa4d53129377075d5 GIT binary patch literal 13248 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/dso/win32/dso.c b/rubbos/app/httpd-2.0.64/srclib/apr/dso/win32/dso.c new file mode 100644 index 00000000..d4a68938 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/dso/win32/dso.c @@ -0,0 +1,167 @@ +/* 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. + */ + +#include "apr_arch_dso.h" +#include "apr_strings.h" +#include "apr_private.h" +#include "apr_arch_file_io.h" +#include "apr_arch_utf8.h" + +#if APR_HAS_DSO + +APR_DECLARE(apr_status_t) apr_os_dso_handle_put(apr_dso_handle_t **aprdso, + apr_os_dso_handle_t osdso, + apr_pool_t *pool) +{ + *aprdso = apr_pcalloc(pool, sizeof **aprdso); + (*aprdso)->handle = osdso; + (*aprdso)->cont = pool; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_os_dso_handle_get(apr_os_dso_handle_t *osdso, + apr_dso_handle_t *aprdso) +{ + *osdso = aprdso->handle; + return APR_SUCCESS; +} + +static apr_status_t dso_cleanup(void *thedso) +{ + apr_dso_handle_t *dso = thedso; + + if (dso->handle != NULL && !FreeLibrary(dso->handle)) { + return apr_get_os_error(); + } + dso->handle = NULL; + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_dso_load(struct apr_dso_handle_t **res_handle, + const char *path, apr_pool_t *ctx) +{ + HINSTANCE os_handle; + apr_status_t rv; +#ifndef _WIN32_WCE + UINT em; +#endif + +#if APR_HAS_UNICODE_FS + IF_WIN_OS_IS_UNICODE + { + apr_wchar_t wpath[APR_PATH_MAX]; + if ((rv = utf8_to_unicode_path(wpath, sizeof(wpath) + / sizeof(apr_wchar_t), path)) + != APR_SUCCESS) { + *res_handle = apr_pcalloc(ctx, sizeof(**res_handle)); + return ((*res_handle)->load_error = rv); + } + /* Prevent ugly popups from killing our app */ +#ifndef _WIN32_WCE + em = SetErrorMode(SEM_FAILCRITICALERRORS); +#endif + os_handle = LoadLibraryExW(wpath, NULL, 0); + if (!os_handle) + os_handle = LoadLibraryExW(wpath, NULL, LOAD_WITH_ALTERED_SEARCH_PATH); + if (!os_handle) + rv = apr_get_os_error(); +#ifndef _WIN32_WCE + SetErrorMode(em); +#endif + } +#endif /* APR_HAS_UNICODE_FS */ +#if APR_HAS_ANSI_FS + ELSE_WIN_OS_IS_ANSI + { + char fspec[APR_PATH_MAX], *p = fspec; + /* Must convert path from / to \ notation. + * Per PR2555, the LoadLibraryEx function is very picky about slashes. + * Debugging on NT 4 SP 6a reveals First Chance Exception within NTDLL. + * LoadLibrary in the MS PSDK also reveals that it -explicitly- states + * that backslashes must be used for the LoadLibrary family of calls. + */ + apr_cpystrn(fspec, path, sizeof(fspec)); + while ((p = strchr(p, '/')) != NULL) + *p = '\\'; + + /* Prevent ugly popups from killing our app */ + em = SetErrorMode(SEM_FAILCRITICALERRORS); + os_handle = LoadLibraryEx(path, NULL, LOAD_WITH_ALTERED_SEARCH_PATH); + if (!os_handle) + os_handle = LoadLibraryEx(path, NULL, 0); + if (!os_handle) + rv = apr_get_os_error(); + else + rv = APR_SUCCESS; + SetErrorMode(em); + } +#endif + + *res_handle = apr_pcalloc(ctx, sizeof(**res_handle)); + (*res_handle)->cont = ctx; + + if (rv) { + return ((*res_handle)->load_error = rv); + } + + (*res_handle)->handle = (void*)os_handle; + (*res_handle)->load_error = APR_SUCCESS; + + apr_pool_cleanup_register(ctx, *res_handle, dso_cleanup, apr_pool_cleanup_null); + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_dso_unload(struct apr_dso_handle_t *handle) +{ + return apr_pool_cleanup_run(handle->cont, handle, dso_cleanup); +} + +APR_DECLARE(apr_status_t) apr_dso_sym(apr_dso_handle_sym_t *ressym, + struct apr_dso_handle_t *handle, + const char *symname) +{ +#ifdef _WIN32_WCE + apr_size_t symlen = strlen(symname) + 1; + apr_size_t wsymlen = 256; + apr_wchar_t wsymname[256]; + apr_status_t rv; + + rv = apr_conv_utf8_to_ucs2(wsymname, &wsymlen, symname, &symlen); + if (rv != APR_SUCCESS) { + return rv; + } + else if (symlen) { + return APR_ENAMETOOLONG; + } + + *ressym = (apr_dso_handle_sym_t)GetProcAddressW(handle->handle, wsymname); +#else + *ressym = (apr_dso_handle_sym_t)GetProcAddress(handle->handle, symname); +#endif + if (!*ressym) { + return apr_get_os_error(); + } + return APR_SUCCESS; +} + +APR_DECLARE(const char *) apr_dso_error(apr_dso_handle_t *dso, char *buf, apr_size_t bufsize) +{ + return apr_strerror(dso->load_error, buf, bufsize); +} + +#endif diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/export_vars.c b/rubbos/app/httpd-2.0.64/srclib/apr/export_vars.c new file mode 100644 index 00000000..65708e36 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/export_vars.c @@ -0,0 +1,2 @@ +apr_month_snames +apr_day_snames diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/exports.c b/rubbos/app/httpd-2.0.64/srclib/apr/exports.c new file mode 100644 index 00000000..ef452009 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/exports.c @@ -0,0 +1,659 @@ +/* + * THIS FILE WAS AUTOGENERATED BY make_exports.awk + * + * This is an ugly hack that needs to be here, so + * that libtool will link all of the APR functions + * into server regardless of whether the base server + * uses them. + */ + +#define CORE_PRIVATE + +#include "apr_allocator.h" +#include "apr_atomic.h" +#include "apr_compat.h" +#include "apr_dso.h" +#include "apr_env.h" +#include "apr_errno.h" +#include "apr_file_info.h" +#include "apr_file_io.h" +#include "apr_fnmatch.h" +#include "apr_general.h" +#include "apr_getopt.h" +#include "apr_global_mutex.h" +#include "apr.h" +#include "apr_hash.h" +#include "apr_inherit.h" +#include "apr_lib.h" +#include "apr_mmap.h" +#include "apr_network_io.h" +#include "apr_poll.h" +#include "apr_pools.h" +#include "apr_portable.h" +#include "apr_proc_mutex.h" +#include "apr_ring.h" +#include "apr_shm.h" +#include "apr_signal.h" +#include "apr_strings.h" +#include "apr_support.h" +#include "apr_tables.h" +#include "apr_thread_cond.h" +#include "apr_thread_mutex.h" +#include "apr_thread_proc.h" +#include "apr_thread_rwlock.h" +#include "apr_time.h" +#include "apr_user.h" +#include "apr_version.h" +#include "apr_want.h" + +const void *ap_ugly_hack = NULL; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_allocator.h + */ +const void *ap_hack_apr_allocator_create = (const void *)apr_allocator_create; +const void *ap_hack_apr_allocator_destroy = (const void *)apr_allocator_destroy; +const void *ap_hack_apr_allocator_alloc = (const void *)apr_allocator_alloc; +const void *ap_hack_apr_allocator_free = (const void *)apr_allocator_free; +const void *ap_hack_apr_allocator_owner_set = (const void *)apr_allocator_owner_set; +const void *ap_hack_apr_allocator_set_owner = (const void *)apr_allocator_set_owner; +const void *ap_hack_apr_allocator_owner_get = (const void *)apr_allocator_owner_get; +const void *ap_hack_apr_allocator_get_owner = (const void *)apr_allocator_get_owner; +const void *ap_hack_apr_allocator_max_free_set = (const void *)apr_allocator_max_free_set; +const void *ap_hack_apr_allocator_set_max_free = (const void *)apr_allocator_set_max_free; +#if APR_HAS_THREADS +const void *ap_hack_apr_allocator_mutex_set = (const void *)apr_allocator_mutex_set; +const void *ap_hack_apr_allocator_set_mutex = (const void *)apr_allocator_set_mutex; +const void *ap_hack_apr_allocator_mutex_get = (const void *)apr_allocator_mutex_get; +const void *ap_hack_apr_allocator_get_mutex = (const void *)apr_allocator_get_mutex; +#endif /* APR_HAS_THREADS */ + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_dso.h + */ +#if APR_HAS_DSO || defined(DOXYGEN) +const void *ap_hack_apr_dso_load = (const void *)apr_dso_load; +const void *ap_hack_apr_dso_unload = (const void *)apr_dso_unload; +const void *ap_hack_apr_dso_sym = (const void *)apr_dso_sym; +const void *ap_hack_apr_dso_error = (const void *)apr_dso_error; +#endif /* APR_HAS_DSO */ + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_env.h + */ +const void *ap_hack_apr_env_get = (const void *)apr_env_get; +const void *ap_hack_apr_env_set = (const void *)apr_env_set; +const void *ap_hack_apr_env_delete = (const void *)apr_env_delete; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_errno.h + */ +const void *ap_hack_apr_strerror = (const void *)apr_strerror; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_file_info.h + */ +const void *ap_hack_apr_stat = (const void *)apr_stat; +const void *ap_hack_apr_lstat = (const void *)apr_lstat; +const void *ap_hack_apr_dir_open = (const void *)apr_dir_open; +const void *ap_hack_apr_dir_close = (const void *)apr_dir_close; +const void *ap_hack_apr_dir_read = (const void *)apr_dir_read; +const void *ap_hack_apr_dir_rewind = (const void *)apr_dir_rewind; +const void *ap_hack_apr_filepath_root = (const void *)apr_filepath_root; +const void *ap_hack_apr_filepath_merge = (const void *)apr_filepath_merge; +const void *ap_hack_apr_filepath_list_split = (const void *)apr_filepath_list_split; +const void *ap_hack_apr_filepath_list_merge = (const void *)apr_filepath_list_merge; +const void *ap_hack_apr_filepath_get = (const void *)apr_filepath_get; +const void *ap_hack_apr_filepath_set = (const void *)apr_filepath_set; +const void *ap_hack_apr_filepath_encoding = (const void *)apr_filepath_encoding; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_file_io.h + */ +const void *ap_hack_apr_file_open = (const void *)apr_file_open; +const void *ap_hack_apr_file_close = (const void *)apr_file_close; +const void *ap_hack_apr_file_remove = (const void *)apr_file_remove; +const void *ap_hack_apr_file_rename = (const void *)apr_file_rename; +const void *ap_hack_apr_file_copy = (const void *)apr_file_copy; +const void *ap_hack_apr_file_append = (const void *)apr_file_append; +const void *ap_hack_apr_file_eof = (const void *)apr_file_eof; +const void *ap_hack_apr_file_open_stderr = (const void *)apr_file_open_stderr; +const void *ap_hack_apr_file_open_stdout = (const void *)apr_file_open_stdout; +const void *ap_hack_apr_file_open_stdin = (const void *)apr_file_open_stdin; +const void *ap_hack_apr_file_read = (const void *)apr_file_read; +const void *ap_hack_apr_file_write = (const void *)apr_file_write; +const void *ap_hack_apr_file_writev = (const void *)apr_file_writev; +const void *ap_hack_apr_file_read_full = (const void *)apr_file_read_full; +const void *ap_hack_apr_file_write_full = (const void *)apr_file_write_full; +const void *ap_hack_apr_file_putc = (const void *)apr_file_putc; +const void *ap_hack_apr_file_getc = (const void *)apr_file_getc; +const void *ap_hack_apr_file_ungetc = (const void *)apr_file_ungetc; +const void *ap_hack_apr_file_gets = (const void *)apr_file_gets; +const void *ap_hack_apr_file_puts = (const void *)apr_file_puts; +const void *ap_hack_apr_file_flush = (const void *)apr_file_flush; +const void *ap_hack_apr_file_dup = (const void *)apr_file_dup; +const void *ap_hack_apr_file_dup2 = (const void *)apr_file_dup2; +const void *ap_hack_apr_file_setaside = (const void *)apr_file_setaside; +const void *ap_hack_apr_file_seek = (const void *)apr_file_seek; +const void *ap_hack_apr_file_pipe_create = (const void *)apr_file_pipe_create; +const void *ap_hack_apr_file_namedpipe_create = (const void *)apr_file_namedpipe_create; +const void *ap_hack_apr_file_pipe_timeout_get = (const void *)apr_file_pipe_timeout_get; +const void *ap_hack_apr_file_pipe_timeout_set = (const void *)apr_file_pipe_timeout_set; +const void *ap_hack_apr_file_lock = (const void *)apr_file_lock; +const void *ap_hack_apr_file_unlock = (const void *)apr_file_unlock; +const void *ap_hack_apr_file_name_get = (const void *)apr_file_name_get; +const void *ap_hack_apr_file_data_get = (const void *)apr_file_data_get; +const void *ap_hack_apr_file_data_set = (const void *)apr_file_data_set; +const void *ap_hack_apr_file_printf = (const void *)apr_file_printf; +const void *ap_hack_apr_file_perms_set = (const void *)apr_file_perms_set; +const void *ap_hack_apr_file_attrs_set = (const void *)apr_file_attrs_set; +const void *ap_hack_apr_file_mtime_set = (const void *)apr_file_mtime_set; +const void *ap_hack_apr_dir_make = (const void *)apr_dir_make; +const void *ap_hack_apr_dir_make_recursive = (const void *)apr_dir_make_recursive; +const void *ap_hack_apr_dir_remove = (const void *)apr_dir_remove; +const void *ap_hack_apr_file_info_get = (const void *)apr_file_info_get; +const void *ap_hack_apr_file_trunc = (const void *)apr_file_trunc; +const void *ap_hack_apr_file_flags_get = (const void *)apr_file_flags_get; +const void *ap_hack_apr_file_pool_get = (const void *)apr_file_pool_get; +const void *ap_hack_apr_file_inherit_set = (const void *)apr_file_inherit_set; +const void *ap_hack_apr_file_set_inherit = (const void *)apr_file_set_inherit; +const void *ap_hack_apr_file_inherit_unset = (const void *)apr_file_inherit_unset; +const void *ap_hack_apr_file_unset_inherit = (const void *)apr_file_unset_inherit; +const void *ap_hack_apr_file_mktemp = (const void *)apr_file_mktemp; +const void *ap_hack_apr_temp_dir_get = (const void *)apr_temp_dir_get; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_fnmatch.h + */ +const void *ap_hack_apr_fnmatch = (const void *)apr_fnmatch; +const void *ap_hack_apr_fnmatch_test = (const void *)apr_fnmatch_test; +const void *ap_hack_apr_is_fnmatch = (const void *)apr_is_fnmatch; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_general.h + */ +const void *ap_hack_apr_initialize = (const void *)apr_initialize; +const void *ap_hack_apr_app_initialize = (const void *)apr_app_initialize; +const void *ap_hack_apr_terminate = (const void *)apr_terminate; +const void *ap_hack_apr_terminate2 = (const void *)apr_terminate2; +#if APR_HAS_RANDOM || defined(DOXYGEN) +#ifdef APR_ENABLE_FOR_1_0 +const void *ap_hack_apr_generate_random_bytes = (const void *)apr_generate_random_bytes; +#else +const void *ap_hack_apr_generate_random_bytes = (const void *)apr_generate_random_bytes; +#endif +#endif + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_getopt.h + */ +const void *ap_hack_apr_getopt_init = (const void *)apr_getopt_init; +const void *ap_hack_apr_getopt = (const void *)apr_getopt; +const void *ap_hack_apr_getopt_long = (const void *)apr_getopt_long; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_global_mutex.h + */ +#if !APR_PROC_MUTEX_IS_GLOBAL || defined(DOXYGEN) +const void *ap_hack_apr_global_mutex_create = (const void *)apr_global_mutex_create; +const void *ap_hack_apr_global_mutex_child_init = (const void *)apr_global_mutex_child_init; +const void *ap_hack_apr_global_mutex_lock = (const void *)apr_global_mutex_lock; +const void *ap_hack_apr_global_mutex_trylock = (const void *)apr_global_mutex_trylock; +const void *ap_hack_apr_global_mutex_unlock = (const void *)apr_global_mutex_unlock; +const void *ap_hack_apr_global_mutex_destroy = (const void *)apr_global_mutex_destroy; +const void *ap_hack_apr_global_mutex_pool_get = (const void *)apr_global_mutex_pool_get; +#else /* APR_PROC_MUTEX_IS_GLOBAL */ +#endif + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_hash.h + */ +const void *ap_hack_apr_hash_make = (const void *)apr_hash_make; +const void *ap_hack_apr_hash_copy = (const void *)apr_hash_copy; +const void *ap_hack_apr_hash_set = (const void *)apr_hash_set; +const void *ap_hack_apr_hash_get = (const void *)apr_hash_get; +const void *ap_hack_apr_hash_first = (const void *)apr_hash_first; +const void *ap_hack_apr_hash_next = (const void *)apr_hash_next; +const void *ap_hack_apr_hash_this = (const void *)apr_hash_this; +const void *ap_hack_apr_hash_count = (const void *)apr_hash_count; +const void *ap_hack_apr_hash_overlay = (const void *)apr_hash_overlay; +const void *ap_hack_apr_hash_merge = (const void *)apr_hash_merge; +const void *ap_hack_apr_hash_pool_get = (const void *)apr_hash_pool_get; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_lib.h + */ +const void *ap_hack_apr_filepath_name_get = (const void *)apr_filepath_name_get; +const void *ap_hack_apr_filename_of_pathname = (const void *)apr_filename_of_pathname; +const void *ap_hack_apr_vformatter = (const void *)apr_vformatter; +const void *ap_hack_apr_password_get = (const void *)apr_password_get; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_mmap.h + */ +#if APR_HAS_MMAP || defined(DOXYGEN) +const void *ap_hack_apr_mmap_create = (const void *)apr_mmap_create; +const void *ap_hack_apr_mmap_dup = (const void *)apr_mmap_dup; +#if defined(DOXYGEN) +const void *ap_hack_apr_mmap_setaside = (const void *)apr_mmap_setaside; +#else +#endif /* DOXYGEN */ +const void *ap_hack_apr_mmap_delete = (const void *)apr_mmap_delete; +const void *ap_hack_apr_mmap_offset = (const void *)apr_mmap_offset; +#endif /* APR_HAS_MMAP */ + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_network_io.h + */ +const void *ap_hack_apr_socket_create = (const void *)apr_socket_create; +const void *ap_hack_apr_socket_create_ex = (const void *)apr_socket_create_ex; +const void *ap_hack_apr_socket_shutdown = (const void *)apr_socket_shutdown; +const void *ap_hack_apr_shutdown = (const void *)apr_shutdown; +const void *ap_hack_apr_socket_close = (const void *)apr_socket_close; +const void *ap_hack_apr_socket_bind = (const void *)apr_socket_bind; +const void *ap_hack_apr_bind = (const void *)apr_bind; +const void *ap_hack_apr_socket_listen = (const void *)apr_socket_listen; +const void *ap_hack_apr_listen = (const void *)apr_listen; +const void *ap_hack_apr_socket_accept = (const void *)apr_socket_accept; +const void *ap_hack_apr_accept = (const void *)apr_accept; +const void *ap_hack_apr_socket_connect = (const void *)apr_socket_connect; +const void *ap_hack_apr_connect = (const void *)apr_connect; +const void *ap_hack_apr_sockaddr_info_get = (const void *)apr_sockaddr_info_get; +const void *ap_hack_apr_getnameinfo = (const void *)apr_getnameinfo; +const void *ap_hack_apr_parse_addr_port = (const void *)apr_parse_addr_port; +const void *ap_hack_apr_gethostname = (const void *)apr_gethostname; +const void *ap_hack_apr_socket_data_get = (const void *)apr_socket_data_get; +const void *ap_hack_apr_socket_data_set = (const void *)apr_socket_data_set; +const void *ap_hack_apr_socket_send = (const void *)apr_socket_send; +const void *ap_hack_apr_send = (const void *)apr_send; +const void *ap_hack_apr_socket_sendv = (const void *)apr_socket_sendv; +const void *ap_hack_apr_sendv = (const void *)apr_sendv; +const void *ap_hack_apr_socket_sendto = (const void *)apr_socket_sendto; +const void *ap_hack_apr_sendto = (const void *)apr_sendto; +const void *ap_hack_apr_socket_recvfrom = (const void *)apr_socket_recvfrom; +const void *ap_hack_apr_recvfrom = (const void *)apr_recvfrom; +#if APR_HAS_SENDFILE || defined(DOXYGEN) +const void *ap_hack_apr_socket_sendfile = (const void *)apr_socket_sendfile; +const void *ap_hack_apr_sendfile = (const void *)apr_sendfile; +#endif /* APR_HAS_SENDFILE */ +const void *ap_hack_apr_socket_recv = (const void *)apr_socket_recv; +const void *ap_hack_apr_recv = (const void *)apr_recv; +const void *ap_hack_apr_socket_opt_set = (const void *)apr_socket_opt_set; +const void *ap_hack_apr_setsocketopt = (const void *)apr_setsocketopt; +const void *ap_hack_apr_socket_timeout_set = (const void *)apr_socket_timeout_set; +const void *ap_hack_apr_socket_opt_get = (const void *)apr_socket_opt_get; +const void *ap_hack_apr_getsocketopt = (const void *)apr_getsocketopt; +const void *ap_hack_apr_socket_timeout_get = (const void *)apr_socket_timeout_get; +const void *ap_hack_apr_socket_atmark = (const void *)apr_socket_atmark; +const void *ap_hack_apr_socket_addr_get = (const void *)apr_socket_addr_get; +const void *ap_hack_apr_sockaddr_port_set = (const void *)apr_sockaddr_port_set; +const void *ap_hack_apr_sockaddr_port_get = (const void *)apr_sockaddr_port_get; +const void *ap_hack_apr_sockaddr_ip_set = (const void *)apr_sockaddr_ip_set; +const void *ap_hack_apr_sockaddr_ip_get = (const void *)apr_sockaddr_ip_get; +const void *ap_hack_apr_sockaddr_equal = (const void *)apr_sockaddr_equal; +#if APR_FILES_AS_SOCKETS || defined(DOXYGEN) +const void *ap_hack_apr_socket_from_file = (const void *)apr_socket_from_file; +#endif /* APR_FILES_AS_SOCKETS */ +const void *ap_hack_apr_getservbyname = (const void *)apr_getservbyname; +const void *ap_hack_apr_ipsubnet_create = (const void *)apr_ipsubnet_create; +const void *ap_hack_apr_ipsubnet_test = (const void *)apr_ipsubnet_test; +const void *ap_hack_apr_socket_protocol_get = (const void *)apr_socket_protocol_get; +const void *ap_hack_apr_socket_inherit_set = (const void *)apr_socket_inherit_set; +const void *ap_hack_apr_socket_set_inherit = (const void *)apr_socket_set_inherit; +const void *ap_hack_apr_socket_inherit_unset = (const void *)apr_socket_inherit_unset; +const void *ap_hack_apr_socket_unset_inherit = (const void *)apr_socket_unset_inherit; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_poll.h + */ +const void *ap_hack_apr_poll_setup = (const void *)apr_poll_setup; +const void *ap_hack_apr_poll = (const void *)apr_poll; +const void *ap_hack_apr_poll_socket_add = (const void *)apr_poll_socket_add; +const void *ap_hack_apr_poll_socket_mask = (const void *)apr_poll_socket_mask; +const void *ap_hack_apr_poll_socket_remove = (const void *)apr_poll_socket_remove; +const void *ap_hack_apr_poll_socket_clear = (const void *)apr_poll_socket_clear; +const void *ap_hack_apr_poll_revents_get = (const void *)apr_poll_revents_get; +const void *ap_hack_apr_pollset_create = (const void *)apr_pollset_create; +const void *ap_hack_apr_pollset_destroy = (const void *)apr_pollset_destroy; +const void *ap_hack_apr_pollset_add = (const void *)apr_pollset_add; +const void *ap_hack_apr_pollset_remove = (const void *)apr_pollset_remove; +const void *ap_hack_apr_pollset_poll = (const void *)apr_pollset_poll; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_pools.h + */ +const void *ap_hack_apr_pool_initialize = (const void *)apr_pool_initialize; +const void *ap_hack_apr_pool_terminate = (const void *)apr_pool_terminate; +const void *ap_hack_apr_pool_create_ex = (const void *)apr_pool_create_ex; +const void *ap_hack_apr_pool_create_ex_debug = (const void *)apr_pool_create_ex_debug; +#if defined(DOXYGEN) +const void *ap_hack_apr_pool_create = (const void *)apr_pool_create; +#else +#endif +const void *ap_hack_apr_pool_allocator_get = (const void *)apr_pool_allocator_get; +const void *ap_hack_apr_pool_clear = (const void *)apr_pool_clear; +const void *ap_hack_apr_pool_clear_debug = (const void *)apr_pool_clear_debug; +const void *ap_hack_apr_pool_destroy = (const void *)apr_pool_destroy; +const void *ap_hack_apr_pool_destroy_debug = (const void *)apr_pool_destroy_debug; +const void *ap_hack_apr_palloc = (const void *)apr_palloc; +const void *ap_hack_apr_palloc_debug = (const void *)apr_palloc_debug; +#if defined(DOXYGEN) +const void *ap_hack_apr_pcalloc = (const void *)apr_pcalloc; +#elif !APR_POOL_DEBUG +#endif +const void *ap_hack_apr_pcalloc_debug = (const void *)apr_pcalloc_debug; +const void *ap_hack_apr_pool_abort_set = (const void *)apr_pool_abort_set; +const void *ap_hack_apr_pool_set_abort = (const void *)apr_pool_set_abort; +const void *ap_hack_apr_pool_abort_get = (const void *)apr_pool_abort_get; +const void *ap_hack_apr_pool_get_abort = (const void *)apr_pool_get_abort; +const void *ap_hack_apr_pool_parent_get = (const void *)apr_pool_parent_get; +const void *ap_hack_apr_pool_get_parent = (const void *)apr_pool_get_parent; +const void *ap_hack_apr_pool_is_ancestor = (const void *)apr_pool_is_ancestor; +const void *ap_hack_apr_pool_tag = (const void *)apr_pool_tag; +const void *ap_hack_apr_pool_userdata_set = (const void *)apr_pool_userdata_set; +const void *ap_hack_apr_pool_userdata_setn = (const void *)apr_pool_userdata_setn; +const void *ap_hack_apr_pool_userdata_get = (const void *)apr_pool_userdata_get; +const void *ap_hack_apr_pool_cleanup_register = (const void *)apr_pool_cleanup_register; +const void *ap_hack_apr_pool_cleanup_kill = (const void *)apr_pool_cleanup_kill; +const void *ap_hack_apr_pool_child_cleanup_set = (const void *)apr_pool_child_cleanup_set; +const void *ap_hack_apr_pool_cleanup_run = (const void *)apr_pool_cleanup_run; +const void *ap_hack_apr_pool_cleanup_null = (const void *)apr_pool_cleanup_null; +const void *ap_hack_apr_pool_cleanup_for_exec = (const void *)apr_pool_cleanup_for_exec; +#if APR_POOL_DEBUG || defined(DOXYGEN) +const void *ap_hack_apr_pool_join = (const void *)apr_pool_join; +const void *ap_hack_apr_pool_find = (const void *)apr_pool_find; +const void *ap_hack_apr_pool_num_bytes = (const void *)apr_pool_num_bytes; +const void *ap_hack_apr_pool_lock = (const void *)apr_pool_lock; +#else /* APR_POOL_DEBUG or DOXYGEN */ +#endif /* APR_POOL_DEBUG or DOXYGEN */ + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_portable.h + */ +#if APR_PROC_MUTEX_IS_GLOBAL || defined(DOXYGEN) +#else +const void *ap_hack_apr_os_global_mutex_get = (const void *)apr_os_global_mutex_get; +#endif +const void *ap_hack_apr_os_file_get = (const void *)apr_os_file_get; +const void *ap_hack_apr_os_dir_get = (const void *)apr_os_dir_get; +const void *ap_hack_apr_os_sock_get = (const void *)apr_os_sock_get; +const void *ap_hack_apr_os_proc_mutex_get = (const void *)apr_os_proc_mutex_get; +const void *ap_hack_apr_os_exp_time_get = (const void *)apr_os_exp_time_get; +const void *ap_hack_apr_os_imp_time_get = (const void *)apr_os_imp_time_get; +const void *ap_hack_apr_os_shm_get = (const void *)apr_os_shm_get; +#if APR_HAS_THREADS || defined(DOXYGEN) +const void *ap_hack_apr_os_thread_get = (const void *)apr_os_thread_get; +const void *ap_hack_apr_os_threadkey_get = (const void *)apr_os_threadkey_get; +const void *ap_hack_apr_os_thread_put = (const void *)apr_os_thread_put; +const void *ap_hack_apr_os_threadkey_put = (const void *)apr_os_threadkey_put; +const void *ap_hack_apr_os_thread_current = (const void *)apr_os_thread_current; +const void *ap_hack_apr_os_thread_equal = (const void *)apr_os_thread_equal; +#endif /* APR_HAS_THREADS */ +const void *ap_hack_apr_os_file_put = (const void *)apr_os_file_put; +const void *ap_hack_apr_os_pipe_put = (const void *)apr_os_pipe_put; +const void *ap_hack_apr_os_pipe_put_ex = (const void *)apr_os_pipe_put_ex; +const void *ap_hack_apr_os_dir_put = (const void *)apr_os_dir_put; +const void *ap_hack_apr_os_sock_put = (const void *)apr_os_sock_put; +const void *ap_hack_apr_os_sock_make = (const void *)apr_os_sock_make; +const void *ap_hack_apr_os_proc_mutex_put = (const void *)apr_os_proc_mutex_put; +const void *ap_hack_apr_os_imp_time_put = (const void *)apr_os_imp_time_put; +const void *ap_hack_apr_os_exp_time_put = (const void *)apr_os_exp_time_put; +const void *ap_hack_apr_os_shm_put = (const void *)apr_os_shm_put; +#if APR_HAS_DSO || defined(DOXYGEN) +const void *ap_hack_apr_os_dso_handle_put = (const void *)apr_os_dso_handle_put; +const void *ap_hack_apr_os_dso_handle_get = (const void *)apr_os_dso_handle_get; +#if APR_HAS_OS_UUID +const void *ap_hack_apr_os_uuid_get = (const void *)apr_os_uuid_get; +#endif +#endif /* APR_HAS_DSO */ +const void *ap_hack_apr_os_default_encoding = (const void *)apr_os_default_encoding; +const void *ap_hack_apr_os_locale_encoding = (const void *)apr_os_locale_encoding; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_proc_mutex.h + */ +const void *ap_hack_apr_proc_mutex_create = (const void *)apr_proc_mutex_create; +const void *ap_hack_apr_proc_mutex_child_init = (const void *)apr_proc_mutex_child_init; +const void *ap_hack_apr_proc_mutex_lock = (const void *)apr_proc_mutex_lock; +const void *ap_hack_apr_proc_mutex_trylock = (const void *)apr_proc_mutex_trylock; +const void *ap_hack_apr_proc_mutex_unlock = (const void *)apr_proc_mutex_unlock; +const void *ap_hack_apr_proc_mutex_destroy = (const void *)apr_proc_mutex_destroy; +const void *ap_hack_apr_proc_mutex_cleanup = (const void *)apr_proc_mutex_cleanup; +const void *ap_hack_apr_proc_mutex_lockfile = (const void *)apr_proc_mutex_lockfile; +const void *ap_hack_apr_proc_mutex_name = (const void *)apr_proc_mutex_name; +const void *ap_hack_apr_proc_mutex_defname = (const void *)apr_proc_mutex_defname; +const void *ap_hack_apr_proc_mutex_pool_get = (const void *)apr_proc_mutex_pool_get; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_shm.h + */ +const void *ap_hack_apr_shm_create = (const void *)apr_shm_create; +const void *ap_hack_apr_shm_destroy = (const void *)apr_shm_destroy; +const void *ap_hack_apr_shm_attach = (const void *)apr_shm_attach; +const void *ap_hack_apr_shm_detach = (const void *)apr_shm_detach; +const void *ap_hack_apr_shm_baseaddr_get = (const void *)apr_shm_baseaddr_get; +const void *ap_hack_apr_shm_size_get = (const void *)apr_shm_size_get; +const void *ap_hack_apr_shm_pool_get = (const void *)apr_shm_pool_get; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_signal.h + */ +#if APR_HAVE_SIGACTION || defined(DOXYGEN) +const void *ap_hack_apr_signal = (const void *)apr_signal; +#else /* !APR_HAVE_SIGACTION */ +#endif +const void *ap_hack_apr_signal_description_get = (const void *)apr_signal_description_get; +const void *ap_hack_apr_signal_get_description = (const void *)apr_signal_get_description; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_strings.h + */ +const void *ap_hack_apr_strnatcmp = (const void *)apr_strnatcmp; +const void *ap_hack_apr_strnatcasecmp = (const void *)apr_strnatcasecmp; +const void *ap_hack_apr_pstrdup = (const void *)apr_pstrdup; +const void *ap_hack_apr_pstrmemdup = (const void *)apr_pstrmemdup; +const void *ap_hack_apr_pstrndup = (const void *)apr_pstrndup; +const void *ap_hack_apr_pmemdup = (const void *)apr_pmemdup; +const void *ap_hack_apr_pstrcat = (const void *)apr_pstrcat; +const void *ap_hack_apr_pstrcatv = (const void *)apr_pstrcatv; +const void *ap_hack_apr_pvsprintf = (const void *)apr_pvsprintf; +const void *ap_hack_apr_psprintf = (const void *)apr_psprintf; +const void *ap_hack_apr_cpystrn = (const void *)apr_cpystrn; +const void *ap_hack_apr_collapse_spaces = (const void *)apr_collapse_spaces; +const void *ap_hack_apr_tokenize_to_argv = (const void *)apr_tokenize_to_argv; +const void *ap_hack_apr_strtok = (const void *)apr_strtok; +const void *ap_hack_apr_snprintf = (const void *)apr_snprintf; +const void *ap_hack_apr_vsnprintf = (const void *)apr_vsnprintf; +const void *ap_hack_apr_itoa = (const void *)apr_itoa; +const void *ap_hack_apr_ltoa = (const void *)apr_ltoa; +const void *ap_hack_apr_off_t_toa = (const void *)apr_off_t_toa; +const void *ap_hack_apr_strtoi64 = (const void *)apr_strtoi64; +const void *ap_hack_apr_atoi64 = (const void *)apr_atoi64; +const void *ap_hack_apr_strfsize = (const void *)apr_strfsize; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_tables.h + */ +const void *ap_hack_apr_table_elts = (const void *)apr_table_elts; +const void *ap_hack_apr_is_empty_table = (const void *)apr_is_empty_table; +const void *ap_hack_apr_is_empty_array = (const void *)apr_is_empty_array; +const void *ap_hack_apr_array_make = (const void *)apr_array_make; +const void *ap_hack_apr_array_push = (const void *)apr_array_push; +const void *ap_hack_apr_array_pop = (const void *)apr_array_pop; +const void *ap_hack_apr_array_cat = (const void *)apr_array_cat; +const void *ap_hack_apr_array_copy = (const void *)apr_array_copy; +const void *ap_hack_apr_array_copy_hdr = (const void *)apr_array_copy_hdr; +const void *ap_hack_apr_array_append = (const void *)apr_array_append; +const void *ap_hack_apr_array_pstrcat = (const void *)apr_array_pstrcat; +const void *ap_hack_apr_table_make = (const void *)apr_table_make; +const void *ap_hack_apr_table_copy = (const void *)apr_table_copy; +const void *ap_hack_apr_table_clear = (const void *)apr_table_clear; +const void *ap_hack_apr_table_get = (const void *)apr_table_get; +const void *ap_hack_apr_table_set = (const void *)apr_table_set; +const void *ap_hack_apr_table_setn = (const void *)apr_table_setn; +const void *ap_hack_apr_table_unset = (const void *)apr_table_unset; +const void *ap_hack_apr_table_merge = (const void *)apr_table_merge; +const void *ap_hack_apr_table_mergen = (const void *)apr_table_mergen; +const void *ap_hack_apr_table_add = (const void *)apr_table_add; +const void *ap_hack_apr_table_addn = (const void *)apr_table_addn; +const void *ap_hack_apr_table_overlay = (const void *)apr_table_overlay; +const void *ap_hack_apr_table_do = (const void *)apr_table_do; +const void *ap_hack_apr_table_vdo = (const void *)apr_table_vdo; +const void *ap_hack_apr_table_overlap = (const void *)apr_table_overlap; +const void *ap_hack_apr_table_compress = (const void *)apr_table_compress; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_thread_cond.h + */ +#if APR_HAS_THREADS || defined(DOXYGEN) +const void *ap_hack_apr_thread_cond_create = (const void *)apr_thread_cond_create; +const void *ap_hack_apr_thread_cond_wait = (const void *)apr_thread_cond_wait; +const void *ap_hack_apr_thread_cond_timedwait = (const void *)apr_thread_cond_timedwait; +const void *ap_hack_apr_thread_cond_signal = (const void *)apr_thread_cond_signal; +const void *ap_hack_apr_thread_cond_broadcast = (const void *)apr_thread_cond_broadcast; +const void *ap_hack_apr_thread_cond_destroy = (const void *)apr_thread_cond_destroy; +const void *ap_hack_apr_thread_cond_pool_get = (const void *)apr_thread_cond_pool_get; +#endif /* APR_HAS_THREADS */ + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_thread_mutex.h + */ +#if APR_HAS_THREADS || defined(DOXYGEN) +const void *ap_hack_apr_thread_mutex_create = (const void *)apr_thread_mutex_create; +const void *ap_hack_apr_thread_mutex_lock = (const void *)apr_thread_mutex_lock; +const void *ap_hack_apr_thread_mutex_trylock = (const void *)apr_thread_mutex_trylock; +const void *ap_hack_apr_thread_mutex_unlock = (const void *)apr_thread_mutex_unlock; +const void *ap_hack_apr_thread_mutex_destroy = (const void *)apr_thread_mutex_destroy; +const void *ap_hack_apr_thread_mutex_pool_get = (const void *)apr_thread_mutex_pool_get; +#endif /* APR_HAS_THREADS */ + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_thread_proc.h + */ +#if APR_HAS_THREADS +const void *ap_hack_apr_threadattr_create = (const void *)apr_threadattr_create; +const void *ap_hack_apr_threadattr_detach_set = (const void *)apr_threadattr_detach_set; +const void *ap_hack_apr_threadattr_detach_get = (const void *)apr_threadattr_detach_get; +const void *ap_hack_apr_threadattr_stacksize_set = (const void *)apr_threadattr_stacksize_set; +const void *ap_hack_apr_thread_create = (const void *)apr_thread_create; +const void *ap_hack_apr_thread_exit = (const void *)apr_thread_exit; +const void *ap_hack_apr_thread_join = (const void *)apr_thread_join; +const void *ap_hack_apr_thread_yield = (const void *)apr_thread_yield; +const void *ap_hack_apr_thread_once_init = (const void *)apr_thread_once_init; +const void *ap_hack_apr_thread_once = (const void *)apr_thread_once; +const void *ap_hack_apr_thread_detach = (const void *)apr_thread_detach; +const void *ap_hack_apr_thread_data_get = (const void *)apr_thread_data_get; +const void *ap_hack_apr_thread_data_set = (const void *)apr_thread_data_set; +const void *ap_hack_apr_threadkey_private_create = (const void *)apr_threadkey_private_create; +const void *ap_hack_apr_threadkey_private_get = (const void *)apr_threadkey_private_get; +const void *ap_hack_apr_threadkey_private_set = (const void *)apr_threadkey_private_set; +const void *ap_hack_apr_threadkey_private_delete = (const void *)apr_threadkey_private_delete; +const void *ap_hack_apr_threadkey_data_get = (const void *)apr_threadkey_data_get; +const void *ap_hack_apr_threadkey_data_set = (const void *)apr_threadkey_data_set; +#endif +const void *ap_hack_apr_procattr_create = (const void *)apr_procattr_create; +const void *ap_hack_apr_procattr_io_set = (const void *)apr_procattr_io_set; +const void *ap_hack_apr_procattr_child_in_set = (const void *)apr_procattr_child_in_set; +const void *ap_hack_apr_procattr_child_out_set = (const void *)apr_procattr_child_out_set; +const void *ap_hack_apr_procattr_child_err_set = (const void *)apr_procattr_child_err_set; +const void *ap_hack_apr_procattr_dir_set = (const void *)apr_procattr_dir_set; +const void *ap_hack_apr_procattr_cmdtype_set = (const void *)apr_procattr_cmdtype_set; +const void *ap_hack_apr_procattr_detach_set = (const void *)apr_procattr_detach_set; +#if APR_HAVE_STRUCT_RLIMIT +const void *ap_hack_apr_procattr_limit_set = (const void *)apr_procattr_limit_set; +#endif +const void *ap_hack_apr_procattr_child_errfn_set = (const void *)apr_procattr_child_errfn_set; +const void *ap_hack_apr_procattr_error_check_set = (const void *)apr_procattr_error_check_set; +const void *ap_hack_apr_procattr_addrspace_set = (const void *)apr_procattr_addrspace_set; +#if APR_HAS_FORK +const void *ap_hack_apr_proc_fork = (const void *)apr_proc_fork; +#endif +const void *ap_hack_apr_proc_create = (const void *)apr_proc_create; +const void *ap_hack_apr_proc_wait = (const void *)apr_proc_wait; +const void *ap_hack_apr_proc_wait_all_procs = (const void *)apr_proc_wait_all_procs; +const void *ap_hack_apr_proc_detach = (const void *)apr_proc_detach; +const void *ap_hack_apr_proc_other_child_register = (const void *)apr_proc_other_child_register; +const void *ap_hack_apr_proc_other_child_unregister = (const void *)apr_proc_other_child_unregister; +const void *ap_hack_apr_proc_other_child_alert = (const void *)apr_proc_other_child_alert; +const void *ap_hack_apr_proc_other_child_refresh = (const void *)apr_proc_other_child_refresh; +const void *ap_hack_apr_proc_other_child_refresh_all = (const void *)apr_proc_other_child_refresh_all; +const void *ap_hack_apr_proc_other_child_check = (const void *)apr_proc_other_child_check; +const void *ap_hack_apr_proc_other_child_read = (const void *)apr_proc_other_child_read; +const void *ap_hack_apr_proc_kill = (const void *)apr_proc_kill; +const void *ap_hack_apr_pool_note_subprocess = (const void *)apr_pool_note_subprocess; +#if APR_HAS_THREADS +#if (APR_HAVE_SIGWAIT || APR_HAVE_SIGSUSPEND) && !defined(OS2) +const void *ap_hack_apr_setup_signal_thread = (const void *)apr_setup_signal_thread; +const void *ap_hack_apr_signal_thread = (const void *)apr_signal_thread; +#endif /* (APR_HAVE_SIGWAIT || APR_HAVE_SIGSUSPEND) && !defined(OS2) */ +const void *ap_hack_apr_thread_pool_get = (const void *)apr_thread_pool_get; +#endif /* APR_HAS_THREADS */ + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_thread_rwlock.h + */ +#if APR_HAS_THREADS +const void *ap_hack_apr_thread_rwlock_create = (const void *)apr_thread_rwlock_create; +const void *ap_hack_apr_thread_rwlock_rdlock = (const void *)apr_thread_rwlock_rdlock; +const void *ap_hack_apr_thread_rwlock_tryrdlock = (const void *)apr_thread_rwlock_tryrdlock; +const void *ap_hack_apr_thread_rwlock_wrlock = (const void *)apr_thread_rwlock_wrlock; +const void *ap_hack_apr_thread_rwlock_trywrlock = (const void *)apr_thread_rwlock_trywrlock; +const void *ap_hack_apr_thread_rwlock_unlock = (const void *)apr_thread_rwlock_unlock; +const void *ap_hack_apr_thread_rwlock_destroy = (const void *)apr_thread_rwlock_destroy; +const void *ap_hack_apr_thread_rwlock_pool_get = (const void *)apr_thread_rwlock_pool_get; +#endif /* APR_HAS_THREADS */ + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_time.h + */ +const void *ap_hack_apr_time_now = (const void *)apr_time_now; +const void *ap_hack_apr_time_ansi_put = (const void *)apr_time_ansi_put; +const void *ap_hack_apr_time_exp_tz = (const void *)apr_time_exp_tz; +const void *ap_hack_apr_explode_time = (const void *)apr_explode_time; +const void *ap_hack_apr_time_exp_gmt = (const void *)apr_time_exp_gmt; +const void *ap_hack_apr_time_exp_lt = (const void *)apr_time_exp_lt; +const void *ap_hack_apr_explode_localtime = (const void *)apr_explode_localtime; +const void *ap_hack_apr_time_exp_get = (const void *)apr_time_exp_get; +const void *ap_hack_apr_time_exp_gmt_get = (const void *)apr_time_exp_gmt_get; +const void *ap_hack_apr_implode_gmt = (const void *)apr_implode_gmt; +const void *ap_hack_apr_sleep = (const void *)apr_sleep; +const void *ap_hack_apr_rfc822_date = (const void *)apr_rfc822_date; +const void *ap_hack_apr_ctime = (const void *)apr_ctime; +const void *ap_hack_apr_strftime = (const void *)apr_strftime; +const void *ap_hack_apr_time_clock_hires = (const void *)apr_time_clock_hires; + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_user.h + */ +#if APR_HAS_USER +const void *ap_hack_apr_uid_current = (const void *)apr_uid_current; +const void *ap_hack_apr_current_userid = (const void *)apr_current_userid; +const void *ap_hack_apr_uid_name_get = (const void *)apr_uid_name_get; +const void *ap_hack_apr_get_username = (const void *)apr_get_username; +const void *ap_hack_apr_uid_get = (const void *)apr_uid_get; +const void *ap_hack_apr_get_userid = (const void *)apr_get_userid; +const void *ap_hack_apr_uid_homepath_get = (const void *)apr_uid_homepath_get; +const void *ap_hack_apr_get_home_directory = (const void *)apr_get_home_directory; +#if defined(WIN32) +const void *ap_hack_apr_uid_compare = (const void *)apr_uid_compare; +const void *ap_hack_apr_compare_users = (const void *)apr_compare_users; +#else +#endif +const void *ap_hack_apr_gid_name_get = (const void *)apr_gid_name_get; +const void *ap_hack_apr_group_name_get = (const void *)apr_group_name_get; +const void *ap_hack_apr_get_groupname = (const void *)apr_get_groupname; +const void *ap_hack_apr_gid_get = (const void *)apr_gid_get; +const void *ap_hack_apr_get_groupid = (const void *)apr_get_groupid; +#if defined(WIN32) +const void *ap_hack_apr_gid_compare = (const void *)apr_gid_compare; +const void *ap_hack_apr_compare_groups = (const void *)apr_compare_groups; +#else +#endif +#endif /* ! APR_HAS_USER */ + +/* + * /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_version.h + */ +const void *ap_hack_apr_version = (const void *)apr_version; +const void *ap_hack_apr_version_string = (const void *)apr_version_string; + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/netware/filepath.c b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/netware/filepath.c new file mode 100644 index 00000000..e4bb3f36 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/netware/filepath.c @@ -0,0 +1,4 @@ +/* NetWare & Win32 have much in common with regards to file names (both are + * DOSish) so it makes sense to share some code + */ +#include "../win32/filepath.c" diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/netware/filestat.c b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/netware/filestat.c new file mode 100644 index 00000000..def63b7e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/netware/filestat.c @@ -0,0 +1,421 @@ +/* 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. + */ + +#include "apr_arch_file_io.h" +#include "fsio.h" +#include "nks/dirio.h" +#include "apr_file_io.h" +#include "apr_general.h" +#include "apr_strings.h" +#include "apr_errno.h" +#include "apr_hash.h" +#include "apr_thread_rwlock.h" + +#ifdef HAVE_UTIME_H +#include +#endif + +#define APR_HAS_PSA + +static apr_filetype_e filetype_from_mode(mode_t mode) +{ + apr_filetype_e type = APR_NOFILE; + + if (S_ISREG(mode)) + type = APR_REG; + else if (S_ISDIR(mode)) + type = APR_DIR; + else if (S_ISCHR(mode)) + type = APR_CHR; + else if (S_ISBLK(mode)) + type = APR_BLK; + else if (S_ISFIFO(mode)) + type = APR_PIPE; + else if (S_ISLNK(mode)) + type = APR_LNK; + else if (S_ISSOCK(mode)) + type = APR_SOCK; + else + type = APR_UNKFILE; + return type; +} + +static void fill_out_finfo(apr_finfo_t *finfo, struct stat *info, + apr_int32_t wanted) +{ + finfo->valid = APR_FINFO_MIN | APR_FINFO_IDENT | APR_FINFO_NLINK + | APR_FINFO_OWNER | APR_FINFO_PROT; + finfo->protection = apr_unix_mode2perms(info->st_mode); + finfo->filetype = filetype_from_mode(info->st_mode); + finfo->user = info->st_uid; + finfo->group = info->st_gid; + finfo->size = info->st_size; + finfo->inode = info->st_ino; + finfo->device = info->st_dev; + finfo->nlink = info->st_nlink; + apr_time_ansi_put(&finfo->atime, info->st_atime.tv_sec); + apr_time_ansi_put(&finfo->mtime, info->st_mtime.tv_sec); + apr_time_ansi_put(&finfo->ctime, info->st_ctime.tv_sec); + /* ### needs to be revisited + * if (wanted & APR_FINFO_CSIZE) { + * finfo->csize = info->st_blocks * 512; + * finfo->valid |= APR_FINFO_CSIZE; + * } + */ +} + +apr_status_t apr_file_info_get_locked(apr_finfo_t *finfo, + apr_int32_t wanted, + apr_file_t *thefile) +{ + struct stat info; + + if (thefile->buffered) { + apr_status_t rv = apr_file_flush_locked(thefile); + if (rv != APR_SUCCESS) + return rv; + } + + if (fstat(thefile->filedes, &info) == 0) { + finfo->pool = thefile->pool; + finfo->fname = thefile->fname; + fill_out_finfo(finfo, &info, wanted); + return (wanted & ~finfo->valid) ? APR_INCOMPLETE : APR_SUCCESS; + } + else { + return errno; + } +} + +APR_DECLARE(apr_status_t) apr_file_info_get(apr_finfo_t *finfo, + apr_int32_t wanted, + apr_file_t *thefile) +{ + struct stat info; + + if (thefile->buffered) { + apr_status_t rv = apr_file_flush(thefile); + if (rv != APR_SUCCESS) + return rv; + } + + if (fstat(thefile->filedes, &info) == 0) { + finfo->pool = thefile->pool; + finfo->fname = thefile->fname; + fill_out_finfo(finfo, &info, wanted); + return (wanted & ~finfo->valid) ? APR_INCOMPLETE : APR_SUCCESS; + } + else { + return errno; + } +} + +APR_DECLARE(apr_status_t) apr_file_perms_set(const char *fname, + apr_fileperms_t perms) +{ + mode_t mode = apr_unix_perms2mode(perms); + + if (chmod(fname, mode) == -1) + return errno; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_file_attrs_set(const char *fname, + apr_fileattrs_t attributes, + apr_fileattrs_t attr_mask, + apr_pool_t *pool) +{ + apr_status_t status; + apr_finfo_t finfo; + + /* Don't do anything if we can't handle the requested attributes */ + if (!(attr_mask & (APR_FILE_ATTR_READONLY + | APR_FILE_ATTR_EXECUTABLE))) + return APR_SUCCESS; + + status = apr_stat(&finfo, fname, APR_FINFO_PROT, pool); + if (!APR_STATUS_IS_SUCCESS(status)) + return status; + + /* ### TODO: should added bits be umask'd? */ + if (attr_mask & APR_FILE_ATTR_READONLY) + { + if (attributes & APR_FILE_ATTR_READONLY) + { + finfo.protection &= ~APR_UWRITE; + finfo.protection &= ~APR_GWRITE; + finfo.protection &= ~APR_WWRITE; + } + else + { + /* ### umask this! */ + finfo.protection |= APR_UWRITE; + finfo.protection |= APR_GWRITE; + finfo.protection |= APR_WWRITE; + } + } + + if (attr_mask & APR_FILE_ATTR_EXECUTABLE) + { + if (attributes & APR_FILE_ATTR_EXECUTABLE) + { + /* ### umask this! */ + finfo.protection |= APR_UEXECUTE; + finfo.protection |= APR_GEXECUTE; + finfo.protection |= APR_WEXECUTE; + } + else + { + finfo.protection &= ~APR_UEXECUTE; + finfo.protection &= ~APR_GEXECUTE; + finfo.protection &= ~APR_WEXECUTE; + } + } + + return apr_file_perms_set(fname, finfo.protection); +} + +#ifndef APR_HAS_PSA +static apr_status_t stat_cache_cleanup(void *data) +{ + apr_pool_t *p = (apr_pool_t *)getGlobalPool(); + apr_hash_index_t *hi; + apr_hash_t *statCache = (apr_hash_t*)data; + char *key; + apr_ssize_t keylen; + NXPathCtx_t pathctx; + + for (hi = apr_hash_first(p, statCache); hi; hi = apr_hash_next(hi)) { + apr_hash_this(hi, (const void**)&key, &keylen, (void**)&pathctx); + + if (pathctx) { + NXFreePathContext(pathctx); + } + } + + return APR_SUCCESS; +} + +int cstat (NXPathCtx_t ctx, char *path, struct stat *buf, unsigned long requestmap, apr_pool_t *p) +{ + apr_pool_t *gPool = (apr_pool_t *)getGlobalPool(); + apr_hash_t *statCache = NULL; + apr_thread_rwlock_t *rwlock = NULL; + + NXPathCtx_t pathctx = 0; + char *ptr = NULL, *tr; + int len = 0, x; + char *ppath; + char *pinfo; + + if (ctx == 1) { + + /* If there isn't a global pool then just stat the file + and return */ + if (!gPool) { + char poolname[50]; + + if (apr_pool_create(&gPool, NULL) != APR_SUCCESS) { + return getstat(ctx, path, buf, requestmap); + } + + setGlobalPool(gPool); + apr_pool_tag(gPool, apr_pstrdup(gPool, "cstat_mem_pool")); + + statCache = apr_hash_make(gPool); + apr_pool_userdata_set ((void*)statCache, "STAT_CACHE", stat_cache_cleanup, gPool); + + apr_thread_rwlock_create(&rwlock, gPool); + apr_pool_userdata_set ((void*)rwlock, "STAT_CACHE_LOCK", apr_pool_cleanup_null, gPool); + } + else { + apr_pool_userdata_get((void**)&statCache, "STAT_CACHE", gPool); + apr_pool_userdata_get((void**)&rwlock, "STAT_CACHE_LOCK", gPool); + } + + if (!gPool || !statCache || !rwlock) { + return getstat(ctx, path, buf, requestmap); + } + + for (x = 0,tr = path;*tr != '\0';tr++,x++) { + if (*tr == '\\' || *tr == '/') { + ptr = tr; + len = x; + } + if (*tr == ':') { + ptr = "\\"; + len = x; + } + } + + if (ptr) { + ppath = apr_pstrndup (p, path, len); + strlwr(ppath); + if (ptr[1] != '\0') { + ptr++; + } + /* If the path ended in a trailing slash then our result path + will be a single slash. To avoid stat'ing the root with a + slash, we need to make sure we stat the current directory + with a dot */ + if (((*ptr == '/') || (*ptr == '\\')) && (*(ptr+1) == '\0')) { + pinfo = apr_pstrdup (p, "."); + } + else { + pinfo = apr_pstrdup (p, ptr); + } + } + + /* If we have a statCache then try to pull the information + from the cache. Otherwise just stat the file and return.*/ + if (statCache) { + apr_thread_rwlock_rdlock(rwlock); + pathctx = (NXPathCtx_t) apr_hash_get(statCache, ppath, APR_HASH_KEY_STRING); + apr_thread_rwlock_unlock(rwlock); + if (pathctx) { + return getstat(pathctx, pinfo, buf, requestmap); + } + else { + int err; + + err = NXCreatePathContext(0, ppath, 0, NULL, &pathctx); + if (!err) { + apr_thread_rwlock_wrlock(rwlock); + apr_hash_set(statCache, apr_pstrdup(gPool,ppath) , APR_HASH_KEY_STRING, (void*)pathctx); + apr_thread_rwlock_unlock(rwlock); + return getstat(pathctx, pinfo, buf, requestmap); + } + } + } + } + return getstat(ctx, path, buf, requestmap); +} +#endif + +APR_DECLARE(apr_status_t) apr_stat(apr_finfo_t *finfo, + const char *fname, + apr_int32_t wanted, apr_pool_t *pool) +{ + struct stat info; + int srv; + NXPathCtx_t pathCtx = 0; + + getcwdpath(NULL, &pathCtx, CTX_ACTUAL_CWD); +#ifdef APR_HAS_PSA + srv = getstat(pathCtx, (char*)fname, &info, ST_STAT_BITS|ST_NAME_BIT); +#else + srv = cstat(pathCtx, (char*)fname, &info, ST_STAT_BITS|ST_NAME_BIT, pool); +#endif + errno = srv; + + if (srv == 0) { + finfo->pool = pool; + finfo->fname = fname; + fill_out_finfo(finfo, &info, wanted); + if (wanted & APR_FINFO_LINK) + wanted &= ~APR_FINFO_LINK; + if (wanted & APR_FINFO_NAME) { + finfo->name = apr_pstrdup(pool, info.st_name); + finfo->valid |= APR_FINFO_NAME; + } + return (wanted & ~finfo->valid) ? APR_INCOMPLETE : APR_SUCCESS; + } + else { +#if !defined(ENOENT) || !defined(ENOTDIR) +#error ENOENT || ENOTDIR not defined; please see the +#error comments at this line in the source for a workaround. + /* + * If ENOENT || ENOTDIR is not defined in one of the your OS's + * include files, APR cannot report a good reason why the stat() + * of the file failed; there are cases where it can fail even though + * the file exists. This opens holes in Apache, for example, because + * it becomes possible for someone to get a directory listing of a + * directory even though there is an index (eg. index.html) file in + * it. If you do not have a problem with this, delete the above + * #error lines and start the compile again. If you need to do this, + * please submit a bug report to http://www.apache.org/bug_report.html + * letting us know that you needed to do this. Please be sure to + * include the operating system you are using. + */ + /* WARNING: All errors will be handled as not found + */ +#if !defined(ENOENT) + return APR_ENOENT; +#else + /* WARNING: All errors but not found will be handled as not directory + */ + if (errno != ENOENT) + return APR_ENOENT; + else + return errno; +#endif +#else /* All was defined well, report the usual: */ + return errno; +#endif + } +} + +/* Perhaps this becomes nothing but a macro? + */ +APR_DECLARE(apr_status_t) apr_lstat(apr_finfo_t *finfo, const char *fname, + apr_int32_t wanted, apr_pool_t *pool) +{ + return apr_stat(finfo, fname, wanted | APR_FINFO_LINK, pool); +} + + +APR_DECLARE(apr_status_t) apr_file_mtime_set(const char *fname, + apr_time_t mtime, + apr_pool_t *pool) +{ + apr_status_t status; + apr_finfo_t finfo; + + status = apr_stat(&finfo, fname, APR_FINFO_ATIME, pool); + if (!APR_STATUS_IS_SUCCESS(status)) { + return status; + } + +#ifdef HAVE_UTIMES + { + struct timeval tvp[2]; + + tvp[0].tv_sec = apr_time_sec(finfo.atime); + tvp[0].tv_usec = apr_time_usec(finfo.atime); + tvp[1].tv_sec = apr_time_sec(mtime); + tvp[1].tv_usec = apr_time_usec(mtime); + + if (utimes(fname, tvp) == -1) { + return errno; + } + } +#elif defined(HAVE_UTIME) + { + struct utimbuf buf; + + buf.actime = (time_t) (finfo.atime / APR_USEC_PER_SEC); + buf.modtime = (time_t) (mtime / APR_USEC_PER_SEC); + + if (utime(fname, &buf) == -1) { + return errno; + } + } +#else + return APR_ENOTIMPL; +#endif + + return APR_SUCCESS; +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/netware/filesys.c b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/netware/filesys.c new file mode 100644 index 00000000..05c44cec --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/netware/filesys.c @@ -0,0 +1,106 @@ +/* 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. + */ + +#include "apr.h" +#include "apr_arch_file_io.h" +#include "apr_strings.h" + +apr_status_t filepath_root_case(char **rootpath, char *root, apr_pool_t *p) +{ +/* See the Windows code to figure out what to do here. + It probably checks to make sure that the root exists + and case it correctly according to the file system. +*/ + *rootpath = apr_pstrdup(p, root); + return APR_SUCCESS; +} + +apr_status_t filepath_has_drive(const char *rootpath, int only, apr_pool_t *p) +{ + char *s; + + if (rootpath) { + s = strchr (rootpath, ':'); + if (only) + /* Test if the path only has a drive/volume and nothing else + */ + return (s && (s != rootpath) && !s[1]); + else + /* Test if the path includes a drive/volume + */ + return (s && (s != rootpath)); + } + return 0; +} + +apr_status_t filepath_compare_drive(const char *path1, const char *path2, apr_pool_t *p) +{ + char *s1, *s2; + + if (path1 && path2) { + s1 = strchr (path1, ':'); + s2 = strchr (path2, ':'); + + /* Make sure that they both have a drive/volume delimiter + and are the same size. Then see if they match. + */ + if (s1 && s2 && ((s1-path1) == (s2-path2))) { + return strnicmp (s1, s2, s1-path1); + } + } + return -1; +} + +APR_DECLARE(apr_status_t) apr_filepath_get(char **rootpath, apr_int32_t flags, + apr_pool_t *p) +{ + char path[APR_PATH_MAX]; + char *ptr; + + /* use getcwdpath to make sure that we get the volume name*/ + if (!getcwdpath(path, NULL, 0)) { + if (errno == ERANGE) + return APR_ENAMETOOLONG; + else + return errno; + } + /* Strip off the server name if there is one*/ + ptr = strpbrk(path, "\\/:"); + if (!ptr) { + return APR_ENOENT; + } + if (*ptr == ':') { + ptr = path; + } + *rootpath = apr_pstrdup(p, ptr); + if (!(flags & APR_FILEPATH_NATIVE)) { + for (ptr = *rootpath; *ptr; ++ptr) { + if (*ptr == '\\') + *ptr = '/'; + } + } + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_filepath_set(const char *rootpath, + apr_pool_t *p) +{ + if (chdir2(rootpath) != 0) + return errno; + return APR_SUCCESS; +} + + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/netware/flock.c b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/netware/flock.c new file mode 100644 index 00000000..c083a0ed --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/netware/flock.c @@ -0,0 +1,39 @@ +/* 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. + */ + +#include +#include "apr_arch_file_io.h" + + +apr_status_t apr_file_lock(apr_file_t *thefile, int type) +{ + int fc; + + fc = (type & APR_FLOCK_NONBLOCK) ? NX_RANGE_LOCK_TRYLOCK : NX_RANGE_LOCK_CHECK; + + if(NXFileRangeLock(thefile->filedes,fc, 0, 0) == -1) + return errno; + + return APR_SUCCESS; +} + +apr_status_t apr_file_unlock(apr_file_t *thefile) +{ + if(NXFileRangeUnlock(thefile->filedes,NX_RANGE_LOCK_CANCEL,0 , 0) == -1) + return errno; + + return APR_SUCCESS; +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/netware/mktemp.c b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/netware/mktemp.c new file mode 100644 index 00000000..2a71af7d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/netware/mktemp.c @@ -0,0 +1,54 @@ +/* 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. + */ + +#include "apr_private.h" +#include "apr_file_io.h" /* prototype of apr_mkstemp() */ +#include "apr_strings.h" /* prototype of apr_mkstemp() */ +#include "apr_arch_file_io.h" /* prototype of apr_mkstemp() */ +#include "apr_portable.h" /* for apr_os_file_put() */ + +#include /* for mkstemp() - Single Unix */ + +APR_DECLARE(apr_status_t) apr_file_mktemp(apr_file_t **fp, char *template, apr_int32_t flags, apr_pool_t *p) +{ + int fd; + apr_status_t rv; + + flags = (!flags) ? APR_CREATE | APR_READ | APR_WRITE | + APR_DELONCLOSE : flags & ~APR_EXCL; + + fd = mkstemp(template); + if (fd == -1) { + return errno; + } + /* We need to reopen the file to get rid of the o_excl flag. + * Otherwise file locking will not allow the file to be shared. + */ + close(fd); + if ((rv = apr_file_open(fp, template, flags|APR_FILE_NOCLEANUP, + APR_UREAD | APR_UWRITE, p)) == APR_SUCCESS) { + + + if (!(flags & APR_FILE_NOCLEANUP)) { + apr_pool_cleanup_register((*fp)->pool, (void *)(*fp), + apr_unix_file_cleanup, + apr_unix_child_file_cleanup); + } + } + + return rv; +} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/netware/pipe.c b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/netware/pipe.c new file mode 100644 index 00000000..1e573615 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/netware/pipe.c @@ -0,0 +1,185 @@ +/* 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. + */ + +#include +#include +#include + +#include "apr_arch_file_io.h" +#include "apr_strings.h" +#include "apr_portable.h" +#include "apr_arch_inherit.h" + +static apr_status_t pipeblock(apr_file_t *thepipe) +{ +#ifdef USE_FLAGS + int err; + unsigned long flags; + + if (fcntl(thepipe->filedes, F_GETFL, &flags) != -1) + { + flags &= ~FNDELAY; + fcntl(thepipe->filedes, F_SETFL, flags); + } +#else + errno = 0; + fcntl(thepipe->filedes, F_SETFL, 0); +#endif + + if (errno) + return errno; + + thepipe->blocking = BLK_ON; + return APR_SUCCESS; +} + +static apr_status_t pipenonblock(apr_file_t *thepipe) +{ +#ifdef USE_FLAGS + int err; + unsigned long flags; + + errno = 0; + if (fcntl(thepipe->filedes, F_GETFL, &flags) != -1) + { + flags |= FNDELAY; + fcntl(thepipe->filedes, F_SETFL, flags); + } +#else + errno = 0; + fcntl(thepipe->filedes, F_SETFL, FNDELAY); +#endif + + if (errno) + return errno; + + thepipe->blocking = BLK_OFF; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_file_pipe_timeout_set(apr_file_t *thepipe, apr_interval_time_t timeout) +{ + if (thepipe->is_pipe == 1) { + thepipe->timeout = timeout; + if (timeout >= 0) { + if (thepipe->blocking != BLK_OFF) { /* blocking or unknown state */ + return pipenonblock(thepipe); + } + } + else { + if (thepipe->blocking != BLK_ON) { /* non-blocking or unknown state */ + return pipeblock(thepipe); + } + } + return APR_SUCCESS; + } + return APR_EINVAL; +} + +APR_DECLARE(apr_status_t) apr_file_pipe_timeout_get(apr_file_t *thepipe, apr_interval_time_t *timeout) +{ + if (thepipe->is_pipe == 1) { + *timeout = thepipe->timeout; + return APR_SUCCESS; + } + return APR_EINVAL; +} + +APR_DECLARE(apr_status_t) apr_os_pipe_put_ex(apr_file_t **file, + apr_os_file_t *thefile, + int register_cleanup, + apr_pool_t *pool) +{ + int *dafile = thefile; + + (*file) = apr_pcalloc(pool, sizeof(apr_file_t)); + (*file)->pool = pool; + (*file)->eof_hit = 0; + (*file)->is_pipe = 1; + (*file)->blocking = BLK_UNKNOWN; /* app needs to make a timeout call */ + (*file)->timeout = -1; + (*file)->ungetchar = -1; /* no char avail */ + (*file)->filedes = *dafile; + if (!register_cleanup) { + (*file)->flags = APR_FILE_NOCLEANUP; + } + (*file)->buffered = 0; +#if APR_HAS_THREADS + (*file)->thlock = NULL; +#endif + if (register_cleanup) { + apr_pool_cleanup_register((*file)->pool, (void *)(*file), + apr_unix_file_cleanup, + apr_pool_cleanup_null); + } + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_os_pipe_put(apr_file_t **file, + apr_os_file_t *thefile, + apr_pool_t *pool) +{ + return apr_os_pipe_put_ex(file, thefile, 0, pool); +} + +APR_DECLARE(apr_status_t) apr_file_pipe_create(apr_file_t **in, apr_file_t **out, apr_pool_t *pool) +{ + int filedes[2]; + int err; + + if (pipe(filedes) == -1) { + return errno; + } + + (*in) = (apr_file_t *)apr_pcalloc(pool, sizeof(apr_file_t)); + (*out) = (apr_file_t *)apr_pcalloc(pool, sizeof(apr_file_t)); + + (*in)->pool = + (*out)->pool = pool; + (*in)->filedes = filedes[0]; + (*out)->filedes = filedes[1]; + (*in)->flags = APR_INHERIT; + (*out)->flags = APR_INHERIT; + (*in)->is_pipe = + (*out)->is_pipe = 1; + (*out)->fname = + (*in)->fname = NULL; + (*in)->buffered = + (*out)->buffered = 0; + (*in)->blocking = + (*out)->blocking = BLK_ON; + (*in)->timeout = + (*out)->timeout = -1; + (*in)->ungetchar = -1; + (*in)->thlock = + (*out)->thlock = NULL; + + apr_pool_cleanup_register((*in)->pool, (void *)(*in), apr_unix_file_cleanup, + apr_pool_cleanup_null); + apr_pool_cleanup_register((*out)->pool, (void *)(*out), apr_unix_file_cleanup, + apr_pool_cleanup_null); + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_file_namedpipe_create(const char *filename, + apr_fileperms_t perm, apr_pool_t *pool) +{ + return APR_ENOTIMPL; +} + + + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/Makefile.in b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/Makefile.in new file mode 100644 index 00000000..a87f4242 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/Makefile.in @@ -0,0 +1,31 @@ +srcdir = @srcdir@ +VPATH = @srcdir@ + +TARGETS = \ + dir.lo \ + fileacc.lo \ + filedup.lo \ + filestat.lo \ + open.lo \ + pipe.lo \ + readwrite.lo \ + seek.lo \ + flock.lo \ + maperrorcode.lo \ + fullrw.lo \ + filepath.lo \ + filepath_util.lo \ + filesys.lo \ + mktemp.lo \ + copy.lo \ + tempdir.lo + +# bring in rules.mk for standard functionality +@INCLUDE_RULES@ + +INCDIR=../../include +OSDIR=$(INCDIR)/arch/@OSDIR@ +DEFOSDIR=$(INCDIR)/arch/@DEFAULT_OSDIR@ +INCLUDES=-I$(INCDIR) -I$(OSDIR) -I$(DEFOSDIR) + +# DO NOT REMOVE diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/copy.c b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/copy.c new file mode 100644 index 00000000..f4ce010f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/copy.c @@ -0,0 +1 @@ +#include "../unix/copy.c" diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/dir.c b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/dir.c new file mode 100644 index 00000000..dc194e3b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/dir.c @@ -0,0 +1,175 @@ +/* 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. + */ + +#include "apr_arch_file_io.h" +#include "apr_file_io.h" +#include "apr_lib.h" +#include "apr_strings.h" +#include "apr_portable.h" +#include + +static apr_status_t dir_cleanup(void *thedir) +{ + apr_dir_t *dir = thedir; + return apr_dir_close(dir); +} + + + +APR_DECLARE(apr_status_t) apr_dir_open(apr_dir_t **new, const char *dirname, apr_pool_t *pool) +{ + apr_dir_t *thedir = (apr_dir_t *)apr_palloc(pool, sizeof(apr_dir_t)); + + if (thedir == NULL) + return APR_ENOMEM; + + thedir->pool = pool; + thedir->dirname = apr_pstrdup(pool, dirname); + + if (thedir->dirname == NULL) + return APR_ENOMEM; + + thedir->handle = 0; + thedir->validentry = FALSE; + *new = thedir; + apr_pool_cleanup_register(pool, thedir, dir_cleanup, apr_pool_cleanup_null); + return APR_SUCCESS; +} + + + +APR_DECLARE(apr_status_t) apr_dir_close(apr_dir_t *thedir) +{ + int rv = 0; + + if (thedir->handle) { + rv = DosFindClose(thedir->handle); + + if (rv == 0) { + thedir->handle = 0; + } + } + + return APR_FROM_OS_ERROR(rv); +} + + + +APR_DECLARE(apr_status_t) apr_dir_read(apr_finfo_t *finfo, apr_int32_t wanted, + apr_dir_t *thedir) +{ + int rv; + ULONG entries = 1; + + if (thedir->handle == 0) { + thedir->handle = HDIR_CREATE; + rv = DosFindFirst(apr_pstrcat(thedir->pool, thedir->dirname, "/*", NULL), &thedir->handle, + FILE_ARCHIVED|FILE_DIRECTORY|FILE_SYSTEM|FILE_HIDDEN|FILE_READONLY, + &thedir->entry, sizeof(thedir->entry), &entries, FIL_STANDARD); + } else { + rv = DosFindNext(thedir->handle, &thedir->entry, sizeof(thedir->entry), &entries); + } + + finfo->pool = thedir->pool; + finfo->fname = NULL; + finfo->valid = 0; + + if (rv == 0 && entries == 1) { + thedir->validentry = TRUE; + + /* We passed a name off the stack that has popped */ + finfo->fname = NULL; + finfo->size = thedir->entry.cbFile; + finfo->csize = thedir->entry.cbFileAlloc; + + /* Only directories & regular files show up in directory listings */ + finfo->filetype = (thedir->entry.attrFile & FILE_DIRECTORY) ? APR_DIR : APR_REG; + + apr_os2_time_to_apr_time(&finfo->mtime, thedir->entry.fdateLastWrite, + thedir->entry.ftimeLastWrite); + apr_os2_time_to_apr_time(&finfo->atime, thedir->entry.fdateLastAccess, + thedir->entry.ftimeLastAccess); + apr_os2_time_to_apr_time(&finfo->ctime, thedir->entry.fdateCreation, + thedir->entry.ftimeCreation); + + finfo->name = thedir->entry.achName; + finfo->valid = APR_FINFO_NAME | APR_FINFO_MTIME | APR_FINFO_ATIME | + APR_FINFO_CTIME | APR_FINFO_TYPE | APR_FINFO_SIZE | + APR_FINFO_CSIZE; + + return APR_SUCCESS; + } + + thedir->validentry = FALSE; + + if (rv) + return APR_FROM_OS_ERROR(rv); + + return APR_ENOENT; +} + + + +APR_DECLARE(apr_status_t) apr_dir_rewind(apr_dir_t *thedir) +{ + return apr_dir_close(thedir); +} + + + +APR_DECLARE(apr_status_t) apr_dir_make(const char *path, apr_fileperms_t perm, apr_pool_t *pool) +{ + return APR_FROM_OS_ERROR(DosCreateDir(path, NULL)); +} + + + +apr_status_t apr_dir_make_recursive(const char *path, apr_fileperms_t perm, + apr_pool_t *pool) +{ + return APR_ENOTIMPL; +} + + + +APR_DECLARE(apr_status_t) apr_dir_remove(const char *path, apr_pool_t *pool) +{ + return APR_FROM_OS_ERROR(DosDeleteDir(path)); +} + + + +APR_DECLARE(apr_status_t) apr_os_dir_get(apr_os_dir_t **thedir, apr_dir_t *dir) +{ + if (dir == NULL) { + return APR_ENODIR; + } + *thedir = &dir->handle; + return APR_SUCCESS; +} + + + +APR_DECLARE(apr_status_t) apr_os_dir_put(apr_dir_t **dir, apr_os_dir_t *thedir, + apr_pool_t *pool) +{ + if ((*dir) == NULL) { + (*dir) = (apr_dir_t *)apr_pcalloc(pool, sizeof(apr_dir_t)); + (*dir)->pool = pool; + } + (*dir)->handle = *thedir; + return APR_SUCCESS; +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/fileacc.c b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/fileacc.c new file mode 100644 index 00000000..b5c1afd5 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/fileacc.c @@ -0,0 +1,18 @@ +/* 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. + */ + +#include "../unix/fileacc.c" + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/filedup.c b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/filedup.c new file mode 100644 index 00000000..0077d2d6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/filedup.c @@ -0,0 +1,124 @@ +/* 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. + */ + +#include "apr_arch_file_io.h" +#include "apr_file_io.h" +#include "apr_lib.h" +#include "apr_strings.h" +#include +#include "apr_arch_inherit.h" + +static apr_status_t file_dup(apr_file_t **new_file, apr_file_t *old_file, apr_pool_t *p) +{ + int rv; + apr_file_t *dup_file; + + if (*new_file == NULL) { + dup_file = (apr_file_t *)apr_palloc(p, sizeof(apr_file_t)); + + if (dup_file == NULL) { + return APR_ENOMEM; + } + + dup_file->filedes = -1; + } else { + dup_file = *new_file; + } + + dup_file->pool = p; + rv = DosDupHandle(old_file->filedes, &dup_file->filedes); + + if (rv) { + return APR_FROM_OS_ERROR(rv); + } + + dup_file->fname = apr_pstrdup(dup_file->pool, old_file->fname); + dup_file->buffered = old_file->buffered; + dup_file->isopen = old_file->isopen; + dup_file->flags = old_file->flags & ~APR_INHERIT; + /* TODO - dup pipes correctly */ + dup_file->pipe = old_file->pipe; + + if (*new_file == NULL) { + apr_pool_cleanup_register(dup_file->pool, dup_file, apr_file_cleanup, + apr_pool_cleanup_null); + *new_file = dup_file; + } + + return APR_SUCCESS; +} + + + +APR_DECLARE(apr_status_t) apr_file_dup(apr_file_t **new_file, apr_file_t *old_file, apr_pool_t *p) +{ + if (*new_file) { + apr_file_close(*new_file); + (*new_file)->filedes = -1; + } + + return file_dup(new_file, old_file, p); +} + + + +APR_DECLARE(apr_status_t) apr_file_dup2(apr_file_t *new_file, apr_file_t *old_file, apr_pool_t *p) +{ + return file_dup(&new_file, old_file, p); +} + + + +APR_DECLARE(apr_status_t) apr_file_setaside(apr_file_t **new_file, + apr_file_t *old_file, + apr_pool_t *p) +{ + *new_file = (apr_file_t *)apr_palloc(p, sizeof(apr_file_t)); + memcpy(*new_file, old_file, sizeof(apr_file_t)); + (*new_file)->pool = p; + + if (old_file->buffered) { + (*new_file)->buffer = apr_palloc(p, APR_FILE_BUFSIZE); + + if (old_file->direction == 1) { + memcpy((*new_file)->buffer, old_file->buffer, old_file->bufpos); + } + else { + memcpy((*new_file)->buffer, old_file->buffer, old_file->dataRead); + } + + if (old_file->mutex) { + apr_thread_mutex_create(&((*new_file)->mutex), + APR_THREAD_MUTEX_DEFAULT, p); + apr_thread_mutex_destroy(old_file->mutex); + } + } + + if (old_file->fname) { + (*new_file)->fname = apr_pstrdup(p, old_file->fname); + } + + if (!(old_file->flags & APR_FILE_NOCLEANUP)) { + apr_pool_cleanup_register(p, (void *)(*new_file), + apr_file_cleanup, + apr_file_cleanup); + } + + old_file->filedes = -1; + apr_pool_cleanup_kill(old_file->pool, (void *)old_file, + apr_file_cleanup); + return APR_SUCCESS; +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/filepath.c b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/filepath.c new file mode 100644 index 00000000..9422faa9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/filepath.c @@ -0,0 +1,16 @@ +/* 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. + */ +#include "../win32/filepath.c" diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/filepath_util.c b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/filepath_util.c new file mode 100644 index 00000000..a89c173e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/filepath_util.c @@ -0,0 +1 @@ +#include "../unix/filepath_util.c" diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/filestat.c b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/filestat.c new file mode 100644 index 00000000..2e5dc24b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/filestat.c @@ -0,0 +1,237 @@ +/* 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. + */ + +#define INCL_DOS +#define INCL_DOSERRORS +#include "apr_arch_file_io.h" +#include "apr_file_io.h" +#include "apr_lib.h" +#include +#include "apr_strings.h" + + +static void FS3_to_finfo(apr_finfo_t *finfo, FILESTATUS3 *fstatus) +{ + finfo->protection = (fstatus->attrFile & FILE_READONLY) ? 0x555 : 0x777; + + if (fstatus->attrFile & FILE_DIRECTORY) + finfo->filetype = APR_DIR; + else + finfo->filetype = APR_REG; + /* XXX: No other possible types from FS3? */ + + finfo->user = 0; + finfo->group = 0; + finfo->inode = 0; + finfo->device = 0; + finfo->size = fstatus->cbFile; + finfo->csize = fstatus->cbFileAlloc; + apr_os2_time_to_apr_time(&finfo->atime, fstatus->fdateLastAccess, + fstatus->ftimeLastAccess ); + apr_os2_time_to_apr_time(&finfo->mtime, fstatus->fdateLastWrite, + fstatus->ftimeLastWrite ); + apr_os2_time_to_apr_time(&finfo->ctime, fstatus->fdateCreation, + fstatus->ftimeCreation ); + finfo->valid = APR_FINFO_TYPE | APR_FINFO_PROT | APR_FINFO_SIZE + | APR_FINFO_CSIZE | APR_FINFO_MTIME + | APR_FINFO_CTIME | APR_FINFO_ATIME | APR_FINFO_LINK; +} + + + +static apr_status_t handle_type(apr_filetype_e *ftype, HFILE file) +{ + ULONG filetype, fileattr, rc; + + rc = DosQueryHType(file, &filetype, &fileattr); + + if (rc == 0) { + switch (filetype & 0xff) { + case 0: + *ftype = APR_REG; + break; + + case 1: + *ftype = APR_CHR; + break; + + case 2: + *ftype = APR_PIPE; + break; + + default: + /* Brian, is this correct??? + */ + *ftype = APR_UNKFILE; + break; + } + + return APR_SUCCESS; + } + return APR_FROM_OS_ERROR(rc); +} + + + +APR_DECLARE(apr_status_t) apr_file_info_get(apr_finfo_t *finfo, apr_int32_t wanted, + apr_file_t *thefile) +{ + ULONG rc; + FILESTATUS3 fstatus; + + if (thefile->isopen) { + if (thefile->buffered) { + apr_status_t rv = apr_file_flush(thefile); + + if (rv != APR_SUCCESS) { + return rv; + } + } + + rc = DosQueryFileInfo(thefile->filedes, FIL_STANDARD, &fstatus, sizeof(fstatus)); + } + else + rc = DosQueryPathInfo(thefile->fname, FIL_STANDARD, &fstatus, sizeof(fstatus)); + + if (rc == 0) { + FS3_to_finfo(finfo, &fstatus); + finfo->fname = thefile->fname; + + if (finfo->filetype == APR_REG) { + if (thefile->isopen) { + return handle_type(&finfo->filetype, thefile->filedes); + } + } else { + return APR_SUCCESS; + } + } + + finfo->protection = 0; + finfo->filetype = APR_NOFILE; + return APR_FROM_OS_ERROR(rc); +} + +APR_DECLARE(apr_status_t) apr_file_perms_set(const char *fname, apr_fileperms_t perms) +{ + return APR_ENOTIMPL; +} + + +APR_DECLARE(apr_status_t) apr_stat(apr_finfo_t *finfo, const char *fname, + apr_int32_t wanted, apr_pool_t *cont) +{ + ULONG rc; + FILESTATUS3 fstatus; + + finfo->protection = 0; + finfo->filetype = APR_NOFILE; + finfo->name = NULL; + rc = DosQueryPathInfo(fname, FIL_STANDARD, &fstatus, sizeof(fstatus)); + + if (rc == 0) { + FS3_to_finfo(finfo, &fstatus); + finfo->fname = fname; + + if (wanted & APR_FINFO_NAME) { + ULONG count = 1; + HDIR hDir = HDIR_SYSTEM; + FILEFINDBUF3 ffb; + rc = DosFindFirst(fname, &hDir, + FILE_DIRECTORY|FILE_HIDDEN|FILE_SYSTEM|FILE_ARCHIVED, + &ffb, sizeof(ffb), &count, FIL_STANDARD); + if (rc == 0 && count == 1) { + finfo->name = apr_pstrdup(cont, ffb.achName); + finfo->valid |= APR_FINFO_NAME; + } + } + } else if (rc == ERROR_INVALID_ACCESS) { + memset(finfo, 0, sizeof(apr_finfo_t)); + finfo->valid = APR_FINFO_TYPE | APR_FINFO_PROT; + finfo->protection = 0666; + finfo->filetype = APR_CHR; + + if (wanted & APR_FINFO_NAME) { + finfo->name = apr_pstrdup(cont, fname); + finfo->valid |= APR_FINFO_NAME; + } + } else { + return APR_FROM_OS_ERROR(rc); + } + + return (wanted & ~finfo->valid) ? APR_INCOMPLETE : APR_SUCCESS; +} + + + +APR_DECLARE(apr_status_t) apr_lstat(apr_finfo_t *finfo, const char *fname, + apr_int32_t wanted, apr_pool_t *cont) +{ + return apr_stat(finfo, fname, wanted, cont); +} + + + +APR_DECLARE(apr_status_t) apr_file_attrs_set(const char *fname, + apr_fileattrs_t attributes, + apr_fileattrs_t attr_mask, + apr_pool_t *cont) +{ + FILESTATUS3 fs3; + ULONG rc; + + /* Don't do anything if we can't handle the requested attributes */ + if (!(attr_mask & (APR_FILE_ATTR_READONLY + | APR_FILE_ATTR_HIDDEN))) + return APR_SUCCESS; + + rc = DosQueryPathInfo(fname, FIL_STANDARD, &fs3, sizeof(fs3)); + if (rc == 0) { + ULONG old_attr = fs3.attrFile; + + if (attr_mask & APR_FILE_ATTR_READONLY) + { + if (attributes & APR_FILE_ATTR_READONLY) { + fs3.attrFile |= FILE_READONLY; + } else { + fs3.attrFile &= ~FILE_READONLY; + } + } + + if (attr_mask & APR_FILE_ATTR_HIDDEN) + { + if (attributes & APR_FILE_ATTR_HIDDEN) { + fs3.attrFile |= FILE_HIDDEN; + } else { + fs3.attrFile &= ~FILE_HIDDEN; + } + } + + if (fs3.attrFile != old_attr) { + rc = DosSetPathInfo(fname, FIL_STANDARD, &fs3, sizeof(fs3), 0); + } + } + + return APR_FROM_OS_ERROR(rc); +} + + +/* ### Somebody please write this! */ +APR_DECLARE(apr_status_t) apr_file_mtime_set(const char *fname, + apr_time_t mtime, + apr_pool_t *pool) +{ + return APR_ENOTIMPL; +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/filesys.c b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/filesys.c new file mode 100644 index 00000000..ae43bc0a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/filesys.c @@ -0,0 +1,148 @@ +/* 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. + */ + +#include "apr.h" +#include "apr_arch_file_io.h" +#include "apr_strings.h" +#include "apr_lib.h" +#include + +/* OS/2 Exceptions: + * + * Note that trailing spaces and trailing periods are never recorded + * in the file system. + * + * Leading spaces and periods are accepted, however. + * The * ? < > codes all have wildcard side effects + * The " / \ : are exclusively component separator tokens + * The system doesn't accept | for any (known) purpose + * Oddly, \x7f _is_ acceptable ;) + */ + +const char c_is_fnchar[256] = +{/* Reject all ctrl codes... */ + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + /* " * / : < > ? */ + 1,1,0,1,1,1,1,1,1,1,0,1,1,1,1,0, 1,1,1,1,1,1,1,1,1,1,0,1,0,1,0,0, + /* \ */ + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1, + /* | */ + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1, + /* High bit codes are accepted */ + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 +}; + + +#define IS_SLASH(c) (c == '/' || c == '\\') + + +apr_status_t filepath_root_test(char *path, apr_pool_t *p) +{ + char drive = apr_toupper(path[0]); + + if (drive >= 'A' && drive <= 'Z' && path[1] == ':' && IS_SLASH(path[2])) + return APR_SUCCESS; + + return APR_EBADPATH; +} + + +apr_status_t filepath_drive_get(char **rootpath, char drive, + apr_int32_t flags, apr_pool_t *p) +{ + char path[APR_PATH_MAX]; + char *pos; + ULONG rc; + ULONG bufsize = sizeof(path) - 3; + + path[0] = drive; + path[1] = ':'; + path[2] = '/'; + + rc = DosQueryCurrentDir(apr_toupper(drive) - 'A', path+3, &bufsize); + + if (rc) { + return APR_FROM_OS_ERROR(rc); + } + + if (!(flags & APR_FILEPATH_NATIVE)) { + for (pos=path; *pos; pos++) { + if (*pos == '\\') + *pos = '/'; + } + } + + *rootpath = apr_pstrdup(p, path); + return APR_SUCCESS; +} + + +apr_status_t filepath_root_case(char **rootpath, char *root, apr_pool_t *p) +{ + if (root[0] && apr_islower(root[0]) && root[1] == ':') { + *rootpath = apr_pstrdup(p, root); + (*rootpath)[0] = apr_toupper((*rootpath)[0]); + } + else { + *rootpath = root; + } + return APR_SUCCESS; +} + + +APR_DECLARE(apr_status_t) apr_filepath_get(char **defpath, apr_int32_t flags, + apr_pool_t *p) +{ + char path[APR_PATH_MAX]; + ULONG drive; + ULONG drivemap; + ULONG rv, pathlen = sizeof(path) - 3; + char *pos; + + DosQueryCurrentDisk(&drive, &drivemap); + path[0] = '@' + drive; + strcpy(path+1, ":\\"); + rv = DosQueryCurrentDir(drive, path+3, &pathlen); + + *defpath = apr_pstrdup(p, path); + + if (!(flags & APR_FILEPATH_NATIVE)) { + for (pos=*defpath; *pos; pos++) { + if (*pos == '\\') + *pos = '/'; + } + } + + return APR_SUCCESS; +} + + + +APR_DECLARE(apr_status_t) apr_filepath_set(const char *path, apr_pool_t *p) +{ + ULONG rv = 0; + + if (path[1] == ':') + rv = DosSetDefaultDisk(apr_toupper(path[0]) - '@'); + + if (rv == 0) + rv = DosSetCurrentDir(path); + + return APR_FROM_OS_ERROR(rv); +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/flock.c b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/flock.c new file mode 100644 index 00000000..ec940220 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/flock.c @@ -0,0 +1,37 @@ +/* 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. + */ + +#include "apr_arch_file_io.h" + +APR_DECLARE(apr_status_t) apr_file_lock(apr_file_t *thefile, int type) +{ + FILELOCK lockrange = { 0, 0x7fffffff }; + ULONG rc; + + rc = DosSetFileLocks(thefile->filedes, NULL, &lockrange, + (type & APR_FLOCK_NONBLOCK) ? 0 : (ULONG)-1, + (type & APR_FLOCK_TYPEMASK) == APR_FLOCK_SHARED); + return APR_FROM_OS_ERROR(rc); +} + +APR_DECLARE(apr_status_t) apr_file_unlock(apr_file_t *thefile) +{ + FILELOCK unlockrange = { 0, 0x7fffffff }; + ULONG rc; + + rc = DosSetFileLocks(thefile->filedes, &unlockrange, NULL, 0, 0); + return APR_FROM_OS_ERROR(rc); +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/fullrw.c b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/fullrw.c new file mode 100644 index 00000000..cf629488 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/fullrw.c @@ -0,0 +1 @@ +#include "../unix/fullrw.c" diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/maperrorcode.c b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/maperrorcode.c new file mode 100644 index 00000000..282338bb --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/maperrorcode.c @@ -0,0 +1,95 @@ +/* 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. + */ + +#define INCL_DOSERRORS +#include "apr_arch_file_io.h" +#include "apr_file_io.h" +#include +#include +#include "apr_errno.h" + +static int errormap[][2] = { + { NO_ERROR, APR_SUCCESS }, + { ERROR_FILE_NOT_FOUND, APR_ENOENT }, + { ERROR_PATH_NOT_FOUND, APR_ENOENT }, + { ERROR_TOO_MANY_OPEN_FILES, APR_EMFILE }, + { ERROR_ACCESS_DENIED, APR_EACCES }, + { ERROR_SHARING_VIOLATION, APR_EACCES }, + { ERROR_INVALID_PARAMETER, APR_EINVAL }, + { ERROR_OPEN_FAILED, APR_ENOENT }, + { ERROR_DISK_FULL, APR_ENOSPC }, + { ERROR_FILENAME_EXCED_RANGE, APR_ENAMETOOLONG }, + { ERROR_INVALID_FUNCTION, APR_EINVAL }, + { ERROR_INVALID_HANDLE, APR_EBADF }, + { ERROR_NEGATIVE_SEEK, APR_ESPIPE }, + { ERROR_NO_SIGNAL_SENT, ESRCH }, + { ERROR_NO_DATA, APR_EAGAIN }, + { SOCEINTR, EINTR }, + { SOCEWOULDBLOCK, EWOULDBLOCK }, + { SOCEINPROGRESS, EINPROGRESS }, + { SOCEALREADY, EALREADY }, + { SOCENOTSOCK, ENOTSOCK }, + { SOCEDESTADDRREQ, EDESTADDRREQ }, + { SOCEMSGSIZE, EMSGSIZE }, + { SOCEPROTOTYPE, EPROTOTYPE }, + { SOCENOPROTOOPT, ENOPROTOOPT }, + { SOCEPROTONOSUPPORT, EPROTONOSUPPORT }, + { SOCESOCKTNOSUPPORT, ESOCKTNOSUPPORT }, + { SOCEOPNOTSUPP, EOPNOTSUPP }, + { SOCEPFNOSUPPORT, EPFNOSUPPORT }, + { SOCEAFNOSUPPORT, EAFNOSUPPORT }, + { SOCEADDRINUSE, EADDRINUSE }, + { SOCEADDRNOTAVAIL, EADDRNOTAVAIL }, + { SOCENETDOWN, ENETDOWN }, + { SOCENETUNREACH, ENETUNREACH }, + { SOCENETRESET, ENETRESET }, + { SOCECONNABORTED, ECONNABORTED }, + { SOCECONNRESET, ECONNRESET }, + { SOCENOBUFS, ENOBUFS }, + { SOCEISCONN, EISCONN }, + { SOCENOTCONN, ENOTCONN }, + { SOCESHUTDOWN, ESHUTDOWN }, + { SOCETOOMANYREFS, ETOOMANYREFS }, + { SOCETIMEDOUT, ETIMEDOUT }, + { SOCECONNREFUSED, ECONNREFUSED }, + { SOCELOOP, ELOOP }, + { SOCENAMETOOLONG, ENAMETOOLONG }, + { SOCEHOSTDOWN, EHOSTDOWN }, + { SOCEHOSTUNREACH, EHOSTUNREACH }, + { SOCENOTEMPTY, ENOTEMPTY }, + { SOCEPIPE, EPIPE } +}; + +#define MAPSIZE (sizeof(errormap)/sizeof(errormap[0])) + +int apr_canonical_error(apr_status_t err) +{ + int rv = -1, index; + + if (err < APR_OS_START_SYSERR) + return err; + + err -= APR_OS_START_SYSERR; + + for (index=0; index + +apr_status_t apr_file_cleanup(void *thefile) +{ + apr_file_t *file = thefile; + return apr_file_close(file); +} + + + +APR_DECLARE(apr_status_t) apr_file_open(apr_file_t **new, const char *fname, apr_int32_t flag, apr_fileperms_t perm, apr_pool_t *pool) +{ + int oflags = 0; + int mflags = OPEN_FLAGS_FAIL_ON_ERROR|OPEN_SHARE_DENYNONE; + int rv; + ULONG action; + apr_file_t *dafile = (apr_file_t *)apr_palloc(pool, sizeof(apr_file_t)); + + dafile->pool = pool; + dafile->isopen = FALSE; + dafile->eof_hit = FALSE; + dafile->buffer = NULL; + dafile->flags = flag; + dafile->blocking = BLK_ON; + + if ((flag & APR_READ) && (flag & APR_WRITE)) { + mflags |= OPEN_ACCESS_READWRITE; + } else if (flag & APR_READ) { + mflags |= OPEN_ACCESS_READONLY; + } else if (flag & APR_WRITE) { + mflags |= OPEN_ACCESS_WRITEONLY; + } else { + dafile->filedes = -1; + return APR_EACCES; + } + + dafile->buffered = (flag & APR_BUFFERED) > 0; + + if (dafile->buffered) { + dafile->buffer = apr_palloc(pool, APR_FILE_BUFSIZE); + rv = apr_thread_mutex_create(&dafile->mutex, 0, pool); + + if (rv) + return rv; + } + + if (flag & APR_CREATE) { + oflags |= OPEN_ACTION_CREATE_IF_NEW; + + if (!(flag & APR_EXCL) && !(flag & APR_TRUNCATE)) { + oflags |= OPEN_ACTION_OPEN_IF_EXISTS; + } + } + + if ((flag & APR_EXCL) && !(flag & APR_CREATE)) + return APR_EACCES; + + if (flag & APR_TRUNCATE) { + oflags |= OPEN_ACTION_REPLACE_IF_EXISTS; + } else if ((oflags & 0xFF) == 0) { + oflags |= OPEN_ACTION_OPEN_IF_EXISTS; + } + + rv = DosOpen(fname, &(dafile->filedes), &action, 0, 0, oflags, mflags, NULL); + + if (rv == 0 && (flag & APR_APPEND)) { + ULONG newptr; + rv = DosSetFilePtr(dafile->filedes, 0, FILE_END, &newptr ); + + if (rv) + DosClose(dafile->filedes); + } + + if (rv != 0) + return APR_FROM_OS_ERROR(rv); + + dafile->isopen = TRUE; + dafile->fname = apr_pstrdup(pool, fname); + dafile->filePtr = 0; + dafile->bufpos = 0; + dafile->dataRead = 0; + dafile->direction = 0; + dafile->pipe = FALSE; + + if (!(flag & APR_FILE_NOCLEANUP)) { + apr_pool_cleanup_register(dafile->pool, dafile, apr_file_cleanup, apr_file_cleanup); + } + + *new = dafile; + return APR_SUCCESS; +} + + + +APR_DECLARE(apr_status_t) apr_file_close(apr_file_t *file) +{ + ULONG rc; + apr_status_t status; + + if (file && file->isopen) { + apr_file_flush(file); + rc = DosClose(file->filedes); + + if (rc == 0) { + file->isopen = FALSE; + status = APR_SUCCESS; + + if (file->flags & APR_DELONCLOSE) { + status = APR_FROM_OS_ERROR(DosDelete(file->fname)); + } + } else { + return APR_FROM_OS_ERROR(rc); + } + } + + if (file->buffered) + apr_thread_mutex_destroy(file->mutex); + + return APR_SUCCESS; +} + + + +APR_DECLARE(apr_status_t) apr_file_remove(const char *path, apr_pool_t *pool) +{ + ULONG rc = DosDelete(path); + return APR_FROM_OS_ERROR(rc); +} + + + +APR_DECLARE(apr_status_t) apr_file_rename(const char *from_path, const char *to_path, + apr_pool_t *p) +{ + ULONG rc = DosMove(from_path, to_path); + + if (rc == ERROR_ACCESS_DENIED || rc == ERROR_ALREADY_EXISTS) { + rc = DosDelete(to_path); + + if (rc == 0 || rc == ERROR_FILE_NOT_FOUND) { + rc = DosMove(from_path, to_path); + } + } + + return APR_FROM_OS_ERROR(rc); +} + + + +APR_DECLARE(apr_status_t) apr_os_file_get(apr_os_file_t *thefile, apr_file_t *file) +{ + *thefile = file->filedes; + return APR_SUCCESS; +} + + + +APR_DECLARE(apr_status_t) apr_os_file_put(apr_file_t **file, apr_os_file_t *thefile, apr_int32_t flags, apr_pool_t *pool) +{ + apr_os_file_t *dafile = thefile; + + (*file) = apr_palloc(pool, sizeof(apr_file_t)); + (*file)->pool = pool; + (*file)->filedes = *dafile; + (*file)->isopen = TRUE; + (*file)->eof_hit = FALSE; + (*file)->flags = flags; + (*file)->pipe = FALSE; + (*file)->buffered = (flags & APR_BUFFERED) > 0; + + if ((*file)->buffered) { + apr_status_t rv; + + (*file)->buffer = apr_palloc(pool, APR_FILE_BUFSIZE); + rv = apr_thread_mutex_create(&(*file)->mutex, 0, pool); + + if (rv) + return rv; + } + return APR_SUCCESS; +} + + +APR_DECLARE(apr_status_t) apr_file_eof(apr_file_t *fptr) +{ + if (!fptr->isopen || fptr->eof_hit == 1) { + return APR_EOF; + } + return APR_SUCCESS; +} + + +APR_DECLARE(apr_status_t) apr_file_open_stderr(apr_file_t **thefile, apr_pool_t *pool) +{ + apr_os_file_t fd = 2; + + return apr_os_file_put(thefile, &fd, 0, pool); +} + + + +APR_DECLARE(apr_status_t) apr_file_open_stdout(apr_file_t **thefile, apr_pool_t *pool) +{ + apr_os_file_t fd = 1; + + return apr_os_file_put(thefile, &fd, 0, pool); +} + + +APR_DECLARE(apr_status_t) apr_file_open_stdin(apr_file_t **thefile, apr_pool_t *pool) +{ + apr_os_file_t fd = 0; + + return apr_os_file_put(thefile, &fd, 0, pool); +} + +APR_POOL_IMPLEMENT_ACCESSOR(file); + +APR_IMPLEMENT_INHERIT_SET(file, flags, pool, apr_file_cleanup) + +APR_IMPLEMENT_INHERIT_UNSET(file, flags, pool, apr_file_cleanup) + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/pipe.c b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/pipe.c new file mode 100644 index 00000000..ee2b2b00 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/pipe.c @@ -0,0 +1,177 @@ +/* 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. + */ + +#define INCL_DOSERRORS +#include "apr_arch_file_io.h" +#include "apr_file_io.h" +#include "apr_general.h" +#include "apr_lib.h" +#include "apr_strings.h" +#include "apr_portable.h" +#include +#include + +APR_DECLARE(apr_status_t) apr_file_pipe_create(apr_file_t **in, apr_file_t **out, apr_pool_t *pool) +{ + ULONG filedes[2]; + ULONG rc, action; + static int id = 0; + char pipename[50]; + + sprintf(pipename, "/pipe/%d.%d", getpid(), id++); + rc = DosCreateNPipe(pipename, filedes, NP_ACCESS_INBOUND, NP_NOWAIT|1, 4096, 4096, 0); + + if (rc) + return APR_FROM_OS_ERROR(rc); + + rc = DosConnectNPipe(filedes[0]); + + if (rc && rc != ERROR_PIPE_NOT_CONNECTED) { + DosClose(filedes[0]); + return APR_FROM_OS_ERROR(rc); + } + + rc = DosOpen (pipename, filedes+1, &action, 0, FILE_NORMAL, + OPEN_ACTION_OPEN_IF_EXISTS | OPEN_ACTION_FAIL_IF_NEW, + OPEN_ACCESS_WRITEONLY | OPEN_SHARE_DENYREADWRITE, + NULL); + + if (rc) { + DosClose(filedes[0]); + return APR_FROM_OS_ERROR(rc); + } + + (*in) = (apr_file_t *)apr_palloc(pool, sizeof(apr_file_t)); + rc = DosCreateEventSem(NULL, &(*in)->pipeSem, DC_SEM_SHARED, FALSE); + + if (rc) { + DosClose(filedes[0]); + DosClose(filedes[1]); + return APR_FROM_OS_ERROR(rc); + } + + rc = DosSetNPipeSem(filedes[0], (HSEM)(*in)->pipeSem, 1); + + if (!rc) { + rc = DosSetNPHState(filedes[0], NP_WAIT); + } + + if (rc) { + DosClose(filedes[0]); + DosClose(filedes[1]); + DosCloseEventSem((*in)->pipeSem); + return APR_FROM_OS_ERROR(rc); + } + + (*in)->pool = pool; + (*in)->filedes = filedes[0]; + (*in)->fname = apr_pstrdup(pool, pipename); + (*in)->isopen = TRUE; + (*in)->buffered = FALSE; + (*in)->flags = 0; + (*in)->pipe = 1; + (*in)->timeout = -1; + (*in)->blocking = BLK_ON; + apr_pool_cleanup_register(pool, *in, apr_file_cleanup, apr_pool_cleanup_null); + + (*out) = (apr_file_t *)apr_palloc(pool, sizeof(apr_file_t)); + (*out)->pool = pool; + (*out)->filedes = filedes[1]; + (*out)->fname = apr_pstrdup(pool, pipename); + (*out)->isopen = TRUE; + (*out)->buffered = FALSE; + (*out)->flags = 0; + (*out)->pipe = 1; + (*out)->timeout = -1; + (*out)->blocking = BLK_ON; + apr_pool_cleanup_register(pool, *out, apr_file_cleanup, apr_pool_cleanup_null); + + return APR_SUCCESS; +} + + + +APR_DECLARE(apr_status_t) apr_file_namedpipe_create(const char *filename, apr_fileperms_t perm, apr_pool_t *pool) +{ + /* Not yet implemented, interface not suitable */ + return APR_ENOTIMPL; +} + + + +APR_DECLARE(apr_status_t) apr_file_pipe_timeout_set(apr_file_t *thepipe, apr_interval_time_t timeout) +{ + if (thepipe->pipe == 1) { + thepipe->timeout = timeout; + + if (thepipe->timeout >= 0) { + if (thepipe->blocking != BLK_OFF) { + thepipe->blocking = BLK_OFF; + return APR_FROM_OS_ERROR(DosSetNPHState(thepipe->filedes, NP_NOWAIT)); + } + } + else if (thepipe->timeout == -1) { + if (thepipe->blocking != BLK_ON) { + thepipe->blocking = BLK_ON; + return APR_FROM_OS_ERROR(DosSetNPHState(thepipe->filedes, NP_WAIT)); + } + } + } + return APR_EINVAL; +} + + + +APR_DECLARE(apr_status_t) apr_file_pipe_timeout_get(apr_file_t *thepipe, apr_interval_time_t *timeout) +{ + if (thepipe->pipe == 1) { + *timeout = thepipe->timeout; + return APR_SUCCESS; + } + return APR_EINVAL; +} + + + +APR_DECLARE(apr_status_t) apr_os_pipe_put_ex(apr_file_t **file, + apr_os_file_t *thefile, + int register_cleanup, + apr_pool_t *pool) +{ + (*file) = apr_pcalloc(pool, sizeof(apr_file_t)); + (*file)->pool = pool; + (*file)->isopen = TRUE; + (*file)->pipe = 1; + (*file)->blocking = BLK_UNKNOWN; /* app needs to make a timeout call */ + (*file)->timeout = -1; + (*file)->filedes = *thefile; + + if (register_cleanup) { + apr_pool_cleanup_register(pool, *file, apr_file_cleanup, + apr_pool_cleanup_null); + } + + return APR_SUCCESS; +} + + + +APR_DECLARE(apr_status_t) apr_os_pipe_put(apr_file_t **file, + apr_os_file_t *thefile, + apr_pool_t *pool) +{ + return apr_os_pipe_put_ex(file, thefile, 0, pool); +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/readwrite.c b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/readwrite.c new file mode 100644 index 00000000..f25a4210 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/readwrite.c @@ -0,0 +1,370 @@ +/* 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. + */ + +#define INCL_DOS +#define INCL_DOSERRORS + +#include "apr_arch_file_io.h" +#include "apr_file_io.h" +#include "apr_lib.h" +#include "apr_strings.h" + +#include + +APR_DECLARE(apr_status_t) apr_file_read(apr_file_t *thefile, void *buf, apr_size_t *nbytes) +{ + ULONG rc = 0; + ULONG bytesread; + + if (!thefile->isopen) { + *nbytes = 0; + return APR_EBADF; + } + + if (thefile->buffered) { + char *pos = (char *)buf; + ULONG blocksize; + ULONG size = *nbytes; + + apr_thread_mutex_lock(thefile->mutex); + + if (thefile->direction == 1) { + int rv = apr_file_flush(thefile); + + if (rv != APR_SUCCESS) { + apr_thread_mutex_unlock(thefile->mutex); + return rv; + } + + thefile->bufpos = 0; + thefile->direction = 0; + thefile->dataRead = 0; + } + + while (rc == 0 && size > 0) { + if (thefile->bufpos >= thefile->dataRead) { + ULONG bytesread; + rc = DosRead(thefile->filedes, thefile->buffer, + APR_FILE_BUFSIZE, &bytesread); + + if (bytesread == 0) { + if (rc == 0) + thefile->eof_hit = TRUE; + break; + } + + thefile->dataRead = bytesread; + thefile->filePtr += thefile->dataRead; + thefile->bufpos = 0; + } + + blocksize = size > thefile->dataRead - thefile->bufpos ? thefile->dataRead - thefile->bufpos : size; + memcpy(pos, thefile->buffer + thefile->bufpos, blocksize); + thefile->bufpos += blocksize; + pos += blocksize; + size -= blocksize; + } + + *nbytes = rc == 0 ? pos - (char *)buf : 0; + apr_thread_mutex_unlock(thefile->mutex); + + if (*nbytes == 0 && rc == 0 && thefile->eof_hit) { + return APR_EOF; + } + + return APR_FROM_OS_ERROR(rc); + } else { + if (thefile->pipe) + DosResetEventSem(thefile->pipeSem, &rc); + + rc = DosRead(thefile->filedes, buf, *nbytes, &bytesread); + + if (rc == ERROR_NO_DATA && thefile->timeout != 0) { + int rcwait = DosWaitEventSem(thefile->pipeSem, thefile->timeout >= 0 ? thefile->timeout / 1000 : SEM_INDEFINITE_WAIT); + + if (rcwait == 0) { + rc = DosRead(thefile->filedes, buf, *nbytes, &bytesread); + } + else if (rcwait == ERROR_TIMEOUT) { + *nbytes = 0; + return APR_TIMEUP; + } + } + + if (rc) { + *nbytes = 0; + return APR_FROM_OS_ERROR(rc); + } + + *nbytes = bytesread; + + if (bytesread == 0) { + thefile->eof_hit = TRUE; + return APR_EOF; + } + + return APR_SUCCESS; + } +} + + + +APR_DECLARE(apr_status_t) apr_file_write(apr_file_t *thefile, const void *buf, apr_size_t *nbytes) +{ + ULONG rc = 0; + ULONG byteswritten; + + if (!thefile->isopen) { + *nbytes = 0; + return APR_EBADF; + } + + if (thefile->buffered) { + char *pos = (char *)buf; + int blocksize; + int size = *nbytes; + + apr_thread_mutex_lock(thefile->mutex); + + if ( thefile->direction == 0 ) { + // Position file pointer for writing at the offset we are logically reading from + ULONG offset = thefile->filePtr - thefile->dataRead + thefile->bufpos; + if (offset != thefile->filePtr) + DosSetFilePtr(thefile->filedes, offset, FILE_BEGIN, &thefile->filePtr ); + thefile->bufpos = thefile->dataRead = 0; + thefile->direction = 1; + } + + while (rc == 0 && size > 0) { + if (thefile->bufpos == APR_FILE_BUFSIZE) // write buffer is full + rc = apr_file_flush(thefile); + + blocksize = size > APR_FILE_BUFSIZE - thefile->bufpos ? APR_FILE_BUFSIZE - thefile->bufpos : size; + memcpy(thefile->buffer + thefile->bufpos, pos, blocksize); + thefile->bufpos += blocksize; + pos += blocksize; + size -= blocksize; + } + + apr_thread_mutex_unlock(thefile->mutex); + return APR_FROM_OS_ERROR(rc); + } else { + if (thefile->flags & APR_APPEND) { + FILELOCK all = { 0, 0x7fffffff }; + ULONG newpos; + rc = DosSetFileLocks(thefile->filedes, NULL, &all, -1, 0); + + if (rc == 0) { + rc = DosSetFilePtr(thefile->filedes, 0, FILE_END, &newpos); + + if (rc == 0) { + rc = DosWrite(thefile->filedes, buf, *nbytes, &byteswritten); + } + + DosSetFileLocks(thefile->filedes, &all, NULL, -1, 0); + } + } else { + rc = DosWrite(thefile->filedes, buf, *nbytes, &byteswritten); + } + + if (rc) { + *nbytes = 0; + return APR_FROM_OS_ERROR(rc); + } + + *nbytes = byteswritten; + return APR_SUCCESS; + } +} + + + +#ifdef HAVE_WRITEV + +APR_DECLARE(apr_status_t) apr_file_writev(apr_file_t *thefile, const struct iovec *vec, apr_size_t nvec, apr_size_t *nbytes) +{ + int bytes; + if ((bytes = writev(thefile->filedes, vec, nvec)) < 0) { + *nbytes = 0; + return errno; + } + else { + *nbytes = bytes; + return APR_SUCCESS; + } +} +#endif + + + +APR_DECLARE(apr_status_t) apr_file_putc(char ch, apr_file_t *thefile) +{ + ULONG rc; + ULONG byteswritten; + + if (!thefile->isopen) { + return APR_EBADF; + } + + rc = DosWrite(thefile->filedes, &ch, 1, &byteswritten); + + if (rc) { + return APR_FROM_OS_ERROR(rc); + } + + return APR_SUCCESS; +} + + + +APR_DECLARE(apr_status_t) apr_file_ungetc(char ch, apr_file_t *thefile) +{ + apr_off_t offset = -1; + return apr_file_seek(thefile, APR_CUR, &offset); +} + + +APR_DECLARE(apr_status_t) apr_file_getc(char *ch, apr_file_t *thefile) +{ + ULONG rc; + apr_size_t bytesread; + + if (!thefile->isopen) { + return APR_EBADF; + } + + bytesread = 1; + rc = apr_file_read(thefile, ch, &bytesread); + + if (rc) { + return rc; + } + + if (bytesread == 0) { + thefile->eof_hit = TRUE; + return APR_EOF; + } + + return APR_SUCCESS; +} + + + +APR_DECLARE(apr_status_t) apr_file_puts(const char *str, apr_file_t *thefile) +{ + apr_size_t len; + + len = strlen(str); + return apr_file_write(thefile, str, &len); +} + + +APR_DECLARE(apr_status_t) apr_file_flush(apr_file_t *thefile) +{ + if (thefile->buffered) { + ULONG written = 0; + int rc = 0; + + if (thefile->direction == 1 && thefile->bufpos) { + rc = DosWrite(thefile->filedes, thefile->buffer, thefile->bufpos, &written); + thefile->filePtr += written; + + if (rc == 0) + thefile->bufpos = 0; + } + + return APR_FROM_OS_ERROR(rc); + } else { + /* There isn't anything to do if we aren't buffering the output + * so just return success. + */ + return APR_SUCCESS; + } +} + + +APR_DECLARE(apr_status_t) apr_file_gets(char *str, int len, apr_file_t *thefile) +{ + apr_size_t readlen; + apr_status_t rv = APR_SUCCESS; + int i; + + for (i = 0; i < len-1; i++) { + readlen = 1; + rv = apr_file_read(thefile, str+i, &readlen); + + if (rv != APR_SUCCESS) { + break; + } + + if (readlen != 1) { + rv = APR_EOF; + break; + } + + if (str[i] == '\n') { + i++; + break; + } + } + str[i] = 0; + if (i > 0) { + /* we stored chars; don't report EOF or any other errors; + * the app will find out about that on the next call + */ + return APR_SUCCESS; + } + return rv; +} + + + +APR_DECLARE_NONSTD(int) apr_file_printf(apr_file_t *fptr, + const char *format, ...) +{ + int cc; + va_list ap; + char *buf; + int len; + + buf = malloc(HUGE_STRING_LEN); + if (buf == NULL) { + return 0; + } + va_start(ap, format); + len = apr_vsnprintf(buf, HUGE_STRING_LEN, format, ap); + cc = apr_file_puts(buf, fptr); + va_end(ap); + free(buf); + return (cc == APR_SUCCESS) ? len : -1; +} + + + +apr_status_t apr_file_check_read(apr_file_t *fd) +{ + int rc; + + if (!fd->pipe) + return APR_SUCCESS; /* Not a pipe, assume no waiting */ + + rc = DosWaitEventSem(fd->pipeSem, SEM_IMMEDIATE_RETURN); + + if (rc == ERROR_TIMEOUT) + return APR_TIMEUP; + + return APR_FROM_OS_ERROR(rc); +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/seek.c b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/seek.c new file mode 100644 index 00000000..6fdfe8e8 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/seek.c @@ -0,0 +1,119 @@ +/* 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. + */ + +#include "apr_arch_file_io.h" +#include "apr_file_io.h" +#include "apr_lib.h" +#include +#include + + +static apr_status_t setptr(apr_file_t *thefile, unsigned long pos ) +{ + long newbufpos; + ULONG rc; + + if (thefile->direction == 1) { + apr_status_t rv = apr_file_flush(thefile); + + if (rv != APR_SUCCESS) { + return rv; + } + + thefile->bufpos = thefile->direction = thefile->dataRead = 0; + } + + newbufpos = pos - (thefile->filePtr - thefile->dataRead); + if (newbufpos >= 0 && newbufpos <= thefile->dataRead) { + thefile->bufpos = newbufpos; + rc = 0; + } else { + rc = DosSetFilePtr(thefile->filedes, pos, FILE_BEGIN, &thefile->filePtr ); + + if ( !rc ) + thefile->bufpos = thefile->dataRead = 0; + } + + return APR_FROM_OS_ERROR(rc); +} + + + +APR_DECLARE(apr_status_t) apr_file_seek(apr_file_t *thefile, apr_seek_where_t where, apr_off_t *offset) +{ + if (!thefile->isopen) { + return APR_EBADF; + } + + thefile->eof_hit = 0; + + if (thefile->buffered) { + int rc = EINVAL; + apr_finfo_t finfo; + + switch (where) { + case APR_SET: + rc = setptr(thefile, *offset); + break; + + case APR_CUR: + rc = setptr(thefile, thefile->filePtr - thefile->dataRead + thefile->bufpos + *offset); + break; + + case APR_END: + rc = apr_file_info_get(&finfo, APR_FINFO_NORM, thefile); + if (rc == APR_SUCCESS) + rc = setptr(thefile, finfo.size + *offset); + break; + } + + *offset = thefile->filePtr - thefile->dataRead + thefile->bufpos; + return rc; + } else { + switch (where) { + case APR_SET: + where = FILE_BEGIN; + break; + + case APR_CUR: + where = FILE_CURRENT; + break; + + case APR_END: + where = FILE_END; + break; + } + + return APR_FROM_OS_ERROR(DosSetFilePtr(thefile->filedes, *offset, where, (ULONG *)offset)); + } +} + + + +APR_DECLARE(apr_status_t) apr_file_trunc(apr_file_t *fp, apr_off_t offset) +{ + int rc = DosSetFileSize(fp->filedes, offset); + + if (rc != 0) { + return APR_FROM_OS_ERROR(rc); + } + + if (fp->buffered) { + return setptr(fp, offset); + } + + return APR_SUCCESS; +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/tempdir.c b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/tempdir.c new file mode 100644 index 00000000..6823569f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/os2/tempdir.c @@ -0,0 +1 @@ +#include "../unix/tempdir.c" diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/.libs/copy.o b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/.libs/copy.o new file mode 100644 index 0000000000000000000000000000000000000000..54e9342cdc083e9c7efda489f6940e5b639c0f0b GIT binary patch literal 15048 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 QG@RE3elNww@?0nX1C8YiNB{r; literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/.libs/dir.o b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/.libs/dir.o new file mode 100644 index 0000000000000000000000000000000000000000..69530d7fab2dc0578bdb59c1cee0cb712d931720 GIT binary patch literal 25576 zcmb_^3wTu3x%S>OAq+{F1i~c<$e@6rl7x$hTued&OeBSX2}Hq;xlBkTnT(kkZc+(^ zpku^BkGJ-r0`{?0tNpFN$6H$))IzoWTeMm|o>ptCR?zxe+lo~o|M#x-eS3CRlAixL z&sh(d{jGO>>$|OQUG||9#0%wyY@6x+JoO4S6ltmwQHU98ArYpgZO3U+?z3wH0! zc^}xUm%Do6LlxPblROdZeBSq5qbm8?llG`yCDkQW<;lN46QEjkF!}10!Q>ag2XhX*N-)omff|RsN`Q~^&CCvE&lXa+TViTk7pboN+9`gJdGevJY!Z5(VoWS z^0S@q*>Uf&q1IQDWmEEk-QHm5)*LH7BiKDZ*gafz+Be$j?d=UFk7>Kf*I7O5uPND3 za?NwulPm>xlj!Gt3^ry@DzhxDvGb!eC_ULi5;Pv%x79vIMn67Q*}W%7E!mTbDWtHd z^CL29-Px0~!H?p^GnhOZ>@EuK8y!2_+j|m*^=&U%t0VqOb@Cr7*1J9o@?Q6Wlbe=k$rGTSwTIif(Y<5Nfl^x-Z@j z+1Yz;AZ4U+Cq*|(WW~PtlpKV__q0XsRU}UueLA==s=X-h&YF@uRgwHOn0!mwuozBAJmYCJ zcIR}L`go)lO*wsH^3P6wMp>frP>*VNI^ufrQ9_l7#{GTgGnuKUu#<1dA@-T{a`GGV ze*JT){4A*|N&a0Xy3*14*@*av&d)sYQOFI+i}lyc>Y>_xaVFT+^Av@HKGJ;v;h61rn28{t}4^*1s&0RIYavS=oCk z$ev*GR9W&p)z;OM-F2CQ-qI-iQB#oSfAF%O$2(4jsk!fbbQU@zW-8F=*Y)X>(^pzn zd|0r1SxzuHbXL#bXbpAZPodQFxbs6=mWEQ8;-iAerX1>@hxJF|No%TFV}nVW-rALJ zqJqbZDQhWi$BTV@%~Mw_yE$0r+_IAhrBUG z?o2W4N}-)!b$IuH^k{uUeCfWUsA|1RZrY--@TQgA;E>A>IAmqiA=e%ha>y%C%yQY} zbl*C{lxOLFJ4KJMVS~m;*}V=u#{RoQkFy;|hF*-W>Ap=ATxG7Z(>L!1st=8*OrxEn>94&`bRLUrJ=YPr z<>$n&746(4(zj;bQ%3ozdS)I@NzeQaI%?^e_rZWH&GR7K)S5CMIzsd)jsM^wqVqKU z$V#FEntrsJ`cBvMV~|;>>BpB4JzvvLf-ctd)7?Y|HT`4Im70DAbd9Ea!bD%I>1RPV zY5MsQ)s+nURjM@UN|u_mQC-PVmAI~qv@!Fy z>dF{${oWvpFJmEF3MXa6Tj>(rGA_6JnCSy!go-y^pDx{_}{MU}gCr9f2<>q?=j z+^;LMROJy}nXML%Cv|16vaLr~=GlKGJAta)iaAFKg4rV;B?2f$Q=wQh6`E^}L{pyaAG3lmrNcjNFECA?gIH-D z{z(Xx&R&0DCeb4`&t!DX)sokXl2-S?beo<(8GN zv9fpGM-tRZneKap$Wa+-S=S&_`%5JUJ7~J3`=B)42Orhylk;@|qsd;&9)C4)*g3R* zkI{7u-q?obcFUd!l=^vS{ZMgTCIxS7Nzz~ZmNVr4f-5BoYbX~u!U z{!*zv;e{$1Ay%Ss3xxxrn zP)4}fCTWbfFRBF4Ph?tms-$zOM^HTvUF_vBT?*Dt6#HP1#^wA-cndLrM45sQdpTS~ z(bb?@4XHX6n7wKqwdUE=#)y$Xsn|95leHHtA~?^UJ`1fArU}ms#X=vClUc`z??SuU zvzb1tJidVCw7x{G@APTiVWnC>pw=(B)r~{uc=EuJ>CK>fR!1mq92ThN)x&VM(q*y` zDsJgMq>m0)gF9Smei5sE@Cb>}0clXFM&LyvV;-p>U%Y>_t1q)MFObL%M6zqxGo- zgFt#fqKkcS0WB~(mY+)S9HGxa=y*(XDbtv+4}MAgCd9dE!cHM>VPfJPO!S+ozxvl5 z`%hj-a!k^b*NOBiWZ|DlAVr#Tswx%MlhlCl$H-v4Brd>yY+p)Sjb4Ekq}HVcsl{j! z(6P;yy;zN^?m7dY9e28_x|T8nUB|YBBbGfA^Id0JK1gdef@Kf0-GTR@0r0_#X(ybc z$YD0*qeva=WU8KFLkS8tCdq54j|hHDd>m~ciWjc&L)s3#9Xp~yUkaA0~( z!|$_F>X_xadND_jO5*nNGK_5jb<4Bo(@D=Je zA8PFa8?;@0nHuE+wXajMr~BR@INkRqtz}x&{63;u9h*C7saT*o&$nd@)44X^h71&4 zzs&Jrp?lwQR>nnk1Ie0>%`0H;UCtO|pTTGxs7XhdeF4i_1QjFh$4O3;4}e?@bj)l# zIK3QX_8pjY=w5^yFRPgTEMHKaDY4uYVImZ%$))&5hA^qI-RTxJkF=z{N&u|_MG7oY zlFr(bfhZ{tl7b>t#RrA)0=g{0T*W3;gfkKAKi>lstG4cmCe>3LJ+cQzU>z?4q4c?I z%zOvEv5FUA@6yfKwv;gT`w95{BzRzU5q75{RLLyRr9@d}_{ctiB~M33Ihxh^Cc#+l ziqxu646fV~b=XEWYkdcR7UN^o*VUmMQ%y%k2XY%sN4BN{seM?APNPe`Fi>}}>=E`< ze{QDNKi)sW9yv5;EIm}1Vr6DtP7rO3Ow#!yZH(phFUVY&S)NNzY_f@k9Kr?lq1-qG z72h-qmtncoVG*4pGt%tLO!Tw~&74js?i#alZLdFt4UOI4n^Ndnxv_RM%opV zyKQR(iJ%i%UtN7Ta$T}a{B^UgqG=wpy16Q zwPe#Q719fDAsak-2bRzhaglDgW63y}ba5&~&@(fo$3wjN&;v6?PeCRrg_ngQo=z}o zyh!(K$GssKkUs9sVSi}cp=U1Z;p!!9g-Ww|F6V|o*QHQO%dATT*>)KR3?ityz*QyY zg)YmLkVPraipC*(7w225H&DYA#*L~D~T5} zo7OuN+qzQ7(F|!>Qk#-u6cSGdQ8c5}+Ea|WIrS-asEvkT+o}?BH*?w61|dZd#8>t6 zTx6|sI<6Kn$FX3okm3botv)2RsVPPw#S6_SH8I7u)~3AC)U6EQNRMJ$l|l}6#Mg+% z2`Q+*>`E;m_1VGPd!1g@LLP9SDj~nYkRFbd6iprG)}v0xY9S|kGz;Z`kTV$4vZVGa zzWF4^!NmXA5nmuGCWEH<(`i2aA1^uO6%LkkB7FDl3Kj!eN_z$e|rGDn(&&3KH@LhM?dC)7>0x zU_u{pMxgS4Gue}ZO!I>*se-RQD?aje+t+)}Awlr08pXC&3n`|gn8l#a`-u@Goo&dp zcI2g>&pNc^)aO!WTJ0FTTF9#y@>uBJ|K)9Wb~A>UzW;EC}u zw|<)HDCFogEt~RP$T1B4YgwN=vZ{o1ckI8Ki4nq0;~}KGXtk&_6+R7B8kYcrFlv<8s#|9zAaN7EW6svV#sil1A zw<`7bVYT>hxntT|A;oHlUwuewSELw)6st9()clSQYlRfUDM^JCt94(grF`hOaElMK z*$ymnLN9V`s}yr9Qji$7E(LwTq*z0Huuh)Tr}PpZXeSpk)$70Sj)<33{U6TSZ?l8< z^3`iacOH_;i%uZcr2N%X4L7wpER{mu?m%n$57(fAQoSns_v#n)Le3pJ#j8T+P9eX- z5E7>Uv9^E5s)0K8U!tNc_CQLbkoYnUg@#5*d9`3*BSh9=r(>0nzjL6qLb_!QZr1}& z$JIhgM~`)&Mq8Nre302sINkci_+sML`?B0I=h*E9dMe3dElU-i!YaB#l}u-p~+kB$zy|jkXg(p&}v_Zf}pYrK-`kwifi})_8MkI8{r;!mgf; z%`M?jbEMJL8{j!(g}^)J+>+q zuZ0Zd61>*3DLT|i)8Y|E(i+AYOHaVY+Z6|9uH5XM>Z|c)#J!v8bGLW%B5%eOdltX8 za7E{?6=|Lu)9l%4p809Er)tdA_xkn*3%%R!xgpKtZTF2#v%Mocm3FRovhN-5Fkhp0 z3oiNBSe`UH{fcz&xleoRcY6ah-pk|O@9*@`qpDFg-lul@^1ZKGzWCyGE4F(_@BT_K zR#dQJYg4T9z?S(dy(@gX4|%g6@@@3Y&t14!N!p+OaHp@+H@3QKqj#d`B74hX8w!d*t(bem{IW^wMZ@nY)y|>(WMVB{wk@xx<&jn+=nZBBY@AysLS8U(YxBsB? z_GRANZ`@7Kw|(&yS5e<1xr^7$N)-I^M|&&&;+sq^-F0IPx%57@FK(*v45Q>nus1e0 zgyL2xL|>w*tFEI(jVm>kuL`w?Ya2q*c)JynvMs3AnEP!IZwk4D*wHE%~P6l*1RziZV2Fo zu4uTu)q)uf;TSTyEfH6$krRm+scVcy!}V4}cyn`o*lOKG+FYU_frXLP?XZY4D^VX; z%BxqdSXN%K)Y?)TiH94=vevc+ctEx{hTDNaaimQtY>S1ccPL8wop6LB4c5l?wnS8` zgti6>R6V|hszq=}LQCz&nAIE$MVq5kr9hJO5IQ2`br>-LL)57@l8A=d6A>%a*3y8{ zh|zbaaxJS0k-aNdty^iewKs1JK?lSs4=9YGRm+wsuhuMGPF6%}NxL3UJ)G1Z!LG+B zk*m?#hS~ZuSGh+4B+oHck$6b)ke$)Cn2LQqq?3?{rrK~aW*36)u}PHZQ3Wty7gI$`<`IvNq|wkXL!95L!}c1wG6Jgl-%dA!nU zZ-ssg6V|{`V|!aGdcp|+l#ED3r4go;2FWx8K;>wlPo}AeTM=6DHz{8$R%%ycwVT7C zy4qM+#i<2}M}Z?H`2A&(Ms-dq~q_VAYGNCP643MNvKtihlyUs)X}4bT>qKQ}P5HJ*rs7jFzl!tKrV zRK+^Km^Q_k^QduSVCJgXftih!<)!pVA*tUqGuqx3r-|N1!pW)_rb08#orccQGs6));DPj$7ECEK);( zWk6lvB;t|k~{Vtg<>NU}<-f1A~|CG%1* z7D_uW5i}R9`j)nsni@(%pZOi$Nc$F9U58-MZe|tKwZ-E!Tf+65Vg>Dqy1KSlL2Wcz z&=ikH8)nYVFU+4ew;wa(WgaqQ>d}FxrM{fhF~H7bcG2j z+G_MwcCK8dmJMpnL`Gs?5 zXcT8A*NZ6I*I4$}9D97$P~Uz!PvHfX35tWh=EAkipR>X5vnq&GZ$Z#iy`i=i z#GiMox7;7tn^xwZ-Z|t7f1&4ShJSjgKTzV&BaS70Us>h~LP}i7a{4L@uRK|M=nrM2 zzF5U{y_;$E4iZVY4LbIDm-qv>LdV`ArT)Us^eg-)0-oj!e_@FdO)OejFcbFwj%9#` z{j11+`Z~$_JLCAC(JJxhbb1=7g;?lMzDZE;iIA{cJ!Ss9z1}i^pfl~t41XT6lQY50 z5>1!+eM>SuKXEmX4Ct#-XHtG|fppi92KX9fTwXJnOV}R9)cXRYU@vrbdYAhPD@kyv zKc@s5J;g#(7yAA#wyl*`B)Z0Npr&h+Q0?KC+I*T_aVsCou$5mIi&^>YZMvdb8^U#o zjWqjde&=htwyv%{yjf~Uzxn|xcV=UZdJXPpUs9%}BL__cM-37)CdgLw~ z`GkU80&d#XDTL!e$^OQ zDhsppRX$DLCTcJ-@b14r_b}sU^41gEK>j~c*SA0Xr?*i0`M-rQQzm-$uzp#WfT5VY zw+w)R@5FR`(%TsSMf|#mXCV9k!1ha?!+v@bq@VqF5(b;hIK6cdfmGfYs;}}X_RIAM zH4N1MsX4mGh0>9)(oe1ra({!(`V;pzap@=cPr1K2f8OW*PZ}L0f2IG^L<|(a&p3V` zGb7@MeNOsITrs_jAyPdKU!pG73;N=G8s@0jnYM$uaFOmJ&*#Qabs+u22p>p)N3rhz zJwu^U)l36?f-lYbYwrL}q;Fs;-T^Ivef=YhwDP#*OlC#7bhYtViiP$%3RfF(141z}o!M6^A-!=$-KjE;agHuZ)^7tV9zhM5u z%rEb}zdi{69|yrd8U+7r5PTTvgPrnywmPE{FJ8qQXk5-?e)$G@8u6kO48mVJ2wu)| z0z8$}IhW*II|%>ALGU=sDdZ_8@8@<7!k=XRO6JEph;ldMQO4z++0;`+=Wep}%5_zx z!Th;aXnDn|B_$Pj^mXOZs!&zQl8U9F)V=qBcb&M0Q_q!f-^F)oilnnDZu8}lfx_H3 z?vX?b-`=^=cDbDgzrN+AJAZu}*oTiE>j?{PRq0ubJOcqNchjKd5z_!S_WA}C4{==2 zazw22#K^ph)K5j-Z0=`C`biyHohMPks-GzFLpFe}CmgOSo{2guAkqnI?w9mV4~pb7 zaL|Hdy+8quy-4tDiADjABcI@H0I2}SUMYAdKq{u3e`r|QMX&ui{ArYDDB#CibRuV* z3wPW3h6_K}#s3IzvZkHCVH_9iNh06Nn=1Gxx$w<{;5WJOfQ$b{7e3jA|Az}d--Vxc z;Zt3>4MV8lf;B|!%yQxGIOMzVDK7ph7mg#Q$T{G`XSnchx^OrDf4Xot|7jPFBe2N7 zgx3i)<7g>(u?u(G|6LdE&bQlKDu2_pUEHI?nWXkze8{JG9^% zs0~HdJ;6I!A9581W^pR1I%0wXew@3d$bKtw-s5;($_#>^W?||rb7~X3gdJLH@OLu5 z%v0h2BlBHp@XI?HwFbVNfBlrsLKb+eIPclBrz{S2v2A;-#U1Z>Ia~v);@U3ho&KW48_XPX3%D`XZJYR3% zkLm8#^#=YOj^~a+@LdMJh3&u9!0}uH!=ck zUoqb=4gOUex0en46yvWO_zkRBUPl%ARXi^582n=xKV{$-viy$?9OqM%&kX!A9!D?t z6TMwLF8)FAa}0b1%b8~2QLfK6aGax2E;sN_4O=S={LegIYYjY&>$L{HlKEQ(!6mQ7 zU$K9W!Jox`?KkitoDT;L{CeiU-@t#$@qEm{OL#nb4E%ZK|D}N+=lHyC;5m{f2L1`x zou@ON3?d;^y^)#a^X(JQ}%kXMTZ zm+`vBkaHi$r`f>8o`ivK;_=#L;7@S;_ZfI2$LE^{elPoVpMlG|{6hoZ&iV5b17FH= zUNGc!=>r1E0!z z! zavnDDH`xBC4g3dOKW^Z79)t3Vflp+6-Zt=hw&x=Qzk~VZye4sbitW+=fl_K8pUvYg zuYU^v8f}gx@AU~T^R0mU34Vn2E;8`bthe02KV|;420n!2S#RKHm|vbBh~AOR|22bu z6UXNk10ToycN_S19LGZjK8N$_`v!iH{d&T{-(vpf4E!FJ@8N!8|8KaSZQ%0$<9Gwl zV81Rf@Jf!)90UJ5>n$?y-!gxLfj_|bbq0PX%ZVEJ*BRez;IfYFFz}Nsf46~eVZUxR z@G~68+YCI1ak-z6cs|VI`(1;79?O5)z#DkHdJJ67dB+U=N#=jcz#roJDFeTn>z^CA zoO{Nyy<-1)T))7;WgVPt;BtSp*udpI*>VH_8QXuAfw%B{4;%Oaj$6XOH#2{SfgfhP z+rVYNzSF=9IWFI29O=O(DoICO{D_g17YD(AZOFm1DwOvPez{-x%OLz-pYA92;F%Q4 zNCTI9^#J2Cj(4yV7aII>Kd=4^N|FbD{DtTbrP7ci=jW?kIQajpxT&8D$8!mZbF&Kv z{~Vro5f=`AIp6POT>QO><=^DumuDbo`i={S{2#IW2MjrtEa$j^H!%LLfyWp>W8h-X z1b!$ZcIy9Skbc2z;4H>kXyCG+u3{XvBM$R853Vx!JJ_$N!7uZ7y9}5P$ai`F3NtQxhq7OL417D|2Mk>9gB~?-xu5@qfy;g1>jo~rUOmG& zF0lVkyx-~naWVD$P`+0>H&Z(({4!qCT{zlGSJ9wo zjJFs#{`WMLgn=($d^_V}kNkx3-wgh1nE#-GcQAh6AozoW$nP=m9L|Sd8@T*1^L+!C zbIuvYCH}`ap2K<36kPVrJOh_?`+Ni6&g;N@17E`Og9a}0uQYIx-)!KIA>bGn1HXsm zcQ7vF65#mUW$=sMdtEqumUGzmTsZRiF#VxC>cYW)9sB!)3kSd0|EvoKe?IRM$6Yx1 zce9+AT{!qZVgA=#ILIjdp?u7^_$%*Id}i<;R^0S{2Oj_+8-I1Y-iHltWq%ptce><&3^IPi zkWgB>ZyR#tKg{^hkR$ioe)_+kP+&X$%Gv&07mltX|6CUi{yUied>0OW ziBG-@2mjm5e<|Yvg$#aKPs0Yk{N!?%iywNoLm-t~4g6sZTXz|FBj?Gz2ELB% zdBVUeW&JVmbD94`1AmkA-_FqnAO^7WTIRphz~x-J&cH8WJ2xA+Jcs?3fhSn+PYt|> z^*(Rl@;vcX1DF4g@RWi7isLzizbF;I*6}%Wyn)}y`_2Lb|0(mcdnyNcDOVa;tuxOU;<)Uv_j?^cp=wsHgJjmK?6U`dG!YamvfqY4=D-6D2}abw2~#^aOAo;&x7V0tcS; z*wGT;z>nf~P6s+aey)?~YM=u|`+%+{4G(Ap9E}nfDIqBj&>o`Y&bK6xM_lopfcPeK zeCRbF1L{qXbqTbNVB#o7%2`0%Fv9U*oI0MJ(-^0Zv;&}#&-A~==B{7Q?%Ka$AvxZj z$q#xaU+bBi?%7?{Gx?kvyQ)lJJkWe<>eNN?blK%XJQC(Y2#=>+btSs<=}v+r94p1n zTT&WN+QQ>goO0l~wZKKpz=DQDBZA-~|*H|oD@@iLJmP{+(rIqqZ z7}0c%bc~msi*T6_GgXF_#q##gfS(0FeJS(32c#PEb-c*rtg$H|E8r*66@!0=D)^DE z81iC4H2rNf@6+^^cL80k>5WrB*K7JJlxfuT)kp_4ea$SevrN;Q5O2}+wQqZcXw&p{ zh<9i@jP^S7K|@y(hZ@j`Z^I+YFOb&B_`gItpmk3ny=*pIz<@-iMKe+{9h&hdrc*N|is{izsbcyyQ>K`Wn(@hp zAi~X>sgREVGpd={YM#@YsaA}wnOd2K2*x!tU$y}=p_v7;7nmKIsh5v|wVj%2lvBXm zrkSPk1`yk$nV|e0FncxAteE|pX;I7p&8$$&W14A|KLwp9G}ESHo6=0X{5|-2R?LBM z;lE$4se1o@Oj4KfM@SO=V@#K(;bEMfYFNNoz{-5M2rF@aVAxf+0)Z&brb1t1v`#PP z**7c!g)-k;fLGU)R9uUzpjK(At5jDHNPG!k9S+F($JDsKs6Y|j*A1HL5SR0jltY?X za5*xAVBxPIR_4P9w4KFM+Jw4-kZN+@O+e0z3AtD)4w3K~`$z!0y+q4>he3Ega`KG1 zxaXiPz>8e!$ZKb7c^F6U#S1jK?@LF2Eh}jKUPoT*C)`P^6He*J;q21>6G&pK-(qbO zGJ)A*)1zaU47LW{39$%{!i93k`%gKvP!2*jh}FR*r5$G64pk{(NbdWh_*``@roZh$ZbAT)H13XRHUnGc;VM%!}^;L6kFK_pK@wEP{3 z8fdW*tI&wP8`T-OM2-JWjW_-o6!e%ft^|avkxMJ<{NBn%l{K=qyc){yIaB!kD*=Lg z1d&kjlKH}0d7=Lze=iiMv1iy`5PI_a(S`%zZ{?w{ir z!gF&rv7n0V9CiacM#|ng)TlZg3^v1H^;wWlO^M7Kt6c`h8e!Mg1?8m;I>2u<^wwc6 zo%KKHYC!$DrH)5WJ*;kEeL53l=etHB`vq-zVPNZB!oW66?vPNj`??xdfZ>I=?~uY% ze|Hy{Su{_gWAxWpstT|;Z|TwoEW~L}jHM`gu?lX92||hioHl5`(j7dr3^DlxK_voK z?t{cQU4W>wsrQJM2bpF~Df%6GBBrSCr#%e*m>eXixIb2$CIje?Y1S;_Z!;Mk$@^n+ z^lSaiR2(d(I5?v)tQc`TZeY^wal;J7G%4KdC=M~nk6pz}!-`uS#X%-_I#558Zd)^> zXItAG#SKid0VxKVbldvsgl=?f4KT?Dq}afu+t$F0;+zZ94$r;N_()caU@gt%uLr=V zN5tVO<>!@i;Hq9tkZ;aqGtKd2B$10+&Ep;Iq4u_>L_C=rZyHJFnup_dR(!okb{k0~ z;=|1&k;qIVZNU!qAcDbW_(%QWdh3K5GZtZ*a}j9^0cwzQQEj>6V- zNT@{Cjz+B*z;M)t(-|P(z5_(a%4CwMJey9X5~xk1c6`jrbLb}&PsUvG7*a^%h{7Qc zS;mosLm%zu$G{{+!DDa?>j{F8y$fXB)_dwMd9m&%$BrF8cIeRIRlhohPPTFD;X7` z5Mm))WaHbp!%8Vldo*K(qoJ{!ZHPED;`o zi5*VacEUN z#j@3WDjsJ8V;)Uq>;S$Kg~q~}EmkJ0l2burau8_D%2?67jcC{ohen`4!--U6OFTJ} zA5w9vF`ORdA(yo>N&`!pNF_%C>VgjQTrQc7k0hZG3`iwaAcn?3+{$bXL&0Iu<1zr%>oalN3Jr&|u$*#9 zs8h7nsiaDaHa-Go0ID2>Ibl?PrlGZp} zu?j16*Q&eoL_8Zx$6*Pp!ShvIkVAVLu2YzQS{Af=3ev^l0a)^`965NMvEDMU$&|Ga z?g-2jB914OqpTgab6LQgX-I~lYARx=+i*CtC70HP!%d%5Yr5Z6AXU>CD$!PgwA6mU zva53Hs&BQ!!*J@*ez#Jw&}dxGjoRBv2p6$fyKX43DgZ}mur1IuX6KUDB_pseGw}$p zcuZXahj&vu42}ev*0%Uwlt+PDI0cn3T6;@V=|=zj#^oPs{vOj#)T^r zau#b>t-3I3?-p=TLl&OrB2nXQ| zv_()Ypx|&eD}oA*TEn>!b@s!UqQk?(8EY$ZP?-YBa3&1fyignNnik80OA(Bu#>Ol- zK7vUoeh?vI@H83&Me_VZw6XJmLG=b<$Uz>|yD0iLu%mUw^ zka0EB*EKL!EdPzmv=ZxM{uq)u|8Qy)&HqmF|8v8k!HN{<7xRA``R6*Lf1C=_{{&!Y zlj8(ZwF}{88ru%TIQ!>*H^>yzKcqhj34WPV#z+=v*2i;-X~em`N&3ulZ^|Bo0mO`H z7H^aO9#*8D^Jn-WAdD2%(0-~P>tp?@;m7)1*BZdgy@v+IQ32X7b?02o_>0Ak!fE>O zvWybLa~h|_^p9(*nE$?{8_Lcrhyc6EURZT99uvWiRS<| z#PD~N_U$|bp)t;1UHQ8zx_6&l%ayd2$Gy!B*9kVZ^9sfNO$|GE3vI!b1|A?M-3H!8 zc%OlPME0*R@P7~=Ht^d?K4#$O6aQTU&rqB<8u%#TlLpRl^ZwvEyg>0kV8}NRj_Vm4 z%X3|RtzicrqxcUQc!=<)4LnW!O9oy~@gFzvTL^#Oz~3VN-(P|A0nG8QV>yb8@j=RW zo`Fvg9x(9N$!mly#2Z(1s9DfPT zZ_be4Pj+?~_%f=)T?T%V@O=ipo$MSm@DTZZ+`wNU`6C8S=Echfem~XuPX_)j*?Gsn zJBa_pz;}_I64K-PgvoJ@f&Yv2Pc!h(2|vfcJ;Zky_27V9Oub@15UhX8h zxrCz_nN~A)jv>$IWQT$Ok>+>6z}w01Cc{2Io84^4^Yh!JAs-<7`wjVDko`woxcXZc zl7G~NW6slrKk33z{sO{(>%vi<_uC7EbA6^r{)8dV_TO>gXrJ%1@4Ilc&+&ie!cqPp z*+1pNQGOBSJBwa9IG)Xf2M9-5{GCbjd$tQl`zPRs?E(XDAUi8vINJG(l7_#map7oZ zfaJeLILE{H#k5Nv?Ud8v+HT16^ZVU~Jp28j3rD}Z$?tv_?#}lS7mo7JlKhhfUQO{F zcHwB}O_G1!g`=HKB>xiOoG+hyW%Q7ZHt>gkQiH9=z^BQ6qk$hI`xhH{FUb?EY*Prz wKJO=vM}ctR|N1oX012Qwa;cCu182KE1|A@OlYvhW&+DD-^ZMLn$n(7a2YAW!fdBvi literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/.libs/filedup.o b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/.libs/filedup.o new file mode 100644 index 0000000000000000000000000000000000000000..61d2ea9c6a9a4942e02db4671ca92995a760ff98 GIT binary patch literal 15712 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 K_h~qv5C01``n4qh literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/.libs/filepath.o b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/.libs/filepath.o new file mode 100644 index 0000000000000000000000000000000000000000..fac1cc59bcd480c6c65b581e540298c5eb7fecd5 GIT binary patch literal 20008 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/.libs/filepath_util.o b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/.libs/filepath_util.o new file mode 100644 index 0000000000000000000000000000000000000000..235627575ec803ef9aecc419139bf00a6b23e081 GIT binary patch literal 10088 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 IKT7()0V1M#&Hw-a literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/.libs/filestat.o b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/.libs/filestat.o new file mode 100644 index 0000000000000000000000000000000000000000..ba786fdd354e1d7e1931cc612e6d55bebbbde9cf GIT binary patch literal 23928 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/.libs/fullrw.o b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/.libs/fullrw.o new file mode 100644 index 0000000000000000000000000000000000000000..56b1207470c6277d80d453f75ddf437833923e58 GIT binary patch literal 8576 zcmcgxeQaCR6~EU`9MiN;nzU)sc3?(<(lvHc(vSiDaN0Drl#SjKb{k-j_ujc zC56$lwoIgqk8YDXF(w#76?Bs*n>P9f+t}z}6B`pMLu?Y8VA6(wiJ@r)seJ65d(W|- zuiZa}rd>7fp5O1DbM86k-uK>p?t!6^EgmTaH!0SO3Sw4>ldTnbqY^iY#iC6_c1Gtu zh};mJdnqyzo%=X4KGFM+9b4zlY(4aD=g7Uu75;ZFXt`*!5O+OWx@2VTlaaYMN9Nw! zI=5?u|1I<~a?j=!{%!Jw5&5f;E1oO;aob&I9dC3lwDr*G&YO2fc13naCL`8!sZh&B zht;hApZSh82m$|~`BgD$D)Oot)EAHRqu}v0sjfkHe%(o*9&5zT+t8TKI>O^uNKN25 zGzkM*JdC188#elV{v!yr1Et`7Ww4?^PSh+7i{w%E(ztpjh$^BBKoGC_{=LN`#5|OJ zXK{?=bB96nYyKmYTebW#%AH#N1m&QXKSgf0}Op1t_$jmR$4`?5L%vmk-T)(LXe~2t{lQ_2}Z!!Wd@6C?3I zj!Ue?Cs6D{wrP{Z+0nyNOkpXmz)}_8GBrM-#`PE`rN@L^C@&4PH+uui0t;nZQ|l6V zMywFc&Fg`JGLs1Re?y1x2CiXXi%;zm>ZO=qF;=E_v&g%$LHtWjJj}Lc&km#*XAz%Z z*rc$uPDbyMdLCwZciGborhcA?Z+qUx_rt*>$R^@p;r znzgC5x}L3`E?ezj@ux)b+A#iYMU|v-S3ALWp5RQ`YLZ2FinVLQh7Xku$DSmS4eP9p z83C>hd-`43Q_b4o27u=qG0H4H;^DKHzRk9rO27p>mK0Vll`7f>Yhh`Wn_CNM$F}lLL0G9w zYzj&r&pA%U&f1AR#c-h%kLQZvSUw+~cAR{&drhb()ZZ5_781BRP?|86CS1y3QZP5_J*64UG8nbF-3gHyro(KW&D)L3*ATp{+v zp6+}h=hz7+2dnNRb0ycl*Oe%5eB4uzk{I5!>FVIhiFhgNl=Q6KYf1|B?(gjj_4Hk# zSvaQ9qfOqnUC7y1xom!u{{eWOYzBTgjj5O7V4(GW&rqQAKJQQrT@_*n*go^uSpuo^O1>H}xRIoF#kb_$; zl#Dqs5sDX!BBa=)9WPB;>1-+oV@i(2;{|&!BPdvvW~>m)PTAGg@EEsQAEp$cL~drr zhMOvsg=GoB(srw5B1iVLl`6z$_^?E|f7UJthOiv)30vJZ5;R{`t<`D*&*t#FuW3Pb zzK3sO8fk|f=iwJ24U5Z&hgU>Z>p!(qz?#(bzFMt2V+QPm5_~CEn4-b>N^WQ=9j~l@mP~^@t{{YR;`wZ(3-(fZL-w7Q0 zdk)&KAo{8byvQc^Opw<0reWh`=1)Lg5J727UQTF3G($Sj6B`s z#w1=rH*XEk)vq4#3iXp(H3`V8c6<#D{DN9i>DS+MUj5@yjg42WNHvYOZJVn;{K5M< z;Bo($?Mfi(@e$zBPo50e&%}B3E8i{UgQhw|>7&c=$mn2X#2VeQWyjFCH69rp8L}!T zQgw_jo4JlW)trjt8j1&36yyHrQ{BGr;_=rr=J~yfbzvD*=i>z$^7!{Rx`FY2!p8g? z8p8iA=*B$1{?%`1FogTn{S3ImrSIMyJuV)7twKX+SLv=iZ!iu_Z$4P#NTW1zo&Se3kfJhCc7gC8Xx zze%w1ypIw8U4y@n@Ck!&BK)+$|AzdWHu(L7UpDv;br|B$2EUg0cMSedgg-R+HwZV< z{G8WY#J3szd&FO4@Mno%ZSX%J{6&L5PWr-JUV{b;LhUJerfJMqW4cA0_?2yLk6o`mDk8bMTyt$2HhWxRL6C9Qrv({^z-P z9OLh=MJ^uo|4RB@E*|yyymX0+NBuC>XQhir{msO$aq*~c6Mq%)Tp#@2!nV`kH)vYi z}O0JU=&h-p{99JkHB?e#yn7AAV1raq+1CG5LSp z#iRZKTCX=> D8Y7Y9 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/.libs/mktemp.o b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/.libs/mktemp.o new file mode 100644 index 0000000000000000000000000000000000000000..b029da25a9a91a2ec7bfd3cc3ea0c5802ea63d69 GIT binary patch literal 9416 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 Z6yY-`Hm;lEgvgSA9S@QMx+`A~{{>W?Xp{f| literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/.libs/open.o b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/.libs/open.o new file mode 100644 index 0000000000000000000000000000000000000000..c0c5a246d09d7641d0837c4e9d42bd24e20dfc28 GIT binary patch literal 25744 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 N4d;EJO2c`b{tp-N!yW(t literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/.libs/pipe.o b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/.libs/pipe.o new file mode 100644 index 0000000000000000000000000000000000000000..3833ae8b89a05513ca4b307ab087c84ee9c0d0d4 GIT binary patch literal 17960 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/.libs/readwrite.o b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/.libs/readwrite.o new file mode 100644 index 0000000000000000000000000000000000000000..ae68e12457f3e5288e876b6264caddb958d96476 GIT binary patch literal 28144 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/.libs/tempdir.o b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/.libs/tempdir.o new file mode 100644 index 0000000000000000000000000000000000000000..5faa35fcfb4d31fa3654b01c6fe59f242711e872 GIT binary patch literal 14232 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/Makefile b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/Makefile new file mode 100644 index 00000000..f6108fab --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/Makefile @@ -0,0 +1,29 @@ +srcdir = . + + +TARGETS = \ + copy.lo \ + dir.lo \ + fileacc.lo \ + filedup.lo \ + filepath.lo \ + filepath_util.lo \ + filestat.lo \ + flock.lo \ + fullrw.lo \ + open.lo \ + pipe.lo \ + readwrite.lo \ + seek.lo \ + mktemp.lo \ + tempdir.lo + +# bring in rules.mk for standard functionality +include /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/build/apr_rules.mk + +INCDIR=../../include +OSDIR=$(INCDIR)/arch/unix +DEFOSDIR=$(INCDIR)/arch/unix +INCLUDES=-I$(INCDIR) -I$(OSDIR) -I$(DEFOSDIR) + +# DO NOT REMOVE diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/Makefile.in b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/Makefile.in new file mode 100644 index 00000000..fbc93b1c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/Makefile.in @@ -0,0 +1,29 @@ +srcdir = @srcdir@ +VPATH = @srcdir@ + +TARGETS = \ + copy.lo \ + dir.lo \ + fileacc.lo \ + filedup.lo \ + filepath.lo \ + filepath_util.lo \ + filestat.lo \ + flock.lo \ + fullrw.lo \ + open.lo \ + pipe.lo \ + readwrite.lo \ + seek.lo \ + mktemp.lo \ + tempdir.lo + +# bring in rules.mk for standard functionality +@INCLUDE_RULES@ + +INCDIR=../../include +OSDIR=$(INCDIR)/arch/@OSDIR@ +DEFOSDIR=$(INCDIR)/arch/@DEFAULT_OSDIR@ +INCLUDES=-I$(INCDIR) -I$(OSDIR) -I$(DEFOSDIR) + +# DO NOT REMOVE diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/copy.c b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/copy.c new file mode 100644 index 00000000..e68322c5 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/copy.c @@ -0,0 +1,131 @@ +/* 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. + */ + +#include "apr_arch_file_io.h" +#include "apr_file_io.h" + +static apr_status_t apr_file_transfer_contents(const char *from_path, + const char *to_path, + apr_int32_t flags, + apr_fileperms_t to_perms, + apr_pool_t *pool) +{ + apr_file_t *s, *d; + apr_status_t status; + apr_fileperms_t perms; + + /* Open source file. */ + status = apr_file_open(&s, from_path, APR_READ | APR_LARGEFILE, + APR_OS_DEFAULT, pool); + if (status) + return status; + + /* Maybe get its permissions. */ + if (to_perms == APR_FILE_SOURCE_PERMS) { +#if defined(HAVE_FSTAT64) && defined(O_LARGEFILE) && SIZEOF_OFF_T == 4 + struct stat64 st; + + if (fstat64(s->filedes, &st) != 0) + return errno; + + perms = apr_unix_mode2perms(st.st_mode); +#else + apr_finfo_t finfo; + + status = apr_file_info_get(&finfo, APR_FINFO_PROT, s); + if (status != APR_SUCCESS && status != APR_INCOMPLETE) { + apr_file_close(s); /* toss any error */ + return status; + } + perms = finfo.protection; +#endif + } + else + perms = to_perms; + + /* Open dest file. */ + status = apr_file_open(&d, to_path, flags, perms, pool); + if (status) { + apr_file_close(s); /* toss any error */ + return status; + } + +#if BUFSIZ > APR_FILE_DEFAULT_BUFSIZE +#define COPY_BUFSIZ BUFSIZ +#else +#define COPY_BUFSIZ APR_FILE_DEFAULT_BUFSIZE +#endif + + /* Copy bytes till the cows come home. */ + while (1) { + char buf[COPY_BUFSIZ]; + apr_size_t bytes_this_time = sizeof(buf); + apr_status_t read_err; + apr_status_t write_err; + + /* Read 'em. */ + read_err = apr_file_read(s, buf, &bytes_this_time); + if (read_err && !APR_STATUS_IS_EOF(read_err)) { + apr_file_close(s); /* toss any error */ + apr_file_close(d); /* toss any error */ + return read_err; + } + + /* Write 'em. */ + write_err = apr_file_write_full(d, buf, bytes_this_time, NULL); + if (write_err) { + apr_file_close(s); /* toss any error */ + apr_file_close(d); /* toss any error */ + return write_err; + } + + if (read_err && APR_STATUS_IS_EOF(read_err)) { + status = apr_file_close(s); + if (status) { + apr_file_close(d); /* toss any error */ + return status; + } + + /* return the results of this close: an error, or success */ + return apr_file_close(d); + } + } + /* NOTREACHED */ +} + +APR_DECLARE(apr_status_t) apr_file_copy(const char *from_path, + const char *to_path, + apr_fileperms_t perms, + apr_pool_t *pool) +{ + return apr_file_transfer_contents(from_path, to_path, + (APR_WRITE | APR_CREATE | APR_TRUNCATE + | APR_LARGEFILE), + perms, + pool); +} + +APR_DECLARE(apr_status_t) apr_file_append(const char *from_path, + const char *to_path, + apr_fileperms_t perms, + apr_pool_t *pool) +{ + return apr_file_transfer_contents(from_path, to_path, + (APR_WRITE | APR_CREATE | APR_APPEND + | APR_LARGEFILE), + perms, + pool); +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/copy.lo b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/copy.lo new file mode 100644 index 00000000..968e921c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/copy.lo @@ -0,0 +1,12 @@ +# copy.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/copy.o' + +# Name of the non-PIC object. +non_pic_object='copy.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/copy.o b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/copy.o new file mode 100644 index 0000000000000000000000000000000000000000..e9f93c51f3fd34a4ac33b7ed77d52f53fbba071d GIT binary patch literal 15024 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 C0{Th- literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/dir.c b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/dir.c new file mode 100644 index 00000000..c42002a0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/dir.c @@ -0,0 +1,323 @@ +/* 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. + */ + +#include "apr_arch_file_io.h" +#include "apr_strings.h" +#include "apr_portable.h" +#if APR_HAVE_SYS_SYSLIMITS_H +#include +#endif +#if APR_HAVE_LIMITS_H +#include +#endif + +static apr_status_t dir_cleanup(void *thedir) +{ + apr_dir_t *dir = thedir; + if (closedir(dir->dirstruct) == 0) { + return APR_SUCCESS; + } + else { + return errno; + } +} + +#define PATH_SEPARATOR '/' + +/* Remove trailing separators that don't affect the meaning of PATH. */ +static const char *path_canonicalize (const char *path, apr_pool_t *pool) +{ + /* At some point this could eliminate redundant components. For + * now, it just makes sure there is no trailing slash. */ + apr_size_t len = strlen (path); + apr_size_t orig_len = len; + + while ((len > 0) && (path[len - 1] == PATH_SEPARATOR)) + len--; + + if (len != orig_len) + return apr_pstrndup (pool, path, len); + else + return path; +} + +/* Remove one component off the end of PATH. */ +static char *path_remove_last_component (const char *path, apr_pool_t *pool) +{ + const char *newpath = path_canonicalize (path, pool); + int i; + + for (i = (strlen(newpath) - 1); i >= 0; i--) { + if (path[i] == PATH_SEPARATOR) + break; + } + + return apr_pstrndup (pool, path, (i < 0) ? 0 : i); +} + +apr_status_t apr_dir_open(apr_dir_t **new, const char *dirname, + apr_pool_t *pool) +{ + /* On some platforms (e.g., Linux+GNU libc), d_name[] in struct + * dirent is declared with enough storage for the name. On other + * platforms (e.g., Solaris 8 for Intel), d_name is declared as a + * one-byte array. Note: gcc evaluates this at compile time. + */ + apr_size_t dirent_size = + (sizeof((*new)->entry->d_name) > 1 ? + sizeof(struct dirent) : sizeof (struct dirent) + 255); + + (*new) = (apr_dir_t *)apr_palloc(pool, sizeof(apr_dir_t)); + + (*new)->pool = pool; + (*new)->dirname = apr_pstrdup(pool, dirname); + (*new)->dirstruct = opendir(dirname); + (*new)->entry = apr_pcalloc(pool, dirent_size); + + if ((*new)->dirstruct == NULL) { + return errno; + } + else { + apr_pool_cleanup_register((*new)->pool, (void *)(*new), dir_cleanup, + apr_pool_cleanup_null); + return APR_SUCCESS; + } +} + +apr_status_t apr_dir_close(apr_dir_t *thedir) +{ + return apr_pool_cleanup_run(thedir->pool, thedir, dir_cleanup); +} + +#ifdef DIRENT_TYPE +static apr_filetype_e filetype_from_dirent_type(int type) +{ + switch (type) { + case DT_REG: + return APR_REG; + case DT_DIR: + return APR_DIR; + case DT_LNK: + return APR_LNK; + case DT_CHR: + return APR_CHR; + case DT_BLK: + return APR_BLK; +#if defined(DT_FIFO) + case DT_FIFO: + return APR_PIPE; +#endif +#if !defined(BEOS) && defined(DT_SOCK) + case DT_SOCK: + return APR_SOCK; +#endif + default: + return APR_UNKFILE; + } +} +#endif + +apr_status_t apr_dir_read(apr_finfo_t *finfo, apr_int32_t wanted, + apr_dir_t *thedir) +{ + apr_status_t ret = 0; +#ifdef DIRENT_TYPE + apr_filetype_e type; +#endif +#if APR_HAS_THREADS && defined(_POSIX_THREAD_SAFE_FUNCTIONS) \ + && !defined(READDIR_IS_THREAD_SAFE) + struct dirent *retent; + + ret = readdir_r(thedir->dirstruct, thedir->entry, &retent); + + /* Avoid the Linux problem where at end-of-directory thedir->entry + * is set to NULL, but ret = APR_SUCCESS. + */ + if(!ret && thedir->entry != retent) + ret = APR_ENOENT; + + /* Solaris is a bit strange, if there are no more entries in the + * directory, it returns EINVAL. Since this is against POSIX, we + * hack around the problem here. EINVAL is possible from other + * readdir implementations, but only if the result buffer is too small. + * since we control the size of that buffer, we should never have + * that problem. + */ + if (ret == EINVAL) { + ret = ENOENT; + } +#else + /* We're about to call a non-thread-safe readdir() that may + possibly set `errno', and the logic below actually cares about + errno after the call. Therefore we need to clear errno first. */ + errno = 0; + thedir->entry = readdir(thedir->dirstruct); + if (thedir->entry == NULL) { + /* If NULL was returned, this can NEVER be a success. Can it?! */ + if (errno == APR_SUCCESS) { + ret = APR_ENOENT; + } + else + ret = errno; + } +#endif + + /* No valid bit flag to test here - do we want one? */ + finfo->fname = NULL; + + if (ret) { + finfo->valid = 0; + return ret; + } + +#ifdef DIRENT_TYPE + type = filetype_from_dirent_type(thedir->entry->DIRENT_TYPE); + if (type != APR_UNKFILE) { + wanted &= ~APR_FINFO_TYPE; + } +#endif +#ifdef DIRENT_INODE + if (thedir->entry->DIRENT_INODE && thedir->entry->DIRENT_INODE != -1) { + wanted &= ~APR_FINFO_INODE; + } +#endif + + wanted &= ~APR_FINFO_NAME; + + if (wanted) + { + char fspec[APR_PATH_MAX]; + int off; + apr_cpystrn(fspec, thedir->dirname, sizeof(fspec)); + off = strlen(fspec); + if ((fspec[off - 1] != '/') && (off + 1 < sizeof(fspec))) + fspec[off++] = '/'; + apr_cpystrn(fspec + off, thedir->entry->d_name, sizeof(fspec) - off); + ret = apr_lstat(finfo, fspec, wanted, thedir->pool); + /* We passed a stack name that will disappear */ + finfo->fname = NULL; + } + + if (wanted && (ret == APR_SUCCESS || ret == APR_INCOMPLETE)) { + wanted &= ~finfo->valid; + } + else { + /* We don't bail because we fail to stat, when we are only -required- + * to readdir... but the result will be APR_INCOMPLETE + */ + finfo->pool = thedir->pool; + finfo->valid = 0; +#ifdef DIRENT_TYPE + if (type != APR_UNKFILE) { + finfo->filetype = type; + finfo->valid |= APR_FINFO_TYPE; + } +#endif +#ifdef DIRENT_INODE + if (thedir->entry->DIRENT_INODE && thedir->entry->DIRENT_INODE != -1) { + finfo->inode = thedir->entry->DIRENT_INODE; + finfo->valid |= APR_FINFO_INODE; + } +#endif + } + + finfo->name = apr_pstrdup(thedir->pool, thedir->entry->d_name); + finfo->valid |= APR_FINFO_NAME; + + if (wanted) + return APR_INCOMPLETE; + + return APR_SUCCESS; +} + +apr_status_t apr_dir_rewind(apr_dir_t *thedir) +{ + rewinddir(thedir->dirstruct); + return APR_SUCCESS; +} + +apr_status_t apr_dir_make(const char *path, apr_fileperms_t perm, + apr_pool_t *pool) +{ + mode_t mode = apr_unix_perms2mode(perm); + + if (mkdir(path, mode) == 0) { + return APR_SUCCESS; + } + else { + return errno; + } +} + +apr_status_t apr_dir_make_recursive(const char *path, apr_fileperms_t perm, + apr_pool_t *pool) +{ + apr_status_t apr_err = 0; + + apr_err = apr_dir_make (path, perm, pool); /* Try to make PATH right out */ + + if (apr_err == EEXIST) /* It's OK if PATH exists */ + return APR_SUCCESS; + + if (apr_err == ENOENT) { /* Missing an intermediate dir */ + char *dir; + + dir = path_remove_last_component(path, pool); + /* If there is no path left, give up. */ + if (dir[0] == '\0') { + return apr_err; + } + + apr_err = apr_dir_make_recursive(dir, perm, pool); + + if (!apr_err) + apr_err = apr_dir_make (path, perm, pool); + } + + return apr_err; +} + +apr_status_t apr_dir_remove(const char *path, apr_pool_t *pool) +{ + if (rmdir(path) == 0) { + return APR_SUCCESS; + } + else { + return errno; + } +} + +apr_status_t apr_os_dir_get(apr_os_dir_t **thedir, apr_dir_t *dir) +{ + if (dir == NULL) { + return APR_ENODIR; + } + *thedir = dir->dirstruct; + return APR_SUCCESS; +} + +apr_status_t apr_os_dir_put(apr_dir_t **dir, apr_os_dir_t *thedir, + apr_pool_t *pool) +{ + if ((*dir) == NULL) { + (*dir) = (apr_dir_t *)apr_pcalloc(pool, sizeof(apr_dir_t)); + (*dir)->pool = pool; + } + (*dir)->dirstruct = thedir; + return APR_SUCCESS; +} + + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/dir.lo b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/dir.lo new file mode 100644 index 00000000..a076bba3 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/dir.lo @@ -0,0 +1,12 @@ +# dir.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/dir.o' + +# Name of the non-PIC object. +non_pic_object='dir.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/dir.o b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/dir.o new file mode 100644 index 0000000000000000000000000000000000000000..b6f076891fe3ad74ca877e102cdf6ddd8d64c624 GIT binary patch literal 25544 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/fileacc.c b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/fileacc.c new file mode 100644 index 00000000..437f3589 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/fileacc.c @@ -0,0 +1,119 @@ +/* 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. + */ + +#include "apr_strings.h" +#include "apr_arch_file_io.h" + +/* A file to put ALL of the accessor functions for apr_file_t types. */ + +APR_DECLARE(apr_status_t) apr_file_name_get(const char **fname, + apr_file_t *thefile) +{ + *fname = thefile->fname; + return APR_SUCCESS; +} + +APR_DECLARE(apr_int32_t) apr_file_flags_get(apr_file_t *f) +{ + return f->flags; +} + +#if !defined(OS2) && !defined(WIN32) +mode_t apr_unix_perms2mode(apr_fileperms_t perms) +{ + mode_t mode = 0; + + if (perms & APR_USETID) + mode |= S_ISUID; + if (perms & APR_UREAD) + mode |= S_IRUSR; + if (perms & APR_UWRITE) + mode |= S_IWUSR; + if (perms & APR_UEXECUTE) + mode |= S_IXUSR; + + if (perms & APR_GSETID) + mode |= S_ISGID; + if (perms & APR_GREAD) + mode |= S_IRGRP; + if (perms & APR_GWRITE) + mode |= S_IWGRP; + if (perms & APR_GEXECUTE) + mode |= S_IXGRP; + +#ifdef S_ISVTX + if (perms & APR_WSTICKY) + mode |= S_ISVTX; +#endif + if (perms & APR_WREAD) + mode |= S_IROTH; + if (perms & APR_WWRITE) + mode |= S_IWOTH; + if (perms & APR_WEXECUTE) + mode |= S_IXOTH; + + return mode; +} + +apr_fileperms_t apr_unix_mode2perms(mode_t mode) +{ + apr_fileperms_t perms = 0; + + if (mode & S_ISUID) + perms |= APR_USETID; + if (mode & S_IRUSR) + perms |= APR_UREAD; + if (mode & S_IWUSR) + perms |= APR_UWRITE; + if (mode & S_IXUSR) + perms |= APR_UEXECUTE; + + if (mode & S_ISGID) + perms |= APR_GSETID; + if (mode & S_IRGRP) + perms |= APR_GREAD; + if (mode & S_IWGRP) + perms |= APR_GWRITE; + if (mode & S_IXGRP) + perms |= APR_GEXECUTE; + +#ifdef S_ISVTX + if (mode & S_ISVTX) + perms |= APR_WSTICKY; +#endif + if (mode & S_IROTH) + perms |= APR_WREAD; + if (mode & S_IWOTH) + perms |= APR_WWRITE; + if (mode & S_IXOTH) + perms |= APR_WEXECUTE; + + return perms; +} +#endif + +APR_DECLARE(apr_status_t) apr_file_data_get(void **data, const char *key, + apr_file_t *file) +{ + return apr_pool_userdata_get(data, key, file->pool); +} + +APR_DECLARE(apr_status_t) apr_file_data_set(apr_file_t *file, void *data, + const char *key, + apr_status_t (*cleanup)(void *)) +{ + return apr_pool_userdata_set(data, key, cleanup, file->pool); +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/fileacc.lo b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/fileacc.lo new file mode 100644 index 00000000..f7b91d17 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/fileacc.lo @@ -0,0 +1,12 @@ +# fileacc.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/fileacc.o' + +# Name of the non-PIC object. +non_pic_object='fileacc.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/fileacc.o b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/fileacc.o new file mode 100644 index 0000000000000000000000000000000000000000..97bc3fbcb347666c213c547b3f140882fd48ec83 GIT binary patch literal 10488 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 SQ^fOnXZyT9_Zad#@Baa|f9h)h literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/filedup.c b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/filedup.c new file mode 100644 index 00000000..a0830db5 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/filedup.c @@ -0,0 +1,149 @@ +/* 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. + */ + +#include "apr_arch_file_io.h" +#include "apr_strings.h" +#include "apr_portable.h" +#include "apr_thread_mutex.h" +#include "apr_arch_inherit.h" + +static apr_status_t _file_dup(apr_file_t **new_file, + apr_file_t *old_file, apr_pool_t *p, + int which_dup) +{ + int rv; + + if (which_dup == 2) { + if ((*new_file) == NULL) { + /* We can't dup2 unless we have a valid new_file */ + return APR_EINVAL; + } + rv = dup2(old_file->filedes, (*new_file)->filedes); + } else { + rv = dup(old_file->filedes); + } + + if (rv == -1) + return errno; + + if (which_dup == 1) { + (*new_file) = (apr_file_t *)apr_pcalloc(p, sizeof(apr_file_t)); + (*new_file)->pool = p; + (*new_file)->filedes = rv; + } + + (*new_file)->fname = apr_pstrdup(p, old_file->fname); + (*new_file)->buffered = old_file->buffered; + + /* If the existing socket in a dup2 is already buffered, we + * have an existing and valid (hopefully) mutex, so we don't + * want to create it again as we could leak! + */ +#if APR_HAS_THREADS + if ((*new_file)->buffered && !(*new_file)->thlock && old_file->thlock) { + apr_thread_mutex_create(&((*new_file)->thlock), + APR_THREAD_MUTEX_DEFAULT, p); + } +#endif + /* As above, only create the buffer if we haven't already + * got one. + */ + if ((*new_file)->buffered && !(*new_file)->buffer) { + (*new_file)->buffer = apr_palloc(p, APR_FILE_BUFSIZE); + } + + /* this is the way dup() works */ + (*new_file)->blocking = old_file->blocking; + + /* make sure unget behavior is consistent */ + (*new_file)->ungetchar = old_file->ungetchar; + + /* apr_file_dup2() retains the original cleanup, reflecting + * the existing inherit and nocleanup flags. This means, + * that apr_file_dup2() cannot be called against an apr_file_t + * already closed with apr_file_close, because the expected + * cleanup was already killed. + */ + if (which_dup == 2) { + return APR_SUCCESS; + } + + /* apr_file_dup() retains all old_file flags with the exceptions + * of APR_INHERIT and APR_FILE_NOCLEANUP. + * The user must call apr_file_inherit_set() on the dupped + * apr_file_t when desired. + */ + (*new_file)->flags = old_file->flags + & ~(APR_INHERIT | APR_FILE_NOCLEANUP); + + apr_pool_cleanup_register((*new_file)->pool, (void *)(*new_file), + apr_unix_file_cleanup, + apr_unix_child_file_cleanup); + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_file_dup(apr_file_t **new_file, + apr_file_t *old_file, apr_pool_t *p) +{ + return _file_dup(new_file, old_file, p, 1); +} + +APR_DECLARE(apr_status_t) apr_file_dup2(apr_file_t *new_file, + apr_file_t *old_file, apr_pool_t *p) +{ + return _file_dup(&new_file, old_file, p, 2); +} + +APR_DECLARE(apr_status_t) apr_file_setaside(apr_file_t **new_file, + apr_file_t *old_file, + apr_pool_t *p) +{ + *new_file = (apr_file_t *)apr_palloc(p, sizeof(apr_file_t)); + memcpy(*new_file, old_file, sizeof(apr_file_t)); + (*new_file)->pool = p; + if (old_file->buffered) { + (*new_file)->buffer = apr_palloc(p, APR_FILE_BUFSIZE); + if (old_file->direction == 1) { + memcpy((*new_file)->buffer, old_file->buffer, old_file->bufpos); + } + else { + memcpy((*new_file)->buffer, old_file->buffer, old_file->dataRead); + } +#if APR_HAS_THREADS + if (old_file->thlock) { + apr_thread_mutex_create(&((*new_file)->thlock), + APR_THREAD_MUTEX_DEFAULT, p); + apr_thread_mutex_destroy(old_file->thlock); + } +#endif /* APR_HAS_THREADS */ + } + if (old_file->fname) { + (*new_file)->fname = apr_pstrdup(p, old_file->fname); + } + if (!(old_file->flags & APR_FILE_NOCLEANUP)) { + apr_pool_cleanup_register(p, (void *)(*new_file), + apr_unix_file_cleanup, + ((*new_file)->flags & APR_INHERIT) + ? apr_pool_cleanup_null + : apr_unix_child_file_cleanup); + } + + old_file->filedes = -1; + apr_pool_cleanup_kill(old_file->pool, (void *)old_file, + apr_unix_file_cleanup); + return APR_SUCCESS; +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/filedup.lo b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/filedup.lo new file mode 100644 index 00000000..e4630825 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/filedup.lo @@ -0,0 +1,12 @@ +# filedup.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/filedup.o' + +# Name of the non-PIC object. +non_pic_object='filedup.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/filedup.o b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/filedup.o new file mode 100644 index 0000000000000000000000000000000000000000..d8640055da54637cf2e3f08cc435117253bcaa6b GIT binary patch literal 15560 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/filepath.c b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/filepath.c new file mode 100644 index 00000000..6a65b202 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/filepath.c @@ -0,0 +1,314 @@ +/* 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. + */ + +#include "apr.h" +#include "apr_private.h" +#include "apr_arch_file_io.h" +#include "apr_file_io.h" +#include "apr_strings.h" +#define APR_WANT_STRFUNC +#include "apr_want.h" +#if APR_HAVE_UNISTD_H +#include +#endif + +/* Win32 malpropism that can go away once everyone believes this + * code is golden, and I'm not testing it anymore :-) + */ +#if APR_HAVE_DIRENT_H +#include +#endif + +/* Any OS that requires/refuses trailing slashes should be dealt with here. + */ +APR_DECLARE(apr_status_t) apr_filepath_get(char **defpath, apr_int32_t flags, + apr_pool_t *p) +{ + char path[APR_PATH_MAX]; + + if (!getcwd(path, sizeof(path))) { + if (errno == ERANGE) + return APR_ENAMETOOLONG; + else + return errno; + } + *defpath = apr_pstrdup(p, path); + + return APR_SUCCESS; +} + + +/* Any OS that requires/refuses trailing slashes should be dealt with here + */ +APR_DECLARE(apr_status_t) apr_filepath_set(const char *path, apr_pool_t *p) +{ + if (chdir(path) != 0) + return errno; + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_filepath_root(const char **rootpath, + const char **inpath, + apr_int32_t flags, + apr_pool_t *p) +{ + if (**inpath == '/') { + *rootpath = apr_pstrdup(p, "/"); + do { + ++(*inpath); + } while (**inpath == '/'); + + return APR_SUCCESS; + } + + return APR_ERELATIVE; +} + +APR_DECLARE(apr_status_t) apr_filepath_merge(char **newpath, + const char *rootpath, + const char *addpath, + apr_int32_t flags, + apr_pool_t *p) +{ + char *path; + apr_size_t rootlen; /* is the length of the src rootpath */ + apr_size_t maxlen; /* maximum total path length */ + apr_size_t keptlen; /* is the length of the retained rootpath */ + apr_size_t pathlen; /* is the length of the result path */ + apr_size_t seglen; /* is the end of the current segment */ + apr_status_t rv; + + /* Treat null as an empty path. + */ + if (!addpath) + addpath = ""; + + if (addpath[0] == '/') { + /* If addpath is rooted, then rootpath is unused. + * Ths violates any APR_FILEPATH_SECUREROOTTEST and + * APR_FILEPATH_NOTABSOLUTE flags specified. + */ + if (flags & APR_FILEPATH_SECUREROOTTEST) + return APR_EABOVEROOT; + if (flags & APR_FILEPATH_NOTABSOLUTE) + return APR_EABSOLUTE; + + /* If APR_FILEPATH_NOTABOVEROOT wasn't specified, + * we won't test the root again, it's ignored. + * Waste no CPU retrieving the working path. + */ + if (!rootpath && !(flags & APR_FILEPATH_NOTABOVEROOT)) + rootpath = ""; + } + else { + /* If APR_FILEPATH_NOTABSOLUTE is specified, the caller + * requires a relative result. If the rootpath is + * ommitted, we do not retrieve the working path, + * if rootpath was supplied as absolute then fail. + */ + if (flags & APR_FILEPATH_NOTABSOLUTE) { + if (!rootpath) + rootpath = ""; + else if (rootpath[0] == '/') + return APR_EABSOLUTE; + } + } + + if (!rootpath) { + /* Start with the current working path. This is bass akwards, + * but required since the compiler (at least vc) doesn't like + * passing the address of a char const* for a char** arg. + */ + char *getpath; + rv = apr_filepath_get(&getpath, flags, p); + rootpath = getpath; + if (rv != APR_SUCCESS) + return errno; + + /* XXX: Any kernel subject to goofy, uncanonical results + * must run the rootpath against the user's given flags. + * Simplest would be a recursive call to apr_filepath_merge + * with an empty (not null) rootpath and addpath of the cwd. + */ + } + + rootlen = strlen(rootpath); + maxlen = rootlen + strlen(addpath) + 4; /* 4 for slashes at start, after + * root, and at end, plus trailing + * null */ + if (maxlen > APR_PATH_MAX) { + return APR_ENAMETOOLONG; + } + path = (char *)apr_palloc(p, maxlen); + + if (addpath[0] == '/') { + /* Ignore the given root path, strip off leading + * '/'s to a single leading '/' from the addpath, + * and leave addpath at the first non-'/' character. + */ + keptlen = 0; + while (addpath[0] == '/') + ++addpath; + path[0] = '/'; + pathlen = 1; + } + else { + /* If both paths are relative, fail early + */ + if (rootpath[0] != '/' && (flags & APR_FILEPATH_NOTRELATIVE)) + return APR_ERELATIVE; + + /* Base the result path on the rootpath + */ + keptlen = rootlen; + memcpy(path, rootpath, rootlen); + + /* Always '/' terminate the given root path + */ + if (keptlen && path[keptlen - 1] != '/') { + path[keptlen++] = '/'; + } + pathlen = keptlen; + } + + while (*addpath) { + /* Parse each segment, find the closing '/' + */ + const char *next = addpath; + while (*next && (*next != '/')) { + ++next; + } + seglen = next - addpath; + + if (seglen == 0 || (seglen == 1 && addpath[0] == '.')) { + /* noop segment (/ or ./) so skip it + */ + } + else if (seglen == 2 && addpath[0] == '.' && addpath[1] == '.') { + /* backpath (../) */ + if (pathlen == 1 && path[0] == '/') { + /* Attempt to move above root. Always die if the + * APR_FILEPATH_SECUREROOTTEST flag is specified. + */ + if (flags & APR_FILEPATH_SECUREROOTTEST) { + return APR_EABOVEROOT; + } + + /* Otherwise this is simply a noop, above root is root. + * Flag that rootpath was entirely replaced. + */ + keptlen = 0; + } + else if (pathlen == 0 + || (pathlen == 3 + && !memcmp(path + pathlen - 3, "../", 3)) + || (pathlen > 3 + && !memcmp(path + pathlen - 4, "/../", 4))) { + /* Path is already backpathed or empty, if the + * APR_FILEPATH_SECUREROOTTEST.was given die now. + */ + if (flags & APR_FILEPATH_SECUREROOTTEST) { + return APR_EABOVEROOT; + } + + /* Otherwise append another backpath, including + * trailing slash if present. + */ + memcpy(path + pathlen, "../", *next ? 3 : 2); + pathlen += *next ? 3 : 2; + } + else { + /* otherwise crop the prior segment + */ + do { + --pathlen; + } while (pathlen && path[pathlen - 1] != '/'); + } + + /* Now test if we are above where we started and back up + * the keptlen offset to reflect the added/altered path. + */ + if (pathlen < keptlen) { + if (flags & APR_FILEPATH_SECUREROOTTEST) { + return APR_EABOVEROOT; + } + keptlen = pathlen; + } + } + else { + /* An actual segment, append it to the destination path + */ + if (*next) { + seglen++; + } + memcpy(path + pathlen, addpath, seglen); + pathlen += seglen; + } + + /* Skip over trailing slash to the next segment + */ + if (*next) { + ++next; + } + + addpath = next; + } + path[pathlen] = '\0'; + + /* keptlen will be the rootlen unless the addpath contained + * backpath elements. If so, and APR_FILEPATH_NOTABOVEROOT + * is specified (APR_FILEPATH_SECUREROOTTEST was caught above), + * compare the original root to assure the result path is + * still within given root path. + */ + if ((flags & APR_FILEPATH_NOTABOVEROOT) && keptlen < rootlen) { + if (strncmp(rootpath, path, rootlen)) { + return APR_EABOVEROOT; + } + if (rootpath[rootlen - 1] != '/' + && path[rootlen] && path[rootlen] != '/') { + return APR_EABOVEROOT; + } + } + + *newpath = path; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_filepath_list_split(apr_array_header_t **pathelts, + const char *liststr, + apr_pool_t *p) +{ + return apr_filepath_list_split_impl(pathelts, liststr, ':', p); +} + +APR_DECLARE(apr_status_t) apr_filepath_list_merge(char **liststr, + apr_array_header_t *pathelts, + apr_pool_t *p) +{ + return apr_filepath_list_merge_impl(liststr, pathelts, ':', p); +} + +APR_DECLARE(apr_status_t) apr_filepath_encoding(int *style, apr_pool_t *p) +{ +#if defined(DARWIN) + *style = APR_FILEPATH_ENCODING_UTF8; +#else + *style = APR_FILEPATH_ENCODING_LOCALE; +#endif + return APR_SUCCESS; +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/filepath.lo b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/filepath.lo new file mode 100644 index 00000000..af05a4cf --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/filepath.lo @@ -0,0 +1,12 @@ +# filepath.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/filepath.o' + +# Name of the non-PIC object. +non_pic_object='filepath.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/filepath.o b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/filepath.o new file mode 100644 index 0000000000000000000000000000000000000000..010f1383263fa5a10e5f72db372d63d23ce0f198 GIT binary patch literal 19872 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/filepath_util.c b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/filepath_util.c new file mode 100644 index 00000000..d8ccc567 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/filepath_util.c @@ -0,0 +1,111 @@ +/* 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. + */ + + +#define APR_WANT_STRFUNC +#define APR_WANT_MEMFUNC +#include "apr_want.h" + +#include "apr_errno.h" +#include "apr_pools.h" +#include "apr_strings.h" +#include "apr_tables.h" + +#include "apr_private.h" + +apr_status_t apr_filepath_list_split_impl(apr_array_header_t **pathelts, + const char *liststr, + char separator, + apr_pool_t *p) +{ + char *path, *part, *ptr; + char separator_string[2] = { '\0', '\0' }; + apr_array_header_t *elts; + int nelts; + + separator_string[0] = separator; + /* Count the number of path elements. We know there'll be at least + one even if path is an empty string. */ + path = apr_pstrdup(p, liststr); + for (nelts = 0, ptr = path; ptr != NULL; ++nelts) + { + ptr = strchr(ptr, separator); + if (ptr) + ++ptr; + } + + /* Split the path into the array. */ + elts = apr_array_make(p, nelts, sizeof(char*)); + while ((part = apr_strtok(path, separator_string, &ptr)) != NULL) + { + if (*part == '\0') /* Ignore empty path components. */ + continue; + + *(char**)apr_array_push(elts) = part; + path = NULL; /* For the next call to apr_strtok */ + } + + *pathelts = elts; + return APR_SUCCESS; +} + + +apr_status_t apr_filepath_list_merge_impl(char **liststr, + apr_array_header_t *pathelts, + char separator, + apr_pool_t *p) +{ + apr_size_t path_size = 0; + char *path; + int i; + + /* This test isn't 100% certain, but it'll catch at least some + invalid uses... */ + if (pathelts->elt_size != sizeof(char*)) + return APR_EINVAL; + + /* Calculate the size of the merged path */ + for (i = 0; i < pathelts->nelts; ++i) + path_size += strlen(((char**)pathelts->elts)[i]); + + if (path_size == 0) + { + *liststr = NULL; + return APR_SUCCESS; + } + + if (i > 0) /* Add space for the separators */ + path_size += (i - 1); + + /* Merge the path components */ + path = *liststr = apr_palloc(p, path_size + 1); + for (i = 0; i < pathelts->nelts; ++i) + { + /* ### Hmmmm. Calling strlen twice on the same string. Yuck. + But is is better than reallocation in apr_pstrcat? */ + const char *part = ((char**)pathelts->elts)[i]; + apr_size_t part_size = strlen(part); + if (part_size == 0) /* Ignore empty path components. */ + continue; + + if (i > 0) + *path++ = separator; + memcpy(path, part, part_size); + path += part_size; + } + *path = '\0'; + return APR_SUCCESS; +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/filepath_util.lo b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/filepath_util.lo new file mode 100644 index 00000000..cdf8e7dc --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/filepath_util.lo @@ -0,0 +1,12 @@ +# filepath_util.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/filepath_util.o' + +# Name of the non-PIC object. +non_pic_object='filepath_util.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/filepath_util.o b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/filepath_util.o new file mode 100644 index 0000000000000000000000000000000000000000..b693de0011842204c9b209df236ddc717cac439a GIT binary patch literal 10024 zcmbtZ3vgS-72T&N+e)0sjvX9_{FFqb;bYkb*EQsWWjl$SangM3@C}M=%eIItsnSz^ zK$5{25XK>yhA9kzWctap1MM*V0Hq8KB_D=%!ne>uOGC@>&oG54(1DWPyL<1`^UCRT z+8yidy=Tw8d+*(SPpju$%Q}|33`1};#8Q#h7!{)WoV?sD#b$Ais1U&o?YWb|uJ+u& zLb>OHox$A8UF$k+WelfTkZ#7S=p0sg>onAU;ki6 z*__=-=@@M`hMqQ74Ik-1nl-Z{ccLx#Hk)Vv5;_4eGJ*9t3b{8ra-YfZ_T16FvN^Zl zpa_k2`aPlC+o9Y?Y#YiwZB_4HB&@%69es2QQb+X%?$;Q4tzCT3&zTnvKD0 zgByd_Jq=MkVEYSR@mLkO4Q>c_1v??N+$WG-_0UcaOft!Dm4j_HTL!~V?+xaDKeAy` zd+w{@7t8iMhXIW&uO3aGsXracS$!eVR!#C&j=JkYIk$i4n9)9T)N|?P zNxOcIHphjiKk{DHnKNggByB>ppD2c?5OV?cSGN%G2hAflO~KCj%7M5H4>Db@64|*` z=TV&@-MU;wIA*$wVhKyQJW_KhirZ7&%NOBWedlY^d%9E7580B&$FHL}4 z4KqK2L@mUMJCkV!&W`CGfmuC>ygL#E#ml)Efs5x?nccj9DmRQ|jzP zQekxtmJ8dIlrVfU4^S!)G3H^I*fg~=Wu?FY&oMA?F# zU0aa?fr@D=2qA6-4$cg&p_mwJk>@zb)mV&QfjT`3f+19eTbvc1jVq0V2PT3ORnis| zu_?8clUHh+v%<^9R(QpJWk?kcaly}x38S5hHiI~#nS|F&UXq?e1gSdrvb&i+3KNID z#4)Zv28Oei)6lF%EYy);*XKT2pH9~7KA!`v#0q52c{ zJ+`ZOi05%t^)QN3=L( zNHQ*_Pu1L*Vw~r#EH%9|yi<&dl5!}A%P&exmjVPgHi?j&y9`jM1$OO~;HyfQ-pfiC zNu`98A{_B75ZFzq1j6F!5KEz0R&$*mWa_dSAVBPvdi;q7i2I6RF8@c)rtn&7pj$@@@TaXQyrtAo|C)TfTGk_ zViZ+(+-wL}^}ZGun8pKezZpim9G^ZHQmut7&UN^NDQ1*{i;5C-F>@C9LgmWRt7QJO zibQ=S#xWZl3Y-b{*4W$@%cOiovW|1}V+k*oNR7@@FaizJ6*S*w7Ug+<9mI`5O+KeV zHbfVT&(n}0HnR8i)@9yIu90D5Ws9htYy(@xc0v= zT*rnll21ci$0DbIL981mq3iUxE+imm`&z@|Pi<(!<0L*oy-U;`Wchb_8qdxd8Db3$ z+TCH2@M{(uP*`M#hFH(yvxq)Y^+ekWTQ?6x^7u+Ro5-fAHCN941gao}V zm@yY7Yx`f%J~(5f>8?&O0FNeYuqELmTN(9g|FL#yp2*^@Hgp|}?~k!%jZbc{C)5=A z>nRp(U!5FBkqxb9k%Lj&nYFz8g6bE#U(4><8hx!j$Xb;>=~@=^?l*F<+!wlEH=g@- zwtFs}A=a_Dm1cB_t%7APoVsIJ<3Nz9H$4(ubIyrpLX722cAgtp0`I^{4?9?WjxMAW%*_->f%Nb$0su}h(9}Ukig4jQz&iK)ATXDh09V8K!aEtR z@`pI;wb@L%HkRm#XM3Zy+nO4~jSV&NSR%WvrazIb?T%R)At~`#cWr-9Pa<(8Ts4 z5U7Pe@}}%q5q+_EG!?N1!dWX85AlK!(I3sWb?1&IBPG zO{WvdyqZcT)GeIc4%nPl33R5GFMu_YkI}BZZ^G-XU&0Uvhc&yFfhJI zIvv>_PGvI#Le?e|+Yyz4tAT-Nq&J!lTLN+DWJ*fJGKg@vH=2Rbfn?h9WfPfLev@0HuWvp-}6^~ir*kCFy#xQHUla>{aCZau?Gqve#cXu*V8%d>V2P`YqTXS)s zF3{Len@RWJ1^}u;>_KMYAzE&S>$UuXyX3)weqD%TA zv2?5l)Cf$m1U7h0BMkQYYQA}~ucj|!MS3>Zq|!+%+5@v-AW#aCP&2^XP&Zx@7_*X_ zMKlh#1eO<9fR@JEo{EZu9LbjeBLYY{urnXKD1*^-KU5PJWiUF}liHro7)pboNPp-G z_Xq3)xx&&LMkmpHL=a+cHdSz|g~Rg3h$ZlTz(R`^t*w{&7It-K6INCgtmfjZ)arNE zHw5Y$&Q~bh9aHgUfoAN0Z?A3T#*9fNp1p9tHUl;j2cXHbM2ok4k87E?dejVgeRsOs zybEtF3VQ2?irc)+u7@Xj>sq}FgI-^Yw;Gr&UQe)8gur$aI)FACdGg)*7CdQRc&x zBG8i@9E`%61ro5a0Bj&h~ zV0`0M7;$_e6gE@P&94oacJ^ZjO!e=9u^?!s`gg!MIKLqpJ7lVt&0|672UotZnf7bl z{21S0cljj8J@zu$A{5@yE?>!4% za9aA0M`wBPgYS4eWTp&?!YAIACqMjRhGjECq(LmdC(!g$hw zS2^$l4&2E<>cFQt`24jt5ipiPRR76>9&!BOyL4>yIJfbuF)(O27dGbOzQ6|Wx@ALi zqDuXI1xr3Yd$`q+z<%B*{Tmv-l63hS6J+M^Abgp|ub}ulG`xX=TCd?;_lSlsApU@c z^J{{w8h)DQy-~yQyoD{NIy?TCNZ+gBuaKX+HT)9NAJXv8NqaDJ`WOE`8!l{4I+@t4uyumdllSg^apfn(0ir0;j&$mjP`_d0OoSCRkkIdJ6P z10QS;YxoNa7Qb-d=%<$a{Mvz|pE}a{xxwqwO#G7?{}AbKI&ie{lm3y0^E&?1f#bYi zlFq-EcwXKo9-1F<IuR*&W|bn z;~M`I`T4WP=XHO_fn#3ZCjCPPj&tz7`qY6Ve+C`izHs2k=Y3K{<6O5Lq*rM8A4#9) zz|n?&Mu@o%9Ovz!BiRB6j(px%bq*Z)&k%o!hA*HaTnpj6j(e$|S2+0SpZ8(JfusL# zk)J*Xj{NVEpOgbf{(jJ#m{Qm2N!Di^@P`Jcq#d5*YKm@3)_H(^LzN)G+eQTIH2MDeEy|| r^YiXG4gWgD!)FrAiApS|;4>%EC?$#WKZJDLCr1_6$?w(hQ>6bJlN)J@ literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/filestat.c b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/filestat.c new file mode 100644 index 00000000..9b0ae6e6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/filestat.c @@ -0,0 +1,311 @@ +/* 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. + */ + +#include "apr_arch_file_io.h" +#include "apr_file_io.h" +#include "apr_general.h" +#include "apr_strings.h" +#include "apr_errno.h" + +#ifdef HAVE_UTIME +#include +#endif + +static apr_filetype_e filetype_from_mode(mode_t mode) +{ + apr_filetype_e type; + + switch (mode & S_IFMT) { + case S_IFREG: + type = APR_REG; break; + case S_IFDIR: + type = APR_DIR; break; + case S_IFLNK: + type = APR_LNK; break; + case S_IFCHR: + type = APR_CHR; break; + case S_IFBLK: + type = APR_BLK; break; +#if defined(S_IFFIFO) + case S_IFFIFO: + type = APR_PIPE; break; +#endif +#if !defined(BEOS) && defined(S_IFSOCK) + case S_IFSOCK: + type = APR_SOCK; break; +#endif + + default: + /* Work around missing S_IFxxx values above + * for Linux et al. + */ +#if !defined(S_IFFIFO) && defined(S_ISFIFO) + if (S_ISFIFO(mode)) { + type = APR_PIPE; + } else +#endif +#if !defined(BEOS) && !defined(S_IFSOCK) && defined(S_ISSOCK) + if (S_ISSOCK(mode)) { + type = APR_SOCK; + } else +#endif + type = APR_UNKFILE; + } + return type; +} + +static void fill_out_finfo(apr_finfo_t *finfo, struct stat *info, + apr_int32_t wanted) +{ + finfo->valid = APR_FINFO_MIN | APR_FINFO_IDENT | APR_FINFO_NLINK + | APR_FINFO_OWNER | APR_FINFO_PROT; + finfo->protection = apr_unix_mode2perms(info->st_mode); + finfo->filetype = filetype_from_mode(info->st_mode); + finfo->user = info->st_uid; + finfo->group = info->st_gid; + finfo->size = info->st_size; + finfo->inode = info->st_ino; + finfo->device = info->st_dev; + finfo->nlink = info->st_nlink; + apr_time_ansi_put(&finfo->atime, info->st_atime); + apr_time_ansi_put(&finfo->mtime, info->st_mtime); + apr_time_ansi_put(&finfo->ctime, info->st_ctime); + /* ### needs to be revisited + * if (wanted & APR_FINFO_CSIZE) { + * finfo->csize = info->st_blocks * 512; + * finfo->valid |= APR_FINFO_CSIZE; + * } + */ +} + +apr_status_t apr_file_info_get_locked(apr_finfo_t *finfo, apr_int32_t wanted, + apr_file_t *thefile) +{ + struct stat info; + + if (thefile->buffered) { + apr_status_t rv = apr_file_flush_locked(thefile); + if (rv != APR_SUCCESS) + return rv; + } + + if (fstat(thefile->filedes, &info) == 0) { + finfo->pool = thefile->pool; + finfo->fname = thefile->fname; + fill_out_finfo(finfo, &info, wanted); + return (wanted & ~finfo->valid) ? APR_INCOMPLETE : APR_SUCCESS; + } + else { + return errno; + } +} + +APR_DECLARE(apr_status_t) apr_file_info_get(apr_finfo_t *finfo, + apr_int32_t wanted, + apr_file_t *thefile) +{ + struct stat info; + + if (thefile->buffered) { + apr_status_t rv = apr_file_flush(thefile); + if (rv != APR_SUCCESS) + return rv; + } + + if (fstat(thefile->filedes, &info) == 0) { + finfo->pool = thefile->pool; + finfo->fname = thefile->fname; + fill_out_finfo(finfo, &info, wanted); + return (wanted & ~finfo->valid) ? APR_INCOMPLETE : APR_SUCCESS; + } + else { + return errno; + } +} + +APR_DECLARE(apr_status_t) apr_file_perms_set(const char *fname, + apr_fileperms_t perms) +{ + mode_t mode = apr_unix_perms2mode(perms); + + if (chmod(fname, mode) == -1) + return errno; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_file_attrs_set(const char *fname, + apr_fileattrs_t attributes, + apr_fileattrs_t attr_mask, + apr_pool_t *pool) +{ + apr_status_t status; + apr_finfo_t finfo; + + /* Don't do anything if we can't handle the requested attributes */ + if (!(attr_mask & (APR_FILE_ATTR_READONLY + | APR_FILE_ATTR_EXECUTABLE))) + return APR_SUCCESS; + + status = apr_stat(&finfo, fname, APR_FINFO_PROT, pool); + if (!APR_STATUS_IS_SUCCESS(status)) + return status; + + /* ### TODO: should added bits be umask'd? */ + if (attr_mask & APR_FILE_ATTR_READONLY) + { + if (attributes & APR_FILE_ATTR_READONLY) + { + finfo.protection &= ~APR_UWRITE; + finfo.protection &= ~APR_GWRITE; + finfo.protection &= ~APR_WWRITE; + } + else + { + /* ### umask this! */ + finfo.protection |= APR_UWRITE; + finfo.protection |= APR_GWRITE; + finfo.protection |= APR_WWRITE; + } + } + + if (attr_mask & APR_FILE_ATTR_EXECUTABLE) + { + if (attributes & APR_FILE_ATTR_EXECUTABLE) + { + /* ### umask this! */ + finfo.protection |= APR_UEXECUTE; + finfo.protection |= APR_GEXECUTE; + finfo.protection |= APR_WEXECUTE; + } + else + { + finfo.protection &= ~APR_UEXECUTE; + finfo.protection &= ~APR_GEXECUTE; + finfo.protection &= ~APR_WEXECUTE; + } + } + + return apr_file_perms_set(fname, finfo.protection); +} + + +APR_DECLARE(apr_status_t) apr_file_mtime_set(const char *fname, + apr_time_t mtime, + apr_pool_t *pool) +{ + apr_status_t status; + apr_finfo_t finfo; + + status = apr_stat(&finfo, fname, APR_FINFO_ATIME, pool); + if (!APR_STATUS_IS_SUCCESS(status)) { + return status; + } + +#ifdef HAVE_UTIMES + { + struct timeval tvp[2]; + + tvp[0].tv_sec = apr_time_sec(finfo.atime); + tvp[0].tv_usec = apr_time_usec(finfo.atime); + tvp[1].tv_sec = apr_time_sec(mtime); + tvp[1].tv_usec = apr_time_usec(mtime); + + if (utimes(fname, tvp) == -1) { + return errno; + } + } +#elif defined(HAVE_UTIME) + { + struct utimbuf buf; + + buf.actime = (time_t) (finfo.atime / APR_USEC_PER_SEC); + buf.modtime = (time_t) (mtime / APR_USEC_PER_SEC); + + if (utime(fname, &buf) == -1) { + return errno; + } + } +#else + return APR_ENOTIMPL; +#endif + + return APR_SUCCESS; +} + + +APR_DECLARE(apr_status_t) apr_stat(apr_finfo_t *finfo, + const char *fname, + apr_int32_t wanted, apr_pool_t *pool) +{ + struct stat info; + int srv; + + if (wanted & APR_FINFO_LINK) + srv = lstat(fname, &info); + else + srv = stat(fname, &info); + + if (srv == 0) { + finfo->pool = pool; + finfo->fname = fname; + fill_out_finfo(finfo, &info, wanted); + if (wanted & APR_FINFO_LINK) + wanted &= ~APR_FINFO_LINK; + return (wanted & ~finfo->valid) ? APR_INCOMPLETE : APR_SUCCESS; + } + else { +#if !defined(ENOENT) || !defined(ENOTDIR) +#error ENOENT || ENOTDIR not defined; please see the +#error comments at this line in the source for a workaround. + /* + * If ENOENT || ENOTDIR is not defined in one of the your OS's + * include files, APR cannot report a good reason why the stat() + * of the file failed; there are cases where it can fail even though + * the file exists. This opens holes in Apache, for example, because + * it becomes possible for someone to get a directory listing of a + * directory even though there is an index (eg. index.html) file in + * it. If you do not have a problem with this, delete the above + * #error lines and start the compile again. If you need to do this, + * please submit a bug report to http://www.apache.org/bug_report.html + * letting us know that you needed to do this. Please be sure to + * include the operating system you are using. + */ + /* WARNING: All errors will be handled as not found + */ +#if !defined(ENOENT) + return APR_ENOENT; +#else + /* WARNING: All errors but not found will be handled as not directory + */ + if (errno != ENOENT) + return APR_ENOENT; + else + return errno; +#endif +#else /* All was defined well, report the usual: */ + return errno; +#endif + } +} + +/* Perhaps this becomes nothing but a macro? + */ +APR_DECLARE(apr_status_t) apr_lstat(apr_finfo_t *finfo, const char *fname, + apr_int32_t wanted, apr_pool_t *pool) +{ + return apr_stat(finfo, fname, wanted | APR_FINFO_LINK, pool); +} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/filestat.lo b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/filestat.lo new file mode 100644 index 00000000..f1074ce6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/filestat.lo @@ -0,0 +1,12 @@ +# filestat.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/filestat.o' + +# Name of the non-PIC object. +non_pic_object='filestat.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/filestat.o b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/filestat.o new file mode 100644 index 0000000000000000000000000000000000000000..7eed58ce6e0cf4f7f148d3d3b45da5e494c72477 GIT binary patch literal 23824 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/flock.c b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/flock.c new file mode 100644 index 00000000..f400a967 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/flock.c @@ -0,0 +1,120 @@ +/* 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. + */ + +#include "apr_arch_file_io.h" + +#if APR_HAVE_FCNTL_H +#include +#endif +#ifdef HAVE_SYS_FILE_H +#include +#endif + +APR_DECLARE(apr_status_t) apr_file_lock(apr_file_t *thefile, int type) +{ + int rc; + +#if defined(HAVE_FCNTL_H) + { + struct flock l = { 0 }; + int fc; + + l.l_whence = SEEK_SET; /* lock from current point */ + l.l_start = 0; /* begin lock at this offset */ + l.l_len = 0; /* lock to end of file */ + if ((type & APR_FLOCK_TYPEMASK) == APR_FLOCK_SHARED) + l.l_type = F_RDLCK; + else + l.l_type = F_WRLCK; + + fc = (type & APR_FLOCK_NONBLOCK) ? F_SETLK : F_SETLKW; + + /* keep trying if fcntl() gets interrupted (by a signal) */ + while ((rc = fcntl(thefile->filedes, fc, &l)) < 0 && errno == EINTR) + continue; + + if (rc == -1) { + /* on some Unix boxes (e.g., Tru64), we get EACCES instead + * of EAGAIN; we don't want APR_STATUS_IS_EAGAIN() matching EACCES + * since that breaks other things, so fix up the retcode here + */ + if (errno == EACCES) { + return EAGAIN; + } + return errno; + } + } +#elif defined(HAVE_SYS_FILE_H) + { + int ltype; + + if ((type & APR_FLOCK_TYPEMASK) == APR_FLOCK_SHARED) + ltype = LOCK_SH; + else + ltype = LOCK_EX; + if ((type & APR_FLOCK_NONBLOCK) != 0) + ltype |= LOCK_NB; + + /* keep trying if flock() gets interrupted (by a signal) */ + while ((rc = flock(thefile->filedes, ltype)) < 0 && errno == EINTR) + continue; + + if (rc == -1) + return errno; + } +#else +#error No file locking mechanism is available. +#endif + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_file_unlock(apr_file_t *thefile) +{ + int rc; + +#if defined(HAVE_FCNTL_H) + { + struct flock l = { 0 }; + + l.l_whence = SEEK_SET; /* lock from current point */ + l.l_start = 0; /* begin lock at this offset */ + l.l_len = 0; /* lock to end of file */ + l.l_type = F_UNLCK; + + /* keep trying if fcntl() gets interrupted (by a signal) */ + while ((rc = fcntl(thefile->filedes, F_SETLKW, &l)) < 0 + && errno == EINTR) + continue; + + if (rc == -1) + return errno; + } +#elif defined(HAVE_SYS_FILE_H) + { + /* keep trying if flock() gets interrupted (by a signal) */ + while ((rc = flock(thefile->filedes, LOCK_UN)) < 0 && errno == EINTR) + continue; + + if (rc == -1) + return errno; + } +#else +#error No file locking mechanism is available. +#endif + + return APR_SUCCESS; +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/flock.lo b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/flock.lo new file mode 100644 index 00000000..b2401d49 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/flock.lo @@ -0,0 +1,12 @@ +# flock.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/flock.o' + +# Name of the non-PIC object. +non_pic_object='flock.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/flock.o b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/flock.o new file mode 100644 index 0000000000000000000000000000000000000000..a3cf71949dc03c5c3a9a92f7453880283e3d5497 GIT binary patch literal 9472 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 V^^hMO50C)%l(Vn4YWO(u{{b%37*zlO literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/fullrw.c b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/fullrw.c new file mode 100644 index 00000000..ff76a29f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/fullrw.c @@ -0,0 +1,63 @@ +/* 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. + */ + +#include "apr_file_io.h" + + +APR_DECLARE(apr_status_t) apr_file_read_full(apr_file_t *thefile, void *buf, + apr_size_t nbytes, + apr_size_t *bytes_read) +{ + apr_status_t status; + apr_size_t total_read = 0; + + do { + apr_size_t amt = nbytes; + + status = apr_file_read(thefile, buf, &amt); + buf = (char *)buf + amt; + nbytes -= amt; + total_read += amt; + } while (status == APR_SUCCESS && nbytes > 0); + + if (bytes_read != NULL) + *bytes_read = total_read; + + return status; +} + +APR_DECLARE(apr_status_t) apr_file_write_full(apr_file_t *thefile, + const void *buf, + apr_size_t nbytes, + apr_size_t *bytes_written) +{ + apr_status_t status; + apr_size_t total_written = 0; + + do { + apr_size_t amt = nbytes; + + status = apr_file_write(thefile, buf, &amt); + buf = (char *)buf + amt; + nbytes -= amt; + total_written += amt; + } while (status == APR_SUCCESS && nbytes > 0); + + if (bytes_written != NULL) + *bytes_written = total_written; + + return status; +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/fullrw.lo b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/fullrw.lo new file mode 100644 index 00000000..003757c3 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/fullrw.lo @@ -0,0 +1,12 @@ +# fullrw.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/fullrw.o' + +# Name of the non-PIC object. +non_pic_object='fullrw.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/fullrw.o b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/fullrw.o new file mode 100644 index 0000000000000000000000000000000000000000..db1a343c9ae074a37303a756071bd7f0859d0024 GIT binary patch literal 8480 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 X91pn>Z +#endif +#endif +#define arc4random() rand() +#define seedrandom(a) srand(a) +#else +#if APR_HAVE_STDINT_H +#include +#endif +#define arc4random() random() +#define seedrandom(a) srandom(a) +#endif + +#if APR_HAVE_SYS_TYPES_H +#include +#endif +#if APR_HAVE_SYS_STAT_H +#include +#endif +#if APR_HAVE_FCNTL_H +#include +#endif +#include +#include +#include +#include +#ifdef HAVE_TIME_H +#include +#endif + +static const unsigned char padchar[] = +"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; +static apr_uint32_t randseed=0; + +static int gettemp(char *path, apr_file_t **doopen, apr_int32_t flags, apr_pool_t *p) +{ + register char *start, *trv, *suffp; + char *pad; + apr_finfo_t sbuf; + apr_status_t rv; + apr_uint32_t randnum; + + if (randseed==0) { + randseed = (int)apr_time_now(); + seedrandom(randseed); + } + + for (trv = path; *trv; ++trv) + ; + suffp = trv; + --trv; + if (trv < path) { + return APR_EINVAL; + } + + /* Fill space with random characters */ + while (*trv == 'X') { + randnum = arc4random() % (sizeof(padchar) - 1); + *trv-- = padchar[randnum]; + } + start = trv + 1; + + /* + * check the target directory. + */ + for (;; --trv) { + if (trv <= path) + break; + if (*trv == '/') { + *trv = '\0'; + rv = apr_stat(&sbuf, path, APR_FINFO_TYPE, p); + *trv = '/'; + if (rv != APR_SUCCESS) + return rv; + if (sbuf.filetype != APR_DIR) { + return APR_ENOTDIR; + } + break; + } + } + + for (;;) { + if ((rv = apr_file_open(doopen, path, flags, + APR_UREAD | APR_UWRITE, p)) == APR_SUCCESS) + return APR_SUCCESS; + if (!APR_STATUS_IS_EEXIST(rv)) + return rv; + + /* If we have a collision, cycle through the space of filenames */ + for (trv = start;;) { + if (*trv == '\0' || trv == suffp) + return APR_EINVAL; /* XXX: is this the correct return code? */ + pad = strchr((char *)padchar, *trv); + if (pad == NULL || !*++pad) { + *trv++ = padchar[0]; + } + else { + *trv++ = *pad; + break; + } + } + } + /*NOTREACHED*/ +} + +#else + +#if APR_HAVE_STDLIB_H +#include /* for mkstemp() - Single Unix */ +#endif +#if APR_HAVE_UNISTD_H +#include /* for mkstemp() - FreeBSD */ +#endif +#endif /* !defined(HAVE_MKSTEMP) */ + +APR_DECLARE(apr_status_t) apr_file_mktemp(apr_file_t **fp, char *template, apr_int32_t flags, apr_pool_t *p) +{ +#ifdef HAVE_MKSTEMP + int fd; +#endif + flags = (!flags) ? APR_CREATE | APR_READ | APR_WRITE | APR_EXCL | + APR_DELONCLOSE : flags; +#ifndef HAVE_MKSTEMP + return gettemp(template, fp, flags, p); +#else + + fd = mkstemp(template); + if (fd == -1) { + return errno; + } + /* XXX: We must reset several flags values as passed-in, since + * mkstemp didn't subscribe to our preference flags. + * + * We either have to unset the flags, or fix up the fd and other + * xthread and inherit bits appropriately. Since gettemp() above + * calls apr_file_open, our flags are respected in that code path. + */ + apr_os_file_put(fp, &fd, flags, p); + (*fp)->fname = apr_pstrdup(p, template); + + if (!(flags & APR_FILE_NOCLEANUP)) { + apr_pool_cleanup_register((*fp)->pool, (void *)(*fp), + apr_unix_file_cleanup, + apr_unix_child_file_cleanup); + } +#endif + return APR_SUCCESS; +} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/mktemp.lo b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/mktemp.lo new file mode 100644 index 00000000..268a5865 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/mktemp.lo @@ -0,0 +1,12 @@ +# mktemp.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/mktemp.o' + +# Name of the non-PIC object. +non_pic_object='mktemp.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/mktemp.o b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/mktemp.o new file mode 100644 index 0000000000000000000000000000000000000000..eaf9e090c73c5073caffe8cda04816d339ce123d GIT binary patch literal 9352 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/open.c b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/open.c new file mode 100644 index 00000000..673da3e4 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/open.c @@ -0,0 +1,303 @@ +/* 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. + */ + +#include "apr_arch_file_io.h" +#include "apr_strings.h" +#include "apr_portable.h" +#include "apr_thread_mutex.h" +#include "apr_arch_inherit.h" + +#ifdef NETWARE +#include "nks/dirio.h" +#include "apr_hash.h" +#include "fsio.h" +#endif + +static apr_status_t file_cleanup(apr_file_t *file) +{ + apr_status_t rv = APR_SUCCESS; + + if (close(file->filedes) == 0) { + file->filedes = -1; + if (file->flags & APR_DELONCLOSE) { + unlink(file->fname); + } +#if APR_HAS_THREADS + if (file->thlock) { + rv = apr_thread_mutex_destroy(file->thlock); + } +#endif + } + else { + /* Are there any error conditions other than EINTR or EBADF? */ + rv = errno; + } + return rv; +} + +apr_status_t apr_unix_file_cleanup(void *thefile) +{ + apr_file_t *file = thefile; + apr_status_t flush_rv = APR_SUCCESS, rv = APR_SUCCESS; + + if (file->buffered) { + flush_rv = apr_file_flush(file); + } + + rv = file_cleanup(file); + + return rv != APR_SUCCESS ? rv : flush_rv; +} + +apr_status_t apr_unix_child_file_cleanup(void *thefile) +{ + return file_cleanup(thefile); +} + +APR_DECLARE(apr_status_t) apr_file_open(apr_file_t **new, + const char *fname, + apr_int32_t flag, + apr_fileperms_t perm, + apr_pool_t *pool) +{ + apr_os_file_t fd; + int oflags = 0; +#if APR_HAS_THREADS + apr_thread_mutex_t *thlock; + apr_status_t rv; +#endif + + if ((flag & APR_READ) && (flag & APR_WRITE)) { + oflags = O_RDWR; + } + else if (flag & APR_READ) { + oflags = O_RDONLY; + } + else if (flag & APR_WRITE) { + oflags = O_WRONLY; + } + else { + return APR_EACCES; + } + + if (flag & APR_CREATE) { + oflags |= O_CREAT; + if (flag & APR_EXCL) { + oflags |= O_EXCL; + } + } + if ((flag & APR_EXCL) && !(flag & APR_CREATE)) { + return APR_EACCES; + } + + if (flag & APR_APPEND) { + oflags |= O_APPEND; + } + if (flag & APR_TRUNCATE) { + oflags |= O_TRUNC; + } +#ifdef O_BINARY + if (flag & APR_BINARY) { + oflags |= O_BINARY; + } +#endif +#ifdef O_LARGEFILE + if (flag & APR_LARGEFILE) { + oflags |= O_LARGEFILE; + } +#endif + +#if APR_HAS_THREADS + if ((flag & APR_BUFFERED) && (flag & APR_XTHREAD)) { + rv = apr_thread_mutex_create(&thlock, + APR_THREAD_MUTEX_DEFAULT, pool); + if (rv) { + return rv; + } + } +#endif + + if (perm == APR_OS_DEFAULT) { + fd = open(fname, oflags, 0666); + } + else { + fd = open(fname, oflags, apr_unix_perms2mode(perm)); + } + if (fd < 0) { + return errno; + } + + (*new) = (apr_file_t *)apr_pcalloc(pool, sizeof(apr_file_t)); + (*new)->pool = pool; + (*new)->flags = flag; + (*new)->filedes = fd; + + (*new)->fname = apr_pstrdup(pool, fname); + + (*new)->blocking = BLK_ON; + (*new)->buffered = (flag & APR_BUFFERED) > 0; + + if ((*new)->buffered) { + (*new)->buffer = apr_palloc(pool, APR_FILE_BUFSIZE); +#if APR_HAS_THREADS + if ((*new)->flags & APR_XTHREAD) { + (*new)->thlock = thlock; + } +#endif + } + else { + (*new)->buffer = NULL; + } + + (*new)->is_pipe = 0; + (*new)->timeout = -1; + (*new)->ungetchar = -1; + (*new)->eof_hit = 0; + (*new)->filePtr = 0; + (*new)->bufpos = 0; + (*new)->dataRead = 0; + (*new)->direction = 0; + + if (!(flag & APR_FILE_NOCLEANUP)) { + apr_pool_cleanup_register((*new)->pool, (void *)(*new), + apr_unix_file_cleanup, + apr_unix_child_file_cleanup); + } + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_file_close(apr_file_t *file) +{ + return apr_pool_cleanup_run(file->pool, file, apr_unix_file_cleanup); +} + +APR_DECLARE(apr_status_t) apr_file_remove(const char *path, apr_pool_t *pool) +{ + if (unlink(path) == 0) { + return APR_SUCCESS; + } + else { + return errno; + } +} + +APR_DECLARE(apr_status_t) apr_file_rename(const char *from_path, + const char *to_path, + apr_pool_t *p) +{ + if (rename(from_path, to_path) != 0) { + return errno; + } + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_os_file_get(apr_os_file_t *thefile, + apr_file_t *file) +{ + *thefile = file->filedes; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_os_file_put(apr_file_t **file, + apr_os_file_t *thefile, + apr_int32_t flags, apr_pool_t *pool) +{ + int *dafile = thefile; + + (*file) = apr_pcalloc(pool, sizeof(apr_file_t)); + (*file)->pool = pool; + (*file)->eof_hit = 0; + (*file)->blocking = BLK_UNKNOWN; /* in case it is a pipe */ + (*file)->timeout = -1; + (*file)->ungetchar = -1; /* no char avail */ + (*file)->filedes = *dafile; + (*file)->flags = flags | APR_FILE_NOCLEANUP; + (*file)->buffered = (flags & APR_BUFFERED) > 0; + + if ((*file)->buffered) { + (*file)->buffer = apr_palloc(pool, APR_FILE_BUFSIZE); +#if APR_HAS_THREADS + if ((*file)->flags & APR_XTHREAD) { + apr_status_t rv; + rv = apr_thread_mutex_create(&((*file)->thlock), + APR_THREAD_MUTEX_DEFAULT, pool); + if (rv) { + return rv; + } + } +#endif + } + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_file_eof(apr_file_t *fptr) +{ + if (fptr->eof_hit == 1) { + return APR_EOF; + } + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_file_open_stderr(apr_file_t **thefile, + apr_pool_t *pool) +{ + int fd = STDERR_FILENO; + + return apr_os_file_put(thefile, &fd, 0, pool); +} + +APR_DECLARE(apr_status_t) apr_file_open_stdout(apr_file_t **thefile, + apr_pool_t *pool) +{ + int fd = STDOUT_FILENO; + + return apr_os_file_put(thefile, &fd, 0, pool); +} + +APR_DECLARE(apr_status_t) apr_file_open_stdin(apr_file_t **thefile, + apr_pool_t *pool) +{ + int fd = STDIN_FILENO; + + return apr_os_file_put(thefile, &fd, 0, pool); +} + +APR_IMPLEMENT_INHERIT_SET(file, flags, pool, apr_unix_file_cleanup) + +/* We need to do this by hand instead of using APR_IMPLEMENT_INHERIT_UNSET + * because the macro sets both cleanups to the same function, which is not + * suitable on Unix (see PR 41119). */ +APR_DECLARE(apr_status_t) apr_file_inherit_unset(apr_file_t *thefile) +{ + if (thefile->flags & APR_FILE_NOCLEANUP) { + return APR_EINVAL; + } + if (thefile->flags & APR_INHERIT) { + thefile->flags &= ~APR_INHERIT; + apr_pool_child_cleanup_set(thefile->pool, + (void *)thefile, + apr_unix_file_cleanup, + apr_unix_child_file_cleanup); + } + return APR_SUCCESS; +} +/* Deprecated */ +APR_DECLARE(void) apr_file_unset_inherit(apr_file_t *thefile) +{ + apr_file_inherit_unset(thefile); +} + +APR_POOL_IMPLEMENT_ACCESSOR(file) diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/open.lo b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/open.lo new file mode 100644 index 00000000..ebb21cc1 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/open.lo @@ -0,0 +1,12 @@ +# open.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/open.o' + +# Name of the non-PIC object. +non_pic_object='open.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/open.o b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/open.o new file mode 100644 index 0000000000000000000000000000000000000000..9560247bcbdcd7677c9cc94f2eb54d330fead251 GIT binary patch literal 25672 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/pipe.c b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/pipe.c new file mode 100644 index 00000000..8f96c494 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/pipe.c @@ -0,0 +1,227 @@ +/* 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. + */ + +#include "apr_arch_file_io.h" +#include "apr_strings.h" +#include "apr_portable.h" + +#include "apr_arch_inherit.h" + +/* Figure out how to get pipe block/nonblock on BeOS... + * Basically, BONE7 changed things again so that ioctl didn't work, + * but now fcntl does, hence we need to do this extra checking. + * The joys of beta programs. :-) + */ +#if BEOS +#if !BONE7 +# define BEOS_BLOCKING 1 +#else +# define BEOS_BLOCKING 0 +#endif +#endif + +static apr_status_t pipeblock(apr_file_t *thepipe) +{ +#if !BEOS_BLOCKING + int fd_flags; + + fd_flags = fcntl(thepipe->filedes, F_GETFL, 0); +# if defined(O_NONBLOCK) + fd_flags &= ~O_NONBLOCK; +# elif defined(O_NDELAY) + fd_flags &= ~O_NDELAY; +# elif defined(FNDELAY) + fd_flags &= ~O_FNDELAY; +# else + /* XXXX: this breaks things, but an alternative isn't obvious...*/ + return APR_ENOTIMPL; +# endif + if (fcntl(thepipe->filedes, F_SETFL, fd_flags) == -1) { + return errno; + } +#else /* BEOS_BLOCKING */ + +# if BEOS_BONE /* This only works on BONE 0-6 */ + int on = 0; + if (ioctl(thepipe->filedes, FIONBIO, &on, sizeof(on)) < 0) { + return errno; + } +# else /* "classic" BeOS doesn't support this at all */ + return APR_ENOTIMPL; +# endif + +#endif /* !BEOS_BLOCKING */ + + thepipe->blocking = BLK_ON; + return APR_SUCCESS; +} + +static apr_status_t pipenonblock(apr_file_t *thepipe) +{ +#if !BEOS_BLOCKING + int fd_flags = fcntl(thepipe->filedes, F_GETFL, 0); + +# if defined(O_NONBLOCK) + fd_flags |= O_NONBLOCK; +# elif defined(O_NDELAY) + fd_flags |= O_NDELAY; +# elif defined(FNDELAY) + fd_flags |= O_FNDELAY; +# else + /* XXXX: this breaks things, but an alternative isn't obvious...*/ + return APR_ENOTIMPL; +# endif + if (fcntl(thepipe->filedes, F_SETFL, fd_flags) == -1) { + return errno; + } + +#else /* BEOS_BLOCKING */ + +# if BEOS_BONE /* This only works on BONE 0-6 */ + int on = 1; + if (ioctl(thepipe->filedes, FIONBIO, &on, sizeof(on)) < 0) { + return errno; + } +# else /* "classic" BeOS doesn't support this at all */ + return APR_ENOTIMPL; +# endif + +#endif /* !BEOS_BLOCKING */ + + thepipe->blocking = BLK_OFF; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_file_pipe_timeout_set(apr_file_t *thepipe, apr_interval_time_t timeout) +{ + if (thepipe->is_pipe == 1) { + thepipe->timeout = timeout; + if (timeout >= 0) { + if (thepipe->blocking != BLK_OFF) { /* blocking or unknown state */ + return pipenonblock(thepipe); + } + } + else { + if (thepipe->blocking != BLK_ON) { /* non-blocking or unknown state */ + return pipeblock(thepipe); + } + } + return APR_SUCCESS; + } + return APR_EINVAL; +} + +APR_DECLARE(apr_status_t) apr_file_pipe_timeout_get(apr_file_t *thepipe, apr_interval_time_t *timeout) +{ + if (thepipe->is_pipe == 1) { + *timeout = thepipe->timeout; + return APR_SUCCESS; + } + return APR_EINVAL; +} + +APR_DECLARE(apr_status_t) apr_os_pipe_put_ex(apr_file_t **file, + apr_os_file_t *thefile, + int register_cleanup, + apr_pool_t *pool) +{ + int *dafile = thefile; + + (*file) = apr_pcalloc(pool, sizeof(apr_file_t)); + (*file)->pool = pool; + (*file)->eof_hit = 0; + (*file)->is_pipe = 1; + (*file)->blocking = BLK_UNKNOWN; /* app needs to make a timeout call */ + (*file)->timeout = -1; + (*file)->ungetchar = -1; /* no char avail */ + (*file)->filedes = *dafile; + if (!register_cleanup) { + (*file)->flags = APR_FILE_NOCLEANUP; + } + (*file)->buffered = 0; +#if APR_HAS_THREADS + (*file)->thlock = NULL; +#endif + if (register_cleanup) { + apr_pool_cleanup_register((*file)->pool, (void *)(*file), + apr_unix_file_cleanup, + apr_pool_cleanup_null); + } + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_os_pipe_put(apr_file_t **file, + apr_os_file_t *thefile, + apr_pool_t *pool) +{ + return apr_os_pipe_put_ex(file, thefile, 0, pool); +} + +APR_DECLARE(apr_status_t) apr_file_pipe_create(apr_file_t **in, apr_file_t **out, apr_pool_t *pool) +{ + int filedes[2]; + + if (pipe(filedes) == -1) { + return errno; + } + + (*in) = (apr_file_t *)apr_pcalloc(pool, sizeof(apr_file_t)); + (*in)->pool = pool; + (*in)->filedes = filedes[0]; + (*in)->is_pipe = 1; + (*in)->fname = NULL; + (*in)->buffered = 0; + (*in)->blocking = BLK_ON; + (*in)->timeout = -1; + (*in)->ungetchar = -1; + (*in)->flags = APR_INHERIT; +#if APR_HAS_THREADS + (*in)->thlock = NULL; +#endif + + (*out) = (apr_file_t *)apr_pcalloc(pool, sizeof(apr_file_t)); + (*out)->pool = pool; + (*out)->filedes = filedes[1]; + (*out)->is_pipe = 1; + (*out)->fname = NULL; + (*out)->buffered = 0; + (*out)->blocking = BLK_ON; + (*out)->flags = APR_INHERIT; + (*out)->timeout = -1; +#if APR_HAS_THREADS + (*out)->thlock = NULL; +#endif + + apr_pool_cleanup_register((*in)->pool, (void *)(*in), apr_unix_file_cleanup, + apr_pool_cleanup_null); + apr_pool_cleanup_register((*out)->pool, (void *)(*out), apr_unix_file_cleanup, + apr_pool_cleanup_null); + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_file_namedpipe_create(const char *filename, + apr_fileperms_t perm, apr_pool_t *pool) +{ + mode_t mode = apr_unix_perms2mode(perm); + + if (mkfifo(filename, mode) == -1) { + return errno; + } + return APR_SUCCESS; +} + + + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/pipe.lo b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/pipe.lo new file mode 100644 index 00000000..5c56a72d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/pipe.lo @@ -0,0 +1,12 @@ +# pipe.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/pipe.o' + +# Name of the non-PIC object. +non_pic_object='pipe.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/pipe.o b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/pipe.o new file mode 100644 index 0000000000000000000000000000000000000000..f354c4013c66e49b5af59062c0f0202f663259ae GIT binary patch literal 17896 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 { + char *pos = (char *)buf; + apr_uint64_t blocksize; + apr_uint64_t size = *nbytes; + + file_lock(thefile); + + if (thefile->direction == 1) { + rv = apr_file_flush_locked(thefile); + if (rv) { + file_unlock(thefile); + return rv; + } + thefile->bufpos = 0; + thefile->direction = 0; + thefile->dataRead = 0; + } + + rv = 0; + if (thefile->ungetchar != -1) { + *pos = (char)thefile->ungetchar; + ++pos; + --size; + thefile->ungetchar = -1; + } + while (rv == 0 && size > 0) { + if (thefile->bufpos >= thefile->dataRead) { + int bytesread = read(thefile->filedes, thefile->buffer, APR_FILE_BUFSIZE); + if (bytesread == 0) { + thefile->eof_hit = TRUE; + rv = APR_EOF; + break; + } + else if (bytesread == -1) { + rv = errno; + break; + } + thefile->dataRead = bytesread; + thefile->filePtr += thefile->dataRead; + thefile->bufpos = 0; + } + + blocksize = size > thefile->dataRead - thefile->bufpos ? thefile->dataRead - thefile->bufpos : size; + memcpy(pos, thefile->buffer + thefile->bufpos, blocksize); + thefile->bufpos += blocksize; + pos += blocksize; + size -= blocksize; + } + + *nbytes = pos - (char *)buf; + if (*nbytes) { + rv = 0; + } + + file_unlock(thefile); + + return rv; + } + else { + bytes_read = 0; + if (thefile->ungetchar != -1) { + bytes_read = 1; + *(char *)buf = (char)thefile->ungetchar; + buf = (char *)buf + 1; + (*nbytes)--; + thefile->ungetchar = -1; + if (*nbytes == 0) { + *nbytes = bytes_read; + return APR_SUCCESS; + } + } + + do { + rv = read(thefile->filedes, buf, *nbytes); + } while (rv == -1 && errno == EINTR); +#ifdef USE_WAIT_FOR_IO + if (rv == -1 && + (errno == EAGAIN || errno == EWOULDBLOCK) && + thefile->timeout != 0) { + apr_status_t arv = apr_wait_for_io_or_timeout(thefile, NULL, 1); + if (arv != APR_SUCCESS) { + *nbytes = bytes_read; + return arv; + } + else { + do { + rv = read(thefile->filedes, buf, *nbytes); + } while (rv == -1 && errno == EINTR); + } + } +#endif + *nbytes = bytes_read; + if (rv == 0) { + thefile->eof_hit = TRUE; + return APR_EOF; + } + if (rv > 0) { + *nbytes += rv; + return APR_SUCCESS; + } + return errno; + } +} + +APR_DECLARE(apr_status_t) apr_file_write(apr_file_t *thefile, const void *buf, apr_size_t *nbytes) +{ + apr_size_t rv; + + if (thefile->buffered) { + char *pos = (char *)buf; + int blocksize; + int size = *nbytes; + + file_lock(thefile); + + if ( thefile->direction == 0 ) { + /* Position file pointer for writing at the offset we are + * logically reading from + */ + apr_int64_t offset = thefile->filePtr - thefile->dataRead + thefile->bufpos; + if (offset != thefile->filePtr) + lseek(thefile->filedes, offset, SEEK_SET); + thefile->bufpos = thefile->dataRead = 0; + thefile->direction = 1; + } + + rv = 0; + while (rv == 0 && size > 0) { + if (thefile->bufpos == APR_FILE_BUFSIZE) /* write buffer is full*/ + rv = apr_file_flush_locked(thefile); + + blocksize = size > APR_FILE_BUFSIZE - thefile->bufpos ? + APR_FILE_BUFSIZE - thefile->bufpos : size; + memcpy(thefile->buffer + thefile->bufpos, pos, blocksize); + thefile->bufpos += blocksize; + pos += blocksize; + size -= blocksize; + } + + file_unlock(thefile); + + return rv; + } + else { + do { + rv = write(thefile->filedes, buf, *nbytes); + } while (rv == (apr_size_t)-1 && errno == EINTR); +#ifdef USE_WAIT_FOR_IO + if (rv == (apr_size_t)-1 && + (errno == EAGAIN || errno == EWOULDBLOCK) && + thefile->timeout != 0) { + apr_status_t arv = apr_wait_for_io_or_timeout(thefile, NULL, 0); + if (arv != APR_SUCCESS) { + *nbytes = 0; + return arv; + } + else { + do { + do { + rv = write(thefile->filedes, buf, *nbytes); + } while (rv == (apr_size_t)-1 && errno == EINTR); + if (rv == (apr_size_t)-1 && + (errno == EAGAIN || errno == EWOULDBLOCK)) { + *nbytes /= 2; /* yes, we'll loop if kernel lied + * and we can't even write 1 byte + */ + } + else { + break; + } + } while (1); + } + } +#endif + if (rv == (apr_size_t)-1) { + (*nbytes) = 0; + return errno; + } + *nbytes = rv; + return APR_SUCCESS; + } +} + +APR_DECLARE(apr_status_t) apr_file_writev(apr_file_t *thefile, const struct iovec *vec, + apr_size_t nvec, apr_size_t *nbytes) +{ +#ifdef HAVE_WRITEV + apr_status_t rv; + int bytes; + + if (thefile->buffered) { + file_lock(thefile); + + rv = apr_file_flush_locked(thefile); + if (rv != APR_SUCCESS) { + file_unlock(thefile); + return rv; + } + if (thefile->direction == 0) { + /* Position file pointer for writing at the offset we are + * logically reading from + */ + apr_int64_t offset = thefile->filePtr - thefile->dataRead + + thefile->bufpos; + if (offset != thefile->filePtr) + lseek(thefile->filedes, offset, SEEK_SET); + thefile->bufpos = thefile->dataRead = 0; + } + + file_unlock(thefile); + } + + if ((bytes = writev(thefile->filedes, vec, nvec)) < 0) { + *nbytes = 0; + rv = errno; + } + else { + *nbytes = bytes; + rv = APR_SUCCESS; + } + return rv; +#else + *nbytes = vec[0].iov_len; + return apr_file_write(thefile, vec[0].iov_base, nbytes); +#endif +} + +APR_DECLARE(apr_status_t) apr_file_putc(char ch, apr_file_t *thefile) +{ + apr_size_t nbytes = 1; + + return apr_file_write(thefile, &ch, &nbytes); +} + +APR_DECLARE(apr_status_t) apr_file_ungetc(char ch, apr_file_t *thefile) +{ + thefile->ungetchar = (unsigned char)ch; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_file_getc(char *ch, apr_file_t *thefile) +{ + apr_size_t nbytes = 1; + + return apr_file_read(thefile, ch, &nbytes); +} + +APR_DECLARE(apr_status_t) apr_file_puts(const char *str, apr_file_t *thefile) +{ + apr_size_t nbytes = strlen(str); + + return apr_file_write(thefile, str, &nbytes); +} + +apr_status_t apr_file_flush_locked(apr_file_t *thefile) +{ + apr_status_t rv = APR_SUCCESS; + + if (thefile->direction == 1 && thefile->bufpos) { + apr_ssize_t written; + + do { + written = write(thefile->filedes, thefile->buffer, thefile->bufpos); + } while (written == -1 && errno == EINTR); + if (written == -1) { + rv = errno; + } else { + thefile->filePtr += written; + thefile->bufpos = 0; + } + } + + return rv; +} + +APR_DECLARE(apr_status_t) apr_file_flush(apr_file_t *thefile) +{ + apr_status_t rv = APR_SUCCESS; + + if (thefile->buffered) { + file_lock(thefile); + rv = apr_file_flush_locked(thefile); + file_unlock(thefile); + } + /* There isn't anything to do if we aren't buffering the output + * so just return success. + */ + return rv; +} + +APR_DECLARE(apr_status_t) apr_file_gets(char *str, int len, apr_file_t *thefile) +{ + apr_status_t rv = APR_SUCCESS; /* get rid of gcc warning */ + apr_size_t nbytes; + const char *str_start = str; + char *final = str + len - 1; + + if (len <= 1) { + /* sort of like fgets(), which returns NULL and stores no bytes + */ + return APR_SUCCESS; + } + + while (str < final) { /* leave room for trailing '\0' */ + nbytes = 1; + rv = apr_file_read(thefile, str, &nbytes); + if (rv != APR_SUCCESS) { + break; + } + if (*str == '\n') { + ++str; + break; + } + ++str; + } + /* We must store a terminating '\0' if we've stored any chars. We can + * get away with storing it if we hit an error first. + */ + *str = '\0'; + if (str > str_start) { + /* we stored chars; don't report EOF or any other errors; + * the app will find out about that on the next call + */ + return APR_SUCCESS; + } + return rv; +} + +APR_DECLARE_NONSTD(int) apr_file_printf(apr_file_t *fptr, + const char *format, ...) +{ + apr_status_t cc; + va_list ap; + char *buf; + int len; + + buf = malloc(HUGE_STRING_LEN); + if (buf == NULL) { + return 0; + } + va_start(ap, format); + len = apr_vsnprintf(buf, HUGE_STRING_LEN, format, ap); + cc = apr_file_puts(buf, fptr); + va_end(ap); + free(buf); + return (cc == APR_SUCCESS) ? len : -1; +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/readwrite.lo b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/readwrite.lo new file mode 100644 index 00000000..7e4eabce --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/readwrite.lo @@ -0,0 +1,12 @@ +# readwrite.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/readwrite.o' + +# Name of the non-PIC object. +non_pic_object='readwrite.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/readwrite.o b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/readwrite.o new file mode 100644 index 0000000000000000000000000000000000000000..c69b0aeff46df38e023e32a22176e56f2d72c098 GIT binary patch literal 28096 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 == 1) { + rv = apr_file_flush_locked(thefile); + if (rv) { + return rv; + } + thefile->bufpos = thefile->direction = thefile->dataRead = 0; + } + + newbufpos = pos - (thefile->filePtr - thefile->dataRead); + if (newbufpos >= 0 && newbufpos <= thefile->dataRead) { + thefile->bufpos = newbufpos; + rv = APR_SUCCESS; + } + else { + if (lseek(thefile->filedes, pos, SEEK_SET) != -1) { + thefile->bufpos = thefile->dataRead = 0; + thefile->filePtr = pos; + rv = APR_SUCCESS; + } + else { + rv = errno; + } + } + + return rv; +} + + +APR_DECLARE(apr_status_t) apr_file_seek(apr_file_t *thefile, apr_seek_where_t where, apr_off_t *offset) +{ + apr_off_t rv; + + thefile->eof_hit = 0; + + if (thefile->buffered) { + int rc = EINVAL; + apr_finfo_t finfo; + + file_lock(thefile); + + switch (where) { + case APR_SET: + rc = setptr(thefile, *offset); + break; + + case APR_CUR: + rc = setptr(thefile, thefile->filePtr - thefile->dataRead + thefile->bufpos + *offset); + break; + + case APR_END: + rc = apr_file_info_get_locked(&finfo, APR_FINFO_SIZE, thefile); + if (rc == APR_SUCCESS) + rc = setptr(thefile, finfo.size + *offset); + break; + } + + *offset = thefile->filePtr - thefile->dataRead + thefile->bufpos; + + file_unlock(thefile); + + return rc; + } else { + + rv = lseek(thefile->filedes, *offset, where); + if (rv == -1) { + *offset = -1; + return errno; + } + else { + *offset = rv; + return APR_SUCCESS; + } + } +} + +apr_status_t apr_file_trunc(apr_file_t *fp, apr_off_t offset) +{ + if (ftruncate(fp->filedes, offset) == -1) { + return errno; + } + return apr_file_seek(fp, APR_SET, &offset); +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/seek.lo b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/seek.lo new file mode 100644 index 00000000..b46d86d0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/seek.lo @@ -0,0 +1,12 @@ +# seek.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/seek.o' + +# Name of the non-PIC object. +non_pic_object='seek.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/seek.o b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/seek.o new file mode 100644 index 0000000000000000000000000000000000000000..b32032c1df6b852350f48e252ec73395edec3421 GIT binary patch literal 14360 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 O64P*AzehEk>;B(JU&N09 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/tempdir.c b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/tempdir.c new file mode 100644 index 00000000..62f52076 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/tempdir.c @@ -0,0 +1,136 @@ +/* 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. + */ +#include "apr_private.h" +#include "apr_file_io.h" +#include "apr_strings.h" +#include "apr_env.h" + +/* + * FIXME + * Currently, this variable is a bit of misnomer. + * The intention is to have this in APR's global pool so that we don't have + * to go through this every time. + */ +static char global_temp_dir[APR_PATH_MAX+1] = { 0 }; + +/* Try to open a temporary file in the temporary dir, write to it, + and then close it. */ +static int test_tempdir(const char *temp_dir, apr_pool_t *p) +{ + apr_file_t *dummy_file; + const char *path = apr_pstrcat(p, temp_dir, "/apr-tmp.XXXXXX", NULL); + + if (apr_file_mktemp(&dummy_file, (char *)path, 0, p) == APR_SUCCESS) { + if (apr_file_putc('!', dummy_file) == APR_SUCCESS) { + if (apr_file_close(dummy_file) == APR_SUCCESS) { + return 1; + } + } + } + return 0; +} + + +APR_DECLARE(apr_status_t) apr_temp_dir_get(const char **temp_dir, + apr_pool_t *p) +{ + apr_status_t apr_err; + const char *try_dirs[] = { "/tmp", "/usr/tmp", "/var/tmp" }; + const char *try_envs[] = { "TMP", "TEMP", "TMPDIR" }; + char *cwd; + int i; + + /* Our goal is to find a temporary directory suitable for writing + into. We'll only pay the price once if we're successful -- we + cache our successful find. Here's the order in which we'll try + various paths: + + $TMP + $TEMP + $TMPDIR + "C:\TEMP" (windows only) + "SYS:\TMP" (netware only) + "/tmp" + "/var/tmp" + "/usr/tmp" + P_tmpdir (POSIX define) + `pwd` + + NOTE: This algorithm is basically the same one used by Python + 2.2's tempfile.py module. */ + + /* Try the environment first. */ + for (i = 0; i < (sizeof(try_envs) / sizeof(const char *)); i++) { + char *value; + apr_err = apr_env_get(&value, try_envs[i], p); + if ((apr_err == APR_SUCCESS) && value) { + apr_size_t len = strlen(value); + if (len && (len < APR_PATH_MAX) && test_tempdir(value, p)) { + memcpy(global_temp_dir, value, len + 1); + goto end; + } + } + } + +#ifdef WIN32 + /* Next, on Win32, try the C:\TEMP directory. */ + if (test_tempdir("C:\\TEMP", p)) { + memcpy(global_temp_dir, "C:\\TEMP", 7 + 1); + goto end; + } +#endif +#ifdef NETWARE + /* Next, on NetWare, try the SYS:/TMP directory. */ + if (test_tempdir("SYS:/TMP", p)) { + memcpy(global_temp_dir, "SYS:/TMP", 8 + 1); + goto end; + } +#endif + + /* Next, try a set of hard-coded paths. */ + for (i = 0; i < (sizeof(try_dirs) / sizeof(const char *)); i++) { + if (test_tempdir(try_dirs[i], p)) { + memcpy(global_temp_dir, try_dirs[i], strlen(try_dirs[i]) + 1); + goto end; + } + } + +#ifdef P_tmpdir + /* + * If we have it, use the POSIX definition of where + * the tmpdir should be + */ + if (test_tempdir(P_tmpdir, p)) { + memcpy(global_temp_dir, P_tmpdir, strlen(P_tmpdir) +1); + goto end; + } +#endif + + /* Finally, try the current working directory. */ + if (APR_SUCCESS == apr_filepath_get(&cwd, APR_FILEPATH_NATIVE, p)) { + if (test_tempdir(cwd, p)) { + memcpy(global_temp_dir, cwd, strlen(cwd) + 1); + goto end; + } + } + +end: + if (global_temp_dir[0]) { + *temp_dir = apr_pstrdup(p, global_temp_dir); + return APR_SUCCESS; + } + return APR_EGENERAL; +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/tempdir.lo b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/tempdir.lo new file mode 100644 index 00000000..5b1535ab --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/tempdir.lo @@ -0,0 +1,12 @@ +# tempdir.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/tempdir.o' + +# Name of the non-PIC object. +non_pic_object='tempdir.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/tempdir.o b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/unix/tempdir.o new file mode 100644 index 0000000000000000000000000000000000000000..93508b128d2ad63e53340aa84c444a48a0bd661f GIT binary patch literal 13528 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/win32/dir.c b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/win32/dir.c new file mode 100644 index 00000000..29a4e1c4 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/win32/dir.c @@ -0,0 +1,393 @@ +/* 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. + */ + +#include "apr.h" +#include "apr_arch_file_io.h" +#include "apr_file_io.h" +#include "apr_strings.h" +#include "apr_portable.h" +#include "apr_arch_atime.h" + +#if APR_HAVE_ERRNO_H +#include +#endif +#if APR_HAVE_STRING_H +#include +#endif +#if APR_HAVE_DIRENT_H +#include +#endif +#ifdef HAVE_SYS_STAT_H +#include +#endif + + +static apr_status_t dir_cleanup(void *thedir) +{ + apr_dir_t *dir = thedir; + if (dir->dirhand != INVALID_HANDLE_VALUE && !FindClose(dir->dirhand)) { + return apr_get_os_error(); + } + dir->dirhand = INVALID_HANDLE_VALUE; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_dir_open(apr_dir_t **new, const char *dirname, + apr_pool_t *pool) +{ + apr_status_t rv; + + int len = strlen(dirname); + (*new) = apr_pcalloc(pool, sizeof(apr_dir_t)); + /* Leave room here to add and pop the '*' wildcard for FindFirstFile + * and double-null terminate so we have one character to change. + */ + (*new)->dirname = apr_palloc(pool, len + 3); + memcpy((*new)->dirname, dirname, len); + if (len && (*new)->dirname[len - 1] != '/') { + (*new)->dirname[len++] = '/'; + } + (*new)->dirname[len++] = '\0'; + (*new)->dirname[len] = '\0'; + +#if APR_HAS_UNICODE_FS + IF_WIN_OS_IS_UNICODE + { + /* Create a buffer for the longest file name we will ever see + */ + (*new)->w.entry = apr_pcalloc(pool, sizeof(WIN32_FIND_DATAW)); + (*new)->name = apr_pcalloc(pool, APR_FILE_MAX * 3 + 1); + } +#endif +#if APR_HAS_ANSI_FS + ELSE_WIN_OS_IS_ANSI + { + /* Note that we won't open a directory that is greater than MAX_PATH, + * including the trailing /* wildcard suffix. If a * won't fit, then + * neither will any other file name within the directory. + * The length not including the trailing '*' is stored as rootlen, to + * skip over all paths which are too long. + */ + if (len >= APR_PATH_MAX) { + (*new) = NULL; + return APR_ENAMETOOLONG; + } + (*new)->n.entry = apr_pcalloc(pool, sizeof(WIN32_FIND_DATAW)); + } +#endif + (*new)->rootlen = len - 1; + (*new)->pool = pool; + (*new)->dirhand = INVALID_HANDLE_VALUE; + apr_pool_cleanup_register((*new)->pool, (void *)(*new), dir_cleanup, + apr_pool_cleanup_null); + + rv = apr_dir_read(NULL, 0, *new); + if (rv != APR_SUCCESS) { + dir_cleanup(*new); + *new = NULL; + } + + return rv; +} + +APR_DECLARE(apr_status_t) apr_dir_close(apr_dir_t *dir) +{ + apr_pool_cleanup_kill(dir->pool, dir, dir_cleanup); + return dir_cleanup(dir); +} + +APR_DECLARE(apr_status_t) apr_dir_read(apr_finfo_t *finfo, apr_int32_t wanted, + apr_dir_t *thedir) +{ + apr_status_t rv; + char *fname; + /* The while loops below allow us to skip all invalid file names, so that + * we aren't reporting any files where their absolute paths are too long. + */ +#if APR_HAS_UNICODE_FS + apr_wchar_t wdirname[APR_PATH_MAX]; + apr_wchar_t *eos = NULL; + IF_WIN_OS_IS_UNICODE + { + /* This code path is always be invoked by apr_dir_open or + * apr_dir_rewind, so return without filling out the finfo. + */ + if (thedir->dirhand == INVALID_HANDLE_VALUE) + { + apr_status_t rv; + if (rv = utf8_to_unicode_path(wdirname, sizeof(wdirname) + / sizeof(apr_wchar_t), + thedir->dirname)) { + return rv; + } + eos = wcschr(wdirname, '\0'); + eos[0] = '*'; + eos[1] = '\0'; + thedir->dirhand = FindFirstFileW(wdirname, thedir->w.entry); + eos[0] = '\0'; + if (thedir->dirhand == INVALID_HANDLE_VALUE) { + return apr_get_os_error(); + } + thedir->bof = 1; + return APR_SUCCESS; + } + else if (thedir->bof) { + /* Noop - we already called FindFirstFileW from + * either apr_dir_open or apr_dir_rewind ... use + * that first record. + */ + thedir->bof = 0; + } + else if (!FindNextFileW(thedir->dirhand, thedir->w.entry)) { + return apr_get_os_error(); + } + + while (thedir->rootlen && + thedir->rootlen + wcslen(thedir->w.entry->cFileName) >= APR_PATH_MAX) + { + if (!FindNextFileW(thedir->dirhand, thedir->w.entry)) { + return apr_get_os_error(); + } + } + if (rv = unicode_to_utf8_path(thedir->name, APR_FILE_MAX * 3 + 1, + thedir->w.entry->cFileName)) + return rv; + fname = thedir->name; + } +#endif +#if APR_HAS_ANSI_FS + ELSE_WIN_OS_IS_ANSI + { + /* This code path is always be invoked by apr_dir_open or + * apr_dir_rewind, so return without filling out the finfo. + */ + if (thedir->dirhand == INVALID_HANDLE_VALUE) { + /* '/' terminated, so add the '*' and pop it when we finish */ + char *eop = strchr(thedir->dirname, '\0'); + eop[0] = '*'; + eop[1] = '\0'; + thedir->dirhand = FindFirstFileA(thedir->dirname, + thedir->n.entry); + eop[0] = '\0'; + if (thedir->dirhand == INVALID_HANDLE_VALUE) { + return apr_get_os_error(); + } + thedir->bof = 1; + return APR_SUCCESS; + } + else if (thedir->bof) { + /* Noop - we already called FindFirstFileW from + * either apr_dir_open or apr_dir_rewind ... use + * that first record. + */ + thedir->bof = 0; + } + else if (!FindNextFileA(thedir->dirhand, thedir->n.entry)) { + return apr_get_os_error(); + } + while (thedir->rootlen && + thedir->rootlen + strlen(thedir->n.entry->cFileName) >= MAX_PATH) + { + if (!FindNextFileA(thedir->dirhand, thedir->n.entry)) { + return apr_get_os_error(); + } + } + fname = thedir->n.entry->cFileName; + } +#endif + + fillin_fileinfo(finfo, (WIN32_FILE_ATTRIBUTE_DATA *) thedir->w.entry, + 0, wanted); + finfo->pool = thedir->pool; + + finfo->valid |= APR_FINFO_NAME; + finfo->name = fname; + + if (wanted &= ~finfo->valid) { + /* Go back and get more_info if we can't answer the whole inquiry + */ +#if APR_HAS_UNICODE_FS + IF_WIN_OS_IS_UNICODE + { + /* Almost all our work is done. Tack on the wide file name + * to the end of the wdirname (already / delimited) + */ + if (!eos) + eos = wcschr(wdirname, '\0'); + wcscpy(eos, thedir->w.entry->cFileName); + rv = more_finfo(finfo, wdirname, wanted, MORE_OF_WFSPEC); + eos[0] = '\0'; + return rv; + } +#endif +#if APR_HAS_ANSI_FS + ELSE_WIN_OS_IS_ANSI + { +#if APR_HAS_UNICODE_FS + /* Don't waste stack space on a second buffer, the one we set + * aside for the wide directory name is twice what we need. + */ + char *fspec = (char*)wdirname; +#else + char fspec[APR_PATH_MAX]; +#endif + int dirlen = strlen(thedir->dirname); + if (dirlen >= sizeof(fspec)) + dirlen = sizeof(fspec) - 1; + apr_cpystrn(fspec, thedir->dirname, sizeof(fspec)); + apr_cpystrn(fspec + dirlen, fname, sizeof(fspec) - dirlen); + return more_finfo(finfo, fspec, wanted, MORE_OF_FSPEC); + } +#endif + } + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_dir_rewind(apr_dir_t *dir) +{ + apr_status_t rv; + + /* this will mark the handle as invalid and we'll open it + * again if apr_dir_read() is subsequently called + */ + rv = dir_cleanup(dir); + + if (rv == APR_SUCCESS) + rv = apr_dir_read(NULL, 0, dir); + + return rv; +} + +APR_DECLARE(apr_status_t) apr_dir_make(const char *path, apr_fileperms_t perm, + apr_pool_t *pool) +{ +#if APR_HAS_UNICODE_FS + IF_WIN_OS_IS_UNICODE + { + apr_wchar_t wpath[APR_PATH_MAX]; + apr_status_t rv; + if (rv = utf8_to_unicode_path(wpath, sizeof(wpath) + / sizeof(apr_wchar_t), path)) { + return rv; + } + if (!CreateDirectoryW(wpath, NULL)) { + return apr_get_os_error(); + } + } +#endif +#if APR_HAS_ANSI_FS + ELSE_WIN_OS_IS_ANSI + if (!CreateDirectory(path, NULL)) { + return apr_get_os_error(); + } +#endif + return APR_SUCCESS; +} + + +static apr_status_t dir_make_parent(char *path, + apr_fileperms_t perm, + apr_pool_t *pool) +{ + apr_status_t rv; + char *ch = strrchr(path, '\\'); + if (!ch) { + return APR_ENOENT; + } + + *ch = '\0'; + rv = apr_dir_make (path, perm, pool); /* Try to make straight off */ + + if (APR_STATUS_IS_ENOENT(rv)) { /* Missing an intermediate dir */ + rv = dir_make_parent(path, perm, pool); + + if (rv == APR_SUCCESS) { + rv = apr_dir_make (path, perm, pool); /* And complete the path */ + } + } + + *ch = '\\'; /* Always replace the slash before returning */ + return rv; +} + +APR_DECLARE(apr_status_t) apr_dir_make_recursive(const char *path, + apr_fileperms_t perm, + apr_pool_t *pool) +{ + apr_status_t rv = 0; + + rv = apr_dir_make (path, perm, pool); /* Try to make PATH right out */ + + if (APR_STATUS_IS_EEXIST(rv)) /* It's OK if PATH exists */ + return APR_SUCCESS; + + if (APR_STATUS_IS_ENOENT(rv)) { /* Missing an intermediate dir */ + char *dir; + + rv = apr_filepath_merge(&dir, "", path, APR_FILEPATH_NATIVE, pool); + + if (rv == APR_SUCCESS) + rv = dir_make_parent(dir, perm, pool); /* Make intermediate dirs */ + + if (rv == APR_SUCCESS) + rv = apr_dir_make (dir, perm, pool); /* And complete the path */ + } + return rv; +} + + +APR_DECLARE(apr_status_t) apr_dir_remove(const char *path, apr_pool_t *pool) +{ +#if APR_HAS_UNICODE_FS + IF_WIN_OS_IS_UNICODE + { + apr_wchar_t wpath[APR_PATH_MAX]; + apr_status_t rv; + if (rv = utf8_to_unicode_path(wpath, sizeof(wpath) + / sizeof(apr_wchar_t), path)) { + return rv; + } + if (!RemoveDirectoryW(wpath)) { + return apr_get_os_error(); + } + } +#endif +#if APR_HAS_ANSI_FS + ELSE_WIN_OS_IS_ANSI + if (!RemoveDirectory(path)) { + return apr_get_os_error(); + } +#endif + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_os_dir_get(apr_os_dir_t **thedir, + apr_dir_t *dir) +{ + if (dir == NULL) { + return APR_ENODIR; + } + *thedir = dir->dirhand; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_os_dir_put(apr_dir_t **dir, + apr_os_dir_t *thedir, + apr_pool_t *pool) +{ + return APR_ENOTIMPL; +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/win32/filedup.c b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/win32/filedup.c new file mode 100644 index 00000000..8aaf6df2 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/win32/filedup.c @@ -0,0 +1,216 @@ +/* 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. + */ + +#include "win32/apr_arch_file_io.h" +#include "apr_file_io.h" +#include "apr_general.h" +#include "apr_strings.h" +#include +#include "apr_arch_inherit.h" +#include /* for [_open/_get]_osfhandle */ + + +APR_DECLARE(apr_status_t) apr_file_dup(apr_file_t **new_file, + apr_file_t *old_file, apr_pool_t *p) +{ +#ifdef _WIN32_WCE + return APR_ENOTIMPL; +#else + HANDLE hproc = GetCurrentProcess(); + HANDLE newhand = NULL; + + if (!DuplicateHandle(hproc, old_file->filehand, + hproc, &newhand, 0, FALSE, + DUPLICATE_SAME_ACCESS)) { + return apr_get_os_error(); + } + + (*new_file) = (apr_file_t *) apr_pcalloc(p, sizeof(apr_file_t)); + (*new_file)->filehand = newhand; + (*new_file)->flags = old_file->flags & ~(APR_STD_FLAGS | APR_INHERIT); + (*new_file)->pool = p; + (*new_file)->fname = apr_pstrdup(p, old_file->fname); + (*new_file)->append = old_file->append; + (*new_file)->buffered = FALSE; + (*new_file)->ungetchar = old_file->ungetchar; + +#if APR_HAS_THREADS + if (old_file->mutex) { + apr_thread_mutex_create(&((*new_file)->mutex), + APR_THREAD_MUTEX_DEFAULT, p); + } +#endif + + apr_pool_cleanup_register((*new_file)->pool, (void *)(*new_file), file_cleanup, + apr_pool_cleanup_null); + + return APR_SUCCESS; +#endif /* !defined(_WIN32_WCE) */ +} + +APR_DECLARE(apr_status_t) apr_file_dup2(apr_file_t *new_file, + apr_file_t *old_file, apr_pool_t *p) +{ +#ifdef _WIN32_WCE + return APR_ENOTIMPL; +#else + DWORD stdhandle = 0; + HANDLE hproc = GetCurrentProcess(); + HANDLE newhand = NULL; + apr_int32_t newflags; + int fd; + + if (new_file->flags & APR_STD_FLAGS) + { + if ((new_file->flags & APR_STD_FLAGS) == APR_STDERR_FLAG) + { + /* Flush stderr and unset its buffer, then commit the fd-based buffer. + * This is typically a noop for Win2K/XP since services with NULL std + * handles [but valid FILE *'s, oddly enough], but is required + * for NT 4.0 and to use this code outside of services. + */ + fflush(stderr); + setvbuf(stderr, NULL, _IONBF, 0); + _commit(2 /* stderr */); + + /* Clone a handle can _close() without harming the source handle, + * open an MSVCRT-based pseudo-fd for the file handle, then dup2 + * and close our temporary pseudo-fd once it's been duplicated. + * This will incidently keep the FILE-based stderr in sync. + * Note the apparently redundant _O_BINARY coersions are required. + * Note the _dup2 will close the previous std Win32 handle. + */ + if (!DuplicateHandle(hproc, old_file->filehand, hproc, &newhand, + 0, FALSE, DUPLICATE_SAME_ACCESS)) { + return apr_get_os_error(); + } + fd = _open_osfhandle((INT_PTR)newhand, _O_WRONLY | _O_BINARY); + _dup2(fd, 2); + _close(fd); + _setmode(2, _O_BINARY); + + /* hPipeWrite was _close()'ed above, and _dup2()'ed + * to fd 2 creating a new, inherited Win32 handle. + * Recover that real handle from fd 2. Note that + * SetStdHandle(STD_ERROR_HANDLE, _get_osfhandle(2)) + * is implicit in the dup2() call above + */ + newhand = (HANDLE)_get_osfhandle(2); + } + else if ((new_file->flags & APR_STD_FLAGS) == APR_STDOUT_FLAG) { + /* For the process flow see the stderr case above */ + fflush(stdout); + setvbuf(stdout, NULL, _IONBF, 0); + _commit(1 /* stdout */); + + if (!DuplicateHandle(hproc, old_file->filehand, hproc, &newhand, + 0, FALSE, DUPLICATE_SAME_ACCESS)) { + return apr_get_os_error(); + } + fd = _open_osfhandle((INT_PTR)newhand, _O_WRONLY | _O_BINARY); + _dup2(fd, 1); + _close(fd); + _setmode(1, _O_BINARY); + newhand = (HANDLE)_get_osfhandle(1); + } + else if ((new_file->flags & APR_STD_FLAGS) == APR_STDIN_FLAG) { + /* For the process flow see the stderr case above */ + fflush(stdin); + setvbuf(stdin, NULL, _IONBF, 0); + _commit(0 /* stdin */); + + if (!DuplicateHandle(hproc, old_file->filehand, hproc, &newhand, + 0, FALSE, DUPLICATE_SAME_ACCESS)) { + return apr_get_os_error(); + } + fd = _open_osfhandle((INT_PTR)newhand, _O_RDONLY | _O_BINARY); + _dup2(fd, 0); + _close(fd); + _setmode(0, _O_BINARY); + newhand = (HANDLE)_get_osfhandle(0); + } + newflags = (new_file->flags & APR_STD_FLAGS) + | (old_file->flags & ~APR_STD_FLAGS) | APR_INHERIT; + + /* No need to close the old file, _dup2() above did that for us */ + } + else { + if (!DuplicateHandle(hproc, old_file->filehand, + hproc, &newhand, 0, + FALSE, DUPLICATE_SAME_ACCESS)) { + return apr_get_os_error(); + } + newflags = old_file->flags & ~(APR_STD_FLAGS | APR_INHERIT); + + if (new_file->filehand + && (new_file->filehand != INVALID_HANDLE_VALUE)) { + CloseHandle(new_file->filehand); + } + } + + new_file->flags = newflags; + new_file->filehand = newhand; + new_file->fname = apr_pstrdup(new_file->pool, old_file->fname); + new_file->append = old_file->append; + new_file->buffered = FALSE; + new_file->ungetchar = old_file->ungetchar; + +#if APR_HAS_THREADS + if (old_file->mutex) { + apr_thread_mutex_create(&(new_file->mutex), + APR_THREAD_MUTEX_DEFAULT, p); + } +#endif + + return APR_SUCCESS; +#endif /* !defined(_WIN32_WCE) */ +} + +APR_DECLARE(apr_status_t) apr_file_setaside(apr_file_t **new_file, + apr_file_t *old_file, + apr_pool_t *p) +{ + *new_file = (apr_file_t *)apr_palloc(p, sizeof(apr_file_t)); + memcpy(*new_file, old_file, sizeof(apr_file_t)); + (*new_file)->pool = p; + if (old_file->buffered) { + (*new_file)->buffer = apr_palloc(p, APR_FILE_BUFSIZE); + if (old_file->direction == 1) { + memcpy((*new_file)->buffer, old_file->buffer, old_file->bufpos); + } + else { + memcpy((*new_file)->buffer, old_file->buffer, old_file->dataRead); + } + } + if (old_file->mutex) { + apr_thread_mutex_create(&((*new_file)->mutex), + APR_THREAD_MUTEX_DEFAULT, p); + apr_thread_mutex_destroy(old_file->mutex); + } + if (old_file->fname) { + (*new_file)->fname = apr_pstrdup(p, old_file->fname); + } + if (!(old_file->flags & APR_FILE_NOCLEANUP)) { + apr_pool_cleanup_register(p, (void *)(*new_file), + file_cleanup, + file_cleanup); + } + + old_file->filehand = INVALID_HANDLE_VALUE; + apr_pool_cleanup_kill(old_file->pool, (void *)old_file, + file_cleanup); + return APR_SUCCESS; +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/win32/filepath.c b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/win32/filepath.c new file mode 100644 index 00000000..f3c1b77b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/win32/filepath.c @@ -0,0 +1,985 @@ +/* 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. + */ + +#include "apr.h" +#include "apr_private.h" +#include "apr_arch_file_io.h" +#include "apr_strings.h" +#include "apr_lib.h" +#include +#include + +#ifdef NETWARE +#include +#include +#endif + + /* WinNT accepts several odd forms of a 'root' path. Under Unicode + * calls (ApiFunctionW) the //?/C:/foo or //?/UNC/mach/share/foo forms + * are accepted. Ansi and Unicode functions both accept the //./C:/foo + * form under WinNT/2K. Since these forms are handled in the utf-8 to + * unicode translation phase, we don't want the user confused by them, so + * we will accept them but always return the canonical C:/ or //mach/share/ + * + * OS2 appears immune from the nonsense :) + */ + +APR_DECLARE(apr_status_t) apr_filepath_root(const char **rootpath, + const char **inpath, + apr_int32_t flags, + apr_pool_t *p) +{ + const char *testpath = *inpath; + char *newpath; +#ifdef NETWARE + char seperator[2] = { 0, 0}; + char server[APR_PATH_MAX+1]; + char volume[APR_PATH_MAX+1]; + char file[APR_PATH_MAX+1]; + char *volsep = NULL; + int elements; + + if (inpath && *inpath) + volsep = strchr (*inpath, ':'); + else + return APR_EBADPATH; + + if (strlen(*inpath) > APR_PATH_MAX) { + return APR_EBADPATH; + } + + seperator[0] = (flags & APR_FILEPATH_NATIVE) ? '\\' : '/'; + + /* Allocate and initialize each of the segment buffers + */ + server[0] = volume[0] = file[0] = '\0'; + + /* If we don't have a volume separator then don't bother deconstructing + the path since we won't use the deconstructed information anyway. + */ + if (volsep) { + /* Split the inpath into its separate parts. */ + deconstruct(testpath, server, volume, NULL, file, NULL, &elements, PATH_UNDEF); + + /* If we got a volume part then continue splitting out the root. + Otherwise we either have an incomplete or relative path + */ + if (volume && strlen(volume) > 0) { + newpath = apr_pcalloc(p, strlen(server)+strlen(volume)+5); + construct(newpath, server, volume, NULL, NULL, NULL, PATH_NETWARE); + + /* NetWare doesn't add the root slash so we need to add it manually. + */ + strcat(newpath, seperator); + *rootpath = newpath; + + /* Skip the inpath pointer down to the first non-root character + */ + newpath = volsep; + do { + ++newpath; + } while (*newpath && ((*newpath == '/') || (*newpath == '\\'))); + *inpath = newpath; + + /* Need to handle APR_FILEPATH_TRUENAME checking here. */ + + return APR_SUCCESS; + } + else + return APR_EBADPATH; + } + else if ((**inpath == '/') || (**inpath == '\\')) { + /* if we have a root path without a volume then just split + in same manner as unix although this path will be + incomplete. + */ + *rootpath = apr_pstrdup(p, seperator); + do { + ++(*inpath); + } while ((**inpath == '/') || (**inpath == '\\')); + } + else + return APR_ERELATIVE; + + return APR_EINCOMPLETE; + +#else /* ndef(NETWARE) */ + + char seperator[2]; + const char *delim1; + const char *delim2; + + seperator[0] = (flags & APR_FILEPATH_NATIVE) ? '\\' : '/'; + seperator[1] = 0; + + if (testpath[0] == '/' || testpath[0] == '\\') { + if (testpath[1] == '/' || testpath[1] == '\\') { + +#ifdef WIN32 /* //server/share isn't the only // delimited syntax */ + if ((testpath[2] == '?' || testpath[2] == '.') + && (testpath[3] == '/' || testpath[3] == '\\')) { + if (IS_FNCHAR(testpath[4]) && testpath[5] == ':') + { + apr_status_t rv; + testpath += 4; + /* given '//?/C: or //./C: let us try this + * all over again from the drive designator + */ + rv = apr_filepath_root(rootpath, &testpath, flags, p); + if (!rv || rv == APR_EINCOMPLETE) + *inpath = testpath; + return rv; + } + else if (strncasecmp(testpath + 4, "UNC", 3) == 0 + && (testpath[7] == '/' || testpath[7] == '\\') + && (testpath[2] == '?')) { + /* given '//?/UNC/machine/share, a little magic + * at the end makes this all work out by using + * 'C/machine' as the starting point and replacing + * the UNC delimiters with \'s, including the 'C' + */ + testpath += 6; + } + else + /* This must not be a path to a file, but rather + * a volume or device. Die for now. + */ + return APR_EBADPATH; + } +#endif /* WIN32 (non - //server/share syntax) */ + + /* Evaluate path of '//[machine/[share[/]]]' */ + delim1 = testpath + 2; + do { + /* Protect against //X/ where X is illegal */ + if (*delim1 && !IS_FNCHAR(*(delim1++))) + return APR_EBADPATH; + } while (*delim1 && *delim1 != '/' && *delim1 != '\\'); + + if (*delim1) { + apr_status_t rv; + delim2 = delim1 + 1; + while (*delim2 && *delim2 != '/' && *delim2 != '\\') { + /* Protect against //machine/X/ where X is illegal */ + if (!IS_FNCHAR(*(delim2++))) + return APR_EBADPATH; + } + + /* Copy the '//machine/[share[/]]' path, always providing + * an extra byte for the trailing slash. + */ + newpath = apr_pstrmemdup(p, testpath, delim2 - testpath + 1); + + if (delim2 == delim1 + 1) { + /* We found simply \\machine\, so give up already + */ + *rootpath = newpath; + *inpath = delim2; + return APR_EINCOMPLETE; + } + + if (flags & APR_FILEPATH_TRUENAME) { + /* Validate the \\Machine\Share\ designation, + * Win32 will argue about slashed in UNC paths, + * so use backslashes till we finish testing, + * and add the trailing backslash [required]. + * apr_pstrmemdup above guarentees us the new + * trailing null character. + */ + newpath[0] = '\\'; + newpath[1] = '\\'; + newpath[delim1 - testpath] = '\\'; + newpath[delim2 - testpath] = '\\'; + + rv = filepath_root_test(newpath, p); + if (rv) + return rv; + rv = filepath_root_case(&newpath, newpath, p); + if (rv) + return rv; + newpath[0] = seperator[0]; + newpath[1] = seperator[0]; + newpath[delim1 - testpath] = seperator[0]; + newpath[delim2 - testpath] = (*delim2 ? seperator[0] : '\0'); + } + else { + /* Give back the caller's own choice of delimiters + */ + newpath[0] = testpath[0]; + newpath[1] = testpath[1]; + newpath[delim1 - testpath] = *delim1; + newpath[delim2 - testpath] = *delim2; + } + + /* If this root included the trailing / or \ designation + * then lop off multiple trailing slashes and give back + * appropriate delimiters. + */ + if (*delim2) { + *inpath = delim2 + 1; + while (**inpath == '/' || **inpath == '\\') + ++*inpath; + } + else { + *inpath = delim2; + } + + *rootpath = newpath; + return APR_SUCCESS; + } + + /* Have path of '\\[machine]', if the machine is given, + * append same trailing slash as the leading slash + */ + delim1 = strchr(testpath, '\0'); + if (delim1 > testpath + 2) { + newpath = apr_pstrndup(p, testpath, delim1 - testpath + 1); + if (flags & APR_FILEPATH_TRUENAME) + newpath[delim1 - testpath] = seperator[0]; + else + newpath[delim1 - testpath] = newpath[0]; + newpath[delim1 - testpath + 1] = '\0'; + } + else { + newpath = apr_pstrndup(p, testpath, delim1 - testpath); + } + if (flags & APR_FILEPATH_TRUENAME) { + newpath[0] = seperator[0]; + newpath[1] = seperator[0]; + } + *rootpath = newpath; + *inpath = delim1; + return APR_EINCOMPLETE; + } + + /* Left with a path of '/', what drive are we asking about? + */ + *inpath = testpath + 1; + newpath = apr_palloc(p, 2); + if (flags & APR_FILEPATH_TRUENAME) + newpath[0] = seperator[0]; + else + newpath[0] = testpath[0]; + newpath[1] = '\0'; + *rootpath = newpath; + return APR_EINCOMPLETE; + } + + /* Evaluate path of 'd:[/]' */ + if (IS_FNCHAR(*testpath) && testpath[1] == ':') + { + apr_status_t rv; + /* Validate that D:\ drive exists, test must be rooted + * Note that posix/win32 insists a drive letter is upper case, + * so who are we to argue with a 'feature'. + * It is a safe fold, since only A-Z is legal, and has no + * side effects of legal mis-mapped non-us-ascii codes. + */ + newpath = apr_palloc(p, 4); + newpath[0] = testpath[0]; + newpath[1] = testpath[1]; + newpath[2] = seperator[0]; + newpath[3] = '\0'; + if (flags & APR_FILEPATH_TRUENAME) { + newpath[0] = apr_toupper(newpath[0]); + rv = filepath_root_test(newpath, p); + if (rv) + return rv; + } + /* Just give back the root the user handed to us. + */ + if (testpath[2] != '/' && testpath[2] != '\\') { + newpath[2] = '\0'; + *rootpath = newpath; + *inpath = testpath + 2; + return APR_EINCOMPLETE; + } + + /* strip off remaining slashes that designate the root, + * give the caller back their original choice of slash + * unless this is TRUENAME'ed + */ + *inpath = testpath + 3; + while (**inpath == '/' || **inpath == '\\') + ++*inpath; + if (!(flags & APR_FILEPATH_TRUENAME)) + newpath[2] = testpath[2]; + *rootpath = newpath; + return APR_SUCCESS; + } + + /* Nothing interesting */ + return APR_ERELATIVE; + +#endif /* ndef(NETWARE) */ +} + + +APR_DECLARE(apr_status_t) apr_filepath_merge(char **newpath, + const char *basepath, + const char *addpath, + apr_int32_t flags, + apr_pool_t *p) +{ + char path[APR_PATH_MAX]; /* isn't null term */ + const char *baseroot = NULL; + const char *addroot; + apr_size_t rootlen; /* the length of the root portion of path, d:/ is 3 */ + apr_size_t baselen; /* the length of basepath (excluding baseroot) */ + apr_size_t keptlen; /* the length of the retained basepath (incl root) */ + apr_size_t pathlen; /* the length of the result path */ + apr_size_t segend; /* the end of the current segment */ + apr_size_t seglen; /* the length of the segment (excl trailing chars) */ + apr_status_t basetype = 0; /* from parsing the basepath's baseroot */ + apr_status_t addtype; /* from parsing the addpath's addroot */ + apr_status_t rv; +#ifndef NETWARE + int fixunc = 0; /* flag to complete an incomplete UNC basepath */ +#endif + + /* Treat null as an empty path, otherwise split addroot from the addpath + */ + if (!addpath) { + addpath = addroot = ""; + addtype = APR_ERELATIVE; + } + else { + /* This call _should_ test the path + */ + addtype = apr_filepath_root(&addroot, &addpath, + APR_FILEPATH_TRUENAME + | (flags & APR_FILEPATH_NATIVE), + p); + if (addtype == APR_SUCCESS) { + addtype = APR_EABSOLUTE; + } + else if (addtype == APR_ERELATIVE) { + addroot = ""; + } + else if (addtype != APR_EINCOMPLETE) { + /* apr_filepath_root was incomprehensible so fail already + */ + return addtype; + } + } + + /* If addpath is (even partially) rooted, then basepath is + * unused. Ths violates any APR_FILEPATH_SECUREROOTTEST + * and APR_FILEPATH_NOTABSOLUTE flags specified. + */ + if (addtype == APR_EABSOLUTE || addtype == APR_EINCOMPLETE) + { + if (flags & APR_FILEPATH_SECUREROOTTEST) + return APR_EABOVEROOT; + if (flags & APR_FILEPATH_NOTABSOLUTE) + return addtype; + } + + /* Optimized tests before we query the current working path + */ + if (!basepath) { + + /* If APR_FILEPATH_NOTABOVEROOT wasn't specified, + * we won't test the root again, it's ignored. + * Waste no CPU retrieving the working path. + */ + if (addtype == APR_EABSOLUTE && !(flags & APR_FILEPATH_NOTABOVEROOT)) { + basepath = baseroot = ""; + basetype = APR_ERELATIVE; + } + + /* If APR_FILEPATH_NOTABSOLUTE is specified, the caller + * requires an absolutely relative result, So do not retrieve + * the working path. + */ + if (addtype == APR_ERELATIVE && (flags & APR_FILEPATH_NOTABSOLUTE)) { + basepath = baseroot = ""; + basetype = APR_ERELATIVE; + } + } + + if (!basepath) + { + /* Start with the current working path. This is bass akwards, + * but required since the compiler (at least vc) doesn't like + * passing the address of a char const* for a char** arg. + * We must grab the current path of the designated drive + * if addroot is given in drive-relative form (e.g. d:foo) + */ + char *getpath; +#ifndef NETWARE + if (addtype == APR_EINCOMPLETE && addroot[1] == ':') + rv = filepath_drive_get(&getpath, addroot[0], flags, p); + else +#endif + rv = apr_filepath_get(&getpath, flags, p); + if (rv != APR_SUCCESS) + return rv; + basepath = getpath; + } + + if (!baseroot) { + /* This call should _not_ test the path + */ + basetype = apr_filepath_root(&baseroot, &basepath, + (flags & APR_FILEPATH_NATIVE), p); + if (basetype == APR_SUCCESS) { + basetype = APR_EABSOLUTE; + } + else if (basetype == APR_ERELATIVE) { + baseroot = ""; + } + else if (basetype != APR_EINCOMPLETE) { + /* apr_filepath_root was incomprehensible so fail already + */ + return basetype; + } + } + baselen = strlen(basepath); + + /* If APR_FILEPATH_NOTABSOLUTE is specified, the caller + * requires an absolutely relative result. If the given + * basepath is not relative then fail. + */ + if ((flags & APR_FILEPATH_NOTABSOLUTE) && basetype != APR_ERELATIVE) + return basetype; + + /* The Win32 nightmare on unc street... start combining for + * many possible root combinations. + */ + if (addtype == APR_EABSOLUTE) + { + /* Ignore the given root path, and start with the addroot + */ + if ((flags & APR_FILEPATH_NOTABOVEROOT) + && strncmp(baseroot, addroot, strlen(baseroot))) + return APR_EABOVEROOT; + keptlen = 0; + rootlen = pathlen = strlen(addroot); + memcpy(path, addroot, pathlen); + } + else if (addtype == APR_EINCOMPLETE) + { + /* There are several types of incomplete paths, + * incomplete UNC paths (//foo/ or //), + * drives without rooted paths (d: as in d:foo), + * and simple roots (/ as in /foo). + * Deal with these in significantly different manners... + */ +#ifndef NETWARE + if ((addroot[0] == '/' || addroot[0] == '\\') && + (addroot[1] == '/' || addroot[1] == '\\')) + { + /* Ignore the given root path if the incomplete addpath is UNC, + * (note that the final result will be incomplete). + */ + if (flags & APR_FILEPATH_NOTRELATIVE) + return addtype; + if ((flags & APR_FILEPATH_NOTABOVEROOT) + && strncmp(baseroot, addroot, strlen(baseroot))) + return APR_EABOVEROOT; + fixunc = 1; + keptlen = 0; + rootlen = pathlen = strlen(addroot); + memcpy(path, addroot, pathlen); + } + else +#endif + if ((addroot[0] == '/' || addroot[0] == '\\') && !addroot[1]) + { + /* Bring together the drive or UNC root from the baseroot + * if the addpath is a simple root and basepath is rooted, + * otherwise disregard the basepath entirely. + */ + if (basetype != APR_EABSOLUTE && (flags & APR_FILEPATH_NOTRELATIVE)) + return basetype; + if (basetype != APR_ERELATIVE) { +#ifndef NETWARE + if (basetype == APR_INCOMPLETE + && (baseroot[0] == '/' || baseroot[0] == '\\') + && (baseroot[1] == '/' || baseroot[1] == '\\')) + fixunc = 1; +#endif + keptlen = rootlen = pathlen = strlen(baseroot); + memcpy(path, baseroot, pathlen); + } + else { + if (flags & APR_FILEPATH_NOTABOVEROOT) + return APR_EABOVEROOT; + keptlen = 0; + rootlen = pathlen = strlen(addroot); + memcpy(path, addroot, pathlen); + } + } +#ifdef NETWARE + else if (filepath_has_drive(addroot, DRIVE_ONLY, p)) + { + /* If the addroot is a drive (without a volume root) + * use the basepath _if_ it matches this drive letter! + * Otherwise we must discard the basepath. + */ + if (!filepath_compare_drive(addroot, baseroot, p) && + filepath_has_drive(baseroot, 0, p)) { +#else + else if (addroot[0] && addroot[1] == ':' && !addroot[2]) + { + /* If the addroot is a drive (without a volume root) + * use the basepath _if_ it matches this drive letter! + * Otherwise we must discard the basepath. + */ + if (addroot[0] == baseroot[0] && baseroot[1] == ':') { +#endif + /* Base the result path on the basepath + */ + if (basetype != APR_EABSOLUTE && (flags & APR_FILEPATH_NOTRELATIVE)) + return basetype; + rootlen = strlen(baseroot); + keptlen = pathlen = rootlen + baselen; + if (keptlen >= sizeof(path)) + return APR_ENAMETOOLONG; + memcpy(path, baseroot, rootlen); + memcpy(path + rootlen, basepath, baselen); + } + else { + if (flags & APR_FILEPATH_NOTRELATIVE) + return addtype; + if (flags & APR_FILEPATH_NOTABOVEROOT) + return APR_EABOVEROOT; + keptlen = 0; + rootlen = pathlen = strlen(addroot); + memcpy(path, addroot, pathlen); + } + } + else { + /* Now this is unexpected, we aren't aware of any other + * incomplete path forms! Fail now. + */ + return APR_EBADPATH; + } + } + else { /* addtype == APR_ERELATIVE */ + /* If both paths are relative, fail early + */ + if (basetype != APR_EABSOLUTE && (flags & APR_FILEPATH_NOTRELATIVE)) + return basetype; + +#ifndef NETWARE + /* An incomplete UNC path must be completed + */ + if (basetype == APR_INCOMPLETE + && (baseroot[0] == '/' || baseroot[0] == '\\') + && (baseroot[1] == '/' || baseroot[1] == '\\')) + fixunc = 1; +#endif + + /* Base the result path on the basepath + */ + rootlen = strlen(baseroot); + keptlen = pathlen = rootlen + baselen; + if (keptlen >= sizeof(path)) + return APR_ENAMETOOLONG; + memcpy(path, baseroot, rootlen); + memcpy(path + rootlen, basepath, baselen); + } + + /* '/' terminate the given root path unless it's already terminated + * or is an incomplete drive root. Correct the trailing slash unless + * we have an incomplete UNC path still to fix. + */ + if (pathlen && path[pathlen - 1] != ':') { + if (path[pathlen - 1] != '/' && path[pathlen - 1] != '\\') { + if (pathlen + 1 >= sizeof(path)) + return APR_ENAMETOOLONG; + + path[pathlen++] = ((flags & APR_FILEPATH_NATIVE) ? '\\' : '/'); + } + /* XXX: wrong, but gotta figure out what I intended; + * else if (!fixunc) + * path[pathlen++] = ((flags & APR_FILEPATH_NATIVE) ? '\\' : '/'); + */ + } + + while (*addpath) + { + /* Parse each segment, find the closing '/' + */ + seglen = 0; + while (addpath[seglen] && addpath[seglen] != '/' + && addpath[seglen] != '\\') + ++seglen; + + /* Truncate all trailing spaces and all but the first two dots */ + segend = seglen; + while (seglen && (addpath[seglen - 1] == ' ' + || addpath[seglen - 1] == '.')) { + if (seglen > 2 || addpath[seglen - 1] != '.' || addpath[0] != '.') + --seglen; + else + break; + } + + if (seglen == 0 || (seglen == 1 && addpath[0] == '.')) + { + /* NOTE: win32 _hates_ '/ /' and '/. /' (yes, with spaces in there) + * so eliminate all preconceptions that it is valid. + */ + if (seglen < segend) + return APR_EBADPATH; + +#ifndef NETWARE + /* This isn't legal unless the unc path is completed + */ + if (fixunc) + return APR_EBADPATH; +#endif + + /* Otherwise, this is a noop segment (/ or ./) so ignore it + */ + } + else if (seglen == 2 && addpath[0] == '.' && addpath[1] == '.') + { + /* NOTE: win32 _hates_ '/.. /' (yes, with a space in there) + * and '/..../', some functions treat it as ".", and some + * fail! Eliminate all preconceptions that they are valid. + */ + if (seglen < segend && (seglen != 3 || addpath[2] != '.')) + return APR_EBADPATH; + +#ifndef NETWARE + /* This isn't legal unless the unc path is completed + */ + if (fixunc) + return APR_EBADPATH; +#endif + + /* backpath (../) when an absolute path is given */ + if (rootlen && (pathlen <= rootlen)) + { + /* Attempt to move above root. Always die if the + * APR_FILEPATH_SECUREROOTTEST flag is specified. + */ + if (flags & APR_FILEPATH_SECUREROOTTEST) + return APR_EABOVEROOT; + + /* Otherwise this is simply a noop, above root is root. + */ + } + else if (pathlen == 0 + || (pathlen >= 3 + && (pathlen == 3 + || path[pathlen - 4] == ':' + || path[pathlen - 4] == '/' + || path[pathlen - 4] == '\\') + && path[pathlen - 3] == '.' + && path[pathlen - 2] == '.' + && (path[pathlen - 1] == '/' + || path[pathlen - 1] == '\\'))) + { + /* Verified path is empty, exactly "..[/\]", or ends + * in "[:/\]..[/\]" - these patterns we will not back + * over since they aren't 'prior segements'. + * + * If APR_FILEPATH_SECUREROOTTEST.was given, die now. + */ + if (flags & APR_FILEPATH_SECUREROOTTEST) + return APR_EABOVEROOT; + + /* Otherwise append another backpath. + */ + if (pathlen + 3 >= sizeof(path)) + return APR_ENAMETOOLONG; + path[pathlen++] = '.'; + path[pathlen++] = '.'; + if (addpath[segend]) { + path[pathlen++] = ((flags & APR_FILEPATH_NATIVE) + ? '\\' : ((flags & APR_FILEPATH_TRUENAME) + ? '/' : addpath[segend])); + } + /* The 'root' part of this path now includes the ../ path, + * because that backpath will not be parsed by the truename + * code below. + */ + keptlen = pathlen; + } + else + { + /* otherwise crop the prior segment + */ + do { + --pathlen; + } while (pathlen && path[pathlen - 1] != '/' + && path[pathlen - 1] != '\\'); + + /* Now test if we are above where we started and back up + * the keptlen offset to reflect the added/altered path. + */ + if (pathlen < keptlen) + { + if (flags & APR_FILEPATH_SECUREROOTTEST) + return APR_EABOVEROOT; + keptlen = pathlen; + } + } + } + else /* not empty or dots */ + { +#ifndef NETWARE + if (fixunc) { + const char *testpath = path; + const char *testroot; + apr_status_t testtype; + apr_size_t i = (addpath[segend] != '\0'); + + /* This isn't legal unless the unc path is complete! + */ + if (seglen < segend) + return APR_EBADPATH; + if (pathlen + seglen + 1 >= sizeof(path)) + return APR_ENAMETOOLONG; + memcpy(path + pathlen, addpath, seglen + i); + + /* Always add the trailing slash to a UNC segment + */ + path[pathlen + seglen] = ((flags & APR_FILEPATH_NATIVE) + ? '\\' : '/'); + pathlen += seglen + 1; + + /* Recanonicalize the UNC root with the new UNC segment, + * and if we succeed, reset this test and the rootlen, + * and replace our path with the canonical UNC root path + */ + path[pathlen] = '\0'; + /* This call _should_ test the path + */ + testtype = apr_filepath_root(&testroot, &testpath, + APR_FILEPATH_TRUENAME + | (flags & APR_FILEPATH_NATIVE), + p); + if (testtype == APR_SUCCESS) { + rootlen = pathlen = (testpath - path); + memcpy(path, testroot, pathlen); + fixunc = 0; + } + else if (testtype != APR_EINCOMPLETE) { + /* apr_filepath_root was very unexpected so fail already + */ + return testtype; + } + } + else +#endif + { + /* An actual segment, append it to the destination path + */ + apr_size_t i = (addpath[segend] != '\0'); + if (pathlen + seglen + i >= sizeof(path)) + return APR_ENAMETOOLONG; + memcpy(path + pathlen, addpath, seglen + i); + if (i) + path[pathlen + seglen] = ((flags & APR_FILEPATH_NATIVE) + ? '\\' : '/'); + pathlen += seglen + i; + } + } + + /* Skip over trailing slash to the next segment + */ + if (addpath[segend]) + ++segend; + + addpath += segend; + } + + /* keptlen will be the baselen unless the addpath contained + * backpath elements. If so, and APR_FILEPATH_NOTABOVEROOT + * is specified (APR_FILEPATH_SECUREROOTTEST was caught above), + * compare the string beyond the root to assure the result path + * is still within given basepath. Note that the root path + * segment is thoroughly tested prior to path parsing. + */ + if ((flags & APR_FILEPATH_NOTABOVEROOT) && baselen) { + if (memcmp(basepath, path + rootlen, baselen) != 0) + return APR_EABOVEROOT; + + /* Ahem... if we have a basepath without a trailing slash, + * we better be sure that /foo wasn't replaced with /foobar! + */ + if (basepath[baselen - 1] != '/' && basepath[baselen - 1] != '\\' + && path[rootlen + baselen] && path[rootlen + baselen] != '/' + && path[rootlen + baselen] != '\\') + return APR_EABOVEROOT; + } + + if (addpath && (flags & APR_FILEPATH_TRUENAME)) { + /* We can always skip the root, it's already true-named. */ + if (rootlen > keptlen) + keptlen = rootlen; + if ((path[keptlen] == '/') || (path[keptlen] == '\\')) { + /* By rights, keptlen may grown longer than pathlen. + * we wont' use it again (in that case) so we don't care. + */ + ++keptlen; + } + /* Go through all the new segments */ + while (keptlen < pathlen) { + apr_finfo_t finfo; + char saveslash = 0; + seglen = 0; + /* find any slash and set it aside for a minute. */ + for (seglen = 0; keptlen + seglen < pathlen; ++seglen) { + if ((path[keptlen + seglen] == '/') || + (path[keptlen + seglen] == '\\')) { + saveslash = path[keptlen + seglen]; + break; + } + } + /* Null term for stat! */ + path[keptlen + seglen] = '\0'; + if ((rv = apr_lstat(&finfo, path, + APR_FINFO_TYPE | APR_FINFO_NAME, p)) + == APR_SUCCESS) { + apr_size_t namelen = strlen(finfo.name); + +#if defined(OS2) /* only has case folding, never aliases that change the length */ + + if (memcmp(finfo.name, path + keptlen, seglen) != 0) { + memcpy(path + keptlen, finfo.name, namelen); + } +#else /* WIN32 || NETWARE; here there be aliases that gire and gimble and change length */ + + if ((namelen != seglen) || + (memcmp(finfo.name, path + keptlen, seglen) != 0)) + { + if (namelen <= seglen) { + memcpy(path + keptlen, finfo.name, namelen); + if ((namelen < seglen) && saveslash) { + memmove(path + keptlen + namelen + 1, + path + keptlen + seglen + 1, + pathlen - keptlen - seglen); + pathlen += namelen - seglen; + seglen = namelen; + } + } + else { /* namelen > seglen */ + if (pathlen + namelen - seglen >= sizeof(path)) + return APR_ENAMETOOLONG; + if (saveslash) { + memmove(path + keptlen + namelen + 1, + path + keptlen + seglen + 1, + pathlen - keptlen - seglen); + } + memcpy(path + keptlen, finfo.name, namelen); + pathlen += namelen - seglen; + seglen = namelen; + } + } +#endif /* !OS2 (Whatever that alias was we're over it) */ + + /* That's it, the rest is path info. + * I don't know how we aught to handle this. Should + * we define a new error to indicate 'more info'? + * Should we split out the rest of the path? + */ + if ((finfo.filetype != APR_DIR) && + (finfo.filetype != APR_LNK) && saveslash) + rv = APR_ENOTDIR; +#ifdef XXX_FIGURE_THIS_OUT + { + /* the example inserts a null between the end of + * the filename and the next segment, and increments + * the path length so we would return both segments. + */ + if (saveslash) { + keptlen += seglen; + path[keptlen] = saveslash; + if (pathlen + 1 >= sizeof(path)) + return APR_ENAMETOOLONG; + memmove(path + keptlen + 1, + path + keptlen, + pathlen - keptlen); + path[keptlen] = '\0'; + ++pathlen; + break; + } + } +#endif + } + + /* put back the '/' */ + if (saveslash) { + path[keptlen + seglen] = saveslash; + ++seglen; + } + keptlen += seglen; + + if (rv != APR_SUCCESS) { + if (APR_STATUS_IS_ENOENT(rv)) + break; + if (APR_STATUS_IS_EPATHWILD(rv)) + /* This path included wildcards. The path elements + * that did not contain wildcards are canonicalized, + * so we will return the path, although later elements + * don't necessarily exist, and aren't canonical. + */ + break; + else if (APR_STATUS_IS_ENOTDIR(rv)) + /* This is a little more serious, we just added a name + * onto a filename (think http's PATH_INFO) + * If the caller is foolish enough to do this, we expect + * the've already canonicalized the root) that they knew + * what they are doing :( + */ + break; + else + return rv; + } + } + } + + *newpath = apr_pmemdup(p, path, pathlen + 1); + (*newpath)[pathlen] = '\0'; + return APR_SUCCESS; +} + + +APR_DECLARE(apr_status_t) apr_filepath_list_split(apr_array_header_t **pathelts, + const char *liststr, + apr_pool_t *p) +{ + return apr_filepath_list_split_impl(pathelts, liststr, ';', p); +} + +APR_DECLARE(apr_status_t) apr_filepath_list_merge(char **liststr, + apr_array_header_t *pathelts, + apr_pool_t *p) +{ + return apr_filepath_list_merge_impl(liststr, pathelts, ';', p); +} + + +APR_DECLARE(apr_status_t) apr_filepath_encoding(int *style, apr_pool_t *p) +{ +#if APR_HAS_UNICODE_FS + IF_WIN_OS_IS_UNICODE + { + *style = APR_FILEPATH_ENCODING_UTF8; + return APR_SUCCESS; + } +#endif + + *style = APR_FILEPATH_ENCODING_LOCALE; + return APR_SUCCESS; +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/win32/filestat.c b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/win32/filestat.c new file mode 100644 index 00000000..041b78de --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/win32/filestat.c @@ -0,0 +1,767 @@ +/* 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. + */ + +#include "apr.h" +#include +#include "apr_private.h" +#include "apr_arch_file_io.h" +#include "apr_file_io.h" +#include "apr_general.h" +#include "apr_strings.h" +#include "apr_errno.h" +#include "apr_time.h" +#include +#include "apr_arch_atime.h" +#include "apr_arch_misc.h" + +/* We have to assure that the file name contains no '*'s, or other + * wildcards when using FindFirstFile to recover the true file name. + */ +static apr_status_t test_safe_name(const char *name) +{ + /* Only accept ':' in the second position of the filename, + * as the drive letter delimiter: + */ + if (apr_isalpha(*name) && (name[1] == ':')) { + name += 2; + } + while (*name) { + if (!IS_FNCHAR(*name) && (*name != '\\') && (*name != '/')) { + if (*name == '?' || *name == '*') + return APR_EPATHWILD; + else + return APR_EBADPATH; + } + ++name; + } + return APR_SUCCESS; +} + +static apr_status_t free_localheap(void *heap) { + LocalFree(heap); + return APR_SUCCESS; +} + +static apr_gid_t worldid = NULL; + +static void free_world(void) +{ + if (worldid) { + FreeSid(worldid); + worldid = NULL; + } +} + +/* Left bit shifts from World scope to given scope */ +typedef enum prot_scope_e { + prot_scope_world = 0, + prot_scope_group = 4, + prot_scope_user = 8 +} prot_scope_e; + +static apr_fileperms_t convert_prot(ACCESS_MASK acc, prot_scope_e scope) +{ + /* These choices are based on the single filesystem bit that controls + * the given behavior. They are -not- recommended for any set protection + * function, such a function should -set- use GENERIC_READ/WRITE/EXECUTE + */ + apr_fileperms_t prot = 0; + if (acc & FILE_EXECUTE) + prot |= APR_WEXECUTE; + if (acc & FILE_WRITE_DATA) + prot |= APR_WWRITE; + if (acc & FILE_READ_DATA) + prot |= APR_WREAD; + return (prot << scope); +} + +static void resolve_prot(apr_finfo_t *finfo, apr_int32_t wanted, PACL dacl) +{ + TRUSTEE_W ident = {NULL, NO_MULTIPLE_TRUSTEE, TRUSTEE_IS_SID}; + ACCESS_MASK acc; + /* + * This function is only invoked for WinNT, + * there is no reason for os_level testing here. + */ + if ((wanted & APR_FINFO_WPROT) && !worldid) { + SID_IDENTIFIER_AUTHORITY SIDAuth = SECURITY_WORLD_SID_AUTHORITY; + if (AllocateAndInitializeSid(&SIDAuth, 1, SECURITY_WORLD_RID, + 0, 0, 0, 0, 0, 0, 0, &worldid)) + atexit(free_world); + else + worldid = NULL; + } + if ((wanted & APR_FINFO_UPROT) && (finfo->valid & APR_FINFO_USER)) { + ident.TrusteeType = TRUSTEE_IS_USER; + ident.ptstrName = finfo->user; + /* GetEffectiveRightsFromAcl isn't supported under Win9x, + * which shouldn't come as a surprize. Since we are passing + * TRUSTEE_IS_SID, always skip the A->W layer. + */ + if (GetEffectiveRightsFromAclW(dacl, &ident, &acc) == ERROR_SUCCESS) { + finfo->protection |= convert_prot(acc, prot_scope_user); + finfo->valid |= APR_FINFO_UPROT; + } + } + /* Windows NT: did not return group rights. + * Windows 2000 returns group rights information. + * Since WinNT kernels don't follow the unix model of + * group associations, this all all pretty mute. + */ + if ((wanted & APR_FINFO_GPROT) && (finfo->valid & APR_FINFO_GROUP)) { + ident.TrusteeType = TRUSTEE_IS_GROUP; + ident.ptstrName = finfo->group; + if (GetEffectiveRightsFromAclW(dacl, &ident, &acc) == ERROR_SUCCESS) { + finfo->protection |= convert_prot(acc, prot_scope_group); + finfo->valid |= APR_FINFO_GPROT; + } + } + if ((wanted & APR_FINFO_WPROT) && (worldid)) { + ident.TrusteeType = TRUSTEE_IS_WELL_KNOWN_GROUP; + ident.ptstrName = worldid; + if (GetEffectiveRightsFromAclW(dacl, &ident, &acc) == ERROR_SUCCESS) { + finfo->protection |= convert_prot(acc, prot_scope_world); + finfo->valid |= APR_FINFO_WPROT; + } + } +} + +static apr_status_t resolve_ident(apr_finfo_t *finfo, const char *fname, + apr_int32_t wanted, apr_pool_t *pool) +{ + apr_file_t *thefile = NULL; + apr_status_t rv; + /* + * NT5 (W2K) only supports symlinks in the same manner as mount points. + * This code should eventually take that into account, for now treat + * every reparse point as a symlink... + * + * We must open the file with READ_CONTROL if we plan to retrieve the + * user, group or permissions. + */ + + if ((rv = apr_file_open(&thefile, fname, APR_OPENINFO + | ((wanted & APR_FINFO_LINK) ? APR_OPENLINK : 0) + | ((wanted & (APR_FINFO_PROT | APR_FINFO_OWNER)) + ? APR_READCONTROL : 0), + APR_OS_DEFAULT, pool)) == APR_SUCCESS) { + rv = apr_file_info_get(finfo, wanted, thefile); + finfo->filehand = NULL; + apr_file_close(thefile); + } + else if (APR_STATUS_IS_EACCES(rv) && (wanted & (APR_FINFO_PROT + | APR_FINFO_OWNER))) { + /* We have a backup plan. Perhaps we couldn't grab READ_CONTROL? + * proceed without asking for that permission... + */ + if ((rv = apr_file_open(&thefile, fname, APR_OPENINFO + | ((wanted & APR_FINFO_LINK) ? APR_OPENLINK : 0), + APR_OS_DEFAULT, pool)) == APR_SUCCESS) { + rv = apr_file_info_get(finfo, wanted & ~(APR_FINFO_PROT + | APR_FINFO_OWNER), + thefile); + finfo->filehand = NULL; + apr_file_close(thefile); + } + } + + if (rv != APR_SUCCESS && rv != APR_INCOMPLETE) + return (rv); + + /* We picked up this case above and had opened the link's properties */ + if (wanted & APR_FINFO_LINK) + finfo->valid |= APR_FINFO_LINK; + + return rv; +} + +static void guess_protection_bits(apr_finfo_t *finfo) +{ + /* Read, write execute for owner. In the Win9x environment, any + * readable file is executable (well, not entirely 100% true, but + * still looking for some cheap logic that would help us here.) + * The same holds on NT if a file doesn't have a DACL (e.g., on FAT) + */ + if (finfo->protection & APR_FREADONLY) { + finfo->protection |= APR_WREAD | APR_WEXECUTE; + } + else { + finfo->protection |= APR_WREAD | APR_WEXECUTE | APR_WWRITE; + } + finfo->protection |= (finfo->protection << prot_scope_group) + | (finfo->protection << prot_scope_user); + + finfo->valid |= APR_FINFO_UPROT | APR_FINFO_GPROT | APR_FINFO_WPROT; +} + +apr_status_t more_finfo(apr_finfo_t *finfo, const void *ufile, + apr_int32_t wanted, int whatfile) +{ + PSID user = NULL, grp = NULL; + PACL dacl = NULL; + apr_status_t rv; + + if (apr_os_level < APR_WIN_NT) + guess_protection_bits(finfo); + else if (wanted & (APR_FINFO_PROT | APR_FINFO_OWNER)) + { + /* On NT this request is incredibly expensive, but accurate. + * Since the WinNT-only functions below are protected by the + * (apr_os_level < APR_WIN_NT) case above, we need no extra + * tests, but remember GetNamedSecurityInfo & GetSecurityInfo + * are not supported on 9x. + */ + SECURITY_INFORMATION sinf = 0; + PSECURITY_DESCRIPTOR pdesc = NULL; + if (wanted & (APR_FINFO_USER | APR_FINFO_UPROT)) + sinf |= OWNER_SECURITY_INFORMATION; + if (wanted & (APR_FINFO_GROUP | APR_FINFO_GPROT)) + sinf |= GROUP_SECURITY_INFORMATION; + if (wanted & APR_FINFO_PROT) + sinf |= DACL_SECURITY_INFORMATION; + if (whatfile == MORE_OF_WFSPEC) { + apr_wchar_t *wfile = (apr_wchar_t*) ufile; + int fix = 0; + if (wcsncmp(wfile, L"\\\\?\\", 4) == 0) { + fix = 4; + if (wcsncmp(wfile + fix, L"UNC\\", 4) == 0) + wfile[6] = L'\\', fix = 6; + } + rv = GetNamedSecurityInfoW(wfile + fix, + SE_FILE_OBJECT, sinf, + ((wanted & (APR_FINFO_USER | APR_FINFO_UPROT)) ? &user : NULL), + ((wanted & (APR_FINFO_GROUP | APR_FINFO_GPROT)) ? &grp : NULL), + ((wanted & APR_FINFO_PROT) ? &dacl : NULL), + NULL, &pdesc); + if (fix == 6) + wfile[6] = L'C'; + } + else if (whatfile == MORE_OF_FSPEC) + rv = GetNamedSecurityInfoA((char*)ufile, + SE_FILE_OBJECT, sinf, + ((wanted & (APR_FINFO_USER | APR_FINFO_UPROT)) ? &user : NULL), + ((wanted & (APR_FINFO_GROUP | APR_FINFO_GPROT)) ? &grp : NULL), + ((wanted & APR_FINFO_PROT) ? &dacl : NULL), + NULL, &pdesc); + else if (whatfile == MORE_OF_HANDLE) + rv = GetSecurityInfo((HANDLE)ufile, + SE_FILE_OBJECT, sinf, + ((wanted & (APR_FINFO_USER | APR_FINFO_UPROT)) ? &user : NULL), + ((wanted & (APR_FINFO_GROUP | APR_FINFO_GPROT)) ? &grp : NULL), + ((wanted & APR_FINFO_PROT) ? &dacl : NULL), + NULL, &pdesc); + else + return APR_INCOMPLETE; + if (rv == ERROR_SUCCESS) + apr_pool_cleanup_register(finfo->pool, pdesc, free_localheap, + apr_pool_cleanup_null); + else + user = grp = dacl = NULL; + + if (user) { + finfo->user = user; + finfo->valid |= APR_FINFO_USER; + } + + if (grp) { + finfo->group = grp; + finfo->valid |= APR_FINFO_GROUP; + } + + if (dacl) { + /* Retrieved the discresionary access list */ + resolve_prot(finfo, wanted, dacl); + } + else if (wanted & APR_FINFO_PROT) + guess_protection_bits(finfo); + } + + return ((wanted & ~finfo->valid) ? APR_INCOMPLETE : APR_SUCCESS); +} + + +/* This generic fillin depends upon byhandle to be passed as 0 when + * a WIN32_FILE_ATTRIBUTE_DATA or either WIN32_FIND_DATA [A or W] is + * passed for wininfo. When the BY_HANDLE_FILE_INFORMATION structure + * is passed for wininfo, byhandle is passed as 1 to offset the one + * dword discrepancy in offset of the High/Low size structure members. + * + * The generic fillin returns 1 if the caller should further inquire + * if this is a CHR filetype. If it's reasonably certain it can't be, + * then the function returns 0. + */ +int fillin_fileinfo(apr_finfo_t *finfo, + WIN32_FILE_ATTRIBUTE_DATA *wininfo, + int byhandle, apr_int32_t wanted) +{ + DWORD *sizes = &wininfo->nFileSizeHigh + byhandle; + int warn = 0; + + memset(finfo, '\0', sizeof(*finfo)); + + FileTimeToAprTime(&finfo->atime, &wininfo->ftLastAccessTime); + FileTimeToAprTime(&finfo->ctime, &wininfo->ftCreationTime); + FileTimeToAprTime(&finfo->mtime, &wininfo->ftLastWriteTime); + +#if APR_HAS_LARGE_FILES + finfo->size = (apr_off_t)sizes[1] + | ((apr_off_t)sizes[0] << 32); +#else + finfo->size = (apr_off_t)sizes[1]; + if (finfo->size < 0 || sizes[0]) + finfo->size = 0x7fffffff; +#endif + + if (wanted & APR_FINFO_LINK && + wininfo->dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) { + finfo->filetype = APR_LNK; + } + else if (wininfo->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { + finfo->filetype = APR_DIR; + } + else if (wininfo->dwFileAttributes & FILE_ATTRIBUTE_DEVICE) { + /* Warning: This test only succeeds on Win9x, on NT these files + * (con, aux, nul, lpt#, com# etc) escape early detection! + */ + finfo->filetype = APR_CHR; + } + else { + /* Warning: Short of opening the handle to the file, the 'FileType' + * appears to be unknowable (in any trustworthy or consistent sense) + * on WinNT/2K as far as PIPE, CHR, etc are concerned. + */ + if (!wininfo->ftLastWriteTime.dwLowDateTime + && !wininfo->ftLastWriteTime.dwHighDateTime + && !finfo->size) + warn = 1; + finfo->filetype = APR_REG; + } + + /* The following flags are [for this moment] private to Win32. + * That's the only excuse for not toggling valid bits to reflect them. + */ + if (wininfo->dwFileAttributes & FILE_ATTRIBUTE_READONLY) + finfo->protection = APR_FREADONLY; + + finfo->valid = APR_FINFO_ATIME | APR_FINFO_CTIME | APR_FINFO_MTIME + | APR_FINFO_SIZE | APR_FINFO_TYPE; /* == APR_FINFO_MIN */ + + /* Only byhandle optionally tests link targets, so tell that caller + * what it wants to hear, otherwise the byattributes is never + * reporting anything but the link. + */ + if (!byhandle || (wanted & APR_FINFO_LINK)) + finfo->valid |= APR_FINFO_LINK; + return warn; +} + + +APR_DECLARE(apr_status_t) apr_file_info_get(apr_finfo_t *finfo, apr_int32_t wanted, + apr_file_t *thefile) +{ + BY_HANDLE_FILE_INFORMATION FileInfo; + + if (thefile->buffered) { + /* XXX: flush here is not mutex protected */ + apr_status_t rv = apr_file_flush(thefile); + if (rv != APR_SUCCESS) + return rv; + } + + if (!GetFileInformationByHandle(thefile->filehand, &FileInfo)) { + return apr_get_os_error(); + } + + fillin_fileinfo(finfo, (WIN32_FILE_ATTRIBUTE_DATA *) &FileInfo, 1, wanted); + + if (finfo->filetype == APR_REG) + { + /* Go the extra mile to be -certain- that we have a real, regular + * file, since the attribute bits aren't a certain thing. Even + * though fillin should have hinted if we *must* do this, we + * don't need to take chances while the handle is already open. + */ + DWORD FileType; + if (FileType = GetFileType(thefile->filehand)) { + if (FileType == FILE_TYPE_CHAR) { + finfo->filetype = APR_CHR; + } + else if (FileType == FILE_TYPE_PIPE) { + finfo->filetype = APR_PIPE; + } + /* Otherwise leave the original conclusion alone + */ + } + } + + finfo->pool = thefile->pool; + + /* ### The finfo lifetime may exceed the lifetime of thefile->pool + * but finfo's aren't managed in pools, so where on earth would + * we pstrdup the fname into??? + */ + finfo->fname = thefile->fname; + + /* Extra goodies known only by GetFileInformationByHandle() */ + finfo->inode = (apr_ino_t)FileInfo.nFileIndexLow + | ((apr_ino_t)FileInfo.nFileIndexHigh << 32); + finfo->device = FileInfo.dwVolumeSerialNumber; + finfo->nlink = FileInfo.nNumberOfLinks; + + finfo->valid |= APR_FINFO_IDENT | APR_FINFO_NLINK; + + /* If we still want something more (besides the name) go get it! + */ + if ((wanted &= ~finfo->valid) & ~APR_FINFO_NAME) { + return more_finfo(finfo, thefile->filehand, wanted, MORE_OF_HANDLE); + } + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_file_perms_set(const char *fname, + apr_fileperms_t perms) +{ + return APR_ENOTIMPL; +} + +APR_DECLARE(apr_status_t) apr_stat(apr_finfo_t *finfo, const char *fname, + apr_int32_t wanted, apr_pool_t *pool) +{ + /* XXX: is constant - needs testing - which requires a lighter-weight root test fn */ + int isroot = 0; + apr_status_t ident_rv = 0; + apr_status_t rv; +#if APR_HAS_UNICODE_FS + apr_wchar_t wfname[APR_PATH_MAX]; + +#endif + char *filename = NULL; + /* These all share a common subset of this structure */ + union { + WIN32_FIND_DATAW w; + WIN32_FIND_DATAA n; + WIN32_FILE_ATTRIBUTE_DATA i; + } FileInfo; + + /* Catch fname length == MAX_PATH since GetFileAttributesEx fails + * with PATH_NOT_FOUND. We would rather indicate length error than + * 'not found' + */ + if (strlen(fname) >= APR_PATH_MAX) { + return APR_ENAMETOOLONG; + } + +#if APR_HAS_UNICODE_FS + IF_WIN_OS_IS_UNICODE + { + if ((wanted & (APR_FINFO_IDENT | APR_FINFO_NLINK)) + || (~wanted & APR_FINFO_LINK)) { + /* FindFirstFile and GetFileAttributesEx can't figure the inode, + * device or number of links, so we need to resolve with an open + * file handle. If the user has asked for these fields, fall over + * to the get file info by handle method. If we fail, or the user + * also asks for the file name, continue by our usual means. + * + * We also must use this method for a 'true' stat, that resolves + * a symlink (NTFS Junction) target. This is because all fileinfo + * on a Junction always returns the junction, opening the target + * is the only way to resolve the target's attributes. + */ + if ((ident_rv = resolve_ident(finfo, fname, wanted, pool)) + == APR_SUCCESS) + return ident_rv; + else if (ident_rv == APR_INCOMPLETE) + wanted &= ~finfo->valid; + } + + if (rv = utf8_to_unicode_path(wfname, sizeof(wfname) + / sizeof(apr_wchar_t), fname)) + return rv; + if (!(wanted & APR_FINFO_NAME)) { + if (!GetFileAttributesExW(wfname, GetFileExInfoStandard, + &FileInfo.i)) + return apr_get_os_error(); + } + else { + /* Guard against bogus wildcards and retrieve by name + * since we want the true name, and set aside a long + * enough string to handle the longest file name. + */ + char tmpname[APR_FILE_MAX * 3 + 1]; + HANDLE hFind; + if ((rv = test_safe_name(fname)) != APR_SUCCESS) { + return rv; + } + hFind = FindFirstFileW(wfname, &FileInfo.w); + if (hFind == INVALID_HANDLE_VALUE) + return apr_get_os_error(); + FindClose(hFind); + if (unicode_to_utf8_path(tmpname, sizeof(tmpname), + FileInfo.w.cFileName)) { + return APR_ENAMETOOLONG; + } + filename = apr_pstrdup(pool, tmpname); + } + } +#endif +#if APR_HAS_ANSI_FS + ELSE_WIN_OS_IS_ANSI + { + char *root = NULL; + const char *test = fname; + rv = apr_filepath_root(&root, &test, APR_FILEPATH_NATIVE, pool); + isroot = (root && *root && !(*test)); + + if ((apr_os_level >= APR_WIN_98) && (!(wanted & APR_FINFO_NAME) || isroot)) + { + /* cannot use FindFile on a Win98 root, it returns \* + * GetFileAttributesExA is not available on Win95 + */ + if (!GetFileAttributesExA(fname, GetFileExInfoStandard, + &FileInfo.i)) { + return apr_get_os_error(); + } + } + else if (isroot) { + /* This is Win95 and we are trying to stat a root. Lie. + */ + if (GetDriveType(fname) != DRIVE_UNKNOWN) + { + finfo->pool = pool; + finfo->filetype = 0; + finfo->mtime = apr_time_now(); + finfo->protection |= APR_WREAD | APR_WEXECUTE | APR_WWRITE; + finfo->protection |= (finfo->protection << prot_scope_group) + | (finfo->protection << prot_scope_user); + finfo->valid |= APR_FINFO_TYPE | APR_FINFO_PROT + | APR_FINFO_MTIME + | (wanted & APR_FINFO_LINK); + return (wanted &= ~finfo->valid) ? APR_INCOMPLETE + : APR_SUCCESS; + } + else + return APR_FROM_OS_ERROR(ERROR_PATH_NOT_FOUND); + } + else { + /* Guard against bogus wildcards and retrieve by name + * since we want the true name, or are stuck in Win95, + * or are looking for the root of a Win98 drive. + */ + HANDLE hFind; + if ((rv = test_safe_name(fname)) != APR_SUCCESS) { + return rv; + } + hFind = FindFirstFileA(fname, &FileInfo.n); + if (hFind == INVALID_HANDLE_VALUE) { + return apr_get_os_error(); + } + FindClose(hFind); + filename = apr_pstrdup(pool, FileInfo.n.cFileName); + } + } +#endif + + if (ident_rv != APR_INCOMPLETE) { + if (fillin_fileinfo(finfo, (WIN32_FILE_ATTRIBUTE_DATA *) &FileInfo, + 0, wanted)) + { + /* Go the extra mile to assure we have a file. WinNT/2000 seems + * to reliably translate char devices to the path '\\.\device' + * so go ask for the full path. + */ + if (apr_os_level >= APR_WIN_NT) + { +#if APR_HAS_UNICODE_FS + apr_wchar_t tmpname[APR_FILE_MAX]; + apr_wchar_t *tmpoff = NULL; + if (GetFullPathNameW(wfname, sizeof(tmpname) / sizeof(apr_wchar_t), + tmpname, &tmpoff)) + { + if (!wcsncmp(tmpname, L"\\\\.\\", 4)) { +#else + /* Same initial logic as above, but + * only for WinNT/non-UTF-8 builds of APR: + */ + char tmpname[APR_FILE_MAX]; + char *tmpoff; + if (GetFullPathName(fname, sizeof(tmpname), tmpname, &tmpoff)) + { + if (!strncmp(tmpname, "\\\\.\\", 4)) { +#endif + if (tmpoff == tmpname + 4) { + finfo->filetype = APR_CHR; + } + /* For WHATEVER reason, CHR devices such as \\.\con + * or \\.\lpt1 *may*not* update tmpoff; in fact the + * resulting tmpoff is set to NULL. Guard against + * either case. + * + * This code is identical for wide and narrow chars... + */ + else if (!tmpoff) { + tmpoff = tmpname + 4; + while (*tmpoff) { + if (*tmpoff == '\\' || *tmpoff == '/') { + break; + } + ++tmpoff; + } + if (!*tmpoff) { + finfo->filetype = APR_CHR; + } + } + } + } + else { + finfo->valid &= ~APR_FINFO_TYPE; + } + + } + else { + finfo->valid &= ~APR_FINFO_TYPE; + } + } + finfo->pool = pool; + } + + if (filename && !isroot) { + finfo->name = filename; + finfo->valid |= APR_FINFO_NAME; + } + + if (wanted &= ~finfo->valid) { + /* Caller wants more than APR_FINFO_MIN | APR_FINFO_NAME */ +#if APR_HAS_UNICODE_FS + if (apr_os_level >= APR_WIN_NT) + return more_finfo(finfo, wfname, wanted, MORE_OF_WFSPEC); +#endif + return more_finfo(finfo, fname, wanted, MORE_OF_FSPEC); + } + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_lstat(apr_finfo_t *finfo, const char *fname, + apr_int32_t wanted, apr_pool_t *pool) +{ + return apr_stat(finfo, fname, wanted | APR_FINFO_LINK, pool); +} + +APR_DECLARE(apr_status_t) apr_file_attrs_set(const char *fname, + apr_fileattrs_t attributes, + apr_fileattrs_t attr_mask, + apr_pool_t *pool) +{ + DWORD flags; + apr_status_t rv; +#if APR_HAS_UNICODE_FS + apr_wchar_t wfname[APR_PATH_MAX]; +#endif + + /* Don't do anything if we can't handle the requested attributes */ + if (!(attr_mask & (APR_FILE_ATTR_READONLY + | APR_FILE_ATTR_HIDDEN))) + return APR_SUCCESS; + +#if APR_HAS_UNICODE_FS + IF_WIN_OS_IS_UNICODE + { + if (rv = utf8_to_unicode_path(wfname, + sizeof(wfname) / sizeof(wfname[0]), + fname)) + return rv; + flags = GetFileAttributesW(wfname); + } +#endif +#if APR_HAS_ANSI_FS + ELSE_WIN_OS_IS_ANSI + { + flags = GetFileAttributesA(fname); + } +#endif + + if (flags == 0xFFFFFFFF) + return apr_get_os_error(); + + if (attr_mask & APR_FILE_ATTR_READONLY) + { + if (attributes & APR_FILE_ATTR_READONLY) + flags |= FILE_ATTRIBUTE_READONLY; + else + flags &= ~FILE_ATTRIBUTE_READONLY; + } + + if (attr_mask & APR_FILE_ATTR_HIDDEN) + { + if (attributes & APR_FILE_ATTR_HIDDEN) + flags |= FILE_ATTRIBUTE_HIDDEN; + else + flags &= ~FILE_ATTRIBUTE_HIDDEN; + } + +#if APR_HAS_UNICODE_FS + IF_WIN_OS_IS_UNICODE + { + rv = SetFileAttributesW(wfname, flags); + } +#endif +#if APR_HAS_ANSI_FS + ELSE_WIN_OS_IS_ANSI + { + rv = SetFileAttributesA(fname, flags); + } +#endif + + if (rv == 0) + return apr_get_os_error(); + + return APR_SUCCESS; +} + + +APR_DECLARE(apr_status_t) apr_file_mtime_set(const char *fname, + apr_time_t mtime, + apr_pool_t *pool) +{ + apr_file_t *thefile; + apr_status_t rv; + + rv = apr_file_open(&thefile, fname, + APR_READ | APR_WRITEATTRS, + APR_OS_DEFAULT, pool); + if (!rv) + { + FILETIME file_ctime; + FILETIME file_atime; + FILETIME file_mtime; + + if (!GetFileTime(thefile->filehand, + &file_ctime, &file_atime, &file_mtime)) + rv = apr_get_os_error(); + else + { + AprTimeToFileTime(&file_mtime, mtime); + if (!SetFileTime(thefile->filehand, + &file_ctime, &file_atime, &file_mtime)) + rv = apr_get_os_error(); + } + + apr_file_close(thefile); + } + + return rv; +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/win32/filesys.c b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/win32/filesys.c new file mode 100644 index 00000000..ad31e338 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/win32/filesys.c @@ -0,0 +1,229 @@ +/* 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. + */ + +#include "apr.h" +#include "apr_arch_file_io.h" +#include "apr_strings.h" + +/* Win32 Exceptions: + * + * Note that trailing spaces and trailing periods are never recorded + * in the file system, except by a very obscure bug where any file + * that is created with a trailing space or period, followed by the + * ':' stream designator on an NTFS volume can never be accessed again. + * In other words, don't ever accept them when designating a stream! + * + * An interesting side effect is that two or three periods are both + * treated as the parent directory, although the fourth and on are + * not [strongly suggest all trailing periods are trimmed off, or + * down to two if there are no other characters.] + * + * Leading spaces and periods are accepted, however. + * The * ? < > codes all have wildcard side effects + * The " / \ : are exclusively component separator tokens + * The system doesn't accept | for any (known) purpose + * Oddly, \x7f _is_ acceptable ;) + */ + +/* apr_c_is_fnchar[] maps Win32's file name and shell escape symbols + * + * element & 1 == valid file name character [excluding delimiters] + * element & 2 == character should be shell (caret) escaped from cmd.exe + * + * this must be in-sync with Apache httpd's gen_test_char.c for cgi escaping. + */ + +const char apr_c_is_fnchar[256] = +{/* Reject all ctrl codes... Escape \n and \r (ascii 10 and 13) */ + 0,0,0,0,0,0,0,0,0,0,2,0,0,2,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + /* ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? */ + 1,1,2,1,3,3,3,3,3,3,2,1,1,1,1,0, 1,1,1,1,1,1,1,1,1,1,0,3,2,1,2,2, + /* @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ */ + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,3,2,3,3,1, + /* ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ */ + 3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,3,2,3,3,1, + /* High bit codes are accepted (subject to utf-8->Unicode xlation) */ + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 +}; + + +apr_status_t filepath_root_test(char *path, apr_pool_t *p) +{ + apr_status_t rv; +#if APR_HAS_UNICODE_FS + if (apr_os_level >= APR_WIN_NT) + { + apr_wchar_t wpath[APR_PATH_MAX]; + if (rv = utf8_to_unicode_path(wpath, sizeof(wpath) + / sizeof(apr_wchar_t), path)) + return rv; + rv = GetDriveTypeW(wpath); + } + else +#endif + rv = GetDriveType(path); + + if (rv == DRIVE_UNKNOWN || rv == DRIVE_NO_ROOT_DIR) + return APR_EBADPATH; + return APR_SUCCESS; +} + + +apr_status_t filepath_drive_get(char **rootpath, char drive, + apr_int32_t flags, apr_pool_t *p) +{ + char path[APR_PATH_MAX]; +#if APR_HAS_UNICODE_FS + IF_WIN_OS_IS_UNICODE + { + apr_wchar_t *ignored; + apr_wchar_t wdrive[8]; + apr_wchar_t wpath[APR_PATH_MAX]; + apr_status_t rv; + /* ???: This needs review, apparently "\\?\d:." returns "\\?\d:" + * as if that is useful for anything. + */ + wcscpy(wdrive, L"D:."); + wdrive[0] = (apr_wchar_t)(unsigned char)drive; + if (!GetFullPathNameW(wdrive, sizeof(wpath) / sizeof(apr_wchar_t), wpath, &ignored)) + return apr_get_os_error(); + if ((rv = unicode_to_utf8_path(path, sizeof(path), wpath))) + return rv; + } +#endif +#if APR_HAS_ANSI_FS + ELSE_WIN_OS_IS_ANSI + { + char *ignored; + char drivestr[4]; + drivestr[0] = drive; + drivestr[1] = ':'; + drivestr[2] = '.';; + drivestr[3] = '\0'; + if (!GetFullPathName(drivestr, sizeof(path), path, &ignored)) + return apr_get_os_error(); + } +#endif + if (!(flags & APR_FILEPATH_NATIVE)) { + for (*rootpath = path; **rootpath; ++*rootpath) { + if (**rootpath == '\\') + **rootpath = '/'; + } + } + *rootpath = apr_pstrdup(p, path); + return APR_SUCCESS; +} + + +apr_status_t filepath_root_case(char **rootpath, char *root, apr_pool_t *p) +{ +#if APR_HAS_UNICODE_FS + IF_WIN_OS_IS_UNICODE + { + apr_wchar_t *ignored; + apr_wchar_t wpath[APR_PATH_MAX]; + apr_status_t rv; + apr_wchar_t wroot[APR_PATH_MAX]; + /* ???: This needs review, apparently "\\?\d:." returns "\\?\d:" + * as if that is useful for anything. + */ + if (rv = utf8_to_unicode_path(wroot, sizeof(wroot) + / sizeof(apr_wchar_t), root)) + return rv; + if (!GetFullPathNameW(wroot, sizeof(wpath) / sizeof(apr_wchar_t), wpath, &ignored)) + return apr_get_os_error(); + + /* Borrow wroot as a char buffer (twice as big as necessary) + */ + if ((rv = unicode_to_utf8_path((char*)wroot, sizeof(wroot), wpath))) + return rv; + *rootpath = apr_pstrdup(p, (char*)wroot); + } +#endif +#if APR_HAS_ANSI_FS + ELSE_WIN_OS_IS_ANSI + { + char path[APR_PATH_MAX]; + char *ignored; + if (!GetFullPathName(root, sizeof(path), path, &ignored)) + return apr_get_os_error(); + *rootpath = apr_pstrdup(p, path); + } +#endif + return APR_SUCCESS; +} + + +APR_DECLARE(apr_status_t) apr_filepath_get(char **rootpath, apr_int32_t flags, + apr_pool_t *p) +{ + char path[APR_PATH_MAX]; +#if APR_HAS_UNICODE_FS + IF_WIN_OS_IS_UNICODE + { + apr_wchar_t wpath[APR_PATH_MAX]; + apr_status_t rv; + if (!GetCurrentDirectoryW(sizeof(wpath) / sizeof(apr_wchar_t), wpath)) + return apr_get_os_error(); + if ((rv = unicode_to_utf8_path(path, sizeof(path), wpath))) + return rv; + } +#endif +#if APR_HAS_ANSI_FS + ELSE_WIN_OS_IS_ANSI + { + if (!GetCurrentDirectory(sizeof(path), path)) + return apr_get_os_error(); + } +#endif + if (!(flags & APR_FILEPATH_NATIVE)) { + for (*rootpath = path; **rootpath; ++*rootpath) { + if (**rootpath == '\\') + **rootpath = '/'; + } + } + *rootpath = apr_pstrdup(p, path); + return APR_SUCCESS; +} + + +APR_DECLARE(apr_status_t) apr_filepath_set(const char *rootpath, + apr_pool_t *p) +{ +#if APR_HAS_UNICODE_FS + IF_WIN_OS_IS_UNICODE + { + apr_wchar_t wpath[APR_PATH_MAX]; + apr_status_t rv; + if (rv = utf8_to_unicode_path(wpath, sizeof(wpath) + / sizeof(apr_wchar_t), rootpath)) + return rv; + if (!SetCurrentDirectoryW(wpath)) + return apr_get_os_error(); + } +#endif +#if APR_HAS_ANSI_FS + ELSE_WIN_OS_IS_ANSI + { + if (!SetCurrentDirectory(rootpath)) + return apr_get_os_error(); + } +#endif + return APR_SUCCESS; +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/win32/flock.c b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/win32/flock.c new file mode 100644 index 00000000..e08e08a7 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/win32/flock.c @@ -0,0 +1,86 @@ +/* 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. + */ + +#include "apr_arch_file_io.h" + +APR_DECLARE(apr_status_t) apr_file_lock(apr_file_t *thefile, int type) +{ +#ifdef _WIN32_WCE + /* The File locking is unsuported on WCE */ + return APR_ENOTIMPL; +#else + const DWORD len = 0xffffffff; + DWORD flags; + + flags = ((type & APR_FLOCK_NONBLOCK) ? LOCKFILE_FAIL_IMMEDIATELY : 0) + + (((type & APR_FLOCK_TYPEMASK) == APR_FLOCK_SHARED) + ? 0 : LOCKFILE_EXCLUSIVE_LOCK); + if (apr_os_level >= APR_WIN_NT) { + /* Syntax is correct, len is passed for LengthLow and LengthHigh*/ + OVERLAPPED offset; + memset (&offset, 0, sizeof(offset)); + if (!LockFileEx(thefile->filehand, flags, 0, len, len, &offset)) + return apr_get_os_error(); + } + else { + /* On Win9x, LockFile() never blocks. Hack in a crufty poll. + * + * Note that this hack exposes threads to being unserviced forever, + * in the situation that the given lock has low availability. + * When implemented in the kernel, LockFile will typically use + * FIFO or round robin distribution to ensure all threads get + * one crack at the lock; but in this case we can't emulate that. + * + * However Win9x are barely maintainable anyways, if the user does + * choose to build to them, this is the best we can do. + */ + while (!LockFile(thefile->filehand, 0, 0, len, 0)) { + DWORD err = GetLastError(); + if ((err == ERROR_LOCK_VIOLATION) && !(type & APR_FLOCK_NONBLOCK)) + { + Sleep(500); /* pause for a half second */ + continue; /* ... and then poll again */ + } + return APR_FROM_OS_ERROR(err); + } + } + + return APR_SUCCESS; +#endif /* !defined(_WIN32_WCE) */ +} + +APR_DECLARE(apr_status_t) apr_file_unlock(apr_file_t *thefile) +{ +#ifdef _WIN32_WCE + return APR_ENOTIMPL; +#else + DWORD len = 0xffffffff; + + if (apr_os_level >= APR_WIN_NT) { + /* Syntax is correct, len is passed for LengthLow and LengthHigh*/ + OVERLAPPED offset; + memset (&offset, 0, sizeof(offset)); + if (!UnlockFileEx(thefile->filehand, 0, len, len, &offset)) + return apr_get_os_error(); + } + else { + if (!UnlockFile(thefile->filehand, 0, 0, len, 0)) + return apr_get_os_error(); + } + + return APR_SUCCESS; +#endif /* !defined(_WIN32_WCE) */ +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/win32/open.c b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/win32/open.c new file mode 100644 index 00000000..a60fba26 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/win32/open.c @@ -0,0 +1,628 @@ +/* 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. + */ + +#include "apr_private.h" +#include "apr_arch_file_io.h" +#include "apr_file_io.h" +#include "apr_general.h" +#include "apr_strings.h" +#include "apr_portable.h" +#include "apr_thread_mutex.h" +#if APR_HAVE_ERRNO_H +#include +#endif +#include +#include +#if APR_HAVE_SYS_STAT_H +#include +#endif +#include "apr_arch_misc.h" +#include "apr_arch_inherit.h" +#include + +#if APR_HAS_UNICODE_FS +apr_status_t utf8_to_unicode_path(apr_wchar_t* retstr, apr_size_t retlen, + const char* srcstr) +{ + /* TODO: The computations could preconvert the string to determine + * the true size of the retstr, but that's a memory over speed + * tradeoff that isn't appropriate this early in development. + * + * Allocate the maximum string length based on leading 4 + * characters of \\?\ (allowing nearly unlimited path lengths) + * plus the trailing null, then transform /'s into \\'s since + * the \\?\ form doesn't allow '/' path seperators. + * + * Note that the \\?\ form only works for local drive paths, and + * \\?\UNC\ is needed UNC paths. + */ + int srcremains = strlen(srcstr) + 1; + apr_wchar_t *t = retstr; + apr_status_t rv; + + /* This is correct, we don't twist the filename if it is will + * definately be shorter than 248 characters. It merits some + * performance testing to see if this has any effect, but there + * seem to be applications that get confused by the resulting + * Unicode \\?\ style file names, especially if they use argv[0] + * or call the Win32 API functions such as GetModuleName, etc. + * Not every application is prepared to handle such names. + * + * Note also this is shorter than MAX_PATH, as directory paths + * are actually limited to 248 characters. + * + * Note that a utf-8 name can never result in more wide chars + * than the original number of utf-8 narrow chars. + */ + if (srcremains > 248) { + if (srcstr[1] == ':' && (srcstr[2] == '/' || srcstr[2] == '\\')) { + wcscpy (retstr, L"\\\\?\\"); + retlen -= 4; + t += 4; + } + else if ((srcstr[0] == '/' || srcstr[0] == '\\') + && (srcstr[1] == '/' || srcstr[1] == '\\') + && (srcstr[2] != '?')) { + /* Skip the slashes */ + srcstr += 2; + srcremains -= 2; + wcscpy (retstr, L"\\\\?\\UNC\\"); + retlen -= 8; + t += 8; + } + } + + if (rv = apr_conv_utf8_to_ucs2(srcstr, &srcremains, t, &retlen)) { + return (rv == APR_INCOMPLETE) ? APR_EINVAL : rv; + } + if (srcremains) { + return APR_ENAMETOOLONG; + } + for (; *t; ++t) + if (*t == L'/') + *t = L'\\'; + return APR_SUCCESS; +} + +apr_status_t unicode_to_utf8_path(char* retstr, apr_size_t retlen, + const apr_wchar_t* srcstr) +{ + /* Skip the leading 4 characters if the path begins \\?\, or substitute + * // for the \\?\UNC\ path prefix, allocating the maximum string + * length based on the remaining string, plus the trailing null. + * then transform \\'s back into /'s since the \\?\ form never + * allows '/' path seperators, and APR always uses '/'s. + */ + int srcremains = wcslen(srcstr) + 1; + apr_status_t rv; + char *t = retstr; + if (srcstr[0] == L'\\' && srcstr[1] == L'\\' && + srcstr[2] == L'?' && srcstr[3] == L'\\') { + if (srcstr[4] == L'U' && srcstr[5] == L'N' && + srcstr[6] == L'C' && srcstr[7] == L'\\') { + srcremains -= 8; + srcstr += 8; + retstr[0] = '\\'; + retstr[1] = '\\'; + retlen -= 2; + t += 2; + } + else { + srcremains -= 4; + srcstr += 4; + } + } + + if (rv = apr_conv_ucs2_to_utf8(srcstr, &srcremains, t, &retlen)) { + return rv; + } + if (srcremains) { + return APR_ENAMETOOLONG; + } + return APR_SUCCESS; +} +#endif + +void *res_name_from_filename(const char *file, int global, apr_pool_t *pool) +{ +#if APR_HAS_UNICODE_FS + IF_WIN_OS_IS_UNICODE + { + apr_wchar_t *wpre, *wfile, *ch; + apr_size_t n = strlen(file) + 1; + apr_size_t r, d; + apr_status_t rv; + + if (apr_os_level >= APR_WIN_2000) { + if (global) + wpre = L"Global\\"; + else + wpre = L"Local\\"; + } + else + wpre = L""; + r = wcslen(wpre); + + if (n > 256 - r) { + file += n - 256 - r; + n = 256; + /* skip utf8 continuation bytes */ + while ((*file & 0xC0) == 0x80) { + ++file; + --n; + } + } + wfile = apr_palloc(pool, (r + n) * sizeof(apr_wchar_t)); + wcscpy(wfile, wpre); + d = n; + if (rv = apr_conv_utf8_to_ucs2(file, &n, wfile + r, &d)) { + return NULL; + } + for (ch = wfile + r; *ch; ++ch) { + if (*ch == ':' || *ch == '/' || *ch == '\\') + *ch = '_'; + } + return wfile; + } +#endif +#if APR_HAS_ANSI_FS + ELSE_WIN_OS_IS_ANSI + { + char *nfile, *ch; + apr_size_t n = strlen(file) + 1; + +#if !APR_HAS_UNICODE_FS + apr_status_t rv; + apr_size_t r, d; + char *pre; + + if (apr_os_level >= APR_WIN_2000) { + if (global) + pre = "Global\\"; + else + pre = "Local\\"; + } + else + pre = ""; + r = strlen(pre); + + if (n > 256 - r) { + file += n - 256 - r; + n = 256; + } + nfile = apr_palloc(pool, (r + n) * sizeof(apr_wchar_t)); + memcpy(nfile, pre, r); + memcpy(nfile + r, file, n); +#else + const apr_size_t r = 0; + if (n > 256) { + file += n - 256; + n = 256; + } + nfile = apr_pmemdup(pool, file, n); +#endif + for (ch = nfile + r; *ch; ++ch) { + if (*ch == ':' || *ch == '/' || *ch == '\\') + *ch = '_'; + } + return nfile; + } +#endif +} + + +apr_status_t file_cleanup(void *thefile) +{ + apr_file_t *file = thefile; + apr_status_t flush_rv = APR_SUCCESS; + + if (file->filehand != INVALID_HANDLE_VALUE) { + + if (file->buffered) { + /* XXX: flush here is not mutex protected */ + flush_rv = apr_file_flush((apr_file_t *)thefile); + } + + /* In order to avoid later segfaults with handle 'reuse', + * we must protect against the case that a dup2'ed handle + * is being closed, and invalidate the corresponding StdHandle + * We also tell msvcrt when stdhandles are closed. + */ + if (file->flags & APR_STD_FLAGS) + { + if ((file->flags & APR_STD_FLAGS) == APR_STDERR_FLAG) { + _close(2); + SetStdHandle(STD_ERROR_HANDLE, INVALID_HANDLE_VALUE); + } + else if ((file->flags & APR_STD_FLAGS) == APR_STDOUT_FLAG) { + _close(1); + SetStdHandle(STD_OUTPUT_HANDLE, INVALID_HANDLE_VALUE); + } + else if ((file->flags & APR_STD_FLAGS) == APR_STDIN_FLAG) { + _close(0); + SetStdHandle(STD_INPUT_HANDLE, INVALID_HANDLE_VALUE); + } + } + else + CloseHandle(file->filehand); + + file->filehand = INVALID_HANDLE_VALUE; + } + if (file->pOverlapped && file->pOverlapped->hEvent) { + CloseHandle(file->pOverlapped->hEvent); + file->pOverlapped = NULL; + } + return flush_rv; +} + +APR_DECLARE(apr_status_t) apr_file_open(apr_file_t **new, const char *fname, + apr_int32_t flag, apr_fileperms_t perm, + apr_pool_t *pool) +{ + HANDLE handle = INVALID_HANDLE_VALUE; + DWORD oflags = 0; + DWORD createflags = 0; + DWORD attributes = 0; + DWORD sharemode = FILE_SHARE_READ | FILE_SHARE_WRITE; + apr_status_t rv; + + if (flag & APR_READ) { + oflags |= GENERIC_READ; + } + if (flag & APR_WRITE) { + oflags |= GENERIC_WRITE; + } + if (flag & APR_WRITEATTRS) { + oflags |= FILE_WRITE_ATTRIBUTES; + } + + if (apr_os_level >= APR_WIN_NT) + sharemode |= FILE_SHARE_DELETE; + + if (flag & APR_CREATE) { + if (flag & APR_EXCL) { + /* only create new if file does not already exist */ + createflags = CREATE_NEW; + } else if (flag & APR_TRUNCATE) { + /* truncate existing file or create new */ + createflags = CREATE_ALWAYS; + } else { + /* open existing but create if necessary */ + createflags = OPEN_ALWAYS; + } + } else if (flag & APR_TRUNCATE) { + /* only truncate if file already exists */ + createflags = TRUNCATE_EXISTING; + } else { + /* only open if file already exists */ + createflags = OPEN_EXISTING; + } + + if ((flag & APR_EXCL) && !(flag & APR_CREATE)) { + return APR_EACCES; + } + + if (flag & APR_DELONCLOSE) { + attributes |= FILE_FLAG_DELETE_ON_CLOSE; + } + + if (flag & APR_OPENLINK) { + attributes |= FILE_FLAG_OPEN_REPARSE_POINT; + } + + /* Without READ or WRITE, we fail unless apr called apr_file_open + * internally with the private APR_OPENINFO flag. + * + * With the APR_OPENINFO flag on NT, use the option flag + * FILE_FLAG_BACKUP_SEMANTICS to allow us to open directories. + * See the static resolve_ident() fn in file_io/win32/filestat.c + */ + if (!(flag & (APR_READ | APR_WRITE))) { + if (flag & APR_OPENINFO) { + if (apr_os_level >= APR_WIN_NT) { + attributes |= FILE_FLAG_BACKUP_SEMANTICS; + } + } + else { + return APR_EACCES; + } + if (flag & APR_READCONTROL) + oflags |= READ_CONTROL; + } + + if (flag & APR_XTHREAD) { + /* This win32 specific feature is required + * to allow multiple threads to work with the file. + */ + attributes |= FILE_FLAG_OVERLAPPED; + } + +#if APR_HAS_UNICODE_FS + IF_WIN_OS_IS_UNICODE + { + apr_wchar_t wfname[APR_PATH_MAX]; + + if (flag & APR_SENDFILE_ENABLED) { + /* This feature is required to enable sendfile operations + * against the file on Win32. Also implies APR_XTHREAD. + */ + flag |= APR_XTHREAD; + attributes |= FILE_FLAG_SEQUENTIAL_SCAN | FILE_FLAG_OVERLAPPED; + } + + if (rv = utf8_to_unicode_path(wfname, sizeof(wfname) + / sizeof(apr_wchar_t), fname)) + return rv; + handle = CreateFileW(wfname, oflags, sharemode, + NULL, createflags, attributes, 0); + } +#endif +#if APR_HAS_ANSI_FS + ELSE_WIN_OS_IS_ANSI { + handle = CreateFileA(fname, oflags, sharemode, + NULL, createflags, attributes, 0); + if (flag & APR_SENDFILE_ENABLED) { + /* This feature is not supported on this platform. + */ + flag &= ~APR_SENDFILE_ENABLED; + } + + } +#endif + if (handle == INVALID_HANDLE_VALUE) { + return apr_get_os_error(); + } + + (*new) = (apr_file_t *)apr_pcalloc(pool, sizeof(apr_file_t)); + (*new)->pool = pool; + (*new)->filehand = handle; + (*new)->fname = apr_pstrdup(pool, fname); + (*new)->flags = flag; + (*new)->timeout = -1; + (*new)->ungetchar = -1; + + if (flag & APR_APPEND) { + (*new)->append = 1; + SetFilePointer((*new)->filehand, 0, NULL, FILE_END); + } + if (flag & APR_BUFFERED) { + (*new)->buffered = 1; + (*new)->buffer = apr_palloc(pool, APR_FILE_BUFSIZE); + } + /* Need the mutex to handled buffered and O_APPEND style file i/o */ + if ((*new)->buffered || (*new)->append) { + rv = apr_thread_mutex_create(&(*new)->mutex, + APR_THREAD_MUTEX_DEFAULT, pool); + if (rv) { + if (file_cleanup(*new) == APR_SUCCESS) { + apr_pool_cleanup_kill(pool, *new, file_cleanup); + } + return rv; + } + } + + if (!(flag & APR_FILE_NOCLEANUP)) { + apr_pool_cleanup_register((*new)->pool, (void *)(*new), file_cleanup, + apr_pool_cleanup_null); + } + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_file_close(apr_file_t *file) +{ + apr_status_t stat; + if ((stat = file_cleanup(file)) == APR_SUCCESS) { + apr_pool_cleanup_kill(file->pool, file, file_cleanup); + + if (file->mutex) { + apr_thread_mutex_destroy(file->mutex); + } + + return APR_SUCCESS; + } + return stat; +} + +APR_DECLARE(apr_status_t) apr_file_remove(const char *path, apr_pool_t *pool) +{ +#if APR_HAS_UNICODE_FS + IF_WIN_OS_IS_UNICODE + { + apr_wchar_t wpath[APR_PATH_MAX]; + apr_status_t rv; + if (rv = utf8_to_unicode_path(wpath, sizeof(wpath) + / sizeof(apr_wchar_t), path)) { + return rv; + } + if (DeleteFileW(wpath)) + return APR_SUCCESS; + } +#endif +#if APR_HAS_ANSI_FS + ELSE_WIN_OS_IS_ANSI + if (DeleteFile(path)) + return APR_SUCCESS; +#endif + return apr_get_os_error(); +} + +APR_DECLARE(apr_status_t) apr_file_rename(const char *frompath, + const char *topath, + apr_pool_t *pool) +{ + IF_WIN_OS_IS_UNICODE + { +#if APR_HAS_UNICODE_FS + apr_wchar_t wfrompath[APR_PATH_MAX], wtopath[APR_PATH_MAX]; + apr_status_t rv; + if (rv = utf8_to_unicode_path(wfrompath, sizeof(wfrompath) + / sizeof(apr_wchar_t), frompath)) { + return rv; + } + if (rv = utf8_to_unicode_path(wtopath, sizeof(wtopath) + / sizeof(apr_wchar_t), topath)) { + return rv; + } +#ifndef _WIN32_WCE + if (MoveFileExW(wfrompath, wtopath, MOVEFILE_REPLACE_EXISTING | + MOVEFILE_COPY_ALLOWED)) +#else + if (MoveFileW(wfrompath, wtopath)) +#endif + return APR_SUCCESS; +#else + if (MoveFileEx(frompath, topath, MOVEFILE_REPLACE_EXISTING | + MOVEFILE_COPY_ALLOWED)) + return APR_SUCCESS; +#endif + } +#if APR_HAS_ANSI_FS + ELSE_WIN_OS_IS_ANSI + { + /* Windows 95 and 98 do not support MoveFileEx, so we'll use + * the old MoveFile function. However, MoveFile requires that + * the new file not already exist...so we have to delete that + * file if it does. Perhaps we should back up the to-be-deleted + * file in case something happens? + */ + HANDLE handle = INVALID_HANDLE_VALUE; + + if ((handle = CreateFile(topath, GENERIC_WRITE, 0, 0, + OPEN_EXISTING, 0, 0 )) != INVALID_HANDLE_VALUE ) + { + CloseHandle(handle); + if (!DeleteFile(topath)) + return apr_get_os_error(); + } + if (MoveFile(frompath, topath)) + return APR_SUCCESS; + } +#endif + return apr_get_os_error(); +} + +APR_DECLARE(apr_status_t) apr_os_file_get(apr_os_file_t *thefile, + apr_file_t *file) +{ + *thefile = file->filehand; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_os_file_put(apr_file_t **file, + apr_os_file_t *thefile, + apr_int32_t flags, + apr_pool_t *pool) +{ + (*file) = apr_pcalloc(pool, sizeof(apr_file_t)); + (*file)->pool = pool; + (*file)->filehand = *thefile; + (*file)->ungetchar = -1; /* no char avail */ + (*file)->timeout = -1; + (*file)->flags = flags; + + if (flags & APR_APPEND) { + (*file)->append = 1; + } + if (flags & APR_BUFFERED) { + (*file)->buffered = 1; + (*file)->buffer = apr_palloc(pool, APR_FILE_BUFSIZE); + } + + if ((*file)->append || (*file)->buffered) { + apr_status_t rv; + rv = apr_thread_mutex_create(&(*file)->mutex, + APR_THREAD_MUTEX_DEFAULT, pool); + if (rv) { + if (file_cleanup(*file) == APR_SUCCESS) { + apr_pool_cleanup_kill(pool, *file, file_cleanup); + } + return rv; + } + } + + /* XXX... we pcalloc above so all others are zeroed. + * Should we be testing if thefile is a handle to + * a PIPE and set up the mechanics appropriately? + * + * (*file)->pipe; + */ + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_file_eof(apr_file_t *fptr) +{ + if (fptr->eof_hit == 1) { + return APR_EOF; + } + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_file_open_stderr(apr_file_t **thefile, apr_pool_t *pool) +{ +#ifdef _WIN32_WCE + return APR_ENOTIMPL; +#else + apr_os_file_t file_handle; + + apr_set_os_error(APR_SUCCESS); + file_handle = GetStdHandle(STD_ERROR_HANDLE); + if (!file_handle) + file_handle = INVALID_HANDLE_VALUE; + + return apr_os_file_put(thefile, &file_handle, + APR_WRITE | APR_STDERR_FLAG, pool); +#endif +} + +APR_DECLARE(apr_status_t) apr_file_open_stdout(apr_file_t **thefile, apr_pool_t *pool) +{ +#ifdef _WIN32_WCE + return APR_ENOTIMPL; +#else + apr_os_file_t file_handle; + + apr_set_os_error(APR_SUCCESS); + file_handle = GetStdHandle(STD_OUTPUT_HANDLE); + if (!file_handle) + file_handle = INVALID_HANDLE_VALUE; + + return apr_os_file_put(thefile, &file_handle, + APR_WRITE | APR_STDOUT_FLAG, pool); +#endif +} + +APR_DECLARE(apr_status_t) apr_file_open_stdin(apr_file_t **thefile, apr_pool_t *pool) +{ +#ifdef _WIN32_WCE + return APR_ENOTIMPL; +#else + apr_os_file_t file_handle; + + apr_set_os_error(APR_SUCCESS); + file_handle = GetStdHandle(STD_INPUT_HANDLE); + if (!file_handle) + file_handle = INVALID_HANDLE_VALUE; + + return apr_os_file_put(thefile, &file_handle, + APR_READ | APR_STDIN_FLAG, pool); +#endif +} + +APR_POOL_IMPLEMENT_ACCESSOR(file); + +APR_IMPLEMENT_INHERIT_SET(file, flags, pool, file_cleanup) + +APR_IMPLEMENT_INHERIT_UNSET(file, flags, pool, file_cleanup) diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/win32/pipe.c b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/win32/pipe.c new file mode 100644 index 00000000..78d6b096 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/win32/pipe.c @@ -0,0 +1,235 @@ +/* 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. + */ + +#include "win32/apr_arch_file_io.h" +#include "apr_file_io.h" +#include "apr_general.h" +#include "apr_strings.h" +#if APR_HAVE_ERRNO_H +#include +#endif +#include +#include +#if APR_HAVE_SYS_TYPES_H +#include +#endif +#if APR_HAVE_SYS_STAT_H +#include +#endif +#include "apr_arch_misc.h" + +APR_DECLARE(apr_status_t) apr_file_pipe_timeout_set(apr_file_t *thepipe, apr_interval_time_t timeout) +{ + /* Always OK to unset timeouts */ + if (timeout == -1) { + thepipe->timeout = timeout; + return APR_SUCCESS; + } + if (!thepipe->pipe) { + return APR_ENOTIMPL; + } + if (timeout && !(thepipe->pOverlapped)) { + /* Cannot be nonzero if a pipe was opened blocking + */ + return APR_EINVAL; + } + thepipe->timeout = timeout; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_file_pipe_timeout_get(apr_file_t *thepipe, apr_interval_time_t *timeout) +{ + /* Always OK to get the timeout (even if it's unset ... -1) */ + *timeout = thepipe->timeout; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_file_pipe_create(apr_file_t **in, apr_file_t **out, apr_pool_t *p) +{ + /* Unix creates full blocking pipes. */ + return apr_create_nt_pipe(in, out, APR_FULL_BLOCK, p); +} + +/* apr_create_nt_pipe() + * An internal (for now) APR function used by apr_proc_create() + * when setting up pipes to communicate with the child process. + * apr_create_nt_pipe() allows setting the blocking mode of each end of + * the pipe when the pipe is created (rather than after the pipe is created). + * A pipe handle must be opened in full async i/o mode in order to + * emulate Unix non-blocking pipes with timeouts. + * + * In general, we don't want to enable child side pipe handles for async i/o. + * This prevents us from enabling both ends of the pipe for async i/o in + * apr_file_pipe_create. + * + * Why not use NamedPipes on NT which support setting pipe state to + * non-blocking? On NT, even though you can set a pipe non-blocking, + * there is no clean way to set event driven non-zero timeouts (e.g select(), + * WaitForSinglelObject, et. al. will not detect pipe i/o). On NT, you + * have to poll the pipe to detect i/o on a non-blocking pipe. + */ +apr_status_t apr_create_nt_pipe(apr_file_t **in, apr_file_t **out, + apr_int32_t blocking_mode, + apr_pool_t *p) +{ +#ifdef _WIN32_WCE + return APR_ENOTIMPL; +#else + SECURITY_ATTRIBUTES sa; + static unsigned long id = 0; + DWORD dwPipeMode; + DWORD dwOpenMode; + char name[50]; + + sa.nLength = sizeof(sa); + +#if APR_HAS_UNICODE_FS + IF_WIN_OS_IS_UNICODE + sa.bInheritHandle = FALSE; +#endif +#if APR_HAS_ANSI_FS + ELSE_WIN_OS_IS_ANSI + sa.bInheritHandle = TRUE; +#endif + sa.lpSecurityDescriptor = NULL; + + (*in) = (apr_file_t *)apr_pcalloc(p, sizeof(apr_file_t)); + (*in)->pool = p; + (*in)->fname = NULL; + (*in)->pipe = 1; + (*in)->timeout = -1; + (*in)->ungetchar = -1; + (*in)->eof_hit = 0; + (*in)->filePtr = 0; + (*in)->bufpos = 0; + (*in)->dataRead = 0; + (*in)->direction = 0; + (*in)->pOverlapped = NULL; + + (*out) = (apr_file_t *)apr_pcalloc(p, sizeof(apr_file_t)); + (*out)->pool = p; + (*out)->fname = NULL; + (*out)->pipe = 1; + (*out)->timeout = -1; + (*out)->ungetchar = -1; + (*out)->eof_hit = 0; + (*out)->filePtr = 0; + (*out)->bufpos = 0; + (*out)->dataRead = 0; + (*out)->direction = 0; + (*out)->pOverlapped = NULL; + + if (apr_os_level >= APR_WIN_NT) { + /* Create the read end of the pipe */ + dwOpenMode = PIPE_ACCESS_INBOUND; + if (blocking_mode == APR_WRITE_BLOCK /* READ_NONBLOCK */ + || blocking_mode == APR_FULL_NONBLOCK) { + dwOpenMode |= FILE_FLAG_OVERLAPPED; + (*in)->pOverlapped = (OVERLAPPED*) apr_pcalloc(p, sizeof(OVERLAPPED)); + (*in)->pOverlapped->hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); + } + + dwPipeMode = 0; + + sprintf(name, "\\\\.\\pipe\\apr-pipe-%u.%lu", getpid(), id++); + + (*in)->filehand = CreateNamedPipe(name, + dwOpenMode, + dwPipeMode, + 1, //nMaxInstances, + 0, //nOutBufferSize, + 65536, //nInBufferSize, + 1, //nDefaultTimeOut, + &sa); + + /* Create the write end of the pipe */ + dwOpenMode = FILE_ATTRIBUTE_NORMAL; + if (blocking_mode == APR_READ_BLOCK /* WRITE_NONBLOCK */ + || blocking_mode == APR_FULL_NONBLOCK) { + dwOpenMode |= FILE_FLAG_OVERLAPPED; + (*out)->pOverlapped = (OVERLAPPED*) apr_pcalloc(p, sizeof(OVERLAPPED)); + (*out)->pOverlapped->hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); + } + + (*out)->filehand = CreateFile(name, + GENERIC_WRITE, // access mode + 0, // share mode + &sa, // Security attributes + OPEN_EXISTING, // dwCreationDisposition + dwOpenMode, // Pipe attributes + NULL); // handle to template file + } + else { + /* Pipes on Win9* are blocking. Live with it. */ + if (!CreatePipe(&(*in)->filehand, &(*out)->filehand, &sa, 65536)) { + return apr_get_os_error(); + } + } + + apr_pool_cleanup_register((*in)->pool, (void *)(*in), file_cleanup, + apr_pool_cleanup_null); + apr_pool_cleanup_register((*out)->pool, (void *)(*out), file_cleanup, + apr_pool_cleanup_null); + return APR_SUCCESS; +#endif /* _WIN32_WCE */ +} + + +APR_DECLARE(apr_status_t) apr_file_namedpipe_create(const char *filename, + apr_fileperms_t perm, + apr_pool_t *pool) +{ + /* Not yet implemented, interface not suitable. + * Win32 requires the named pipe to be *opened* at the time it's + * created, and to do so, blocking or non blocking must be elected. + */ + return APR_ENOTIMPL; +} + + +/* XXX: Problem; we need to choose between blocking and nonblocking based + * on how *thefile was opened, and we don't have that information :-/ + * Hack; assume a blocking socket, since the most common use for the fn + * would be to handle stdio-style or blocking pipes. Win32 doesn't have + * select() blocking for pipes anyways :( + */ +APR_DECLARE(apr_status_t) apr_os_pipe_put_ex(apr_file_t **file, + apr_os_file_t *thefile, + int register_cleanup, + apr_pool_t *pool) +{ + (*file) = apr_pcalloc(pool, sizeof(apr_file_t)); + (*file)->pool = pool; + (*file)->pipe = 1; + (*file)->timeout = -1; + (*file)->ungetchar = -1; + (*file)->filehand = *thefile; + + if (register_cleanup) { + apr_pool_cleanup_register(pool, *file, file_cleanup, + apr_pool_cleanup_null); + } + + return APR_SUCCESS; +} + + +APR_DECLARE(apr_status_t) apr_os_pipe_put(apr_file_t **file, + apr_os_file_t *thefile, + apr_pool_t *pool) +{ + return apr_os_pipe_put_ex(file, thefile, 0, pool); +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/win32/readwrite.c b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/win32/readwrite.c new file mode 100644 index 00000000..5291830a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/win32/readwrite.c @@ -0,0 +1,524 @@ +/* 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. + */ + +#include "win32/apr_arch_file_io.h" +#include "apr_file_io.h" +#include "apr_general.h" +#include "apr_strings.h" +#include "apr_lib.h" +#include "apr_errno.h" +#include +#include "apr_arch_atime.h" +#include "apr_arch_misc.h" + +/* + * read_with_timeout() + * Uses async i/o to emulate unix non-blocking i/o with timeouts. + */ +static apr_status_t read_with_timeout(apr_file_t *file, void *buf, apr_size_t len, apr_size_t *nbytes) +{ + apr_status_t rv; + *nbytes = 0; + + /* Handle the zero timeout non-blocking case */ + if (file->timeout == 0) { + /* Peek at the pipe. If there is no data available, return APR_EAGAIN. + * If data is available, go ahead and read it. + */ + if (file->pipe) { + DWORD bytes; + if (!PeekNamedPipe(file->filehand, NULL, 0, NULL, &bytes, NULL)) { + rv = apr_get_os_error(); + if (rv == APR_FROM_OS_ERROR(ERROR_BROKEN_PIPE)) { + rv = APR_EOF; + } + return rv; + } + else { + if (bytes == 0) { + return APR_EAGAIN; + } + if (len > bytes) { + len = bytes; + } + } + } + else { + /* ToDo: Handle zero timeout non-blocking file i/o + * This is not needed until an APR application needs to + * timeout file i/o (which means setting file i/o non-blocking) + */ + } + } + + if (file->pOverlapped && !file->pipe) { + file->pOverlapped->Offset = (DWORD)file->filePtr; + file->pOverlapped->OffsetHigh = (DWORD)(file->filePtr >> 32); + } + + rv = ReadFile(file->filehand, buf, len, nbytes, file->pOverlapped); + + if (!rv) { + rv = apr_get_os_error(); + if (rv == APR_FROM_OS_ERROR(ERROR_IO_PENDING)) { + /* Wait for the pending i/o */ + if (file->timeout > 0) { + /* timeout in milliseconds... */ + rv = WaitForSingleObject(file->pOverlapped->hEvent, + (DWORD)(file->timeout/1000)); + } + else if (file->timeout == -1) { + rv = WaitForSingleObject(file->pOverlapped->hEvent, INFINITE); + } + switch (rv) { + case WAIT_OBJECT_0: + GetOverlappedResult(file->filehand, file->pOverlapped, + nbytes, TRUE); + rv = APR_SUCCESS; + break; + + case WAIT_TIMEOUT: + rv = APR_TIMEUP; + break; + + case WAIT_FAILED: + rv = apr_get_os_error(); + break; + + default: + break; + } + + if (rv != APR_SUCCESS) { + if (apr_os_level >= APR_WIN_98) { + CancelIo(file->filehand); + } + } + } + else if (rv == APR_FROM_OS_ERROR(ERROR_BROKEN_PIPE)) { + /* Assume ERROR_BROKEN_PIPE signals an EOF reading from a pipe */ + rv = APR_EOF; + } else if (rv == APR_FROM_OS_ERROR(ERROR_HANDLE_EOF)) { + /* Did we hit EOF reading from the handle? */ + rv = APR_EOF; + } + } else { + /* OK and 0 bytes read ==> end of file */ + if (*nbytes == 0) + rv = APR_EOF; + else + rv = APR_SUCCESS; + } + if (rv == APR_SUCCESS && file->pOverlapped && !file->pipe) { + file->filePtr += *nbytes; + } + return rv; +} + +APR_DECLARE(apr_status_t) apr_file_read(apr_file_t *thefile, void *buf, apr_size_t *len) +{ + apr_status_t rv; + DWORD bytes_read = 0; + + if (*len <= 0) { + *len = 0; + return APR_SUCCESS; + } + + /* If the file is open for xthread support, allocate and + * initialize the overlapped and io completion event (hEvent). + * Threads should NOT share an apr_file_t or its hEvent. + */ + if ((thefile->flags & APR_XTHREAD) && !thefile->pOverlapped ) { + thefile->pOverlapped = (OVERLAPPED*) apr_pcalloc(thefile->pool, + sizeof(OVERLAPPED)); + thefile->pOverlapped->hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); + if (!thefile->pOverlapped->hEvent) { + rv = apr_get_os_error(); + return rv; + } + } + + /* Handle the ungetchar if there is one */ + if (thefile->ungetchar != -1) { + bytes_read = 1; + *(char *)buf = (char)thefile->ungetchar; + buf = (char *)buf + 1; + (*len)--; + thefile->ungetchar = -1; + if (*len == 0) { + *len = bytes_read; + return APR_SUCCESS; + } + } + if (thefile->buffered) { + char *pos = (char *)buf; + apr_size_t blocksize; + apr_size_t size = *len; + + apr_thread_mutex_lock(thefile->mutex); + + if (thefile->direction == 1) { + rv = apr_file_flush(thefile); + if (rv != APR_SUCCESS) { + apr_thread_mutex_unlock(thefile->mutex); + return rv; + } + thefile->bufpos = 0; + thefile->direction = 0; + thefile->dataRead = 0; + } + + rv = 0; + while (rv == 0 && size > 0) { + if (thefile->bufpos >= thefile->dataRead) { + apr_size_t read; + rv = read_with_timeout(thefile, thefile->buffer, + APR_FILE_BUFSIZE, &read); + if (read == 0) { + if (rv == APR_EOF) + thefile->eof_hit = TRUE; + break; + } + else { + thefile->dataRead = read; + thefile->filePtr += thefile->dataRead; + thefile->bufpos = 0; + } + } + + blocksize = size > thefile->dataRead - thefile->bufpos ? thefile->dataRead - thefile->bufpos : size; + memcpy(pos, thefile->buffer + thefile->bufpos, blocksize); + thefile->bufpos += blocksize; + pos += blocksize; + size -= blocksize; + } + + *len = pos - (char *)buf; + if (*len) { + rv = APR_SUCCESS; + } + apr_thread_mutex_unlock(thefile->mutex); + } else { + /* Unbuffered i/o */ + apr_size_t nbytes; + rv = read_with_timeout(thefile, buf, *len, &nbytes); + if (rv == APR_EOF) + thefile->eof_hit = TRUE; + *len = nbytes; + } + + return rv; +} + +APR_DECLARE(apr_status_t) apr_file_write(apr_file_t *thefile, const void *buf, apr_size_t *nbytes) +{ + apr_status_t rv; + DWORD bwrote; + + /* If the file is open for xthread support, allocate and + * initialize the overlapped and io completion event (hEvent). + * Threads should NOT share an apr_file_t or its hEvent. + */ + if ((thefile->flags & APR_XTHREAD) && !thefile->pOverlapped ) { + thefile->pOverlapped = (OVERLAPPED*) apr_pcalloc(thefile->pool, + sizeof(OVERLAPPED)); + thefile->pOverlapped->hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); + if (!thefile->pOverlapped->hEvent) { + rv = apr_get_os_error(); + return rv; + } + } + + if (thefile->buffered) { + char *pos = (char *)buf; + apr_size_t blocksize; + apr_size_t size = *nbytes; + + apr_thread_mutex_lock(thefile->mutex); + + if (thefile->direction == 0) { + // Position file pointer for writing at the offset we are logically reading from + apr_off_t offset = thefile->filePtr - thefile->dataRead + thefile->bufpos; + DWORD offlo = (DWORD)offset; + DWORD offhi = (DWORD)(offset >> 32); + if (offset != thefile->filePtr) + SetFilePointer(thefile->filehand, offlo, &offhi, FILE_BEGIN); + thefile->bufpos = thefile->dataRead = 0; + thefile->direction = 1; + } + + rv = 0; + while (rv == 0 && size > 0) { + if (thefile->bufpos == APR_FILE_BUFSIZE) // write buffer is full + rv = apr_file_flush(thefile); + + blocksize = size > APR_FILE_BUFSIZE - thefile->bufpos ? APR_FILE_BUFSIZE - thefile->bufpos : size; + memcpy(thefile->buffer + thefile->bufpos, pos, blocksize); + thefile->bufpos += blocksize; + pos += blocksize; + size -= blocksize; + } + + apr_thread_mutex_unlock(thefile->mutex); + return rv; + } else { + if (!thefile->pipe) { + apr_off_t offset = 0; + apr_status_t rc; + if (thefile->append) { + /* apr_file_lock will mutex the file across processes. + * The call to apr_thread_mutex_lock is added to avoid + * a race condition between LockFile and WriteFile + * that occasionally leads to deadlocked threads. + */ + apr_thread_mutex_lock(thefile->mutex); + rc = apr_file_lock(thefile, APR_FLOCK_EXCLUSIVE); + if (rc != APR_SUCCESS) { + apr_thread_mutex_unlock(thefile->mutex); + return rc; + } + rc = apr_file_seek(thefile, APR_END, &offset); + if (rc != APR_SUCCESS) { + apr_thread_mutex_unlock(thefile->mutex); + return rc; + } + } + if (thefile->pOverlapped) { + thefile->pOverlapped->Offset = (DWORD)thefile->filePtr; + thefile->pOverlapped->OffsetHigh = (DWORD)(thefile->filePtr >> 32); + } + rv = WriteFile(thefile->filehand, buf, *nbytes, &bwrote, + thefile->pOverlapped); + if (thefile->append) { + apr_file_unlock(thefile); + apr_thread_mutex_unlock(thefile->mutex); + } + } + else { + rv = WriteFile(thefile->filehand, buf, *nbytes, &bwrote, + thefile->pOverlapped); + } + if (rv) { + *nbytes = bwrote; + rv = APR_SUCCESS; + } + else { + (*nbytes) = 0; + rv = apr_get_os_error(); + if (rv == APR_FROM_OS_ERROR(ERROR_IO_PENDING)) { + + DWORD timeout_ms; + + if (thefile->timeout == 0) { + timeout_ms = 0; + } + else if (thefile->timeout < 0) { + timeout_ms = INFINITE; + } + else { + timeout_ms = (DWORD)(thefile->timeout / 1000); + } + + rv = WaitForSingleObject(thefile->pOverlapped->hEvent, timeout_ms); + switch (rv) { + case WAIT_OBJECT_0: + GetOverlappedResult(thefile->filehand, thefile->pOverlapped, nbytes, TRUE); + rv = APR_SUCCESS; + break; + case WAIT_TIMEOUT: + rv = APR_TIMEUP; + break; + case WAIT_FAILED: + rv = apr_get_os_error(); + break; + default: + break; + } + if (rv != APR_SUCCESS) { + if (apr_os_level >= APR_WIN_98) + CancelIo(thefile->filehand); + } + } + } + if (rv == APR_SUCCESS && thefile->pOverlapped && !thefile->pipe) { + thefile->filePtr += *nbytes; + } + } + return rv; +} +/* ToDo: Write for it anyway and test the oslevel! + * Too bad WriteFileGather() is not supported on 95&98 (or NT prior to SP2) + */ +APR_DECLARE(apr_status_t) apr_file_writev(apr_file_t *thefile, + const struct iovec *vec, + apr_size_t nvec, + apr_size_t *nbytes) +{ + apr_status_t rv = APR_SUCCESS; + apr_size_t i; + DWORD bwrote = 0; + char *buf; + + *nbytes = 0; + for (i = 0; i < nvec; i++) { + buf = vec[i].iov_base; + bwrote = vec[i].iov_len; + rv = apr_file_write(thefile, buf, &bwrote); + *nbytes += bwrote; + if (rv != APR_SUCCESS) { + break; + } + } + return rv; +} + +APR_DECLARE(apr_status_t) apr_file_putc(char ch, apr_file_t *thefile) +{ + DWORD len = 1; + + return apr_file_write(thefile, &ch, &len); +} + +APR_DECLARE(apr_status_t) apr_file_ungetc(char ch, apr_file_t *thefile) +{ + thefile->ungetchar = (unsigned char) ch; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_file_getc(char *ch, apr_file_t *thefile) +{ + apr_status_t rc; + int bread; + + bread = 1; + rc = apr_file_read(thefile, ch, &bread); + + if (rc) { + return rc; + } + + if (bread == 0) { + thefile->eof_hit = TRUE; + return APR_EOF; + } + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_file_puts(const char *str, apr_file_t *thefile) +{ + DWORD len = strlen(str); + + return apr_file_write(thefile, str, &len); +} + +APR_DECLARE(apr_status_t) apr_file_gets(char *str, int len, apr_file_t *thefile) +{ + apr_size_t readlen; + apr_status_t rv = APR_SUCCESS; + int i; + + for (i = 0; i < len-1; i++) { + readlen = 1; + rv = apr_file_read(thefile, str+i, &readlen); + + if (rv != APR_SUCCESS && rv != APR_EOF) + return rv; + + if (readlen == 0) { + /* If we have bytes, defer APR_EOF to the next call */ + if (i > 0) + rv = APR_SUCCESS; + break; + } + + if (str[i] == '\n') { + i++; /* don't clobber this char below */ + break; + } + } + str[i] = 0; + return rv; +} + +APR_DECLARE(apr_status_t) apr_file_flush(apr_file_t *thefile) +{ + if (thefile->buffered) { + DWORD written = 0; + apr_status_t rc = 0; + + if (thefile->direction == 1 && thefile->bufpos) { + if (!WriteFile(thefile->filehand, thefile->buffer, thefile->bufpos, &written, NULL)) + rc = apr_get_os_error(); + thefile->filePtr += written; + + if (rc == 0) + thefile->bufpos = 0; + } + + return rc; + } + + /* There isn't anything to do if we aren't buffering the output + * so just return success. + */ + return APR_SUCCESS; +} + +struct apr_file_printf_data { + apr_vformatter_buff_t vbuff; + apr_file_t *fptr; + char *buf; +}; + +static int file_printf_flush(apr_vformatter_buff_t *buff) +{ + struct apr_file_printf_data *data = (struct apr_file_printf_data *)buff; + + if (apr_file_write_full(data->fptr, data->buf, + data->vbuff.curpos - data->buf, NULL)) { + return -1; + } + + data->vbuff.curpos = data->buf; + return 0; +} + +APR_DECLARE_NONSTD(int) apr_file_printf(apr_file_t *fptr, + const char *format, ...) +{ + struct apr_file_printf_data data; + va_list ap; + int count; + + data.buf = malloc(HUGE_STRING_LEN); + if (data.buf == NULL) { + return 0; + } + data.vbuff.curpos = data.buf; + data.vbuff.endpos = data.buf + HUGE_STRING_LEN; + data.fptr = fptr; + va_start(ap, format); + count = apr_vformatter(file_printf_flush, + (apr_vformatter_buff_t *)&data, format, ap); + /* apr_vformatter does not call flush for the last bits */ + if (count >= 0) file_printf_flush((apr_vformatter_buff_t *)&data); + + va_end(ap); + + free(data.buf); + return count; +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/file_io/win32/seek.c b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/win32/seek.c new file mode 100644 index 00000000..3a291485 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/file_io/win32/seek.c @@ -0,0 +1,171 @@ +/* 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. + */ + +#include "win32/apr_arch_file_io.h" +#include "apr_file_io.h" +#include +#include + +static apr_status_t setptr(apr_file_t *thefile, apr_off_t pos ) +{ + apr_off_t newbufpos; + apr_status_t rv; + DWORD rc; + + if (thefile->direction == 1) { + /* XXX: flush here is not mutex protected */ + rv = apr_file_flush(thefile); + if (rv != APR_SUCCESS) + return rv; + thefile->bufpos = thefile->direction = thefile->dataRead = 0; + } + + newbufpos = pos - (thefile->filePtr - thefile->dataRead); + + if (newbufpos >= 0 && newbufpos <= thefile->dataRead) { + thefile->bufpos = (apr_size_t)newbufpos; + rv = APR_SUCCESS; + } else { + DWORD offlo = (DWORD)pos; + DWORD offhi = (DWORD)(pos >> 32); + rc = SetFilePointer(thefile->filehand, offlo, &offhi, FILE_BEGIN); + + if (rc == (DWORD)-1) + /* A legal value, perhaps? MSDN implies prior SetLastError isn't + * needed, googling for SetLastError SetFilePointer seems + * to confirm this. INVALID_SET_FILE_POINTER is too recently + * added for us to rely on it as a constant. + */ + rv = apr_get_os_error(); + else + rv = APR_SUCCESS; + + if (rv == APR_SUCCESS) { + thefile->eof_hit = thefile->bufpos = thefile->dataRead = 0; + thefile->filePtr = pos; + } + } + + return rv; +} + + +APR_DECLARE(apr_status_t) apr_file_seek(apr_file_t *thefile, apr_seek_where_t where, apr_off_t *offset) +{ + apr_finfo_t finfo; + apr_status_t rc = APR_SUCCESS; + + thefile->eof_hit = 0; + + if (thefile->buffered) { + switch (where) { + case APR_SET: + rc = setptr(thefile, *offset); + break; + + case APR_CUR: + rc = setptr(thefile, thefile->filePtr - thefile->dataRead + + thefile->bufpos + *offset); + break; + + case APR_END: + rc = apr_file_info_get(&finfo, APR_FINFO_SIZE, thefile); + if (rc == APR_SUCCESS) + rc = setptr(thefile, finfo.size + *offset); + break; + + default: + return APR_EINVAL; + } + + *offset = thefile->filePtr - thefile->dataRead + thefile->bufpos; + return rc; + } + /* A file opened with APR_XTHREAD has been opened for overlapped i/o. + * APR must explicitly track the file pointer in this case. + */ + else if (thefile->pOverlapped || thefile->flags & APR_XTHREAD) { + switch(where) { + case APR_SET: + thefile->filePtr = *offset; + break; + + case APR_CUR: + thefile->filePtr += *offset; + break; + + case APR_END: + rc = apr_file_info_get(&finfo, APR_FINFO_SIZE, thefile); + if (rc == APR_SUCCESS && finfo.size + *offset >= 0) + thefile->filePtr = finfo.size + *offset; + break; + + default: + return APR_EINVAL; + } + *offset = thefile->filePtr; + return rc; + } + else { + DWORD howmove; + DWORD offlo = (DWORD)*offset; + DWORD offhi = (DWORD)(*offset >> 32); + + switch(where) { + case APR_SET: + howmove = FILE_BEGIN; break; + case APR_CUR: + howmove = FILE_CURRENT; break; + case APR_END: + howmove = FILE_END; break; + default: + return APR_EINVAL; + } + offlo = SetFilePointer(thefile->filehand, (LONG)offlo, + (LONG*)&offhi, howmove); + if (offlo == 0xFFFFFFFF) + rc = apr_get_os_error(); + else + rc = APR_SUCCESS; + /* Since we can land at 0xffffffff we will measure our APR_SUCCESS */ + if (rc == APR_SUCCESS) + *offset = ((apr_off_t)offhi << 32) | offlo; + return rc; + } +} + + +APR_DECLARE(apr_status_t) apr_file_trunc(apr_file_t *thefile, apr_off_t offset) +{ + apr_status_t rv; + DWORD offlo = (DWORD)offset; + DWORD offhi = (DWORD)(offset >> 32); + DWORD rc; + + rc = SetFilePointer(thefile->filehand, offlo, &offhi, FILE_BEGIN); + if (rc == 0xFFFFFFFF) + if ((rv = apr_get_os_error()) != APR_SUCCESS) + return rv; + + if (!SetEndOfFile(thefile->filehand)) + return apr_get_os_error(); + + if (thefile->buffered) { + return setptr(thefile, offset); + } + + return APR_SUCCESS; +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/images/ScanDocBig.jpg b/rubbos/app/httpd-2.0.64/srclib/apr/images/ScanDocBig.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2c47fbc18a370e2e834c976beabbea29686a5efe GIT binary patch literal 5319 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 C{__w3 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/images/ScanDocSmall.jpg b/rubbos/app/httpd-2.0.64/srclib/apr/images/ScanDocSmall.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a10964aa1331c65ee1e06e20a4eb8c1eede4cc87 GIT binary patch literal 2382 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 AqyPW_ literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/images/ball1.png b/rubbos/app/httpd-2.0.64/srclib/apr/images/ball1.png new file mode 100644 index 0000000000000000000000000000000000000000..311d4b3fa7a38ff77d5b8d10adace33143acee99 GIT binary patch literal 499 zcmWNMO=#0l0LPyWjd)pzNI_Wd{wdwdq<*Xt(*qu^Dic90p5qVg|($ zoWqD9^E)VtMRCM~IAKEYAQY>$XmJ};DAOG(wyt`q)We?d$Nz)>@jo4l20g9YTLA!` z&{4m_dK+^)Y++e3+upNUi1oz-wrx|YQA+3>q7Dz1Li5TfQq!p27BY{UqgsK7M87SyLvVh2>0;~Wm z0zn0W3^)xS3=lu@R-Ir6H=GIw{YSj7n!ng6g#3r&=e|S=XVgqj+vXKtHF+{|sCvgC zzjONCwecr=zf&5T-QSsi+?(HFrmpXtilqkj)P|+xvMaYQb-|I2rF4GN>iG+?{y+Yn zEAtP6!KuLy+KYd6eDJh6e=iw$9o#xvl5STo?|ygf)|+N+`o^rUBe2X5k%x(6msTn> zoiE2)!atgcNaOhPualmOB{cT*)4s^r^!-&do@q?F>+6FBpF$+?am(n4_ffnbmBQH* nLswIu`+i0bbbsq^bX9t9rp*QK+Q7!zF7^wA0#W}nX*lyAUsB7^ literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/images/ball2.gif b/rubbos/app/httpd-2.0.64/srclib/apr/images/ball2.gif new file mode 100644 index 0000000000000000000000000000000000000000..9adc11c6473fac16d23a998033587fcd15b834b3 GIT binary patch literal 1014 zcmYk*Pe>F|9KiA4%A!v<;;mUsq13<ryh=SXsN z8^oao;Qv=HEGu$F8DHl_j;~9OEFETtS=lV-x{@U`i))gbHv^_@$g3e^sVo&eL(t1> zoa-UBy1{v&LY@V3J`0#RCTKozHG)(hxQ)<~tpLbwVhAslc+s(=F!qafso5x^55x{w4CV3aTlCgTiO(z75j(2*)J8#qfa zfFU9PFaXUK4A25e&;lxG2rmGrcE|!18G;TfVuAu{fPhLsF$4t^gsVUekdi==7NS4} z!T{lGf1(k9D751Y{7(S+0*xdw^5OKOj#T}=OBZQr``(et=J30L(dCA-mDzY=JpN{? zZn_IfDX(>A{^QBzfluT?N4&r3`ok;VXQQ$C?!>{ldwT{CeJi9Bk@eEE<{S0ZT6^!{ z?UB;v`6tyMi({`Ry4otQWD7fZ|^+sd%87pUw?UGs-^i?Q~S}nhUxg&?pR;<iy*Kt(M9{=T8qBqft2a4{r%bBme*a literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/images/ball2.png b/rubbos/app/httpd-2.0.64/srclib/apr/images/ball2.png new file mode 100644 index 0000000000000000000000000000000000000000..cac3c07ab113a627c1a7d471636a9833d6b15376 GIT binary patch literal 436 zcmV;l0ZaagP)?rLX6Ha*6%T`r7@iUF1lJ_s(OBMc^PWkY^$h{ayqd<4<5qodVAbu z9MrRka9Khc+EVVId`KJ(0OL*v2Sdpb+0l)e#} zzhI_jV#a3VQ3w{)f>>Y+W`c7_kuo zXhRxWXht>p9Df>uguo$?k42;!RDyC)atb6xgGdk#LJoym*1!^&0}~k08b||4AP$77 zpoSQrK?yA6Fc{j9h8CL17xEZSR9TgLKa52rqQWZV>w*GF7G+i@Y!4{ZDv1&+VLkW( zOmxEz><Ty|ZPDLh> zOb*2}Bahw{yuQAnV|4C!Ch;m2-*sZ^a2_2Vh_y`5cXg+eXD8b-TQ(MbO(m0UGc#S4 z@s{4n@yyZgx7)AXUK=Z^pUeJor0r8}-|Fzvo0nDXH~Z=e3hz`u$#0L}J(GU8bSrm? z4*XcHNDf^}Y`oERT_&|EOGvN(QxARaqk_aS|*erm_B_{ZdhlkX>X=5*vA8(nUl v7|gj+a<%_rnkqMykD{|pGs1VIo2f;1qU zX>1H6fUGnyPD?We!Zc%`D3Acr#>Na_Xv_el85sQe&u;@#j7i?^F5=wRX7mF&hdo^! zLn>~S23{9BWWZC*Fg0+hfaC4||AR%`9$HP>Z4+^=K*rF%r*|`J!0WGNi{np3*2`ot zl}M#0iD+iZOl|(-rr_ONB=2=GW2L{O=354)+LxhhN}tTl&-jLENv%=a=NfR|+1X>+ z7k-~@oGYeyy)bQcea*L7=G6A1`Jav{N~~Rc??j$`@0V9!ZhPLWJCd_!R;vwj48yte zwe7c0ZMT*xcstGh^`_%JKb_umm3VGsh;d->W`Dov)*1#gi@31wT>rk>GYbFUI-zNr y{t@UMu@cva66gHf+|;}h2H(V#RE6@)k_-iRPv3yLRN1LO6%3xPelF{r5}E)JCzlQY literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/images/caution.gif b/rubbos/app/httpd-2.0.64/srclib/apr/images/caution.gif new file mode 100644 index 0000000000000000000000000000000000000000..39bac17027fb9519cadf8821790bcd5df31096c3 GIT binary patch literal 923 zcmchWv1`71uGqdf_ENR5WKUdxK$r<>L61bmgZ=Rz#*}TBc@7Wf2*k zVHuhsRrE;rbW7KCsa}gTPqQ>llN!}X^;ApMQ~@a^Qar^{G=&6gpuu98ZmB&L9$^t0 zA+?swJ>0@IT#5xn^Dqn3Fey^>s)t&rh6)@R4e<~Q(Ga%68Zb!15?a()3^veUF)Ssh za>CrzT}mHo$;{l;O-e2-D5|-ttDqiI^tzafx*!ifpvg3LpdS(_gf(E0h9#}=U@_Q0 zgC*r$mB|S;lQI&0tR+)56?{c5EGU|&2|nU92EdDUj7BY1;s-RD#tt|k7=^F~4AM+O z3mz;68)&H$RX1gFLbw=4qK~y?D)l(Z*LLqJwiA}k?JCvVj4s!kcQxAVs3SCmh15vb zO&X5^ZqPgju7r7LYOC5y{O>>We^0EBH#U3s@7%lH8w}U4$^4(0sber&;FJ27NXKNV zGk5Oy?7_p%>+#~&n{WHm$Io_0H*P-vG&#J~e{yAU@ALLay*o2`@nP%nnG3g;C*9qT zI}3vcqociztB=mFetq_K>HE-Ej{G`3T;4p`y|g_$_wM?SwWpW&*53E`Uw(NtIy5b- F{{RLp?QsAA literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/images/caution.png b/rubbos/app/httpd-2.0.64/srclib/apr/images/caution.png new file mode 100644 index 0000000000000000000000000000000000000000..965fe7eb877a16fedbfd0f3d457d0d42632a6430 GIT binary patch literal 217 zcmeAS@N?(olHy`uVBq!ia0vp^f@~ literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/images/master.gif b/rubbos/app/httpd-2.0.64/srclib/apr/images/master.gif new file mode 100644 index 0000000000000000000000000000000000000000..5751a4030bcc1ebba86ee205492f0ac5f5286077 GIT binary patch literal 3955 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 Be&_%I literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/images/tip.gif b/rubbos/app/httpd-2.0.64/srclib/apr/images/tip.gif new file mode 100644 index 0000000000000000000000000000000000000000..2536791237e00566f0fd60f57c8ef684cba54134 GIT binary patch literal 1018 zcmchW%}dmA5XMIgTcQ$VH%JP0Nkywmj7nmJ+d(rhB3pYSP|(5EJZ021Bf?1V&>jXM zJOufYBtn-EBFIdbgV7s>hYm^*-J(MTP0#%Ph`xt~VP>BB%rn33=xjgQ(wC+*eIxRC z=C1DI&h8YEnVY(a8@o{?)m+t8T-lYPR?J0R#D!fbTG^b{S)AFKpyXsu>LgC=gaF!* zh8CJpO))2)nu!^kQH({TYAU8|N%k9Tq8oN# ze?VYEP(uvRphPJ+Fc{j9h8Bf$kw%QiA{0hqKa54hEKKkf>w*GFAr^vR8!hs`S94I z^zp{Q@6`=0*`J$b4R_x+b*G+A?A%+wzB>7-dB^g{@&2_8o%;M^bYyzA(7d(TP#CIR zE7X^_&39HEn0=gY%}Ce!fg|1X__NbZC>!b+)&yxywWjDQ4p O@{FgepUXO@geCy2gM|A4 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/images/warning.gif b/rubbos/app/httpd-2.0.64/srclib/apr/images/warning.gif new file mode 100644 index 0000000000000000000000000000000000000000..5d676d752903ccda75a93ca2d87f781edcd47455 GIT binary patch literal 923 zcmc(eu}ju*5Qp!z26G7CgjyOjDNG`iTQUd1s8=IFkeXUvcstTHp`lj6#V`l)8iF9m zt%#PksHNfB8luUqHQHRdp8Nh2eR-GT?mqY2=YDT*`PQ|$epk-OFOjSlnVxBxnkf}U zWO#;UXoghMBi++2UDKs%Ez&&A(lkw~RU_3?EmczmrIbkV6id+*0<@7vi)N~&=G5~D zi_i$Eu|)3S7Ovq^6eP{VEKI|spr}<3wNMQe7-BtqRr2Zu` zZ1VQh`K5P9pSr_i)Ay%#V^K!W?R`9Z^z+O1$mM&R2cs8cYwX1KhacU^#huByXTJ|- zUVnXlapC3D<3BHM?@q1n4VKp4+}OYRSNDdTRb0zGVRlsmkN3Q;NmG|hkvx3vK)>J7xNDR4&MP6eu9@O1Ta JS?83{1OOUTN-+Qc literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/apr.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr.h new file mode 100644 index 00000000..276e0ab6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr.h @@ -0,0 +1,414 @@ +/* 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. + */ + + +#ifndef APR_H +#define APR_H + +/* GENERATED FILE WARNING! DO NOT EDIT apr.h + * + * You must modify apr.h.in instead. + * + * And please, make an effort to stub apr.hw and apr.hnw in the process. + */ + +/** + * @file apr.h + * @brief APR Platform Definitions + * @remark This is a generated header generated from include/apr.h.in by + * ./configure, or copied from include/apr.hw or include/apr.hnw + * for Win32 or Netware by those build environments, respectively. + */ + +/** + * @defgroup APR Apache Portability Runtime library + * @{ + */ +/** + * @defgroup apr_platform Platform Definitions + * @{ + * @warning + * The actual values of macros and typedefs on this page
    + * are platform specific and should NOT be relied upon!
    + */ + +/* So that we can use inline on some critical functions, and use + * GNUC attributes (such as to get -Wall warnings for printf-like + * functions). Only do this in gcc 2.7 or later ... it may work + * on earlier stuff, but why chance it. + * + * We've since discovered that the gcc shipped with NeXT systems + * as "cc" is completely broken. It claims to be __GNUC__ and so + * on, but it doesn't implement half of the things that __GNUC__ + * means. In particular it's missing inline and the __attribute__ + * stuff. So we hack around it. PR#1613. -djg + */ +#if !defined(__GNUC__) || __GNUC__ < 2 || \ + (__GNUC__ == 2 && __GNUC_MINOR__ < 7) ||\ + defined(NEXT) +#ifndef __attribute__ +#define __attribute__(__x) +#endif +#define APR_INLINE +#define APR_HAS_INLINE 0 +#else +#define APR_INLINE __inline__ +#define APR_HAS_INLINE 1 +#endif + +#define APR_HAVE_ARPA_INET_H 1 +#define APR_HAVE_CONIO_H 0 +#define APR_HAVE_CRYPT_H 1 +#define APR_HAVE_CTYPE_H 1 +#define APR_HAVE_DIRENT_H 1 +#define APR_HAVE_ERRNO_H 1 +#define APR_HAVE_FCNTL_H 1 +#define APR_HAVE_IO_H 0 +#define APR_HAVE_LIMITS_H 1 +#define APR_HAVE_NETDB_H 1 +#define APR_HAVE_NETINET_IN_H 1 +#define APR_HAVE_NETINET_SCTP_H 0 +#define APR_HAVE_NETINET_SCTP_UIO_H 0 +#define APR_HAVE_NETINET_TCP_H 1 +#define APR_HAVE_PTHREAD_H 1 +#define APR_HAVE_SEMAPHORE_H 1 +#define APR_HAVE_SIGNAL_H 1 +#define APR_HAVE_STDARG_H 1 +#define APR_HAVE_STDINT_H 1 +#define APR_HAVE_STDIO_H 1 +#define APR_HAVE_STDLIB_H 1 +#define APR_HAVE_STRING_H 1 +#define APR_HAVE_STRINGS_H 1 +#define APR_HAVE_SYS_IOCTL_H 1 +#define APR_HAVE_SYS_SENDFILE_H 1 +#define APR_HAVE_SYS_SIGNAL_H 1 +#define APR_HAVE_SYS_SOCKET_H 1 +#define APR_HAVE_SYS_SOCKIO_H 0 +#define APR_HAVE_SYS_SYSLIMITS_H 0 +#define APR_HAVE_SYS_TIME_H 1 +#define APR_HAVE_SYS_TYPES_H 1 +#define APR_HAVE_SYS_UIO_H 1 +#define APR_HAVE_SYS_UN_H 1 +#define APR_HAVE_SYS_WAIT_H 1 +#define APR_HAVE_TIME_H 1 +#define APR_HAVE_UNISTD_H 1 + +/** @} */ + +/* We don't include our conditional headers within the doxyblocks + * or the extern "C" namespace + */ + +#if APR_HAVE_SYS_TYPES_H +#include +#endif + +#if APR_HAVE_SYS_SOCKET_H +#include +#endif + +#if defined(__cplusplus) && !defined(__STDC_CONSTANT_MACROS) +/* C99 7.18.4 requires that stdint.h only exposes INT64_C + * and UINT64_C for C++ implementations if this is defined: */ +#define __STDC_CONSTANT_MACROS +#endif + +#if APR_HAVE_STDINT_H +#include +#endif + +#if APR_HAVE_SYS_WAIT_H +#include +#endif + +#ifdef OS2 +#define INCL_DOS +#define INCL_DOSERRORS +#include +#endif + +/* header files for PATH_MAX, _POSIX_PATH_MAX */ +#if APR_HAVE_LIMITS_H +#include +#else +#if APR_HAVE_SYS_SYSLIMITS_H +#include +#endif +#endif + + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @addtogroup apr_platform + * @ingroup APR + * @{ + */ + +#define APR_HAVE_SHMEM_MMAP_TMP 1 +#define APR_HAVE_SHMEM_MMAP_SHM 1 +#define APR_HAVE_SHMEM_MMAP_ZERO 1 +#define APR_HAVE_SHMEM_SHMGET_ANON 1 +#define APR_HAVE_SHMEM_SHMGET 1 +#define APR_HAVE_SHMEM_MMAP_ANON 1 +#define APR_HAVE_SHMEM_BEOS 0 + +#define APR_USE_SHMEM_MMAP_TMP 0 +#define APR_USE_SHMEM_MMAP_SHM 0 +#define APR_USE_SHMEM_MMAP_ZERO 0 +#define APR_USE_SHMEM_SHMGET_ANON 0 +#define APR_USE_SHMEM_SHMGET 1 +#define APR_USE_SHMEM_MMAP_ANON 1 +#define APR_USE_SHMEM_BEOS 0 + +#define APR_USE_FLOCK_SERIALIZE 0 +#define APR_USE_SYSVSEM_SERIALIZE 1 +#define APR_USE_POSIXSEM_SERIALIZE 0 +#define APR_USE_FCNTL_SERIALIZE 0 +#define APR_USE_PROC_PTHREAD_SERIALIZE 0 +#define APR_USE_PTHREAD_SERIALIZE 1 + +#define APR_HAS_FLOCK_SERIALIZE 1 +#define APR_HAS_SYSVSEM_SERIALIZE 1 +#define APR_HAS_POSIXSEM_SERIALIZE 0 +#define APR_HAS_FCNTL_SERIALIZE 1 +#define APR_HAS_PROC_PTHREAD_SERIALIZE 1 +#define APR_HAS_RWLOCK_SERIALIZE 0 + +#define APR_PROCESS_LOCK_IS_GLOBAL 0 + +#define APR_HAVE_CORKABLE_TCP 1 +#define APR_HAVE_GETRLIMIT 1 +#define APR_HAVE_IN_ADDR 1 +#define APR_HAVE_INET_ADDR 1 +#define APR_HAVE_INET_NETWORK 1 +#define APR_HAVE_IPV6 1 +#define APR_HAVE_MEMMOVE 1 +#define APR_HAVE_SETRLIMIT 1 +#define APR_HAVE_SIGACTION 1 +#define APR_HAVE_SIGSUSPEND 1 +#define APR_HAVE_SIGWAIT 1 +#define APR_HAVE_STRCASECMP 1 +#define APR_HAVE_STRDUP 1 +#define APR_HAVE_STRICMP 0 +#define APR_HAVE_STRNCASECMP 1 +#define APR_HAVE_STRNICMP 0 +#define APR_HAVE_STRSTR 1 +#define APR_HAVE_MEMCHR 1 +#define APR_HAVE_STRUCT_RLIMIT 1 +#define APR_HAVE_UNION_SEMUN 0 +#define APR_HAVE_SCTP 0 + +/* APR Feature Macros */ +#define APR_HAS_SHARED_MEMORY 1 +#define APR_HAS_THREADS 1 +#define APR_HAS_SENDFILE 1 +#define APR_HAS_MMAP 1 +#define APR_HAS_FORK 1 +#define APR_HAS_RANDOM 1 +#define APR_HAS_OTHER_CHILD 1 +#define APR_HAS_DSO 1 +#define APR_HAS_SO_ACCEPTFILTER 0 +#define APR_HAS_UNICODE_FS 0 +#define APR_HAS_PROC_INVOKED 0 +#define APR_HAS_USER 1 +#define APR_HAS_LARGE_FILES 0 +#define APR_HAS_XTHREAD_FILES 0 +#define APR_HAS_OS_UUID 0 + +/* APR sets APR_FILES_AS_SOCKETS to 1 on systems where it is possible + * to poll on files/pipes. On such a system, the application can + * call apr_socket_from_file() to get an APR socket representation and + * then pass the socket representation to apr_poll_socket_add(). + */ +#define APR_FILES_AS_SOCKETS 1 + +/* Not all platforms have a real INADDR_NONE. This macro replaces INADDR_NONE + * on all platforms. + */ +#define APR_INADDR_NONE INADDR_NONE + +/* This macro indicates whether or not EBCDIC is the native character set. + */ +#define APR_CHARSET_EBCDIC 0 + +/* If we have a TCP implementation that can be "corked", what flag + * do we use? + */ +#define APR_TCP_NOPUSH_FLAG TCP_CORK + +/* Is the TCP_NODELAY socket option inherited from listening sockets? +*/ +#define APR_TCP_NODELAY_INHERITED 1 + +/* Is the O_NONBLOCK flag inherited from listening sockets? +*/ +#define APR_O_NONBLOCK_INHERITED 0 + +/* Typedefs that APR needs. */ + +typedef unsigned char apr_byte_t; + +typedef short apr_int16_t; +typedef unsigned short apr_uint16_t; + +typedef int apr_int32_t; +typedef unsigned int apr_uint32_t; + +typedef long apr_int64_t; +typedef unsigned long apr_uint64_t; + +typedef size_t apr_size_t; +typedef ssize_t apr_ssize_t; +typedef off_t apr_off_t; +typedef socklen_t apr_socklen_t; + +typedef unsigned long apr_ino_t; + +#define APR_SIZEOF_VOIDP 8 + +/* Mechanisms to properly type numeric literals */ +#define APR_INT64_C(val) INT64_C(val) + +/* Definitions that APR programs need to work properly. */ + +/** + * Thread callbacks from APR functions must be declared with APR_THREAD_FUNC, + * so that they follow the platform's calling convention. + * @example + */ +/** void* APR_THREAD_FUNC my_thread_entry_fn(apr_thread_t *thd, void *data); + */ +#define APR_THREAD_FUNC + +/** + * The public APR functions are declared with APR_DECLARE(), so they may + * use the most appropriate calling convention. Public APR functions with + * variable arguments must use APR_DECLARE_NONSTD(). + * + * @remark Both the declaration and implementations must use the same macro. + * @example + */ +/** APR_DECLARE(rettype) apr_func(args) + * @see APR_DECLARE_NONSTD @see APR_DECLARE_DATA + * @remark Note that when APR compiles the library itself, it passes the + * symbol -DAPR_DECLARE_EXPORT to the compiler on some platforms (e.g. Win32) + * to export public symbols from the dynamic library build.\n + * The user must define the APR_DECLARE_STATIC when compiling to target + * the static APR library on some platforms (e.g. Win32.) The public symbols + * are neither exported nor imported when APR_DECLARE_STATIC is defined.\n + * By default, compiling an application and including the APR public + * headers, without defining APR_DECLARE_STATIC, will prepare the code to be + * linked to the dynamic library. + */ +#define APR_DECLARE(type) type + +/** + * The public APR functions using variable arguments are declared with + * APR_DECLARE_NONSTD(), as they must follow the C language calling convention. + * @see APR_DECLARE @see APR_DECLARE_DATA + * @remark Both the declaration and implementations must use the same macro. + * @example + */ +/** APR_DECLARE_NONSTD(rettype) apr_func(args, ...); + */ +#define APR_DECLARE_NONSTD(type) type + +/** + * The public APR variables are declared with AP_MODULE_DECLARE_DATA. + * This assures the appropriate indirection is invoked at compile time. + * @see APR_DECLARE @see APR_DECLARE_NONSTD + * @remark Note that the declaration and implementations use different forms, + * but both must include the macro. + * @example + */ +/** extern APR_DECLARE_DATA type apr_variable;\n + * APR_DECLARE_DATA type apr_variable = value; + */ +#define APR_DECLARE_DATA + +/* Define APR_SSIZE_T_FMT. + * If ssize_t is an integer we define it to be "d", + * if ssize_t is a long int we define it to be "ld", + * if ssize_t is neither we declare an error here. + * I looked for a better way to define this here, but couldn't find one, so + * to find the logic for this definition search for "ssize_t_fmt" in + * configure.in. + */ +#define APR_SSIZE_T_FMT "ld" + +/* And APR_SIZE_T_FMT */ +#define APR_SIZE_T_FMT "ld" + +/* And APR_OFF_T_FMT */ +#define APR_OFF_T_FMT "ld" + +/* And APR_PID_T_FMT */ +#define APR_PID_T_FMT "d" + +/* And APR_INT64_T_FMT */ +#define APR_INT64_T_FMT "ld" +#define APR_INT64_T_FMT_LEN 2 + +/* And APR_UINT64_T_FMT */ +#define APR_UINT64_T_FMT "lu" +#define APR_UINT64_T_FMT_LEN 2 + +/* And APR_UINT64_T_HEX_FMT */ +#define APR_UINT64_T_HEX_FMT "lx" +#define APR_UINT64_T_HEX_FMT_LEN (sizeof(APR_UINT64_T_HEX_FMT) - 1) + +/* Deal with atoi64 variables ... these should move to apr_private.h */ +#define APR_HAVE_INT64_STRFN 1 +#define APR_INT64_STRFN strtol + +/* are we going to force the generic atomic operations */ +#define APR_FORCE_ATOMIC_GENERIC 1 + +/* Does the proc mutex lock threads too */ +#define APR_PROC_MUTEX_IS_GLOBAL 0 + +/* Local machine definition for console and log output. */ +#define APR_EOL_STR "\n" + + +#if APR_HAVE_SYS_WAIT_H +#ifdef WEXITSTATUS +#define apr_wait_t int +#else +#define apr_wait_t union wait +#define WEXITSTATUS(status) (int)((status).w_retcode) +#define WTERMSIG(status) (int)((status).w_termsig) +#endif /* !WEXITSTATUS */ +#endif /* HAVE_SYS_WAIT_H */ + +#if defined(PATH_MAX) +#define APR_PATH_MAX PATH_MAX +#elif defined(_POSIX_PATH_MAX) +#define APR_PATH_MAX _POSIX_PATH_MAX +#else +#error no decision has been made on APR_PATH_MAX for your platform +#endif + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* APR_H */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/apr.h.in b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr.h.in new file mode 100644 index 00000000..e6dfdc29 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr.h.in @@ -0,0 +1,414 @@ +/* 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. + */ + + +#ifndef APR_H +#define APR_H + +/* GENERATED FILE WARNING! DO NOT EDIT apr.h + * + * You must modify apr.h.in instead. + * + * And please, make an effort to stub apr.hw and apr.hnw in the process. + */ + +/** + * @file apr.h + * @brief APR Platform Definitions + * @remark This is a generated header generated from include/apr.h.in by + * ./configure, or copied from include/apr.hw or include/apr.hnw + * for Win32 or Netware by those build environments, respectively. + */ + +/** + * @defgroup APR Apache Portability Runtime library + * @{ + */ +/** + * @defgroup apr_platform Platform Definitions + * @{ + * @warning + * The actual values of macros and typedefs on this page
    + * are platform specific and should NOT be relied upon!
    + */ + +/* So that we can use inline on some critical functions, and use + * GNUC attributes (such as to get -Wall warnings for printf-like + * functions). Only do this in gcc 2.7 or later ... it may work + * on earlier stuff, but why chance it. + * + * We've since discovered that the gcc shipped with NeXT systems + * as "cc" is completely broken. It claims to be __GNUC__ and so + * on, but it doesn't implement half of the things that __GNUC__ + * means. In particular it's missing inline and the __attribute__ + * stuff. So we hack around it. PR#1613. -djg + */ +#if !defined(__GNUC__) || __GNUC__ < 2 || \ + (__GNUC__ == 2 && __GNUC_MINOR__ < 7) ||\ + defined(NEXT) +#ifndef __attribute__ +#define __attribute__(__x) +#endif +#define APR_INLINE +#define APR_HAS_INLINE 0 +#else +#define APR_INLINE __inline__ +#define APR_HAS_INLINE 1 +#endif + +#define APR_HAVE_ARPA_INET_H @arpa_ineth@ +#define APR_HAVE_CONIO_H @conioh@ +#define APR_HAVE_CRYPT_H @crypth@ +#define APR_HAVE_CTYPE_H @ctypeh@ +#define APR_HAVE_DIRENT_H @direnth@ +#define APR_HAVE_ERRNO_H @errnoh@ +#define APR_HAVE_FCNTL_H @fcntlh@ +#define APR_HAVE_IO_H @ioh@ +#define APR_HAVE_LIMITS_H @limitsh@ +#define APR_HAVE_NETDB_H @netdbh@ +#define APR_HAVE_NETINET_IN_H @netinet_inh@ +#define APR_HAVE_NETINET_SCTP_H @netinet_sctph@ +#define APR_HAVE_NETINET_SCTP_UIO_H @netinet_sctp_uioh@ +#define APR_HAVE_NETINET_TCP_H @netinet_tcph@ +#define APR_HAVE_PTHREAD_H @pthreadh@ +#define APR_HAVE_SEMAPHORE_H @semaphoreh@ +#define APR_HAVE_SIGNAL_H @signalh@ +#define APR_HAVE_STDARG_H @stdargh@ +#define APR_HAVE_STDINT_H @stdint@ +#define APR_HAVE_STDIO_H @stdioh@ +#define APR_HAVE_STDLIB_H @stdlibh@ +#define APR_HAVE_STRING_H @stringh@ +#define APR_HAVE_STRINGS_H @stringsh@ +#define APR_HAVE_SYS_IOCTL_H @sys_ioctlh@ +#define APR_HAVE_SYS_SENDFILE_H @sys_sendfileh@ +#define APR_HAVE_SYS_SIGNAL_H @sys_signalh@ +#define APR_HAVE_SYS_SOCKET_H @sys_socketh@ +#define APR_HAVE_SYS_SOCKIO_H @sys_sockioh@ +#define APR_HAVE_SYS_SYSLIMITS_H @sys_syslimitsh@ +#define APR_HAVE_SYS_TIME_H @sys_timeh@ +#define APR_HAVE_SYS_TYPES_H @sys_typesh@ +#define APR_HAVE_SYS_UIO_H @sys_uioh@ +#define APR_HAVE_SYS_UN_H @sys_unh@ +#define APR_HAVE_SYS_WAIT_H @sys_waith@ +#define APR_HAVE_TIME_H @timeh@ +#define APR_HAVE_UNISTD_H @unistdh@ + +/** @} */ + +/* We don't include our conditional headers within the doxyblocks + * or the extern "C" namespace + */ + +#if APR_HAVE_SYS_TYPES_H +#include +#endif + +#if APR_HAVE_SYS_SOCKET_H +#include +#endif + +#if defined(__cplusplus) && !defined(__STDC_CONSTANT_MACROS) +/* C99 7.18.4 requires that stdint.h only exposes INT64_C + * and UINT64_C for C++ implementations if this is defined: */ +#define __STDC_CONSTANT_MACROS +#endif + +#if APR_HAVE_STDINT_H +#include +#endif + +#if APR_HAVE_SYS_WAIT_H +#include +#endif + +#ifdef OS2 +#define INCL_DOS +#define INCL_DOSERRORS +#include +#endif + +/* header files for PATH_MAX, _POSIX_PATH_MAX */ +#if APR_HAVE_LIMITS_H +#include +#else +#if APR_HAVE_SYS_SYSLIMITS_H +#include +#endif +#endif + + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @addtogroup apr_platform + * @ingroup APR + * @{ + */ + +#define APR_HAVE_SHMEM_MMAP_TMP @havemmaptmp@ +#define APR_HAVE_SHMEM_MMAP_SHM @havemmapshm@ +#define APR_HAVE_SHMEM_MMAP_ZERO @havemmapzero@ +#define APR_HAVE_SHMEM_SHMGET_ANON @haveshmgetanon@ +#define APR_HAVE_SHMEM_SHMGET @haveshmget@ +#define APR_HAVE_SHMEM_MMAP_ANON @havemmapanon@ +#define APR_HAVE_SHMEM_BEOS @havebeosarea@ + +#define APR_USE_SHMEM_MMAP_TMP @usemmaptmp@ +#define APR_USE_SHMEM_MMAP_SHM @usemmapshm@ +#define APR_USE_SHMEM_MMAP_ZERO @usemmapzero@ +#define APR_USE_SHMEM_SHMGET_ANON @useshmgetanon@ +#define APR_USE_SHMEM_SHMGET @useshmget@ +#define APR_USE_SHMEM_MMAP_ANON @usemmapanon@ +#define APR_USE_SHMEM_BEOS @usebeosarea@ + +#define APR_USE_FLOCK_SERIALIZE @flockser@ +#define APR_USE_SYSVSEM_SERIALIZE @sysvser@ +#define APR_USE_POSIXSEM_SERIALIZE @posixser@ +#define APR_USE_FCNTL_SERIALIZE @fcntlser@ +#define APR_USE_PROC_PTHREAD_SERIALIZE @procpthreadser@ +#define APR_USE_PTHREAD_SERIALIZE @pthreadser@ + +#define APR_HAS_FLOCK_SERIALIZE @hasflockser@ +#define APR_HAS_SYSVSEM_SERIALIZE @hassysvser@ +#define APR_HAS_POSIXSEM_SERIALIZE @hasposixser@ +#define APR_HAS_FCNTL_SERIALIZE @hasfcntlser@ +#define APR_HAS_PROC_PTHREAD_SERIALIZE @hasprocpthreadser@ +#define APR_HAS_RWLOCK_SERIALIZE @hasrwlockser@ + +#define APR_PROCESS_LOCK_IS_GLOBAL @proclockglobal@ + +#define APR_HAVE_CORKABLE_TCP @have_corkable_tcp@ +#define APR_HAVE_GETRLIMIT @have_getrlimit@ +#define APR_HAVE_IN_ADDR @have_in_addr@ +#define APR_HAVE_INET_ADDR @have_inet_addr@ +#define APR_HAVE_INET_NETWORK @have_inet_network@ +#define APR_HAVE_IPV6 @have_ipv6@ +#define APR_HAVE_MEMMOVE @have_memmove@ +#define APR_HAVE_SETRLIMIT @have_setrlimit@ +#define APR_HAVE_SIGACTION @have_sigaction@ +#define APR_HAVE_SIGSUSPEND @have_sigsuspend@ +#define APR_HAVE_SIGWAIT @have_sigwait@ +#define APR_HAVE_STRCASECMP @have_strcasecmp@ +#define APR_HAVE_STRDUP @have_strdup@ +#define APR_HAVE_STRICMP @have_stricmp@ +#define APR_HAVE_STRNCASECMP @have_strncasecmp@ +#define APR_HAVE_STRNICMP @have_strnicmp@ +#define APR_HAVE_STRSTR @have_strstr@ +#define APR_HAVE_MEMCHR @have_memchr@ +#define APR_HAVE_STRUCT_RLIMIT @struct_rlimit@ +#define APR_HAVE_UNION_SEMUN @have_union_semun@ +#define APR_HAVE_SCTP @have_sctp@ + +/* APR Feature Macros */ +#define APR_HAS_SHARED_MEMORY @sharedmem@ +#define APR_HAS_THREADS @threads@ +#define APR_HAS_SENDFILE @sendfile@ +#define APR_HAS_MMAP @mmap@ +#define APR_HAS_FORK @fork@ +#define APR_HAS_RANDOM @rand@ +#define APR_HAS_OTHER_CHILD @oc@ +#define APR_HAS_DSO @aprdso@ +#define APR_HAS_SO_ACCEPTFILTER @acceptfilter@ +#define APR_HAS_UNICODE_FS 0 +#define APR_HAS_PROC_INVOKED 0 +#define APR_HAS_USER 1 +#define APR_HAS_LARGE_FILES 0 +#define APR_HAS_XTHREAD_FILES 0 +#define APR_HAS_OS_UUID 0 + +/* APR sets APR_FILES_AS_SOCKETS to 1 on systems where it is possible + * to poll on files/pipes. On such a system, the application can + * call apr_socket_from_file() to get an APR socket representation and + * then pass the socket representation to apr_poll_socket_add(). + */ +#define APR_FILES_AS_SOCKETS @file_as_socket@ + +/* Not all platforms have a real INADDR_NONE. This macro replaces INADDR_NONE + * on all platforms. + */ +#define APR_INADDR_NONE @apr_inaddr_none@ + +/* This macro indicates whether or not EBCDIC is the native character set. + */ +#define APR_CHARSET_EBCDIC @apr_charset_ebcdic@ + +/* If we have a TCP implementation that can be "corked", what flag + * do we use? + */ +#define APR_TCP_NOPUSH_FLAG @apr_tcp_nopush_flag@ + +/* Is the TCP_NODELAY socket option inherited from listening sockets? +*/ +#define APR_TCP_NODELAY_INHERITED @tcp_nodelay_inherited@ + +/* Is the O_NONBLOCK flag inherited from listening sockets? +*/ +#define APR_O_NONBLOCK_INHERITED @o_nonblock_inherited@ + +/* Typedefs that APR needs. */ + +typedef unsigned char apr_byte_t; + +typedef @short_value@ apr_int16_t; +typedef unsigned @short_value@ apr_uint16_t; + +typedef @int_value@ apr_int32_t; +typedef unsigned @int_value@ apr_uint32_t; + +typedef @long_value@ apr_int64_t; +typedef unsigned @long_value@ apr_uint64_t; + +typedef @size_t_value@ apr_size_t; +typedef @ssize_t_value@ apr_ssize_t; +typedef @off_t_value@ apr_off_t; +typedef @socklen_t_value@ apr_socklen_t; + +typedef @ino_t_value@ apr_ino_t; + +#define APR_SIZEOF_VOIDP @voidp_size@ + +/* Mechanisms to properly type numeric literals */ +@int64_literal@ + +/* Definitions that APR programs need to work properly. */ + +/** + * Thread callbacks from APR functions must be declared with APR_THREAD_FUNC, + * so that they follow the platform's calling convention. + * @example + */ +/** void* APR_THREAD_FUNC my_thread_entry_fn(apr_thread_t *thd, void *data); + */ +#define APR_THREAD_FUNC + +/** + * The public APR functions are declared with APR_DECLARE(), so they may + * use the most appropriate calling convention. Public APR functions with + * variable arguments must use APR_DECLARE_NONSTD(). + * + * @remark Both the declaration and implementations must use the same macro. + * @example + */ +/** APR_DECLARE(rettype) apr_func(args) + * @see APR_DECLARE_NONSTD @see APR_DECLARE_DATA + * @remark Note that when APR compiles the library itself, it passes the + * symbol -DAPR_DECLARE_EXPORT to the compiler on some platforms (e.g. Win32) + * to export public symbols from the dynamic library build.\n + * The user must define the APR_DECLARE_STATIC when compiling to target + * the static APR library on some platforms (e.g. Win32.) The public symbols + * are neither exported nor imported when APR_DECLARE_STATIC is defined.\n + * By default, compiling an application and including the APR public + * headers, without defining APR_DECLARE_STATIC, will prepare the code to be + * linked to the dynamic library. + */ +#define APR_DECLARE(type) type + +/** + * The public APR functions using variable arguments are declared with + * APR_DECLARE_NONSTD(), as they must follow the C language calling convention. + * @see APR_DECLARE @see APR_DECLARE_DATA + * @remark Both the declaration and implementations must use the same macro. + * @example + */ +/** APR_DECLARE_NONSTD(rettype) apr_func(args, ...); + */ +#define APR_DECLARE_NONSTD(type) type + +/** + * The public APR variables are declared with AP_MODULE_DECLARE_DATA. + * This assures the appropriate indirection is invoked at compile time. + * @see APR_DECLARE @see APR_DECLARE_NONSTD + * @remark Note that the declaration and implementations use different forms, + * but both must include the macro. + * @example + */ +/** extern APR_DECLARE_DATA type apr_variable;\n + * APR_DECLARE_DATA type apr_variable = value; + */ +#define APR_DECLARE_DATA + +/* Define APR_SSIZE_T_FMT. + * If ssize_t is an integer we define it to be "d", + * if ssize_t is a long int we define it to be "ld", + * if ssize_t is neither we declare an error here. + * I looked for a better way to define this here, but couldn't find one, so + * to find the logic for this definition search for "ssize_t_fmt" in + * configure.in. + */ +@ssize_t_fmt@ + +/* And APR_SIZE_T_FMT */ +@size_t_fmt@ + +/* And APR_OFF_T_FMT */ +@off_t_fmt@ + +/* And APR_PID_T_FMT */ +@pid_t_fmt@ + +/* And APR_INT64_T_FMT */ +@int64_t_fmt@ +@int64_t_fmt_len@ + +/* And APR_UINT64_T_FMT */ +@uint64_t_fmt@ +@uint64_t_fmt_len@ + +/* And APR_UINT64_T_HEX_FMT */ +@uint64_t_hex_fmt@ +#define APR_UINT64_T_HEX_FMT_LEN (sizeof(APR_UINT64_T_HEX_FMT) - 1) + +/* Deal with atoi64 variables ... these should move to apr_private.h */ +#define APR_HAVE_INT64_STRFN @have_int64_strfn@ +#define APR_INT64_STRFN @int64_strfn@ + +/* are we going to force the generic atomic operations */ +#define APR_FORCE_ATOMIC_GENERIC @apr_force_atomic_generic@ + +/* Does the proc mutex lock threads too */ +#define APR_PROC_MUTEX_IS_GLOBAL @proc_mutex_is_global@ + +/* Local machine definition for console and log output. */ +#define APR_EOL_STR "@eolstr@" + + +#if APR_HAVE_SYS_WAIT_H +#ifdef WEXITSTATUS +#define apr_wait_t int +#else +#define apr_wait_t union wait +#define WEXITSTATUS(status) (int)((status).w_retcode) +#define WTERMSIG(status) (int)((status).w_termsig) +#endif /* !WEXITSTATUS */ +#endif /* HAVE_SYS_WAIT_H */ + +#if defined(PATH_MAX) +#define APR_PATH_MAX PATH_MAX +#elif defined(_POSIX_PATH_MAX) +#define APR_PATH_MAX _POSIX_PATH_MAX +#else +#error no decision has been made on APR_PATH_MAX for your platform +#endif + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* APR_H */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/apr.h.save b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr.h.save new file mode 100644 index 00000000..276e0ab6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr.h.save @@ -0,0 +1,414 @@ +/* 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. + */ + + +#ifndef APR_H +#define APR_H + +/* GENERATED FILE WARNING! DO NOT EDIT apr.h + * + * You must modify apr.h.in instead. + * + * And please, make an effort to stub apr.hw and apr.hnw in the process. + */ + +/** + * @file apr.h + * @brief APR Platform Definitions + * @remark This is a generated header generated from include/apr.h.in by + * ./configure, or copied from include/apr.hw or include/apr.hnw + * for Win32 or Netware by those build environments, respectively. + */ + +/** + * @defgroup APR Apache Portability Runtime library + * @{ + */ +/** + * @defgroup apr_platform Platform Definitions + * @{ + * @warning + * The actual values of macros and typedefs on this page
    + * are platform specific and should NOT be relied upon!
    + */ + +/* So that we can use inline on some critical functions, and use + * GNUC attributes (such as to get -Wall warnings for printf-like + * functions). Only do this in gcc 2.7 or later ... it may work + * on earlier stuff, but why chance it. + * + * We've since discovered that the gcc shipped with NeXT systems + * as "cc" is completely broken. It claims to be __GNUC__ and so + * on, but it doesn't implement half of the things that __GNUC__ + * means. In particular it's missing inline and the __attribute__ + * stuff. So we hack around it. PR#1613. -djg + */ +#if !defined(__GNUC__) || __GNUC__ < 2 || \ + (__GNUC__ == 2 && __GNUC_MINOR__ < 7) ||\ + defined(NEXT) +#ifndef __attribute__ +#define __attribute__(__x) +#endif +#define APR_INLINE +#define APR_HAS_INLINE 0 +#else +#define APR_INLINE __inline__ +#define APR_HAS_INLINE 1 +#endif + +#define APR_HAVE_ARPA_INET_H 1 +#define APR_HAVE_CONIO_H 0 +#define APR_HAVE_CRYPT_H 1 +#define APR_HAVE_CTYPE_H 1 +#define APR_HAVE_DIRENT_H 1 +#define APR_HAVE_ERRNO_H 1 +#define APR_HAVE_FCNTL_H 1 +#define APR_HAVE_IO_H 0 +#define APR_HAVE_LIMITS_H 1 +#define APR_HAVE_NETDB_H 1 +#define APR_HAVE_NETINET_IN_H 1 +#define APR_HAVE_NETINET_SCTP_H 0 +#define APR_HAVE_NETINET_SCTP_UIO_H 0 +#define APR_HAVE_NETINET_TCP_H 1 +#define APR_HAVE_PTHREAD_H 1 +#define APR_HAVE_SEMAPHORE_H 1 +#define APR_HAVE_SIGNAL_H 1 +#define APR_HAVE_STDARG_H 1 +#define APR_HAVE_STDINT_H 1 +#define APR_HAVE_STDIO_H 1 +#define APR_HAVE_STDLIB_H 1 +#define APR_HAVE_STRING_H 1 +#define APR_HAVE_STRINGS_H 1 +#define APR_HAVE_SYS_IOCTL_H 1 +#define APR_HAVE_SYS_SENDFILE_H 1 +#define APR_HAVE_SYS_SIGNAL_H 1 +#define APR_HAVE_SYS_SOCKET_H 1 +#define APR_HAVE_SYS_SOCKIO_H 0 +#define APR_HAVE_SYS_SYSLIMITS_H 0 +#define APR_HAVE_SYS_TIME_H 1 +#define APR_HAVE_SYS_TYPES_H 1 +#define APR_HAVE_SYS_UIO_H 1 +#define APR_HAVE_SYS_UN_H 1 +#define APR_HAVE_SYS_WAIT_H 1 +#define APR_HAVE_TIME_H 1 +#define APR_HAVE_UNISTD_H 1 + +/** @} */ + +/* We don't include our conditional headers within the doxyblocks + * or the extern "C" namespace + */ + +#if APR_HAVE_SYS_TYPES_H +#include +#endif + +#if APR_HAVE_SYS_SOCKET_H +#include +#endif + +#if defined(__cplusplus) && !defined(__STDC_CONSTANT_MACROS) +/* C99 7.18.4 requires that stdint.h only exposes INT64_C + * and UINT64_C for C++ implementations if this is defined: */ +#define __STDC_CONSTANT_MACROS +#endif + +#if APR_HAVE_STDINT_H +#include +#endif + +#if APR_HAVE_SYS_WAIT_H +#include +#endif + +#ifdef OS2 +#define INCL_DOS +#define INCL_DOSERRORS +#include +#endif + +/* header files for PATH_MAX, _POSIX_PATH_MAX */ +#if APR_HAVE_LIMITS_H +#include +#else +#if APR_HAVE_SYS_SYSLIMITS_H +#include +#endif +#endif + + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @addtogroup apr_platform + * @ingroup APR + * @{ + */ + +#define APR_HAVE_SHMEM_MMAP_TMP 1 +#define APR_HAVE_SHMEM_MMAP_SHM 1 +#define APR_HAVE_SHMEM_MMAP_ZERO 1 +#define APR_HAVE_SHMEM_SHMGET_ANON 1 +#define APR_HAVE_SHMEM_SHMGET 1 +#define APR_HAVE_SHMEM_MMAP_ANON 1 +#define APR_HAVE_SHMEM_BEOS 0 + +#define APR_USE_SHMEM_MMAP_TMP 0 +#define APR_USE_SHMEM_MMAP_SHM 0 +#define APR_USE_SHMEM_MMAP_ZERO 0 +#define APR_USE_SHMEM_SHMGET_ANON 0 +#define APR_USE_SHMEM_SHMGET 1 +#define APR_USE_SHMEM_MMAP_ANON 1 +#define APR_USE_SHMEM_BEOS 0 + +#define APR_USE_FLOCK_SERIALIZE 0 +#define APR_USE_SYSVSEM_SERIALIZE 1 +#define APR_USE_POSIXSEM_SERIALIZE 0 +#define APR_USE_FCNTL_SERIALIZE 0 +#define APR_USE_PROC_PTHREAD_SERIALIZE 0 +#define APR_USE_PTHREAD_SERIALIZE 1 + +#define APR_HAS_FLOCK_SERIALIZE 1 +#define APR_HAS_SYSVSEM_SERIALIZE 1 +#define APR_HAS_POSIXSEM_SERIALIZE 0 +#define APR_HAS_FCNTL_SERIALIZE 1 +#define APR_HAS_PROC_PTHREAD_SERIALIZE 1 +#define APR_HAS_RWLOCK_SERIALIZE 0 + +#define APR_PROCESS_LOCK_IS_GLOBAL 0 + +#define APR_HAVE_CORKABLE_TCP 1 +#define APR_HAVE_GETRLIMIT 1 +#define APR_HAVE_IN_ADDR 1 +#define APR_HAVE_INET_ADDR 1 +#define APR_HAVE_INET_NETWORK 1 +#define APR_HAVE_IPV6 1 +#define APR_HAVE_MEMMOVE 1 +#define APR_HAVE_SETRLIMIT 1 +#define APR_HAVE_SIGACTION 1 +#define APR_HAVE_SIGSUSPEND 1 +#define APR_HAVE_SIGWAIT 1 +#define APR_HAVE_STRCASECMP 1 +#define APR_HAVE_STRDUP 1 +#define APR_HAVE_STRICMP 0 +#define APR_HAVE_STRNCASECMP 1 +#define APR_HAVE_STRNICMP 0 +#define APR_HAVE_STRSTR 1 +#define APR_HAVE_MEMCHR 1 +#define APR_HAVE_STRUCT_RLIMIT 1 +#define APR_HAVE_UNION_SEMUN 0 +#define APR_HAVE_SCTP 0 + +/* APR Feature Macros */ +#define APR_HAS_SHARED_MEMORY 1 +#define APR_HAS_THREADS 1 +#define APR_HAS_SENDFILE 1 +#define APR_HAS_MMAP 1 +#define APR_HAS_FORK 1 +#define APR_HAS_RANDOM 1 +#define APR_HAS_OTHER_CHILD 1 +#define APR_HAS_DSO 1 +#define APR_HAS_SO_ACCEPTFILTER 0 +#define APR_HAS_UNICODE_FS 0 +#define APR_HAS_PROC_INVOKED 0 +#define APR_HAS_USER 1 +#define APR_HAS_LARGE_FILES 0 +#define APR_HAS_XTHREAD_FILES 0 +#define APR_HAS_OS_UUID 0 + +/* APR sets APR_FILES_AS_SOCKETS to 1 on systems where it is possible + * to poll on files/pipes. On such a system, the application can + * call apr_socket_from_file() to get an APR socket representation and + * then pass the socket representation to apr_poll_socket_add(). + */ +#define APR_FILES_AS_SOCKETS 1 + +/* Not all platforms have a real INADDR_NONE. This macro replaces INADDR_NONE + * on all platforms. + */ +#define APR_INADDR_NONE INADDR_NONE + +/* This macro indicates whether or not EBCDIC is the native character set. + */ +#define APR_CHARSET_EBCDIC 0 + +/* If we have a TCP implementation that can be "corked", what flag + * do we use? + */ +#define APR_TCP_NOPUSH_FLAG TCP_CORK + +/* Is the TCP_NODELAY socket option inherited from listening sockets? +*/ +#define APR_TCP_NODELAY_INHERITED 1 + +/* Is the O_NONBLOCK flag inherited from listening sockets? +*/ +#define APR_O_NONBLOCK_INHERITED 0 + +/* Typedefs that APR needs. */ + +typedef unsigned char apr_byte_t; + +typedef short apr_int16_t; +typedef unsigned short apr_uint16_t; + +typedef int apr_int32_t; +typedef unsigned int apr_uint32_t; + +typedef long apr_int64_t; +typedef unsigned long apr_uint64_t; + +typedef size_t apr_size_t; +typedef ssize_t apr_ssize_t; +typedef off_t apr_off_t; +typedef socklen_t apr_socklen_t; + +typedef unsigned long apr_ino_t; + +#define APR_SIZEOF_VOIDP 8 + +/* Mechanisms to properly type numeric literals */ +#define APR_INT64_C(val) INT64_C(val) + +/* Definitions that APR programs need to work properly. */ + +/** + * Thread callbacks from APR functions must be declared with APR_THREAD_FUNC, + * so that they follow the platform's calling convention. + * @example + */ +/** void* APR_THREAD_FUNC my_thread_entry_fn(apr_thread_t *thd, void *data); + */ +#define APR_THREAD_FUNC + +/** + * The public APR functions are declared with APR_DECLARE(), so they may + * use the most appropriate calling convention. Public APR functions with + * variable arguments must use APR_DECLARE_NONSTD(). + * + * @remark Both the declaration and implementations must use the same macro. + * @example + */ +/** APR_DECLARE(rettype) apr_func(args) + * @see APR_DECLARE_NONSTD @see APR_DECLARE_DATA + * @remark Note that when APR compiles the library itself, it passes the + * symbol -DAPR_DECLARE_EXPORT to the compiler on some platforms (e.g. Win32) + * to export public symbols from the dynamic library build.\n + * The user must define the APR_DECLARE_STATIC when compiling to target + * the static APR library on some platforms (e.g. Win32.) The public symbols + * are neither exported nor imported when APR_DECLARE_STATIC is defined.\n + * By default, compiling an application and including the APR public + * headers, without defining APR_DECLARE_STATIC, will prepare the code to be + * linked to the dynamic library. + */ +#define APR_DECLARE(type) type + +/** + * The public APR functions using variable arguments are declared with + * APR_DECLARE_NONSTD(), as they must follow the C language calling convention. + * @see APR_DECLARE @see APR_DECLARE_DATA + * @remark Both the declaration and implementations must use the same macro. + * @example + */ +/** APR_DECLARE_NONSTD(rettype) apr_func(args, ...); + */ +#define APR_DECLARE_NONSTD(type) type + +/** + * The public APR variables are declared with AP_MODULE_DECLARE_DATA. + * This assures the appropriate indirection is invoked at compile time. + * @see APR_DECLARE @see APR_DECLARE_NONSTD + * @remark Note that the declaration and implementations use different forms, + * but both must include the macro. + * @example + */ +/** extern APR_DECLARE_DATA type apr_variable;\n + * APR_DECLARE_DATA type apr_variable = value; + */ +#define APR_DECLARE_DATA + +/* Define APR_SSIZE_T_FMT. + * If ssize_t is an integer we define it to be "d", + * if ssize_t is a long int we define it to be "ld", + * if ssize_t is neither we declare an error here. + * I looked for a better way to define this here, but couldn't find one, so + * to find the logic for this definition search for "ssize_t_fmt" in + * configure.in. + */ +#define APR_SSIZE_T_FMT "ld" + +/* And APR_SIZE_T_FMT */ +#define APR_SIZE_T_FMT "ld" + +/* And APR_OFF_T_FMT */ +#define APR_OFF_T_FMT "ld" + +/* And APR_PID_T_FMT */ +#define APR_PID_T_FMT "d" + +/* And APR_INT64_T_FMT */ +#define APR_INT64_T_FMT "ld" +#define APR_INT64_T_FMT_LEN 2 + +/* And APR_UINT64_T_FMT */ +#define APR_UINT64_T_FMT "lu" +#define APR_UINT64_T_FMT_LEN 2 + +/* And APR_UINT64_T_HEX_FMT */ +#define APR_UINT64_T_HEX_FMT "lx" +#define APR_UINT64_T_HEX_FMT_LEN (sizeof(APR_UINT64_T_HEX_FMT) - 1) + +/* Deal with atoi64 variables ... these should move to apr_private.h */ +#define APR_HAVE_INT64_STRFN 1 +#define APR_INT64_STRFN strtol + +/* are we going to force the generic atomic operations */ +#define APR_FORCE_ATOMIC_GENERIC 1 + +/* Does the proc mutex lock threads too */ +#define APR_PROC_MUTEX_IS_GLOBAL 0 + +/* Local machine definition for console and log output. */ +#define APR_EOL_STR "\n" + + +#if APR_HAVE_SYS_WAIT_H +#ifdef WEXITSTATUS +#define apr_wait_t int +#else +#define apr_wait_t union wait +#define WEXITSTATUS(status) (int)((status).w_retcode) +#define WTERMSIG(status) (int)((status).w_termsig) +#endif /* !WEXITSTATUS */ +#endif /* HAVE_SYS_WAIT_H */ + +#if defined(PATH_MAX) +#define APR_PATH_MAX PATH_MAX +#elif defined(_POSIX_PATH_MAX) +#define APR_PATH_MAX _POSIX_PATH_MAX +#else +#error no decision has been made on APR_PATH_MAX for your platform +#endif + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* APR_H */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/apr.hnw b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr.hnw new file mode 100644 index 00000000..919e058c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr.hnw @@ -0,0 +1,348 @@ +/* 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. + */ + + +#ifndef APR_H +#define APR_H + +/* GENERATED FILE WARNING! DO NOT EDIT apr.h + * + * You must modify apr.hnw instead. + * + * And please, make an effort to stub apr.hw and apr.h.in in the process. + * + * This is the NetWare specific version of apr.h. It is copied from + * apr.hnw at the start of a NetWare build by prebuildNW.bat. + */ + +/** + * @file apr.h + * @brief APR Platform Definitions + * @remark This is a generated header generated from include/apr.h.in by + * ./configure, or copied from include/apr.hw or include/apr.hnw + * for Win32 or Netware by those build environments, respectively. + */ + +#if defined(NETWARE) || defined(DOXYGEN) + +#define FD_SETSIZE 1024 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef NW_BUILD_IPV6 +#include +#endif + +#define _POSIX_THREAD_SAFE_FUNCTIONS 1 +#define READDIR_IS_THREAD_SAFE 1 + +/* Keep #include'd headers from within the __cplusplus or doxyblocks */ + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup apr_platform Platform Definitions + * @ingroup APR + * @{ + */ + +#define APR_INLINE +#define APR_HAS_INLINE 0 +#ifndef __attribute__ +#define __attribute__(__x) +#endif +#define ENUM_BITFIELD(e,n,w) signed int n : w + +#define APR_HAVE_ARPA_INET_H 0 +#define APR_HAVE_CONIO_H 0 +#define APR_HAVE_CRYPT_H 0 +#define APR_HAVE_CTYPE_H 1 +#define APR_HAVE_DIRENT_H 1 +#define APR_HAVE_ERRNO_H 1 +#define APR_HAVE_FCNTL_H 1 +#define APR_HAVE_IO_H 0 +#define APR_HAVE_LIMITS_H 1 +#define APR_HAVE_NETDB_H 0 +#define APR_HAVE_NETINET_IN_H 0 +#define APR_HAVE_NETINET_SCTP_H 0 +#define APR_HAVE_NETINET_SCTP_UIO_H 0 +#define APR_HAVE_NETINET_TCP_H 0 +#define APR_HAVE_PTHREAD_H 0 +#define APR_HAVE_SIGNAL_H 1 +#define APR_HAVE_STDARG_H 1 +#define APR_HAVE_STDINT_H 0 +#define APR_HAVE_STDIO_H 1 +#define APR_HAVE_STDLIB_H 1 +#define APR_HAVE_STRING_H 1 +#define APR_HAVE_STRINGS_H 0 +#define APR_HAVE_STRTOLL 1 +#define APR_HAVE_SYS_SENDFILE_H 0 +#define APR_HAVE_SYS_SIGNAL_H 0 +#define APR_HAVE_SYS_SOCKET_H 0 +#define APR_HAVE_SYS_SOCKIO_H 0 +#define APR_HAVE_SYS_SYSLIMITS_H 0 +#define APR_HAVE_SYS_TIME_H 0 +#define APR_HAVE_SYS_TYPES_H 1 +#define APR_HAVE_SYS_UIO_H 1 +#define APR_HAVE_SYS_UN_H 0 +#define APR_HAVE_SYS_WAIT_H 0 +#define APR_HAVE_TIME_H 1 +#define APR_HAVE_UNISTD_H 1 + +#define APR_HAVE_SHMEM_MMAP_TMP 0 +#define APR_HAVE_SHMEM_MMAP_SHM 0 +#define APR_HAVE_SHMEM_MMAP_ZERO 0 +#define APR_HAVE_SHMEM_SHMGET_ANON 0 +#define APR_HAVE_SHMEM_SHMGET 0 +#define APR_HAVE_SHMEM_MMAP_ANON 0 +#define APR_HAVE_SHMEM_BEOS 0 + +#define APR_USE_SHMEM_MMAP_TMP 0 +#define APR_USE_SHMEM_MMAP_SHM 0 +#define APR_USE_SHMEM_MMAP_ZERO 0 +#define APR_USE_SHMEM_SHMGET_ANON 0 +#define APR_USE_SHMEM_SHMGET 0 +#define APR_USE_SHMEM_MMAP_ANON 0 +#define APR_USE_SHMEM_BEOS 0 + +#define APR_USE_FLOCK_SERIALIZE 0 +#define APR_USE_SYSVSEM_SERIALIZE 0 +#define APR_USE_FCNTL_SERIALIZE 0 +#define APR_USE_PROC_PTHREAD_SERIALIZE 0 +#define APR_USE_PTHREAD_SERIALIZE 0 + +#define APR_HAS_FLOCK_SERIALIZE 0 +#define APR_HAS_SYSVSEM_SERIALIZE 0 +#define APR_HAS_FCNTL_SERIALIZE 0 +#define APR_HAS_PROC_PTHREAD_SERIALIZE 0 +#define APR_HAS_RWLOCK_SERIALIZE 0 + +#define APR_HAS_LOCK_CREATE_NP 0 + +#define APR_PROCESS_LOCK_IS_GLOBAL 1 + +#define APR_FILE_BASED_SHM 0 + +#define APR_HAVE_CORKABLE_TCP 0 +#define APR_HAVE_GETRLIMIT 0 +#define APR_HAVE_ICONV 0 +#define APR_HAVE_IN_ADDR 1 +#define APR_HAVE_INET_ADDR 1 +#define APR_HAVE_INET_NETWORK 0 +#ifdef NW_BUILD_IPV6 +#define APR_HAVE_IPV6 1 +#else +#define APR_HAVE_IPV6 0 +#endif +#define APR_HAVE_MEMCHR 1 +#define APR_HAVE_MEMMOVE 1 +#define APR_HAVE_SETRLIMIT 0 +#define APR_HAVE_SIGACTION 0 +#define APR_HAVE_SIGSUSPEND 0 +#define APR_HAVE_SIGWAIT 0 +#define APR_HAVE_STRCASECMP 1 +#define APR_HAVE_STRDUP 1 +#define APR_HAVE_STRICMP 1 +#define APR_HAVE_STRNCASECMP 1 +#define APR_HAVE_STRNICMP 1 +#define APR_HAVE_STRSTR 1 +#define APR_HAVE_STRUCT_RLIMIT 0 +#define APR_HAVE_UNION_SEMUN 0 +#define APR_HAVE_SCTP 0 + +/* APR Feature Macros */ +#define APR_HAS_SHARED_MEMORY 0 +#define APR_HAS_THREADS 1 +#define APR_HAS_SENDFILE 0 +#define APR_HAS_MMAP 0 +#define APR_HAS_FORK 0 +#define APR_HAS_RANDOM 1 +#define APR_HAS_OTHER_CHILD 0 +#define APR_HAS_DSO 1 +#define APR_HAS_SO_ACCEPTFILTER 0 +#define APR_HAS_UNICODE_FS 0 +#define APR_HAS_PROC_INVOKED 0 +#define APR_HAS_USER 1 +#define APR_HAS_LARGE_FILES 0 +#define APR_HAS_XTHREAD_FILES 0 +#define APR_HAS_OS_UUID 0 + +/* Netware can poll on files/pipes. + */ +#define APR_FILES_AS_SOCKETS 1 + +/* Not all platforms have a real INADDR_NONE. This macro replaces INADDR_NONE + * on all platforms. + */ +#define APR_INADDR_NONE INADDR_NONE + +/* This macro indicates whether or not EBCDIC is the native character set. + */ +#define APR_CHARSET_EBCDIC 0 + +/* Is the TCP_NODELAY socket option inherited from listening sockets? +*/ +#define APR_TCP_NODELAY_INHERITED 1 + +/* Is the O_NONBLOCK flag inherited from listening sockets? +*/ +#define APR_O_NONBLOCK_INHERITED 1 + +/* Typedefs that APR needs. */ + +typedef unsigned char apr_byte_t; + +typedef short apr_int16_t; +typedef unsigned short apr_uint16_t; + +typedef int apr_int32_t; +typedef unsigned int apr_uint32_t; + +typedef long long apr_int64_t; +typedef unsigned long long apr_uint64_t; + +typedef size_t apr_size_t; +typedef ssize_t apr_ssize_t; +typedef off_t apr_off_t; +typedef int apr_socklen_t; + +typedef apr_uint64_t apr_ino_t; + +#ifdef UNKNOWN_NETWARE_64BIT_FLAG_NEEDED +#define APR_SIZEOF_VOIDP 8 +#else +#define APR_SIZEOF_VOIDP 4 +#endif + +/* Mechanisms to properly type numeric literals */ + +#ifdef __GNUC__ +#define APR_INT64_C(val) (val) +#else +#define APR_INT64_C(val) (val##i64) +#endif + +/* PROC mutex is a GLOBAL mutex on Netware */ +#define APR_PROC_MUTEX_IS_GLOBAL 1 + +/* Definitions that APR programs need to work properly. */ + +/** + * Thread callbacks from APR functions must be declared with APR_THREAD_FUNC, + * so that they follow the platform's calling convention. + * @example + */ +/** void* APR_THREAD_FUNC my_thread_entry_fn(apr_thread_t *thd, void *data); + */ +#define APR_THREAD_FUNC + +/** + * The public APR functions are declared with APR_DECLARE(), so they may + * use the most appropriate calling convention. Public APR functions with + * variable arguments must use APR_DECLARE_NONSTD(). + * + * @remark Both the declaration and implementations must use the same macro. + * @example + */ +/** APR_DECLARE(rettype) apr_func(args) + * @see APR_DECLARE_NONSTD @see APR_DECLARE_DATA + * @remark Note that when APR compiles the library itself, it passes the + * symbol -DAPR_DECLARE_EXPORT to the compiler on some platforms (e.g. Win32) + * to export public symbols from the dynamic library build.\n + * The user must define the APR_DECLARE_STATIC when compiling to target + * the static APR library on some platforms (e.g. Win32.) The public symbols + * are neither exported nor imported when APR_DECLARE_STATIC is defined.\n + * By default, compiling an application and including the APR public + * headers, without defining APR_DECLARE_STATIC, will prepare the code to be + * linked to the dynamic library. + */ +#define APR_DECLARE(type) type + +/** + * The public APR functions using variable arguments are declared with + * APR_DECLARE_NONSTD(), as they must follow the C language calling convention. + * @see APR_DECLARE @see APR_DECLARE_DATA + * @remark Both the declaration and implementations must use the same macro. + * @example + */ +/** APR_DECLARE_NONSTD(rettype) apr_func(args, ...); + */ +#define APR_DECLARE_NONSTD(type) type + +/** + * The public APR variables are declared with AP_MODULE_DECLARE_DATA. + * This assures the appropriate indirection is invoked at compile time. + * @see APR_DECLARE @see APR_DECLARE_NONSTD + * @remark Note that the declaration and implementations use different forms, + * but both must include the macro. + * @example + */ +/** extern APR_DECLARE_DATA type apr_variable;\n + * APR_DECLARE_DATA type apr_variable = value; + */ +#define APR_DECLARE_DATA + +#define APR_SSIZE_T_FMT "d" + +#define APR_SIZE_T_FMT "d" + +#define APR_OFF_T_FMT "ld" + +#define APR_PID_T_FMT "d" + +/* Local machine definition for console and log output. */ +#define APR_EOL_STR "\r\n" + +typedef int apr_wait_t; + +#define APR_PATH_MAX PATH_MAX + +#define APR_INT64_T_FMT "lld" +#define APR_INT64_T_FMT_LEN 3 +#define APR_UINT64_T_FMT "llu" +#define APR_UINT64_T_FMT_LEN 3 +#define APR_UINT64_T_HEX_FMT "llx" +#define APR_UINT64_T_HEX_FMT_LEN (sizeof(APR_UINT64_T_HEX_FMT) - 1) +#define APR_TIME_T_FMT APR_INT64_T_FMT + +/* Deal with atoi64 variables ... these should move to apr_private.h */ +#define APR_HAVE_INT64_STRFN 1 +#define APR_INT64_STRFN strtoll + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* NETWARE */ + +#endif /* APR_H */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/apr.hw b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr.hw new file mode 100644 index 00000000..920891fd --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr.hw @@ -0,0 +1,541 @@ +/* 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. + */ + + +#ifndef APR_H +#define APR_H + +/* GENERATED FILE WARNING! DO NOT EDIT apr.h + * + * You must modify apr.hw instead. + * + * And please, make an effort to stub apr.hnw and apr.h.in in the process. + * + * This is the Win32 specific version of apr.h. It is copied from + * apr.hw by the apr.dsp and libapr.dsp projects. + */ + +/** + * @file apr.h + * @brief APR Platform Definitions + * @remark This is a generated header generated from include/apr.h.in by + * ./configure, or copied from include/apr.hw or include/apr.hnw + * for Win32 or Netware by those build environments, respectively. + */ + +#if defined(WIN32) || defined(DOXYGEN) + +/* Ignore most warnings (back down to /W3) for poorly constructed headers + */ +#if defined(_MSC_VER) && _MSC_VER >= 1200 +#pragma warning(push, 3) +#endif + +/* disable or reduce the frequency of... + * C4057: indirection to slightly different base types + * C4075: slight indirection changes (unsigned short* vs short[]) + * C4100: unreferenced formal parameter + * C4127: conditional expression is constant + * C4201: nonstandard extension nameless struct/unions + * C4244: int to char/short - precision loss + * C4514: unreferenced inline function removed + */ +#pragma warning(disable: 4100 4127 4201 4514; once: 4057 4075 4244) + +/* Ignore Microsoft's interpretation of secure development + * and the POSIX string handling API + */ +#if defined(_MSC_VER) && _MSC_VER >= 1400 +#ifndef _CRT_SECURE_NO_DEPRECATE +#define _CRT_SECURE_NO_DEPRECATE +#endif +#pragma warning(disable: 4996) +#endif + +/* Has windows.h already been included? If so, our preferences don't matter, + * but we will still need the winsock things no matter what was included. + * If not, include a restricted set of windows headers to our tastes. + */ +#ifndef _WINDOWS_ +#ifndef WIN32_LEAN_AND_MEAN +#define WIN32_LEAN_AND_MEAN +#endif +#ifndef _WIN32_WINNT + +/* Restrict the server to a subset of Windows NT 4.0 header files by default + */ +#define _WIN32_WINNT 0x0400 +#endif +#ifndef NOUSER +#define NOUSER +#endif +#ifndef NOMCX +#define NOMCX +#endif +#ifndef NOIME +#define NOIME +#endif +#include +/* + * Add a _very_few_ declarations missing from the restricted set of headers + * (If this list becomes extensive, re-enable the required headers above!) + * winsock headers were excluded by WIN32_LEAN_AND_MEAN, so include them now + */ +#define SW_HIDE 0 +#ifndef _WIN32_WCE +#include +#include +#else +#include +#endif +#endif /* !_WINDOWS_ */ + +/** + * @defgroup apr_platform Platform Definitions + * @ingroup APR + * @{ + */ + +#define APR_INLINE __inline +#define APR_HAS_INLINE 1 +#if !defined(__GNUC__) && !defined(__attribute__) +#define __attribute__(__x) +#endif + +#define NO_USE_SIGACTION + +#ifndef _WIN32_WCE +#define APR_HAVE_ARPA_INET_H 0 +#define APR_HAVE_CONIO_H 1 +#define APR_HAVE_CRYPT_H 0 +#define APR_HAVE_CTYPE_H 1 +#define APR_HAVE_DIRENT_H 0 +#define APR_HAVE_ERRNO_H 1 +#define APR_HAVE_FCNTL_H 1 +#define APR_HAVE_IO_H 1 +#define APR_HAVE_LIMITS_H 1 +#define APR_HAVE_NETDB_H 0 +#define APR_HAVE_NETINET_IN_H 0 +#define APR_HAVE_NETINET_SCTP_H 0 +#define APR_HAVE_NETINET_SCTP_UIO_H 0 +#define APR_HAVE_NETINET_TCP_H 0 +#define APR_HAVE_PTHREAD_H 0 +#define APR_HAVE_SIGNAL_H 1 +#define APR_HAVE_STDARG_H 1 +#define APR_HAVE_STDINT_H 0 +#define APR_HAVE_STDIO_H 1 +#define APR_HAVE_STDLIB_H 1 +#define APR_HAVE_STRING_H 1 +#define APR_HAVE_STRINGS_H 0 +#define APR_HAVE_SYS_SENDFILE_H 0 +#define APR_HAVE_SYS_SIGNAL_H 0 +#define APR_HAVE_SYS_SOCKET_H 0 +#define APR_HAVE_SYS_SOCKIO_H 0 +#define APR_HAVE_SYS_SYSLIMITS_H 0 +#define APR_HAVE_SYS_TIME_H 0 +#define APR_HAVE_SYS_TYPES_H 1 +#define APR_HAVE_SYS_UIO_H 0 +#define APR_HAVE_SYS_WAIT_H 0 +#define APR_HAVE_UNISTD_H 0 +#define APR_HAVE_STDDEF_H 1 +#define APR_HAVE_PROCESS_H 1 +#define APR_HAVE_TIME_H 1 +#else +#define APR_HAVE_ARPA_INET_H 0 +#define APR_HAVE_CONIO_H 0 +#define APR_HAVE_CRYPT_H 0 +#define APR_HAVE_CTYPE_H 0 +#define APR_HAVE_DIRENT_H 0 +#define APR_HAVE_ERRNO_H 0 +#define APR_HAVE_FCNTL_H 0 +#define APR_HAVE_IO_H 0 +#define APR_HAVE_LIMITS_H 0 +#define APR_HAVE_NETDB_H 0 +#define APR_HAVE_NETINET_IN_H 0 +#define APR_HAVE_NETINET_TCP_H 0 +#define APR_HAVE_PTHREAD_H 0 +#define APR_HAVE_SIGNAL_H 0 +#define APR_HAVE_STDARG_H 0 +#define APR_HAVE_STDINT_H 0 +#define APR_HAVE_STDIO_H 1 +#define APR_HAVE_STDLIB_H 1 +#define APR_HAVE_STRING_H 1 +#define APR_HAVE_STRINGS_H 0 +#define APR_HAVE_SYS_SENDFILE_H 0 +#define APR_HAVE_SYS_SIGNAL_H 0 +#define APR_HAVE_SYS_SOCKET_H 0 +#define APR_HAVE_SYS_SYSLIMITS_H 0 +#define APR_HAVE_SYS_TIME_H 0 +#define APR_HAVE_SYS_TYPES_H 0 +#define APR_HAVE_SYS_UIO_H 0 +#define APR_HAVE_SYS_WAIT_H 0 +#define APR_HAVE_UNISTD_H 0 +#define APR_HAVE_STDDEF_H 0 +#define APR_HAVE_PROCESS_H 0 +#define APR_HAVE_TIME_H 0 +#endif + +#define APR_USE_FLOCK_SERIALIZE 0 +#define APR_USE_SYSVSEM_SERIALIZE 0 +#define APR_USE_FCNTL_SERIALIZE 0 +#define APR_USE_PROC_PTHREAD_SERIALIZE 0 +#define APR_USE_PTHREAD_SERIALIZE 0 + +#define APR_HAS_FLOCK_SERIALIZE 0 +#define APR_HAS_SYSVSEM_SERIALIZE 0 +#define APR_HAS_FCNTL_SERIALIZE 0 +#define APR_HAS_PROC_PTHREAD_SERIALIZE 0 +#define APR_HAS_RWLOCK_SERIALIZE 0 + +#define APR_HAS_LOCK_CREATE_NP 0 + +#define APR_PROCESS_LOCK_IS_GLOBAL 0 + +#define APR_USES_ANONYMOUS_SHM 0 +#define APR_USES_FILEBASED_SHM 0 +#define APR_USES_KEYBASED_SHM 0 + +#define APR_FILE_BASED_SHM 0 +#define APR_MEM_BASED_SHM 0 + +#define APR_HAVE_CORKABLE_TCP 0 +#define APR_HAVE_GETRLIMIT 0 +#define APR_HAVE_ICONV 0 +#define APR_HAVE_IN_ADDR 1 +#define APR_HAVE_INET_ADDR 1 +#define APR_HAVE_INET_NETWORK 0 +#define APR_HAVE_IPV6 0 +#define APR_HAVE_MEMMOVE 1 +#define APR_HAVE_SETRLIMIT 0 +#define APR_HAVE_SIGACTION 0 +#define APR_HAVE_SIGSUSPEND 0 +#define APR_HAVE_SIGWAIT 0 +#define APR_HAVE_STRCASECMP 0 +#define APR_HAVE_STRDUP 1 +#define APR_HAVE_STRNCASECMP 0 +#define APR_HAVE_STRSTR 1 +#define APR_HAVE_MEMCHR 1 +#define APR_HAVE_STRUCT_RLIMIT 0 +#define APR_HAVE_UNION_SEMUN 0 +#define APR_HAVE_SCTP 0 + +#ifndef _WIN32_WCE +#define APR_HAVE_STRICMP 1 +#define APR_HAVE_STRNICMP 1 +#else +#define APR_HAVE_STRICMP 0 +#define APR_HAVE_STRNICMP 0 +#endif + +/** @} */ + +/* We don't include our conditional headers within the doxyblocks + * or the extern "C" namespace + */ + +#if APR_HAVE_STDLIB_H +#include +#endif +#if APR_HAVE_STDIO_H +#include +#endif +#if APR_HAVE_SYS_TYPES_H +#include +#endif +#if APR_HAVE_STDDEF_H +#include +#endif +#if APR_HAVE_TIME_H +#include +#endif +#if APR_HAVE_PROCESS_H +#include +#endif +#if APR_HAVE_IPV6 +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @addtogroup apr_platform + * @ingroup APR + * @{ + */ + +/* APR Feature Macros */ +#define APR_HAS_SHARED_MEMORY 1 +#define APR_HAS_THREADS 1 +#define APR_HAS_MMAP 1 +#define APR_HAS_FORK 0 +#define APR_HAS_RANDOM 1 +#define APR_HAS_OTHER_CHILD 1 +#define APR_HAS_DSO 1 +#define APR_HAS_SO_ACCEPTFILTER 0 +#define APR_HAS_UNICODE_FS 1 +#define APR_HAS_PROC_INVOKED 1 +#ifndef _WIN32_WCE +#define APR_HAS_SENDFILE 1 +#define APR_HAS_USER 1 +#define APR_HAS_LARGE_FILES 1 +#define APR_HAS_XTHREAD_FILES 1 +#else +#define APR_HAS_SENDFILE 0 +#define APR_HAS_USER 0 +#define APR_HAS_LARGE_FILES 0 +#define APR_HAS_XTHREAD_FILES 0 +#endif +#define APR_HAS_OS_UUID 1 + +/* Win32 cannot poll [just yet] on files/pipes. + */ +#define APR_FILES_AS_SOCKETS 0 + +/* Not all platforms have a real INADDR_NONE. This macro replaces INADDR_NONE + * on all platforms. + */ +#define APR_INADDR_NONE INADDR_NONE + +/* This macro indicates whether or not EBCDIC is the native character set. + */ +#define APR_CHARSET_EBCDIC 0 + +/* Is the TCP_NODELAY socket option inherited from listening sockets? + */ +#define APR_TCP_NODELAY_INHERITED 1 + +/* Is the O_NONBLOCK flag inherited from listening sockets? + */ +#define APR_O_NONBLOCK_INHERITED 1 + +/* Typedefs that APR needs. */ + +typedef unsigned char apr_byte_t; + +typedef short apr_int16_t; +typedef unsigned short apr_uint16_t; + +typedef int apr_int32_t; +typedef unsigned int apr_uint32_t; + +typedef __int64 apr_int64_t; +typedef unsigned __int64 apr_uint64_t; + +typedef size_t apr_size_t; +#if APR_HAVE_STDDEF_H +typedef ptrdiff_t apr_ssize_t; +#else +typedef int apr_ssize_t; +#endif +#if APR_HAS_LARGE_FILES +typedef __int64 apr_off_t; +#else +typedef int apr_off_t; +#endif +typedef int apr_socklen_t; + +typedef apr_uint64_t apr_ino_t; + +#ifdef WIN64 +#define APR_SIZEOF_VOIDP 8 +#else +#define APR_SIZEOF_VOIDP 4 +#endif + +/* XXX These simply don't belong here, perhaps in apr_portable.h + * based on some APR_HAVE_PID/GID/UID? + */ +#ifndef __GNUC__ +typedef int pid_t; +#endif +typedef int uid_t; +typedef int gid_t; + +/* Mechanisms to properly type numeric literals */ + +#ifndef __GNUC__ +#define APR_INT64_C(val) (val##i64) +#else +#define APR_INT64_C(val) (val##LL) +#endif + + +#if APR_HAVE_IPV6 + +/* Appears in later flavors, not the originals. */ +#ifndef in_addr6 +#define in6_addr in_addr6 +#endif + +#ifndef WS2TCPIP_INLINE +#define IN6_IS_ADDR_V4MAPPED(a) \ + ( (*(const apr_uint64_t *)(const void *)(&(a)->s6_addr[0]) == 0) \ + && (*(const apr_uint32_t *)(const void *)(&(a)->s6_addr[8]) == ntohl(0x0000ffff))) +#endif + +#endif /* APR_HAS_IPV6 */ + +/* Definitions that APR programs need to work properly. */ + +/** + * Thread callbacks from APR functions must be declared with APR_THREAD_FUNC, + * so that they follow the platform's calling convention. + * @example + */ +/** void* APR_THREAD_FUNC my_thread_entry_fn(apr_thread_t *thd, void *data); + */ +#define APR_THREAD_FUNC __stdcall + + +#if defined(DOXYGEN) || !defined(WIN32) + +/** + * The public APR functions are declared with APR_DECLARE(), so they may + * use the most appropriate calling convention. Public APR functions with + * variable arguments must use APR_DECLARE_NONSTD(). + * + * @remark Both the declaration and implementations must use the same macro. + * @example + */ +/** APR_DECLARE(rettype) apr_func(args) + * @see APR_DECLARE_NONSTD @see APR_DECLARE_DATA + * @remark Note that when APR compiles the library itself, it passes the + * symbol -DAPR_DECLARE_EXPORT to the compiler on some platforms (e.g. Win32) + * to export public symbols from the dynamic library build.\n + * The user must define the APR_DECLARE_STATIC when compiling to target + * the static APR library on some platforms (e.g. Win32.) The public symbols + * are neither exported nor imported when APR_DECLARE_STATIC is defined.\n + * By default, compiling an application and including the APR public + * headers, without defining APR_DECLARE_STATIC, will prepare the code to be + * linked to the dynamic library. + */ +#define APR_DECLARE(type) type + +/** + * The public APR functions using variable arguments are declared with + * APR_DECLARE_NONSTD(), as they must follow the C language calling convention. + * @see APR_DECLARE @see APR_DECLARE_DATA + * @remark Both the declaration and implementations must use the same macro. + * @example + */ +/** APR_DECLARE_NONSTD(rettype) apr_func(args, ...); + */ +#define APR_DECLARE_NONSTD(type) type + +/** + * The public APR variables are declared with AP_MODULE_DECLARE_DATA. + * This assures the appropriate indirection is invoked at compile time. + * @see APR_DECLARE @see APR_DECLARE_NONSTD + * @remark Note that the declaration and implementations use different forms, + * but both must include the macro. + * @example + */ +/** extern APR_DECLARE_DATA type apr_variable;\n + * APR_DECLARE_DATA type apr_variable = value; + */ +#define APR_DECLARE_DATA + +#elif defined(APR_DECLARE_STATIC) +#define APR_DECLARE(type) type __stdcall +#define APR_DECLARE_NONSTD(type) type +#define APR_DECLARE_DATA +#elif defined(APR_DECLARE_EXPORT) +#define APR_DECLARE(type) __declspec(dllexport) type __stdcall +#define APR_DECLARE_NONSTD(type) __declspec(dllexport) type +#define APR_DECLARE_DATA __declspec(dllexport) +#else +#define APR_DECLARE(type) __declspec(dllimport) type __stdcall +#define APR_DECLARE_NONSTD(type) __declspec(dllimport) type +#define APR_DECLARE_DATA __declspec(dllimport) +#endif + +#ifdef WIN64 +#define APR_SSIZE_T_FMT "I64d" +#define APR_SIZE_T_FMT "I64d" +#else +#define APR_SSIZE_T_FMT "d" +#define APR_SIZE_T_FMT "d" +#endif + +#if APR_HAS_LARGE_FILES +#define APR_OFF_T_FMT "I64d" +#else +#define APR_OFF_T_FMT "d" +#endif + +#define APR_PID_T_FMT "d" + +#define APR_INT64_T_FMT "I64d" +#define APR_INT64_T_FMT_LEN 4 +#define APR_UINT64_T_FMT "I64u" +#define APR_UINT64_T_FMT_LEN 4 +#define APR_UINT64_T_HEX_FMT "I64x" +#define APR_UINT64_T_HEX_FMT_LEN (sizeof(APR_UINT64_T_HEX_FMT) - 1) + +/* Deal with atoi64 variables ... these should move to apr_private.h */ +/* MSVC 7.0 introduced _strtoui64 */ +#if _MSC_VER >= 1300 && _INTEGRAL_MAX_BITS >= 64 +#define APR_HAVE_INT64_STRFN 1 +#define APR_INT64_STRFN _strtoui64 +#else +#define APR_HAVE_INT64_STRFN 0 +#define APR_INT64_STRFN undef +#endif + +/* Local machine definition for console and log output. */ +#define APR_EOL_STR "\r\n" + +/* No difference between PROC and GLOBAL mutex */ +#define APR_PROC_MUTEX_IS_GLOBAL 1 + +typedef int apr_wait_t; + +/* struct iovec is needed to emulate Unix writev */ +struct iovec { + char* iov_base; + apr_size_t iov_len; +}; + +/* Nasty Win32 .h ommissions we really need */ +#define STDIN_FILENO 0 +#define STDOUT_FILENO 1 +#define STDERR_FILENO 2 + +#if APR_HAS_UNICODE_FS +/* An arbitrary size that is digestable. True max is a bit less than 32000 */ +#define APR_PATH_MAX 8192 +#else /* !APR_HAS_UNICODE_FS */ +#define APR_PATH_MAX MAX_PATH +#endif + +/** @} */ + +#ifdef __cplusplus +} +#endif + +/* Done with badly written headers + */ +#if defined(_MSC_VER) && _MSC_VER >= 1200 +#pragma warning(pop) +#pragma warning(disable: 4996) +#endif + +#endif /* WIN32 */ + +#endif /* APR_H */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_allocator.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_allocator.h new file mode 100644 index 00000000..b880c4e2 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_allocator.h @@ -0,0 +1,170 @@ +/* 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. + */ + +#ifndef APR_ALLOCATOR_H +#define APR_ALLOCATOR_H + +/** + * @file apr_allocator.h + * @brief APR Internal Memory Allocation + */ + +#include "apr.h" +#include "apr_errno.h" +#define APR_WANT_MEMFUNC /**< For no good reason? */ +#include "apr_want.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup apr_allocator Internal Memory Allocation + * @ingroup APR + * @{ + */ + +/** the allocator structure */ +typedef struct apr_allocator_t apr_allocator_t; +/** the structure which holds information about the allocation */ +typedef struct apr_memnode_t apr_memnode_t; + +/** basic memory node structure */ +struct apr_memnode_t { + apr_memnode_t *next; /**< next memnode */ + apr_memnode_t **ref; /**< reference to self */ + apr_uint32_t index; /**< size */ + apr_uint32_t free_index; /**< how much free */ + char *first_avail; /**< pointer to first free memory */ + char *endp; /**< pointer to end of free memory */ +}; + +/** The base size of a memory node - aligned. */ +#define APR_MEMNODE_T_SIZE APR_ALIGN_DEFAULT(sizeof(apr_memnode_t)) + +/** Symbolic constants */ +#define APR_ALLOCATOR_MAX_FREE_UNLIMITED 0 + +/** + * Create a new allocator + * @param allocator The allocator we have just created. + * + */ +APR_DECLARE(apr_status_t) apr_allocator_create(apr_allocator_t **allocator); + +/** + * Destroy an allocator + * @param allocator The allocator to be destroyed + * @remark Any memnodes not given back to the allocator prior to destroying + * will _not_ be free()d. + */ +APR_DECLARE(void) apr_allocator_destroy(apr_allocator_t *allocator); + +/** + * Allocate a block of mem from the allocator + * @param allocator The allocator to allocate from + * @param size The size of the mem to allocate (excluding the + * memnode structure) + */ +APR_DECLARE(apr_memnode_t *) apr_allocator_alloc(apr_allocator_t *allocator, + apr_size_t size); + +/** + * Free a block of mem, giving it back to the allocator + * @param allocator The allocator to give the mem back to + * @param memnode The memory node to return + */ +APR_DECLARE(void) apr_allocator_free(apr_allocator_t *allocator, + apr_memnode_t *memnode); + +#include "apr_pools.h" + +/** + * Set the owner of the allocator + * @param allocator The allocator to set the owner for + * @param pool The pool that is to own the allocator + * @remark Typically pool is the highest level pool using the allocator + */ +/* + * XXX: see if we can come up with something a bit better. Currently + * you can make a pool an owner, but if the pool doesn't use the allocator + * the allocator will never be destroyed. + */ +APR_DECLARE(void) apr_allocator_owner_set(apr_allocator_t *allocator, + apr_pool_t *pool); + +/** @deprecated @see apr_allocator_owner_set */ +APR_DECLARE(void) apr_allocator_set_owner(apr_allocator_t *allocator, + apr_pool_t *pool); + +/** + * Get the current owner of the allocator + * @param allocator The allocator to get the owner from + */ +APR_DECLARE(apr_pool_t *) apr_allocator_owner_get(apr_allocator_t *allocator); + +/** @deprecated @see apr_allocator_owner_get */ +APR_DECLARE(apr_pool_t *) apr_allocator_get_owner( + apr_allocator_t *allocator); + +/** + * Set the current threshold at which the allocator should start + * giving blocks back to the system. + * @param allocator The allocator the set the threshold on + * @param size The threshold. 0 == unlimited. + */ +APR_DECLARE(void) apr_allocator_max_free_set(apr_allocator_t *allocator, + apr_size_t size); + +/** @deprecated @see apr_allocator_max_free_set */ +APR_DECLARE(void) apr_allocator_set_max_free(apr_allocator_t *allocator, + apr_size_t size); + +#include "apr_thread_mutex.h" + +#if APR_HAS_THREADS +/** + * Set a mutex for the allocator to use + * @param allocator The allocator to set the mutex for + * @param mutex The mutex + */ +APR_DECLARE(void) apr_allocator_mutex_set(apr_allocator_t *allocator, + apr_thread_mutex_t *mutex); + +/** @deprecated @see apr_allocator_mutex_set */ +APR_DECLARE(void) apr_allocator_set_mutex(apr_allocator_t *allocator, + apr_thread_mutex_t *mutex); + +/** + * Get the mutex currently set for the allocator + * @param allocator The allocator + */ +APR_DECLARE(apr_thread_mutex_t *) apr_allocator_mutex_get( + apr_allocator_t *allocator); + +/** @deprecated @see apr_allocator_mutex_get */ +APR_DECLARE(apr_thread_mutex_t *) apr_allocator_get_mutex( + apr_allocator_t *allocator); + +#endif /* APR_HAS_THREADS */ + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* !APR_ALLOCATOR_H */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_atomic.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_atomic.h new file mode 100644 index 00000000..87889292 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_atomic.h @@ -0,0 +1,314 @@ +/* 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. + */ + +#ifndef APR_ATOMIC_H +#define APR_ATOMIC_H + +/** + * @file apr_atomic.h + * @brief APR Atomic Operations + */ + +#include "apr.h" +#include "apr_pools.h" + +/* Platform includes for atomics */ +#if defined(NETWARE) || defined(__MVS__) /* OS/390 */ +#include +#elif defined(__FreeBSD__) +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup apr_atomic Atomic Operations + * @ingroup APR + * @{ + */ + +/* easiest way to get these documented for the moment */ +#if defined(DOXYGEN) +/** + * structure for holding a atomic value. + * this number >only< has a 24 bit size on some platforms + */ +typedef apr_atomic_t; + +/** + * this function is required on some platforms to initialize the + * atomic operation's internal structures + * @param p pool + * @return APR_SUCCESS on successful completion + */ +apr_status_t apr_atomic_init(apr_pool_t *p); +/** + * read the value stored in a atomic variable + * @param mem the pointer + * @warning on certain platforms this number is not stored + * directly in the pointer. in others it is + */ +apr_uint32_t apr_atomic_read(volatile apr_atomic_t *mem); +/** + * set the value for atomic. + * @param mem the pointer + * @param val the value + */ +void apr_atomic_set(volatile apr_atomic_t *mem, apr_uint32_t val); +/** + * Add 'val' to the atomic variable + * @param mem pointer to the atomic value + * @param val the addition + */ +void apr_atomic_add(volatile apr_atomic_t *mem, apr_uint32_t val); + +/** + * increment the atomic variable by 1 + * @param mem pointer to the atomic value + */ +void apr_atomic_inc(volatile apr_atomic_t *mem); + +/** + * decrement the atomic variable by 1 + * @param mem pointer to the atomic value + * @return zero if the value is zero, otherwise non-zero + */ +int apr_atomic_dec(volatile apr_atomic_t *mem); + +/** + * compare the atomic's value with cmp. + * If they are the same swap the value with 'with' + * @param mem pointer to the atomic value + * @param with what to swap it with + * @param cmp the value to compare it to + * @return the old value of the atomic + * @warning do not mix apr_atomic's with the CAS function. + * on some platforms they may be implemented by different mechanisms + */ +apr_uint32_t apr_atomic_cas(volatile apr_uint32_t *mem, long with, long cmp); + +/** + * compare the pointer's value with cmp. + * If they are the same swap the value with 'with' + * @param mem pointer to the pointer + * @param with what to swap it with + * @param cmp the value to compare it to + * @return the old value of the pointer + */ +void *apr_atomic_casptr(volatile void **mem, void *with, const void *cmp); +#else /* !DOXYGEN */ + +/* The following definitions provide optimized, OS-specific + * implementations of the APR atomic functions on various + * platforms. Any atomic operation that isn't redefined as + * a macro here will be declared as a function later, and + * apr_atomic.c will provide a mutex-based default implementation. + */ + +#if defined(WIN32) + +#define apr_atomic_t LONG + +#define apr_atomic_add(mem, val) InterlockedExchangeAdd(mem,val) +#define apr_atomic_dec(mem) InterlockedDecrement(mem) +#define apr_atomic_inc(mem) InterlockedIncrement(mem) +#define apr_atomic_set(mem, val) InterlockedExchange(mem, val) +#define apr_atomic_read(mem) (*mem) +#define apr_atomic_cas(mem,with,cmp) InterlockedCompareExchange(mem,with,cmp) +#define apr_atomic_init(pool) APR_SUCCESS +#define apr_atomic_casptr(mem,with,cmp) InterlockedCompareExchangePointer(mem,with,cmp) + +#elif defined(NETWARE) + +#define apr_atomic_t unsigned long + +#define apr_atomic_add(mem, val) atomic_add(mem,val) +#define apr_atomic_inc(mem) atomic_inc(mem) +#define apr_atomic_set(mem, val) (*mem = val) +#define apr_atomic_read(mem) (*mem) +#define apr_atomic_init(pool) APR_SUCCESS +#define apr_atomic_cas(mem,with,cmp) atomic_cmpxchg((unsigned long *)(mem),(unsigned long)(cmp),(unsigned long)(with)) + +int apr_atomic_dec(apr_atomic_t *mem); +void *apr_atomic_casptr(void **mem, void *with, const void *cmp); +#define APR_OVERRIDE_ATOMIC_DEC 1 +#define APR_OVERRIDE_ATOMIC_CASPTR 1 + +inline int apr_atomic_dec(apr_atomic_t *mem) +{ + return (atomic_xchgadd(mem, 0xFFFFFFFF) - 1); +} + +inline void *apr_atomic_casptr(void **mem, void *with, const void *cmp) +{ + return (void*)atomic_cmpxchg((unsigned long *)mem,(unsigned long)cmp,(unsigned long)with); +} + +#elif defined(__FreeBSD__) + +#define apr_atomic_t apr_uint32_t +#define apr_atomic_add(mem, val) (atomic_add_int(mem,val),mem) +#define apr_atomic_dec(mem) (atomic_subtract_int(mem,1),mem) +#define apr_atomic_inc(mem) (atomic_add_int(mem,1),mem) +#define apr_atomic_set(mem, val) (atomic_set_int(mem, val),mem) +#define apr_atomic_read(mem) (*mem) + +#elif (defined(__linux__) || defined(__EMX__)) && defined(__i386__) && !APR_FORCE_ATOMIC_GENERIC + +#define apr_atomic_t apr_uint32_t +#define apr_atomic_cas(mem,with,cmp) \ +({ apr_atomic_t prev; \ + asm volatile ("lock; cmpxchgl %1, %2" \ + : "=a" (prev) \ + : "r" (with), "m" (*(mem)), "0"(cmp) \ + : "memory"); \ + prev;}) + +#define apr_atomic_add(mem, val) \ +({ register apr_atomic_t last; \ + do { \ + last = *(mem); \ + } while (apr_atomic_cas((mem), last + (val), last) != last); \ + }) + +#define apr_atomic_dec(mem) \ +({ register apr_atomic_t last; \ + do { \ + last = *(mem); \ + } while (apr_atomic_cas((mem), last - 1, last) != last); \ + (--last != 0); }) + +#define apr_atomic_inc(mem) \ +({ register apr_atomic_t last; \ + do { \ + last = *(mem); \ + } while (apr_atomic_cas((mem), last + 1, last) != last); \ + }) + +#define apr_atomic_set(mem, val) (*(mem) = val) +#define apr_atomic_read(mem) (*(mem)) +#define apr_atomic_init(pool) APR_SUCCESS + +#elif defined(__MVS__) /* OS/390 */ + +#define apr_atomic_t cs_t + +apr_int32_t apr_atomic_add(volatile apr_atomic_t *mem, apr_int32_t val); +apr_uint32_t apr_atomic_cas(volatile apr_atomic_t *mem, apr_uint32_t swap, + apr_uint32_t cmp); +#define APR_OVERRIDE_ATOMIC_ADD 1 +#define APR_OVERRIDE_ATOMIC_CAS 1 + +#define apr_atomic_inc(mem) apr_atomic_add(mem, 1) +#define apr_atomic_dec(mem) apr_atomic_add(mem, -1) +#define apr_atomic_init(pool) APR_SUCCESS + +/* warning: the following two operations, _read and _set, are atomic + * if the memory variables are aligned (the usual case). + * + * If you try really hard and manage to mis-align them, they are not + * guaranteed to be atomic on S/390. But then your program will blow up + * with SIGBUS on a sparc, or with a S0C6 abend if you use the mis-aligned + * variables with other apr_atomic_* operations on OS/390. + */ + +#define apr_atomic_read(p) (*p) +#define apr_atomic_set(mem, val) (*mem = val) + +#endif /* end big if-elseif switch for platform-specifics */ + + +/* Default implementation of the atomic API + * The definitions above may override some or all of the + * atomic functions with optimized, platform-specific versions. + * Any operation that hasn't been overridden as a macro above + * is declared as a function here, unless APR_OVERRIDE_ATOMIC_[OPERATION] + * is defined. (The purpose of the APR_OVERRIDE_ATOMIC_* is + * to allow a platform to declare an apr_atomic_*() function + * with a different signature than the default.) + */ + +#if !defined(apr_atomic_t) +#define apr_atomic_t apr_uint32_t +#endif + +#if !defined(apr_atomic_init) && !defined(APR_OVERRIDE_ATOMIC_INIT) +apr_status_t apr_atomic_init(apr_pool_t *p); +#endif + +#if !defined(apr_atomic_read) && !defined(APR_OVERRIDE_ATOMIC_READ) +#define apr_atomic_read(p) *p +#endif + +#if !defined(apr_atomic_set) && !defined(APR_OVERRIDE_ATOMIC_SET) +void apr_atomic_set(volatile apr_atomic_t *mem, apr_uint32_t val); +#define APR_ATOMIC_NEED_DEFAULT_INIT 1 +#endif + +#if !defined(apr_atomic_add) && !defined(APR_OVERRIDE_ATOMIC_ADD) +void apr_atomic_add(volatile apr_atomic_t *mem, apr_uint32_t val); +#define APR_ATOMIC_NEED_DEFAULT_INIT 1 +#endif + +#if !defined(apr_atomic_inc) && !defined(APR_OVERRIDE_ATOMIC_INC) +void apr_atomic_inc(volatile apr_atomic_t *mem); +#define APR_ATOMIC_NEED_DEFAULT_INIT 1 +#endif + +#if !defined(apr_atomic_dec) && !defined(APR_OVERRIDE_ATOMIC_DEC) +int apr_atomic_dec(volatile apr_atomic_t *mem); +#define APR_ATOMIC_NEED_DEFAULT_INIT 1 +#endif + +#if !defined(apr_atomic_cas) && !defined(APR_OVERRIDE_ATOMIC_CAS) +apr_uint32_t apr_atomic_cas(volatile apr_uint32_t *mem,long with,long cmp); +#define APR_ATOMIC_NEED_DEFAULT_INIT 1 +#endif + +#if !defined(apr_atomic_casptr) && !defined(APR_OVERRIDE_ATOMIC_CASPTR) +#if APR_SIZEOF_VOIDP == 4 +#define apr_atomic_casptr(mem, with, cmp) (void *)apr_atomic_cas((apr_uint32_t *)(mem), (long)(with), (long)cmp) +#else +void *apr_atomic_casptr(volatile void **mem, void *with, const void *cmp); +#define APR_ATOMIC_NEED_DEFAULT_INIT 1 +#endif +#endif + +#ifndef APR_ATOMIC_NEED_DEFAULT_INIT +#define APR_ATOMIC_NEED_DEFAULT_INIT 0 +#endif + +/* If we're using the default versions of any of the atomic functions, + * we'll need the atomic init to set up mutexes. If a platform-specific + * override above has replaced the atomic_init with a macro, it's an error. + */ +#if APR_ATOMIC_NEED_DEFAULT_INIT +#if defined(apr_atomic_init) || defined(APR_OVERRIDE_ATOMIC_INIT) +#error Platform has redefined apr_atomic_init, but other default default atomics require a default apr_atomic_init +#endif +#endif /* APR_ATOMIC_NEED_DEFAULT_INIT */ + +#endif /* !DOXYGEN */ + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* !APR_ATOMIC_H */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_compat.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_compat.h new file mode 100644 index 00000000..45500c0a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_compat.h @@ -0,0 +1,231 @@ +/* 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. + */ + +#ifndef APR_COMPAT_H +#define APR_COMPAT_H + + /** + * @file apr_compat.h + * @brief APR Legacy Apache 1.3 Compatibility + * @deprecated These defines are only present for historical purposes + */ + +/** + * @defgroup apr_compat APR Legacy Apache 1.3 Compatibility + * @ingroup APR + * @{ + */ + +/* redefine 1.3.x symbols to those that now live in libapr */ + +/** @see APR_INLINE */ +#define ap_inline APR_INLINE + +/** @deprecated @see apr_md5_ctx_t */ +#define ap_md5_ctx_t apr_md5_ctx_t +/** @deprecated @see apr_md5_encode */ +#define ap_MD5Encode apr_md5_encode +/** @deprecated @see apr_md5_final */ +#define ap_MD5Final apr_md5_final +/** @deprecated @see apr_md5_init */ +#define ap_MD5Init apr_md5_init +/** @deprecated @see apr_md5_update */ +#define ap_MD5Update apr_md5_update +/** @deprecated @see apr_array_append */ +#define ap_append_arrays apr_array_append +/** @deprecated @see apr_array_cat */ +#define ap_array_cat apr_array_cat +/** @deprecated @see apr_array_header_t */ +#define ap_array_header_t apr_array_header_t +/** @deprecated @see apr_array_pstrcat */ +#define ap_array_pstrcat apr_array_pstrcat +/** @deprecated @see apr_pool_free_blocks_num_bytes */ +#define ap_bytes_in_free_blocks apr_pool_free_blocks_num_bytes +/** @deprecated @see apr_pool_num_bytes */ +#define ap_bytes_in_pool apr_pool_num_bytes +/** @deprecated @see apr_check_file_time */ +#define ap_check_file_time apr_check_file_time +/** @deprecated @see apr_filetype_e */ +#define ap_filetype_e apr_filetype_e +/** @deprecated @see apr_pool_cleanup_for_exec */ +#define ap_cleanup_for_exec apr_pool_cleanup_for_exec +/** @deprecated @see apr_pool_clear */ +#define ap_clear_pool apr_pool_clear +/** @deprecated @see apr_table_clear */ +#define ap_clear_table apr_table_clear +/** @deprecated @see apr_array_copy */ +#define ap_copy_array apr_array_copy +/** @deprecated @see apr_array_copy_hdr */ +#define ap_copy_array_hdr apr_array_copy_hdr +/** @deprecated @see apr_table_copy */ +#define ap_copy_table apr_table_copy +/** @deprecated @see apr_cpystrn */ +#define ap_cpystrn apr_cpystrn +/** @deprecated @see apr_day_snames */ +#define ap_day_snames apr_day_snames +/** @deprecated @see apr_pool_destroy */ +#define ap_destroy_pool apr_pool_destroy +/** @deprecated @see apr_time_exp_t */ +#define ap_exploded_time_t apr_time_exp_t +/** @deprecated @see apr_fnmatch */ +#define ap_fnmatch apr_fnmatch +/** @deprecated @see apr_getopt */ +#define ap_getopt apr_getopt +/** @deprecated @see apr_inet_addr */ +#define ap_inet_addr apr_inet_addr +/** @deprecated @see apr_pool_alloc_init */ +#define ap_init_alloc apr_pool_alloc_init +/** @deprecated @see apr_is_empty_table */ +#define ap_is_empty_table apr_is_empty_table +/** @deprecated @see apr_fnmatch_test */ +#define ap_is_fnmatch apr_fnmatch_test +/** @deprecated @see apr_pool_cleanup_kill */ +#define ap_kill_cleanup apr_pool_cleanup_kill +/** @deprecated @see apr_array_make */ +#define ap_make_array apr_array_make +/** @deprecated @see apr_pool_sub_make */ +#define ap_make_sub_pool apr_pool_sub_make +/** @deprecated @see apr_table_make */ +#define ap_make_table apr_table_make +/** @deprecated @see apr_month_snames */ +#define ap_month_snames apr_month_snames +/** @deprecated @see apr_pool_note_subprocess*/ +#define ap_note_subprocess apr_pool_note_subprocess +/** @deprecated @see apr_pool_cleanup_null */ +#define ap_null_cleanup apr_pool_cleanup_null +/** @deprecated @see apr_filepath_merge */ +#define ap_os_canonical_filename apr_filepath_merge +/** @deprecated @see apr_filepath_merge */ +#define ap_os_case_canonical_filename apr_filepath_merge +/** @deprecated @see apr_dso_load */ +#define ap_os_dso_load apr_dso_load +/** @deprecated @see apr_dso_unload */ +#define ap_os_dso_unload apr_dso_unload +/** @deprecated @see apr_dso_sym */ +#define ap_os_dso_sym apr_dso_sym +/** @deprecated @see apr_dso_error */ +#define ap_os_dso_error apr_dso_error +/** @deprecated @see apr_filepath_merge + * @warning apr_filepath_merge rejects invalid filenames */ +#define ap_os_is_filename_valid apr_filepath_merge +/** @deprecated @see apr_proc_kill */ +#define ap_os_kill apr_proc_kill +/** @deprecated @see apr_filepath_merge */ +#define ap_os_systemcase_canonical_filename apr_filepath_merge +/** @deprecated @see apr_table_overlap */ +#define ap_overlap_tables apr_table_overlap +/** @deprecated @see apr_table_overlay */ +#define ap_overlay_tables apr_table_overlay +/** @deprecated @see apr_palloc */ +#define ap_palloc apr_palloc +/** @deprecated @see apr_pcalloc */ +#define ap_pcalloc apr_pcalloc +/** @deprecated @see apr_pool_join */ +#define ap_pool_join apr_pool_join +/** @deprecated @see apr_psprintf */ +#define ap_psprintf apr_psprintf +/** @deprecated @see apr_pstrcat */ +#define ap_pstrcat apr_pstrcat +/** @deprecated @see apr_pstrdup */ +#define ap_pstrdup apr_pstrdup +/** @deprecated @see apr_pstrndup */ +#define ap_pstrndup apr_pstrndup +/** @deprecated @see apr_array_push */ +#define ap_push_array apr_array_push +/** @deprecated @see apr_pvsprintf */ +#define ap_pvsprintf apr_pvsprintf +/** @deprecated @see apr_pool_cleanup_register */ +#define ap_register_cleanup apr_pool_cleanup_register +/** @deprecated @see apr_proc_other_child_register */ +#define ap_register_other_child apr_proc_other_child_register +/** @deprecated @see apr_pool_cleanup_run */ +#define ap_run_cleanup apr_pool_cleanup_run +/** @deprecated @see apr_signal */ +#define ap_signal apr_signal +/** @deprecated @see apr_snprintf */ +#define ap_snprintf apr_snprintf +/** @deprecated @see apr_table_add */ +#define ap_table_add apr_table_add +/** @deprecated @see apr_table_addn */ +#define ap_table_addn apr_table_addn +/** @deprecated @see apr_table_do */ +#define ap_table_do apr_table_do +/** @deprecated @see apr_table_elts */ +#define ap_table_elts apr_table_elts +/** @deprecated @see apr_table_get */ +#define ap_table_get apr_table_get +/** @deprecated @see apr_table_merge */ +#define ap_table_merge apr_table_merge +/** @deprecated @see apr_table_mergen */ +#define ap_table_mergen apr_table_mergen +/** @deprecated @see apr_table_set */ +#define ap_table_set apr_table_set +/** @deprecated @see apr_table_setn */ +#define ap_table_setn apr_table_setn +/** @deprecated @see apr_table_unset */ +#define ap_table_unset apr_table_unset +/** @deprecated @see apr_proc_other_child_unregister */ +#define ap_unregister_other_child apr_proc_other_child_unregister +/** @deprecated @see apr_password_validate */ +#define ap_validate_password apr_password_validate +/** @deprecated @see apr_vformatter */ +#define ap_vformatter apr_vformatter +/** @deprecated @see apr_vsnprintf */ +#define ap_vsnprintf apr_vsnprintf +/** @deprecated @see apr_wait_t */ +#define ap_wait_t apr_wait_t + +/** @deprecated @see apr_isalnum */ +#define ap_isalnum apr_isalnum +/** @deprecated @see apr_isalpha*/ +#define ap_isalpha apr_isalpha +/** @deprecated @see apr_iscntrl */ +#define ap_iscntrl apr_iscntrl +/** @deprecated @see apr_isdigit */ +#define ap_isdigit apr_isdigit +/** @deprecated @see apr_isgraph */ +#define ap_isgraph apr_isgraph +/** @deprecated @see apr_islower */ +#define ap_islower apr_islower +/** @deprecated @see apr_isascii */ +#define ap_isascii apr_isascii +/** @deprecated @see apr_isprint */ +#define ap_isprint apr_isprint +/** @deprecated @see apr_ispunct */ +#define ap_ispunct apr_ispunct +/** @deprecated @see apr_isspace */ +#define ap_isspace apr_isspace +/** @deprecated @see apr_isupper */ +#define ap_isupper apr_isupper +/** @deprecated @see apr_isxdigit */ +#define ap_isxdigit apr_isxdigit +/** @deprecated @see apr_tolower */ +#define ap_tolower apr_tolower +/** @deprecated @see apr_toupper */ +#define ap_toupper apr_toupper + +/** @deprecated @see APR_USEC_PER_SEC */ +#define AP_USEC_PER_SEC APR_USEC_PER_SEC +/** @deprecated @see APR_RFC822_DATE_LEN */ +#define AP_RFC822_DATE_LEN APR_RFC822_DATE_LEN +/** @deprecated @see APR_OVERLAP_TABLES_MERGE */ +#define AP_OVERLAP_TABLES_MERGE APR_OVERLAP_TABLES_MERGE +/** @deprecated @see APR_OVERLAP_TABLES_SET */ +#define AP_OVERLAP_TABLES_SET APR_OVERLAP_TABLES_SET + +/** @} */ + +#endif /* APR_COMPAT_H */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_dso.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_dso.h new file mode 100644 index 00000000..ac701cfd --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_dso.h @@ -0,0 +1,94 @@ +/* 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. + */ + +#ifndef APR_DSO_DOT_H +#define APR_DSO_DOT_H + +/** + * @file apr_dso.h + * @brief APR Dynamic Object Handling Routines + */ + +#include "apr.h" +#include "apr_pools.h" +#include "apr_errno.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup apr_dso Dynamic Object Handling + * @ingroup APR + * @{ + */ + +#if APR_HAS_DSO || defined(DOXYGEN) + +/** + * Structure for referencing dynamic objects + */ +typedef struct apr_dso_handle_t apr_dso_handle_t; + +/** + * Structure for referencing symbols from dynamic objects + */ +typedef void * apr_dso_handle_sym_t; + +/** + * Load a DSO library. + * @param res_handle Location to store new handle for the DSO. + * @param path Path to the DSO library + * @param ctx Pool to use. + * @bug We aught to provide an alternative to RTLD_GLOBAL, which + * is the only supported method of loading DSOs today. + */ +APR_DECLARE(apr_status_t) apr_dso_load(apr_dso_handle_t **res_handle, + const char *path, apr_pool_t *ctx); + +/** + * Close a DSO library. + * @param handle handle to close. + */ +APR_DECLARE(apr_status_t) apr_dso_unload(apr_dso_handle_t *handle); + +/** + * Load a symbol from a DSO handle. + * @param ressym Location to store the loaded symbol + * @param handle handle to load the symbol from. + * @param symname Name of the symbol to load. + */ +APR_DECLARE(apr_status_t) apr_dso_sym(apr_dso_handle_sym_t *ressym, + apr_dso_handle_t *handle, + const char *symname); + +/** + * Report more information when a DSO function fails. + * @param dso The dso handle that has been opened + * @param buf Location to store the dso error + * @param bufsize The size of the provided buffer + */ +APR_DECLARE(const char *) apr_dso_error(apr_dso_handle_t *dso, char *buf, apr_size_t bufsize); + +#endif /* APR_HAS_DSO */ + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_env.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_env.h new file mode 100644 index 00000000..05419c37 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_env.h @@ -0,0 +1,67 @@ +/* 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. + */ + +#ifndef APR_ENV_H +#define APR_ENV_H +/** + * @file apr_env.h + * @brief APR Environment functions + */ +#include "apr_errno.h" +#include "apr_pools.h" + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/** + * @defgroup apr_env Functions for manupulating the environment + * @ingroup APR + * @{ + */ + +/** + * Get the value of an environment variable + * @param value the returned value, allocated from @a pool + * @param envvar the name of the environment variable + * @param pool where to allocate @a value and any temporary storage from + */ +APR_DECLARE(apr_status_t) apr_env_get(char **value, const char *envvar, + apr_pool_t *pool); + +/** + * Set the value of an environment variable + * @param envvar the name of the environment variable + * @param value the value to set + * @param pool where to allocate temporary storage from + */ +APR_DECLARE(apr_status_t) apr_env_set(const char *envvar, const char *value, + apr_pool_t *pool); + +/** + * Delete a variable from the environment + * @param envvar the name of the environment variable + * @param pool where to allocate temporary storage from + */ +APR_DECLARE(apr_status_t) apr_env_delete(const char *envvar, apr_pool_t *pool); + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* ! APR_ENV_H */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_errno.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_errno.h new file mode 100644 index 00000000..9d1d8447 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_errno.h @@ -0,0 +1,1219 @@ +/* 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. + */ + +#ifndef APR_ERRNO_H +#define APR_ERRNO_H + +/** + * @file apr_errno.h + * @brief APR Error Codes + */ + +#include "apr.h" + +#if APR_HAVE_ERRNO_H +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/** + * @defgroup apr_errno Error Codes + * @ingroup APR + * @{ + */ + +/** + * Type for specifying an error or status code. + */ +typedef int apr_status_t; + +/** + * Return a human readable string describing the specified error. + * @param statcode The error code the get a string for. + * @param buf A buffer to hold the error string. + * @param bufsize Size of the buffer to hold the string. + */ +APR_DECLARE(char *) apr_strerror(apr_status_t statcode, char *buf, + apr_size_t bufsize); + +#if defined(DOXYGEN) +/** + * @def APR_FROM_OS_ERROR(os_err_type syserr) + * Fold a platform specific error into an apr_status_t code. + * @return apr_status_t + * @param e The platform os error code. + * @warning macro implementation; the syserr argument may be evaluated + * multiple times. + */ +#define APR_FROM_OS_ERROR(e) (e == 0 ? APR_SUCCESS : e + APR_OS_START_SYSERR) + +/** + * @def APR_TO_OS_ERROR(apr_status_t statcode) + * @return os_err_type + * Fold an apr_status_t code back to the native platform defined error. + * @param e The apr_status_t folded platform os error code. + * @warning macro implementation; the statcode argument may be evaluated + * multiple times. If the statcode was not created by apr_get_os_error + * or APR_FROM_OS_ERROR, the results are undefined. + */ +#define APR_TO_OS_ERROR(e) (e == 0 ? APR_SUCCESS : e - APR_OS_START_SYSERR) + +/** @def apr_get_os_error() + * @return apr_status_t the last platform error, folded into apr_status_t, on most platforms + * @remark This retrieves errno, or calls a GetLastError() style function, and + * folds it with APR_FROM_OS_ERROR. Some platforms (such as OS2) have no + * such mechanism, so this call may be unsupported. Do NOT use this + * call for socket errors from socket, send, recv etc! + */ + +/** @def apr_set_os_error(e) + * Reset the last platform error, unfolded from an apr_status_t, on some platforms + * @param e The OS error folded in a prior call to APR_FROM_OS_ERROR() + * @warning This is a macro implementation; the statcode argument may be evaluated + * multiple times. If the statcode was not created by apr_get_os_error + * or APR_FROM_OS_ERROR, the results are undefined. This macro sets + * errno, or calls a SetLastError() style function, unfolding statcode + * with APR_TO_OS_ERROR. Some platforms (such as OS2) have no such + * mechanism, so this call may be unsupported. + */ + +/** @def apr_get_netos_error() + * Return the last socket error, folded into apr_status_t, on all platforms + * @remark This retrieves errno or calls a GetLastSocketError() style function, + * and folds it with APR_FROM_OS_ERROR. + */ + +/** @def apr_set_netos_error(e) + * Reset the last socket error, unfolded from an apr_status_t + * @param e The socket error folded in a prior call to APR_FROM_OS_ERROR() + * @warning This is a macro implementation; the statcode argument may be evaluated + * multiple times. If the statcode was not created by apr_get_os_error + * or APR_FROM_OS_ERROR, the results are undefined. This macro sets + * errno, or calls a WSASetLastError() style function, unfolding + * socketcode with APR_TO_OS_ERROR. + */ + +#endif /* defined(DOXYGEN) */ + +/** + * APR_OS_START_ERROR is where the APR specific error values start. + */ +#define APR_OS_START_ERROR 20000 +/** + * APR_OS_ERRSPACE_SIZE is the maximum number of errors you can fit + * into one of the error/status ranges below -- except for + * APR_OS_START_USERERR, which see. + */ +#define APR_OS_ERRSPACE_SIZE 50000 +/** + * APR_OS_START_STATUS is where the APR specific status codes start. + */ +#define APR_OS_START_STATUS (APR_OS_START_ERROR + APR_OS_ERRSPACE_SIZE) +/** + * APR_OS_START_USERERR are reserved for applications that use APR that + * layer their own error codes along with APR's. Note that the + * error immediately following this one is set ten times farther + * away than usual, so that users of apr have a lot of room in + * which to declare custom error codes. + */ +#define APR_OS_START_USERERR (APR_OS_START_STATUS + APR_OS_ERRSPACE_SIZE) +/** + * APR_OS_START_USEERR is obsolete, defined for compatibility only. + * Use APR_OS_START_USERERR instead. + */ +#define APR_OS_START_USEERR APR_OS_START_USERERR +/** + * APR_OS_START_CANONERR is where APR versions of errno values are defined + * on systems which don't have the corresponding errno. + */ +#define APR_OS_START_CANONERR (APR_OS_START_USERERR \ + + (APR_OS_ERRSPACE_SIZE * 10)) +/** + * APR_OS_START_EAIERR folds EAI_ error codes from getaddrinfo() into + * apr_status_t values. + */ +#define APR_OS_START_EAIERR (APR_OS_START_CANONERR + APR_OS_ERRSPACE_SIZE) +/** + * APR_OS_START_SYSERR folds platform-specific system error values into + * apr_status_t values. + */ +#define APR_OS_START_SYSERR (APR_OS_START_EAIERR + APR_OS_ERRSPACE_SIZE) + +/** no error. @see APR_STATUS_IS_SUCCESS */ +#define APR_SUCCESS 0 + +/** + * @defgroup APR_Error APR Error Values + *
    + * APR ERROR VALUES
    + * APR_ENOSTAT      APR was unable to perform a stat on the file 
    + * APR_ENOPOOL      APR was not provided a pool with which to allocate memory
    + * APR_EBADDATE     APR was given an invalid date 
    + * APR_EINVALSOCK   APR was given an invalid socket
    + * APR_ENOPROC      APR was not given a process structure
    + * APR_ENOTIME      APR was not given a time structure
    + * APR_ENODIR       APR was not given a directory structure
    + * APR_ENOLOCK      APR was not given a lock structure
    + * APR_ENOPOLL      APR was not given a poll structure
    + * APR_ENOSOCKET    APR was not given a socket
    + * APR_ENOTHREAD    APR was not given a thread structure
    + * APR_ENOTHDKEY    APR was not given a thread key structure
    + * APR_ENOSHMAVAIL  There is no more shared memory available
    + * APR_EDSOOPEN     APR was unable to open the dso object.  For more 
    + *                  information call apr_dso_error().
    + * APR_EGENERAL     General failure (specific information not available)
    + * APR_EBADIP       The specified IP address is invalid
    + * APR_EBADMASK     The specified netmask is invalid
    + * APR_ESYMNOTFOUND Could not find the requested symbol
    + * 
    + * + *
    + * APR STATUS VALUES
    + * APR_INCHILD        Program is currently executing in the child
    + * APR_INPARENT       Program is currently executing in the parent
    + * APR_DETACH         The thread is detached
    + * APR_NOTDETACH      The thread is not detached
    + * APR_CHILD_DONE     The child has finished executing
    + * APR_CHILD_NOTDONE  The child has not finished executing
    + * APR_TIMEUP         The operation did not finish before the timeout
    + * APR_INCOMPLETE     The operation was incomplete although some processing
    + *                    was performed and the results are partially valid
    + * APR_BADCH          Getopt found an option not in the option string
    + * APR_BADARG         Getopt found an option that is missing an argument 
    + *                    and an argument was specified in the option string
    + * APR_EOF            APR has encountered the end of the file
    + * APR_NOTFOUND       APR was unable to find the socket in the poll structure
    + * APR_ANONYMOUS      APR is using anonymous shared memory
    + * APR_FILEBASED      APR is using a file name as the key to the shared memory
    + * APR_KEYBASED       APR is using a shared key as the key to the shared memory
    + * APR_EINIT          Ininitalizer value.  If no option has been found, but 
    + *                    the status variable requires a value, this should be used
    + * APR_ENOTIMPL       The APR function has not been implemented on this 
    + *                    platform, either because nobody has gotten to it yet, 
    + *                    or the function is impossible on this platform.
    + * APR_EMISMATCH      Two passwords do not match.
    + * APR_EABSOLUTE      The given path was absolute.
    + * APR_ERELATIVE      The given path was relative.
    + * APR_EINCOMPLETE    The given path was neither relative nor absolute.
    + * APR_EABOVEROOT     The given path was above the root path.
    + * APR_EBUSY          The given lock was busy.
    + * APR_EPROC_UNKNOWN  The given process wasn't recognized by APR
    + * 
    + * @{ + */ +/** @see APR_STATUS_IS_ENOSTAT */ +#define APR_ENOSTAT (APR_OS_START_ERROR + 1) +/** @see APR_STATUS_IS_ENOPOOL */ +#define APR_ENOPOOL (APR_OS_START_ERROR + 2) +/* empty slot: +3 */ +/** @see APR_STATUS_IS_EBADDATE */ +#define APR_EBADDATE (APR_OS_START_ERROR + 4) +/** @see APR_STATUS_IS_EINVALSOCK */ +#define APR_EINVALSOCK (APR_OS_START_ERROR + 5) +/** @see APR_STATUS_IS_ENOPROC */ +#define APR_ENOPROC (APR_OS_START_ERROR + 6) +/** @see APR_STATUS_IS_ENOTIME */ +#define APR_ENOTIME (APR_OS_START_ERROR + 7) +/** @see APR_STATUS_IS_ENODIR */ +#define APR_ENODIR (APR_OS_START_ERROR + 8) +/** @see APR_STATUS_IS_ENOLOCK */ +#define APR_ENOLOCK (APR_OS_START_ERROR + 9) +/** @see APR_STATUS_IS_ENOPOLL */ +#define APR_ENOPOLL (APR_OS_START_ERROR + 10) +/** @see APR_STATUS_IS_ENOSOCKET */ +#define APR_ENOSOCKET (APR_OS_START_ERROR + 11) +/** @see APR_STATUS_IS_ENOTHREAD */ +#define APR_ENOTHREAD (APR_OS_START_ERROR + 12) +/** @see APR_STATUS_IS_ENOTHDKEY */ +#define APR_ENOTHDKEY (APR_OS_START_ERROR + 13) +/** @see APR_STATUS_IS_EGENERAL */ +#define APR_EGENERAL (APR_OS_START_ERROR + 14) +/** @see APR_STATUS_IS_ENOSHMAVAIL */ +#define APR_ENOSHMAVAIL (APR_OS_START_ERROR + 15) +/** @see APR_STATUS_IS_EBADIP */ +#define APR_EBADIP (APR_OS_START_ERROR + 16) +/** @see APR_STATUS_IS_EBADMASK */ +#define APR_EBADMASK (APR_OS_START_ERROR + 17) +/* empty slot: +18 */ +/** @see APR_STATUS_IS_EDSOPEN */ +#define APR_EDSOOPEN (APR_OS_START_ERROR + 19) +/** @see APR_STATUS_IS_EABSOLUTE */ +#define APR_EABSOLUTE (APR_OS_START_ERROR + 20) +/** @see APR_STATUS_IS_ERELATIVE */ +#define APR_ERELATIVE (APR_OS_START_ERROR + 21) +/** @see APR_STATUS_IS_EINCOMPLETE */ +#define APR_EINCOMPLETE (APR_OS_START_ERROR + 22) +/** @see APR_STATUS_IS_EABOVEROOT */ +#define APR_EABOVEROOT (APR_OS_START_ERROR + 23) +/** @see APR_STATUS_IS_EBADPATH */ +#define APR_EBADPATH (APR_OS_START_ERROR + 24) +/** @see APR_STATUS_IS_EPATHWILD */ +#define APR_EPATHWILD (APR_OS_START_ERROR + 25) +/** @see APR_STATUS_IS_ESYMNOTFOUND */ +#define APR_ESYMNOTFOUND (APR_OS_START_ERROR + 26) +/** @see APR_STATUS_IS_EPROC_UNKNOWN */ +#define APR_EPROC_UNKNOWN (APR_OS_START_ERROR + 27) +/** @} */ + +/** + * @defgroup APR_STATUS_IS Status Value Tests + * @warning For any particular error condition, more than one of these tests + * may match. This is because platform-specific error codes may not + * always match the semantics of the POSIX codes these tests (and the + * correcponding APR error codes) are named after. A notable example + * are the APR_STATUS_IS_ENOENT and APR_STATUS_IS_ENOTDIR tests on + * Win32 platforms. The programmer should always be aware of this and + * adjust the order of the tests accordingly. + * @{ + */ +/** + * APR was unable to perform a stat on the file + * @warning always use this test, as platform-specific variances may meet this + * more than one error code + */ +#define APR_STATUS_IS_ENOSTAT(s) ((s) == APR_ENOSTAT) +/** + * APR was not provided a pool with which to allocate memory + * @warning always use this test, as platform-specific variances may meet this + * more than one error code + */ +#define APR_STATUS_IS_ENOPOOL(s) ((s) == APR_ENOPOOL) +/** APR was given an invalid date */ +#define APR_STATUS_IS_EBADDATE(s) ((s) == APR_EBADDATE) +/** APR was given an invalid socket */ +#define APR_STATUS_IS_EINVALSOCK(s) ((s) == APR_EINVALSOCK) +/** APR was not given a process structure */ +#define APR_STATUS_IS_ENOPROC(s) ((s) == APR_ENOPROC) +/** APR was not given a time structure */ +#define APR_STATUS_IS_ENOTIME(s) ((s) == APR_ENOTIME) +/** APR was not given a directory structure */ +#define APR_STATUS_IS_ENODIR(s) ((s) == APR_ENODIR) +/** APR was not given a lock structure */ +#define APR_STATUS_IS_ENOLOCK(s) ((s) == APR_ENOLOCK) +/** APR was not given a poll structure */ +#define APR_STATUS_IS_ENOPOLL(s) ((s) == APR_ENOPOLL) +/** APR was not given a socket */ +#define APR_STATUS_IS_ENOSOCKET(s) ((s) == APR_ENOSOCKET) +/** APR was not given a thread structure */ +#define APR_STATUS_IS_ENOTHREAD(s) ((s) == APR_ENOTHREAD) +/** APR was not given a thread key structure */ +#define APR_STATUS_IS_ENOTHDKEY(s) ((s) == APR_ENOTHDKEY) +/** Generic Error which can not be put into another spot */ +#define APR_STATUS_IS_EGENERAL(s) ((s) == APR_EGENERAL) +/** There is no more shared memory available */ +#define APR_STATUS_IS_ENOSHMAVAIL(s) ((s) == APR_ENOSHMAVAIL) +/** The specified IP address is invalid */ +#define APR_STATUS_IS_EBADIP(s) ((s) == APR_EBADIP) +/** The specified netmask is invalid */ +#define APR_STATUS_IS_EBADMASK(s) ((s) == APR_EBADMASK) +/* empty slot: +18 */ +/** + * APR was unable to open the dso object. + * For more information call apr_dso_error(). + */ +#if defined(WIN32) +#define APR_STATUS_IS_EDSOOPEN(s) ((s) == APR_EDSOOPEN \ + || APR_TO_OS_ERROR(s) == ERROR_MOD_NOT_FOUND) +#else +#define APR_STATUS_IS_EDSOOPEN(s) ((s) == APR_EDSOOPEN) +#endif +/** The given path was absolute. */ +#define APR_STATUS_IS_EABSOLUTE(s) ((s) == APR_EABSOLUTE) +/** The given path was relative. */ +#define APR_STATUS_IS_ERELATIVE(s) ((s) == APR_ERELATIVE) +/** The given path was neither relative nor absolute. */ +#define APR_STATUS_IS_EINCOMPLETE(s) ((s) == APR_EINCOMPLETE) +/** The given path was above the root path. */ +#define APR_STATUS_IS_EABOVEROOT(s) ((s) == APR_EABOVEROOT) +/** The given path was bad. */ +#define APR_STATUS_IS_EBADPATH(s) ((s) == APR_EBADPATH) +/** The given path contained wildcards. */ +#define APR_STATUS_IS_EPATHWILD(s) ((s) == APR_EPATHWILD) +/** Could not find the requested symbol. + * For more information call apr_dso_error(). + */ +#if defined(WIN32) +#define APR_STATUS_IS_ESYMNOTFOUND(s) ((s) == APR_ESYMNOTFOUND \ + || APR_TO_OS_ERROR(s) == ERROR_PROC_NOT_FOUND) +#else +#define APR_STATUS_IS_ESYMNOTFOUND(s) ((s) == APR_ESYMNOTFOUND) +#endif +/** The given process was not recognized by APR. */ +#define APR_STATUS_IS_EPROC_UNKNOWN(s) ((s) == APR_EPROC_UNKNOWN) + +/** @} */ + +/** + * @addtogroup APR_Error + * @{ + */ +/** @see APR_STATUS_IS_INCHILD */ +#define APR_INCHILD (APR_OS_START_STATUS + 1) +/** @see APR_STATUS_IS_INPARENT */ +#define APR_INPARENT (APR_OS_START_STATUS + 2) +/** @see APR_STATUS_IS_DETACH */ +#define APR_DETACH (APR_OS_START_STATUS + 3) +/** @see APR_STATUS_IS_NOTDETACH */ +#define APR_NOTDETACH (APR_OS_START_STATUS + 4) +/** @see APR_STATUS_IS_CHILD_DONE */ +#define APR_CHILD_DONE (APR_OS_START_STATUS + 5) +/** @see APR_STATUS_IS_CHILD_NOTDONE */ +#define APR_CHILD_NOTDONE (APR_OS_START_STATUS + 6) +/** @see APR_STATUS_IS_TIMEUP */ +#define APR_TIMEUP (APR_OS_START_STATUS + 7) +/** @see APR_STATUS_IS_INCOMPLETE */ +#define APR_INCOMPLETE (APR_OS_START_STATUS + 8) +/* empty slot: +9 */ +/* empty slot: +10 */ +/* empty slot: +11 */ +/** @see APR_STATUS_IS_BADCH */ +#define APR_BADCH (APR_OS_START_STATUS + 12) +/** @see APR_STATUS_IS_BADARG */ +#define APR_BADARG (APR_OS_START_STATUS + 13) +/** @see APR_STATUS_IS_EOF */ +#define APR_EOF (APR_OS_START_STATUS + 14) +/** @see APR_STATUS_IS_NOTFOUND */ +#define APR_NOTFOUND (APR_OS_START_STATUS + 15) +/* empty slot: +16 */ +/* empty slot: +17 */ +/* empty slot: +18 */ +/** @see APR_STATUS_IS_ANONYMOUS */ +#define APR_ANONYMOUS (APR_OS_START_STATUS + 19) +/** @see APR_STATUS_IS_FILEBASED */ +#define APR_FILEBASED (APR_OS_START_STATUS + 20) +/** @see APR_STATUS_IS_KEYBASED */ +#define APR_KEYBASED (APR_OS_START_STATUS + 21) +/** @see APR_STATUS_IS_EINIT */ +#define APR_EINIT (APR_OS_START_STATUS + 22) +/** @see APR_STATUS_IS_ENOTIMPL */ +#define APR_ENOTIMPL (APR_OS_START_STATUS + 23) +/** @see APR_STATUS_IS_EMISMATCH */ +#define APR_EMISMATCH (APR_OS_START_STATUS + 24) +/** @see APR_STATUS_IS_EBUSY */ +#define APR_EBUSY (APR_OS_START_STATUS + 25) +/** @} */ + +/** + * @addtogroup APR_STATUS_IS + * @{ + */ +/** + * Program is currently executing in the child + * @warning + * always use this test, as platform-specific variances may meet this + * more than one error code */ +#define APR_STATUS_IS_INCHILD(s) ((s) == APR_INCHILD) +/** + * Program is currently executing in the parent + * @warning + * always use this test, as platform-specific variances may meet this + * more than one error code + */ +#define APR_STATUS_IS_INPARENT(s) ((s) == APR_INPARENT) +/** + * The thread is detached + * @warning + * always use this test, as platform-specific variances may meet this + * more than one error code + */ +#define APR_STATUS_IS_DETACH(s) ((s) == APR_DETACH) +/** + * The thread is not detached + * @warning + * always use this test, as platform-specific variances may meet this + * more than one error code + */ +#define APR_STATUS_IS_NOTDETACH(s) ((s) == APR_NOTDETACH) +/** + * The child has finished executing + * @warning + * always use this test, as platform-specific variances may meet this + * more than one error code + */ +#define APR_STATUS_IS_CHILD_DONE(s) ((s) == APR_CHILD_DONE) +/** + * The child has not finished executing + * @warning + * always use this test, as platform-specific variances may meet this + * more than one error code + */ +#define APR_STATUS_IS_CHILD_NOTDONE(s) ((s) == APR_CHILD_NOTDONE) +/** + * The operation did not finish before the timeout + * @warning + * always use this test, as platform-specific variances may meet this + * more than one error code + */ +#define APR_STATUS_IS_TIMEUP(s) ((s) == APR_TIMEUP) +/** + * The operation was incomplete although some processing was performed + * and the results are partially valid. + * @warning + * always use this test, as platform-specific variances may meet this + * more than one error code + */ +#define APR_STATUS_IS_INCOMPLETE(s) ((s) == APR_INCOMPLETE) +/* empty slot: +9 */ +/* empty slot: +10 */ +/* empty slot: +11 */ +/** + * Getopt found an option not in the option string + * @warning + * always use this test, as platform-specific variances may meet this + * more than one error code + */ +#define APR_STATUS_IS_BADCH(s) ((s) == APR_BADCH) +/** + * Getopt found an option not in the option string and an argument was + * specified in the option string + * @warning + * always use this test, as platform-specific variances may meet this + * more than one error code + */ +#define APR_STATUS_IS_BADARG(s) ((s) == APR_BADARG) +/** + * APR has encountered the end of the file + * @warning + * always use this test, as platform-specific variances may meet this + * more than one error code + */ +#define APR_STATUS_IS_EOF(s) ((s) == APR_EOF) +/** + * APR was unable to find the socket in the poll structure + * @warning + * always use this test, as platform-specific variances may meet this + * more than one error code + */ +#define APR_STATUS_IS_NOTFOUND(s) ((s) == APR_NOTFOUND) +/* empty slot: +16 */ +/* empty slot: +17 */ +/* empty slot: +18 */ +/** + * APR is using anonymous shared memory + * @warning + * always use this test, as platform-specific variances may meet this + * more than one error code + */ +#define APR_STATUS_IS_ANONYMOUS(s) ((s) == APR_ANONYMOUS) +/** + * APR is using a file name as the key to the shared memory + * @warning + * always use this test, as platform-specific variances may meet this + * more than one error code + */ +#define APR_STATUS_IS_FILEBASED(s) ((s) == APR_FILEBASED) +/** + * APR is using a shared key as the key to the shared memory + * @warning + * always use this test, as platform-specific variances may meet this + * more than one error code + */ +#define APR_STATUS_IS_KEYBASED(s) ((s) == APR_KEYBASED) +/** + * Ininitalizer value. If no option has been found, but + * the status variable requires a value, this should be used + * @warning + * always use this test, as platform-specific variances may meet this + * more than one error code + */ +#define APR_STATUS_IS_EINIT(s) ((s) == APR_EINIT) +/** + * The APR function has not been implemented on this + * platform, either because nobody has gotten to it yet, + * or the function is impossible on this platform. + * @warning + * always use this test, as platform-specific variances may meet this + * more than one error code + */ +#define APR_STATUS_IS_ENOTIMPL(s) ((s) == APR_ENOTIMPL) +/** + * Two passwords do not match. + * @warning + * always use this test, as platform-specific variances may meet this + * more than one error code + */ +#define APR_STATUS_IS_EMISMATCH(s) ((s) == APR_EMISMATCH) +/** + * The given lock was busy + * @warning always use this test, as platform-specific variances may meet this + * more than one error code + */ +#define APR_STATUS_IS_EBUSY(s) ((s) == APR_EBUSY) + +/** @} */ + +/** + * @addtogroup APR_Error APR Error Values + * @{ + */ +/* APR CANONICAL ERROR VALUES */ +/** @see APR_STATUS_IS_EACCES */ +#ifdef EACCES +#define APR_EACCES EACCES +#else +#define APR_EACCES (APR_OS_START_CANONERR + 1) +#endif + +/** @see APR_STATUS_IS_EXIST */ +#ifdef EEXIST +#define APR_EEXIST EEXIST +#else +#define APR_EEXIST (APR_OS_START_CANONERR + 2) +#endif + +/** @see APR_STATUS_IS_ENAMETOOLONG */ +#ifdef ENAMETOOLONG +#define APR_ENAMETOOLONG ENAMETOOLONG +#else +#define APR_ENAMETOOLONG (APR_OS_START_CANONERR + 3) +#endif + +/** @see APR_STATUS_IS_ENOENT */ +#ifdef ENOENT +#define APR_ENOENT ENOENT +#else +#define APR_ENOENT (APR_OS_START_CANONERR + 4) +#endif + +/** @see APR_STATUS_IS_ENOTDIR */ +#ifdef ENOTDIR +#define APR_ENOTDIR ENOTDIR +#else +#define APR_ENOTDIR (APR_OS_START_CANONERR + 5) +#endif + +/** @see APR_STATUS_IS_ENOSPC */ +#ifdef ENOSPC +#define APR_ENOSPC ENOSPC +#else +#define APR_ENOSPC (APR_OS_START_CANONERR + 6) +#endif + +/** @see APR_STATUS_IS_ENOMEM */ +#ifdef ENOMEM +#define APR_ENOMEM ENOMEM +#else +#define APR_ENOMEM (APR_OS_START_CANONERR + 7) +#endif + +/** @see APR_STATUS_IS_EMFILE */ +#ifdef EMFILE +#define APR_EMFILE EMFILE +#else +#define APR_EMFILE (APR_OS_START_CANONERR + 8) +#endif + +/** @see APR_STATUS_IS_ENFILE */ +#ifdef ENFILE +#define APR_ENFILE ENFILE +#else +#define APR_ENFILE (APR_OS_START_CANONERR + 9) +#endif + +/** @see APR_STATUS_IS_EBADF */ +#ifdef EBADF +#define APR_EBADF EBADF +#else +#define APR_EBADF (APR_OS_START_CANONERR + 10) +#endif + +/** @see APR_STATUS_IS_EINVAL */ +#ifdef EINVAL +#define APR_EINVAL EINVAL +#else +#define APR_EINVAL (APR_OS_START_CANONERR + 11) +#endif + +/** @see APR_STATUS_IS_ESPIPE */ +#ifdef ESPIPE +#define APR_ESPIPE ESPIPE +#else +#define APR_ESPIPE (APR_OS_START_CANONERR + 12) +#endif + +/** + * @see APR_STATUS_IS_EAGAIN + * @warning use APR_STATUS_IS_EAGAIN instead of just testing this value + */ +#ifdef EAGAIN +#define APR_EAGAIN EAGAIN +#elif defined(EWOULDBLOCK) +#define APR_EAGAIN EWOULDBLOCK +#else +#define APR_EAGAIN (APR_OS_START_CANONERR + 13) +#endif + +/** @see APR_STATUS_IS_EINTR */ +#ifdef EINTR +#define APR_EINTR EINTR +#else +#define APR_EINTR (APR_OS_START_CANONERR + 14) +#endif + +/** @see APR_STATUS_IS_ENOTSOCK */ +#ifdef ENOTSOCK +#define APR_ENOTSOCK ENOTSOCK +#else +#define APR_ENOTSOCK (APR_OS_START_CANONERR + 15) +#endif + +/** @see APR_STATUS_IS_ECONNREFUSED */ +#ifdef ECONNREFUSED +#define APR_ECONNREFUSED ECONNREFUSED +#else +#define APR_ECONNREFUSED (APR_OS_START_CANONERR + 16) +#endif + +/** @see APR_STATUS_IS_EINPROGRESS */ +#ifdef EINPROGRESS +#define APR_EINPROGRESS EINPROGRESS +#else +#define APR_EINPROGRESS (APR_OS_START_CANONERR + 17) +#endif + +/** + * @see APR_STATUS_IS_ECONNABORTED + * @warning use APR_STATUS_IS_ECONNABORTED instead of just testing this value + */ + +#ifdef ECONNABORTED +#define APR_ECONNABORTED ECONNABORTED +#else +#define APR_ECONNABORTED (APR_OS_START_CANONERR + 18) +#endif + +/** @see APR_STATUS_IS_ECONNRESET */ +#ifdef ECONNRESET +#define APR_ECONNRESET ECONNRESET +#else +#define APR_ECONNRESET (APR_OS_START_CANONERR + 19) +#endif + +/** @see APR_STATUS_IS_ETIMEDOUT */ +#ifdef ETIMEDOUT +#define APR_ETIMEDOUT ETIMEDOUT +#else +#define APR_ETIMEDOUT (APR_OS_START_CANONERR + 20) +#endif + +/** @see APR_STATUS_IS_EHOSTUNREACH */ +#ifdef EHOSTUNREACH +#define APR_EHOSTUNREACH EHOSTUNREACH +#else +#define APR_EHOSTUNREACH (APR_OS_START_CANONERR + 21) +#endif + +/** @see APR_STATUS_IS_ENETUNREACH */ +#ifdef ENETUNREACH +#define APR_ENETUNREACH ENETUNREACH +#else +#define APR_ENETUNREACH (APR_OS_START_CANONERR + 22) +#endif + +/** @see APR_STATUS_IS_EFTYPE */ +#ifdef EFTYPE +#define APR_EFTYPE EFTYPE +#else +#define APR_EFTYPE (APR_OS_START_CANONERR + 23) +#endif + +/** @see APR_STATUS_IS_EPIPE */ +#ifdef EPIPE +#define APR_EPIPE EPIPE +#else +#define APR_EPIPE (APR_OS_START_CANONERR + 24) +#endif + +/** @see APR_STATUS_IS_EXDEV */ +#ifdef EXDEV +#define APR_EXDEV EXDEV +#else +#define APR_EXDEV (APR_OS_START_CANONERR + 25) +#endif + +/** @see APR_STATUS_IS_ENOTEMPTY */ +#ifdef ENOTEMPTY +#define APR_ENOTEMPTY ENOTEMPTY +#else +#define APR_ENOTEMPTY (APR_OS_START_CANONERR + 26) +#endif + +/** @} */ + +#if defined(OS2) && !defined(DOXYGEN) + +#define APR_FROM_OS_ERROR(e) (e == 0 ? APR_SUCCESS : e + APR_OS_START_SYSERR) +#define APR_TO_OS_ERROR(e) (e == 0 ? APR_SUCCESS : e - APR_OS_START_SYSERR) + +#define INCL_DOSERRORS +#define INCL_DOS + +/* Leave these undefined. + * OS2 doesn't rely on the errno concept. + * The API calls always return a result codes which + * should be filtered through APR_FROM_OS_ERROR(). + * + * #define apr_get_os_error() (APR_FROM_OS_ERROR(GetLastError())) + * #define apr_set_os_error(e) (SetLastError(APR_TO_OS_ERROR(e))) + */ + +/* A special case, only socket calls require this; + */ +#define apr_get_netos_error() (APR_FROM_OS_ERROR(errno)) +#define apr_set_netos_error(e) (errno = APR_TO_OS_ERROR(e)) + +/* And this needs to be greped away for good: + */ +#define APR_OS2_STATUS(e) (APR_FROM_OS_ERROR(e)) + +#define APR_STATUS_IS_SUCCESS(s) ((s) == APR_SUCCESS \ + || (s) == APR_OS_START_SYSERR + NO_ERROR) + +/* These can't sit in a private header, so in spite of the extra size, + * they need to be made available here. + */ +#define SOCBASEERR 10000 +#define SOCEPERM (SOCBASEERR+1) /* Not owner */ +#define SOCESRCH (SOCBASEERR+3) /* No such process */ +#define SOCEINTR (SOCBASEERR+4) /* Interrupted system call */ +#define SOCENXIO (SOCBASEERR+6) /* No such device or address */ +#define SOCEBADF (SOCBASEERR+9) /* Bad file number */ +#define SOCEACCES (SOCBASEERR+13) /* Permission denied */ +#define SOCEFAULT (SOCBASEERR+14) /* Bad address */ +#define SOCEINVAL (SOCBASEERR+22) /* Invalid argument */ +#define SOCEMFILE (SOCBASEERR+24) /* Too many open files */ +#define SOCEPIPE (SOCBASEERR+32) /* Broken pipe */ +#define SOCEOS2ERR (SOCBASEERR+100) /* OS/2 Error */ +#define SOCEWOULDBLOCK (SOCBASEERR+35) /* Operation would block */ +#define SOCEINPROGRESS (SOCBASEERR+36) /* Operation now in progress */ +#define SOCEALREADY (SOCBASEERR+37) /* Operation already in progress */ +#define SOCENOTSOCK (SOCBASEERR+38) /* Socket operation on non-socket */ +#define SOCEDESTADDRREQ (SOCBASEERR+39) /* Destination address required */ +#define SOCEMSGSIZE (SOCBASEERR+40) /* Message too long */ +#define SOCEPROTOTYPE (SOCBASEERR+41) /* Protocol wrong type for socket */ +#define SOCENOPROTOOPT (SOCBASEERR+42) /* Protocol not available */ +#define SOCEPROTONOSUPPORT (SOCBASEERR+43) /* Protocol not supported */ +#define SOCESOCKTNOSUPPORT (SOCBASEERR+44) /* Socket type not supported */ +#define SOCEOPNOTSUPP (SOCBASEERR+45) /* Operation not supported on socket */ +#define SOCEPFNOSUPPORT (SOCBASEERR+46) /* Protocol family not supported */ +#define SOCEAFNOSUPPORT (SOCBASEERR+47) /* Address family not supported by protocol family */ +#define SOCEADDRINUSE (SOCBASEERR+48) /* Address already in use */ +#define SOCEADDRNOTAVAIL (SOCBASEERR+49) /* Can't assign requested address */ +#define SOCENETDOWN (SOCBASEERR+50) /* Network is down */ +#define SOCENETUNREACH (SOCBASEERR+51) /* Network is unreachable */ +#define SOCENETRESET (SOCBASEERR+52) /* Network dropped connection on reset */ +#define SOCECONNABORTED (SOCBASEERR+53) /* Software caused connection abort */ +#define SOCECONNRESET (SOCBASEERR+54) /* Connection reset by peer */ +#define SOCENOBUFS (SOCBASEERR+55) /* No buffer space available */ +#define SOCEISCONN (SOCBASEERR+56) /* Socket is already connected */ +#define SOCENOTCONN (SOCBASEERR+57) /* Socket is not connected */ +#define SOCESHUTDOWN (SOCBASEERR+58) /* Can't send after socket shutdown */ +#define SOCETOOMANYREFS (SOCBASEERR+59) /* Too many references: can't splice */ +#define SOCETIMEDOUT (SOCBASEERR+60) /* Connection timed out */ +#define SOCECONNREFUSED (SOCBASEERR+61) /* Connection refused */ +#define SOCELOOP (SOCBASEERR+62) /* Too many levels of symbolic links */ +#define SOCENAMETOOLONG (SOCBASEERR+63) /* File name too long */ +#define SOCEHOSTDOWN (SOCBASEERR+64) /* Host is down */ +#define SOCEHOSTUNREACH (SOCBASEERR+65) /* No route to host */ +#define SOCENOTEMPTY (SOCBASEERR+66) /* Directory not empty */ + +/* APR CANONICAL ERROR TESTS */ +#define APR_STATUS_IS_EACCES(s) ((s) == APR_EACCES \ + || (s) == APR_OS_START_SYSERR + ERROR_ACCESS_DENIED \ + || (s) == APR_OS_START_SYSERR + ERROR_SHARING_VIOLATION) +#define APR_STATUS_IS_EEXIST(s) ((s) == APR_EEXIST \ + || (s) == APR_OS_START_SYSERR + ERROR_OPEN_FAILED \ + || (s) == APR_OS_START_SYSERR + ERROR_FILE_EXISTS \ + || (s) == APR_OS_START_SYSERR + ERROR_ALREADY_EXISTS \ + || (s) == APR_OS_START_SYSERR + ERROR_ACCESS_DENIED) +#define APR_STATUS_IS_ENAMETOOLONG(s) ((s) == APR_ENAMETOOLONG \ + || (s) == APR_OS_START_SYSERR + ERROR_FILENAME_EXCED_RANGE \ + || (s) == APR_OS_START_SYSERR + SOCENAMETOOLONG) +#define APR_STATUS_IS_ENOENT(s) ((s) == APR_ENOENT \ + || (s) == APR_OS_START_SYSERR + ERROR_FILE_NOT_FOUND \ + || (s) == APR_OS_START_SYSERR + ERROR_PATH_NOT_FOUND \ + || (s) == APR_OS_START_SYSERR + ERROR_NO_MORE_FILES \ + || (s) == APR_OS_START_SYSERR + ERROR_OPEN_FAILED) +#define APR_STATUS_IS_ENOTDIR(s) ((s) == APR_ENOTDIR) +#define APR_STATUS_IS_ENOSPC(s) ((s) == APR_ENOSPC \ + || (s) == APR_OS_START_SYSERR + ERROR_DISK_FULL) +#define APR_STATUS_IS_ENOMEM(s) ((s) == APR_ENOMEM) +#define APR_STATUS_IS_EMFILE(s) ((s) == APR_EMFILE \ + || (s) == APR_OS_START_SYSERR + ERROR_TOO_MANY_OPEN_FILES) +#define APR_STATUS_IS_ENFILE(s) ((s) == APR_ENFILE) +#define APR_STATUS_IS_EBADF(s) ((s) == APR_EBADF \ + || (s) == APR_OS_START_SYSERR + ERROR_INVALID_HANDLE) +#define APR_STATUS_IS_EINVAL(s) ((s) == APR_EINVAL \ + || (s) == APR_OS_START_SYSERR + ERROR_INVALID_PARAMETER \ + || (s) == APR_OS_START_SYSERR + ERROR_INVALID_FUNCTION) +#define APR_STATUS_IS_ESPIPE(s) ((s) == APR_ESPIPE \ + || (s) == APR_OS_START_SYSERR + ERROR_NEGATIVE_SEEK) +#define APR_STATUS_IS_EAGAIN(s) ((s) == APR_EAGAIN \ + || (s) == APR_OS_START_SYSERR + ERROR_NO_DATA \ + || (s) == APR_OS_START_SYSERR + SOCEWOULDBLOCK \ + || (s) == APR_OS_START_SYSERR + ERROR_LOCK_VIOLATION) +#define APR_STATUS_IS_EINTR(s) ((s) == APR_EINTR \ + || (s) == APR_OS_START_SYSERR + SOCEINTR) +#define APR_STATUS_IS_ENOTSOCK(s) ((s) == APR_ENOTSOCK \ + || (s) == APR_OS_START_SYSERR + SOCENOTSOCK) +#define APR_STATUS_IS_ECONNREFUSED(s) ((s) == APR_ECONNREFUSED \ + || (s) == APR_OS_START_SYSERR + SOCECONNREFUSED) +#define APR_STATUS_IS_EINPROGRESS(s) ((s) == APR_EINPROGRESS \ + || (s) == APR_OS_START_SYSERR + SOCEINPROGRESS) +#define APR_STATUS_IS_ECONNABORTED(s) ((s) == APR_ECONNABORTED \ + || (s) == APR_OS_START_SYSERR + SOCECONNABORTED) +#define APR_STATUS_IS_ECONNRESET(s) ((s) == APR_ECONNRESET \ + || (s) == APR_OS_START_SYSERR + SOCECONNRESET) +#define APR_STATUS_IS_ETIMEDOUT(s) ((s) == APR_ETIMEDOUT \ + || (s) == APR_OS_START_SYSERR + SOCETIMEDOUT) +#define APR_STATUS_IS_EHOSTUNREACH(s) ((s) == APR_EHOSTUNREACH \ + || (s) == APR_OS_START_SYSERR + SOCEHOSTUNREACH) +#define APR_STATUS_IS_ENETUNREACH(s) ((s) == APR_ENETUNREACH \ + || (s) == APR_OS_START_SYSERR + SOCENETUNREACH) +#define APR_STATUS_IS_EFTYPE(s) ((s) == APR_EFTYPE) +#define APR_STATUS_IS_EPIPE(s) ((s) == APR_EPIPE \ + || (s) == APR_OS_START_SYSERR + ERROR_BROKEN_PIPE \ + || (s) == APR_OS_START_SYSERR + SOCEPIPE) +#define APR_STATUS_IS_EXDEV(s) ((s) == APR_EXDEV \ + || (s) == APR_OS_START_SYSERR + ERROR_NOT_SAME_DEVICE) +#define APR_STATUS_IS_ENOTEMPTY(s) ((s) == APR_ENOTEMPTY \ + || (s) == APR_OS_START_SYSERR + ERROR_DIR_NOT_EMPTY \ + || (s) == APR_OS_START_SYSERR + ERROR_ACCESS_DENIED) + +/* + Sorry, too tired to wrap this up for OS2... feel free to + fit the following into their best matches. + + { ERROR_NO_SIGNAL_SENT, ESRCH }, + { SOCEALREADY, EALREADY }, + { SOCEDESTADDRREQ, EDESTADDRREQ }, + { SOCEMSGSIZE, EMSGSIZE }, + { SOCEPROTOTYPE, EPROTOTYPE }, + { SOCENOPROTOOPT, ENOPROTOOPT }, + { SOCEPROTONOSUPPORT, EPROTONOSUPPORT }, + { SOCESOCKTNOSUPPORT, ESOCKTNOSUPPORT }, + { SOCEOPNOTSUPP, EOPNOTSUPP }, + { SOCEPFNOSUPPORT, EPFNOSUPPORT }, + { SOCEAFNOSUPPORT, EAFNOSUPPORT }, + { SOCEADDRINUSE, EADDRINUSE }, + { SOCEADDRNOTAVAIL, EADDRNOTAVAIL }, + { SOCENETDOWN, ENETDOWN }, + { SOCENETRESET, ENETRESET }, + { SOCENOBUFS, ENOBUFS }, + { SOCEISCONN, EISCONN }, + { SOCENOTCONN, ENOTCONN }, + { SOCESHUTDOWN, ESHUTDOWN }, + { SOCETOOMANYREFS, ETOOMANYREFS }, + { SOCELOOP, ELOOP }, + { SOCEHOSTDOWN, EHOSTDOWN }, + { SOCENOTEMPTY, ENOTEMPTY }, + { SOCEPIPE, EPIPE } +*/ + +#elif defined(WIN32) && !defined(DOXYGEN) /* !defined(OS2) */ + +#define APR_FROM_OS_ERROR(e) (e == 0 ? APR_SUCCESS : e + APR_OS_START_SYSERR) +#define APR_TO_OS_ERROR(e) (e == 0 ? APR_SUCCESS : e - APR_OS_START_SYSERR) + +#define apr_get_os_error() (APR_FROM_OS_ERROR(GetLastError())) +#define apr_set_os_error(e) (SetLastError(APR_TO_OS_ERROR(e))) + +/* A special case, only socket calls require this: + */ +#define apr_get_netos_error() (APR_FROM_OS_ERROR(WSAGetLastError())) +#define apr_set_netos_error(e) (WSASetLastError(APR_TO_OS_ERROR(e))) + +#define APR_STATUS_IS_SUCCESS(s) ((s) == APR_SUCCESS \ + || (s) == APR_OS_START_SYSERR + ERROR_SUCCESS) + +/* APR CANONICAL ERROR TESTS */ +#define APR_STATUS_IS_EACCES(s) ((s) == APR_EACCES \ + || (s) == APR_OS_START_SYSERR + ERROR_ACCESS_DENIED \ + || (s) == APR_OS_START_SYSERR + ERROR_CANNOT_MAKE \ + || (s) == APR_OS_START_SYSERR + ERROR_CURRENT_DIRECTORY \ + || (s) == APR_OS_START_SYSERR + ERROR_DRIVE_LOCKED \ + || (s) == APR_OS_START_SYSERR + ERROR_FAIL_I24 \ + || (s) == APR_OS_START_SYSERR + ERROR_LOCK_VIOLATION \ + || (s) == APR_OS_START_SYSERR + ERROR_LOCK_FAILED \ + || (s) == APR_OS_START_SYSERR + ERROR_NOT_LOCKED \ + || (s) == APR_OS_START_SYSERR + ERROR_NETWORK_ACCESS_DENIED \ + || (s) == APR_OS_START_SYSERR + ERROR_SHARING_VIOLATION) +#define APR_STATUS_IS_EEXIST(s) ((s) == APR_EEXIST \ + || (s) == APR_OS_START_SYSERR + ERROR_FILE_EXISTS \ + || (s) == APR_OS_START_SYSERR + ERROR_ALREADY_EXISTS) +#define APR_STATUS_IS_ENAMETOOLONG(s) ((s) == APR_ENAMETOOLONG \ + || (s) == APR_OS_START_SYSERR + ERROR_FILENAME_EXCED_RANGE \ + || (s) == APR_OS_START_SYSERR + WSAENAMETOOLONG) +#define APR_STATUS_IS_ENOENT(s) ((s) == APR_ENOENT \ + || (s) == APR_OS_START_SYSERR + ERROR_FILE_NOT_FOUND \ + || (s) == APR_OS_START_SYSERR + ERROR_PATH_NOT_FOUND \ + || (s) == APR_OS_START_SYSERR + ERROR_OPEN_FAILED \ + || (s) == APR_OS_START_SYSERR + ERROR_NO_MORE_FILES) +#define APR_STATUS_IS_ENOTDIR(s) ((s) == APR_ENOTDIR \ + || (s) == APR_OS_START_SYSERR + ERROR_PATH_NOT_FOUND \ + || (s) == APR_OS_START_SYSERR + ERROR_BAD_NETPATH \ + || (s) == APR_OS_START_SYSERR + ERROR_BAD_NET_NAME \ + || (s) == APR_OS_START_SYSERR + ERROR_BAD_PATHNAME \ + || (s) == APR_OS_START_SYSERR + ERROR_INVALID_DRIVE) +#define APR_STATUS_IS_ENOSPC(s) ((s) == APR_ENOSPC \ + || (s) == APR_OS_START_SYSERR + ERROR_DISK_FULL) +#define APR_STATUS_IS_ENOMEM(s) ((s) == APR_ENOMEM \ + || (s) == APR_OS_START_SYSERR + ERROR_ARENA_TRASHED \ + || (s) == APR_OS_START_SYSERR + ERROR_NOT_ENOUGH_MEMORY \ + || (s) == APR_OS_START_SYSERR + ERROR_INVALID_BLOCK \ + || (s) == APR_OS_START_SYSERR + ERROR_NOT_ENOUGH_QUOTA \ + || (s) == APR_OS_START_SYSERR + ERROR_OUTOFMEMORY) +#define APR_STATUS_IS_EMFILE(s) ((s) == APR_EMFILE \ + || (s) == APR_OS_START_SYSERR + ERROR_TOO_MANY_OPEN_FILES) +#define APR_STATUS_IS_ENFILE(s) ((s) == APR_ENFILE) +#define APR_STATUS_IS_EBADF(s) ((s) == APR_EBADF \ + || (s) == APR_OS_START_SYSERR + ERROR_INVALID_HANDLE \ + || (s) == APR_OS_START_SYSERR + ERROR_INVALID_TARGET_HANDLE) +#define APR_STATUS_IS_EINVAL(s) ((s) == APR_EINVAL \ + || (s) == APR_OS_START_SYSERR + ERROR_INVALID_ACCESS \ + || (s) == APR_OS_START_SYSERR + ERROR_INVALID_DATA \ + || (s) == APR_OS_START_SYSERR + ERROR_INVALID_FUNCTION \ + || (s) == APR_OS_START_SYSERR + ERROR_INVALID_HANDLE \ + || (s) == APR_OS_START_SYSERR + ERROR_INVALID_PARAMETER \ + || (s) == APR_OS_START_SYSERR + ERROR_NEGATIVE_SEEK) +#define APR_STATUS_IS_ESPIPE(s) ((s) == APR_ESPIPE \ + || (s) == APR_OS_START_SYSERR + ERROR_SEEK_ON_DEVICE \ + || (s) == APR_OS_START_SYSERR + ERROR_NEGATIVE_SEEK) +#define APR_STATUS_IS_EAGAIN(s) ((s) == APR_EAGAIN \ + || (s) == APR_OS_START_SYSERR + ERROR_NO_DATA \ + || (s) == APR_OS_START_SYSERR + ERROR_NO_PROC_SLOTS \ + || (s) == APR_OS_START_SYSERR + ERROR_NESTING_NOT_ALLOWED \ + || (s) == APR_OS_START_SYSERR + ERROR_MAX_THRDS_REACHED \ + || (s) == APR_OS_START_SYSERR + ERROR_LOCK_VIOLATION \ + || (s) == APR_OS_START_SYSERR + WSAEWOULDBLOCK) +#define APR_STATUS_IS_EINTR(s) ((s) == APR_EINTR \ + || (s) == APR_OS_START_SYSERR + WSAEINTR) +#define APR_STATUS_IS_ENOTSOCK(s) ((s) == APR_ENOTSOCK \ + || (s) == APR_OS_START_SYSERR + WSAENOTSOCK) +#define APR_STATUS_IS_ECONNREFUSED(s) ((s) == APR_ECONNREFUSED \ + || (s) == APR_OS_START_SYSERR + WSAECONNREFUSED) +#define APR_STATUS_IS_EINPROGRESS(s) ((s) == APR_EINPROGRESS \ + || (s) == APR_OS_START_SYSERR + WSAEINPROGRESS) +#define APR_STATUS_IS_ECONNABORTED(s) ((s) == APR_ECONNABORTED \ + || (s) == APR_OS_START_SYSERR + WSAECONNABORTED) +#define APR_STATUS_IS_ECONNRESET(s) ((s) == APR_ECONNRESET \ + || (s) == APR_OS_START_SYSERR + ERROR_NETNAME_DELETED \ + || (s) == APR_OS_START_SYSERR + WSAECONNRESET) +#define APR_STATUS_IS_ETIMEDOUT(s) ((s) == APR_ETIMEDOUT \ + || (s) == APR_OS_START_SYSERR + WSAETIMEDOUT \ + || (s) == APR_OS_START_SYSERR + WAIT_TIMEOUT) +#define APR_STATUS_IS_EHOSTUNREACH(s) ((s) == APR_EHOSTUNREACH \ + || (s) == APR_OS_START_SYSERR + WSAEHOSTUNREACH) +#define APR_STATUS_IS_ENETUNREACH(s) ((s) == APR_ENETUNREACH \ + || (s) == APR_OS_START_SYSERR + WSAENETUNREACH) +#define APR_STATUS_IS_EFTYPE(s) ((s) == APR_EFTYPE \ + || (s) == APR_OS_START_SYSERR + ERROR_EXE_MACHINE_TYPE_MISMATCH \ + || (s) == APR_OS_START_SYSERR + ERROR_INVALID_DLL \ + || (s) == APR_OS_START_SYSERR + ERROR_INVALID_MODULETYPE \ + || (s) == APR_OS_START_SYSERR + ERROR_BAD_EXE_FORMAT \ + || (s) == APR_OS_START_SYSERR + ERROR_INVALID_EXE_SIGNATURE \ + || (s) == APR_OS_START_SYSERR + ERROR_FILE_CORRUPT \ + || (s) == APR_OS_START_SYSERR + ERROR_BAD_FORMAT) +#define APR_STATUS_IS_EPIPE(s) ((s) == APR_EPIPE \ + || (s) == APR_OS_START_SYSERR + ERROR_BROKEN_PIPE) +#define APR_STATUS_IS_EXDEV(s) ((s) == APR_EXDEV \ + || (s) == APR_OS_START_SYSERR + ERROR_NOT_SAME_DEVICE) +#define APR_STATUS_IS_ENOTEMPTY(s) ((s) == APR_ENOTEMPTY \ + || (s) == APR_OS_START_SYSERR + ERROR_DIR_NOT_EMPTY) + +#elif defined(NETWARE) && !defined(DOXYGEN) /* !defined(OS2) && !defined(WIN32) */ + +#define APR_FROM_OS_ERROR(e) (e == 0 ? APR_SUCCESS : e + APR_OS_START_SYSERR) +#define APR_TO_OS_ERROR(e) (e == 0 ? APR_SUCCESS : e - APR_OS_START_SYSERR) + +#define apr_get_os_error() (errno) +#define apr_set_os_error(e) (errno = (e)) + +/* A special case, only socket calls require this: */ +#define apr_get_netos_error() (APR_FROM_OS_ERROR(WSAGetLastError())) +#define apr_set_netos_error(e) (WSASetLastError(APR_TO_OS_ERROR(e))) + +#define APR_STATUS_IS_SUCCESS(s) ((s) == APR_SUCCESS) + +/* APR CANONICAL ERROR TESTS */ +#define APR_STATUS_IS_EACCES(s) ((s) == APR_EACCES) +#define APR_STATUS_IS_EEXIST(s) ((s) == APR_EEXIST) +#define APR_STATUS_IS_ENAMETOOLONG(s) ((s) == APR_ENAMETOOLONG) +#define APR_STATUS_IS_ENOENT(s) ((s) == APR_ENOENT) +#define APR_STATUS_IS_ENOTDIR(s) ((s) == APR_ENOTDIR) +#define APR_STATUS_IS_ENOSPC(s) ((s) == APR_ENOSPC) +#define APR_STATUS_IS_ENOMEM(s) ((s) == APR_ENOMEM) +#define APR_STATUS_IS_EMFILE(s) ((s) == APR_EMFILE) +#define APR_STATUS_IS_ENFILE(s) ((s) == APR_ENFILE) +#define APR_STATUS_IS_EBADF(s) ((s) == APR_EBADF) +#define APR_STATUS_IS_EINVAL(s) ((s) == APR_EINVAL) +#define APR_STATUS_IS_ESPIPE(s) ((s) == APR_ESPIPE) + +#define APR_STATUS_IS_EAGAIN(s) ((s) == APR_EAGAIN \ + || (s) == EWOULDBLOCK \ + || (s) == APR_OS_START_SYSERR + WSAEWOULDBLOCK) +#define APR_STATUS_IS_EINTR(s) ((s) == APR_EINTR \ + || (s) == APR_OS_START_SYSERR + WSAEINTR) +#define APR_STATUS_IS_ENOTSOCK(s) ((s) == APR_ENOTSOCK \ + || (s) == APR_OS_START_SYSERR + WSAENOTSOCK) +#define APR_STATUS_IS_ECONNREFUSED(s) ((s) == APR_ECONNREFUSED \ + || (s) == APR_OS_START_SYSERR + WSAECONNREFUSED) +#define APR_STATUS_IS_EINPROGRESS(s) ((s) == APR_EINPROGRESS \ + || (s) == APR_OS_START_SYSERR + WSAEINPROGRESS) +#define APR_STATUS_IS_ECONNABORTED(s) ((s) == APR_ECONNABORTED \ + || (s) == APR_OS_START_SYSERR + WSAECONNABORTED) +#define APR_STATUS_IS_ECONNRESET(s) ((s) == APR_ECONNRESET \ + || (s) == APR_OS_START_SYSERR + WSAECONNRESET) +#define APR_STATUS_IS_ETIMEDOUT(s) ((s) == APR_ETIMEDOUT \ + || (s) == APR_OS_START_SYSERR + WSAETIMEDOUT \ + || (s) == APR_OS_START_SYSERR + WAIT_TIMEOUT) +#define APR_STATUS_IS_EHOSTUNREACH(s) ((s) == APR_EHOSTUNREACH \ + || (s) == APR_OS_START_SYSERR + WSAEHOSTUNREACH) +#define APR_STATUS_IS_ENETUNREACH(s) ((s) == APR_ENETUNREACH \ + || (s) == APR_OS_START_SYSERR + WSAENETUNREACH) +#define APR_STATUS_IS_ENETDOWN(s) ((s) == APR_OS_START_SYSERR + WSAENETDOWN) +#define APR_STATUS_IS_EFTYPE(s) ((s) == APR_EFTYPE) +#define APR_STATUS_IS_EPIPE(s) ((s) == APR_EPIPE) +#define APR_STATUS_IS_EXDEV(s) ((s) == APR_EXDEV) +#define APR_STATUS_IS_ENOTEMPTY(s) ((s) == APR_ENOTEMPTY) + +#else /* !defined(NETWARE) && !defined(OS2) && !defined(WIN32) */ + +/* + * os error codes are clib error codes + */ +#define APR_FROM_OS_ERROR(e) (e) +#define APR_TO_OS_ERROR(e) (e) + +#define apr_get_os_error() (errno) +#define apr_set_os_error(e) (errno = (e)) + +/* A special case, only socket calls require this: + */ +#define apr_get_netos_error() (errno) +#define apr_set_netos_error(e) (errno = (e)) +/** @} */ + +/** + * @addtogroup APR_STATUS_IS + * @{ + */ +/** no error */ +#define APR_STATUS_IS_SUCCESS(s) ((s) == APR_SUCCESS) + +/** permission denied */ +#define APR_STATUS_IS_EACCES(s) ((s) == APR_EACCES) +/** file exists */ +#define APR_STATUS_IS_EEXIST(s) ((s) == APR_EEXIST) +/** path name is too long */ +#define APR_STATUS_IS_ENAMETOOLONG(s) ((s) == APR_ENAMETOOLONG) +/** + * no such file or directory + * @remark + * EMVSCATLG can be returned by the automounter on z/OS for + * paths which do not exist. + */ +#ifdef EMVSCATLG +#define APR_STATUS_IS_ENOENT(s) ((s) == APR_ENOENT \ + || (s) == EMVSCATLG) +#else +#define APR_STATUS_IS_ENOENT(s) ((s) == APR_ENOENT) +#endif +/** not a directory */ +#define APR_STATUS_IS_ENOTDIR(s) ((s) == APR_ENOTDIR) +/** no space left on device */ +#define APR_STATUS_IS_ENOSPC(s) ((s) == APR_ENOSPC) +/** not enough memory */ +#define APR_STATUS_IS_ENOMEM(s) ((s) == APR_ENOMEM) +/** too many open files */ +#define APR_STATUS_IS_EMFILE(s) ((s) == APR_EMFILE) +/** file table overflow */ +#define APR_STATUS_IS_ENFILE(s) ((s) == APR_ENFILE) +/** bad file # */ +#define APR_STATUS_IS_EBADF(s) ((s) == APR_EBADF) +/** invalid argument */ +#define APR_STATUS_IS_EINVAL(s) ((s) == APR_EINVAL) +/** illegal seek */ +#define APR_STATUS_IS_ESPIPE(s) ((s) == APR_ESPIPE) + +/** operation would block */ +#if !defined(EWOULDBLOCK) || !defined(EAGAIN) +#define APR_STATUS_IS_EAGAIN(s) ((s) == APR_EAGAIN) +#elif (EWOULDBLOCK == EAGAIN) +#define APR_STATUS_IS_EAGAIN(s) ((s) == APR_EAGAIN) +#else +#define APR_STATUS_IS_EAGAIN(s) ((s) == APR_EAGAIN \ + || (s) == EWOULDBLOCK) +#endif + +/** interrupted system call */ +#define APR_STATUS_IS_EINTR(s) ((s) == APR_EINTR) +/** socket operation on a non-socket */ +#define APR_STATUS_IS_ENOTSOCK(s) ((s) == APR_ENOTSOCK) +/** Connection Refused */ +#define APR_STATUS_IS_ECONNREFUSED(s) ((s) == APR_ECONNREFUSED) +/** operation now in progress */ +#define APR_STATUS_IS_EINPROGRESS(s) ((s) == APR_EINPROGRESS) + +/** + * Software caused connection abort + * @remark + * EPROTO on certain older kernels really means ECONNABORTED, so we need to + * ignore it for them. See discussion in new-httpd archives nh.9701 & nh.9603 + * + * There is potentially a bug in Solaris 2.x x<6, and other boxes that + * implement tcp sockets in userland (i.e. on top of STREAMS). On these + * systems, EPROTO can actually result in a fatal loop. See PR#981 for + * example. It's hard to handle both uses of EPROTO. + */ +#ifdef EPROTO +#define APR_STATUS_IS_ECONNABORTED(s) ((s) == APR_ECONNABORTED \ + || (s) == EPROTO) +#else +#define APR_STATUS_IS_ECONNABORTED(s) ((s) == APR_ECONNABORTED) +#endif + +/** Connection Reset by peer */ +#define APR_STATUS_IS_ECONNRESET(s) ((s) == APR_ECONNRESET) +/** Operation timed out */ +#define APR_STATUS_IS_ETIMEDOUT(s) ((s) == APR_ETIMEDOUT) +/** no route to host */ +#define APR_STATUS_IS_EHOSTUNREACH(s) ((s) == APR_EHOSTUNREACH) +/** network is unreachable */ +#define APR_STATUS_IS_ENETUNREACH(s) ((s) == APR_ENETUNREACH) +/** inappropiate file type or format */ +#define APR_STATUS_IS_EFTYPE(s) ((s) == APR_EFTYPE) +/** broken pipe */ +#define APR_STATUS_IS_EPIPE(s) ((s) == APR_EPIPE) +/** cross device link */ +#define APR_STATUS_IS_EXDEV(s) ((s) == APR_EXDEV) +/** Directory Not Empty */ +#define APR_STATUS_IS_ENOTEMPTY(s) ((s) == APR_ENOTEMPTY || \ + (s) == APR_EEXIST) +/** @} */ + +#endif /* !defined(NETWARE) && !defined(OS2) && !defined(WIN32) */ + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* ! APR_ERRNO_H */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_file_info.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_file_info.h new file mode 100644 index 00000000..7e613d85 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_file_info.h @@ -0,0 +1,421 @@ +/* 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. + */ + +#ifndef APR_FILE_INFO_H +#define APR_FILE_INFO_H + +/** + * @file apr_file_info.h + * @brief APR File Information + */ + +#include "apr.h" +#include "apr_user.h" +#include "apr_pools.h" +#include "apr_tables.h" +#include "apr_time.h" +#include "apr_errno.h" + +#if APR_HAVE_SYS_UIO_H +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/** + * @defgroup apr_file_info File Information + * @ingroup APR + * @{ + */ + +/* Many applications use the type member to determine the + * existance of a file or initialization of the file info, + * so the APR_NOFILE value must be distinct from APR_UNKFILE. + */ + +/** apr_filetype_e values for the filetype member of the + * apr_file_info_t structure + * @warning: Not all of the filetypes below can be determined. + * For example, a given platform might not correctly report + * a socket descriptor as APR_SOCK if that type isn't + * well-identified on that platform. In such cases where + * a filetype exists but cannot be described by the recognized + * flags below, the filetype will be APR_UNKFILE. If the + * filetype member is not determined, the type will be APR_NOFILE. + */ + +typedef enum { + APR_NOFILE = 0, /**< no file type determined */ + APR_REG, /**< a regular file */ + APR_DIR, /**< a directory */ + APR_CHR, /**< a character device */ + APR_BLK, /**< a block device */ + APR_PIPE, /**< a FIFO / pipe */ + APR_LNK, /**< a symbolic link */ + APR_SOCK, /**< a [unix domain] socket */ + APR_UNKFILE = 127 /**< a file of some other unknown type */ +} apr_filetype_e; + +/** + * @defgroup apr_file_permissions File Permissions flags + * @{ + */ + +#define APR_USETID 0x8000 /**< Set user id */ +#define APR_UREAD 0x0400 /**< Read by user */ +#define APR_UWRITE 0x0200 /**< Write by user */ +#define APR_UEXECUTE 0x0100 /**< Execute by user */ + +#define APR_GSETID 0x4000 /**< Set group id */ +#define APR_GREAD 0x0040 /**< Read by group */ +#define APR_GWRITE 0x0020 /**< Write by group */ +#define APR_GEXECUTE 0x0010 /**< Execute by group */ + +#define APR_WSTICKY 0x2000 /**< Sticky bit */ +#define APR_WREAD 0x0004 /**< Read by others */ +#define APR_WWRITE 0x0002 /**< Write by others */ +#define APR_WEXECUTE 0x0001 /**< Execute by others */ + +#define APR_OS_DEFAULT 0x0FFF /**< use OS's default permissions */ + +/* additional permission flags for apr_file_copy and apr_file_append */ +#define APR_FILE_SOURCE_PERMS 0x1000 /**< Copy source file's permissions */ + +/** @} */ + + +/** + * Structure for referencing directories. + */ +typedef struct apr_dir_t apr_dir_t; +/** + * Structure for determining file permissions. + */ +typedef apr_int32_t apr_fileperms_t; +#if (defined WIN32) || (defined NETWARE) +/** + * Structure for determining the device the file is on. + */ +typedef apr_uint32_t apr_dev_t; +#else +/** + * Structure for determining the device the file is on. + */ +typedef dev_t apr_dev_t; +#endif + +/** + * @defgroup apr_file_stat Stat Functions + * @{ + */ +/** file info structure */ +typedef struct apr_finfo_t apr_finfo_t; + +#define APR_FINFO_LINK 0x00000001 /**< Stat the link not the file itself if it is a link */ +#define APR_FINFO_MTIME 0x00000010 /**< Modification Time */ +#define APR_FINFO_CTIME 0x00000020 /**< Creation Time */ +#define APR_FINFO_ATIME 0x00000040 /**< Access Time */ +#define APR_FINFO_SIZE 0x00000100 /**< Size of the file */ +#define APR_FINFO_CSIZE 0x00000200 /**< Storage size consumed by the file */ +#define APR_FINFO_DEV 0x00001000 /**< Device */ +#define APR_FINFO_INODE 0x00002000 /**< Inode */ +#define APR_FINFO_NLINK 0x00004000 /**< Number of links */ +#define APR_FINFO_TYPE 0x00008000 /**< Type */ +#define APR_FINFO_USER 0x00010000 /**< User */ +#define APR_FINFO_GROUP 0x00020000 /**< Group */ +#define APR_FINFO_UPROT 0x00100000 /**< User protection bits */ +#define APR_FINFO_GPROT 0x00200000 /**< Group protection bits */ +#define APR_FINFO_WPROT 0x00400000 /**< World protection bits */ +#define APR_FINFO_ICASE 0x01000000 /**< if dev is case insensitive */ +#define APR_FINFO_NAME 0x02000000 /**< ->name in proper case */ + +#define APR_FINFO_MIN 0x00008170 /**< type, mtime, ctime, atime, size */ +#define APR_FINFO_IDENT 0x00003000 /**< dev and inode */ +#define APR_FINFO_OWNER 0x00030000 /**< user and group */ +#define APR_FINFO_PROT 0x00700000 /**< all protections */ +#define APR_FINFO_NORM 0x0073b170 /**< an atomic unix apr_stat() */ +#define APR_FINFO_DIRENT 0x02000000 /**< an atomic unix apr_dir_read() */ + +/** + * The file information structure. This is analogous to the POSIX + * stat structure. + */ +struct apr_finfo_t { + /** Allocates memory and closes lingering handles in the specified pool */ + apr_pool_t *pool; + /** The bitmask describing valid fields of this apr_finfo_t structure + * including all available 'wanted' fields and potentially more */ + apr_int32_t valid; + /** The access permissions of the file. Mimics Unix access rights. */ + apr_fileperms_t protection; + /** The type of file. One of APR_REG, APR_DIR, APR_CHR, APR_BLK, APR_PIPE, + * APR_LNK or APR_SOCK. If the type is undetermined, the value is APR_NOFILE. + * If the type cannot be determined, the value is APR_UNKFILE. + */ + apr_filetype_e filetype; + /** The user id that owns the file */ + apr_uid_t user; + /** The group id that owns the file */ + apr_gid_t group; + /** The inode of the file. */ + apr_ino_t inode; + /** The id of the device the file is on. */ + apr_dev_t device; + /** The number of hard links to the file. */ + apr_int32_t nlink; + /** The size of the file */ + apr_off_t size; + /** The storage size consumed by the file */ + apr_off_t csize; + /** The time the file was last accessed */ + apr_time_t atime; + /** The time the file was last modified */ + apr_time_t mtime; + /** The time the file was last changed */ + apr_time_t ctime; + /** The pathname of the file (possibly unrooted) */ + const char *fname; + /** The file's name (no path) in filesystem case */ + const char *name; + /** The file's handle, if accessed (can be submitted to apr_duphandle) */ + struct apr_file_t *filehand; +}; + +/** + * get the specified file's stats. The file is specified by filename, + * instead of using a pre-opened file. + * @param finfo Where to store the information about the file, which is + * never touched if the call fails. + * @param fname The name of the file to stat. + * @param wanted The desired apr_finfo_t fields, as a bit flag of APR_FINFO_ + values + * @param cont the pool to use to allocate the new file. + * + * @note If @c APR_INCOMPLETE is returned all the fields in @a finfo may + * not be filled in, and you need to check the @c finfo->valid bitmask + * to verify that what you're looking for is there. + */ +APR_DECLARE(apr_status_t) apr_stat(apr_finfo_t *finfo, const char *fname, + apr_int32_t wanted, apr_pool_t *cont); + +/** + * get the specified file's stats. The file is specified by filename, + * instead of using a pre-opened file. If the file is a symlink, this function + * will get the stats for the symlink not the file the symlink refers to. + * @param finfo Where to store the information about the file, which is + * never touched if the call fails. + * @param fname The name of the file to stat. + * @param wanted The desired apr_finfo_t fields, as a bit flag of APR_FINFO_ values + * @param cont the pool to use to allocate the new file. + * @deprecated This function is deprecated, it's equivalent to calling apr_stat with + * the wanted flag value APR_FINFO_LINK + */ +APR_DECLARE(apr_status_t) apr_lstat(apr_finfo_t *finfo, const char *fname, + apr_int32_t wanted, apr_pool_t *cont); +/** @} */ +/** + * @defgroup apr_dir Directory Manipulation Functions + * @{ + */ + +/** + * Open the specified directory. + * @param new_dir The opened directory descriptor. + * @param dirname The full path to the directory (use / on all systems) + * @param cont The pool to use. + */ +APR_DECLARE(apr_status_t) apr_dir_open(apr_dir_t **new_dir, + const char *dirname, + apr_pool_t *cont); + +/** + * close the specified directory. + * @param thedir the directory descriptor to close. + */ +APR_DECLARE(apr_status_t) apr_dir_close(apr_dir_t *thedir); + +/** + * Read the next entry from the specified directory. + * @param finfo the file info structure and filled in by apr_dir_read + * @param wanted The desired apr_finfo_t fields, as a bit flag of APR_FINFO_ + values + * @param thedir the directory descriptor returned from apr_dir_open + * @remark No ordering is guaranteed for the entries read. + * + * @note If @c APR_INCOMPLETE is returned all the fields in @a finfo may + * not be filled in, and you need to check the @c finfo->valid bitmask + * to verify that what you're looking for is there. + */ +APR_DECLARE(apr_status_t) apr_dir_read(apr_finfo_t *finfo, apr_int32_t wanted, + apr_dir_t *thedir); + +/** + * Rewind the directory to the first entry. + * @param thedir the directory descriptor to rewind. + */ +APR_DECLARE(apr_status_t) apr_dir_rewind(apr_dir_t *thedir); +/** @} */ + +/** + * @defgroup apr_filepath Filepath Manipulation Functions + * @{ + */ + +/** Cause apr_filepath_merge to fail if addpath is above rootpath */ +#define APR_FILEPATH_NOTABOVEROOT 0x01 + +/** internal: Only meaningful with APR_FILEPATH_NOTABOVEROOT */ +#define APR_FILEPATH_SECUREROOTTEST 0x02 + +/** Cause apr_filepath_merge to fail if addpath is above rootpath, + * even given a rootpath /foo/bar and an addpath ../bar/bash + */ +#define APR_FILEPATH_SECUREROOT 0x03 + +/** Fail apr_filepath_merge if the merged path is relative */ +#define APR_FILEPATH_NOTRELATIVE 0x04 + +/** Fail apr_filepath_merge if the merged path is absolute */ +#define APR_FILEPATH_NOTABSOLUTE 0x08 + +/** Return the file system's native path format (e.g. path delimiters + * of ':' on MacOS9, '\' on Win32, etc.) */ +#define APR_FILEPATH_NATIVE 0x10 + +/** Resolve the true case of existing directories and file elements + * of addpath, (resolving any aliases on Win32) and append a proper + * trailing slash if a directory + */ +#define APR_FILEPATH_TRUENAME 0x20 + +/** + * Extract the rootpath from the given filepath + * @param rootpath the root file path returned with APR_SUCCESS or APR_EINCOMPLETE + * @param filepath the pathname to parse for its root component + * @param flags the desired rules to apply, from + *
    + *      APR_FILEPATH_NATIVE    Use native path seperators (e.g. '\' on Win32)
    + *      APR_FILEPATH_TRUENAME  Tests that the root exists, and makes it proper
    + * 
    + * @param p the pool to allocate the new path string from + * @remark on return, filepath points to the first non-root character in the + * given filepath. In the simplest example, given a filepath of "/foo", + * returns the rootpath of "/" and filepath points at "foo". This is far + * more complex on other platforms, which will canonicalize the root form + * to a consistant format, given the APR_FILEPATH_TRUENAME flag, and also + * test for the validity of that root (e.g., that a drive d:/ or network + * share //machine/foovol/). + * The function returns APR_ERELATIVE if filepath isn't rooted (an + * error), APR_EINCOMPLETE if the root path is ambigious (but potentially + * legitimate, e.g. "/" on Windows is incomplete because it doesn't specify + * the drive letter), or APR_EBADPATH if the root is simply invalid. + * APR_SUCCESS is returned if filepath is an absolute path. + */ +APR_DECLARE(apr_status_t) apr_filepath_root(const char **rootpath, + const char **filepath, + apr_int32_t flags, + apr_pool_t *p); + +/** + * Merge additional file path onto the previously processed rootpath + * @param newpath the merged paths returned + * @param rootpath the root file path (NULL uses the current working path) + * @param addpath the path to add to the root path + * @param flags the desired APR_FILEPATH_ rules to apply when merging + * @param p the pool to allocate the new path string from + * @remark if the flag APR_FILEPATH_TRUENAME is given, and the addpath + * contains wildcard characters ('*', '?') on platforms that don't support + * such characters within filenames, the paths will be merged, but the + * result code will be APR_EPATHWILD, and all further segments will not + * reflect the true filenames including the wildcard and following segments. + */ +APR_DECLARE(apr_status_t) apr_filepath_merge(char **newpath, + const char *rootpath, + const char *addpath, + apr_int32_t flags, + apr_pool_t *p); + +/** + * Split a search path into separate components + * @param pathelts the returned components of the search path + * @param liststr the search path (e.g., getenv("PATH")) + * @param p the pool to allocate the array and path components from + * @remark empty path componenta do not become part of @a pathelts. + * @remark the path separator in @a liststr is system specific; + * e.g., ':' on Unix, ';' on Windows, etc. + */ +APR_DECLARE(apr_status_t) apr_filepath_list_split(apr_array_header_t **pathelts, + const char *liststr, + apr_pool_t *p); + +/** + * Merge a list of search path components into a single search path + * @param liststr the returned search path; may be NULL if @a pathelts is empty + * @param pathelts the components of the search path + * @param p the pool to allocate the search path from + * @remark emtpy strings in the source array are ignored. + * @remark the path separator in @a liststr is system specific; + * e.g., ':' on Unix, ';' on Windows, etc. + */ +APR_DECLARE(apr_status_t) apr_filepath_list_merge(char **liststr, + apr_array_header_t *pathelts, + apr_pool_t *p); + +/** + * Return the default file path (for relative file names) + * @param path the default path string returned + * @param flags optional flag APR_FILEPATH_NATIVE to retrieve the + * default file path in os-native format. + * @param p the pool to allocate the default path string from + */ +APR_DECLARE(apr_status_t) apr_filepath_get(char **path, apr_int32_t flags, + apr_pool_t *p); + +/** + * Set the default file path (for relative file names) + * @param path the default path returned + * @param p the pool to allocate any working storage + */ +APR_DECLARE(apr_status_t) apr_filepath_set(const char *path, apr_pool_t *p); + +/** The FilePath character encoding is unknown */ +#define APR_FILEPATH_ENCODING_UNKNOWN 0 + +/** The FilePath character encoding is locale-dependent */ +#define APR_FILEPATH_ENCODING_LOCALE 1 + +/** The FilePath character encoding is UTF-8 */ +#define APR_FILEPATH_ENCODING_UTF8 2 + +/** + * Determine the encoding used internally by the FilePath functions + * @param style points to a variable which receives the encoding style flag + * @param p the pool to allocate any working storage + * @remark Use @c apr_os_locale_encoding and/or @c apr_os_default_encoding + * to get the name of the path encoding if it's not UTF-8. + */ +APR_DECLARE(apr_status_t) apr_filepath_encoding(int *style, apr_pool_t *p); +/** @} */ + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* ! APR_FILE_INFO_H */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_file_io.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_file_io.h new file mode 100644 index 00000000..bfa7a1bf --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_file_io.h @@ -0,0 +1,766 @@ +/* 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. + */ + +#ifndef APR_FILE_IO_H +#define APR_FILE_IO_H + +/** + * @file apr_file_io.h + * @brief APR File I/O Handling + */ + +#include "apr.h" +#include "apr_pools.h" +#include "apr_time.h" +#include "apr_errno.h" +#include "apr_file_info.h" +#include "apr_inherit.h" + +#define APR_WANT_STDIO /**< for SEEK_* */ +#define APR_WANT_IOVEC /**< for apr_file_writev */ +#include "apr_want.h" + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/** + * @defgroup apr_file_io File I/O Handling Functions + * @ingroup APR + * @{ + */ + +/** + * @defgroup apr_file_open_flags File Open Flags/Routines + * @{ + */ + +/* Note to implementors: Values in the range 0x00100000--0x80000000 + are reserved for platform-specific values. */ + +#define APR_READ 0x00001 /**< Open the file for reading */ +#define APR_WRITE 0x00002 /**< Open the file for writing */ +#define APR_CREATE 0x00004 /**< Create the file if not there */ +#define APR_APPEND 0x00008 /**< Append to the end of the file */ +#define APR_TRUNCATE 0x00010 /**< Open the file and truncate to 0 length */ +#define APR_BINARY 0x00020 /**< Open the file in binary mode */ +#define APR_EXCL 0x00040 /**< Open should fail if APR_CREATE and file + exists. */ +#define APR_BUFFERED 0x00080 /**< Open the file for buffered I/O */ +#define APR_DELONCLOSE 0x00100 /**< Delete the file after close */ +#define APR_XTHREAD 0x00200 /**< Platform dependent tag to open the file + for use across multiple threads */ +#define APR_SHARELOCK 0x00400 /**< Platform dependent support for higher + level locked read/write access to support + writes across process/machines */ +#define APR_FILE_NOCLEANUP 0x00800 /**< Do not register a cleanup when the file + is opened */ +#define APR_SENDFILE_ENABLED 0x01000 /**< Advisory flag that this file should + support apr_sendfile operation */ +#define APR_LARGEFILE 0x04000 /**< Platform dependent flag to enable large file + support; WARNING see below. */ + +/** @warning The APR_LARGEFILE flag only has effect on some platforms + * where sizeof(apr_off_t) == 4. Where implemented, it allows opening + * and writing to a file which exceeds the size which can be + * represented by apr_off_t (2 gigabytes). When a file's size does + * exceed 2Gb, apr_file_info_get() will fail with an error on the + * descriptor, likewise apr_stat()/apr_lstat() will fail on the + * filename. apr_dir_read() will fail with APR_INCOMPLETE on a + * directory entry for a large file depending on the particular + * APR_FINFO_* flags. Generally, it is not recommended to use this + * flag. */ + +/** @} */ + +/** + * @defgroup apr_file_seek_flags File Seek Flags + * @{ + */ + +/* flags for apr_file_seek */ +/** Set the file position */ +#define APR_SET SEEK_SET +/** Current */ +#define APR_CUR SEEK_CUR +/** Go to end of file */ +#define APR_END SEEK_END +/** @} */ + +/** + * @defgroup apr_file_attrs_set_flags File Attribute Flags + * @{ + */ + +/* flags for apr_file_attrs_set */ +#define APR_FILE_ATTR_READONLY 0x01 /**< File is read-only */ +#define APR_FILE_ATTR_EXECUTABLE 0x02 /**< File is executable */ +#define APR_FILE_ATTR_HIDDEN 0x04 /**< File is hidden */ +/** @} */ + +/** File attributes */ +typedef apr_uint32_t apr_fileattrs_t; + +/** should be same as whence type in lseek, POSIX defines this as int */ +typedef int apr_seek_where_t; + +/** + * Structure for referencing files. + */ +typedef struct apr_file_t apr_file_t; + +/* File lock types/flags */ +/** + * @defgroup apr_file_lock_types File Lock Types + * @{ + */ + +#define APR_FLOCK_SHARED 1 /**< Shared lock. More than one process + or thread can hold a shared lock + at any given time. Essentially, + this is a "read lock", preventing + writers from establishing an + exclusive lock. */ +#define APR_FLOCK_EXCLUSIVE 2 /**< Exclusive lock. Only one process + may hold an exclusive lock at any + given time. This is analogous to + a "write lock". */ + +#define APR_FLOCK_TYPEMASK 0x000F /**< mask to extract lock type */ +#define APR_FLOCK_NONBLOCK 0x0010 /**< do not block while acquiring the + file lock */ +/** @} */ + +/** + * Open the specified file. + * @param newf The opened file descriptor. + * @param fname The full path to the file (using / on all systems) + * @param flag Or'ed value of: + *
    + *         APR_READ              open for reading
    + *         APR_WRITE             open for writing
    + *         APR_CREATE            create the file if not there
    + *         APR_APPEND            file ptr is set to end prior to all writes
    + *         APR_TRUNCATE          set length to zero if file exists
    + *         APR_BINARY            not a text file (This flag is ignored on 
    + *                               UNIX because it has no meaning)
    + *         APR_BUFFERED          buffer the data.  Default is non-buffered
    + *         APR_EXCL              return error if APR_CREATE and file exists
    + *         APR_DELONCLOSE        delete the file after closing.
    + *         APR_XTHREAD           Platform dependent tag to open the file
    + *                               for use across multiple threads
    + *         APR_SHARELOCK         Platform dependent support for higher
    + *                               level locked read/write access to support
    + *                               writes across process/machines
    + *         APR_FILE_NOCLEANUP    Do not register a cleanup with the pool 
    + *                               passed in on the cont argument (see below).
    + *                               The apr_os_file_t handle in apr_file_t will not
    + *                               be closed when the pool is destroyed.
    + *         APR_SENDFILE_ENABLED  Open with appropriate platform semantics
    + *                               for sendfile operations.  Advisory only,
    + *                               apr_sendfile does not check this flag.
    + * 
    + * @param perm Access permissions for file. + * @param pool The pool to use. + * @remark If perm is APR_OS_DEFAULT and the file is being created, appropriate + * default permissions will be used. *arg1 must point to a valid file_t, + * or NULL (in which case it will be allocated) + */ +APR_DECLARE(apr_status_t) apr_file_open(apr_file_t **newf, const char *fname, + apr_int32_t flag, apr_fileperms_t perm, + apr_pool_t *pool); + +/** + * Close the specified file. + * @param file The file descriptor to close. + */ +APR_DECLARE(apr_status_t) apr_file_close(apr_file_t *file); + +/** + * delete the specified file. + * @param path The full path to the file (using / on all systems) + * @param cont The pool to use. + * @remark If the file is open, it won't be removed until all instances are closed. + */ +APR_DECLARE(apr_status_t) apr_file_remove(const char *path, apr_pool_t *cont); + +/** + * rename the specified file. + * @param from_path The full path to the original file (using / on all systems) + * @param to_path The full path to the new file (using / on all systems) + * @param pool The pool to use. + * @warning If a file exists at the new location, then it will be overwritten. + * Moving files or directories across devices may not be possible. + */ +APR_DECLARE(apr_status_t) apr_file_rename(const char *from_path, + const char *to_path, + apr_pool_t *pool); + +/** + * copy the specified file to another file. + * @param from_path The full path to the original file (using / on all systems) + * @param to_path The full path to the new file (using / on all systems) + * @param perms Access permissions for the new file if it is created. + * In place of the usual or'd combination of file permissions, the + * value APR_FILE_SOURCE_PERMS may be given, in which case the source + * file's permissions are copied. + * @param pool The pool to use. + * @remark The new file does not need to exist, it will be created if required. + * @warning If the new file already exists, its contents will be overwritten. + */ +APR_DECLARE(apr_status_t) apr_file_copy(const char *from_path, + const char *to_path, + apr_fileperms_t perms, + apr_pool_t *pool); + +/** + * append the specified file to another file. + * @param from_path The full path to the source file (using / on all systems) + * @param to_path The full path to the destination file (using / on all systems) + * @param perms Access permissions for the destination file if it is created. + * In place of the usual or'd combination of file permissions, the + * value APR_FILE_SOURCE_PERMS may be given, in which case the source + * file's permissions are copied. + * @param pool The pool to use. + * @remark The new file does not need to exist, it will be created if required. + */ +APR_DECLARE(apr_status_t) apr_file_append(const char *from_path, + const char *to_path, + apr_fileperms_t perms, + apr_pool_t *pool); + +/** + * Are we at the end of the file + * @param fptr The apr file we are testing. + * @remark Returns APR_EOF if we are at the end of file, APR_SUCCESS otherwise. + */ +APR_DECLARE(apr_status_t) apr_file_eof(apr_file_t *fptr); + +/** + * open standard error as an apr file pointer. + * @param thefile The apr file to use as stderr. + * @param cont The pool to allocate the file out of. + * + * @remark The only reason that the apr_file_open_std* functions exist + * is that you may not always have a stderr/out/in on Windows. This + * is generally a problem with newer versions of Windows and services. + * + * The other problem is that the C library functions generally work + * differently on Windows and Unix. So, by using apr_file_open_std* + * functions, you can get a handle to an APR struct that works with + * the APR functions which are supposed to work identically on all + * platforms. + */ +APR_DECLARE(apr_status_t) apr_file_open_stderr(apr_file_t **thefile, + apr_pool_t *cont); + +/** + * open standard output as an apr file pointer. + * @param thefile The apr file to use as stdout. + * @param cont The pool to allocate the file out of. + * + * @remark The only reason that the apr_file_open_std* functions exist + * is that you may not always have a stderr/out/in on Windows. This + * is generally a problem with newer versions of Windows and services. + * + * The other problem is that the C library functions generally work + * differently on Windows and Unix. So, by using apr_file_open_std* + * functions, you can get a handle to an APR struct that works with + * the APR functions which are supposed to work identically on all + * platforms. + */ +APR_DECLARE(apr_status_t) apr_file_open_stdout(apr_file_t **thefile, + apr_pool_t *cont); + +/** + * open standard input as an apr file pointer. + * @param thefile The apr file to use as stdin. + * @param cont The pool to allocate the file out of. + * + * @remark The only reason that the apr_file_open_std* functions exist + * is that you may not always have a stderr/out/in on Windows. This + * is generally a problem with newer versions of Windows and services. + * + * The other problem is that the C library functions generally work + * differently on Windows and Unix. So, by using apr_file_open_std* + * functions, you can get a handle to an APR struct that works with + * the APR functions which are supposed to work identically on all + * platforms. + */ +APR_DECLARE(apr_status_t) apr_file_open_stdin(apr_file_t **thefile, + apr_pool_t *cont); + +/** + * Read data from the specified file. + * @param thefile The file descriptor to read from. + * @param buf The buffer to store the data to. + * @param nbytes On entry, the number of bytes to read; on exit, the number of bytes read. + * @remark apr_file_read will read up to the specified number of bytes, but + * never more. If there isn't enough data to fill that number of + * bytes, all of the available data is read. The third argument is + * modified to reflect the number of bytes read. If a char was put + * back into the stream via ungetc, it will be the first character + * returned. + * + * It is not possible for both bytes to be read and an APR_EOF or other + * error to be returned. + * + * APR_EINTR is never returned. + */ +APR_DECLARE(apr_status_t) apr_file_read(apr_file_t *thefile, void *buf, + apr_size_t *nbytes); + +/** + * Write data to the specified file. + * @param thefile The file descriptor to write to. + * @param buf The buffer which contains the data. + * @param nbytes On entry, the number of bytes to write; on exit, the number + * of bytes written. + * @remark apr_file_write will write up to the specified number of bytes, but never + * more. If the OS cannot write that many bytes, it will write as many + * as it can. The third argument is modified to reflect the * number + * of bytes written. + * + * It is possible for both bytes to be written and an error to be returned. + * + * APR_EINTR is never returned. + */ +APR_DECLARE(apr_status_t) apr_file_write(apr_file_t *thefile, const void *buf, + apr_size_t *nbytes); + +/** + * Write data from iovec array to the specified file. + * @param thefile The file descriptor to write to. + * @param vec The array from which to get the data to write to the file. + * @param nvec The number of elements in the struct iovec array. This must + * be smaller than APR_MAX_IOVEC_SIZE. If it isn't, the function + * will fail with APR_EINVAL. + * @param nbytes The number of bytes written. + * @remark It is possible for both bytes to be written and an error to be returned. + * APR_EINTR is never returned. + * + * apr_file_writev is available even if the underlying operating system + * + * doesn't provide writev(). + */ +APR_DECLARE(apr_status_t) apr_file_writev(apr_file_t *thefile, + const struct iovec *vec, + apr_size_t nvec, apr_size_t *nbytes); + +/** + * Read data from the specified file, ensuring that the buffer is filled + * before returning. + * @param thefile The file descriptor to read from. + * @param buf The buffer to store the data to. + * @param nbytes The number of bytes to read. + * @param bytes_read If non-NULL, this will contain the number of bytes read. + * @remark apr_file_read will read up to the specified number of bytes, but never + * more. If there isn't enough data to fill that number of bytes, + * then the process/thread will block until it is available or EOF + * is reached. If a char was put back into the stream via ungetc, + * it will be the first character returned. + * + * It is possible for both bytes to be read and an error to be + * returned. And if *bytes_read is less than nbytes, an + * accompanying error is _always_ returned. + * + * APR_EINTR is never returned. + */ +APR_DECLARE(apr_status_t) apr_file_read_full(apr_file_t *thefile, void *buf, + apr_size_t nbytes, + apr_size_t *bytes_read); + +/** + * Write data to the specified file, ensuring that all of the data is + * written before returning. + * @param thefile The file descriptor to write to. + * @param buf The buffer which contains the data. + * @param nbytes The number of bytes to write. + * @param bytes_written If non-NULL, this will contain the number of bytes written. + * @remark apr_file_write will write up to the specified number of bytes, but never + * more. If the OS cannot write that many bytes, the process/thread + * will block until they can be written. Exceptional error such as + * "out of space" or "pipe closed" will terminate with an error. + * + * It is possible for both bytes to be written and an error to be + * returned. And if *bytes_written is less than nbytes, an + * accompanying error is _always_ returned. + * + * APR_EINTR is never returned. + */ +APR_DECLARE(apr_status_t) apr_file_write_full(apr_file_t *thefile, const void *buf, + apr_size_t nbytes, + apr_size_t *bytes_written); + +/** + * put a character into the specified file. + * @param ch The character to write. + * @param thefile The file descriptor to write to + */ +APR_DECLARE(apr_status_t) apr_file_putc(char ch, apr_file_t *thefile); + +/** + * get a character from the specified file. + * @param ch The character to read into + * @param thefile The file descriptor to read from + */ +APR_DECLARE(apr_status_t) apr_file_getc(char *ch, apr_file_t *thefile); + +/** + * put a character back onto a specified stream. + * @param ch The character to write. + * @param thefile The file descriptor to write to + */ +APR_DECLARE(apr_status_t) apr_file_ungetc(char ch, apr_file_t *thefile); + +/** + * Get a string from a specified file. + * @param str The buffer to store the string in. + * @param len The length of the string + * @param thefile The file descriptor to read from + * @remark The buffer will be '\0'-terminated if any characters are stored. + */ +APR_DECLARE(apr_status_t) apr_file_gets(char *str, int len, apr_file_t *thefile); + +/** + * Put the string into a specified file. + * @param str The string to write. + * @param thefile The file descriptor to write to + */ +APR_DECLARE(apr_status_t) apr_file_puts(const char *str, apr_file_t *thefile); + +/** + * Flush the file's buffer. + * @param thefile The file descriptor to flush + */ +APR_DECLARE(apr_status_t) apr_file_flush(apr_file_t *thefile); + +/** + * duplicate the specified file descriptor. + * @param new_file The structure to duplicate into. + * @param old_file The file to duplicate. + * @param p The pool to use for the new file. + * @remark *new_file must point to a valid apr_file_t, or point to NULL + */ +APR_DECLARE(apr_status_t) apr_file_dup(apr_file_t **new_file, + apr_file_t *old_file, + apr_pool_t *p); + +/** + * duplicate the specified file descriptor and close the original + * @param new_file The old file that is to be closed and reused + * @param old_file The file to duplicate + * @param p The pool to use for the new file + * + * @remark new_file MUST point at a valid apr_file_t. It cannot be NULL + */ +APR_DECLARE(apr_status_t) apr_file_dup2(apr_file_t *new_file, + apr_file_t *old_file, + apr_pool_t *p); + +/** + * move the specified file descriptor to a new pool + * @param new_file Pointer in which to return the new apr_file_t + * @param old_file The file to move + * @param p The pool to which the descriptor is to be moved + * @remark Unlike apr_file_dup2(), this function doesn't do an + * OS dup() operation on the underlying descriptor; it just + * moves the descriptor's apr_file_t wrapper to a new pool. + * @remark The new pool need not be an ancestor of old_file's pool. + * @remark After calling this function, old_file may not be used + */ +APR_DECLARE(apr_status_t) apr_file_setaside(apr_file_t **new_file, + apr_file_t *old_file, + apr_pool_t *p); + +/** + * Move the read/write file offset to a specified byte within a file. + * @param thefile The file descriptor + * @param where How to move the pointer, one of: + *
    + *            APR_SET  --  set the offset to offset
    + *            APR_CUR  --  add the offset to the current position 
    + *            APR_END  --  add the offset to the current file size 
    + * 
    + * @param offset The offset to move the pointer to. + * @remark The third argument is modified to be the offset the pointer + was actually moved to. + */ +APR_DECLARE(apr_status_t) apr_file_seek(apr_file_t *thefile, + apr_seek_where_t where, + apr_off_t *offset); + +/** + * Create an anonymous pipe. + * @param in The file descriptor to use as input to the pipe. + * @param out The file descriptor to use as output from the pipe. + * @param cont The pool to operate on. + */ +APR_DECLARE(apr_status_t) apr_file_pipe_create(apr_file_t **in, apr_file_t **out, + apr_pool_t *cont); + +/** + * Create a named pipe. + * @param filename The filename of the named pipe + * @param perm The permissions for the newly created pipe. + * @param cont The pool to operate on. + */ +APR_DECLARE(apr_status_t) apr_file_namedpipe_create(const char *filename, + apr_fileperms_t perm, + apr_pool_t *cont); + +/** + * Get the timeout value for a pipe or manipulate the blocking state. + * @param thepipe The pipe we are getting a timeout for. + * @param timeout The current timeout value in microseconds. + */ +APR_DECLARE(apr_status_t) apr_file_pipe_timeout_get(apr_file_t *thepipe, + apr_interval_time_t *timeout); + +/** + * Set the timeout value for a pipe or manipulate the blocking state. + * @param thepipe The pipe we are setting a timeout on. + * @param timeout The timeout value in microseconds. Values < 0 mean wait + * forever, 0 means do not wait at all. + */ +APR_DECLARE(apr_status_t) apr_file_pipe_timeout_set(apr_file_t *thepipe, + apr_interval_time_t timeout); + +/** file (un)locking functions. */ + +/** + * Establish a lock on the specified, open file. The lock may be advisory + * or mandatory, at the discretion of the platform. The lock applies to + * the file as a whole, rather than a specific range. Locks are established + * on a per-thread/process basis; a second lock by the same thread will not + * block. + * @param thefile The file to lock. + * @param type The type of lock to establish on the file. + */ +APR_DECLARE(apr_status_t) apr_file_lock(apr_file_t *thefile, int type); + +/** + * Remove any outstanding locks on the file. + * @param thefile The file to unlock. + */ +APR_DECLARE(apr_status_t) apr_file_unlock(apr_file_t *thefile); + +/**accessor and general file_io functions. */ + +/** + * return the file name of the current file. + * @param new_path The path of the file. + * @param thefile The currently open file. + */ +APR_DECLARE(apr_status_t) apr_file_name_get(const char **new_path, + apr_file_t *thefile); + +/** + * Return the data associated with the current file. + * @param data The user data associated with the file. + * @param key The key to use for retreiving data associated with this file. + * @param file The currently open file. + */ +APR_DECLARE(apr_status_t) apr_file_data_get(void **data, const char *key, + apr_file_t *file); + +/** + * Set the data associated with the current file. + * @param file The currently open file. + * @param data The user data to associate with the file. + * @param key The key to use for assocaiteing data with the file. + * @param cleanup The cleanup routine to use when the file is destroyed. + */ +APR_DECLARE(apr_status_t) apr_file_data_set(apr_file_t *file, void *data, + const char *key, + apr_status_t (*cleanup)(void *)); + +/** + * Write a string to a file using a printf format. + * @param fptr The file to write to. + * @param format The format string + * @param ... The values to substitute in the format string + * @return The number of bytes written + */ +APR_DECLARE_NONSTD(int) apr_file_printf(apr_file_t *fptr, + const char *format, ...) + __attribute__((format(printf,2,3))); + +/** + * set the specified file's permission bits. + * @param fname The file (name) to apply the permissions to. + * @param perms The permission bits to apply to the file. + * @warning Some platforms may not be able to apply all of the available + * permission bits; APR_INCOMPLETE will be returned if some permissions + * are specified which could not be set. + * + * Platforms which do not implement this feature will return APR_ENOTIMPL. + */ +APR_DECLARE(apr_status_t) apr_file_perms_set(const char *fname, + apr_fileperms_t perms); + +/** + * Set attributes of the specified file. + * @param fname The full path to the file (using / on all systems) + * @param attributes Or'd combination of + *
    + *            APR_FILE_ATTR_READONLY   - make the file readonly
    + *            APR_FILE_ATTR_EXECUTABLE - make the file executable
    + *            APR_FILE_ATTR_HIDDEN     - make the file hidden
    + * 
    + * @param attr_mask Mask of valid bits in attributes. + * @param cont the pool to use. + * @remark This function should be used in preference to explict manipulation + * of the file permissions, because the operations to provide these + * attributes are platform specific and may involve more than simply + * setting permission bits. + * @warning Platforms which do not implement this feature will return + * APR_ENOTIMPL. + */ +APR_DECLARE(apr_status_t) apr_file_attrs_set(const char *fname, + apr_fileattrs_t attributes, + apr_fileattrs_t attr_mask, + apr_pool_t *cont); + +/** + * Set the mtime of the specified file. + * @param fname The full path to the file (using / on all systems) + * @param mtime The mtime to apply to the file. + * @param pool The pool to use. + * @warning Platforms which do not implement this feature will return + * APR_ENOTIMPL. + */ +APR_DECLARE(apr_status_t) apr_file_mtime_set(const char *fname, + apr_time_t mtime, + apr_pool_t *pool); + +/** + * Create a new directory on the file system. + * @param path the path for the directory to be created. (use / on all systems) + * @param perm Permissions for the new direcoty. + * @param cont the pool to use. + */ +APR_DECLARE(apr_status_t) apr_dir_make(const char *path, apr_fileperms_t perm, + apr_pool_t *cont); + +/** Creates a new directory on the file system, but behaves like + * 'mkdir -p'. Creates intermediate directories as required. No error + * will be reported if PATH already exists. + * @param path the path for the directory to be created. (use / on all systems) + * @param perm Permissions for the new direcoty. + * @param pool the pool to use. + */ +APR_DECLARE(apr_status_t) apr_dir_make_recursive(const char *path, + apr_fileperms_t perm, + apr_pool_t *pool); + +/** + * Remove directory from the file system. + * @param path the path for the directory to be removed. (use / on all systems) + * @param cont the pool to use. + */ +APR_DECLARE(apr_status_t) apr_dir_remove(const char *path, apr_pool_t *cont); + +/** + * get the specified file's stats. + * @param finfo Where to store the information about the file. + * @param wanted The desired apr_finfo_t fields, as a bit flag of APR_FINFO_ values + * @param thefile The file to get information about. + */ +APR_DECLARE(apr_status_t) apr_file_info_get(apr_finfo_t *finfo, + apr_int32_t wanted, + apr_file_t *thefile); + + +/** + * Truncate the file's length to the specified offset + * @param fp The file to truncate + * @param offset The offset to truncate to. + * @remark The read/write file offset is repositioned to offset. + */ +APR_DECLARE(apr_status_t) apr_file_trunc(apr_file_t *fp, apr_off_t offset); + +/** + * Retrieve the flags that were passed into apr_file_open() + * when the file was opened. + * @return apr_int32_t the flags + */ +APR_DECLARE(apr_int32_t) apr_file_flags_get(apr_file_t *f); + +/** + * Get the pool used by the file. + */ +APR_POOL_DECLARE_ACCESSOR(file); + +/** + * Set a file to be inherited by child processes. + * + */ +APR_DECLARE_INHERIT_SET(file); + +/** @deprecated @see apr_file_inherit_set */ +APR_DECLARE(void) apr_file_set_inherit(apr_file_t *file); + +/** + * Unset a file from being inherited by child processes. + */ +APR_DECLARE_INHERIT_UNSET(file); + +/** @deprecated @see apr_file_inherit_unset */ +APR_DECLARE(void) apr_file_unset_inherit(apr_file_t *file); + +/** + * Open a temporary file + * @param fp The apr file to use as a temporary file. + * @param templ The template to use when creating a temp file. + * @param flags The flags to open the file with. If this is zero, + * the file is opened with + * APR_CREATE | APR_READ | APR_WRITE | APR_EXCL | APR_DELONCLOSE + * @param p The pool to allocate the file out of. + * @remark + * This function generates a unique temporary file name from template. + * The last six characters of template must be XXXXXX and these are replaced + * with a string that makes the filename unique. Since it will be modified, + * template must not be a string constant, but should be declared as a character + * array. + * + */ +APR_DECLARE(apr_status_t) apr_file_mktemp(apr_file_t **fp, char *templ, + apr_int32_t flags, apr_pool_t *p); + + +/** + * Find an existing directory suitable as a temporary storage location. + * @param temp_dir The temp directory. + * @param p The pool to use for any necessary allocations. + * @remark + * This function uses an algorithm to search for a directory that an + * an application can use for temporary storage. Once such a + * directory is found, that location is cached by the library. Thus, + * callers only pay the cost of this algorithm once if that one time + * is successful. + * + */ +APR_DECLARE(apr_status_t) apr_temp_dir_get(const char **temp_dir, + apr_pool_t *p); + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* ! APR_FILE_IO_H */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_fnmatch.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_fnmatch.h new file mode 100644 index 00000000..8be40fc8 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_fnmatch.h @@ -0,0 +1,105 @@ +/* + * Copyright (c) 1992, 1993 + * The Regents of the University of California. 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University 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 REGENTS 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 REGENTS 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. + * + * @(#)fnmatch.h 8.1 (Berkeley) 6/2/93 + */ + +/* This file has been modified by the Apache Software Foundation. */ +#ifndef _APR_FNMATCH_H_ +#define _APR_FNMATCH_H_ + +/** + * @file apr_fnmatch.h + * @brief APR FNMatch Functions + */ + +#include "apr_errno.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup apr_fnmatch Filename Matching Functions + * @ingroup APR + * @{ + */ + +#define APR_FNM_NOMATCH 1 /**< Match failed. */ + +#define APR_FNM_NOESCAPE 0x01 /**< Disable backslash escaping. */ +#define APR_FNM_PATHNAME 0x02 /**< Slash must be matched by slash. */ +#define APR_FNM_PERIOD 0x04 /**< Period must be matched by period. */ +#define APR_FNM_CASE_BLIND 0x08 /**< Compare characters case-insensitively. + * @remark This flag is an Apache addition + */ + +#define FNM_NOMATCH APR_FNM_NOMATCH /**< @deprecated @see APR_FNM_NOMATCH */ +#define FNM_NOESCAPE APR_FNM_NOESCAPE /**< @deprecated @see APR_FNM_NOESCAPE */ +#define FNM_PATHNAME APR_FNM_PATHNAME /**< @deprecated @see APR_FNM_PATHNAME */ +#define FNM_PERIOD APR_FNM_PERIOD /**< @deprecated @see APR_FNM_PERIOD */ +#define FNM_CASE_BLIND APR_FNM_CASE_BLIND /**< @deprecated @see APR_FNM_CASE_BLIND */ + +/** + * Try to match the string to the given pattern, return APR_SUCCESS if + * match, else return APR_FNM_NOMATCH. + * @param pattern The pattern to match to + * @param strings The string we are trying to match + * @param flags flags to use in the match. Bitwise OR of: + *
    + *              APR_FNM_NOESCAPE       Disable backslash escaping
    + *              APR_FNM_PATHNAME       Slash must be matched by slash
    + *              APR_FNM_PERIOD         Period must be matched by period
    + *              APR_FNM_CASE_BLIND     Compare characters case-insensitively.
    + * 
    + */ + +APR_DECLARE(apr_status_t) apr_fnmatch(const char *pattern, + const char *strings, int flags); + +/** + * Determine if the given pattern is a regular expression. + * @param pattern The pattern to search for glob characters. + * @return non-zero if pattern has any glob characters in it + */ +APR_DECLARE(int) apr_fnmatch_test(const char *pattern); + +/** @deprecated @see apr_fnmatch_test */ +APR_DECLARE(int) apr_is_fnmatch(const char *pattern); + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* !_APR_FNMATCH_H_ */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_general.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_general.h new file mode 100644 index 00000000..10e150b9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_general.h @@ -0,0 +1,249 @@ +/* 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. + */ + +#ifndef APR_GENERAL_H +#define APR_GENERAL_H + +/** + * @file apr_general.h + * This is collection of oddballs that didn't fit anywhere else, + * and might move to more appropriate headers with the release + * of APR 1.0. + * @brief APR Miscellaneous library routines + */ + +#include "apr.h" +#include "apr_pools.h" +#include "apr_errno.h" + +#if APR_HAVE_SIGNAL_H +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/** + * @defgroup apr_general Miscellaneous library routines + * @ingroup APR + * This is collection of oddballs that didn't fit anywhere else, + * and might move to more appropriate headers with the release + * of APR 1.0. + * @{ + */ + +/** FALSE */ +#ifndef FALSE +#define FALSE 0 +#endif +/** TRUE */ +#ifndef TRUE +#define TRUE (!FALSE) +#endif + +/** a space */ +#define APR_ASCII_BLANK '\040' +/** a carrige return */ +#define APR_ASCII_CR '\015' +/** a line feed */ +#define APR_ASCII_LF '\012' +/** a tab */ +#define APR_ASCII_TAB '\011' + +/** signal numbers typedef */ +typedef int apr_signum_t; + +/** + * Finding offsets of elements within structures. + * Taken from the X code... they've sweated portability of this stuff + * so we don't have to. Sigh... + * @param p_type pointer type name + * @param field data field within the structure pointed to + * @return offset + */ + +#if defined(CRAY) || (defined(__arm) && !defined(LINUX)) +#ifdef __STDC__ +#define APR_OFFSET(p_type,field) _Offsetof(p_type,field) +#else +#ifdef CRAY2 +#define APR_OFFSET(p_type,field) \ + (sizeof(int)*((unsigned int)&(((p_type)NULL)->field))) + +#else /* !CRAY2 */ + +#define APR_OFFSET(p_type,field) ((unsigned int)&(((p_type)NULL)->field)) + +#endif /* !CRAY2 */ +#endif /* __STDC__ */ +#else /* ! (CRAY || __arm) */ + +#define APR_OFFSET(p_type,field) \ + ((long) (((char *) (&(((p_type)NULL)->field))) - ((char *) NULL))) + +#endif /* !CRAY */ + +/** + * Finding offsets of elements within structures. + * @param s_type structure type name + * @param field data field within the structure + * @return offset + */ +#if defined(offsetof) && !defined(__cplusplus) +#define APR_OFFSETOF(s_type,field) offsetof(s_type,field) +#else +#define APR_OFFSETOF(s_type,field) APR_OFFSET(s_type*,field) +#endif + +/** @deprecated @see APR_OFFSET */ +#define APR_XtOffset APR_OFFSET + +/** @deprecated @see APR_OFFSETOF */ +#define APR_XtOffsetOf APR_OFFSETOF + +#ifndef DOXYGEN + +/* A couple of prototypes for functions in case some platform doesn't + * have it + */ +#if (!APR_HAVE_STRCASECMP) && (APR_HAVE_STRICMP) +#define strcasecmp(s1, s2) stricmp(s1, s2) +#elif (!APR_HAVE_STRCASECMP) +int strcasecmp(const char *a, const char *b); +#endif + +#if (!APR_HAVE_STRNCASECMP) && (APR_HAVE_STRNICMP) +#define strncasecmp(s1, s2, n) strnicmp(s1, s2, n) +#elif (!APR_HAVE_STRNCASECMP) +int strncasecmp(const char *a, const char *b, size_t n); +#endif + +#endif + +/** + * Alignment macros + */ + +/* APR_ALIGN() is only to be used to align on a power of 2 boundary */ +#define APR_ALIGN(size, boundary) \ + (((size) + ((boundary) - 1)) & ~((boundary) - 1)) + +/** Default alignment */ +#define APR_ALIGN_DEFAULT(size) APR_ALIGN(size, 8) + + +/** + * String and memory functions + */ + +/** Properly quote a value as a string in the C preprocessor */ +#define APR_STRINGIFY(n) APR_STRINGIFY_HELPER(n) +/** Helper macro for APR_STRINGIFY */ +#define APR_STRINGIFY_HELPER(n) #n + +#if (!APR_HAVE_MEMMOVE) +#define memmove(a,b,c) bcopy(b,a,c) +#endif + +#if (!APR_HAVE_MEMCHR) +void *memchr(const void *s, int c, size_t n); +#endif + +/** @} */ + +/** + * @defgroup apr_library Library initialization and termination + * @{ + */ + +/** + * Setup any APR internal data structures. This MUST be the first function + * called for any APR library. + * @remark See apr_app_initialize if this is an application, rather than + * a library consumer of apr. + */ +APR_DECLARE(apr_status_t) apr_initialize(void); + +/** + * Set up an application with normalized argc, argv (and optionally env) in + * order to deal with platform-specific oddities, such as Win32 services, + * code pages and signals. This must be the first function called for any + * APR program. + * @param argc Pointer to the argc that may be corrected + * @param argv Pointer to the argv that may be corrected + * @param env Pointer to the env that may be corrected, may be NULL + * @remark See apr_initialize if this is a library consumer of apr. + * Otherwise, this call is identical to apr_initialize, and must be closed + * with a call to apr_terminate at the end of program execution. + */ +APR_DECLARE(apr_status_t) apr_app_initialize(int *argc, + char const * const * *argv, + char const * const * *env); + +/** + * Tear down any APR internal data structures which aren't torn down + * automatically. + * @remark An APR program must call this function at termination once it + * has stopped using APR services. The APR developers suggest using + * atexit to ensure this is called. When using APR from a language + * other than C that has problems with the calling convention, use + * apr_terminate2() instead. + */ +APR_DECLARE_NONSTD(void) apr_terminate(void); + +/** + * Tear down any APR internal data structures which aren't torn down + * automatically, same as apr_terminate + * @remark An APR program must call either the apr_terminate or apr_terminate2 + * function once it it has finished using APR services. The APR + * developers suggest using atexit(apr_terminate) to ensure this is done. + * apr_terminate2 exists to allow non-c language apps to tear down apr, + * while apr_terminate is recommended from c language applications. + */ +APR_DECLARE(void) apr_terminate2(void); + +/** @} */ + +/** + * @defgroup apr_random Random Functions + * @{ + */ + +#if APR_HAS_RANDOM || defined(DOXYGEN) + +/* TODO: I'm not sure this is the best place to put this prototype...*/ +/** + * Generate random bytes. + * @param buf Buffer to fill with random bytes + * @param length Length of buffer in bytes (becomes apr_size_t in APR 1.0) + */ +#ifdef APR_ENABLE_FOR_1_0 +APR_DECLARE(apr_status_t) apr_generate_random_bytes(unsigned char * buf, + apr_size_t length); +#else +APR_DECLARE(apr_status_t) apr_generate_random_bytes(unsigned char * buf, + int length); +#endif + +#endif +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* ! APR_GENERAL_H */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_getopt.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_getopt.h new file mode 100644 index 00000000..131aa4b3 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_getopt.h @@ -0,0 +1,158 @@ +/* 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. + */ + +#ifndef APR_GETOPT_H +#define APR_GETOPT_H + +/** + * @file apr_getopt.h + * @brief APR Command Arguments (getopt) + */ + +#include "apr_pools.h" + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/** + * @defgroup apr_getopt Command Argument Parsing + * @ingroup APR + * @{ + */ + +/** + * defintion of a error function + */ +typedef void (apr_getopt_err_fn_t)(void *arg, const char *err, ...); + +/** @see apr_getopt_t */ +typedef struct apr_getopt_t apr_getopt_t; + +/** + * Structure to store command line argument information. + */ +struct apr_getopt_t { + /** context for processing */ + apr_pool_t *cont; + /** function to print error message (NULL == no messages) */ + apr_getopt_err_fn_t *errfn; + /** user defined first arg to pass to error message */ + void *errarg; + /** index into parent argv vector */ + int ind; + /** character checked for validity */ + int opt; + /** reset getopt */ + int reset; + /** count of arguments */ + int argc; + /** array of pointers to arguments */ + const char **argv; + /** argument associated with option */ + char const* place; + /** set to nonzero to support interleaving options with regular args */ + int interleave; + /** start of non-option arguments skipped for interleaving */ + int skip_start; + /** end of non-option arguments skipped for interleaving */ + int skip_end; +}; + +/** @see apr_getopt_option_t */ +typedef struct apr_getopt_option_t apr_getopt_option_t; + +/** + * Structure used to describe options that getopt should search for. + */ +struct apr_getopt_option_t { + /** long option name, or NULL if option has no long name */ + const char *name; + /** option letter, or a value greater than 255 if option has no letter */ + int optch; + /** nonzero if option takes an argument */ + int has_arg; + /** a description of the option */ + const char *description; +}; + +/** + * Initialize the arguments for parsing by apr_getopt(). + * @param os The options structure created for apr_getopt() + * @param cont The pool to operate on + * @param argc The number of arguments to parse + * @param argv The array of arguments to parse + * @remark Arguments 2 and 3 are most commonly argc and argv from main(argc, argv) + * The errfn is initialized to fprintf(stderr... but may be overridden. + */ +APR_DECLARE(apr_status_t) apr_getopt_init(apr_getopt_t **os, apr_pool_t *cont, + int argc, const char * const *argv); + +/** + * Parse the options initialized by apr_getopt_init(). + * @param os The apr_opt_t structure returned by apr_getopt_init() + * @param opts A string of characters that are acceptable options to the + * program. Characters followed by ":" are required to have an + * option associated + * @param option_ch The next option character parsed + * @param option_arg The argument following the option character: + * @return There are four potential status values on exit. They are: + *
    + *             APR_EOF      --  No more options to parse
    + *             APR_BADCH    --  Found a bad option character
    + *             APR_BADARG   --  No argument followed the option flag
    + *             APR_SUCCESS  --  The next option was found.
    + * 
    + */ +APR_DECLARE(apr_status_t) apr_getopt(apr_getopt_t *os, const char *opts, + char *option_ch, const char **option_arg); + +/** + * Parse the options initialized by apr_getopt_init(), accepting long + * options beginning with "--" in addition to single-character + * options beginning with "-". + * @param os The apr_getopt_t structure created by apr_getopt_init() + * @param opts A pointer to a list of apr_getopt_option_t structures, which + * can be initialized with { "name", optch, has_args }. has_args + * is nonzero if the option requires an argument. A structure + * with an optch value of 0 terminates the list. + * @param option_ch Receives the value of "optch" from the apr_getopt_option_t + * structure corresponding to the next option matched. + * @param option_arg Receives the argument following the option, if any. + * @return There are four potential status values on exit. They are: + *
    + *             APR_EOF      --  No more options to parse
    + *             APR_BADCH    --  Found a bad option character
    + *             APR_BADARG   --  No argument followed the option flag
    + *             APR_SUCCESS  --  The next option was found.
    + * 
    + * When APR_SUCCESS is returned, os->ind gives the index of the first + * non-option argument. On error, a message will be printed to stdout unless + * os->err is set to 0. If os->interleave is set to nonzero, options can come + * after arguments, and os->argv will be permuted to leave non-option arguments + * at the end (the original argv is unaffected). + */ +APR_DECLARE(apr_status_t) apr_getopt_long(apr_getopt_t *os, + const apr_getopt_option_t *opts, + int *option_ch, + const char **option_arg); +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* ! APR_GETOPT_H */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_global_mutex.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_global_mutex.h new file mode 100644 index 00000000..9316001c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_global_mutex.h @@ -0,0 +1,153 @@ +/* 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. + */ + +#ifndef APR_GLOBAL_MUTEX_H +#define APR_GLOBAL_MUTEX_H + +/** + * @file apr_global_mutex.h + * @brief APR Global Locking Routines + */ + +#include "apr.h" +#include "apr_proc_mutex.h" /* only for apr_lockmech_e */ +#include "apr_pools.h" +#include "apr_errno.h" +#if APR_PROC_MUTEX_IS_GLOBAL +#include "apr_proc_mutex.h" +#endif + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/** + * @defgroup APR_GlobalMutex Global Locking Routines + * @ingroup APR + * @{ + */ + +#if !APR_PROC_MUTEX_IS_GLOBAL || defined(DOXYGEN) + +/** Opaque global mutex structure. */ +typedef struct apr_global_mutex_t apr_global_mutex_t; + +/* Function definitions */ + +/** + * Create and initialize a mutex that can be used to synchronize both + * processes and threads. Note: There is considerable overhead in using + * this API if only cross-process or cross-thread mutual exclusion is + * required. See apr_proc_mutex.h and apr_thread_mutex.h for more + * specialized lock routines. + * @param mutex the memory address where the newly created mutex will be + * stored. + * @param fname A file name to use if the lock mechanism requires one. This + * argument should always be provided. The lock code itself will + * determine if it should be used. + * @param mech The mechanism to use for the interprocess lock, if any; one of + *
    + *            APR_LOCK_FCNTL
    + *            APR_LOCK_FLOCK
    + *            APR_LOCK_SYSVSEM
    + *            APR_LOCK_POSIXSEM
    + *            APR_LOCK_PROC_PTHREAD
    + *            APR_LOCK_DEFAULT     pick the default mechanism for the platform
    + * 
    + * @param pool the pool from which to allocate the mutex. + * @warning Check APR_HAS_foo_SERIALIZE defines to see if the platform supports + * APR_LOCK_foo. Only APR_LOCK_DEFAULT is portable. + */ +APR_DECLARE(apr_status_t) apr_global_mutex_create(apr_global_mutex_t **mutex, + const char *fname, + apr_lockmech_e mech, + apr_pool_t *pool); + +/** + * Re-open a mutex in a child process. + * @param mutex The newly re-opened mutex structure. + * @param fname A file name to use if the mutex mechanism requires one. This + * argument should always be provided. The mutex code itself will + * determine if it should be used. This filename should be the + * same one that was passed to apr_global_mutex_create(). + * @param pool The pool to operate on. + * @remark This function must be called to maintain portability, even + * if the underlying lock mechanism does not require it. + */ +APR_DECLARE(apr_status_t) apr_global_mutex_child_init( + apr_global_mutex_t **mutex, + const char *fname, + apr_pool_t *pool); + +/** + * Acquire the lock for the given mutex. If the mutex is already locked, + * the current thread will be put to sleep until the lock becomes available. + * @param mutex the mutex on which to acquire the lock. + */ +APR_DECLARE(apr_status_t) apr_global_mutex_lock(apr_global_mutex_t *mutex); + +/** + * Attempt to acquire the lock for the given mutex. If the mutex has already + * been acquired, the call returns immediately with APR_EBUSY. Note: it + * is important that the APR_STATUS_IS_EBUSY(s) macro be used to determine + * if the return value was APR_EBUSY, for portability reasons. + * @param mutex the mutex on which to attempt the lock acquiring. + */ +APR_DECLARE(apr_status_t) apr_global_mutex_trylock(apr_global_mutex_t *mutex); + +/** + * Release the lock for the given mutex. + * @param mutex the mutex from which to release the lock. + */ +APR_DECLARE(apr_status_t) apr_global_mutex_unlock(apr_global_mutex_t *mutex); + +/** + * Destroy the mutex and free the memory associated with the lock. + * @param mutex the mutex to destroy. + */ +APR_DECLARE(apr_status_t) apr_global_mutex_destroy(apr_global_mutex_t *mutex); + +/** + * Get the pool used by this global_mutex. + * @return apr_pool_t the pool + */ +APR_POOL_DECLARE_ACCESSOR(global_mutex); + +#else /* APR_PROC_MUTEX_IS_GLOBAL */ + +/* Some platforms [e.g. Win32] have cross process locks that are truly + * global locks, since there isn't the concept of cross-process locks. + * Define these platforms in terms of an apr_proc_mutex_t. + */ + +#define apr_global_mutex_t apr_proc_mutex_t +#define apr_global_mutex_create apr_proc_mutex_create +#define apr_global_mutex_child_init apr_proc_mutex_child_init +#define apr_global_mutex_lock apr_proc_mutex_lock +#define apr_global_mutex_trylock apr_proc_mutex_trylock +#define apr_global_mutex_unlock apr_proc_mutex_unlock +#define apr_global_mutex_destroy apr_proc_mutex_destroy +#define apr_global_mutex_pool_get apr_proc_mutex_pool_get + +#endif + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* ndef APR_GLOBAL_MUTEX_H */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_hash.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_hash.h new file mode 100644 index 00000000..87795c4a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_hash.h @@ -0,0 +1,201 @@ +/* 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. + */ + +#ifndef APR_HASH_H +#define APR_HASH_H + +/** + * @file apr_hash.h + * @brief APR Hash Tables + */ + +#include "apr_pools.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup apr_hash Hash Tables + * @ingroup APR + * @{ + */ + +/** + * When passing a key to apr_hash_set or apr_hash_get, this value can be + * passed to indicate a string-valued key, and have apr_hash compute the + * length automatically. + * + * @remark apr_hash will use strlen(key) for the length. The null-terminator + * is not included in the hash value (why throw a constant in?). + * Since the hash table merely references the provided key (rather + * than copying it), apr_hash_this() will return the null-term'd key. + */ +#define APR_HASH_KEY_STRING (-1) + +/** + * Abstract type for hash tables. + */ +typedef struct apr_hash_t apr_hash_t; + +/** + * Abstract type for scanning hash tables. + */ +typedef struct apr_hash_index_t apr_hash_index_t; + +/** + * Create a hash table. + * @param pool The pool to allocate the hash table out of + * @return The hash table just created + */ +APR_DECLARE(apr_hash_t *) apr_hash_make(apr_pool_t *pool); + +/** + * Make a copy of a hash table + * @param pool The pool from which to allocate the new hash table + * @param h The hash table to clone + * @return The hash table just created + * @remark Makes a shallow copy + */ +APR_DECLARE(apr_hash_t *) apr_hash_copy(apr_pool_t *pool, + const apr_hash_t *h); + +/** + * Associate a value with a key in a hash table. + * @param ht The hash table + * @param key Pointer to the key + * @param klen Length of the key. Can be APR_HASH_KEY_STRING to use the string length. + * @param val Value to associate with the key + * @remark If the value is NULL the hash entry is deleted. + */ +APR_DECLARE(void) apr_hash_set(apr_hash_t *ht, const void *key, + apr_ssize_t klen, const void *val); + +/** + * Look up the value associated with a key in a hash table. + * @param ht The hash table + * @param key Pointer to the key + * @param klen Length of the key. Can be APR_HASH_KEY_STRING to use the string length. + * @return Returns NULL if the key is not present. + */ +APR_DECLARE(void *) apr_hash_get(apr_hash_t *ht, const void *key, + apr_ssize_t klen); + +/** + * Start iterating over the entries in a hash table. + * @param p The pool to allocate the apr_hash_index_t iterator. If this + * pool is NULL, then an internal, non-thread-safe iterator is used. + * @param ht The hash table + * @remark There is no restriction on adding or deleting hash entries during + * an iteration (although the results may be unpredictable unless all you do + * is delete the current entry) and multiple iterations can be in + * progress at the same time. + + * @example + */ +/** + *
    + * 
    + * int sum_values(apr_pool_t *p, apr_hash_t *ht)
    + * {
    + *     apr_hash_index_t *hi;
    + *     void *val;
    + *     int sum = 0;
    + *     for (hi = apr_hash_first(p, ht); hi; hi = apr_hash_next(hi)) {
    + *         apr_hash_this(hi, NULL, NULL, &val);
    + *         sum += *(int *)val;
    + *     }
    + *     return sum;
    + * }
    + * 
    + */ +APR_DECLARE(apr_hash_index_t *) apr_hash_first(apr_pool_t *p, apr_hash_t *ht); + +/** + * Continue iterating over the entries in a hash table. + * @param hi The iteration state + * @return a pointer to the updated iteration state. NULL if there are no more + * entries. + */ +APR_DECLARE(apr_hash_index_t *) apr_hash_next(apr_hash_index_t *hi); + +/** + * Get the current entry's details from the iteration state. + * @param hi The iteration state + * @param key Return pointer for the pointer to the key. + * @param klen Return pointer for the key length. + * @param val Return pointer for the associated value. + * @remark The return pointers should point to a variable that will be set to the + * corresponding data, or they may be NULL if the data isn't interesting. + */ +APR_DECLARE(void) apr_hash_this(apr_hash_index_t *hi, const void **key, + apr_ssize_t *klen, void **val); + +/** + * Get the number of key/value pairs in the hash table. + * @param ht The hash table + * @return The number of key/value pairs in the hash table. + */ +APR_DECLARE(unsigned int) apr_hash_count(apr_hash_t *ht); + +/** + * Merge two hash tables into one new hash table. The values of the overlay + * hash override the values of the base if both have the same key. + * @param p The pool to use for the new hash table + * @param overlay The table to add to the initial table + * @param base The table that represents the initial values of the new table + * @return A new hash table containing all of the data from the two passed in + */ +APR_DECLARE(apr_hash_t *) apr_hash_overlay(apr_pool_t *p, + const apr_hash_t *overlay, + const apr_hash_t *base); + +/** + * Merge two hash tables into one new hash table. If the same key + * is present in both tables, call the supplied merge function to + * produce a merged value for the key in the new table. + * @param p The pool to use for the new hash table + * @param h1 The first of the tables to merge + * @param h2 The second of the tables to merge + * @param merger A callback function to merge values, or NULL to + * make values from h1 override values from h2 (same semantics as + * apr_hash_overlay()) + * @param data Client data to pass to the merger function + * @return A new hash table containing all of the data from the two passed in + */ +APR_DECLARE(apr_hash_t *) apr_hash_merge(apr_pool_t *p, + const apr_hash_t *h1, + const apr_hash_t *h2, + void * (*merger)(apr_pool_t *p, + const void *key, + apr_ssize_t klen, + const void *h1_val, + const void *h2_val, + const void *data), + const void *data); + +/** + * Get a pointer to the pool which the hash table was created in + */ +APR_POOL_DECLARE_ACCESSOR(hash); + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* !APR_HASH_H */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_inherit.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_inherit.h new file mode 100644 index 00000000..b7f7480f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_inherit.h @@ -0,0 +1,51 @@ +/* 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. + */ + +#ifndef APR_INHERIT_H +#define APR_INHERIT_H + +/** + * @file apr_inherit.h + * @brief APR File Handle Inheritance Helpers + * @remark This internal header includes internal declaration helpers + * for other headers to declare apr_foo_inherit_[un]set functions. + */ + +/** + * Prototype for type-specific declarations of apr_foo_inherit_set + * functions. + * @remark Doxygen unwraps this macro (via doxygen.conf) to provide + * actual help for each specific occurance of apr_foo_inherit_set. + * @remark the linkage is specified for APR. It would be possible to expand + * the macros to support other linkages. + */ +#define APR_DECLARE_INHERIT_SET(type) \ + APR_DECLARE(apr_status_t) apr_##type##_inherit_set( \ + apr_##type##_t *the##type) + +/** + * Prototype for type-specific declarations of apr_foo_inherit_unset + * functions. + * @remark Doxygen unwraps this macro (via doxygen.conf) to provide + * actual help for each specific occurance of apr_foo_inherit_unset. + * @remark the linkage is specified for APR. It would be possible to expand + * the macros to support other linkages. + */ +#define APR_DECLARE_INHERIT_UNSET(type) \ + APR_DECLARE(apr_status_t) apr_##type##_inherit_unset( \ + apr_##type##_t *the##type) + +#endif /* ! APR_INHERIT_H */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_lib.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_lib.h new file mode 100644 index 00000000..2d9ce534 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_lib.h @@ -0,0 +1,228 @@ +/* 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. + */ + +#ifndef APR_LIB_H +#define APR_LIB_H + +/** + * @file apr_lib.h + * This is collection of oddballs that didn't fit anywhere else, + * and might move to more appropriate headers with the release + * of APR 1.0. + * @brief APR general purpose library routines + */ + +#include "apr.h" +#include "apr_errno.h" + +#if APR_HAVE_CTYPE_H +#include +#endif +#if APR_HAVE_STDARG_H +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/** + * @defgroup apr_lib General Purpose Library Routines + * @ingroup APR + * This is collection of oddballs that didn't fit anywhere else, + * and might move to more appropriate headers with the release + * of APR 1.0. + * @{ + */ + +/** A constant representing a 'large' string. */ +#define HUGE_STRING_LEN 8192 + +/* + * Define the structures used by the APR general-purpose library. + */ + +/** @see apr_vformatter_buff_t */ +typedef struct apr_vformatter_buff_t apr_vformatter_buff_t; + +/** + * Structure used by the variable-formatter routines. + */ +struct apr_vformatter_buff_t { + /** The current position */ + char *curpos; + /** The end position of the format string */ + char *endpos; +}; + +/** + * return the final element of the pathname + * @param pathname The path to get the final element of + * @return the final element of the path + * @remark + *
    + * For example:
    + *                 "/foo/bar/gum"    -> "gum"
    + *                 "/foo/bar/gum/"   -> ""
    + *                 "gum"             -> "gum"
    + *                 "bs\\path\\stuff" -> "stuff"
    + * 
    + */ +APR_DECLARE(const char *) apr_filepath_name_get(const char *pathname); + +/** @deprecated @see apr_filepath_name_get */ +APR_DECLARE(const char *) apr_filename_of_pathname(const char *pathname); + +/** + * apr_killpg + * Small utility macros to make things easier to read. Not usually a + * goal, to be sure.. + */ + +#ifdef WIN32 +#define apr_killpg(x, y) +#else /* WIN32 */ +#ifdef NO_KILLPG +#define apr_killpg(x, y) (kill (-(x), (y))) +#else /* NO_KILLPG */ +#define apr_killpg(x, y) (killpg ((x), (y))) +#endif /* NO_KILLPG */ +#endif /* WIN32 */ + +/** + * apr_vformatter() is a generic printf-style formatting routine + * with some extensions. + * @param flush_func The function to call when the buffer is full + * @param c The buffer to write to + * @param fmt The format string + * @param ap The arguments to use to fill out the format string. + * + * @remark + *
    + * The extensions are:
    + *
    + * %%pA	takes a struct in_addr *, and prints it as a.b.c.d
    + * %%pI	takes an apr_sockaddr_t * and prints it as a.b.c.d:port or
    + *      [ipv6-address]:port
    + * %%pT takes an apr_os_thread_t * and prints it in decimal
    + *      ('0' is printed if !APR_HAS_THREADS)
    + * %%pp takes a void * and outputs it in hex
    + *
    + * The %%p hacks are to force gcc's printf warning code to skip
    + * over a pointer argument without complaining.  This does
    + * mean that the ANSI-style %%p (output a void * in hex format) won't
    + * work as expected at all, but that seems to be a fair trade-off
    + * for the increased robustness of having printf-warnings work.
    + *
    + * Additionally, apr_vformatter allows for arbitrary output methods
    + * using the apr_vformatter_buff and flush_func.
    + *
    + * The apr_vformatter_buff has two elements curpos and endpos.
    + * curpos is where apr_vformatter will write the next byte of output.
    + * It proceeds writing output to curpos, and updating curpos, until
    + * either the end of output is reached, or curpos == endpos (i.e. the
    + * buffer is full).
    + *
    + * If the end of output is reached, apr_vformatter returns the
    + * number of bytes written.
    + *
    + * When the buffer is full, the flush_func is called.  The flush_func
    + * can return -1 to indicate that no further output should be attempted,
    + * and apr_vformatter will return immediately with -1.  Otherwise
    + * the flush_func should flush the buffer in whatever manner is
    + * appropriate, re apr_pool_t nitialize curpos and endpos, and return 0.
    + *
    + * Note that flush_func is only invoked as a result of attempting to
    + * write another byte at curpos when curpos >= endpos.  So for
    + * example, it's possible when the output exactly matches the buffer
    + * space available that curpos == endpos will be true when
    + * apr_vformatter returns.
    + *
    + * apr_vformatter does not call out to any other code, it is entirely
    + * self-contained.  This allows the callers to do things which are
    + * otherwise "unsafe".  For example, apr_psprintf uses the "scratch"
    + * space at the unallocated end of a block, and doesn't actually
    + * complete the allocation until apr_vformatter returns.  apr_psprintf
    + * would be completely broken if apr_vformatter were to call anything
    + * that used this same pool.  Similarly http_bprintf() uses the "scratch"
    + * space at the end of its output buffer, and doesn't actually note
    + * that the space is in use until it either has to flush the buffer
    + * or until apr_vformatter returns.
    + * 
    + */ +APR_DECLARE(int) apr_vformatter(int (*flush_func)(apr_vformatter_buff_t *b), + apr_vformatter_buff_t *c, const char *fmt, + va_list ap); + +/** + * Display a prompt and read in the password from stdin. + * @param prompt The prompt to display + * @param pwbuf Buffer to store the password + * @param bufsize The length of the password buffer. + */ +APR_DECLARE(apr_status_t) apr_password_get(const char *prompt, char *pwbuf, + apr_size_t *bufsize); + +/** @} */ + +/** + * @defgroup apr_ctype ctype functions + * These macros allow correct support of 8-bit characters on systems which + * support 8-bit characters. Pretty dumb how the cast is required, but + * that's legacy libc for ya. These new macros do not support EOF like + * the standard macros do. Tough. + * @{ + */ +/** @see isalnum */ +#define apr_isalnum(c) (isalnum(((unsigned char)(c)))) +/** @see isalpha */ +#define apr_isalpha(c) (isalpha(((unsigned char)(c)))) +/** @see iscntrl */ +#define apr_iscntrl(c) (iscntrl(((unsigned char)(c)))) +/** @see isdigit */ +#define apr_isdigit(c) (isdigit(((unsigned char)(c)))) +/** @see isgraph */ +#define apr_isgraph(c) (isgraph(((unsigned char)(c)))) +/** @see islower*/ +#define apr_islower(c) (islower(((unsigned char)(c)))) +/** @see isascii */ +#ifdef isascii +#define apr_isascii(c) (isascii(((unsigned char)(c)))) +#else +#define apr_isascii(c) (((c) & ~0x7f)==0) +#endif +/** @see isprint */ +#define apr_isprint(c) (isprint(((unsigned char)(c)))) +/** @see ispunct */ +#define apr_ispunct(c) (ispunct(((unsigned char)(c)))) +/** @see isspace */ +#define apr_isspace(c) (isspace(((unsigned char)(c)))) +/** @see isupper */ +#define apr_isupper(c) (isupper(((unsigned char)(c)))) +/** @see isxdigit */ +#define apr_isxdigit(c) (isxdigit(((unsigned char)(c)))) +/** @see tolower */ +#define apr_tolower(c) (tolower(((unsigned char)(c)))) +/** @see toupper */ +#define apr_toupper(c) (toupper(((unsigned char)(c)))) + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* ! APR_LIB_H */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_mmap.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_mmap.h new file mode 100644 index 00000000..3070acca --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_mmap.h @@ -0,0 +1,193 @@ +/* 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. + */ + +#ifndef APR_MMAP_H +#define APR_MMAP_H + +/** + * @file apr_mmap.h + * @brief APR MMAP routines + */ + +#include "apr.h" +#include "apr_pools.h" +#include "apr_errno.h" +#include "apr_ring.h" +#include "apr_file_io.h" /* for apr_file_t */ + +#ifdef BEOS +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/** + * @defgroup apr_mmap MMAP (Memory Map) Routines + * @ingroup APR + * @{ + */ + +/** MMap opened for reading */ +#define APR_MMAP_READ 1 +/** MMap opened for writing */ +#define APR_MMAP_WRITE 2 + +/** @see apr_mmap_t */ +typedef struct apr_mmap_t apr_mmap_t; + +/** + * @remark + * As far as I can tell the only really sane way to store an MMAP is as a + * void * and a length. BeOS requires this area_id, but that's just a little + * something extra. I am exposing this type, because it doesn't make much + * sense to keep it private, and opening it up makes some stuff easier in + * Apache. + */ +/** The MMAP structure */ +struct apr_mmap_t { + /** The pool the mmap structure was allocated out of. */ + apr_pool_t *cntxt; +#ifdef BEOS + /** An area ID. Only valid on BeOS */ + area_id area; +#endif +#ifdef WIN32 + /** The handle of the file mapping */ + HANDLE mhandle; + /** The start of the real memory page area (mapped view) */ + void *mv; + /** The physical start, size and offset */ + apr_off_t pstart; + apr_size_t psize; + apr_off_t poffset; +#endif + /** The start of the memory mapped area */ + void *mm; + /** The amount of data in the mmap */ + apr_size_t size; + /** @deprecated this field is no longer used and will be removed + * in APR 1.0 */ + int unused; + /** ring of apr_mmap_t's that reference the same + * mmap'ed region; acts in place of a reference count */ + APR_RING_ENTRY(apr_mmap_t) link; +}; + +#if APR_HAS_MMAP || defined(DOXYGEN) + +/** @def APR_MMAP_THRESHOLD + * Files have to be at least this big before they're mmap()d. This is to deal + * with systems where the expense of doing an mmap() and an munmap() outweighs + * the benefit for small files. It shouldn't be set lower than 1. + */ +#ifdef MMAP_THRESHOLD +# define APR_MMAP_THRESHOLD MMAP_THRESHOLD +#else +# ifdef SUNOS4 +# define APR_MMAP_THRESHOLD (8*1024) +# else +# define APR_MMAP_THRESHOLD 1 +# endif /* SUNOS4 */ +#endif /* MMAP_THRESHOLD */ + +/** @def APR_MMAP_LIMIT + * Maximum size of MMap region + */ +#ifdef MMAP_LIMIT +# define APR_MMAP_LIMIT MMAP_LIMIT +#else +# define APR_MMAP_LIMIT (4*1024*1024) +#endif /* MMAP_LIMIT */ + +/** Can this file be MMaped */ +#define APR_MMAP_CANDIDATE(filelength) \ + ((filelength >= APR_MMAP_THRESHOLD) && (filelength < APR_MMAP_LIMIT)) + +/* Function definitions */ + +/** + * Create a new mmap'ed file out of an existing APR file. + * @param newmmap The newly created mmap'ed file. + * @param file The file turn into an mmap. + * @param offset The offset into the file to start the data pointer at. + * @param size The size of the file + * @param flag bit-wise or of: + *
    + *          APR_MMAP_READ       MMap opened for reading
    + *          APR_MMAP_WRITE      MMap opened for writing
    + * 
    + * @param cntxt The pool to use when creating the mmap. + */ +APR_DECLARE(apr_status_t) apr_mmap_create(apr_mmap_t **newmmap, + apr_file_t *file, apr_off_t offset, + apr_size_t size, apr_int32_t flag, + apr_pool_t *cntxt); + +/** + * Duplicate the specified MMAP. + * @param new_mmap The structure to duplicate into. + * @param old_mmap The mmap to duplicate. + * @param p The pool to use for new_mmap. + * @param transfer_ownership DEPRECATED: this param is now ignored + * and should be removed prior to APR 1.0 + */ +APR_DECLARE(apr_status_t) apr_mmap_dup(apr_mmap_t **new_mmap, + apr_mmap_t *old_mmap, + apr_pool_t *p, + int transfer_ownership); + +#if defined(DOXYGEN) +/** + * Transfer the specified MMAP to a different pool + * @param new_mmap The structure to duplicate into. + * @param old_mmap The file to transfer. + * @param p The pool to use for new_mmap. + * @deprecated Just use apr_mmap_dup(). The transfer_ownership flag will + * go away soon anyway. + */ +APR_DECLARE(apr_status_t) apr_mmap_setaside(apr_mmap_t **new_mmap, + apr_mmap_t *old_mmap, + apr_pool_t *p); +#else +#define apr_mmap_setaside(new_mmap, old_mmap, p) apr_mmap_dup(new_mmap, old_mmap, p, 1) +#endif /* DOXYGEN */ + +/** + * Remove a mmap'ed. + * @param mm The mmap'ed file. + */ +APR_DECLARE(apr_status_t) apr_mmap_delete(apr_mmap_t *mm); + +/** + * Move the pointer into the mmap'ed file to the specified offset. + * @param addr The pointer to the offset specified. + * @param mm The mmap'ed file. + * @param offset The offset to move to. + */ +APR_DECLARE(apr_status_t) apr_mmap_offset(void **addr, apr_mmap_t *mm, + apr_off_t offset); + +#endif /* APR_HAS_MMAP */ + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* ! APR_MMAP_H */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_network_io.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_network_io.h new file mode 100644 index 00000000..2bc6ef1e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_network_io.h @@ -0,0 +1,845 @@ +/* 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. + */ + +#ifndef APR_NETWORK_IO_H +#define APR_NETWORK_IO_H +/** + * @file apr_network_io.h + * @brief APR Network library + */ + +#include "apr.h" +#include "apr_pools.h" +#include "apr_file_io.h" +#include "apr_errno.h" +#include "apr_inherit.h" + +#if APR_HAVE_NETINET_IN_H +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/** + * @defgroup apr_network_io Network Routines + * @ingroup APR + * @{ + */ + +#ifndef APR_MAX_SECS_TO_LINGER +/** Maximum seconds to linger */ +#define APR_MAX_SECS_TO_LINGER 30 +#endif + +#ifndef MAX_SECS_TO_LINGER +/** @deprecated @see APR_MAX_SECS_TO_LINGER */ +#define MAX_SECS_TO_LINGER APR_MAX_SECS_TO_LINGER +#endif + +#ifndef APRMAXHOSTLEN +/** Maximum hostname length */ +#define APRMAXHOSTLEN 256 +#endif + +#ifndef APR_ANYADDR +/** Default 'any' address */ +#define APR_ANYADDR "0.0.0.0" +#endif + +/** + * @defgroup apr_sockopt Socket option definitions + * @{ + */ +#define APR_SO_LINGER 1 /**< Linger */ +#define APR_SO_KEEPALIVE 2 /**< Keepalive */ +#define APR_SO_DEBUG 4 /**< Debug */ +#define APR_SO_NONBLOCK 8 /**< Non-blocking IO */ +#define APR_SO_REUSEADDR 16 /**< Reuse addresses */ +#define APR_SO_TIMEOUT 32 /**< Timeout */ +#define APR_SO_SNDBUF 64 /**< Send buffer */ +#define APR_SO_RCVBUF 128 /**< Receive buffer */ +#define APR_SO_DISCONNECTED 256 /**< Disconnected */ +#define APR_TCP_NODELAY 512 /**< For SCTP sockets, this is mapped + * to STCP_NODELAY internally. + */ +#define APR_TCP_NOPUSH 1024 /**< No push */ +#define APR_RESET_NODELAY 2048 /**< This flag is ONLY set internally + * when we set APR_TCP_NOPUSH with + * APR_TCP_NODELAY set to tell us that + * APR_TCP_NODELAY should be turned on + * again when NOPUSH is turned off + */ +#define APR_INCOMPLETE_READ 4096 /**< Set on non-blocking sockets + * (timeout != 0) on which the + * previous read() did not fill a buffer + * completely. the next apr_socket_recv() + * will first call select()/poll() rather than + * going straight into read(). (Can also + * be set by an application to force a + * select()/poll() call before the next + * read, in cases where the app expects + * that an immediate read would fail.) + */ +#define APR_INCOMPLETE_WRITE 8192 /**< like APR_INCOMPLETE_READ, but for write + * @see APR_INCOMPLETE_READ + */ +#define APR_IPV6_V6ONLY 16384 /**< Don't accept IPv4 connections on an + * IPv6 listening socket. + */ + +/** @} */ + +/** Define what type of socket shutdown should occur. */ +typedef enum { + APR_SHUTDOWN_READ, /**< no longer allow read request */ + APR_SHUTDOWN_WRITE, /**< no longer allow write requests */ + APR_SHUTDOWN_READWRITE /**< no longer allow read or write requests */ +} apr_shutdown_how_e; + +#define APR_IPV4_ADDR_OK 0x01 /**< @see apr_sockaddr_info_get() */ +#define APR_IPV6_ADDR_OK 0x02 /**< @see apr_sockaddr_info_get() */ + +#if (!APR_HAVE_IN_ADDR) +/** + * We need to make sure we always have an in_addr type, so APR will just + * define it ourselves, if the platform doesn't provide it. + */ +struct in_addr { + apr_uint32_t s_addr; /**< storage to hold the IP# */ +}; +#endif + +/** + * @def APR_INET + * Not all platforms have these defined, so we'll define them here + * The default values come from FreeBSD 4.1.1 + */ +#define APR_INET AF_INET +/** @def APR_UNSPEC + * Let the system decide which address family to use + */ +#ifdef AF_UNSPEC +#define APR_UNSPEC AF_UNSPEC +#else +#define APR_UNSPEC 0 +#endif +#if APR_HAVE_IPV6 +#define APR_INET6 AF_INET6 +#endif + +/** + * @defgroup IP_Proto IP Protocol Definitions for use when creating sockets + * @{ + */ +#define APR_PROTO_TCP 6 /**< TCP */ +#define APR_PROTO_UDP 17 /**< UDP */ +#define APR_PROTO_SCTP 132 /**< SCTP */ +/** @} */ + +/** + * Enum to tell us if we're interested in remote or local socket + */ +typedef enum { + APR_LOCAL, + APR_REMOTE +} apr_interface_e; + +/** + * The specific declaration of inet_addr's ... some platforms fall back + * inet_network (this is not good, but necessary) + */ + +#if APR_HAVE_INET_ADDR +#define apr_inet_addr inet_addr +#elif APR_HAVE_INET_NETWORK /* only DGUX, as far as I know */ +/** + * @warning + * not generally safe... inet_network() and inet_addr() perform + * different functions */ +#define apr_inet_addr inet_network +#endif + +/** A structure to represent sockets */ +typedef struct apr_socket_t apr_socket_t; +/** + * A structure to encapsulate headers and trailers for apr_socket_sendfile + */ +typedef struct apr_hdtr_t apr_hdtr_t; +/** A structure to represent in_addr */ +typedef struct in_addr apr_in_addr_t; +/** A structure to represent an IP subnet */ +typedef struct apr_ipsubnet_t apr_ipsubnet_t; + +/** @remark use apr_uint16_t just in case some system has a short that isn't 16 bits... */ +typedef apr_uint16_t apr_port_t; + +/** @remark It's defined here as I think it should all be platform safe... + * @see apr_sockaddr_t + */ +typedef struct apr_sockaddr_t apr_sockaddr_t; +/** + * APRs socket address type, used to ensure protocol independence + */ +struct apr_sockaddr_t { + /** The pool to use... */ + apr_pool_t *pool; + /** The hostname */ + char *hostname; + /** Either a string of the port number or the service name for the port */ + char *servname; + /** The numeric port */ + apr_port_t port; + /** The family */ + apr_int32_t family; + /** Union of either IPv4 or IPv6 sockaddr. */ + union { + /** IPv4 sockaddr structure */ + struct sockaddr_in sin; +#if APR_HAVE_IPV6 + /** IPv6 sockaddr structure */ + struct sockaddr_in6 sin6; +#endif + } sa; + /** How big is the sockaddr we're using? */ + apr_socklen_t salen; + /** How big is the ip address structure we're using? */ + int ipaddr_len; + /** How big should the address buffer be? 16 for v4 or 46 for v6 + * used in inet_ntop... */ + int addr_str_len; + /** This points to the IP address structure within the appropriate + * sockaddr structure. */ + void *ipaddr_ptr; + /** If multiple addresses were found by apr_sockaddr_info_get(), this + * points to a representation of the next address. */ + apr_sockaddr_t *next; +}; + +#if APR_HAS_SENDFILE +/** + * Support reusing the socket on platforms which support it (from disconnect, + * specifically Win32. + * @remark Optional flag passed into apr_socket_sendfile() + */ +#define APR_SENDFILE_DISCONNECT_SOCKET 1 +#endif + +/** A structure to encapsulate headers and trailers for apr_socket_sendfile */ +struct apr_hdtr_t { + /** An iovec to store the headers sent before the file. */ + struct iovec* headers; + /** number of headers in the iovec */ + int numheaders; + /** An iovec to store the trailers sent after the file. */ + struct iovec* trailers; + /** number of trailers in the iovec */ + int numtrailers; +}; + +/* function definitions */ + +/** + * Create a socket. + * @remark With APR 1.0, this function follows the prototype + * of apr_socket_create_ex. + * @param new_sock The new socket that has been set up. + * @param family The address family of the socket (e.g., APR_INET). + * @param type The type of the socket (e.g., SOCK_STREAM). + * @param cont The pool to use + */ +APR_DECLARE(apr_status_t) apr_socket_create(apr_socket_t **new_sock, + int family, int type, + apr_pool_t *cont); + +/** + * Create a socket. + * @remark With APR 1.0, this function is deprecated and apr_socket_create + * follows this prototype. + * @param new_sock The new socket that has been set up. + * @param family The address family of the socket (e.g., APR_INET). + * @param type The type of the socket (e.g., SOCK_STREAM). + * @param protocol The protocol of the socket (e.g., APR_PROTO_TCP). + * @param cont The pool to use + */ +APR_DECLARE(apr_status_t) apr_socket_create_ex(apr_socket_t **new_sock, + int family, int type, + int protocol, + apr_pool_t *cont); + +/** + * Shutdown either reading, writing, or both sides of a socket. + * @param thesocket The socket to close + * @param how How to shutdown the socket. One of: + *
    + *            APR_SHUTDOWN_READ         no longer allow read requests
    + *            APR_SHUTDOWN_WRITE        no longer allow write requests
    + *            APR_SHUTDOWN_READWRITE    no longer allow read or write requests 
    + * 
    + * @see apr_shutdown_how_e + * @remark This does not actually close the socket descriptor, it just + * controls which calls are still valid on the socket. + */ +APR_DECLARE(apr_status_t) apr_socket_shutdown(apr_socket_t *thesocket, + apr_shutdown_how_e how); + +/** @deprecated @see apr_socket_shutdown */ +APR_DECLARE(apr_status_t) apr_shutdown(apr_socket_t *thesocket, + apr_shutdown_how_e how); + +/** + * Close a socket. + * @param thesocket The socket to close + */ +APR_DECLARE(apr_status_t) apr_socket_close(apr_socket_t *thesocket); + +/** + * Bind the socket to its associated port + * @param sock The socket to bind + * @param sa The socket address to bind to + * @remark This may be where we will find out if there is any other process + * using the selected port. + */ +APR_DECLARE(apr_status_t) apr_socket_bind(apr_socket_t *sock, + apr_sockaddr_t *sa); + +/** @deprecated @see apr_socket_bind */ +APR_DECLARE(apr_status_t) apr_bind(apr_socket_t *sock, apr_sockaddr_t *sa); + +/** + * Listen to a bound socket for connections. + * @param sock The socket to listen on + * @param backlog The number of outstanding connections allowed in the sockets + * listen queue. If this value is less than zero, the listen + * queue size is set to zero. + */ +APR_DECLARE(apr_status_t) apr_socket_listen(apr_socket_t *sock, + apr_int32_t backlog); + +/** @deprecated @see apr_socket_listen */ +APR_DECLARE(apr_status_t) apr_listen(apr_socket_t *sock, apr_int32_t backlog); + +/** + * Accept a new connection request + * @param new_sock A copy of the socket that is connected to the socket that + * made the connection request. This is the socket which should + * be used for all future communication. + * @param sock The socket we are listening on. + * @param connection_pool The pool for the new socket. + */ +APR_DECLARE(apr_status_t) apr_socket_accept(apr_socket_t **new_sock, + apr_socket_t *sock, + apr_pool_t *connection_pool); + +/** @deprecated @see apr_socket_accept */ +APR_DECLARE(apr_status_t) apr_accept(apr_socket_t **new_sock, + apr_socket_t *sock, + apr_pool_t *connection_pool); + +/** + * Issue a connection request to a socket either on the same machine + * or a different one. + * @param sock The socket we wish to use for our side of the connection + * @param sa The address of the machine we wish to connect to. If NULL, + * APR assumes that the sockaddr_in in the apr_socket is + * completely filled out. + */ +APR_DECLARE(apr_status_t) apr_socket_connect(apr_socket_t *sock, + apr_sockaddr_t *sa); + +/** @deprecated @see apr_socket_connect */ +APR_DECLARE(apr_status_t) apr_connect(apr_socket_t *sock, apr_sockaddr_t *sa); + +/** + * Create apr_sockaddr_t from hostname, address family, and port. + * @param sa The new apr_sockaddr_t. + * @param hostname The hostname or numeric address string to resolve/parse, or + * NULL to build an address that corresponds to 0.0.0.0 or :: + * @param family The address family to use, or APR_UNSPEC if the system should + * decide. + * @param port The port number. + * @param flags Special processing flags: + *
    + *       APR_IPV4_ADDR_OK          first query for IPv4 addresses; only look
    + *                                 for IPv6 addresses if the first query failed;
    + *                                 only valid if family is APR_UNSPEC and hostname
    + *                                 isn't NULL; mutually exclusive with
    + *                                 APR_IPV6_ADDR_OK
    + *       APR_IPV6_ADDR_OK          first query for IPv6 addresses; only look
    + *                                 for IPv4 addresses if the first query failed;
    + *                                 only valid if family is APR_UNSPEC and hostname
    + *                                 isn't NULL and APR_HAVE_IPV6; mutually exclusive
    + *                                 with APR_IPV4_ADDR_OK
    + * 
    + * @param p The pool for the apr_sockaddr_t and associated storage. + */ +APR_DECLARE(apr_status_t) apr_sockaddr_info_get(apr_sockaddr_t **sa, + const char *hostname, + apr_int32_t family, + apr_port_t port, + apr_int32_t flags, + apr_pool_t *p); + +/** + * Look up the host name from an apr_sockaddr_t. + * @param hostname The hostname. + * @param sa The apr_sockaddr_t. + * @param flags Special processing flags. + */ +APR_DECLARE(apr_status_t) apr_getnameinfo(char **hostname, + apr_sockaddr_t *sa, + apr_int32_t flags); + +/** + * Parse hostname/IP address with scope id and port. + * + * Any of the following strings are accepted: + * 8080 (just the port number) + * www.apache.org (just the hostname) + * www.apache.org:8080 (hostname and port number) + * [fe80::1]:80 (IPv6 numeric address string only) + * [fe80::1%eth0] (IPv6 numeric address string and scope id) + * + * Invalid strings: + * (empty string) + * [abc] (not valid IPv6 numeric address string) + * abc:65536 (invalid port number) + * + * @param addr The new buffer containing just the hostname. On output, *addr + * will be NULL if no hostname/IP address was specfied. + * @param scope_id The new buffer containing just the scope id. On output, + * *scope_id will be NULL if no scope id was specified. + * @param port The port number. On output, *port will be 0 if no port was + * specified. + * ### FIXME: 0 is a legal port (per RFC 1700). this should + * ### return something besides zero if the port is missing. + * @param str The input string to be parsed. + * @param p The pool from which *addr and *scope_id are allocated. + * @remark If scope id shouldn't be allowed, check for scope_id != NULL in + * addition to checking the return code. If addr/hostname should be + * required, check for addr == NULL in addition to checking the + * return code. + */ +APR_DECLARE(apr_status_t) apr_parse_addr_port(char **addr, + char **scope_id, + apr_port_t *port, + const char *str, + apr_pool_t *p); + +/** + * Get name of the current machine + * @param buf A buffer to store the hostname in. + * @param len The maximum length of the hostname that can be stored in the + * buffer provided. The suggested length is APRMAXHOSTLEN + 1. + * @param cont The pool to use. + * @remark If the buffer was not large enough, an error will be returned. + */ +APR_DECLARE(apr_status_t) apr_gethostname(char *buf, int len, apr_pool_t *cont); + +/** + * Return the data associated with the current socket + * @param data The user data associated with the socket. + * @param key The key to associate with the user data. + * @param sock The currently open socket. + */ +APR_DECLARE(apr_status_t) apr_socket_data_get(void **data, const char *key, + apr_socket_t *sock); + +/** + * Set the data associated with the current socket. + * @param sock The currently open socket. + * @param data The user data to associate with the socket. + * @param key The key to associate with the data. + * @param cleanup The cleanup to call when the socket is destroyed. + */ +APR_DECLARE(apr_status_t) apr_socket_data_set(apr_socket_t *sock, void *data, + const char *key, + apr_status_t (*cleanup)(void*)); + +/** + * Send data over a network. + * @param sock The socket to send the data over. + * @param buf The buffer which contains the data to be sent. + * @param len On entry, the number of bytes to send; on exit, the number + * of bytes sent. + * @remark + *
    + * This functions acts like a blocking write by default.  To change 
    + * this behavior, use apr_socket_timeout_set().
    + *
    + * It is possible for both bytes to be sent and an error to be returned.
    + *
    + * APR_EINTR is never returned.
    + * 
    + */ +APR_DECLARE(apr_status_t) apr_socket_send(apr_socket_t *sock, const char *buf, + apr_size_t *len); + +/** @deprecated @see apr_socket_send */ +APR_DECLARE(apr_status_t) apr_send(apr_socket_t *sock, const char *buf, + apr_size_t *len); + +/** + * Send multiple packets of data over a network. + * @param sock The socket to send the data over. + * @param vec The array of iovec structs containing the data to send + * @param nvec The number of iovec structs in the array + * @param len Receives the number of bytes actually written + * @remark + *
    + * This functions acts like a blocking write by default.  To change 
    + * this behavior, use apr_socket_timeout_set().
    + * The number of bytes actually sent is stored in argument 3.
    + *
    + * It is possible for both bytes to be sent and an error to be returned.
    + *
    + * APR_EINTR is never returned.
    + * 
    + */ +APR_DECLARE(apr_status_t) apr_socket_sendv(apr_socket_t *sock, + const struct iovec *vec, + apr_int32_t nvec, apr_size_t *len); + +/** @deprecated @see apr_socket_sendv */ +APR_DECLARE(apr_status_t) apr_sendv(apr_socket_t *sock, + const struct iovec *vec, + apr_int32_t nvec, apr_size_t *len); + +/** + * @param sock The socket to send from + * @param where The apr_sockaddr_t describing where to send the data + * @param flags The flags to use + * @param buf The data to send + * @param len The length of the data to send + */ +APR_DECLARE(apr_status_t) apr_socket_sendto(apr_socket_t *sock, + apr_sockaddr_t *where, + apr_int32_t flags, const char *buf, + apr_size_t *len); + +/** @deprecated @see apr_socket_sendto */ +APR_DECLARE(apr_status_t) apr_sendto(apr_socket_t *sock, apr_sockaddr_t *where, + apr_int32_t flags, const char *buf, + apr_size_t *len); + +/** + * @param from The apr_sockaddr_t to fill in the recipient info + * @param sock The socket to use + * @param flags The flags to use + * @param buf The buffer to use + * @param len The length of the available buffer + */ + +APR_DECLARE(apr_status_t) apr_socket_recvfrom(apr_sockaddr_t *from, + apr_socket_t *sock, + apr_int32_t flags, char *buf, + apr_size_t *len); + +/** @deprecated @see apr_socket_recvfrom */ +APR_DECLARE(apr_status_t) apr_recvfrom(apr_sockaddr_t *from, apr_socket_t *sock, + apr_int32_t flags, char *buf, + apr_size_t *len); + +#if APR_HAS_SENDFILE || defined(DOXYGEN) + +/** + * Send a file from an open file descriptor to a socket, along with + * optional headers and trailers + * @param sock The socket to which we're writing + * @param file The open file from which to read + * @param hdtr A structure containing the headers and trailers to send + * @param offset Offset into the file where we should begin writing + * @param len (input) - Number of bytes to send from the file + * (output) - Number of bytes actually sent, + * including headers, file, and trailers + * @param flags APR flags that are mapped to OS specific flags + * @remark This functions acts like a blocking write by default. To change + * this behavior, use apr_socket_timeout_set(). + * The number of bytes actually sent is stored in argument 5. + */ +APR_DECLARE(apr_status_t) apr_socket_sendfile(apr_socket_t *sock, + apr_file_t *file, + apr_hdtr_t *hdtr, + apr_off_t *offset, + apr_size_t *len, + apr_int32_t flags); + +/** @deprecated @see apr_socket_sendfile */ +APR_DECLARE(apr_status_t) apr_sendfile(apr_socket_t *sock, apr_file_t *file, + apr_hdtr_t *hdtr, apr_off_t *offset, + apr_size_t *len, apr_int32_t flags); + +#endif /* APR_HAS_SENDFILE */ + +/** + * Read data from a network. + * @param sock The socket to read the data from. + * @param buf The buffer to store the data in. + * @param len On entry, the number of bytes to receive; on exit, the number + * of bytes received. + * @remark + *
    + * This functions acts like a blocking read by default.  To change 
    + * this behavior, use apr_socket_timeout_set().
    + * The number of bytes actually sent is stored in argument 3.
    + *
    + * It is possible for both bytes to be received and an APR_EOF or
    + * other error to be returned.
    + *
    + * APR_EINTR is never returned.
    + * 
    + */ +APR_DECLARE(apr_status_t) apr_socket_recv(apr_socket_t *sock, + char *buf, apr_size_t *len); + +/** @deprecated @see apr_socket_recv */ +APR_DECLARE(apr_status_t) apr_recv(apr_socket_t *sock, + char *buf, apr_size_t *len); + +/** + * Setup socket options for the specified socket + * @param sock The socket to set up. + * @param opt The option we would like to configure. One of: + *
    + *            APR_SO_DEBUG      --  turn on debugging information 
    + *            APR_SO_KEEPALIVE  --  keep connections active
    + *            APR_SO_LINGER     --  lingers on close if data is present
    + *            APR_SO_NONBLOCK   --  Turns blocking on/off for socket
    + *            APR_SO_REUSEADDR  --  The rules used in validating addresses
    + *                                  supplied to bind should allow reuse
    + *                                  of local addresses.
    + *            APR_SO_SNDBUF     --  Set the SendBufferSize
    + *            APR_SO_RCVBUF     --  Set the ReceiveBufferSize
    + * 
    + * @param on Value for the option. + */ +APR_DECLARE(apr_status_t) apr_socket_opt_set(apr_socket_t *sock, + apr_int32_t opt, apr_int32_t on); + +/** @deprecated @see apr_socket_opt_set */ +APR_DECLARE(apr_status_t) apr_setsocketopt(apr_socket_t *sock, + apr_int32_t opt, apr_int32_t on); + +/** + * Setup socket timeout for the specified socket + * @param sock The socket to set up. + * @param t Value for the timeout. + *
    + *   t > 0  -- read and write calls return APR_TIMEUP if specified time
    + *             elapsess with no data read or written
    + *   t == 0 -- read and write calls never block
    + *   t < 0  -- read and write calls block
    + * 
    + */ +APR_DECLARE(apr_status_t) apr_socket_timeout_set(apr_socket_t *sock, + apr_interval_time_t t); + +/** + * Query socket options for the specified socket + * @param sock The socket to query + * @param opt The option we would like to query. One of: + *
    + *            APR_SO_DEBUG      --  turn on debugging information 
    + *            APR_SO_KEEPALIVE  --  keep connections active
    + *            APR_SO_LINGER     --  lingers on close if data is present
    + *            APR_SO_NONBLOCK   --  Turns blocking on/off for socket
    + *            APR_SO_REUSEADDR  --  The rules used in validating addresses
    + *                                  supplied to bind should allow reuse
    + *                                  of local addresses.
    + *            APR_SO_SNDBUF     --  Set the SendBufferSize
    + *            APR_SO_RCVBUF     --  Set the ReceiveBufferSize
    + *            APR_SO_DISCONNECTED -- Query the disconnected state of the socket.
    + *                                  (Currently only used on Windows)
    + * 
    + * @param on Socket option returned on the call. + */ +APR_DECLARE(apr_status_t) apr_socket_opt_get(apr_socket_t *sock, + apr_int32_t opt, apr_int32_t *on); + +/** @deprecated @see apr_socket_opt_set */ +APR_DECLARE(apr_status_t) apr_getsocketopt(apr_socket_t *sock, + apr_int32_t opt, apr_int32_t *on); + +/** + * Query socket timeout for the specified socket + * @param sock The socket to query + * @param t Socket timeout returned from the query. + */ +APR_DECLARE(apr_status_t) apr_socket_timeout_get(apr_socket_t *sock, + apr_interval_time_t *t); + +/** + * Query the specified socket if at the OOB/Urgent data mark + * @param sock The socket to query + * @param atmark Is set to true if socket is at the OOB/urgent mark, + * otherwise is set to false. + */ +APR_DECLARE(apr_status_t) apr_socket_atmark(apr_socket_t *sock, + int *atmark); + +/** + * Return an apr_sockaddr_t from an apr_socket_t + * @param sa The returned apr_sockaddr_t. + * @param which Which interface do we want the apr_sockaddr_t for? + * @param sock The socket to use + */ +APR_DECLARE(apr_status_t) apr_socket_addr_get(apr_sockaddr_t **sa, + apr_interface_e which, + apr_socket_t *sock); + +/** + * Set the port in an APR socket address. + * @param sockaddr The socket address to set. + * @param port The port to be stored in the socket address. + * @deprecated @see apr_sockaddr_info_get + */ +APR_DECLARE(apr_status_t) apr_sockaddr_port_set(apr_sockaddr_t *sockaddr, + apr_port_t port); + +/** + * Return the port in an APR socket address. + * @param port The port from the socket address. + * @param sockaddr The socket address to reference. + * @deprecated Access port field directly. + */ +APR_DECLARE(apr_status_t) apr_sockaddr_port_get(apr_port_t *port, + apr_sockaddr_t *sockaddr); + +/** + * Set the IP address in an APR socket address. + * @param sockaddr The socket address to use + * @param addr The IP address to attach to the socket. + * Use APR_ANYADDR to use any IP addr on the machine. + * @deprecated @see apr_sockaddr_info_get + */ +APR_DECLARE(apr_status_t) apr_sockaddr_ip_set(apr_sockaddr_t *sockaddr, + const char *addr); + +/** + * Return the IP address (in numeric address string format) in + * an APR socket address. APR will allocate storage for the IP address + * string from the pool of the apr_sockaddr_t. + * @param addr The IP address. + * @param sockaddr The socket address to reference. + */ +APR_DECLARE(apr_status_t) apr_sockaddr_ip_get(char **addr, + apr_sockaddr_t *sockaddr); + +/** + * See if the IP addresses in two APR socket addresses are + * equivalent. Appropriate logic is present for comparing + * IPv4-mapped IPv6 addresses with IPv4 addresses. + * + * @param addr1 One of the APR socket addresses. + * @param addr2 The other APR socket address. + * @remark The return value will be non-zero if the addresses + * are equivalent. + */ +APR_DECLARE(int) apr_sockaddr_equal(const apr_sockaddr_t *addr1, + const apr_sockaddr_t *addr2); + + +#if APR_FILES_AS_SOCKETS || defined(DOXYGEN) + +/** + * Convert a File type to a socket so that it can be used in a poll operation. + * @param newsock the newly created socket which represents a file. + * @param file the file to mask as a socket. + * @warning This is not available on all platforms. Platforms that have the + * ability to poll files for data to be read/written/exceptions will + * have the APR_FILES_AS_SOCKETS macro defined as true. + * @deprecated This function has been deprecated, because of the new poll + * implementation. + */ +APR_DECLARE(apr_status_t) apr_socket_from_file(apr_socket_t **newsock, + apr_file_t *file); + +#endif /* APR_FILES_AS_SOCKETS */ + +/** + * Given an apr_sockaddr_t and a service name, set the port for the service + * @param sockaddr The apr_sockaddr_t that will have its port set + * @param servname The name of the service you wish to use + */ +APR_DECLARE(apr_status_t) apr_getservbyname(apr_sockaddr_t *sockaddr, + const char *servname); +/** + * Build an ip-subnet representation from an IP address and optional netmask or + * number-of-bits. + * @param ipsub The new ip-subnet representation + * @param ipstr The input IP address string + * @param mask_or_numbits The input netmask or number-of-bits string, or NULL + * @param p The pool to allocate from + */ +APR_DECLARE(apr_status_t) apr_ipsubnet_create(apr_ipsubnet_t **ipsub, + const char *ipstr, + const char *mask_or_numbits, + apr_pool_t *p); + +/** + * Test the IP address in an apr_sockaddr_t against a pre-built ip-subnet + * representation. + * @param ipsub The ip-subnet representation + * @param sa The socket address to test + * @return non-zero if the socket address is within the subnet, 0 otherwise + */ +APR_DECLARE(int) apr_ipsubnet_test(apr_ipsubnet_t *ipsub, apr_sockaddr_t *sa); + +#if APR_HAS_SO_ACCEPTFILTER || defined(DOXYGEN) +/** + * Set an OS level accept filter. + * @param sock The socket to put the accept filter on. + * @param name The accept filter + * @param args Any extra args to the accept filter. Passing NULL here removes + * the accept filter. + */ +apr_status_t apr_socket_accept_filter(apr_socket_t *sock, char *name, + char *args); +#endif + +/** + * Return the protocol of the socket. + * @param sock The socket to query. + * @param protocol The returned protocol (e.g., APR_PROTO_TCP). + */ +APR_DECLARE(apr_status_t) apr_socket_protocol_get(apr_socket_t *sock, + int *protocol); + +/** + * Set a socket to be inherited by child processes. + */ +APR_DECLARE_INHERIT_SET(socket); + +/** @deprecated @see apr_socket_inherit_set */ +APR_DECLARE(void) apr_socket_set_inherit(apr_socket_t *skt); + +/** + * Unset a socket from being inherited by child processes. + */ +APR_DECLARE_INHERIT_UNSET(socket); + +/** @deprecated @see apr_socket_inherit_unset */ +APR_DECLARE(void) apr_socket_unset_inherit(apr_socket_t *skt); + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* ! APR_NETWORK_IO_H */ + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_poll.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_poll.h new file mode 100644 index 00000000..d71cc3a1 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_poll.h @@ -0,0 +1,253 @@ +/* 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. + */ + +#ifndef APR_POLL_H +#define APR_POLL_H +/** + * @file apr_poll.h + * @brief APR Poll interface + */ +#include "apr.h" +#include "apr_pools.h" +#include "apr_errno.h" +#include "apr_inherit.h" +#include "apr_file_io.h" +#include "apr_network_io.h" + +#if APR_HAVE_NETINET_IN_H +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/** + * @defgroup apr_poll Poll Routines + * @ingroup APR + * @{ + */ + +/** + * @defgroup apr_poll_opt Poll options + * @{ + */ +#define APR_POLLIN 0x001 /**< Can read without blocking */ +#define APR_POLLPRI 0x002 /**< Priority data available */ +#define APR_POLLOUT 0x004 /**< Can write without blocking */ +#define APR_POLLERR 0x010 /**< Pending error */ +#define APR_POLLHUP 0x020 /**< Hangup occurred */ +#define APR_POLLNVAL 0x040 /**< Descriptior invalid */ +/** @} */ + +/** Used in apr_pollfd_t to determine what the apr_descriptor is */ +typedef enum { + APR_NO_DESC, /**< nothing here */ + APR_POLL_SOCKET, /**< descriptor refers to a socket */ + APR_POLL_FILE, /**< descriptor refers to a file */ + APR_POLL_LASTDESC /**< descriptor is the last one in the list */ +} apr_datatype_e ; + +/** Union of either an APR file or socket. */ +typedef union { + apr_file_t *f; /**< file */ + apr_socket_t *s; /**< socket */ +} apr_descriptor; + +/** @see apr_pollfd_t */ +typedef struct apr_pollfd_t apr_pollfd_t; + +/** Poll descriptor set. */ +struct apr_pollfd_t { + apr_pool_t *p; /**< associated pool */ + apr_datatype_e desc_type; /**< descriptor type */ + apr_int16_t reqevents; /**< requested events */ + apr_int16_t rtnevents; /**< returned events */ + apr_descriptor desc; /**< @see apr_descriptor */ + void *client_data; /**< allows app to associate context */ +}; + +/** + * Setup the memory required for poll to operate properly + * @param new_poll The poll structure to be used. + * @param num The number of socket descriptors to be polled. + * @param cont The pool to operate on. + * @deprecated This function is deprecated, APR applications should control the pollset memory themselves. + */ +APR_DECLARE(apr_status_t) apr_poll_setup(apr_pollfd_t **new_poll, + apr_int32_t num, + apr_pool_t *cont); + +/** + * Poll the sockets in the poll structure + * @param aprset The poll structure we will be using. + * @param numsock The number of sockets we are polling + * @param nsds The number of sockets signalled. + * @param timeout The amount of time in microseconds to wait. This is + * a maximum, not a minimum. If a socket is signalled, we + * will wake up before this time. A negative number means + * wait until a socket is signalled. + * @remark + *
    + * The number of sockets signalled is returned in the second argument. 
    + *
    + *        This is a blocking call, and it will not return until either a 
    + *        socket has been signalled, or the timeout has expired. 
    + * 
    + */ +APR_DECLARE(apr_status_t) apr_poll(apr_pollfd_t *aprset, apr_int32_t numsock, + apr_int32_t *nsds, + apr_interval_time_t timeout); + +/** + * Add a socket to the poll structure. + * @param aprset The poll structure we will be using. + * @param sock The socket to add to the current poll structure. + * @param event The events to look for when we do the poll. One of: + *
    + *            APR_POLLIN       signal if read will not block
    + *            APR_POLLPRI      signal if prioirty data is availble to be read
    + *            APR_POLLOUT      signal if write will not block
    + * 
    + * @deprecated This function is deprecated, APR applications should control the pollset memory themselves. + */ +APR_DECLARE(apr_status_t) apr_poll_socket_add(apr_pollfd_t *aprset, + apr_socket_t *sock, + apr_int16_t event); + +/** + * Modify a socket in the poll structure with mask. + * @param aprset The poll structure we will be using. + * @param sock The socket to modify in poll structure. + * @param events The events to stop looking for during the poll. One of: + *
    + *            APR_POLLIN       signal if read will not block
    + *            APR_POLLPRI      signal if priority data is available to be read
    + *            APR_POLLOUT      signal if write will not block
    + * 
    + * @deprecated This function is deprecated, APR applications should control the pollset memory themselves. + */ +APR_DECLARE(apr_status_t) apr_poll_socket_mask(apr_pollfd_t *aprset, + apr_socket_t *sock, + apr_int16_t events); +/** + * Remove a socket from the poll structure. + * @param aprset The poll structure we will be using. + * @param sock The socket to remove from the current poll structure. + * @deprecated This function is deprecated, APR applications should control the pollset memory themselves. + */ +APR_DECLARE(apr_status_t) apr_poll_socket_remove(apr_pollfd_t *aprset, + apr_socket_t *sock); + +/** + * Clear all events in the poll structure. + * @param aprset The poll structure we will be using. + * @param events The events to clear from all sockets. One of: + *
    + *            APR_POLLIN       signal if read will not block
    + *            APR_POLLPRI      signal if priority data is available to be read
    + *            APR_POLLOUT      signal if write will not block
    + * 
    + * @deprecated This function is deprecated, APR applications should control the pollset memory themselves. + */ +APR_DECLARE(apr_status_t) apr_poll_socket_clear(apr_pollfd_t *aprset, + apr_int16_t events); + +/** + * Get the return events for the specified socket. + * @param event The returned events for the socket. One of: + *
    + *            APR_POLLIN       Data is available to be read 
    + *            APR_POLLPRI      Priority data is availble to be read
    + *            APR_POLLOUT      Write will succeed
    + *            APR_POLLERR      An error occurred on the socket
    + *            APR_POLLHUP      The connection has been terminated
    + *            APR_POLLNVAL     This is an invalid socket to poll on.
    + *                             Socket not open.
    + * 
    + * @param sock The socket we wish to get information about. + * @param aprset The poll structure we will be using. + * @deprecated This function is deprecated, APR applications should control the pollset memory themselves. + */ +APR_DECLARE(apr_status_t) apr_poll_revents_get(apr_int16_t *event, + apr_socket_t *sock, + apr_pollfd_t *aprset); + +/* General-purpose poll API for arbitrarily large numbers of + * file descriptors + */ + +/** Opaque structure used for pollset API */ +typedef struct apr_pollset_t apr_pollset_t; + +/** + * Setup a pollset object + * @param pollset The pointer in which to return the newly created object + * @param size The maximum number of descriptors that this pollset can hold + * @param p The pool from which to allocate the pollset + * @param flags Optional flags to modify the operation of the pollset + * (reserved for future expansion) + */ +APR_DECLARE(apr_status_t) apr_pollset_create(apr_pollset_t **pollset, + apr_uint32_t size, + apr_pool_t *p, + apr_uint32_t flags); + +/** + * Destroy a pollset object + * @param pollset The pollset to destroy + */ +APR_DECLARE(apr_status_t) apr_pollset_destroy(apr_pollset_t *pollset); + +/** + * Add a socket or file descriptor to a pollset + * @param pollset The pollset to which to add the descriptor + * @param descriptor The descriptor to add + * @remark If you set client_data in the descriptor, that value + * will be returned in the client_data field whenever this + * descriptor is signalled in apr_pollset_poll(). + */ +APR_DECLARE(apr_status_t) apr_pollset_add(apr_pollset_t *pollset, + const apr_pollfd_t *descriptor); + +/** + * Remove a descriptor from a pollset + * @param pollset The pollset from which to remove the descriptor + * @param descriptor The descriptor to remove + */ +APR_DECLARE(apr_status_t) apr_pollset_remove(apr_pollset_t *pollset, + const apr_pollfd_t *descriptor); + +/** + * Block for activity on the descriptor(s) in a pollset + * @param pollset The pollset to use + * @param timeout Timeout in microseconds + * @param num Number of signalled descriptors (output parameter) + * @param descriptors Array of signalled descriptors (output parameter) + */ +APR_DECLARE(apr_status_t) apr_pollset_poll(apr_pollset_t *pollset, + apr_interval_time_t timeout, + apr_int32_t *num, + const apr_pollfd_t **descriptors); + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* ! APR_POLL_H */ + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_pools.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_pools.h new file mode 100644 index 00000000..2f4353f0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_pools.h @@ -0,0 +1,664 @@ +/* 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. + */ + +#ifndef APR_POOLS_H +#define APR_POOLS_H + +/** + * @file apr_pools.h + * @brief APR memory allocation + * + * Resource allocation routines... + * + * designed so that we don't have to keep track of EVERYTHING so that + * it can be explicitly freed later (a fundamentally unsound strategy --- + * particularly in the presence of die()). + * + * Instead, we maintain pools, and allocate items (both memory and I/O + * handlers) from the pools --- currently there are two, one for per + * transaction info, and one for config info. When a transaction is over, + * we can delete everything in the per-transaction apr_pool_t without fear, + * and without thinking too hard about it either. + */ + +#include "apr.h" +#include "apr_errno.h" +#include "apr_general.h" /* for APR_STRINGIFY */ +#define APR_WANT_MEMFUNC /**< for no good reason? */ +#include "apr_want.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup apr_pools Memory Pool Functions + * @ingroup APR + * @{ + */ + +/** The fundamental pool type */ +typedef struct apr_pool_t apr_pool_t; + + +/** + * Declaration helper macro to construct apr_foo_pool_get()s. + * + * This standardized macro is used by opaque (APR) data types to return + * the apr_pool_t that is associated with the data type. + * + * APR_POOL_DECLARE_ACCESSOR() is used in a header file to declare the + * accessor function. A typical usage and result would be: + *
    + *    APR_POOL_DECLARE_ACCESSOR(file);
    + * becomes:
    + *    APR_DECLARE(apr_pool_t *) apr_file_pool_get(apr_file_t *ob);
    + * 
    + * @remark Doxygen unwraps this macro (via doxygen.conf) to provide + * actual help for each specific occurance of apr_foo_pool_get. + * @remark the linkage is specified for APR. It would be possible to expand + * the macros to support other linkages. + */ +#define APR_POOL_DECLARE_ACCESSOR(type) \ + APR_DECLARE(apr_pool_t *) apr_##type##_pool_get \ + (const apr_##type##_t *the##type) + +/** + * Implementation helper macro to provide apr_foo_pool_get()s. + * + * In the implementation, the APR_POOL_IMPLEMENT_ACCESSOR() is used to + * actually define the function. It assumes the field is named "pool". + */ +#define APR_POOL_IMPLEMENT_ACCESSOR(type) \ + APR_DECLARE(apr_pool_t *) apr_##type##_pool_get \ + (const apr_##type##_t *the##type) \ + { return the##type->pool; } + + +/** + * Pool debug levels + * + *
    + * | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
    + * ---------------------------------
    + * |   |   |   |   |   |   |   | x |  General debug code enabled (usefull in
    + *                                    combination with --with-efence).
    + *
    + * |   |   |   |   |   |   | x |   |  Verbose output on stderr (report
    + *                                    CREATE, CLEAR, DESTROY).
    + *
    + * |   |   |   | x |   |   |   |   |  Verbose output on stderr (report
    + *                                    PALLOC, PCALLOC).
    + *
    + * |   |   |   |   |   | x |   |   |  Lifetime checking. On each use of a
    + *                                    pool, check its lifetime.  If the pool
    + *                                    is out of scope, abort().
    + *                                    In combination with the verbose flag
    + *                                    above, it will output LIFE in such an
    + *                                    event prior to aborting.
    + *
    + * |   |   |   |   | x |   |   |   |  Pool owner checking.  On each use of a
    + *                                    pool, check if the current thread is the
    + *                                    pools owner.  If not, abort().  In
    + *                                    combination with the verbose flag above,
    + *                                    it will output OWNER in such an event
    + *                                    prior to aborting.  Use the debug
    + *                                    function apr_pool_owner_set() to switch
    + *                                    a pools ownership.
    + *
    + * When no debug level was specified, assume general debug mode.
    + * If level 0 was specified, debugging is switched off
    + * 
    + */ +#if defined(APR_POOL_DEBUG) +#if (APR_POOL_DEBUG != 0) && (APR_POOL_DEBUG - 0 == 0) +#undef APR_POOL_DEBUG +#define APR_POOL_DEBUG 1 +#endif +#else +#define APR_POOL_DEBUG 0 +#endif + +/** the place in the code where the particular function was called */ +#define APR_POOL__FILE_LINE__ __FILE__ ":" APR_STRINGIFY(__LINE__) + + + +/** A function that is called when allocation fails. */ +typedef int (*apr_abortfunc_t)(int retcode); + +/* + * APR memory structure manipulators (pools, tables, and arrays). + */ + +/* + * Initialization + */ + +/** + * Setup all of the internal structures required to use pools + * @remark Programs do NOT need to call this directly. APR will call this + * automatically from apr_initialize. + * @internal + */ +APR_DECLARE(apr_status_t) apr_pool_initialize(void); + +/** + * Tear down all of the internal structures required to use pools + * @remark Programs do NOT need to call this directly. APR will call this + * automatically from apr_terminate. + * @internal + */ +APR_DECLARE(void) apr_pool_terminate(void); + + +/* + * Pool creation/destruction + */ + +#include "apr_allocator.h" + +/** + * Create a new pool. + * @param newpool The pool we have just created. + * @param parent The parent pool. If this is NULL, the new pool is a root + * pool. If it is non-NULL, the new pool will inherit all + * of its parent pool's attributes, except the apr_pool_t will + * be a sub-pool. + * @param abort_fn A function to use if the pool cannot allocate more memory. + * @param allocator The allocator to use with the new pool. If NULL the + * allocator of the parent pool will be used. + */ +APR_DECLARE(apr_status_t) apr_pool_create_ex(apr_pool_t **newpool, + apr_pool_t *parent, + apr_abortfunc_t abort_fn, + apr_allocator_t *allocator); + +/** + * Debug version of apr_pool_create_ex. + * @param newpool @see apr_pool_create. + * @param parent @see apr_pool_create. + * @param abort_fn @see apr_pool_create. + * @param allocator @see apr_pool_create. + * @param file_line Where the function is called from. + * This is usually APR_POOL__FILE_LINE__. + * @remark Only available when APR_POOL_DEBUG is defined. + * Call this directly if you have you apr_pool_create_ex + * calls in a wrapper function and wish to override + * the file_line argument to reflect the caller of + * your wrapper function. If you do not have + * apr_pool_create_ex in a wrapper, trust the macro + * and don't call apr_pool_create_ex_debug directly. + */ +APR_DECLARE(apr_status_t) apr_pool_create_ex_debug(apr_pool_t **newpool, + apr_pool_t *parent, + apr_abortfunc_t abort_fn, + apr_allocator_t *allocator, + const char *file_line); + +#if APR_POOL_DEBUG +#define apr_pool_create_ex(newpool, parent, abort_fn, allocator) \ + apr_pool_create_ex_debug(newpool, parent, abort_fn, allocator, \ + APR_POOL__FILE_LINE__) +#endif + +/** + * Create a new pool. + * @param newpool The pool we have just created. + * @param parent The parent pool. If this is NULL, the new pool is a root + * pool. If it is non-NULL, the new pool will inherit all + * of its parent pool's attributes, except the apr_pool_t will + * be a sub-pool. + */ +#if defined(DOXYGEN) +APR_DECLARE(apr_status_t) apr_pool_create(apr_pool_t **newpool, + apr_pool_t *parent); +#else +#if APR_POOL_DEBUG +#define apr_pool_create(newpool, parent) \ + apr_pool_create_ex_debug(newpool, parent, NULL, NULL, \ + APR_POOL__FILE_LINE__) +#else +#define apr_pool_create(newpool, parent) \ + apr_pool_create_ex(newpool, parent, NULL, NULL) +#endif +#endif + +/** @deprecated @see apr_pool_create_ex */ +#if APR_POOL_DEBUG +#define apr_pool_sub_make(newpool, parent, abort_fn) \ + (void)apr_pool_create_ex_debug(newpool, parent, abort_fn, \ + NULL, \ + APR_POOL__FILE_LINE__) +#else +#define apr_pool_sub_make(newpool, parent, abort_fn) \ + (void)apr_pool_create_ex(newpool, parent, abort_fn, NULL) +#endif + +/** + * Find the pools allocator + * @param pool The pool to get the allocator from. + */ +APR_DECLARE(apr_allocator_t *) apr_pool_allocator_get(apr_pool_t *pool); + +/** + * Clear all memory in the pool and run all the cleanups. This also destroys all + * subpools. + * @param p The pool to clear + * @remark This does not actually free the memory, it just allows the pool + * to re-use this memory for the next allocation. + * @see apr_pool_destroy() + */ +APR_DECLARE(void) apr_pool_clear(apr_pool_t *p); + +/** + * Debug version of apr_pool_clear. + * @param p See: apr_pool_clear. + * @param file_line Where the function is called from. + * This is usually APR_POOL__FILE_LINE__. + * @remark Only available when APR_POOL_DEBUG is defined. + * Call this directly if you have you apr_pool_clear + * calls in a wrapper function and wish to override + * the file_line argument to reflect the caller of + * your wrapper function. If you do not have + * apr_pool_clear in a wrapper, trust the macro + * and don't call apr_pool_destroy_clear directly. + */ +APR_DECLARE(void) apr_pool_clear_debug(apr_pool_t *p, + const char *file_line); + +#if APR_POOL_DEBUG +#define apr_pool_clear(p) \ + apr_pool_clear_debug(p, APR_POOL__FILE_LINE__) +#endif + +/** + * Destroy the pool. This takes similar action as apr_pool_clear() and then + * frees all the memory. + * @param p The pool to destroy + * @remark This will actually free the memory + */ +APR_DECLARE(void) apr_pool_destroy(apr_pool_t *p); + +/** + * Debug version of apr_pool_destroy. + * @param p See: apr_pool_destroy. + * @param file_line Where the function is called from. + * This is usually APR_POOL__FILE_LINE__. + * @remark Only available when APR_POOL_DEBUG is defined. + * Call this directly if you have you apr_pool_destroy + * calls in a wrapper function and wish to override + * the file_line argument to reflect the caller of + * your wrapper function. If you do not have + * apr_pool_destroy in a wrapper, trust the macro + * and don't call apr_pool_destroy_debug directly. + */ +APR_DECLARE(void) apr_pool_destroy_debug(apr_pool_t *p, + const char *file_line); + +#if APR_POOL_DEBUG +#define apr_pool_destroy(p) \ + apr_pool_destroy_debug(p, APR_POOL__FILE_LINE__) +#endif + + +/* + * Memory allocation + */ + +/** + * Allocate a block of memory from a pool + * @param p The pool to allocate from + * @param size The amount of memory to allocate + * @return The allocated memory + */ +APR_DECLARE(void *) apr_palloc(apr_pool_t *p, apr_size_t size); + +/** + * Debug version of apr_palloc + * @param p See: apr_palloc + * @param size See: apr_palloc + * @param file_line Where the function is called from. + * This is usually APR_POOL__FILE_LINE__. + * @return See: apr_palloc + */ +APR_DECLARE(void *) apr_palloc_debug(apr_pool_t *p, apr_size_t size, + const char *file_line); + +#if APR_POOL_DEBUG +#define apr_palloc(p, size) \ + apr_palloc_debug(p, size, APR_POOL__FILE_LINE__) +#endif + +/** + * Allocate a block of memory from a pool and set all of the memory to 0 + * @param p The pool to allocate from + * @param size The amount of memory to allocate + * @return The allocated memory + */ +#if defined(DOXYGEN) +APR_DECLARE(void *) apr_pcalloc(apr_pool_t *p, apr_size_t size); +#elif !APR_POOL_DEBUG +#define apr_pcalloc(p, size) memset(apr_palloc(p, size), 0, size) +#endif + +/** + * Debug version of apr_pcalloc + * @param p See: apr_pcalloc + * @param size See: apr_pcalloc + * @param file_line Where the function is called from. + * This is usually APR_POOL__FILE_LINE__. + * @return See: apr_pcalloc + */ +APR_DECLARE(void *) apr_pcalloc_debug(apr_pool_t *p, apr_size_t size, + const char *file_line); + +#if APR_POOL_DEBUG +#define apr_pcalloc(p, size) \ + apr_pcalloc_debug(p, size, APR_POOL__FILE_LINE__) +#endif + + +/* + * Pool Properties + */ + +/** + * Set the function to be called when an allocation failure occurs. + * @remark If the program wants APR to exit on a memory allocation error, + * then this function can be called to set the callback to use (for + * performing cleanup and then exiting). If this function is not called, + * then APR will return an error and expect the calling program to + * deal with the error accordingly. + */ +APR_DECLARE(void) apr_pool_abort_set(apr_abortfunc_t abortfunc, + apr_pool_t *pool); + +/** @deprecated @see apr_pool_abort_set */ +APR_DECLARE(void) apr_pool_set_abort(apr_abortfunc_t abortfunc, + apr_pool_t *pool); + +/** + * Get the abort function associated with the specified pool. + * @param pool The pool for retrieving the abort function. + * @return The abort function for the given pool. + */ +APR_DECLARE(apr_abortfunc_t) apr_pool_abort_get(apr_pool_t *pool); + +/** @deprecated @see apr_pool_abort_get */ +APR_DECLARE(apr_abortfunc_t) apr_pool_get_abort(apr_pool_t *pool); + +/** + * Get the parent pool of the specified pool. + * @param pool The pool for retrieving the parent pool. + * @return The parent of the given pool. + */ +APR_DECLARE(apr_pool_t *) apr_pool_parent_get(apr_pool_t *pool); + +/** @deprecated @see apr_pool_parent_get */ +APR_DECLARE(apr_pool_t *) apr_pool_get_parent(apr_pool_t *pool); + +/** + * Determine if pool a is an ancestor of pool b + * @param a The pool to search + * @param b The pool to search for + * @return True if a is an ancestor of b, NULL is considered an ancestor + * of all pools. + */ +APR_DECLARE(int) apr_pool_is_ancestor(apr_pool_t *a, apr_pool_t *b); + +/** + * Tag a pool (give it a name) + * @param pool The pool to tag + * @param tag The tag + */ +APR_DECLARE(void) apr_pool_tag(apr_pool_t *pool, const char *tag); + + +/* + * User data management + */ + +/** + * Set the data associated with the current pool + * @param data The user data associated with the pool. + * @param key The key to use for association + * @param cleanup The cleanup program to use to cleanup the data (NULL if none) + * @param pool The current pool + * @warning The data to be attached to the pool should have a life span + * at least as long as the pool it is being attached to. + * + * Users of APR must take EXTREME care when choosing a key to + * use for their data. It is possible to accidentally overwrite + * data by choosing a key that another part of the program is using. + * Therefore it is advised that steps are taken to ensure that unique + * keys are used for all of the userdata objects in a particular pool + * (the same key in two different pools or a pool and one of its + * subpools is okay) at all times. Careful namespace prefixing of + * key names is a typical way to help ensure this uniqueness. + */ +APR_DECLARE(apr_status_t) apr_pool_userdata_set( + const void *data, + const char *key, + apr_status_t (*cleanup)(void *), + apr_pool_t *pool); + +/** + * Set the data associated with the current pool + * @param data The user data associated with the pool. + * @param key The key to use for association + * @param cleanup The cleanup program to use to cleanup the data (NULL if none) + * @param pool The current pool + * @note same as apr_pool_userdata_set(), except that this version doesn't + * make a copy of the key (this function is useful, for example, when + * the key is a string literal) + * @warning This should NOT be used if the key could change addresses by + * any means between the apr_pool_userdata_setn() call and a + * subsequent apr_pool_userdata_get() on that key, such as if a + * static string is used as a userdata key in a DSO and the DSO could + * be unloaded and reloaded between the _setn() and the _get(). You + * MUST use apr_pool_userdata_set() in such cases. + * @warning More generally, the key and the data to be attached to the + * pool should have a life span at least as long as the pool itself. + * + */ +APR_DECLARE(apr_status_t) apr_pool_userdata_setn( + const void *data, + const char *key, + apr_status_t (*cleanup)(void *), + apr_pool_t *pool); + +/** + * Return the data associated with the current pool. + * @param data The user data associated with the pool. + * @param key The key for the data to retrieve + * @param pool The current pool. + */ +APR_DECLARE(apr_status_t) apr_pool_userdata_get(void **data, const char *key, + apr_pool_t *pool); + + +/* + * Cleanup + * + * Cleanups are performed in the reverse order they were registered. That is: + * Last In, First Out. + */ + +/** + * Register a function to be called when a pool is cleared or destroyed + * @param p The pool register the cleanup with + * @param data The data to pass to the cleanup function. + * @param plain_cleanup The function to call when the pool is cleared + * or destroyed + * @param child_cleanup The function to call when a child process is being + * shutdown - this function is called in the child, obviously! + */ +APR_DECLARE(void) apr_pool_cleanup_register( + apr_pool_t *p, + const void *data, + apr_status_t (*plain_cleanup)(void *), + apr_status_t (*child_cleanup)(void *)); + +/** + * Remove a previously registered cleanup function + * @param p The pool remove the cleanup from + * @param data The data to remove from cleanup + * @param cleanup The function to remove from cleanup + * @remarks For some strange reason only the plain_cleanup is handled by this + * function + */ +APR_DECLARE(void) apr_pool_cleanup_kill(apr_pool_t *p, const void *data, + apr_status_t (*cleanup)(void *)); + +/** + * Replace the child cleanup of a previously registered cleanup + * @param p The pool of the registered cleanup + * @param data The data of the registered cleanup + * @param plain_cleanup The plain cleanup function of the registered cleanup + * @param child_cleanup The function to register as the child cleanup + */ +APR_DECLARE(void) apr_pool_child_cleanup_set( + apr_pool_t *p, + const void *data, + apr_status_t (*plain_cleanup)(void *), + apr_status_t (*child_cleanup)(void *)); + +/** + * Run the specified cleanup function immediately and unregister it. Use + * @a data instead of the data that was registered with the cleanup. + * @param p The pool remove the cleanup from + * @param data The data to remove from cleanup + * @param cleanup The function to remove from cleanup + */ +APR_DECLARE(apr_status_t) apr_pool_cleanup_run( + apr_pool_t *p, + void *data, + apr_status_t (*cleanup)(void *)); + +/** + * An empty cleanup function + * @param data The data to cleanup + */ +APR_DECLARE_NONSTD(apr_status_t) apr_pool_cleanup_null(void *data); + +/* Preparing for exec() --- close files, etc., but *don't* flush I/O + * buffers, *don't* wait for subprocesses, and *don't* free any memory. + */ +/** + * Run all of the child_cleanups, so that any unnecessary files are + * closed because we are about to exec a new program + */ +APR_DECLARE(void) apr_pool_cleanup_for_exec(void); + + +/** + * @defgroup PoolDebug Pool Debugging functions. + * + * pools have nested lifetimes -- sub_pools are destroyed when the + * parent pool is cleared. We allow certain liberties with operations + * on things such as tables (and on other structures in a more general + * sense) where we allow the caller to insert values into a table which + * were not allocated from the table's pool. The table's data will + * remain valid as long as all the pools from which its values are + * allocated remain valid. + * + * For example, if B is a sub pool of A, and you build a table T in + * pool B, then it's safe to insert data allocated in A or B into T + * (because B lives at most as long as A does, and T is destroyed when + * B is cleared/destroyed). On the other hand, if S is a table in + * pool A, it is safe to insert data allocated in A into S, but it + * is *not safe* to insert data allocated from B into S... because + * B can be cleared/destroyed before A is (which would leave dangling + * pointers in T's data structures). + * + * In general we say that it is safe to insert data into a table T + * if the data is allocated in any ancestor of T's pool. This is the + * basis on which the APR_POOL_DEBUG code works -- it tests these ancestor + * relationships for all data inserted into tables. APR_POOL_DEBUG also + * provides tools (apr_pool_find, and apr_pool_is_ancestor) for other + * folks to implement similar restrictions for their own data + * structures. + * + * However, sometimes this ancestor requirement is inconvenient -- + * sometimes we're forced to create a sub pool (such as through + * apr_sub_req_lookup_uri), and the sub pool is guaranteed to have + * the same lifetime as the parent pool. This is a guarantee implemented + * by the *caller*, not by the pool code. That is, the caller guarantees + * they won't destroy the sub pool individually prior to destroying the + * parent pool. + * + * In this case the caller must call apr_pool_join() to indicate this + * guarantee to the APR_POOL_DEBUG code. There are a few examples spread + * through the standard modules. + * + * These functions are only implemented when #APR_POOL_DEBUG is set. + * + * @{ + */ +#if APR_POOL_DEBUG || defined(DOXYGEN) +/** + * Guarantee that a subpool has the same lifetime as the parent. + * @param p The parent pool + * @param sub The subpool + */ +APR_DECLARE(void) apr_pool_join(apr_pool_t *p, apr_pool_t *sub); + +/** + * Find a pool from something allocated in it. + * @param mem The thing allocated in the pool + * @return The pool it is allocated in + */ +APR_DECLARE(apr_pool_t *) apr_pool_find(const void *mem); + +/** + * Report the number of bytes currently in the pool + * @param p The pool to inspect + * @param recurse Recurse/include the subpools' sizes + * @return The number of bytes + */ +APR_DECLARE(apr_size_t) apr_pool_num_bytes(apr_pool_t *p, int recurse); + +/** + * Lock a pool + * @param pool The pool to lock + * @param flag The flag + */ +APR_DECLARE(void) apr_pool_lock(apr_pool_t *pool, int flag); + +/* @} */ + +#else /* APR_POOL_DEBUG or DOXYGEN */ + +#ifdef apr_pool_join +#undef apr_pool_join +#endif +#define apr_pool_join(a,b) + +#ifdef apr_pool_lock +#undef apr_pool_lock +#endif +#define apr_pool_lock(pool, lock) + +#endif /* APR_POOL_DEBUG or DOXYGEN */ + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* !APR_POOLS_H */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_portable.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_portable.h new file mode 100644 index 00000000..ffeff9b0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_portable.h @@ -0,0 +1,505 @@ +/* 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. + */ + +/* This header file is where you should put ANY platform specific information. + * This should be the only header file that programs need to include that + * actually has platform dependant code which refers to the . + */ +#ifndef APR_PORTABLE_H +#define APR_PORTABLE_H +/** + * @file apr_portable.h + * @brief APR Portability Routines + */ + +#include "apr.h" +#include "apr_pools.h" +#include "apr_thread_proc.h" +#include "apr_file_io.h" +#include "apr_network_io.h" +#include "apr_errno.h" +#include "apr_global_mutex.h" +#include "apr_proc_mutex.h" +#include "apr_time.h" +#include "apr_dso.h" +#include "apr_shm.h" + +#if APR_HAVE_DIRENT_H +#include +#endif +#if APR_HAVE_FCNTL_H +#include +#endif +#if APR_HAVE_PTHREAD_H +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/** + * @defgroup apr_portabile Portability Routines + * @ingroup APR + * @{ + */ + +#ifdef WIN32 +/* The primitives for Windows types */ +typedef HANDLE apr_os_file_t; +typedef HANDLE apr_os_dir_t; +typedef SOCKET apr_os_sock_t; +typedef HANDLE apr_os_proc_mutex_t; +typedef HANDLE apr_os_thread_t; +typedef HANDLE apr_os_proc_t; +typedef DWORD apr_os_threadkey_t; +typedef FILETIME apr_os_imp_time_t; +typedef SYSTEMTIME apr_os_exp_time_t; +typedef HANDLE apr_os_dso_handle_t; +typedef HANDLE apr_os_shm_t; + +#elif defined(OS2) +typedef HFILE apr_os_file_t; +typedef HDIR apr_os_dir_t; +typedef int apr_os_sock_t; +typedef HMTX apr_os_proc_mutex_t; +typedef TID apr_os_thread_t; +typedef PID apr_os_proc_t; +typedef PULONG apr_os_threadkey_t; +typedef struct timeval apr_os_imp_time_t; +typedef struct tm apr_os_exp_time_t; +typedef HMODULE apr_os_dso_handle_t; +typedef void* apr_os_shm_t; + +#elif defined(__BEOS__) +#include +#include + +struct apr_os_proc_mutex_t { + sem_id sem; + int32 ben; +}; + +typedef int apr_os_file_t; +typedef DIR apr_os_dir_t; +typedef int apr_os_sock_t; +typedef struct apr_os_proc_mutex_t apr_os_proc_mutex_t; +typedef thread_id apr_os_thread_t; +typedef thread_id apr_os_proc_t; +typedef int apr_os_threadkey_t; +typedef struct timeval apr_os_imp_time_t; +typedef struct tm apr_os_exp_time_t; +typedef image_id apr_os_dso_handle_t; +typedef void* apr_os_shm_t; + +#elif defined(NETWARE) +typedef int apr_os_file_t; +typedef DIR apr_os_dir_t; +typedef int apr_os_sock_t; +typedef NXMutex_t apr_os_proc_mutex_t; +typedef NXThreadId_t apr_os_thread_t; +typedef long apr_os_proc_t; +typedef NXKey_t apr_os_threadkey_t; +typedef struct timeval apr_os_imp_time_t; +typedef struct tm apr_os_exp_time_t; +typedef void * apr_os_dso_handle_t; +typedef void* apr_os_shm_t; + +#else +/* Any other OS should go above this one. This is the lowest common + * denominator typedefs for all UNIX-like systems. :) + */ + +/** Basic OS process mutex structure. */ +struct apr_os_proc_mutex_t { +#if APR_HAS_SYSVSEM_SERIALIZE || APR_HAS_FCNTL_SERIALIZE || APR_HAS_FLOCK_SERIALIZE + int crossproc; +#endif +#if APR_HAS_PROC_PTHREAD_SERIALIZE + pthread_mutex_t *pthread_interproc; +#endif +#if APR_HAS_THREADS + /* If no threads, no need for thread locks */ +#if APR_USE_PTHREAD_SERIALIZE + pthread_mutex_t *intraproc; +#endif +#endif +}; + +typedef int apr_os_file_t; /**< native file */ +typedef DIR apr_os_dir_t; /**< native dir */ +typedef int apr_os_sock_t; /**< native dir */ +typedef struct apr_os_proc_mutex_t apr_os_proc_mutex_t; /**< native proces + * mutex + */ +#if APR_HAS_THREADS && APR_HAVE_PTHREAD_H +typedef pthread_t apr_os_thread_t; /**< native thread */ +typedef pthread_key_t apr_os_threadkey_t; /**< native thread address + * space */ +#endif +typedef pid_t apr_os_proc_t; /**< native pid */ +typedef struct timeval apr_os_imp_time_t; /**< native timeval */ +typedef struct tm apr_os_exp_time_t; /**< native tm */ +/** @var apr_os_dso_handle_t + * native dso types + */ +#if defined(HPUX) || defined(HPUX10) || defined(HPUX11) +#include +typedef shl_t apr_os_dso_handle_t; +#elif defined(DARWIN) +#include +typedef NSModule apr_os_dso_handle_t; +#else +typedef void * apr_os_dso_handle_t; +#endif +typedef void* apr_os_shm_t; /**< native SHM */ + +#endif + +/** + * @typedef apr_os_sock_info_t + * @brief alias for local OS socket + */ +/** + * everything APR needs to know about an active socket to construct + * an APR socket from it; currently, this is platform-independent + */ +struct apr_os_sock_info_t { + apr_os_sock_t *os_sock; /**< always required */ + struct sockaddr *local; /**< NULL if not yet bound */ + struct sockaddr *remote; /**< NULL if not connected */ + int family; /**< always required (APR_INET, APR_INET6, etc.) */ + int type; /**< always required (SOCK_STREAM, SOCK_DGRAM, etc.) */ +#ifdef APR_ENABLE_FOR_1_0 /**< enable with APR 1.0 */ + int protocol; /**< 0 or actual protocol (APR_PROTO_SCTP, APR_PROTO_TCP, etc.) */ +#endif +}; + +typedef struct apr_os_sock_info_t apr_os_sock_info_t; + +#if APR_PROC_MUTEX_IS_GLOBAL || defined(DOXYGEN) +/** Opaque global mutex type */ +#define apr_os_global_mutex_t apr_os_proc_mutex_t +/** @return apr_os_global_mutex */ +#define apr_os_global_mutex_get apr_os_proc_mutex_get +#else + /** Thread and process mutex for those platforms where process mutexes + * are not held in threads. + */ + struct apr_os_global_mutex_t { + apr_pool_t *pool; + apr_proc_mutex_t *proc_mutex; +#if APR_HAS_THREADS + apr_thread_mutex_t *thread_mutex; +#endif /* APR_HAS_THREADS */ + }; + typedef struct apr_os_global_mutex_t apr_os_global_mutex_t; + +APR_DECLARE(apr_status_t) apr_os_global_mutex_get(apr_os_global_mutex_t *ospmutex, + apr_global_mutex_t *pmutex); +#endif + + +/** + * convert the file from apr type to os specific type. + * @param thefile The os specific file we are converting to + * @param file The apr file to convert. + * @remark On Unix, it is only possible to get a file descriptor from + * an apr file type. + */ +APR_DECLARE(apr_status_t) apr_os_file_get(apr_os_file_t *thefile, + apr_file_t *file); + +/** + * convert the dir from apr type to os specific type. + * @param thedir The os specific dir we are converting to + * @param dir The apr dir to convert. + */ +APR_DECLARE(apr_status_t) apr_os_dir_get(apr_os_dir_t **thedir, + apr_dir_t *dir); + +/** + * Convert the socket from an apr type to an OS specific socket + * @param thesock The socket to convert. + * @param sock The os specifc equivelant of the apr socket.. + */ +APR_DECLARE(apr_status_t) apr_os_sock_get(apr_os_sock_t *thesock, + apr_socket_t *sock); + +/** + * Convert the proc mutex from os specific type to apr type + * @param ospmutex The os specific proc mutex we are converting to. + * @param pmutex The apr proc mutex to convert. + */ +APR_DECLARE(apr_status_t) apr_os_proc_mutex_get(apr_os_proc_mutex_t *ospmutex, + apr_proc_mutex_t *pmutex); + +/** + * Get the exploded time in the platforms native format. + * @param ostime the native time format + * @param aprtime the time to convert + */ +APR_DECLARE(apr_status_t) apr_os_exp_time_get(apr_os_exp_time_t **ostime, + apr_time_exp_t *aprtime); + +/** + * Get the imploded time in the platforms native format. + * @param ostime the native time format + * @param aprtime the time to convert + */ +APR_DECLARE(apr_status_t) apr_os_imp_time_get(apr_os_imp_time_t **ostime, + apr_time_t *aprtime); + +/** + * convert the shm from apr type to os specific type. + * @param osshm The os specific shm representation + * @param shm The apr shm to convert. + */ +APR_DECLARE(apr_status_t) apr_os_shm_get(apr_os_shm_t *osshm, + apr_shm_t *shm); + +#if APR_HAS_THREADS || defined(DOXYGEN) +/** + * @defgroup apr_os_thread Thread portability Routines + * @{ + */ +/** + * convert the thread to os specific type from apr type. + * @param thethd The apr thread to convert + * @param thd The os specific thread we are converting to + */ +APR_DECLARE(apr_status_t) apr_os_thread_get(apr_os_thread_t **thethd, + apr_thread_t *thd); + +/** + * convert the thread private memory key to os specific type from an apr type. + * @param thekey The apr handle we are converting from. + * @param key The os specific handle we are converting to. + */ +APR_DECLARE(apr_status_t) apr_os_threadkey_get(apr_os_threadkey_t *thekey, + apr_threadkey_t *key); + +/** + * convert the thread from os specific type to apr type. + * @param thd The apr thread we are converting to. + * @param thethd The os specific thread to convert + * @param cont The pool to use if it is needed. + */ +APR_DECLARE(apr_status_t) apr_os_thread_put(apr_thread_t **thd, + apr_os_thread_t *thethd, + apr_pool_t *cont); + +/** + * convert the thread private memory key from os specific type to apr type. + * @param key The apr handle we are converting to. + * @param thekey The os specific handle to convert + * @param cont The pool to use if it is needed. + */ +APR_DECLARE(apr_status_t) apr_os_threadkey_put(apr_threadkey_t **key, + apr_os_threadkey_t *thekey, + apr_pool_t *cont); +/** + * Get the thread ID + */ +APR_DECLARE(apr_os_thread_t) apr_os_thread_current(void); + +/** + * Compare two thread id's + * @param tid1 1st Thread ID to compare + * @param tid2 2nd Thread ID to compare + */ +APR_DECLARE(int) apr_os_thread_equal(apr_os_thread_t tid1, + apr_os_thread_t tid2); + +/** @} */ +#endif /* APR_HAS_THREADS */ + +/** + * convert the file from os specific type to apr type. + * @param file The apr file we are converting to. + * @param thefile The os specific file to convert + * @param flags The flags that were used to open this file. + * @param cont The pool to use if it is needed. + * @remark On Unix, it is only possible to put a file descriptor into + * an apr file type. + */ +APR_DECLARE(apr_status_t) apr_os_file_put(apr_file_t **file, + apr_os_file_t *thefile, + apr_int32_t flags, apr_pool_t *cont); + +/** + * convert the file from os specific type to apr type. + * @param file The apr file we are converting to. + * @param thefile The os specific pipe to convert + * @param cont The pool to use if it is needed. + * @remark On Unix, it is only possible to put a file descriptor into + * an apr file type. + */ +APR_DECLARE(apr_status_t) apr_os_pipe_put(apr_file_t **file, + apr_os_file_t *thefile, + apr_pool_t *cont); + +/** + * convert the file from os specific type to apr type. + * @param file The apr file we are converting to. + * @param thefile The os specific pipe to convert + * @param register_cleanup A cleanup will be registered on the apr_file_t + * to issue apr_file_close(). + * @param cont The pool to use if it is needed. + * @remark On Unix, it is only possible to put a file descriptor into + * an apr file type. + */ +APR_DECLARE(apr_status_t) apr_os_pipe_put_ex(apr_file_t **file, + apr_os_file_t *thefile, + int register_cleanup, + apr_pool_t *cont); + +/** + * convert the dir from os specific type to apr type. + * @param dir The apr dir we are converting to. + * @param thedir The os specific dir to convert + * @param cont The pool to use when creating to apr directory. + */ +APR_DECLARE(apr_status_t) apr_os_dir_put(apr_dir_t **dir, + apr_os_dir_t *thedir, + apr_pool_t *cont); + +/** + * Convert a socket from the os specific type to the apr type + * @param sock The pool to use. + * @param thesock The socket to convert to. + * @param cont The socket we are converting to an apr type. + * @remark If it is a true socket, it is best to call apr_os_sock_make() + * and provide APR with more information about the socket. + */ +APR_DECLARE(apr_status_t) apr_os_sock_put(apr_socket_t **sock, + apr_os_sock_t *thesock, + apr_pool_t *cont); + +/** + * Create a socket from an existing descriptor and local and remote + * socket addresses. + * @param apr_sock The new socket that has been set up + * @param os_sock_info The os representation of the socket handle and + * other characteristics of the socket + * @param cont The pool to use + * @remark If you only know the descriptor/handle or if it isn't really + * a true socket, use apr_os_sock_put() instead. + */ +APR_DECLARE(apr_status_t) apr_os_sock_make(apr_socket_t **apr_sock, + apr_os_sock_info_t *os_sock_info, + apr_pool_t *cont); + +/** + * Convert the proc mutex from os specific type to apr type + * @param pmutex The apr proc mutex we are converting to. + * @param ospmutex The os specific proc mutex to convert. + * @param cont The pool to use if it is needed. + */ +APR_DECLARE(apr_status_t) apr_os_proc_mutex_put(apr_proc_mutex_t **pmutex, + apr_os_proc_mutex_t *ospmutex, + apr_pool_t *cont); + +/** + * Put the imploded time in the APR format. + * @param aprtime the APR time format + * @param ostime the time to convert + * @param cont the pool to use if necessary + */ +APR_DECLARE(apr_status_t) apr_os_imp_time_put(apr_time_t *aprtime, + apr_os_imp_time_t **ostime, + apr_pool_t *cont); + +/** + * Put the exploded time in the APR format. + * @param aprtime the APR time format + * @param ostime the time to convert + * @param cont the pool to use if necessary + */ +APR_DECLARE(apr_status_t) apr_os_exp_time_put(apr_time_exp_t *aprtime, + apr_os_exp_time_t **ostime, + apr_pool_t *cont); + +/** + * convert the shared memory from os specific type to apr type. + * @param shm The apr shm representation of osshm + * @param osshm The os specific shm identity + * @param cont The pool to use if it is needed. + * @remark On fork()ed architectures, this is typically nothing more than + * the memory block mapped. On non-fork architectures, this is typically + * some internal handle to pass the mapping from process to process. + */ +APR_DECLARE(apr_status_t) apr_os_shm_put(apr_shm_t **shm, + apr_os_shm_t *osshm, + apr_pool_t *cont); + + +#if APR_HAS_DSO || defined(DOXYGEN) +/** + * @defgroup apr_os_dso DSO (Dynamic Loading) Portabiliity Routines + * @{ + */ +/** + * convert the dso handle from os specific to apr + * @param dso The apr handle we are converting to + * @param thedso the os specific handle to convert + * @param pool the pool to use if it is needed + */ +APR_DECLARE(apr_status_t) apr_os_dso_handle_put(apr_dso_handle_t **dso, + apr_os_dso_handle_t thedso, + apr_pool_t *pool); + +/** + * convert the apr dso handle into an os specific one + * @param aprdso The apr dso handle to convert + * @param dso The os specific dso to return + */ +APR_DECLARE(apr_status_t) apr_os_dso_handle_get(apr_os_dso_handle_t *dso, + apr_dso_handle_t *aprdso); + +#if APR_HAS_OS_UUID +/** + * Private: apr-util's apr_uuid module when supported by the platform + */ +APR_DECLARE(apr_status_t) apr_os_uuid_get(unsigned char *uuid_data); +#endif + +/** @} */ +#endif /* APR_HAS_DSO */ + + +/** + * Get the name of the system default characer set. + * @param pool the pool to allocate the name from, if needed + */ +APR_DECLARE(const char*) apr_os_default_encoding(apr_pool_t *pool); + + +/** + * Get the name of the current locale character set. + * @param pool the pool to allocate the name from, if needed + * @remark Defers to apr_os_default_encoding if the current locale's + * data can't be retreved on this system. + */ +APR_DECLARE(const char*) apr_os_locale_encoding(apr_pool_t *pool); + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* ! APR_PORTABLE_H */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_proc_mutex.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_proc_mutex.h new file mode 100644 index 00000000..ceb9c82a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_proc_mutex.h @@ -0,0 +1,166 @@ +/* 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. + */ + +#ifndef APR_PROC_MUTEX_H +#define APR_PROC_MUTEX_H + +/** + * @file apr_proc_mutex.h + * @brief APR Process Locking Routines + */ + +#include "apr.h" +#include "apr_pools.h" +#include "apr_errno.h" + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/** + * @defgroup apr_proc_mutex Process Locking Routines + * @ingroup APR + * @{ + */ + +/** + * Enumerated potential types for APR process locking methods + * @warning Check APR_HAS_foo_SERIALIZE defines to see if the platform supports + * APR_LOCK_foo. Only APR_LOCK_DEFAULT is portable. + */ +typedef enum { + APR_LOCK_FCNTL, /**< fcntl() */ + APR_LOCK_FLOCK, /**< flock() */ + APR_LOCK_SYSVSEM, /**< System V Semaphores */ + APR_LOCK_PROC_PTHREAD, /**< POSIX pthread process-based locking */ + APR_LOCK_POSIXSEM, /**< POSIX semaphore process-based locking */ + APR_LOCK_DEFAULT /**< Use the default process lock */ +} apr_lockmech_e; + +/** Opaque structure representing a process mutex. */ +typedef struct apr_proc_mutex_t apr_proc_mutex_t; + +/* Function definitions */ + +/** + * Create and initialize a mutex that can be used to synchronize processes. + * @param mutex the memory address where the newly created mutex will be + * stored. + * @param fname A file name to use if the lock mechanism requires one. This + * argument should always be provided. The lock code itself will + * determine if it should be used. + * @param mech The mechanism to use for the interprocess lock, if any; one of + *
    + *            APR_LOCK_FCNTL
    + *            APR_LOCK_FLOCK
    + *            APR_LOCK_SYSVSEM
    + *            APR_LOCK_POSIXSEM
    + *            APR_LOCK_PROC_PTHREAD
    + *            APR_LOCK_DEFAULT     pick the default mechanism for the platform
    + * 
    + * @param pool the pool from which to allocate the mutex. + * @see apr_lockmech_e + * @warning Check APR_HAS_foo_SERIALIZE defines to see if the platform supports + * APR_LOCK_foo. Only APR_LOCK_DEFAULT is portable. + */ +APR_DECLARE(apr_status_t) apr_proc_mutex_create(apr_proc_mutex_t **mutex, + const char *fname, + apr_lockmech_e mech, + apr_pool_t *pool); + +/** + * Re-open a mutex in a child process. + * @param mutex The newly re-opened mutex structure. + * @param fname A file name to use if the mutex mechanism requires one. This + * argument should always be provided. The mutex code itself will + * determine if it should be used. This filename should be the + * same one that was passed to apr_proc_mutex_create(). + * @param pool The pool to operate on. + * @remark This function must be called to maintain portability, even + * if the underlying lock mechanism does not require it. + */ +APR_DECLARE(apr_status_t) apr_proc_mutex_child_init(apr_proc_mutex_t **mutex, + const char *fname, + apr_pool_t *pool); + +/** + * Acquire the lock for the given mutex. If the mutex is already locked, + * the current thread will be put to sleep until the lock becomes available. + * @param mutex the mutex on which to acquire the lock. + */ +APR_DECLARE(apr_status_t) apr_proc_mutex_lock(apr_proc_mutex_t *mutex); + +/** + * Attempt to acquire the lock for the given mutex. If the mutex has already + * been acquired, the call returns immediately with APR_EBUSY. Note: it + * is important that the APR_STATUS_IS_EBUSY(s) macro be used to determine + * if the return value was APR_EBUSY, for portability reasons. + * @param mutex the mutex on which to attempt the lock acquiring. + */ +APR_DECLARE(apr_status_t) apr_proc_mutex_trylock(apr_proc_mutex_t *mutex); + +/** + * Release the lock for the given mutex. + * @param mutex the mutex from which to release the lock. + */ +APR_DECLARE(apr_status_t) apr_proc_mutex_unlock(apr_proc_mutex_t *mutex); + +/** + * Destroy the mutex and free the memory associated with the lock. + * @param mutex the mutex to destroy. + */ +APR_DECLARE(apr_status_t) apr_proc_mutex_destroy(apr_proc_mutex_t *mutex); + +/** + * Destroy the mutex and free the memory associated with the lock. + * @param mutex the mutex to destroy. + * @note This function is generally used to kill a cleanup on an already + * created mutex + */ +APR_DECLARE(apr_status_t) apr_proc_mutex_cleanup(void *mutex); + +/** + * Return the name of the lockfile for the mutex, or NULL + * if the mutex doesn't use a lock file + */ + +APR_DECLARE(const char *) apr_proc_mutex_lockfile(apr_proc_mutex_t *mutex); + +/** + * Display the name of the mutex, as it relates to the actual method used. + * This matches the valid options for Apache's AcceptMutex directive + * @param mutex the name of the mutex + */ +APR_DECLARE(const char *) apr_proc_mutex_name(apr_proc_mutex_t *mutex); + +/** + * Display the name of the default mutex: APR_LOCK_DEFAULT + */ +APR_DECLARE(const char *) apr_proc_mutex_defname(void); + +/** + * Get the pool used by this proc_mutex. + * @return apr_pool_t the pool + */ +APR_POOL_DECLARE_ACCESSOR(proc_mutex); + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* ! APR_PROC_MUTEX_H */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_ring.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_ring.h new file mode 100644 index 00000000..79efb436 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_ring.h @@ -0,0 +1,551 @@ +/* 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. + */ + +/* + * This code draws heavily from the 4.4BSD macros + * and Dean Gaudet's "splim/ring.h". + * + * + * + * We'd use Dean's code directly if we could guarantee the + * availability of inline functions. + */ + +#ifndef APR_RING_H +#define APR_RING_H + +/** + * @file apr_ring.h + * @brief APR Rings + */ + +/* + * for offsetof() + */ +#include "apr_general.h" + +/** + * @defgroup apr_ring Ring Macro Implementations + * @ingroup APR + * A ring is a kind of doubly-linked list that can be manipulated + * without knowing where its head is. + * @{ + */ + +/** + * The Ring Element + * + * A ring element struct is linked to the other elements in the ring + * through its ring entry field, e.g. + *
    + *      struct my_element_t {
    + *          APR_RING_ENTRY(my_element_t) link;
    + *          int foo;
    + *          char *bar;
    + *      };
    + * 
    + * + * An element struct may be put on more than one ring if it has more + * than one APR_RING_ENTRY field. Each APR_RING_ENTRY has a corresponding + * APR_RING_HEAD declaration. + * + * @warning For strict C standards compliance you should put the APR_RING_ENTRY + * first in the element struct unless the head is always part of a larger + * object with enough earlier fields to accommodate the offsetof() used + * to compute the ring sentinel below. You can usually ignore this caveat. + */ +#define APR_RING_ENTRY(elem) \ + struct { \ + struct elem *next; \ + struct elem *prev; \ + } + +/** + * The Ring Head + * + * Each ring is managed via its head, which is a struct declared like this: + *
    + *      APR_RING_HEAD(my_ring_t, my_element_t);
    + *      struct my_ring_t ring, *ringp;
    + * 
    + * + * This struct looks just like the element link struct so that we can + * be sure that the typecasting games will work as expected. + * + * The first element in the ring is next after the head, and the last + * element is just before the head. + */ +#define APR_RING_HEAD(head, elem) \ + struct head { \ + struct elem * volatile next; \ + struct elem * volatile prev; \ + } + +/** + * The Ring Sentinel + * + * This is the magic pointer value that occurs before the first and + * after the last elements in the ring, computed from the address of + * the ring's head. The head itself isn't an element, but in order to + * get rid of all the special cases when dealing with the ends of the + * ring, we play typecasting games to make it look like one. + * + * Here is a diagram to illustrate the arrangements of the next and + * prev pointers of each element in a single ring. Note that they point + * to the start of each element, not to the APR_RING_ENTRY structure. + * + *
    + *     +->+------+<-+  +->+------+<-+  +->+------+<-+
    + *     |  |struct|  |  |  |struct|  |  |  |struct|  |
    + *    /   | elem |   \/   | elem |   \/   | elem |  \
    + * ...    |      |   /\   |      |   /\   |      |   ...
    + *        +------+  |  |  +------+  |  |  +------+
    + *   ...--|prev  |  |  +--|ring  |  |  +--|prev  |
    + *        |  next|--+     | entry|--+     |  next|--...
    + *        +------+        +------+        +------+
    + *        | etc. |        | etc. |        | etc. |
    + *        :      :        :      :        :      :
    + * 
    + * + * The APR_RING_HEAD is nothing but a bare APR_RING_ENTRY. The prev + * and next pointers in the first and last elements don't actually + * point to the head, they point to a phantom place called the + * sentinel. Its value is such that last->next->next == first because + * the offset from the sentinel to the head's next pointer is the same + * as the offset from the start of an element to its next pointer. + * This also works in the opposite direction. + * + *
    + *        last                            first
    + *     +->+------+<-+  +->sentinel<-+  +->+------+<-+
    + *     |  |struct|  |  |            |  |  |struct|  |
    + *    /   | elem |   \/              \/   | elem |  \
    + * ...    |      |   /\              /\   |      |   ...
    + *        +------+  |  |  +------+  |  |  +------+
    + *   ...--|prev  |  |  +--|ring  |  |  +--|prev  |
    + *        |  next|--+     |  head|--+     |  next|--...
    + *        +------+        +------+        +------+
    + *        | etc. |                        | etc. |
    + *        :      :                        :      :
    + * 
    + * + * Note that the offset mentioned above is different for each kind of + * ring that the element may be on, and each kind of ring has a unique + * name for its APR_RING_ENTRY in each element, and has its own type + * for its APR_RING_HEAD. + * + * Note also that if the offset is non-zero (which is required if an + * element has more than one APR_RING_ENTRY), the unreality of the + * sentinel may have bad implications on very perverse implementations + * of C -- see the warning in APR_RING_ENTRY. + * + * @param hp The head of the ring + * @param elem The name of the element struct + * @param link The name of the APR_RING_ENTRY in the element struct + */ +#define APR_RING_SENTINEL(hp, elem, link) \ + (struct elem *)((char *)(hp) - APR_OFFSETOF(struct elem, link)) + +/** + * The first element of the ring + * @param hp The head of the ring + */ +#define APR_RING_FIRST(hp) (hp)->next +/** + * The last element of the ring + * @param hp The head of the ring + */ +#define APR_RING_LAST(hp) (hp)->prev +/** + * The next element in the ring + * @param ep The current element + * @param link The name of the APR_RING_ENTRY in the element struct + */ +#define APR_RING_NEXT(ep, link) (ep)->link.next +/** + * The previous element in the ring + * @param ep The current element + * @param link The name of the APR_RING_ENTRY in the element struct + */ +#define APR_RING_PREV(ep, link) (ep)->link.prev + + +/** + * Initialize a ring + * @param hp The head of the ring + * @param elem The name of the element struct + * @param link The name of the APR_RING_ENTRY in the element struct + */ +#define APR_RING_INIT(hp, elem, link) do { \ + APR_RING_FIRST((hp)) = APR_RING_SENTINEL((hp), elem, link); \ + APR_RING_LAST((hp)) = APR_RING_SENTINEL((hp), elem, link); \ + } while (0) + +/** + * Determine if a ring is empty + * @param hp The head of the ring + * @param elem The name of the element struct + * @param link The name of the APR_RING_ENTRY in the element struct + * @return true or false + */ +#define APR_RING_EMPTY(hp, elem, link) \ + (APR_RING_FIRST((hp)) == APR_RING_SENTINEL((hp), elem, link)) + +/** + * Initialize a singleton element + * @param ep The element + * @param link The name of the APR_RING_ENTRY in the element struct + */ +#define APR_RING_ELEM_INIT(ep, link) do { \ + APR_RING_NEXT((ep), link) = (ep); \ + APR_RING_PREV((ep), link) = (ep); \ + } while (0) + + +/** + * Splice the sequence ep1..epN into the ring before element lep + * (..lep.. becomes ..ep1..epN..lep..) + * @warning This doesn't work for splicing before the first element or on + * empty rings... see APR_RING_SPLICE_HEAD for one that does + * @param lep Element in the ring to splice before + * @param ep1 First element in the sequence to splice in + * @param epN Last element in the sequence to splice in + * @param link The name of the APR_RING_ENTRY in the element struct + */ +#define APR_RING_SPLICE_BEFORE(lep, ep1, epN, link) do { \ + APR_RING_NEXT((epN), link) = (lep); \ + APR_RING_PREV((ep1), link) = APR_RING_PREV((lep), link); \ + APR_RING_NEXT(APR_RING_PREV((lep), link), link) = (ep1); \ + APR_RING_PREV((lep), link) = (epN); \ + } while (0) + +/** + * Splice the sequence ep1..epN into the ring after element lep + * (..lep.. becomes ..lep..ep1..epN..) + * @warning This doesn't work for splicing after the last element or on + * empty rings... see APR_RING_SPLICE_TAIL for one that does + * @param lep Element in the ring to splice after + * @param ep1 First element in the sequence to splice in + * @param epN Last element in the sequence to splice in + * @param link The name of the APR_RING_ENTRY in the element struct + */ +#define APR_RING_SPLICE_AFTER(lep, ep1, epN, link) do { \ + APR_RING_PREV((ep1), link) = (lep); \ + APR_RING_NEXT((epN), link) = APR_RING_NEXT((lep), link); \ + APR_RING_PREV(APR_RING_NEXT((lep), link), link) = (epN); \ + APR_RING_NEXT((lep), link) = (ep1); \ + } while (0) + +/** + * Insert the element nep into the ring before element lep + * (..lep.. becomes ..nep..lep..) + * @warning This doesn't work for inserting before the first element or on + * empty rings... see APR_RING_INSERT_HEAD for one that does + * @param lep Element in the ring to insert before + * @param nep Element to insert + * @param link The name of the APR_RING_ENTRY in the element struct + */ +#define APR_RING_INSERT_BEFORE(lep, nep, link) \ + APR_RING_SPLICE_BEFORE((lep), (nep), (nep), link) + +/** + * Insert the element nep into the ring after element lep + * (..lep.. becomes ..lep..nep..) + * @warning This doesn't work for inserting after the last element or on + * empty rings... see APR_RING_INSERT_TAIL for one that does + * @param lep Element in the ring to insert after + * @param nep Element to insert + * @param link The name of the APR_RING_ENTRY in the element struct + */ +#define APR_RING_INSERT_AFTER(lep, nep, link) \ + APR_RING_SPLICE_AFTER((lep), (nep), (nep), link) + + +/** + * Splice the sequence ep1..epN into the ring before the first element + * (..hp.. becomes ..hp..ep1..epN..) + * @param hp Head of the ring + * @param ep1 First element in the sequence to splice in + * @param epN Last element in the sequence to splice in + * @param elem The name of the element struct + * @param link The name of the APR_RING_ENTRY in the element struct + */ +#define APR_RING_SPLICE_HEAD(hp, ep1, epN, elem, link) \ + APR_RING_SPLICE_AFTER(APR_RING_SENTINEL((hp), elem, link), \ + (ep1), (epN), link) + +/** + * Splice the sequence ep1..epN into the ring after the last element + * (..hp.. becomes ..ep1..epN..hp..) + * @param hp Head of the ring + * @param ep1 First element in the sequence to splice in + * @param epN Last element in the sequence to splice in + * @param elem The name of the element struct + * @param link The name of the APR_RING_ENTRY in the element struct + */ +#define APR_RING_SPLICE_TAIL(hp, ep1, epN, elem, link) \ + APR_RING_SPLICE_BEFORE(APR_RING_SENTINEL((hp), elem, link), \ + (ep1), (epN), link) + +/** + * Insert the element nep into the ring before the first element + * (..hp.. becomes ..hp..nep..) + * @param hp Head of the ring + * @param nep Element to insert + * @param elem The name of the element struct + * @param link The name of the APR_RING_ENTRY in the element struct + */ +#define APR_RING_INSERT_HEAD(hp, nep, elem, link) \ + APR_RING_SPLICE_HEAD((hp), (nep), (nep), elem, link) + +/** + * Insert the element nep into the ring after the last element + * (..hp.. becomes ..nep..hp..) + * @param hp Head of the ring + * @param nep Element to insert + * @param elem The name of the element struct + * @param link The name of the APR_RING_ENTRY in the element struct + */ +#define APR_RING_INSERT_TAIL(hp, nep, elem, link) \ + APR_RING_SPLICE_TAIL((hp), (nep), (nep), elem, link) + +/** + * Concatenate ring h2 onto the end of ring h1, leaving h2 empty. + * @param h1 Head of the ring to concatenate onto + * @param h2 Head of the ring to concatenate + * @param elem The name of the element struct + * @param link The name of the APR_RING_ENTRY in the element struct + */ +#define APR_RING_CONCAT(h1, h2, elem, link) do { \ + if (!APR_RING_EMPTY((h2), elem, link)) { \ + APR_RING_SPLICE_BEFORE(APR_RING_SENTINEL((h1), elem, link), \ + APR_RING_FIRST((h2)), \ + APR_RING_LAST((h2)), link); \ + APR_RING_INIT((h2), elem, link); \ + } \ + } while (0) + +/** + * Prepend ring h2 onto the beginning of ring h1, leaving h2 empty. + * @param h1 Head of the ring to prepend onto + * @param h2 Head of the ring to prepend + * @param elem The name of the element struct + * @param link The name of the APR_RING_ENTRY in the element struct + */ +#define APR_RING_PREPEND(h1, h2, elem, link) do { \ + if (!APR_RING_EMPTY((h2), elem, link)) { \ + APR_RING_SPLICE_AFTER(APR_RING_SENTINEL((h1), elem, link), \ + APR_RING_FIRST((h2)), \ + APR_RING_LAST((h2)), link); \ + APR_RING_INIT((h2), elem, link); \ + } \ + } while (0) + +/** + * Unsplice a sequence of elements from a ring + * @warning The unspliced sequence is left with dangling pointers at either end + * @param ep1 First element in the sequence to unsplice + * @param epN Last element in the sequence to unsplice + * @param link The name of the APR_RING_ENTRY in the element struct + */ +#define APR_RING_UNSPLICE(ep1, epN, link) do { \ + APR_RING_NEXT(APR_RING_PREV((ep1), link), link) = \ + APR_RING_NEXT((epN), link); \ + APR_RING_PREV(APR_RING_NEXT((epN), link), link) = \ + APR_RING_PREV((ep1), link); \ + } while (0) + +/** + * Remove a single element from a ring + * @warning The unspliced element is left with dangling pointers at either end + * @param ep Element to remove + * @param link The name of the APR_RING_ENTRY in the element struct + */ +#define APR_RING_REMOVE(ep, link) \ + APR_RING_UNSPLICE((ep), (ep), link) + + +/** + * Iterate through a ring + * @param ep The current element + * @param hp The ring to iterate over + * @param elem The name of the element struct + * @param link The name of the APR_RING_ENTRY in the element struct + * @remark This is the same as either: + *
    + *	ep = APR_RING_FIRST(hp);
    + * 	while (ep != APR_RING_SENTINEL(hp, elem, link)) {
    + *	    ...
    + * 	    ep = APR_RING_NEXT(ep, link);
    + * 	}
    + *   OR
    + * 	for (ep = APR_RING_FIRST(hp);
    + *           ep != APR_RING_SENTINEL(hp, elem, link);
    + *           ep = APR_RING_NEXT(ep, link)) {
    + *	    ...
    + * 	}
    + * 
    + * @warning Be aware that you cannot change the value of ep within + * the foreach loop, nor can you destroy the ring element it points to. + * Modifying the prev and next pointers of the element is dangerous + * but can be done if you're careful. If you change ep's value or + * destroy the element it points to, then APR_RING_FOREACH + * will have no way to find out what element to use for its next + * iteration. The reason for this can be seen by looking closely + * at the equivalent loops given in the tip above. So, for example, + * if you are writing a loop that empties out a ring one element + * at a time, APR_RING_FOREACH just won't work for you. Do it + * by hand, like so: + *
    + *      while (!APR_RING_EMPTY(hp, elem, link)) {
    + *          ep = APR_RING_FIRST(hp);
    + *          ...
    + *          APR_RING_REMOVE(ep, link);
    + *      }
    + * 
    + * @deprecated This macro causes more headaches than it's worth. Use + * one of the alternatives documented here instead; the clarity gained + * in what's really going on is well worth the extra line or two of code. + * This macro will be removed at some point in the future. + */ +#define APR_RING_FOREACH(ep, hp, elem, link) \ + for ((ep) = APR_RING_FIRST((hp)); \ + (ep) != APR_RING_SENTINEL((hp), elem, link); \ + (ep) = APR_RING_NEXT((ep), link)) + +/** + * Iterate through a ring backwards + * @param ep The current element + * @param hp The ring to iterate over + * @param elem The name of the element struct + * @param link The name of the APR_RING_ENTRY in the element struct + * @see APR_RING_FOREACH + */ +#define APR_RING_FOREACH_REVERSE(ep, hp, elem, link) \ + for ((ep) = APR_RING_LAST((hp)); \ + (ep) != APR_RING_SENTINEL((hp), elem, link); \ + (ep) = APR_RING_PREV((ep), link)) + + +/* Debugging tools: */ + +#ifdef APR_RING_DEBUG +#include +#include + +#define APR_RING_CHECK_ONE(msg, ptr) \ + fprintf(stderr, "*** %s %p\n", msg, ptr) + +#define APR_RING_CHECK(hp, elem, link, msg) \ + APR_RING_CHECK_ELEM(APR_RING_SENTINEL(hp, elem, link), elem, link, msg) + +#define APR_RING_CHECK_ELEM(ep, elem, link, msg) do { \ + struct elem *start = (ep); \ + struct elem *here = start; \ + fprintf(stderr, "*** ring check start -- %s\n", msg); \ + do { \ + fprintf(stderr, "\telem %p\n", here); \ + fprintf(stderr, "\telem->next %p\n", \ + APR_RING_NEXT(here, link)); \ + fprintf(stderr, "\telem->prev %p\n", \ + APR_RING_PREV(here, link)); \ + fprintf(stderr, "\telem->next->prev %p\n", \ + APR_RING_PREV(APR_RING_NEXT(here, link), link)); \ + fprintf(stderr, "\telem->prev->next %p\n", \ + APR_RING_NEXT(APR_RING_PREV(here, link), link)); \ + if (APR_RING_PREV(APR_RING_NEXT(here, link), link) != here) { \ + fprintf(stderr, "\t*** elem->next->prev != elem\n"); \ + break; \ + } \ + if (APR_RING_NEXT(APR_RING_PREV(here, link), link) != here) { \ + fprintf(stderr, "\t*** elem->prev->next != elem\n"); \ + break; \ + } \ + here = APR_RING_NEXT(here, link); \ + } while (here != start); \ + fprintf(stderr, "*** ring check end\n"); \ + } while (0) + +#define APR_RING_CHECK_CONSISTENCY(hp, elem, link) \ + APR_RING_CHECK_ELEM_CONSISTENCY(APR_RING_SENTINEL(hp, elem, link),\ + elem, link) + +#define APR_RING_CHECK_ELEM_CONSISTENCY(ep, elem, link) do { \ + struct elem *start = (ep); \ + struct elem *here = start; \ + do { \ + assert(APR_RING_PREV(APR_RING_NEXT(here, link), link) == here); \ + assert(APR_RING_NEXT(APR_RING_PREV(here, link), link) == here); \ + here = APR_RING_NEXT(here, link); \ + } while (here != start); \ + } while (0) + +#else +/** + * Print a single pointer value to STDERR + * (This is a no-op unless APR_RING_DEBUG is defined.) + * @param msg Descriptive message + * @param ptr Pointer value to print + */ +#define APR_RING_CHECK_ONE(msg, ptr) +/** + * Dump all ring pointers to STDERR, starting with the head and looping all + * the way around the ring back to the head. Aborts if an inconsistency + * is found. + * (This is a no-op unless APR_RING_DEBUG is defined.) + * @param hp Head of the ring + * @param elem The name of the element struct + * @param link The name of the APR_RING_ENTRY in the element struct + * @param msg Descriptive message + */ +#define APR_RING_CHECK(hp, elem, link, msg) +/** + * Loops around a ring and checks all the pointers for consistency. Pops + * an assertion if any inconsistency is found. Same idea as APR_RING_CHECK() + * except that it's silent if all is well. + * (This is a no-op unless APR_RING_DEBUG is defined.) + * @param hp Head of the ring + * @param elem The name of the element struct + * @param link The name of the APR_RING_ENTRY in the element struct + */ +#define APR_RING_CHECK_CONSISTENCY(hp, elem, link) +/** + * Dump all ring pointers to STDERR, starting with the given element and + * looping all the way around the ring back to that element. Aborts if + * an inconsistency is found. + * (This is a no-op unless APR_RING_DEBUG is defined.) + * @param ep The element + * @param elem The name of the element struct + * @param link The name of the APR_RING_ENTRY in the element struct + * @param msg Descriptive message + */ +#define APR_RING_CHECK_ELEM(ep, elem, link, msg) +/** + * Loops around a ring, starting with the given element, and checks all + * the pointers for consistency. Pops an assertion if any inconsistency + * is found. Same idea as APR_RING_CHECK_ELEM() except that it's silent + * if all is well. + * (This is a no-op unless APR_RING_DEBUG is defined.) + * @param ep The element + * @param elem The name of the element struct + * @param link The name of the APR_RING_ENTRY in the element struct + */ +#define APR_RING_CHECK_ELEM_CONSISTENCY(ep, elem, link) +#endif + +/** @} */ + +#endif /* !APR_RING_H */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_shm.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_shm.h new file mode 100644 index 00000000..5373f6a7 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_shm.h @@ -0,0 +1,127 @@ +/* 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. + */ + +#ifndef APR_SHM_H +#define APR_SHM_H + +/** + * @file apr_shm.h + * @brief APR Shared Memory Routines + */ + +#include "apr.h" +#include "apr_pools.h" +#include "apr_errno.h" + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/** + * @defgroup apr_shm Shared Memory Routines + * @ingroup APR + * @{ + */ + +/** + * Private, platform-specific data struture representing a shared memory + * segment. + */ +typedef struct apr_shm_t apr_shm_t; + +/** + * Create and make accessable a shared memory segment. + * @param m The shared memory structure to create. + * @param reqsize The desired size of the segment. + * @param filename The file to use for shared memory on platforms that + * require it. + * @param pool the pool from which to allocate the shared memory + * structure. + * @remark A note about Anonymous vs. Named shared memory segments: + * Not all plaforms support anonymous shared memory segments, but in + * some cases it is prefered over other types of shared memory + * implementations. Passing a NULL 'file' parameter to this function + * will cause the subsystem to use anonymous shared memory segments. + * If such a system is not available, APR_ENOTIMPL is returned. + * @remark A note about allocation sizes: + * On some platforms it is necessary to store some metainformation + * about the segment within the actual segment. In order to supply + * the caller with the requested size it may be necessary for the + * implementation to request a slightly greater segment length + * from the subsystem. In all cases, the apr_shm_baseaddr_get() + * function will return the first usable byte of memory. + * + */ +APR_DECLARE(apr_status_t) apr_shm_create(apr_shm_t **m, + apr_size_t reqsize, + const char *filename, + apr_pool_t *pool); + +/** + * Destroy a shared memory segment and associated memory. + * @param m The shared memory segment structure to destroy. + */ +APR_DECLARE(apr_status_t) apr_shm_destroy(apr_shm_t *m); + +/** + * Attach to a shared memory segment that was created + * by another process. + * @param m The shared memory structure to create. + * @param filename The file used to create the original segment. + * (This MUST match the original filename.) + * @param pool the pool from which to allocate the shared memory + * structure for this process. + */ +APR_DECLARE(apr_status_t) apr_shm_attach(apr_shm_t **m, + const char *filename, + apr_pool_t *pool); + +/** + * Detach from a shared memory segment without destroying it. + * @param m The shared memory structure representing the segment + * to detach from. + */ +APR_DECLARE(apr_status_t) apr_shm_detach(apr_shm_t *m); + +/** + * Retrieve the base address of the shared memory segment. + * NOTE: This address is only usable within the callers address + * space, since this API does not guarantee that other attaching + * processes will maintain the same address mapping. + * @param m The shared memory segment from which to retrieve + * the base address. + */ +APR_DECLARE(void *) apr_shm_baseaddr_get(const apr_shm_t *m); + +/** + * Retrieve the length of a shared memory segment in bytes. + * @param m The shared memory segment from which to retrieve + * the segment length. + */ +APR_DECLARE(apr_size_t) apr_shm_size_get(const apr_shm_t *m); + +/** + * Get the pool used by this shared memory segment. + */ +APR_POOL_DECLARE_ACCESSOR(shm); + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* APR_SHM_T */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_signal.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_signal.h new file mode 100644 index 00000000..7f4940a0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_signal.h @@ -0,0 +1,98 @@ +/* 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. + */ + +#ifndef APR_SIGNAL_H +#define APR_SIGNAL_H + +/** + * @file apr_signal.h + * @brief APR Signal Handling + */ + +#include "apr.h" +#include "apr_pools.h" + +#if APR_HAVE_SIGNAL_H +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/** + * @defgroup apr_signal Handling + * @ingroup APR + * @{ + */ + +#if APR_HAVE_SIGACTION || defined(DOXYGEN) + +#if defined(DARWIN) && !defined(__cplusplus) && !defined(_ANSI_SOURCE) +/* work around Darwin header file bugs + * http://www.opensource.apple.com/bugs/X/BSD%20Kernel/2657228.html + */ +#undef SIG_DFL +#undef SIG_IGN +#undef SIG_ERR +#define SIG_DFL (void (*)(int))0 +#define SIG_IGN (void (*)(int))1 +#define SIG_ERR (void (*)(int))-1 +#endif + +/** Function prototype for signal handlers */ +typedef void apr_sigfunc_t(int); + +/** + * Set the signal handler function for a given signal + * @param signo The signal (eg... SIGWINCH) + * @param func the function to get called + */ +APR_DECLARE(apr_sigfunc_t *) apr_signal(int signo, apr_sigfunc_t * func); + +#if defined(SIG_IGN) && !defined(SIG_ERR) +#define SIG_ERR ((apr_sigfunc_t *) -1) +#endif + +#else /* !APR_HAVE_SIGACTION */ +#define apr_signal(a, b) signal(a, b) +#endif + + +/** + * Get the description for a specific signal number + * @param signum The signal number + * @return The description of the signal + */ +APR_DECLARE(const char *) apr_signal_description_get(int signum); + +/** @deprecated @see apr_signal_description_get */ +APR_DECLARE(const char *) apr_signal_get_description(int signum); + +/** + * APR-private function for initializing the signal package + * @internal + * @param pglobal The internal, global pool + */ +void apr_signal_init(apr_pool_t *pglobal); + +/** @} */ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* APR_SIGNAL_H */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_strings.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_strings.h new file mode 100644 index 00000000..24cfbdf8 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_strings.h @@ -0,0 +1,337 @@ +/* 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. + */ + +/* Portions of this file are covered by */ +/* -*- mode: c; c-file-style: "k&r" -*- + + strnatcmp.c -- Perform 'natural order' comparisons of strings in C. + Copyright (C) 2000 by Martin Pool + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef APR_STRINGS_H +#define APR_STRINGS_H + +/** + * @file apr_strings.h + * @brief APR Strings library + */ + +#include "apr.h" +#include "apr_errno.h" +#include "apr_pools.h" +#define APR_WANT_IOVEC +#include "apr_want.h" + +#if APR_HAVE_STDARG_H +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/** + * @defgroup apr_strings String routines + * @ingroup APR + * @{ + */ + +/** + * Do a natural order comparison of two strings. + * @param a The first string to compare + * @param b The second string to compare + * @return Either <0, 0, or >0. If the first string is less than the second + * this returns <0, if they are equivalent it returns 0, and if the + * first string is greater than second string it retuns >0. + */ +APR_DECLARE(int) apr_strnatcmp(char const *a, char const *b); + +/** + * Do a natural order comparison of two strings ignoring the case of the + * strings. + * @param a The first string to compare + * @param b The second string to compare + * @return Either <0, 0, or >0. If the first string is less than the second + * this returns <0, if they are equivalent it returns 0, and if the + * first string is greater than second string it retuns >0. + */ +APR_DECLARE(int) apr_strnatcasecmp(char const *a, char const *b); + +/** + * duplicate a string into memory allocated out of a pool + * @param p The pool to allocate out of + * @param s The string to duplicate + * @return The new string + */ +APR_DECLARE(char *) apr_pstrdup(apr_pool_t *p, const char *s); + +/** + * Create a null-terminated string by making a copy of a sequence + * of characters and appending a null byte + * @param p The pool to allocate out of + * @param s The block of characters to duplicate + * @param n The number of characters to duplicate + * @return The new string + * @remark This is a faster alternative to apr_pstrndup, for use + * when you know that the string being duplicated really + * has 'n' or more characters. If the string might contain + * fewer characters, use apr_pstrndup. + */ +APR_DECLARE(char *) apr_pstrmemdup(apr_pool_t *p, const char *s, apr_size_t n); + +/** + * Duplicate at most n characters of a string into memory allocated + * out of a pool; the new string will be NUL-terminated + * @param p The pool to allocate out of + * @param s The string to duplicate + * @param n The maximum number of characters to duplicate + * @return The new string + * @remark The amount of memory allocated from the pool is the length + * of the returned string including the NUL terminator + */ +APR_DECLARE(char *) apr_pstrndup(apr_pool_t *p, const char *s, apr_size_t n); + +/** + * Duplicate a block of memory. + * + * @param p The pool to allocate from + * @param m The memory to duplicate + * @param n The number of bytes to duplicate + * @return The new block of memory + */ +APR_DECLARE(void *) apr_pmemdup(apr_pool_t *p, const void *m, apr_size_t n); + +/** + * Concatenate multiple strings, allocating memory out a pool + * @param p The pool to allocate out of + * @param ... The strings to concatenate. The final string must be NULL + * @return The new string + */ +APR_DECLARE_NONSTD(char *) apr_pstrcat(apr_pool_t *p, ...); + +/** + * Concatenate multiple strings specified in a writev-style vector + * @param p The pool from which to allocate + * @param vec The strings to concatenate + * @param nvec The number of strings to concatenate + * @param nbytes (output) strlen of new string (pass in NULL to omit) + * @return The new string + */ +APR_DECLARE(char *) apr_pstrcatv(apr_pool_t *p, const struct iovec *vec, + apr_size_t nvec, apr_size_t *nbytes); + +/** + * printf-style style printing routine. The data is output to a string + * allocated from a pool + * @param p The pool to allocate out of + * @param fmt The format of the string + * @param ap The arguments to use while printing the data + * @return The new string + */ +APR_DECLARE(char *) apr_pvsprintf(apr_pool_t *p, const char *fmt, va_list ap); + +/** + * printf-style style printing routine. The data is output to a string + * allocated from a pool + * @param p The pool to allocate out of + * @param fmt The format of the string + * @param ... The arguments to use while printing the data + * @return The new string + */ +APR_DECLARE_NONSTD(char *) apr_psprintf(apr_pool_t *p, const char *fmt, ...) + __attribute__((format(printf,2,3))); + +/** + * copy n characters from src to dst + * @param dst The destination string + * @param src The source string + * @param dst_size The space available in dst; dst always receives + * null-termination, so if src is longer than + * dst_size, the actual number of characters copied is + * dst_size - 1. + * @remark + *
    + * We re-implement this function to implement these specific changes:
    + *       1) strncpy() doesn't always null terminate and we want it to.
    + *       2) strncpy() null fills, which is bogus, esp. when copy 8byte strings
    + *          into 8k blocks.
    + *       3) Instead of returning the pointer to the beginning of the
    + *          destination string, we return a pointer to the terminating null
    + *          to allow us to check for truncation.
    + * 
    + */ +APR_DECLARE(char *) apr_cpystrn(char *dst, const char *src, + apr_size_t dst_size); + +/** + * Strip spaces from a string + * @param dest The destination string. It is okay to modify the string + * in place. Namely dest == src + * @param src The string to rid the spaces from. + */ +APR_DECLARE(char *) apr_collapse_spaces(char *dest, const char *src); + +/** + * Convert the arguments to a program from one string to an array of + * strings terminated by a NULL pointer + * @param arg_str The arguments to convert + * @param argv_out Output location. This is a pointer to an array of strings. + * @param token_context Pool to use. + */ +APR_DECLARE(apr_status_t) apr_tokenize_to_argv(const char *arg_str, + char ***argv_out, + apr_pool_t *token_context); + +/** + * Split a string into separate null-terminated tokens. The tokens are + * delimited in the string by one or more characters from the sep + * argument. + * @param str The string to separate; this should be specified on the + * first call to apr_strtok() for a given string, and NULL + * on subsequent calls. + * @param sep The set of delimiters + * @param last Internal state saved by apr_strtok() between calls. + * @return The next token from the string + */ +APR_DECLARE(char *) apr_strtok(char *str, const char *sep, char **last); + +/** + * @defgroup APR_Strings_Snprintf snprintf implementations + * @warning + * These are snprintf implementations based on apr_vformatter(). + * + * Note that various standards and implementations disagree on the return + * value of snprintf, and side-effects due to %n in the formatting string. + * apr_snprintf (and apr_vsnprintf) behaves as follows: + * + * Process the format string until the entire string is exhausted, or + * the buffer fills. If the buffer fills then stop processing immediately + * (so no further %n arguments are processed), and return the buffer + * length. In all cases the buffer is NUL terminated. It will return the + * number of characters inserted into the buffer, not including the + * terminating NUL. As a special case, if len is 0, apr_snprintf will + * return the number of characters that would have been inserted if + * the buffer had been infinite (in this case, *buffer can be NULL) + * + * In no event does apr_snprintf return a negative number. + * @{ + */ + +/** + * snprintf routine based on apr_vformatter. This means it understands the + * same extensions. + * @param buf The buffer to write to + * @param len The size of the buffer + * @param format The format string + * @param ... The arguments to use to fill out the format string. + */ +APR_DECLARE_NONSTD(int) apr_snprintf(char *buf, apr_size_t len, + const char *format, ...) + __attribute__((format(printf,3,4))); + +/** + * vsnprintf routine based on apr_vformatter. This means it understands the + * same extensions. + * @param buf The buffer to write to + * @param len The size of the buffer + * @param format The format string + * @param ap The arguments to use to fill out the format string. + */ +APR_DECLARE(int) apr_vsnprintf(char *buf, apr_size_t len, const char *format, + va_list ap); +/** @} */ + +/** + * create a string representation of an int, allocated from a pool + * @param p The pool from which to allocate + * @param n The number to format + * @return The string representation of the number + */ +APR_DECLARE(char *) apr_itoa(apr_pool_t *p, int n); + +/** + * create a string representation of a long, allocated from a pool + * @param p The pool from which to allocate + * @param n The number to format + * @return The string representation of the number + */ +APR_DECLARE(char *) apr_ltoa(apr_pool_t *p, long n); + +/** + * create a string representation of an apr_off_t, allocated from a pool + * @param p The pool from which to allocate + * @param n The number to format + * @return The string representation of the number + */ +APR_DECLARE(char *) apr_off_t_toa(apr_pool_t *p, apr_off_t n); + +/** + * parse a numeric string into a 64-bit numeric value + * @param buf The string to parse. It may contain optional whitespace, + * followed by an optional '+' (positive, default) or '-' (negative) + * character, followed by an optional '0x' prefix if base is 0 or 16, + * followed by numeric digits appropriate for base. + * @param end A pointer to the end of the valid character in buf. If + * not nil, it is set to the first invalid character in buf. + * @param base A numeric base in the range between 2 and 36 inclusive, + * or 0. If base is zero, buf will be treated as base ten unless its + * digits are prefixed with '0x', in which case it will be treated as + * base 16. + * @return The numeric value of the string. + */ +APR_DECLARE(apr_int64_t) apr_strtoi64(const char *buf, char **end, int base); + +/** + * parse a base-10 numeric string into a 64-bit numeric value. + * Equivalent to apr_strtoi64(buf, (char**)NULL, 10). + * @param buf The string to parse + * @return The numeric value of the string + */ +APR_DECLARE(apr_int64_t) apr_atoi64(const char *buf); + +/** + * Format a binary size (magnitiudes are 2^10 rather than 10^3) from an apr_off_t, + * as bytes, K, M, T, etc, to a four character compacted human readable string. + * @param size The size to format + * @param buf The 5 byte text buffer (counting the trailing null) + * @return The buf passed to apr_strfsize() + * @remark All negative sizes report ' - ', apr_strfsize only formats positive values. + */ +APR_DECLARE(char *) apr_strfsize(apr_off_t size, char *buf); + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* !APR_STRINGS_H */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_support.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_support.h new file mode 100644 index 00000000..ee31860f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_support.h @@ -0,0 +1,51 @@ +/* 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. + */ + +#ifndef APR_SUPPORT_H +#define APR_SUPPORT_H + +/** + * @file apr_support.h + * @brief APR Support functions + */ + +#include "apr.h" +#include "apr_network_io.h" +#include "apr_file_io.h" + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/** + * @defgroup apr_support Internal APR support functions + * @ingroup APR + * @{ + */ + +/** + * Wait for IO to occur or timeout. + */ +apr_status_t apr_wait_for_io_or_timeout(apr_file_t *f, apr_socket_t *s, + int for_read); + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* ! APR_SUPPORT_H */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_tables.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_tables.h new file mode 100644 index 00000000..f286b5c7 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_tables.h @@ -0,0 +1,422 @@ +/* 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. + */ + +#ifndef APR_TABLES_H +#define APR_TABLES_H + +/** + * @file apr_tables.h + * @brief APR Table library + */ + +#include "apr.h" +#include "apr_pools.h" + +#if APR_HAVE_STDARG_H +#include /* for va_list */ +#endif + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/** + * @defgroup apr_tables Table and Array Functions + * @ingroup APR + * Tables are used to store entirely opaque structures + * for applications, while Arrays are usually used to + * deal with string lists. + * @{ + */ + +/** the table abstract data type */ +typedef struct apr_table_t apr_table_t; + +/** @see apr_array_header_t */ +typedef struct apr_array_header_t apr_array_header_t; + +/** An opaque array type */ +struct apr_array_header_t { + /** The pool the array is allocated out of */ + apr_pool_t *pool; + /** The amount of memory allocated for each element of the array */ + int elt_size; + /** The number of active elements in the array */ + int nelts; + /** The number of elements allocated in the array */ + int nalloc; + /** The elements in the array */ + char *elts; +}; + +/** + * The (opaque) structure for string-content tables. + */ +typedef struct apr_table_entry_t apr_table_entry_t; + +/** The type for each entry in a string-content table */ +struct apr_table_entry_t { + /** The key for the current table entry */ + char *key; /* maybe NULL in future; + * check when iterating thru table_elts + */ + /** The value for the current table entry */ + char *val; + + /** A checksum for the key, for use by the apr_table internals */ + apr_uint32_t key_checksum; +}; + +/** + * Get the elements from a table + * @param t The table + * @return An array containing the contents of the table + */ +APR_DECLARE(const apr_array_header_t *) apr_table_elts(const apr_table_t *t); + +/** + * Determine if the table is empty + * @param t The table to check + * @return True if empty, False otherwise + */ +APR_DECLARE(int) apr_is_empty_table(const apr_table_t *t); + +/** + * Determine if the array is empty + * @param a The array to check + * @return True if empty, False otherwise + */ +APR_DECLARE(int) apr_is_empty_array(const apr_array_header_t *a); + +/** + * Create an array + * @param p The pool to allocate the memory out of + * @param nelts the number of elements in the initial array + * @param elt_size The size of each element in the array. + * @return The new array + */ +APR_DECLARE(apr_array_header_t *) apr_array_make(apr_pool_t *p, + int nelts, int elt_size); + +/** + * Add a new element to an array + * @param arr The array to add an element to. + * @return Location for the new element in the array. + * @remark If there are no free spots in the array, then this function will + * allocate new space for the new element. + */ +APR_DECLARE(void *) apr_array_push(apr_array_header_t *arr); + +/** + * Remove an element from an array + * @param arr The array to remove an element from. + * @return Location of the element in the array. + * @remark If there are no elements in the array, NULL is returned. + */ +APR_DECLARE(void *) apr_array_pop(apr_array_header_t *arr); + +/** + * Concatenate two arrays together + * @param dst The destination array, and the one to go first in the combined + * array + * @param src The source array to add to the destination array + */ +APR_DECLARE(void) apr_array_cat(apr_array_header_t *dst, + const apr_array_header_t *src); + +/** + * Copy the entire array + * @param p The pool to allocate the copy of the array out of + * @param arr The array to copy + * @return An exact copy of the array passed in + * @remark The alternate apr_array_copy_hdr copies only the header, and arranges + * for the elements to be copied if (and only if) the code subsequently + * does a push or arraycat. + */ +APR_DECLARE(apr_array_header_t *) apr_array_copy(apr_pool_t *p, + const apr_array_header_t *arr); +/** + * Copy the headers of the array, and arrange for the elements to be copied if + * and only if the code subsequently does a push or arraycat. + * @param p The pool to allocate the copy of the array out of + * @param arr The array to copy + * @return An exact copy of the array passed in + * @remark The alternate apr_array_copy copies the *entire* array. + */ +APR_DECLARE(apr_array_header_t *) apr_array_copy_hdr(apr_pool_t *p, + const apr_array_header_t *arr); + +/** + * Append one array to the end of another, creating a new array in the process. + * @param p The pool to allocate the new array out of + * @param first The array to put first in the new array. + * @param second The array to put second in the new array. + * @return A new array containing the data from the two arrays passed in. +*/ +APR_DECLARE(apr_array_header_t *) apr_array_append(apr_pool_t *p, + const apr_array_header_t *first, + const apr_array_header_t *second); + +/** + * Generates a new string from the apr_pool_t containing the concatenated + * sequence of substrings referenced as elements within the array. The string + * will be empty if all substrings are empty or null, or if there are no + * elements in the array. If sep is non-NUL, it will be inserted between + * elements as a separator. + * @param p The pool to allocate the string out of + * @param arr The array to generate the string from + * @param sep The separator to use + * @return A string containing all of the data in the array. + */ +APR_DECLARE(char *) apr_array_pstrcat(apr_pool_t *p, + const apr_array_header_t *arr, + const char sep); + +/** + * Make a new table + * @param p The pool to allocate the pool out of + * @param nelts The number of elements in the initial table. + * @return The new table. + * @warning This table can only store text data + */ +APR_DECLARE(apr_table_t *) apr_table_make(apr_pool_t *p, int nelts); + +/** + * Create a new table and copy another table into it + * @param p The pool to allocate the new table out of + * @param t The table to copy + * @return A copy of the table passed in + */ +APR_DECLARE(apr_table_t *) apr_table_copy(apr_pool_t *p, + const apr_table_t *t); + +/** + * Delete all of the elements from a table + * @param t The table to clear + */ +APR_DECLARE(void) apr_table_clear(apr_table_t *t); + +/** + * Get the value associated with a given key from the table. After this call, + * The data is still in the table + * @param t The table to search for the key + * @param key The key to search for + * @return The value associated with the key + */ +APR_DECLARE(const char *) apr_table_get(const apr_table_t *t, const char *key); + +/** + * Add a key/value pair to a table, if another element already exists with the + * same key, this will over-write the old data. + * @param t The table to add the data to. + * @param key The key fo use + * @param val The value to add + * @remark When adding data, this function makes a copy of both the key and the + * value. + */ +APR_DECLARE(void) apr_table_set(apr_table_t *t, const char *key, + const char *val); + +/** + * Add a key/value pair to a table, if another element already exists with the + * same key, this will over-write the old data. + * @param t The table to add the data to. + * @param key The key to use + * @param val The value to add + * @warning When adding data, this function does not make a copy of the key or + * the value, so care should be taken to ensure that the values will + * not change after they have been added.. + */ +APR_DECLARE(void) apr_table_setn(apr_table_t *t, const char *key, + const char *val); + +/** + * Remove data from the table + * @param t The table to remove data from + * @param key The key of the data being removed + */ +APR_DECLARE(void) apr_table_unset(apr_table_t *t, const char *key); + +/** + * Add data to a table by merging the value with data that has already been + * stored + * @param t The table to search for the data + * @param key The key to merge data for + * @param val The data to add + * @remark If the key is not found, then this function acts like apr_table_add + */ +APR_DECLARE(void) apr_table_merge(apr_table_t *t, const char *key, + const char *val); + +/** + * Add data to a table by merging the value with data that has already been + * stored + * @param t The table to search for the data + * @param key The key to merge data for + * @param val The data to add + * @remark If the key is not found, then this function acts like apr_table_addn + */ +APR_DECLARE(void) apr_table_mergen(apr_table_t *t, const char *key, + const char *val); + +/** + * Add data to a table, regardless of whether there is another element with the + * same key. + * @param t The table to add to + * @param key The key to use + * @param val The value to add. + * @remark When adding data, this function makes a copy of both the key and the + * value. + */ +APR_DECLARE(void) apr_table_add(apr_table_t *t, const char *key, + const char *val); + +/** + * Add data to a table, regardless of whether there is another element with the + * same key. + * @param t The table to add to + * @param key The key to use + * @param val The value to add. + * @remark When adding data, this function does not make a copy of the key or the + * value, so care should be taken to ensure that the values will not + * change after they have been added.. + */ +APR_DECLARE(void) apr_table_addn(apr_table_t *t, const char *key, + const char *val); + +/** + * Merge two tables into one new table + * @param p The pool to use for the new table + * @param overlay The first table to put in the new table + * @param base The table to add at the end of the new table + * @return A new table containing all of the data from the two passed in + */ +APR_DECLARE(apr_table_t *) apr_table_overlay(apr_pool_t *p, + const apr_table_t *overlay, + const apr_table_t *base); + +/** + * Declaration prototype for the iterator callback function of apr_table_do() + * and apr_table_vdo(). + * @param rec The data passed as the first argument to apr_table_[v]do() + * @param key The key from this iteration of the table + * @param value The value from this iteration of the table + * @remark Iteration continues while this callback function returns non-zero. + * To export the callback function for apr_table_[v]do() it must be declared + * in the _NONSTD convention. + */ +typedef int (apr_table_do_callback_fn_t)(void *rec, const char *key, + const char *value); + +/** + * Iterate over a table running the provided function once for every + * element in the table. If there is data passed in as a vararg, then the + * function is only run on those elements whose key matches something in + * the vararg. If the vararg is NULL, then every element is run through the + * function. Iteration continues while the function returns non-zero. + * @param comp The function to run + * @param rec The data to pass as the first argument to the function + * @param t The table to iterate over + * @param ... The vararg. If this is NULL, then all elements in the table are + * run through the function, otherwise only those whose key matches + * are run. + * @return FALSE if one of the comp() iterations returned zero; TRUE if all + * iterations returned non-zero + * @see apr_table_do_callback_fn_t + */ +APR_DECLARE_NONSTD(int) apr_table_do(apr_table_do_callback_fn_t *comp, + void *rec, const apr_table_t *t, ...); + +/** + * Iterate over a table running the provided function once for every + * element in the table. If there is data passed in as a vararg, then the + * function is only run on those element's whose key matches something in + * the vararg. If the vararg is NULL, then every element is run through the + * function. Iteration continues while the function returns non-zero. + * @param comp The function to run + * @param rec The data to pass as the first argument to the function + * @param t The table to iterate over + * @param vp The vararg table. If this is NULL, then all elements in the + * table are run through the function, otherwise only those + * whose key matches are run. + * @return FALSE if one of the comp() iterations returned zero; TRUE if all + * iterations returned non-zero + * @see apr_table_do_callback_fn_t + */ +APR_DECLARE(int) apr_table_vdo(apr_table_do_callback_fn_t *comp, + void *rec, const apr_table_t *t, va_list vp); + +/** flag for overlap to use apr_table_setn */ +#define APR_OVERLAP_TABLES_SET (0) +/** flag for overlap to use apr_table_mergen */ +#define APR_OVERLAP_TABLES_MERGE (1) +/** + * For each element in table b, either use setn or mergen to add the data + * to table a. Which method is used is determined by the flags passed in. + * @param a The table to add the data to. + * @param b The table to iterate over, adding its data to table a + * @param flags How to add the table to table a. One of: + * APR_OVERLAP_TABLES_SET Use apr_table_setn + * APR_OVERLAP_TABLES_MERGE Use apr_table_mergen + * @remark This function is highly optimized, and uses less memory and CPU cycles + * than a function that just loops through table b calling other functions. + */ +/** + *
    + * Conceptually, apr_table_overlap does this:
    + *
    + *  apr_array_header_t *barr = apr_table_elts(b);
    + *  apr_table_entry_t *belt = (apr_table_entry_t *)barr->elts;
    + *  int i;
    + *
    + *  for (i = 0; i < barr->nelts; ++i) {
    + *      if (flags & APR_OVERLAP_TABLES_MERGE) {
    + *          apr_table_mergen(a, belt[i].key, belt[i].val);
    + *      }
    + *      else {
    + *          apr_table_setn(a, belt[i].key, belt[i].val);
    + *      }
    + *  }
    + *
    + *  Except that it is more efficient (less space and cpu-time) especially
    + *  when b has many elements.
    + *
    + *  Notice the assumptions on the keys and values in b -- they must be
    + *  in an ancestor of a's pool.  In practice b and a are usually from
    + *  the same pool.
    + * 
    + */ + +APR_DECLARE(void) apr_table_overlap(apr_table_t *a, const apr_table_t *b, + unsigned flags); + +/** + * Eliminate redunandant entries in a table by either overwriting + * or merging duplicates + * + * @param t Table. + * @param flags APR_OVERLAP_TABLES_MERGE to merge, or + * APR_OVERLAP_TABLES_SET to overwrite + */ +APR_DECLARE(void) apr_table_compress(apr_table_t *t, unsigned flags); + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* ! APR_TABLES_H */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_thread_cond.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_thread_cond.h new file mode 100644 index 00000000..520fb309 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_thread_cond.h @@ -0,0 +1,128 @@ +/* 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. + */ + +#ifndef APR_THREAD_COND_H +#define APR_THREAD_COND_H + +/** + * @file apr_thread_cond.h + * @brief APR Condition Variable Routines + */ + +#include "apr.h" +#include "apr_pools.h" +#include "apr_errno.h" +#include "apr_time.h" +#include "apr_thread_mutex.h" + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#if APR_HAS_THREADS || defined(DOXYGEN) + +/** + * @defgroup apr_thread_cond Condition Variable Routines + * @ingroup APR + * @{ + */ + +/** Opaque structure for thread condition variables */ +typedef struct apr_thread_cond_t apr_thread_cond_t; + +/** + * Create and initialize a condition variable that can be used to signal + * and schedule threads in a single process. + * @param cond the memory address where the newly created condition variable + * will be stored. + * @param pool the pool from which to allocate the mutex. + */ +APR_DECLARE(apr_status_t) apr_thread_cond_create(apr_thread_cond_t **cond, + apr_pool_t *pool); + +/** + * Put the active calling thread to sleep until signaled to wake up. Each + * condition variable must be associated with a mutex, and that mutex must + * be locked before calling this function, or the behavior will be + * undefined. As the calling thread is put to sleep, the given mutex + * will be simultaneously released; and as this thread wakes up the lock + * is again simultaneously acquired. + * @param cond the condition variable on which to block. + * @param mutex the mutex that must be locked upon entering this function, + * is released while the thread is asleep, and is again acquired before + * returning from this function. + */ +APR_DECLARE(apr_status_t) apr_thread_cond_wait(apr_thread_cond_t *cond, + apr_thread_mutex_t *mutex); + +/** + * Put the active calling thread to sleep until signaled to wake up or + * the timeout is reached. Each condition variable must be associated + * with a mutex, and that mutex must be locked before calling this + * function, or the behavior will be undefined. As the calling thread + * is put to sleep, the given mutex will be simultaneously released; + * and as this thread wakes up the lock is again simultaneously acquired. + * @param cond the condition variable on which to block. + * @param mutex the mutex that must be locked upon entering this function, + * is released while the thread is asleep, and is again acquired before + * returning from this function. + * @param timeout The amount of time in microseconds to wait. This is + * a maximum, not a minimum. If the condition is signaled, we + * will wake up before this time, otherwise the error APR_TIMEUP + * is returned. + */ +APR_DECLARE(apr_status_t) apr_thread_cond_timedwait(apr_thread_cond_t *cond, + apr_thread_mutex_t *mutex, + apr_interval_time_t timeout); + +/** + * Signals a singla thread, if one exists, that is blocking on the given + * condition variable. That thread is then scheduled to wake up and acquire + * the associated mutex. Although it is not required, if predictible schedule + * is desired, that mutex must be locked while calling this function. + * @param cond the condition variable on which to produce the signal. + */ +APR_DECLARE(apr_status_t) apr_thread_cond_signal(apr_thread_cond_t *cond); + +/** + * Signals all threads blocking on the given condition variable. + * Each thread that was signaled is then schedule to wake up and acquire + * the associated mutex. This will happen in a serialized manner. + * @param cond the condition variable on which to produce the broadcast. + */ +APR_DECLARE(apr_status_t) apr_thread_cond_broadcast(apr_thread_cond_t *cond); + +/** + * Destroy the condition variable and free the associated memory. + * @param cond the condition variable to destroy. + */ +APR_DECLARE(apr_status_t) apr_thread_cond_destroy(apr_thread_cond_t *cond); + +/** + * Get the pool used by this thread_cond. + * @return apr_pool_t the pool + */ +APR_POOL_DECLARE_ACCESSOR(thread_cond); + +#endif /* APR_HAS_THREADS */ + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* ! APR_THREAD_COND_H */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_thread_mutex.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_thread_mutex.h new file mode 100644 index 00000000..4596dce5 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_thread_mutex.h @@ -0,0 +1,110 @@ +/* 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. + */ + +#ifndef APR_THREAD_MUTEX_H +#define APR_THREAD_MUTEX_H + +/** + * @file apr_thread_mutex.h + * @brief APR Thread Mutex Routines + */ + +#include "apr.h" +#include "apr_errno.h" + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#if APR_HAS_THREADS || defined(DOXYGEN) + +/** + * @defgroup apr_thread_mutex Thread Mutex Routines + * @ingroup APR + * @{ + */ + +/** Opaque thread-local mutex structure */ +typedef struct apr_thread_mutex_t apr_thread_mutex_t; + +#define APR_THREAD_MUTEX_DEFAULT 0x0 /**< platform-optimal lock behavior */ +#define APR_THREAD_MUTEX_NESTED 0x1 /**< enable nested (recursive) locks */ +#define APR_THREAD_MUTEX_UNNESTED 0x2 /**< disable nested locks */ + +/* Delayed the include to avoid a circular reference */ +#include "apr_pools.h" + +/** + * Create and initialize a mutex that can be used to synchronize threads. + * @param mutex the memory address where the newly created mutex will be + * stored. + * @param flags Or'ed value of: + *
    + *           APR_THREAD_MUTEX_DEFAULT   platform-optimal lock behavior.
    + *           APR_THREAD_MUTEX_NESTED    enable nested (recursive) locks.
    + *           APR_THREAD_MUTEX_UNNESTED  disable nested locks (non-recursive).
    + * 
    + * @param pool the pool from which to allocate the mutex. + * @warning Be cautious in using APR_THREAD_MUTEX_DEFAULT. While this is the + * most optimial mutex based on a given platform's performance charateristics, + * it will behave as either a nested or an unnested lock. + */ +APR_DECLARE(apr_status_t) apr_thread_mutex_create(apr_thread_mutex_t **mutex, + unsigned int flags, + apr_pool_t *pool); +/** + * Acquire the lock for the given mutex. If the mutex is already locked, + * the current thread will be put to sleep until the lock becomes available. + * @param mutex the mutex on which to acquire the lock. + */ +APR_DECLARE(apr_status_t) apr_thread_mutex_lock(apr_thread_mutex_t *mutex); + +/** + * Attempt to acquire the lock for the given mutex. If the mutex has already + * been acquired, the call returns immediately with APR_EBUSY. Note: it + * is important that the APR_STATUS_IS_EBUSY(s) macro be used to determine + * if the return value was APR_EBUSY, for portability reasons. + * @param mutex the mutex on which to attempt the lock acquiring. + */ +APR_DECLARE(apr_status_t) apr_thread_mutex_trylock(apr_thread_mutex_t *mutex); + +/** + * Release the lock for the given mutex. + * @param mutex the mutex from which to release the lock. + */ +APR_DECLARE(apr_status_t) apr_thread_mutex_unlock(apr_thread_mutex_t *mutex); + +/** + * Destroy the mutex and free the memory associated with the lock. + * @param mutex the mutex to destroy. + */ +APR_DECLARE(apr_status_t) apr_thread_mutex_destroy(apr_thread_mutex_t *mutex); + +/** + * Get the pool used by this thread_mutex. + * @return apr_pool_t the pool + */ +APR_POOL_DECLARE_ACCESSOR(thread_mutex); + +#endif /* APR_HAS_THREADS */ + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* ! APR_THREAD_MUTEX_H */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_thread_proc.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_thread_proc.h new file mode 100644 index 00000000..be586040 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_thread_proc.h @@ -0,0 +1,772 @@ +/* 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. + */ + +#ifndef APR_THREAD_PROC_H +#define APR_THREAD_PROC_H + +/** + * @file apr_thread_proc.h + * @brief APR Thread and Process Library + */ + +#include "apr.h" +#include "apr_file_io.h" +#include "apr_pools.h" +#include "apr_errno.h" + +#if APR_HAVE_STRUCT_RLIMIT +#include +#include +#endif + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/** + * @defgroup apr_thread_proc Threads and Process Functions + * @ingroup APR + * @{ + */ + +typedef enum { + APR_SHELLCMD, /**< use the shell to invoke the program */ + APR_PROGRAM, /**< invoke the program directly, no copied env */ + APR_PROGRAM_ENV, /**< invoke the program, replicating our environment */ + APR_PROGRAM_PATH, /**< find program on PATH, use our environment */ + APR_SHELLCMD_ENV /**< use the shell to invoke the program, + * replicating our environment + */ +} apr_cmdtype_e; + +typedef enum { + APR_WAIT, /**< wait for the specified process to finish */ + APR_NOWAIT /**< do not wait -- just see if it has finished */ +} apr_wait_how_e; + +/* I am specifically calling out the values so that the macros below make + * more sense. Yes, I know I don't need to, but I am hoping this makes what + * I am doing more clear. If you want to add more reasons to exit, continue + * to use bitmasks. + */ +typedef enum { + APR_PROC_EXIT = 1, /**< process exited normally */ + APR_PROC_SIGNAL = 2, /**< process exited due to a signal */ + APR_PROC_SIGNAL_CORE = 4 /**< process exited and dumped a core file */ +} apr_exit_why_e; + +/** did we exit the process */ +#define APR_PROC_CHECK_EXIT(x) (x & APR_PROC_EXIT) +/** did we get a signal */ +#define APR_PROC_CHECK_SIGNALED(x) (x & APR_PROC_SIGNAL) +/** did we get core */ +#define APR_PROC_CHECK_CORE_DUMP(x) (x & APR_PROC_SIGNAL_CORE) + +/** @see apr_procattr_io_set */ +#define APR_NO_PIPE 0 + +/** @see apr_procattr_io_set */ +#define APR_FULL_BLOCK 1 +/** @see apr_procattr_io_set */ +#define APR_FULL_NONBLOCK 2 +/** @see apr_procattr_io_set */ +#define APR_PARENT_BLOCK 3 +/** @see apr_procattr_io_set */ +#define APR_CHILD_BLOCK 4 + +/** @see apr_procattr_limit_set */ +#define APR_LIMIT_CPU 0 +/** @see apr_procattr_limit_set */ +#define APR_LIMIT_MEM 1 +/** @see apr_procattr_limit_set */ +#define APR_LIMIT_NPROC 2 +/** @see apr_procattr_limit_set */ +#define APR_LIMIT_NOFILE 3 + +/** + * @defgroup APR_OC Other Child Flags + * @{ + */ +#define APR_OC_REASON_DEATH 0 /**< child has died, caller must call + * unregister still */ +#define APR_OC_REASON_UNWRITABLE 1 /**< write_fd is unwritable */ +#define APR_OC_REASON_RESTART 2 /**< a restart is occuring, perform + * any necessary cleanup (including + * sending a special signal to child) + */ +#define APR_OC_REASON_UNREGISTER 3 /**< unregister has been called, do + * whatever is necessary (including + * kill the child) */ +#define APR_OC_REASON_LOST 4 /**< somehow the child exited without + * us knowing ... buggy os? */ +#define APR_OC_REASON_RUNNING 5 /**< a health check is occuring, + * for most maintainence functions + * this is a no-op. + */ +/** @} */ + +/** The APR process type */ +typedef struct apr_proc_t { + /** The process ID */ + pid_t pid; + /** Parent's side of pipe to child's stdin */ + apr_file_t *in; + /** Parent's side of pipe to child's stdout */ + apr_file_t *out; + /** Parent's side of pipe to child's stdouterr */ + apr_file_t *err; +#if APR_HAS_PROC_INVOKED || defined(DOXYGEN) + /** Diagnositics/debugging string of the command invoked for + * this process [only present if APR_HAS_PROC_INVOKED is true] + * @remark Only enabled on Win32 by default. + * @bug This should either always or never be present in release + * builds - since it breaks binary compatibility. We may enable + * it always in APR 1.0 yet leave it undefined in most cases. + */ + char *invoked; +#endif +#if defined(WIN32) || defined(DOXYGEN) + /** (Win32 only) Creator's handle granting access to the process + * @remark This handle is closed and reset to NULL in every case + * corresponding to a waitpid() on Unix which returns the exit status. + * Therefore Win32 correspond's to Unix's zombie reaping characteristics + * and avoids potential handle leaks. + */ + HANDLE hproc; +#endif +} apr_proc_t; + +/** + * The prototype for APR child errfn functions. (See the description + * of apr_procattr_child_errfn_set() for more information.) + * It is passed the following parameters: + * @param pool Pool associated with the apr_proc_t. If your child + * error function needs user data, associate it with this + * pool. + * @param err APR error code describing the error + * @param description Text description of type of processing which failed + */ +typedef void (apr_child_errfn_t)(apr_pool_t *proc, apr_status_t err, + const char *description); + +/** Opaque Thread structure. */ +typedef struct apr_thread_t apr_thread_t; + +/** Opaque Thread attributes structure. */ +typedef struct apr_threadattr_t apr_threadattr_t; + +/** Opaque Process attributes structure. */ +typedef struct apr_procattr_t apr_procattr_t; + +/** Opaque control variable for one-time atomic variables. */ +typedef struct apr_thread_once_t apr_thread_once_t; + +/** Opaque thread private address space. */ +typedef struct apr_threadkey_t apr_threadkey_t; + +/** Opaque record of child process. */ +typedef struct apr_other_child_rec_t apr_other_child_rec_t; + +/** + * The prototype for any APR thread worker functions. + */ +typedef void *(APR_THREAD_FUNC *apr_thread_start_t)(apr_thread_t*, void*); + +typedef enum { + APR_KILL_NEVER, /**< process is never sent any signals */ + APR_KILL_ALWAYS, /**< process is sent SIGKILL on apr_pool_t cleanup */ + APR_KILL_AFTER_TIMEOUT, /**< SIGTERM, wait 3 seconds, SIGKILL */ + APR_JUST_WAIT, /**< wait forever for the process to complete */ + APR_KILL_ONLY_ONCE /**< send SIGTERM and then wait */ +} apr_kill_conditions_e; + +/* Thread Function definitions */ + +#if APR_HAS_THREADS + +/** + * Create and initialize a new threadattr variable + * @param new_attr The newly created threadattr. + * @param cont The pool to use + */ +APR_DECLARE(apr_status_t) apr_threadattr_create(apr_threadattr_t **new_attr, + apr_pool_t *cont); + +/** + * Set if newly created threads should be created in detached state. + * @param attr The threadattr to affect + * @param on Thread detach state on or off + */ +APR_DECLARE(apr_status_t) apr_threadattr_detach_set(apr_threadattr_t *attr, + apr_int32_t on); + +/** + * Get the detach state for this threadattr. + * @param attr The threadattr to reference + */ +APR_DECLARE(apr_status_t) apr_threadattr_detach_get(apr_threadattr_t *attr); + +/** + * Set the stack size of newly created threads. + * @param attr The threadattr to affect + * @param stacksize The stack size in bytes + */ +APR_DECLARE(apr_status_t) apr_threadattr_stacksize_set(apr_threadattr_t *attr, + apr_size_t stacksize); + +/** + * Create a new thread of execution + * @param new_thread The newly created thread handle. + * @param attr The threadattr to use to determine how to create the thread + * @param func The function to start the new thread in + * @param data Any data to be passed to the starting function + * @param cont The pool to use + */ +APR_DECLARE(apr_status_t) apr_thread_create(apr_thread_t **new_thread, + apr_threadattr_t *attr, + apr_thread_start_t func, + void *data, apr_pool_t *cont); + +/** + * stop the current thread + * @param thd The thread to stop + * @param retval The return value to pass back to any thread that cares + */ +APR_DECLARE(apr_status_t) apr_thread_exit(apr_thread_t *thd, + apr_status_t retval); + +/** + * block until the desired thread stops executing. + * @param retval The return value from the dead thread. + * @param thd The thread to join + */ +APR_DECLARE(apr_status_t) apr_thread_join(apr_status_t *retval, + apr_thread_t *thd); + +/** + * force the current thread to yield the processor + */ +APR_DECLARE(void) apr_thread_yield(void); + +/** + * Initialize the control variable for apr_thread_once. If this isn't + * called, apr_initialize won't work. + * @param control The control variable to initialize + * @param p The pool to allocate data from. + */ +APR_DECLARE(apr_status_t) apr_thread_once_init(apr_thread_once_t **control, + apr_pool_t *p); + +/** + * Run the specified function one time, regardless of how many threads + * call it. + * @param control The control variable. The same variable should + * be passed in each time the function is tried to be + * called. This is how the underlying functions determine + * if the function has ever been called before. + * @param func The function to call. + */ +APR_DECLARE(apr_status_t) apr_thread_once(apr_thread_once_t *control, + void (*func)(void)); + +/** + * detach a thread + * @param thd The thread to detach + */ +APR_DECLARE(apr_status_t) apr_thread_detach(apr_thread_t *thd); + +/** + * Return the pool associated with the current thread. + * @param data The user data associated with the thread. + * @param key The key to associate with the data + * @param thread The currently open thread. + */ +APR_DECLARE(apr_status_t) apr_thread_data_get(void **data, const char *key, + apr_thread_t *thread); + +/** + * Return the pool associated with the current thread. + * @param data The user data to associate with the thread. + * @param key The key to use for associating the data with the thread + * @param cleanup The cleanup routine to use when the thread is destroyed. + * @param thread The currently open thread. + */ +APR_DECLARE(apr_status_t) apr_thread_data_set(void *data, const char *key, + apr_status_t (*cleanup) (void *), + apr_thread_t *thread); + +/** + * Create and initialize a new thread private address space + * @param key The thread private handle. + * @param dest The destructor to use when freeing the private memory. + * @param cont The pool to use + */ +APR_DECLARE(apr_status_t) apr_threadkey_private_create(apr_threadkey_t **key, + void (*dest)(void *), + apr_pool_t *cont); + +/** + * Get a pointer to the thread private memory + * @param new_mem The data stored in private memory + * @param key The handle for the desired thread private memory + */ +APR_DECLARE(apr_status_t) apr_threadkey_private_get(void **new_mem, + apr_threadkey_t *key); + +/** + * Set the data to be stored in thread private memory + * @param priv The data to be stored in private memory + * @param key The handle for the desired thread private memory + */ +APR_DECLARE(apr_status_t) apr_threadkey_private_set(void *priv, + apr_threadkey_t *key); + +/** + * Free the thread private memory + * @param key The handle for the desired thread private memory + */ +APR_DECLARE(apr_status_t) apr_threadkey_private_delete(apr_threadkey_t *key); + +/** + * Return the pool associated with the current threadkey. + * @param data The user data associated with the threadkey. + * @param key The key associated with the data + * @param threadkey The currently open threadkey. + */ +APR_DECLARE(apr_status_t) apr_threadkey_data_get(void **data, const char *key, + apr_threadkey_t *threadkey); + +/** + * Return the pool associated with the current threadkey. + * @param data The data to set. + * @param key The key to associate with the data. + * @param cleanup The cleanup routine to use when the file is destroyed. + * @param threadkey The currently open threadkey. + */ +APR_DECLARE(apr_status_t) apr_threadkey_data_set(void *data, const char *key, + apr_status_t (*cleanup) (void *), + apr_threadkey_t *threadkey); + +#endif + +/** + * Create and initialize a new procattr variable + * @param new_attr The newly created procattr. + * @param cont The pool to use + */ +APR_DECLARE(apr_status_t) apr_procattr_create(apr_procattr_t **new_attr, + apr_pool_t *cont); + +/** + * Determine if any of stdin, stdout, or stderr should be linked to pipes + * when starting a child process. + * @param attr The procattr we care about. + * @param in Should stdin be a pipe back to the parent? + * @param out Should stdout be a pipe back to the parent? + * @param err Should stderr be a pipe back to the parent? + */ +APR_DECLARE(apr_status_t) apr_procattr_io_set(apr_procattr_t *attr, + apr_int32_t in, apr_int32_t out, + apr_int32_t err); + +/** + * Set the child_in and/or parent_in values to existing apr_file_t values. + * @param attr The procattr we care about. + * @param child_in apr_file_t value to use as child_in. Must be a valid file. + * @param parent_in apr_file_t value to use as parent_in. Must be a valid file. + * @remark This is NOT a required initializer function. This is + * useful if you have already opened a pipe (or multiple files) + * that you wish to use, perhaps persistently across multiple + * process invocations - such as a log file. You can save some + * extra function calls by not creating your own pipe since this + * creates one in the process space for you. + */ +APR_DECLARE(apr_status_t) apr_procattr_child_in_set(struct apr_procattr_t *attr, + apr_file_t *child_in, + apr_file_t *parent_in); + +/** + * Set the child_out and parent_out values to existing apr_file_t values. + * @param attr The procattr we care about. + * @param child_out apr_file_t value to use as child_out. Must be a valid file. + * @param parent_out apr_file_t value to use as parent_out. Must be a valid file. + * @remark This is NOT a required initializer function. This is + * useful if you have already opened a pipe (or multiple files) + * that you wish to use, perhaps persistently across multiple + * process invocations - such as a log file. + */ +APR_DECLARE(apr_status_t) apr_procattr_child_out_set(struct apr_procattr_t *attr, + apr_file_t *child_out, + apr_file_t *parent_out); + +/** + * Set the child_err and parent_err values to existing apr_file_t values. + * @param attr The procattr we care about. + * @param child_err apr_file_t value to use as child_err. Must be a valid file. + * @param parent_err apr_file_t value to use as parent_err. Must be a valid file. + * @remark This is NOT a required initializer function. This is + * useful if you have already opened a pipe (or multiple files) + * that you wish to use, perhaps persistently across multiple + * process invocations - such as a log file. + */ +APR_DECLARE(apr_status_t) apr_procattr_child_err_set(struct apr_procattr_t *attr, + apr_file_t *child_err, + apr_file_t *parent_err); + +/** + * Set which directory the child process should start executing in. + * @param attr The procattr we care about. + * @param dir Which dir to start in. By default, this is the same dir as + * the parent currently resides in, when the createprocess call + * is made. + */ +APR_DECLARE(apr_status_t) apr_procattr_dir_set(apr_procattr_t *attr, + const char *dir); + +/** + * Set what type of command the child process will call. + * @param attr The procattr we care about. + * @param cmd The type of command. One of: + *
    + *            APR_SHELLCMD     --  Anything that the shell can handle
    + *            APR_PROGRAM      --  Executable program   (default) 
    + *            APR_PROGRAM_ENV  --  Executable program, copy environment
    + *            APR_PROGRAM_PATH --  Executable program on PATH, copy env
    + * 
    + */ +APR_DECLARE(apr_status_t) apr_procattr_cmdtype_set(apr_procattr_t *attr, + apr_cmdtype_e cmd); + +/** + * Determine if the child should start in detached state. + * @param attr The procattr we care about. + * @param detach Should the child start in detached state? Default is no. + */ +APR_DECLARE(apr_status_t) apr_procattr_detach_set(apr_procattr_t *attr, + apr_int32_t detach); + +#if APR_HAVE_STRUCT_RLIMIT +/** + * Set the Resource Utilization limits when starting a new process. + * @param attr The procattr we care about. + * @param what Which limit to set, one of: + *
    + *                 APR_LIMIT_CPU
    + *                 APR_LIMIT_MEM
    + *                 APR_LIMIT_NPROC
    + *                 APR_LIMIT_NOFILE
    + * 
    + * @param limit Value to set the limit to. + */ +APR_DECLARE(apr_status_t) apr_procattr_limit_set(apr_procattr_t *attr, + apr_int32_t what, + struct rlimit *limit); +#endif + +/** + * Specify an error function to be called in the child process if APR + * encounters an error in the child prior to running the specified program. + * @param attr The procattr describing the child process to be created. + * @param errfn The function to call in the child process. + * @remark At the present time, it will only be called from apr_proc_create() + * on platforms where fork() is used. It will never be called on other + * platforms, on those platforms apr_proc_create() will return the error + * in the parent process rather than invoke the callback in the now-forked + * child process. + */ +APR_DECLARE(apr_status_t) apr_procattr_child_errfn_set(apr_procattr_t *attr, + apr_child_errfn_t *errfn); + +/** + * Specify that apr_proc_create() should do whatever it can to report + * failures to the caller of apr_proc_create(), rather than find out in + * the child. + * @param attr The procattr describing the child process to be created. + * @param chk Flag to indicate whether or not extra work should be done + * to try to report failures to the caller. + * @remark This flag only affects apr_proc_create() on platforms where + * fork() is used. This leads to extra overhead in the calling + * process, but that may help the application handle such + * errors more gracefully. + */ +APR_DECLARE(apr_status_t) apr_procattr_error_check_set(apr_procattr_t *attr, + apr_int32_t chk); + +/** + * Determine if the child should start in its own address space or using the + * current one from its parent + * @param attr The procattr we care about. + * @param addrspace Should the child start in its own address space? Default + * is no on NetWare and yes on other platforms. + */ +APR_DECLARE(apr_status_t) apr_procattr_addrspace_set(apr_procattr_t *attr, + apr_int32_t addrspace); + +#if APR_HAS_FORK +/** + * This is currently the only non-portable call in APR. This executes + * a standard unix fork. + * @param proc The resulting process handle. + * @param cont The pool to use. + */ +APR_DECLARE(apr_status_t) apr_proc_fork(apr_proc_t *proc, apr_pool_t *cont); +#endif + +/** + * Create a new process and execute a new program within that process. + * @param new_proc The resulting process handle. + * @param progname The program to run + * @param args the arguments to pass to the new program. The first + * one should be the program name. + * @param env The new environment table for the new process. This + * should be a list of NULL-terminated strings. This argument + * is ignored for APR_PROGRAM_ENV, APR_PROGRAM_PATH, and + * APR_SHELLCMD_ENV types of commands. + * @param attr the procattr we should use to determine how to create the new + * process + * @param cont The pool to use. + */ +APR_DECLARE(apr_status_t) apr_proc_create(apr_proc_t *new_proc, + const char *progname, + const char * const *args, + const char * const *env, + apr_procattr_t *attr, + apr_pool_t *cont); + +/** + * Wait for a child process to die + * @param proc The process handle that corresponds to the desired child process + * @param exitcode The returned exit status of the child, if a child process + * dies, or the signal that caused the child to die. + * On platforms that don't support obtaining this information, + * the status parameter will be returned as APR_ENOTIMPL. + * @param exitwhy Why the child died, the bitwise or of: + *
    + *            APR_PROC_EXIT         -- process terminated normally
    + *            APR_PROC_SIGNAL       -- process was killed by a signal
    + *            APR_PROC_SIGNAL_CORE  -- process was killed by a signal, and
    + *                                     generated a core dump.
    + * 
    + * @param waithow How should we wait. One of: + *
    + *            APR_WAIT   -- block until the child process dies.
    + *            APR_NOWAIT -- return immediately regardless of if the 
    + *                          child is dead or not.
    + * 
    + * @remark The childs status is in the return code to this process. It is one of: + *
    + *            APR_CHILD_DONE     -- child is no longer running.
    + *            APR_CHILD_NOTDONE  -- child is still running.
    + * 
    + */ +APR_DECLARE(apr_status_t) apr_proc_wait(apr_proc_t *proc, + int *exitcode, apr_exit_why_e *exitwhy, + apr_wait_how_e waithow); + +/** + * Wait for any current child process to die and return information + * about that child. + * @param proc Pointer to NULL on entry, will be filled out with child's + * information + * @param exitcode The returned exit status of the child, if a child process + * dies, or the signal that caused the child to die. + * On platforms that don't support obtaining this information, + * the status parameter will be returned as APR_ENOTIMPL. + * @param exitwhy Why the child died, the bitwise or of: + *
    + *            APR_PROC_EXIT         -- process terminated normally
    + *            APR_PROC_SIGNAL       -- process was killed by a signal
    + *            APR_PROC_SIGNAL_CORE  -- process was killed by a signal, and
    + *                                     generated a core dump.
    + * 
    + * @param waithow How should we wait. One of: + *
    + *            APR_WAIT   -- block until the child process dies.
    + *            APR_NOWAIT -- return immediately regardless of if the 
    + *                          child is dead or not.
    + * 
    + * @param p Pool to allocate child information out of. + * @bug Passing proc as a *proc rather than **proc was an odd choice + * for some platforms... this should be revisited in 1.0 + */ +APR_DECLARE(apr_status_t) apr_proc_wait_all_procs(apr_proc_t *proc, + int *exitcode, + apr_exit_why_e *exitwhy, + apr_wait_how_e waithow, + apr_pool_t *p); + +#define APR_PROC_DETACH_FOREGROUND 0 /**< Do not detach */ +#define APR_PROC_DETACH_DAEMONIZE 1 /**< Detach */ + +/** + * Detach the process from the controlling terminal. + * @param daemonize set to non-zero if the process should daemonize + * and become a background process, else it will + * stay in the foreground. + */ +APR_DECLARE(apr_status_t) apr_proc_detach(int daemonize); + +/** + * Register an other_child -- a child associated to its registered + * maintence callback. This callback is invoked when the process + * dies, is disconnected or disappears. + * @param proc The child process to register. + * @param maintenance maintenance is a function that is invoked with a + * reason and the data pointer passed here. + * @param data Opaque context data passed to the maintenance function. + * @param write_fd An fd that is probed for writing. If it is ever unwritable + * then the maintenance is invoked with reason + * OC_REASON_UNWRITABLE. + * @param p The pool to use for allocating memory. + * @bug write_fd duplicates the proc->out stream, it's really redundant + * and should be replaced in the APR 1.0 API with a bitflag of which + * proc->in/out/err handles should be health checked. + * @bug no platform currently tests the pipes health. + */ +APR_DECLARE(void) apr_proc_other_child_register(apr_proc_t *proc, + void (*maintenance) (int reason, + void *, + int status), + void *data, apr_file_t *write_fd, + apr_pool_t *p); + +/** + * Stop watching the specified other child. + * @param data The data to pass to the maintenance function. This is + * used to find the process to unregister. + * @warning Since this can be called by a maintenance function while we're + * scanning the other_children list, all scanners should protect + * themself by loading ocr->next before calling any maintenance + * function. + */ +APR_DECLARE(void) apr_proc_other_child_unregister(void *data); + +/** + * Notify the maintenance callback of a registered other child process + * that application has detected an event, such as death. + * @param proc The process to check + * @param reason The reason code to pass to the maintenance function + * @param status The status to pass to the maintenance function + * @remark An example of code using this behavior; + *
    + * rv = apr_proc_wait_all_procs(&proc, &exitcode, &status, APR_WAIT, p);
    + * if (APR_STATUS_IS_CHILD_DONE(rv)) {
    + * #if APR_HAS_OTHER_CHILD
    + *     if (apr_proc_other_child_alert(&proc, APR_OC_REASON_DEATH, status)
    + *             == APR_SUCCESS) {
    + *         ;  (already handled)
    + *     }
    + *     else
    + * #endif
    + *         [... handling non-otherchild processes death ...]
    + * 
    + */ +APR_DECLARE(apr_status_t) apr_proc_other_child_alert(apr_proc_t *proc, + int reason, + int status); + +/** + * Test one specific other child processes and invoke the maintenance callback + * with the appropriate reason code, if still running, or the appropriate reason + * code if the process is no longer healthy. + * @param ocr The registered other child + * @param reason The reason code (e.g. APR_OC_REASON_RESTART) if still running + */ +APR_DECLARE(void) apr_proc_other_child_refresh(apr_other_child_rec_t *ocr, + int reason); + +/** + * Test all registered other child processes and invoke the maintenance callback + * with the appropriate reason code, if still running, or the appropriate reason + * code if the process is no longer healthy. + * @param reason The reason code (e.g. APR_OC_REASON_RESTART) to running processes + */ +APR_DECLARE(void) apr_proc_other_child_refresh_all(int reason); + +/** @deprecated @see apr_proc_other_child_refresh_all + * @remark Call apr_proc_other_child_refresh_all(APR_OC_REASON_RESTART) + * or apr_proc_other_child_refresh_all(APR_OC_REASON_RUNNING) instead. + * @bug The differing implementations of this function on Win32 (_RUNNING checks) + * and Unix (used only for _RESTART) are the reason it will be dropped with APR 1.0. + */ +APR_DECLARE(void) apr_proc_other_child_check(void); + +/** @deprecated @see apr_proc_other_child_alert + * @bug This function's name had nothing to do with it's purpose + */ +APR_DECLARE(apr_status_t) apr_proc_other_child_read(apr_proc_t *proc, int status); + + +/** + * Terminate a process. + * @param proc The process to terminate. + * @param sig How to kill the process. + */ +APR_DECLARE(apr_status_t) apr_proc_kill(apr_proc_t *proc, int sig); + +/** + * Register a process to be killed when a pool dies. + * @param a The pool to use to define the processes lifetime + * @param proc The process to register + * @param how How to kill the process, one of: + *
    + *         APR_KILL_NEVER         -- process is never sent any signals
    + *         APR_KILL_ALWAYS        -- process is sent SIGKILL on apr_pool_t cleanup
    + *         APR_KILL_AFTER_TIMEOUT -- SIGTERM, wait 3 seconds, SIGKILL
    + *         APR_JUST_WAIT          -- wait forever for the process to complete
    + *         APR_KILL_ONLY_ONCE     -- send SIGTERM and then wait
    + * 
    + */ +APR_DECLARE(void) apr_pool_note_subprocess(apr_pool_t *a, apr_proc_t *proc, + apr_kill_conditions_e how); + +#if APR_HAS_THREADS + +#if (APR_HAVE_SIGWAIT || APR_HAVE_SIGSUSPEND) && !defined(OS2) + +/** + * Setup the process for a single thread to be used for all signal handling. + * @warning This must be called before any threads are created + */ +APR_DECLARE(apr_status_t) apr_setup_signal_thread(void); + +/** + * Make the current thread listen for signals. This thread will loop + * forever, calling a provided function whenever it receives a signal. That + * functions should return 1 if the signal has been handled, 0 otherwise. + * @param signal_handler The function to call when a signal is received + * apr_status_t apr_signal_thread((int)(*signal_handler)(int signum)) + */ +APR_DECLARE(apr_status_t) apr_signal_thread(int(*signal_handler)(int signum)); + +#endif /* (APR_HAVE_SIGWAIT || APR_HAVE_SIGSUSPEND) && !defined(OS2) */ + +/** + * Get the child-pool used by the thread from the thread info. + * @return apr_pool_t the pool + */ +APR_POOL_DECLARE_ACCESSOR(thread); + +#endif /* APR_HAS_THREADS */ + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* ! APR_THREAD_PROC_H */ + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_thread_rwlock.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_thread_rwlock.h new file mode 100644 index 00000000..0e69a2a4 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_thread_rwlock.h @@ -0,0 +1,120 @@ +/* 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. + */ + +#ifndef APR_THREAD_RWLOCK_H +#define APR_THREAD_RWLOCK_H + +/** + * @file apr_thread_rwlock.h + * @brief APR Reader/Writer Lock Routines + */ + +#include "apr.h" +#include "apr_pools.h" +#include "apr_errno.h" + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#if APR_HAS_THREADS + +/** + * @defgroup apr_thread_rwlock Reader/Writer Lock Routines + * @ingroup APR + * @{ + */ + +/** Opaque read-write thread-safe lock. */ +typedef struct apr_thread_rwlock_t apr_thread_rwlock_t; + +/** + * Create and initialize a read-write lock that can be used to synchronize + * threads. + * @param rwlock the memory address where the newly created readwrite lock + * will be stored. + * @param pool the pool from which to allocate the mutex. + */ +APR_DECLARE(apr_status_t) apr_thread_rwlock_create(apr_thread_rwlock_t **rwlock, + apr_pool_t *pool); +/** + * Acquire a shared-read lock on the given read-write lock. This will allow + * multiple threads to enter the same critical section while they have acquired + * the read lock. + * @param rwlock the read-write lock on which to acquire the shared read. + */ +APR_DECLARE(apr_status_t) apr_thread_rwlock_rdlock(apr_thread_rwlock_t *rwlock); + +/** + * Attempt to acquire the shread-read lock on the given read-write lock. This + * is the same as apr_thread_rwlock_rdlock(), only that the funtion fails + * if there is another thread holding the write lock, or if there are any + * write threads blocking on the lock. If the function failes for this case, + * APR_EBUSY will be returned. Note: it is important that the + * APR_STATUS_IS_EBUSY(s) macro be used to determine if the return value was + * APR_EBUSY, for portability reasons. + * @param rwlock the rwlock on which to attempt the shared read. + */ +APR_DECLARE(apr_status_t) apr_thread_rwlock_tryrdlock(apr_thread_rwlock_t *rwlock); + +/** + * Acquire an exclusive-write lock on the given read-write lock. This will + * allow only one single thread to enter the critical sections. If there + * are any threads currently holding thee read-lock, this thread is put to + * sleep until it can have exclusive access to the lock. + * @param rwlock the read-write lock on which to acquire the exclusive write. + */ +APR_DECLARE(apr_status_t) apr_thread_rwlock_wrlock(apr_thread_rwlock_t *rwlock); + +/** + * Attempt to acquire the exclusive-write lock on the given read-write lock. + * This is the same as apr_thread_rwlock_wrlock(), only that the funtion fails + * if there is any other thread holding the lock (for reading or writing), + * in which case the function will return APR_EBUSY. Note: it is important + * that the APR_STATUS_IS_EBUSY(s) macro be used to determine if the return + * value was APR_EBUSY, for portability reasons. + * @param rwlock the rwlock on which to attempt the exclusive write. + */ +APR_DECLARE(apr_status_t) apr_thread_rwlock_trywrlock(apr_thread_rwlock_t *rwlock); + +/** + * Release either the read or write lock currently held by the calling thread + * associated with the given read-write lock. + * @param rwlock the read-write lock to be released (unlocked). + */ +APR_DECLARE(apr_status_t) apr_thread_rwlock_unlock(apr_thread_rwlock_t *rwlock); + +/** + * Destroy the read-write lock and free the associated memory. + * @param rwlock the rwlock to destroy. + */ +APR_DECLARE(apr_status_t) apr_thread_rwlock_destroy(apr_thread_rwlock_t *rwlock); + +/** + * Get the pool used by this thread_rwlock. + * @return apr_pool_t the pool + */ +APR_POOL_DECLARE_ACCESSOR(thread_rwlock); + +#endif /* APR_HAS_THREADS */ + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* ! APR_THREAD_RWLOCK_H */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_time.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_time.h new file mode 100644 index 00000000..d313910b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_time.h @@ -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. + */ + +#ifndef APR_TIME_H +#define APR_TIME_H + +/** + * @file apr_time.h + * @brief APR Time Library + */ + +#include "apr.h" +#include "apr_pools.h" +#include "apr_errno.h" + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/** + * @defgroup apr_time Time Routines + * @ingroup APR + * @{ + */ + +/** month names */ +APR_DECLARE_DATA extern const char apr_month_snames[12][4]; +/** day names */ +APR_DECLARE_DATA extern const char apr_day_snames[7][4]; + + +/** number of microseconds since 00:00:00 january 1, 1970 UTC */ +typedef apr_int64_t apr_time_t; + + +/** mechanism to properly type apr_time_t literals */ +#define APR_TIME_C(val) APR_INT64_C(val) + +/** mechanism to properly print apr_time_t values */ +#define APR_TIME_T_FMT APR_INT64_T_FMT + +/** intervals for I/O timeouts, in microseconds */ +typedef apr_int64_t apr_interval_time_t; +/** short interval for I/O timeouts, in microseconds */ +typedef apr_int32_t apr_short_interval_time_t; + +/** number of microseconds per second */ +#define APR_USEC_PER_SEC APR_TIME_C(1000000) + +/** @return apr_time_t as a second */ +#define apr_time_sec(time) ((time) / APR_USEC_PER_SEC) + +/** @return apr_time_t as a usec */ +#define apr_time_usec(time) ((time) % APR_USEC_PER_SEC) + +/** @return apr_time_t as a msec */ +#define apr_time_msec(time) (((time) / 1000) % 1000) + +/** @return apr_time_t as a msec */ +#define apr_time_as_msec(time) ((time) / 1000) + +/** @return a second as an apr_time_t */ +#define apr_time_from_sec(sec) ((apr_time_t)(sec) * APR_USEC_PER_SEC) + +/** @return a second and usec combination as an apr_time_t */ +#define apr_time_make(sec, usec) ((apr_time_t)(sec) * APR_USEC_PER_SEC \ + + (apr_time_t)(usec)) + +/** + * @return the current time + */ +APR_DECLARE(apr_time_t) apr_time_now(void); + +/** @see apr_time_exp_t */ +typedef struct apr_time_exp_t apr_time_exp_t; + +/** + * a structure similar to ANSI struct tm with the following differences: + * - tm_usec isn't an ANSI field + * - tm_gmtoff isn't an ANSI field (it's a bsdism) + */ +struct apr_time_exp_t { + /** microseconds past tm_sec */ + apr_int32_t tm_usec; + /** (0-61) seconds past tm_min */ + apr_int32_t tm_sec; + /** (0-59) minutes past tm_hour */ + apr_int32_t tm_min; + /** (0-23) hours past midnight */ + apr_int32_t tm_hour; + /** (1-31) day of the month */ + apr_int32_t tm_mday; + /** (0-11) month of the year */ + apr_int32_t tm_mon; + /** year since 1900 */ + apr_int32_t tm_year; + /** (0-6) days since sunday */ + apr_int32_t tm_wday; + /** (0-365) days since jan 1 */ + apr_int32_t tm_yday; + /** daylight saving time */ + apr_int32_t tm_isdst; + /** seconds east of UTC */ + apr_int32_t tm_gmtoff; +}; + +/** + * convert an ansi time_t to an apr_time_t + * @param result the resulting apr_time_t + * @param input the time_t to convert + */ +APR_DECLARE(apr_status_t) apr_time_ansi_put(apr_time_t *result, + time_t input); + +/** + * convert a time to its human readable components using an offset + * from GMT + * @param result the exploded time + * @param input the time to explode + * @param offs the number of seconds offset to apply + */ +APR_DECLARE(apr_status_t) apr_time_exp_tz(apr_time_exp_t *result, + apr_time_t input, + apr_int32_t offs); + +/** @deprecated @see apr_time_exp_tz */ +APR_DECLARE(apr_status_t) apr_explode_time(apr_time_exp_t *result, + apr_time_t input, + apr_int32_t offs); + +/** + * convert a time to its human readable components in GMT timezone + * @param result the exploded time + * @param input the time to explode + */ +APR_DECLARE(apr_status_t) apr_time_exp_gmt(apr_time_exp_t *result, + apr_time_t input); + +/** + * convert a time to its human readable components in local timezone + * @param result the exploded time + * @param input the time to explode + */ +APR_DECLARE(apr_status_t) apr_time_exp_lt(apr_time_exp_t *result, + apr_time_t input); + +/** @deprecated @see apr_time_exp_lt */ +APR_DECLARE(apr_status_t) apr_explode_localtime(apr_time_exp_t *result, + apr_time_t input); + +/** + * Convert time value from human readable format to a numeric apr_time_t + * e.g. elapsed usec since epoch + * @param result the resulting imploded time + * @param input the input exploded time + */ +APR_DECLARE(apr_status_t) apr_time_exp_get(apr_time_t *result, + apr_time_exp_t *input); + +/** + * Convert time value from human readable format to a numeric apr_time_t that + * always represents GMT + * @param result the resulting imploded time + * @param input the input exploded time + */ +APR_DECLARE(apr_status_t) apr_time_exp_gmt_get(apr_time_t *result, + apr_time_exp_t *input); + +/** @deprecated @see apr_time_exp_gmt_get */ +APR_DECLARE(apr_status_t) apr_implode_gmt(apr_time_t *result, + apr_time_exp_t *input); + +/** + * Sleep for the specified number of micro-seconds. + * @param t desired amount of time to sleep. + * @warning May sleep for longer than the specified time. + */ +APR_DECLARE(void) apr_sleep(apr_interval_time_t t); + +/** length of a RFC822 Date */ +#define APR_RFC822_DATE_LEN (30) +/** + * apr_rfc822_date formats dates in the RFC822 + * format in an efficient manner. It is a fixed length + * format which requires the indicated amount of storage, + * including the trailing null byte. + * @param date_str String to write to. + * @param t the time to convert + */ +APR_DECLARE(apr_status_t) apr_rfc822_date(char *date_str, apr_time_t t); + +/** length of a CTIME date */ +#define APR_CTIME_LEN (25) +/** + * apr_ctime formats dates in the ctime() format + * in an efficient manner. it is a fixed length format + * and requires the indicated amount of storage including + * the trailing null byte. + * Unlike ANSI/ISO C ctime(), apr_ctime() does not include + * a \n at the end of the string. + * @param date_str String to write to. + * @param t the time to convert + */ +APR_DECLARE(apr_status_t) apr_ctime(char *date_str, apr_time_t t); + +/** + * formats the exploded time according to the format specified + * @param s string to write to + * @param retsize The length of the returned string + * @param max The maximum length of the string + * @param format The format for the time string + * @param tm The time to convert + */ +APR_DECLARE(apr_status_t) apr_strftime(char *s, apr_size_t *retsize, + apr_size_t max, const char *format, + apr_time_exp_t *tm); + +/** + * Improve the clock resolution for the lifetime of the given pool. + * Generally this is only desireable on benchmarking and other very + * time-sensitive applications, and has no impact on most platforms. + * @param p The pool to associate the finer clock resolution + */ +APR_DECLARE(void) apr_time_clock_hires(apr_pool_t *p); + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* ! APR_TIME_H */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_user.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_user.h new file mode 100644 index 00000000..d96d5407 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_user.h @@ -0,0 +1,195 @@ +/* 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. + */ + +#ifndef APR_USER_H +#define APR_USER_H + +/** + * @file apr_user.h + * @brief APR User ID Services + */ + +#include "apr.h" +#include "apr_errno.h" +#include "apr_pools.h" + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/** + * @defgroup apr_user User and Group ID Services + * @ingroup APR + * @{ + */ + +/** + * Structure for determining user ownership. + */ +#ifdef WIN32 +typedef PSID apr_uid_t; +#else +typedef uid_t apr_uid_t; +#endif + +/** + * Structure for determining group ownership. + */ +#ifdef WIN32 +typedef PSID apr_gid_t; +#else +typedef gid_t apr_gid_t; +#endif + +#if APR_HAS_USER + +/** + * Get the userid (and groupid) of the calling process + * @param userid Returns the user id + * @param groupid Returns the user's group id + * @param p The pool from which to allocate working space + * @remark This function is available only if APR_HAS_USER is defined. + */ +APR_DECLARE(apr_status_t) apr_uid_current(apr_uid_t *userid, + apr_gid_t *groupid, + apr_pool_t *p); + +/** @deprecated @see apr_uid_current */ +APR_DECLARE(apr_status_t) apr_current_userid(apr_uid_t *userid, + apr_gid_t *groupid, + apr_pool_t *p); +/** + * Get the user name for a specified userid + * @param username Pointer to new string containing user name (on output) + * @param userid The userid + * @param p The pool from which to allocate the string + * @remark This function is available only if APR_HAS_USER is defined. + */ +APR_DECLARE(apr_status_t) apr_uid_name_get(char **username, apr_uid_t userid, + apr_pool_t *p); + +/** @deprecated @see apr_uid_name_get */ +APR_DECLARE(apr_status_t) apr_get_username(char **username, apr_uid_t userid, + apr_pool_t *p); +/** + * Get the userid (and groupid) for the specified username + * @param userid Returns the user id + * @param groupid Returns the user's group id + * @param username The username to lookup + * @param p The pool from which to allocate working space + * @remark This function is available only if APR_HAS_USER is defined. + */ +APR_DECLARE(apr_status_t) apr_uid_get(apr_uid_t *userid, apr_gid_t *groupid, + const char *username, apr_pool_t *p); + +/** @deprecated @see apr_uid_get */ +APR_DECLARE(apr_status_t) apr_get_userid(apr_uid_t *userid, apr_gid_t *groupid, + const char *username, apr_pool_t *p); + +/** + * Get the home directory for the named user + * @param dirname Pointer to new string containing directory name (on output) + * @param username The named user + * @param p The pool from which to allocate the string + * @remark This function is available only if APR_HAS_USER is defined. + */ +APR_DECLARE(apr_status_t) apr_uid_homepath_get(char **dirname, + const char *username, + apr_pool_t *p); + +/** @deprecated @see apr_uid_homepath_get */ +APR_DECLARE(apr_status_t) apr_get_home_directory(char **dirname, + const char *username, + apr_pool_t *p); + +/** + * Compare two user identifiers for equality. + * @param left One uid to test + * @param right Another uid to test + * @return APR_SUCCESS if the apr_uid_t strutures identify the same user, + * APR_EMISMATCH if not, APR_BADARG if an apr_uid_t is invalid. + * @remark This function is available only if APR_HAS_USER is defined. + */ +#if defined(WIN32) +APR_DECLARE(apr_status_t) apr_uid_compare(apr_uid_t left, apr_uid_t right); + +/** @deprecated @see apr_uid_compare */ +APR_DECLARE(apr_status_t) apr_compare_users(apr_uid_t left, apr_uid_t right); +#else +#define apr_uid_compare(left,right) (((left) == (right)) ? APR_SUCCESS : APR_EMISMATCH) +/** @deprecated @see apr_uid_compare */ +#define apr_compare_users(left,right) (((left) == (right)) ? APR_SUCCESS : APR_EMISMATCH) +#endif + +/** + * Get the group name for a specified groupid + * @param groupname Pointer to new string containing group name (on output) + * @param groupid The groupid + * @param p The pool from which to allocate the string + * @remark This function is available only if APR_HAS_USER is defined. + */ +APR_DECLARE(apr_status_t) apr_gid_name_get(char **groupname, + apr_gid_t groupid, apr_pool_t *p); + +/** @deprecated @see apr_gid_name_get */ +APR_DECLARE(apr_status_t) apr_group_name_get(char **groupname, + apr_gid_t groupid, apr_pool_t *p); + +/** @deprecated @see apr_gid_name_get */ +APR_DECLARE(apr_status_t) apr_get_groupname(char **groupname, + apr_gid_t groupid, apr_pool_t *p); + +/** + * Get the groupid for a specified group name + * @param groupid Pointer to the group id (on output) + * @param groupname The group name to look up + * @param p The pool from which to allocate the string + * @remark This function is available only if APR_HAS_USER is defined. + */ +APR_DECLARE(apr_status_t) apr_gid_get(apr_gid_t *groupid, + const char *groupname, apr_pool_t *p); + +/** @deprecated @see apr_gid_get */ +APR_DECLARE(apr_status_t) apr_get_groupid(apr_gid_t *groupid, + const char *groupname, apr_pool_t *p); + +/** + * Compare two group identifiers for equality. + * @param left One gid to test + * @param right Another gid to test + * @return APR_SUCCESS if the apr_gid_t strutures identify the same group, + * APR_EMISMATCH if not, APR_BADARG if an apr_gid_t is invalid. + * @remark This function is available only if APR_HAS_USER is defined. + */ +#if defined(WIN32) +APR_DECLARE(apr_status_t) apr_gid_compare(apr_gid_t left, apr_gid_t right); +/** @deprecated @see apr_gid_compare */ +APR_DECLARE(apr_status_t) apr_compare_groups(apr_gid_t left, apr_gid_t right); +#else +#define apr_gid_compare(left,right) (((left) == (right)) ? APR_SUCCESS : APR_EMISMATCH) +/** @deprecated @see apr_gid_compare */ +#define apr_compare_groups(left,right) (((left) == (right)) ? APR_SUCCESS : APR_EMISMATCH) +#endif + +#endif /* ! APR_HAS_USER */ + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* ! APR_USER_H */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_version.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_version.h new file mode 100644 index 00000000..08bcd288 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_version.h @@ -0,0 +1,115 @@ +/* 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. + */ + +#ifndef APR_VERSION_H +#define APR_VERSION_H + +#include "apr.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @file apr_version.h + * @brief APR Versioning Interface + * + * APR's Version + * + * There are several different mechanisms for accessing the version. There + * is a string form, and a set of numbers; in addition, there are constants + * which can be compiled into your application, and you can query the library + * being used for its actual version. + * + * Note that it is possible for an application to detect that it has been + * compiled against a different version of APR by use of the compile-time + * constants and the use of the run-time query function. + * + * APR version numbering follows the guidelines specified in: + * + * http://apr.apache.org/versioning.html + */ + +/* The numeric compile-time version constants. These constants are the + * authoritative version numbers for APR. + */ + +/** major version + * Major API changes that could cause compatibility problems for older + * programs such as structure size changes. No binary compatibility is + * possible across a change in the major version. + */ +#define APR_MAJOR_VERSION 0 + +/** + * Minor API changes that do not cause binary compatibility problems. + * Should be reset to 0 when upgrading APR_MAJOR_VERSION + */ +#define APR_MINOR_VERSION 9 + +/** patch level */ +#define APR_PATCH_VERSION 19 + +/** + * This symbol is defined for internal, "development" copies of APR. This + * symbol will be #undef'd for releases. + */ +/* #define APR_IS_DEV_VERSION */ + + +/** The formatted string of APR's version */ +#define APR_VERSION_STRING \ + APR_STRINGIFY(APR_MAJOR_VERSION) "." \ + APR_STRINGIFY(APR_MINOR_VERSION) "." \ + APR_STRINGIFY(APR_PATCH_VERSION) \ + APR_IS_DEV_STRING + + +/** + * The numeric version information is broken out into fields within this + * structure. + */ +typedef struct { + int major; /**< major number */ + int minor; /**< minor number */ + int patch; /**< patch number */ + int is_dev; /**< is development (1 or 0) */ +} apr_version_t; + +/** + * Return APR's version information information in a numeric form. + * + * @param pvsn Pointer to a version structure for returning the version + * information. + */ +APR_DECLARE(void) apr_version(apr_version_t *pvsn); + +/** Return APR's version information as a string. */ +APR_DECLARE(const char *) apr_version_string(void); + + +/** Internal: string form of the "is dev" flag */ +#ifdef APR_IS_DEV_VERSION +#define APR_IS_DEV_STRING "-dev" +#else +#define APR_IS_DEV_STRING "" +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* APR_VERSION_H */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_want.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_want.h new file mode 100644 index 00000000..39cc4fcb --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/apr_want.h @@ -0,0 +1,109 @@ +/* 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. + */ + +#include "apr.h" /* configuration data */ +/** + * @file apr_want.h + * @brief APR Standard Headers Support + * + *
    + * Features:
    + *
    + *   APR_WANT_STRFUNC:  strcmp, strcat, strcpy, etc
    + *   APR_WANT_MEMFUNC:  memcmp, memcpy, etc
    + *   APR_WANT_STDIO:     and related bits
    + *   APR_WANT_IOVEC:    struct iovec
    + *   APR_WANT_BYTEFUNC: htons, htonl, ntohl, ntohs
    + *
    + * Typical usage:
    + *
    + *   #define APR_WANT_STRFUNC
    + *   #define APR_WANT_MEMFUNC
    + *   #include "apr_want.h"
    + *
    + * The appropriate headers will be included.
    + *
    + * Note: it is safe to use this in a header (it won't interfere with other
    + *       headers' or source files' use of apr_want.h)
    + * 
    + */ + +/* --------------------------------------------------------------------- */ + +#ifdef APR_WANT_STRFUNC + +#if APR_HAVE_STRING_H +#include +#endif +#if APR_HAVE_STRINGS_H +#include +#endif + +#undef APR_WANT_STRFUNC +#endif + +/* --------------------------------------------------------------------- */ + +#ifdef APR_WANT_MEMFUNC + +#if APR_HAVE_STRING_H +#include +#endif + +#undef APR_WANT_MEMFUNC +#endif + +/* --------------------------------------------------------------------- */ + +#ifdef APR_WANT_STDIO + +#if APR_HAVE_STDIO_H +#include +#endif + +#undef APR_WANT_STDIO +#endif + +/* --------------------------------------------------------------------- */ + +#ifdef APR_WANT_IOVEC + +#if APR_HAVE_SYS_UIO_H +#include +#endif + +#undef APR_WANT_IOVEC +#endif + +/* --------------------------------------------------------------------- */ + +#ifdef APR_WANT_BYTEFUNC + +/* Single Unix says they are in arpa/inet.h. Linux has them in + * netinet/in.h. FreeBSD has them in arpa/inet.h but requires that + * netinet/in.h be included first. + */ +#if APR_HAVE_NETINET_IN_H +#include +#endif +#if APR_HAVE_ARPA_INET_H +#include +#endif + +#undef APR_WANT_BYTEFUNC +#endif + +/* --------------------------------------------------------------------- */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/aix/apr_arch_dso.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/aix/apr_arch_dso.h new file mode 100644 index 00000000..d1cac684 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/aix/apr_arch_dso.h @@ -0,0 +1,41 @@ +/* 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. + */ + +#ifndef DSO_H +#define DSO_H + +#include "apr_private.h" +#include "apr_general.h" +#include "apr_pools.h" +#include "apr_dso.h" +#include "apr.h" + +#if APR_HAS_DSO + +void *dlopen(const char *path, int mode); +void *dlsym(void *handle, const char *symbol); +const char *dlerror(void); +int dlclose(void *handle); + +struct apr_dso_handle_t { + apr_pool_t *pool; + void *handle; + const char *errormsg; +}; + +#endif + +#endif diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/apr_private_common.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/apr_private_common.h new file mode 100644 index 00000000..3d8b7609 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/apr_private_common.h @@ -0,0 +1,37 @@ +/* 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. + */ + +/* + * This file contains private declarations common to all architectures. + */ + +#ifndef APR_PRIVATE_COMMON_H +#define APR_PRIVATE_COMMON_H + +#include "apr_pools.h" +#include "apr_tables.h" + +apr_status_t apr_filepath_list_split_impl(apr_array_header_t **pathelts, + const char *liststr, + char separator, + apr_pool_t *p); + +apr_status_t apr_filepath_list_merge_impl(char **liststr, + apr_array_header_t *pathelts, + char separator, + apr_pool_t *p); + +#endif /*APR_PRIVATE_COMMON_H*/ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/beos/apr_arch_dso.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/beos/apr_arch_dso.h new file mode 100644 index 00000000..0fbc9c1e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/beos/apr_arch_dso.h @@ -0,0 +1,38 @@ +/* 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. + */ + +#ifndef DSO_H +#define DSO_H + +#include "apr_private.h" +#include "apr_general.h" +#include "apr_pools.h" +#include "apr_errno.h" +#include "apr_dso.h" +#include "apr.h" +#include +#include + +#if APR_HAS_DSO + +struct apr_dso_handle_t { + image_id handle; /* Handle to the DSO loaded */ + apr_pool_t *pool; +}; + +#endif + +#endif diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/beos/apr_arch_proc_mutex.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/beos/apr_arch_proc_mutex.h new file mode 100644 index 00000000..c60d8c62 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/beos/apr_arch_proc_mutex.h @@ -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. + */ + +#ifndef PROC_MUTEX_H +#define PROC_MUTEX_H + +#include "apr_pools.h" +#include "apr_proc_mutex.h" +#include "apr_file_io.h" +#include "apr_general.h" +#include "apr_lib.h" +#include "apr_portable.h" + +struct apr_proc_mutex_t { + apr_pool_t *pool; + + /* Our lock :) */ + sem_id Lock; + int32 LockCount; +}; + +#endif /* PROC_MUTEX_H */ + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/beos/apr_arch_thread_cond.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/beos/apr_arch_thread_cond.h new file mode 100644 index 00000000..c9420b53 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/beos/apr_arch_thread_cond.h @@ -0,0 +1,46 @@ +/* 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. + */ + +#ifndef THREAD_COND_H +#define THREAD_COND_H + +#include +#include "apr_pools.h" +#include "apr_thread_cond.h" +#include "apr_file_io.h" +#include "apr_general.h" +#include "apr_lib.h" +#include "apr_portable.h" +#include "apr_ring.h" + +struct waiter_t { + APR_RING_ENTRY(waiter_t) link; + sem_id sem; +}; + +struct apr_thread_cond_t { + apr_pool_t *pool; + sem_id lock; + apr_thread_mutex_t *condlock; + thread_id owner; + /* active list */ + APR_RING_HEAD(active_list, waiter_t) alist; + /* free list */ + APR_RING_HEAD(free_list, waiter_t) flist; +}; + +#endif /* THREAD_COND_H */ + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/beos/apr_arch_thread_mutex.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/beos/apr_arch_thread_mutex.h new file mode 100644 index 00000000..bb7d4ae8 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/beos/apr_arch_thread_mutex.h @@ -0,0 +1,42 @@ +/* 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. + */ + +#ifndef THREAD_MUTEX_H +#define THREAD_MUTEX_H + +#include +#include "apr_pools.h" +#include "apr_thread_mutex.h" +#include "apr_file_io.h" +#include "apr_general.h" +#include "apr_lib.h" +#include "apr_portable.h" + +struct apr_thread_mutex_t { + apr_pool_t *pool; + + /* Our lock :) */ + sem_id Lock; + int32 LockCount; + + /* If we nest locks we need these... */ + int nested; + apr_os_thread_t owner; + int owner_ref; +}; + +#endif /* THREAD_MUTEX_H */ + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/beos/apr_arch_thread_rwlock.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/beos/apr_arch_thread_rwlock.h new file mode 100644 index 00000000..694b0d50 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/beos/apr_arch_thread_rwlock.h @@ -0,0 +1,45 @@ +/* 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. + */ + +#ifndef THREAD_RWLOCK_H +#define THREAD_RWLOCK_H + +#include +#include "apr_pools.h" +#include "apr_thread_rwlock.h" +#include "apr_file_io.h" +#include "apr_general.h" +#include "apr_lib.h" +#include "apr_portable.h" + +struct apr_thread_rwlock_t { + apr_pool_t *pool; + + /* Our lock :) */ + sem_id Lock; + int32 LockCount; + /* Read/Write lock stuff */ + sem_id Read; + int32 ReadCount; + sem_id Write; + int32 WriteCount; + int32 Nested; + + thread_id writer; +}; + +#endif /* THREAD_RWLOCK_H */ + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/beos/apr_arch_threadproc.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/beos/apr_arch_threadproc.h new file mode 100644 index 00000000..13de0536 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/beos/apr_arch_threadproc.h @@ -0,0 +1,95 @@ +/* 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. + */ + +#include "apr_thread_proc.h" +#include "apr_arch_file_io.h" +#include "apr_file_io.h" +#include "apr_thread_proc.h" +#include "apr_general.h" +#include "apr_portable.h" +#include +#include +#include +#include +#include + +#ifndef THREAD_PROC_H +#define THREAD_PROC_H + +#define SHELL_PATH "/bin/sh" + +#define PTHREAD_CANCEL_AYNCHRONOUS CANCEL_ASYNCH; +#define PTHREAD_CANCEL_DEFERRED CANCEL_DEFER; + +#define PTHREAD_CANCEL_ENABLE CANCEL_ENABLE; +#define PTHREAD_CANCEL_DISABLE CANCEL_DISABLE; + +#define BEOS_MAX_DATAKEYS 128 + +struct apr_thread_t { + apr_pool_t *pool; + thread_id td; + void *data; + apr_thread_start_t func; + apr_status_t exitval; +}; + +struct apr_threadattr_t { + apr_pool_t *pool; + int32 attr; + int detached; + int joinable; +}; + +struct apr_threadkey_t { + apr_pool_t *pool; + int32 key; +}; + +struct beos_private_data { + const void ** data; + int count; + volatile thread_id td; +}; + +struct beos_key { + int assigned; + int count; + sem_id lock; + int32 ben_lock; + void (* destructor) (void *); +}; + +struct apr_procattr_t { + apr_pool_t *pool; + apr_file_t *parent_in; + apr_file_t *child_in; + apr_file_t *parent_out; + apr_file_t *child_out; + apr_file_t *parent_err; + apr_file_t *child_err; + char *currdir; + apr_int32_t cmdtype; + apr_int32_t detached; +}; + +struct apr_thread_once_t { + sem_id sem; + int hit; +}; + +#endif /* ! THREAD_PROC_H */ + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/netware/apr_arch_dso.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/netware/apr_arch_dso.h new file mode 100644 index 00000000..ea0fe8c2 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/netware/apr_arch_dso.h @@ -0,0 +1,43 @@ +/* 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. + */ + +#ifndef DSO_H +#define DSO_H + +#include "apr_private.h" +#include "apr_general.h" +#include "apr_pools.h" +#include "apr_dso.h" +#include "apr.h" + +#include + +typedef struct sym_list sym_list; + +struct sym_list { + sym_list *next; + char *symbol; +}; + +struct apr_dso_handle_t { + apr_pool_t *pool; + void *handle; + const char *errormsg; + sym_list *symbols; + char *path; +}; + +#endif diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/netware/apr_arch_file_io.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/netware/apr_arch_file_io.h new file mode 100644 index 00000000..7548a237 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/netware/apr_arch_file_io.h @@ -0,0 +1,159 @@ +/* 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. + */ + +#ifndef FILE_IO_H +#define FILE_IO_H + +#include "apr.h" +#include "apr_private.h" +#include "apr_general.h" +#include "apr_tables.h" +#include "apr_file_io.h" +#include "apr_file_info.h" +#include "apr_errno.h" +#include "apr_lib.h" + +/* System headers the file I/O library needs */ +#if APR_HAVE_FCNTL_H +#include +#endif +#if APR_HAVE_SYS_TYPES_H +#include +#endif +#if APR_HAVE_ERRNO_H +#include +#endif +#if APR_HAVE_STRING_H +#include +#endif +#if APR_HAVE_STRINGS_H +#include +#endif +#if APR_HAVE_DIRENT_H +#include +#endif +#ifdef HAVE_SYS_STAT_H +#include +#endif +#if APR_HAVE_UNISTD_H +#include +#endif +#if APR_HAVE_STDIO_H +#include +#endif +#if APR_HAVE_STDLIB_H +#include +#endif +#if APR_HAVE_SYS_UIO_H +#include +#endif +#if APR_HAVE_SYS_TIME_H +#include +#endif + +#include + +/* End System headers */ + +#define APR_FILE_BUFSIZE 4096 + +struct apr_file_t { + apr_pool_t *pool; + int filedes; + char *fname; + apr_int32_t flags; + int eof_hit; + int is_pipe; + apr_interval_time_t timeout; + int buffered; + enum {BLK_UNKNOWN, BLK_OFF, BLK_ON } blocking; + int ungetchar; /* Last char provided by an unget op. (-1 = no char)*/ + + /* Stuff for buffered mode */ + char *buffer; + int bufpos; /* Read/Write position in buffer */ + unsigned long dataRead; /* amount of valid data read into buffer */ + int direction; /* buffer being used for 0 = read, 1 = write */ + unsigned long filePtr; /* position in file of handle */ +#if APR_HAS_THREADS + struct apr_thread_mutex_t *thlock; +#endif +}; + +#if APR_HAS_THREADS +#define file_lock(f) do { \ + if ((f)->thlock) \ + apr_thread_mutex_lock((f)->thlock); \ + } while (0) +#define file_unlock(f) do { \ + if ((f)->thlock) \ + apr_thread_mutex_unlock((f)->thlock); \ + } while (0) +#else +#define file_lock(f) do {} while (0) +#define file_unlock(f) do {} while (0) +#endif + +struct apr_dir_t { + apr_pool_t *pool; + char *dirname; + DIR *dirstruct; + struct dirent *entry; +}; + +typedef struct apr_stat_entry_t apr_stat_entry_t; + +struct apr_stat_entry_t { + struct stat info; + char *casedName; + apr_time_t expire; + NXPathCtx_t pathCtx; +}; + +#define MAX_SERVER_NAME 64 +#define MAX_VOLUME_NAME 64 +#define MAX_PATH_NAME 256 +#define MAX_FILE_NAME 256 + +#define DRIVE_ONLY 1 + +/* If the user passes d: vs. D: (or //mach/share vs. //MACH/SHARE), + * we need to fold the case to canonical form. This function is + * supposed to do so. + */ +apr_status_t filepath_root_case(char **rootpath, char *root, apr_pool_t *p); + +/* This function check to see of the given path includes a drive/volume + * specifier. If the _only_ parameter is set to DRIVE_ONLY then it + * check to see of the path only contains a drive/volume specifier and + * nothing else. + */ +apr_status_t filepath_has_drive(const char *rootpath, int only, apr_pool_t *p); + +/* This function compares the drive/volume specifiers for each given path. + * It returns zero if they match or non-zero if not. + */ +apr_status_t filepath_compare_drive(const char *path1, const char *path2, apr_pool_t *p); + +apr_status_t apr_unix_file_cleanup(void *); +apr_status_t apr_unix_child_file_cleanup(void *); + +apr_status_t apr_file_flush_locked(apr_file_t *thefile); +apr_status_t apr_file_info_get_locked(apr_finfo_t *finfo, apr_int32_t wanted, + apr_file_t *thefile); + +#endif /* ! FILE_IO_H */ + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/netware/apr_arch_global_mutex.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/netware/apr_arch_global_mutex.h new file mode 100644 index 00000000..4167d378 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/netware/apr_arch_global_mutex.h @@ -0,0 +1,29 @@ +/* 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. + */ + +#ifndef GLOBAL_MUTEX_H +#define GLOBAL_MUTEX_H + +#include "apr_global_mutex.h" +#include "apr_thread_mutex.h" + +struct apr_global_mutex_t { + apr_pool_t *pool; + apr_thread_mutex_t *mutex; +}; + +#endif /* GLOBAL_MUTEX_H */ + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/netware/apr_arch_internal_time.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/netware/apr_arch_internal_time.h new file mode 100644 index 00000000..59f10672 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/netware/apr_arch_internal_time.h @@ -0,0 +1,26 @@ +/* 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. + */ + +#ifndef TIME_INTERNAL_H +#define TIME_INTERNAL_H + +#include "apr.h" + +#define TZONE (*___timezone()) + +void apr_netware_setup_time(void); + +#endif /* TIME_INTERNAL_H */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/netware/apr_arch_networkio.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/netware/apr_arch_networkio.h new file mode 100644 index 00000000..bcd7ec84 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/netware/apr_arch_networkio.h @@ -0,0 +1,27 @@ +/* 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. + */ + +#ifndef NETWORK_IO_H + +/* Making sure that we include the correct networkio.h since the + the project file is configured to first look for headers in + arch/netware and then arch/unix. But in this specific case we + want arch/win32. +*/ +#include <../win32/apr_arch_networkio.h> + +#endif /* ! NETWORK_IO_H */ + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/netware/apr_arch_pre_nw.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/netware/apr_arch_pre_nw.h new file mode 100644 index 00000000..36d9942c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/netware/apr_arch_pre_nw.h @@ -0,0 +1,67 @@ +#ifndef __pre_nw__ +#define __pre_nw__ + +#include + +#ifndef __GNUC__ +#pragma precompile_target "precomp.mch" +#endif + +#define NETWARE + +#define N_PLAT_NLM + +/* 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. + */ +#define FAR +#define far + +/* no-op for Codewarrior C compiler; a functions are cdecl + by default */ +#define cdecl + +/* if we have wchar_t enabled in C++, predefine this type to avoid + a conflict in Novell's header files */ +#ifndef __GNUC__ +#ifndef DOXYGEN +#if (__option(cplusplus) && __option(wchar_type)) +#define _WCHAR_T +#endif +#endif +#endif + +/* C9X defintion used by MSL C++ library */ +#define DECIMAL_DIG 17 + +/* some code may want to use the MS convention for long long */ +#ifndef __int64 +#define __int64 long long +#endif + +/* expat version */ +#define VERSION "expat_1.95.1" +#define EXPAT_MAJOR_VERSION 1 +#define EXPAT_MINOR_VERSION 95 +#define EXPAT_EDIT 2 + +#define XML_MAJOR_VERSION EXPAT_MAJOR_VERSION +#define XML_MINOR_VERSION EXPAT_MINOR_VERSION +#define XML_MICRO_VERSION EXPAT_EDIT + +#endif + + + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/netware/apr_arch_proc_mutex.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/netware/apr_arch_proc_mutex.h new file mode 100644 index 00000000..7a634c2e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/netware/apr_arch_proc_mutex.h @@ -0,0 +1,29 @@ +/* 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. + */ + +#ifndef PROC_MUTEX_H +#define PROC_MUTEX_H + +#include "apr_proc_mutex.h" +#include "apr_thread_mutex.h" + +struct apr_proc_mutex_t { + apr_pool_t *pool; + apr_thread_mutex_t *mutex; +}; + +#endif /* PROC_MUTEX_H */ + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/netware/apr_arch_thread_cond.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/netware/apr_arch_thread_cond.h new file mode 100644 index 00000000..b11a5f86 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/netware/apr_arch_thread_cond.h @@ -0,0 +1,29 @@ +/* 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. + */ + +#ifndef THREAD_COND_H +#define THREAD_COND_H + +#include "apr_thread_cond.h" +#include + +struct apr_thread_cond_t { + apr_pool_t *pool; + NXCond_t *cond; +}; + +#endif /* THREAD_COND_H */ + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/netware/apr_arch_thread_mutex.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/netware/apr_arch_thread_mutex.h new file mode 100644 index 00000000..0453799c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/netware/apr_arch_thread_mutex.h @@ -0,0 +1,29 @@ +/* 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. + */ + +#ifndef THREAD_MUTEX_H +#define THREAD_MUTEX_H + +#include "apr_thread_mutex.h" +#include + +struct apr_thread_mutex_t { + apr_pool_t *pool; + NXMutex_t *mutex; +}; + +#endif /* THREAD_MUTEX_H */ + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/netware/apr_arch_thread_rwlock.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/netware/apr_arch_thread_rwlock.h new file mode 100644 index 00000000..d2dbd42f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/netware/apr_arch_thread_rwlock.h @@ -0,0 +1,29 @@ +/* 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. + */ + +#ifndef THREAD_RWLOCK_H +#define THREAD_RWLOCK_H + +#include "apr_thread_rwlock.h" +#include + +struct apr_thread_rwlock_t { + apr_pool_t *pool; + NXRwLock_t *rwlock; +}; + +#endif /* THREAD_RWLOCK_H */ + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/netware/apr_arch_threadproc.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/netware/apr_arch_threadproc.h new file mode 100644 index 00000000..713ed295 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/netware/apr_arch_threadproc.h @@ -0,0 +1,78 @@ +/* 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. + */ + +#include "apr.h" +#include "apr_thread_proc.h" +#include "apr_file_io.h" + +#include + +#ifndef THREAD_PROC_H +#define THREAD_PROC_H + +#define SHELL_PATH "" +#define APR_DEFAULT_STACK_SIZE 65536 + +struct apr_thread_t { + apr_pool_t *pool; + NXContext_t ctx; + NXThreadId_t td; + char *thread_name; + apr_int32_t cancel; + apr_int32_t cancel_how; + void *data; + apr_thread_start_t func; + apr_status_t exitval; +}; + +struct apr_threadattr_t { + apr_pool_t *pool; + apr_size_t stack_size; + apr_int32_t detach; + char *thread_name; +}; + +struct apr_threadkey_t { + apr_pool_t *pool; + NXKey_t key; +}; + +struct apr_procattr_t { + apr_pool_t *pool; + apr_file_t *parent_in; + apr_file_t *child_in; + apr_file_t *parent_out; + apr_file_t *child_out; + apr_file_t *parent_err; + apr_file_t *child_err; + char *currdir; + apr_int32_t cmdtype; + apr_int32_t detached; + apr_int32_t addrspace; +}; + +struct apr_thread_once_t { + unsigned long value; +}; + +//struct apr_proc_t { +// apr_pool_t *pool; +// pid_t pid; +// apr_procattr_t *attr; +//}; + +#endif /* ! THREAD_PROC_H */ + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/netware/apr_private.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/netware/apr_private.h new file mode 100644 index 00000000..0282adfb --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/netware/apr_private.h @@ -0,0 +1,175 @@ +/* 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. + */ + +/* + * Note: + * This is the windows specific autoconf-like config file + * which unix would create at build time. + */ + +#ifdef NETWARE + +#ifndef APR_PRIVATE_H +#define APR_PRIVATE_H + +/* Include the public APR symbols, include our idea of the 'right' + * subset of the Windows.h header. This saves us repetition. + */ +#include "apr.h" + +#include +#include +#include +#include +#include +#include +#include + +/* Use this section to define all of the HAVE_FOO_H + * that are required to build properly. + */ +#define HAVE_DLFCN_H 1 +#define HAVE_LIMITS_H 1 +#define HAVE_SIGNAL_H 1 +#define HAVE_STDDEF_H 1 +#define HAVE_STDLIB_H 1 +#define HAVE_SYS_STAT_H 1 +#define HAVE_SYS_MMAN_H 1 +#define HAVE_FCNTL_H 1 +#define HAVE_ICONV_H 1 +#define HAVE_UTIME_H 1 + +#define HAVE_STRICMP 1 +#define HAVE_STRNICMP 1 +#define HAVE_STRDUP 1 +#define HAVE_STRSTR 1 +#define HAVE_MEMCHR 1 +#define HAVE_CALLOC 1 +#define HAVE_UTIME 1 + +#define HAVE_GETENV 1 +#define HAVE_SETENV 1 +#define HAVE_UNSETENV 1 + +#define HAVE_WRITEV 1 + +/*#define DSO_USE_DLFCN */ + +#ifdef NW_BUILD_IPV6 +#define HAVE_GETADDRINFO 1 +#define HAVE_GETNAMEINFO 1 +#endif + +/* 1 is used for SIGABRT on netware */ +/* 2 is used for SIGFPE on netware */ +/* 3 is used for SIGILL on netware */ +/* 4 is used for SIGINT on netware */ +/* 5 is used for SIGSEGV on netware */ +/* 6 is used for SIGTERM on netware */ +/* 7 is used for SIGPOLL on netware */ + +#define SIGKILL 11 +#define SA_NOCLDSTOP 12 +#define SIGALRM 13 +#define SIGCHLD 14 +#define SIGCONT 15 +#define SIGHUP 16 +#define SIGPIPE 17 +#define SIGQUIT 18 +#define SIGSTOP 19 +#define SIGTSTP 20 +#define SIGTTIN 21 +#define SIGTTOU 22 +#define SIGUSR1 23 +#define SIGUSR2 24 + +#define SIGTRAP 25 +#define SIGIOT 26 +#define SIGBUS 27 +#define SIGSTKFLT 28 +#define SIGURG 29 +#define SIGXCPU 30 +#define SIGXFSZ 31 +#define SIGVTALRM 32 +#define SIGPROF 33 +#define SIGWINCH 34 +#define SIGIO 35 + +#if 0 +#define __attribute__(__x) + +/* APR COMPATABILITY FUNCTIONS + * This section should be used to define functions and + * macros which are need to make Windows features look + * like POSIX features. + */ +typedef void (Sigfunc)(int); +#endif + +#define strcasecmp(s1, s2) stricmp(s1, s2) +#define Sleep(t) delay(t) +#define lstat(a,b) stat(a,b) +#define _getch() getcharacter() + +#define SIZEOF_SHORT 2 +#define SIZEOF_INT 4 +#define SIZEOF_LONGLONG 8 +#define SIZEOF_CHAR 1 +#define SIZEOF_SSIZE_T SIZEOF_INT + +void netware_pool_proc_cleanup (); + +/* NLM registration routines for managing which NLMs + are using the library. */ +int register_NLM(void *NLMHandle); +int unregister_NLM(void *NLMHandle); + +/* Application global data management */ +extern int gLibId; +extern void *gLibHandle; + +typedef struct app_data { + int initialized; + void* gPool; + void* gs_aHooksToSort; + void* gs_phOptionalHooks; + void* gs_phOptionalFunctions; + void* gs_nlmhandle; + rtag_t gs_startup_rtag; + rtag_t gs_socket_rtag; + rtag_t gs_lookup_rtag; + rtag_t gs_event_rtag; + rtag_t gs_pcp_rtag; +} APP_DATA; + +int setGlobalPool(void *data); +void* getGlobalPool(); +int setStatCache(void *data); +void* getStatCache(); + +/* Redefine malloc to use the library malloc call so + that all of the memory resources will be owned + and can be shared by the library. */ +#undef malloc +#define malloc(x) library_malloc(gLibHandle,x) + +/* + * Include common private declarations. + */ +#include "../apr_private_common.h" + +#endif /*APR_PRIVATE_H*/ +#endif /*NETWARE*/ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/os2/apr_arch_dso.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/os2/apr_arch_dso.h new file mode 100644 index 00000000..2bda6b7c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/os2/apr_arch_dso.h @@ -0,0 +1,37 @@ +/* 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. + */ + +#ifndef DSO_H +#define DSO_H + +#include "apr_private.h" +#include "apr_general.h" +#include "apr_pools.h" +#include "apr_dso.h" +#include "apr.h" + +#if APR_HAS_DSO + +struct apr_dso_handle_t { + apr_pool_t *cont; /* Context for returning error strings */ + HMODULE handle; /* Handle to the DSO loaded */ + apr_status_t load_error; + char *failed_module; +}; + +#endif + +#endif diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/os2/apr_arch_file_io.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/os2/apr_arch_file_io.h new file mode 100644 index 00000000..60700656 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/os2/apr_arch_file_io.h @@ -0,0 +1,80 @@ +/* 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. + */ + +#ifndef FILE_IO_H +#define FILE_IO_H + +#include "apr_private.h" +#include "apr_general.h" +#include "apr_thread_mutex.h" +#include "apr_file_io.h" +#include "apr_file_info.h" +#include "apr_errno.h" + +/* We have an implementation of mkstemp but it's not very multi-threading + * friendly & is part of the POSIX emulation rather than native so don't + * use it. + */ +#undef HAVE_MKSTEMP + +#define APR_FILE_BUFSIZE 4096 + +struct apr_file_t { + apr_pool_t *pool; + HFILE filedes; + char * fname; + int isopen; + int buffered; + int eof_hit; + apr_int32_t flags; + int timeout; + int pipe; + HEV pipeSem; + enum { BLK_UNKNOWN, BLK_OFF, BLK_ON } blocking; + + /* Stuff for buffered mode */ + char *buffer; + int bufpos; // Read/Write position in buffer + unsigned long dataRead; // amount of valid data read into buffer + int direction; // buffer being used for 0 = read, 1 = write + unsigned long filePtr; // position in file of handle + apr_thread_mutex_t *mutex;// mutex semaphore, must be owned to access the above fields +}; + +struct apr_dir_t { + apr_pool_t *pool; + char *dirname; + ULONG handle; + FILEFINDBUF3 entry; + int validentry; +}; + +apr_status_t apr_file_cleanup(void *); +apr_status_t apr_os2_time_to_apr_time(apr_time_t *result, FDATE os2date, + FTIME os2time); + +/* see win32/fileio.h for description of these */ +extern const char c_is_fnchar[256]; + +#define IS_FNCHAR(c) c_is_fnchar[(unsigned char)c] + +apr_status_t filepath_root_test(char *path, apr_pool_t *p); +apr_status_t filepath_drive_get(char **rootpath, char drive, + apr_int32_t flags, apr_pool_t *p); +apr_status_t filepath_root_case(char **rootpath, char *root, apr_pool_t *p); + +#endif /* ! FILE_IO_H */ + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/os2/apr_arch_networkio.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/os2/apr_arch_networkio.h new file mode 100644 index 00000000..5db2def0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/os2/apr_arch_networkio.h @@ -0,0 +1,71 @@ +/* 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. + */ + +#ifndef NETWORK_IO_H +#define NETWORK_IO_H + +#include "apr_private.h" +#include "apr_network_io.h" +#include "apr_general.h" +#include "apr_arch_os2calls.h" +#if APR_HAVE_NETDB_H +#include +#endif + +typedef struct sock_userdata_t sock_userdata_t; +struct sock_userdata_t { + sock_userdata_t *next; + const char *key; + void *data; +}; + +struct apr_socket_t { + apr_pool_t *cntxt; + int socketdes; + int type; + int protocol; + apr_sockaddr_t *local_addr; + apr_sockaddr_t *remote_addr; + apr_interval_time_t timeout; + int nonblock; + int local_port_unknown; + int local_interface_unknown; + int remote_addr_unknown; + apr_int32_t netmask; + apr_int32_t inherit; + sock_userdata_t *userdata; +}; + +/* Error codes returned from sock_errno() */ +#define SOCBASEERR 10000 +#define SOCEPERM (SOCBASEERR+1) /* Not owner */ +#define SOCESRCH (SOCBASEERR+3) /* No such process */ +#define SOCEINTR (SOCBASEERR+4) /* Interrupted system call */ +#define SOCENXIO (SOCBASEERR+6) /* No such device or address */ +#define SOCEBADF (SOCBASEERR+9) /* Bad file number */ +#define SOCEACCES (SOCBASEERR+13) /* Permission denied */ +#define SOCEFAULT (SOCBASEERR+14) /* Bad address */ +#define SOCEINVAL (SOCBASEERR+22) /* Invalid argument */ +#define SOCEMFILE (SOCBASEERR+24) /* Too many open files */ +#define SOCEPIPE (SOCBASEERR+32) /* Broken pipe */ +#define SOCEOS2ERR (SOCBASEERR+100) /* OS/2 Error */ + +const char *apr_inet_ntop(int af, const void *src, char *dst, apr_size_t size); +int apr_inet_pton(int af, const char *src, void *dst); +void apr_sockaddr_vars_set(apr_sockaddr_t *, int, apr_port_t); + +#endif /* ! NETWORK_IO_H */ + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/os2/apr_arch_os2calls.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/os2/apr_arch_os2calls.h new file mode 100644 index 00000000..3c739bfd --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/os2/apr_arch_os2calls.h @@ -0,0 +1,59 @@ +/* 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. + */ + +#include "apr_errno.h" +#include +#include + +extern int (*apr_os2_socket)(int, int, int); +extern int (*apr_os2_select)(int *, int, int, int, long); +extern int (*apr_os2_sock_errno)(); +extern int (*apr_os2_accept)(int, struct sockaddr *, int *); +extern int (*apr_os2_bind)(int, struct sockaddr *, int); +extern int (*apr_os2_connect)(int, struct sockaddr *, int); +extern int (*apr_os2_getpeername)(int, struct sockaddr *, int *); +extern int (*apr_os2_getsockname)(int, struct sockaddr *, int *); +extern int (*apr_os2_getsockopt)(int, int, int, char *, int *); +extern int (*apr_os2_ioctl)(int, int, caddr_t, int); +extern int (*apr_os2_listen)(int, int); +extern int (*apr_os2_recv)(int, char *, int, int); +extern int (*apr_os2_send)(int, const char *, int, int); +extern int (*apr_os2_setsockopt)(int, int, int, char *, int); +extern int (*apr_os2_shutdown)(int, int); +extern int (*apr_os2_soclose)(int); +extern int (*apr_os2_writev)(int, struct iovec *, int); +extern int (*apr_os2_sendto)(int, const char *, int, int, const struct sockaddr *, int); +extern int (*apr_os2_recvfrom)(int, char *, int, int, struct sockaddr *, int *); + +#define socket apr_os2_socket +#define select apr_os2_select +#define sock_errno apr_os2_sock_errno +#define accept apr_os2_accept +#define bind apr_os2_bind +#define connect apr_os2_connect +#define getpeername apr_os2_getpeername +#define getsockname apr_os2_getsockname +#define getsockopt apr_os2_getsockopt +#define ioctl apr_os2_ioctl +#define listen apr_os2_listen +#define recv apr_os2_recv +#define send apr_os2_send +#define setsockopt apr_os2_setsockopt +#define shutdown apr_os2_shutdown +#define soclose apr_os2_soclose +#define writev apr_os2_writev +#define sendto apr_os2_sendto +#define recvfrom apr_os2_recvfrom diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/os2/apr_arch_proc_mutex.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/os2/apr_arch_proc_mutex.h new file mode 100644 index 00000000..8caf3369 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/os2/apr_arch_proc_mutex.h @@ -0,0 +1,31 @@ +/* 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. + */ + +#ifndef PROC_MUTEX_H +#define PROC_MUTEX_H + +#include "apr_proc_mutex.h" +#include "apr_file_io.h" + +struct apr_proc_mutex_t { + apr_pool_t *pool; + HMTX hMutex; + TID owner; + int lock_count; +}; + +#endif /* PROC_MUTEX_H */ + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/os2/apr_arch_thread_cond.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/os2/apr_arch_thread_cond.h new file mode 100644 index 00000000..648b85d1 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/os2/apr_arch_thread_cond.h @@ -0,0 +1,28 @@ +/* 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. + */ + +#ifndef THREAD_COND_H +#define THREAD_COND_H + +#include "apr_thread_cond.h" +#include "apr_file_io.h" + +struct apr_thread_cond_t { + apr_pool_t *pool; +}; + +#endif /* THREAD_COND_H */ + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/os2/apr_arch_thread_mutex.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/os2/apr_arch_thread_mutex.h new file mode 100644 index 00000000..3ae2a41d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/os2/apr_arch_thread_mutex.h @@ -0,0 +1,29 @@ +/* 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. + */ + +#ifndef THREAD_MUTEX_H +#define THREAD_MUTEX_H + +#include "apr_thread_mutex.h" +#include "apr_file_io.h" + +struct apr_thread_mutex_t { + apr_pool_t *pool; + HMTX hMutex; +}; + +#endif /* THREAD_MUTEX_H */ + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/os2/apr_arch_thread_rwlock.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/os2/apr_arch_thread_rwlock.h new file mode 100644 index 00000000..7187d5cb --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/os2/apr_arch_thread_rwlock.h @@ -0,0 +1,31 @@ +/* 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. + */ + +#ifndef THREAD_RWLOCK_H +#define THREAD_RWLOCK_H + +#include "apr_thread_rwlock.h" +#include "apr_file_io.h" + +struct apr_thread_rwlock_t { + apr_pool_t *pool; + int readers; + HMTX write_lock; + HEV read_done; +}; + +#endif /* THREAD_RWLOCK_H */ + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/os2/apr_arch_threadproc.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/os2/apr_arch_threadproc.h new file mode 100644 index 00000000..c8017adb --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/os2/apr_arch_threadproc.h @@ -0,0 +1,67 @@ +/* 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. + */ + +#include "apr_thread_proc.h" +#include "apr_file_io.h" + +#ifndef THREAD_PROC_H +#define THREAD_PROC_H + +#define APR_THREADATTR_DETACHED 1 + +#define SHELL_PATH "cmd.exe" +#define APR_THREAD_STACKSIZE 65536 + +struct apr_threadattr_t { + apr_pool_t *pool; + unsigned long attr; + apr_size_t stacksize; +}; + +struct apr_thread_t { + apr_pool_t *pool; + struct apr_threadattr_t *attr; + unsigned long tid; + apr_thread_start_t func; + void *data; + apr_status_t exitval; +}; + +struct apr_threadkey_t { + apr_pool_t *pool; + unsigned long *key; +}; + +struct apr_procattr_t { + apr_pool_t *pool; + apr_file_t *parent_in; + apr_file_t *child_in; + apr_file_t *parent_out; + apr_file_t *child_out; + apr_file_t *parent_err; + apr_file_t *child_err; + char *currdir; + apr_int32_t cmdtype; + apr_int32_t detached; +}; + +struct apr_thread_once_t { + unsigned long sem; + char hit; +}; + +#endif /* ! THREAD_PROC_H */ + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/os390/apr_arch_dso.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/os390/apr_arch_dso.h new file mode 100644 index 00000000..4263297b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/os390/apr_arch_dso.h @@ -0,0 +1,39 @@ +/* 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. + */ + +#ifndef DSO_H +#define DSO_H + +#include "apr_private.h" +#include "apr_general.h" +#include "apr_pools.h" +#include "apr_dso.h" +#include "apr.h" + +#if APR_HAS_DSO + +#include + +struct apr_dso_handle_t { + dllhandle *handle; /* Handle to the DSO loaded */ + int failing_errno; /* Don't save the buffer returned by + strerror(); it gets reused */ + apr_pool_t *pool; +}; + +#endif + +#endif diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_arch_dso.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_arch_dso.h new file mode 100644 index 00000000..bfd12b43 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_arch_dso.h @@ -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. + */ + +#ifndef DSO_H +#define DSO_H + +#include "apr_private.h" +#include "apr_general.h" +#include "apr_pools.h" +#include "apr_dso.h" +#include "apr.h" + +#if APR_HAS_DSO + +#ifdef HAVE_MACH_O_DYLD_H +#include +#endif + +#ifdef HAVE_DLFCN_H +#include +#endif + +#ifdef HAVE_DL_H +#include +#endif + +#ifndef RTLD_NOW +#define RTLD_NOW 1 +#endif + +#ifndef RTLD_GLOBAL +#define RTLD_GLOBAL 0 +#endif + +#if (defined(__FreeBSD__) ||\ + defined(__OpenBSD__) ||\ + defined(__NetBSD__) ) && !defined(__ELF__) +#define DLSYM_NEEDS_UNDERSCORE +#endif + +struct apr_dso_handle_t { + apr_pool_t *pool; + void *handle; + const char *errormsg; +}; + +#endif + +#endif diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_arch_file_io.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_arch_file_io.h new file mode 100644 index 00000000..5606f5bc --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_arch_file_io.h @@ -0,0 +1,140 @@ +/* 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. + */ + +#ifndef FILE_IO_H +#define FILE_IO_H + +#include "apr.h" +#include "apr_private.h" +#include "apr_general.h" +#include "apr_tables.h" +#include "apr_file_io.h" +#include "apr_file_info.h" +#include "apr_errno.h" +#include "apr_lib.h" +#include "apr_thread_mutex.h" + +/* System headers the file I/O library needs */ +#if APR_HAVE_FCNTL_H +#include +#endif +#if APR_HAVE_SYS_TYPES_H +#include +#endif +#if APR_HAVE_ERRNO_H +#include +#endif +#if APR_HAVE_STRING_H +#include +#endif +#if APR_HAVE_STRINGS_H +#include +#endif +#if APR_HAVE_DIRENT_H +#include +#endif +#ifdef HAVE_SYS_STAT_H +#include +#endif +#if APR_HAVE_UNISTD_H +#include +#endif +#if APR_HAVE_STDIO_H +#include +#endif +#if APR_HAVE_STDLIB_H +#include +#endif +#if APR_HAVE_SYS_UIO_H +#include +#endif +#if APR_HAVE_SYS_TIME_H +#include +#endif +#ifdef BEOS +#include +#endif + +#if BEOS_BONE +# ifndef BONE7 + /* prior to BONE/7 fd_set & select were defined in sys/socket.h */ +# include +# else + /* Be moved the fd_set stuff and also the FIONBIO definition... */ +# include +# endif +#endif +/* End System headers */ + +#define APR_FILE_BUFSIZE 4096 + +struct apr_file_t { + apr_pool_t *pool; + int filedes; + char *fname; + apr_int32_t flags; + int eof_hit; + int is_pipe; + apr_interval_time_t timeout; + int buffered; + enum {BLK_UNKNOWN, BLK_OFF, BLK_ON } blocking; + int ungetchar; /* Last char provided by an unget op. (-1 = no char)*/ + + /* Stuff for buffered mode */ + char *buffer; + int bufpos; /* Read/Write position in buffer */ + unsigned long dataRead; /* amount of valid data read into buffer */ + int direction; /* buffer being used for 0 = read, 1 = write */ + unsigned long filePtr; /* position in file of handle */ +#if APR_HAS_THREADS + struct apr_thread_mutex_t *thlock; +#endif +}; + +#if APR_HAS_THREADS +#define file_lock(f) do { \ + if ((f)->thlock) \ + apr_thread_mutex_lock((f)->thlock); \ + } while (0) +#define file_unlock(f) do { \ + if ((f)->thlock) \ + apr_thread_mutex_unlock((f)->thlock); \ + } while (0) +#else +#define file_lock(f) do {} while (0) +#define file_unlock(f) do {} while (0) +#endif + +struct apr_dir_t { + apr_pool_t *pool; + char *dirname; + DIR *dirstruct; + struct dirent *entry; +}; + +apr_status_t apr_unix_file_cleanup(void *); +apr_status_t apr_unix_child_file_cleanup(void *); + +mode_t apr_unix_perms2mode(apr_fileperms_t perms); +apr_fileperms_t apr_unix_mode2perms(mode_t mode); + +apr_status_t apr_file_flush_locked(apr_file_t *thefile); +apr_status_t apr_file_info_get_locked(apr_finfo_t *finfo, apr_int32_t wanted, + apr_file_t *thefile); + + +#endif /* ! FILE_IO_H */ + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_arch_global_mutex.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_arch_global_mutex.h new file mode 100644 index 00000000..3add9ecf --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_arch_global_mutex.h @@ -0,0 +1,37 @@ +/* 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. + */ + +#ifndef GLOBAL_MUTEX_H +#define GLOBAL_MUTEX_H + +#include "apr.h" +#include "apr_private.h" +#include "apr_general.h" +#include "apr_lib.h" +#include "apr_global_mutex.h" +#include "apr_arch_proc_mutex.h" +#include "apr_arch_thread_mutex.h" + +struct apr_global_mutex_t { + apr_pool_t *pool; + apr_proc_mutex_t *proc_mutex; +#if APR_HAS_THREADS + apr_thread_mutex_t *thread_mutex; +#endif /* APR_HAS_THREADS */ +}; + +#endif /* GLOBAL_MUTEX_H */ + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_arch_inherit.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_arch_inherit.h new file mode 100644 index 00000000..5e14f67d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_arch_inherit.h @@ -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. + */ + +#ifndef INHERIT_H +#define INHERIT_H + +#include "apr_inherit.h" + +#define APR_INHERIT (1 << 24) /* Must not conflict with other bits */ + +#define APR_IMPLEMENT_INHERIT_SET(name, flag, pool, cleanup) \ +apr_status_t apr_##name##_inherit_set(apr_##name##_t *the##name) \ +{ \ + if (the##name->flag & APR_FILE_NOCLEANUP) \ + return APR_EINVAL; \ + if (!(the##name->flag & APR_INHERIT)) { \ + the##name->flag |= APR_INHERIT; \ + apr_pool_child_cleanup_set(the##name->pool, \ + (void *)the##name, \ + cleanup, apr_pool_cleanup_null); \ + } \ + return APR_SUCCESS; \ +} \ +/* Deprecated */ \ +void apr_##name##_set_inherit(apr_##name##_t *the##name) \ +{ \ + apr_##name##_inherit_set(the##name); \ +} + +#define APR_IMPLEMENT_INHERIT_UNSET(name, flag, pool, cleanup) \ +apr_status_t apr_##name##_inherit_unset(apr_##name##_t *the##name) \ +{ \ + if (the##name->flag & APR_FILE_NOCLEANUP) \ + return APR_EINVAL; \ + if (the##name->flag & APR_INHERIT) { \ + the##name->flag &= ~APR_INHERIT; \ + apr_pool_child_cleanup_set(the##name->pool, \ + (void *)the##name, \ + cleanup, cleanup); \ + } \ + return APR_SUCCESS; \ +} \ +/* Deprecated */ \ +void apr_##name##_unset_inherit(apr_##name##_t *the##name) \ +{ \ + apr_##name##_inherit_unset(the##name); \ +} + +#endif /* ! INHERIT_H */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_arch_internal_time.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_arch_internal_time.h new file mode 100644 index 00000000..6e12c674 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_arch_internal_time.h @@ -0,0 +1,24 @@ +/* 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. + */ + +#ifndef TIME_INTERNAL_H +#define TIME_INTERNAL_H + +#include "apr.h" + +void apr_unix_setup_time(void); + +#endif /* TIME_INTERNAL_H */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_arch_misc.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_arch_misc.h new file mode 100644 index 00000000..82351250 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_arch_misc.h @@ -0,0 +1,67 @@ +/* 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. + */ + +#ifndef MISC_H +#define MISC_H + +#include "apr.h" +#include "apr_portable.h" +#include "apr_private.h" +#include "apr_general.h" +#include "apr_pools.h" +#include "apr_getopt.h" +#include "apr_thread_proc.h" +#include "apr_file_io.h" +#include "apr_errno.h" +#include "apr_getopt.h" + +#if APR_HAVE_STDIO_H +#include +#endif +#if APR_HAVE_SIGNAL_H +#include +#endif +#if APR_HAVE_PTHREAD_H +#include +#endif + +#if APR_HAVE_STDLIB_H +#include +#endif +#if APR_HAVE_STRING_H +#include +#endif + +#ifdef BEOS +#include +#endif + +struct apr_other_child_rec_t { + apr_pool_t *p; + struct apr_other_child_rec_t *next; + apr_proc_t *proc; + void (*maintenance) (int, void *, int); + void *data; + apr_os_file_t write_fd; +}; + +#if defined(WIN32) || defined(NETWARE) +#define WSAHighByte 2 +#define WSALowByte 0 +#endif + +#endif /* ! MISC_H */ + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_arch_networkio.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_arch_networkio.h new file mode 100644 index 00000000..9d77e5c1 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_arch_networkio.h @@ -0,0 +1,134 @@ +/* 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. + */ + +#ifndef NETWORK_IO_H +#define NETWORK_IO_H + +#include "apr.h" +#include "apr_private.h" +#include "apr_network_io.h" +#include "apr_errno.h" +#include "apr_general.h" +#include "apr_lib.h" + +/* System headers the network I/O library needs */ +#if APR_HAVE_SYS_TYPES_H +#include +#endif +#if APR_HAVE_SYS_UIO_H +#include +#endif +#ifdef HAVE_SYS_SELECT_H +#include +#endif +#if APR_HAVE_ERRNO_H +#include +#endif +#if APR_HAVE_SYS_TIME_H +#include +#endif +#if APR_HAVE_UNISTD_H +#include +#endif +#if APR_HAVE_STRING_H +#include +#endif +#if APR_HAVE_NETINET_TCP_H +#include +#endif +#if APR_HAVE_NETINET_SCTP_UIO_H +#include +#endif +#if APR_HAVE_NETINET_SCTP_H +#include +#endif +#if APR_HAVE_NETINET_IN_H +#include +#endif +#if APR_HAVE_ARPA_INET_H +#include +#endif +#if APR_HAVE_SYS_SOCKET_H +#include +#endif +#if APR_HAVE_SYS_SOCKIO_H +#include +#endif +#if APR_HAVE_NETDB_H +#include +#endif +#if APR_HAVE_FCNTL_H +#include +#endif +#if APR_HAVE_SYS_SENDFILE_H +#include +#endif +#if APR_HAVE_SYS_IOCTL_H +#include +#endif +/* End System Headers */ + +#ifndef HAVE_POLLIN +#define POLLIN 1 +#define POLLPRI 2 +#define POLLOUT 4 +#define POLLERR 8 +#define POLLHUP 16 +#define POLLNVAL 32 +#endif + +typedef struct sock_userdata_t sock_userdata_t; +struct sock_userdata_t { + sock_userdata_t *next; + const char *key; + void *data; +}; + +struct apr_socket_t { + apr_pool_t *cntxt; + int socketdes; + int type; + int protocol; + apr_sockaddr_t *local_addr; + apr_sockaddr_t *remote_addr; + apr_interval_time_t timeout; +#ifndef HAVE_POLL + int connected; +#endif + int local_port_unknown; + int local_interface_unknown; + int remote_addr_unknown; + apr_int32_t netmask; + apr_int32_t inherit; + sock_userdata_t *userdata; +}; + +const char *apr_inet_ntop(int af, const void *src, char *dst, apr_size_t size); +int apr_inet_pton(int af, const char *src, void *dst); +void apr_sockaddr_vars_set(apr_sockaddr_t *, int, apr_port_t); + +#define apr_is_option_set(mask, option) ((mask & option) ==option) + +#define apr_set_option(mask, option, on) \ + do { \ + if (on) \ + *mask |= option; \ + else \ + *mask &= ~option; \ + } while (0) + +#endif /* ! NETWORK_IO_H */ + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_arch_proc_mutex.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_arch_proc_mutex.h new file mode 100644 index 00000000..5f4b5acc --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_arch_proc_mutex.h @@ -0,0 +1,130 @@ +/* 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. + */ + +#ifndef PROC_MUTEX_H +#define PROC_MUTEX_H + +#include "apr.h" +#include "apr_private.h" +#include "apr_general.h" +#include "apr_lib.h" +#include "apr_proc_mutex.h" +#include "apr_pools.h" +#include "apr_portable.h" +#include "apr_file_io.h" +#include "apr_arch_file_io.h" + +/* System headers required by Locks library */ +#if APR_HAVE_SYS_TYPES_H +#include +#endif +#if APR_HAVE_STDIO_H +#include +#endif +#if APR_HAVE_FCNTL_H +#include +#endif + +#ifdef HAVE_SYS_IPC_H +#include +#endif +#ifdef HAVE_SYS_SEM_H +#include +#endif +#ifdef HAVE_SYS_FILE_H +#include +#endif +#if APR_HAVE_STDLIB_H +#include +#endif +#if APR_HAVE_UNISTD_H +#include +#endif +#if APR_HAVE_STRING_H +#include +#endif +#ifdef HAVE_SYS_MMAN_H +#include +#endif +#if APR_HAVE_PTHREAD_H +#include +#endif +#if APR_HAVE_SEMAPHORE_H +#include +#endif +/* End System Headers */ + +struct apr_proc_mutex_unix_lock_methods_t { + unsigned int flags; + apr_status_t (*create)(apr_proc_mutex_t *, const char *); + apr_status_t (*acquire)(apr_proc_mutex_t *); + apr_status_t (*tryacquire)(apr_proc_mutex_t *); + apr_status_t (*release)(apr_proc_mutex_t *); + apr_status_t (*cleanup)(void *); + apr_status_t (*child_init)(apr_proc_mutex_t **, apr_pool_t *, const char *); + const char *name; +}; +typedef struct apr_proc_mutex_unix_lock_methods_t apr_proc_mutex_unix_lock_methods_t; + +/* bit values for flags field in apr_unix_lock_methods_t */ +#define APR_PROCESS_LOCK_MECH_IS_GLOBAL 1 + +#if APR_HAS_POSIXSEM_SERIALIZE +extern const apr_proc_mutex_unix_lock_methods_t apr_proc_mutex_unix_posix_methods; +#endif +#if APR_HAS_SYSVSEM_SERIALIZE +extern const apr_proc_mutex_unix_lock_methods_t apr_proc_mutex_unix_sysv_methods; +#endif +#if APR_HAS_FCNTL_SERIALIZE +extern const apr_proc_mutex_unix_lock_methods_t apr_proc_mutex_unix_fcntl_methods; +#endif +#if APR_HAS_FLOCK_SERIALIZE +extern const apr_proc_mutex_unix_lock_methods_t apr_proc_mutex_unix_flock_methods; +#endif +#if APR_HAS_PROC_PTHREAD_SERIALIZE +extern const apr_proc_mutex_unix_lock_methods_t apr_proc_mutex_unix_proc_pthread_methods; +#endif +#if APR_HAS_RWLOCK_SERIALIZE +extern const apr_proc_mutex_unix_lock_methods_t apr_proc_mutex_unix_rwlock_methods; +#endif + + +#if !APR_HAVE_UNION_SEMUN && defined(APR_HAS_SYSVSEM_SERIALIZE) +union semun { + int val; + struct semid_ds *buf; + unsigned short *array; +}; +#endif + +struct apr_proc_mutex_t { + apr_pool_t *pool; + const apr_proc_mutex_unix_lock_methods_t *meth; + const apr_proc_mutex_unix_lock_methods_t *inter_meth; + int curr_locked; + char *fname; +#if APR_HAS_SYSVSEM_SERIALIZE || APR_HAS_FCNTL_SERIALIZE || APR_HAS_FLOCK_SERIALIZE + apr_file_t *interproc; +#endif +#if APR_HAS_PROC_PTHREAD_SERIALIZE + pthread_mutex_t *pthread_interproc; +#endif +}; + +void apr_proc_mutex_unix_setup_lock(void); + +#endif /* PROC_MUTEX_H */ + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_arch_shm.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_arch_shm.h new file mode 100644 index 00000000..dbd9b9bc --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_arch_shm.h @@ -0,0 +1,70 @@ +/* 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. + */ + +#ifndef SHM_H +#define SHM_H + +#include "apr.h" +#include "apr_private.h" +#include "apr_general.h" +#include "apr_lib.h" +#include "apr_shm.h" +#include "apr_pools.h" +#include "apr_file_io.h" +#include "apr_network_io.h" +#include "apr_portable.h" + +#ifdef HAVE_SYS_MMAN_H +#include +#endif +#ifdef HAVE_SYS_IPC_H +#include +#endif +#ifdef HAVE_SYS_MUTEX_H +#include +#endif +#ifdef HAVE_SYS_SHM_H +#include +#endif +#if !defined(SHM_R) +#define SHM_R 0400 +#endif +#if !defined(SHM_W) +#define SHM_W 0200 +#endif +#ifdef HAVE_SYS_FILE_H +#include +#endif + +/* Not all systems seem to have MAP_FAILED defined, but it should always + * just be (void *)-1. */ +#ifndef MAP_FAILED +#define MAP_FAILED ((void *)-1) +#endif + +struct apr_shm_t { + apr_pool_t *pool; + void *base; /* base real address */ + void *usable; /* base usable address */ + apr_size_t reqsize; /* requested segment size */ + apr_size_t realsize; /* actual segment size */ + const char *filename; /* NULL if anonymous */ +#if APR_USE_SHMEM_SHMGET || APR_USE_SHMEM_SHMGET_ANON + int shmid; /* shmem ID returned from shmget() */ +#endif +}; + +#endif /* SHM_H */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_arch_thread_cond.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_arch_thread_cond.h new file mode 100644 index 00000000..fd9ed339 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_arch_thread_cond.h @@ -0,0 +1,42 @@ +/* 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. + */ + +#ifndef THREAD_COND_H +#define THREAD_COND_H + +#include "apr.h" +#include "apr_private.h" +#include "apr_general.h" +#include "apr_lib.h" +#include "apr_thread_mutex.h" +#include "apr_thread_cond.h" +#include "apr_pools.h" + +#if APR_HAVE_PTHREAD_H +#include +#endif + +/* XXX: Should we have a better autoconf search, something like + * APR_HAS_PTHREAD_COND? -aaron */ +#if APR_HAS_THREADS +struct apr_thread_cond_t { + apr_pool_t *pool; + pthread_cond_t *cond; +}; +#endif + +#endif /* THREAD_COND_H */ + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_arch_thread_mutex.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_arch_thread_mutex.h new file mode 100644 index 00000000..40cdef3c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_arch_thread_mutex.h @@ -0,0 +1,39 @@ +/* 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. + */ + +#ifndef THREAD_MUTEX_H +#define THREAD_MUTEX_H + +#include "apr.h" +#include "apr_private.h" +#include "apr_general.h" +#include "apr_thread_mutex.h" +#include "apr_portable.h" +#include "apr_atomic.h" + +#if APR_HAVE_PTHREAD_H +#include +#endif + +#if APR_HAS_THREADS +struct apr_thread_mutex_t { + apr_pool_t *pool; + pthread_mutex_t mutex; +}; +#endif + +#endif /* THREAD_MUTEX_H */ + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_arch_thread_rwlock.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_arch_thread_rwlock.h new file mode 100644 index 00000000..647ce264 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_arch_thread_rwlock.h @@ -0,0 +1,49 @@ +/* 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. + */ + +#ifndef THREAD_RWLOCK_H +#define THREAD_RWLOCK_H + +#include "apr.h" +#include "apr_private.h" +#include "apr_general.h" +#include "apr_thread_rwlock.h" +#include "apr_pools.h" + +#if APR_HAVE_PTHREAD_H +/* this gives us pthread_rwlock_t */ +#include +#endif + +#if APR_HAS_THREADS +#ifdef HAVE_PTHREAD_RWLOCKS + +struct apr_thread_rwlock_t { + apr_pool_t *pool; + pthread_rwlock_t *rwlock; +}; + +#else + +struct apr_thread_rwlock_t { + apr_pool_t *pool; +}; +#endif + +#endif + +#endif /* THREAD_RWLOCK_H */ + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_arch_threadproc.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_arch_threadproc.h new file mode 100644 index 00000000..2955f502 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_arch_threadproc.h @@ -0,0 +1,104 @@ +/* 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. + */ + +#include "apr.h" +#include "apr_private.h" +#include "apr_thread_proc.h" +#include "apr_file_io.h" +#include "apr_arch_file_io.h" + +/* System headers required for thread/process library */ +#if APR_HAVE_PTHREAD_H +#include +#endif +#ifdef HAVE_SYS_RESOURCE_H +#include +#endif +#if APR_HAVE_SIGNAL_H +#include +#endif +#if APR_HAVE_STRING_H +#include +#endif +#if APR_HAVE_SYS_WAIT_H +#include +#endif +#if APR_HAVE_STRING_H +#include +#endif +/* End System Headers */ + + +#ifndef THREAD_PROC_H +#define THREAD_PROC_H + +#define SHELL_PATH "/bin/sh" + +#if APR_HAS_THREADS + +struct apr_thread_t { + apr_pool_t *pool; + pthread_t *td; + void *data; + apr_thread_start_t func; + apr_status_t exitval; +}; + +struct apr_threadattr_t { + apr_pool_t *pool; + pthread_attr_t *attr; +}; + +struct apr_threadkey_t { + apr_pool_t *pool; + pthread_key_t key; +}; + +struct apr_thread_once_t { + pthread_once_t once; +}; + +#endif + +struct apr_procattr_t { + apr_pool_t *pool; + apr_file_t *parent_in; + apr_file_t *child_in; + apr_file_t *parent_out; + apr_file_t *child_out; + apr_file_t *parent_err; + apr_file_t *child_err; + char *currdir; + apr_int32_t cmdtype; + apr_int32_t detached; +#ifdef RLIMIT_CPU + struct rlimit *limit_cpu; +#endif +#if defined (RLIMIT_DATA) || defined (RLIMIT_VMEM) || defined(RLIMIT_AS) + struct rlimit *limit_mem; +#endif +#ifdef RLIMIT_NPROC + struct rlimit *limit_nproc; +#endif +#ifdef RLIMIT_NOFILE + struct rlimit *limit_nofile; +#endif + apr_child_errfn_t *errfn; + apr_int32_t errchk; +}; + +#endif /* ! THREAD_PROC_H */ + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_private.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_private.h new file mode 100644 index 00000000..c40a923b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_private.h @@ -0,0 +1,743 @@ +/* include/arch/unix/apr_private.h. Generated from apr_private.h.in by configure. */ +/* include/arch/unix/apr_private.h.in. Generated from configure.in by autoheader. */ +#ifndef APR_PRIVATE_H +#define APR_PRIVATE_H + + +/* Various #defines we need to know about */ +#define USE_THREADS 1 +/* #undef EGD_DEFAULT_SOCKET */ +/* #undef HAVE_isascii */ +#define DIRENT_INODE d_fileno +#define DIRENT_TYPE d_type + +/* Cross process serialization techniques */ +/* #undef USE_FLOCK_SERIALIZE */ +#define USE_SYSVSEM_SERIALIZE 1 +/* #undef USE_FCNTL_SERIALIZE */ +/* #undef USE_PROC_PTHREAD_SERIALIZE */ +/* #undef USE_PTHREAD_SERIALIZE */ + +/* #undef POSIXSEM_IS_GLOBAL */ +/* #undef SYSVSEM_IS_GLOBAL */ +/* #undef FCNTL_IS_GLOBAL */ +/* #undef FLOCK_IS_GLOBAL */ + +/* #undef HAVE_INT64_C */ + + +/* Define if crypt_r has uses CRYPTD */ +/* #undef CRYPT_R_CRYPTD */ + +/* Define if crypt_r uses struct crypt_data */ +#define CRYPT_R_STRUCT_CRYPT_DATA 1 + +/* Define to path of random device */ +#define DEV_RANDOM "/dev/random" + +/* Define if DSO support uses dlfcn.h */ +#define DSO_USE_DLFCN 1 + +/* Define if DSO support uses dyld.h */ +/* #undef DSO_USE_DYLD */ + +/* Define if DSO support uses shl_load */ +/* #undef DSO_USE_SHL */ + +/* Define to list of paths to EGD sockets */ +/* #undef EGD_DEFAULT_SOCKET */ + +/* Define if fcntl locks affect threads within the process */ +/* #undef FCNTL_IS_GLOBAL */ + +/* Define if flock locks affect threads within the process */ +/* #undef FLOCK_IS_GLOBAL */ + +/* Define if gethostbyaddr is thread safe */ +/* #undef GETHOSTBYADDR_IS_THREAD_SAFE */ + +/* Define if gethostbyname is thread safe */ +/* #undef GETHOSTBYNAME_IS_THREAD_SAFE */ + +/* Define if gethostbyname_r has the glibc style */ +#define GETHOSTBYNAME_R_GLIBC2 1 + +/* Define if gethostbyname_r has the hostent_data for the third argument */ +/* #undef GETHOSTBYNAME_R_HOSTENT_DATA */ + +/* Define to 1 if you have the `alloca' function. */ +/* #undef HAVE_ALLOCA */ + +/* Define to 1 if you have the header file. */ +#define HAVE_ALLOCA_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_ARPA_INET_H 1 + +/* Define if BONE_VERSION is defined in sys/socket.h */ +/* #undef HAVE_BONE_VERSION */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_BYTEORDER_H */ + +/* Define to 1 if you have the `calloc' function. */ +#define HAVE_CALLOC 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_CONIO_H */ + +/* Define to 1 if you have the `create_area' function. */ +/* #undef HAVE_CREATE_AREA */ + +/* Define to 1 if you have the header file. */ +#define HAVE_CRYPT_H 1 + +/* Define to 1 if you have the `crypt_r' function. */ +#define HAVE_CRYPT_R 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_CTYPE_H 1 + +/* Define to 1 if you have the declaration of `sys_siglist', and to 0 if you + don't. */ +#define HAVE_DECL_SYS_SIGLIST 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_DIRENT_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_DIR_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_DLFCN_H 1 + +/* Define to 1 if you have the `dlopen' function. */ +/* #undef HAVE_DLOPEN */ + +/* Define to 1 if you have the `dlsym' function. */ +#define HAVE_DLSYM 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_DL_H */ + +/* Define if EGD is supported */ +/* #undef HAVE_EGD */ + +/* Define to 1 if you have the header file. */ +#define HAVE_ERRNO_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_FCNTL_H 1 + +/* Define to 1 if you have the `flock' function. */ +#define HAVE_FLOCK 1 + +/* Define to 1 if you have the `fork' function. */ +#define HAVE_FORK 1 + +/* Define if fstat64 can be used */ +#define HAVE_FSTAT64 1 + +/* Define if F_SETLK is defined in fcntl.h */ +#define HAVE_F_SETLK 1 + +/* Define to 1 if you have the `gai_strerror' function. */ +#define HAVE_GAI_STRERROR 1 + +/* Define if getaddrinfo exists and works well enough for APR */ +#define HAVE_GETADDRINFO 1 + +/* Define to 1 if you have the `getenv' function. */ +#define HAVE_GETENV 1 + +/* Define to 1 if you have the `getgrgid_r' function. */ +#define HAVE_GETGRGID_R 1 + +/* Define to 1 if you have the `getgrnam_r' function. */ +#define HAVE_GETGRNAM_R 1 + +/* Define to 1 if you have the `gethostbyaddr_r' function. */ +#define HAVE_GETHOSTBYADDR_R 1 + +/* Define to 1 if you have the `gethostbyname_r' function. */ +#define HAVE_GETHOSTBYNAME_R 1 + +/* Define if getnameinfo exists */ +#define HAVE_GETNAMEINFO 1 + +/* Define to 1 if you have the `getpass' function. */ +#define HAVE_GETPASS 1 + +/* Define to 1 if you have the `getpassphrase' function. */ +/* #undef HAVE_GETPASSPHRASE */ + +/* Define to 1 if you have the `getpwnam_r' function. */ +#define HAVE_GETPWNAM_R 1 + +/* Define to 1 if you have the `getpwuid_r' function. */ +#define HAVE_GETPWUID_R 1 + +/* Define to 1 if you have the `getrlimit' function. */ +#define HAVE_GETRLIMIT 1 + +/* Define to 1 if you have the `gmtime_r' function. */ +#define HAVE_GMTIME_R 1 + +/* Define if struct tm has a tm_gmtoff field */ +#define HAVE_GMTOFF 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_GRP_H 1 + +/* Define to 1 if you have the `hstrerror' function. */ +#define HAVE_HSTRERROR 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_IO_H */ + +/* Define to 1 if you have the `isinf' function. */ +#define HAVE_ISINF 1 + +/* Define to 1 if you have the `isnan' function. */ +#define HAVE_ISNAN 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_KERNEL_OS_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_LANGINFO_H 1 + +/* Define to 1 if you have the `bsd' library (-lbsd). */ +/* #undef HAVE_LIBBSD */ + +/* Define to 1 if you have the `nsl' library (-lnsl). */ +#define HAVE_LIBNSL 1 + +/* Define to 1 if you have the `resolv' library (-lresolv). */ +/* #undef HAVE_LIBRESOLV */ + +/* Define to 1 if you have the `sendfile' library (-lsendfile). */ +/* #undef HAVE_LIBSENDFILE */ + +/* Define to 1 if you have the `socket' library (-lsocket). */ +/* #undef HAVE_LIBSOCKET */ + +/* Define to 1 if you have the `truerand' library (-ltruerand). */ +/* #undef HAVE_LIBTRUERAND */ + +/* Define to 1 if you have the header file. */ +#define HAVE_LIMITS_H 1 + +/* Define to 1 if you have the `localtime_r' function. */ +#define HAVE_LOCALTIME_R 1 + +/* Define if LOCK_EX is defined in sys/file.h */ +#define HAVE_LOCK_EX 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_MACH_O_DYLD_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_MALLOC_H 1 + +/* Define if MAP_ANON is defined in sys/mman.h */ +#define HAVE_MAP_ANON 1 + +/* Define to 1 if you have the `memchr' function. */ +#define HAVE_MEMCHR 1 + +/* Define to 1 if you have the `memmove' function. */ +#define HAVE_MEMMOVE 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the `mkstemp' function. */ +#define HAVE_MKSTEMP 1 + +/* Define to 1 if you have the `mmap' function. */ +#define HAVE_MMAP 1 + +/* Define to 1 if you have the `munmap' function. */ +#define HAVE_MUNMAP 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_NETDB_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_NETINET_IN_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_NETINET_SCTP_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_NETINET_SCTP_UIO_H */ + +/* Defined if netinet/tcp.h is present */ +#define HAVE_NETINET_TCP_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_NET_ERRNO_H */ + +/* Define to 1 if you have the `nl_langinfo' function. */ +#define HAVE_NL_LANGINFO 1 + +/* Define to 1 if you have the `NSLinkModule' function. */ +/* #undef HAVE_NSLINKMODULE */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_OS2_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_OSRELDATE_H */ + +/* Define to 1 if you have the `poll' function. */ +#define HAVE_POLL 1 + +/* Define if POLLIN is defined */ +#define HAVE_POLLIN 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_POLL_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_PROCESS_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_PTHREAD_H 1 + +/* Define to 1 if you have the `pthread_key_delete' function. */ +#define HAVE_PTHREAD_KEY_DELETE 1 + +/* Define to 1 if you have the `pthread_mutexattr_setpshared' function. */ +#define HAVE_PTHREAD_MUTEXATTR_SETPSHARED 1 + +/* Define if recursive pthread mutexes are available */ +#define HAVE_PTHREAD_MUTEX_RECURSIVE 1 + +/* Define if cross-process robust mutexes are available */ +#define HAVE_PTHREAD_MUTEX_ROBUST 1 + +/* Define if PTHREAD_PROCESS_SHARED is defined in pthread.h */ +#define HAVE_PTHREAD_PROCESS_SHARED 1 + +/* Define if pthread rwlocks are available */ +#define HAVE_PTHREAD_RWLOCKS 1 + +/* Define to 1 if you have the `pthread_rwlock_init' function. */ +#define HAVE_PTHREAD_RWLOCK_INIT 1 + +/* Define to 1 if you have the `putenv' function. */ +#define HAVE_PUTENV 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_PWD_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SEMAPHORE_H 1 + +/* Define to 1 if you have the `semctl' function. */ +#define HAVE_SEMCTL 1 + +/* Define to 1 if you have the `semget' function. */ +#define HAVE_SEMGET 1 + +/* Define to 1 if you have the `sem_close' function. */ +#define HAVE_SEM_CLOSE 1 + +/* Define to 1 if you have the `sem_post' function. */ +#define HAVE_SEM_POST 1 + +/* Define if SEM_UNDO is defined in sys/sem.h */ +#define HAVE_SEM_UNDO 1 + +/* Define to 1 if you have the `sem_unlink' function. */ +#define HAVE_SEM_UNLINK 1 + +/* Define to 1 if you have the `sem_wait' function. */ +#define HAVE_SEM_WAIT 1 + +/* Define to 1 if you have the `sendfile' function. */ +#define HAVE_SENDFILE 1 + +/* Define to 1 if you have the `sendfilev' function. */ +/* #undef HAVE_SENDFILEV */ + +/* Define to 1 if you have the `send_file' function. */ +/* #undef HAVE_SEND_FILE */ + +/* Define to 1 if you have the `setenv' function. */ +#define HAVE_SETENV 1 + +/* Define to 1 if you have the `setrlimit' function. */ +#define HAVE_SETRLIMIT 1 + +/* Define to 1 if you have the `setsid' function. */ +#define HAVE_SETSID 1 + +/* Define to 1 if you have the `set_h_errno' function. */ +/* #undef HAVE_SET_H_ERRNO */ + +/* Define to 1 if you have the `shmat' function. */ +#define HAVE_SHMAT 1 + +/* Define to 1 if you have the `shmctl' function. */ +#define HAVE_SHMCTL 1 + +/* Define to 1 if you have the `shmdt' function. */ +#define HAVE_SHMDT 1 + +/* Define to 1 if you have the `shmget' function. */ +#define HAVE_SHMGET 1 + +/* Define to 1 if you have the `shm_open' function. */ +#define HAVE_SHM_OPEN 1 + +/* Define to 1 if you have the `shm_unlink' function. */ +#define HAVE_SHM_UNLINK 1 + +/* Define to 1 if you have the `sigaction' function. */ +#define HAVE_SIGACTION 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SIGNAL_H 1 + +/* Define to 1 if you have the `sigsuspend' function. */ +#define HAVE_SIGSUSPEND 1 + +/* Define to 1 if you have the `sigwait' function. */ +#define HAVE_SIGWAIT 1 + +/* Whether you have socklen_t */ +#define HAVE_SOCKLEN_T 1 + +/* Define if SO_ACCEPTFILTER is defined in sys/socket.h */ +/* #undef HAVE_SO_ACCEPTFILTER */ + +/* Define to 1 if you have the header file. */ +#define HAVE_STDARG_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDDEF_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDIO_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the `strcasecmp' function. */ +#define HAVE_STRCASECMP 1 + +/* Define to 1 if you have the `strdup' function. */ +#define HAVE_STRDUP 1 + +/* Define to 1 if you have the `strerror_r' function. */ +#define HAVE_STRERROR_R 1 + +/* Define to 1 if you have the `stricmp' function. */ +/* #undef HAVE_STRICMP */ + +/* Define to 1 if you have the header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the `strncasecmp' function. */ +#define HAVE_STRNCASECMP 1 + +/* Define to 1 if you have the `strnicmp' function. */ +/* #undef HAVE_STRNICMP */ + +/* Define to 1 if you have the `strstr' function. */ +#define HAVE_STRSTR 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYSAPI_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYSGTIME_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_FILE_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_IOCTL_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_IPC_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_MMAN_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_MUTEX_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_POLL_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_RESOURCE_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_SELECT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_SEM_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_SENDFILE_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_SHM_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_SIGNAL_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_SOCKET_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_SOCKIO_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_SYSCTL_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_SYSLIMITS_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TIME_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_UIO_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_UN_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_WAIT_H 1 + +/* Define if TCP_CORK is defined in netinet/tcp.h */ +#define HAVE_TCP_CORK 1 + +/* Define if TCP_NOPUSH is defined in netinet/tcp.h */ +/* #undef HAVE_TCP_NOPUSH */ + +/* Define to 1 if you have the header file. */ +#define HAVE_TERMIOS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_TIME_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_TPFEQ_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_TPFIO_H */ + +/* Define if truerand is supported */ +/* #undef HAVE_TRUERAND */ + +/* Define to 1 if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_UNIX_H */ + +/* Define to 1 if you have the `unsetenv' function. */ +#define HAVE_UNSETENV 1 + +/* Define to 1 if you have the `utime' function. */ +#define HAVE_UTIME 1 + +/* Define to 1 if you have the `utimes' function. */ +#define HAVE_UTIMES 1 + +/* Define if C compiler supports VLA */ +#define HAVE_VLA 1 + +/* Define to 1 if you have the `waitpid' function. */ +#define HAVE_WAITPID 1 + +/* Define to 1 if you have the `writev' function. */ +#define HAVE_WRITEV 1 + +/* Define if EAI_ error codes from getaddrinfo are negative */ +#define NEGATIVE_EAI 1 + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "" + +/* Define if POSIX semaphores affect threads within the process */ +/* #undef POSIXSEM_IS_GLOBAL */ + +/* Define if pthread_attr_getdetachstate() has one arg */ +/* #undef PTHREAD_ATTR_GETDETACHSTATE_TAKES_ONE_ARG */ + +/* Define if pthread_getspecific() has two args */ +/* #undef PTHREAD_GETSPECIFIC_TAKES_TWO_ARGS */ + +/* Define if readdir is thread safe */ +/* #undef READDIR_IS_THREAD_SAFE */ + +/* Define if resolv.h's res_state has the fields retrans/rety */ +#define RESOLV_RETRANSRETRY 1 + +/* Define to 1 if the `setpgrp' function takes no argument. */ +#define SETPGRP_VOID 1 + +/* */ +/* #undef SIGWAIT_TAKES_ONE_ARG */ + +/* The size of `char', as computed by sizeof. */ +#define SIZEOF_CHAR 1 + +/* The size of `int', as computed by sizeof. */ +#define SIZEOF_INT 4 + +/* The size of `long', as computed by sizeof. */ +#define SIZEOF_LONG 8 + +/* The size of `long double', as computed by sizeof. */ +#define SIZEOF_LONG_DOUBLE 16 + +/* The size of `long long', as computed by sizeof. */ +#define SIZEOF_LONG_LONG 8 + +/* The size of off_t */ +#define SIZEOF_OFF_T 8 + +/* The size of pid_t */ +#define SIZEOF_PID_T 4 + +/* The size of `short', as computed by sizeof. */ +#define SIZEOF_SHORT 2 + +/* The size of size_t */ +#define SIZEOF_SIZE_T 8 + +/* The size of ssize_t */ +#define SIZEOF_SSIZE_T 8 + +/* The size of `void*', as computed by sizeof. */ +#define SIZEOF_VOIDP 8 + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Define if strerror returns int */ +/* #undef STRERROR_R_RC_INT */ + +/* Define if SysV semaphores affect threads within the process */ +/* #undef SYSVSEM_IS_GLOBAL */ + +/* Enable extensions on AIX 3, Interix. */ +#ifndef _ALL_SOURCE +# define _ALL_SOURCE 1 +#endif +/* Enable GNU extensions on systems that have them. */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif +/* Enable threading extensions on Solaris. */ +#ifndef _POSIX_PTHREAD_SEMANTICS +# define _POSIX_PTHREAD_SEMANTICS 1 +#endif +/* Enable extensions on HP NonStop. */ +#ifndef _TANDEM_SOURCE +# define _TANDEM_SOURCE 1 +#endif +/* Enable general extensions on Solaris. */ +#ifndef __EXTENSIONS__ +# define __EXTENSIONS__ 1 +#endif + + +/* Define if APR supports threads */ +#define USE_THREADS 1 + +/* Define to 1 if on MINIX. */ +/* #undef _MINIX */ + +/* Define to 2 if the system does not provide POSIX.1 features except with + this defined. */ +/* #undef _POSIX_1_SOURCE */ + +/* Define to 1 if you need to in order for `stat' and other things to work. */ +/* #undef _POSIX_SOURCE */ + +/* Define to empty if `const' does not conform to ANSI C. */ +/* #undef const */ + +/* Define to `int' if doesn't define. */ +/* #undef gid_t */ + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +/* #undef inline */ +#endif + +/* Define to `long int' if does not define. */ +/* #undef off_t */ + +/* Define to `int' if does not define. */ +/* #undef pid_t */ + +/* Define to `unsigned int' if does not define. */ +/* #undef size_t */ + +/* Define to `int' if does not define. */ +/* #undef ssize_t */ + +/* Define to `int' if doesn't define. */ +/* #undef uid_t */ + +/* Make sure we have ssize_t defined to be something */ +/* #undef ssize_t */ + +/* switch this on if we have a BeOS version below BONE */ +#if BEOS && !HAVE_BONE_VERSION +#define BEOS_R5 1 +#else +#define BEOS_BONE 1 +#endif + +#ifdef SIGWAIT_TAKES_ONE_ARG +#define apr_sigwait(a,b) ((*(b)=sigwait((a)))<0?-1:0) +#else +#define apr_sigwait(a,b) sigwait((a),(b)) +#endif + +/* + * Include common private declarations. + */ +#include "../apr_private_common.h" + +#endif /* APR_PRIVATE_H */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_private.h.in b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_private.h.in new file mode 100644 index 00000000..7e6b4d9d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_private.h.in @@ -0,0 +1,742 @@ +/* include/arch/unix/apr_private.h.in. Generated from configure.in by autoheader. */ +#ifndef APR_PRIVATE_H +#define APR_PRIVATE_H + + +/* Various #defines we need to know about */ +#undef USE_THREADS +#undef EGD_DEFAULT_SOCKET +#undef HAVE_isascii +#undef DIRENT_INODE +#undef DIRENT_TYPE + +/* Cross process serialization techniques */ +#undef USE_FLOCK_SERIALIZE +#undef USE_SYSVSEM_SERIALIZE +#undef USE_FCNTL_SERIALIZE +#undef USE_PROC_PTHREAD_SERIALIZE +#undef USE_PTHREAD_SERIALIZE + +#undef POSIXSEM_IS_GLOBAL +#undef SYSVSEM_IS_GLOBAL +#undef FCNTL_IS_GLOBAL +#undef FLOCK_IS_GLOBAL + +#undef HAVE_INT64_C + + +/* Define if crypt_r has uses CRYPTD */ +#undef CRYPT_R_CRYPTD + +/* Define if crypt_r uses struct crypt_data */ +#undef CRYPT_R_STRUCT_CRYPT_DATA + +/* Define to path of random device */ +#undef DEV_RANDOM + +/* Define if DSO support uses dlfcn.h */ +#undef DSO_USE_DLFCN + +/* Define if DSO support uses dyld.h */ +#undef DSO_USE_DYLD + +/* Define if DSO support uses shl_load */ +#undef DSO_USE_SHL + +/* Define to list of paths to EGD sockets */ +#undef EGD_DEFAULT_SOCKET + +/* Define if fcntl locks affect threads within the process */ +#undef FCNTL_IS_GLOBAL + +/* Define if flock locks affect threads within the process */ +#undef FLOCK_IS_GLOBAL + +/* Define if gethostbyaddr is thread safe */ +#undef GETHOSTBYADDR_IS_THREAD_SAFE + +/* Define if gethostbyname is thread safe */ +#undef GETHOSTBYNAME_IS_THREAD_SAFE + +/* Define if gethostbyname_r has the glibc style */ +#undef GETHOSTBYNAME_R_GLIBC2 + +/* Define if gethostbyname_r has the hostent_data for the third argument */ +#undef GETHOSTBYNAME_R_HOSTENT_DATA + +/* Define to 1 if you have the `alloca' function. */ +#undef HAVE_ALLOCA + +/* Define to 1 if you have the header file. */ +#undef HAVE_ALLOCA_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_ARPA_INET_H + +/* Define if BONE_VERSION is defined in sys/socket.h */ +#undef HAVE_BONE_VERSION + +/* Define to 1 if you have the header file. */ +#undef HAVE_BYTEORDER_H + +/* Define to 1 if you have the `calloc' function. */ +#undef HAVE_CALLOC + +/* Define to 1 if you have the header file. */ +#undef HAVE_CONIO_H + +/* Define to 1 if you have the `create_area' function. */ +#undef HAVE_CREATE_AREA + +/* Define to 1 if you have the header file. */ +#undef HAVE_CRYPT_H + +/* Define to 1 if you have the `crypt_r' function. */ +#undef HAVE_CRYPT_R + +/* Define to 1 if you have the header file. */ +#undef HAVE_CTYPE_H + +/* Define to 1 if you have the declaration of `sys_siglist', and to 0 if you + don't. */ +#undef HAVE_DECL_SYS_SIGLIST + +/* Define to 1 if you have the header file. */ +#undef HAVE_DIRENT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_DIR_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_DLFCN_H + +/* Define to 1 if you have the `dlopen' function. */ +#undef HAVE_DLOPEN + +/* Define to 1 if you have the `dlsym' function. */ +#undef HAVE_DLSYM + +/* Define to 1 if you have the header file. */ +#undef HAVE_DL_H + +/* Define if EGD is supported */ +#undef HAVE_EGD + +/* Define to 1 if you have the header file. */ +#undef HAVE_ERRNO_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_FCNTL_H + +/* Define to 1 if you have the `flock' function. */ +#undef HAVE_FLOCK + +/* Define to 1 if you have the `fork' function. */ +#undef HAVE_FORK + +/* Define if fstat64 can be used */ +#undef HAVE_FSTAT64 + +/* Define if F_SETLK is defined in fcntl.h */ +#undef HAVE_F_SETLK + +/* Define to 1 if you have the `gai_strerror' function. */ +#undef HAVE_GAI_STRERROR + +/* Define if getaddrinfo exists and works well enough for APR */ +#undef HAVE_GETADDRINFO + +/* Define to 1 if you have the `getenv' function. */ +#undef HAVE_GETENV + +/* Define to 1 if you have the `getgrgid_r' function. */ +#undef HAVE_GETGRGID_R + +/* Define to 1 if you have the `getgrnam_r' function. */ +#undef HAVE_GETGRNAM_R + +/* Define to 1 if you have the `gethostbyaddr_r' function. */ +#undef HAVE_GETHOSTBYADDR_R + +/* Define to 1 if you have the `gethostbyname_r' function. */ +#undef HAVE_GETHOSTBYNAME_R + +/* Define if getnameinfo exists */ +#undef HAVE_GETNAMEINFO + +/* Define to 1 if you have the `getpass' function. */ +#undef HAVE_GETPASS + +/* Define to 1 if you have the `getpassphrase' function. */ +#undef HAVE_GETPASSPHRASE + +/* Define to 1 if you have the `getpwnam_r' function. */ +#undef HAVE_GETPWNAM_R + +/* Define to 1 if you have the `getpwuid_r' function. */ +#undef HAVE_GETPWUID_R + +/* Define to 1 if you have the `getrlimit' function. */ +#undef HAVE_GETRLIMIT + +/* Define to 1 if you have the `gmtime_r' function. */ +#undef HAVE_GMTIME_R + +/* Define if struct tm has a tm_gmtoff field */ +#undef HAVE_GMTOFF + +/* Define to 1 if you have the header file. */ +#undef HAVE_GRP_H + +/* Define to 1 if you have the `hstrerror' function. */ +#undef HAVE_HSTRERROR + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_IO_H + +/* Define to 1 if you have the `isinf' function. */ +#undef HAVE_ISINF + +/* Define to 1 if you have the `isnan' function. */ +#undef HAVE_ISNAN + +/* Define to 1 if you have the header file. */ +#undef HAVE_KERNEL_OS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_LANGINFO_H + +/* Define to 1 if you have the `bsd' library (-lbsd). */ +#undef HAVE_LIBBSD + +/* Define to 1 if you have the `nsl' library (-lnsl). */ +#undef HAVE_LIBNSL + +/* Define to 1 if you have the `resolv' library (-lresolv). */ +#undef HAVE_LIBRESOLV + +/* Define to 1 if you have the `sendfile' library (-lsendfile). */ +#undef HAVE_LIBSENDFILE + +/* Define to 1 if you have the `socket' library (-lsocket). */ +#undef HAVE_LIBSOCKET + +/* Define to 1 if you have the `truerand' library (-ltruerand). */ +#undef HAVE_LIBTRUERAND + +/* Define to 1 if you have the header file. */ +#undef HAVE_LIMITS_H + +/* Define to 1 if you have the `localtime_r' function. */ +#undef HAVE_LOCALTIME_R + +/* Define if LOCK_EX is defined in sys/file.h */ +#undef HAVE_LOCK_EX + +/* Define to 1 if you have the header file. */ +#undef HAVE_MACH_O_DYLD_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MALLOC_H + +/* Define if MAP_ANON is defined in sys/mman.h */ +#undef HAVE_MAP_ANON + +/* Define to 1 if you have the `memchr' function. */ +#undef HAVE_MEMCHR + +/* Define to 1 if you have the `memmove' function. */ +#undef HAVE_MEMMOVE + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the `mkstemp' function. */ +#undef HAVE_MKSTEMP + +/* Define to 1 if you have the `mmap' function. */ +#undef HAVE_MMAP + +/* Define to 1 if you have the `munmap' function. */ +#undef HAVE_MUNMAP + +/* Define to 1 if you have the header file. */ +#undef HAVE_NETDB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_NETINET_IN_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_NETINET_SCTP_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_NETINET_SCTP_UIO_H + +/* Defined if netinet/tcp.h is present */ +#undef HAVE_NETINET_TCP_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_NET_ERRNO_H + +/* Define to 1 if you have the `nl_langinfo' function. */ +#undef HAVE_NL_LANGINFO + +/* Define to 1 if you have the `NSLinkModule' function. */ +#undef HAVE_NSLINKMODULE + +/* Define to 1 if you have the header file. */ +#undef HAVE_OS2_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_OSRELDATE_H + +/* Define to 1 if you have the `poll' function. */ +#undef HAVE_POLL + +/* Define if POLLIN is defined */ +#undef HAVE_POLLIN + +/* Define to 1 if you have the header file. */ +#undef HAVE_POLL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_PROCESS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_PTHREAD_H + +/* Define to 1 if you have the `pthread_key_delete' function. */ +#undef HAVE_PTHREAD_KEY_DELETE + +/* Define to 1 if you have the `pthread_mutexattr_setpshared' function. */ +#undef HAVE_PTHREAD_MUTEXATTR_SETPSHARED + +/* Define if recursive pthread mutexes are available */ +#undef HAVE_PTHREAD_MUTEX_RECURSIVE + +/* Define if cross-process robust mutexes are available */ +#undef HAVE_PTHREAD_MUTEX_ROBUST + +/* Define if PTHREAD_PROCESS_SHARED is defined in pthread.h */ +#undef HAVE_PTHREAD_PROCESS_SHARED + +/* Define if pthread rwlocks are available */ +#undef HAVE_PTHREAD_RWLOCKS + +/* Define to 1 if you have the `pthread_rwlock_init' function. */ +#undef HAVE_PTHREAD_RWLOCK_INIT + +/* Define to 1 if you have the `putenv' function. */ +#undef HAVE_PUTENV + +/* Define to 1 if you have the header file. */ +#undef HAVE_PWD_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SEMAPHORE_H + +/* Define to 1 if you have the `semctl' function. */ +#undef HAVE_SEMCTL + +/* Define to 1 if you have the `semget' function. */ +#undef HAVE_SEMGET + +/* Define to 1 if you have the `sem_close' function. */ +#undef HAVE_SEM_CLOSE + +/* Define to 1 if you have the `sem_post' function. */ +#undef HAVE_SEM_POST + +/* Define if SEM_UNDO is defined in sys/sem.h */ +#undef HAVE_SEM_UNDO + +/* Define to 1 if you have the `sem_unlink' function. */ +#undef HAVE_SEM_UNLINK + +/* Define to 1 if you have the `sem_wait' function. */ +#undef HAVE_SEM_WAIT + +/* Define to 1 if you have the `sendfile' function. */ +#undef HAVE_SENDFILE + +/* Define to 1 if you have the `sendfilev' function. */ +#undef HAVE_SENDFILEV + +/* Define to 1 if you have the `send_file' function. */ +#undef HAVE_SEND_FILE + +/* Define to 1 if you have the `setenv' function. */ +#undef HAVE_SETENV + +/* Define to 1 if you have the `setrlimit' function. */ +#undef HAVE_SETRLIMIT + +/* Define to 1 if you have the `setsid' function. */ +#undef HAVE_SETSID + +/* Define to 1 if you have the `set_h_errno' function. */ +#undef HAVE_SET_H_ERRNO + +/* Define to 1 if you have the `shmat' function. */ +#undef HAVE_SHMAT + +/* Define to 1 if you have the `shmctl' function. */ +#undef HAVE_SHMCTL + +/* Define to 1 if you have the `shmdt' function. */ +#undef HAVE_SHMDT + +/* Define to 1 if you have the `shmget' function. */ +#undef HAVE_SHMGET + +/* Define to 1 if you have the `shm_open' function. */ +#undef HAVE_SHM_OPEN + +/* Define to 1 if you have the `shm_unlink' function. */ +#undef HAVE_SHM_UNLINK + +/* Define to 1 if you have the `sigaction' function. */ +#undef HAVE_SIGACTION + +/* Define to 1 if you have the header file. */ +#undef HAVE_SIGNAL_H + +/* Define to 1 if you have the `sigsuspend' function. */ +#undef HAVE_SIGSUSPEND + +/* Define to 1 if you have the `sigwait' function. */ +#undef HAVE_SIGWAIT + +/* Whether you have socklen_t */ +#undef HAVE_SOCKLEN_T + +/* Define if SO_ACCEPTFILTER is defined in sys/socket.h */ +#undef HAVE_SO_ACCEPTFILTER + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDARG_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDDEF_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDIO_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the `strcasecmp' function. */ +#undef HAVE_STRCASECMP + +/* Define to 1 if you have the `strdup' function. */ +#undef HAVE_STRDUP + +/* Define to 1 if you have the `strerror_r' function. */ +#undef HAVE_STRERROR_R + +/* Define to 1 if you have the `stricmp' function. */ +#undef HAVE_STRICMP + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the `strncasecmp' function. */ +#undef HAVE_STRNCASECMP + +/* Define to 1 if you have the `strnicmp' function. */ +#undef HAVE_STRNICMP + +/* Define to 1 if you have the `strstr' function. */ +#undef HAVE_STRSTR + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYSAPI_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYSGTIME_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_FILE_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_IOCTL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_IPC_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_MMAN_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_MUTEX_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_POLL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_RESOURCE_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SELECT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SEM_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SENDFILE_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SHM_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SIGNAL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SOCKET_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SOCKIO_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SYSCTL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_SYSLIMITS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TIME_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_UIO_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_UN_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_WAIT_H + +/* Define if TCP_CORK is defined in netinet/tcp.h */ +#undef HAVE_TCP_CORK + +/* Define if TCP_NOPUSH is defined in netinet/tcp.h */ +#undef HAVE_TCP_NOPUSH + +/* Define to 1 if you have the header file. */ +#undef HAVE_TERMIOS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_TIME_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_TPFEQ_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_TPFIO_H + +/* Define if truerand is supported */ +#undef HAVE_TRUERAND + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNIX_H + +/* Define to 1 if you have the `unsetenv' function. */ +#undef HAVE_UNSETENV + +/* Define to 1 if you have the `utime' function. */ +#undef HAVE_UTIME + +/* Define to 1 if you have the `utimes' function. */ +#undef HAVE_UTIMES + +/* Define if C compiler supports VLA */ +#undef HAVE_VLA + +/* Define to 1 if you have the `waitpid' function. */ +#undef HAVE_WAITPID + +/* Define to 1 if you have the `writev' function. */ +#undef HAVE_WRITEV + +/* Define if EAI_ error codes from getaddrinfo are negative */ +#undef NEGATIVE_EAI + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* Define if POSIX semaphores affect threads within the process */ +#undef POSIXSEM_IS_GLOBAL + +/* Define if pthread_attr_getdetachstate() has one arg */ +#undef PTHREAD_ATTR_GETDETACHSTATE_TAKES_ONE_ARG + +/* Define if pthread_getspecific() has two args */ +#undef PTHREAD_GETSPECIFIC_TAKES_TWO_ARGS + +/* Define if readdir is thread safe */ +#undef READDIR_IS_THREAD_SAFE + +/* Define if resolv.h's res_state has the fields retrans/rety */ +#undef RESOLV_RETRANSRETRY + +/* Define to 1 if the `setpgrp' function takes no argument. */ +#undef SETPGRP_VOID + +/* */ +#undef SIGWAIT_TAKES_ONE_ARG + +/* The size of `char', as computed by sizeof. */ +#undef SIZEOF_CHAR + +/* The size of `int', as computed by sizeof. */ +#undef SIZEOF_INT + +/* The size of `long', as computed by sizeof. */ +#undef SIZEOF_LONG + +/* The size of `long double', as computed by sizeof. */ +#undef SIZEOF_LONG_DOUBLE + +/* The size of `long long', as computed by sizeof. */ +#undef SIZEOF_LONG_LONG + +/* The size of off_t */ +#undef SIZEOF_OFF_T + +/* The size of pid_t */ +#undef SIZEOF_PID_T + +/* The size of `short', as computed by sizeof. */ +#undef SIZEOF_SHORT + +/* The size of size_t */ +#undef SIZEOF_SIZE_T + +/* The size of ssize_t */ +#undef SIZEOF_SSIZE_T + +/* The size of `void*', as computed by sizeof. */ +#undef SIZEOF_VOIDP + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Define if strerror returns int */ +#undef STRERROR_R_RC_INT + +/* Define if SysV semaphores affect threads within the process */ +#undef SYSVSEM_IS_GLOBAL + +/* Enable extensions on AIX 3, Interix. */ +#ifndef _ALL_SOURCE +# undef _ALL_SOURCE +#endif +/* Enable GNU extensions on systems that have them. */ +#ifndef _GNU_SOURCE +# undef _GNU_SOURCE +#endif +/* Enable threading extensions on Solaris. */ +#ifndef _POSIX_PTHREAD_SEMANTICS +# undef _POSIX_PTHREAD_SEMANTICS +#endif +/* Enable extensions on HP NonStop. */ +#ifndef _TANDEM_SOURCE +# undef _TANDEM_SOURCE +#endif +/* Enable general extensions on Solaris. */ +#ifndef __EXTENSIONS__ +# undef __EXTENSIONS__ +#endif + + +/* Define if APR supports threads */ +#undef USE_THREADS + +/* Define to 1 if on MINIX. */ +#undef _MINIX + +/* Define to 2 if the system does not provide POSIX.1 features except with + this defined. */ +#undef _POSIX_1_SOURCE + +/* Define to 1 if you need to in order for `stat' and other things to work. */ +#undef _POSIX_SOURCE + +/* Define to empty if `const' does not conform to ANSI C. */ +#undef const + +/* Define to `int' if doesn't define. */ +#undef gid_t + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +#undef inline +#endif + +/* Define to `long int' if does not define. */ +#undef off_t + +/* Define to `int' if does not define. */ +#undef pid_t + +/* Define to `unsigned int' if does not define. */ +#undef size_t + +/* Define to `int' if does not define. */ +#undef ssize_t + +/* Define to `int' if doesn't define. */ +#undef uid_t + +/* Make sure we have ssize_t defined to be something */ +#undef ssize_t + +/* switch this on if we have a BeOS version below BONE */ +#if BEOS && !HAVE_BONE_VERSION +#define BEOS_R5 1 +#else +#define BEOS_BONE 1 +#endif + +#ifdef SIGWAIT_TAKES_ONE_ARG +#define apr_sigwait(a,b) ((*(b)=sigwait((a)))<0?-1:0) +#else +#define apr_sigwait(a,b) sigwait((a),(b)) +#endif + +/* + * Include common private declarations. + */ +#include "../apr_private_common.h" + +#endif /* APR_PRIVATE_H */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_private.h.save b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_private.h.save new file mode 100644 index 00000000..c40a923b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/unix/apr_private.h.save @@ -0,0 +1,743 @@ +/* include/arch/unix/apr_private.h. Generated from apr_private.h.in by configure. */ +/* include/arch/unix/apr_private.h.in. Generated from configure.in by autoheader. */ +#ifndef APR_PRIVATE_H +#define APR_PRIVATE_H + + +/* Various #defines we need to know about */ +#define USE_THREADS 1 +/* #undef EGD_DEFAULT_SOCKET */ +/* #undef HAVE_isascii */ +#define DIRENT_INODE d_fileno +#define DIRENT_TYPE d_type + +/* Cross process serialization techniques */ +/* #undef USE_FLOCK_SERIALIZE */ +#define USE_SYSVSEM_SERIALIZE 1 +/* #undef USE_FCNTL_SERIALIZE */ +/* #undef USE_PROC_PTHREAD_SERIALIZE */ +/* #undef USE_PTHREAD_SERIALIZE */ + +/* #undef POSIXSEM_IS_GLOBAL */ +/* #undef SYSVSEM_IS_GLOBAL */ +/* #undef FCNTL_IS_GLOBAL */ +/* #undef FLOCK_IS_GLOBAL */ + +/* #undef HAVE_INT64_C */ + + +/* Define if crypt_r has uses CRYPTD */ +/* #undef CRYPT_R_CRYPTD */ + +/* Define if crypt_r uses struct crypt_data */ +#define CRYPT_R_STRUCT_CRYPT_DATA 1 + +/* Define to path of random device */ +#define DEV_RANDOM "/dev/random" + +/* Define if DSO support uses dlfcn.h */ +#define DSO_USE_DLFCN 1 + +/* Define if DSO support uses dyld.h */ +/* #undef DSO_USE_DYLD */ + +/* Define if DSO support uses shl_load */ +/* #undef DSO_USE_SHL */ + +/* Define to list of paths to EGD sockets */ +/* #undef EGD_DEFAULT_SOCKET */ + +/* Define if fcntl locks affect threads within the process */ +/* #undef FCNTL_IS_GLOBAL */ + +/* Define if flock locks affect threads within the process */ +/* #undef FLOCK_IS_GLOBAL */ + +/* Define if gethostbyaddr is thread safe */ +/* #undef GETHOSTBYADDR_IS_THREAD_SAFE */ + +/* Define if gethostbyname is thread safe */ +/* #undef GETHOSTBYNAME_IS_THREAD_SAFE */ + +/* Define if gethostbyname_r has the glibc style */ +#define GETHOSTBYNAME_R_GLIBC2 1 + +/* Define if gethostbyname_r has the hostent_data for the third argument */ +/* #undef GETHOSTBYNAME_R_HOSTENT_DATA */ + +/* Define to 1 if you have the `alloca' function. */ +/* #undef HAVE_ALLOCA */ + +/* Define to 1 if you have the header file. */ +#define HAVE_ALLOCA_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_ARPA_INET_H 1 + +/* Define if BONE_VERSION is defined in sys/socket.h */ +/* #undef HAVE_BONE_VERSION */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_BYTEORDER_H */ + +/* Define to 1 if you have the `calloc' function. */ +#define HAVE_CALLOC 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_CONIO_H */ + +/* Define to 1 if you have the `create_area' function. */ +/* #undef HAVE_CREATE_AREA */ + +/* Define to 1 if you have the header file. */ +#define HAVE_CRYPT_H 1 + +/* Define to 1 if you have the `crypt_r' function. */ +#define HAVE_CRYPT_R 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_CTYPE_H 1 + +/* Define to 1 if you have the declaration of `sys_siglist', and to 0 if you + don't. */ +#define HAVE_DECL_SYS_SIGLIST 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_DIRENT_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_DIR_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_DLFCN_H 1 + +/* Define to 1 if you have the `dlopen' function. */ +/* #undef HAVE_DLOPEN */ + +/* Define to 1 if you have the `dlsym' function. */ +#define HAVE_DLSYM 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_DL_H */ + +/* Define if EGD is supported */ +/* #undef HAVE_EGD */ + +/* Define to 1 if you have the header file. */ +#define HAVE_ERRNO_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_FCNTL_H 1 + +/* Define to 1 if you have the `flock' function. */ +#define HAVE_FLOCK 1 + +/* Define to 1 if you have the `fork' function. */ +#define HAVE_FORK 1 + +/* Define if fstat64 can be used */ +#define HAVE_FSTAT64 1 + +/* Define if F_SETLK is defined in fcntl.h */ +#define HAVE_F_SETLK 1 + +/* Define to 1 if you have the `gai_strerror' function. */ +#define HAVE_GAI_STRERROR 1 + +/* Define if getaddrinfo exists and works well enough for APR */ +#define HAVE_GETADDRINFO 1 + +/* Define to 1 if you have the `getenv' function. */ +#define HAVE_GETENV 1 + +/* Define to 1 if you have the `getgrgid_r' function. */ +#define HAVE_GETGRGID_R 1 + +/* Define to 1 if you have the `getgrnam_r' function. */ +#define HAVE_GETGRNAM_R 1 + +/* Define to 1 if you have the `gethostbyaddr_r' function. */ +#define HAVE_GETHOSTBYADDR_R 1 + +/* Define to 1 if you have the `gethostbyname_r' function. */ +#define HAVE_GETHOSTBYNAME_R 1 + +/* Define if getnameinfo exists */ +#define HAVE_GETNAMEINFO 1 + +/* Define to 1 if you have the `getpass' function. */ +#define HAVE_GETPASS 1 + +/* Define to 1 if you have the `getpassphrase' function. */ +/* #undef HAVE_GETPASSPHRASE */ + +/* Define to 1 if you have the `getpwnam_r' function. */ +#define HAVE_GETPWNAM_R 1 + +/* Define to 1 if you have the `getpwuid_r' function. */ +#define HAVE_GETPWUID_R 1 + +/* Define to 1 if you have the `getrlimit' function. */ +#define HAVE_GETRLIMIT 1 + +/* Define to 1 if you have the `gmtime_r' function. */ +#define HAVE_GMTIME_R 1 + +/* Define if struct tm has a tm_gmtoff field */ +#define HAVE_GMTOFF 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_GRP_H 1 + +/* Define to 1 if you have the `hstrerror' function. */ +#define HAVE_HSTRERROR 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_IO_H */ + +/* Define to 1 if you have the `isinf' function. */ +#define HAVE_ISINF 1 + +/* Define to 1 if you have the `isnan' function. */ +#define HAVE_ISNAN 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_KERNEL_OS_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_LANGINFO_H 1 + +/* Define to 1 if you have the `bsd' library (-lbsd). */ +/* #undef HAVE_LIBBSD */ + +/* Define to 1 if you have the `nsl' library (-lnsl). */ +#define HAVE_LIBNSL 1 + +/* Define to 1 if you have the `resolv' library (-lresolv). */ +/* #undef HAVE_LIBRESOLV */ + +/* Define to 1 if you have the `sendfile' library (-lsendfile). */ +/* #undef HAVE_LIBSENDFILE */ + +/* Define to 1 if you have the `socket' library (-lsocket). */ +/* #undef HAVE_LIBSOCKET */ + +/* Define to 1 if you have the `truerand' library (-ltruerand). */ +/* #undef HAVE_LIBTRUERAND */ + +/* Define to 1 if you have the header file. */ +#define HAVE_LIMITS_H 1 + +/* Define to 1 if you have the `localtime_r' function. */ +#define HAVE_LOCALTIME_R 1 + +/* Define if LOCK_EX is defined in sys/file.h */ +#define HAVE_LOCK_EX 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_MACH_O_DYLD_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_MALLOC_H 1 + +/* Define if MAP_ANON is defined in sys/mman.h */ +#define HAVE_MAP_ANON 1 + +/* Define to 1 if you have the `memchr' function. */ +#define HAVE_MEMCHR 1 + +/* Define to 1 if you have the `memmove' function. */ +#define HAVE_MEMMOVE 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if you have the `mkstemp' function. */ +#define HAVE_MKSTEMP 1 + +/* Define to 1 if you have the `mmap' function. */ +#define HAVE_MMAP 1 + +/* Define to 1 if you have the `munmap' function. */ +#define HAVE_MUNMAP 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_NETDB_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_NETINET_IN_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_NETINET_SCTP_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_NETINET_SCTP_UIO_H */ + +/* Defined if netinet/tcp.h is present */ +#define HAVE_NETINET_TCP_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_NET_ERRNO_H */ + +/* Define to 1 if you have the `nl_langinfo' function. */ +#define HAVE_NL_LANGINFO 1 + +/* Define to 1 if you have the `NSLinkModule' function. */ +/* #undef HAVE_NSLINKMODULE */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_OS2_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_OSRELDATE_H */ + +/* Define to 1 if you have the `poll' function. */ +#define HAVE_POLL 1 + +/* Define if POLLIN is defined */ +#define HAVE_POLLIN 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_POLL_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_PROCESS_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_PTHREAD_H 1 + +/* Define to 1 if you have the `pthread_key_delete' function. */ +#define HAVE_PTHREAD_KEY_DELETE 1 + +/* Define to 1 if you have the `pthread_mutexattr_setpshared' function. */ +#define HAVE_PTHREAD_MUTEXATTR_SETPSHARED 1 + +/* Define if recursive pthread mutexes are available */ +#define HAVE_PTHREAD_MUTEX_RECURSIVE 1 + +/* Define if cross-process robust mutexes are available */ +#define HAVE_PTHREAD_MUTEX_ROBUST 1 + +/* Define if PTHREAD_PROCESS_SHARED is defined in pthread.h */ +#define HAVE_PTHREAD_PROCESS_SHARED 1 + +/* Define if pthread rwlocks are available */ +#define HAVE_PTHREAD_RWLOCKS 1 + +/* Define to 1 if you have the `pthread_rwlock_init' function. */ +#define HAVE_PTHREAD_RWLOCK_INIT 1 + +/* Define to 1 if you have the `putenv' function. */ +#define HAVE_PUTENV 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_PWD_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SEMAPHORE_H 1 + +/* Define to 1 if you have the `semctl' function. */ +#define HAVE_SEMCTL 1 + +/* Define to 1 if you have the `semget' function. */ +#define HAVE_SEMGET 1 + +/* Define to 1 if you have the `sem_close' function. */ +#define HAVE_SEM_CLOSE 1 + +/* Define to 1 if you have the `sem_post' function. */ +#define HAVE_SEM_POST 1 + +/* Define if SEM_UNDO is defined in sys/sem.h */ +#define HAVE_SEM_UNDO 1 + +/* Define to 1 if you have the `sem_unlink' function. */ +#define HAVE_SEM_UNLINK 1 + +/* Define to 1 if you have the `sem_wait' function. */ +#define HAVE_SEM_WAIT 1 + +/* Define to 1 if you have the `sendfile' function. */ +#define HAVE_SENDFILE 1 + +/* Define to 1 if you have the `sendfilev' function. */ +/* #undef HAVE_SENDFILEV */ + +/* Define to 1 if you have the `send_file' function. */ +/* #undef HAVE_SEND_FILE */ + +/* Define to 1 if you have the `setenv' function. */ +#define HAVE_SETENV 1 + +/* Define to 1 if you have the `setrlimit' function. */ +#define HAVE_SETRLIMIT 1 + +/* Define to 1 if you have the `setsid' function. */ +#define HAVE_SETSID 1 + +/* Define to 1 if you have the `set_h_errno' function. */ +/* #undef HAVE_SET_H_ERRNO */ + +/* Define to 1 if you have the `shmat' function. */ +#define HAVE_SHMAT 1 + +/* Define to 1 if you have the `shmctl' function. */ +#define HAVE_SHMCTL 1 + +/* Define to 1 if you have the `shmdt' function. */ +#define HAVE_SHMDT 1 + +/* Define to 1 if you have the `shmget' function. */ +#define HAVE_SHMGET 1 + +/* Define to 1 if you have the `shm_open' function. */ +#define HAVE_SHM_OPEN 1 + +/* Define to 1 if you have the `shm_unlink' function. */ +#define HAVE_SHM_UNLINK 1 + +/* Define to 1 if you have the `sigaction' function. */ +#define HAVE_SIGACTION 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SIGNAL_H 1 + +/* Define to 1 if you have the `sigsuspend' function. */ +#define HAVE_SIGSUSPEND 1 + +/* Define to 1 if you have the `sigwait' function. */ +#define HAVE_SIGWAIT 1 + +/* Whether you have socklen_t */ +#define HAVE_SOCKLEN_T 1 + +/* Define if SO_ACCEPTFILTER is defined in sys/socket.h */ +/* #undef HAVE_SO_ACCEPTFILTER */ + +/* Define to 1 if you have the header file. */ +#define HAVE_STDARG_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDDEF_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDIO_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the `strcasecmp' function. */ +#define HAVE_STRCASECMP 1 + +/* Define to 1 if you have the `strdup' function. */ +#define HAVE_STRDUP 1 + +/* Define to 1 if you have the `strerror_r' function. */ +#define HAVE_STRERROR_R 1 + +/* Define to 1 if you have the `stricmp' function. */ +/* #undef HAVE_STRICMP */ + +/* Define to 1 if you have the header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the `strncasecmp' function. */ +#define HAVE_STRNCASECMP 1 + +/* Define to 1 if you have the `strnicmp' function. */ +/* #undef HAVE_STRNICMP */ + +/* Define to 1 if you have the `strstr' function. */ +#define HAVE_STRSTR 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYSAPI_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYSGTIME_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_FILE_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_IOCTL_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_IPC_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_MMAN_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_MUTEX_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_POLL_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_RESOURCE_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_SELECT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_SEM_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_SENDFILE_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_SHM_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_SIGNAL_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_SOCKET_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_SOCKIO_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_SYSCTL_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_SYS_SYSLIMITS_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TIME_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_UIO_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_UN_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_WAIT_H 1 + +/* Define if TCP_CORK is defined in netinet/tcp.h */ +#define HAVE_TCP_CORK 1 + +/* Define if TCP_NOPUSH is defined in netinet/tcp.h */ +/* #undef HAVE_TCP_NOPUSH */ + +/* Define to 1 if you have the header file. */ +#define HAVE_TERMIOS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_TIME_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_TPFEQ_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_TPFIO_H */ + +/* Define if truerand is supported */ +/* #undef HAVE_TRUERAND */ + +/* Define to 1 if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_UNIX_H */ + +/* Define to 1 if you have the `unsetenv' function. */ +#define HAVE_UNSETENV 1 + +/* Define to 1 if you have the `utime' function. */ +#define HAVE_UTIME 1 + +/* Define to 1 if you have the `utimes' function. */ +#define HAVE_UTIMES 1 + +/* Define if C compiler supports VLA */ +#define HAVE_VLA 1 + +/* Define to 1 if you have the `waitpid' function. */ +#define HAVE_WAITPID 1 + +/* Define to 1 if you have the `writev' function. */ +#define HAVE_WRITEV 1 + +/* Define if EAI_ error codes from getaddrinfo are negative */ +#define NEGATIVE_EAI 1 + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "" + +/* Define if POSIX semaphores affect threads within the process */ +/* #undef POSIXSEM_IS_GLOBAL */ + +/* Define if pthread_attr_getdetachstate() has one arg */ +/* #undef PTHREAD_ATTR_GETDETACHSTATE_TAKES_ONE_ARG */ + +/* Define if pthread_getspecific() has two args */ +/* #undef PTHREAD_GETSPECIFIC_TAKES_TWO_ARGS */ + +/* Define if readdir is thread safe */ +/* #undef READDIR_IS_THREAD_SAFE */ + +/* Define if resolv.h's res_state has the fields retrans/rety */ +#define RESOLV_RETRANSRETRY 1 + +/* Define to 1 if the `setpgrp' function takes no argument. */ +#define SETPGRP_VOID 1 + +/* */ +/* #undef SIGWAIT_TAKES_ONE_ARG */ + +/* The size of `char', as computed by sizeof. */ +#define SIZEOF_CHAR 1 + +/* The size of `int', as computed by sizeof. */ +#define SIZEOF_INT 4 + +/* The size of `long', as computed by sizeof. */ +#define SIZEOF_LONG 8 + +/* The size of `long double', as computed by sizeof. */ +#define SIZEOF_LONG_DOUBLE 16 + +/* The size of `long long', as computed by sizeof. */ +#define SIZEOF_LONG_LONG 8 + +/* The size of off_t */ +#define SIZEOF_OFF_T 8 + +/* The size of pid_t */ +#define SIZEOF_PID_T 4 + +/* The size of `short', as computed by sizeof. */ +#define SIZEOF_SHORT 2 + +/* The size of size_t */ +#define SIZEOF_SIZE_T 8 + +/* The size of ssize_t */ +#define SIZEOF_SSIZE_T 8 + +/* The size of `void*', as computed by sizeof. */ +#define SIZEOF_VOIDP 8 + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Define if strerror returns int */ +/* #undef STRERROR_R_RC_INT */ + +/* Define if SysV semaphores affect threads within the process */ +/* #undef SYSVSEM_IS_GLOBAL */ + +/* Enable extensions on AIX 3, Interix. */ +#ifndef _ALL_SOURCE +# define _ALL_SOURCE 1 +#endif +/* Enable GNU extensions on systems that have them. */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif +/* Enable threading extensions on Solaris. */ +#ifndef _POSIX_PTHREAD_SEMANTICS +# define _POSIX_PTHREAD_SEMANTICS 1 +#endif +/* Enable extensions on HP NonStop. */ +#ifndef _TANDEM_SOURCE +# define _TANDEM_SOURCE 1 +#endif +/* Enable general extensions on Solaris. */ +#ifndef __EXTENSIONS__ +# define __EXTENSIONS__ 1 +#endif + + +/* Define if APR supports threads */ +#define USE_THREADS 1 + +/* Define to 1 if on MINIX. */ +/* #undef _MINIX */ + +/* Define to 2 if the system does not provide POSIX.1 features except with + this defined. */ +/* #undef _POSIX_1_SOURCE */ + +/* Define to 1 if you need to in order for `stat' and other things to work. */ +/* #undef _POSIX_SOURCE */ + +/* Define to empty if `const' does not conform to ANSI C. */ +/* #undef const */ + +/* Define to `int' if doesn't define. */ +/* #undef gid_t */ + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +/* #undef inline */ +#endif + +/* Define to `long int' if does not define. */ +/* #undef off_t */ + +/* Define to `int' if does not define. */ +/* #undef pid_t */ + +/* Define to `unsigned int' if does not define. */ +/* #undef size_t */ + +/* Define to `int' if does not define. */ +/* #undef ssize_t */ + +/* Define to `int' if doesn't define. */ +/* #undef uid_t */ + +/* Make sure we have ssize_t defined to be something */ +/* #undef ssize_t */ + +/* switch this on if we have a BeOS version below BONE */ +#if BEOS && !HAVE_BONE_VERSION +#define BEOS_R5 1 +#else +#define BEOS_BONE 1 +#endif + +#ifdef SIGWAIT_TAKES_ONE_ARG +#define apr_sigwait(a,b) ((*(b)=sigwait((a)))<0?-1:0) +#else +#define apr_sigwait(a,b) sigwait((a),(b)) +#endif + +/* + * Include common private declarations. + */ +#include "../apr_private_common.h" + +#endif /* APR_PRIVATE_H */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/win32/apr_arch_atime.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/win32/apr_arch_atime.h new file mode 100644 index 00000000..47b75a95 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/win32/apr_arch_atime.h @@ -0,0 +1,63 @@ +/* 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. + */ + +#ifndef ATIME_H +#define ATIME_H + +#include "apr_private.h" +#include "apr_time.h" +#if APR_HAVE_TIME_H +#include +#endif + +struct atime_t { + apr_pool_t *cntxt; + apr_time_t currtime; + SYSTEMTIME *explodedtime; +}; + + +/* Number of micro-seconds between the beginning of the Windows epoch + * (Jan. 1, 1601) and the Unix epoch (Jan. 1, 1970) + */ +#define APR_DELTA_EPOCH_IN_USEC APR_TIME_C(11644473600000000); + + +__inline void FileTimeToAprTime(apr_time_t *result, FILETIME *input) +{ + /* Convert FILETIME one 64 bit number so we can work with it. */ + *result = input->dwHighDateTime; + *result = (*result) << 32; + *result |= input->dwLowDateTime; + *result /= 10; /* Convert from 100 nano-sec periods to micro-seconds. */ + *result -= APR_DELTA_EPOCH_IN_USEC; /* Convert from Windows epoch to Unix epoch */ + return; +} + + +__inline void AprTimeToFileTime(LPFILETIME pft, apr_time_t t) +{ + LONGLONG ll; + t += APR_DELTA_EPOCH_IN_USEC; + ll = t * 10; + pft->dwLowDateTime = (DWORD)ll; + pft->dwHighDateTime = (DWORD) (ll >> 32); + return; +} + + +#endif /* ! ATIME_H */ + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/win32/apr_arch_dso.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/win32/apr_arch_dso.h new file mode 100644 index 00000000..e2e4e40f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/win32/apr_arch_dso.h @@ -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. + */ + +#ifndef DSO_H +#define DSO_H + +#include "apr_private.h" +#include "apr_general.h" +#include "apr_pools.h" +#include "apr_dso.h" +#include "apr.h" + +#if APR_HAS_DSO + +struct apr_dso_handle_t { + apr_pool_t *cont; + void *handle; + apr_status_t load_error; +}; + +#endif + +#endif diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/win32/apr_arch_file_io.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/win32/apr_arch_file_io.h new file mode 100644 index 00000000..dc3f442a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/win32/apr_arch_file_io.h @@ -0,0 +1,276 @@ +/* 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. + */ + +#ifndef FILE_IO_H +#define FILE_IO_H + +#include "apr.h" +#include "apr_private.h" +#include "apr_pools.h" +#include "apr_general.h" +#include "apr_tables.h" +#include "apr_thread_mutex.h" +#include "apr_file_io.h" +#include "apr_file_info.h" +#include "apr_errno.h" +#include "apr_arch_misc.h" + +#ifdef HAVE_SYS_STAT_H +#include +#endif +#if APR_HAVE_SYS_TYPES_H +#include +#endif +#ifdef HAVE_SYS_FCNTL_H +#include +#endif +#ifdef HAVE_TIME_H +#include +#endif +#if APR_HAVE_DIRENT_H +#include +#endif +#ifdef HAVE_MALLOC_H +#include +#endif + +#if APR_HAS_UNICODE_FS +#include "arch/win32/apr_arch_utf8.h" +#include + +/* Helper functions for the WinNT ApiW() functions. APR treats all + * resource identifiers (files, etc) by their UTF-8 name, to provide + * access to all named identifiers. [UTF-8 completely maps Unicode + * into char type strings.] + * + * The _path flavors below provide us fast mappings of the + * Unicode filename //?/D:/path and //?/UNC/mach/share/path mappings, + * which allow unlimited (well, 32000 wide character) length names. + * These prefixes may appear in Unicode, but must not appear in the + * Ascii API calls. So we tack them on in utf8_to_unicode_path, and + * strip them right back off in unicode_to_utf8_path. + */ +apr_status_t utf8_to_unicode_path(apr_wchar_t* dststr, apr_size_t dstchars, + const char* srcstr); +apr_status_t unicode_to_utf8_path(char* dststr, apr_size_t dstchars, + const apr_wchar_t* srcstr); + +#endif /* APR_HAS_UNICODE_FS */ + +/* Another Helper functions for the WinNT ApiW() functions. We need to + * derive some 'resource' names (max length 255 characters, prefixed with + * Global/ or Local/ on WinNT) from something that looks like a filename. + * Since 'resource' names never contain slashes, convert these to '_'s + * and return the appropriate char* or wchar* for ApiA or ApiW calls. + */ + +void *res_name_from_filename(const char *file, int global, apr_pool_t *pool); + +#define APR_FILE_MAX MAX_PATH + +#define APR_FILE_BUFSIZE 4096 + +/* obscure ommissions from msvc's sys/stat.h */ +#ifdef _MSC_VER +#define S_IFIFO _S_IFIFO /* pipe */ +#define S_IFBLK 0060000 /* Block Special */ +#define S_IFLNK 0120000 /* Symbolic Link */ +#define S_IFSOCK 0140000 /* Socket */ +#define S_IFWHT 0160000 /* Whiteout */ +#endif + +/* Internal Flags for apr_file_open */ +#define APR_OPENINFO 0x00100000 /* Open without READ or WRITE access */ +#define APR_OPENLINK 0x00200000 /* Open a link itself, if supported */ +#define APR_READCONTROL 0x00400000 /* Read the file's owner/perms */ +#define APR_WRITECONTROL 0x00800000 /* Modifythe file's owner/perms */ +#define APR_WRITEATTRS 0x01000000 /* Modify the file's attributes */ +#define APR_STDIN_FLAG 0x02000000 /* Obtained via apr_file_open_stdin() */ +#define APR_STDOUT_FLAG 0x04000000 /* Obtained via apr_file_open_stdout() */ +#define APR_STDERR_FLAG 0x06000000 /* Obtained via apr_file_open_stderr() */ +#define APR_STD_FLAGS (APR_STDIN_FLAG | APR_STDOUT_FLAG | APR_STDERR_FLAG) + +/* Entries missing from the MSVC 5.0 Win32 SDK: + */ +#ifndef FILE_ATTRIBUTE_DEVICE +#define FILE_ATTRIBUTE_DEVICE 0x00000040 +#endif +#ifndef FILE_ATTRIBUTE_REPARSE_POINT +#define FILE_ATTRIBUTE_REPARSE_POINT 0x00000400 +#endif +#ifndef FILE_FLAG_OPEN_NO_RECALL +#define FILE_FLAG_OPEN_NO_RECALL 0x00100000 +#endif +#ifndef FILE_FLAG_OPEN_REPARSE_POINT +#define FILE_FLAG_OPEN_REPARSE_POINT 0x00200000 +#endif +#ifndef TRUSTEE_IS_WELL_KNOWN_GROUP +#define TRUSTEE_IS_WELL_KNOWN_GROUP 5 +#endif + +/* Information bits available from the WIN32 FindFirstFile function */ +#define APR_FINFO_WIN32_DIR (APR_FINFO_NAME | APR_FINFO_TYPE \ + | APR_FINFO_CTIME | APR_FINFO_ATIME \ + | APR_FINFO_MTIME | APR_FINFO_SIZE) + +/* Sneak the Readonly bit through finfo->protection for internal use _only_ */ +#define APR_FREADONLY 0x10000000 + +/* Private function for apr_stat/lstat/getfileinfo/dir_read */ +int fillin_fileinfo(apr_finfo_t *finfo, WIN32_FILE_ATTRIBUTE_DATA *wininfo, + int byhandle, apr_int32_t wanted); + +/* Private function that extends apr_stat/lstat/getfileinfo/dir_read */ +apr_status_t more_finfo(apr_finfo_t *finfo, const void *ufile, + apr_int32_t wanted, int whatfile); + +/* whatfile types for the ufile arg */ +#define MORE_OF_HANDLE 0 +#define MORE_OF_FSPEC 1 +#define MORE_OF_WFSPEC 2 + +/* quick run-down of fields in windows' apr_file_t structure that may have + * obvious uses. + * fname -- the filename as passed to the open call. + * dwFileAttricutes -- Attributes used to open the file. + * append -- Windows doesn't support the append concept when opening files. + * APR needs to keep track of this, and always make sure we append + * correctly when writing to a file with this flag set TRUE. + */ + +// for apr_poll.c; +#define filedes filehand + +struct apr_file_t { + apr_pool_t *pool; + HANDLE filehand; + BOOLEAN pipe; // Is this a pipe of a file? + OVERLAPPED *pOverlapped; + apr_interval_time_t timeout; + apr_int32_t flags; + + /* File specific info */ + apr_finfo_t *finfo; + char *fname; + DWORD dwFileAttributes; + int eof_hit; + BOOLEAN buffered; // Use buffered I/O? + int ungetchar; // Last char provided by an unget op. (-1 = no char) + int append; + + /* Stuff for buffered mode */ + char *buffer; + apr_size_t bufpos; // Read/Write position in buffer + apr_size_t dataRead; // amount of valid data read into buffer + int direction; // buffer being used for 0 = read, 1 = write + apr_off_t filePtr; // position in file of handle + apr_thread_mutex_t *mutex; // mutex semaphore, must be owned to access the above fields + + /* Pipe specific info */ +}; + +struct apr_dir_t { + apr_pool_t *pool; + HANDLE dirhand; + apr_size_t rootlen; + char *dirname; + char *name; + union { +#if APR_HAS_UNICODE_FS + struct { + WIN32_FIND_DATAW *entry; + } w; +#endif +#if APR_HAS_ANSI_FS + struct { + WIN32_FIND_DATAA *entry; + } n; +#endif + }; + int bof; +}; + +/* There are many goofy characters the filesystem can't accept + * or can confound the cmd.exe shell. Here's the list + * [declared in filesys.c] + */ +extern const char apr_c_is_fnchar[256]; + +#define IS_FNCHAR(c) (apr_c_is_fnchar[(unsigned char)(c)] & 1) +#define IS_SHCHAR(c) ((apr_c_is_fnchar[(unsigned char)(c)] & 2) == 2) + + +/* If the user passes APR_FILEPATH_TRUENAME to either + * apr_filepath_root or apr_filepath_merge, this fn determines + * that the root really exists. It's expensive, wouldn't want + * to do this too frequenly. + */ +apr_status_t filepath_root_test(char *path, apr_pool_t *p); + + +/* The apr_filepath_merge wants to canonicalize the cwd to the + * addpath if the user passes NULL as the old root path (this + * isn't true of an empty string "", which won't be concatenated. + * + * But we need to figure out what the cwd of a given volume is, + * when the user passes D:foo. This fn will determine D:'s cwd. + * + * If flags includes the bit APR_FILEPATH_NATIVE, the path returned + * is in the os-native format. + */ +apr_status_t filepath_drive_get(char **rootpath, char drive, + apr_int32_t flags, apr_pool_t *p); + + +/* If the user passes d: vs. D: (or //mach/share vs. //MACH/SHARE), + * we need to fold the case to canonical form. This function is + * supposed to do so. + */ +apr_status_t filepath_root_case(char **rootpath, char *root, apr_pool_t *p); + + +apr_status_t file_cleanup(void *); + +/** + * Internal function to create a Win32/NT pipe that respects some async + * timeout options. + * @param in new read end of the created pipe + * @param out new write end of the created pipe + * @param blocking_mode one of + *
    + *       APR_FULL_BLOCK
    + *       APR_READ_BLOCK
    + *       APR_WRITE_BLOCK
    + *       APR_FULL_NONBLOCK
    + * 
    + * @remark It so happens that APR_FULL_BLOCK and APR_FULL_NONBLOCK + * are common to apr_procattr_io_set() in, out and err modes. + * Because APR_CHILD_BLOCK and APR_WRITE_BLOCK share the same value, + * as do APR_PARENT_BLOCK and APR_READ_BLOCK, it's possible to use + * that value directly for creating the stdout/stderr pipes. When + * creating the stdin pipe, the values must be transposed. + * @see apr_procattr_io_set + */ +apr_status_t apr_create_nt_pipe(apr_file_t **in, apr_file_t **out, + apr_int32_t blocking_mode, + apr_pool_t *p); + +/** @see apr_create_nt_pipe */ +#define APR_READ_BLOCK 3 +/** @see apr_create_nt_pipe */ +#define APR_WRITE_BLOCK 4 + +#endif /* ! FILE_IO_H */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/win32/apr_arch_inherit.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/win32/apr_arch_inherit.h new file mode 100644 index 00000000..88e6f0de --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/win32/apr_arch_inherit.h @@ -0,0 +1,133 @@ +/* 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. + */ + +#ifndef INHERIT_H +#define INHERIT_H + +#include "apr_inherit.h" + +#define APR_INHERIT (1 << 24) /* Must not conflict with other bits */ + +#if APR_HAS_UNICODE_FS && APR_HAS_ANSI_FS +/* !defined(_WIN32_WCE) is implicit here */ + +#define APR_IMPLEMENT_INHERIT_SET(name, flag, pool, cleanup) \ +APR_DECLARE(apr_status_t) apr_##name##_inherit_set(apr_##name##_t *the##name) \ +{ \ + IF_WIN_OS_IS_UNICODE \ + { \ +/* if (!SetHandleInformation(the##name->filehand, \ + * HANDLE_FLAG_INHERIT, \ + * HANDLE_FLAG_INHERIT)) \ + * return apr_get_os_error(); \ + */ } \ + ELSE_WIN_OS_IS_ANSI \ + { \ + HANDLE temp, hproc = GetCurrentProcess(); \ + if (!DuplicateHandle(hproc, the##name->filehand, \ + hproc, &temp, 0, TRUE, \ + DUPLICATE_SAME_ACCESS)) \ + return apr_get_os_error(); \ + CloseHandle(the##name->filehand); \ + the##name->filehand = temp; \ + } \ + return APR_SUCCESS; \ +} \ +/* Deprecated */ \ +APR_DECLARE(void) apr_##name##_set_inherit(apr_##name##_t *the##name) \ +{ \ + apr_##name##_inherit_set(the##name); \ +} + +#define APR_IMPLEMENT_INHERIT_UNSET(name, flag, pool, cleanup) \ +APR_DECLARE(apr_status_t) apr_##name##_inherit_unset(apr_##name##_t *the##name)\ +{ \ + IF_WIN_OS_IS_UNICODE \ + { \ +/* if (!SetHandleInformation(the##name->filehand, \ + * HANDLE_FLAG_INHERIT, 0)) \ + * return apr_get_os_error(); \ + */ } \ + ELSE_WIN_OS_IS_ANSI \ + { \ + HANDLE temp, hproc = GetCurrentProcess(); \ + if (!DuplicateHandle(hproc, the##name->filehand, \ + hproc, &temp, 0, FALSE, \ + DUPLICATE_SAME_ACCESS)) \ + return apr_get_os_error(); \ + CloseHandle(the##name->filehand); \ + the##name->filehand = temp; \ + } \ + return APR_SUCCESS; \ +} \ +/* Deprecated */ \ +APR_DECLARE(void) apr_##name##_unset_inherit(apr_##name##_t *the##name) \ +{ \ + apr_##name##_inherit_unset(the##name); \ +} + +#elif APR_HAS_ANSI_FS || defined(_WIN32_WCE) + +#define APR_IMPLEMENT_INHERIT_SET(name, flag, pool, cleanup) \ +APR_DECLARE(apr_status_t) apr_##name##_inherit_set(apr_##name##_t *the##name) \ +{ \ + HANDLE temp, hproc = GetCurrentProcess(); \ + if (!DuplicateHandle(hproc, the##name->filehand, \ + hproc, &temp, 0, TRUE, \ + DUPLICATE_SAME_ACCESS)) \ + return apr_get_os_error(); \ + CloseHandle(the##name->filehand); \ + the##name->filehand = temp; \ + return APR_SUCCESS; \ +} + +#define APR_IMPLEMENT_INHERIT_UNSET(name, flag, pool, cleanup) \ +APR_DECLARE(apr_status_t) apr_##name##_inherit_unset(apr_##name##_t *the##name)\ +{ \ + HANDLE temp, hproc = GetCurrentProcess(); \ + if (!DuplicateHandle(hproc, the##name->filehand, \ + hproc, &temp, 0, FALSE, \ + DUPLICATE_SAME_ACCESS)) \ + return apr_get_os_error(); \ + CloseHandle(the##name->filehand); \ + the##name->filehand = temp; \ + return APR_SUCCESS; \ +} + +#else /* APR_HAS_UNICODE_FS && !APR_HAS_ANSI_FS && !defined(_WIN32_WCE) */ + +#define APR_IMPLEMENT_INHERIT_SET(name, flag, pool, cleanup) \ +APR_DECLARE(apr_status_t) apr_##name##_inherit_set(apr_##name##_t *the##name) \ +{ \ +/* if (!SetHandleInformation(the##name->filehand, \ + * HANDLE_FLAG_INHERIT, \ + * HANDLE_FLAG_INHERIT)) \ + * return apr_get_os_error(); \ + */ return APR_SUCCESS; \ +} + +#define APR_IMPLEMENT_INHERIT_UNSET(name, flag, pool, cleanup) \ +APR_DECLARE(apr_status_t) apr_##name##_inherit_unset(apr_##name##_t *the##name)\ +{ \ +/* if (!SetHandleInformation(the##name->filehand, \ + * HANDLE_FLAG_INHERIT, 0)) \ + * return apr_get_os_error(); \ + */ return APR_SUCCESS; \ +} + +#endif /* defined(APR_HAS_UNICODE_FS) */ + +#endif /* ! INHERIT_H */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/win32/apr_arch_misc.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/win32/apr_arch_misc.h new file mode 100644 index 00000000..dc61ac61 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/win32/apr_arch_misc.h @@ -0,0 +1,324 @@ +/* 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. + */ + +#ifndef MISC_H +#define MISC_H + +#include "apr.h" +#include "apr_portable.h" +#include "apr_private.h" +#include "apr_general.h" +#include "apr_pools.h" +#include "apr_getopt.h" +#include "apr_thread_proc.h" +#include "apr_file_io.h" +#include "apr_errno.h" +#include "apr_getopt.h" + +#if APR_HAVE_STDIO_H +#include +#endif +#if APR_HAVE_SIGNAL_H +#include +#endif +#if APR_HAVE_PTHREAD_H +#include +#endif + +/* ### create APR_HAVE_* macros for these? */ +#if APR_HAVE_STDLIB_H +#include +#endif +#if APR_HAVE_STRING_H +#include +#endif + +struct apr_other_child_rec_t { + apr_pool_t *p; + struct apr_other_child_rec_t *next; + apr_proc_t *proc; + void (*maintenance) (int, void *, int); + void *data; + apr_os_file_t write_fd; +}; + +#define WSAHighByte 2 +#define WSALowByte 0 + +/* start.c and apr_app.c helpers and communication within misc.c + * + * They are not for public consumption, although apr_app_init_complete + * must be an exported symbol to avoid reinitialization. + */ +extern int APR_DECLARE_DATA apr_app_init_complete; + +int apr_wastrtoastr(char const * const * *retarr, + wchar_t const * const *arr, int args); + +/* Platform specific designation of run time os version. + * Gaps allow for specific service pack levels that + * export new kernel or winsock functions or behavior. + */ +typedef enum { + APR_WIN_UNK = 0, + APR_WIN_UNSUP = 1, + APR_WIN_95 = 10, + APR_WIN_95_B = 11, + APR_WIN_95_OSR2 = 12, + APR_WIN_98 = 14, + APR_WIN_98_SE = 16, + APR_WIN_ME = 18, + + APR_WIN_UNICODE = 20, /* Prior versions support only narrow chars */ + + APR_WIN_CE_3 = 23, /* CE is an odd beast, not supporting */ + /* some pre-NT features, such as the */ + APR_WIN_NT = 30, /* narrow charset APIs (fooA fns), while */ + APR_WIN_NT_3_5 = 35, /* not supporting some NT-family features. */ + APR_WIN_NT_3_51 = 36, + + APR_WIN_NT_4 = 40, + APR_WIN_NT_4_SP2 = 42, + APR_WIN_NT_4_SP3 = 43, + APR_WIN_NT_4_SP4 = 44, + APR_WIN_NT_4_SP5 = 45, + APR_WIN_NT_4_SP6 = 46, + + APR_WIN_2000 = 50, + APR_WIN_2000_SP1 = 51, + APR_WIN_2000_SP2 = 52, + APR_WIN_XP = 60 +} apr_oslevel_e; + +extern APR_DECLARE_DATA apr_oslevel_e apr_os_level; + +apr_status_t apr_get_oslevel(apr_oslevel_e *); + +/* The APR_HAS_ANSI_FS symbol is PRIVATE, and internal to APR. + * APR only supports char data for filenames. Like most applications, + * characters >127 are essentially undefined. APR_HAS_UNICODE_FS lets + * the application know that utf-8 is the encoding method of APR, and + * only incidently hints that we have Wide OS calls. + * + * APR_HAS_ANSI_FS is simply an OS flag to tell us all calls must be + * the unicode eqivilant. + */ + +#if defined(_WIN32_WCE) || defined(WINNT) +#define APR_HAS_ANSI_FS 0 +#else +#define APR_HAS_ANSI_FS 1 +#endif + +/* IF_WIN_OS_IS_UNICODE / ELSE_WIN_OS_IS_ANSI help us keep the code trivial + * where have runtime tests for unicode-ness, that aren't needed in any + * build which supports only WINNT or WCE. + */ +#if APR_HAS_ANSI_FS && APR_HAS_UNICODE_FS +#define IF_WIN_OS_IS_UNICODE if (apr_os_level >= APR_WIN_UNICODE) +#define ELSE_WIN_OS_IS_ANSI else +#else /* APR_HAS_UNICODE_FS */ +#define IF_WIN_OS_IS_UNICODE +#define ELSE_WIN_OS_IS_ANSI +#endif /* WINNT */ + +typedef enum { + DLL_WINBASEAPI = 0, // kernel32 From WinBase.h + DLL_WINADVAPI = 1, // advapi32 From WinBase.h + DLL_WINSOCKAPI = 2, // mswsock From WinSock.h + DLL_WINSOCK2API = 3, // ws2_32 From WinSock2.h + DLL_SHSTDAPI = 4, // shell32 From ShellAPI.h + DLL_NTDLL = 5, // shell32 From our real kernel + DLL_defined = 6 // must define as last idx_ + 1 +} apr_dlltoken_e; + +FARPROC apr_load_dll_func(apr_dlltoken_e fnLib, char *fnName, int ordinal); + +/* The apr_load_dll_func call WILL fault if the function cannot be loaded */ + +#define APR_DECLARE_LATE_DLL_FUNC(lib, rettype, calltype, fn, ord, args, names) \ + typedef rettype (calltype *apr_winapi_fpt_##fn) args; \ + static apr_winapi_fpt_##fn apr_winapi_pfn_##fn = NULL; \ + __inline rettype apr_winapi_##fn args \ + { if (!apr_winapi_pfn_##fn) \ + apr_winapi_pfn_##fn = (apr_winapi_fpt_##fn) \ + apr_load_dll_func(lib, #fn, ord); \ + return (*(apr_winapi_pfn_##fn)) names; }; \ + +/* Provide late bound declarations of every API function missing from + * one or more supported releases of the Win32 API + * + * lib is the enumerated token from apr_dlltoken_e, and must correspond + * to the string table entry in start.c used by the apr_load_dll_func(). + * Token names (attempt to) follow Windows.h declarations prefixed by DLL_ + * in order to facilitate comparison. Use the exact declaration syntax + * and names from Windows.h to prevent ambigutity and bugs. + * + * rettype and calltype follow the original declaration in Windows.h + * fn is the true function name - beware Ansi/Unicode #defined macros + * ord is the ordinal within the library, use 0 if it varies between versions + * args is the parameter list following the original declaration, in parens + * names is the parameter list sans data types, enclosed in parens + * + * #undef/re#define the Ansi/Unicode generic name to abate confusion + * In the case of non-text functions, simply #define the original name + */ + +#if !defined(_WIN32_WCE) && !defined(WINNT) + +#ifdef GetFileAttributesExA +#undef GetFileAttributesExA +#endif +APR_DECLARE_LATE_DLL_FUNC(DLL_WINBASEAPI, BOOL, WINAPI, GetFileAttributesExA, 0, ( + IN LPCSTR lpFileName, + IN GET_FILEEX_INFO_LEVELS fInfoLevelId, + OUT LPVOID lpFileInformation), + (lpFileName, fInfoLevelId, lpFileInformation)); +#define GetFileAttributesExA apr_winapi_GetFileAttributesExA +#undef GetFileAttributesEx +#define GetFileAttributesEx apr_winapi_GetFileAttributesExA + +#ifdef GetFileAttributesExW +#undef GetFileAttributesExW +#endif +APR_DECLARE_LATE_DLL_FUNC(DLL_WINBASEAPI, BOOL, WINAPI, GetFileAttributesExW, 0, ( + IN LPCWSTR lpFileName, + IN GET_FILEEX_INFO_LEVELS fInfoLevelId, + OUT LPVOID lpFileInformation), + (lpFileName, fInfoLevelId, lpFileInformation)); +#define GetFileAttributesExW apr_winapi_GetFileAttributesExW + +APR_DECLARE_LATE_DLL_FUNC(DLL_WINBASEAPI, BOOL, WINAPI, CancelIo, 0, ( + IN HANDLE hFile), + (hFile)); +#define CancelIo apr_winapi_CancelIo + +APR_DECLARE_LATE_DLL_FUNC(DLL_WINBASEAPI, BOOL, WINAPI, TryEnterCriticalSection, 0, ( + LPCRITICAL_SECTION lpCriticalSection), + (lpCriticalSection)); +#define TryEnterCriticalSection apr_winapi_TryEnterCriticalSection + +APR_DECLARE_LATE_DLL_FUNC(DLL_WINBASEAPI, BOOL, WINAPI, SwitchToThread, 0, ( + void), + ()); +#define SwitchToThread apr_winapi_SwitchToThread + +APR_DECLARE_LATE_DLL_FUNC(DLL_WINADVAPI, BOOL, WINAPI, GetEffectiveRightsFromAclW, 0, ( + IN PACL pacl, + IN PTRUSTEE_W pTrustee, + OUT PACCESS_MASK pAccessRights), + (pacl, pTrustee, pAccessRights)); +#define GetEffectiveRightsFromAclW apr_winapi_GetEffectiveRightsFromAclW + +APR_DECLARE_LATE_DLL_FUNC(DLL_WINADVAPI, BOOL, WINAPI, GetNamedSecurityInfoW, 0, ( + IN LPWSTR pObjectName, + IN SE_OBJECT_TYPE ObjectType, + IN SECURITY_INFORMATION SecurityInfo, + OUT PSID *ppsidOwner, + OUT PSID *ppsidGroup, + OUT PACL *ppDacl, + OUT PACL *ppSacl, + OUT PSECURITY_DESCRIPTOR *ppSecurityDescriptor), + (pObjectName, ObjectType, SecurityInfo, ppsidOwner, ppsidGroup, + ppDacl, ppSacl, ppSecurityDescriptor)); +#define GetNamedSecurityInfoW apr_winapi_GetNamedSecurityInfoW + +APR_DECLARE_LATE_DLL_FUNC(DLL_WINADVAPI, BOOL, WINAPI, GetNamedSecurityInfoA, 0, ( + IN LPSTR pObjectName, + IN SE_OBJECT_TYPE ObjectType, + IN SECURITY_INFORMATION SecurityInfo, + OUT PSID *ppsidOwner, + OUT PSID *ppsidGroup, + OUT PACL *ppDacl, + OUT PACL *ppSacl, + OUT PSECURITY_DESCRIPTOR *ppSecurityDescriptor), + (pObjectName, ObjectType, SecurityInfo, ppsidOwner, ppsidGroup, + ppDacl, ppSacl, ppSecurityDescriptor)); +#define GetNamedSecurityInfoA apr_winapi_GetNamedSecurityInfoA +#undef GetNamedSecurityInfo +#define GetNamedSecurityInfo apr_winapi_GetNamedSecurityInfoA + +APR_DECLARE_LATE_DLL_FUNC(DLL_WINADVAPI, BOOL, WINAPI, GetSecurityInfo, 0, ( + IN HANDLE handle, + IN SE_OBJECT_TYPE ObjectType, + IN SECURITY_INFORMATION SecurityInfo, + OUT PSID *ppsidOwner, + OUT PSID *ppsidGroup, + OUT PACL *ppDacl, + OUT PACL *ppSacl, + OUT PSECURITY_DESCRIPTOR *ppSecurityDescriptor), + (handle, ObjectType, SecurityInfo, ppsidOwner, ppsidGroup, + ppDacl, ppSacl, ppSecurityDescriptor)); +#define GetSecurityInfo apr_winapi_GetSecurityInfo + +APR_DECLARE_LATE_DLL_FUNC(DLL_SHSTDAPI, LPWSTR *, WINAPI, CommandLineToArgvW, 0, ( + LPCWSTR lpCmdLine, + int *pNumArgs), + (lpCmdLine, pNumArgs)); +#define CommandLineToArgvW apr_winapi_CommandLineToArgvW + +#endif /* !defined(_WIN32_WCE) && !defined(WINNT) */ + +#if !defined(_WIN32_WCE) + +APR_DECLARE_LATE_DLL_FUNC(DLL_NTDLL, DWORD, WINAPI, NtQueryTimerResolution, 0, ( + ULONG *pMaxRes, /* Minimum NS Resolution */ + ULONG *pMinRes, /* Maximum NS Resolution */ + ULONG *pCurRes), /* Current NS Resolution */ + (pMaxRes, pMinRes, pCurRes)); +#define QueryTimerResolution apr_winapi_NtQueryTimerResolution + +APR_DECLARE_LATE_DLL_FUNC(DLL_NTDLL, DWORD, WINAPI, NtSetTimerResolution, 0, ( + ULONG ReqRes, /* Requested NS Clock Resolution */ + BOOL Acquire, /* Aquire (1) or Release (0) our interest */ + ULONG *pNewRes), /* The NS Clock Resolution granted */ + (ReqRes, Acquire, pNewRes)); +#define SetTimerResolution apr_winapi_NtSetTimerResolution + +/* ### These are ULONG_PTR values, but that's int32 for all we care + * until the Win64 port is prepared. + */ +typedef struct PBI { + DWORD ExitStatus; + PVOID PebBaseAddress; + ULONG AffinityMask; + LONG BasePriority; + ULONG UniqueProcessId; + ULONG InheritedFromUniqueProcessId; +} PBI, *PPBI; + +APR_DECLARE_LATE_DLL_FUNC(DLL_NTDLL, DWORD, WINAPI, NtQueryInformationProcess, 0, ( + HANDLE hProcess, /* Obvious */ + INT info, /* Use 0 for PBI documented above */ + PVOID pPI, /* The PIB buffer */ + ULONG LenPI, /* Use sizeof(PBI) */ + ULONG *pSizePI), /* returns pPI buffer used (may pass NULL) */ + (hProcess, info, pPI, LenPI, pSizePI)); +#define QueryInformationProcess apr_winapi_NtQueryInformationProcess + +APR_DECLARE_LATE_DLL_FUNC(DLL_NTDLL, DWORD, WINAPI, NtQueryObject, 0, ( + HANDLE hObject, /* Obvious */ + INT info, /* Use 0 for PBI documented above */ + PVOID pOI, /* The PIB buffer */ + ULONG LenOI, /* Use sizeof(PBI) */ + ULONG *pSizeOI), /* returns pPI buffer used (may pass NULL) */ + (hObject, info, pOI, LenOI, pSizeOI)); +#define QueryObject apr_winapi_NtQueryObject + +#endif /* !defined(_WIN32_WCE) */ + +#endif /* ! MISC_H */ + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/win32/apr_arch_networkio.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/win32/apr_arch_networkio.h new file mode 100644 index 00000000..be6edc5b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/win32/apr_arch_networkio.h @@ -0,0 +1,80 @@ +/* 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. + */ + +#ifndef NETWORK_IO_H +#define NETWORK_IO_H + +#include "apr_network_io.h" +#include "apr_general.h" + +typedef struct sock_userdata_t sock_userdata_t; +struct sock_userdata_t { + sock_userdata_t *next; + const char *key; + void *data; +}; + +struct apr_socket_t { + apr_pool_t *cntxt; + SOCKET socketdes; + int type; /* SOCK_STREAM, SOCK_DGRAM */ + int protocol; + apr_sockaddr_t *local_addr; + apr_sockaddr_t *remote_addr; + int timeout_ms; /* MUST MATCH if timeout > 0 */ + apr_interval_time_t timeout; + apr_int32_t disconnected; + int local_port_unknown; + int local_interface_unknown; + int remote_addr_unknown; + apr_int32_t netmask; + apr_int32_t inherit; +#if APR_HAS_SENDFILE + /* As of 07.20.04, the overlapped structure is only used by + * apr_socket_sendfile and that's where it will be allocated + * and initialized. + */ + OVERLAPPED *overlapped; +#endif + sock_userdata_t *userdata; +}; + +#ifdef _WIN32_WCE +#ifndef WSABUF +typedef struct _WSABUF { + u_long len; /* the length of the buffer */ + char FAR * buf; /* the pointer to the buffer */ +} WSABUF, FAR * LPWSABUF; +#endif +#endif + +apr_status_t status_from_res_error(int); + +const char *apr_inet_ntop(int af, const void *src, char *dst, apr_size_t size); +int apr_inet_pton(int af, const char *src, void *dst); +void apr_sockaddr_vars_set(apr_sockaddr_t *, int, apr_port_t); + +#define apr_is_option_set(mask, option) ((mask & option) ==option) +#define apr_set_option(mask, option, on) \ + do { \ + if (on) \ + *mask |= option; \ + else \ + *mask &= ~option; \ + } while (0) + +#endif /* ! NETWORK_IO_H */ + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/win32/apr_arch_proc_mutex.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/win32/apr_arch_proc_mutex.h new file mode 100644 index 00000000..4e3e3993 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/win32/apr_arch_proc_mutex.h @@ -0,0 +1,29 @@ +/* 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. + */ + +#ifndef PROC_MUTEX_H +#define PROC_MUTEX_H + +#include "apr_proc_mutex.h" + +struct apr_proc_mutex_t { + apr_pool_t *pool; + HANDLE handle; + const char *fname; +}; + +#endif /* PROC_MUTEX_H */ + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/win32/apr_arch_thread_cond.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/win32/apr_arch_thread_cond.h new file mode 100644 index 00000000..840949c2 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/win32/apr_arch_thread_cond.h @@ -0,0 +1,31 @@ +/* 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. + */ + +#ifndef THREAD_COND_H +#define THREAD_COND_H + +#include "apr_thread_cond.h" + +struct apr_thread_cond_t { + apr_pool_t *pool; + HANDLE event; + int signal_all; + int num_waiting; + int signalled; +}; + +#endif /* THREAD_COND_H */ + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/win32/apr_arch_thread_mutex.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/win32/apr_arch_thread_mutex.h new file mode 100644 index 00000000..13d3c1cb --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/win32/apr_arch_thread_mutex.h @@ -0,0 +1,40 @@ +/* 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. + */ + +#ifndef THREAD_MUTEX_H +#define THREAD_MUTEX_H + +#include "apr_pools.h" + +typedef enum thread_mutex_type { + thread_mutex_critical_section, + thread_mutex_unnested_event, + thread_mutex_nested_mutex +} thread_mutex_type; + +/* handle applies only to unnested_event on all platforms + * and nested_mutex on Win9x only. Otherwise critical_section + * is used for NT nexted mutexes providing optimal performance. + */ +struct apr_thread_mutex_t { + apr_pool_t *pool; + thread_mutex_type type; + HANDLE handle; + CRITICAL_SECTION section; +}; + +#endif /* THREAD_MUTEX_H */ + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/win32/apr_arch_thread_rwlock.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/win32/apr_arch_thread_rwlock.h new file mode 100644 index 00000000..1177e529 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/win32/apr_arch_thread_rwlock.h @@ -0,0 +1,30 @@ +/* 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. + */ + +#ifndef THREAD_RWLOCK_H +#define THREAD_RWLOCK_H + +#include "apr_thread_rwlock.h" + +struct apr_thread_rwlock_t { + apr_pool_t *pool; + HANDLE write_mutex; + HANDLE read_event; + LONG readers; +}; + +#endif /* THREAD_RWLOCK_H */ + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/win32/apr_arch_threadproc.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/win32/apr_arch_threadproc.h new file mode 100644 index 00000000..d5e43fd1 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/win32/apr_arch_threadproc.h @@ -0,0 +1,69 @@ +/* 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. + */ + +#include "apr_private.h" +#include "apr_thread_proc.h" +#include "apr_file_io.h" + +#ifndef THREAD_PROC_H +#define THREAD_PROC_H + +#define SHELL_PATH "cmd.exe" + +struct apr_thread_t { + apr_pool_t *pool; + HANDLE td; + apr_int32_t cancel; + apr_int32_t cancel_how; + void *data; + apr_thread_start_t func; + apr_status_t exitval; +}; + +struct apr_threadattr_t { + apr_pool_t *pool; + apr_int32_t detach; + apr_size_t stacksize; +}; + +struct apr_threadkey_t { + apr_pool_t *pool; + DWORD key; +}; + +struct apr_procattr_t { + apr_pool_t *pool; + apr_file_t *parent_in; + apr_file_t *child_in; + apr_file_t *parent_out; + apr_file_t *child_out; + apr_file_t *parent_err; + apr_file_t *child_err; + char *currdir; + apr_int32_t cmdtype; + apr_int32_t detached; + apr_child_errfn_t *errfn; + apr_int32_t errchk; +}; + +struct apr_thread_once_t { + long value; +}; + +extern apr_status_t apr_threadproc_init(apr_pool_t *pool); + +#endif /* ! THREAD_PROC_H */ + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/win32/apr_arch_utf8.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/win32/apr_arch_utf8.h new file mode 100644 index 00000000..84f8bf77 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/win32/apr_arch_utf8.h @@ -0,0 +1,56 @@ +/* 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. + */ + +#ifndef UTF8_H +#define UTF8_H + +#include "apr.h" +#include "apr_lib.h" +#include "apr_errno.h" + +/* If we ever support anything more exciting than char... this could move. + */ +typedef apr_uint16_t apr_wchar_t; + +/** + * An APR internal function for fast utf-8 octet-encoded Unicode conversion + * to the ucs-2 wide Unicode format. This function is used for filename and + * other resource conversions for platforms providing native Unicode support. + * + * @tip Only the errors APR_EINVAL and APR_INCOMPLETE may occur, the former + * when the character code is invalid (in or out of context) and the later + * when more characters were expected, but insufficient characters remain. + */ +APR_DECLARE(apr_status_t) apr_conv_utf8_to_ucs2(const char *in, + apr_size_t *inbytes, + apr_wchar_t *out, + apr_size_t *outwords); + +/** + * An APR internal function for fast ucs-2 wide Unicode format conversion to + * the utf-8 octet-encoded Unicode. This function is used for filename and + * other resource conversions for platforms providing native Unicode support. + * + * @tip Only the errors APR_EINVAL and APR_INCOMPLETE may occur, the former + * when the character code is invalid (in or out of context) and the later + * when more words were expected, but insufficient words remain. + */ +APR_DECLARE(apr_status_t) apr_conv_ucs2_to_utf8(const apr_wchar_t *in, + apr_size_t *inwords, + char *out, + apr_size_t *outbytes); + +#endif /* def UTF8_H */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/win32/apr_dbg_win32_handles.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/win32/apr_dbg_win32_handles.h new file mode 100644 index 00000000..471cd66d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/win32/apr_dbg_win32_handles.h @@ -0,0 +1,217 @@ +/* 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. + */ + +#ifndef APR_DBG_WIN32_HANDLES_H +#define APR_DBG_WIN32_HANDLES_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* USAGE: + * + * Add the following include to apr_private.h for internal debugging, + * or copy this header into apr/include add the include below to apr.h + * for really global debugging; + * + * #include "apr_dbg_win32_handles.h" + * + * apr_dbg_log is the crux of this function ... it uses Win32 API and + * no apr calls itself to log all activity to a file named for the + * executing application with a .pid suffix. Ergo several instances + * may be executing and logged at once. + * + * HANDLE apr_dbg_log(char* fn, HANDLE ha, char* fl, int ln, int nh + * [, HANDLE *hv, char *dsc...]) + * + * returns: the handle passed in ha, which is cast back to the real return type. + * + * formats one line into the debug log file if nh is zero; + * ha (hex) seq(hex) tid(hex) fn fl ln + * xxxxxxxx xxxxxxxx xxxxxxxx func() sourcefile:lineno + * The macro apr_dbg_rv makes this simple to implement for many APIs + * that simply take args that don't interest us, and return a handle. + * + * formats multiple lines (nh) into the debug log file for each hv/dsc pair + * (nh must correspond to the number of pairs); + * hv (hex) seq(hex) tid(hex) fn dsc fl ln + * xxxxxxxx xxxxxxxx xxxxxxxx func(arg) sourcefile:lineno + * In this later usage, hv is the still the return value but is not + * treated as a handle. + */ + +APR_DECLARE_NONSTD(HANDLE) apr_dbg_log(char* fn, HANDLE ha, char* fl, int ln, + int nh,/* HANDLE *hv, char *dsc */...); + +#define apr_dbg_rv(fn, args) (apr_dbg_log(#fn,(fn) args,__FILE__,__LINE__,0)) + +#define CloseHandle(h) \ + ((BOOL)apr_dbg_log("CloseHandle", \ + (HANDLE)(CloseHandle)(h), \ + __FILE__,__LINE__,1, \ + &(h),"")) + +#define CreateEventA(sd,b1,b2,nm) apr_dbg_rv(CreateEventA,(sd,b1,b2,nm)) +#define CreateEventW(sd,b1,b2,nm) apr_dbg_rv(CreateEventW,(sd,b1,b2,nm)) + +#define CreateFileA(nm,d1,d2,sd,d3,d4,h) apr_dbg_rv(CreateFileA,(nm,d1,d2,sd,d3,d4,h)) +#define CreateFileW(nm,d1,d2,sd,d3,d4,h) apr_dbg_rv(CreateFileW,(nm,d1,d2,sd,d3,d4,h)) + +#define CreateFileMappingA(fh,sd,d1,d2,d3,nm) apr_dbg_rv(CreateFileMappingA,(fh,sd,d1,d2,d3,nm)) +#define CreateFileMappingW(fh,sd,d1,d2,d3,nm) apr_dbg_rv(CreateFileMappingW,(fh,sd,d1,d2,d3,nm)) + +#define CreateMutexA(sd,b,nm) apr_dbg_rv(CreateMutexA,(sd,b,nm)) +#define CreateMutexW(sd,b,nm) apr_dbg_rv(CreateMutexW,(sd,b,nm)) + +#define CreateIoCompletionPort(h1,h2,pd1,d2) apr_dbg_rv(CreateIoCompletionPort,(h1,h2,pd1,d2)) + +#define CreateNamedPipeA(nm,d1,d2,d3,d4,d5,d6,sd) apr_dbg_rv(CreateNamedPipeA,(nm,d1,d2,d3,d4,d5,d6,sd)) +#define CreateNamedPipeW(nm,d1,d2,d3,d4,d5,d6,sd) apr_dbg_rv(CreateNamedPipeW,(nm,d1,d2,d3,d4,d5,d6,sd)) + +#define CreatePipe(ph1,ph2,sd,d) \ + ((BOOL)apr_dbg_log("CreatePipe", \ + (HANDLE)(CreatePipe)(ph1,ph2,sd,d), \ + __FILE__,__LINE__,2, \ + (ph1),"hRead", \ + (ph2),"hWrite")) + +#define CreateProcessA(s1,s2,sd1,sd2,b,d1,s3,s4,pd2,hr) \ + ((BOOL)apr_dbg_log("CreateProcessA", \ + (HANDLE)(CreateProcessA)(s1,s2,sd1,sd2,b,d1,s3,s4,pd2,hr), \ + __FILE__,__LINE__,2, \ + &((hr)->hProcess),"hProcess", \ + &((hr)->hThread),"hThread")) +#define CreateProcessW(s1,s2,sd1,sd2,b,d1,s3,s4,pd2,hr) \ + ((BOOL)apr_dbg_log("CreateProcessW", \ + (HANDLE)(CreateProcessW)(s1,s2,sd1,sd2,b,d1,s3,s4,pd2,hr), \ + __FILE__,__LINE__,2, \ + &((hr)->hProcess),"hProcess", \ + &((hr)->hThread),"hThread")) + +#define CreateSemaphoreA(sd,d1,d2,nm) apr_dbg_rv(CreateSemaphoreA,(sd,d1,d2,nm)) +#define CreateSemaphoreW(sd,d1,d2,nm) apr_dbg_rv(CreateSemaphoreW,(sd,d1,d2,nm)) + +#define CreateThread(sd,d1,fn,pv,d2,pd3) apr_dbg_rv(CreateThread,(sd,d1,fn,pv,d2,pd3)) + +#define DeregisterEventSource(h) \ + ((BOOL)apr_dbg_log("DeregisterEventSource", \ + (HANDLE)(DeregisterEventSource)(h), \ + __FILE__,__LINE__,1, \ + &(h),"")) + +#define DuplicateHandle(h1,h2,h3,ph4,d1,b,d2) \ + ((BOOL)apr_dbg_log("DuplicateHandle", \ + (HANDLE)(DuplicateHandle)(h1,h2,h3,ph4,d1,b,d2), \ + __FILE__,__LINE__,2, \ + (ph4),((h3)==GetCurrentProcess()) \ + ? "Target" : "EXTERN Target", \ + &(h2),((h1)==GetCurrentProcess()) \ + ? "Source" : "EXTERN Source")) + +#define GetCurrentProcess() \ + (apr_dbg_log("GetCurrentProcess", \ + (GetCurrentProcess)(),__FILE__,__LINE__,0)) + +#define GetCurrentThread() \ + (apr_dbg_log("GetCurrentThread", \ + (GetCurrentThread)(),__FILE__,__LINE__,0)) + +#define GetModuleHandleA(nm) apr_dbg_rv(GetModuleHandleA,(nm)) +#define GetModuleHandleW(nm) apr_dbg_rv(GetModuleHandleW,(nm)) + +#define GetStdHandle(d) apr_dbg_rv(GetStdHandle,(d)) + +#define LoadLibraryA(nm) apr_dbg_rv(LoadLibraryA,(nm)) +#define LoadLibraryW(nm) apr_dbg_rv(LoadLibraryW,(nm)) + +#define LoadLibraryExA(nm,h,d) apr_dbg_rv(LoadLibraryExA,(nm,h,d)) +#define LoadLibraryExW(nm,h,d) apr_dbg_rv(LoadLibraryExW,(nm,h,d)) + +#define OpenEventA(d,b,nm) apr_dbg_rv(OpenEventA,(d,b,nm)) +#define OpenEventW(d,b,nm) apr_dbg_rv(OpenEventW,(d,b,nm)) + +#define OpenFileMappingA(d,b,nm) apr_dbg_rv(OpenFileMappingA,(d,b,nm)) +#define OpenFileMappingW(d,b,nm) apr_dbg_rv(OpenFileMappingW,(d,b,nm)) + +#define RegisterEventSourceA(s1,s2) apr_dbg_rv(RegisterEventSourceA,(s1,s2)) +#define RegisterEventSourceW(s1,s2) apr_dbg_rv(RegisterEventSourceW,(s1,s2)) + +#define SetEvent(h) \ + ((BOOL)apr_dbg_log("SetEvent", \ + (HANDLE)(SetEvent)(h), \ + __FILE__,__LINE__,1, \ + &(h),"")) + +#define SetStdHandle(d,h) \ + ((BOOL)apr_dbg_log("SetStdHandle", \ + (HANDLE)(SetStdHandle)(d,h), \ + __FILE__,__LINE__,1,&(h),"")) + +#define socket(i1,i2,i3) \ + ((SOCKET)apr_dbg_log("socket", \ + (HANDLE)(socket)(i1,i2,i3), \ + __FILE__,__LINE__,0)) + +#define WaitForSingleObject(h,d) \ + ((DWORD)apr_dbg_log("WaitForSingleObject", \ + (HANDLE)(WaitForSingleObject)(h,d), \ + __FILE__,__LINE__,1,&(h),"Signaled")) + +#define WaitForSingleObjectEx(h,d,b) \ + ((DWORD)apr_dbg_log("WaitForSingleObjectEx", \ + (HANDLE)(WaitForSingleObjectEx)(h,d,b), \ + __FILE__,__LINE__,1,&(h),"Signaled")) + +#define WaitForMultipleObjects(d1,ah,b,d2) \ + ((DWORD)apr_dbg_log("WaitForMultipleObjects", \ + (HANDLE)(WaitForMultipleObjects)(d1,ah,b,d2), \ + __FILE__,__LINE__,1,ah,"Signaled")) + +#define WaitForMultipleObjectsEx(d1,ah,b1,d2,b2) \ + ((DWORD)apr_dbg_log("WaitForMultipleObjectsEx", \ + (HANDLE)(WaitForMultipleObjectsEx)(d1,ah,b1,d2,b2), \ + __FILE__,__LINE__,1,ah,"Signaled")) + +#define WSASocketA(i1,i2,i3,pi,g,dw) \ + ((SOCKET)apr_dbg_log("WSASocketA", \ + (HANDLE)(WSASocketA)(i1,i2,i3,pi,g,dw), \ + __FILE__,__LINE__,0)) + +#define WSASocketW(i1,i2,i3,pi,g,dw) \ + ((SOCKET)apr_dbg_log("WSASocketW", \ + (HANDLE)(WSASocketW)(i1,i2,i3,pi,g,dw), \ + __FILE__,__LINE__,0)) + +#define closesocket(sh) \ + ((int)apr_dbg_log("closesocket", \ + (HANDLE)(closesocket)(sh), \ + __FILE__,__LINE__,1,&(sh),"")) + +#define _beginthread(fn,d,pv) \ + ((unsigned long)apr_dbg_log("_beginthread", \ + (HANDLE)(_beginthread)(fn,d,pv), \ + __FILE__,__LINE__,0)) + +#define _beginthreadex(sd,d1,fn,pv,d2,pd3) \ + ((unsigned long)apr_dbg_log("_beginthreadex", \ + (HANDLE)(_beginthreadex)(sd,d1,fn,pv,d2,pd3), \ + __FILE__,__LINE__,0)) + +#ifdef __cplusplus +} +#endif + +#endif /* !defined(APR_DBG_WIN32_HANDLES_H) */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/win32/apr_private.h b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/win32/apr_private.h new file mode 100644 index 00000000..40a7f750 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/include/arch/win32/apr_private.h @@ -0,0 +1,151 @@ +/* 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. + */ + +/* + * Note: + * This is the windows specific autoconf-like config file + * which unix would create at build time. + */ + +#ifdef WIN32 + +#ifndef APR_PRIVATE_H +#define APR_PRIVATE_H + +/* Include the public APR symbols, include our idea of the 'right' + * subset of the Windows.h header. This saves us repetition. + */ +#include "apr.h" + +/* + * Add a _very_few_ declarations missing from the restricted set of headers + * (If this list becomes extensive, re-enable the required headers above!) + * winsock headers were excluded by WIN32_LEAN_AND_MEAN, so include them now + */ +#ifndef SW_HIDE +#define SW_HIDE 0 +#endif + +/* For the misc.h late-loaded dynamic symbols, we need some obscure types + * Avoid dragging in wtypes.h unless it's absolutely necessary [generally + * not with APR itself, until some GUI-related security is introduced.] + */ +#ifndef _WIN32_WCE +#define HAVE_ACLAPI 1 +#ifdef __wtypes_h__ +#include +#else +#define __wtypes_h__ +#include +#undef __wtypes_h__ +#endif +#else +#define HAVE_ACLAPI 0 +#endif + +#if APR_HAVE_SYS_TYPES_H +#include +#endif +#if APR_HAVE_STDDEF_H +#include +#endif +#include +#if APR_HAVE_TIME_H +#include +#endif + +/* Use this section to define all of the HAVE_FOO_H + * that are required to build properly. + */ +#define HAVE_LIMITS_H 1 +#define HAVE_MALLOC_H 1 +#define HAVE_SIGNAL_H 1 +/* #define HAVE_STDDEF_H 1 why not? */ +#define HAVE_STDLIB_H 1 + +#define HAVE_STRICMP 1 +#define HAVE_STRNICMP 1 +#define HAVE_STRDUP 1 +#define HAVE_STRSTR 1 +#define HAVE_MEMCHR 1 + +#define SIGHUP 1 +/* 2 is used for SIGINT on windows */ +#define SIGQUIT 3 +/* 4 is used for SIGILL on windows */ +#define SIGTRAP 5 +#define SIGIOT 6 +#define SIGBUS 7 +/* 8 is used for SIGFPE on windows */ +#define SIGKILL 9 +#define SIGUSR1 10 +/* 11 is used for SIGSEGV on windows */ +#define SIGUSR2 12 +#define SIGPIPE 13 +#define SIGALRM 14 +/* 15 is used for SIGTERM on windows */ +#define SIGSTKFLT 16 +#define SIGCHLD 17 +#define SIGCONT 18 +#define SIGSTOP 19 +#define SIGTSTP 20 +/* 21 is used for SIGBREAK on windows */ +/* 22 is used for SIGABRT on windows */ +#define SIGTTIN 23 +#define SIGTTOU 24 +#define SIGURG 25 +#define SIGXCPU 26 +#define SIGXFSZ 27 +#define SIGVTALRM 28 +#define SIGPROF 29 +#define SIGWINCH 30 +#define SIGIO 31 + +/* APR COMPATABILITY FUNCTIONS + * This section should be used to define functions and + * macros which are need to make Windows features look + * like POSIX features. + */ +typedef void (Sigfunc)(int); + +#define sleep(t) Sleep((t) * 1000) + +#define SIZEOF_SHORT 2 +#define SIZEOF_INT 4 +#define SIZEOF_LONGLONG 8 +#define SIZEOF_CHAR 1 +#define SIZEOF_SSIZE_T SIZEOF_INT + +unsigned __stdcall SignalHandling(void *); +int thread_ready(void); + +#if !APR_HAVE_ERRNO_H +APR_DECLARE_DATA int errno; +#define ENOSPC 1 +#endif + +#if APR_HAVE_IPV6 +#define HAVE_GETADDRINFO 1 +#define HAVE_GETNAMEINFO 1 +#endif + +/* + * Include common private declarations. + */ +#include "../apr_private_common.h" + +#endif /*APR_PRIVATE_H*/ +#endif /*WIN32*/ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/libapr-0.la b/rubbos/app/httpd-2.0.64/srclib/apr/libapr-0.la new file mode 100644 index 00000000..213c75df --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/libapr-0.la @@ -0,0 +1,35 @@ +# libapr-0.la - a libtool library file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='libapr-0.so.0' + +# Names of this library. +library_names='libapr-0.so.0.9.19 libapr-0.so.0 libapr-0.so' + +# The name of the static archive. +old_library='libapr-0.a' + +# Libraries that this one depends upon. +dependency_libs=' -lrt -lm -lcrypt -lnsl -lpthread -ldl' + +# Version information for libapr-0. +current=9 +age=9 +revision=19 + +# Is this an already installed library? +installed=no + +# Should we warn about portability when linking against -modules? +shouldnotlink=no + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='/bottlenecks/rubbos/app/apache2/lib' diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/libapr.dsp b/rubbos/app/httpd-2.0.64/srclib/apr/libapr.dsp new file mode 100644 index 00000000..c394aafe --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/libapr.dsp @@ -0,0 +1,653 @@ +# Microsoft Developer Studio Project File - Name="libapr" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=libapr - 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 "libapr.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 "libapr.mak" CFG="libapr - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "libapr - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "libapr - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "libapr - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "./include" /I "./include/arch" /I "./include/arch/win32" /I "./include/arch/unix" /D "NDEBUG" /D "APR_DECLARE_EXPORT" /D "WIN32" /D "_WINDOWS" /Fd"Release\libapr_src" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL" +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o /win32 "NUL" +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" /d "APR_VERSION_ONLY" /I "./include" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib shell32.lib rpcrt4.lib /nologo /base:"0x6EEC0000" /subsystem:windows /dll /incremental:no /debug /opt:ref +# ADD LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib shell32.lib rpcrt4.lib /nologo /base:"0x6EEC0000" /subsystem:windows /dll /incremental:no /debug /opt:ref +# Begin Special Build Tool +OutDir=.\Release +SOURCE="$(InputPath)" +PostBuild_Desc=Embed .manifest +PostBuild_Cmds=if exist $(OUTDIR)\libapr.dll.manifest mt.exe -manifest $(OUTDIR)\libapr.dll.manifest -outputresource:$(OUTDIR)\libapr.dll;2 +# End Special Build Tool + +!ELSEIF "$(CFG)" == "libapr - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "./include" /I "./include/arch" /I "./include/arch/win32" /I "./include/arch/unix" /D "_DEBUG" /D "APR_DECLARE_EXPORT" /D "WIN32" /D "_WINDOWS" /Fd"Debug\libapr_src" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL" +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o /win32 "NUL" +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" /d "APR_VERSION_ONLY" /I "./include" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib shell32.lib rpcrt4.lib /nologo /base:"0x6EEC0000" /subsystem:windows /dll /incremental:no /debug +# ADD LINK32 kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib shell32.lib rpcrt4.lib /nologo /base:"0x6EEC0000" /subsystem:windows /dll /incremental:no /debug +# Begin Special Build Tool +OutDir=.\Debug +SOURCE="$(InputPath)" +PostBuild_Desc=Embed .manifest +PostBuild_Cmds=if exist $(OUTDIR)\libapr.dll.manifest mt.exe -manifest $(OUTDIR)\libapr.dll.manifest -outputresource:$(OUTDIR)\libapr.dll;2 +# End Special Build Tool + +!ENDIF + +# Begin Target + +# Name "libapr - Win32 Release" +# Name "libapr - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter ".c" +# Begin Group "dso" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\dso\win32\dso.c +# End Source File +# End Group +# Begin Group "file_io" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\file_io\unix\copy.c +# End Source File +# Begin Source File + +SOURCE=.\file_io\win32\dir.c +# End Source File +# Begin Source File + +SOURCE=.\file_io\unix\fileacc.c +# End Source File +# Begin Source File + +SOURCE=.\file_io\win32\filedup.c +# End Source File +# Begin Source File + +SOURCE=.\file_io\win32\filepath.c +# End Source File +# Begin Source File + +SOURCE=.\file_io\unix\filepath_util.c +# End Source File +# Begin Source File + +SOURCE=.\file_io\win32\filestat.c +# End Source File +# Begin Source File + +SOURCE=.\file_io\win32\filesys.c +# End Source File +# Begin Source File + +SOURCE=.\file_io\win32\flock.c +# End Source File +# Begin Source File + +SOURCE=.\file_io\unix\fullrw.c +# End Source File +# Begin Source File + +SOURCE=.\file_io\unix\mktemp.c +# End Source File +# Begin Source File + +SOURCE=.\file_io\win32\open.c +# End Source File +# Begin Source File + +SOURCE=.\file_io\win32\pipe.c +# End Source File +# Begin Source File + +SOURCE=.\file_io\win32\readwrite.c +# End Source File +# Begin Source File + +SOURCE=.\file_io\win32\seek.c +# End Source File +# Begin Source File + +SOURCE=.\file_io\unix\tempdir.c +# End Source File +# End Group +# Begin Group "locks" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\locks\win32\proc_mutex.c +# End Source File +# Begin Source File + +SOURCE=.\locks\win32\thread_cond.c +# End Source File +# Begin Source File + +SOURCE=.\locks\win32\thread_mutex.c +# End Source File +# Begin Source File + +SOURCE=.\locks\win32\thread_rwlock.c +# End Source File +# End Group +# Begin Group "memory" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\memory\unix\apr_pools.c +# End Source File +# End Group +# Begin Group "misc" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\misc\win32\apr_app.c +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File + +SOURCE=.\misc\win32\charset.c +# End Source File +# Begin Source File + +SOURCE=.\misc\win32\env.c +# End Source File +# Begin Source File + +SOURCE=.\misc\unix\errorcodes.c +# End Source File +# Begin Source File + +SOURCE=.\misc\unix\getopt.c +# End Source File +# Begin Source File + +SOURCE=.\misc\win32\internal.c +# End Source File +# Begin Source File + +SOURCE=.\misc\win32\misc.c +# End Source File +# Begin Source File + +SOURCE=.\misc\unix\otherchild.c +# End Source File +# Begin Source File + +SOURCE=.\misc\win32\rand.c +# End Source File +# Begin Source File + +SOURCE=.\misc\win32\start.c +# End Source File +# Begin Source File + +SOURCE=.\misc\win32\utf8.c +# End Source File +# Begin Source File + +SOURCE=.\misc\unix\version.c +# End Source File +# End Group +# Begin Group "mmap" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\mmap\unix\common.c +# End Source File +# Begin Source File + +SOURCE=.\mmap\win32\mmap.c +# End Source File +# End Group +# Begin Group "network_io" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\network_io\unix\inet_ntop.c +# End Source File +# Begin Source File + +SOURCE=.\network_io\unix\inet_pton.c +# End Source File +# Begin Source File + +SOURCE=.\poll\unix\poll.c +# End Source File +# Begin Source File + +SOURCE=.\poll\unix\pollacc.c +# End Source File +# Begin Source File + +SOURCE=.\network_io\win32\sendrecv.c +# End Source File +# Begin Source File + +SOURCE=.\network_io\unix\sockaddr.c +# End Source File +# Begin Source File + +SOURCE=.\network_io\win32\sockets.c +# End Source File +# Begin Source File + +SOURCE=.\network_io\win32\sockopt.c +# End Source File +# End Group +# Begin Group "passwd" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\passwd\apr_getpass.c +# End Source File +# End Group +# Begin Group "shmem" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\shmem\win32\shm.c +# End Source File +# End Group +# Begin Group "strings" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\strings\apr_cpystrn.c +# End Source File +# Begin Source File + +SOURCE=.\strings\apr_fnmatch.c +# End Source File +# Begin Source File + +SOURCE=.\strings\apr_snprintf.c +# End Source File +# Begin Source File + +SOURCE=.\strings\apr_strings.c +# End Source File +# Begin Source File + +SOURCE=.\strings\apr_strnatcmp.c +# End Source File +# Begin Source File + +SOURCE=.\strings\apr_strtok.c +# End Source File +# End Group +# Begin Group "tables" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\tables\apr_hash.c +# End Source File +# Begin Source File + +SOURCE=.\tables\apr_tables.c +# End Source File +# End Group +# Begin Group "threadproc" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\threadproc\win32\proc.c +# End Source File +# Begin Source File + +SOURCE=.\threadproc\win32\signals.c +# End Source File +# Begin Source File + +SOURCE=.\threadproc\win32\thread.c +# End Source File +# Begin Source File + +SOURCE=.\threadproc\win32\threadpriv.c +# End Source File +# End Group +# Begin Group "time" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\time\win32\access.c +# End Source File +# Begin Source File + +SOURCE=.\time\win32\time.c +# End Source File +# Begin Source File + +SOURCE=.\time\win32\timestr.c +# End Source File +# End Group +# Begin Group "user" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\user\win32\groupinfo.c +# End Source File +# Begin Source File + +SOURCE=.\user\win32\userinfo.c +# End Source File +# End Group +# End Group +# Begin Group "Private Header Files" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\include\arch\win32\apr_arch_atime.h +# End Source File +# Begin Source File + +SOURCE=.\include\arch\win32\apr_arch_dso.h +# End Source File +# Begin Source File + +SOURCE=.\include\arch\win32\apr_arch_file_io.h +# End Source File +# Begin Source File + +SOURCE=.\include\arch\win32\apr_arch_inherit.h +# End Source File +# Begin Source File + +SOURCE=.\include\arch\win32\apr_arch_misc.h +# End Source File +# Begin Source File + +SOURCE=.\include\arch\win32\apr_arch_networkio.h +# End Source File +# Begin Source File + +SOURCE=.\include\arch\win32\apr_arch_thread_mutex.h +# End Source File +# Begin Source File + +SOURCE=.\include\arch\win32\apr_arch_thread_rwlock.h +# End Source File +# Begin Source File + +SOURCE=.\include\arch\win32\apr_arch_threadproc.h +# End Source File +# Begin Source File + +SOURCE=.\include\arch\win32\apr_arch_utf8.h +# End Source File +# Begin Source File + +SOURCE=.\include\arch\win32\apr_private.h +# End Source File +# Begin Source File + +SOURCE=.\include\arch\apr_private_common.h +# End Source File +# End Group +# Begin Group "Public Header Files" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\include\apr.h.in +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File + +SOURCE=.\include\apr.hnw +# PROP Exclude_From_Build 1 +# End Source File +# Begin Source File + +SOURCE=.\include\apr.hw + +!IF "$(CFG)" == "libapr - Win32 Release" + +# Begin Custom Build - Creating apr.h from apr.hw +InputPath=.\include\apr.hw + +".\include\apr.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + type .\include\apr.hw > .\include\apr.h + +# End Custom Build + +!ELSEIF "$(CFG)" == "libapr - Win32 Debug" + +# Begin Custom Build - Creating apr.h from apr.hw +InputPath=.\include\apr.hw + +".\include\apr.h" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + type .\include\apr.hw > .\include\apr.h + +# End Custom Build + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\include\apr_allocator.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_atomic.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_compat.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_dso.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_env.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_errno.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_file_info.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_file_io.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_fnmatch.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_general.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_getopt.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_global_mutex.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_hash.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_inherit.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_lib.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_mmap.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_network_io.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_poll.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_pools.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_portable.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_proc_mutex.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_ring.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_shm.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_signal.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_strings.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_support.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_tables.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_thread_cond.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_thread_mutex.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_thread_proc.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_thread_rwlock.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_time.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_user.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_version.h +# End Source File +# Begin Source File + +SOURCE=.\include\apr_want.h +# End Source File +# End Group +# Begin Source File + +SOURCE=.\libapr.rc +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/libapr.rc b/rubbos/app/httpd-2.0.64/srclib/apr/libapr.rc new file mode 100644 index 00000000..207b8b58 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/libapr.rc @@ -0,0 +1,73 @@ +#include "apr_general.h" +#include "apr_version.h" + +#define APR_COPYRIGHT "Copyright (c) 2009 The Apache Software " \ + "Foundation or its licensors, as applicable." + +#define APR_LICENSE "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\r\n\r\n" \ + "http://www.apache.org/licenses/LICENSE-2.0\r\n\r\n" \ + "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." + +#define APR_DLL_BASENAME "libapr" + +/** An alternative formatted string of APR's version */ +/* macro for Win32 .rc files using numeric csv representation */ +#define APR_VERSION_STRING_CSV APR_MAJOR_VERSION ##, \ + ##APR_MINOR_VERSION ##, \ + ##APR_PATCH_VERSION + + +1 VERSIONINFO + FILEVERSION APR_VERSION_STRING_CSV,0 + PRODUCTVERSION APR_VERSION_STRING_CSV,0 + FILEFLAGSMASK 0x3fL +#if defined(APR_IS_DEV_VERSION) +#if defined(_DEBUG) + FILEFLAGS 0x03L +#else + FILEFLAGS 0x02L +#endif +#else +#if defined(_DEBUG) + FILEFLAGS 0x01L +#else + FILEFLAGS 0x00L +#endif +#endif +#if defined(WINNT) || defined(WIN64) + FILEOS 0x40004L +#else + FILEOS 0x4L +#endif + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" + BEGIN + VALUE "Comments", APR_LICENSE "\0" + VALUE "CompanyName", "Apache Software Foundation\0" + VALUE "FileDescription", "Apache Portable Runtime Library\0" + VALUE "FileVersion", APR_VERSION_STRING "\0" + VALUE "InternalName", APR_DLL_BASENAME "\0" + VALUE "LegalCopyright", APR_COPYRIGHT "\0" + VALUE "OriginalFilename", APR_DLL_BASENAME ".dll\0" + VALUE "ProductName", "Apache Portable Runtime Project\0" + VALUE "ProductVersion", APR_VERSION_STRING "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1200 + END +END diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/libaprnw.mcp.zip b/rubbos/app/httpd-2.0.64/srclib/apr/libaprnw.mcp.zip new file mode 100644 index 0000000000000000000000000000000000000000..f9d5c14e61f378e50b8ba31b2f05ad83090221b7 GIT binary patch literal 171800 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

    s+gFY6)Rc)w!+6-Y;IZ_n>Ekhro@< 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 z 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, 1996 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# A sed program that does not truncate output. +SED="/bin/sed" + +# Sed that helps us avoid accidentally triggering echo(1) options like -n. +Xsed="/bin/sed -e 1s/^X//" + +# 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 + +# The names of the tagged configurations supported by this script. +available_tags=" CXX" + +# ### BEGIN LIBTOOL CONFIG + +# Libtool was configured on host ubuntu: + +# Shell to use when invoking shell scripts. +SHELL="/bin/bash" + +# Whether or not to build shared libraries. +build_libtool_libs=yes + +# Whether or not to build static libraries. +build_old_libs=yes + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=no + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=no + +# Whether or not to optimize for fast installation. +fast_install=yes + +# The host system. +host_alias= +host=x86_64-unknown-linux-gnu +host_os=linux-gnu + +# The build system. +build_alias= +build=x86_64-unknown-linux-gnu +build_os=linux-gnu + +# An echo program that does not interpret backslashes. +echo="echo" + +# The archiver. +AR="ar" +AR_FLAGS="cru" + +# A C compiler. +LTCC="gcc" + +# LTCC compiler flags. +LTCFLAGS="-g -O2" + +# A language-specific compiler. +CC="gcc" + +# Is the compiler the GNU C compiler? +with_gcc=yes + +# An ERE matcher. +EGREP="/bin/grep -E" + +# The linker used to build libraries. +LD="/usr/bin/ld -m elf_x86_64" + +# Whether we need hard or soft links. +LN_S="ln -s" + +# A BSD-compatible nm program. +NM="/usr/bin/nm -B" + +# A symbol stripping program +STRIP="strip" + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=file + +# Used on cygwin: DLL creation program. +DLLTOOL="dlltool" + +# Used on cygwin: object dumper. +OBJDUMP="objdump" + +# Used on cygwin: assembler. +AS="as" + +# The name of the directory that contains temporary libtool files. +objdir=.libs + +# How to create reloadable object files. +reload_flag=" -r" +reload_cmds="\$LD\$reload_flag -o \$output\$reload_objs" + +# How to pass a linker flag through the compiler. +wl="-Wl," + +# Object file suffix (normally "o"). +objext="o" + +# Old archive suffix (normally "a"). +libext="a" + +# Shared library suffix (normally ".so"). +shrext_cmds='.so' + +# Executable file suffix (normally ""). +exeext="" + +# Additional compiler flags for building library objects. +pic_flag=" -fPIC -DPIC" +pic_mode=default + +# What is the maximum length of a command? +max_cmd_len=1572864 + +# Does compiler simultaneously support -c and -o options? +compiler_c_o="yes" + +# Must we lock files when doing compilation? +need_locks="no" + +# Do we need the lib prefix for modules? +need_lib_prefix=no + +# Do we need a version for libraries? +need_version=no + +# Whether dlopen is supported. +dlopen_support=unknown + +# Whether dlopen of programs is supported. +dlopen_self=unknown + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=unknown + +# Compiler flag to prevent dynamic linking. +link_static_flag="-static" + +# Compiler flag to turn off builtin functions. +no_builtin_flag=" -fno-builtin" + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec="\${wl}--export-dynamic" + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec="\${wl}--whole-archive\$convenience \${wl}--no-whole-archive" + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec="" + +# Library versioning type. +version_type=linux + +# Format of library name prefix. +libname_spec="lib\$name" + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec="\${libname}\${release}\${shared_ext}\$versuffix \${libname}\${release}\${shared_ext}\$major \$libname\${shared_ext}" + +# The coded name of the library, if different from the real name. +soname_spec="\${libname}\${release}\${shared_ext}\$major" + +# Commands used to build and install an old-style archive. +RANLIB="ranlib" +old_archive_cmds="\$AR \$AR_FLAGS \$oldlib\$oldobjs~\$RANLIB \$oldlib" +old_postinstall_cmds="chmod 644 \$oldlib~\$RANLIB \$oldlib" +old_postuninstall_cmds="" + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds="" + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds="" + +# Commands used to build and install a shared archive. +archive_cmds="\$CC -shared \$libobjs \$deplibs \$compiler_flags \${wl}-soname \$wl\$soname -o \$lib" +archive_expsym_cmds="\$echo \\\"{ global:\\\" > \$output_objdir/\$libname.ver~ + cat \$export_symbols | sed -e \\\"s/\\\\(.*\\\\)/\\\\1;/\\\" >> \$output_objdir/\$libname.ver~ + \$echo \\\"local: *; };\\\" >> \$output_objdir/\$libname.ver~ + \$CC -shared \$libobjs \$deplibs \$compiler_flags \${wl}-soname \$wl\$soname \${wl}-version-script \${wl}\$output_objdir/\$libname.ver -o \$lib" +postinstall_cmds="" +postuninstall_cmds="" + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds="" +module_expsym_cmds="" + +# Commands to strip libraries. +old_striplib="strip --strip-debug" +striplib="strip --strip-unneeded" + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects="" + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects="" + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps="" + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps="" + +# The directories searched by this compiler when creating a shared +# library +compiler_lib_search_dirs="" + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path="" + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method="pass_all" + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd="\$MAGIC_CMD" + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag="" + +# Flag that forces no undefined symbols. +no_undefined_flag="" + +# Commands used to finish a libtool library installation in a directory. +finish_cmds="PATH=\\\"\\\$PATH:/sbin\\\" ldconfig -n \$libdir" + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval="" + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe="sed -n -e 's/^.*[ ]\\([ABCDGIRSTW][ABCDGIRSTW]*\\)[ ][ ]*\\([_A-Za-z][_A-Za-z0-9]*\\)\$/\\1 \\2 \\2/p'" + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl="sed -n -e 's/^. .* \\(.*\\)\$/extern int \\1;/p'" + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address="sed -n -e 's/^: \\([^ ]*\\) \$/ {\\\"\\1\\\", (lt_ptr) 0},/p' -e 's/^[BCDEGRST] \\([^ ]*\\) \\([^ ]*\\)\$/ {\"\\2\", (lt_ptr) \\&\\2},/p'" + +# This is the shared library runtime path variable. +runpath_var=LD_RUN_PATH + +# This is the shared library path variable. +shlibpath_var=LD_LIBRARY_PATH + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=no + +# How to hardcode a shared library path into an executable. +hardcode_action=immediate + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=yes + +# Flag to hardcode $libdir into a binary during linking. +# This must work even if $libdir does not exist. +hardcode_libdir_flag_spec="\${wl}--rpath \${wl}\$libdir" + +# If ld is used when linking, flag to hardcode $libdir into +# a binary during linking. This must work even if $libdir does +# not exist. +hardcode_libdir_flag_spec_ld="" + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator="" + +# Set to yes if using DIR/libNAME during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=no + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=no + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=unsupported + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=no + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="PATH LD_LIBRARY_PATH LD_RUN_PATH GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=unknown + +# Compile-time system search path for libraries +sys_lib_search_path_spec="/usr/lib64 /lib64 /usr/local/lib64" + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec="/usr/lib64 /lib64 /usr/lib/x86_64-linux-gnu/libfakeroot /usr/local/lib /lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu " + +# Fix the shell variable $srcfile for the compiler. +fix_srcfile_path="" + +# Set to yes if exported symbols are required. +always_export_symbols=no + +# The commands to list exported symbols. +export_symbols_cmds="\$NM \$libobjs \$convenience | \$global_symbol_pipe | \$SED 's/.* //' | sort | uniq > \$export_symbols" + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds="" + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms="_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*" + +# Symbols that must always be exported. +include_expsyms="" + +# ### END LIBTOOL CONFIG + +# ltmain.sh - Provide generalized library-building support services. +# NOTE: Changing this file will not affect anything until you rerun configure. +# +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, +# 2007, 2008 Free Software Foundation, Inc. +# Originally by Gordon Matzigkeit , 1996 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +basename="s,^.*/,,g" + +# 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 $basename` +modename="$progname" + +# Global variables: +EXIT_SUCCESS=0 +EXIT_FAILURE=1 + +PROGRAM=ltmain.sh +PACKAGE=libtool +VERSION=1.5.26 +TIMESTAMP=" (1.1220.2.493 2008/02/01 16:58:18)" + +# Be Bourne compatible (taken from Autoconf:_AS_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 + +# Check that we have a working $echo. +if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift +elif test "X$1" = X--fallback-echo; then + # Avoid inline document here, it may be left over + : +elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then + # Yippee, $echo works! + : +else + # Restart under the correct shell, and then maybe $echo will work. + exec $SHELL "$progpath" --no-reexec ${1+"$@"} +fi + +if test "X$1" = X--fallback-echo; then + # used as fallback echo + shift + cat <&2 + $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit $EXIT_FAILURE +fi + +# Global variables. +mode=$default_mode +nonopt= +prev= +prevopt= +run= +show="$echo" +show_help= +execute_dlfiles= +duplicate_deps=no +preserve_args= +lo2o="s/\\.lo\$/.${objext}/" +o2lo="s/\\.${objext}\$/.lo/" +extracted_archives= +extracted_serial=0 + +##################################### +# Shell function definitions: +# This seems to be the best place for them + +# func_mktempdir [string] +# Make a temporary directory that won't clash with other running +# libtool processes, and avoids race conditions if possible. If +# given, STRING is the basename for that directory. +func_mktempdir () +{ + my_template="${TMPDIR-/tmp}/${1-$progname}" + + if test "$run" = ":"; then + # Return a directory name, but don't create it in dry-run mode + my_tmpdir="${my_template}-$$" + else + + # If mktemp works, use that first and foremost + my_tmpdir=`mktemp -d "${my_template}-XXXXXXXX" 2>/dev/null` + + if test ! -d "$my_tmpdir"; then + # Failing that, at least try and use $RANDOM to avoid a race + my_tmpdir="${my_template}-${RANDOM-0}$$" + + save_mktempdir_umask=`umask` + umask 0077 + $mkdir "$my_tmpdir" + umask $save_mktempdir_umask + fi + + # If we're not in dry-run mode, bomb out on failure + test -d "$my_tmpdir" || { + $echo "cannot create temporary directory \`$my_tmpdir'" 1>&2 + exit $EXIT_FAILURE + } + fi + + $echo "X$my_tmpdir" | $Xsed +} + + +# 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. +func_win32_libid () +{ + 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 + if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null | \ + $EGREP -e 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then + win32_nmres=`eval $NM -f posix -A $1 | \ + $SED -n -e '1,100{ + / I /{ + s,.*,import, + p + q + } + }'` + 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_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 () +{ + if test -n "$available_tags" && test -z "$tagname"; then + CC_quoted= + for arg in $CC; do + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + CC_quoted="$CC_quoted $arg" + done + 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 "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) ;; + # 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. + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + CC_quoted="$CC_quoted $arg" + done + case "$@ " in + " $CC "* | "$CC "* | " `$echo $CC` "* | "`$echo $CC` "* | " $CC_quoted"* | "$CC_quoted "* | " `$echo $CC_quoted` "* | "`$echo $CC_quoted` "*) + # 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 + $echo "$modename: unable to infer tagged configuration" + $echo "$modename: specify a tag with \`--tag'" 1>&2 + exit $EXIT_FAILURE +# else +# $echo "$modename: using $tagname tagged configuration" + fi + ;; + esac + fi +} + + +# func_extract_an_archive dir oldlib +func_extract_an_archive () +{ + f_ex_an_ar_dir="$1"; shift + f_ex_an_ar_oldlib="$1" + + $show "(cd $f_ex_an_ar_dir && $AR x $f_ex_an_ar_oldlib)" + $run eval "(cd \$f_ex_an_ar_dir && $AR x \$f_ex_an_ar_oldlib)" || exit $? + if ($AR t "$f_ex_an_ar_oldlib" | sort | sort -uc >/dev/null 2>&1); then + : + else + $echo "$modename: ERROR: object name conflicts: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib" 1>&2 + exit $EXIT_FAILURE + fi +} + +# func_extract_archives gentop oldlib ... +func_extract_archives () +{ + my_gentop="$1"; shift + my_oldlibs=${1+"$@"} + my_oldobjs="" + my_xlib="" + my_xabs="" + my_xdir="" + my_status="" + + $show "${rm}r $my_gentop" + $run ${rm}r "$my_gentop" + $show "$mkdir $my_gentop" + $run $mkdir "$my_gentop" + my_status=$? + if test "$my_status" -ne 0 && test ! -d "$my_gentop"; then + exit $my_status + fi + + 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 + my_xlib=`$echo "X$my_xlib" | $Xsed -e 's%^.*/%%'` + my_xlib_u=$my_xlib + while :; do + case " $extracted_archives " in + *" $my_xlib_u "*) + extracted_serial=`expr $extracted_serial + 1` + 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" + + $show "${rm}r $my_xdir" + $run ${rm}r "$my_xdir" + $show "$mkdir $my_xdir" + $run $mkdir "$my_xdir" + exit_status=$? + if test "$exit_status" -ne 0 && test ! -d "$my_xdir"; then + exit $exit_status + fi + case $host in + *-darwin*) + $show "Extracting $my_xabs" + # Do not bother doing anything if just a dry run + if test -z "$run"; then + darwin_orig_dir=`pwd` + cd $my_xdir || exit $? + darwin_archive=$my_xabs + darwin_curdir=`pwd` + darwin_base_archive=`$echo "X$darwin_archive" | $Xsed -e 's%^.*/%%'` + darwin_arches=`lipo -info "$darwin_archive" 2>/dev/null | $EGREP Architectures 2>/dev/null` + if test -n "$darwin_arches"; then + darwin_arches=`echo "$darwin_arches" | $SED -e 's/.*are://'` + darwin_arch= + $show "$darwin_base_archive has multiple architectures $darwin_arches" + for darwin_arch in $darwin_arches ; do + 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 have a bunch of thin objects, gotta fatten them up :) + darwin_filelist=`find unfat-$$ -type f -name \*.o -print -o -name \*.lo -print| xargs basename | sort -u | $NL2SP` + darwin_file= + darwin_files= + for darwin_file in $darwin_filelist; do + darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP` + lipo -create -output "$darwin_file" $darwin_files + done # $darwin_filelist + ${rm}r unfat-$$ + cd "$darwin_orig_dir" + else + cd "$darwin_orig_dir" + func_extract_an_archive "$my_xdir" "$my_xabs" + fi # $darwin_arches + fi # $run + ;; + *) + func_extract_an_archive "$my_xdir" "$my_xabs" + ;; + esac + my_oldobjs="$my_oldobjs "`find $my_xdir -name \*.$objext -print -o -name \*.lo -print | $NL2SP` + done + func_extract_archives_result="$my_oldobjs" +} +# End of Shell function definitions +##################################### + +# Darwin sucks +eval std_shrext=\"$shrext_cmds\" + +disable_libs=no + +# Parse our command line options once, thoroughly. +while test "$#" -gt 0 +do + arg="$1" + shift + + case $arg in + -*=*) optarg=`$echo "X$arg" | $Xsed -e 's/[-_a-zA-Z0-9]*=//'` ;; + *) optarg= ;; + esac + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + execute_dlfiles) + execute_dlfiles="$execute_dlfiles $arg" + ;; + tag) + tagname="$arg" + preserve_args="${preserve_args}=$arg" + + # Check whether tagname contains only valid characters + case $tagname in + *[!-_A-Za-z0-9,/]*) + $echo "$progname: invalid tag name: $tagname" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + case $tagname in + CC) + # Don't test for the "default" C tag, as we know, it's there, but + # not specially marked. + ;; + *) + if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "$progpath" > /dev/null; then + taglist="$taglist $tagname" + # Evaluate the configuration. + eval "`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$tagname'$/,/^# ### END LIBTOOL TAG CONFIG: '$tagname'$/p' < $progpath`" + else + $echo "$progname: ignoring unknown tag $tagname" 1>&2 + fi + ;; + esac + ;; + *) + eval "$prev=\$arg" + ;; + esac + + prev= + prevopt= + continue + fi + + # Have we seen a non-optional argument yet? + case $arg in + --help) + show_help=yes + ;; + + --version) + echo "\ +$PROGRAM (GNU $PACKAGE) $VERSION$TIMESTAMP + +Copyright (C) 2008 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." + exit $? + ;; + + --config) + ${SED} -e '1,/^# ### BEGIN LIBTOOL CONFIG/d' -e '/^# ### END LIBTOOL CONFIG/,$d' $progpath + # Now print the configurations for the tags. + for tagname in $taglist; do + ${SED} -n -e "/^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$/,/^# ### END LIBTOOL TAG CONFIG: $tagname$/p" < "$progpath" + done + exit $? + ;; + + --debug) + $echo "$progname: enabling shell trace mode" + set -x + preserve_args="$preserve_args $arg" + ;; + + --dry-run | -n) + run=: + ;; + + --features) + $echo "host: $host" + if test "$build_libtool_libs" = yes; then + $echo "enable shared libraries" + else + $echo "disable shared libraries" + fi + if test "$build_old_libs" = yes; then + $echo "enable static libraries" + else + $echo "disable static libraries" + fi + exit $? + ;; + + --finish) mode="finish" ;; + + --mode) prevopt="--mode" prev=mode ;; + --mode=*) mode="$optarg" ;; + + --preserve-dup-deps) duplicate_deps="yes" ;; + + --quiet | --silent) + show=: + preserve_args="$preserve_args $arg" + ;; + + --tag) + prevopt="--tag" + prev=tag + preserve_args="$preserve_args --tag" + ;; + --tag=*) + set tag "$optarg" ${1+"$@"} + shift + prev=tag + preserve_args="$preserve_args --tag" + ;; + + -dlopen) + prevopt="-dlopen" + prev=execute_dlfiles + ;; + + -*) + $echo "$modename: unrecognized option \`$arg'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + + *) + nonopt="$arg" + break + ;; + esac +done + +if test -n "$prevopt"; then + $echo "$modename: option \`$prevopt' requires an argument" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE +fi + +case $disable_libs in +no) + ;; +shared) + build_libtool_libs=no + build_old_libs=yes + ;; +static) + build_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac` + ;; +esac + +# 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= + +if test -z "$show_help"; then + + # Infer the operation mode. + if test -z "$mode"; then + $echo "*** Warning: inferring the mode of operation is deprecated." 1>&2 + $echo "*** Future versions of Libtool will require --mode=MODE be specified." 1>&2 + case $nonopt in + *cc | cc* | *++ | gcc* | *-gcc* | g++* | xlc*) + mode=link + for arg + do + case $arg in + -c) + mode=compile + break + ;; + esac + done + ;; + *db | *dbx | *strace | *truss) + mode=execute + ;; + *install*|cp|mv) + mode=install + ;; + *rm) + mode=uninstall + ;; + *) + # If we have no mode, but dlfiles were specified, then do execute mode. + test -n "$execute_dlfiles" && mode=execute + + # Just use the default operation mode. + if test -z "$mode"; then + if test -n "$nonopt"; then + $echo "$modename: warning: cannot infer operation mode from \`$nonopt'" 1>&2 + else + $echo "$modename: warning: cannot infer operation mode without MODE-ARGS" 1>&2 + fi + fi + ;; + esac + fi + + # Only execute mode is allowed to have -dlopen flags. + if test -n "$execute_dlfiles" && test "$mode" != execute; then + $echo "$modename: unrecognized option \`-dlopen'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Change the help message to a mode-specific one. + generic_help="$help" + help="Try \`$modename --help --mode=$mode' for more information." + + # These modes are in order of execution frequency so that they run quickly. + case $mode in + # libtool compile mode + compile) + modename="$modename: compile" + # Get the compilation command and the source file. + base_compile= + srcfile="$nonopt" # always keep a non-empty value in "srcfile" + suppress_opt=yes + suppress_output= + arg_mode=normal + libobj= + later= + + 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) + if test -n "$libobj" ; then + $echo "$modename: you cannot specify \`-o' more than once" 1>&2 + exit $EXIT_FAILURE + fi + arg_mode=target + continue + ;; + + -static | -prefer-pic | -prefer-non-pic) + later="$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,*) + args=`$echo "X$arg" | $Xsed -e "s/^-Wc,//"` + lastarg= + save_ifs="$IFS"; IFS=',' + for arg in $args; do + IFS="$save_ifs" + + # Double-quote args containing other shell metacharacters. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, so we specify it separately. + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + lastarg="$lastarg $arg" + done + IFS="$save_ifs" + lastarg=`$echo "X$lastarg" | $Xsed -e "s/^ //"` + + # Add the arguments to base_compile. + base_compile="$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. + lastarg=`$echo "X$lastarg" | $Xsed -e "$sed_quote_subst"` + + case $lastarg in + # Double-quote args containing other shell metacharacters. + # Many Bourne shells cannot handle close brackets correctly + # in scan sets, and some SunOS ksh mistreat backslash-escaping + # in scan sets (worked around with variable expansion), + # and furthermore cannot handle '|' '&' '(' ')' in scan sets + # at all, so we specify them separately. + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + lastarg="\"$lastarg\"" + ;; + esac + + base_compile="$base_compile $lastarg" + done # for arg + + case $arg_mode in + arg) + $echo "$modename: you must specify an argument for -Xcompile" + exit $EXIT_FAILURE + ;; + target) + $echo "$modename: you must specify a target with \`-o'" 1>&2 + exit $EXIT_FAILURE + ;; + *) + # Get the name of the library object. + [ -z "$libobj" ] && libobj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%'` + ;; + esac + + # Recognize several different file suffixes. + # If the user specifies -o file.o, it is replaced with file.lo + xform='[cCFSifmso]' + case $libobj in + *.ada) xform=ada ;; + *.adb) xform=adb ;; + *.ads) xform=ads ;; + *.asm) xform=asm ;; + *.c++) xform=c++ ;; + *.cc) xform=cc ;; + *.ii) xform=ii ;; + *.class) xform=class ;; + *.cpp) xform=cpp ;; + *.cxx) xform=cxx ;; + *.[fF][09]?) xform=[fF][09]. ;; + *.for) xform=for ;; + *.java) xform=java ;; + *.obj) xform=obj ;; + *.sx) xform=sx ;; + esac + + libobj=`$echo "X$libobj" | $Xsed -e "s/\.$xform$/.lo/"` + + case $libobj in + *.lo) obj=`$echo "X$libobj" | $Xsed -e "$lo2o"` ;; + *) + $echo "$modename: cannot determine name of library object from \`$libobj'" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + func_infer_tag $base_compile + + for arg in $later; do + case $arg in + -static) + build_old_libs=yes + continue + ;; + + -prefer-pic) + pic_mode=yes + continue + ;; + + -prefer-non-pic) + pic_mode=no + continue + ;; + esac + done + + qlibobj=`$echo "X$libobj" | $Xsed -e "$sed_quote_subst"` + case $qlibobj in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + qlibobj="\"$qlibobj\"" ;; + esac + test "X$libobj" != "X$qlibobj" \ + && $echo "X$libobj" | grep '[]~#^*{};<>?"'"'"' &()|`$[]' \ + && $echo "$modename: libobj name \`$libobj' may not contain shell special characters." + objname=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` + xdir=`$echo "X$obj" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$obj"; then + xdir= + else + xdir=$xdir/ + fi + lobj=${xdir}$objdir/$objname + + if test -z "$base_compile"; then + $echo "$modename: you must specify a compilation command" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Delete any leftover library objects. + if test "$build_old_libs" = yes; then + removelist="$obj $lobj $libobj ${libobj}T" + else + removelist="$lobj $libobj ${libobj}T" + fi + + $run $rm $removelist + trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 + + # On Cygwin there's no "real" PIC flag so we must build both object types + case $host_os in + cygwin* | mingw* | pw32* | os2*) + pic_mode=default + ;; + esac + if test "$pic_mode" = no && test "$deplibs_check_method" != pass_all; 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 "$compiler_c_o" = no; then + output_obj=`$echo "X$srcfile" | $Xsed -e 's%^.*/%%' -e 's%\.[^.]*$%%'`.${objext} + lockfile="$output_obj.lock" + removelist="$removelist $output_obj $lockfile" + trap "$run $rm $removelist; exit $EXIT_FAILURE" 1 2 15 + 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 "$need_locks" = yes; then + until $run ln "$progpath" "$lockfile" 2>/dev/null; do + $show "Waiting for $lockfile to be removed" + sleep 2 + done + elif test "$need_locks" = warn; then + if test -f "$lockfile"; then + $echo "\ +*** ERROR, $lockfile exists and contains: +`cat $lockfile 2>/dev/null` + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit $EXIT_FAILURE + fi + $echo "$srcfile" > "$lockfile" + fi + + if test -n "$fix_srcfile_path"; then + eval srcfile=\"$fix_srcfile_path\" + fi + qsrcfile=`$echo "X$srcfile" | $Xsed -e "$sed_quote_subst"` + case $qsrcfile in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + qsrcfile="\"$qsrcfile\"" ;; + esac + + $run $rm "$libobj" "${libobj}T" + + # Create a libtool object file (analogous to a ".la" file), + # but don't create it if we're doing a dry run. + test -z "$run" && cat > ${libobj}T </dev/null`" != "X$srcfile"; then + $echo "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit $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 + $show "$mv $output_obj $lobj" + if $run $mv $output_obj $lobj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + fi + + # Append the name of the PIC object to the libtool object file. + test -z "$run" && cat >> ${libobj}T <> ${libobj}T </dev/null`" != "X$srcfile"; then + $echo "\ +*** ERROR, $lockfile contains: +`cat $lockfile 2>/dev/null` + +but it should contain: +$srcfile + +This indicates that another process is trying to use the same +temporary object file, and libtool could not work around it because +your compiler does not support \`-c' and \`-o' together. If you +repeat this compilation, it may succeed, by chance, but you had better +avoid parallel builds (make -j) in this platform, or get a better +compiler." + + $run $rm $removelist + exit $EXIT_FAILURE + fi + + # Just move the object if needed + if test -n "$output_obj" && test "X$output_obj" != "X$obj"; then + $show "$mv $output_obj $obj" + if $run $mv $output_obj $obj; then : + else + error=$? + $run $rm $removelist + exit $error + fi + fi + + # Append the name of the non-PIC object the libtool object file. + # Only append if the libtool object file exists. + test -z "$run" && cat >> ${libobj}T <> ${libobj}T <&2 + 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 + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + qarg=\"`$echo "X$arg" | $Xsed -e "$sed_quote_subst"`\" ### testsuite: skip nested quoting test + ;; + *) qarg=$arg ;; + esac + libtool_args="$libtool_args $qarg" + + # If the previous option needs an argument, assign it. + if test -n "$prev"; then + case $prev in + output) + compile_command="$compile_command @OUTPUT@" + finalize_command="$finalize_command @OUTPUT@" + ;; + esac + + case $prev in + dlfiles|dlprefiles) + if test "$preload" = no; then + # Add the symbol object into the linking commands. + compile_command="$compile_command @SYMFILE@" + finalize_command="$finalize_command @SYMFILE@" + preload=yes + fi + case $arg in + *.la | *.lo) ;; # We handle these cases below. + force) + if test "$dlself" = no; then + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + self) + if test "$prev" = dlprefiles; then + dlself=yes + elif test "$prev" = dlfiles && test "$dlopen_self" != yes; then + dlself=yes + else + dlself=needless + export_dynamic=yes + fi + prev= + continue + ;; + *) + if test "$prev" = dlfiles; then + dlfiles="$dlfiles $arg" + else + dlprefiles="$dlprefiles $arg" + fi + prev= + continue + ;; + esac + ;; + expsyms) + export_symbols="$arg" + if test ! -f "$arg"; then + $echo "$modename: symbol file \`$arg' does not exist" + exit $EXIT_FAILURE + fi + prev= + continue + ;; + expsyms_regex) + export_symbols_regex="$arg" + prev= + continue + ;; + inst_prefix) + inst_prefix_dir="$arg" + prev= + continue + ;; + precious_regex) + precious_files_regex="$arg" + prev= + continue + ;; + release) + release="-$arg" + prev= + continue + ;; + objectlist) + if test -f "$arg"; then + save_arg=$arg + moreargs= + for fil in `cat $save_arg` + do +# moreargs="$moreargs $fil" + arg=$fil + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + pic_object= + non_pic_object= + + # Read the .lo file + # If there is no directory component, then add one. + case $arg in + */* | *\\*) . $arg ;; + *) . ./$arg ;; + esac + + if test -z "$pic_object" || \ + test -z "$non_pic_object" || + test "$pic_object" = none && \ + test "$non_pic_object" = none; then + $echo "$modename: cannot find name of object for \`$arg'" 1>&2 + exit $EXIT_FAILURE + fi + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles="$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 "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles $pic_object" + prev= + fi + + # A PIC object. + libobjs="$libobjs $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + non_pic_objects="$non_pic_objects $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; 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" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if test -z "$run"; then + $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 + exit $EXIT_FAILURE + else + # Dry-run case. + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` + non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` + libobjs="$libobjs $pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + fi + done + else + $echo "$modename: link input file \`$save_arg' does not exist" + exit $EXIT_FAILURE + fi + arg=$save_arg + prev= + continue + ;; + rpath | xrpath) + # We need an absolute path. + case $arg in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + $echo "$modename: only absolute run-paths are allowed" 1>&2 + exit $EXIT_FAILURE + ;; + esac + if test "$prev" = rpath; then + case "$rpath " in + *" $arg "*) ;; + *) rpath="$rpath $arg" ;; + esac + else + case "$xrpath " in + *" $arg "*) ;; + *) xrpath="$xrpath $arg" ;; + esac + fi + prev= + continue + ;; + xcompiler) + compiler_flags="$compiler_flags $qarg" + prev= + compile_command="$compile_command $qarg" + finalize_command="$finalize_command $qarg" + continue + ;; + xlinker) + linker_flags="$linker_flags $qarg" + compiler_flags="$compiler_flags $wl$qarg" + prev= + compile_command="$compile_command $wl$qarg" + finalize_command="$finalize_command $wl$qarg" + continue + ;; + xcclinker) + linker_flags="$linker_flags $qarg" + compiler_flags="$compiler_flags $qarg" + prev= + compile_command="$compile_command $qarg" + finalize_command="$finalize_command $qarg" + continue + ;; + shrext) + shrext_cmds="$arg" + prev= + continue + ;; + darwin_framework|darwin_framework_skip) + test "$prev" = "darwin_framework" && compiler_flags="$compiler_flags $arg" + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + prev= + 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 + compile_command="$compile_command $link_static_flag" + finalize_command="$finalize_command $link_static_flag" + fi + continue + ;; + + -allow-undefined) + # FIXME: remove this flag sometime in the future. + $echo "$modename: \`-allow-undefined' is deprecated because it is the default" 1>&2 + continue + ;; + + -avoid-version) + avoid_version=yes + continue + ;; + + -dlopen) + prev=dlfiles + continue + ;; + + -dlpreopen) + prev=dlprefiles + continue + ;; + + -export-dynamic) + export_dynamic=yes + continue + ;; + + -export-symbols | -export-symbols-regex) + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + $echo "$modename: more than one -exported-symbols argument is not allowed" + exit $EXIT_FAILURE + fi + if test "X$arg" = "X-export-symbols"; then + prev=expsyms + else + prev=expsyms_regex + fi + continue + ;; + + -framework|-arch|-isysroot) + case " $CC " in + *" ${arg} ${1} "* | *" ${arg} ${1} "*) + prev=darwin_framework_skip ;; + *) compiler_flags="$compiler_flags $arg" + prev=darwin_framework ;; + esac + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + 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*) + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + ;; + esac + continue + ;; + + -L*) + dir=`$echo "X$arg" | $Xsed -e 's/^-L//'` + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + $echo "$modename: cannot determine absolute directory name of \`$dir'" 1>&2 + absdir="$dir" + notinst_path="$notinst_path $dir" + fi + dir="$absdir" + ;; + esac + case "$deplibs " in + *" -L$dir "*) ;; + *) + deplibs="$deplibs -L$dir" + lib_search_path="$lib_search_path $dir" + ;; + esac + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) + testbindir=`$echo "X$dir" | $Xsed -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$dir:"*) ;; + *) dllsearchpath="$dllsearchpath:$dir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + *) dllsearchpath="$dllsearchpath:$testbindir";; + esac + ;; + esac + continue + ;; + + -l*) + if test "X$arg" = "X-lc" || test "X$arg" = "X-lm"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos*) + # 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$arg" = "X-lc" && continue + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc due to us having libc/libc_r. + test "X$arg" = "X-lc" && continue + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C and math libraries are in the System framework + deplibs="$deplibs -framework System" + continue + ;; + *-*-sco3.2v5* | *-*-sco5v6*) + # Causes problems with __ctype + test "X$arg" = "X-lc" && continue + ;; + *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) + # Compiler inserts libc in the correct place for threads to work + test "X$arg" = "X-lc" && continue + ;; + esac + elif test "X$arg" = "X-lc_r"; then + case $host in + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # Do not include libc_r directly, use -pthread flag. + continue + ;; + esac + fi + deplibs="$deplibs $arg" + continue + ;; + + # Tru64 UNIX uses -model [arg] to determine the layout of C++ + # classes, name mangling, and exception handling. + -model) + compile_command="$compile_command $arg" + compiler_flags="$compiler_flags $arg" + finalize_command="$finalize_command $arg" + prev=xcompiler + continue + ;; + + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) + compiler_flags="$compiler_flags $arg" + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + continue + ;; + + -multi_module) + single_module="${wl}-multi_module" + continue + ;; + + -module) + module=yes + continue + ;; + + # -64, -mips[0-9] enable 64-bit mode on the SGI compiler + # -r[0-9][0-9]* specifies the processor on the SGI compiler + # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler + # +DA*, +DD* enable 64-bit mode on the HP compiler + # -q* pass through compiler args for the IBM compiler + # -m* pass through architecture-specific compiler args for GCC + # -m*, -t[45]*, -txscale* pass through architecture-specific + # compiler args for GCC + # -p, -pg, --coverage, -fprofile-* pass through profiling flag for GCC + # -F/path gives path to uninstalled frameworks, gcc on darwin + # @file GCC response files + -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \ + -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*) + + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + compiler_flags="$compiler_flags $arg" + continue + ;; + + -shrext) + prev=shrext + continue + ;; + + -no-fast-install) + fast_install=no + continue + ;; + + -no-install) + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin*) + # The PATH hackery in wrapper scripts is required on Windows + # and Darwin in order for the loader to find any dlls it needs. + $echo "$modename: warning: \`-no-install' is ignored for $host" 1>&2 + $echo "$modename: warning: assuming \`-no-fast-install' instead" 1>&2 + fast_install=no + ;; + *) no_install=yes ;; + esac + continue + ;; + + -no-undefined) + allow_undefined=no + continue + ;; + + -objectlist) + prev=objectlist + continue + ;; + + -o) prev=output ;; + + -precious-files-regex) + prev=precious_regex + continue + ;; + + -release) + prev=release + continue + ;; + + -rpath) + prev=rpath + continue + ;; + + -R) + prev=xrpath + continue + ;; + + -R*) + dir=`$echo "X$arg" | $Xsed -e 's/^-R//'` + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + $echo "$modename: only absolute run-paths are allowed" 1>&2 + exit $EXIT_FAILURE + ;; + esac + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$xrpath $dir" ;; + esac + 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 + ;; + + -Wc,*) + args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wc,//'` + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + case $flag in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + flag="\"$flag\"" + ;; + esac + arg="$arg $wl$flag" + compiler_flags="$compiler_flags $flag" + done + IFS="$save_ifs" + arg=`$echo "X$arg" | $Xsed -e "s/^ //"` + ;; + + -Wl,*) + args=`$echo "X$arg" | $Xsed -e "$sed_quote_subst" -e 's/^-Wl,//'` + arg= + save_ifs="$IFS"; IFS=',' + for flag in $args; do + IFS="$save_ifs" + case $flag in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + flag="\"$flag\"" + ;; + esac + arg="$arg $wl$flag" + compiler_flags="$compiler_flags $wl$flag" + linker_flags="$linker_flags $flag" + done + IFS="$save_ifs" + arg=`$echo "X$arg" | $Xsed -e "s/^ //"` + ;; + + -Xcompiler) + prev=xcompiler + continue + ;; + + -Xlinker) + prev=xlinker + continue + ;; + + -XCClinker) + prev=xcclinker + continue + ;; + + # Some other compiler flag. + -* | +*) + # Unknown arguments in both finalize_command and compile_command need + # to be aesthetically quoted because they are evaled later. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + ;; + + *.$objext) + # A standard object. + objs="$objs $arg" + ;; + + *.lo) + # A libtool-controlled object. + + # Check to see that this really is a libtool object. + if (${SED} -e '2q' $arg | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + pic_object= + non_pic_object= + + # Read the .lo file + # If there is no directory component, then add one. + case $arg in + */* | *\\*) . $arg ;; + *) . ./$arg ;; + esac + + if test -z "$pic_object" || \ + test -z "$non_pic_object" || + test "$pic_object" = none && \ + test "$non_pic_object" = none; then + $echo "$modename: cannot find name of object for \`$arg'" 1>&2 + exit $EXIT_FAILURE + fi + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + if test "$pic_object" != none; then + # Prepend the subdirectory the object is found in. + pic_object="$xdir$pic_object" + + if test "$prev" = dlfiles; then + if test "$build_libtool_libs" = yes && test "$dlopen_support" = yes; then + dlfiles="$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 "$prev" = dlprefiles; then + # Preload the old-style object. + dlprefiles="$dlprefiles $pic_object" + prev= + fi + + # A PIC object. + libobjs="$libobjs $pic_object" + arg="$pic_object" + fi + + # Non-PIC object. + if test "$non_pic_object" != none; then + # Prepend the subdirectory the object is found in. + non_pic_object="$xdir$non_pic_object" + + # A standard non-PIC object + non_pic_objects="$non_pic_objects $non_pic_object" + if test -z "$pic_object" || test "$pic_object" = none ; 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" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + else + # Only an error if not doing a dry-run. + if test -z "$run"; then + $echo "$modename: \`$arg' is not a valid libtool object" 1>&2 + exit $EXIT_FAILURE + else + # Dry-run case. + + # Extract subdirectory from the argument. + xdir=`$echo "X$arg" | $Xsed -e 's%/[^/]*$%%'` + if test "X$xdir" = "X$arg"; then + xdir= + else + xdir="$xdir/" + fi + + pic_object=`$echo "X${xdir}${objdir}/${arg}" | $Xsed -e "$lo2o"` + non_pic_object=`$echo "X${xdir}${arg}" | $Xsed -e "$lo2o"` + libobjs="$libobjs $pic_object" + non_pic_objects="$non_pic_objects $non_pic_object" + fi + fi + ;; + + *.$libext) + # An archive. + deplibs="$deplibs $arg" + old_deplibs="$old_deplibs $arg" + continue + ;; + + *.la) + # A libtool-controlled library. + + if test "$prev" = dlfiles; then + # This library was specified with -dlopen. + dlfiles="$dlfiles $arg" + prev= + elif test "$prev" = dlprefiles; then + # The library was specified with -dlpreopen. + dlprefiles="$dlprefiles $arg" + prev= + else + deplibs="$deplibs $arg" + 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. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + ;; + esac # arg + + # Now actually substitute the argument into the commands. + if test -n "$arg"; then + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + fi + done # argument parsing loop + + if test -n "$prev"; then + $echo "$modename: the \`$prevarg' option requires an argument" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + if test "$export_dynamic" = yes && test -n "$export_dynamic_flag_spec"; then + eval arg=\"$export_dynamic_flag_spec\" + compile_command="$compile_command $arg" + finalize_command="$finalize_command $arg" + fi + + oldlibs= + # calculate the name of the file, without its directory + outputname=`$echo "X$output" | $Xsed -e 's%^.*/%%'` + libobjs_save="$libobjs" + + if test -n "$shlibpath_var"; then + # get the directories listed in $shlibpath_var + eval shlib_search_path=\`\$echo \"X\${$shlibpath_var}\" \| \$Xsed -e \'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\" + + output_objdir=`$echo "X$output" | $Xsed -e 's%/[^/]*$%%'` + if test "X$output_objdir" = "X$output"; then + output_objdir="$objdir" + else + output_objdir="$output_objdir/$objdir" + fi + # Create the object directory. + if test ! -d "$output_objdir"; then + $show "$mkdir $output_objdir" + $run $mkdir $output_objdir + exit_status=$? + if test "$exit_status" -ne 0 && test ! -d "$output_objdir"; then + exit $exit_status + fi + fi + + # Determine the type of output + case $output in + "") + $echo "$modename: you must specify an output file" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + *.$libext) linkmode=oldlib ;; + *.lo | *.$objext) linkmode=obj ;; + *.la) linkmode=lib ;; + *) linkmode=prog ;; # Anything else should be a program. + esac + + case $host in + *cygwin* | *mingw* | *pw32*) + # don't eliminate duplications in $postdeps and $predeps + duplicate_compiler_generated_deps=yes + ;; + *) + duplicate_compiler_generated_deps=$duplicate_deps + ;; + 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 test "X$duplicate_deps" = "Xyes" ; then + case "$libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + libs="$libs $deplib" + done + + if test "$linkmode" = lib; 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 test "X$duplicate_compiler_generated_deps" = "Xyes" ; then + for pre_post_dep in $predeps $postdeps; do + case "$pre_post_deps " in + *" $pre_post_dep "*) specialdeplibs="$specialdeplibs $pre_post_deps" ;; + esac + pre_post_deps="$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 + case $linkmode in + lib) + passes="conv link" + for file in $dlfiles $dlprefiles; do + case $file in + *.la) ;; + *) + $echo "$modename: libraries can \`-dlopen' only libtool libraries: $file" 1>&2 + exit $EXIT_FAILURE + ;; + esac + done + ;; + prog) + compile_deplibs= + finalize_deplibs= + alldeplibs=no + newdlfiles= + newdlprefiles= + passes="conv scan dlopen dlpreopen link" + ;; + *) passes="conv" + ;; + esac + for pass in $passes; do + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan"; then + libs="$deplibs" + deplibs= + fi + if test "$linkmode" = prog; then + case $pass in + dlopen) libs="$dlfiles" ;; + dlpreopen) libs="$dlprefiles" ;; + link) libs="$deplibs %DEPLIBS% $dependency_libs" ;; + esac + fi + if test "$pass" = dlopen; then + # Collect dlpreopened libraries + save_deplibs="$deplibs" + deplibs= + fi + for deplib in $libs; do + lib= + found=no + case $deplib in + -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads) + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + compiler_flags="$compiler_flags $deplib" + fi + continue + ;; + -l*) + if test "$linkmode" != lib && test "$linkmode" != prog; then + $echo "$modename: warning: \`-l' is ignored for archives/objects" 1>&2 + continue + fi + name=`$echo "X$deplib" | $Xsed -e 's/^-l//'` + if test "$linkmode" = lib; 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 "$search_ext" = ".la"; then + found=yes + else + found=no + fi + break 2 + fi + done + done + if test "$found" != yes; then + # deplib doesn't seem to be a libtool library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + else # 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 "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $deplib "*) + if (${SED} -e '2q' $lib | + grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + library_names= + old_library= + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + for l in $old_library $library_names; do + ll="$l" + done + if test "X$ll" = "X$old_library" ; then # only static version available + found=no + ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` + test "X$ladir" = "X$lib" && ladir="." + lib=$ladir/$old_library + if test "$linkmode,$pass" = "prog,link"; then + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + deplibs="$deplib $deplibs" + test "$linkmode" = lib && newdependency_libs="$deplib $newdependency_libs" + fi + continue + fi + fi + ;; + *) ;; + esac + fi + fi + ;; # -l + -L*) + case $linkmode in + lib) + deplibs="$deplib $deplibs" + test "$pass" = conv && continue + newdependency_libs="$deplib $newdependency_libs" + newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` + ;; + prog) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + if test "$pass" = scan; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'` + ;; + *) + $echo "$modename: warning: \`-L' is ignored for archives/objects" 1>&2 + ;; + esac # linkmode + continue + ;; # -L + -R*) + if test "$pass" = link; then + dir=`$echo "X$deplib" | $Xsed -e 's/^-R//'` + # Make sure the xrpath contains only unique directories. + case "$xrpath " in + *" $dir "*) ;; + *) xrpath="$xrpath $dir" ;; + esac + fi + deplibs="$deplib $deplibs" + continue + ;; + *.la) lib="$deplib" ;; + *.$libext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + continue + fi + case $linkmode in + lib) + valid_a_lib=no + case $deplibs_check_method in + match_pattern*) + set dummy $deplibs_check_method + match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` + if eval $echo \"$deplib\" 2>/dev/null \ + | $SED 10q \ + | $EGREP "$match_pattern_regex" > /dev/null; then + valid_a_lib=yes + fi + ;; + pass_all) + valid_a_lib=yes + ;; + esac + if test "$valid_a_lib" != yes; then + $echo + $echo "*** Warning: Trying to link with static lib archive $deplib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because the file extensions .$libext of this argument makes me believe" + $echo "*** that it is just a static archive that I should not used here." + else + $echo + $echo "*** Warning: Linking the shared library $output against the" + $echo "*** static library $deplib is not portable!" + deplibs="$deplib $deplibs" + fi + continue + ;; + prog) + if test "$pass" != link; then + deplibs="$deplib $deplibs" + else + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + fi + continue + ;; + esac # linkmode + ;; # *.$libext + *.lo | *.$objext) + if test "$pass" = conv; then + deplibs="$deplib $deplibs" + elif test "$linkmode" = prog; then + if test "$pass" = dlpreopen || test "$dlopen_support" != yes || test "$build_libtool_libs" = no; then + # If there is no dlopen support or we're linking statically, + # we need to preload. + newdlprefiles="$newdlprefiles $deplib" + compile_deplibs="$deplib $compile_deplibs" + finalize_deplibs="$deplib $finalize_deplibs" + else + newdlfiles="$newdlfiles $deplib" + fi + fi + continue + ;; + %DEPLIBS%) + alldeplibs=yes + continue + ;; + esac # case $deplib + if test "$found" = yes || test -f "$lib"; then : + else + $echo "$modename: cannot find the library \`$lib' or unhandled argument \`$deplib'" 1>&2 + exit $EXIT_FAILURE + fi + + # Check to see that this really is a libtool archive. + if (${SED} -e '2q' $lib | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + + ladir=`$echo "X$lib" | $Xsed -e 's%/[^/]*$%%'` + test "X$ladir" = "X$lib" && ladir="." + + dlname= + dlopen= + dlpreopen= + libdir= + library_names= + old_library= + # 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 + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + + if test "$linkmode,$pass" = "lib,link" || + test "$linkmode,$pass" = "prog,scan" || + { test "$linkmode" != prog && test "$linkmode" != lib; }; then + test -n "$dlopen" && dlfiles="$dlfiles $dlopen" + test -n "$dlpreopen" && dlprefiles="$dlprefiles $dlpreopen" + fi + + if test "$pass" = conv; then + # Only check for convenience libraries + deplibs="$lib $deplibs" + if test -z "$libdir"; then + if test -z "$old_library"; then + $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + # It is a libtool convenience library, so add in its objects. + convenience="$convenience $ladir/$objdir/$old_library" + old_convenience="$old_convenience $ladir/$objdir/$old_library" + tmp_libs= + for deplib in $dependency_libs; do + deplibs="$deplib $deplibs" + if test "X$duplicate_deps" = "Xyes" ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done + elif test "$linkmode" != prog && test "$linkmode" != lib; then + $echo "$modename: \`$lib' is not a convenience library" 1>&2 + exit $EXIT_FAILURE + fi + continue + fi # $pass = conv + + + # Get the name of the library we link against. + linklib= + for l in $old_library $library_names; do + linklib="$l" + done + if test -z "$linklib"; then + $echo "$modename: cannot find name of link library for \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + + # This library was specified with -dlopen. + if test "$pass" = dlopen; then + if test -z "$libdir"; then + $echo "$modename: cannot -dlopen a convenience library: \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + if test -z "$dlname" || + test "$dlopen_support" != yes || + test "$build_libtool_libs" = no; 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. + dlprefiles="$dlprefiles $lib $dependency_libs" + else + newdlfiles="$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 + $echo "$modename: warning: cannot determine absolute directory name of \`$ladir'" 1>&2 + $echo "$modename: passing it literally to the linker, although it might fail" 1>&2 + abs_ladir="$ladir" + fi + ;; + esac + laname=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` + + # Find the relevant object directory and library name. + if test "X$installed" = Xyes; then + if test ! -f "$libdir/$linklib" && test -f "$abs_ladir/$linklib"; then + $echo "$modename: warning: library \`$lib' was moved." 1>&2 + dir="$ladir" + absdir="$abs_ladir" + libdir="$abs_ladir" + else + dir="$libdir" + absdir="$libdir" + fi + test "X$hardcode_automatic" = Xyes && 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 + notinst_path="$notinst_path $abs_ladir" + else + dir="$ladir/$objdir" + absdir="$abs_ladir/$objdir" + # Remove this search path later + notinst_path="$notinst_path $abs_ladir" + fi + fi # $installed = yes + name=`$echo "X$laname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` + + # This library was specified with -dlpreopen. + if test "$pass" = dlpreopen; then + if test -z "$libdir"; then + $echo "$modename: cannot -dlpreopen a convenience library: \`$lib'" 1>&2 + exit $EXIT_FAILURE + fi + # Prefer using a static library (so that no silly _DYNAMIC symbols + # are required to link). + if test -n "$old_library"; then + newdlprefiles="$newdlprefiles $dir/$old_library" + # Otherwise, use the dlname, so that lt_dlopen finds it. + elif test -n "$dlname"; then + newdlprefiles="$newdlprefiles $dir/$dlname" + else + newdlprefiles="$newdlprefiles $dir/$linklib" + fi + fi # $pass = dlpreopen + + if test -z "$libdir"; then + # Link the convenience library + if test "$linkmode" = lib; then + deplibs="$dir/$old_library $deplibs" + elif test "$linkmode,$pass" = "prog,link"; 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 "$linkmode" = prog && test "$pass" != link; then + newlib_search_path="$newlib_search_path $ladir" + deplibs="$lib $deplibs" + + linkalldeplibs=no + if test "$link_all_deplibs" != no || test -z "$library_names" || + test "$build_libtool_libs" = no; then + linkalldeplibs=yes + fi + + tmp_libs= + for deplib in $dependency_libs; do + case $deplib in + -L*) newlib_search_path="$newlib_search_path "`$echo "X$deplib" | $Xsed -e 's/^-L//'`;; ### testsuite: skip nested quoting test + esac + # Need to link against all dependency_libs? + if test "$linkalldeplibs" = yes; then + deplibs="$deplib $deplibs" + else + # Need to hardcode shared library paths + # or/and link against static libraries + newdependency_libs="$deplib $newdependency_libs" + fi + if test "X$duplicate_deps" = "Xyes" ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done # for deplib + continue + fi # $linkmode = prog... + + if test "$linkmode,$pass" = "prog,link"; then + if test -n "$library_names" && + { { test "$prefer_static_libs" = no || + test "$prefer_static_libs,$installed" = "built,yes"; } || + 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 + *" $dir "*) ;; + *" $absdir "*) ;; + *) temp_rpath="$temp_rpath $absdir" ;; + 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 "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + fi # $linkmode,$pass = prog,link... + + if test "$alldeplibs" = yes && + { test "$deplibs_check_method" = pass_all || + { test "$build_libtool_libs" = yes && + 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 "$use_static_libs" = built && test "$installed" = yes ; then + use_static_libs=no + fi + if test -n "$library_names" && + { test "$use_static_libs" = no || test -z "$old_library"; }; then + if test "$installed" = no; then + notinst_deplibs="$notinst_deplibs $lib" + need_relink=yes + fi + # This is a shared library + + # Warn about portability, can't link against -module's on + # some systems (darwin) + if test "$shouldnotlink" = yes && test "$pass" = link ; then + $echo + if test "$linkmode" = prog; then + $echo "*** Warning: Linking the executable $output against the loadable module" + else + $echo "*** Warning: Linking the shared library $output against the loadable module" + fi + $echo "*** $linklib is not portable!" + fi + if test "$linkmode" = lib && + test "$hardcode_into_libs" = yes; 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 "*) ;; + *) compile_rpath="$compile_rpath $absdir" + esac + ;; + esac + case " $sys_lib_dlsearch_path " in + *" $libdir "*) ;; + *) + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" + esac + ;; + esac + fi + + if test -n "$old_archive_from_expsyms_cmds"; then + # figure out the soname + set dummy $library_names + realname="$2" + shift; 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 in + *cygwin* | mingw*) + major=`expr $current - $age` + versuffix="-$major" + ;; + esac + eval soname=\"$soname_spec\" + else + soname="$realname" + fi + + # Make a new name for the extract_expsyms_cmds to use + soroot="$soname" + soname=`$echo $soroot | ${SED} -e 's/^.*\///'` + newlib="libimp-`$echo $soname | ${SED} 's/^lib//;s/\.dll$//'`.a" + + # If the library has no export list, then create one now + if test -f "$output_objdir/$soname-def"; then : + else + $show "extracting exported symbol list from \`$soname'" + save_ifs="$IFS"; IFS='~' + cmds=$extract_expsyms_cmds + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + + # Create $newlib + if test -f "$output_objdir/$newlib"; then :; else + $show "generating import library for \`$soname'" + save_ifs="$IFS"; IFS='~' + cmds=$old_archive_from_expsyms_cmds + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + 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 "$linkmode" = prog || test "$mode" != relink; then + add_shlibpath= + add_dir= + add= + lib_linked=yes + case $hardcode_action in + immediate | unsupported) + if test "$hardcode_direct" = no; 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 module then we can not link against + # it, someone is ignoring the new warnings I added + if /usr/bin/file -L $add 2> /dev/null | + $EGREP ": [^:]* bundle" >/dev/null ; then + $echo "** Warning, lib $linklib is a module, not a shared library" + if test -z "$old_library" ; then + $echo + $echo "** And there doesn't seem to be a static archive available" + $echo "** The link will probably fail, sorry" + else + add="$dir/$old_library" + fi + fi + esac + elif test "$hardcode_minus_L" = no; then + case $host in + *-*-sunos*) add_shlibpath="$dir" ;; + esac + add_dir="-L$dir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = no; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + relink) + if test "$hardcode_direct" = yes; then + add="$dir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$dir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + add_dir="$add_dir -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + add_shlibpath="$dir" + add="-l$name" + else + lib_linked=no + fi + ;; + *) lib_linked=no ;; + esac + + if test "$lib_linked" != yes; then + $echo "$modename: configuration error: unsupported hardcode properties" + exit $EXIT_FAILURE + fi + + if test -n "$add_shlibpath"; then + case :$compile_shlibpath: in + *":$add_shlibpath:"*) ;; + *) compile_shlibpath="$compile_shlibpath$add_shlibpath:" ;; + esac + fi + if test "$linkmode" = prog; 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 "$hardcode_direct" != yes && \ + test "$hardcode_minus_L" != yes && \ + test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; + esac + fi + fi + fi + + if test "$linkmode" = prog || test "$mode" = relink; then + add_shlibpath= + add_dir= + add= + # Finalize command for both is simple: just hardcode it. + if test "$hardcode_direct" = yes; then + add="$libdir/$linklib" + elif test "$hardcode_minus_L" = yes; then + add_dir="-L$libdir" + add="-l$name" + elif test "$hardcode_shlibpath_var" = yes; then + case :$finalize_shlibpath: in + *":$libdir:"*) ;; + *) finalize_shlibpath="$finalize_shlibpath$libdir:" ;; + esac + add="-l$name" + elif test "$hardcode_automatic" = yes; 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$libdir" + # Try looking first in the location we're being installed to. + if test -n "$inst_prefix_dir"; then + case $libdir in + [\\/]*) + add_dir="$add_dir -L$inst_prefix_dir$libdir" + ;; + esac + fi + add="-l$name" + fi + + if test "$linkmode" = prog; 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 "$linkmode" = prog; 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 "$hardcode_direct" != unsupported; 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 "$build_libtool_libs" = yes; then + # Not a shared library + if test "$deplibs_check_method" != pass_all; 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. + $echo + $echo "*** Warning: This system can not link to static lib archive $lib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have." + if test "$module" = yes; then + $echo "*** But as you try to build a module library, libtool will still create " + $echo "*** a static module, that should work as long as the dlopening application" + $echo "*** is linked with the -dlopen flag to resolve symbols at runtime." + if test -z "$global_symbol_pipe"; then + $echo + $echo "*** However, this would only work if libtool was able to extract symbol" + $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + $echo "*** not find such a program. So, this module is probably useless." + $echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + 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 "$linkmode" = lib; then + if test -n "$dependency_libs" && + { test "$hardcode_into_libs" != yes || + test "$build_old_libs" = yes || + test "$link_static" = yes; }; then + # Extract -R from dependency_libs + temp_deplibs= + for libdir in $dependency_libs; do + case $libdir in + -R*) temp_xrpath=`$echo "X$libdir" | $Xsed -e 's/^-R//'` + case " $xrpath " in + *" $temp_xrpath "*) ;; + *) xrpath="$xrpath $temp_xrpath";; + esac;; + *) temp_deplibs="$temp_deplibs $libdir";; + esac + done + dependency_libs="$temp_deplibs" + fi + + newlib_search_path="$newlib_search_path $absdir" + # Link against this library + test "$link_static" = no && newdependency_libs="$abs_ladir/$laname $newdependency_libs" + # ... and its dependency_libs + tmp_libs= + for deplib in $dependency_libs; do + newdependency_libs="$deplib $newdependency_libs" + if test "X$duplicate_deps" = "Xyes" ; then + case "$tmp_libs " in + *" $deplib "*) specialdeplibs="$specialdeplibs $deplib" ;; + esac + fi + tmp_libs="$tmp_libs $deplib" + done + + if test "$link_all_deplibs" != no; then + # Add the search paths of all dependency libraries + for deplib in $dependency_libs; do + case $deplib in + -L*) path="$deplib" ;; + *.la) + dir=`$echo "X$deplib" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$deplib" && dir="." + # We need an absolute path. + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) absdir="$dir" ;; + *) + absdir=`cd "$dir" && pwd` + if test -z "$absdir"; then + $echo "$modename: warning: cannot determine absolute directory name of \`$dir'" 1>&2 + absdir="$dir" + fi + ;; + esac + if grep "^installed=no" $deplib > /dev/null; then + path="$absdir/$objdir" + else + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + if test -z "$libdir"; then + $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + if test "$absdir" != "$libdir"; then + $echo "$modename: warning: \`$deplib' seems to be moved" 1>&2 + fi + path="$absdir" + fi + depdepl= + case $host in + *-*-darwin*) + # we do not want to link against static libs, + # but need to link against shared + eval deplibrary_names=`${SED} -n -e 's/^library_names=\(.*\)$/\1/p' $deplib` + eval deplibdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + if test -n "$deplibrary_names" ; then + for tmp in $deplibrary_names ; do + depdepl=$tmp + done + if test -f "$deplibdir/$depdepl" ; then + depdepl="$deplibdir/$depdepl" + elif test -f "$path/$depdepl" ; then + depdepl="$path/$depdepl" + else + # Can't find it, oh well... + depdepl= + fi + # do not add paths which are already there + case " $newlib_search_path " in + *" $path "*) ;; + *) newlib_search_path="$newlib_search_path $path";; + esac + fi + path="" + ;; + *) + path="-L$path" + ;; + esac + ;; + -l*) + case $host in + *-*-darwin*) + # Again, we only want to link against shared libraries + eval tmp_libs=`$echo "X$deplib" | $Xsed -e "s,^\-l,,"` + for tmp in $newlib_search_path ; do + if test -f "$tmp/lib$tmp_libs.dylib" ; then + eval depdepl="$tmp/lib$tmp_libs.dylib" + break + fi + done + path="" + ;; + *) continue ;; + esac + ;; + *) continue ;; + esac + case " $deplibs " in + *" $path "*) ;; + *) deplibs="$path $deplibs" ;; + esac + case " $deplibs " in + *" $depdepl "*) ;; + *) deplibs="$depdepl $deplibs" ;; + esac + done + fi # link_all_deplibs != no + fi # linkmode = lib + done # for deplib in $libs + dependency_libs="$newdependency_libs" + if test "$pass" = dlpreopen; then + # Link the dlpreopened libraries before other libraries + for deplib in $save_deplibs; do + deplibs="$deplib $deplibs" + done + fi + if test "$pass" != dlopen; then + if test "$pass" != conv; then + # 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 "*) ;; + *) lib_search_path="$lib_search_path $dir" ;; + esac + done + newlib_search_path= + fi + + if test "$linkmode,$pass" != "prog,link"; then + vars="deplibs" + else + vars="compile_deplibs finalize_deplibs" + fi + for var in $vars dependency_libs; do + # Add libraries to $var in reverse order + eval tmp_libs=\"\$$var\" + new_libs= + for deplib in $tmp_libs; do + # FIXME: Pedantically, this is the right thing to do, so + # that some nasty dependency loop isn't accidentally + # broken: + #new_libs="$deplib $new_libs" + # 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. + case " $specialdeplibs " in + *" $deplib "*) new_libs="$deplib $new_libs" ;; + *) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$deplib $new_libs" ;; + esac + ;; + esac + ;; + esac + done + tmp_libs= + for deplib in $new_libs; do + case $deplib in + -L*) + case " $tmp_libs " in + *" $deplib "*) ;; + *) tmp_libs="$tmp_libs $deplib" ;; + esac + ;; + *) tmp_libs="$tmp_libs $deplib" ;; + esac + done + eval $var=\"$tmp_libs\" + done # for var + fi + # 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 + tmp_libs="$tmp_libs $i" + fi + done + dependency_libs=$tmp_libs + done # for pass + if test "$linkmode" = prog; then + dlfiles="$newdlfiles" + dlprefiles="$newdlprefiles" + fi + + case $linkmode in + oldlib) + case " $deplibs" in + *\ -l* | *\ -L*) + $echo "$modename: warning: \`-l' and \`-L' are ignored for archives" 1>&2 ;; + esac + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' is ignored for archives" 1>&2 + fi + + if test -n "$rpath"; then + $echo "$modename: warning: \`-rpath' is ignored for archives" 1>&2 + fi + + if test -n "$xrpath"; then + $echo "$modename: warning: \`-R' is ignored for archives" 1>&2 + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info/-version-number' is ignored for archives" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for archives" 1>&2 + fi + + if test -n "$export_symbols" || test -n "$export_symbols_regex"; then + $echo "$modename: warning: \`-export-symbols' is ignored for archives" 1>&2 + fi + + # Now set the variables for building old libraries. + build_libtool_libs=no + oldlibs="$output" + objs="$objs$old_deplibs" + ;; + + lib) + # Make sure we only generate libraries of the form `libNAME.la'. + case $outputname in + lib*) + name=`$echo "X$outputname" | $Xsed -e 's/\.la$//' -e 's/^lib//'` + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + ;; + *) + if test "$module" = no; then + $echo "$modename: libtool library \`$output' must begin with \`lib'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + if test "$need_lib_prefix" != no; then + # Add the "lib" prefix for modules if required + name=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` + eval shared_ext=\"$shrext_cmds\" + eval libname=\"$libname_spec\" + else + libname=`$echo "X$outputname" | $Xsed -e 's/\.la$//'` + fi + ;; + esac + + if test -n "$objs"; then + if test "$deplibs_check_method" != pass_all; then + $echo "$modename: cannot build libtool library \`$output' from non-libtool objects on this host:$objs" 2>&1 + exit $EXIT_FAILURE + else + $echo + $echo "*** Warning: Linking the shared library $output against the non-libtool" + $echo "*** objects $objs is not portable!" + libobjs="$libobjs $objs" + fi + fi + + if test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen self' is ignored for libtool libraries" 1>&2 + fi + + set dummy $rpath + if test "$#" -gt 2; then + $echo "$modename: warning: ignoring multiple \`-rpath's for a libtool library" 1>&2 + fi + install_libdir="$2" + + oldlibs= + if test -z "$rpath"; then + if test "$build_libtool_libs" = yes; then + # Building a libtool convenience library. + # 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 + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info/-version-number' is ignored for convenience libraries" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for convenience libraries" 1>&2 + fi + else + + # Parse the version information argument. + save_ifs="$IFS"; IFS=':' + set dummy $vinfo 0 0 0 + IFS="$save_ifs" + + if test -n "$8"; then + $echo "$modename: too many parameters to \`-version-info'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # 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="$2" + number_minor="$3" + number_revision="$4" + # + # 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 + # which has an extra 1 added just for fun + # + case $version_type in + darwin|linux|osf|windows|none) + current=`expr $number_major + $number_minor` + age="$number_minor" + revision="$number_revision" + ;; + freebsd-aout|freebsd-elf|sunos) + current="$number_major" + revision="$number_minor" + age="0" + ;; + irix|nonstopux) + current=`expr $number_major + $number_minor` + age="$number_minor" + revision="$number_minor" + lt_irix_increment=no + ;; + esac + ;; + no) + current="$2" + revision="$3" + age="$4" + ;; + 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]) ;; + *) + $echo "$modename: CURRENT \`$current' must be a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + ;; + 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]) ;; + *) + $echo "$modename: REVISION \`$revision' must be a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + ;; + 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]) ;; + *) + $echo "$modename: AGE \`$age' must be a nonnegative integer" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + if test "$age" -gt "$current"; then + $echo "$modename: AGE \`$age' is greater than the current interface number \`$current'" 1>&2 + $echo "$modename: \`$vinfo' is not valid version information" 1>&2 + exit $EXIT_FAILURE + 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 + major=.`expr $current - $age` + versuffix="$major.$age.$revision" + # Darwin ld doesn't like 0 for these options... + minor_current=`expr $current + 1` + xlcverstring="${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision" + verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" + ;; + + freebsd-aout) + major=".$current" + versuffix=".$current.$revision"; + ;; + + freebsd-elf) + major=".$current" + versuffix=".$current"; + ;; + + irix | nonstopux) + if test "X$lt_irix_increment" = "Xno"; then + major=`expr $current - $age` + else + major=`expr $current - $age + 1` + fi + 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 "$loop" -ne 0; do + iface=`expr $revision - $loop` + loop=`expr $loop - 1` + verstring="$verstring_prefix$major.$iface:$verstring" + done + + # Before this point, $major must not contain `.'. + major=.$major + versuffix="$major.$revision" + ;; + + linux) + major=.`expr $current - $age` + versuffix="$major.$age.$revision" + ;; + + osf) + major=.`expr $current - $age` + versuffix=".$current.$age.$revision" + verstring="$current.$age.$revision" + + # Add in all the interfaces that we are compatible with. + loop=$age + while test "$loop" -ne 0; do + iface=`expr $current - $loop` + loop=`expr $loop - 1` + verstring="$verstring:${iface}.0" + done + + # Make executables depend on our current version. + verstring="$verstring:${current}.0" + ;; + + sunos) + major=".$current" + versuffix=".$current.$revision" + ;; + + windows) + # Use '-' rather than '.', since we only want one + # extension on DOS 8.3 filesystems. + major=`expr $current - $age` + versuffix="-$major" + ;; + + *) + $echo "$modename: unknown library version type \`$version_type'" 1>&2 + $echo "Fatal configuration error. See the $PACKAGE docs for more information." 1>&2 + exit $EXIT_FAILURE + ;; + 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 "$need_version" = no; then + versuffix= + else + versuffix=".0.0" + fi + fi + + # Remove version info from name if versioning should be avoided + if test "$avoid_version" = yes && test "$need_version" = no; then + major= + versuffix= + verstring="" + fi + + # Check to see if the archive will have undefined symbols. + if test "$allow_undefined" = yes; then + if test "$allow_undefined_flag" = unsupported; then + $echo "$modename: warning: undefined symbols not allowed in $host shared libraries" 1>&2 + build_libtool_libs=no + build_old_libs=yes + fi + else + # Don't allow undefined symbols. + allow_undefined_flag="$no_undefined_flag" + fi + fi + + if test "$mode" != relink; 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) + ;; + $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*) + if test "X$precious_files_regex" != "X"; then + if echo $p | $EGREP -e "$precious_files_regex" >/dev/null 2>&1 + then + continue + fi + fi + removelist="$removelist $p" + ;; + *) ;; + esac + done + if test -n "$removelist"; then + $show "${rm}r $removelist" + $run ${rm}r $removelist + fi + fi + + # Now set the variables for building old libraries. + if test "$build_old_libs" = yes && test "$build_libtool_libs" != convenience ; then + oldlibs="$oldlibs $output_objdir/$libname.$libext" + + # Transform .lo files to .o files. + oldobjs="$objs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}'$/d' -e "$lo2o" | $NL2SP` + fi + + # Eliminate all temporary directories. + #for path in $notinst_path; do + # lib_search_path=`$echo "$lib_search_path " | ${SED} -e "s% $path % %g"` + # deplibs=`$echo "$deplibs " | ${SED} -e "s% -L$path % %g"` + # dependency_libs=`$echo "$dependency_libs " | ${SED} -e "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 + temp_xrpath="$temp_xrpath -R$libdir" + case "$finalize_rpath " in + *" $libdir "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + if test "$hardcode_into_libs" != yes || test "$build_old_libs" = yes; 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 "*) ;; + *) dlfiles="$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 "*) ;; + *) dlprefiles="$dlprefiles $lib" ;; + esac + done + + if test "$build_libtool_libs" = yes; then + if test -n "$rpath"; then + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos*) + # these systems don't actually have a c library (as such)! + ;; + *-*-rhapsody* | *-*-darwin1.[012]) + # Rhapsody C library is in the System framework + deplibs="$deplibs -framework System" + ;; + *-*-netbsd*) + # Don't link with libc until the a.out ld.so is fixed. + ;; + *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*) + # 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 "$build_libtool_need_lc" = "yes"; then + deplibs="$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 + ;; + test_compile) + # This code stresses the "libraries are programs" paradigm to its + # limits. Maybe even breaks it. We compile a program, linking it + # against the deplibs as a proxy for the library. Then we can check + # whether they linked in statically or dynamically with ldd. + $rm conftest.c + cat > conftest.c </dev/null` + for potent_lib in $potential_libs; do + # Follow soft links. + if ls -lLd "$potent_lib" 2>/dev/null \ + | grep " -> " >/dev/null; then + continue + fi + # The statement above tries to avoid entering an + # endless loop below, in case of cyclic links. + # We might still enter an endless loop, since a link + # loop can be closed while we follow links, + # but so what? + potlib="$potent_lib" + while test -h "$potlib" 2>/dev/null; do + potliblink=`ls -ld $potlib | ${SED} 's/.* -> //'` + case $potliblink in + [\\/]* | [A-Za-z]:[\\/]*) potlib="$potliblink";; + *) potlib=`$echo "X$potlib" | $Xsed -e 's,[^/]*$,,'`"$potliblink";; + esac + done + if eval $file_magic_cmd \"\$potlib\" 2>/dev/null \ + | ${SED} 10q \ + | $EGREP "$file_magic_regex" > /dev/null; then + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + $echo + $echo "*** Warning: linker path does not have real file for library $a_deplib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $echo "*** with $libname but no candidates were found. (...for file magic test)" + else + $echo "*** with $libname and none of the candidates passed a file format test" + $echo "*** using a file magic. Last file checked: $potlib" + fi + fi + else + # Add a -L argument. + newdeplibs="$newdeplibs $a_deplib" + fi + done # Gone through all deplibs. + ;; + match_pattern*) + set dummy $deplibs_check_method + match_pattern_regex=`expr "$deplibs_check_method" : "$2 \(.*\)"` + for a_deplib in $deplibs; do + name=`expr $a_deplib : '-l\(.*\)'` + # If $name is empty we are operating on a -L argument. + if test -n "$name" && test "$name" != "0"; then + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + case " $predeps $postdeps " in + *" $a_deplib "*) + newdeplibs="$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 + newdeplibs="$newdeplibs $a_deplib" + a_deplib="" + break 2 + fi + done + done + fi + if test -n "$a_deplib" ; then + droppeddeps=yes + $echo + $echo "*** Warning: linker path does not have real file for library $a_deplib." + $echo "*** I have the capability to make that library automatically link in when" + $echo "*** you link to this library. But I can only do this if you have a" + $echo "*** shared version of the library, which you do not appear to have" + $echo "*** because I did check the linker path looking for a file starting" + if test -z "$potlib" ; then + $echo "*** with $libname but no candidates were found. (...for regex pattern test)" + else + $echo "*** with $libname and none of the candidates passed a file format test" + $echo "*** using a regex pattern. Last file checked: $potlib" + fi + fi + else + # Add a -L argument. + newdeplibs="$newdeplibs $a_deplib" + fi + done # Gone through all deplibs. + ;; + none | unknown | *) + newdeplibs="" + tmp_deplibs=`$echo "X $deplibs" | $Xsed -e 's/ -lc$//' \ + -e 's/ -[LR][^ ]*//g'` + if test "X$allow_libtool_libs_with_static_runtimes" = "Xyes" ; then + for i in $predeps $postdeps ; do + # can't use Xsed below, because $i might contain '/' + tmp_deplibs=`$echo "X $tmp_deplibs" | ${SED} -e "1s,^X,," -e "s,$i,,"` + done + fi + if $echo "X $tmp_deplibs" | $Xsed -e 's/[ ]//g' \ + | grep . >/dev/null; then + $echo + if test "X$deplibs_check_method" = "Xnone"; then + $echo "*** Warning: inter-library dependencies are not supported in this platform." + else + $echo "*** Warning: inter-library dependencies are not known to be supported." + fi + $echo "*** All declared inter-library dependencies are being dropped." + droppeddeps=yes + fi + ;; + esac + versuffix=$versuffix_save + major=$major_save + release=$release_save + libname=$libname_save + name=$name_save + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + newdeplibs=`$echo "X $newdeplibs" | $Xsed -e 's/ -lc / -framework System /'` + ;; + esac + + if test "$droppeddeps" = yes; then + if test "$module" = yes; then + $echo + $echo "*** Warning: libtool could not satisfy all declared inter-library" + $echo "*** dependencies of module $libname. Therefore, libtool will create" + $echo "*** a static module, that should work as long as the dlopening" + $echo "*** application is linked with the -dlopen flag." + if test -z "$global_symbol_pipe"; then + $echo + $echo "*** However, this would only work if libtool was able to extract symbol" + $echo "*** lists from a program, using \`nm' or equivalent, but libtool could" + $echo "*** not find such a program. So, this module is probably useless." + $echo "*** \`nm' from GNU binutils and a full rebuild may help." + fi + if test "$build_old_libs" = no; then + oldlibs="$output_objdir/$libname.$libext" + build_libtool_libs=module + build_old_libs=yes + else + build_libtool_libs=no + fi + else + $echo "*** The inter-library dependencies that have been dropped here will be" + $echo "*** automatically added whenever a program is linked with this library" + $echo "*** or is declared to -dlopen it." + + if test "$allow_undefined" = no; 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 "$build_old_libs" = no; 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 + + + # 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 "*) + new_libs="$new_libs -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$new_libs $deplib" ;; + esac + ;; + *) new_libs="$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 "$build_libtool_libs" = yes; then + if test "$hardcode_into_libs" = yes; then + # Hardcode the library paths + hardcode_libdirs= + dep_rpath= + rpath="$finalize_rpath" + test "$mode" != relink && rpath="$compile_rpath$rpath" + for libdir in $rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + dep_rpath="$dep_rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + if test -n "$hardcode_libdir_flag_spec_ld"; then + case $archive_cmds in + *\$LD*) eval dep_rpath=\"$hardcode_libdir_flag_spec_ld\" ;; + *) eval dep_rpath=\"$hardcode_libdir_flag_spec\" ;; + esac + else + eval dep_rpath=\"$hardcode_libdir_flag_spec\" + fi + fi + if test -n "$runpath_var" && test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath="$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 "$mode" != relink && 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 + realname="$2" + shift; 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 + linknames="$linknames $link" + done + + # Use standard objects if they are pic + test -z "$pic_flag" && libobjs=`$echo "X$libobjs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + if test "$always_export_symbols" = yes || test -n "$export_symbols_regex"; then + $show "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $run $rm $export_symbols + cmds=$export_symbols_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + if len=`expr "X$cmd" : ".*"` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then + $show "$cmd" + $run eval "$cmd" || exit $? + skipped_export=false + else + # The command line is too long to execute in one step. + $show "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"; then + $show "$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"" + $run eval '$EGREP -e "$export_symbols_regex" "$export_symbols" > "${export_symbols}T"' + $show "$mv \"${export_symbols}T\" \"$export_symbols\"" + $run eval '$mv "${export_symbols}T" "$export_symbols"' + fi + fi + fi + + if test -n "$export_symbols" && test -n "$include_expsyms"; then + $run eval '$echo "X$include_expsyms" | $SP2NL >> "$export_symbols"' + fi + + tmp_deplibs= + for test_deplib in $deplibs; do + case " $convenience " in + *" $test_deplib "*) ;; + *) + tmp_deplibs="$tmp_deplibs $test_deplib" + ;; + esac + done + deplibs="$tmp_deplibs" + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + save_libobjs=$libobjs + eval libobjs=\"\$libobjs $whole_archive_flag_spec\" + else + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + func_extract_archives $gentop $convenience + libobjs="$libobjs $func_extract_archives_result" + fi + fi + + if test "$thread_safe" = yes && test -n "$thread_safe_flag_spec"; then + eval flag=\"$thread_safe_flag_spec\" + linker_flags="$linker_flags $flag" + fi + + # Make a backup of the uninstalled library when relinking + if test "$mode" = relink; then + $run eval '(cd $output_objdir && $rm ${realname}U && $mv $realname ${realname}U)' || exit $? + fi + + # Do each of the archive commands. + if test "$module" = yes && 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 "X$skipped_export" != "X:" && + len=`expr "X$test_cmds" : ".*" 2>/dev/null` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then + : + else + # The command line is too long to link in one step, link piecewise. + $echo "creating reloadable object files..." + + # 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 + output_la=`$echo "X$output" | $Xsed -e "$basename"` + + # Clear the reloadable object creation command queue and + # initialize k to one. + test_cmds= + concat_cmds= + objlist= + delfiles= + last_robj= + k=1 + output=$output_objdir/$output_la-${k}.$objext + # Loop over the list of objects to be linked. + for obj in $save_libobjs + do + eval test_cmds=\"$reload_cmds $objlist $last_robj\" + if test "X$objlist" = X || + { len=`expr "X$test_cmds" : ".*" 2>/dev/null` && + test "$len" -le "$max_cmd_len"; }; then + objlist="$objlist $obj" + else + # The command $test_cmds is almost too long, add a + # command to the queue. + if test "$k" -eq 1 ; then + # The first file doesn't have a previous command to add. + eval concat_cmds=\"$reload_cmds $objlist $last_robj\" + else + # All subsequent reloadable object files will link in + # the last one created. + eval concat_cmds=\"\$concat_cmds~$reload_cmds $objlist $last_robj\" + fi + last_robj=$output_objdir/$output_la-${k}.$objext + k=`expr $k + 1` + output=$output_objdir/$output_la-${k}.$objext + objlist=$obj + len=1 + 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~ + eval concat_cmds=\"\${concat_cmds}$reload_cmds $objlist $last_robj\" + + if ${skipped_export-false}; then + $show "generating symbol list for \`$libname.la'" + export_symbols="$output_objdir/$libname.exp" + $run $rm $export_symbols + libobjs=$output + # Append the command to create the export file. + eval concat_cmds=\"\$concat_cmds~$export_symbols_cmds\" + fi + + # Set up a command to remove the reloadable object files + # after they are used. + i=0 + while test "$i" -lt "$k" + do + i=`expr $i + 1` + delfiles="$delfiles $output_objdir/$output_la-${i}.$objext" + done + + $echo "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" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + 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\" + fi + # Expand the library linking commands again to reset the + # value of $libobjs for piecewise linking. + + # Do each of the archive commands. + if test "$module" = yes && 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 + + # Append the command to remove the reloadable object files + # to the just-reset $cmds. + eval cmds=\"\$cmds~\$rm $delfiles\" + fi + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$mode" = relink; then + $run eval '(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 "$mode" = relink; then + $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 + $show "${rm}r $gentop" + $run ${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 + $show "(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)" + $run eval '(cd $output_objdir && $rm $linkname && $LN_S $realname $linkname)' || exit $? + fi + done + + # If -module or -export-dynamic was specified, set the dlname. + if test "$module" = yes || test "$export_dynamic" = yes; then + # On all known operating systems, these are identical. + dlname="$soname" + fi + fi + ;; + + obj) + case " $deplibs" in + *\ -l* | *\ -L*) + $echo "$modename: warning: \`-l' and \`-L' are ignored for objects" 1>&2 ;; + esac + + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + $echo "$modename: warning: \`-dlopen' is ignored for objects" 1>&2 + fi + + if test -n "$rpath"; then + $echo "$modename: warning: \`-rpath' is ignored for objects" 1>&2 + fi + + if test -n "$xrpath"; then + $echo "$modename: warning: \`-R' is ignored for objects" 1>&2 + fi + + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for objects" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for objects" 1>&2 + fi + + case $output in + *.lo) + if test -n "$objs$old_deplibs"; then + $echo "$modename: cannot build library object \`$output' from non-libtool objects" 1>&2 + exit $EXIT_FAILURE + fi + libobj="$output" + obj=`$echo "X$output" | $Xsed -e "$lo2o"` + ;; + *) + libobj= + obj="$output" + ;; + esac + + # Delete the old objects. + $run $rm $obj $libobj + + # Objects from convenience libraries. This assumes + # single-version convenience libraries. Whenever we create + # different ones for PIC/non-PIC, this we'll have to duplicate + # the extraction. + reload_conv_objs= + gentop= + # reload_cmds runs $LD directly, so let us get rid of + # -Wl from whole_archive_flag_spec and hope we can get by with + # turning comma into space.. + wl= + + if test -n "$convenience"; then + if test -n "$whole_archive_flag_spec"; then + eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" + reload_conv_objs=$reload_objs\ `$echo "X$tmp_whole_archive_flags" | $Xsed -e 's|,| |g'` + else + gentop="$output_objdir/${obj}x" + generated="$generated $gentop" + + func_extract_archives $gentop $convenience + reload_conv_objs="$reload_objs $func_extract_archives_result" + fi + fi + + # Create the old-style object. + reload_objs="$objs$old_deplibs "`$echo "X$libobjs" | $SP2NL | $Xsed -e '/\.'${libext}$'/d' -e '/\.lib$/d' -e "$lo2o" | $NL2SP`" $reload_conv_objs" ### testsuite: skip nested quoting test + + output="$obj" + cmds=$reload_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + + # Exit if we aren't doing a library object file. + if test -z "$libobj"; then + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + exit $EXIT_SUCCESS + fi + + if test "$build_libtool_libs" != yes; then + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + # Create an invalid libtool object if no PIC, so that we don't + # accidentally link it into a program. + # $show "echo timestamp > $libobj" + # $run eval "echo timestamp > $libobj" || exit $? + exit $EXIT_SUCCESS + fi + + if test -n "$pic_flag" || test "$pic_mode" != default; then + # Only do commands if we really have different PIC objects. + reload_objs="$libobjs $reload_conv_objs" + output="$libobj" + cmds=$reload_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + fi + + if test -n "$gentop"; then + $show "${rm}r $gentop" + $run ${rm}r $gentop + fi + + exit $EXIT_SUCCESS + ;; + + prog) + case $host in + *cygwin*) output=`$echo $output | ${SED} -e 's,.exe$,,;s,$,.exe,'` ;; + esac + if test -n "$vinfo"; then + $echo "$modename: warning: \`-version-info' is ignored for programs" 1>&2 + fi + + if test -n "$release"; then + $echo "$modename: warning: \`-release' is ignored for programs" 1>&2 + fi + + if test "$preload" = yes; then + if test "$dlopen_support" = unknown && test "$dlopen_self" = unknown && + test "$dlopen_self_static" = unknown; then + $echo "$modename: warning: \`AC_LIBTOOL_DLOPEN' not used. Assuming no dlopen support." + fi + fi + + case $host in + *-*-rhapsody* | *-*-darwin1.[012]) + # On Rhapsody replace the C library is the System framework + compile_deplibs=`$echo "X $compile_deplibs" | $Xsed -e 's/ -lc / -framework System /'` + finalize_deplibs=`$echo "X $finalize_deplibs" | $Xsed -e 's/ -lc / -framework System /'` + ;; + esac + + case $host in + *darwin*) + # Don't allow lazy linking, it breaks C++ global constructors + if test "$tagname" = CXX ; then + compile_command="$compile_command ${wl}-bind_at_load" + finalize_command="$finalize_command ${wl}-bind_at_load" + fi + ;; + 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 "*) + new_libs="$new_libs -L$path/$objdir" ;; + esac + ;; + esac + done + for deplib in $compile_deplibs; do + case $deplib in + -L*) + case " $new_libs " in + *" $deplib "*) ;; + *) new_libs="$new_libs $deplib" ;; + esac + ;; + *) new_libs="$new_libs $deplib" ;; + esac + done + compile_deplibs="$new_libs" + + + compile_command="$compile_command $compile_deplibs" + finalize_command="$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 "*) ;; + *) finalize_rpath="$finalize_rpath $libdir" ;; + esac + done + fi + + # Now hardcode the library paths + rpath= + hardcode_libdirs= + for libdir in $compile_rpath $finalize_rpath; do + if test -n "$hardcode_libdir_flag_spec"; then + if test -n "$hardcode_libdir_separator"; then + if test -z "$hardcode_libdirs"; then + hardcode_libdirs="$libdir" + else + # Just accumulate the unique libdirs. + case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in + *"$hardcode_libdir_separator$libdir$hardcode_libdir_separator"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$perm_rpath " in + *" $libdir "*) ;; + *) perm_rpath="$perm_rpath $libdir" ;; + esac + fi + case $host in + *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2*) + testbindir=`$echo "X$libdir" | $Xsed -e 's*/lib$*/bin*'` + case :$dllsearchpath: in + *":$libdir:"*) ;; + *) dllsearchpath="$dllsearchpath:$libdir";; + esac + case :$dllsearchpath: in + *":$testbindir:"*) ;; + *) dllsearchpath="$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"*) + ;; + *) + hardcode_libdirs="$hardcode_libdirs$hardcode_libdir_separator$libdir" + ;; + esac + fi + else + eval flag=\"$hardcode_libdir_flag_spec\" + rpath="$rpath $flag" + fi + elif test -n "$runpath_var"; then + case "$finalize_perm_rpath " in + *" $libdir "*) ;; + *) finalize_perm_rpath="$finalize_perm_rpath $libdir" ;; + esac + fi + done + # Substitute the hardcoded libdirs into the rpath. + if test -n "$hardcode_libdir_separator" && + test -n "$hardcode_libdirs"; then + libdir="$hardcode_libdirs" + eval rpath=\" $hardcode_libdir_flag_spec\" + fi + finalize_rpath="$rpath" + + if test -n "$libobjs" && test "$build_old_libs" = yes; then + # Transform all the library objects into standard objects. + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + fi + + dlsyms= + if test -n "$dlfiles$dlprefiles" || test "$dlself" != no; then + if test -n "$NM" && test -n "$global_symbol_pipe"; then + dlsyms="${outputname}S.c" + else + $echo "$modename: not configured to extract global symbols from dlpreopened files" 1>&2 + fi + fi + + if test -n "$dlsyms"; then + case $dlsyms in + "") ;; + *.c) + # Discover the nlist of each of the dlfiles. + nlist="$output_objdir/${outputname}.nm" + + $show "$rm $nlist ${nlist}S ${nlist}T" + $run $rm "$nlist" "${nlist}S" "${nlist}T" + + # Parse the name list into a source file. + $show "creating $output_objdir/$dlsyms" + + test -z "$run" && $echo > "$output_objdir/$dlsyms" "\ +/* $dlsyms - symbol resolution table for \`$outputname' dlsym emulation. */ +/* Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP */ + +#ifdef __cplusplus +extern \"C\" { +#endif + +/* Prevent the only kind of declaration conflicts we can make. */ +#define lt_preloaded_symbols some_other_symbol + +/* External symbol declarations for the compiler. */\ +" + + if test "$dlself" = yes; then + $show "generating symbol list for \`$output'" + + test -z "$run" && $echo ': @PROGRAM@ ' > "$nlist" + + # Add our own program objects to the symbol list. + progfiles=`$echo "X$objs$old_deplibs" | $SP2NL | $Xsed -e "$lo2o" | $NL2SP` + for arg in $progfiles; do + $show "extracting global C symbols from \`$arg'" + $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" + done + + if test -n "$exclude_expsyms"; then + $run eval '$EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T' + $run eval '$mv "$nlist"T "$nlist"' + fi + + if test -n "$export_symbols_regex"; then + $run eval '$EGREP -e "$export_symbols_regex" "$nlist" > "$nlist"T' + $run eval '$mv "$nlist"T "$nlist"' + fi + + # Prepare the list of exported symbols + if test -z "$export_symbols"; then + export_symbols="$output_objdir/$outputname.exp" + $run $rm $export_symbols + $run eval "${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \(.*\)$/\1/p' "'< "$nlist" > "$export_symbols"' + case $host in + *cygwin* | *mingw* ) + $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + $run eval 'cat "$export_symbols" >> "$output_objdir/$outputname.def"' + ;; + esac + else + $run eval "${SED} -e 's/\([].[*^$]\)/\\\\\1/g' -e 's/^/ /' -e 's/$/$/'"' < "$export_symbols" > "$output_objdir/$outputname.exp"' + $run eval 'grep -f "$output_objdir/$outputname.exp" < "$nlist" > "$nlist"T' + $run eval 'mv "$nlist"T "$nlist"' + case $host in + *cygwin* | *mingw* ) + $run eval "echo EXPORTS "'> "$output_objdir/$outputname.def"' + $run eval 'cat "$nlist" >> "$output_objdir/$outputname.def"' + ;; + esac + fi + fi + + for arg in $dlprefiles; do + $show "extracting global C symbols from \`$arg'" + name=`$echo "$arg" | ${SED} -e 's%^.*/%%'` + $run eval '$echo ": $name " >> "$nlist"' + $run eval "$NM $arg | $global_symbol_pipe >> '$nlist'" + done + + if test -z "$run"; then + # Make sure we have at least an empty file. + test -f "$nlist" || : > "$nlist" + + if test -n "$exclude_expsyms"; then + $EGREP -v " ($exclude_expsyms)$" "$nlist" > "$nlist"T + $mv "$nlist"T "$nlist" + fi + + # Try sorting and uniquifying the output. + if grep -v "^: " < "$nlist" | + 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/$dlsyms"' + else + $echo '/* NONE */' >> "$output_objdir/$dlsyms" + fi + + $echo >> "$output_objdir/$dlsyms" "\ + +#undef lt_preloaded_symbols + +#if defined (__STDC__) && __STDC__ +# define lt_ptr void * +#else +# define lt_ptr char * +# define const +#endif + +/* The mapping between symbol names and symbols. */ +" + + case $host in + *cygwin* | *mingw* ) + $echo >> "$output_objdir/$dlsyms" "\ +/* DATA imports from DLLs on WIN32 can't be const, because + runtime relocations are performed -- see ld's documentation + on pseudo-relocs */ +struct { +" + ;; + * ) + $echo >> "$output_objdir/$dlsyms" "\ +const struct { +" + ;; + esac + + + $echo >> "$output_objdir/$dlsyms" "\ + const char *name; + lt_ptr address; +} +lt_preloaded_symbols[] = +{\ +" + + eval "$global_symbol_to_c_name_address" < "$nlist" >> "$output_objdir/$dlsyms" + + $echo >> "$output_objdir/$dlsyms" "\ + {0, (lt_ptr) 0} +}; + +/* This works around a problem in FreeBSD linker */ +#ifdef FREEBSD_WORKAROUND +static const void *lt_preloaded_setup() { + return lt_preloaded_symbols; +} +#endif + +#ifdef __cplusplus +} +#endif\ +" + fi + + pic_flag_for_symtable= + case $host in + # compiling the symbol table file with pic_flag works around + # a FreeBSD bug that causes programs to crash when -lm is + # linked before any other PIC object. But we must not use + # pic_flag when linking with -static. The problem exists in + # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1. + *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*) + case "$compile_command " in + *" -static "*) ;; + *) pic_flag_for_symtable=" $pic_flag -DFREEBSD_WORKAROUND";; + esac;; + *-*-hpux*) + case "$compile_command " in + *" -static "*) ;; + *) pic_flag_for_symtable=" $pic_flag";; + esac + esac + + # Now compile the dynamic symbol file. + $show "(cd $output_objdir && $LTCC $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable \"$dlsyms\")" + $run eval '(cd $output_objdir && $LTCC $LTCFLAGS -c$no_builtin_flag$pic_flag_for_symtable "$dlsyms")' || exit $? + + # Clean up the generated files. + $show "$rm $output_objdir/$dlsyms $nlist ${nlist}S ${nlist}T" + $run $rm "$output_objdir/$dlsyms" "$nlist" "${nlist}S" "${nlist}T" + + # Transform the symbol file into the correct name. + case $host in + *cygwin* | *mingw* ) + if test -f "$output_objdir/${outputname}.def" ; then + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}.def $output_objdir/${outputname}S.${objext}%" | $NL2SP` + else + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` + fi + ;; + * ) + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s%@SYMFILE@%$output_objdir/${outputname}S.${objext}%" | $NL2SP` + ;; + esac + ;; + *) + $echo "$modename: unknown suffix for \`$dlsyms'" 1>&2 + exit $EXIT_FAILURE + ;; + esac + else + # We keep going just in case the user didn't refer to + # lt_preloaded_symbols. The linker will fail if global_symbol_pipe + # really was required. + + # Nullify the symbol file. + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e "s% @SYMFILE@%%" | $NL2SP` + finalize_command=`$echo "X$finalize_command" | $SP2NL | $Xsed -e "s% @SYMFILE@%%" | $NL2SP` + fi + + if test "$need_relink" = no || test "$build_libtool_libs" != yes; then + # Replace the output file specification. + compile_command=`$echo "X$compile_command" | $SP2NL | $Xsed -e 's%@OUTPUT@%'"$output"'%g' | $NL2SP` + link_command="$compile_command$compile_rpath" + + # We have no uninstalled library dependencies, so finalize right now. + $show "$link_command" + $run eval "$link_command" + exit_status=$? + + # Delete the generated files. + if test -n "$dlsyms"; then + $show "$rm $output_objdir/${outputname}S.${objext}" + $run $rm "$output_objdir/${outputname}S.${objext}" + fi + + exit $exit_status + fi + + if test -n "$shlibpath_var"; then + # We should set the shlibpath_var + rpath= + for dir in $temp_rpath; do + case $dir in + [\\/]* | [A-Za-z]:[\\/]*) + # Absolute path. + rpath="$rpath$dir:" + ;; + *) + # Relative path: add a thisdir entry. + rpath="$rpath\$thisdir/$dir:" + ;; + esac + done + temp_rpath="$rpath" + fi + + if test -n "$compile_shlibpath$finalize_shlibpath"; then + compile_command="$shlibpath_var=\"$compile_shlibpath$finalize_shlibpath\$$shlibpath_var\" $compile_command" + fi + if test -n "$finalize_shlibpath"; then + finalize_command="$shlibpath_var=\"$finalize_shlibpath\$$shlibpath_var\" $finalize_command" + fi + + compile_var= + finalize_var= + if test -n "$runpath_var"; then + if test -n "$perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $perm_rpath; do + rpath="$rpath$dir:" + done + compile_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + if test -n "$finalize_perm_rpath"; then + # We should set the runpath_var. + rpath= + for dir in $finalize_perm_rpath; do + rpath="$rpath$dir:" + done + finalize_var="$runpath_var=\"$rpath\$$runpath_var\" " + fi + fi + + if test "$no_install" = yes; 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 "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output"'%g'` + # Delete the old output file. + $run $rm $output + # Link the executable and exit + $show "$link_command" + $run eval "$link_command" || exit $? + exit $EXIT_SUCCESS + fi + + if test "$hardcode_action" = relink; then + # Fast installation is not supported + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + + $echo "$modename: warning: this platform does not like uninstalled shared libraries" 1>&2 + $echo "$modename: \`$output' will be relinked during installation" 1>&2 + else + if test "$fast_install" != no; then + link_command="$finalize_var$compile_command$finalize_rpath" + if test "$fast_install" = yes; then + relink_command=`$echo "X$compile_var$compile_command$compile_rpath" | $SP2NL | $Xsed -e 's%@OUTPUT@%\$progdir/\$file%g' | $NL2SP` + else + # fast_install is set to needless + relink_command= + fi + else + link_command="$compile_var$compile_command$compile_rpath" + relink_command="$finalize_var$finalize_command$finalize_rpath" + fi + fi + + # Replace the output file specification. + link_command=`$echo "X$link_command" | $Xsed -e 's%@OUTPUT@%'"$output_objdir/$outputname"'%g'` + + # Delete the old output files. + $run $rm $output $output_objdir/$outputname $output_objdir/lt-$outputname + + $show "$link_command" + $run eval "$link_command" || exit $? + + # Now create the wrapper script. + $show "creating $output" + + # Quote the relink command for shipping. + if test -n "$relink_command"; then + # 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}\" || 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 + var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` + relink_command="$var=\"$var_value\"; export $var; $relink_command" + fi + done + relink_command="(cd `pwd`; $relink_command)" + relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e "$sed_quote_subst" | $NL2SP` + fi + + # Quote $echo for shipping. + if test "X$echo" = "X$SHELL $progpath --fallback-echo"; then + case $progpath in + [\\/]* | [A-Za-z]:[\\/]*) qecho="$SHELL $progpath --fallback-echo";; + *) qecho="$SHELL `pwd`/$progpath --fallback-echo";; + esac + qecho=`$echo "X$qecho" | $Xsed -e "$sed_quote_subst"` + else + qecho=`$echo "X$echo" | $Xsed -e "$sed_quote_subst"` + fi + + # Only actually do things if our run command is non-null. + if test -z "$run"; then + # win32 will think the script is a binary if it has + # a .exe suffix, so we strip it off here. + case $output in + *.exe) output=`$echo $output|${SED} 's,.exe$,,'` ;; + esac + # test for cygwin because mv fails w/o .exe extensions + case $host in + *cygwin*) + exeext=.exe + outputname=`$echo $outputname|${SED} 's,.exe$,,'` ;; + *) exeext= ;; + esac + case $host in + *cygwin* | *mingw* ) + output_name=`basename $output` + output_path=`dirname $output` + 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 + + cat > $cwrappersource <> $cwrappersource<<"EOF" +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(PATH_MAX) +# define LT_PATHMAX PATH_MAX +#elif defined(MAXPATHLEN) +# define LT_PATHMAX MAXPATHLEN +#else +# define LT_PATHMAX 1024 +#endif + +#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 +# 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 */ + +#define XMALLOC(type, num) ((type *) xmalloc ((num) * sizeof(type))) +#define XFREE(stale) do { \ + if (stale) { free ((void *) stale); stale = 0; } \ +} while (0) + +/* -DDEBUG is fairly common in CFLAGS. */ +#undef DEBUG +#if defined DEBUGWRAPPER +# define DEBUG(format, ...) fprintf(stderr, format, __VA_ARGS__) +#else +# define DEBUG(format, ...) +#endif + +const char *program_name = NULL; + +void * xmalloc (size_t num); +char * xstrdup (const char *string); +const char * base_name (const char *name); +char * find_executable(const char *wrapper); +int check_executable(const char *path); +char * strendzap(char *str, const char *pat); +void lt_fatal (const char *message, ...); + +int +main (int argc, char *argv[]) +{ + char **newargz; + int i; + + program_name = (char *) xstrdup (base_name (argv[0])); + DEBUG("(main) argv[0] : %s\n",argv[0]); + DEBUG("(main) program_name : %s\n",program_name); + newargz = XMALLOC(char *, argc+2); +EOF + + cat >> $cwrappersource <> $cwrappersource <<"EOF" + newargz[1] = find_executable(argv[0]); + if (newargz[1] == NULL) + lt_fatal("Couldn't find %s", argv[0]); + DEBUG("(main) found exe at : %s\n",newargz[1]); + /* we know the script has the same name, without the .exe */ + /* so make sure newargz[1] doesn't end in .exe */ + strendzap(newargz[1],".exe"); + for (i = 1; i < argc; i++) + newargz[i+1] = xstrdup(argv[i]); + newargz[argc+1] = NULL; + + for (i=0; i> $cwrappersource <> $cwrappersource <> $cwrappersource <<"EOF" + return 127; +} + +void * +xmalloc (size_t num) +{ + void * p = (void *) malloc (num); + if (!p) + lt_fatal ("Memory exhausted"); + + return p; +} + +char * +xstrdup (const char *string) +{ + return string ? strcpy ((char *) xmalloc (strlen (string) + 1), string) : NULL +; +} + +const char * +base_name (const char *name) +{ + const char *base; + +#if defined (HAVE_DOS_BASED_FILE_SYSTEM) + /* Skip over the disk name in MSDOS pathnames. */ + if (isalpha ((unsigned char)name[0]) && name[1] == ':') + name += 2; +#endif + + for (base = name; *name; name++) + if (IS_DIR_SEPARATOR (*name)) + base = name + 1; + return base; +} + +int +check_executable(const char * path) +{ + struct stat st; + + DEBUG("(check_executable) : %s\n", path ? (*path ? path : "EMPTY!") : "NULL!"); + if ((!path) || (!*path)) + return 0; + + if ((stat (path, &st) >= 0) && + ( + /* MinGW & native WIN32 do not support S_IXOTH or S_IXGRP */ +#if defined (S_IXOTH) + ((st.st_mode & S_IXOTH) == S_IXOTH) || +#endif +#if defined (S_IXGRP) + ((st.st_mode & S_IXGRP) == S_IXGRP) || +#endif + ((st.st_mode & S_IXUSR) == S_IXUSR)) + ) + return 1; + else + return 0; +} + +/* Searches for the full path of the wrapper. Returns + newly allocated full path name if found, NULL otherwise */ +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]; + int tmp_len; + char* concat_name; + + DEBUG("(find_executable) : %s\n", wrapper ? (*wrapper ? wrapper : "EMPTY!") : "NULL!"); + + 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 = 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 ("getcwd failed"); + 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 ("getcwd failed"); + 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 * +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 (strcmp(str, pat) == 0) + *str = '\0'; + } + return str; +} + +static void +lt_error_core (int exit_status, const char * mode, + const char * message, va_list ap) +{ + fprintf (stderr, "%s: %s: ", program_name, mode); + vfprintf (stderr, message, ap); + fprintf (stderr, ".\n"); + + if (exit_status >= 0) + exit (exit_status); +} + +void +lt_fatal (const char *message, ...) +{ + va_list ap; + va_start (ap, message); + lt_error_core (EXIT_FAILURE, "FATAL", message, ap); + va_end (ap); +} +EOF + # we should really use a build-platform specific compiler + # here, but OTOH, the wrappers (shell script and this C one) + # are only useful if you want to execute the "real" binary. + # Since the "real" binary is built for $host, then this + # wrapper might as well be built for $host, too. + $run $LTCC $LTCFLAGS -s -o $cwrapper $cwrappersource + ;; + esac + $rm $output + trap "$rm $output; exit $EXIT_FAILURE" 1 2 15 + + $echo > $output "\ +#! $SHELL + +# $output - temporary wrapper script for $objdir/$outputname +# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP +# +# The $output program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='${SED} -e 1s/^X//' +sed_quote_subst='$sed_quote_subst' + +# Be Bourne compatible (taken from Autoconf:_AS_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 variable: + 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 + echo=\"$qecho\" + file=\"\$0\" + # Make sure echo works. + if test \"X\$1\" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift + elif test \"X\`(\$echo '\t') 2>/dev/null\`\" = 'X\t'; then + # Yippee, \$echo works! + : + else + # Restart under the correct shell, and then maybe \$echo will work. + exec $SHELL \"\$0\" --no-reexec \${1+\"\$@\"} + fi + fi\ +" + $echo >> $output "\ + + # Find the directory that this script lives in. + thisdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*$%%'\` + test \"x\$thisdir\" = \"x\$file\" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=\`ls -ld \"\$file\" | ${SED} -n 's/.*-> //p'\` + while test -n \"\$file\"; do + destdir=\`\$echo \"X\$file\" | \$Xsed -e 's%/[^/]*\$%%'\` + + # If there was a directory component, then change thisdir. + if test \"x\$destdir\" != \"x\$file\"; then + case \"\$destdir\" in + [\\\\/]* | [A-Za-z]:[\\\\/]*) thisdir=\"\$destdir\" ;; + *) thisdir=\"\$thisdir/\$destdir\" ;; + esac + fi + + file=\`\$echo \"X\$file\" | \$Xsed -e 's%^.*/%%'\` + file=\`ls -ld \"\$thisdir/\$file\" | ${SED} -n 's/.*-> //p'\` + done + + # Try to get the absolute directory name. + absdir=\`cd \"\$thisdir\" && pwd\` + test -n \"\$absdir\" && thisdir=\"\$absdir\" +" + + if test "$fast_install" = yes; then + $echo >> $output "\ + program=lt-'$outputname'$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 >> $output "\ + + # 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 $EXIT_FAILURE + fi + fi + + $mv \"\$progdir/\$file\" \"\$progdir/\$program\" 2>/dev/null || + { $rm \"\$progdir/\$program\"; + $mv \"\$progdir/\$file\" \"\$progdir/\$program\"; } + $rm \"\$progdir/\$file\" + fi" + else + $echo >> $output "\ + program='$outputname' + progdir=\"\$thisdir/$objdir\" +" + fi + + $echo >> $output "\ + + if test -f \"\$progdir/\$program\"; then" + + # Export our shlibpath_var if we have one. + if test "$shlibpath_overrides_runpath" = yes && test -n "$shlibpath_var" && test -n "$temp_rpath"; then + $echo >> $output "\ + # Add our own library path to $shlibpath_var + $shlibpath_var=\"$temp_rpath\$$shlibpath_var\" + + # Some systems cannot cope with colon-terminated $shlibpath_var + # The second colon is a workaround for a bug in BeOS R4 sed + $shlibpath_var=\`\$echo \"X\$$shlibpath_var\" | \$Xsed -e 's/::*\$//'\` + + export $shlibpath_var +" + fi + + # fixup the dll searchpath if we need to. + if test -n "$dllsearchpath"; then + $echo >> $output "\ + # Add the dll search path components to the executable PATH + PATH=$dllsearchpath:\$PATH +" + fi + + $echo >> $output "\ + if test \"\$libtool_execute_magic\" != \"$magic\"; then + # Run the actual program with our arguments. +" + case $host in + # Backslashes separate directories on plain windows + *-*-mingw | *-*-os2*) + $echo >> $output "\ + exec \"\$progdir\\\\\$program\" \${1+\"\$@\"} +" + ;; + + *) + $echo >> $output "\ + exec \"\$progdir/\$program\" \${1+\"\$@\"} +" + ;; + esac + $echo >> $output "\ + \$echo \"\$0: cannot exec \$program \$*\" + exit $EXIT_FAILURE + 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 $EXIT_FAILURE + fi +fi\ +" + chmod +x $output + fi + exit $EXIT_SUCCESS + ;; + esac + + # See if we need to build an old-fashioned archive. + for oldlib in $oldlibs; do + + if test "$build_libtool_libs" = convenience; then + oldobjs="$libobjs_save" + addlibs="$convenience" + build_libtool_libs=no + else + if test "$build_libtool_libs" = module; then + oldobjs="$libobjs_save" + build_libtool_libs=no + else + oldobjs="$old_deplibs $non_pic_objects" + fi + addlibs="$old_convenience" + fi + + if test -n "$addlibs"; then + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + func_extract_archives $gentop $addlibs + oldobjs="$oldobjs $func_extract_archives_result" + fi + + # Do each command in the archive commands. + if test -n "$old_archive_from_new_cmds" && test "$build_libtool_libs" = yes; then + cmds=$old_archive_from_new_cmds + else + # 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 + $echo "X$obj" | $Xsed -e 's%^.*/%%' + done | sort | sort -uc >/dev/null 2>&1); then + : + else + $echo "copying selected object files to avoid basename conflicts..." + + if test -z "$gentop"; then + gentop="$output_objdir/${outputname}x" + generated="$generated $gentop" + + $show "${rm}r $gentop" + $run ${rm}r "$gentop" + $show "$mkdir $gentop" + $run $mkdir "$gentop" + exit_status=$? + if test "$exit_status" -ne 0 && test ! -d "$gentop"; then + exit $exit_status + fi + fi + + save_oldobjs=$oldobjs + oldobjs= + counter=1 + for obj in $save_oldobjs + do + objbase=`$echo "X$obj" | $Xsed -e 's%^.*/%%'` + case " $oldobjs " in + " ") oldobjs=$obj ;; + *[\ /]"$objbase "*) + while :; do + # Make sure we don't pick an alternate name that also + # overlaps. + newobj=lt$counter-$objbase + counter=`expr $counter + 1` + case " $oldobjs " in + *[\ /]"$newobj "*) ;; + *) if test ! -f "$gentop/$newobj"; then break; fi ;; + esac + done + $show "ln $obj $gentop/$newobj || cp $obj $gentop/$newobj" + $run ln "$obj" "$gentop/$newobj" || + $run cp "$obj" "$gentop/$newobj" + oldobjs="$oldobjs $gentop/$newobj" + ;; + *) oldobjs="$oldobjs $obj" ;; + esac + done + fi + + eval cmds=\"$old_archive_cmds\" + + if len=`expr "X$cmds" : ".*"` && + test "$len" -le "$max_cmd_len" || test "$max_cmd_len" -le -1; then + cmds=$old_archive_cmds + else + # the command line is too long to link in one step, link in parts + $echo "using piecewise archive linking..." + save_RANLIB=$RANLIB + RANLIB=: + objlist= + concat_cmds= + save_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 + for obj in $save_oldobjs + do + oldobjs="$objlist $obj" + objlist="$objlist $obj" + eval test_cmds=\"$old_archive_cmds\" + if len=`expr "X$test_cmds" : ".*" 2>/dev/null` && + test "$len" -le "$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= + fi + done + RANLIB=$save_RANLIB + oldobjs=$objlist + if test "X$oldobjs" = "X" ; then + eval cmds=\"\$concat_cmds\" + else + eval cmds=\"\$concat_cmds~\$old_archive_cmds\" + fi + fi + fi + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + eval cmd=\"$cmd\" + IFS="$save_ifs" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + done + + if test -n "$generated"; then + $show "${rm}r$generated" + $run ${rm}r$generated + fi + + # Now create the libtool archive. + case $output in + *.la) + old_library= + test "$build_old_libs" = yes && old_library="$libname.$libext" + $show "creating $output" + + # 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}\" || 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 + var_value=`$echo "X$var_value" | $Xsed -e "$sed_quote_subst"` + relink_command="$var=\"$var_value\"; export $var; $relink_command" + fi + done + # Quote the link command for shipping. + relink_command="(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)" + relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e "$sed_quote_subst" | $NL2SP` + if test "$hardcode_automatic" = yes ; then + relink_command= + fi + + + # Only create the output if not a dry run. + if test -z "$run"; then + for installed in no yes; do + if test "$installed" = yes; then + if test -z "$install_libdir"; then + break + fi + output="$output_objdir/$outputname"i + # Replace all uninstalled libtool libraries with the installed ones + newdependency_libs= + for deplib in $dependency_libs; do + case $deplib in + *.la) + name=`$echo "X$deplib" | $Xsed -e 's%^.*/%%'` + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $deplib` + if test -z "$libdir"; then + $echo "$modename: \`$deplib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + newdependency_libs="$newdependency_libs $libdir/$name" + ;; + *) newdependency_libs="$newdependency_libs $deplib" ;; + esac + done + dependency_libs="$newdependency_libs" + newdlfiles= + for lib in $dlfiles; do + name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + if test -z "$libdir"; then + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + newdlfiles="$newdlfiles $libdir/$name" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + name=`$echo "X$lib" | $Xsed -e 's%^.*/%%'` + eval libdir=`${SED} -n -e 's/^libdir=\(.*\)$/\1/p' $lib` + if test -z "$libdir"; then + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + exit $EXIT_FAILURE + fi + newdlprefiles="$newdlprefiles $libdir/$name" + done + dlprefiles="$newdlprefiles" + else + newdlfiles= + for lib in $dlfiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + newdlfiles="$newdlfiles $abs" + done + dlfiles="$newdlfiles" + newdlprefiles= + for lib in $dlprefiles; do + case $lib in + [\\/]* | [A-Za-z]:[\\/]*) abs="$lib" ;; + *) abs=`pwd`"/$lib" ;; + esac + newdlprefiles="$newdlprefiles $abs" + done + dlprefiles="$newdlprefiles" + fi + $rm $output + # place dlname in correct position for cygwin + tdlname=$dlname + case $host,$output,$installed,$module,$dlname in + *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;; + esac + $echo > $output "\ +# $outputname - a libtool library file +# Generated by $PROGRAM - GNU $PACKAGE $VERSION$TIMESTAMP +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='$tdlname' + +# Names of this library. +library_names='$library_names' + +# The name of the static archive. +old_library='$old_library' + +# Libraries that this one depends upon. +dependency_libs='$dependency_libs' + +# Version information for $libname. +current=$current +age=$age +revision=$revision + +# Is this an already installed library? +installed=$installed + +# 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 "$installed" = no && test "$need_relink" = yes; then + $echo >> $output "\ +relink_command=\"$relink_command\"" + fi + done + fi + + # Do a symbolic link so that the libtool archive can be found in + # LD_LIBRARY_PATH before the program is installed. + $show "(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)" + $run eval '(cd $output_objdir && $rm $outputname && $LN_S ../$outputname $outputname)' || exit $? + ;; + esac + exit $EXIT_SUCCESS + ;; + + # libtool install mode + install) + modename="$modename: install" + + # There may be an optional sh(1) argument at the beginning of + # install_prog (especially on Windows NT). + if test "$nonopt" = "$SHELL" || test "$nonopt" = /bin/sh || + # Allow the use of GNU shtool's install command. + $echo "X$nonopt" | grep shtool > /dev/null; then + # Aesthetically quote it. + arg=`$echo "X$nonopt" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + install_prog="$arg " + arg="$1" + shift + else + install_prog= + arg=$nonopt + fi + + # The real first argument should be the name of the installation program. + # Aesthetically quote it. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + install_prog="$install_prog$arg" + + # We need to accept at least all the BSD install flags. + dest= + files= + opts= + prev= + install_type= + isdir=no + stripme= + for arg + do + if test -n "$dest"; then + files="$files $dest" + dest=$arg + continue + fi + + case $arg in + -d) isdir=yes ;; + -f) + case " $install_prog " in + *[\\\ /]cp\ *) ;; + *) prev=$arg ;; + esac + ;; + -g | -m | -o) prev=$arg ;; + -s) + stripme=" -s" + continue + ;; + -*) + ;; + *) + # If the previous option needed an argument, then skip it. + if test -n "$prev"; then + prev= + else + dest=$arg + continue + fi + ;; + esac + + # Aesthetically quote the argument. + arg=`$echo "X$arg" | $Xsed -e "$sed_quote_subst"` + case $arg in + *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") + arg="\"$arg\"" + ;; + esac + install_prog="$install_prog $arg" + done + + if test -z "$install_prog"; then + $echo "$modename: you must specify an install program" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + if test -n "$prev"; then + $echo "$modename: the \`$prev' option requires an argument" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + if test -z "$files"; then + if test -z "$dest"; then + $echo "$modename: no file or destination specified" 1>&2 + else + $echo "$modename: you must specify a destination" 1>&2 + fi + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Strip any trailing slash from the destination. + dest=`$echo "X$dest" | $Xsed -e 's%/$%%'` + + # Check to see that the destination is a directory. + test -d "$dest" && isdir=yes + if test "$isdir" = yes; then + destdir="$dest" + destname= + else + destdir=`$echo "X$dest" | $Xsed -e 's%/[^/]*$%%'` + test "X$destdir" = "X$dest" && destdir=. + destname=`$echo "X$dest" | $Xsed -e 's%^.*/%%'` + + # Not a directory, so check to see that there is only one file specified. + set dummy $files + if test "$#" -gt 2; then + $echo "$modename: \`$dest' is not a directory" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + fi + case $destdir in + [\\/]* | [A-Za-z]:[\\/]*) ;; + *) + for file in $files; do + case $file in + *.lo) ;; + *) + $echo "$modename: \`$destdir' must be an absolute directory name" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + 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. + staticlibs="$staticlibs $file" + ;; + + *.la) + # Check to see that this really is a libtool archive. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$file' is not a valid libtool archive" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + library_names= + old_library= + relink_command= + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Add the libdir to current_libdirs if it is the destination. + if test "X$destdir" = "X$libdir"; then + case "$current_libdirs " in + *" $libdir "*) ;; + *) current_libdirs="$current_libdirs $libdir" ;; + esac + else + # Note the libdir as a future libdir. + case "$future_libdirs " in + *" $libdir "*) ;; + *) future_libdirs="$future_libdirs $libdir" ;; + esac + fi + + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'`/ + test "X$dir" = "X$file/" && dir= + dir="$dir$objdir" + + if test -n "$relink_command"; then + # Determine the prefix the user has applied to our future dir. + inst_prefix_dir=`$echo "$destdir" | $SED "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. + if test "$inst_prefix_dir" = "$destdir"; then + $echo "$modename: error: cannot install \`$file' to a directory not ending in $libdir" 1>&2 + exit $EXIT_FAILURE + fi + + if test -n "$inst_prefix_dir"; then + # Stick the inst_prefix_dir data into the link command. + relink_command=`$echo "$relink_command" | $SP2NL | $SED "s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%" | $NL2SP` + else + relink_command=`$echo "$relink_command" | $SP2NL | $SED "s%@inst_prefix_dir@%%" | $NL2SP` + fi + + $echo "$modename: warning: relinking \`$file'" 1>&2 + $show "$relink_command" + if $run eval "$relink_command"; then : + else + $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 + exit $EXIT_FAILURE + fi + fi + + # See the names of the shared library. + set dummy $library_names + if test -n "$2"; then + realname="$2" + shift + shift + + srcname="$realname" + test -n "$relink_command" && srcname="$realname"T + + # Install the shared library and build the symlinks. + $show "$install_prog $dir/$srcname $destdir/$realname" + $run eval "$install_prog $dir/$srcname $destdir/$realname" || exit $? + if test -n "$stripme" && test -n "$striplib"; then + $show "$striplib $destdir/$realname" + $run 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 + if test "$linkname" != "$realname"; then + $show "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })" + $run eval "(cd $destdir && { $LN_S -f $realname $linkname || { $rm $linkname && $LN_S $realname $linkname; }; })" + fi + done + fi + + # Do each command in the postinstall commands. + lib="$destdir/$realname" + cmds=$postinstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || { + lt_exit=$? + + # Restore the uninstalled library and exit + if test "$mode" = relink; then + $run eval '(cd $output_objdir && $rm ${realname}T && $mv ${realname}U $realname)' + fi + + exit $lt_exit + } + done + IFS="$save_ifs" + fi + + # Install the pseudo-library for information purposes. + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + instname="$dir/$name"i + $show "$install_prog $instname $destdir/$name" + $run eval "$install_prog $instname $destdir/$name" || exit $? + + # Maybe install the static library, too. + test -n "$old_library" && staticlibs="$staticlibs $dir/$old_library" + ;; + + *.lo) + # Install (i.e. copy) a libtool object. + + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + destfile="$destdir/$destfile" + fi + + # Deduce the name of the destination old-style object file. + case $destfile in + *.lo) + staticdest=`$echo "X$destfile" | $Xsed -e "$lo2o"` + ;; + *.$objext) + staticdest="$destfile" + destfile= + ;; + *) + $echo "$modename: cannot copy a libtool object to \`$destfile'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + # Install the libtool object if requested. + if test -n "$destfile"; then + $show "$install_prog $file $destfile" + $run eval "$install_prog $file $destfile" || exit $? + fi + + # Install the old object if enabled. + if test "$build_old_libs" = yes; then + # Deduce the name of the old-style object file. + staticobj=`$echo "X$file" | $Xsed -e "$lo2o"` + + $show "$install_prog $staticobj $staticdest" + $run eval "$install_prog \$staticobj \$staticdest" || exit $? + fi + exit $EXIT_SUCCESS + ;; + + *) + # Figure out destination file name, if it wasn't already specified. + if test -n "$destname"; then + destfile="$destdir/$destname" + else + destfile=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + destfile="$destdir/$destfile" + fi + + # 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 + file=`$echo $file|${SED} 's,.exe$,,'` + stripped_ext=".exe" + fi + ;; + esac + + # Do a test to see if this is really a libtool program. + case $host in + *cygwin*|*mingw*) + wrapper=`$echo $file | ${SED} -e 's,.exe$,,'` + ;; + *) + wrapper=$file + ;; + esac + if (${SED} -e '4q' $wrapper | grep "^# Generated by .*$PACKAGE")>/dev/null 2>&1; then + notinst_deplibs= + relink_command= + + # Note that it is not necessary on cygwin/mingw to append a dot to + # foo even if both foo 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. + # + # If there is no directory component, then add one. + case $wrapper in + */* | *\\*) . ${wrapper} ;; + *) . ./${wrapper} ;; + esac + + # Check the variables that should have been set. + if test -z "$notinst_deplibs"; then + $echo "$modename: invalid libtool wrapper script \`$wrapper'" 1>&2 + exit $EXIT_FAILURE + fi + + finalize=yes + for lib in $notinst_deplibs; do + # Check to see that each library is installed. + libdir= + if test -f "$lib"; then + # If there is no directory component, then add one. + case $lib in + */* | *\\*) . $lib ;; + *) . ./$lib ;; + esac + fi + libfile="$libdir/"`$echo "X$lib" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test + if test -n "$libdir" && test ! -f "$libfile"; then + $echo "$modename: warning: \`$lib' has not been installed in \`$libdir'" 1>&2 + finalize=no + fi + done + + relink_command= + # Note that it is not necessary on cygwin/mingw to append a dot to + # foo even if both foo 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. + # + # If there is no directory component, then add one. + case $wrapper in + */* | *\\*) . ${wrapper} ;; + *) . ./${wrapper} ;; + esac + + outputname= + if test "$fast_install" = no && test -n "$relink_command"; then + if test "$finalize" = yes && test -z "$run"; then + tmpdir=`func_mktempdir` + file=`$echo "X$file$stripped_ext" | $Xsed -e 's%^.*/%%'` + outputname="$tmpdir/$file" + # Replace the output file specification. + relink_command=`$echo "X$relink_command" | $SP2NL | $Xsed -e 's%@OUTPUT@%'"$outputname"'%g' | $NL2SP` + + $show "$relink_command" + if $run eval "$relink_command"; then : + else + $echo "$modename: error: relink \`$file' with the above command before installing it" 1>&2 + ${rm}r "$tmpdir" + continue + fi + file="$outputname" + else + $echo "$modename: warning: cannot relink \`$file'" 1>&2 + fi + else + # Install the binary that we compiled earlier. + file=`$echo "X$file$stripped_ext" | $Xsed -e "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) + destfile=`$echo $destfile | ${SED} -e 's,.exe$,,'` + ;; + esac + ;; + esac + $show "$install_prog$stripme $file $destfile" + $run eval "$install_prog\$stripme \$file \$destfile" || exit $? + test -n "$outputname" && ${rm}r "$tmpdir" + ;; + esac + done + + for file in $staticlibs; do + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + + # Set up the ranlib parameters. + oldlib="$destdir/$name" + + $show "$install_prog $file $oldlib" + $run eval "$install_prog \$file \$oldlib" || exit $? + + if test -n "$stripme" && test -n "$old_striplib"; then + $show "$old_striplib $oldlib" + $run eval "$old_striplib $oldlib" || exit $? + fi + + # Do each command in the postinstall commands. + cmds=$old_postinstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || exit $? + done + IFS="$save_ifs" + done + + if test -n "$future_libdirs"; then + $echo "$modename: warning: remember to run \`$progname --finish$future_libdirs'" 1>&2 + fi + + if test -n "$current_libdirs"; then + # Maybe just do a dry run. + test -n "$run" && current_libdirs=" -n$current_libdirs" + exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs' + else + exit $EXIT_SUCCESS + fi + ;; + + # libtool finish mode + finish) + modename="$modename: finish" + libdirs="$nonopt" + admincmds= + + if test -n "$finish_cmds$finish_eval" && test -n "$libdirs"; then + for dir + do + libdirs="$libdirs $dir" + done + + for libdir in $libdirs; do + if test -n "$finish_cmds"; then + # Do each command in the finish commands. + cmds=$finish_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" || admincmds="$admincmds + $cmd" + done + IFS="$save_ifs" + fi + if test -n "$finish_eval"; then + # Do the single finish_eval. + eval cmds=\"$finish_eval\" + $run eval "$cmds" || admincmds="$admincmds + $cmds" + fi + done + fi + + # Exit here if they wanted silent mode. + test "$show" = : && exit $EXIT_SUCCESS + + $echo "X----------------------------------------------------------------------" | $Xsed + $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" + $echo "more information, such as the ld(1) and ld.so(8) manual pages." + $echo "X----------------------------------------------------------------------" | $Xsed + exit $EXIT_SUCCESS + ;; + + # libtool execute mode + execute) + modename="$modename: execute" + + # The first argument is the command name. + cmd="$nonopt" + if test -z "$cmd"; then + $echo "$modename: you must specify a COMMAND" 1>&2 + $echo "$help" + exit $EXIT_FAILURE + fi + + # Handle -dlopen flags immediately. + for file in $execute_dlfiles; do + if test ! -f "$file"; then + $echo "$modename: \`$file' is not a file" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + dir= + case $file in + *.la) + # Check to see that this really is a libtool archive. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then : + else + $echo "$modename: \`$lib' is not a valid libtool archive" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + # Read the libtool library. + dlname= + library_names= + + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Skip this library if it cannot be dlopened. + if test -z "$dlname"; then + # Warn if it was a shared library. + test -n "$library_names" && $echo "$modename: warning: \`$file' was not linked with \`-export-dynamic'" + continue + fi + + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$file" && dir=. + + if test -f "$dir/$objdir/$dlname"; then + dir="$dir/$objdir" + else + if test ! -f "$dir/$dlname"; then + $echo "$modename: cannot find \`$dlname' in \`$dir' or \`$dir/$objdir'" 1>&2 + exit $EXIT_FAILURE + fi + fi + ;; + + *.lo) + # Just add the directory containing the .lo file. + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "X$dir" = "X$file" && dir=. + ;; + + *) + $echo "$modename: warning \`-dlopen' is ignored for non-libtool libraries and objects" 1>&2 + continue + ;; + esac + + # Get the absolute pathname. + absdir=`cd "$dir" && pwd` + test -n "$absdir" && dir="$absdir" + + # Now add the directory to shlibpath_var. + if eval "test -z \"\$$shlibpath_var\""; then + eval "$shlibpath_var=\"\$dir\"" + else + eval "$shlibpath_var=\"\$dir:\$$shlibpath_var\"" + fi + done + + # This variable tells wrapper scripts just to set shlibpath_var + # rather than running their programs. + libtool_execute_magic="$magic" + + # Check if any of the arguments is a wrapper script. + args= + for file + do + case $file in + -*) ;; + *) + # Do a test to see if this is really a libtool program. + if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + # If there is no directory component, then add one. + case $file in + */* | *\\*) . $file ;; + *) . ./$file ;; + esac + + # Transform arg to wrapped name. + file="$progdir/$program" + fi + ;; + esac + # Quote arguments (to preserve shell metacharacters). + file=`$echo "X$file" | $Xsed -e "$sed_quote_subst"` + args="$args \"$file\"" + done + + if test -z "$run"; then + if test -n "$shlibpath_var"; then + # Export the shlibpath_var. + eval "export $shlibpath_var" + fi + + # Restore saved 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 + fi" + done + + # Now prepare to actually exec the command. + exec_cmd="\$cmd$args" + else + # Display what would be done. + if test -n "$shlibpath_var"; then + eval "\$echo \"\$shlibpath_var=\$$shlibpath_var\"" + $echo "export $shlibpath_var" + fi + $echo "$cmd$args" + exit $EXIT_SUCCESS + fi + ;; + + # libtool clean and uninstall mode + clean | uninstall) + modename="$modename: $mode" + rm="$nonopt" + files= + rmforce= + 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) rm="$rm $arg"; rmforce=yes ;; + -*) rm="$rm $arg" ;; + *) files="$files $arg" ;; + esac + done + + if test -z "$rm"; then + $echo "$modename: you must specify an RM program" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + fi + + rmdirs= + + origobjdir="$objdir" + for file in $files; do + dir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + if test "X$dir" = "X$file"; then + dir=. + objdir="$origobjdir" + else + objdir="$dir/$origobjdir" + fi + name=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + test "$mode" = uninstall && objdir="$dir" + + # Remember objdir for removal later, being careful to avoid duplicates + if test "$mode" = clean; then + case " $rmdirs " in + *" $objdir "*) ;; + *) rmdirs="$rmdirs $objdir" ;; + 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 test "$rmforce" = yes; then + continue + fi + + rmfiles="$file" + + case $name in + *.la) + # Possibly a libtool archive, so verify it. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + . $dir/$name + + # Delete the libtool libraries and symlinks. + for n in $library_names; do + rmfiles="$rmfiles $objdir/$n" + done + test -n "$old_library" && rmfiles="$rmfiles $objdir/$old_library" + + case "$mode" in + clean) + case " $library_names " in + # " " in the beginning catches empty $dlname + *" $dlname "*) ;; + *) rmfiles="$rmfiles $objdir/$dlname" ;; + esac + test -n "$libdir" && rmfiles="$rmfiles $objdir/$name $objdir/${name}i" + ;; + uninstall) + if test -n "$library_names"; then + # Do each command in the postuninstall commands. + cmds=$postuninstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" + if test "$?" -ne 0 && test "$rmforce" != yes; then + exit_status=1 + fi + done + IFS="$save_ifs" + fi + + if test -n "$old_library"; then + # Do each command in the old_postuninstall commands. + cmds=$old_postuninstall_cmds + save_ifs="$IFS"; IFS='~' + for cmd in $cmds; do + IFS="$save_ifs" + eval cmd=\"$cmd\" + $show "$cmd" + $run eval "$cmd" + if test "$?" -ne 0 && test "$rmforce" != yes; then + exit_status=1 + fi + done + IFS="$save_ifs" + fi + # FIXME: should reinstall the best remaining shared library. + ;; + esac + fi + ;; + + *.lo) + # Possibly a libtool object, so verify it. + if (${SED} -e '2q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + + # Read the .lo file + . $dir/$name + + # Add PIC object to the list of files to remove. + if test -n "$pic_object" \ + && test "$pic_object" != none; then + rmfiles="$rmfiles $dir/$pic_object" + fi + + # Add non-PIC object to the list of files to remove. + if test -n "$non_pic_object" \ + && test "$non_pic_object" != none; then + rmfiles="$rmfiles $dir/$non_pic_object" + fi + fi + ;; + + *) + if test "$mode" = clean ; then + noexename=$name + case $file in + *.exe) + file=`$echo $file|${SED} 's,.exe$,,'` + noexename=`$echo $name|${SED} 's,.exe$,,'` + # $file with .exe has already been added to rmfiles, + # add $file without .exe + rmfiles="$rmfiles $file" + ;; + esac + # Do a test to see if this is a libtool program. + if (${SED} -e '4q' $file | grep "^# Generated by .*$PACKAGE") >/dev/null 2>&1; then + relink_command= + . $dir/$noexename + + # note $name still contains .exe if it was in $file originally + # as does the version of $file that was added into $rmfiles + rmfiles="$rmfiles $objdir/$name $objdir/${name}S.${objext}" + if test "$fast_install" = yes && test -n "$relink_command"; then + rmfiles="$rmfiles $objdir/lt-$name" + fi + if test "X$noexename" != "X$name" ; then + rmfiles="$rmfiles $objdir/lt-${noexename}.c" + fi + fi + fi + ;; + esac + $show "$rm $rmfiles" + $run $rm $rmfiles || exit_status=1 + done + objdir="$origobjdir" + + # Try to remove the ${objdir}s in the directories where we deleted files + for dir in $rmdirs; do + if test -d "$dir"; then + $show "rmdir $dir" + $run rmdir $dir >/dev/null 2>&1 + fi + done + + exit $exit_status + ;; + + "") + $echo "$modename: you must specify a MODE" 1>&2 + $echo "$generic_help" 1>&2 + exit $EXIT_FAILURE + ;; + esac + + if test -z "$exec_cmd"; then + $echo "$modename: invalid operation mode \`$mode'" 1>&2 + $echo "$generic_help" 1>&2 + exit $EXIT_FAILURE + fi +fi # test -z "$show_help" + +if test -n "$exec_cmd"; then + eval exec $exec_cmd + exit $EXIT_FAILURE +fi + +# We need to display help for each of the modes. +case $mode in +"") $echo \ +"Usage: $modename [OPTION]... [MODE-ARG]... + +Provide generalized library-building support services. + + --config show all configuration variables + --debug enable verbose shell tracing +-n, --dry-run display commands without modifying any files + --features display basic configuration information and exit + --finish same as \`--mode=finish' + --help display this help message and exit + --mode=MODE use operation mode MODE [default=inferred from MODE-ARGS] + --quiet same as \`--silent' + --silent don't print informational messages + --tag=TAG use configuration variables from tag TAG + --version print version information + +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. Try \`$modename --help --mode=MODE' for +a more detailed description of MODE. + +Report bugs to ." + exit $EXIT_SUCCESS + ;; + +clean) + $echo \ +"Usage: $modename [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: $modename [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE + +Compile a source file into a libtool library object. + +This mode accepts the following additional options: + + -o OUTPUT-FILE set the output file name to OUTPUT-FILE + -prefer-pic try to building PIC objects only + -prefer-non-pic try to building non-PIC objects only + -static always build a \`.o' file suitable for static linking + +COMPILE-COMMAND is a command to be used in creating a \`standard' object file +from the given SOURCEFILE. + +The output file name is determined by removing the directory component from +SOURCEFILE, then substituting the C source code suffix \`.c' with the +library object suffix, \`.lo'." + ;; + +execute) + $echo \ +"Usage: $modename [OPTION]... --mode=execute COMMAND [ARGS]... + +Automatically set library path, then run a program. + +This mode accepts the following additional options: + + -dlopen FILE add the directory containing FILE to the library path + +This mode sets the library path environment variable according to \`-dlopen' +flags. + +If any of the ARGS are libtool executable wrappers, then they are translated +into their corresponding uninstalled binary, and any of their required library +directories are added to the library path. + +Then, COMMAND is executed, with ARGS as arguments." + ;; + +finish) + $echo \ +"Usage: $modename [OPTION]... --mode=finish [LIBDIR]... + +Complete the installation of libtool libraries. + +Each LIBDIR is a directory that contains libtool libraries. + +The commands that this mode executes may require superuser privileges. Use +the \`--dry-run' option if you just want to see what would be executed." + ;; + +install) + $echo \ +"Usage: $modename [OPTION]... --mode=install INSTALL-COMMAND... + +Install executables or libraries. + +INSTALL-COMMAND is the installation command. The first component should be +either the \`install' or \`cp' program. + +The rest of the components are interpreted as arguments to that command (only +BSD-compatible install options are recognized)." + ;; + +link) + $echo \ +"Usage: $modename [OPTION]... --mode=link LINK-COMMAND... + +Link object files or libraries together to form another library, or to +create an executable program. + +LINK-COMMAND is a command using the C compiler that you would use to create +a program from several object files. + +The following components of LINK-COMMAND are treated specially: + + -all-static do not do any dynamic linking at all + -avoid-version do not add a version suffix if possible + -dlopen FILE \`-dlpreopen' FILE if it cannot be dlopened at runtime + -dlpreopen FILE link in FILE and add its symbols to lt_preloaded_symbols + -export-dynamic allow symbols from OUTPUT-FILE to be resolved with dlsym(3) + -export-symbols SYMFILE + try to export only the symbols listed in SYMFILE + -export-symbols-regex REGEX + try to export only the symbols matching REGEX + -LLIBDIR search LIBDIR for required installed libraries + -lNAME OUTPUT-FILE requires the installed library libNAME + -module build a library that can dlopened + -no-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 + -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 + -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] + +All other options (arguments beginning with \`-') are ignored. + +Every other argument is treated as a filename. Files ending in \`.la' are +treated as uninstalled libtool libraries, other files are standard or library +object files. + +If the OUTPUT-FILE ends in \`.la', then a libtool library is created, +only library objects (\`.lo' files) may be specified, and \`-rpath' is +required, except when creating a convenience library. + +If OUTPUT-FILE ends in \`.a' or \`.lib', then a standard library is created +using \`ar' and \`ranlib', or on Windows using \`lib'. + +If OUTPUT-FILE ends in \`.lo' or \`.${objext}', then a reloadable object file +is created, otherwise an executable program is created." + ;; + +uninstall) + $echo \ +"Usage: $modename [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE... + +Remove libraries from an installation directory. + +RM is the name of the program to use to delete files associated with each FILE +(typically \`/bin/rm'). RM-OPTIONS are options (such as \`-f') to be passed +to RM. + +If FILE is a libtool library, all the files associated with it are deleted. +Otherwise, only FILE itself is deleted using RM." + ;; + +*) + $echo "$modename: invalid operation mode \`$mode'" 1>&2 + $echo "$help" 1>&2 + exit $EXIT_FAILURE + ;; +esac + +$echo +$echo "Try \`$modename --help' for more information about other modes." + +exit $? + +# The TAGs below are defined such that we never get into a situation +# in which 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 +disable_libs=shared +# ### END LIBTOOL TAG CONFIG: disable-shared + +# ### BEGIN LIBTOOL TAG CONFIG: disable-static +disable_libs=static +# ### END LIBTOOL TAG CONFIG: disable-static + +# Local Variables: +# mode:shell-script +# sh-indentation:2 +# End: +# ### BEGIN LIBTOOL TAG CONFIG: CXX + +# Libtool was configured on host ubuntu: + +# Shell to use when invoking shell scripts. +SHELL="/bin/bash" + +# Whether or not to build shared libraries. +build_libtool_libs=yes + +# Whether or not to build static libraries. +build_old_libs=yes + +# Whether or not to add -lc for building shared libraries. +build_libtool_need_lc=no + +# Whether or not to disallow shared libs when runtime libs are static +allow_libtool_libs_with_static_runtimes=no + +# Whether or not to optimize for fast installation. +fast_install=yes + +# The host system. +host_alias= +host=x86_64-unknown-linux-gnu +host_os=linux-gnu + +# The build system. +build_alias= +build=x86_64-unknown-linux-gnu +build_os=linux-gnu + +# An echo program that does not interpret backslashes. +echo="echo" + +# The archiver. +AR="ar" +AR_FLAGS="cru" + +# A C compiler. +LTCC="gcc" + +# LTCC compiler flags. +LTCFLAGS="-g -O2" + +# A language-specific compiler. +CC="g++" + +# Is the compiler the GNU C compiler? +with_gcc=yes + +# An ERE matcher. +EGREP="/bin/grep -E" + +# The linker used to build libraries. +LD="/usr/bin/ld -m elf_x86_64" + +# Whether we need hard or soft links. +LN_S="ln -s" + +# A BSD-compatible nm program. +NM="/usr/bin/nm -B" + +# A symbol stripping program +STRIP="strip" + +# Used to examine libraries when file_magic_cmd begins "file" +MAGIC_CMD=file + +# Used on cygwin: DLL creation program. +DLLTOOL="dlltool" + +# Used on cygwin: object dumper. +OBJDUMP="objdump" + +# Used on cygwin: assembler. +AS="as" + +# The name of the directory that contains temporary libtool files. +objdir=.libs + +# How to create reloadable object files. +reload_flag=" -r" +reload_cmds="\$LD\$reload_flag -o \$output\$reload_objs" + +# How to pass a linker flag through the compiler. +wl="-Wl," + +# Object file suffix (normally "o"). +objext="o" + +# Old archive suffix (normally "a"). +libext="a" + +# Shared library suffix (normally ".so"). +shrext_cmds='.so' + +# Executable file suffix (normally ""). +exeext="" + +# Additional compiler flags for building library objects. +pic_flag=" -fPIC -DPIC" +pic_mode=default + +# What is the maximum length of a command? +max_cmd_len=1572864 + +# Does compiler simultaneously support -c and -o options? +compiler_c_o="yes" + +# Must we lock files when doing compilation? +need_locks="no" + +# Do we need the lib prefix for modules? +need_lib_prefix=no + +# Do we need a version for libraries? +need_version=no + +# Whether dlopen is supported. +dlopen_support=unknown + +# Whether dlopen of programs is supported. +dlopen_self=unknown + +# Whether dlopen of statically linked programs is supported. +dlopen_self_static=unknown + +# Compiler flag to prevent dynamic linking. +link_static_flag="-static" + +# Compiler flag to turn off builtin functions. +no_builtin_flag=" -fno-builtin" + +# Compiler flag to allow reflexive dlopens. +export_dynamic_flag_spec="\${wl}--export-dynamic" + +# Compiler flag to generate shared objects directly from archives. +whole_archive_flag_spec="\${wl}--whole-archive\$convenience \${wl}--no-whole-archive" + +# Compiler flag to generate thread-safe objects. +thread_safe_flag_spec="" + +# Library versioning type. +version_type=linux + +# Format of library name prefix. +libname_spec="lib\$name" + +# List of archive names. First name is the real one, the rest are links. +# The last name is the one that the linker finds with -lNAME. +library_names_spec="\${libname}\${release}\${shared_ext}\$versuffix \${libname}\${release}\${shared_ext}\$major \$libname\${shared_ext}" + +# The coded name of the library, if different from the real name. +soname_spec="\${libname}\${release}\${shared_ext}\$major" + +# Commands used to build and install an old-style archive. +RANLIB="ranlib" +old_archive_cmds="\$AR \$AR_FLAGS \$oldlib\$oldobjs~\$RANLIB \$oldlib" +old_postinstall_cmds="chmod 644 \$oldlib~\$RANLIB \$oldlib" +old_postuninstall_cmds="" + +# Create an old-style archive from a shared archive. +old_archive_from_new_cmds="" + +# Create a temporary old-style archive to link instead of a shared archive. +old_archive_from_expsyms_cmds="" + +# Commands used to build and install a shared archive. +archive_cmds="\$CC -shared -nostdlib \$predep_objects \$libobjs \$deplibs \$postdep_objects \$compiler_flags \${wl}-soname \$wl\$soname -o \$lib" +archive_expsym_cmds="\$CC -shared -nostdlib \$predep_objects \$libobjs \$deplibs \$postdep_objects \$compiler_flags \${wl}-soname \$wl\$soname \${wl}-retain-symbols-file \$wl\$export_symbols -o \$lib" +postinstall_cmds="" +postuninstall_cmds="" + +# Commands used to build a loadable module (assumed same as above if empty) +module_cmds="" +module_expsym_cmds="" + +# Commands to strip libraries. +old_striplib="strip --strip-debug" +striplib="strip --strip-unneeded" + +# Dependencies to place before the objects being linked to create a +# shared library. +predep_objects="/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/4.8/crtbeginS.o" + +# Dependencies to place after the objects being linked to create a +# shared library. +postdep_objects="/usr/lib/gcc/x86_64-linux-gnu/4.8/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crtn.o" + +# Dependencies to place before the objects being linked to create a +# shared library. +predeps="" + +# Dependencies to place after the objects being linked to create a +# shared library. +postdeps="-lstdc++ -lm -lgcc_s -lc -lgcc_s" + +# The directories searched by this compiler when creating a shared +# library +compiler_lib_search_dirs="/usr/lib/gcc/x86_64-linux-gnu/4.8 /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib /lib/x86_64-linux-gnu /lib/../lib /usr/lib/x86_64-linux-gnu /usr/lib/../lib /usr/lib/gcc/x86_64-linux-gnu/4.8/../../.." + +# The library search path used internally by the compiler when linking +# a shared library. +compiler_lib_search_path="-L/usr/lib/gcc/x86_64-linux-gnu/4.8 -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../.." + +# Method to check whether dependent libraries are shared objects. +deplibs_check_method="pass_all" + +# Command to use when deplibs_check_method == file_magic. +file_magic_cmd="\$MAGIC_CMD" + +# Flag that allows shared libraries with undefined symbols to be built. +allow_undefined_flag="" + +# Flag that forces no undefined symbols. +no_undefined_flag="" + +# Commands used to finish a libtool library installation in a directory. +finish_cmds="PATH=\\\"\\\$PATH:/sbin\\\" ldconfig -n \$libdir" + +# Same as above, but a single script fragment to be evaled but not shown. +finish_eval="" + +# Take the output of nm and produce a listing of raw symbols and C names. +global_symbol_pipe="sed -n -e 's/^.*[ ]\\([ABCDGIRSTW][ABCDGIRSTW]*\\)[ ][ ]*\\([_A-Za-z][_A-Za-z0-9]*\\)\$/\\1 \\2 \\2/p'" + +# Transform the output of nm in a proper C declaration +global_symbol_to_cdecl="sed -n -e 's/^. .* \\(.*\\)\$/extern int \\1;/p'" + +# Transform the output of nm in a C name address pair +global_symbol_to_c_name_address="sed -n -e 's/^: \\([^ ]*\\) \$/ {\\\"\\1\\\", (lt_ptr) 0},/p' -e 's/^[BCDEGRST] \\([^ ]*\\) \\([^ ]*\\)\$/ {\"\\2\", (lt_ptr) \\&\\2},/p'" + +# This is the shared library runtime path variable. +runpath_var=LD_RUN_PATH + +# This is the shared library path variable. +shlibpath_var=LD_LIBRARY_PATH + +# Is shlibpath searched before the hard-coded library search path? +shlibpath_overrides_runpath=no + +# How to hardcode a shared library path into an executable. +hardcode_action=immediate + +# Whether we should hardcode library paths into libraries. +hardcode_into_libs=yes + +# Flag to hardcode $libdir into a binary during linking. +# This must work even if $libdir does not exist. +hardcode_libdir_flag_spec="\${wl}--rpath \${wl}\$libdir" + +# If ld is used when linking, flag to hardcode $libdir into +# a binary during linking. This must work even if $libdir does +# not exist. +hardcode_libdir_flag_spec_ld="" + +# Whether we need a single -rpath flag with a separated argument. +hardcode_libdir_separator="" + +# Set to yes if using DIR/libNAME during linking hardcodes DIR into the +# resulting binary. +hardcode_direct=no + +# Set to yes if using the -LDIR flag during linking hardcodes DIR into the +# resulting binary. +hardcode_minus_L=no + +# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into +# the resulting binary. +hardcode_shlibpath_var=unsupported + +# Set to yes if building a shared library automatically hardcodes DIR into the library +# and all subsequent libraries and executables linked against it. +hardcode_automatic=no + +# Variables whose values should be saved in libtool wrapper scripts and +# restored at relink time. +variables_saved_for_relink="PATH LD_LIBRARY_PATH LD_RUN_PATH GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" + +# Whether libtool must link a program against all its dependency libraries. +link_all_deplibs=unknown + +# Compile-time system search path for libraries +sys_lib_search_path_spec="/usr/lib64 /lib64 /usr/local/lib64" + +# Run-time system search path for libraries +sys_lib_dlsearch_path_spec="/usr/lib64 /lib64 /usr/lib/x86_64-linux-gnu/libfakeroot /usr/local/lib /lib/x86_64-linux-gnu /usr/lib/x86_64-linux-gnu " + +# Fix the shell variable $srcfile for the compiler. +fix_srcfile_path="" + +# Set to yes if exported symbols are required. +always_export_symbols=no + +# The commands to list exported symbols. +export_symbols_cmds="\$NM \$libobjs \$convenience | \$global_symbol_pipe | \$SED 's/.* //' | sort | uniq > \$export_symbols" + +# The commands to extract the exported symbol list from a shared archive. +extract_expsyms_cmds="" + +# Symbols that should not be listed in the preloaded symbols. +exclude_expsyms="_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*" + +# Symbols that must always be exported. +include_expsyms="" + +# ### END LIBTOOL TAG CONFIG: CXX + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/locks/beos/Makefile.in b/rubbos/app/httpd-2.0.64/srclib/apr/locks/beos/Makefile.in new file mode 100644 index 00000000..6c8a1bcc --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/locks/beos/Makefile.in @@ -0,0 +1,16 @@ +srcdir = @srcdir@ +VPATH = @srcdir@ + +TARGETS = \ + thread_mutex.lo \ + thread_rwlock.lo \ + thread_cond.lo \ + proc_mutex.lo + +# bring in rules.mk for standard functionality +@INCLUDE_RULES@ + +INCDIR=../../include +INCLUDES=-I$(INCDIR) -I$(INCDIR)/arch + +# DO NOT REMOVE diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/locks/beos/proc_mutex.c b/rubbos/app/httpd-2.0.64/srclib/apr/locks/beos/proc_mutex.c new file mode 100644 index 00000000..da315ce6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/locks/beos/proc_mutex.c @@ -0,0 +1,169 @@ +/* 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/Write locking implementation based on the MultiLock code from + * Stephen Beaulieu + */ + +#include "beos/apr_arch_proc_mutex.h" +#include "apr_strings.h" +#include "apr_portable.h" + +static apr_status_t _proc_mutex_cleanup(void * data) +{ + apr_proc_mutex_t *lock = (apr_proc_mutex_t*)data; + if (lock->LockCount != 0) { + /* we're still locked... */ + while (atomic_add(&lock->LockCount , -1) > 1){ + /* OK we had more than one person waiting on the lock so + * the sem is also locked. Release it until we have no more + * locks left. + */ + release_sem (lock->Lock); + } + } + delete_sem(lock->Lock); + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_proc_mutex_create(apr_proc_mutex_t **mutex, + const char *fname, + apr_lockmech_e mech, + apr_pool_t *pool) +{ + apr_proc_mutex_t *new; + apr_status_t stat = APR_SUCCESS; + + if (mech != APR_LOCK_DEFAULT) { + return APR_ENOTIMPL; + } + + new = (apr_proc_mutex_t *)apr_pcalloc(pool, sizeof(apr_proc_mutex_t)); + if (new == NULL){ + return APR_ENOMEM; + } + + if ((stat = create_sem(0, "APR_Lock")) < B_NO_ERROR) { + _proc_mutex_cleanup(new); + return stat; + } + new->LockCount = 0; + new->Lock = stat; + new->pool = pool; + + apr_pool_cleanup_register(new->pool, (void *)new, _proc_mutex_cleanup, + apr_pool_cleanup_null); + + (*mutex) = new; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_proc_mutex_child_init(apr_proc_mutex_t **mutex, + const char *fname, + apr_pool_t *pool) +{ + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_proc_mutex_lock(apr_proc_mutex_t *mutex) +{ + int32 stat; + + if (atomic_add(&mutex->LockCount, 1) > 0) { + if ((stat = acquire_sem(mutex->Lock)) < B_NO_ERROR) { + atomic_add(&mutex->LockCount, -1); + return stat; + } + } + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_proc_mutex_trylock(apr_proc_mutex_t *mutex) +{ + return APR_ENOTIMPL; +} + +APR_DECLARE(apr_status_t) apr_proc_mutex_unlock(apr_proc_mutex_t *mutex) +{ + int32 stat; + + if (atomic_add(&mutex->LockCount, -1) > 1) { + if ((stat = release_sem(mutex->Lock)) < B_NO_ERROR) { + atomic_add(&mutex->LockCount, 1); + return stat; + } + } + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_proc_mutex_destroy(apr_proc_mutex_t *mutex) +{ + apr_status_t stat; + if ((stat = _proc_mutex_cleanup(mutex)) == APR_SUCCESS) { + apr_pool_cleanup_kill(mutex->pool, mutex, _proc_mutex_cleanup); + return APR_SUCCESS; + } + return stat; +} + +APR_DECLARE(apr_status_t) apr_proc_mutex_cleanup(void *mutex) +{ + return _proc_mutex_cleanup(mutex); +} + +APR_DECLARE(const char *) apr_proc_mutex_lockfile(apr_proc_mutex_t *mutex) +{ + return NULL; +} + +APR_DECLARE(const char *) apr_proc_mutex_name(apr_proc_mutex_t *mutex) +{ + return "beossem"; +} + +APR_DECLARE(const char *) apr_proc_mutex_defname(void) +{ + return "beossem"; +} + +APR_POOL_IMPLEMENT_ACCESSOR(proc_mutex) + +/* Implement OS-specific accessors defined in apr_portable.h */ + +APR_DECLARE(apr_status_t) apr_os_proc_mutex_get(apr_os_proc_mutex_t *ospmutex, + apr_proc_mutex_t *pmutex) +{ + ospmutex->sem = pmutex->Lock; + ospmutex->ben = pmutex->LockCount; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_os_proc_mutex_put(apr_proc_mutex_t **pmutex, + apr_os_proc_mutex_t *ospmutex, + apr_pool_t *pool) +{ + if (pool == NULL) { + return APR_ENOPOOL; + } + if ((*pmutex) == NULL) { + (*pmutex) = (apr_proc_mutex_t *)apr_pcalloc(pool, sizeof(apr_proc_mutex_t)); + (*pmutex)->pool = pool; + } + (*pmutex)->Lock = ospmutex->sem; + (*pmutex)->LockCount = ospmutex->ben; + return APR_SUCCESS; +} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/locks/beos/thread_cond.c b/rubbos/app/httpd-2.0.64/srclib/apr/locks/beos/thread_cond.c new file mode 100644 index 00000000..3729bf38 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/locks/beos/thread_cond.c @@ -0,0 +1,190 @@ +/* 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. + */ + +#include "beos/apr_arch_thread_mutex.h" +#include "beos/apr_arch_thread_cond.h" +#include "apr_strings.h" +#include "apr_portable.h" + +static apr_status_t thread_cond_cleanup(void *data) +{ + struct waiter *w; + apr_thread_cond_t *cond = (apr_thread_cond_t *)data; + + acquire_sem(cond->lock); +/* + APR_RING_FOREACH(w, &cond->alist, waiter_t, link) { + delete_sem(w->sem); + } +*/ + delete_sem(cond->lock); + + return APR_SUCCESS; +} + +static struct waiter_t *make_waiter(apr_pool_t *pool) +{ + struct waiter_t *w = (struct waiter_t*) + apr_palloc(pool, sizeof(struct waiter_t)); + if (w == NULL) + return NULL; + + w->sem = create_sem(0, "apr conditional waiter"); + if (w->sem < 0) + return NULL; + + APR_RING_ELEM_INIT(w, link); + + return w; +} + +APR_DECLARE(apr_status_t) apr_thread_cond_create(apr_thread_cond_t **cond, + apr_pool_t *pool) +{ + apr_thread_cond_t *new_cond; + sem_id rv; + int i; + + new_cond = (apr_thread_cond_t *)apr_palloc(pool, sizeof(apr_thread_cond_t)); + + if (new_cond == NULL) + return APR_ENOMEM; + + if ((rv = create_sem(1, "apr conditional lock")) < B_OK) + return rv; + + new_cond->lock = rv; + new_cond->pool = pool; + APR_RING_INIT(&new_cond->alist, waiter_t, link); + APR_RING_INIT(&new_cond->flist, waiter_t, link); + + for (i=0;i < 10 ;i++) { + struct waiter_t *nw = make_waiter(pool); + APR_RING_INSERT_TAIL(&new_cond->flist, nw, waiter_t, link); + } + + apr_pool_cleanup_register(new_cond->pool, + (void *)new_cond, thread_cond_cleanup, + apr_pool_cleanup_null); + + *cond = new_cond; + return APR_SUCCESS; +} + + +static apr_status_t do_wait(apr_thread_cond_t *cond, apr_thread_mutex_t *mutex, + int timeout) +{ + struct waiter_t *wait; + thread_id cth = find_thread(NULL); + apr_status_t rv; + int flags = B_RELATIVE_TIMEOUT; + + /* We must be the owner of the mutex or we can't do this... */ + if (mutex->owner != cth) { + /* What should we return??? */ + return APR_EINVAL; + } + + acquire_sem(cond->lock); + wait = APR_RING_FIRST(&cond->flist); + if (wait) + APR_RING_REMOVE(wait, link); + else + wait = make_waiter(cond->pool); + APR_RING_INSERT_TAIL(&cond->alist, wait, waiter_t, link); + cond->condlock = mutex; + release_sem(cond->lock); + + apr_thread_mutex_unlock(cond->condlock); + + if (timeout == 0) + flags = 0; + + rv = acquire_sem_etc(wait->sem, 1, flags, timeout); + + apr_thread_mutex_lock(cond->condlock); + + if (rv != B_OK) + if (rv == B_TIMED_OUT) + return APR_TIMEUP; + return rv; + + acquire_sem(cond->lock); + APR_RING_REMOVE(wait, link); + APR_RING_INSERT_TAIL(&cond->flist, wait, waiter_t, link); + release_sem(cond->lock); + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_thread_cond_wait(apr_thread_cond_t *cond, + apr_thread_mutex_t *mutex) +{ + return do_wait(cond, mutex, 0); +} + +APR_DECLARE(apr_status_t) apr_thread_cond_timedwait(apr_thread_cond_t *cond, + apr_thread_mutex_t *mutex, + apr_interval_time_t timeout) +{ + return do_wait(cond, mutex, timeout); +} + +APR_DECLARE(apr_status_t) apr_thread_cond_signal(apr_thread_cond_t *cond) +{ + struct waiter_t *wake; + + acquire_sem(cond->lock); + if (!APR_RING_EMPTY(&cond->alist, waiter_t, link)) { + wake = APR_RING_FIRST(&cond->alist); + APR_RING_REMOVE(wake, link); + release_sem(wake->sem); + APR_RING_INSERT_TAIL(&cond->flist, wake, waiter_t, link); + } + release_sem(cond->lock); + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_thread_cond_broadcast(apr_thread_cond_t *cond) +{ + struct waiter_t *wake; + + acquire_sem(cond->lock); + while (! APR_RING_EMPTY(&cond->alist, waiter_t, link)) { + wake = APR_RING_FIRST(&cond->alist); + APR_RING_REMOVE(wake, link); + release_sem(wake->sem); + APR_RING_INSERT_TAIL(&cond->flist, wake, waiter_t, link); + } + release_sem(cond->lock); + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_thread_cond_destroy(apr_thread_cond_t *cond) +{ + apr_status_t stat; + if ((stat = thread_cond_cleanup(cond)) == APR_SUCCESS) { + apr_pool_cleanup_kill(cond->pool, cond, thread_cond_cleanup); + return APR_SUCCESS; + } + return stat; +} + +APR_POOL_IMPLEMENT_ACCESSOR(thread_cond) + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/locks/beos/thread_mutex.c b/rubbos/app/httpd-2.0.64/srclib/apr/locks/beos/thread_mutex.c new file mode 100644 index 00000000..1d23d3cf --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/locks/beos/thread_mutex.c @@ -0,0 +1,147 @@ +/* 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/Write locking implementation based on the MultiLock code from + * Stephen Beaulieu + */ + +#include "beos/apr_arch_thread_mutex.h" +#include "apr_strings.h" +#include "apr_portable.h" + +static apr_status_t _thread_mutex_cleanup(void * data) +{ + apr_thread_mutex_t *lock = (apr_thread_mutex_t*)data; + if (lock->LockCount != 0) { + /* we're still locked... */ + while (atomic_add(&lock->LockCount , -1) > 1){ + /* OK we had more than one person waiting on the lock so + * the sem is also locked. Release it until we have no more + * locks left. + */ + release_sem (lock->Lock); + } + } + delete_sem(lock->Lock); + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_thread_mutex_create(apr_thread_mutex_t **mutex, + unsigned int flags, + apr_pool_t *pool) +{ + apr_thread_mutex_t *new_m; + apr_status_t stat = APR_SUCCESS; + + new_m = (apr_thread_mutex_t *)apr_pcalloc(pool, sizeof(apr_thread_mutex_t)); + if (new_m == NULL){ + return APR_ENOMEM; + } + + if ((stat = create_sem(0, "APR_Lock")) < B_NO_ERROR) { + _thread_mutex_cleanup(new_m); + return stat; + } + new_m->LockCount = 0; + new_m->Lock = stat; + new_m->pool = pool; + + /* Optimal default is APR_THREAD_MUTEX_UNNESTED, + * no additional checks required for either flag. + */ + new_m->nested = flags & APR_THREAD_MUTEX_NESTED; + + apr_pool_cleanup_register(new_m->pool, (void *)new_m, _thread_mutex_cleanup, + apr_pool_cleanup_null); + + (*mutex) = new_m; + return APR_SUCCESS; +} + +#if APR_HAS_CREATE_LOCKS_NP +APR_DECLARE(apr_status_t) apr_thread_mutex_create_np(apr_thread_mutex_t **mutex, + const char *fname, + apr_lockmech_e_np mech, + apr_pool_t *pool) +{ + return APR_ENOTIMPL; +} +#endif + +APR_DECLARE(apr_status_t) apr_thread_mutex_lock(apr_thread_mutex_t *mutex) +{ + int32 stat; + thread_id me = find_thread(NULL); + + if (mutex->nested && mutex->owner == me) { + mutex->owner_ref++; + return APR_SUCCESS; + } + + if (atomic_add(&mutex->LockCount, 1) > 0) { + if ((stat = acquire_sem(mutex->Lock)) < B_NO_ERROR) { + /* Oh dear, acquire_sem failed!! */ + atomic_add(&mutex->LockCount, -1); + return stat; + } + } + + mutex->owner = me; + mutex->owner_ref = 1; + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_thread_mutex_trylock(apr_thread_mutex_t *mutex) +{ + return APR_ENOTIMPL; +} + +APR_DECLARE(apr_status_t) apr_thread_mutex_unlock(apr_thread_mutex_t *mutex) +{ + int32 stat; + + if (mutex->nested && mutex->owner == find_thread(NULL)) { + mutex->owner_ref--; + if (mutex->owner_ref > 0) + return APR_SUCCESS; + } + + if (atomic_add(&mutex->LockCount, -1) > 1) { + if ((stat = release_sem(mutex->Lock)) < B_NO_ERROR) { + atomic_add(&mutex->LockCount, 1); + return stat; + } + } + + mutex->owner = -1; + mutex->owner_ref = 0; + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_thread_mutex_destroy(apr_thread_mutex_t *mutex) +{ + apr_status_t stat; + if ((stat = _thread_mutex_cleanup(mutex)) == APR_SUCCESS) { + apr_pool_cleanup_kill(mutex->pool, mutex, _thread_mutex_cleanup); + return APR_SUCCESS; + } + return stat; +} + +APR_POOL_IMPLEMENT_ACCESSOR(thread_mutex) + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/locks/beos/thread_rwlock.c b/rubbos/app/httpd-2.0.64/srclib/apr/locks/beos/thread_rwlock.c new file mode 100644 index 00000000..915b919c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/locks/beos/thread_rwlock.c @@ -0,0 +1,190 @@ +/* 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/Write locking implementation based on the MultiLock code from + * Stephen Beaulieu + */ + +#include "beos/apr_arch_thread_rwlock.h" +#include "apr_strings.h" +#include "apr_portable.h" + +#define BIG_NUM 100000 + +static apr_status_t _thread_rw_cleanup(void * data) +{ + apr_thread_rwlock_t *mutex = (apr_thread_rwlock_t*)data; + + if (mutex->ReadCount != 0) { + while (atomic_add(&mutex->ReadCount , -1) > 1){ + release_sem (mutex->Read); + } + } + if (mutex->WriteCount != 0) { + while (atomic_add(&mutex->WriteCount , -1) > 1){ + release_sem (mutex->Write); + } + } + if (mutex->LockCount != 0) { + while (atomic_add(&mutex->LockCount , -1) > 1){ + release_sem (mutex->Lock); + } + } + + delete_sem(mutex->Read); + delete_sem(mutex->Write); + delete_sem(mutex->Lock); + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_thread_rwlock_create(apr_thread_rwlock_t **rwlock, + apr_pool_t *pool) +{ + apr_thread_rwlock_t *new; + + new = (apr_thread_rwlock_t *)apr_pcalloc(pool, sizeof(apr_thread_rwlock_t)); + if (new == NULL){ + return APR_ENOMEM; + } + + new->pool = pool; + /* we need to make 3 locks... */ + new->ReadCount = 0; + new->WriteCount = 0; + new->LockCount = 0; + new->Read = create_sem(0, "APR_ReadLock"); + new->Write = create_sem(0, "APR_WriteLock"); + new->Lock = create_sem(0, "APR_Lock"); + + if (new->Lock < 0 || new->Read < 0 || new->Write < 0) { + _thread_rw_cleanup(new); + return -1; + } + + apr_pool_cleanup_register(new->pool, (void *)new, _thread_rw_cleanup, + apr_pool_cleanup_null); + (*rwlock) = new; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_thread_rwlock_rdlock(apr_thread_rwlock_t *rwlock) +{ + int32 rv = APR_SUCCESS; + + if (find_thread(NULL) == rwlock->writer) { + /* we're the writer - no problem */ + rwlock->Nested++; + } else { + /* we're not the writer */ + int32 r = atomic_add(&rwlock->ReadCount, 1); + if (r < 0) { + /* Oh dear, writer holds lock, wait for sem */ + rv = acquire_sem_etc(rwlock->Read, 1, B_DO_NOT_RESCHEDULE, + B_INFINITE_TIMEOUT); + } + } + + return rv; +} + +APR_DECLARE(apr_status_t) apr_thread_rwlock_tryrdlock(apr_thread_rwlock_t *rwlock) +{ + return APR_ENOTIMPL; +} + +APR_DECLARE(apr_status_t) apr_thread_rwlock_wrlock(apr_thread_rwlock_t *rwlock) +{ + int rv = APR_SUCCESS; + + if (find_thread(NULL) == rwlock->writer) { + rwlock->Nested++; + } else { + /* we're not the writer... */ + if (atomic_add(&rwlock->LockCount, 1) >= 1) { + /* we're locked - acquire the sem */ + rv = acquire_sem_etc(rwlock->Lock, 1, B_DO_NOT_RESCHEDULE, + B_INFINITE_TIMEOUT); + } + if (rv == APR_SUCCESS) { + /* decrement the ReadCount to a large -ve number so that + * we block on new readers... + */ + int32 readers = atomic_add(&rwlock->ReadCount, -BIG_NUM); + if (readers > 0) { + /* readers are holding the lock */ + rv = acquire_sem_etc(rwlock->Write, readers, B_DO_NOT_RESCHEDULE, + B_INFINITE_TIMEOUT); + } + if (rv == APR_SUCCESS) + rwlock->writer = find_thread(NULL); + } + } + + return rv; +} + +APR_DECLARE(apr_status_t) apr_thread_rwlock_trywrlock(apr_thread_rwlock_t *rwlock) +{ + return APR_ENOTIMPL; +} + +APR_DECLARE(apr_status_t) apr_thread_rwlock_unlock(apr_thread_rwlock_t *rwlock) +{ + apr_status_t rv = APR_SUCCESS; + int32 readers; + + /* we know we hold the lock, so don't check it :) */ + if (find_thread(NULL) == rwlock->writer) { + /* we know we hold the lock, so don't check it :) */ + if (rwlock->Nested > 1) { + /* we're recursively locked */ + rwlock->Nested--; + return APR_SUCCESS; + } + /* OK so we need to release the sem if we have it :) */ + readers = atomic_add(&rwlock->ReadCount, BIG_NUM) + BIG_NUM; + if (readers > 0) { + rv = release_sem_etc(rwlock->Read, readers, B_DO_NOT_RESCHEDULE); + } + if (rv == APR_SUCCESS) { + rwlock->writer = -1; + if (atomic_add(&rwlock->LockCount, -1) > 1) { + rv = release_sem_etc(rwlock->Lock, 1, B_DO_NOT_RESCHEDULE); + } + } + } else { + /* We weren't the Writer, so just release the ReadCount... */ + if (atomic_add(&rwlock->ReadCount, -1) < 0) { + /* we have a writer waiting for the lock, so release it */ + rv = release_sem_etc(rwlock->Write, 1, B_DO_NOT_RESCHEDULE); + } + } + + return rv; +} + +APR_DECLARE(apr_status_t) apr_thread_rwlock_destroy(apr_thread_rwlock_t *rwlock) +{ + apr_status_t stat; + if ((stat = _thread_rw_cleanup(rwlock)) == APR_SUCCESS) { + apr_pool_cleanup_kill(rwlock->pool, rwlock, _thread_rw_cleanup); + return APR_SUCCESS; + } + return stat; +} + +APR_POOL_IMPLEMENT_ACCESSOR(thread_rwlock) + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/locks/netware/proc_mutex.c b/rubbos/app/httpd-2.0.64/srclib/apr/locks/netware/proc_mutex.c new file mode 100644 index 00000000..77411d0b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/locks/netware/proc_mutex.c @@ -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. + */ + +#include "apr.h" +#include "apr_private.h" +#include "apr_portable.h" +#include "apr_arch_proc_mutex.h" +#include "apr_arch_thread_mutex.h" + +APR_DECLARE(apr_status_t) apr_proc_mutex_create(apr_proc_mutex_t **mutex, + const char *fname, + apr_lockmech_e mech, + apr_pool_t *pool) +{ + apr_status_t ret; + apr_proc_mutex_t *new_mutex = NULL; + new_mutex = (apr_proc_mutex_t *)apr_pcalloc(pool, sizeof(apr_proc_mutex_t)); + + if(new_mutex ==NULL) { + return APR_ENOMEM; + } + + new_mutex->pool = pool; + ret = apr_thread_mutex_create(&(new_mutex->mutex), APR_THREAD_MUTEX_DEFAULT, pool); + + if (ret == APR_SUCCESS) + *mutex = new_mutex; + + return ret; +} + +APR_DECLARE(apr_status_t) apr_proc_mutex_child_init(apr_proc_mutex_t **mutex, + const char *fname, + apr_pool_t *pool) +{ + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_proc_mutex_lock(apr_proc_mutex_t *mutex) +{ + if (mutex) + return apr_thread_mutex_lock(mutex->mutex); + return APR_ENOLOCK; +} + +APR_DECLARE(apr_status_t) apr_proc_mutex_trylock(apr_proc_mutex_t *mutex) +{ + if (mutex) + return apr_thread_mutex_trylock(mutex->mutex); + return APR_ENOLOCK; +} + +APR_DECLARE(apr_status_t) apr_proc_mutex_unlock(apr_proc_mutex_t *mutex) +{ + if (mutex) + return apr_thread_mutex_unlock(mutex->mutex); + return APR_ENOLOCK; +} + +APR_DECLARE(apr_status_t) apr_proc_mutex_cleanup(void *mutex) +{ + return apr_proc_mutex_destroy(mutex); +} + +APR_DECLARE(apr_status_t) apr_proc_mutex_destroy(apr_proc_mutex_t *mutex) +{ + if (mutex) + return apr_thread_mutex_destroy(mutex->mutex); + return APR_ENOLOCK; +} + +APR_DECLARE(const char *) apr_proc_mutex_lockfile(apr_proc_mutex_t *mutex) +{ + return NULL; +} + +APR_DECLARE(const char *) apr_proc_mutex_name(apr_proc_mutex_t *mutex) +{ + return "netwarethread"; +} + +APR_DECLARE(const char *) apr_proc_mutex_defname(void) +{ + return "netwarethread"; +} + +APR_POOL_IMPLEMENT_ACCESSOR(proc_mutex) + +/* Implement OS-specific accessors defined in apr_portable.h */ + +apr_status_t apr_os_proc_mutex_get(apr_os_proc_mutex_t *ospmutex, + apr_proc_mutex_t *pmutex) +{ + if (pmutex) + ospmutex = pmutex->mutex->mutex; + return APR_ENOLOCK; +} + +apr_status_t apr_os_proc_mutex_put(apr_proc_mutex_t **pmutex, + apr_os_proc_mutex_t *ospmutex, + apr_pool_t *pool) +{ + return APR_ENOTIMPL; +} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/locks/netware/thread_cond.c b/rubbos/app/httpd-2.0.64/srclib/apr/locks/netware/thread_cond.c new file mode 100644 index 00000000..dcb21edc --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/locks/netware/thread_cond.c @@ -0,0 +1,100 @@ +/* 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. + */ + +#include + +#include "apr.h" +#include "apr_private.h" +#include "apr_general.h" +#include "apr_strings.h" +#include "apr_arch_thread_mutex.h" +#include "apr_arch_thread_cond.h" +#include "apr_portable.h" + +static apr_status_t thread_cond_cleanup(void *data) +{ + apr_thread_cond_t *cond = (apr_thread_cond_t *)data; + + NXCondFree(cond->cond); + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_thread_cond_create(apr_thread_cond_t **cond, + apr_pool_t *pool) +{ + apr_thread_cond_t *new_cond = NULL; + + new_cond = (apr_thread_cond_t *)apr_pcalloc(pool, sizeof(apr_thread_cond_t)); + + if(new_cond ==NULL) { + return APR_ENOMEM; + } + new_cond->pool = pool; + + new_cond->cond = NXCondAlloc(NULL); + + if(new_cond->cond == NULL) + return APR_ENOMEM; + + apr_pool_cleanup_register(new_cond->pool, new_cond, + (void*)thread_cond_cleanup, + apr_pool_cleanup_null); + *cond = new_cond; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_thread_cond_wait(apr_thread_cond_t *cond, + apr_thread_mutex_t *mutex) +{ + if (NXCondWait(cond->cond, mutex->mutex) != 0) + return APR_EINTR; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_thread_cond_timedwait(apr_thread_cond_t *cond, + apr_thread_mutex_t *mutex, + apr_interval_time_t timeout){ + if (NXCondTimedWait(cond->cond, mutex->mutex, + (timeout*1000)/NXGetSystemTick()) == NX_ETIMEDOUT) { + return APR_TIMEUP; + } + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_thread_cond_signal(apr_thread_cond_t *cond) +{ + NXCondSignal(cond->cond); + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_thread_cond_broadcast(apr_thread_cond_t *cond) +{ + NXCondBroadcast(cond->cond); + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_thread_cond_destroy(apr_thread_cond_t *cond) +{ + apr_status_t stat; + if ((stat = thread_cond_cleanup(cond)) == APR_SUCCESS) { + apr_pool_cleanup_kill(cond->pool, cond, thread_cond_cleanup); + return APR_SUCCESS; + } + return stat; +} + +APR_POOL_IMPLEMENT_ACCESSOR(thread_cond) + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/locks/netware/thread_mutex.c b/rubbos/app/httpd-2.0.64/srclib/apr/locks/netware/thread_mutex.c new file mode 100644 index 00000000..98bf33bd --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/locks/netware/thread_mutex.c @@ -0,0 +1,92 @@ +/* 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. + */ + +#include "apr.h" +#include "apr_private.h" +#include "apr_general.h" +#include "apr_strings.h" +#include "apr_arch_thread_mutex.h" +#include "apr_portable.h" + +static apr_status_t thread_mutex_cleanup(void *data) +{ + apr_thread_mutex_t *mutex = (apr_thread_mutex_t *)data; + + NXMutexFree(mutex->mutex); + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_thread_mutex_create(apr_thread_mutex_t **mutex, + unsigned int flags, + apr_pool_t *pool) +{ + apr_thread_mutex_t *new_mutex = NULL; + + /* XXX: Implement _UNNESTED flavor and favor _DEFAULT for performance + */ + if (flags & APR_THREAD_MUTEX_UNNESTED) { + return APR_ENOTIMPL; + } + new_mutex = (apr_thread_mutex_t *)apr_pcalloc(pool, sizeof(apr_thread_mutex_t)); + + if(new_mutex ==NULL) { + return APR_ENOMEM; + } + new_mutex->pool = pool; + + new_mutex->mutex = NXMutexAlloc(NX_MUTEX_RECURSIVE, 0, NULL); + + if(new_mutex->mutex == NULL) + return APR_ENOMEM; + + apr_pool_cleanup_register(new_mutex->pool, new_mutex, + (void*)thread_mutex_cleanup, + apr_pool_cleanup_null); + *mutex = new_mutex; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_thread_mutex_lock(apr_thread_mutex_t *mutex) +{ + NXLock(mutex->mutex); + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_thread_mutex_trylock(apr_thread_mutex_t *mutex) +{ + if (!NXTryLock(mutex->mutex)) + return APR_EBUSY; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_thread_mutex_unlock(apr_thread_mutex_t *mutex) +{ + NXUnlock(mutex->mutex); + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_thread_mutex_destroy(apr_thread_mutex_t *mutex) +{ + apr_status_t stat; + if ((stat = thread_mutex_cleanup(mutex)) == APR_SUCCESS) { + apr_pool_cleanup_kill(mutex->pool, mutex, thread_mutex_cleanup); + return APR_SUCCESS; + } + return stat; +} + +APR_POOL_IMPLEMENT_ACCESSOR(thread_mutex) + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/locks/netware/thread_rwlock.c b/rubbos/app/httpd-2.0.64/srclib/apr/locks/netware/thread_rwlock.c new file mode 100644 index 00000000..d0bf3ddf --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/locks/netware/thread_rwlock.c @@ -0,0 +1,102 @@ +/* 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. + */ + +#include "apr.h" +#include "apr_private.h" +#include "apr_general.h" +#include "apr_strings.h" +#include "apr_arch_thread_rwlock.h" +#include "apr_portable.h" + +static apr_status_t thread_rwlock_cleanup(void *data) +{ + apr_thread_rwlock_t *rwlock = (apr_thread_rwlock_t *)data; + + NXRwLockFree (rwlock->rwlock); + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_thread_rwlock_create(apr_thread_rwlock_t **rwlock, + apr_pool_t *pool) +{ + apr_thread_rwlock_t *new_rwlock = NULL; + + NXHierarchy_t hierarchy = 1; //for libc NKS NXRwLockAlloc + NXLockInfo_t *info; //for libc NKS NXRwLockAlloc + + new_rwlock = (apr_thread_rwlock_t *)apr_pcalloc(pool, sizeof(apr_thread_rwlock_t)); + + if(new_rwlock ==NULL) { + return APR_ENOMEM; + } + new_rwlock->pool = pool; + + info = (NXLockInfo_t *)apr_pcalloc(pool, sizeof(NXLockInfo_t)); + new_rwlock->rwlock = NXRwLockAlloc(hierarchy, info); + if(new_rwlock->rwlock == NULL) + return APR_ENOMEM; + + apr_pool_cleanup_register(new_rwlock->pool, new_rwlock, thread_rwlock_cleanup, + apr_pool_cleanup_null); + *rwlock = new_rwlock; + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_thread_rwlock_rdlock(apr_thread_rwlock_t *rwlock) +{ + NXRdLock(rwlock->rwlock); + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_thread_rwlock_tryrdlock(apr_thread_rwlock_t *rwlock) +{ + if (!NXTryRdLock(rwlock->rwlock)) + return APR_EBUSY; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_thread_rwlock_wrlock(apr_thread_rwlock_t *rwlock) +{ + NXWrLock(rwlock->rwlock); + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_thread_rwlock_trywrlock(apr_thread_rwlock_t *rwlock) +{ + if (!NXTryWrLock(rwlock->rwlock)) + return APR_EBUSY; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_thread_rwlock_unlock(apr_thread_rwlock_t *rwlock) +{ + NXRwUnlock(rwlock->rwlock); + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_thread_rwlock_destroy(apr_thread_rwlock_t *rwlock) +{ + apr_status_t stat; + if ((stat = thread_rwlock_cleanup(rwlock)) == APR_SUCCESS) { + apr_pool_cleanup_kill(rwlock->pool, rwlock, thread_rwlock_cleanup); + return APR_SUCCESS; + } + return stat; +} + +APR_POOL_IMPLEMENT_ACCESSOR(thread_rwlock) + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/locks/os2/Makefile.in b/rubbos/app/httpd-2.0.64/srclib/apr/locks/os2/Makefile.in new file mode 100644 index 00000000..e22f85c9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/locks/os2/Makefile.in @@ -0,0 +1,18 @@ +srcdir = @srcdir@ +VPATH = @srcdir@ + +TARGETS = \ + thread_mutex.lo \ + thread_rwlock.lo \ + thread_cond.lo \ + proc_mutex.lo + +# bring in rules.mk for standard functionality +@INCLUDE_RULES@ + +INCDIR=../../include +OSDIR=$(INCDIR)/arch/@OSDIR@ +DEFOSDIR=$(INCDIR)/arch/@DEFAULT_OSDIR@ +INCLUDES=-I$(INCDIR) -I$(OSDIR) -I$(DEFOSDIR) + +# DO NOT REMOVE diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/locks/os2/proc_mutex.c b/rubbos/app/httpd-2.0.64/srclib/apr/locks/os2/proc_mutex.c new file mode 100644 index 00000000..5a493563 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/locks/os2/proc_mutex.c @@ -0,0 +1,234 @@ +/* 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. + */ + +#include "apr_general.h" +#include "apr_lib.h" +#include "apr_strings.h" +#include "apr_portable.h" +#include "apr_arch_proc_mutex.h" +#include "apr_arch_file_io.h" +#include +#include + +#define CurrentTid (*_threadid) + +static char *fixed_name(const char *fname, apr_pool_t *pool) +{ + char *semname; + + if (fname == NULL) + semname = NULL; + else { + // Semaphores don't live in the file system, fix up the name + while (*fname == '/' || *fname == '\\') { + fname++; + } + + semname = apr_pstrcat(pool, "/SEM32/", fname, NULL); + + if (semname[8] == ':') { + semname[8] = '$'; + } + } + + return semname; +} + + + +APR_DECLARE(apr_status_t) apr_proc_mutex_cleanup(void *vmutex) +{ + apr_proc_mutex_t *mutex = vmutex; + return apr_proc_mutex_destroy(mutex); +} + +APR_DECLARE(const char *) apr_proc_mutex_lockfile(apr_proc_mutex_t *mutex) +{ + return NULL; +} + +APR_DECLARE(const char *) apr_proc_mutex_name(apr_proc_mutex_t *mutex) +{ + return "os2sem"; +} + +APR_DECLARE(const char *) apr_proc_mutex_defname(void) +{ + return "os2sem"; +} + + +APR_DECLARE(apr_status_t) apr_proc_mutex_create(apr_proc_mutex_t **mutex, + const char *fname, + apr_lockmech_e mech, + apr_pool_t *pool) +{ + apr_proc_mutex_t *new; + ULONG rc; + char *semname; + + if (mech != APR_LOCK_DEFAULT) { + return APR_ENOTIMPL; + } + + new = (apr_proc_mutex_t *)apr_palloc(pool, sizeof(apr_proc_mutex_t)); + new->pool = pool; + new->owner = 0; + new->lock_count = 0; + *mutex = new; + + semname = fixed_name(fname, pool); + rc = DosCreateMutexSem(semname, &(new->hMutex), DC_SEM_SHARED, FALSE); + + if (!rc) { + apr_pool_cleanup_register(pool, new, apr_proc_mutex_cleanup, apr_pool_cleanup_null); + } + + return APR_FROM_OS_ERROR(rc); +} + + + +APR_DECLARE(apr_status_t) apr_proc_mutex_child_init(apr_proc_mutex_t **mutex, + const char *fname, + apr_pool_t *pool) +{ + apr_proc_mutex_t *new; + ULONG rc; + char *semname; + + new = (apr_proc_mutex_t *)apr_palloc(pool, sizeof(apr_proc_mutex_t)); + new->pool = pool; + new->owner = 0; + new->lock_count = 0; + + semname = fixed_name(fname, pool); + rc = DosOpenMutexSem(semname, &(new->hMutex)); + *mutex = new; + + if (!rc) { + apr_pool_cleanup_register(pool, new, apr_proc_mutex_cleanup, apr_pool_cleanup_null); + } + + return APR_FROM_OS_ERROR(rc); +} + + + +APR_DECLARE(apr_status_t) apr_proc_mutex_lock(apr_proc_mutex_t *mutex) +{ + ULONG rc = DosRequestMutexSem(mutex->hMutex, SEM_INDEFINITE_WAIT); + + if (rc == 0) { + mutex->owner = CurrentTid; + mutex->lock_count++; + } + + return APR_FROM_OS_ERROR(rc); +} + + + +APR_DECLARE(apr_status_t) apr_proc_mutex_trylock(apr_proc_mutex_t *mutex) +{ + ULONG rc = DosRequestMutexSem(mutex->hMutex, SEM_IMMEDIATE_RETURN); + + if (rc == 0) { + mutex->owner = CurrentTid; + mutex->lock_count++; + } + + return APR_FROM_OS_ERROR(rc); +} + + + +APR_DECLARE(apr_status_t) apr_proc_mutex_unlock(apr_proc_mutex_t *mutex) +{ + ULONG rc; + + if (mutex->owner == CurrentTid && mutex->lock_count > 0) { + mutex->lock_count--; + rc = DosReleaseMutexSem(mutex->hMutex); + return APR_FROM_OS_ERROR(rc); + } + + return APR_SUCCESS; +} + + + +APR_DECLARE(apr_status_t) apr_proc_mutex_destroy(apr_proc_mutex_t *mutex) +{ + ULONG rc; + apr_status_t status = APR_SUCCESS; + + if (mutex->owner == CurrentTid) { + while (mutex->lock_count > 0 && status == APR_SUCCESS) { + status = apr_proc_mutex_unlock(mutex); + } + } + + if (status != APR_SUCCESS) { + return status; + } + + if (mutex->hMutex == 0) { + return APR_SUCCESS; + } + + rc = DosCloseMutexSem(mutex->hMutex); + + if (!rc) { + mutex->hMutex = 0; + } + + return APR_FROM_OS_ERROR(rc); +} + + + +APR_POOL_IMPLEMENT_ACCESSOR(proc_mutex) + + + +/* Implement OS-specific accessors defined in apr_portable.h */ + +APR_DECLARE(apr_status_t) apr_os_proc_mutex_get(apr_os_proc_mutex_t *ospmutex, + apr_proc_mutex_t *pmutex) +{ + *ospmutex = pmutex->hMutex; + return APR_ENOTIMPL; +} + + + +APR_DECLARE(apr_status_t) apr_os_proc_mutex_put(apr_proc_mutex_t **pmutex, + apr_os_proc_mutex_t *ospmutex, + apr_pool_t *pool) +{ + apr_proc_mutex_t *new; + + new = (apr_proc_mutex_t *)apr_palloc(pool, sizeof(apr_proc_mutex_t)); + new->pool = pool; + new->owner = 0; + new->lock_count = 0; + new->hMutex = *ospmutex; + *pmutex = new; + + return APR_SUCCESS; +} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/locks/os2/thread_cond.c b/rubbos/app/httpd-2.0.64/srclib/apr/locks/os2/thread_cond.c new file mode 100644 index 00000000..ec6034f5 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/locks/os2/thread_cond.c @@ -0,0 +1,60 @@ +/* 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. + */ + +#include "apr_general.h" +#include "apr_lib.h" +#include "apr_strings.h" +#include "apr_portable.h" +#include "apr_arch_thread_mutex.h" +#include "apr_arch_thread_cond.h" +#include "apr_arch_file_io.h" +#include + +APR_DECLARE(apr_status_t) apr_thread_cond_create(apr_thread_cond_t **cond, + apr_pool_t *pool) +{ + return APR_ENOTIMPL; +} + +APR_DECLARE(apr_status_t) apr_thread_cond_wait(apr_thread_cond_t *cond, + apr_thread_mutex_t *mutex) +{ + return APR_ENOTIMPL; +} + +APR_DECLARE(apr_status_t) apr_thread_cond_timedwait(apr_thread_cond_t *cond, + apr_thread_mutex_t *mutex, + apr_interval_time_t timeout){ + return APR_ENOTIMPL; +} + +APR_DECLARE(apr_status_t) apr_thread_cond_signal(apr_thread_cond_t *cond) +{ + return APR_ENOTIMPL; +} + +APR_DECLARE(apr_status_t) apr_thread_cond_broadcast(apr_thread_cond_t *cond) +{ + return APR_ENOTIMPL; +} + +APR_DECLARE(apr_status_t) apr_thread_cond_destroy(apr_thread_cond_t *cond) +{ + return APR_ENOTIMPL; +} + +APR_POOL_IMPLEMENT_ACCESSOR(thread_cond) + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/locks/os2/thread_mutex.c b/rubbos/app/httpd-2.0.64/srclib/apr/locks/os2/thread_mutex.c new file mode 100644 index 00000000..5d8436be --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/locks/os2/thread_mutex.c @@ -0,0 +1,102 @@ +/* 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. + */ + +#include "apr_general.h" +#include "apr_lib.h" +#include "apr_strings.h" +#include "apr_portable.h" +#include "apr_arch_thread_mutex.h" +#include "apr_arch_file_io.h" +#include +#include + +static apr_status_t thread_mutex_cleanup(void *themutex) +{ + apr_thread_mutex_t *mutex = themutex; + return apr_thread_mutex_destroy(mutex); +} + + + +/* XXX: Need to respect APR_THREAD_MUTEX_[UN]NESTED flags argument + * or return APR_ENOTIMPL!!! + */ +APR_DECLARE(apr_status_t) apr_thread_mutex_create(apr_thread_mutex_t **mutex, + unsigned int flags, + apr_pool_t *pool) +{ + apr_thread_mutex_t *new_mutex; + ULONG rc; + + new_mutex = (apr_thread_mutex_t *)apr_palloc(pool, sizeof(apr_thread_mutex_t)); + new_mutex->pool = pool; + + rc = DosCreateMutexSem(NULL, &(new_mutex->hMutex), 0, FALSE); + *mutex = new_mutex; + + if (!rc) + apr_pool_cleanup_register(pool, new_mutex, thread_mutex_cleanup, apr_pool_cleanup_null); + + return APR_OS2_STATUS(rc); +} + + + +APR_DECLARE(apr_status_t) apr_thread_mutex_lock(apr_thread_mutex_t *mutex) +{ + ULONG rc = DosRequestMutexSem(mutex->hMutex, SEM_INDEFINITE_WAIT); + return APR_OS2_STATUS(rc); +} + + + +APR_DECLARE(apr_status_t) apr_thread_mutex_trylock(apr_thread_mutex_t *mutex) +{ + ULONG rc = DosRequestMutexSem(mutex->hMutex, SEM_IMMEDIATE_RETURN); + return APR_OS2_STATUS(rc); +} + + + +APR_DECLARE(apr_status_t) apr_thread_mutex_unlock(apr_thread_mutex_t *mutex) +{ + ULONG rc = DosReleaseMutexSem(mutex->hMutex); + return APR_OS2_STATUS(rc); +} + + + +APR_DECLARE(apr_status_t) apr_thread_mutex_destroy(apr_thread_mutex_t *mutex) +{ + ULONG rc; + + if (mutex->hMutex == 0) + return APR_SUCCESS; + + while (DosReleaseMutexSem(mutex->hMutex) == 0); + + rc = DosCloseMutexSem(mutex->hMutex); + + if (!rc) { + mutex->hMutex = 0; + return APR_SUCCESS; + } + + return APR_FROM_OS_ERROR(rc); +} + +APR_POOL_IMPLEMENT_ACCESSOR(thread_mutex) + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/locks/os2/thread_rwlock.c b/rubbos/app/httpd-2.0.64/srclib/apr/locks/os2/thread_rwlock.c new file mode 100644 index 00000000..195a56bd --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/locks/os2/thread_rwlock.c @@ -0,0 +1,200 @@ +/* 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. + */ + +#include "apr_general.h" +#include "apr_lib.h" +#include "apr_strings.h" +#include "apr_portable.h" +#include "apr_arch_thread_rwlock.h" +#include "apr_arch_file_io.h" +#include + +static apr_status_t thread_rwlock_cleanup(void *therwlock) +{ + apr_thread_rwlock_t *rwlock = therwlock; + return apr_thread_rwlock_destroy(rwlock); +} + + + +APR_DECLARE(apr_status_t) apr_thread_rwlock_create(apr_thread_rwlock_t **rwlock, + apr_pool_t *pool) +{ + apr_thread_rwlock_t *new_rwlock; + ULONG rc; + + new_rwlock = (apr_thread_rwlock_t *)apr_palloc(pool, sizeof(apr_thread_rwlock_t)); + new_rwlock->pool = pool; + new_rwlock->readers = 0; + + rc = DosCreateMutexSem(NULL, &(new_rwlock->write_lock), 0, FALSE); + + if (rc) + return APR_FROM_OS_ERROR(rc); + + rc = DosCreateEventSem(NULL, &(new_rwlock->read_done), 0, FALSE); + + if (rc) + return APR_FROM_OS_ERROR(rc); + + *rwlock = new_rwlock; + + if (!rc) + apr_pool_cleanup_register(pool, new_rwlock, thread_rwlock_cleanup, + apr_pool_cleanup_null); + + return APR_FROM_OS_ERROR(rc); +} + + + +APR_DECLARE(apr_status_t) apr_thread_rwlock_rdlock(apr_thread_rwlock_t *rwlock) +{ + ULONG rc, posts; + + rc = DosRequestMutexSem(rwlock->write_lock, SEM_INDEFINITE_WAIT); + + if (rc) + return APR_FROM_OS_ERROR(rc); + + /* We've successfully acquired the writer mutex so we can't be locked + * for write which means it's ok to add a reader lock. The writer mutex + * doubles as race condition protection for the readers counter. + */ + rwlock->readers++; + DosResetEventSem(rwlock->read_done, &posts); + rc = DosReleaseMutexSem(rwlock->write_lock); + return APR_FROM_OS_ERROR(rc); +} + + + +APR_DECLARE(apr_status_t) apr_thread_rwlock_tryrdlock(apr_thread_rwlock_t *rwlock) +{ + /* As above but with different wait time */ + ULONG rc, posts; + + rc = DosRequestMutexSem(rwlock->write_lock, SEM_IMMEDIATE_RETURN); + + if (rc) + return APR_FROM_OS_ERROR(rc); + + rwlock->readers++; + DosResetEventSem(rwlock->read_done, &posts); + rc = DosReleaseMutexSem(rwlock->write_lock); + return APR_FROM_OS_ERROR(rc); +} + + + +APR_DECLARE(apr_status_t) apr_thread_rwlock_wrlock(apr_thread_rwlock_t *rwlock) +{ + ULONG rc; + + rc = DosRequestMutexSem(rwlock->write_lock, SEM_INDEFINITE_WAIT); + + if (rc) + return APR_FROM_OS_ERROR(rc); + + /* We've got the writer lock but we have to wait for all readers to + * unlock before it's ok to use it + */ + + if (rwlock->readers) { + rc = DosWaitEventSem(rwlock->read_done, SEM_INDEFINITE_WAIT); + + if (rc) + DosReleaseMutexSem(rwlock->write_lock); + } + + return APR_FROM_OS_ERROR(rc); +} + + + +APR_DECLARE(apr_status_t) apr_thread_rwlock_trywrlock(apr_thread_rwlock_t *rwlock) +{ + ULONG rc; + + rc = DosRequestMutexSem(rwlock->write_lock, SEM_IMMEDIATE_RETURN); + + if (rc) + return APR_FROM_OS_ERROR(rc); + + /* We've got the writer lock but we have to wait for all readers to + * unlock before it's ok to use it + */ + + if (rwlock->readers) { + /* There are readers active, give up */ + DosReleaseMutexSem(rwlock->write_lock); + rc = ERROR_TIMEOUT; + } + + return APR_FROM_OS_ERROR(rc); +} + + + +APR_DECLARE(apr_status_t) apr_thread_rwlock_unlock(apr_thread_rwlock_t *rwlock) +{ + ULONG rc; + + /* First, guess that we're unlocking a writer */ + rc = DosReleaseMutexSem(rwlock->write_lock); + + if (rc == ERROR_NOT_OWNER) { + /* Nope, we must have a read lock */ + if (rwlock->readers) { + DosEnterCritSec(); + rwlock->readers--; + + if (rwlock->readers == 0) { + DosPostEventSem(rwlock->read_done); + } + + DosExitCritSec(); + rc = 0; + } + } + + return APR_FROM_OS_ERROR(rc); +} + + + +APR_DECLARE(apr_status_t) apr_thread_rwlock_destroy(apr_thread_rwlock_t *rwlock) +{ + ULONG rc; + + if (rwlock->write_lock == 0) + return APR_SUCCESS; + + while (DosReleaseMutexSem(rwlock->write_lock) == 0); + + rc = DosCloseMutexSem(rwlock->write_lock); + + if (!rc) { + rwlock->write_lock = 0; + DosCloseEventSem(rwlock->read_done); + return APR_SUCCESS; + } + + return APR_FROM_OS_ERROR(rc); +} + +APR_POOL_IMPLEMENT_ACCESSOR(thread_rwlock) + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/.libs/global_mutex.o b/rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/.libs/global_mutex.o new file mode 100644 index 0000000000000000000000000000000000000000..3eebee5d3132064c0e29880b2378c3df6527a8ec GIT binary patch literal 18376 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 Bd@KL} literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/.libs/thread_cond.o b/rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/.libs/thread_cond.o new file mode 100644 index 0000000000000000000000000000000000000000..bd2f15fec631ec5333775b17f88e4c78fe1792ff GIT binary patch literal 15904 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 KF-H93_47X#0EuD% literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/.libs/thread_mutex.o b/rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/.libs/thread_mutex.o new file mode 100644 index 0000000000000000000000000000000000000000..68df9b5e2de8678a5ebf2998309f0d5f2ff1685e GIT binary patch literal 14992 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/.libs/thread_rwlock.o b/rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/.libs/thread_rwlock.o new file mode 100644 index 0000000000000000000000000000000000000000..3b39fdc563f6f470a7b248facb6b7c268d568fce GIT binary patch literal 12440 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 eJ)GCEDFf&Aproc_mutex); + +#if APR_HAS_THREADS + if (m->thread_mutex) { + if (rv != APR_SUCCESS) { + (void)apr_thread_mutex_destroy(m->thread_mutex); + } + else { + rv = apr_thread_mutex_destroy(m->thread_mutex); + } + } +#endif /* APR_HAS_THREADS */ + + return rv; +} + +APR_DECLARE(apr_status_t) apr_global_mutex_create(apr_global_mutex_t **mutex, + const char *fname, + apr_lockmech_e mech, + apr_pool_t *pool) +{ + apr_status_t rv; + apr_global_mutex_t *m; + + m = (apr_global_mutex_t *)apr_palloc(pool, sizeof(*m)); + m->pool = pool; + + rv = apr_proc_mutex_create(&m->proc_mutex, fname, mech, m->pool); + if (rv != APR_SUCCESS) { + return rv; + } + +#if APR_HAS_THREADS + if (m->proc_mutex->inter_meth->flags & APR_PROCESS_LOCK_MECH_IS_GLOBAL) { + m->thread_mutex = NULL; /* We don't need a thread lock. */ + } + else { + rv = apr_thread_mutex_create(&m->thread_mutex, + APR_THREAD_MUTEX_DEFAULT, m->pool); + if (rv != APR_SUCCESS) { + rv = apr_proc_mutex_destroy(m->proc_mutex); + return rv; + } + } +#endif /* APR_HAS_THREADS */ + + apr_pool_cleanup_register(m->pool, (void *)m, + global_mutex_cleanup, apr_pool_cleanup_null); + *mutex = m; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_global_mutex_child_init( + apr_global_mutex_t **mutex, + const char *fname, + apr_pool_t *pool) +{ + apr_status_t rv; + + rv = apr_proc_mutex_child_init(&((*mutex)->proc_mutex), fname, pool); + return rv; +} + +APR_DECLARE(apr_status_t) apr_global_mutex_lock(apr_global_mutex_t *mutex) +{ + apr_status_t rv; + +#if APR_HAS_THREADS + if (mutex->thread_mutex) { + rv = apr_thread_mutex_lock(mutex->thread_mutex); + if (rv != APR_SUCCESS) { + return rv; + } + } +#endif /* APR_HAS_THREADS */ + + rv = apr_proc_mutex_lock(mutex->proc_mutex); + +#if APR_HAS_THREADS + if (rv != APR_SUCCESS) { + if (mutex->thread_mutex) { + (void)apr_thread_mutex_unlock(mutex->thread_mutex); + } + } +#endif /* APR_HAS_THREADS */ + + return rv; +} + +APR_DECLARE(apr_status_t) apr_global_mutex_trylock(apr_global_mutex_t *mutex) +{ + apr_status_t rv; + +#if APR_HAS_THREADS + if (mutex->thread_mutex) { + rv = apr_thread_mutex_trylock(mutex->thread_mutex); + if (rv != APR_SUCCESS) { + return rv; + } + } +#endif /* APR_HAS_THREADS */ + + rv = apr_proc_mutex_trylock(mutex->proc_mutex); + +#if APR_HAS_THREADS + if (rv != APR_SUCCESS) { + if (mutex->thread_mutex) { + (void)apr_thread_mutex_unlock(mutex->thread_mutex); + } + } +#endif /* APR_HAS_THREADS */ + + return rv; +} + +APR_DECLARE(apr_status_t) apr_global_mutex_unlock(apr_global_mutex_t *mutex) +{ + apr_status_t rv; + + rv = apr_proc_mutex_unlock(mutex->proc_mutex); +#if APR_HAS_THREADS + if (mutex->thread_mutex) { + if (rv != APR_SUCCESS) { + (void)apr_thread_mutex_unlock(mutex->thread_mutex); + } + else { + rv = apr_thread_mutex_unlock(mutex->thread_mutex); + } + } +#endif /* APR_HAS_THREADS */ + return rv; +} + +APR_DECLARE(apr_status_t) apr_os_global_mutex_get(apr_os_global_mutex_t *ospmutex, + apr_global_mutex_t *pmutex) +{ + ospmutex->pool = pmutex->pool; + ospmutex->proc_mutex = pmutex->proc_mutex; +#if APR_HAS_THREADS + ospmutex->thread_mutex = pmutex->thread_mutex; +#endif + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_global_mutex_destroy(apr_global_mutex_t *mutex) +{ + return apr_pool_cleanup_run(mutex->pool, mutex, global_mutex_cleanup); +} + +APR_POOL_IMPLEMENT_ACCESSOR(global_mutex) diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/global_mutex.lo b/rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/global_mutex.lo new file mode 100644 index 00000000..d0fa5457 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/global_mutex.lo @@ -0,0 +1,12 @@ +# global_mutex.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/global_mutex.o' + +# Name of the non-PIC object. +non_pic_object='global_mutex.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/global_mutex.o b/rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/global_mutex.o new file mode 100644 index 0000000000000000000000000000000000000000..7e44179b0effcccb8918d81f4c2d893ca1575a03 GIT binary patch literal 18336 zcmb_j33yz^k$!JRlE)f*G?uWCv4iCcM6gDZksXK2k`H-=jV0@{9UtS7G?E6S88L^D zZLZh`qG-)$44VbwaF}dDU`bd4giTo1V6Np1x$qa0U1yVzkc2N72(Sr@$3#|;tsAau5FGDvdvcZ~em0F$c!Lg5m zd*1Q{$FKIhi5GT@u{$lxOqS-(ye7>;_AV058U%$8vVff$Bv*- zp~5f}V@Gk?eSwnMd(l6f=-*b~|8qTp<3+)-Nx|_Z2>NOWZj&GG{<^~uvun`bAgtE- zG8J1Dli>KIBj1{0Sq0c>c~t7;}%97>%VY zmq&5RfNRe-=+NX|Bwc!7p{L06Rb;gSCE)(qazK<`f5Dn3fL4YJE=H2*bs8@690W*> zDriAcjjAfxvJ9r8M{V1X85KGYr8T}CagV0E5uc*zKE(Z+9%u#n6ir8wF4y!W&jMXx zO|B~VQWOjo17{Un@e{ae^2!W)6;9Uj;v9E?=#*VRoJk&Ejb2h9C|FZby3l8%6Pli8 zqXtc%V&4d~nr_iT6e;pN3o3l5U7?efyas#;u$uRr^*i8IP--VvPJz`_6PP>)NuuYX zUmj5PBHaB2#S51~-!xRAuePFH>grb40(C9aCW_A~1$kw?cu6Oa%Gy%zWsd-@ta%d| zYu@B6=+|NQrjXX5_NH+<68et= zK*(%lYBggkW~pXeifPbHfntK1DO60WW{MQEQ8ONUH+Z;RGsX5-fEm!t6qWPCn(-?p zrI}JY0v?QNrrfRv<{HhMYBvM3TQe2*4WMn0W@g#91M?NlEUHr)e4 zYNp=RSVV~qK8CQyn_mT*cKJm}>xA>JLAp}QtbGIMDotPPg}LY*<6ZXzc(>G={s`Pq zWjW5H96@jcO{*SMqT-3#;IJZ8TI6{Pgj68Bt>*z*&siv7SMy-xzK$1Y_QCH#xU}JFB(Z5WpyK1OHCWHF>E2qE7QiaU7O`&h`5gB7 zb4ngAmx3>gLHX%+r)vbR9d^)iIUAoB@Onx8husExQLRxF)}Yqnw@1&vlsZv zyl&r2-!!{)k{?R4Yrf_6UI-Apa1aUAqoCY!`_A>A=WT{Za$yOGK;6I_@{`JJx6kXv zZW~z7R7Z9xh)q7#&h!;$`rsLC+s$P-V#*w=xvU0cr;?dMRO>qfPzY%ms5>8$++ScQ znpOqqEI7ZHl13PU*2>sXc-rFBr%$)foT06h7b<*$(L&ZNVpMh>v6grN( zAQCg`Ew@L{8QIgucH7o8yAA|rYVz-w&p>Wgz+N_E0+pWwNeFVCn&#8<#^R zn4M7$HBw8FzBz^)AUPK#DfG)`U>xRU+dE(RKHmWgab6l+V1gPt!-P-{(}S9N8v@$4 zI+;}2qo8&s7m{>=^`6~%2Xp5WYFq70a`n@K)bHF>H3aT#XJ9Mq!lNiQ+iGR<0*wIF z#U!f-De81?4MYX$4ijSXAqU#V5)I$fRks;|}U~ZVg0jr@L*fXYxS@+R7xGL8I#(qd&_CGHDuJ{~3(7vC;23 zy1JM&jkY;Pf1D9y(lpwZV{``%__8yw^%)|6nSqFMZYiQhGa^jh??CPB;wu@5DCc&Z zsNc{XQi{p92+E)5Jn)aszz!zOfw@bYJ8*rzfw{|bf-HUFSnOo79v%YNU>h;Hn4tXL zd#QJ-GqAOS$g?vLlM5ZFUE9fA8>s7IN2HU4iLF312K7p z1LZiipSr%`h;%ZEk4tP&&zO9SAng=$_<4r}nS41*P!}RHE1}q=+Y&jCH2*V(O7!4x<8h#>5it7mJ%6^cGvXx^yG@v2bS`9 zD-fuG|43UlR})V34Ai7!(NV3Bg{=O;cz1X(G?Y$7Mgu+Qb!x|OBpDb$_mZjJ-bf$N zFoEIJKq3dy5U5;C$D%` z2MK4*AzQoXq5-MsP$c7=a-%Og7zssj1|S2`RwNv_(V0viO=mcsNQJuxNe4uUrQu9R znFD9U3j5}pR@ZHE7hmMw*|*O>)(6rU1jgvt^&xVP$=Hl z7fM;7=9UnyP-r-nutGfp;b=^RGSmb8sfa?&u!qvI!FbQ5S{fD(lqI7(Bd8M=A~FKE z@L;q*N1YlJN)A9Yy3>7DY9L~UJJ$@E?@1>TAsid&wP0LdBmqPygeI-tXd=>+ipFzn z>G^?ps5_jDST)`8RBA91i}YNYtVyK1yW`24@bGZWKq@udTfHby8(30blT7sBzJVpI zL32r+|AX;Zf2F#lV@a4*q_+}(JP3tik=Dx69uAsVy=LLeSV zU?M`8)OZMX!ipz{)h@CUk--T1*x1?@THCT>O{fX4Rwi>Tl~J*{(r$)~7sy%4NUS%b zrhQX;SNp1qE#g_=reD3Th; zbtXF}dSFtq^l&JVj#;5NXoIXvMj&o{hrCl2A~YCHrXX7A0;SRNwQE8xO-%{{i%aUM z8!Ze)pa_8T&TtjPP%_sa%2JRF_nw0T!oBsFK*RB*n)^^VacLxhE0>%3u%xL(e20~_ z$RC5`uD)+*k@Fk7LacyGk&Q@%pkxIBj8f^COIJvZK1!$S}uHQ{7*RE1yO=a3`CoWAZ)^)5kvP30r44zz= zZ5aZuN>4=T=sAcEeJpb$(SZN-M7Js=E3>ZT(pqRfo}2)D_O0JKHRK z)Njw6GRcF-{93@(mruB>F9(f2|8=fLU&S8xYG37+VqXOSjXqDax7k;*LXj4JGiW7! zU&s4$pZ^9|&{wg~y~D`bG_+j`# z(lv$d^Wpvg(W~&Td|HVe&$JPA08@LVF|K>3&F-gTVpE{agegDAR{px_h(wDaB9*^^f zU#N2Cj~}+AP8@kI+28iR%s&pY`RqSH_BqaI-wXd_{#^qY+Gjt3RP7cjB7cRSoXp0) z@_igS^Nl|+N00ivIhbS-;_){dG~(PIqw&o1oyRf%9Uu@BVX_X>_+c@C=g;H62}Hj5 zJxB55dX4eJl;ZIm*J*&sy$6t0I}fjx^?iMFuEL$XzN2u}S$fERQjT>S|8Pm#$DGP% z|4}Rq(9RQqk@mGz?iJ+o?YUK@$hGX&f5ws1 z;dY{u-Q`w0E*nG6t#(2_oPRFK?sMxu8OsKh9-KvPb6ZrrjIISh=aa@CS@PkXfR{pi z8sLsiom=2O1po5Mk4}K!FaeHvpHI)@6X5vU3Hoy!?%4RT@Gj8#^h|*iLHQF(I`c#Q zT)^|mFP#8iI|1HH`WxVmO`W^oe&q!6Uz-5GpY-r2WX{8n~J0Ct&VsYicvX9S;k5B4G$1#;|n2(Ha zRiktomKu24!139~@?Rqy{=P)LOAzbSC&bY?qgj8_>rz85myZs4aIIMxkpsDC#6WBE}7H}&A3!eT@DIq;9=pD=J!{zJlL9I8+W zG}L3p|22hb++43W4IIxJZ1>R#?0#(E^9^}E{-QtTQI6|3;&?7Rgokrzc%H$=_>H81 zj`0ruz7})pADYLxaiimll1E+KYKdU|>hC`R`+~q9q(cqYW0tQboa;T~t%R=?daj_j zvuGU*D)46r|4)IRPk!=G)vUjs@DGLj7syZEzbwC#lCFgOV*H;7pDFMl z;b#i`9$MdX1b!>Y^LGx`e+kKR9bo(!@_U=m(?j@9flnv>*9*Ls_!|UXL-D*x;CGUq zI|P0o$=@gNTL}Mwz_$|5KO*zIE+YSr3VFtVCGc<4I=(pp{%3(-LjLn6XS-L>KAK7X zGX5*d2R!FsWBgXqd#1pT6J9Owr+M84K2G=-1-^m&X%P4ih+iXcuD@Lq;N1e}IK%}0 zeTvUcfnPxUbproq9Tw|=!0RY(w+nm&>AzRtmr&ezejMi&w7yRYdB$HBIM3^s0>6j! zzaj9e$j|o#K0xvRRN!xu|HZU!>?hkT7x+4|J6GTwpMbz`BK_wIyoLN}61YwNwF&%D z(z8wA|4Qq{b%p&uo8mko6{wZxA@g>o$QOqBws`;4hIs{G4Qe{z~(GT*z-G zyDtd*ank>q!2e3||Bb-;`@`D;|0&6TB=BF5-AQDJ{X9%@E))1=G=8?ghlyV(a6Tt} zQQ-WS4NU^?Cca(Zd&r;d0xzI=4hg)8@SOtZbJFz!|31a%W`W;EdhQZ;FZMxm%y(kyKf780mbKIfiEO{GR=e6_XO#IKh{-^@ec`~ zC-7F%Q!DVZ$=(G550m^Ff!{~+Z2~W(yxJ!4A5uIo5%@PqenjBM2!B}MT;E<4_%70a zRN!3qek*XUw#Ap<9M?Ec>-Taex4=pyD9!P0>7H%`P|3)KOsCQeZ2 zm+b=YCOv}!KTi0lz;C4evRB}b(E9Ed_#a8nL4jXKcq#cM=T#-}bBJF=cXWe7rt-L1 z$lp!++YOv+Bo5d<0Ui^0T4{$rVk4aG;yXFEYXnZ8cddN_U#!KgyA1vKe#d{Mc%P7O zAo(YSJfG`cG;o~Pt0e!bfunwYE*~>+ly9PSJZ|79e+I4N9}FDj*-ze2yk5Lt{vzaS zX>le|&`}=Ae>ZAx>n%NP{$#G zA0zw`!g;=*r~Q9e$R8*9*MvN;*RKs6$@!F@Zy30_UMCD3$*m;+zJa4W$N!{(Bl$Iw z_u&r_&^VrNY1TTMaGqC?;=fqPpCI|QLZ0W83HD+u2s z@P&lmXz0f{{Fds=*M&TPhkj7Vv;U77IQrj9em*bo2MB*f=-)v8ye{wo!hbJt{_gRi zp&$J}O7XXGL7?Gqg!ub+1>wA2?EhQ?NB{pqe%1;+MtQrKaMpi_{9G>Z#|Uo`IDUV} zw$;#&{(nO8?-%m?J^m^o{}s|RF7OX1f9??YH1hvDLO*}kKP==qKF=FC#^-s`^NP^J z50l?X948CyT|*DfH%M{*Sjy8nmZ1_&178E6Xy?x*>FLEv4yE&}KGu?+(6ruYvE zJWh4_dV%A&QEc}Kd>ZL_QQ)^~aqAs{PpA3%>BA+@_gRY10)byjdd?O2BEnk){tEfu zEAVmBzeC`BZo5I?{Cho3Ppu2nXd1u$V#Bc0lobCbS_g?&s$MN?%6AC7f%rQGew_G+ m1kUyLb%ApoDpool, mutex, apr_proc_mutex_cleanup); +} + +static apr_status_t proc_mutex_no_tryacquire(apr_proc_mutex_t *new_mutex) +{ + return APR_ENOTIMPL; +} + +#if APR_HAS_POSIXSEM_SERIALIZE + +#ifndef SEM_FAILED +#define SEM_FAILED (-1) +#endif + +static void proc_mutex_posix_setup(void) +{ +} + +static apr_status_t proc_mutex_posix_cleanup(void *mutex_) +{ + apr_proc_mutex_t *mutex=mutex_; + apr_status_t stat = APR_SUCCESS; + + if (mutex->interproc->filedes != -1) { + if (sem_close((sem_t *)mutex->interproc->filedes) < 0) { + stat = errno; + } + } + return stat; +} + +static apr_status_t proc_mutex_posix_create(apr_proc_mutex_t *new_mutex, + const char *fname) +{ + sem_t *psem; + apr_status_t stat; + char semname[31]; + apr_time_t now; + unsigned long sec; + unsigned long usec; + + new_mutex->interproc = apr_palloc(new_mutex->pool, + sizeof(*new_mutex->interproc)); + new_mutex->interproc->filedes = -1; + /* + * This bogusness is to follow what appears to be the + * lowest common denominator in Posix semaphore naming: + * - start with '/' + * - be at most 14 chars + * - be unique and not match anything on the filesystem + * + * Because of this, we ignore fname, and try our + * own naming system. We tuck the name away, since it might + * be useful for debugging. to make this as robust as possible, + * we initially try something larger (and hopefully more unique) + * and gracefully fail down to the LCD above. + * + * NOTE: Darwin (Mac OS X) seems to be the most restrictive + * implementation. Versions previous to Darwin 6.2 had the 14 + * char limit, but later rev's allow up to 31 characters. + * + * FIXME: There is a small window of opportunity where + * instead of getting a new semaphore descriptor, we get + * a previously obtained one. This can happen if the requests + * are made at the "same time" and in the small span of time between + * the sem_open and the sem_unlink. Use of O_EXCL does not + * help here however... + * + */ + now = apr_time_now(); + sec = apr_time_sec(now); + usec = apr_time_usec(now); + apr_snprintf(semname, sizeof(semname), "/ApR.%lxZ%lx", sec, usec); + psem = sem_open((const char *) semname, O_CREAT, 0644, 1); + if ((psem == (sem_t *)SEM_FAILED) && (errno == ENAMETOOLONG)) { + /* Oh well, good try */ + semname[13] = '\0'; + psem = sem_open((const char *) semname, O_CREAT, 0644, 1); + } + + if (psem == (sem_t *)SEM_FAILED) { + stat = errno; + proc_mutex_posix_cleanup(new_mutex); + return stat; + } + /* Ahhh. The joys of Posix sems. Predelete it... */ + sem_unlink((const char *) semname); + new_mutex->interproc->filedes = (int)psem; /* Ugg */ + new_mutex->fname = apr_pstrdup(new_mutex->pool, semname); + apr_pool_cleanup_register(new_mutex->pool, (void *)new_mutex, + apr_proc_mutex_cleanup, + apr_pool_cleanup_null); + return APR_SUCCESS; +} + +static apr_status_t proc_mutex_posix_acquire(apr_proc_mutex_t *mutex) +{ + int rc; + + if ((rc = sem_wait((sem_t *)mutex->interproc->filedes)) < 0) { + return errno; + } + mutex->curr_locked = 1; + return APR_SUCCESS; +} + +static apr_status_t proc_mutex_posix_release(apr_proc_mutex_t *mutex) +{ + int rc; + + mutex->curr_locked = 0; + if ((rc = sem_post((sem_t *)mutex->interproc->filedes)) < 0) { + return errno; + } + return APR_SUCCESS; +} + +static apr_status_t proc_mutex_posix_child_init(apr_proc_mutex_t **mutex, + apr_pool_t *cont, + const char *fname) +{ + return APR_SUCCESS; +} + +const apr_proc_mutex_unix_lock_methods_t apr_proc_mutex_unix_posix_methods = +{ +#if APR_PROCESS_LOCK_IS_GLOBAL || !APR_HAS_THREADS || defined(POSIXSEM_IS_GLOBAL) + APR_PROCESS_LOCK_MECH_IS_GLOBAL, +#else + 0, +#endif + proc_mutex_posix_create, + proc_mutex_posix_acquire, + proc_mutex_no_tryacquire, + proc_mutex_posix_release, + proc_mutex_posix_cleanup, + proc_mutex_posix_child_init, + "posixsem" +}; + +#endif /* Posix sem implementation */ + +#if APR_HAS_SYSVSEM_SERIALIZE + +static struct sembuf proc_mutex_op_on; +static struct sembuf proc_mutex_op_off; + +static void proc_mutex_sysv_setup(void) +{ + proc_mutex_op_on.sem_num = 0; + proc_mutex_op_on.sem_op = -1; + proc_mutex_op_on.sem_flg = SEM_UNDO; + proc_mutex_op_off.sem_num = 0; + proc_mutex_op_off.sem_op = 1; + proc_mutex_op_off.sem_flg = SEM_UNDO; +} + +static apr_status_t proc_mutex_sysv_cleanup(void *mutex_) +{ + apr_proc_mutex_t *mutex=mutex_; + union semun ick; + + if (mutex->interproc->filedes != -1) { + ick.val = 0; + semctl(mutex->interproc->filedes, 0, IPC_RMID, ick); + } + return APR_SUCCESS; +} + +static apr_status_t proc_mutex_sysv_create(apr_proc_mutex_t *new_mutex, + const char *fname) +{ + union semun ick; + apr_status_t rv; + + new_mutex->interproc = apr_palloc(new_mutex->pool, sizeof(*new_mutex->interproc)); + new_mutex->interproc->filedes = semget(IPC_PRIVATE, 1, IPC_CREAT | 0600); + + if (new_mutex->interproc->filedes < 0) { + rv = errno; + proc_mutex_sysv_cleanup(new_mutex); + return rv; + } + ick.val = 1; + if (semctl(new_mutex->interproc->filedes, 0, SETVAL, ick) < 0) { + rv = errno; + proc_mutex_sysv_cleanup(new_mutex); + return rv; + } + new_mutex->curr_locked = 0; + apr_pool_cleanup_register(new_mutex->pool, + (void *)new_mutex, apr_proc_mutex_cleanup, + apr_pool_cleanup_null); + return APR_SUCCESS; +} + +static apr_status_t proc_mutex_sysv_acquire(apr_proc_mutex_t *mutex) +{ + int rc; + + do { + rc = semop(mutex->interproc->filedes, &proc_mutex_op_on, 1); + } while (rc < 0 && errno == EINTR); + if (rc < 0) { + return errno; + } + mutex->curr_locked = 1; + return APR_SUCCESS; +} + +static apr_status_t proc_mutex_sysv_release(apr_proc_mutex_t *mutex) +{ + int rc; + + mutex->curr_locked = 0; + do { + rc = semop(mutex->interproc->filedes, &proc_mutex_op_off, 1); + } while (rc < 0 && errno == EINTR); + if (rc < 0) { + return errno; + } + return APR_SUCCESS; +} + +static apr_status_t proc_mutex_sysv_child_init(apr_proc_mutex_t **mutex, apr_pool_t *cont, const char *fname) +{ + return APR_SUCCESS; +} + +const apr_proc_mutex_unix_lock_methods_t apr_proc_mutex_unix_sysv_methods = +{ +#if APR_PROCESS_LOCK_IS_GLOBAL || !APR_HAS_THREADS || defined(SYSVSEM_IS_GLOBAL) + APR_PROCESS_LOCK_MECH_IS_GLOBAL, +#else + 0, +#endif + proc_mutex_sysv_create, + proc_mutex_sysv_acquire, + proc_mutex_no_tryacquire, + proc_mutex_sysv_release, + proc_mutex_sysv_cleanup, + proc_mutex_sysv_child_init, + "sysvsem" +}; + +#endif /* SysV sem implementation */ + +#if APR_HAS_PROC_PTHREAD_SERIALIZE + +static void proc_mutex_proc_pthread_setup(void) +{ +} + +static apr_status_t proc_mutex_proc_pthread_cleanup(void *mutex_) +{ + apr_proc_mutex_t *mutex=mutex_; + apr_status_t rv; + + if (mutex->curr_locked == 1) { + if ((rv = pthread_mutex_unlock(mutex->pthread_interproc))) { +#ifdef PTHREAD_SETS_ERRNO + rv = errno; +#endif + return rv; + } + if (munmap((caddr_t)mutex->pthread_interproc, sizeof(pthread_mutex_t))){ + return errno; + } + } + return APR_SUCCESS; +} + +static apr_status_t proc_mutex_proc_pthread_create(apr_proc_mutex_t *new_mutex, + const char *fname) +{ + apr_status_t rv; + int fd; + pthread_mutexattr_t mattr; + + fd = open("/dev/zero", O_RDWR); + if (fd < 0) { + return errno; + } + + new_mutex->pthread_interproc = (pthread_mutex_t *)mmap( + (caddr_t) 0, + sizeof(pthread_mutex_t), + PROT_READ | PROT_WRITE, MAP_SHARED, + fd, 0); + if (new_mutex->pthread_interproc == (pthread_mutex_t *) (caddr_t) -1) { + return errno; + } + close(fd); + if ((rv = pthread_mutexattr_init(&mattr))) { +#ifdef PTHREAD_SETS_ERRNO + rv = errno; +#endif + proc_mutex_proc_pthread_cleanup(new_mutex); + return rv; + } + if ((rv = pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED))) { +#ifdef PTHREAD_SETS_ERRNO + rv = errno; +#endif + proc_mutex_proc_pthread_cleanup(new_mutex); + return rv; + } + +#ifdef HAVE_PTHREAD_MUTEX_ROBUST + if ((rv = pthread_mutexattr_setrobust_np(&mattr, + PTHREAD_MUTEX_ROBUST_NP))) { +#ifdef PTHREAD_SETS_ERRNO + rv = errno; +#endif + proc_mutex_proc_pthread_cleanup(new_mutex); + return rv; + } + if ((rv = pthread_mutexattr_setprotocol(&mattr, PTHREAD_PRIO_INHERIT))) { +#ifdef PTHREAD_SETS_ERRNO + rv = errno; +#endif + proc_mutex_proc_pthread_cleanup(new_mutex); + return rv; + } +#endif /* HAVE_PTHREAD_MUTEX_ROBUST */ + + if ((rv = pthread_mutex_init(new_mutex->pthread_interproc, &mattr))) { +#ifdef PTHREAD_SETS_ERRNO + rv = errno; +#endif + proc_mutex_proc_pthread_cleanup(new_mutex); + return rv; + } + + if ((rv = pthread_mutexattr_destroy(&mattr))) { +#ifdef PTHREAD_SETS_ERRNO + rv = errno; +#endif + proc_mutex_proc_pthread_cleanup(new_mutex); + return rv; + } + + new_mutex->curr_locked = 0; + apr_pool_cleanup_register(new_mutex->pool, + (void *)new_mutex, + apr_proc_mutex_cleanup, + apr_pool_cleanup_null); + return APR_SUCCESS; +} + +static apr_status_t proc_mutex_proc_pthread_acquire(apr_proc_mutex_t *mutex) +{ + apr_status_t rv; + + if ((rv = pthread_mutex_lock(mutex->pthread_interproc))) { +#ifdef PTHREAD_SETS_ERRNO + rv = errno; +#endif +#ifdef HAVE_PTHREAD_MUTEX_ROBUST + /* Okay, our owner died. Let's try to make it consistent again. */ + if (rv == EOWNERDEAD) { + pthread_mutex_consistent_np(mutex->pthread_interproc); + } + else + return rv; +#else + return rv; +#endif + } + mutex->curr_locked = 1; + return APR_SUCCESS; +} + +/* TODO: Add proc_mutex_proc_pthread_tryacquire(apr_proc_mutex_t *mutex) */ + +static apr_status_t proc_mutex_proc_pthread_release(apr_proc_mutex_t *mutex) +{ + apr_status_t rv; + + mutex->curr_locked = 0; + if ((rv = pthread_mutex_unlock(mutex->pthread_interproc))) { +#ifdef PTHREAD_SETS_ERRNO + rv = errno; +#endif + return rv; + } + return APR_SUCCESS; +} + +static apr_status_t proc_mutex_proc_pthread_child_init(apr_proc_mutex_t **mutex, + apr_pool_t *cont, + const char *fname) +{ + return APR_SUCCESS; +} + +const apr_proc_mutex_unix_lock_methods_t apr_proc_mutex_unix_proc_pthread_methods = +{ + APR_PROCESS_LOCK_MECH_IS_GLOBAL, + proc_mutex_proc_pthread_create, + proc_mutex_proc_pthread_acquire, + proc_mutex_no_tryacquire, + proc_mutex_proc_pthread_release, + proc_mutex_proc_pthread_cleanup, + proc_mutex_proc_pthread_child_init, + "pthread" +}; + +#endif + +#if APR_HAS_FCNTL_SERIALIZE + +static struct flock proc_mutex_lock_it; +static struct flock proc_mutex_unlock_it; + +static apr_status_t proc_mutex_fcntl_release(apr_proc_mutex_t *); + +static void proc_mutex_fcntl_setup(void) +{ + proc_mutex_lock_it.l_whence = SEEK_SET; /* from current point */ + proc_mutex_lock_it.l_start = 0; /* -"- */ + proc_mutex_lock_it.l_len = 0; /* until end of file */ + proc_mutex_lock_it.l_type = F_WRLCK; /* set exclusive/write lock */ + proc_mutex_lock_it.l_pid = 0; /* pid not actually interesting */ + proc_mutex_unlock_it.l_whence = SEEK_SET; /* from current point */ + proc_mutex_unlock_it.l_start = 0; /* -"- */ + proc_mutex_unlock_it.l_len = 0; /* until end of file */ + proc_mutex_unlock_it.l_type = F_UNLCK; /* set exclusive/write lock */ + proc_mutex_unlock_it.l_pid = 0; /* pid not actually interesting */ +} + +static apr_status_t proc_mutex_fcntl_cleanup(void *mutex_) +{ + apr_status_t status; + apr_proc_mutex_t *mutex=mutex_; + + if (mutex->curr_locked == 1) { + status = proc_mutex_fcntl_release(mutex); + if (status != APR_SUCCESS) + return status; + } + if (mutex->interproc) { /* if it was opened successfully */ + apr_file_close(mutex->interproc); + } + return APR_SUCCESS; +} + +static apr_status_t proc_mutex_fcntl_create(apr_proc_mutex_t *new_mutex, + const char *fname) +{ + int rv; + + if (fname) { + new_mutex->fname = apr_pstrdup(new_mutex->pool, fname); + rv = apr_file_open(&new_mutex->interproc, new_mutex->fname, + APR_CREATE | APR_WRITE | APR_EXCL, + APR_UREAD | APR_UWRITE | APR_GREAD | APR_WREAD, + new_mutex->pool); + } + else { + new_mutex->fname = apr_pstrdup(new_mutex->pool, "/tmp/aprXXXXXX"); + rv = apr_file_mktemp(&new_mutex->interproc, new_mutex->fname, + APR_CREATE | APR_WRITE | APR_EXCL, + new_mutex->pool); + } + + if (rv != APR_SUCCESS) { + proc_mutex_fcntl_cleanup(new_mutex); + return rv; + } + + new_mutex->curr_locked = 0; + unlink(new_mutex->fname); + apr_pool_cleanup_register(new_mutex->pool, + (void*)new_mutex, + apr_proc_mutex_cleanup, + apr_pool_cleanup_null); + return APR_SUCCESS; +} + +static apr_status_t proc_mutex_fcntl_acquire(apr_proc_mutex_t *mutex) +{ + int rc; + + do { + rc = fcntl(mutex->interproc->filedes, F_SETLKW, &proc_mutex_lock_it); + } while (rc < 0 && errno == EINTR); + if (rc < 0) { + return errno; + } + mutex->curr_locked=1; + return APR_SUCCESS; +} + +static apr_status_t proc_mutex_fcntl_release(apr_proc_mutex_t *mutex) +{ + int rc; + + mutex->curr_locked=0; + do { + rc = fcntl(mutex->interproc->filedes, F_SETLKW, &proc_mutex_unlock_it); + } while (rc < 0 && errno == EINTR); + if (rc < 0) { + return errno; + } + return APR_SUCCESS; +} + +static apr_status_t proc_mutex_fcntl_child_init(apr_proc_mutex_t **mutex, + apr_pool_t *pool, + const char *fname) +{ + return APR_SUCCESS; +} + +const apr_proc_mutex_unix_lock_methods_t apr_proc_mutex_unix_fcntl_methods = +{ +#if APR_PROCESS_LOCK_IS_GLOBAL || !APR_HAS_THREADS || defined(FCNTL_IS_GLOBAL) + APR_PROCESS_LOCK_MECH_IS_GLOBAL, +#else + 0, +#endif + proc_mutex_fcntl_create, + proc_mutex_fcntl_acquire, + proc_mutex_no_tryacquire, + proc_mutex_fcntl_release, + proc_mutex_fcntl_cleanup, + proc_mutex_fcntl_child_init, + "fcntl" +}; + +#endif /* fcntl implementation */ + +#if APR_HAS_FLOCK_SERIALIZE + +static apr_status_t proc_mutex_flock_release(apr_proc_mutex_t *); + +static void proc_mutex_flock_setup(void) +{ +} + +static apr_status_t proc_mutex_flock_cleanup(void *mutex_) +{ + apr_status_t status; + apr_proc_mutex_t *mutex=mutex_; + + if (mutex->curr_locked == 1) { + status = proc_mutex_flock_release(mutex); + if (status != APR_SUCCESS) + return status; + } + if (mutex->interproc) { /* if it was opened properly */ + apr_file_close(mutex->interproc); + } + unlink(mutex->fname); + return APR_SUCCESS; +} + +static apr_status_t proc_mutex_flock_create(apr_proc_mutex_t *new_mutex, + const char *fname) +{ + int rv; + + if (fname) { + new_mutex->fname = apr_pstrdup(new_mutex->pool, fname); + rv = apr_file_open(&new_mutex->interproc, new_mutex->fname, + APR_CREATE | APR_WRITE | APR_EXCL, + APR_UREAD | APR_UWRITE, + new_mutex->pool); + } + else { + new_mutex->fname = apr_pstrdup(new_mutex->pool, "/tmp/aprXXXXXX"); + rv = apr_file_mktemp(&new_mutex->interproc, new_mutex->fname, + APR_CREATE | APR_WRITE | APR_EXCL, + new_mutex->pool); + } + + if (rv != APR_SUCCESS) { + proc_mutex_flock_cleanup(new_mutex); + return errno; + } + new_mutex->curr_locked = 0; + apr_pool_cleanup_register(new_mutex->pool, (void *)new_mutex, + apr_proc_mutex_cleanup, + apr_pool_cleanup_null); + return APR_SUCCESS; +} + +static apr_status_t proc_mutex_flock_acquire(apr_proc_mutex_t *mutex) +{ + int rc; + + do { + rc = flock(mutex->interproc->filedes, LOCK_EX); + } while (rc < 0 && errno == EINTR); + if (rc < 0) { + return errno; + } + mutex->curr_locked = 1; + return APR_SUCCESS; +} + +static apr_status_t proc_mutex_flock_release(apr_proc_mutex_t *mutex) +{ + int rc; + + mutex->curr_locked = 0; + do { + rc = flock(mutex->interproc->filedes, LOCK_UN); + } while (rc < 0 && errno == EINTR); + if (rc < 0) { + return errno; + } + return APR_SUCCESS; +} + +static apr_status_t proc_mutex_flock_child_init(apr_proc_mutex_t **mutex, + apr_pool_t *pool, + const char *fname) +{ + apr_proc_mutex_t *new_mutex; + int rv; + + new_mutex = (apr_proc_mutex_t *)apr_palloc(pool, sizeof(apr_proc_mutex_t)); + + memcpy(new_mutex, *mutex, sizeof *new_mutex); + new_mutex->pool = pool; + if (!fname) { + fname = (*mutex)->fname; + } + new_mutex->fname = apr_pstrdup(pool, fname); + rv = apr_file_open(&new_mutex->interproc, new_mutex->fname, + APR_WRITE, 0, new_mutex->pool); + if (rv != APR_SUCCESS) { + proc_mutex_flock_cleanup(new_mutex); + return rv; + } + *mutex = new_mutex; + return APR_SUCCESS; +} + +const apr_proc_mutex_unix_lock_methods_t apr_proc_mutex_unix_flock_methods = +{ +#if APR_PROCESS_LOCK_IS_GLOBAL || !APR_HAS_THREADS || defined(FLOCK_IS_GLOBAL) + APR_PROCESS_LOCK_MECH_IS_GLOBAL, +#else + 0, +#endif + proc_mutex_flock_create, + proc_mutex_flock_acquire, + proc_mutex_no_tryacquire, + proc_mutex_flock_release, + proc_mutex_flock_cleanup, + proc_mutex_flock_child_init, + "flock" +}; + +#endif /* flock implementation */ + +void apr_proc_mutex_unix_setup_lock(void) +{ +#if APR_HAS_POSIXSEM_SERIALIZE + proc_mutex_posix_setup(); +#endif +#if APR_HAS_SYSVSEM_SERIALIZE + proc_mutex_sysv_setup(); +#endif +#if APR_HAS_PROC_PTHREAD_SERIALIZE + proc_mutex_proc_pthread_setup(); +#endif +#if APR_HAS_FCNTL_SERIALIZE + proc_mutex_fcntl_setup(); +#endif +#if APR_HAS_FLOCK_SERIALIZE + proc_mutex_flock_setup(); +#endif +} + +static apr_status_t proc_mutex_choose_method(apr_proc_mutex_t *new_mutex, apr_lockmech_e mech) +{ + switch (mech) { + case APR_LOCK_FCNTL: +#if APR_HAS_FCNTL_SERIALIZE + new_mutex->inter_meth = &apr_proc_mutex_unix_fcntl_methods; +#else + return APR_ENOTIMPL; +#endif + break; + case APR_LOCK_FLOCK: +#if APR_HAS_FLOCK_SERIALIZE + new_mutex->inter_meth = &apr_proc_mutex_unix_flock_methods; +#else + return APR_ENOTIMPL; +#endif + break; + case APR_LOCK_SYSVSEM: +#if APR_HAS_SYSVSEM_SERIALIZE + new_mutex->inter_meth = &apr_proc_mutex_unix_sysv_methods; +#else + return APR_ENOTIMPL; +#endif + break; + case APR_LOCK_POSIXSEM: +#if APR_HAS_POSIXSEM_SERIALIZE + new_mutex->inter_meth = &apr_proc_mutex_unix_posix_methods; +#else + return APR_ENOTIMPL; +#endif + break; + case APR_LOCK_PROC_PTHREAD: +#if APR_HAS_PROC_PTHREAD_SERIALIZE + new_mutex->inter_meth = &apr_proc_mutex_unix_proc_pthread_methods; +#else + return APR_ENOTIMPL; +#endif + break; + case APR_LOCK_DEFAULT: +#if APR_USE_FLOCK_SERIALIZE + new_mutex->inter_meth = &apr_proc_mutex_unix_flock_methods; +#elif APR_USE_SYSVSEM_SERIALIZE + new_mutex->inter_meth = &apr_proc_mutex_unix_sysv_methods; +#elif APR_USE_FCNTL_SERIALIZE + new_mutex->inter_meth = &apr_proc_mutex_unix_fcntl_methods; +#elif APR_USE_PROC_PTHREAD_SERIALIZE + new_mutex->inter_meth = &apr_proc_mutex_unix_proc_pthread_methods; +#elif APR_USE_POSIXSEM_SERIALIZE + new_mutex->inter_meth = &apr_proc_mutex_unix_posix_methods; +#else + return APR_ENOTIMPL; +#endif + break; + default: + return APR_ENOTIMPL; + } + return APR_SUCCESS; +} + +APR_DECLARE(const char *) apr_proc_mutex_defname(void) +{ + apr_status_t rv; + apr_proc_mutex_t mutex; + + if ((rv = proc_mutex_choose_method(&mutex, APR_LOCK_DEFAULT)) != APR_SUCCESS) { + return "unknown"; + } + mutex.meth = mutex.inter_meth; + + return apr_proc_mutex_name(&mutex); +} + +static apr_status_t proc_mutex_create(apr_proc_mutex_t *new_mutex, apr_lockmech_e mech, const char *fname) +{ + apr_status_t rv; + + if ((rv = proc_mutex_choose_method(new_mutex, mech)) != APR_SUCCESS) { + return rv; + } + + new_mutex->meth = new_mutex->inter_meth; + + if ((rv = new_mutex->meth->create(new_mutex, fname)) != APR_SUCCESS) { + return rv; + } + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_proc_mutex_create(apr_proc_mutex_t **mutex, + const char *fname, + apr_lockmech_e mech, + apr_pool_t *pool) +{ + apr_proc_mutex_t *new_mutex; + apr_status_t rv; + + new_mutex = (apr_proc_mutex_t *)apr_pcalloc(pool, + sizeof(apr_proc_mutex_t)); + + new_mutex->pool = pool; +#if APR_HAS_SYSVSEM_SERIALIZE || APR_HAS_FCNTL_SERIALIZE || APR_HAS_FLOCK_SERIALIZE || APR_HAS_POSIXSEM_SERIALIZE + new_mutex->interproc = NULL; +#endif + + if ((rv = proc_mutex_create(new_mutex, mech, fname)) != APR_SUCCESS) + return rv; + + *mutex = new_mutex; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_proc_mutex_child_init(apr_proc_mutex_t **mutex, + const char *fname, + apr_pool_t *pool) +{ + return (*mutex)->meth->child_init(mutex, pool, fname); +} + +APR_DECLARE(apr_status_t) apr_proc_mutex_lock(apr_proc_mutex_t *mutex) +{ + return mutex->meth->acquire(mutex); +} + +APR_DECLARE(apr_status_t) apr_proc_mutex_trylock(apr_proc_mutex_t *mutex) +{ + return mutex->meth->tryacquire(mutex); +} + +APR_DECLARE(apr_status_t) apr_proc_mutex_unlock(apr_proc_mutex_t *mutex) +{ + return mutex->meth->release(mutex); +} + +APR_DECLARE(apr_status_t) apr_proc_mutex_cleanup(void *mutex) +{ + return ((apr_proc_mutex_t *)mutex)->meth->cleanup(mutex); +} + +APR_DECLARE(const char *) apr_proc_mutex_name(apr_proc_mutex_t *mutex) +{ + return mutex->meth->name; +} + +APR_DECLARE(const char *) apr_proc_mutex_lockfile(apr_proc_mutex_t *mutex) +{ + /* posix sems use the fname field but don't use a file, + * so be careful + */ + if (!strcmp(mutex->meth->name, "flock") || + !strcmp(mutex->meth->name, "fcntl")) { + return mutex->fname; + } + return NULL; +} + +APR_POOL_IMPLEMENT_ACCESSOR(proc_mutex) + +/* Implement OS-specific accessors defined in apr_portable.h */ + +APR_DECLARE(apr_status_t) apr_os_proc_mutex_get(apr_os_proc_mutex_t *ospmutex, + apr_proc_mutex_t *pmutex) +{ +#if APR_HAS_SYSVSEM_SERIALIZE || APR_HAS_FCNTL_SERIALIZE || APR_HAS_FLOCK_SERIALIZE || APR_HAS_POSIXSEM_SERIALIZE + ospmutex->crossproc = pmutex->interproc->filedes; +#endif +#if APR_HAS_PROC_PTHREAD_SERIALIZE + ospmutex->pthread_interproc = pmutex->pthread_interproc; +#endif + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_os_proc_mutex_put(apr_proc_mutex_t **pmutex, + apr_os_proc_mutex_t *ospmutex, + apr_pool_t *pool) +{ + if (pool == NULL) { + return APR_ENOPOOL; + } + if ((*pmutex) == NULL) { + (*pmutex) = (apr_proc_mutex_t *)apr_pcalloc(pool, + sizeof(apr_proc_mutex_t)); + (*pmutex)->pool = pool; + } +#if APR_HAS_SYSVSEM_SERIALIZE || APR_HAS_FCNTL_SERIALIZE || APR_HAS_FLOCK_SERIALIZE || APR_HAS_POSIXSEM_SERIALIZE + apr_os_file_put(&(*pmutex)->interproc, &ospmutex->crossproc, 0, pool); +#endif +#if APR_HAS_PROC_PTHREAD_SERIALIZE + (*pmutex)->pthread_interproc = ospmutex->pthread_interproc; +#endif + return APR_SUCCESS; +} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/proc_mutex.lo b/rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/proc_mutex.lo new file mode 100644 index 00000000..2359a0ee --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/proc_mutex.lo @@ -0,0 +1,12 @@ +# proc_mutex.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/proc_mutex.o' + +# Name of the non-PIC object. +non_pic_object='proc_mutex.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/proc_mutex.o b/rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/proc_mutex.o new file mode 100644 index 0000000000000000000000000000000000000000..bee8bb3bfec465f2d89fec83638a3a3822797883 GIT binary patch literal 48904 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 +#ifdef PTHREAD_SETS_ERRNO + if (rv) { + rv = errno; + } +#endif + return rv; +} + +APR_DECLARE(apr_status_t) apr_thread_cond_create(apr_thread_cond_t **cond, + apr_pool_t *pool) +{ + apr_thread_cond_t *new_cond; + apr_status_t rv; + + new_cond = (apr_thread_cond_t *)apr_pcalloc(pool, + sizeof(apr_thread_cond_t)); + + if (new_cond == NULL) { + return APR_ENOMEM; + } + + new_cond->pool = pool; + new_cond->cond = (pthread_cond_t *)apr_palloc(pool, + sizeof(pthread_cond_t)); + + if (new_cond->cond == NULL) { + return APR_ENOMEM; + } + + if ((rv = pthread_cond_init(new_cond->cond, NULL))) { +#ifdef PTHREAD_SETS_ERRNO + rv = errno; +#endif + thread_cond_cleanup(new_cond); + return rv; + } + + apr_pool_cleanup_register(new_cond->pool, + (void *)new_cond, thread_cond_cleanup, + apr_pool_cleanup_null); + + *cond = new_cond; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_thread_cond_wait(apr_thread_cond_t *cond, + apr_thread_mutex_t *mutex) +{ + apr_status_t rv; + + rv = pthread_cond_wait(cond->cond, &mutex->mutex); +#ifdef PTHREAD_SETS_ERRNO + if (rv) { + rv = errno; + } +#endif + return rv; +} + +APR_DECLARE(apr_status_t) apr_thread_cond_timedwait(apr_thread_cond_t *cond, + apr_thread_mutex_t *mutex, + apr_interval_time_t timeout) +{ + apr_status_t rv; + apr_time_t then; + struct timespec abstime; + + then = apr_time_now() + timeout; + abstime.tv_sec = apr_time_sec(then); + abstime.tv_nsec = apr_time_usec(then) * 1000; /* nanoseconds */ + + rv = pthread_cond_timedwait(cond->cond, &mutex->mutex, &abstime); +#ifdef PTHREAD_SETS_ERRNO + if (rv) { + rv = errno; + } +#endif + if (ETIMEDOUT == rv) { + return APR_TIMEUP; + } + return rv; +} + + +APR_DECLARE(apr_status_t) apr_thread_cond_signal(apr_thread_cond_t *cond) +{ + apr_status_t rv; + + rv = pthread_cond_signal(cond->cond); +#ifdef PTHREAD_SETS_ERRNO + if (rv) { + rv = errno; + } +#endif + return rv; +} + +APR_DECLARE(apr_status_t) apr_thread_cond_broadcast(apr_thread_cond_t *cond) +{ + apr_status_t rv; + + rv = pthread_cond_broadcast(cond->cond); +#ifdef PTHREAD_SETS_ERRNO + if (rv) { + rv = errno; + } +#endif + return rv; +} + +APR_DECLARE(apr_status_t) apr_thread_cond_destroy(apr_thread_cond_t *cond) +{ + apr_status_t rv; + if ((rv = thread_cond_cleanup(cond)) == APR_SUCCESS) { + apr_pool_cleanup_kill(cond->pool, cond, thread_cond_cleanup); + return APR_SUCCESS; + } + return rv; +} + +APR_POOL_IMPLEMENT_ACCESSOR(thread_cond) + +#endif /* APR_HAS_THREADS */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/thread_cond.lo b/rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/thread_cond.lo new file mode 100644 index 00000000..aa4051e8 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/thread_cond.lo @@ -0,0 +1,12 @@ +# thread_cond.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/thread_cond.o' + +# Name of the non-PIC object. +non_pic_object='thread_cond.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/thread_cond.o b/rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/thread_cond.o new file mode 100644 index 0000000000000000000000000000000000000000..b453da92658b8fe517925c2de5eb6d66a62ba4d5 GIT binary patch literal 15896 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 bPY9gPffohN`}Cy1c^?%}{OA+^c>Vk@|Aun* literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/thread_mutex.c b/rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/thread_mutex.c new file mode 100644 index 00000000..e146a28f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/thread_mutex.c @@ -0,0 +1,138 @@ +/* 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. + */ + +#include "apr_arch_thread_mutex.h" +#define APR_WANT_MEMFUNC +#include "apr_want.h" + +#if APR_HAS_THREADS + +static apr_status_t thread_mutex_cleanup(void *data) +{ + apr_thread_mutex_t *mutex = data; + apr_status_t rv; + + rv = pthread_mutex_destroy(&mutex->mutex); +#ifdef PTHREAD_SETS_ERRNO + if (rv) { + rv = errno; + } +#endif + return rv; +} + +APR_DECLARE(apr_status_t) apr_thread_mutex_create(apr_thread_mutex_t **mutex, + unsigned int flags, + apr_pool_t *pool) +{ + apr_thread_mutex_t *new_mutex; + apr_status_t rv; + +#ifndef HAVE_PTHREAD_MUTEX_RECURSIVE + if (flags & APR_THREAD_MUTEX_NESTED) { + return APR_ENOTIMPL; + } +#endif + + new_mutex = apr_pcalloc(pool, sizeof(apr_thread_mutex_t)); + new_mutex->pool = pool; + +#ifdef HAVE_PTHREAD_MUTEX_RECURSIVE + if (flags & APR_THREAD_MUTEX_NESTED) { + pthread_mutexattr_t mattr; + + rv = pthread_mutexattr_init(&mattr); + if (rv) return rv; + + rv = pthread_mutexattr_settype(&mattr, PTHREAD_MUTEX_RECURSIVE); + if (rv) { + pthread_mutexattr_destroy(&mattr); + return rv; + } + + rv = pthread_mutex_init(&new_mutex->mutex, &mattr); + + pthread_mutexattr_destroy(&mattr); + } else +#endif + rv = pthread_mutex_init(&new_mutex->mutex, NULL); + + if (rv) { +#ifdef PTHREAD_SETS_ERRNO + rv = errno; +#endif + return rv; + } + + apr_pool_cleanup_register(new_mutex->pool, + new_mutex, thread_mutex_cleanup, + apr_pool_cleanup_null); + + *mutex = new_mutex; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_thread_mutex_lock(apr_thread_mutex_t *mutex) +{ + apr_status_t rv; + + rv = pthread_mutex_lock(&mutex->mutex); +#ifdef PTHREAD_SETS_ERRNO + if (rv) { + rv = errno; + } +#endif + + return rv; +} + +APR_DECLARE(apr_status_t) apr_thread_mutex_trylock(apr_thread_mutex_t *mutex) +{ + apr_status_t rv; + + rv = pthread_mutex_trylock(&mutex->mutex); + if (rv) { +#ifdef PTHREAD_SETS_ERRNO + rv = errno; +#endif + return (rv == EBUSY) ? APR_EBUSY : rv; + } + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_thread_mutex_unlock(apr_thread_mutex_t *mutex) +{ + apr_status_t status; + + status = pthread_mutex_unlock(&mutex->mutex); +#ifdef PTHREAD_SETS_ERRNO + if (status) { + status = errno; + } +#endif + + return status; +} + +APR_DECLARE(apr_status_t) apr_thread_mutex_destroy(apr_thread_mutex_t *mutex) +{ + return apr_pool_cleanup_run(mutex->pool, mutex, thread_mutex_cleanup); +} + +APR_POOL_IMPLEMENT_ACCESSOR(thread_mutex) + +#endif /* APR_HAS_THREADS */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/thread_mutex.lo b/rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/thread_mutex.lo new file mode 100644 index 00000000..9f6d1033 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/thread_mutex.lo @@ -0,0 +1,12 @@ +# thread_mutex.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/thread_mutex.o' + +# Name of the non-PIC object. +non_pic_object='thread_mutex.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/thread_mutex.o b/rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/thread_mutex.o new file mode 100644 index 0000000000000000000000000000000000000000..87f972937a9d0352e4691b67b4f01e9c8c35b67e GIT binary patch literal 14856 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/thread_rwlock.c b/rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/thread_rwlock.c new file mode 100644 index 00000000..c322b455 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/thread_rwlock.c @@ -0,0 +1,198 @@ +/* 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. + */ + +#include "apr_arch_thread_rwlock.h" +#include "apr_private.h" + +#if APR_HAS_THREADS + +#ifdef HAVE_PTHREAD_RWLOCKS + +static apr_status_t thread_rwlock_cleanup(void *data) +{ + apr_thread_rwlock_t *rwlock = (apr_thread_rwlock_t *)data; + apr_status_t stat; + + pthread_rwlock_unlock(rwlock->rwlock); + stat = pthread_rwlock_destroy(rwlock->rwlock); +#ifdef PTHREAD_SETS_ERRNO + if (stat) { + stat = errno; + } +#endif + return stat; +} + +APR_DECLARE(apr_status_t) apr_thread_rwlock_create(apr_thread_rwlock_t **rwlock, + apr_pool_t *pool) +{ + apr_thread_rwlock_t *new_rwlock; + apr_status_t stat; + + new_rwlock = (apr_thread_rwlock_t *)apr_pcalloc(pool, + sizeof(apr_thread_rwlock_t)); + + if (new_rwlock == NULL) { + return APR_ENOMEM; + } + + new_rwlock->pool = pool; + new_rwlock->rwlock = (pthread_rwlock_t *)apr_palloc(pool, + sizeof(pthread_rwlock_t)); + + if (new_rwlock->rwlock == NULL) { + return APR_ENOMEM; + } + + if ((stat = pthread_rwlock_init(new_rwlock->rwlock, NULL))) { +#ifdef PTHREAD_SETS_ERRNO + stat = errno; +#endif + thread_rwlock_cleanup(new_rwlock); + return stat; + } + + apr_pool_cleanup_register(new_rwlock->pool, + (void *)new_rwlock, thread_rwlock_cleanup, + apr_pool_cleanup_null); + + *rwlock = new_rwlock; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_thread_rwlock_rdlock(apr_thread_rwlock_t *rwlock) +{ + apr_status_t stat; + + stat = pthread_rwlock_rdlock(rwlock->rwlock); +#ifdef PTHREAD_SETS_ERRNO + if (stat) { + stat = errno; + } +#endif + return stat; +} + +APR_DECLARE(apr_status_t) apr_thread_rwlock_tryrdlock(apr_thread_rwlock_t *rwlock) +{ + apr_status_t stat; + + stat = pthread_rwlock_tryrdlock(rwlock->rwlock); +#ifdef PTHREAD_SETS_ERRNO + if (stat) { + stat = errno; + } +#endif + /* Normalize the return code. */ + if (stat == EBUSY) + stat = APR_EBUSY; + return stat; +} + +APR_DECLARE(apr_status_t) apr_thread_rwlock_wrlock(apr_thread_rwlock_t *rwlock) +{ + apr_status_t stat; + + stat = pthread_rwlock_wrlock(rwlock->rwlock); +#ifdef PTHREAD_SETS_ERRNO + if (stat) { + stat = errno; + } +#endif + return stat; +} + +APR_DECLARE(apr_status_t) apr_thread_rwlock_trywrlock(apr_thread_rwlock_t *rwlock) +{ + apr_status_t stat; + + stat = pthread_rwlock_trywrlock(rwlock->rwlock); +#ifdef PTHREAD_SETS_ERRNO + if (stat) { + stat = errno; + } +#endif + /* Normalize the return code. */ + if (stat == EBUSY) + stat = APR_EBUSY; + return stat; +} + +APR_DECLARE(apr_status_t) apr_thread_rwlock_unlock(apr_thread_rwlock_t *rwlock) +{ + apr_status_t stat; + + stat = pthread_rwlock_unlock(rwlock->rwlock); +#ifdef PTHREAD_SETS_ERRNO + if (stat) { + stat = errno; + } +#endif + return stat; +} + +APR_DECLARE(apr_status_t) apr_thread_rwlock_destroy(apr_thread_rwlock_t *rwlock) +{ + apr_status_t stat; + if ((stat = thread_rwlock_cleanup(rwlock)) == APR_SUCCESS) { + apr_pool_cleanup_kill(rwlock->pool, rwlock, thread_rwlock_cleanup); + return APR_SUCCESS; + } + return stat; +} + +#else /* HAVE_PTHREAD_RWLOCKS */ + +APR_DECLARE(apr_status_t) apr_thread_rwlock_create(apr_thread_rwlock_t **rwlock, + apr_pool_t *pool) +{ + return APR_ENOTIMPL; +} + +APR_DECLARE(apr_status_t) apr_thread_rwlock_rdlock(apr_thread_rwlock_t *rwlock) +{ + return APR_ENOTIMPL; +} + +APR_DECLARE(apr_status_t) apr_thread_rwlock_tryrdlock(apr_thread_rwlock_t *rwlock) +{ + return APR_ENOTIMPL; +} + +APR_DECLARE(apr_status_t) apr_thread_rwlock_wrlock(apr_thread_rwlock_t *rwlock) +{ + return APR_ENOTIMPL; +} + +APR_DECLARE(apr_status_t) apr_thread_rwlock_trywrlock(apr_thread_rwlock_t *rwlock) +{ + return APR_ENOTIMPL; +} + +APR_DECLARE(apr_status_t) apr_thread_rwlock_unlock(apr_thread_rwlock_t *rwlock) +{ + return APR_ENOTIMPL; +} + +APR_DECLARE(apr_status_t) apr_thread_rwlock_destroy(apr_thread_rwlock_t *rwlock) +{ + return APR_ENOTIMPL; +} + +#endif /* HAVE_PTHREAD_RWLOCKS */ +APR_POOL_IMPLEMENT_ACCESSOR(thread_rwlock) + +#endif /* APR_HAS_THREADS */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/thread_rwlock.lo b/rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/thread_rwlock.lo new file mode 100644 index 00000000..e5ed346e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/thread_rwlock.lo @@ -0,0 +1,12 @@ +# thread_rwlock.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/thread_rwlock.o' + +# Name of the non-PIC object. +non_pic_object='thread_rwlock.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/thread_rwlock.o b/rubbos/app/httpd-2.0.64/srclib/apr/locks/unix/thread_rwlock.o new file mode 100644 index 0000000000000000000000000000000000000000..42f33daf4048e8d36eb5d7259a19b796a9d6c49e GIT binary patch literal 12432 zcmbta4|H5rnZIvdLMBN&oi_cG^bZ|qN}ATpBsHg`_FtM7JB5mcCZ!l)oJ?Mm*-j>L z=1rTj3Oxi^vc+R6poocS#;R6r_Xi2}09*%bv8^eF1?p6xE|fkjjtGo5I+2#B-J(K|}G0SA*Vo9-W+Psfjnk zbGCm!KJjGmi8;$*h<_Ph=WF8Cu;&AFMguD}!m#vkU~H4yn`deKC%d$PG?;e2W$lpeJsgWPWfFefz4$7;Hd-M;8au9^Q{6KJnMZJtF~RU z?lEA@Mn)+34G>MXR{s>lIf#a9&;1j~I{w-f-vg24W`u*Fg(JboNCkFf;A+PLO3f{{ zNkoq%VjS?0La`eE4wS7VYgmnFp+R>oM%0K)kOiKehH5^V=dy?d>-a-}F4#g{3oj&L zQ6C76%-#g^s)-wWaFQ*?mer!oQ^yIat>Ztkm0Ds5C}J_qRXPjMG|{cbK$l{-wT3M% z`!hyNMduM@t8FvbIeP`r!)G^Qhzn-p70Yr{DV2t}`hga)`T_^x+G}-}b{_V327+D1 z-s?eiO853!?M3)LfFCw+AP*KVsf7lWb6CKvqRTu0p&*XPXzE74sbWl9;c+r~x{*zpm~JYG31=q7 zbc^56Moa}1>$nXJW9Sw(WMaC_#I(%+SmS7&V3l^JEww^@M>VtXK1;R>vs?WoYy8CQg zCD2<7E-r-Lq)~h>d}vMF!leSId<*((xud8sp%qTBLJLaZ>?=^M#1(QCG*!*J)-#^6 zmVSy&ya4wnP_>4FFG95%6O0qN1szgMH)|I-Cw(#1O=%P-m>>PTMscqA(GwcQR2p;* z8n2lZFr)DTf<(==R)!kt?a-3YTx(uU7}mT%v#PJ(3=pigB*N>oY7U^VfG<>b=mYf| z>UY9SJIk_mHdr9koTGL&#GpIaVAa=SH=?z(J#H8D)h+V%)ffBV6+%X<(dg_3(Ao$O zc?dlsGN-|^Lq)UUsI{fZ1kuv8vmsL7*@WKaR(sxH4n{!*<1h^DZ|L;(&yQLi4LIQL z#?SU>^##?cqagspU)V{)A{1brPF`oJxj=`N$B4J}G+}FTX&fcimK1|Qn@fwnvAJv+ zdEZxmxz5zt=zJ;UXgPR*ThgJk8u?rB9B4e&1CPo%+@aLDK4Z|cq8=3H!JTgQ`2>9B zd2ml)MtMN_^?R$2-+qL_b52qR)nJRo&v?)kEPj?CV~bmVUnH`4UkQ<0r;0=tA1@(N!>b}B zMX9z_FN=DU0kEa^vdHmZbiF6Ib+@OxmqowR-m;Xixuc%qZWeF#puIe%M?7dZi;sEG zUKZJ-rFK)NS8XEcN>6Jyi??{t9v1md1k}eB%REvW?=UyMSk&cE^}z*Tm>ksURnsIr zNi|FZ7Jo=k<@xh0^}bkCWbr@WQ}K1`{Xpye( z`S*jZfa-#)WxXAm4Oa`TV>?#J=VIw>DpMGAV&h%w66-qKGU;q#ylp63hz+FOywa3R zdLTBGN|jSOqg|}8qR|-qBWtCtSTdIyjuo=$abu53${o%*$-zYKP-ZlBAezFk^KLGk z9eRIs7$Y1r1o!ZmlQ&4-9UOG_gA6H1j^#jr9WDq7Czs2P7Mo+EqZw48-cm;%jBzDo zAM9huFX-ztQmx51L}xczk?v!c*oPx_{m*W_rn!H8Rlsi9SY_E){L9)+&#eE@+W!e& zd{N9Edc$toXCIuh>#nm8MeN#W{{p-2jSt=awHy4kJ$dbQ$Lu%N)J4H@yY)^hPz84f z2U8MK!sU1FB@&oECznqgN*-_uV*q4xjH&$aXwHq`i8`OY+5s!&mJj7H z@t~F(*1eduL@MJXvxPCRGnCG|POj`Op&iY1K{J_24`q#VG6UAMNDfPfL3ZU}a)UaC z%xHEfqAwV+9>}3w8r;vuRh2I3szd(#SYPr4~6|WHF&L3C@fs&SKU% zM42v6%7JtyqtVi_(I5)hJY>TejHHH>IT>&vs|V_56bJ2T;^<2n<##Ow!*CsG-pw7R z+gYwr>`Nr@-q74A@lzq>r0c?5g#3&p2Rlr)Rt+ZIWCh=p0eW(HrdGN&l!uB@`X@t4 zbUQBYi)@R)dK2x8w2iohtg~sz$vU}o3Yz#BZ-Vu!Z5?zDMcO{RHqy2~?{aTYrz_e_~p$IMqZ=@#-89}zv#hhUDuWWkX`0^#1mbi_R3!URah$-;GiCOMRs znW0;PR$ysMq8T&URBT|>bwSff9mvOWg@J+5d@MOO78`cmvB9>r(e~)N&R9N|!o?SI z6~oDsH;X8E#K%_c*tYEhkyU*Ig{)gJxoKNl(5;SZIy$56ovjANb#*>opjcO5s;u#_ zwPaRJa0-@K*qoX#8c;7n!q!lDB5+9vUoPG7>w+H^y*KI!g>MdQ4>jIs?+QgGsshQn zP$TerLct5`w;FjzD7d43XQ*+ThRx@qj~f%-M+J;!iZFc^-yRC@1CL?A?ybP(t&`+F zFStvgeVVY1SnILu2t{(C@K&U$p@ z$mdm5ql3;sVJMN#?jMCdEhh&Ca?U|+!3`>5CUeQ`kW;D+uUd!s;8I0Xqaz~@Jpa)w zOxh?+`8GX?$&fRg*q=*|I2`z2R!2Y`_W^LOEh*j9lG_QqH~xZOD7+l{I;PGsjoZ;U z6gakMKfGDN`Gy6LHb{XNbV+%L^h!WzNEo+4X!HN8zpjE!fE4@R2ZuO+k^b>$RB8OH zRv4}LEK}q7aT6iO-vgMmi5liJv{GxmJqM!Y+}#y0>Dvf_EW|UYT$B!S$*LV)Bq`zT-v9sD#-j(&ZzLoSn0tpW3OPuu>$Ky3(Vw$L7 z(r*+BJbu>yG6-Uby6Yt6??obF{=)EMeaj(+Eo zGus?D%3Rw@EJhxmvr?*Jdv98a)8bGHL!A1rLITD3G4ticHh%;v>#!AkrWB)C=zRysBk-%lAD;ogc?SIM8F1WVpxtf(>LqPHG|KHS?e)c}fDdQoM*uq7V8@s_P6}0h>eJo+qiVK5r?Sci z*m6IWPb-9$)8YJ7S)7tAOSGG;a{c@5zjRWCk3cS1icKcL?*ZK@dtE{BUjOGC>03sKezZ5)i{z8{2uw zhr{0|JiM0XE%Nc1Vg4o`?jP3&eK%)gXy8P8Qde#FPeF=9c#emhTT)Zn<*v;9B% zaNJ8XzS3vkA1CkAF&_WhfVP=BpSZd&q?aOXV?6xR)k+R}=o4 zz+a|3ye;q(gyVY*3*X;QQ+^r*{yD;z3;YqX(<$)V3Ev{{tH=(26=%N>m@w2{!9PX( zw7}U8pI@aN{N{m$@lTMQ&kKB7vy{3=;A0g3HwAt-@xMC*{tp5tx_WK~{AGc^Kz?5l zc$)Bc1>Q#O5RH$=%YU0_5_p~hY8Lo6$bP%Pd0uu4{4Q!=Byf&%ufTsn_A`WI*d*$R z{>I1m?{=qV!0!-tcxQW$z;P|c^03biu47?pKQ8zYBt!X`;PbeC8S?BOm_itjigJbKYtxe|Ue;KMPVo5{|FJ{<2m$8(vm|0}ZZ2tMz_ zMg{+M;@>Fv9M6;w$9SHicy9CI{&?;Z_W3WgUlaTuvU5`K`8@Mu!RL5h^5GcIyJY9r zKHMMAE5iP4nkR1w{*TFyjUVHn@coSte=*@aA2=TPj~u%2^L0MWr&b^CkEc`E=f5ZS z2tL0TcL_e9(^7)Z@r?Lz%n!ehaz5N2&xEj#e+b5Mr;qQq^Q9U1CuiV)PvDPHetsbA zY$dhandle) { + if (CloseHandle(mutex->handle) == 0) { + return apr_get_os_error(); + } + } + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_proc_mutex_create(apr_proc_mutex_t **mutex, + const char *fname, + apr_lockmech_e mech, + apr_pool_t *pool) +{ + HANDLE hMutex; + void *mutexkey; + + /* res_name_from_filename turns fname into a pseduo-name + * without slashes or backslashes, and prepends the \global + * prefix on Win2K and later + */ + if (fname) { + mutexkey = res_name_from_filename(fname, 1, pool); + } + else { + mutexkey = NULL; + } + +#if APR_HAS_UNICODE_FS + IF_WIN_OS_IS_UNICODE + { + hMutex = CreateMutexW(NULL, FALSE, mutexkey); + } +#endif +#if APR_HAS_ANSI_FS + ELSE_WIN_OS_IS_ANSI + { + hMutex = CreateMutexA(NULL, FALSE, mutexkey); + } +#endif + + if (!hMutex) { + return apr_get_os_error(); + } + + *mutex = (apr_proc_mutex_t *)apr_palloc(pool, sizeof(apr_proc_mutex_t)); + (*mutex)->pool = pool; + (*mutex)->handle = hMutex; + (*mutex)->fname = fname; + apr_pool_cleanup_register((*mutex)->pool, *mutex, + proc_mutex_cleanup, apr_pool_cleanup_null); + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_proc_mutex_child_init(apr_proc_mutex_t **mutex, + const char *fname, + apr_pool_t *pool) +{ + HANDLE hMutex; + void *mutexkey; + + if (!fname) { + /* Reinitializing unnamed mutexes is a noop in the Unix code. */ + return APR_SUCCESS; + } + + /* res_name_from_filename turns file into a pseudo-name + * without slashes or backslashes, and prepends the \global + * prefix on Win2K and later + */ + mutexkey = res_name_from_filename(fname, 1, pool); + +#if defined(_WIN32_WCE) + hMutex = CreateMutex(NULL, FALSE, mutexkey); + if (hMutex && ERROR_ALREADY_EXISTS != GetLastError()) { + CloseHandle(hMutex); + hMutex = NULL; + SetLastError(ERROR_FILE_NOT_FOUND); + } +#else +#if APR_HAS_UNICODE_FS + IF_WIN_OS_IS_UNICODE + { + hMutex = OpenMutexW(MUTEX_ALL_ACCESS, FALSE, mutexkey); + } +#endif +#if APR_HAS_ANSI_FS + ELSE_WIN_OS_IS_ANSI + { + hMutex = OpenMutexA(MUTEX_ALL_ACCESS, FALSE, mutexkey); + } +#endif +#endif + + if (!hMutex) { + return apr_get_os_error(); + } + + *mutex = (apr_proc_mutex_t *)apr_palloc(pool, sizeof(apr_proc_mutex_t)); + (*mutex)->pool = pool; + (*mutex)->handle = hMutex; + (*mutex)->fname = fname; + apr_pool_cleanup_register((*mutex)->pool, *mutex, + proc_mutex_cleanup, apr_pool_cleanup_null); + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_proc_mutex_lock(apr_proc_mutex_t *mutex) +{ + DWORD rv; + + rv = WaitForSingleObject(mutex->handle, INFINITE); + + if (rv == WAIT_OBJECT_0 || rv == WAIT_ABANDONED) { + return APR_SUCCESS; + } + return apr_get_os_error(); +} + +APR_DECLARE(apr_status_t) apr_proc_mutex_trylock(apr_proc_mutex_t *mutex) +{ + DWORD rv; + + rv = WaitForSingleObject(mutex->handle, 0); + + if (rv == WAIT_OBJECT_0 || rv == WAIT_ABANDONED) { + return APR_SUCCESS; + } + else if (rv == WAIT_TIMEOUT) { + return APR_EBUSY; + } + return apr_get_os_error(); +} + +APR_DECLARE(apr_status_t) apr_proc_mutex_unlock(apr_proc_mutex_t *mutex) +{ + if (ReleaseMutex(mutex->handle) == 0) { + return apr_get_os_error(); + } + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_proc_mutex_destroy(apr_proc_mutex_t *mutex) +{ + apr_status_t stat; + + stat = proc_mutex_cleanup(mutex); + if (stat == APR_SUCCESS) { + apr_pool_cleanup_kill(mutex->pool, mutex, proc_mutex_cleanup); + } + return stat; +} + +APR_DECLARE(const char *) apr_proc_mutex_lockfile(apr_proc_mutex_t *mutex) +{ + return NULL; +} + +APR_DECLARE(const char *) apr_proc_mutex_name(apr_proc_mutex_t *mutex) +{ + return mutex->fname; +} + +APR_DECLARE(const char *) apr_proc_mutex_defname(void) +{ + return "win32mutex"; +} + +APR_POOL_IMPLEMENT_ACCESSOR(proc_mutex) + +/* Implement OS-specific accessors defined in apr_portable.h */ + +APR_DECLARE(apr_status_t) apr_os_proc_mutex_get(apr_os_proc_mutex_t *ospmutex, + apr_proc_mutex_t *mutex) +{ + *ospmutex = mutex->handle; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_os_proc_mutex_put(apr_proc_mutex_t **pmutex, + apr_os_proc_mutex_t *ospmutex, + apr_pool_t *pool) +{ + if (pool == NULL) { + return APR_ENOPOOL; + } + if ((*pmutex) == NULL) { + (*pmutex) = (apr_proc_mutex_t *)apr_palloc(pool, + sizeof(apr_proc_mutex_t)); + (*pmutex)->pool = pool; + } + (*pmutex)->handle = *ospmutex; + return APR_SUCCESS; +} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/locks/win32/thread_cond.c b/rubbos/app/httpd-2.0.64/srclib/apr/locks/win32/thread_cond.c new file mode 100644 index 00000000..ac71a419 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/locks/win32/thread_cond.c @@ -0,0 +1,128 @@ +/* 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. + */ + +#include "apr.h" +#include "apr_private.h" +#include "apr_general.h" +#include "apr_strings.h" +#include "win32/apr_arch_thread_mutex.h" +#include "win32/apr_arch_thread_cond.h" +#include "apr_portable.h" + +static apr_status_t thread_cond_cleanup(void *data) +{ + apr_thread_cond_t *cond = data; + CloseHandle(cond->event); + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_thread_cond_create(apr_thread_cond_t **cond, + apr_pool_t *pool) +{ + *cond = apr_palloc(pool, sizeof(**cond)); + (*cond)->pool = pool; + (*cond)->event = CreateEvent(NULL, TRUE, FALSE, NULL); + (*cond)->signal_all = 0; + (*cond)->num_waiting = 0; + return APR_SUCCESS; +} + +static APR_INLINE apr_status_t _thread_cond_timedwait(apr_thread_cond_t *cond, + apr_thread_mutex_t *mutex, + DWORD timeout_ms ) +{ + DWORD res; + + while (1) { + cond->num_waiting++; + + apr_thread_mutex_unlock(mutex); + res = WaitForSingleObject(cond->event, timeout_ms); + apr_thread_mutex_lock(mutex); + cond->num_waiting--; + if (res != WAIT_OBJECT_0) { + apr_status_t rv = apr_get_os_error(); + if (res == WAIT_TIMEOUT) { + return APR_TIMEUP; + } + return apr_get_os_error(); + } + if (cond->signal_all) { + if (cond->num_waiting == 0) { + cond->signal_all = 0; + cond->signalled = 0; + ResetEvent(cond->event); + } + break; + } + else if (cond->signalled) { + cond->signalled = 0; + ResetEvent(cond->event); + break; + } + } + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_thread_cond_wait(apr_thread_cond_t *cond, + apr_thread_mutex_t *mutex) +{ + return _thread_cond_timedwait(cond, mutex, INFINITE); +} + +APR_DECLARE(apr_status_t) apr_thread_cond_timedwait(apr_thread_cond_t *cond, + apr_thread_mutex_t *mutex, + apr_interval_time_t timeout) +{ + DWORD timeout_ms = (DWORD) apr_time_as_msec(timeout); + + return _thread_cond_timedwait(cond, mutex, timeout_ms); +} + +APR_DECLARE(apr_status_t) apr_thread_cond_signal(apr_thread_cond_t *cond) +{ + apr_status_t rv = APR_SUCCESS; + DWORD res; + + cond->signalled = 1; + res = SetEvent(cond->event); + if (res == 0) { + rv = apr_get_os_error(); + } + return rv; +} + +APR_DECLARE(apr_status_t) apr_thread_cond_broadcast(apr_thread_cond_t *cond) +{ + apr_status_t rv = APR_SUCCESS; + DWORD res; + + cond->signalled = 1; + cond->signal_all = 1; + res = SetEvent(cond->event); + if (res == 0) { + rv = apr_get_os_error(); + } + return rv; +} + +APR_DECLARE(apr_status_t) apr_thread_cond_destroy(apr_thread_cond_t *cond) +{ + return apr_pool_cleanup_run(cond->pool, cond, thread_cond_cleanup); +} + +APR_POOL_IMPLEMENT_ACCESSOR(thread_cond) + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/locks/win32/thread_mutex.c b/rubbos/app/httpd-2.0.64/srclib/apr/locks/win32/thread_mutex.c new file mode 100644 index 00000000..9b10d727 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/locks/win32/thread_mutex.c @@ -0,0 +1,136 @@ +/* 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. + */ + +#include "apr.h" +#include "apr_private.h" +#include "apr_general.h" +#include "apr_strings.h" +#include "apr_arch_thread_mutex.h" +#include "apr_thread_mutex.h" +#include "apr_portable.h" +#include "apr_arch_misc.h" + +static apr_status_t thread_mutex_cleanup(void *data) +{ + apr_thread_mutex_t *lock = data; + + if (lock->type == thread_mutex_critical_section) { + lock->type = -1; + DeleteCriticalSection(&lock->section); + } + else { + if (!CloseHandle(lock->handle)) { + return apr_get_os_error(); + } + } + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_thread_mutex_create(apr_thread_mutex_t **mutex, + unsigned int flags, + apr_pool_t *pool) +{ + (*mutex) = (apr_thread_mutex_t *)apr_palloc(pool, sizeof(**mutex)); + + (*mutex)->pool = pool; + + if (flags & APR_THREAD_MUTEX_UNNESTED) { + /* Use an auto-reset signaled event, ready to accept one + * waiting thread. + */ + (*mutex)->type = thread_mutex_unnested_event; + (*mutex)->handle = CreateEvent(NULL, FALSE, TRUE, NULL); + } + else { +#if APR_HAS_UNICODE_FS + /* Critical Sections are terrific, performance-wise, on NT. + * On Win9x, we cannot 'try' on a critical section, so we + * use a [slower] mutex object, instead. + */ + IF_WIN_OS_IS_UNICODE { + InitializeCriticalSection(&(*mutex)->section); + (*mutex)->type = thread_mutex_critical_section; + } +#endif +#if APR_HAS_ANSI_FS + ELSE_WIN_OS_IS_ANSI { + (*mutex)->type = thread_mutex_nested_mutex; + (*mutex)->handle = CreateMutex(NULL, FALSE, NULL); + + } +#endif + } + + apr_pool_cleanup_register((*mutex)->pool, (*mutex), thread_mutex_cleanup, + apr_pool_cleanup_null); + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_thread_mutex_lock(apr_thread_mutex_t *mutex) +{ + if (mutex->type == thread_mutex_critical_section) { + EnterCriticalSection(&mutex->section); + } + else { + DWORD rv = WaitForSingleObject(mutex->handle, INFINITE); + if ((rv != WAIT_OBJECT_0) && (rv != WAIT_ABANDONED)) { + return (rv == WAIT_TIMEOUT) ? APR_EBUSY : apr_get_os_error(); + } + } + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_thread_mutex_trylock(apr_thread_mutex_t *mutex) +{ + if (mutex->type == thread_mutex_critical_section) { + if (!TryEnterCriticalSection(&mutex->section)) { + return APR_EBUSY; + } + } + else { + DWORD rv = WaitForSingleObject(mutex->handle, 0); + if ((rv != WAIT_OBJECT_0) && (rv != WAIT_ABANDONED)) { + return (rv == WAIT_TIMEOUT) ? APR_EBUSY : apr_get_os_error(); + } + } + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_thread_mutex_unlock(apr_thread_mutex_t *mutex) +{ + if (mutex->type == thread_mutex_critical_section) { + LeaveCriticalSection(&mutex->section); + } + else if (mutex->type == thread_mutex_unnested_event) { + if (!SetEvent(mutex->handle)) { + return apr_get_os_error(); + } + } + else if (mutex->type == thread_mutex_nested_mutex) { + if (!ReleaseMutex(mutex->handle)) { + return apr_get_os_error(); + } + } + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_thread_mutex_destroy(apr_thread_mutex_t *mutex) +{ + return apr_pool_cleanup_run(mutex->pool, mutex, thread_mutex_cleanup); +} + +APR_POOL_IMPLEMENT_ACCESSOR(thread_mutex) + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/locks/win32/thread_rwlock.c b/rubbos/app/httpd-2.0.64/srclib/apr/locks/win32/thread_rwlock.c new file mode 100644 index 00000000..7099509f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/locks/win32/thread_rwlock.c @@ -0,0 +1,165 @@ +/* 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. + */ + +#include "apr.h" +#include "apr_private.h" +#include "apr_general.h" +#include "apr_strings.h" +#include "win32/apr_arch_thread_rwlock.h" +#include "apr_portable.h" + +static apr_status_t thread_rwlock_cleanup(void *data) +{ + apr_thread_rwlock_t *rwlock = data; + + if (! CloseHandle(rwlock->read_event)) + return apr_get_os_error(); + + if (! CloseHandle(rwlock->write_mutex)) + return apr_get_os_error(); + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t)apr_thread_rwlock_create(apr_thread_rwlock_t **rwlock, + apr_pool_t *pool) +{ + *rwlock = apr_palloc(pool, sizeof(**rwlock)); + + (*rwlock)->pool = pool; + (*rwlock)->readers = 0; + + if (! ((*rwlock)->read_event = CreateEvent(NULL, TRUE, FALSE, NULL))) { + *rwlock = NULL; + return apr_get_os_error(); + } + + if (! ((*rwlock)->write_mutex = CreateMutex(NULL, FALSE, NULL))) { + CloseHandle((*rwlock)->read_event); + *rwlock = NULL; + return apr_get_os_error(); + } + + apr_pool_cleanup_register(pool, *rwlock, thread_rwlock_cleanup, + apr_pool_cleanup_null); + + return APR_SUCCESS; +} + +static apr_status_t apr_thread_rwlock_rdlock_core(apr_thread_rwlock_t *rwlock, + DWORD milliseconds) +{ + DWORD code = WaitForSingleObject(rwlock->write_mutex, milliseconds); + + if (code == WAIT_FAILED || code == WAIT_TIMEOUT) + return APR_FROM_OS_ERROR(code); + + /* We've successfully acquired the writer mutex, we can't be locked + * for write, so it's OK to add the reader lock. The writer mutex + * doubles as race condition protection for the readers counter. + */ + InterlockedIncrement(&rwlock->readers); + + if (! ResetEvent(rwlock->read_event)) + return apr_get_os_error(); + + if (! ReleaseMutex(rwlock->write_mutex)) + return apr_get_os_error(); + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_thread_rwlock_rdlock(apr_thread_rwlock_t *rwlock) +{ + return apr_thread_rwlock_rdlock_core(rwlock, INFINITE); +} + +APR_DECLARE(apr_status_t) +apr_thread_rwlock_tryrdlock(apr_thread_rwlock_t *rwlock) +{ + return apr_thread_rwlock_rdlock_core(rwlock, 0); +} + +static apr_status_t +apr_thread_rwlock_wrlock_core(apr_thread_rwlock_t *rwlock, DWORD milliseconds) +{ + DWORD code = WaitForSingleObject(rwlock->write_mutex, milliseconds); + + if (code == WAIT_FAILED || code == WAIT_TIMEOUT) + return APR_FROM_OS_ERROR(code); + + /* We've got the writer lock but we have to wait for all readers to + * unlock before it's ok to use it. + */ + if (rwlock->readers) { + /* Must wait for readers to finish before returning, unless this + * is an trywrlock (milliseconds == 0): + */ + code = milliseconds + ? WaitForSingleObject(rwlock->read_event, milliseconds) + : WAIT_TIMEOUT; + + if (code == WAIT_FAILED || code == WAIT_TIMEOUT) { + /* Unable to wait for readers to finish, release write lock: */ + if (! ReleaseMutex(rwlock->write_mutex)) + return apr_get_os_error(); + + return APR_FROM_OS_ERROR(code); + } + } + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_thread_rwlock_wrlock(apr_thread_rwlock_t *rwlock) +{ + return apr_thread_rwlock_wrlock_core(rwlock, INFINITE); +} + +APR_DECLARE(apr_status_t)apr_thread_rwlock_trywrlock(apr_thread_rwlock_t *rwlock) +{ + return apr_thread_rwlock_wrlock_core(rwlock, 0); +} + +APR_DECLARE(apr_status_t) apr_thread_rwlock_unlock(apr_thread_rwlock_t *rwlock) +{ + apr_status_t rv = 0; + + /* First, guess that we're unlocking a writer */ + if (! ReleaseMutex(rwlock->write_mutex)) + rv = apr_get_os_error(); + + if (rv == APR_FROM_OS_ERROR(ERROR_NOT_OWNER)) { + /* Nope, we must have a read lock */ + if (rwlock->readers && + ! InterlockedDecrement(&rwlock->readers) && + ! SetEvent(rwlock->read_event)) { + rv = apr_get_os_error(); + } + else { + rv = 0; + } + } + + return rv; +} + +APR_DECLARE(apr_status_t) apr_thread_rwlock_destroy(apr_thread_rwlock_t *rwlock) +{ + return apr_pool_cleanup_run(rwlock->pool, rwlock, thread_rwlock_cleanup); +} + +APR_POOL_IMPLEMENT_ACCESSOR(thread_rwlock) diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/memory/unix/.libs/apr_pools.o b/rubbos/app/httpd-2.0.64/srclib/apr/memory/unix/.libs/apr_pools.o new file mode 100644 index 0000000000000000000000000000000000000000..13799b4216ec2a003e0598b92ad2c2b379826119 GIT binary patch literal 69856 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 /* for malloc, free and abort */ +#endif + +#if APR_HAVE_UNISTD_H +#include /* for getpid */ +#endif + + +/* + * Magic numbers + */ + +#define MIN_ALLOC 8192 +#define MAX_INDEX 20 + +#define BOUNDARY_INDEX 12 +#define BOUNDARY_SIZE (1 << BOUNDARY_INDEX) + +/* + * Timing constants for killing subprocesses + * There is a total 3-second delay between sending a SIGINT + * and sending of the final SIGKILL. + * TIMEOUT_INTERVAL should be set to TIMEOUT_USECS / 64 + * for the exponetial timeout alogrithm. + */ +#define TIMEOUT_USECS 3000000 +#define TIMEOUT_INTERVAL 46875 + +/* + * Allocator + * + * @note The max_free_index and current_free_index fields are not really + * indices, but quantities of BOUNDARY_SIZE big memory blocks. + */ + +struct apr_allocator_t { + /** largest used index into free[], always < MAX_INDEX */ + apr_uint32_t max_index; + /** Total size (in BOUNDARY_SIZE multiples) of unused memory before + * blocks are given back. @see apr_allocator_max_free_set(). + * @note Initialized to APR_ALLOCATOR_MAX_FREE_UNLIMITED, + * which means to never give back blocks. + */ + apr_uint32_t max_free_index; + /** + * Memory size (in BOUNDARY_SIZE multiples) that currently must be freed + * before blocks are given back. Range: 0..max_free_index + */ + apr_uint32_t current_free_index; +#if APR_HAS_THREADS + apr_thread_mutex_t *mutex; +#endif /* APR_HAS_THREADS */ + apr_pool_t *owner; + /** + * Lists of free nodes. Slot 0 is used for oversized nodes, + * and the slots 1..MAX_INDEX-1 contain nodes of sizes + * (i+1) * BOUNDARY_SIZE. Example for BOUNDARY_INDEX == 12: + * slot 0: nodes larger than 81920 + * slot 1: size 8192 + * slot 2: size 12288 + * ... + * slot 19: size 81920 + */ + apr_memnode_t *free[MAX_INDEX]; +}; + +#define SIZEOF_ALLOCATOR_T APR_ALIGN_DEFAULT(sizeof(apr_allocator_t)) + + +/* + * Allocator + */ + +APR_DECLARE(apr_status_t) apr_allocator_create(apr_allocator_t **allocator) +{ + apr_allocator_t *new_allocator; + + *allocator = NULL; + + if ((new_allocator = malloc(SIZEOF_ALLOCATOR_T)) == NULL) + return APR_ENOMEM; + + memset(new_allocator, 0, SIZEOF_ALLOCATOR_T); + new_allocator->max_free_index = APR_ALLOCATOR_MAX_FREE_UNLIMITED; + + *allocator = new_allocator; + + return APR_SUCCESS; +} + +APR_DECLARE(void) apr_allocator_destroy(apr_allocator_t *allocator) +{ + apr_uint32_t index; + apr_memnode_t *node, **ref; + + for (index = 0; index < MAX_INDEX; index++) { + ref = &allocator->free[index]; + while ((node = *ref) != NULL) { + *ref = node->next; + free(node); + } + } + + free(allocator); +} + +#if APR_HAS_THREADS +APR_DECLARE(void) apr_allocator_mutex_set(apr_allocator_t *allocator, + apr_thread_mutex_t *mutex) +{ + allocator->mutex = mutex; +} + +APR_DECLARE(apr_thread_mutex_t *) apr_allocator_mutex_get( + apr_allocator_t *allocator) +{ + return allocator->mutex; +} +#endif /* APR_HAS_THREADS */ + +APR_DECLARE(void) apr_allocator_owner_set(apr_allocator_t *allocator, + apr_pool_t *pool) +{ + allocator->owner = pool; +} + +APR_DECLARE(apr_pool_t *) apr_allocator_owner_get(apr_allocator_t *allocator) +{ + return allocator->owner; +} + +APR_DECLARE(void) apr_allocator_max_free_set(apr_allocator_t *allocator, + apr_size_t size) +{ + apr_uint32_t max_free_index; + +#if APR_HAS_THREADS + apr_thread_mutex_t *mutex; + + mutex = apr_allocator_mutex_get(allocator); + if (mutex != NULL) + apr_thread_mutex_lock(mutex); +#endif /* APR_HAS_THREADS */ + + max_free_index = APR_ALIGN(size, BOUNDARY_SIZE) >> BOUNDARY_INDEX; + allocator->current_free_index += max_free_index; + allocator->current_free_index -= allocator->max_free_index; + allocator->max_free_index = max_free_index; + if (allocator->current_free_index > max_free_index) + allocator->current_free_index = max_free_index; + +#if APR_HAS_THREADS + if (mutex != NULL) + apr_thread_mutex_unlock(mutex); +#endif +} + +static APR_INLINE +apr_memnode_t *allocator_alloc(apr_allocator_t *allocator, apr_size_t in_size) +{ + apr_memnode_t *node, **ref; + apr_uint32_t i, index, max_index; + apr_size_t size; + + /* Round up the block size to the next boundary, but always + * allocate at least a certain size (MIN_ALLOC). + */ + size = APR_ALIGN(in_size + APR_MEMNODE_T_SIZE, BOUNDARY_SIZE); + if (size < in_size) { + return NULL; + } + if (size < MIN_ALLOC) + size = MIN_ALLOC; + + /* Find the index for this node size by + * dividing its size by the boundary size + */ + index = (size >> BOUNDARY_INDEX) - 1; + + /* First see if there are any nodes in the area we know + * our node will fit into. + */ + if (index <= allocator->max_index) { +#if APR_HAS_THREADS + if (allocator->mutex) + apr_thread_mutex_lock(allocator->mutex); +#endif /* APR_HAS_THREADS */ + + /* Walk the free list to see if there are + * any nodes on it of the requested size + * + * NOTE: an optimization would be to check + * allocator->free[index] first and if no + * node is present, directly use + * allocator->free[max_index]. This seems + * like overkill though and could cause + * memory waste. + */ + max_index = allocator->max_index; + ref = &allocator->free[index]; + i = index; + while (*ref == NULL && i < max_index) { + ref++; + i++; + } + + if ((node = *ref) != NULL) { + /* If we have found a node and it doesn't have any + * nodes waiting in line behind it _and_ we are on + * the highest available index, find the new highest + * available index + */ + if ((*ref = node->next) == NULL && i >= max_index) { + do { + ref--; + max_index--; + } + while (*ref == NULL && max_index > 0); + + allocator->max_index = max_index; + } + + allocator->current_free_index += node->index; + if (allocator->current_free_index > allocator->max_free_index) + allocator->current_free_index = allocator->max_free_index; + +#if APR_HAS_THREADS + if (allocator->mutex) + apr_thread_mutex_unlock(allocator->mutex); +#endif /* APR_HAS_THREADS */ + + node->next = NULL; + node->first_avail = (char *)node + APR_MEMNODE_T_SIZE; + + return node; + } + +#if APR_HAS_THREADS + if (allocator->mutex) + apr_thread_mutex_unlock(allocator->mutex); +#endif /* APR_HAS_THREADS */ + } + + /* If we found nothing, seek the sink (at index 0), if + * it is not empty. + */ + else if (allocator->free[0]) { +#if APR_HAS_THREADS + if (allocator->mutex) + apr_thread_mutex_lock(allocator->mutex); +#endif /* APR_HAS_THREADS */ + + /* Walk the free list to see if there are + * any nodes on it of the requested size + */ + ref = &allocator->free[0]; + while ((node = *ref) != NULL && index > node->index) + ref = &node->next; + + if (node) { + *ref = node->next; + + allocator->current_free_index += node->index; + if (allocator->current_free_index > allocator->max_free_index) + allocator->current_free_index = allocator->max_free_index; + +#if APR_HAS_THREADS + if (allocator->mutex) + apr_thread_mutex_unlock(allocator->mutex); +#endif /* APR_HAS_THREADS */ + + node->next = NULL; + node->first_avail = (char *)node + APR_MEMNODE_T_SIZE; + + return node; + } + +#if APR_HAS_THREADS + if (allocator->mutex) + apr_thread_mutex_unlock(allocator->mutex); +#endif /* APR_HAS_THREADS */ + } + + /* If we haven't got a suitable node, malloc a new one + * and initialize it. + */ + if ((node = malloc(size)) == NULL) + return NULL; + + node->next = NULL; + node->index = index; + node->first_avail = (char *)node + APR_MEMNODE_T_SIZE; + node->endp = (char *)node + size; + + return node; +} + +static APR_INLINE +void allocator_free(apr_allocator_t *allocator, apr_memnode_t *node) +{ + apr_memnode_t *next, *freelist = NULL; + apr_uint32_t index, max_index; + apr_uint32_t max_free_index, current_free_index; + +#if APR_HAS_THREADS + if (allocator->mutex) + apr_thread_mutex_lock(allocator->mutex); +#endif /* APR_HAS_THREADS */ + + max_index = allocator->max_index; + max_free_index = allocator->max_free_index; + current_free_index = allocator->current_free_index; + + /* Walk the list of submitted nodes and free them one by one, + * shoving them in the right 'size' buckets as we go. + */ + do { + next = node->next; + index = node->index; + + if (max_free_index != APR_ALLOCATOR_MAX_FREE_UNLIMITED + && index > current_free_index) { + node->next = freelist; + freelist = node; + } + else if (index < MAX_INDEX) { + /* Add the node to the appropiate 'size' bucket. Adjust + * the max_index when appropiate. + */ + if ((node->next = allocator->free[index]) == NULL + && index > max_index) { + max_index = index; + } + allocator->free[index] = node; + if (current_free_index >= index) + current_free_index -= index; + else + current_free_index = 0; + } + else { + /* This node is too large to keep in a specific size bucket, + * just add it to the sink (at index 0). + */ + node->next = allocator->free[0]; + allocator->free[0] = node; + if (current_free_index >= index) + current_free_index -= index; + else + current_free_index = 0; + } + } while ((node = next) != NULL); + + allocator->max_index = max_index; + allocator->current_free_index = current_free_index; + +#if APR_HAS_THREADS + if (allocator->mutex) + apr_thread_mutex_unlock(allocator->mutex); +#endif /* APR_HAS_THREADS */ + + while (freelist != NULL) { + node = freelist; + freelist = node->next; + free(node); + } +} + +APR_DECLARE(apr_memnode_t *) apr_allocator_alloc(apr_allocator_t *allocator, + apr_size_t size) +{ + return allocator_alloc(allocator, size); +} + +APR_DECLARE(void) apr_allocator_free(apr_allocator_t *allocator, + apr_memnode_t *node) +{ + allocator_free(allocator, node); +} + + + +/* + * Debug level + */ + +#define APR_POOL_DEBUG_GENERAL 0x01 +#define APR_POOL_DEBUG_VERBOSE 0x02 +#define APR_POOL_DEBUG_LIFETIME 0x04 +#define APR_POOL_DEBUG_OWNER 0x08 +#define APR_POOL_DEBUG_VERBOSE_ALLOC 0x10 + +#define APR_POOL_DEBUG_VERBOSE_ALL (APR_POOL_DEBUG_VERBOSE \ + | APR_POOL_DEBUG_VERBOSE_ALLOC) + + +/* + * Structures + */ + +typedef struct cleanup_t cleanup_t; + +/** A list of processes */ +struct process_chain { + /** The process ID */ + apr_proc_t *proc; + apr_kill_conditions_e kill_how; + /** The next process in the list */ + struct process_chain *next; +}; + + +#if APR_POOL_DEBUG + +typedef struct debug_node_t debug_node_t; + +struct debug_node_t { + debug_node_t *next; + apr_uint32_t index; + void *beginp[64]; + void *endp[64]; +}; + +#define SIZEOF_DEBUG_NODE_T APR_ALIGN_DEFAULT(sizeof(debug_node_t)) + +#endif /* APR_POOL_DEBUG */ + +/* The ref field in the apr_pool_t struct holds a + * pointer to the pointer referencing this pool. + * It is used for parent, child, sibling management. + * Look at apr_pool_create_ex() and apr_pool_destroy() + * to see how it is used. + */ +struct apr_pool_t { + apr_pool_t *parent; + apr_pool_t *child; + apr_pool_t *sibling; + apr_pool_t **ref; + cleanup_t *cleanups; + apr_allocator_t *allocator; + struct process_chain *subprocesses; + apr_abortfunc_t abort_fn; + apr_hash_t *user_data; + const char *tag; + +#if !APR_POOL_DEBUG + apr_memnode_t *active; + apr_memnode_t *self; /* The node containing the pool itself */ + char *self_first_avail; + +#else /* APR_POOL_DEBUG */ + debug_node_t *nodes; + const char *file_line; + apr_uint32_t creation_flags; + unsigned int stat_alloc; + unsigned int stat_total_alloc; + unsigned int stat_clear; +#if APR_HAS_THREADS + apr_os_thread_t owner; + apr_thread_mutex_t *mutex; +#endif /* APR_HAS_THREADS */ +#endif /* APR_POOL_DEBUG */ +#ifdef NETWARE + apr_os_proc_t owner_proc; +#endif /* defined(NETWARE) */ +}; + +#define SIZEOF_POOL_T APR_ALIGN_DEFAULT(sizeof(apr_pool_t)) + + +/* + * Variables + */ + +static apr_byte_t apr_pools_initialized = 0; +static apr_pool_t *global_pool = NULL; + +#if !APR_POOL_DEBUG +static apr_allocator_t *global_allocator = NULL; +#endif /* !APR_POOL_DEBUG */ + +#if (APR_POOL_DEBUG & APR_POOL_DEBUG_VERBOSE_ALL) +static apr_file_t *file_stderr = NULL; +#endif /* (APR_POOL_DEBUG & APR_POOL_DEBUG_VERBOSE_ALL) */ + +/* + * Local functions + */ + +static void run_cleanups(cleanup_t **c); +static void run_child_cleanups(cleanup_t **c); +static void free_proc_chain(struct process_chain *procs); + + +#if !APR_POOL_DEBUG +/* + * Initialization + */ + +APR_DECLARE(apr_status_t) apr_pool_initialize(void) +{ + apr_status_t rv; + + if (apr_pools_initialized++) + return APR_SUCCESS; + + if ((rv = apr_allocator_create(&global_allocator)) != APR_SUCCESS) { + apr_pools_initialized = 0; + return rv; + } + + if ((rv = apr_pool_create_ex(&global_pool, NULL, NULL, + global_allocator)) != APR_SUCCESS) { + apr_allocator_destroy(global_allocator); + global_allocator = NULL; + apr_pools_initialized = 0; + return rv; + } + + apr_pool_tag(global_pool, "apr_global_pool"); + + /* This has to happen here because mutexes might be backed by + * atomics. It used to be snug and safe in apr_initialize(). + */ + if ((rv = apr_atomic_init(global_pool)) != APR_SUCCESS) { + return rv; + } + +#if APR_HAS_THREADS + { + apr_thread_mutex_t *mutex; + + if ((rv = apr_thread_mutex_create(&mutex, + APR_THREAD_MUTEX_DEFAULT, + global_pool)) != APR_SUCCESS) { + return rv; + } + + apr_allocator_mutex_set(global_allocator, mutex); + } +#endif /* APR_HAS_THREADS */ + + apr_allocator_owner_set(global_allocator, global_pool); + + return APR_SUCCESS; +} + +APR_DECLARE(void) apr_pool_terminate(void) +{ + if (!apr_pools_initialized) + return; + + if (--apr_pools_initialized) + return; + + apr_pool_destroy(global_pool); /* This will also destroy the mutex */ + global_pool = NULL; + + global_allocator = NULL; +} + +#ifdef NETWARE +void netware_pool_proc_cleanup () +{ + apr_pool_t *pool = global_pool->child; + apr_os_proc_t owner_proc = (apr_os_proc_t)getnlmhandle(); + + while (pool) { + if (pool->owner_proc == owner_proc) { + apr_pool_destroy (pool); + pool = global_pool->child; + } + else { + pool = pool->sibling; + } + } + return; +} +#endif /* defined(NETWARE) */ + +/* Node list management helper macros; list_insert() inserts 'node' + * before 'point'. */ +#define list_insert(node, point) do { \ + node->ref = point->ref; \ + *node->ref = node; \ + node->next = point; \ + point->ref = &node->next; \ +} while (0) + +/* list_remove() removes 'node' from its list. */ +#define list_remove(node) do { \ + *node->ref = node->next; \ + node->next->ref = node->ref; \ +} while (0) + +/* + * Memory allocation + */ + +APR_DECLARE(void *) apr_palloc(apr_pool_t *pool, apr_size_t in_size) +{ + apr_memnode_t *active, *node; + void *mem; + apr_uint32_t free_index; + apr_size_t size; + + size = APR_ALIGN_DEFAULT(in_size); + if (size < in_size) { + if (pool->abort_fn) + pool->abort_fn(APR_ENOMEM); + return NULL; + } + active = pool->active; + + /* If the active node has enough bytes left, use it. */ + if (size < (apr_size_t)(active->endp - active->first_avail)) { + mem = active->first_avail; + active->first_avail += size; + + return mem; + } + + node = active->next; + if (size < (apr_size_t)(node->endp - node->first_avail)) { + list_remove(node); + } + else { + if ((node = allocator_alloc(pool->allocator, size)) == NULL) { + if (pool->abort_fn) + pool->abort_fn(APR_ENOMEM); + + return NULL; + } + } + + node->free_index = 0; + + mem = node->first_avail; + node->first_avail += size; + + list_insert(node, active); + + pool->active = node; + + free_index = (APR_ALIGN(active->endp - active->first_avail + 1, + BOUNDARY_SIZE) - BOUNDARY_SIZE) >> BOUNDARY_INDEX; + + active->free_index = free_index; + node = active->next; + if (free_index >= node->free_index) + return mem; + + do { + node = node->next; + } + while (free_index < node->free_index); + + list_remove(active); + list_insert(active, node); + + return mem; +} + +/* Provide an implementation of apr_pcalloc for backward compatibility + * with code built before apr_pcalloc was a macro + */ + +#ifdef apr_pcalloc +#undef apr_pcalloc +#endif + +APR_DECLARE(void *) apr_pcalloc(apr_pool_t *pool, apr_size_t size); +APR_DECLARE(void *) apr_pcalloc(apr_pool_t *pool, apr_size_t size) +{ + void *mem; + + if ((mem = apr_palloc(pool, size)) != NULL) { + memset(mem, 0, size); + } + + return mem; +} + + +/* + * Pool creation/destruction + */ + +APR_DECLARE(void) apr_pool_clear(apr_pool_t *pool) +{ + apr_memnode_t *active; + + /* Destroy the subpools. The subpools will detach themselves from + * this pool thus this loop is safe and easy. + */ + while (pool->child) + apr_pool_destroy(pool->child); + + /* Run cleanups */ + run_cleanups(&pool->cleanups); + pool->cleanups = NULL; + + /* Free subprocesses */ + free_proc_chain(pool->subprocesses); + pool->subprocesses = NULL; + + /* Clear the user data. */ + pool->user_data = NULL; + + /* Find the node attached to the pool structure, reset it, make + * it the active node and free the rest of the nodes. + */ + active = pool->active = pool->self; + active->first_avail = pool->self_first_avail; + + if (active->next == active) + return; + + *active->ref = NULL; + allocator_free(pool->allocator, active->next); + active->next = active; + active->ref = &active->next; +} + +APR_DECLARE(void) apr_pool_destroy(apr_pool_t *pool) +{ + apr_memnode_t *active; + apr_allocator_t *allocator; + + /* Destroy the subpools. The subpools will detach themselve from + * this pool thus this loop is safe and easy. + */ + while (pool->child) + apr_pool_destroy(pool->child); + + /* Run cleanups */ + run_cleanups(&pool->cleanups); + + /* Free subprocesses */ + free_proc_chain(pool->subprocesses); + + /* Remove the pool from the parents child list */ + if (pool->parent) { +#if APR_HAS_THREADS + apr_thread_mutex_t *mutex; + + if ((mutex = apr_allocator_mutex_get(pool->parent->allocator)) != NULL) + apr_thread_mutex_lock(mutex); +#endif /* APR_HAS_THREADS */ + + if ((*pool->ref = pool->sibling) != NULL) + pool->sibling->ref = pool->ref; + +#if APR_HAS_THREADS + if (mutex) + apr_thread_mutex_unlock(mutex); +#endif /* APR_HAS_THREADS */ + } + + /* Find the block attached to the pool structure. Save a copy of the + * allocator pointer, because the pool struct soon will be no more. + */ + allocator = pool->allocator; + active = pool->self; + *active->ref = NULL; + +#if APR_HAS_THREADS + if (apr_allocator_owner_get(allocator) == pool) { + /* Make sure to remove the lock, since it is highly likely to + * be invalid now. + */ + apr_allocator_mutex_set(allocator, NULL); + } +#endif /* APR_HAS_THREADS */ + + /* Free all the nodes in the pool (including the node holding the + * pool struct), by giving them back to the allocator. + */ + allocator_free(allocator, active); + + /* If this pool happens to be the owner of the allocator, free + * everything in the allocator (that includes the pool struct + * and the allocator). Don't worry about destroying the optional mutex + * in the allocator, it will have been destroyed by the cleanup function. + */ + if (apr_allocator_owner_get(allocator) == pool) { + apr_allocator_destroy(allocator); + } +} + +APR_DECLARE(apr_status_t) apr_pool_create_ex(apr_pool_t **newpool, + apr_pool_t *parent, + apr_abortfunc_t abort_fn, + apr_allocator_t *allocator) +{ + apr_pool_t *pool; + apr_memnode_t *node; + + *newpool = NULL; + + if (!parent) + parent = global_pool; + + if (!abort_fn && parent) + abort_fn = parent->abort_fn; + + if (allocator == NULL) + allocator = parent->allocator; + + if ((node = allocator_alloc(allocator, + MIN_ALLOC - APR_MEMNODE_T_SIZE)) == NULL) { + if (abort_fn) + abort_fn(APR_ENOMEM); + + return APR_ENOMEM; + } + + node->next = node; + node->ref = &node->next; + + pool = (apr_pool_t *)node->first_avail; + node->first_avail = pool->self_first_avail = (char *)pool + SIZEOF_POOL_T; + + pool->allocator = allocator; + pool->active = pool->self = node; + pool->abort_fn = abort_fn; + pool->child = NULL; + pool->cleanups = NULL; + pool->subprocesses = NULL; + pool->user_data = NULL; + pool->tag = NULL; + +#ifdef NETWARE + pool->owner_proc = (apr_os_proc_t)getnlmhandle(); +#endif /* defined(NETWARE) */ + + if ((pool->parent = parent) != NULL) { +#if APR_HAS_THREADS + apr_thread_mutex_t *mutex; + + if ((mutex = apr_allocator_mutex_get(parent->allocator)) != NULL) + apr_thread_mutex_lock(mutex); +#endif /* APR_HAS_THREADS */ + + if ((pool->sibling = parent->child) != NULL) + pool->sibling->ref = &pool->sibling; + + parent->child = pool; + pool->ref = &parent->child; + +#if APR_HAS_THREADS + if (mutex) + apr_thread_mutex_unlock(mutex); +#endif /* APR_HAS_THREADS */ + } + else { + pool->sibling = NULL; + pool->ref = NULL; + } + + *newpool = pool; + + return APR_SUCCESS; +} + + +/* + * "Print" functions + */ + +/* + * apr_psprintf is implemented by writing directly into the current + * block of the pool, starting right at first_avail. If there's + * insufficient room, then a new block is allocated and the earlier + * output is copied over. The new block isn't linked into the pool + * until all the output is done. + * + * Note that this is completely safe because nothing else can + * allocate in this apr_pool_t while apr_psprintf is running. alarms are + * blocked, and the only thing outside of apr_pools.c that's invoked + * is apr_vformatter -- which was purposefully written to be + * self-contained with no callouts. + */ + +struct psprintf_data { + apr_vformatter_buff_t vbuff; + apr_memnode_t *node; + apr_pool_t *pool; + apr_byte_t got_a_new_node; + apr_memnode_t *free; +}; + +#define APR_PSPRINTF_MIN_STRINGSIZE 32 + +static int psprintf_flush(apr_vformatter_buff_t *vbuff) +{ + struct psprintf_data *ps = (struct psprintf_data *)vbuff; + apr_memnode_t *node, *active; + apr_size_t cur_len, size; + char *strp; + apr_pool_t *pool; + apr_uint32_t free_index; + + pool = ps->pool; + active = ps->node; + strp = ps->vbuff.curpos; + cur_len = strp - active->first_avail; + size = cur_len << 1; + + /* Make sure that we don't try to use a block that has less + * than APR_PSPRINTF_MIN_STRINGSIZE bytes left in it. This + * also catches the case where size == 0, which would result + * in reusing a block that can't even hold the NUL byte. + */ + if (size < APR_PSPRINTF_MIN_STRINGSIZE) + size = APR_PSPRINTF_MIN_STRINGSIZE; + + node = active->next; + if (!ps->got_a_new_node + && size < (apr_size_t)(node->endp - node->first_avail)) { + + list_remove(node); + list_insert(node, active); + + node->free_index = 0; + + pool->active = node; + + free_index = (APR_ALIGN(active->endp - active->first_avail + 1, + BOUNDARY_SIZE) - BOUNDARY_SIZE) >> BOUNDARY_INDEX; + + active->free_index = free_index; + node = active->next; + if (free_index < node->free_index) { + do { + node = node->next; + } + while (free_index < node->free_index); + + list_remove(active); + list_insert(active, node); + } + + node = pool->active; + } + else { + if ((node = allocator_alloc(pool->allocator, size)) == NULL) + return -1; + + if (ps->got_a_new_node) { + active->next = ps->free; + ps->free = active; + } + + ps->got_a_new_node = 1; + } + + memcpy(node->first_avail, active->first_avail, cur_len); + + ps->node = node; + ps->vbuff.curpos = node->first_avail + cur_len; + ps->vbuff.endpos = node->endp - 1; /* Save a byte for NUL terminator */ + + return 0; +} + +APR_DECLARE(char *) apr_pvsprintf(apr_pool_t *pool, const char *fmt, va_list ap) +{ + struct psprintf_data ps; + char *strp; + apr_size_t size; + apr_memnode_t *active, *node; + apr_uint32_t free_index; + + ps.node = active = pool->active; + ps.pool = pool; + ps.vbuff.curpos = ps.node->first_avail; + + /* Save a byte for the NUL terminator */ + ps.vbuff.endpos = ps.node->endp - 1; + ps.got_a_new_node = 0; + ps.free = NULL; + + /* Make sure that the first node passed to apr_vformatter has at least + * room to hold the NUL terminator. + */ + if (ps.node->first_avail == ps.node->endp) { + if (psprintf_flush(&ps.vbuff) == -1) { + if (pool->abort_fn) { + pool->abort_fn(APR_ENOMEM); + } + + return NULL; + } + } + + if (apr_vformatter(psprintf_flush, &ps.vbuff, fmt, ap) == -1) { + if (pool->abort_fn) + pool->abort_fn(APR_ENOMEM); + + return NULL; + } + + strp = ps.vbuff.curpos; + *strp++ = '\0'; + + size = strp - ps.node->first_avail; + size = APR_ALIGN_DEFAULT(size); + strp = ps.node->first_avail; + ps.node->first_avail += size; + + if (ps.free) + allocator_free(pool->allocator, ps.free); + + /* + * Link the node in if it's a new one + */ + if (!ps.got_a_new_node) + return strp; + + active = pool->active; + node = ps.node; + + node->free_index = 0; + + list_insert(node, active); + + pool->active = node; + + free_index = (APR_ALIGN(active->endp - active->first_avail + 1, + BOUNDARY_SIZE) - BOUNDARY_SIZE) >> BOUNDARY_INDEX; + + active->free_index = free_index; + node = active->next; + + if (free_index >= node->free_index) + return strp; + + do { + node = node->next; + } + while (free_index < node->free_index); + + list_remove(active); + list_insert(active, node); + + return strp; +} + + +#else /* APR_POOL_DEBUG */ +/* + * Debug helper functions + */ + + +/* + * Walk the pool tree rooted at pool, depth first. When fn returns + * anything other than 0, abort the traversal and return the value + * returned by fn. + */ +static int apr_pool_walk_tree(apr_pool_t *pool, + int (*fn)(apr_pool_t *pool, void *data), + void *data) +{ + int rv; + apr_pool_t *child; + + rv = fn(pool, data); + if (rv) + return rv; + +#if APR_HAS_THREADS + if (pool->mutex) { + apr_thread_mutex_lock(pool->mutex); + } +#endif /* APR_HAS_THREADS */ + + child = pool->child; + while (child) { + rv = apr_pool_walk_tree(child, fn, data); + if (rv) + break; + + child = child->sibling; + } + +#if APR_HAS_THREADS + if (pool->mutex) { + apr_thread_mutex_unlock(pool->mutex); + } +#endif /* APR_HAS_THREADS */ + + return rv; +} + +#if (APR_POOL_DEBUG & APR_POOL_DEBUG_VERBOSE_ALL) +static void apr_pool_log_event(apr_pool_t *pool, const char *event, + const char *file_line, int deref) +{ + if (file_stderr) { + if (deref) { + apr_file_printf(file_stderr, + "POOL DEBUG: " + "[%lu" +#if APR_HAS_THREADS + "/%lu" +#endif /* APR_HAS_THREADS */ + "] " + "%7s " + "(%10lu/%10lu/%10lu) " + "0x%08X \"%s\" " + "<%s> " + "(%u/%u/%u) " + "\n", + (unsigned long)getpid(), +#if APR_HAS_THREADS + (unsigned long)apr_os_thread_current(), +#endif /* APR_HAS_THREADS */ + event, + (unsigned long)apr_pool_num_bytes(pool, 0), + (unsigned long)apr_pool_num_bytes(pool, 1), + (unsigned long)apr_pool_num_bytes(global_pool, 1), + (unsigned int)pool, pool->tag, + file_line, + pool->stat_alloc, pool->stat_total_alloc, pool->stat_clear); + } + else { + apr_file_printf(file_stderr, + "POOL DEBUG: " + "[%lu" +#if APR_HAS_THREADS + "/%lu" +#endif /* APR_HAS_THREADS */ + "] " + "%7s " + " " + "0x%08X " + "<%s> " + "\n", + (unsigned long)getpid(), +#if APR_HAS_THREADS + (unsigned long)apr_os_thread_current(), +#endif /* APR_HAS_THREADS */ + event, + (unsigned int)pool, + file_line); + } + } +} +#endif /* (APR_POOL_DEBUG & APR_POOL_DEBUG_VERBOSE_ALL) */ + +#if (APR_POOL_DEBUG & APR_POOL_DEBUG_LIFETIME) +static int pool_is_child_of(apr_pool_t *parent, void *data) +{ + apr_pool_t *pool = (apr_pool_t *)data; + + return (pool == parent); +} + +static int apr_pool_is_child_of(apr_pool_t *pool, apr_pool_t *parent) +{ + if (parent == NULL) + return 0; + + return apr_pool_walk_tree(parent, pool_is_child_of, pool); +} +#endif /* (APR_POOL_DEBUG & APR_POOL_DEBUG_LIFETIME) */ + +static void apr_pool_check_integrity(apr_pool_t *pool) +{ + /* Rule of thumb: use of the global pool is always + * ok, since the only user is apr_pools.c. Unless + * people have searched for the top level parent and + * started to use that... + */ + if (pool == global_pool || global_pool == NULL) + return; + + /* Lifetime + * This basically checks to see if the pool being used is still + * a relative to the global pool. If not it was previously + * destroyed, in which case we abort(). + */ +#if (APR_POOL_DEBUG & APR_POOL_DEBUG_LIFETIME) + if (!apr_pool_is_child_of(pool, global_pool)) { +#if (APR_POOL_DEBUG & APR_POOL_DEBUG_VERBOSE_ALL) + apr_pool_log_event(pool, "LIFE", + __FILE__ ":apr_pool_integrity check", 0); +#endif /* (APR_POOL_DEBUG & APR_POOL_DEBUG_VERBOSE_ALL) */ + abort(); + } +#endif /* (APR_POOL_DEBUG & APR_POOL_DEBUG_LIFETIME) */ + +#if (APR_POOL_DEBUG & APR_POOL_DEBUG_OWNER) +#if APR_HAS_THREADS + if (!apr_os_thread_equal(pool->owner, apr_os_thread_current())) { +#if (APR_POOL_DEBUG & APR_POOL_DEBUG_VERBOSE_ALL) + apr_pool_log_event(pool, "THREAD", + __FILE__ ":apr_pool_integrity check", 0); +#endif /* (APR_POOL_DEBUG & APR_POOL_DEBUG_VERBOSE_ALL) */ + abort(); + } +#endif /* APR_HAS_THREADS */ +#endif /* (APR_POOL_DEBUG & APR_POOL_DEBUG_OWNER) */ +} + + +/* + * Initialization (debug) + */ + +APR_DECLARE(apr_status_t) apr_pool_initialize(void) +{ + apr_status_t rv; + + if (apr_pools_initialized++) + return APR_SUCCESS; + + /* Since the debug code works a bit differently then the + * regular pools code, we ask for a lock here. The regular + * pools code has got this lock embedded in the global + * allocator, a concept unknown to debug mode. + */ + if ((rv = apr_pool_create_ex(&global_pool, NULL, NULL, + NULL)) != APR_SUCCESS) { + return rv; + } + + apr_pool_tag(global_pool, "APR global pool"); + + apr_pools_initialized = 1; + + /* This has to happen here because mutexes might be backed by + * atomics. It used to be snug and safe in apr_initialize(). + */ + if ((rv = apr_atomic_init(global_pool)) != APR_SUCCESS) { + return rv; + } + +#if (APR_POOL_DEBUG & APR_POOL_DEBUG_VERBOSE_ALL) + apr_file_open_stderr(&file_stderr, global_pool); + if (file_stderr) { + apr_file_printf(file_stderr, + "POOL DEBUG: [PID" +#if APR_HAS_THREADS + "/TID" +#endif /* APR_HAS_THREADS */ + "] ACTION (SIZE /POOL SIZE /TOTAL SIZE) " + "POOL \"TAG\" <__FILE__:__LINE__> (ALLOCS/TOTAL ALLOCS/CLEARS)\n"); + + apr_pool_log_event(global_pool, "GLOBAL", __FILE__ ":apr_pool_initialize", 0); + } +#endif /* (APR_POOL_DEBUG & APR_POOL_DEBUG_VERBOSE_ALL) */ + + return APR_SUCCESS; +} + +APR_DECLARE(void) apr_pool_terminate(void) +{ + if (!apr_pools_initialized) + return; + + apr_pools_initialized = 0; + + apr_pool_destroy(global_pool); /* This will also destroy the mutex */ + global_pool = NULL; + +#if (APR_POOL_DEBUG & APR_POOL_DEBUG_VERBOSE_ALL) + file_stderr = NULL; +#endif /* (APR_POOL_DEBUG & APR_POOL_DEBUG_VERBOSE_ALL) */ +} + + +/* + * Memory allocation (debug) + */ + +static void *pool_alloc(apr_pool_t *pool, apr_size_t size) +{ + debug_node_t *node; + void *mem; + + if ((mem = malloc(size)) == NULL) { + if (pool->abort_fn) + pool->abort_fn(APR_ENOMEM); + + return NULL; + } + + node = pool->nodes; + if (node == NULL || node->index == 64) { + if ((node = malloc(SIZEOF_DEBUG_NODE_T)) == NULL) { + if (pool->abort_fn) + pool->abort_fn(APR_ENOMEM); + + return NULL; + } + + memset(node, 0, SIZEOF_DEBUG_NODE_T); + + node->next = pool->nodes; + pool->nodes = node; + node->index = 0; + } + + node->beginp[node->index] = mem; + node->endp[node->index] = (char *)mem + size; + node->index++; + + pool->stat_alloc++; + pool->stat_total_alloc++; + + return mem; +} + +APR_DECLARE(void *) apr_palloc_debug(apr_pool_t *pool, apr_size_t size, + const char *file_line) +{ + void *mem; + + apr_pool_check_integrity(pool); + + mem = pool_alloc(pool, size); + +#if (APR_POOL_DEBUG & APR_POOL_DEBUG_VERBOSE_ALLOC) + apr_pool_log_event(pool, "PALLOC", file_line, 1); +#endif /* (APR_POOL_DEBUG & APR_POOL_DEBUG_VERBOSE_ALLOC) */ + + return mem; +} + +APR_DECLARE(void *) apr_pcalloc_debug(apr_pool_t *pool, apr_size_t size, + const char *file_line) +{ + void *mem; + + apr_pool_check_integrity(pool); + + mem = pool_alloc(pool, size); + memset(mem, 0, size); + +#if (APR_POOL_DEBUG & APR_POOL_DEBUG_VERBOSE_ALLOC) + apr_pool_log_event(pool, "PCALLOC", file_line, 1); +#endif /* (APR_POOL_DEBUG & APR_POOL_DEBUG_VERBOSE_ALLOC) */ + + return mem; +} + + +/* + * Pool creation/destruction (debug) + */ + +#define POOL_POISON_BYTE 'A' + +static void pool_clear_debug(apr_pool_t *pool, const char *file_line) +{ + debug_node_t *node; + apr_uint32_t index; + + /* Destroy the subpools. The subpools will detach themselves from + * this pool thus this loop is safe and easy. + */ + while (pool->child) + apr_pool_destroy_debug(pool->child, file_line); + + /* Run cleanups */ + run_cleanups(&pool->cleanups); + pool->cleanups = NULL; + + /* Free subprocesses */ + free_proc_chain(pool->subprocesses); + pool->subprocesses = NULL; + + /* Clear the user data. */ + pool->user_data = NULL; + + /* Free the blocks, scribbling over them first to help highlight + * use-after-free issues. */ + while ((node = pool->nodes) != NULL) { + pool->nodes = node->next; + + for (index = 0; index < node->index; index++) { + memset(node->beginp[index], POOL_POISON_BYTE, + node->endp[index] - node->beginp[index]); + free(node->beginp[index]); + } + + memset(node, POOL_POISON_BYTE, SIZEOF_DEBUG_NODE_T); + free(node); + } + + pool->stat_alloc = 0; + pool->stat_clear++; +} + +APR_DECLARE(void) apr_pool_clear_debug(apr_pool_t *pool, + const char *file_line) +{ +#if APR_HAS_THREADS + apr_thread_mutex_t *mutex = NULL; +#endif + + apr_pool_check_integrity(pool); + +#if (APR_POOL_DEBUG & APR_POOL_DEBUG_VERBOSE) + apr_pool_log_event(pool, "CLEAR", file_line, 1); +#endif /* (APR_POOL_DEBUG & APR_POOL_DEBUG_VERBOSE) */ + +#if APR_HAS_THREADS + if (pool->parent != NULL) + mutex = pool->parent->mutex; + + /* Lock the parent mutex before clearing so that if we have our + * own mutex it won't be accessed by apr_pool_walk_tree after + * it has been destroyed. + */ + if (mutex != NULL && mutex != pool->mutex) { + apr_thread_mutex_lock(mutex); + } +#endif + + pool_clear_debug(pool, file_line); + +#if APR_HAS_THREADS + /* If we had our own mutex, it will have been destroyed by + * the registered cleanups. Recreate the mutex. Unlock + * the mutex we obtained above. + */ + if (mutex != pool->mutex) { + (void)apr_thread_mutex_create(&pool->mutex, + APR_THREAD_MUTEX_NESTED, pool); + + if (mutex != NULL) + (void)apr_thread_mutex_unlock(mutex); + } +#endif /* APR_HAS_THREADS */ +} + +APR_DECLARE(void) apr_pool_destroy_debug(apr_pool_t *pool, + const char *file_line) +{ + apr_pool_check_integrity(pool); + +#if (APR_POOL_DEBUG & APR_POOL_DEBUG_VERBOSE) + apr_pool_log_event(pool, "DESTROY", file_line, 1); +#endif /* (APR_POOL_DEBUG & APR_POOL_DEBUG_VERBOSE) */ + + pool_clear_debug(pool, file_line); + + /* Remove the pool from the parents child list */ + if (pool->parent) { +#if APR_HAS_THREADS + apr_thread_mutex_t *mutex; + + if ((mutex = pool->parent->mutex) != NULL) + apr_thread_mutex_lock(mutex); +#endif /* APR_HAS_THREADS */ + + if ((*pool->ref = pool->sibling) != NULL) + pool->sibling->ref = pool->ref; + +#if APR_HAS_THREADS + if (mutex) + apr_thread_mutex_unlock(mutex); +#endif /* APR_HAS_THREADS */ + } + + if (pool->allocator != NULL + && apr_allocator_owner_get(pool->allocator) == pool) { + apr_allocator_destroy(pool->allocator); + } + + /* Free the pool itself */ + free(pool); +} + +APR_DECLARE(apr_status_t) apr_pool_create_ex_debug(apr_pool_t **newpool, + apr_pool_t *parent, + apr_abortfunc_t abort_fn, + apr_allocator_t *allocator, + const char *file_line) +{ + apr_pool_t *pool; + + *newpool = NULL; + + if (!parent) { + parent = global_pool; + } + else { + apr_pool_check_integrity(parent); + + if (!allocator) + allocator = parent->allocator; + } + + if (!abort_fn && parent) + abort_fn = parent->abort_fn; + + if ((pool = malloc(SIZEOF_POOL_T)) == NULL) { + if (abort_fn) + abort_fn(APR_ENOMEM); + + return APR_ENOMEM; + } + + memset(pool, 0, SIZEOF_POOL_T); + + pool->allocator = allocator; + pool->abort_fn = abort_fn; + pool->tag = file_line; + pool->file_line = file_line; + + if ((pool->parent = parent) != NULL) { +#if APR_HAS_THREADS + if (parent->mutex) + apr_thread_mutex_lock(parent->mutex); +#endif /* APR_HAS_THREADS */ + if ((pool->sibling = parent->child) != NULL) + pool->sibling->ref = &pool->sibling; + + parent->child = pool; + pool->ref = &parent->child; + +#if APR_HAS_THREADS + if (parent->mutex) + apr_thread_mutex_unlock(parent->mutex); +#endif /* APR_HAS_THREADS */ + } + else { + pool->sibling = NULL; + pool->ref = NULL; + } + +#if APR_HAS_THREADS + pool->owner = apr_os_thread_current(); +#endif /* APR_HAS_THREADS */ + + if (parent == NULL || parent->allocator != allocator) { +#if APR_HAS_THREADS + apr_status_t rv; + + /* No matter what the creation flags say, always create + * a lock. Without it integrity_check and apr_pool_num_bytes + * blow up (because they traverse pools child lists that + * possibly belong to another thread, in combination with + * the pool having no lock). However, this might actually + * hide problems like creating a child pool of a pool + * belonging to another thread. + */ + if ((rv = apr_thread_mutex_create(&pool->mutex, + APR_THREAD_MUTEX_NESTED, pool)) != APR_SUCCESS) { + free(pool); + return rv; + } +#endif /* APR_HAS_THREADS */ + } + else { +#if APR_HAS_THREADS + if (parent) + pool->mutex = parent->mutex; +#endif /* APR_HAS_THREADS */ + } + + *newpool = pool; + +#if (APR_POOL_DEBUG & APR_POOL_DEBUG_VERBOSE) + apr_pool_log_event(pool, "CREATE", file_line, 1); +#endif /* (APR_POOL_DEBUG & APR_POOL_DEBUG_VERBOSE) */ + + return APR_SUCCESS; +} + + +/* + * "Print" functions (debug) + */ + +struct psprintf_data { + apr_vformatter_buff_t vbuff; + char *mem; + apr_size_t size; +}; + +static int psprintf_flush(apr_vformatter_buff_t *vbuff) +{ + struct psprintf_data *ps = (struct psprintf_data *)vbuff; + apr_size_t size; + + size = ps->vbuff.curpos - ps->mem; + + ps->size <<= 1; + if ((ps->mem = realloc(ps->mem, ps->size)) == NULL) + return -1; + + ps->vbuff.curpos = ps->mem + size; + ps->vbuff.endpos = ps->mem + ps->size - 1; + + return 0; +} + +APR_DECLARE(char *) apr_pvsprintf(apr_pool_t *pool, const char *fmt, va_list ap) +{ + struct psprintf_data ps; + debug_node_t *node; + + apr_pool_check_integrity(pool); + + ps.size = 64; + ps.mem = malloc(ps.size); + ps.vbuff.curpos = ps.mem; + + /* Save a byte for the NUL terminator */ + ps.vbuff.endpos = ps.mem + ps.size - 1; + + if (apr_vformatter(psprintf_flush, &ps.vbuff, fmt, ap) == -1) { + if (pool->abort_fn) + pool->abort_fn(APR_ENOMEM); + + return NULL; + } + + *ps.vbuff.curpos++ = '\0'; + + /* + * Link the node in + */ + node = pool->nodes; + if (node == NULL || node->index == 64) { + if ((node = malloc(SIZEOF_DEBUG_NODE_T)) == NULL) { + if (pool->abort_fn) + pool->abort_fn(APR_ENOMEM); + + return NULL; + } + + node->next = pool->nodes; + pool->nodes = node; + node->index = 0; + } + + node->beginp[node->index] = ps.mem; + node->endp[node->index] = ps.mem + ps.size; + node->index++; + + return ps.mem; +} + + +/* + * Debug functions + */ + +APR_DECLARE(void) apr_pool_join(apr_pool_t *p, apr_pool_t *sub) +{ +} + +static int pool_find(apr_pool_t *pool, void *data) +{ + void **pmem = (void **)data; + debug_node_t *node; + apr_uint32_t index; + + node = pool->nodes; + + while (node) { + for (index = 0; index < node->index; index++) { + if (node->beginp[index] <= *pmem + && node->endp[index] > *pmem) { + *pmem = pool; + return 1; + } + } + + node = node->next; + } + + return 0; +} + +APR_DECLARE(apr_pool_t *) apr_pool_find(const void *mem) +{ + void *pool = (void *)mem; + + if (apr_pool_walk_tree(global_pool, pool_find, &pool)) + return pool; + + return NULL; +} + +static int pool_num_bytes(apr_pool_t *pool, void *data) +{ + apr_size_t *psize = (apr_size_t *)data; + debug_node_t *node; + apr_uint32_t index; + + node = pool->nodes; + + while (node) { + for (index = 0; index < node->index; index++) { + *psize += (char *)node->endp[index] - (char *)node->beginp[index]; + } + + node = node->next; + } + + return 0; +} + +APR_DECLARE(apr_size_t) apr_pool_num_bytes(apr_pool_t *pool, int recurse) +{ + apr_size_t size = 0; + + if (!recurse) { + pool_num_bytes(pool, &size); + + return size; + } + + apr_pool_walk_tree(pool, pool_num_bytes, &size); + + return size; +} + +APR_DECLARE(void) apr_pool_lock(apr_pool_t *pool, int flag) +{ +} + +#endif /* !APR_POOL_DEBUG */ + + +/* + * "Print" functions (common) + */ + +APR_DECLARE_NONSTD(char *) apr_psprintf(apr_pool_t *p, const char *fmt, ...) +{ + va_list ap; + char *res; + + va_start(ap, fmt); + res = apr_pvsprintf(p, fmt, ap); + va_end(ap); + return res; +} + +/* + * Pool Properties + */ + +APR_DECLARE(void) apr_pool_abort_set(apr_abortfunc_t abort_fn, + apr_pool_t *pool) +{ + pool->abort_fn = abort_fn; +} + +APR_DECLARE(apr_abortfunc_t) apr_pool_abort_get(apr_pool_t *pool) +{ + return pool->abort_fn; +} + +APR_DECLARE(apr_pool_t *) apr_pool_parent_get(apr_pool_t *pool) +{ +#ifdef NETWARE + /* On NetWare, don't return the global_pool, return the application pool + as the top most pool */ + if (pool->parent == global_pool) + return NULL; + else +#endif + return pool->parent; +} + +APR_DECLARE(apr_allocator_t *) apr_pool_allocator_get(apr_pool_t *pool) +{ + return pool->allocator; +} + +/* return TRUE if a is an ancestor of b + * NULL is considered an ancestor of all pools + */ +APR_DECLARE(int) apr_pool_is_ancestor(apr_pool_t *a, apr_pool_t *b) +{ + if (a == NULL) + return 1; + + while (b) { + if (a == b) + return 1; + + b = b->parent; + } + + return 0; +} + +APR_DECLARE(void) apr_pool_tag(apr_pool_t *pool, const char *tag) +{ + pool->tag = tag; +} + + +/* + * User data management + */ + +APR_DECLARE(apr_status_t) apr_pool_userdata_set(const void *data, const char *key, + apr_status_t (*cleanup) (void *), + apr_pool_t *pool) +{ +#if APR_POOL_DEBUG + apr_pool_check_integrity(pool); +#endif /* APR_POOL_DEBUG */ + + if (pool->user_data == NULL) + pool->user_data = apr_hash_make(pool); + + if (apr_hash_get(pool->user_data, key, APR_HASH_KEY_STRING) == NULL) { + char *new_key = apr_pstrdup(pool, key); + apr_hash_set(pool->user_data, new_key, APR_HASH_KEY_STRING, data); + } + else { + apr_hash_set(pool->user_data, key, APR_HASH_KEY_STRING, data); + } + + if (cleanup) + apr_pool_cleanup_register(pool, data, cleanup, cleanup); + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_pool_userdata_setn(const void *data, + const char *key, + apr_status_t (*cleanup)(void *), + apr_pool_t *pool) +{ +#if APR_POOL_DEBUG + apr_pool_check_integrity(pool); +#endif /* APR_POOL_DEBUG */ + + if (pool->user_data == NULL) + pool->user_data = apr_hash_make(pool); + + apr_hash_set(pool->user_data, key, APR_HASH_KEY_STRING, data); + + if (cleanup) + apr_pool_cleanup_register(pool, data, cleanup, cleanup); + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_pool_userdata_get(void **data, const char *key, + apr_pool_t *pool) +{ +#if APR_POOL_DEBUG + apr_pool_check_integrity(pool); +#endif /* APR_POOL_DEBUG */ + + if (pool->user_data == NULL) { + *data = NULL; + } + else { + *data = apr_hash_get(pool->user_data, key, APR_HASH_KEY_STRING); + } + + return APR_SUCCESS; +} + + +/* + * Cleanup + */ + +struct cleanup_t { + struct cleanup_t *next; + const void *data; + apr_status_t (*plain_cleanup_fn)(void *data); + apr_status_t (*child_cleanup_fn)(void *data); +}; + +APR_DECLARE(void) apr_pool_cleanup_register(apr_pool_t *p, const void *data, + apr_status_t (*plain_cleanup_fn)(void *data), + apr_status_t (*child_cleanup_fn)(void *data)) +{ + cleanup_t *c; + +#if APR_POOL_DEBUG + apr_pool_check_integrity(p); +#endif /* APR_POOL_DEBUG */ + + if (p != NULL) { + c = (cleanup_t *)apr_palloc(p, sizeof(cleanup_t)); + c->data = data; + c->plain_cleanup_fn = plain_cleanup_fn; + c->child_cleanup_fn = child_cleanup_fn; + c->next = p->cleanups; + p->cleanups = c; + } +} + +APR_DECLARE(void) apr_pool_cleanup_kill(apr_pool_t *p, const void *data, + apr_status_t (*cleanup_fn)(void *)) +{ + cleanup_t *c, **lastp; + +#if APR_POOL_DEBUG + apr_pool_check_integrity(p); +#endif /* APR_POOL_DEBUG */ + + if (p == NULL) + return; + + c = p->cleanups; + lastp = &p->cleanups; + while (c) { + if (c->data == data && c->plain_cleanup_fn == cleanup_fn) { + *lastp = c->next; + break; + } + + lastp = &c->next; + c = c->next; + } +} + +APR_DECLARE(void) apr_pool_child_cleanup_set(apr_pool_t *p, const void *data, + apr_status_t (*plain_cleanup_fn)(void *), + apr_status_t (*child_cleanup_fn)(void *)) +{ + cleanup_t *c; + +#if APR_POOL_DEBUG + apr_pool_check_integrity(p); +#endif /* APR_POOL_DEBUG */ + + if (p == NULL) + return; + + c = p->cleanups; + while (c) { + if (c->data == data && c->plain_cleanup_fn == plain_cleanup_fn) { + c->child_cleanup_fn = child_cleanup_fn; + break; + } + + c = c->next; + } +} + +APR_DECLARE(apr_status_t) apr_pool_cleanup_run(apr_pool_t *p, void *data, + apr_status_t (*cleanup_fn)(void *)) +{ + apr_pool_cleanup_kill(p, data, cleanup_fn); + return (*cleanup_fn)(data); +} + +static void run_cleanups(cleanup_t **cref) +{ + cleanup_t *c = *cref; + + while (c) { + *cref = c->next; + (*c->plain_cleanup_fn)((void *)c->data); + c = *cref; + } +} + +static void run_child_cleanups(cleanup_t **cref) +{ + cleanup_t *c = *cref; + + while (c) { + *cref = c->next; + (*c->child_cleanup_fn)((void *)c->data); + c = *cref; + } +} + +static void cleanup_pool_for_exec(apr_pool_t *p) +{ + run_child_cleanups(&p->cleanups); + + for (p = p->child; p; p = p->sibling) + cleanup_pool_for_exec(p); +} + +APR_DECLARE(void) apr_pool_cleanup_for_exec(void) +{ +#if !defined(WIN32) && !defined(OS2) + /* + * Don't need to do anything on NT or OS/2, because I + * am actually going to spawn the new process - not + * exec it. All handles that are not inheritable, will + * be automajically closed. The only problem is with + * file handles that are open, but there isn't much + * I can do about that (except if the child decides + * to go out and close them + */ + cleanup_pool_for_exec(global_pool); +#endif /* !defined(WIN32) && !defined(OS2) */ +} + +APR_DECLARE_NONSTD(apr_status_t) apr_pool_cleanup_null(void *data) +{ + /* do nothing cleanup routine */ + return APR_SUCCESS; +} + +/* Subprocesses don't use the generic cleanup interface because + * we don't want multiple subprocesses to result in multiple + * three-second pauses; the subprocesses have to be "freed" all + * at once. If other resources are introduced with the same property, + * we might want to fold support for that into the generic interface. + * For now, it's a special case. + */ +APR_DECLARE(void) apr_pool_note_subprocess(apr_pool_t *pool, apr_proc_t *proc, + apr_kill_conditions_e how) +{ + struct process_chain *pc = apr_palloc(pool, sizeof(struct process_chain)); + + pc->proc = proc; + pc->kill_how = how; + pc->next = pool->subprocesses; + pool->subprocesses = pc; +} + +static void free_proc_chain(struct process_chain *procs) +{ + /* Dispose of the subprocesses we've spawned off in the course of + * whatever it was we're cleaning up now. This may involve killing + * some of them off... + */ + struct process_chain *pc; + int need_timeout = 0; + apr_time_t timeout_interval; + + if (!procs) + return; /* No work. Whew! */ + + /* First, check to see if we need to do the SIGTERM, sleep, SIGKILL + * dance with any of the processes we're cleaning up. If we've got + * any kill-on-sight subprocesses, ditch them now as well, so they + * don't waste any more cycles doing whatever it is that they shouldn't + * be doing anymore. + */ + +#ifndef NEED_WAITPID + /* Pick up all defunct processes */ + for (pc = procs; pc; pc = pc->next) { + if (apr_proc_wait(pc->proc, NULL, NULL, APR_NOWAIT) != APR_CHILD_NOTDONE) + pc->kill_how = APR_KILL_NEVER; + } +#endif /* !defined(NEED_WAITPID) */ + + for (pc = procs; pc; pc = pc->next) { +#ifndef WIN32 + if ((pc->kill_how == APR_KILL_AFTER_TIMEOUT) + || (pc->kill_how == APR_KILL_ONLY_ONCE)) { + /* + * Subprocess may be dead already. Only need the timeout if not. + * Note: apr_proc_kill on Windows is TerminateProcess(), which is + * similar to a SIGKILL, so always give the process a timeout + * under Windows before killing it. + */ + if (apr_proc_kill(pc->proc, SIGTERM) == APR_SUCCESS) + need_timeout = 1; + } + else if (pc->kill_how == APR_KILL_ALWAYS) { +#else /* WIN32 knows only one fast, clean method of killing processes today */ + if (pc->kill_how != APR_KILL_NEVER) { + need_timeout = 1; + pc->kill_how = APR_KILL_ALWAYS; +#endif + apr_proc_kill(pc->proc, SIGKILL); + } + } + + /* Sleep only if we have to. The sleep algorithm grows + * by a factor of two on each iteration. TIMEOUT_INTERVAL + * is equal to TIMEOUT_USECS / 64. + */ + if (need_timeout) { + timeout_interval = TIMEOUT_INTERVAL; + apr_sleep(timeout_interval); + + do { + /* check the status of the subprocesses */ + need_timeout = 0; + for (pc = procs; pc; pc = pc->next) { + if (pc->kill_how == APR_KILL_AFTER_TIMEOUT) { + if (apr_proc_wait(pc->proc, NULL, NULL, APR_NOWAIT) + == APR_CHILD_NOTDONE) + need_timeout = 1; /* subprocess is still active */ + else + pc->kill_how = APR_KILL_NEVER; /* subprocess has exited */ + } + } + if (need_timeout) { + if (timeout_interval >= TIMEOUT_USECS) { + break; + } + apr_sleep(timeout_interval); + timeout_interval *= 2; + } + } while (need_timeout); + } + + /* OK, the scripts we just timed out for have had a chance to clean up + * --- now, just get rid of them, and also clean up the system accounting + * goop... + */ + for (pc = procs; pc; pc = pc->next) { + if (pc->kill_how == APR_KILL_AFTER_TIMEOUT) + apr_proc_kill(pc->proc, SIGKILL); + } + + /* Now wait for all the signaled processes to die */ + for (pc = procs; pc; pc = pc->next) { + if (pc->kill_how != APR_KILL_NEVER) + (void)apr_proc_wait(pc->proc, NULL, NULL, APR_WAIT); + } +} + + +/* + * Pool creation/destruction stubs, for people who are running + * mixed release/debug enviroments. + */ + +#if !APR_POOL_DEBUG +APR_DECLARE(void *) apr_palloc_debug(apr_pool_t *pool, apr_size_t size, + const char *file_line) +{ + return apr_palloc(pool, size); +} + +APR_DECLARE(void *) apr_pcalloc_debug(apr_pool_t *pool, apr_size_t size, + const char *file_line) +{ + return apr_pcalloc(pool, size); +} + +APR_DECLARE(void) apr_pool_clear_debug(apr_pool_t *pool, + const char *file_line) +{ + apr_pool_clear(pool); +} + +APR_DECLARE(void) apr_pool_destroy_debug(apr_pool_t *pool, + const char *file_line) +{ + apr_pool_destroy(pool); +} + +APR_DECLARE(apr_status_t) apr_pool_create_ex_debug(apr_pool_t **newpool, + apr_pool_t *parent, + apr_abortfunc_t abort_fn, + apr_allocator_t *allocator, + const char *file_line) +{ + return apr_pool_create_ex(newpool, parent, abort_fn, allocator); +} + +#else /* APR_POOL_DEBUG */ + +#undef apr_palloc +APR_DECLARE(void *) apr_palloc(apr_pool_t *pool, apr_size_t size); + +APR_DECLARE(void *) apr_palloc(apr_pool_t *pool, apr_size_t size) +{ + return apr_palloc_debug(pool, size, "undefined"); +} + +#undef apr_pcalloc +APR_DECLARE(void *) apr_pcalloc(apr_pool_t *pool, apr_size_t size); + +APR_DECLARE(void *) apr_pcalloc(apr_pool_t *pool, apr_size_t size) +{ + return apr_pcalloc_debug(pool, size, "undefined"); +} + +#undef apr_pool_clear +APR_DECLARE(void) apr_pool_clear(apr_pool_t *pool); + +APR_DECLARE(void) apr_pool_clear(apr_pool_t *pool) +{ + apr_pool_clear_debug(pool, "undefined"); +} + +#undef apr_pool_destroy +APR_DECLARE(void) apr_pool_destroy(apr_pool_t *pool); + +APR_DECLARE(void) apr_pool_destroy(apr_pool_t *pool) +{ + apr_pool_destroy_debug(pool, "undefined"); +} + +#undef apr_pool_create_ex +APR_DECLARE(apr_status_t) apr_pool_create_ex(apr_pool_t **newpool, + apr_pool_t *parent, + apr_abortfunc_t abort_fn, + apr_allocator_t *allocator); + +APR_DECLARE(apr_status_t) apr_pool_create_ex(apr_pool_t **newpool, + apr_pool_t *parent, + apr_abortfunc_t abort_fn, + apr_allocator_t *allocator) +{ + return apr_pool_create_ex_debug(newpool, parent, + abort_fn, allocator, + "undefined"); +} + +#endif /* APR_POOL_DEBUG */ + +/* Deprecated */ +APR_DECLARE(void) apr_allocator_set_max_free(apr_allocator_t *allocator, + apr_size_t size) +{ + apr_allocator_max_free_set(allocator, size); +} + +/* Deprecated */ +APR_DECLARE(void) apr_pool_set_abort(apr_abortfunc_t abort_fn, + apr_pool_t *pool) +{ + apr_pool_abort_set(abort_fn, pool); +} + +/* Deprecated */ +APR_DECLARE(apr_abortfunc_t) apr_pool_get_abort(apr_pool_t *pool) +{ + return apr_pool_abort_get(pool); +} + +/* Deprecated */ +APR_DECLARE(apr_pool_t *) apr_pool_get_parent(apr_pool_t *pool) +{ + return apr_pool_parent_get(pool); +} + +/* Deprecated */ +APR_DECLARE(void) apr_allocator_set_owner(apr_allocator_t *allocator, + apr_pool_t *pool) +{ + apr_allocator_owner_set(allocator, pool); +} + +/* Deprecated */ +APR_DECLARE(apr_pool_t *) apr_allocator_get_owner( + apr_allocator_t *allocator) +{ + return apr_allocator_owner_get(allocator); +} + +#if APR_HAS_THREADS +/* Deprecated */ +APR_DECLARE(apr_thread_mutex_t *) apr_allocator_get_mutex( + apr_allocator_t *allocator) +{ + return apr_allocator_mutex_get(allocator); +} + +/* Deprecated */ +APR_DECLARE(void) apr_allocator_set_mutex(apr_allocator_t *allocator, + apr_thread_mutex_t *mutex) +{ + apr_allocator_mutex_set(allocator, mutex); +} +#endif /* APR_HAS_THREADS */ + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/memory/unix/apr_pools.lo b/rubbos/app/httpd-2.0.64/srclib/apr/memory/unix/apr_pools.lo new file mode 100644 index 00000000..7b062dc8 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/memory/unix/apr_pools.lo @@ -0,0 +1,12 @@ +# apr_pools.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/apr_pools.o' + +# Name of the non-PIC object. +non_pic_object='apr_pools.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/memory/unix/apr_pools.o b/rubbos/app/httpd-2.0.64/srclib/apr/memory/unix/apr_pools.o new file mode 100644 index 0000000000000000000000000000000000000000..c3f2036d98734b9eccc7f94b6f979c06fa2eef42 GIT binary patch literal 69504 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/misc/netware/apr.xdc b/rubbos/app/httpd-2.0.64/srclib/apr/misc/netware/apr.xdc new file mode 100644 index 0000000000000000000000000000000000000000..12a7f6ba2df41eccb047c2884088c022f9395540 GIT binary patch literal 128 zcmZ>Aba!K7U|?VbVr&2;2Lb{>% +#include +#include +#include "novsock2.h" + +#include "apr_pools.h" +#include "apr_private.h" + + +/* library-private data...*/ +int gLibId = -1; +void *gLibHandle = (void *) NULL; +NXMutex_t *gLibLock = (NXMutex_t *) NULL; + +/* internal library function prototypes...*/ +int DisposeLibraryData(void *); + +int _NonAppStart +( + void *NLMHandle, + void *errorScreen, + const char *cmdLine, + const char *loadDirPath, + size_t uninitializedDataLength, + void *NLMFileHandle, + int (*readRoutineP)( int conn, void *fileHandle, size_t offset, + size_t nbytes, size_t *bytesRead, void *buffer ), + size_t customDataOffset, + size_t customDataSize, + int messageCount, + const char **messages +) +{ + WSADATA wsaData; + apr_status_t status; + + NX_LOCK_INFO_ALLOC(liblock, "Per-Application Data Lock", 0); + +#pragma unused(cmdLine) +#pragma unused(loadDirPath) +#pragma unused(uninitializedDataLength) +#pragma unused(NLMFileHandle) +#pragma unused(readRoutineP) +#pragma unused(customDataOffset) +#pragma unused(customDataSize) +#pragma unused(messageCount) +#pragma unused(messages) + + + gLibId = register_library(DisposeLibraryData); + + if (gLibId < -1) + { + OutputToScreen(errorScreen, "Unable to register library with kernel.\n"); + return -1; + } + + gLibHandle = NLMHandle; + + gLibLock = NXMutexAlloc(0, 0, &liblock); + + if (!gLibLock) + { + OutputToScreen(errorScreen, "Unable to allocate library data lock.\n"); + return -1; + } + + apr_netware_setup_time(); + + if ((status = apr_pool_initialize()) != APR_SUCCESS) + return status; + + return WSAStartup((WORD) MAKEWORD(2, 0), &wsaData); +} + +void _NonAppStop( void ) +{ + apr_pool_terminate(); + + WSACleanup(); + + unregister_library(gLibId); + NXMutexFree(gLibLock); +} + +int _NonAppCheckUnload( void ) +{ + return 0; +} + +int register_NLM(void *NLMHandle) +{ + APP_DATA *app_data = (APP_DATA*) get_app_data(gLibId); + + NXLock(gLibLock); + if (!app_data) { + app_data = (APP_DATA*)library_malloc(gLibHandle, sizeof(APP_DATA)); + + if (app_data) { + memset (app_data, 0, sizeof(APP_DATA)); + set_app_data(gLibId, app_data); + app_data->gs_nlmhandle = NLMHandle; + } + } + + if (app_data && (!app_data->initialized)) { + app_data->initialized = 1; + NXUnlock(gLibLock); + return 0; + } + + NXUnlock(gLibLock); + return 1; +} + +int unregister_NLM(void *NLMHandle) +{ + APP_DATA *app_data = (APP_DATA*) get_app_data(gLibId); + + NXLock(gLibLock); + if (app_data) { + app_data->initialized = 0; + NXUnlock(gLibLock); + return 0; + } + NXUnlock(gLibLock); + return 1; +} + +int DisposeLibraryData(void *data) +{ + if (data) + { + library_free(data); + } + + return 0; +} + +int setGlobalPool(void *data) +{ + APP_DATA *app_data = (APP_DATA*) get_app_data(gLibId); + + NXLock(gLibLock); + + if (app_data && !app_data->gPool) { + app_data->gPool = data; + } + + NXUnlock(gLibLock); + return 1; +} + +void* getGlobalPool() +{ + APP_DATA *app_data = (APP_DATA*) get_app_data(gLibId); + + if (app_data) { + return app_data->gPool; + } + + return NULL; +} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/misc/netware/rand.c b/rubbos/app/httpd-2.0.64/srclib/apr/misc/netware/rand.c new file mode 100644 index 00000000..f1f43bec --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/misc/netware/rand.c @@ -0,0 +1,72 @@ +/* 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. + */ + +#define APR_WANT_MEMFUNC +#include "apr_want.h" +#include "apr_general.h" +#include "apr_private.h" + +#if APR_HAS_RANDOM + +#include + +static int NXSeedRandomInternal( size_t width, void *seed ) +{ + static int init = 0; + int *s = (int *) seed; + union { int x; char y[4]; } u; + + if (!init) { + srand(NXGetSystemTick()); + init = 1; + } + + if (width > 3) + { + do + { + *s++ = rand(); + } + while ((width -= 4) > 3); + } + + if (width > 0) + { + char *p = (char *) s; + + u.x = rand(); + + while (width > 0) + *p++ = u.y[width--]; + } + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_generate_random_bytes(unsigned char *buf, +#ifdef APR_ENABLE_FOR_1_0 + apr_size_t length) +#else + int length) +#endif +{ + if (NXSeedRandom(length, buf) != 0) { + return NXSeedRandomInternal (length, buf); + } + return APR_SUCCESS; +} + +#endif /* APR_HAS_RANDOM */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/misc/netware/start.c b/rubbos/app/httpd-2.0.64/srclib/apr/misc/netware/start.c new file mode 100644 index 00000000..29488e3a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/misc/netware/start.c @@ -0,0 +1,180 @@ +/* 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. + */ + +#include "apr.h" +#include "apr_general.h" +#include "apr_pools.h" +#include "apr_signal.h" + +#include "apr_arch_misc.h" /* for WSAHighByte / WSALowByte */ +#include "apr_arch_proc_mutex.h" /* for apr_proc_mutex_unix_setup_lock() */ +#include "apr_arch_internal_time.h" + +/* +** Resource tag signatures for using NetWare WinSock 2. These will no longer +** be needed by anyone once the new WSAStartupWithNlmHandle() is available +** since WinSock will make the calls to AllocateResourceTag(). +*/ +#define WS_LOAD_ENTRY_SIGNATURE (*(unsigned long *) "WLDE") +#define WS_SKT_SIGNATURE (*(unsigned long *) "WSKT") +#define WS_LOOKUP_SERVICE_SIGNATURE (*(unsigned long *) "WLUP") +#define WS_WSAEVENT_SIGNATURE (*(unsigned long *) "WEVT") +#define WS_CPORT_SIGNATURE (*(unsigned long *) "WCPT") + + +int (*WSAStartupWithNLMHandle)( WORD version, LPWSADATA data, void *handle ) = NULL; +int (*WSACleanupWithNLMHandle)( void *handle ) = NULL; + +static int wsa_startup_with_handle (WORD wVersionRequested, LPWSADATA data, void *handle) +{ + APP_DATA *app_data; + + if (!(app_data = (APP_DATA*) get_app_data(gLibId))) + return APR_EGENERAL; + + app_data->gs_startup_rtag = AllocateResourceTag(handle, "WinSock Start-up", WS_LOAD_ENTRY_SIGNATURE); + app_data->gs_socket_rtag = AllocateResourceTag(handle, "WinSock socket()", WS_SKT_SIGNATURE); + app_data->gs_lookup_rtag = AllocateResourceTag(handle, "WinSock Look-up", WS_LOOKUP_SERVICE_SIGNATURE); + app_data->gs_event_rtag = AllocateResourceTag(handle, "WinSock Event", WS_WSAEVENT_SIGNATURE); + app_data->gs_pcp_rtag = AllocateResourceTag(handle, "WinSock C-Port", WS_CPORT_SIGNATURE); + + return WSAStartupRTags(wVersionRequested, data, + app_data->gs_startup_rtag, + app_data->gs_socket_rtag, + app_data->gs_lookup_rtag, + app_data->gs_event_rtag, + app_data->gs_pcp_rtag); +} + +static int wsa_cleanup_with_handle (void *handle) +{ + APP_DATA *app_data; + + if (!(app_data = (APP_DATA*) get_app_data(gLibId))) + return APR_EGENERAL; + + return WSACleanupRTag(app_data->gs_startup_rtag); +} + +static int UnregisterAppWithWinSock (void *nlm_handle) +{ + if (!WSACleanupWithNLMHandle) + { + if (!(WSACleanupWithNLMHandle = ImportPublicObject(gLibHandle, "WSACleanupWithNLMHandle"))) + WSACleanupWithNLMHandle = wsa_cleanup_with_handle; + } + + return (*WSACleanupWithNLMHandle)(nlm_handle); +} + +static int RegisterAppWithWinSock (void *nlm_handle) +{ + int err; + WSADATA wsaData; + WORD wVersionRequested = MAKEWORD(WSAHighByte, WSALowByte); + + if (!WSAStartupWithNLMHandle) + { + if (!(WSAStartupWithNLMHandle = ImportPublicObject(gLibHandle, "WSAStartupWithNLMHandle"))) + WSAStartupWithNLMHandle = wsa_startup_with_handle; + } + + err = (*WSAStartupWithNLMHandle)(wVersionRequested, &wsaData, nlm_handle); + + if (LOBYTE(wsaData.wVersion) != WSAHighByte || + HIBYTE(wsaData.wVersion) != WSALowByte) { + + UnregisterAppWithWinSock (nlm_handle); + return APR_EEXIST; + } + + return err; +} + +APR_DECLARE(apr_status_t) apr_app_initialize(int *argc, + const char * const * *argv, + const char * const * *env) +{ + /* An absolute noop. At present, only Win32 requires this stub, but it's + * required in order to move command arguments passed through the service + * control manager into the process, and it's required to fix the char* + * data passed in from win32 unicode into utf-8, win32's apr internal fmt. + */ + return apr_initialize(); +} + +APR_DECLARE(apr_status_t) apr_initialize(void) +{ + apr_pool_t *pool; + int err; + void *nlmhandle = getnlmhandle(); + + /* Register the NLM as using APR. If it is already + registered then just return. */ + if (register_NLM(nlmhandle) != 0) { + return APR_SUCCESS; + } + + /* apr_pool_initialize() is being called from the library + startup code since all of the memory resources belong + to the library rather than the application. */ + + if (apr_pool_create(&pool, NULL) != APR_SUCCESS) { + return APR_ENOPOOL; + } + + apr_pool_tag(pool, "apr_initilialize"); + + err = RegisterAppWithWinSock (nlmhandle); + + if (err) { + return err; + } + + apr_signal_init(pool); + + return APR_SUCCESS; +} + +APR_DECLARE_NONSTD(void) apr_terminate(void) +{ + APP_DATA *app_data; + + /* Get our instance data for shutting down. */ + if (!(app_data = (APP_DATA*) get_app_data(gLibId))) + return; + + /* Unregister the NLM. If it is not registered + then just return. */ + if (unregister_NLM(app_data->gs_nlmhandle) != 0) { + return; + } + + /* apr_pool_terminate() is being called from the + library shutdown code since the memory resources + belong to the library rather than the application */ + + /* Just clean up the memory for the app that is going + away. */ + netware_pool_proc_cleanup (); + + UnregisterAppWithWinSock (app_data->gs_nlmhandle); +} + +APR_DECLARE(void) apr_terminate2(void) +{ + apr_terminate(); +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/misc/os2/randbyte.c b/rubbos/app/httpd-2.0.64/srclib/apr/misc/os2/randbyte.c new file mode 100644 index 00000000..4020e31f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/misc/os2/randbyte.c @@ -0,0 +1,123 @@ +/* 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 high resolution timer API provides access to the hardware timer + * running at around 1.1MHz. The amount this changes in a time slice is + * varies randomly due to system events, hardware interrupts etc + */ +static UCHAR randbyte_hrtimer() +{ + QWORD t1, t2; + UCHAR byte; + + DosTmrQueryTime(&t1); + DosSleep(5); + DosTmrQueryTime(&t2); + + byte = (t2.ulLo - t1.ulLo) & 0xFF; + byte ^= (t2.ulLo - t1.ulLo) >> 8; + return byte; +} + + + +/* A bunch of system information like memory & process stats. + * Not highly random but every bit helps.... + */ +static UCHAR randbyte_sysinfo() +{ + UCHAR byte = 0; + UCHAR SysVars[100]; + int b; + + DosQuerySysInfo(1, QSV_FOREGROUND_PROCESS, SysVars, sizeof(SysVars)); + + for (b = 0; b < 100; b++) { + byte ^= SysVars[b]; + } + + return byte; +} + + + +/* Similar in concept to randbyte_hrtimer() but accesses the CPU's internal + * counters which run at the CPU's MHz speed. We get separate + * idle / busy / interrupt cycle counts which should provide very good + * randomness due to interference of hardware events. + * This only works on newer CPUs (at least PPro or K6) and newer OS/2 versions + * which is why it's run-time linked. + */ + +static APIRET APIENTRY(*DosPerfSysCall) (ULONG ulCommand, ULONG ulParm1, + ULONG ulParm2, ULONG ulParm3) = NULL; +static HMODULE hDoscalls = 0; +#define CMD_KI_RDCNT (0x63) + +typedef struct _CPUUTIL { + ULONG ulTimeLow; /* Low 32 bits of time stamp */ + ULONG ulTimeHigh; /* High 32 bits of time stamp */ + ULONG ulIdleLow; /* Low 32 bits of idle time */ + ULONG ulIdleHigh; /* High 32 bits of idle time */ + ULONG ulBusyLow; /* Low 32 bits of busy time */ + ULONG ulBusyHigh; /* High 32 bits of busy time */ + ULONG ulIntrLow; /* Low 32 bits of interrupt time */ + ULONG ulIntrHigh; /* High 32 bits of interrupt time */ +} CPUUTIL; + + +static UCHAR randbyte_perf() +{ + UCHAR byte = 0; + CPUUTIL util; + int c; + + if (hDoscalls == 0) { + char failed_module[20]; + ULONG rc; + + rc = DosLoadModule(failed_module, sizeof(failed_module), "DOSCALLS", + &hDoscalls); + + if (rc == 0) { + rc = DosQueryProcAddr(hDoscalls, 976, NULL, (PFN *)&DosPerfSysCall); + + if (rc) { + DosPerfSysCall = NULL; + } + } + } + + if (DosPerfSysCall) { + if (DosPerfSysCall(CMD_KI_RDCNT, (ULONG)&util, 0, 0) == 0) { + for (c = 0; c < sizeof(util); c++) { + byte ^= ((UCHAR *)&util)[c]; + } + } + else { + DosPerfSysCall = NULL; + } + } + + return byte; +} + + + +static UCHAR randbyte() +{ + return randbyte_hrtimer() ^ randbyte_sysinfo() ^ randbyte_perf(); +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/.libs/charset.o b/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/.libs/charset.o new file mode 100644 index 0000000000000000000000000000000000000000..10062ca8a49075b70873ee9893613dfeacc723a1 GIT binary patch literal 23920 zcmb`Pd3==BxyRp02!wr81VIV6sJLW<5Q0@?GMOavX*Omi2DJ7y%Ro{?60<1UUOP$H z0wUm2L2Uu83SAWIg^R7W;0ji)RBN$|OIusGYAc`C)~$M<=Q+PK^UjmlKknzwN6+t^ z?|a_!p5-~uIp>`T-w0Nerulr1{rH?kPBLYw<83nM9f-7MsK{ zNtByJh9qiCVz?xhnnb3rpK5reNsRIhP@>r+#`w6x9VRhB65S>-$rqz5t4v~wuYeM9 zlQ_*6qC}rbO!aN1()vwehHnQY)|)kDxz>J_>yd`V;6+p$DOdppQeJfIbO*3i>qk8R%i?5$LnfpFy94 zJ`a5X`g7=u(4){_KwpBs4E-ha73i;^$Dpr5e+~T&^taI8L0^Nu4t)dqCiM5vKS2Ko zeGB?0=%1m-p(mjK1AQC%4)k5B*kkELOkrE#z;b;j>>&8laoF^PF z@d*-6lyH)SlO;Sw!c!%jBH?KgPL*()gr`e5UBVd>o+06x63&z`OTt+a{)dELkZ`ty zXGwUrgy%>&N5XR@JWs;&CA>hwYzcED%#|=t!h8wmN;pr#0tx3!SSaBF35z6LDB*Me&}lG8t7W+I_P@n0CWR%BlJe-Cg@Gj&Co5- ztW6zD3Sd109EVoTUb*|BW6u&0bjVfzIhnN9^VuuZiyA z=yax;Wodk*;OsMaW9yv3bfn9023Kl^sfur+@2qi?N2iaQK5n9K(ufJC(K%_hGkWwQ zLXMM;DD}j!DNg#h3rBx(bci}4V?1S{%`*$9N1W}jWKO0$7g1eDPWGjb8$Ft{`-qPk zo4B`#ZX1ncMrbl8$Jml-AMW#oCi5NRW>JB;baDJJU$UGDbEupd)TD_N$>hkS9N#6= zOuf#T7MjdWSUmOi;%QvQ+Dq`Se7EGPpt)Nlj*CNcWtPxHj5cqhXMFPihC)=hWKh z1%&zIb0RjHX9%HM8_fqA=8&E2u&GND86!3tNT6C9ElIf-iG-Yqn0=DZsjdn0R*&<6HdHf=SFUI?T)Cn@RkeLQX~h4Sixs4ustt24Kyt+BPIDVDpcsL(Ae z$Zlsgh(qOB*lp{2Xaku0q(4Y?~C8wY18$SJb-J2^SI^dCwy_t}Kg*j(S)73}P9($p+ zzHLQI+j3;%0=l|8TiRBj2%09Qqv)aOvwi8O`~H!&c!!fV%r|`L@bpnjFP^#os_AL; zZoubORk+b$MX;v4x+=&qH&hjMODm%eU#Y9Cu5$D9Jn?)_e6G{ga(&G07U6ozwP>g^ z=$3}Uk*Hf241TG^zf3Td6pZ@A%iKV9)uq93Bt#{L{n4OY43z|{qM_1Iz#nDquc@g( ze5lJ*%jA;+)g{45kg6*cuW=*68n<|v8>#UJOxc0xvYH@0RkFEN{z@+nRh5LwLea=v zx3buAL)C6q{WUQ+*488ssH4iebCb`abEHcZ4TpjebKPGo9pp`z>~-eKJnxkPZ(_bT zQRq!9@Ft49iG@oh3D4V@cE?F(hn3 zZV3%?!k_}x6&0MW3x>+dqul3|$3h+qs&BL|AUIJTx2VeXw#Hw~Ba`nKoeQPjrs>ww zhU9!`A=Gp%T8C%KgX&6LkI9>o-Nv3yx3RsoXJs4m&;v1?oCAZ&Q4A$VF_0WJPg8wY z5-j!CRz%&(P$UwnDl@GY`>d{wiY4Z|Xnl>pCKz_>LM731(;Gp5q&6I^B>S_*JjCtu z?CsuJSRGExLQ^06u=$+3wY_ac7QgUx-Ky%~(wguP#V(LyX%HfzvMRTxI#M-6riJ#| z%EC(h##&a^cU~3ibW#mM>KX7?xMt{S_M6sPZ^2`KslOsr;+BT1E9IKMq$C`SMBEC0 zRhe56O0}V=zqlfZF66l`6W*;fjq-p9Ijt3Kv8F6`(4NLvhma?YA%{>Jst7ts^DrG~ zbIr9)hE-Kkz5HeH4yjoSIBQSa&`%96rRn8X`fJ>L<6!^2-MAG&?*MqGX0+J&MpJ;N zTw}1Qbt<&g$K$GNYsl#4&6WO;kztR=ZS#7))G~^s44(XMNiYzqq@k>-rZr^nFxI3@ zVbkwyQrcnL8OrlQN&!eLQwH+jdOZzt$-Ei-a9-6?eF%Gdc8auqi4#hhhIz6cczjd1 zwt|-#a-fR6Sq*=xY_u?-|AK;mhEa8+PgBx+_>YCVf| z?^(|dho78>WkVY>d70{PFk$92w83yFkZNFJcgCl5c}9gNQFUplYze4Sl`rxdjHz>= z!XGiCTE`7t7WA7I!JJa>m**sUAjRIzG>{e9UsV!ev-Z?Vo+7@;YeAmrY4%t$=XlrT z=0~Emig-%!s;=@!0-=x_@JE79ZbN%_cWbOI)_7G{Zf8$JLwi?leMd)bb9Z+~Q}*1Pyqv;< z+^)_>-uu(eI(KDDS7UBZTgxg>E2G9$dWfy;e6B2Qr|b^h;R&8E;amylNmwA^d% z%PNbjv2vtr(bx}>qZEge*y-5~8;uu+9`_JHC6a)K-=%GN%Ekec%WTGb+IqTTO{w?s z6C%MS@E3_X*H#VM4J58v?^hc3lc$hfy%`=6g@l8b zhWPYik9NFo3YO8q<b!NQ$2IgUH^;9*^H7gyC{kQy_KvQ}`6$Djk20(aphZyf7jDYxWe)D9`lev^&_aznmMFPmx1+v^<}eFc zB?}uN39gZQ=KX%iW8PFyvY|M9cTuOv)6B8O4r|z75?UH4$C64FN!_S;-GaxpTlXSn zE(;ut0B)l)c@#1u=q;BAKS(B^uo*-=C0Kt=+lWEio|H|6>@x;EK~5Ju#A;de*Or8+ zH^|ayXA`k&XKL+|rvSJYJ9^1QJu&ah#*9i!+51R4)RUv3C>@-VMc6Jf=Y>QAY`e|Q za}cK0E72WEugyM^-fWbH=wL~=B4-L`xXlm&a7MZ8WtZ}Z)K~7Gmy1&ngLNd z*x1)%s;TrwE9wtKQ|n@0S`0eeBl)1)H}WZLw9|p4y?K*?PFE3k&SwGBLAc zTSJ>FcFJUuB4&4(?=?ctw%${Gk`A5MI5ShvWM1RdH1+PglX<<{?Bff{^DZZ;mV76xt{P?$<24P+FVJl!>(SF?HZogrSgay=VdmD zspD>^wR!I%E+nPv$)w~6Vr?o>DIO&Aeh`&1)@I8yZ%mfA&~dMw_DZ~Zd#8iVmUv-d z4!&l$W~?X0`_eZs?LB6~t8R-_*M{+hgB?wIKWUCQ)Oa{&Tud2u$w-4sevaB{cC+^7 zPD)|^VuxFhFX3DX=Sf%~;d}`TB{WkurJHcF&^vt95Pn@RwM!lns_3D#SCMl@$`YGu zA3PM^9o?YGG{mI!?1sbG4#8E5pGn#L^R|h;e6WXkY<`uvSXUpZ=3TdtCEgrgBdgDulq@2Kb(Q?WHfeW+d)Hd|Ab@!Ob znmxBiQu#OJ7v$s>oNFk)(dX|euMa!ERTF&E$Bf9_Lf;ZjAU1>k=a2o)GmGN(dsF#c zfPdVC{vGUW*h5_wbti!^SYJORNr0iC%}7}#UfH+DO2)Xbu-*^zr7#+ zy#symI_R^s(4Z@Eg@2L3&#_}!jdN+!4r?}xwf<}&}U_w$$PT;^Q* z-}|x8ALWGN+zmxEO?0uFkrpQqJcL4pjm^+9*+u*7P|fY#B`Z_=L2~DY;{p3of|0cP|u%p1(!mxFt~+OcZ=Sj71Khwr z0b`TU&*#5q80z`Q=bQUi8cBru`H2fE!uf_dCqGkIlIcTQEZ1YGnlK-#hnZ&#RXlO+ z%}uuSMC(&;OE-U9lL{%7ZvLuc2+lKM@F(4Y(@~ew6F;;{y^t;zk;>>-XY~2JcEKrm zZs9SV1Rth6@ff?e>~KifzLZwmsM03 z)B6&06f$qB-IOmyyzf}44%RZ**14BI`OJLer-zhg3!$IgCAgjb%(=Zb|6+>shdIwl z%dN$*kCngpBIS=AY34jO`|0O;{DFHD3t@gj{xAqXwWPGo|2K}%$NsL4=Y@B^o-0>P zeq;?q&^BE>I)sqp&DA6uUXje$881}FGOm|_vde}^B7vK{cpmXn73 z%MDKOcX<%#bG4BKUn;*rrFBtpTfa?;Uxxv?S#jIW9g1(qbMI4pF{b2x#s4(cfJ2|d zpHut{^#3u%|ANW%N5y{#BYIEq`{4LLQTz)qH1l_g$$ox-4Te6aKyClugmKSO{2lOba`sX&q--6xVt#}0E z_@Lrb;V>Rmd>Q8N5yj6yyIxWJIMRPmd=w_@dy0RCe*Tx@<_~XZT+wbjj^@v7=qK2U zo8S05&TPfaAI~^WzT$;&NQ)HjgI!f9{t@O^MDZ1v*RJA=&_7oxUJCoaR`JOg_x*~G zK>CQ{Hs4Xje}eR@ia(9?n~J{!`#GWbFOfc}`0tSZQ1Q2r_Q8(qc#qy@QI2) z3O-Ho$H8YQei-~*#a{r=SNvu0g^I^vhknJ^gNGE~0=`7?ZQ#ok-w9r?_-^nP#rJ|= zt@r`(>l8l--mCbJvEUCV{v`NT#h(Y?u6P6d$u7ms-zq!K9>v>`{~^WAUobn)BZ^;- z{D%~egC9|RE%;HzZv=l;@teWlRD2cY=?TTZ0e({PwcsBr{tR!9=;MPwu=YQI`94zd za;$d~72k_>d79#9V?CXvcmu{gU-84>3l;CeeD^EfjCC-icop~(#gD?DFH?L9{A9i2 z_FUbf_?zgTs}(@ih4J0ma9IZ&iE-_;$t51>dFkSd8}`#iwE2dPwov z$p47qx!{KszYzS0;z97Eir0X@s`x_G=S{^+!A~e20Y9numEa#Lz7pIAd$e|bJ@`n) z*MUz|{8sR3ithrSrTA;|Ctr?puHx^2=PUjZ_(H{B!o2V+{u+2l@e|-n6#qN;GR12! zuj>`R9K1#G<=|He^mp2vv1pfJi;%8#tbyD#u=+F-p z-+=m7o>}sRp*PxzT6*vDZk>lL1_}@|fw-kQ?<=>e^BuYv0m&``~u|v zvEtVv{~^WekpCIQ??e9Q6@MG~UsC)9;DaXTOW zsrVY?|Ci!-BApID)KZg7Z72k*amni-=@&^?^iTqzu{1mK5OB8o8FX|Lui2PS5{s#K9QSs+7uUi!V z4%Vr5#b;u@xJL0G!9M>}@ms)GD}FipVWZ;xNZ+jZ477K<;=8a<*s1t$;D7E{d=u>d z0mbhD->3K^;EyW)bMPk=e+&Fs#Xkl=s`y0M^D)KG0e@Zbi^2b-co)X;UB$nS{{Oq; zJCOfl#rK1!LG3(!8Rd*rd^7ya1jS!~{Y+K-BdnWQikG6CIf|c$@y%2Gajcs~ikpAx z$Z-}c9zgzb#c#!WQKR@}sQ*&M)A2q0m5T4fxHK#NDR_tCH=w<%6mP=5F0T0bnAhtS zw|;7i;`GmR$Y-14N3dS+RD226k==@qKtJqNd_TtVfa06++=Gh0i}m-g;s>$6eNpkp z&=1EH9|wQ_hT@l@KaVSZIqc^>#czin`#|vuv`fBlqrS5C{}kRon17To$!DN{%)b+v zXWBa$bv z$1uLT6)(qp->dj8_{{@~Z^Jr%Q1LF<$zjD0V|-s!{4vbOV~UT)xV)kGaXk09;*(MT z_Z0sW_4z>Y0Q|fh9z6Cx9pz+V9`kJ+y$$R51jQ@R|5Fuz8uKDc@fg}WNAauC&v}X; zLqG7pJ;WbdpRd7A7Aw9I?|;e_x9>e`6yJw>E>*k}^XN*&Pscdg?>%gN?y~-0{H}i{ih9-`J-3sn-819zlEe zC_V;u@-R4eFP122*|RGD`xuvFiob<&ey_@bnK&P+{I;BQ^anQ+O_JwkdN`Z#7m=Ri z;hg_Y$xXkD0Jrr&6Ff)peDE^GOTe%2l+Vwdib^#ro`dn~Qv6cPw*kc`!!OzC$L+Oo eezff;TYqN!`P7K~a?d+1S>VjPyg+eV?*9U-XzG#x literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/.libs/env.o b/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/.libs/env.o new file mode 100644 index 0000000000000000000000000000000000000000..c4a911b2c163f2c3f4b3d2e141b432e598956a79 GIT binary patch literal 5688 zcmbtYU2Gdw7QWZx5VuKPH|3|LY&#EZ3kZ*s5{1%jOPXw27XnR)14syr?M!2XGmggN zDEtTz5xdF)QWuawtFpWx0T25G4~Pc@Do7O)5+EUXKmsHlct8lK1W4=x=iGbF^!j=# zt#*$xbI%$p&UGH1nm&?}QZPwzNSu=x6=Hb9IeuKR668^Z!&LSKxOgv&%26i?_}1#7(Bgs*CT)m)GO7zS3_D489m4gw5|^aC*9WwB9Y1{DWy%)nGjSdG9))` zkb|oya0-ao1n9M56mI z5;v|?nnGUQByoU7@jZAC%6aFkEJ24dsMm>y&BWWuT%I}=Cm!z3G}0~Z<-~EOes}~r z)BK<;VZuQB)$ZnBC{kcov(OxbF1`YuP3xHVYS$Z>|$F{=b-7Rpq z;9}uq_YeF@Vf|Y{H~?+Tc=Gz~8sD@1*j5ZVzU|qG?GijT^u-=2NV9QNI2j!P#ewxl zB@{CPhJ$~5REpHLzfWv~iN*o@FyH|dDch$?*lg=?dPMy+N-@vu&KR0wmRDR_oR#x0 zu&+JxGnS&ntm#<#FC1r+9A|qR2PyR*;!@2QSAj06^0CQ0v)2)nJeyv}Qj%luY}oP2 zIO8m{X2#yxjFUq#cARIHrmaXJH1?9*^hi3;4M{3W{y z?rKwqmr{CO0sb06t=U=dMWNFUV?p@AidVw`mF2MPhhfn2>bU=-xZG+r+gfZ#3(ZCq zcvaE{T^M*du5__NF1I|4+!2K^bIh$^WOi8 z{YZ3zc4IN{7hF{6GLGIn?@qd--ac>C%`Zirz(2U?2Y%S7fmjJ^^@FSX#`0sJTy*ot z_qzELGsh<3-i|7@d-Ka-EAnemE5y)#1R+JC+KQqkgs9!yE`*(Gwbd?EmX{0lC|X{~ z@AZbgvC%?1tijv>4+~3;cCF9}8mmH;+*KllT-1>v`bs6#X1%ttW33KG>K69^yBarQ z!EZu5(XO|`$c??QBh(z_%MYU*3HUg4*xu|Ylm#yL`_X;NzKRY#i8^iY5Jx8`_q$ij zS35z}(ap{8?I>yFp^;H({O5U_!X%SflTjKkU7 zTI$X$u1@sXM>_QZ`g1ln3mWv{^_oLH;5RA{;Jx;JOHri?V-)JK&Rpm>D_-QUM#5XD zL>1vx+il?~biuE77R!y`L<@9^uT-m{zrs?pRqL{>gq2{?@Ahss0-x<6rSNL4r6nJF z?gg-dJXnQ!wW27HUoW2sD@#63;QuEVLO?t9slo_1PCWOERjO|+z_a@-`+*J<-)-BO^Z5UR8uF{heA}SN4B~{4Fyvz=c{0_G9=J^0$_$$dP}Y z4QaH)z6f|y|GuOC70D0#mxGJ_xv#j)?RO7dR>|;H6b!QKN7=3&&6nYfjPx@(;GT|< zogdd!QvNy?3xw;_Bs;&UGkLU2i|>CkG3K4b6^nHwRf2d@hY_bm&Vgxk^shM!MSGro zx608!bh<&19JS(mV8GSSnI46sf5s%>)J#j`s3+15;<6ty`lG(hfbsh2wiW`N^hn0l1RvCjrO2<1iwz%`FD66nxW1JU#*9d8K@G`uN1*>GJU-N9LwV<8Y}y0~Qb4AG$}KIN$l{G{;7V=e#wO%v}2hz}X~6!1uh<638X+J?kNz?cVC z@b4MK@!}sG^x07u;(OpiqSrabAJVYkzS{30J{Kg6f$ta-J{Kg;`=b`cwKOu$|6Dj^ z;g^!k^JV+j37@v?ucH@s&cbgcykg-S2(Mdslkkp(rwM=1!apZ@&B93(Pg{70;{4OX zrwD)LJosxCemB{_NjQq;{`j$FKSTChFZPpvmZRxcmi?zBe{0}q&wW2@;23L&;{V6M z(f%=#2T9L)x$Z55Gh_vFztaetthhm*mfA!~yF(1{cx~hCRmlP@(W$rA3AqUhffpg@yC`!+R0hnqM*AcR4SG d5dkqa?h=k^D3wBRpGRWcRgw@T8W|ra`FG7F=TiUx literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/.libs/errorcodes.o b/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/.libs/errorcodes.o new file mode 100644 index 0000000000000000000000000000000000000000..b859d41dfa46535f087ae8116a5d6af698c9dac1 GIT binary patch literal 16784 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/.libs/getopt.o b/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/.libs/getopt.o new file mode 100644 index 0000000000000000000000000000000000000000..3ce5cd4f40502c6edb2ab0637b290572fdbc96eb GIT binary patch literal 21456 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/.libs/otherchild.o b/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/.libs/otherchild.o new file mode 100644 index 0000000000000000000000000000000000000000..816cd3527607c2173b2fecfcb5fdd720a5456300 GIT binary patch literal 15944 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 Ms7Jlex`DIbKY%1nHvj+t literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/Makefile b/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/Makefile new file mode 100644 index 00000000..f25e2120 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/Makefile @@ -0,0 +1,16 @@ +srcdir = . + + +TARGETS = \ + start.lo getopt.lo otherchild.lo errorcodes.lo rand.lo version.lo \ + charset.lo env.lo + +# bring in rules.mk for standard functionality +include /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/build/apr_rules.mk + +INCDIR=../../include +OSDIR=$(INCDIR)/arch/unix +DEFOSDIR=$(INCDIR)/arch/unix +INCLUDES=-I$(INCDIR) -I$(OSDIR) -I$(DEFOSDIR) + +# DO NOT REMOVE diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/Makefile.in b/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/Makefile.in new file mode 100644 index 00000000..fffd81c1 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/Makefile.in @@ -0,0 +1,16 @@ +srcdir = @srcdir@ +VPATH = @srcdir@ + +TARGETS = \ + start.lo getopt.lo otherchild.lo errorcodes.lo rand.lo version.lo \ + charset.lo env.lo + +# bring in rules.mk for standard functionality +@INCLUDE_RULES@ + +INCDIR=../../include +OSDIR=$(INCDIR)/arch/@OSDIR@ +DEFOSDIR=$(INCDIR)/arch/@DEFAULT_OSDIR@ +INCLUDES=-I$(INCDIR) -I$(OSDIR) -I$(DEFOSDIR) + +# DO NOT REMOVE diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/charset.c b/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/charset.c new file mode 100644 index 00000000..57018a7c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/charset.c @@ -0,0 +1,83 @@ +/* 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. + */ + +#include "apr.h" +#include "apr_private.h" +#include "apr_strings.h" +#include "apr_portable.h" + +#ifdef HAVE_LANGINFO_H +#include +#endif + +/* + * simple heuristic to determine codepage of source code so that + * literal strings (e.g., "GET /\r\n") in source code can be translated + * properly + * + * If appropriate, a symbol can be set at configure time to determine + * this. On EBCDIC platforms, it will be important how the code was + * unpacked. + */ + +APR_DECLARE(const char*) apr_os_default_encoding (apr_pool_t *pool) +{ +#ifdef __MVS__ +# ifdef __CODESET__ + return __CODESET__; +# else + return "IBM-1047"; +# endif +#endif + + if ('}' == 0xD0) { + return "IBM-1047"; + } + + if ('{' == 0xFB) { + return "EDF04"; + } + + if ('A' == 0xC1) { + return "EBCDIC"; /* not useful */ + } + + if ('A' == 0x41) { + return "ISO8859-1"; /* not necessarily true */ + } + + return "unknown"; +} + + +APR_DECLARE(const char*) apr_os_locale_encoding (apr_pool_t *pool) +{ +#if defined(HAVE_NL_LANGINFO) && defined(CODESET) + const char *charset; + + charset = nl_langinfo(CODESET); + if (charset && *charset) { +#ifdef _OSD_POSIX /* Bug workaround - delete as soon as fixed in OSD_POSIX */ + /* Some versions of OSD_POSIX return nl_langinfo(CODESET)="^[nN]" */ + /* Ignore the bogus information and use apr_os_default_encoding() */ + if (charset[0] != '^') +#endif + return apr_pstrdup(pool, charset); + } +#endif + + return apr_os_default_encoding(pool); +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/charset.lo b/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/charset.lo new file mode 100644 index 00000000..d3e19344 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/charset.lo @@ -0,0 +1,12 @@ +# charset.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/charset.o' + +# Name of the non-PIC object. +non_pic_object='charset.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/charset.o b/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/charset.o new file mode 100644 index 0000000000000000000000000000000000000000..218e464a7d585cbc0f5ae6b50d4354e5f3f0598b GIT binary patch literal 23816 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 O=eBpZf4<-*-Twu)YR>Qg literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/env.c b/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/env.c new file mode 100644 index 00000000..9ba6b61e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/env.c @@ -0,0 +1,97 @@ +/* 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. + */ + +#define APR_WANT_STRFUNC +#include "apr_want.h" +#include "apr.h" +#include "apr_private.h" +#include "apr_env.h" + +#if APR_HAVE_UNISTD_H +#include +#endif +#if APR_HAVE_STDLIB_H +#include +#endif + +APR_DECLARE(apr_status_t) apr_env_get(char **value, + const char *envvar, + apr_pool_t *pool) +{ +#ifdef HAVE_GETENV + + char *val = getenv(envvar); + if (!val) + return APR_ENOENT; + *value = val; + return APR_SUCCESS; + +#else + return APR_ENOTIMPL; +#endif +} + + +APR_DECLARE(apr_status_t) apr_env_set(const char *envvar, + const char *value, + apr_pool_t *pool) +{ +#if defined(HAVE_SETENV) + + if (0 > setenv(envvar, value, 1)) + return APR_ENOMEM; + return APR_SUCCESS; + +#elif defined(HAVE_PUTENV) + + apr_size_t elen = strlen(envvar); + apr_size_t vlen = strlen(value); + char *env = apr_palloc(pool, elen + vlen + 2); + char *p = env + elen; + + memcpy(env, envvar, elen); + *p++ = '='; + memcpy(p, value, vlen); + p[vlen] = '\0'; + + if (0 > putenv(env)) + return APR_ENOMEM; + return APR_SUCCESS; + +#else + return APR_ENOTIMPL; +#endif +} + + +APR_DECLARE(apr_status_t) apr_env_delete(const char *envvar, apr_pool_t *pool) +{ +#ifdef HAVE_UNSETENV + + unsetenv(envvar); + return APR_SUCCESS; + +#else + /* hint: some platforms allow envvars to be unset via + * putenv("varname")... that isn't Single Unix spec, + * but if your platform doesn't have unsetenv() it is + * worth investigating and potentially adding a + * configure check to decide when to use that form of + * putenv() here + */ + return APR_ENOTIMPL; +#endif +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/env.lo b/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/env.lo new file mode 100644 index 00000000..7140ef3f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/env.lo @@ -0,0 +1,12 @@ +# env.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/env.o' + +# Name of the non-PIC object. +non_pic_object='env.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/env.o b/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/env.o new file mode 100644 index 0000000000000000000000000000000000000000..2189927c231c90be6e1e2891995e7373ec10ab0d GIT binary patch literal 5632 zcmbtYU1%It6ux(7*KC_~o3>gTtL;40{z!K=sUgm>JKQ=S|0@MgHQS(K8R8UQ3Mf0LBR?>D2SkaQ1JJhd(WBPy*q;FAv^b+ z@BH2~ckbNDgV*i5J|(4Kl47SgCow9-#zp7&QN@mm3&e79pt$f`ap9Nm5Gp?W&RZ!M zqfBwZ8T@qNliN=pE6)FreG3CBi+6urTbzF{JAbC{^wPBt0V+_hR73Be=JW^zNTWhz zRT*8ij47qQq+}MERH{b}X+321AkWjf3=U2@Qwt)I$|@UEgSw=(ODyb7$!kq2(bhsq=!>DAi$? zj!KbQ_0+CaFwr<*1_N$ak#ZST!ctp@(#aTIdl6~!w@39mU z%$kl9|H5%R$#J~Pv5!(;5|?T|xC(Shm5)s(nZ1&r144Giv1HpXZ)vd=P1kE>;8jVBbYbA- zxYE6Pe#fnYJ1)O-|4C=%cIWOJ;QGjZXURd>l%=dUf*Ds`aQjtBg1M=dABlF*s?7xc zw2KN|20(rUtSFQlQB?N>zjC-$2;1dyqg5z1n}uo=HK+4iyg_edxX=nKP!r%`VYb$) z6xu=Uh)}6ILQ}{+H%+>`-C=L5H|*wTqjuo$n1KXgtpZ{xtW|>$D&BfZwP*fcIMW%toa$j8Uk^Ds!PL0*tHSr_V(O2<$O3KWd4YCf zf1E!a!|eIPc92;A2bBLg9VWio`5T}~%KsAO=XHkp@q}RKe+V#)$#nv&Xi6Qgg}C2J z$RdxAgLRVsmvkn&jNVJ#=Z3;p-?EWY?cmJDOMFY>ae<9B@xZ$j*;zDk*;viv_w) z5AoH`A1f>d?b70>zbsgZj_P=~#!0LM>r3h|;%kJvrx3>*>|cO{eja7g5;x9Bb<3Eu?{MD=%d3JThUo4KKDT^?mRwc_>uSfUz+&&MjW37#(CW# zj&o<6wiU4$Fy?_3{9S@L{uU4f!k9>mZ_pzAk3$pV_#Q*z{@KsfCaqR+@R?y6B!=UB zPx2KOK0pu7P7BBThs5*cI86n7> z$GqPtYa#A1aE#CWnK5v*zlh|zft&N4GjOy&K=OSw;(+t=;D>a=u*W!yNq)t$A4OxJ zw=H{~*9QiUd7mKpV*@wq{M^9N{(X|aq7etIb1(dmem3ke4$mt~i%iuH_)# +#endif +#ifdef HAVE_DLFCN_H +#include +#endif + +/* + * stuffbuffer - like apr_cpystrn() but returns the address of the + * dest buffer instead of the address of the terminating '\0' + */ +static char *stuffbuffer(char *buf, apr_size_t bufsize, const char *s) +{ + apr_cpystrn(buf,s,bufsize); + return buf; +} + +static char *apr_error_string(apr_status_t statcode) +{ + switch (statcode) { + case APR_ENOPOOL: + return "A new pool could not be created."; + case APR_EBADDATE: + return "An invalid date has been provided"; + case APR_EINVALSOCK: + return "An invalid socket was returned"; + case APR_ENOPROC: + return "No process was provided and one was required."; + case APR_ENOTIME: + return "No time was provided and one was required."; + case APR_ENODIR: + return "No directory was provided and one was required."; + case APR_ENOLOCK: + return "No lock was provided and one was required."; + case APR_ENOPOLL: + return "No poll structure was provided and one was required."; + case APR_ENOSOCKET: + return "No socket was provided and one was required."; + case APR_ENOTHREAD: + return "No thread was provided and one was required."; + case APR_ENOTHDKEY: + return "No thread key structure was provided and one was required."; + case APR_ENOSHMAVAIL: + return "No shared memory is currently available"; + case APR_EDSOOPEN: +#if APR_HAS_DSO && defined(HAVE_LIBDL) + return dlerror(); +#else + return "DSO load failed"; +#endif /* HAVE_LIBDL */ + case APR_EBADIP: + return "The specified IP address is invalid."; + case APR_EBADMASK: + return "The specified network mask is invalid."; + + case APR_INCHILD: + return + "Your code just forked, and you are currently executing in the " + "child process"; + case APR_INPARENT: + return + "Your code just forked, and you are currently executing in the " + "parent process"; + case APR_DETACH: + return "The specified thread is detached"; + case APR_NOTDETACH: + return "The specified thread is not detached"; + case APR_CHILD_DONE: + return "The specified child process is done executing"; + case APR_CHILD_NOTDONE: + return "The specified child process is not done executing"; + case APR_TIMEUP: + return "The timeout specified has expired"; + case APR_INCOMPLETE: + return "Partial results are valid but processing is incomplete"; + case APR_BADCH: + return "Bad character specified on command line"; + case APR_BADARG: + return "Missing parameter for the specified command line option"; + case APR_EOF: + return "End of file found"; + case APR_NOTFOUND: + return "Could not find specified socket in poll list."; + case APR_ANONYMOUS: + return "Shared memory is implemented anonymously"; + case APR_FILEBASED: + return "Shared memory is implemented using files"; + case APR_KEYBASED: + return "Shared memory is implemented using a key system"; + case APR_EINIT: + return + "There is no error, this value signifies an initialized " + "error code"; + case APR_ENOTIMPL: + return "This function has not been implemented on this platform"; + case APR_EMISMATCH: + return "passwords do not match"; + case APR_EABSOLUTE: + return "The given path is absolute"; + case APR_ERELATIVE: + return "The given path is relative"; + case APR_EINCOMPLETE: + return "The given path is incomplete"; + case APR_EABOVEROOT: + return "The given path was above the root path"; + case APR_EBADPATH: + return "The given path misformatted or contained invalid characters"; + case APR_EPATHWILD: + return "The given path contained wildcard characters"; + case APR_EPROC_UNKNOWN: + return "The process is not recognized."; + default: + return "Error string not specified yet"; + } +} + + +#ifdef OS2 +#include + +int apr_canonical_error(apr_status_t err); + +static char *apr_os_strerror(char* buf, apr_size_t bufsize, int err) +{ + char result[200]; + unsigned char message[HUGE_STRING_LEN]; + ULONG len; + char *pos; + int c; + + if (err >= 10000 && err < 12000) { /* socket error codes */ + return stuffbuffer(buf, bufsize, + strerror(apr_canonical_error(err+APR_OS_START_SYSERR))); + } + else if (DosGetMessage(NULL, 0, message, HUGE_STRING_LEN, err, + "OSO001.MSG", &len) == 0) { + len--; + message[len] = 0; + pos = result; + + if (len >= sizeof(result)) + len = sizeof(result-1); + + for (c=0; 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/getopt.c b/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/getopt.c new file mode 100644 index 00000000..24be3c82 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/getopt.c @@ -0,0 +1,309 @@ +/* + * Copyright (c) 1987, 1993, 1994 + * The Regents of the University of California. 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University 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 REGENTS 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 REGENTS 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. + */ + +#include "apr_arch_misc.h" +#include "apr_strings.h" +#include "apr_lib.h" + +#define EMSG "" + +APR_DECLARE(apr_status_t) apr_getopt_init(apr_getopt_t **os, apr_pool_t *cont, + int argc, const char *const *argv) +{ + void *argv_buff; + + *os = apr_palloc(cont, sizeof(apr_getopt_t)); + (*os)->cont = cont; + (*os)->reset = 0; + (*os)->errfn = (apr_getopt_err_fn_t*)(fprintf); + (*os)->errarg = (void*)(stderr); + + (*os)->place = EMSG; + (*os)->argc = argc; + + /* The argv parameter must be compatible with main()'s argv, since + that's the primary purpose of this function. But people might + want to use this function with arrays other than the main argv, + and we shouldn't touch the caller's data. So we copy. */ + argv_buff = apr_palloc(cont, (argc + 1) * sizeof(const char *)); + memcpy(argv_buff, argv, argc * sizeof(const char *)); + (*os)->argv = argv_buff; + (*os)->argv[argc] = NULL; + + (*os)->interleave = 0; + (*os)->ind = 1; + (*os)->skip_start = 1; + (*os)->skip_end = 1; + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_getopt(apr_getopt_t *os, const char *opts, + char *optch, const char **optarg) +{ + const char *oli; /* option letter list index */ + + if (os->reset || !*os->place) { /* update scanning pointer */ + os->reset = 0; + if (os->ind >= os->argc || *(os->place = os->argv[os->ind]) != '-') { + os->place = EMSG; + *optch = os->opt; + return (APR_EOF); + } + if (os->place[1] && *++os->place == '-') { /* found "--" */ + ++os->ind; + os->place = EMSG; + *optch = os->opt; + return (APR_EOF); + } + } /* option letter okay? */ + if ((os->opt = (int) *os->place++) == (int) ':' || + !(oli = strchr(opts, os->opt))) { + /* + * if the user didn't specify '-' as an option, + * assume it means -1. + */ + if (os->opt == (int) '-') { + *optch = os->opt; + return (APR_EOF); + } + if (!*os->place) + ++os->ind; + if (os->errfn && *opts != ':') { + (os->errfn)(os->errarg, "%s: illegal option -- %c\n", + apr_filepath_name_get(*os->argv), os->opt); + } + *optch = os->opt; + return (APR_BADCH); + } + if (*++oli != ':') { /* don't need argument */ + *optarg = NULL; + if (!*os->place) + ++os->ind; + } + else { /* need an argument */ + if (*os->place) /* no white space */ + *optarg = os->place; + else if (os->argc <= ++os->ind) { /* no arg */ + os->place = EMSG; + if (*opts == ':') { + *optch = os->opt; + return (APR_BADARG); + } + if (os->errfn) { + (os->errfn)(os->errarg, + "%s: option requires an argument -- %c\n", + apr_filepath_name_get(*os->argv), os->opt); + } + *optch = os->opt; + return (APR_BADCH); + } + else /* white space */ + *optarg = os->argv[os->ind]; + os->place = EMSG; + ++os->ind; + } + *optch = os->opt; + return APR_SUCCESS; +} + +/* Reverse the sequence argv[start..start+len-1]. */ +static void reverse(const char **argv, int start, int len) +{ + const char *temp; + + for (; len >= 2; start++, len -= 2) { + temp = argv[start]; + argv[start] = argv[start + len - 1]; + argv[start + len - 1] = temp; + } +} + +/* + * Permute os->argv with the goal that non-option arguments will all + * appear at the end. os->skip_start is where we started skipping + * non-option arguments, os->skip_end is where we stopped, and os->ind + * is where we are now. + */ +static void permute(apr_getopt_t *os) +{ + int len1 = os->skip_end - os->skip_start; + int len2 = os->ind - os->skip_end; + + if (os->interleave) { + /* + * Exchange the sequences argv[os->skip_start..os->skip_end-1] and + * argv[os->skip_end..os->ind-1]. The easiest way to do that is + * to reverse the entire range and then reverse the two + * sub-ranges. + */ + reverse(os->argv, os->skip_start, len1 + len2); + reverse(os->argv, os->skip_start, len2); + reverse(os->argv, os->skip_start + len2, len1); + } + + /* Reset skip range to the new location of the non-option sequence. */ + os->skip_start += len2; + os->skip_end += len2; +} + +/* Helper function to print out an error involving a long option */ +static apr_status_t serr(apr_getopt_t *os, const char *err, const char *str, + apr_status_t status) +{ + if (os->errfn) + (os->errfn)(os->errarg, "%s: %s: %s\n", + apr_filepath_name_get(*os->argv), err, str); + return status; +} + +/* Helper function to print out an error involving a short option */ +static apr_status_t cerr(apr_getopt_t *os, const char *err, int ch, + apr_status_t status) +{ + if (os->errfn) + (os->errfn)(os->errarg, "%s: %s: %c\n", + apr_filepath_name_get(*os->argv), err, ch); + return status; +} + +APR_DECLARE(apr_status_t) apr_getopt_long(apr_getopt_t *os, + const apr_getopt_option_t *opts, + int *optch, const char **optarg) +{ + const char *p; + int i; + + /* Let the calling program reset option processing. */ + if (os->reset) { + os->place = EMSG; + os->ind = 1; + os->reset = 0; + } + + /* + * We can be in one of two states: in the middle of processing a + * run of short options, or about to process a new argument. + * Since the second case can lead to the first one, handle that + * one first. */ + p = os->place; + if (*p == '\0') { + /* If we are interleaving, skip non-option arguments. */ + if (os->interleave) { + while (os->ind < os->argc && *os->argv[os->ind] != '-') + os->ind++; + os->skip_end = os->ind; + } + if (os->ind >= os->argc || *os->argv[os->ind] != '-') { + os->ind = os->skip_start; + return APR_EOF; + } + + p = os->argv[os->ind++] + 1; + if (*p == '-' && p[1] != '\0') { /* Long option */ + /* Search for the long option name in the caller's table. */ + apr_size_t len = 0; + + p++; + for (i = 0; ; i++) { + if (opts[i].optch == 0) /* No match */ + return serr(os, "invalid option", p - 2, APR_BADCH); + + if (opts[i].name) { + len = strlen(opts[i].name); + if (strncmp(p, opts[i].name, len) == 0 + && (p[len] == '\0' || p[len] == '=')) + break; + } + } + *optch = opts[i].optch; + + if (opts[i].has_arg) { + if (p[len] == '=') /* Argument inline */ + *optarg = p + len + 1; + else { + if (os->ind >= os->argc) /* Argument missing */ + return serr(os, "missing argument", p - 2, APR_BADARG); + else /* Argument in next arg */ + *optarg = os->argv[os->ind++]; + } + } else { + *optarg = NULL; + if (p[len] == '=') + return serr(os, "erroneous argument", p - 2, APR_BADARG); + } + permute(os); + return APR_SUCCESS; + } else { + if (*p == '-') { /* Bare "--"; we're done */ + permute(os); + os->ind = os->skip_start; + return APR_EOF; + } + else + if (*p == '\0') /* Bare "-" is illegal */ + return serr(os, "invalid option", p, APR_BADCH); + } + } + + /* + * Now we're in a run of short options, and *p is the next one. + * Look for it in the caller's table. + */ + for (i = 0; ; i++) { + if (opts[i].optch == 0) /* No match */ + return cerr(os, "invalid option character", *p, APR_BADCH); + + if (*p == opts[i].optch) + break; + } + *optch = *p++; + + if (opts[i].has_arg) { + if (*p != '\0') /* Argument inline */ + *optarg = p; + else { + if (os->ind >= os->argc) /* Argument missing */ + return cerr(os, "missing argument", *optch, APR_BADARG); + else /* Argument in next arg */ + *optarg = os->argv[os->ind++]; + } + os->place = EMSG; + } else { + *optarg = NULL; + os->place = p; + } + + permute(os); + return APR_SUCCESS; +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/getopt.lo b/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/getopt.lo new file mode 100644 index 00000000..fffb2aa4 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/getopt.lo @@ -0,0 +1,12 @@ +# getopt.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/getopt.o' + +# Name of the non-PIC object. +non_pic_object='getopt.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/getopt.o b/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/getopt.o new file mode 100644 index 0000000000000000000000000000000000000000..be33d3561b9456c3bfd7e7c22a5a6e3aaeae1d34 GIT binary patch literal 21152 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 +#endif +#ifdef HAVE_SYS_SELECT_H +#include +#endif +#if APR_HAVE_SYS_WAIT_H +#include +#endif +#ifdef BEOS +#include /* for fd_set definition! */ +#endif + +static apr_other_child_rec_t *other_children = NULL; + +static apr_status_t other_child_cleanup(void *data) +{ + apr_other_child_rec_t **pocr, *nocr; + + for (pocr = &other_children; *pocr; pocr = &(*pocr)->next) { + if ((*pocr)->data == data) { + nocr = (*pocr)->next; + (*(*pocr)->maintenance) (APR_OC_REASON_UNREGISTER, (*pocr)->data, -1); + *pocr = nocr; + /* XXX: um, well we've just wasted some space in pconf ? */ + return APR_SUCCESS; + } + } + return APR_SUCCESS; +} + +APR_DECLARE(void) apr_proc_other_child_register(apr_proc_t *proc, + void (*maintenance) (int reason, void *, int status), + void *data, apr_file_t *write_fd, apr_pool_t *p) +{ + apr_other_child_rec_t *ocr; + + ocr = apr_palloc(p, sizeof(*ocr)); + ocr->p = p; + ocr->proc = proc; + ocr->maintenance = maintenance; + ocr->data = data; + if (write_fd == NULL) { + ocr->write_fd = (apr_os_file_t) -1; + } + else { +#ifdef WIN32 + /* This should either go away as part of eliminating apr_proc_probe_writable_fds + * or write_fd should point to an apr_file_t + */ + ocr->write_fd = write_fd->filehand; +#else + ocr->write_fd = write_fd->filedes; +#endif + + } + ocr->next = other_children; + other_children = ocr; + apr_pool_cleanup_register(p, ocr->data, other_child_cleanup, + apr_pool_cleanup_null); +} + +APR_DECLARE(void) apr_proc_other_child_unregister(void *data) +{ + apr_other_child_rec_t *cur; + + cur = other_children; + while (cur) { + if (cur->data == data) { + break; + } + cur = cur->next; + } + + /* segfault if this function called with invalid parm */ + apr_pool_cleanup_kill(cur->p, cur->data, other_child_cleanup); + other_child_cleanup(data); +} + +APR_DECLARE(apr_status_t) apr_proc_other_child_alert(apr_proc_t *proc, + int reason, + int status) +{ + apr_other_child_rec_t *ocr, *nocr; + + for (ocr = other_children; ocr; ocr = nocr) { + nocr = ocr->next; + if (ocr->proc->pid != proc->pid) + continue; + + ocr->proc = NULL; + (*ocr->maintenance) (reason, ocr->data, status); + return APR_SUCCESS; + } + return APR_EPROC_UNKNOWN; +} + +APR_DECLARE(void) apr_proc_other_child_refresh(apr_other_child_rec_t *ocr, + int reason) +{ + /* Todo: + * Implement code to detect if pipes are still alive. + */ +#ifdef WIN32 + DWORD status; + + if (ocr->proc == NULL) + return; + + if (!ocr->proc->hproc) { + /* Already mopped up, perhaps we apr_proc_kill'ed it, + * they should have already unregistered! + */ + ocr->proc = NULL; + (*ocr->maintenance) (APR_OC_REASON_LOST, ocr->data, -1); + } + else if (!GetExitCodeProcess(ocr->proc->hproc, &status)) { + CloseHandle(ocr->proc->hproc); + ocr->proc->hproc = NULL; + ocr->proc = NULL; + (*ocr->maintenance) (APR_OC_REASON_LOST, ocr->data, -1); + } + else if (status == STILL_ACTIVE) { + (*ocr->maintenance) (reason, ocr->data, -1); + } + else { + CloseHandle(ocr->proc->hproc); + ocr->proc->hproc = NULL; + ocr->proc = NULL; + (*ocr->maintenance) (APR_OC_REASON_DEATH, ocr->data, status); + } + +#else /* ndef Win32 */ + pid_t waitret; + int status; + + if (ocr->proc == NULL) + return; + + waitret = waitpid(ocr->proc->pid, &status, WNOHANG); + if (waitret == ocr->proc->pid) { + ocr->proc = NULL; + (*ocr->maintenance) (APR_OC_REASON_DEATH, ocr->data, status); + } + else if (waitret == 0) { + (*ocr->maintenance) (reason, ocr->data, -1); + } + else if (waitret == -1) { + /* uh what the heck? they didn't call unregister? */ + ocr->proc = NULL; + (*ocr->maintenance) (APR_OC_REASON_LOST, ocr->data, -1); + } +#endif +} + +APR_DECLARE(void) apr_proc_other_child_refresh_all(int reason) +{ + apr_other_child_rec_t *ocr, *next_ocr; + + for (ocr = other_children; ocr; ocr = next_ocr) { + next_ocr = ocr->next; + apr_proc_other_child_refresh(ocr, reason); + } +} + +#else /* !APR_HAS_OTHER_CHILD */ + +APR_DECLARE(void) apr_proc_other_child_register(apr_proc_t *proc, + void (*maintenance) (int reason, void *, int status), + void *data, apr_file_t *write_fd, apr_pool_t *p) +{ + return; +} + +APR_DECLARE(void) apr_proc_other_child_unregister(void *data) +{ + return; +} + +APR_DECLARE(apr_status_t) apr_proc_other_child_alert(apr_proc_t *proc, + int reason, + int status) +{ + return APR_ENOTIMPL; +} + +APR_DECLARE(void) apr_proc_other_child_refresh(apr_other_child_rec_t *ocr, + int reason) +{ + return; +} + +APR_DECLARE(void) apr_proc_other_child_refresh_all(int reason) +{ + return; +} + +#endif /* APR_HAS_OTHER_CHILD */ + + +/* XXX: deprecated for removal in 1.0 + * The checks behaved differently between win32 and unix, while + * the old win32 code did a health check, the unix code called + * other_child_check only at restart. + */ +APR_DECLARE(void) apr_proc_other_child_check(void) +{ +#ifdef WIN32 + apr_proc_other_child_refresh_all(APR_OC_REASON_RUNNING); +#else + apr_proc_other_child_refresh_all(APR_OC_REASON_RESTART); +#endif +} + +/* XXX: deprecated for removal in 1.0 + * This really didn't test any sort of read - it simply notified + * the maintenance function that the process had died. + */ +APR_DECLARE(apr_status_t) apr_proc_other_child_read(apr_proc_t *proc, int status) +{ + return apr_proc_other_child_alert(proc, APR_OC_REASON_DEATH, status); +} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/otherchild.lo b/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/otherchild.lo new file mode 100644 index 00000000..3db8e42d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/otherchild.lo @@ -0,0 +1,12 @@ +# otherchild.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/otherchild.o' + +# Name of the non-PIC object. +non_pic_object='otherchild.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/otherchild.o b/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/otherchild.o new file mode 100644 index 0000000000000000000000000000000000000000..35ea63f994b5d8e43e0e17a1b6e2e5a489b5b6a3 GIT binary patch literal 16384 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 k@3TGc^FPz!?=4c|NbuaGq~}1ui4VsQ>@~ literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/rand.c b/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/rand.c new file mode 100644 index 00000000..843c13fc --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/rand.c @@ -0,0 +1,209 @@ +/* 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. + */ + +#define APR_WANT_MEMFUNC +#include "apr_want.h" +#include "apr_general.h" + +#include "apr_arch_misc.h" +#include +#if APR_HAVE_SYS_TYPES_H +#include +#endif +#if APR_HAVE_SYS_SOCKET_H +#include +#endif +#if APR_HAVE_FCNTL_H +#include +#endif +#if APR_HAVE_UNISTD_H +#include +#endif +#if APR_HAVE_SYS_UN_H +#include +#endif + +#ifndef SHUT_RDWR +#define SHUT_RDWR 2 +#endif + +#if APR_HAS_RANDOM + +APR_DECLARE(apr_status_t) apr_generate_random_bytes(unsigned char *buf, +#ifdef APR_ENABLE_FOR_1_0 + apr_size_t length) +#else + int length) +#endif +{ +#ifdef DEV_RANDOM + + int fd = -1; + + /* On BSD/OS 4.1, /dev/random gives out 8 bytes at a time, then + * gives EOF, so reading 'length' bytes may require opening the + * device several times. */ + do { + apr_ssize_t rc; + + if (fd == -1) + if ((fd = open(DEV_RANDOM, O_RDONLY)) == -1) + return errno; + + rc = read(fd, buf, length); + if (rc < 0) { + int errnum = errno; + close(fd); + return errnum; + } + else if (rc == 0) { + close(fd); + fd = -1; /* force open() again */ + } + else { + buf += rc; + length -= rc; + } + } while (length > 0); + + close(fd); +#elif defined(OS2) + static UCHAR randbyte(); + unsigned int idx; + + for (idx=0; idx 0; egdsockname++) { + egd_path_len = strlen(*egdsockname); + + if (egd_path_len > sizeof(addr.sun_path)) { + return APR_EINVAL; + } + + memset(&addr, 0, sizeof(struct sockaddr_un)); + addr.sun_family = AF_UNIX; + memcpy(addr.sun_path, *egdsockname, egd_path_len); + egd_addr_len = APR_OFFSETOF(struct sockaddr_un, sun_path) + + egd_path_len; + + egd_socket = socket(PF_UNIX, SOCK_STREAM, 0); + + if (egd_socket == -1) { + return errno; + } + + rv = connect(egd_socket, (struct sockaddr*)&addr, egd_addr_len); + + if (rv == -1) { + bad_errno = errno; + continue; + } + + /* EGD can only return 255 bytes of data at a time. Silly. */ + while (length > 0) { + apr_ssize_t srv; + req[0] = 2; /* We'll block for now. */ + req[1] = length > 255 ? 255: length; + + srv = write(egd_socket, req, 2); + if (srv == -1) { + bad_errno = errno; + shutdown(egd_socket, SHUT_RDWR); + close(egd_socket); + break; + } + + if (srv != 2) { + shutdown(egd_socket, SHUT_RDWR); + close(egd_socket); + return APR_EGENERAL; + } + + resp_expected = req[1]; + srv = read(egd_socket, resp, resp_expected); + if (srv == -1) { + bad_errno = errno; + shutdown(egd_socket, SHUT_RDWR); + close(egd_socket); + return bad_errno; + } + + memcpy(curbuf, resp, srv); + curbuf += srv; + length -= srv; + } + + shutdown(egd_socket, SHUT_RDWR); + close(egd_socket); + } + + if (length > 0) { + /* We must have iterated through the list of sockets, + * and no go. Return the errno. + */ + return bad_errno; + } + +#elif defined(HAVE_TRUERAND) /* use truerand */ + + extern int randbyte(void); /* from the truerand library */ + unsigned int idx; + + /* this will increase the startup time of the server, unfortunately... + * (generating 20 bytes takes about 8 seconds) + */ + for (idx=0; idxCmx>{>qzE?<;Qw9eU%A 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 Y6)(_ueYGaUg_M_xN5}z(p`jG=AME16v;Y7A literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/start.c b/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/start.c new file mode 100644 index 00000000..4b8ad990 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/start.c @@ -0,0 +1,89 @@ +/* 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. + */ + +#include "apr.h" +#include "apr_general.h" +#include "apr_pools.h" +#include "apr_signal.h" +#include "apr_atomic.h" + +#include "apr_arch_proc_mutex.h" /* for apr_proc_mutex_unix_setup_lock() */ +#include "apr_arch_internal_time.h" + + +APR_DECLARE(apr_status_t) apr_app_initialize(int *argc, + const char * const * *argv, + const char * const * *env) +{ + /* An absolute noop. At present, only Win32 requires this stub, but it's + * required in order to move command arguments passed through the service + * control manager into the process, and it's required to fix the char* + * data passed in from win32 unicode into utf-8, win32's apr internal fmt. + */ + return apr_initialize(); +} + +static int initialized = 0; + +APR_DECLARE(apr_status_t) apr_initialize(void) +{ + apr_pool_t *pool; + apr_status_t status; + + if (initialized++) { + return APR_SUCCESS; + } + +#if !defined(BEOS) && !defined(OS2) + apr_proc_mutex_unix_setup_lock(); + apr_unix_setup_time(); +#endif + + if ((status = apr_pool_initialize()) != APR_SUCCESS) + return status; + + if (apr_pool_create(&pool, NULL) != APR_SUCCESS) { + return APR_ENOPOOL; + } + + apr_pool_tag(pool, "apr_initialize"); + + /* apr_atomic_init() used to be called from here aswell. + * Pools rely on mutexes though, which can be backed by + * atomics. Due to this circular dependency + * apr_pool_initialize() is taking care of calling + * apr_atomic_init() at the correct time. + */ + + apr_signal_init(pool); + + return APR_SUCCESS; +} + +APR_DECLARE_NONSTD(void) apr_terminate(void) +{ + initialized--; + if (initialized) { + return; + } + apr_pool_terminate(); + +} + +APR_DECLARE(void) apr_terminate2(void) +{ + apr_terminate(); +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/start.lo b/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/start.lo new file mode 100644 index 00000000..07d5275b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/start.lo @@ -0,0 +1,12 @@ +# start.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/start.o' + +# Name of the non-PIC object. +non_pic_object='start.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/start.o b/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/start.o new file mode 100644 index 0000000000000000000000000000000000000000..54e4ef9edcb8d8e0beb07672eb7fdd8debc21eb5 GIT binary patch literal 9256 zcmbtaYj9h|72cIBTecF%iHRRL4}~Ozlt{9S>$*UKn-H)=$b-gBC^INm(v>YDOX}5C zYM=uqk7+`h!D-91!($rgzyOnJ1N{@#9nDzTbkWBGmZs zTT1l~JR7mXdHC0ahSt}w#O0v$^}$~P8^WUBH+=XVpAfUqZaA;h+WvSSFhOm9f_96x zKSjGk+n=Ew*7gOoFPjYy(I6y(ZVjXY{Tlcb7|@_jfk6!d3T)A!UV$AN1m(*R;Z6;j zA2E6UnV1fJ#fCCyVmqn0G zY7mus0Q^vcm;y&N=vLqf4dMzM*PurpfjTEN=vA?u)SyrP9ol(WG()*)ctA}@H2i1P`33BINb>S}@a#J>dXYk_SguY4q@J%6q5@8N!C3%pD8cj^fP2AdyBr2* z?Q)y!ZkJo}ag*$>%IaXxJgH>c8X==p@!y48N(bJ>k)THHG|1&ct&DHlNCs({^mUzc10(8_8w!a8ldJLu%#VjW^8Y}0s<3f~N%W9m~z z8@h>CA=`2C1%PnSA}kgPIaCs~a=Ajvatn^8Al593>y#fhu^zUYC_05yVyx`iHKDd{$n z1;@>l^C@Zr!%JEvTNP?2qBIJcFkTcBW0teac1p^hV_Rw66=!6(M{kXYTp>RaRu8O& zapGhrpkw8t8r`Zq1#TcLdt4-75_jpUs;yMnNu&z7@>pKLgzGkSA1VQQI#`0pRan;z zZCo$Pc^nu!9Zro}j))}-uA8&-c4}8C=9H7kLMdhyi?LDHEv6$q(e7wpZ>;2`aFIi> zv9W9^rI)AWjHHCuRkdf8CNS730Ov{%lt`$t!_ZX4sWONy3w6*`k-(m9NF9xj%1+e)UF6@9M?|4HuEeeT*?VtczwONf-+ec=7MTf zhl?Z@({lAhp*91!g%zRZ6Sh2z2CkLLtU{mEN`-u^kk+eMtvX!+b^#t4BC*@Gk~y1~ ze`TvE6|UjRA%otl+uyq=)!M5@m&OyQP=?@PF0l;a7uT;_cV+mp;bb}Qmi6#OdddpL z?~3uv9ayt!9L`%1i!7xDXIyxU^%dvA-6plMrMAMdQiDcms0Oj#$ z93YC)cCtJIhe@UYQe|7oq+{=91S2s;X*pJY#71Y;+VJ+USr5)dG*uWIvtf@!^RRrP zu=pZsIZ-8hG?8(vF`N4H|7Kxu0K+WQSFXp|0NLg%635b;x&Xj?V_JF_Cl1mUbPfsU z7fpTvQ?a;|cz82SNdc-ig#=*I_-aR=W_|tHKRq@x);Rg>f!v$8{v0m}Hn-3DdJpH7 zwv(Wj7bX>QJ=P9@Va9}I{qzAb*oa7vAI_0Eep`VveWLybn$Z6mg$5Lf8R}n44ZVfV zJjtwIfHIRq`ErW8+fx@!Q+pe5wfaA?R9EEsxPF@8pV|Mtz?nX=<}kH?z$i4JxC^wk z+CNV1^E$=$@vGfz|32W*C&vk z{i;G+XQ;l(b3NuyfPq})mPQ4yQ2incDd+w({VW)@#_tsxznvt+@xz}dxIT|7a>fv; z8vV5KPAODfQMBV?X7(Nr4RrNups#~m^~`Snj= z(+d1*MyAo=A6LcnO zE>%B8)ICvsLBYoi0`F%QV)%M6BdOe4bzD=wzpze4fbV8LpD@QY{mBKL;2Nls$uIZt zxSCkc=PBy(*GA@J9zFa_QsMb7iF!Q4SZ|RYcLL8PQW@e=k7o|+iyj_-Ic5I49v=Jk zG4<=28TflVJgyJ+^N5FspMxs=OEd6vJ(%)NMJexK>=)YK#*RSZ9m)LdbX4&joB466 z^%w&tgycfumFlVA zd^5#)*5KbF{&j=zp?2Rk_{HS^Uj`o`{HeijCqGTp4)^zc(zP4>BI1`Be1h7I8~hf+ zYYcun;TsJ8R>C_B-X_dB$C)GEG4xkbzwS2p`GgM}{IjJ0zQMmk{XJ^%8wejW_*+PS z!r;G5{6_|VBk>muUj4}n#+3isgffz-kq+~`0mAdvB^)()9`}9^@4XeSCZ7HC`M$y6 zqpDRQc)hTm|MrkJ^jk=O$lz}y{-}rdzJH(c@Yr9M^e2etdB;9uI%Vi56f49Z4E-}S z&To5o9EU#Azw6=AH=mpDdwA3rNH6ha4+-Nz{s{z->WSy^*{^A_(%>hFA29gGh~MP# zkMS&}IJO!3{FQj;$Huz)2zhLn95P#a>`91Wi z!Ix;U|IXk;G>-vVG`t?(q<$?h_|3#e41R=o?>$QW4major = APR_MAJOR_VERSION; + pvsn->minor = APR_MINOR_VERSION; + pvsn->patch = APR_PATCH_VERSION; +#ifdef APR_IS_DEV_VERSION + pvsn->is_dev = 1; +#else + pvsn->is_dev = 0; +#endif +} + +APR_DECLARE(const char *) apr_version_string(void) +{ + return APR_VERSION_STRING; +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/version.lo b/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/version.lo new file mode 100644 index 00000000..dc9f16e3 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/version.lo @@ -0,0 +1,12 @@ +# version.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/version.o' + +# Name of the non-PIC object. +non_pic_object='version.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/version.o b/rubbos/app/httpd-2.0.64/srclib/apr/misc/unix/version.o new file mode 100644 index 0000000000000000000000000000000000000000..bb339315d92ef972ee0de708085d144bfd9ff067 GIT binary patch literal 3928 zcmbtW&2Jl35T9K;iBqSE+a%B^NL?i82g2(l3ZX4(Yf+V|QU#PMG$2H@UT^HB_S)KA zS7{|aDj|Uo5%sv>_Rh?2zTTVn z-tK$z?1g7+%K{+_PQgeM6yW)Zkz7||9Ts6f+?gWf&bi{WVx@V-W(fRY?qD6hQPPTg z++95m%b2-H0F+dX`wAUWM*Xm@5(&1gD%eHMN}5@d+NMTTC{Bb?3U*0p_P7gc+E%RC zo8Mxjc6{+NCDHO_l8aj2BAJuDMDh&iaxdRNWvcWunLGHPIfJ!8Pojr31MBuZl=hHj zEs$t!VieUaE6n+c7?aA3vUMA*eb%G1^X0*{I+YFqv1!*jy`;SlFHw#9fsdYEqAYtR zhGF&r9H(=lW zMt*0|3;?bMaT4|-*Qao=A8!lL)?0E~mqlY?!J2OkcE4Y+Cox~A7quMqplvXSlCTv8 zO=nE;+g=Q8P;#x&OVdse1^$(!77rSYUQ+Y={aQOs`_1Z_yW(!F*OJ)pgbl>wS~pDm z+8_#dK~);7()Uuot??Y=)g;Q!2F^XZ>6~%a-DB>$Q|+dMC^*@|am1mIsu%n1le@<@ zsvBr*Io0RZoa#=Jdj6GaKklW0pY~$tdavPAO=CE1>6H)NFhXn6?!~DyHq1;*w^MeY zCS~y?jl-ygow^>R*ZKj3$#yfi3UKbsnG?>D&Bh=~2YT$)wSm%B-&kFDSJsbel$MT2 z4uy671+aE2*7D3$=_amu1#NOpgcG(xK}d2Oz)h}oQ?G$MjWutJ6bBv8O@rMO+@_a$ z;5L#3+_*;yxv#pbsFG7NXbf80VYJgjS0#ImMvU{xn!VVIS^;Gkg>=FwkPyrWuHWl+ z1MHO>;Uc)WgjKaD92B&-cVe%Ld-(s7g9+%hIP3!_tTQ)H8TBqp%c$sAY!(Hmt5-4r zo^3^VPA#eP@;TMER;%WT!`7+19i{kIXL zoH9-n75&KdeWReL!aqRoy!gXBsK+>;Fo_d>i{r&E{9@jua(usFjE5`Xu*LE9A)*DD zzrdfPkXPym_fPsl{j1<#;-#GEFdd|9> z8_7@KNunn;8`fRqx~B|WI!oUdBFWR!DqLVLxQyeHfp2hr&%pm=y=~x^*k9^M{y*3c zuV#t_e~0zg4V+bY&%p1p{-J@-aotZ0{08e^8u%;h|DAy!Vf+^Z|CIG#nUh;~9e+3c uKW5$Ld@|oU>od$HkHh}ieJC=S=-o*q{#t|KI-0n{4m8H>IM)qa{Qd^_jz7u( literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/misc/win32/apr_app.c b/rubbos/app/httpd-2.0.64/srclib/apr/misc/win32/apr_app.c new file mode 100644 index 00000000..baac96e8 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/misc/win32/apr_app.c @@ -0,0 +1,80 @@ +/* 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 Notes: + * + * this module, and the misc/win32/utf8.c modules must be + * compiled APR_EXPORT_STATIC and linked to an application with + * the /entry:wmainCRTStartup flag. This module becomes the true + * wmain entry point, and passes utf-8 reformatted argv and env + * arrays to the application's main function. + * + * This module is only compatible with Unicode-only executables. + * Mixed (Win9x backwards compatible) binaries should refer instead + * to the apr_startup.c module. + * + * _dbg_malloc/realloc is used in place of the usual API, in order + * to convince the MSVCRT that they created these entities. If we + * do not create them as _CRT_BLOCK entities, the crt will fault + * on an assert. We are not worrying about the crt's locks here, + * since we are single threaded [so far]. + */ + +#include "apr_general.h" +#include "ShellAPI.h" +#include "crtdbg.h" +#include "wchar.h" +#include "apr_arch_file_io.h" +#include "assert.h" +#include "apr_private.h" +#include "apr_arch_misc.h" + +/* This symbol is _private_, although it must be exported. + */ + +extern int main(int argc, const char **argv, const char **env); + +int wmain(int argc, const wchar_t **wargv, const wchar_t **wenv) +{ + char **argv; + char **env; + int dupenv; + + (void)apr_wastrtoastr(&argv, wargv, argc); + + dupenv = apr_wastrtoastr(&env, wenv, -1); + + _environ = _malloc_dbg((dupenv + 1) * sizeof (char *), + _CRT_BLOCK, __FILE__, __LINE__ ); + memcpy(_environ, env, (dupenv + 1) * sizeof (char *)); + + /* MSVCRT will attempt to maintain the wide environment calls + * on _putenv(), which is bogus if we've passed a non-ascii + * string to _putenv(), since they use MultiByteToWideChar + * and breaking the implicit utf-8 assumption we've built. + * + * Reset _wenviron for good measure. + */ + if (_wenviron) { + wenv = _wenviron; + _wenviron = NULL; + free((wchar_t **)wenv); + } + + apr_app_init_complete = 1; + + return main(argc, argv, env); +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/misc/win32/charset.c b/rubbos/app/httpd-2.0.64/srclib/apr/misc/win32/charset.c new file mode 100644 index 00000000..41135b25 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/misc/win32/charset.c @@ -0,0 +1,55 @@ +/* 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. + */ + +#include "apr.h" +#include "apr_strings.h" +#include "apr_portable.h" + + +APR_DECLARE(const char*) apr_os_default_encoding (apr_pool_t *pool) +{ + return apr_psprintf(pool, "CP%u", (unsigned) GetACP()); +} + + +APR_DECLARE(const char*) apr_os_locale_encoding (apr_pool_t *pool) +{ +#ifdef _UNICODE + int i; +#endif +#if defined(_WIN32_WCE) + LCID locale = GetUserDefaultLCID(); +#else + LCID locale = GetThreadLocale(); +#endif + int len = GetLocaleInfo(locale, LOCALE_IDEFAULTANSICODEPAGE, NULL, 0); + char *cp = apr_palloc(pool, (len * sizeof(TCHAR)) + 2); + if (0 < GetLocaleInfo(locale, LOCALE_IDEFAULTANSICODEPAGE, (TCHAR*) (cp + 2), len)) + { + /* Fix up the returned number to make a valid codepage name of + the form "CPnnnn". */ + cp[0] = 'C'; + cp[1] = 'P'; +#ifdef _UNICODE + for(i = 0; i < len; i++) { + cp[i + 2] = (char) ((TCHAR*) (cp + 2))[i]; + } +#endif + return cp; + } + + return apr_os_default_encoding(pool); +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/misc/win32/env.c b/rubbos/app/httpd-2.0.64/srclib/apr/misc/win32/env.c new file mode 100644 index 00000000..644f59b8 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/misc/win32/env.c @@ -0,0 +1,192 @@ +/* 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. + */ + +#define APR_WANT_STRFUNC +#include "apr_want.h" +#include "apr.h" +#include "apr_arch_misc.h" +#include "apr_arch_utf8.h" +#include "apr_env.h" +#include "apr_errno.h" +#include "apr_pools.h" +#include "apr_strings.h" + +#if APR_HAS_UNICODE_FS && !defined(_WIN32_WCE) +static apr_status_t widen_envvar_name (apr_wchar_t *buffer, + apr_size_t bufflen, + const char *envvar) +{ + apr_size_t inchars; + apr_status_t status; + + inchars = strlen(envvar) + 1; + status = apr_conv_utf8_to_ucs2(envvar, &inchars, buffer, &bufflen); + if (status == APR_INCOMPLETE) + status = APR_ENAMETOOLONG; + + return status; +} +#endif + + +APR_DECLARE(apr_status_t) apr_env_get(char **value, + const char *envvar, + apr_pool_t *pool) +{ +#if defined(_WIN32_WCE) + return APR_ENOTIMPL; +#else + char *val = NULL; + DWORD size; + +#if APR_HAS_UNICODE_FS + IF_WIN_OS_IS_UNICODE + { + apr_wchar_t wenvvar[APR_PATH_MAX]; + apr_size_t inchars, outchars; + apr_wchar_t *wvalue, dummy; + apr_status_t status; + + status = widen_envvar_name(wenvvar, APR_PATH_MAX, envvar); + if (status) + return status; + + SetLastError(0); + size = GetEnvironmentVariableW(wenvvar, &dummy, 0); + if (GetLastError() == ERROR_ENVVAR_NOT_FOUND) + /* The environment variable doesn't exist. */ + return APR_ENOENT; + + if (size == 0) { + /* The environment value exists, but is zero-length. */ + *value = apr_pstrdup(pool, ""); + return APR_SUCCESS; + } + + wvalue = apr_palloc(pool, size * sizeof(*wvalue)); + size = GetEnvironmentVariableW(wenvvar, wvalue, size); + + inchars = wcslen(wvalue) + 1; + outchars = 3 * inchars; /* Enough for any UTF-8 representation */ + val = apr_palloc(pool, outchars); + status = apr_conv_ucs2_to_utf8(wvalue, &inchars, val, &outchars); + if (status) + return status; + } +#endif +#if APR_HAS_ANSI_FS + ELSE_WIN_OS_IS_ANSI + { + char dummy; + + SetLastError(0); + size = GetEnvironmentVariableA(envvar, &dummy, 0); + if (GetLastError() == ERROR_ENVVAR_NOT_FOUND) + /* The environment variable doesn't exist. */ + return APR_ENOENT; + + if (size == 0) { + /* The environment value exists, but is zero-length. */ + *value = apr_pstrdup(pool, ""); + return APR_SUCCESS; + } + + val = apr_palloc(pool, size); + size = GetEnvironmentVariableA(envvar, val, size); + if (size == 0) + /* Mid-air collision?. Somebody must've changed the env. var. */ + return APR_INCOMPLETE; + } +#endif + + *value = val; + return APR_SUCCESS; +#endif +} + + +APR_DECLARE(apr_status_t) apr_env_set(const char *envvar, + const char *value, + apr_pool_t *pool) +{ +#if defined(_WIN32_WCE) + return APR_ENOTIMPL; +#else +#if APR_HAS_UNICODE_FS + IF_WIN_OS_IS_UNICODE + { + apr_wchar_t wenvvar[APR_PATH_MAX]; + apr_wchar_t *wvalue; + apr_size_t inchars, outchars; + apr_status_t status; + + status = widen_envvar_name(wenvvar, APR_PATH_MAX, envvar); + if (status) + return status; + + outchars = inchars = strlen(value) + 1; + wvalue = apr_palloc(pool, outchars * sizeof(*wvalue)); + status = apr_conv_utf8_to_ucs2(value, &inchars, wvalue, &outchars); + if (status) + return status; + + if (!SetEnvironmentVariableW(wenvvar, wvalue)) + return apr_get_os_error(); + } +#endif +#if APR_HAS_ANSI_FS + ELSE_WIN_OS_IS_ANSI + { + if (!SetEnvironmentVariableA(envvar, value)) + return apr_get_os_error(); + } +#endif + + return APR_SUCCESS; +#endif +} + + +APR_DECLARE(apr_status_t) apr_env_delete(const char *envvar, apr_pool_t *pool) +{ +#if defined(_WIN32_WCE) + return APR_ENOTIMPL; +#else +#if APR_HAS_UNICODE_FS + IF_WIN_OS_IS_UNICODE + { + apr_wchar_t wenvvar[APR_PATH_MAX]; + apr_status_t status; + + status = widen_envvar_name(wenvvar, APR_PATH_MAX, envvar); + if (status) + return status; + + if (!SetEnvironmentVariableW(wenvvar, NULL)) + return apr_get_os_error(); + } +#endif +#if APR_HAS_ANSI_FS + ELSE_WIN_OS_IS_ANSI + { + if (!SetEnvironmentVariableA(envvar, NULL)) + return apr_get_os_error(); + } +#endif + + return APR_SUCCESS; +#endif +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/misc/win32/internal.c b/rubbos/app/httpd-2.0.64/srclib/apr/misc/win32/internal.c new file mode 100644 index 00000000..b045bd42 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/misc/win32/internal.c @@ -0,0 +1,102 @@ +/* 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. + */ + +#include "apr_private.h" + +#include "apr_arch_misc.h" +#include "apr_arch_file_io.h" +#include +#include + +/* This module is the source of -static- helper functions that are + * entirely internal to apr. If the fn is exported - it does not + * belong here. + * + * Namespace decoration is still required to protect us from symbol + * clashes in static linkages. + */ + + +/* Shared by apr_app.c and start.c + * + * An internal apr function to convert an array of strings (either + * a counted or NULL terminated list, such as an argv[argc] or env[] + * list respectively) from wide Unicode strings to narrow utf-8 strings. + * These are allocated from the MSVCRT's _CRT_BLOCK to trick the system + * into trusting our store. + */ +int apr_wastrtoastr(char const * const * *retarr, + wchar_t const * const *arr, int args) +{ + apr_size_t elesize = 0; + char **newarr; + char *elements; + char *ele; + int arg; + + if (args < 0) { + for (args = 0; arr[args]; ++args) + ; + } + + newarr = _malloc_dbg((args + 1) * sizeof(char *), + _CRT_BLOCK, __FILE__, __LINE__); + + for (arg = 0; arg < args; ++arg) { + newarr[arg] = (void*)(wcslen(arr[arg]) + 1); + elesize += (apr_size_t)newarr[arg]; + } + + /* This is a safe max allocation, we will realloc after + * processing and return the excess to the free store. + * 3 ucs bytes hold any single wchar_t value (16 bits) + * 4 ucs bytes will hold a wchar_t pair value (20 bits) + */ + elesize = elesize * 3 + 1; + ele = elements = _malloc_dbg(elesize * sizeof(char), + _CRT_BLOCK, __FILE__, __LINE__); + + for (arg = 0; arg < args; ++arg) { + apr_size_t len = (apr_size_t)newarr[arg]; + apr_size_t newlen = elesize; + + newarr[arg] = ele; + (void)apr_conv_ucs2_to_utf8(arr[arg], &len, + newarr[arg], &elesize); + + newlen -= elesize; + ele += newlen; + assert(elesize && (len == 0)); + } + + newarr[arg] = NULL; + *(ele++) = '\0'; + + /* Return to the free store if the heap realloc is the least bit optimized + */ + ele = _realloc_dbg(elements, ele - elements, + _CRT_BLOCK, __FILE__, __LINE__); + + if (ele != elements) { + apr_size_t diff = ele - elements; + for (arg = 0; arg < args; ++arg) { + newarr[arg] += diff; + } + } + + *retarr = newarr; + return args; +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/misc/win32/misc.c b/rubbos/app/httpd-2.0.64/srclib/apr/misc/win32/misc.c new file mode 100644 index 00000000..f121cac9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/misc/win32/misc.c @@ -0,0 +1,237 @@ +/* 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. + */ + +#include "apr_private.h" +#include "apr_arch_misc.h" +#include "crtdbg.h" +#include "apr_arch_file_io.h" +#include "assert.h" +#include "apr_lib.h" + +APR_DECLARE_DATA apr_oslevel_e apr_os_level = APR_WIN_UNK; + +apr_status_t apr_get_oslevel(apr_oslevel_e *level) +{ + if (apr_os_level == APR_WIN_UNK) + { + static OSVERSIONINFO oslev; + oslev.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + GetVersionEx(&oslev); + + if (oslev.dwPlatformId == VER_PLATFORM_WIN32_NT) + { + static unsigned int servpack = 0; + char *pservpack; + if (pservpack = oslev.szCSDVersion) { + while (*pservpack && !apr_isdigit(*pservpack)) { + pservpack++; + } + if (*pservpack) + servpack = atoi(pservpack); + } + + if (oslev.dwMajorVersion < 3) { + apr_os_level = APR_WIN_UNSUP; + } + else if (oslev.dwMajorVersion == 3) { + if (oslev.dwMajorVersion < 50) { + apr_os_level = APR_WIN_UNSUP; + } + else if (oslev.dwMajorVersion == 50) { + apr_os_level = APR_WIN_NT_3_5; + } + else { + apr_os_level = APR_WIN_NT_3_51; + } + } + else if (oslev.dwMajorVersion == 4) { + if (servpack < 2) + apr_os_level = APR_WIN_NT_4; + else if (servpack <= 2) + apr_os_level = APR_WIN_NT_4_SP2; + else if (servpack <= 3) + apr_os_level = APR_WIN_NT_4_SP3; + else if (servpack <= 4) + apr_os_level = APR_WIN_NT_4_SP4; + else if (servpack <= 5) + apr_os_level = APR_WIN_NT_4_SP5; + else + apr_os_level = APR_WIN_NT_4_SP6; + } + else if (oslev.dwMajorVersion == 5) { + if (oslev.dwMinorVersion == 0) { + if (servpack == 0) + apr_os_level = APR_WIN_2000; + else if (servpack == 1) + apr_os_level = APR_WIN_2000_SP1; + else + apr_os_level = APR_WIN_2000_SP2; + } + else { + apr_os_level = APR_WIN_XP; + } + } + else { + apr_os_level = APR_WIN_XP; + } + } +#ifndef WINNT + else if (oslev.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS) { + char *prevision; + if (prevision = oslev.szCSDVersion) { + while (*prevision && !apr_isupper(*prevision)) { + prevision++; + } + } + else prevision = ""; + + if (oslev.dwMinorVersion < 10) { + if (*prevision < 'C') + apr_os_level = APR_WIN_95; + else + apr_os_level = APR_WIN_95_OSR2; + } + else if (oslev.dwMinorVersion < 90) { + if (*prevision < 'A') + apr_os_level = APR_WIN_98; + else + apr_os_level = APR_WIN_98_SE; + } + else { + apr_os_level = APR_WIN_ME; + } + } +#endif +#ifdef _WIN32_WCE + else if (oslev.dwPlatformId == VER_PLATFORM_WIN32_CE) + { + if (oslev.dwMajorVersion < 3) { + apr_os_level = APR_WIN_UNSUP; + } + else { + apr_os_level = APR_WIN_CE_3; + } + } +#endif + else { + apr_os_level = APR_WIN_UNSUP; + } + } + + *level = apr_os_level; + + if (apr_os_level < APR_WIN_UNSUP) { + return APR_EGENERAL; + } + + return APR_SUCCESS; +} + + +/* This is the helper code to resolve late bound entry points + * missing from one or more releases of the Win32 API + */ + +static const char* const lateDllName[DLL_defined] = { + "kernel32", "advapi32", "mswsock", "ws2_32", "shell32", "ntdll.dll" }; +static HMODULE lateDllHandle[DLL_defined] = { + NULL, NULL, NULL, NULL, NULL, NULL }; + +FARPROC apr_load_dll_func(apr_dlltoken_e fnLib, char* fnName, int ordinal) +{ + if (!lateDllHandle[fnLib]) { + lateDllHandle[fnLib] = LoadLibrary(lateDllName[fnLib]); + if (!lateDllHandle[fnLib]) + return NULL; + } + if (ordinal) + return GetProcAddress(lateDllHandle[fnLib], (char *) ordinal); + else + return GetProcAddress(lateDllHandle[fnLib], fnName); +} + +/* Declared in include/arch/win32/apr_dbg_win32_handles.h + */ +APR_DECLARE_NONSTD(HANDLE) apr_dbg_log(char* fn, HANDLE ha, char* fl, int ln, + int nh, /* HANDLE hv, char *dsc */...) +{ + static DWORD tlsid = 0xFFFFFFFF; + static HANDLE fh = NULL; + static long ctr = 0; + static CRITICAL_SECTION cs; + long seq; + DWORD wrote; + char *sbuf; + + seq = (InterlockedIncrement)(&ctr); + + if (tlsid == 0xFFFFFFFF) { + tlsid = (TlsAlloc)(); + } + + sbuf = (TlsGetValue)(tlsid); + if (!fh || !sbuf) { + sbuf = (malloc)(1024); + (TlsSetValue)(tlsid, sbuf); + sbuf[1023] = '\0'; + if (!fh) { + (GetModuleFileName)(NULL, sbuf, 250); + sprintf(strchr(sbuf, '\0'), ".%d", + (GetCurrentProcessId)()); + fh = (CreateFile)(sbuf, GENERIC_WRITE, 0, NULL, + CREATE_ALWAYS, 0, NULL); + (InitializeCriticalSection)(&cs); + } + } + + if (!nh) { + (sprintf)(sbuf, "%08x %08x %08x %s() %s:%d\n", + (DWORD)ha, seq, GetCurrentThreadId(), fn, fl, ln); + (EnterCriticalSection)(&cs); + (WriteFile)(fh, sbuf, strlen(sbuf), &wrote, NULL); + (LeaveCriticalSection)(&cs); + } + else { + va_list a; + va_start(a,nh); + (EnterCriticalSection)(&cs); + do { + HANDLE *hv = va_arg(a, HANDLE*); + char *dsc = va_arg(a, char*); + if (strcmp(dsc, "Signaled") == 0) { + if ((DWORD)ha >= STATUS_WAIT_0 + && (DWORD)ha < STATUS_ABANDONED_WAIT_0) { + hv += (DWORD)ha; + } + else if ((DWORD)ha >= STATUS_ABANDONED_WAIT_0 + && (DWORD)ha < STATUS_USER_APC) { + hv += (DWORD)ha - STATUS_ABANDONED_WAIT_0; + dsc = "Abandoned"; + } + else if ((DWORD)ha == WAIT_TIMEOUT) { + dsc = "Timed Out"; + } + } + (sprintf)(sbuf, "%08x %08x %08x %s(%s) %s:%d\n", + (DWORD*)*hv, seq, GetCurrentThreadId(), + fn, dsc, fl, ln); + (WriteFile)(fh, sbuf, strlen(sbuf), &wrote, NULL); + } while (--nh); + (LeaveCriticalSection)(&cs); + va_end(a); + } + return ha; +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/misc/win32/rand.c b/rubbos/app/httpd-2.0.64/srclib/apr/misc/win32/rand.c new file mode 100644 index 00000000..e72637bf --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/misc/win32/rand.c @@ -0,0 +1,69 @@ +/* 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. + */ + +#include +#include +#include "apr.h" +#include "apr_private.h" +#include "apr_general.h" +#include "apr_portable.h" +#include "apr_arch_misc.h" + + +APR_DECLARE(apr_status_t) apr_generate_random_bytes(unsigned char * buf, +#ifdef APR_ENABLE_FOR_1_0 + apr_size_t length) +#else + int length) +#endif +{ + HCRYPTPROV hProv; + apr_status_t res = APR_SUCCESS; + + /* 0x40 bit = CRYPT_SILENT, only introduced in more recent PSDKs + * and will only work for Win2K and later. + */ + DWORD flags = CRYPT_VERIFYCONTEXT + | ((apr_os_level >= APR_WIN_2000) ? 0x40 : 0); + + if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, flags)) { + return apr_get_os_error(); + } + if (!CryptGenRandom(hProv, length, buf)) { + res = apr_get_os_error(); + } + CryptReleaseContext(hProv, 0); + return res; +} + + +APR_DECLARE(apr_status_t) apr_os_uuid_get(unsigned char *uuid_data) +{ + /* Note: this call doesn't actually require CoInitialize() first + * + * XXX: we should scramble the bytes or some such to eliminate the + * possible misuse/abuse since uuid is based on the NIC address, and + * is therefore not only a uniqifier, but an identity (which might not + * be appropriate in all cases. + * + * Note that Win2000, XP and later no longer suffer from this problem, + * a scrambling fix is only needed for (apr_os_level < APR_WIN_2000) + */ + if (FAILED(UuidCreate((UUID *)uuid_data))) { + return APR_EGENERAL; + } + return APR_SUCCESS; +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/misc/win32/start.c b/rubbos/app/httpd-2.0.64/srclib/apr/misc/win32/start.c new file mode 100644 index 00000000..f25776be --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/misc/win32/start.c @@ -0,0 +1,230 @@ +/* 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. + */ + +#include "apr_private.h" +#include "apr_general.h" +#include "apr_pools.h" +#include "apr_signal.h" +#include "shellapi.h" + +#include "apr_arch_misc.h" /* for WSAHighByte / WSALowByte */ +#include "wchar.h" +#include "apr_arch_file_io.h" /* bring in unicode-ness */ +#include "apr_arch_threadproc.h" /* bring in apr_threadproc_init */ +#include "crtdbg.h" +#include "assert.h" + +/* This symbol is _private_, although it must be exported. + */ +int APR_DECLARE_DATA apr_app_init_complete = 0; + +#if !defined(_WIN32_WCE) +/* Used by apr_app_initialize to reprocess the environment + * + * An internal apr function to convert a double-null terminated set + * of single-null terminated strings from wide Unicode to narrow utf-8 + * as a list of strings. These are allocated from the MSVCRT's + * _CRT_BLOCK to trick the system into trusting our store. + */ +static int warrsztoastr(const char * const * *retarr, + const wchar_t * arrsz, int args) +{ + const apr_wchar_t *wch; + apr_size_t totlen; + apr_size_t newlen; + apr_size_t wsize; + char **newarr; + int arg; + + if (args < 0) { + for (args = 1, wch = arrsz; wch[0] || wch[1]; ++wch) + if (!*wch) + ++args; + } + wsize = 1 + wch - arrsz; + + newarr = _malloc_dbg((args + 1) * sizeof(char *), + _CRT_BLOCK, __FILE__, __LINE__); + + /* This is a safe max allocation, we will realloc after + * processing and return the excess to the free store. + * 3 ucs bytes hold any single wchar_t value (16 bits) + * 4 ucs bytes will hold a wchar_t pair value (20 bits) + */ + newlen = totlen = wsize * 3 + 1; + newarr[0] = _malloc_dbg(newlen * sizeof(char), + _CRT_BLOCK, __FILE__, __LINE__); + + (void)apr_conv_ucs2_to_utf8(arrsz, &wsize, + newarr[0], &newlen); + + assert(newlen && !wsize); + /* Return to the free store if the heap realloc is the least bit optimized + */ + newarr[0] = _realloc_dbg(newarr[0], totlen - newlen, + _CRT_BLOCK, __FILE__, __LINE__); + + for (arg = 1; arg < args; ++arg) { + newarr[arg] = newarr[arg - 1] + 2; + while (*(newarr[arg]++)) { + /* continue */; + } + } + + newarr[arg] = NULL; + + *retarr = newarr; + return args; +} +#endif + +/* Reprocess the arguments to main() for a completely apr-ized application + */ + +APR_DECLARE(apr_status_t) apr_app_initialize(int *argc, + const char * const * *argv, + const char * const * *env) +{ + apr_status_t rv = apr_initialize(); + + if (rv != APR_SUCCESS) { + return rv; + } + +#if defined(_WIN32_WCE) + apr_app_init_complete = 1; +#elif APR_HAS_UNICODE_FS + IF_WIN_OS_IS_UNICODE + { + apr_wchar_t **wstrs; + apr_wchar_t *sysstr; + int wstrc; + int dupenv; + + if (apr_app_init_complete) { + return rv; + } + + apr_app_init_complete = 1; + + sysstr = GetCommandLineW(); + if (sysstr) { + wstrs = CommandLineToArgvW(sysstr, &wstrc); + if (wstrs) { + *argc = apr_wastrtoastr(argv, wstrs, wstrc); + GlobalFree(wstrs); + } + } + + sysstr = GetEnvironmentStringsW(); + dupenv = warrsztoastr(&_environ, sysstr, -1); + + if (env) { + *env = _malloc_dbg((dupenv + 1) * sizeof (char *), + _CRT_BLOCK, __FILE__, __LINE__ ); + memcpy((void*)*env, _environ, (dupenv + 1) * sizeof (char *)); + } + else { + } + + FreeEnvironmentStringsW(sysstr); + + /* MSVCRT will attempt to maintain the wide environment calls + * on _putenv(), which is bogus if we've passed a non-ascii + * string to _putenv(), since they use MultiByteToWideChar + * and breaking the implicit utf-8 assumption we've built. + * + * Reset _wenviron for good measure. + */ + if (_wenviron) { + apr_wchar_t **wenv = _wenviron; + _wenviron = NULL; + free(wenv); + } + + } +#endif + return rv; +} + +static int initialized = 0; + +/* Provide to win32/thread.c */ +extern DWORD tls_apr_thread; + +APR_DECLARE(apr_status_t) apr_initialize(void) +{ + apr_pool_t *pool; + apr_status_t status; + int iVersionRequested; + WSADATA wsaData; + int err; + apr_oslevel_e osver; + + if (initialized++) { + return APR_SUCCESS; + } + + /* Initialize apr_os_level global */ + if (apr_get_oslevel(&osver) != APR_SUCCESS) { + return APR_EEXIST; + } + + tls_apr_thread = TlsAlloc(); + if ((status = apr_pool_initialize()) != APR_SUCCESS) + return status; + + if (apr_pool_create(&pool, NULL) != APR_SUCCESS) { + return APR_ENOPOOL; + } + + apr_pool_tag(pool, "apr_initialize"); + + iVersionRequested = MAKEWORD(WSAHighByte, WSALowByte); + err = WSAStartup((WORD) iVersionRequested, &wsaData); + if (err) { + return err; + } + if (LOBYTE(wsaData.wVersion) != WSAHighByte || + HIBYTE(wsaData.wVersion) != WSALowByte) { + WSACleanup(); + return APR_EEXIST; + } + + apr_signal_init(pool); + + apr_threadproc_init(pool); + + return APR_SUCCESS; +} + +APR_DECLARE_NONSTD(void) apr_terminate(void) +{ + initialized--; + if (initialized) { + return; + } + apr_pool_terminate(); + + WSACleanup(); + + TlsFree(tls_apr_thread); +} + +APR_DECLARE(void) apr_terminate2(void) +{ + apr_terminate(); +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/misc/win32/utf8.c b/rubbos/app/httpd-2.0.64/srclib/apr/misc/win32/utf8.c new file mode 100644 index 00000000..b37dba44 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/misc/win32/utf8.c @@ -0,0 +1,254 @@ +/* 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. + */ + +#include "apr.h" +#include "apr_private.h" +#include "apr_errno.h" +#include "apr_arch_utf8.h" + +/* Implement the design principal specified by RFC 2718 2.2.5 + * Guidelines for new URL Schemes - within the APR. + * + * Since many architectures support unicode, and UCS2 is the most + * efficient storage used by those archictures, these functions + * exist to validate a UCS string. It is up to the operating system + * to determine the validitity of the string in the context of it's + * native language support. File systems that support filename + * characters of 0x80-0xff but have no support of Unicode will find + * this function useful only for validating the character sequences + * and rejecting poorly encoded strings, if RFC 2718 2.2.5 naming is + * desired. + * + * from RFC 2279 UTF-8, a transformation format of ISO 10646 + * + * UCS-4 range (hex.) UTF-8 octet sequence (binary) + * 1:2 0000 0000-0000 007F 0xxxxxxx + * 2:2 0000 0080-0000 07FF 110XXXXx 10xxxxxx + * 3:2 0000 0800-0000 FFFF 1110XXXX 10Xxxxxx 10xxxxxx + * 4:4 0001 0000-001F FFFF 11110zXX 10XXxxxx 10xxxxxx 10xxxxxx + * inv 0020 0000-03FF FFFF 111110XX 10XXXxxx 10xxxxxx 10xxxxxx 10xxxxxx + * inv 0400 0000-7FFF FFFF 1111110X 10XXXXxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx + * + * One of the X values must be one for the encoding length to be legit. + * Neither the z bit, nor the final two forms, are used for ucs-2 + * + * "Pairs of UCS-2 values between D800 and DFFF (surrogate pairs in + * Unicode parlance), being actually UCS-4 characters transformed + * through UTF-16, need special treatment: the UTF-16 transformation + * must be undone, yielding a UCS-4 character that is then transformed + * as above." + * + * from RFC2781 UTF-16: the compressed ISO 10646 encoding bitmask + * + * U' = U - 0x10000 + * U' = 000000000000yyyyyyyyyyxxxxxxxxxx + * W1 = 110110yyyyyyyyyy + * W2 = 110111xxxxxxxxxx + * + * apr_conv_utf8_to_ucs2 out bytes:sizeof(in) * 1 <= Req <= sizeof(in) * 2 + * + * apr_conv_ucs2_to_utf8 out words:sizeof(in) / 2 <= Req <= sizeof(in) * 3 / 2 + */ + +APR_DECLARE(apr_status_t) apr_conv_utf8_to_ucs2(const char *in, + apr_size_t *inbytes, + apr_wchar_t *out, + apr_size_t *outwords) +{ + apr_int64_t newch, mask; + apr_size_t expect, eating; + int ch; + + while (*inbytes && *outwords) + { + ch = (unsigned char)(*in++); + if (!(ch & 0200)) { + /* US-ASCII-7 plain text + */ + --*inbytes; + --*outwords; + *(out++) = ch; + } + else + { + if ((ch & 0300) != 0300) { + /* Multibyte Continuation is out of place + */ + return APR_EINVAL; + } + else + { + /* Multibyte Sequence Lead Character + * + * Compute the expected bytes while adjusting + * or lead byte and leading zeros mask. + */ + mask = 0340; + expect = 1; + while ((ch & mask) == mask) { + mask |= mask >> 1; + if (++expect > 3) /* (truly 5 for ucs-4) */ + return APR_EINVAL; + } + newch = ch & ~mask; + eating = expect + 1; + if (*inbytes <= expect) + return APR_INCOMPLETE; + /* Reject values of excessive leading 0 bits + * utf-8 _demands_ the shortest possible byte length + */ + if (expect == 1) { + if (!(newch & 0036)) + return APR_EINVAL; + } + else { + /* Reject values of excessive leading 0 bits + */ + if (!newch && !((unsigned char)*in & 0077 & (mask << 1))) + return APR_EINVAL; + if (expect == 2) { + /* Reject values D800-DFFF when not utf16 encoded + * (may not be an appropriate restriction for ucs-4) + */ + if (newch == 0015 && ((unsigned char)*in & 0040)) + return APR_EINVAL; + } + else if (expect == 3) { + /* Short circuit values > 110000 + */ + if (newch > 4) + return APR_EINVAL; + if (newch == 4 && ((unsigned char)*in & 0060)) + return APR_EINVAL; + } + } + /* Where the boolean (expect > 2) is true, we will need + * an extra word for the output. + */ + if (*outwords < (apr_size_t)(expect > 2) + 1) + break; /* buffer full */ + while (expect--) + { + /* Multibyte Continuation must be legal */ + if (((ch = (unsigned char)*(in++)) & 0300) != 0200) + return APR_EINVAL; + newch <<= 6; + newch |= (ch & 0077); + } + *inbytes -= eating; + /* newch is now a true ucs-4 character + * + * now we need to fold to ucs-2 + */ + if (newch < 0x10000) + { + --*outwords; + *(out++) = (apr_wchar_t) newch; + } + else + { + *outwords -= 2; + newch -= 0x10000; + *(out++) = (apr_wchar_t) (0xD800 | (newch >> 10)); + *(out++) = (apr_wchar_t) (0xDC00 | (newch & 0x03FF)); + } + } + } + } + /* Buffer full 'errors' aren't errors, the client must inspect both + * the inbytes and outwords values + */ + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_conv_ucs2_to_utf8(const apr_wchar_t *in, + apr_size_t *inwords, + char *out, + apr_size_t *outbytes) +{ + apr_int64_t newch, require; + apr_size_t need; + char *invout; + int ch; + + while (*inwords && *outbytes) + { + ch = (unsigned short)(*in++); + if (ch < 0x80) + { + --*inwords; + --*outbytes; + *(out++) = (unsigned char) ch; + } + else + { + if ((ch & 0xFC00) == 0xDC00) { + /* Invalid Leading ucs-2 Multiword Continuation Character + */ + return APR_EINVAL; + } + if ((ch & 0xFC00) == 0xD800) { + /* Leading ucs-2 Multiword Character + */ + if (*inwords < 2) { + /* Missing ucs-2 Multiword Continuation Character + */ + return APR_INCOMPLETE; + } + if (((unsigned short)(*in) & 0xFC00) != 0xDC00) { + /* Invalid ucs-2 Multiword Continuation Character + */ + return APR_EINVAL; + } + newch = (ch & 0x03FF) << 10 | ((unsigned short)(*in++) & 0x03FF); + newch += 0x10000; + } + else { + /* ucs-2 Single Word Character + */ + newch = ch; + } + /* Determine the absolute minimum utf-8 bytes required + */ + require = newch >> 11; + need = 1; + while (require) + require >>= 5, ++need; + if (need >= *outbytes) + break; /* Insufficient buffer */ + *inwords -= (need > 2) + 1; + *outbytes -= need + 1; + /* Compute the utf-8 characters in last to first order, + * calculating the lead character length bits along the way. + */ + ch = 0200; + out += need + 1; + invout = out; + while (need--) { + ch |= ch >> 1; + *(--invout) = (unsigned char)(0200 | (newch & 0077)); + newch >>= 6; + } + /* Compute the lead utf-8 character and move the dest offset + */ + *(--invout) = (unsigned char)(ch | newch); + } + } + /* Buffer full 'errors' aren't errors, the client must inspect both + * the inwords and outbytes values + */ + return APR_SUCCESS; +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/mmap/unix/.libs/common.o b/rubbos/app/httpd-2.0.64/srclib/apr/mmap/unix/.libs/common.o new file mode 100644 index 0000000000000000000000000000000000000000..6d1983faa57046e3b890c976e587b62f6408a451 GIT binary patch literal 6440 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 br6aS7K*uMwOx^jvhw|ce<&>4KwOju`9KD#e literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/mmap/unix/.libs/mmap.o b/rubbos/app/httpd-2.0.64/srclib/apr/mmap/unix/.libs/mmap.o new file mode 100644 index 0000000000000000000000000000000000000000..61b59ca301dccbad5e5e1ec03f9770c2c74390b7 GIT binary patch literal 14232 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 mmap->size) + return APR_EINVAL; + + (*addr) = (char *) mmap->mm + offset; + return APR_SUCCESS; +} + +#endif diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/mmap/unix/common.lo b/rubbos/app/httpd-2.0.64/srclib/apr/mmap/unix/common.lo new file mode 100644 index 00000000..6a593217 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/mmap/unix/common.lo @@ -0,0 +1,12 @@ +# common.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/common.o' + +# Name of the non-PIC object. +non_pic_object='common.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/mmap/unix/common.o b/rubbos/app/httpd-2.0.64/srclib/apr/mmap/unix/common.o new file mode 100644 index 0000000000000000000000000000000000000000..784af17082c7ca516136db53e90806a3d8239c3a GIT binary patch literal 6440 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 aky%Bc +#endif +#if APR_HAVE_STRING_H +#include +#endif +#if APR_HAVE_STDIO_H +#include +#endif +#ifdef HAVE_SYS_STAT_H +#include +#endif +#ifdef HAVE_SYS_MMAN_H +#include +#endif + +#if APR_HAS_MMAP || defined(BEOS) + +static apr_status_t mmap_cleanup(void *themmap) +{ + apr_mmap_t *mm = themmap; + apr_mmap_t *next = APR_RING_NEXT(mm,link); + int rv = 0; + + /* we no longer refer to the mmaped region */ + APR_RING_REMOVE(mm,link); + APR_RING_NEXT(mm,link) = NULL; + APR_RING_PREV(mm,link) = NULL; + + if (next != mm) { + /* more references exist, so we're done */ + return APR_SUCCESS; + } + +#ifdef BEOS + rv = delete_area(mm->area); +#else + rv = munmap(mm->mm, mm->size); +#endif + mm->mm = (void *)-1; + + if (rv == 0) { + return APR_SUCCESS; + } + return errno; +} + +APR_DECLARE(apr_status_t) apr_mmap_create(apr_mmap_t **new, + apr_file_t *file, apr_off_t offset, + apr_size_t size, apr_int32_t flag, + apr_pool_t *cont) +{ + void *mm; +#ifdef BEOS + area_id aid = -1; + uint32 pages = 0; +#else + apr_int32_t native_flags = 0; +#endif + + if (size == 0) + return APR_EINVAL; + + if (file == NULL || file->filedes == -1 || file->buffered) + return APR_EBADF; + (*new) = (apr_mmap_t *)apr_pcalloc(cont, sizeof(apr_mmap_t)); + +#ifdef BEOS + /* XXX: mmap shouldn't really change the seek offset */ + apr_file_seek(file, APR_SET, &offset); + + /* There seems to be some strange interactions that mean our area must + * be set as READ & WRITE or writev will fail! Go figure... + * So we ignore the value in flags and always ask for both READ and WRITE + */ + pages = (size + B_PAGE_SIZE -1) / B_PAGE_SIZE; + aid = create_area("apr_mmap", &mm , B_ANY_ADDRESS, pages * B_PAGE_SIZE, + B_NO_LOCK, B_WRITE_AREA|B_READ_AREA); + + if (aid < B_NO_ERROR) { + /* we failed to get an area we can use... */ + *new = NULL; + return APR_ENOMEM; + } + + if (aid >= B_NO_ERROR) + read(file->filedes, mm, size); + + (*new)->area = aid; +#else + + if (flag & APR_MMAP_WRITE) { + native_flags |= PROT_WRITE; + } + if (flag & APR_MMAP_READ) { + native_flags |= PROT_READ; + } + + mm = mmap(NULL, size, native_flags, MAP_SHARED, file->filedes, offset); + + if (mm == (void *)-1) { + /* we failed to get an mmap'd file... */ + *new = NULL; + return errno; + } +#endif + + (*new)->mm = mm; + (*new)->size = size; + (*new)->cntxt = cont; + APR_RING_ELEM_INIT(*new, link); + + /* register the cleanup... */ + apr_pool_cleanup_register((*new)->cntxt, (void*)(*new), mmap_cleanup, + apr_pool_cleanup_null); + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_mmap_dup(apr_mmap_t **new_mmap, + apr_mmap_t *old_mmap, + apr_pool_t *p, + int transfer_ownership) +{ + *new_mmap = (apr_mmap_t *)apr_pmemdup(p, old_mmap, sizeof(apr_mmap_t)); + (*new_mmap)->cntxt = p; + + APR_RING_INSERT_AFTER(old_mmap, *new_mmap, link); + + apr_pool_cleanup_register(p, *new_mmap, mmap_cleanup, + apr_pool_cleanup_null); + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_mmap_delete(apr_mmap_t *mm) +{ + return apr_pool_cleanup_run(mm->cntxt, mm, mmap_cleanup); +} + +#endif diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/mmap/unix/mmap.lo b/rubbos/app/httpd-2.0.64/srclib/apr/mmap/unix/mmap.lo new file mode 100644 index 00000000..57b83252 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/mmap/unix/mmap.lo @@ -0,0 +1,12 @@ +# mmap.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/mmap.o' + +# Name of the non-PIC object. +non_pic_object='mmap.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/mmap/unix/mmap.o b/rubbos/app/httpd-2.0.64/srclib/apr/mmap/unix/mmap.o new file mode 100644 index 0000000000000000000000000000000000000000..bb13fff76e5aedc66ac6e542e64e4ef1e4d1d220 GIT binary patch literal 14216 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 WrBWhI8s1C#ts2hj`7sUWdHioBNOWxg literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/mmap/win32/mmap.c b/rubbos/app/httpd-2.0.64/srclib/apr/mmap/win32/mmap.c new file mode 100644 index 00000000..c288e9fd --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/mmap/win32/mmap.c @@ -0,0 +1,163 @@ +/* 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. + */ + +#include "apr.h" +#include "apr_private.h" +#include "apr_general.h" +#include "apr_mmap.h" +#include "apr_errno.h" +#include "apr_arch_file_io.h" +#include "apr_portable.h" +#include "apr_strings.h" + +#if APR_HAS_MMAP + +static apr_status_t mmap_cleanup(void *themmap) +{ + apr_mmap_t *mm = themmap; + apr_mmap_t *next = APR_RING_NEXT(mm,link); + apr_status_t rv = 0; + + /* we no longer refer to the mmaped region */ + APR_RING_REMOVE(mm,link); + APR_RING_NEXT(mm,link) = NULL; + APR_RING_PREV(mm,link) = NULL; + + if (next != mm) { + /* more references exist, so we're done */ + return APR_SUCCESS; + } + + if (mm->mv) { + if (!UnmapViewOfFile(mm->mv)) + { + apr_status_t rv = apr_get_os_error(); + CloseHandle(mm->mhandle); + mm->mv = NULL; + mm->mhandle = NULL; + return rv; + } + mm->mv = NULL; + } + if (mm->mhandle) + { + if (!CloseHandle(mm->mhandle)) + { + apr_status_t rv = apr_get_os_error(); + CloseHandle(mm->mhandle); + mm->mhandle = NULL; + return rv; + } + mm->mhandle = NULL; + } + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_mmap_create(apr_mmap_t **new, apr_file_t *file, + apr_off_t offset, apr_size_t size, + apr_int32_t flag, apr_pool_t *cont) +{ + static DWORD memblock = 0; + DWORD fmaccess = 0; + DWORD mvaccess = 0; + DWORD offlo; + DWORD offhi; + + if (size == 0) + return APR_EINVAL; + + if (flag & APR_MMAP_WRITE) + fmaccess |= PAGE_READWRITE; + else if (flag & APR_MMAP_READ) + fmaccess |= PAGE_READONLY; + + if (flag & APR_MMAP_READ) + mvaccess |= FILE_MAP_READ; + if (flag & APR_MMAP_WRITE) + mvaccess |= FILE_MAP_WRITE; + + if (!file || !file->filehand || file->filehand == INVALID_HANDLE_VALUE + || file->buffered) + return APR_EBADF; + + if (!memblock) + { + SYSTEM_INFO si; + GetSystemInfo(&si); + memblock = si.dwAllocationGranularity; + } + + *new = apr_pcalloc(cont, sizeof(apr_mmap_t)); + (*new)->pstart = (offset / memblock) * memblock; + (*new)->poffset = offset - (*new)->pstart; + (*new)->psize = (apr_size_t)((*new)->poffset) + size; + /* The size of the CreateFileMapping object is the current size + * of the size of the mmap object (e.g. file size), not the size + * of the mapped region! + */ + + (*new)->mhandle = CreateFileMapping(file->filehand, NULL, fmaccess, + 0, 0, NULL); + if (!(*new)->mhandle || (*new)->mhandle == INVALID_HANDLE_VALUE) + { + *new = NULL; + return apr_get_os_error(); + } + + offlo = (DWORD)(*new)->pstart; + offhi = (DWORD)((*new)->pstart >> 32); + (*new)->mv = MapViewOfFile((*new)->mhandle, mvaccess, offhi, + offlo, (*new)->psize); + if (!(*new)->mv) + { + apr_status_t rv = apr_get_os_error(); + CloseHandle((*new)->mhandle); + *new = NULL; + return rv; + } + + (*new)->mm = (char*)((*new)->mv) + (*new)->poffset; + (*new)->size = size; + (*new)->cntxt = cont; + APR_RING_ELEM_INIT(*new, link); + + /* register the cleanup... */ + apr_pool_cleanup_register((*new)->cntxt, (void*)(*new), mmap_cleanup, + apr_pool_cleanup_null); + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_mmap_dup(apr_mmap_t **new_mmap, + apr_mmap_t *old_mmap, + apr_pool_t *p, + int transfer_ownership) +{ + *new_mmap = (apr_mmap_t *)apr_pmemdup(p, old_mmap, sizeof(apr_mmap_t)); + (*new_mmap)->cntxt = p; + + APR_RING_INSERT_AFTER(old_mmap, *new_mmap, link); + + apr_pool_cleanup_register(p, *new_mmap, mmap_cleanup, + apr_pool_cleanup_null); + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_mmap_delete(apr_mmap_t *mm) +{ + return apr_pool_cleanup_run(mm->cntxt, mm, mmap_cleanup); +} + +#endif diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/network_io/beos/Makefile.in b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/beos/Makefile.in new file mode 100644 index 00000000..b2c93fbb --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/beos/Makefile.in @@ -0,0 +1,14 @@ +srcdir = @srcdir@ +VPATH = @srcdir@ + +TARGETS = sendrecv.lo socketcommon.lo + +# bring in rules.mk for standard functionality +@INCLUDE_RULES@ + +INCDIR=../../include +OSDIR=$(INCDIR)/arch/@OSDIR@ +DEFOSDIR=$(INCDIR)/arch/@DEFAULT_OSDIR@ +INCLUDES=-I$(INCDIR) -I$(OSDIR) -I$(DEFOSDIR) + +# DO NOT REMOVE diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/network_io/beos/sendrecv.c b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/beos/sendrecv.c new file mode 100644 index 00000000..a9e7d443 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/beos/sendrecv.c @@ -0,0 +1,252 @@ +/* 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. + */ + +#include "apr_private.h" +#if BEOS_BONE /* BONE uses the unix code - woohoo */ +#include "../unix/sendrecv.c" +#else +#include "apr_arch_networkio.h" +#include "apr_time.h" + +apr_status_t apr_wait_for_io_or_timeout(apr_socket_t *sock, int for_read) +{ + struct timeval tv, *tvptr; + fd_set fdset; + int srv; + + do { + FD_ZERO(&fdset); + FD_SET(sock->socketdes, &fdset); + if (sock->timeout < 0) { + tvptr = NULL; + } + else { + tv.tv_sec = sock->timeout / APR_USEC_PER_SEC; + tv.tv_usec = sock->timeout % APR_USEC_PER_SEC; + tvptr = &tv; + } + srv = select(sock->socketdes + 1, + for_read ? &fdset : NULL, + for_read ? NULL : &fdset, + NULL, + tvptr); + /* TODO - timeout should be smaller on repeats of this loop */ + } while (srv == -1 && errno == EINTR); + + if (srv == 0) { + return APR_TIMEUP; + } + else if (srv < 0) { + return errno; + } + return APR_SUCCESS; +} + +#define SEND_WAIT APR_USEC_PER_SEC / 10 + +APR_DECLARE(apr_status_t) apr_socket_send(apr_socket_t *sock, const char *buf, + apr_size_t *len) +{ + apr_ssize_t rv; + + do { + rv = send(sock->socketdes, buf, (*len), 0); + } while (rv == -1 && errno == EINTR); + + if (rv == -1 && errno == EWOULDBLOCK && sock->timeout > 0) { + apr_int32_t snooze_val = SEND_WAIT; + apr_int32_t zzz = 0; + + do { + rv = send(sock->socketdes, buf, (*len), 0); + if (rv == -1 && errno == EWOULDBLOCK){ + apr_sleep (snooze_val); + zzz += snooze_val; + snooze_val += SEND_WAIT; + /* have we passed our timeout value */ + if (zzz > (sock->timeout * APR_USEC_PER_SEC)) + break; + } + } while (rv == -1 && (errno == EINTR || errno == EWOULDBLOCK)); + } + if (rv == -1) { + *len = 0; + return errno; + } + (*len) = rv; + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_socket_recv(apr_socket_t *sock, char *buf, + apr_size_t *len) +{ + apr_ssize_t rv; + + do { + rv = recv(sock->socketdes, buf, (*len), 0); + } while (rv == -1 && errno == EINTR); + + if (rv == -1 && errno == EWOULDBLOCK && sock->timeout > 0) { + apr_status_t arv = apr_wait_for_io_or_timeout(sock, 1); + if (arv != APR_SUCCESS) { + *len = 0; + return arv; + } + else { + do { + rv = recv(sock->socketdes, buf, (*len), 0); + } while (rv == -1 && errno == EINTR); + } + } + if (rv == -1) { + (*len) = 0; + return errno; + } + (*len) = rv; + if (rv == 0) + return APR_EOF; + return APR_SUCCESS; +} + +/* BeOS doesn't have writev for sockets so we use the following instead... + */ +APR_DECLARE(apr_status_t) apr_socket_sendv(apr_socket_t * sock, + const struct iovec *vec, + apr_int32_t nvec, apr_size_t *len) +{ + *len = vec[0].iov_len; + return apr_socket_send(sock, vec[0].iov_base, len); +} + +APR_DECLARE(apr_status_t) apr_socket_sendto(apr_socket_t *sock, + apr_sockaddr_t *where, + apr_int32_t flags, const char *buf, + apr_size_t *len) +{ + apr_ssize_t rv; + + do { + rv = sendto(sock->socketdes, buf, (*len), flags, + (const struct sockaddr*)&where->sa, + where->salen); + } while (rv == -1 && errno == EINTR); + + if (rv == -1 && (errno == EAGAIN || errno == EWOULDBLOCK) + && sock->timeout != 0) { + apr_status_t arv = apr_wait_for_io_or_timeout(sock, 0); + if (arv != APR_SUCCESS) { + *len = 0; + return arv; + } else { + do { + rv = sendto(sock->socketdes, buf, (*len), flags, + (const struct sockaddr*)&where->sa, + where->salen); + } while (rv == -1 && errno == EINTR); + } + } + if (rv == -1) { + *len = 0; + return errno; + } + *len = rv; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_socket_recvfrom(apr_sockaddr_t *from, + apr_socket_t *sock, + apr_int32_t flags, char *buf, + apr_size_t *len) +{ + apr_ssize_t rv; + + if (from == NULL){ + return APR_ENOMEM; + /* Not sure if this is correct. Maybe we should just allocate + the memory?? + */ + } + + do { + rv = recvfrom(sock->socketdes, buf, (*len), flags, + (struct sockaddr*)&from->sa, &from->salen); + } while (rv == -1 && errno == EINTR); + + if (rv == -1 && (errno == EAGAIN || errno == EWOULDBLOCK) && + sock->timeout != 0) { + apr_status_t arv = apr_wait_for_io_or_timeout(sock, 1); + if (arv != APR_SUCCESS) { + *len = 0; + return arv; + } else { + do { + rv = recvfrom(sock->socketdes, buf, (*len), flags, + (struct sockaddr*)&from->sa, &from->salen); + } while (rv == -1 && errno == EINTR); + } + } + if (rv == -1) { + (*len) = 0; + return errno; + } + + (*len) = rv; + if (rv == 0) + return APR_EOF; + + return APR_SUCCESS; +} + +/* deprecated */ +APR_DECLARE(apr_status_t) apr_send(apr_socket_t *sock, const char *buf, + apr_size_t *len) +{ + return apr_socket_send(sock, buf, len); +} + +/* deprecated */ +APR_DECLARE(apr_status_t) apr_sendv(apr_socket_t * sock, + const struct iovec *vec, + apr_int32_t nvec, apr_size_t *len) +{ + return apr_socket_sendv(sock, vec, nvec, len); +} + +/* deprecated */ +APR_DECLARE(apr_status_t) apr_sendto(apr_socket_t *sock, apr_sockaddr_t *where, + apr_int32_t flags, const char *buf, + apr_size_t *len) +{ + return apr_socket_sendto(sock, where, flags, buf, len); +} + +/* deprecated */ +APR_DECLARE(apr_status_t) apr_recvfrom(apr_sockaddr_t *from, apr_socket_t *sock, + apr_int32_t flags, char *buf, + apr_size_t *len) +{ + return apr_socket_recvfrom(from, sock, flags, buf, len); +} + +/* deprecated */ +APR_DECLARE(apr_status_t) apr_recv(apr_socket_t *sock, char *buf, + apr_size_t *len) +{ + return apr_socket_recv(sock, buf, len); +} + +#endif diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/network_io/beos/socketcommon.c b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/beos/socketcommon.c new file mode 100644 index 00000000..cdadc856 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/beos/socketcommon.c @@ -0,0 +1,5 @@ +#include "../unix/inet_ntop.c" +#include "../unix/inet_pton.c" +#include "../unix/sockets.c" +#include "../unix/sockaddr.c" +#include "../unix/sockopt.c" diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/network_io/os2/Makefile.in b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/os2/Makefile.in new file mode 100644 index 00000000..04b8e32d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/os2/Makefile.in @@ -0,0 +1,22 @@ +srcdir = @srcdir@ +VPATH = @srcdir@ + +TARGETS = \ + sendrecv.lo \ + sendrecv_udp.lo \ + sockets.lo \ + sockopt.lo \ + sockaddr.lo \ + inet_ntop.lo \ + inet_pton.lo \ + os2calls.lo + +# bring in rules.mk for standard functionality +@INCLUDE_RULES@ + +INCDIR=../../include +OSDIR=$(INCDIR)/arch/@OSDIR@ +DEFOSDIR=$(INCDIR)/arch/@DEFAULT_OSDIR@ +INCLUDES=-I$(INCDIR) -I$(OSDIR) -I$(DEFOSDIR) + +# DO NOT REMOVE diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/network_io/os2/inet_ntop.c b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/os2/inet_ntop.c new file mode 100644 index 00000000..f1f79d49 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/os2/inet_ntop.c @@ -0,0 +1 @@ +#include "../unix/inet_ntop.c" diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/network_io/os2/inet_pton.c b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/os2/inet_pton.c new file mode 100644 index 00000000..dbd3ac45 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/os2/inet_pton.c @@ -0,0 +1 @@ +#include "../unix/inet_pton.c" diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/network_io/os2/os2calls.c b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/os2/os2calls.c new file mode 100644 index 00000000..6bf1fcd0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/os2/os2calls.c @@ -0,0 +1,132 @@ +/* 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. + */ + +#include "apr_arch_networkio.h" +#include "apr_network_io.h" +#include "apr_portable.h" +#include "apr_general.h" +#include "apr_lib.h" + +static int os2_socket_init(int, int ,int); + +int (*apr_os2_socket)(int, int, int) = os2_socket_init; +int (*apr_os2_select)(int *, int, int, int, long) = NULL; +int (*apr_os2_sock_errno)() = NULL; +int (*apr_os2_accept)(int, struct sockaddr *, int *) = NULL; +int (*apr_os2_bind)(int, struct sockaddr *, int) = NULL; +int (*apr_os2_connect)(int, struct sockaddr *, int) = NULL; +int (*apr_os2_getpeername)(int, struct sockaddr *, int *) = NULL; +int (*apr_os2_getsockname)(int, struct sockaddr *, int *) = NULL; +int (*apr_os2_getsockopt)(int, int, int, char *, int *) = NULL; +int (*apr_os2_ioctl)(int, int, caddr_t, int) = NULL; +int (*apr_os2_listen)(int, int) = NULL; +int (*apr_os2_recv)(int, char *, int, int) = NULL; +int (*apr_os2_send)(int, const char *, int, int) = NULL; +int (*apr_os2_setsockopt)(int, int, int, char *, int) = NULL; +int (*apr_os2_shutdown)(int, int) = NULL; +int (*apr_os2_soclose)(int) = NULL; +int (*apr_os2_writev)(int, struct iovec *, int) = NULL; +int (*apr_os2_sendto)(int, const char *, int, int, const struct sockaddr *, int); +int (*apr_os2_recvfrom)(int, char *, int, int, struct sockaddr *, int *); + +static HMODULE hSO32DLL; + +static int os2_fn_link() +{ + DosEnterCritSec(); /* Stop two threads doing this at the same time */ + + if (apr_os2_socket == os2_socket_init) { + ULONG rc; + char errorstr[200]; + + rc = DosLoadModule(errorstr, sizeof(errorstr), "SO32DLL", &hSO32DLL); + + if (rc) + return APR_OS2_STATUS(rc); + + rc = DosQueryProcAddr(hSO32DLL, 0, "SOCKET", &apr_os2_socket); + + if (!rc) + rc = DosQueryProcAddr(hSO32DLL, 0, "SELECT", &apr_os2_select); + + if (!rc) + rc = DosQueryProcAddr(hSO32DLL, 0, "SOCK_ERRNO", &apr_os2_sock_errno); + + if (!rc) + rc = DosQueryProcAddr(hSO32DLL, 0, "ACCEPT", &apr_os2_accept); + + if (!rc) + rc = DosQueryProcAddr(hSO32DLL, 0, "BIND", &apr_os2_bind); + + if (!rc) + rc = DosQueryProcAddr(hSO32DLL, 0, "CONNECT", &apr_os2_connect); + + if (!rc) + rc = DosQueryProcAddr(hSO32DLL, 0, "GETPEERNAME", &apr_os2_getpeername); + + if (!rc) + rc = DosQueryProcAddr(hSO32DLL, 0, "GETSOCKNAME", &apr_os2_getsockname); + + if (!rc) + rc = DosQueryProcAddr(hSO32DLL, 0, "GETSOCKOPT", &apr_os2_getsockopt); + + if (!rc) + rc = DosQueryProcAddr(hSO32DLL, 0, "IOCTL", &apr_os2_ioctl); + + if (!rc) + rc = DosQueryProcAddr(hSO32DLL, 0, "LISTEN", &apr_os2_listen); + + if (!rc) + rc = DosQueryProcAddr(hSO32DLL, 0, "RECV", &apr_os2_recv); + + if (!rc) + rc = DosQueryProcAddr(hSO32DLL, 0, "SEND", &apr_os2_send); + + if (!rc) + rc = DosQueryProcAddr(hSO32DLL, 0, "SETSOCKOPT", &apr_os2_setsockopt); + + if (!rc) + rc = DosQueryProcAddr(hSO32DLL, 0, "SHUTDOWN", &apr_os2_shutdown); + + if (!rc) + rc = DosQueryProcAddr(hSO32DLL, 0, "SOCLOSE", &apr_os2_soclose); + + if (!rc) + rc = DosQueryProcAddr(hSO32DLL, 0, "WRITEV", &apr_os2_writev); + + if (!rc) + rc = DosQueryProcAddr(hSO32DLL, 0, "SENDTO", &apr_os2_sendto); + + if (!rc) + rc = DosQueryProcAddr(hSO32DLL, 0, "RECVFROM", &apr_os2_recvfrom); + + if (rc) + return APR_OS2_STATUS(rc); + } + + DosExitCritSec(); + return APR_SUCCESS; +} + + + +static int os2_socket_init(int domain, int type, int protocol) +{ + int rc = os2_fn_link(); + if (rc == APR_SUCCESS) + return apr_os2_socket(domain, type, protocol); + return rc; +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/network_io/os2/sendrecv.c b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/os2/sendrecv.c new file mode 100644 index 00000000..73b12c2b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/os2/sendrecv.c @@ -0,0 +1,177 @@ +/* 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. + */ + +#include "apr_arch_networkio.h" +#include "apr_errno.h" +#include "apr_general.h" +#include "apr_network_io.h" +#include "apr_lib.h" +#include + +APR_DECLARE(apr_status_t) apr_socket_send(apr_socket_t *sock, const char *buf, + apr_size_t *len) +{ + apr_ssize_t rv; + int fds, err = 0; + + if (*len > 65536) { + *len = 65536; + } + + do { + if (!sock->nonblock || err == SOCEWOULDBLOCK) { + fds = sock->socketdes; + rv = select(&fds, 0, 1, 0, sock->timeout >= 0 ? sock->timeout/1000 : -1); + + if (rv != 1) { + *len = 0; + err = sock_errno(); + + if (rv == 0) + return APR_TIMEUP; + + if (err == SOCEINTR) + continue; + + return APR_OS2_STATUS(err); + } + } + + rv = send(sock->socketdes, buf, (*len), 0); + err = rv < 0 ? sock_errno() : 0; + } while (err == SOCEINTR || err == SOCEWOULDBLOCK); + + if (err) { + *len = 0; + return APR_OS2_STATUS(err); + } + + (*len) = rv; + return APR_SUCCESS; +} + + + +APR_DECLARE(apr_status_t) apr_socket_recv(apr_socket_t *sock, char *buf, + apr_size_t *len) +{ + apr_ssize_t rv; + int fds, err = 0; + + do { + if (!sock->nonblock || (err == SOCEWOULDBLOCK && sock->timeout != 0)) { + fds = sock->socketdes; + rv = select(&fds, 1, 0, 0, sock->timeout >= 0 ? sock->timeout/1000 : -1); + + if (rv != 1) { + *len = 0; + err = sock_errno(); + + if (rv == 0) + return APR_TIMEUP; + + if (err == SOCEINTR) + continue; + + return APR_OS2_STATUS(err); + } + } + + rv = recv(sock->socketdes, buf, (*len), 0); + err = rv < 0 ? sock_errno() : 0; + } while (err == SOCEINTR || (err == SOCEWOULDBLOCK && sock->timeout != 0)); + + if (err) { + *len = 0; + return APR_OS2_STATUS(err); + } + + (*len) = rv; + return rv == 0 ? APR_EOF : APR_SUCCESS; +} + + + +APR_DECLARE(apr_status_t) apr_socket_sendv(apr_socket_t *sock, + const struct iovec *vec, + apr_int32_t nvec, apr_size_t *len) +{ + apr_status_t rv; + struct iovec *tmpvec; + int fds, err = 0; + int nv_tosend, total = 0; + + /* Make sure writev() only gets fed 64k at a time */ + for ( nv_tosend = 0; nv_tosend < nvec && total + vec[nv_tosend].iov_len < 65536; nv_tosend++ ) { + total += vec[nv_tosend].iov_len; + } + + tmpvec = alloca(sizeof(struct iovec) * nv_tosend); + memcpy(tmpvec, vec, sizeof(struct iovec) * nv_tosend); + + do { + if (!sock->nonblock || err == SOCEWOULDBLOCK) { + fds = sock->socketdes; + rv = select(&fds, 0, 1, 0, sock->timeout >= 0 ? sock->timeout/1000 : -1); + + if (rv != 1) { + *len = 0; + err = sock_errno(); + + if (rv == 0) + return APR_TIMEUP; + + if (err == SOCEINTR) + continue; + + return APR_OS2_STATUS(err); + } + } + + rv = writev(sock->socketdes, tmpvec, nv_tosend); + err = rv < 0 ? sock_errno() : 0; + } while (err == SOCEINTR || err == SOCEWOULDBLOCK); + + if (err) { + *len = 0; + return APR_OS2_STATUS(err); + } + + *len = rv; + return APR_SUCCESS; +} + +/* deprecated */ +APR_DECLARE(apr_status_t) apr_send(apr_socket_t *sock, const char *buf, + apr_size_t *len) +{ + return apr_socket_send(sock, buf, len); +} + +/* deprecated */ +APR_DECLARE(apr_status_t) apr_sendv(apr_socket_t *sock, + const struct iovec *vec, + apr_int32_t nvec, apr_size_t *len) +{ + return apr_socket_sendv(sock, vec, nvec, len); +} + +/* deprecated */ +APR_DECLARE(apr_status_t) apr_recv(apr_socket_t *sock, char *buf, + apr_size_t *len) +{ + return apr_socket_recv(sock, buf, len); +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/network_io/os2/sendrecv_udp.c b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/os2/sendrecv_udp.c new file mode 100644 index 00000000..0e23d11e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/os2/sendrecv_udp.c @@ -0,0 +1,122 @@ +/* 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. + */ + +#include "apr_arch_networkio.h" +#include "apr_errno.h" +#include "apr_general.h" +#include "apr_network_io.h" +#include "apr_support.h" +#include "apr_lib.h" +#include + + +APR_DECLARE(apr_status_t) apr_socket_sendto(apr_socket_t *sock, + apr_sockaddr_t *where, + apr_int32_t flags, const char *buf, + apr_size_t *len) +{ + apr_ssize_t rv; + int serrno; + + do { + rv = sendto(sock->socketdes, buf, (*len), flags, + (struct sockaddr*)&where->sa, + where->salen); + } while (rv == -1 && (serrno = sock_errno()) == EINTR); + + if (rv == -1 && serrno == SOCEWOULDBLOCK && sock->timeout != 0) { + apr_status_t arv = apr_wait_for_io_or_timeout(NULL, sock, 0); + + if (arv != APR_SUCCESS) { + *len = 0; + return arv; + } else { + do { + rv = sendto(sock->socketdes, buf, *len, flags, + (const struct sockaddr*)&where->sa, + where->salen); + } while (rv == -1 && (serrno = sock_errno()) == SOCEINTR); + } + } + + if (rv == -1) { + *len = 0; + return APR_FROM_OS_ERROR(serrno); + } + + *len = rv; + return APR_SUCCESS; +} + + + +APR_DECLARE(apr_status_t) apr_socket_recvfrom(apr_sockaddr_t *from, + apr_socket_t *sock, + apr_int32_t flags, char *buf, + apr_size_t *len) +{ + apr_ssize_t rv; + int serrno; + + do { + rv = recvfrom(sock->socketdes, buf, (*len), flags, + (struct sockaddr*)&from->sa, &from->salen); + } while (rv == -1 && (serrno = sock_errno()) == EINTR); + + if (rv == -1 && serrno == SOCEWOULDBLOCK && sock->timeout != 0) { + apr_status_t arv = apr_wait_for_io_or_timeout(NULL, sock, 1); + + if (arv != APR_SUCCESS) { + *len = 0; + return arv; + } else { + do { + rv = recvfrom(sock->socketdes, buf, *len, flags, + (struct sockaddr*)&from->sa, &from->salen); + } while (rv == -1 && (serrno = sock_errno()) == EINTR); + } + } + + if (rv == -1) { + (*len) = 0; + return APR_FROM_OS_ERROR(serrno); + } + + (*len) = rv; + + if (rv == 0 && sock->type == SOCK_STREAM) + return APR_EOF; + + return APR_SUCCESS; +} + +/* deprecated */ +APR_DECLARE(apr_status_t) apr_sendto(apr_socket_t *sock, apr_sockaddr_t *where, + apr_int32_t flags, const char *buf, + apr_size_t *len) +{ + return apr_socket_sendto(sock, where, flags, buf, len); +} + + + +APR_DECLARE(apr_status_t) apr_recvfrom(apr_sockaddr_t *from, + apr_socket_t *sock, + apr_int32_t flags, char *buf, + apr_size_t *len) +{ + return apr_socket_recvfrom(from, sock, flags, buf, len); +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/network_io/os2/sockaddr.c b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/os2/sockaddr.c new file mode 100644 index 00000000..2afe4b77 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/os2/sockaddr.c @@ -0,0 +1 @@ +#include "../unix/sockaddr.c" diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/network_io/os2/sockets.c b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/os2/sockets.c new file mode 100644 index 00000000..38196642 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/os2/sockets.c @@ -0,0 +1,343 @@ +/* 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. + */ + +#include "apr_arch_networkio.h" +#include "apr_arch_inherit.h" +#include "apr_network_io.h" +#include "apr_general.h" +#include "apr_portable.h" +#include "apr_lib.h" +#include "apr_strings.h" +#include +#include +#include +#include +#include +#include +#include +#include "apr_arch_os2calls.h" + +static apr_status_t socket_cleanup(void *sock) +{ + apr_socket_t *thesocket = sock; + + if (thesocket->socketdes < 0) { + return APR_EINVALSOCK; + } + + if (soclose(thesocket->socketdes) == 0) { + thesocket->socketdes = -1; + return APR_SUCCESS; + } + else { + return APR_OS2_STATUS(sock_errno()); + } +} + +static void set_socket_vars(apr_socket_t *sock, int family, int type, int protocol) +{ + sock->type = type; + sock->protocol = protocol; + apr_sockaddr_vars_set(sock->local_addr, family, 0); + apr_sockaddr_vars_set(sock->remote_addr, family, 0); +} + +static void alloc_socket(apr_socket_t **new, apr_pool_t *p) +{ + *new = (apr_socket_t *)apr_pcalloc(p, sizeof(apr_socket_t)); + (*new)->cntxt = p; + (*new)->local_addr = (apr_sockaddr_t *)apr_pcalloc((*new)->cntxt, + sizeof(apr_sockaddr_t)); + (*new)->local_addr->pool = p; + (*new)->remote_addr = (apr_sockaddr_t *)apr_pcalloc((*new)->cntxt, + sizeof(apr_sockaddr_t)); + (*new)->remote_addr->pool = p; +} + +APR_DECLARE(apr_status_t) apr_socket_protocol_get(apr_socket_t *sock, int *protocol) +{ + *protocol = sock->protocol; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_socket_create_ex(apr_socket_t **new, int family, int type, + int protocol, apr_pool_t *cont) +{ + int downgrade = (family == AF_UNSPEC); + + if (family == AF_UNSPEC) { +#if APR_HAVE_IPV6 + family = AF_INET6; +#else + family = AF_INET; +#endif + } + + alloc_socket(new, cont); + + (*new)->socketdes = socket(family, type, protocol); +#if APR_HAVE_IPV6 + if ((*new)->socketdes < 0 && downgrade) { + family = AF_INET; + (*new)->socketdes = socket(family, type, protocol); + } +#endif + + if ((*new)->socketdes < 0) { + return APR_OS2_STATUS(sock_errno()); + } + set_socket_vars(*new, family, type, protocol); + + (*new)->timeout = -1; + (*new)->nonblock = FALSE; + apr_pool_cleanup_register((*new)->cntxt, (void *)(*new), + socket_cleanup, apr_pool_cleanup_null); + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_socket_create(apr_socket_t **new, int family, int type, + apr_pool_t *cont) +{ + return apr_socket_create_ex(new, family, type, 0, cont); +} + +APR_DECLARE(apr_status_t) apr_socket_shutdown(apr_socket_t *thesocket, + apr_shutdown_how_e how) +{ + if (shutdown(thesocket->socketdes, how) == 0) { + return APR_SUCCESS; + } + else { + return APR_OS2_STATUS(sock_errno()); + } +} + +APR_DECLARE(apr_status_t) apr_socket_close(apr_socket_t *thesocket) +{ + apr_pool_cleanup_kill(thesocket->cntxt, thesocket, socket_cleanup); + return socket_cleanup(thesocket); +} + +APR_DECLARE(apr_status_t) apr_socket_bind(apr_socket_t *sock, + apr_sockaddr_t *sa) +{ + if (bind(sock->socketdes, + (struct sockaddr *)&sa->sa, + sa->salen) == -1) + return APR_OS2_STATUS(sock_errno()); + else { + sock->local_addr = sa; + /* XXX IPv6 - this assumes sin_port and sin6_port at same offset */ + if (sock->local_addr->sa.sin.sin_port == 0) { /* no need for ntohs() when comparing w/ 0 */ + sock->local_port_unknown = 1; /* kernel got us an ephemeral port */ + } + return APR_SUCCESS; + } +} + +APR_DECLARE(apr_status_t) apr_socket_listen(apr_socket_t *sock, + apr_int32_t backlog) +{ + if (listen(sock->socketdes, backlog) == -1) + return APR_OS2_STATUS(sock_errno()); + else + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_socket_accept(apr_socket_t **new, + apr_socket_t *sock, + apr_pool_t *connection_context) +{ + alloc_socket(new, connection_context); + set_socket_vars(*new, sock->local_addr->sa.sin.sin_family, SOCK_STREAM, sock->protocol); + + (*new)->timeout = -1; + (*new)->nonblock = FALSE; + + (*new)->socketdes = accept(sock->socketdes, + (struct sockaddr *)&(*new)->remote_addr->sa, + &(*new)->remote_addr->salen); + + if ((*new)->socketdes < 0) { + return APR_OS2_STATUS(sock_errno()); + } + + *(*new)->local_addr = *sock->local_addr; + (*new)->local_addr->pool = connection_context; + (*new)->remote_addr->port = ntohs((*new)->remote_addr->sa.sin.sin_port); + + /* fix up any pointers which are no longer valid */ + if (sock->local_addr->sa.sin.sin_family == AF_INET) { + (*new)->local_addr->ipaddr_ptr = &(*new)->local_addr->sa.sin.sin_addr; + } + + apr_pool_cleanup_register((*new)->cntxt, (void *)(*new), + socket_cleanup, apr_pool_cleanup_null); + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_socket_connect(apr_socket_t *sock, + apr_sockaddr_t *sa) +{ + if ((connect(sock->socketdes, (struct sockaddr *)&sa->sa.sin, + sa->salen) < 0) && + (sock_errno() != SOCEINPROGRESS)) { + return APR_OS2_STATUS(sock_errno()); + } + else { + int namelen = sizeof(sock->local_addr->sa.sin); + getsockname(sock->socketdes, (struct sockaddr *)&sock->local_addr->sa.sin, + &namelen); + sock->remote_addr = sa; + return APR_SUCCESS; + } +} + + +APR_DECLARE(apr_status_t) apr_socket_data_get(void **data, const char *key, + apr_socket_t *sock) +{ + sock_userdata_t *cur = sock->userdata; + + *data = NULL; + + while (cur) { + if (!strcmp(cur->key, key)) { + *data = cur->data; + break; + } + cur = cur->next; + } + + return APR_SUCCESS; +} + + + +APR_DECLARE(apr_status_t) apr_socket_data_set(apr_socket_t *sock, void *data, const char *key, + apr_status_t (*cleanup) (void *)) +{ + sock_userdata_t *new = apr_palloc(sock->cntxt, sizeof(sock_userdata_t)); + + new->key = apr_pstrdup(sock->cntxt, key); + new->data = data; + new->next = sock->userdata; + sock->userdata = new; + + if (cleanup) { + apr_pool_cleanup_register(sock->cntxt, data, cleanup, cleanup); + } + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_os_sock_get(apr_os_sock_t *thesock, apr_socket_t *sock) +{ + *thesock = sock->socketdes; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_os_sock_make(apr_socket_t **apr_sock, + apr_os_sock_info_t *os_sock_info, + apr_pool_t *cont) +{ + alloc_socket(apr_sock, cont); +#ifdef APR_ENABLE_FOR_1_0 /* no protocol field yet */ + set_socket_vars(*apr_sock, os_sock_info->family, os_sock_info->type, os_sock_info->protocol); +#else + set_socket_vars(*apr_sock, os_sock_info->family, os_sock_info->type, 0); +#endif + (*apr_sock)->timeout = -1; + (*apr_sock)->socketdes = *os_sock_info->os_sock; + if (os_sock_info->local) { + memcpy(&(*apr_sock)->local_addr->sa.sin, + os_sock_info->local, + (*apr_sock)->local_addr->salen); + /* XXX IPv6 - this assumes sin_port and sin6_port at same offset */ + (*apr_sock)->local_addr->port = ntohs((*apr_sock)->local_addr->sa.sin.sin_port); + } + else { + (*apr_sock)->local_port_unknown = (*apr_sock)->local_interface_unknown = 1; + } + if (os_sock_info->remote) { + memcpy(&(*apr_sock)->remote_addr->sa.sin, + os_sock_info->remote, + (*apr_sock)->remote_addr->salen); + /* XXX IPv6 - this assumes sin_port and sin6_port at same offset */ + (*apr_sock)->remote_addr->port = ntohs((*apr_sock)->remote_addr->sa.sin.sin_port); + } + else { + (*apr_sock)->remote_addr_unknown = 1; + } + + apr_pool_cleanup_register((*apr_sock)->cntxt, (void *)(*apr_sock), + socket_cleanup, apr_pool_cleanup_null); + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_os_sock_put(apr_socket_t **sock, apr_os_sock_t *thesock, apr_pool_t *cont) +{ + if (cont == NULL) { + return APR_ENOPOOL; + } + if ((*sock) == NULL) { + alloc_socket(sock, cont); + set_socket_vars(*sock, AF_INET, SOCK_STREAM, 0); + (*sock)->timeout = -1; + } + + (*sock)->local_port_unknown = (*sock)->local_interface_unknown = 1; + (*sock)->remote_addr_unknown = 1; + (*sock)->socketdes = *thesock; + return APR_SUCCESS; +} + +APR_IMPLEMENT_INHERIT_SET(socket, inherit, cntxt, socket_cleanup) + +APR_IMPLEMENT_INHERIT_UNSET(socket, inherit, cntxt, socket_cleanup) + +/* deprecated */ +APR_DECLARE(apr_status_t) apr_shutdown(apr_socket_t *thesocket, + apr_shutdown_how_e how) +{ + return apr_socket_shutdown(thesocket, how); +} + +/* deprecated */ +APR_DECLARE(apr_status_t) apr_bind(apr_socket_t *sock, apr_sockaddr_t *sa) +{ + return apr_socket_bind(sock, sa); +} + +/* deprecated */ +APR_DECLARE(apr_status_t) apr_listen(apr_socket_t *sock, apr_int32_t backlog) +{ + return apr_socket_listen(sock, backlog); +} + +/* deprecated */ +APR_DECLARE(apr_status_t) apr_accept(apr_socket_t **new, apr_socket_t *sock, + apr_pool_t *connection_context) +{ + return apr_socket_accept(new, sock, connection_context); +} + +/* deprecated */ +APR_DECLARE(apr_status_t) apr_connect(apr_socket_t *sock, apr_sockaddr_t *sa) +{ + return apr_socket_connect(sock, sa); +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/network_io/os2/sockopt.c b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/os2/sockopt.c new file mode 100644 index 00000000..5a668d14 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/os2/sockopt.c @@ -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. + */ + +#include "apr_arch_networkio.h" +#include "apr_network_io.h" +#include "apr_general.h" +#include "apr_lib.h" +#include "apr_strings.h" +#include +#include +#include +#include +#include +#include +#include +#include + + +APR_DECLARE(apr_status_t) apr_socket_timeout_set(apr_socket_t *sock, + apr_interval_time_t t) +{ + sock->timeout = t; + return APR_SUCCESS; +} + + +APR_DECLARE(apr_status_t) apr_socket_opt_set(apr_socket_t *sock, + apr_int32_t opt, apr_int32_t on) +{ + int one; + struct linger li; + + if (on) + one = 1; + else + one = 0; + + if (opt & APR_SO_KEEPALIVE) { + if (setsockopt(sock->socketdes, SOL_SOCKET, SO_KEEPALIVE, (void *)&one, sizeof(int)) == -1) { + return APR_OS2_STATUS(sock_errno()); + } + } + if (opt & APR_SO_DEBUG) { + if (setsockopt(sock->socketdes, SOL_SOCKET, SO_DEBUG, (void *)&one, sizeof(int)) == -1) { + return APR_OS2_STATUS(sock_errno()); + } + } + if (opt & APR_SO_REUSEADDR) { + if (setsockopt(sock->socketdes, SOL_SOCKET, SO_REUSEADDR, (void *)&one, sizeof(int)) == -1) { + return APR_OS2_STATUS(sock_errno()); + } + } + if (opt & APR_SO_SNDBUF) { + if (setsockopt(sock->socketdes, SOL_SOCKET, SO_SNDBUF, (void *)&on, sizeof(int)) == -1) { + return APR_OS2_STATUS(sock_errno()); + } + } + if (opt & APR_SO_NONBLOCK) { + if (ioctl(sock->socketdes, FIONBIO, (caddr_t)&one, sizeof(one)) == -1) { + return APR_OS2_STATUS(sock_errno()); + } else { + sock->nonblock = one; + } + } + if (opt & APR_SO_LINGER) { + li.l_onoff = on; + li.l_linger = APR_MAX_SECS_TO_LINGER; + if (setsockopt(sock->socketdes, SOL_SOCKET, SO_LINGER, (char *) &li, sizeof(struct linger)) == -1) { + return APR_OS2_STATUS(sock_errno()); + } + } + if (opt & APR_SO_TIMEOUT) { + /* XXX: To be deprecated */ + return apr_socket_timeout_set(sock, on); + } + if (opt & APR_TCP_NODELAY) { + if (setsockopt(sock->socketdes, IPPROTO_TCP, TCP_NODELAY, (void *)&on, sizeof(int)) == -1) { + return APR_OS2_STATUS(sock_errno()); + } + } + return APR_SUCCESS; +} + + +APR_DECLARE(apr_status_t) apr_socket_timeout_get(apr_socket_t *sock, + apr_interval_time_t *t) +{ + *t = sock->timeout; + return APR_SUCCESS; +} + + +APR_DECLARE(apr_status_t) apr_socket_opt_get(apr_socket_t *sock, + apr_int32_t opt, apr_int32_t *on) +{ + switch(opt) { + case APR_SO_TIMEOUT: + /* XXX: To be deprecated */ + *on = (apr_int32_t)sock->timeout; + break; + default: + return APR_EINVAL; + } + return APR_SUCCESS; +} + + +/* deprecated */ +APR_DECLARE(apr_status_t) apr_setsocketopt(apr_socket_t *sock, + apr_int32_t opt, apr_int32_t on) +{ + return apr_socket_opt_set(sock, opt, on); +} + +APR_DECLARE(apr_status_t) apr_getsocketopt(apr_socket_t *sock, + apr_int32_t opt, apr_int32_t *on) +{ + return apr_socket_opt_get(sock, opt, on); +} + + +APR_DECLARE(apr_status_t) apr_socket_atmark(apr_socket_t *sock, int *atmark) +{ + int oobmark; + + if (ioctl(sock->socketdes, SIOCATMARK, (void*)&oobmark, sizeof(oobmark)) < 0) { + return APR_OS2_STATUS(sock_errno()); + } + + *atmark = (oobmark != 0); + + return APR_SUCCESS; +} + + +APR_DECLARE(apr_status_t) apr_gethostname(char *buf, apr_int32_t len, + apr_pool_t *cont) +{ + if (gethostname(buf, len) == -1) { + buf[0] = '\0'; + return APR_OS2_STATUS(sock_errno()); + } + else if (!memchr(buf, '\0', len)) { /* buffer too small */ + buf[0] = '\0'; + return APR_ENAMETOOLONG; + } + return APR_SUCCESS; +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/.libs/inet_ntop.o b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/.libs/inet_ntop.o new file mode 100644 index 0000000000000000000000000000000000000000..817cc79d7a158b41ffc36c75fad3518f5c41f00f GIT binary patch literal 14512 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/.libs/inet_pton.o b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/.libs/inet_pton.o new file mode 100644 index 0000000000000000000000000000000000000000..2e7742cdf6b8de477d6525c20b917a060922a431 GIT binary patch literal 15480 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 R{2qsmQ@=c-@$-E3zW`@GTYCTi literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/.libs/sockets.o b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/.libs/sockets.o new file mode 100644 index 0000000000000000000000000000000000000000..fef86515f3bfa5dd93ecbc40eb40244c5a795d10 GIT binary patch literal 39776 zcmb__34ByV^8b4?IYttaKsbVc3<8QMIUqy~S3(k)m;ebR5V?ksOhP0iF*5@}bQcIw z#}OA)ycUIBb;X~uqKo1xtGFtttGkHjuJ^GD>(3KK78L$f-Bs`P^i16Se?Gs~yjT70 z>Zf`mi8Gcz(KFwj81}D>)Y}h$Q4Wpn&p#@oB^fS_p!m4Ud==&!t0Gi_oo%Dph zI*g?|%+k<4Pw0RsNbQ;lA`6ZkaHMuElvG@5S36LlZ*ulMeZ*OCY=7KQ&;5ZO2NJQe zr}ID@K#o9iNzNh2I2wvW^GLG6M?g$ti)NF7oPKHAt}?gytn zI!pLJh5C7}O)2G8gc*2XI&p&;t2b6_g6na8ME<~}kbB)XBnC=O^{{)s7 zhdv6uci0VzJ>e4Q+n&`(hF zC=(VS6Y2nUPaxKaUTo&>;{T%-y~#EfB!f36;_vq zUKf+vPY^0cJ)t*H!r{Irv1^Jl!ewcX3zgu~)IDwP!_7aPK3yL68R0dq(s1!`cj!TZ^3cfCJ%#Ru z&f|{M4Zp^&>pb2gb;Et=I_ParxZ0h%XX@DvPe1Q!2u;lh&&lpO6kz8bE1Kj8B(9q= z(ST427v;jBnQ)*aS2$r~&z%r87+wcT3P76S34IAsE1Ha*Zw075em!+yZ+NxGvvC|& z5UgGMg1bMzpW+GQAHA}%VmP+v$b5+X)FFUbIQqeJWU9m?`dbW!$apKPF5lSVF03jI zeJ4W;M(pPUY%z{4O-DL_RK_2A z;zwMv=Xk>NJsw(cyWS3_d_El44^McYr|azi#N8T*N6Ui45d3MSp}64-7Uk@dixAC+ zb4x>S;Gp^b$qcXr#lKW7X6Wz~VU{O6!4rC}JakOvU?u@ko*7-Al!sP;+o4xO%RPZ! zz*Zjmusrk;dtOdYplmTtA=dmKp5_WAD)X^5U(i5p{sCs+IfKIf3|Pq_Fc1Ib-x#6k zp0FPj!vO5<={m-9DvYYgqvsu@%;H?J=#$yM6{s-Aru(5(! z$P-TV!0@{ulAl<^)do%xh##m%Nz?vMe5N&baudmVn`KiJVa2>|6{5lH7o#LspD; zCAhA|tP~&_{xpGk<6fI;^Q!XVhi--fp*wCsMgmwbj3W~T?G)EIag7((1aa*lu4~u2 z@zKw^g_xKfbB4oh$iKoUDF!8II7?63q^7Lw@r1Xn(i=&=M>36kis1Xl%; z=&=OX0wmF639bet(PIg&%aBBmCAh9Y()O75I>>{^77qsx%0@1>owxWWs6(g=7>P`` z$+K+oJe$n5$tgB@u}xOn zO8LGB#)%jQDaTL_(I+5}-5NT*5qC!{kZeF|x}q)#I~QjCri!^BLs%$OoGUS=F3 zQy?>OBIA*nc#)})nFNukkr|h{1}t16Gd;|8kXa@($-+-}~{Nuqy?&82Sm9d=I|bo9l5 zCAgl6GvtJdW{U|GQS41I&F*A0UG{wHnkS(G{0|e`Svao=#c_#4aKaOc6Nf$qB=ZEb zfG0IA@zq{1?TL|-__|HLIn+Ym$^p_y!V!p|uq4$;!s=Ke@`*+gs>B&oGg8v6$e%6gHl%YUeHqf@CEY#` z_$Nx*k92{g17#r7LpJ}Z3<}_XF#pf{0v2qe#gdQ$RJOM&bUuwkBcH9+RakjDoU$fGp_1nEW;>TQB(Iuj8`ITktxf)2qf z^F#`bk_)G2s*x>f%&=;RysVL}prS^CYYy-Y9E7#ae7s_+bI7~7b$OCu3~uqQf9?1P~W{GB=`~~p2kr|U)?wNr2nJR^Du;b^d z43)wR<1TRNWMDqqtahw~Yn8)QVMLV96{UdJ7{k`>5fp3nm(Y;6Q<+%Hkl zId2kiE|y=S7L7#YJS-oD6sEt6;Ip!yU{XAKx`pLdfTAdD6dDv^Ho3h`bvrmgBy;P%mfPDR-7c08 zWRkt0WiMktXG%dZtf22fKNwXF2EeTf90RvXXu6qwwpj!8Y>uCmsxjO)b8F93R=1Kz z&fsOOFw3mM^%fKJ8u{Sm(_lO4(t=h-=@qILv0()X=GG;amMd6`)rx8mD@8&pl>TGG z*Qp|B3X@RevzEwpEOIcccIG-S^ccgHk)v#NtDnp;P~A}9M|GwYx% zuC5VEZUQBPfc@v3bDOH=&!&`MZk^GKhv99J@o-zD(%U%zvSdwKgCX+(D9-kJR~qIs z_yBm+_6Cl|7lolb7hkFP3dh-pqO{V?v0e3hXdS!7z|rOgo6(uz79iV$zfG^O@?Rc*{kzA(W)&KVzSW&i;%$JG;HkFpu!mV>xJwbcXR2D9=IK z{0Vs+n>}NieJzH03b#X!&E?jR{uV5Sc9}U4ie@e}2UuYs0gE!9Oyh7z1$o?3Vd8Rj zQ(j%L-7trlV*3T<7YZ)8z}z9yc)Xe;#gmFkTb5oTEJY(BCAe@)Bh4HWVP-uRLo&BM z0S`6Oj4@(sg(&B-HYREI7|ral=8NKi$T0H6PG_8Dw&iZzN~{Ma>?DsJldHhU+a>Jy zg<&t*7^|{pbC6Nm#hp=LGb(ATim z%Ic*N)jz-rkj$Sm$RF2?z3ohXJCPVZ)A@ray=AZ#B3_sI_OM|4mVS!r&)2#&U82l%xP z@|)tJ12|=Q!0I3?EYa+NAOK~fT8PXMD$PCMn>n%gNtnp)w z#@|DiN+tSgISB=rT{LGJhB!S&XzQUE00(|ST$ zd36jcJ7P$;ti&d0R$d!nrQO;$Ejia(R*n-}nrlto(^ztGFGg~uSF6|wo4OG{4xZm+ z7;Lh|yk-;U7d2of1RYiTg7)5wVK4s#LS!%?m{d}?Bh!svq zb;S#*xc{{Ukj29sxIp2~Ro2HcLS8*0w*0L_CF<94~@WCQmpK<0c#MS zhL_}ij+h-{n7zyqDd|bhlz}O|%-)G<{b64?+(=5A3=o|95DCE%*UxaK@Y_siJT&NF(JA zaPnD$&7AbvW_ACXq)UXhA@N2|`XDgNjRdj`4Xrn!dvb(}&c1fNX*e=APlbtc7#G09 zfo&sJ8IcL>5o*uLC28j-fikpmBoc7`f(5X-2U!Lxfyd6sRz--pK+yvhjJCajYBQxl zTc!>`Iax_yb?-#fl?{AKqv10kjv)s~8Kaa!cC4j89y=jIe=g~V{zZl3$eEPQBSDnC zP#OS7(WFmA#YKHh6pLo%$BUqupa=#16R}HBD|AUbvQ1JAiZExg-H<5*FkYvqtflD_ zMVA*?AVigf3NsBga7TDqR{%<42;HQSh<4G^GK(a>u;jO?h2h;>(Q zHx+>C7HRpVhE2c^s4)STBt$JXRxrs%Kric(Vwm1W zt?IH`SIy)-7Bq*+dkK=EXFEVrEGukPtYY$a7BrVhRaRA0->|H!t%{XQvP_5JPi9&b zR@tpE<~EJlOsW-UM^)TK+V@yiR5Q8Xg61&!0zuL{oO{b=Wb*G3jJg~5Q7Masq0c1C zjP3ugsbXK)c42~PgvqrQG?&RPf}||Y?X?-1d^&=Wb1zwp)l7bFK~b{=o7U4}sbUh} zbCA}~VUl&AX;s@eXN!-T;aEI3*EA}bTyKeA$RxKF#aC|Q+>}w zTPPc2U!zT%&8AHwjSgdTIn!(ns+?`vcB8_{G@BziImZ@3h%?E?p&HvRNkv;%!`87x zlwV_Y0tlamDW~Q)e^D0>IBqs@6wORq|70-0Mq+ zz~E{j5ADP6rdN4^NIJc2dU}W-! z2u4}SzOvGfETvUUx-D6Am^??3Rke+C*V&9rs!IQxmR530M_95JG0AGMrInV_%{C*G zs?z9@{WtRAHxpf@D{7uEb_!^5O_a&fQ}({%1R?*p3lat%XdUOOVsJa>+K% zusLX4)i%yew`((5s@CQV+bC;u&bBye?Pl|ywLDkxK9Qf;P(JBmf$##^>1|613|Y2S zTubB)Hnf$@iFu|P4WV!`aF*%qZ=`vZvzRI_D;dtAs zSk2^!pRFigN;ZsoyCRdV7F5OL>YtUhmP$8R6|0%-`q_$`sPrbgB9mMGKPy(nsu;a) zY$vgI+Zvg?=VvuWSFDOvFCPwQA5os`;WwLNB?rlkqdOlrFQz=#qofkx1KAtl;4E#ozX`X}+BTY!a1Ak^#(BGcb)Kb?RtoLPg zjL-At<&JJ{Y6*6XZfpr=Eo}<;4Z+gfv^1-+t}dD-H*-AKmz*rD#TRITzeq4jgMT$C zplU{DW)}P(GnZA{UbieO*wWNt82;9}<-UMFvku$p541P6G>*+&hD{2rZu9vi=?~P` z`x=0Tmdgr+L*?4~`gWOXYJoc(DOnugEvO0K-UJ+;6>Hm&5guTG@cP=@TUzaGTWf1G zDx=as(+Z!=fxnuNPuBM~G&TFY0w7NC%&OM*~;2c3^UD1FP9mPI5XiBxH=Ppt_A6? z!y7zhKg>Em*x_9HxU)y##L0&# zO{LVw1d1rznuebSK z6ml&62l($e{5j%bp745G8ydU;!|TNu!7<})YU}WN4R7fzZ@aIy-rE*vH@tPrYT+wI zwRLsAwt!JsG21)GQ(aX&Yu-%n?2^J_1HNyR=f%n*oGIFxT9*0Rn*!coiyvkQuNQfO zzd&feYs*>|2(;CY9+R1!nU|a8Z?D673}cjl~_Q_F#%A=}#Qt!wtxwglU}?ZFnozY3b`lQqx> zU@bHO25@UIV6^x;0#bdTHW2hfff%J?mh;xNwm`!IMkCC4fV6^>g&~$T{-(wjU%eZ; zppP*g|^`A)Y5AAsjsD8WST)4SVB$*QFXP=;D?~>%$z)9 zS*t(LQoF)uG_?tp_&PS)y|f7>G&I*X`Z09Ic(DLlVfzhLtnjUdyD7%8>rMH)7;UnBXkw}O6Odwp%77Wi>7!qCD{m7#}Y zRWZ!JEC|5|BTI3DueAl7Ap6gc0}DJ#4fC$7ZTA}}+z`Xg9jP6BA%-|CSAL@z7A7zj zRr_mKQqZe|7j?qh{$iaKHnj;KvVU<#z~}=uing(1py^^Mgr;#LM0lWCUhH@ZLNOzG zi)PK7Q{_d^78V!J_7={bt~Rp?#|AW%-Gy5S3@WSlamd=CQ5yhW8ih^ZAq-_4uowUh zwJVyMWfX&}Xv|9s$-iEBZ`JFQu}$3A0DDxoz(iOFaUq&h+p=2eG8`w!OmnN(TkrEn zL~Sj^sT#H|euHg5?@uc&FR|Q(T?v02LL%(uRKXNILuIKG@ftmi&zoIZRf1m05yM&3 zE-osn5Z11!ZC~z#$%py~f|VW9N=>e734q6>Q^5!^r$#IlQa(18qDL$n{<_vS*gDl4 zZSAdr);buEqVqX)tr*niK0gdfki;RkqIS8Q-El<2MBda~&s`-#2m9R@0N;uTfLM|d zjx(jQ6j34WI=#XNsGE^adc811=cr8VPcN)0)JQ`( zQQ9b{O3?)k&8@3&!L>$*+Kd)IG{YLD<7tk=InbKkymHr!1G+W!i+yp4nTv3;dj0&ctYkEspMNxt&t_Er`nsZtldmS3Q9Xn^&wV3cH-tM2lt@&ZD3b!wai| z9b?Ckn}LQNsBQM*a)-vX!qBFjfSlk;Dx*gTOdHBXs6>f~M;sB}$h8AmR@K6GwV@UC zw|e2q>#N!rtf@$&i3}ZQ87v+J1BNlZs3_k(vU+K-B@mQBFnUZ-l}qC8CN+=Q{0_#&ZTCLl#IfZ zw5chs>F^@saNy?`TP{SIP;`}}C?%uQIX%VQBv=bmTtX(8Dbjg(1-?#4b&nL+#YrA0 zhwl*>H;GbsMVjs?cL&iY@ea0ZbWBajxXxLe;=U@bIAvsK{Irw;$K^dzMi!;G!Ajr& z!wQpvfD}d`P#tv~M>&w_^hx+3Sv;7+OT}1FoRYSX>={ltzYdxW#p4N^iM*n%#n{%e z6!$Xe7ijFXq%y1B=;!7b@;!iWAY8oUDB4znZ3DZhZ5O9xJ1+!(M>MW1$*~}^ap8E1w(+bTirAc!%1iRE234d;SOrH)k`u#cwwDT(TduQA#(Yj*r68HoD z%89q0c&~RrJ2pBmPH|s{eRNfPVM=yq0tmn^f$jrwqB8c!HB=X6VM5(o3Hty6+s7c! zaW^=*C?yS?T$&_!`B1AVk{4pHQDqhV{2j>^U#qHz9;1FvrZ<4-lYGJJCae_Y0&hL> zj@Njx4dpSgB{8r-4D1>W!+6=MVQ7Mp>0iA9wg7Ms;Q0;Qmoe4uYp%@{JIG8i^JOme z`;AP2*87$Q8)1fn%obQdGGP@OEmjl~>s#h+Xvb%||D)svIT-5n27o2CfGGV?7yCy|@Ffs_=Sqc* zT@5n37LMyMVLzZAj!Sq4UZiv2ia2$V1mW73U+T6HNzkygP@G>;rd}U^Hv^Myub$5X z9$hBZtp-RfIq$ct$^t= zvF695->nsDS@BII9mD$0V!XoFFErzHUidnBO#9y=`#Db0{$%*m?Z*!zP$st%NRcLa z;G1v5$E)D)H?>UgzGWi9v~2NFhKX`ss1i4 z{xUB}t2m96NWkJ(t+rX5BI4{kQ%(cE)T^b7AsjuBN8yts8Z|H#! zs9)HFy9noZ+Qohyu;;pw^HMkXr!0r!nD^<&3FodK3VBSpcaPPszJQ~h*%XSrhd-wq z{t3j-uO*B9J;*QXhQEUNx0C##!W#J1qHg$`h@aoW4txOH+YETY)_C1`S(z^ zcEf*nH~3TC;4hMVe#21g|3TGz-SGdD_<1PRlOO)w4Szhu4fabL1rEngU&7ZC@Bzs= z2k=<^JDT|U-JK@lpF}vnal=2MP}Pl`OS{3lNRFEVkfvqvY$D={@KVzI2=TAg`2R}y zCJld^@a-D@3E})I2Kp3Bvj92l3=jBT_i2SGdF}pSUO>9mCK~DWFqzy5Z+h zaOS9#^ASDYv8bC5QL=Trz9MO^En0bGd}e?+ zKH4#UQ#bs)|3!XP{=41qyO0qQ-p+zQmfuIgRXL3cezwBDS;19){HS^}__h(XCj<`~?dCxeAUy0D=j5RlQGlgTJldxCdqV@rfu! zK8L7!dk~J8s&}!1kAgCmbCrUhuizgjI6jgy|6p1lQN9|_=PP)Y!e6c6s^9*q;A0g2 zlilFwp8-seP_HWIC&KYI4*uBAG+L*SAI~fpZ|(*^ro<<{c*p#cQ2->ox#5rTp^BVb z1z)G&;}v|ff)7^k-zfM{1%F7vhbj2e3O+)?Us3Rp3Qpl;U@@@(C7;dlju`Il7m*+F z`4SW3sT2n|=U`&|KADw2Obaw@w<4a2&!ckWSD!+%6&&^ch77z=!~2up#VcM=#(G<+ zpGq|T+X=_BXiUt1FB%4kAMY9eH|edF#TI`W@i%BVWsS=;oWFMP3k{!%iXd&2H%tCk z*M*jIh!yh1f_}~D=VqD>K7AAgqm2sX&dQ&;$;==^s zKTE?eB6~(@xR30gq2Yh0Jo}sFFCqKuH2!*8kNNjKnE&5253bhuKce>XZ>ljr{6vjN zn>GGyvi}YZA4TKqJ`Lw@;qTS(KayU4d6@N&jt;zp!oTfhVyy%?HYbL+N} zJIRg-8vispYAn}q{zhPphTlN)>oxp!>hCrU-%a=x8h(KAYc!naNB$~3+s{8~exJtA zIPdeB|4y>=DUE*?wf9*K{}YWzJ~v}I6UokZG=Bcl#$gTT`R+Rnf0zS;^sxL=n%|N& z{8{QR_yIJLn12=JM`-u}k~2obE6M&T8a{>W<9VIs^LN57(fALN{S6v^4b4}64L?Vk zZLHOBJjcVdQN#P90g!Ij@P`S%SHpit_UzX131rXH8qPli@>dPVA7RGywuV1Ie&f$c z*gr3jeExzz;|a8GI%xf2yeHwQ8s3NSK^i`g@bff$KjC>AUQBqghV%Mbrs4b(2=g?Y z&qM1p{6~tzRt+CZe*3+K^Z5Fsh99Q>;&0irf6ga=9@O}+AieKu_(szEwTAPzqfcsh zI`v}$>0!O=NX}FZ-$(hG8r~$s#PDl4J`-YEt>Ip>bm50gFIK9-X}CzW|5nY7IY3?YdFJ+5g)#oX63_8qW6oNyA6ccz;>L2aw<1((ud35C78ednkWG z!#9!qc=8kbKZ*L0&&?PgK9(T%h4B|3VF)Pj*h#aF$=K;pb9&7Z8r-kxJ1o zS1A0nbrX0+g?>H8W!h5Ub5!&edhE#a)!K{!8mVlnDn3xAl-Ag3UXt>L^M7^vZ6$k{^) zXT9vVDH_gxn5W@vXS*UF&u1JI4;>mmpBwy2K!lAkYj zDme1LLp65a5RCRCkqu^3 z8b9~%%^J>rzFWgDB0v0Ilm9i@^EZVb+dG}&?KK5QJNcKl-cxYo=bt9~Si#je`9i^w zzmVqDZxvjPlOGiv`QIUa6P*qT`xp87UFIYONB+xc-vvLgEfVu{oS&)SLO$^iA)NcM zANg&vhL0w^PQxn*U#H<6gx{>;9JhCMgYVSvTS?9#4c|@p`x^c-;m0-nL&68rhYjqX zBjo21gtH&`*B7TL{OGqC6t`sxj{U-Zu2yj5=l%M81y|#wUcr(7DU#o$;A+476&(4G z6Tkc?L+$y2e-Bdr6Q6ec93nqFOmeur;sY#@_ktoH_45AVRRu@A#kBwXNW-rr{4-6y z_;=l*9=|HadNXL;rJyoM+%Kb%fRsTv^Yi&smd4L^UZmh?=c8oLWKGUg(mPkfIX-I@ zIY{m!ImUWVfSdVur})^I+*J)dyy_mkv@aT-6L zugz8XQLmr$E>LhZjoal@aOCIx)1?ZI{CtiUP;lg5gcnGw3Fme_Mf1k38vh~UzgNSD z(fqzslk++G=Pw!_NAf??@N)?NO2Y@xeBPs%w3qGVc<$c~K2*c`JSb1W$wVQzK*4b- z?IOK13Fm&q_XaW5X#CrWzg6Ss{#vcz=*q?9x2rY$Q^L1s_^mYW-%dFDp@HJ|L4_at zoqw0{FB(7p9^=;<{v6r=lZNw8KlY^;IazNC=^drusy}lT9R0~Z4LOH!_UES*=ZiJ| zT_iuK@$>WVS_Mac4x)K^lZMNGnc6V6D7ZR~wktTw*-dhGY4{g}KSDVBfzN~XEBq+G zH~I6Bh8NL3?LAEnpC6sj_~+969FH%hLt?%BdEy|#*`FM5=PEe1D-Df;bb*2kJE_wy zRB+^9Nc__^d3XaetG=AqPILi5s_!~96fW~<<;oPpF)ZR`F&m#QS8h#1kuPE|S z<#1FE=^c%q-+w)-@$+wSoA`1MB;B8B8ornMcOcuKuWI}}pS-8w=r{aFbufLb;24KIj=ofI={=18yZ#*4{alf>YoWUB-ei+paK8|p#j&{CGawcm0YYCsD@w1(a6&&pxNAXmr$>}0F zs}+9KdlSv)8#Mk+#Q$rJpY{Gu!BKAu>3vkg?RP5u^=|CYj!_TbO_Vft9(-%k7| zG=3hZ@fornvY|a6klsETK7jgr0O8z^_mKQNg&*x{C;t>`{JV(1M&oCD>J%L9nN50^ zDY$4a?f3i&j{ITb?;xD*XuU7cco_eyUOW{}d`PXawOQ`TR4PS~4fpoWq^FMg;l!o6za{i&={5j=6 zHT;MaZ=BTdZz*oi#FzUav7cKg-X>@`f8IP-!*j|0l^Xs7ojYyO@bP5-gBm_snqj=A z;j3xgKdRx^lior2@;4;5|1q{-!};@%`5JyL%_mDV{0Q0Eq2WVF{tX(=pMO25;V+Y) z=_c%?rCQic+g58G7a&{;$S#g^#@$3U^lJldE zQ~&b&(X5xx6-QG4FwWjA80Y6i z{v3vJeh%8M@$>V`OB&Am!{Zvx`=~VX6U%qgd@@|avk9N5;cE%!b9a`*>ut**8Q(|z{Qe~4Jg@#gNqgxy literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/.libs/sockopt.o b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/.libs/sockopt.o new file mode 100644 index 0000000000000000000000000000000000000000..d0d49c1851af38ee7bd77cab2419414f7f3036e7 GIT binary patch literal 24368 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 +#endif +#if APR_HAVE_SYS_SOCKET_H +#include +#endif +#if APR_HAVE_NETINET_IN_H +#include +#endif +#if APR_HAVE_ARPA_INET_H +#include +#endif +#include +#if APR_HAVE_ERRNO_H +#include +#endif +#include + +#ifndef IN6ADDRSZ +#define IN6ADDRSZ 16 +#endif + +#ifndef INT16SZ +#define INT16SZ sizeof(apr_int16_t) +#endif + +#ifndef __P +#define __P(x) x +#endif + +#if !defined(EAFNOSUPPORT) && defined(WSAEAFNOSUPPORT) +#define EAFNOSUPPORT WSAEAFNOSUPPORT +#endif + +/* + * WARNING: Don't even consider trying to compile this on a system where + * sizeof(int) < 4. sizeof(int) > 4 is fine; all the world's not a VAX. + */ + +static const char *inet_ntop4 __P((const unsigned char *src, char *dst, apr_size_t size)); +#if APR_HAVE_IPV6 +static const char *inet_ntop6 __P((const unsigned char *src, char *dst, apr_size_t size)); +#endif + +/* char * + * inet_ntop(af, src, dst, size) + * convert a network format address to presentation format. + * return: + * pointer to presentation format address (`dst'), or NULL (see errno). + * author: + * Paul Vixie, 1996. + */ +const char * +apr_inet_ntop(int af, const void *src, char *dst, apr_size_t size) +{ + switch (af) { + case AF_INET: + return (inet_ntop4(src, dst, size)); +#if APR_HAVE_IPV6 + case AF_INET6: + return (inet_ntop6(src, dst, size)); +#endif + default: + errno = EAFNOSUPPORT; + return (NULL); + } + /* NOTREACHED */ +} + +/* const char * + * inet_ntop4(src, dst, size) + * format an IPv4 address, more or less like inet_ntoa() + * return: + * `dst' (as a const) + * notes: + * (1) uses no statics + * (2) takes a u_char* not an in_addr as input + * author: + * Paul Vixie, 1996. + */ +static const char * +inet_ntop4(const unsigned char *src, char *dst, apr_size_t size) +{ + const apr_size_t MIN_SIZE = 16; /* space for 255.255.255.255\0 */ + int n = 0; + char *next = dst; + + if (size < MIN_SIZE) { + errno = ENOSPC; + return NULL; + } + do { + unsigned char u = *src++; + if (u > 99) { + *next++ = '0' + u/100; + u %= 100; + *next++ = '0' + u/10; + u %= 10; + } + else if (u > 9) { + *next++ = '0' + u/10; + u %= 10; + } + *next++ = '0' + u; + *next++ = '.'; + n++; + } while (n < 4); + *--next = 0; + return dst; +} + +#if APR_HAVE_IPV6 +/* const char * + * inet_ntop6(src, dst, size) + * convert IPv6 binary address into presentation (printable) format + * author: + * Paul Vixie, 1996. + */ +static const char * +inet_ntop6(const unsigned char *src, char *dst, apr_size_t size) +{ + /* + * Note that int32_t and int16_t need only be "at least" large enough + * to contain a value of the specified size. On some systems, like + * Crays, there is no such thing as an integer variable with 16 bits. + * Keep this in mind if you think this function should have been coded + * to use pointer overlays. All the world's not a VAX. + */ + char tmp[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"], *tp; + struct { int base, len; } best = {-1, 0}, cur = {-1, 0}; + unsigned int words[IN6ADDRSZ / INT16SZ]; + int i; + const unsigned char *next_src, *src_end; + unsigned int *next_dest; + + /* + * Preprocess: + * Copy the input (bytewise) array into a wordwise array. + * Find the longest run of 0x00's in src[] for :: shorthanding. + */ + next_src = src; + src_end = src + IN6ADDRSZ; + next_dest = words; + i = 0; + do { + unsigned int next_word = (unsigned int)*next_src++; + next_word <<= 8; + next_word |= (unsigned int)*next_src++; + *next_dest++ = next_word; + + if (next_word == 0) { + if (cur.base == -1) { + cur.base = i; + cur.len = 1; + } + else { + cur.len++; + } + } else { + if (cur.base != -1) { + if (best.base == -1 || cur.len > best.len) { + best = cur; + } + cur.base = -1; + } + } + + i++; + } while (next_src < src_end); + + if (cur.base != -1) { + if (best.base == -1 || cur.len > best.len) { + best = cur; + } + } + if (best.base != -1 && best.len < 2) { + best.base = -1; + } + + /* + * Format the result. + */ + tp = tmp; + for (i = 0; i < (IN6ADDRSZ / INT16SZ);) { + /* Are we inside the best run of 0x00's? */ + if (i == best.base) { + *tp++ = ':'; + i += best.len; + continue; + } + /* Are we following an initial run of 0x00s or any real hex? */ + if (i != 0) { + *tp++ = ':'; + } + /* Is this address an encapsulated IPv4? */ + if (i == 6 && best.base == 0 && + (best.len == 6 || (best.len == 5 && words[5] == 0xffff))) { + if (!inet_ntop4(src+12, tp, sizeof tmp - (tp - tmp))) { + return (NULL); + } + tp += strlen(tp); + break; + } + tp += apr_snprintf(tp, sizeof tmp - (tp - tmp), "%x", words[i]); + i++; + } + /* Was it a trailing run of 0x00's? */ + if (best.base != -1 && (best.base + best.len) == (IN6ADDRSZ / INT16SZ)) { + *tp++ = ':'; + } + *tp++ = '\0'; + + /* + * Check for overflow, copy, and we're done. + */ + if ((apr_size_t)(tp - tmp) > size) { + errno = ENOSPC; + return (NULL); + } + strcpy(dst, tmp); + return (dst); +} +#endif diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/inet_ntop.lo b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/inet_ntop.lo new file mode 100644 index 00000000..2345ed35 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/inet_ntop.lo @@ -0,0 +1,12 @@ +# inet_ntop.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/inet_ntop.o' + +# Name of the non-PIC object. +non_pic_object='inet_ntop.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/inet_ntop.o b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/inet_ntop.o new file mode 100644 index 0000000000000000000000000000000000000000..0812ba540a3c66a78b288d6b614d7b943df056df GIT binary patch literal 14384 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/inet_pton.c b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/inet_pton.c new file mode 100644 index 00000000..550ab2a4 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/inet_pton.c @@ -0,0 +1,240 @@ +/* Copyright (c) 1996 by Internet Software Consortium. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS + * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE + * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL + * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR + * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS + * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + * SOFTWARE. + */ + +#include "apr_private.h" +#include "apr_arch_networkio.h" + +#if APR_HAVE_SYS_TYPES_H +#include +#endif +#if APR_HAVE_SYS_SOCKET_H +#include +#endif +#if APR_HAVE_NETINET_IN_H +#include +#endif +#if APR_HAVE_ARPA_INET_H +#include +#endif +#include +#if APR_HAVE_ERRNO_H +#include +#endif + +#ifndef IN6ADDRSZ +#define IN6ADDRSZ 16 +#endif + +#ifndef INT16SZ +#define INT16SZ sizeof(apr_int16_t) +#endif + +#ifndef INADDRSZ +#define INADDRSZ 4 +#endif + +#ifndef __P +#define __P(x) x +#endif + +#if !defined(EAFNOSUPPORT) && defined(WSAEAFNOSUPPORT) +#define EAFNOSUPPORT WSAEAFNOSUPPORT +#endif + +/* + * WARNING: Don't even consider trying to compile this on a system where + * sizeof(int) < 4. sizeof(int) > 4 is fine; all the world's not a VAX. + */ + +static int inet_pton4 __P((const char *src, unsigned char *dst)); +#if APR_HAVE_IPV6 +static int inet_pton6 __P((const char *src, unsigned char *dst)); +#endif + +/* int + * inet_pton(af, src, dst) + * convert from presentation format (which usually means ASCII printable) + * to network format (which is usually some kind of binary format). + * return: + * 1 if the address was valid for the specified address family + * 0 if the address wasn't valid (`dst' is untouched in this case) + * -1 if some other error occurred (`dst' is untouched in this case, too) + * author: + * Paul Vixie, 1996. + */ +int +apr_inet_pton(int af, const char *src, void *dst) +{ + switch (af) { + case AF_INET: + return (inet_pton4(src, dst)); +#if APR_HAVE_IPV6 + case AF_INET6: + return (inet_pton6(src, dst)); +#endif + default: + errno = EAFNOSUPPORT; + return (-1); + } + /* NOTREACHED */ +} + +/* int + * inet_pton4(src, dst) + * like inet_aton() but without all the hexadecimal and shorthand. + * return: + * 1 if `src' is a valid dotted quad, else 0. + * notice: + * does not touch `dst' unless it's returning 1. + * author: + * Paul Vixie, 1996. + */ +static int +inet_pton4(const char *src, unsigned char *dst) +{ + static const char digits[] = "0123456789"; + int saw_digit, octets, ch; + unsigned char tmp[INADDRSZ], *tp; + + saw_digit = 0; + octets = 0; + *(tp = tmp) = 0; + while ((ch = *src++) != '\0') { + const char *pch; + + if ((pch = strchr(digits, ch)) != NULL) { + unsigned int new = *tp * 10 + (pch - digits); + + if (new > 255) + return (0); + *tp = new; + if (! saw_digit) { + if (++octets > 4) + return (0); + saw_digit = 1; + } + } else if (ch == '.' && saw_digit) { + if (octets == 4) + return (0); + *++tp = 0; + saw_digit = 0; + } else + return (0); + } + if (octets < 4) + return (0); + + memcpy(dst, tmp, INADDRSZ); + return (1); +} + +#if APR_HAVE_IPV6 +/* int + * inet_pton6(src, dst) + * convert presentation level address to network order binary form. + * return: + * 1 if `src' is a valid [RFC1884 2.2] address, else 0. + * notice: + * (1) does not touch `dst' unless it's returning 1. + * (2) :: in a full address is silently ignored. + * credit: + * inspired by Mark Andrews. + * author: + * Paul Vixie, 1996. + */ +static int +inet_pton6(const char *src, unsigned char *dst) +{ + static const char xdigits_l[] = "0123456789abcdef", + xdigits_u[] = "0123456789ABCDEF"; + unsigned char tmp[IN6ADDRSZ], *tp, *endp, *colonp; + const char *xdigits, *curtok; + int ch, saw_xdigit; + unsigned int val; + + memset((tp = tmp), '\0', IN6ADDRSZ); + endp = tp + IN6ADDRSZ; + colonp = NULL; + /* Leading :: requires some special handling. */ + if (*src == ':') + if (*++src != ':') + return (0); + curtok = src; + saw_xdigit = 0; + val = 0; + while ((ch = *src++) != '\0') { + const char *pch; + + if ((pch = strchr((xdigits = xdigits_l), ch)) == NULL) + pch = strchr((xdigits = xdigits_u), ch); + if (pch != NULL) { + val <<= 4; + val |= (pch - xdigits); + if (val > 0xffff) + return (0); + saw_xdigit = 1; + continue; + } + if (ch == ':') { + curtok = src; + if (!saw_xdigit) { + if (colonp) + return (0); + colonp = tp; + continue; + } + if (tp + INT16SZ > endp) + return (0); + *tp++ = (unsigned char) (val >> 8) & 0xff; + *tp++ = (unsigned char) val & 0xff; + saw_xdigit = 0; + val = 0; + continue; + } + if (ch == '.' && ((tp + INADDRSZ) <= endp) && + inet_pton4(curtok, tp) > 0) { + tp += INADDRSZ; + saw_xdigit = 0; + break; /* '\0' was seen by inet_pton4(). */ + } + return (0); + } + if (saw_xdigit) { + if (tp + INT16SZ > endp) + return (0); + *tp++ = (unsigned char) (val >> 8) & 0xff; + *tp++ = (unsigned char) val & 0xff; + } + if (colonp != NULL) { + /* + * Since some memmove()'s erroneously fail to handle + * overlapping regions, we'll do the shift by hand. + */ + const int n = tp - colonp; + int i; + + for (i = 1; i <= n; i++) { + endp[- i] = colonp[n - i]; + colonp[n - i] = 0; + } + tp = endp; + } + if (tp != endp) + return (0); + memcpy(dst, tmp, IN6ADDRSZ); + return (1); +} +#endif diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/inet_pton.lo b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/inet_pton.lo new file mode 100644 index 00000000..780b7a7b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/inet_pton.lo @@ -0,0 +1,12 @@ +# inet_pton.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/inet_pton.o' + +# Name of the non-PIC object. +non_pic_object='inet_pton.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/inet_pton.o b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/inet_pton.o new file mode 100644 index 0000000000000000000000000000000000000000..0601b0ddda5814a67044585d2a2eb3108bbc0f9a GIT binary patch literal 15416 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 +#endif + +apr_status_t apr_socket_send(apr_socket_t *sock, const char *buf, + apr_size_t *len) +{ + apr_ssize_t rv; + + if (sock->netmask & APR_INCOMPLETE_WRITE) { + sock->netmask &= ~APR_INCOMPLETE_WRITE; + goto do_select; + } + + do { + rv = write(sock->socketdes, buf, (*len)); + } while (rv == -1 && errno == EINTR); + + while (rv == -1 && (errno == EAGAIN || errno == EWOULDBLOCK) + && apr_is_option_set(sock->netmask, APR_SO_TIMEOUT)) { + apr_status_t arv; +do_select: + arv = apr_wait_for_io_or_timeout(NULL, sock, 0); + if (arv != APR_SUCCESS) { + *len = 0; + return arv; + } + else { + do { + rv = write(sock->socketdes, buf, (*len)); + } while (rv == -1 && errno == EINTR); + } + } + if (rv == -1) { + *len = 0; + return errno; + } + if (apr_is_option_set(sock->netmask, APR_SO_TIMEOUT) && rv < *len) { + sock->netmask |= APR_INCOMPLETE_WRITE; + } + (*len) = rv; + return APR_SUCCESS; +} + +apr_status_t apr_socket_recv(apr_socket_t *sock, char *buf, apr_size_t *len) +{ + apr_ssize_t rv; + apr_status_t arv; + + if (sock->netmask & APR_INCOMPLETE_READ) { + sock->netmask &= ~APR_INCOMPLETE_READ; + goto do_select; + } + + do { + rv = read(sock->socketdes, buf, (*len)); + } while (rv == -1 && errno == EINTR); + + while (rv == -1 && (errno == EAGAIN || errno == EWOULDBLOCK) && + apr_is_option_set(sock->netmask, APR_SO_TIMEOUT)) { +do_select: + arv = apr_wait_for_io_or_timeout(NULL, sock, 1); + if (arv != APR_SUCCESS) { + *len = 0; + return arv; + } + else { + do { + rv = read(sock->socketdes, buf, (*len)); + } while (rv == -1 && errno == EINTR); + } + } + if (rv == -1) { + (*len) = 0; + return errno; + } + if (apr_is_option_set(sock->netmask, APR_SO_TIMEOUT) && rv < *len) { + sock->netmask |= APR_INCOMPLETE_READ; + } + (*len) = rv; + if (rv == 0) { + return APR_EOF; + } + return APR_SUCCESS; +} + +apr_status_t apr_socket_sendto(apr_socket_t *sock, apr_sockaddr_t *where, + apr_int32_t flags, const char *buf, + apr_size_t *len) +{ + apr_ssize_t rv; + + do { + rv = sendto(sock->socketdes, buf, (*len), flags, + (const struct sockaddr*)&where->sa, + where->salen); + } while (rv == -1 && errno == EINTR); + + while (rv == -1 && (errno == EAGAIN || errno == EWOULDBLOCK) + && apr_is_option_set(sock->netmask, APR_SO_TIMEOUT)) { + apr_status_t arv = apr_wait_for_io_or_timeout(NULL, sock, 0); + if (arv != APR_SUCCESS) { + *len = 0; + return arv; + } else { + do { + rv = sendto(sock->socketdes, buf, (*len), flags, + (const struct sockaddr*)&where->sa, + where->salen); + } while (rv == -1 && errno == EINTR); + } + } + if (rv == -1) { + *len = 0; + return errno; + } + *len = rv; + return APR_SUCCESS; +} + +apr_status_t apr_socket_recvfrom(apr_sockaddr_t *from, apr_socket_t *sock, + apr_int32_t flags, char *buf, + apr_size_t *len) +{ + apr_ssize_t rv; + + do { + rv = recvfrom(sock->socketdes, buf, (*len), flags, + (struct sockaddr*)&from->sa, &from->salen); + } while (rv == -1 && errno == EINTR); + + while (rv == -1 && (errno == EAGAIN || errno == EWOULDBLOCK) && + apr_is_option_set(sock->netmask, APR_SO_TIMEOUT)) { + apr_status_t arv = apr_wait_for_io_or_timeout(NULL, sock, 1); + if (arv != APR_SUCCESS) { + *len = 0; + return arv; + } else { + do { + rv = recvfrom(sock->socketdes, buf, (*len), flags, + (struct sockaddr*)&from->sa, &from->salen); + } while (rv == -1 && errno == EINTR); + } + } + if (rv == -1) { + (*len) = 0; + return errno; + } + + (*len) = rv; + if (rv == 0 && sock->type == SOCK_STREAM) { + return APR_EOF; + } + + return APR_SUCCESS; +} + +#ifdef HAVE_WRITEV +apr_status_t apr_socket_sendv(apr_socket_t * sock, const struct iovec *vec, + apr_int32_t nvec, apr_size_t *len) +{ + apr_ssize_t rv; + apr_size_t requested_len = 0; + apr_int32_t i; + + for (i = 0; i < nvec; i++) { + requested_len += vec[i].iov_len; + } + + if (sock->netmask & APR_INCOMPLETE_WRITE) { + sock->netmask &= ~APR_INCOMPLETE_WRITE; + goto do_select; + } + + do { + rv = writev(sock->socketdes, vec, nvec); + } while (rv == -1 && errno == EINTR); + + while (rv == -1 && (errno == EAGAIN || errno == EWOULDBLOCK) && + apr_is_option_set(sock->netmask, APR_SO_TIMEOUT)) { + apr_status_t arv; +do_select: + arv = apr_wait_for_io_or_timeout(NULL, sock, 0); + if (arv != APR_SUCCESS) { + *len = 0; + return arv; + } + else { + do { + rv = writev(sock->socketdes, vec, nvec); + } while (rv == -1 && errno == EINTR); + } + } + if (rv == -1) { + *len = 0; + return errno; + } + if (apr_is_option_set(sock->netmask, APR_SO_TIMEOUT) && + rv < requested_len) { + sock->netmask |= APR_INCOMPLETE_WRITE; + } + (*len) = rv; + return APR_SUCCESS; +} +#endif + +#if APR_HAS_SENDFILE + +/* TODO: Verify that all platforms handle the fd the same way, + * i.e. that they don't move the file pointer. + */ +/* TODO: what should flags be? int_32? */ + +/* Define a structure to pass in when we have a NULL header value */ +static apr_hdtr_t no_hdtr; + +#if defined(__linux__) && defined(HAVE_WRITEV) + +apr_status_t apr_socket_sendfile(apr_socket_t *sock, apr_file_t *file, + apr_hdtr_t *hdtr, apr_off_t *offset, + apr_size_t *len, apr_int32_t flags) +{ + off_t off = *offset; + int rv, nbytes = 0, total_hdrbytes, i; + apr_status_t arv; + + if (!hdtr) { + hdtr = &no_hdtr; + } + + /* Ignore flags for now. */ + flags = 0; + + if (hdtr->numheaders > 0) { + apr_size_t hdrbytes; + + /* cork before writing headers */ + rv = apr_socket_opt_set(sock, APR_TCP_NOPUSH, 1); + if (rv != APR_SUCCESS) { + return rv; + } + + /* Now write the headers */ + arv = apr_socket_sendv(sock, hdtr->headers, hdtr->numheaders, + &hdrbytes); + if (arv != APR_SUCCESS) { + *len = 0; + return errno; + } + nbytes += hdrbytes; + + /* If this was a partial write and we aren't doing timeouts, + * return now with the partial byte count; this is a non-blocking + * socket. + */ + total_hdrbytes = 0; + for (i = 0; i < hdtr->numheaders; i++) { + total_hdrbytes += hdtr->headers[i].iov_len; + } + if (hdrbytes < total_hdrbytes) { + *len = hdrbytes; + return apr_socket_opt_set(sock, APR_TCP_NOPUSH, 0); + } + } + + if (sock->netmask & APR_INCOMPLETE_WRITE) { + sock->netmask &= ~APR_INCOMPLETE_WRITE; + goto do_select; + } + + do { + rv = sendfile(sock->socketdes, /* socket */ + file->filedes, /* open file descriptor of the file to be sent */ + &off, /* where in the file to start */ + *len); /* number of bytes to send */ + } while (rv == -1 && errno == EINTR); + + while (rv == -1 && + (errno == EAGAIN || errno == EWOULDBLOCK) && + apr_is_option_set(sock->netmask, APR_SO_TIMEOUT)) { +do_select: + arv = apr_wait_for_io_or_timeout(NULL, sock, 0); + if (arv != APR_SUCCESS) { + *len = 0; + return arv; + } + else { + do { + rv = sendfile(sock->socketdes, /* socket */ + file->filedes, /* open file descriptor of the file to be sent */ + &off, /* where in the file to start */ + *len); /* number of bytes to send */ + } while (rv == -1 && errno == EINTR); + } + } + + if (rv == -1) { + *len = nbytes; + rv = errno; + apr_socket_opt_set(sock, APR_TCP_NOPUSH, 0); + return rv; + } + + nbytes += rv; + + if (rv < *len) { + *len = nbytes; + arv = apr_socket_opt_set(sock, APR_TCP_NOPUSH, 0); + if (rv > 0) { + + /* If this was a partial write, return now with the + * partial byte count; this is a non-blocking socket. + */ + + if (apr_is_option_set(sock->netmask, APR_SO_TIMEOUT)) { + sock->netmask |= APR_INCOMPLETE_WRITE; + } + return arv; + } + else { + /* If the file got smaller mid-request, eventually the offset + * becomes equal to the new file size and the kernel returns 0. + * Make this an error so the caller knows to log something and + * exit. + */ + return APR_EOF; + } + } + + /* Now write the footers */ + if (hdtr->numtrailers > 0) { + apr_size_t trbytes; + arv = apr_socket_sendv(sock, hdtr->trailers, hdtr->numtrailers, + &trbytes); + nbytes += trbytes; + if (arv != APR_SUCCESS) { + *len = nbytes; + rv = errno; + apr_socket_opt_set(sock, APR_TCP_NOPUSH, 0); + return rv; + } + } + + apr_socket_opt_set(sock, APR_TCP_NOPUSH, 0); + + (*len) = nbytes; + return rv < 0 ? errno : APR_SUCCESS; +} + +#elif defined(__FreeBSD__) + +static int include_hdrs_in_length(void) +{ +#ifdef HAVE_SYS_SYSCTL_H +/* this assumes: + * if the header exists, so does the sysctlbyname() syscall, and + * if the header doesn't exist, the kernel is really old + */ + +/* see + * http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/sys/param.h#rev1.61.2.29 + * for kernel version number + * + * http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/kern/uipc_syscalls.c#rev1.65.2.10 + * for the sendfile patch + */ +#define KERNEL_WITH_SENDFILE_LENGTH_FIX 460001 + + typedef enum { UNKNOWN = 0, + NEW, + OLD + } api_e; + + static api_e api; + int kernel_version; + apr_size_t kernel_version_size; + + if (api != UNKNOWN) { + return (api == OLD); + } + kernel_version = 0; /* silence compiler warning */ + kernel_version_size = sizeof(kernel_version); + if (sysctlbyname("kern.osreldate", &kernel_version, + &kernel_version_size, NULL, 0) == 0 && + kernel_version < KERNEL_WITH_SENDFILE_LENGTH_FIX) { + api = OLD; + return 1; + } + /* size of kern.osreldate's output might change in the future + * causing the sysctlbyname to fail, + * but if it's the future, we should use the newer API + */ + api = NEW; + return 0; +#else + /* the build system's kernel is older than 3.4. Use the old API */ + return 1; +#endif +} + +/* Release 3.1 or greater */ +apr_status_t apr_socket_sendfile(apr_socket_t * sock, apr_file_t * file, + apr_hdtr_t * hdtr, apr_off_t * offset, + apr_size_t * len, apr_int32_t flags) +{ + off_t nbytes = 0; + int rv, i; + struct sf_hdtr headerstruct; + apr_size_t bytes_to_send = *len; + + /* Ignore flags for now. */ + flags = 0; + + if (!hdtr) { + hdtr = &no_hdtr; + } + + else if (hdtr->numheaders && include_hdrs_in_length()) { + + /* On early versions of FreeBSD sendfile, the number of bytes to send + * must include the length of the headers. Don't look at the man page + * for this :( Instead, look at the the logic in + * src/sys/kern/uipc_syscalls::sendfile(). + * + * This was fixed in the middle of 4.6-STABLE + */ + for (i = 0; i < hdtr->numheaders; i++) { + bytes_to_send += hdtr->headers[i].iov_len; + } + } + + headerstruct.headers = hdtr->headers; + headerstruct.hdr_cnt = hdtr->numheaders; + headerstruct.trailers = hdtr->trailers; + headerstruct.trl_cnt = hdtr->numtrailers; + + /* FreeBSD can send the headers/footers as part of the system call */ + do { + if (sock->netmask & APR_INCOMPLETE_WRITE) { + apr_status_t arv; + sock->netmask &= ~APR_INCOMPLETE_WRITE; + arv = apr_wait_for_io_or_timeout(NULL, sock, 0); + if (arv != APR_SUCCESS) { + *len = 0; + return arv; + } + } + if (bytes_to_send) { + /* We won't dare call sendfile() if we don't have + * header or file bytes to send because bytes_to_send == 0 + * means send the whole file. + */ + rv = sendfile(file->filedes, /* file to be sent */ + sock->socketdes, /* socket */ + *offset, /* where in the file to start */ + bytes_to_send, /* number of bytes to send */ + &headerstruct, /* Headers/footers */ + &nbytes, /* number of bytes written */ + flags); /* undefined, set to 0 */ + + if (rv == -1) { + if (errno == EAGAIN) { + if (apr_is_option_set(sock->netmask, APR_SO_TIMEOUT)) { + sock->netmask |= APR_INCOMPLETE_WRITE; + } + /* FreeBSD's sendfile can return -1/EAGAIN even if it + * sent bytes. Sanitize the result so we get normal EAGAIN + * semantics w.r.t. bytes sent. + */ + if (nbytes) { + /* normal exit for a big file & non-blocking io */ + (*len) = nbytes; + return APR_SUCCESS; + } + } + } + else { /* rv == 0 (or the kernel is broken) */ + if (nbytes == 0) { + /* Most likely the file got smaller after the stat. + * Return an error so the caller can do the Right Thing. + */ + (*len) = nbytes; + return APR_EOF; + } + } + } + else { + /* just trailer bytes... use writev() + */ + rv = writev(sock->socketdes, + hdtr->trailers, + hdtr->numtrailers); + if (rv > 0) { + nbytes = rv; + rv = 0; + } + else { + nbytes = 0; + } + } + if (rv == -1 && + errno == EAGAIN && + apr_is_option_set(sock->netmask, APR_SO_TIMEOUT)) { + apr_status_t arv = apr_wait_for_io_or_timeout(NULL, sock, 0); + if (arv != APR_SUCCESS) { + *len = 0; + return arv; + } + } + } while (rv == -1 && (errno == EINTR || errno == EAGAIN)); + + (*len) = nbytes; + if (rv == -1) { + return errno; + } + return APR_SUCCESS; +} + +#elif defined(__hpux) || defined(__hpux__) + +/* HP cc in ANSI mode defines __hpux; gcc defines __hpux__ */ + +/* HP-UX Version 10.30 or greater + * (no worries, because we only get here if autoconfiguration found sendfile) + */ + +/* ssize_t sendfile(int s, int fd, off_t offset, size_t nbytes, + * const struct iovec *hdtrl, int flags); + * + * nbytes is the number of bytes to send just from the file; as with FreeBSD, + * if nbytes == 0, the rest of the file (from offset) is sent + */ + +apr_status_t apr_socket_sendfile(apr_socket_t *sock, apr_file_t *file, + apr_hdtr_t *hdtr, apr_off_t *offset, + apr_size_t *len, apr_int32_t flags) +{ + int i; + apr_ssize_t rc; + apr_size_t nbytes = *len, headerlen, trailerlen; + struct iovec hdtrarray[2]; + char *headerbuf, *trailerbuf; + + if (!hdtr) { + hdtr = &no_hdtr; + } + + /* Ignore flags for now. */ + flags = 0; + + /* HP-UX can only send one header iovec and one footer iovec; try to + * only allocate storage to combine input iovecs when we really have to + */ + + switch(hdtr->numheaders) { + case 0: + hdtrarray[0].iov_base = NULL; + hdtrarray[0].iov_len = 0; + break; + case 1: + hdtrarray[0] = hdtr->headers[0]; + break; + default: + headerlen = 0; + for (i = 0; i < hdtr->numheaders; i++) { + headerlen += hdtr->headers[i].iov_len; + } + + /* XXX: BUHHH? wow, what a memory leak! */ + headerbuf = hdtrarray[0].iov_base = apr_palloc(sock->cntxt, headerlen); + hdtrarray[0].iov_len = headerlen; + + for (i = 0; i < hdtr->numheaders; i++) { + memcpy(headerbuf, hdtr->headers[i].iov_base, + hdtr->headers[i].iov_len); + headerbuf += hdtr->headers[i].iov_len; + } + } + + switch(hdtr->numtrailers) { + case 0: + hdtrarray[1].iov_base = NULL; + hdtrarray[1].iov_len = 0; + break; + case 1: + hdtrarray[1] = hdtr->trailers[0]; + break; + default: + trailerlen = 0; + for (i = 0; i < hdtr->numtrailers; i++) { + trailerlen += hdtr->trailers[i].iov_len; + } + + /* XXX: BUHHH? wow, what a memory leak! */ + trailerbuf = hdtrarray[1].iov_base = apr_palloc(sock->cntxt, trailerlen); + hdtrarray[1].iov_len = trailerlen; + + for (i = 0; i < hdtr->numtrailers; i++) { + memcpy(trailerbuf, hdtr->trailers[i].iov_base, + hdtr->trailers[i].iov_len); + trailerbuf += hdtr->trailers[i].iov_len; + } + } + + do { + if (nbytes) { /* any bytes to send from the file? */ + rc = sendfile(sock->socketdes, /* socket */ + file->filedes, /* file descriptor to send */ + *offset, /* where in the file to start */ + nbytes, /* number of bytes to send from file */ + hdtrarray, /* Headers/footers */ + flags); /* undefined, set to 0 */ + } + else { /* we can't call sendfile() with no bytes to send from the file */ + rc = writev(sock->socketdes, hdtrarray, 2); + } + } while (rc == -1 && errno == EINTR); + + while (rc == -1 && + (errno == EAGAIN || errno == EWOULDBLOCK) && + apr_is_option_set(sock->netmask, APR_SO_TIMEOUT)) { + apr_status_t arv = apr_wait_for_io_or_timeout(NULL, sock, 0); + + if (arv != APR_SUCCESS) { + *len = 0; + return arv; + } + else { + do { + if (nbytes) { + rc = sendfile(sock->socketdes, /* socket */ + file->filedes, /* file descriptor to send */ + *offset, /* where in the file to start */ + nbytes, /* number of bytes to send from file */ + hdtrarray, /* Headers/footers */ + flags); /* undefined, set to 0 */ + } + else { /* we can't call sendfile() with no bytes to send from the file */ + rc = writev(sock->socketdes, hdtrarray, 2); + } + } while (rc == -1 && errno == EINTR); + } + } + + if (rc == -1) { + *len = 0; + return errno; + } + + /* Set len to the number of bytes written */ + *len = rc; + return APR_SUCCESS; +} +#elif defined(_AIX) || defined(__MVS__) +/* AIX and OS/390 have the same send_file() interface. + * + * subtle differences: + * AIX doesn't update the file ptr but OS/390 does + * + * availability (correctly determined by autoconf): + * + * AIX - version 4.3.2 with APAR IX85388, or version 4.3.3 and above + * OS/390 - V2R7 and above + */ +apr_status_t apr_socket_sendfile(apr_socket_t * sock, apr_file_t * file, + apr_hdtr_t * hdtr, apr_off_t * offset, + apr_size_t * len, apr_int32_t flags) +{ + int i, ptr, rv = 0; + void * hbuf=NULL, * tbuf=NULL; + apr_status_t arv; + struct sf_parms parms; + + if (!hdtr) { + hdtr = &no_hdtr; + } + + /* Ignore flags for now. */ + flags = 0; + + /* word to the wise: by default, AIX stores files sent by send_file() + * in the network buffer cache... there are supposedly scenarios + * where the most recent copy of the file won't be sent, but I can't + * recreate the potential problem, perhaps because of the way we + * use send_file()... if you suspect such a problem, try turning + * on the SF_SYNC_CACHE flag + */ + + /* AIX can also send the headers/footers as part of the system call */ + parms.header_length = 0; + if (hdtr && hdtr->numheaders) { + if (hdtr->numheaders == 1) { + parms.header_data = hdtr->headers[0].iov_base; + parms.header_length = hdtr->headers[0].iov_len; + } + else { + for (i = 0; i < hdtr->numheaders; i++) { + parms.header_length += hdtr->headers[i].iov_len; + } +#if 0 + /* Keepalives make apr_palloc a bad idea */ + hbuf = malloc(parms.header_length); +#else + /* but headers are small, so maybe we can hold on to the + * memory for the life of the socket... + */ + hbuf = apr_palloc(sock->cntxt, parms.header_length); +#endif + ptr = 0; + for (i = 0; i < hdtr->numheaders; i++) { + memcpy((char *)hbuf + ptr, hdtr->headers[i].iov_base, + hdtr->headers[i].iov_len); + ptr += hdtr->headers[i].iov_len; + } + parms.header_data = hbuf; + } + } + else parms.header_data = NULL; + parms.trailer_length = 0; + if (hdtr && hdtr->numtrailers) { + if (hdtr->numtrailers == 1) { + parms.trailer_data = hdtr->trailers[0].iov_base; + parms.trailer_length = hdtr->trailers[0].iov_len; + } + else { + for (i = 0; i < hdtr->numtrailers; i++) { + parms.trailer_length += hdtr->trailers[i].iov_len; + } +#if 0 + /* Keepalives make apr_palloc a bad idea */ + tbuf = malloc(parms.trailer_length); +#else + tbuf = apr_palloc(sock->cntxt, parms.trailer_length); +#endif + ptr = 0; + for (i = 0; i < hdtr->numtrailers; i++) { + memcpy((char *)tbuf + ptr, hdtr->trailers[i].iov_base, + hdtr->trailers[i].iov_len); + ptr += hdtr->trailers[i].iov_len; + } + parms.trailer_data = tbuf; + } + } + else { + parms.trailer_data = NULL; + } + + /* Whew! Headers and trailers set up. Now for the file data */ + + parms.file_descriptor = file->filedes; + parms.file_offset = *offset; + parms.file_bytes = *len; + + /* O.K. All set up now. Let's go to town */ + + if (sock->netmask & APR_INCOMPLETE_WRITE) { + sock->netmask &= ~APR_INCOMPLETE_WRITE; + goto do_select; + } + + do { + rv = send_file(&(sock->socketdes), /* socket */ + &(parms), /* all data */ + flags); /* flags */ + } while (rv == -1 && errno == EINTR); + + while (rv == -1 && + (errno == EAGAIN || errno == EWOULDBLOCK) && + apr_is_option_set(sock->netmask, APR_SO_TIMEOUT)) { +do_select: + arv = apr_wait_for_io_or_timeout(NULL, sock, 0); + if (arv != APR_SUCCESS) { + *len = 0; + return arv; + } + else { + do { + rv = send_file(&(sock->socketdes), /* socket */ + &(parms), /* all data */ + flags); /* flags */ + } while (rv == -1 && errno == EINTR); + } + } + + (*len) = parms.bytes_sent; + +#if 0 + /* Clean up after ourselves */ + if(hbuf) free(hbuf); + if(tbuf) free(tbuf); +#endif + + if (rv == -1) { + return errno; + } + + if (apr_is_option_set(sock->netmask, APR_SO_TIMEOUT) && + (parms.bytes_sent < (parms.file_bytes + parms.header_length + parms.trailer_length))) { + sock->netmask |= APR_INCOMPLETE_WRITE; + } + + return APR_SUCCESS; +} +#elif defined(__osf__) && defined (__alpha) +/* Tru64's sendfile implementation doesn't work, and we need to make sure that + * we don't use it until it is fixed. If it is used as it is now, it will + * hang the machine and the only way to fix it is a reboot. + */ +#elif defined(HAVE_SENDFILEV) +/* Solaris 8's sendfilev() interface + * + * SFV_FD_SELF refers to our memory space. + * + * Required Sparc patches (or newer): + * 111297-01, 108528-09, 109472-06, 109234-03, 108995-02, 111295-01, 109025-03, + * 108991-13 + * Required x86 patches (or newer): + * 111298-01, 108529-09, 109473-06, 109235-04, 108996-02, 111296-01, 109026-04, + * 108992-13 + */ +apr_status_t apr_socket_sendfile(apr_socket_t *sock, apr_file_t *file, + apr_hdtr_t *hdtr, apr_off_t *offset, + apr_size_t *len, apr_int32_t flags) +{ + apr_status_t rv, arv; + apr_size_t nbytes; + sendfilevec_t *sfv; + int vecs, curvec, i, repeat; + apr_size_t requested_len = 0; + + if (!hdtr) { + hdtr = &no_hdtr; + } + + /* Ignore flags for now. */ + flags = 0; + + /* Calculate how much space we need. */ + vecs = hdtr->numheaders + hdtr->numtrailers + 1; + sfv = apr_palloc(sock->cntxt, sizeof(sendfilevec_t) * vecs); + + curvec = 0; + + /* Add the headers */ + for (i = 0; i < hdtr->numheaders; i++, curvec++) { + sfv[curvec].sfv_fd = SFV_FD_SELF; + sfv[curvec].sfv_flag = 0; + sfv[curvec].sfv_off = (off_t)hdtr->headers[i].iov_base; + sfv[curvec].sfv_len = hdtr->headers[i].iov_len; + requested_len += sfv[curvec].sfv_len; + } + + /* If the len is 0, we skip the file. */ + if (*len) + { + sfv[curvec].sfv_fd = file->filedes; + sfv[curvec].sfv_flag = 0; + sfv[curvec].sfv_off = *offset; + sfv[curvec].sfv_len = *len; + requested_len += sfv[curvec].sfv_len; + + curvec++; + } + else { + vecs--; + } + + /* Add the footers */ + for (i = 0; i < hdtr->numtrailers; i++, curvec++) { + sfv[curvec].sfv_fd = SFV_FD_SELF; + sfv[curvec].sfv_flag = 0; + sfv[curvec].sfv_off = (off_t)hdtr->trailers[i].iov_base; + sfv[curvec].sfv_len = hdtr->trailers[i].iov_len; + requested_len += sfv[curvec].sfv_len; + } + + /* If the last write couldn't send all the requested data, + * wait for the socket to become writable before proceeding + */ + if (sock->netmask & APR_INCOMPLETE_WRITE) { + sock->netmask &= ~APR_INCOMPLETE_WRITE; + arv = apr_wait_for_io_or_timeout(NULL, sock, 0); + if (arv != APR_SUCCESS) { + *len = 0; + return arv; + } + } + + /* Actually do the sendfilev + * + * Solaris may return -1/EAGAIN even if it sent bytes on a non-block sock. + * + * If no bytes were originally sent (nbytes == 0) and we are on a TIMEOUT + * socket (which as far as the OS is concerned is a non-blocking socket), + * we want to retry after waiting for the other side to read the data (as + * determined by poll). Once it is clear to send, we want to retry + * sending the sendfilevec_t once more. + */ + arv = 0; + do { + /* Clear out the repeat */ + repeat = 0; + + /* socket, vecs, number of vecs, bytes written */ + rv = sendfilev(sock->socketdes, sfv, vecs, &nbytes); + + if (rv == -1 && errno == EAGAIN) { + if (nbytes) { + rv = 0; + } + else if (!arv && + apr_is_option_set(sock->netmask, APR_SO_TIMEOUT) == 1) { + apr_status_t t = apr_wait_for_io_or_timeout(NULL, sock, 0); + + if (t != APR_SUCCESS) { + *len = 0; + return t; + } + + arv = 1; + repeat = 1; + } + } + } while ((rv == -1 && errno == EINTR) || repeat); + + if (rv == -1) { + *len = 0; + return errno; + } + + /* Update how much we sent */ + *len = nbytes; + if (apr_is_option_set(sock->netmask, APR_SO_TIMEOUT) && + (*len < requested_len)) { + sock->netmask |= APR_INCOMPLETE_WRITE; + } + return APR_SUCCESS; +} +#else +#error APR has detected sendfile on your system, but nobody has written a +#error version of it for APR yet. To get past this, either write apr_sendfile +#error or change APR_HAS_SENDFILE in apr.h to 0. +#endif /* __linux__, __FreeBSD__, __HPUX__, _AIX, __MVS__, Tru64/OSF1 */ + +/* deprecated */ +apr_status_t apr_sendfile(apr_socket_t *sock, apr_file_t *file, + apr_hdtr_t *hdtr, apr_off_t *offset, apr_size_t *len, + apr_int32_t flags) +{ + return apr_socket_sendfile(sock, file, hdtr, offset, len, flags); +} + +#endif /* APR_HAS_SENDFILE */ + +/* deprecated */ +apr_status_t apr_send(apr_socket_t *sock, const char *buf, apr_size_t *len) +{ + return apr_socket_send(sock, buf, len); +} + +/* deprecated */ +#ifdef HAVE_WRITEV +apr_status_t apr_sendv(apr_socket_t * sock, const struct iovec *vec, + apr_int32_t nvec, apr_size_t *len) +{ + return apr_socket_sendv(sock, vec, nvec, len); +} +#endif + +/* deprecated */ +apr_status_t apr_sendto(apr_socket_t *sock, apr_sockaddr_t *where, + apr_int32_t flags, const char *buf, apr_size_t *len) +{ + return apr_socket_sendto(sock, where, flags, buf, len); +} + +/* deprecated */ +apr_status_t apr_recvfrom(apr_sockaddr_t *from, apr_socket_t *sock, + apr_int32_t flags, char *buf, + apr_size_t *len) +{ + return apr_socket_recvfrom(from, sock, flags, buf, len); +} + +/* deprecated */ +apr_status_t apr_recv(apr_socket_t *sock, char *buf, apr_size_t *len) +{ + return apr_socket_recv(sock, buf, len); +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/sendrecv.lo b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/sendrecv.lo new file mode 100644 index 00000000..efa524a6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/sendrecv.lo @@ -0,0 +1,12 @@ +# sendrecv.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/sendrecv.o' + +# Name of the non-PIC object. +non_pic_object='sendrecv.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/sendrecv.o b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/sendrecv.o new file mode 100644 index 0000000000000000000000000000000000000000..4584807f71fb00ef9667a4c2cfec43b5be0d0613 GIT binary patch literal 36736 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 E8{w(y-~a#s literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/sockaddr.c b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/sockaddr.c new file mode 100644 index 00000000..4ac965d7 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/sockaddr.c @@ -0,0 +1,985 @@ +/* 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. + */ + +#include "apr_arch_networkio.h" +#include "apr_strings.h" +#include "apr.h" +#include "apr_lib.h" +#include "apr_strings.h" +#include "apr_private.h" + +#if APR_HAVE_STDLIB_H +#include +#endif + +#define APR_WANT_STRFUNC +#include "apr_want.h" + +struct apr_ipsubnet_t { + int family; +#if APR_HAVE_IPV6 + apr_uint32_t sub[4]; /* big enough for IPv4 and IPv6 addresses */ + apr_uint32_t mask[4]; +#else + apr_uint32_t sub[1]; + apr_uint32_t mask[1]; +#endif +}; + +#if !defined(NETWARE) && !defined(WIN32) +#ifdef HAVE_SET_H_ERRNO +#define SET_H_ERRNO(newval) set_h_errno(newval) +#else +#define SET_H_ERRNO(newval) h_errno = (newval) +#endif +#else +#define SET_H_ERRNO(newval) +#endif + +#if APR_HAS_THREADS && !defined(GETHOSTBYNAME_IS_THREAD_SAFE) && \ + defined(HAVE_GETHOSTBYNAME_R) +/* This is the maximum size that may be returned from the reentrant + * gethostbyname_r function. If the system tries to use more, it + * should return ERANGE. + */ +#define GETHOSTBYNAME_BUFLEN 512 +#endif + +#ifdef _WIN32_WCE +/* XXX: BS solution. Need an HAVE_GETSERVBYNAME and actually + * do something here, to provide the obvious proto mappings. + */ +static void *getservbyname(const char *name, const char *proto) +{ + return NULL; +} +#endif + +static apr_status_t get_local_addr(apr_socket_t *sock) +{ + sock->local_addr->salen = sizeof(sock->local_addr->sa); + if (getsockname(sock->socketdes, (struct sockaddr *)&sock->local_addr->sa, + &sock->local_addr->salen) < 0) { + return apr_get_netos_error(); + } + else { + sock->local_port_unknown = sock->local_interface_unknown = 0; + /* XXX assumes sin_port and sin6_port at same offset */ + sock->local_addr->port = ntohs(sock->local_addr->sa.sin.sin_port); + return APR_SUCCESS; + } +} + +static apr_status_t get_remote_addr(apr_socket_t *sock) +{ + sock->remote_addr->salen = sizeof(sock->remote_addr->sa); + if (getpeername(sock->socketdes, (struct sockaddr *)&sock->remote_addr->sa, + &sock->remote_addr->salen) < 0) { + return apr_get_netos_error(); + } + else { + sock->remote_addr_unknown = 0; + /* XXX assumes sin_port and sin6_port at same offset */ + sock->remote_addr->port = ntohs(sock->remote_addr->sa.sin.sin_port); + return APR_SUCCESS; + } +} + +APR_DECLARE(apr_status_t) apr_sockaddr_port_set(apr_sockaddr_t *sockaddr, + apr_port_t port) +{ + sockaddr->port = port; + /* XXX IPv6: assumes sin_port and sin6_port at same offset */ + sockaddr->sa.sin.sin_port = htons(port); + return APR_SUCCESS; +} + +/* XXX assumes IPv4... I don't think this function is needed anyway + * since we have apr_sockaddr_info_get(), but we need to clean up Apache's + * listen.c a bit more first. + */ +APR_DECLARE(apr_status_t) apr_sockaddr_ip_set(apr_sockaddr_t *sockaddr, + const char *addr) +{ + apr_uint32_t ipaddr; + + if (!strcmp(addr, APR_ANYADDR)) { + sockaddr->sa.sin.sin_addr.s_addr = htonl(INADDR_ANY); + return APR_SUCCESS; + } + + ipaddr = inet_addr(addr); + if (ipaddr == (apr_uint32_t)-1) { +#ifdef WIN32 + return WSAEADDRNOTAVAIL; +#else + return errno; +#endif + } + + sockaddr->sa.sin.sin_addr.s_addr = ipaddr; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_sockaddr_port_get(apr_port_t *port, + apr_sockaddr_t *sockaddr) +{ + *port = sockaddr->port; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_sockaddr_ip_get(char **addr, + apr_sockaddr_t *sockaddr) +{ + *addr = apr_palloc(sockaddr->pool, sockaddr->addr_str_len); + apr_inet_ntop(sockaddr->family, + sockaddr->ipaddr_ptr, + *addr, + sockaddr->addr_str_len); +#if APR_HAVE_IPV6 + if (sockaddr->family == AF_INET6 && + IN6_IS_ADDR_V4MAPPED((struct in6_addr *)sockaddr->ipaddr_ptr)) { + /* This is an IPv4-mapped IPv6 address; drop the leading + * part of the address string so we're left with the familiar + * IPv4 format. + */ + *addr += strlen("::ffff:"); + } +#endif + return APR_SUCCESS; +} + +void apr_sockaddr_vars_set(apr_sockaddr_t *addr, int family, apr_port_t port) +{ + addr->family = family; + addr->sa.sin.sin_family = family; + if (port) { + /* XXX IPv6: assumes sin_port and sin6_port at same offset */ + addr->sa.sin.sin_port = htons(port); + addr->port = port; + } + + if (family == APR_INET) { + addr->salen = sizeof(struct sockaddr_in); + addr->addr_str_len = 16; + addr->ipaddr_ptr = &(addr->sa.sin.sin_addr); + addr->ipaddr_len = sizeof(struct in_addr); + } +#if APR_HAVE_IPV6 + else if (family == APR_INET6) { + addr->salen = sizeof(struct sockaddr_in6); + addr->addr_str_len = 46; + addr->ipaddr_ptr = &(addr->sa.sin6.sin6_addr); + addr->ipaddr_len = sizeof(struct in6_addr); + } +#endif +} + +APR_DECLARE(apr_status_t) apr_socket_addr_get(apr_sockaddr_t **sa, + apr_interface_e which, + apr_socket_t *sock) +{ + if (which == APR_LOCAL) { + if (sock->local_interface_unknown || sock->local_port_unknown) { + apr_status_t rv = get_local_addr(sock); + + if (rv != APR_SUCCESS) { + return rv; + } + } + *sa = sock->local_addr; + } + else if (which == APR_REMOTE) { + if (sock->remote_addr_unknown) { + apr_status_t rv = get_remote_addr(sock); + + if (rv != APR_SUCCESS) { + return rv; + } + } + *sa = sock->remote_addr; + } + else { + *sa = NULL; + return APR_EINVAL; + } + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_parse_addr_port(char **addr, + char **scope_id, + apr_port_t *port, + const char *str, + apr_pool_t *p) +{ + const char *ch, *lastchar; + int big_port; + apr_size_t addrlen; + + *addr = NULL; /* assume not specified */ + *scope_id = NULL; /* assume not specified */ + *port = 0; /* assume not specified */ + + /* First handle the optional port number. That may be all that + * is specified in the string. + */ + ch = lastchar = str + strlen(str) - 1; + while (ch >= str && apr_isdigit(*ch)) { + --ch; + } + + if (ch < str) { /* Entire string is the port. */ + big_port = atoi(str); + if (big_port < 1 || big_port > 65535) { + return APR_EINVAL; + } + *port = big_port; + return APR_SUCCESS; + } + + if (*ch == ':' && ch < lastchar) { /* host and port number specified */ + if (ch == str) { /* string starts with ':' -- bad */ + return APR_EINVAL; + } + big_port = atoi(ch + 1); + if (big_port < 1 || big_port > 65535) { + return APR_EINVAL; + } + *port = big_port; + lastchar = ch - 1; + } + + /* now handle the hostname */ + addrlen = lastchar - str + 1; + +/* XXX we don't really have to require APR_HAVE_IPV6 for this; + * just pass char[] for ipaddr (so we don't depend on struct in6_addr) + * and always define APR_INET6 + */ +#if APR_HAVE_IPV6 + if (*str == '[') { + const char *end_bracket = memchr(str, ']', addrlen); + struct in6_addr ipaddr; + const char *scope_delim; + + if (!end_bracket || end_bracket != lastchar) { + *port = 0; + return APR_EINVAL; + } + + /* handle scope id; this is the only context where it is allowed */ + scope_delim = memchr(str, '%', addrlen); + if (scope_delim) { + if (scope_delim == end_bracket - 1) { /* '%' without scope id */ + *port = 0; + return APR_EINVAL; + } + addrlen = scope_delim - str - 1; + *scope_id = apr_palloc(p, end_bracket - scope_delim); + memcpy(*scope_id, scope_delim + 1, end_bracket - scope_delim - 1); + (*scope_id)[end_bracket - scope_delim - 1] = '\0'; + } + else { + addrlen = addrlen - 2; /* minus 2 for '[' and ']' */ + } + + *addr = apr_palloc(p, addrlen + 1); + memcpy(*addr, + str + 1, + addrlen); + (*addr)[addrlen] = '\0'; + if (apr_inet_pton(AF_INET6, *addr, &ipaddr) != 1) { + *addr = NULL; + *scope_id = NULL; + *port = 0; + return APR_EINVAL; + } + } + else +#endif + { + /* XXX If '%' is not a valid char in a DNS name, we *could* check + * for bogus scope ids first. + */ + *addr = apr_palloc(p, addrlen + 1); + memcpy(*addr, str, addrlen); + (*addr)[addrlen] = '\0'; + } + return APR_SUCCESS; +} + +#if defined(HAVE_GETADDRINFO) + +static apr_status_t call_resolver(apr_sockaddr_t **sa, + const char *hostname, apr_int32_t family, + apr_port_t port, apr_int32_t flags, + apr_pool_t *p) +{ + struct addrinfo hints, *ai, *ai_list; + apr_sockaddr_t *prev_sa; + int error; + char *servname = NULL; + + memset(&hints, 0, sizeof(hints)); + hints.ai_family = family; + hints.ai_socktype = SOCK_STREAM; + if(hostname == NULL) { +#ifdef AI_PASSIVE + /* If hostname is NULL, assume we are trying to bind to all + * interfaces. */ + hints.ai_flags |= AI_PASSIVE; +#endif + /* getaddrinfo according to RFC 2553 must have either hostname + * or servname non-NULL. + */ +#ifdef _AIX + /* But current AIX getaddrinfo() doesn't like servname = "0"; + * the "1" won't hurt since we use the port parameter to fill + * in the returned socket addresses later + */ + if (!port) { + servname = "1"; + } + else +#endif + servname = apr_itoa(p, port); + } + error = getaddrinfo(hostname, servname, &hints, &ai_list); + if (error) { +#ifndef WIN32 + if (error == EAI_SYSTEM) { + return errno; + } + else +#endif + { + /* issues with representing this with APR's error scheme: + * glibc uses negative values for these numbers, perhaps so + * they don't conflict with h_errno values... Tru64 uses + * positive values which conflict with h_errno values + */ +#if defined(NEGATIVE_EAI) + error = -error; +#endif + return error + APR_OS_START_EAIERR; + } + } + + prev_sa = NULL; + ai = ai_list; + while (ai) { /* while more addresses to report */ + apr_sockaddr_t *new_sa; + + /* Ignore anything bogus: getaddrinfo in some old versions of + * glibc will return AF_UNIX entries for AF_UNSPEC+AI_PASSIVE + * lookups. */ + if (ai->ai_family != AF_INET && ai->ai_family != AF_INET6) { + ai = ai->ai_next; + continue; + } + + new_sa = apr_pcalloc(p, sizeof(apr_sockaddr_t)); + + new_sa->pool = p; + memcpy(&new_sa->sa, ai->ai_addr, ai->ai_addrlen); + apr_sockaddr_vars_set(new_sa, ai->ai_family, port); + + if (!prev_sa) { /* first element in new list */ + if (hostname) { + new_sa->hostname = apr_pstrdup(p, hostname); + } + *sa = new_sa; + } + else { + new_sa->hostname = prev_sa->hostname; + prev_sa->next = new_sa; + } + + prev_sa = new_sa; + ai = ai->ai_next; + } + freeaddrinfo(ai_list); + return APR_SUCCESS; +} + +static apr_status_t find_addresses(apr_sockaddr_t **sa, + const char *hostname, apr_int32_t family, + apr_port_t port, apr_int32_t flags, + apr_pool_t *p) +{ + if (flags & APR_IPV4_ADDR_OK) { + apr_status_t error = call_resolver(sa, hostname, AF_INET, port, flags, p); + +#if APR_HAVE_IPV6 + if (error) { + family = AF_INET6; /* try again */ + } + else +#endif + return error; + } +#if APR_HAVE_IPV6 + else if (flags & APR_IPV6_ADDR_OK) { + apr_status_t error = call_resolver(sa, hostname, AF_INET6, port, flags, p); + + if (error) { + family = AF_INET; /* try again */ + } + else { + return APR_SUCCESS; + } + } +#endif + + return call_resolver(sa, hostname, family, port, flags, p); +} + +#else /* end of HAVE_GETADDRINFO code */ + +static apr_status_t find_addresses(apr_sockaddr_t **sa, + const char *hostname, apr_int32_t family, + apr_port_t port, apr_int32_t flags, + apr_pool_t *p) +{ + struct hostent *hp; + apr_sockaddr_t *prev_sa; + int curaddr; +#if APR_HAS_THREADS && !defined(GETHOSTBYNAME_IS_THREAD_SAFE) && \ + defined(HAVE_GETHOSTBYNAME_R) && !defined(BEOS) +#ifdef GETHOSTBYNAME_R_HOSTENT_DATA + struct hostent_data hd; +#else + /* If you see ERANGE, that means GETHOSBYNAME_BUFLEN needs to be + * bumped. */ + char tmp[GETHOSTBYNAME_BUFLEN]; +#endif + int hosterror; +#endif + struct hostent hs; + struct in_addr ipaddr; + char *addr_list[2]; + const char *orig_hostname = hostname; + + if (hostname == NULL) { + /* if we are given a NULL hostname, assume '0.0.0.0' */ + hostname = "0.0.0.0"; + } + + if (*hostname >= '0' && *hostname <= '9' && + strspn(hostname, "0123456789.") == strlen(hostname)) { + + ipaddr.s_addr = inet_addr(hostname); + addr_list[0] = (char *)&ipaddr; + addr_list[1] = NULL; /* just one IP in list */ + hs.h_addr_list = (char **)addr_list; + hp = &hs; + } + else { +#if APR_HAS_THREADS && !defined(GETHOSTBYNAME_IS_THREAD_SAFE) && \ + defined(HAVE_GETHOSTBYNAME_R) && !defined(BEOS) +#if defined(GETHOSTBYNAME_R_HOSTENT_DATA) + /* AIX, HP/UX, D/UX et alia */ + gethostbyname_r(hostname, &hs, &hd); + hp = &hs; +#else +#if defined(GETHOSTBYNAME_R_GLIBC2) + /* Linux glibc2+ */ + gethostbyname_r(hostname, &hs, tmp, GETHOSTBYNAME_BUFLEN - 1, + &hp, &hosterror); +#else + /* Solaris, Irix et alia */ + hp = gethostbyname_r(hostname, &hs, tmp, GETHOSTBYNAME_BUFLEN - 1, + &hosterror); +#endif /* !defined(GETHOSTBYNAME_R_GLIBC2) */ + if (!hp) { + return (hosterror + APR_OS_START_SYSERR); + } +#endif /* !defined(GETHOSTBYNAME_R_HOSTENT_DATA) */ +#else + hp = gethostbyname(hostname); +#endif + + if (!hp) { +#ifdef WIN32 + return apr_get_netos_error(); +#else + return (h_errno + APR_OS_START_SYSERR); +#endif + } + } + + prev_sa = NULL; + curaddr = 0; + while (hp->h_addr_list[curaddr]) { + apr_sockaddr_t *new_sa = apr_pcalloc(p, sizeof(apr_sockaddr_t)); + + new_sa->pool = p; + new_sa->sa.sin.sin_addr = *(struct in_addr *)hp->h_addr_list[curaddr]; + apr_sockaddr_vars_set(new_sa, AF_INET, port); + + if (!prev_sa) { /* first element in new list */ + if (orig_hostname) { + new_sa->hostname = apr_pstrdup(p, orig_hostname); + } + *sa = new_sa; + } + else { + new_sa->hostname = prev_sa->hostname; + prev_sa->next = new_sa; + } + + prev_sa = new_sa; + ++curaddr; + } + + return APR_SUCCESS; +} + +#endif /* end of !HAVE_GETADDRINFO code */ + +APR_DECLARE(apr_status_t) apr_sockaddr_info_get(apr_sockaddr_t **sa, + const char *hostname, + apr_int32_t family, apr_port_t port, + apr_int32_t flags, apr_pool_t *p) +{ + apr_int32_t masked; + *sa = NULL; + + if ((masked = flags & (APR_IPV4_ADDR_OK | APR_IPV6_ADDR_OK))) { + if (!hostname || + family != AF_UNSPEC || + masked == (APR_IPV4_ADDR_OK | APR_IPV6_ADDR_OK)) { + return APR_EINVAL; + } +#if !APR_HAVE_IPV6 + if (flags & APR_IPV6_ADDR_OK) { + return APR_ENOTIMPL; + } +#endif + } +#if !APR_HAVE_IPV6 + /* What may happen is that APR is not IPv6-enabled, but we're still + * going to call getaddrinfo(), so we have to tell the OS we only + * want IPv4 addresses back since we won't know what to do with + * IPv6 addresses. + */ + if (family == APR_UNSPEC) { + family = APR_INET; + } +#endif + + return find_addresses(sa, hostname, family, port, flags, p); +} + +APR_DECLARE(apr_status_t) apr_getnameinfo(char **hostname, + apr_sockaddr_t *sockaddr, + apr_int32_t flags) +{ +#if defined(HAVE_GETNAMEINFO) + int rc; +#if defined(NI_MAXHOST) + char tmphostname[NI_MAXHOST]; +#else + char tmphostname[256]; +#endif + + /* don't know if it is portable for getnameinfo() to set h_errno; + * clear it then see if it was set */ + SET_H_ERRNO(0); + + /* default flags are NI_NAMREQD; otherwise, getnameinfo() will return + * a numeric address string if it fails to resolve the host name; + * that is *not* what we want here + * + * For IPv4-mapped IPv6 addresses, drop down to IPv4 before calling + * getnameinfo() to avoid getnameinfo bugs (MacOS X, glibc). + */ +#if APR_HAVE_IPV6 + if (sockaddr->family == AF_INET6 && + IN6_IS_ADDR_V4MAPPED(&sockaddr->sa.sin6.sin6_addr)) { + struct sockaddr_in tmpsa; + tmpsa.sin_family = AF_INET; + tmpsa.sin_port = 0; + tmpsa.sin_addr.s_addr = ((apr_uint32_t *)sockaddr->ipaddr_ptr)[3]; +#ifdef SIN6_LEN + tmpsa.sin_len = sizeof(tmpsa); +#endif + + rc = getnameinfo((const struct sockaddr *)&tmpsa, sizeof(tmpsa), + tmphostname, sizeof(tmphostname), NULL, 0, + flags != 0 ? flags : NI_NAMEREQD); + } + else +#endif + rc = getnameinfo((const struct sockaddr *)&sockaddr->sa, sockaddr->salen, + tmphostname, sizeof(tmphostname), NULL, 0, + flags != 0 ? flags : NI_NAMEREQD); + if (rc != 0) { + *hostname = NULL; + +#ifndef WIN32 + /* something went wrong. Look at the EAI_ error code */ + if (rc == EAI_SYSTEM) { + /* EAI_SYSTEM System error returned in errno. */ + /* IMHO, Implementations that set h_errno a simply broken. */ + if (h_errno) { /* for broken implementations which set h_errno */ + return h_errno + APR_OS_START_SYSERR; + } + else { /* "normal" case */ + return errno + APR_OS_START_SYSERR; + } + } + else +#endif + { +#if defined(NEGATIVE_EAI) + if (rc < 0) rc = -rc; +#endif + return rc + APR_OS_START_EAIERR; /* return the EAI_ error */ + } + } + *hostname = sockaddr->hostname = apr_pstrdup(sockaddr->pool, + tmphostname); + return APR_SUCCESS; +#else +#if APR_HAS_THREADS && !defined(GETHOSTBYADDR_IS_THREAD_SAFE) && \ + defined(HAVE_GETHOSTBYADDR_R) && !defined(BEOS) +#ifdef GETHOSTBYNAME_R_HOSTENT_DATA + struct hostent_data hd; +#else + char tmp[GETHOSTBYNAME_BUFLEN]; +#endif + int hosterror; + struct hostent hs, *hptr; + +#if defined(GETHOSTBYNAME_R_HOSTENT_DATA) + /* AIX, HP/UX, D/UX et alia */ + gethostbyaddr_r((char *)&sockaddr->sa.sin.sin_addr, + sizeof(struct in_addr), AF_INET, &hs, &hd); + hptr = &hs; +#else +#if defined(GETHOSTBYNAME_R_GLIBC2) + /* Linux glibc2+ */ + gethostbyaddr_r((char *)&sockaddr->sa.sin.sin_addr, + sizeof(struct in_addr), AF_INET, + &hs, tmp, GETHOSTBYNAME_BUFLEN - 1, &hptr, &hosterror); +#else + /* Solaris, Irix et alia */ + hptr = gethostbyaddr_r((char *)&sockaddr->sa.sin.sin_addr, + sizeof(struct in_addr), AF_INET, + &hs, tmp, GETHOSTBYNAME_BUFLEN, &hosterror); +#endif /* !defined(GETHOSTBYNAME_R_GLIBC2) */ + if (!hptr) { + *hostname = NULL; + return hosterror + APR_OS_START_SYSERR; + } +#endif /* !defined(GETHOSTBYNAME_R_HOSTENT_DATA) */ +#else + struct hostent *hptr; + hptr = gethostbyaddr((char *)&sockaddr->sa.sin.sin_addr, + sizeof(struct in_addr), AF_INET); +#endif + + if (hptr) { + *hostname = sockaddr->hostname = apr_pstrdup(sockaddr->pool, hptr->h_name); + return APR_SUCCESS; + } + *hostname = NULL; +#if defined(WIN32) + return apr_get_netos_error(); +#elif defined(OS2) + return h_errno; +#else + return h_errno + APR_OS_START_SYSERR; +#endif +#endif +} + +APR_DECLARE(apr_status_t) apr_getservbyname(apr_sockaddr_t *sockaddr, + const char *servname) +{ + struct servent *se; + + if (servname == NULL) + return APR_EINVAL; + + if ((se = getservbyname(servname, NULL)) != NULL){ + sockaddr->port = htons(se->s_port); + sockaddr->servname = apr_pstrdup(sockaddr->pool, servname); + sockaddr->sa.sin.sin_port = se->s_port; + return APR_SUCCESS; + } + return APR_ENOENT; +} + +#define V4MAPPED_EQUAL(a,b) \ +((a)->sa.sin.sin_family == AF_INET && \ + (b)->sa.sin.sin_family == AF_INET6 && \ + IN6_IS_ADDR_V4MAPPED((struct in6_addr *)(b)->ipaddr_ptr) && \ + !memcmp((a)->ipaddr_ptr, \ + &((struct in6_addr *)(b)->ipaddr_ptr)->s6_addr[12], \ + (a)->ipaddr_len)) + +APR_DECLARE(int) apr_sockaddr_equal(const apr_sockaddr_t *addr1, + const apr_sockaddr_t *addr2) +{ + if (addr1->ipaddr_len == addr2->ipaddr_len && + !memcmp(addr1->ipaddr_ptr, addr2->ipaddr_ptr, addr1->ipaddr_len)) { + return 1; + } +#if APR_HAVE_IPV6 + if (V4MAPPED_EQUAL(addr1, addr2)) { + return 1; + } + if (V4MAPPED_EQUAL(addr2, addr1)) { + return 1; + } +#endif + return 0; /* not equal */ +} + +static apr_status_t parse_network(apr_ipsubnet_t *ipsub, const char *network) +{ + /* legacy syntax for ip addrs: a.b.c. ==> a.b.c.0/24 for example */ + int shift; + char *s, *t; + int octet; + char buf[sizeof "255.255.255.255"]; + + if (strlen(network) < sizeof buf) { + strcpy(buf, network); + } + else { + return APR_EBADIP; + } + + /* parse components */ + s = buf; + ipsub->sub[0] = 0; + ipsub->mask[0] = 0; + shift = 24; + while (*s) { + t = s; + if (!apr_isdigit(*t)) { + return APR_EBADIP; + } + while (apr_isdigit(*t)) { + ++t; + } + if (*t == '.') { + *t++ = 0; + } + else if (*t) { + return APR_EBADIP; + } + if (shift < 0) { + return APR_EBADIP; + } + octet = atoi(s); + if (octet < 0 || octet > 255) { + return APR_EBADIP; + } + ipsub->sub[0] |= octet << shift; + ipsub->mask[0] |= 0xFFUL << shift; + s = t; + shift -= 8; + } + ipsub->sub[0] = ntohl(ipsub->sub[0]); + ipsub->mask[0] = ntohl(ipsub->mask[0]); + ipsub->family = AF_INET; + return APR_SUCCESS; +} + +/* return values: + * APR_EINVAL not an IP address; caller should see if it is something else + * APR_BADIP IP address portion is is not valid + * APR_BADMASK mask portion is not valid + */ + +static apr_status_t parse_ip(apr_ipsubnet_t *ipsub, const char *ipstr, int network_allowed) +{ + /* supported flavors of IP: + * + * . IPv6 numeric address string (e.g., "fe80::1") + * + * IMPORTANT: Don't store IPv4-mapped IPv6 address as an IPv6 address. + * + * . IPv4 numeric address string (e.g., "127.0.0.1") + * + * . IPv4 network string (e.g., "9.67") + * + * IMPORTANT: This network form is only allowed if network_allowed is on. + */ + int rc; + +#if APR_HAVE_IPV6 + rc = apr_inet_pton(AF_INET6, ipstr, ipsub->sub); + if (rc == 1) { + if (IN6_IS_ADDR_V4MAPPED((struct in6_addr *)ipsub->sub)) { + /* apr_ipsubnet_test() assumes that we don't create IPv4-mapped IPv6 + * addresses; this of course forces the user to specify IPv4 addresses + * in a.b.c.d style instead of ::ffff:a.b.c.d style. + */ + return APR_EBADIP; + } + ipsub->family = AF_INET6; + } + else +#endif + { + rc = apr_inet_pton(AF_INET, ipstr, ipsub->sub); + if (rc == 1) { + ipsub->family = AF_INET; + } + } + if (rc != 1) { + if (network_allowed) { + return parse_network(ipsub, ipstr); + } + else { + return APR_EBADIP; + } + } + return APR_SUCCESS; +} + +static int looks_like_ip(const char *ipstr) +{ + if (strchr(ipstr, ':')) { + /* definitely not a hostname; assume it is intended to be an IPv6 address */ + return 1; + } + + /* simple IPv4 address string check */ + while ((*ipstr == '.') || apr_isdigit(*ipstr)) + ipstr++; + return (*ipstr == '\0'); +} + +static void fix_subnet(apr_ipsubnet_t *ipsub) +{ + /* in case caller specified more bits in network address than are + * valid according to the mask, turn off the extra bits + */ + int i; + + for (i = 0; i < sizeof ipsub->mask / sizeof(apr_int32_t); i++) { + ipsub->sub[i] &= ipsub->mask[i]; + } +} + +/* be sure not to store any IPv4 address as a v4-mapped IPv6 address */ +APR_DECLARE(apr_status_t) apr_ipsubnet_create(apr_ipsubnet_t **ipsub, const char *ipstr, + const char *mask_or_numbits, apr_pool_t *p) +{ + apr_status_t rv; + char *endptr; + long bits, maxbits = 32; + + /* filter out stuff which doesn't look remotely like an IP address; this helps + * callers like mod_access which have a syntax allowing hostname or IP address; + * APR_EINVAL tells the caller that it was probably not intended to be an IP + * address + */ + if (!looks_like_ip(ipstr)) { + return APR_EINVAL; + } + + *ipsub = apr_pcalloc(p, sizeof(apr_ipsubnet_t)); + + /* assume ipstr is an individual IP address, not a subnet */ + memset((*ipsub)->mask, 0xFF, sizeof (*ipsub)->mask); + + rv = parse_ip(*ipsub, ipstr, mask_or_numbits == NULL); + if (rv != APR_SUCCESS) { + return rv; + } + + if (mask_or_numbits) { +#if APR_HAVE_IPV6 + if ((*ipsub)->family == AF_INET6) { + maxbits = 128; + } +#endif + bits = strtol(mask_or_numbits, &endptr, 10); + if (*endptr == '\0' && bits > 0 && bits <= maxbits) { + /* valid num-bits string; fill in mask appropriately */ + int cur_entry = 0; + apr_int32_t cur_bit_value; + + memset((*ipsub)->mask, 0, sizeof (*ipsub)->mask); + while (bits > 32) { + (*ipsub)->mask[cur_entry] = 0xFFFFFFFF; /* all 32 bits */ + bits -= 32; + ++cur_entry; + } + cur_bit_value = 0x80000000; + while (bits) { + (*ipsub)->mask[cur_entry] |= cur_bit_value; + --bits; + cur_bit_value /= 2; + } + (*ipsub)->mask[cur_entry] = htonl((*ipsub)->mask[cur_entry]); + } + else if (apr_inet_pton(AF_INET, mask_or_numbits, (*ipsub)->mask) == 1 && + (*ipsub)->family == AF_INET) { + /* valid IPv4 netmask */ + } + else { + return APR_EBADMASK; + } + } + + fix_subnet(*ipsub); + + return APR_SUCCESS; +} + +APR_DECLARE(int) apr_ipsubnet_test(apr_ipsubnet_t *ipsub, apr_sockaddr_t *sa) +{ +#if APR_HAVE_IPV6 + /* XXX This line will segv on Win32 build with APR_HAVE_IPV6, + * but without the IPV6 drivers installed. + */ + if (sa->sa.sin.sin_family == AF_INET) { + if (ipsub->family == AF_INET && + ((sa->sa.sin.sin_addr.s_addr & ipsub->mask[0]) == ipsub->sub[0])) { + return 1; + } + } + else if (IN6_IS_ADDR_V4MAPPED((struct in6_addr *)sa->ipaddr_ptr)) { + if (ipsub->family == AF_INET && + (((apr_uint32_t *)sa->ipaddr_ptr)[3] & ipsub->mask[0]) == ipsub->sub[0]) { + return 1; + } + } + else { + apr_uint32_t *addr = (apr_uint32_t *)sa->ipaddr_ptr; + + if ((addr[0] & ipsub->mask[0]) == ipsub->sub[0] && + (addr[1] & ipsub->mask[1]) == ipsub->sub[1] && + (addr[2] & ipsub->mask[2]) == ipsub->sub[2] && + (addr[3] & ipsub->mask[3]) == ipsub->sub[3]) { + return 1; + } + } +#else + if ((sa->sa.sin.sin_addr.s_addr & ipsub->mask[0]) == ipsub->sub[0]) { + return 1; + } +#endif /* APR_HAVE_IPV6 */ + return 0; /* no match */ +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/sockaddr.lo b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/sockaddr.lo new file mode 100644 index 00000000..e601fa5e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/sockaddr.lo @@ -0,0 +1,12 @@ +# sockaddr.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/sockaddr.o' + +# Name of the non-PIC object. +non_pic_object='sockaddr.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/sockaddr.o b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/sockaddr.o new file mode 100644 index 0000000000000000000000000000000000000000..d4bd43ee0881c17c069ab6499ff29701af2f3230 GIT binary patch literal 51472 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

    #_*5L#}SLvDw9nWW93NGDR;CsRPE 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 QkE?W?#^paXob%QH0gO~d>;M1& literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/sockets.c b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/sockets.c new file mode 100644 index 00000000..6510388e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/sockets.c @@ -0,0 +1,422 @@ +/* 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. + */ + +#include "apr_arch_networkio.h" +#include "apr_network_io.h" +#include "apr_strings.h" +#include "apr_support.h" +#include "apr_portable.h" +#include "apr_arch_inherit.h" + +#if defined(BEOS) && !defined(BEOS_BONE) +#define close closesocket +#endif + +static char generic_inaddr_any[16] = {0}; /* big enough for IPv4 or IPv6 */ + +static apr_status_t socket_cleanup(void *sock) +{ + apr_socket_t *thesocket = sock; + + if (close(thesocket->socketdes) == 0) { + thesocket->socketdes = -1; + return APR_SUCCESS; + } + else { + return errno; + } +} + +static void set_socket_vars(apr_socket_t *sock, int family, int type, int protocol) +{ + sock->type = type; + sock->protocol = protocol; + apr_sockaddr_vars_set(sock->local_addr, family, 0); + apr_sockaddr_vars_set(sock->remote_addr, family, 0); + sock->netmask = 0; +#if defined(BEOS) && !defined(BEOS_BONE) + /* BeOS pre-BONE has TCP_NODELAY on by default and it can't be + * switched off! + */ + sock->netmask |= APR_TCP_NODELAY; +#endif +} + +static void alloc_socket(apr_socket_t **new, apr_pool_t *p) +{ + *new = (apr_socket_t *)apr_pcalloc(p, sizeof(apr_socket_t)); + (*new)->cntxt = p; + (*new)->local_addr = (apr_sockaddr_t *)apr_pcalloc((*new)->cntxt, + sizeof(apr_sockaddr_t)); + (*new)->local_addr->pool = p; + (*new)->remote_addr = (apr_sockaddr_t *)apr_pcalloc((*new)->cntxt, + sizeof(apr_sockaddr_t)); + (*new)->remote_addr->pool = p; +} + +apr_status_t apr_socket_protocol_get(apr_socket_t *sock, int *protocol) +{ + *protocol = sock->protocol; + return APR_SUCCESS; +} + +apr_status_t apr_socket_create_ex(apr_socket_t **new, int ofamily, int type, + int protocol, apr_pool_t *cont) +{ + int family = ofamily; + + if (family == APR_UNSPEC) { +#if APR_HAVE_IPV6 + family = APR_INET6; +#else + family = APR_INET; +#endif + } + + alloc_socket(new, cont); + + (*new)->socketdes = socket(family, type, protocol); + +#if APR_HAVE_IPV6 + if ((*new)->socketdes < 0 && ofamily == APR_UNSPEC) { + family = APR_INET; + (*new)->socketdes = socket(family, type, protocol); + } +#endif + + if ((*new)->socketdes < 0) { + return errno; + } + set_socket_vars(*new, family, type, protocol); + + (*new)->timeout = -1; + (*new)->inherit = 0; + apr_pool_cleanup_register((*new)->cntxt, (void *)(*new), socket_cleanup, + socket_cleanup); + return APR_SUCCESS; +} + +apr_status_t apr_socket_create(apr_socket_t **new, int family, int type, + apr_pool_t *cont) +{ + return apr_socket_create_ex(new, family, type, 0, cont); +} + +apr_status_t apr_socket_shutdown(apr_socket_t *thesocket, + apr_shutdown_how_e how) +{ + return (shutdown(thesocket->socketdes, how) == -1) ? errno : APR_SUCCESS; +} + +apr_status_t apr_socket_close(apr_socket_t *thesocket) +{ + return apr_pool_cleanup_run(thesocket->cntxt, thesocket, socket_cleanup); +} + +apr_status_t apr_socket_bind(apr_socket_t *sock, apr_sockaddr_t *sa) +{ + if (bind(sock->socketdes, + (struct sockaddr *)&sa->sa, sa->salen) == -1) { + return errno; + } + else { + sock->local_addr = sa; + /* XXX IPv6 - this assumes sin_port and sin6_port at same offset */ + if (sock->local_addr->sa.sin.sin_port == 0) { /* no need for ntohs() when comparing w/ 0 */ + sock->local_port_unknown = 1; /* kernel got us an ephemeral port */ + } + return APR_SUCCESS; + } +} + +apr_status_t apr_socket_listen(apr_socket_t *sock, apr_int32_t backlog) +{ + if (listen(sock->socketdes, backlog) == -1) + return errno; + else + return APR_SUCCESS; +} + +apr_status_t apr_socket_accept(apr_socket_t **new, apr_socket_t *sock, + apr_pool_t *connection_context) +{ + alloc_socket(new, connection_context); + set_socket_vars(*new, sock->local_addr->sa.sin.sin_family, SOCK_STREAM, sock->protocol); + +#ifndef HAVE_POLL + (*new)->connected = 1; +#endif + (*new)->timeout = -1; + + (*new)->socketdes = accept(sock->socketdes, + (struct sockaddr *)&(*new)->remote_addr->sa, + &(*new)->remote_addr->salen); + + if ((*new)->socketdes < 0) { + return errno; + } +#ifdef TPF + if ((*new)->socketdes == 0) { + /* 0 is an invalid socket for TPF */ + return APR_EINTR; + } +#endif + + *(*new)->local_addr = *sock->local_addr; + + /* The above assignment just overwrote the pool entry. Setting the local_addr + pool for the accepted socket back to what it should be. Otherwise all + allocations for this socket will come from a server pool that is not + freed until the process goes down.*/ + (*new)->local_addr->pool = connection_context; + + /* fix up any pointers which are no longer valid */ + if (sock->local_addr->sa.sin.sin_family == AF_INET) { + (*new)->local_addr->ipaddr_ptr = &(*new)->local_addr->sa.sin.sin_addr; + } +#if APR_HAVE_IPV6 + else if (sock->local_addr->sa.sin.sin_family == AF_INET6) { + (*new)->local_addr->ipaddr_ptr = &(*new)->local_addr->sa.sin6.sin6_addr; + } +#endif + (*new)->remote_addr->port = ntohs((*new)->remote_addr->sa.sin.sin_port); + if (sock->local_port_unknown) { + /* not likely for a listening socket, but theoretically possible :) */ + (*new)->local_port_unknown = 1; + } + +#if APR_TCP_NODELAY_INHERITED + if (apr_is_option_set(sock->netmask, APR_TCP_NODELAY) == 1) { + apr_set_option(&(*new)->netmask, APR_TCP_NODELAY, 1); + } +#endif /* TCP_NODELAY_INHERITED */ +#if APR_O_NONBLOCK_INHERITED + if (apr_is_option_set(sock->netmask, APR_SO_NONBLOCK) == 1) { + apr_set_option(&(*new)->netmask, APR_SO_NONBLOCK, 1); + } +#endif /* APR_O_NONBLOCK_INHERITED */ + + if (sock->local_interface_unknown || + !memcmp(sock->local_addr->ipaddr_ptr, + generic_inaddr_any, + sock->local_addr->ipaddr_len)) { + /* If the interface address inside the listening socket's local_addr wasn't + * up-to-date, we don't know local interface of the connected socket either. + * + * If the listening socket was not bound to a specific interface, we + * don't know the local_addr of the connected socket. + */ + (*new)->local_interface_unknown = 1; + } + + (*new)->inherit = 0; + apr_pool_cleanup_register((*new)->cntxt, (void *)(*new), socket_cleanup, + socket_cleanup); + return APR_SUCCESS; +} + +apr_status_t apr_socket_connect(apr_socket_t *sock, apr_sockaddr_t *sa) +{ + int rc; + + do { + rc = connect(sock->socketdes, + (const struct sockaddr *)&sa->sa.sin, + sa->salen); + } while (rc == -1 && errno == EINTR); + + /* we can see EINPROGRESS the first time connect is called on a non-blocking + * socket; if called again, we can see EALREADY + */ + if (rc == -1 && (errno == EINPROGRESS || errno == EALREADY) && + apr_is_option_set(sock->netmask, APR_SO_TIMEOUT)) { + rc = apr_wait_for_io_or_timeout(NULL, sock, 0); + if (rc != APR_SUCCESS) { + return rc; + } + +#ifdef SO_ERROR + { + int error; + apr_socklen_t len = sizeof(error); + if ((rc = getsockopt(sock->socketdes, SOL_SOCKET, SO_ERROR, + (char *)&error, &len)) < 0) { + return errno; + } + if (error) { + return error; + } + } +#endif /* SO_ERROR */ + } + + if (rc == -1 && errno != EISCONN) { + return errno; + } + + sock->remote_addr = sa; + if (sock->local_addr->port == 0) { + /* connect() got us an ephemeral port */ + sock->local_port_unknown = 1; + } + if (!memcmp(sock->local_addr->ipaddr_ptr, + generic_inaddr_any, + sock->local_addr->ipaddr_len)) { + /* not bound to specific local interface; connect() had to assign + * one for the socket + */ + sock->local_interface_unknown = 1; + } +#ifndef HAVE_POLL + sock->connected=1; +#endif + return APR_SUCCESS; +} + +apr_status_t apr_socket_data_get(void **data, const char *key, apr_socket_t *sock) +{ + sock_userdata_t *cur = sock->userdata; + + *data = NULL; + + while (cur) { + if (!strcmp(cur->key, key)) { + *data = cur->data; + break; + } + cur = cur->next; + } + + return APR_SUCCESS; +} + +apr_status_t apr_socket_data_set(apr_socket_t *sock, void *data, const char *key, + apr_status_t (*cleanup) (void *)) +{ + sock_userdata_t *new = apr_palloc(sock->cntxt, sizeof(sock_userdata_t)); + + new->key = apr_pstrdup(sock->cntxt, key); + new->data = data; + new->next = sock->userdata; + sock->userdata = new; + + if (cleanup) { + apr_pool_cleanup_register(sock->cntxt, data, cleanup, cleanup); + } + + return APR_SUCCESS; +} + +apr_status_t apr_os_sock_get(apr_os_sock_t *thesock, apr_socket_t *sock) +{ + *thesock = sock->socketdes; + return APR_SUCCESS; +} + +apr_status_t apr_os_sock_make(apr_socket_t **apr_sock, + apr_os_sock_info_t *os_sock_info, + apr_pool_t *cont) +{ + alloc_socket(apr_sock, cont); +#ifdef APR_ENABLE_FOR_1_0 /* no protocol field yet */ + set_socket_vars(*apr_sock, os_sock_info->family, os_sock_info->type, os_sock_info->protocol); +#else + set_socket_vars(*apr_sock, os_sock_info->family, os_sock_info->type, 0); +#endif + (*apr_sock)->timeout = -1; + (*apr_sock)->socketdes = *os_sock_info->os_sock; + if (os_sock_info->local) { + memcpy(&(*apr_sock)->local_addr->sa.sin, + os_sock_info->local, + (*apr_sock)->local_addr->salen); + /* XXX IPv6 - this assumes sin_port and sin6_port at same offset */ + (*apr_sock)->local_addr->port = ntohs((*apr_sock)->local_addr->sa.sin.sin_port); + } + else { + (*apr_sock)->local_port_unknown = (*apr_sock)->local_interface_unknown = 1; + } + if (os_sock_info->remote) { +#ifndef HAVE_POLL + (*apr_sock)->connected = 1; +#endif + memcpy(&(*apr_sock)->remote_addr->sa.sin, + os_sock_info->remote, + (*apr_sock)->remote_addr->salen); + /* XXX IPv6 - this assumes sin_port and sin6_port at same offset */ + (*apr_sock)->remote_addr->port = ntohs((*apr_sock)->remote_addr->sa.sin.sin_port); + } + else { + (*apr_sock)->remote_addr_unknown = 1; + } + + (*apr_sock)->inherit = 0; + apr_pool_cleanup_register((*apr_sock)->cntxt, (void *)(*apr_sock), + socket_cleanup, socket_cleanup); + return APR_SUCCESS; +} + +apr_status_t apr_os_sock_put(apr_socket_t **sock, apr_os_sock_t *thesock, + apr_pool_t *cont) +{ + /* XXX Bogus assumption that *sock points at anything legit */ + if ((*sock) == NULL) { + alloc_socket(sock, cont); + /* XXX IPv6 figure out the family here! */ + /* XXX figure out the actual socket type here */ + /* *or* just decide that apr_os_sock_put() has to be told the family and type */ + set_socket_vars(*sock, APR_INET, SOCK_STREAM, 0); + (*sock)->timeout = -1; + } + (*sock)->local_port_unknown = (*sock)->local_interface_unknown = 1; + (*sock)->remote_addr_unknown = 1; + (*sock)->socketdes = *thesock; + return APR_SUCCESS; +} + +APR_IMPLEMENT_INHERIT_SET(socket, inherit, cntxt, socket_cleanup) + +APR_IMPLEMENT_INHERIT_UNSET(socket, inherit, cntxt, socket_cleanup) + +/* deprecated */ +apr_status_t apr_shutdown(apr_socket_t *thesocket, apr_shutdown_how_e how) +{ + return apr_socket_shutdown(thesocket, how); +} + +/* deprecated */ +apr_status_t apr_bind(apr_socket_t *sock, apr_sockaddr_t *sa) +{ + return apr_socket_bind(sock, sa); +} + +/* deprecated */ +apr_status_t apr_listen(apr_socket_t *sock, apr_int32_t backlog) +{ + return apr_socket_listen(sock, backlog); +} + +/* deprecated */ +apr_status_t apr_accept(apr_socket_t **new, apr_socket_t *sock, + apr_pool_t *connection_context) +{ + return apr_socket_accept(new, sock, connection_context); +} + +/* deprecated */ +apr_status_t apr_connect(apr_socket_t *sock, apr_sockaddr_t *sa) +{ + return apr_socket_connect(sock, sa); +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/sockets.lo b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/sockets.lo new file mode 100644 index 00000000..02c9a22e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/sockets.lo @@ -0,0 +1,12 @@ +# sockets.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/sockets.o' + +# Name of the non-PIC object. +non_pic_object='sockets.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/sockets.o b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/sockets.o new file mode 100644 index 0000000000000000000000000000000000000000..c4cc3fb709de452567dd082bec1efdaf20dbb7a6 GIT binary patch literal 39832 zcmb__3w%_?_5Z!Qd8{NROArWxvM4B`YWEDn44F*7`sZU+_O?=A3(HXE(P0&*wMF-ZS4h zbIzGFXC8OaP)8J$pvkW`Os9|I`+H{E^ON>DJ=M{ZE2G8ZV>MzyX8#$M z#v)5&&41T8B>x4WFtWhXH$PH7KHD303XR@qNwzmKF;=lRvKyLO`l!_Gur#|Z&8GlW z9(h_cw)D_0y|Dl}LPPR*N!9a?l=khDZLN%i#(O|FsP%x_rOQgsd$u)mY&rO7ORu>b zocizr;nz)f965S4b8LxGk^d%2>H7~l&36O}lQK75CkoetV+`rxzW*cvSJHutp+J+j zSjv0Rk|!J@X0Yf1I7aSA>8!y3P~%4`ue06{9?F-*c{|%g|}EK30zY z*d_S;cZJ-7SQ<5+%^bTP`S+B$jzU_>`RF`%Bqe_rWM%!*hSK`d$ZHVv-`7PBdi(yJ z-G3;v{~@SZ9oZeJ9-qGdU*8=)8U?}|T?T#r&!>h!S>#2bCsO7@6ifToxs2WlZ{(fF zvAjI;UgYil9#HI!Rv5nl#PCL5^hT$9_moUTdmzO2l$0PYTiW+rcK$95htg%wMqWfU z4k#1)kqI?`vd0nhMlUg<^IZMA)@~Pdqv(@ts>?=CBcrRMtI+7kJ7h5mDveaQKKc#$ zr!w+<{tE|C2gMC^1p708Z{Ojg;Z&)`9eEjj|19>N(tqB_5pQ(%V<A&J(YXP$IBkt z((UnXsVNo)mBO3>U0q>By{`TjGA}O#8Qy3WOd~LTM2C7K5Vo~0Z=?p8YTacI}xrE;hG26Jh)DW>vXu5z_kRfUbuSUS_9V_RK^;rBNH0IHuC@Xa=OJ%1*cn~xeG(Z3OaHF$lOH`K?F27u zsTq&^+wDEDP~tKDE5bcCo=O|4w{&?*>nkH)$WVe2`OzqQzL537 z#n1MAlN4?$jnc}c^JM?N~r8hJb*s3G%R!81r&&vr2l%0=L zgf+iM=ei=P%6x0h4>T}0e+7-M8xsv?!%7WN zb`(5ow+A)tDG~9qr$o+P{fELg?kSm$9sJR+Wmmz*31%H{G}Q~k?TlD{VvRN!I9<>< zv(_V+u=e*JLKn=)e?d%DPvWG%|Fy%2IoT5*{fg%A=;D$`M*zd2-L8=H+19OjyS{n` zvS#?;h8OV)cECJzB(fM{f3|3*n5$tvOBddQ2u#PI=Jio71$KJ}lOH;`;XMe{Bk}TK z3W=9)t=GEz|C2m4l+*L04FiXmVYskE;`hD};rdL;VY-lVIK(#9kt8oJc`;LDSu$Rn zNy!~uA;aMkIibMWcRmzIaubpcSuxp_;<^H}Qh;Rm?F{BkdTox)tIA6rw+#w}?xa!K zDPX-Yj!YD^Q+y_g&t&nLB0h(R&-Lp)^6HjWrHm;6fyclEqHjdl zVWgqKbAe1>2gI>Pifbrjjs+UXYMWealPhd;6_8R*>cJaJzMk0sVXThqPPL-y@wZ z=_5#cBz+X=iDGnQ7$#=&WX2Sk=`!OGnG%^v5*e?|B#TUq%%q4+qs+L>bztFgnHgek zfK0p0qzgZF%ZyuOLNb$O`oV%;nHeEmyIy8Snw3zpQD(Bu%RpM6%#1N_fXwAGGr{Zz zwyiRgV{U}ZjWUxfGCO4^Ph{?pnS7DCPiCfwzIs$<3WRODWTw#kDd>3)4nZJg+$6do zJ7Xs{Qo8bIND_SuHkZ2LHtZfZboAMPrMR9=GUSAcW{U|GQS41I&EC!EFxm5&>z;%P z@IOp!C*r&&6ep#Q#R*R+P966skjxX#1)fZI>Z?Ox+7lxu_0Kl>`Zx=HBOgd34M!k? z!jeoQ4Xa~`$fp`)HA7p=Vq4e4}=w+rV=y5ks-A!B^#1xR}& zzVg=~XQHG7$e$E+C7XX+1qJXwnE%WYFj<)2 z=-&M=HsAfcZNB@(O~5G4cfW+R9G31sVr!+z?w3*3nBl=D!~Iv3BCU77xej1yjr;Ft zrL@Mq59xAYnfrYVbg!iUi7l@&GRL_0A~hn|(Pg+_!--r(gZp)y$RXkufC`WdbI-El zflt_+SPu7FKVmVn4 zAt_~MJ&fz3l#}&{SR;k5tVgk`^h4HfkRAh)7ehTM`Kc8^js(~+PrM8u^L@zU4GQGZ zno)xEAPV)iLNpzZh@%<{oufgAV3v6zg+|GR(=*k`6E)^rHAG(4$Wu^JBgIt*e51!; zZLR?JQV-biLsiB}VTN%lxO5gUpJX;TR>Nn#!&PI%lr9pbfHxW^ ztF;7gBlZJ!hjh;A%y1?V=75=Q7~?T#o-Vo#D9U2TVEW;#Wy_Ob>4#(sT3T!7*#==D z8pH+0geTacpy4#32TT}f18Y1lQPC-{6LBh*pQ{#4MC3FqpM(^qzlz|qvL9epwAY-A zp~?wHn@Hxstsw9Wq|Le5a$Z1@IM7u#3|WpQcS8aA&jT}*m1em+!PB<{$eE#|;Nxc8Bs|B!tm zI{QQJ?7W_4!#u!KkL92ebOoeOKzTkA=J&|s*yf$m>F+YkBe)%MY^%10^ygqHw9Cwg zP&5mmIlu}730SmA+VaL|I0QNl%tLRep2Rj!mAKMoOHmP2gRzUlR9R4_3LD3nsu$)V z2FV;a2;xNln&V8QF-^lA736VCg^A1AO@+YA@6x%N-KT~kQ2h1HJO~+4jqPSC0 zY0J`cg{5dDq!br!X{4D`V$5v8Vo2t|<8V_W&6py#R)}&QYh#jTPtnYtYQ89Lhzz4p z>~yACW?SyYt;9xP!cOwqF}Vheyh*~29~t(Njj<|wMy?syqp)%qXQ78tS&^^^j&OjU zik6vWG0n19+RWn&V+L{HCe&=;9Qqp8T3Nj^rusgt0LdKq<#6^wrOCrwdgW{r%P`4& zmB|CW7&n`oXj(JOMdoc_il>yyJcUf0PQ)axvJJdqh<(S)P@_=H5KF|3Fmga1rU*N4 zBv#jK4hQr8XLZ)tgIPqRDyS`0w`r>FyxoyFJzW4b)XhSzU5xY722l(voZijK;t@L$ zLD=38?vou9jOm~bveFzl3y!vB2L!ba3Yy}k12|=Q$m$>~EYa-IAOK~fT8PXqPNTp@Sm6jp>*7&hT<2}%&Qi;A=&O`xbze#coae9oqV+ zO`8Zd?6Mfc?D?l)Bzxep|J^XHC#02^C9twLfpp7CY=UOx6){%Yt$p2+bA@H)G_j?* z!sI=TB^UQ%Bv*R1o}I9D5b@LC{!NC#R$Dx7Jhqy=7+KPB+ml%O^@B*i){=g`C0%N} z-sC-pB_6jxiNy~LB7O+Wp3}tCI-te)fTr%JR*YNfa5ogI4q{qFI|cNugJ^9Bt+Elf zT3V)|%WjQ#8E%GRmC#XEF9@MyCApH1L9zDIIt$}|*d2IOCdoUIoQ-I@R~*XW?VGq= zE(+jcS%O7F*W%`*2z#z*G31Nz2*oJHqT{FFJ(Lh|T$4Dv!~MSCGUgzIOC0my3L~qE z`uJg#;Ya!r6L-u~Bi`*7iSLJuBEfYH-+_WizWywLT_y?hJVNBRgy!VWRaq2`2)VQJ2c(HTR{tW@_%*cXmB z($Z!D1gAbkLU1IFFq|1hX*1F)VaJdRXPhv>r{D$isY#|YBP|V!O~|??0`C~Obv$NR z3_j#oOU87lo@Sbr!;n9HoKZO}7m#Cz0Yfo_TLy6^R}MqY%#o%o-EB*OKt2Vk!gmB@ z9q_|wU{hg-nxs@54i#Op2`F@godvJwfTdV=>ZrIWXoDO94k;V$LE-{N2%-u zqp%sHPXSMlu?3++OR{g6BMMIdX{6i%PCoGjGk@4ZvteXo+POm8*kmJr*cdR&g9NgS zi)=KZd-8>gPP$^FX*jaC&4G#XWG;Z41KUQdG9d@pW7M8fK+;Z417&FCL?qz+1q)zv z53&qY0=J#9t%?zIhN1^7m~49k)#gZpuA4Io<>aP;)mf>iD-ZaTM#FbN977I}GDRtc z>{LsCGIm0Y{sPhu{fi2xkuxbG5sN)|ygLlFx4i?K^k zD|AURvdvTtiZN%F-H_R%FkWY?td+xxMVFUYAVigfN^=Y~a@io;I;#ncK{)2Lzca^f|OMi%sprLRU8bR_}I z>NH%9JD8sh5a55S=`ix*Dk3&my$7iPOt(nO&PFx?zo5nhT#~RqQ;9pqbmsp-)AgEY zrd~0T>0B?@va^OsHUfHCmz2QtZfaG()w%{Ie_=s&Ox{kA3_aTcl44m=t71Kqw^`64 zCRJJWaec$GF0(4uGRZO>MlhXeRaoty!kF7M7BZ<;To_mJKGOb(Wkmy%yDg}W$rlKc z-r?LEHY1aNjbYT?xQj|zEDU`nS!QDYe@YdH!?p_(Oe0MG$buFz*+-C+#kt39Mkb$% zVdUJ47GndG2P`OVmSEG4wOHzz#OEBOwRKFg4m7QP2j^_@aWfo?=jNJ5EtBgl@#itg zZAJ05J2>}*&B!EcmW-U^=7JI?ZPU(^jj=!DO!ko?|%a@G0hHoh-xw~OnVsfbE@j52i z4GyEoYWyu$n7qh>7BPv(8%)5e*heU#3D2nnb41RdzM!CfJNjPKsgV+@&_- zf48Ha?QmMP&SNr}Ag6K3@*SLEbI`c@9h^JWuFd3WYHiN2jj}f9Y>VU8ZZ_}dmgj1o zBJw#KI-Yc~KzM-c=#DuAc38I6TtH-x4gHwN4K}2E4IlKubeF}_z~o;n=sYH0CrI|5 ztZ9G7%c^Htdo5Xum{euO536`twJb}m7(X;_CQYwc8snDmeN^PrjUrf)+~ylf&W66BEn}OpYK(dYN-2HlwUzf3oY4ym=-el_TW0W zzReQXLT33JNf9mNj9o9Tg`W`r!NIkEsIeq!A@^{-6-W(CuC|~$CVL5zq06~DZAQHx z;>Fjq_%&9oMNG0l8M>V7vl#1{v^BX-KyBY zp`a~7uHSQ#_Kesh9`HLUa7+3g@oq2n7wn(%G>h zx2?H3o~0mXI@gz+EUe2P>VSW-V4Q~FT2esOjGUZY_&;GTx2dPOJvZFd(Q6pNK=Vp} zD45fXZ4HKcI=b4X=CoszLTkJIK}iNfEiL|5prPfm0^v}(simby<~q9I3P(y72Y3r= z!ml?0hkM1QZe)ZT7$AK9o}R9No$U?;I#C&whB{XHWe)t+fqb&QueGDo?-KxVf@jtQ zdRE3@*gPK<2wvEOqt5O?PpD}{CrL)rNHVwra#D-*fvqtZ?#6o3n&K7Vj?U2JjxO;~ z1=Tv?F4 z01HN7!3B-~$=FC4-8IB|~)g>ET}I>c^ZzLf2IFpMLHd*LnY# zQFX5Cvg%p&*Hn3LaSr*waensvd29Z5i)-fUUX;*=Vuyr!uL|E=nTvq4`!2k=#yZ??3b0gONi!7KdhTDw_4g{OMIy)w!+_u8v_#?(dsXb)IYZOm9_g zQQypbFL>+km!R`*cWhly@zj|M3J`i(Ko2^$y2>_$?{#*$a=dRi(;A&=Tc5b%^>Dj0 z?8>^-HPco8Jm`0%z*`-X%$rjjg<0koamb-zU%`Ke;h!TJW(l7!(Aw$?89pCI2#y$E zM|ZE!XZR`?_Z-O5bH8nT;yF*54%|c(Dx1qj#!Qyj#3oA;?4fwTD zp${vIV5V5>=xX=(bcB52t{}`2J|FUgf%PIk=1xYfvA5eS9gSzv$j%3y9!c*Tl9Ft@3@JGVU)>Ta1lB_}VZupl?s(~Pqi z2+FlbpPWvbI|D&~BJv;cj0~xJ&S_f#&*U4fFw63r&FG8wiJtE`M)Gst+}V!a*nyV^qv>zUDv| zG%RGa!F&fu0Guogv8)Mpv~~GgJkSk2ViJ=b)z#F~tuTV4B^%mrb!QW_1?Q%&fZeD5 zt`?E$1Z7|eIUPhbH+6y^!m=~-3ytLx53_Ad@!;UC-?(h-~`!!K^$1%QEHfPbyH8! zK;ecMcAi-6;0rOtVX+Dtovom9lWTsr&+GD!lrKFL-sGu2pE09M$tBP z3N&3TgwQl@ga{8b%ZD9LK`3Sgs*y+0ydzg}%~-^VDW`;MjnMvb%5tfk9>U zJ`PzsG@3%dOQWy@JcOZ)0~Q0IwP{sHr;K876^(gmA^Fz_Pp$g=GPa2u8(@#>E|>_L zAudF7n!461U54WXnQ3nI`C9zJn5b=nI90>8D`>C{=>55s)fJYzuq)vohmZ)nx_X$R z=c_EuB3|RC@x==(>nqSJ`C>SW+T~?sHNx6eO+739F!@j)L9nu80@UQ@t`K-kIu(o% zb85^|A?0IZDSE`R5o`{0!^Ww_=pDWXE$bNYl2=AF~vDf7SvIH$lfc~vOf<)7IG zYY_A%WN|Y$6SljP3!$*hGkL)j&*au%sHu77WNZse=m9w#yCL{m!rd6(Vg#)Kmd-$% z;ae>>eLSzhmJBK=QQ6X|c02}xXtQi0uRZ=Y9Ewm+_7F6XU5D5}Y?hUZ%=RfxJwE8MbG&SVXNc zLo=K;^MfB?qJsKrNO!~34l5|OTnxps>ID^z6=jx-VVD;}uLoL`z$e!7c?)64TXP+5 z-Ee0IVJMkK@1D53U*ALLhb%F2p76B|~9yFy_(c}$)X z7Ptb&4ULR#{)k<&~hfqgrZ9wWf|Fh&UqQ04#8Rq--Dn`FjJ({ z@Dup@91TMPg#jszL7+P7IE->2(W#U0L%O&jg@=i;pghBU9@#UVaIA+Z z5B^Oj>>LC{Tg$PnRT-Xk=@)41+_WmI-RS4e1oFLrZzB8wyo$C}VB5fMYTMZvdCqCz z@0i9_q&ezh8;5>+nPiFIMG9GSWBpVPep;z{r7EpXL$FJYiSW-ux99VKM%y+!pq-bZ z-}{o*h}M;hZ?~pHaW(O_5bu=^XvY@k*%_YA*hiNpmuBSkrGNnJ66ih~FQ>ZP z=cs#tuze`c_A$tF+yYK6%W#8}tI~v>e3;b{%L}pBX0cX6qp%;oAi0&u+mhjFp?*%M zCx7T0e8KA>Otc?(R}k-XjThTcod8>&01G9+F4r)$b3nt;Tq7sAb`>n$a1G(P4P4uq z>hX6r<%qpwj+ps!Rs@4ajzC-dE5dCs!@)9{Bk86UD|-B^IR}eh3};hMQ&$`8ScsW( ziYz$B^K&s6VB|ChR;}{Go+hUY_8&R0dzmcuBP7<}?rZJAySe|Ph#UOCAEYo z{Vas3e^ie;<{o{p~AdrQXT%itR^N=}U=n`956t=0U1sBWmjj-t{xxVAq&#`CK6T!uP?D(q`)-s~xIVW3 z82G2RKLD666Kg(8`aN2qmKDE1(lM<6ei?qk`l1=9^TN-_6WZ_IE~?Ad&j5+`r^7$p ze*6*wWpX=#6lt_qUacP`5YGDfifR(o574s#)Qwcz_7&H^h3Z=jL~M_Hwm=qeJ?4J| z2*ex=&~+!(zfX%lZa=d>0EFgZQ8bbK*G+=afADj|IR7E0sSx#R7K@AVw7giKy8Vf4 zN9G%s$to|?{4*S~!{8s=&+`w)WFr0T&9Xi}ODuD?|2aR{741qgK0BJI+$lUBU*b$? z3ECI$VVs^EiX8sZ3fqM^`(5lI0h>tpebgVPK^_y9n~Hq5K;?&1%vcIQq|>0sjF?5q{wy_(s69z|;H4|Lm!o2#d}e=S%${ z@&hD?ZwP7nH7+IGO@Yb&*+KYn!kPb3!n-vbzkEmg*K7D63E!&W_^Tx3->Kmr5YA6O zuwLc(Fy;#bJdltFkn)I~Xgy*_t&}EP6!94(ALn9KK7Z!ZAn#_+^(N1xT-gcCN|`spzwc2xNeV=4g!#0_1ieYk)KonWf-R@{CLaC z_B1KDYR}IG!5>%fiHe-}3D@=RSNKm+_-E196z#`7F5Ax5)GzC}vc8`MNSpmy=a}fM1!u5W^x29my`{ixIk-tE2$PawM2PR$4zZE&t zpq%ZQg^ZAN{<8^3y(<49WnADr2g@l|;&7~jn~I#N3f`pPcrU_oE>v(l>t=j|f_oHv zn}VOD;6GFF@d|#wf}g736js6y!~&)A-XE`s;oZYniVwVh#l(0f;W(#ZV*E~-l`p&n z8n$hsFA28ZXo~#mT}~b`upAygd|$`-Nb2Jkv)7c!ToXywU-}?WqcL!XHhxhd>?Y6hMz_DOww>4**{;y z|4MoGH_N|;>~GfiTW}(R#P1DZ{uyNFT8;lL!uefo%nz@=5ow#o&p!kGsfJIY@rCz) zm{<<~y8j6c|2665hmx7Un)JS=@pn_Z_G$PWit~>(e6BRZ_(sDoA^&HPJl6Yb;v1#m zNfdA6HT+(ZldIu(lKn**{wevVLc>3&e2s>Gfrdfib1SyBmQ(7w1aUn-{6PC8Go1LyrStnmnyua z;nT4qqz^T`jqr`sZ!G^&vgbMtXMgV0aQ5e~G@SkUu!gfgpVn~p=Sv#S{(N1-*`M!e zIQ#Qs4QGEI)^PTxliJOGV1H(4IQw&yhO<8>Xm~35na{ykKEKLhhQ?ol2eOd(xAx4x zmga#*jej%AZ_)5SQ-61B_=ALBtl@hIzg)w4e!N-3cauGL4uU_Z;Wv_%Ri!@&aHT)E5wy|Er|3P+c(Qy8&0yk;+ zU1ZPg8orPrpxl7Aeu{;)q65T2>w ziwGa1;mZi;HxRI#U4$2E{Ff45uHn4CR%!SI$}iUNXULz;8vY%{VL-#DQheW|;XJ;6 zqv4atPX4Jrw`&#k*UK9J#iaM|8oq_}eyZUeWdFAsK8*U2Ur)e#`J94Z4ZygAWiZy~)=4aYw%hUo?! zCw@MkVLLYyKmS;d@rk6Df4s-|ev-3SlYck)hkrKC{2erJAJO>VqW*T1Jm$ZP>=``> zeyWDE{Mj0wMfNmmcr7Y|)U4r~C2RyVJemBkPQ&pp%VFZ*ZL|H8sGZkn`~{TXq2WA^ z9?)>M=eHU@iN^aMG<+2K?F|jTko@p34QD&P(eSM#pML_*?MkD5A4UB*hWyI- zGV;$E8qV_1)bJ%_=Nt`Z`3)L=Dz$eh;bNs4#Tw3b_9*i4ywO4N(5vzD zxxrN$Kga)e1xIon*?F^qqkJBZcPKcLe1CDbf+IhV(?=8>N&H)nn4VB@cTB6}k5ZK2~t#FQs|)a|Ku9F z=`;mL{)@;?cyYH#%+GOtyn+k)#6OmB?#B`2w^B9SW}Ydr-lV|1j~(KSgTK5B#1<`KLqe^SZs{hX+Uw zx0k=kl>g=`>#WQ8d<@O?U<>gT(!EDiV;g31@yj zpUTzv+0L^R9PQ+nQOwfhl#t#<8qV?Aq{uHhVy%f zc4+dKlAVuect7F4Q{*6-gGwO%N#oy2{QuPW+0IWD97UMq|1T9B$uPy+Q3Xf-BH~Y? zhp@Q621xG-8h!`irxVWo{w4W&n#RA2_!lYss5eM@mnt}##_jSeIP&xU=>i2uem+MF zDLC>k!w*Pn3Fmg*OY_E!8vkD6zg@#mruqGDP0pLtuHS1op98+9;Uh@zCmNng^ZAgW z(q6Wc<9XyD_&5!pL~;rhoJ z%g>vRA)Nim@ph_$W4qjF6r?j0T-ZsScBXtHfs2>w12op!+9OtIS76~;T+Fbk(?(qetyT}s~SJgCvPh_`VIeB52p7O9OID3 z(SH;i`L`1PK?PUi_K1Qbzk~YEi4Pq@;(ocD>>s1y1B4e5&h7m~RyQg%ettgwJdL0C z+iePt_Oy^aotm6aN$(~N=YF|Lk%R5!*J59<@rwxu%J0_r*`7xg9PPP}?D?%GhtD@( zRrpbF4gACOw#Luro?mMGte5_zm@p6Z9w5ERbRfq4at=Bi(g_;QewZ`}K8(avcUPtBSfKgn6E@S}gOrTKi5#@|i+KhgME?`;Z>db>#P!y0}& z;g4(b!zBL=g&*y~*9T&HU*lg-{NHH&JWiA82XV-T_Ut3Q$7%Q|>hDp6b3gWz{6d8v z?cq1dmumc5iN8_fXM36z9PL?1dfOEo<@5blP{ENuO8mWqvz^zG-s=>8l+#c9kewR; zPU3$?;Yaz;k^DUhj&j)ky$X)}-xL4q3Xc4IpY@)CBYz?F(}#q!{l6f4(&)hn%%Yq| zvVR2O%zq#8PuBR^&glw{dIO|)o`&B+c(o><&;8db{Af=L+0(D^tNZ*bHU8yPxLw0n zU_&7NT*F(5|0xaUzcBGP4Zn=m$A4(}0V&@2R>ME1aeX{K%ngbCd>`$%XK47VgfG(Y z0IW4bvF<{W{zK4co8bPV9V0OEmln znopK%_yMxBSHqh~{?!`J-+$e!;eQ}M(?$51mPTO@ZCkB%T!8RVLUwVSGwvY*i-|=b zypA#6O@+N0Kd(DCYB-<6-=*Q7lAP~!ocfoak7m6F`E4Tg5954}SFGWDp4P45e13Jg zhV!`)KVQo7`J92D^JJXwmunD!#5mt4^7k-|^L@}xji2vdUea*hA0F0l-bcB~Pb^;q w0N62J!+F0^tl`UPe&cg@mc#3Bi^jj6_+*CYP^pXKZ%etv$Eah_NIALoRissI20 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/sockopt.c b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/sockopt.c new file mode 100644 index 00000000..039fda08 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/sockopt.c @@ -0,0 +1,393 @@ +/* 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. + */ + +#include "apr_arch_networkio.h" +#include "apr_strings.h" + + +static apr_status_t soblock(int sd) +{ +/* BeOS uses setsockopt at present for non blocking... */ +#ifndef BEOS + int fd_flags; + + fd_flags = fcntl(sd, F_GETFL, 0); +#if defined(O_NONBLOCK) + fd_flags &= ~O_NONBLOCK; +#elif defined(O_NDELAY) + fd_flags &= ~O_NDELAY; +#elif defined(FNDELAY) + fd_flags &= ~FNDELAY; +#else +#error Please teach APR how to make sockets blocking on your platform. +#endif + if (fcntl(sd, F_SETFL, fd_flags) == -1) { + return errno; + } +#else + int on = 0; + if (setsockopt(sd, SOL_SOCKET, SO_NONBLOCK, &on, sizeof(int)) < 0) + return errno; +#endif /* BEOS */ + return APR_SUCCESS; +} + +static apr_status_t sononblock(int sd) +{ +#ifndef BEOS + int fd_flags; + + fd_flags = fcntl(sd, F_GETFL, 0); +#if defined(O_NONBLOCK) + fd_flags |= O_NONBLOCK; +#elif defined(O_NDELAY) + fd_flags |= O_NDELAY; +#elif defined(FNDELAY) + fd_flags |= FNDELAY; +#else +#error Please teach APR how to make sockets non-blocking on your platform. +#endif + if (fcntl(sd, F_SETFL, fd_flags) == -1) { + return errno; + } +#else + int on = 1; + if (setsockopt(sd, SOL_SOCKET, SO_NONBLOCK, &on, sizeof(int)) < 0) + return errno; +#endif /* BEOS */ + return APR_SUCCESS; +} + + +apr_status_t apr_socket_timeout_set(apr_socket_t *sock, apr_interval_time_t t) +{ + apr_status_t stat; + + /* If our timeout is positive or zero and our last timeout was + * negative, then we need to ensure that we are non-blocking. + * Conversely, if our timeout is negative and we had a positive + * or zero timeout, we must make sure our socket is blocking. + * We want to avoid calling fcntl more than necessary on the socket, + */ + if (t >= 0 && sock->timeout < 0) { + if (apr_is_option_set(sock->netmask, APR_SO_NONBLOCK) != 1) { + if ((stat = sononblock(sock->socketdes)) != APR_SUCCESS) { + return stat; + } + apr_set_option(&sock->netmask, APR_SO_NONBLOCK, 1); + } + } + else if (t < 0 && sock->timeout >= 0) { + if (apr_is_option_set(sock->netmask, APR_SO_NONBLOCK) != 0) { + if ((stat = soblock(sock->socketdes)) != APR_SUCCESS) { + return stat; + } + apr_set_option(&sock->netmask, APR_SO_NONBLOCK, 0); + } + } + /* must disable the incomplete read support if we disable + * a timeout + */ + if (t <= 0) { + sock->netmask &= ~APR_INCOMPLETE_READ; + } + sock->timeout = t; + apr_set_option(&sock->netmask, APR_SO_TIMEOUT, t > 0); + return APR_SUCCESS; +} + + +apr_status_t apr_socket_opt_set(apr_socket_t *sock, + apr_int32_t opt, apr_int32_t on) +{ + int one; + apr_status_t rv; + + if (on) + one = 1; + else + one = 0; + switch(opt) { + case APR_SO_KEEPALIVE: +#ifdef SO_KEEPALIVE + if (on != apr_is_option_set(sock->netmask, APR_SO_KEEPALIVE)) { + if (setsockopt(sock->socketdes, SOL_SOCKET, SO_KEEPALIVE, (void *)&one, sizeof(int)) == -1) { + return errno; + } + apr_set_option(&sock->netmask,APR_SO_KEEPALIVE, on); + } +#else + return APR_ENOTIMPL; +#endif + break; + case APR_SO_DEBUG: + if (on != apr_is_option_set(sock->netmask, APR_SO_DEBUG)) { + if (setsockopt(sock->socketdes, SOL_SOCKET, SO_DEBUG, (void *)&one, sizeof(int)) == -1) { + return errno; + } + apr_set_option(&sock->netmask, APR_SO_DEBUG, on); + } + break; + case APR_SO_REUSEADDR: + if (on != apr_is_option_set(sock->netmask, APR_SO_REUSEADDR)) { + if (setsockopt(sock->socketdes, SOL_SOCKET, SO_REUSEADDR, (void *)&one, sizeof(int)) == -1) { + return errno; + } + apr_set_option(&sock->netmask, APR_SO_REUSEADDR, on); + } + break; + case APR_SO_SNDBUF: +#ifdef SO_SNDBUF + if (setsockopt(sock->socketdes, SOL_SOCKET, SO_SNDBUF, (void *)&on, sizeof(int)) == -1) { + return errno; + } +#else + return APR_ENOTIMPL; +#endif + break; + case APR_SO_RCVBUF: +#ifdef SO_RCVBUF + if (setsockopt(sock->socketdes, SOL_SOCKET, SO_RCVBUF, (void *)&on, sizeof(int)) == -1) { + return errno; + } +#else + return APR_ENOTIMPL; +#endif + break; + case APR_SO_NONBLOCK: + if (apr_is_option_set(sock->netmask, APR_SO_NONBLOCK) != on) { + if (on) { + if ((rv = sononblock(sock->socketdes)) != APR_SUCCESS) + return rv; + } + else { + if ((rv = soblock(sock->socketdes)) != APR_SUCCESS) + return rv; + } + apr_set_option(&sock->netmask, APR_SO_NONBLOCK, on); + } + break; + case APR_SO_LINGER: +#ifdef SO_LINGER + if (apr_is_option_set(sock->netmask, APR_SO_LINGER) != on) { + struct linger li; + li.l_onoff = on; + li.l_linger = APR_MAX_SECS_TO_LINGER; + if (setsockopt(sock->socketdes, SOL_SOCKET, SO_LINGER, (char *) &li, sizeof(struct linger)) == -1) { + return errno; + } + apr_set_option(&sock->netmask, APR_SO_LINGER, on); + } +#else + return APR_ENOTIMPL; +#endif + break; + case APR_SO_TIMEOUT: + /* XXX: To be deprecated */ + return apr_socket_timeout_set(sock, on); + break; + case APR_TCP_NODELAY: +#if defined(TCP_NODELAY) + if (apr_is_option_set(sock->netmask, APR_TCP_NODELAY) != on) { + int optlevel = IPPROTO_TCP; + int optname = TCP_NODELAY; + +#if APR_HAVE_SCTP + if (sock->protocol == IPPROTO_SCTP) { + optlevel = IPPROTO_SCTP; + optname = SCTP_NODELAY; + } +#endif + if (setsockopt(sock->socketdes, optlevel, optname, (void *)&on, sizeof(int)) == -1) { + return errno; + } + apr_set_option(&sock->netmask, APR_TCP_NODELAY, on); + } +#else + /* BeOS pre-BONE has TCP_NODELAY set by default. + * As it can't be turned off we might as well check if they're asking + * for it to be turned on! + */ +#ifdef BEOS + if (on == 1) + return APR_SUCCESS; + else +#endif + return APR_ENOTIMPL; +#endif + break; + case APR_TCP_NOPUSH: +#if APR_TCP_NOPUSH_FLAG + if (apr_is_option_set(sock->netmask, APR_TCP_NOPUSH) != on) { + int optlevel = IPPROTO_TCP; + int optname = TCP_NODELAY; + +#if APR_HAVE_SCTP + if (sock->protocol == IPPROTO_SCTP) { + optlevel = IPPROTO_SCTP; + optname = SCTP_NODELAY; + } +#endif + /* OK we're going to change some settings here... */ + /* TCP_NODELAY is mutually exclusive, so do we have it set? */ + if (apr_is_option_set(sock->netmask, APR_TCP_NODELAY) == 1 && on) { + /* If we want to set NOPUSH then if we have the TCP_NODELAY + * flag set we need to switch it off... + */ + int tmpflag = 0; + if (setsockopt(sock->socketdes, optlevel, optname, + (void*)&tmpflag, sizeof(int)) == -1) { + return errno; + } + apr_set_option(&sock->netmask, APR_RESET_NODELAY, 1); + apr_set_option(&sock->netmask, APR_TCP_NODELAY, 0); + } else if (on) { + apr_set_option(&sock->netmask, APR_RESET_NODELAY, 0); + } + /* OK, now we can just set the TCP_NOPUSH flag accordingly...*/ + if (setsockopt(sock->socketdes, IPPROTO_TCP, APR_TCP_NOPUSH_FLAG, + (void*)&on, sizeof(int)) == -1) { + return errno; + } + apr_set_option(&sock->netmask, APR_TCP_NOPUSH, on); + if (!on && apr_is_option_set(sock->netmask, APR_RESET_NODELAY)) { + int tmpflag = 1; + if (setsockopt(sock->socketdes, optlevel, optname, + (void*)&tmpflag, sizeof(int)) == -1) { + return errno; + } + apr_set_option(&sock->netmask, APR_RESET_NODELAY,0); + apr_set_option(&sock->netmask, APR_TCP_NODELAY, 1); + } + } +#else + return APR_ENOTIMPL; +#endif + break; + case APR_INCOMPLETE_READ: + apr_set_option(&sock->netmask, APR_INCOMPLETE_READ, on); + break; + case APR_IPV6_V6ONLY: +#if APR_HAVE_IPV6 && defined(IPV6_V6ONLY) + /* we don't know the initial setting of this option, + * so don't check sock->netmask since that optimization + * won't work + */ + if (setsockopt(sock->socketdes, IPPROTO_IPV6, IPV6_V6ONLY, + (void *)&on, sizeof(int)) == -1) { + return errno; + } + apr_set_option(&sock->netmask, APR_IPV6_V6ONLY, on); +#else + return APR_ENOTIMPL; +#endif + break; + default: + return APR_EINVAL; + } + + return APR_SUCCESS; +} + + +apr_status_t apr_socket_timeout_get(apr_socket_t *sock, apr_interval_time_t *t) +{ + *t = sock->timeout; + return APR_SUCCESS; +} + + +apr_status_t apr_socket_opt_get(apr_socket_t *sock, + apr_int32_t opt, apr_int32_t *on) +{ + switch(opt) { + case APR_SO_TIMEOUT: + /* XXX: To be deprecated */ + *on = (apr_int32_t)sock->timeout; + break; + default: + *on = apr_is_option_set(sock->netmask, opt); + } + return APR_SUCCESS; +} + + +apr_status_t apr_socket_atmark(apr_socket_t *sock, int *atmark) +{ +/* In 1.0 we rely on compile failure to assure all platforms grabbed + * the correct header file support for SIOCATMARK, but we don't want + * to fail the build of 0.9. Keep things good for the released branch. + */ +#ifdef SIOCATMARK + int oobmark; + + if (ioctl(sock->socketdes, SIOCATMARK, (void*) &oobmark) < 0) + return apr_get_netos_error(); + + *atmark = (oobmark != 0); + + return APR_SUCCESS; +#else + return APR_ENOTIMPL; +#endif +} + + +/* deprecated */ +apr_status_t apr_setsocketopt(apr_socket_t *sock, + apr_int32_t opt, apr_int32_t on) +{ + return apr_socket_opt_set(sock, opt, on); +} + +apr_status_t apr_getsocketopt(apr_socket_t *sock, + apr_int32_t opt, apr_int32_t *on) +{ + return apr_socket_opt_get(sock, opt, on); +} + + +apr_status_t apr_gethostname(char *buf, apr_int32_t len, apr_pool_t *cont) +{ + if (gethostname(buf, len) == -1) { + buf[0] = '\0'; + return errno; + } + else if (!memchr(buf, '\0', len)) { /* buffer too small */ + /* note... most platforms just truncate in this condition + * linux+glibc return an error + */ + buf[0] = '\0'; + return APR_ENAMETOOLONG; + } + return APR_SUCCESS; +} + +#if APR_HAS_SO_ACCEPTFILTER +apr_status_t apr_socket_accept_filter(apr_socket_t *sock, char *name, + char *args) +{ + struct accept_filter_arg af; + strncpy(af.af_name, name, 16); + strncpy(af.af_arg, args, 256 - 16); + + if ((setsockopt(sock->socketdes, SOL_SOCKET, SO_ACCEPTFILTER, + &af, sizeof(af))) < 0) { + return errno; + } + return APR_SUCCESS; +} +#endif diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/sockopt.lo b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/sockopt.lo new file mode 100644 index 00000000..e61510cc --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/sockopt.lo @@ -0,0 +1,12 @@ +# sockopt.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/sockopt.o' + +# Name of the non-PIC object. +non_pic_object='sockopt.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/sockopt.o b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/unix/sockopt.o new file mode 100644 index 0000000000000000000000000000000000000000..cc6db787c2d2f9285d4bf261ede390c841090572 GIT binary patch literal 24256 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 Z&-)mEKF{*J53nD`c^&b5GS2JbzW_8aftUaQ literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/network_io/win32/sendrecv.c b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/win32/sendrecv.c new file mode 100644 index 00000000..99470c82 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/win32/sendrecv.c @@ -0,0 +1,460 @@ +/* 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. + */ + +#include "apr_arch_networkio.h" +#include "apr_errno.h" +#include "apr_general.h" +#include "apr_network_io.h" +#include "apr_lib.h" +#include "apr_arch_file_io.h" +#if APR_HAVE_TIME_H +#include +#endif + +/* MAX_SEGMENT_SIZE is the maximum amount of data that will be sent to a client + * in one call of TransmitFile. This number must be small enough to give the + * slowest client time to receive the data before the socket timeout triggers. + * The same problem can exist with apr_socket_send(). In that case, we rely on + * the application to adjust socket timeouts and max send segment + * sizes appropriately. + * For example, Apache will in most cases call apr_socket_send() with less + * than 8193 bytes. + */ +#define MAX_SEGMENT_SIZE 65536 +#define WSABUF_ON_STACK 50 + +APR_DECLARE(apr_status_t) apr_socket_send(apr_socket_t *sock, const char *buf, + apr_size_t *len) +{ + apr_ssize_t rv; + WSABUF wsaData; + int lasterror; + DWORD dwBytes = 0; + + wsaData.len = *len; + wsaData.buf = (char*) buf; + +#ifndef _WIN32_WCE + rv = WSASend(sock->socketdes, &wsaData, 1, &dwBytes, 0, NULL, NULL); +#else + rv = send(sock->socketdes, wsaData.buf, wsaData.len, 0); + dwBytes = rv; +#endif + if (rv == SOCKET_ERROR) { + lasterror = apr_get_netos_error(); + *len = 0; + return lasterror; + } + + *len = dwBytes; + + return APR_SUCCESS; +} + + +APR_DECLARE(apr_status_t) apr_socket_recv(apr_socket_t *sock, char *buf, + apr_size_t *len) +{ + apr_ssize_t rv; + WSABUF wsaData; + int lasterror; + DWORD dwBytes = 0; + DWORD flags = 0; + + wsaData.len = *len; + wsaData.buf = (char*) buf; + +#ifndef _WIN32_WCE + rv = WSARecv(sock->socketdes, &wsaData, 1, &dwBytes, &flags, NULL, NULL); +#else + rv = recv(sock->socketdes, wsaData.buf, wsaData.len, 0); + dwBytes = rv; +#endif + if (rv == SOCKET_ERROR) { + lasterror = apr_get_netos_error(); + *len = 0; + return lasterror; + } + + *len = dwBytes; + return dwBytes == 0 ? APR_EOF : APR_SUCCESS; +} + + +APR_DECLARE(apr_status_t) apr_socket_sendv(apr_socket_t *sock, + const struct iovec *vec, + apr_int32_t nvec, apr_size_t *nbytes) +{ + apr_status_t rc = APR_SUCCESS; + apr_ssize_t rv; + int i; + DWORD dwBytes = 0; + WSABUF *pWsaBuf = (nvec <= WSABUF_ON_STACK) ? _alloca(sizeof(WSABUF) * (nvec)) + : malloc(sizeof(WSABUF) * (nvec)); + + if (!pWsaBuf) + return APR_ENOMEM; + + for (i = 0; i < nvec; i++) { + pWsaBuf[i].buf = vec[i].iov_base; + pWsaBuf[i].len = vec[i].iov_len; + } +#ifndef _WIN32_WCE + rv = WSASend(sock->socketdes, pWsaBuf, nvec, &dwBytes, 0, NULL, NULL); + if (rv == SOCKET_ERROR) { + rc = apr_get_netos_error(); + } +#else + for (i = 0; i < nvec; i++) { + rv = send(sock->socketdes, pWsaBuf[i].buf, pWsaBuf[i].len, 0); + if (rv == SOCKET_ERROR) { + rc = apr_get_netos_error(); + break; + } + dwBytes += rv; + } +#endif + if (nvec > WSABUF_ON_STACK) + free(pWsaBuf); + + *nbytes = dwBytes; + return rc; +} + + +APR_DECLARE(apr_status_t) apr_socket_sendto(apr_socket_t *sock, + apr_sockaddr_t *where, + apr_int32_t flags, const char *buf, + apr_size_t *len) +{ + apr_ssize_t rv; + + rv = sendto(sock->socketdes, buf, (*len), flags, + (const struct sockaddr*)&where->sa, + where->salen); + if (rv == SOCKET_ERROR) { + *len = 0; + return apr_get_netos_error(); + } + + *len = rv; + return APR_SUCCESS; +} + + +APR_DECLARE(apr_status_t) apr_socket_recvfrom(apr_sockaddr_t *from, + apr_socket_t *sock, + apr_int32_t flags, + char *buf, apr_size_t *len) +{ + apr_ssize_t rv; + + rv = recvfrom(sock->socketdes, buf, (*len), flags, + (struct sockaddr*)&from->sa, &from->salen); + if (rv == SOCKET_ERROR) { + (*len) = 0; + return apr_get_netos_error(); + } + (*len) = rv; + if (rv == 0 && sock->type == SOCK_STREAM) + return APR_EOF; + + return APR_SUCCESS; +} + + +static apr_status_t collapse_iovec(char **off, apr_size_t *len, + struct iovec *iovec, int numvec, + char *buf, apr_size_t buflen) +{ + if (numvec == 1) { + *off = iovec[0].iov_base; + *len = iovec[0].iov_len; + } + else { + int i; + for (i = 0; i < numvec; i++) { + *len += iovec[i].iov_len; + } + + if (*len > buflen) { + *len = 0; + return APR_INCOMPLETE; + } + + *off = buf; + + for (i = 0; i < numvec; i++) { + memcpy(buf, iovec[i].iov_base, iovec[i].iov_len); + buf += iovec[i].iov_len; + } + } + return APR_SUCCESS; +} + + +#if APR_HAS_SENDFILE +/* + * apr_status_t apr_socket_sendfile(apr_socket_t *, apr_file_t *, apr_hdtr_t *, + * apr_off_t *, apr_size_t *, apr_int32_t flags) + * Send a file from an open file descriptor to a socket, along with + * optional headers and trailers + * arg 1) The socket to which we're writing + * arg 2) The open file from which to read + * arg 3) A structure containing the headers and trailers to send + * arg 4) Offset into the file where we should begin writing + * arg 5) Number of bytes to send out of the file + * arg 6) APR flags that are mapped to OS specific flags + */ +APR_DECLARE(apr_status_t) apr_socket_sendfile(apr_socket_t *sock, + apr_file_t *file, + apr_hdtr_t *hdtr, + apr_off_t *offset, + apr_size_t *len, + apr_int32_t flags) +{ + apr_status_t status = APR_SUCCESS; + apr_ssize_t rv; + apr_off_t curoff = *offset; + DWORD dwFlags = 0; + DWORD nbytes; + TRANSMIT_FILE_BUFFERS tfb, *ptfb = NULL; + int ptr = 0; + int bytes_to_send; /* Bytes to send out of the file (not including headers) */ + int disconnected = 0; + int sendv_trailers = 0; + char hdtrbuf[4096]; + + if (apr_os_level < APR_WIN_NT) { + return APR_ENOTIMPL; + } + + /* Use len to keep track of number of total bytes sent (including headers) */ + bytes_to_send = *len; + *len = 0; + + /* Handle the goofy case of sending headers/trailers and a zero byte file */ + if (!bytes_to_send && hdtr) { + if (hdtr->numheaders) { + rv = apr_socket_sendv(sock, hdtr->headers, hdtr->numheaders, + &nbytes); + if (rv != APR_SUCCESS) + return rv; + *len += nbytes; + } + if (hdtr->numtrailers) { + rv = apr_socket_sendv(sock, hdtr->trailers, hdtr->numtrailers, + &nbytes); + if (rv != APR_SUCCESS) + return rv; + *len += nbytes; + } + return APR_SUCCESS; + } + + memset(&tfb, '\0', sizeof (tfb)); + /* Collapse the headers into a single buffer */ + if (hdtr && hdtr->numheaders) { + ptfb = &tfb; + nbytes = 0; + rv = collapse_iovec((char **)&ptfb->Head, &ptfb->HeadLength, + hdtr->headers, hdtr->numheaders, + hdtrbuf, sizeof(hdtrbuf)); + /* If not enough buffer, punt to sendv */ + if (rv == APR_INCOMPLETE) { + rv = apr_sendv(sock, hdtr->headers, hdtr->numheaders, &nbytes); + if (rv != APR_SUCCESS) + return rv; + *len += nbytes; + ptfb = NULL; + } + } + + /* Initialize the overlapped structure used on TransmitFile + */ + if (!sock->overlapped) { + sock->overlapped = apr_pcalloc(sock->cntxt, sizeof(OVERLAPPED)); + sock->overlapped->hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); + } + while (bytes_to_send) { + if (bytes_to_send > MAX_SEGMENT_SIZE) { + nbytes = MAX_SEGMENT_SIZE; + } + else { + /* Last call to TransmitFile() */ + nbytes = bytes_to_send; + /* Collapse the trailers into a single buffer */ + if (hdtr && hdtr->numtrailers) { + ptfb = &tfb; + rv = collapse_iovec((char**) &ptfb->Tail, &ptfb->TailLength, + hdtr->trailers, hdtr->numtrailers, + hdtrbuf + ptfb->HeadLength, + sizeof(hdtrbuf) - ptfb->HeadLength); + if (rv == APR_INCOMPLETE) { + /* If not enough buffer, punt to sendv, later */ + sendv_trailers = 1; + } + } + /* Disconnect the socket after last send */ + if ((flags & APR_SENDFILE_DISCONNECT_SOCKET) + && !sendv_trailers) { + dwFlags |= TF_REUSE_SOCKET; + dwFlags |= TF_DISCONNECT; + disconnected = 1; + } + } + + sock->overlapped->Offset = (DWORD)(curoff); +#if APR_HAS_LARGE_FILES + sock->overlapped->OffsetHigh = (DWORD)(curoff >> 32); +#endif + /* XXX BoundsChecker claims dwFlags must not be zero. */ + rv = TransmitFile(sock->socketdes, /* socket */ + file->filehand, /* open file descriptor of the file to be sent */ + nbytes, /* number of bytes to send. 0=send all */ + 0, /* Number of bytes per send. 0=use default */ + sock->overlapped, /* OVERLAPPED structure */ + ptfb, /* header and trailer buffers */ + dwFlags); /* flags to control various aspects of TransmitFile */ + if (!rv) { + status = apr_get_netos_error(); + if ((status == APR_FROM_OS_ERROR(ERROR_IO_PENDING)) || + (status == APR_FROM_OS_ERROR(WSA_IO_PENDING))) + { + rv = WaitForSingleObject(sock->overlapped->hEvent, + (DWORD)(sock->timeout >= 0 + ? sock->timeout_ms : INFINITE)); + if (rv == WAIT_OBJECT_0) { + status = APR_SUCCESS; + if (!disconnected) { + if (!WSAGetOverlappedResult(sock->socketdes, + sock->overlapped, + &nbytes, + FALSE, + &dwFlags)) { + status = apr_get_netos_error(); + } + + /* Ugly code alert: WSAGetOverlappedResult returns + * a count of all bytes sent. This loop only + * tracks bytes sent out of the file. + */ + else if (ptfb) { + nbytes -= (ptfb->HeadLength + ptfb->TailLength); + } + } + } + else if (rv == WAIT_TIMEOUT) { + status = APR_FROM_OS_ERROR(WAIT_TIMEOUT); + } + else if (rv == WAIT_ABANDONED) { + /* Hummm... WAIT_ABANDONDED is not an error code. It is + * a return specific to the Win32 WAIT functions that + * indicates that a thread exited while holding a + * mutex. Should consider triggering an assert + * to detect the condition... + */ + status = APR_FROM_OS_ERROR(WAIT_TIMEOUT); + } + else + status = apr_get_os_error(); + } + } + if (status != APR_SUCCESS) + break; + + bytes_to_send -= nbytes; + curoff += nbytes; + *len += nbytes; + /* Adjust len for any headers/trailers sent */ + if (ptfb) { + *len += (ptfb->HeadLength + ptfb->TailLength); + memset(&tfb, '\0', sizeof (tfb)); + ptfb = NULL; + } + } + + if (status == APR_SUCCESS) { + if (sendv_trailers) { + rv = apr_sendv(sock, hdtr->trailers, hdtr->numtrailers, &nbytes); + if (rv != APR_SUCCESS) + return rv; + *len += nbytes; + } + + + /* Mark the socket as disconnected, but do not close it. + * Note: The application must have stored the socket prior to making + * the call to apr_socket_sendfile in order to either reuse it + * or close it. + */ + if (disconnected) { + sock->disconnected = 1; + sock->socketdes = INVALID_SOCKET; + } + } + + return status; +} + +/* Deprecated */ +APR_DECLARE(apr_status_t) apr_sendfile(apr_socket_t *sock, apr_file_t *file, + apr_hdtr_t *hdtr, apr_off_t *offset, + apr_size_t *len, apr_int32_t flags) +{ + return apr_socket_sendfile(sock, file, hdtr, offset, len, flags); +} + +#endif + +/* Deprecated */ +APR_DECLARE(apr_status_t) apr_send(apr_socket_t *sock, const char *buf, + apr_size_t *len) +{ + return apr_socket_send(sock, buf, len); +} + +/* Deprecated */ +APR_DECLARE(apr_status_t) apr_sendv(apr_socket_t *sock, + const struct iovec *vec, + apr_int32_t nvec, apr_size_t *nbytes) +{ + return apr_socket_sendv(sock, vec, nvec, nbytes); +} + +/* Deprecated */ +APR_DECLARE(apr_status_t) apr_sendto(apr_socket_t *sock, apr_sockaddr_t *where, + apr_int32_t flags, const char *buf, + apr_size_t *len) +{ + return apr_socket_sendto(sock, where, flags, buf, len); +} + +/* Deprecated */ +APR_DECLARE(apr_status_t) apr_recvfrom(apr_sockaddr_t *from, + apr_socket_t *sock, + apr_int32_t flags, + char *buf, apr_size_t *len) +{ + return apr_socket_recvfrom(from, sock, flags, buf, len); +} + +/* Deprecated */ +APR_DECLARE(apr_status_t) apr_recv(apr_socket_t *sock, char *buf, + apr_size_t *len) +{ + return apr_socket_recv(sock, buf, len); +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/network_io/win32/sockets.c b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/win32/sockets.c new file mode 100644 index 00000000..fc2bcb73 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/win32/sockets.c @@ -0,0 +1,532 @@ +/* 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. + */ + +#include "apr_arch_networkio.h" +#include "apr_network_io.h" +#include "apr_general.h" +#include "apr_lib.h" +#include "apr_portable.h" +#include "apr_strings.h" +#include +#include "apr_arch_inherit.h" +#include "apr_arch_misc.h" + +static char generic_inaddr_any[16] = {0}; /* big enough for IPv4 or IPv6 */ + +static apr_status_t socket_cleanup(void *sock) +{ + apr_socket_t *thesocket = sock; + + if (thesocket->socketdes != INVALID_SOCKET) { + if (closesocket(thesocket->socketdes) == SOCKET_ERROR) { + return apr_get_netos_error(); + } + thesocket->socketdes = INVALID_SOCKET; + } +#if APR_HAS_SENDFILE + if (thesocket->overlapped) { + CloseHandle(thesocket->overlapped->hEvent); + thesocket->overlapped = NULL; + } +#endif + return APR_SUCCESS; +} + +static void set_socket_vars(apr_socket_t *sock, int family, int type, int protocol) +{ + sock->type = type; + sock->protocol = protocol; + apr_sockaddr_vars_set(sock->local_addr, family, 0); + apr_sockaddr_vars_set(sock->remote_addr, family, 0); +} +static void alloc_socket(apr_socket_t **new, apr_pool_t *p) +{ + *new = (apr_socket_t *)apr_pcalloc(p, sizeof(apr_socket_t)); + (*new)->cntxt = p; + (*new)->local_addr = (apr_sockaddr_t *)apr_pcalloc((*new)->cntxt, + sizeof(apr_sockaddr_t)); + (*new)->local_addr->pool = p; + (*new)->remote_addr = (apr_sockaddr_t *)apr_pcalloc((*new)->cntxt, + sizeof(apr_sockaddr_t)); + (*new)->remote_addr->pool = p; +} + +APR_DECLARE(apr_status_t) apr_socket_protocol_get(apr_socket_t *sock, + int *protocol) +{ + *protocol = sock->protocol; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_socket_create_ex(apr_socket_t **new, int family, + int type, int protocol, + apr_pool_t *cont) +{ + int downgrade = (family == AF_UNSPEC); + + if (family == AF_UNSPEC) { +#if APR_HAVE_IPV6 + family = AF_INET6; +#else + family = AF_INET; +#endif + } + + alloc_socket(new, cont); + + /* For right now, we are not using socket groups. We may later. + * No flags to use when creating a socket, so use 0 for that parameter as well. + */ + (*new)->socketdes = socket(family, type, protocol); +#if APR_HAVE_IPV6 + if ((*new)->socketdes == INVALID_SOCKET && downgrade) { + family = AF_INET; + (*new)->socketdes = socket(family, type, protocol); + } +#endif + + if ((*new)->socketdes == INVALID_SOCKET) { + return apr_get_netos_error(); + } + +#ifdef WIN32 + /* Socket handles are never truly inheritable, there are too many + * bugs associated. WSADuplicateSocket will copy them, but for our + * purposes, always transform the socket() created as a non-inherited + * handle + */ +#if APR_HAS_UNICODE_FS && !defined(_WIN32_WCE) + IF_WIN_OS_IS_UNICODE { + /* A different approach. Many users report errors such as + * (32538)An operation was attempted on something that is not + * a socket. : Parent: WSADuplicateSocket failed... + * + * This appears that the duplicated handle is no longer recognized + * as a socket handle. SetHandleInformation should overcome that + * problem by not altering the handle identifier. But this won't + * work on 9x - it's unsupported. + */ + SetHandleInformation((HANDLE) (*new)->socketdes, + HANDLE_FLAG_INHERIT, 0); + } +#endif +#if APR_HAS_ANSI_FS || defined(_WIN32_WCE) + ELSE_WIN_OS_IS_ANSI { + HANDLE hProcess = GetCurrentProcess(); + HANDLE dup; + if (DuplicateHandle(hProcess, (HANDLE) (*new)->socketdes, hProcess, + &dup, 0, FALSE, DUPLICATE_SAME_ACCESS)) { + closesocket((*new)->socketdes); + (*new)->socketdes = (SOCKET) dup; + } + } +#endif + +#endif /* def WIN32 */ + + set_socket_vars(*new, family, type, protocol); + + (*new)->timeout = -1; + (*new)->disconnected = 0; + + apr_pool_cleanup_register((*new)->cntxt, (void *)(*new), + socket_cleanup, apr_pool_cleanup_null); + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_socket_create(apr_socket_t **new, int family, + int type, apr_pool_t *cont) +{ + return apr_socket_create_ex(new, family, type, 0, cont); +} + +APR_DECLARE(apr_status_t) apr_socket_shutdown(apr_socket_t *thesocket, + apr_shutdown_how_e how) +{ + int winhow = 0; + +#ifdef SD_RECEIVE + switch (how) { + case APR_SHUTDOWN_READ: { + winhow = SD_RECEIVE; + break; + } + case APR_SHUTDOWN_WRITE: { + winhow = SD_SEND; + break; + } + case APR_SHUTDOWN_READWRITE: { + winhow = SD_BOTH; + break; + } + default: + return APR_BADARG; + } +#endif + if (shutdown(thesocket->socketdes, winhow) == 0) { + return APR_SUCCESS; + } + else { + return apr_get_netos_error(); + } +} + +APR_DECLARE(apr_status_t) apr_socket_close(apr_socket_t *thesocket) +{ + apr_pool_cleanup_kill(thesocket->cntxt, thesocket, socket_cleanup); + return socket_cleanup(thesocket); +} + +APR_DECLARE(apr_status_t) apr_socket_bind(apr_socket_t *sock, + apr_sockaddr_t *sa) +{ + if (bind(sock->socketdes, + (struct sockaddr *)&sa->sa, + sa->salen) == -1) { + return apr_get_netos_error(); + } + else { + sock->local_addr = sa; + if (sock->local_addr->sa.sin.sin_port == 0) { + sock->local_port_unknown = 1; /* ephemeral port */ + } + return APR_SUCCESS; + } +} + +APR_DECLARE(apr_status_t) apr_socket_listen(apr_socket_t *sock, + apr_int32_t backlog) +{ + if (listen(sock->socketdes, backlog) == SOCKET_ERROR) + return apr_get_netos_error(); + else + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_socket_accept(apr_socket_t **new, + apr_socket_t *sock, apr_pool_t *p) +{ + SOCKET s; + struct sockaddr sa; + int salen = sizeof(sock->remote_addr->sa); + + /* Don't allocate the memory until after we call accept. This allows + us to work with nonblocking sockets. */ + s = accept(sock->socketdes, (struct sockaddr *)&sa, &salen); + if (s == INVALID_SOCKET) { + return apr_get_netos_error(); + } + + alloc_socket(new, p); + set_socket_vars(*new, sock->local_addr->sa.sin.sin_family, SOCK_STREAM, + sock->protocol); + + (*new)->timeout = -1; + (*new)->disconnected = 0; + + (*new)->socketdes = s; + /* XXX next line looks bogus w.r.t. AF_INET6 support */ + (*new)->remote_addr->salen = sizeof((*new)->remote_addr->sa); + memcpy (&(*new)->remote_addr->sa, &sa, salen); + *(*new)->local_addr = *sock->local_addr; + + /* The above assignment just overwrote the pool entry. Setting the local_addr + pool for the accepted socket back to what it should be. Otherwise all + allocations for this socket will come from a server pool that is not + freed until the process goes down.*/ + (*new)->local_addr->pool = p; + + /* fix up any pointers which are no longer valid */ + if (sock->local_addr->sa.sin.sin_family == AF_INET) { + (*new)->local_addr->ipaddr_ptr = &(*new)->local_addr->sa.sin.sin_addr; + } +#if APR_HAVE_IPV6 + else if (sock->local_addr->sa.sin.sin_family == AF_INET6) { + (*new)->local_addr->ipaddr_ptr = &(*new)->local_addr->sa.sin6.sin6_addr; + } +#endif + (*new)->remote_addr->port = ntohs((*new)->remote_addr->sa.sin.sin_port); + if (sock->local_port_unknown) { + /* not likely for a listening socket, but theoretically possible :) */ + (*new)->local_port_unknown = 1; + } + +#if APR_TCP_NODELAY_INHERITED + if (apr_is_option_set(sock->netmask, APR_TCP_NODELAY) == 1) { + apr_set_option(&(*new)->netmask, APR_TCP_NODELAY, 1); + } +#endif /* TCP_NODELAY_INHERITED */ +#if APR_O_NONBLOCK_INHERITED + if (apr_is_option_set(sock->netmask, APR_SO_NONBLOCK) == 1) { + apr_set_option(&(*new)->netmask, APR_SO_NONBLOCK, 1); + } +#endif /* APR_O_NONBLOCK_INHERITED */ + + if (sock->local_interface_unknown || + !memcmp(sock->local_addr->ipaddr_ptr, + generic_inaddr_any, + sock->local_addr->ipaddr_len)) { + /* If the interface address inside the listening socket's local_addr wasn't + * up-to-date, we don't know local interface of the connected socket either. + * + * If the listening socket was not bound to a specific interface, we + * don't know the local_addr of the connected socket. + */ + (*new)->local_interface_unknown = 1; + } + + apr_pool_cleanup_register((*new)->cntxt, (void *)(*new), + socket_cleanup, apr_pool_cleanup_null); + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_socket_connect(apr_socket_t *sock, + apr_sockaddr_t *sa) +{ + apr_status_t rv; + + if ((sock->socketdes == INVALID_SOCKET) || (!sock->local_addr)) { + return APR_ENOTSOCK; + } + + if (connect(sock->socketdes, (const struct sockaddr *)&sa->sa.sin, + sa->salen) == SOCKET_ERROR) { + int rc; + struct timeval tv, *tvptr; + fd_set wfdset, efdset; + + rv = apr_get_netos_error(); + if (rv != APR_FROM_OS_ERROR(WSAEWOULDBLOCK)) { + return rv; + } + + if (sock->timeout == 0) { + /* Tell the app that the connect is in progress... + * Gotta play some games here. connect on Unix will return + * EINPROGRESS under the same circumstances that Windows + * returns WSAEWOULDBLOCK. Do some adhoc canonicalization... + */ + return APR_FROM_OS_ERROR(WSAEINPROGRESS); + } + + /* wait for the connect to complete or timeout */ + FD_ZERO(&wfdset); + FD_SET(sock->socketdes, &wfdset); + FD_ZERO(&efdset); + FD_SET(sock->socketdes, &efdset); + + if (sock->timeout < 0) { + tvptr = NULL; + } + else { + /* casts for winsock/timeval definition */ + tv.tv_sec = (long)apr_time_sec(sock->timeout); + tv.tv_usec = (int)apr_time_usec(sock->timeout); + tvptr = &tv; + } + rc = select(FD_SETSIZE+1, NULL, &wfdset, &efdset, tvptr); + if (rc == SOCKET_ERROR) { + return apr_get_netos_error(); + } + else if (!rc) { + return APR_FROM_OS_ERROR(WSAETIMEDOUT); + } + /* Evaluate the efdset */ + if (FD_ISSET(sock->socketdes, &efdset)) { + /* The connect failed. */ + int rclen = sizeof(rc); + if (getsockopt(sock->socketdes, SOL_SOCKET, SO_ERROR, (char*) &rc, &rclen)) { + return apr_get_netos_error(); + } + return APR_FROM_OS_ERROR(rc); + } + } + /* connect was OK .. amazing */ + sock->remote_addr = sa; + if (sock->local_addr->sa.sin.sin_port == 0) { + sock->local_port_unknown = 1; + } + if (!memcmp(sock->local_addr->ipaddr_ptr, + generic_inaddr_any, + sock->local_addr->ipaddr_len)) { + /* not bound to specific local interface; connect() had to assign + * one for the socket + */ + sock->local_interface_unknown = 1; + } + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_socket_data_get(void **data, const char *key, + apr_socket_t *sock) +{ + sock_userdata_t *cur = sock->userdata; + + *data = NULL; + + while (cur) { + if (!strcmp(cur->key, key)) { + *data = cur->data; + break; + } + cur = cur->next; + } + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_socket_data_set(apr_socket_t *sock, void *data, + const char *key, + apr_status_t (*cleanup)(void *)) +{ + sock_userdata_t *new = apr_palloc(sock->cntxt, sizeof(sock_userdata_t)); + + new->key = apr_pstrdup(sock->cntxt, key); + new->data = data; + new->next = sock->userdata; + sock->userdata = new; + + if (cleanup) { + apr_pool_cleanup_register(sock->cntxt, data, cleanup, cleanup); + } + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_os_sock_get(apr_os_sock_t *thesock, + apr_socket_t *sock) +{ + *thesock = sock->socketdes; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_os_sock_make(apr_socket_t **apr_sock, + apr_os_sock_info_t *os_sock_info, + apr_pool_t *cont) +{ + alloc_socket(apr_sock, cont); +#ifdef APR_ENABLE_FOR_1_0 /* no protocol field yet */ + set_socket_vars(*apr_sock, os_sock_info->family, os_sock_info->type, os_sock_info->protocol); +#else + set_socket_vars(*apr_sock, os_sock_info->family, os_sock_info->type, 0); +#endif + (*apr_sock)->timeout = -1; + (*apr_sock)->disconnected = 0; + (*apr_sock)->socketdes = *os_sock_info->os_sock; + if (os_sock_info->local) { + memcpy(&(*apr_sock)->local_addr->sa.sin, + os_sock_info->local, + (*apr_sock)->local_addr->salen); + (*apr_sock)->local_addr->pool = cont; + /* XXX IPv6 - this assumes sin_port and sin6_port at same offset */ + (*apr_sock)->local_addr->port = ntohs((*apr_sock)->local_addr->sa.sin.sin_port); + } + else { + (*apr_sock)->local_port_unknown = (*apr_sock)->local_interface_unknown = 1; + } + if (os_sock_info->remote) { + memcpy(&(*apr_sock)->remote_addr->sa.sin, + os_sock_info->remote, + (*apr_sock)->remote_addr->salen); + (*apr_sock)->remote_addr->pool = cont; + /* XXX IPv6 - this assumes sin_port and sin6_port at same offset */ + (*apr_sock)->remote_addr->port = ntohs((*apr_sock)->remote_addr->sa.sin.sin_port); + } + else { + (*apr_sock)->remote_addr_unknown = 1; + } + + apr_pool_cleanup_register((*apr_sock)->cntxt, (void *)(*apr_sock), + socket_cleanup, apr_pool_cleanup_null); + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_os_sock_put(apr_socket_t **sock, + apr_os_sock_t *thesock, + apr_pool_t *cont) +{ + if ((*sock) == NULL) { + alloc_socket(sock, cont); + /* XXX figure out the actual socket type here */ + /* *or* just decide that apr_os_sock_put() has to be told the family and type */ + set_socket_vars(*sock, AF_INET, SOCK_STREAM, 0); + (*sock)->timeout = -1; + (*sock)->disconnected = 0; + } + (*sock)->local_port_unknown = (*sock)->local_interface_unknown = 1; + (*sock)->remote_addr_unknown = 1; + (*sock)->socketdes = *thesock; + return APR_SUCCESS; +} + + +/* Sockets cannot be inherited through the standard sockets + * inheritence. WSADuplicateSocket must be used. + * This is not trivial to implement. + */ + +APR_DECLARE(apr_status_t) apr_socket_inherit_set(apr_socket_t *socket) +{ + return APR_ENOTIMPL; +} +/* Deprecated */ +APR_DECLARE(void) apr_socket_set_inherit(apr_socket_t *socket) +{ + apr_socket_inherit_set(socket); +} + +APR_DECLARE(apr_status_t) apr_socket_inherit_unset(apr_socket_t *socket) +{ + return APR_ENOTIMPL; +} +/* Deprecated */ +APR_DECLARE(void) apr_socket_unset_inherit(apr_socket_t *socket) +{ + apr_socket_inherit_unset(socket); +} +/* Deprecated */ +APR_DECLARE(apr_status_t) apr_shutdown(apr_socket_t *thesocket, + apr_shutdown_how_e how) +{ + return apr_socket_shutdown(thesocket, how); +} + +/* Deprecated */ +APR_DECLARE(apr_status_t) apr_bind(apr_socket_t *sock, apr_sockaddr_t *sa) +{ + return apr_socket_bind(sock, sa); +} + +/* Deprecated */ +APR_DECLARE(apr_status_t) apr_listen(apr_socket_t *sock, apr_int32_t backlog) +{ + return apr_socket_listen(sock, backlog); +} + +/* Deprecated */ +APR_DECLARE(apr_status_t) apr_accept(apr_socket_t **new, apr_socket_t *sock, + apr_pool_t *p) +{ + return apr_socket_accept(new, sock, p); +} + +/* Deprecated */ +APR_DECLARE(apr_status_t) apr_connect(apr_socket_t *sock, apr_sockaddr_t *sa) +{ + return apr_socket_connect(sock, sa); +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/network_io/win32/sockopt.c b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/win32/sockopt.c new file mode 100644 index 00000000..ab5dafd1 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/network_io/win32/sockopt.c @@ -0,0 +1,280 @@ +/* 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. + */ + +#include "apr_arch_networkio.h" +#include "apr_network_io.h" +#include "apr_general.h" +#include "apr_strings.h" +#include + +apr_status_t soblock(SOCKET sd) +{ + u_long zero = 0; + + if (ioctlsocket(sd, FIONBIO, &zero) == SOCKET_ERROR) { + return apr_get_netos_error(); + } + return APR_SUCCESS; +} + +apr_status_t sononblock(SOCKET sd) +{ + u_long one = 1; + + if (ioctlsocket(sd, FIONBIO, &one) == SOCKET_ERROR) { + return apr_get_netos_error(); + } + return APR_SUCCESS; +} + + +APR_DECLARE(apr_status_t) apr_socket_timeout_set(apr_socket_t *sock, apr_interval_time_t t) +{ + apr_status_t stat; + + if (t == 0) { + /* Set the socket non-blocking if it was previously blocking */ + if (sock->timeout != 0) { + if ((stat = sononblock(sock->socketdes)) != APR_SUCCESS) + return stat; + } + } + else if (t > 0) { + /* Set the socket to blocking if it was previously non-blocking */ + if (sock->timeout == 0) { + if ((stat = soblock(sock->socketdes)) != APR_SUCCESS) + return stat; + } + /* Reset socket timeouts if the new timeout differs from the old timeout */ + if (sock->timeout != t) + { + /* Win32 timeouts are in msec, represented as int */ + sock->timeout_ms = (int)apr_time_as_msec(t); + setsockopt(sock->socketdes, SOL_SOCKET, SO_RCVTIMEO, + (char *) &sock->timeout_ms, + sizeof(sock->timeout_ms)); + setsockopt(sock->socketdes, SOL_SOCKET, SO_SNDTIMEO, + (char *) &sock->timeout_ms, + sizeof(sock->timeout_ms)); + } + } + else if (t < 0) { + int zero = 0; + /* Set the socket to blocking with infinite timeouts */ + if ((stat = soblock(sock->socketdes)) != APR_SUCCESS) + return stat; + setsockopt(sock->socketdes, SOL_SOCKET, SO_RCVTIMEO, + (char *) &zero, sizeof(zero)); + setsockopt(sock->socketdes, SOL_SOCKET, SO_SNDTIMEO, + (char *) &zero, sizeof(zero)); + } + sock->timeout = t; + return APR_SUCCESS; +} + + +APR_DECLARE(apr_status_t) apr_socket_opt_set(apr_socket_t *sock, + apr_int32_t opt, apr_int32_t on) +{ + int one; + apr_status_t stat; + + one = on ? 1 : 0; + + switch (opt) { + case APR_SO_TIMEOUT: + { + /* XXX: To be deprecated */ + return apr_socket_timeout_set(sock, on); + } + case APR_SO_KEEPALIVE: + if (on != apr_is_option_set(sock->netmask, APR_SO_KEEPALIVE)) { + if (setsockopt(sock->socketdes, SOL_SOCKET, SO_KEEPALIVE, + (void *)&one, sizeof(int)) == -1) { + return apr_get_netos_error(); + } + apr_set_option(&sock->netmask,APR_SO_KEEPALIVE, on); + } + break; + case APR_SO_DEBUG: + if (on != apr_is_option_set(sock->netmask, APR_SO_DEBUG)) { + if (setsockopt(sock->socketdes, SOL_SOCKET, SO_DEBUG, + (void *)&one, sizeof(int)) == -1) { + return apr_get_netos_error(); + } + apr_set_option(&sock->netmask, APR_SO_DEBUG, on); + } + break; + case APR_SO_SNDBUF: + if (setsockopt(sock->socketdes, SOL_SOCKET, SO_SNDBUF, + (void *)&on, sizeof(int)) == -1) { + return apr_get_netos_error(); + } + break; + case APR_SO_RCVBUF: + if (setsockopt(sock->socketdes, SOL_SOCKET, SO_RCVBUF, + (void *)&on, sizeof(int)) == -1) { + return apr_get_netos_error(); + } + break; + case APR_SO_REUSEADDR: + if (on != apr_is_option_set(sock->netmask, APR_SO_REUSEADDR)) { + if (setsockopt(sock->socketdes, SOL_SOCKET, SO_REUSEADDR, + (void *)&one, sizeof(int)) == -1) { + return apr_get_netos_error(); + } + apr_set_option(&sock->netmask, APR_SO_REUSEADDR, on); + } + break; + case APR_SO_NONBLOCK: + if (apr_is_option_set(sock->netmask, APR_SO_NONBLOCK) != on) { + if (on) { + if ((stat = sononblock(sock->socketdes)) != APR_SUCCESS) + return stat; + } + else { + if ((stat = soblock(sock->socketdes)) != APR_SUCCESS) + return stat; + } + apr_set_option(&sock->netmask, APR_SO_NONBLOCK, on); + } + break; + case APR_SO_LINGER: + { + if (apr_is_option_set(sock->netmask, APR_SO_LINGER) != on) { + struct linger li; + li.l_onoff = on; + li.l_linger = APR_MAX_SECS_TO_LINGER; + if (setsockopt(sock->socketdes, SOL_SOCKET, SO_LINGER, + (char *) &li, sizeof(struct linger)) == -1) { + return apr_get_netos_error(); + } + apr_set_option(&sock->netmask, APR_SO_LINGER, on); + } + break; + } + case APR_TCP_NODELAY: + if (apr_is_option_set(sock->netmask, APR_TCP_NODELAY) != on) { + int optlevel = IPPROTO_TCP; + int optname = TCP_NODELAY; + +#if APR_HAVE_SCTP + if (sock->protocol == IPPROTO_SCTP) { + optlevel = IPPROTO_SCTP; + optname = SCTP_NODELAY; + } +#endif + if (setsockopt(sock->socketdes, optlevel, optname, + (void *)&on, sizeof(int)) == -1) { + return apr_get_netos_error(); + } + apr_set_option(&sock->netmask, APR_TCP_NODELAY, on); + } + break; + case APR_IPV6_V6ONLY: +#if APR_HAVE_IPV6 && defined(IPV6_V6ONLY) + /* we don't know the initial setting of this option, + * so don't check sock->netmask since that optimization + * won't work + */ + if (setsockopt(sock->socketdes, IPPROTO_IPV6, IPV6_V6ONLY, + (void *)&on, sizeof(int)) == -1) { + return apr_get_netos_error(); + } + apr_set_option(&sock->netmask, APR_IPV6_V6ONLY, on); +#else + return APR_ENOTIMPL; +#endif + break; + default: + return APR_EINVAL; + break; + } + return APR_SUCCESS; +} + + +APR_DECLARE(apr_status_t) apr_socket_timeout_get(apr_socket_t *sock, apr_interval_time_t *t) +{ + *t = sock->timeout; + return APR_SUCCESS; +} + + +APR_DECLARE(apr_status_t) apr_socket_opt_get(apr_socket_t *sock, + apr_int32_t opt, apr_int32_t *on) +{ + switch (opt) { + case APR_SO_TIMEOUT: + /* XXX: to be deprecated */ + *on = (apr_int32_t)sock->timeout; + break; + case APR_SO_DISCONNECTED: + *on = sock->disconnected; + break; + case APR_SO_KEEPALIVE: + case APR_SO_DEBUG: + case APR_SO_REUSEADDR: + case APR_SO_NONBLOCK: + case APR_SO_LINGER: + default: + *on = apr_is_option_set(sock->netmask, opt); + } + return APR_SUCCESS; +} + + +/* deprecated */ +APR_DECLARE(apr_status_t) apr_setsocketopt(apr_socket_t *sock, + apr_int32_t opt, apr_int32_t on) +{ + return apr_socket_opt_set(sock, opt, on); +} + +APR_DECLARE(apr_status_t) apr_getsocketopt(apr_socket_t *sock, + apr_int32_t opt, apr_int32_t *on) +{ + return apr_socket_opt_get(sock, opt, on); +} + + +APR_DECLARE(apr_status_t) apr_socket_atmark(apr_socket_t *sock, int *atmark) +{ + u_long oobmark; + + if (ioctlsocket(sock->socketdes, SIOCATMARK, (void*) &oobmark) < 0) + return apr_get_netos_error(); + + *atmark = (oobmark != 0); + + return APR_SUCCESS; +} + + +APR_DECLARE(apr_status_t) apr_gethostname(char *buf, int len, + apr_pool_t *cont) +{ + if (gethostname(buf, len) == -1) { + buf[0] = '\0'; + return apr_get_netos_error(); + } + else if (!memchr(buf, '\0', len)) { /* buffer too small */ + buf[0] = '\0'; + return APR_ENAMETOOLONG; + } + return APR_SUCCESS; +} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/passwd/.libs/apr_getpass.o b/rubbos/app/httpd-2.0.64/srclib/apr/passwd/.libs/apr_getpass.o new file mode 100644 index 0000000000000000000000000000000000000000..082543494bab7dcb801b22949002f437e41fff43 GIT binary patch literal 5760 zcmbtYeQX>@6@RmP7hiM9*^aNNt+di1N}HD6p6#5RlD4Vs#EBDGP14vT(4y;otnZH6 zd&lk`cG{?*L_wHVYAdzCA1z-(LI{Zp@l~n+L{y?d0*Rs`ML?k{R2130d8-+1-q-PB+Db+~{2$t47SyRh*`w*5}_6aSds_|g1^QlkEzIT*YA&!1m> z>(+-pHuLbSk5~W+nI|QOvuR9crBOXBks`se24t5|T}pLgo3bUTvlGdt7lM_Nnx!a- zR5BH!(Na{&x8Im0gkvbWjF-rY$I&85$-B;=m`r^KpE80hlC`jcx=nN4j(?zZ7RiA{ z3Il0+h^t?rj+>sDc;R0->m7uOtKVWHt6r~4L~1+fA>P#1%nwNCCT%E-x1UG$;BOcn zd|eAaW?_hXxQ@JGv1A4KTomJg%gya(T%B(#tNor>>KZ1|@Kbg>Pj2YkwVp!jAEKZT zB_doUqG~>eNk%9Um60-KNyt*=vMxSw-(lPKJ)5RU3A3^|wC!NvGJzB?OMP@TLf4CKZ<(mQFSSOIp-BIsv#@zRdPbon{MI)Z!T?33ynG@mP!h zMXXag)>0Jf!&;2TI<+a5-tAad*#w-_;$j4yW-03Sv2=e#IT_hl&=l=!!T6@+CP#o~ zN73#=2{$@6`Sz0%J@l+1fQ2DEc^3R0H6i|;*@;j2-bYjvI)PtkdexOq%`L3oJyn`2 z=2x0tXFXr{I)zFz3_wy=nw3JmTHQ=3I(KV-aGXet#|0?2{Zicx+vOl|sx+t|^qXFN zpVOdEP7u~=?lQ_aCuE{vD;L-Iy_QltUK433v#`Jm52(0t4-g;41%qXeZ=wE=Cvwb~9rQaWDH ztb1-PN8GMw58OLP(rCJCEx$%nheD+lhAXb;Rv!%tey37t1%-0EU1)@1yOy7H#+|8R zA@HkIXml<}=Nd#Qs*SP_?KK=BNHH3^tcDtXse}oD3r#g9HE6W_Fc-y9vz3#PaZ06{ z8-#H5fu-D`94@9)%;i_Zj_2N2$HDr|Dyn6_+PDulM}7*8^<4hMWG=sa^4KAK24T7S zXdY`7y4A4d%eASt&tYy4R^8PAXRZc7dE0BHdMoVCNmo8R*LHbT%V8(Lg@B`n4jstt zU8;1vu%m{RpX^9&;)#i(GhVzyq4=h!{e(?C_8^G$A+cx2KFKH?-utD`h8i*F$h><**D+B?!Qg zXw9v3>ZPW)+(Mg_%aw}neo|{It!fXm?3cZ|+v|-7&eeQO2~M@Oy6R%V91rX2;M(M6 zojH)(C@uTtRry8a3H~2l4t=p)>RuCzGtIL3Qi;CZY~O>uy00<7-Sn^$)>$9Hp7Q8& zk1~E6<9OzK+82AYu0k>5jntJhFxVEApZYFiyc@&Gdf=ZT;q-lh?AY zKh2+R$>#j=u=gGRpE-ZlNNA|g+9Ll+&ad|w<)=Hhng7#>QA~55*X2bY;7dkAt?K^C zE&N~PM0cV+-n5_YpF^XTw`-`o|V#^ijfq)|Hiq%KgKZiIkNsj})fBWGFx4@5YfuGs}mluof<#W@;taNnY z#O%yM>BNyEr{@++i!-webEW7KMRa|i!A~*ozz|C-z|@B^$rW8kd9^9KGC*1u}t&+>SFXy8@GUo&v^ z-!Xt+7`VRkzG>iZu&&oZ*T2O0d)!mH__}ZB{F?th=IQS;;qkZCn8E)(^WPuCiT@$S z_r`FFrT67z3@832=I@W;#1C1YiQ&Y5o%zQZr;g^ek8#)F53ueT_?@h;8MwZeooAdn zia*WqKX2gr&H9poe~|e +#endif +#if APR_HAVE_ERRNO_H +#include +#endif + +#if APR_HAVE_UNISTD_H +#include +#endif +#if APR_HAVE_CONIO_H +#pragma warning(disable: 4032) +#include +#pragma warning(default: 4032) +#endif +#if APR_HAVE_STDLIB_H +#include +#endif +#if APR_HAVE_STRING_H +#include +#endif +#if APR_HAVE_STRINGS_H +#include +#endif + +#if defined(HAVE_TERMIOS_H) && !defined(HAVE_GETPASS) +#include +#endif + +#if !APR_CHARSET_EBCDIC +#define LF 10 +#define CR 13 +#else /* APR_CHARSET_EBCDIC */ +#define LF '\n' +#define CR '\r' +#endif /* APR_CHARSET_EBCDIC */ + +#define MAX_STRING_LEN 256 + +#define ERR_OVERFLOW 5 + +#ifndef HAVE_GETPASS + +/* MPE, Win32, NetWare and BeOS all lack a native getpass() */ + +#if !defined(HAVE_TERMIOS_H) && !defined(WIN32) && !defined(NETWARE) +/* + * MPE lacks getpass() and a way to suppress stdin echo. So for now, just + * issue the prompt and read the results with echo. (Ugh). + */ + +static char *getpass(const char *prompt) +{ + static char password[MAX_STRING_LEN]; + + fputs(prompt, stderr); + fgets((char *) &password, sizeof(password), stdin); + + return (char *) &password; +} + +#elif defined (HAVE_TERMIOS_H) +#include + +static char *getpass(const char *prompt) +{ + struct termios attr; + static char password[MAX_STRING_LEN]; + int n=0; + fputs(prompt, stderr); + fflush(stderr); + + if (tcgetattr(STDIN_FILENO, &attr) != 0) + return NULL; + attr.c_lflag &= ~(ECHO); + + if (tcsetattr(STDIN_FILENO, TCSAFLUSH, &attr) != 0) + return NULL; + while ((password[n] = getchar()) != '\n') { + if (n < sizeof(password) - 1 && password[n] >= ' ' && password[n] <= '~') { + n++; + } else { + fprintf(stderr,"\n"); + fputs(prompt, stderr); + fflush(stderr); + n = 0; + } + } + + password[n] = '\0'; + printf("\n"); + if (n > (MAX_STRING_LEN - 1)) { + password[MAX_STRING_LEN - 1] = '\0'; + } + + attr.c_lflag |= ECHO; + tcsetattr(STDIN_FILENO, TCSANOW, &attr); + return (char*) &password; +} + +#else + +/* + * Windows lacks getpass(). So we'll re-implement it here. + */ + +static char *getpass(const char *prompt) +{ +/* WCE lacks console. So the getpass is unsuported + * The only way is to use the GUI so the getpass should be implemented + * on per-application basis. + */ +#ifdef _WIN32_WCE + return NULL; +#else + static char password[128]; + int n = 0; + int ch; + + fputs(prompt, stderr); + + while ((ch = _getch()) != '\r') { + if (ch == EOF) /* EOF */ { + fputs("[EOF]\n", stderr); + return NULL; + } + else if (ch == 0 || ch == 0xE0) { + /* FN Keys (0 or E0) are a sentinal for a FN code */ + ch = (ch << 4) | _getch(); + /* Catch {DELETE}, {<--}, Num{DEL} and Num{<--} */ + if ((ch == 0xE53 || ch == 0xE4B || ch == 0x053 || ch == 0x04b) && n) { + password[--n] = '\0'; + fputs("\b \b", stderr); + } + else { + fputc('\a', stderr); + } + } + else if ((ch == '\b' || ch == 127) && n) /* BS/DEL */ { + password[--n] = '\0'; + fputs("\b \b", stderr); + } + else if (ch == 3) /* CTRL+C */ { + /* _getch() bypasses Ctrl+C but not Ctrl+Break detection! */ + fputs("^C\n", stderr); + exit(-1); + } + else if (ch == 26) /* CTRL+Z */ { + fputs("^Z\n", stderr); + return NULL; + } + else if (ch == 27) /* ESC */ { + fputc('\n', stderr); + fputs(prompt, stderr); + n = 0; + } + else if ((n < sizeof(password) - 1) && !apr_iscntrl(ch)) { + password[n++] = ch; + fputc('*', stderr); + } + else { + fputc('\a', stderr); + } + } + + fputc('\n', stderr); + password[n] = '\0'; + return password; +#endif +} + +#endif /* no getchar or _getch */ + +#endif /* no getpass */ + +/* + * Use the OS getpass() routine (or our own) to obtain a password from + * the input stream. + * + * Exit values: + * 0: Success + * 5: Partial success; entered text truncated to the size of the + * destination buffer + * + * Restrictions: Truncation also occurs according to the host system's + * getpass() semantics, or at position 255 if our own version is used, + * but the caller is *not* made aware of it unless their own buffer is + * smaller than our own. + */ + +APR_DECLARE(apr_status_t) apr_password_get(const char *prompt, char *pwbuf, apr_size_t *bufsiz) +{ +#ifdef HAVE_GETPASSPHRASE + char *pw_got = getpassphrase(prompt); +#else + char *pw_got = getpass(prompt); +#endif + if (!pw_got) + return APR_EINVAL; + apr_cpystrn(pwbuf, pw_got, *bufsiz); + memset(pw_got, 0, strlen(pw_got)); + if (strlen(pw_got) >= *bufsiz) { + return APR_ENAMETOOLONG; + } + return APR_SUCCESS; +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/passwd/apr_getpass.lo b/rubbos/app/httpd-2.0.64/srclib/apr/passwd/apr_getpass.lo new file mode 100644 index 00000000..9bf0f5e0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/passwd/apr_getpass.lo @@ -0,0 +1,12 @@ +# apr_getpass.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/apr_getpass.o' + +# Name of the non-PIC object. +non_pic_object='apr_getpass.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/passwd/apr_getpass.o b/rubbos/app/httpd-2.0.64/srclib/apr/passwd/apr_getpass.o new file mode 100644 index 0000000000000000000000000000000000000000..534e01fe050ee618aaa78399fc7b735dc3b2ac70 GIT binary patch literal 5720 zcmbtYYit}>6+U-nH{NEGwHw*V5dPD*yCuTN*BQ#~w^BE_O)5=TLN+FOe0WM~@^W?>LQWGW8vN$_#RntdlEf+ceg#_y@{nl>%6$ zG?1o;xcW6}SoFxmi~qz?ZzEJ({T4gf^mz@HlM{JV^oNykt$_L$`sMQitnp{&#&H2OOyn_Dm-$j6GN=vWIT`-+#-ztHrmE1jBKSif_oG*is4 zG`-GxzV3Ajm1Y=#q^vY6g?hExPboTg>UeORNR8(OD7XDm-3{C2AaJVGsUY;5UVWd_ zpifQ^)@trD>NqB3qGGEM*Y~}aGCN)qX{h6;fwHLtfpRKCIq?Xpslh7tRUux!c>3WF z5|;hfr_LvY{j|7p;T0>1GqBR~>N)wK&qC0A(k+Eh=`5oLrBby4ZNIhJ4na~nUeK(2 zZY@XLZe$PKJ4Ui-xN9xHMni}D?qA9s$>D4{#awg zbAwQ>O0|6!V?0=OR|6cg3M77etyFJ?-M;8K56`w;Ue9va32+JEz9UBtgeenXZ&Wy z@yz$g3q4lXpd4|bb*7yEYy1qxnmH-Iu3w8@CxrHMrw|)7{>wc620Ll|boVsJKQ|yJ zLhv!yz2E4ZVFG<*OpM}BaNW-uPQ!%9H;I2uUX%eQDOpU+_(#w;X#D?>m$hy@jh}AG z=J@f*5A6S+xPI0sXqeF2r2bxcEd!+pPaZ#3-jZ&TI0bkNdzVs7>8o+9dvY zE_56E`}=P{@wU088I=(O19Z|qNj#c&=n4#_dMO`%=%PjQ2lqPvnX`F;$qg1`{FwB67ZL6 zaZKy>z!jr@4C)EtgJzg;-sCzlw>HRMoCZpKJ^EgkEl*Z2MwYF9W%fC2^?Pvu&XaC< z?CvkN9*-?oqz3}Zup>4Jy7U>2lUq_1BE{?5x$^c^&1&=&Hpar6Wp5T?N-K#&qr1wlQEope`I^Vf#1#t z>X3nV7(Zs3><&_N?9}Tf3tng!1b@h4Ff;G_GJTS z6P`2hG}ryQfnQ?$2L}Ea<3BR+6O8}V!1Z1BeFNXge7!z;-Al~-kXxeBp3}0G<23&h z?9ks^!sBnD34{L;^FJBGiT^3a_r`F_#n%Ctj^V_=$o%~=ocJEwhhsSL-(|j@Cvwxc z_A%}n{2{h=K0U767+*8^`o49JacU_4Ea(5Kf$KNsD+Yc$^M7LCx}P5y_&oFVB2ho- xPw$f(dGR#9o8$Kx_yXe(8TcN?^}B`g#J@iDP9q^2hf4d;^4X8)7$socketdes; + } + + if (aprset[i].reqevents & APR_POLLOUT) { + pollset[pos_write++] = aprset[i].desc.s->socketdes; + } + + if (aprset[i].reqevents & APR_POLLPRI) { + pollset[pos_except++] = aprset[i].desc.s->socketdes; + } + + aprset[i].rtnevents = 0; + } + } + + if (timeout > 0) { + timeout /= 1000; /* convert microseconds to milliseconds */ + } + + i = select(pollset, num_read, num_write, num_except, timeout); + (*nsds) = i; + + if ((*nsds) < 0) { + return APR_FROM_OS_ERROR(sock_errno()); + } + + if ((*nsds) == 0) { + return APR_TIMEUP; + } + + pos_read = 0; + pos_write = num_read; + pos_except = pos_write + num_write; + + for (i = 0; i < num; i++) { + if (aprset[i].desc_type == APR_POLL_SOCKET) { + if (aprset[i].reqevents & APR_POLLIN) { + if (pollset[pos_read++] > 0) { + aprset[i].rtnevents |= APR_POLLIN; + } + } + + if (aprset[i].reqevents & APR_POLLOUT) { + if (pollset[pos_write++] > 0) { + aprset[i].rtnevents |= APR_POLLOUT; + } + } + + if (aprset[i].reqevents & APR_POLLPRI) { + if (pollset[pos_except++] > 0) { + aprset[i].rtnevents |= APR_POLLPRI; + } + } + } + } + + return APR_SUCCESS; +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/poll/os2/pollacc.c b/rubbos/app/httpd-2.0.64/srclib/apr/poll/os2/pollacc.c new file mode 100644 index 00000000..ac87d0aa --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/poll/os2/pollacc.c @@ -0,0 +1 @@ +#include "../unix/pollacc.c" diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/poll/os2/pollset.c b/rubbos/app/httpd-2.0.64/srclib/apr/poll/os2/pollset.c new file mode 100644 index 00000000..872571f8 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/poll/os2/pollset.c @@ -0,0 +1,220 @@ +/* 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. + */ + +#include "apr.h" +#include "apr_poll.h" +#include "apr_arch_networkio.h" + + + +struct apr_pollset_t { + apr_pool_t *pool; + apr_uint32_t nelts; + apr_uint32_t nalloc; + int *pollset; + int num_read; + int num_write; + int num_except; + int num_total; + apr_pollfd_t *query_set; + apr_pollfd_t *result_set; +}; + + + +APR_DECLARE(apr_status_t) apr_pollset_create(apr_pollset_t **pollset, + apr_uint32_t size, + apr_pool_t *p, + apr_uint32_t flags) +{ + *pollset = apr_palloc(p, sizeof(**pollset)); + (*pollset)->pool = p; + (*pollset)->nelts = 0; + (*pollset)->nalloc = size; + (*pollset)->pollset = apr_palloc(p, size * sizeof(int) * 3); + (*pollset)->query_set = apr_palloc(p, size * sizeof(apr_pollfd_t)); + (*pollset)->result_set = apr_palloc(p, size * sizeof(apr_pollfd_t)); + (*pollset)->num_read = -1; + return APR_SUCCESS; +} + + + +APR_DECLARE(apr_status_t) apr_pollset_destroy(apr_pollset_t *pollset) +{ + /* A no-op function for now. If we later implement /dev/poll + * support, we'll need to close the /dev/poll fd here + */ + return APR_SUCCESS; +} + + + +APR_DECLARE(apr_status_t) apr_pollset_add(apr_pollset_t *pollset, + const apr_pollfd_t *descriptor) +{ + if (pollset->nelts == pollset->nalloc) { + return APR_ENOMEM; + } + + pollset->query_set[pollset->nelts] = *descriptor; + + if (descriptor->desc_type != APR_POLL_SOCKET) { + return APR_EBADF; + } + + pollset->nelts++; + pollset->num_read = -1; + return APR_SUCCESS; +} + + + +APR_DECLARE(apr_status_t) apr_pollset_remove(apr_pollset_t *pollset, + const apr_pollfd_t *descriptor) +{ + apr_uint32_t i; + + for (i = 0; i < pollset->nelts; i++) { + if (descriptor->desc.s == pollset->query_set[i].desc.s) { + /* Found an instance of the fd: remove this and any other copies */ + apr_uint32_t dst = i; + apr_uint32_t old_nelts = pollset->nelts; + pollset->nelts--; + + for (i++; i < old_nelts; i++) { + if (descriptor->desc.s == pollset->query_set[i].desc.s) { + pollset->nelts--; + } + else { + pollset->pollset[dst] = pollset->pollset[i]; + pollset->query_set[dst] = pollset->query_set[i]; + dst++; + } + } + + pollset->num_read = -1; + return APR_SUCCESS; + } + } + + return APR_NOTFOUND; +} + + + +static void make_pollset(apr_pollset_t *pollset) +{ + int i; + int pos = 0; + + pollset->num_read = 0; + pollset->num_write = 0; + pollset->num_except = 0; + + for (i = 0; i < pollset->nelts; i++) { + if (pollset->query_set[i].reqevents & APR_POLLIN) { + pollset->pollset[pos++] = pollset->query_set[i].desc.s->socketdes; + pollset->num_read++; + } + } + + for (i = 0; i < pollset->nelts; i++) { + if (pollset->query_set[i].reqevents & APR_POLLOUT) { + pollset->pollset[pos++] = pollset->query_set[i].desc.s->socketdes; + pollset->num_write++; + } + } + + for (i = 0; i < pollset->nelts; i++) { + if (pollset->query_set[i].reqevents & APR_POLLPRI) { + pollset->pollset[pos++] = pollset->query_set[i].desc.s->socketdes; + pollset->num_except++; + } + } + + pollset->num_total = pollset->num_read + pollset->num_write + pollset->num_except; +} + + + +APR_DECLARE(apr_status_t) apr_pollset_poll(apr_pollset_t *pollset, + apr_interval_time_t timeout, + apr_int32_t *num, + const apr_pollfd_t **descriptors) +{ + int rv; + apr_uint32_t i; + int *pollresult; + int read_pos, write_pos, except_pos; + + if (pollset->num_read < 0) { + make_pollset(pollset); + } + + pollresult = alloca(sizeof(int) * pollset->num_total); + memcpy(pollresult, pollset->pollset, sizeof(int) * pollset->num_total); + (*num) = 0; + + if (timeout > 0) { + timeout /= 1000; + } + + rv = select(pollresult, pollset->num_read, pollset->num_write, pollset->num_except, timeout); + + if (rv < 0) { + return APR_FROM_OS_ERROR(sock_errno()); + } + + if (rv == 0) { + return APR_TIMEUP; + } + + read_pos = 0; + write_pos = pollset->num_read; + except_pos = pollset->num_read + pollset->num_write; + + for (i = 0; i < pollset->nelts; i++) { + int rtnevents = 0; + + if (pollset->query_set[i].reqevents & APR_POLLIN) { + if (pollresult[read_pos++] != -1) { + rtnevents |= APR_POLLIN; + } + } + + if (pollset->query_set[i].reqevents & APR_POLLOUT) { + if (pollresult[write_pos++] != -1) { + rtnevents |= APR_POLLOUT; + } + } + + if (pollset->query_set[i].reqevents & APR_POLLPRI) { + if (pollresult[except_pos++] != -1) { + rtnevents |= APR_POLLPRI; + } + } + + if (rtnevents) { + pollset->result_set[*num] = pollset->query_set[i]; + pollset->result_set[*num].rtnevents = rtnevents; + (*num)++; + } + } + + *descriptors = pollset->result_set; + return APR_SUCCESS; +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/poll/unix/.libs/poll.o b/rubbos/app/httpd-2.0.64/srclib/apr/poll/unix/.libs/poll.o new file mode 100644 index 0000000000000000000000000000000000000000..3b0e57b9650f088e387ddd39a782343311e70cfe GIT binary patch literal 20432 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/poll/unix/.libs/pollacc.o b/rubbos/app/httpd-2.0.64/srclib/apr/poll/unix/.libs/pollacc.o new file mode 100644 index 0000000000000000000000000000000000000000..d5a506db1035cc8cdb142f5076a8b0d0bf850300 GIT binary patch literal 16824 zcmb_j4Rll2k-kroZGnv}+XPH;KqLg5f@KSg>p((m^J6(UV6e?k2obXMWUJVcB0XV; zc1emM8-+~|$@Xm8EN#;Eq?@$c=BMo@yKNeicH{Ivzo)c0{aeyDDd{dLn>1~H*qM80 zo}Mq}oSvS&2kXszckayGnYs7f_atuK(7n-R7=oK2)`}v>s1PR?73nrfwuw2SMzr^J z72XXOe$pQ`$x z5``TV-&S%`*|!tH%7ura3-qqZ`t!3-*W3K~Qvt-RIpYVs?);g@Z>}Q)isNsdetc&|;>fdBW$39Xet|+c59z+O3#Zc;`tE7(_+Q-C90*AG zj?O^%ic$a39&fmE{g014pZ^Vpq$zyGkFAB_qdmV07pma$YPhh~3s;!`RzFcQZR zzYfOMNbL_8T?I(XWc$BkPkyxRtw~qqk-q~PC{N{)e*|iM;k%)U6R)}3-#Xzr8~&0t zbFvIjP&4TP$Ysq8O#tlz!|%6`|JtzJPnU_K>%85C4I+HBx4ym52Ikyd1>gWF^wfvP zzvB%}?B0XPpnTpjW;`uK`y*S>0c$+;JZfwoe+{(mcwf45IDhWkIhI!*K)(mQc!A1=d-SC>o9#N|;Jueunes;>kuZcj-vWeJy8a?*f%{08Vy zzaX-ZuraofD@5^mi^BJz(k+< zC1`dj{Eer9_9*&)_kfFDHMp+q-9CHp`;Niq@Y%+3o1SZY9cZa?=5iD- z_5KLFD!-l4@|Ir!kDH15kfIf>p8~Md`vQE*Xk}*gJq`Jlk(kwg7GR>cqfW2FcN_-V zujrk3fK08TccDz3qOU_bpy=JNf=s=luSdK|(R+RmHk%cF1LCcUj-viHMGqhzR&)## z-=pX_;yV>>BEDDAgC%esQj`q2R-1sVrCkLff-Uvg-m)z zF@DKdim5hC@L)_ab7Y;|qL{fx7xWxbOs#P{Xd72dopBE^w<+c_BLiZ`6caQK0rN@4 zG)m?^#WYFg0mXzQ^RQx8$ijPEG0oDq3B|M+_ko@7h*_Xh`0kN4RqMMCC#gdDStN=6 z98Q6Bz)HPXgg&fYbi48+Kp=|Ql<32Z)~J%N{K%i7!~ldcUVy7n8upYe z#APZCmo55+>{c@Q2*~*TWiQNz#abnYy;LNBve-sXHUlYqxCtOAJ*gBv9F9GbFB3jA ziR)hSZe`tH_MF;D(5avOUK;k{7BIqsWy)j!qho+bk9(@(i(uE39#@&ga}2;ji;Qk5o-AnG*gN zzYhX3&;Fmt+gho2IdsnUR9`U*JiiEf>C=$3OMbf51gqD+4zhl4b^A(?tx1UL4oT!h z^|~u?-lblw$5JmQR)(Z{eJ$XM?Cb{;r9`0mng@WW&WP$w#n@DLqX#NB)z{`>vMROJ zo00a(NmXyT8e~+=s(WyT1m zj?DJV+Jn30`LhRsQ!r=_>UDMF8242mIJd|Xi8&w=Z$;o1G-GKRgbnR}H!PYWAWsVA?4oPhDQ~42Kv0|{*;fGNtg9_Be<*1pO zpRUFNKMYkUjmb{n#(NO1(G*<@+k9 z?=7UwI9>po%DYu^y3lb6b{Z`h2&0b}OtrD~QrXjrf<`~-?R4s0jRMe&;{iAUsIi?$ z8vVp5t;%92TU7DxLUu9ckz0TWqwBJrXtQs@wbZ*r7g-uZfvo_SdeK=m>1|HuHnFzj zPl89vg>CGDaHI+l=DFlzJ5*|F$U$D+!ydXzL` z+^5($v!wf=Q}=RPcf!_vkO!zqAC$@MQ^~yr`|RW%bE-OJtNNX->KKyPR5*{}zJu*@ zXN4nR-1R(2F2w5Y(Mnsd;69fZj+v!iobm^8Y|R6BA6DdpNG?P45d2}uFGoV2D3{CI zFy6sLc~~9?mg9M}p9ch_Q3UcMF}*guE_|2%Vq+qb%W zO?g+15G9o$0^Z;S`LY_r?JFB$~!bsQ)F?&bd0*F9t_pNIcHALxO$$N z(b9QcHG%Txd1z~HiS0V*lV>%^)T6KL;Xzl*ia9XMRRyVo6?Sv z^gZ^dekQ+3(DX5$pxzgY1DV|JQYH+soyi>pDP7F*iysi2;uJ8f{)e{uJ|_EZ^}S58 zLR8;(FLOopy}EjQbAioe>*`^WM;l@%lSM_m2-Il!#M`yf!F!16;vu#m5kDovFVmGB z36Udv>3X5@+o0biz6zra;~n2D_>?b?k#EfBvW>}9Y&ah`8^>B(A}!4g!^u>BtYI*f zZyZQkIUz-clLL)|vDo<{&B0b4uOwMn%CwU3Hw6^IU?cn^k*Qo`G#eXg%%_rLLS)jz z!_inQ7{dVMtZXthxH32-z+vmAjG0qp&Wgv)1kfV8eQJ)9<$stc0S~e8ER|0jltJhd_ZFtk*VL+a^ z*&A@JgBnUCQ*r5Y1fwq^k#r&vu|%Y6OC)PXq07pONNgwyPrf`mDQQ}f*svMR3V0@N ziD0H+ERuOZ4w#@KYmTHXQ+7r2seP&R==mx}qPcyx-b5S?=Z4Z*YapMnVKxUg1mFoX zYsN)9nKffpGM$pO1g2v{(q|Be3`BFL9IfgplE|httyTn<;RxaUgA3K$@|AxyEdMU?81qjAk;8 zLzb0^H>?OY1zVaMbJ-ZKHHcUv)`MCQP!H+6B~s>?rQEZkRz3$Ri*BJeESr0 zJO^u>ub5}bA=I~>B8;XA0SbVrmS*ssswNYSH>29f0W+HhXJXM|6fv`jXw0dIpgR0C$!JA^0WX=6%%F0DR zQi71dST>ol(pkvwkeN+VoTupT=-w3BvT>uFMI@gyvseJ&6>b=qEA(y@hMLl%l->*_ z3iA-soRHNTn4%M-pwvj!w@== zwNh#_B5#KYaJf=sqGVbjy(8(kDH1aO?0nH+@0N9&HuTA)B%&k9;hT!F0wwtj^c*m8 zCsyS^GQ~|B1Lz0<*3C#1vH%qZUCMp*3c_X27-l5ri7}9KRC`8x7=)0-@S@3xDPk!L z)`6K$M1~+WR8nSkKNJo|9|p)O&Bf9no{Wo3Hf^P2>0yCc=-<3)^OhZ(i^U>~BbLuX zS%6EXh3i-41|sO(iUd^<)($Q%m<^LXxYg~qq62Vepd~SY6NLK~gj&`pD1|*vdP|!N zPTt=Cpg32k!pOpJZ?{*$(WapVItK#{TUG=b5<2(uKBLxT*1VAxqS{EYO06Lo zt&zNCj=>N}D^#pp?^MGw>9}|za&Z;65E)=v7!(9~3bBOfT(@p@puT?~pR)2Q0u3wj zk_#OSH3yrTFIOm@Bxd6WG~>WFVT}2W`4weeJj>SuCSUEqRX+T6`27Fi>h#s#>R#^) zjC&6HYTJGO4*3??4>Do+!^STd5xZU@Lae4MVi}_O!4k2$ker`)bGC-M)b9V>5lV>wNxppZA(_B^AuwGyc1g9F7Jd;Fbu= zTXb+BmlHvW#?68JAlz$U4Fwe)9TEE%^Vb1wap^6VIhnS{rft^8v=*+2#WykDN{r=rQ?L zu9$bMBecU$FSR7Ugm5@+Pid#@6YLaN>Tn{Mchvc}j>mdLzx2lTTPvpa=&~W`o^JjV zG=J|LH6G^=XZiEy-vOAe6GzOi#83F5Sc`)$+XFH>hU0SbJ0l^k)tu91_g-N9g!*np zG@&v_)5q_IKFx%bex^+g;_*0t{0c|& zW$}kD)A|2)n;OA&ivD9M=>C5kFx1KO1X8wJY2Xoh@69;d=j*4SW4iI>0X2fkh=<#A zTJmCzGMH+rAms|50(=yDcwHSk0ZdU4#+G9p(H+U*n(G;kIW#waYD6=2Q$hx1f8a*5y{e z!_iQbhwn?KX>R!9cDm+PUu>V(<(8S63Zp00j=0G)2VnRXd^+v89;d_CTmbI?9QF6W z6&s&ZwgZj$F^Lw>D*Fh3mheq>0AvbcK!L)d5pK8 z!JQzT?RBNu065pWV2PmGaHN2ht;BRBt?mv_MeoelF z&LMj>{4+GKeHy-t?C#fai{=a8#>&Qa^EBU&YxpLz%U|}ed^73!f+k->_@f%Wgz#@^ z_$cxGoe=AfP#k`#$us_nhBuI(uW9(-lb*k5_yLkHCBN9N`biV)X&PQb;}>Z7QxyLX zYWPyp-=g6+lRq6Ao+3S)HGB@?*J=1ysD2U}4qw8{meuh4i9e{}kCXiE8a_h&KWTUm z)yd~H9M7THzM|n}r2juOe30--4d>^b7c~6m6#rjp_*`XHoYruz%Rgzj`eiqqbttZ! z_bBD7Qo|PzKVQQaQXcCy{QKn3Dh=nl?9lL!5Whvk@uzv%uGjENihokWmr^|UYxrWN zMvQCtXDFV>H2iDCe_F%Ok^C1m{7tg^n1)vp{v8eHbJ%kl{x8J;Lc_}`f2TEkHO1j= z4c|m|ODI2_-!77`*6%|A^#H^ zzLM-_HGDVWk7zjWZ{O5#59M)E!#5EBf`)&F{QQ-MXQ)2UYWO|m|N9z_-$Y}ZLH!)( z=Lp}R;T^adbnPb-%I?EhVy=BY4}Rw`FVo%^L^-UP5uqa%jY%x zEb$L%_(K%8Z)kXy{C`=)nL*=p7B`{n4O0V*mG2UdlB5Hq!6Y@DJ0xxE@*0 zOXNSF?-(Da`q{4OVSHG_cMw0O;TIEsSi?U-{vXru50Ib7HN1}E@}P#7lAfOUtH@s*^1DZS9*_&-hY zU!ma!<#(-ylepNd;a?_yc4>GU`5)KtACN!$HT-qba|_`ZE>a;)f7T&SA(8mQ8qUwd zUw7abA3n!F>A+FX5vfIpX9#Dz{2Rton*4Jl|3?jZlUQM3kzsG^&ygo$!3^;I%1Lq~J;a5=nKdRxJuiG_zf|BzI!g*eN?)s7@ z&-&GWsVded`}3cgJkRUL4jku|p?SUNz;Rye=PAN$a^6dXM2aa|hB>#6faA#iP8orIzW6FV}p8p~}IS1~H!y&?XUhL<64tb|P z_g_GM!Xc0Pe?RjKfl)GIS!{CINA+T{hV>&&N#fM;SIEJl%Wtb>_$C?{eVi&qng+ZU>I!yA;pQI&hS~pX9$tINRmli9YI(r=V*sF`EQ3jl1C|zf7Wn*-{h%4E5&^A{ce$l7s!7Khs-aPtQ_x`pT&Kc ySo^&?&zJE45$GPdC=tHTFy2FQd+EyfG2$%^=k<7-hVwc)uHjsV4{JEr!~X%7 +#endif +#if HAVE_SYS_POLL_H +#include +#endif +#if HAVE_ALLOCA_H +#include +#endif + +#ifdef NETWARE +#define HAS_SOCKETS(dt) (dt == APR_POLL_SOCKET) ? 1 : 0 +#define HAS_PIPES(dt) (dt == APR_POLL_FILE) ? 1 : 0 +#endif + +#ifdef HAVE_POLL /* We can just use poll to do our socket polling. */ + +static apr_int16_t get_event(apr_int16_t event) +{ + apr_int16_t rv = 0; + + if (event & APR_POLLIN) + rv |= POLLIN; + if (event & APR_POLLPRI) + rv |= POLLPRI; + if (event & APR_POLLOUT) + rv |= POLLOUT; + if (event & APR_POLLERR) + rv |= POLLERR; + if (event & APR_POLLHUP) + rv |= POLLHUP; + if (event & APR_POLLNVAL) + rv |= POLLNVAL; + + return rv; +} + +static apr_int16_t get_revent(apr_int16_t event) +{ + apr_int16_t rv = 0; + + if (event & POLLIN) + rv |= APR_POLLIN; + if (event & POLLPRI) + rv |= APR_POLLPRI; + if (event & POLLOUT) + rv |= APR_POLLOUT; + if (event & POLLERR) + rv |= APR_POLLERR; + if (event & POLLHUP) + rv |= APR_POLLHUP; + if (event & POLLNVAL) + rv |= APR_POLLNVAL; + + return rv; +} + +#define SMALL_POLLSET_LIMIT 8 + +APR_DECLARE(apr_status_t) apr_poll(apr_pollfd_t *aprset, apr_int32_t num, + apr_int32_t *nsds, apr_interval_time_t timeout) +{ + int i, num_to_poll; +#ifdef HAVE_VLA + /* XXX: I trust that this is a segv when insufficient stack exists? */ + struct pollfd pollset[num]; +#elif defined(HAVE_ALLOCA) + struct pollfd *pollset = alloca(sizeof(struct pollfd) * num); + if (!pollset) + return APR_ENOMEM; +#else + struct pollfd tmp_pollset[SMALL_POLLSET_LIMIT]; + struct pollfd *pollset; + + if (num <= SMALL_POLLSET_LIMIT) { + pollset = tmp_pollset; + } + else { + /* This does require O(n) to copy the descriptors to the internal + * mapping. + */ + pollset = malloc(sizeof(struct pollfd) * num); + /* The other option is adding an apr_pool_abort() fn to invoke + * the pool's out of memory handler + */ + if (!pollset) + return APR_ENOMEM; + } +#endif + for (i = 0; i < num; i++) { + if (aprset[i].desc_type == APR_POLL_SOCKET) { + pollset[i].fd = aprset[i].desc.s->socketdes; + } + else if (aprset[i].desc_type == APR_POLL_FILE) { + pollset[i].fd = aprset[i].desc.f->filedes; + } + else { + break; + } + pollset[i].events = get_event(aprset[i].reqevents); + } + num_to_poll = i; + + if (timeout > 0) { + timeout /= 1000; /* convert microseconds to milliseconds */ + } + + i = poll(pollset, num_to_poll, timeout); + (*nsds) = i; + + for (i = 0; i < num; i++) { + aprset[i].rtnevents = get_revent(pollset[i].revents); + } + +#if !defined(HAVE_VLA) && !defined(HAVE_ALLOCA) + if (num > SMALL_POLLSET_LIMIT) { + free(pollset); + } +#endif + + if ((*nsds) < 0) { + return apr_get_netos_error(); + } + if ((*nsds) == 0) { + return APR_TIMEUP; + } + return APR_SUCCESS; +} + + +#else /* Use select to mimic poll */ + +APR_DECLARE(apr_status_t) apr_poll(apr_pollfd_t *aprset, int num, apr_int32_t *nsds, + apr_interval_time_t timeout) +{ + fd_set readset, writeset, exceptset; + int rv, i; + int maxfd = -1; + struct timeval tv, *tvptr; +#ifdef NETWARE + apr_datatype_e set_type = APR_NO_DESC; +#endif + + if (timeout < 0) { + tvptr = NULL; + } + else { + tv.tv_sec = (long)apr_time_sec(timeout); + tv.tv_usec = (long)apr_time_usec(timeout); + tvptr = &tv; + } + + FD_ZERO(&readset); + FD_ZERO(&writeset); + FD_ZERO(&exceptset); + + for (i = 0; i < num; i++) { + apr_os_sock_t fd; + + aprset[i].rtnevents = 0; + + if (aprset[i].desc_type == APR_POLL_SOCKET) { +#ifdef NETWARE + if (HAS_PIPES(set_type)) { + return APR_EBADF; + } + else { + set_type = APR_POLL_SOCKET; + } +#endif + fd = aprset[i].desc.s->socketdes; + } + else if (aprset[i].desc_type == APR_POLL_FILE) { +#if !APR_FILES_AS_SOCKETS + return APR_EBADF; +#else +#ifdef NETWARE + if (aprset[i].desc.f->is_pipe && !HAS_SOCKETS(set_type)) { + set_type = APR_POLL_FILE; + } + else + return APR_EBADF; +#endif /* NETWARE */ + + fd = aprset[i].desc.f->filedes; + +#endif /* APR_FILES_AS_SOCKETS */ + } + else { + break; + } +#if !defined(WIN32) && !defined(NETWARE) /* socket sets handled with array of handles */ + if (fd >= FD_SETSIZE) { + /* XXX invent new error code so application has a clue */ + return APR_EBADF; + } +#endif + if (aprset[i].reqevents & APR_POLLIN) { + FD_SET(fd, &readset); + } + if (aprset[i].reqevents & APR_POLLOUT) { + FD_SET(fd, &writeset); + } + if (aprset[i].reqevents & + (APR_POLLPRI | APR_POLLERR | APR_POLLHUP | APR_POLLNVAL)) { + FD_SET(fd, &exceptset); + } + if ((int)fd > maxfd) { + maxfd = (int)fd; + } + } + +#ifdef NETWARE + if (HAS_PIPES(set_type)) { + rv = pipe_select(maxfd + 1, &readset, &writeset, &exceptset, tvptr); + } + else { +#endif + + rv = select(maxfd + 1, &readset, &writeset, &exceptset, tvptr); + +#ifdef NETWARE + } +#endif + + (*nsds) = rv; + if ((*nsds) == 0) { + return APR_TIMEUP; + } + if ((*nsds) < 0) { + return apr_get_netos_error(); + } + + for (i = 0; i < num; i++) { + apr_os_sock_t fd; + + if (aprset[i].desc_type == APR_POLL_SOCKET) { + fd = aprset[i].desc.s->socketdes; + } + else if (aprset[i].desc_type == APR_POLL_FILE) { +#if !APR_FILES_AS_SOCKETS + return APR_EBADF; +#else + fd = aprset[i].desc.f->filedes; +#endif + } + else { + break; + } + if (FD_ISSET(fd, &readset)) { + aprset[i].rtnevents |= APR_POLLIN; + } + if (FD_ISSET(fd, &writeset)) { + aprset[i].rtnevents |= APR_POLLOUT; + } + if (FD_ISSET(fd, &exceptset)) { + aprset[i].rtnevents |= APR_POLLERR; + } + } + + return APR_SUCCESS; +} + +#endif + + +struct apr_pollset_t { + apr_uint32_t nelts; + apr_uint32_t nalloc; +#ifdef HAVE_POLL + struct pollfd *pollset; +#else + fd_set readset, writeset, exceptset; + int maxfd; +#endif + apr_pollfd_t *query_set; + apr_pollfd_t *result_set; + apr_pool_t *pool; +#ifdef NETWARE + int set_type; +#endif +}; + +APR_DECLARE(apr_status_t) apr_pollset_create(apr_pollset_t **pollset, + apr_uint32_t size, + apr_pool_t *p, + apr_uint32_t flags) +{ +#if !defined(HAVE_POLL) && defined(FD_SETSIZE) + if (size > FD_SETSIZE) { + *pollset = NULL; + return APR_EINVAL; + } +#endif + *pollset = apr_palloc(p, sizeof(**pollset)); + (*pollset)->nelts = 0; + (*pollset)->nalloc = size; +#ifdef HAVE_POLL + (*pollset)->pollset = apr_palloc(p, size * sizeof(struct pollfd)); +#else + FD_ZERO(&((*pollset)->readset)); + FD_ZERO(&((*pollset)->writeset)); + FD_ZERO(&((*pollset)->exceptset)); + (*pollset)->maxfd = 0; +#ifdef NETWARE + (*pollset)->set_type = APR_NO_DESC; +#endif +#endif + (*pollset)->query_set = apr_palloc(p, size * sizeof(apr_pollfd_t)); + (*pollset)->result_set = apr_palloc(p, size * sizeof(apr_pollfd_t)); + (*pollset)->pool = p; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_pollset_destroy(apr_pollset_t *pollset) +{ + /* A no-op function for now. If we later implement /dev/poll + * support, we'll need to close the /dev/poll fd here + */ + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_pollset_add(apr_pollset_t *pollset, + const apr_pollfd_t *descriptor) +{ +#ifndef HAVE_POLL + apr_os_sock_t fd; +#endif + + if (pollset->nelts == pollset->nalloc) { + return APR_ENOMEM; + } + + pollset->query_set[pollset->nelts] = *descriptor; +#ifdef HAVE_POLL + + if (descriptor->desc_type == APR_POLL_SOCKET) { + pollset->pollset[pollset->nelts].fd = descriptor->desc.s->socketdes; + } + else { + pollset->pollset[pollset->nelts].fd = descriptor->desc.f->filedes; + } + + pollset->pollset[pollset->nelts].events = get_event(descriptor->reqevents); +#else + if (descriptor->desc_type == APR_POLL_SOCKET) { +#ifdef NETWARE + /* NetWare can't handle mixed descriptor types in select() */ + if (HAS_PIPES(pollset->set_type)) { + return APR_EBADF; + } + else { + pollset->set_type = APR_POLL_SOCKET; + } +#endif + fd = descriptor->desc.s->socketdes; + } + else { +#if !APR_FILES_AS_SOCKETS + return APR_EBADF; +#else +#ifdef NETWARE + /* NetWare can't handle mixed descriptor types in select() */ + if (descriptor->desc.f->is_pipe && !HAS_SOCKETS(pollset->set_type)) { + pollset->set_type = APR_POLL_FILE; + fd = descriptor->desc.f->filedes; + } + else { + return APR_EBADF; + } +#else + fd = descriptor->desc.f->filedes; +#endif +#endif + } +#if !defined(WIN32) && !defined(NETWARE) /* socket sets handled with array of handles */ + if (fd >= FD_SETSIZE) { + /* XXX invent new error code so application has a clue */ + return APR_EBADF; + } +#endif + if (descriptor->reqevents & APR_POLLIN) { + FD_SET(fd, &(pollset->readset)); + } + if (descriptor->reqevents & APR_POLLOUT) { + FD_SET(fd, &(pollset->writeset)); + } + if (descriptor->reqevents & + (APR_POLLPRI | APR_POLLERR | APR_POLLHUP | APR_POLLNVAL)) { + FD_SET(fd, &(pollset->exceptset)); + } + if ((int)fd > pollset->maxfd) { + pollset->maxfd = (int)fd; + } +#endif + pollset->nelts++; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_pollset_remove(apr_pollset_t *pollset, + const apr_pollfd_t *descriptor) +{ + apr_uint32_t i; +#ifndef HAVE_POLL + apr_os_sock_t fd; +#endif + +#ifdef HAVE_POLL + for (i = 0; i < pollset->nelts; i++) { + if (descriptor->desc.s == pollset->query_set[i].desc.s) { + /* Found an instance of the fd: remove this and any other copies */ + apr_uint32_t dst = i; + apr_uint32_t old_nelts = pollset->nelts; + pollset->nelts--; + for (i++; i < old_nelts; i++) { + if (descriptor->desc.s == pollset->query_set[i].desc.s) { + pollset->nelts--; + } + else { + pollset->pollset[dst] = pollset->pollset[i]; + pollset->query_set[dst] = pollset->query_set[i]; + dst++; + } + } + return APR_SUCCESS; + } + } + +#else /* no poll */ + if (descriptor->desc_type == APR_POLL_SOCKET) { + fd = descriptor->desc.s->socketdes; + } + else { +#if !APR_FILES_AS_SOCKETS + return APR_EBADF; +#else + fd = descriptor->desc.f->filedes; +#endif + } + + for (i = 0; i < pollset->nelts; i++) { + if (descriptor->desc.s == pollset->query_set[i].desc.s) { + /* Found an instance of the fd: remove this and any other copies */ + apr_uint32_t dst = i; + apr_uint32_t old_nelts = pollset->nelts; + pollset->nelts--; + for (i++; i < old_nelts; i++) { + if (descriptor->desc.s == pollset->query_set[i].desc.s) { + pollset->nelts--; + } + else { + pollset->query_set[dst] = pollset->query_set[i]; + dst++; + } + } + FD_CLR(fd, &(pollset->readset)); + FD_CLR(fd, &(pollset->writeset)); + FD_CLR(fd, &(pollset->exceptset)); + if (((int)fd == pollset->maxfd) && (pollset->maxfd > 0)) { + pollset->maxfd--; + } + return APR_SUCCESS; + } + } +#endif /* no poll */ + + return APR_NOTFOUND; +} + +#ifdef HAVE_POLL +APR_DECLARE(apr_status_t) apr_pollset_poll(apr_pollset_t *pollset, + apr_interval_time_t timeout, + apr_int32_t *num, + const apr_pollfd_t **descriptors) +{ + int rv; + apr_uint32_t i, j; + + if (timeout > 0) { + timeout /= 1000; + } + rv = poll(pollset->pollset, pollset->nelts, timeout); + (*num) = rv; + if (rv < 0) { + return apr_get_netos_error(); + } + if (rv == 0) { + return APR_TIMEUP; + } + j = 0; + for (i = 0; i < pollset->nelts; i++) { + if (pollset->pollset[i].revents != 0) { + pollset->result_set[j] = pollset->query_set[i]; + pollset->result_set[j].rtnevents = + get_revent(pollset->pollset[i].revents); + j++; + } + } + *descriptors = pollset->result_set; + return APR_SUCCESS; +} + +#else /* no poll */ + +APR_DECLARE(apr_status_t) apr_pollset_poll(apr_pollset_t *pollset, + apr_interval_time_t timeout, + apr_int32_t *num, + const apr_pollfd_t **descriptors) +{ + int rv; + apr_uint32_t i, j; + struct timeval tv, *tvptr; + fd_set readset, writeset, exceptset; + + if (timeout < 0) { + tvptr = NULL; + } + else { + tv.tv_sec = (long)apr_time_sec(timeout); + tv.tv_usec = (long)apr_time_usec(timeout); + tvptr = &tv; + } + + memcpy(&readset, &(pollset->readset), sizeof(fd_set)); + memcpy(&writeset, &(pollset->writeset), sizeof(fd_set)); + memcpy(&exceptset, &(pollset->exceptset), sizeof(fd_set)); + +#ifdef NETWARE + if (HAS_PIPES(pollset->set_type)) { + rv = pipe_select(pollset->maxfd + 1, &readset, &writeset, &exceptset, tvptr); + } + else +#endif + rv = select(pollset->maxfd + 1, &readset, &writeset, &exceptset, tvptr); + + /* Set initial *num now for expected -1 / 0 failures, or errors below */ + (*num) = rv; + if (rv < 0) { + return apr_get_netos_error(); + } + if (rv == 0) { + return APR_TIMEUP; + } + j = 0; + for (i = 0; i < pollset->nelts; i++) { + apr_os_sock_t fd; + if (pollset->query_set[i].desc_type == APR_POLL_SOCKET) { + fd = pollset->query_set[i].desc.s->socketdes; + } + else { +#if !APR_FILES_AS_SOCKETS + return APR_EBADF; +#else + fd = pollset->query_set[i].desc.f->filedes; +#endif + } + if (FD_ISSET(fd, &readset) || FD_ISSET(fd, &writeset) || + FD_ISSET(fd, &exceptset)) { + pollset->result_set[j] = pollset->query_set[i]; + pollset->result_set[j].rtnevents = 0; + if (FD_ISSET(fd, &readset)) { + pollset->result_set[j].rtnevents |= APR_POLLIN; + } + if (FD_ISSET(fd, &writeset)) { + pollset->result_set[j].rtnevents |= APR_POLLOUT; + } + if (FD_ISSET(fd, &exceptset)) { + pollset->result_set[j].rtnevents |= APR_POLLERR; + } + j++; + } + } + + /* Reset computed *num to account for multiply-polled fd's which + * select() - on some platforms, treats as a single fd result. + * The *num returned must match the size of result_set[] + */ + (*num) = j; + *descriptors = pollset->result_set; + return APR_SUCCESS; +} + +#endif /* no poll */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/poll/unix/poll.lo b/rubbos/app/httpd-2.0.64/srclib/apr/poll/unix/poll.lo new file mode 100644 index 00000000..ee53f816 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/poll/unix/poll.lo @@ -0,0 +1,12 @@ +# poll.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/poll.o' + +# Name of the non-PIC object. +non_pic_object='poll.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/poll/unix/poll.o b/rubbos/app/httpd-2.0.64/srclib/apr/poll/unix/poll.o new file mode 100644 index 0000000000000000000000000000000000000000..d47744fd59685a6091bdd8162195a55594cce382 GIT binary patch literal 20392 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 Iaq_ +#endif +#if HAVE_SYS_POLL_H +#include +#endif + +APR_DECLARE(apr_status_t) apr_poll_setup(apr_pollfd_t **new, apr_int32_t num, apr_pool_t *cont) +{ + (*new) = (apr_pollfd_t *)apr_pcalloc(cont, sizeof(apr_pollfd_t) * (num + 1)); + if ((*new) == NULL) { + return APR_ENOMEM; + } + (*new)[num].desc_type = APR_POLL_LASTDESC; + (*new)[0].p = cont; + return APR_SUCCESS; +} + +static apr_pollfd_t *find_poll_sock(apr_pollfd_t *aprset, apr_socket_t *sock) +{ + apr_pollfd_t *curr = aprset; + + while (curr->desc.s != sock) { + if (curr->desc_type == APR_POLL_LASTDESC) { + return NULL; + } + curr++; + } + + return curr; +} + +APR_DECLARE(apr_status_t) apr_poll_socket_add(apr_pollfd_t *aprset, + apr_socket_t *sock, apr_int16_t event) +{ + apr_pollfd_t *curr = aprset; + + while (curr->desc_type != APR_NO_DESC) { + if (curr->desc_type == APR_POLL_LASTDESC) { + return APR_ENOMEM; + } + curr++; + } + curr->desc.s = sock; + curr->desc_type = APR_POLL_SOCKET; + curr->reqevents = event; + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_poll_revents_get(apr_int16_t *event, apr_socket_t *sock, apr_pollfd_t *aprset) +{ + apr_pollfd_t *curr = find_poll_sock(aprset, sock); + if (curr == NULL) { + return APR_NOTFOUND; + } + + (*event) = curr->rtnevents; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_poll_socket_mask(apr_pollfd_t *aprset, + apr_socket_t *sock, apr_int16_t events) +{ + apr_pollfd_t *curr = find_poll_sock(aprset, sock); + if (curr == NULL) { + return APR_NOTFOUND; + } + + if (curr->reqevents & events) { + curr->reqevents ^= events; + } + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_poll_socket_remove(apr_pollfd_t *aprset, apr_socket_t *sock) +{ + apr_pollfd_t *match = NULL; + apr_pollfd_t *curr; + + for (curr = aprset; (curr->desc_type != APR_POLL_LASTDESC) && + (curr->desc_type != APR_NO_DESC); curr++) { + if (curr->desc.s == sock) { + match = curr; + } + } + if (match == NULL) { + return APR_NOTFOUND; + } + + /* Remove this entry by swapping the last entry into its place. + * This ensures that the non-APR_NO_DESC entries are all at the + * start of the array, so that apr_poll() doesn't have to worry + * about invalid entries in the middle of the pollset. + */ + curr--; + if (curr != match) { + *match = *curr; + } + curr->desc_type = APR_NO_DESC; + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_poll_socket_clear(apr_pollfd_t *aprset, apr_int16_t events) +{ + apr_pollfd_t *curr = aprset; + + while (curr->desc_type != APR_POLL_LASTDESC) { + if (curr->reqevents & events) { + curr->reqevents &= ~events; + } + curr++; + } + return APR_SUCCESS; +} + +#if APR_FILES_AS_SOCKETS +/* I'm not sure if this needs to return an apr_status_t or not, but + * for right now, we'll leave it this way, and change it later if + * necessary. + */ +APR_DECLARE(apr_status_t) apr_socket_from_file(apr_socket_t **newsock, apr_file_t *file) +{ + (*newsock) = apr_pcalloc(file->pool, sizeof(**newsock)); + (*newsock)->socketdes = file->filedes; + (*newsock)->cntxt = file->pool; + (*newsock)->timeout = file->timeout; + return APR_SUCCESS; +} +#endif diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/poll/unix/pollacc.lo b/rubbos/app/httpd-2.0.64/srclib/apr/poll/unix/pollacc.lo new file mode 100644 index 00000000..d418c174 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/poll/unix/pollacc.lo @@ -0,0 +1,12 @@ +# pollacc.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/pollacc.o' + +# Name of the non-PIC object. +non_pic_object='pollacc.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/poll/unix/pollacc.o b/rubbos/app/httpd-2.0.64/srclib/apr/poll/unix/pollacc.o new file mode 100644 index 0000000000000000000000000000000000000000..18458749d928f0b2fa955b3992c41a6b13407984 GIT binary patch literal 16768 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 T>olC#(LoL8I($IGxgP!(zLKu$ literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/shmem/beos/Makefile.in b/rubbos/app/httpd-2.0.64/srclib/apr/shmem/beos/Makefile.in new file mode 100644 index 00000000..52447d8b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/shmem/beos/Makefile.in @@ -0,0 +1,14 @@ +srcdir = @srcdir@ +VPATH = @srcdir@ + +TARGETS = shm.lo + +# bring in rules.mk for standard functionality +@INCLUDE_RULES@ + +INCDIR=../../include +OSDIR=$(INCDIR)/arch/@OSDIR@ +DEFOSDIR=$(INCDIR)/arch/@DEFAULT_OSDIR@ +INCLUDES=-I$(INCDIR) -I$(OSDIR) -I$(DEFOSDIR) + +# DO NOT REMOVE diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/shmem/beos/shm.c b/rubbos/app/httpd-2.0.64/srclib/apr/shmem/beos/shm.c new file mode 100644 index 00000000..f4b5ab83 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/shmem/beos/shm.c @@ -0,0 +1,147 @@ +/* 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. + */ + +#include "apr_general.h" +#include "apr_shm.h" +#include "apr_errno.h" +#include "apr_lib.h" +#include "apr_strings.h" +#include +#include +#include +#include "apr_portable.h" + +struct apr_shm_t { + apr_pool_t *pool; + void *memblock; + void *ptr; + apr_size_t reqsize; + apr_size_t avail; + area_id aid; +}; + +APR_DECLARE(apr_status_t) apr_shm_create(apr_shm_t **m, + apr_size_t reqsize, + const char *file, + apr_pool_t *p) +{ + apr_size_t pagesize; + area_id newid; + char *addr; + + (*m) = (apr_shm_t *)apr_pcalloc(p, sizeof(apr_shm_t)); + /* we MUST allocate in pages, so calculate how big an area we need... */ + pagesize = ((reqsize + B_PAGE_SIZE - 1) / B_PAGE_SIZE) * B_PAGE_SIZE; + + newid = create_area("apr_shmem", (void*)&addr, B_ANY_ADDRESS, + pagesize, B_CONTIGUOUS, B_READ_AREA|B_WRITE_AREA); + + if (newid < 0) + return errno; + + (*m)->pool = p; + (*m)->aid = newid; + (*m)->memblock = addr; + (*m)->ptr = (void*)addr; + (*m)->avail = pagesize; /* record how big an area we actually created... */ + (*m)->reqsize = reqsize; + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_shm_destroy(apr_shm_t *m) +{ + delete_area(m->aid); + m->avail = 0; + m->memblock = NULL; + return APR_SUCCESS; +} + + +APR_DECLARE(apr_status_t) apr_shm_attach(apr_shm_t **m, + const char *filename, + apr_pool_t *pool) +{ + area_info ai; + thread_info ti; + area_id deleteme; + apr_shm_t *new_m; + + deleteme = find_area(filename); + if (deleteme == B_NAME_NOT_FOUND) + return APR_EINVAL; + + new_m = (apr_shm_t*)apr_palloc(pool, sizeof(apr_shm_t*)); + if (new_m == NULL) + return APR_ENOMEM; + new_m->pool = pool; + + get_area_info(deleteme, &ai); + get_thread_info(find_thread(NULL), &ti); + + if (ti.team != ai.team) { + area_id narea; + + narea = clone_area(ai.name, &(ai.address), B_CLONE_ADDRESS, + B_READ_AREA|B_WRITE_AREA, ai.area); + + if (narea < B_OK) + return narea; + + get_area_info(narea, &ai); + new_m->aid = narea; + new_m->memblock = ai.address; + new_m->ptr = (void*)ai.address; + new_m->avail = ai.size; + new_m->reqsize = ai.size; + } + + (*m) = new_m; + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_shm_detach(apr_shm_t *m) +{ + delete_area(m->aid); + return APR_SUCCESS; +} + +APR_DECLARE(void *) apr_shm_baseaddr_get(const apr_shm_t *m) +{ + return m->memblock; +} + +APR_DECLARE(apr_size_t) apr_shm_size_get(const apr_shm_t *m) +{ + return m->reqsize; +} + +APR_POOL_IMPLEMENT_ACCESSOR(shm) + +APR_DECLARE(apr_status_t) apr_os_shm_get(apr_os_shm_t *osshm, + apr_shm_t *shm) +{ + return APR_ENOTIMPL; +} + +APR_DECLARE(apr_status_t) apr_os_shm_put(apr_shm_t **m, + apr_os_shm_t *osshm, + apr_pool_t *pool) +{ + return APR_ENOTIMPL; +} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/shmem/os2/Makefile.in b/rubbos/app/httpd-2.0.64/srclib/apr/shmem/os2/Makefile.in new file mode 100644 index 00000000..52447d8b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/shmem/os2/Makefile.in @@ -0,0 +1,14 @@ +srcdir = @srcdir@ +VPATH = @srcdir@ + +TARGETS = shm.lo + +# bring in rules.mk for standard functionality +@INCLUDE_RULES@ + +INCDIR=../../include +OSDIR=$(INCDIR)/arch/@OSDIR@ +DEFOSDIR=$(INCDIR)/arch/@DEFAULT_OSDIR@ +INCLUDES=-I$(INCDIR) -I$(OSDIR) -I$(DEFOSDIR) + +# DO NOT REMOVE diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/shmem/os2/shm.c b/rubbos/app/httpd-2.0.64/srclib/apr/shmem/os2/shm.c new file mode 100644 index 00000000..8f41d821 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/shmem/os2/shm.c @@ -0,0 +1,138 @@ +/* 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. + */ + +#include "apr_general.h" +#include "apr_shm.h" +#include "apr_errno.h" +#include "apr_lib.h" +#include "apr_strings.h" +#include "apr_portable.h" + +struct apr_shm_t { + apr_pool_t *pool; + void *memblock; +}; + +APR_DECLARE(apr_status_t) apr_shm_create(apr_shm_t **m, + apr_size_t reqsize, + const char *filename, + apr_pool_t *pool) +{ + int rc; + apr_shm_t *newm = (apr_shm_t *)apr_palloc(pool, sizeof(apr_shm_t)); + char *name = NULL; + ULONG flags = PAG_COMMIT|PAG_READ|PAG_WRITE; + + newm->pool = pool; + + if (filename) { + name = apr_pstrcat(pool, "\\SHAREMEM\\", filename, NULL); + } + + if (name == NULL) { + flags |= OBJ_GETTABLE; + } + + rc = DosAllocSharedMem(&(newm->memblock), name, reqsize, flags); + + if (rc) { + return APR_OS2_STATUS(rc); + } + + *m = newm; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_shm_destroy(apr_shm_t *m) +{ + DosFreeMem(m->memblock); + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_shm_attach(apr_shm_t **m, + const char *filename, + apr_pool_t *pool) +{ + int rc; + apr_shm_t *newm = (apr_shm_t *)apr_palloc(pool, sizeof(apr_shm_t)); + char *name = NULL; + ULONG flags = PAG_READ|PAG_WRITE; + + newm->pool = pool; + name = apr_pstrcat(pool, "\\SHAREMEM\\", filename, NULL); + + rc = DosGetNamedSharedMem(&(newm->memblock), name, flags); + + if (rc) { + return APR_FROM_OS_ERROR(rc); + } + + *m = newm; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_shm_detach(apr_shm_t *m) +{ + int rc = 0; + + if (m->memblock) { + rc = DosFreeMem(m->memblock); + } + + return APR_FROM_OS_ERROR(rc); +} + +APR_DECLARE(void *) apr_shm_baseaddr_get(const apr_shm_t *m) +{ + return m->memblock; +} + +APR_DECLARE(apr_size_t) apr_shm_size_get(const apr_shm_t *m) +{ + ULONG flags, size = 0x1000000; + DosQueryMem(m->memblock, &size, &flags); + return size; +} + +APR_POOL_IMPLEMENT_ACCESSOR(shm) + +APR_DECLARE(apr_status_t) apr_os_shm_get(apr_os_shm_t *osshm, + apr_shm_t *shm) +{ + *osshm = shm->memblock; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_os_shm_put(apr_shm_t **m, + apr_os_shm_t *osshm, + apr_pool_t *pool) +{ + int rc; + apr_shm_t *newm = (apr_shm_t *)apr_palloc(pool, sizeof(apr_shm_t)); + ULONG flags = PAG_COMMIT|PAG_READ|PAG_WRITE; + + newm->pool = pool; + + rc = DosGetSharedMem(&(newm->memblock), flags); + + if (rc) { + return APR_FROM_OS_ERROR(rc); + } + + *m = newm; + return APR_SUCCESS; +} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/shmem/unix/.libs/shm.o b/rubbos/app/httpd-2.0.64/srclib/apr/shmem/unix/.libs/shm.o new file mode 100644 index 0000000000000000000000000000000000000000..354fe508c50642a88f12c7fd613603435958647e GIT binary patch literal 20952 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

    &v4wZ zk3tdsV_E+520oej;|88!J>NEPS!d;WA^PuU{f`*($9deJF>vjjW&PH`|C{B1Z{X#; z!2Hp`<>QGD4E$|2;NyOXpR*Yc82IyyPdD%<*&q2hNA%2Me<}?5*V&I{2L40lR~vXI z+udN`?=v1VaCwd<4g41z|EmrBMfU%C1DEI4R}5U%&2Jj`&)J_J82Dc~Z%-KbVvd7+ zC?#=|1N(0c`AO{OTLvCsyMHtAHO$*=U-YkHy8#22zim6kz^8KDiVb`Q;|mR(zP43G z@=ol^-^E>I$Tzc}mm2uRtmkqAKZp4p27V*=Yp;RtWISWwHrxH8fy-w^&l$MPuiqQ^ z_c{LW8u)J3|FMDpkoy(n@s#+;er~>j%LjE;2A*NQ&cJ0H<$Ngm%OuW*yo|5BrxJPj z4I^#HZ(;whG4KyL&et3GPr3g$8u%XOZ!z#2SkGMsE`Q}$p@Ank4x{)kaXZBP1Os2h@n2@(H#0B#;2w)Ae~x(Mv6q$dr4jId zV_fvedUf9j__GGiuN|%58My2(-!t%Pb|{b6d&B{Lp3C^;5%B3AJeOs0D`s5$znJUl z3_Qm8S_9w3_+9IP@o3 zf5L-9|DRd@YQ`nsUZpyeuNt^ISP_1|fy>v-e>U(KkIOiIg)RE`F+SVCzrgtU27W)| zmm2sl89!j)e`Wl*fy?*QKQVCGw>@Rx3whjMH1G=4E!go|0@Q*ndR>^@STjmWZ;#IPvoC?#n16PE)@p;PwwwJ1FvU)INWM{ zd5Wr<0N!L0Qg$qNG5q^b(C05C6JZQ#OhF>u*`K4ReVoPEK-nWwTp5filename == NULL) { +#if APR_USE_SHMEM_MMAP_ZERO || APR_USE_SHMEM_MMAP_ANON + if (munmap(m->base, m->realsize) == -1) { + return errno; + } + return APR_SUCCESS; +#endif +#if APR_USE_SHMEM_SHMGET_ANON + if (shmdt(m->base) == -1) { + return errno; + } + /* This segment will automatically remove itself after all + * references have detached. */ + return APR_SUCCESS; +#endif + } + + /* name-based shared memory */ + else { +#if APR_USE_SHMEM_MMAP_TMP + apr_status_t rv; + + if (munmap(m->base, m->realsize) == -1) { + return errno; + } + rv = apr_file_remove(m->filename, m->pool); + if (rv != APR_SUCCESS) { + return rv; + } + return APR_SUCCESS; +#endif +#if APR_USE_SHMEM_MMAP_SHM + if (munmap(m->base, m->realsize) == -1) { + return errno; + } + if (shm_unlink(m->filename) == -1) { + return errno; + } + return APR_SUCCESS; +#endif +#if APR_USE_SHMEM_SHMGET + apr_status_t rv; + + /* Indicate that the segment is to be destroyed as soon + * as all processes have detached. This also disallows any + * new attachments to the segment. */ + if (shmctl(m->shmid, IPC_RMID, NULL) == -1) { + return errno; + } + if (shmdt(m->base) == -1) { + return errno; + } + rv = apr_file_remove(m->filename, m->pool); + if (rv != APR_SUCCESS) { + return rv; + } + return APR_SUCCESS; +#endif + } + + return APR_ENOTIMPL; +} + +APR_DECLARE(apr_status_t) apr_shm_create(apr_shm_t **m, + apr_size_t reqsize, + const char *filename, + apr_pool_t *pool) +{ + apr_shm_t *new_m; + apr_status_t status; +#if APR_USE_SHMEM_SHMGET || APR_USE_SHMEM_SHMGET_ANON + struct shmid_ds shmbuf; + apr_uid_t uid; + apr_gid_t gid; +#endif +#if APR_USE_SHMEM_MMAP_TMP || APR_USE_SHMEM_MMAP_SHM || \ + APR_USE_SHMEM_MMAP_ZERO + int tmpfd; +#endif +#if APR_USE_SHMEM_SHMGET + apr_size_t nbytes; + key_t shmkey; +#endif +#if APR_USE_SHMEM_MMAP_ZERO || APR_USE_SHMEM_SHMGET || \ + APR_USE_SHMEM_MMAP_TMP || APR_USE_SHMEM_MMAP_SHM + apr_file_t *file; /* file where metadata is stored */ +#endif + + /* Check if they want anonymous or name-based shared memory */ + if (filename == NULL) { +#if APR_USE_SHMEM_MMAP_ZERO || APR_USE_SHMEM_MMAP_ANON + new_m = apr_palloc(pool, sizeof(apr_shm_t)); + if (!new_m) { + return APR_ENOMEM; + } + new_m->pool = pool; + new_m->reqsize = reqsize; + new_m->realsize = reqsize + + APR_ALIGN_DEFAULT(sizeof(apr_size_t)); /* room for metadata */ + new_m->filename = NULL; + +#if APR_USE_SHMEM_MMAP_ZERO + status = apr_file_open(&file, "/dev/zero", APR_READ | APR_WRITE, + APR_OS_DEFAULT, pool); + if (status != APR_SUCCESS) { + return status; + } + status = apr_os_file_get(&tmpfd, file); + if (status != APR_SUCCESS) { + return status; + } + + new_m->base = mmap(NULL, new_m->realsize, PROT_READ|PROT_WRITE, + MAP_SHARED, tmpfd, 0); + if (new_m->base == (void *)MAP_FAILED) { + return errno; + } + + status = apr_file_close(file); + if (status != APR_SUCCESS) { + return status; + } + + /* store the real size in the metadata */ + *(apr_size_t*)(new_m->base) = new_m->realsize; + /* metadata isn't usable */ + new_m->usable = (char *)new_m->base + APR_ALIGN_DEFAULT(sizeof(apr_size_t)); + + apr_pool_cleanup_register(new_m->pool, new_m, shm_cleanup_owner, + apr_pool_cleanup_null); + *m = new_m; + return APR_SUCCESS; + +#elif APR_USE_SHMEM_MMAP_ANON + new_m->base = mmap(NULL, new_m->realsize, PROT_READ|PROT_WRITE, + MAP_ANON|MAP_SHARED, -1, 0); + if (new_m->base == (void *)MAP_FAILED) { + return errno; + } + + /* store the real size in the metadata */ + *(apr_size_t*)(new_m->base) = new_m->realsize; + /* metadata isn't usable */ + new_m->usable = (char *)new_m->base + APR_ALIGN_DEFAULT(sizeof(apr_size_t)); + + apr_pool_cleanup_register(new_m->pool, new_m, shm_cleanup_owner, + apr_pool_cleanup_null); + *m = new_m; + return APR_SUCCESS; + +#endif /* APR_USE_SHMEM_MMAP_ZERO */ +#endif /* APR_USE_SHMEM_MMAP_ZERO || APR_USE_SHMEM_MMAP_ANON */ +#if APR_USE_SHMEM_SHMGET_ANON + + new_m = apr_palloc(pool, sizeof(apr_shm_t)); + if (!new_m) { + return APR_ENOMEM; + } + new_m->pool = pool; + new_m->reqsize = reqsize; + new_m->realsize = reqsize; + new_m->filename = NULL; + + if ((new_m->shmid = shmget(IPC_PRIVATE, new_m->realsize, + SHM_R | SHM_W | IPC_CREAT)) < 0) { + return errno; + } + + if ((new_m->base = shmat(new_m->shmid, NULL, 0)) == (void *)-1) { + return errno; + } + new_m->usable = new_m->base; + + if (shmctl(new_m->shmid, IPC_STAT, &shmbuf) == -1) { + return errno; + } + apr_uid_current(&uid, &gid, pool); + shmbuf.shm_perm.uid = uid; + shmbuf.shm_perm.gid = gid; + if (shmctl(new_m->shmid, IPC_SET, &shmbuf) == -1) { + return errno; + } + + /* Remove the segment once use count hits zero. + * We will not attach to this segment again, since it is + * anonymous memory, so it is ok to mark it for deletion. + */ + if (shmctl(new_m->shmid, IPC_RMID, NULL) == -1) { + return errno; + } + + apr_pool_cleanup_register(new_m->pool, new_m, shm_cleanup_owner, + apr_pool_cleanup_null); + *m = new_m; + return APR_SUCCESS; +#endif /* APR_USE_SHMEM_SHMGET_ANON */ + /* It is an error if they want anonymous memory but we don't have it. */ + return APR_ENOTIMPL; /* requested anonymous but we don't have it */ + } + + /* Name-based shared memory */ + else { + new_m = apr_palloc(pool, sizeof(apr_shm_t)); + if (!new_m) { + return APR_ENOMEM; + } + new_m->pool = pool; + new_m->reqsize = reqsize; + new_m->filename = apr_pstrdup(pool, filename); + +#if APR_USE_SHMEM_MMAP_TMP || APR_USE_SHMEM_MMAP_SHM + new_m->realsize = reqsize + + APR_ALIGN_DEFAULT(sizeof(apr_size_t)); /* room for metadata */ + /* FIXME: Ignore error for now. * + * status = apr_file_remove(file, pool);*/ + status = APR_SUCCESS; + +#if APR_USE_SHMEM_MMAP_TMP + /* FIXME: Is APR_OS_DEFAULT sufficient? */ + status = apr_file_open(&file, filename, + APR_READ | APR_WRITE | APR_CREATE | APR_EXCL, + APR_OS_DEFAULT, pool); + if (status != APR_SUCCESS) { + return status; + } + + status = apr_os_file_get(&tmpfd, file); + if (status != APR_SUCCESS) { + apr_file_close(file); /* ignore errors, we're failing */ + apr_file_remove(new_m->filename, new_m->pool); + return status; + } + + status = apr_file_trunc(file, new_m->realsize); + if (status != APR_SUCCESS) { + apr_file_close(file); /* ignore errors, we're failing */ + apr_file_remove(new_m->filename, new_m->pool); + return status; + } + + new_m->base = mmap(NULL, new_m->realsize, PROT_READ | PROT_WRITE, + MAP_SHARED, tmpfd, 0); + /* FIXME: check for errors */ + + status = apr_file_close(file); + if (status != APR_SUCCESS) { + return status; + } +#endif /* APR_USE_SHMEM_MMAP_TMP */ +#if APR_USE_SHMEM_MMAP_SHM + /* FIXME: Is APR_OS_DEFAULT sufficient? */ + tmpfd = shm_open(filename, O_RDWR | O_CREAT | O_EXCL, APR_OS_DEFAULT); + if (tmpfd == -1) { + return errno; + } + + status = apr_os_file_put(&file, &tmpfd, + APR_READ | APR_WRITE | APR_CREATE | APR_EXCL, + pool); + if (status != APR_SUCCESS) { + return status; + } + + status = apr_file_trunc(file, new_m->realsize); + if (status != APR_SUCCESS) { + shm_unlink(filename); /* we're failing, remove the object */ + return status; + } + new_m->base = mmap(NULL, reqsize, PROT_READ | PROT_WRITE, + MAP_SHARED, tmpfd, 0); + + /* FIXME: check for errors */ + + /* FIXME: Is it ok to close this file when using shm_open?? */ + status = apr_file_close(file); + if (status != APR_SUCCESS) { + return status; + } +#endif /* APR_USE_SHMEM_MMAP_SHM */ + + /* store the real size in the metadata */ + *(apr_size_t*)(new_m->base) = new_m->realsize; + /* metadata isn't usable */ + new_m->usable = (char *)new_m->base + APR_ALIGN_DEFAULT(sizeof(apr_size_t)); + + apr_pool_cleanup_register(new_m->pool, new_m, shm_cleanup_owner, + apr_pool_cleanup_null); + *m = new_m; + return APR_SUCCESS; + +#endif /* APR_USE_SHMEM_MMAP_TMP || APR_USE_SHMEM_MMAP_SHM */ + +#if APR_USE_SHMEM_SHMGET + new_m->realsize = reqsize; + + /* FIXME: APR_OS_DEFAULT is too permissive, switch to 600 I think. */ + status = apr_file_open(&file, filename, + APR_WRITE | APR_CREATE | APR_EXCL, + APR_OS_DEFAULT, pool); + if (status != APR_SUCCESS) { + return status; + } + + /* ftok() (on solaris at least) requires that the file actually + * exist before calling ftok(). */ + shmkey = ftok(filename, 1); + if (shmkey == (key_t)-1) { + return errno; + } + + if ((new_m->shmid = shmget(shmkey, new_m->realsize, + SHM_R | SHM_W | IPC_CREAT | IPC_EXCL)) < 0) { + return errno; + } + + if ((new_m->base = shmat(new_m->shmid, NULL, 0)) == (void *)-1) { + return errno; + } + new_m->usable = new_m->base; + + if (shmctl(new_m->shmid, IPC_STAT, &shmbuf) == -1) { + return errno; + } + apr_uid_current(&uid, &gid, pool); + shmbuf.shm_perm.uid = uid; + shmbuf.shm_perm.gid = gid; + if (shmctl(new_m->shmid, IPC_SET, &shmbuf) == -1) { + return errno; + } + + nbytes = sizeof(reqsize); + status = apr_file_write(file, (const void *)&reqsize, + &nbytes); + if (status != APR_SUCCESS) { + return status; + } + status = apr_file_close(file); + if (status != APR_SUCCESS) { + return status; + } + + apr_pool_cleanup_register(new_m->pool, new_m, shm_cleanup_owner, + apr_pool_cleanup_null); + *m = new_m; + return APR_SUCCESS; + +#endif /* APR_USE_SHMEM_SHMGET */ + } + + return APR_ENOTIMPL; +} + +APR_DECLARE(apr_status_t) apr_shm_destroy(apr_shm_t *m) +{ + return apr_pool_cleanup_run(m->pool, m, shm_cleanup_owner); +} + +static apr_status_t shm_cleanup_attach(void *m_) +{ + apr_shm_t *m = (apr_shm_t *)m_; + + if (m->filename == NULL) { + /* It doesn't make sense to detach from an anonymous memory segment. */ + return APR_EINVAL; + } + else { +#if APR_USE_SHMEM_MMAP_TMP || APR_USE_SHMEM_MMAP_SHM + if (munmap(m->base, m->realsize) == -1) { + return errno; + } + return APR_SUCCESS; +#endif /* APR_USE_SHMEM_MMAP_TMP || APR_USE_SHMEM_MMAP_SHM */ +#if APR_USE_SHMEM_SHMGET + if (shmdt(m->base) == -1) { + return errno; + } + return APR_SUCCESS; +#endif + } + + return APR_ENOTIMPL; +} + +APR_DECLARE(apr_status_t) apr_shm_attach(apr_shm_t **m, + const char *filename, + apr_pool_t *pool) +{ + if (filename == NULL) { + /* It doesn't make sense to attach to a segment if you don't know + * the filename. */ + return APR_EINVAL; + } + else { +#if APR_USE_SHMEM_MMAP_TMP || APR_USE_SHMEM_MMAP_SHM + apr_shm_t *new_m; + apr_status_t status; + int tmpfd; + apr_file_t *file; /* file where metadata is stored */ + apr_size_t nbytes; + + new_m = apr_palloc(pool, sizeof(apr_shm_t)); + if (!new_m) { + return APR_ENOMEM; + } + new_m->pool = pool; + new_m->filename = apr_pstrdup(pool, filename); + + status = apr_file_open(&file, filename, + APR_READ | APR_WRITE, + APR_OS_DEFAULT, pool); + if (status != APR_SUCCESS) { + return status; + } + status = apr_os_file_get(&tmpfd, file); + if (status != APR_SUCCESS) { + return status; + } + + nbytes = sizeof(new_m->realsize); + status = apr_file_read(file, (void *)&(new_m->realsize), + &nbytes); + if (status != APR_SUCCESS) { + return status; + } + + status = apr_os_file_get(&tmpfd, file); + if (status != APR_SUCCESS) { + apr_file_close(file); /* ignore errors, we're failing */ + apr_file_remove(new_m->filename, new_m->pool); + return status; + } + + new_m->reqsize = new_m->realsize - sizeof(apr_size_t); + + new_m->base = mmap(NULL, new_m->realsize, PROT_READ | PROT_WRITE, + MAP_SHARED, tmpfd, 0); + /* FIXME: check for errors */ + + status = apr_file_close(file); + if (status != APR_SUCCESS) { + return status; + } + + /* metadata isn't part of the usable segment */ + new_m->usable = (char *)new_m->base + APR_ALIGN_DEFAULT(sizeof(apr_size_t)); + + apr_pool_cleanup_register(new_m->pool, new_m, shm_cleanup_attach, + apr_pool_cleanup_null); + *m = new_m; + return APR_SUCCESS; + +#endif /* APR_USE_SHMEM_MMAP_TMP || APR_USE_SHMEM_MMAP_SHM */ +#if APR_USE_SHMEM_SHMGET + apr_shm_t *new_m; + apr_status_t status; + apr_file_t *file; /* file where metadata is stored */ + apr_size_t nbytes; + key_t shmkey; + + new_m = apr_palloc(pool, sizeof(apr_shm_t)); + if (!new_m) { + return APR_ENOMEM; + } + + /* FIXME: does APR_OS_DEFAULT matter for reading? */ + status = apr_file_open(&file, filename, + APR_READ, APR_OS_DEFAULT, pool); + if (status != APR_SUCCESS) { + return status; + } + + nbytes = sizeof(new_m->reqsize); + status = apr_file_read(file, (void *)&(new_m->reqsize), + &nbytes); + if (status != APR_SUCCESS) { + return status; + } + status = apr_file_close(file); + if (status != APR_SUCCESS) { + return status; + } + + new_m->filename = apr_pstrdup(pool, filename); + new_m->pool = pool; + shmkey = ftok(filename, 1); + if (shmkey == (key_t)-1) { + return errno; + } + if ((new_m->shmid = shmget(shmkey, 0, SHM_R | SHM_W)) == -1) { + return errno; + } + if ((new_m->base = shmat(new_m->shmid, NULL, 0)) == (void *)-1) { + return errno; + } + new_m->usable = new_m->base; + new_m->realsize = new_m->reqsize; + + apr_pool_cleanup_register(new_m->pool, new_m, shm_cleanup_attach, + apr_pool_cleanup_null); + *m = new_m; + return APR_SUCCESS; + +#endif /* APR_USE_SHMEM_SHMGET */ + } + + return APR_ENOTIMPL; +} + +APR_DECLARE(apr_status_t) apr_shm_detach(apr_shm_t *m) +{ + apr_status_t rv = shm_cleanup_attach(m); + apr_pool_cleanup_kill(m->pool, m, shm_cleanup_attach); + return rv; +} + +APR_DECLARE(void *) apr_shm_baseaddr_get(const apr_shm_t *m) +{ + return m->usable; +} + +APR_DECLARE(apr_size_t) apr_shm_size_get(const apr_shm_t *m) +{ + return m->reqsize; +} + +APR_POOL_IMPLEMENT_ACCESSOR(shm) + +APR_DECLARE(apr_status_t) apr_os_shm_get(apr_os_shm_t *osshm, + apr_shm_t *shm) +{ + return APR_ENOTIMPL; +} + +APR_DECLARE(apr_status_t) apr_os_shm_put(apr_shm_t **m, + apr_os_shm_t *osshm, + apr_pool_t *pool) +{ + return APR_ENOTIMPL; +} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/shmem/unix/shm.lo b/rubbos/app/httpd-2.0.64/srclib/apr/shmem/unix/shm.lo new file mode 100644 index 00000000..ebc6464d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/shmem/unix/shm.lo @@ -0,0 +1,12 @@ +# shm.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/shm.o' + +# Name of the non-PIC object. +non_pic_object='shm.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/shmem/unix/shm.o b/rubbos/app/httpd-2.0.64/srclib/apr/shmem/unix/shm.o new file mode 100644 index 0000000000000000000000000000000000000000..a10a59ff0f037dd93ef8090a8ee70eecaa274340 GIT binary patch literal 20936 zcmb_kdw5jUwLfQu$3Vg)5Ws+_!%HKO$&(o6VG>>w2^vU($irch3`r!J#F+^Xm4`&M z(};z8ZMBwGt*v6!mfPOXQnZ#9i(0LANRZa zGv}=J+iS12_S$Rjv-dfJyOz`}_1Ly0#kLk&X--hf%AK92D->B_O|){XP|vPB>&Qex zl9NL{@A*Q#yL@k>KJ|;DV?F=fm-L5vp7ecqJnOuhR4Y~2OU<72y?Z+AJgZJA2&Fzt z&h6b*SoFK1Pn1N@r+vxAq2BAYE^uYU<%N1n)}4l)O`>j%*DD`Y_9XYTY z4J#X}Q(uHqzp1RRPQBO=O8vSnbmM!6s3NrYccD~rhVO}TVzO>(ry!`dp}ogKspH8j zLn*Spc!sYg^;RhL_fTq4uC7ik(s*d!4KwnpQ*ZyIFUzuyE+r*Oa#28u?LC&v58e1A z46WNxxxR9P_`~3lOn1#<%X$KXP?I{PT2ueCZu$iQq25H`=YEfaKI|`;A=1K$QLTd4h zQUa&Yz1(SdNvM}P3#|dD@P(dQJR{%})q9U+?al7%>r+Ci4UjWu`ug6zZojr-nXz!k zI_suWBpd1_#Y>8wDWb0Ag`TR&BlTA05z^cDlc_`=_0lDj>dFoEobb_I$630byd%_G z7YOwnqpI3Z(e+U8yq`eDQCvc)*OVjGsSQ@qvD1xYkMkpxIuq)>R0*j>t6W{#P+3oj z@^Rf`$a2c@?9kp%lJlxlXH=?$Qh%gO`cbCRN6Av1`epLm6{(Xt4={?M)Zaopkb93& zDvhV)&rZFp^Puu-$^;tkQ1AR1)%&`05mXgVpO2a>Q5wWKh4sgWww)|Z?`*X-)vCAlg{)xA4(plVWoqY53{ z6{+CqN(#Ty-S*p_;=ldDXBf136j~L%)Gw7BCVJ}ab?JQXU6y@(Q+j@e zdY9$)=SLEou0L|iSlc>o@~t$-hEaSh%ZCULT(P$3TGUw{+ox_Gnm5D^(>I^K*&}q_ zaNNAZhPTC%mdB?!rNXmg9#v>^XPWG}+CgthlY6fu)T1@)CcWv({iq!7)A+wt5i`Q~ z9OShN3inoa5u(Z3s6$@&eIbXvh=y!}{T$(gX4ReHemhN%w?C3*Bjx}e;hRsXPF`XMi3xZzYjT&qtQ{G`;|Iwx$=JM>4sZz7%vo z(-mbz=V`hMt`urpqw`-QMwuO5_In{SI&w%{`K8==IrHN-n(eB2<|k;*^k*lC)NW*c z4qCgB`2}e0M&=pN+KtRU(0N#DtxU@XQ>YnRG3A=^D5gR)!xR(J%y7ljYG#CD)@a6O z-%B2D)XZr60b*J;lc`3eOEcMuNor=CeLZ=wO*0eiQet*%<}ACKm_3@wwI3mEJ(`(f z|CE?7X=bKFM8Wfx`BnxW*g zOa4yYGhO--k%bzcdmqu|n!Xrxg{BvP4r#jb0MWIYt^!@J=|$-J8ci>T*^QcB0=m^2 zOIOR@W6!4O*%y%~<2u6N5xkrZ%f3m06xb_CV7wB}Rk9r+Qm6_DZ`jZ4*YO zi{MqnIOdf%j>iF(af}YAITv0ytrKwGvS#37uh*djO>ScsM#Vl@MvL4`3i^5wDCgs1 zZ@|)tqS>pldZyX1T8N3i0GJ)YfT3u%Q7q*FvzvPzNc%U6OC^m6)QcyrPJ(H-qC$o)9f{*HLdS`YB7o)<*)|Pdb=oH znc=4jRk_kTns&&JkF%&^p{j6(-l;=ctmnF7vW+;UTUJxcJ=z{3Mh3kHo}=5!eqKSx zJ*=Z>fQ}^TIHqg82acdI!kbQ#yQtpD804G7AhwR9KOnL3lp@r1oxdd%Bad$?LNuyx zntc@|^eh>bKa()RnV{>+Q8Z>!M);5_v%%Us)LJ1m*-Y36zd}~#P)6?1D+b~DB9ud$ zE(C$*v7uP2JlIdAq_BMuOBhrhv?a@fP-%bDmb}*dw`g8!TLrik;$r`o&7cZ?LN z`ZsK3rRP9}X5X}7*K;7GrQfn8g`H3$uC=siJ6Y5(XOWe=xpu3HBJz5rO(W~%q&tgC zC??-h^7Wn_xg<%Z(_@Iybqr%VJk!sxncQ!2t(r<^au1^@BImJuQHI-T#mMl0tCn)X zF^XJRqU$_6&=XfaIH`ublf0PZk@W-Eg}6|$5B{15ags-tn_@g7&UVBdlXzM@q)awY z3Z~PtPN&bnw4ALh1Uz_HN#P}p41Z3lN+^2*9#D1zJ;Xe;M^R5Q-EyW!at*E1Ez3v@ zEoVwgEk4U5X$Emx9aXUpwvafU`j$Pbe}g$rA5lwB5moGi_d5;dctG0?C5cwDm#;!( z*ORAjP;P3g#X~6hCp%f}!Q`+Tv*-4Q-a za3wyW46_+4z4i;faF^$T#zZKGi1JJIjjNTnSkHBbRcz9&M_0j(R#dA?43z5h2p^u8 zBYb#Fs&0;HQ0vd_kbqw*!sTE|3SCx?j(GwKv1ltH4dz^okYPfmW9J$KxKn;TU95Sy zj67qXfvAe5@>j9AkfmWXm*&F;)?}rQM`5~3GptIwr5YvGNV~sCxsR!+-BeYLS0 zndvbsQcjMwXZmw8y#BNOW9@Mxv(KXSb%vFZv5+9z4=_p3xM345um6&ac^TC?G!3&z zgj~f9{79}G4#s!Bh1;kcYA}Bi?V)pQuRkLLZEeCc#yEc%03MqQ%r}o&^ zSki@s+-^7v!cz&OmPM+6)4ogsp4q;&&86J3)7wT5Iak}q4mtMsG{1>B5meX_$jzBk*`~^t3kHUl?CW2J?7ai zqjWgaBSsp?E}hTZ3QJu2skYRmk=VK1mImn3Nyw|Rpydt@po<*u)iBRjqgFm#<>STJ zZeQXEsP1Wjd2Ucc^C#E{IEHFL|5{96F5~%bTMa_0c}DOs3+EvblzRmem-C$(3K@5x zIw7|*q;&~*C@m=DgZ%`VaceOT={&%`Od zzt4Busui-taji~##|uvsk`i)-1J#MEmpZQ2)iHUS1Jw$dcB)P*OA*~^Ojk1CrX+`NuO})UaUvjiG2>BNWsu%JkLl}jDE0R-7yB!o- zk%lo@>OfZuxriaHOSrzYpjMK;ihA1-sTXp-1FaTP6heLd-NL2S56BKtKgQ9uQb=)` z=7o@=5b9SBqJF>x8qaF;9rd+BicVS&<5R43#f2dWkFza3~m7T?KL-*ZH2O~2**G=|SnlpR7|;6QakUdYhknRYhUp64{I z6*A9(RtqV*Xlj{G%^^VNH0?@V#r;vp1zXFRxt8zpc-_tXJ$!$F@8<1uogFX&Fh3)*5$?cL4Mf^Fqx;j+^F_O@8}w)~b@cR^!Y zGGYDiB8lxR(cacr(9+a2P)TX9Tr60@U;+Kd_WE-Lk$6*UL3gZeTR)3*E^O@xHla(& z?OoACuoZp_NgYcho13GX2&N!Jy5dC8*bxzq#^bThG~3nL*^bs+3#|?V(_xL!aUPAk z6H%9{O>OPba9eB>tD~;Afuy53WOZ#nQ}JY^u|28{v~@KRK~8G}Ad=0}USrgaj*du- z#E62*L^9qMYhib_0;-W7kqSD@5TJ{9kJp~CcJ*v;)@47Kz0teC|j*;TztJ%U(3DtN{*q8ZgmU~CNl;aJ2aJYWC z_i1a-_vcWP65p0Nh29H--m87{pE|I1PGQl3{DR^~s%xHE=WFw=SYC6cX6*v+wl&_d zPanAIp@Ov^=Pdte&hp3YPsaaqyk`VuGNMJVmcvOa9PZq-N!>M1p$)fp(Oc(m^%dcG zG}0XIO2(~lQ){Fxrh<%&Ao)bwby2!OkwTi%YE?9~r zlcXe^Kws!%11sz|hVky0@+1-264fIY4kx15DnDhMNlm1w)oQ}`ig0^p(`GB&(b-Ic znr!au)_K9h1@|bC+Er|6R))Kx@eV858YO2el^3YN+N8rrU2BfgRPNkvVT@xDN|khH z)bNFMBoKudIYNFANf^bJR@SCSdwaMW5kW^O3~-OhrPVb{lo^#ion29#)X=1z2GvCF zBCWbQ6IQHodooJdqeq2S?Z(bzlDvvGZB7)#yBixj69tj3u7cKNva312I9M1gD=kRG zo3OA`HWZM)Xop^)iKKWpC(?teGCLfm%pvQY2@X;XVAO?8B^S45{mi(CkyUVtp&ow^DtZ>vU4Bc8Etfj82gbbddZ;Zg$7$xz`L0{U`Q7 z1bX|+%!Q%|sY_x7R9a<*b#A3mr3T1r5~6vAfzTsD8Q$5Xa=VenmX=)=2N{y)sG6H# zc@B2blq4NZN!^~7vyx)!gan4xqK?ijQL71`8`E>mQK|+uX<5q_ExII-*U;D_i|-F#G1X~U(`pWWlRcC_Djc}6QqY$Rwsa4PEiY?VKIpC{zcz16$eAGmqgVt-!G z@MZoNY){*0e_o|OQ0dPlkt)A0l(CGEr7mP?hUYCqXfeHvq@P95$3Xf+0gX~Ye=mZd zqF$Mk(%U>${@i`uDu3YCVU_;8n};v<7xs*(_E&fokM`Lk*Y*w(Gd?o=_KM2;!7;n5)+Z!08eU>U{i`b(GW(5=5 zJ80(9J&9cx-CKo&hmU2{~b$pI_a)Y;L2xgLzsauuY-E?+HQtTx&j-W10J;s2=wNDo5e z#D(=%@ZCI%NIr12h2K#~>;=R9aGB$WD<)s$UF=wSWd2FIur>YG{* zM-grIzmqUiCz=f7ufAPiT*Z{#Lv`e$3y@# z!emMNdyED$e$xJjL<|5*U`VytA9V( zA0*Ce8H+SwcrIiQkfaZFL*R>sz%LsDUpoXIA$%N-%VD~s$ZzPnh#t%zd`TY+zhwyg zt3%*-4T0Y~1pdGfIM#!~{5dfM{)Zv(SBAj9;gx;(SI7SjI#~gKR;iC<|0FfgSAMwF<>BE#F`Bdzji_{AO zd2NOBA8Du48tUB#Q%7FEk8)Uj7FH)J>n>m)8QW*E^_poiypk%A8+FPds-%$3F<7QslzN zxp4WY0eSjV@5o17@@_pT7YumiTp>U0-Syi zXi5JuH&F!Nt666q5d0GE55^7!X${*_p@Bch^Jj^H z|CaF@1HYg7Is?bg$xtHt=JfY<<~JGmx7eR+4IE>Ma)Z7(deA==XnFmUxRP6>P5!0`kT}`al6I9&v5+z)xak(f46~mv7Uzv`~k+XA43uU53@f{8u;yO_csQv zTU*vE2L3mef78Hc^8)jZfq%^Yd}845u>lX)i=WdO_Z#?2j88W3W9-lQ20n%TDK_xe z*^h+=ewg{?2HwVY*BJPRj7JT88uM`jKf&?eW#G@V|F;@=5$D_24P4gE`wjeg_UA_i z{$18{%)sYy9DZ%!eXQpd10ThHo-*(-%YS6xmoqOvDw6SC#&-Sem*B%WK4%+vCgXVq zp2PTD1E0)zm4VAYn7hKj>)Frs242H@t}*a;SYCeYBmUpX{n}y3Z(%%T;5O^|s)5gB z{zU_q`SqrO|B&PV4+G!M`ad`D?{U8ZJf7me>=)-4_*p!U$_;!c^NS5!#!=3VqQ6k$ zY{<*_wi>v6^GF(a1N(oYfq%+zzSY3Hx&L<>xSUhJW8k;3p2G%S#daSz@Cfry8#vyB zpuA|{SFrw*29CWc%6kTWg5&n7fw!43121De3l02E=Hq;adn~H_+2@iU zr4W7j+7S3R3_Y@59UTIH!NBLTjlUSU>@VLp@CugC#wWUP=s&=D6L8^>w|HL7bm5SfA78IBa5=9=4E(n|X*RoX z=wHwJyIeT*-@|_HVqEg=KdBDon+C29R)jxh;PQ*-zZ$swT6r`d_C)_q9&H1HtL z(;E%EiSfG)JkI#T2HwN?uMAv%>wU_=A7c68{BROKf5!M!1AmwC`36p1Q-yx6qKfGG zl;s;3hk3;LB_1#R|G7xdBUvYRyW|m1S@*wU;B$FBy4|qr=e&K`z-2#r+`yI7ba~#T zAAUa0>&%}F`9jw3memblk)) { + rv = apr_get_os_error(); + } + if (CloseHandle(m->hMap)) { + return (rv != APR_SUCCESS) ? rv : apr_get_os_error(); + } + /* ### Do we want to make a point of unlinking m->file here? + * Need to add the fname to the apr_shm_t, in that case. + */ + return rv; +} + +APR_DECLARE(apr_status_t) apr_shm_create(apr_shm_t **m, + apr_size_t reqsize, + const char *file, + apr_pool_t *pool) +{ + static apr_size_t memblock = 0; + HANDLE hMap, hFile; + apr_status_t rv; + apr_size_t size; + apr_file_t *f; + void *base; + void *mapkey; + DWORD err; + + reqsize += sizeof(memblock_t); + + if (!memblock) + { + SYSTEM_INFO si; + GetSystemInfo(&si); + memblock = si.dwAllocationGranularity; + } + + /* Compute the granualar multiple of the pagesize */ + size = memblock * (1 + (reqsize - 1) / memblock); + + if (!file) { + /* Do Anonymous, which must be passed as a duplicated handle */ +#ifndef _WIN32_WCE + hFile = INVALID_HANDLE_VALUE; +#endif + mapkey = NULL; + } + else { + /* Do file backed, which is not an inherited handle + * While we could open APR_EXCL, it doesn't seem that Unix + * ever did. Ignore that error here, but fail later when + * we discover we aren't the creator of the file map object. + */ + rv = apr_file_open(&f, file, + APR_READ | APR_WRITE | APR_BINARY | APR_CREATE, + APR_UREAD | APR_UWRITE, pool); + if ((rv != APR_SUCCESS) + || ((rv = apr_os_file_get(&hFile, f)) != APR_SUCCESS)) { + return rv; + } + rv = apr_file_trunc(f, size); + + /* res_name_from_filename turns file into a pseudo-name + * without slashes or backslashes, and prepends the \global + * prefix on Win2K and later + */ + mapkey = res_name_from_filename(file, 1, pool); + } + +#if APR_HAS_UNICODE_FS + IF_WIN_OS_IS_UNICODE + { + hMap = CreateFileMappingW(hFile, NULL, PAGE_READWRITE, 0, size, mapkey); + } +#endif +#if APR_HAS_ANSI_FS + ELSE_WIN_OS_IS_ANSI + { + hMap = CreateFileMappingA(hFile, NULL, PAGE_READWRITE, 0, size, mapkey); + } +#endif + err = apr_get_os_error(); + + if (file) { + apr_file_close(f); + } + + if (hMap && APR_STATUS_IS_EEXIST(err)) { + CloseHandle(hMap); + return APR_EEXIST; + } + if (!hMap) { + return err; + } + + base = MapViewOfFile(hMap, FILE_MAP_READ | FILE_MAP_WRITE, + 0, 0, size); + if (!base) { + CloseHandle(hMap); + return apr_get_os_error(); + } + + *m = (apr_shm_t *) apr_palloc(pool, sizeof(apr_shm_t)); + (*m)->pool = pool; + (*m)->hMap = hMap; + (*m)->memblk = base; + (*m)->size = size; + + (*m)->usrmem = (char*)base + sizeof(memblock_t); + (*m)->length = reqsize - sizeof(memblock_t);; + + (*m)->memblk->length = (*m)->length; + (*m)->memblk->size = (*m)->size; + + apr_pool_cleanup_register((*m)->pool, *m, + shm_cleanup, apr_pool_cleanup_null); + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_shm_destroy(apr_shm_t *m) +{ + apr_status_t rv = shm_cleanup(m); + apr_pool_cleanup_kill(m->pool, m, shm_cleanup); + return rv; +} + +APR_DECLARE(apr_status_t) apr_shm_attach(apr_shm_t **m, + const char *file, + apr_pool_t *pool) +{ + HANDLE hMap; + void *mapkey; + void *base; + + if (!file) { + return APR_EINVAL; + } + else { + /* res_name_from_filename turns file into a pseudo-name + * without slashes or backslashes, and prepends the \global + * prefix on Win2K and later + */ + mapkey = res_name_from_filename(file, 1, pool); + } + +#if APR_HAS_UNICODE_FS + IF_WIN_OS_IS_UNICODE + { +#ifndef _WIN32_WCE + hMap = OpenFileMappingW(FILE_MAP_READ | FILE_MAP_WRITE, FALSE, mapkey); +#else + /* The WCE 3.0 lacks OpenFileMapping. So we emulate one with + * opening the existing shmem and reading its size from the header + */ + hMap = CreateFileMappingW(INVALID_HANDLE_VALUE, NULL, + PAGE_READWRITE, 0, sizeof(apr_shm_t), mapkey); +#endif + } +#endif +#if APR_HAS_ANSI_FS + ELSE_WIN_OS_IS_ANSI + { + hMap = OpenFileMappingA(FILE_MAP_READ | FILE_MAP_WRITE, FALSE, mapkey); + } +#endif + + if (!hMap) { + return apr_get_os_error(); + } + + base = MapViewOfFile(hMap, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0); + if (!base) { + CloseHandle(hMap); + return apr_get_os_error(); + } + + *m = (apr_shm_t *) apr_palloc(pool, sizeof(apr_shm_t)); + (*m)->pool = pool; + (*m)->memblk = base; + /* Real (*m)->mem->size could be recovered with VirtualQuery */ + (*m)->size = (*m)->memblk->size; +#if _WIN32_WCE + /* Reopen with real size */ + UnmapViewOfFile(base); + CloseHandle(hMap); + + hMap = CreateFileMappingW(INVALID_HANDLE_VALUE, NULL, + PAGE_READWRITE, 0, (*m)->size, mapkey); + if (!hMap) { + return apr_get_os_error(); + } + base = MapViewOfFile(hMap, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0); + if (!base) { + CloseHandle(hMap); + return apr_get_os_error(); + } +#endif + (*m)->hMap = hMap; + (*m)->length = (*m)->memblk->length; + (*m)->usrmem = (char*)base + sizeof(memblock_t); + apr_pool_cleanup_register((*m)->pool, *m, + shm_cleanup, apr_pool_cleanup_null); + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_shm_detach(apr_shm_t *m) +{ + apr_status_t rv = shm_cleanup(m); + apr_pool_cleanup_kill(m->pool, m, shm_cleanup); + return rv; +} + +APR_DECLARE(void *) apr_shm_baseaddr_get(const apr_shm_t *m) +{ + return m->usrmem; +} + +APR_DECLARE(apr_size_t) apr_shm_size_get(const apr_shm_t *m) +{ + return m->length; +} + +APR_POOL_IMPLEMENT_ACCESSOR(shm) + +APR_DECLARE(apr_status_t) apr_os_shm_get(apr_os_shm_t *osshm, + apr_shm_t *shm) +{ + *osshm = shm->hMap; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_os_shm_put(apr_shm_t **m, + apr_os_shm_t *osshm, + apr_pool_t *pool) +{ + void* base; + base = MapViewOfFile(*osshm, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0); + if (!base) { + return apr_get_os_error(); + } + + *m = (apr_shm_t *) apr_palloc(pool, sizeof(apr_shm_t)); + (*m)->pool = pool; + (*m)->hMap = *osshm; + (*m)->memblk = base; + (*m)->usrmem = (char*)base + sizeof(memblock_t); + /* Real (*m)->mem->size could be recovered with VirtualQuery */ + (*m)->size = (*m)->memblk->size; + (*m)->length = (*m)->memblk->length; + + apr_pool_cleanup_register((*m)->pool, *m, + shm_cleanup, apr_pool_cleanup_null); + return APR_SUCCESS; +} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/strings/.libs/apr_cpystrn.o b/rubbos/app/httpd-2.0.64/srclib/apr/strings/.libs/apr_cpystrn.o new file mode 100644 index 0000000000000000000000000000000000000000..1fdff6c6071036f8b173c9de4e4c4c1115e910eb GIT binary patch literal 10920 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 N`{6u3t?_xD{}1ZWJgoo# literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/strings/.libs/apr_fnmatch.o b/rubbos/app/httpd-2.0.64/srclib/apr/strings/.libs/apr_fnmatch.o new file mode 100644 index 0000000000000000000000000000000000000000..099a0e90f1dd93ef3b6ba4eddc931e0738f957bc GIT binary patch literal 11120 zcmb_i4RBP)k)F3t5(|QT5)vT56mpPlLC^{*3Wq>|R%neRQIqfV#P;X{?m2O z>wf!qT3yv$-BjsK_cz@=-90_Cvv1YoZM@T=D1w_JR)`eGs1V(=QgpQ>tHpGYCp?>z zZzkX9`@qq6CBw7Hd&afv7S+hk)=PV&vVq+V3e_koh! zShO%%Ta*uIhDRIRA?`XHRH}PFU#Z3a3ruTAzXi|g_@A`+VsHfp7HEl+0D-JexhwgH z-cJ_9rfG9~0TT6n=M}^Sfci+SHh71p_cON^FH(hw|GO4{2m0PmO0~ppAZib7EXwgF z0KOl%)1{z)4UN<#hU${9X^HUY=qTAeg-NLEJGW$Ov!}_^?Ahk=pVj78qc>Z%_#g}d z)fAh2sJ190F{H&S971>#H}qX~$-PBR!|EZR>JABQaK@p@{gsmkV$Xr|b$zd)!$A@eo^h1VLdgG&7d^X5=dPiZtGMEo2ckIix5Dm;Y zq~A(2-uMD$)M3UOx(jF2;#UE|JYWbA$LZfe8n$VV4MBIS_SnxRzM%~cC5B*ii?u{G zC01i$5SKMcmfuvb)-=xx>7>9;+} z*F2S%wD_xFA@RO`3*}Xpc|BCIsIp=}E>x{ndj%B#+?c!ujx;wO?ohP&o4iO*AA&+l zT!{T6;0|rDL%DveO`97>w}e+4+^0Z7^nOS|vwjesP4$Pp4lVvNjMgX5gB#~Pm9Ord z4#9#mul7tq72)|Y7RdF37Oxr&ukxLh`2#%@YL?}n+W%I+6dt}0k_}VBIvIMyYkA!; zTqO<#^wZBrM`0g;f7gb81T@tlLYQmE@C%Tfw*K16?M20PP+5hLOD*n0tpx0pMj)`X zhJWxG>I$gz3@G%(QkV#Ra6nKhE_|XGkl{IU2Jq)lQ&E26eJ%b5sL`S;FjfmV>=YPy z5eDSaCw>Uj@KtHP8nzN_X>a0!79Roe;a^A??A3y6fJ1@h0N&O={395FqFq>@{33b1 z?+=c?-+$_jUyT(Ee;Wqc`s@2%RlvX70n_3S1C)HPF?pjg`DeM*P>Ol5pG#x!K+V5} zbvN7!GG#-<0qAbj7ABRB11D0!&B;Tjm0`8M{|J!KcFw(7U;pI_CaFRyBjVKv;L z4X#$|4sV9+>y=eo>ynpazw0}rT)!susut*3RV&;2WADlWgS~Im3+DLx`8GH6WkYA% zpqczI7S$OzT{4gmPOOr#2kNv;gpKA5v6OLaM3@Q8m-~G(59VRL-G1{T(2c4dAJC#NdfU1q(S5SfMGsa9dcff$nr}EHlhY(YLNx;;z zOq?Pj5BvOgiOavr#D6mJHzKBCzZ8t+&w$uvlhC~gRT4CvM#K?ZL&J7f+A$%d_EVs3 z#BjWYbZ@pHrCuB>C1&tc&%so`0)YZ$qr+L6!m&pFDsi7jNQ{Gtg8zv9Bym6E#F&~Eh4c0gBC|D2$ickHk;uB&v zPMNX(3BWR)C*<=PcxG(|_!b;9Z0-VT4qBRH%%|ikx4H7NRo84+t}=B(4rIqsB(k$t z03?JuU8t_5*~_x)VM#IwhnB-rU^eJv-<;;{F^ryPuTQxILz?CxR03WrKL1c4MCXvmZqm<>{t@vha$-YNA zGc{9`<>5$PHlR><6~s?N9_>$09#BLss0lFxNJvXr9^wTD0e2J}t0{oh=K&#R8RYSr znW!<_Ev$}LL7Ci=iY4U2tROfiQ)UZSLpH8hMfjMkry)f&Gr7lvnwZ27eQY50M}rby zrQM>4CMH*yP&1PQCe-vVL>4*>3!u0R3I^MH>Q%ANae|rc1cKZvM1EvK%}n0L$CYSe z(mcULvtfShvzj19Y-IAB3HdG(nTmQHM?K4o$H%0bAXOZDyoVXD8KjR%4i@B|?_nln zM&x6%pCBp6%<+^QlbjSO$IL=A9X=*2O=ugFD@@48WXy!N?IrRN6N2rYzEu;fi1kcz z_Q9Fh-9{bEm1diAgR|aDmArNvXoQ-~==0Ox5+gn7mku*u?d! zo9nx&kI3(*ATHt0QxGqt*Ib}YOx|Nc>v(y%YQb41xoW`)CV5RjYV2C9r#Q@x*EzL< zP39QKOx4KF%C%wl*tfI`rjX_mvz|9F$;K41jZJY0D`Eqa`^+S4vllKXj_2qqbGjxb zc^fHW9h1jQsb(ghFrjr!zGFhoOnzWO>zGVM(>yksCXR+ffOC*ZP9OMXk7gE4Q=FQP zNuCapeyV5egzI=hwl3xD_Bjs+P5Vup2fR;UgTs?aK`Y@9Wha5-o^{A>zh@`q+D`xK^Aj{EKN<&*ea z)6$q-^dPzN5cQM9*MxI)R(Vmk_>$dRuFc&4B#Sq6Y<$-IZ)9EgiIVl0GM*nN>3}|) zI;ffar3tNP@`eeGInLS8vn1jWi%u||QoGxTB=yXpYhyn3aIIjHzlvoDxGbJXsTkBk z=!`teZ$aiTYncEMaOIJWFD>(kzn%I8)T3Q&Wkx3|sIQ{Fn);7vQOt9k7QLDl_CD(S zsDGULA?nGD+3}U8j_mLT;oUfq^jy?)0dZZLhKLA}ohbFYsplfK%V&_?@#eA1Pp9~2 zQ(s6u7pq-d(c9`drV5`de{8y?5l|cjZu<99nou z-MmGe-=I!&UQ(luV&zd)>sNO+s9M#rHEMW^n!7~}SE-X=l5o}K%g(QSRKKR(H}5kWcPA4s;jwAsj*9H?nvo- zd5%n2?Wi7U?TCm_usxs$ZOi8O!z-4rl>2onE_ z3E`WWXh%4r-wffxcSgA`#OlBI6|O3*a4&IJ6qfAJW1-;k_FyO&>1+iy0B$XZqAOVp zgYAVSYs(8u+Sb*tf@f3@v_4SM9SQ5fRy`aMr7dAy?*h%%2co5sSW8PdS{mr?F743u z?(HSz?nUm!6{XQgYgcCr;E_@zfT+-eQ9Ts~`rOtPXpb7Pj14FR;uyH4wEfaVwDaph ztYOg|(Dh&>WHEq7WqyooAdBh{fgX!OUda_b5Ya^>5NZ#~9b*`fNwlQc@0UBpuZO$B zyMhsaSGZO9{gGf4o^s!GhQP2~O|g2_s-=a+zLr=>j~N**DUV66Y=2pWdr`%F1BGpt zZ)`Q8eEn{r?9NeUPoCiHhh2If;PT}F^zy=AEdj*iDh7!fR{?0$xSZZ>$G@c=sL9R&+r99IO`a0aqd$)!0FB>u zNX8xAvqKNG2sZ?2^c_q^f?WZ(9^9=9_x6Au5bl;JoJ|tl9&CxVLmjt;VNBA2mX=8H zYs_I5t&#z`44`cYGiR{{M_`bL!2#iJ4e!_ygq3xNpd#H+)g`h*$!xI0-xdk%2+A1# zA0CBZ1C~d~_o5bi)kNDrm@&uJhA)HY?qG$*mM ziF&gp;!}v2ZP3QbuO4;`^^Q)$rx5)-p}~%s>psBK>CdH`*CNv6&MvzZ2GYfUg>Gi7 zkL!;iu{*r}VZiJ*0TOFz{^xCjHdY)MM}HJ2#Abfx8?0S_AHeDS&-t<;&wir0$?#|Q z{|I1clj8(Zwo$sVzHOV3S?-?z>2&&U(ZqbgC9`I(SpR#Z&*R*G!HzRPJ?k<2A`pn# z(qz7X9$-Q0Ievy;03u!fiYb3}B#8OTg+JD3_YkvfF{v>yQ+DEv(V0)X|7m>(>A%c1 zRQSS=FX{1hxP5-C$#nByyVcO|GCK2VpWhs?5h#}-J{+~dl2y%Bym?ej>k0aoF2jhY zKO|M-hp3y40|#%##$X7j#!pLQ##E6#1~cSwCyZ^X@%zD;0ae&PH4G6|R>T-_@JIe| zank@IQ!RPpmxlQHlg>Jx%jxhXP^wczZ{dhOSn{m2pmqppQ0wQ3!*`gn3@Bt0o!#xAP$I8aPbRj;~ zf`@5C+wn{)b~}DA0?@F-T(kY81-H(dONqc?JgQlq?-BU%!!(fc?8F{%tf~i*frd7* zF)n|B0v`7(Hpb5ytogeb?l0?^HJ`>&9{;%Uxy*JdY2fduXZ#-G>8qkSFPEIxCcm0^ ztQ%}>=P5cMHW;vpw-dg_hVz}6&l$FJoaCc6`BjAX+VB>_AGYCngyZKFHnzW!@J9{U z#CH<@tPMX%_)9jtk??ai{8Qq8Wy7bC{ChT>u1R77jkBMpi7yxjpFa-1bR2y3I5_8n z=f!&|wrwPjoweThUdHmAhaQW4jtT9=EjZSHIfBrRSa6h|Nc^J~9OXH0-?88*zn+}> zo&`tw{lx#X1xNWL$-iX7&k)Y}=D2trU$@EshR%^U3C9ji;8}p}U5h+^#&Wx6!DW8v zeEHCZFD3jF8_q8$M=iM3zLVlW|Iz*~I;V1N_+`TRO+Cx6rbBC~ZS|8@(GCf1UjPMaNm zLAb{vk9O9PodXse>xb*$5etr{A0+$yf|LE^7lkJ*@@T)8>z literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/strings/.libs/apr_snprintf.o b/rubbos/app/httpd-2.0.64/srclib/apr/strings/.libs/apr_snprintf.o new file mode 100644 index 0000000000000000000000000000000000000000..5f12d9bfd0de4fd04fe21ea6fbaa39efcb5066a6 GIT binary patch literal 82920 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 D?qf_w literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/strings/.libs/apr_strings.o b/rubbos/app/httpd-2.0.64/srclib/apr/strings/.libs/apr_strings.o new file mode 100644 index 0000000000000000000000000000000000000000..a8b5f40ca38bee428c2539e8780f485f15389915 GIT binary patch literal 23560 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/strings/.libs/apr_strtok.o b/rubbos/app/httpd-2.0.64/srclib/apr/strings/.libs/apr_strtok.o new file mode 100644 index 0000000000000000000000000000000000000000..a772c0f5f0daf5ff5be89172d2215aa5c32c1d87 GIT binary patch literal 4880 zcmbtYYiJx*6ux(7lT5R9k~9_*QtA5YL)}eMLao)-Y#!~dM4Q^AB5hoEx07V)W;X85 zN-I99snt{q6&3wa5kc|sOHiaDmP%Fpp??Jb`NM)>OZ`!)LcvNr=iYN>XJ@w{dST|C z^PTTJ?rUatpB^3C7LrnMlVYo=YK#hT(yYpZN*oj`#R`#_OfCMHm`E-DF_~QadslMd zH#7O%Qf1Zow}I5QTC|`hFa zXk!abKfHYHPwQv#S0nB5nWZL1HXStJ+Eki|HB+U*a7KYQpd;ja3|5UGVx zAyxF`;yImQx^49c`hR5tL`jn`-g@3yT3Wgjh8$M$O*Qzs8TdvS^(`dTT!ca`sE5M3 zGj%7M6&Py5&ImW<9an@*rG+#lY?jcCh~%ajVe=T6n$WJo$esd-+_(mLVinZaQg%zC zN@ywD^PoOYWL2T;K_a$gc$3$2v{qEH-H3tUipa^(6GAN4sKyBsVH4f1K~qTCQME9U z^`O#ahrGq=j2Kpr)gf23v|k6rn?)qD6(E=c5}~4S8=$F97~vX$U2|OC(`{IrBX>pC zcBeYgd9dsCp>7GbmL_4CXi0U3ARx?-CTexrK#khE_^gB~`a97xa`ag#LR~Kpb-{qx z00XEdb1Y1EcQ=fnNfn}ofw${Pl46oY*fXk0u{%ZLyH$wA4?Sp{#m_uwH;bn{Xq?3_ zJ!q0eZ=J<%GS+omoD>r*Zu0`|Ws&O*i%W9iE!N(v5?SPuHIcQ?t3(#LYE5LVTJS_& zr37%5QtV_g>4l$SkxRtzJH3KGs1jM^5;c*vFRDZqxkOE5ty=I-a`8Hza$ZUer)F2@5%cvSKG;V$K0)-`Zf4{A8CQe@^!X?Oy-#r^Rd((lez z@&z}RcebJiCtfE4$>@=0KRl*F-(5-_F*@RgV@90?^M+>-Yj&Ied}zzwi9uu5JRUM3 zMWN`-MAZ!+U4=~96&0tPpK*DXNE-2QTJ zsglhW%e|TT`QBOAo!=MR5buj`9Ox~Va)o>r@KP_#N#2<$3$cB8cyn~!WVYhC6GX7^51%H@c{hsy38YDS*Cfj`+ z6no&(UktT|Z`-uqM=-pQR31L@@KRE34dDjq+%;oS4O$S!X9>pqul^gsHy9Jsa{es= zV?Y)7RBAN-%QXIz^!&l`H^CJg{}5oom;i}k@;ifyuLZf|U<+bMZ>9;E_MU$_NRayo zz(EX|1uPaCubrlM<6j0>aQrS{jq;zM{1qL>y9c>Nur$j5Gv()f zhWX)?*X2J17{=r}K~$}yS@-t^60*wui$H7S|8R@;zg2hMo&C6fmHa&d2``X;5NAKe z@k;=)z%mQ=KfpxldHxxG2ZToRce%m*wF8&^d0smJ3!Xg{n}{DPrFsk2->7zEUsfO5 zLcBo^_+Ego=(_y4ryAuyPUjELx4#AR`)z(1d13MUk{@H)Xt-msjz*Or-e`sqr%ld* zsW(L9#W%ds*E$&bcTFt_nxS@l9Sk^4Zop&+nzT9`SH8X(YDH>sT%#4f`Qi5m{KycE zqV!$`ul-c=eL|(TkL?&rjHP#M+qP?TB0Z598XHaX*O(A%sT`bf%y$KT)nYqx6`YQ_ zXazgVNL@~R#PRxsblmUQ7@yQC{0E>L<11;S;kdD(>OZ6F6{_Rl9_H3Z0>?Q>`W*rM zHPY!b*Q*DgbJ#|8=i!@39}D2`lfEl}Um-mcz+WPLHh?du@$&PU>wlhj@T*!i#NIp{D){ +#endif +#if APR_HAVE_STRING_H +#include +#endif +#if APR_HAVE_CTYPE_H +#include +#endif + +/* + * Apache's "replacement" for the strncpy() function. We roll our + * own to implement these specific changes: + * (1) strncpy() doesn't always null terminate and we want it to. + * (2) strncpy() null fills, which is bogus, esp. when copy 8byte + * strings into 8k blocks. + * (3) Instead of returning the pointer to the beginning of + * the destination string, we return a pointer to the + * terminating '\0' to allow us to "check" for truncation + * + * apr_cpystrn() follows the same call structure as strncpy(). + */ + +APR_DECLARE(char *) apr_cpystrn(char *dst, const char *src, apr_size_t dst_size) +{ + + char *d, *end; + + if (dst_size == 0) { + return (dst); + } + + d = dst; + end = dst + dst_size - 1; + + for (; d < end; ++d, ++src) { + if (!(*d = *src)) { + return (d); + } + } + + *d = '\0'; /* always null terminate */ + + return (d); +} + + +/* + * This function provides a way to parse a generic argument string + * into a standard argv[] form of argument list. It respects the + * usual "whitespace" and quoteing rules. In the future this could + * be expanded to include support for the apr_call_exec command line + * string processing (including converting '+' to ' ' and doing the + * url processing. It does not currently support this function. + * + * token_context: Context from which pool allocations will occur. + * arg_str: Input argument string for conversion to argv[]. + * argv_out: Output location. This is a pointer to an array + * of pointers to strings (ie. &(char *argv[]). + * This value will be allocated from the contexts + * pool and filled in with copies of the tokens + * found during parsing of the arg_str. + */ +APR_DECLARE(apr_status_t) apr_tokenize_to_argv(const char *arg_str, + char ***argv_out, + apr_pool_t *token_context) +{ + const char *cp; + const char *ct; + char *cleaned, *dirty; + int escaped; + int isquoted, numargs = 0, argnum; + +#define SKIP_WHITESPACE(cp) \ + for ( ; *cp == ' ' || *cp == '\t'; ) { \ + cp++; \ + }; + +#define CHECK_QUOTATION(cp,isquoted) \ + isquoted = 0; \ + if (*cp == '"') { \ + isquoted = 1; \ + cp++; \ + } \ + else if (*cp == '\'') { \ + isquoted = 2; \ + cp++; \ + } + +/* DETERMINE_NEXTSTRING: + * At exit, cp will point to one of the following: NULL, SPACE, TAB or QUOTE. + * NULL implies the argument string has been fully traversed. + */ +#define DETERMINE_NEXTSTRING(cp,isquoted) \ + for ( ; *cp != '\0'; cp++) { \ + if ( (*cp == '\\' && (*(cp+1) == ' ' || *(cp+1) == '\t' || \ + *(cp+1) == '"' || *(cp+1) == '\''))) { \ + cp++; \ + continue; \ + } \ + if ( (!isquoted && (*cp == ' ' || *cp == '\t')) \ + || (isquoted == 1 && *cp == '"') \ + || (isquoted == 2 && *cp == '\'') ) { \ + break; \ + } \ + } + +/* REMOVE_ESCAPE_CHARS: + * Compresses the arg string to remove all of the '\' escape chars. + * The final argv strings should not have any extra escape chars in it. + */ +#define REMOVE_ESCAPE_CHARS(cleaned, dirty, escaped) \ + escaped = 0; \ + while(*dirty) { \ + if (!escaped && *dirty == '\\') { \ + escaped = 1; \ + } \ + else { \ + escaped = 0; \ + *cleaned++ = *dirty; \ + } \ + ++dirty; \ + } \ + *cleaned = 0; /* last line of macro... */ + + cp = arg_str; + SKIP_WHITESPACE(cp); + ct = cp; + + /* This is ugly and expensive, but if anyone wants to figure a + * way to support any number of args without counting and + * allocating, please go ahead and change the code. + * + * Must account for the trailing NULL arg. + */ + numargs = 1; + while (*ct != '\0') { + CHECK_QUOTATION(ct, isquoted); + DETERMINE_NEXTSTRING(ct, isquoted); + if (*ct != '\0') { + ct++; + } + numargs++; + SKIP_WHITESPACE(ct); + } + *argv_out = apr_palloc(token_context, numargs * sizeof(char*)); + + /* determine first argument */ + for (argnum = 0; argnum < (numargs-1); argnum++) { + SKIP_WHITESPACE(cp); + CHECK_QUOTATION(cp, isquoted); + ct = cp; + DETERMINE_NEXTSTRING(cp, isquoted); + cp++; + (*argv_out)[argnum] = apr_palloc(token_context, cp - ct); + apr_cpystrn((*argv_out)[argnum], ct, cp - ct); + cleaned = dirty = (*argv_out)[argnum]; + REMOVE_ESCAPE_CHARS(cleaned, dirty, escaped); + } + (*argv_out)[argnum] = NULL; + + return APR_SUCCESS; +} + +/* Filepath_name_get returns the final element of the pathname. + * Using the current platform's filename syntax. + * "/foo/bar/gum" -> "gum" + * "/foo/bar/gum/" -> "" + * "gum" -> "gum" + * "wi\\n32\\stuff" -> "stuff + * + * Corrected Win32 to accept "a/b\\stuff", "a:stuff" + */ + +APR_DECLARE(const char *) apr_filepath_name_get(const char *pathname) +{ + const char path_separator = '/'; + const char *s = strrchr(pathname, path_separator); + +#ifdef WIN32 + const char path_separator_win = '\\'; + const char drive_separator_win = ':'; + const char *s2 = strrchr(pathname, path_separator_win); + + if (s2 > s) s = s2; + + if (!s) s = strrchr(pathname, drive_separator_win); +#endif + + return s ? ++s : pathname; +} + +/* deprecated */ +APR_DECLARE(const char *) apr_filename_of_pathname(const char *pathname) +{ + return apr_filepath_name_get(pathname); +} + +/* length of dest assumed >= length of src + * collapse in place (src == dest) is legal. + * returns terminating null ptr to dest string. + */ +APR_DECLARE(char *) apr_collapse_spaces(char *dest, const char *src) +{ + while (*src) { + if (!apr_isspace(*src)) + *dest++ = *src; + ++src; + } + *dest = 0; + return (dest); +} + +#if !APR_HAVE_STRDUP +char *strdup(const char *str) +{ + char *sdup; + size_t len = strlen(str) + 1; + + sdup = (char *) malloc(len); + memcpy(sdup, str, len); + + return sdup; +} +#endif + +/* The following two routines were donated for SVR4 by Andreas Vogel */ +#if (!APR_HAVE_STRCASECMP && !APR_HAVE_STRICMP) +int strcasecmp(const char *a, const char *b) +{ + const char *p = a; + const char *q = b; + for (p = a, q = b; *p && *q; p++, q++) { + int diff = apr_tolower(*p) - apr_tolower(*q); + if (diff) + return diff; + } + if (*p) + return 1; /* p was longer than q */ + if (*q) + return -1; /* p was shorter than q */ + return 0; /* Exact match */ +} + +#endif + +#if (!APR_HAVE_STRNCASECMP && !APR_HAVE_STRNICMP) +int strncasecmp(const char *a, const char *b, size_t n) +{ + const char *p = a; + const char *q = b; + + for (p = a, q = b; /*NOTHING */ ; p++, q++) { + int diff; + if (p == a + n) + return 0; /* Match up to n characters */ + if (!(*p && *q)) + return *p - *q; + diff = apr_tolower(*p) - apr_tolower(*q); + if (diff) + return diff; + } + /*NOTREACHED */ +} +#endif + +/* The following routine was donated for UTS21 by dwd@bell-labs.com */ +#if (!APR_HAVE_STRSTR) +char *strstr(char *s1, char *s2) +{ + char *p1, *p2; + if (*s2 == '\0') { + /* an empty s2 */ + return(s1); + } + while((s1 = strchr(s1, *s2)) != NULL) { + /* found first character of s2, see if the rest matches */ + p1 = s1; + p2 = s2; + while (*++p1 == *++p2) { + if (*p1 == '\0') { + /* both strings ended together */ + return(s1); + } + } + if (*p2 == '\0') { + /* second string ended, a match */ + break; + } + /* didn't find a match here, try starting at next character in s1 */ + s1++; + } + return(s1); +} +#endif + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_cpystrn.lo b/rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_cpystrn.lo new file mode 100644 index 00000000..85222d14 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_cpystrn.lo @@ -0,0 +1,12 @@ +# apr_cpystrn.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/apr_cpystrn.o' + +# Name of the non-PIC object. +non_pic_object='apr_cpystrn.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_cpystrn.o b/rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_cpystrn.o new file mode 100644 index 0000000000000000000000000000000000000000..bbe1f13e0514f8771f759f25b4a05ba2c15e6acb GIT binary patch literal 11928 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 qJ0 +#if APR_HAVE_CTYPE_H +# include +#endif + +#define EOS '\0' + +static const char *rangematch(const char *, int, int); + +APR_DECLARE(apr_status_t) apr_fnmatch(const char *pattern, const char *string, int flags) +{ + const char *stringstart; + char c, test; + + for (stringstart = string;;) { + switch (c = *pattern++) { + case EOS: + return (*string == EOS ? APR_SUCCESS : APR_FNM_NOMATCH); + case '?': + if (*string == EOS) { + return (APR_FNM_NOMATCH); + } + if (*string == '/' && (flags & APR_FNM_PATHNAME)) { + return (APR_FNM_NOMATCH); + } + if (*string == '.' && (flags & APR_FNM_PERIOD) && + (string == stringstart || + ((flags & APR_FNM_PATHNAME) && *(string - 1) == '/'))) { + return (APR_FNM_NOMATCH); + } + ++string; + break; + case '*': + c = *pattern; + /* Collapse multiple stars. */ + while (c == '*') { + c = *++pattern; + } + + if (*string == '.' && (flags & APR_FNM_PERIOD) && + (string == stringstart || + ((flags & APR_FNM_PATHNAME) && *(string - 1) == '/'))) { + return (APR_FNM_NOMATCH); + } + + /* Optimize for pattern with * at end or before /. */ + if (c == EOS) { + if (flags & APR_FNM_PATHNAME) { + return (strchr(string, '/') == NULL ? APR_SUCCESS : APR_FNM_NOMATCH); + } + else { + return (APR_SUCCESS); + } + } + else if (c == '/' && flags & APR_FNM_PATHNAME) { + if ((string = strchr(string, '/')) == NULL) { + return (APR_FNM_NOMATCH); + } + break; + } + + /* General case, use recursion. */ + while ((test = *string) != EOS) { + if (!apr_fnmatch(pattern, string, flags & ~APR_FNM_PERIOD)) { + return (APR_SUCCESS); + } + if (test == '/' && flags & APR_FNM_PATHNAME) { + break; + } + ++string; + } + return (APR_FNM_NOMATCH); + case '[': + if (*string == EOS) { + return (APR_FNM_NOMATCH); + } + if (*string == '/' && flags & APR_FNM_PATHNAME) { + return (APR_FNM_NOMATCH); + } + if (*string == '.' && (flags & APR_FNM_PERIOD) && + (string == stringstart || + ((flags & APR_FNM_PATHNAME) && *(string - 1) == '/'))) { + return (APR_FNM_NOMATCH); + } + if ((pattern = rangematch(pattern, *string, flags)) == NULL) { + return (APR_FNM_NOMATCH); + } + ++string; + break; + case '\\': + if (!(flags & APR_FNM_NOESCAPE)) { + if ((c = *pattern++) == EOS) { + c = '\\'; + --pattern; + } + } + /* FALLTHROUGH */ + default: + if (flags & APR_FNM_CASE_BLIND) { + if (apr_tolower(c) != apr_tolower(*string)) { + return (APR_FNM_NOMATCH); + } + } + else if (c != *string) { + return (APR_FNM_NOMATCH); + } + string++; + break; + } + /* NOTREACHED */ + } +} + +static const char *rangematch(const char *pattern, int test, int flags) +{ + int negate, ok; + char c, c2; + + /* + * A bracket expression starting with an unquoted circumflex + * character produces unspecified results (IEEE 1003.2-1992, + * 3.13.2). This implementation treats it like '!', for + * consistency with the regular expression syntax. + * J.T. Conklin (conklin@ngai.kaleida.com) + */ + if ((negate = (*pattern == '!' || *pattern == '^'))) { + ++pattern; + } + + for (ok = 0; (c = *pattern++) != ']';) { + if (c == '\\' && !(flags & APR_FNM_NOESCAPE)) { + c = *pattern++; + } + if (c == EOS) { + return (NULL); + } + if (*pattern == '-' && (c2 = *(pattern + 1)) != EOS && c2 != ']') { + pattern += 2; + if (c2 == '\\' && !(flags & APR_FNM_NOESCAPE)) { + c2 = *pattern++; + } + if (c2 == EOS) { + return (NULL); + } + if ((c <= test && test <= c2) + || ((flags & APR_FNM_CASE_BLIND) + && ((apr_tolower(c) <= apr_tolower(test)) + && (apr_tolower(test) <= apr_tolower(c2))))) { + ok = 1; + } + } + else if ((c == test) + || ((flags & APR_FNM_CASE_BLIND) + && (apr_tolower(c) == apr_tolower(test)))) { + ok = 1; + } + } + return (ok == negate ? NULL : pattern); +} + + +/* This function is an Apache addition */ +/* return non-zero if pattern has any glob chars in it */ +APR_DECLARE(int) apr_fnmatch_test(const char *pattern) +{ + int nesting; + + nesting = 0; + while (*pattern) { + switch (*pattern) { + case '?': + case '*': + return 1; + + case '\\': + if (*pattern++ == '\0') { + return 0; + } + break; + + case '[': /* '[' is only a glob if it has a matching ']' */ + ++nesting; + break; + + case ']': + if (nesting) { + return 1; + } + break; + } + ++pattern; + } + return 0; +} + +/* Deprecated */ +APR_DECLARE(int) apr_is_fnmatch(const char *pattern) +{ + return apr_fnmatch_test(pattern); +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_fnmatch.lo b/rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_fnmatch.lo new file mode 100644 index 00000000..bdc2f218 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_fnmatch.lo @@ -0,0 +1,12 @@ +# apr_fnmatch.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/apr_fnmatch.o' + +# Name of the non-PIC object. +non_pic_object='apr_fnmatch.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_fnmatch.o b/rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_fnmatch.o new file mode 100644 index 0000000000000000000000000000000000000000..19e8a0575f5276b0d73c93749cee4922966153dc GIT binary patch literal 11120 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 U;g~i`okZd`ob&Rq4d?j$3l>6mi~s-t literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_snprintf.c b/rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_snprintf.c new file mode 100644 index 00000000..776890bb --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_snprintf.c @@ -0,0 +1,1311 @@ +/* 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. + */ + +#include "apr.h" +#include "apr_private.h" + +#include "apr_lib.h" +#include "apr_strings.h" +#include "apr_network_io.h" +#include "apr_portable.h" +#include +#if APR_HAVE_CTYPE_H +#include +#endif +#if APR_HAVE_NETINET_IN_H +#include +#endif +#if APR_HAVE_SYS_SOCKET_H +#include +#endif +#if APR_HAVE_ARPA_INET_H +#include +#endif +#if APR_HAVE_LIMITS_H +#include +#endif +#if APR_HAVE_STRING_H +#include +#endif + +typedef enum { + NO = 0, YES = 1 +} boolean_e; + +#ifndef FALSE +#define FALSE 0 +#endif +#ifndef TRUE +#define TRUE 1 +#endif +#define NUL '\0' +#define WIDE_INT long + +typedef WIDE_INT wide_int; +typedef unsigned WIDE_INT u_wide_int; +typedef apr_int64_t widest_int; +#ifdef __TANDEM +/* Although Tandem supports "long long" there is no unsigned variant. */ +typedef unsigned long u_widest_int; +#else +typedef apr_uint64_t u_widest_int; +#endif +typedef int bool_int; + +static const char null_string[] = "(null)"; +#define S_NULL ((char *)null_string) +#define S_NULL_LEN 6 + +#define FLOAT_DIGITS 6 +#define EXPONENT_LENGTH 10 + +/* + * NUM_BUF_SIZE is the size of the buffer used for arithmetic conversions + * + * NOTICE: this is a magic number; do not decrease it + */ +#define NUM_BUF_SIZE 512 + +/* + * cvt - IEEE floating point formatting routines. + * Derived from UNIX V7, Copyright(C) Caldera International Inc. + */ + +/* + * apr_ecvt converts to decimal + * the number of digits is specified by ndigit + * decpt is set to the position of the decimal point + * sign is set to 0 for positive, 1 for negative + */ + +#define NDIG 80 + +/* buf must have at least NDIG bytes */ +static char *apr_cvt(double arg, int ndigits, int *decpt, int *sign, + int eflag, char *buf) +{ + register int r2; + double fi, fj; + register char *p, *p1; + + if (ndigits >= NDIG - 1) + ndigits = NDIG - 2; + r2 = 0; + *sign = 0; + p = &buf[0]; + if (arg < 0) { + *sign = 1; + arg = -arg; + } + arg = modf(arg, &fi); + p1 = &buf[NDIG]; + /* + * Do integer part + */ + if (fi != 0) { + p1 = &buf[NDIG]; + while (p1 > &buf[0] && fi != 0) { + fj = modf(fi / 10, &fi); + *--p1 = (int) ((fj + .03) * 10) + '0'; + r2++; + } + while (p1 < &buf[NDIG]) + *p++ = *p1++; + } + else if (arg > 0) { + while ((fj = arg * 10) < 1) { + arg = fj; + r2--; + } + } + p1 = &buf[ndigits]; + if (eflag == 0) + p1 += r2; + if (p1 < &buf[0]) { + *decpt = -ndigits; + buf[0] = '\0'; + return (buf); + } + *decpt = r2; + while (p <= p1 && p < &buf[NDIG]) { + arg *= 10; + arg = modf(arg, &fj); + *p++ = (int) fj + '0'; + } + if (p1 >= &buf[NDIG]) { + buf[NDIG - 1] = '\0'; + return (buf); + } + p = p1; + *p1 += 5; + while (*p1 > '9') { + *p1 = '0'; + if (p1 > buf) + ++ * --p1; + else { + *p1 = '1'; + (*decpt)++; + if (eflag == 0) { + if (p > buf) + *p = '0'; + p++; + } + } + } + *p = '\0'; + return (buf); +} + +static char *apr_ecvt(double arg, int ndigits, int *decpt, int *sign, char *buf) +{ + return (apr_cvt(arg, ndigits, decpt, sign, 1, buf)); +} + +static char *apr_fcvt(double arg, int ndigits, int *decpt, int *sign, char *buf) +{ + return (apr_cvt(arg, ndigits, decpt, sign, 0, buf)); +} + +/* + * apr_gcvt - Floating output conversion to + * minimal length string + */ + +static char *apr_gcvt(double number, int ndigit, char *buf, boolean_e altform) +{ + int sign, decpt; + register char *p1, *p2; + register int i; + char buf1[NDIG]; + + p1 = apr_ecvt(number, ndigit, &decpt, &sign, buf1); + p2 = buf; + if (sign) + *p2++ = '-'; + for (i = ndigit - 1; i > 0 && p1[i] == '0'; i--) + ndigit--; + if ((decpt >= 0 && decpt - ndigit > 4) + || (decpt < 0 && decpt < -3)) { /* use E-style */ + decpt--; + *p2++ = *p1++; + *p2++ = '.'; + for (i = 1; i < ndigit; i++) + *p2++ = *p1++; + *p2++ = 'e'; + if (decpt < 0) { + decpt = -decpt; + *p2++ = '-'; + } + else + *p2++ = '+'; + if (decpt / 100 > 0) + *p2++ = decpt / 100 + '0'; + if (decpt / 10 > 0) + *p2++ = (decpt % 100) / 10 + '0'; + *p2++ = decpt % 10 + '0'; + } + else { + if (decpt <= 0) { + if (*p1 != '0') + *p2++ = '.'; + while (decpt < 0) { + decpt++; + *p2++ = '0'; + } + } + for (i = 1; i <= ndigit; i++) { + *p2++ = *p1++; + if (i == decpt) + *p2++ = '.'; + } + if (ndigit < decpt) { + while (ndigit++ < decpt) + *p2++ = '0'; + *p2++ = '.'; + } + } + if (p2[-1] == '.' && !altform) + p2--; + *p2 = '\0'; + return (buf); +} + +/* + * The INS_CHAR macro inserts a character in the buffer and writes + * the buffer back to disk if necessary + * It uses the char pointers sp and bep: + * sp points to the next available character in the buffer + * bep points to the end-of-buffer+1 + * While using this macro, note that the nextb pointer is NOT updated. + * + * NOTE: Evaluation of the c argument should not have any side-effects + */ +#define INS_CHAR(c, sp, bep, cc) \ +{ \ + if (sp) { \ + if (sp >= bep) { \ + vbuff->curpos = sp; \ + if (flush_func(vbuff)) \ + return -1; \ + sp = vbuff->curpos; \ + bep = vbuff->endpos; \ + } \ + *sp++ = (c); \ + } \ + cc++; \ +} + +#define NUM(c) (c - '0') + +#define STR_TO_DEC(str, num) \ + num = NUM(*str++); \ + while (apr_isdigit(*str)) \ + { \ + num *= 10 ; \ + num += NUM(*str++); \ + } + +/* + * This macro does zero padding so that the precision + * requirement is satisfied. The padding is done by + * adding '0's to the left of the string that is going + * to be printed. We don't allow precision to be large + * enough that we continue past the start of s. + * + * NOTE: this makes use of the magic info that s is + * always based on num_buf with a size of NUM_BUF_SIZE. + */ +#define FIX_PRECISION(adjust, precision, s, s_len) \ + if (adjust) { \ + int p = precision < NUM_BUF_SIZE - 1 ? precision : NUM_BUF_SIZE - 1; \ + while (s_len < p) \ + { \ + *--s = '0'; \ + s_len++; \ + } \ + } + +/* + * Macro that does padding. The padding is done by printing + * the character ch. + */ +#define PAD(width, len, ch) \ +do \ +{ \ + INS_CHAR(ch, sp, bep, cc); \ + width--; \ +} \ +while (width > len) + +/* + * Prefix the character ch to the string str + * Increase length + * Set the has_prefix flag + */ +#define PREFIX(str, length, ch) \ + *--str = ch; \ + length++; \ + has_prefix=YES; + + +/* + * Convert num to its decimal format. + * Return value: + * - a pointer to a string containing the number (no sign) + * - len contains the length of the string + * - is_negative is set to TRUE or FALSE depending on the sign + * of the number (always set to FALSE if is_unsigned is TRUE) + * + * The caller provides a buffer for the string: that is the buf_end argument + * which is a pointer to the END of the buffer + 1 (i.e. if the buffer + * is declared as buf[ 100 ], buf_end should be &buf[ 100 ]) + * + * Note: we have 2 versions. One is used when we need to use quads + * (conv_10_quad), the other when we don't (conv_10). We're assuming the + * latter is faster. + */ +static char *conv_10(register wide_int num, register bool_int is_unsigned, + register bool_int *is_negative, char *buf_end, + register int *len) +{ + register char *p = buf_end; + register u_wide_int magnitude; + + if (is_unsigned) { + magnitude = (u_wide_int) num; + *is_negative = FALSE; + } + else { + *is_negative = (num < 0); + + /* + * On a 2's complement machine, negating the most negative integer + * results in a number that cannot be represented as a signed integer. + * Here is what we do to obtain the number's magnitude: + * a. add 1 to the number + * b. negate it (becomes positive) + * c. convert it to unsigned + * d. add 1 + */ + if (*is_negative) { + wide_int t = num + 1; + + magnitude = ((u_wide_int) -t) + 1; + } + else + magnitude = (u_wide_int) num; + } + + /* + * We use a do-while loop so that we write at least 1 digit + */ + do { + register u_wide_int new_magnitude = magnitude / 10; + + *--p = (char) (magnitude - new_magnitude * 10 + '0'); + magnitude = new_magnitude; + } + while (magnitude); + + *len = buf_end - p; + return (p); +} + +static char *conv_10_quad(widest_int num, register bool_int is_unsigned, + register bool_int *is_negative, char *buf_end, + register int *len) +{ + register char *p = buf_end; + u_widest_int magnitude; + + /* + * We see if we can use the faster non-quad version by checking the + * number against the largest long value it can be. If <=, we + * punt to the quicker version. + */ + if ((num <= ULONG_MAX && is_unsigned) + || (num <= LONG_MAX && num >= LONG_MIN && !is_unsigned)) + return(conv_10( (wide_int)num, is_unsigned, is_negative, + buf_end, len)); + + if (is_unsigned) { + magnitude = (u_widest_int) num; + *is_negative = FALSE; + } + else { + *is_negative = (num < 0); + + /* + * On a 2's complement machine, negating the most negative integer + * results in a number that cannot be represented as a signed integer. + * Here is what we do to obtain the number's magnitude: + * a. add 1 to the number + * b. negate it (becomes positive) + * c. convert it to unsigned + * d. add 1 + */ + if (*is_negative) { + widest_int t = num + 1; + + magnitude = ((u_widest_int) -t) + 1; + } + else + magnitude = (u_widest_int) num; + } + + /* + * We use a do-while loop so that we write at least 1 digit + */ + do { + u_widest_int new_magnitude = magnitude / 10; + + *--p = (char) (magnitude - new_magnitude * 10 + '0'); + magnitude = new_magnitude; + } + while (magnitude); + + *len = buf_end - p; + return (p); +} + + + +static char *conv_in_addr(struct in_addr *ia, char *buf_end, int *len) +{ + unsigned addr = ntohl(ia->s_addr); + char *p = buf_end; + bool_int is_negative; + int sub_len; + + p = conv_10((addr & 0x000000FF) , TRUE, &is_negative, p, &sub_len); + *--p = '.'; + p = conv_10((addr & 0x0000FF00) >> 8, TRUE, &is_negative, p, &sub_len); + *--p = '.'; + p = conv_10((addr & 0x00FF0000) >> 16, TRUE, &is_negative, p, &sub_len); + *--p = '.'; + p = conv_10((addr & 0xFF000000) >> 24, TRUE, &is_negative, p, &sub_len); + + *len = buf_end - p; + return (p); +} + + + +static char *conv_apr_sockaddr(apr_sockaddr_t *sa, char *buf_end, int *len) +{ + char *p = buf_end; + bool_int is_negative; + int sub_len; + char *ipaddr_str; + + p = conv_10(sa->port, TRUE, &is_negative, p, &sub_len); + *--p = ':'; + apr_sockaddr_ip_get(&ipaddr_str, sa); + sub_len = strlen(ipaddr_str); +#if APR_HAVE_IPV6 + if (sa->family == APR_INET6 && + !IN6_IS_ADDR_V4MAPPED(&sa->sa.sin6.sin6_addr)) { + *(p - 1) = ']'; + p -= sub_len + 2; + *p = '['; + memcpy(p + 1, ipaddr_str, sub_len); + } + else +#endif + { + p -= sub_len; + memcpy(p, ipaddr_str, sub_len); + } + + *len = buf_end - p; + return (p); +} + + + +#if APR_HAS_THREADS +static char *conv_os_thread_t(apr_os_thread_t *tid, char *buf_end, int *len) +{ + union { + apr_os_thread_t tid; + apr_uint64_t alignme; + } u; + int is_negative; + + u.tid = *tid; + switch(sizeof(u.tid)) { + case sizeof(apr_int32_t): + return conv_10(*(apr_uint32_t *)&u.tid, TRUE, &is_negative, buf_end, len); + case sizeof(apr_int64_t): + return conv_10_quad(*(apr_uint64_t *)&u.tid, TRUE, &is_negative, buf_end, len); + default: + /* not implemented; stick 0 in the buffer */ + return conv_10(0, TRUE, &is_negative, buf_end, len); + } +} +#endif + + + +/* + * Convert a floating point number to a string formats 'f', 'e' or 'E'. + * The result is placed in buf, and len denotes the length of the string + * The sign is returned in the is_negative argument (and is not placed + * in buf). + */ +static char *conv_fp(register char format, register double num, + boolean_e add_dp, int precision, bool_int *is_negative, + char *buf, int *len) +{ + register char *s = buf; + register char *p; + int decimal_point; + char buf1[NDIG]; + + if (format == 'f') + p = apr_fcvt(num, precision, &decimal_point, is_negative, buf1); + else /* either e or E format */ + p = apr_ecvt(num, precision + 1, &decimal_point, is_negative, buf1); + + /* + * Check for Infinity and NaN + */ + if (apr_isalpha(*p)) { + *len = strlen(p); + memcpy(buf, p, *len + 1); + *is_negative = FALSE; + return (buf); + } + + if (format == 'f') { + if (decimal_point <= 0) { + *s++ = '0'; + if (precision > 0) { + *s++ = '.'; + while (decimal_point++ < 0) + *s++ = '0'; + } + else if (add_dp) + *s++ = '.'; + } + else { + while (decimal_point-- > 0) + *s++ = *p++; + if (precision > 0 || add_dp) + *s++ = '.'; + } + } + else { + *s++ = *p++; + if (precision > 0 || add_dp) + *s++ = '.'; + } + + /* + * copy the rest of p, the NUL is NOT copied + */ + while (*p) + *s++ = *p++; + + if (format != 'f') { + char temp[EXPONENT_LENGTH]; /* for exponent conversion */ + int t_len; + bool_int exponent_is_negative; + + *s++ = format; /* either e or E */ + decimal_point--; + if (decimal_point != 0) { + p = conv_10((wide_int) decimal_point, FALSE, &exponent_is_negative, + &temp[EXPONENT_LENGTH], &t_len); + *s++ = exponent_is_negative ? '-' : '+'; + + /* + * Make sure the exponent has at least 2 digits + */ + if (t_len == 1) + *s++ = '0'; + while (t_len--) + *s++ = *p++; + } + else { + *s++ = '+'; + *s++ = '0'; + *s++ = '0'; + } + } + + *len = s - buf; + return (buf); +} + + +/* + * Convert num to a base X number where X is a power of 2. nbits determines X. + * For example, if nbits is 3, we do base 8 conversion + * Return value: + * a pointer to a string containing the number + * + * The caller provides a buffer for the string: that is the buf_end argument + * which is a pointer to the END of the buffer + 1 (i.e. if the buffer + * is declared as buf[ 100 ], buf_end should be &buf[ 100 ]) + * + * As with conv_10, we have a faster version which is used when + * the number isn't quad size. + */ +static char *conv_p2(register u_wide_int num, register int nbits, + char format, char *buf_end, register int *len) +{ + register int mask = (1 << nbits) - 1; + register char *p = buf_end; + static const char low_digits[] = "0123456789abcdef"; + static const char upper_digits[] = "0123456789ABCDEF"; + register const char *digits = (format == 'X') ? upper_digits : low_digits; + + do { + *--p = digits[num & mask]; + num >>= nbits; + } + while (num); + + *len = buf_end - p; + return (p); +} + +static char *conv_p2_quad(u_widest_int num, register int nbits, + char format, char *buf_end, register int *len) +{ + register int mask = (1 << nbits) - 1; + register char *p = buf_end; + static const char low_digits[] = "0123456789abcdef"; + static const char upper_digits[] = "0123456789ABCDEF"; + register const char *digits = (format == 'X') ? upper_digits : low_digits; + + if (num <= ULONG_MAX) + return(conv_p2((u_wide_int)num, nbits, format, buf_end, len)); + + do { + *--p = digits[num & mask]; + num >>= nbits; + } + while (num); + + *len = buf_end - p; + return (p); +} + + +/* + * Do format conversion placing the output in buffer + */ +APR_DECLARE(int) apr_vformatter(int (*flush_func)(apr_vformatter_buff_t *), + apr_vformatter_buff_t *vbuff, const char *fmt, va_list ap) +{ + register char *sp; + register char *bep; + register int cc = 0; + register int i; + + register char *s = NULL; + char *q; + int s_len; + + register int min_width = 0; + int precision = 0; + enum { + LEFT, RIGHT + } adjust; + char pad_char; + char prefix_char; + + double fp_num; + widest_int i_quad = (widest_int) 0; + u_widest_int ui_quad; + wide_int i_num = (wide_int) 0; + u_wide_int ui_num; + + char num_buf[NUM_BUF_SIZE]; + char char_buf[2]; /* for printing %% and % */ + + enum var_type_enum { + IS_QUAD, IS_LONG, IS_SHORT, IS_INT + }; + enum var_type_enum var_type = IS_INT; + + /* + * Flag variables + */ + boolean_e alternate_form; + boolean_e print_sign; + boolean_e print_blank; + boolean_e adjust_precision; + boolean_e adjust_width; + bool_int is_negative; + + sp = vbuff->curpos; + bep = vbuff->endpos; + + while (*fmt) { + if (*fmt != '%') { + INS_CHAR(*fmt, sp, bep, cc); + } + else { + /* + * Default variable settings + */ + boolean_e print_something = YES; + adjust = RIGHT; + alternate_form = print_sign = print_blank = NO; + pad_char = ' '; + prefix_char = NUL; + + fmt++; + + /* + * Try to avoid checking for flags, width or precision + */ + if (!apr_islower(*fmt)) { + /* + * Recognize flags: -, #, BLANK, + + */ + for (;; fmt++) { + if (*fmt == '-') + adjust = LEFT; + else if (*fmt == '+') + print_sign = YES; + else if (*fmt == '#') + alternate_form = YES; + else if (*fmt == ' ') + print_blank = YES; + else if (*fmt == '0') + pad_char = '0'; + else + break; + } + + /* + * Check if a width was specified + */ + if (apr_isdigit(*fmt)) { + STR_TO_DEC(fmt, min_width); + adjust_width = YES; + } + else if (*fmt == '*') { + min_width = va_arg(ap, int); + fmt++; + adjust_width = YES; + if (min_width < 0) { + adjust = LEFT; + min_width = -min_width; + } + } + else + adjust_width = NO; + + /* + * Check if a precision was specified + */ + if (*fmt == '.') { + adjust_precision = YES; + fmt++; + if (apr_isdigit(*fmt)) { + STR_TO_DEC(fmt, precision); + } + else if (*fmt == '*') { + precision = va_arg(ap, int); + fmt++; + if (precision < 0) + precision = 0; + } + else + precision = 0; + } + else + adjust_precision = NO; + } + else + adjust_precision = adjust_width = NO; + + /* + * Modifier check + */ +#if defined(APR_INT64_T_FMT_LEN) && (APR_INT64_T_FMT_LEN == 3) + if ((*fmt == APR_INT64_T_FMT[0]) && + (fmt[1] == APR_INT64_T_FMT[1])) { +#elif defined(APR_INT64_T_FMT_LEN) && (APR_INT64_T_FMT_LEN == 2) + if (*fmt == APR_INT64_T_FMT[0]) { +#else + if (strncmp(fmt, APR_INT64_T_FMT, + sizeof(APR_INT64_T_FMT) - 2) == 0) { +#endif + /* Need to account for trailing 'd' and null in sizeof() */ + var_type = IS_QUAD; + fmt += (sizeof(APR_INT64_T_FMT) - 2); + } + else if (*fmt == 'q') { + var_type = IS_QUAD; + fmt++; + } + else if (*fmt == 'l') { + var_type = IS_LONG; + fmt++; + } + else if (*fmt == 'h') { + var_type = IS_SHORT; + fmt++; + } + else { + var_type = IS_INT; + } + + /* + * Argument extraction and printing. + * First we determine the argument type. + * Then, we convert the argument to a string. + * On exit from the switch, s points to the string that + * must be printed, s_len has the length of the string + * The precision requirements, if any, are reflected in s_len. + * + * NOTE: pad_char may be set to '0' because of the 0 flag. + * It is reset to ' ' by non-numeric formats + */ + switch (*fmt) { + case 'u': + if (var_type == IS_QUAD) { + i_quad = va_arg(ap, u_widest_int); + s = conv_10_quad(i_quad, 1, &is_negative, + &num_buf[NUM_BUF_SIZE], &s_len); + } + else { + if (var_type == IS_LONG) + i_num = (wide_int) va_arg(ap, u_wide_int); + else if (var_type == IS_SHORT) + i_num = (wide_int) (unsigned short) va_arg(ap, unsigned int); + else + i_num = (wide_int) va_arg(ap, unsigned int); + s = conv_10(i_num, 1, &is_negative, + &num_buf[NUM_BUF_SIZE], &s_len); + } + FIX_PRECISION(adjust_precision, precision, s, s_len); + break; + + case 'd': + case 'i': + if (var_type == IS_QUAD) { + i_quad = va_arg(ap, widest_int); + s = conv_10_quad(i_quad, 0, &is_negative, + &num_buf[NUM_BUF_SIZE], &s_len); + } + else { + if (var_type == IS_LONG) + i_num = (wide_int) va_arg(ap, wide_int); + else if (var_type == IS_SHORT) + i_num = (wide_int) (short) va_arg(ap, int); + else + i_num = (wide_int) va_arg(ap, int); + s = conv_10(i_num, 0, &is_negative, + &num_buf[NUM_BUF_SIZE], &s_len); + } + FIX_PRECISION(adjust_precision, precision, s, s_len); + + if (is_negative) + prefix_char = '-'; + else if (print_sign) + prefix_char = '+'; + else if (print_blank) + prefix_char = ' '; + break; + + + case 'o': + if (var_type == IS_QUAD) { + ui_quad = va_arg(ap, u_widest_int); + s = conv_p2_quad(ui_quad, 3, *fmt, + &num_buf[NUM_BUF_SIZE], &s_len); + } + else { + if (var_type == IS_LONG) + ui_num = (u_wide_int) va_arg(ap, u_wide_int); + else if (var_type == IS_SHORT) + ui_num = (u_wide_int) (unsigned short) va_arg(ap, unsigned int); + else + ui_num = (u_wide_int) va_arg(ap, unsigned int); + s = conv_p2(ui_num, 3, *fmt, + &num_buf[NUM_BUF_SIZE], &s_len); + } + FIX_PRECISION(adjust_precision, precision, s, s_len); + if (alternate_form && *s != '0') { + *--s = '0'; + s_len++; + } + break; + + + case 'x': + case 'X': + if (var_type == IS_QUAD) { + ui_quad = va_arg(ap, u_widest_int); + s = conv_p2_quad(ui_quad, 4, *fmt, + &num_buf[NUM_BUF_SIZE], &s_len); + } + else { + if (var_type == IS_LONG) + ui_num = (u_wide_int) va_arg(ap, u_wide_int); + else if (var_type == IS_SHORT) + ui_num = (u_wide_int) (unsigned short) va_arg(ap, unsigned int); + else + ui_num = (u_wide_int) va_arg(ap, unsigned int); + s = conv_p2(ui_num, 4, *fmt, + &num_buf[NUM_BUF_SIZE], &s_len); + } + FIX_PRECISION(adjust_precision, precision, s, s_len); + if (alternate_form && i_num != 0) { + *--s = *fmt; /* 'x' or 'X' */ + *--s = '0'; + s_len += 2; + } + break; + + + case 's': + s = va_arg(ap, char *); + if (s != NULL) { + if (!adjust_precision) { + s_len = strlen(s); + } + else { + /* From the C library standard in section 7.9.6.1: + * ...if the precision is specified, no more then + * that many characters are written. If the + * precision is not specified or is greater + * than the size of the array, the array shall + * contain a null character. + * + * My reading is is precision is specified and + * is less then or equal to the size of the + * array, no null character is required. So + * we can't do a strlen. + * + * This figures out the length of the string + * up to the precision. Once it's long enough + * for the specified precision, we don't care + * anymore. + * + * NOTE: you must do the length comparison + * before the check for the null character. + * Otherwise, you'll check one beyond the + * last valid character. + */ + const char *walk; + + for (walk = s, s_len = 0; + (s_len < precision) && (*walk != '\0'); + ++walk, ++s_len); + } + } + else { + s = S_NULL; + s_len = S_NULL_LEN; + } + pad_char = ' '; + break; + + + case 'f': + case 'e': + case 'E': + fp_num = va_arg(ap, double); + /* + * We use &num_buf[ 1 ], so that we have room for the sign + */ + s = NULL; +#ifdef HAVE_ISNAN + if (isnan(fp_num)) { + s = "nan"; + s_len = 3; + } +#endif +#ifdef HAVE_ISINF + if (!s && isinf(fp_num)) { + s = "inf"; + s_len = 3; + } +#endif + if (!s) { + s = conv_fp(*fmt, fp_num, alternate_form, + (adjust_precision == NO) ? FLOAT_DIGITS : precision, + &is_negative, &num_buf[1], &s_len); + if (is_negative) + prefix_char = '-'; + else if (print_sign) + prefix_char = '+'; + else if (print_blank) + prefix_char = ' '; + } + break; + + + case 'g': + case 'G': + if (adjust_precision == NO) + precision = FLOAT_DIGITS; + else if (precision == 0) + precision = 1; + /* + * * We use &num_buf[ 1 ], so that we have room for the sign + */ + s = apr_gcvt(va_arg(ap, double), precision, &num_buf[1], + alternate_form); + if (*s == '-') + prefix_char = *s++; + else if (print_sign) + prefix_char = '+'; + else if (print_blank) + prefix_char = ' '; + + s_len = strlen(s); + + if (alternate_form && (q = strchr(s, '.')) == NULL) { + s[s_len++] = '.'; + s[s_len] = '\0'; /* delimit for following strchr() */ + } + if (*fmt == 'G' && (q = strchr(s, 'e')) != NULL) + *q = 'E'; + break; + + + case 'c': + char_buf[0] = (char) (va_arg(ap, int)); + s = &char_buf[0]; + s_len = 1; + pad_char = ' '; + break; + + + case '%': + char_buf[0] = '%'; + s = &char_buf[0]; + s_len = 1; + pad_char = ' '; + break; + + + case 'n': + if (var_type == IS_QUAD) + *(va_arg(ap, widest_int *)) = cc; + else if (var_type == IS_LONG) + *(va_arg(ap, long *)) = cc; + else if (var_type == IS_SHORT) + *(va_arg(ap, short *)) = cc; + else + *(va_arg(ap, int *)) = cc; + print_something = NO; + break; + + /* + * This is where we extend the printf format, with a second + * type specifier + */ + case 'p': + switch(*++fmt) { + /* + * If the pointer size is equal to or smaller than the size + * of the largest unsigned int, we convert the pointer to a + * hex number, otherwise we print "%p" to indicate that we + * don't handle "%p". + */ + case 'p': +#if APR_SIZEOF_VOIDP == 8 + if (sizeof(void *) <= sizeof(u_widest_int)) { + ui_quad = (u_widest_int) va_arg(ap, void *); + s = conv_p2_quad(ui_quad, 4, 'x', + &num_buf[NUM_BUF_SIZE], &s_len); + } +#else + if (sizeof(void *) <= sizeof(u_wide_int)) { + ui_num = (u_wide_int) va_arg(ap, void *); + s = conv_p2(ui_num, 4, 'x', + &num_buf[NUM_BUF_SIZE], &s_len); + } +#endif + else { + s = "%p"; + s_len = 2; + prefix_char = NUL; + } + pad_char = ' '; + break; + + /* print an apr_sockaddr_t as a.b.c.d:port */ + case 'I': + { + apr_sockaddr_t *sa; + + sa = va_arg(ap, apr_sockaddr_t *); + if (sa != NULL) { + s = conv_apr_sockaddr(sa, &num_buf[NUM_BUF_SIZE], &s_len); + if (adjust_precision && precision < s_len) + s_len = precision; + } + else { + s = S_NULL; + s_len = S_NULL_LEN; + } + pad_char = ' '; + } + break; + + /* print a struct in_addr as a.b.c.d */ + case 'A': + { + struct in_addr *ia; + + ia = va_arg(ap, struct in_addr *); + if (ia != NULL) { + s = conv_in_addr(ia, &num_buf[NUM_BUF_SIZE], &s_len); + if (adjust_precision && precision < s_len) + s_len = precision; + } + else { + s = S_NULL; + s_len = S_NULL_LEN; + } + pad_char = ' '; + } + break; + + case 'T': +#if APR_HAS_THREADS + { + apr_os_thread_t *tid; + + tid = va_arg(ap, apr_os_thread_t *); + if (tid != NULL) { + s = conv_os_thread_t(tid, &num_buf[NUM_BUF_SIZE], &s_len); + if (adjust_precision && precision < s_len) + s_len = precision; + } + else { + s = S_NULL; + s_len = S_NULL_LEN; + } + pad_char = ' '; + } +#else + char_buf[0] = '0'; + s = &char_buf[0]; + s_len = 1; + pad_char = ' '; +#endif + break; + + case NUL: + /* if %p ends the string, oh well ignore it */ + continue; + + default: + s = "bogus %p"; + s_len = 8; + prefix_char = NUL; + (void)va_arg(ap, void *); /* skip the bogus argument on the stack */ + break; + } + break; + + case NUL: + /* + * The last character of the format string was %. + * We ignore it. + */ + continue; + + + /* + * The default case is for unrecognized %'s. + * We print % to help the user identify what + * option is not understood. + * This is also useful in case the user wants to pass + * the output of format_converter to another function + * that understands some other % (like syslog). + * Note that we can't point s inside fmt because the + * unknown could be preceded by width etc. + */ + default: + char_buf[0] = '%'; + char_buf[1] = *fmt; + s = char_buf; + s_len = 2; + pad_char = ' '; + break; + } + + if (prefix_char != NUL && s != S_NULL && s != char_buf) { + *--s = prefix_char; + s_len++; + } + + if (adjust_width && adjust == RIGHT && min_width > s_len) { + if (pad_char == '0' && prefix_char != NUL) { + INS_CHAR(*s, sp, bep, cc); + s++; + s_len--; + min_width--; + } + PAD(min_width, s_len, pad_char); + } + + /* + * Print the string s. + */ + if (print_something == YES) { + for (i = s_len; i != 0; i--) { + INS_CHAR(*s, sp, bep, cc); + s++; + } + } + + if (adjust_width && adjust == LEFT && min_width > s_len) + PAD(min_width, s_len, pad_char); + } + fmt++; + } + vbuff->curpos = sp; + + return cc; +} + + +static int snprintf_flush(apr_vformatter_buff_t *vbuff) +{ + /* if the buffer fills we have to abort immediately, there is no way + * to "flush" an apr_snprintf... there's nowhere to flush it to. + */ + return -1; +} + + +APR_DECLARE_NONSTD(int) apr_snprintf(char *buf, apr_size_t len, + const char *format, ...) +{ + int cc; + va_list ap; + apr_vformatter_buff_t vbuff; + + if (len == 0) { + /* NOTE: This is a special case; we just want to return the number + * of chars that would be written (minus \0) if the buffer + * size was infinite. We leverage the fact that INS_CHAR + * just does actual inserts iff the buffer pointer is non-NULL. + * In this case, we don't care what buf is; it can be NULL, since + * we don't touch it at all. + */ + vbuff.curpos = NULL; + vbuff.endpos = NULL; + } else { + /* save one byte for nul terminator */ + vbuff.curpos = buf; + vbuff.endpos = buf + len - 1; + } + va_start(ap, format); + cc = apr_vformatter(snprintf_flush, &vbuff, format, ap); + va_end(ap); + if (len != 0) { + *vbuff.curpos = '\0'; + } + return (cc == -1) ? (int)len : cc; +} + + +APR_DECLARE(int) apr_vsnprintf(char *buf, apr_size_t len, const char *format, + va_list ap) +{ + int cc; + apr_vformatter_buff_t vbuff; + + if (len == 0) { + /* See above note */ + vbuff.curpos = NULL; + vbuff.endpos = NULL; + } else { + /* save one byte for nul terminator */ + vbuff.curpos = buf; + vbuff.endpos = buf + len - 1; + } + cc = apr_vformatter(snprintf_flush, &vbuff, format, ap); + if (len != 0) { + *vbuff.curpos = '\0'; + } + return (cc == -1) ? (int)len : cc; +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_snprintf.lo b/rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_snprintf.lo new file mode 100644 index 00000000..24aa0fc0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_snprintf.lo @@ -0,0 +1,12 @@ +# apr_snprintf.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/apr_snprintf.o' + +# Name of the non-PIC object. +non_pic_object='apr_snprintf.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_snprintf.o b/rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_snprintf.o new file mode 100644 index 0000000000000000000000000000000000000000..82b10d9c39efe3d7ea99a09686cb6c85c57ccd18 GIT binary patch literal 84056 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_strings.c b/rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_strings.c new file mode 100644 index 00000000..1927c515 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_strings.c @@ -0,0 +1,458 @@ +/* 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. + */ +/* + * Copyright (c) 1990, 1993 + * The Regents of the University of California. 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. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University 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 REGENTS 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 REGENTS 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. + */ + +#include "apr.h" +#include "apr_strings.h" +#include "apr_general.h" +#include "apr_private.h" +#include "apr_lib.h" +#define APR_WANT_STDIO +#define APR_WANT_STRFUNC +#include "apr_want.h" + +#ifdef HAVE_STDDEF_H +#include /* NULL */ +#endif + +#ifdef HAVE_STDLIB_H +#include /* strtol and strtoll */ +#endif + +/** this is used to cache lengths in apr_pstrcat */ +#define MAX_SAVED_LENGTHS 6 + +APR_DECLARE(char *) apr_pstrdup(apr_pool_t *a, const char *s) +{ + char *res; + apr_size_t len; + + if (s == NULL) { + return NULL; + } + len = strlen(s) + 1; + res = apr_palloc(a, len); + memcpy(res, s, len); + return res; +} + +APR_DECLARE(char *) apr_pstrndup(apr_pool_t *a, const char *s, apr_size_t n) +{ + char *res; + const char *end; + + if (s == NULL) { + return NULL; + } + end = memchr(s, '\0', n); + if (end != NULL) + n = end - s; + res = apr_palloc(a, n + 1); + memcpy(res, s, n); + res[n] = '\0'; + return res; +} + +APR_DECLARE(char *) apr_pstrmemdup(apr_pool_t *a, const char *s, apr_size_t n) +{ + char *res; + + if (s == NULL) { + return NULL; + } + res = apr_palloc(a, n + 1); + memcpy(res, s, n); + res[n] = '\0'; + return res; +} + +APR_DECLARE(void *) apr_pmemdup(apr_pool_t *a, const void *m, apr_size_t n) +{ + void *res; + + if (m == NULL) + return NULL; + res = apr_palloc(a, n); + memcpy(res, m, n); + return res; +} + +APR_DECLARE_NONSTD(char *) apr_pstrcat(apr_pool_t *a, ...) +{ + char *cp, *argp, *res; + apr_size_t saved_lengths[MAX_SAVED_LENGTHS]; + int nargs = 0; + + /* Pass one --- find length of required string */ + + apr_size_t len = 0; + va_list adummy; + + va_start(adummy, a); + + while ((cp = va_arg(adummy, char *)) != NULL) { + apr_size_t cplen = strlen(cp); + if (nargs < MAX_SAVED_LENGTHS) { + saved_lengths[nargs++] = cplen; + } + len += cplen; + } + + va_end(adummy); + + /* Allocate the required string */ + + res = (char *) apr_palloc(a, len + 1); + cp = res; + + /* Pass two --- copy the argument strings into the result space */ + + va_start(adummy, a); + + nargs = 0; + while ((argp = va_arg(adummy, char *)) != NULL) { + if (nargs < MAX_SAVED_LENGTHS) { + len = saved_lengths[nargs++]; + } + else { + len = strlen(argp); + } + + memcpy(cp, argp, len); + cp += len; + } + + va_end(adummy); + + /* Return the result string */ + + *cp = '\0'; + + return res; +} + +APR_DECLARE(char *) apr_pstrcatv(apr_pool_t *a, const struct iovec *vec, + apr_size_t nvec, apr_size_t *nbytes) +{ + apr_size_t i; + apr_size_t len; + const struct iovec *src; + char *res; + char *dst; + + /* Pass one --- find length of required string */ + len = 0; + src = vec; + for (i = nvec; i; i--) { + len += src->iov_len; + src++; + } + if (nbytes) { + *nbytes = len; + } + + /* Allocate the required string */ + res = (char *) apr_palloc(a, len + 1); + + /* Pass two --- copy the argument strings into the result space */ + src = vec; + dst = res; + for (i = nvec; i; i--) { + memcpy(dst, src->iov_base, src->iov_len); + dst += src->iov_len; + src++; + } + + /* Return the result string */ + *dst = '\0'; + + return res; +} + +#if (!APR_HAVE_MEMCHR) +void *memchr(const void *s, int c, size_t n) +{ + const char *cp; + + for (cp = s; n > 0; n--, cp++) { + if (*cp == c) + return (char *) cp; /* Casting away the const here */ + } + + return NULL; +} +#endif + +#ifndef INT64_MAX +#define INT64_MAX APR_INT64_C(0x7fffffffffffffff) +#endif +#ifndef INT64_MIN +#define INT64_MIN (-APR_INT64_C(0x7fffffffffffffff) - APR_INT64_C(1)) +#endif + +APR_DECLARE(apr_int64_t) apr_strtoi64(const char *nptr, char **endptr, int base) +{ +#if (APR_HAVE_INT64_STRFN) + return APR_INT64_STRFN(nptr, endptr, base); +#else + const char *s; + apr_int64_t acc; + apr_int64_t val; + int neg, any; + char c; + + /* + * Skip white space and pick up leading +/- sign if any. + * If base is 0, allow 0x for hex and 0 for octal, else + * assume decimal; if base is already 16, allow 0x. + */ + s = nptr; + do { + c = *s++; + } while (apr_isspace(c)); + if (c == '-') { + neg = 1; + c = *s++; + } else { + neg = 0; + if (c == '+') + c = *s++; + } + if ((base == 0 || base == 16) && + c == '0' && (*s == 'x' || *s == 'X')) { + c = s[1]; + s += 2; + base = 16; + } + if (base == 0) + base = c == '0' ? 8 : 10; + acc = any = 0; + if (base < 2 || base > 36) { + errno = EINVAL; + if (endptr != NULL) + *endptr = (char *)(any ? s - 1 : nptr); + return acc; + } + + /* The classic bsd implementation requires div/mod operators + * to compute a cutoff. Benchmarking proves that is very, very + * evil to some 32 bit processors. Instead, look for underflow + * in both the mult and add/sub operation. Unlike the bsd impl, + * we also work strictly in a signed int64 word as we haven't + * implemented the unsigned type in win32. + * + * Set 'any' if any `digits' consumed; make it negative to indicate + * overflow. + */ + val = 0; + for ( ; ; c = *s++) { + if (c >= '0' && c <= '9') + c -= '0'; +#if (('Z' - 'A') == 25) + else if (c >= 'A' && c <= 'Z') + c -= 'A' - 10; + else if (c >= 'a' && c <= 'z') + c -= 'a' - 10; +#elif APR_CHARSET_EBCDIC + else if (c >= 'A' && c <= 'I') + c -= 'A' - 10; + else if (c >= 'J' && c <= 'R') + c -= 'J' - 19; + else if (c >= 'S' && c <= 'Z') + c -= 'S' - 28; + else if (c >= 'a' && c <= 'i') + c -= 'a' - 10; + else if (c >= 'j' && c <= 'r') + c -= 'j' - 19; + else if (c >= 's' && c <= 'z') + c -= 'z' - 28; +#else +#error "CANNOT COMPILE apr_strtoi64(), only ASCII and EBCDIC supported" +#endif + else + break; + if (c >= base) + break; + val *= base; + if ( (any < 0) /* already noted an over/under flow - short circuit */ + || (neg && (val > acc || (val -= c) > acc)) /* underflow */ + || (!neg && (val < acc || (val += c) < acc))) { /* overflow */ + any = -1; /* once noted, over/underflows never go away */ +#ifdef APR_STRTOI64_OVERFLOW_IS_BAD_CHAR + break; +#endif + } else { + acc = val; + any = 1; + } + } + + if (any < 0) { + acc = neg ? INT64_MIN : INT64_MAX; + errno = ERANGE; + } else if (!any) { + errno = EINVAL; + } + if (endptr != NULL) + *endptr = (char *)(any ? s - 1 : nptr); + return (acc); +#endif +} + +APR_DECLARE(apr_int64_t) apr_atoi64(const char *buf) +{ + return apr_strtoi64(buf, NULL, 10); +} + +APR_DECLARE(char *) apr_itoa(apr_pool_t *p, int n) +{ + const int BUFFER_SIZE = sizeof(int) * 3 + 2; + char *buf = apr_palloc(p, BUFFER_SIZE); + char *start = buf + BUFFER_SIZE - 1; + int negative; + if (n < 0) { + negative = 1; + n = -n; + } + else { + negative = 0; + } + *start = 0; + do { + *--start = '0' + (n % 10); + n /= 10; + } while (n); + if (negative) { + *--start = '-'; + } + return start; +} + +APR_DECLARE(char *) apr_ltoa(apr_pool_t *p, long n) +{ + const int BUFFER_SIZE = sizeof(long) * 3 + 2; + char *buf = apr_palloc(p, BUFFER_SIZE); + char *start = buf + BUFFER_SIZE - 1; + int negative; + if (n < 0) { + negative = 1; + n = -n; + } + else { + negative = 0; + } + *start = 0; + do { + *--start = (char)('0' + (n % 10)); + n /= 10; + } while (n); + if (negative) { + *--start = '-'; + } + return start; +} + +APR_DECLARE(char *) apr_off_t_toa(apr_pool_t *p, apr_off_t n) +{ + const int BUFFER_SIZE = sizeof(apr_off_t) * 3 + 2; + char *buf = apr_palloc(p, BUFFER_SIZE); + char *start = buf + BUFFER_SIZE - 1; + int negative; + if (n < 0) { + negative = 1; + n = -n; + } + else { + negative = 0; + } + *start = 0; + do { + *--start = '0' + (char)(n % 10); + n /= 10; + } while (n); + if (negative) { + *--start = '-'; + } + return start; +} + +APR_DECLARE(char *) apr_strfsize(apr_off_t size, char *buf) +{ + const char ord[] = "KMGTPE"; + const char *o = ord; + int remain; + + if (size < 0) { + return strcpy(buf, " - "); + } + if (size < 973) { + if (apr_snprintf(buf, 5, "%3d ", (int) size) < 0) + return strcpy(buf, "****"); + return buf; + } + do { + remain = (int)(size & 1023); + size >>= 10; + if (size >= 973) { + ++o; + continue; + } + if (size < 9 || (size == 9 && remain < 973)) { + if ((remain = ((remain * 5) + 256) / 512) >= 10) + ++size, remain = 0; + if (apr_snprintf(buf, 5, "%d.%d%c", (int) size, remain, *o) < 0) + return strcpy(buf, "****"); + return buf; + } + if (remain >= 512) + ++size; + if (apr_snprintf(buf, 5, "%3d%c", (int) size, *o) < 0) + return strcpy(buf, "****"); + return buf; + } while (1); +} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_strings.lo b/rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_strings.lo new file mode 100644 index 00000000..4314698b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_strings.lo @@ -0,0 +1,12 @@ +# apr_strings.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/apr_strings.o' + +# Name of the non-PIC object. +non_pic_object='apr_strings.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_strings.o b/rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_strings.o new file mode 100644 index 0000000000000000000000000000000000000000..720cd4115c4b03ba892e9d48fa12ab43ede37ba5 GIT binary patch literal 23616 zcmd5^dwf*Ywcck=5{3jq1jK+31`P;GCJBj%2$EoeCmJ;&2_g^2Niqp3c{vXrJ^%@^ zj*xk+~+Os^a^d_cS%qgf12InzN_Mg5?-N{d+@@< z_{E=h?7F<%?%iJS*XwK?=k&ZDom!bJL`*wdke)m5-Q}*x zafuFLc%a9zs{;L{V}&ETgkGDqy`vm(K7!@7&)NO)90#0mrtERR4ae$pq$7~>o5#XB ziv2FNE3keX<;d3m5BorcIm-dB7R$E$Vxs8YfuK@n_QVF1hrgx@JJr`pfe& z#E6^6!nis&9)H0WV#L?pl}$czc7KxT-1rG%Yw~b%#NU)qcb`S@h_5{+OQM z?-~0nDE$|viGwrc{4DR?@N3+#%XWV}w507lE zmzcN7DIQH3*cU5@jVNdFlg(R{p9dBkKYm>D$3H3RlQag&>R%k_0-G(*WcYmfzW#aO z(0An=o><)E6BC>K6PqSB3Q*wlMwsAf7>4l5Q;YnNI(?jwk_D7E~31G)P+zV%zjT%uU!5pX@Lv zV+oBY|g(#D7P)dpPtxqY_tswOClo$b=BI|B7s9E=8kSdkmM3LkNFkCf|S>MKJb8z$k%kX{` z#&8(UAat8%NQM_jQ=-=}Itpx8f|7Fr*a}Y}#$taDfRPEEL~KJMPFpbwKdeJI=dCxm z&N^g6&(h2~dFGg83iA{46v&A614U~PK~+MO7L>KoA% z%83zBWIIsCghQZS#7)Pvg*t@gyd@2VIB69)%SC1#6zlRI17+@gRF!)>3pbN6mRtOO zxDey4I!^>XYdk9eKAEfDhpOKI%{Z$bs)cTn4!t0Dy=;h0RB*NIArjOPi?!`_*rPDG zT6b`@9NdWzOD)HuBCThhF`2NCrF4Mv64bygu} zWALCOFitAyCUzF%ouz}`4!bo5-Q*6si6glm)VWx}O|1Z!I(ELV)-8XZGBD7bF0U<}s`j3L52sbg4m5fFZv7!q@Guox1P?|Sz* zETv^+ZF>~98I0k2j^UIsja|Z8!`7!_C<#?fKwW#9tX+#F_N|B4DC2c<@k5PTh#NQu z%D86*^ljg|Z_RjYizQbb#8hBW47YF-A5{rlYGQ(WC1Z{Ct<})x%V%s2wAHH^SL$mwNC6inZ;BaH7Y|{)jVs;)+lssEA`Z z9Y3rebEu^5q}nm9!ul!KsYL!vtC27eJUk+uhK?q=r~CTJWxMrrQ^7y2P4{-DXafUTCKVaY1fu z)=cO}^&gN|AKZV7?%xmBXOm!|1S}rjNwD4n^4yL_Q}DwITA#xq`z+~bgQhxLRyIoA znm<))O}eR`dUPJ4gw(E&QEfIJJJ)dK_#$w_bf#r?9@KCz=|uN3BYk4>MB?y6;Q9XAw2t@1FK{xQ@ZvtwCwzs zEw_G=rH{f8YjNGnt4Pd+-1#y@Cg!jRO@=*;SEWk)E{f9-#S<<0-NDI>hD4 zbNFU?J&e=4Sgu`(!UHNa#!HQ2TvNqzyE_M44Zj*|aIa8Qc!DXG7p1Z~`|+y)z}O{S zFMp<@tRu)!Upn8XE+ZkXsl$xfaY33w> zhpbUxG7HxGFw3eOg^h+!fQkYz&!*O3j;%*<$8hOB2|PZ*Z_OF2Tsd=Wip4?mK!b$yPhOysM@GO5SFjD%k-Dxfrs>f#m$;csS?SrO5F;2j4 z=UeqBakr-@VnmWN{N$DnBTx1F^|@owqlr4;bj;L%fG1JFkYuDf(-k3{$|hrcr$F+j zke^_N>RFT*YISy^)&o&Yb*aFaPu`NT-_;h33*0?o;Dy*HEGHs?c{OJ&PLOFT3XGrx z05mO5mvg9OV0^0X91Uh+69rE93!F1&jztEX_Eh9u7|52WXHj3{iX|+bN7iWqE|0gf zR!%6iB`N7JMw`^JC|51OmZ)Ws36Z`o1%0i_i>m-ju{r=(HA(uw8z_fhi3Pfj1ZMeC zCP}_<&rQS%*&;_91>^�LX<&Dd@pHPPdKUji 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_strnatcmp.c b/rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_strnatcmp.c new file mode 100644 index 00000000..0e960e8a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_strnatcmp.c @@ -0,0 +1,149 @@ +/* -*- mode: c; c-file-style: "k&r" -*- + + strnatcmp.c -- Perform 'natural order' comparisons of strings in C. + Copyright (C) 2000 by Martin Pool + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. +*/ + +#include +#include +#include "apr_strings.h" +#include "apr_lib.h" /* for apr_is*() */ + +#if defined(__GNUC__) +# define UNUSED __attribute__((__unused__)) +#else +# define UNUSED +#endif + +/* based on "strnatcmp.c,v 1.6 2000/04/20 07:30:11 mbp Exp $" */ + +static int +compare_right(char const *a, char const *b) +{ + int bias = 0; + + /* The longest run of digits wins. That aside, the greatest + value wins, but we can't know that it will until we've scanned + both numbers to know that they have the same magnitude, so we + remember it in BIAS. */ + for (;; a++, b++) { + if (!apr_isdigit(*a) && !apr_isdigit(*b)) + break; + else if (!apr_isdigit(*a)) + return -1; + else if (!apr_isdigit(*b)) + return +1; + else if (*a < *b) { + if (!bias) + bias = -1; + } else if (*a > *b) { + if (!bias) + bias = +1; + } else if (!*a && !*b) + break; + } + + return bias; +} + + +static int +compare_left(char const *a, char const *b) +{ + /* Compare two left-aligned numbers: the first to have a + different value wins. */ + for (;; a++, b++) { + if (!apr_isdigit(*a) && !apr_isdigit(*b)) + break; + else if (!apr_isdigit(*a)) + return -1; + else if (!apr_isdigit(*b)) + return +1; + else if (*a < *b) + return -1; + else if (*a > *b) + return +1; + } + + return 0; +} + + +static int strnatcmp0(char const *a, char const *b, int fold_case) +{ + int ai, bi; + char ca, cb; + int fractional, result; + ai = bi = 0; + while (1) { + ca = a[ai]; cb = b[bi]; + + /* skip over leading spaces or zeros */ + while (apr_isspace(ca)) + ca = a[++ai]; + + while (apr_isspace(cb)) + cb = b[++bi]; + + /* process run of digits */ + if (apr_isdigit(ca) && apr_isdigit(cb)) { + fractional = (ca == '0' || cb == '0'); + + if (fractional) { + if ((result = compare_left(a+ai, b+bi)) != 0) + return result; + } else { + if ((result = compare_right(a+ai, b+bi)) != 0) + return result; + } + } + + if (!ca && !cb) { + /* The strings compare the same. Perhaps the caller + will want to call strcmp to break the tie. */ + return 0; + } + + if (fold_case) { + ca = apr_toupper(ca); + cb = apr_toupper(cb); + } + + if (ca < cb) + return -1; + else if (ca > cb) + return +1; + + ++ai; ++bi; + } +} + + + +APR_DECLARE(int) apr_strnatcmp(char const *a, char const *b) +{ + return strnatcmp0(a, b, 0); +} + + +/* Compare, recognizing numeric string and ignoring case. */ +APR_DECLARE(int) apr_strnatcasecmp(char const *a, char const *b) +{ + return strnatcmp0(a, b, 1); +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_strnatcmp.lo b/rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_strnatcmp.lo new file mode 100644 index 00000000..1ac1ef2b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_strnatcmp.lo @@ -0,0 +1,12 @@ +# apr_strnatcmp.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/apr_strnatcmp.o' + +# Name of the non-PIC object. +non_pic_object='apr_strnatcmp.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_strnatcmp.o b/rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_strnatcmp.o new file mode 100644 index 0000000000000000000000000000000000000000..bad4e5c790b54f9b1332e757018dfe8ead13d5e8 GIT binary patch literal 8920 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 D8|CBB literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_strtok.c b/rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_strtok.c new file mode 100644 index 00000000..517b319d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_strtok.c @@ -0,0 +1,56 @@ +/* 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. + */ + +#ifdef HAVE_STDDEF_H +#include /* for NULL */ +#endif + +#include "apr.h" +#include "apr_strings.h" + +#define APR_WANT_STRFUNC /* for strchr() */ +#include "apr_want.h" + +APR_DECLARE(char *) apr_strtok(char *str, const char *sep, char **last) +{ + char *token; + + if (!str) /* subsequent call */ + str = *last; /* start where we left off */ + + /* skip characters in sep (will terminate at '\0') */ + while (*str && strchr(sep, *str)) + ++str; + + if (!*str) /* no more tokens */ + return NULL; + + token = str; + + /* skip valid token characters to terminate token and + * prepare for the next call (will terminate at '\0) + */ + *last = token + 1; + while (**last && !strchr(sep, **last)) + ++*last; + + if (**last) { + **last = '\0'; + ++*last; + } + + return token; +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_strtok.lo b/rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_strtok.lo new file mode 100644 index 00000000..d601db21 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_strtok.lo @@ -0,0 +1,12 @@ +# apr_strtok.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/apr_strtok.o' + +# Name of the non-PIC object. +non_pic_object='apr_strtok.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_strtok.o b/rubbos/app/httpd-2.0.64/srclib/apr/strings/apr_strtok.o new file mode 100644 index 0000000000000000000000000000000000000000..2a4831014f27005f8679fd824743ba9c4a375fa9 GIT binary patch literal 4832 zcmbtYYiJx*6ux(7lT5R9HV?&wR60J}s=G-_i1pE$q>0^?qODD;(uTOZnIua$vvGG; zqWFkSt;SkV6!eE8g5u+sAc!JLrL|O0e+c3q{}cpU>yJuR1eJKsz30sA&aNPOVdtLn zo$oyEYaaX9*v{J`QVMQTY!iXTs1P5Rfjp$dA#sW55W^Gcm2ZZ}(<{GBq*ngglUn}C zOg*t$S$Fm|AjQ{<_$TLguKaKYJyK5`^X$~}XEOf&m^gH-@_qlY)ba^)-{kQA;mPCi z^-D-vdPE5COzP;QOs`A|U`k+ipG(EpA40Q8EgvU~ap;)W9}0hZ>1N@rJ86jY@|ch+ zdTQm2PB0T+KZ^b*On@k9>d3Wc-PP6A8)3*%72i~YubY9B%BU|9spcXQX+b>_)t#w3 z*{r}w6Lv?LDe$Hhr8&f;x;p#3azy-{&Nj=##)Ran?cd-ftluHdWD6zKM9d}IF+wFnmmgIn) znD;8Kvvt;Sol-srY6gOBUEDI57zE?2ow#$eotPJ$3eb90%J zP#1q7<+)ED z=R9v=I5sdil^@LN2z+p0zFJv#`?p0bfTpwNFN@wxf|TtLqtK)UpppN3D&^O`}#{ zvDMl*Y}vzB7Z64)GZl;M($FYFJ7S}NfR|4ijtP-0KREAYve3hBQvDoDC8v-{dd{LJ zlG7P4Ba+#2StJ!Y?PM#nQ+ao$2sR~Wve}aJ0BeO}u7;T@W!zb(*1M2*9p*zyk<1n6 z=N(vrqzen3gl&>g3r~TZxv7~_X5OL6_@A8({xH4zIa?KLh~)5@Y^&m+*aJWP#!zc` zDX#TCg5iOr^6-g=hmva75N?ppT{9NdpoL+)mtf5Q>OTm+;h30~^KT6qL#n{LQls&o zqVaz~_a7X86a2#C9|0^J6Ckmj{Enki)xz9eU<+eNZ>9;E@$Y{+NSJ#cz+nuT1uPaC zub&Z{)!IcU&GuYSQ_Pjm-6#I!~Af{>+&xF zhB3KL5LIh$*8Pr9LRPsy0<=c{_q1sLYjx*e*^m1d$loWBaFG1NIQubzkogq!!0D>ZqC@ety75hG-Zicsqg@ zxIp3es|^$$_cvDeCw!%1JNyqg9b3@~c9xO4miUO{FH1V^Uu=v|XcfNcbz?kE8wbaM z4b|#1w@INo4(>^Ad|%->`~`6X5g7lLbb4*|>%sdLwlUrL_!iQ4hVUOr-xI=rBRvzs zzao7ug!A){@4sB<=fs1rWYrkQ`v|sW-T8HrDxMGFx0C(~_2K#CPZW$_eHy;3ii7xD zq<>w7qYv&wY~Sfl)r0(dX&p~j;mGGLd#(ycek(2VdBVBQ>qyuClLY(WX~M6hJQy2) j8wlSN!fnENuOheluE1x8^Aa8Yozg9g+k|7;)%){rO-jvf literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/support/unix/.libs/waitio.o b/rubbos/app/httpd-2.0.64/srclib/apr/support/unix/.libs/waitio.o new file mode 100644 index 0000000000000000000000000000000000000000..6ead1cd29076d6ae96d1240f517c5d91db44606b GIT binary patch literal 12128 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/support/unix/Makefile b/rubbos/app/httpd-2.0.64/srclib/apr/support/unix/Makefile new file mode 100644 index 00000000..45df847a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/support/unix/Makefile @@ -0,0 +1,15 @@ +srcdir = . + + +TARGETS = \ + waitio.lo + +# bring in rules.mk for standard functionality +include /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/build/apr_rules.mk + +INCDIR=../../include +OSDIR=$(INCDIR)/arch/unix +DEFOSDIR=$(INCDIR)/arch/unix +INCLUDES=-I$(INCDIR) -I$(OSDIR) -I$(DEFOSDIR) + +# DO NOT REMOVE diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/support/unix/Makefile.in b/rubbos/app/httpd-2.0.64/srclib/apr/support/unix/Makefile.in new file mode 100644 index 00000000..190cacfc --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/support/unix/Makefile.in @@ -0,0 +1,15 @@ +srcdir = @srcdir@ +VPATH = @srcdir@ + +TARGETS = \ + waitio.lo + +# bring in rules.mk for standard functionality +@INCLUDE_RULES@ + +INCDIR=../../include +OSDIR=$(INCDIR)/arch/@OSDIR@ +DEFOSDIR=$(INCDIR)/arch/@DEFAULT_OSDIR@ +INCLUDES=-I$(INCDIR) -I$(OSDIR) -I$(DEFOSDIR) + +# DO NOT REMOVE diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/support/unix/waitio.c b/rubbos/app/httpd-2.0.64/srclib/apr/support/unix/waitio.c new file mode 100644 index 00000000..774e923e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/support/unix/waitio.c @@ -0,0 +1,64 @@ +/* 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. + */ + +#include "apr_arch_file_io.h" +#include "apr_arch_networkio.h" +#include "apr_poll.h" +#include "apr_errno.h" +#include "apr_support.h" + +/* The only case where we don't use wait_for_io_or_timeout is on + * pre-BONE BeOS, so this check should be sufficient and simpler */ +#if !BEOS_R5 +#define USE_WAIT_FOR_IO +#endif + +#ifdef USE_WAIT_FOR_IO +apr_status_t apr_wait_for_io_or_timeout(apr_file_t *f, apr_socket_t *s, + int for_read) +{ + apr_interval_time_t timeout; + apr_pollfd_t pollset; + int srv, n; + int type = for_read ? APR_POLLIN : APR_POLLOUT; + + /* TODO - timeout should be less each time through this loop */ + if (f) { + pollset.desc_type = APR_POLL_FILE; + pollset.desc.f = f; + pollset.p = f->pool; + timeout = f->timeout; + } + else { + pollset.desc_type = APR_POLL_SOCKET; + pollset.desc.s = s; + pollset.p = s->cntxt; + timeout = s->timeout; + } + pollset.reqevents = type; + + do { + srv = apr_poll(&pollset, 1, &n, timeout); + + if (n == 1 && pollset.rtnevents & type) { + return APR_SUCCESS; + } + } while (APR_STATUS_IS_EINTR(srv)); + + return srv; +} +#endif + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/support/unix/waitio.lo b/rubbos/app/httpd-2.0.64/srclib/apr/support/unix/waitio.lo new file mode 100644 index 00000000..2d94669b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/support/unix/waitio.lo @@ -0,0 +1,12 @@ +# waitio.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/waitio.o' + +# Name of the non-PIC object. +non_pic_object='waitio.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/support/unix/waitio.o b/rubbos/app/httpd-2.0.64/srclib/apr/support/unix/waitio.o new file mode 100644 index 0000000000000000000000000000000000000000..8e28ef25f72afed231825808ee2574a003adb0ed GIT binary patch literal 12040 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/tables/.libs/apr_hash.o b/rubbos/app/httpd-2.0.64/srclib/apr/tables/.libs/apr_hash.o new file mode 100644 index 0000000000000000000000000000000000000000..c7bf7e5121eea8fa8d2e9315862bb362426da75b GIT binary patch literal 19424 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/tables/.libs/apr_tables.o b/rubbos/app/httpd-2.0.64/srclib/apr/tables/.libs/apr_tables.o new file mode 100644 index 0000000000000000000000000000000000000000..e6d0baf4a47709da1d63d324f59d3fd702030dd0 GIT binary patch literal 68512 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 +#endif +#if APR_HAVE_STRING_H +#include +#endif + + +/* + * The internal form of a hash table. + * + * The table is an array indexed by the hash of the key; collisions + * are resolved by hanging a linked list of hash entries off each + * element of the array. Although this is a really simple design it + * isn't too bad given that pools have a low allocation overhead. + */ + +typedef struct apr_hash_entry_t apr_hash_entry_t; + +struct apr_hash_entry_t { + apr_hash_entry_t *next; + unsigned int hash; + const void *key; + apr_ssize_t klen; + const void *val; +}; + +/* + * Data structure for iterating through a hash table. + * + * We keep a pointer to the next hash entry here to allow the current + * hash entry to be freed or otherwise mangled between calls to + * apr_hash_next(). + */ +struct apr_hash_index_t { + apr_hash_t *ht; + apr_hash_entry_t *this, *next; + unsigned int index; +}; + +/* + * The size of the array is always a power of two. We use the maximum + * index rather than the size so that we can use bitwise-AND for + * modular arithmetic. + * The count of hash entries may be greater depending on the chosen + * collision rate. + */ +struct apr_hash_t { + apr_pool_t *pool; + apr_hash_entry_t **array; + apr_hash_index_t iterator; /* For apr_hash_first(NULL, ...) */ + unsigned int count, max; + apr_hash_entry_t *free; /* List of recycled entries */ +}; + +#define INITIAL_MAX 15 /* tunable == 2^n - 1 */ + + +/* + * Hash creation functions. + */ + +static apr_hash_entry_t **alloc_array(apr_hash_t *ht, unsigned int max) +{ + return apr_pcalloc(ht->pool, sizeof(*ht->array) * (max + 1)); +} + +APR_DECLARE(apr_hash_t *) apr_hash_make(apr_pool_t *pool) +{ + apr_hash_t *ht; + ht = apr_palloc(pool, sizeof(apr_hash_t)); + ht->pool = pool; + ht->free = NULL; + ht->count = 0; + ht->max = INITIAL_MAX; + ht->array = alloc_array(ht, ht->max); + return ht; +} + + +/* + * Hash iteration functions. + */ + +APR_DECLARE(apr_hash_index_t *) apr_hash_next(apr_hash_index_t *hi) +{ + hi->this = hi->next; + while (!hi->this) { + if (hi->index > hi->ht->max) + return NULL; + + hi->this = hi->ht->array[hi->index++]; + } + hi->next = hi->this->next; + return hi; +} + +APR_DECLARE(apr_hash_index_t *) apr_hash_first(apr_pool_t *p, apr_hash_t *ht) +{ + apr_hash_index_t *hi; + if (p) + hi = apr_palloc(p, sizeof(*hi)); + else + hi = &ht->iterator; + + hi->ht = ht; + hi->index = 0; + hi->this = NULL; + hi->next = NULL; + return apr_hash_next(hi); +} + +APR_DECLARE(void) apr_hash_this(apr_hash_index_t *hi, + const void **key, + apr_ssize_t *klen, + void **val) +{ + if (key) *key = hi->this->key; + if (klen) *klen = hi->this->klen; + if (val) *val = (void *)hi->this->val; +} + + +/* + * Expanding a hash table + */ + +static void expand_array(apr_hash_t *ht) +{ + apr_hash_index_t *hi; + apr_hash_entry_t **new_array; + unsigned int new_max; + + new_max = ht->max * 2 + 1; + new_array = alloc_array(ht, new_max); + for (hi = apr_hash_first(NULL, ht); hi; hi = apr_hash_next(hi)) { + unsigned int i = hi->this->hash & new_max; + hi->this->next = new_array[i]; + new_array[i] = hi->this; + } + ht->array = new_array; + ht->max = new_max; +} + +/* + * This is where we keep the details of the hash function and control + * the maximum collision rate. + * + * If val is non-NULL it creates and initializes a new hash entry if + * there isn't already one there; it returns an updatable pointer so + * that hash entries can be removed. + */ + +static apr_hash_entry_t **find_entry(apr_hash_t *ht, + const void *key, + apr_ssize_t klen, + const void *val) +{ + apr_hash_entry_t **hep, *he; + const unsigned char *p; + unsigned int hash; + apr_ssize_t i; + + /* + * This is the popular `times 33' hash algorithm which is used by + * perl and also appears in Berkeley DB. This is one of the best + * known hash functions for strings because it is both computed + * very fast and distributes very well. + * + * The originator may be Dan Bernstein but the code in Berkeley DB + * cites Chris Torek as the source. The best citation I have found + * is "Chris Torek, Hash function for text in C, Usenet message + * <27038@mimsy.umd.edu> in comp.lang.c , October, 1990." in Rich + * Salz's USENIX 1992 paper about INN which can be found at + * . + * + * The magic of number 33, i.e. why it works better than many other + * constants, prime or not, has never been adequately explained by + * anyone. So I try an explanation: if one experimentally tests all + * multipliers between 1 and 256 (as I did while writing a low-level + * data structure library some time ago) one detects that even + * numbers are not useable at all. The remaining 128 odd numbers + * (except for the number 1) work more or less all equally well. + * They all distribute in an acceptable way and this way fill a hash + * table with an average percent of approx. 86%. + * + * If one compares the chi^2 values of the variants (see + * Bob Jenkins ``Hashing Frequently Asked Questions'' at + * http://burtleburtle.net/bob/hash/hashfaq.html for a description + * of chi^2), the number 33 not even has the best value. But the + * number 33 and a few other equally good numbers like 17, 31, 63, + * 127 and 129 have nevertheless a great advantage to the remaining + * numbers in the large set of possible multipliers: their multiply + * operation can be replaced by a faster operation based on just one + * shift plus either a single addition or subtraction operation. And + * because a hash function has to both distribute good _and_ has to + * be very fast to compute, those few numbers should be preferred. + * + * -- Ralf S. Engelschall + */ + hash = 0; + if (klen == APR_HASH_KEY_STRING) { + for (p = key; *p; p++) { + hash = hash * 33 + *p; + } + klen = p - (const unsigned char *)key; + } + else { + for (p = key, i = klen; i; i--, p++) { + hash = hash * 33 + *p; + } + } + + /* scan linked list */ + for (hep = &ht->array[hash & ht->max], he = *hep; + he; hep = &he->next, he = *hep) { + if (he->hash == hash + && he->klen == klen + && memcmp(he->key, key, klen) == 0) + break; + } + if (he || !val) + return hep; + + /* add a new entry for non-NULL values */ + if ((he = ht->free) != NULL) + ht->free = he->next; + else + he = apr_palloc(ht->pool, sizeof(*he)); + he->next = NULL; + he->hash = hash; + he->key = key; + he->klen = klen; + he->val = val; + *hep = he; + ht->count++; + return hep; +} + +APR_DECLARE(apr_hash_t *) apr_hash_copy(apr_pool_t *pool, + const apr_hash_t *orig) +{ + apr_hash_t *ht; + apr_hash_entry_t *new_vals; + unsigned int i, j; + + ht = apr_palloc(pool, sizeof(apr_hash_t) + + sizeof(*ht->array) * (orig->max + 1) + + sizeof(apr_hash_entry_t) * orig->count); + ht->pool = pool; + ht->free = NULL; + ht->count = orig->count; + ht->max = orig->max; + ht->array = (apr_hash_entry_t **)((char *)ht + sizeof(apr_hash_t)); + + new_vals = (apr_hash_entry_t *)((char *)(ht) + sizeof(apr_hash_t) + + sizeof(*ht->array) * (orig->max + 1)); + j = 0; + for (i = 0; i <= ht->max; i++) { + apr_hash_entry_t **new_entry = &(ht->array[i]); + apr_hash_entry_t *orig_entry = orig->array[i]; + while (orig_entry) { + *new_entry = &new_vals[j++]; + (*new_entry)->hash = orig_entry->hash; + (*new_entry)->key = orig_entry->key; + (*new_entry)->klen = orig_entry->klen; + (*new_entry)->val = orig_entry->val; + new_entry = &((*new_entry)->next); + orig_entry = orig_entry->next; + } + *new_entry = NULL; + } + return ht; +} + +APR_DECLARE(void *) apr_hash_get(apr_hash_t *ht, + const void *key, + apr_ssize_t klen) +{ + apr_hash_entry_t *he; + he = *find_entry(ht, key, klen, NULL); + if (he) + return (void *)he->val; + else + return NULL; +} + +APR_DECLARE(void) apr_hash_set(apr_hash_t *ht, + const void *key, + apr_ssize_t klen, + const void *val) +{ + apr_hash_entry_t **hep; + hep = find_entry(ht, key, klen, val); + if (*hep) { + if (!val) { + /* delete entry */ + apr_hash_entry_t *old = *hep; + *hep = (*hep)->next; + old->next = ht->free; + ht->free = old; + --ht->count; + } + else { + /* replace entry */ + (*hep)->val = val; + /* check that the collision rate isn't too high */ + if (ht->count > ht->max) { + expand_array(ht); + } + } + } + /* else key not present and val==NULL */ +} + +APR_DECLARE(unsigned int) apr_hash_count(apr_hash_t *ht) +{ + return ht->count; +} + +APR_DECLARE(apr_hash_t*) apr_hash_overlay(apr_pool_t *p, + const apr_hash_t *overlay, + const apr_hash_t *base) +{ + return apr_hash_merge(p, overlay, base, NULL, NULL); +} + +APR_DECLARE(apr_hash_t *) apr_hash_merge(apr_pool_t *p, + const apr_hash_t *overlay, + const apr_hash_t *base, + void * (*merger)(apr_pool_t *p, + const void *key, + apr_ssize_t klen, + const void *h1_val, + const void *h2_val, + const void *data), + const void *data) +{ + apr_hash_t *res; + apr_hash_entry_t *new_vals = NULL; + apr_hash_entry_t *iter; + apr_hash_entry_t *ent; + unsigned int i,j,k; + +#ifdef POOL_DEBUG + /* we don't copy keys and values, so it's necessary that + * overlay->a.pool and base->a.pool have a life span at least + * as long as p + */ + if (!apr_pool_is_ancestor(overlay->pool, p)) { + fprintf(stderr, + "apr_hash_overlay: overlay's pool is not an ancestor of p\n"); + abort(); + } + if (!apr_pool_is_ancestor(base->pool, p)) { + fprintf(stderr, + "apr_hash_overlay: base's pool is not an ancestor of p\n"); + abort(); + } +#endif + + res = apr_palloc(p, sizeof(apr_hash_t)); + res->pool = p; + res->free = NULL; + res->count = base->count; + res->max = (overlay->max > base->max) ? overlay->max : base->max; + if (base->count + overlay->count > res->max) { + res->max = res->max * 2 + 1; + } + res->array = alloc_array(res, res->max); + if (base->count + overlay->count) { + new_vals = apr_palloc(p, sizeof(apr_hash_entry_t) * + (base->count + overlay->count)); + } + j = 0; + for (k = 0; k <= base->max; k++) { + for (iter = base->array[k]; iter; iter = iter->next) { + i = iter->hash & res->max; + new_vals[j].klen = iter->klen; + new_vals[j].key = iter->key; + new_vals[j].val = iter->val; + new_vals[j].hash = iter->hash; + new_vals[j].next = res->array[i]; + res->array[i] = &new_vals[j]; + j++; + } + } + + for (k = 0; k <= overlay->max; k++) { + for (iter = overlay->array[k]; iter; iter = iter->next) { + i = iter->hash & res->max; + for (ent = res->array[i]; ent; ent = ent->next) { + if ((ent->klen == iter->klen) && + (memcmp(ent->key, iter->key, iter->klen) == 0)) { + if (merger) { + ent->val = (*merger)(p, iter->key, iter->klen, + iter->val, ent->val, data); + } + else { + ent->val = iter->val; + } + break; + } + } + if (!ent) { + new_vals[j].klen = iter->klen; + new_vals[j].key = iter->key; + new_vals[j].val = iter->val; + new_vals[j].hash = iter->hash; + new_vals[j].next = res->array[i]; + res->array[i] = &new_vals[j]; + res->count++; + j++; + } + } + } + return res; +} + +APR_POOL_IMPLEMENT_ACCESSOR(hash) diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/tables/apr_hash.lo b/rubbos/app/httpd-2.0.64/srclib/apr/tables/apr_hash.lo new file mode 100644 index 00000000..94e4a9c1 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/tables/apr_hash.lo @@ -0,0 +1,12 @@ +# apr_hash.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/apr_hash.o' + +# Name of the non-PIC object. +non_pic_object='apr_hash.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/tables/apr_hash.o b/rubbos/app/httpd-2.0.64/srclib/apr/tables/apr_hash.o new file mode 100644 index 0000000000000000000000000000000000000000..04bd19501af20cd8a1ee438440921df20899481a GIT binary patch literal 19368 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/tables/apr_tables.c b/rubbos/app/httpd-2.0.64/srclib/apr/tables/apr_tables.c new file mode 100644 index 00000000..3f1f2edd --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/tables/apr_tables.c @@ -0,0 +1,1207 @@ +#include +/* 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. + */ + +/* + * Resource allocation code... the code here is responsible for making + * sure that nothing leaks. + * + * rst --- 4/95 --- 6/95 + */ + +#include "apr_private.h" + +#include "apr_general.h" +#include "apr_pools.h" +#include "apr_tables.h" +#include "apr_strings.h" +#include "apr_lib.h" +#if APR_HAVE_STDLIB_H +#include +#endif +#if APR_HAVE_STRING_H +#include +#endif +#if APR_HAVE_STRINGS_H +#include +#endif + +/***************************************************************** + * This file contains array and apr_table_t functions only. + */ + +/***************************************************************** + * + * The 'array' functions... + */ + +static void make_array_core(apr_array_header_t *res, apr_pool_t *p, + int nelts, int elt_size, int clear) +{ + /* + * Assure sanity if someone asks for + * array of zero elts. + */ + if (nelts < 1) { + nelts = 1; + } + + if (clear) { + res->elts = apr_pcalloc(p, nelts * elt_size); + } + else { + res->elts = apr_palloc(p, nelts * elt_size); + } + + res->pool = p; + res->elt_size = elt_size; + res->nelts = 0; /* No active elements yet... */ + res->nalloc = nelts; /* ...but this many allocated */ +} + +APR_DECLARE(int) apr_is_empty_array(const apr_array_header_t *a) +{ + return ((a == NULL) || (a->nelts == 0)); +} + +APR_DECLARE(apr_array_header_t *) apr_array_make(apr_pool_t *p, + int nelts, int elt_size) +{ + apr_array_header_t *res; + + res = (apr_array_header_t *) apr_palloc(p, sizeof(apr_array_header_t)); + make_array_core(res, p, nelts, elt_size, 1); + return res; +} + +APR_DECLARE(void *) apr_array_pop(apr_array_header_t *arr) +{ + if (apr_is_empty_array(arr)) { + return NULL; + } + + return arr->elts + (arr->elt_size * (--arr->nelts)); +} + +APR_DECLARE(void *) apr_array_push(apr_array_header_t *arr) +{ + if (arr->nelts == arr->nalloc) { + int new_size = (arr->nalloc <= 0) ? 1 : arr->nalloc * 2; + char *new_data; + + new_data = apr_palloc(arr->pool, arr->elt_size * new_size); + + memcpy(new_data, arr->elts, arr->nalloc * arr->elt_size); + memset(new_data + arr->nalloc * arr->elt_size, 0, + arr->elt_size * (new_size - arr->nalloc)); + arr->elts = new_data; + arr->nalloc = new_size; + } + + ++arr->nelts; + return arr->elts + (arr->elt_size * (arr->nelts - 1)); +} + +static void *apr_array_push_noclear(apr_array_header_t *arr) +{ + if (arr->nelts == arr->nalloc) { + int new_size = (arr->nalloc <= 0) ? 1 : arr->nalloc * 2; + char *new_data; + + new_data = apr_palloc(arr->pool, arr->elt_size * new_size); + + memcpy(new_data, arr->elts, arr->nalloc * arr->elt_size); + arr->elts = new_data; + arr->nalloc = new_size; + } + + ++arr->nelts; + return arr->elts + (arr->elt_size * (arr->nelts - 1)); +} + +APR_DECLARE(void) apr_array_cat(apr_array_header_t *dst, + const apr_array_header_t *src) +{ + int elt_size = dst->elt_size; + + if (dst->nelts + src->nelts > dst->nalloc) { + int new_size = (dst->nalloc <= 0) ? 1 : dst->nalloc * 2; + char *new_data; + + while (dst->nelts + src->nelts > new_size) { + new_size *= 2; + } + + new_data = apr_pcalloc(dst->pool, elt_size * new_size); + memcpy(new_data, dst->elts, dst->nalloc * elt_size); + + dst->elts = new_data; + dst->nalloc = new_size; + } + + memcpy(dst->elts + dst->nelts * elt_size, src->elts, + elt_size * src->nelts); + dst->nelts += src->nelts; +} + +APR_DECLARE(apr_array_header_t *) apr_array_copy(apr_pool_t *p, + const apr_array_header_t *arr) +{ + apr_array_header_t *res = + (apr_array_header_t *) apr_palloc(p, sizeof(apr_array_header_t)); + make_array_core(res, p, arr->nalloc, arr->elt_size, 0); + + memcpy(res->elts, arr->elts, arr->elt_size * arr->nelts); + res->nelts = arr->nelts; + memset(res->elts + res->elt_size * res->nelts, 0, + res->elt_size * (res->nalloc - res->nelts)); + return res; +} + +/* This cute function copies the array header *only*, but arranges + * for the data section to be copied on the first push or arraycat. + * It's useful when the elements of the array being copied are + * read only, but new stuff *might* get added on the end; we have the + * overhead of the full copy only where it is really needed. + */ + +static APR_INLINE void copy_array_hdr_core(apr_array_header_t *res, + const apr_array_header_t *arr) +{ + res->elts = arr->elts; + res->elt_size = arr->elt_size; + res->nelts = arr->nelts; + res->nalloc = arr->nelts; /* Force overflow on push */ +} + +APR_DECLARE(apr_array_header_t *) + apr_array_copy_hdr(apr_pool_t *p, + const apr_array_header_t *arr) +{ + apr_array_header_t *res; + + res = (apr_array_header_t *) apr_palloc(p, sizeof(apr_array_header_t)); + res->pool = p; + copy_array_hdr_core(res, arr); + return res; +} + +/* The above is used here to avoid consing multiple new array bodies... */ + +APR_DECLARE(apr_array_header_t *) + apr_array_append(apr_pool_t *p, + const apr_array_header_t *first, + const apr_array_header_t *second) +{ + apr_array_header_t *res = apr_array_copy_hdr(p, first); + + apr_array_cat(res, second); + return res; +} + +/* apr_array_pstrcat generates a new string from the apr_pool_t containing + * the concatenated sequence of substrings referenced as elements within + * the array. The string will be empty if all substrings are empty or null, + * or if there are no elements in the array. + * If sep is non-NUL, it will be inserted between elements as a separator. + */ +APR_DECLARE(char *) apr_array_pstrcat(apr_pool_t *p, + const apr_array_header_t *arr, + const char sep) +{ + char *cp, *res, **strpp; + apr_size_t len; + int i; + + if (arr->nelts <= 0 || arr->elts == NULL) { /* Empty table? */ + return (char *) apr_pcalloc(p, 1); + } + + /* Pass one --- find length of required string */ + + len = 0; + for (i = 0, strpp = (char **) arr->elts; ; ++strpp) { + if (strpp && *strpp != NULL) { + len += strlen(*strpp); + } + if (++i >= arr->nelts) { + break; + } + if (sep) { + ++len; + } + } + + /* Allocate the required string */ + + res = (char *) apr_palloc(p, len + 1); + cp = res; + + /* Pass two --- copy the argument strings into the result space */ + + for (i = 0, strpp = (char **) arr->elts; ; ++strpp) { + if (strpp && *strpp != NULL) { + len = strlen(*strpp); + memcpy(cp, *strpp, len); + cp += len; + } + if (++i >= arr->nelts) { + break; + } + if (sep) { + *cp++ = sep; + } + } + + *cp = '\0'; + + /* Return the result string */ + + return res; +} + + +/***************************************************************** + * + * The "table" functions. + */ + +#if APR_CHARSET_EBCDIC +#define CASE_MASK 0xbfbfbfbf +#else +#define CASE_MASK 0xdfdfdfdf +#endif + +#define TABLE_HASH_SIZE 32 +#define TABLE_INDEX_MASK 0x1f +#define TABLE_HASH(key) (TABLE_INDEX_MASK & *(unsigned char *)(key)) +#define TABLE_INDEX_IS_INITIALIZED(t, i) ((t)->index_initialized & (1 << (i))) +#define TABLE_SET_INDEX_INITIALIZED(t, i) ((t)->index_initialized |= (1 << (i))) + +/* Compute the "checksum" for a key, consisting of the first + * 4 bytes, normalized for case-insensitivity and packed into + * an int...this checksum allows us to do a single integer + * comparison as a fast check to determine whether we can + * skip a strcasecmp + */ +#define COMPUTE_KEY_CHECKSUM(key, checksum) \ +{ \ + const char *k = (key); \ + apr_uint32_t c = (apr_uint32_t)*k; \ + (checksum) = c; \ + (checksum) <<= 8; \ + if (c) { \ + c = (apr_uint32_t)*++k; \ + checksum |= c; \ + } \ + (checksum) <<= 8; \ + if (c) { \ + c = (apr_uint32_t)*++k; \ + checksum |= c; \ + } \ + (checksum) <<= 8; \ + if (c) { \ + c = (apr_uint32_t)*++k; \ + checksum |= c; \ + } \ + checksum &= CASE_MASK; \ +} + +/** The opaque string-content table type */ +struct apr_table_t { + /* This has to be first to promote backwards compatibility with + * older modules which cast a apr_table_t * to an apr_array_header_t *... + * they should use the apr_table_elts() function for most of the + * cases they do this for. + */ + /** The underlying array for the table */ + apr_array_header_t a; +#ifdef MAKE_TABLE_PROFILE + /** Who created the array. */ + void *creator; +#endif + /* An index to speed up table lookups. The way this works is: + * - Take the requested key and compute its checksum + * - Hash the checksum into the index: + * - index_first[TABLE_HASH(checksum)] is the offset within + * the table of the first entry with that key checksum + * - index_last[TABLE_HASH(checksum)] is the offset within + * the table of the first entry with that key checksum + * - If (and only if) there is no entry in the table whose + * checksum hashes to index element i, then the i'th bit + * of index_initialized will be zero. (Check this before + * trying to use index_first[i] or index_last[i]!) + */ + apr_uint32_t index_initialized; + int index_first[TABLE_HASH_SIZE]; + int index_last[TABLE_HASH_SIZE]; +}; + +/* + * NOTICE: if you tweak this you should look at is_empty_table() + * and table_elts() in alloc.h + */ +#ifdef MAKE_TABLE_PROFILE +static apr_table_entry_t *table_push(apr_table_t *t) +{ + if (t->a.nelts == t->a.nalloc) { + return NULL; + } + return (apr_table_entry_t *) apr_array_push_noclear(&t->a); +} +#else /* MAKE_TABLE_PROFILE */ +#define table_push(t) ((apr_table_entry_t *) apr_array_push_noclear(&(t)->a)) +#endif /* MAKE_TABLE_PROFILE */ + +APR_DECLARE(const apr_array_header_t *) apr_table_elts(const apr_table_t *t) +{ + return (const apr_array_header_t *)t; +} + +APR_DECLARE(int) apr_is_empty_table(const apr_table_t *t) +{ + return ((t == NULL) || (t->a.nelts == 0)); +} + +APR_DECLARE(apr_table_t *) apr_table_make(apr_pool_t *p, int nelts) +{ + apr_table_t *t = apr_palloc(p, sizeof(apr_table_t)); + + make_array_core(&t->a, p, nelts, sizeof(apr_table_entry_t), 0); +#ifdef MAKE_TABLE_PROFILE + t->creator = __builtin_return_address(0); +#endif + t->index_initialized = 0; + return t; +} + +APR_DECLARE(apr_table_t *) apr_table_copy(apr_pool_t *p, const apr_table_t *t) +{ + apr_table_t *new = apr_palloc(p, sizeof(apr_table_t)); + +#ifdef POOL_DEBUG + /* we don't copy keys and values, so it's necessary that t->a.pool + * have a life span at least as long as p + */ + if (!apr_pool_is_ancestor(t->a.pool, p)) { + fprintf(stderr, "copy_table: t's pool is not an ancestor of p\n"); + abort(); + } +#endif + make_array_core(&new->a, p, t->a.nalloc, sizeof(apr_table_entry_t), 0); + memcpy(new->a.elts, t->a.elts, t->a.nelts * sizeof(apr_table_entry_t)); + new->a.nelts = t->a.nelts; + memcpy(new->index_first, t->index_first, sizeof(int) * TABLE_HASH_SIZE); + memcpy(new->index_last, t->index_last, sizeof(int) * TABLE_HASH_SIZE); + new->index_initialized = t->index_initialized; + return new; +} + +static void table_reindex(apr_table_t *t) +{ + int i; + int hash; + apr_table_entry_t *next_elt = (apr_table_entry_t *) t->a.elts; + + t->index_initialized = 0; + for (i = 0; i < t->a.nelts; i++, next_elt++) { + hash = TABLE_HASH(next_elt->key); + t->index_last[hash] = i; + if (!TABLE_INDEX_IS_INITIALIZED(t, hash)) { + t->index_first[hash] = i; + TABLE_SET_INDEX_INITIALIZED(t, hash); + } + } +} + +APR_DECLARE(void) apr_table_clear(apr_table_t *t) +{ + t->a.nelts = 0; + t->index_initialized = 0; +} + +APR_DECLARE(const char *) apr_table_get(const apr_table_t *t, const char *key) +{ + apr_table_entry_t *next_elt; + apr_table_entry_t *end_elt; + apr_uint32_t checksum; + int hash; + + if (key == NULL) { + return NULL; + } + + hash = TABLE_HASH(key); + if (!TABLE_INDEX_IS_INITIALIZED(t, hash)) { + return NULL; + } + COMPUTE_KEY_CHECKSUM(key, checksum); + next_elt = ((apr_table_entry_t *) t->a.elts) + t->index_first[hash];; + end_elt = ((apr_table_entry_t *) t->a.elts) + t->index_last[hash]; + + for (; next_elt <= end_elt; next_elt++) { + if ((checksum == next_elt->key_checksum) && + !strcasecmp(next_elt->key, key)) { + return next_elt->val; + } + } + + return NULL; +} + +APR_DECLARE(void) apr_table_set(apr_table_t *t, const char *key, + const char *val) +{ + apr_table_entry_t *next_elt; + apr_table_entry_t *end_elt; + apr_table_entry_t *table_end; + apr_uint32_t checksum; + int hash; + + COMPUTE_KEY_CHECKSUM(key, checksum); + hash = TABLE_HASH(key); + if (!TABLE_INDEX_IS_INITIALIZED(t, hash)) { + t->index_first[hash] = t->a.nelts; + TABLE_SET_INDEX_INITIALIZED(t, hash); + goto add_new_elt; + } + next_elt = ((apr_table_entry_t *) t->a.elts) + t->index_first[hash];; + end_elt = ((apr_table_entry_t *) t->a.elts) + t->index_last[hash]; + table_end =((apr_table_entry_t *) t->a.elts) + t->a.nelts; + + for (; next_elt <= end_elt; next_elt++) { + if ((checksum == next_elt->key_checksum) && + !strcasecmp(next_elt->key, key)) { + + /* Found an existing entry with the same key, so overwrite it */ + + int must_reindex = 0; + apr_table_entry_t *dst_elt = NULL; + + next_elt->val = apr_pstrdup(t->a.pool, val); + + /* Remove any other instances of this key */ + for (next_elt++; next_elt <= end_elt; next_elt++) { + if ((checksum == next_elt->key_checksum) && + !strcasecmp(next_elt->key, key)) { + t->a.nelts--; + if (!dst_elt) { + dst_elt = next_elt; + } + } + else if (dst_elt) { + *dst_elt++ = *next_elt; + must_reindex = 1; + } + } + + /* If we've removed anything, shift over the remainder + * of the table (note that the previous loop didn't + * run to the end of the table, just to the last match + * for the index) + */ + if (dst_elt) { + for (; next_elt < table_end; next_elt++) { + *dst_elt++ = *next_elt; + } + must_reindex = 1; + } + if (must_reindex) { + table_reindex(t); + } + return; + } + } + +add_new_elt: + t->index_last[hash] = t->a.nelts; + next_elt = (apr_table_entry_t *) table_push(t); + next_elt->key = apr_pstrdup(t->a.pool, key); + next_elt->val = apr_pstrdup(t->a.pool, val); + next_elt->key_checksum = checksum; +} + +APR_DECLARE(void) apr_table_setn(apr_table_t *t, const char *key, + const char *val) +{ + apr_table_entry_t *next_elt; + apr_table_entry_t *end_elt; + apr_table_entry_t *table_end; + apr_uint32_t checksum; + int hash; + + COMPUTE_KEY_CHECKSUM(key, checksum); + hash = TABLE_HASH(key); + if (!TABLE_INDEX_IS_INITIALIZED(t, hash)) { + t->index_first[hash] = t->a.nelts; + TABLE_SET_INDEX_INITIALIZED(t, hash); + goto add_new_elt; + } + next_elt = ((apr_table_entry_t *) t->a.elts) + t->index_first[hash];; + end_elt = ((apr_table_entry_t *) t->a.elts) + t->index_last[hash]; + table_end =((apr_table_entry_t *) t->a.elts) + t->a.nelts; + + for (; next_elt <= end_elt; next_elt++) { + if ((checksum == next_elt->key_checksum) && + !strcasecmp(next_elt->key, key)) { + + /* Found an existing entry with the same key, so overwrite it */ + + int must_reindex = 0; + apr_table_entry_t *dst_elt = NULL; + + next_elt->val = (char *)val; + + /* Remove any other instances of this key */ + for (next_elt++; next_elt <= end_elt; next_elt++) { + if ((checksum == next_elt->key_checksum) && + !strcasecmp(next_elt->key, key)) { + t->a.nelts--; + if (!dst_elt) { + dst_elt = next_elt; + } + } + else if (dst_elt) { + *dst_elt++ = *next_elt; + must_reindex = 1; + } + } + + /* If we've removed anything, shift over the remainder + * of the table (note that the previous loop didn't + * run to the end of the table, just to the last match + * for the index) + */ + if (dst_elt) { + for (; next_elt < table_end; next_elt++) { + *dst_elt++ = *next_elt; + } + must_reindex = 1; + } + if (must_reindex) { + table_reindex(t); + } + return; + } + } + +add_new_elt: + t->index_last[hash] = t->a.nelts; + next_elt = (apr_table_entry_t *) table_push(t); + next_elt->key = (char *)key; + next_elt->val = (char *)val; + next_elt->key_checksum = checksum; +} + +APR_DECLARE(void) apr_table_unset(apr_table_t *t, const char *key) +{ + apr_table_entry_t *next_elt; + apr_table_entry_t *end_elt; + apr_table_entry_t *dst_elt; + apr_uint32_t checksum; + int hash; + int must_reindex; + + hash = TABLE_HASH(key); + if (!TABLE_INDEX_IS_INITIALIZED(t, hash)) { + return; + } + COMPUTE_KEY_CHECKSUM(key, checksum); + next_elt = ((apr_table_entry_t *) t->a.elts) + t->index_first[hash]; + end_elt = ((apr_table_entry_t *) t->a.elts) + t->index_last[hash]; + must_reindex = 0; + for (; next_elt <= end_elt; next_elt++) { + if ((checksum == next_elt->key_checksum) && + !strcasecmp(next_elt->key, key)) { + + /* Found a match: remove this entry, plus any additional + * matches for the same key that might follow + */ + apr_table_entry_t *table_end = ((apr_table_entry_t *) t->a.elts) + + t->a.nelts; + t->a.nelts--; + dst_elt = next_elt; + for (next_elt++; next_elt <= end_elt; next_elt++) { + if ((checksum == next_elt->key_checksum) && + !strcasecmp(next_elt->key, key)) { + t->a.nelts--; + } + else { + *dst_elt++ = *next_elt; + } + } + + /* Shift over the remainder of the table (note that + * the previous loop didn't run to the end of the table, + * just to the last match for the index) + */ + for (; next_elt < table_end; next_elt++) { + *dst_elt++ = *next_elt; + } + must_reindex = 1; + break; + } + } + if (must_reindex) { + table_reindex(t); + } +} + +APR_DECLARE(void) apr_table_merge(apr_table_t *t, const char *key, + const char *val) +{ + apr_table_entry_t *next_elt; + apr_table_entry_t *end_elt; + apr_uint32_t checksum; + int hash; + + COMPUTE_KEY_CHECKSUM(key, checksum); + hash = TABLE_HASH(key); + if (!TABLE_INDEX_IS_INITIALIZED(t, hash)) { + t->index_first[hash] = t->a.nelts; + TABLE_SET_INDEX_INITIALIZED(t, hash); + goto add_new_elt; + } + next_elt = ((apr_table_entry_t *) t->a.elts) + t->index_first[hash]; + end_elt = ((apr_table_entry_t *) t->a.elts) + t->index_last[hash]; + + for (; next_elt <= end_elt; next_elt++) { + if ((checksum == next_elt->key_checksum) && + !strcasecmp(next_elt->key, key)) { + + /* Found an existing entry with the same key, so merge with it */ + next_elt->val = apr_pstrcat(t->a.pool, next_elt->val, ", ", + val, NULL); + return; + } + } + +add_new_elt: + t->index_last[hash] = t->a.nelts; + next_elt = (apr_table_entry_t *) table_push(t); + next_elt->key = apr_pstrdup(t->a.pool, key); + next_elt->val = apr_pstrdup(t->a.pool, val); + next_elt->key_checksum = checksum; +} + +APR_DECLARE(void) apr_table_mergen(apr_table_t *t, const char *key, + const char *val) +{ + apr_table_entry_t *next_elt; + apr_table_entry_t *end_elt; + apr_uint32_t checksum; + int hash; + +#ifdef POOL_DEBUG + { + if (!apr_pool_is_ancestor(apr_pool_find(key), t->a.pool)) { + fprintf(stderr, "table_set: key not in ancestor pool of t\n"); + abort(); + } + if (!apr_pool_is_ancestor(apr_pool_find(val), t->a.pool)) { + fprintf(stderr, "table_set: val not in ancestor pool of t\n"); + abort(); + } + } +#endif + + COMPUTE_KEY_CHECKSUM(key, checksum); + hash = TABLE_HASH(key); + if (!TABLE_INDEX_IS_INITIALIZED(t, hash)) { + t->index_first[hash] = t->a.nelts; + TABLE_SET_INDEX_INITIALIZED(t, hash); + goto add_new_elt; + } + next_elt = ((apr_table_entry_t *) t->a.elts) + t->index_first[hash];; + end_elt = ((apr_table_entry_t *) t->a.elts) + t->index_last[hash]; + + for (; next_elt <= end_elt; next_elt++) { + if ((checksum == next_elt->key_checksum) && + !strcasecmp(next_elt->key, key)) { + + /* Found an existing entry with the same key, so merge with it */ + next_elt->val = apr_pstrcat(t->a.pool, next_elt->val, ", ", + val, NULL); + return; + } + } + +add_new_elt: + t->index_last[hash] = t->a.nelts; + next_elt = (apr_table_entry_t *) table_push(t); + next_elt->key = (char *)key; + next_elt->val = (char *)val; + next_elt->key_checksum = checksum; +} + +APR_DECLARE(void) apr_table_add(apr_table_t *t, const char *key, + const char *val) +{ + apr_table_entry_t *elts; + apr_uint32_t checksum; + int hash; + + hash = TABLE_HASH(key); + t->index_last[hash] = t->a.nelts; + if (!TABLE_INDEX_IS_INITIALIZED(t, hash)) { + t->index_first[hash] = t->a.nelts; + TABLE_SET_INDEX_INITIALIZED(t, hash); + } + COMPUTE_KEY_CHECKSUM(key, checksum); + elts = (apr_table_entry_t *) table_push(t); + elts->key = apr_pstrdup(t->a.pool, key); + elts->val = apr_pstrdup(t->a.pool, val); + elts->key_checksum = checksum; +} + +APR_DECLARE(void) apr_table_addn(apr_table_t *t, const char *key, + const char *val) +{ + apr_table_entry_t *elts; + apr_uint32_t checksum; + int hash; + +#ifdef POOL_DEBUG + { + if (!apr_pool_is_ancestor(apr_pool_find(key), t->a.pool)) { + fprintf(stderr, "table_set: key not in ancestor pool of t\n"); + abort(); + } + if (!apr_pool_is_ancestor(apr_pool_find(val), t->a.pool)) { + fprintf(stderr, "table_set: val not in ancestor pool of t\n"); + abort(); + } + } +#endif + + hash = TABLE_HASH(key); + t->index_last[hash] = t->a.nelts; + if (!TABLE_INDEX_IS_INITIALIZED(t, hash)) { + t->index_first[hash] = t->a.nelts; + TABLE_SET_INDEX_INITIALIZED(t, hash); + } + COMPUTE_KEY_CHECKSUM(key, checksum); + elts = (apr_table_entry_t *) table_push(t); + elts->key = (char *)key; + elts->val = (char *)val; + elts->key_checksum = checksum; +} + +APR_DECLARE(apr_table_t *) apr_table_overlay(apr_pool_t *p, + const apr_table_t *overlay, + const apr_table_t *base) +{ + apr_table_t *res; + +#ifdef POOL_DEBUG + /* we don't copy keys and values, so it's necessary that + * overlay->a.pool and base->a.pool have a life span at least + * as long as p + */ + if (!apr_pool_is_ancestor(overlay->a.pool, p)) { + fprintf(stderr, + "overlay_tables: overlay's pool is not an ancestor of p\n"); + abort(); + } + if (!apr_pool_is_ancestor(base->a.pool, p)) { + fprintf(stderr, + "overlay_tables: base's pool is not an ancestor of p\n"); + abort(); + } +#endif + + res = apr_palloc(p, sizeof(apr_table_t)); + /* behave like append_arrays */ + res->a.pool = p; + copy_array_hdr_core(&res->a, &overlay->a); + apr_array_cat(&res->a, &base->a); + table_reindex(res); + return res; +} + +/* And now for something completely abstract ... + + * For each key value given as a vararg: + * run the function pointed to as + * int comp(void *r, char *key, char *value); + * on each valid key-value pair in the apr_table_t t that matches the vararg key, + * or once for every valid key-value pair if the vararg list is empty, + * until the function returns false (0) or we finish the table. + * + * Note that we restart the traversal for each vararg, which means that + * duplicate varargs will result in multiple executions of the function + * for each matching key. Note also that if the vararg list is empty, + * only one traversal will be made and will cut short if comp returns 0. + * + * Note that the table_get and table_merge functions assume that each key in + * the apr_table_t is unique (i.e., no multiple entries with the same key). This + * function does not make that assumption, since it (unfortunately) isn't + * true for some of Apache's tables. + * + * Note that rec is simply passed-on to the comp function, so that the + * caller can pass additional info for the task. + * + * ADDENDUM for apr_table_vdo(): + * + * The caching api will allow a user to walk the header values: + * + * apr_status_t apr_cache_el_header_walk(apr_cache_el *el, + * int (*comp)(void *, const char *, const char *), void *rec, ...); + * + * So it can be ..., however from there I use a callback that use a va_list: + * + * apr_status_t (*cache_el_header_walk)(apr_cache_el *el, + * int (*comp)(void *, const char *, const char *), void *rec, va_list); + * + * To pass those ...'s on down to the actual module that will handle walking + * their headers, in the file case this is actually just an apr_table - and + * rather than reimplementing apr_table_do (which IMHO would be bad) I just + * called it with the va_list. For mod_shmem_cache I don't need it since I + * can't use apr_table's, but mod_file_cache should (though a good hash would + * be better, but that's a different issue :). + * + * So to make mod_file_cache easier to maintain, it's a good thing + */ +APR_DECLARE_NONSTD(int) apr_table_do(apr_table_do_callback_fn_t *comp, + void *rec, const apr_table_t *t, ...) +{ + int rv; + + va_list vp; + va_start(vp, t); + rv = apr_table_vdo(comp, rec, t, vp); + va_end(vp); + + return rv; +} + +/* XXX: do the semantics of this routine make any sense? Right now, + * if the caller passed in a non-empty va_list of keys to search for, + * the "early termination" facility only terminates on *that* key; other + * keys will continue to process. Note that this only has any effect + * at all if there are multiple entries in the table with the same key, + * otherwise the called function can never effectively early-terminate + * this function, as the zero return value is effectively ignored. + * + * Note also that this behavior is at odds with the behavior seen if an + * empty va_list is passed in -- in that case, a zero return value terminates + * the entire apr_table_vdo (which is what I think should happen in + * both cases). + * + * If nobody objects soon, I'm going to change the order of the nested + * loops in this function so that any zero return value from the (*comp) + * function will cause a full termination of apr_table_vdo. I'm hesitant + * at the moment because these (funky) semantics have been around for a + * very long time, and although Apache doesn't seem to use them at all, + * some third-party vendor might. I can only think of one possible reason + * the existing semantics would make any sense, and it's very Apache-centric, + * which is this: if (*comp) is looking for matches of a particular + * substring in request headers (let's say it's looking for a particular + * cookie name in the Set-Cookie headers), then maybe it wants to be + * able to stop searching early as soon as it finds that one and move + * on to the next key. That's only an optimization of course, but changing + * the behavior of this function would mean that any code that tried + * to do that would stop working right. + * + * Sigh. --JCW, 06/28/02 + */ +APR_DECLARE(int) apr_table_vdo(apr_table_do_callback_fn_t *comp, + void *rec, const apr_table_t *t, va_list vp) +{ + char *argp; + apr_table_entry_t *elts = (apr_table_entry_t *) t->a.elts; + int vdorv = 1; + + argp = va_arg(vp, char *); + do { + int rv = 1, i; + if (argp) { + /* Scan for entries that match the next key */ + int hash = TABLE_HASH(argp); + if (TABLE_INDEX_IS_INITIALIZED(t, hash)) { + apr_uint32_t checksum; + COMPUTE_KEY_CHECKSUM(argp, checksum); + for (i = t->index_first[hash]; + rv && (i <= t->index_last[hash]); ++i) { + if (elts[i].key && (checksum == elts[i].key_checksum) && + !strcasecmp(elts[i].key, argp)) { + rv = (*comp) (rec, elts[i].key, elts[i].val); + } + } + } + } + else { + /* Scan the entire table */ + for (i = 0; rv && (i < t->a.nelts); ++i) { + if (elts[i].key) { + rv = (*comp) (rec, elts[i].key, elts[i].val); + } + } + } + if (rv == 0) { + vdorv = 0; + } + } while (argp && ((argp = va_arg(vp, char *)) != NULL)); + + return vdorv; +} + +static apr_table_entry_t **table_mergesort(apr_pool_t *pool, + apr_table_entry_t **values, int n) +{ + /* Bottom-up mergesort, based on design in Sedgewick's "Algorithms + * in C," chapter 8 + */ + apr_table_entry_t **values_tmp = + (apr_table_entry_t **)apr_palloc(pool, n * sizeof(apr_table_entry_t*)); + int i; + int blocksize; + + /* First pass: sort pairs of elements (blocksize=1) */ + for (i = 0; i + 1 < n; i += 2) { + if (strcasecmp(values[i]->key, values[i + 1]->key) > 0) { + apr_table_entry_t *swap = values[i]; + values[i] = values[i + 1]; + values[i + 1] = swap; + } + } + + /* Merge successively larger blocks */ + blocksize = 2; + while (blocksize < n) { + apr_table_entry_t **dst = values_tmp; + int next_start; + apr_table_entry_t **swap; + + /* Merge consecutive pairs blocks of the next blocksize. + * Within a block, elements are in sorted order due to + * the previous iteration. + */ + for (next_start = 0; next_start + blocksize < n; + next_start += (blocksize + blocksize)) { + + int block1_start = next_start; + int block2_start = block1_start + blocksize; + int block1_end = block2_start; + int block2_end = block2_start + blocksize; + if (block2_end > n) { + /* The last block may be smaller than blocksize */ + block2_end = n; + } + for (;;) { + + /* Merge the next two blocks: + * Pick the smaller of the next element from + * block 1 and the next element from block 2. + * Once either of the blocks is emptied, copy + * over all the remaining elements from the + * other block + */ + if (block1_start == block1_end) { + for (; block2_start < block2_end; block2_start++) { + *dst++ = values[block2_start]; + } + break; + } + else if (block2_start == block2_end) { + for (; block1_start < block1_end; block1_start++) { + *dst++ = values[block1_start]; + } + break; + } + if (strcasecmp(values[block1_start]->key, + values[block2_start]->key) > 0) { + *dst++ = values[block2_start++]; + } + else { + *dst++ = values[block1_start++]; + } + } + } + + /* If n is not a multiple of 2*blocksize, some elements + * will be left over at the end of the array. + */ + for (i = dst - values_tmp; i < n; i++) { + values_tmp[i] = values[i]; + } + + /* The output array of this pass becomes the input + * array of the next pass, and vice versa + */ + swap = values_tmp; + values_tmp = values; + values = swap; + + blocksize += blocksize; + } + + return values; +} + +APR_DECLARE(void) apr_table_compress(apr_table_t *t, unsigned flags) +{ + apr_table_entry_t **sort_array; + apr_table_entry_t **sort_next; + apr_table_entry_t **sort_end; + apr_table_entry_t *table_next; + apr_table_entry_t **last; + int i; + int dups_found; + + if (t->a.nelts <= 1) { + return; + } + + /* Copy pointers to all the table elements into an + * array and sort to allow for easy detection of + * duplicate keys + */ + sort_array = (apr_table_entry_t **) + apr_palloc(t->a.pool, t->a.nelts * sizeof(apr_table_entry_t*)); + sort_next = sort_array; + table_next = (apr_table_entry_t *)t->a.elts; + i = t->a.nelts; + do { + *sort_next++ = table_next++; + } while (--i); + + /* Note: the merge is done with mergesort instead of quicksort + * because mergesort is a stable sort and runs in n*log(n) + * time regardless of its inputs (quicksort is quadratic in + * the worst case) + */ + sort_array = table_mergesort(t->a.pool, sort_array, t->a.nelts); + + /* Process any duplicate keys */ + dups_found = 0; + sort_next = sort_array; + sort_end = sort_array + t->a.nelts; + last = sort_next++; + while (sort_next < sort_end) { + if (((*sort_next)->key_checksum == (*last)->key_checksum) && + !strcasecmp((*sort_next)->key, (*last)->key)) { + apr_table_entry_t **dup_last = sort_next + 1; + dups_found = 1; + while ((dup_last < sort_end) && + ((*dup_last)->key_checksum == (*last)->key_checksum) && + !strcasecmp((*dup_last)->key, (*last)->key)) { + dup_last++; + } + dup_last--; /* Elements from last through dup_last, inclusive, + * all have the same key + */ + if (flags == APR_OVERLAP_TABLES_MERGE) { + apr_size_t len = 0; + apr_table_entry_t **next = last; + char *new_val; + char *val_dst; + do { + len += strlen((*next)->val); + len += 2; /* for ", " or trailing null */ + } while (++next <= dup_last); + new_val = (char *)apr_palloc(t->a.pool, len); + val_dst = new_val; + next = last; + for (;;) { + strcpy(val_dst, (*next)->val); + val_dst += strlen((*next)->val); + next++; + if (next > dup_last) { + *val_dst = 0; + break; + } + else { + *val_dst++ = ','; + *val_dst++ = ' '; + } + } + (*last)->val = new_val; + } + else { /* overwrite */ + (*last)->val = (*dup_last)->val; + } + do { + (*sort_next)->key = NULL; + } while (++sort_next <= dup_last); + } + else { + last = sort_next++; + } + } + + /* Shift elements to the left to fill holes left by removing duplicates */ + if (dups_found) { + apr_table_entry_t *src = (apr_table_entry_t *)t->a.elts; + apr_table_entry_t *dst = (apr_table_entry_t *)t->a.elts; + apr_table_entry_t *last_elt = src + t->a.nelts; + do { + if (src->key) { + *dst++ = *src; + } + } while (++src < last_elt); + t->a.nelts -= (last_elt - dst); + } + + table_reindex(t); +} + +static void apr_table_cat(apr_table_t *t, const apr_table_t *s) +{ + const int n = t->a.nelts; + register int idx; + + apr_array_cat(&t->a,&s->a); + + if (n == 0) { + memcpy(t->index_first,s->index_first,sizeof(int) * TABLE_HASH_SIZE); + memcpy(t->index_last, s->index_last, sizeof(int) * TABLE_HASH_SIZE); + t->index_initialized = s->index_initialized; + return; + } + + for (idx = 0; idx < TABLE_HASH_SIZE; ++idx) { + if (TABLE_INDEX_IS_INITIALIZED(s, idx)) { + t->index_last[idx] = s->index_last[idx] + n; + if (!TABLE_INDEX_IS_INITIALIZED(t, idx)) { + t->index_first[idx] = s->index_first[idx] + n; + } + } + } + + t->index_initialized |= s->index_initialized; +} + +APR_DECLARE(void) apr_table_overlap(apr_table_t *a, const apr_table_t *b, + unsigned flags) +{ + const int m = a->a.nelts; + const int n = b->a.nelts; + apr_pool_t *p = b->a.pool; + + if (m + n == 0) { + return; + } + + /* copy (extend) a using b's pool */ + if (a->a.pool != p) { + make_array_core(&a->a, p, m+n, sizeof(apr_table_entry_t), 0); + } + + apr_table_cat(a, b); + + apr_table_compress(a, flags); +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/tables/apr_tables.lo b/rubbos/app/httpd-2.0.64/srclib/apr/tables/apr_tables.lo new file mode 100644 index 00000000..a74bcd28 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/tables/apr_tables.lo @@ -0,0 +1,12 @@ +# apr_tables.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/apr_tables.o' + +# Name of the non-PIC object. +non_pic_object='apr_tables.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/tables/apr_tables.o b/rubbos/app/httpd-2.0.64/srclib/apr/tables/apr_tables.o new file mode 100644 index 0000000000000000000000000000000000000000..21b95695614410f6cb4f7dcc8a847eb7c00deca0 GIT binary patch literal 68320 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 +#include +#include +#include +#include + +#include "CuTest.h" + +static int verbose = 0; + +void CuInit(int argc, char *argv[]) +{ + int i; + + /* Windows doesn't have getopt, so we have to fake it. We can't use + * apr_getopt, because CuTest is meant to be a stand-alone test suite + */ + for (i = 0; i < argc; i++) { + if (!strcmp(argv[i], "-v")) { + verbose = 1; + } + } +} + +/*-------------------------------------------------------------------------* + * CuStr + *-------------------------------------------------------------------------*/ + +char* CuStrAlloc(int size) +{ + char* new = (char*) malloc( sizeof(char) * (size) ); + return new; +} + +char* CuStrCopy(const char* old) +{ + int len = strlen(old); + char* new = CuStrAlloc(len + 1); + strcpy(new, old); + return new; +} + +/*-------------------------------------------------------------------------* + * CuString + *-------------------------------------------------------------------------*/ + +void CuStringInit(CuString* str) +{ + str->length = 0; + str->size = STRING_MAX; + str->buffer = (char*) malloc(sizeof(char) * str->size); + str->buffer[0] = '\0'; +} + +CuString* CuStringNew(void) +{ + CuString* str = (CuString*) malloc(sizeof(CuString)); + str->length = 0; + str->size = STRING_MAX; + str->buffer = (char*) malloc(sizeof(char) * str->size); + str->buffer[0] = '\0'; + return str; +} + +void CuStringResize(CuString* str, int newSize) +{ + str->buffer = (char*) realloc(str->buffer, sizeof(char) * newSize); + str->size = newSize; +} + +void CuStringAppend(CuString* str, const char* text) +{ + int length = strlen(text); + if (str->length + length + 1 >= str->size) + CuStringResize(str, str->length + length + 1 + STRING_INC); + str->length += length; + strcat(str->buffer, text); +} + +void CuStringAppendChar(CuString* str, char ch) +{ + char text[2]; + text[0] = ch; + text[1] = '\0'; + CuStringAppend(str, text); +} + +void CuStringAppendFormat(CuString* str, const char* format, ...) +{ + va_list argp; + char buf[HUGE_STRING_LEN]; + va_start(argp, format); + vsprintf(buf, format, argp); + va_end(argp); + CuStringAppend(str, buf); +} + +void CuStringRead(CuString *str, char *path) +{ + path = strdup(str->buffer); +} + +/*-------------------------------------------------------------------------* + * CuTest + *-------------------------------------------------------------------------*/ + +void CuTestInit(CuTest* t, char* name, TestFunction function) +{ + t->name = CuStrCopy(name); + t->notimpl = 0; + t->failed = 0; + t->ran = 0; + t->message = NULL; + t->function = function; + t->jumpBuf = NULL; +} + +CuTest* CuTestNew(char* name, TestFunction function) +{ + CuTest* tc = CU_ALLOC(CuTest); + CuTestInit(tc, name, function); + return tc; +} + +void CuNotImpl(CuTest* tc, const char* message) +{ + CuString* newstr = CuStringNew(); + CuStringAppend(newstr, message); + CuStringAppend(newstr, " not implemented on this platform"); + tc->notimpl = 1; + tc->message = CuStrCopy(newstr->buffer); + if (tc->jumpBuf != 0) longjmp(*(tc->jumpBuf), 0); +} + +void CuFail(CuTest* tc, const char* message) +{ + tc->failed = 1; + tc->message = CuStrCopy(message); + if (tc->jumpBuf != 0) longjmp(*(tc->jumpBuf), 0); +} + +void CuAssert(CuTest* tc, const char* message, int condition) +{ + if (condition) return; + CuFail(tc, message); +} + +void CuAssertTrue(CuTest* tc, int condition) +{ + if (condition) return; + CuFail(tc, "assert failed"); +} + +void CuAssertStrNEquals(CuTest* tc, const char* expected, const char* actual, + int n) +{ + CuString* message; + if (strncmp(expected, actual, n) == 0) return; + message = CuStringNew(); + CuStringAppend(message, "expected\n---->\n"); + CuStringAppend(message, expected); + CuStringAppend(message, "\n<----\nbut saw\n---->\n"); + CuStringAppend(message, actual); + CuStringAppend(message, "\n<----"); + CuFail(tc, message->buffer); +} + +void CuAssertStrEquals(CuTest* tc, const char* expected, const char* actual) +{ + CuString* message; + if (strcmp(expected, actual) == 0) return; + message = CuStringNew(); + CuStringAppend(message, "expected\n---->\n"); + CuStringAppend(message, expected); + CuStringAppend(message, "\n<----\nbut saw\n---->\n"); + CuStringAppend(message, actual); + CuStringAppend(message, "\n<----"); + CuFail(tc, message->buffer); +} + +void CuAssertIntEquals(CuTest* tc, int expected, int actual) +{ + char buf[STRING_MAX]; + if (expected == actual) return; + sprintf(buf, "expected <%d> but was <%d>", expected, actual); + CuFail(tc, buf); +} + +void CuAssertPtrEquals(CuTest* tc, const void* expected, const void* actual) +{ + char buf[STRING_MAX]; + if (expected == actual) return; + sprintf(buf, "expected pointer <%p> but was <%p>", expected, actual); + CuFail(tc, buf); +} + +void CuAssertPtrNotNull(CuTest* tc, const void* pointer) +{ + char buf[STRING_MAX]; + if (pointer != NULL ) return; + sprintf(buf, "null pointer unexpected, but was <%p>", pointer); + CuFail(tc, buf); +} + +void CuTestRun(CuTest* tc) +{ + jmp_buf buf; + tc->jumpBuf = &buf; + if (setjmp(buf) == 0) + { + tc->ran = 1; + (tc->function)(tc); + } + tc->jumpBuf = 0; +} + +/*-------------------------------------------------------------------------* + * CuSuite + *-------------------------------------------------------------------------*/ + +void CuSuiteInit(CuSuite* testSuite, char *name) +{ + testSuite->name = strdup(name); + testSuite->count = 0; + testSuite->failCount = 0; + testSuite->notimplCount = 0; +} + +CuSuite* CuSuiteNew(char *name) +{ + CuSuite* testSuite = CU_ALLOC(CuSuite); + CuSuiteInit(testSuite, name); + return testSuite; +} + +void CuSuiteAdd(CuSuite* testSuite, CuTest *testCase) +{ + assert(testSuite->count < MAX_TEST_CASES); + testSuite->list[testSuite->count] = testCase; + testSuite->count++; +} + +void CuSuiteAddSuite(CuSuite* testSuite, CuSuite* testSuite2) +{ + int i; + for (i = 0 ; i < testSuite2->count ; ++i) + { + CuTest* testCase = testSuite2->list[i]; + CuSuiteAdd(testSuite, testCase); + } +} + +void CuSuiteRun(CuSuite* testSuite) +{ + int i; + for (i = 0 ; i < testSuite->count ; ++i) + { + CuTest* testCase = testSuite->list[i]; + CuTestRun(testCase); + if (testCase->failed) { testSuite->failCount += 1; } + if (testCase->notimpl) { testSuite->notimplCount += 1; } + } +} + +void CuSuiteSummary(CuSuite* testSuite, CuString* summary) +{ + int i; + for (i = 0 ; i < testSuite->count ; ++i) + { + CuTest* testCase = testSuite->list[i]; + CuStringAppend(summary, testCase->failed ? "F" : + testCase->notimpl ? "N": "."); + } + CuStringAppend(summary, "\n"); +} + +void CuSuiteOverView(CuSuite* testSuite, CuString* details) +{ + CuStringAppendFormat(details, "%d %s run: %d passed, %d failed, " + "%d not implemented.\n", + testSuite->count, + testSuite->count == 1 ? "test" : "tests", + testSuite->count - testSuite->failCount - + testSuite->notimplCount, + testSuite->failCount, testSuite->notimplCount); +} + +void CuSuiteDetails(CuSuite* testSuite, CuString* details) +{ + int i; + int failCount = 0; + + if (testSuite->failCount != 0 && verbose) + { + CuStringAppendFormat(details, "\nFailed tests in %s:\n", testSuite->name); + for (i = 0 ; i < testSuite->count ; ++i) + { + CuTest* testCase = testSuite->list[i]; + if (testCase->failed) + { + failCount++; + CuStringAppendFormat(details, "%d) %s: %s\n", + failCount, testCase->name, testCase->message); + } + } + } + if (testSuite->notimplCount != 0 && verbose) + { + CuStringAppendFormat(details, "\nNot Implemented tests in %s:\n", testSuite->name); + for (i = 0 ; i < testSuite->count ; ++i) + { + CuTest* testCase = testSuite->list[i]; + if (testCase->notimpl) + { + failCount++; + CuStringAppendFormat(details, "%d) %s: %s\n", + failCount, testCase->name, testCase->message); + } + } + } +} + +/*-------------------------------------------------------------------------* + * CuSuiteList + *-------------------------------------------------------------------------*/ + +CuSuiteList* CuSuiteListNew(char *name) +{ + CuSuiteList* testSuite = CU_ALLOC(CuSuiteList); + testSuite->name = strdup(name); + testSuite->count = 0; + return testSuite; +} + +void CuSuiteListAdd(CuSuiteList *suites, CuSuite *origsuite) +{ + assert(suites->count < MAX_TEST_CASES); + suites->list[suites->count] = origsuite; + suites->count++; +} + +void CuSuiteListRun(CuSuiteList* testSuite) +{ + int i; + for (i = 0 ; i < testSuite->count ; ++i) + { + CuSuite* testCase = testSuite->list[i]; + CuSuiteRun(testCase); + } +} + +static const char *genspaces(int i) +{ + char *str = malloc((i + 1) * sizeof(char)); + memset(str, ' ', i); + str[i] = '\0'; + return str; +} + +void CuSuiteListRunWithSummary(CuSuiteList* testSuite) +{ + int i; + + printf("%s:\n", testSuite->name); + for (i = 0 ; i < testSuite->count ; ++i) + { + CuSuite* testCase = testSuite->list[i]; + CuString *str = CuStringNew(); + + printf(" %s:%s", testCase->name, + genspaces(21 - strlen(testCase->name))); + fflush(stdout); + CuSuiteRun(testCase); + CuSuiteSummary(testCase, str); + printf(" %s", str->buffer); + + } + printf("\n"); +} + +void CuSuiteListSummary(CuSuiteList* testSuite, CuString* summary) +{ + int i; + CuStringAppendFormat(summary, "%s:\n", testSuite->name); + for (i = 0 ; i < testSuite->count ; ++i) + { + CuSuite* testCase = testSuite->list[i]; + CuString *str = CuStringNew(); + CuSuiteSummary(testCase, str); + CuStringAppend(summary, " "); + CuStringAppend(summary, str->buffer); + } + CuStringAppend(summary, "\n"); +} + +int CuSuiteListDetails(CuSuiteList* testSuite, CuString* details) +{ + int i; + int failCount = 0; + int notImplCount = 0; + int count = 0; + + for (i = 0 ; i < testSuite->count ; ++i) + { + failCount += testSuite->list[i]->failCount; + notImplCount += testSuite->list[i]->notimplCount; + count += testSuite->list[i]->count; + } + CuStringAppendFormat(details, "%d %s run: %d passed, %d failed, " + "%d not implemented.\n", + count, + count == 1 ? "test" : "tests", + count - failCount - notImplCount, + failCount, notImplCount); + + if (failCount != 0 && verbose) + { + for (i = 0 ; i < testSuite->count ; ++i) + { + CuString *str = CuStringNew(); + CuSuite* testCase = testSuite->list[i]; + if (testCase->failCount) + { + CuSuiteDetails(testCase, str); + CuStringAppend(details, str->buffer); + } + } + } + if (notImplCount != 0 && verbose) + { + for (i = 0 ; i < testSuite->count ; ++i) + { + CuString *str = CuStringNew(); + CuSuite* testCase = testSuite->list[i]; + if (testCase->notimplCount) + { + CuSuiteDetails(testCase, str); + CuStringAppend(details, str->buffer); + } + } + } + return failCount; +} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/CuTest.h b/rubbos/app/httpd-2.0.64/srclib/apr/test/CuTest.h new file mode 100644 index 00000000..e607d3ac --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/CuTest.h @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2002-2006 Asim Jalis + * + * This library is released under the zlib/libpng license as described at + * + * http://www.opensource.org/licenses/zlib-license.html + * + * Here is the statement of the license: + * + * This software is provided 'as-is', without any express or implied warranty. + * In no event will the authors be held liable for any damages arising from + * the use of this software. + * + * Permission is granted to anyone to use this software for any purpose, + * including commercial applications, and to alter it and redistribute it + * freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software in a + * product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source distribution. + */ +/* + * This file has been modified from the original distribution. + */ + +#ifndef CU_TEST_H +#define CU_TEST_H + +#include +#include + +/* CuString */ + +char* CuStrAlloc(int size); +char* CuStrCopy(const char* old); + +#define CU_ALLOC(TYPE) ((TYPE*) malloc(sizeof(TYPE))) + +#define HUGE_STRING_LEN 8192 +#define STRING_MAX 256 +#define STRING_INC 256 + +typedef struct +{ + int length; + int size; + char* buffer; +} CuString; + +void CuStringInit(CuString* str); +CuString* CuStringNew(void); +void CuStringRead(CuString* str, char* path); +void CuStringAppend(CuString* str, const char* text); +void CuStringAppendChar(CuString* str, char ch); +void CuStringAppendFormat(CuString* str, const char* format, ...); +void CuStringResize(CuString* str, int newSize); + +/* CuTest */ + +typedef struct CuTest CuTest; + +typedef void (*TestFunction)(CuTest *); + +struct CuTest +{ + char* name; + TestFunction function; + int notimpl; + int failed; + int ran; + char* message; + jmp_buf *jumpBuf; +}; + +void CuInit(int argc, char *argv[]); +void CuTestInit(CuTest* t, char* name, TestFunction function); +CuTest* CuTestNew(char* name, TestFunction function); +void CuFail(CuTest* tc, const char* message); +void CuNotImpl(CuTest* tc, const char* message); +void CuAssert(CuTest* tc, const char* message, int condition); +void CuAssertTrue(CuTest* tc, int condition); +void CuAssertStrEquals(CuTest* tc, const char* expected, const char* actual); +void CuAssertStrNEquals(CuTest* tc, const char* expected, const char* actual, + int n); +void CuAssertIntEquals(CuTest* tc, int expected, int actual); +void CuAssertPtrEquals(CuTest* tc, const void* expected, const void* actual); +void CuAssertPtrNotNull(CuTest* tc, const void* pointer); + +void CuTestRun(CuTest* tc); + +/* CuSuite */ + +#define MAX_TEST_CASES 1024 + +#define SUITE_ADD_TEST(SUITE,TEST) CuSuiteAdd(SUITE, CuTestNew(#TEST, TEST)) + +typedef struct +{ + char *name; + int count; + CuTest* list[MAX_TEST_CASES]; + int failCount; + int notimplCount; + +} CuSuite; + + +void CuSuiteInit(CuSuite* testSuite, char* name); +CuSuite* CuSuiteNew(char* name); +void CuSuiteAdd(CuSuite* testSuite, CuTest *testCase); +void CuSuiteAddSuite(CuSuite* testSuite, CuSuite* testSuite2); +void CuSuiteRun(CuSuite* testSuite); +void CuSuiteSummary(CuSuite* testSuite, CuString* summary); +void CuSuiteOverView(CuSuite* testSuite, CuString* details); +void CuSuiteDetails(CuSuite* testSuite, CuString* details); + +typedef struct +{ + char *name; + int count; + CuSuite* list[MAX_TEST_CASES]; +} CuSuiteList; + + +CuSuiteList* CuSuiteListNew(char* name); +void CuSuiteListAdd(CuSuiteList* testSuite, CuSuite *testCase); +void CuSuiteListRun(CuSuiteList* testSuite); +void CuSuiteListRunWithSummary(CuSuiteList* testSuite); +void CuSuiteListSummary(CuSuiteList* testSuite, CuString* summary); +/* Print details of test suite results; returns total number of + * tests which failed. */ +int CuSuiteListDetails(CuSuiteList* testSuite, CuString* details); +#endif /* CU_TEST_H */ + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/MakeWin32Make.awk b/rubbos/app/httpd-2.0.64/srclib/apr/test/MakeWin32Make.awk new file mode 100644 index 00000000..c5529f8f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/MakeWin32Make.awk @@ -0,0 +1,53 @@ +{ + + if (match($0, /\@INCLUDE_RULES\@/ ) ) { + print "ALL: \$(TARGETS)"; + print ""; + print "CL = cl.exe"; + print "LINK = link.exe /nologo /debug /machine:I386 /subsystem:console /incremental:no "; + print ""; + print "CFLAGS = /nologo /c /MDd /W3 /Gm /GX /Zi /Od /D _DEBUG /D WIN32 /D APR_DECLARE_STATIC /FD "; + print ""; + print ".c.obj::"; + $0 = "\t\$(CL) -c \$< \$(CFLAGS) \$(INCLUDES)"; + } + if ( match( $0, /^ALL_LIBS=/ ) ) { + $0 = ""; + } + if ( match( $0, /^LOCAL_LIBS=/ ) ) { + print "LOCAL_LIBS= ../LibD/apr.lib "; + print "ALL_LIBS= kernel32\.lib user32\.lib advapi32\.lib Rpcrt4\.lib ws2_32\.lib wsock32\.lib ole32\.lib "; + $0 = "" + } + if ( match( $0, /\@CFLAGS\@/ ) ) { + $0 = ""; + } + gsub( /\$\([^\)]* [^\)]*\)/, "", $0 ); + gsub( /\$\{LD_FLAGS\}/, "", $0 ); + gsub( /\.\.\/libapr\.la/, "../LibD/apr.lib", $0 ); + gsub( /\@RM\@/, "del", $0 ); + if (gsub( /\$\(RM\) -f/, "del" ) ) { + gsub( /\*\.a/, "*.lib *.exp *.idb *.ilk *.pdb", $0 ); + gsub( /Makefile/, "Makefile *.ncb *.opt", $0 ); + } + gsub( /\@CC\@/, "cl", $0); + gsub( /\@RANLIB\@/, "", $0); + gsub( /-I\$\(INCDIR\)/, "/I \"$(INCDIR)\"", $0); + + gsub( /\.\.\/libapr\.a/, "../LibD/apr.lib", $0 ); + if ( gsub( /\@EXEEXT\@/, ".exe", $0 ) ) { + gsub( /\$\(CC\) \$\(CFLAGS\)/, "\$\(LINK\) /subsystem:console", $0 ); + gsub( /-o (\S+)/, "/out:\"$1\"", $0 ); + gsub( /--export-dynamic /, "", $0 ); + gsub( /-fPIC /, "", $0 ); + } + if ( gsub( /-shared/, "/subsystem:windows /dll", $0 ) ) { + gsub( /-o (\S+)/ "/out:\"$1\"", $0 ); + } + gsub( /\$\(NONPORTABLE\)/, "", $0 ); + gsub( /\.a /, ".lib ", $0 ); + gsub( /\.o /, ".obj ", $0 ); + gsub( /\.lo /, ".obj ", $0 ); + + print $0; +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/Makefile b/rubbos/app/httpd-2.0.64/srclib/apr/test/Makefile new file mode 100644 index 00000000..bb66cf89 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/Makefile @@ -0,0 +1,123 @@ +srcdir = . + + +# PROGRAMS includes all test programs built on this platform. +# STDTEST_PORTABLE +# test programs invoked via standard user interface, run on all platforms +# STDTEST_NONPORTABLE +# test programs invoked via standard user interface, not portable +# OTHER_PROGRAMS +# programs such as sendfile, that have to be invoked in a special sequence +# or with special parameters + +STDTEST_PORTABLE = \ + testflock \ + testsock \ + testlockperf \ + testatomic \ + testmutexscope \ + testall + +STDTEST_NONPORTABLE = \ + testshm \ + testglobalmutex + +OTHER_PROGRAMS = client sendfile \ + server + +PROGRAMS = $(STDTEST_PORTABLE) $(STDTEST_NONPORTABLE) $(OTHER_PROGRAMS) + +TARGETS = $(PROGRAMS) + +# bring in rules.mk for standard functionality +include /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/build/apr_rules.mk + +LOCAL_LIBS=../libapr-${APR_MAJOR_VERSION}.la + +CLEAN_TARGETS = testfile.tmp mod_test.slo proc_child occhild \ +readchild + +INCDIR=../include +INCLUDES=-I$(INCDIR) + +check: $(STDTEST_PORTABLE) $(STDTEST_NONPORTABLE) + for prog in $(STDTEST_PORTABLE) $(STDTEST_NONPORTABLE); do \ + ./$$prog; \ + if test $$? = 255; then \ + echo "$$prog failed"; \ + break; \ + fi; \ + done + +testflock: testflock.lo $(LOCAL_LIBS) + $(LINK) testflock.lo $(LOCAL_LIBS) $(ALL_LIBS) + +occhild: occhild.lo $(LOCAL_LIBS) + $(LINK) occhild.lo $(LOCAL_LIBS) $(ALL_LIBS) + +readchild: readchild.lo $(LOCAL_LIBS) + $(LINK) readchild.lo $(LOCAL_LIBS) $(ALL_LIBS) + +proc_child: proc_child.lo $(LOCAL_LIBS) + $(LINK) proc_child.lo $(LOCAL_LIBS) $(ALL_LIBS) + +# FIXME: -prefer-pic is only supported with libtool-1.4+ +mod_test.slo: $(srcdir)/mod_test.c + $(LIBTOOL) --mode=compile $(COMPILE) -prefer-pic -c $(srcdir)/mod_test.c && touch $@ + +mod_test.la: mod_test.slo $(LOCAL_LIBS) + $(LIBTOOL) --mode=link $(COMPILE) -rpath `pwd` -avoid-version -module mod_test.lo $(LT_LDFLAGS) $(ALL_LDFLAGS) -o $@ + +libmod_test.la: mod_test.slo $(LOCAL_LIBS) + $(LIBTOOL) --mode=link $(COMPILE) -rpath `pwd` -avoid-version mod_test.lo $(LT_LDFLAGS) $(ALL_LDFLAGS) -o $@ + +testlockperf: testlockperf.lo $(LOCAL_LIBS) + $(LINK) testlockperf.lo $(LOCAL_LIBS) $(ALL_LIBS) + +testsock: testsock.lo client server sendfile $(LOCAL_LIBS) + $(LINK) testsock.lo $(LOCAL_LIBS) $(ALL_LIBS) + +client: client.lo $(LOCAL_LIBS) + $(LINK) client.lo $(LOCAL_LIBS) $(ALL_LIBS) + +server: server.lo $(LOCAL_LIBS) + $(LINK) server.lo $(LOCAL_LIBS) $(ALL_LIBS) + +sendfile: sendfile.lo $(LOCAL_LIBS) + $(LINK) sendfile.lo $(LOCAL_LIBS) $(ALL_LIBS) + +testshm: testshm.lo $(LOCAL_LIBS) testshmproducer testshmconsumer + $(LINK) testshm.lo $(LOCAL_LIBS) $(ALL_LIBS) + +testshmproducer: testshmproducer.lo $(LOCAL_LIBS) + $(LINK) testshmproducer.lo $(LOCAL_LIBS) $(ALL_LIBS) + +testshmconsumer: testshmconsumer.lo $(LOCAL_LIBS) + $(LINK) testshmconsumer.lo $(LOCAL_LIBS) $(ALL_LIBS) + +testprocmutex: testprocmutex.lo $(LOCAL_LIBS) + $(LINK) testprocmutex.lo $(LOCAL_LIBS) $(ALL_LIBS) + +testglobalmutex: testglobalmutex.lo $(LOCAL_LIBS) + $(LINK) testglobalmutex.lo $(LOCAL_LIBS) $(ALL_LIBS) + +testatomic: testatomic.lo $(LOCAL_LIBS) + $(LINK) testatomic.lo $(LOCAL_LIBS) $(ALL_LIBS) + +testmutexscope: testmutexscope.lo $(LOCAL_LIBS) + $(LINK) testmutexscope.lo $(LOCAL_LIBS) $(ALL_LIBS) + +TESTS = testall.lo testtime.lo teststr.lo testvsn.lo testipsub.lo \ + testmmap.lo testud.lo testtable.lo testsleep.lo testpools.lo \ + testfmt.lo testfile.lo testdir.lo testfileinfo.lo testrand.lo \ + testdso.lo testoc.lo testdup.lo testsockets.lo testproc.lo \ + testpoll.lo testlock.lo testsockopt.lo testpipe.lo testthread.lo \ + testhash.lo testargs.lo testnames.lo testuser.lo testpath.lo \ + testenv.lo testprocmutex.lo + +testall: $(TESTS) mod_test.la libmod_test.la occhild \ + readchild CuTest.lo proc_child $(LOCAL_LIBS) + $(LINK) $(TESTS) CuTest.lo $(LOCAL_LIBS) $(ALL_LIBS) + + +# DO NOT REMOVE diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/Makefile.in b/rubbos/app/httpd-2.0.64/srclib/apr/test/Makefile.in new file mode 100644 index 00000000..1f7d047e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/Makefile.in @@ -0,0 +1,123 @@ +srcdir = @srcdir@ +VPATH = @srcdir@ + +# PROGRAMS includes all test programs built on this platform. +# STDTEST_PORTABLE +# test programs invoked via standard user interface, run on all platforms +# STDTEST_NONPORTABLE +# test programs invoked via standard user interface, not portable +# OTHER_PROGRAMS +# programs such as sendfile, that have to be invoked in a special sequence +# or with special parameters + +STDTEST_PORTABLE = \ + testflock@EXEEXT@ \ + testsock@EXEEXT@ \ + testlockperf@EXEEXT@ \ + testatomic@EXEEXT@ \ + testmutexscope@EXEEXT@ \ + testall@EXEEXT@ + +STDTEST_NONPORTABLE = \ + testshm@EXEEXT@ \ + testglobalmutex@EXEEXT@ + +OTHER_PROGRAMS = client@EXEEXT@ sendfile@EXEEXT@ \ + server@EXEEXT@ + +PROGRAMS = $(STDTEST_PORTABLE) $(STDTEST_NONPORTABLE) $(OTHER_PROGRAMS) + +TARGETS = $(PROGRAMS) + +# bring in rules.mk for standard functionality +@INCLUDE_RULES@ + +LOCAL_LIBS=../lib@APR_LIBNAME@.la + +CLEAN_TARGETS = testfile.tmp mod_test.slo proc_child@EXEEXT@ occhild@EXEEXT@ \ +readchild@EXEEXT@ + +INCDIR=../include +INCLUDES=-I$(INCDIR) + +check: $(STDTEST_PORTABLE) $(STDTEST_NONPORTABLE) + for prog in $(STDTEST_PORTABLE) $(STDTEST_NONPORTABLE); do \ + ./$$prog; \ + if test $$? = 255; then \ + echo "$$prog failed"; \ + break; \ + fi; \ + done + +testflock@EXEEXT@: testflock.lo $(LOCAL_LIBS) + $(LINK) testflock.lo $(LOCAL_LIBS) $(ALL_LIBS) + +occhild@EXEEXT@: occhild.lo $(LOCAL_LIBS) + $(LINK) occhild.lo $(LOCAL_LIBS) $(ALL_LIBS) + +readchild@EXEEXT@: readchild.lo $(LOCAL_LIBS) + $(LINK) readchild.lo $(LOCAL_LIBS) $(ALL_LIBS) + +proc_child@EXEEXT@: proc_child.lo $(LOCAL_LIBS) + $(LINK) proc_child.lo $(LOCAL_LIBS) $(ALL_LIBS) + +# FIXME: -prefer-pic is only supported with libtool-1.4+ +mod_test.slo: $(srcdir)/mod_test.c + $(LIBTOOL) --mode=compile $(COMPILE) -prefer-pic -c $(srcdir)/mod_test.c && touch $@ + +mod_test.la: mod_test.slo $(LOCAL_LIBS) + $(LIBTOOL) --mode=link $(COMPILE) -rpath `pwd` -avoid-version -module mod_test.lo $(LT_LDFLAGS) $(ALL_LDFLAGS) -o $@ + +libmod_test.la: mod_test.slo $(LOCAL_LIBS) + $(LIBTOOL) --mode=link $(COMPILE) -rpath `pwd` -avoid-version mod_test.lo $(LT_LDFLAGS) $(ALL_LDFLAGS) -o $@ + +testlockperf@EXEEXT@: testlockperf.lo $(LOCAL_LIBS) + $(LINK) testlockperf.lo $(LOCAL_LIBS) $(ALL_LIBS) + +testsock@EXEEXT@: testsock.lo client@EXEEXT@ server@EXEEXT@ sendfile@EXEEXT@ $(LOCAL_LIBS) + $(LINK) testsock.lo $(LOCAL_LIBS) $(ALL_LIBS) + +client@EXEEXT@: client.lo $(LOCAL_LIBS) + $(LINK) client.lo $(LOCAL_LIBS) $(ALL_LIBS) + +server@EXEEXT@: server.lo $(LOCAL_LIBS) + $(LINK) server.lo $(LOCAL_LIBS) $(ALL_LIBS) + +sendfile@EXEEXT@: sendfile.lo $(LOCAL_LIBS) + $(LINK) sendfile.lo $(LOCAL_LIBS) $(ALL_LIBS) + +testshm@EXEEXT@: testshm.lo $(LOCAL_LIBS) testshmproducer@EXEEXT@ testshmconsumer@EXEEXT@ + $(LINK) testshm.lo $(LOCAL_LIBS) $(ALL_LIBS) + +testshmproducer@EXEEXT@: testshmproducer.lo $(LOCAL_LIBS) + $(LINK) testshmproducer.lo $(LOCAL_LIBS) $(ALL_LIBS) + +testshmconsumer@EXEEXT@: testshmconsumer.lo $(LOCAL_LIBS) + $(LINK) testshmconsumer.lo $(LOCAL_LIBS) $(ALL_LIBS) + +testprocmutex@EXEEXT@: testprocmutex.lo $(LOCAL_LIBS) + $(LINK) testprocmutex.lo $(LOCAL_LIBS) $(ALL_LIBS) + +testglobalmutex@EXEEXT@: testglobalmutex.lo $(LOCAL_LIBS) + $(LINK) testglobalmutex.lo $(LOCAL_LIBS) $(ALL_LIBS) + +testatomic@EXEEXT@: testatomic.lo $(LOCAL_LIBS) + $(LINK) testatomic.lo $(LOCAL_LIBS) $(ALL_LIBS) + +testmutexscope@EXEEXT@: testmutexscope.lo $(LOCAL_LIBS) + $(LINK) testmutexscope.lo $(LOCAL_LIBS) $(ALL_LIBS) + +TESTS = testall.lo testtime.lo teststr.lo testvsn.lo testipsub.lo \ + testmmap.lo testud.lo testtable.lo testsleep.lo testpools.lo \ + testfmt.lo testfile.lo testdir.lo testfileinfo.lo testrand.lo \ + testdso.lo testoc.lo testdup.lo testsockets.lo testproc.lo \ + testpoll.lo testlock.lo testsockopt.lo testpipe.lo testthread.lo \ + testhash.lo testargs.lo testnames.lo testuser.lo testpath.lo \ + testenv.lo testprocmutex.lo + +testall: $(TESTS) mod_test.la libmod_test.la occhild@EXEEXT@ \ + readchild@EXEEXT@ CuTest.lo proc_child@EXEEXT@ $(LOCAL_LIBS) + $(LINK) $(TESTS) CuTest.lo $(LOCAL_LIBS) $(ALL_LIBS) + + +# DO NOT REMOVE diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/Makefile.win b/rubbos/app/httpd-2.0.64/srclib/apr/test/Makefile.win new file mode 100644 index 00000000..bdedc4d4 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/Makefile.win @@ -0,0 +1,113 @@ + +LINK=link /nologo + +NONPORTABLE = \ + testshm.exe \ + testglobalmutex.exe + +PROGRAMS = \ + client.exe \ + sendfile.exe \ + server.exe \ + proc_child.exe \ + occhild.exe \ + readchild.exe \ + testflock.exe \ + testsock.exe \ + testlockperf.exe \ + testshmproducer.exe \ + testshmconsumer.exe \ + testatomic.exe \ + testmutexscope.exe \ + testall.exe \ + mod_test.so + + +TARGETS = $(PROGRAMS) + +LOCAL_LIBS=..\LibD\apr.lib +ALL_LIBS=kernel32.lib advapi32.lib ws2_32.lib mswsock.lib ole32.lib shell32.lib rpcrt4.lib + +CLEAN_TARGETS = mod_test.lib mod_test.exp + +INCDIR=../include +INCLUDES=/I "$(INCDIR)" + +all: $(TARGETS) + +clean: + -del $(CLEAN_TARGETS) $(PROGRAMS) *.obj *.pdb *.ilk 2>NUL + +.c.obj: + cl /nologo /c /MDd /W3 /EHsc /Zi /Od /DWIN32 /D_DEBUG /D_WINDOWS /DAPR_DECLARE_STATIC $(INCLUDES) $< + +testflock.exe: testflock.obj $(LOCAL_LIBS) + $(LINK) testflock.obj $(LOCAL_LIBS) $(ALL_LIBS) + +occhild.exe: occhild.obj $(LOCAL_LIBS) + $(LINK) occhild.obj $(LOCAL_LIBS) $(ALL_LIBS) + +readchild.exe: readchild.obj $(LOCAL_LIBS) + $(LINK) readchild.obj $(LOCAL_LIBS) $(ALL_LIBS) + +proc_child.exe: proc_child.obj $(LOCAL_LIBS) + $(LINK) /debug /subsystem:console \ + proc_child.obj $(LOCAL_LIBS) $(ALL_LIBS) + +# FIXME: This is BS ... we should deal with namespace decoration within the +# apr_dso_sym() function or within the test (take y'r pick) since many platforms +# have decoration and decoration issues. +mod_test.so: mod_test.obj + $(LINK) mod_test.obj /dll /out:mod_test.so $(LOCAL_LIBS) $(ALL_LIBS) \ + /export:print_hello /export:count_reps + +testlockperf.exe: testlockperf.obj $(LOCAL_LIBS) + $(LINK) testlockperf.obj $(LOCAL_LIBS) $(ALL_LIBS) + +testsock.exe: testsock.obj client.exe server.exe sendfile.exe $(LOCAL_LIBS) + $(LINK) testsock.obj $(LOCAL_LIBS) $(ALL_LIBS) + +client.exe: client.obj $(LOCAL_LIBS) + $(LINK) client.obj $(LOCAL_LIBS) $(ALL_LIBS) + +server.exe: server.obj $(LOCAL_LIBS) + $(LINK) server.obj $(LOCAL_LIBS) $(ALL_LIBS) + +sendfile.exe: sendfile.obj $(LOCAL_LIBS) + $(LINK) sendfile.obj $(LOCAL_LIBS) $(ALL_LIBS) + +testshm.exe: testshm.obj $(LOCAL_LIBS) testshmproducer.exe testshmconsumer.exe + $(LINK) testshm.obj $(LOCAL_LIBS) $(ALL_LIBS) + +testshmproducer.exe: testshmproducer.obj $(LOCAL_LIBS) + $(LINK) testshmproducer.obj $(LOCAL_LIBS) $(ALL_LIBS) + +testshmconsumer.exe: testshmconsumer.obj $(LOCAL_LIBS) + $(LINK) testshmconsumer.obj $(LOCAL_LIBS) $(ALL_LIBS) + +testprocmutex.exe: testprocmutex.obj $(LOCAL_LIBS) + $(LINK) testprocmutex.obj $(LOCAL_LIBS) $(ALL_LIBS) + +testglobalmutex.exe: testglobalmutex.obj $(LOCAL_LIBS) + $(LINK) testglobalmutex.obj $(LOCAL_LIBS) $(ALL_LIBS) + +testatomic.exe: testatomic.obj $(LOCAL_LIBS) + $(LINK) testatomic.obj $(LOCAL_LIBS) $(ALL_LIBS) + +testmutexscope.exe: testmutexscope.obj $(LOCAL_LIBS) + $(LINK) testmutexscope.obj $(LOCAL_LIBS) $(ALL_LIBS) + +TESTS = testall.obj testtime.obj teststr.obj testvsn.obj testipsub.obj \ + testmmap.obj testud.obj testtable.obj testsleep.obj testpools.obj \ + testfmt.obj testfile.obj testdir.obj testfileinfo.obj testrand.obj \ + testdso.obj testoc.obj testdup.obj testsockets.obj testproc.obj \ + testpoll.obj testlock.obj testsockopt.obj testpipe.obj testthread.obj \ + testhash.obj testargs.obj testnames.obj testuser.obj testpath.obj \ + testenv.obj testprocmutex.obj + +testall.exe: $(TESTS) CuTest.obj $(LOCAL_LIBS) + $(LINK) /debug /subsystem:console $(TESTS) CuTest.obj \ + $(LOCAL_LIBS) $(ALL_LIBS) + + +# DO NOT REMOVE diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/NWGNUaprtest b/rubbos/app/httpd-2.0.64/srclib/apr/test/NWGNUaprtest new file mode 100644 index 00000000..76d1ca4c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/NWGNUaprtest @@ -0,0 +1,287 @@ +# +# Make sure all needed macro's are defined +# + +# +# Get the 'head' of the build environment if necessary. This includes default +# targets and paths to tools +# + +ifndef EnvironmentDefined +include $(APR_WORK)\build\NWGNUhead.inc +endif + +# +# These directories will be at the beginning of the include list, followed by +# INCDIRS +# +XINCDIRS += \ + $(APR_WORK)/include \ + $(APR_WORK)/include/arch/NetWare \ + $(EOLIST) + +# +# These flags will come after CFLAGS +# +XCFLAGS += \ + $(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 = aprtest +# +# This is used by the link '-desc ' directive. +# If left blank, NLM_NAME will be used. +# +NLM_DESCRIPTION = NLM is to test the apr layer + +# +# This is used by the '-threadname' directive. If left blank, +# NLM_NAME Thread will be used. +# +NLM_THREAD_NAME = $(NLM_NAME) Thread + +# +# This is used by the '-screenname' directive. If left blank, +# 'Apache for NetWare' Thread will be used. +# +NLM_SCREEN_NAME = $(NLM_NAME) + +# +# If this is specified, it will override VERSION value in +# $(APR_WORK)\build\NWGNUenvironment.inc +# +NLM_VERSION = + +# +# If this is specified, it will override the default of 64K +# +NLM_STACK_SIZE = 524288 + +# +# If this is specified it will be used by the link '-entry' directive +# +NLM_ENTRY_SYM = _LibCPrelude + +# +# If this is specified it will be used by the link '-exit' directive +# +NLM_EXIT_SYM = _LibCPostlude + +# +# If this is specified it will be used by the link '-check' directive +# +NLM_CHECK_SYM = + +# +# If this is specified it will be used by the link '-flags' directive +# +NLM_FLAGS = AUTOUNLOAD, PSEUDOPREEMPTION + +# +# If this is specified it will be linked in with the XDCData option in the def +# file instead of the default of $(APR)/misc/netware/apache.xdc. XDCData can +# be disabled by setting APACHE_UNIPROC in the environment +# +XDCDATA = + +# +# Declare all target files (you must add your files here) +# + +# +# If there is an NLM target, put it here +# +TARGET_nlm = \ + $(OBJDIR)/aprtest.nlm \ + $(EOLIST) + +# +# If there is an LIB target, put it here +# +TARGET_lib = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the NLM target above. +# Paths must all use the '/' character +# +FILES_nlm_objs = \ + $(OBJDIR)/CuTest.o \ + $(OBJDIR)/testall.o \ + $(OBJDIR)/testargs.o \ + $(OBJDIR)/testdir.o \ + $(OBJDIR)/testdup.o \ + $(OBJDIR)/testdso.o \ + $(OBJDIR)/testenv.o \ + $(OBJDIR)/testfileinfo.o \ + $(OBJDIR)/testfile.o \ + $(OBJDIR)/testfmt.o \ + $(OBJDIR)/testhash.o \ + $(OBJDIR)/testipsub.o \ + $(OBJDIR)/testlock.o \ + $(OBJDIR)/testmmap.o \ + $(OBJDIR)/testnames.o \ + $(OBJDIR)/testoc.o \ + $(OBJDIR)/testpath.o \ + $(OBJDIR)/testpoll.o \ + $(OBJDIR)/testpools.o \ + $(OBJDIR)/testproc.o \ + $(OBJDIR)/testprocmutex.o \ + $(OBJDIR)/testrand.o \ + $(OBJDIR)/testsleep.o \ + $(OBJDIR)/testsockets.o \ + $(OBJDIR)/testsockopt.o \ + $(OBJDIR)/teststr.o \ + $(OBJDIR)/testthread.o \ + $(OBJDIR)/testtime.o \ + $(OBJDIR)/testtable.o \ + $(OBJDIR)/testud.o \ + $(OBJDIR)/testuser.o \ + $(OBJDIR)/testvsn.o \ + $(OBJDIR)/nw_misc.o \ + $(OBJDIR)/testpipe.o \ + $(EOLIST) + +# Pending tests + +# +# 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 = \ + libcpre.o \ + $(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 = \ + Libc \ + APRLIB \ + $(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 the default copyright. +# +FILE_nlm_copyright = + +# +# Any additional imports go here +# +FILES_nlm_Ximports = \ + @libc.imp \ + @$(APR)/aprlib.imp \ + $(EOLIST) + +# +# Any symbols exported to here +# +FILES_nlm_exports = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the LIB target above. +# Paths must all use the '/' character +# +FILES_lib_objs = \ + $(EOLIST) + +# +# 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 $(APR_WORK)\build\NWGNUhead.inc for examples) +# +install :: nlms FORCE + +# +# Any specialized rules here +# + + +# +# Include the 'tail' makefile that has targets that depend on variables defined +# in this makefile +# + +include $(APR_WORK)\build\NWGNUtail.inc + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/NWGNUmakefile b/rubbos/app/httpd-2.0.64/srclib/apr/test/NWGNUmakefile new file mode 100644 index 00000000..c63714a5 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/NWGNUmakefile @@ -0,0 +1,260 @@ +# +# Declare the sub-directories to be built here +# + +SUBDIRS = \ + $(EOLIST) + +# +# Get the 'head' of the build environment. This includes default targets and +# paths to tools +# + +include $(APR_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_WORK)/include \ + $(APR_WORK)/include/arch/NetWare \ + $(EOLIST) + +# +# These flags will come after CFLAGS +# +XCFLAGS += \ + $(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 = + +# +# This is used by the link '-desc ' directive. +# If left blank, NLM_NAME will be used. +# +NLM_DESCRIPTION = NLM is to test the apr layer + +# +# This is used by the '-threadname' directive. If left blank, +# NLM_NAME Thread will be used. +# +NLM_THREAD_NAME = + +# +# This is used by the '-screenname' directive. If left blank, +# 'Apache for NetWare' Thread will be used. +# +NLM_SCREEN_NAME = + +# +# If this is specified, it will override VERSION value in +# $(APR_WORK)\build\NWGNUenvironment.inc +# +NLM_VERSION = + +# +# If this is specified, it will override the default of 64K +# +NLM_STACK_SIZE = + +# +# 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 = + +# +# If this is specified it will be used by the link '-flags' directive +# +NLM_FLAGS = + +# +# If this is specified it will be linked in with the XDCData option in the def +# file instead of the default of $(APR)/misc/netware/apache.xdc. XDCData can +# be disabled by setting APACHE_UNIPROC in the environment +# +XDCDATA = + +# +# Declare all target files (you must add your files here) +# + +# +# If there is an NLM target, put it here +# +TARGET_nlm = \ + $(OBJDIR)/aprtest.nlm \ + $(OBJDIR)/mod_test.nlm \ + $(OBJDIR)/proc_child.nlm \ + $(OBJDIR)/testatmc.nlm \ + $(EOLIST) +# +# If there is an LIB target, put it here +# +TARGET_lib = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the NLM target above. +# Paths must all use the '/' character +# +FILES_nlm_objs = \ + $(EOLIST) + +# +# 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 = \ + $(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 \ + $(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 the default copyright. +# +FILE_nlm_copyright = + +# +# Any additional imports go here +# +FILES_nlm_Ximports = \ + $(EOLIST) + +# +# Any symbols exported to here +# +FILES_nlm_exports = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the LIB target above. +# Paths must all use the '/' character +# +FILES_lib_objs = \ + $(EOLIST) + +# +# 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 $(APR_WORK)\build\NWGNUhead.inc for examples) +# +install :: nlms FORCE + copy $(OBJDIR)\*.nlm $(INSTALL)\Apache2 + +# +# Any specialized rules here +# + +# +# Include the 'tail' makefile that has targets that depend on variables defined +# in this makefile +# + +include $(APR_WORK)\build\NWGNUtail.inc + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/NWGNUmod_test b/rubbos/app/httpd-2.0.64/srclib/apr/test/NWGNUmod_test new file mode 100644 index 00000000..a454ef0c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/NWGNUmod_test @@ -0,0 +1,254 @@ +# +# Make sure all needed macro's are defined +# + +# +# Get the 'head' of the build environment if necessary. This includes default +# targets and paths to tools +# + +ifndef EnvironmentDefined +include $(APR_WORK)\build\NWGNUhead.inc +endif + +# +# These directories will be at the beginning of the include list, followed by +# INCDIRS +# +XINCDIRS += \ + $(APR_WORK)/include \ + $(APR_WORK)/include/arch/NetWare \ + $(EOLIST) + +# +# These flags will come after CFLAGS +# +XCFLAGS += \ + $(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 = mod_test + +# +# This is used by the link '-desc ' directive. +# If left blank, NLM_NAME will be used. +# +NLM_DESCRIPTION = DSO NLM to test the apr DSO loading layer + +# +# This is used by the '-threadname' directive. If left blank, +# NLM_NAME Thread will be used. +# +NLM_THREAD_NAME = $(NLM_NAME) Thread + +# +# This is used by the '-screenname' directive. If left blank, +# 'Apache for NetWare' Thread will be used. +# +NLM_SCREEN_NAME = DEFAULT + +# +# If this is specified, it will override VERSION value in +# $(APR_WORK)\build\NWGNUenvironment.inc +# +NLM_VERSION = + +# +# If this is specified, it will override the default of 64K +# +NLM_STACK_SIZE = + +# +# If this is specified it will be used by the link '-entry' directive +# +NLM_ENTRY_SYM = _LibCPrelude + +# +# If this is specified it will be used by the link '-exit' directive +# +NLM_EXIT_SYM = _LibCPostlude + +# +# If this is specified it will be used by the link '-check' directive +# +NLM_CHECK_SYM = + +# +# If this is specified it will be used by the link '-flags' directive +# +NLM_FLAGS = AUTOUNLOAD, PSEUDOPREEMPTION + +# +# If this is specified it will be linked in with the XDCData option in the def +# file instead of the default of $(APR)/misc/netware/apache.xdc. XDCData can +# be disabled by setting APACHE_UNIPROC in the environment +# +XDCDATA = + +# +# Declare all target files (you must add your files here) +# + +# +# If there is an NLM target, put it here +# +TARGET_nlm = \ + $(OBJDIR)/mod_test.nlm \ + $(EOLIST) + +# +# If there is an LIB target, put it here +# +TARGET_lib = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the NLM target above. +# Paths must all use the '/' character +# +FILES_nlm_objs = \ + $(OBJDIR)/mod_test.o \ + $(EOLIST) + +# +# 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 = \ + libcpre.o \ + $(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 the default copyright. +# +FILE_nlm_copyright = + +# +# Any additional imports go here +# +FILES_nlm_Ximports = \ + @$(APR)/aprlib.imp \ + @libc.imp \ + $(EOLIST) + +# +# Any symbols exported to here +# +FILES_nlm_exports = \ + print_hello \ + count_reps \ + $(EOLIST) + +# +# These are the OBJ files needed to create the LIB target above. +# Paths must all use the '/' character +# +FILES_lib_objs = \ + $(EOLIST) + +# +# 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 $(APR_WORK)\build\NWGNUhead.inc for examples) +# +install :: nlms FORCE + +# +# Any specialized rules here +# + +# +# Include the 'tail' makefile that has targets that depend on variables defined +# in this makefile +# + +include $(APR_WORK)\build\NWGNUtail.inc + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/NWGNUproc_child b/rubbos/app/httpd-2.0.64/srclib/apr/test/NWGNUproc_child new file mode 100644 index 00000000..090bbddf --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/NWGNUproc_child @@ -0,0 +1,252 @@ +# +# Make sure all needed macro's are defined +# + +# +# Get the 'head' of the build environment if necessary. This includes default +# targets and paths to tools +# + +ifndef EnvironmentDefined +include $(APR_WORK)\build\NWGNUhead.inc +endif + +# +# These directories will be at the beginning of the include list, followed by +# INCDIRS +# +XINCDIRS += \ + $(APR_WORK)/include \ + $(APR_WORK)/include/arch/NetWare \ + $(EOLIST) + +# +# These flags will come after CFLAGS +# +XCFLAGS += \ + $(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 = proc_child + +# +# This is used by the link '-desc ' directive. +# If left blank, NLM_NAME will be used. +# +NLM_DESCRIPTION = child NLM to test the proc layer + +# +# This is used by the '-threadname' directive. If left blank, +# NLM_NAME Thread will be used. +# +NLM_THREAD_NAME = $(NLM_NAME) Thread + +# +# This is used by the '-screenname' directive. If left blank, +# 'Apache for NetWare' Thread will be used. +# +NLM_SCREEN_NAME = DEFAULT + +# +# If this is specified, it will override VERSION value in +# $(APR_WORK)\build\NWGNUenvironment.inc +# +NLM_VERSION = + +# +# If this is specified, it will override the default of 64K +# +NLM_STACK_SIZE = + +# +# If this is specified it will be used by the link '-entry' directive +# +NLM_ENTRY_SYM = _LibCPrelude + +# +# If this is specified it will be used by the link '-exit' directive +# +NLM_EXIT_SYM = _LibCPostlude + +# +# If this is specified it will be used by the link '-check' directive +# +NLM_CHECK_SYM = + +# +# If this is specified it will be used by the link '-flags' directive +# +NLM_FLAGS = AUTOUNLOAD, PSEUDOPREEMPTION, MULTIPLE + +# +# If this is specified it will be linked in with the XDCData option in the def +# file instead of the default of $(APR)/misc/netware/apache.xdc. XDCData can +# be disabled by setting APACHE_UNIPROC in the environment +# +XDCDATA = + +# +# Declare all target files (you must add your files here) +# + +# +# If there is an NLM target, put it here +# +TARGET_nlm = \ + $(OBJDIR)/proc_child.nlm \ + $(EOLIST) + +# +# If there is an LIB target, put it here +# +TARGET_lib = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the NLM target above. +# Paths must all use the '/' character +# +FILES_nlm_objs = \ + $(OBJDIR)/proc_child.o \ + $(EOLIST) + +# +# 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 = \ + libcpre.o \ + $(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 the default copyright. +# +FILE_nlm_copyright = + +# +# Any additional imports go here +# +FILES_nlm_Ximports = \ + @$(APR)/aprlib.imp \ + @libc.imp \ + $(EOLIST) + +# +# Any symbols exported to here +# +FILES_nlm_exports = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the LIB target above. +# Paths must all use the '/' character +# +FILES_lib_objs = \ + $(EOLIST) + +# +# 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 $(APR_WORK)\build\NWGNUhead.inc for examples) +# +install :: nlms FORCE + +# +# Any specialized rules here +# + +# +# Include the 'tail' makefile that has targets that depend on variables defined +# in this makefile +# + +include $(APR_WORK)\build\NWGNUtail.inc + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/NWGNUtestatmc b/rubbos/app/httpd-2.0.64/srclib/apr/test/NWGNUtestatmc new file mode 100644 index 00000000..e24bf36a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/NWGNUtestatmc @@ -0,0 +1,255 @@ +# +# Make sure all needed macro's are defined +# + +# +# Get the 'head' of the build environment if necessary. This includes default +# targets and paths to tools +# + +ifndef EnvironmentDefined +include $(APR_WORK)\build\NWGNUhead.inc +endif + +# +# These directories will be at the beginning of the include list, followed by +# INCDIRS +# +XINCDIRS += \ + $(APR_WORK)/include \ + $(APR_WORK)/include/arch/NetWare \ + $(EOLIST) + +# +# These flags will come after CFLAGS +# +XCFLAGS += \ + $(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 = testatmc +# +# This is used by the link '-desc ' directive. +# If left blank, NLM_NAME will be used. +# +NLM_DESCRIPTION = NLM is to test the atomic functions + +# +# This is used by the '-threadname' directive. If left blank, +# NLM_NAME Thread will be used. +# +NLM_THREAD_NAME = $(NLM_NAME) Thread + +# +# This is used by the '-screenname' directive. If left blank, +# 'Apache for NetWare' Thread will be used. +# +NLM_SCREEN_NAME = $(NLM_NAME) + +# +# If this is specified, it will override VERSION value in +# $(APR_WORK)\build\NWGNUenvironment.inc +# +NLM_VERSION = + +# +# If this is specified, it will override the default of 64K +# +NLM_STACK_SIZE = + +# +# If this is specified it will be used by the link '-entry' directive +# +NLM_ENTRY_SYM = _LibCPrelude + +# +# If this is specified it will be used by the link '-exit' directive +# +NLM_EXIT_SYM = _LibCPostlude + +# +# If this is specified it will be used by the link '-check' directive +# +NLM_CHECK_SYM = + +# +# If this is specified it will be used by the link '-flags' directive +# +NLM_FLAGS = AUTOUNLOAD, PSEUDOPREEMPTION + +# +# If this is specified it will be linked in with the XDCData option in the def +# file instead of the default of $(APR)/misc/netware/apache.xdc. XDCData can +# be disabled by setting APACHE_UNIPROC in the environment +# +XDCDATA = + +# +# Declare all target files (you must add your files here) +# + +# +# If there is an NLM target, put it here +# +TARGET_nlm = \ + $(OBJDIR)/testatmc.nlm \ + $(EOLIST) + +# +# If there is an LIB target, put it here +# +TARGET_lib = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the NLM target above. +# Paths must all use the '/' character +# +FILES_nlm_objs = \ + $(OBJDIR)/testatomic.o \ + $(OBJDIR)/nw_misc.o \ + $(EOLIST) + +# Pending tests + +# +# 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 = \ + libcpre.o \ + $(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 = \ + Libc \ + APRLIB \ + $(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 the default copyright. +# +FILE_nlm_copyright = + +# +# Any additional imports go here +# +FILES_nlm_Ximports = \ + @libc.imp \ + @$(APR)/aprlib.imp \ + $(EOLIST) + +# +# Any symbols exported to here +# +FILES_nlm_exports = \ + $(EOLIST) + +# +# These are the OBJ files needed to create the LIB target above. +# Paths must all use the '/' character +# +FILES_lib_objs = \ + $(EOLIST) + +# +# 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 $(APR_WORK)\build\NWGNUhead.inc for examples) +# +install :: nlms FORCE + +# +# Any specialized rules here +# + + +# +# Include the 'tail' makefile that has targets that depend on variables defined +# in this makefile +# + +include $(APR_WORK)\build\NWGNUtail.inc + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/README b/rubbos/app/httpd-2.0.64/srclib/apr/test/README new file mode 100644 index 00000000..42ecdd47 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/README @@ -0,0 +1,248 @@ +Writing APR tests + +All APR tests should be executable in 2 ways, as an individual program, or +as a part of the full test suite. The full test suite is controlled with +the testall program. At the beginning of the testall.c file, there is an +array of functions called tests. The testall program loops through this +array calling each function. Each function returns a CuSuite variable, which +is then added to the SuiteList. Once all Suites have been added, the SuiteList +is executed, and the output is printed to the screen. All functions in the +array should follow the same basic format: + +The Full Suite +-------------- + +/* The driver function. This must return a CuSuite variable, which will + * then be used to actually run the tests. Essentially, all Suites are a + * collection of tests. The driver will take each Suite, and put it in a + * SuiteList, which is a collection of Suites. + */ +CuSuite *testtime(void) +{ + /* The actual suite, this must be created for each test program. Please + * give it a useful name, that will inform the user of the feature being + * tested. + */ + CuSuite *suite = CuSuiteNew("Test Time"); + + /* Each function must be added to the suite. Each function represents + * a single test. It is possible to test multiple features in a single + * function, although no tests currently do that. + */ + SUITE_ADD_TEST(suite, test_now); + SUITE_ADD_TEST(suite, test_gmtstr); + SUITE_ADD_TEST(suite, test_localstr); + SUITE_ADD_TEST(suite, test_exp_get_gmt); + SUITE_ADD_TEST(suite, test_exp_get_lt); + SUITE_ADD_TEST(suite, test_imp_gmt); + SUITE_ADD_TEST(suite, test_rfcstr); + SUITE_ADD_TEST(suite, test_ctime); + SUITE_ADD_TEST(suite, test_strftime); + SUITE_ADD_TEST(suite, test_strftimesmall); + SUITE_ADD_TEST(suite, test_exp_tz); + SUITE_ADD_TEST(suite, test_strftimeoffset); + + /* You must return the suite so that the driver knows which suites to + * run. + */ + return suite; +} + +Building the full driver +------------------------ + +All you need to do to build the full driver is run: + + make testall + +To run it, run: + + ./testall + +Caveats +------- + +Currently, some tests are known to fail in certain circumstances: + + * 'testpoll' opens 64 sockets concurrently; ensure that resource +limits are high enough to allow this (using ulimit or limit); for +instance, Solaris <=2.7 and HP-UX 11.00 both set the limit to <=64 by +default + + * 'testipsub' will tickle the Solaris 8 getaddrinfo() IPv6 +bug, causing the test to hang. Configure with --disable-ipv6 if using +an unpatched Solaris 8 installation. + + * The 'testdso' tests will not work if configured with +--disable-shared since the loadable modules cannot be built. + +Running individual tests +--------------------------------- + +It is not possible to build individual tests, however it is possible to +run individual tests. When running the test suite, specify the name of the +tests that you want to run on the command line. For example: + + ./testall teststr testrand + +Will run the Strings and Random generator tests. + +Reading the test suite output +----------------------------- + +Once you run the test suite, you will get output like: + +All APR Tests: + Test Strings: .... + Test Time: ............ + +16 tests run: 16 passed, 0 failed, 0 not implemented. + +There are a couple of things to look at with this. First, if you look at the +first function in this document, you should notice that the string passed to +the CuSuiteNew function is in the output. That is why the string should +explain the feature you are testing. + +Second, this test passed completely. This is obvious in two ways. First, and +most obvious, the summary line tells you that 16 tests were run and 16 tests +passed. However, the results can also be found in the lines above. Every +'.' in the output represents a passed test. + +If a test fails, the output will look like: + +All APR Tests: + Test Strings: .... + Test Time: ..F......... + +16 tests run: 15 passed, 1 failed, 0 not implemented. + +This is not very useful, because you don't know which test failed. However, +once you know that a test failed, you can run the suite again, with the +-v option. If you do this, you will get something like: + +All APR Tests: + Test Strings: .... + Test Time: ..F......... + +16 tests run: 15 passed, 1 failed, 0 not implemented. +Failed tests: +1) test_localstr: assert failed + +In this case, we know the test_localstr function failed, and there is an +Assert in this that failed (I modified the test to fail for this document). +Now, you can look at what that test does, and why it would have failed. + +There is one other possible output for the test suite (run with -v): + +All APR Tests: + Test Strings: .... + Test Time: ..N......... + +16 tests run: 15 passed, 0 failed, 1 not implemented. + +Not Implemented tests: + +Not Implemented tests: +1) test_localstr: apr_time_exp_lt not implemented on this platform + +The 'N' means that a function has returned APR_ENOTIMPL. This should be +treated as an error, and the function should be implemented as soon as +possible. + +Adding New test Suites to the full driver +------------------------------------------- + +To add a new Suite to the full driver, you must make a couple of modifications. + +1) Edit test_apr.h, and add the prototype for the function. +2) Edit testall.c, and add the function and name to the tests array. +3) Edit Makefile.in, and add the .lo file to the testall target. + +Once those four things are done, your tests will automatically be added +to the suite. + +Writing tests +------------- + +There are a couple of rules for writing good tests for the test suite. + +1) All tests can determine for themselves if it passed or not. This means +that there is no reason for the person running the test suite to interpret +the results of the tests. +2) Never use printf to add to the output of the test suite. The suite +library should be able to print all of the information required to debug +a problem. +3) Functions should be tested with both positive and negative tests. This +means that you should test things that should both succeed and fail. +4) Just checking the return code does _NOT_ make a useful test. You must +check to determine that the test actually did what you expected it to do. + +An example test +--------------- + +Finally, we will look at a quick test: + +/* All tests are passed a CuTest variable. This is how the suite determines + * if the test succeeded or failed. + */ +static void test_localstr(CuTest *tc) +{ + apr_status_t rv; + apr_time_exp_t xt; + time_t os_now; + + rv = apr_time_exp_lt(&xt, now); + os_now = now / APR_USEC_PER_SEC; + + /* If the function can return APR_ENOTIMPL, then you should check for it. + * This allows platform implementors to know if they have to implement + * the function. + */ + if (rv == APR_ENOTIMPL) { + CuNotImpl(tc, "apr_time_exp_lt"); + } + + /* It often helps to ensure that the return code was APR_SUCESS. If it + * wasn't, then we know the test failed. + */ + CuAssertTrue(tc, rv == APR_SUCCESS); + + /* Now that we know APR thinks it worked properly, we need to check the + * output to ensure that we got what we expected. + */ + CuAssertStrEquals(tc, "2002-08-14 12:05:36.186711 -25200 [257 Sat] DST", + print_time(p, &xt)); +} + +Notice, the same test can fail for any of a number of reasons. The first +test to fail ends the test. + +CuTest +------ + +CuTest is an open source test suite written by Asim Jalis. It has been +released under the zlib/libpng license. That license can be found in the +CuTest.c and CuTest.h files. + +The version of CuTest that is included in the APR test suite has been modified +from the original distribution in the following ways: + +1) The original distribution does not have a -v flag, the details are always +printed. +2) The NotImplemented result does not exist. +3) SuiteLists do not exist. In the original distribution, you can add suites +to suites, but it just adds the tests in the first suite to the list of tests +in the original suite. The output wasn't as detailed as I wanted, so I created +SuiteLists. + +The first two modifications have been sent to the original author of CuTest, +but they have not been integrated into the base distribution. The SuiteList +changes will be sent to the original author soon. + +The modified version of CuTest is not currently in any CVS or Subversion +server. In time, it will be hosted at rkbloom.net. + +There are currently no docs for how to write tests, but the teststr and +testtime programs should give an idea of how it is done. In time, a document +should be written to define how tests are written. + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/aprtest.def b/rubbos/app/httpd-2.0.64/srclib/apr/test/aprtest.def new file mode 100644 index 00000000..bfea210d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/aprtest.def @@ -0,0 +1,3 @@ +MODULE LIBC.NLM +MODULE APRLIB.NLM + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/aprtest.dsp b/rubbos/app/httpd-2.0.64/srclib/apr/test/aprtest.dsp new file mode 100644 index 00000000..e31b898d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/aprtest.dsp @@ -0,0 +1,199 @@ +# Microsoft Developer Studio Project File - Name="aprtest" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) External Target" 0x0106 + +CFG=aprtest - 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 "aprtest.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 "aprtest.mak" CFG="aprtest - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "aprtest - Win32 Release" (based on "Win32 (x86) External Target") +!MESSAGE "aprtest - Win32 Debug" (based on "Win32 (x86) External Target") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" + +!IF "$(CFG)" == "aprtest - Win32 Release" + +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Cmd_Line "NMAKE /f Makefile" +# PROP BASE Rebuild_Opt "/a" +# PROP BASE Target_File "aprtest.exe" +# PROP BASE Bsc_Name "aprtest.bsc" +# PROP BASE Target_Dir "" +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Cmd_Line "NMAKE /f aprtest.win" +# PROP Rebuild_Opt "/a" +# PROP Bsc_Name "" +# PROP Target_Dir "" + +!ELSEIF "$(CFG)" == "aprtest - Win32 Debug" + +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Cmd_Line "NMAKE /f aprtest.mak" +# PROP BASE Rebuild_Opt "/a" +# PROP BASE Target_File "aprtest.exe" +# PROP BASE Bsc_Name "aprtest.bsc" +# PROP BASE Target_Dir "" +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Cmd_Line "NMAKE /f aprtest.win" +# PROP Rebuild_Opt "/a" +# PROP Bsc_Name "" +# PROP Target_Dir "" + +!ENDIF + +# Begin Target + +# Name "aprtest - Win32 Release" +# Name "aprtest - Win32 Debug" + +!IF "$(CFG)" == "aprtest - Win32 Release" + +!ELSEIF "$(CFG)" == "aprtest - Win32 Debug" + +!ENDIF + +# Begin Group "Sources" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\abc.c +# End Source File +# Begin Source File + +SOURCE=.\client.c +# End Source File +# Begin Source File + +SOURCE=.\mod_test.c +# End Source File +# Begin Source File + +SOURCE=.\occhild.c +# End Source File +# Begin Source File + +SOURCE=.\sendfile.c +# End Source File +# Begin Source File + +SOURCE=.\server.c +# End Source File +# Begin Source File + +SOURCE=.\testargs.c +# End Source File +# Begin Source File + +SOURCE=.\testcontext.c +# End Source File +# Begin Source File + +SOURCE=.\testdso.c +# End Source File +# Begin Source File + +SOURCE=.\testfile.c +# End Source File +# Begin Source File + +SOURCE=.\testflock.c +# End Source File +# Begin Source File + +SOURCE=.\testlock.c +# End Source File +# Begin Source File + +SOURCE=.\testmmap.c +# End Source File +# Begin Source File + +SOURCE=.\testnames.c +# End Source File +# Begin Source File + +SOURCE=.\testoc.c +# End Source File +# Begin Source File + +SOURCE=.\testpath.c +# End Source File +# Begin Source File + +SOURCE=.\testpipe.c +# End Source File +# Begin Source File + +SOURCE=.\testproc.c +# End Source File +# Begin Source File + +SOURCE=.\testshm.c +# End Source File +# Begin Source File + +SOURCE=.\testsock.c +# End Source File +# Begin Source File + +SOURCE=.\testthread.c +# End Source File +# Begin Source File + +SOURCE=.\testtime.c +# End Source File +# Begin Source File + +SOURCE=.\testucs.c +# End Source File +# Begin Source File + +SOURCE=.\testuser.c +# End Source File +# Begin Source File + +SOURCE=.\testuuid.c +# End Source File +# End Group +# Begin Source File + +SOURCE=.\aprtest.win +# End Source File +# Begin Source File + +SOURCE=.\Makefile +# End Source File +# Begin Source File + +SOURCE=.\Makefile.in +# End Source File +# Begin Source File + +SOURCE=.\MakeWin32Make.awk +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/aprtest.h b/rubbos/app/httpd-2.0.64/srclib/apr/test/aprtest.h new file mode 100644 index 00000000..9da542b3 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/aprtest.h @@ -0,0 +1,52 @@ +/* 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. + */ + +#include "apr_errno.h" +#include "apr_general.h" +#include "apr_strings.h" + +#ifndef APR_TEST_PREFIX +#define APR_TEST_PREFIX "" +#endif + +#define APR_TEST_BEGIN(rv, desc, op) \ + fprintf(stdout, "%s%.*s ", APR_TEST_PREFIX desc, \ + strlen(desc) < 37 ? (int)(40 - strlen(desc)) : 3, \ + "........................................"); \ + APR_TEST_MORE(rv, op) + +#define APR_TEST_MORE(rv, op) \ + if ((rv = (op)) != APR_SUCCESS) { \ + char msgbuf[256]; \ + fprintf (stdout, "Failed\n"); \ + fprintf (stderr, "Error (%d): %s\n%s", rv, #op, \ + apr_strerror(rv, msgbuf, sizeof(msgbuf))); \ + exit(-1); } + +#define APR_TEST_END(rv, op) \ + APR_TEST_MORE(rv, op) \ + fprintf(stdout, "OK\n"); + +#define APR_TEST_SUCCESS(rv, desc, op) \ + APR_TEST_BEGIN(rv, desc, op) \ + fprintf(stdout, "OK\n"); + +#define APR_TEST_INITIALIZE(rv, pool) \ + APR_TEST_SUCCESS(rv, "Initializing", apr_initialize()); \ + atexit(apr_terminate); \ + APR_TEST_SUCCESS(rv, "Creating context", \ + apr_pool_create(&pool, NULL)); + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/aprtest.win b/rubbos/app/httpd-2.0.64/srclib/apr/test/aprtest.win new file mode 100644 index 00000000..85ad5b4d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/aprtest.win @@ -0,0 +1,18 @@ +# Note: +# +# You may need to modify the configuration of Build - Options - Directories +# for the Executable path to include the perl interpreter within DevStudio. +# E.g. add c:\program files\perl\bin to the list of directories + +!IF "$(TARGET)" == "" +TARGET=ALL +!ENDIF + +$(TARGET): Makefile + $(MAKE) /nologo /f Makefile $(TARGET) + +Makefile: Makefile.in MakeWin32Make.awk + awk -f MakeWin32Make.awk Makefile + +clean: + del Makefile *.obj *.exe *.idb *.pdb diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/client.c b/rubbos/app/httpd-2.0.64/srclib/apr/test/client.c new file mode 100644 index 00000000..bab7fe59 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/client.c @@ -0,0 +1,153 @@ +/* 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. + */ + +#include +#include "apr_network_io.h" +#include "apr_errno.h" +#include "apr_general.h" +#include + +#define STRLEN 15 + +int main(int argc, char *argv[]) +{ + apr_pool_t *context; + apr_socket_t *sock; + apr_size_t length; + apr_status_t stat; + char datasend[STRLEN] = "Send data test"; + char datarecv[STRLEN]; + char msgbuf[80]; + char *local_ipaddr, *remote_ipaddr; + char *dest = "127.0.0.1"; + apr_port_t local_port, remote_port; + apr_interval_time_t timeout = apr_time_from_sec(2); + apr_sockaddr_t *local_sa, *remote_sa; + + setbuf(stdout, NULL); + if (argc > 1) { + dest = argv[1]; + } + + if (argc > 2) { + timeout = atoi(argv[2]); + } + + fprintf(stdout, "Initializing........."); + if (apr_initialize() != APR_SUCCESS) { + fprintf(stderr, "Something went wrong\n"); + exit(-1); + } + fprintf(stdout, "OK\n"); + atexit(apr_terminate); + + fprintf(stdout, "Creating context......."); + if (apr_pool_create(&context, NULL) != APR_SUCCESS) { + fprintf(stderr, "Something went wrong\n"); + exit(-1); + } + fprintf(stdout, "OK\n"); + + fprintf(stdout,"\tClient: Making socket address..............."); + if ((stat = apr_sockaddr_info_get(&remote_sa, dest, APR_UNSPEC, 8021, 0, context)) + != APR_SUCCESS) { + fprintf(stdout, "Failed!\n"); + fprintf(stdout, "Address resolution failed for %s: %s\n", + dest, apr_strerror(stat, msgbuf, sizeof(msgbuf))); + exit(-1); + } + fprintf(stdout,"OK\n"); + + fprintf(stdout, "\tClient: Creating new socket......."); + if (apr_socket_create(&sock, remote_sa->family, SOCK_STREAM, + context) != APR_SUCCESS) { + fprintf(stderr, "Couldn't create socket\n"); + exit(-1); + } + fprintf(stdout, "OK\n"); + + fprintf(stdout, "\tClient: Setting socket timeout......."); + stat = apr_socket_timeout_set(sock, timeout); + if (stat) { + fprintf(stderr, "Problem setting timeout: %d\n", stat); + exit(-1); + } + fprintf(stdout, "OK\n"); + + fprintf(stdout, "\tClient: Connecting to socket......."); + + stat = apr_socket_connect(sock, remote_sa); + + if (stat != APR_SUCCESS) { + apr_socket_close(sock); + fprintf(stderr, "Could not connect: %s (%d)\n", + apr_strerror(stat, msgbuf, sizeof(msgbuf)), stat); + fflush(stderr); + exit(-1); + } + fprintf(stdout, "OK\n"); + + apr_socket_addr_get(&remote_sa, APR_REMOTE, sock); + apr_sockaddr_ip_get(&remote_ipaddr, remote_sa); + apr_sockaddr_port_get(&remote_port, remote_sa); + apr_socket_addr_get(&local_sa, APR_LOCAL, sock); + apr_sockaddr_ip_get(&local_ipaddr, local_sa); + apr_sockaddr_port_get(&local_port, local_sa); + fprintf(stdout, "\tClient socket: %s:%u -> %s:%u\n", local_ipaddr, local_port, remote_ipaddr, remote_port); + + fprintf(stdout, "\tClient: Trying to send data over socket......."); + length = STRLEN; + if ((stat = apr_socket_send(sock, datasend, &length) != APR_SUCCESS)) { + apr_socket_close(sock); + fprintf(stderr, "Problem sending data: %s (%d)\n", + apr_strerror(stat, msgbuf, sizeof(msgbuf)), stat); + exit(-1); + } + fprintf(stdout, "OK\n"); + + length = STRLEN; + fprintf(stdout, "\tClient: Trying to receive data over socket......."); + + if ((stat = apr_socket_recv(sock, datarecv, &length)) != APR_SUCCESS) { + apr_socket_close(sock); + fprintf(stderr, "Problem receiving data: %s (%d)\n", + apr_strerror(stat, msgbuf, sizeof(msgbuf)), stat); + exit(-1); + } + if (strcmp(datarecv, "Recv data test")) { + apr_socket_close(sock); + fprintf(stderr, "I did not receive the correct data %s\n", datarecv); + exit(-1); + } + fprintf(stdout, "OK\n"); + + fprintf(stdout, "\tClient: Shutting down socket......."); + if (apr_socket_shutdown(sock, APR_SHUTDOWN_WRITE) != APR_SUCCESS) { + apr_socket_close(sock); + fprintf(stderr, "Could not shutdown socket\n"); + exit(-1); + } + fprintf(stdout, "OK\n"); + + fprintf(stdout, "\tClient: Closing down socket......."); + if (apr_socket_close(sock) != APR_SUCCESS) { + fprintf(stderr, "Could not shutdown socket\n"); + exit(-1); + } + fprintf(stdout, "OK\n"); + + return 1; +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/data/file_datafile.txt b/rubbos/app/httpd-2.0.64/srclib/apr/test/data/file_datafile.txt new file mode 100644 index 00000000..1651a329 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/data/file_datafile.txt @@ -0,0 +1 @@ +This is the file data file. \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/data/mmap_datafile.txt b/rubbos/app/httpd-2.0.64/srclib/apr/test/data/mmap_datafile.txt new file mode 100644 index 00000000..50f47a60 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/data/mmap_datafile.txt @@ -0,0 +1 @@ +This is the MMAP data file. diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/internal/Makefile b/rubbos/app/httpd-2.0.64/srclib/apr/test/internal/Makefile new file mode 100644 index 00000000..5a790860 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/internal/Makefile @@ -0,0 +1,37 @@ +srcdir = . + + +NONPORTABLE = \ + testregex + +PROGRAMS = \ + +TARGETS = $(PROGRAMS) $(NONPORTABLE) + +# bring in rules.mk for standard functionality +include /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/build/apr_rules.mk + +LOCAL_LIBS=../../libapr-${APR_MAJOR_VERSION}.la + +CLEAN_TARGETS = testregex + +INCDIR=../../include +INCLUDES=-I$(INCDIR) + +CFLAGS=$(MY_CFLAGS) + +all: $(PROGRAMS) $(NONPORTABLE) + +check: $(PROGRAMS) $(NONPORTABLE) + for prog in $(PROGRAMS) $(NONPORTABLE); do \ + ./$$prog; \ + if test $$i = 255; then \ + echo "$$prog failed"; \ + break; \ + fi \ + done + +testregex: testregex.lo $(LOCAL_LIBS) + $(LINK) testregex.lo $(LOCAL_LIBS) $(ALL_LIBS) + +# DO NOT REMOVE diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/internal/Makefile.in b/rubbos/app/httpd-2.0.64/srclib/apr/test/internal/Makefile.in new file mode 100644 index 00000000..b1f6c6a6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/internal/Makefile.in @@ -0,0 +1,37 @@ +srcdir = @srcdir@ +VPATH = @srcdir@ + +NONPORTABLE = \ + testregex@EXEEXT@ + +PROGRAMS = \ + +TARGETS = $(PROGRAMS) $(NONPORTABLE) + +# bring in rules.mk for standard functionality +@INCLUDE_RULES@ + +LOCAL_LIBS=../../lib@APR_LIBNAME@.la + +CLEAN_TARGETS = testregex@EXEEXT@ + +INCDIR=../../include +INCLUDES=-I$(INCDIR) + +CFLAGS=$(MY_CFLAGS) + +all: $(PROGRAMS) $(NONPORTABLE) + +check: $(PROGRAMS) $(NONPORTABLE) + for prog in $(PROGRAMS) $(NONPORTABLE); do \ + ./$$prog; \ + if test $$i = 255; then \ + echo "$$prog failed"; \ + break; \ + fi \ + done + +testregex@EXEEXT@: testregex.lo $(LOCAL_LIBS) + $(LINK) testregex.lo $(LOCAL_LIBS) $(ALL_LIBS) + +# DO NOT REMOVE diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/internal/testregex.c b/rubbos/app/httpd-2.0.64/srclib/apr/test/internal/testregex.c new file mode 100644 index 00000000..20dcfdeb --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/internal/testregex.c @@ -0,0 +1,91 @@ +/* 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. + */ + + +#include "apr_strings.h" +#include "apr_pools.h" +#include "apr_general.h" +#include "apr_hash.h" +#include "apr_lib.h" +#include "apr_time.h" +#include +#include +#include + +int main( int argc, char** argv) { + apr_pool_t *context; + regex_t regex; + int rc; + int i; + int iters; + apr_time_t now; + apr_time_t end; + apr_hash_t *h; + + + if (argc !=4 ) { + fprintf(stderr, "Usage %s match string #iterations\n",argv[0]); + return -1; + } + iters = atoi( argv[3]); + + apr_initialize() ; + atexit(apr_terminate); + if (apr_pool_create(&context, NULL) != APR_SUCCESS) { + fprintf(stderr, "Something went wrong\n"); + exit(-1); + } + rc = regcomp( ®ex, argv[1], REG_EXTENDED|REG_NOSUB); + + + if (rc) { + char errbuf[2000]; + regerror(rc, ®ex,errbuf,2000); + fprintf(stderr,"Couldn't compile regex ;(\n%s\n ",errbuf); + return -1; + } + if ( regexec( ®ex, argv[2], 0, NULL,0) == 0 ) { + fprintf(stderr,"Match\n"); + } + else { + fprintf(stderr,"No Match\n"); + } + now = apr_time_now(); + for (i=0;i +#include + +struct testval { + unsigned char n[8]; + wchar_t w[4]; + int nl; + int wl; +}; + +void displaynw(struct testval *f, struct testval *l) +{ + char x[80], *t = x; + int i; + for (i = 0; i < f->nl; ++i) + t += sprintf(t, "%02X ", f->n[i]); + *(t++) = '-'; + for (i = 0; i < l->nl; ++i) + t += sprintf(t, " %02X", l->n[i]); + *(t++) = ' '; + *(t++) = '='; + *(t++) = ' '; + for (i = 0; i < f->wl; ++i) + t += sprintf(t, "%04X ", f->w[i]); + *(t++) = '-'; + for (i = 0; i < l->wl; ++i) + t += sprintf(t, " %04X", l->w[i]); + puts(x); +} + +/* + * Test every possible byte value. + * If the test passes or fails at this byte value we are done. + * Otherwise iterate test_nrange again, appending another byte. + */ +void test_nrange(struct testval *p) +{ + struct testval f, l, s; + apr_status_t rc; + int success = 0; + + memcpy (&s, p, sizeof(s)); + ++s.nl; + + do { + apr_size_t nl = s.nl, wl = sizeof(s.w) / 2; + rc = apr_conv_utf8_to_ucs2(s.n, &nl, s.w, &wl); + s.wl = (sizeof(s.w) / 2) - wl; + if (!nl && rc == APR_SUCCESS) { + if (!success) { + memcpy(&f, &s, sizeof(s)); + success = -1; + } + else { + if (s.wl != l.wl + || memcmp(s.w, l.w, (s.wl - 1) * 2) != 0 + || s.w[s.wl - 1] != l.w[l.wl - 1] + 1) { + displaynw(&f, &l); + memcpy(&f, &s, sizeof(s)); + } + } + memcpy(&l, &s, sizeof(s)); + } + else { + if (success) { + displaynw(&f, &l); + success = 0; + } + if (rc == APR_INCOMPLETE) { + test_nrange(&s); + } + } + } while (++s.n[s.nl - 1]); + + if (success) { + displaynw(&f, &l); + success = 0; + } +} + +/* + * Test every possible word value. + * Once we are finished, retest every possible word value. + * if the test fails on the following null word, iterate test_nrange + * again, appending another word. + * This assures the output order of the two tests are in sync. + */ +void test_wrange(struct testval *p) +{ + struct testval f, l, s; + apr_status_t rc; + int success = 0; + + memcpy (&s, p, sizeof(s)); + ++s.wl; + + do { + apr_size_t nl = sizeof(s.n), wl = s.wl; + rc = apr_conv_ucs2_to_utf8(s.w, &wl, s.n, &nl); + s.nl = sizeof(s.n) - nl; + if (!wl && rc == APR_SUCCESS) { + if (!success) { + memcpy(&f, &s, sizeof(s)); + success = -1; + } + else { + if (s.nl != l.nl + || memcmp(s.n, l.n, s.nl - 1) != 0 + || s.n[s.nl - 1] != l.n[l.nl - 1] + 1) { + displaynw(&f, &l); + memcpy(&f, &s, sizeof(s)); + } + } + memcpy(&l, &s, sizeof(s)); + } + else { + if (success) { + displaynw(&f, &l); + success = 0; + } + } + } while (++s.w[s.wl - 1]); + + if (success) { + displaynw(&f, &l); + success = 0; + } + + do { + int wl = s.wl, nl = sizeof(s.n); + rc = apr_conv_ucs2_to_utf8(s.w, &wl, s.n, &nl); + s.nl = sizeof(s.n) - s.nl; + if (rc == APR_INCOMPLETE) { + test_wrange(&s); + } + } while (++s.w[s.wl - 1]); +} + +/* + * Syntax: testucs [w|n] + * + * If arg is not recognized, run both tests. + */ +int main(int argc, char **argv) +{ + struct testval s; + memset (&s, 0, sizeof(s)); + + if (argc < 2 || apr_tolower(*argv[1]) != 'w') { + printf ("\n\nTesting Narrow Char Ranges\n"); + test_nrange(&s); + } + if (argc < 2 || apr_tolower(*argv[1]) != 'n') { + printf ("\n\nTesting Wide Char Ranges\n"); + test_wrange(&s); + } + return 0; +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/mod_test.c b/rubbos/app/httpd-2.0.64/srclib/apr/test/mod_test.c new file mode 100644 index 00000000..2178e940 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/mod_test.c @@ -0,0 +1,32 @@ +/* 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. + */ + +#include "apr_strings.h" + +void print_hello(char str[256]); +int count_reps(int reps); + +void print_hello(char str[256]) +{ + apr_cpystrn(str, "Hello - I'm a DSO!\n", strlen("Hello - I'm a DSO!\n") + 1); +} + +int count_reps(int reps) +{ + int i = 0; + for (i = 0;i < reps; i++); + return i; +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/nw_misc.c b/rubbos/app/httpd-2.0.64/srclib/apr/test/nw_misc.c new file mode 100644 index 00000000..2f670935 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/nw_misc.c @@ -0,0 +1,15 @@ +#include +#include +#include "test_apr.h" + +void _NonAppStop( void ) +{ + if (getenv("_IN_NETWARE_BASH_") == NULL) + pressanykey(); +} + +static void test_not_impl(CuTest *tc) +{ + CuNotImpl(tc, "Test not implemented on this platform yet"); +} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/occhild.c b/rubbos/app/httpd-2.0.64/srclib/apr/test/occhild.c new file mode 100644 index 00000000..a96885d8 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/occhild.c @@ -0,0 +1,26 @@ +#include "apr.h" +#include "apr_file_io.h" +#include "apr.h" + +#if APR_HAVE_STDLIB_H +#include +#endif + +int main(void) +{ + char buf[256]; + apr_file_t *err; + apr_pool_t *p; + + apr_initialize(); + atexit(apr_terminate); + + apr_pool_create(&p, NULL); + apr_file_open_stdin(&err, p); + + while (1) { + apr_size_t length = 256; + apr_file_read(err, buf, &length); + } + exit(0); /* just to keep the compiler happy */ +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/proc_child.c b/rubbos/app/httpd-2.0.64/srclib/apr/test/proc_child.c new file mode 100644 index 00000000..405bb7f5 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/proc_child.c @@ -0,0 +1,21 @@ +#include "apr.h" +#include +#if APR_HAVE_UNISTD_H +#include +#endif +#if APR_HAVE_IO_H +#include +#endif +#include + +int main(void) +{ + char buf[256]; + apr_ssize_t bytes; + + bytes = read(STDIN_FILENO, buf, 256); + if (bytes > 0) + write(STDOUT_FILENO, buf, bytes); + + return 0; /* just to keep the compiler happy */ +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/readchild.c b/rubbos/app/httpd-2.0.64/srclib/apr/test/readchild.c new file mode 100644 index 00000000..f8443cce --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/readchild.c @@ -0,0 +1,46 @@ +/* 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. + */ + +#include + +#include "apr_file_io.h" + +int main(int argc, char *argv[]) +{ + apr_file_t *in, *out; + apr_size_t nbytes, total_bytes; + apr_pool_t *p; + char buf[128]; + apr_status_t rv; + + apr_initialize(); + atexit(apr_terminate); + apr_pool_create(&p, NULL); + + apr_file_open_stdin(&in, p); + apr_file_open_stdout(&out, p); + + total_bytes = 0; + nbytes = sizeof(buf); + while ((rv = apr_file_read(in, buf, &nbytes)) == APR_SUCCESS) { + total_bytes += nbytes; + nbytes = sizeof(buf); + } + + apr_file_printf(out, "%" APR_SIZE_T_FMT " bytes were read\n", + total_bytes); + return 0; +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/sendfile.c b/rubbos/app/httpd-2.0.64/srclib/apr/test/sendfile.c new file mode 100644 index 00000000..b14765fd --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/sendfile.c @@ -0,0 +1,749 @@ +/* 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. + */ + +#include +#include +#include +#include +#include +#include "apr_network_io.h" +#include "apr_errno.h" +#include "apr_general.h" +#include "apr_poll.h" + +#if !APR_HAS_SENDFILE +int main(void) +{ + fprintf(stderr, + "This program won't work on this platform because there is no " + "support for sendfile().\n"); + return 0; +} +#else /* !APR_HAS_SENDFILE */ + +#define FILE_LENGTH 200000 + +#define FILE_DATA_CHAR '0' + +#define HDR1 "1234567890ABCD\n" +#define HDR2 "EFGH\n" +#define HDR3_LEN 80000 +#define HDR3_CHAR '^' +#define TRL1 "IJKLMNOPQRSTUVWXYZ\n" +#define TRL2 "!@#$%&*()\n" +#define TRL3_LEN 90000 +#define TRL3_CHAR '@' + +#define TESTSF_PORT 8021 + +#define TESTFILE "testsf.dat" + +typedef enum {BLK, NONBLK, TIMEOUT} client_socket_mode_t; + +static void apr_setup(apr_pool_t **p, apr_socket_t **sock, int *family) +{ + char buf[120]; + apr_status_t rv; + + rv = apr_initialize(); + if (rv != APR_SUCCESS) { + fprintf(stderr, "apr_initialize()->%d/%s\n", + rv, + apr_strerror(rv, buf, sizeof buf)); + exit(1); + } + + atexit(apr_terminate); + + rv = apr_pool_create(p, NULL); + if (rv != APR_SUCCESS) { + fprintf(stderr, "apr_pool_create()->%d/%s\n", + rv, + apr_strerror(rv, buf, sizeof buf)); + exit(1); + } + + *sock = NULL; + rv = apr_socket_create(sock, *family, SOCK_STREAM, *p); + if (rv != APR_SUCCESS) { + fprintf(stderr, "apr_socket_create()->%d/%s\n", + rv, + apr_strerror(rv, buf, sizeof buf)); + exit(1); + } + + if (*family == APR_UNSPEC) { + apr_sockaddr_t *localsa; + + rv = apr_socket_addr_get(&localsa, APR_LOCAL, *sock); + if (rv != APR_SUCCESS) { + fprintf(stderr, "apr_socket_addr_get()->%d/%s\n", + rv, + apr_strerror(rv, buf, sizeof buf)); + exit(1); + } + *family = localsa->family; + } +} + +static void create_testfile(apr_pool_t *p, const char *fname) +{ + apr_file_t *f = NULL; + apr_status_t rv; + char buf[120]; + int i; + apr_finfo_t finfo; + + printf("Creating a test file...\n"); + rv = apr_file_open(&f, fname, + APR_CREATE | APR_WRITE | APR_TRUNCATE | APR_BUFFERED, + APR_UREAD | APR_UWRITE, p); + if (rv) { + fprintf(stderr, "apr_file_open()->%d/%s\n", + rv, apr_strerror(rv, buf, sizeof buf)); + exit(1); + } + + buf[0] = FILE_DATA_CHAR; + buf[1] = '\0'; + for (i = 0; i < FILE_LENGTH; i++) { + /* exercise apr_file_putc() and apr_file_puts() on buffered files */ + if ((i % 2) == 0) { + rv = apr_file_putc(buf[0], f); + if (rv) { + fprintf(stderr, "apr_file_putc()->%d/%s\n", + rv, apr_strerror(rv, buf, sizeof buf)); + exit(1); + } + } + else { + rv = apr_file_puts(buf, f); + if (rv) { + fprintf(stderr, "apr_file_puts()->%d/%s\n", + rv, apr_strerror(rv, buf, sizeof buf)); + exit(1); + } + } + } + + rv = apr_file_close(f); + if (rv) { + fprintf(stderr, "apr_file_close()->%d/%s\n", + rv, apr_strerror(rv, buf, sizeof buf)); + exit(1); + } + + rv = apr_stat(&finfo, fname, APR_FINFO_NORM, p); + if (rv != APR_SUCCESS && rv != APR_INCOMPLETE) { + fprintf(stderr, "apr_stat()->%d/%s\n", + rv, apr_strerror(rv, buf, sizeof buf)); + exit(1); + } + + if (finfo.size != FILE_LENGTH) { + fprintf(stderr, + "test file %s should be %ld-bytes long\n" + "instead it is %ld-bytes long\n", + fname, + (long int)FILE_LENGTH, + (long int)finfo.size); + exit(1); + } +} + +static int client(client_socket_mode_t socket_mode, char *host) +{ + apr_status_t rv, tmprv; + apr_socket_t *sock; + apr_pool_t *p; + char buf[120]; + apr_file_t *f = NULL; + apr_size_t len; + apr_size_t expected_len; + apr_off_t current_file_offset; + apr_hdtr_t hdtr; + struct iovec headers[3]; + struct iovec trailers[3]; + apr_size_t bytes_read; + apr_pollfd_t *pfd; + apr_int32_t nsocks; + int i; + int family; + apr_sockaddr_t *destsa; + + family = APR_INET; + apr_setup(&p, &sock, &family); + create_testfile(p, TESTFILE); + + rv = apr_file_open(&f, TESTFILE, APR_READ, 0, p); + if (rv != APR_SUCCESS) { + fprintf(stderr, "apr_file_open()->%d/%s\n", + rv, + apr_strerror(rv, buf, sizeof buf)); + exit(1); + } + + if (!host) { + host = "127.0.0.1"; + } + rv = apr_sockaddr_info_get(&destsa, host, family, TESTSF_PORT, 0, p); + if (rv != APR_SUCCESS) { + fprintf(stderr, "apr_sockaddr_info_get()->%d/%s\n", + rv, + apr_strerror(rv, buf, sizeof buf)); + exit(1); + } + + rv = apr_socket_connect(sock, destsa); + if (rv != APR_SUCCESS) { + fprintf(stderr, "apr_socket_connect()->%d/%s\n", + rv, + apr_strerror(rv, buf, sizeof buf)); + exit(1); + } + + switch(socket_mode) { + case BLK: + /* leave it blocking */ + break; + case NONBLK: + /* set it non-blocking */ + rv = apr_socket_opt_set(sock, APR_SO_NONBLOCK, 1); + if (rv != APR_SUCCESS) { + fprintf(stderr, "apr_socket_opt_set(APR_SO_NONBLOCK)->%d/%s\n", + rv, + apr_strerror(rv, buf, sizeof buf)); + exit(1); + } + break; + case TIMEOUT: + /* set a timeout */ + rv = apr_socket_timeout_set(sock, 100 * APR_USEC_PER_SEC); + if (rv != APR_SUCCESS) { + fprintf(stderr, "apr_socket_opt_set(APR_SO_NONBLOCK)->%d/%s\n", + rv, + apr_strerror(rv, buf, sizeof buf)); + exit(1); + } + break; + default: + assert(1 != 1); + } + + printf("Sending the file...\n"); + + hdtr.headers = headers; + hdtr.numheaders = 3; + hdtr.headers[0].iov_base = HDR1; + hdtr.headers[0].iov_len = strlen(hdtr.headers[0].iov_base); + hdtr.headers[1].iov_base = HDR2; + hdtr.headers[1].iov_len = strlen(hdtr.headers[1].iov_base); + hdtr.headers[2].iov_base = malloc(HDR3_LEN); + assert(hdtr.headers[2].iov_base); + memset(hdtr.headers[2].iov_base, HDR3_CHAR, HDR3_LEN); + hdtr.headers[2].iov_len = HDR3_LEN; + + hdtr.trailers = trailers; + hdtr.numtrailers = 3; + hdtr.trailers[0].iov_base = TRL1; + hdtr.trailers[0].iov_len = strlen(hdtr.trailers[0].iov_base); + hdtr.trailers[1].iov_base = TRL2; + hdtr.trailers[1].iov_len = strlen(hdtr.trailers[1].iov_base); + hdtr.trailers[2].iov_base = malloc(TRL3_LEN); + memset(hdtr.trailers[2].iov_base, TRL3_CHAR, TRL3_LEN); + assert(hdtr.trailers[2].iov_base); + hdtr.trailers[2].iov_len = TRL3_LEN; + + expected_len = + strlen(HDR1) + strlen(HDR2) + HDR3_LEN + + strlen(TRL1) + strlen(TRL2) + TRL3_LEN + + FILE_LENGTH; + + if (socket_mode == BLK) { + current_file_offset = 0; + len = FILE_LENGTH; + rv = apr_socket_sendfile(sock, f, &hdtr, ¤t_file_offset, &len, 0); + if (rv != APR_SUCCESS) { + fprintf(stderr, "apr_socket_sendfile()->%d/%s\n", + rv, + apr_strerror(rv, buf, sizeof buf)); + exit(1); + } + + printf("apr_socket_sendfile() updated offset with %ld\n", + (long int)current_file_offset); + + printf("apr_socket_sendfile() updated len with %ld\n", + (long int)len); + + printf("bytes really sent: %" APR_SIZE_T_FMT "\n", + expected_len); + + if (len != expected_len) { + fprintf(stderr, "apr_socket_sendfile() didn't report the correct " + "number of bytes sent!\n"); + exit(1); + } + } + else { + /* non-blocking... wooooooo */ + apr_size_t total_bytes_sent; + + pfd = NULL; + rv = apr_poll_setup(&pfd, 1, p); + assert(!rv); + rv = apr_poll_socket_add(pfd, sock, APR_POLLOUT); + assert(!rv); + + total_bytes_sent = 0; + current_file_offset = 0; + len = FILE_LENGTH; + do { + apr_size_t tmplen; + + tmplen = len; /* bytes remaining to send from the file */ + printf("Calling apr_socket_sendfile()...\n"); + printf("Headers (%d):\n", hdtr.numheaders); + for (i = 0; i < hdtr.numheaders; i++) { + printf("\t%ld bytes (%c)\n", + (long)hdtr.headers[i].iov_len, + *(char *)hdtr.headers[i].iov_base); + } + printf("File: %ld bytes from offset %ld\n", + (long)tmplen, (long)current_file_offset); + printf("Trailers (%d):\n", hdtr.numtrailers); + for (i = 0; i < hdtr.numtrailers; i++) { + printf("\t%ld bytes\n", + (long)hdtr.trailers[i].iov_len); + } + + rv = apr_socket_sendfile(sock, f, &hdtr, ¤t_file_offset, &tmplen, 0); + printf("apr_socket_sendfile()->%d, sent %ld bytes\n", rv, (long)tmplen); + if (rv) { + if (APR_STATUS_IS_EAGAIN(rv)) { + assert(tmplen == 0); + nsocks = 1; + tmprv = apr_poll(pfd, 1, &nsocks, -1); + assert(!tmprv); + assert(nsocks == 1); + /* continue; */ + } + } + + total_bytes_sent += tmplen; + + /* Adjust hdtr to compensate for partially-written + * data. + */ + + /* First, skip over any header data which might have + * been written. + */ + while (tmplen && hdtr.numheaders) { + if (tmplen >= hdtr.headers[0].iov_len) { + tmplen -= hdtr.headers[0].iov_len; + --hdtr.numheaders; + ++hdtr.headers; + } + else { + hdtr.headers[0].iov_len -= tmplen; + hdtr.headers[0].iov_base = + (char*) hdtr.headers[0].iov_base + tmplen; + tmplen = 0; + } + } + + /* Now, skip over any file data which might have been + * written. + */ + + if (tmplen <= len) { + current_file_offset += tmplen; + len -= tmplen; + tmplen = 0; + } + else { + tmplen -= len; + len = 0; + current_file_offset = 0; + } + + /* Last, skip over any trailer data which might have + * been written. + */ + + while (tmplen && hdtr.numtrailers) { + if (tmplen >= hdtr.trailers[0].iov_len) { + tmplen -= hdtr.trailers[0].iov_len; + --hdtr.numtrailers; + ++hdtr.trailers; + } + else { + hdtr.trailers[0].iov_len -= tmplen; + hdtr.trailers[0].iov_base = + (char *)hdtr.trailers[0].iov_base + tmplen; + tmplen = 0; + } + } + + } while (total_bytes_sent < expected_len && + (rv == APR_SUCCESS || + (APR_STATUS_IS_EAGAIN(rv) && socket_mode != TIMEOUT))); + if (total_bytes_sent != expected_len) { + fprintf(stderr, + "client problem: sent %ld of %ld bytes\n", + (long)total_bytes_sent, (long)expected_len); + exit(1); + } + + if (rv) { + fprintf(stderr, + "client problem: rv %d\n", + rv); + exit(1); + } + } + + current_file_offset = 0; + rv = apr_file_seek(f, APR_CUR, ¤t_file_offset); + if (rv != APR_SUCCESS) { + fprintf(stderr, "apr_file_seek()->%d/%s\n", + rv, + apr_strerror(rv, buf, sizeof buf)); + exit(1); + } + + printf("After apr_socket_sendfile(), the kernel file pointer is " + "at offset %ld.\n", + (long int)current_file_offset); + + rv = apr_socket_shutdown(sock, APR_SHUTDOWN_WRITE); + if (rv != APR_SUCCESS) { + fprintf(stderr, "apr_socket_shutdown()->%d/%s\n", + rv, + apr_strerror(rv, buf, sizeof buf)); + exit(1); + } + + /* in case this is the non-blocking test, set socket timeout; + * we're just waiting for EOF */ + + rv = apr_socket_timeout_set(sock, apr_time_from_sec(3)); + if (rv != APR_SUCCESS) { + fprintf(stderr, "apr_socket_timeout_set()->%d/%s\n", + rv, + apr_strerror(rv, buf, sizeof buf)); + exit(1); + } + + bytes_read = 1; + rv = apr_socket_recv(sock, buf, &bytes_read); + if (rv != APR_EOF) { + fprintf(stderr, "apr_socket_recv()->%d/%s (expected APR_EOF)\n", + rv, + apr_strerror(rv, buf, sizeof buf)); + exit(1); + } + if (bytes_read != 0) { + fprintf(stderr, "We expected to get 0 bytes read with APR_EOF\n" + "but instead we read %ld bytes.\n", + (long int)bytes_read); + exit(1); + } + + printf("client: apr_socket_sendfile() worked as expected!\n"); + + rv = apr_file_remove(TESTFILE, p); + if (rv != APR_SUCCESS) { + fprintf(stderr, "apr_file_remove()->%d/%s\n", + rv, + apr_strerror(rv, buf, sizeof buf)); + exit(1); + } + + return 0; +} + +static int server(void) +{ + apr_status_t rv; + apr_socket_t *sock; + apr_pool_t *p; + char buf[120]; + int i; + apr_socket_t *newsock = NULL; + apr_size_t bytes_read; + apr_sockaddr_t *localsa; + int family; + + family = APR_UNSPEC; + apr_setup(&p, &sock, &family); + + rv = apr_socket_opt_set(sock, APR_SO_REUSEADDR, 1); + if (rv != APR_SUCCESS) { + fprintf(stderr, "apr_socket_opt_set()->%d/%s\n", + rv, + apr_strerror(rv, buf, sizeof buf)); + exit(1); + } + + rv = apr_sockaddr_info_get(&localsa, NULL, family, TESTSF_PORT, 0, p); + if (rv != APR_SUCCESS) { + fprintf(stderr, "apr_sockaddr_info_get()->%d/%s\n", + rv, + apr_strerror(rv, buf, sizeof buf)); + exit(1); + } + + rv = apr_socket_bind(sock, localsa); + if (rv != APR_SUCCESS) { + fprintf(stderr, "apr_socket_bind()->%d/%s\n", + rv, + apr_strerror(rv, buf, sizeof buf)); + exit(1); + } + + rv = apr_socket_listen(sock, 5); + if (rv != APR_SUCCESS) { + fprintf(stderr, "apr_socket_listen()->%d/%s\n", + rv, + apr_strerror(rv, buf, sizeof buf)); + exit(1); + } + + printf("Waiting for a client to connect...\n"); + + rv = apr_socket_accept(&newsock, sock, p); + if (rv != APR_SUCCESS) { + fprintf(stderr, "apr_socket_accept()->%d/%s\n", + rv, + apr_strerror(rv, buf, sizeof buf)); + exit(1); + } + + printf("Processing a client...\n"); + + assert(sizeof buf > strlen(HDR1)); + bytes_read = strlen(HDR1); + rv = apr_socket_recv(newsock, buf, &bytes_read); + if (rv != APR_SUCCESS) { + fprintf(stderr, "apr_socket_recv()->%d/%s\n", + rv, + apr_strerror(rv, buf, sizeof buf)); + exit(1); + } + if (bytes_read != strlen(HDR1)) { + fprintf(stderr, "wrong data read (1)\n"); + exit(1); + } + if (memcmp(buf, HDR1, strlen(HDR1))) { + fprintf(stderr, "wrong data read (2)\n"); + fprintf(stderr, "received: `%.*s'\nexpected: `%s'\n", + (int)bytes_read, buf, HDR1); + exit(1); + } + + assert(sizeof buf > strlen(HDR2)); + bytes_read = strlen(HDR2); + rv = apr_socket_recv(newsock, buf, &bytes_read); + if (rv != APR_SUCCESS) { + fprintf(stderr, "apr_socket_recv()->%d/%s\n", + rv, + apr_strerror(rv, buf, sizeof buf)); + exit(1); + } + if (bytes_read != strlen(HDR2)) { + fprintf(stderr, "wrong data read (3)\n"); + exit(1); + } + if (memcmp(buf, HDR2, strlen(HDR2))) { + fprintf(stderr, "wrong data read (4)\n"); + fprintf(stderr, "received: `%.*s'\nexpected: `%s'\n", + (int)bytes_read, buf, HDR2); + exit(1); + } + + for (i = 0; i < HDR3_LEN; i++) { + bytes_read = 1; + rv = apr_socket_recv(newsock, buf, &bytes_read); + if (rv != APR_SUCCESS) { + fprintf(stderr, "apr_socket_recv()->%d/%s\n", + rv, + apr_strerror(rv, buf, sizeof buf)); + exit(1); + } + if (bytes_read != 1) { + fprintf(stderr, "apr_socket_recv()->%ld bytes instead of 1\n", + (long int)bytes_read); + exit(1); + } + if (buf[0] != HDR3_CHAR) { + fprintf(stderr, + "problem with data read (byte %d of hdr 3):\n", + i); + fprintf(stderr, "read `%c' (0x%x) from client; expected " + "`%c'\n", + buf[0], buf[0], HDR3_CHAR); + exit(1); + } + } + + for (i = 0; i < FILE_LENGTH; i++) { + bytes_read = 1; + rv = apr_socket_recv(newsock, buf, &bytes_read); + if (rv != APR_SUCCESS) { + fprintf(stderr, "apr_socket_recv()->%d/%s\n", + rv, + apr_strerror(rv, buf, sizeof buf)); + exit(1); + } + if (bytes_read != 1) { + fprintf(stderr, "apr_socket_recv()->%ld bytes instead of 1\n", + (long int)bytes_read); + exit(1); + } + if (buf[0] != FILE_DATA_CHAR) { + fprintf(stderr, + "problem with data read (byte %d of file):\n", + i); + fprintf(stderr, "read `%c' (0x%x) from client; expected " + "`%c'\n", + buf[0], buf[0], FILE_DATA_CHAR); + exit(1); + } + } + + assert(sizeof buf > strlen(TRL1)); + bytes_read = strlen(TRL1); + rv = apr_socket_recv(newsock, buf, &bytes_read); + if (rv != APR_SUCCESS) { + fprintf(stderr, "apr_socket_recv()->%d/%s\n", + rv, + apr_strerror(rv, buf, sizeof buf)); + exit(1); + } + if (bytes_read != strlen(TRL1)) { + fprintf(stderr, "wrong data read (5)\n"); + exit(1); + } + if (memcmp(buf, TRL1, strlen(TRL1))) { + fprintf(stderr, "wrong data read (6)\n"); + fprintf(stderr, "received: `%.*s'\nexpected: `%s'\n", + (int)bytes_read, buf, TRL1); + exit(1); + } + + assert(sizeof buf > strlen(TRL2)); + bytes_read = strlen(TRL2); + rv = apr_socket_recv(newsock, buf, &bytes_read); + if (rv != APR_SUCCESS) { + fprintf(stderr, "apr_socket_recv()->%d/%s\n", + rv, + apr_strerror(rv, buf, sizeof buf)); + exit(1); + } + if (bytes_read != strlen(TRL2)) { + fprintf(stderr, "wrong data read (7)\n"); + exit(1); + } + if (memcmp(buf, TRL2, strlen(TRL2))) { + fprintf(stderr, "wrong data read (8)\n"); + fprintf(stderr, "received: `%.*s'\nexpected: `%s'\n", + (int)bytes_read, buf, TRL2); + exit(1); + } + + for (i = 0; i < TRL3_LEN; i++) { + bytes_read = 1; + rv = apr_socket_recv(newsock, buf, &bytes_read); + if (rv != APR_SUCCESS) { + fprintf(stderr, "apr_socket_recv()->%d/%s\n", + rv, + apr_strerror(rv, buf, sizeof buf)); + exit(1); + } + if (bytes_read != 1) { + fprintf(stderr, "apr_socket_recv()->%ld bytes instead of 1\n", + (long int)bytes_read); + exit(1); + } + if (buf[0] != TRL3_CHAR) { + fprintf(stderr, + "problem with data read (byte %d of trl 3):\n", + i); + fprintf(stderr, "read `%c' (0x%x) from client; expected " + "`%c'\n", + buf[0], buf[0], TRL3_CHAR); + exit(1); + } + } + + bytes_read = 1; + rv = apr_socket_recv(newsock, buf, &bytes_read); + if (rv != APR_EOF) { + fprintf(stderr, "apr_socket_recv()->%d/%s (expected APR_EOF)\n", + rv, + apr_strerror(rv, buf, sizeof buf)); + exit(1); + } + if (bytes_read != 0) { + fprintf(stderr, "We expected to get 0 bytes read with APR_EOF\n" + "but instead we read %ld bytes (%c).\n", + (long int)bytes_read, buf[0]); + exit(1); + } + + printf("server: apr_socket_sendfile() worked as expected!\n"); + + return 0; +} + +int main(int argc, char *argv[]) +{ +#ifdef SIGPIPE + signal(SIGPIPE, SIG_IGN); +#endif + + /* Gee whiz this is goofy logic but I wanna drive sendfile right now, + * not dork around with the command line! + */ + if (argc >= 3 && !strcmp(argv[1], "client")) { + char *host = 0; + if (argv[3]) { + host = argv[3]; + } + if (!strcmp(argv[2], "blocking")) { + return client(BLK, host); + } + else if (!strcmp(argv[2], "timeout")) { + return client(TIMEOUT, host); + } + else if (!strcmp(argv[2], "nonblocking")) { + return client(NONBLK, host); + } + } + else if (argc == 2 && !strcmp(argv[1], "server")) { + return server(); + } + + fprintf(stderr, + "Usage: %s client {blocking|nonblocking|timeout}\n" + " %s server\n", + argv[0], argv[0]); + return -1; +} + +#endif /* !APR_HAS_SENDFILE */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/server.c b/rubbos/app/httpd-2.0.64/srclib/apr/test/server.c new file mode 100644 index 00000000..03c10270 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/server.c @@ -0,0 +1,167 @@ +/* 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. + */ + +#define APR_TEST_PREFIX "server: " + +#include "aprtest.h" +#include +#include "apr_network_io.h" +#include "apr_getopt.h" +#include "apr_poll.h" + +#define STRLEN 15 + +int main(int argc, const char * const argv[]) +{ + apr_pool_t *context; + apr_status_t rv; + apr_socket_t *sock; + apr_socket_t *sock2; + apr_size_t length; + apr_int32_t pollres; + apr_pollfd_t *sdset; + char datasend[STRLEN]; + char datarecv[STRLEN] = "Recv data test"; + const char *bind_to_ipaddr = NULL; + char *local_ipaddr, *remote_ipaddr; + apr_port_t local_port, remote_port; + apr_sockaddr_t *localsa = NULL, *remotesa; + apr_status_t stat; + int family = APR_UNSPEC; + int protocol; + apr_getopt_t *opt; + const char *optarg; + char optchar; + + APR_TEST_INITIALIZE(rv, context); + + APR_TEST_SUCCESS(rv, "Preparing getopt", + apr_getopt_init(&opt, context, argc, argv)) + + while ((stat = apr_getopt(opt, "i:", &optchar, &optarg)) == APR_SUCCESS) { + switch(optchar) { + case 'i': + bind_to_ipaddr = optarg; + break; + } + } + if (stat != APR_EOF) { + fprintf(stderr, + "usage: %s [-i local-interface-address]\n", + argv[0]); + exit(-1); + } + + if (bind_to_ipaddr) { + /* First, parse/resolve ipaddr so we know what address family of + * socket we need. We'll use the returned sockaddr later when + * we bind. + */ + APR_TEST_SUCCESS(rv, "Preparing sockaddr", + apr_sockaddr_info_get(&localsa, bind_to_ipaddr, APR_UNSPEC, 8021, 0, context)) + family = localsa->family; + } + + APR_TEST_SUCCESS(rv, "Creating new socket", + apr_socket_create_ex(&sock, family, SOCK_STREAM, APR_PROTO_TCP, context)) + + APR_TEST_SUCCESS(rv, "Setting option APR_SO_NONBLOCK", + apr_socket_opt_set(sock, APR_SO_NONBLOCK, 1)) + + APR_TEST_SUCCESS(rv, "Setting option APR_SO_REUSEADDR", + apr_socket_opt_set(sock, APR_SO_REUSEADDR, 1)) + + if (!localsa) { + apr_socket_addr_get(&localsa, APR_LOCAL, sock); + apr_sockaddr_port_set(localsa, 8021); + } + + APR_TEST_SUCCESS(rv, "Binding socket to port", + apr_socket_bind(sock, localsa)) + + APR_TEST_SUCCESS(rv, "Listening to socket", + apr_socket_listen(sock, 5)) + + APR_TEST_BEGIN(rv, "Setting up for polling", + apr_poll_setup(&sdset, 1, context)) + APR_TEST_END(rv, + apr_poll_socket_add(sdset, sock, APR_POLLIN)) + + pollres = 1; + APR_TEST_BEGIN(rv, "Polling for socket", + apr_poll(sdset, 1, &pollres, -1)) + + if (pollres == 0) { + fprintf(stdout, "Failed\n"); + apr_socket_close(sock); + fprintf(stderr, "Error: Unrecognized poll result, " + "expected 1, received %d\n", pollres); + exit(-1); + } + fprintf(stdout, "OK\n"); + + APR_TEST_SUCCESS(rv, "Accepting a connection", + apr_socket_accept(&sock2, sock, context)) + + apr_socket_protocol_get(sock2, &protocol); + if (protocol != APR_PROTO_TCP) { + fprintf(stderr, "Error: protocol not conveyed from listening socket " + "to connected socket!\n"); + exit(1); + } + apr_socket_addr_get(&remotesa, APR_REMOTE, sock2); + apr_sockaddr_ip_get(&remote_ipaddr, remotesa); + apr_sockaddr_port_get(&remote_port, remotesa); + apr_socket_addr_get(&localsa, APR_LOCAL, sock2); + apr_sockaddr_ip_get(&local_ipaddr, localsa); + apr_sockaddr_port_get(&local_port, localsa); + fprintf(stdout, "Server socket: %s:%u -> %s:%u\n", local_ipaddr, + local_port, remote_ipaddr, remote_port); + + APR_TEST_SUCCESS(rv, "Setting timeout on client socket", + apr_socket_timeout_set(sock2, apr_time_from_sec(3))); + + length = STRLEN; + APR_TEST_BEGIN(rv, "Receiving data from socket", + apr_socket_recv(sock2, datasend, &length)) + + if (strcmp(datasend, "Send data test")) { + fprintf(stdout, "Failed\n"); + apr_socket_close(sock); + apr_socket_close(sock2); + fprintf(stderr, "Error: Unrecognized response;\n" + "Expected: \"Send data test\"\n" + "Received: \"%s\"\n", datarecv); + exit(-1); + } + fprintf(stdout, "OK\n"); + + length = STRLEN; + APR_TEST_SUCCESS(rv, "Sending data over socket", + apr_socket_send(sock2, datarecv, &length)) + + APR_TEST_SUCCESS(rv, "Shutting down accepted socket", + apr_socket_shutdown(sock2, APR_SHUTDOWN_READ)) + + APR_TEST_SUCCESS(rv, "Closing duplicate socket", + apr_socket_close(sock2)) + + APR_TEST_SUCCESS(rv, "Closing original socket", + apr_socket_close(sock)) + + return 0; +} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/test_apr.h b/rubbos/app/httpd-2.0.64/srclib/apr/test/test_apr.h new file mode 100644 index 00000000..7bb8dab7 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/test_apr.h @@ -0,0 +1,68 @@ +/* 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. + */ + +#ifndef APR_TEST_INCLUDES +#define APR_TEST_INCLUDES + +#include "CuTest.h" +#include "apr_pools.h" + +/* Some simple functions to make the test apps easier to write and + * a bit more consistent... + */ + +extern apr_pool_t *p; + +CuSuite *getsuite(void); + +CuSuite *teststr(void); +CuSuite *testtime(void); +CuSuite *testvsn(void); +CuSuite *testipsub(void); +CuSuite *testmmap(void); +CuSuite *testud(void); +CuSuite *testtable(void); +CuSuite *testhash(void); +CuSuite *testsleep(void); +CuSuite *testpool(void); +CuSuite *testfmt(void); +CuSuite *testfile(void); +CuSuite *testdir(void); +CuSuite *testfileinfo(void); +CuSuite *testrand(void); +CuSuite *testdso(void); +CuSuite *testoc(void); +CuSuite *testdup(void); +CuSuite *testsockets(void); +CuSuite *testproc(void); +CuSuite *testprocmutex(void); +CuSuite *testpoll(void); +CuSuite *testlock(void); +CuSuite *testsockopt(void); +CuSuite *testpipe(void); +CuSuite *testthread(void); +CuSuite *testgetopt(void); +CuSuite *testnames(void); +CuSuite *testuser(void); +CuSuite *testpath(void); +CuSuite *testenv(void); + +/* Assert that RV is an APR_SUCCESS value; else fail giving strerror + * for RV and CONTEXT message. */ +void apr_assert_success(CuTest* tc, const char *context, apr_status_t rv); + + +#endif /* APR_TEST_INCLUDES */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/testall.c b/rubbos/app/httpd-2.0.64/srclib/apr/test/testall.c new file mode 100644 index 00000000..c7e8fe9c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/testall.c @@ -0,0 +1,167 @@ +/* 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. + */ + +#include +#include + +#include "test_apr.h" + +/* Top-level pool which can be used by tests. */ +apr_pool_t *p; + +void apr_assert_success(CuTest* tc, const char* context, apr_status_t rv) +{ + if (rv == APR_ENOTIMPL) { + CuNotImpl(tc, context); + } + + if (rv != APR_SUCCESS) { + char buf[STRING_MAX], ebuf[128]; + sprintf(buf, "%s (%d): %s\n", context, rv, + apr_strerror(rv, ebuf, sizeof ebuf)); + CuFail(tc, buf); + } +} + +static const struct testlist { + const char *testname; + CuSuite *(*func)(void); +} tests[] = { + {"teststr", teststr}, + {"testtime", testtime}, + {"testvsn", testvsn}, + {"testipsub", testipsub}, + {"testmmap", testmmap}, + {"testud", testud}, + {"testtable", testtable}, + {"testhash", testhash}, + {"testsleep", testsleep}, + {"testpool", testpool}, + {"testfmt", testfmt}, + {"testfile", testfile}, + {"testfileinfo", testfileinfo}, + {"testpipe", testpipe}, + {"testdup", testdup}, + {"testdir", testdir}, + {"testrand", testrand}, + {"testdso", testdso}, + {"testoc", testoc}, + {"testsockets", testsockets}, + {"testsockopt", testsockopt}, + {"testproc", testproc}, + {"testprocmutex", testprocmutex}, + {"testpoll", testpoll}, + {"testlock", testlock}, + {"testthread", testthread}, + {"testargs", testgetopt}, + {"testnames", testnames}, + {"testuser", testuser}, + {"testpath", testpath}, + {"testenv", testenv}, + {"LastTest", NULL} +}; + +int main(int argc, char *argv[]) +{ + CuSuiteList *alltests = NULL; + CuString *output = CuStringNew(); + int i; + int exclude = 0; + int list_provided = 0; + + apr_initialize(); + atexit(apr_terminate); + + CuInit(argc, argv); + + apr_pool_create(&p, NULL); + + /* see if we're in exclude mode, see if list of testcases provided */ + for (i = 1; i < argc; i++) { + if (!strcmp(argv[i], "-v")) { + continue; + } + if (!strcmp(argv[i], "-x")) { + exclude = 1; + continue; + } + if (!strcmp(argv[i], "-l")) { + for (i = 0; tests[i].func != NULL; i++) { + printf("%s\n", tests[i].testname); + } + exit(0); + } + if (argv[i][0] == '-') { + fprintf(stderr, "invalid option: `%s'\n", argv[i]); + exit(1); + } + list_provided = 1; + } + + if (!list_provided) { + /* add everything */ + alltests = CuSuiteListNew("All APR Tests"); + for (i = 0; tests[i].func != NULL; i++) { + CuSuiteListAdd(alltests, tests[i].func()); + } + } + else if (exclude) { + /* add everything but the tests listed */ + alltests = CuSuiteListNew("Partial APR Tests"); + for (i = 0; tests[i].func != NULL; i++) { + int this_test_excluded = 0; + int j; + + for (j = 1; j < argc && !this_test_excluded; j++) { + if (!strcmp(argv[j], tests[i].testname)) { + this_test_excluded = 1; + } + } + if (!this_test_excluded) { + CuSuiteListAdd(alltests, tests[i].func()); + } + } + } + else { + /* add only the tests listed */ + alltests = CuSuiteListNew("Partial APR Tests"); + for (i = 1; i < argc; i++) { + int j; + int found = 0; + + if (argv[i][0] == '-') { + continue; + } + for (j = 0; tests[j].func != NULL; j++) { + if (!strcmp(argv[i], tests[j].testname)) { + CuSuiteListAdd(alltests, tests[j].func()); + found = 1; + } + } + if (!found) { + fprintf(stderr, "invalid test name: `%s'\n", argv[i]); + exit(1); + } + } + } + + CuSuiteListRunWithSummary(alltests); + i = CuSuiteListDetails(alltests, output); + printf("%s\n", output->buffer); + + return i > 0 ? 1 : 0; +} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/testall.dsp b/rubbos/app/httpd-2.0.64/srclib/apr/test/testall.dsp new file mode 100644 index 00000000..12f031cb --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/testall.dsp @@ -0,0 +1,253 @@ +# Microsoft Developer Studio Project File - Name="testall" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) External Target" 0x0106 + +CFG=testall - 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 "testall.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 "testall.mak" CFG="testall - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "testall - Win32 Release" (based on "Win32 (x86) External Target") +!MESSAGE "testall - Win32 Debug" (based on "Win32 (x86) External Target") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" + +!IF "$(CFG)" == "testall - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "" +# PROP BASE Intermediate_Dir "" +# PROP BASE Cmd_Line "NMAKE /f Makefile.win all" +# PROP BASE Rebuild_Opt "/a" +# PROP BASE Target_File "testall.exe" +# PROP BASE Bsc_Name "testall.bsc" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "" +# PROP Intermediate_Dir "" +# PROP Cmd_Line "NMAKE /f Makefile.win all" +# PROP Rebuild_Opt "/a" +# PROP Target_File "testall.exe" +# PROP Bsc_Name "" +# PROP Target_Dir "" + +!ELSEIF "$(CFG)" == "testall - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "" +# PROP BASE Intermediate_Dir "" +# PROP BASE Cmd_Line "NMAKE /f Makefile.win all" +# PROP BASE Rebuild_Opt "/a" +# PROP BASE Target_File "testall.exe" +# PROP BASE Bsc_Name "testall.bsc" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "" +# PROP Intermediate_Dir "" +# PROP Cmd_Line "NMAKE /f Makefile.win all" +# PROP Rebuild_Opt "/a" +# PROP Target_File "testall.exe" +# PROP Bsc_Name "" +# PROP Target_Dir "" + +!ENDIF + +# Begin Target + +# Name "testall - Win32 Release" +# Name "testall - Win32 Debug" + +!IF "$(CFG)" == "testall - Win32 Release" + +!ELSEIF "$(CFG)" == "testall - Win32 Debug" + +!ENDIF + +# Begin Source File + +SOURCE=.\Makefile.win +# End Source File +# Begin Source File + +SOURCE=.\testall.c +# End Source File +# Begin Source File + +SOURCE=.\testapp.c +# End Source File +# Begin Source File + +SOURCE=.\testargs.c +# End Source File +# Begin Source File + +SOURCE=.\testatomic.c +# End Source File +# Begin Source File + +SOURCE=.\testdir.c +# End Source File +# Begin Source File + +SOURCE=.\testdso.c +# End Source File +# Begin Source File + +SOURCE=.\testdup.c +# End Source File +# Begin Source File + +SOURCE=.\testfile.c +# End Source File +# Begin Source File + +SOURCE=.\testfileinfo.c +# End Source File +# Begin Source File + +SOURCE=.\testflock.c +# End Source File +# Begin Source File + +SOURCE=.\testfmt.c +# End Source File +# Begin Source File + +SOURCE=.\testglobalmutex.c +# End Source File +# Begin Source File + +SOURCE=.\testhash.c +# End Source File +# Begin Source File + +SOURCE=.\testipsub.c +# End Source File +# Begin Source File + +SOURCE=.\testlock.c +# End Source File +# Begin Source File + +SOURCE=.\testlockperf.c +# End Source File +# Begin Source File + +SOURCE=.\testmmap.c +# End Source File +# Begin Source File + +SOURCE=.\testmutexscope.c +# End Source File +# Begin Source File + +SOURCE=.\testnames.c +# End Source File +# Begin Source File + +SOURCE=.\testoc.c +# End Source File +# Begin Source File + +SOURCE=.\testpath.c +# End Source File +# Begin Source File + +SOURCE=.\testpipe.c +# End Source File +# Begin Source File + +SOURCE=.\testpoll.c +# End Source File +# Begin Source File + +SOURCE=.\testpools.c +# End Source File +# Begin Source File + +SOURCE=.\testproc.c +# End Source File +# Begin Source File + +SOURCE=.\testprocmutex.c +# End Source File +# Begin Source File + +SOURCE=.\testrand.c +# End Source File +# Begin Source File + +SOURCE=.\testshm.c +# End Source File +# Begin Source File + +SOURCE=.\testshmconsumer.c +# End Source File +# Begin Source File + +SOURCE=.\testshmproducer.c +# End Source File +# Begin Source File + +SOURCE=.\testsleep.c +# End Source File +# Begin Source File + +SOURCE=.\testsock.c +# End Source File +# Begin Source File + +SOURCE=.\testsockets.c +# End Source File +# Begin Source File + +SOURCE=.\testsockopt.c +# End Source File +# Begin Source File + +SOURCE=.\teststr.c +# End Source File +# Begin Source File + +SOURCE=.\testtable.c +# End Source File +# Begin Source File + +SOURCE=.\testthread.c +# End Source File +# Begin Source File + +SOURCE=.\testtime.c +# End Source File +# Begin Source File + +SOURCE=.\testud.c +# End Source File +# Begin Source File + +SOURCE=.\testuser.c +# End Source File +# Begin Source File + +SOURCE=.\testvsn.c +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/testall.dsw b/rubbos/app/httpd-2.0.64/srclib/apr/test/testall.dsw new file mode 100644 index 00000000..f4be05d9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/testall.dsw @@ -0,0 +1,122 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "apr"="..\apr.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "apr_app"="..\build\apr_app.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name apr + End Project Dependency +}}} + +############################################################################### + +Project: "testall"=".\testall.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name apr + End Project Dependency +}}} + +############################################################################### + +Project: "libapr"="..\libapr.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "libapr_app"="..\build\libapr_app.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libapr + End Project Dependency +}}} + +############################################################################### + +Project: "testapp"=".\testapp.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name apr + End Project Dependency + Begin Project Dependency + Project_Dep_Name apr_app + End Project Dependency +}}} + +############################################################################### + +Project: "testappnt"=".\testappnt.dsp" - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name apr + End Project Dependency + Begin Project Dependency + Project_Dep_Name apr_app + End Project Dependency +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/testapp.c b/rubbos/app/httpd-2.0.64/srclib/apr/test/testapp.c new file mode 100644 index 00000000..9e5bec3c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/testapp.c @@ -0,0 +1,10 @@ +#include +#include + +int main(int argc, const char * const * argv, const char * const *env) +{ + apr_app_initialize(&argc, &argv, &env); + + + apr_terminate(); +} \ No newline at end of file diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/testapp.dsp b/rubbos/app/httpd-2.0.64/srclib/apr/test/testapp.dsp new file mode 100644 index 00000000..93c4aa28 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/testapp.dsp @@ -0,0 +1,90 @@ +# Microsoft Developer Studio Project File - Name="testapp" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=testapp - 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 "testapp.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 "testapp.mak" CFG="testapp - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "testapp - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "testapp - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "testapp - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "APR_DECLARE_STATIC" /D "APU_DECLARE_STATIC" /FD /c +# ADD CPP /nologo /MD /W3 /O2 /I "../include" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "APR_DECLARE_STATIC" /D "APU_DECLARE_STATIC" /Fd"./testapp" /FD /c +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib advapi32.lib wsock32.lib ws2_32.lib /nologo /subsystem:console +# ADD LINK32 kernel32.lib advapi32.lib wsock32.lib ws2_32.lib /nologo /subsystem:console + +!ELSEIF "$(CFG)" == "testapp - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "." +# PROP BASE Intermediate_Dir "." +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "." +# PROP Intermediate_Dir "." +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "APR_DECLARE_STATIC" /D "APU_DECLARE_STATIC" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../include" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "APR_DECLARE_STATIC" /D "APU_DECLARE_STATIC" /Fd"./testapp" /FD /c +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib advapi32.lib wsock32.lib ws2_32.lib /nologo /subsystem:console /incremental:no /debug +# ADD LINK32 kernel32.lib advapi32.lib wsock32.lib ws2_32.lib /nologo /subsystem:console /incremental:no /debug + +!ENDIF + +# Begin Target + +# Name "testapp - Win32 Release" +# Name "testapp - Win32 Debug" +# Begin Source File + +SOURCE=.\testapp.c +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/testappnt.dsp b/rubbos/app/httpd-2.0.64/srclib/apr/test/testappnt.dsp new file mode 100644 index 00000000..f5cd4339 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/testappnt.dsp @@ -0,0 +1,101 @@ +# Microsoft Developer Studio Project File - Name="testappnt" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=testappnt - 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 "testappnt.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 "testappnt.mak" CFG="testappnt - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "testappnt - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "testappnt - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "testappnt - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "WINNT" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "APR_DECLARE_STATIC" /D "APU_DECLARE_STATIC" /FD /c +# ADD CPP /nologo /MD /W3 /O2 /I "../include" /D "NDEBUG" /D "WIN32" /D "WINNT" /D "_CONSOLE" /D "APR_DECLARE_STATIC" /D "APU_DECLARE_STATIC" /Fd"./testappnt" /FD /c +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib advapi32.lib wsock32.lib ws2_32.lib /nologo /subsystem:console +# ADD LINK32 kernel32.lib advapi32.lib wsock32.lib ws2_32.lib /nologo /entry:"wmainCRTStartup" /subsystem:console + +!ELSEIF "$(CFG)" == "testappnt - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "." +# PROP BASE Intermediate_Dir "." +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "." +# PROP Intermediate_Dir "." +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "APR_DECLARE_STATIC" /D "APU_DECLARE_STATIC" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../include" /D "_DEBUG" /D "WIN32" /D "WINNT" /D "_CONSOLE" /D "APR_DECLARE_STATIC" /D "APU_DECLARE_STATIC" /Fd"./testappnt" /FD /c +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib advapi32.lib wsock32.lib ws2_32.lib /nologo /subsystem:console /incremental:no /debug +# ADD LINK32 kernel32.lib advapi32.lib wsock32.lib ws2_32.lib /nologo /entry:"wmainCRTStartup" /subsystem:console /incremental:no /debug + +!ENDIF + +# Begin Target + +# Name "testappnt - Win32 Release" +# Name "testappnt - Win32 Debug" +# Begin Source File + +SOURCE=.\testapp.c + +!IF "$(CFG)" == "testappnt - Win32 Release" + +# ADD CPP /Fo"testappnt" + +!ELSEIF "$(CFG)" == "testappnt - Win32 Debug" + +# ADD CPP /Fo"testappnt" + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/testargs.c b/rubbos/app/httpd-2.0.64/srclib/apr/test/testargs.c new file mode 100644 index 00000000..73cd766a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/testargs.c @@ -0,0 +1,236 @@ +/* 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. + */ + +#include "apr_errno.h" +#include "apr_general.h" +#include "apr_getopt.h" +#include "apr_strings.h" +#include "test_apr.h" + +static void format_arg(char *str, char option, const char *arg) +{ + if (arg) { + apr_snprintf(str, 8196, "%soption: %c with %s\n", str, option, arg); + } + else { + apr_snprintf(str, 8196, "%soption: %c\n", str, option); + } +} + +static void unknown_arg(void *str, const char *err, ...) +{ + va_list va; + + va_start(va, err); + apr_vsnprintf(str, 8196, err, va); + va_end(va); +} + +static void no_options_found(CuTest *tc) +{ + int largc = 5; + const char * const largv[] = {"testprog", "-a", "-b", "-c", "-d"}; + apr_getopt_t *opt; + apr_status_t rv; + char data; + const char *optarg; + char str[8196]; + + str[0] = '\0'; + rv = apr_getopt_init(&opt, p, largc, largv); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + while (apr_getopt(opt, "abcd", &data, &optarg) == APR_SUCCESS) { + switch (data) { + case 'a': + case 'b': + case 'c': + case 'd': + default: + format_arg(str, data, optarg); + } + } + CuAssertStrEquals(tc, "option: a\n" + "option: b\n" + "option: c\n" + "option: d\n", str); +} + +static void no_options(CuTest *tc) +{ + int largc = 5; + const char * const largv[] = {"testprog", "-a", "-b", "-c", "-d"}; + apr_getopt_t *opt; + apr_status_t rv; + char data; + const char *optarg; + char str[8196]; + + str[0] = '\0'; + rv = apr_getopt_init(&opt, p, largc, largv); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + opt->errfn = unknown_arg; + opt->errarg = str; + + while (apr_getopt(opt, "efgh", &data, &optarg) == APR_SUCCESS) { + switch (data) { + case 'a': + case 'b': + case 'c': + case 'd': + format_arg(str, data, optarg); + break; + default: + break; + } + } + CuAssertStrEquals(tc, "testprog: illegal option -- a\n", str); +} + +static void required_option(CuTest *tc) +{ + int largc = 3; + const char * const largv[] = {"testprog", "-a", "foo"}; + apr_getopt_t *opt; + apr_status_t rv; + char data; + const char *optarg; + char str[8196]; + + str[0] = '\0'; + rv = apr_getopt_init(&opt, p, largc, largv); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + opt->errfn = unknown_arg; + opt->errarg = str; + + while (apr_getopt(opt, "a:", &data, &optarg) == APR_SUCCESS) { + switch (data) { + case 'a': + format_arg(str, data, optarg); + break; + default: + break; + } + } + CuAssertStrEquals(tc, "option: a with foo\n", str); +} + +static void required_option_notgiven(CuTest *tc) +{ + int largc = 2; + const char * const largv[] = {"testprog", "-a"}; + apr_getopt_t *opt; + apr_status_t rv; + char data; + const char *optarg; + char str[8196]; + + str[0] = '\0'; + rv = apr_getopt_init(&opt, p, largc, largv); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + opt->errfn = unknown_arg; + opt->errarg = str; + + while (apr_getopt(opt, "a:", &data, &optarg) == APR_SUCCESS) { + switch (data) { + case 'a': + format_arg(str, data, optarg); + break; + default: + break; + } + } + CuAssertStrEquals(tc, "testprog: option requires an argument -- a\n", str); +} + +static void optional_option(CuTest *tc) +{ + int largc = 3; + const char * const largv[] = {"testprog", "-a", "foo"}; + apr_getopt_t *opt; + apr_status_t rv; + char data; + const char *optarg; + char str[8196]; + + str[0] = '\0'; + rv = apr_getopt_init(&opt, p, largc, largv); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + opt->errfn = unknown_arg; + opt->errarg = str; + + while (apr_getopt(opt, "a::", &data, &optarg) == APR_SUCCESS) { + switch (data) { + case 'a': + format_arg(str, data, optarg); + break; + default: + break; + } + } + CuAssertStrEquals(tc, "option: a with foo\n", str); +} + +static void optional_option_notgiven(CuTest *tc) +{ + int largc = 2; + const char * const largv[] = {"testprog", "-a"}; + apr_getopt_t *opt; + apr_status_t rv; + char data; + const char *optarg; + char str[8196]; + + str[0] = '\0'; + rv = apr_getopt_init(&opt, p, largc, largv); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + opt->errfn = unknown_arg; + opt->errarg = str; + + while (apr_getopt(opt, "a::", &data, &optarg) == APR_SUCCESS) { + switch (data) { + case 'a': + format_arg(str, data, optarg); + break; + default: + break; + } + } +#if 0 +/* Our version of getopt doesn't allow for optional arguments. */ + CuAssertStrEquals(tc, "option: a\n", str); +#endif + CuAssertStrEquals(tc, "testprog: option requires an argument -- a\n", str); +} + +CuSuite *testgetopt(void) +{ + CuSuite *suite = CuSuiteNew("Getopt"); + + SUITE_ADD_TEST(suite, no_options); + SUITE_ADD_TEST(suite, no_options_found); + SUITE_ADD_TEST(suite, required_option); + SUITE_ADD_TEST(suite, required_option_notgiven); + SUITE_ADD_TEST(suite, optional_option); + SUITE_ADD_TEST(suite, optional_option_notgiven); + + return suite; +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/testatomic.c b/rubbos/app/httpd-2.0.64/srclib/apr/test/testatomic.c new file mode 100644 index 00000000..d226bd1b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/testatomic.c @@ -0,0 +1,344 @@ +/* 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. + */ + +#include +#include +#include "apr_thread_proc.h" +#include "apr_errno.h" +#include "apr_general.h" +#include "apr_atomic.h" +#include "errno.h" +#include "apr_time.h" +#if APR_HAVE_UNISTD_H +#include +#endif + +#if !(defined WIN32) && !(defined NETWARE) +#include +#endif + +apr_pool_t *context; +apr_atomic_t y; /* atomic locks */ + +static apr_status_t check_basic_atomics(volatile apr_atomic_t*p) +{ + apr_atomic_t oldval; + apr_uint32_t casval = 0; + float object1, object2; +#if !(defined NETWARE) + volatile void *casptr; +#else + void *casptr; +#endif + void *oldptr; + + apr_atomic_set(&y, 2); + printf("%-60s", "testing apr_atomic_dec"); + if (apr_atomic_dec(&y) == 0) { + fprintf(stderr, "Failed\noldval =%d should not be zero\n", + apr_atomic_read(&y)); + return APR_EGENERAL; + } + if (apr_atomic_dec(&y) != 0) { + fprintf(stderr, "Failed\noldval =%d should be zero\n", + apr_atomic_read(&y)); + return APR_EGENERAL; + } + printf("OK\n"); + + printf("%-60s", "testing CAS"); + oldval = apr_atomic_cas(&casval, 12, 0); + if (oldval != 0) { + fprintf(stderr, "Failed\noldval =%d should be zero\n", oldval); + return APR_EGENERAL; + } + printf("OK\n"); + printf("%-60s", "testing CAS - match non-null"); + oldval = apr_atomic_cas(&casval, 23, 12); + if (oldval != 12) { + fprintf(stderr, "Failed\noldval =%d should be 12 y=%d\n", + oldval, casval); + return APR_EGENERAL; + } + printf("OK\n"); + printf("%-60s", "testing CAS - no match"); + oldval = apr_atomic_cas(&casval, 23, 12); + if (oldval != 23) { + fprintf(stderr, "Failed\noldval =%d should be 23 y=%d\n", + oldval, casval); + return APR_EGENERAL; + } + printf("OK\n"); + + printf("%-60s", "testing CAS for pointers"); + casptr = NULL; + oldptr = apr_atomic_casptr(&casptr, &object1, 0); + if (oldptr != 0) { + fprintf(stderr, "Failed\noldval =%p should be zero\n", oldptr); + return APR_EGENERAL; + } + printf("OK\n"); + printf("%-60s", "testing CAS for pointers - match non-null"); + oldptr = apr_atomic_casptr(&casptr, &object2, &object1); + if (oldptr != &object1) { + fprintf(stderr, "Failed\noldval =%p should be %p\n", oldptr, &object1); + return APR_EGENERAL; + } + printf("OK\n"); + printf("%-60s", "testing CAS for pointers - no match"); + oldptr = apr_atomic_casptr(&casptr, &object2, &object1); + if (oldptr != &object2) { + fprintf(stderr, "Failed\noldval =%p should be %p\n", oldptr, &object2); + return APR_EGENERAL; + } + printf("OK\n"); + + printf("%-60s", "testing add"); + apr_atomic_set(&y, 23); + apr_atomic_add(&y, 4); + if (apr_atomic_read(&y) != 27) { + fprintf(stderr, + "Failed\nAtomic Add doesn't add up ;( expected 27 got %d\n", + oldval); + return APR_EGENERAL; + } + + printf("OK\n"); + printf("%-60s", "testing add/inc"); + apr_atomic_set(&y, 0); + apr_atomic_add(&y, 20); + apr_atomic_inc(&y); + if (apr_atomic_read(&y) != 21) { + fprintf(stderr, "Failed.\natomics do not add up\n"); + return APR_EGENERAL; + } + fprintf(stdout, "OK\n"); + + return APR_SUCCESS; +} + +#if !APR_HAS_THREADS +int main(void) +{ + apr_status_t rv; + + apr_initialize(); + + fprintf(stderr, + "This program won't work fully on this platform because there is no " + "support for threads.\n"); + if (apr_pool_create(&context, NULL) != APR_SUCCESS) { + fflush(stdout); + fprintf(stderr, "Failed.\nCould not initialize\n"); + exit(-1); + } + rv = apr_atomic_init(context); + if (rv != APR_SUCCESS) { + fprintf(stderr, "Failed.\nCould not initialize atomics\n"); + exit(-1); + } + rv = check_basic_atomics(&y); + if (rv != APR_SUCCESS) { + fprintf(stderr, "Failed.\n"); + exit(-1); + } + return 0; +} +#else /* !APR_HAS_THREADS */ + +void * APR_THREAD_FUNC thread_func_mutex(apr_thread_t *thd, void *data); +void * APR_THREAD_FUNC thread_func_atomic(apr_thread_t *thd, void *data); +void * APR_THREAD_FUNC thread_func_none(apr_thread_t *thd, void *data); + +apr_thread_mutex_t *thread_lock; +volatile long x = 0; /* mutex locks */ +volatile long z = 0; /* no locks */ +int value = 0; +apr_status_t exit_ret_val = 123; /* just some made up number to check on later */ + +#define NUM_THREADS 50 +#define NUM_ITERATIONS 20000 +void * APR_THREAD_FUNC thread_func_mutex(apr_thread_t *thd, void *data) +{ + int i; + + for (i = 0; i < NUM_ITERATIONS; i++) { + apr_thread_mutex_lock(thread_lock); + x++; + apr_thread_mutex_unlock(thread_lock); + } + apr_thread_exit(thd, exit_ret_val); + return NULL; +} + +void * APR_THREAD_FUNC thread_func_atomic(apr_thread_t *thd, void *data) +{ + int i; + + for (i = 0; i < NUM_ITERATIONS ; i++) { + apr_atomic_inc(&y); + apr_atomic_add(&y, 2); + apr_atomic_dec(&y); + apr_atomic_dec(&y); + } + apr_thread_exit(thd, exit_ret_val); + return NULL; +} + +void * APR_THREAD_FUNC thread_func_none(apr_thread_t *thd, void *data) +{ + int i; + + for (i = 0; i < NUM_ITERATIONS ; i++) { + z++; + } + apr_thread_exit(thd, exit_ret_val); + return NULL; +} + +int main(int argc, char**argv) +{ + apr_thread_t *t1[NUM_THREADS]; + apr_thread_t *t2[NUM_THREADS]; + apr_status_t r1[NUM_THREADS]; + apr_status_t r2[NUM_THREADS]; + apr_status_t s1[NUM_THREADS]; + apr_status_t s2[NUM_THREADS]; + apr_status_t rv; + int i; + int mutex; + + apr_initialize(); + + if (argc == 2 && argv[1][0] == 'm') { + mutex = 1; + } + else { + mutex = 0; + } + + printf("APR Atomic Test\n===============\n\n"); +#if !(defined WIN32) && !(defined NETWARE) && !(defined __MVS__) && !(defined DARWIN) + pthread_setconcurrency(8); +#endif + printf("%-60s", "Initializing the context"); + if (apr_pool_create(&context, NULL) != APR_SUCCESS) { + fflush(stdout); + fprintf(stderr, "Failed.\nCould not initialize\n"); + exit(-1); + } + printf("OK\n"); + + if (mutex == 1) { + printf("%-60s", "Initializing the lock"); + rv = apr_thread_mutex_create(&thread_lock, APR_THREAD_MUTEX_DEFAULT, + context); + if (rv != APR_SUCCESS) { + fflush(stdout); + fprintf(stderr, "Failed\nCould not create lock\n"); + exit(-1); + } + printf("OK\n"); + } + printf("%-60s", "Initializing the atomics"); + rv = apr_atomic_init(context); + if (rv != APR_SUCCESS) { + fprintf(stderr, "Failed.\n"); + exit(-1); + } + printf("OK\n"); + + rv = check_basic_atomics(&y); + if (rv != APR_SUCCESS) { + fprintf(stderr, "Failed.\n"); + exit(-1); + } + apr_atomic_set(&y, 0); + + printf("%-60s", "Starting all the threads"); + for (i = 0; i < NUM_THREADS; i++) { + r1[i] = apr_thread_create(&t1[i], NULL, + (mutex == 1 ? thread_func_mutex : thread_func_atomic), + NULL, context); + r2[i] = apr_thread_create(&t2[i], NULL, thread_func_none, NULL, + context); + if (r1[i] != APR_SUCCESS || r2[i] != APR_SUCCESS ) { + fflush(stdout); + fprintf(stderr, "Failed\nError starting thread in group %d\n",i); + exit(-1); + } + } + printf("OK\n"); + + printf("%-60s\n", "Waiting for threads to exit"); + printf("%-60s", "(Note that this may take a while to complete.)"); + fflush(stdout); + + for (i = 0; i < NUM_THREADS; i++) { + apr_thread_join(&s1[i], t1[i]); + apr_thread_join(&s2[i], t2[i]); + if (s1[i] != exit_ret_val || s2[i] != exit_ret_val) { + fprintf(stderr, + "Invalid return value\n" + "Got %d/%d, but expected %d for all \n", + s1[i], s2[i], exit_ret_val); + } + } + printf("OK\n"); + + if (mutex == 1) { + printf("%-60s", "Checking if mutex locks worked"); + if (x != NUM_THREADS * NUM_ITERATIONS) { + fflush(stdout); + fprintf(stderr, + "No!\nThe locks didn't work?? x = %ld instead of %ld\n", + x, + (long)NUM_THREADS * NUM_ITERATIONS); + } + else { + printf("OK\n"); + } + } + else { + printf("%-60s", "Checking if atomic worked"); + if (apr_atomic_read(&y) != NUM_THREADS * NUM_ITERATIONS) { + fflush(stdout); + fprintf(stderr, + "No!\nThe atomics didn't work?? y = %ld instead of %ld\n", + (long)apr_atomic_read(&y), + (long)NUM_THREADS * NUM_ITERATIONS); + } + else { + printf("OK\n"); + } + } + printf("%-60s", "Checking if nolock worked"); + if (z != NUM_THREADS * NUM_ITERATIONS) { + fflush(stdout); + fprintf(stderr, + "no surprise\n" + "The no-locks didn't work. z = %ld instead of %ld\n", + z, + (long)NUM_THREADS * NUM_ITERATIONS); + } + else { + printf("OK\n"); + } + + return 0; +} + +#endif /* !APR_HAS_THREADS */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/testdir.c b/rubbos/app/httpd-2.0.64/srclib/apr/test/testdir.c new file mode 100644 index 00000000..98506463 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/testdir.c @@ -0,0 +1,275 @@ +/* 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. + */ + +#include +#include +#include +#include "apr_file_io.h" +#include "apr_file_info.h" +#include "apr_errno.h" +#include "apr_general.h" +#include "apr_lib.h" +#include "test_apr.h" + +static void test_mkdir(CuTest *tc) +{ + apr_status_t rv; + apr_finfo_t finfo; + + rv = apr_dir_make("data/testdir", APR_UREAD | APR_UWRITE | APR_UEXECUTE, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + rv = apr_stat(&finfo, "data/testdir", APR_FINFO_TYPE, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertIntEquals(tc, APR_DIR, finfo.filetype); +} + +static void test_mkdir_recurs(CuTest *tc) +{ + apr_status_t rv; + apr_finfo_t finfo; + + rv = apr_dir_make_recursive("data/one/two/three", + APR_UREAD | APR_UWRITE | APR_UEXECUTE, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + rv = apr_stat(&finfo, "data/one", APR_FINFO_TYPE, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertIntEquals(tc, APR_DIR, finfo.filetype); + + rv = apr_stat(&finfo, "data/one/two", APR_FINFO_TYPE, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertIntEquals(tc, APR_DIR, finfo.filetype); + + rv = apr_stat(&finfo, "data/one/two/three", APR_FINFO_TYPE, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertIntEquals(tc, APR_DIR, finfo.filetype); +} + +static void test_remove(CuTest *tc) +{ + apr_status_t rv; + apr_finfo_t finfo; + + rv = apr_dir_remove("data/testdir", p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + rv = apr_stat(&finfo, "data/testdir", APR_FINFO_TYPE, p); + CuAssertIntEquals(tc, 1, APR_STATUS_IS_ENOENT(rv)); +} + +static void test_removeall_fail(CuTest *tc) +{ + apr_status_t rv; + + rv = apr_dir_remove("data/one", p); + CuAssertIntEquals(tc, 1, APR_STATUS_IS_ENOTEMPTY(rv)); +} + +static void test_removeall(CuTest *tc) +{ + apr_status_t rv; + + rv = apr_dir_remove("data/one/two/three", p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + rv = apr_dir_remove("data/one/two", p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + rv = apr_dir_remove("data/one", p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); +} + +static void test_remove_notthere(CuTest *tc) +{ + apr_status_t rv; + + rv = apr_dir_remove("data/notthere", p); + CuAssertIntEquals(tc, 1, APR_STATUS_IS_ENOENT(rv)); +} + +static void test_mkdir_twice(CuTest *tc) +{ + apr_status_t rv; + + rv = apr_dir_make("data/testdir", APR_UREAD | APR_UWRITE | APR_UEXECUTE, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + rv = apr_dir_make("data/testdir", APR_UREAD | APR_UWRITE | APR_UEXECUTE, p); + CuAssertIntEquals(tc, 1, APR_STATUS_IS_EEXIST(rv)); + + rv = apr_dir_remove("data/testdir", p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); +} + +static void test_opendir(CuTest *tc) +{ + apr_status_t rv; + apr_dir_t *dir; + + rv = apr_dir_open(&dir, "data", p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + apr_dir_close(dir); +} + +static void test_opendir_notthere(CuTest *tc) +{ + apr_status_t rv; + apr_dir_t *dir; + + rv = apr_dir_open(&dir, "notthere", p); + CuAssertIntEquals(tc, 1, APR_STATUS_IS_ENOENT(rv)); +} + +static void test_closedir(CuTest *tc) +{ + apr_status_t rv; + apr_dir_t *dir; + + rv = apr_dir_open(&dir, "data", p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + rv = apr_dir_close(dir); + CuAssertIntEquals(tc, APR_SUCCESS, rv); +} + +static void test_rewind(CuTest *tc) +{ + apr_dir_t *dir; + apr_finfo_t first, second; + + apr_assert_success(tc, "apr_dir_open failed", apr_dir_open(&dir, "data", p)); + + apr_assert_success(tc, "apr_dir_read failed", + apr_dir_read(&first, APR_FINFO_DIRENT, dir)); + + apr_assert_success(tc, "apr_dir_rewind failed", apr_dir_rewind(dir)); + + apr_assert_success(tc, "second apr_dir_read failed", + apr_dir_read(&second, APR_FINFO_DIRENT, dir)); + + apr_assert_success(tc, "apr_dir_close failed", apr_dir_close(dir)); + + CuAssertStrEquals(tc, first.name, second.name); +} + +/* Test for a (fixed) bug in apr_dir_read(). This bug only happened + in threadless cases. */ +static void test_uncleared_errno(CuTest *tc) +{ + apr_file_t *thefile = NULL; + apr_finfo_t finfo; + apr_int32_t finfo_flags = APR_FINFO_TYPE | APR_FINFO_NAME; + apr_dir_t *this_dir; + apr_status_t rv; + + rv = apr_dir_make("dir1", APR_OS_DEFAULT, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + rv = apr_dir_make("dir2", APR_OS_DEFAULT, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + rv = apr_file_open(&thefile, "dir1/file1", + APR_READ | APR_WRITE | APR_CREATE, APR_OS_DEFAULT, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + rv = apr_file_close(thefile); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + /* Try to remove dir1. This should fail because it's not empty. + However, on a platform with threads disabled (such as FreeBSD), + `errno' will be set as a result. */ + rv = apr_dir_remove("dir1", p); + CuAssertIntEquals(tc, 1, APR_STATUS_IS_ENOTEMPTY(rv)); + + /* Read `.' and `..' out of dir2. */ + rv = apr_dir_open(&this_dir, "dir2", p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + rv = apr_dir_read(&finfo, finfo_flags, this_dir); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + rv = apr_dir_read(&finfo, finfo_flags, this_dir); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + /* Now, when we attempt to do a third read of empty dir2, and the + underlying system readdir() returns NULL, the old value of + errno shouldn't cause a false alarm. We should get an ENOENT + back from apr_dir_read, and *not* the old errno. */ + rv = apr_dir_read(&finfo, finfo_flags, this_dir); + CuAssertIntEquals(tc, 1, APR_STATUS_IS_ENOENT(rv)); + + rv = apr_dir_close(this_dir); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + /* Cleanup */ + rv = apr_file_remove("dir1/file1", p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + rv = apr_dir_remove("dir1", p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + rv = apr_dir_remove("dir2", p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + +} + +static void test_rmkdir_nocwd(CuTest *tc) +{ + char *cwd, *path; + apr_status_t rv; + + apr_assert_success(tc, "make temp dir", + apr_dir_make("dir3", APR_OS_DEFAULT, p)); + + apr_assert_success(tc, "obtain cwd", apr_filepath_get(&cwd, 0, p)); + + apr_assert_success(tc, "determine path to temp dir", + apr_filepath_merge(&path, cwd, "dir3", 0, p)); + + apr_assert_success(tc, "change to temp dir", apr_filepath_set(path, p)); + + rv = apr_dir_remove(path, p); + /* Some platforms cannot remove a directory which is in use. */ + if (rv == APR_SUCCESS) { + CuAssert(tc, "fail to create dir", + apr_dir_make_recursive("foobar", APR_OS_DEFAULT, + p) != APR_SUCCESS); + } + + apr_assert_success(tc, "restore cwd", apr_filepath_set(cwd, p)); + + if (rv) { + apr_dir_remove(path, p); + CuNotImpl(tc, "cannot remove in-use directory"); + } +} + +CuSuite *testdir(void) +{ + CuSuite *suite = CuSuiteNew("Directory"); + + SUITE_ADD_TEST(suite, test_mkdir); + SUITE_ADD_TEST(suite, test_mkdir_recurs); + SUITE_ADD_TEST(suite, test_remove); + SUITE_ADD_TEST(suite, test_removeall_fail); + SUITE_ADD_TEST(suite, test_removeall); + SUITE_ADD_TEST(suite, test_remove_notthere); + SUITE_ADD_TEST(suite, test_mkdir_twice); + SUITE_ADD_TEST(suite, test_rmkdir_nocwd); + + SUITE_ADD_TEST(suite, test_rewind); + + SUITE_ADD_TEST(suite, test_opendir); + SUITE_ADD_TEST(suite, test_opendir_notthere); + SUITE_ADD_TEST(suite, test_closedir); + SUITE_ADD_TEST(suite, test_uncleared_errno); + + return suite; +} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/testdso.c b/rubbos/app/httpd-2.0.64/srclib/apr/test/testdso.c new file mode 100644 index 00000000..f30beb14 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/testdso.c @@ -0,0 +1,247 @@ +/* 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. + */ + + +#include "test_apr.h" +#include "apr_general.h" +#include "apr_pools.h" +#include "apr_errno.h" +#include "apr_dso.h" +#include "apr_strings.h" +#include "apr_file_info.h" +#include "apr.h" +#if APR_HAVE_UNISTD_H +#include +#endif + +#ifdef NETWARE +# define MOD_NAME "mod_test.nlm" +#elif defined(BEOS) || defined(WIN32) +# define MOD_NAME "mod_test.so" +#elif defined(DARWIN) +# define MOD_NAME ".libs/mod_test.so" +# define LIB_NAME ".libs/libmod_test.dylib" +#elif defined(__hpux__) || defined(__hpux) +# define MOD_NAME ".libs/mod_test.sl" +# define LIB_NAME ".libs/libmod_test.sl" +#elif defined(_AIX) || defined(__bsdi__) +# define MOD_NAME ".libs/libmod_test.so" +# define LIB_NAME ".libs/libmod_test.so" +#else /* Every other Unix */ +# define MOD_NAME ".libs/mod_test.so" +# define LIB_NAME ".libs/libmod_test.so" +#endif + +static char *modname; + +static void test_load_module(CuTest *tc) +{ + apr_dso_handle_t *h = NULL; + apr_status_t status; + char errstr[256]; + + status = apr_dso_load(&h, modname, p); + CuAssert(tc, apr_dso_error(h, errstr, 256), APR_SUCCESS == status); + CuAssertPtrNotNull(tc, h); + + apr_dso_unload(h); +} + +static void test_dso_sym(CuTest *tc) +{ + apr_dso_handle_t *h = NULL; + apr_dso_handle_sym_t func1 = NULL; + apr_status_t status; + void (*function)(char str[256]); + char teststr[256]; + char errstr[256]; + + status = apr_dso_load(&h, modname, p); + CuAssert(tc, apr_dso_error(h, errstr, 256), APR_SUCCESS == status); + CuAssertPtrNotNull(tc, h); + + status = apr_dso_sym(&func1, h, "print_hello"); + CuAssert(tc, apr_dso_error(h, errstr, 256), APR_SUCCESS == status); + CuAssertPtrNotNull(tc, func1); + + function = (void (*)(char *))func1; + (*function)(teststr); + CuAssertStrEquals(tc, "Hello - I'm a DSO!\n", teststr); + + apr_dso_unload(h); +} + +static void test_dso_sym_return_value(CuTest *tc) +{ + apr_dso_handle_t *h = NULL; + apr_dso_handle_sym_t func1 = NULL; + apr_status_t status; + int (*function)(int); + char errstr[256]; + + status = apr_dso_load(&h, modname, p); + CuAssert(tc, apr_dso_error(h, errstr, 256), APR_SUCCESS == status); + CuAssertPtrNotNull(tc, h); + + status = apr_dso_sym(&func1, h, "count_reps"); + CuAssert(tc, apr_dso_error(h, errstr, 256), APR_SUCCESS == status); + CuAssertPtrNotNull(tc, func1); + + function = (int (*)(int))func1; + status = (*function)(5); + CuAssertIntEquals(tc, 5, status); + + apr_dso_unload(h); +} + +static void test_unload_module(CuTest *tc) +{ + apr_dso_handle_t *h = NULL; + apr_status_t status; + char errstr[256]; + apr_dso_handle_sym_t func1 = NULL; + + status = apr_dso_load(&h, modname, p); + CuAssert(tc, apr_dso_error(h, errstr, 256), APR_SUCCESS == status); + CuAssertPtrNotNull(tc, h); + + status = apr_dso_unload(h); + CuAssert(tc, apr_dso_error(h, errstr, 256), APR_SUCCESS == status); + + status = apr_dso_sym(&func1, h, "print_hello"); + CuAssertIntEquals(tc, 1, APR_STATUS_IS_ESYMNOTFOUND(status)); +} + + +#ifdef LIB_NAME +static char *libname; + +static void test_load_library(CuTest *tc) +{ + apr_dso_handle_t *h = NULL; + apr_status_t status; + char errstr[256]; + + status = apr_dso_load(&h, libname, p); + CuAssert(tc, apr_dso_error(h, errstr, 256), APR_SUCCESS == status); + CuAssertPtrNotNull(tc, h); + + apr_dso_unload(h); +} + +static void test_dso_sym_library(CuTest *tc) +{ + apr_dso_handle_t *h = NULL; + apr_dso_handle_sym_t func1 = NULL; + apr_status_t status; + void (*function)(char str[256]); + char teststr[256]; + char errstr[256]; + + status = apr_dso_load(&h, libname, p); + CuAssert(tc, apr_dso_error(h, errstr, 256), APR_SUCCESS == status); + CuAssertPtrNotNull(tc, h); + + status = apr_dso_sym(&func1, h, "print_hello"); + CuAssert(tc, apr_dso_error(h, errstr, 256), APR_SUCCESS == status); + CuAssertPtrNotNull(tc, func1); + + function = (void (*)(char *))func1; + (*function)(teststr); + CuAssertStrEquals(tc, "Hello - I'm a DSO!\n", teststr); + + apr_dso_unload(h); +} + +static void test_dso_sym_return_value_library(CuTest *tc) +{ + apr_dso_handle_t *h = NULL; + apr_dso_handle_sym_t func1 = NULL; + apr_status_t status; + int (*function)(int); + char errstr[256]; + + status = apr_dso_load(&h, libname, p); + CuAssert(tc, apr_dso_error(h, errstr, 256), APR_SUCCESS == status); + CuAssertPtrNotNull(tc, h); + + status = apr_dso_sym(&func1, h, "count_reps"); + CuAssert(tc, apr_dso_error(h, errstr, 256), APR_SUCCESS == status); + CuAssertPtrNotNull(tc, func1); + + function = (int (*)(int))func1; + status = (*function)(5); + CuAssertIntEquals(tc, 5, status); + + apr_dso_unload(h); +} + +static void test_unload_library(CuTest *tc) +{ + apr_dso_handle_t *h = NULL; + apr_status_t status; + char errstr[256]; + apr_dso_handle_sym_t func1 = NULL; + + status = apr_dso_load(&h, libname, p); + CuAssert(tc, apr_dso_error(h, errstr, 256), APR_SUCCESS == status); + CuAssertPtrNotNull(tc, h); + + status = apr_dso_unload(h); + CuAssert(tc, apr_dso_error(h, errstr, 256), APR_SUCCESS == status); + + status = apr_dso_sym(&func1, h, "print_hello"); + CuAssertIntEquals(tc, 1, APR_STATUS_IS_ESYMNOTFOUND(status)); +} + +#endif /* def(LIB_NAME) */ + +static void test_load_notthere(CuTest *tc) +{ + apr_dso_handle_t *h = NULL; + apr_status_t status; + + status = apr_dso_load(&h, "No_File.so", p); + + CuAssertIntEquals(tc, 1, APR_STATUS_IS_EDSOOPEN(status)); + CuAssertPtrNotNull(tc, h); +} + +CuSuite *testdso(void) +{ + CuSuite *suite = CuSuiteNew("DSO"); + + apr_filepath_merge(&modname, NULL, MOD_NAME, 0, p); + + SUITE_ADD_TEST(suite, test_load_module); + SUITE_ADD_TEST(suite, test_dso_sym); + SUITE_ADD_TEST(suite, test_dso_sym_return_value); + SUITE_ADD_TEST(suite, test_unload_module); + +#ifdef LIB_NAME + apr_filepath_merge(&libname, NULL, LIB_NAME, 0, p); + + SUITE_ADD_TEST(suite, test_load_library); + SUITE_ADD_TEST(suite, test_dso_sym_library); + SUITE_ADD_TEST(suite, test_dso_sym_return_value_library); + SUITE_ADD_TEST(suite, test_unload_library); +#endif + + SUITE_ADD_TEST(suite, test_load_notthere); + + return suite; +} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/testdup.c b/rubbos/app/httpd-2.0.64/srclib/apr/test/testdup.c new file mode 100644 index 00000000..74f64aee --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/testdup.c @@ -0,0 +1,194 @@ +/* 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. + */ + + +#include "apr_general.h" +#include "apr_pools.h" +#include "apr_errno.h" +#include "apr_file_io.h" +#include "test_apr.h" + +#define TEST "Testing\n" +#define TEST2 "Testing again\n" +#define FILEPATH "data/" + +static void test_file_dup(CuTest *tc) +{ + apr_file_t *file1 = NULL; + apr_file_t *file3 = NULL; + apr_status_t rv; + apr_finfo_t finfo; + + /* First, create a new file, empty... */ + rv = apr_file_open(&file1, FILEPATH "testdup.file", + APR_READ | APR_WRITE | APR_CREATE | + APR_DELONCLOSE, APR_OS_DEFAULT, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertPtrNotNull(tc, file1); + + rv = apr_file_dup(&file3, file1, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertPtrNotNull(tc, file3); + + rv = apr_file_close(file1); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + /* cleanup after ourselves */ + rv = apr_file_close(file3); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + rv = apr_stat(&finfo, FILEPATH "testdup.file", APR_FINFO_NORM, p); + CuAssertIntEquals(tc, 1, APR_STATUS_IS_ENOENT(rv)); +} + +static void test_file_readwrite(CuTest *tc) +{ + apr_file_t *file1 = NULL; + apr_file_t *file3 = NULL; + apr_status_t rv; + apr_finfo_t finfo; + apr_size_t txtlen = sizeof(TEST); + char buff[50]; + apr_off_t fpos; + + /* First, create a new file, empty... */ + rv = apr_file_open(&file1, FILEPATH "testdup.readwrite.file", + APR_READ | APR_WRITE | APR_CREATE | + APR_DELONCLOSE, APR_OS_DEFAULT, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertPtrNotNull(tc, file1); + + rv = apr_file_dup(&file3, file1, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertPtrNotNull(tc, file3); + + rv = apr_file_write(file3, TEST, &txtlen); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertIntEquals(tc, sizeof(TEST), txtlen); + + fpos = 0; + rv = apr_file_seek(file1, APR_SET, &fpos); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssert(tc, "File position mismatch, expected 0", fpos == 0); + + txtlen = 50; + rv = apr_file_read(file1, buff, &txtlen); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertStrEquals(tc, TEST, buff); + + /* cleanup after ourselves */ + rv = apr_file_close(file1); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + rv = apr_file_close(file3); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + rv = apr_stat(&finfo, FILEPATH "testdup.readwrite.file", APR_FINFO_NORM, p); + CuAssertIntEquals(tc, 1, APR_STATUS_IS_ENOENT(rv)); +} + +static void test_dup2(CuTest *tc) +{ + apr_file_t *testfile = NULL; + apr_file_t *errfile = NULL; + apr_file_t *saveerr = NULL; + apr_status_t rv; + + rv = apr_file_open(&testfile, FILEPATH "testdup2.file", + APR_READ | APR_WRITE | APR_CREATE | + APR_DELONCLOSE, APR_OS_DEFAULT, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertPtrNotNull(tc, testfile); + + rv = apr_file_open_stderr(&errfile, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + /* Set aside the real errfile */ + rv = apr_file_dup(&saveerr, errfile, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertPtrNotNull(tc, saveerr); + + rv = apr_file_dup2(errfile, testfile, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertPtrNotNull(tc, errfile); + + apr_file_close(testfile); + + rv = apr_file_dup2(errfile, saveerr, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertPtrNotNull(tc, errfile); +} + +static void test_dup2_readwrite(CuTest *tc) +{ + apr_file_t *errfile = NULL; + apr_file_t *testfile = NULL; + apr_file_t *saveerr = NULL; + apr_status_t rv; + apr_size_t txtlen = sizeof(TEST); + char buff[50]; + apr_off_t fpos; + + rv = apr_file_open(&testfile, FILEPATH "testdup2.readwrite.file", + APR_READ | APR_WRITE | APR_CREATE | + APR_DELONCLOSE, APR_OS_DEFAULT, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertPtrNotNull(tc, testfile); + + rv = apr_file_open_stderr(&errfile, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + /* Set aside the real errfile */ + rv = apr_file_dup(&saveerr, errfile, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertPtrNotNull(tc, saveerr); + + rv = apr_file_dup2(errfile, testfile, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertPtrNotNull(tc, errfile); + + txtlen = sizeof(TEST2); + rv = apr_file_write(errfile, TEST2, &txtlen); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertIntEquals(tc, sizeof(TEST2), txtlen); + + fpos = 0; + rv = apr_file_seek(testfile, APR_SET, &fpos); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssert(tc, "File position mismatch, expected 0", fpos == 0); + + txtlen = 50; + rv = apr_file_read(testfile, buff, &txtlen); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertStrEquals(tc, TEST2, buff); + + apr_file_close(testfile); + + rv = apr_file_dup2(errfile, saveerr, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertPtrNotNull(tc, errfile); +} + +CuSuite *testdup(void) +{ + CuSuite *suite = CuSuiteNew("File duplication"); + + SUITE_ADD_TEST(suite, test_file_dup); + SUITE_ADD_TEST(suite, test_file_readwrite); + SUITE_ADD_TEST(suite, test_dup2); + SUITE_ADD_TEST(suite, test_dup2_readwrite); + + return suite; +} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/testenv.c b/rubbos/app/httpd-2.0.64/srclib/apr/test/testenv.c new file mode 100644 index 00000000..6bc97a11 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/testenv.c @@ -0,0 +1,144 @@ +/* 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. + */ + +#include "apr_env.h" +#include "apr_errno.h" +#include "test_apr.h" + +#define TEST_ENVVAR_NAME "apr_test_envvar" +#define TEST_ENVVAR2_NAME "apr_test_envvar2" +#define TEST_ENVVAR_VALUE "Just a value that we'll check" + +static int have_env_set; +static int have_env_get; +static int have_env_del; + +static void test_setenv(CuTest *tc) +{ + apr_status_t rv; + + rv = apr_env_set(TEST_ENVVAR_NAME, TEST_ENVVAR_VALUE, p); + have_env_set = (rv != APR_ENOTIMPL); + if (!have_env_set) { + CuNotImpl(tc, "apr_env_set"); + return; + } + apr_assert_success(tc, "set environment variable", rv); +} + +static void test_getenv(CuTest *tc) +{ + char *value; + apr_status_t rv; + + if (!have_env_set) { + CuNotImpl(tc, "apr_env_set (skip test for apr_env_get)"); + return; + } + + rv = apr_env_get(&value, TEST_ENVVAR_NAME, p); + have_env_get = (rv != APR_ENOTIMPL); + if (!have_env_get) { + CuNotImpl(tc, "apr_env_get"); + return; + } + apr_assert_success(tc, "get environment variable", rv); + CuAssertStrEquals(tc, TEST_ENVVAR_VALUE, value); +} + +static void test_delenv(CuTest *tc) +{ + char *value; + apr_status_t rv; + + if (!have_env_set) { + CuNotImpl(tc, "apr_env_set (skip test for apr_env_delete)"); + return; + } + + rv = apr_env_delete(TEST_ENVVAR_NAME, p); + have_env_del = (rv != APR_ENOTIMPL); + if (!have_env_del) { + CuNotImpl(tc, "apr_env_delete"); + return; + } + apr_assert_success(tc, "delete environment variable", rv); + + if (!have_env_get) { + CuNotImpl(tc, "apr_env_get (skip sanity check for apr_env_delete)"); + return; + } + rv = apr_env_get(&value, TEST_ENVVAR_NAME, p); + CuAssertIntEquals(tc, APR_ENOENT, rv); +} + +/** http://issues.apache.org/bugzilla/show_bug.cgi?id=40764 */ +static void test_emptyenv(CuTest *tc) +{ + char *value; + apr_status_t rv; + + if (!(have_env_set && have_env_get)) { + CuNotImpl(tc, "apr_env_set (skip test_emptyenv)"); + return; + } + /** Set empty string and test that rv != ENOENT) */ + rv = apr_env_set(TEST_ENVVAR_NAME, "", p); + apr_assert_success(tc, "set environment variable", rv); + rv = apr_env_get(&value, TEST_ENVVAR_NAME, p); + apr_assert_success(tc, "get environment variable", rv); + CuAssertStrEquals(tc, "", value); + + if (!have_env_del) { + CuNotImpl(tc, "apr_env_del (skip recycle test_emptyenv)"); + return; + } + /** Delete and retest */ + rv = apr_env_delete(TEST_ENVVAR_NAME, p); + apr_assert_success(tc, "delete environment variable", rv); + rv = apr_env_get(&value, TEST_ENVVAR_NAME, p); + CuAssertIntEquals(tc, APR_ENOENT, rv); + + /** Set second variable + test*/ + rv = apr_env_set(TEST_ENVVAR2_NAME, TEST_ENVVAR_VALUE, p); + apr_assert_success(tc, "set second environment variable", rv); + rv = apr_env_get(&value, TEST_ENVVAR2_NAME, p); + apr_assert_success(tc, "get second environment variable", rv); + CuAssertStrEquals(tc, TEST_ENVVAR_VALUE, value); + + /** Finally, test ENOENT (first variable) followed by second != ENOENT) */ + rv = apr_env_get(&value, TEST_ENVVAR_NAME, p); + CuAssertIntEquals(tc, APR_ENOENT, rv); + rv = apr_env_get(&value, TEST_ENVVAR2_NAME, p); + apr_assert_success(tc, "verify second environment variable", rv); + CuAssertStrEquals(tc, TEST_ENVVAR_VALUE, value); + + /** Cleanup */ + apr_env_delete(TEST_ENVVAR2_NAME, p); +} + +CuSuite *testenv(void) +{ + CuSuite *suite = CuSuiteNew("Environment"); + + SUITE_ADD_TEST(suite, test_setenv); + SUITE_ADD_TEST(suite, test_getenv); + SUITE_ADD_TEST(suite, test_delenv); + SUITE_ADD_TEST(suite, test_emptyenv); + + return suite; +} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/testfile.c b/rubbos/app/httpd-2.0.64/srclib/apr/test/testfile.c new file mode 100644 index 00000000..4e842f97 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/testfile.c @@ -0,0 +1,782 @@ +/* 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. + */ + +#include "apr_file_io.h" +#include "apr_file_info.h" +#include "apr_network_io.h" +#include "apr_errno.h" +#include "apr_general.h" +#include "apr_poll.h" +#include "apr_lib.h" +#include "test_apr.h" + +#define DIRNAME "data" +#define FILENAME DIRNAME "/file_datafile.txt" +#define TESTSTR "This is the file data file." + +#define TESTREAD_BLKSIZE 1024 +#define APR_BUFFERSIZE 4096 /* This should match APR's buffer size. */ + + + +static void test_open_noreadwrite(CuTest *tc) +{ + apr_status_t rv; + apr_file_t *thefile = NULL; + + rv = apr_file_open(&thefile, FILENAME, + APR_CREATE | APR_EXCL, + APR_UREAD | APR_UWRITE | APR_GREAD, p); + CuAssertTrue(tc, rv != APR_SUCCESS); + CuAssertIntEquals(tc, 1, APR_STATUS_IS_EACCES(rv)); + CuAssertPtrEquals(tc, NULL, thefile); +} + +static void test_open_excl(CuTest *tc) +{ + apr_status_t rv; + apr_file_t *thefile = NULL; + + rv = apr_file_open(&thefile, FILENAME, + APR_CREATE | APR_EXCL | APR_WRITE, + APR_UREAD | APR_UWRITE | APR_GREAD, p); + CuAssertTrue(tc, rv != APR_SUCCESS); + CuAssertIntEquals(tc, 1, APR_STATUS_IS_EEXIST(rv)); + CuAssertPtrEquals(tc, NULL, thefile); +} + +static void test_open_read(CuTest *tc) +{ + apr_status_t rv; + apr_file_t *filetest = NULL; + + rv = apr_file_open(&filetest, FILENAME, + APR_READ, + APR_UREAD | APR_UWRITE | APR_GREAD, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertPtrNotNull(tc, filetest); + apr_file_close(filetest); +} + +static void test_read(CuTest *tc) +{ + apr_status_t rv; + apr_size_t nbytes = 256; + char *str = apr_pcalloc(p, nbytes + 1); + apr_file_t *filetest = NULL; + + rv = apr_file_open(&filetest, FILENAME, + APR_READ, + APR_UREAD | APR_UWRITE | APR_GREAD, p); + + apr_assert_success(tc, "Opening test file " FILENAME, rv); + rv = apr_file_read(filetest, str, &nbytes); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertIntEquals(tc, strlen(TESTSTR), nbytes); + CuAssertStrEquals(tc, TESTSTR, str); + + apr_file_close(filetest); +} + +static void test_filename(CuTest *tc) +{ + const char *str; + apr_status_t rv; + apr_file_t *filetest = NULL; + + rv = apr_file_open(&filetest, FILENAME, + APR_READ, + APR_UREAD | APR_UWRITE | APR_GREAD, p); + apr_assert_success(tc, "Opening test file " FILENAME, rv); + + rv = apr_file_name_get(&str, filetest); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertStrEquals(tc, FILENAME, str); + + apr_file_close(filetest); +} + +static void test_fileclose(CuTest *tc) +{ + char str; + apr_status_t rv; + apr_size_t one = 1; + apr_file_t *filetest = NULL; + + rv = apr_file_open(&filetest, FILENAME, + APR_READ, + APR_UREAD | APR_UWRITE | APR_GREAD, p); + apr_assert_success(tc, "Opening test file " FILENAME, rv); + + rv = apr_file_close(filetest); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + /* We just closed the file, so this should fail */ + rv = apr_file_read(filetest, &str, &one); + CuAssertIntEquals(tc, 1, APR_STATUS_IS_EBADF(rv)); +} + +static void test_file_remove(CuTest *tc) +{ + apr_status_t rv; + apr_file_t *filetest = NULL; + + rv = apr_file_remove(FILENAME, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + rv = apr_file_open(&filetest, FILENAME, APR_READ, + APR_UREAD | APR_UWRITE | APR_GREAD, p); + CuAssertIntEquals(tc, 1, APR_STATUS_IS_ENOENT(rv)); +} + +static void test_open_write(CuTest *tc) +{ + apr_status_t rv; + apr_file_t *filetest = NULL; + + filetest = NULL; + rv = apr_file_open(&filetest, FILENAME, + APR_WRITE, + APR_UREAD | APR_UWRITE | APR_GREAD, p); + CuAssertIntEquals(tc, 1, APR_STATUS_IS_ENOENT(rv)); + CuAssertPtrEquals(tc, NULL, filetest); +} + +static void test_open_writecreate(CuTest *tc) +{ + apr_status_t rv; + apr_file_t *filetest = NULL; + + filetest = NULL; + rv = apr_file_open(&filetest, FILENAME, + APR_WRITE | APR_CREATE, + APR_UREAD | APR_UWRITE | APR_GREAD, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + apr_file_close(filetest); +} + +static void test_write(CuTest *tc) +{ + apr_status_t rv; + apr_size_t bytes = strlen(TESTSTR); + apr_file_t *filetest = NULL; + + rv = apr_file_open(&filetest, FILENAME, + APR_WRITE | APR_CREATE, + APR_UREAD | APR_UWRITE | APR_GREAD, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + rv = apr_file_write(filetest, TESTSTR, &bytes); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + apr_file_close(filetest); +} + +static void test_open_readwrite(CuTest *tc) +{ + apr_status_t rv; + apr_file_t *filetest = NULL; + + filetest = NULL; + rv = apr_file_open(&filetest, FILENAME, + APR_READ | APR_WRITE, + APR_UREAD | APR_UWRITE | APR_GREAD, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertPtrNotNull(tc, filetest); + + apr_file_close(filetest); +} + +static void test_seek(CuTest *tc) +{ + apr_status_t rv; + apr_off_t offset = 5; + apr_size_t nbytes = 256; + char *str = apr_pcalloc(p, nbytes + 1); + apr_file_t *filetest = NULL; + + rv = apr_file_open(&filetest, FILENAME, + APR_READ, + APR_UREAD | APR_UWRITE | APR_GREAD, p); + apr_assert_success(tc, "Open test file " FILENAME, rv); + + rv = apr_file_read(filetest, str, &nbytes); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertIntEquals(tc, strlen(TESTSTR), nbytes); + CuAssertStrEquals(tc, TESTSTR, str); + + memset(str, 0, nbytes + 1); + + rv = apr_file_seek(filetest, SEEK_SET, &offset); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + rv = apr_file_read(filetest, str, &nbytes); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertIntEquals(tc, strlen(TESTSTR) - 5, nbytes); + CuAssertStrEquals(tc, TESTSTR + 5, str); + + apr_file_close(filetest); + + /* Test for regression of sign error bug with SEEK_END and + buffered files. */ + rv = apr_file_open(&filetest, FILENAME, + APR_READ | APR_BUFFERED, + APR_UREAD | APR_UWRITE | APR_GREAD, p); + apr_assert_success(tc, "Open test file " FILENAME, rv); + + offset = -5; + rv = apr_file_seek(filetest, SEEK_END, &offset); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertIntEquals(tc, strlen(TESTSTR) - 5, offset); + + memset(str, 0, nbytes + 1); + nbytes = 256; + rv = apr_file_read(filetest, str, &nbytes); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertIntEquals(tc, 5, nbytes); + CuAssertStrEquals(tc, TESTSTR + strlen(TESTSTR) - 5, str); + + apr_file_close(filetest); +} + +static void test_userdata_set(CuTest *tc) +{ + apr_status_t rv; + apr_file_t *filetest = NULL; + + rv = apr_file_open(&filetest, FILENAME, + APR_WRITE, + APR_UREAD | APR_UWRITE | APR_GREAD, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + rv = apr_file_data_set(filetest, "This is a test", + "test", apr_pool_cleanup_null); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + apr_file_close(filetest); +} + +static void test_userdata_get(CuTest *tc) +{ + apr_status_t rv; + char *teststr; + apr_file_t *filetest = NULL; + + rv = apr_file_open(&filetest, FILENAME, + APR_WRITE, + APR_UREAD | APR_UWRITE | APR_GREAD, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + rv = apr_file_data_set(filetest, "This is a test", + "test", apr_pool_cleanup_null); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + rv = apr_file_data_get((void **)&teststr, "test", filetest); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertStrEquals(tc, "This is a test", teststr); + + apr_file_close(filetest); +} + +static void test_userdata_getnokey(CuTest *tc) +{ + apr_status_t rv; + char *teststr; + apr_file_t *filetest = NULL; + + rv = apr_file_open(&filetest, FILENAME, + APR_WRITE, + APR_UREAD | APR_UWRITE | APR_GREAD, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + rv = apr_file_data_get((void **)&teststr, "nokey", filetest); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertPtrEquals(tc, NULL, teststr); + apr_file_close(filetest); +} + +static void test_getc(CuTest *tc) +{ + apr_file_t *f = NULL; + apr_status_t rv; + char ch; + + rv = apr_file_open(&f, FILENAME, APR_READ, 0, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + apr_file_getc(&ch, f); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertIntEquals(tc, (int)TESTSTR[0], (int)ch); + apr_file_close(f); +} + +static void test_ungetc(CuTest *tc) +{ + apr_file_t *f = NULL; + apr_status_t rv; + char ch; + + rv = apr_file_open(&f, FILENAME, APR_READ, 0, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + apr_file_getc(&ch, f); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertIntEquals(tc, (int)TESTSTR[0], (int)ch); + + apr_file_ungetc('X', f); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + apr_file_getc(&ch, f); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertIntEquals(tc, 'X', (int)ch); + + apr_file_close(f); +} + +static void test_gets(CuTest *tc) +{ + apr_file_t *f = NULL; + apr_status_t rv; + char *str = apr_palloc(p, 256); + + rv = apr_file_open(&f, FILENAME, APR_READ, 0, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + rv = apr_file_gets(str, 256, f); + /* Only one line in the test file, so APR will encounter EOF on the first + * call to gets, but we should get APR_SUCCESS on this call and + * APR_EOF on the next. + */ + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertStrEquals(tc, TESTSTR, str); + rv = apr_file_gets(str, 256, f); + CuAssertIntEquals(tc, APR_EOF, rv); + CuAssertStrEquals(tc, "", str); + apr_file_close(f); +} + +static void test_bigread(CuTest *tc) +{ + apr_file_t *f = NULL; + apr_status_t rv; + char buf[APR_BUFFERSIZE * 2]; + apr_size_t nbytes; + + /* Create a test file with known content. + */ + rv = apr_file_open(&f, "data/created_file", + APR_CREATE | APR_WRITE | APR_TRUNCATE, + APR_UREAD | APR_UWRITE, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + nbytes = APR_BUFFERSIZE; + memset(buf, 0xFE, nbytes); + + rv = apr_file_write(f, buf, &nbytes); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertIntEquals(tc, APR_BUFFERSIZE, nbytes); + + rv = apr_file_close(f); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + f = NULL; + rv = apr_file_open(&f, "data/created_file", APR_READ, 0, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + nbytes = sizeof buf; + rv = apr_file_read(f, buf, &nbytes); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertIntEquals(tc, APR_BUFFERSIZE, nbytes); + + rv = apr_file_close(f); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + rv = apr_file_remove("data/created_file", p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); +} + +/* Test that the contents of file FNAME are equal to data EXPECT of + * length EXPECTLEN. */ +static void file_contents_equal(CuTest *tc, + const char *fname, + const void *expect, + apr_size_t expectlen) +{ + void *actual = apr_palloc(p, expectlen); + apr_file_t *f; + apr_status_t rv; + int rc; + + rv = apr_file_open(&f, fname, APR_READ|APR_BUFFERED, 0, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + rv = apr_file_read_full(f, actual, expectlen, NULL); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + rc = memcmp(expect, actual, expectlen); + CuAssertIntEquals(tc, 0, rc); + + rv = apr_file_close(f); + CuAssertIntEquals(tc, APR_SUCCESS, rv); +} + +#define LINE1 "this is a line of text\n" +#define LINE2 "this is a second line of text\n" + +static void test_writev_buffered(CuTest *tc) +{ + apr_status_t rv; + apr_file_t *f; + apr_size_t nbytes; + struct iovec vec[2]; + const char *fname = "data/testwritev_buffered.dat"; + + rv = apr_file_open(&f, fname, + APR_WRITE | APR_CREATE | APR_TRUNCATE | + APR_BUFFERED, APR_OS_DEFAULT, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + nbytes = strlen(TESTSTR); + rv = apr_file_write(f, TESTSTR, &nbytes); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + vec[0].iov_base = LINE1; + vec[0].iov_len = strlen(LINE1); + vec[1].iov_base = LINE2; + vec[1].iov_len = strlen(LINE2); + + rv = apr_file_writev(f, vec, 2, &nbytes); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + rv = apr_file_close(f); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + file_contents_equal(tc, fname, TESTSTR LINE1 LINE2, + strlen(TESTSTR) + strlen(LINE1) + strlen(LINE2)); +} + +static void test_writev_buffered_seek(CuTest *tc) +{ + apr_file_t *f; + apr_status_t rv; + apr_off_t off = 0; + struct iovec vec[3]; + apr_size_t nbytes = strlen(TESTSTR); + char *str = apr_pcalloc(p, nbytes+1); + const char *fname = "data/testwritev_buffered.dat"; + + rv = apr_file_open(&f, fname, + APR_WRITE | APR_READ | APR_BUFFERED, + APR_OS_DEFAULT, p); + + rv = apr_file_read(f, str, &nbytes); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertStrEquals(tc, TESTSTR, str); + + rv = apr_file_seek(f, APR_SET, &off); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + vec[0].iov_base = LINE1; + vec[0].iov_len = strlen(LINE1); + vec[1].iov_base = LINE2; + vec[1].iov_len = strlen(LINE2); + vec[2].iov_base = TESTSTR; + vec[2].iov_len = strlen(TESTSTR); + + rv = apr_file_writev(f, vec, 3, &nbytes); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + rv = apr_file_close(f); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + file_contents_equal(tc, fname, LINE1 LINE2 TESTSTR, + strlen(LINE1) + strlen(LINE2) + strlen(TESTSTR)); + + rv = apr_file_remove(fname, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); +} + +/* This is a horrible name for this function. We are testing APR, not how + * Apache uses APR. And, this function tests _way_ too much stuff. + */ +static void test_mod_neg(CuTest *tc) +{ + apr_status_t rv; + apr_file_t *f; + const char *s; + int i; + apr_size_t nbytes; + char buf[8192]; + apr_off_t cur; + const char *fname = "data/modneg.dat"; + + rv = apr_file_open(&f, fname, + APR_CREATE | APR_WRITE, APR_UREAD | APR_UWRITE, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + s = "body56789\n"; + nbytes = strlen(s); + rv = apr_file_write(f, s, &nbytes); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertIntEquals(tc, strlen(s), nbytes); + + for (i = 0; i < 7980; i++) { + s = "0"; + nbytes = strlen(s); + rv = apr_file_write(f, s, &nbytes); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertIntEquals(tc, strlen(s), nbytes); + } + + s = "end456789\n"; + nbytes = strlen(s); + rv = apr_file_write(f, s, &nbytes); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertIntEquals(tc, strlen(s), nbytes); + + for (i = 0; i < 10000; i++) { + s = "1"; + nbytes = strlen(s); + rv = apr_file_write(f, s, &nbytes); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertIntEquals(tc, strlen(s), nbytes); + } + + rv = apr_file_close(f); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + rv = apr_file_open(&f, fname, APR_READ, 0, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + rv = apr_file_gets(buf, 11, f); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertStrEquals(tc, "body56789\n", buf); + + cur = 0; + rv = apr_file_seek(f, APR_CUR, &cur); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssert(tc, "File Pointer Mismatch, expected 10", cur == 10); + + nbytes = sizeof(buf); + rv = apr_file_read(f, buf, &nbytes); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertIntEquals(tc, nbytes, sizeof(buf)); + + cur = -((apr_off_t)nbytes - 7980); + rv = apr_file_seek(f, APR_CUR, &cur); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssert(tc, "File Pointer Mismatch, expected 7990", cur == 7990); + + rv = apr_file_gets(buf, 11, f); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertStrEquals(tc, "end456789\n", buf); + + rv = apr_file_close(f); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + rv = apr_file_remove(fname, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); +} + +static void test_truncate(CuTest *tc) +{ + apr_status_t rv; + apr_file_t *f; + const char *fname = "data/testtruncate.dat"; + const char *s; + apr_size_t nbytes; + apr_finfo_t finfo; + + apr_file_remove(fname, p); + + rv = apr_file_open(&f, fname, + APR_CREATE | APR_WRITE, APR_UREAD | APR_UWRITE, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + s = "some data"; + nbytes = strlen(s); + rv = apr_file_write(f, s, &nbytes); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertIntEquals(tc, strlen(s), nbytes); + + rv = apr_file_close(f); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + rv = apr_file_open(&f, fname, + APR_TRUNCATE | APR_WRITE, APR_UREAD | APR_UWRITE, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + rv = apr_file_close(f); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + rv = apr_stat(&finfo, fname, APR_FINFO_SIZE, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssert(tc, "File size mismatch, expected 0 (empty)", finfo.size == 0); + + rv = apr_file_remove(fname, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); +} + +static void test_fail_write_flush(CuTest *tc) +{ + apr_file_t *f; + const char *fname = "data/testflush.dat"; + apr_status_t rv; + char buf[APR_BUFFERSIZE]; + int n; + + apr_file_remove(fname, p); + + apr_assert_success(tc, "open test file", + apr_file_open(&f, fname, + APR_CREATE|APR_READ|APR_BUFFERED, + APR_UREAD|APR_UWRITE, p)); + + memset(buf, 'A', sizeof buf); + + /* Try three writes. One of these should fail when it exceeds the + * internal buffer and actually tries to write to the file, which + * was opened read-only and hence should be unwritable. */ + for (n = 0, rv = APR_SUCCESS; n < 4 && rv == APR_SUCCESS; n++) { + apr_size_t bytes = sizeof buf; + rv = apr_file_write(f, buf, &bytes); + } + + CuAssert(tc, "failed to write to read-only buffered fd", + rv != APR_SUCCESS); + + apr_file_close(f); + apr_file_remove(fname, p); +} + +static void test_fail_read_flush(CuTest *tc) +{ + apr_file_t *f; + const char *fname = "data/testflush.dat"; + apr_status_t rv; + char buf[2]; + + apr_file_remove(fname, p); + + apr_assert_success(tc, "open test file", + apr_file_open(&f, fname, + APR_CREATE|APR_READ|APR_BUFFERED, + APR_UREAD|APR_UWRITE, p)); + + /* this write should be buffered. */ + apr_assert_success(tc, "buffered write should succeed", + apr_file_puts("hello", f)); + + /* Now, trying a read should fail since the write must be flushed, + * and should fail with something other than EOF since the file is + * opened read-only. */ + rv = apr_file_read_full(f, buf, 2, NULL); + + CuAssert(tc, "read should flush buffered write and fail", + rv != APR_SUCCESS && rv != APR_EOF); + + /* Likewise for gets */ + rv = apr_file_gets(buf, 2, f); + + CuAssert(tc, "gets should flush buffered write and fail", + rv != APR_SUCCESS && rv != APR_EOF); + + apr_file_close(f); + apr_file_remove(fname, p); +} + +static void test_xthread(CuTest *tc) +{ + apr_file_t *f; + const char *fname = "data/testxthread.dat"; + apr_status_t rv; + apr_int32_t flags = APR_CREATE|APR_READ|APR_WRITE|APR_APPEND|APR_XTHREAD; + char buf[128] = { 0 }; + + /* Test for bug 38438, opening file with append + xthread and seeking to + the end of the file resulted in writes going to the beginning not the + end. */ + + apr_file_remove(fname, p); + + rv = apr_file_open(&f, fname, flags, APR_UREAD|APR_UWRITE, p); + CuAssert(tc, "open test file", rv == APR_SUCCESS); + + rv = apr_file_puts("hello", f); + CuAssert(tc, "write should succeed", rv == APR_SUCCESS); + + apr_file_close(f); + + rv = apr_file_open(&f, fname, flags, APR_UREAD|APR_UWRITE, p); + CuAssert(tc, "open test file", rv == APR_SUCCESS); + + /* Seek to the end. */ + { + apr_off_t offset = 0; + + rv = apr_file_seek(f, APR_END, &offset); + } + + rv = apr_file_puts("world", f); + CuAssert(tc, "more writes should succeed", rv == APR_SUCCESS); + + /* Back to the beginning. */ + { + apr_off_t offset = 0; + + rv = apr_file_seek(f, APR_SET, &offset); + } + + apr_file_read_full(f, buf, sizeof(buf), NULL); + + CuAssertStrEquals(tc, "helloworld", buf); + + apr_file_close(f); +} + +CuSuite *testfile(void) +{ + CuSuite *suite = CuSuiteNew("File I/O"); + + SUITE_ADD_TEST(suite, test_open_noreadwrite); + SUITE_ADD_TEST(suite, test_open_excl); + SUITE_ADD_TEST(suite, test_open_read); + SUITE_ADD_TEST(suite, test_open_readwrite); + SUITE_ADD_TEST(suite, test_read); + SUITE_ADD_TEST(suite, test_seek); + SUITE_ADD_TEST(suite, test_filename); + SUITE_ADD_TEST(suite, test_fileclose); + SUITE_ADD_TEST(suite, test_file_remove); + SUITE_ADD_TEST(suite, test_open_write); + SUITE_ADD_TEST(suite, test_open_writecreate); + SUITE_ADD_TEST(suite, test_write); + SUITE_ADD_TEST(suite, test_userdata_set); + SUITE_ADD_TEST(suite, test_userdata_get); + SUITE_ADD_TEST(suite, test_userdata_getnokey); + SUITE_ADD_TEST(suite, test_getc); + SUITE_ADD_TEST(suite, test_ungetc); + SUITE_ADD_TEST(suite, test_gets); + SUITE_ADD_TEST(suite, test_bigread); + SUITE_ADD_TEST(suite, test_writev_buffered); + SUITE_ADD_TEST(suite, test_writev_buffered_seek); + SUITE_ADD_TEST(suite, test_mod_neg); + SUITE_ADD_TEST(suite, test_truncate); + SUITE_ADD_TEST(suite, test_fail_write_flush); + SUITE_ADD_TEST(suite, test_fail_read_flush); + SUITE_ADD_TEST(suite, test_xthread); + + return suite; +} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/testfileinfo.c b/rubbos/app/httpd-2.0.64/srclib/apr/test/testfileinfo.c new file mode 100644 index 00000000..00ad9631 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/testfileinfo.c @@ -0,0 +1,263 @@ +/* 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. + */ + +#include "apr_file_io.h" +#include "apr_file_info.h" +#include "apr_strings.h" +#include "apr_errno.h" +#include "apr_general.h" +#include "apr_poll.h" +#include "apr_lib.h" +#include "test_apr.h" + +#define FILENAME "data/file_datafile.txt" +#define NEWFILENAME "data/new_datafile.txt" +#define NEWFILEDATA "This is new text in a new file." + +static const struct view_fileinfo +{ + apr_int32_t bits; + char *description; +} vfi[] = { + {APR_FINFO_MTIME, "MTIME"}, + {APR_FINFO_CTIME, "CTIME"}, + {APR_FINFO_ATIME, "ATIME"}, + {APR_FINFO_SIZE, "SIZE"}, + {APR_FINFO_DEV, "DEV"}, + {APR_FINFO_INODE, "INODE"}, + {APR_FINFO_NLINK, "NLINK"}, + {APR_FINFO_TYPE, "TYPE"}, + {APR_FINFO_USER, "USER"}, + {APR_FINFO_GROUP, "GROUP"}, + {APR_FINFO_UPROT, "UPROT"}, + {APR_FINFO_GPROT, "GPROT"}, + {APR_FINFO_WPROT, "WPROT"}, + {0, NULL} +}; + +static void finfo_equal(CuTest *tc, apr_finfo_t f1, apr_finfo_t f2) +{ + /* Minimum supported flags across all platforms (APR_FINFO_MIN) */ + CuAssert(tc, "apr_stat and apr_getfileinfo must return APR_FINFO_TYPE", + (f1.valid & f2.valid & APR_FINFO_TYPE)); + CuAssert(tc, "apr_stat and apr_getfileinfo differ in filetype", + f1.filetype == f2.filetype); + CuAssert(tc, "apr_stat and apr_getfileinfo must return APR_FINFO_SIZE", + (f1.valid & f2.valid & APR_FINFO_SIZE)); + CuAssert(tc, "apr_stat and apr_getfileinfo differ in size", + f1.size == f2.size); + CuAssert(tc, "apr_stat and apr_getfileinfo must return APR_FINFO_ATIME", + (f1.valid & f2.valid & APR_FINFO_ATIME)); + CuAssert(tc, "apr_stat and apr_getfileinfo differ in atime", + f1.atime == f2.atime); + CuAssert(tc, "apr_stat and apr_getfileinfo must return APR_FINFO_MTIME", + (f1.valid & f2.valid & APR_FINFO_MTIME)); + CuAssert(tc, "apr_stat and apr_getfileinfo differ in mtime", + f1.mtime == f2.mtime); + CuAssert(tc, "apr_stat and apr_getfileinfo must return APR_FINFO_CTIME", + (f1.valid & f2.valid & APR_FINFO_CTIME)); + CuAssert(tc, "apr_stat and apr_getfileinfo differ in ctime", + f1.ctime == f2.ctime); + + if (f1.valid & f2.valid & APR_FINFO_NAME) + CuAssert(tc, "apr_stat and apr_getfileinfo differ in name", + !strcmp(f1.name, f2.name)); + if (f1.fname && f2.fname) + CuAssert(tc, "apr_stat and apr_getfileinfo differ in fname", + !strcmp(f1.fname, f2.fname)); + + /* Additional supported flags not supported on all platforms */ + if (f1.valid & f2.valid & APR_FINFO_USER) + CuAssert(tc, "apr_stat and apr_getfileinfo differ in user", + !apr_uid_compare(f1.user, f2.user)); + if (f1.valid & f2.valid & APR_FINFO_GROUP) + CuAssert(tc, "apr_stat and apr_getfileinfo differ in group", + !apr_gid_compare(f1.group, f2.group)); + if (f1.valid & f2.valid & APR_FINFO_INODE) + CuAssert(tc, "apr_stat and apr_getfileinfo differ in inode", + f1.inode == f2.inode); + if (f1.valid & f2.valid & APR_FINFO_DEV) + CuAssert(tc, "apr_stat and apr_getfileinfo differ in device", + f1.device == f2.device); + if (f1.valid & f2.valid & APR_FINFO_NLINK) + CuAssert(tc, "apr_stat and apr_getfileinfo differ in nlink", + f1.nlink == f2.nlink); + if (f1.valid & f2.valid & APR_FINFO_CSIZE) + CuAssert(tc, "apr_stat and apr_getfileinfo differ in csize", + f1.csize == f2.csize); + if (f1.valid & f2.valid & APR_FINFO_PROT) + CuAssert(tc, "apr_stat and apr_getfileinfo differ in protection", + f1.protection == f2.protection); +} + +static void test_info_get(CuTest *tc) +{ + apr_file_t *thefile; + apr_finfo_t finfo; + apr_status_t rv; + + rv = apr_file_open(&thefile, FILENAME, APR_READ, APR_OS_DEFAULT, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + rv = apr_file_info_get(&finfo, APR_FINFO_NORM, thefile); + if (rv == APR_INCOMPLETE) { + char *str; + int i; + str = apr_pstrdup(p, "APR_INCOMPLETE: Missing "); + for (i = 0; vfi[i].bits; ++i) { + if (vfi[i].bits & ~finfo.valid) { + str = apr_pstrcat(p, str, vfi[i].description, " ", NULL); + } + } + CuFail(tc, str); + } + CuAssertIntEquals(tc, APR_SUCCESS, rv); + apr_file_close(thefile); +} + +static void test_stat(CuTest *tc) +{ + apr_finfo_t finfo; + apr_status_t rv; + + rv = apr_stat(&finfo, FILENAME, APR_FINFO_NORM, p); + if (rv == APR_INCOMPLETE) { + char *str; + int i; + str = apr_pstrdup(p, "APR_INCOMPLETE: Missing "); + for (i = 0; vfi[i].bits; ++i) { + if (vfi[i].bits & ~finfo.valid) { + str = apr_pstrcat(p, str, vfi[i].description, " ", NULL); + } + } + CuFail(tc, str); + } + CuAssertIntEquals(tc, APR_SUCCESS, rv); +} + +static void test_stat_eq_finfo(CuTest *tc) +{ + apr_file_t *thefile; + apr_finfo_t finfo; + apr_finfo_t stat_finfo; + apr_status_t rv; + + rv = apr_file_open(&thefile, FILENAME, APR_READ, APR_OS_DEFAULT, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + rv = apr_file_info_get(&finfo, APR_FINFO_NORM, thefile); + + /* Opening the file may have toggled the atime member (time last + * accessed), so fetch our apr_stat() after getting the fileinfo + * of the open file... + */ + rv = apr_stat(&stat_finfo, FILENAME, APR_FINFO_NORM, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + apr_file_close(thefile); + + finfo_equal(tc, stat_finfo, finfo); +} + +static void test_buffered_write_size(CuTest *tc) +{ + const apr_size_t data_len = strlen(NEWFILEDATA); + apr_file_t *thefile; + apr_finfo_t finfo; + apr_status_t rv; + apr_size_t bytes; + + rv = apr_file_open(&thefile, NEWFILENAME, + APR_READ | APR_WRITE | APR_CREATE | APR_TRUNCATE + | APR_BUFFERED | APR_DELONCLOSE, + APR_OS_DEFAULT, p); + apr_assert_success(tc, "open file", rv); + + /* A funny thing happened to me the other day: I wrote something + * into a buffered file, then asked for its size using + * apr_file_info_get; and guess what? The size was 0! That's not a + * nice way to behave. + */ + bytes = data_len; + rv = apr_file_write(thefile, NEWFILEDATA, &bytes); + apr_assert_success(tc, "write file contents", rv); + CuAssertTrue(tc, data_len == bytes); + + rv = apr_file_info_get(&finfo, APR_FINFO_SIZE, thefile); + apr_assert_success(tc, "get file size", rv); + CuAssertTrue(tc, bytes == (apr_size_t) finfo.size); + apr_file_close(thefile); +} + +static void test_mtime_set(CuTest *tc) +{ + apr_file_t *thefile; + apr_finfo_t finfo; + apr_time_t epoch = 0; + apr_status_t rv; + + /* This test sort of depends on the system clock being at least + * marginally ccorrect; We'll be setting the modification time to + * the epoch. + */ + rv = apr_file_open(&thefile, NEWFILENAME, + APR_READ | APR_WRITE | APR_CREATE | APR_TRUNCATE + | APR_BUFFERED | APR_DELONCLOSE, + APR_OS_DEFAULT, p); + apr_assert_success(tc, "open file", rv); + + /* Check that the current mtime is not the epoch */ + rv = apr_stat(&finfo, NEWFILENAME, APR_FINFO_MTIME, p); + if (rv == APR_INCOMPLETE) { + char *str; + int i; + str = apr_pstrdup(p, "APR_INCOMPLETE: Missing "); + for (i = 0; vfi[i].bits; ++i) { + if (vfi[i].bits & ~finfo.valid) { + str = apr_pstrcat(p, str, vfi[i].description, " ", NULL); + } + } + CuFail(tc, str); + } + apr_assert_success(tc, "get initial mtime", rv); + CuAssertTrue(tc, finfo.mtime != epoch); + + /* Reset the mtime to the epoch and verify the result. + * Note: we blindly assume that if the first apr_stat succeeded, + * the second one will, too. + */ + rv = apr_file_mtime_set(NEWFILENAME, epoch, p); + apr_assert_success(tc, "set mtime", rv); + + rv = apr_stat(&finfo, NEWFILENAME, APR_FINFO_MTIME, p); + apr_assert_success(tc, "get modified mtime", rv); + CuAssertTrue(tc, finfo.mtime == epoch); + + apr_file_close(thefile); +} + +CuSuite *testfileinfo(void) +{ + CuSuite *suite = CuSuiteNew("File Info"); + + SUITE_ADD_TEST(suite, test_info_get); + SUITE_ADD_TEST(suite, test_stat); + SUITE_ADD_TEST(suite, test_stat_eq_finfo); + SUITE_ADD_TEST(suite, test_buffered_write_size); + SUITE_ADD_TEST(suite, test_mtime_set); + + return suite; +} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/testflock.c b/rubbos/app/httpd-2.0.64/srclib/apr/test/testflock.c new file mode 100644 index 00000000..86f25ba2 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/testflock.c @@ -0,0 +1,156 @@ +/* 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 + * + * Start one process, no args, and place it into the background. Start a + * second process with the "-r" switch to attempt a read on the file + * created by the first process. + * + * $ ./testflock & + * ...messages... + * $ ./testflock -r + * ...messages... + * + * The first process will sleep for 30 seconds while holding a lock. The + * second process will attempt to grab it (non-blocking) and fail. It + * will then grab it with a blocking scheme. When the first process' 30 + * seconds are up, it will exit (thus releasing its lock). The second + * process will acquire the lock, then exit. + */ + +#include "apr_pools.h" +#include "apr_file_io.h" +#include "apr_time.h" +#include "apr_general.h" +#include "apr_getopt.h" +#include "apr_strings.h" + +#include +#include + +const char *testfile = "testfile.tmp"; + +static apr_pool_t *pool = NULL; + +static void errmsg(const char *msg) +{ + if (pool != NULL) + apr_pool_destroy(pool); + fprintf(stderr, msg); + exit(1); +} + +static void errmsg2(const char *msg, apr_status_t rv) +{ + char *newmsg; + char errstr[120]; + + apr_strerror(rv, errstr, sizeof errstr); + newmsg = apr_psprintf(pool, "%s: %s (%d)\n", + msg, errstr, rv); + errmsg(newmsg); + exit(1); +} + +static void do_read(void) +{ + apr_file_t *file; + apr_status_t status; + + if (apr_file_open(&file, testfile, APR_WRITE, + APR_OS_DEFAULT, pool) != APR_SUCCESS) + errmsg("Could not open test file.\n"); + printf("Test file opened.\n"); + + status = apr_file_lock(file, APR_FLOCK_EXCLUSIVE | APR_FLOCK_NONBLOCK); + if (!APR_STATUS_IS_EAGAIN(status)) { + char msg[200]; + errmsg(apr_psprintf(pool, "Expected APR_EAGAIN. Got %d: %s.\n", + status, apr_strerror(status, msg, sizeof(msg)))); + } + printf("First attempt: we were properly locked out.\nWaiting for lock..."); + fflush(stdout); + + if (apr_file_lock(file, APR_FLOCK_EXCLUSIVE) != APR_SUCCESS) + errmsg("Could not establish lock on test file."); + printf(" got it.\n"); + + (void) apr_file_close(file); + printf("Exiting.\n"); +} + +static void do_write(void) +{ + apr_file_t *file; + apr_status_t rv; + + if (apr_file_open(&file, testfile, APR_WRITE|APR_CREATE, APR_OS_DEFAULT, + pool) != APR_SUCCESS) + errmsg("Could not create file.\n"); + printf("Test file created.\n"); + + if ((rv = apr_file_lock(file, APR_FLOCK_EXCLUSIVE)) != APR_SUCCESS) + errmsg2("Could not lock the file", rv); + printf("Lock created.\nSleeping..."); + fflush(stdout); + + apr_sleep(apr_time_from_sec(30)); + + (void) apr_file_close(file); + printf(" done.\nExiting.\n"); +} + +int main(int argc, const char * const *argv) +{ + int reader = 0; + apr_status_t status; + char optchar; + const char *optarg; + apr_getopt_t *opt; + + if (apr_initialize() != APR_SUCCESS) + errmsg("Could not initialize APR.\n"); + atexit(apr_terminate); + + if (apr_pool_create(&pool, NULL) != APR_SUCCESS) + errmsg("Could not create global pool.\n"); + + if (apr_getopt_init(&opt, pool, argc, argv) != APR_SUCCESS) + errmsg("Could not parse options.\n"); + + while ((status = apr_getopt(opt, "rf:", &optchar, &optarg)) == APR_SUCCESS) { + if (optchar == 'r') + ++reader; + else if (optchar == 'f') + testfile = optarg; + } + if (status != APR_SUCCESS && status != APR_EOF) { + char msgbuf[80]; + + fprintf(stderr, "error: %s\n", + apr_strerror(status, msgbuf, sizeof msgbuf)); + exit(1); + } + + if (reader) + do_read(); + else + do_write(); + + return 0; +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/testfmt.c b/rubbos/app/httpd-2.0.64/srclib/apr/test/testfmt.c new file mode 100644 index 00000000..eff39e0d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/testfmt.c @@ -0,0 +1,113 @@ +/* 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. + */ + +#include "test_apr.h" +#include "apr.h" +#include "apr_portable.h" +#include "apr_strings.h" + +static void ssize_t_fmt(CuTest *tc) +{ + char buf[100]; + apr_ssize_t var = 0; + + sprintf(buf, "%" APR_SSIZE_T_FMT, var); + CuAssertStrEquals(tc, "0", buf); + apr_snprintf(buf, sizeof(buf), "%" APR_SSIZE_T_FMT, var); + CuAssertStrEquals(tc, "0", buf); +} + +static void size_t_fmt(CuTest *tc) +{ + char buf[100]; + apr_size_t var = 0; + + sprintf(buf, "%" APR_SIZE_T_FMT, var); + CuAssertStrEquals(tc, "0", buf); + apr_snprintf(buf, sizeof(buf), "%" APR_SIZE_T_FMT, var); + CuAssertStrEquals(tc, "0", buf); +} + +static void off_t_fmt(CuTest *tc) +{ + char buf[100]; + apr_off_t var = 0; + + sprintf(buf, "%" APR_OFF_T_FMT, var); + CuAssertStrEquals(tc, "0", buf); + apr_snprintf(buf, sizeof(buf), "%" APR_OFF_T_FMT, var); + CuAssertStrEquals(tc, "0", buf); +} + +static void pid_t_fmt(CuTest *tc) +{ + char buf[100]; + pid_t var = 0; + + sprintf(buf, "%" APR_PID_T_FMT, var); + CuAssertStrEquals(tc, "0", buf); + apr_snprintf(buf, sizeof(buf), "%" APR_PID_T_FMT, var); + CuAssertStrEquals(tc, "0", buf); +} + +static void int64_t_fmt(CuTest *tc) +{ + char buf[100]; + apr_int64_t var = 0; + + sprintf(buf, "%" APR_INT64_T_FMT, var); + CuAssertStrEquals(tc, "0", buf); + apr_snprintf(buf, sizeof(buf), "%" APR_INT64_T_FMT, var); + CuAssertStrEquals(tc, "0", buf); +} + +static void uint64_t_fmt(CuTest *tc) +{ + char buf[100]; + apr_uint64_t var = 14000000; + + sprintf(buf, "%" APR_UINT64_T_FMT, var); + CuAssertStrEquals(tc, "14000000", buf); + apr_snprintf(buf, sizeof(buf), "%" APR_UINT64_T_FMT, var); + CuAssertStrEquals(tc, "14000000", buf); +} + +static void uint64_t_hex_fmt(CuTest *tc) +{ + char buf[100]; + apr_uint64_t var = 14000000; + + sprintf(buf, "%" APR_UINT64_T_HEX_FMT, var); + CuAssertStrEquals(tc, "d59f80", buf); + apr_snprintf(buf, sizeof(buf), "%" APR_UINT64_T_HEX_FMT, var); + CuAssertStrEquals(tc, "d59f80", buf); +} + +CuSuite *testfmt(void) +{ + CuSuite *suite = CuSuiteNew("Formats"); + + SUITE_ADD_TEST(suite, ssize_t_fmt); + SUITE_ADD_TEST(suite, size_t_fmt); + SUITE_ADD_TEST(suite, off_t_fmt); + SUITE_ADD_TEST(suite, pid_t_fmt); + SUITE_ADD_TEST(suite, int64_t_fmt); + SUITE_ADD_TEST(suite, uint64_t_fmt); + SUITE_ADD_TEST(suite, uint64_t_hex_fmt); + + return suite; +} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/testglobalmutex.c b/rubbos/app/httpd-2.0.64/srclib/apr/test/testglobalmutex.c new file mode 100644 index 00000000..7ac3b518 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/testglobalmutex.c @@ -0,0 +1,158 @@ +/* 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. + */ + +#include "apr_shm.h" +#include "apr_thread_proc.h" +#include "apr_file_io.h" +#include "apr_global_mutex.h" +#include "apr_errno.h" +#include "apr_general.h" +#include "apr_getopt.h" +#include "errno.h" +#include +#include +#include "test_apr.h" + + +#define MAX_ITER 4000 +#define MAX_COUNTER (MAX_ITER * 4) + +apr_global_mutex_t *global_lock; +apr_pool_t *pool; +volatile int *x; + +static int make_child(apr_proc_t **proc, apr_pool_t *p) +{ + int i = 0; + *proc = apr_pcalloc(p, sizeof(**proc)); + + /* slight delay to allow things to settle */ + apr_sleep (1); + + if (apr_proc_fork(*proc, p) == APR_INCHILD) { + apr_initialize(); + + apr_global_mutex_child_init(&global_lock, NULL, p); + + while (1) { + apr_global_mutex_lock(global_lock); + if (i == MAX_ITER) { + apr_global_mutex_unlock(global_lock); + exit(1); + } + i++; + (*x)++; + apr_global_mutex_unlock(global_lock); + } + exit(1); + } + return APR_SUCCESS; +} + +static apr_status_t test_exclusive(const char *lockname) +{ + apr_proc_t *p1, *p2, *p3, *p4; + apr_status_t s1, s2, s3, s4; + + printf("Exclusive lock test\n"); + printf("%-60s", " Initializing the lock"); + s1 = apr_global_mutex_create(&global_lock, lockname, APR_LOCK_DEFAULT, pool); + + if (s1 != APR_SUCCESS) { + printf("Failed!\n"); + return s1; + } + printf("OK\n"); + + printf("%-60s", " Starting all of the processes"); + fflush(stdout); + s1 = make_child(&p1, pool); + s2 = make_child(&p2, pool); + s3 = make_child(&p3, pool); + s4 = make_child(&p4, pool); + if (s1 != APR_SUCCESS || s2 != APR_SUCCESS || + s3 != APR_SUCCESS || s4 != APR_SUCCESS) { + printf("Failed!\n"); + return s1; + } + printf("OK\n"); + + printf("%-60s", " Waiting for processes to exit"); + s1 = apr_proc_wait(p1, NULL, NULL, APR_WAIT); + s2 = apr_proc_wait(p2, NULL, NULL, APR_WAIT); + s3 = apr_proc_wait(p3, NULL, NULL, APR_WAIT); + s4 = apr_proc_wait(p4, NULL, NULL, APR_WAIT); + printf("OK\n"); + + if ((*x) != MAX_COUNTER) { + fprintf(stderr, "Locks don't appear to work! x = %d instead of %d\n", + (*x), MAX_COUNTER); + } + else { + printf("Test passed\n"); + } + return APR_SUCCESS; +} + +int main(int argc, const char * const *argv) +{ + apr_status_t rv; + char errmsg[200]; + const char *lockname = NULL; + const char *shmname = "shm.file"; + apr_getopt_t *opt; + char optchar; + const char *optarg; + apr_shm_t *shm; + + printf("APR Proc Mutex Test\n==============\n\n"); + + apr_initialize(); + atexit(apr_terminate); + + if (apr_pool_create(&pool, NULL) != APR_SUCCESS) + exit(-1); + + if ((rv = apr_getopt_init(&opt, pool, argc, argv)) != APR_SUCCESS) { + fprintf(stderr, "Could not set up to parse options: [%d] %s\n", + rv, apr_strerror(rv, errmsg, sizeof errmsg)); + exit(-1); + } + + while ((rv = apr_getopt(opt, "f:", &optchar, &optarg)) == APR_SUCCESS) { + if (optchar == 'f') { + lockname = optarg; + } + } + + if (rv != APR_SUCCESS && rv != APR_EOF) { + fprintf(stderr, "Could not parse options: [%d] %s\n", + rv, apr_strerror(rv, errmsg, sizeof errmsg)); + exit(-1); + } + + apr_shm_create(&shm, sizeof(int), shmname, pool); + x = apr_shm_baseaddr_get(shm); + + if ((rv = test_exclusive(lockname)) != APR_SUCCESS) { + fprintf(stderr,"Exclusive Lock test failed : [%d] %s\n", + rv, apr_strerror(rv, (char*)errmsg, 200)); + exit(-2); + } + + return 0; +} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/testhash.c b/rubbos/app/httpd-2.0.64/srclib/apr/test/testhash.c new file mode 100644 index 00000000..6962236e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/testhash.c @@ -0,0 +1,403 @@ +/* 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. + */ + +#include "test_apr.h" +#include "apr.h" +#include "apr_strings.h" +#include "apr_general.h" +#include "apr_pools.h" +#include "apr_hash.h" + +static void dump_hash(apr_pool_t *p, apr_hash_t *h, char *str) +{ + apr_hash_index_t *hi; + char *val, *key; + apr_ssize_t len; + int i = 0; + + str[0] = '\0'; + + for (hi = apr_hash_first(p, h); hi; hi = apr_hash_next(hi)) { + apr_hash_this(hi,(void*) &key, &len, (void*) &val); + apr_snprintf(str, 8196, "%sKey %s (%" APR_SSIZE_T_FMT ") Value %s\n", + str, key, len, val); + i++; + } + apr_snprintf(str, 8196, "%s#entries %d\n", str, i); +} + +static void sum_hash(apr_pool_t *p, apr_hash_t *h, int *pcount, int *keySum, int *valSum) +{ + apr_hash_index_t *hi; + void *val, *key; + int count = 0; + + *keySum = 0; + *valSum = 0; + *pcount = 0; + for (hi = apr_hash_first(p, h); hi; hi = apr_hash_next(hi)) { + apr_hash_this(hi, (void*)&key, NULL, &val); + *valSum += *(int *)val; + *keySum += *(int *)key; + count++; + } + *pcount=count; +} + +static void hash_make(CuTest *tc) +{ + apr_hash_t *h = NULL; + + h = apr_hash_make(p); + CuAssertPtrNotNull(tc, h); +} + +static void hash_set(CuTest *tc) +{ + apr_hash_t *h = NULL; + char *result = NULL; + + h = apr_hash_make(p); + CuAssertPtrNotNull(tc, h); + + apr_hash_set(h, "key", APR_HASH_KEY_STRING, "value"); + result = apr_hash_get(h, "key", APR_HASH_KEY_STRING); + CuAssertStrEquals(tc, "value", result); +} + +static void hash_reset(CuTest *tc) +{ + apr_hash_t *h = NULL; + char *result = NULL; + + h = apr_hash_make(p); + CuAssertPtrNotNull(tc, h); + + apr_hash_set(h, "key", APR_HASH_KEY_STRING, "value"); + result = apr_hash_get(h, "key", APR_HASH_KEY_STRING); + CuAssertStrEquals(tc, "value", result); + + apr_hash_set(h, "key", APR_HASH_KEY_STRING, "new"); + result = apr_hash_get(h, "key", APR_HASH_KEY_STRING); + CuAssertStrEquals(tc, "new", result); +} + +static void same_value(CuTest *tc) +{ + apr_hash_t *h = NULL; + char *result = NULL; + + h = apr_hash_make(p); + CuAssertPtrNotNull(tc, h); + + apr_hash_set(h, "same1", APR_HASH_KEY_STRING, "same"); + result = apr_hash_get(h, "same1", APR_HASH_KEY_STRING); + CuAssertStrEquals(tc, "same", result); + + apr_hash_set(h, "same2", APR_HASH_KEY_STRING, "same"); + result = apr_hash_get(h, "same2", APR_HASH_KEY_STRING); + CuAssertStrEquals(tc, "same", result); +} + +static void key_space(CuTest *tc) +{ + apr_hash_t *h = NULL; + char *result = NULL; + + h = apr_hash_make(p); + CuAssertPtrNotNull(tc, h); + + apr_hash_set(h, "key with space", APR_HASH_KEY_STRING, "value"); + result = apr_hash_get(h, "key with space", APR_HASH_KEY_STRING); + CuAssertStrEquals(tc, "value", result); +} + +/* This is kind of a hack, but I am just keeping an existing test. This is + * really testing apr_hash_first, apr_hash_next, and apr_hash_this which + * should be tested in three separate tests, but this will do for now. + */ +static void hash_traverse(CuTest *tc) +{ + apr_hash_t *h; + char str[8196]; + + h = apr_hash_make(p); + CuAssertPtrNotNull(tc, h); + + apr_hash_set(h, "OVERWRITE", APR_HASH_KEY_STRING, "should not see this"); + apr_hash_set(h, "FOO3", APR_HASH_KEY_STRING, "bar3"); + apr_hash_set(h, "FOO3", APR_HASH_KEY_STRING, "bar3"); + apr_hash_set(h, "FOO1", APR_HASH_KEY_STRING, "bar1"); + apr_hash_set(h, "FOO2", APR_HASH_KEY_STRING, "bar2"); + apr_hash_set(h, "FOO4", APR_HASH_KEY_STRING, "bar4"); + apr_hash_set(h, "SAME1", APR_HASH_KEY_STRING, "same"); + apr_hash_set(h, "SAME2", APR_HASH_KEY_STRING, "same"); + apr_hash_set(h, "OVERWRITE", APR_HASH_KEY_STRING, "Overwrite key"); + + dump_hash(p, h, str); + CuAssertStrEquals(tc, "Key FOO1 (4) Value bar1\n" + "Key FOO2 (4) Value bar2\n" + "Key OVERWRITE (9) Value Overwrite key\n" + "Key FOO3 (4) Value bar3\n" + "Key SAME1 (5) Value same\n" + "Key FOO4 (4) Value bar4\n" + "Key SAME2 (5) Value same\n" + "#entries 7\n", str); +} + +/* This is kind of a hack, but I am just keeping an existing test. This is + * really testing apr_hash_first, apr_hash_next, and apr_hash_this which + * should be tested in three separate tests, but this will do for now. + */ +static void summation_test(CuTest *tc) +{ + apr_hash_t *h; + int sumKeys, sumVal, trySumKey, trySumVal; + int i, j, *val, *key; + + h =apr_hash_make(p); + CuAssertPtrNotNull(tc, h); + + sumKeys = 0; + sumVal = 0; + trySumKey = 0; + trySumVal = 0; + + for (i = 0; i < 100; i++) { + j = i * 10 + 1; + sumKeys += j; + sumVal += i; + key = apr_palloc(p, sizeof(int)); + *key = j; + val = apr_palloc(p, sizeof(int)); + *val = i; + apr_hash_set(h, key, sizeof(int), val); + } + + sum_hash(p, h, &i, &trySumKey, &trySumVal); + CuAssertIntEquals(tc, 100, i); + CuAssertIntEquals(tc, sumVal, trySumVal); + CuAssertIntEquals(tc, sumKeys, trySumKey); +} + +static void delete_key(CuTest *tc) +{ + apr_hash_t *h = NULL; + char *result = NULL; + + h = apr_hash_make(p); + CuAssertPtrNotNull(tc, h); + + apr_hash_set(h, "key", APR_HASH_KEY_STRING, "value"); + apr_hash_set(h, "key2", APR_HASH_KEY_STRING, "value2"); + + result = apr_hash_get(h, "key", APR_HASH_KEY_STRING); + CuAssertStrEquals(tc, "value", result); + + result = apr_hash_get(h, "key2", APR_HASH_KEY_STRING); + CuAssertStrEquals(tc, "value2", result); + + apr_hash_set(h, "key", APR_HASH_KEY_STRING, NULL); + + result = apr_hash_get(h, "key", APR_HASH_KEY_STRING); + CuAssertPtrEquals(tc, NULL, result); + + result = apr_hash_get(h, "key2", APR_HASH_KEY_STRING); + CuAssertStrEquals(tc, "value2", result); +} + +static void hash_count_0(CuTest *tc) +{ + apr_hash_t *h = NULL; + int count; + + h = apr_hash_make(p); + CuAssertPtrNotNull(tc, h); + + count = apr_hash_count(h); + CuAssertIntEquals(tc, 0, count); +} + +static void hash_count_1(CuTest *tc) +{ + apr_hash_t *h = NULL; + int count; + + h = apr_hash_make(p); + CuAssertPtrNotNull(tc, h); + + apr_hash_set(h, "key", APR_HASH_KEY_STRING, "value"); + + count = apr_hash_count(h); + CuAssertIntEquals(tc, 1, count); +} + +static void hash_count_5(CuTest *tc) +{ + apr_hash_t *h = NULL; + int count; + + h = apr_hash_make(p); + CuAssertPtrNotNull(tc, h); + + apr_hash_set(h, "key1", APR_HASH_KEY_STRING, "value1"); + apr_hash_set(h, "key2", APR_HASH_KEY_STRING, "value2"); + apr_hash_set(h, "key3", APR_HASH_KEY_STRING, "value3"); + apr_hash_set(h, "key4", APR_HASH_KEY_STRING, "value4"); + apr_hash_set(h, "key5", APR_HASH_KEY_STRING, "value5"); + + count = apr_hash_count(h); + CuAssertIntEquals(tc, 5, count); +} + +static void overlay_empty(CuTest *tc) +{ + apr_hash_t *base = NULL; + apr_hash_t *overlay = NULL; + apr_hash_t *result = NULL; + int count; + char str[8196]; + + base = apr_hash_make(p); + overlay = apr_hash_make(p); + CuAssertPtrNotNull(tc, base); + CuAssertPtrNotNull(tc, overlay); + + apr_hash_set(base, "key1", APR_HASH_KEY_STRING, "value1"); + apr_hash_set(base, "key2", APR_HASH_KEY_STRING, "value2"); + apr_hash_set(base, "key3", APR_HASH_KEY_STRING, "value3"); + apr_hash_set(base, "key4", APR_HASH_KEY_STRING, "value4"); + apr_hash_set(base, "key5", APR_HASH_KEY_STRING, "value5"); + + result = apr_hash_overlay(p, overlay, base); + + count = apr_hash_count(result); + CuAssertIntEquals(tc, 5, count); + + dump_hash(p, result, str); + CuAssertStrEquals(tc, "Key key1 (4) Value value1\n" + "Key key2 (4) Value value2\n" + "Key key3 (4) Value value3\n" + "Key key4 (4) Value value4\n" + "Key key5 (4) Value value5\n" + "#entries 5\n", str); +} + +static void overlay_2unique(CuTest *tc) +{ + apr_hash_t *base = NULL; + apr_hash_t *overlay = NULL; + apr_hash_t *result = NULL; + int count; + char str[8196]; + + base = apr_hash_make(p); + overlay = apr_hash_make(p); + CuAssertPtrNotNull(tc, base); + CuAssertPtrNotNull(tc, overlay); + + apr_hash_set(base, "base1", APR_HASH_KEY_STRING, "value1"); + apr_hash_set(base, "base2", APR_HASH_KEY_STRING, "value2"); + apr_hash_set(base, "base3", APR_HASH_KEY_STRING, "value3"); + apr_hash_set(base, "base4", APR_HASH_KEY_STRING, "value4"); + apr_hash_set(base, "base5", APR_HASH_KEY_STRING, "value5"); + + apr_hash_set(overlay, "overlay1", APR_HASH_KEY_STRING, "value1"); + apr_hash_set(overlay, "overlay2", APR_HASH_KEY_STRING, "value2"); + apr_hash_set(overlay, "overlay3", APR_HASH_KEY_STRING, "value3"); + apr_hash_set(overlay, "overlay4", APR_HASH_KEY_STRING, "value4"); + apr_hash_set(overlay, "overlay5", APR_HASH_KEY_STRING, "value5"); + + result = apr_hash_overlay(p, overlay, base); + + count = apr_hash_count(result); + CuAssertIntEquals(tc, 10, count); + + dump_hash(p, result, str); + /* I don't know why these are out of order, but they are. I would probably + * consider this a bug, but others should comment. + */ + CuAssertStrEquals(tc, "Key base5 (5) Value value5\n" + "Key overlay1 (8) Value value1\n" + "Key overlay2 (8) Value value2\n" + "Key overlay3 (8) Value value3\n" + "Key overlay4 (8) Value value4\n" + "Key overlay5 (8) Value value5\n" + "Key base1 (5) Value value1\n" + "Key base2 (5) Value value2\n" + "Key base3 (5) Value value3\n" + "Key base4 (5) Value value4\n" + "#entries 10\n", str); +} + +static void overlay_same(CuTest *tc) +{ + apr_hash_t *base = NULL; + apr_hash_t *result = NULL; + int count; + char str[8196]; + + base = apr_hash_make(p); + CuAssertPtrNotNull(tc, base); + + apr_hash_set(base, "base1", APR_HASH_KEY_STRING, "value1"); + apr_hash_set(base, "base2", APR_HASH_KEY_STRING, "value2"); + apr_hash_set(base, "base3", APR_HASH_KEY_STRING, "value3"); + apr_hash_set(base, "base4", APR_HASH_KEY_STRING, "value4"); + apr_hash_set(base, "base5", APR_HASH_KEY_STRING, "value5"); + + result = apr_hash_overlay(p, base, base); + + count = apr_hash_count(result); + CuAssertIntEquals(tc, 5, count); + + dump_hash(p, result, str); + /* I don't know why these are out of order, but they are. I would probably + * consider this a bug, but others should comment. + */ + CuAssertStrEquals(tc, "Key base5 (5) Value value5\n" + "Key base1 (5) Value value1\n" + "Key base2 (5) Value value2\n" + "Key base3 (5) Value value3\n" + "Key base4 (5) Value value4\n" + "#entries 5\n", str); +} + +CuSuite *testhash(void) +{ + CuSuite *suite = CuSuiteNew("Hash"); + + SUITE_ADD_TEST(suite, hash_make); + SUITE_ADD_TEST(suite, hash_set); + SUITE_ADD_TEST(suite, hash_reset); + SUITE_ADD_TEST(suite, same_value); + SUITE_ADD_TEST(suite, key_space); + SUITE_ADD_TEST(suite, delete_key); + + SUITE_ADD_TEST(suite, hash_count_0); + SUITE_ADD_TEST(suite, hash_count_1); + SUITE_ADD_TEST(suite, hash_count_5); + + SUITE_ADD_TEST(suite, hash_traverse); + SUITE_ADD_TEST(suite, summation_test); + + SUITE_ADD_TEST(suite, overlay_empty); + SUITE_ADD_TEST(suite, overlay_2unique); + SUITE_ADD_TEST(suite, overlay_same); + + return suite; +} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/testipsub.c b/rubbos/app/httpd-2.0.64/srclib/apr/test/testipsub.c new file mode 100644 index 00000000..8238fffd --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/testipsub.c @@ -0,0 +1,173 @@ +/* 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. + */ + +#include "test_apr.h" +#include "apr_general.h" +#include "apr_network_io.h" +#include "apr_errno.h" + +static void test_bad_input(CuTest *tc) +{ + struct { + const char *ipstr; + const char *mask; + apr_status_t expected_rv; + } testcases[] = + { + /* so we have a few good inputs in here; sue me */ + {"my.host.name", NULL, APR_EINVAL} + ,{"127.0.0.256", NULL, APR_EBADIP} + ,{"127.0.0.1", NULL, APR_SUCCESS} + ,{"127.0.0.1", "32", APR_SUCCESS} + ,{"127.0.0.1", "1", APR_SUCCESS} + ,{"127.0.0.1", "15", APR_SUCCESS} + ,{"127.0.0.1", "-1", APR_EBADMASK} + ,{"127.0.0.1", "0", APR_EBADMASK} + ,{"127.0.0.1", "33", APR_EBADMASK} + ,{"127.0.0.1", "255.0.0.0", APR_SUCCESS} + ,{"127.0.0.1", "255.0", APR_EBADMASK} + ,{"127.0.0.1", "255.255.256.0", APR_EBADMASK} + ,{"127.0.0.1", "abc", APR_EBADMASK} + ,{"127", NULL, APR_SUCCESS} + ,{"127.0.0.1.2", NULL, APR_EBADIP} + ,{"127.0.0.1.2", "8", APR_EBADIP} + ,{"127", "255.0.0.0", APR_EBADIP} /* either EBADIP or EBADMASK seems fine */ +#if APR_HAVE_IPV6 + ,{"::1", NULL, APR_SUCCESS} + ,{"::1", "20", APR_SUCCESS} + ,{"::ffff:9.67.113.15", NULL, APR_EBADIP} /* yes, this is goodness */ + ,{"fe80::", "16", APR_SUCCESS} + ,{"fe80::", "255.0.0.0", APR_EBADMASK} + ,{"fe80::1", "0", APR_EBADMASK} + ,{"fe80::1", "-1", APR_EBADMASK} + ,{"fe80::1", "1", APR_SUCCESS} + ,{"fe80::1", "33", APR_SUCCESS} + ,{"fe80::1", "128", APR_SUCCESS} + ,{"fe80::1", "129", APR_EBADMASK} +#else + /* do some IPv6 stuff and verify that it fails with APR_EBADIP */ + ,{"::ffff:9.67.113.15", NULL, APR_EBADIP} +#endif + }; + int i; + apr_ipsubnet_t *ipsub; + apr_status_t rv; + + for (i = 0; i < (sizeof testcases / sizeof testcases[0]); i++) { + rv = apr_ipsubnet_create(&ipsub, testcases[i].ipstr, testcases[i].mask, p); + CuAssertIntEquals(tc, rv, testcases[i].expected_rv); + } +} + +static void test_singleton_subnets(CuTest *tc) +{ + const char *v4addrs[] = { + "127.0.0.1", "129.42.18.99", "63.161.155.20", "207.46.230.229", "64.208.42.36", + "198.144.203.195", "192.18.97.241", "198.137.240.91", "62.156.179.119", + "204.177.92.181" + }; + apr_ipsubnet_t *ipsub; + apr_sockaddr_t *sa; + apr_status_t rv; + int i, j, rc; + + for (i = 0; i < sizeof v4addrs / sizeof v4addrs[0]; i++) { + rv = apr_ipsubnet_create(&ipsub, v4addrs[i], NULL, p); + CuAssertTrue(tc, rv == APR_SUCCESS); + for (j = 0; j < sizeof v4addrs / sizeof v4addrs[0]; j++) { + rv = apr_sockaddr_info_get(&sa, v4addrs[j], APR_INET, 0, 0, p); + CuAssertTrue(tc, rv == APR_SUCCESS); + rc = apr_ipsubnet_test(ipsub, sa); + if (!strcmp(v4addrs[i], v4addrs[j])) { + CuAssertTrue(tc, rc != 0); + } + else { + CuAssertTrue(tc, rc == 0); + } + } + } + + /* same for v6? */ +} + +static void test_interesting_subnets(CuTest *tc) +{ + struct { + const char *ipstr, *mask; + int family; + char *in_subnet, *not_in_subnet; + } testcases[] = + { + {"9.67", NULL, APR_INET, "9.67.113.15", "10.1.2.3"} + ,{"9.67.0.0", "16", APR_INET, "9.67.113.15", "10.1.2.3"} + ,{"9.67.0.0", "255.255.0.0", APR_INET, "9.67.113.15", "10.1.2.3"} + ,{"9.67.113.99", "16", APR_INET, "9.67.113.15", "10.1.2.3"} + ,{"9.67.113.99", "255.255.255.0", APR_INET, "9.67.113.15", "10.1.2.3"} +#if APR_HAVE_IPV6 + ,{"fe80::", "8", APR_INET6, "fe80::1", "ff01::1"} + ,{"ff01::", "8", APR_INET6, "ff01::1", "fe80::1"} + ,{"3FFE:8160::", "28", APR_INET6, "3ffE:816e:abcd:1234::1", "3ffe:8170::1"} + ,{"127.0.0.1", NULL, APR_INET6, "::ffff:127.0.0.1", "fe80::1"} + ,{"127.0.0.1", "8", APR_INET6, "::ffff:127.0.0.1", "fe80::1"} +#endif + }; + apr_ipsubnet_t *ipsub; + apr_sockaddr_t *sa; + apr_status_t rv; + int i, rc; + + for (i = 0; i < sizeof testcases / sizeof testcases[0]; i++) { + rv = apr_ipsubnet_create(&ipsub, testcases[i].ipstr, testcases[i].mask, p); + CuAssertTrue(tc, rv == APR_SUCCESS); + rv = apr_sockaddr_info_get(&sa, testcases[i].in_subnet, testcases[i].family, 0, 0, p); + CuAssertTrue(tc, rv == APR_SUCCESS); + rc = apr_ipsubnet_test(ipsub, sa); + CuAssertTrue(tc, rc != 0); + rv = apr_sockaddr_info_get(&sa, testcases[i].not_in_subnet, testcases[i].family, 0, 0, p); + CuAssertTrue(tc, rv == APR_SUCCESS); + rc = apr_ipsubnet_test(ipsub, sa); + CuAssertTrue(tc, rc == 0); + } +} + +static void test_badmask_str(CuTest *tc) +{ + char buf[128]; + + CuAssertStrEquals(tc, apr_strerror(APR_EBADMASK, buf, sizeof buf), + "The specified network mask is invalid."); +} + +static void test_badip_str(CuTest *tc) +{ + char buf[128]; + + CuAssertStrEquals(tc, apr_strerror(APR_EBADIP, buf, sizeof buf), + "The specified IP address is invalid."); +} + +CuSuite *testipsub(void) +{ + CuSuite *suite = CuSuiteNew("IP subnets"); + + SUITE_ADD_TEST(suite, test_bad_input); + SUITE_ADD_TEST(suite, test_singleton_subnets); + SUITE_ADD_TEST(suite, test_interesting_subnets); + SUITE_ADD_TEST(suite, test_badmask_str); + SUITE_ADD_TEST(suite, test_badip_str); + return suite; +} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/testlock.c b/rubbos/app/httpd-2.0.64/srclib/apr/test/testlock.c new file mode 100644 index 00000000..134426c4 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/testlock.c @@ -0,0 +1,322 @@ +/* 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. + */ + +#include "apr_thread_proc.h" +#include "apr_file_io.h" +#include "apr_thread_mutex.h" +#include "apr_thread_rwlock.h" +#include "apr_thread_cond.h" +#include "apr_errno.h" +#include "apr_general.h" +#include "apr_getopt.h" +#include "test_apr.h" + +#if APR_HAS_THREADS + +#define MAX_ITER 40000 +#define MAX_COUNTER 100000 +#define MAX_RETRY 5 + +static void *APR_THREAD_FUNC thread_rwlock_func(apr_thread_t *thd, void *data); +static void *APR_THREAD_FUNC thread_mutex_function(apr_thread_t *thd, void *data); +static void *APR_THREAD_FUNC thread_cond_producer(apr_thread_t *thd, void *data); +static void *APR_THREAD_FUNC thread_cond_consumer(apr_thread_t *thd, void *data); + +static apr_thread_mutex_t *thread_mutex; +static apr_thread_rwlock_t *rwlock; +static int i = 0, x = 0; + +static int buff[MAX_COUNTER]; + +struct { + apr_thread_mutex_t *mutex; + int nput; + int nval; +} put; + +struct { + apr_thread_mutex_t *mutex; + apr_thread_cond_t *cond; + int nready; +} nready; + +static apr_thread_mutex_t *timeout_mutex; +static apr_thread_cond_t *timeout_cond; + +static void *APR_THREAD_FUNC thread_rwlock_func(apr_thread_t *thd, void *data) +{ + int exitLoop = 1; + + while (1) + { + apr_thread_rwlock_rdlock(rwlock); + if (i == MAX_ITER) + exitLoop = 0; + apr_thread_rwlock_unlock(rwlock); + + if (!exitLoop) + break; + + apr_thread_rwlock_wrlock(rwlock); + if (i != MAX_ITER) + { + i++; + x++; + } + apr_thread_rwlock_unlock(rwlock); + } + return NULL; +} + +static void *APR_THREAD_FUNC thread_mutex_function(apr_thread_t *thd, void *data) +{ + int exitLoop = 1; + + /* slight delay to allow things to settle */ + apr_sleep (1); + + while (1) + { + apr_thread_mutex_lock(thread_mutex); + if (i == MAX_ITER) + exitLoop = 0; + else + { + i++; + x++; + } + apr_thread_mutex_unlock(thread_mutex); + + if (!exitLoop) + break; + } + return NULL; +} + +static void *APR_THREAD_FUNC thread_cond_producer(apr_thread_t *thd, void *data) +{ + for (;;) { + apr_thread_mutex_lock(put.mutex); + if (put.nput >= MAX_COUNTER) { + apr_thread_mutex_unlock(put.mutex); + return NULL; + } + buff[put.nput] = put.nval; + put.nput++; + put.nval++; + apr_thread_mutex_unlock(put.mutex); + + apr_thread_mutex_lock(nready.mutex); + if (nready.nready == 0) + apr_thread_cond_signal(nready.cond); + nready.nready++; + apr_thread_mutex_unlock(nready.mutex); + + *((int *) data) += 1; + } + + return NULL; +} + +static void *APR_THREAD_FUNC thread_cond_consumer(apr_thread_t *thd, void *data) +{ + int i; + + for (i = 0; i < MAX_COUNTER; i++) { + apr_thread_mutex_lock(nready.mutex); + while (nready.nready == 0) + apr_thread_cond_wait(nready.cond, nready.mutex); + nready.nready--; + apr_thread_mutex_unlock(nready.mutex); + + if (buff[i] != i) + printf("buff[%d] = %d\n", i, buff[i]); + } + + return NULL; +} + +static void test_thread_mutex(CuTest *tc) +{ + apr_thread_t *t1, *t2, *t3, *t4; + apr_status_t s1, s2, s3, s4; + + s1 = apr_thread_mutex_create(&thread_mutex, APR_THREAD_MUTEX_DEFAULT, p); + CuAssertIntEquals(tc, APR_SUCCESS, s1); + CuAssertPtrNotNull(tc, thread_mutex); + + i = 0; + x = 0; + + s1 = apr_thread_create(&t1, NULL, thread_mutex_function, NULL, p); + CuAssertIntEquals(tc, APR_SUCCESS, s1); + s2 = apr_thread_create(&t2, NULL, thread_mutex_function, NULL, p); + CuAssertIntEquals(tc, APR_SUCCESS, s2); + s3 = apr_thread_create(&t3, NULL, thread_mutex_function, NULL, p); + CuAssertIntEquals(tc, APR_SUCCESS, s3); + s4 = apr_thread_create(&t4, NULL, thread_mutex_function, NULL, p); + CuAssertIntEquals(tc, APR_SUCCESS, s4); + + apr_thread_join(&s1, t1); + apr_thread_join(&s2, t2); + apr_thread_join(&s3, t3); + apr_thread_join(&s4, t4); + + CuAssertIntEquals(tc, MAX_ITER, x); +} + +static void test_thread_rwlock(CuTest *tc) +{ + apr_thread_t *t1, *t2, *t3, *t4; + apr_status_t s1, s2, s3, s4; + + s1 = apr_thread_rwlock_create(&rwlock, p); + apr_assert_success(tc, "rwlock_create", s1); + CuAssertPtrNotNull(tc, rwlock); + + i = 0; + x = 0; + + s1 = apr_thread_create(&t1, NULL, thread_rwlock_func, NULL, p); + apr_assert_success(tc, "create thread 1", s1); + s2 = apr_thread_create(&t2, NULL, thread_rwlock_func, NULL, p); + apr_assert_success(tc, "create thread 2", s2); + s3 = apr_thread_create(&t3, NULL, thread_rwlock_func, NULL, p); + apr_assert_success(tc, "create thread 3", s3); + s4 = apr_thread_create(&t4, NULL, thread_rwlock_func, NULL, p); + apr_assert_success(tc, "create thread 4", s4); + + apr_thread_join(&s1, t1); + apr_thread_join(&s2, t2); + apr_thread_join(&s3, t3); + apr_thread_join(&s4, t4); + + CuAssertIntEquals(tc, MAX_ITER, x); + + apr_thread_rwlock_destroy(rwlock); +} + +static void test_cond(CuTest *tc) +{ + apr_thread_t *p1, *p2, *p3, *p4, *c1; + apr_status_t s0, s1, s2, s3, s4; + int count1, count2, count3, count4; + int sum; + + s1 = apr_thread_mutex_create(&put.mutex, APR_THREAD_MUTEX_DEFAULT, p); + CuAssertIntEquals(tc, APR_SUCCESS, s1); + CuAssertPtrNotNull(tc, put.mutex); + + s1 = apr_thread_mutex_create(&nready.mutex, APR_THREAD_MUTEX_DEFAULT, p); + CuAssertIntEquals(tc, APR_SUCCESS, s1); + CuAssertPtrNotNull(tc, nready.mutex); + + s1 = apr_thread_cond_create(&nready.cond, p); + CuAssertIntEquals(tc, APR_SUCCESS, s1); + CuAssertPtrNotNull(tc, nready.cond); + + count1 = count2 = count3 = count4 = 0; + put.nput = put.nval = 0; + nready.nready = 0; + i = 0; + x = 0; + + s0 = apr_thread_create(&p1, NULL, thread_cond_producer, &count1, p); + CuAssertIntEquals(tc, APR_SUCCESS, s0); + s1 = apr_thread_create(&p2, NULL, thread_cond_producer, &count2, p); + CuAssertIntEquals(tc, APR_SUCCESS, s1); + s2 = apr_thread_create(&p3, NULL, thread_cond_producer, &count3, p); + CuAssertIntEquals(tc, APR_SUCCESS, s2); + s3 = apr_thread_create(&p4, NULL, thread_cond_producer, &count4, p); + CuAssertIntEquals(tc, APR_SUCCESS, s3); + s4 = apr_thread_create(&c1, NULL, thread_cond_consumer, NULL, p); + CuAssertIntEquals(tc, APR_SUCCESS, s4); + + apr_thread_join(&s0, p1); + apr_thread_join(&s1, p2); + apr_thread_join(&s2, p3); + apr_thread_join(&s3, p4); + apr_thread_join(&s4, c1); + + sum = count1 + count2 + count3 + count4; + /* + printf("count1 = %d count2 = %d count3 = %d count4 = %d\n", + count1, count2, count3, count4); + */ + CuAssertIntEquals(tc, MAX_COUNTER, sum); +} + +static void test_timeoutcond(CuTest *tc) +{ + apr_status_t s; + apr_interval_time_t timeout; + apr_time_t begin, end; + int i; + + s = apr_thread_mutex_create(&timeout_mutex, APR_THREAD_MUTEX_DEFAULT, p); + CuAssertIntEquals(tc, APR_SUCCESS, s); + CuAssertPtrNotNull(tc, timeout_mutex); + + s = apr_thread_cond_create(&timeout_cond, p); + CuAssertIntEquals(tc, APR_SUCCESS, s); + CuAssertPtrNotNull(tc, timeout_cond); + + timeout = apr_time_from_sec(5); + + for (i = 0; i < MAX_RETRY; i++) { + apr_thread_mutex_lock(timeout_mutex); + + begin = apr_time_now(); + s = apr_thread_cond_timedwait(timeout_cond, timeout_mutex, timeout); + end = apr_time_now(); + apr_thread_mutex_unlock(timeout_mutex); + + if (s != APR_SUCCESS && !APR_STATUS_IS_TIMEUP(s)) { + continue; + } + CuAssertIntEquals(tc, 1, APR_STATUS_IS_TIMEUP(s)); + CuAssert(tc, "Timer returned too late", end - begin - timeout < 100000); + break; + } + CuAssert(tc, "Too many retries", i < MAX_RETRY); +} + +#endif /* !APR_HAS_THREADS */ + +#if !APR_HAS_THREADS +static void threads_not_impl(CuTest *tc) +{ + CuNotImpl(tc, "Threads not implemented on this platform"); +} +#endif + + +CuSuite *testlock(void) +{ + CuSuite *suite = CuSuiteNew("Thread Locks"); + +#if !APR_HAS_THREADS + SUITE_ADD_TEST(suite, threads_not_impl); +#else + SUITE_ADD_TEST(suite, test_thread_mutex); + SUITE_ADD_TEST(suite, test_thread_rwlock); + SUITE_ADD_TEST(suite, test_cond); + SUITE_ADD_TEST(suite, test_timeoutcond); +#endif + + return suite; +} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/testlockperf.c b/rubbos/app/httpd-2.0.64/srclib/apr/test/testlockperf.c new file mode 100644 index 00000000..ba785775 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/testlockperf.c @@ -0,0 +1,282 @@ +/* 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. + */ + +#include "apr_thread_proc.h" +#include "apr_thread_mutex.h" +#include "apr_thread_rwlock.h" +#include "apr_file_io.h" +#include "apr_errno.h" +#include "apr_general.h" +#include "apr_getopt.h" +#include "errno.h" +#include +#include +#include "test_apr.h" + +#if !APR_HAS_THREADS +int main(void) +{ + printf("This program won't work on this platform because there is no " + "support for threads.\n"); + return 0; +} +#else /* !APR_HAS_THREADS */ + +#define MAX_COUNTER 1000000 +#define MAX_THREADS 6 + +static long mutex_counter; + +static apr_thread_mutex_t *thread_lock; +void * APR_THREAD_FUNC thread_mutex_func(apr_thread_t *thd, void *data); +apr_status_t test_thread_mutex(int num_threads); /* apr_thread_mutex_t */ + +static apr_thread_rwlock_t *thread_rwlock; +void * APR_THREAD_FUNC thread_rwlock_func(apr_thread_t *thd, void *data); +apr_status_t test_thread_rwlock(int num_threads); /* apr_thread_rwlock_t */ + +int test_thread_mutex_nested(int num_threads); + +apr_pool_t *pool; +int i = 0, x = 0; + +void * APR_THREAD_FUNC thread_mutex_func(apr_thread_t *thd, void *data) +{ + int i; + + for (i = 0; i < MAX_COUNTER; i++) { + apr_thread_mutex_lock(thread_lock); + mutex_counter++; + apr_thread_mutex_unlock(thread_lock); + } + return NULL; +} + +void * APR_THREAD_FUNC thread_rwlock_func(apr_thread_t *thd, void *data) +{ + int i; + + for (i = 0; i < MAX_COUNTER; i++) { + apr_thread_rwlock_wrlock(thread_rwlock); + mutex_counter++; + apr_thread_rwlock_unlock(thread_rwlock); + } + return NULL; +} + +int test_thread_mutex(int num_threads) +{ + apr_thread_t *t[MAX_THREADS]; + apr_status_t s[MAX_THREADS]; + apr_time_t time_start, time_stop; + int i; + + mutex_counter = 0; + + printf("apr_thread_mutex_t Tests\n"); + printf("%-60s", " Initializing the apr_thread_mutex_t (UNNESTED)"); + s[0] = apr_thread_mutex_create(&thread_lock, APR_THREAD_MUTEX_UNNESTED, pool); + if (s[0] != APR_SUCCESS) { + printf("Failed!\n"); + return s[0]; + } + printf("OK\n"); + + apr_thread_mutex_lock(thread_lock); + /* set_concurrency(4)? -aaron */ + printf(" Starting %d threads ", num_threads); + for (i = 0; i < num_threads; ++i) { + s[i] = apr_thread_create(&t[i], NULL, thread_mutex_func, NULL, pool); + if (s[i] != APR_SUCCESS) { + printf("Failed!\n"); + return s[i]; + } + } + printf("OK\n"); + + time_start = apr_time_now(); + apr_thread_mutex_unlock(thread_lock); + + /* printf("%-60s", " Waiting for threads to exit"); */ + for (i = 0; i < num_threads; ++i) { + apr_thread_join(&s[i], t[i]); + } + /* printf("OK\n"); */ + + time_stop = apr_time_now(); + printf("microseconds: %" APR_INT64_T_FMT " usec\n", + (time_stop - time_start)); + if (mutex_counter != MAX_COUNTER * num_threads) + printf("error: counter = %ld\n", mutex_counter); + + return APR_SUCCESS; +} + +int test_thread_mutex_nested(int num_threads) +{ + apr_thread_t *t[MAX_THREADS]; + apr_status_t s[MAX_THREADS]; + apr_time_t time_start, time_stop; + int i; + + mutex_counter = 0; + + printf("apr_thread_mutex_t Tests\n"); + printf("%-60s", " Initializing the apr_thread_mutex_t (NESTED)"); + s[0] = apr_thread_mutex_create(&thread_lock, APR_THREAD_MUTEX_NESTED, pool); + if (s[0] != APR_SUCCESS) { + printf("Failed!\n"); + return s[0]; + } + printf("OK\n"); + + apr_thread_mutex_lock(thread_lock); + /* set_concurrency(4)? -aaron */ + printf(" Starting %d threads ", num_threads); + for (i = 0; i < num_threads; ++i) { + s[i] = apr_thread_create(&t[i], NULL, thread_mutex_func, NULL, pool); + if (s[i] != APR_SUCCESS) { + printf("Failed!\n"); + return s[i]; + } + } + printf("OK\n"); + + time_start = apr_time_now(); + apr_thread_mutex_unlock(thread_lock); + + /* printf("%-60s", " Waiting for threads to exit"); */ + for (i = 0; i < num_threads; ++i) { + apr_thread_join(&s[i], t[i]); + } + /* printf("OK\n"); */ + + time_stop = apr_time_now(); + printf("microseconds: %" APR_INT64_T_FMT " usec\n", + (time_stop - time_start)); + if (mutex_counter != MAX_COUNTER * num_threads) + printf("error: counter = %ld\n", mutex_counter); + + return APR_SUCCESS; +} + +int test_thread_rwlock(int num_threads) +{ + apr_thread_t *t[MAX_THREADS]; + apr_status_t s[MAX_THREADS]; + apr_time_t time_start, time_stop; + int i; + + mutex_counter = 0; + + printf("apr_thread_rwlock_t Tests\n"); + printf("%-60s", " Initializing the apr_thread_rwlock_t"); + s[0] = apr_thread_rwlock_create(&thread_rwlock, pool); + if (s[0] != APR_SUCCESS) { + printf("Failed!\n"); + return s[0]; + } + printf("OK\n"); + + apr_thread_rwlock_wrlock(thread_rwlock); + /* set_concurrency(4)? -aaron */ + printf(" Starting %d threads ", num_threads); + for (i = 0; i < num_threads; ++i) { + s[i] = apr_thread_create(&t[i], NULL, thread_rwlock_func, NULL, pool); + if (s[i] != APR_SUCCESS) { + printf("Failed!\n"); + return s[i]; + } + } + printf("OK\n"); + + time_start = apr_time_now(); + apr_thread_rwlock_unlock(thread_rwlock); + + /* printf("%-60s", " Waiting for threads to exit"); */ + for (i = 0; i < num_threads; ++i) { + apr_thread_join(&s[i], t[i]); + } + /* printf("OK\n"); */ + + time_stop = apr_time_now(); + printf("microseconds: %" APR_INT64_T_FMT " usec\n", + (time_stop - time_start)); + if (mutex_counter != MAX_COUNTER * num_threads) + printf("error: counter = %ld\n", mutex_counter); + + return APR_SUCCESS; +} + +int main(int argc, const char * const *argv) +{ + apr_status_t rv; + char errmsg[200]; + const char *lockname = "multi.lock"; + apr_getopt_t *opt; + char optchar; + const char *optarg; + + printf("APR Lock Performance Test\n==============\n\n"); + + apr_initialize(); + atexit(apr_terminate); + + if (apr_pool_create(&pool, NULL) != APR_SUCCESS) + exit(-1); + + if ((rv = apr_getopt_init(&opt, pool, argc, argv)) != APR_SUCCESS) { + fprintf(stderr, "Could not set up to parse options: [%d] %s\n", + rv, apr_strerror(rv, errmsg, sizeof errmsg)); + exit(-1); + } + + while ((rv = apr_getopt(opt, "f:", &optchar, &optarg)) == APR_SUCCESS) { + if (optchar == 'f') { + lockname = optarg; + } + } + + if (rv != APR_SUCCESS && rv != APR_EOF) { + fprintf(stderr, "Could not parse options: [%d] %s\n", + rv, apr_strerror(rv, errmsg, sizeof errmsg)); + exit(-1); + } + + for (i = 1; i <= MAX_THREADS; ++i) { + if ((rv = test_thread_mutex(i)) != APR_SUCCESS) { + fprintf(stderr,"thread_mutex test failed : [%d] %s\n", + rv, apr_strerror(rv, (char*)errmsg, 200)); + exit(-3); + } + + if ((rv = test_thread_mutex_nested(i)) != APR_SUCCESS) { + fprintf(stderr,"thread_mutex (NESTED) test failed : [%d] %s\n", + rv, apr_strerror(rv, (char*)errmsg, 200)); + exit(-4); + } + + if ((rv = test_thread_rwlock(i)) != APR_SUCCESS) { + fprintf(stderr,"thread_rwlock test failed : [%d] %s\n", + rv, apr_strerror(rv, (char*)errmsg, 200)); + exit(-6); + } + } + + return 0; +} + +#endif /* !APR_HAS_THREADS */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/testmmap.c b/rubbos/app/httpd-2.0.64/srclib/apr/test/testmmap.c new file mode 100644 index 00000000..012d8d0e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/testmmap.c @@ -0,0 +1,154 @@ +/* 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. + */ + +#include "test_apr.h" +#include "apr_mmap.h" +#include "apr_errno.h" +#include "apr_general.h" +#include "apr_lib.h" +#include "apr_file_io.h" +#include "apr_strings.h" + +/* hmmm, what is a truly portable define for the max path + * length on a platform? + */ +#define PATH_LEN 255 +#define TEST_STRING "This is the MMAP data file."APR_EOL_STR + +#if !APR_HAS_MMAP +static void not_implemented(CuTest *tc) +{ + CuNotImpl(tc, "User functions"); +} + +#else + +static apr_mmap_t *themmap = NULL; +static apr_file_t *thefile = NULL; +static char *file1; +static apr_finfo_t finfo; +static int fsize; + +static void create_filename(CuTest *tc) +{ + char *oldfileptr; + + apr_filepath_get(&file1, 0, p); +#ifndef NETWARE +#ifdef WIN32 + CuAssertTrue(tc, file1[1] == ':'); +#else + CuAssertTrue(tc, file1[0] == '/'); +#endif +#endif + CuAssertTrue(tc, file1[strlen(file1) - 1] != '/'); + + oldfileptr = file1; + file1 = apr_pstrcat(p, file1,"/data/mmap_datafile.txt" ,NULL); + CuAssertTrue(tc, oldfileptr != file1); +} + +static void test_file_close(CuTest *tc) +{ + apr_status_t rv; + + rv = apr_file_close(thefile); + CuAssertIntEquals(tc, rv, APR_SUCCESS); +} + +static void test_file_open(CuTest *tc) +{ + apr_status_t rv; + + rv = apr_file_open(&thefile, file1, APR_READ, APR_UREAD | APR_GREAD, p); + CuAssertIntEquals(tc, rv, APR_SUCCESS); + CuAssertPtrNotNull(tc, thefile); +} + +static void test_get_filesize(CuTest *tc) +{ + apr_status_t rv; + + rv = apr_file_info_get(&finfo, APR_FINFO_NORM, thefile); + CuAssertIntEquals(tc, rv, APR_SUCCESS); + CuAssert(tc, "File size mismatch", fsize == finfo.size); +} + +static void test_mmap_create(CuTest *tc) +{ + apr_status_t rv; + + rv = apr_mmap_create(&themmap, thefile, 0, (apr_size_t)finfo.size, + APR_MMAP_READ, p); + CuAssertPtrNotNull(tc, themmap); + CuAssertIntEquals(tc, rv, APR_SUCCESS); +} + +static void test_mmap_contents(CuTest *tc) +{ + + CuAssertPtrNotNull(tc, themmap); + CuAssertPtrNotNull(tc, themmap->mm); + CuAssertIntEquals(tc, fsize, themmap->size); + + /* Must use nEquals since the string is not guaranteed to be NULL terminated */ + CuAssertStrNEquals(tc, themmap->mm, TEST_STRING, fsize); +} + +static void test_mmap_delete(CuTest *tc) +{ + apr_status_t rv; + + CuAssertPtrNotNull(tc, themmap); + rv = apr_mmap_delete(themmap); + CuAssertIntEquals(tc, rv, APR_SUCCESS); +} + +static void test_mmap_offset(CuTest *tc) +{ + apr_status_t rv; + void *addr; + + CuAssertPtrNotNull(tc, themmap); + rv = apr_mmap_offset(&addr, themmap, 5); + + /* Must use nEquals since the string is not guaranteed to be NULL terminated */ + CuAssertStrNEquals(tc, addr, TEST_STRING + 5, fsize-5); +} +#endif + +CuSuite *testmmap(void) +{ + CuSuite *suite = CuSuiteNew("MMAP"); + +#if APR_HAS_MMAP + fsize = strlen(TEST_STRING); + + SUITE_ADD_TEST(suite, create_filename); + SUITE_ADD_TEST(suite, test_file_open); + SUITE_ADD_TEST(suite, test_get_filesize); + SUITE_ADD_TEST(suite, test_mmap_create); + SUITE_ADD_TEST(suite, test_mmap_contents); + SUITE_ADD_TEST(suite, test_mmap_offset); + SUITE_ADD_TEST(suite, test_mmap_delete); + SUITE_ADD_TEST(suite, test_file_close); +#else + SUITE_ADD_TEST(suite, not_implemented); +#endif + + return suite; +} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/testmutexscope.c b/rubbos/app/httpd-2.0.64/srclib/apr/test/testmutexscope.c new file mode 100644 index 00000000..0ea08cc6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/testmutexscope.c @@ -0,0 +1,218 @@ +/* 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. + */ + +#include +#include +#include +#include + +#include "apr.h" +#include "apr_general.h" +#include "apr_proc_mutex.h" +#include "apr_global_mutex.h" +#include "apr_thread_proc.h" + +#if !APR_HAS_THREADS +int main(void) +{ + printf("This test requires APR thread support.\n"); + return 0; +} + +#else /* APR_HAS_THREADS */ + +static apr_thread_mutex_t *thread_mutex; +static apr_proc_mutex_t *proc_mutex; +static apr_global_mutex_t *global_mutex; +static apr_pool_t *p; +static volatile int counter; +typedef enum {TEST_GLOBAL, TEST_PROC} test_mode_e; + +static void lock_init(apr_lockmech_e mech, test_mode_e test_mode) +{ + if (test_mode == TEST_PROC) { + assert(apr_proc_mutex_create(&proc_mutex, + NULL, + mech, + p) == APR_SUCCESS); + } + else { + assert(apr_global_mutex_create(&global_mutex, + NULL, + mech, + p) == APR_SUCCESS); + } +} + +static void lock_destroy(test_mode_e test_mode) +{ + if (test_mode == TEST_PROC) { + assert(apr_proc_mutex_destroy(proc_mutex) == APR_SUCCESS); + } + else { + assert(apr_global_mutex_destroy(global_mutex) == APR_SUCCESS); + } +} + +static void lock_grab(test_mode_e test_mode) +{ + if (test_mode == TEST_PROC) { + assert(apr_proc_mutex_lock(proc_mutex) == APR_SUCCESS); + } + else { + assert(apr_global_mutex_lock(global_mutex) == APR_SUCCESS); + } +} + +static void lock_release(test_mode_e test_mode) +{ + if (test_mode == TEST_PROC) { + assert(apr_proc_mutex_unlock(proc_mutex) == APR_SUCCESS); + } + else { + assert(apr_global_mutex_unlock(global_mutex) == APR_SUCCESS); + } +} + +static void * APR_THREAD_FUNC eachThread(apr_thread_t *id, void *p) +{ + test_mode_e test_mode = (test_mode_e)p; + + lock_grab(test_mode); + ++counter; + assert(apr_thread_mutex_lock(thread_mutex) == APR_SUCCESS); + assert(apr_thread_mutex_unlock(thread_mutex) == APR_SUCCESS); + lock_release(test_mode); + return NULL; +} + +static void test_mech_mode(apr_lockmech_e mech, const char *mech_name, + test_mode_e test_mode) +{ + apr_thread_t *threads[20]; + int numThreads = 5; + int i; + apr_status_t rv; + + printf("Trying %s mutexes with mechanism `%s'...\n", + test_mode == TEST_GLOBAL ? "global" : "proc", mech_name); + + assert(numThreads <= sizeof(threads) / sizeof(threads[0])); + + assert(apr_pool_create(&p, NULL) == APR_SUCCESS); + + assert(apr_thread_mutex_create(&thread_mutex, 0, p) == APR_SUCCESS); + assert(apr_thread_mutex_lock(thread_mutex) == APR_SUCCESS); + + lock_init(mech, test_mode); + + counter = 0; + + i = 0; + while (i < numThreads) + { + rv = apr_thread_create(&threads[i], + NULL, + eachThread, + (void *)test_mode, + p); + if (rv != APR_SUCCESS) { + fprintf(stderr, "apr_thread_create->%d\n", rv); + exit(1); + } + ++i; + } + + apr_sleep(apr_time_from_sec(5)); + + if (test_mode == TEST_PROC) { + printf(" Mutex mechanism `%s' is %sglobal in scope on this platform.\n", + mech_name, counter == 1 ? "" : "not "); + } + else { + if (counter != 1) { + fprintf(stderr, "\n!!!apr_global_mutex operations are broken on this " + "platform for mutex mechanism `%s'!\n" + "They don't block out threads within the same process.\n", + mech_name); + fprintf(stderr, "counter value: %d\n", counter); + exit(1); + } + else { + printf(" no problems encountered...\n"); + } + } + + assert(apr_thread_mutex_unlock(thread_mutex) == APR_SUCCESS); + + i = 0; + while (i < numThreads) + { + apr_status_t ignored; + + rv = apr_thread_join(&ignored, + threads[i]); + assert(rv == APR_SUCCESS); + ++i; + } + + lock_destroy(test_mode); + apr_thread_mutex_destroy(thread_mutex); + apr_pool_destroy(p); +} + +static void test_mech(apr_lockmech_e mech, const char *mech_name) +{ + test_mech_mode(mech, mech_name, TEST_PROC); + test_mech_mode(mech, mech_name, TEST_GLOBAL); +} + +int main(void) +{ + struct { + apr_lockmech_e mech; + const char *mech_name; + } lockmechs[] = { + {APR_LOCK_DEFAULT, "default"} +#if APR_HAS_FLOCK_SERIALIZE + ,{APR_LOCK_FLOCK, "flock"} +#endif +#if APR_HAS_SYSVSEM_SERIALIZE + ,{APR_LOCK_SYSVSEM, "sysvsem"} +#endif +#if APR_HAS_POSIXSEM_SERIALIZE + ,{APR_LOCK_POSIXSEM, "posix"} +#endif +#if APR_HAS_FCNTL_SERIALIZE + ,{APR_LOCK_FCNTL, "fcntl"} +#endif +#if APR_HAS_PROC_PTHREAD_SERIALIZE + ,{APR_LOCK_PROC_PTHREAD, "proc_pthread"} +#endif + }; + int i; + + assert(apr_initialize() == APR_SUCCESS); + + for (i = 0; i < sizeof(lockmechs) / sizeof(lockmechs[0]); i++) { + test_mech(lockmechs[i].mech, lockmechs[i].mech_name); + } + + apr_terminate(); + return 0; +} + +#endif /* APR_HAS_THREADS */ diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/testnames.c b/rubbos/app/httpd-2.0.64/srclib/apr/test/testnames.c new file mode 100644 index 00000000..8df4b083 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/testnames.c @@ -0,0 +1,273 @@ +/* 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. + */ + +#include "test_apr.h" +#include "apr_file_io.h" +#include "apr_file_info.h" +#include "apr_errno.h" +#include "apr_general.h" +#include "apr_pools.h" +#include "apr_lib.h" + +#if WIN32 +#define ABS_ROOT "C:/" +#elif defined(NETWARE) +#define ABS_ROOT "SYS:/" +#else +#define ABS_ROOT "/" +#endif + +static void merge_aboveroot(CuTest *tc) +{ + apr_status_t rv; + char *dstpath = NULL; + char errmsg[256]; + + rv = apr_filepath_merge(&dstpath, ABS_ROOT"foo", ABS_ROOT"bar", APR_FILEPATH_NOTABOVEROOT, + p); + apr_strerror(rv, errmsg, sizeof(errmsg)); + CuAssertIntEquals(tc, 1, APR_STATUS_IS_EABOVEROOT(rv)); + CuAssertPtrEquals(tc, NULL, dstpath); + CuAssertStrEquals(tc, "The given path was above the root path", errmsg); +} + +static void merge_belowroot(CuTest *tc) +{ + apr_status_t rv; + char *dstpath = NULL; + + rv = apr_filepath_merge(&dstpath, ABS_ROOT"foo", ABS_ROOT"foo/bar", + APR_FILEPATH_NOTABOVEROOT, p); + CuAssertPtrNotNull(tc, dstpath); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertStrEquals(tc, ABS_ROOT"foo/bar", dstpath); +} + +static void merge_noflag(CuTest *tc) +{ + apr_status_t rv; + char *dstpath = NULL; + + rv = apr_filepath_merge(&dstpath, ABS_ROOT"foo", ABS_ROOT"foo/bar", 0, p); + CuAssertPtrNotNull(tc, dstpath); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertStrEquals(tc, ABS_ROOT"foo/bar", dstpath); +} + +static void merge_dotdot(CuTest *tc) +{ + apr_status_t rv; + char *dstpath = NULL; + + rv = apr_filepath_merge(&dstpath, ABS_ROOT"foo/bar", "../baz", 0, p); + CuAssertPtrNotNull(tc, dstpath); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertStrEquals(tc, ABS_ROOT"foo/baz", dstpath); + + rv = apr_filepath_merge(&dstpath, "", "../test", 0, p); + CuAssertIntEquals(tc, 0, APR_SUCCESS); + CuAssertStrEquals(tc, "../test", dstpath); + + /* Very dangerous assumptions here about what the cwd is. However, let's assume + * that the testall is invoked from within apr/test/ so the following test should + * return ../test unless a previously fixed bug remains or the developer changes + * the case of the test directory: + */ + rv = apr_filepath_merge(&dstpath, "", "../test", APR_FILEPATH_TRUENAME, p); + CuAssertIntEquals(tc, 0, APR_SUCCESS); + CuAssertStrEquals(tc, "../test", dstpath); +} + +static void merge_dotdot_dotdot_dotdot(CuTest *tc) +{ + apr_status_t rv; + char *dstpath = NULL; + + rv = apr_filepath_merge(&dstpath, "", + "../../..", APR_FILEPATH_TRUENAME, p); + CuAssertPtrNotNull(tc, dstpath); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertStrEquals(tc, "../../..", dstpath); + + rv = apr_filepath_merge(&dstpath, "", + "../../../", APR_FILEPATH_TRUENAME, p); + CuAssertPtrNotNull(tc, dstpath); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertStrEquals(tc, "../../../", dstpath); +} + +static void merge_secure(CuTest *tc) +{ + apr_status_t rv; + char *dstpath = NULL; + + rv = apr_filepath_merge(&dstpath, ABS_ROOT"foo/bar", "../bar/baz", 0, p); + CuAssertPtrNotNull(tc, dstpath); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertStrEquals(tc, ABS_ROOT"foo/bar/baz", dstpath); +} + +static void merge_notrel(CuTest *tc) +{ + apr_status_t rv; + char *dstpath = NULL; + + rv = apr_filepath_merge(&dstpath, ABS_ROOT"foo/bar", "../baz", + APR_FILEPATH_NOTRELATIVE, p); + CuAssertPtrNotNull(tc, dstpath); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertStrEquals(tc, ABS_ROOT"foo/baz", dstpath); +} + +static void merge_notrelfail(CuTest *tc) +{ + apr_status_t rv; + char *dstpath = NULL; + char errmsg[256]; + + rv = apr_filepath_merge(&dstpath, "foo/bar", "../baz", + APR_FILEPATH_NOTRELATIVE, p); + apr_strerror(rv, errmsg, sizeof(errmsg)); + + CuAssertPtrEquals(tc, NULL, dstpath); + CuAssertIntEquals(tc, 1, APR_STATUS_IS_ERELATIVE(rv)); + CuAssertStrEquals(tc, "The given path is relative", errmsg); +} + +static void merge_notabsfail(CuTest *tc) +{ + apr_status_t rv; + char *dstpath = NULL; + char errmsg[256]; + + rv = apr_filepath_merge(&dstpath, ABS_ROOT"foo/bar", "../baz", + APR_FILEPATH_NOTABSOLUTE, p); + apr_strerror(rv, errmsg, sizeof(errmsg)); + + CuAssertPtrEquals(tc, NULL, dstpath); + CuAssertIntEquals(tc, 1, APR_STATUS_IS_EABSOLUTE(rv)); + CuAssertStrEquals(tc, "The given path is absolute", errmsg); +} + +static void merge_notabs(CuTest *tc) +{ + apr_status_t rv; + char *dstpath = NULL; + + rv = apr_filepath_merge(&dstpath, "foo/bar", "../baz", + APR_FILEPATH_NOTABSOLUTE, p); + + CuAssertPtrNotNull(tc, dstpath); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertStrEquals(tc, "foo/baz", dstpath); +} + +static void root_absolute(CuTest *tc) +{ + apr_status_t rv; + const char *root = NULL; + const char *path = ABS_ROOT"foo/bar"; + + rv = apr_filepath_root(&root, &path, 0, p); + + CuAssertPtrNotNull(tc, root); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertStrEquals(tc, ABS_ROOT, root); +} + +static void root_relative(CuTest *tc) +{ + apr_status_t rv; + const char *root = NULL; + const char *path = "foo/bar"; + char errmsg[256]; + + rv = apr_filepath_root(&root, &path, 0, p); + apr_strerror(rv, errmsg, sizeof(errmsg)); + + CuAssertPtrEquals(tc, NULL, root); + CuAssertIntEquals(tc, 1, APR_STATUS_IS_ERELATIVE(rv)); + CuAssertStrEquals(tc, "The given path is relative", errmsg); +} + + +static void root_from_cwd_and_back(CuTest *tc) +{ + apr_status_t rv; + const char *root = NULL; + const char *path = "//"; + char *origpath; + char *testpath; + + CuAssertIntEquals(tc, APR_SUCCESS, apr_filepath_get(&origpath, 0, p)); + path = origpath; + rv = apr_filepath_root(&root, &path, APR_FILEPATH_TRUENAME, p); + +#if defined(WIN32) || defined(OS2) + CuAssertIntEquals(tc, origpath[0], root[0]); + CuAssertIntEquals(tc, ':', root[1]); + CuAssertIntEquals(tc, '/', root[2]); + CuAssertIntEquals(tc, 0, root[3]); + CuAssertStrEquals(tc, origpath + 3, path); +#elif defined(NETWARE) + CuAssertIntEquals(tc, origpath[0], root[0]); + { + char *pt = strchr(root, ':'); + CuAssertPtrNotNull(tc, pt); + CuAssertIntEquals(tc, ':', pt[0]); + CuAssertIntEquals(tc, '/', pt[1]); + CuAssertIntEquals(tc, 0, pt[2]); + pt = strchr(origpath, ':'); + CuAssertPtrNotNull(tc, pt); + CuAssertStrEquals(tc, (pt+2), path); + } +#else + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertStrEquals(tc, "/", root); + CuAssertStrEquals(tc, origpath + 1, path); +#endif + + rv = apr_filepath_merge(&testpath, root, path, + APR_FILEPATH_TRUENAME + | APR_FILEPATH_NOTABOVEROOT + | APR_FILEPATH_NOTRELATIVE, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertStrEquals(tc, origpath, testpath); +} + + +CuSuite *testnames(void) +{ + CuSuite *suite = CuSuiteNew("Path names"); + + SUITE_ADD_TEST(suite, merge_aboveroot); + SUITE_ADD_TEST(suite, merge_belowroot); + SUITE_ADD_TEST(suite, merge_noflag); + SUITE_ADD_TEST(suite, merge_dotdot); + SUITE_ADD_TEST(suite, merge_secure); + SUITE_ADD_TEST(suite, merge_notrel); + SUITE_ADD_TEST(suite, merge_notrelfail); + SUITE_ADD_TEST(suite, merge_notabs); + SUITE_ADD_TEST(suite, merge_notabsfail); + SUITE_ADD_TEST(suite, merge_dotdot_dotdot_dotdot); + + SUITE_ADD_TEST(suite, root_absolute); + SUITE_ADD_TEST(suite, root_relative); + SUITE_ADD_TEST(suite, root_from_cwd_and_back); + + return suite; +} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/testoc.c b/rubbos/app/httpd-2.0.64/srclib/apr/test/testoc.c new file mode 100644 index 00000000..bebf4822 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/testoc.c @@ -0,0 +1,126 @@ +/* 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. + */ + +#include "test_apr.h" +#include "apr_thread_proc.h" +#include "apr_errno.h" +#include "apr_general.h" +#include "apr_lib.h" +#include "apr_strings.h" + +#if APR_HAS_OTHER_CHILD + +/* XXX I'm sure there has to be a better way to do this ... */ +#ifdef WIN32 +#define EXTENSION ".exe" +#elif NETWARE +#define EXTENSION ".nlm" +#else +#define EXTENSION +#endif + +static char reasonstr[256]; + +static void ocmaint(int reason, void *data, int status) +{ + switch (reason) { + case APR_OC_REASON_DEATH: + apr_cpystrn(reasonstr, "APR_OC_REASON_DEATH", + strlen("APR_OC_REASON_DEATH") + 1); + break; + case APR_OC_REASON_LOST: + apr_cpystrn(reasonstr, "APR_OC_REASON_LOST", + strlen("APR_OC_REASON_LOST") + 1); + break; + case APR_OC_REASON_UNWRITABLE: + apr_cpystrn(reasonstr, "APR_OC_REASON_UNWRITEABLE", + strlen("APR_OC_REASON_UNWRITEABLE") + 1); + break; + case APR_OC_REASON_RESTART: + apr_cpystrn(reasonstr, "APR_OC_REASON_RESTART", + strlen("APR_OC_REASON_RESTART") + 1); + break; + } +} + +#ifndef SIGKILL +#define SIGKILL 1 +#endif + +/* It would be great if we could stress this stuff more, and make the test + * more granular. + */ +static void test_child_kill(CuTest *tc) +{ + apr_file_t *std = NULL; + apr_proc_t newproc; + apr_procattr_t *procattr = NULL; + const char *args[3]; + apr_status_t rv; + + args[0] = apr_pstrdup(p, "occhild" EXTENSION); + args[1] = apr_pstrdup(p, "-X"); + args[2] = NULL; + + rv = apr_procattr_create(&procattr, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + rv = apr_procattr_io_set(procattr, APR_FULL_BLOCK, APR_NO_PIPE, + APR_NO_PIPE); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + rv = apr_proc_create(&newproc, "./occhild" EXTENSION, args, NULL, procattr, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertPtrNotNull(tc, newproc.in); + CuAssertPtrEquals(tc, NULL, newproc.out); + CuAssertPtrEquals(tc, NULL, newproc.err); + + std = newproc.in; + + apr_proc_other_child_register(&newproc, ocmaint, NULL, std, p); + + apr_sleep(apr_time_from_sec(1)); + rv = apr_proc_kill(&newproc, SIGKILL); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + /* allow time for things to settle... */ + apr_sleep(apr_time_from_sec(3)); + + apr_proc_other_child_check(); + CuAssertStrEquals(tc, "APR_OC_REASON_DEATH", reasonstr); +} +#else + +static void oc_not_impl(CuTest *tc) +{ + CuNotImpl(tc, "Other child logic not implemented on this platform"); +} +#endif + +CuSuite *testoc(void) +{ + CuSuite *suite = CuSuiteNew("Other Child"); + +#if !APR_HAS_OTHER_CHILD + SUITE_ADD_TEST(suite, oc_not_impl); +#else + + SUITE_ADD_TEST(suite, test_child_kill); + +#endif + return suite; +} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/testpath.c b/rubbos/app/httpd-2.0.64/srclib/apr/test/testpath.c new file mode 100644 index 00000000..e41e26ac --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/testpath.c @@ -0,0 +1,138 @@ +/* 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. + */ + +#include "test_apr.h" +#include "apr_file_info.h" +#include "apr_errno.h" +#include "apr_pools.h" +#include "apr_tables.h" + +#if defined(WIN32) || defined(NETWARE) || defined(OS2) +#define PSEP ";" +#define DSEP "\\" +#else +#define PSEP ":" +#define DSEP "/" +#endif + +#define PX "" +#define P1 "first path" +#define P2 "second" DSEP "path" +#define P3 "th ird" DSEP "path" +#define P4 "fourth" DSEP "pa th" +#define P5 "fifthpath" + +static const char *parts_in[] = { P1, P2, P3, PX, P4, P5 }; +static const char *path_in = P1 PSEP P2 PSEP P3 PSEP PX PSEP P4 PSEP P5; +static const int parts_in_count = sizeof(parts_in)/sizeof(*parts_in); + +static const char *parts_out[] = { P1, P2, P3, P4, P5 }; +static const char *path_out = P1 PSEP P2 PSEP P3 PSEP P4 PSEP P5; +static const int parts_out_count = sizeof(parts_out)/sizeof(*parts_out); + +static void list_split_multi(CuTest *tc) +{ + int i; + apr_status_t rv; + apr_array_header_t *pathelts; + + pathelts = NULL; + rv = apr_filepath_list_split(&pathelts, path_in, p); + CuAssertPtrNotNull(tc, pathelts); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertIntEquals(tc, parts_out_count, pathelts->nelts); + for (i = 0; i < pathelts->nelts; ++i) + CuAssertStrEquals(tc, parts_out[i], ((char**)pathelts->elts)[i]); +} + +static void list_split_single(CuTest *tc) +{ + int i; + apr_status_t rv; + apr_array_header_t *pathelts; + + for (i = 0; i < parts_in_count; ++i) + { + pathelts = NULL; + rv = apr_filepath_list_split(&pathelts, parts_in[i], p); + CuAssertPtrNotNull(tc, pathelts); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + if (parts_in[i][0] == '\0') + CuAssertIntEquals(tc, 0, pathelts->nelts); + else + { + CuAssertIntEquals(tc, 1, pathelts->nelts); + CuAssertStrEquals(tc, parts_in[i], *(char**)pathelts->elts); + } + } +} + +static void list_merge_multi(CuTest *tc) +{ + int i; + char *liststr; + apr_status_t rv; + apr_array_header_t *pathelts; + + pathelts = apr_array_make(p, parts_in_count, sizeof(const char*)); + for (i = 0; i < parts_in_count; ++i) + *(const char**)apr_array_push(pathelts) = parts_in[i]; + + liststr = NULL; + rv = apr_filepath_list_merge(&liststr, pathelts, p); + CuAssertPtrNotNull(tc, liststr); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertStrEquals(tc, liststr, path_out); +} + +static void list_merge_single(CuTest *tc) +{ + int i; + char *liststr; + apr_status_t rv; + apr_array_header_t *pathelts; + + pathelts = apr_array_make(p, 1, sizeof(const char*)); + apr_array_push(pathelts); + for (i = 0; i < parts_in_count; ++i) + { + *(const char**)pathelts->elts = parts_in[i]; + liststr = NULL; + rv = apr_filepath_list_merge(&liststr, pathelts, p); + if (parts_in[i][0] == '\0') + CuAssertPtrEquals(tc, NULL, liststr); + else + { + CuAssertPtrNotNull(tc, liststr); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertStrEquals(tc, liststr, parts_in[i]); + } + } +} + + +CuSuite *testpath(void) +{ + CuSuite *suite = CuSuiteNew("Path lists"); + + SUITE_ADD_TEST(suite, list_split_multi); + SUITE_ADD_TEST(suite, list_split_single); + SUITE_ADD_TEST(suite, list_merge_multi); + SUITE_ADD_TEST(suite, list_merge_single); + + return suite; +} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/testpipe.c b/rubbos/app/httpd-2.0.64/srclib/apr/test/testpipe.c new file mode 100644 index 00000000..79adf56b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/testpipe.c @@ -0,0 +1,204 @@ +/* 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. + */ + +#include + +#include "test_apr.h" +#include "apr_file_io.h" +#include "apr_errno.h" +#include "apr_general.h" +#include "apr_lib.h" +#include "apr_thread_proc.h" +#include "apr_strings.h" + +static apr_file_t *readp = NULL; +static apr_file_t *writep = NULL; + +static void create_pipe(CuTest *tc) +{ + apr_status_t rv; + + rv = apr_file_pipe_create(&readp, &writep, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertPtrNotNull(tc, readp); + CuAssertPtrNotNull(tc, writep); +} + +static void close_pipe(CuTest *tc) +{ + apr_status_t rv; + apr_size_t nbytes = 256; + char buf[256]; + + rv = apr_file_close(readp); + rv = apr_file_close(writep); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + rv = apr_file_read(readp, buf, &nbytes); + CuAssertIntEquals(tc, 1, APR_STATUS_IS_EBADF(rv)); +} + +static void set_timeout(CuTest *tc) +{ + apr_status_t rv; + apr_file_t *readp = NULL; + apr_file_t *writep = NULL; + apr_interval_time_t timeout; + + rv = apr_file_pipe_create(&readp, &writep, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertPtrNotNull(tc, readp); + CuAssertPtrNotNull(tc, writep); + + rv = apr_file_pipe_timeout_get(readp, &timeout); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssert(tc, "Timeout mismatch, expected -1", timeout == -1); + + rv = apr_file_pipe_timeout_set(readp, apr_time_from_sec(1)); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + rv = apr_file_pipe_timeout_get(readp, &timeout); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssert(tc, "Timeout mismatch, expected 1 second", + timeout == apr_time_from_sec(1)); +} + +static void read_write(CuTest *tc) +{ + apr_status_t rv; + char *buf; + apr_size_t nbytes; + + nbytes = strlen("this is a test"); + buf = (char *)apr_palloc(p, nbytes + 1); + + rv = apr_file_pipe_create(&readp, &writep, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertPtrNotNull(tc, readp); + CuAssertPtrNotNull(tc, writep); + + rv = apr_file_pipe_timeout_set(readp, apr_time_from_sec(1)); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + rv = apr_file_read(readp, buf, &nbytes); + if (!rv) { + CuAssertIntEquals(tc, 1, APR_STATUS_IS_TIMEUP(rv)); + CuAssertIntEquals(tc, 0, nbytes); + } +} + +static void read_write_notimeout(CuTest *tc) +{ + apr_status_t rv; + char *buf = "this is a test"; + char *input; + apr_size_t nbytes; + + nbytes = strlen("this is a test"); + + rv = apr_file_pipe_create(&readp, &writep, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertPtrNotNull(tc, readp); + CuAssertPtrNotNull(tc, writep); + + rv = apr_file_write(writep, buf, &nbytes); + CuAssertIntEquals(tc, strlen("this is a test"), nbytes); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + nbytes = 256; + input = apr_pcalloc(p, nbytes + 1); + rv = apr_file_read(readp, input, &nbytes); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertIntEquals(tc, strlen("this is a test"), nbytes); + CuAssertStrEquals(tc, "this is a test", input); +} + +/* XXX FIXME */ +#ifdef WIN32 +#define EXTENSION ".exe" +#elif NETWARE +#define EXTENSION ".nlm" +#else +#define EXTENSION +#endif + +static void test_pipe_writefull(CuTest *tc) +{ + int iterations = 1000; + int i; + int bytes_per_iteration = 8000; + char *buf = (char *)malloc(bytes_per_iteration); + char responsebuf[128]; + apr_size_t nbytes; + int bytes_processed; + apr_proc_t proc = {0}; + apr_procattr_t *procattr; + const char *args[2]; + apr_status_t rv; + + rv = apr_procattr_create(&procattr, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + rv = apr_procattr_io_set(procattr, APR_CHILD_BLOCK, APR_CHILD_BLOCK, + APR_CHILD_BLOCK); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + rv = apr_procattr_error_check_set(procattr, 1); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + args[0] = "readchild" EXTENSION; + args[1] = NULL; + rv = apr_proc_create(&proc, "./readchild" EXTENSION, args, NULL, procattr, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + rv = apr_file_pipe_timeout_set(proc.in, apr_time_from_sec(10)); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + rv = apr_file_pipe_timeout_set(proc.out, apr_time_from_sec(10)); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + i = iterations; + do { + rv = apr_file_write_full(proc.in, buf, bytes_per_iteration, NULL); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + } while (--i); + + free(buf); + + rv = apr_file_close(proc.in); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + nbytes = sizeof(responsebuf); + rv = apr_file_read(proc.out, responsebuf, &nbytes); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + bytes_processed = (int)apr_strtoi64(responsebuf, NULL, 10); + CuAssertIntEquals(tc, iterations * bytes_per_iteration, bytes_processed); +} + +CuSuite *testpipe(void) +{ + CuSuite *suite = CuSuiteNew("Pipes"); + + SUITE_ADD_TEST(suite, create_pipe); + SUITE_ADD_TEST(suite, close_pipe); + SUITE_ADD_TEST(suite, set_timeout); + SUITE_ADD_TEST(suite, read_write); + SUITE_ADD_TEST(suite, read_write_notimeout); + SUITE_ADD_TEST(suite, test_pipe_writefull); + + return suite; +} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/testpoll.c b/rubbos/app/httpd-2.0.64/srclib/apr/test/testpoll.c new file mode 100644 index 00000000..4e2fac8f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/testpoll.c @@ -0,0 +1,526 @@ +/* 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. + */ + +#include "test_apr.h" +#include "apr_strings.h" +#include "apr_errno.h" +#include "apr_general.h" +#include "apr_lib.h" +#include "apr_network_io.h" +#include "apr_poll.h" + +#define SMALL_NUM_SOCKETS 3 +/* We can't use 64 here, because some platforms *ahem* Solaris *ahem* have + * a default limit of 64 open file descriptors per process. If we use + * 64, the test will fail even though the code is correct. + */ +#define LARGE_NUM_SOCKETS 50 + +static apr_socket_t *s[LARGE_NUM_SOCKETS]; +static apr_sockaddr_t *sa[LARGE_NUM_SOCKETS]; +static apr_pollfd_t *pollarray; +static apr_pollfd_t *pollarray_large; +static apr_pollset_t *pollset; + +static void make_socket(apr_socket_t **sock, apr_sockaddr_t **sa, + apr_port_t port, apr_pool_t *p, CuTest *tc) +{ + apr_status_t rv; + + rv = apr_sockaddr_info_get(sa, "127.0.0.1", APR_UNSPEC, port, 0, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + rv = apr_socket_create(sock, (*sa)->family, SOCK_DGRAM, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + rv =apr_socket_bind((*sock), (*sa)); + CuAssertIntEquals(tc, APR_SUCCESS, rv); +} + +static void check_sockets(const apr_pollfd_t *pollarray, + apr_socket_t **sockarray, int which, int pollin, + CuTest *tc) +{ + apr_status_t rv; + apr_int16_t event; + char *str; + + rv = apr_poll_revents_get(&event, sockarray[which], + (apr_pollfd_t *)pollarray); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + if (pollin) { + str = apr_psprintf(p, "Socket %d not signalled when it should be", + which); + CuAssert(tc, str, event & APR_POLLIN); + } else { + str = apr_psprintf(p, "Socket %d signalled when it should not be", + which); + CuAssert(tc, str, !(event & APR_POLLIN)); + } +} + +static void send_msg(apr_socket_t **sockarray, apr_sockaddr_t **sas, int which, + CuTest *tc) +{ + apr_size_t len = 5; + apr_status_t rv; + + CuAssertPtrNotNull(tc, sockarray[which]); + + rv = apr_socket_sendto(sockarray[which], sas[which], 0, "hello", &len); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertIntEquals(tc, strlen("hello"), len); +} + +static void recv_msg(apr_socket_t **sockarray, int which, apr_pool_t *p, + CuTest *tc) +{ + apr_size_t buflen = 5; + char *buffer = apr_pcalloc(p, sizeof(char) * (buflen + 1)); + apr_sockaddr_t *recsa; + apr_status_t rv; + + CuAssertPtrNotNull(tc, sockarray[which]); + + apr_sockaddr_info_get(&recsa, "127.0.0.1", APR_UNSPEC, 7770, 0, p); + + rv = apr_socket_recvfrom(recsa, sockarray[which], 0, buffer, &buflen); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertIntEquals(tc, strlen("hello"), buflen); + CuAssertStrEquals(tc, "hello", buffer); +} + + +static void create_all_sockets(CuTest *tc) +{ + int i; + + for (i = 0; i < LARGE_NUM_SOCKETS; i++){ + make_socket(&s[i], &sa[i], 7777 + i, p, tc); + } +} + +static void setup_small_poll(CuTest *tc) +{ + apr_status_t rv; + int i; + + rv = apr_poll_setup(&pollarray, SMALL_NUM_SOCKETS, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + for (i = 0; i < SMALL_NUM_SOCKETS;i++){ + CuAssertIntEquals(tc, 0, pollarray[i].reqevents); + CuAssertIntEquals(tc, 0, pollarray[i].rtnevents); + + rv = apr_poll_socket_add(pollarray, s[i], APR_POLLIN); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertPtrEquals(tc, s[i], pollarray[i].desc.s); + } +} + +static void setup_large_poll(CuTest *tc) +{ + apr_status_t rv; + int i; + + rv = apr_poll_setup(&pollarray_large, LARGE_NUM_SOCKETS, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + for (i = 0; i < LARGE_NUM_SOCKETS;i++){ + CuAssertIntEquals(tc, 0, pollarray_large[i].reqevents); + CuAssertIntEquals(tc, 0, pollarray_large[i].rtnevents); + + rv = apr_poll_socket_add(pollarray_large, s[i], APR_POLLIN); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertPtrEquals(tc, s[i], pollarray_large[i].desc.s); + } +} + +static void nomessage(CuTest *tc) +{ + apr_status_t rv; + int srv = SMALL_NUM_SOCKETS; + + rv = apr_poll(pollarray, SMALL_NUM_SOCKETS, &srv, 2 * APR_USEC_PER_SEC); + CuAssertIntEquals(tc, 1, APR_STATUS_IS_TIMEUP(rv)); + check_sockets(pollarray, s, 0, 0, tc); + check_sockets(pollarray, s, 1, 0, tc); + check_sockets(pollarray, s, 2, 0, tc); +} + +static void send_2(CuTest *tc) +{ + apr_status_t rv; + int srv = SMALL_NUM_SOCKETS; + + send_msg(s, sa, 2, tc); + + rv = apr_poll(pollarray, SMALL_NUM_SOCKETS, &srv, 2 * APR_USEC_PER_SEC); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + check_sockets(pollarray, s, 0, 0, tc); + check_sockets(pollarray, s, 1, 0, tc); + check_sockets(pollarray, s, 2, 1, tc); +} + +static void recv_2_send_1(CuTest *tc) +{ + apr_status_t rv; + int srv = SMALL_NUM_SOCKETS; + + recv_msg(s, 2, p, tc); + send_msg(s, sa, 1, tc); + + rv = apr_poll(pollarray, SMALL_NUM_SOCKETS, &srv, 2 * APR_USEC_PER_SEC); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + check_sockets(pollarray, s, 0, 0, tc); + check_sockets(pollarray, s, 1, 1, tc); + check_sockets(pollarray, s, 2, 0, tc); +} + +static void send_2_signaled_1(CuTest *tc) +{ + apr_status_t rv; + int srv = SMALL_NUM_SOCKETS; + + send_msg(s, sa, 2, tc); + + rv = apr_poll(pollarray, SMALL_NUM_SOCKETS, &srv, 2 * APR_USEC_PER_SEC); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + check_sockets(pollarray, s, 0, 0, tc); + check_sockets(pollarray, s, 1, 1, tc); + check_sockets(pollarray, s, 2, 1, tc); +} + +static void recv_1_send_0(CuTest *tc) +{ + apr_status_t rv; + int srv = SMALL_NUM_SOCKETS; + + recv_msg(s, 1, p, tc); + send_msg(s, sa, 0, tc); + + rv = apr_poll(pollarray, SMALL_NUM_SOCKETS, &srv, 2 * APR_USEC_PER_SEC); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + check_sockets(pollarray, s, 0, 1, tc); + check_sockets(pollarray, s, 1, 0, tc); + check_sockets(pollarray, s, 2, 1, tc); +} + +static void clear_all_signalled(CuTest *tc) +{ + apr_status_t rv; + int srv = SMALL_NUM_SOCKETS; + + recv_msg(s, 0, p, tc); + recv_msg(s, 2, p, tc); + + rv = apr_poll(pollarray, SMALL_NUM_SOCKETS, &srv, 2 * APR_USEC_PER_SEC); + CuAssertIntEquals(tc, 1, APR_STATUS_IS_TIMEUP(rv)); + check_sockets(pollarray, s, 0, 0, tc); + check_sockets(pollarray, s, 1, 0, tc); + check_sockets(pollarray, s, 2, 0, tc); +} + +static void send_large_pollarray(CuTest *tc) +{ + apr_status_t rv; + int lrv = LARGE_NUM_SOCKETS; + int i; + + send_msg(s, sa, LARGE_NUM_SOCKETS - 1, tc); + + rv = apr_poll(pollarray_large, LARGE_NUM_SOCKETS, &lrv, + 2 * APR_USEC_PER_SEC); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + for (i = 0; i < LARGE_NUM_SOCKETS; i++) { + if (i == (LARGE_NUM_SOCKETS - 1)) { + check_sockets(pollarray_large, s, i, 1, tc); + } + else { + check_sockets(pollarray_large, s, i, 0, tc); + } + } +} + +static void recv_large_pollarray(CuTest *tc) +{ + apr_status_t rv; + int lrv = LARGE_NUM_SOCKETS; + int i; + + recv_msg(s, LARGE_NUM_SOCKETS - 1, p, tc); + + rv = apr_poll(pollarray_large, LARGE_NUM_SOCKETS, &lrv, + 2 * APR_USEC_PER_SEC); + CuAssertIntEquals(tc, 1, APR_STATUS_IS_TIMEUP(rv)); + + for (i = 0; i < LARGE_NUM_SOCKETS; i++) { + check_sockets(pollarray_large, s, i, 0, tc); + } +} + +static void setup_pollset(CuTest *tc) +{ + apr_status_t rv; + rv = apr_pollset_create(&pollset, LARGE_NUM_SOCKETS, p, 0); + CuAssertIntEquals(tc, APR_SUCCESS, rv); +} + +static void add_sockets_pollset(CuTest *tc) +{ + apr_status_t rv; + int i; + + for (i = 0; i < LARGE_NUM_SOCKETS;i++){ + apr_pollfd_t socket_pollfd; + + CuAssertPtrNotNull(tc, s[i]); + + socket_pollfd.desc_type = APR_POLL_SOCKET; + socket_pollfd.reqevents = APR_POLLIN; + socket_pollfd.desc.s = s[i]; + socket_pollfd.client_data = s[i]; + rv = apr_pollset_add(pollset, &socket_pollfd); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + } +} + +static void nomessage_pollset(CuTest *tc) +{ + apr_status_t rv; + int lrv; + const apr_pollfd_t *descs = NULL; + + rv = apr_pollset_poll(pollset, 0, &lrv, &descs); + CuAssertIntEquals(tc, 1, APR_STATUS_IS_TIMEUP(rv)); + CuAssertIntEquals(tc, 0, lrv); + CuAssertPtrEquals(tc, NULL, descs); +} + +static void send0_pollset(CuTest *tc) +{ + apr_status_t rv; + const apr_pollfd_t *descs = NULL; + int num; + + send_msg(s, sa, 0, tc); + rv = apr_pollset_poll(pollset, 0, &num, &descs); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertIntEquals(tc, 1, num); + CuAssertPtrNotNull(tc, descs); + + CuAssertPtrEquals(tc, s[0], descs[0].desc.s); + CuAssertPtrEquals(tc, s[0], descs[0].client_data); +} + +static void recv0_pollset(CuTest *tc) +{ + apr_status_t rv; + int lrv; + const apr_pollfd_t *descs = NULL; + + recv_msg(s, 0, p, tc); + rv = apr_pollset_poll(pollset, 0, &lrv, &descs); + CuAssertIntEquals(tc, 1, APR_STATUS_IS_TIMEUP(rv)); + CuAssertIntEquals(tc, 0, lrv); + CuAssertPtrEquals(tc, NULL, descs); +} + +static void send_middle_pollset(CuTest *tc) +{ + apr_status_t rv; + const apr_pollfd_t *descs = NULL; + int num; + + send_msg(s, sa, 2, tc); + send_msg(s, sa, 5, tc); + rv = apr_pollset_poll(pollset, 0, &num, &descs); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertIntEquals(tc, 2, num); + CuAssertPtrNotNull(tc, descs); + + CuAssert(tc, "Incorrect socket in result set", + ((descs[0].desc.s == s[2]) && (descs[1].desc.s == s[5])) || + ((descs[0].desc.s == s[5]) && (descs[1].desc.s == s[2]))); +} + +static void clear_middle_pollset(CuTest *tc) +{ + apr_status_t rv; + int lrv; + const apr_pollfd_t *descs = NULL; + + recv_msg(s, 2, p, tc); + recv_msg(s, 5, p, tc); + + rv = apr_pollset_poll(pollset, 0, &lrv, &descs); + CuAssertIntEquals(tc, 1, APR_STATUS_IS_TIMEUP(rv)); + CuAssertIntEquals(tc, 0, lrv); + CuAssertPtrEquals(tc, NULL, descs); +} + +static void send_last_pollset(CuTest *tc) +{ + apr_status_t rv; + const apr_pollfd_t *descs = NULL; + int num; + + send_msg(s, sa, LARGE_NUM_SOCKETS - 1, tc); + rv = apr_pollset_poll(pollset, 0, &num, &descs); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertIntEquals(tc, 1, num); + CuAssertPtrNotNull(tc, descs); + + CuAssertPtrEquals(tc, s[LARGE_NUM_SOCKETS - 1], descs[0].desc.s); + CuAssertPtrEquals(tc, s[LARGE_NUM_SOCKETS - 1], descs[0].client_data); +} + +static void clear_last_pollset(CuTest *tc) +{ + apr_status_t rv; + int lrv; + const apr_pollfd_t *descs = NULL; + + recv_msg(s, LARGE_NUM_SOCKETS - 1, p, tc); + + rv = apr_pollset_poll(pollset, 0, &lrv, &descs); + CuAssertIntEquals(tc, 1, APR_STATUS_IS_TIMEUP(rv)); + CuAssertIntEquals(tc, 0, lrv); + CuAssertPtrEquals(tc, NULL, descs); +} + +static void close_all_sockets(CuTest *tc) +{ + apr_status_t rv; + int i; + + for (i = 0; i < LARGE_NUM_SOCKETS; i++){ + rv = apr_socket_close(s[i]); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + } +} + +static void pollset_remove(CuTest *tc) +{ + apr_status_t rv; + apr_pollset_t *pollset; + const apr_pollfd_t *hot_files; + apr_pollfd_t pfd; + apr_int32_t num; + + rv = apr_pollset_create(&pollset, 5, p, 0); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + pfd.p = p; + pfd.desc_type = APR_POLL_SOCKET; + pfd.reqevents = APR_POLLOUT; + + pfd.desc.s = s[0]; + pfd.client_data = (void *)1; + rv = apr_pollset_add(pollset, &pfd); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + pfd.desc.s = s[1]; + pfd.client_data = (void *)2; + rv = apr_pollset_add(pollset, &pfd); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + pfd.desc.s = s[2]; + pfd.client_data = (void *)3; + rv = apr_pollset_add(pollset, &pfd); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + pfd.desc.s = s[1]; + pfd.client_data = (void *)4; + rv = apr_pollset_add(pollset, &pfd); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + pfd.desc.s = s[3]; + pfd.client_data = (void *)5; + rv = apr_pollset_add(pollset, &pfd); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + rv = apr_pollset_poll(pollset, 1000, &num, &hot_files); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertIntEquals(tc, 5, num); + + /* now remove the pollset elements referring to desc s[1] */ + pfd.desc.s = s[1]; + pfd.client_data = (void *)999; /* not used on this call */ + rv = apr_pollset_remove(pollset, &pfd); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + /* this time only three should match */ + rv = apr_pollset_poll(pollset, 1000, &num, &hot_files); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertIntEquals(tc, 3, num); + CuAssertPtrEquals(tc, (void *)1, hot_files[0].client_data); + CuAssertPtrEquals(tc, s[0], hot_files[0].desc.s); + CuAssertPtrEquals(tc, (void *)3, hot_files[1].client_data); + CuAssertPtrEquals(tc, s[2], hot_files[1].desc.s); + CuAssertPtrEquals(tc, (void *)5, hot_files[2].client_data); + CuAssertPtrEquals(tc, s[3], hot_files[2].desc.s); + + /* now remove the pollset elements referring to desc s[2] */ + pfd.desc.s = s[2]; + pfd.client_data = (void *)999; /* not used on this call */ + rv = apr_pollset_remove(pollset, &pfd); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + /* this time only two should match */ + rv = apr_pollset_poll(pollset, 1000, &num, &hot_files); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertIntEquals(tc, 2, num); + CuAssertPtrEquals(tc, (void *)1, hot_files[0].client_data); + CuAssertPtrEquals(tc, s[0], hot_files[0].desc.s); + CuAssertPtrEquals(tc, (void *)5, hot_files[1].client_data); + CuAssertPtrEquals(tc, s[3], hot_files[1].desc.s); +} + +CuSuite *testpoll(void) +{ + CuSuite *suite = CuSuiteNew("Poll"); + + SUITE_ADD_TEST(suite, create_all_sockets); + SUITE_ADD_TEST(suite, setup_small_poll); + SUITE_ADD_TEST(suite, setup_large_poll); + SUITE_ADD_TEST(suite, nomessage); + SUITE_ADD_TEST(suite, send_2); + SUITE_ADD_TEST(suite, recv_2_send_1); + SUITE_ADD_TEST(suite, send_2_signaled_1); + SUITE_ADD_TEST(suite, recv_1_send_0); + SUITE_ADD_TEST(suite, clear_all_signalled); + SUITE_ADD_TEST(suite, send_large_pollarray); + SUITE_ADD_TEST(suite, recv_large_pollarray); + + SUITE_ADD_TEST(suite, setup_pollset); + SUITE_ADD_TEST(suite, add_sockets_pollset); + SUITE_ADD_TEST(suite, nomessage_pollset); + SUITE_ADD_TEST(suite, send0_pollset); + SUITE_ADD_TEST(suite, recv0_pollset); + SUITE_ADD_TEST(suite, send_middle_pollset); + SUITE_ADD_TEST(suite, clear_middle_pollset); + SUITE_ADD_TEST(suite, send_last_pollset); + SUITE_ADD_TEST(suite, clear_last_pollset); + + SUITE_ADD_TEST(suite, pollset_remove); + + SUITE_ADD_TEST(suite, close_all_sockets); + + return suite; +} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/testpools.c b/rubbos/app/httpd-2.0.64/srclib/apr/test/testpools.c new file mode 100644 index 00000000..efabf0d0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/testpools.c @@ -0,0 +1,108 @@ +/* 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. + */ + + +#include "apr_general.h" +#include "apr_pools.h" +#include "apr_errno.h" +#include "apr_file_io.h" +#include +#include +#include +#if APR_HAVE_UNISTD_H +#include +#endif +#include "test_apr.h" + +#define ALLOC_BYTES 1024 + +static apr_pool_t *pmain = NULL; +static apr_pool_t *pchild = NULL; + +static void alloc_bytes(CuTest *tc) +{ + int i; + char *alloc; + + alloc = apr_palloc(pmain, ALLOC_BYTES); + CuAssertPtrNotNull(tc, alloc); + + for (i=0;i +#include +#include "test_apr.h" + +#if APR_HAS_FORK + +#define MAX_ITER 200 +#define CHILDREN 6 +#define MAX_COUNTER (MAX_ITER * CHILDREN) + +static apr_proc_mutex_t *proc_lock; +static volatile int *x; + +/* a slower more racy way to implement (*x)++ */ +static int increment(int n) +{ + apr_sleep(1); + return n+1; +} + +static void make_child(CuTest *tc, apr_proc_t **proc, apr_pool_t *p) +{ + apr_status_t rv; + + *proc = apr_pcalloc(p, sizeof(**proc)); + + /* slight delay to allow things to settle */ + apr_sleep (1); + + rv = apr_proc_fork(*proc, p); + if (rv == APR_INCHILD) { + int i = 0; + /* The parent process has setup all processes to call apr_terminate + * at exit. But, that means that all processes must also call + * apr_initialize at startup. You cannot have an unequal number + * of apr_terminate and apr_initialize calls. If you do, bad things + * will happen. In this case, the bad thing is that if the mutex + * is a semaphore, it will be destroyed before all of the processes + * die. That means that the test will most likely fail. + */ + apr_initialize(); + + if (apr_proc_mutex_child_init(&proc_lock, NULL, p)) + exit(1); + + do { + if (apr_proc_mutex_lock(proc_lock)) + exit(1); + i++; + *x = increment(*x); + if (apr_proc_mutex_unlock(proc_lock)) + exit(1); + } while (i < MAX_ITER); + exit(0); + } + + CuAssert(tc, "fork failed", rv == APR_INPARENT); +} + +/* Wait for a child process and check it terminated with success. */ +static void await_child(CuTest *tc, apr_proc_t *proc) +{ + int code; + apr_exit_why_e why; + apr_status_t rv; + + rv = apr_proc_wait(proc, &code, &why, APR_WAIT); + CuAssert(tc, "child did not terminate with success", + rv == APR_CHILD_DONE && why == APR_PROC_EXIT && code == 0); +} + +static void test_exclusive(CuTest *tc, const char *lockname) +{ + apr_proc_t *child[CHILDREN]; + apr_status_t rv; + int n; + + rv = apr_proc_mutex_create(&proc_lock, lockname, APR_LOCK_DEFAULT, p); + apr_assert_success(tc, "create the mutex", rv); + + for (n = 0; n < CHILDREN; n++) + make_child(tc, &child[n], p); + + for (n = 0; n < CHILDREN; n++) + await_child(tc, child[n]); + + CuAssert(tc, "Locks don't appear to work", *x == MAX_COUNTER); +} +#endif + +static void proc_mutex(CuTest *tc) +{ +#if APR_HAS_FORK + apr_status_t rv; + const char *shmname = "tpm.shm"; + apr_shm_t *shm; + + /* Use anonymous shm if available. */ + rv = apr_shm_create(&shm, sizeof(int), NULL, p); + if (rv == APR_ENOTIMPL) { + apr_file_remove(shmname, p); + rv = apr_shm_create(&shm, sizeof(int), shmname, p); + } + + apr_assert_success(tc, "create shm segment", rv); + + x = apr_shm_baseaddr_get(shm); + test_exclusive(tc, NULL); +#else + CuNotImpl(tc, "APR lacks fork() support"); +#endif +} + + +CuSuite *testprocmutex(void) +{ + CuSuite *suite = CuSuiteNew("Cross-Process Mutexes"); + + SUITE_ADD_TEST(suite, proc_mutex); + + return suite; +} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/testrand.c b/rubbos/app/httpd-2.0.64/srclib/apr/test/testrand.c new file mode 100644 index 00000000..03090ca9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/testrand.c @@ -0,0 +1,46 @@ +/* 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. + */ + +#include "apr_general.h" +#include +#include +#include +#include "test_apr.h" + +static void rand_exists(CuTest *tc) +{ +#if !APR_HAS_RANDOM + CuNotImpl(tc, "apr_generate_random_bytes"); +#else + unsigned char c[42]; + + /* There must be a better way to test random-ness, but I don't know + * what it is right now. + */ + apr_assert_success(tc, "apr_generate_random_bytes failed", + apr_generate_random_bytes(c, sizeof c)); +#endif +} + +CuSuite *testrand(void) +{ + CuSuite *suite = CuSuiteNew("Random"); + + SUITE_ADD_TEST(suite, rand_exists); + + return suite; +} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/testshm.c b/rubbos/app/httpd-2.0.64/srclib/apr/test/testshm.c new file mode 100644 index 00000000..01357d5b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/testshm.c @@ -0,0 +1,293 @@ +/* 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. + */ + +#include "apr_shm.h" +#include "apr_errno.h" +#include "apr_general.h" +#include "apr_lib.h" +#include "apr_strings.h" +#include "apr_time.h" +#include +#include +#include +#if APR_HAVE_UNISTD_H +#include +#endif + +#if APR_HAS_SHARED_MEMORY + +typedef struct mbox { + char msg[1024]; + int msgavail; +} mbox; +mbox *boxes; + +#define N_BOXES 10 +#define N_MESSAGES 100 +#define SHARED_SIZE (apr_size_t)(N_BOXES * sizeof(mbox)) +#define SHARED_FILENAME "/tmp/apr.testshm.shm" + +static void msgwait(int sleep_sec, int first_box, int last_box) +{ + int i; + apr_time_t start = apr_time_now(); + apr_interval_time_t sleep_duration = apr_time_from_sec(sleep_sec); + while (apr_time_now() - start < sleep_duration) { + for (i = first_box; i < last_box; i++) { + if (boxes[i].msgavail) { + fprintf(stdout, "received a message in box %d, message was: %s\n", + i, boxes[i].msg); + boxes[i].msgavail = 0; /* reset back to 0 */ + } + } + apr_sleep(apr_time_make(0, 10000)); /* 10ms */ + } + fprintf(stdout, "done waiting on mailboxes...\n"); +} + +static void msgput(int boxnum, char *msg) +{ + fprintf(stdout, "Sending message to box %d\n", boxnum); + apr_cpystrn(boxes[boxnum].msg, msg, strlen(msg)); + boxes[boxnum].msgavail = 1; +} + +static apr_status_t test_anon(apr_pool_t *parpool) +{ + apr_status_t rv; + apr_pool_t *pool; + apr_shm_t *shm; + apr_size_t retsize; + pid_t pid; + int cnt, i, exit_int; + + rv = apr_pool_create(&pool, parpool); + if (rv != APR_SUCCESS) { + fprintf(stderr, "Error creating child pool\n"); + return rv; + } + + printf("Creating anonymous shared memory block (%" + APR_SIZE_T_FMT " bytes)........", SHARED_SIZE); + rv = apr_shm_create(&shm, SHARED_SIZE, NULL, pool); + if (rv != APR_SUCCESS) { + fprintf(stderr, "Error allocating shared memory block\n"); + return rv; + } + fprintf(stdout, "OK\n"); + + printf("Checking size...%" APR_SIZE_T_FMT " bytes...", + retsize = apr_shm_size_get(shm)); + if (retsize != SHARED_SIZE) { + fprintf(stderr, "Error allocating shared memory block\n"); + return rv; + } + fprintf(stdout, "OK\n"); + + printf("Allocating shared mbox memory for %d boxes ..............", + N_BOXES); + boxes = apr_shm_baseaddr_get(shm); + if (boxes == NULL) { + fprintf(stderr, "Error creating message boxes.\n"); + return rv; + } + fprintf(stdout, "OK\n"); + + printf("Shared Process Test (child/parent)\n"); + pid = fork(); + if (pid == 0) { /* child */ + msgwait(5, 0, N_BOXES); + exit(0); + } + else if (pid > 0) { /* parent */ + i = N_BOXES; + cnt = N_MESSAGES; + while (--cnt > 0) { + if ((i-=3) < 0) { + i += N_BOXES; /* start over at the top */ + } + msgput(i, "Sending a message\n"); + apr_sleep(apr_time_make(0, 10000)); + } + } + else { + printf("Error creating a child process\n"); + return errno; + } + /* wait for the child */ + printf("Waiting for child to exit.\n"); + if (waitpid(pid, &exit_int, 0) < 0) { + return errno; + } + + printf("Destroying shared memory segment..."); + rv = apr_shm_destroy(shm); + if (rv != APR_SUCCESS) { + printf("FAILED\n"); + return rv; + } + printf("OK\n"); + + apr_pool_destroy(pool); + + return APR_SUCCESS; +} + +static apr_status_t test_named(apr_pool_t *parpool) +{ + apr_status_t rv; + apr_pool_t *pool; + apr_shm_t *shm; + apr_size_t retsize; + pid_t pidproducer, pidconsumer; + int exit_int; + + rv = apr_pool_create(&pool, parpool); + if (rv != APR_SUCCESS) { + fprintf(stderr, "Error creating child pool\n"); + return rv; + } + + printf("Creating named shared memory block (%" + APR_SIZE_T_FMT " bytes)........", SHARED_SIZE); + rv = apr_shm_create(&shm, SHARED_SIZE, SHARED_FILENAME, pool); + if (rv != APR_SUCCESS) { + fprintf(stderr, "Error allocating shared memory block\n"); + return rv; + } + fprintf(stdout, "OK\n"); + + printf("Checking size...%" APR_SIZE_T_FMT " bytes...", + retsize = apr_shm_size_get(shm)); + if (retsize != SHARED_SIZE) { + fprintf(stderr, "Error allocating shared memory block\n"); + return rv; + } + fprintf(stdout, "OK\n"); + + printf("Allocating shared mbox memory for %d boxes ..............", + N_BOXES); + boxes = apr_shm_baseaddr_get(shm); + if (boxes == NULL) { + fprintf(stderr, "Error creating message boxes.\n"); + return rv; + } + fprintf(stdout, "OK\n"); + + printf("fork()ing and exec()ing children:\n"); + pidproducer = fork(); + if (pidproducer == 0) { /* child */ + /* FIXME: exec a producer */ + printf("starting consumer.....\n"); + if (execlp("testshmconsumer", "testshmconsumer", (char*)0) < 0) { + return errno; + } + } + else if (pidproducer > 0) { /* parent */ + /* fork another child */ + pidconsumer = fork(); + if (pidconsumer == 0) { /* child */ + /* FIXME: exec a producer */ + printf("starting producer.....\n"); + if (execlp("testshmproducer", "testshmproducer", (char*)0) < 0) { + return errno; + } + } + else if (pidconsumer < 0) { /* parent */ + printf("Error creating a child process\n"); + return errno; + } + } + else { + printf("Error creating a child process\n"); + return errno; + } + /* wait for the child */ + printf("Waiting for producer to exit.\n"); + if (waitpid(pidconsumer, &exit_int, 0) < 0) { + return errno; + } + if (!WIFEXITED(exit_int)) { + printf("Producer was unsuccessful.\n"); + return APR_EGENERAL; + } + printf("Waiting for consumer to exit.\n"); + if (waitpid(pidproducer, &exit_int, 0) < 0) { + return errno; + } + if (!WIFEXITED(exit_int)) { + printf("Consumer was unsuccessful.\n"); + return APR_EGENERAL; + } + + printf("Destroying shared memory segment..."); + rv = apr_shm_destroy(shm); + if (rv != APR_SUCCESS) { + printf("FAILED\n"); + return rv; + } + printf("OK\n"); + + apr_pool_destroy(pool); + + return APR_SUCCESS; +} + +int main(void) +{ + apr_status_t rv; + apr_pool_t *pool; + char errmsg[200]; + + apr_initialize(); + + printf("APR Shared Memory Test\n"); + printf("======================\n\n"); + + printf("Initializing the pool............................"); + if (apr_pool_create(&pool, NULL) != APR_SUCCESS) { + printf("could not initialize pool\n"); + exit(-1); + } + printf("OK\n"); + + rv = test_anon(pool); + if (rv != APR_SUCCESS) { + if (rv == APR_ENOTIMPL) { + printf("Anonymous shared memory unavailable on this platform.\n"); + } + else { + printf("Anonymous shared memory test FAILED: [%d] %s\n", + rv, apr_strerror(rv, errmsg, sizeof(errmsg))); + exit(-2); + } + } + printf("Anonymous shared memory test passed!\n"); + + if ((rv = test_named(pool)) != APR_SUCCESS) { + printf("Name-based shared memory test FAILED: [%d] %s \n", + rv, apr_strerror(rv, errmsg, sizeof(errmsg))); + exit(-3); + } + printf("Named shared memory test passed!\n"); + + return 0; +} + +#else /* APR_HAS_SHARED_MEMORY */ +#error shmem is not supported on this platform +#endif /* APR_HAS_SHARED_MEMORY */ + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/testshmconsumer.c b/rubbos/app/httpd-2.0.64/srclib/apr/test/testshmconsumer.c new file mode 100644 index 00000000..4064cd7d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/testshmconsumer.c @@ -0,0 +1,116 @@ +/* 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. + */ + +#include "apr_shm.h" +#include "apr_errno.h" +#include "apr_general.h" +#include "apr_lib.h" +#include "apr_strings.h" +#include "apr_time.h" +#include +#include +#include +#if APR_HAVE_UNISTD_H +#include +#endif + +#if APR_HAS_SHARED_MEMORY + +typedef struct mbox { + char msg[1024]; + int msgavail; +} mbox; +mbox *boxes; + +#define N_BOXES 10 +#define SHARED_SIZE (apr_size_t)(N_BOXES * sizeof(mbox)) +#define SHARED_FILENAME "/tmp/apr.testshm.shm" + +static void msgwait(int sleep_sec, int first_box, int last_box) +{ + int i; + apr_time_t start = apr_time_now(); + apr_interval_time_t sleep_duration = apr_time_from_sec(sleep_sec); + while (apr_time_now() - start < sleep_duration) { + for (i = first_box; i < last_box; i++) { + if (boxes[i].msgavail) { + fprintf(stdout, "Consumer: received a message in box %d, message was: %s\n", + i, boxes[i].msg); + boxes[i].msgavail = 0; /* reset back to 0 */ + } + } + apr_sleep(apr_time_from_sec(1)); + } + fprintf(stdout, "Consumer: done waiting on mailboxes...\n"); +} + +int main(void) +{ + apr_status_t rv; + apr_pool_t *pool; + apr_shm_t *shm; + char errmsg[200]; + + apr_initialize(); + + printf("APR Shared Memory Test: CONSUMER\n"); + + printf("Initializing the pool............................"); + if (apr_pool_create(&pool, NULL) != APR_SUCCESS) { + printf("could not initialize pool\n"); + exit(-1); + } + printf("OK\n"); + + printf("Consumer attaching to name-based shared memory...."); + rv = apr_shm_attach(&shm, SHARED_FILENAME, pool); + if (rv != APR_SUCCESS) { + printf("Consumer unable to attach to name-based shared memory " + "segment: [%d] %s \n", rv, + apr_strerror(rv, errmsg, sizeof(errmsg))); + exit(-2); + } + printf("OK\n"); + + boxes = apr_shm_baseaddr_get(shm); + + /* consume messages on all of the boxes */ + msgwait(30, 0, N_BOXES); /* wait for 30 seconds for messages */ + + printf("Consumer detaching from name-based shared memory...."); + rv = apr_shm_detach(shm); + if (rv != APR_SUCCESS) { + printf("Consumer unable to detach from name-based shared memory " + "segment: [%d] %s \n", rv, + apr_strerror(rv, errmsg, sizeof(errmsg))); + exit(-3); + } + printf("OK\n"); + + return 0; +} + +#else /* APR_HAS_SHARED_MEMORY */ + +int main(void) +{ + printf("APR SHMEM test not run!\n"); + printf("shmem is not supported on this platform\n"); + return -1; +} + +#endif /* APR_HAS_SHARED_MEMORY */ + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/testshmproducer.c b/rubbos/app/httpd-2.0.64/srclib/apr/test/testshmproducer.c new file mode 100644 index 00000000..3589a439 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/testshmproducer.c @@ -0,0 +1,109 @@ +/* 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. + */ + +#include "apr_shm.h" +#include "apr_errno.h" +#include "apr_general.h" +#include "apr_lib.h" +#include "apr_strings.h" +#include "apr_time.h" +#include +#include +#include +#if APR_HAVE_UNISTD_H +#include +#endif + +#if APR_HAS_SHARED_MEMORY + +typedef struct mbox { + char msg[1024]; + int msgavail; +} mbox; +mbox *boxes; + +#define N_BOXES 10 +#define SHARED_SIZE (apr_size_t)(N_BOXES * sizeof(mbox)) +#define SHARED_FILENAME "/tmp/apr.testshm.shm" + +static void msgput(int boxnum, char *msg) +{ + fprintf(stdout, "Producer: Sending message to box %d\n", boxnum); + apr_cpystrn(boxes[boxnum].msg, msg, strlen(msg)); + boxes[boxnum].msgavail = 1; +} + +int main(void) +{ + apr_status_t rv; + apr_pool_t *pool; + apr_shm_t *shm; + int i; + char errmsg[200]; + + apr_initialize(); + + printf("APR Shared Memory Test: PRODUCER\n"); + + printf("Initializing the pool............................"); + if (apr_pool_create(&pool, NULL) != APR_SUCCESS) { + printf("could not initialize pool\n"); + exit(-1); + } + printf("OK\n"); + + printf("Producer attaching to name-based shared memory...."); + rv = apr_shm_attach(&shm, SHARED_FILENAME, pool); + if (rv != APR_SUCCESS) { + printf("Producer unable to attach to name-based shared memory " + "segment: [%d] %s \n", rv, + apr_strerror(rv, errmsg, sizeof(errmsg))); + exit(-2); + } + printf("OK\n"); + + boxes = apr_shm_baseaddr_get(shm); + + /* produce messages on all of the boxes, in descending order */ + for (i = N_BOXES - 1; i > 0; i--) { + msgput(i, "Sending a message\n"); + apr_sleep(apr_time_from_sec(1)); + } + + printf("Producer detaching from name-based shared memory...."); + rv = apr_shm_detach(shm); + if (rv != APR_SUCCESS) { + printf("Producer unable to detach from name-based shared memory " + "segment: [%d] %s \n", rv, + apr_strerror(rv, errmsg, sizeof(errmsg))); + exit(-3); + } + printf("OK\n"); + + return 0; +} + +#else /* APR_HAS_SHARED_MEMORY */ + +int main(void) +{ + printf("APR SHMEM test not run!\n"); + printf("shmem is not supported on this platform\n"); + return -1; +} + +#endif /* APR_HAS_SHARED_MEMORY */ + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/testsleep.c b/rubbos/app/httpd-2.0.64/srclib/apr/test/testsleep.c new file mode 100644 index 00000000..8b2451f9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/testsleep.c @@ -0,0 +1,54 @@ +/* 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. + */ + +#include "time.h" +#include "apr_thread_proc.h" +#include "apr_errno.h" +#include "apr_general.h" +#include "apr_lib.h" +#include +#include +#include +#include "test_apr.h" + +#define SLEEP_INTERVAL 5 + +static void sleep_one(CuTest *tc) +{ + time_t pretime = time(NULL); + time_t posttime; + time_t timediff; + + apr_sleep(apr_time_from_sec(SLEEP_INTERVAL)); + posttime = time(NULL); + + /* normalize the timediff. We should have slept for SLEEP_INTERVAL, so + * we should just subtract that out. + */ + timediff = posttime - pretime - SLEEP_INTERVAL; + CuAssertTrue(tc, timediff >= 0); + CuAssertTrue(tc, timediff <= 1); +} + +CuSuite *testsleep(void) +{ + CuSuite *suite = CuSuiteNew("Sleep"); + + SUITE_ADD_TEST(suite, sleep_one); + + return suite; +} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/testsock.c b/rubbos/app/httpd-2.0.64/srclib/apr/test/testsock.c new file mode 100644 index 00000000..79477b8a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/testsock.c @@ -0,0 +1,175 @@ +/* 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. + */ + +#include +#include +#include +#include "apr_thread_proc.h" +#include "apr_errno.h" +#include "apr_general.h" +#include "apr_lib.h" +#include "apr_strings.h" + +#define STRLEN 15 + +static int run_basic_test(apr_pool_t *context) +{ + apr_procattr_t *attr1 = NULL; + apr_procattr_t *attr2 = NULL; + apr_proc_t proc1; + apr_proc_t proc2; + apr_status_t s1; + apr_status_t s2; + const char *args[2]; + + fprintf(stdout, "Creating children to run network tests.......\n"); + s1 = apr_procattr_create(&attr1, context); + s2 = apr_procattr_create(&attr2, context); + + if (s1 != APR_SUCCESS || s2 != APR_SUCCESS) { + fprintf(stderr, "Problem creating proc attrs\n"); + exit(-1); + } + + args[0] = apr_pstrdup(context, "server"); + args[1] = NULL; + s1 = apr_proc_create(&proc1, "./server", args, NULL, attr1, context); + + /* Sleep for 5 seconds to ensure the server is setup before we begin */ + apr_sleep(5000000); + args[0] = apr_pstrdup(context, "client"); + s2 = apr_proc_create(&proc2, "./client", args, NULL, attr2, context); + + if (s1 != APR_SUCCESS || s2 != APR_SUCCESS) { + fprintf(stderr, "Problem spawning new process\n"); + exit(-1); + } + + while ((s1 = apr_proc_wait(&proc1, NULL, NULL, APR_NOWAIT)) == APR_CHILD_NOTDONE && + (s2 = apr_proc_wait(&proc2, NULL, NULL, APR_NOWAIT)) == APR_CHILD_NOTDONE) { + continue; + } + + if (s1 == APR_SUCCESS) { + apr_proc_kill(&proc2, SIGTERM); + while (apr_proc_wait(&proc2, NULL, NULL, APR_WAIT) == APR_CHILD_NOTDONE); + } + else { + apr_proc_kill(&proc1, SIGTERM); + while (apr_proc_wait(&proc1, NULL, NULL, APR_WAIT) == APR_CHILD_NOTDONE); + } + fprintf(stdout, "Network test completed.\n"); + + return 1; +} + +static int run_sendfile(apr_pool_t *context, int number) +{ + apr_procattr_t *attr1 = NULL; + apr_procattr_t *attr2 = NULL; + apr_proc_t proc1; + apr_proc_t proc2; + apr_status_t s1; + apr_status_t s2; + const char *args[4]; + + fprintf(stdout, "Creating children to run network tests.......\n"); + s1 = apr_procattr_create(&attr1, context); + s2 = apr_procattr_create(&attr2, context); + + if (s1 != APR_SUCCESS || s2 != APR_SUCCESS) { + fprintf(stderr, "Problem creating proc attrs\n"); + exit(-1); + } + + args[0] = apr_pstrdup(context, "sendfile"); + args[1] = apr_pstrdup(context, "server"); + args[2] = NULL; + s1 = apr_proc_create(&proc1, "./sendfile", args, NULL, attr1, context); + + /* Sleep for 5 seconds to ensure the server is setup before we begin */ + apr_sleep(5000000); + args[1] = apr_pstrdup(context, "client"); + switch (number) { + case 0: { + args[2] = apr_pstrdup(context, "blocking"); + break; + } + case 1: { + args[2] = apr_pstrdup(context, "nonblocking"); + break; + } + case 2: { + args[2] = apr_pstrdup(context, "timeout"); + break; + } + } + args[3] = NULL; + s2 = apr_proc_create(&proc2, "./sendfile", args, NULL, attr2, context); + + if (s1 != APR_SUCCESS || s2 != APR_SUCCESS) { + fprintf(stderr, "Problem spawning new process\n"); + exit(-1); + } + + while ((s1 = apr_proc_wait(&proc1, NULL, NULL, APR_NOWAIT)) == APR_CHILD_NOTDONE && + (s2 = apr_proc_wait(&proc2, NULL, NULL, APR_NOWAIT)) == APR_CHILD_NOTDONE) { + continue; + } + + if (s1 == APR_SUCCESS) { + apr_proc_kill(&proc2, SIGTERM); + while (apr_proc_wait(&proc2, NULL, NULL, APR_WAIT) == APR_CHILD_NOTDONE); + } + else { + apr_proc_kill(&proc1, SIGTERM); + while (apr_proc_wait(&proc1, NULL, NULL, APR_WAIT) == APR_CHILD_NOTDONE); + } + fprintf(stdout, "Network test completed.\n"); + + return 1; +} + +int main(int argc, char *argv[]) +{ + apr_pool_t *context = NULL; + + fprintf(stdout, "Initializing........."); + if (apr_initialize() != APR_SUCCESS) { + fprintf(stderr, "Something went wrong\n"); + exit(-1); + } + fprintf(stdout, "OK\n"); + atexit(apr_terminate); + + fprintf(stdout, "Creating context......."); + if (apr_pool_create(&context, NULL) != APR_SUCCESS) { + fprintf(stderr, "Could not create context\n"); + exit(-1); + } + fprintf(stdout, "OK\n"); + + fprintf(stdout, "This test relies on the process test working. Please\n"); + fprintf(stdout, "run that test first, and only run this test when it\n"); + fprintf(stdout, "completes successfully. Alternatively, you could run\n"); + fprintf(stdout, "server and client by yourself.\n"); + run_basic_test(context); + run_sendfile(context, 0); + run_sendfile(context, 1); + run_sendfile(context, 2); + + return 0; +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/testsockets.c b/rubbos/app/httpd-2.0.64/srclib/apr/test/testsockets.c new file mode 100644 index 00000000..a03327a8 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/testsockets.c @@ -0,0 +1,174 @@ +/* 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. + */ + +#include "apr_network_io.h" +#include "apr_errno.h" +#include "apr_general.h" +#include "apr_lib.h" +#include "test_apr.h" + +#if APR_HAVE_IPV6 +#define US "::1" +#define FAMILY APR_INET6 +#else +#define US "127.0.0.1" +#define FAMILY APR_INET +#endif + +#define STRLEN 21 + +static void tcp_socket(CuTest *tc) +{ + apr_status_t rv; + apr_socket_t *sock = NULL; + + rv = apr_socket_create(&sock, APR_INET, SOCK_STREAM, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertPtrNotNull(tc, sock); + apr_socket_close(sock); +} + +static void udp_socket(CuTest *tc) +{ + apr_status_t rv; + apr_socket_t *sock = NULL; + + rv = apr_socket_create(&sock, APR_INET, SOCK_DGRAM, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertPtrNotNull(tc, sock); + apr_socket_close(sock); +} + +static void tcp6_socket(CuTest *tc) +{ +#if APR_HAVE_IPV6 + apr_status_t rv; + apr_socket_t *sock = NULL; + + rv = apr_socket_create(&sock, APR_INET6, SOCK_STREAM, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertPtrNotNull(tc, sock); + apr_socket_close(sock); +#else + CuNotImpl(tc, "IPv6"); +#endif +} + +static void udp6_socket(CuTest *tc) +{ +#if APR_HAVE_IPV6 + apr_status_t rv; + apr_socket_t *sock = NULL; + + rv = apr_socket_create(&sock, APR_INET6, SOCK_DGRAM, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertPtrNotNull(tc, sock); + apr_socket_close(sock); +#else + CuNotImpl(tc, "IPv6"); +#endif +} + +static void sendto_receivefrom(CuTest *tc) +{ + apr_status_t rv; + apr_socket_t *sock = NULL; + apr_socket_t *sock2 = NULL; + char sendbuf[STRLEN] = "APR_INET, SOCK_DGRAM"; + char recvbuf[80]; + char *ip_addr; + apr_port_t fromport; + apr_sockaddr_t *from; + apr_sockaddr_t *to; + apr_size_t len = 30; + + rv = apr_socket_create(&sock, FAMILY, SOCK_DGRAM, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + rv = apr_socket_create(&sock2, FAMILY, SOCK_DGRAM, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + rv = apr_sockaddr_info_get(&to, US, APR_UNSPEC, 7772, 0, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + rv = apr_sockaddr_info_get(&from, US, APR_UNSPEC, 7771, 0, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + rv = apr_socket_bind(sock, to); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + rv = apr_socket_bind(sock2, from); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + len = STRLEN; + rv = apr_socket_sendto(sock2, to, 0, sendbuf, &len); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertIntEquals(tc, STRLEN, len); + + len = 80; + rv = apr_socket_recvfrom(from, sock, 0, recvbuf, &len); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertIntEquals(tc, STRLEN, len); + CuAssertStrEquals(tc, "APR_INET, SOCK_DGRAM", recvbuf); + + apr_sockaddr_ip_get(&ip_addr, from); + apr_sockaddr_port_get(&fromport, from); + CuAssertStrEquals(tc, US, ip_addr); + CuAssertIntEquals(tc, 7771, fromport); + + apr_socket_close(sock); + apr_socket_close(sock2); +} + +static void socket_userdata(CuTest *tc) +{ + apr_socket_t *sock1, *sock2; + apr_status_t rv; + char *data; + const char *key = "GENERICKEY"; + + rv = apr_socket_create(&sock1, AF_INET, SOCK_STREAM, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + rv = apr_socket_create(&sock2, AF_INET, SOCK_STREAM, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + rv = apr_socket_data_set(sock1, "SOCK1", key, NULL); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + rv = apr_socket_data_set(sock2, "SOCK2", key, NULL); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + rv = apr_socket_data_get((void **)&data, key, sock1); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertStrEquals(tc, "SOCK1", data); + rv = apr_socket_data_get((void **)&data, key, sock2); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertStrEquals(tc, "SOCK2", data); +} + +CuSuite *testsockets(void) +{ + CuSuite *suite = CuSuiteNew("Socket Creation"); + + SUITE_ADD_TEST(suite, tcp_socket); + SUITE_ADD_TEST(suite, udp_socket); + + SUITE_ADD_TEST(suite, tcp6_socket); + SUITE_ADD_TEST(suite, udp6_socket); + + SUITE_ADD_TEST(suite, sendto_receivefrom); + + SUITE_ADD_TEST(suite, socket_userdata); + + return suite; +} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/testsockopt.c b/rubbos/app/httpd-2.0.64/srclib/apr/test/testsockopt.c new file mode 100644 index 00000000..40cce1f6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/testsockopt.c @@ -0,0 +1,137 @@ +/* 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. + */ + +#include "apr_network_io.h" +#include "apr_errno.h" +#include "apr_general.h" +#include "apr_lib.h" +#include "test_apr.h" + +static apr_socket_t *sock = NULL; + +static void create_socket(CuTest *tc) +{ + apr_status_t rv; + + rv = apr_socket_create(&sock, APR_INET, SOCK_STREAM, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertPtrNotNull(tc, sock); +} + +static void set_keepalive(CuTest *tc) +{ + apr_status_t rv; + apr_int32_t ck; + + rv = apr_socket_opt_set(sock, APR_SO_KEEPALIVE, 1); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + rv = apr_socket_opt_get(sock, APR_SO_KEEPALIVE, &ck); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertIntEquals(tc, 1, ck); +} + +static void set_debug(CuTest *tc) +{ + apr_status_t rv1, rv2; + apr_int32_t ck; + + /* On some platforms APR_SO_DEBUG can only be set as root; just test + * for get/set consistency of this option. */ + rv1 = apr_socket_opt_set(sock, APR_SO_DEBUG, 1); + rv2 = apr_socket_opt_get(sock, APR_SO_DEBUG, &ck); + apr_assert_success(tc, "get SO_DEBUG option", rv2); + if (APR_STATUS_IS_SUCCESS(rv1)) { + CuAssertIntEquals(tc, 1, ck); + } else { + CuAssertIntEquals(tc, 0, ck); + } +} + +static void remove_keepalive(CuTest *tc) +{ + apr_status_t rv; + apr_int32_t ck; + + rv = apr_socket_opt_get(sock, APR_SO_KEEPALIVE, &ck); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertIntEquals(tc, 1, ck); + + rv = apr_socket_opt_set(sock, APR_SO_KEEPALIVE, 0); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + rv = apr_socket_opt_get(sock, APR_SO_KEEPALIVE, &ck); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertIntEquals(tc, 0, ck); +} + +static void corkable(CuTest *tc) +{ +#if !APR_HAVE_CORKABLE_TCP + CuNotImpl(tc, "TCP isn't corkable"); +#else + apr_status_t rv; + apr_int32_t ck; + + rv = apr_socket_opt_set(sock, APR_TCP_NODELAY, 1); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + rv = apr_socket_opt_get(sock, APR_TCP_NODELAY, &ck); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertIntEquals(tc, 1, ck); + + rv = apr_socket_opt_set(sock, APR_TCP_NOPUSH, 1); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + rv = apr_socket_opt_get(sock, APR_TCP_NOPUSH, &ck); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertIntEquals(tc, 1, ck); + + rv = apr_socket_opt_get(sock, APR_TCP_NODELAY, &ck); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertIntEquals(tc, 0, ck); + + rv = apr_socket_opt_set(sock, APR_TCP_NOPUSH, 0); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + rv = apr_socket_opt_get(sock, APR_TCP_NODELAY, &ck); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertIntEquals(tc, 1, ck); +#endif +} + +static void close_socket(CuTest *tc) +{ + apr_status_t rv; + + rv = apr_socket_close(sock); + CuAssertIntEquals(tc, APR_SUCCESS, rv); +} + +CuSuite *testsockopt(void) +{ + CuSuite *suite = CuSuiteNew("Socket Options"); + + SUITE_ADD_TEST(suite, create_socket); + SUITE_ADD_TEST(suite, set_keepalive); + SUITE_ADD_TEST(suite, set_debug); + SUITE_ADD_TEST(suite, remove_keepalive); + SUITE_ADD_TEST(suite, corkable); + SUITE_ADD_TEST(suite, close_socket); + + return suite; +} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/teststr.c b/rubbos/app/httpd-2.0.64/srclib/apr/test/teststr.c new file mode 100644 index 00000000..b23251d1 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/teststr.c @@ -0,0 +1,307 @@ +/* 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. + */ + +#include "test_apr.h" + +#include +#include +#include +#include + +#include "apr_general.h" +#include "apr_strings.h" +#include "apr_errno.h" + +/* I haven't bothered to check for APR_ENOTIMPL here, AFAIK, all string + * functions exist on all platforms. + */ + +static void test_strtok(CuTest *tc) +{ + struct { + char *input; + char *sep; + } + cases[] = { + { + "", + "Z" + }, + { + " asdf jkl; 77889909 \r\n\1\2\3Z", + " \r\n\3\2\1" + }, + { + NULL, /* but who cares if apr_strtok() segfaults? */ + " \t" + }, +#if 0 /* don't do this... you deserve to segfault */ + { + "a b c ", + NULL + }, +#endif + { + " a b c ", + "" + }, + { + "a b c ", + " " + } + }; + int curtc; + + for (curtc = 0; curtc < sizeof cases / sizeof cases[0]; curtc++) { + char *retval1, *retval2; + char *str1, *str2; + char *state; + + str1 = apr_pstrdup(p, cases[curtc].input); + str2 = apr_pstrdup(p, cases[curtc].input); + + do { + retval1 = apr_strtok(str1, cases[curtc].sep, &state); + retval2 = strtok(str2, cases[curtc].sep); + + if (!retval1) { + CuAssertTrue(tc, retval2 == NULL); + } + else { + CuAssertTrue(tc, retval2 != NULL); + CuAssertStrEquals(tc, retval2, retval1); + } + + str1 = str2 = NULL; /* make sure we pass NULL on subsequent calls */ + } while (retval1); + } +} + +static void snprintf_noNULL(CuTest *tc) +{ + char buff[100]; + char *testing = apr_palloc(p, 10); + + testing[0] = 't'; + testing[1] = 'e'; + testing[2] = 's'; + testing[3] = 't'; + testing[4] = 'i'; + testing[5] = 'n'; + testing[6] = 'g'; + + /* If this test fails, we are going to seg fault. */ + apr_snprintf(buff, sizeof(buff), "%.*s", 7, testing); + CuAssertStrNEquals(tc, buff, testing, 7); +} + +static void snprintf_0NULL(CuTest *tc) +{ + int rv; + + rv = apr_snprintf(NULL, 0, "%sBAR", "FOO"); + CuAssertIntEquals(tc, 6, rv); +} + +static void snprintf_0nonNULL(CuTest *tc) +{ + int rv; + char *buff = "testing"; + + rv = apr_snprintf(buff, 0, "%sBAR", "FOO"); + CuAssertIntEquals(tc, 6, rv); + CuAssert(tc, "buff unmangled", strcmp(buff, "FOOBAR") != 0); +} + +static void snprintf_int64(CuTest *tc) +{ + char buf[100]; + apr_int64_t i = APR_INT64_C(-42); + apr_uint64_t ui = APR_INT64_C(42); /* no APR_UINT64_C */ + apr_uint64_t big = APR_INT64_C(3141592653589793238); + + apr_snprintf(buf, sizeof buf, "%" APR_INT64_T_FMT, i); + CuAssertStrEquals(tc, buf, "-42"); + + apr_snprintf(buf, sizeof buf, "%" APR_UINT64_T_FMT, ui); + CuAssertStrEquals(tc, buf, "42"); + + apr_snprintf(buf, sizeof buf, "%" APR_UINT64_T_FMT, big); + CuAssertStrEquals(tc, buf, "3141592653589793238"); +} + +static void snprintf_underflow(CuTest *tc) +{ + char buf[20]; + int rv; + + rv = apr_snprintf(buf, sizeof buf, "%.2f", (double)0.0001); + CuAssertIntEquals(tc, 4, rv); + CuAssertStrEquals(tc, "0.00", buf); + + rv = apr_snprintf(buf, sizeof buf, "%.2f", (double)0.001); + CuAssertIntEquals(tc, 4, rv); + CuAssertStrEquals(tc, "0.00", buf); + + rv = apr_snprintf(buf, sizeof buf, "%.2f", (double)0.01); + CuAssertIntEquals(tc, 4, rv); + CuAssertStrEquals(tc, "0.01", buf); +} + +static void string_error(CuTest *tc) +{ + char buf[128], *rv; + apr_status_t n; + + buf[0] = '\0'; + rv = apr_strerror(APR_ENOENT, buf, sizeof buf); + CuAssertPtrEquals(tc, buf, rv); + CuAssertTrue(tc, strlen(buf) > 0); + + rv = apr_strerror(APR_TIMEUP, buf, sizeof buf); + CuAssertPtrEquals(tc, buf, rv); + CuAssertStrEquals(tc, "The timeout specified has expired", buf); + + /* throw some randomish numbers at it to check for robustness */ + for (n = 1; n < 1000000; n *= 2) { + apr_strerror(n, buf, sizeof buf); + } +} + +#define SIZE 180000 +static void string_long(CuTest *tc) +{ + char s[SIZE + 1]; + + memset(s, 'A', SIZE); + s[SIZE] = '\0'; + + apr_psprintf(p, "%s", s); +} + +/* ### FIXME: apr.h/apr_strings.h should provide these! */ +#define MY_LLONG_MAX (APR_INT64_C(9223372036854775807)) +#define MY_LLONG_MIN (-MY_LLONG_MAX - APR_INT64_C(1)) + +static void string_strtoi64(CuTest *tc) +{ + static const struct { + int errnum, base; + const char *in, *end; + apr_int64_t result; + } ts[] = { + + /* base 10 tests */ + { 0, 10, "123545", NULL, APR_INT64_C(123545) }, + { 0, 10, " 123545", NULL, APR_INT64_C(123545) }, + { 0, 10, " +123545", NULL, APR_INT64_C(123545) }, + { 0, 10, "-123545", NULL, APR_INT64_C(-123545) }, + { 0, 10, " 00000123545", NULL, APR_INT64_C(123545) }, + { 0, 10, "123545ZZZ", "ZZZ", APR_INT64_C(123545) }, + { 0, 10, " 123545 ", " ", APR_INT64_C(123545) }, + + /* base 16 tests */ + { 0, 16, "1E299", NULL, APR_INT64_C(123545) }, + { 0, 16, "1e299", NULL, APR_INT64_C(123545) }, + { 0, 16, "0x1e299", NULL, APR_INT64_C(123545) }, + { 0, 16, "0X1E299", NULL, APR_INT64_C(123545) }, + { 0, 16, "+1e299", NULL, APR_INT64_C(123545) }, + { 0, 16, "-1e299", NULL, APR_INT64_C(-123545) }, + { 0, 16, " -1e299", NULL, APR_INT64_C(-123545) }, + + /* automatic base detection tests */ + { 0, 0, "123545", NULL, APR_INT64_C(123545) }, + { 0, 0, "0x1e299", NULL, APR_INT64_C(123545) }, + { 0, 0, " 0x1e299", NULL, APR_INT64_C(123545) }, + { 0, 0, "+0x1e299", NULL, APR_INT64_C(123545) }, + { 0, 0, "-0x1e299", NULL, APR_INT64_C(-123545) }, + + /* large number tests */ + { 0, 10, "8589934605", NULL, APR_INT64_C(8589934605) }, + { 0, 10, "-8589934605", NULL, APR_INT64_C(-8589934605) }, + { 0, 16, "0x20000000D", NULL, APR_INT64_C(8589934605) }, + { 0, 16, "-0x20000000D", NULL, APR_INT64_C(-8589934605) }, + { 0, 16, " 0x20000000D", NULL, APR_INT64_C(8589934605) }, + { 0, 16, " 0x20000000D", NULL, APR_INT64_C(8589934605) }, + + /* error cases */ + { ERANGE, 10, "999999999999999999999999999999999", "", MY_LLONG_MAX }, + { ERANGE, 10, "-999999999999999999999999999999999", "", MY_LLONG_MIN }, + +#if 0 + /* C99 doesn't require EINVAL for an invalid range. */ + { EINVAL, 99, "", (void *)-1 /* don't care */, 0 }, +#endif + + /* some strtoll implementations give EINVAL when no conversion + * is performed. */ + { -1 /* don't care */, 10, "zzz", "zzz", APR_INT64_C(0) }, + { -1 /* don't care */, 10, "", NULL, APR_INT64_C(0) } + + }; + int n; + + for (n = 0; n < sizeof(ts)/sizeof(ts[0]); n++) { + char *end = "end ptr not changed"; + apr_int64_t result; + int errnum; + + errno = 0; + result = apr_strtoi64(ts[n].in, &end, ts[n].base); + errnum = errno; + + CuAssert(tc, + apr_psprintf(p, "for '%s': result was %" APR_INT64_T_FMT + " not %" APR_INT64_T_FMT, ts[n].in, + result, ts[n].result), + result == ts[n].result); + + if (ts[n].errnum != -1) { + CuAssert(tc, + apr_psprintf(p, "for '%s': errno was %d not %d", ts[n].in, + errnum, ts[n].errnum), + ts[n].errnum == errnum); + } + + if (ts[n].end == NULL) { + /* end must point to NUL terminator of .in */ + CuAssertPtrEquals(tc, ts[n].in + strlen(ts[n].in), end); + } else if (ts[n].end != (void *)-1) { + CuAssert(tc, + apr_psprintf(p, "for '%s', end was '%s' not '%s'", + ts[n].in, end, ts[n].end), + strcmp(ts[n].end, end) == 0); + } + } +} + +CuSuite *teststr(void) +{ + CuSuite *suite = CuSuiteNew("Strings"); + + SUITE_ADD_TEST(suite, snprintf_0NULL); + SUITE_ADD_TEST(suite, snprintf_0nonNULL); + SUITE_ADD_TEST(suite, snprintf_noNULL); + SUITE_ADD_TEST(suite, snprintf_int64); + SUITE_ADD_TEST(suite, snprintf_underflow); + SUITE_ADD_TEST(suite, test_strtok); + SUITE_ADD_TEST(suite, string_error); + SUITE_ADD_TEST(suite, string_long); + SUITE_ADD_TEST(suite, string_strtoi64); + + return suite; +} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/testtable.c b/rubbos/app/httpd-2.0.64/srclib/apr/test/testtable.c new file mode 100644 index 00000000..60123db0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/testtable.c @@ -0,0 +1,168 @@ +/* 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. + */ + +#include "test_apr.h" +#include "apr.h" +#include "apr_strings.h" +#include "apr_general.h" +#include "apr_pools.h" +#include "apr_tables.h" +#if APR_HAVE_STDIO_H +#include +#endif +#if APR_HAVE_STDLIB_H +#include +#endif +#if APR_HAVE_STRING_H +#include +#endif + +static apr_table_t *t1 = NULL; + +static void table_make(CuTest *tc) +{ + t1 = apr_table_make(p, 5); + CuAssertPtrNotNull(tc, t1); +} + +static void table_get(CuTest *tc) +{ + const char *val; + + apr_table_set(t1, "foo", "bar"); + val = apr_table_get(t1, "foo"); + CuAssertStrEquals(tc, val, "bar"); +} + +static void table_set(CuTest *tc) +{ + const char *val; + + apr_table_set(t1, "setkey", "bar"); + apr_table_set(t1, "setkey", "2ndtry"); + val = apr_table_get(t1, "setkey"); + CuAssertStrEquals(tc, val, "2ndtry"); +} + +static void table_getnotthere(CuTest *tc) +{ + const char *val; + + val = apr_table_get(t1, "keynotthere"); + CuAssertPtrEquals(tc, NULL, (void *)val); +} + +static void table_add(CuTest *tc) +{ + const char *val; + + apr_table_add(t1, "addkey", "bar"); + apr_table_add(t1, "addkey", "foo"); + val = apr_table_get(t1, "addkey"); + CuAssertStrEquals(tc, val, "bar"); + +} + +static void table_nelts(CuTest *tc) +{ + const char *val; + apr_table_t *t = apr_table_make(p, 1); + + apr_table_set(t, "abc", "def"); + apr_table_set(t, "def", "abc"); + apr_table_set(t, "foo", "zzz"); + val = apr_table_get(t, "foo"); + CuAssertStrEquals(tc, val, "zzz"); + val = apr_table_get(t, "abc"); + CuAssertStrEquals(tc, val, "def"); + val = apr_table_get(t, "def"); + CuAssertStrEquals(tc, val, "abc"); + CuAssertIntEquals(tc, 3, apr_table_elts(t)->nelts); +} + +static void table_clear(CuTest *tc) +{ + apr_table_clear(t1); + CuAssertIntEquals(tc, 0, apr_table_elts(t1)->nelts); +} + +static void table_unset(CuTest *tc) +{ + const char *val; + apr_table_t *t = apr_table_make(p, 1); + + apr_table_set(t, "a", "1"); + apr_table_set(t, "b", "2"); + apr_table_unset(t, "b"); + CuAssertIntEquals(tc, 1, apr_table_elts(t)->nelts); + val = apr_table_get(t, "a"); + CuAssertStrEquals(tc, val, "1"); + val = apr_table_get(t, "b"); + CuAssertPtrEquals(tc, (void *)val, (void *)NULL); +} + +static void table_overlap(CuTest *tc) +{ + const char *val; + apr_table_t *t1 = apr_table_make(p, 1); + apr_table_t *t2 = apr_table_make(p, 1); + + apr_table_addn(t1, "a", "0"); + apr_table_addn(t1, "g", "7"); + apr_table_addn(t2, "a", "1"); + apr_table_addn(t2, "b", "2"); + apr_table_addn(t2, "c", "3"); + apr_table_addn(t2, "b", "2.0"); + apr_table_addn(t2, "d", "4"); + apr_table_addn(t2, "e", "5"); + apr_table_addn(t2, "b", "2."); + apr_table_addn(t2, "f", "6"); + apr_table_overlap(t1, t2, APR_OVERLAP_TABLES_SET); + + CuAssertIntEquals(tc, apr_table_elts(t1)->nelts, 7); + val = apr_table_get(t1, "a"); + CuAssertStrEquals(tc, val, "1"); + val = apr_table_get(t1, "b"); + CuAssertStrEquals(tc, val, "2."); + val = apr_table_get(t1, "c"); + CuAssertStrEquals(tc, val, "3"); + val = apr_table_get(t1, "d"); + CuAssertStrEquals(tc, val, "4"); + val = apr_table_get(t1, "e"); + CuAssertStrEquals(tc, val, "5"); + val = apr_table_get(t1, "f"); + CuAssertStrEquals(tc, val, "6"); + val = apr_table_get(t1, "g"); + CuAssertStrEquals(tc, val, "7"); +} + +CuSuite *testtable(void) +{ + CuSuite *suite = CuSuiteNew("Table"); + + SUITE_ADD_TEST(suite, table_make); + SUITE_ADD_TEST(suite, table_get); + SUITE_ADD_TEST(suite, table_set); + SUITE_ADD_TEST(suite, table_getnotthere); + SUITE_ADD_TEST(suite, table_add); + SUITE_ADD_TEST(suite, table_nelts); + SUITE_ADD_TEST(suite, table_clear); + SUITE_ADD_TEST(suite, table_unset); + SUITE_ADD_TEST(suite, table_overlap); + + return suite; +} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/testthread.c b/rubbos/app/httpd-2.0.64/srclib/apr/test/testthread.c new file mode 100644 index 00000000..d1d0de22 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/testthread.c @@ -0,0 +1,133 @@ +/* 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. + */ + +#include "apr_thread_proc.h" +#include "apr_errno.h" +#include "apr_general.h" +#include "errno.h" +#include "apr_time.h" +#include "test_apr.h" + +#if APR_HAS_THREADS + +static apr_thread_mutex_t *thread_lock; +static apr_thread_once_t *control = NULL; +static int x = 0; +static int value = 0; + +static apr_thread_t *t1; +static apr_thread_t *t2; +static apr_thread_t *t3; +static apr_thread_t *t4; + +/* just some made up number to check on later */ +static apr_status_t exit_ret_val = 123; + +static void init_func(void) +{ + value++; +} + +static void * APR_THREAD_FUNC thread_func1(apr_thread_t *thd, void *data) +{ + int i; + + apr_thread_once(control, init_func); + + for (i = 0; i < 10000; i++) { + apr_thread_mutex_lock(thread_lock); + x++; + apr_thread_mutex_unlock(thread_lock); + } + apr_thread_exit(thd, exit_ret_val); + return NULL; +} + +static void thread_init(CuTest *tc) +{ + apr_status_t rv; + + rv = apr_thread_once_init(&control, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + rv = apr_thread_mutex_create(&thread_lock, APR_THREAD_MUTEX_DEFAULT, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); +} + +static void create_threads(CuTest *tc) +{ + apr_status_t rv; + + rv = apr_thread_create(&t1, NULL, thread_func1, NULL, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + rv = apr_thread_create(&t2, NULL, thread_func1, NULL, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + rv = apr_thread_create(&t3, NULL, thread_func1, NULL, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + rv = apr_thread_create(&t4, NULL, thread_func1, NULL, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); +} + +static void join_threads(CuTest *tc) +{ + apr_status_t s; + + apr_thread_join(&s, t1); + CuAssertIntEquals(tc, exit_ret_val, s); + apr_thread_join(&s, t2); + CuAssertIntEquals(tc, exit_ret_val, s); + apr_thread_join(&s, t3); + CuAssertIntEquals(tc, exit_ret_val, s); + apr_thread_join(&s, t4); + CuAssertIntEquals(tc, exit_ret_val, s); +} + +static void check_locks(CuTest *tc) +{ + CuAssertIntEquals(tc, 40000, x); +} + +static void check_thread_once(CuTest *tc) +{ + CuAssertIntEquals(tc, 1, value); +} + +#else + +static void threads_not_impl(CuTest *tc) +{ + CuNotImpl(tc, "Threads not implemented on this platform"); +} + +#endif + +CuSuite *testthread(void) +{ + CuSuite *suite = CuSuiteNew("Threads"); + +#if !APR_HAS_THREADS + SUITE_ADD_TEST(suite, threads_not_impl); +#else + SUITE_ADD_TEST(suite, thread_init); + SUITE_ADD_TEST(suite, create_threads); + SUITE_ADD_TEST(suite, join_threads); + SUITE_ADD_TEST(suite, check_locks); + SUITE_ADD_TEST(suite, check_thread_once); +#endif + + return suite; +} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/testtime.c b/rubbos/app/httpd-2.0.64/srclib/apr/test/testtime.c new file mode 100644 index 00000000..1e3e87fa --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/testtime.c @@ -0,0 +1,305 @@ +/* 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. + */ + +#include "apr_time.h" +#include "apr_errno.h" +#include "apr_general.h" +#include "apr_lib.h" +#include "test_apr.h" +#include "apr_strings.h" +#include + +#define STR_SIZE 45 + +/* The time value is used throughout the tests, so just make this a global. + * Also, we need a single value that we can test for the positive tests, so + * I chose the number below, it corresponds to: + * 2002-08-14 12:05:36.186711 -25200 [257 Sat]. + * Which happens to be when I wrote the new tests. + */ +static apr_time_t now = APR_INT64_C(1032030336186711); + +static char* print_time (apr_pool_t *pool, const apr_time_exp_t *xt) +{ + return apr_psprintf (pool, + "%04d-%02d-%02d %02d:%02d:%02d.%06d %+05d [%d %s]%s", + xt->tm_year + 1900, + xt->tm_mon, + xt->tm_mday, + xt->tm_hour, + xt->tm_min, + xt->tm_sec, + xt->tm_usec, + xt->tm_gmtoff, + xt->tm_yday + 1, + apr_day_snames[xt->tm_wday], + (xt->tm_isdst ? " DST" : "")); +} + + +static void test_now(CuTest *tc) +{ + apr_time_t timediff; + apr_time_t current; + time_t os_now; + + current = apr_time_now(); + time(&os_now); + + timediff = os_now - (current / APR_USEC_PER_SEC); + /* Even though these are called so close together, there is the chance + * that the time will be slightly off, so accept anything between -1 and + * 1 second. + */ + CuAssert(tc, "apr_time and OS time do not agree", + (timediff > -2) && (timediff < 2)); +} + +static void test_gmtstr(CuTest *tc) +{ + apr_status_t rv; + apr_time_exp_t xt; + + rv = apr_time_exp_gmt(&xt, now); + if (rv == APR_ENOTIMPL) { + CuNotImpl(tc, "apr_time_exp_gmt"); + } + CuAssertTrue(tc, rv == APR_SUCCESS); + CuAssertStrEquals(tc, "2002-08-14 19:05:36.186711 +0000 [257 Sat]", + print_time(p, &xt)); +} + +static void test_exp_lt(CuTest *tc) +{ + apr_status_t rv; + apr_time_exp_t xt; + time_t posix_secs = (time_t)apr_time_sec(now); + struct tm *posix_exp = localtime(&posix_secs); + + rv = apr_time_exp_lt(&xt, now); + if (rv == APR_ENOTIMPL) { + CuNotImpl(tc, "apr_time_exp_lt"); + } + CuAssertTrue(tc, rv == APR_SUCCESS); + +#define CHK_FIELD(f) \ + CuAssert(tc, "Mismatch in " #f, posix_exp->f == xt.f) + + CHK_FIELD(tm_sec); + CHK_FIELD(tm_min); + CHK_FIELD(tm_hour); + CHK_FIELD(tm_mday); + CHK_FIELD(tm_mon); + CHK_FIELD(tm_year); + CHK_FIELD(tm_wday); + CHK_FIELD(tm_yday); + CHK_FIELD(tm_isdst); +#undef CHK_FIELD +} + +static void test_exp_get_gmt(CuTest *tc) +{ + apr_status_t rv; + apr_time_exp_t xt; + apr_time_t imp; + apr_int64_t hr_off_64; + + rv = apr_time_exp_gmt(&xt, now); + CuAssertTrue(tc, rv == APR_SUCCESS); + rv = apr_time_exp_get(&imp, &xt); + if (rv == APR_ENOTIMPL) { + CuNotImpl(tc, "apr_time_exp_get"); + } + CuAssertTrue(tc, rv == APR_SUCCESS); + hr_off_64 = (apr_int64_t) xt.tm_gmtoff * APR_USEC_PER_SEC; + CuAssertTrue(tc, now + hr_off_64 == imp); +} + +static void test_exp_get_lt(CuTest *tc) +{ + apr_status_t rv; + apr_time_exp_t xt; + apr_time_t imp; + apr_int64_t hr_off_64; + + rv = apr_time_exp_lt(&xt, now); + CuAssertTrue(tc, rv == APR_SUCCESS); + rv = apr_time_exp_get(&imp, &xt); + if (rv == APR_ENOTIMPL) { + CuNotImpl(tc, "apr_time_exp_get"); + } + CuAssertTrue(tc, rv == APR_SUCCESS); + hr_off_64 = (apr_int64_t) xt.tm_gmtoff * APR_USEC_PER_SEC; + CuAssertTrue(tc, now + hr_off_64 == imp); +} + +static void test_imp_gmt(CuTest *tc) +{ + apr_status_t rv; + apr_time_exp_t xt; + apr_time_t imp; + + rv = apr_time_exp_gmt(&xt, now); + CuAssertTrue(tc, rv == APR_SUCCESS); + rv = apr_time_exp_gmt_get(&imp, &xt); + if (rv == APR_ENOTIMPL) { + CuNotImpl(tc, "apr_time_exp_gmt_get"); + } + CuAssertTrue(tc, rv == APR_SUCCESS); + CuAssertTrue(tc, now == imp); +} + +static void test_rfcstr(CuTest *tc) +{ + apr_status_t rv; + char str[STR_SIZE]; + + rv = apr_rfc822_date(str, now); + if (rv == APR_ENOTIMPL) { + CuNotImpl(tc, "apr_rfc822_date"); + } + CuAssertTrue(tc, rv == APR_SUCCESS); + CuAssertStrEquals(tc, "Sat, 14 Sep 2002 19:05:36 GMT", str); +} + +static void test_ctime(CuTest *tc) +{ + apr_status_t rv; + char apr_str[STR_SIZE]; + char libc_str[STR_SIZE]; + time_t posix_sec = (time_t)apr_time_sec(now); + + rv = apr_ctime(apr_str, now); + if (rv == APR_ENOTIMPL) { + CuNotImpl(tc, "apr_ctime"); + } + CuAssertTrue(tc, rv == APR_SUCCESS); + strcpy(libc_str, ctime(&posix_sec)); + *strchr(libc_str, '\n') = '\0'; + + CuAssertStrEquals(tc, libc_str, apr_str); +} + +static void test_strftime(CuTest *tc) +{ + apr_status_t rv; + apr_time_exp_t xt; + char *str = NULL; + apr_size_t sz; + + rv = apr_time_exp_gmt(&xt, now); + str = apr_palloc(p, STR_SIZE + 1); + rv = apr_strftime(str, &sz, STR_SIZE, "%R %A %d %B %Y", &xt); + if (rv == APR_ENOTIMPL) { + CuNotImpl(tc, "apr_strftime"); + } + CuAssertTrue(tc, rv == APR_SUCCESS); + CuAssertStrEquals(tc, "19:05 Saturday 14 September 2002", str); +} + +static void test_strftimesmall(CuTest *tc) +{ + apr_status_t rv; + apr_time_exp_t xt; + char str[STR_SIZE]; + apr_size_t sz; + + rv = apr_time_exp_gmt(&xt, now); + rv = apr_strftime(str, &sz, STR_SIZE, "%T", &xt); + if (rv == APR_ENOTIMPL) { + CuNotImpl(tc, "apr_strftime"); + } + CuAssertTrue(tc, rv == APR_SUCCESS); + CuAssertStrEquals(tc, "19:05:36", str); +} + +static void test_exp_tz(CuTest *tc) +{ + apr_status_t rv; + apr_time_exp_t xt; + apr_int32_t hr_off = -5 * 3600; /* 5 hours in seconds */ + + rv = apr_time_exp_tz(&xt, now, hr_off); + if (rv == APR_ENOTIMPL) { + CuNotImpl(tc, "apr_time_exp_tz"); + } + CuAssertTrue(tc, rv == APR_SUCCESS); + CuAssertTrue(tc, (xt.tm_usec == 186711) && + (xt.tm_sec == 36) && + (xt.tm_min == 5) && + (xt.tm_hour == 14) && + (xt.tm_mday == 14) && + (xt.tm_mon == 8) && + (xt.tm_year == 102) && + (xt.tm_wday == 6) && + (xt.tm_yday == 256)); +} + +static void test_strftimeoffset(CuTest *tc) +{ + apr_status_t rv; + apr_time_exp_t xt; + char str[STR_SIZE]; + apr_size_t sz; + apr_int32_t hr_off = -5 * 3600; /* 5 hours in seconds */ + + apr_time_exp_tz(&xt, now, hr_off); + rv = apr_strftime(str, &sz, STR_SIZE, "%T", &xt); + if (rv == APR_ENOTIMPL) { + CuNotImpl(tc, "apr_strftime"); + } + CuAssertTrue(tc, rv == APR_SUCCESS); +} + +/* 0.9.4 and earlier rejected valid dates in 2038 */ +static void test_2038(CuTest *tc) +{ + apr_time_exp_t xt; + apr_time_t t; + + /* 2038-01-19T03:14:07.000000Z */ + xt.tm_year = 138; + xt.tm_mon = 0; + xt.tm_mday = 19; + xt.tm_hour = 3; + xt.tm_min = 14; + xt.tm_sec = 7; + + apr_assert_success(tc, "explode January 19th, 2038", + apr_time_exp_get(&t, &xt)); +} + +CuSuite *testtime(void) +{ + CuSuite *suite = CuSuiteNew("Time"); + + SUITE_ADD_TEST(suite, test_now); + SUITE_ADD_TEST(suite, test_gmtstr); + SUITE_ADD_TEST(suite, test_exp_lt); + SUITE_ADD_TEST(suite, test_exp_get_gmt); + SUITE_ADD_TEST(suite, test_exp_get_lt); + SUITE_ADD_TEST(suite, test_imp_gmt); + SUITE_ADD_TEST(suite, test_rfcstr); + SUITE_ADD_TEST(suite, test_ctime); + SUITE_ADD_TEST(suite, test_strftime); + SUITE_ADD_TEST(suite, test_strftimesmall); + SUITE_ADD_TEST(suite, test_exp_tz); + SUITE_ADD_TEST(suite, test_strftimeoffset); + SUITE_ADD_TEST(suite, test_2038); + + return suite; +} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/testud.c b/rubbos/app/httpd-2.0.64/srclib/apr/test/testud.c new file mode 100644 index 00000000..3b62cb5d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/testud.c @@ -0,0 +1,91 @@ +/* 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. + */ + +#include +#include +#include "apr_file_io.h" +#include "apr_errno.h" +#include "apr_general.h" +#include "apr_lib.h" +#include "apr_strings.h" +#include "test_apr.h" + +static apr_pool_t *pool; +static char *testdata; +static int cleanup_called = 0; + +static apr_status_t string_cleanup(void *data) +{ + cleanup_called = 1; + return APR_SUCCESS; +} + +static void set_userdata(CuTest *tc) +{ + apr_status_t rv; + + rv = apr_pool_userdata_set(testdata, "TEST", string_cleanup, pool); + CuAssertIntEquals(tc, rv, APR_SUCCESS); +} + +static void get_userdata(CuTest *tc) +{ + apr_status_t rv; + char *retdata; + + rv = apr_pool_userdata_get((void **)&retdata, "TEST", pool); + CuAssertIntEquals(tc, rv, APR_SUCCESS); + CuAssertStrEquals(tc, retdata, testdata); +} + +static void get_nonexistkey(CuTest *tc) +{ + apr_status_t rv; + char *retdata; + + rv = apr_pool_userdata_get((void **)&retdata, "DOESNTEXIST", pool); + CuAssertIntEquals(tc, rv, APR_SUCCESS); + CuAssertPtrEquals(tc, retdata, NULL); +} + +static void post_pool_clear(CuTest *tc) +{ + apr_status_t rv; + char *retdata; + + rv = apr_pool_userdata_get((void **)&retdata, "DOESNTEXIST", pool); + CuAssertIntEquals(tc, rv, APR_SUCCESS); + CuAssertPtrEquals(tc, retdata, NULL); +} + +CuSuite *testud(void) +{ + CuSuite *suite = CuSuiteNew("User Data"); + + apr_pool_create(&pool, p); + testdata = apr_pstrdup(pool, "This is a test\n"); + + SUITE_ADD_TEST(suite, set_userdata); + SUITE_ADD_TEST(suite, get_userdata); + SUITE_ADD_TEST(suite, get_nonexistkey); + + apr_pool_clear(pool); + + SUITE_ADD_TEST(suite, post_pool_clear); + + return suite; +} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/testuser.c b/rubbos/app/httpd-2.0.64/srclib/apr/test/testuser.c new file mode 100644 index 00000000..6cfeb61d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/testuser.c @@ -0,0 +1,171 @@ +/* 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. + */ + +#include "test_apr.h" +#include "apr_errno.h" +#include "apr_general.h" +#include "apr_user.h" + +#if APR_HAS_USER +static void uid_current(CuTest *tc) +{ + apr_uid_t uid; + apr_gid_t gid; + apr_status_t rv; + + rv = apr_uid_current(&uid, &gid, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); +} + +static void username(CuTest *tc) +{ + apr_uid_t uid; + apr_gid_t gid; + apr_uid_t retreived_uid; + apr_gid_t retreived_gid; + apr_status_t rv; + char *uname = NULL; + + rv = apr_uid_current(&uid, &gid, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + rv = apr_uid_name_get(&uname, uid, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertPtrNotNull(tc, uname); + + rv = apr_uid_get(&retreived_uid, &retreived_gid, uname, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + CuAssertIntEquals(tc, APR_SUCCESS, apr_uid_compare(uid, retreived_uid)); +#ifdef WIN32 + /* ### this fudge was added for Win32 but makes the test return NotImpl + * on Unix if run as root, when !gid is also true. */ + if (!gid || !retreived_gid) { + /* The function had no way to recover the gid (this would have been + * an ENOTIMPL if apr_uid_ functions didn't try to double-up and + * also return apr_gid_t values, which was bogus. + */ + if (!gid) { + CuNotImpl(tc, "Groups from apr_uid_current"); + } + else { + CuNotImpl(tc, "Groups from apr_uid_get"); + } + } + else { +#endif + CuAssertIntEquals(tc, APR_SUCCESS, apr_gid_compare(gid, retreived_gid)); +#ifdef WIN32 + } +#endif +} + +static void groupname(CuTest *tc) +{ + apr_uid_t uid; + apr_gid_t gid; + apr_gid_t retreived_gid; + apr_status_t rv; + char *gname = NULL; + + rv = apr_uid_current(&uid, &gid, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + rv = apr_gid_name_get(&gname, gid, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + CuAssertPtrNotNull(tc, gname); + + rv = apr_gid_get(&retreived_gid, gname, p); + CuAssertIntEquals(tc, APR_SUCCESS, rv); + + CuAssertIntEquals(tc, APR_SUCCESS, apr_gid_compare(gid, retreived_gid)); +} + +#ifndef WIN32 + +static void fail_userinfo(CuTest *tc) +{ + apr_uid_t uid; + apr_gid_t gid; + apr_status_t rv; + char *tmp; + + errno = 0; + gid = uid = 9999999; + tmp = NULL; + rv = apr_uid_name_get(&tmp, uid, p); + CuAssert(tc, "apr_uid_name_get should fail or " + "return a user name", + rv != APR_SUCCESS || tmp != NULL); + + errno = 0; + tmp = NULL; + rv = apr_gid_name_get(&tmp, gid, p); + CuAssert(tc, "apr_gid_name_get should fail or " + "return a group name", + rv != APR_SUCCESS || tmp != NULL); + + gid = 424242; + errno = 0; + rv = apr_gid_get(&gid, "I_AM_NOT_A_GROUP", p); + CuAssert(tc, "apr_gid_get should fail or " + "set a group number", + rv != APR_SUCCESS || gid == 424242); + + gid = uid = 424242; + errno = 0; + rv = apr_uid_get(&uid, &gid, "I_AM_NOT_A_USER", p); + CuAssert(tc, "apr_gid_get should fail or " + "set a user and group number", + rv != APR_SUCCESS || uid == 424242 || gid == 4242442); + + errno = 0; + tmp = NULL; + rv = apr_uid_homepath_get(&tmp, "I_AM_NOT_A_USER", p); + CuAssert(tc, "apr_uid_homepath_get should fail or " + "set a path name", + rv != APR_SUCCESS || tmp != NULL); +} + +#else +static void fail_userinfo(CuTest *tc) +{ + CuNotImpl(tc, "Intregal uid/gid not present on this platform"); +} +#endif + +#else +static void users_not_impl(CuTest *tc) +{ + CuNotImpl(tc, "Users not implemented on this platform"); +} +#endif + +CuSuite *testuser(void) +{ + CuSuite *suite = CuSuiteNew("Users"); + +#if !APR_HAS_USER + SUITE_ADD_TEST(suite, users_not_impl); +#else + SUITE_ADD_TEST(suite, uid_current); + SUITE_ADD_TEST(suite, username); + SUITE_ADD_TEST(suite, groupname); + SUITE_ADD_TEST(suite, fail_userinfo); +#endif + + return suite; +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/test/testvsn.c b/rubbos/app/httpd-2.0.64/srclib/apr/test/testvsn.c new file mode 100644 index 00000000..f04f1587 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/test/testvsn.c @@ -0,0 +1,49 @@ +/* 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. + */ + +#include + +#include "test_apr.h" +#include "apr_version.h" +#include "apr_general.h" + + +static void test_strings(CuTest *tc) +{ + CuAssertStrEquals(tc, APR_VERSION_STRING, apr_version_string()); +} + +static void test_ints(CuTest *tc) +{ + apr_version_t vsn; + + apr_version(&vsn); + + CuAssertIntEquals(tc, APR_MAJOR_VERSION, vsn.major); + CuAssertIntEquals(tc, APR_MINOR_VERSION, vsn.minor); + CuAssertIntEquals(tc, APR_PATCH_VERSION, vsn.patch); +} + +CuSuite *testvsn(void) +{ + CuSuite *suite = CuSuiteNew("Versioning"); + + SUITE_ADD_TEST(suite, test_strings); + SUITE_ADD_TEST(suite, test_ints); + + return suite; +} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/beos/Makefile.in b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/beos/Makefile.in new file mode 100644 index 00000000..5a411815 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/beos/Makefile.in @@ -0,0 +1,25 @@ +srcdir = @srcdir@ +VPATH = @srcdir@ + +TARGETS = \ + proc.lo \ + thread.lo \ + threadpriv.lo \ + threadproc_common.lo \ + apr_proc_stub + +# bring in rules.mk for standard functionality +@INCLUDE_RULES@ + +INCDIR=../../include +OSDIR=$(INCDIR)/arch/@OSDIR@ +DEFOSDIR=$(INCDIR)/arch/@DEFAULT_OSDIR@ +INCLUDES=-I$(INCDIR) -I$(INCDIR)/arch -I$(OSDIR) -I$(DEFOSDIR) + +CLEAN_TARGETS = apr_proc_stub /boot/home/config/bin/apr_proc_stub + +apr_proc_stub: + $(CC) $(srcdir)/apr_proc_stub.c \ + && cp apr_proc_stub /boot/home/config/bin + +# DO NOT REMOVE diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/beos/apr_proc_stub.c b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/beos/apr_proc_stub.c new file mode 100644 index 00000000..011d793e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/beos/apr_proc_stub.c @@ -0,0 +1,76 @@ +/* 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. + */ + +#include +#include +#include +#include + +struct pipefd { + int in; + int out; + int err; +}; + +int main(int argc, char *argv[]) { +/* we expect the following... + * + * argv[0] = this stub + * argv[1] = directory to run in... + * argv[2] = progname to execute + * rest of arguments to be passed to program + */ + char *progname = argv[2]; + char *directory = argv[1]; + struct pipefd *pfd; + thread_id sender; + void *buffer; + char ** newargs; + int i = 0; + + newargs = (char**)malloc(sizeof(char*) * (argc - 1)); + + buffer = (void*)malloc(sizeof(struct pipefd)); + /* this will block until we get the data */ + receive_data(&sender, buffer, sizeof(struct pipefd)); + pfd = (struct pipefd*)buffer; + + if (pfd->in > STDERR_FILENO) { + if (dup2(pfd->in, STDIN_FILENO) != STDIN_FILENO) return (-1); + close (pfd->in); + } + if (pfd->out > STDERR_FILENO) { + if (dup2(pfd->out, STDOUT_FILENO) != STDOUT_FILENO) return (-1); + close (pfd->out); + } + if (pfd->err > STDERR_FILENO) { + if (dup2(pfd->err, STDERR_FILENO) != STDERR_FILENO) return (-1); + close (pfd->err); + } + + for (i=3;i<=argc;i++){ + newargs[i-3] = argv[i]; + } + + /* tell the caller we're OK to start */ + send_data(sender,1,NULL,0); + + if (directory != NULL) + chdir(directory); + execve (progname, newargs, environ); + + return (-1); +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/beos/proc.c b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/beos/proc.c new file mode 100644 index 00000000..776b15ec --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/beos/proc.c @@ -0,0 +1,371 @@ +/* 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. + */ + +#include "apr_arch_threadproc.h" +#include "apr_strings.h" + +struct send_pipe { + int in; + int out; + int err; +}; + +APR_DECLARE(apr_status_t) apr_procattr_create(apr_procattr_t **new, apr_pool_t *pool) +{ + (*new) = (apr_procattr_t *)apr_palloc(pool, + sizeof(apr_procattr_t)); + + if ((*new) == NULL) { + return APR_ENOMEM; + } + (*new)->pool = pool; + (*new)->parent_in = NULL; + (*new)->child_in = NULL; + (*new)->parent_out = NULL; + (*new)->child_out = NULL; + (*new)->parent_err = NULL; + (*new)->child_err = NULL; + (*new)->currdir = NULL; + (*new)->cmdtype = APR_PROGRAM; + (*new)->detached = 0; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_procattr_io_set(apr_procattr_t *attr, apr_int32_t in, + apr_int32_t out, apr_int32_t err) +{ + apr_status_t status; + if (in != 0) { + if ((status = apr_file_pipe_create(&attr->child_in, &attr->parent_in, + attr->pool)) != APR_SUCCESS) { + return status; + } + switch (in) { + case APR_FULL_BLOCK: + apr_file_pipe_timeout_set(attr->child_in, -1); + apr_file_pipe_timeout_set(attr->parent_in, -1); + break; + case APR_PARENT_BLOCK: + apr_file_pipe_timeout_set(attr->child_in, -1); + break; + case APR_CHILD_BLOCK: + apr_file_pipe_timeout_set(attr->parent_in, -1); + break; + default: + break; + } + } + if (out) { + if ((status = apr_file_pipe_create(&attr->parent_out, &attr->child_out, + attr->pool)) != APR_SUCCESS) { + return status; + } + switch (out) { + case APR_FULL_BLOCK: + apr_file_pipe_timeout_set(attr->child_out, -1); + apr_file_pipe_timeout_set(attr->parent_out, -1); + break; + case APR_PARENT_BLOCK: + apr_file_pipe_timeout_set(attr->child_out, -1); + break; + case APR_CHILD_BLOCK: + apr_file_pipe_timeout_set(attr->parent_out, -1); + break; + default: + break; + } + } + if (err) { + if ((status = apr_file_pipe_create(&attr->parent_err, &attr->child_err, + attr->pool)) != APR_SUCCESS) { + return status; + } + switch (err) { + case APR_FULL_BLOCK: + apr_file_pipe_timeout_set(attr->child_err, -1); + apr_file_pipe_timeout_set(attr->parent_err, -1); + break; + case APR_PARENT_BLOCK: + apr_file_pipe_timeout_set(attr->child_err, -1); + break; + case APR_CHILD_BLOCK: + apr_file_pipe_timeout_set(attr->parent_err, -1); + break; + default: + break; + } + } + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_procattr_dir_set(apr_procattr_t *attr, + const char *dir) +{ + char * cwd; + if (dir[0] != '/') { + cwd = (char*)malloc(sizeof(char) * PATH_MAX); + getcwd(cwd, PATH_MAX); + attr->currdir = (char *)apr_pstrcat(attr->pool, cwd, "/", dir, NULL); + free(cwd); + } else { + attr->currdir = (char *)apr_pstrdup(attr->pool, dir); + } + if (attr->currdir) { + return APR_SUCCESS; + } + return APR_ENOMEM; +} + +APR_DECLARE(apr_status_t) apr_procattr_cmdtype_set(apr_procattr_t *attr, + apr_cmdtype_e cmd) +{ + attr->cmdtype = cmd; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_procattr_detach_set(apr_procattr_t *attr, apr_int32_t detach) +{ + attr->detached = detach; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_proc_fork(apr_proc_t *proc, apr_pool_t *pool) +{ + int pid; + + if ((pid = fork()) < 0) { + return errno; + } + else if (pid == 0) { + proc->pid = pid; + proc->in = NULL; + proc->out = NULL; + proc->err = NULL; + return APR_INCHILD; + } + proc->pid = pid; + proc->in = NULL; + proc->out = NULL; + proc->err = NULL; + return APR_INPARENT; +} + +APR_DECLARE(apr_status_t) apr_procattr_child_errfn_set(apr_procattr_t *attr, + apr_child_errfn_t *errfn) +{ + /* won't ever be called on this platform, so don't save the function pointer */ + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_procattr_error_check_set(apr_procattr_t *attr, + apr_int32_t chk) +{ + /* won't ever be used on this platform, so don't save the flag */ + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_procattr_addrspace_set(apr_procattr_t *attr, + apr_int32_t addrspace) +{ + /* won't ever be used on this platform, so don't save the flag */ + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_proc_create(apr_proc_t *new, const char *progname, + const char * const *args, + const char * const *env, + apr_procattr_t *attr, apr_pool_t *pool) +{ + int i=0,nargs=0; + char **newargs = NULL; + thread_id newproc, sender; + struct send_pipe *sp; + char * dir = NULL; + + sp = (struct send_pipe *)apr_palloc(pool, sizeof(struct send_pipe)); + + new->in = attr->parent_in; + new->err = attr->parent_err; + new->out = attr->parent_out; + sp->in = attr->child_in ? attr->child_in->filedes : -1; + sp->out = attr->child_out ? attr->child_out->filedes : -1; + sp->err = attr->child_err ? attr->child_err->filedes : -1; + + i = 0; + while (args && args[i]) { + i++; + } + + newargs = (char**)malloc(sizeof(char *) * (i + 4)); + newargs[0] = strdup("/boot/home/config/bin/apr_proc_stub"); + if (attr->currdir == NULL) { + /* we require the directory , so use a temp. variable */ + dir = malloc(sizeof(char) * PATH_MAX); + getcwd(dir, PATH_MAX); + newargs[1] = strdup(dir); + free(dir); + } else { + newargs[1] = strdup(attr->currdir); + } + newargs[2] = strdup(progname); + i=0;nargs = 3; + + while (args && args[i]) { + newargs[nargs] = strdup(args[i]); + i++;nargs++; + } + newargs[nargs] = NULL; + + /* ### we should be looking at attr->cmdtype in here... */ + + newproc = load_image(nargs, (const char**)newargs, (const char**)env); + + /* load_image copies the data so now we can free it... */ + while (--nargs >= 0) + free (newargs[nargs]); + free(newargs); + + if ( newproc < B_NO_ERROR) { + return errno; + } + + resume_thread(newproc); + + if (attr->child_in) { + apr_file_close(attr->child_in); + } + if (attr->child_out) { + apr_file_close(attr->child_out); + } + if (attr->child_err) { + apr_file_close(attr->child_err); + } + + send_data(newproc, 0, (void*)sp, sizeof(struct send_pipe)); + new->pid = newproc; + + /* before we go charging on we need the new process to get to a + * certain point. When it gets there it'll let us know and we + * can carry on. */ + receive_data(&sender, (void*)NULL,0); + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_proc_wait_all_procs(apr_proc_t *proc, + int *exitcode, + apr_exit_why_e *exitwhy, + apr_wait_how_e waithow, + apr_pool_t *p) +{ + proc->pid = -1; + return apr_proc_wait(proc, exitcode, exitwhy, waithow); +} + +APR_DECLARE(apr_status_t) apr_proc_wait(apr_proc_t *proc, + int *exitcode, + apr_exit_why_e *exitwhy, + apr_wait_how_e waithow) +{ + pid_t pstatus; + int waitpid_options = WUNTRACED; + int exit_int; + int ignore; + apr_exit_why_e ignorewhy; + + if (exitcode == NULL) { + exitcode = &ignore; + } + if (exitwhy == NULL) { + exitwhy = &ignorewhy; + } + + if (waithow != APR_WAIT) { + waitpid_options |= WNOHANG; + } + + if ((pstatus = waitpid(proc->pid, &exit_int, waitpid_options)) > 0) { + proc->pid = pstatus; + if (WIFEXITED(exit_int)) { + *exitwhy = APR_PROC_EXIT; + *exitcode = WEXITSTATUS(exit_int); + } + else if (WIFSIGNALED(exit_int)) { + *exitwhy = APR_PROC_SIGNAL; + *exitcode = WTERMSIG(exit_int); + } + else { + /* unexpected condition */ + return APR_EGENERAL; + } + return APR_CHILD_DONE; + } + else if (pstatus == 0) { + return APR_CHILD_NOTDONE; + } + return errno; +} + +APR_DECLARE(apr_status_t) apr_procattr_child_in_set(apr_procattr_t *attr, apr_file_t *child_in, + apr_file_t *parent_in) +{ + if (attr->child_in == NULL && attr->parent_in == NULL) + apr_file_pipe_create(&attr->child_in, &attr->parent_in, attr->pool); + + if (child_in != NULL) + apr_file_dup(&attr->child_in, child_in, attr->pool); + + if (parent_in != NULL) + apr_file_dup(&attr->parent_in, parent_in, attr->pool); + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_procattr_child_out_set(apr_procattr_t *attr, apr_file_t *child_out, + apr_file_t *parent_out) +{ + if (attr->child_out == NULL && attr->parent_out == NULL) + apr_file_pipe_create(&attr->child_out, &attr->parent_out, attr->pool); + + if (child_out != NULL) + apr_file_dup(&attr->child_out, child_out, attr->pool); + + if (parent_out != NULL) + apr_file_dup(&attr->parent_out, parent_out, attr->pool); + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_procattr_child_err_set(apr_procattr_t *attr, apr_file_t *child_err, + apr_file_t *parent_err) +{ + if (attr->child_err == NULL && attr->parent_err == NULL) + apr_file_pipe_create(&attr->child_err, &attr->parent_err, attr->pool); + + if (child_err != NULL) + apr_file_dup(&attr->child_err, child_err, attr->pool); + + if (parent_err != NULL) + apr_file_dup(&attr->parent_err, parent_err, attr->pool); + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_procattr_limit_set(apr_procattr_t *attr, apr_int32_t what, + void *limit) +{ + return APR_ENOTIMPL; +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/beos/thread.c b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/beos/thread.c new file mode 100644 index 00000000..f408f3a9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/beos/thread.c @@ -0,0 +1,227 @@ +/* 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. + */ + +#include "apr_arch_threadproc.h" +#include "apr_portable.h" + +APR_DECLARE(apr_status_t) apr_threadattr_create(apr_threadattr_t **new, apr_pool_t *pool) +{ + (*new) = (apr_threadattr_t *)apr_palloc(pool, + sizeof(apr_threadattr_t)); + + if ((*new) == NULL) { + return APR_ENOMEM; + } + + (*new)->pool = pool; + (*new)->attr = (int32)B_NORMAL_PRIORITY; + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_threadattr_detach_set(apr_threadattr_t *attr, apr_int32_t on) +{ + if (on == 1){ + attr->detached = 1; + } else { + attr->detached = 0; + } + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_threadattr_detach_get(apr_threadattr_t *attr) +{ + if (attr->detached == 1){ + return APR_DETACH; + } + return APR_NOTDETACH; +} + +APR_DECLARE(apr_status_t) apr_threadattr_stacksize_set(apr_threadattr_t *attr, + apr_size_t stacksize) +{ + return APR_ENOTIMPL; +} + +static void *dummy_worker(void *opaque) +{ + apr_thread_t *thd = (apr_thread_t*)opaque; + return thd->func(thd, thd->data); +} + +APR_DECLARE(apr_status_t) apr_thread_create(apr_thread_t **new, apr_threadattr_t *attr, + apr_thread_start_t func, void *data, + apr_pool_t *pool) +{ + int32 temp; + apr_status_t stat; + + (*new) = (apr_thread_t *)apr_palloc(pool, sizeof(apr_thread_t)); + if ((*new) == NULL) { + return APR_ENOMEM; + } + + (*new)->pool = pool; + (*new)->data = data; + (*new)->func = func; + (*new)->exitval = -1; + + /* First we create the new thread...*/ + if (attr) + temp = attr->attr; + else + temp = B_NORMAL_PRIORITY; + + stat = apr_pool_create(&(*new)->pool, pool); + if (stat != APR_SUCCESS) { + return stat; + } + + (*new)->td = spawn_thread((thread_func)dummy_worker, "apr thread", temp, (*new)); + /* Now we try to run it...*/ + if (resume_thread((*new)->td) == B_NO_ERROR) { + return APR_SUCCESS; + } + else { + return errno; + } +} + +APR_DECLARE(apr_os_thread_t) apr_os_thread_current(void) +{ + return find_thread(NULL); +} + +int apr_os_thread_equal(apr_os_thread_t tid1, apr_os_thread_t tid2) +{ + return tid1 == tid2; +} + +APR_DECLARE(apr_status_t) apr_thread_exit(apr_thread_t *thd, apr_status_t retval) +{ + apr_pool_destroy(thd->pool); + thd->exitval = retval; + exit_thread ((status_t)(retval)); + /* This will never be reached... */ + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_thread_join(apr_status_t *retval, apr_thread_t *thd) +{ + status_t rv = 0, ret; + if ((ret = wait_for_thread(thd->td, &rv)) == B_NO_ERROR) { + *retval = rv; + return APR_SUCCESS; + } + else { + /* if we've missed the thread's death, did we set an exit value prior + * to it's demise? If we did return that. + */ + if (thd->exitval != -1) { + *retval = thd->exitval; + return APR_SUCCESS; + } else + return ret; + } +} + +APR_DECLARE(apr_status_t) apr_thread_detach(apr_thread_t *thd) +{ + if (suspend_thread(thd->td) == B_NO_ERROR){ + return APR_SUCCESS; + } + else { + return errno; + } +} + +void apr_thread_yield() +{ +} + +APR_DECLARE(apr_status_t) apr_thread_data_get(void **data, const char *key, apr_thread_t *thread) +{ + return apr_pool_userdata_get(data, key, thread->pool); +} + +APR_DECLARE(apr_status_t) apr_thread_data_set(void *data, const char *key, + apr_status_t (*cleanup) (void *), + apr_thread_t *thread) +{ + return apr_pool_userdata_set(data, key, cleanup, thread->pool); +} + +APR_DECLARE(apr_status_t) apr_os_thread_get(apr_os_thread_t **thethd, apr_thread_t *thd) +{ + *thethd = &thd->td; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_os_thread_put(apr_thread_t **thd, apr_os_thread_t *thethd, + apr_pool_t *pool) +{ + if (pool == NULL) { + return APR_ENOPOOL; + } + if ((*thd) == NULL) { + (*thd) = (apr_thread_t *)apr_pcalloc(pool, sizeof(apr_thread_t)); + (*thd)->pool = pool; + } + (*thd)->td = *thethd; + return APR_SUCCESS; +} + +static apr_status_t thread_once_cleanup(void *vcontrol) +{ + apr_thread_once_t *control = (apr_thread_once_t *)vcontrol; + + if (control->sem) { + release_sem(control->sem); + delete_sem(control->sem); + } + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_thread_once_init(apr_thread_once_t **control, + apr_pool_t *p) +{ + int rc; + *control = (apr_thread_once_t *)apr_pcalloc(p, sizeof(apr_thread_once_t)); + (*control)->hit = 0; /* we haven't done it yet... */ + rc = ((*control)->sem = create_sem(1, "thread_once")); + if (rc != 0) { + return rc; + } + apr_pool_cleanup_register(p, control, thread_once_cleanup, apr_pool_cleanup_null); + return APR_SUCCESS; +} + + + +APR_DECLARE(apr_status_t) apr_thread_once(apr_thread_once_t *control, + void (*func)(void)) +{ + if (!control->hit) { + if (acquire_sem(control->sem) == B_OK) { + control->hit = 1; + func(); + } + } + return APR_SUCCESS; +} + +APR_POOL_IMPLEMENT_ACCESSOR(thread) diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/beos/threadpriv.c b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/beos/threadpriv.c new file mode 100644 index 00000000..442235f7 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/beos/threadpriv.c @@ -0,0 +1,180 @@ +/* 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. + */ + +#include "apr_arch_threadproc.h" + +static struct beos_key key_table[BEOS_MAX_DATAKEYS]; +static struct beos_private_data *beos_data[BEOS_MAX_DATAKEYS]; +static sem_id lock; + +APR_DECLARE(apr_status_t) apr_threadkey_private_create(apr_threadkey_t **key, + void (*dest)(void *), apr_pool_t *pool) +{ + (*key) = (apr_threadkey_t *)apr_palloc(pool, sizeof(apr_threadkey_t)); + if ((*key) == NULL) { + return APR_ENOMEM; + } + + (*key)->pool = pool; + + acquire_sem(lock); + for ((*key)->key=0; (*key)->key < BEOS_MAX_DATAKEYS; (*key)->key++){ + if (key_table[(*key)->key].assigned == 0){ + key_table[(*key)->key].assigned = 1; + key_table[(*key)->key].destructor = dest; + release_sem(lock); + return APR_SUCCESS; + } + + } + release_sem(lock); + return APR_ENOMEM; +} + +APR_DECLARE(apr_status_t) apr_threadkey_private_get(void **new, apr_threadkey_t *key) +{ + thread_id tid; + int i, index=0; + tid = find_thread(NULL); + for (i=0;idata){ + /* it's been used */ + if (beos_data[i]->td == tid){ + index = i; + } + } + } + if (index == 0){ + /* no storage for thread so we can't get anything... */ + return APR_ENOMEM; + } + + if ((key->key < BEOS_MAX_DATAKEYS) && (key_table)){ + acquire_sem(key_table[key->key].lock); + if (key_table[key->key].count){ + (*new) = (void*)beos_data[index]->data[key->key]; + } else { + (*new) = NULL; + } + release_sem(key_table[key->key].lock); + } else { + (*new) = NULL; + } + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_threadkey_private_set(void *priv, apr_threadkey_t *key) +{ + thread_id tid; + int i,index = 0, ret = 0; + + tid = find_thread(NULL); + for (i=0; i < BEOS_MAX_DATAKEYS; i++){ + if (beos_data[i]->data){ + if (beos_data[i]->td == tid){index = i;} + } + } + if (index==0){ + /* not yet been allocated */ + for (i=0; i< BEOS_MAX_DATAKEYS; i++){ + if (! beos_data[i]->data){ + /* we'll take this one... */ + index = i; + beos_data[i]->data = (const void **)malloc(sizeof(void *) * BEOS_MAX_DATAKEYS); + memset((void *)beos_data[i]->data, 0, sizeof(void *) * BEOS_MAX_DATAKEYS); + beos_data[i]->count = (int)malloc(sizeof(int)); + beos_data[i]->td = (thread_id)malloc(sizeof(thread_id)); + beos_data[i]->td = tid; + } + } + } + if (index == 0){ + /* we're out of luck.. */ + return APR_ENOMEM; + } + if ((key->key < BEOS_MAX_DATAKEYS) && (key_table)){ + acquire_sem(key_table[key->key].lock); + if (key_table[key->key].count){ + if (beos_data[index]->data[key->key] == NULL){ + if (priv != NULL){ + beos_data[index]->count++; + key_table[key->key].count++; + } + } else { + if (priv == NULL){ + beos_data[index]->count--; + key_table[key->key].count--; + } + } + beos_data[index]->data[key->key] = priv; + ret = 1; + } else { + ret = 0; + } + release_sem(key_table[key->key].lock); + } + if (ret) + return APR_SUCCESS; + return APR_ENOMEM; +} + +APR_DECLARE(apr_status_t) apr_threadkey_private_delete(apr_threadkey_t *key) +{ + if (key->key < BEOS_MAX_DATAKEYS){ + acquire_sem(key_table[key->key].lock); + if (key_table[key->key].count == 1){ + key_table[key->key].destructor = NULL; + key_table[key->key].count = 0; + } + release_sem(key_table[key->key].lock); + } else { + return APR_ENOMEM; + } + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_threadkey_data_get(void **data, const char *key, + apr_threadkey_t *threadkey) +{ + return apr_pool_userdata_get(data, key, threadkey->pool); +} + +APR_DECLARE(apr_status_t) apr_threadkey_data_set(void *data, const char *key, + apr_status_t (*cleanup) (void *), + apr_threadkey_t *threadkey) +{ + return apr_pool_userdata_set(data, key, cleanup, threadkey->pool); +} + +APR_DECLARE(apr_status_t) apr_os_threadkey_get(apr_os_threadkey_t *thekey, apr_threadkey_t *key) +{ + *thekey = key->key; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_os_threadkey_put(apr_threadkey_t **key, + apr_os_threadkey_t *thekey, apr_pool_t *pool) +{ + if (pool == NULL) { + return APR_ENOPOOL; + } + if ((*key) == NULL) { + (*key) = (apr_threadkey_t *)apr_pcalloc(pool, sizeof(apr_threadkey_t)); + (*key)->pool = pool; + } + (*key)->key = *thekey; + return APR_SUCCESS; +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/beos/threadproc_common.c b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/beos/threadproc_common.c new file mode 100644 index 00000000..95e16254 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/beos/threadproc_common.c @@ -0,0 +1,21 @@ +/* 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. + */ + +/* As the signal code is identical, use the unix version to reduce + code duplication */ +#include "../unix/signals.c" +#include "../unix/procsup.c" + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/netware/proc.c b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/netware/proc.c new file mode 100644 index 00000000..684559d0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/netware/proc.c @@ -0,0 +1,438 @@ +/* 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. + */ + +#include "apr_arch_threadproc.h" +#include "apr_arch_file_io.h" +#include "apr_strings.h" +#include "apr_portable.h" + +#include + +apr_status_t apr_netware_proc_cleanup(void *theproc) +{ + apr_proc_t *proc = theproc; + int exit_int; + int waitpid_options = WUNTRACED | WNOHANG; + + if (proc->pid > 0) { + waitpid(proc->pid, &exit_int, waitpid_options); + } + +/* NXVmDestroy(proc->pid); */ + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_procattr_create(apr_procattr_t **new,apr_pool_t *pool) +{ + (*new) = (apr_procattr_t *)apr_pcalloc(pool, sizeof(apr_procattr_t)); + + if ((*new) == NULL) { + return APR_ENOMEM; + } + (*new)->pool = pool; + (*new)->cmdtype = APR_PROGRAM; + /* Default to a current path since NetWare doesn't handle it very well */ + apr_filepath_get(&((*new)->currdir), APR_FILEPATH_NATIVE, pool); + (*new)->detached = 1; + return APR_SUCCESS; + +} + +APR_DECLARE(apr_status_t) apr_procattr_io_set(apr_procattr_t *attr, apr_int32_t in, + apr_int32_t out, apr_int32_t err) +{ + apr_status_t status; + if (in != 0) { + if ((status = apr_file_pipe_create(&attr->child_in, &attr->parent_in, + attr->pool)) != APR_SUCCESS) { + return status; + } + switch (in) { + case APR_FULL_BLOCK: + break; + case APR_PARENT_BLOCK: + apr_file_pipe_timeout_set(attr->child_in, 0); + break; + case APR_CHILD_BLOCK: + apr_file_pipe_timeout_set(attr->parent_in, 0); + break; + default: + apr_file_pipe_timeout_set(attr->child_in, 0); + apr_file_pipe_timeout_set(attr->parent_in, 0); + } + } + if (out) { + if ((status = apr_file_pipe_create(&attr->parent_out, &attr->child_out, + attr->pool)) != APR_SUCCESS) { + return status; + } + switch (out) { + case APR_FULL_BLOCK: + break; + case APR_PARENT_BLOCK: + apr_file_pipe_timeout_set(attr->child_out, 0); + break; + case APR_CHILD_BLOCK: + apr_file_pipe_timeout_set(attr->parent_out, 0); + break; + default: + apr_file_pipe_timeout_set(attr->child_out, 0); + apr_file_pipe_timeout_set(attr->parent_out, 0); + } + } + if (err) { + if ((status = apr_file_pipe_create(&attr->parent_err, &attr->child_err, + attr->pool)) != APR_SUCCESS) { + return status; + } + switch (err) { + case APR_FULL_BLOCK: + break; + case APR_PARENT_BLOCK: + apr_file_pipe_timeout_set(attr->child_err, 0); + break; + case APR_CHILD_BLOCK: + apr_file_pipe_timeout_set(attr->parent_err, 0); + break; + default: + apr_file_pipe_timeout_set(attr->child_err, 0); + apr_file_pipe_timeout_set(attr->parent_err, 0); + } + } + return APR_SUCCESS; +} + + +APR_DECLARE(apr_status_t) apr_procattr_child_in_set(apr_procattr_t *attr, apr_file_t *child_in, + apr_file_t *parent_in) +{ + if (attr->child_in == NULL && attr->parent_in == NULL) + apr_file_pipe_create(&attr->child_in, &attr->parent_in, attr->pool); + + if (child_in != NULL) + apr_file_dup2(attr->child_in, child_in, attr->pool); + + if (parent_in != NULL) + apr_file_dup2(attr->parent_in, parent_in, attr->pool); + + return APR_SUCCESS; +} + + +APR_DECLARE(apr_status_t) apr_procattr_child_out_set(apr_procattr_t *attr, apr_file_t *child_out, + apr_file_t *parent_out) +{ + if (attr->child_out == NULL && attr->parent_out == NULL) + apr_file_pipe_create(&attr->child_out, &attr->parent_out, attr->pool); + + if (child_out != NULL) + apr_file_dup2(attr->child_out, child_out, attr->pool); + + if (parent_out != NULL) + apr_file_dup2(attr->parent_out, parent_out, attr->pool); + + return APR_SUCCESS; +} + + +APR_DECLARE(apr_status_t) apr_procattr_child_err_set(apr_procattr_t *attr, apr_file_t *child_err, + apr_file_t *parent_err) +{ + if (attr->child_err == NULL && attr->parent_err == NULL) + apr_file_pipe_create(&attr->child_err, &attr->parent_err, attr->pool); + + if (child_err != NULL) + apr_file_dup2(attr->child_err, child_err, attr->pool); + + if (parent_err != NULL) + apr_file_dup2(attr->parent_err, parent_err, attr->pool); + + return APR_SUCCESS; +} + + +APR_DECLARE(apr_status_t) apr_procattr_dir_set(apr_procattr_t *attr, + const char *dir) +{ + return apr_filepath_merge(&attr->currdir, NULL, dir, + APR_FILEPATH_NATIVE, attr->pool); +} + +APR_DECLARE(apr_status_t) apr_procattr_cmdtype_set(apr_procattr_t *attr, + apr_cmdtype_e cmd) +{ + /* won't ever be called on this platform, so don't save the flag */ + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_procattr_detach_set(apr_procattr_t *attr, apr_int32_t detach) +{ + attr->detached = detach; + return APR_SUCCESS; +} + +#if APR_HAS_FORK +APR_DECLARE(apr_status_t) apr_proc_fork(apr_proc_t *proc, apr_pool_t *pool) +{ + int pid; + + if ((pid = fork()) < 0) { + return errno; + } + else if (pid == 0) { + proc->pid = pid; + proc->in = NULL; + proc->out = NULL; + proc->err = NULL; + return APR_INCHILD; + } + proc->pid = pid; + proc->in = NULL; + proc->out = NULL; + proc->err = NULL; + return APR_INPARENT; +} +#endif + +static apr_status_t limit_proc(apr_procattr_t *attr) +{ +#if APR_HAVE_STRUCT_RLIMIT && APR_HAVE_SETRLIMIT +#ifdef RLIMIT_CPU + if (attr->limit_cpu != NULL) { + if ((setrlimit(RLIMIT_CPU, attr->limit_cpu)) != 0) { + return errno; + } + } +#endif +#ifdef RLIMIT_NPROC + if (attr->limit_nproc != NULL) { + if ((setrlimit(RLIMIT_NPROC, attr->limit_nproc)) != 0) { + return errno; + } + } +#endif +#if defined(RLIMIT_AS) + if (attr->limit_mem != NULL) { + if ((setrlimit(RLIMIT_AS, attr->limit_mem)) != 0) { + return errno; + } + } +#elif defined(RLIMIT_DATA) + if (attr->limit_mem != NULL) { + if ((setrlimit(RLIMIT_DATA, attr->limit_mem)) != 0) { + return errno; + } + } +#elif defined(RLIMIT_VMEM) + if (attr->limit_mem != NULL) { + if ((setrlimit(RLIMIT_VMEM, attr->limit_mem)) != 0) { + return errno; + } + } +#endif +#else + /* + * Maybe make a note in error_log that setrlimit isn't supported?? + */ + +#endif + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_procattr_child_errfn_set(apr_procattr_t *attr, + apr_child_errfn_t *errfn) +{ + /* won't ever be called on this platform, so don't save the function pointer */ + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_procattr_error_check_set(apr_procattr_t *attr, + apr_int32_t chk) +{ + /* won't ever be used on this platform, so don't save the flag */ + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_procattr_addrspace_set(apr_procattr_t *attr, + apr_int32_t addrspace) +{ + attr->addrspace = addrspace; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_proc_create(apr_proc_t *newproc, + const char *progname, + const char * const *args, + const char * const *env, + apr_procattr_t *attr, + apr_pool_t *pool) +{ + wiring_t wire; + int addr_space; + + wire.infd = attr->child_in ? attr->child_in->filedes : FD_UNUSED; + wire.outfd = attr->child_out ? attr->child_out->filedes : FD_UNUSED; + wire.errfd = attr->child_err ? attr->child_err->filedes : FD_UNUSED; + + newproc->in = attr->parent_in; + newproc->out = attr->parent_out; + newproc->err = attr->parent_err; + + /* attr->detached and PROC_DETACHED do not mean the same thing. attr->detached means + * start the NLM in a separate address space. PROC_DETACHED means don't wait for the + * NLM to unload by calling wait() or waitpid(), just clean up */ + addr_space = PROC_LOAD_SILENT | (attr->addrspace ? 0 : PROC_CURRENT_SPACE); + addr_space |= (attr->detached ? PROC_DETACHED : 0); + + if (attr->currdir) { + char *fullpath = NULL; + apr_status_t rv; + + if ((rv = apr_filepath_merge(&fullpath, attr->currdir, progname, + APR_FILEPATH_NATIVE, pool)) != APR_SUCCESS) { + return rv; + } + progname = fullpath; + } + + if ((newproc->pid = procve(progname, addr_space, (const char**)env, &wire, + NULL, NULL, 0, NULL, (const char **)args)) == -1) { + return errno; + } + + if (attr->child_in) { + apr_pool_cleanup_kill(apr_file_pool_get(attr->child_in), + attr->child_in, apr_unix_file_cleanup); + apr_file_close(attr->child_in); + } + if (attr->child_out) { + apr_pool_cleanup_kill(apr_file_pool_get(attr->child_out), + attr->child_out, apr_unix_file_cleanup); + apr_file_close(attr->child_out); + } + if (attr->child_err) { + apr_pool_cleanup_kill(apr_file_pool_get(attr->child_err), + attr->child_err, apr_unix_file_cleanup); + apr_file_close(attr->child_err); + } + + + apr_pool_cleanup_register(pool, (void *)newproc, apr_netware_proc_cleanup, + apr_pool_cleanup_null); + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_proc_wait_all_procs(apr_proc_t *proc, + int *exitcode, + apr_exit_why_e *exitwhy, + apr_wait_how_e waithow, + apr_pool_t *p) +{ + proc->pid = -1; + return apr_proc_wait(proc, exitcode, exitwhy, waithow); +} + +APR_DECLARE(apr_status_t) apr_proc_wait(apr_proc_t *proc, + int *exitcode, apr_exit_why_e *exitwhy, + apr_wait_how_e waithow) +{ + pid_t pstatus; + int waitpid_options = WUNTRACED; + int exit_int; + int ignore; + apr_exit_why_e ignorewhy; + + if (exitcode == NULL) { + exitcode = &ignore; + } + + if (exitwhy == NULL) { + exitwhy = &ignorewhy; + } + + if (waithow != APR_WAIT) { + waitpid_options |= WNOHANG; + } + + /* If the pid is 0 then the process was started detached. There + is no need to wait since there is nothing to wait for on a + detached process. Starting a process as non-detached and + then calling wait or waitpid could cause the thread to hang. + The reason for this is because NetWare does not have a way + to kill or even signal a process to be killed. Starting + all processes as detached avoids the possibility of a + thread hanging. */ + if (proc->pid == 0) { + *exitwhy = APR_PROC_EXIT; + *exitcode = 0; + return APR_CHILD_DONE; + } + + if ((pstatus = waitpid(proc->pid, &exit_int, waitpid_options)) > 0) { + proc->pid = pstatus; + + if (WIFEXITED(exit_int)) { + *exitwhy = APR_PROC_EXIT; + *exitcode = WEXITSTATUS(exit_int); + } + else if (WIFSIGNALED(exit_int)) { + *exitwhy = APR_PROC_SIGNAL; + *exitcode = WIFTERMSIG(exit_int); + } + else { + /* unexpected condition */ + return APR_EGENERAL; + } + + return APR_CHILD_DONE; + } + else if (pstatus == 0) { + return APR_CHILD_NOTDONE; + } + + return errno; +} + +APR_DECLARE(apr_status_t) apr_procattr_limit_set(apr_procattr_t *attr, apr_int32_t what, + struct rlimit *limit) +{ + switch(what) { + case APR_LIMIT_CPU: +#ifdef RLIMIT_CPU + attr->limit_cpu = limit; + break; +#else + return APR_ENOTIMPL; +#endif + case APR_LIMIT_MEM: +#if defined (RLIMIT_DATA) || defined (RLIMIT_VMEM) || defined(RLIMIT_AS) + attr->limit_mem = limit; + break; +#else + return APR_ENOTIMPL; +#endif + case APR_LIMIT_NPROC: +#ifdef RLIMIT_NPROC + attr->limit_nproc = limit; + break; +#else + return APR_ENOTIMPL; +#endif + } + return APR_SUCCESS; +} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/netware/procsup.c b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/netware/procsup.c new file mode 100644 index 00000000..72fa1d97 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/netware/procsup.c @@ -0,0 +1,102 @@ +/* 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. + */ + +#include "apr_arch_threadproc.h" + +apr_status_t apr_proc_detach(int daemonize) +{ +#if 0 + int x; + pid_t pgrp; + + chdir("/"); +#if !defined(MPE) && !defined(OS2) && !defined(TPF) && !defined(BEOS) +/* Don't detach for MPE because child processes can't survive the death of + the parent. */ + if ((x = fork()) > 0) + exit(0); + else if (x == -1) { + perror("fork"); + fprintf(stderr, "unable to fork new process\n"); + exit(1); /* we can't do anything here, so just exit. */ + } +/* RAISE_SIGSTOP(DETACH);*/ +#endif +#if APR_HAVE_SETSID + if ((pgrp = setsid()) == -1) { + return errno; + } +#elif defined(NEXT) || defined(NEWSOS) + if (setpgrp(0, getpid()) == -1 || (pgrp = getpgrp(0)) == -1) { + return errno; + } +#elif defined(OS2) || defined(TPF) + /* OS/2 don't support process group IDs */ + pgrp = getpid(); +#elif defined(MPE) + /* MPE uses negative pid for process group */ + pgrp = -getpid(); +#else + if ((pgrp = setpgid(0, 0)) == -1) { + return errno; + } +#endif + + /* close out the standard file descriptors */ + if (freopen("/dev/null", "r", stdin) == NULL) { + return errno; + /* continue anyhow -- note we can't close out descriptor 0 because we + * have nothing to replace it with, and if we didn't have a descriptor + * 0 the next file would be created with that value ... leading to + * havoc. + */ + } + if (freopen("/dev/null", "w", stdout) == NULL) { + return errno; + } + /* We are going to reopen this again in a little while to the error + * log file, but better to do it twice and suffer a small performance + * hit for consistancy than not reopen it here. + */ + if (freopen("/dev/null", "w", stderr) == NULL) { + return errno; + } +#endif + return APR_SUCCESS; +} + +#if 0 +#if (!HAVE_WAITPID) +/* From ikluft@amdahl.com + * this is not ideal but it works for SVR3 variants + * Modified by dwd@bell-labs.com to call wait3 instead of wait because + * apache started to use the WNOHANG option. + */ +int waitpid(pid_t pid, int *statusp, int options) +{ + int tmp_pid; + if (kill(pid, 0) == -1) { + errno = ECHILD; + return -1; + } + while (((tmp_pid = wait3(statusp, options, 0)) != pid) && + (tmp_pid != -1) && (tmp_pid != 0) && (pid != -1)) + ; + return tmp_pid; +} +#endif +#endif + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/netware/signals.c b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/netware/signals.c new file mode 100644 index 00000000..1b612f9f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/netware/signals.c @@ -0,0 +1,78 @@ +/* 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. + */ + +#include "apr_arch_threadproc.h" +#include +#include "apr_private.h" +#include "apr_pools.h" +#include "apr_signal.h" +#include "apr_strings.h" + +#include +#if APR_HAS_THREADS && APR_HAVE_PTHREAD_H +#include +#endif + +APR_DECLARE(apr_status_t) apr_proc_kill(apr_proc_t *proc, int signum) +{ + return APR_ENOTIMPL; +} + + +void apr_signal_init(apr_pool_t *pglobal) +{ +} + +const char *apr_signal_description_get(int signum) +{ + switch (signum) + { + case SIGABRT: + return "Abort"; + case SIGFPE: + return "Arithmetic exception"; + case SIGILL: + return "Illegal instruction"; + case SIGINT: + return "Interrupt"; + case SIGSEGV: + return "Segmentation fault"; + case SIGTERM: + return "Terminated"; + case SIGPOLL: + return "Pollable event occurred"; + default: + return "unknown signal (not supported)"; + } +} + +static void *signal_thread_func(void *signal_handler) +{ + return NULL; +} + +APR_DECLARE(apr_status_t) apr_setup_signal_thread(void) +{ + int rv = 0; + + return rv; +} + +/* Deprecated */ +const char *apr_signal_get_description(int signum) +{ + return apr_signal_description_get(signum); +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/netware/thread.c b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/netware/thread.c new file mode 100644 index 00000000..65ef039f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/netware/thread.c @@ -0,0 +1,250 @@ +/* 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. + */ + +#include "apr.h" +#include "apr_portable.h" +#include "apr_strings.h" +#include "apr_arch_threadproc.h" + +static int thread_count = 0; + +apr_status_t apr_threadattr_create(apr_threadattr_t **new, + apr_pool_t *pool) +{ + (*new) = (apr_threadattr_t *)apr_palloc(pool, + sizeof(apr_threadattr_t)); + + if ((*new) == NULL) { + return APR_ENOMEM; + } + + (*new)->pool = pool; + (*new)->stack_size = APR_DEFAULT_STACK_SIZE; + (*new)->detach = 0; + (*new)->thread_name = NULL; + return APR_SUCCESS; +} + +apr_status_t apr_threadattr_detach_set(apr_threadattr_t *attr,apr_int32_t on) +{ + attr->detach = on; + return APR_SUCCESS; +} + +apr_status_t apr_threadattr_detach_get(apr_threadattr_t *attr) +{ + if (attr->detach == 1) + return APR_DETACH; + return APR_NOTDETACH; +} + +APR_DECLARE(apr_status_t) apr_threadattr_stacksize_set(apr_threadattr_t *attr, + apr_size_t stacksize) +{ + attr->stack_size = stacksize; + return APR_SUCCESS; +} + +static void *dummy_worker(void *opaque) +{ + apr_thread_t *thd = (apr_thread_t *)opaque; + return thd->func(thd, thd->data); +} + +apr_status_t apr_thread_create(apr_thread_t **new, + apr_threadattr_t *attr, + apr_thread_start_t func, + void *data, + apr_pool_t *pool) +{ + apr_status_t stat; + long flags = NX_THR_BIND_CONTEXT; + char threadName[NX_MAX_OBJECT_NAME_LEN+1]; + size_t stack_size = APR_DEFAULT_STACK_SIZE; + + if (attr && attr->thread_name) { + strncpy (threadName, attr->thread_name, NX_MAX_OBJECT_NAME_LEN); + } + else { + sprintf(threadName, "APR_thread %04ld", ++thread_count); + } + + /* An original stack size of 0 will allow NXCreateThread() to + * assign a default system stack size. An original stack + * size of less than 0 will assign the APR default stack size. + * anything else will be taken as is. + */ + if (attr && (attr->stack_size >= 0)) { + stack_size = attr->stack_size; + } + + (*new) = (apr_thread_t *)apr_palloc(pool, sizeof(apr_thread_t)); + + if ((*new) == NULL) { + return APR_ENOMEM; + } + + (*new)->pool = pool; + (*new)->data = data; + (*new)->func = func; + (*new)->thread_name = (char*)apr_pstrdup(pool, threadName); + + stat = apr_pool_create(&(*new)->pool, pool); + if (stat != APR_SUCCESS) { + return stat; + } + + if (attr && attr->detach) { + flags |= NX_THR_DETACHED; + } + + (*new)->ctx = NXContextAlloc( + /* void(*start_routine)(void *arg)*/(void (*)(void *)) dummy_worker, + /* void *arg */ (*new), + /* int priority */ NX_PRIO_MED, + /* NXSize_t stackSize */ stack_size, + /* long flags */ NX_CTX_NORMAL, + /* int *error */ &stat); + + + stat = NXContextSetName( + /* NXContext_t ctx */ (*new)->ctx, + /* const char *name */ threadName); + + stat = NXThreadCreate( + /* NXContext_t context */ (*new)->ctx, + /* long flags */ flags, + /* NXThreadId_t *thread_id */ &(*new)->td); + + if(stat==0) + return APR_SUCCESS; + + return(stat);// if error +} + +apr_os_thread_t apr_os_thread_current() +{ + return NXThreadGetId(); +} + +int apr_os_thread_equal(apr_os_thread_t tid1, apr_os_thread_t tid2) +{ + return (tid1 == tid2); +} + +void apr_thread_yield() +{ + NXThreadYield(); +} + +apr_status_t apr_thread_exit(apr_thread_t *thd, + apr_status_t retval) +{ + thd->exitval = retval; + apr_pool_destroy(thd->pool); + NXThreadExit(NULL); + return APR_SUCCESS; +} + +apr_status_t apr_thread_join(apr_status_t *retval, + apr_thread_t *thd) +{ + apr_status_t stat; + NXThreadId_t dthr; + + if ((stat = NXThreadJoin(thd->td, &dthr, NULL)) == 0) { + *retval = thd->exitval; + return APR_SUCCESS; + } + else { + return stat; + } +} + +apr_status_t apr_thread_detach(apr_thread_t *thd) +{ + return APR_SUCCESS; +} + +apr_status_t apr_thread_data_get(void **data, const char *key, + apr_thread_t *thread) +{ + if (thread != NULL) { + return apr_pool_userdata_get(data, key, thread->pool); + } + else { + data = NULL; + return APR_ENOTHREAD; + } +} + +apr_status_t apr_thread_data_set(void *data, const char *key, + apr_status_t (*cleanup) (void *), + apr_thread_t *thread) +{ + if (thread != NULL) { + return apr_pool_userdata_set(data, key, cleanup, thread->pool); + } + else { + data = NULL; + return APR_ENOTHREAD; + } +} + +APR_DECLARE(apr_status_t) apr_os_thread_get(apr_os_thread_t **thethd, + apr_thread_t *thd) +{ + if (thd == NULL) { + return APR_ENOTHREAD; + } + *thethd = &(thd->td); + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_os_thread_put(apr_thread_t **thd, + apr_os_thread_t *thethd, + apr_pool_t *pool) +{ + if (pool == NULL) { + return APR_ENOPOOL; + } + if ((*thd) == NULL) { + (*thd) = (apr_thread_t *)apr_palloc(pool, sizeof(apr_thread_t)); + (*thd)->pool = pool; + } + (*thd)->td = *thethd; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_thread_once_init(apr_thread_once_t **control, + apr_pool_t *p) +{ + (*control) = apr_pcalloc(p, sizeof(**control)); + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_thread_once(apr_thread_once_t *control, + void (*func)(void)) +{ + if (!atomic_xchg(&control->value, 1)) { + func(); + } + return APR_SUCCESS; +} + +APR_POOL_IMPLEMENT_ACCESSOR(thread) + + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/netware/threadpriv.c b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/netware/threadpriv.c new file mode 100644 index 00000000..54680a56 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/netware/threadpriv.c @@ -0,0 +1,102 @@ +/* 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. + */ + +#include "apr_portable.h" +#include "apr_arch_threadproc.h" + +apr_status_t apr_threadkey_private_create(apr_threadkey_t **key, + void (*dest)(void *), apr_pool_t *pool) +{ + apr_status_t stat; + + (*key) = (apr_threadkey_t *)apr_palloc(pool, sizeof(apr_threadkey_t)); + if ((*key) == NULL) { + return APR_ENOMEM; + } + + (*key)->pool = pool; + + if ((stat = NXKeyCreate(NULL, dest, &(*key)->key)) == 0) { + return stat; + } + return stat; +} + +apr_status_t apr_threadkey_private_get(void **new, apr_threadkey_t *key) +{ + apr_status_t stat; + + if ((stat = NXKeyGetValue(key->key, new)) == 0) { + return APR_SUCCESS; + } + else { + return stat; + } +} + +apr_status_t apr_threadkey_private_set(void *priv, apr_threadkey_t *key) +{ + apr_status_t stat; + if ((stat = NXKeySetValue(key->key, priv)) == 0) { + return APR_SUCCESS; + } + else { + return stat; + } +} + +apr_status_t apr_threadkey_private_delete(apr_threadkey_t *key) +{ + apr_status_t stat; + if ((stat = NXKeyDelete(key->key)) == 0) { + return APR_SUCCESS; + } + return stat; +} + +apr_status_t apr_threadkey_data_get(void **data, const char *key, apr_threadkey_t *threadkey) +{ + return apr_pool_userdata_get(data, key, threadkey->pool); +} + +apr_status_t apr_threadkey_data_set(void *data, + const char *key, apr_status_t (*cleanup) (void *), + apr_threadkey_t *threadkey) +{ + return apr_pool_userdata_set(data, key, cleanup, threadkey->pool); +} + +apr_status_t apr_os_threadkey_get(apr_os_threadkey_t *thekey, + apr_threadkey_t *key) +{ + thekey = &(key->key); + return APR_SUCCESS; +} + +apr_status_t apr_os_threadkey_put(apr_threadkey_t **key, + apr_os_threadkey_t *thekey, apr_pool_t *pool) +{ + if (pool == NULL) { + return APR_ENOPOOL; + } + if ((*key) == NULL) { + (*key) = (apr_threadkey_t *)apr_palloc(pool, sizeof(apr_threadkey_t)); + (*key)->pool = pool; + } + (*key)->key = *thekey; + return APR_SUCCESS; +} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/os2/Makefile.in b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/os2/Makefile.in new file mode 100644 index 00000000..3cc12ad7 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/os2/Makefile.in @@ -0,0 +1,18 @@ +srcdir = @srcdir@ +VPATH = @srcdir@ + +TARGETS = \ + proc.lo \ + thread.lo \ + threadpriv.lo \ + signals.lo + +# bring in rules.mk for standard functionality +@INCLUDE_RULES@ + +INCDIR=../../include +OSDIR=$(INCDIR)/arch/@OSDIR@ +DEFOSDIR=$(INCDIR)/arch/@DEFAULT_OSDIR@ +INCLUDES=-I$(INCDIR) -I$(OSDIR) -I$(DEFOSDIR) + +# DO NOT REMOVE diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/os2/proc.c b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/os2/proc.c new file mode 100644 index 00000000..d57df5ea --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/os2/proc.c @@ -0,0 +1,605 @@ +/* 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. + */ + +#define INCL_DOS +#define INCL_DOSERRORS + +#include "apr_arch_threadproc.h" +#include "apr_arch_file_io.h" +#include "apr_private.h" +#include "apr_thread_proc.h" +#include "apr_file_io.h" +#include "apr_general.h" +#include "apr_lib.h" +#include "apr_portable.h" +#include "apr_strings.h" +#include "apr_signal.h" +#include +#include +#include +#include +#include +#include + +APR_DECLARE(apr_status_t) apr_procattr_create(apr_procattr_t **new, apr_pool_t *pool) +{ + (*new) = (apr_procattr_t *)apr_palloc(pool, + sizeof(apr_procattr_t)); + + if ((*new) == NULL) { + return APR_ENOMEM; + } + (*new)->pool = pool; + (*new)->parent_in = NULL; + (*new)->child_in = NULL; + (*new)->parent_out = NULL; + (*new)->child_out = NULL; + (*new)->parent_err = NULL; + (*new)->child_err = NULL; + (*new)->currdir = NULL; + (*new)->cmdtype = APR_PROGRAM; + (*new)->detached = FALSE; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_procattr_io_set(apr_procattr_t *attr, apr_int32_t in, + apr_int32_t out, apr_int32_t err) +{ + apr_status_t stat; + if (in) { + if ((stat = apr_file_pipe_create(&attr->child_in, &attr->parent_in, + attr->pool)) != APR_SUCCESS) { + return stat; + } + switch (in) { + case APR_FULL_BLOCK: + break; + case APR_PARENT_BLOCK: + apr_file_pipe_timeout_set(attr->child_in, 0); + break; + case APR_CHILD_BLOCK: + apr_file_pipe_timeout_set(attr->parent_in, 0); + break; + default: + apr_file_pipe_timeout_set(attr->child_in, 0); + apr_file_pipe_timeout_set(attr->parent_in, 0); + } + } + if (out) { + if ((stat = apr_file_pipe_create(&attr->parent_out, &attr->child_out, + attr->pool)) != APR_SUCCESS) { + return stat; + } + switch (out) { + case APR_FULL_BLOCK: + break; + case APR_PARENT_BLOCK: + apr_file_pipe_timeout_set(attr->child_out, 0); + break; + case APR_CHILD_BLOCK: + apr_file_pipe_timeout_set(attr->parent_out, 0); + break; + default: + apr_file_pipe_timeout_set(attr->child_out, 0); + apr_file_pipe_timeout_set(attr->parent_out, 0); + } + } + if (err) { + if ((stat = apr_file_pipe_create(&attr->parent_err, &attr->child_err, + attr->pool)) != APR_SUCCESS) { + return stat; + } + switch (err) { + case APR_FULL_BLOCK: + break; + case APR_PARENT_BLOCK: + apr_file_pipe_timeout_set(attr->child_err, 0); + break; + case APR_CHILD_BLOCK: + apr_file_pipe_timeout_set(attr->parent_err, 0); + break; + default: + apr_file_pipe_timeout_set(attr->child_err, 0); + apr_file_pipe_timeout_set(attr->parent_err, 0); + } + } + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_procattr_child_in_set(apr_procattr_t *attr, apr_file_t *child_in, + apr_file_t *parent_in) +{ + if (attr->child_in == NULL && attr->parent_in == NULL) + apr_file_pipe_create(&attr->child_in, &attr->parent_in, attr->pool); + + if (child_in != NULL) + apr_file_dup(&attr->child_in, child_in, attr->pool); + + if (parent_in != NULL) + apr_file_dup(&attr->parent_in, parent_in, attr->pool); + + return APR_SUCCESS; +} + + +APR_DECLARE(apr_status_t) apr_procattr_child_out_set(apr_procattr_t *attr, apr_file_t *child_out, + apr_file_t *parent_out) +{ + if (attr->child_out == NULL && attr->parent_out == NULL) + apr_file_pipe_create(&attr->child_out, &attr->parent_out, attr->pool); + + if (child_out != NULL) + apr_file_dup(&attr->child_out, child_out, attr->pool); + + if (parent_out != NULL) + apr_file_dup(&attr->parent_out, parent_out, attr->pool); + + return APR_SUCCESS; +} + + +APR_DECLARE(apr_status_t) apr_procattr_child_err_set(apr_procattr_t *attr, apr_file_t *child_err, + apr_file_t *parent_err) +{ + if (attr->child_err == NULL && attr->parent_err == NULL) + apr_file_pipe_create(&attr->child_err, &attr->parent_err, attr->pool); + + if (child_err != NULL) + apr_file_dup(&attr->child_err, child_err, attr->pool); + + if (parent_err != NULL) + apr_file_dup(&attr->parent_err, parent_err, attr->pool); + + return APR_SUCCESS; +} + + +APR_DECLARE(apr_status_t) apr_procattr_dir_set(apr_procattr_t *attr, const char *dir) +{ + attr->currdir = apr_pstrdup(attr->pool, dir); + if (attr->currdir) { + return APR_SUCCESS; + } + return APR_ENOMEM; +} + +APR_DECLARE(apr_status_t) apr_procattr_cmdtype_set(apr_procattr_t *attr, + apr_cmdtype_e cmd) +{ + attr->cmdtype = cmd; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_procattr_detach_set(apr_procattr_t *attr, apr_int32_t detach) +{ + attr->detached = detach; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_proc_fork(apr_proc_t *proc, apr_pool_t *pool) +{ + int pid; + + if ((pid = fork()) < 0) { + return errno; + } + else if (pid == 0) { + proc->pid = pid; + proc->in = NULL; + proc->out = NULL; + proc->err = NULL; + return APR_INCHILD; + } + proc->pid = pid; + proc->in = NULL; + proc->out = NULL; + proc->err = NULL; + return APR_INPARENT; +} + + + +/* quotes in the string are doubled up. + * Used to escape quotes in args passed to OS/2's cmd.exe + */ +static char *double_quotes(apr_pool_t *pool, const char *str) +{ + int num_quotes = 0; + int len = 0; + char *quote_doubled_str, *dest; + + while (str[len]) { + num_quotes += str[len++] == '\"'; + } + + quote_doubled_str = apr_palloc(pool, len + num_quotes + 1); + dest = quote_doubled_str; + + while (*str) { + if (*str == '\"') + *(dest++) = '\"'; + *(dest++) = *(str++); + } + + *dest = 0; + return quote_doubled_str; +} + + + +APR_DECLARE(apr_status_t) apr_procattr_child_errfn_set(apr_procattr_t *attr, + apr_child_errfn_t *errfn) +{ + /* won't ever be called on this platform, so don't save the function pointer */ + return APR_SUCCESS; +} + + + +APR_DECLARE(apr_status_t) apr_procattr_error_check_set(apr_procattr_t *attr, + apr_int32_t chk) +{ + /* won't ever be used on this platform, so don't save the flag */ + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_procattr_addrspace_set(apr_procattr_t *attr, + apr_int32_t addrspace) +{ + /* won't ever be used on this platform, so don't save the flag */ + return APR_SUCCESS; +} + + + +APR_DECLARE(apr_status_t) apr_proc_create(apr_proc_t *proc, const char *progname, + const char * const *args, + const char * const *env, + apr_procattr_t *attr, apr_pool_t *pool) +{ + int i, arg, numargs, cmdlen; + apr_status_t status; + const char **newargs; + char savedir[300]; + HFILE save_in, save_out, save_err, dup; + int criticalsection = FALSE; + char *extension, *newprogname, *extra_arg = NULL, *cmdline, *cmdline_pos; + char interpreter[1024]; + char error_object[260]; + apr_file_t *progfile; + int env_len, e; + char *env_block, *env_block_pos; + RESULTCODES rescodes; + + /* Prevent other threads from running while these process-wide resources are modified */ + if (attr->child_in || attr->child_out || attr->child_err || attr->currdir) { + criticalsection = TRUE; + DosEnterCritSec(); + } + + if (attr->child_in) { + save_in = -1; + DosDupHandle(STDIN_FILENO, &save_in); + dup = STDIN_FILENO; + DosDupHandle(attr->child_in->filedes, &dup); + DosSetFHState(attr->parent_in->filedes, OPEN_FLAGS_NOINHERIT); + } + + if (attr->child_out) { + save_out = -1; + DosDupHandle(STDOUT_FILENO, &save_out); + dup = STDOUT_FILENO; + DosDupHandle(attr->child_out->filedes, &dup); + DosSetFHState(attr->parent_out->filedes, OPEN_FLAGS_NOINHERIT); + } + + if (attr->child_err) { + save_err = -1; + DosDupHandle(STDERR_FILENO, &save_err); + dup = STDERR_FILENO; + DosDupHandle(attr->child_err->filedes, &dup); + DosSetFHState(attr->parent_err->filedes, OPEN_FLAGS_NOINHERIT); + } + + apr_signal(SIGCHLD, SIG_DFL); /*not sure if this is needed or not */ + + if (attr->currdir != NULL) { + _getcwd2(savedir, sizeof(savedir)); + + if (_chdir2(attr->currdir) < 0) { + if (criticalsection) + DosExitCritSec(); + return errno; + } + } + + interpreter[0] = 0; + extension = strrchr(progname, '.'); + + if (extension == NULL || strchr(extension, '/') || strchr(extension, '\\')) + extension = ""; + + /* ### how to handle APR_PROGRAM_ENV and APR_PROGRAM_PATH? */ + + if (attr->cmdtype == APR_SHELLCMD || + attr->cmdtype == APR_SHELLCMD_ENV || + strcasecmp(extension, ".cmd") == 0) { + strcpy(interpreter, "#!" SHELL_PATH); + extra_arg = "/C"; + } else if (stricmp(extension, ".exe") != 0) { + status = apr_file_open(&progfile, progname, APR_READ|APR_BUFFERED, 0, pool); + + if (status != APR_SUCCESS && APR_STATUS_IS_ENOENT(status)) { + progname = apr_pstrcat(pool, progname, ".exe", NULL); + } + + if (status == APR_SUCCESS) { + status = apr_file_gets(interpreter, sizeof(interpreter), progfile); + + if (status == APR_SUCCESS) { + if (interpreter[0] == '#' && interpreter[1] == '!') { + /* delete CR/LF & any other whitespace off the end */ + int end = strlen(interpreter) - 1; + + while (end >= 0 && apr_isspace(interpreter[end])) { + interpreter[end] = '\0'; + end--; + } + + if (interpreter[2] != '/' && interpreter[2] != '\\' && interpreter[3] != ':') { + char buffer[300]; + + if (DosSearchPath(SEARCH_ENVIRONMENT, "PATH", interpreter+2, buffer, sizeof(buffer)) == 0) { + strcpy(interpreter+2, buffer); + } else { + strcat(interpreter, ".exe"); + if (DosSearchPath(SEARCH_ENVIRONMENT, "PATH", interpreter+2, buffer, sizeof(buffer)) == 0) { + strcpy(interpreter+2, buffer); + } + } + } + } else { + interpreter[0] = 0; + } + } + + apr_file_close(progfile); + } + } + + i = 0; + + while (args && args[i]) { + i++; + } + + newargs = (const char **)apr_palloc(pool, sizeof (char *) * (i + 4)); + numargs = 0; + + if (interpreter[0]) + newargs[numargs++] = interpreter + 2; + if (extra_arg) + newargs[numargs++] = "/c"; + + newargs[numargs++] = newprogname = apr_pstrdup(pool, progname); + arg = 1; + + while (args && args[arg]) { + newargs[numargs++] = args[arg++]; + } + + newargs[numargs] = NULL; + + for (i=0; newprogname[i]; i++) + if (newprogname[i] == '/') + newprogname[i] = '\\'; + + cmdlen = 0; + + for (i=0; i\" ")) + a = apr_pstrcat(pool, "\"", double_quotes(pool, a), "\"", NULL); + + if (i) + *(cmdline_pos++) = ' '; + + strcpy(cmdline_pos, a); + cmdline_pos += strlen(cmdline_pos); + } + + *(++cmdline_pos) = 0; /* Add required second terminator */ + cmdline_pos = strchr(cmdline, ' '); + + if (cmdline_pos) { + *cmdline_pos = 0; + cmdline_pos++; + } + + /* Create environment block from list of envariables */ + if (env) { + for (env_len=1, e=0; env[e]; e++) + env_len += strlen(env[e]) + 1; + + env_block = apr_palloc(pool, env_len); + env_block_pos = env_block; + + for (e=0; env[e]; e++) { + strcpy(env_block_pos, env[e]); + env_block_pos += strlen(env_block_pos) + 1; + } + + *env_block_pos = 0; /* environment block is terminated by a double null */ + } else + env_block = NULL; + + status = DosExecPgm(error_object, sizeof(error_object), + attr->detached ? EXEC_BACKGROUND : EXEC_ASYNCRESULT, + cmdline, env_block, &rescodes, cmdline); + + proc->pid = rescodes.codeTerminate; + + if (attr->currdir != NULL) { + chdir(savedir); + } + + if (attr->child_in) { + apr_file_close(attr->child_in); + dup = STDIN_FILENO; + DosDupHandle(save_in, &dup); + DosClose(save_in); + } + + if (attr->child_out) { + apr_file_close(attr->child_out); + dup = STDOUT_FILENO; + DosDupHandle(save_out, &dup); + DosClose(save_out); + } + + if (attr->child_err) { + apr_file_close(attr->child_err); + dup = STDERR_FILENO; + DosDupHandle(save_err, &dup); + DosClose(save_err); + } + + if (criticalsection) + DosExitCritSec(); + + proc->in = attr->parent_in; + proc->err = attr->parent_err; + proc->out = attr->parent_out; + return status; +} + + + +static void proces_result_codes(RESULTCODES codes, + int *exitcode, + apr_exit_why_e *exitwhy) +{ + int result = 0; + apr_exit_why_e why = APR_PROC_EXIT; + + switch (codes.codeTerminate) { + case TC_EXIT: /* Normal exit */ + why = APR_PROC_EXIT; + result = codes.codeResult; + break; + + case TC_HARDERROR: /* Hard error halt */ + why = APR_PROC_SIGNAL; + result = SIGSYS; + break; + + case TC_KILLPROCESS: /* Was killed by a DosKillProcess() */ + why = APR_PROC_SIGNAL; + result = SIGKILL; + break; + + case TC_TRAP: /* TRAP in 16 bit code */ + case TC_EXCEPTION: /* Threw an exception (32 bit code) */ + why = APR_PROC_SIGNAL; + + switch (codes.codeResult | XCPT_FATAL_EXCEPTION) { + case XCPT_ACCESS_VIOLATION: + result = SIGSEGV; + break; + + case XCPT_ILLEGAL_INSTRUCTION: + result = SIGILL; + break; + + case XCPT_FLOAT_DIVIDE_BY_ZERO: + case XCPT_INTEGER_DIVIDE_BY_ZERO: + result = SIGFPE; + break; + + default: + result = codes.codeResult; + break; + } + } + + if (exitcode) { + *exitcode = result; + } + + if (exitwhy) { + *exitwhy = why; + } +} + + + +APR_DECLARE(apr_status_t) apr_proc_wait_all_procs(apr_proc_t *proc, + int *exitcode, + apr_exit_why_e *exitwhy, + apr_wait_how_e waithow, + apr_pool_t *p) +{ + RESULTCODES codes; + ULONG rc; + PID pid; + + rc = DosWaitChild(DCWA_PROCESSTREE, waithow == APR_WAIT ? DCWW_WAIT : DCWW_NOWAIT, &codes, &pid, 0); + + if (rc == 0) { + proc->pid = pid; + proces_result_codes(codes, exitcode, exitwhy); + return APR_CHILD_DONE; + } else if (rc == ERROR_CHILD_NOT_COMPLETE) { + return APR_CHILD_NOTDONE; + } + + return APR_OS2_STATUS(rc); +} + + + +APR_DECLARE(apr_status_t) apr_proc_wait(apr_proc_t *proc, + int *exitcode, apr_exit_why_e *exitwhy, + apr_wait_how_e waithow) +{ + RESULTCODES codes; + ULONG rc; + PID pid; + rc = DosWaitChild(DCWA_PROCESS, waithow == APR_WAIT ? DCWW_WAIT : DCWW_NOWAIT, &codes, &pid, proc->pid); + + if (rc == 0) { + proces_result_codes(codes, exitcode, exitwhy); + return APR_CHILD_DONE; + } else if (rc == ERROR_CHILD_NOT_COMPLETE) { + return APR_CHILD_NOTDONE; + } + + return APR_OS2_STATUS(rc); +} + + + +APR_DECLARE(apr_status_t) apr_proc_detach(int daemonize) +{ + return APR_ENOTIMPL; +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/os2/signals.c b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/os2/signals.c new file mode 100644 index 00000000..e1727125 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/os2/signals.c @@ -0,0 +1 @@ +#include "../unix/signals.c" diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/os2/thread.c b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/os2/thread.c new file mode 100644 index 00000000..e0f32561 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/os2/thread.c @@ -0,0 +1,259 @@ +/* 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. + */ + +#define INCL_DOSERRORS +#define INCL_DOS +#include "apr_arch_threadproc.h" +#include "apr_thread_proc.h" +#include "apr_general.h" +#include "apr_lib.h" +#include "apr_portable.h" +#include "apr_arch_file_io.h" +#include + +APR_DECLARE(apr_status_t) apr_threadattr_create(apr_threadattr_t **new, apr_pool_t *pool) +{ + (*new) = (apr_threadattr_t *)apr_palloc(pool, sizeof(apr_threadattr_t)); + + if ((*new) == NULL) { + return APR_ENOMEM; + } + + (*new)->pool = pool; + (*new)->attr = 0; + (*new)->stacksize = 0; + return APR_SUCCESS; +} + + + +APR_DECLARE(apr_status_t) apr_threadattr_detach_set(apr_threadattr_t *attr, apr_int32_t on) +{ + attr->attr |= APR_THREADATTR_DETACHED; + return APR_SUCCESS; +} + + + +APR_DECLARE(apr_status_t) apr_threadattr_detach_get(apr_threadattr_t *attr) +{ + return (attr->attr & APR_THREADATTR_DETACHED) ? APR_DETACH : APR_NOTDETACH; +} + + + +APR_DECLARE(apr_status_t) apr_threadattr_stacksize_set(apr_threadattr_t *attr, + apr_size_t stacksize) +{ + attr->stacksize = stacksize; + return APR_SUCCESS; +} + + + +static void apr_thread_begin(void *arg) +{ + apr_thread_t *thread = (apr_thread_t *)arg; + thread->exitval = thread->func(thread, thread->data); +} + + + +APR_DECLARE(apr_status_t) apr_thread_create(apr_thread_t **new, apr_threadattr_t *attr, + apr_thread_start_t func, void *data, + apr_pool_t *pool) +{ + apr_status_t stat; + apr_thread_t *thread; + + thread = (apr_thread_t *)apr_palloc(pool, sizeof(apr_thread_t)); + *new = thread; + + if (thread == NULL) { + return APR_ENOMEM; + } + + thread->pool = pool; + thread->attr = attr; + thread->func = func; + thread->data = data; + stat = apr_pool_create(&thread->pool, pool); + + if (stat != APR_SUCCESS) { + return stat; + } + + if (attr == NULL) { + stat = apr_threadattr_create(&thread->attr, thread->pool); + + if (stat != APR_SUCCESS) { + return stat; + } + } + + thread->tid = _beginthread(apr_thread_begin, NULL, + thread->attr->stacksize > 0 ? + thread->attr->stacksize : APR_THREAD_STACKSIZE, + thread); + + if (thread->tid < 0) { + return errno; + } + + return APR_SUCCESS; +} + + + +APR_DECLARE(apr_os_thread_t) apr_os_thread_current() +{ + PIB *ppib; + TIB *ptib; + DosGetInfoBlocks(&ptib, &ppib); + return ptib->tib_ptib2->tib2_ultid; +} + + + +APR_DECLARE(apr_status_t) apr_thread_exit(apr_thread_t *thd, apr_status_t retval) +{ + thd->exitval = retval; + _endthread(); + return -1; /* If we get here something's wrong */ +} + + + +APR_DECLARE(apr_status_t) apr_thread_join(apr_status_t *retval, apr_thread_t *thd) +{ + ULONG rc; + TID waittid = thd->tid; + + if (thd->attr->attr & APR_THREADATTR_DETACHED) + return APR_EINVAL; + + rc = DosWaitThread(&waittid, DCWW_WAIT); + + if (rc == ERROR_INVALID_THREADID) + rc = 0; /* Thread had already terminated */ + + *retval = thd->exitval; + return APR_OS2_STATUS(rc); +} + + + +APR_DECLARE(apr_status_t) apr_thread_detach(apr_thread_t *thd) +{ + thd->attr->attr |= APR_THREADATTR_DETACHED; + return APR_SUCCESS; +} + + + +void apr_thread_yield() +{ + DosSleep(0); +} + + + +APR_DECLARE(apr_status_t) apr_os_thread_get(apr_os_thread_t **thethd, apr_thread_t *thd) +{ + *thethd = &thd->tid; + return APR_SUCCESS; +} + + + +APR_DECLARE(apr_status_t) apr_os_thread_put(apr_thread_t **thd, apr_os_thread_t *thethd, + apr_pool_t *pool) +{ + if ((*thd) == NULL) { + (*thd) = (apr_thread_t *)apr_pcalloc(pool, sizeof(apr_thread_t)); + (*thd)->pool = pool; + } + (*thd)->tid = *thethd; + return APR_SUCCESS; +} + + + +int apr_os_thread_equal(apr_os_thread_t tid1, apr_os_thread_t tid2) +{ + return tid1 == tid2; +} + + + +APR_DECLARE(apr_status_t) apr_thread_data_get(void **data, const char *key, apr_thread_t *thread) +{ + return apr_pool_userdata_get(data, key, thread->pool); +} + + + +APR_DECLARE(apr_status_t) apr_thread_data_set(void *data, const char *key, + apr_status_t (*cleanup) (void *), + apr_thread_t *thread) +{ + return apr_pool_userdata_set(data, key, cleanup, thread->pool); +} + +APR_POOL_IMPLEMENT_ACCESSOR(thread) + + + +static apr_status_t thread_once_cleanup(void *vcontrol) +{ + apr_thread_once_t *control = (apr_thread_once_t *)vcontrol; + + if (control->sem) { + DosCloseEventSem(control->sem); + } + + return APR_SUCCESS; +} + + + +APR_DECLARE(apr_status_t) apr_thread_once_init(apr_thread_once_t **control, + apr_pool_t *p) +{ + ULONG rc; + *control = (apr_thread_once_t *)apr_pcalloc(p, sizeof(apr_thread_once_t)); + rc = DosCreateEventSem(NULL, &(*control)->sem, 0, TRUE); + apr_pool_cleanup_register(p, control, thread_once_cleanup, apr_pool_cleanup_null); + return APR_FROM_OS_ERROR(rc); +} + + + +APR_DECLARE(apr_status_t) apr_thread_once(apr_thread_once_t *control, + void (*func)(void)) +{ + if (!control->hit) { + ULONG count, rc; + rc = DosResetEventSem(control->sem, &count); + + if (rc == 0 && count) { + control->hit = 1; + func(); + } + } + + return APR_SUCCESS; +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/os2/threadpriv.c b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/os2/threadpriv.c new file mode 100644 index 00000000..107ec10d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/os2/threadpriv.c @@ -0,0 +1,88 @@ +/* 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. + */ + +#include "apr_arch_threadproc.h" +#include "apr_thread_proc.h" +#include "apr_portable.h" +#include "apr_general.h" +#include "apr_errno.h" +#include "apr_lib.h" +#include "apr_arch_file_io.h" + +APR_DECLARE(apr_status_t) apr_threadkey_private_create(apr_threadkey_t **key, + void (*dest)(void *), + apr_pool_t *pool) +{ + (*key) = (apr_threadkey_t *)apr_palloc(pool, sizeof(apr_threadkey_t)); + + if ((*key) == NULL) { + return APR_ENOMEM; + } + + (*key)->pool = pool; + return APR_OS2_STATUS(DosAllocThreadLocalMemory(1, &((*key)->key))); +} + +APR_DECLARE(apr_status_t) apr_threadkey_private_get(void **new, apr_threadkey_t *key) +{ + (*new) = (void *)*(key->key); + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_threadkey_private_set(void *priv, apr_threadkey_t *key) +{ + *(key->key) = (ULONG)priv; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_threadkey_private_delete(apr_threadkey_t *key) +{ + return APR_OS2_STATUS(DosFreeThreadLocalMemory(key->key)); +} + +APR_DECLARE(apr_status_t) apr_threadkey_data_get(void **data, const char *key, + apr_threadkey_t *threadkey) +{ + return apr_pool_userdata_get(data, key, threadkey->pool); +} + +APR_DECLARE(apr_status_t) apr_threadkey_data_set(void *data, const char *key, + apr_status_t (*cleanup) (void *), + apr_threadkey_t *threadkey) +{ + return apr_pool_userdata_set(data, key, cleanup, threadkey->pool); +} + +APR_DECLARE(apr_status_t) apr_os_threadkey_get(apr_os_threadkey_t *thekey, apr_threadkey_t *key) +{ + *thekey = key->key; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_os_threadkey_put(apr_threadkey_t **key, + apr_os_threadkey_t *thekey, + apr_pool_t *pool) +{ + if (pool == NULL) { + return APR_ENOPOOL; + } + if ((*key) == NULL) { + (*key) = (apr_threadkey_t *)apr_pcalloc(pool, sizeof(apr_threadkey_t)); + (*key)->pool = pool; + } + (*key)->key = *thekey; + return APR_SUCCESS; +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/.libs/proc.o b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/.libs/proc.o new file mode 100644 index 0000000000000000000000000000000000000000..9a79591446e973afdc1b13c1344d06fb4509e11c GIT binary patch literal 37760 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/.libs/procsup.o b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/.libs/procsup.o new file mode 100644 index 0000000000000000000000000000000000000000..03fb082275234a7dbea5772cb4e097b953e3d925 GIT binary patch literal 9552 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/.libs/signals.o b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/.libs/signals.o new file mode 100644 index 0000000000000000000000000000000000000000..789e642264c5c2127335fb5e982b6e0aaae3653d GIT binary patch literal 16376 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/.libs/thread.o b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/.libs/thread.o new file mode 100644 index 0000000000000000000000000000000000000000..211dc25d5f6a7ace291c7f6044232d6c27762c01 GIT binary patch literal 22320 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 UvEO0B`8_A&2MM2J@Ol0IFW}5>xc~qF literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/.libs/threadpriv.o b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/.libs/threadpriv.o new file mode 100644 index 0000000000000000000000000000000000000000..5501d35c43655d594fcee909cada355e368be9c0 GIT binary patch literal 12264 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 aiyA&lI$s~mXZ@pool = pool; + (*new)->cmdtype = APR_PROGRAM; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_procattr_io_set(apr_procattr_t *attr, + apr_int32_t in, + apr_int32_t out, + apr_int32_t err) +{ + apr_status_t status; + if (in != 0) { + if ((status = apr_file_pipe_create(&attr->child_in, &attr->parent_in, + attr->pool)) != APR_SUCCESS) { + return status; + } + + switch (in) { + case APR_FULL_BLOCK: + break; + case APR_PARENT_BLOCK: + apr_file_pipe_timeout_set(attr->child_in, 0); + break; + case APR_CHILD_BLOCK: + apr_file_pipe_timeout_set(attr->parent_in, 0); + break; + default: + apr_file_pipe_timeout_set(attr->child_in, 0); + apr_file_pipe_timeout_set(attr->parent_in, 0); + } + } + + if (out) { + if ((status = apr_file_pipe_create(&attr->parent_out, &attr->child_out, + attr->pool)) != APR_SUCCESS) { + return status; + } + + switch (out) { + case APR_FULL_BLOCK: + break; + case APR_PARENT_BLOCK: + apr_file_pipe_timeout_set(attr->child_out, 0); + break; + case APR_CHILD_BLOCK: + apr_file_pipe_timeout_set(attr->parent_out, 0); + break; + default: + apr_file_pipe_timeout_set(attr->child_out, 0); + apr_file_pipe_timeout_set(attr->parent_out, 0); + } + } + + if (err) { + if ((status = apr_file_pipe_create(&attr->parent_err, &attr->child_err, + attr->pool)) != APR_SUCCESS) { + return status; + } + + switch (err) { + case APR_FULL_BLOCK: + break; + case APR_PARENT_BLOCK: + apr_file_pipe_timeout_set(attr->child_err, 0); + break; + case APR_CHILD_BLOCK: + apr_file_pipe_timeout_set(attr->parent_err, 0); + break; + default: + apr_file_pipe_timeout_set(attr->child_err, 0); + apr_file_pipe_timeout_set(attr->parent_err, 0); + } + } + + return APR_SUCCESS; +} + + +APR_DECLARE(apr_status_t) apr_procattr_child_in_set(apr_procattr_t *attr, + apr_file_t *child_in, + apr_file_t *parent_in) +{ + apr_status_t rv = APR_SUCCESS; + + if (attr->child_in == NULL && attr->parent_in == NULL) + rv = apr_file_pipe_create(&attr->child_in, &attr->parent_in, attr->pool); + + if (child_in != NULL && rv == APR_SUCCESS) + rv = apr_file_dup2(attr->child_in, child_in, attr->pool); + + if (parent_in != NULL && rv == APR_SUCCESS) + rv = apr_file_dup2(attr->parent_in, parent_in, attr->pool); + + return rv; +} + + +APR_DECLARE(apr_status_t) apr_procattr_child_out_set(apr_procattr_t *attr, + apr_file_t *child_out, + apr_file_t *parent_out) +{ + apr_status_t rv = APR_SUCCESS; + + if (attr->child_out == NULL && attr->parent_out == NULL) + rv = apr_file_pipe_create(&attr->child_out, &attr->parent_out, attr->pool); + + if (child_out != NULL && rv == APR_SUCCESS) + rv = apr_file_dup2(attr->child_out, child_out, attr->pool); + + if (parent_out != NULL && rv == APR_SUCCESS) + rv = apr_file_dup2(attr->parent_out, parent_out, attr->pool); + + return rv; +} + + +APR_DECLARE(apr_status_t) apr_procattr_child_err_set(apr_procattr_t *attr, + apr_file_t *child_err, + apr_file_t *parent_err) +{ + apr_status_t rv = APR_SUCCESS; + + if (attr->child_err == NULL && attr->parent_err == NULL) + rv = apr_file_pipe_create(&attr->child_err, &attr->parent_err, attr->pool); + + if (child_err != NULL && rv == APR_SUCCESS) + rv = apr_file_dup2(attr->child_err, child_err, attr->pool); + + if (parent_err != NULL && rv == APR_SUCCESS) + rv = apr_file_dup2(attr->parent_err, parent_err, attr->pool); + + return rv; +} + + +APR_DECLARE(apr_status_t) apr_procattr_dir_set(apr_procattr_t *attr, + const char *dir) +{ + attr->currdir = apr_pstrdup(attr->pool, dir); + if (attr->currdir) { + return APR_SUCCESS; + } + + return APR_ENOMEM; +} + +APR_DECLARE(apr_status_t) apr_procattr_cmdtype_set(apr_procattr_t *attr, + apr_cmdtype_e cmd) +{ + attr->cmdtype = cmd; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_procattr_detach_set(apr_procattr_t *attr, + apr_int32_t detach) +{ + attr->detached = detach; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_proc_fork(apr_proc_t *proc, apr_pool_t *pool) +{ + int pid; + + if ((pid = fork()) < 0) { + return errno; + } + else if (pid == 0) { + proc->pid = pid; + proc->in = NULL; + proc->out = NULL; + proc->err = NULL; + + return APR_INCHILD; + } + + proc->pid = pid; + proc->in = NULL; + proc->out = NULL; + proc->err = NULL; + + return APR_INPARENT; +} + +static apr_status_t limit_proc(apr_procattr_t *attr) +{ +#if APR_HAVE_STRUCT_RLIMIT && APR_HAVE_SETRLIMIT +#ifdef RLIMIT_CPU + if (attr->limit_cpu != NULL) { + if ((setrlimit(RLIMIT_CPU, attr->limit_cpu)) != 0) { + return errno; + } + } +#endif +#ifdef RLIMIT_NPROC + if (attr->limit_nproc != NULL) { + if ((setrlimit(RLIMIT_NPROC, attr->limit_nproc)) != 0) { + return errno; + } + } +#endif +#ifdef RLIMIT_NOFILE + if (attr->limit_nofile != NULL) { + if ((setrlimit(RLIMIT_NOFILE, attr->limit_nofile)) != 0) { + return errno; + } + } +#endif +#if defined(RLIMIT_AS) + if (attr->limit_mem != NULL) { + if ((setrlimit(RLIMIT_AS, attr->limit_mem)) != 0) { + return errno; + } + } +#elif defined(RLIMIT_DATA) + if (attr->limit_mem != NULL) { + if ((setrlimit(RLIMIT_DATA, attr->limit_mem)) != 0) { + return errno; + } + } +#elif defined(RLIMIT_VMEM) + if (attr->limit_mem != NULL) { + if ((setrlimit(RLIMIT_VMEM, attr->limit_mem)) != 0) { + return errno; + } + } +#endif +#else + /* + * Maybe make a note in error_log that setrlimit isn't supported?? + */ + +#endif + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_procattr_child_errfn_set(apr_procattr_t *attr, + apr_child_errfn_t *errfn) +{ + attr->errfn = errfn; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_procattr_error_check_set(apr_procattr_t *attr, + apr_int32_t chk) +{ + attr->errchk = chk; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_procattr_addrspace_set(apr_procattr_t *attr, + apr_int32_t addrspace) +{ + /* won't ever be used on this platform, so don't save the flag */ + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_proc_create(apr_proc_t *new, + const char *progname, + const char * const *args, + const char * const *env, + apr_procattr_t *attr, + apr_pool_t *pool) +{ + int i; + const char * const empty_envp[] = {NULL}; + + if (!env) { /* Specs require an empty array instead of NULL; + * Purify will trigger a failure, even if many + * implementations don't. + */ + env = empty_envp; + } + + new->in = attr->parent_in; + new->err = attr->parent_err; + new->out = attr->parent_out; + + if (attr->errchk) { + if (attr->currdir) { + if (access(attr->currdir, X_OK) == -1) { + /* chdir() in child wouldn't have worked */ + return errno; + } + } + + if (attr->cmdtype == APR_PROGRAM || + attr->cmdtype == APR_PROGRAM_ENV || + *progname == '/') { + /* for both of these values of cmdtype, caller must pass + * full path, so it is easy to check; + * caller can choose to pass full path for other + * values of cmdtype + */ + if (access(progname, R_OK|X_OK) == -1) { + /* exec*() in child wouldn't have worked */ + return errno; + } + } + else { + /* todo: search PATH for progname then try to access it */ + } + } + + if ((new->pid = fork()) < 0) { + return errno; + } + else if (new->pid == 0) { + int status; + /* child process */ + + /* + * If we do exec cleanup before the dup2() calls to set up pipes + * on 0-2, we accidentally close the pipes used by programs like + * mod_cgid. + * + * If we do exec cleanup after the dup2() calls, cleanup can accidentally + * close our pipes which replaced any files which previously had + * descriptors 0-2. + * + * The solution is to kill the cleanup for the pipes, then do + * exec cleanup, then do the dup2() calls. + */ + + if (attr->child_in) { + apr_pool_cleanup_kill(apr_file_pool_get(attr->child_in), + attr->child_in, apr_unix_file_cleanup); + } + + if (attr->child_out) { + apr_pool_cleanup_kill(apr_file_pool_get(attr->child_out), + attr->child_out, apr_unix_file_cleanup); + } + + if (attr->child_err) { + apr_pool_cleanup_kill(apr_file_pool_get(attr->child_err), + attr->child_err, apr_unix_file_cleanup); + } + + apr_pool_cleanup_for_exec(); + + if (attr->child_in) { + apr_file_close(attr->parent_in); + dup2(attr->child_in->filedes, STDIN_FILENO); + apr_file_close(attr->child_in); + } + + if (attr->child_out) { + apr_file_close(attr->parent_out); + dup2(attr->child_out->filedes, STDOUT_FILENO); + apr_file_close(attr->child_out); + } + + if (attr->child_err) { + apr_file_close(attr->parent_err); + dup2(attr->child_err->filedes, STDERR_FILENO); + apr_file_close(attr->child_err); + } + + apr_signal(SIGCHLD, SIG_DFL); /* not sure if this is needed or not */ + + if (attr->currdir != NULL) { + if (chdir(attr->currdir) == -1) { + if (attr->errfn) { + attr->errfn(pool, errno, "change of working directory failed"); + } + exit(-1); /* We have big problems, the child should exit. */ + } + } + + if ((status = limit_proc(attr)) != APR_SUCCESS) { + if (attr->errfn) { + attr->errfn(pool, errno, "setting of resource limits failed"); + } + exit(-1); /* We have big problems, the child should exit. */ + } + + if (attr->cmdtype == APR_SHELLCMD || + attr->cmdtype == APR_SHELLCMD_ENV) { + int onearg_len = 0; + const char *newargs[4]; + + newargs[0] = SHELL_PATH; + newargs[1] = "-c"; + + i = 0; + while (args[i]) { + onearg_len += strlen(args[i]); + onearg_len++; /* for space delimiter */ + i++; + } + + switch(i) { + case 0: + /* bad parameters; we're doomed */ + break; + case 1: + /* no args, or caller already built a single string from + * progname and args + */ + newargs[2] = args[0]; + break; + default: + { + char *ch, *onearg; + + ch = onearg = apr_palloc(pool, onearg_len); + i = 0; + while (args[i]) { + size_t len = strlen(args[i]); + + memcpy(ch, args[i], len); + ch += len; + *ch = ' '; + ++ch; + ++i; + } + --ch; /* back up to trailing blank */ + *ch = '\0'; + newargs[2] = onearg; + } + } + + newargs[3] = NULL; + + if (attr->detached) { + apr_proc_detach(APR_PROC_DETACH_DAEMONIZE); + } + + if (attr->cmdtype == APR_SHELLCMD) { + execve(SHELL_PATH, (char * const *) newargs, (char * const *)env); + } + else { + execv(SHELL_PATH, (char * const *)newargs); + } + } + else if (attr->cmdtype == APR_PROGRAM) { + if (attr->detached) { + apr_proc_detach(APR_PROC_DETACH_DAEMONIZE); + } + + execve(progname, (char * const *)args, (char * const *)env); + } + else if (attr->cmdtype == APR_PROGRAM_ENV) { + if (attr->detached) { + apr_proc_detach(APR_PROC_DETACH_DAEMONIZE); + } + + execv(progname, (char * const *)args); + } + else { + /* APR_PROGRAM_PATH */ + if (attr->detached) { + apr_proc_detach(APR_PROC_DETACH_DAEMONIZE); + } + + execvp(progname, (char * const *)args); + } + if (attr->errfn) { + char *desc; + + desc = apr_psprintf(pool, "exec of '%s' failed", + progname); + attr->errfn(pool, errno, desc); + } + + exit(-1); /* if we get here, there is a problem, so exit with an + * error code. */ + } + + /* Parent process */ + if (attr->child_in) { + apr_file_close(attr->child_in); + } + + if (attr->child_out) { + apr_file_close(attr->child_out); + } + + if (attr->child_err) { + apr_file_close(attr->child_err); + } + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_proc_wait_all_procs(apr_proc_t *proc, + int *exitcode, + apr_exit_why_e *exitwhy, + apr_wait_how_e waithow, + apr_pool_t *p) +{ + proc->pid = -1; + return apr_proc_wait(proc, exitcode, exitwhy, waithow); +} + +APR_DECLARE(apr_status_t) apr_proc_wait(apr_proc_t *proc, + int *exitcode, apr_exit_why_e *exitwhy, + apr_wait_how_e waithow) +{ + pid_t pstatus; + int waitpid_options = WUNTRACED; + int exit_int; + int ignore; + apr_exit_why_e ignorewhy; + + if (exitcode == NULL) { + exitcode = &ignore; + } + + if (exitwhy == NULL) { + exitwhy = &ignorewhy; + } + + if (waithow != APR_WAIT) { + waitpid_options |= WNOHANG; + } + + do { + pstatus = waitpid(proc->pid, &exit_int, waitpid_options); + } while (pstatus < 0 && errno == EINTR); + + if (pstatus > 0) { + proc->pid = pstatus; + + if (WIFEXITED(exit_int)) { + *exitwhy = APR_PROC_EXIT; + *exitcode = WEXITSTATUS(exit_int); + } + else if (WIFSIGNALED(exit_int)) { + *exitwhy = APR_PROC_SIGNAL; + +#ifdef WCOREDUMP + if (WCOREDUMP(exit_int)) { + *exitwhy |= APR_PROC_SIGNAL_CORE; + } +#endif + + *exitcode = WTERMSIG(exit_int); + } + else { + /* unexpected condition */ + return APR_EGENERAL; + } + + return APR_CHILD_DONE; + } + else if (pstatus == 0) { + return APR_CHILD_NOTDONE; + } + + return errno; +} + +APR_DECLARE(apr_status_t) apr_procattr_limit_set(apr_procattr_t *attr, + apr_int32_t what, + struct rlimit *limit) +{ + switch(what) { + case APR_LIMIT_CPU: +#ifdef RLIMIT_CPU + attr->limit_cpu = limit; + break; +#else + return APR_ENOTIMPL; +#endif + + case APR_LIMIT_MEM: +#if defined (RLIMIT_DATA) || defined (RLIMIT_VMEM) || defined(RLIMIT_AS) + attr->limit_mem = limit; + break; +#else + return APR_ENOTIMPL; +#endif + + case APR_LIMIT_NPROC: +#ifdef RLIMIT_NPROC + attr->limit_nproc = limit; + break; +#else + return APR_ENOTIMPL; +#endif + + case APR_LIMIT_NOFILE: +#ifdef RLIMIT_NOFILE + attr->limit_nofile = limit; + break; +#else + return APR_ENOTIMPL; +#endif + + } + + return APR_SUCCESS; +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/proc.lo b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/proc.lo new file mode 100644 index 00000000..25a271a8 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/proc.lo @@ -0,0 +1,12 @@ +# proc.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/proc.o' + +# Name of the non-PIC object. +non_pic_object='proc.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/proc.o b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/proc.o new file mode 100644 index 0000000000000000000000000000000000000000..ee7cc330dcb4bf299295bc9bb44d4ef81e0da541 GIT binary patch literal 37496 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 TtcTa-?HbPW^DYhNdFg)vJh{ef literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/procsup.c b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/procsup.c new file mode 100644 index 00000000..e7b111bb --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/procsup.c @@ -0,0 +1,101 @@ +/* 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. + */ + +#include "apr_arch_threadproc.h" + +APR_DECLARE(apr_status_t) apr_proc_detach(int daemonize) +{ + int x; + + chdir("/"); +#if !defined(MPE) && !defined(OS2) && !defined(TPF) && !defined(BEOS) + /* Don't detach for MPE because child processes can't survive the death of + * the parent. */ + if (daemonize) { + if ((x = fork()) > 0) { + exit(0); + } + else if (x == -1) { + perror("fork"); + fprintf(stderr, "unable to fork new process\n"); + exit(1); /* we can't do anything here, so just exit. */ + } + /* RAISE_SIGSTOP(DETACH); */ + } +#endif + +#ifdef HAVE_SETSID + /* A setsid() failure is not fatal if we didn't just fork(). + * The calling process may be the process group leader, in + * which case setsid() will fail with EPERM. + */ + if (setsid() == -1 && daemonize) { + return errno; + } +#elif defined(NEXT) || defined(NEWSOS) + if (setpgrp(0, getpid()) == -1) { + return errno; + } +#elif defined(OS2) || defined(TPF) || defined(MPE) + /* do nothing */ +#else + if (setpgid(0, 0) == -1) { + return errno; + } +#endif + + /* close out the standard file descriptors */ + if (freopen("/dev/null", "r", stdin) == NULL) { + return errno; + /* continue anyhow -- note we can't close out descriptor 0 because we + * have nothing to replace it with, and if we didn't have a descriptor + * 0 the next file would be created with that value ... leading to + * havoc. + */ + } + if (freopen("/dev/null", "w", stdout) == NULL) { + return errno; + } + /* We are going to reopen this again in a little while to the error + * log file, but better to do it twice and suffer a small performance + * hit for consistancy than not reopen it here. + */ + if (freopen("/dev/null", "w", stderr) == NULL) { + return errno; + } + return APR_SUCCESS; +} + +#if (!HAVE_WAITPID) +/* From ikluft@amdahl.com + * this is not ideal but it works for SVR3 variants + * Modified by dwd@bell-labs.com to call wait3 instead of wait because + * apache started to use the WNOHANG option. + */ +int waitpid(pid_t pid, int *statusp, int options) +{ + int tmp_pid; + if (kill(pid, 0) == -1) { + errno = ECHILD; + return -1; + } + while (((tmp_pid = wait3(statusp, options, 0)) != pid) && + (tmp_pid != -1) && (tmp_pid != 0) && (pid != -1)) + ; + return tmp_pid; +} +#endif + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/procsup.lo b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/procsup.lo new file mode 100644 index 00000000..97676e24 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/procsup.lo @@ -0,0 +1,12 @@ +# procsup.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/procsup.o' + +# Name of the non-PIC object. +non_pic_object='procsup.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/procsup.o b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/procsup.o new file mode 100644 index 0000000000000000000000000000000000000000..1fb7b4632732fb7f5aea45a0d3f271a778475ac6 GIT binary patch literal 9216 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/signals.c b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/signals.c new file mode 100644 index 00000000..ac0997f0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/signals.c @@ -0,0 +1,433 @@ +/* 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. + */ + +#define INCL_DOSEXCEPTIONS /* for OS2 */ +#include "apr_arch_threadproc.h" +#include "apr_private.h" +#include "apr_pools.h" +#include "apr_signal.h" +#include "apr_strings.h" + +#include +#if APR_HAS_THREADS && APR_HAVE_PTHREAD_H +#include +#endif + +APR_DECLARE(apr_status_t) apr_proc_kill(apr_proc_t *proc, int signum) +{ +#ifdef OS2 + /* SIGTERM's don't work too well in OS/2 (only affects other EMX + * programs). CGIs may not be, esp. REXX scripts, so use a native + * call instead + */ + if (signum == SIGTERM) { + return APR_OS2_STATUS(DosSendSignalException(proc->pid, + XCPT_SIGNAL_BREAK)); + } +#endif /* OS2 */ + + if (kill(proc->pid, signum) == -1) { + return errno; + } + + return APR_SUCCESS; +} + + +#if APR_HAVE_SIGACTION + +#ifdef DARWIN +static void avoid_zombies(int signo) +{ + int exit_status; + + while (waitpid(-1, &exit_status, WNOHANG) > 0) { + /* do nothing */ + } +} +#endif /* DARWIN */ + +/* + * Replace standard signal() with the more reliable sigaction equivalent + * from W. Richard Stevens' "Advanced Programming in the UNIX Environment" + * (the version that does not automatically restart system calls). + */ +APR_DECLARE(apr_sigfunc_t *) apr_signal(int signo, apr_sigfunc_t * func) +{ + struct sigaction act, oact; + + act.sa_handler = func; + sigemptyset(&act.sa_mask); + act.sa_flags = 0; +#ifdef SA_INTERRUPT /* SunOS */ + act.sa_flags |= SA_INTERRUPT; +#endif +#if defined(__osf__) && defined(__alpha) + /* XXX jeff thinks this should be enabled whenever SA_NOCLDWAIT is defined */ + + /* this is required on Tru64 to cause child processes to + * disappear gracefully - XPG4 compatible + */ + if ((signo == SIGCHLD) && (func == SIG_IGN)) { + act.sa_flags |= SA_NOCLDWAIT; + } +#endif +#ifdef DARWIN + /* ignoring SIGCHLD or leaving the default disposition doesn't avoid zombies, + * and there is no SA_NOCLDWAIT flag, so catch the signal and reap status in + * the handler to avoid zombies + */ + if ((signo == SIGCHLD) && (func == SIG_IGN)) { + act.sa_handler = avoid_zombies; + } +#endif + if (sigaction(signo, &act, &oact) < 0) + return SIG_ERR; + return oact.sa_handler; +} + +#endif /* HAVE_SIGACTION */ + +/* AC_DECL_SYS_SIGLIST defines either of these symbols depending + * on the version of autoconf used. */ +#if defined(SYS_SIGLIST_DECLARED) || HAVE_DECL_SYS_SIGLIST + +void apr_signal_init(apr_pool_t *pglobal) +{ +} +const char *apr_signal_description_get(int signum) +{ + return sys_siglist[signum]; +} + +#else /* !(SYS_SIGLIST_DECLARED || HAVE_DECL_SYS_SIGLIST) */ + +/* we need to roll our own signal description stuff */ + +#if defined(NSIG) +#define APR_NUMSIG NSIG +#elif defined(_NSIG) +#define APR_NUMSIG _NSIG +#elif defined(__NSIG) +#define APR_NUMSIG __NSIG +#else +#define APR_NUMSIG 33 /* breaks on OS/390 with < 33; 32 is o.k. for most */ +#endif + +static const char *signal_description[APR_NUMSIG]; + +#define store_desc(index, string) \ + do { \ + if (index >= APR_NUMSIG) { \ + assert(index < APR_NUMSIG); \ + } \ + else { \ + signal_description[index] = string; \ + } \ + } while (0) + +void apr_signal_init(apr_pool_t *pglobal) +{ + int sig; + + store_desc(0, "Signal 0"); + +#ifdef SIGHUP + store_desc(SIGHUP, "Hangup"); +#endif +#ifdef SIGINT + store_desc(SIGINT, "Interrupt"); +#endif +#ifdef SIGQUIT + store_desc(SIGQUIT, "Quit"); +#endif +#ifdef SIGILL + store_desc(SIGILL, "Illegal instruction"); +#endif +#ifdef SIGTRAP + store_desc(SIGTRAP, "Trace/BPT trap"); +#endif +#ifdef SIGIOT + store_desc(SIGIOT, "IOT instruction"); +#endif +#ifdef SIGABRT + store_desc(SIGABRT, "Abort"); +#endif +#ifdef SIGEMT + store_desc(SIGEMT, "Emulator trap"); +#endif +#ifdef SIGFPE + store_desc(SIGFPE, "Arithmetic exception"); +#endif +#ifdef SIGKILL + store_desc(SIGKILL, "Killed"); +#endif +#ifdef SIGBUS + store_desc(SIGBUS, "Bus error"); +#endif +#ifdef SIGSEGV + store_desc(SIGSEGV, "Segmentation fault"); +#endif +#ifdef SIGSYS + store_desc(SIGSYS, "Bad system call"); +#endif +#ifdef SIGPIPE + store_desc(SIGPIPE, "Broken pipe"); +#endif +#ifdef SIGALRM + store_desc(SIGALRM, "Alarm clock"); +#endif +#ifdef SIGTERM + store_desc(SIGTERM, "Terminated"); +#endif +#ifdef SIGUSR1 + store_desc(SIGUSR1, "User defined signal 1"); +#endif +#ifdef SIGUSR2 + store_desc(SIGUSR2, "User defined signal 2"); +#endif +#ifdef SIGCLD + store_desc(SIGCLD, "Child status change"); +#endif +#ifdef SIGCHLD + store_desc(SIGCHLD, "Child status change"); +#endif +#ifdef SIGPWR + store_desc(SIGPWR, "Power-fail restart"); +#endif +#ifdef SIGWINCH + store_desc(SIGWINCH, "Window changed"); +#endif +#ifdef SIGURG + store_desc(SIGURG, "urgent socket condition"); +#endif +#ifdef SIGPOLL + store_desc(SIGPOLL, "Pollable event occurred"); +#endif +#ifdef SIGIO + store_desc(SIGIO, "socket I/O possible"); +#endif +#ifdef SIGSTOP + store_desc(SIGSTOP, "Stopped (signal)"); +#endif +#ifdef SIGTSTP + store_desc(SIGTSTP, "Stopped"); +#endif +#ifdef SIGCONT + store_desc(SIGCONT, "Continued"); +#endif +#ifdef SIGTTIN + store_desc(SIGTTIN, "Stopped (tty input)"); +#endif +#ifdef SIGTTOU + store_desc(SIGTTOU, "Stopped (tty output)"); +#endif +#ifdef SIGVTALRM + store_desc(SIGVTALRM, "virtual timer expired"); +#endif +#ifdef SIGPROF + store_desc(SIGPROF, "profiling timer expired"); +#endif +#ifdef SIGXCPU + store_desc(SIGXCPU, "exceeded cpu limit"); +#endif +#ifdef SIGXFSZ + store_desc(SIGXFSZ, "exceeded file size limit"); +#endif + + for (sig = 0; sig < APR_NUMSIG; ++sig) + if (signal_description[sig] == NULL) + signal_description[sig] = apr_psprintf(pglobal, "signal #%d", sig); +} + +const char *apr_signal_description_get(int signum) +{ + return + signum < APR_NUMSIG + ? signal_description[signum] + : "unknown signal (number)"; +} + +#endif /* SYS_SIGLIST_DECLARED || HAVE_DECL_SYS_SIGLIST */ + +#if APR_HAS_THREADS && (HAVE_SIGSUSPEND || APR_HAVE_SIGWAIT) && !defined(OS2) + +static void remove_sync_sigs(sigset_t *sig_mask) +{ +#ifdef SIGABRT + sigdelset(sig_mask, SIGABRT); +#endif +#ifdef SIGBUS + sigdelset(sig_mask, SIGBUS); +#endif +#ifdef SIGEMT + sigdelset(sig_mask, SIGEMT); +#endif +#ifdef SIGFPE + sigdelset(sig_mask, SIGFPE); +#endif +#ifdef SIGILL + sigdelset(sig_mask, SIGILL); +#endif +#ifdef SIGIOT + sigdelset(sig_mask, SIGIOT); +#endif +#ifdef SIGPIPE + sigdelset(sig_mask, SIGPIPE); +#endif +#ifdef SIGSEGV + sigdelset(sig_mask, SIGSEGV); +#endif +#ifdef SIGSYS + sigdelset(sig_mask, SIGSYS); +#endif +#ifdef SIGTRAP + sigdelset(sig_mask, SIGTRAP); +#endif + +/* the rest of the signals removed from the mask in this function + * absolutely must be removed; you cannot block synchronous signals + * (requirement of pthreads API) + * + * SIGUSR2 is being removed from the mask for the convenience of + * Purify users (Solaris, HP-UX, SGI) since Purify uses SIGUSR2 + */ +#ifdef SIGUSR2 + sigdelset(sig_mask, SIGUSR2); +#endif +} + +APR_DECLARE(apr_status_t) apr_signal_thread(int(*signal_handler)(int signum)) +{ + sigset_t sig_mask; +#if APR_HAVE_SIGWAIT + int (*sig_func)(int signum) = (int (*)(int))signal_handler; +#endif + + /* This thread will be the one responsible for handling signals */ + sigfillset(&sig_mask); + + /* On certain platforms, sigwait() returns EINVAL if any of various + * unblockable signals are included in the mask. This was first + * observed on AIX and Tru64. + */ +#ifdef SIGKILL + sigdelset(&sig_mask, SIGKILL); +#endif +#ifdef SIGSTOP + sigdelset(&sig_mask, SIGSTOP); +#endif +#ifdef SIGCONT + sigdelset(&sig_mask, SIGCONT); +#endif +#ifdef SIGWAITING + sigdelset(&sig_mask, SIGWAITING); +#endif + + /* no synchronous signals should be in the mask passed to sigwait() */ + remove_sync_sigs(&sig_mask); + + /* On AIX (4.3.3, at least), sigwait() won't wake up if the high- + * order bit of the second word of flags is turned on. sigdelset() + * returns an error when trying to turn this off, so we'll turn it + * off manually. + * + * Note that the private fields differ between 32-bit and 64-bit + * and even between _ALL_SOURCE and !_ALL_SOURCE. Except that on + * AIX 4.3 32-bit builds and 64-bit builds use the same definition. + * + * Applicable AIX fixes such that this is no longer needed: + * + * APAR IY23096 for AIX 51B, fix included in AIX 51C, and + * APAR IY24162 for 43X. + */ +#if defined(_AIX) +#if defined(__64BIT__) && defined(_AIXVERSION_510) +#ifdef _ALL_SOURCE + sig_mask.ss_set[3] &= 0x7FFFFFFF; +#else /* not _ALL_SOURCE */ + sig_mask.__ss_set[3] &= 0x7FFFFFFF; +#endif +#else /* not 64-bit build, or 64-bit build on 4.3 */ +#ifdef _ALL_SOURCE + sig_mask.hisigs &= 0x7FFFFFFF; +#else /* not _ALL_SOURCE */ + sig_mask.__hisigs &= 0x7FFFFFFF; +#endif +#endif +#endif /* _AIX */ + + while (1) { +#if APR_HAVE_SIGWAIT + int signal_received; + + if (apr_sigwait(&sig_mask, &signal_received) != 0) + { + /* handle sigwait() error here */ + } + + if (sig_func(signal_received) == 1) { + return APR_SUCCESS; + } +#elif HAVE_SIGSUSPEND + sigsuspend(&sig_mask); +#else +#error No apr_sigwait() and no sigsuspend() +#endif + } +} + +APR_DECLARE(apr_status_t) apr_setup_signal_thread(void) +{ + sigset_t sig_mask; + int rv; + + /* All threads should mask out signals to be handled by + * the thread doing sigwait(). + * + * No thread should ever block synchronous signals. + * See the Solaris man page for pthread_sigmask() for + * some information. Solaris chooses to knock out such + * processes when a blocked synchronous signal is + * delivered, skipping any registered signal handler. + * AIX doesn't call a signal handler either. At least + * one level of linux+glibc does call the handler even + * when the synchronous signal is blocked. + */ + sigfillset(&sig_mask); + remove_sync_sigs(&sig_mask); + +#if defined(SIGPROCMASK_SETS_THREAD_MASK) + if ((rv = sigprocmask(SIG_SETMASK, &sig_mask, NULL)) != 0) { + rv = errno; + } +#else + if ((rv = pthread_sigmask(SIG_SETMASK, &sig_mask, NULL)) != 0) { +#ifdef PTHREAD_SETS_ERRNO + rv = errno; +#endif + } +#endif + return rv; +} + +#endif + +/* Deprecated */ +const char *apr_signal_get_description(int signum) +{ + return apr_signal_description_get(signum); +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/signals.lo b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/signals.lo new file mode 100644 index 00000000..43a4057b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/signals.lo @@ -0,0 +1,12 @@ +# signals.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/signals.o' + +# Name of the non-PIC object. +non_pic_object='signals.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/signals.o b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/signals.o new file mode 100644 index 0000000000000000000000000000000000000000..0164202b30da352a2acd4e8c40ca42e6d5d6ba19 GIT binary patch literal 16360 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 B|2F^t literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/thread.c b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/thread.c new file mode 100644 index 00000000..d853818a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/thread.c @@ -0,0 +1,287 @@ +/* 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. + */ + +#include "apr.h" +#include "apr_portable.h" +#include "apr_arch_threadproc.h" + +#if APR_HAS_THREADS + +#if APR_HAVE_PTHREAD_H +APR_DECLARE(apr_status_t) apr_threadattr_create(apr_threadattr_t **new, + apr_pool_t *pool) +{ + apr_status_t stat; + + (*new) = (apr_threadattr_t *)apr_pcalloc(pool, sizeof(apr_threadattr_t)); + (*new)->attr = (pthread_attr_t *)apr_pcalloc(pool, sizeof(pthread_attr_t)); + + if ((*new) == NULL || (*new)->attr == NULL) { + return APR_ENOMEM; + } + + (*new)->pool = pool; + stat = pthread_attr_init((*new)->attr); + + if (stat == 0) { + return APR_SUCCESS; + } +#ifdef PTHREAD_SETS_ERRNO + stat = errno; +#endif + + return stat; +} + +APR_DECLARE(apr_status_t) apr_threadattr_detach_set(apr_threadattr_t *attr, + apr_int32_t on) +{ + apr_status_t stat; +#ifdef PTHREAD_ATTR_SETDETACHSTATE_ARG2_ADDR + int arg = on; + + if ((stat = pthread_attr_setdetachstate(attr->attr, &arg)) == 0) { +#else + if ((stat = pthread_attr_setdetachstate(attr->attr, on)) == 0) { +#endif + + return APR_SUCCESS; + } + else { +#ifdef PTHREAD_SETS_ERRNO + stat = errno; +#endif + + return stat; + } +} + +APR_DECLARE(apr_status_t) apr_threadattr_detach_get(apr_threadattr_t *attr) +{ + int state; + +#ifdef PTHREAD_ATTR_GETDETACHSTATE_TAKES_ONE_ARG + state = pthread_attr_getdetachstate(attr->attr); +#else + pthread_attr_getdetachstate(attr->attr, &state); +#endif + if (state == 1) + return APR_DETACH; + return APR_NOTDETACH; +} + +APR_DECLARE(apr_status_t) apr_threadattr_stacksize_set(apr_threadattr_t *attr, + apr_size_t stacksize) +{ + int stat; + + stat = pthread_attr_setstacksize(attr->attr, stacksize); + if (stat == 0) { + return APR_SUCCESS; + } +#ifdef PTHREAD_SETS_ERRNO + stat = errno; +#endif + + return stat; +} + +static void *dummy_worker(void *opaque) +{ + apr_thread_t *thread = (apr_thread_t*)opaque; + return thread->func(thread, thread->data); +} + +APR_DECLARE(apr_status_t) apr_thread_create(apr_thread_t **new, + apr_threadattr_t *attr, + apr_thread_start_t func, + void *data, + apr_pool_t *pool) +{ + apr_status_t stat; + pthread_attr_t *temp; + + (*new) = (apr_thread_t *)apr_pcalloc(pool, sizeof(apr_thread_t)); + + if ((*new) == NULL) { + return APR_ENOMEM; + } + + (*new)->td = (pthread_t *)apr_pcalloc(pool, sizeof(pthread_t)); + + if ((*new)->td == NULL) { + return APR_ENOMEM; + } + + (*new)->pool = pool; + (*new)->data = data; + (*new)->func = func; + + if (attr) + temp = attr->attr; + else + temp = NULL; + + stat = apr_pool_create(&(*new)->pool, pool); + if (stat != APR_SUCCESS) { + return stat; + } + + if ((stat = pthread_create((*new)->td, temp, dummy_worker, (*new))) == 0) { + return APR_SUCCESS; + } + else { +#ifdef PTHREAD_SETS_ERRNO + stat = errno; +#endif + + return stat; + } +} + +APR_DECLARE(apr_os_thread_t) apr_os_thread_current(void) +{ + return pthread_self(); +} + +APR_DECLARE(int) apr_os_thread_equal(apr_os_thread_t tid1, + apr_os_thread_t tid2) +{ + return pthread_equal(tid1, tid2); +} + +APR_DECLARE(apr_status_t) apr_thread_exit(apr_thread_t *thd, + apr_status_t retval) +{ + thd->exitval = retval; + apr_pool_destroy(thd->pool); + pthread_exit(NULL); + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_thread_join(apr_status_t *retval, + apr_thread_t *thd) +{ + apr_status_t stat; + apr_status_t *thread_stat; + + if ((stat = pthread_join(*thd->td,(void *)&thread_stat)) == 0) { + *retval = thd->exitval; + return APR_SUCCESS; + } + else { +#ifdef PTHREAD_SETS_ERRNO + stat = errno; +#endif + + return stat; + } +} + +APR_DECLARE(apr_status_t) apr_thread_detach(apr_thread_t *thd) +{ + apr_status_t stat; + +#ifdef PTHREAD_DETACH_ARG1_ADDR + if ((stat = pthread_detach(thd->td)) == 0) { +#else + if ((stat = pthread_detach(*thd->td)) == 0) { +#endif + + return APR_SUCCESS; + } + else { +#ifdef PTHREAD_SETS_ERRNO + stat = errno; +#endif + + return stat; + } +} + +void apr_thread_yield() +{ +} + +APR_DECLARE(apr_status_t) apr_thread_data_get(void **data, const char *key, + apr_thread_t *thread) +{ + return apr_pool_userdata_get(data, key, thread->pool); +} + +APR_DECLARE(apr_status_t) apr_thread_data_set(void *data, const char *key, + apr_status_t (*cleanup)(void *), + apr_thread_t *thread) +{ + return apr_pool_userdata_set(data, key, cleanup, thread->pool); +} + +APR_DECLARE(apr_status_t) apr_os_thread_get(apr_os_thread_t **thethd, + apr_thread_t *thd) +{ + *thethd = thd->td; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_os_thread_put(apr_thread_t **thd, + apr_os_thread_t *thethd, + apr_pool_t *pool) +{ + if (pool == NULL) { + return APR_ENOPOOL; + } + + if ((*thd) == NULL) { + (*thd) = (apr_thread_t *)apr_pcalloc(pool, sizeof(apr_thread_t)); + (*thd)->pool = pool; + } + + (*thd)->td = thethd; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_thread_once_init(apr_thread_once_t **control, + apr_pool_t *p) +{ + static const pthread_once_t once_init = PTHREAD_ONCE_INIT; + + *control = apr_palloc(p, sizeof(**control)); + (*control)->once = once_init; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_thread_once(apr_thread_once_t *control, + void (*func)(void)) +{ + return pthread_once(&control->once, func); +} + +APR_POOL_IMPLEMENT_ACCESSOR(thread) + +#endif /* HAVE_PTHREAD_H */ +#endif /* APR_HAS_THREADS */ + +#if !APR_HAS_THREADS + +/* avoid warning for no prototype */ +APR_DECLARE(apr_status_t) apr_os_thread_get(void); + +APR_DECLARE(apr_status_t) apr_os_thread_get(void) +{ + return APR_ENOTIMPL; +} + +#endif diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/thread.lo b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/thread.lo new file mode 100644 index 00000000..39686879 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/thread.lo @@ -0,0 +1,12 @@ +# thread.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/thread.o' + +# Name of the non-PIC object. +non_pic_object='thread.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/thread.o b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/thread.o new file mode 100644 index 0000000000000000000000000000000000000000..589dea35f4600d22e48cc4bdf7eb757e8c9142f4 GIT binary patch literal 22288 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/threadpriv.c b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/threadpriv.c new file mode 100644 index 00000000..c2785203 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/threadpriv.c @@ -0,0 +1,129 @@ +/* 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. + */ + +#include "apr.h" +#include "apr_portable.h" +#include "apr_arch_threadproc.h" + +#if APR_HAS_THREADS + +#if APR_HAVE_PTHREAD_H +APR_DECLARE(apr_status_t) apr_threadkey_private_create(apr_threadkey_t **key, + void (*dest)(void *), + apr_pool_t *pool) +{ + (*key) = (apr_threadkey_t *)apr_pcalloc(pool, sizeof(apr_threadkey_t)); + + if ((*key) == NULL) { + return APR_ENOMEM; + } + + (*key)->pool = pool; + + return pthread_key_create(&(*key)->key, dest); + +} + +APR_DECLARE(apr_status_t) apr_threadkey_private_get(void **new, + apr_threadkey_t *key) +{ +#ifdef PTHREAD_GETSPECIFIC_TAKES_TWO_ARGS + if (pthread_getspecific(key->key,new)) + *new = NULL; +#else + (*new) = pthread_getspecific(key->key); +#endif + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_threadkey_private_set(void *priv, + apr_threadkey_t *key) +{ + apr_status_t stat; + + if ((stat = pthread_setspecific(key->key, priv)) == 0) { + return APR_SUCCESS; + } + else { + return stat; + } +} + +APR_DECLARE(apr_status_t) apr_threadkey_private_delete(apr_threadkey_t *key) +{ +#ifdef HAVE_PTHREAD_KEY_DELETE + apr_status_t stat; + + if ((stat = pthread_key_delete(key->key)) == 0) { + return APR_SUCCESS; + } + + return stat; +#else + return APR_ENOTIMPL; +#endif +} + +APR_DECLARE(apr_status_t) apr_threadkey_data_get(void **data, const char *key, + apr_threadkey_t *threadkey) +{ + return apr_pool_userdata_get(data, key, threadkey->pool); +} + +APR_DECLARE(apr_status_t) apr_threadkey_data_set(void *data, const char *key, + apr_status_t (*cleanup)(void *), + apr_threadkey_t *threadkey) +{ + return apr_pool_userdata_set(data, key, cleanup, threadkey->pool); +} + +APR_DECLARE(apr_status_t) apr_os_threadkey_get(apr_os_threadkey_t *thekey, + apr_threadkey_t *key) +{ + *thekey = key->key; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_os_threadkey_put(apr_threadkey_t **key, + apr_os_threadkey_t *thekey, + apr_pool_t *pool) +{ + if (pool == NULL) { + return APR_ENOPOOL; + } + + if ((*key) == NULL) { + (*key) = (apr_threadkey_t *)apr_pcalloc(pool, sizeof(apr_threadkey_t)); + (*key)->pool = pool; + } + + (*key)->key = *thekey; + return APR_SUCCESS; +} +#endif /* APR_HAVE_PTHREAD_H */ +#endif /* APR_HAS_THREADS */ + +#if !APR_HAS_THREADS + +/* avoid warning for no prototype */ +APR_DECLARE(apr_status_t) apr_os_threadkey_get(void); + +APR_DECLARE(apr_status_t) apr_os_threadkey_get(void) +{ + return APR_ENOTIMPL; +} + +#endif diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/threadpriv.lo b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/threadpriv.lo new file mode 100644 index 00000000..a32c9d51 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/threadpriv.lo @@ -0,0 +1,12 @@ +# threadpriv.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/threadpriv.o' + +# Name of the non-PIC object. +non_pic_object='threadpriv.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/threadpriv.o b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/unix/threadpriv.o new file mode 100644 index 0000000000000000000000000000000000000000..fcf0f393fcbae792b847e7a58df808df867ec53a GIT binary patch literal 12216 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 a)$ntq^Yy`TS--6DXGrJgVdg(e_+J3Jte2_) literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/win32/proc.c b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/win32/proc.c new file mode 100644 index 00000000..df1b6404 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/win32/proc.c @@ -0,0 +1,874 @@ +/* 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. + */ + +#include "win32/apr_arch_threadproc.h" +#include "win32/apr_arch_file_io.h" + +#include "apr_thread_proc.h" +#include "apr_file_io.h" +#include "apr_general.h" +#include "apr_strings.h" +#include "apr_portable.h" +#include "apr_lib.h" +#include +#if APR_HAVE_SIGNAL_H +#include +#endif +#include +#if APR_HAVE_PROCESS_H +#include +#endif + +/* We have very carefully excluded volumes of definitions from the + * Microsoft Platform SDK, which kill the build time performance. + * These the sole constants we borrow from WinBase.h and WinUser.h + */ +#ifndef LOGON32_LOGON_NETWORK +#define LOGON32_LOGON_NETWORK 3 +#endif + +#ifdef _WIN32_WCE +#ifndef DETACHED_PROCESS +#define DETACHED_PROCESS 0 +#endif +#ifndef CREATE_UNICODE_ENVIRONMENT +#define CREATE_UNICODE_ENVIRONMENT 0 +#endif +#ifndef STARTF_USESHOWWINDOW +#define STARTF_USESHOWWINDOW 0 +#endif +#ifndef SW_HIDE +#define SW_HIDE 0 +#endif +#endif +/* + * some of the ideas expressed herein are based off of Microsoft + * Knowledge Base article: Q190351 + * + */ + +APR_DECLARE(apr_status_t) apr_procattr_create(apr_procattr_t **new, + apr_pool_t *pool) +{ + (*new) = (apr_procattr_t *)apr_pcalloc(pool, sizeof(apr_procattr_t)); + (*new)->pool = pool; + (*new)->cmdtype = APR_PROGRAM; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_procattr_io_set(apr_procattr_t *attr, + apr_int32_t in, + apr_int32_t out, + apr_int32_t err) +{ + apr_status_t stat = APR_SUCCESS; + + if (in) { + /* APR_CHILD_BLOCK maps to APR_WRITE_BLOCK, while + * APR_PARENT_BLOCK maps to APR_READ_BLOCK, so we + * must transpose the CHILD/PARENT blocking flags + * only for the stdin pipe. stdout/stderr naturally + * map to the correct mode. + */ + if (in == APR_CHILD_BLOCK) + in = APR_READ_BLOCK; + else if (in == APR_PARENT_BLOCK) + in = APR_WRITE_BLOCK; + + stat = apr_create_nt_pipe(&attr->child_in, &attr->parent_in, + in, attr->pool); + if (stat == APR_SUCCESS) + stat = apr_file_inherit_unset(attr->parent_in); + } + if (out && stat == APR_SUCCESS) { + stat = apr_create_nt_pipe(&attr->parent_out, &attr->child_out, + out, attr->pool); + if (stat == APR_SUCCESS) + stat = apr_file_inherit_unset(attr->parent_out); + } + if (err && stat == APR_SUCCESS) { + stat = apr_create_nt_pipe(&attr->parent_err, &attr->child_err, + err, attr->pool); + if (stat == APR_SUCCESS) + stat = apr_file_inherit_unset(attr->parent_err); + } + return stat; +} + +APR_DECLARE(apr_status_t) apr_procattr_child_in_set(apr_procattr_t *attr, + apr_file_t *child_in, + apr_file_t *parent_in) +{ + apr_status_t rv = APR_SUCCESS; + + if (child_in) { + if (attr->child_in == NULL) + rv = apr_file_dup(&attr->child_in, child_in, attr->pool); + else + rv = apr_file_dup2(attr->child_in, child_in, attr->pool); + + if (rv == APR_SUCCESS) + rv = apr_file_inherit_set(attr->child_in); + } + + if (parent_in && rv == APR_SUCCESS) { + if (attr->parent_in == NULL) + rv = apr_file_dup(&attr->parent_in, parent_in, attr->pool); + else + rv = apr_file_dup2(attr->parent_in, parent_in, attr->pool); + } + + return rv; +} + +APR_DECLARE(apr_status_t) apr_procattr_child_out_set(apr_procattr_t *attr, + apr_file_t *child_out, + apr_file_t *parent_out) +{ + apr_status_t rv = APR_SUCCESS; + + if (child_out) { + if (attr->child_out == NULL) + rv = apr_file_dup(&attr->child_out, child_out, attr->pool); + else + rv = apr_file_dup2(attr->child_out, child_out, attr->pool); + + if (rv == APR_SUCCESS) + rv = apr_file_inherit_set(attr->child_out); + } + + if (parent_out && rv == APR_SUCCESS) { + if (attr->parent_out == NULL) + rv = apr_file_dup(&attr->parent_out, parent_out, attr->pool); + else + rv = apr_file_dup2(attr->parent_out, parent_out, attr->pool); + } + + return rv; +} + +APR_DECLARE(apr_status_t) apr_procattr_child_err_set(apr_procattr_t *attr, + apr_file_t *child_err, + apr_file_t *parent_err) +{ + apr_status_t rv = APR_SUCCESS; + + if (child_err) { + if (attr->child_err == NULL) + rv = apr_file_dup(&attr->child_err, child_err, attr->pool); + else + rv = apr_file_dup2(attr->child_err, child_err, attr->pool); + + if (rv == APR_SUCCESS) + rv = apr_file_inherit_set(attr->child_err); + } + + if (parent_err && rv == APR_SUCCESS) { + if (attr->parent_err == NULL) + rv = apr_file_dup(&attr->parent_err, parent_err, attr->pool); + else + rv = apr_file_dup2(attr->parent_err, parent_err, attr->pool); + } + + return rv; +} + +APR_DECLARE(apr_status_t) apr_procattr_dir_set(apr_procattr_t *attr, + const char *dir) +{ + /* curr dir must be in native format, there are all sorts of bugs in + * the NT library loading code that flunk the '/' parsing test. + */ + return apr_filepath_merge(&attr->currdir, NULL, dir, + APR_FILEPATH_NATIVE, attr->pool); +} + +APR_DECLARE(apr_status_t) apr_procattr_cmdtype_set(apr_procattr_t *attr, + apr_cmdtype_e cmd) +{ + attr->cmdtype = cmd; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_procattr_detach_set(apr_procattr_t *attr, + apr_int32_t det) +{ + attr->detached = det; + return APR_SUCCESS; +} + +static const char* has_space(const char *str) +{ + const char *ch; + for (ch = str; *ch; ++ch) { + if (apr_isspace(*ch)) { + return ch; + } + } + return NULL; +} + +static char *apr_caret_escape_args(apr_pool_t *p, const char *str) +{ + char *cmd; + unsigned char *d; + const unsigned char *s; + + cmd = apr_palloc(p, 2 * strlen(str) + 1); /* Be safe */ + d = (unsigned char *)cmd; + s = (const unsigned char *)str; + for (; *s; ++s) { + + /* + * Newlines to Win32/OS2 CreateProcess() are ill advised. + * Convert them to spaces since they are effectively white + * space to most applications + */ + if (*s == '\r' || *s == '\n') { + *d++ = ' '; + continue; + } + + if (IS_SHCHAR(*s)) { + *d++ = '^'; + } + *d++ = *s; + } + *d = '\0'; + + return cmd; +} + +APR_DECLARE(apr_status_t) apr_procattr_child_errfn_set(apr_procattr_t *attr, + apr_child_errfn_t *errfn) +{ + attr->errfn = errfn; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_procattr_error_check_set(apr_procattr_t *attr, + apr_int32_t chk) +{ + attr->errchk = chk; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_procattr_addrspace_set(apr_procattr_t *attr, + apr_int32_t addrspace) +{ + /* won't ever be used on this platform, so don't save the flag */ + return APR_SUCCESS; +} + +#if APR_HAS_UNICODE_FS && !defined(_WIN32_WCE) + +/* Used only for the NT code path, a critical section is the fastest + * implementation available. + */ +static CRITICAL_SECTION proc_lock; + +static apr_status_t threadproc_global_cleanup(void *ignored) +{ + DeleteCriticalSection(&proc_lock); + return APR_SUCCESS; +} + +/* Called from apr_initialize, we need a critical section to handle + * the pipe inheritance on win32. This will mutex any process create + * so as we change our inherited pipes, we prevent another process from + * also inheriting those alternate handles, and prevent the other process + * from failing to inherit our standard handles. + */ +apr_status_t apr_threadproc_init(apr_pool_t *pool) +{ + IF_WIN_OS_IS_UNICODE + { + InitializeCriticalSection(&proc_lock); + /* register the cleanup */ + apr_pool_cleanup_register(pool, &proc_lock, + threadproc_global_cleanup, + apr_pool_cleanup_null); + } + return APR_SUCCESS; +} + +#else /* !APR_HAS_UNICODE_FS || defined(_WIN32_WCE) */ + +apr_status_t apr_threadproc_init(apr_pool_t *pool) +{ + return APR_SUCCESS; +} + +#endif + +APR_DECLARE(apr_status_t) apr_proc_create(apr_proc_t *new, + const char *progname, + const char * const *args, + const char * const *env, + apr_procattr_t *attr, + apr_pool_t *pool) +{ + apr_status_t rv; + apr_size_t i; + const char *argv0; + char *cmdline; + char *pEnvBlock; + PROCESS_INFORMATION pi; + DWORD dwCreationFlags = 0; + + new->in = attr->parent_in; + new->out = attr->parent_out; + new->err = attr->parent_err; + + if (attr->detached) { + /* If we are creating ourselves detached, Then we should hide the + * window we are starting in. And we had better redfine our + * handles for STDIN, STDOUT, and STDERR. Do not set the + * detached attribute for Win9x. We have found that Win9x does + * not manage the stdio handles properly when running old 16 + * bit executables if the detached attribute is set. + */ + if (apr_os_level >= APR_WIN_NT) { + /* + * XXX DETACHED_PROCESS won't on Win9x at all; on NT/W2K + * 16 bit executables fail (MS KB: Q150956) + */ + dwCreationFlags |= DETACHED_PROCESS; + } + } + + /* progname must be unquoted, in native format, as there are all sorts + * of bugs in the NT library loader code that fault when parsing '/'. + * XXX progname must be NULL if this is a 16 bit app running in WOW + */ + if (progname[0] == '\"') { + progname = apr_pstrndup(pool, progname + 1, strlen(progname) - 2); + } + + if (attr->cmdtype == APR_PROGRAM || attr->cmdtype == APR_PROGRAM_ENV) { + char *fullpath = NULL; + if ((rv = apr_filepath_merge(&fullpath, attr->currdir, progname, + APR_FILEPATH_NATIVE, pool)) != APR_SUCCESS) { + if (attr->errfn) { + attr->errfn(pool, rv, + apr_pstrcat(pool, "filepath_merge failed.", + " currdir: ", attr->currdir, + " progname: ", progname,NULL)); + } + return rv; + } + progname = fullpath; + } + else { + /* Do not fail if the path isn't parseable for APR_PROGRAM_PATH + * or APR_SHELLCMD. We only invoke apr_filepath_merge (with no + * left hand side expression) in order to correct the path slash + * delimiters. But the filename doesn't need to be in the CWD, + * nor does it need to be a filename at all (it could be a + * built-in shell command.) + */ + char *fullpath = NULL; + if ((rv = apr_filepath_merge(&fullpath, "", progname, + APR_FILEPATH_NATIVE, pool)) == APR_SUCCESS) { + progname = fullpath; + } + } + + if (has_space(progname)) { + argv0 = apr_pstrcat(pool, "\"", progname, "\"", NULL); + } + else { + argv0 = progname; + } + + /* Handle the args, seperate from argv0 */ + cmdline = ""; + for (i = 1; args && args[i]; ++i) { + if (has_space(args[i]) || !args[i][0]) { + cmdline = apr_pstrcat(pool, cmdline, " \"", args[i], "\"", NULL); + } + else { + cmdline = apr_pstrcat(pool, cmdline, " ", args[i], NULL); + } + } + +#ifndef _WIN32_WCE + if (attr->cmdtype == APR_SHELLCMD || attr->cmdtype == APR_SHELLCMD_ENV) { + char *shellcmd = getenv("COMSPEC"); + if (!shellcmd) { + if (attr->errfn) { + attr->errfn(pool, APR_EINVAL, "COMSPEC envar is not set"); + } + return APR_EINVAL; + } + if (shellcmd[0] == '"') { + progname = apr_pstrndup(pool, shellcmd + 1, strlen(shellcmd) - 2); + } + else { + progname = shellcmd; + if (has_space(shellcmd)) { + shellcmd = apr_pstrcat(pool, "\"", shellcmd, "\"", NULL); + } + } + /* Command.com does not support a quoted command, while cmd.exe demands one. + */ + i = strlen(progname); + if (i >= 11 && strcasecmp(progname + i - 11, "command.com") == 0) { + cmdline = apr_pstrcat(pool, shellcmd, " /C ", argv0, cmdline, NULL); + } + else { + cmdline = apr_pstrcat(pool, shellcmd, " /C \"", argv0, cmdline, "\"", NULL); + } + } + else +#endif + { +#if defined(_WIN32_WCE) + { +#else + /* Win32 is _different_ than unix. While unix will find the given + * program since it's already chdir'ed, Win32 cannot since the parent + * attempts to open the program with it's own path. + * ###: This solution isn't much better - it may defeat path searching + * when the path search was desired. Open to further discussion. + */ + i = strlen(progname); + if (i >= 4 && (strcasecmp(progname + i - 4, ".bat") == 0 + || strcasecmp(progname + i - 4, ".cmd") == 0)) + { + char *shellcmd = getenv("COMSPEC"); + if (!shellcmd) { + if (attr->errfn) { + attr->errfn(pool, APR_EINVAL, "COMSPEC envar is not set"); + } + return APR_EINVAL; + } + if (shellcmd[0] == '"') { + progname = apr_pstrndup(pool, shellcmd + 1, strlen(shellcmd) - 2); + } + else { + progname = shellcmd; + if (has_space(shellcmd)) { + shellcmd = apr_pstrcat(pool, "\"", shellcmd, "\"", NULL); + } + } + i = strlen(progname); + if (i >= 11 && strcasecmp(progname + i - 11, "command.com") == 0) { + /* XXX: Still insecure - need doubled-quotes on each individual + * arg of cmdline. Suspect we need to postpone cmdline parsing + * until this moment in all four code paths, with some flags + * to toggle 'which flavor' is needed. + */ + cmdline = apr_pstrcat(pool, shellcmd, " /C ", argv0, cmdline, NULL); + } + else { + /* We must protect the cmdline args from any interpolation - this + * is not a shellcmd, and the source of argv[] is untrusted. + * Notice we escape ALL the cmdline args, including the quotes + * around the individual args themselves. No sense in allowing + * the shift-state to be toggled, and the application will + * not see the caret escapes. + */ + cmdline = apr_caret_escape_args(pool, cmdline); + /* + * Our app name must always be quoted so the quotes surrounding + * the entire /c "command args" are unambigious. + */ + if (*argv0 != '"') { + cmdline = apr_pstrcat(pool, shellcmd, " /C \"\"", argv0, "\"", cmdline, "\"", NULL); + } + else { + cmdline = apr_pstrcat(pool, shellcmd, " /C \"", argv0, cmdline, "\"", NULL); + } + } + } + else { +#endif + /* A simple command we are directly invoking. Do not pass + * the first arg to CreateProc() for APR_PROGRAM_PATH + * invocation, since it would need to be a literal and + * complete file path. That is; "c:\bin\aprtest.exe" + * would succeed, but "c:\bin\aprtest" or "aprtest.exe" + * can fail. + */ + cmdline = apr_pstrcat(pool, argv0, cmdline, NULL); + + if (attr->cmdtype == APR_PROGRAM_PATH) { + progname = NULL; + } + } + } + + if (!env || attr->cmdtype == APR_PROGRAM_ENV || + attr->cmdtype == APR_SHELLCMD_ENV) { + pEnvBlock = NULL; + } + else { + apr_size_t iEnvBlockLen; + /* + * Win32's CreateProcess call requires that the environment + * be passed in an environment block, a null terminated block of + * null terminated strings. + */ + i = 0; + iEnvBlockLen = 1; + while (env[i]) { + iEnvBlockLen += strlen(env[i]) + 1; + i++; + } + if (!i) + ++iEnvBlockLen; + +#if APR_HAS_UNICODE_FS + IF_WIN_OS_IS_UNICODE + { + apr_wchar_t *pNext; + pEnvBlock = (char *)apr_palloc(pool, iEnvBlockLen * 2); + dwCreationFlags |= CREATE_UNICODE_ENVIRONMENT; + + i = 0; + pNext = (apr_wchar_t*)pEnvBlock; + while (env[i]) { + apr_size_t in = strlen(env[i]) + 1; + if ((rv = apr_conv_utf8_to_ucs2(env[i], &in, + pNext, &iEnvBlockLen)) + != APR_SUCCESS) { + if (attr->errfn) { + attr->errfn(pool, rv, + apr_pstrcat(pool, + "utf8 to ucs2 conversion failed" + " on this string: ", env[i], NULL)); + } + return rv; + } + pNext = wcschr(pNext, L'\0') + 1; + i++; + } + if (!i) + *(pNext++) = L'\0'; + *pNext = L'\0'; + } +#endif /* APR_HAS_UNICODE_FS */ +#if APR_HAS_ANSI_FS + ELSE_WIN_OS_IS_ANSI + { + char *pNext; + pEnvBlock = (char *)apr_palloc(pool, iEnvBlockLen); + + i = 0; + pNext = pEnvBlock; + while (env[i]) { + strcpy(pNext, env[i]); + pNext = strchr(pNext, '\0') + 1; + i++; + } + if (!i) + *(pNext++) = '\0'; + *pNext = '\0'; + } +#endif /* APR_HAS_ANSI_FS */ + } + + new->invoked = cmdline; + +#if APR_HAS_UNICODE_FS + IF_WIN_OS_IS_UNICODE + { + STARTUPINFOW si; + DWORD stdin_reset = 0; + DWORD stdout_reset = 0; + DWORD stderr_reset = 0; + apr_wchar_t *wprg = NULL; + apr_wchar_t *wcmd = NULL; + apr_wchar_t *wcwd = NULL; + + if (progname) { + apr_size_t nprg = strlen(progname) + 1; + apr_size_t nwprg = nprg + 6; + wprg = apr_palloc(pool, nwprg * sizeof(wprg[0])); + if ((rv = apr_conv_utf8_to_ucs2(progname, &nprg, wprg, &nwprg)) + != APR_SUCCESS) { + if (attr->errfn) { + attr->errfn(pool, rv, + apr_pstrcat(pool, + "utf8 to ucs2 conversion failed" + " on progname: ", progname, NULL)); + } + return rv; + } + } + + if (cmdline) { + apr_size_t ncmd = strlen(cmdline) + 1; + apr_size_t nwcmd = ncmd; + wcmd = apr_palloc(pool, nwcmd * sizeof(wcmd[0])); + if ((rv = apr_conv_utf8_to_ucs2(cmdline, &ncmd, wcmd, &nwcmd)) + != APR_SUCCESS) { + if (attr->errfn) { + attr->errfn(pool, rv, + apr_pstrcat(pool, + "utf8 to ucs2 conversion failed" + " on cmdline: ", cmdline, NULL)); + } + return rv; + } + } + + if (attr->currdir) + { + apr_size_t ncwd = strlen(attr->currdir) + 1; + apr_size_t nwcwd = ncwd; + wcwd = apr_palloc(pool, ncwd * sizeof(wcwd[0])); + if ((rv = apr_conv_utf8_to_ucs2(attr->currdir, &ncwd, + wcwd, &nwcwd)) + != APR_SUCCESS) { + if (attr->errfn) { + attr->errfn(pool, rv, + apr_pstrcat(pool, + "utf8 to ucs2 conversion failed" + " on currdir: ", attr->currdir, NULL)); + } + return rv; + } + } + + memset(&si, 0, sizeof(si)); + si.cb = sizeof(si); + + if (attr->detached) { + si.dwFlags |= STARTF_USESHOWWINDOW; + si.wShowWindow = SW_HIDE; + } + +#ifndef _WIN32_WCE + /* LOCK CRITICAL SECTION + * before we begin to manipulate the inherited handles + */ + EnterCriticalSection(&proc_lock); + + if ((attr->child_in && attr->child_in->filehand) + || (attr->child_out && attr->child_out->filehand) + || (attr->child_err && attr->child_err->filehand)) + { + si.dwFlags |= STARTF_USESTDHANDLES; + + si.hStdInput = GetStdHandle(STD_INPUT_HANDLE); + if (GetHandleInformation(si.hStdInput, &stdin_reset) + && (stdin_reset &= HANDLE_FLAG_INHERIT)) + SetHandleInformation(si.hStdInput, + HANDLE_FLAG_INHERIT, 0); + + if (attr->child_in && attr->child_in->filehand) + { + si.hStdInput = attr->child_in->filehand; + SetHandleInformation(si.hStdInput, HANDLE_FLAG_INHERIT, + HANDLE_FLAG_INHERIT); + } + else + si.hStdInput = INVALID_HANDLE_VALUE; + + si.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE); + if (GetHandleInformation(si.hStdOutput, &stdout_reset) + && (stdout_reset &= HANDLE_FLAG_INHERIT)) + SetHandleInformation(si.hStdOutput, + HANDLE_FLAG_INHERIT, 0); + + if (attr->child_out && attr->child_out->filehand) + { + si.hStdOutput = attr->child_out->filehand; + SetHandleInformation(si.hStdOutput, HANDLE_FLAG_INHERIT, + HANDLE_FLAG_INHERIT); + } + else + si.hStdOutput = INVALID_HANDLE_VALUE; + + si.hStdError = GetStdHandle(STD_ERROR_HANDLE); + if (GetHandleInformation(si.hStdError, &stderr_reset) + && (stderr_reset &= HANDLE_FLAG_INHERIT)) + SetHandleInformation(si.hStdError, + HANDLE_FLAG_INHERIT, 0); + + if (attr->child_err && attr->child_err->filehand) + { + si.hStdError = attr->child_err->filehand; + SetHandleInformation(si.hStdError, HANDLE_FLAG_INHERIT, + HANDLE_FLAG_INHERIT); + } + else + si.hStdError = INVALID_HANDLE_VALUE; + } + rv = CreateProcessW(wprg, wcmd, /* Executable & Command line */ + NULL, NULL, /* Proc & thread security attributes */ + TRUE, /* Inherit handles */ + dwCreationFlags, /* Creation flags */ + pEnvBlock, /* Environment block */ + wcwd, /* Current directory name */ + &si, &pi); + + if ((attr->child_in && attr->child_in->filehand) + || (attr->child_out && attr->child_out->filehand) + || (attr->child_err && attr->child_err->filehand)) + { + if (stdin_reset) + SetHandleInformation(GetStdHandle(STD_INPUT_HANDLE), + stdin_reset, stdin_reset); + + if (stdout_reset) + SetHandleInformation(GetStdHandle(STD_OUTPUT_HANDLE), + stdout_reset, stdout_reset); + + if (stderr_reset) + SetHandleInformation(GetStdHandle(STD_ERROR_HANDLE), + stderr_reset, stderr_reset); + } + /* RELEASE CRITICAL SECTION + * The state of the inherited handles has been restored. + */ + LeaveCriticalSection(&proc_lock); + +#else /* defined(_WIN32_WCE) */ + rv = CreateProcessW(wprg, wcmd, /* Executable & Command line */ + NULL, NULL, /* Proc & thread security attributes */ + FALSE, /* must be 0 */ + dwCreationFlags, /* Creation flags */ + NULL, /* Environment block must be NULL */ + NULL, /* Current directory name must be NULL*/ + NULL, /* STARTUPINFO not supported */ + &pi); +#endif + } +#endif /* APR_HAS_UNICODE_FS */ +#if APR_HAS_ANSI_FS + ELSE_WIN_OS_IS_ANSI + { + STARTUPINFOA si; + memset(&si, 0, sizeof(si)); + si.cb = sizeof(si); + + if (attr->detached) { + si.dwFlags |= STARTF_USESHOWWINDOW; + si.wShowWindow = SW_HIDE; + } + + if ((attr->child_in && attr->child_in->filehand) + || (attr->child_out && attr->child_out->filehand) + || (attr->child_err && attr->child_err->filehand)) + { + si.dwFlags |= STARTF_USESTDHANDLES; + + si.hStdInput = (attr->child_in) + ? attr->child_in->filehand + : GetStdHandle(STD_INPUT_HANDLE); + + si.hStdOutput = (attr->child_out) + ? attr->child_out->filehand + : GetStdHandle(STD_OUTPUT_HANDLE); + + si.hStdError = (attr->child_err) + ? attr->child_err->filehand + : GetStdHandle(STD_ERROR_HANDLE); + } + + rv = CreateProcessA(progname, cmdline, /* Command line */ + NULL, NULL, /* Proc & thread security attributes */ + TRUE, /* Inherit handles */ + dwCreationFlags, /* Creation flags */ + pEnvBlock, /* Environment block */ + attr->currdir, /* Current directory name */ + &si, &pi); + } +#endif /* APR_HAS_ANSI_FS */ + + /* Check CreateProcess result + */ + if (!rv) + return apr_get_os_error(); + + /* XXX Orphaned handle warning - no fix due to broken apr_proc_t api. + */ + new->hproc = pi.hProcess; + new->pid = pi.dwProcessId; + + if (attr->child_in) { + apr_file_close(attr->child_in); + } + if (attr->child_out) { + apr_file_close(attr->child_out); + } + if (attr->child_err) { + apr_file_close(attr->child_err); + } + CloseHandle(pi.hThread); + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_proc_wait_all_procs(apr_proc_t *proc, + int *exitcode, + apr_exit_why_e *exitwhy, + apr_wait_how_e waithow, + apr_pool_t *p) +{ + /* Unix does apr_proc_wait(proc(-1), exitcode, exitwhy, waithow) + * but Win32's apr_proc_wait won't work that way. We can either + * register all APR created processes in some sort of AsyncWait + * thread, or simply walk from the global process pool for all + * apr_pool_note_subprocess()es registered with APR. + */ + return APR_ENOTIMPL; +} + +static apr_exit_why_e why_from_exit_code(DWORD exit) { + /* See WinNT.h STATUS_ACCESS_VIOLATION and family for how + * this class of failures was determined + */ + if (((exit & 0xC0000000) == 0xC0000000) + && !(exit & 0x3FFF0000)) + return APR_PROC_SIGNAL; + else + return APR_PROC_EXIT; + + /* ### No way to tell if Dr Watson grabbed a core, AFAICT. */ +} + +APR_DECLARE(apr_status_t) apr_proc_wait(apr_proc_t *proc, + int *exitcode, apr_exit_why_e *exitwhy, + apr_wait_how_e waithow) +{ + DWORD stat; + DWORD time; + + if (waithow == APR_WAIT) + time = INFINITE; + else + time = 0; + + if ((stat = WaitForSingleObject(proc->hproc, time)) == WAIT_OBJECT_0) { + if (GetExitCodeProcess(proc->hproc, &stat)) { + if (exitcode) + *exitcode = stat; + if (exitwhy) + *exitwhy = why_from_exit_code(stat); + CloseHandle(proc->hproc); + proc->hproc = NULL; + return APR_CHILD_DONE; + } + } + else if (stat == WAIT_TIMEOUT) { + return APR_CHILD_NOTDONE; + } + return apr_get_os_error(); +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/win32/signals.c b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/win32/signals.c new file mode 100644 index 00000000..24c9dd53 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/win32/signals.c @@ -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. + */ + +#include "win32/apr_arch_threadproc.h" +#include "win32/apr_arch_file_io.h" +#include "apr_thread_proc.h" +#include "apr_file_io.h" +#include "apr_general.h" +#if APR_HAVE_SIGNAL_H +#include +#endif +#include +#if APR_HAVE_SYS_WAIT +#include +#endif + +/* Windows only really support killing process, but that will do for now. + * + * ### Actually, closing the input handle to the proc should also do fine + * for most console apps. This definately needs improvement... + */ +APR_DECLARE(apr_status_t) apr_proc_kill(apr_proc_t *proc, int signal) +{ + if (proc->hproc != NULL) { + if (TerminateProcess(proc->hproc, signal) == 0) { + return apr_get_os_error(); + } + /* On unix, SIGKILL leaves a apr_proc_wait()able pid lying around, + * so we will leave hproc alone until the app calls apr_proc_wait(). + */ + return APR_SUCCESS; + } + return APR_EPROC_UNKNOWN; +} + +void apr_signal_init(apr_pool_t *pglobal) +{ +} + +const char *apr_signal_description_get(int signum) +{ + return "unknown signal (not supported)"; +} + +/* Deprecated */ +const char *apr_signal_get_description(int signum) +{ + return apr_signal_description_get(signum); +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/win32/thread.c b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/win32/thread.c new file mode 100644 index 00000000..64317d9b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/win32/thread.c @@ -0,0 +1,277 @@ +/* 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. + */ + +#include "apr_private.h" +#include "win32/apr_arch_threadproc.h" +#include "apr_thread_proc.h" +#include "apr_general.h" +#include "apr_lib.h" +#include "apr_portable.h" +#if APR_HAVE_PROCESS_H +#include +#endif +#include "apr_arch_misc.h" + +/* Chosen for us by apr_initialize */ +DWORD tls_apr_thread = 0; + +APR_DECLARE(apr_status_t) apr_threadattr_create(apr_threadattr_t **new, + apr_pool_t *pool) +{ + (*new) = (apr_threadattr_t *)apr_palloc(pool, + sizeof(apr_threadattr_t)); + + if ((*new) == NULL) { + return APR_ENOMEM; + } + + (*new)->pool = pool; + (*new)->detach = 0; + (*new)->stacksize = 0; + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_threadattr_detach_set(apr_threadattr_t *attr, + apr_int32_t on) +{ + attr->detach = on; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_threadattr_detach_get(apr_threadattr_t *attr) +{ + if (attr->detach == 1) + return APR_DETACH; + return APR_NOTDETACH; +} + +APR_DECLARE(apr_status_t) apr_threadattr_stacksize_set(apr_threadattr_t *attr, + apr_size_t stacksize) +{ + attr->stacksize = stacksize; + return APR_SUCCESS; +} + +static void *dummy_worker(void *opaque) +{ + apr_thread_t *thd = (apr_thread_t *)opaque; + TlsSetValue(tls_apr_thread, thd->td); + return thd->func(thd, thd->data); +} + +APR_DECLARE(apr_status_t) apr_thread_create(apr_thread_t **new, + apr_threadattr_t *attr, + apr_thread_start_t func, + void *data, apr_pool_t *pool) +{ + apr_status_t stat; + unsigned temp; + HANDLE handle; + + (*new) = (apr_thread_t *)apr_palloc(pool, sizeof(apr_thread_t)); + + if ((*new) == NULL) { + return APR_ENOMEM; + } + + (*new)->pool = pool; + (*new)->data = data; + (*new)->func = func; + (*new)->td = NULL; + + stat = apr_pool_create(&(*new)->pool, pool); + if (stat != APR_SUCCESS) { + return stat; + } + + /* Use 0 for Thread Stack Size, because that will default the stack to the + * same size as the calling thread. + */ +#ifndef _WIN32_WCE + if ((handle = (HANDLE)_beginthreadex(NULL, + attr && attr->stacksize > 0 ? attr->stacksize : 0, + (unsigned int (APR_THREAD_FUNC *)(void *))dummy_worker, + (*new), 0, &temp)) == 0) { + return APR_FROM_OS_ERROR(_doserrno); + } +#else + if ((handle = CreateThread(NULL, + attr && attr->stacksize > 0 ? attr->stacksize : 0, + (unsigned int (APR_THREAD_FUNC *)(void *))dummy_worker, + (*new), 0, &temp)) == 0) { + return apr_get_os_error(); + } +#endif + if (attr && attr->detach) { + CloseHandle(handle); + } + else + (*new)->td = handle; + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_thread_exit(apr_thread_t *thd, + apr_status_t retval) +{ + thd->exitval = retval; + apr_pool_destroy(thd->pool); + thd->pool = NULL; +#ifndef _WIN32_WCE + _endthreadex(0); +#else + ExitThread(0); +#endif + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_thread_join(apr_status_t *retval, + apr_thread_t *thd) +{ + apr_status_t rv = APR_SUCCESS; + + if (!thd->td) { + /* Can not join on detached threads */ + return APR_DETACH; + } + rv = WaitForSingleObject(thd->td, INFINITE); + if ( rv == WAIT_OBJECT_0 || rv == WAIT_ABANDONED) { + /* If the thread_exit has been called */ + if (!thd->pool) + *retval = thd->exitval; + else + rv = APR_INCOMPLETE; + } + else + rv = apr_get_os_error(); + CloseHandle(thd->td); + thd->td = NULL; + + return rv; +} + +APR_DECLARE(apr_status_t) apr_thread_detach(apr_thread_t *thd) +{ + if (thd->td && CloseHandle(thd->td)) { + thd->td = NULL; + return APR_SUCCESS; + } + else { + return apr_get_os_error(); + } +} + +APR_DECLARE(void) apr_thread_yield() +{ + /* SwitchToThread is not supported on Win9x, but since it's + * primarily a noop (entering time consuming code, therefore + * providing more critical threads a bit larger timeslice) + * we won't worry too much if it's not available. + */ +#ifndef _WIN32_WCE + if (apr_os_level >= APR_WIN_NT) { + SwitchToThread(); + } +#endif +} + +APR_DECLARE(apr_status_t) apr_thread_data_get(void **data, const char *key, + apr_thread_t *thread) +{ + return apr_pool_userdata_get(data, key, thread->pool); +} + +APR_DECLARE(apr_status_t) apr_thread_data_set(void *data, const char *key, + apr_status_t (*cleanup) (void *), + apr_thread_t *thread) +{ + return apr_pool_userdata_set(data, key, cleanup, thread->pool); +} + + +APR_DECLARE(apr_os_thread_t) apr_os_thread_current(void) +{ + HANDLE hthread = (HANDLE)TlsGetValue(tls_apr_thread); + HANDLE hproc; + + if (hthread) { + return hthread; + } + + hproc = GetCurrentProcess(); + hthread = GetCurrentThread(); + if (!DuplicateHandle(hproc, hthread, + hproc, &hthread, 0, FALSE, + DUPLICATE_SAME_ACCESS)) { + return NULL; + } + TlsSetValue(tls_apr_thread, hthread); + return hthread; +} + +APR_DECLARE(apr_status_t) apr_os_thread_get(apr_os_thread_t **thethd, + apr_thread_t *thd) +{ + if (thd == NULL) { + return APR_ENOTHREAD; + } + *thethd = thd->td; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_os_thread_put(apr_thread_t **thd, + apr_os_thread_t *thethd, + apr_pool_t *pool) +{ + if (pool == NULL) { + return APR_ENOPOOL; + } + if ((*thd) == NULL) { + (*thd) = (apr_thread_t *)apr_palloc(pool, sizeof(apr_thread_t)); + (*thd)->pool = pool; + } + (*thd)->td = thethd; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_thread_once_init(apr_thread_once_t **control, + apr_pool_t *p) +{ + (*control) = apr_pcalloc(p, sizeof(**control)); + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_thread_once(apr_thread_once_t *control, + void (*func)(void)) +{ + if (!InterlockedExchange(&control->value, 1)) { + func(); + } + return APR_SUCCESS; +} + +APR_DECLARE(int) apr_os_thread_equal(apr_os_thread_t tid1, + apr_os_thread_t tid2) +{ + /* Since the only tid's we support our are own, and + * apr_os_thread_current returns the identical handle + * to the one we created initially, the test is simple. + */ + return (tid1 == tid2); +} + +APR_POOL_IMPLEMENT_ACCESSOR(thread) diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/win32/threadpriv.c b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/win32/threadpriv.c new file mode 100644 index 00000000..9ddc24fb --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/threadproc/win32/threadpriv.c @@ -0,0 +1,101 @@ +/* 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. + */ + +#include "win32/apr_arch_threadproc.h" +#include "apr_thread_proc.h" +#include "apr_general.h" +#include "apr_lib.h" +#include "apr_errno.h" +#include "apr_portable.h" + +APR_DECLARE(apr_status_t) apr_threadkey_private_create(apr_threadkey_t **key, + void (*dest)(void *), + apr_pool_t *pool) +{ + (*key) = (apr_threadkey_t *)apr_palloc(pool, sizeof(apr_threadkey_t)); + if ((*key) == NULL) { + return APR_ENOMEM; + } + + (*key)->pool = pool; + + if (((*key)->key = TlsAlloc()) != 0xFFFFFFFF) { + return APR_SUCCESS; + } + return apr_get_os_error(); +} + +APR_DECLARE(apr_status_t) apr_threadkey_private_get(void **new, + apr_threadkey_t *key) +{ + if ((*new) = TlsGetValue(key->key)) { + return APR_SUCCESS; + } + return apr_get_os_error(); +} + +APR_DECLARE(apr_status_t) apr_threadkey_private_set(void *priv, + apr_threadkey_t *key) +{ + if (TlsSetValue(key->key, priv)) { + return APR_SUCCESS; + } + return apr_get_os_error(); +} + +APR_DECLARE(apr_status_t) apr_threadkey_private_delete(apr_threadkey_t *key) +{ + if (TlsFree(key->key)) { + return APR_SUCCESS; + } + return apr_get_os_error(); +} + +APR_DECLARE(apr_status_t) apr_threadkey_data_get(void **data, const char *key, + apr_threadkey_t *threadkey) +{ + return apr_pool_userdata_get(data, key, threadkey->pool); +} + +APR_DECLARE(apr_status_t) apr_threadkey_data_set(void *data, const char *key, + apr_status_t (*cleanup)(void *), + apr_threadkey_t *threadkey) +{ + return apr_pool_userdata_set(data, key, cleanup, threadkey->pool); +} + +APR_DECLARE(apr_status_t) apr_os_threadkey_get(apr_os_threadkey_t *thekey, + apr_threadkey_t *key) +{ + *thekey = key->key; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_os_threadkey_put(apr_threadkey_t **key, + apr_os_threadkey_t *thekey, + apr_pool_t *pool) +{ + if (pool == NULL) { + return APR_ENOPOOL; + } + if ((*key) == NULL) { + (*key) = (apr_threadkey_t *)apr_palloc(pool, sizeof(apr_threadkey_t)); + (*key)->pool = pool; + } + (*key)->key = *thekey; + return APR_SUCCESS; +} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/time/unix/.libs/time.o b/rubbos/app/httpd-2.0.64/srclib/apr/time/unix/.libs/time.o new file mode 100644 index 0000000000000000000000000000000000000000..316635d7ca39c620682be351fcacb657a786ca21 GIT binary patch literal 18272 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 P0|zvm_tA)kbKd?h0F0LU literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/time/unix/.libs/timestr.o b/rubbos/app/httpd-2.0.64/srclib/apr/time/unix/.libs/timestr.o new file mode 100644 index 0000000000000000000000000000000000000000..951931803ea1867c5883289f2593e7682a244682 GIT binary patch literal 13512 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 +#endif +#if APR_HAVE_UNISTD_H +#include +#endif +#ifdef HAVE_TIME_H +#include +#endif +/* End System Headers */ + +#if !defined(HAVE_GMTOFF) && !defined(HAVE___OFFSET) +static apr_int32_t server_gmt_offset; +#endif /* if !defined(HAVE_GMTOFF) && !defined(HAVE___OFFSET) */ + +static apr_int32_t get_offset(struct tm *tm) +{ +#ifdef HAVE_GMTOFF + return tm->tm_gmtoff; +#elif defined(HAVE___OFFSET) + return tm->__tm_gmtoff; +#else +#ifdef NETWARE + /* Need to adjust the global variable each time otherwise + the web server would have to be restarted when daylight + savings changes. + */ + if (daylightOnOff) { + return server_gmt_offset + daylightOffset; + } +#else + if(tm->tm_isdst) + return server_gmt_offset + 3600; +#endif + return server_gmt_offset; +#endif +} + +APR_DECLARE(apr_status_t) apr_time_ansi_put(apr_time_t *result, + time_t input) +{ + *result = (apr_time_t)input * APR_USEC_PER_SEC; + return APR_SUCCESS; +} + +/* NB NB NB NB This returns GMT!!!!!!!!!! */ +APR_DECLARE(apr_time_t) apr_time_now(void) +{ + struct timeval tv; + gettimeofday(&tv, NULL); + return tv.tv_sec * APR_USEC_PER_SEC + tv.tv_usec; +} + +static void explode_time(apr_time_exp_t *xt, apr_time_t t, + apr_int32_t offset, int use_localtime) +{ + struct tm tm; + time_t tt = (t / APR_USEC_PER_SEC) + offset; + xt->tm_usec = t % APR_USEC_PER_SEC; + +#if APR_HAS_THREADS && defined (_POSIX_THREAD_SAFE_FUNCTIONS) + if (use_localtime) + localtime_r(&tt, &tm); + else + gmtime_r(&tt, &tm); +#else + if (use_localtime) + tm = *localtime(&tt); + else + tm = *gmtime(&tt); +#endif + + xt->tm_sec = tm.tm_sec; + xt->tm_min = tm.tm_min; + xt->tm_hour = tm.tm_hour; + xt->tm_mday = tm.tm_mday; + xt->tm_mon = tm.tm_mon; + xt->tm_year = tm.tm_year; + xt->tm_wday = tm.tm_wday; + xt->tm_yday = tm.tm_yday; + xt->tm_isdst = tm.tm_isdst; + xt->tm_gmtoff = get_offset(&tm); +} + +APR_DECLARE(apr_status_t) apr_time_exp_tz(apr_time_exp_t *result, + apr_time_t input, apr_int32_t offs) +{ + explode_time(result, input, offs, 0); + result->tm_gmtoff = offs; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_time_exp_gmt(apr_time_exp_t *result, + apr_time_t input) +{ + return apr_time_exp_tz(result, input, 0); +} + +APR_DECLARE(apr_status_t) apr_time_exp_lt(apr_time_exp_t *result, + apr_time_t input) +{ +#if defined(__EMX__) + /* EMX gcc (OS/2) has a timezone global we can use */ + return apr_time_exp_tz(result, input, -timezone); +#else + explode_time(result, input, 0, 1); + return APR_SUCCESS; +#endif /* __EMX__ */ +} + +APR_DECLARE(apr_status_t) apr_time_exp_get(apr_time_t *t, apr_time_exp_t *xt) +{ + apr_time_t year = xt->tm_year; + apr_time_t days; + static const int dayoffset[12] = + {306, 337, 0, 31, 61, 92, 122, 153, 184, 214, 245, 275}; + + /* shift new year to 1st March in order to make leap year calc easy */ + + if (xt->tm_mon < 2) + year--; + + /* Find number of days since 1st March 1900 (in the Gregorian calendar). */ + + days = year * 365 + year / 4 - year / 100 + (year / 100 + 3) / 4; + days += dayoffset[xt->tm_mon] + xt->tm_mday - 1; + days -= 25508; /* 1 jan 1970 is 25508 days since 1 mar 1900 */ + days = ((days * 24 + xt->tm_hour) * 60 + xt->tm_min) * 60 + xt->tm_sec; + + if (days < 0) { + return APR_EBADDATE; + } + *t = days * APR_USEC_PER_SEC + xt->tm_usec; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_time_exp_gmt_get(apr_time_t *t, + apr_time_exp_t *xt) +{ + apr_status_t status = apr_time_exp_get(t, xt); + if (status == APR_SUCCESS) + *t -= (apr_time_t) xt->tm_gmtoff * APR_USEC_PER_SEC; + return status; +} + +APR_DECLARE(apr_status_t) apr_os_imp_time_get(apr_os_imp_time_t **ostime, + apr_time_t *aprtime) +{ + (*ostime)->tv_usec = *aprtime % APR_USEC_PER_SEC; + (*ostime)->tv_sec = *aprtime / APR_USEC_PER_SEC; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_os_exp_time_get(apr_os_exp_time_t **ostime, + apr_time_exp_t *aprtime) +{ + (*ostime)->tm_sec = aprtime->tm_sec; + (*ostime)->tm_min = aprtime->tm_min; + (*ostime)->tm_hour = aprtime->tm_hour; + (*ostime)->tm_mday = aprtime->tm_mday; + (*ostime)->tm_mon = aprtime->tm_mon; + (*ostime)->tm_year = aprtime->tm_year; + (*ostime)->tm_wday = aprtime->tm_wday; + (*ostime)->tm_yday = aprtime->tm_yday; + (*ostime)->tm_isdst = aprtime->tm_isdst; + +#if HAVE_GMTOFF + (*ostime)->tm_gmtoff = aprtime->tm_gmtoff; +#elif defined(HAVE__OFFSET) + (*ostime)->__tm_gmtoff = aprtime->tm_gmtoff; +#endif + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_os_imp_time_put(apr_time_t *aprtime, + apr_os_imp_time_t **ostime, + apr_pool_t *cont) +{ + *aprtime = (*ostime)->tv_sec * APR_USEC_PER_SEC + (*ostime)->tv_usec; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_os_exp_time_put(apr_time_exp_t *aprtime, + apr_os_exp_time_t **ostime, + apr_pool_t *cont) +{ + aprtime->tm_sec = (*ostime)->tm_sec; + aprtime->tm_min = (*ostime)->tm_min; + aprtime->tm_hour = (*ostime)->tm_hour; + aprtime->tm_mday = (*ostime)->tm_mday; + aprtime->tm_mon = (*ostime)->tm_mon; + aprtime->tm_year = (*ostime)->tm_year; + aprtime->tm_wday = (*ostime)->tm_wday; + aprtime->tm_yday = (*ostime)->tm_yday; + aprtime->tm_isdst = (*ostime)->tm_isdst; + +#if HAVE_GMTOFF + aprtime->tm_gmtoff = (*ostime)->tm_gmtoff; +#elif defined(HAVE__OFFSET) + aprtime->tm_gmtoff = (*ostime)->__tm_gmtoff; +#endif + + return APR_SUCCESS; +} + +APR_DECLARE(void) apr_sleep(apr_interval_time_t t) +{ +#ifdef OS2 + DosSleep(t/1000); +#elif defined(BEOS) + snooze(t); +#elif defined(NETWARE) + delay(t/1000); +#else + struct timeval tv; + tv.tv_usec = t % APR_USEC_PER_SEC; + tv.tv_sec = t / APR_USEC_PER_SEC; + select(0, NULL, NULL, NULL, &tv); +#endif +} + +#ifdef OS2 +APR_DECLARE(apr_status_t) apr_os2_time_to_apr_time(apr_time_t *result, + FDATE os2date, + FTIME os2time) +{ + struct tm tmpdate; + + memset(&tmpdate, 0, sizeof(tmpdate)); + tmpdate.tm_hour = os2time.hours; + tmpdate.tm_min = os2time.minutes; + tmpdate.tm_sec = os2time.twosecs * 2; + + tmpdate.tm_mday = os2date.day; + tmpdate.tm_mon = os2date.month - 1; + tmpdate.tm_year = os2date.year + 80; + tmpdate.tm_isdst = -1; + + *result = mktime(&tmpdate) * APR_USEC_PER_SEC; + return APR_SUCCESS; +} +#endif + +#ifdef NETWARE +APR_DECLARE(void) apr_netware_setup_time(void) +{ + tzset(); + server_gmt_offset = -TZONE; +} +#else +APR_DECLARE(void) apr_unix_setup_time(void) +{ +#if !defined(HAVE_GMTOFF) && !defined(HAVE___OFFSET) + /* Precompute the offset from GMT on systems where it's not + in struct tm. + + Note: This offset is normalized to be independent of daylight + savings time; if the calculation happens to be done in a + time/place where a daylight savings adjustment is in effect, + the returned offset has the same value that it would have + in the same location if daylight savings were not in effect. + The reason for this is that the returned offset can be + applied to a past or future timestamp in explode_time(), + so the DST adjustment obtained from the current time won't + necessarily be applicable. + + mktime() is the inverse of localtime(); so, presumably, + passing in a struct tm made by gmtime() let's us calculate + the true GMT offset. However, there's a catch: if daylight + savings is in effect, gmtime()will set the tm_isdst field + and confuse mktime() into returning a time that's offset + by one hour. In that case, we must adjust the calculated GMT + offset. + + */ + + struct timeval now; + time_t t1, t2; + struct tm t; + + gettimeofday(&now, NULL); + t1 = now.tv_sec; + t2 = 0; + +#if APR_HAS_THREADS && defined(_POSIX_THREAD_SAFE_FUNCTIONS) + gmtime_r(&t1, &t); +#else + t = *gmtime(&t1); +#endif + t.tm_isdst = 0; /* we know this GMT time isn't daylight-savings */ + t2 = mktime(&t); + server_gmt_offset = (apr_int32_t) difftime(t1, t2); +#endif +} + +#endif + +/* A noop on all known Unix implementations */ +APR_DECLARE(void) apr_time_clock_hires(apr_pool_t *p) +{ + return; +} + +/* Deprecated */ +APR_DECLARE(apr_status_t) apr_explode_time(apr_time_exp_t *result, + apr_time_t input, + apr_int32_t offs) +{ + return apr_time_exp_tz(result, input, offs); +} + +/* Deprecated */ +APR_DECLARE(apr_status_t) apr_explode_localtime(apr_time_exp_t *result, + apr_time_t input) +{ + return apr_time_exp_lt(result, input); +} + +/* Deprecated */ +APR_DECLARE(apr_status_t) apr_implode_gmt(apr_time_t *t, apr_time_exp_t *xt) +{ + return apr_time_exp_gmt_get(t, xt); +} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/time/unix/time.lo b/rubbos/app/httpd-2.0.64/srclib/apr/time/unix/time.lo new file mode 100644 index 00000000..74d7a1e1 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/time/unix/time.lo @@ -0,0 +1,12 @@ +# time.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/time.o' + +# Name of the non-PIC object. +non_pic_object='time.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/time/unix/time.o b/rubbos/app/httpd-2.0.64/srclib/apr/time/unix/time.o new file mode 100644 index 0000000000000000000000000000000000000000..1e407ae22b978bba1b288e563d92e3f4da5972e5 GIT binary patch literal 18904 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/time/unix/timestr.c b/rubbos/app/httpd-2.0.64/srclib/apr/time/unix/timestr.c new file mode 100644 index 00000000..14f27b7e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/time/unix/timestr.c @@ -0,0 +1,153 @@ +/* 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. + */ + +#include "apr_portable.h" +#include "apr_time.h" +#include "apr_lib.h" +#include "apr_private.h" +/* System Headers required for time library */ +#if APR_HAVE_SYS_TIME_H +#include +#endif +#ifdef HAVE_TIME_H +#include +#endif +#if APR_HAVE_STRING_H +#include +#endif +/* End System Headers */ + +APR_DECLARE_DATA const char apr_month_snames[12][4] = +{ + "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" +}; +APR_DECLARE_DATA const char apr_day_snames[7][4] = +{ + "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" +}; + +apr_status_t apr_rfc822_date(char *date_str, apr_time_t t) +{ + apr_time_exp_t xt; + const char *s; + int real_year; + + apr_time_exp_gmt(&xt, t); + + /* example: "Sat, 08 Jan 2000 18:31:41 GMT" */ + /* 12345678901234567890123456789 */ + + s = &apr_day_snames[xt.tm_wday][0]; + *date_str++ = *s++; + *date_str++ = *s++; + *date_str++ = *s++; + *date_str++ = ','; + *date_str++ = ' '; + *date_str++ = xt.tm_mday / 10 + '0'; + *date_str++ = xt.tm_mday % 10 + '0'; + *date_str++ = ' '; + s = &apr_month_snames[xt.tm_mon][0]; + *date_str++ = *s++; + *date_str++ = *s++; + *date_str++ = *s++; + *date_str++ = ' '; + real_year = 1900 + xt.tm_year; + /* This routine isn't y10k ready. */ + *date_str++ = real_year / 1000 + '0'; + *date_str++ = real_year % 1000 / 100 + '0'; + *date_str++ = real_year % 100 / 10 + '0'; + *date_str++ = real_year % 10 + '0'; + *date_str++ = ' '; + *date_str++ = xt.tm_hour / 10 + '0'; + *date_str++ = xt.tm_hour % 10 + '0'; + *date_str++ = ':'; + *date_str++ = xt.tm_min / 10 + '0'; + *date_str++ = xt.tm_min % 10 + '0'; + *date_str++ = ':'; + *date_str++ = xt.tm_sec / 10 + '0'; + *date_str++ = xt.tm_sec % 10 + '0'; + *date_str++ = ' '; + *date_str++ = 'G'; + *date_str++ = 'M'; + *date_str++ = 'T'; + *date_str++ = 0; + return APR_SUCCESS; +} + +apr_status_t apr_ctime(char *date_str, apr_time_t t) +{ + apr_time_exp_t xt; + const char *s; + int real_year; + + /* example: "Wed Jun 30 21:49:08 1993" */ + /* 123456789012345678901234 */ + + apr_time_exp_lt(&xt, t); + s = &apr_day_snames[xt.tm_wday][0]; + *date_str++ = *s++; + *date_str++ = *s++; + *date_str++ = *s++; + *date_str++ = ' '; + s = &apr_month_snames[xt.tm_mon][0]; + *date_str++ = *s++; + *date_str++ = *s++; + *date_str++ = *s++; + *date_str++ = ' '; + *date_str++ = xt.tm_mday / 10 + '0'; + *date_str++ = xt.tm_mday % 10 + '0'; + *date_str++ = ' '; + *date_str++ = xt.tm_hour / 10 + '0'; + *date_str++ = xt.tm_hour % 10 + '0'; + *date_str++ = ':'; + *date_str++ = xt.tm_min / 10 + '0'; + *date_str++ = xt.tm_min % 10 + '0'; + *date_str++ = ':'; + *date_str++ = xt.tm_sec / 10 + '0'; + *date_str++ = xt.tm_sec % 10 + '0'; + *date_str++ = ' '; + real_year = 1900 + xt.tm_year; + *date_str++ = real_year / 1000 + '0'; + *date_str++ = real_year % 1000 / 100 + '0'; + *date_str++ = real_year % 100 / 10 + '0'; + *date_str++ = real_year % 10 + '0'; + *date_str++ = 0; + + return APR_SUCCESS; +} + +apr_status_t apr_strftime(char *s, apr_size_t *retsize, apr_size_t max, + const char *format, apr_time_exp_t *xt) +{ + struct tm tm; + memset(&tm, 0, sizeof tm); + tm.tm_sec = xt->tm_sec; + tm.tm_min = xt->tm_min; + tm.tm_hour = xt->tm_hour; + tm.tm_mday = xt->tm_mday; + tm.tm_mon = xt->tm_mon; + tm.tm_year = xt->tm_year; + tm.tm_wday = xt->tm_wday; + tm.tm_yday = xt->tm_yday; + tm.tm_isdst = xt->tm_isdst; +#if defined(HAVE_GMTOFF) + tm.tm_gmtoff = xt->tm_gmtoff; +#elif defined(HAVE___OFFSET) + tm.__tm_gmtoff = xt->tm_gmtoff; +#endif + (*retsize) = strftime(s, max, format, &tm); + return APR_SUCCESS; +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/time/unix/timestr.lo b/rubbos/app/httpd-2.0.64/srclib/apr/time/unix/timestr.lo new file mode 100644 index 00000000..0af55b22 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/time/unix/timestr.lo @@ -0,0 +1,12 @@ +# timestr.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/timestr.o' + +# Name of the non-PIC object. +non_pic_object='timestr.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/time/unix/timestr.o b/rubbos/app/httpd-2.0.64/srclib/apr/time/unix/timestr.o new file mode 100644 index 0000000000000000000000000000000000000000..2a0fe3d40e270c77c2f2aa76c2b4d3cd25eba311 GIT binary patch literal 13448 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/time/win32/access.c b/rubbos/app/httpd-2.0.64/srclib/apr/time/win32/access.c new file mode 100644 index 00000000..cd25e2f0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/time/win32/access.c @@ -0,0 +1,204 @@ +/* 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. + */ + +#include "win32/apr_arch_atime.h" +#include "apr_time.h" +#include "apr_general.h" +#include "apr_lib.h" + +apr_status_t apr_get_curtime(struct atime_t *time, apr_time_t *rv) +{ + if (time) { + (*rv) = time->currtime; + return APR_SUCCESS; + } + return APR_ENOTIME; +} + +apr_status_t apr_get_sec(struct atime_t *time, apr_int32_t *rv) +{ + if (time) { + (*rv) = time->explodedtime->wSecond; + return APR_SUCCESS; + } + return APR_ENOTIME; +} + +apr_status_t apr_get_min(struct atime_t *time, apr_int32_t *rv) +{ + if (time) { + (*rv) = time->explodedtime->wMinute; + return APR_SUCCESS; + } + return APR_ENOTIME; +} + +apr_status_t apr_get_hour(struct atime_t *time, apr_int32_t *rv) +{ + if (time) { + (*rv) = time->explodedtime->wHour; + return APR_SUCCESS; + } + return APR_ENOTIME; +} + +apr_status_t apr_get_mday(struct atime_t *time, apr_int32_t *rv) +{ + if (time) { + (*rv) = time->explodedtime->wDay; + return APR_SUCCESS; + } + return APR_ENOTIME; +} + +apr_status_t apr_get_mon(struct atime_t *time, apr_int32_t *rv) +{ + if (time) { + (*rv) = time->explodedtime->wMonth; + return APR_SUCCESS; + } + return APR_ENOTIME; +} + +apr_status_t apr_get_year(struct atime_t *time, apr_int32_t *rv) +{ + if (time) { + (*rv) = time->explodedtime->wYear; + return APR_SUCCESS; + } + return APR_ENOTIME; +} + +apr_status_t apr_get_wday(struct atime_t *time, apr_int32_t *rv) +{ + if (time) { + (*rv) = time->explodedtime->wDayOfWeek; + return APR_SUCCESS; + } + return APR_ENOTIME; +} + +apr_status_t apr_set_sec(struct atime_t *time, apr_int32_t value) +{ + if (!time) { + return APR_ENOTIME; + } + if (time->explodedtime == NULL) { + time->explodedtime = (SYSTEMTIME *)apr_pcalloc(time->cntxt, + sizeof(SYSTEMTIME)); + } + if (time->explodedtime == NULL) { + return APR_ENOMEM; + } + time->explodedtime->wSecond = value; + return APR_SUCCESS; +} + +apr_status_t apr_set_min(struct atime_t *time, apr_int32_t value) +{ + if (!time) { + return APR_ENOTIME; + } + if (time->explodedtime == NULL) { + time->explodedtime = (SYSTEMTIME *)apr_pcalloc(time->cntxt, + sizeof(SYSTEMTIME)); + } + if (time->explodedtime == NULL) { + return APR_ENOMEM; + } + time->explodedtime->wMinute = value; + return APR_SUCCESS; +} + +apr_status_t apr_set_hour(struct atime_t *time, apr_int32_t value) +{ + if (!time) { + return APR_ENOTIME; + } + if (time->explodedtime == NULL) { + time->explodedtime = (SYSTEMTIME *)apr_pcalloc(time->cntxt, + sizeof(SYSTEMTIME)); + } + if (time->explodedtime == NULL) { + return APR_ENOMEM; + } + time->explodedtime->wHour = value; + return APR_SUCCESS; +} + +apr_status_t apr_set_mday(struct atime_t *time, apr_int32_t value) +{ + if (!time) { + return APR_ENOTIME; + } + if (time->explodedtime == NULL) { + time->explodedtime = (SYSTEMTIME *)apr_pcalloc(time->cntxt, + sizeof(SYSTEMTIME)); + } + if (time->explodedtime == NULL) { + return APR_ENOMEM; + } + time->explodedtime->wDay = value; + return APR_SUCCESS; +} + +apr_status_t apr_set_mon(struct atime_t *time, apr_int32_t value) +{ + if (!time) { + return APR_ENOTIME; + } + if (time->explodedtime == NULL) { + time->explodedtime = (SYSTEMTIME *)apr_pcalloc(time->cntxt, + sizeof(SYSTEMTIME)); + } + if (time->explodedtime == NULL) { + return APR_ENOMEM; + } + time->explodedtime->wMonth = value; + return APR_SUCCESS; +} + +apr_status_t apr_set_year(struct atime_t *time, apr_int32_t value) +{ + if (!time) { + return APR_ENOTIME; + } + if (time->explodedtime == NULL) { + time->explodedtime = (SYSTEMTIME *)apr_pcalloc(time->cntxt, + sizeof(SYSTEMTIME)); + } + if (time->explodedtime == NULL) { + return APR_ENOMEM; + } + time->explodedtime->wYear = value; + return APR_SUCCESS; +} + +apr_status_t apr_set_wday(struct atime_t *time, apr_int32_t value) +{ + if (!time) { + return APR_ENOTIME; + } + if (time->explodedtime == NULL) { + time->explodedtime = (SYSTEMTIME *)apr_pcalloc(time->cntxt, + sizeof(SYSTEMTIME)); + } + if (time->explodedtime == NULL) { + return APR_ENOMEM; + } + time->explodedtime->wDayOfWeek = value; + return APR_SUCCESS; +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/time/win32/time.c b/rubbos/app/httpd-2.0.64/srclib/apr/time/win32/time.c new file mode 100644 index 00000000..2711488f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/time/win32/time.c @@ -0,0 +1,357 @@ +/* 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. + */ + +#include "win32/apr_arch_atime.h" +#include "apr_time.h" +#include "apr_general.h" +#include "apr_lib.h" +#include "apr_portable.h" +#if APR_HAVE_TIME_H +#include +#endif +#if APR_HAVE_ERRNO_H +#include +#endif +#include +#include +#include "apr_arch_misc.h" + +/* Leap year is any year divisible by four, but not by 100 unless also + * divisible by 400 + */ +#define IsLeapYear(y) ((!(y % 4)) ? (((!(y % 400)) && (y % 100)) ? 1 : 0) : 0) + +static DWORD get_local_timezone(TIME_ZONE_INFORMATION **tzresult) +{ + static TIME_ZONE_INFORMATION tz; + static DWORD result; + static int init = 0; + + if (!init) { + result = GetTimeZoneInformation(&tz); + init = 1; + } + + *tzresult = &tz; + return result; +} + +static void SystemTimeToAprExpTime(apr_time_exp_t *xt, SYSTEMTIME *tm) +{ + static const int dayoffset[12] = + {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}; + + /* Note; the caller is responsible for filling in detailed tm_usec, + * tm_gmtoff and tm_isdst data when applicable. + */ + xt->tm_usec = tm->wMilliseconds * 1000; + xt->tm_sec = tm->wSecond; + xt->tm_min = tm->wMinute; + xt->tm_hour = tm->wHour; + xt->tm_mday = tm->wDay; + xt->tm_mon = tm->wMonth - 1; + xt->tm_year = tm->wYear - 1900; + xt->tm_wday = tm->wDayOfWeek; + xt->tm_yday = dayoffset[xt->tm_mon] + (tm->wDay - 1); + xt->tm_isdst = 0; + xt->tm_gmtoff = 0; + + /* If this is a leap year, and we're past the 28th of Feb. (the + * 58th day after Jan. 1), we'll increment our tm_yday by one. + */ + if (IsLeapYear(tm->wYear) && (xt->tm_yday > 58)) + xt->tm_yday++; +} + +APR_DECLARE(apr_status_t) apr_time_ansi_put(apr_time_t *result, + time_t input) +{ + *result = (apr_time_t) input * APR_USEC_PER_SEC; + return APR_SUCCESS; +} + +/* Return micro-seconds since the Unix epoch (jan. 1, 1970) UTC */ +APR_DECLARE(apr_time_t) apr_time_now(void) +{ + LONGLONG aprtime = 0; + FILETIME time; +#ifndef _WIN32_WCE + GetSystemTimeAsFileTime(&time); +#else + SYSTEMTIME st; + GetSystemTime(&st); + SystemTimeToFileTime(&st, &time); +#endif + FileTimeToAprTime(&aprtime, &time); + return aprtime; +} + +APR_DECLARE(apr_status_t) apr_time_exp_gmt(apr_time_exp_t *result, + apr_time_t input) +{ + FILETIME ft; + SYSTEMTIME st; + AprTimeToFileTime(&ft, input); + FileTimeToSystemTime(&ft, &st); + /* The Platform SDK documents that SYSTEMTIME/FILETIME are + * generally UTC, so no timezone info needed + */ + SystemTimeToAprExpTime(result, &st); + result->tm_usec = (apr_int32_t) (input % APR_USEC_PER_SEC); + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_time_exp_tz(apr_time_exp_t *result, + apr_time_t input, + apr_int32_t offs) +{ + FILETIME ft; + SYSTEMTIME st; + AprTimeToFileTime(&ft, input + (offs * APR_USEC_PER_SEC)); + FileTimeToSystemTime(&ft, &st); + /* The Platform SDK documents that SYSTEMTIME/FILETIME are + * generally UTC, so we will simply note the offs used. + */ + SystemTimeToAprExpTime(result, &st); + result->tm_usec = (apr_int32_t) (input % APR_USEC_PER_SEC); + result->tm_gmtoff = offs; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_time_exp_lt(apr_time_exp_t *result, + apr_time_t input) +{ + SYSTEMTIME st; + FILETIME ft, localft; + + AprTimeToFileTime(&ft, input); + +#if APR_HAS_UNICODE_FS && !defined(_WIN32_WCE) + IF_WIN_OS_IS_UNICODE + { + TIME_ZONE_INFORMATION *tz; + SYSTEMTIME localst; + apr_time_t localtime; + + get_local_timezone(&tz); + + FileTimeToSystemTime(&ft, &st); + + /* The Platform SDK documents that SYSTEMTIME/FILETIME are + * generally UTC. We use SystemTimeToTzSpecificLocalTime + * because FileTimeToLocalFileFime is documented that the + * resulting time local file time would have DST relative + * to the *present* date, not the date converted. + */ + SystemTimeToTzSpecificLocalTime(tz, &st, &localst); + SystemTimeToAprExpTime(result, &localst); + result->tm_usec = (apr_int32_t) (input % APR_USEC_PER_SEC); + + + /* Recover the resulting time as an apr time and use the + * delta for gmtoff in seconds (and ignore msec rounding) + */ + SystemTimeToFileTime(&localst, &localft); + FileTimeToAprTime(&localtime, &localft); + result->tm_gmtoff = (int)apr_time_sec(localtime) + - (int)apr_time_sec(input); + + /* To compute the dst flag, we compare the expected + * local (standard) timezone bias to the delta. + * [Note, in war time or double daylight time the + * resulting tm_isdst is, desireably, 2 hours] + */ + result->tm_isdst = (result->tm_gmtoff / 3600) + - (-(tz->Bias + tz->StandardBias) / 60); + } +#endif +#if APR_HAS_ANSI_FS || defined(_WIN32_WCE) + ELSE_WIN_OS_IS_ANSI + { + TIME_ZONE_INFORMATION tz; + /* XXX: This code is simply *wrong*. The time converted will always + * map to the *now current* status of daylight savings time. + */ + + FileTimeToLocalFileTime(&ft, &localft); + FileTimeToSystemTime(&localft, &st); + SystemTimeToAprExpTime(result, &st); + result->tm_usec = (apr_int32_t) (input % APR_USEC_PER_SEC); + + switch (GetTimeZoneInformation(&tz)) { + case TIME_ZONE_ID_UNKNOWN: + result->tm_isdst = 0; + /* Bias = UTC - local time in minutes + * tm_gmtoff is seconds east of UTC + */ + result->tm_gmtoff = tz.Bias * -60; + break; + case TIME_ZONE_ID_STANDARD: + result->tm_isdst = 0; + result->tm_gmtoff = (tz.Bias + tz.StandardBias) * -60; + break; + case TIME_ZONE_ID_DAYLIGHT: + result->tm_isdst = 1; + result->tm_gmtoff = (tz.Bias + tz.DaylightBias) * -60; + break; + default: + /* noop */; + } + } +#endif + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_time_exp_get(apr_time_t *t, + apr_time_exp_t *xt) +{ + apr_time_t year = xt->tm_year; + apr_time_t days; + static const int dayoffset[12] = + {306, 337, 0, 31, 61, 92, 122, 153, 184, 214, 245, 275}; + + /* shift new year to 1st March in order to make leap year calc easy */ + + if (xt->tm_mon < 2) + year--; + + /* Find number of days since 1st March 1900 (in the Gregorian calendar). */ + + days = year * 365 + year / 4 - year / 100 + (year / 100 + 3) / 4; + days += dayoffset[xt->tm_mon] + xt->tm_mday - 1; + days -= 25508; /* 1 jan 1970 is 25508 days since 1 mar 1900 */ + + days = ((days * 24 + xt->tm_hour) * 60 + xt->tm_min) * 60 + xt->tm_sec; + + if (days < 0) { + return APR_EBADDATE; + } + *t = days * APR_USEC_PER_SEC + xt->tm_usec; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_time_exp_gmt_get(apr_time_t *t, + apr_time_exp_t *xt) +{ + apr_status_t status = apr_time_exp_get(t, xt); + if (status == APR_SUCCESS) + *t -= (apr_time_t) xt->tm_gmtoff * APR_USEC_PER_SEC; + return status; +} + +APR_DECLARE(apr_status_t) apr_os_imp_time_get(apr_os_imp_time_t **ostime, + apr_time_t *aprtime) +{ + /* TODO: Consider not passing in pointer to apr_time_t (e.g., call by value) */ + AprTimeToFileTime(*ostime, *aprtime); + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_os_exp_time_get(apr_os_exp_time_t **ostime, + apr_time_exp_t *aprexptime) +{ + (*ostime)->wYear = aprexptime->tm_year + 1900; + (*ostime)->wMonth = aprexptime->tm_mon + 1; + (*ostime)->wDayOfWeek = aprexptime->tm_wday; + (*ostime)->wDay = aprexptime->tm_mday; + (*ostime)->wHour = aprexptime->tm_hour; + (*ostime)->wMinute = aprexptime->tm_min; + (*ostime)->wSecond = aprexptime->tm_sec; + (*ostime)->wMilliseconds = aprexptime->tm_usec / 1000; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_os_imp_time_put(apr_time_t *aprtime, + apr_os_imp_time_t **ostime, + apr_pool_t *cont) +{ + /* XXX: sanity failure, what is file time, gmt or local ? + */ + FileTimeToAprTime(aprtime, *ostime); + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_os_exp_time_put(apr_time_exp_t *aprtime, + apr_os_exp_time_t **ostime, + apr_pool_t *cont) +{ + /* The Platform SDK documents that SYSTEMTIME/FILETIME are + * generally UTC, so no timezone info needed + */ + SystemTimeToAprExpTime(aprtime, *ostime); + return APR_SUCCESS; +} + +APR_DECLARE(void) apr_sleep(apr_interval_time_t t) +{ + /* One of the few sane situations for a cast, Sleep + * is in ms, not us, and passed as a DWORD value + */ + Sleep((DWORD)(t / 1000)); +} + +#if defined(_WIN32_WCE) +/* A noop on WinCE, like Unix implementation */ +APR_DECLARE(void) apr_time_clock_hires(apr_pool_t *p) +{ + return; +} +#else +static apr_status_t clock_restore(void *unsetres) +{ + ULONG newRes; + SetTimerResolution((ULONG)unsetres, FALSE, &newRes); + return APR_SUCCESS; +} + +APR_DECLARE(void) apr_time_clock_hires(apr_pool_t *p) +{ + ULONG newRes; + /* Timer resolution is stated in 100ns units. Note that TRUE requests the + * new clock resolution, FALSE above releases the request. + */ + if (SetTimerResolution(10000, TRUE, &newRes) == 0 /* STATUS_SUCCESS */) { + /* register the cleanup... */ + apr_pool_cleanup_register(p, (void*)10000, clock_restore, + apr_pool_cleanup_null); + } +} +#endif + + +/* Deprecated */ +APR_DECLARE(apr_status_t) apr_explode_time(apr_time_exp_t *result, + apr_time_t input, + apr_int32_t offs) +{ + return apr_time_exp_tz(result, input, offs); +} + +/* Deprecated */ +APR_DECLARE(apr_status_t) apr_explode_localtime(apr_time_exp_t *result, + apr_time_t input) +{ + return apr_time_exp_lt(result, input); +} + +/* Deprecated */ +APR_DECLARE(apr_status_t) apr_implode_gmt(apr_time_t *t, + apr_time_exp_t *xt) +{ + return apr_time_exp_gmt_get(t, xt); +} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/time/win32/timestr.c b/rubbos/app/httpd-2.0.64/srclib/apr/time/win32/timestr.c new file mode 100644 index 00000000..0c533be0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/time/win32/timestr.c @@ -0,0 +1,216 @@ +/* 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. + */ + +#include "win32/apr_arch_atime.h" +#include "apr_portable.h" +#include "apr_strings.h" + +APR_DECLARE_DATA const char apr_month_snames[12][4] = +{ + "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" +}; +APR_DECLARE_DATA const char apr_day_snames[7][4] = +{ + "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" +}; + +APR_DECLARE(apr_status_t) apr_rfc822_date(char *date_str, apr_time_t t) +{ + apr_time_exp_t xt; + const char *s; + int real_year; + + apr_time_exp_gmt(&xt, t); + + /* example: "Sat, 08 Jan 2000 18:31:41 GMT" */ + /* 12345678901234567890123456789 */ + + s = &apr_day_snames[xt.tm_wday][0]; + *date_str++ = *s++; + *date_str++ = *s++; + *date_str++ = *s++; + *date_str++ = ','; + *date_str++ = ' '; + *date_str++ = xt.tm_mday / 10 + '0'; + *date_str++ = xt.tm_mday % 10 + '0'; + *date_str++ = ' '; + s = &apr_month_snames[xt.tm_mon][0]; + *date_str++ = *s++; + *date_str++ = *s++; + *date_str++ = *s++; + *date_str++ = ' '; + real_year = 1900 + xt.tm_year; + /* This routine isn't y10k ready. */ + *date_str++ = real_year / 1000 + '0'; + *date_str++ = real_year % 1000 / 100 + '0'; + *date_str++ = real_year % 100 / 10 + '0'; + *date_str++ = real_year % 10 + '0'; + *date_str++ = ' '; + *date_str++ = xt.tm_hour / 10 + '0'; + *date_str++ = xt.tm_hour % 10 + '0'; + *date_str++ = ':'; + *date_str++ = xt.tm_min / 10 + '0'; + *date_str++ = xt.tm_min % 10 + '0'; + *date_str++ = ':'; + *date_str++ = xt.tm_sec / 10 + '0'; + *date_str++ = xt.tm_sec % 10 + '0'; + *date_str++ = ' '; + *date_str++ = 'G'; + *date_str++ = 'M'; + *date_str++ = 'T'; + *date_str++ = 0; + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_ctime(char *date_str, apr_time_t t) +{ + apr_time_exp_t xt; + const char *s; + int real_year; + + /* example: "Wed Jun 30 21:49:08 1993" */ + /* 123456789012345678901234 */ + + apr_time_exp_lt(&xt, t); + s = &apr_day_snames[xt.tm_wday][0]; + *date_str++ = *s++; + *date_str++ = *s++; + *date_str++ = *s++; + *date_str++ = ' '; + s = &apr_month_snames[xt.tm_mon][0]; + *date_str++ = *s++; + *date_str++ = *s++; + *date_str++ = *s++; + *date_str++ = ' '; + *date_str++ = xt.tm_mday / 10 + '0'; + *date_str++ = xt.tm_mday % 10 + '0'; + *date_str++ = ' '; + *date_str++ = xt.tm_hour / 10 + '0'; + *date_str++ = xt.tm_hour % 10 + '0'; + *date_str++ = ':'; + *date_str++ = xt.tm_min / 10 + '0'; + *date_str++ = xt.tm_min % 10 + '0'; + *date_str++ = ':'; + *date_str++ = xt.tm_sec / 10 + '0'; + *date_str++ = xt.tm_sec % 10 + '0'; + *date_str++ = ' '; + real_year = 1900 + xt.tm_year; + *date_str++ = real_year / 1000 + '0'; + *date_str++ = real_year % 1000 / 100 + '0'; + *date_str++ = real_year % 100 / 10 + '0'; + *date_str++ = real_year % 10 + '0'; + *date_str++ = 0; + + return APR_SUCCESS; +} + + +#ifndef _WIN32_WCE + +int win32_strftime_extra(char *s, size_t max, const char *format, + const struct tm *tm) +{ + /* If the new format string is bigger than max, the result string won't fit + * anyway. If format strings are added, made sure the padding below is + * enough */ + char *new_format = (char *) malloc(max + 11); + size_t i, j, format_length = strlen(format); + int return_value; + int length_written; + + for (i = 0, j = 0; (i < format_length && j < max);) { + if (format[i] != '%') { + new_format[j++] = format[i++]; + continue; + } + switch (format[i+1]) { + case 'C': + length_written = apr_snprintf(new_format + j, max - j, "%2d", + (tm->tm_year + 1970)/100); + j = (length_written == -1) ? max : (j + length_written); + i += 2; + break; + case 'D': + /* Is this locale dependent? Shouldn't be... + Also note the year 2000 exposure here */ + memcpy(new_format + j, "%m/%d/%y", 8); + i += 2; + j += 8; + break; + case 'r': + memcpy(new_format + j, "%I:%M:%S %p", 11); + i += 2; + j += 11; + break; + case 'R': + memcpy(new_format + j, "%H:%M", 5); + i += 2; + j += 5; + break; + case 'T': + memcpy(new_format + j, "%H:%M:%S", 8); + i += 2; + j += 8; + break; + case 'e': + length_written = apr_snprintf(new_format + j, max - j, "%2d", + tm->tm_mday); + j = (length_written == -1) ? max : (j + length_written); + i += 2; + break; + default: + /* We know we can advance two characters forward here. Also + * makes sure that %% is preserved. */ + new_format[j++] = format[i++]; + new_format[j++] = format[i++]; + } + } + if (j >= max) { + *s = '\0'; /* Defensive programming, okay since output is undefined*/ + return_value = 0; + } else { + new_format[j] = '\0'; + return_value = strftime(s, max, new_format, tm); + } + free(new_format); + return return_value; +} + +#endif + + +APR_DECLARE(apr_status_t) apr_strftime(char *s, apr_size_t *retsize, + apr_size_t max, const char *format, + apr_time_exp_t *xt) +{ +#ifdef _WIN32_WCE + return APR_ENOTIMPL; +#else + struct tm tm; + memset(&tm, 0, sizeof tm); + tm.tm_sec = xt->tm_sec; + tm.tm_min = xt->tm_min; + tm.tm_hour = xt->tm_hour; + tm.tm_mday = xt->tm_mday; + tm.tm_mon = xt->tm_mon; + tm.tm_year = xt->tm_year; + tm.tm_wday = xt->tm_wday; + tm.tm_yday = xt->tm_yday; + tm.tm_isdst = xt->tm_isdst; + (*retsize) = win32_strftime_extra(s, max, format, &tm); + return APR_SUCCESS; +#endif +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/user/netware/groupinfo.c b/rubbos/app/httpd-2.0.64/srclib/apr/user/netware/groupinfo.c new file mode 100644 index 00000000..a671121f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/user/netware/groupinfo.c @@ -0,0 +1,60 @@ +/* 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. + */ + +#include "apr_strings.h" +#include "apr_portable.h" +#include "apr_user.h" +#include "apr_private.h" +#ifdef HAVE_GRP_H +#include +#endif +#if APR_HAVE_SYS_TYPES_H +#include +#endif +#if APR_HAVE_UNISTD_H +#include /* for _POSIX_THREAD_SAFE_FUNCTIONS */ +#endif + +APR_DECLARE(apr_status_t) apr_gid_name_get(char **groupname, apr_gid_t groupid, + apr_pool_t *p) +{ + return APR_ENOTIMPL; +} + +APR_DECLARE(apr_status_t) apr_gid_get(apr_gid_t *groupid, + const char *groupname, apr_pool_t *p) +{ + return APR_ENOTIMPL; +} + +/* Deprecated */ +APR_DECLARE(apr_status_t) apr_get_groupname(char **groupname, + apr_gid_t groupid, apr_pool_t *p) +{ + return apr_gid_name_get(groupname, groupid, p); +} + +APR_DECLARE(apr_status_t) apr_group_name_get(char **groupname, + apr_gid_t groupid, apr_pool_t *p) +{ + return apr_gid_name_get(groupname, groupid, p); +} + +APR_DECLARE(apr_status_t) apr_get_groupid(apr_gid_t *groupid, + const char *groupname, apr_pool_t *p) +{ + return apr_gid_get(groupid, groupname, p); +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/user/netware/userinfo.c b/rubbos/app/httpd-2.0.64/srclib/apr/user/netware/userinfo.c new file mode 100644 index 00000000..94b42ae4 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/user/netware/userinfo.c @@ -0,0 +1,98 @@ +/* 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. + */ + +#include "apr_strings.h" +#include "apr_portable.h" +#include "apr_user.h" +#include "apr_private.h" +#ifdef HAVE_PWD_H +#include +#endif +#if APR_HAVE_SYS_TYPES_H +#include +#endif +#if APR_HAVE_UNISTD_H +#include /* for _POSIX_THREAD_SAFE_FUNCTIONS */ +#endif + +#define PWBUF_SIZE 512 + +static apr_status_t getpwnam_safe(const char *username, + struct passwd *pw, + char pwbuf[PWBUF_SIZE]) +{ + return APR_ENOTIMPL; +} + +APR_DECLARE(apr_status_t) apr_uid_homepath_get(char **dirname, + const char *username, + apr_pool_t *p) +{ + return APR_ENOTIMPL; +} + + + +APR_DECLARE(apr_status_t) apr_uid_current(apr_uid_t *uid, + apr_gid_t *gid, + apr_pool_t *p) +{ + return APR_ENOTIMPL; +} + + + + +APR_DECLARE(apr_status_t) apr_uid_get(apr_uid_t *uid, apr_gid_t *gid, + const char *username, apr_pool_t *p) +{ + return APR_ENOTIMPL; +} + +APR_DECLARE(apr_status_t) apr_uid_name_get(char **username, apr_uid_t userid, + apr_pool_t *p) +{ + return APR_ENOTIMPL; +} + +/* deprecated */ +APR_DECLARE(apr_status_t) apr_get_home_directory(char **dirname, + const char *username, + apr_pool_t *p) +{ + return apr_uid_homepath_get(dirname, username, p); +} + +/* deprecated */ +APR_DECLARE(apr_status_t) apr_get_userid(apr_uid_t *uid, apr_gid_t *gid, + const char *username, apr_pool_t *p) +{ + return apr_uid_get(uid, gid, username, p); +} + +/* deprecated */ +APR_DECLARE(apr_status_t) apr_current_userid(apr_uid_t *uid, + apr_gid_t *gid, + apr_pool_t *p) +{ + return apr_uid_current(uid, gid, p); +} + +/* deprecated */ +APR_DECLARE(apr_status_t) apr_get_username(char **username, apr_uid_t userid, apr_pool_t *p) +{ + return apr_uid_name_get(username, userid, p); +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/user/unix/.libs/groupinfo.o b/rubbos/app/httpd-2.0.64/srclib/apr/user/unix/.libs/groupinfo.o new file mode 100644 index 0000000000000000000000000000000000000000..fcf498221f703ab129dfc70335b2f410a798b34d GIT binary patch literal 10648 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 aK9@2+L2_y88Rz?DkB0L)Jfz_~zyAV0(T8gQ literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/user/unix/.libs/userinfo.o b/rubbos/app/httpd-2.0.64/srclib/apr/user/unix/.libs/userinfo.o new file mode 100644 index 0000000000000000000000000000000000000000..d8007d69a628e50b87c4d34fa8fb148d7e2b5c29 GIT binary patch literal 15040 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 o@nMonQO`Kvr$!B&&&k&eoX>|d2G0BL_Xf`O% +#endif +#if APR_HAVE_SYS_TYPES_H +#include +#endif +#if APR_HAVE_UNISTD_H +#include /* for _POSIX_THREAD_SAFE_FUNCTIONS */ +#endif + +APR_DECLARE(apr_status_t) apr_gid_name_get(char **groupname, apr_gid_t groupid, + apr_pool_t *p) +{ + struct group *gr; +#ifndef BEOS + +#if APR_HAS_THREADS && defined(_POSIX_THREAD_SAFE_FUNCTIONS) && defined(HAVE_GETGRGID_R) + struct group grp; + char grbuf[512]; + apr_status_t rv; + + /* See comment in getpwnam_safe on error handling. */ + rv = getgrgid_r(groupid, &grp, grbuf, sizeof(grbuf), &gr); + if (rv) { + return rv; + } + if (gr == NULL) { + return APR_ENOENT; + } +#else + errno = 0; + if ((gr = getgrgid(groupid)) == NULL) { + return errno ? errno : APR_ENOENT; + } +#endif + *groupname = apr_pstrdup(p, gr->gr_name); +#endif + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_gid_get(apr_gid_t *groupid, + const char *groupname, apr_pool_t *p) +{ + struct group *gr; +#ifndef BEOS + +#if APR_HAS_THREADS && defined(_POSIX_THREAD_SAFE_FUNCTIONS) && defined(HAVE_GETGRNAM_R) + struct group grp; + char grbuf[512]; + apr_status_t rv; + + /* See comment in getpwnam_safe on error handling. */ + rv = getgrnam_r(groupname, &grp, grbuf, sizeof(grbuf), &gr); + if (rv) { + return rv; + } + if (gr == NULL) { + return APR_ENOENT; + } +#else + errno = 0; + if ((gr = getgrnam(groupname)) == NULL) { + return errno ? errno : APR_ENOENT; + } +#endif + *groupid = gr->gr_gid; +#endif + return APR_SUCCESS; +} + +/* Deprecated */ +APR_DECLARE(apr_status_t) apr_get_groupname(char **groupname, + apr_gid_t groupid, apr_pool_t *p) +{ + return apr_gid_name_get(groupname, groupid, p); +} + +APR_DECLARE(apr_status_t) apr_group_name_get(char **groupname, + apr_gid_t groupid, apr_pool_t *p) +{ + return apr_gid_name_get(groupname, groupid, p); +} + +APR_DECLARE(apr_status_t) apr_get_groupid(apr_gid_t *groupid, + const char *groupname, apr_pool_t *p) +{ + return apr_gid_get(groupid, groupname, p); +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/user/unix/groupinfo.lo b/rubbos/app/httpd-2.0.64/srclib/apr/user/unix/groupinfo.lo new file mode 100644 index 00000000..815b0412 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/user/unix/groupinfo.lo @@ -0,0 +1,12 @@ +# groupinfo.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/groupinfo.o' + +# Name of the non-PIC object. +non_pic_object='groupinfo.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/user/unix/groupinfo.o b/rubbos/app/httpd-2.0.64/srclib/apr/user/unix/groupinfo.o new file mode 100644 index 0000000000000000000000000000000000000000..5ae3c860f496e839308ff45a4483a19207263e6c GIT binary patch literal 10584 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/user/unix/userinfo.c b/rubbos/app/httpd-2.0.64/srclib/apr/user/unix/userinfo.c new file mode 100644 index 00000000..f50f8053 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/user/unix/userinfo.c @@ -0,0 +1,177 @@ +/* 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. + */ + +#include "apr_strings.h" +#include "apr_portable.h" +#include "apr_user.h" +#include "apr_private.h" +#ifdef HAVE_PWD_H +#include +#endif +#if APR_HAVE_SYS_TYPES_H +#include +#endif +#if APR_HAVE_UNISTD_H +#include /* for _POSIX_THREAD_SAFE_FUNCTIONS */ +#endif +#define APR_WANT_MEMFUNC +#include "apr_want.h" + +#define PWBUF_SIZE 512 + +static apr_status_t getpwnam_safe(const char *username, + struct passwd *pw, + char pwbuf[PWBUF_SIZE]) +{ + struct passwd *pwptr; +#if APR_HAS_THREADS && defined(_POSIX_THREAD_SAFE_FUNCTIONS) && defined(HAVE_GETPWNAM_R) + apr_status_t rv; + + /* POSIX defines getpwnam_r() et al to return the error number + * rather than set errno, and requires pwptr to be set to NULL if + * the entry is not found, imply that "not found" is not an error + * condition; some implementations do return 0 with pwptr set to + * NULL. */ + rv = getpwnam_r(username, pw, pwbuf, PWBUF_SIZE, &pwptr); + if (rv) { + return rv; + } + if (pwptr == NULL) { + return APR_ENOENT; + } +#else + /* Some platforms (e.g. FreeBSD 4.x) do not set errno on NULL "not + * found" return values for the non-threadsafe function either. */ + errno = 0; + if ((pwptr = getpwnam(username)) != NULL) { + memcpy(pw, pwptr, sizeof *pw); + } + else { + return errno ? errno : APR_ENOENT; + } +#endif + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_uid_homepath_get(char **dirname, + const char *username, + apr_pool_t *p) +{ + struct passwd pw; + char pwbuf[PWBUF_SIZE]; + apr_status_t rv; + + if ((rv = getpwnam_safe(username, &pw, pwbuf)) != APR_SUCCESS) + return rv; + +#ifdef OS2 + /* Need to manually add user name for OS/2 */ + *dirname = apr_pstrcat(p, pw.pw_dir, pw.pw_name, NULL); +#else + *dirname = apr_pstrdup(p, pw.pw_dir); +#endif + return APR_SUCCESS; +} + + + +APR_DECLARE(apr_status_t) apr_uid_current(apr_uid_t *uid, + apr_gid_t *gid, + apr_pool_t *p) +{ + *uid = getuid(); + *gid = getgid(); + + return APR_SUCCESS; +} + + + + +APR_DECLARE(apr_status_t) apr_uid_get(apr_uid_t *uid, apr_gid_t *gid, + const char *username, apr_pool_t *p) +{ + struct passwd pw; + char pwbuf[PWBUF_SIZE]; + apr_status_t rv; + + if ((rv = getpwnam_safe(username, &pw, pwbuf)) != APR_SUCCESS) + return rv; + + *uid = pw.pw_uid; + *gid = pw.pw_gid; + + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_uid_name_get(char **username, apr_uid_t userid, + apr_pool_t *p) +{ + struct passwd *pw; +#if APR_HAS_THREADS && defined(_POSIX_THREAD_SAFE_FUNCTIONS) && defined(HAVE_GETPWUID_R) + struct passwd pwd; + char pwbuf[PWBUF_SIZE]; + apr_status_t rv; + + rv = getpwuid_r(userid, &pwd, pwbuf, sizeof(pwbuf), &pw); + if (rv) { + return rv; + } + + if (pw == NULL) { + return APR_ENOENT; + } + +#else + errno = 0; + if ((pw = getpwuid(userid)) == NULL) { + return errno ? errno : APR_ENOENT; + } +#endif + *username = apr_pstrdup(p, pw->pw_name); + return APR_SUCCESS; +} + +/* deprecated */ +APR_DECLARE(apr_status_t) apr_get_home_directory(char **dirname, + const char *username, + apr_pool_t *p) +{ + return apr_uid_homepath_get(dirname, username, p); +} + +/* deprecated */ +APR_DECLARE(apr_status_t) apr_get_userid(apr_uid_t *uid, apr_gid_t *gid, + const char *username, apr_pool_t *p) +{ + return apr_uid_get(uid, gid, username, p); +} + +/* deprecated */ +APR_DECLARE(apr_status_t) apr_current_userid(apr_uid_t *uid, + apr_gid_t *gid, + apr_pool_t *p) +{ + return apr_uid_current(uid, gid, p); +} + +/* deprecated */ +APR_DECLARE(apr_status_t) apr_get_username(char **username, apr_uid_t userid, + apr_pool_t *p) +{ + return apr_uid_name_get(username, userid, p); +} + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/user/unix/userinfo.lo b/rubbos/app/httpd-2.0.64/srclib/apr/user/unix/userinfo.lo new file mode 100644 index 00000000..9ac20075 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/user/unix/userinfo.lo @@ -0,0 +1,12 @@ +# userinfo.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/userinfo.o' + +# Name of the non-PIC object. +non_pic_object='userinfo.o' + diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/user/unix/userinfo.o b/rubbos/app/httpd-2.0.64/srclib/apr/user/unix/userinfo.o new file mode 100644 index 0000000000000000000000000000000000000000..47290d17e0691bfc5dcc80ebef0f4ffdec7de2a0 GIT binary patch literal 15544 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/user/win32/groupinfo.c b/rubbos/app/httpd-2.0.64/srclib/apr/user/win32/groupinfo.c new file mode 100644 index 00000000..784409fc --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/user/win32/groupinfo.c @@ -0,0 +1,124 @@ +/* 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. + */ + +#include "apr_strings.h" +#include "apr_portable.h" +#include "apr_user.h" +#include "apr_private.h" +#if APR_HAVE_SYS_TYPES_H +#include +#endif + +APR_DECLARE(apr_status_t) apr_gid_get(apr_gid_t *gid, + const char *groupname, apr_pool_t *p) +{ +#ifdef _WIN32_WCE + return APR_ENOTIMPL; +#else + SID_NAME_USE sidtype; + char anydomain[256]; + char *domain; + DWORD sidlen = 0; + DWORD domlen = sizeof(anydomain); + DWORD rv; + char *pos; + + if (pos = strchr(groupname, '/')) { + domain = apr_pstrndup(p, groupname, pos - groupname); + groupname = pos + 1; + } + else if (pos = strchr(groupname, '\\')) { + domain = apr_pstrndup(p, groupname, pos - groupname); + groupname = pos + 1; + } + else { + domain = NULL; + } + /* Get nothing on the first pass ... need to size the sid buffer + */ + rv = LookupAccountName(domain, groupname, domain, &sidlen, + anydomain, &domlen, &sidtype); + if (sidlen) { + /* Give it back on the second pass + */ + *gid = apr_palloc(p, sidlen); + domlen = sizeof(anydomain); + rv = LookupAccountName(domain, groupname, *gid, &sidlen, + anydomain, &domlen, &sidtype); + } + if (!sidlen || !rv) { + return apr_get_os_error(); + } + return APR_SUCCESS; +#endif +} + +APR_DECLARE(apr_status_t) apr_gid_name_get(char **groupname, apr_gid_t groupid, apr_pool_t *p) +{ +#ifdef _WIN32_WCE + *groupname = apr_pstrdup(p, "Administrators"); +#else + SID_NAME_USE type; + char name[MAX_PATH], domain[MAX_PATH]; + DWORD cbname = sizeof(name), cbdomain = sizeof(domain); + if (!groupid) + return APR_EINVAL; + if (!LookupAccountSid(NULL, groupid, name, &cbname, domain, &cbdomain, &type)) + return apr_get_os_error(); + if (type != SidTypeGroup && type != SidTypeWellKnownGroup + && type != SidTypeAlias) + return APR_EINVAL; + *groupname = apr_pstrdup(p, name); +#endif + return APR_SUCCESS; +} + +APR_DECLARE(apr_status_t) apr_gid_compare(apr_gid_t left, apr_gid_t right) +{ + if (!left || !right) + return APR_EINVAL; +#ifndef _WIN32_WCE + if (!IsValidSid(left) || !IsValidSid(right)) + return APR_EINVAL; + if (!EqualSid(left, right)) + return APR_EMISMATCH; +#endif + return APR_SUCCESS; +} + +/* Deprecated */ +APR_DECLARE(apr_status_t) apr_get_groupname(char **groupname, + apr_gid_t groupid, apr_pool_t *p) +{ + return apr_gid_name_get(groupname, groupid, p); +} + +APR_DECLARE(apr_status_t) apr_group_name_get(char **groupname, + apr_gid_t groupid, apr_pool_t *p) +{ + return apr_gid_name_get(groupname, groupid, p); +} + +APR_DECLARE(apr_status_t) apr_get_groupid(apr_gid_t *gid, + const char *groupname, apr_pool_t *p) +{ + return apr_gid_get(gid, groupname, p); +} + +APR_DECLARE(apr_status_t) apr_compare_groups(apr_gid_t left, apr_gid_t right) +{ + return apr_gid_compare(left, right); +} diff --git a/rubbos/app/httpd-2.0.64/srclib/apr/user/win32/userinfo.c b/rubbos/app/httpd-2.0.64/srclib/apr/user/win32/userinfo.c new file mode 100644 index 00000000..61087f34 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/srclib/apr/user/win32/userinfo.c @@ -0,0 +1,317 @@ +/* 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. + */ + +#include "apr_private.h" +#include "apr_strings.h" +#include "apr_portable.h" +#include "apr_user.h" +#include "apr_arch_file_io.h" +#if APR_HAVE_SYS_TYPES_H +#include +#endif + +#ifndef _WIN32_WCE +/* Internal sid binary to string translation, see MSKB Q131320. + * Several user related operations require our SID to access + * the registry, but in a string format. All error handling + * depends on IsValidSid(), which internally we better test long + * before we get here! + */ +void get_sid_string(char *buf, int blen, apr_uid_t id) +{ + PSID_IDENTIFIER_AUTHORITY psia; + DWORD nsa; + DWORD sa; + int slen; + + /* Determine authority values (these is a big-endian value, + * and NT records the value as hex if the value is > 2^32.) + */ + psia = GetSidIdentifierAuthority(id); + nsa = (DWORD)(psia->Value[5]) + ((DWORD)(psia->Value[4]) << 8) + + ((DWORD)(psia->Value[3]) << 16) + ((DWORD)(psia->Value[2]) << 24); + sa = (DWORD)(psia->Value[1]) + ((DWORD)(psia->Value[0]) << 8); + if (sa) { + slen = apr_snprintf(buf, blen, "S-%lu-0x%04x%08x", + SID_REVISION, sa, nsa); + } else { + slen = apr_snprintf(buf, blen, "S-%lu-%lu", + SID_REVISION, nsa); + } + + /* Now append all the subauthority strings. + */ + nsa = *GetSidSubAuthorityCount(id); + for (sa = 0; sa < nsa; ++sa) { + slen += apr_snprintf(buf + slen, blen - slen, "-%lu", + *GetSidSubAuthority(id, sa)); + } +} +#endif +/* Query the ProfileImagePath from the version-specific branch, where the + * regkey uses the user's name on 9x, and user's sid string on NT. + */ +APR_DECLARE(apr_status_t) apr_uid_homepath_get(char **dirname, + const char *username, + apr_pool_t *p) +{ +#ifdef _WIN32_WCE + *dirname = apr_pstrdup(p, "/My Documents"); + return APR_SUCCESS; +#else + apr_status_t rv; + char regkey[MAX_PATH * 2]; + char *fixch; + DWORD keylen; + DWORD type; + HKEY key; + + if (apr_os_level >= APR_WIN_NT) { + apr_uid_t uid; + apr_gid_t gid; + + if ((rv = apr_uid_get(&uid, &gid, username, p)) != APR_SUCCESS) + return rv; + + strcpy(regkey, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\" + "ProfileList\\"); + keylen = strlen(regkey); + get_sid_string(regkey + keylen, sizeof(regkey) - keylen, uid); + } + else { + strcpy(regkey, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\" + "ProfileList\\"); + keylen = strlen(regkey); + apr_cpystrn(regkey + keylen, username, sizeof(regkey) - keylen); + + } + + if ((rv = RegOpenKeyEx(HKEY_LOCAL_MACHINE, regkey, 0, + KEY_QUERY_VALUE, &key)) != ERROR_SUCCESS) + return APR_FROM_OS_ERROR(rv); + +#if APR_HAS_UNICODE_FS + IF_WIN_OS_IS_UNICODE + { + + keylen = sizeof(regkey); + rv = RegQueryValueExW(key, L"ProfileImagePath", NULL, &type, + (void*)regkey, &keylen); + RegCloseKey(key); + if (rv != ERROR_SUCCESS) + return APR_FROM_OS_ERROR(rv); + if (type == REG_SZ) { + char retdir[MAX_PATH]; + if ((rv = unicode_to_utf8_path(retdir, sizeof(retdir), + (apr_wchar_t*)regkey)) != APR_SUCCESS) + return rv; + *dirname = apr_pstrdup(p, retdir); + } + else if (type == REG_EXPAND_SZ) { + apr_wchar_t path[MAX_PATH]; + char retdir[MAX_PATH]; + ExpandEnvironmentStringsW((apr_wchar_t*)regkey, path, + sizeof(path) / 2); + if ((rv = unicode_to_utf8_path(retdir, sizeof(retdir), path)) + != APR_SUCCESS) + return rv; + *dirname = apr_pstrdup(p, retdir); + } + else + return APR_ENOENT; + } +#endif +#if APR_HAS_ANSI_FS + ELSE_WIN_OS_IS_ANSI + { + keylen = sizeof(regkey); + rv = RegQueryValueEx(key, "ProfileImagePath", NULL, &type, + (void*)regkey, &keylen); + RegCloseKey(key); + if (rv != ERROR_SUCCESS) + return APR_FROM_OS_ERROR(rv); + if (type == REG_SZ) { + *dirname = apr_pstrdup(p, regkey); + } + else if (type == REG_EXPAND_SZ) { + char path[MAX_PATH]; + ExpandEnvironmentStrings(regkey, path, sizeof(path)); + *dirname = apr_pstrdup(p, path); + } + else + return APR_ENOENT; + } +#endif /* APR_HAS_ANSI_FS */ + for (fixch = *dirname; *fixch; ++fixch) + if (*fixch == '\\') + *fixch = '/'; + return APR_SUCCESS; +#endif /* _WIN32_WCE */ +} + +APR_DECLARE(apr_status_t) apr_uid_current(apr_uid_t *uid, + apr_gid_t *gid, + apr_pool_t *p) +{ +#ifdef _WIN32_WCE + return APR_ENOTIMPL; +#else + HANDLE threadtok; + DWORD needed; + TOKEN_USER *usr; + TOKEN_PRIMARY_GROUP *grp; + + if(!OpenProcessToken(GetCurrentProcess(), STANDARD_RIGHTS_READ | READ_CONTROL | TOKEN_QUERY, &threadtok)) { + return apr_get_os_error(); + } + + *uid = NULL; + if (!GetTokenInformation(threadtok, TokenUser, NULL, 0, &needed) + && (GetLastError() == ERROR_INSUFFICIENT_BUFFER) + && (usr = apr_palloc(p, needed)) + && GetTokenInformation(threadtok, TokenUser, usr, needed, &needed)) + *uid = usr->User.Sid; + else + return apr_get_os_error(); + + if (!GetTokenInformation(threadtok, TokenPrimaryGroup, NULL, 0, &needed) + && (GetLastError() == ERROR_INSUFFICIENT_BUFFER) + && (grp = apr_palloc(p, needed)) + && GetTokenInformation(threadtok, TokenPrimaryGroup, grp, needed, &needed)) + *gid = grp->PrimaryGroup; + else + return apr_get_os_error(); + + return APR_SUCCESS; +#endif +} + +APR_DECLARE(apr_status_t) apr_uid_get(apr_uid_t *uid, apr_gid_t *gid, + const char *username, apr_pool_t *p) +{ +#ifdef _WIN32_WCE + return APR_ENOTIMPL; +#else + SID_NAME_USE sidtype; + char anydomain[256]; + char *domain; + DWORD sidlen = 0; + DWORD domlen = sizeof(anydomain); + DWORD rv; + char *pos; + + if (pos = strchr(username, '/')) { + domain = apr_pstrndup(p, username, pos - username); + username = pos + 1; + } + else if (pos = strchr(username, '\\')) { + domain = apr_pstrndup(p, username, pos - username); + username = pos + 1; + } + else { + domain = NULL; + } + /* Get nothing on the first pass ... need to size the sid buffer + */ + rv = LookupAccountName(domain, username, domain, &sidlen, + anydomain, &domlen, &sidtype); + if (sidlen) { + /* Give it back on the second pass + */ + *uid = apr_palloc(p, sidlen); + domlen = sizeof(anydomain); + rv = LookupAccountName(domain, username, *uid, &sidlen, + anydomain, &domlen, &sidtype); + } + if (!sidlen || !rv) { + return apr_get_os_error(); + } + /* There doesn't seem to be a simple way to retrieve the primary group sid + */ + *gid = NULL; + return APR_SUCCESS; +#endif +} + +APR_DECLARE(apr_status_t) apr_uid_name_get(char **username, apr_uid_t userid, + apr_pool_t *p) +{ +#ifdef _WIN32_WCE + *username = apr_pstrdup(p, "Administrator"); + return APR_SUCCESS; +#else + SID_NAME_USE type; + char name[MAX_PATH], domain[MAX_PATH]; + DWORD cbname = sizeof(name), cbdomain = sizeof(domain); + if (!userid) + return APR_EINVAL; + if (!LookupAccountSid(NULL, userid, name, &cbname, domain, &cbdomain, &type)) + return apr_get_os_error(); + if (type != SidTypeUser && type != SidTypeAlias && type != SidTypeWellKnownGroup) + return APR_EINVAL; + *username = apr_pstrdup(p, name); + return APR_SUCCESS; +#endif +} + +APR_DECLARE(apr_status_t) apr_uid_compare(apr_uid_t left, apr_uid_t right) +{ + if (!left || !right) + return APR_EINVAL; +#ifndef _WIN32_WCE + if (!IsValidSid(left) || !IsValidSid(right)) + return APR_EINVAL; + if (!EqualSid(left, right)) + return APR_EMISMATCH; +#endif + return APR_SUCCESS; +} + +/* deprecated */ +APR_DECLARE(apr_status_t) apr_get_home_directory(char **dirname, + const char *username, + apr_pool_t *p) +{ + return apr_uid_homepath_get(dirname, username, p); +} + +/* deprecated */ +APR_DECLARE(apr_status_t) apr_get_userid(apr_uid_t *uid, apr_gid_t *gid, + const char *username, apr_pool_t *p) +{ + return apr_uid_get(uid, gid, username, p); +} + +/* deprecated */ +APR_DECLARE(apr_status_t) apr_current_userid(apr_uid_t *uid, + apr_gid_t *gid, + apr_pool_t *p) +{ + return apr_uid_current(uid, gid, p); +} + +/* deprecated */ +APR_DECLARE(apr_status_t) apr_compare_users(apr_uid_t left, apr_uid_t right) +{ + return apr_uid_compare(left, right); +} + +/* deprecated */ +APR_DECLARE(apr_status_t) apr_get_username(char **username, apr_uid_t userid, + apr_pool_t *p) +{ + return apr_uid_name_get(username, userid, p); +} diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/.deps b/rubbos/app/httpd-2.0.64/srclib/pcre/.deps new file mode 100644 index 00000000..e69de29b diff --git a/rubbos/app/httpd-2.0.64/srclib/pcre/.libs/dftables.o b/rubbos/app/httpd-2.0.64/srclib/pcre/.libs/dftables.o new file mode 100644 index 0000000000000000000000000000000000000000..1ad1a47d44a48e5a86cb388c72903bd2f7efb0a8 GIT binary patch literal 35784 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

    43.Word Processor
    (N-1286)
    Lega lstaff.comCA - Statewide
    43.Word Processor
    (N-1286)
    Lega lstaff.comCA - Statewide
    43.Word Processor
    (N-1286)
    Lega lstaff.comCA - Statewide
    \n", tablestring); + printf("" + "\n", + trstring, tdstring, tdstring, servername); + printf("" + "\n", + trstring, tdstring, tdstring, hostname); + printf("" + "\n", + trstring, tdstring, tdstring, port); + printf("" + "\n", + trstring, tdstring, tdstring, path); + printf("" + "\n", + trstring, tdstring, tdstring, doclen); + printf("" + "\n", + trstring, tdstring, tdstring, concurrency); + printf("" + "\n", + trstring, tdstring, tdstring, apr_time_sec(timetaken), + (long)apr_time_usec(timetaken)); + printf("" + "\n", + trstring, tdstring, tdstring, done); + printf("" + "\n", + trstring, tdstring, tdstring, bad); + if (bad) + printf("\n", + trstring, tdstring, err_conn, err_length, err_except); + if (err_response) + printf("" + "\n", + trstring, tdstring, tdstring, err_response); + if (keepalive) + printf("" + "\n", + trstring, tdstring, tdstring, doneka); + printf("" + "\n", + trstring, tdstring, tdstring, totalread); + if (posting > 0) + printf("" + "\n", + trstring, tdstring, tdstring, totalposted); + printf("" + "\n", + trstring, tdstring, tdstring, totalbread); + + /* avoid divide by zero */ + if (timetaken) { + printf("" + "\n", + trstring, tdstring, tdstring, 1000 * (float) (done) / timetaken); + printf("" + "\n", + trstring, tdstring, tdstring, (float) (totalread) / timetaken); + if (posting > 0) { + printf("" + "\n", + trstring, tdstring, tdstring, + (float) (totalposted) / timetaken); + printf("" + "\n", + trstring, tdstring, tdstring, + (float) (totalread + totalposted) / timetaken); + } + } { + /* work out connection times */ + long i; + apr_interval_time_t totalcon = 0, total = 0; + apr_interval_time_t mincon = AB_MAX, mintot = AB_MAX; + apr_interval_time_t maxcon = 0, maxtot = 0; + + for (i = 0; i < requests; i++) { + struct data s = stats[i]; + mincon = ap_min(mincon, s.ctime); + mintot = ap_min(mintot, s.time); + maxcon = ap_max(maxcon, s.ctime); + maxtot = ap_max(maxtot, s.time); + totalcon += s.ctime; + total += s.time; + } + + if (requests > 0) { /* avoid division by zero (if 0 requests) */ + printf("\n", + trstring, tdstring); + printf("\n", + trstring, tdstring, tdstring, tdstring, tdstring); + printf("" + "" + "" + "\n", + trstring, tdstring, tdstring, mincon, tdstring, totalcon / requests, tdstring, maxcon); + printf("" + "" + "" + "\n", + trstring, tdstring, tdstring, mintot - mincon, tdstring, + (total / requests) - (totalcon / requests), tdstring, maxtot - maxcon); + printf("" + "" + "" + "\n", + trstring, tdstring, tdstring, mintot, tdstring, total / requests, tdstring, maxtot); + } + printf("
    Server Software:%s
    Server Hostname:%s
    Server Port:%hd
    Document Path:%s
    Document Length:%" APR_SIZE_T_FMT " bytes
    Concurrency Level:%d
    Time taken for tests:%" APR_INT64_T_FMT ".%03ld seconds
    Complete requests:%ld
    Failed requests:%ld
    (Connect: %d, Length: %d, Exceptions: %d)
    Non-2xx responses:%d
    Keep-Alive requests:%ld
    Total transferred:%ld bytes
    Total POSTed:%ld
    HTML transferred:%ld bytes
    Requests per second:%.2f
    Transfer rate:%.2f kb/s received
     %.2f kb/s sent
     %.2f kb/s total
    Connnection Times (ms)
      min avg max
    Connect:%5" APR_TIME_T_FMT "%5" APR_TIME_T_FMT "%5" APR_TIME_T_FMT "
    Processing:%5" APR_TIME_T_FMT "%5" APR_TIME_T_FMT "%5" APR_TIME_T_FMT "
    Total:%5" APR_TIME_T_FMT "%5" APR_TIME_T_FMT "%5" APR_TIME_T_FMT "
    \n"); + } +} + +/* --------------------------------------------------------- */ + +/* start asnchronous non-blocking connection */ + +static void start_connect(struct connection * c) +{ + apr_status_t rv; + +#ifdef USE_SSL + if (ssl == 1) { + ssl_start_connect(c); + return; + } +#endif + + if (!(started < requests)) + return; + + c->read = 0; + c->bread = 0; + c->keepalive = 0; + c->cbx = 0; + c->gotheader = 0; + c->rwrite = 0; + if (c->ctx) + apr_pool_destroy(c->ctx); + apr_pool_create(&c->ctx, cntxt); + + if ((rv = apr_socket_create(&c->aprsock, destsa->family, + SOCK_STREAM, c->ctx)) != APR_SUCCESS) { + apr_err("socket", rv); + } + if ((rv = apr_socket_opt_set(c->aprsock, APR_SO_NONBLOCK, 1)) + != APR_SUCCESS) { + apr_err("socket nonblock", rv); + } + c->start = apr_time_now(); + if ((rv = apr_connect(c->aprsock, destsa)) != APR_SUCCESS) { + if (APR_STATUS_IS_EINPROGRESS(rv)) { + apr_pollfd_t new_pollfd; + c->state = STATE_CONNECTING; + c->rwrite = 0; + new_pollfd.desc_type = APR_POLL_SOCKET; + new_pollfd.reqevents = APR_POLLOUT; + new_pollfd.desc.s = c->aprsock; + new_pollfd.client_data = c; + apr_pollset_add(readbits, &new_pollfd); + return; + } + else { + apr_pollfd_t remove_pollfd; + remove_pollfd.desc_type = APR_POLL_SOCKET; + remove_pollfd.desc.s = c->aprsock; + apr_pollset_remove(readbits, &remove_pollfd); + apr_socket_close(c->aprsock); + err_conn++; + if (bad++ > 10) { + fprintf(stderr, + "\nTest aborted after 10 failures\n\n"); + apr_err("apr_connect()", rv); + } + c->state = STATE_UNCONNECTED; + start_connect(c); + return; + } + } + + /* connected first time */ + c->state = STATE_CONNECTED; + started++; + write_request(c); +} + +/* --------------------------------------------------------- */ + +/* close down connection and save stats */ + +static void close_connection(struct connection * c) +{ + if (c->read == 0 && c->keepalive) { + /* + * server has legitimately shut down an idle keep alive request + */ + if (good) + good--; /* connection never happened */ + } + else { + if (good == 1) { + /* first time here */ + doclen = c->bread; + } + else if (c->bread != doclen) { + bad++; + err_length++; + } + /* save out time */ + if (done < requests) { + struct data s; + if ((done) && heartbeatres && !(done % heartbeatres)) { + fprintf(stderr, "Completed %ld requests\n", done); + fflush(stderr); + } + c->done = apr_time_now(); + s.read = c->read; + s.starttime = c->start; + s.ctime = (c->connect - c->start) / 1000; + s.time = (c->done - c->start) / 1000; + s.waittime = (c->beginread - c->endwrite) / 1000; + stats[done++] = s; + } + } + +#ifdef USE_SSL + if (ssl == 1) { + SSL_shutdown(c->ssl); + SSL_free(c->ssl); + } + else +#endif + { + apr_pollfd_t remove_pollfd; + remove_pollfd.desc_type = APR_POLL_SOCKET; + remove_pollfd.desc.s = c->aprsock; + apr_pollset_remove(readbits, &remove_pollfd); + apr_socket_close(c->aprsock); + } + c->state = STATE_UNCONNECTED; + + /* connect again */ + start_connect(c); + return; +} + +/* --------------------------------------------------------- */ + +/* read data from connection */ + +static void read_connection(struct connection * c) +{ + apr_size_t r; + apr_status_t status; + char *part; + char respcode[4]; /* 3 digits and null */ + + r = sizeof(buffer); +#ifdef USE_SSL + if (ssl == 1) + { + status = SSL_read (c->ssl, buffer, r); + if (status <= 0) { + good++; c->read = 0; + if (status < 0) printf("SSL read failed - closing connection\n"); + close_connection(c); + return; + } + r = status; + } + else { +#endif + status = apr_recv(c->aprsock, buffer, &r); + if (APR_STATUS_IS_EAGAIN(status)) + return; + else if (r == 0 && APR_STATUS_IS_EOF(status)) { + good++; + close_connection(c); + return; + } + /* catch legitimate fatal apr_recv errors */ + else if (status != APR_SUCCESS) { + err_except++; /* XXX: is this the right error counter? */ + /* XXX: Should errors here be fatal, or should we allow a + * certain number of them before completely failing? -aaron */ + apr_err("apr_recv", status); + } +#ifdef USE_SSL + } +#endif + + totalread += r; + if (c->read == 0) { + c->beginread = apr_time_now(); + } + c->read += r; + + + if (!c->gotheader) { + char *s; + int l = 4; + apr_size_t space = CBUFFSIZE - c->cbx - 1; /* -1 allows for \0 term */ + int tocopy = (space < r) ? space : r; +#ifdef NOT_ASCII + apr_size_t inbytes_left = space, outbytes_left = space; + + status = apr_xlate_conv_buffer(from_ascii, buffer, &inbytes_left, + c->cbuff + c->cbx, &outbytes_left); + if (status || inbytes_left || outbytes_left) { + fprintf(stderr, "only simple translation is supported (%d/%u/%u)\n", + status, inbytes_left, outbytes_left); + exit(1); + } +#else + memcpy(c->cbuff + c->cbx, buffer, space); +#endif /* NOT_ASCII */ + c->cbx += tocopy; + space -= tocopy; + c->cbuff[c->cbx] = 0; /* terminate for benefit of strstr */ + if (verbosity >= 2) { + printf("LOG: header received:\n%s\n", c->cbuff); + } + s = strstr(c->cbuff, "\r\n\r\n"); + /* + * this next line is so that we talk to NCSA 1.5 which blatantly + * breaks the http specifaction + */ + if (!s) { + s = strstr(c->cbuff, "\n\n"); + l = 2; + } + + if (!s) { + /* read rest next time */ + if (space) { + return; + } + else { + /* header is in invalid or too big - close connection */ + apr_pollfd_t remove_pollfd; + remove_pollfd.desc_type = APR_POLL_SOCKET; + remove_pollfd.desc.s = c->aprsock; + apr_pollset_remove(readbits, &remove_pollfd); + apr_socket_close(c->aprsock); + err_response++; + if (bad++ > 10) { + err("\nTest aborted after 10 failures\n\n"); + } + start_connect(c); + } + } + else { + /* have full header */ + if (!good) { + /* + * this is first time, extract some interesting info + */ + char *p, *q; + p = strstr(c->cbuff, "Server:"); + q = servername; + if (p) { + p += 8; + while (*p > 32) + *q++ = *p++; + } + *q = 0; + } + /* + * XXX: this parsing isn't even remotely HTTP compliant... but in + * the interest of speed it doesn't totally have to be, it just + * needs to be extended to handle whatever servers folks want to + * test against. -djg + */ + + /* check response code */ + part = strstr(c->cbuff, "HTTP"); /* really HTTP/1.x_ */ + if (part && strlen(part) > strlen("HTTP/1.x_")) { + strncpy(respcode, (part + strlen("HTTP/1.x_")), 3); + respcode[3] = '\0'; + } + else { + strcpy(respcode, "500"); + } + + if (respcode[0] != '2') { + err_response++; + if (verbosity >= 2) + printf("WARNING: Response code not 2xx (%s)\n", respcode); + } + else if (verbosity >= 3) { + printf("LOG: Response code = %s\n", respcode); + } + c->gotheader = 1; + *s = 0; /* terminate at end of header */ + if (keepalive && + (strstr(c->cbuff, "Keep-Alive") + || strstr(c->cbuff, "keep-alive"))) { /* for benefit of MSIIS */ + char *cl; + cl = strstr(c->cbuff, "Content-Length:"); + /* handle NCSA, which sends Content-length: */ + if (!cl) + cl = strstr(c->cbuff, "Content-length:"); + if (cl) { + c->keepalive = 1; + c->length = atoi(cl + 16); + } + } + c->bread += c->cbx - (s + l - c->cbuff) + r - tocopy; + totalbread += c->bread; + } + } + else { + /* outside header, everything we have read is entity body */ + c->bread += r; + totalbread += r; + } + + if (c->keepalive && (c->bread >= c->length)) { + /* finished a keep-alive connection */ + good++; + /* save out time */ + if (good == 1) { + /* first time here */ + doclen = c->bread; + } + else if (c->bread != doclen) { + bad++; + err_length++; + } + if (done < requests) { + struct data s; + doneka++; + if (done && heartbeatres && !(done % heartbeatres)) { + fprintf(stderr, "Completed %ld requests\n", done); + fflush(stderr); + } + c->done = apr_time_now(); + s.read = c->read; + s.starttime = c->start; + s.ctime = (c->connect - c->start) / 1000; + s.waittime = (c->beginread - c->endwrite) / 1000; + s.time = (c->done - c->start) / 1000; + stats[done++] = s; + } + c->keepalive = 0; + c->length = 0; + c->gotheader = 0; + c->cbx = 0; + c->read = c->bread = 0; + c->start = c->connect = apr_time_now(); /* zero connect time with keep-alive */ + write_request(c); + } +} + +/* --------------------------------------------------------- */ + +/* run the tests */ + +static void test(void) +{ + apr_time_t now; + apr_int16_t rv; + long i; + apr_status_t status; +#ifdef NOT_ASCII + apr_size_t inbytes_left, outbytes_left; +#endif + + if (isproxy) { + connecthost = apr_pstrdup(cntxt, proxyhost); + connectport = proxyport; + } + else { + connecthost = apr_pstrdup(cntxt, hostname); + connectport = port; + } + + if (!use_html) { + printf("Benchmarking %s ", hostname); + if (isproxy) + printf("[through %s:%d] ", proxyhost, proxyport); + printf("(be patient)%s", + (heartbeatres ? "\n" : "...")); + fflush(stdout); + } + + now = apr_time_now(); + + con = calloc(concurrency * sizeof(struct connection), 1); + + stats = calloc(requests * sizeof(struct data), 1); + + if ((status = apr_pollset_create(&readbits, concurrency, cntxt, 0)) != APR_SUCCESS) { + apr_err("apr_pollset_create failed", status); + } + + /* setup request */ + if (posting <= 0) { + sprintf(request, "%s %s HTTP/1.0\r\n" + "User-Agent: ApacheBench/%s\r\n" + "%s" "%s" "%s" + "Host: %s%s\r\n" + "Accept: */*\r\n" + "%s" "\r\n", + (posting == 0) ? "GET" : "HEAD", + (isproxy) ? fullurl : path, + AP_AB_BASEREVISION, + keepalive ? "Connection: Keep-Alive\r\n" : "", + cookie, auth, host_field, colonhost, hdrs); + } + else { + sprintf(request, "POST %s HTTP/1.0\r\n" + "User-Agent: ApacheBench/%s\r\n" + "%s" "%s" "%s" + "Host: %s%s\r\n" + "Accept: */*\r\n" + "Content-length: %" APR_SIZE_T_FMT "\r\n" + "Content-type: %s\r\n" + "%s" + "\r\n", + (isproxy) ? fullurl : path, + AP_AB_BASEREVISION, + keepalive ? "Connection: Keep-Alive\r\n" : "", + cookie, auth, + host_field, colonhost, postlen, + (content_type[0]) ? content_type : "text/plain", hdrs); + } + + if (verbosity >= 2) + printf("INFO: POST header == \n---\n%s\n---\n", request); + + reqlen = strlen(request); + + /* + * Combine headers and (optional) post file into one contineous buffer + */ + if (posting == 1) { + char *buff = malloc(postlen + reqlen + 1); + if (!buff) { + fprintf(stderr, "error creating request buffer: out of memory\n"); + return; + } + strcpy(buff, request); + strcpy(buff + reqlen, postdata); + request = buff; + } + +#ifdef NOT_ASCII + inbytes_left = outbytes_left = reqlen; + status = apr_xlate_conv_buffer(to_ascii, request, &inbytes_left, + request, &outbytes_left); + if (status || inbytes_left || outbytes_left) { + fprintf(stderr, "only simple translation is supported (%d/%u/%u)\n", + status, inbytes_left, outbytes_left); + exit(1); + } +#endif /* NOT_ASCII */ + + /* This only needs to be done once */ +#ifdef USE_SSL + if (ssl != 1) +#endif + if ((rv = apr_sockaddr_info_get(&destsa, connecthost, APR_UNSPEC, connectport, 0, cntxt)) + != APR_SUCCESS) { + char buf[120]; + apr_snprintf(buf, sizeof(buf), + "apr_sockaddr_info_get() for %s", connecthost); + apr_err(buf, rv); + } + + /* ok - lets start */ + start = apr_time_now(); + + /* initialise lots of requests */ + for (i = 0; i < concurrency; i++) { + con[i].socknum = i; + start_connect(&con[i]); + } + + while (done < requests) { + apr_int32_t n; + apr_int32_t timed; + const apr_pollfd_t *pollresults; + + /* check for time limit expiry */ + now = apr_time_now(); + timed = (apr_int32_t)apr_time_sec(now - start); + if (tlimit && timed >= tlimit) { + requests = done; /* so stats are correct */ + break; /* no need to do another round */ + } + + n = concurrency; +#ifdef USE_SSL + if (ssl == 1) + status = APR_SUCCESS; + else +#endif + status = apr_pollset_poll(readbits, aprtimeout, &n, &pollresults); + if (status != APR_SUCCESS) + apr_err("apr_poll", status); + + if (!n) { + err("\nServer timed out\n\n"); + } + + for (i = 0; i < n; i++) { + const apr_pollfd_t *next_fd = &(pollresults[i]); + struct connection *c = next_fd->client_data; + + /* + * If the connection isn't connected how can we check it? + */ + if (c->state == STATE_UNCONNECTED) + continue; + +#ifdef USE_SSL + if (ssl == 1) + rv = APR_POLLIN; + else +#endif + rv = next_fd->rtnevents; + + /* + * Notes: APR_POLLHUP is set after FIN is received on some + * systems, so treat that like APR_POLLIN so that we try to read + * again. + * + * Some systems return APR_POLLERR with APR_POLLHUP. We need to + * call read_connection() for APR_POLLHUP, so check for + * APR_POLLHUP first so that a closed connection isn't treated + * like an I/O error. If it is, we never figure out that the + * connection is done and we loop here endlessly calling + * apr_poll(). + */ + if ((rv & APR_POLLIN) || (rv & APR_POLLPRI) || (rv & APR_POLLHUP)) + read_connection(c); + if ((rv & APR_POLLERR) || (rv & APR_POLLNVAL)) { + bad++; + err_except++; + start_connect(c); + continue; + } + if (rv & APR_POLLOUT) { + if (c->state == STATE_CONNECTING) { + apr_pollfd_t remove_pollfd; + rv = apr_connect(c->aprsock, destsa); + remove_pollfd.desc_type = APR_POLL_SOCKET; + remove_pollfd.desc.s = c->aprsock; + apr_pollset_remove(readbits, &remove_pollfd); + if (rv != APR_SUCCESS) { + apr_socket_close(c->aprsock); + err_conn++; + if (bad++ > 10) { + fprintf(stderr, + "\nTest aborted after 10 failures\n\n"); + apr_err("apr_connect()", rv); + } + c->state = STATE_UNCONNECTED; + start_connect(c); + continue; + } + else { + c->state = STATE_CONNECTED; + write_request(c); + } + } + else { + write_request(c); + } + } + + /* + * When using a select based poll every time we check the bits + * are reset. In 1.3's ab we copied the FD_SET's each time + * through, but here we're going to check the state and if the + * connection is in STATE_READ or STATE_CONNECTING we'll add the + * socket back in as APR_POLLIN. + */ +#ifdef USE_SSL + if (ssl != 1) +#endif + if (c->state == STATE_READ) { + apr_pollfd_t new_pollfd; + new_pollfd.desc_type = APR_POLL_SOCKET; + new_pollfd.reqevents = APR_POLLIN; + new_pollfd.desc.s = c->aprsock; + new_pollfd.client_data = c; + apr_pollset_add(readbits, &new_pollfd); + } + } + } + + if (heartbeatres) + fprintf(stderr, "Finished %ld requests\n", done); + else + printf("..done\n"); + + if (use_html) + output_html_results(); + else + output_results(); +} + +/* ------------------------------------------------------- */ + +/* display copyright information */ +static void copyright(void) +{ + if (!use_html) { + printf("This is ApacheBench, Version %s\n", AP_AB_BASEREVISION " <$Revision: 1.121.2.12 $> apache-2.0"); + printf("Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/\n"); + printf("Copyright (c) 2006 The Apache Software Foundation, http://www.apache.org/\n"); + printf("\n"); + } + else { + printf("

    \n"); + printf(" This is ApacheBench, Version %s <%s> apache-2.0
    \n", AP_AB_BASEREVISION, "$Revision: 1.121.2.12 $"); + printf(" Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
    \n"); + printf(" Copyright (c) 2006 The Apache Software Foundation, http://www.apache.org/
    \n"); + printf("

    \n

    \n"); + } +} + +/* display usage information */ +static void usage(const char *progname) +{ + fprintf(stderr, "Usage: %s [options] [http" +#ifdef USE_SSL + "[s]" +#endif + "://]hostname[:port]/path\n", progname); + fprintf(stderr, "Options are:\n"); + fprintf(stderr, " -n requests Number of requests to perform\n"); + fprintf(stderr, " -c concurrency Number of multiple requests to make\n"); + fprintf(stderr, " -t timelimit Seconds to max. wait for responses\n"); + fprintf(stderr, " -p postfile File containing data to POST\n"); + fprintf(stderr, " -T content-type Content-type header for POSTing\n"); + fprintf(stderr, " -v verbosity How much troubleshooting info to print\n"); + fprintf(stderr, " -w Print out results in HTML tables\n"); + fprintf(stderr, " -i Use HEAD instead of GET\n"); + fprintf(stderr, " -x attributes String to insert as table attributes\n"); + fprintf(stderr, " -y attributes String to insert as tr attributes\n"); + fprintf(stderr, " -z attributes String to insert as td or th attributes\n"); + fprintf(stderr, " -C attribute Add cookie, eg. 'Apache=1234. (repeatable)\n"); + fprintf(stderr, " -H attribute Add Arbitrary header line, eg. 'Accept-Encoding: gzip'\n"); + fprintf(stderr, " Inserted after all normal header lines. (repeatable)\n"); + fprintf(stderr, " -A attribute Add Basic WWW Authentication, the attributes\n"); + fprintf(stderr, " are a colon separated username and password.\n"); + fprintf(stderr, " -P attribute Add Basic Proxy Authentication, the attributes\n"); + fprintf(stderr, " are a colon separated username and password.\n"); + fprintf(stderr, " -X proxy:port Proxyserver and port number to use\n"); + fprintf(stderr, " -V Print version number and exit\n"); + fprintf(stderr, " -k Use HTTP KeepAlive feature\n"); + fprintf(stderr, " -d Do not show percentiles served table.\n"); + fprintf(stderr, " -S Do not show confidence estimators and warnings.\n"); + fprintf(stderr, " -g filename Output collected data to gnuplot format file.\n"); + fprintf(stderr, " -e filename Output CSV file with percentages served\n"); +#ifdef USE_SSL + fprintf(stderr, " -s Use httpS instead of HTTP (SSL)\n"); +#endif + fprintf(stderr, " -h Display usage information (this message)\n"); + exit(EINVAL); +} + +/* ------------------------------------------------------- */ + +/* split URL into parts */ + +static int parse_url(char *url) +{ + char *cp; + char *h; + char *scope_id; + apr_status_t rv; + + /* Save a copy for the proxy */ + fullurl = apr_pstrdup(cntxt, url); + + if (strlen(url) > 7 && strncmp(url, "http://", 7) == 0) { + url += 7; +#ifdef USE_SSL + ssl = 0; +#endif + } + else +#ifdef USE_SSL + if (strlen(url) > 8 && strncmp(url, "https://", 8) == 0) { + url += 8; + ssl = 1; + } +#else + if (strlen(url) > 8 && strncmp(url, "https://", 8) == 0) { + fprintf(stderr, "SSL not compiled in; no https support\n"); + exit(1); + } +#endif + + if ((cp = strchr(url, '/')) == NULL) + return 1; + h = apr_palloc(cntxt, cp - url + 1); + memcpy(h, url, cp - url); + h[cp - url] = '\0'; + rv = apr_parse_addr_port(&hostname, &scope_id, &port, h, cntxt); + if (rv != APR_SUCCESS || !hostname || scope_id) { + return 1; + } + path = apr_pstrdup(cntxt, cp); + *cp = '\0'; + if (*url == '[') { /* IPv6 numeric address string */ + host_field = apr_psprintf(cntxt, "[%s]", hostname); + } + else { + host_field = hostname; + } + + if (port == 0) { /* no port specified */ +#ifdef USE_SSL + if (ssl == 1) + port = 443; + else +#endif + port = 80; + } + + if (( +#ifdef USE_SSL + (ssl == 1) && (port != 443)) || (( ssl == 0 ) && +#endif + (port != 80))) + { + colonhost = apr_psprintf(cntxt,":%d",port); + } else + colonhost = ""; + return 0; +} + +/* ------------------------------------------------------- */ + +/* read data to POST from file, save contents and length */ + +static int open_postfile(const char *pfile) +{ + apr_file_t *postfd = NULL; + apr_finfo_t finfo; + apr_fileperms_t mode = APR_OS_DEFAULT; + apr_size_t length; + apr_status_t rv; + char errmsg[120]; + + rv = apr_file_open(&postfd, pfile, APR_READ, mode, cntxt); + if (rv != APR_SUCCESS) { + printf("Invalid postfile name (%s): %s\n", pfile, + apr_strerror(rv, errmsg, sizeof errmsg)); + return rv; + } + + apr_file_info_get(&finfo, APR_FINFO_NORM, postfd); + postlen = (apr_size_t)finfo.size; + postdata = (char *) malloc(postlen); + if (!postdata) { + printf("Can\'t alloc postfile buffer\n"); + return APR_ENOMEM; + } + length = postlen; + rv = apr_file_read(postfd, postdata, &length); + if (rv != APR_SUCCESS) { + printf("error reading postfile: %s\n", + apr_strerror(rv, errmsg, sizeof errmsg)); + return rv; + } + if (length != postlen) { + printf("error reading postfile: read only %" + APR_SIZE_T_FMT " bytes", + length); + return APR_EINVAL; + } + apr_file_close(postfd); + return 0; +} + +/* ------------------------------------------------------- */ + +/* sort out command-line args and call test */ +int main(int argc, const char * const argv[]) +{ + int r, l; + char tmp[1024]; + apr_status_t status; + apr_getopt_t *opt; + const char *optarg; + char c; + + /* table defaults */ + tablestring = ""; + trstring = ""; + tdstring = "bgcolor=white"; + cookie = ""; + auth = ""; + proxyhost[0] = '\0'; + hdrs = ""; + + apr_app_initialize(&argc, &argv, NULL); + atexit(apr_terminate); + apr_pool_create(&cntxt, NULL); + +#ifdef NOT_ASCII + status = apr_xlate_open(&to_ascii, "ISO8859-1", APR_DEFAULT_CHARSET, cntxt); + if (status) { + fprintf(stderr, "apr_xlate_open(to ASCII)->%d\n", status); + exit(1); + } + status = apr_xlate_open(&from_ascii, APR_DEFAULT_CHARSET, "ISO8859-1", cntxt); + if (status) { + fprintf(stderr, "apr_xlate_open(from ASCII)->%d\n", status); + exit(1); + } + status = apr_base64init_ebcdic(to_ascii, from_ascii); + if (status) { + fprintf(stderr, "apr_base64init_ebcdic()->%d\n", status); + exit(1); + } +#endif + + apr_getopt_init(&opt, cntxt, argc, argv); + while ((status = apr_getopt(opt, "n:c:t:T:p:v:kVhwix:y:z:C:H:P:A:g:X:de:Sq" +#ifdef USE_SSL + "s" +#endif + ,&c, &optarg)) == APR_SUCCESS) { + switch (c) { + case 's': +#ifdef USE_SSL + ssl = 1; + break; +#else + fprintf(stderr, "SSL not compiled in; no https support\n"); + exit(1); +#endif + case 'n': + requests = atoi(optarg); + if (!requests) { + err("Invalid number of requests\n"); + } + break; + case 'k': + keepalive = 1; + break; + case 'q': + heartbeatres = 0; + break; + case 'c': + concurrency = atoi(optarg); + break; + case 'i': + if (posting == 1) + err("Cannot mix POST and HEAD\n"); + posting = -1; + break; + case 'g': + gnuplot = strdup(optarg); + break; + case 'd': + percentile = 0; + break; + case 'e': + csvperc = strdup(optarg); + break; + case 'S': + confidence = 0; + break; + case 'p': + if (posting != 0) + err("Cannot mix POST and HEAD\n"); + + if (0 == (r = open_postfile(optarg))) { + posting = 1; + } + else if (postdata) { + exit(r); + } + break; + case 'v': + verbosity = atoi(optarg); + break; + case 't': + tlimit = atoi(optarg); + requests = MAX_REQUESTS; /* need to size data array on + * something */ + break; + case 'T': + strcpy(content_type, optarg); + break; + case 'C': + cookie = apr_pstrcat(cntxt, "Cookie: ", optarg, "\r\n", NULL); + break; + case 'A': + /* + * assume username passwd already to be in colon separated form. + * Ready to be uu-encoded. + */ + while (apr_isspace(*optarg)) + optarg++; + if (apr_base64_encode_len(strlen(optarg)) > sizeof(tmp)) { + err("Authentication credentials too long\n"); + } + l = apr_base64_encode(tmp, optarg, strlen(optarg)); + tmp[l] = '\0'; + + auth = apr_pstrcat(cntxt, auth, "Authorization: Basic ", tmp, + "\r\n", NULL); + break; + case 'P': + /* + * assume username passwd already to be in colon separated form. + */ + while (apr_isspace(*optarg)) + optarg++; + if (apr_base64_encode_len(strlen(optarg)) > sizeof(tmp)) { + err("Proxy credentials too long\n"); + } + l = apr_base64_encode(tmp, optarg, strlen(optarg)); + tmp[l] = '\0'; + + auth = apr_pstrcat(cntxt, auth, "Proxy-Authorization: Basic ", + tmp, "\r\n", NULL); + break; + case 'H': + hdrs = apr_pstrcat(cntxt, hdrs, optarg, "\r\n", NULL); + break; + case 'w': + use_html = 1; + break; + /* + * if any of the following three are used, turn on html output + * automatically + */ + case 'x': + use_html = 1; + tablestring = optarg; + break; + case 'X': + { + char *p; + /* + * assume proxy-name[:port] + */ + if ((p = strchr(optarg, ':'))) { + *p = '\0'; + p++; + proxyport = atoi(p); + } + strcpy(proxyhost, optarg); + isproxy = 1; + } + break; + case 'y': + use_html = 1; + trstring = optarg; + break; + case 'z': + use_html = 1; + tdstring = optarg; + break; + case 'h': + usage(argv[0]); + break; + case 'V': + copyright(); + return 0; + } + } + + if (opt->ind != argc - 1) { + fprintf(stderr, "%s: wrong number of arguments\n", argv[0]); + usage(argv[0]); + } + + if (parse_url(apr_pstrdup(cntxt, opt->argv[opt->ind++]))) { + fprintf(stderr, "%s: invalid URL\n", argv[0]); + usage(argv[0]); + } + + if ((concurrency < 0) || (concurrency > MAX_CONCURRENCY)) { + fprintf(stderr, "%s: Invalid Concurrency [Range 0..%d]\n", + argv[0], MAX_CONCURRENCY); + usage(argv[0]); + } + + if ((heartbeatres) && (requests > 150)) { + heartbeatres = requests / 10; /* Print line every 10% of requests */ + if (heartbeatres < 100) + heartbeatres = 100; /* but never more often than once every 100 + * connections. */ + } + else + heartbeatres = 0; + +#ifdef USE_SSL +#ifdef RSAREF + R_malloc_init(); +#else + CRYPTO_malloc_init(); +#endif + SSL_load_error_strings(); + SSL_library_init(); + bio_out=BIO_new_fp(stdout,BIO_NOCLOSE); + bio_err=BIO_new_fp(stderr,BIO_NOCLOSE); + + /* TODO: Allow force SSLv2_client_method() (TLSv1?) */ + if (!(ctx = SSL_CTX_new(SSLv23_client_method()))) { + fprintf(stderr, "Could not init SSL CTX"); + ERR_print_errors_fp(stderr); + exit(1); + } + SSL_CTX_set_options(ctx, SSL_OP_ALL); +#ifdef USE_THREADS + ssl_util_thread_setup(cntxt); +#endif +#endif +#ifdef SIGPIPE + apr_signal(SIGPIPE, SIG_IGN); /* Ignore writes to connections that + * have been closed at the other end. */ +#endif + copyright(); + test(); + apr_pool_destroy(cntxt); + + return 0; +} diff --git a/rubbos/app/httpd-2.0.64/support/ab.dsp b/rubbos/app/httpd-2.0.64/support/ab.dsp new file mode 100644 index 00000000..c3866ba3 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/support/ab.dsp @@ -0,0 +1,123 @@ +# Microsoft Developer Studio Project File - Name="ab" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=ab - 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 "ab.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 "ab.mak" CFG="ab - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "ab - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "ab - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "ab - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "APR_DECLARE_STATIC" /D "APU_DECLARE_STATIC" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../srclib/apr/include" /I "../srclib/apr-util/include" /I "../include" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "APR_DECLARE_STATIC" /D "APU_DECLARE_STATIC" /Fd"Release/ab_src" /FD /c +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib wsock32.lib ws2_32.lib shell32.lib /nologo /subsystem:console +# ADD LINK32 kernel32.lib advapi32.lib wsock32.lib ws2_32.lib shell32.lib /nologo /subsystem:console /debug /opt:ref + +!ELSEIF "$(CFG)" == "ab - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "APR_DECLARE_STATIC" /D "APU_DECLARE_STATIC" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../srclib/apr/include" /I "../srclib/apr-util/include" /I "../include" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "APR_DECLARE_STATIC" /D "APU_DECLARE_STATIC" /Fd"Debug/ab_src" /FD /c +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib advapi32.lib wsock32.lib ws2_32.lib shell32.lib /nologo /subsystem:console /incremental:no /debug +# ADD LINK32 kernel32.lib advapi32.lib wsock32.lib ws2_32.lib shell32.lib /nologo /subsystem:console /incremental:no /debug + +!ENDIF + +# Begin Target + +# Name "ab - Win32 Release" +# Name "ab - Win32 Debug" +# Begin Source File + +SOURCE=.\ab.c +# End Source File +# Begin Source File + +SOURCE=.\ab.rc +# End Source File +# Begin Source File + +SOURCE=..\build\win32\win32ver.awk + +!IF "$(CFG)" == "ab - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\build\win32\win32ver.awk + +".\ab.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../build/win32/win32ver.awk ab.exe "ApacheBench Utility" ../include/ap_release.h > .\ab.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "ab - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\build\win32\win32ver.awk + +".\ab.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../build/win32/win32ver.awk ab.exe "ApacheBench Utility" ../include/ap_release.h > .\ab.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/support/ab.lo b/rubbos/app/httpd-2.0.64/support/ab.lo new file mode 100644 index 00000000..a7d38649 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/support/ab.lo @@ -0,0 +1,12 @@ +# ab.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/ab.o' + +# Name of the non-PIC object. +non_pic_object='ab.o' + diff --git a/rubbos/app/httpd-2.0.64/support/ab.o b/rubbos/app/httpd-2.0.64/support/ab.o new file mode 100644 index 0000000000000000000000000000000000000000..446096ca9f3f7485940b96dcd9e1b2662bd49a31 GIT binary patch literal 194072 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
    oTt@;MW^x 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 +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=abs - 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 "abs.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 "abs.mak" CFG="abs - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "abs - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "abs - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "abs - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "APR_DECLARE_STATIC" /D "APU_DECLARE_STATIC" /D "SSL" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../srclib/apr/include" /I "../srclib/apr-util/include" /I "../include" /I "../srclib/openssl/inc32/openssl" /I "../srclib/openssl/inc32" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "APR_DECLARE_STATIC" /D "APU_DECLARE_STATIC" /D "USE_SSL" /D "WIN32_LEAN_AND_MEAN" /D "NO_IDEA" /D "NO_RC5" /D "NO_MDC2" /D "OPENSSL_NO_IDEA" /D "OPENSSL_NO_RC5" /D "OPENSSL_NO_MDC2" /Fd"Release/abs_src" /FD /c +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib wsock32.lib ws2_32.lib shell32.lib ssleay32.lib libeay32.lib /nologo /subsystem:console /libpath:"../srclib/openssl/out32dll" +# ADD LINK32 kernel32.lib advapi32.lib wsock32.lib ws2_32.lib shell32.lib ssleay32.lib libeay32.lib /nologo /subsystem:console /debug /libpath:"../srclib/openssl/out32dll" /opt:ref + +!ELSEIF "$(CFG)" == "abs - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "APR_DECLARE_STATIC" /D "APU_DECLARE_STATIC" /D "SSL" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../srclib/apr/include" /I "../srclib/apr-util/include" /I "../include" /I "../srclib/openssl/inc32/openssl" /I "../srclib/openssl/inc32" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "APR_DECLARE_STATIC" /D "APU_DECLARE_STATIC" /D "USE_SSL" /D "WIN32_LEAN_AND_MEAN" /D "NO_IDEA" /D "NO_RC5" /D "NO_MDC2" /D "OPENSSL_NO_IDEA" /D "OPENSSL_NO_RC5" /D "OPENSSL_NO_MDC2" /Fd"Debug/abs_src" /FD /c +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib advapi32.lib wsock32.lib ws2_32.lib shell32.lib ssleay32.lib libeay32.lib /nologo /subsystem:console /incremental:no /debug /libpath:"../srclib/openssl/out32dll" +# ADD LINK32 kernel32.lib advapi32.lib wsock32.lib ws2_32.lib shell32.lib ssleay32.lib libeay32.lib /nologo /subsystem:console /incremental:no /debug /libpath:"../srclib/openssl/out32dll" + +!ENDIF + +# Begin Target + +# Name "abs - Win32 Release" +# Name "abs - Win32 Debug" +# Begin Source File + +SOURCE=.\ab.c + +!IF "$(CFG)" == "abs - Win32 Release" + +# ADD CPP /Fo"Release/abs.obj" + +!ELSEIF "$(CFG)" == "abs - Win32 Debug" + +# ADD CPP /Fo"Debug/abs.obj" + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\abs.rc +# End Source File +# Begin Source File + +SOURCE=..\build\win32\win32ver.awk + +!IF "$(CFG)" == "abs - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\build\win32\win32ver.awk + +".\abs.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../build/win32/win32ver.awk ab.exe "ApacheBench/SSL Utility" ../include/ap_release.h > .\abs.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "abs - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\build\win32\win32ver.awk + +".\abs.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../build/win32/win32ver.awk ab.exe "ApacheBench/SSL Utility" ../include/ap_release.h > .\abs.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/support/apachectl b/rubbos/app/httpd-2.0.64/support/apachectl new file mode 100644 index 00000000..5eb2fe95 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/support/apachectl @@ -0,0 +1,103 @@ +#!/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. +# +# +# Apache control script designed to allow an easy command line interface +# to controlling Apache. Written by Marc Slemko, 1997/08/23 +# +# The exit codes returned are: +# XXX this doc is no longer correct now that the interesting +# XXX functions are handled by httpd +# 0 - operation completed successfully +# 1 - +# 2 - usage error +# 3 - httpd could not be started +# 4 - httpd could not be stopped +# 5 - httpd could not be started during a restart +# 6 - httpd could not be restarted during a restart +# 7 - httpd could not be restarted during a graceful restart +# 8 - configuration syntax error +# +# When multiple arguments are given, only the error from the _last_ +# one is reported. Run "apachectl help" for usage info +# +ARGV="$@" +# +# |||||||||||||||||||| START CONFIGURATION SECTION |||||||||||||||||||| +# -------------------- -------------------- +# +# the path to your httpd binary, including options if necessary +HTTPD='/bottlenecks/rubbos/app/apache2/bin/httpd' +# +# pick up any necessary environment variables +if test -f /bottlenecks/rubbos/app/apache2/bin/envvars; then + . /bottlenecks/rubbos/app/apache2/bin/envvars +fi +# +# a command that outputs a formatted text version of the HTML at the +# url given on the command line. Designed for lynx, however other +# programs may work. +LYNX="lynx -dump" +# +# the URL to your server's mod_status status page. If you do not +# have one, then status and fullstatus will not work. +STATUSURL="http://localhost:80/server-status" +# +# Set this variable to a command that increases the maximum +# number of file descriptors allowed per child process. This is +# critical for configurations that use many file descriptors, +# such as mass vhosting, or a multithreaded server. +ULIMIT_MAX_FILES="ulimit -S -n `ulimit -H -n`" +# -------------------- -------------------- +# |||||||||||||||||||| END CONFIGURATION SECTION |||||||||||||||||||| + +# Set the maximum number of file descriptors allowed per child process. +if [ "x$ULIMIT_MAX_FILES" != "x" ] ; then + $ULIMIT_MAX_FILES +fi + +ERROR=0 +if [ "x$ARGV" = "x" ] ; then + ARGV="-h" +fi + +case $ARGV in +start|stop|restart|graceful) + $HTTPD -k $ARGV + ERROR=$? + ;; +startssl|sslstart|start-SSL) + $HTTPD -k start -DSSL + ERROR=$? + ;; +configtest) + $HTTPD -t + ERROR=$? + ;; +status) + $LYNX $STATUSURL | awk ' /process$/ { print; exit } { print } ' + ;; +fullstatus) + $LYNX $STATUSURL + ;; +*) + $HTTPD $ARGV + ERROR=$? +esac + +exit $ERROR + diff --git a/rubbos/app/httpd-2.0.64/support/apachectl.in b/rubbos/app/httpd-2.0.64/support/apachectl.in new file mode 100644 index 00000000..58732d07 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/support/apachectl.in @@ -0,0 +1,103 @@ +#!/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. +# +# +# Apache control script designed to allow an easy command line interface +# to controlling Apache. Written by Marc Slemko, 1997/08/23 +# +# The exit codes returned are: +# XXX this doc is no longer correct now that the interesting +# XXX functions are handled by httpd +# 0 - operation completed successfully +# 1 - +# 2 - usage error +# 3 - httpd could not be started +# 4 - httpd could not be stopped +# 5 - httpd could not be started during a restart +# 6 - httpd could not be restarted during a restart +# 7 - httpd could not be restarted during a graceful restart +# 8 - configuration syntax error +# +# When multiple arguments are given, only the error from the _last_ +# one is reported. Run "apachectl help" for usage info +# +ARGV="$@" +# +# |||||||||||||||||||| START CONFIGURATION SECTION |||||||||||||||||||| +# -------------------- -------------------- +# +# the path to your httpd binary, including options if necessary +HTTPD='@exp_sbindir@/@progname@' +# +# pick up any necessary environment variables +if test -f @exp_sbindir@/envvars; then + . @exp_sbindir@/envvars +fi +# +# a command that outputs a formatted text version of the HTML at the +# url given on the command line. Designed for lynx, however other +# programs may work. +LYNX="lynx -dump" +# +# the URL to your server's mod_status status page. If you do not +# have one, then status and fullstatus will not work. +STATUSURL="http://localhost:@PORT@/server-status" +# +# Set this variable to a command that increases the maximum +# number of file descriptors allowed per child process. This is +# critical for configurations that use many file descriptors, +# such as mass vhosting, or a multithreaded server. +ULIMIT_MAX_FILES="@APACHECTL_ULIMIT@" +# -------------------- -------------------- +# |||||||||||||||||||| END CONFIGURATION SECTION |||||||||||||||||||| + +# Set the maximum number of file descriptors allowed per child process. +if [ "x$ULIMIT_MAX_FILES" != "x" ] ; then + $ULIMIT_MAX_FILES +fi + +ERROR=0 +if [ "x$ARGV" = "x" ] ; then + ARGV="-h" +fi + +case $ARGV in +start|stop|restart|graceful) + $HTTPD -k $ARGV + ERROR=$? + ;; +startssl|sslstart|start-SSL) + $HTTPD -k start -DSSL + ERROR=$? + ;; +configtest) + $HTTPD -t + ERROR=$? + ;; +status) + $LYNX $STATUSURL | awk ' /process$/ { print; exit } { print } ' + ;; +fullstatus) + $LYNX $STATUSURL + ;; +*) + $HTTPD $ARGV + ERROR=$? +esac + +exit $ERROR + diff --git a/rubbos/app/httpd-2.0.64/support/apxs b/rubbos/app/httpd-2.0.64/support/apxs new file mode 100644 index 00000000..4b3b702d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/support/apxs @@ -0,0 +1,778 @@ +#!/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. + +require 5.003; +use strict; +package apxs; + +## +## Configuration +## + +my %config_vars = (); + +my $installbuilddir = "/bottlenecks/rubbos/app/apache2/build"; +get_config_vars("$installbuilddir/config_vars.mk",\%config_vars); + +# read the configuration variables once + +my $prefix = get_vars("prefix"); +my $CFG_PREFIX = $prefix; +my $exec_prefix = get_vars("exec_prefix"); +my $datadir = get_vars("datadir"); +my $localstatedir = get_vars("localstatedir"); +my $CFG_TARGET = get_vars("progname"); +my $CFG_SYSCONFDIR = get_vars("sysconfdir"); +my $CFG_CFLAGS = join ' ', map { get_vars($_) } + qw(SHLTCFLAGS CFLAGS NOTEST_CPPFLAGS EXTRA_CPPFLAGS EXTRA_CFLAGS); +my $includedir = get_vars("includedir"); +my $CFG_INCLUDEDIR = eval qq("$includedir"); +my $CFG_CC = get_vars("CC"); +my $libexecdir = get_vars("libexecdir"); +my $CFG_LIBEXECDIR = eval qq("$libexecdir"); +my $sbindir = get_vars("sbindir"); +my $CFG_SBINDIR = eval qq("$sbindir"); +my $ltflags = $ENV{'LTFLAGS'}; +$ltflags or $ltflags = "--silent"; + +my %internal_vars = map {$_ => 1} + qw(TARGET CC CFLAGS CFLAGS_SHLIB LD_SHLIB LDFLAGS_SHLIB LIBS_SHLIB + PREFIX SBINDIR INCLUDEDIR LIBEXECDIR SYSCONFDIR); + +## +## parse argument line +## + +# defaults for parameters +my $opt_n = ''; +my $opt_g = ''; +my $opt_c = 0; +my $opt_o = ''; +my @opt_D = (); +my @opt_I = (); +my @opt_L = (); +my @opt_l = (); +my @opt_W = (); +my @opt_S = (); +my $opt_e = 0; +my $opt_i = 0; +my $opt_a = 0; +my $opt_A = 0; +my $opt_q = 0; +my $opt_h = 0; +my $opt_p = 0; + +# this subroutine is derived from Perl's getopts.pl with the enhancement of +# the "+" metacharacter at the format string to allow a list to be built by +# subsequent occurrences of the same option. +sub Getopts { + my ($argumentative, @ARGV) = @_; + my $errs = 0; + local $_; + local $[ = 0; + + my @args = split / */, $argumentative; + while (@ARGV && ($_ = $ARGV[0]) =~ /^-(.)(.*)/) { + my ($first, $rest) = ($1,$2); + if ($_ =~ m|^--$|) { + shift @ARGV; + last; + } + my $pos = index($argumentative,$first); + if ($pos >= $[) { + if ($pos < $#args && $args[$pos+1] eq ':') { + shift @ARGV; + if ($rest eq '') { + unless (@ARGV) { + error("Incomplete option: $first (needs an argument)"); + $errs++; + } + $rest = shift(@ARGV); + } + eval "\$opt_$first = \$rest;"; + } + elsif ($pos < $#args && $args[$pos+1] eq '+') { + shift @ARGV; + if ($rest eq '') { + unless (@ARGV) { + error("Incomplete option: $first (needs an argument)"); + $errs++; + } + $rest = shift(@ARGV); + } + eval "push(\@opt_$first, \$rest);"; + } + else { + eval "\$opt_$first = 1"; + if ($rest eq '') { + shift(@ARGV); + } + else { + $ARGV[0] = "-$rest"; + } + } + } + else { + error("Unknown option: $first"); + $errs++; + if ($rest ne '') { + $ARGV[0] = "-$rest"; + } + else { + shift(@ARGV); + } + } + } + return ($errs == 0, @ARGV); +} + +sub usage { + print STDERR "Usage: apxs -g [-S =] -n \n"; + print STDERR " apxs -q [-S =] ...\n"; + print STDERR " apxs -c [-S =] [-o ] [-D [=]]\n"; + print STDERR " [-I ] [-L ] [-l ] [-Wc,]\n"; + print STDERR " [-Wl,] [-p] ...\n"; + print STDERR " apxs -i [-S =] [-a] [-A] [-n ] ...\n"; + print STDERR " apxs -e [-S =] [-a] [-A] [-n ] ...\n"; + exit(1); +} + +# option handling +my $rc; +($rc, @ARGV) = &Getopts("qn:gco:I+D+L+l+W+S+eiaAp", @ARGV); +&usage if ($rc == 0); +&usage if ($#ARGV == -1 and not $opt_g); +&usage if (not $opt_q and not ($opt_g and $opt_n) and not $opt_i and not $opt_c and not $opt_e); + +# argument handling +my @args = @ARGV; +my $name = 'unknown'; +$name = $opt_n if ($opt_n ne ''); + +if (@opt_S) { + my ($opt_S); + foreach $opt_S (@opt_S) { + if ($opt_S =~ m/^([^=]+)=(.*)$/) { + my ($var) = $1; + my ($val) = $2; + my $oldval = eval "\$CFG_$var"; + + unless ($var and $oldval) { + print STDERR "apxs:Error: no config variable $var\n"; + &usage; + } + + eval "\$CFG_${var}=\"${val}\""; + } else { + print STDERR "apxs:Error: malformatted -S option\n"; + &usage; + } + } +} + +## +## Initial shared object support check +## +my $httpd = get_vars("sbindir") . "/" . get_vars("progname"); +$httpd = eval qq("$httpd"); +$httpd = eval qq("$httpd"); +my $envvars = get_vars("sbindir") . "/envvars"; +$envvars = eval qq("$envvars"); +$envvars = eval qq("$envvars"); + +#allow apxs to be run from the source tree, before installation +if ($0 =~ m:support/apxs$:) { + ($httpd = $0) =~ s:support/apxs$::; +} + +unless (-x "$httpd") { + error("$httpd not found or not executable"); + exit 1; +} + +unless (grep /mod_so/, `. $envvars && $httpd -l`) { + error("Sorry, no shared object support for Apache"); + error("available under your platform. Make sure"); + error("the Apache module mod_so is compiled into"); + error("your server binary `$httpd'."); + exit 1; +} + +sub get_config_vars{ + my ($file, $rh_config) = @_; + + open IN, $file or die "cannot open $file: $!"; + while (){ + if (/^\s*(.*?)\s*=\s*(.*)$/){ + $rh_config->{$1} = $2; + } + } + close IN; +} + +sub get_vars { + my $result = ''; + my $ok = 0; + my $arg; + foreach $arg (@_) { + if (exists $config_vars{$arg} or exists $config_vars{lc $arg}) { + my $val = exists $config_vars{$arg} + ? $config_vars{$arg} + : $config_vars{lc $arg}; + $val =~ s/[()]//g; + $result .= eval "qq($val)" if defined $val; + $result .= ";;"; + $ok = 1; + } + if (not $ok) { + if (exists $internal_vars{$arg} or exists $internal_vars{lc $arg}) { + my $val = exists $internal_vars{$arg} ? $arg : lc $arg; + $val = eval "\$CFG_$val"; + $result .= eval "qq($val)" if defined $val; + $result .= ";;"; + $ok = 1; + } + if (not $ok) { + error("Invalid query string `$arg'"); + exit(1); + } + } + } + $result =~ s|;;$||; + $result =~ s|:| |; + return $result; +} + +## +## Operation +## + +# helper function for executing a list of +# system command with return code checks +sub execute_cmds { + my (@cmds) = @_; + my ($cmd, $rc); + + foreach $cmd (@cmds) { + notice($cmd); + $rc = system $cmd; + if ($rc) { + error(sprintf "Command failed with rc=%d\n", $rc << 8); + exit 1 ; + } + } +} + +if ($opt_g) { + ## + ## SAMPLE MODULE SOURCE GENERATION + ## + + if (-d $name) { + error("Directory `$name' already exists. Remove first"); + exit(1); + } + + my $data = join('', ); + $data =~ s|%NAME%|$name|sg; + $data =~ s|%TARGET%|$CFG_TARGET|sg; + $data =~ s|%PREFIX%|$prefix|sg; + $data =~ s|%INSTALLBUILDDIR%|$installbuilddir|sg; + + my ($mkf, $mods, $src) = ($data =~ m|^(.+)-=#=-\n(.+)-=#=-\n(.+)|s); + + notice("Creating [DIR] $name"); + system("mkdir $name"); + notice("Creating [FILE] $name/Makefile"); + open(FP, ">${name}/Makefile") || die; + print FP $mkf; + close(FP); + notice("Creating [FILE] $name/modules.mk"); + open(FP, ">${name}/modules.mk") || die; + print FP $mods; + close(FP); + notice("Creating [FILE] $name/mod_$name.c"); + open(FP, ">${name}/mod_${name}.c") || die; + print FP $src; + close(FP); + notice("Creating [FILE] $name/.deps"); + system("touch ${name}/.deps"); + + exit(0); +} + + +if ($opt_q) { + ## + ## QUERY INFORMATION + ## + my $result = get_vars(@args); + print "$result\n"; +} + +my $apr_bindir = get_vars("APR_BINDIR"); + +if (! -x "$apr_bindir/apr-config") { + error("$apr_bindir/apr-config not found!"); + exit(1); +} + +my $apu_bindir = get_vars("APU_BINDIR"); + +if (! -x "$apu_bindir/apu-config") { + error("$apu_bindir/apu-config not found!"); + exit(1); +} + +my $libtool = `$apr_bindir/apr-config --installbuilddir`; +chomp($libtool); +$libtool = "$libtool/libtool"; + +my $apr_includedir = `$apr_bindir/apr-config --includes`; +chomp($apr_includedir); +my $apu_includedir = `$apu_bindir/apu-config --includes`; +chomp($apu_includedir); + +if ($opt_c) { + ## + ## SHARED OBJECT COMPILATION + ## + + # split files into sources and objects + my @srcs = (); + my @objs = (); + my $f; + foreach $f (@args) { + if ($f =~ m|\.c$|) { + push(@srcs, $f); + } + else { + push(@objs, $f); + } + } + + # determine output file + my $dso_file; + if ($opt_o eq '') { + if ($#srcs > -1) { + $dso_file = $srcs[0]; + $dso_file =~ s|\.[^.]+$|.la|; + } + elsif ($#objs > -1) { + $dso_file = $objs[0]; + $dso_file =~ s|\.[^.]+$|.la|; + } + else { + $dso_file = "mod_unknown.la"; + } + } + else { + $dso_file = $opt_o; + $dso_file =~ s|\.[^.]+$|.la|; + } + + # create compilation commands + my @cmds = (); + my $opt = ''; + my ($opt_Wc, $opt_I, $opt_D); + foreach $opt_Wc (@opt_W) { + $opt .= "$1 " if ($opt_Wc =~ m|^\s*c,(.*)$|); + } + foreach $opt_I (@opt_I) { + $opt .= "-I$opt_I "; + } + foreach $opt_D (@opt_D) { + $opt .= "-D$opt_D "; + } + my $cflags = "$CFG_CFLAGS"; + my $s; + my $mod; + foreach $s (@srcs) { + my $slo = $s; + $slo =~ s|\.c$|.slo|; + my $lo = $s; + $lo =~ s|\.c$|.lo|; + my $la = $s; + $la =~ s|\.c$|.la|; + my $o = $s; + $o =~ s|\.c$|.o|; + push(@cmds, "$libtool $ltflags --mode=compile $CFG_CC $cflags -I$CFG_INCLUDEDIR $apr_includedir $apu_includedir $opt -c -o $lo $s && touch $slo"); + unshift(@objs, $lo); + } + + # create link command + my $o; + my $lo; + foreach $o (@objs) { + $lo .= " $o"; + } + my ($opt_Wl, $opt_L, $opt_l); + $opt = ''; + foreach $opt_Wl (@opt_W) { + $opt .= "$1 " if ($opt_Wl =~ m|^\s*l,(.*)$|); + } + foreach $opt_L (@opt_L) { + $opt .= " -L$opt_L"; + } + foreach $opt_l (@opt_l) { + $opt .= " -l$opt_l"; + } + + if ($opt_p == 1) { + + my $apr_libs=`$apr_bindir/apr-config --ldflags --link-libtool --libs`; + chomp($apr_libs); + my $apu_libs=`$apu_bindir/apu-config --ldflags --link-libtool --libs`; + chomp($apu_libs); + + $opt .= " ".$apu_libs." ".$apr_libs; + } + else { + my $apr_ldflags=`$apr_bindir/apr-config --ldflags`; + chomp($apr_ldflags); + $opt .= " -rpath $CFG_LIBEXECDIR -module -avoid-version $apr_ldflags"; + } + + push(@cmds, "$libtool $ltflags --mode=link $CFG_CC -o $dso_file $opt $lo"); + + # execute the commands + &execute_cmds(@cmds); + + # allow one-step compilation and installation + if ($opt_i or $opt_e) { + @args = ( $dso_file ); + } +} + +if ($opt_i or $opt_e) { + ## + ## SHARED OBJECT INSTALLATION + ## + + # determine installation commands + # and corresponding LoadModule/AddModule directives + my @lmd = (); + my @amd = (); + my @cmds = (); + my $f; + foreach $f (@args) { + if ($f !~ m#(\.so$|\.la$)#) { + error("file $f is not a shared object"); + exit(1); + } + my $t = $f; + $t =~ s|^.+/([^/]+)$|$1|; + $t =~ s|\.la$|\.so|; + if ($opt_i) { + push(@cmds, "$installbuilddir/instdso.sh SH_LIBTOOL='" . + "$libtool' $f $CFG_LIBEXECDIR"); + push(@cmds, "chmod 755 $CFG_LIBEXECDIR/$t"); + } + + # determine module symbolname and filename + my $filename = ''; + if ($name eq 'unknown') { + $name = ''; + my $base = $f; + $base =~ s|\.[^.]+$||; + if (-f "$base.c") { + open(FP, "<$base.c"); + my $content = join('', ); + close(FP); + if ($content =~ m|.*module\s+(?:AP_MODULE_DECLARE_DATA\s+)?([a-zA-Z0-9_]+)_module\s*=\s*.*|s) { + $name = "$1"; + $filename = "$base.c"; + $filename =~ s|^[^/]+/||; + } + } + if ($name eq '') { + if ($base =~ m|.*mod_([a-zA-Z0-9_]+)\..+|) { + $name = "$1"; + $filename = $base; + $filename =~ s|^[^/]+/||; + } + } + if ($name eq '') { + error("Sorry, cannot determine bootstrap symbol name"); + error("Please specify one with option `-n'"); + exit(1); + } + } + if ($filename eq '') { + $filename = "mod_${name}.c"; + } + my $dir = $CFG_LIBEXECDIR; + $dir =~ s|^$CFG_PREFIX/?||; + $dir =~ s|(.)$|$1/|; + $t =~ s|\.la$|.so|; + push(@lmd, sprintf("LoadModule %-18s %s", "${name}_module", "$dir$t")); + push(@amd, sprintf("AddModule %s", $filename)); + } + + # execute the commands + &execute_cmds(@cmds); + + # activate module via LoadModule/AddModule directive + if ($opt_a or $opt_A) { + if (not -f "$CFG_SYSCONFDIR/$CFG_TARGET.conf") { + error("Config file $CFG_SYSCONFDIR/$CFG_TARGET.conf not found"); + exit(1); + } + + open(FP, "<$CFG_SYSCONFDIR/$CFG_TARGET.conf") || die; + my $content = join('', ); + close(FP); + + if ($content !~ m|\n#?\s*LoadModule\s+|) { + error("Activation failed for custom $CFG_SYSCONFDIR/$CFG_TARGET.conf file."); + error("At least one `LoadModule' directive already has to exist."); + exit(1); + } + + my $lmd; + my $c = ''; + $c = '#' if ($opt_A); + foreach $lmd (@lmd) { + my $what = $opt_A ? "preparing" : "activating"; + my $lmd_re = $lmd; + $lmd_re =~ s/\s+/\\s+/g; + + if ($content !~ m|\n#?\s*$lmd_re|) { + # check for open , so that the new LoadModule + # directive always appears *outside* of an . + + my $before = ($content =~ m|^(.*\n)#?\s*LoadModule\s+[^\n]+\n|s)[0]; + + # the '()=' trick forces list context and the scalar + # assignment counts the number of list members (aka number + # of matches) then + my $cntopen = () = ($before =~ m|^\s*<[^/].*$|mg); + my $cntclose = () = ($before =~ m|^\s*$CFG_SYSCONFDIR/$CFG_TARGET.conf.new")) { + print FP $content; + close(FP); + system("cp $CFG_SYSCONFDIR/$CFG_TARGET.conf $CFG_SYSCONFDIR/$CFG_TARGET.conf.bak && " . + "cp $CFG_SYSCONFDIR/$CFG_TARGET.conf.new $CFG_SYSCONFDIR/$CFG_TARGET.conf && " . + "rm $CFG_SYSCONFDIR/$CFG_TARGET.conf.new"); + } else { + notice("unable to open configuration file"); + } + } + } +} + +sub error{ + print STDERR "apxs:Error: $_[0].\n"; +} + +sub notice{ + print STDERR "$_[0]\n"; +} + +##EOF## +__DATA__ +## +## Makefile -- Build procedure for sample %NAME% Apache module +## Autogenerated via ``apxs -n %NAME% -g''. +## + +builddir=. +top_srcdir=%PREFIX% +top_builddir=%PREFIX% +include %INSTALLBUILDDIR%/special.mk + +# the used tools +APXS=apxs +APACHECTL=apachectl + +# additional defines, includes and libraries +#DEFS=-Dmy_define=my_value +#INCLUDES=-Imy/include/dir +#LIBS=-Lmy/lib/dir -lmylib + +# the default target +all: local-shared-build + +# install the shared object file into Apache +install: install-modules + +# cleanup +clean: + -rm -f mod_%NAME%.o mod_%NAME%.lo mod_%NAME%.slo mod_%NAME%.la + +# simple test +test: reload + lynx -mime_header http://localhost/%NAME% + +# install and activate shared object by reloading Apache to +# force a reload of the shared object file +reload: install restart + +# the general Apache start/restart/stop +# procedures +start: + $(APACHECTL) start +restart: + $(APACHECTL) restart +stop: + $(APACHECTL) stop + +-=#=- +mod_%NAME%.la: mod_%NAME%.slo + $(SH_LINK) -rpath $(libexecdir) -module -avoid-version mod_%NAME%.lo +DISTCLEAN_TARGETS = modules.mk +shared = mod_%NAME%.la +-=#=- +/* +** mod_%NAME%.c -- Apache sample %NAME% module +** [Autogenerated via ``apxs -n %NAME% -g''] +** +** To play with this sample module first compile it into a +** DSO file and install it into Apache's modules directory +** by running: +** +** $ apxs -c -i mod_%NAME%.c +** +** Then activate it in Apache's %TARGET%.conf file for instance +** for the URL /%NAME% in as follows: +** +** # %TARGET%.conf +** LoadModule %NAME%_module modules/mod_%NAME%.so +** +** SetHandler %NAME% +** +** +** Then after restarting Apache via +** +** $ apachectl restart +** +** you immediately can request the URL /%NAME% and watch for the +** output of this module. This can be achieved for instance via: +** +** $ lynx -mime_header http://localhost/%NAME% +** +** The output should be similar to the following one: +** +** HTTP/1.1 200 OK +** Date: Tue, 31 Mar 1998 14:42:22 GMT +** Server: Apache/1.3.4 (Unix) +** Connection: close +** Content-Type: text/html +** +** The sample page from mod_%NAME%.c +*/ + +#include "httpd.h" +#include "http_config.h" +#include "http_protocol.h" +#include "ap_config.h" + +/* The sample content handler */ +static int %NAME%_handler(request_rec *r) +{ + if (strcmp(r->handler, "%NAME%")) { + return DECLINED; + } + r->content_type = "text/html"; + + if (!r->header_only) + ap_rputs("The sample page from mod_%NAME%.c\n", r); + return OK; +} + +static void %NAME%_register_hooks(apr_pool_t *p) +{ + ap_hook_handler(%NAME%_handler, NULL, NULL, APR_HOOK_MIDDLE); +} + +/* Dispatch list for API hooks */ +module AP_MODULE_DECLARE_DATA %NAME%_module = { + STANDARD20_MODULE_STUFF, + NULL, /* create per-dir config structures */ + NULL, /* merge per-dir config structures */ + NULL, /* create per-server config structures */ + NULL, /* merge per-server config structures */ + NULL, /* table of config file commands */ + %NAME%_register_hooks /* register hooks */ +}; + diff --git a/rubbos/app/httpd-2.0.64/support/apxs.in b/rubbos/app/httpd-2.0.64/support/apxs.in new file mode 100644 index 00000000..135544cc --- /dev/null +++ b/rubbos/app/httpd-2.0.64/support/apxs.in @@ -0,0 +1,778 @@ +#!@perlbin@ -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. + +require 5.003; +use strict; +package apxs; + +## +## Configuration +## + +my %config_vars = (); + +my $installbuilddir = "@exp_installbuilddir@"; +get_config_vars("$installbuilddir/config_vars.mk",\%config_vars); + +# read the configuration variables once + +my $prefix = get_vars("prefix"); +my $CFG_PREFIX = $prefix; +my $exec_prefix = get_vars("exec_prefix"); +my $datadir = get_vars("datadir"); +my $localstatedir = get_vars("localstatedir"); +my $CFG_TARGET = get_vars("progname"); +my $CFG_SYSCONFDIR = get_vars("sysconfdir"); +my $CFG_CFLAGS = join ' ', map { get_vars($_) } + qw(SHLTCFLAGS CFLAGS NOTEST_CPPFLAGS EXTRA_CPPFLAGS EXTRA_CFLAGS); +my $includedir = get_vars("includedir"); +my $CFG_INCLUDEDIR = eval qq("$includedir"); +my $CFG_CC = get_vars("CC"); +my $libexecdir = get_vars("libexecdir"); +my $CFG_LIBEXECDIR = eval qq("$libexecdir"); +my $sbindir = get_vars("sbindir"); +my $CFG_SBINDIR = eval qq("$sbindir"); +my $ltflags = $ENV{'LTFLAGS'}; +$ltflags or $ltflags = "--silent"; + +my %internal_vars = map {$_ => 1} + qw(TARGET CC CFLAGS CFLAGS_SHLIB LD_SHLIB LDFLAGS_SHLIB LIBS_SHLIB + PREFIX SBINDIR INCLUDEDIR LIBEXECDIR SYSCONFDIR); + +## +## parse argument line +## + +# defaults for parameters +my $opt_n = ''; +my $opt_g = ''; +my $opt_c = 0; +my $opt_o = ''; +my @opt_D = (); +my @opt_I = (); +my @opt_L = (); +my @opt_l = (); +my @opt_W = (); +my @opt_S = (); +my $opt_e = 0; +my $opt_i = 0; +my $opt_a = 0; +my $opt_A = 0; +my $opt_q = 0; +my $opt_h = 0; +my $opt_p = 0; + +# this subroutine is derived from Perl's getopts.pl with the enhancement of +# the "+" metacharacter at the format string to allow a list to be built by +# subsequent occurrences of the same option. +sub Getopts { + my ($argumentative, @ARGV) = @_; + my $errs = 0; + local $_; + local $[ = 0; + + my @args = split / */, $argumentative; + while (@ARGV && ($_ = $ARGV[0]) =~ /^-(.)(.*)/) { + my ($first, $rest) = ($1,$2); + if ($_ =~ m|^--$|) { + shift @ARGV; + last; + } + my $pos = index($argumentative,$first); + if ($pos >= $[) { + if ($pos < $#args && $args[$pos+1] eq ':') { + shift @ARGV; + if ($rest eq '') { + unless (@ARGV) { + error("Incomplete option: $first (needs an argument)"); + $errs++; + } + $rest = shift(@ARGV); + } + eval "\$opt_$first = \$rest;"; + } + elsif ($pos < $#args && $args[$pos+1] eq '+') { + shift @ARGV; + if ($rest eq '') { + unless (@ARGV) { + error("Incomplete option: $first (needs an argument)"); + $errs++; + } + $rest = shift(@ARGV); + } + eval "push(\@opt_$first, \$rest);"; + } + else { + eval "\$opt_$first = 1"; + if ($rest eq '') { + shift(@ARGV); + } + else { + $ARGV[0] = "-$rest"; + } + } + } + else { + error("Unknown option: $first"); + $errs++; + if ($rest ne '') { + $ARGV[0] = "-$rest"; + } + else { + shift(@ARGV); + } + } + } + return ($errs == 0, @ARGV); +} + +sub usage { + print STDERR "Usage: apxs -g [-S =] -n \n"; + print STDERR " apxs -q [-S =] ...\n"; + print STDERR " apxs -c [-S =] [-o ] [-D [=]]\n"; + print STDERR " [-I ] [-L ] [-l ] [-Wc,]\n"; + print STDERR " [-Wl,] [-p] ...\n"; + print STDERR " apxs -i [-S =] [-a] [-A] [-n ] ...\n"; + print STDERR " apxs -e [-S =] [-a] [-A] [-n ] ...\n"; + exit(1); +} + +# option handling +my $rc; +($rc, @ARGV) = &Getopts("qn:gco:I+D+L+l+W+S+eiaAp", @ARGV); +&usage if ($rc == 0); +&usage if ($#ARGV == -1 and not $opt_g); +&usage if (not $opt_q and not ($opt_g and $opt_n) and not $opt_i and not $opt_c and not $opt_e); + +# argument handling +my @args = @ARGV; +my $name = 'unknown'; +$name = $opt_n if ($opt_n ne ''); + +if (@opt_S) { + my ($opt_S); + foreach $opt_S (@opt_S) { + if ($opt_S =~ m/^([^=]+)=(.*)$/) { + my ($var) = $1; + my ($val) = $2; + my $oldval = eval "\$CFG_$var"; + + unless ($var and $oldval) { + print STDERR "apxs:Error: no config variable $var\n"; + &usage; + } + + eval "\$CFG_${var}=\"${val}\""; + } else { + print STDERR "apxs:Error: malformatted -S option\n"; + &usage; + } + } +} + +## +## Initial shared object support check +## +my $httpd = get_vars("sbindir") . "/" . get_vars("progname"); +$httpd = eval qq("$httpd"); +$httpd = eval qq("$httpd"); +my $envvars = get_vars("sbindir") . "/envvars"; +$envvars = eval qq("$envvars"); +$envvars = eval qq("$envvars"); + +#allow apxs to be run from the source tree, before installation +if ($0 =~ m:support/apxs$:) { + ($httpd = $0) =~ s:support/apxs$::; +} + +unless (-x "$httpd") { + error("$httpd not found or not executable"); + exit 1; +} + +unless (grep /mod_so/, `. $envvars && $httpd -l`) { + error("Sorry, no shared object support for Apache"); + error("available under your platform. Make sure"); + error("the Apache module mod_so is compiled into"); + error("your server binary `$httpd'."); + exit 1; +} + +sub get_config_vars{ + my ($file, $rh_config) = @_; + + open IN, $file or die "cannot open $file: $!"; + while (){ + if (/^\s*(.*?)\s*=\s*(.*)$/){ + $rh_config->{$1} = $2; + } + } + close IN; +} + +sub get_vars { + my $result = ''; + my $ok = 0; + my $arg; + foreach $arg (@_) { + if (exists $config_vars{$arg} or exists $config_vars{lc $arg}) { + my $val = exists $config_vars{$arg} + ? $config_vars{$arg} + : $config_vars{lc $arg}; + $val =~ s/[()]//g; + $result .= eval "qq($val)" if defined $val; + $result .= ";;"; + $ok = 1; + } + if (not $ok) { + if (exists $internal_vars{$arg} or exists $internal_vars{lc $arg}) { + my $val = exists $internal_vars{$arg} ? $arg : lc $arg; + $val = eval "\$CFG_$val"; + $result .= eval "qq($val)" if defined $val; + $result .= ";;"; + $ok = 1; + } + if (not $ok) { + error("Invalid query string `$arg'"); + exit(1); + } + } + } + $result =~ s|;;$||; + $result =~ s|:| |; + return $result; +} + +## +## Operation +## + +# helper function for executing a list of +# system command with return code checks +sub execute_cmds { + my (@cmds) = @_; + my ($cmd, $rc); + + foreach $cmd (@cmds) { + notice($cmd); + $rc = system $cmd; + if ($rc) { + error(sprintf "Command failed with rc=%d\n", $rc << 8); + exit 1 ; + } + } +} + +if ($opt_g) { + ## + ## SAMPLE MODULE SOURCE GENERATION + ## + + if (-d $name) { + error("Directory `$name' already exists. Remove first"); + exit(1); + } + + my $data = join('', ); + $data =~ s|%NAME%|$name|sg; + $data =~ s|%TARGET%|$CFG_TARGET|sg; + $data =~ s|%PREFIX%|$prefix|sg; + $data =~ s|%INSTALLBUILDDIR%|$installbuilddir|sg; + + my ($mkf, $mods, $src) = ($data =~ m|^(.+)-=#=-\n(.+)-=#=-\n(.+)|s); + + notice("Creating [DIR] $name"); + system("mkdir $name"); + notice("Creating [FILE] $name/Makefile"); + open(FP, ">${name}/Makefile") || die; + print FP $mkf; + close(FP); + notice("Creating [FILE] $name/modules.mk"); + open(FP, ">${name}/modules.mk") || die; + print FP $mods; + close(FP); + notice("Creating [FILE] $name/mod_$name.c"); + open(FP, ">${name}/mod_${name}.c") || die; + print FP $src; + close(FP); + notice("Creating [FILE] $name/.deps"); + system("touch ${name}/.deps"); + + exit(0); +} + + +if ($opt_q) { + ## + ## QUERY INFORMATION + ## + my $result = get_vars(@args); + print "$result\n"; +} + +my $apr_bindir = get_vars("APR_BINDIR"); + +if (! -x "$apr_bindir/apr-config") { + error("$apr_bindir/apr-config not found!"); + exit(1); +} + +my $apu_bindir = get_vars("APU_BINDIR"); + +if (! -x "$apu_bindir/apu-config") { + error("$apu_bindir/apu-config not found!"); + exit(1); +} + +my $libtool = `$apr_bindir/apr-config --installbuilddir`; +chomp($libtool); +$libtool = "$libtool/libtool"; + +my $apr_includedir = `$apr_bindir/apr-config --includes`; +chomp($apr_includedir); +my $apu_includedir = `$apu_bindir/apu-config --includes`; +chomp($apu_includedir); + +if ($opt_c) { + ## + ## SHARED OBJECT COMPILATION + ## + + # split files into sources and objects + my @srcs = (); + my @objs = (); + my $f; + foreach $f (@args) { + if ($f =~ m|\.c$|) { + push(@srcs, $f); + } + else { + push(@objs, $f); + } + } + + # determine output file + my $dso_file; + if ($opt_o eq '') { + if ($#srcs > -1) { + $dso_file = $srcs[0]; + $dso_file =~ s|\.[^.]+$|.la|; + } + elsif ($#objs > -1) { + $dso_file = $objs[0]; + $dso_file =~ s|\.[^.]+$|.la|; + } + else { + $dso_file = "mod_unknown.la"; + } + } + else { + $dso_file = $opt_o; + $dso_file =~ s|\.[^.]+$|.la|; + } + + # create compilation commands + my @cmds = (); + my $opt = ''; + my ($opt_Wc, $opt_I, $opt_D); + foreach $opt_Wc (@opt_W) { + $opt .= "$1 " if ($opt_Wc =~ m|^\s*c,(.*)$|); + } + foreach $opt_I (@opt_I) { + $opt .= "-I$opt_I "; + } + foreach $opt_D (@opt_D) { + $opt .= "-D$opt_D "; + } + my $cflags = "$CFG_CFLAGS"; + my $s; + my $mod; + foreach $s (@srcs) { + my $slo = $s; + $slo =~ s|\.c$|.slo|; + my $lo = $s; + $lo =~ s|\.c$|.lo|; + my $la = $s; + $la =~ s|\.c$|.la|; + my $o = $s; + $o =~ s|\.c$|.o|; + push(@cmds, "$libtool $ltflags --mode=compile $CFG_CC $cflags -I$CFG_INCLUDEDIR $apr_includedir $apu_includedir $opt -c -o $lo $s && touch $slo"); + unshift(@objs, $lo); + } + + # create link command + my $o; + my $lo; + foreach $o (@objs) { + $lo .= " $o"; + } + my ($opt_Wl, $opt_L, $opt_l); + $opt = ''; + foreach $opt_Wl (@opt_W) { + $opt .= "$1 " if ($opt_Wl =~ m|^\s*l,(.*)$|); + } + foreach $opt_L (@opt_L) { + $opt .= " -L$opt_L"; + } + foreach $opt_l (@opt_l) { + $opt .= " -l$opt_l"; + } + + if ($opt_p == 1) { + + my $apr_libs=`$apr_bindir/apr-config --ldflags --link-libtool --libs`; + chomp($apr_libs); + my $apu_libs=`$apu_bindir/apu-config --ldflags --link-libtool --libs`; + chomp($apu_libs); + + $opt .= " ".$apu_libs." ".$apr_libs; + } + else { + my $apr_ldflags=`$apr_bindir/apr-config --ldflags`; + chomp($apr_ldflags); + $opt .= " -rpath $CFG_LIBEXECDIR -module -avoid-version $apr_ldflags"; + } + + push(@cmds, "$libtool $ltflags --mode=link $CFG_CC -o $dso_file $opt $lo"); + + # execute the commands + &execute_cmds(@cmds); + + # allow one-step compilation and installation + if ($opt_i or $opt_e) { + @args = ( $dso_file ); + } +} + +if ($opt_i or $opt_e) { + ## + ## SHARED OBJECT INSTALLATION + ## + + # determine installation commands + # and corresponding LoadModule/AddModule directives + my @lmd = (); + my @amd = (); + my @cmds = (); + my $f; + foreach $f (@args) { + if ($f !~ m#(\.so$|\.la$)#) { + error("file $f is not a shared object"); + exit(1); + } + my $t = $f; + $t =~ s|^.+/([^/]+)$|$1|; + $t =~ s|\.la$|\.so|; + if ($opt_i) { + push(@cmds, "$installbuilddir/instdso.sh SH_LIBTOOL='" . + "$libtool' $f $CFG_LIBEXECDIR"); + push(@cmds, "chmod 755 $CFG_LIBEXECDIR/$t"); + } + + # determine module symbolname and filename + my $filename = ''; + if ($name eq 'unknown') { + $name = ''; + my $base = $f; + $base =~ s|\.[^.]+$||; + if (-f "$base.c") { + open(FP, "<$base.c"); + my $content = join('', ); + close(FP); + if ($content =~ m|.*module\s+(?:AP_MODULE_DECLARE_DATA\s+)?([a-zA-Z0-9_]+)_module\s*=\s*.*|s) { + $name = "$1"; + $filename = "$base.c"; + $filename =~ s|^[^/]+/||; + } + } + if ($name eq '') { + if ($base =~ m|.*mod_([a-zA-Z0-9_]+)\..+|) { + $name = "$1"; + $filename = $base; + $filename =~ s|^[^/]+/||; + } + } + if ($name eq '') { + error("Sorry, cannot determine bootstrap symbol name"); + error("Please specify one with option `-n'"); + exit(1); + } + } + if ($filename eq '') { + $filename = "mod_${name}.c"; + } + my $dir = $CFG_LIBEXECDIR; + $dir =~ s|^$CFG_PREFIX/?||; + $dir =~ s|(.)$|$1/|; + $t =~ s|\.la$|.so|; + push(@lmd, sprintf("LoadModule %-18s %s", "${name}_module", "$dir$t")); + push(@amd, sprintf("AddModule %s", $filename)); + } + + # execute the commands + &execute_cmds(@cmds); + + # activate module via LoadModule/AddModule directive + if ($opt_a or $opt_A) { + if (not -f "$CFG_SYSCONFDIR/$CFG_TARGET.conf") { + error("Config file $CFG_SYSCONFDIR/$CFG_TARGET.conf not found"); + exit(1); + } + + open(FP, "<$CFG_SYSCONFDIR/$CFG_TARGET.conf") || die; + my $content = join('', ); + close(FP); + + if ($content !~ m|\n#?\s*LoadModule\s+|) { + error("Activation failed for custom $CFG_SYSCONFDIR/$CFG_TARGET.conf file."); + error("At least one `LoadModule' directive already has to exist."); + exit(1); + } + + my $lmd; + my $c = ''; + $c = '#' if ($opt_A); + foreach $lmd (@lmd) { + my $what = $opt_A ? "preparing" : "activating"; + my $lmd_re = $lmd; + $lmd_re =~ s/\s+/\\s+/g; + + if ($content !~ m|\n#?\s*$lmd_re|) { + # check for open , so that the new LoadModule + # directive always appears *outside* of an . + + my $before = ($content =~ m|^(.*\n)#?\s*LoadModule\s+[^\n]+\n|s)[0]; + + # the '()=' trick forces list context and the scalar + # assignment counts the number of list members (aka number + # of matches) then + my $cntopen = () = ($before =~ m|^\s*<[^/].*$|mg); + my $cntclose = () = ($before =~ m|^\s*$CFG_SYSCONFDIR/$CFG_TARGET.conf.new")) { + print FP $content; + close(FP); + system("cp $CFG_SYSCONFDIR/$CFG_TARGET.conf $CFG_SYSCONFDIR/$CFG_TARGET.conf.bak && " . + "cp $CFG_SYSCONFDIR/$CFG_TARGET.conf.new $CFG_SYSCONFDIR/$CFG_TARGET.conf && " . + "rm $CFG_SYSCONFDIR/$CFG_TARGET.conf.new"); + } else { + notice("unable to open configuration file"); + } + } + } +} + +sub error{ + print STDERR "apxs:Error: $_[0].\n"; +} + +sub notice{ + print STDERR "$_[0]\n"; +} + +##EOF## +__DATA__ +## +## Makefile -- Build procedure for sample %NAME% Apache module +## Autogenerated via ``apxs -n %NAME% -g''. +## + +builddir=. +top_srcdir=%PREFIX% +top_builddir=%PREFIX% +include %INSTALLBUILDDIR%/special.mk + +# the used tools +APXS=apxs +APACHECTL=apachectl + +# additional defines, includes and libraries +#DEFS=-Dmy_define=my_value +#INCLUDES=-Imy/include/dir +#LIBS=-Lmy/lib/dir -lmylib + +# the default target +all: local-shared-build + +# install the shared object file into Apache +install: install-modules + +# cleanup +clean: + -rm -f mod_%NAME%.o mod_%NAME%.lo mod_%NAME%.slo mod_%NAME%.la + +# simple test +test: reload + lynx -mime_header http://localhost/%NAME% + +# install and activate shared object by reloading Apache to +# force a reload of the shared object file +reload: install restart + +# the general Apache start/restart/stop +# procedures +start: + $(APACHECTL) start +restart: + $(APACHECTL) restart +stop: + $(APACHECTL) stop + +-=#=- +mod_%NAME%.la: mod_%NAME%.slo + $(SH_LINK) -rpath $(libexecdir) -module -avoid-version mod_%NAME%.lo +DISTCLEAN_TARGETS = modules.mk +shared = mod_%NAME%.la +-=#=- +/* +** mod_%NAME%.c -- Apache sample %NAME% module +** [Autogenerated via ``apxs -n %NAME% -g''] +** +** To play with this sample module first compile it into a +** DSO file and install it into Apache's modules directory +** by running: +** +** $ apxs -c -i mod_%NAME%.c +** +** Then activate it in Apache's %TARGET%.conf file for instance +** for the URL /%NAME% in as follows: +** +** # %TARGET%.conf +** LoadModule %NAME%_module modules/mod_%NAME%.so +** +** SetHandler %NAME% +** +** +** Then after restarting Apache via +** +** $ apachectl restart +** +** you immediately can request the URL /%NAME% and watch for the +** output of this module. This can be achieved for instance via: +** +** $ lynx -mime_header http://localhost/%NAME% +** +** The output should be similar to the following one: +** +** HTTP/1.1 200 OK +** Date: Tue, 31 Mar 1998 14:42:22 GMT +** Server: Apache/1.3.4 (Unix) +** Connection: close +** Content-Type: text/html +** +** The sample page from mod_%NAME%.c +*/ + +#include "httpd.h" +#include "http_config.h" +#include "http_protocol.h" +#include "ap_config.h" + +/* The sample content handler */ +static int %NAME%_handler(request_rec *r) +{ + if (strcmp(r->handler, "%NAME%")) { + return DECLINED; + } + r->content_type = "text/html"; + + if (!r->header_only) + ap_rputs("The sample page from mod_%NAME%.c\n", r); + return OK; +} + +static void %NAME%_register_hooks(apr_pool_t *p) +{ + ap_hook_handler(%NAME%_handler, NULL, NULL, APR_HOOK_MIDDLE); +} + +/* Dispatch list for API hooks */ +module AP_MODULE_DECLARE_DATA %NAME%_module = { + STANDARD20_MODULE_STUFF, + NULL, /* create per-dir config structures */ + NULL, /* merge per-dir config structures */ + NULL, /* create per-server config structures */ + NULL, /* merge per-server config structures */ + NULL, /* table of config file commands */ + %NAME%_register_hooks /* register hooks */ +}; + diff --git a/rubbos/app/httpd-2.0.64/support/check_forensic b/rubbos/app/httpd-2.0.64/support/check_forensic new file mode 100755 index 00000000..3c8123fc --- /dev/null +++ b/rubbos/app/httpd-2.0.64/support/check_forensic @@ -0,0 +1,51 @@ +#!/bin/sh + +# check_forensic + +# check the forensic log for requests that did not complete +# output the request log for each one + +F=$1 + +temp_create_method=file +if test -f `which mktemp`; then + temp_create_method=mktemp +elif test -f `which tempfile`; then + temp_create_method=tempfile +fi + +create_temp() +{ + prefix=$1 + case "$temp_create_method" in + file) + name="/tmp/$1.$$" + ;; + mktemp) + name=`mktemp -t $1.XXXXXX` + ;; + tempfile) + name=`tempfile --prefix=$1` + ;; + *) + echo "$0: Cannot create temporary file" + exit 1 + ;; + esac +} + +create_temp fcall +all=$name +create_temp fcin +in=$name +create_temp fcout +out=$name +trap "rm -f -- \"$all\" \"$in\" \"$out\";" 0 1 2 3 13 15 + +cut -f 1 -d '|' $F > $all +grep + < $all | cut -c2- | sort > $in +grep -- - < $all | cut -c2- | sort > $out + +# use -i instead of -I for GNU xargs +join -v 1 $in $out | xargs -I xx egrep "^\\+xx" $F +exit 0 diff --git a/rubbos/app/httpd-2.0.64/support/checkgid b/rubbos/app/httpd-2.0.64/support/checkgid new file mode 100755 index 00000000..ff663d36 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/support/checkgid @@ -0,0 +1,131 @@ +#! /bin/bash + +# checkgid - temporary wrapper script for .libs/checkgid +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# The checkgid program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='/bin/sed -e 1s/^X//' +sed_quote_subst='s/\([\\`\\"$\\\\]\)/\\\1/g' + +# Be Bourne compatible (taken from Autoconf:_AS_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="(cd /bottlenecks/rubbos/app/httpd-2.0.64/support; { test -z \"\${LIBRARY_PATH+set}\" || unset LIBRARY_PATH || { LIBRARY_PATH=; export LIBRARY_PATH; }; }; { test -z \"\${COMPILER_PATH+set}\" || unset COMPILER_PATH || { COMPILER_PATH=; export COMPILER_PATH; }; }; { test -z \"\${GCC_EXEC_PREFIX+set}\" || unset GCC_EXEC_PREFIX || { GCC_EXEC_PREFIX=; export GCC_EXEC_PREFIX; }; }; { test -z \"\${LD_RUN_PATH+set}\" || unset LD_RUN_PATH || { LD_RUN_PATH=; export LD_RUN_PATH; }; }; { test -z \"\${LD_LIBRARY_PATH+set}\" || unset LD_LIBRARY_PATH || { LD_LIBRARY_PATH=; export LD_LIBRARY_PATH; }; }; PATH=\"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games\"; export PATH; gcc -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE -DAP_HAVE_DESIGNATED_INITIALIZER -I/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include -I/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include -I/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib -I. -I/bottlenecks/rubbos/app/httpd-2.0.64/os/unix -I/bottlenecks/rubbos/app/httpd-2.0.64/server/mpm/worker -I/bottlenecks/rubbos/app/httpd-2.0.64/modules/http -I/bottlenecks/rubbos/app/httpd-2.0.64/modules/filters -I/bottlenecks/rubbos/app/httpd-2.0.64/modules/proxy -I/bottlenecks/rubbos/app/httpd-2.0.64/include -I/bottlenecks/rubbos/app/httpd-2.0.64/modules/generators -I/bottlenecks/rubbos/app/httpd-2.0.64/modules/dav/main -o \$progdir/\$file .libs/checkgid.o -Wl,--export-dynamic -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib /bottlenecks/rubbos/app/httpd-2.0.64/srclib/pcre/.libs/libpcre.a /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/.libs/libaprutil-0.so /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/.libs/libexpat.so /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/.libs/libapr-0.so -lrt -lm -lcrypt -lnsl -lpthread -ldl -Wl,--rpath -Wl,/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/.libs -Wl,--rpath -Wl,/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/.libs -Wl,--rpath -Wl,/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/.libs -Wl,--rpath -Wl,/bottlenecks/rubbos/app/apache2/lib ) " + +# This environment variable determines our operation mode. +if test "$libtool_install_magic" = "%%%MAGIC variable%%%"; then + # install mode needs the following variable: + notinst_deplibs=' /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/libaprutil-0.la /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/libexpat.la /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/libapr-0.la' +else + # When we are sourced in execute mode, $file and $echo are already set. + if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then + echo="echo" + file="$0" + # Make sure echo works. + if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift + elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then + # Yippee, $echo works! + : + else + # Restart under the correct shell, and then maybe $echo will work. + exec /bin/bash "$0" --no-reexec ${1+"$@"} + fi + fi + + # Find the directory that this script lives in. + thisdir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "x$thisdir" = "x$file" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=`ls -ld "$file" | /bin/sed -n 's/.*-> //p'` + while test -n "$file"; do + destdir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + + # If there was a directory component, then change thisdir. + if test "x$destdir" != "x$file"; then + case "$destdir" in + [\\/]* | [A-Za-z]:[\\/]*) thisdir="$destdir" ;; + *) thisdir="$thisdir/$destdir" ;; + esac + fi + + file=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + file=`ls -ld "$thisdir/$file" | /bin/sed -n 's/.*-> //p'` + done + + # Try to get the absolute directory name. + absdir=`cd "$thisdir" && pwd` + test -n "$absdir" && thisdir="$absdir" + + program=lt-'checkgid' + progdir="$thisdir/.libs" + + if test ! -f "$progdir/$program" || \ + { file=`ls -1dt "$progdir/$program" "$progdir/../$program" 2>/dev/null | /bin/sed 1q`; \ + test "X$file" != "X$progdir/$program"; }; then + + file="$$-$program" + + if test ! -d "$progdir"; then + mkdir "$progdir" + else + rm -f "$progdir/$file" + fi + + # 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 -f "$progdir/$file" + exit 1 + fi + fi + + mv -f "$progdir/$file" "$progdir/$program" 2>/dev/null || + { rm -f "$progdir/$program"; + mv -f "$progdir/$file" "$progdir/$program"; } + rm -f "$progdir/$file" + fi + + if test -f "$progdir/$program"; then + if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then + # Run the actual program with our arguments. + + exec "$progdir/$program" ${1+"$@"} + + $echo "$0: cannot exec $program $*" + exit 1 + fi + else + # The program doesn't exist. + $echo "$0: error: \`$progdir/$program' does not exist" 1>&2 + $echo "This script is just a wrapper for $program." 1>&2 + echo "See the libtool documentation for more information." 1>&2 + exit 1 + fi +fi diff --git a/rubbos/app/httpd-2.0.64/support/checkgid.c b/rubbos/app/httpd-2.0.64/support/checkgid.c new file mode 100644 index 00000000..2a918b29 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/support/checkgid.c @@ -0,0 +1,110 @@ +/* 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. + */ + +/* + * Given one or more group identifers on the command line (e.g., + * "httpd" or "#-1"), figure out whether they'll be valid for + * the server to use at run-time. + * + * If a groupname isn't found, or we can't setgid() to it, return + * -1. If all groups are valid, return 0. + * + * This may need to be run as the superuser for the setgid() to + * succeed; running it as any other user may result in a false + * negative. + */ + +#include "ap_config.h" +#if APR_HAVE_STDIO_H +#include +#endif +#if APR_HAVE_STDLIB_H +#include +#endif +#if APR_HAVE_SYS_TYPES_H +#include +#endif +#if HAVE_GRP_H +#include +#endif +#if APR_HAVE_UNISTD_H +#include +#endif + +int main(int argc, char *argv[]) +{ + int i; + int result; + gid_t gid; + struct group *grent; + struct group fake_grent; + + /* + * Assume success. :-) + */ + result = 0; + for (i = 1; i < argc; ++i) { + char *arg; + arg = argv[i]; + + /* + * If it's from a 'Group #-1' statement, get the numeric value + * and skip the group lookup stuff. + */ + if (*arg == '#') { + gid = atoi(&arg[1]); + fake_grent.gr_gid = gid; + grent = &fake_grent; + } + else { + grent = getgrnam(arg); + } + + /* + * A NULL return means no such group was found, so we're done + * with this one. + */ + if (grent == NULL) { + fprintf(stderr, "%s: group '%s' not found\n", argv[0], arg); + result = -1; + } + else { + int check; + + /* + * See if we can switch to the numeric GID we have. If so, + * all well and good; if not, well.. + */ + gid = grent->gr_gid; + check = setgid(gid); + if (check != 0) { + fprintf(stderr, "%s: invalid group '%s'\n", argv[0], arg); + perror(argv[0]); + result = -1; + } + } + } + /* + * Worst-case return value. + */ + return result; +} +/* + * Local Variables: + * mode: C + * c-file-style: "bsd" + * End: + */ diff --git a/rubbos/app/httpd-2.0.64/support/checkgid.lo b/rubbos/app/httpd-2.0.64/support/checkgid.lo new file mode 100644 index 00000000..547929ac --- /dev/null +++ b/rubbos/app/httpd-2.0.64/support/checkgid.lo @@ -0,0 +1,12 @@ +# checkgid.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/checkgid.o' + +# Name of the non-PIC object. +non_pic_object='checkgid.o' + diff --git a/rubbos/app/httpd-2.0.64/support/checkgid.o b/rubbos/app/httpd-2.0.64/support/checkgid.o new file mode 100644 index 0000000000000000000000000000000000000000..9116a3a98683ab7fa9925bcc25f176e5b260d022 GIT binary patch literal 12312 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

      >0wxXXO!$v|8)cV5sXddp+>=DNd|x3vL`W`yX0~ zE=oN~j42D71<1Slb%>}$87vnYD5%@P<<3MwZ?z4-BdU07IWA> zu6^15=YgRo&l6-#`ZjhJ($&+Pf9}U|(A28Ga4yzX>U?{s{Bk`$eiKSKUlBoO9o6?U z%uDUhiHT*d`l$X6tmI2PenvlnOs)Cj3Bh^8gvWXC$Mu=xZl#zaAW9vf_D`B<@<;X` zW7&69H!revx~UNNA+RmkK3=A^+TTR?uU>0Y`IYTg3Pc8VLG|a;0-MmOIty0i)Eo)+ zuT~F{*PMCa;-*QRa1`CtM5kagK@jeb*)*>zb1EC6Q;QtCQ#}g3p6?I{I#`8o=vVCR{GH__AsE%4s;>Hfs4?HVyZG=9urN%J&a{ zhuDuD`c|6yDM6n)V6D3F2NEuKoYjBgzv3XRM+gZy>Qeru`&}A+_0q@!_@*UEt&B?~u=h zf;Ulr)(F0d^gV*FBz>RYXOaFI!6Ov&jwg@nQ^W^_{&KqIj0*l9YIj_4^KUa?yiV9Z zPP+F9{g0`i9}xU$;vW_Ke2PCU_<5v%SnxY2eq8W+8rSy({|Cjt5WJ1_&kJ6p_-}%b zQGfV6^E^C3^VUS=%=b~eSn##vyF&0=$fry20n+yf{y4=O1wTbTZxZ}|;~m@OmKXE z#Ppotd>#Hx@ZV4zq;`0`e;__b@E3?L5&R#-UnjVxc(veFNk}B|J6>9+Aa9ch<`=!Zu0r2;QYM#zTjt2Kl!}ze1=H(N1?xx^!!T1`sb)W zbEus85{miA{8yxp34J5Q7Ylwi^<#tJo5*J~aU4EBgRp2+=;zS<+~ni_x361#9G@3| zLK8@D^KsN~FjT3#1%HJ2AsgPi~jy_+cc{uLl=<^xUKkDPC z{}%Z_?c?~|vMq4~DyWtPhEaJEx z(7%8X(qbP+pA7l537?M{wNjV(xc~iUgO6jo{iNS2_|3%Af*&P5E_jmo-Ndo~*w4GE zpNE7#Px>zj&dz92VCEcAu&-|d^ zJl=bz;r9#9YI^TW>vEXMm=FSUD{(DxDN_dwS3 zed+x|zl-$zJYhZGH;xHCxBIBzJU>qe{v7%9bB6u-e4P^d&7^->@U6rhx^J-$pRcgs z+@JY^^ZfJkihcUY|6-xPns~3^d>w8O{1EB+ImZ6{9Lx(n_y1-euLF-or?pZl{(=*tvu5uE!| z5S-_KT=07--Xr*Z6yGU0zegPwoX2}a@MkIJe(|{YzW1=u^L_70!6{VF2+sF6{!V9q O)<-CV%ZS$uqJIOiIAIn5 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/support/config.m4 b/rubbos/app/httpd-2.0.64/support/config.m4 new file mode 100644 index 00000000..8169a1ec --- /dev/null +++ b/rubbos/app/httpd-2.0.64/support/config.m4 @@ -0,0 +1,104 @@ +htpasswd_LTFLAGS="" +htdigest_LTFLAGS="" +rotatelogs_LTFLAGS="" +logresolve_LTFLAGS="" +htdbm_LTFLAGS="" +ab_LTFLAGS="" +checkgid_LTFLAGS="" + +AC_ARG_ENABLE(static-support,APACHE_HELP_STRING(--enable-static-support,Build a statically linked version the support binaries),[ +if test "$enableval" = "yes" ; then + APR_ADDTO(htpasswd_LTFLAGS, [-static]) + APR_ADDTO(htdigest_LTFLAGS, [-static]) + APR_ADDTO(rotatelogs_LTFLAGS, [-static]) + APR_ADDTO(logresolve_LTFLAGS, [-static]) + APR_ADDTO(htdbm_LTFLAGS, [-static]) + APR_ADDTO(ab_LTFLAGS, [-static]) + APR_ADDTO(checkgid_LTFLAGS, [-static]) +fi +]) + +AC_ARG_ENABLE(static-htpasswd,APACHE_HELP_STRING(--enable-static-htpasswd,Build a statically linked version of htpasswd),[ +if test "$enableval" = "yes" ; then + APR_ADDTO(htpasswd_LTFLAGS, [-static]) +else + APR_REMOVEFROM(htpasswd_LTFLAGS, [-static]) +fi +]) +APACHE_SUBST(htpasswd_LTFLAGS) + +AC_ARG_ENABLE(static-htdigest,APACHE_HELP_STRING(--enable-static-htdigest,Build a statically linked version of htdigest),[ +if test "$enableval" = "yes" ; then + APR_ADDTO(htdigest_LTFLAGS, [-static]) +else + APR_REMOVEFROM(htdigest_LTFLAGS, [-static]) +fi +]) +APACHE_SUBST(htdigest_LTFLAGS) + +AC_ARG_ENABLE(static-rotatelogs,APACHE_HELP_STRING(--enable-static-rotatelogs,Build a statically linked version of rotatelogs),[ +if test "$enableval" = "yes" ; then + APR_ADDTO(rotatelogs_LTFLAGS, [-static]) +else + APR_REMOVEFROM(rotatelogs_LTFLAGS, [-static]) +fi +]) +APACHE_SUBST(rotatelogs_LTFLAGS) + +AC_ARG_ENABLE(static-logresolve,APACHE_HELP_STRING(--enable-static-logresolve,Build a statically linked version of logresolve),[ +if test "$enableval" = "yes" ; then + APR_ADDTO(logresolve_LTFLAGS, [-static]) +else + APR_REMOVEFROM(logresolve_LTFLAGS, [-static]) +fi +]) +APACHE_SUBST(logresolve_LTFLAGS) + +AC_ARG_ENABLE(static-htdbm,APACHE_HELP_STRING(--enable-static-htdbm,Build a statically linked version of htdbm),[ +if test "$enableval" = "yes" ; then + APR_ADDTO(htdbm_LTFLAGS, [-static]) +else + APR_REMOVEFROM(htdbm_LTFLAGS, [-static]) +fi +]) +APACHE_SUBST(htdbm_LTFLAGS) + +AC_ARG_ENABLE(static-ab,APACHE_HELP_STRING(--enable-static-ab,Build a statically linked version of ab),[ +if test "$enableval" = "yes" ; then + APR_ADDTO(ab_LTFLAGS, [-static]) +else + APR_REMOVEFROM(ab_LTFLAGS, [-static]) +fi +]) +APACHE_SUBST(ab_LTFLAGS) + +AC_ARG_ENABLE(static-checkgid,APACHE_HELP_STRING(--enable-static-checkgid,Build a statically linked version of checkgid),[ +if test "$enableval" = "yes" ; then + APR_ADDTO(checkgid_LTFLAGS, [-static]) +else + APR_REMOVEFROM(checkgid_LTFLAGS, [-static]) +fi +]) +APACHE_SUBST(checkgid_LTFLAGS) + +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 ; then + APACHECTL_ULIMIT="ulimit -S -n \`ulimit -H -n\`" + else + APACHECTL_ULIMIT="" + fi + ;; +esac +APACHE_SUBST(APACHECTL_ULIMIT) diff --git a/rubbos/app/httpd-2.0.64/support/dbmmanage b/rubbos/app/httpd-2.0.64/support/dbmmanage new file mode 100644 index 00000000..436e824f --- /dev/null +++ b/rubbos/app/httpd-2.0.64/support/dbmmanage @@ -0,0 +1,312 @@ +#!/usr/bin/perl +# +# 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. + +#for more functionality see the HTTPD::UserAdmin module: +# http://www.perl.com/CPAN/modules/by-module/HTTPD/HTTPD-Tools-x.xx.tar.gz +# +# usage: dbmmanage + +package dbmmanage; +# -ldb -lndbm -lgdbm -lsdbm +BEGIN { @AnyDBM_File::ISA = qw(DB_File NDBM_File GDBM_File SDBM_File) } +use strict; +use Fcntl; +use AnyDBM_File (); + +sub usage { + my $cmds = join "|", sort keys %dbmc::; + die <$command(); +untie %DB; + + +my $x; +sub genseed { + my $psf; + if ($not_unix) { + srand (time ^ $$ or time ^ ($$ + ($$ << 15))); + } + else { + for (qw(-xlwwa -le)) { + `ps $_ 2>/dev/null`; + $psf = $_, last unless $?; + } + srand (time ^ $$ ^ unpack("%L*", `ps $psf | gzip -f`)); + } + @range = (qw(. /), '0'..'9','a'..'z','A'..'Z'); + $x = int scalar @range; +} + +sub randchar { + join '', map $range[rand $x], 1..shift||1; +} + +sub saltpw_crypt { + genseed() unless @range; + return $newstyle_salt ? + join '', "_", randchar, "a..", randchar(4) : + randchar(2); +} + +sub cryptpw_crypt { + my ($pw, $salt) = @_; + $salt = saltpw_crypt unless $salt; + crypt $pw, $salt; +} + +sub saltpw_md5 { + genseed() unless @range; + randchar(8); +} + +sub cryptpw_md5 { + my($pw, $salt) = @_; + $salt = saltpw_md5 unless $salt; + Crypt::PasswdMD5::apache_md5_crypt($pw, $salt); +} + +sub cryptpw_sha1 { + my($pw, $salt) = @_; + '{SHA}' . Digest::SHA1::sha1_base64($pw) . "="; +} + +sub cryptpw { + if ($crypt_method eq "md5") { + return cryptpw_md5(@_); + } elsif ($crypt_method eq "sha1") { + return cryptpw_sha1(@_); + } elsif ($crypt_method eq "crypt") { + return cryptpw_crypt(@_); + } + @_[0]; # otherwise return plaintext +} + +sub getpass { + my $prompt = shift || "Enter password:"; + + unless($not_unix) { + open STDIN, "/dev/tty" or warn "couldn't open /dev/tty $!\n"; + system "stty -echo;"; + } + + my($c,$pwd); + print STDERR $prompt; + while (($c = getc(STDIN)) ne '' and $c ne "\n" and $c ne "\r") { + $pwd .= $c; + } + + system "stty echo" unless $not_unix; + print STDERR "\n"; + die "Can't use empty password!\n" unless length $pwd; + return $pwd; +} + +sub dbmc::update { + die "Sorry, user `$key' doesn't exist!\n" unless $DB{$key}; + $crypted_pwd = (split /:/, $DB{$key}, 3)[0] if $crypted_pwd eq '.'; + $groups = (split /:/, $DB{$key}, 3)[1] if !$groups || $groups eq '.'; + $comment = (split /:/, $DB{$key}, 3)[2] if !$comment || $comment eq '.'; + if (!$crypted_pwd || $crypted_pwd eq '-') { + dbmc->adduser; + } + else { + dbmc->add; + } +} + +sub dbmc::add { + die "Can't use empty password!\n" unless $crypted_pwd; + unless($is_update) { + die "Sorry, user `$key' already exists!\n" if $DB{$key}; + } + $groups = '' if $groups eq '-'; + $comment = '' if $comment eq '-'; + $groups .= ":" . $comment if $comment; + $crypted_pwd .= ":" . $groups if $groups; + $DB{$key} = $crypted_pwd; + my $action = $is_update ? "updated" : "added"; + print "User $key $action with password encrypted to $DB{$key} using $crypt_method\n"; +} + +sub dbmc::adduser { + my $value = getpass "New password:"; + die "They don't match, sorry.\n" unless getpass("Re-type new password:") eq $value; + $crypted_pwd = cryptpw $value; + dbmc->add; +} + +sub dbmc::delete { + die "Sorry, user `$key' doesn't exist!\n" unless $DB{$key}; + delete $DB{$key}, print "`$key' deleted\n"; +} + +sub dbmc::view { + print $key ? "$key:$DB{$key}\n" : map { "$_:$DB{$_}\n" if $DB{$_} } keys %DB; +} + +sub dbmc::check { + die "Sorry, user `$key' doesn't exist!\n" unless $DB{$key}; + my $chkpass = (split /:/, $DB{$key}, 3)[0]; + my $testpass = getpass(); + if (substr($chkpass, 0, 6) eq '$apr1$') { + need_md5_crypt; + $crypt_method = "md5"; + } elsif (substr($chkpass, 0, 5) eq '{SHA}') { + need_sha1_crypt; + $crypt_method = "sha1"; + } elsif (length($chkpass) == 13 && $chkpass ne $testpass) { + $crypt_method = "crypt"; + } else { + $crypt_method = "plain"; + } + print $crypt_method . (cryptpw($testpass, $chkpass) eq $chkpass + ? " password ok\n" : " password mismatch\n"); +} + +sub dbmc::import { + while(defined($_ = ) and chomp) { + ($key,$crypted_pwd,$groups,$comment) = split /:/, $_, 4; + dbmc->add; + } +} + diff --git a/rubbos/app/httpd-2.0.64/support/dbmmanage.in b/rubbos/app/httpd-2.0.64/support/dbmmanage.in new file mode 100644 index 00000000..df78f503 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/support/dbmmanage.in @@ -0,0 +1,312 @@ +#!@perlbin@ +# +# 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. + +#for more functionality see the HTTPD::UserAdmin module: +# http://www.perl.com/CPAN/modules/by-module/HTTPD/HTTPD-Tools-x.xx.tar.gz +# +# usage: dbmmanage + +package dbmmanage; +# -ldb -lndbm -lgdbm -lsdbm +BEGIN { @AnyDBM_File::ISA = qw(DB_File NDBM_File GDBM_File SDBM_File) } +use strict; +use Fcntl; +use AnyDBM_File (); + +sub usage { + my $cmds = join "|", sort keys %dbmc::; + die <$command(); +untie %DB; + + +my $x; +sub genseed { + my $psf; + if ($not_unix) { + srand (time ^ $$ or time ^ ($$ + ($$ << 15))); + } + else { + for (qw(-xlwwa -le)) { + `ps $_ 2>/dev/null`; + $psf = $_, last unless $?; + } + srand (time ^ $$ ^ unpack("%L*", `ps $psf | gzip -f`)); + } + @range = (qw(. /), '0'..'9','a'..'z','A'..'Z'); + $x = int scalar @range; +} + +sub randchar { + join '', map $range[rand $x], 1..shift||1; +} + +sub saltpw_crypt { + genseed() unless @range; + return $newstyle_salt ? + join '', "_", randchar, "a..", randchar(4) : + randchar(2); +} + +sub cryptpw_crypt { + my ($pw, $salt) = @_; + $salt = saltpw_crypt unless $salt; + crypt $pw, $salt; +} + +sub saltpw_md5 { + genseed() unless @range; + randchar(8); +} + +sub cryptpw_md5 { + my($pw, $salt) = @_; + $salt = saltpw_md5 unless $salt; + Crypt::PasswdMD5::apache_md5_crypt($pw, $salt); +} + +sub cryptpw_sha1 { + my($pw, $salt) = @_; + '{SHA}' . Digest::SHA1::sha1_base64($pw) . "="; +} + +sub cryptpw { + if ($crypt_method eq "md5") { + return cryptpw_md5(@_); + } elsif ($crypt_method eq "sha1") { + return cryptpw_sha1(@_); + } elsif ($crypt_method eq "crypt") { + return cryptpw_crypt(@_); + } + @_[0]; # otherwise return plaintext +} + +sub getpass { + my $prompt = shift || "Enter password:"; + + unless($not_unix) { + open STDIN, "/dev/tty" or warn "couldn't open /dev/tty $!\n"; + system "stty -echo;"; + } + + my($c,$pwd); + print STDERR $prompt; + while (($c = getc(STDIN)) ne '' and $c ne "\n" and $c ne "\r") { + $pwd .= $c; + } + + system "stty echo" unless $not_unix; + print STDERR "\n"; + die "Can't use empty password!\n" unless length $pwd; + return $pwd; +} + +sub dbmc::update { + die "Sorry, user `$key' doesn't exist!\n" unless $DB{$key}; + $crypted_pwd = (split /:/, $DB{$key}, 3)[0] if $crypted_pwd eq '.'; + $groups = (split /:/, $DB{$key}, 3)[1] if !$groups || $groups eq '.'; + $comment = (split /:/, $DB{$key}, 3)[2] if !$comment || $comment eq '.'; + if (!$crypted_pwd || $crypted_pwd eq '-') { + dbmc->adduser; + } + else { + dbmc->add; + } +} + +sub dbmc::add { + die "Can't use empty password!\n" unless $crypted_pwd; + unless($is_update) { + die "Sorry, user `$key' already exists!\n" if $DB{$key}; + } + $groups = '' if $groups eq '-'; + $comment = '' if $comment eq '-'; + $groups .= ":" . $comment if $comment; + $crypted_pwd .= ":" . $groups if $groups; + $DB{$key} = $crypted_pwd; + my $action = $is_update ? "updated" : "added"; + print "User $key $action with password encrypted to $DB{$key} using $crypt_method\n"; +} + +sub dbmc::adduser { + my $value = getpass "New password:"; + die "They don't match, sorry.\n" unless getpass("Re-type new password:") eq $value; + $crypted_pwd = cryptpw $value; + dbmc->add; +} + +sub dbmc::delete { + die "Sorry, user `$key' doesn't exist!\n" unless $DB{$key}; + delete $DB{$key}, print "`$key' deleted\n"; +} + +sub dbmc::view { + print $key ? "$key:$DB{$key}\n" : map { "$_:$DB{$_}\n" if $DB{$_} } keys %DB; +} + +sub dbmc::check { + die "Sorry, user `$key' doesn't exist!\n" unless $DB{$key}; + my $chkpass = (split /:/, $DB{$key}, 3)[0]; + my $testpass = getpass(); + if (substr($chkpass, 0, 6) eq '$apr1$') { + need_md5_crypt; + $crypt_method = "md5"; + } elsif (substr($chkpass, 0, 5) eq '{SHA}') { + need_sha1_crypt; + $crypt_method = "sha1"; + } elsif (length($chkpass) == 13 && $chkpass ne $testpass) { + $crypt_method = "crypt"; + } else { + $crypt_method = "plain"; + } + print $crypt_method . (cryptpw($testpass, $chkpass) eq $chkpass + ? " password ok\n" : " password mismatch\n"); +} + +sub dbmc::import { + while(defined($_ = ) and chomp) { + ($key,$crypted_pwd,$groups,$comment) = split /:/, $_, 4; + dbmc->add; + } +} + diff --git a/rubbos/app/httpd-2.0.64/support/envvars-std b/rubbos/app/httpd-2.0.64/support/envvars-std new file mode 100644 index 00000000..771c6c59 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/support/envvars-std @@ -0,0 +1,24 @@ +# 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. +# +# +# envvars-std - default environment variables for apachectl +# +# This file is generated from envvars-std.in +# +LD_LIBRARY_PATH="/bottlenecks/rubbos/app/apache2/lib:$LD_LIBRARY_PATH" +export LD_LIBRARY_PATH +# + diff --git a/rubbos/app/httpd-2.0.64/support/envvars-std.in b/rubbos/app/httpd-2.0.64/support/envvars-std.in new file mode 100644 index 00000000..cf50c5c7 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/support/envvars-std.in @@ -0,0 +1,24 @@ +# 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. +# +# +# envvars-std - default environment variables for apachectl +# +# This file is generated from envvars-std.in +# +@SHLIBPATH_VAR@="@exp_libdir@:$@SHLIBPATH_VAR@" +export @SHLIBPATH_VAR@ +# +@OS_SPECIFIC_VARS@ diff --git a/rubbos/app/httpd-2.0.64/support/htdbm b/rubbos/app/httpd-2.0.64/support/htdbm new file mode 100755 index 00000000..63c9fce2 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/support/htdbm @@ -0,0 +1,131 @@ +#! /bin/bash + +# htdbm - temporary wrapper script for .libs/htdbm +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# The htdbm program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='/bin/sed -e 1s/^X//' +sed_quote_subst='s/\([\\`\\"$\\\\]\)/\\\1/g' + +# Be Bourne compatible (taken from Autoconf:_AS_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="(cd /bottlenecks/rubbos/app/httpd-2.0.64/support; { test -z \"\${LIBRARY_PATH+set}\" || unset LIBRARY_PATH || { LIBRARY_PATH=; export LIBRARY_PATH; }; }; { test -z \"\${COMPILER_PATH+set}\" || unset COMPILER_PATH || { COMPILER_PATH=; export COMPILER_PATH; }; }; { test -z \"\${GCC_EXEC_PREFIX+set}\" || unset GCC_EXEC_PREFIX || { GCC_EXEC_PREFIX=; export GCC_EXEC_PREFIX; }; }; { test -z \"\${LD_RUN_PATH+set}\" || unset LD_RUN_PATH || { LD_RUN_PATH=; export LD_RUN_PATH; }; }; { test -z \"\${LD_LIBRARY_PATH+set}\" || unset LD_LIBRARY_PATH || { LD_LIBRARY_PATH=; export LD_LIBRARY_PATH; }; }; PATH=\"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games\"; export PATH; gcc -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE -DAP_HAVE_DESIGNATED_INITIALIZER -I/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include -I/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include -I/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib -I. -I/bottlenecks/rubbos/app/httpd-2.0.64/os/unix -I/bottlenecks/rubbos/app/httpd-2.0.64/server/mpm/worker -I/bottlenecks/rubbos/app/httpd-2.0.64/modules/http -I/bottlenecks/rubbos/app/httpd-2.0.64/modules/filters -I/bottlenecks/rubbos/app/httpd-2.0.64/modules/proxy -I/bottlenecks/rubbos/app/httpd-2.0.64/include -I/bottlenecks/rubbos/app/httpd-2.0.64/modules/generators -I/bottlenecks/rubbos/app/httpd-2.0.64/modules/dav/main -o \$progdir/\$file .libs/htdbm.o -Wl,--export-dynamic -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib /bottlenecks/rubbos/app/httpd-2.0.64/srclib/pcre/.libs/libpcre.a /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/.libs/libaprutil-0.so /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/.libs/libexpat.so /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/.libs/libapr-0.so -lrt -lm -lcrypt -lnsl -lpthread -ldl -Wl,--rpath -Wl,/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/.libs -Wl,--rpath -Wl,/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/.libs -Wl,--rpath -Wl,/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/.libs -Wl,--rpath -Wl,/bottlenecks/rubbos/app/apache2/lib ) " + +# This environment variable determines our operation mode. +if test "$libtool_install_magic" = "%%%MAGIC variable%%%"; then + # install mode needs the following variable: + notinst_deplibs=' /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/libaprutil-0.la /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/libexpat.la /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/libapr-0.la' +else + # When we are sourced in execute mode, $file and $echo are already set. + if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then + echo="echo" + file="$0" + # Make sure echo works. + if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift + elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then + # Yippee, $echo works! + : + else + # Restart under the correct shell, and then maybe $echo will work. + exec /bin/bash "$0" --no-reexec ${1+"$@"} + fi + fi + + # Find the directory that this script lives in. + thisdir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "x$thisdir" = "x$file" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=`ls -ld "$file" | /bin/sed -n 's/.*-> //p'` + while test -n "$file"; do + destdir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + + # If there was a directory component, then change thisdir. + if test "x$destdir" != "x$file"; then + case "$destdir" in + [\\/]* | [A-Za-z]:[\\/]*) thisdir="$destdir" ;; + *) thisdir="$thisdir/$destdir" ;; + esac + fi + + file=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + file=`ls -ld "$thisdir/$file" | /bin/sed -n 's/.*-> //p'` + done + + # Try to get the absolute directory name. + absdir=`cd "$thisdir" && pwd` + test -n "$absdir" && thisdir="$absdir" + + program=lt-'htdbm' + progdir="$thisdir/.libs" + + if test ! -f "$progdir/$program" || \ + { file=`ls -1dt "$progdir/$program" "$progdir/../$program" 2>/dev/null | /bin/sed 1q`; \ + test "X$file" != "X$progdir/$program"; }; then + + file="$$-$program" + + if test ! -d "$progdir"; then + mkdir "$progdir" + else + rm -f "$progdir/$file" + fi + + # 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 -f "$progdir/$file" + exit 1 + fi + fi + + mv -f "$progdir/$file" "$progdir/$program" 2>/dev/null || + { rm -f "$progdir/$program"; + mv -f "$progdir/$file" "$progdir/$program"; } + rm -f "$progdir/$file" + fi + + if test -f "$progdir/$program"; then + if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then + # Run the actual program with our arguments. + + exec "$progdir/$program" ${1+"$@"} + + $echo "$0: cannot exec $program $*" + exit 1 + fi + else + # The program doesn't exist. + $echo "$0: error: \`$progdir/$program' does not exist" 1>&2 + $echo "This script is just a wrapper for $program." 1>&2 + echo "See the libtool documentation for more information." 1>&2 + exit 1 + fi +fi diff --git a/rubbos/app/httpd-2.0.64/support/htdbm.c b/rubbos/app/httpd-2.0.64/support/htdbm.c new file mode 100644 index 00000000..db1d1378 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/support/htdbm.c @@ -0,0 +1,585 @@ +/* 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. + */ + +/* + * htdbm.c: simple program for manipulating DBM + * password databases for the Apache HTTP server + * + * Contributed by Mladen Turk + * 12 Oct 2001 + */ + +#include "apr.h" +#include "apr_lib.h" +#include "apr_strings.h" +#include "apr_file_io.h" +#include "apr_file_info.h" +#include "apr_pools.h" +#include "apr_signal.h" +#include "apr_md5.h" +#include "apr_sha1.h" +#include "apr_dbm.h" + +#if APR_HAVE_STDLIB_H +#include +#endif +#if APR_HAVE_STRING_H +#include +#endif +#if APR_HAVE_STRINGS_H +#include +#endif +#include + +#if APR_CHARSET_EBCDIC +#include "apr_xlate.h" +#endif /*APR_CHARSET_EBCDIC*/ + +#if APR_HAVE_UNISTD_H +#include +#endif +#if APR_HAVE_CRYPT_H +#include +#endif + + +#if !APR_CHARSET_EBCDIC +#define LF 10 +#define CR 13 +#else /*APR_CHARSET_EBCDIC*/ +#define LF '\n' +#define CR '\r' +#endif /*APR_CHARSET_EBCDIC*/ + +#define MAX_STRING_LEN 256 +#define ALG_PLAIN 0 +#define ALG_APMD5 1 +#define ALG_APSHA 2 + +#if APR_HAVE_CRYPT_H +#define ALG_CRYPT 3 +#endif + + +#define ERR_FILEPERM 1 +#define ERR_SYNTAX 2 +#define ERR_PWMISMATCH 3 +#define ERR_INTERRUPTED 4 +#define ERR_OVERFLOW 5 +#define ERR_BADUSER 6 +#define ERR_EMPTY 7 + + +typedef struct htdbm_t htdbm_t; + +struct htdbm_t { + apr_dbm_t *dbm; + apr_pool_t *pool; +#if APR_CHARSET_EBCDIC + apr_xlate_t *to_ascii; +#endif + char *filename; + char *username; + char *userpass; + char *comment; + char *type; + int create; + int rdonly; + int alg; +}; + + +#define HTDBM_MAKE 0 +#define HTDBM_DELETE 1 +#define HTDBM_VERIFY 2 +#define HTDBM_LIST 3 +#define HTDBM_NOFILE 4 +#define HTDBM_STDIN 5 + +static void terminate(void) +{ + apr_terminate(); +#ifdef NETWARE + pressanykey(); +#endif +} + +static void htdbm_terminate(htdbm_t *htdbm) +{ + if (htdbm->dbm) + apr_dbm_close(htdbm->dbm); + htdbm->dbm = NULL; +} + +static htdbm_t *h; + +static void htdbm_interrupted(void) +{ + htdbm_terminate(h); + fprintf(stderr, "htdbm Interrupted !\n"); + exit(ERR_INTERRUPTED); +} + +static apr_status_t htdbm_init(apr_pool_t **pool, htdbm_t **hdbm) +{ + +#if APR_CHARSET_EBCDIC + apr_status_t rv; +#endif + + apr_pool_create( pool, NULL); + apr_signal(SIGINT, (void (*)(int)) htdbm_interrupted); + + (*hdbm) = (htdbm_t *)apr_pcalloc(*pool, sizeof(htdbm_t)); + (*hdbm)->pool = *pool; + +#if APR_CHARSET_EBCDIC + rv = apr_xlate_open(&((*hdbm)->to_ascii), "ISO8859-1", APR_DEFAULT_CHARSET, (*hdbm)->pool); + if (rv) { + fprintf(stderr, "apr_xlate_open(to ASCII)->%d\n", rv); + return APR_EGENERAL; + } + rv = apr_SHA1InitEBCDIC((*hdbm)->to_ascii); + if (rv) { + fprintf(stderr, "apr_SHA1InitEBCDIC()->%d\n", rv); + return APR_EGENERAL; + } + rv = apr_MD5InitEBCDIC((*hdbm)->to_ascii); + if (rv) { + fprintf(stderr, "apr_MD5InitEBCDIC()->%d\n", rv); + return APR_EGENERAL; + } +#endif /*APR_CHARSET_EBCDIC*/ + + /* Set MD5 as default */ + (*hdbm)->alg = ALG_APMD5; + (*hdbm)->type = "default"; + return APR_SUCCESS; +} + +static apr_status_t htdbm_open(htdbm_t *htdbm) +{ + if (htdbm->create) + return apr_dbm_open_ex(&htdbm->dbm, htdbm->type, htdbm->filename, APR_DBM_RWCREATE, + APR_OS_DEFAULT, htdbm->pool); + else + return apr_dbm_open_ex(&htdbm->dbm, htdbm->type, htdbm->filename, + htdbm->rdonly ? APR_DBM_READONLY : APR_DBM_READWRITE, + APR_OS_DEFAULT, htdbm->pool); +} + +static apr_status_t htdbm_save(htdbm_t *htdbm, int *changed) +{ + apr_datum_t key, val; + + if (!htdbm->username) + return APR_SUCCESS; + + key.dptr = htdbm->username; + key.dsize = strlen(htdbm->username); + if (apr_dbm_exists(htdbm->dbm, key)) + *changed = 1; + + val.dsize = strlen(htdbm->userpass); + if (!htdbm->comment) + val.dptr = htdbm->userpass; + else { + val.dptr = apr_pstrcat(htdbm->pool, htdbm->userpass, ":", + htdbm->comment, NULL); + val.dsize += (strlen(htdbm->comment) + 1); + } + return apr_dbm_store(htdbm->dbm, key, val); +} + +static apr_status_t htdbm_del(htdbm_t *htdbm) +{ + apr_datum_t key; + + key.dptr = htdbm->username; + key.dsize = strlen(htdbm->username); + if (!apr_dbm_exists(htdbm->dbm, key)) + return APR_ENOENT; + + return apr_dbm_delete(htdbm->dbm, key); +} + +static apr_status_t htdbm_verify(htdbm_t *htdbm) +{ + apr_datum_t key, val; + char pwd[MAX_STRING_LEN] = {0}; + char *rec, *cmnt; + + key.dptr = htdbm->username; + key.dsize = strlen(htdbm->username); + if (!apr_dbm_exists(htdbm->dbm, key)) + return APR_ENOENT; + if (apr_dbm_fetch(htdbm->dbm, key, &val) != APR_SUCCESS) + return APR_ENOENT; + rec = apr_pstrndup(htdbm->pool, val.dptr, val.dsize); + cmnt = strchr(rec, ';'); + if (cmnt) + strncpy(pwd, rec, cmnt - rec); + else + strcpy(pwd, rec); + return apr_password_validate(htdbm->userpass, pwd); +} + +static apr_status_t htdbm_list(htdbm_t *htdbm) +{ + apr_status_t rv; + apr_datum_t key, val; + char *rec, *cmnt; + char kb[MAX_STRING_LEN]; + int i = 0; + + rv = apr_dbm_firstkey(htdbm->dbm, &key); + if (rv != APR_SUCCESS) { + fprintf(stderr, "Empty database -- %s\n", htdbm->filename); + return APR_ENOENT; + } + rec = apr_pcalloc(htdbm->pool, HUGE_STRING_LEN); + + fprintf(stderr, "Dumping records from database -- %s\n", htdbm->filename); + fprintf(stderr, " %-32sComment\n", "Username"); + while (key.dptr != NULL) { + rv = apr_dbm_fetch(htdbm->dbm, key, &val); + if (rv != APR_SUCCESS) { + fprintf(stderr, "Failed getting data from %s\n", htdbm->filename); + return APR_EGENERAL; + } + strncpy(kb, key.dptr, key.dsize); + kb[key.dsize] = '\0'; + fprintf(stderr, " %-32s", kb); + strncpy(rec, val.dptr, val.dsize); + rec[val.dsize] = '\0'; + cmnt = strchr(rec, ':'); + if (cmnt) + fprintf(stderr, cmnt + 1); + fprintf(stderr, "\n"); + rv = apr_dbm_nextkey(htdbm->dbm, &key); + if (rv != APR_SUCCESS) + fprintf(stderr, "Failed getting NextKey\n"); + ++i; + } + + fprintf(stderr, "Total #records : %d\n", i); + return APR_SUCCESS; +} + +static void to64(char *s, unsigned long v, int n) +{ + static unsigned char itoa64[] = /* 0 ... 63 => ASCII - 64 */ + "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + + while (--n >= 0) { + *s++ = itoa64[v&0x3f]; + v >>= 6; + } +} + +static apr_status_t htdbm_make(htdbm_t *htdbm) +{ + char cpw[MAX_STRING_LEN]; + char salt[9]; + + switch (htdbm->alg) { + case ALG_APSHA: + /* XXX cpw >= 28 + strlen(sha1) chars - fixed len SHA */ + apr_sha1_base64(htdbm->userpass,strlen(htdbm->userpass),cpw); + break; + + case ALG_APMD5: + (void) srand((int) time((time_t *) NULL)); + to64(&salt[0], rand(), 8); + salt[8] = '\0'; + apr_md5_encode((const char *)htdbm->userpass, (const char *)salt, + cpw, sizeof(cpw)); + break; + case ALG_PLAIN: + /* XXX this len limitation is not in sync with any HTTPd len. */ + apr_cpystrn(cpw,htdbm->userpass,sizeof(cpw)); + break; +#if APR_HAVE_CRYPT_H + case ALG_CRYPT: + (void) srand((int) time((time_t *) NULL)); + to64(&salt[0], rand(), 8); + salt[8] = '\0'; + apr_cpystrn(cpw, (char *)crypt(htdbm->userpass, salt), sizeof(cpw) - 1); + fprintf(stderr, "CRYPT is now deprecated, use MD5 instead!\n"); +#endif + default: + break; + } + htdbm->userpass = apr_pstrdup(htdbm->pool, cpw); + return APR_SUCCESS; +} + +static apr_status_t htdbm_valid_username(htdbm_t *htdbm) +{ + if (!htdbm->username || (strlen(htdbm->username) > 64) || (strlen(htdbm->username) < 1)) { + fprintf(stderr, "Invalid username length\n"); + return APR_EINVAL; + } + if (strchr(htdbm->username, ':')) { + fprintf(stderr, "Username contains invalid characters\n"); + return APR_EINVAL; + } + return APR_SUCCESS; +} + +static void htdbm_usage(void) +{ + +#if APR_HAVE_CRYPT_H +#define CRYPT_OPTION "d" +#else +#define CRYPT_OPTION "" +#endif + fprintf(stderr, "htdbm -- program for manipulating DBM password databases.\n\n"); + fprintf(stderr, "Usage: htdbm [-cm"CRYPT_OPTION"pstvx] [-TDBTYPE] database username\n"); + fprintf(stderr, " -b[cm"CRYPT_OPTION"ptsv] [-TDBTYPE] database username password\n"); + fprintf(stderr, " -n[m"CRYPT_OPTION"pst] username\n"); + fprintf(stderr, " -nb[m"CRYPT_OPTION"pst] username password\n"); + fprintf(stderr, " -v[m"CRYPT_OPTION"ps] [-TDBTYPE] database username\n"); + fprintf(stderr, " -vb[m"CRYPT_OPTION"ps] [-TDBTYPE] database username password\n"); + fprintf(stderr, " -x[m"CRYPT_OPTION"ps] [-TDBTYPE] database username\n"); + fprintf(stderr, " -l [-TDBTYPE] database\n"); + fprintf(stderr, "Options:\n"); + fprintf(stderr, " -b Use the password from the command line rather " + "than prompting for it.\n"); + fprintf(stderr, " -c Create a new database.\n"); + fprintf(stderr, " -n Don't update database; display results on stdout.\n"); + fprintf(stderr, " -m Force MD5 encryption of the password (default).\n"); +#if APR_HAVE_CRYPT_H + fprintf(stderr, " -d Force CRYPT encryption of the password (now deprecated).\n"); +#endif + fprintf(stderr, " -p Do not encrypt the password (plaintext).\n"); + fprintf(stderr, " -s Force SHA encryption of the password.\n"); + fprintf(stderr, " -T DBM Type (SDBM|GDBM|DB|default).\n"); + fprintf(stderr, " -l Display usernames from database on stdout.\n"); + fprintf(stderr, " -t The last param is username comment.\n"); + fprintf(stderr, " -v Verify the username/password.\n"); + fprintf(stderr, " -x Remove the username record from database.\n"); + exit(ERR_SYNTAX); + +} + + +int main(int argc, const char * const argv[]) +{ + apr_pool_t *pool; + apr_status_t rv; + apr_size_t l; + char pwi[MAX_STRING_LEN]; + char pwc[MAX_STRING_LEN]; + char errbuf[MAX_STRING_LEN]; + const char *arg; + int need_file = 1; + int need_user = 1; + int need_pwd = 1; + int need_cmnt = 0; + int pwd_supplied = 0; + int changed; + int cmd = HTDBM_MAKE; + int i; + int args_left = 2; + + apr_app_initialize(&argc, &argv, NULL); + atexit(terminate); + + if ((rv = htdbm_init(&pool, &h)) != APR_SUCCESS) { + fprintf(stderr, "Unable to initialize htdbm terminating!\n"); + apr_strerror(rv, errbuf, sizeof(errbuf)); + exit(1); + } + /* + * Preliminary check to make sure they provided at least + * three arguments, we'll do better argument checking as + * we parse the command line. + */ + if (argc < 3) + htdbm_usage(); + /* + * Go through the argument list and pick out any options. They + * have to precede any other arguments. + */ + for (i = 1; i < argc; i++) { + arg = argv[i]; + if (*arg != '-') + break; + + while (*++arg != '\0') { + switch (*arg) { + case 'b': + pwd_supplied = 1; + need_pwd = 0; + args_left++; + break; + case 'c': + h->create = 1; + break; + case 'n': + need_file = 0; + cmd = HTDBM_NOFILE; + args_left--; + break; + case 'l': + need_pwd = 0; + need_user = 0; + cmd = HTDBM_LIST; + h->rdonly = 1; + args_left--; + break; + case 't': + need_cmnt = 1; + args_left++; + break; + case 'T': + h->type = apr_pstrdup(h->pool, ++arg); + while (*arg != '\0') + ++arg; + --arg; /* so incrementing this in the loop with find a null */ + break; + case 'v': + h->rdonly = 1; + cmd = HTDBM_VERIFY; + break; + case 'x': + need_pwd = 0; + cmd = HTDBM_DELETE; + break; + case 'm': + h->alg = ALG_APMD5; + break; + case 'p': + h->alg = ALG_PLAIN; + break; + case 's': + h->alg = ALG_APSHA; + break; +#if APR_HAVE_CRYPT_H + case 'd': + h->alg = ALG_CRYPT; + break; +#endif + default: + htdbm_usage(); + break; + } + } + } + /* + * Make sure we still have exactly the right number of arguments left + * (the filename, the username, and possibly the password if -b was + * specified). + */ + if ((argc - i) != args_left) + htdbm_usage(); + + if (!need_file) + i--; + else { + h->filename = apr_pstrdup(h->pool, argv[i]); + if ((rv = htdbm_open(h)) != APR_SUCCESS) { + fprintf(stderr, "Error opening database %s\n", argv[i]); + apr_strerror(rv, errbuf, sizeof(errbuf)); + fprintf(stderr,"%s\n",errbuf); + exit(ERR_FILEPERM); + } + } + if (need_user) { + h->username = apr_pstrdup(pool, argv[i+1]); + if (htdbm_valid_username(h) != APR_SUCCESS) + exit(ERR_BADUSER); + } + if (pwd_supplied) + h->userpass = apr_pstrdup(pool, argv[i+2]); + + if (need_pwd) { + l = sizeof(pwc); + if (apr_password_get("Enter password : ", pwi, &l) != APR_SUCCESS) { + fprintf(stderr, "Password too long\n"); + exit(ERR_OVERFLOW); + } + l = sizeof(pwc); + if (apr_password_get("Re-type password : ", pwc, &l) != APR_SUCCESS) { + fprintf(stderr, "Password too long\n"); + exit(ERR_OVERFLOW); + } + if (strcmp(pwi, pwc) != 0) { + fprintf(stderr, "Password verification error\n"); + exit(ERR_PWMISMATCH); + } + + h->userpass = apr_pstrdup(pool, pwi); + } + if (need_cmnt && pwd_supplied) + h->comment = apr_pstrdup(pool, argv[i+3]); + else if (need_cmnt) + h->comment = apr_pstrdup(pool, argv[i+2]); + + switch (cmd) { + case HTDBM_VERIFY: + if ((rv = htdbm_verify(h)) != APR_SUCCESS) { + if(rv == APR_ENOENT) { + fprintf(stderr, "The user '%s' could not be found in database\n", h->username); + exit(ERR_BADUSER); + } + else { + fprintf(stderr, "Password mismatch for user '%s'\n", h->username); + exit(ERR_PWMISMATCH); + } + } + else + fprintf(stderr, "Password validated for user '%s'\n", h->username); + break; + case HTDBM_DELETE: + if (htdbm_del(h) != APR_SUCCESS) { + fprintf(stderr, "Cannot find user '%s' in database\n", h->username); + exit(ERR_BADUSER); + } + h->username = NULL; + changed = 1; + break; + case HTDBM_LIST: + htdbm_list(h); + break; + default: + htdbm_make(h); + break; + + } + if (need_file && !h->rdonly) { + if ((rv = htdbm_save(h, &changed)) != APR_SUCCESS) { + apr_strerror(rv, errbuf, sizeof(errbuf)); + exit(ERR_FILEPERM); + } + fprintf(stdout, "Database %s %s.\n", h->filename, + h->create ? "created" : (changed ? "modified" : "updated")); + } + if (cmd == HTDBM_NOFILE) { + if (!need_cmnt) { + fprintf(stderr, "%s:%s\n", h->username, h->userpass); + } + else { + fprintf(stderr, "%s:%s:%s\n", h->username, h->userpass, + h->comment); + } + } + htdbm_terminate(h); + + return 0; /* Suppress compiler warning. */ +} diff --git a/rubbos/app/httpd-2.0.64/support/htdbm.dsp b/rubbos/app/httpd-2.0.64/support/htdbm.dsp new file mode 100644 index 00000000..c00c2c84 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/support/htdbm.dsp @@ -0,0 +1,123 @@ +# Microsoft Developer Studio Project File - Name="htdbm" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=htdbm - 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 "htdbm.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 "htdbm.mak" CFG="htdbm - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "htdbm - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "htdbm - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "htdbm - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "APR_DECLARE_STATIC" /D "APU_DECLARE_STATIC" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../srclib/apr/include" /I "../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "APR_DECLARE_STATIC" /D "APU_DECLARE_STATIC" /Fd"Release/htdbm_src" /FD /c +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib advapi32.lib wsock32.lib ws2_32.lib shell32.lib /nologo /subsystem:console +# ADD LINK32 kernel32.lib advapi32.lib wsock32.lib ws2_32.lib shell32.lib /nologo /subsystem:console /debug /opt:ref + +!ELSEIF "$(CFG)" == "htdbm - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "APR_DECLARE_STATIC" /D "APU_DECLARE_STATIC" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../srclib/apr/include" /I "../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "APR_DECLARE_STATIC" /D "APU_DECLARE_STATIC" /Fd"Debug/htdbm_src" /FD /c +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib advapi32.lib wsock32.lib ws2_32.lib shell32.lib /nologo /subsystem:console /incremental:no /debug +# ADD LINK32 kernel32.lib advapi32.lib wsock32.lib ws2_32.lib shell32.lib /nologo /subsystem:console /incremental:no /debug + +!ENDIF + +# Begin Target + +# Name "htdbm - Win32 Release" +# Name "htdbm - Win32 Debug" +# Begin Source File + +SOURCE=.\htdbm.c +# End Source File +# Begin Source File + +SOURCE=.\htdbm.rc +# End Source File +# Begin Source File + +SOURCE=..\build\win32\win32ver.awk + +!IF "$(CFG)" == "htdbm - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\build\win32\win32ver.awk + +".\htdbm.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../build/win32/win32ver.awk htdbm.exe "htdbm Utility" ../include/ap_release.h > .\htdbm.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "htdbm - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\build\win32\win32ver.awk + +".\htdbm.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../build/win32/win32ver.awk htdbm.exe "htdbm Utility" ../include/ap_release.h > .\htdbm.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/support/htdbm.lo b/rubbos/app/httpd-2.0.64/support/htdbm.lo new file mode 100644 index 00000000..1397a739 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/support/htdbm.lo @@ -0,0 +1,12 @@ +# htdbm.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/htdbm.o' + +# Name of the non-PIC object. +non_pic_object='htdbm.o' + diff --git a/rubbos/app/httpd-2.0.64/support/htdbm.o b/rubbos/app/httpd-2.0.64/support/htdbm.o new file mode 100644 index 0000000000000000000000000000000000000000..35bf9bd897c7026e56a54a54e382b9adb00e1c13 GIT binary patch literal 65256 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 HssDcff5e7w literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/support/htdigest b/rubbos/app/httpd-2.0.64/support/htdigest new file mode 100755 index 00000000..61c78dd4 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/support/htdigest @@ -0,0 +1,131 @@ +#! /bin/bash + +# htdigest - temporary wrapper script for .libs/htdigest +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# The htdigest program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='/bin/sed -e 1s/^X//' +sed_quote_subst='s/\([\\`\\"$\\\\]\)/\\\1/g' + +# Be Bourne compatible (taken from Autoconf:_AS_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="(cd /bottlenecks/rubbos/app/httpd-2.0.64/support; { test -z \"\${LIBRARY_PATH+set}\" || unset LIBRARY_PATH || { LIBRARY_PATH=; export LIBRARY_PATH; }; }; { test -z \"\${COMPILER_PATH+set}\" || unset COMPILER_PATH || { COMPILER_PATH=; export COMPILER_PATH; }; }; { test -z \"\${GCC_EXEC_PREFIX+set}\" || unset GCC_EXEC_PREFIX || { GCC_EXEC_PREFIX=; export GCC_EXEC_PREFIX; }; }; { test -z \"\${LD_RUN_PATH+set}\" || unset LD_RUN_PATH || { LD_RUN_PATH=; export LD_RUN_PATH; }; }; { test -z \"\${LD_LIBRARY_PATH+set}\" || unset LD_LIBRARY_PATH || { LD_LIBRARY_PATH=; export LD_LIBRARY_PATH; }; }; PATH=\"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games\"; export PATH; gcc -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE -DAP_HAVE_DESIGNATED_INITIALIZER -I/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include -I/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include -I/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib -I. -I/bottlenecks/rubbos/app/httpd-2.0.64/os/unix -I/bottlenecks/rubbos/app/httpd-2.0.64/server/mpm/worker -I/bottlenecks/rubbos/app/httpd-2.0.64/modules/http -I/bottlenecks/rubbos/app/httpd-2.0.64/modules/filters -I/bottlenecks/rubbos/app/httpd-2.0.64/modules/proxy -I/bottlenecks/rubbos/app/httpd-2.0.64/include -I/bottlenecks/rubbos/app/httpd-2.0.64/modules/generators -I/bottlenecks/rubbos/app/httpd-2.0.64/modules/dav/main -o \$progdir/\$file .libs/htdigest.o -Wl,--export-dynamic -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib /bottlenecks/rubbos/app/httpd-2.0.64/srclib/pcre/.libs/libpcre.a /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/.libs/libaprutil-0.so /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/.libs/libexpat.so /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/.libs/libapr-0.so -lrt -lm -lcrypt -lnsl -lpthread -ldl -Wl,--rpath -Wl,/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/.libs -Wl,--rpath -Wl,/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/.libs -Wl,--rpath -Wl,/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/.libs -Wl,--rpath -Wl,/bottlenecks/rubbos/app/apache2/lib ) " + +# This environment variable determines our operation mode. +if test "$libtool_install_magic" = "%%%MAGIC variable%%%"; then + # install mode needs the following variable: + notinst_deplibs=' /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/libaprutil-0.la /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/libexpat.la /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/libapr-0.la' +else + # When we are sourced in execute mode, $file and $echo are already set. + if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then + echo="echo" + file="$0" + # Make sure echo works. + if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift + elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then + # Yippee, $echo works! + : + else + # Restart under the correct shell, and then maybe $echo will work. + exec /bin/bash "$0" --no-reexec ${1+"$@"} + fi + fi + + # Find the directory that this script lives in. + thisdir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "x$thisdir" = "x$file" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=`ls -ld "$file" | /bin/sed -n 's/.*-> //p'` + while test -n "$file"; do + destdir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + + # If there was a directory component, then change thisdir. + if test "x$destdir" != "x$file"; then + case "$destdir" in + [\\/]* | [A-Za-z]:[\\/]*) thisdir="$destdir" ;; + *) thisdir="$thisdir/$destdir" ;; + esac + fi + + file=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + file=`ls -ld "$thisdir/$file" | /bin/sed -n 's/.*-> //p'` + done + + # Try to get the absolute directory name. + absdir=`cd "$thisdir" && pwd` + test -n "$absdir" && thisdir="$absdir" + + program=lt-'htdigest' + progdir="$thisdir/.libs" + + if test ! -f "$progdir/$program" || \ + { file=`ls -1dt "$progdir/$program" "$progdir/../$program" 2>/dev/null | /bin/sed 1q`; \ + test "X$file" != "X$progdir/$program"; }; then + + file="$$-$program" + + if test ! -d "$progdir"; then + mkdir "$progdir" + else + rm -f "$progdir/$file" + fi + + # 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 -f "$progdir/$file" + exit 1 + fi + fi + + mv -f "$progdir/$file" "$progdir/$program" 2>/dev/null || + { rm -f "$progdir/$program"; + mv -f "$progdir/$file" "$progdir/$program"; } + rm -f "$progdir/$file" + fi + + if test -f "$progdir/$program"; then + if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then + # Run the actual program with our arguments. + + exec "$progdir/$program" ${1+"$@"} + + $echo "$0: cannot exec $program $*" + exit 1 + fi + else + # The program doesn't exist. + $echo "$0: error: \`$progdir/$program' does not exist" 1>&2 + $echo "This script is just a wrapper for $program." 1>&2 + echo "See the libtool documentation for more information." 1>&2 + exit 1 + fi +fi diff --git a/rubbos/app/httpd-2.0.64/support/htdigest.c b/rubbos/app/httpd-2.0.64/support/htdigest.c new file mode 100644 index 00000000..55699ad1 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/support/htdigest.c @@ -0,0 +1,291 @@ +/* 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. + */ + +/****************************************************************************** + ****************************************************************************** + * NOTE! This program is not safe as a setuid executable! Do not make it + * setuid! + ****************************************************************************** + *****************************************************************************/ +/* + * htdigest.c: simple program for manipulating digest passwd file for Apache + * + * by Alexei Kosut, based on htpasswd.c, by Rob McCool + */ + +#include "apr.h" +#include "apr_file_io.h" +#include "apr_md5.h" +#include "apr_lib.h" /* for apr_getpass() */ +#include "apr_general.h" +#include "apr_signal.h" +#include "apr_strings.h" /* for apr_pstrdup() */ + +#define APR_WANT_STDIO +#define APR_WANT_STRFUNC +#include "apr_want.h" + +#if APR_HAVE_SYS_TYPES_H +#include +#endif +#if APR_HAVE_STDLIB_H +#include +#endif + +#ifdef WIN32 +#include +#endif + + +#if APR_CHARSET_EBCDIC +#define LF '\n' +#define CR '\r' +#else +#define LF 10 +#define CR 13 +#endif /* APR_CHARSET_EBCDIC */ + +#define MAX_STRING_LEN 256 + +apr_file_t *tfp = NULL; +apr_file_t *errfile; +apr_pool_t *cntxt; +#if APR_CHARSET_EBCDIC +apr_xlate_t *to_ascii; +#endif + +static void cleanup_tempfile_and_exit(int rc) +{ + if (tfp) { + apr_file_close(tfp); + } + exit(rc); +} + +static void getword(char *word, char *line, char stop) +{ + int x = 0, y; + + for (x = 0; ((line[x]) && (line[x] != stop)); x++) + word[x] = line[x]; + + word[x] = '\0'; + if (line[x]) + ++x; + y = 0; + + while ((line[y++] = line[x++])); +} + +static int get_line(char *s, int n, apr_file_t *f) +{ + register int i = 0; + char ch; + apr_status_t rv = APR_EINVAL; + + while (i < (n - 1) && + ((rv = apr_file_getc(&ch, f)) == APR_SUCCESS) && (ch != '\n')) { + s[i++] = ch; + } + if (ch == '\n') + s[i++] = ch; + s[i] = '\0'; + + if (rv != APR_SUCCESS) + return 1; + + return 0; +} + +static void putline(apr_file_t *f, char *l) +{ + int x; + + for (x = 0; l[x]; x++) + apr_file_putc(l[x], f); +} + + +static void add_password(const char *user, const char *realm, apr_file_t *f) +{ + char *pw; + apr_md5_ctx_t context; + unsigned char digest[16]; + char string[MAX_STRING_LEN]; + char pwin[MAX_STRING_LEN]; + char pwv[MAX_STRING_LEN]; + unsigned int i; + apr_size_t len = sizeof(pwin); + + if (apr_password_get("New password: ", pwin, &len) != APR_SUCCESS) { + apr_file_printf(errfile, "password too long"); + cleanup_tempfile_and_exit(5); + } + len = sizeof(pwin); + apr_password_get("Re-type new password: ", pwv, &len); + if (strcmp(pwin, pwv) != 0) { + apr_file_printf(errfile, "They don't match, sorry.\n"); + cleanup_tempfile_and_exit(1); + } + pw = pwin; + apr_file_printf(f, "%s:%s:", user, realm); + + /* Do MD5 stuff */ + sprintf(string, "%s:%s:%s", user, realm, pw); + + apr_md5_init(&context); +#if APR_CHARSET_EBCDIC + apr_md5_set_xlate(&context, to_ascii); +#endif + apr_md5_update(&context, (unsigned char *) string, strlen(string)); + apr_md5_final(digest, &context); + + for (i = 0; i < 16; i++) + apr_file_printf(f, "%02x", digest[i]); + + apr_file_printf(f, "\n"); +} + +static void usage(void) +{ + apr_file_printf(errfile, "Usage: htdigest [-c] passwordfile realm username\n"); + apr_file_printf(errfile, "The -c flag creates a new file.\n"); + exit(1); +} + +static void interrupted(void) +{ + apr_file_printf(errfile, "Interrupted.\n"); + cleanup_tempfile_and_exit(1); +} + +static void terminate(void) +{ + apr_terminate(); +#ifdef NETWARE + pressanykey(); +#endif +} + +int main(int argc, const char * const argv[]) +{ + apr_file_t *f; + apr_status_t rv; + char tn[] = "htdigest.tmp.XXXXXX"; + char *dirname; + char user[MAX_STRING_LEN]; + char realm[MAX_STRING_LEN]; + char line[MAX_STRING_LEN]; + char l[MAX_STRING_LEN]; + char w[MAX_STRING_LEN]; + char x[MAX_STRING_LEN]; + int found; + + apr_app_initialize(&argc, &argv, NULL); + atexit(terminate); + apr_pool_create(&cntxt, NULL); + apr_file_open_stderr(&errfile, cntxt); + +#if APR_CHARSET_EBCDIC + rv = apr_xlate_open(&to_ascii, "ISO8859-1", APR_DEFAULT_CHARSET, cntxt); + if (rv) { + apr_file_printf(errfile, "apr_xlate_open(): %s (%d)\n", + apr_strerror(rv, line, sizeof(line)), rv); + exit(1); + } +#endif + + apr_signal(SIGINT, (void (*)(int)) interrupted); + if (argc == 5) { + if (strcmp(argv[1], "-c")) + usage(); + rv = apr_file_open(&f, argv[2], APR_WRITE | APR_CREATE, + APR_OS_DEFAULT, cntxt); + if (rv != APR_SUCCESS) { + char errmsg[120]; + + apr_file_printf(errfile, "Could not open passwd file %s for writing: %s\n", + argv[2], + apr_strerror(rv, errmsg, sizeof errmsg)); + exit(1); + } + apr_file_printf(errfile, "Adding password for %s in realm %s.\n", + argv[4], argv[3]); + add_password(argv[4], argv[3], f); + apr_file_close(f); + exit(0); + } + else if (argc != 4) + usage(); + + if (apr_temp_dir_get((const char**)&dirname, cntxt) != APR_SUCCESS) { + apr_file_printf(errfile, "%s: could not determine temp dir\n", + argv[0]); + exit(1); + } + dirname = apr_psprintf(cntxt, "%s/%s", dirname, tn); + + if (apr_file_mktemp(&tfp, dirname, 0, cntxt) != APR_SUCCESS) { + apr_file_printf(errfile, "Could not open temp file %s.\n", dirname); + exit(1); + } + + if (apr_file_open(&f, argv[1], APR_READ, APR_OS_DEFAULT, cntxt) != APR_SUCCESS) { + apr_file_printf(errfile, + "Could not open passwd file %s for reading.\n", argv[1]); + apr_file_printf(errfile, "Use -c option to create new one.\n"); + cleanup_tempfile_and_exit(1); + } + apr_cpystrn(user, argv[3], sizeof(user)); + apr_cpystrn(realm, argv[2], sizeof(realm)); + + found = 0; + while (!(get_line(line, MAX_STRING_LEN, f))) { + if (found || (line[0] == '#') || (!line[0])) { + putline(tfp, line); + continue; + } + strcpy(l, line); + getword(w, l, ':'); + getword(x, l, ':'); + if (strcmp(user, w) || strcmp(realm, x)) { + putline(tfp, line); + continue; + } + else { + apr_file_printf(errfile, "Changing password for user %s in realm %s\n", + user, realm); + add_password(user, realm, tfp); + found = 1; + } + } + if (!found) { + apr_file_printf(errfile, "Adding user %s in realm %s\n", user, realm); + add_password(user, realm, tfp); + } + apr_file_close(f); + + /* The temporary file has all the data, just copy it to the new location. + */ + if (apr_file_copy(dirname, argv[1], APR_FILE_SOURCE_PERMS, cntxt) != + APR_SUCCESS) { + apr_file_printf(errfile, "%s: unable to update file %s\n", + argv[0], argv[1]); + } + apr_file_close(tfp); + + return 0; +} diff --git a/rubbos/app/httpd-2.0.64/support/htdigest.dsp b/rubbos/app/httpd-2.0.64/support/htdigest.dsp new file mode 100644 index 00000000..94bc802c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/support/htdigest.dsp @@ -0,0 +1,123 @@ +# Microsoft Developer Studio Project File - Name="htdigest" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=htdigest - 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 "htdigest.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 "htdigest.mak" CFG="htdigest - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "htdigest - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "htdigest - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "htdigest - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "APR_DECLARE_STATIC" /D "APU_DECLARE_STATIC" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../srclib/apr/include" /I "../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "APR_DECLARE_STATIC" /D "APU_DECLARE_STATIC" /Fd"Release/htdigest_src" /FD /c +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib advapi32.lib wsock32.lib ws2_32.lib shell32.lib /nologo /subsystem:console +# ADD LINK32 kernel32.lib advapi32.lib wsock32.lib ws2_32.lib shell32.lib /nologo /subsystem:console /debug /opt:ref + +!ELSEIF "$(CFG)" == "htdigest - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "APR_DECLARE_STATIC" /D "APU_DECLARE_STATIC" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../srclib/apr/include" /I "../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "APR_DECLARE_STATIC" /D "APU_DECLARE_STATIC" /Fd"Debug/htdigest_src" /FD /c +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib advapi32.lib wsock32.lib ws2_32.lib shell32.lib /nologo /subsystem:console /incremental:no /debug +# ADD LINK32 kernel32.lib advapi32.lib wsock32.lib ws2_32.lib shell32.lib /nologo /subsystem:console /incremental:no /debug + +!ENDIF + +# Begin Target + +# Name "htdigest - Win32 Release" +# Name "htdigest - Win32 Debug" +# Begin Source File + +SOURCE=.\htdigest.c +# End Source File +# Begin Source File + +SOURCE=.\htdigest.rc +# End Source File +# Begin Source File + +SOURCE=..\build\win32\win32ver.awk + +!IF "$(CFG)" == "htdigest - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\build\win32\win32ver.awk + +".\htdigest.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../build/win32/win32ver.awk htdigest.exe "htdigest Utility" ../include/ap_release.h > .\htdigest.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "htdigest - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\build\win32\win32ver.awk + +".\htdigest.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../build/win32/win32ver.awk htdigest.exe "htdigest Utility" ../include/ap_release.h > .\htdigest.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/support/htdigest.lo b/rubbos/app/httpd-2.0.64/support/htdigest.lo new file mode 100644 index 00000000..845a48ff --- /dev/null +++ b/rubbos/app/httpd-2.0.64/support/htdigest.lo @@ -0,0 +1,12 @@ +# htdigest.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/htdigest.o' + +# Name of the non-PIC object. +non_pic_object='htdigest.o' + diff --git a/rubbos/app/httpd-2.0.64/support/htdigest.o b/rubbos/app/httpd-2.0.64/support/htdigest.o new file mode 100644 index 0000000000000000000000000000000000000000..e3ec6704f81ce9d987ccf49786b5c118515f318a GIT binary patch literal 34768 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/support/htpasswd b/rubbos/app/httpd-2.0.64/support/htpasswd new file mode 100755 index 00000000..b572d20c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/support/htpasswd @@ -0,0 +1,131 @@ +#! /bin/bash + +# htpasswd - temporary wrapper script for .libs/htpasswd +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# The htpasswd program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='/bin/sed -e 1s/^X//' +sed_quote_subst='s/\([\\`\\"$\\\\]\)/\\\1/g' + +# Be Bourne compatible (taken from Autoconf:_AS_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="(cd /bottlenecks/rubbos/app/httpd-2.0.64/support; { test -z \"\${LIBRARY_PATH+set}\" || unset LIBRARY_PATH || { LIBRARY_PATH=; export LIBRARY_PATH; }; }; { test -z \"\${COMPILER_PATH+set}\" || unset COMPILER_PATH || { COMPILER_PATH=; export COMPILER_PATH; }; }; { test -z \"\${GCC_EXEC_PREFIX+set}\" || unset GCC_EXEC_PREFIX || { GCC_EXEC_PREFIX=; export GCC_EXEC_PREFIX; }; }; { test -z \"\${LD_RUN_PATH+set}\" || unset LD_RUN_PATH || { LD_RUN_PATH=; export LD_RUN_PATH; }; }; { test -z \"\${LD_LIBRARY_PATH+set}\" || unset LD_LIBRARY_PATH || { LD_LIBRARY_PATH=; export LD_LIBRARY_PATH; }; }; PATH=\"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games\"; export PATH; gcc -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE -DAP_HAVE_DESIGNATED_INITIALIZER -I/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include -I/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include -I/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib -I. -I/bottlenecks/rubbos/app/httpd-2.0.64/os/unix -I/bottlenecks/rubbos/app/httpd-2.0.64/server/mpm/worker -I/bottlenecks/rubbos/app/httpd-2.0.64/modules/http -I/bottlenecks/rubbos/app/httpd-2.0.64/modules/filters -I/bottlenecks/rubbos/app/httpd-2.0.64/modules/proxy -I/bottlenecks/rubbos/app/httpd-2.0.64/include -I/bottlenecks/rubbos/app/httpd-2.0.64/modules/generators -I/bottlenecks/rubbos/app/httpd-2.0.64/modules/dav/main -o \$progdir/\$file .libs/htpasswd.o -Wl,--export-dynamic -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib /bottlenecks/rubbos/app/httpd-2.0.64/srclib/pcre/.libs/libpcre.a /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/.libs/libaprutil-0.so /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/.libs/libexpat.so /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/.libs/libapr-0.so -lrt -lm -lcrypt -lnsl -lpthread -ldl -Wl,--rpath -Wl,/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/.libs -Wl,--rpath -Wl,/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/.libs -Wl,--rpath -Wl,/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/.libs -Wl,--rpath -Wl,/bottlenecks/rubbos/app/apache2/lib ) " + +# This environment variable determines our operation mode. +if test "$libtool_install_magic" = "%%%MAGIC variable%%%"; then + # install mode needs the following variable: + notinst_deplibs=' /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/libaprutil-0.la /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/libexpat.la /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/libapr-0.la' +else + # When we are sourced in execute mode, $file and $echo are already set. + if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then + echo="echo" + file="$0" + # Make sure echo works. + if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift + elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then + # Yippee, $echo works! + : + else + # Restart under the correct shell, and then maybe $echo will work. + exec /bin/bash "$0" --no-reexec ${1+"$@"} + fi + fi + + # Find the directory that this script lives in. + thisdir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "x$thisdir" = "x$file" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=`ls -ld "$file" | /bin/sed -n 's/.*-> //p'` + while test -n "$file"; do + destdir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + + # If there was a directory component, then change thisdir. + if test "x$destdir" != "x$file"; then + case "$destdir" in + [\\/]* | [A-Za-z]:[\\/]*) thisdir="$destdir" ;; + *) thisdir="$thisdir/$destdir" ;; + esac + fi + + file=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + file=`ls -ld "$thisdir/$file" | /bin/sed -n 's/.*-> //p'` + done + + # Try to get the absolute directory name. + absdir=`cd "$thisdir" && pwd` + test -n "$absdir" && thisdir="$absdir" + + program=lt-'htpasswd' + progdir="$thisdir/.libs" + + if test ! -f "$progdir/$program" || \ + { file=`ls -1dt "$progdir/$program" "$progdir/../$program" 2>/dev/null | /bin/sed 1q`; \ + test "X$file" != "X$progdir/$program"; }; then + + file="$$-$program" + + if test ! -d "$progdir"; then + mkdir "$progdir" + else + rm -f "$progdir/$file" + fi + + # 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 -f "$progdir/$file" + exit 1 + fi + fi + + mv -f "$progdir/$file" "$progdir/$program" 2>/dev/null || + { rm -f "$progdir/$program"; + mv -f "$progdir/$file" "$progdir/$program"; } + rm -f "$progdir/$file" + fi + + if test -f "$progdir/$program"; then + if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then + # Run the actual program with our arguments. + + exec "$progdir/$program" ${1+"$@"} + + $echo "$0: cannot exec $program $*" + exit 1 + fi + else + # The program doesn't exist. + $echo "$0: error: \`$progdir/$program' does not exist" 1>&2 + $echo "This script is just a wrapper for $program." 1>&2 + echo "See the libtool documentation for more information." 1>&2 + exit 1 + fi +fi diff --git a/rubbos/app/httpd-2.0.64/support/htpasswd.c b/rubbos/app/httpd-2.0.64/support/htpasswd.c new file mode 100644 index 00000000..b76f530b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/support/htpasswd.c @@ -0,0 +1,610 @@ +/* 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. + */ + +/****************************************************************************** + ****************************************************************************** + * NOTE! This program is not safe as a setuid executable! Do not make it + * setuid! + ****************************************************************************** + *****************************************************************************/ +/* + * htpasswd.c: simple program for manipulating password file for + * the Apache HTTP server + * + * Originally by Rob McCool + * + * Exit values: + * 0: Success + * 1: Failure; file access/permission problem + * 2: Failure; command line syntax problem (usage message issued) + * 3: Failure; password verification failure + * 4: Failure; operation interrupted (such as with CTRL/C) + * 5: Failure; buffer would overflow (username, filename, or computed + * record too long) + * 6: Failure; username contains illegal or reserved characters + * 7: Failure; file is not a valid htpasswd file + */ + +#include "apr.h" +#include "apr_lib.h" +#include "apr_strings.h" +#include "apr_errno.h" +#include "apr_file_io.h" +#include "apr_general.h" +#include "apr_signal.h" + +#if APR_HAVE_STDIO_H +#include +#endif + +#include "apr_md5.h" +#include "apr_sha1.h" +#include + +#if APR_HAVE_CRYPT_H +#include +#endif +#if APR_HAVE_STDLIB_H +#include +#endif +#if APR_HAVE_STRING_H +#include +#endif +#if APR_HAVE_UNISTD_H +#include +#endif + +#ifdef WIN32 +#include +#define unlink _unlink +#endif + +#if !APR_CHARSET_EBCDIC +#define LF 10 +#define CR 13 +#else /*APR_CHARSET_EBCDIC*/ +#define LF '\n' +#define CR '\r' +#endif /*APR_CHARSET_EBCDIC*/ + +#define MAX_STRING_LEN 256 +#define ALG_PLAIN 0 +#define ALG_CRYPT 1 +#define ALG_APMD5 2 +#define ALG_APSHA 3 + +#define ERR_FILEPERM 1 +#define ERR_SYNTAX 2 +#define ERR_PWMISMATCH 3 +#define ERR_INTERRUPTED 4 +#define ERR_OVERFLOW 5 +#define ERR_BADUSER 6 +#define ERR_INVALID 7 + +#define APHTP_NEWFILE 1 +#define APHTP_NOFILE 2 +#define APHTP_NONINTERACTIVE 4 +#define APHTP_DELUSER 8 + +apr_file_t *errfile; +apr_file_t *ftemp = NULL; + +static void to64(char *s, unsigned long v, int n) +{ + static unsigned char itoa64[] = /* 0 ... 63 => ASCII - 64 */ + "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + + while (--n >= 0) { + *s++ = itoa64[v&0x3f]; + v >>= 6; + } +} + +static void putline(apr_file_t *f, const char *l) +{ + apr_file_puts(l, f); +} + +/* + * Make a password record from the given information. A zero return + * indicates success; failure means that the output buffer contains an + * error message instead. + */ +static int mkrecord(char *user, char *record, apr_size_t rlen, char *passwd, + int alg) +{ + char *pw; + char cpw[120]; + char pwin[MAX_STRING_LEN]; + char pwv[MAX_STRING_LEN]; + char salt[9]; + apr_size_t bufsize; + + if (passwd != NULL) { + pw = passwd; + } + else { + bufsize = sizeof(pwin); + if (apr_password_get("New password: ", pwin, &bufsize) != 0) { + apr_snprintf(record, (rlen - 1), "password too long (>%" + APR_SIZE_T_FMT ")", sizeof(pwin) - 1); + return ERR_OVERFLOW; + } + bufsize = sizeof(pwv); + apr_password_get("Re-type new password: ", pwv, &bufsize); + if (strcmp(pwin, pwv) != 0) { + apr_cpystrn(record, "password verification error", (rlen - 1)); + return ERR_PWMISMATCH; + } + pw = pwin; + memset(pwv, '\0', sizeof(pwin)); + } + switch (alg) { + + case ALG_APSHA: + /* XXX cpw >= 28 + strlen(sha1) chars - fixed len SHA */ + apr_sha1_base64(pw,strlen(pw),cpw); + break; + + case ALG_APMD5: + (void) srand((int) time((time_t *) NULL)); + to64(&salt[0], rand(), 8); + salt[8] = '\0'; + + apr_md5_encode((const char *)pw, (const char *)salt, + cpw, sizeof(cpw)); + break; + + case ALG_PLAIN: + /* XXX this len limitation is not in sync with any HTTPd len. */ + apr_cpystrn(cpw,pw,sizeof(cpw)); + break; + +#if !(defined(WIN32) || defined(NETWARE)) + case ALG_CRYPT: + default: + (void) srand((int) time((time_t *) NULL)); + to64(&salt[0], rand(), 8); + salt[8] = '\0'; + + apr_cpystrn(cpw, (char *)crypt(pw, salt), sizeof(cpw) - 1); + break; +#endif + } + memset(pw, '\0', strlen(pw)); + + /* + * Check to see if the buffer is large enough to hold the username, + * hash, and delimiters. + */ + if ((strlen(user) + 1 + strlen(cpw)) > (rlen - 1)) { + apr_cpystrn(record, "resultant record too long", (rlen - 1)); + return ERR_OVERFLOW; + } + strcpy(record, user); + strcat(record, ":"); + strcat(record, cpw); + strcat(record, "\n"); + return 0; +} + +static void usage(void) +{ + apr_file_printf(errfile, "Usage:\n"); + apr_file_printf(errfile, "\thtpasswd [-cmdpsD] passwordfile username\n"); + apr_file_printf(errfile, "\thtpasswd -b[cmdpsD] passwordfile username " + "password\n\n"); + apr_file_printf(errfile, "\thtpasswd -n[mdps] username\n"); + apr_file_printf(errfile, "\thtpasswd -nb[mdps] username password\n"); + apr_file_printf(errfile, " -c Create a new file.\n"); + apr_file_printf(errfile, " -n Don't update file; display results on " + "stdout.\n"); + apr_file_printf(errfile, " -m Force MD5 encryption of the password" +#if defined(WIN32) || defined(TPF) || defined(NETWARE) + " (default)" +#endif + ".\n"); + apr_file_printf(errfile, " -d Force CRYPT encryption of the password" +#if (!(defined(WIN32) || defined(TPF) || defined(NETWARE))) + " (default)" +#endif + ".\n"); + apr_file_printf(errfile, " -p Do not encrypt the password (plaintext).\n"); + apr_file_printf(errfile, " -s Force SHA encryption of the password.\n"); + apr_file_printf(errfile, " -b Use the password from the command line " + "rather than prompting for it.\n"); + apr_file_printf(errfile, " -D Delete the specified user.\n"); + apr_file_printf(errfile, + "On Windows, NetWare and TPF systems the '-m' flag is used by " + "default.\n"); + apr_file_printf(errfile, + "On all other systems, the '-p' flag will probably not work.\n"); + exit(ERR_SYNTAX); +} + +/* + * Check to see if the specified file can be opened for the given + * access. + */ +static int accessible(apr_pool_t *pool, char *fname, int mode) +{ + apr_file_t *f = NULL; + + if (apr_file_open(&f, fname, mode, APR_OS_DEFAULT, pool) != APR_SUCCESS) { + return 0; + } + apr_file_close(f); + return 1; +} + +/* + * Return true if the named file exists, regardless of permissions. + */ +static int exists(char *fname, apr_pool_t *pool) +{ + apr_finfo_t sbuf; + apr_status_t check; + + check = apr_stat(&sbuf, fname, APR_FINFO_TYPE, pool); + return ((check || sbuf.filetype != APR_REG) ? 0 : 1); +} + +static void terminate(void) +{ + apr_terminate(); +#ifdef NETWARE + pressanykey(); +#endif +} + +static void check_args(apr_pool_t *pool, int argc, const char *const argv[], + int *alg, int *mask, char **user, char **pwfilename, + char **password) +{ + const char *arg; + int args_left = 2; + int i; + + /* + * Preliminary check to make sure they provided at least + * three arguments, we'll do better argument checking as + * we parse the command line. + */ + if (argc < 3) { + usage(); + } + + /* + * Go through the argument list and pick out any options. They + * have to precede any other arguments. + */ + for (i = 1; i < argc; i++) { + arg = argv[i]; + if (*arg != '-') { + break; + } + while (*++arg != '\0') { + if (*arg == 'c') { + *mask |= APHTP_NEWFILE; + } + else if (*arg == 'n') { + *mask |= APHTP_NOFILE; + args_left--; + } + else if (*arg == 'm') { + *alg = ALG_APMD5; + } + else if (*arg == 's') { + *alg = ALG_APSHA; + } + else if (*arg == 'p') { + *alg = ALG_PLAIN; + } + else if (*arg == 'd') { + *alg = ALG_CRYPT; + } + else if (*arg == 'b') { + *mask |= APHTP_NONINTERACTIVE; + args_left++; + } + else if (*arg == 'D') { + *mask |= APHTP_DELUSER; + } + else { + usage(); + } + } + } + + if ((*mask & APHTP_NEWFILE) && (*mask & APHTP_NOFILE)) { + apr_file_printf(errfile, "%s: -c and -n options conflict\n", argv[0]); + exit(ERR_SYNTAX); + } + if ((*mask & APHTP_NEWFILE) && (*mask & APHTP_DELUSER)) { + apr_file_printf(errfile, "%s: -c and -D options conflict\n", argv[0]); + exit(ERR_SYNTAX); + } + if ((*mask & APHTP_NOFILE) && (*mask & APHTP_DELUSER)) { + apr_file_printf(errfile, "%s: -n and -D options conflict\n", argv[0]); + exit(ERR_SYNTAX); + } + /* + * Make sure we still have exactly the right number of arguments left + * (the filename, the username, and possibly the password if -b was + * specified). + */ + if ((argc - i) != args_left) { + usage(); + } + + if (*mask & APHTP_NOFILE) { + i--; + } + else { + if (strlen(argv[i]) > (APR_PATH_MAX - 1)) { + apr_file_printf(errfile, "%s: filename too long\n", argv[0]); + exit(ERR_OVERFLOW); + } + *pwfilename = apr_pstrdup(pool, argv[i]); + if (strlen(argv[i + 1]) > (MAX_STRING_LEN - 1)) { + apr_file_printf(errfile, "%s: username too long (> %d)\n", + argv[0], MAX_STRING_LEN - 1); + exit(ERR_OVERFLOW); + } + } + *user = apr_pstrdup(pool, argv[i + 1]); + if ((arg = strchr(*user, ':')) != NULL) { + apr_file_printf(errfile, "%s: username contains illegal " + "character '%c'\n", argv[0], *arg); + exit(ERR_BADUSER); + } + if (*mask & APHTP_NONINTERACTIVE) { + if (strlen(argv[i + 2]) > (MAX_STRING_LEN - 1)) { + apr_file_printf(errfile, "%s: password too long (> %d)\n", + argv[0], MAX_STRING_LEN); + exit(ERR_OVERFLOW); + } + *password = apr_pstrdup(pool, argv[i + 2]); + } +} + +/* + * Let's do it. We end up doing a lot of file opening and closing, + * but what do we care? This application isn't run constantly. + */ +int main(int argc, const char * const argv[]) +{ + apr_file_t *fpw = NULL; + char record[MAX_STRING_LEN]; + char line[MAX_STRING_LEN]; + char *password = NULL; + char *pwfilename = NULL; + char *user = NULL; + char tn[] = "htpasswd.tmp.XXXXXX"; + char *dirname; + char *scratch, cp[MAX_STRING_LEN]; + int found = 0; + int i; + int alg = ALG_CRYPT; + int mask = 0; + apr_pool_t *pool; + int existing_file = 0; +#if APR_CHARSET_EBCDIC + apr_status_t rv; + apr_xlate_t *to_ascii; +#endif + + apr_app_initialize(&argc, &argv, NULL); + atexit(terminate); + apr_pool_create(&pool, NULL); + apr_file_open_stderr(&errfile, pool); + +#if APR_CHARSET_EBCDIC + rv = apr_xlate_open(&to_ascii, "ISO8859-1", APR_DEFAULT_CHARSET, pool); + if (rv) { + apr_file_printf(errfile, "apr_xlate_open(to ASCII)->%d\n", rv); + exit(1); + } + rv = apr_SHA1InitEBCDIC(to_ascii); + if (rv) { + apr_file_printf(errfile, "apr_SHA1InitEBCDIC()->%d\n", rv); + exit(1); + } + rv = apr_MD5InitEBCDIC(to_ascii); + if (rv) { + apr_file_printf(errfile, "apr_MD5InitEBCDIC()->%d\n", rv); + exit(1); + } +#endif /*APR_CHARSET_EBCDIC*/ + + check_args(pool, argc, argv, &alg, &mask, &user, &pwfilename, &password); + + +#if defined(WIN32) || defined(NETWARE) + if (alg == ALG_CRYPT) { + alg = ALG_APMD5; + apr_file_printf(errfile, "Automatically using MD5 format.\n"); + } +#endif + +#if (!(defined(WIN32) || defined(TPF) || defined(NETWARE))) + if (alg == ALG_PLAIN) { + apr_file_printf(errfile,"Warning: storing passwords as plain text " + "might just not work on this platform.\n"); + } +#endif + + /* + * Only do the file checks if we're supposed to frob it. + */ + if (!(mask & APHTP_NOFILE)) { + existing_file = exists(pwfilename, pool); + if (existing_file) { + /* + * Check that this existing file is readable and writable. + */ + if (!accessible(pool, pwfilename, APR_READ | APR_APPEND)) { + apr_file_printf(errfile, "%s: cannot open file %s for " + "read/write access\n", argv[0], pwfilename); + exit(ERR_FILEPERM); + } + } + else { + /* + * Error out if -c was omitted for this non-existant file. + */ + if (!(mask & APHTP_NEWFILE)) { + apr_file_printf(errfile, + "%s: cannot modify file %s; use '-c' to create it\n", + argv[0], pwfilename); + exit(ERR_FILEPERM); + } + /* + * As it doesn't exist yet, verify that we can create it. + */ + if (!accessible(pool, pwfilename, APR_CREATE | APR_WRITE)) { + apr_file_printf(errfile, "%s: cannot create file %s\n", + argv[0], pwfilename); + exit(ERR_FILEPERM); + } + } + } + + /* + * All the file access checks (if any) have been made. Time to go to work; + * try to create the record for the username in question. If that + * fails, there's no need to waste any time on file manipulations. + * Any error message text is returned in the record buffer, since + * the mkrecord() routine doesn't have access to argv[]. + */ + if (!(mask & APHTP_DELUSER)) { + i = mkrecord(user, record, sizeof(record) - 1, + password, alg); + if (i != 0) { + apr_file_printf(errfile, "%s: %s\n", argv[0], record); + exit(i); + } + if (mask & APHTP_NOFILE) { + printf("%s\n", record); + exit(0); + } + } + + /* + * We can access the files the right way, and we have a record + * to add or update. Let's do it.. + */ + if (apr_temp_dir_get((const char**)&dirname, pool) != APR_SUCCESS) { + apr_file_printf(errfile, "%s: could not determine temp dir\n", + argv[0]); + exit(ERR_FILEPERM); + } + dirname = apr_psprintf(pool, "%s/%s", dirname, tn); + + if (apr_file_mktemp(&ftemp, dirname, 0, pool) != APR_SUCCESS) { + apr_file_printf(errfile, "%s: unable to create temporary file %s\n", + argv[0], dirname); + exit(ERR_FILEPERM); + } + + /* + * If we're not creating a new file, copy records from the existing + * one to the temporary file until we find the specified user. + */ + if (existing_file && !(mask & APHTP_NEWFILE)) { + if (apr_file_open(&fpw, pwfilename, APR_READ | APR_BUFFERED, + APR_OS_DEFAULT, pool) != APR_SUCCESS) { + apr_file_printf(errfile, "%s: unable to read file %s\n", + argv[0], pwfilename); + exit(ERR_FILEPERM); + } + while (apr_file_gets(line, sizeof(line), fpw) == APR_SUCCESS) { + char *colon; + + strcpy(cp, line); + scratch = cp; + while (apr_isspace(*scratch)) { + ++scratch; + } + + if (!*scratch || (*scratch == '#')) { + putline(ftemp, line); + continue; + } + /* + * See if this is our user. + */ + colon = strchr(scratch, ':'); + if (colon != NULL) { + *colon = '\0'; + } + else { + /* + * If we've not got a colon on the line, this could well + * not be a valid htpasswd file. + * We should bail at this point. + */ + apr_file_printf(errfile, "\n%s: The file %s does not appear " + "to be a valid htpasswd file.\n", + argv[0], pwfilename); + apr_file_close(fpw); + exit(ERR_INVALID); + } + if (strcmp(user, scratch) != 0) { + putline(ftemp, line); + continue; + } + else { + if (!(mask & APHTP_DELUSER)) { + /* We found the user we were looking for. + * Add him to the file. + */ + apr_file_printf(errfile, "Updating "); + putline(ftemp, record); + found++; + } + else { + /* We found the user we were looking for. + * Delete them from the file. + */ + apr_file_printf(errfile, "Deleting "); + found++; + } + } + } + apr_file_close(fpw); + } + if (!found && !(mask & APHTP_DELUSER)) { + apr_file_printf(errfile, "Adding "); + putline(ftemp, record); + } + else if (!found && (mask & APHTP_DELUSER)) { + apr_file_printf(errfile, "User %s not found\n", user); + exit(0); + } + apr_file_printf(errfile, "password for user %s\n", user); + + /* The temporary file has all the data, just copy it to the new location. + */ + if (apr_file_copy(dirname, pwfilename, APR_FILE_SOURCE_PERMS, pool) != + APR_SUCCESS) { + apr_file_printf(errfile, "%s: unable to update file %s\n", + argv[0], pwfilename); + exit(ERR_FILEPERM); + } + apr_file_close(ftemp); + return 0; +} diff --git a/rubbos/app/httpd-2.0.64/support/htpasswd.dsp b/rubbos/app/httpd-2.0.64/support/htpasswd.dsp new file mode 100644 index 00000000..15bbbdb2 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/support/htpasswd.dsp @@ -0,0 +1,123 @@ +# Microsoft Developer Studio Project File - Name="htpasswd" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=htpasswd - 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 "htpasswd.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 "htpasswd.mak" CFG="htpasswd - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "htpasswd - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "htpasswd - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "htpasswd - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "APR_DECLARE_STATIC" /D "APU_DECLARE_STATIC" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../srclib/apr/include" /I "../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "APR_DECLARE_STATIC" /D "APU_DECLARE_STATIC" /Fd"Release/htpasswd_src" /FD /c +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib advapi32.lib wsock32.lib ws2_32.lib shell32.lib /nologo /subsystem:console +# ADD LINK32 kernel32.lib advapi32.lib wsock32.lib ws2_32.lib shell32.lib /nologo /subsystem:console /debug /opt:ref + +!ELSEIF "$(CFG)" == "htpasswd - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "APR_DECLARE_STATIC" /D "APU_DECLARE_STATIC" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../srclib/apr/include" /I "../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "APR_DECLARE_STATIC" /D "APU_DECLARE_STATIC" /Fd"Debug/htpasswd_src" /FD /c +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib advapi32.lib wsock32.lib ws2_32.lib shell32.lib /nologo /subsystem:console /incremental:no /debug +# ADD LINK32 kernel32.lib advapi32.lib wsock32.lib ws2_32.lib shell32.lib /nologo /subsystem:console /incremental:no /debug + +!ENDIF + +# Begin Target + +# Name "htpasswd - Win32 Release" +# Name "htpasswd - Win32 Debug" +# Begin Source File + +SOURCE=.\htpasswd.c +# End Source File +# Begin Source File + +SOURCE=.\htpasswd.rc +# End Source File +# Begin Source File + +SOURCE=..\build\win32\win32ver.awk + +!IF "$(CFG)" == "htpasswd - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\build\win32\win32ver.awk + +".\htpasswd.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../build/win32/win32ver.awk htpasswd.exe "htpasswd Utility" ../include/ap_release.h > .\htpasswd.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "htpasswd - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\build\win32\win32ver.awk + +".\htpasswd.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../build/win32/win32ver.awk htpasswd.exe "htpasswd Utility" ../include/ap_release.h > .\htpasswd.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/support/htpasswd.lo b/rubbos/app/httpd-2.0.64/support/htpasswd.lo new file mode 100644 index 00000000..7c0845ea --- /dev/null +++ b/rubbos/app/httpd-2.0.64/support/htpasswd.lo @@ -0,0 +1,12 @@ +# htpasswd.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/htpasswd.o' + +# Name of the non-PIC object. +non_pic_object='htpasswd.o' + diff --git a/rubbos/app/httpd-2.0.64/support/htpasswd.o b/rubbos/app/httpd-2.0.64/support/htpasswd.o new file mode 100644 index 0000000000000000000000000000000000000000..da73e00294cefcef7d2016a3911b7c5e9272e96a GIT binary patch literal 60736 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/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="(cd /bottlenecks/rubbos/app/httpd-2.0.64/support; { test -z \"\${LIBRARY_PATH+set}\" || unset LIBRARY_PATH || { LIBRARY_PATH=; export LIBRARY_PATH; }; }; { test -z \"\${COMPILER_PATH+set}\" || unset COMPILER_PATH || { COMPILER_PATH=; export COMPILER_PATH; }; }; { test -z \"\${GCC_EXEC_PREFIX+set}\" || unset GCC_EXEC_PREFIX || { GCC_EXEC_PREFIX=; export GCC_EXEC_PREFIX; }; }; { test -z \"\${LD_RUN_PATH+set}\" || unset LD_RUN_PATH || { LD_RUN_PATH=; export LD_RUN_PATH; }; }; { test -z \"\${LD_LIBRARY_PATH+set}\" || unset LD_LIBRARY_PATH || { LD_LIBRARY_PATH=; export LD_LIBRARY_PATH; }; }; PATH=\"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games\"; export PATH; gcc -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE -DAP_HAVE_DESIGNATED_INITIALIZER -I/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include -I/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include -I/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib -I. -I/bottlenecks/rubbos/app/httpd-2.0.64/os/unix -I/bottlenecks/rubbos/app/httpd-2.0.64/server/mpm/worker -I/bottlenecks/rubbos/app/httpd-2.0.64/modules/http -I/bottlenecks/rubbos/app/httpd-2.0.64/modules/filters -I/bottlenecks/rubbos/app/httpd-2.0.64/modules/proxy -I/bottlenecks/rubbos/app/httpd-2.0.64/include -I/bottlenecks/rubbos/app/httpd-2.0.64/modules/generators -I/bottlenecks/rubbos/app/httpd-2.0.64/modules/dav/main -o \$progdir/\$file .libs/httxt2dbm.o -Wl,--export-dynamic -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib /bottlenecks/rubbos/app/httpd-2.0.64/srclib/pcre/.libs/libpcre.a /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/.libs/libaprutil-0.so /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/.libs/libexpat.so /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/.libs/libapr-0.so -lrt -lm -lcrypt -lnsl -lpthread -ldl -Wl,--rpath -Wl,/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/.libs -Wl,--rpath -Wl,/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/.libs -Wl,--rpath -Wl,/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/.libs -Wl,--rpath -Wl,/bottlenecks/rubbos/app/apache2/lib ) " + +# This environment variable determines our operation mode. +if test "$libtool_install_magic" = "%%%MAGIC variable%%%"; then + # install mode needs the following variable: + notinst_deplibs=' /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/libaprutil-0.la /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/libexpat.la /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/libapr-0.la' +else + # When we are sourced in execute mode, $file and $echo are already set. + if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then + echo="echo" + file="$0" + # Make sure echo works. + if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift + elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then + # Yippee, $echo works! + : + else + # Restart under the correct shell, and then maybe $echo will work. + exec /bin/bash "$0" --no-reexec ${1+"$@"} + fi + fi + + # Find the directory that this script lives in. + thisdir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "x$thisdir" = "x$file" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=`ls -ld "$file" | /bin/sed -n 's/.*-> //p'` + while test -n "$file"; do + destdir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + + # If there was a directory component, then change thisdir. + if test "x$destdir" != "x$file"; then + case "$destdir" in + [\\/]* | [A-Za-z]:[\\/]*) thisdir="$destdir" ;; + *) thisdir="$thisdir/$destdir" ;; + esac + fi + + file=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + file=`ls -ld "$thisdir/$file" | /bin/sed -n 's/.*-> //p'` + done + + # Try to get the absolute directory name. + absdir=`cd "$thisdir" && pwd` + test -n "$absdir" && thisdir="$absdir" + + program=lt-'httxt2dbm' + progdir="$thisdir/.libs" + + if test ! -f "$progdir/$program" || \ + { file=`ls -1dt "$progdir/$program" "$progdir/../$program" 2>/dev/null | /bin/sed 1q`; \ + test "X$file" != "X$progdir/$program"; }; then + + file="$$-$program" + + if test ! -d "$progdir"; then + mkdir "$progdir" + else + rm -f "$progdir/$file" + fi + + # 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 -f "$progdir/$file" + exit 1 + fi + fi + + mv -f "$progdir/$file" "$progdir/$program" 2>/dev/null || + { rm -f "$progdir/$program"; + mv -f "$progdir/$file" "$progdir/$program"; } + rm -f "$progdir/$file" + fi + + if test -f "$progdir/$program"; then + if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then + # Run the actual program with our arguments. + + exec "$progdir/$program" ${1+"$@"} + + $echo "$0: cannot exec $program $*" + exit 1 + fi + else + # The program doesn't exist. + $echo "$0: error: \`$progdir/$program' does not exist" 1>&2 + $echo "This script is just a wrapper for $program." 1>&2 + echo "See the libtool documentation for more information." 1>&2 + exit 1 + fi +fi diff --git a/rubbos/app/httpd-2.0.64/support/httxt2dbm.c b/rubbos/app/httpd-2.0.64/support/httxt2dbm.c new file mode 100644 index 00000000..ea61b39c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/support/httxt2dbm.c @@ -0,0 +1,336 @@ +/* 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. + */ + +/* + * httxt2dbm.c: simple program for converting RewriteMap text files to DBM + * Rewrite databases for the Apache HTTP server + * + */ + +#include "apr.h" +#include "apr_lib.h" +#include "apr_strings.h" +#include "apr_file_io.h" +#include "apr_file_info.h" +#include "apr_pools.h" +#include "apr_getopt.h" +#include "apu.h" +#include "apr_dbm.h" + +#if APR_HAVE_STDLIB_H +#include /* for atexit() */ +#endif + +static const char *input; +static const char *output; +static const char *format; +static const char *shortname; +static apr_file_t *errfile; +static char errbuf[120]; +static int verbose; + +/* From mod_rewrite.c */ +#ifndef REWRITE_MAX_TXT_MAP_LINE +#define REWRITE_MAX_TXT_MAP_LINE 1024 +#endif + +#define NL APR_EOL_STR + +#define AVAIL "available" +#define UNAVAIL "unavailable" + +static void usage(void) +{ + const char *have_sdbm; + const char *have_gdbm; + const char *have_ndbm; + const char *have_db; + +#if APU_HAVE_SDBM + have_sdbm = AVAIL; +#else + have_sdbm = UNAVAIL; +#endif +#if APU_HAVE_GDBM + have_gdbm = AVAIL; +#else + have_gdbm = UNAVAIL; +#endif +#if APU_HAVE_NDBM + have_ndbm = AVAIL; +#else + have_ndbm = UNAVAIL; +#endif +#if APU_HAVE_DB + have_db = AVAIL; +#else + have_db = UNAVAIL; +#endif + + apr_file_printf(errfile, + "%s -- Program to Create DBM Files for use by RewriteMap" NL + "Usage: %s [-v] [-f format] -i SOURCE_TXT -o OUTPUT_DBM" NL + NL + "Options: " NL + " -v More verbose output"NL + NL + " -i Source Text File. If '-', use stdin."NL + NL + " -o Output DBM."NL + NL + " -f DBM Format. If not specified, will use the APR Default." NL + " GDBM for GDBM files (%s)" NL + " SDBM for SDBM files (%s)" NL + " DB for berkeley DB files (%s)" NL + " NDBM for NDBM files (%s)" NL + " default for the default DBM type" NL + NL, + shortname, + shortname, + have_gdbm, + have_sdbm, + have_db, + have_ndbm); +} + + +static apr_status_t to_dbm(apr_dbm_t *dbm, apr_file_t *fp, apr_pool_t *pool) +{ + apr_status_t rv = APR_SUCCESS; + char line[REWRITE_MAX_TXT_MAP_LINE + 1]; /* +1 for \0 */ + apr_datum_t dbmkey; + apr_datum_t dbmval; + apr_pool_t* p; + + apr_pool_create(&p, pool); + + while (apr_file_gets(line, sizeof(line), fp) == APR_SUCCESS) { + char *c, *value; + + if (*line == '#' || apr_isspace(*line)) { + continue; + } + + c = line; + + while (*c && !apr_isspace(*c)) { + ++c; + } + + if (!*c) { + /* no value. solid line of data. */ + continue; + } + + dbmkey.dptr = apr_pstrmemdup(p, line, c - line); + dbmkey.dsize = (c - line); + + while (*c && apr_isspace(*c)) { + ++c; + } + + if (!*c) { + apr_pool_clear(p); + continue; + } + + value = c; + + while (*c && !apr_isspace(*c)) { + ++c; + } + + dbmval.dptr = apr_pstrmemdup(p, value, c - value); + dbmval.dsize = (c - line); + + if (verbose) { + apr_file_printf(errfile, " '%s' -> '%s'"NL, + dbmkey.dptr, dbmval.dptr); + } + + rv = apr_dbm_store(dbm, dbmkey, dbmval); + + apr_pool_clear(p); + + if (rv != APR_SUCCESS) { + break; + } + } + + return rv; +} + +int main(int argc, const char *const argv[]) +{ + apr_pool_t *pool; + apr_status_t rv = APR_SUCCESS; + apr_getopt_t *opt; + const char *optarg; + char ch; + apr_file_t *infile; + apr_dbm_t *outdbm; + + apr_initialize(); + atexit(apr_terminate); + + verbose = 0; + format = NULL; + input = NULL; + output = NULL; + + apr_pool_create(&pool, NULL); + + if (argc) { + shortname = apr_filepath_name_get(argv[0]); + } + else { + shortname = "httxt2dbm"; + } + + apr_file_open_stderr(&errfile, pool); + rv = apr_getopt_init(&opt, pool, argc, argv); + + if (rv != APR_SUCCESS) { + apr_file_printf(errfile, "Error: apr_getopt_init failed."NL NL); + return 1; + } + + if (argc <= 1) { + usage(); + return 1; + } + + while ((rv = apr_getopt(opt, "vf::i::o::", &ch, &optarg)) == APR_SUCCESS) { + switch (ch) { + case 'v': + if (verbose) { + apr_file_printf(errfile, "Error: -v can only be passed once" NL NL); + usage(); + return 1; + } + verbose = 1; + break; + case 'f': + if (format) { + apr_file_printf(errfile, "Error: -f can only be passed once" NL NL); + usage(); + return 1; + } + format = apr_pstrdup(pool, optarg); + break; + case 'i': + if (input) { + apr_file_printf(errfile, "Error: -i can only be passed once" NL NL); + usage(); + return 1; + } + input = apr_pstrdup(pool, optarg); + break; + case 'o': + if (output) { + apr_file_printf(errfile, "Error: -o can only be passed once" NL NL); + usage(); + return 1; + } + output = apr_pstrdup(pool, optarg); + break; + } + } + + if (rv != APR_EOF) { + apr_file_printf(errfile, "Error: Parsing Arguments Failed" NL NL); + usage(); + return 1; + } + + if (!input) { + apr_file_printf(errfile, "Error: No input file specified." NL NL); + usage(); + return 1; + } + + if (!output) { + apr_file_printf(errfile, "Error: No output DBM specified." NL NL); + usage(); + return 1; + } + + if (!format) { + format = "default"; + } + + if (verbose) { + apr_file_printf(errfile, "DBM Format: %s"NL, format); + } + + if (!strcmp(input, "-")) { + rv = apr_file_open_stdin(&infile, pool); + } + else { + rv = apr_file_open(&infile, input, APR_READ|APR_BUFFERED, + APR_OS_DEFAULT, pool); + } + + if (rv != APR_SUCCESS) { + apr_file_printf(errfile, + "Error: Cannot open input file '%s': (%d) %s" NL NL, + input, rv, apr_strerror(rv, errbuf, sizeof(errbuf))); + return 1; + } + + if (verbose) { + apr_file_printf(errfile, "Input File: %s"NL, input); + } + + rv = apr_dbm_open_ex(&outdbm, format, output, APR_DBM_RWCREATE, + APR_OS_DEFAULT, pool); + + if (APR_STATUS_IS_ENOTIMPL(rv)) { + apr_file_printf(errfile, + "Error: The requested DBM Format '%s' is not available." NL NL, + format); + return 1; + } + + if (rv != APR_SUCCESS) { + apr_file_printf(errfile, + "Error: Cannot open output DBM '%s': (%d) %s" NL NL, + output, rv, apr_strerror(rv, errbuf, sizeof(errbuf))); + return 1; + } + + if (verbose) { + apr_file_printf(errfile, "DBM File: %s"NL, output); + } + + rv = to_dbm(outdbm, infile, pool); + + if (rv != APR_SUCCESS) { + apr_file_printf(errfile, + "Error: Converting to DBM: (%d) %s" NL NL, + rv, apr_strerror(rv, errbuf, sizeof(errbuf))); + return 1; + } + + apr_dbm_close(outdbm); + + if (verbose) { + apr_file_printf(errfile, "Conversion Complete." NL); + } + + return 0; +} + diff --git a/rubbos/app/httpd-2.0.64/support/httxt2dbm.dsp b/rubbos/app/httpd-2.0.64/support/httxt2dbm.dsp new file mode 100644 index 00000000..53b78309 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/support/httxt2dbm.dsp @@ -0,0 +1,123 @@ +# Microsoft Developer Studio Project File - Name="httxt2dbm" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=httxt2dbm - 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 "httxt2dbm.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 "httxt2dbm.mak" CFG="httxt2dbm - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "httxt2dbm - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "httxt2dbm - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "httxt2dbm - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "APR_DECLARE_STATIC" /D "APU_DECLARE_STATIC" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../srclib/apr/include" /I "../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "APR_DECLARE_STATIC" /D "APU_DECLARE_STATIC" /Fd"Release/httxt2dbm_src" /FD /c +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib advapi32.lib wsock32.lib ws2_32.lib shell32.lib /nologo /subsystem:console +# ADD LINK32 kernel32.lib advapi32.lib wsock32.lib ws2_32.lib shell32.lib /nologo /subsystem:console /debug /opt:ref + +!ELSEIF "$(CFG)" == "httxt2dbm - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "APR_DECLARE_STATIC" /D "APU_DECLARE_STATIC" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../srclib/apr/include" /I "../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "APR_DECLARE_STATIC" /D "APU_DECLARE_STATIC" /Fd"Debug/httxt2dbm_src" /FD /c +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib advapi32.lib wsock32.lib ws2_32.lib shell32.lib /nologo /subsystem:console /incremental:no /debug +# ADD LINK32 kernel32.lib advapi32.lib wsock32.lib ws2_32.lib shell32.lib /nologo /subsystem:console /incremental:no /debug + +!ENDIF + +# Begin Target + +# Name "httxt2dbm - Win32 Release" +# Name "httxt2dbm - Win32 Debug" +# Begin Source File + +SOURCE=.\httxt2dbm.c +# End Source File +# Begin Source File + +SOURCE=.\httxt2dbm.rc +# End Source File +# Begin Source File + +SOURCE=..\build\win32\win32ver.awk + +!IF "$(CFG)" == "httxt2dbm - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\build\win32\win32ver.awk + +".\httxt2dbm.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../build/win32/win32ver.awk httxt2dbm.exe "httxt2dbm Utility" ../include/ap_release.h > .\httxt2dbm.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "httxt2dbm - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\build\win32\win32ver.awk + +".\httxt2dbm.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../build/win32/win32ver.awk httxt2dbm.exe "httxt2dbm Utility" ../include/ap_release.h > .\httxt2dbm.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/support/httxt2dbm.lo b/rubbos/app/httpd-2.0.64/support/httxt2dbm.lo new file mode 100644 index 00000000..7b4f8e07 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/support/httxt2dbm.lo @@ -0,0 +1,12 @@ +# httxt2dbm.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/httxt2dbm.o' + +# Name of the non-PIC object. +non_pic_object='httxt2dbm.o' + diff --git a/rubbos/app/httpd-2.0.64/support/httxt2dbm.o b/rubbos/app/httpd-2.0.64/support/httxt2dbm.o new file mode 100644 index 0000000000000000000000000000000000000000..1e12f6c8d14ccea66cbbb2fc933fb51f2ba6bcb5 GIT binary patch literal 28616 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/support/list_hooks.pl b/rubbos/app/httpd-2.0.64/support/list_hooks.pl new file mode 100755 index 00000000..cb863db7 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/support/list_hooks.pl @@ -0,0 +1,101 @@ +#!/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 Carp; + +my $path=shift || '.'; + +findInDir($path); + +foreach my $hook (sort keys %::Hooks) { + my $h=$::Hooks{$hook}; + for my $x (qw(declared implemented type args)) { + print "$hook datum '$x' missing\n" if !exists $h->{$x}; + } + print "$hook\n"; + print " declared in $h->{declared}\n" if defined $h->{declared}; + print " implemented in $h->{implemented}\n" if defined $h->{implemented}; + print " type is $h->{type}\n" if defined $h->{type}; + print " $h->{ret} $hook($h->{args})\n" if defined $h->{args}; + print "\n"; +} + +sub findInDir { + my $path=shift; + + local(*D); + opendir(D,$path) || croak "Can't open $path: $!"; + while(my $f=readdir D) { + next if $f=~/^\./; + my $file="$path/$f"; + + if(-d $file) { + findInDir($file); + next; + } + next if $file !~ /\.[ch]$/; + + scanFile($file); + } + closedir D; +} + +sub scanFile { + my $file=shift; + +# print "scanning $file\n"; + + open(F,$file) || croak "Can't open $file: $!"; + while() { + next if /\#define/; + next if /\@deffunc/; + if(/AP_DECLARE_HOOK\((.*)\)/) { + my $def=$1; + my($ret,$name,$args)=$def=~/([^,\s]+)\s*,\s*([^,\s]+)\s*,\s*\((.*)\)/; + croak "Don't understand $def in $file" if !defined $args; +# print "found $ret $name($args) in $file\n"; + + croak "$name declared twice! ($_)" + if exists $::Hooks{$name}->{declared}; + $::Hooks{$name}->{declared}=$file; + $::Hooks{$name}->{ret}=$ret; + $::Hooks{$name}->{args}=$args; + } elsif(/AP_DECLARE_HOOK\((\s*[^,\s]+)\s*,\s*([^,\s]+)/) { +# really we should swallow subsequent lines to get the arguments... + my $name=$2; + my $ret=$1; + croak "$name declared twice! ($_)" + if exists $::Hooks{$name}->{declared}; + $::Hooks{$name}->{declared}=$file; + $::Hooks{$name}->{ret}=$ret; + $::Hooks{$name}->{args}='???'; + } + if(/AP_IMPLEMENT_HOOK_()(VOID)\(([^,\s]+)/ + || /AP_IMPLEMENT(_OPTIONAL|)_HOOK_(.*?)\([^,]+?\s*,\s*([^,\s]+)/) { + my($type,$name)=($1 ? "OPTIONAL $2" : $2,$3); + +# print "found $name $type in $file\n"; + + croak "$name implemented twice ($::Hooks{$name}->{implemented} and $file) ($_)" + if exists $::Hooks{$name}->{implemented}; + $::Hooks{$name}->{implemented}=$file; + $::Hooks{$name}->{type}=$type; + } + } +} diff --git a/rubbos/app/httpd-2.0.64/support/log_server_status b/rubbos/app/httpd-2.0.64/support/log_server_status new file mode 100644 index 00000000..e8320f64 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/support/log_server_status @@ -0,0 +1,78 @@ +#!/usr/bin/perl +# +# 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. +# +# +# Log Server Status +# Mark J Cox, UK Web Ltd 1996, mark@ukweb.com +# +# This script is designed to be run at a frequent interval by something +# like cron. It connects to the server and downloads the status +# information. It reformats the information to a single line and logs +# it to a file. Make sure the directory $wherelog is writable by the +# user who runs this script. +# +require 'sys/socket.ph'; + +$wherelog = "/var/log/graph/"; # Logs will be like "/var/log/graph/19960312" +$server = "localhost"; # Name of server, could be "www.foo.com" +$port = "80"; # Port on server +$request = "/status/?auto"; # Request to send + +sub tcp_connect +{ + local($host,$port) =@_; + $sockaddr='S n a4 x8'; + chop($hostname=`hostname`); + $port=(getservbyname($port, 'tcp'))[2] unless $port =~ /^\d+$/; + $me=pack($sockaddr,&AF_INET,0,(gethostbyname($hostname))[4]); + $them=pack($sockaddr,&AF_INET,$port,(gethostbyname($host))[4]); + socket(S,&PF_INET,&SOCK_STREAM,(getprotobyname('tcp'))[2]) || + die "socket: $!"; + bind(S,$me) || return "bind: $!"; + connect(S,$them) || return "connect: $!"; + select(S); + $| = 1; + select(stdout); + return ""; +} + +### Main + +{ + $year=`date +%y`; + chomp($year); + $year += ($year < 70) ? 2000 : 1900; + $date = $year . `date +%m%d:%H%M%S`; + chomp($date); + ($day,$time)=split(/:/,$date); + $res=&tcp_connect($server,$port); + open(OUT,">>$wherelog$day"); + if ($res) { + print OUT "$time:-1:-1:-1:-1:$res\n"; + exit 1; + } + print S "GET $request\n"; + while () { + $requests=$1 if ( m|^BusyServers:\ (\S+)|); + $idle=$1 if ( m|^IdleServers:\ (\S+)|); + $number=$1 if ( m|sses:\ (\S+)|); + $cpu=$1 if (m|^CPULoad:\ (\S+)|); + } + print OUT "$time:$requests:$idle:$number:$cpu\n"; +} + + diff --git a/rubbos/app/httpd-2.0.64/support/log_server_status.in b/rubbos/app/httpd-2.0.64/support/log_server_status.in new file mode 100644 index 00000000..2268df29 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/support/log_server_status.in @@ -0,0 +1,78 @@ +#!@perlbin@ +# +# 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. +# +# +# Log Server Status +# Mark J Cox, UK Web Ltd 1996, mark@ukweb.com +# +# This script is designed to be run at a frequent interval by something +# like cron. It connects to the server and downloads the status +# information. It reformats the information to a single line and logs +# it to a file. Make sure the directory $wherelog is writable by the +# user who runs this script. +# +require 'sys/socket.ph'; + +$wherelog = "/var/log/graph/"; # Logs will be like "/var/log/graph/19960312" +$server = "localhost"; # Name of server, could be "www.foo.com" +$port = "80"; # Port on server +$request = "/status/?auto"; # Request to send + +sub tcp_connect +{ + local($host,$port) =@_; + $sockaddr='S n a4 x8'; + chop($hostname=`hostname`); + $port=(getservbyname($port, 'tcp'))[2] unless $port =~ /^\d+$/; + $me=pack($sockaddr,&AF_INET,0,(gethostbyname($hostname))[4]); + $them=pack($sockaddr,&AF_INET,$port,(gethostbyname($host))[4]); + socket(S,&PF_INET,&SOCK_STREAM,(getprotobyname('tcp'))[2]) || + die "socket: $!"; + bind(S,$me) || return "bind: $!"; + connect(S,$them) || return "connect: $!"; + select(S); + $| = 1; + select(stdout); + return ""; +} + +### Main + +{ + $year=`date +%y`; + chomp($year); + $year += ($year < 70) ? 2000 : 1900; + $date = $year . `date +%m%d:%H%M%S`; + chomp($date); + ($day,$time)=split(/:/,$date); + $res=&tcp_connect($server,$port); + open(OUT,">>$wherelog$day"); + if ($res) { + print OUT "$time:-1:-1:-1:-1:$res\n"; + exit 1; + } + print S "GET $request\n"; + while () { + $requests=$1 if ( m|^BusyServers:\ (\S+)|); + $idle=$1 if ( m|^IdleServers:\ (\S+)|); + $number=$1 if ( m|sses:\ (\S+)|); + $cpu=$1 if (m|^CPULoad:\ (\S+)|); + } + print OUT "$time:$requests:$idle:$number:$cpu\n"; +} + + diff --git a/rubbos/app/httpd-2.0.64/support/logresolve b/rubbos/app/httpd-2.0.64/support/logresolve new file mode 100755 index 00000000..5f4eaa20 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/support/logresolve @@ -0,0 +1,131 @@ +#! /bin/bash + +# logresolve - temporary wrapper script for .libs/logresolve +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# The logresolve program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='/bin/sed -e 1s/^X//' +sed_quote_subst='s/\([\\`\\"$\\\\]\)/\\\1/g' + +# Be Bourne compatible (taken from Autoconf:_AS_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="(cd /bottlenecks/rubbos/app/httpd-2.0.64/support; { test -z \"\${LIBRARY_PATH+set}\" || unset LIBRARY_PATH || { LIBRARY_PATH=; export LIBRARY_PATH; }; }; { test -z \"\${COMPILER_PATH+set}\" || unset COMPILER_PATH || { COMPILER_PATH=; export COMPILER_PATH; }; }; { test -z \"\${GCC_EXEC_PREFIX+set}\" || unset GCC_EXEC_PREFIX || { GCC_EXEC_PREFIX=; export GCC_EXEC_PREFIX; }; }; { test -z \"\${LD_RUN_PATH+set}\" || unset LD_RUN_PATH || { LD_RUN_PATH=; export LD_RUN_PATH; }; }; { test -z \"\${LD_LIBRARY_PATH+set}\" || unset LD_LIBRARY_PATH || { LD_LIBRARY_PATH=; export LD_LIBRARY_PATH; }; }; PATH=\"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games\"; export PATH; gcc -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE -DAP_HAVE_DESIGNATED_INITIALIZER -I/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include -I/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include -I/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib -I. -I/bottlenecks/rubbos/app/httpd-2.0.64/os/unix -I/bottlenecks/rubbos/app/httpd-2.0.64/server/mpm/worker -I/bottlenecks/rubbos/app/httpd-2.0.64/modules/http -I/bottlenecks/rubbos/app/httpd-2.0.64/modules/filters -I/bottlenecks/rubbos/app/httpd-2.0.64/modules/proxy -I/bottlenecks/rubbos/app/httpd-2.0.64/include -I/bottlenecks/rubbos/app/httpd-2.0.64/modules/generators -I/bottlenecks/rubbos/app/httpd-2.0.64/modules/dav/main -o \$progdir/\$file .libs/logresolve.o -Wl,--export-dynamic -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib /bottlenecks/rubbos/app/httpd-2.0.64/srclib/pcre/.libs/libpcre.a /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/.libs/libaprutil-0.so /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/.libs/libexpat.so /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/.libs/libapr-0.so -lrt -lm -lcrypt -lnsl -lpthread -ldl -Wl,--rpath -Wl,/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/.libs -Wl,--rpath -Wl,/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/.libs -Wl,--rpath -Wl,/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/.libs -Wl,--rpath -Wl,/bottlenecks/rubbos/app/apache2/lib ) " + +# This environment variable determines our operation mode. +if test "$libtool_install_magic" = "%%%MAGIC variable%%%"; then + # install mode needs the following variable: + notinst_deplibs=' /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/libaprutil-0.la /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/libexpat.la /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/libapr-0.la' +else + # When we are sourced in execute mode, $file and $echo are already set. + if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then + echo="echo" + file="$0" + # Make sure echo works. + if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift + elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then + # Yippee, $echo works! + : + else + # Restart under the correct shell, and then maybe $echo will work. + exec /bin/bash "$0" --no-reexec ${1+"$@"} + fi + fi + + # Find the directory that this script lives in. + thisdir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "x$thisdir" = "x$file" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=`ls -ld "$file" | /bin/sed -n 's/.*-> //p'` + while test -n "$file"; do + destdir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + + # If there was a directory component, then change thisdir. + if test "x$destdir" != "x$file"; then + case "$destdir" in + [\\/]* | [A-Za-z]:[\\/]*) thisdir="$destdir" ;; + *) thisdir="$thisdir/$destdir" ;; + esac + fi + + file=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + file=`ls -ld "$thisdir/$file" | /bin/sed -n 's/.*-> //p'` + done + + # Try to get the absolute directory name. + absdir=`cd "$thisdir" && pwd` + test -n "$absdir" && thisdir="$absdir" + + program=lt-'logresolve' + progdir="$thisdir/.libs" + + if test ! -f "$progdir/$program" || \ + { file=`ls -1dt "$progdir/$program" "$progdir/../$program" 2>/dev/null | /bin/sed 1q`; \ + test "X$file" != "X$progdir/$program"; }; then + + file="$$-$program" + + if test ! -d "$progdir"; then + mkdir "$progdir" + else + rm -f "$progdir/$file" + fi + + # 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 -f "$progdir/$file" + exit 1 + fi + fi + + mv -f "$progdir/$file" "$progdir/$program" 2>/dev/null || + { rm -f "$progdir/$program"; + mv -f "$progdir/$file" "$progdir/$program"; } + rm -f "$progdir/$file" + fi + + if test -f "$progdir/$program"; then + if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then + # Run the actual program with our arguments. + + exec "$progdir/$program" ${1+"$@"} + + $echo "$0: cannot exec $program $*" + exit 1 + fi + else + # The program doesn't exist. + $echo "$0: error: \`$progdir/$program' does not exist" 1>&2 + $echo "This script is just a wrapper for $program." 1>&2 + echo "See the libtool documentation for more information." 1>&2 + exit 1 + fi +fi diff --git a/rubbos/app/httpd-2.0.64/support/logresolve.c b/rubbos/app/httpd-2.0.64/support/logresolve.c new file mode 100644 index 00000000..c606039b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/support/logresolve.c @@ -0,0 +1,400 @@ +/* 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. + */ + +/* + * logresolve 1.1 + * + * Tom Rathborne - tomr@uunet.ca - http://www.uunet.ca/~tomr/ + * UUNET Canada, April 16, 1995 + * + * Rewritten by David Robinson. (drtr ast.cam.ac.uk) + * + * Usage: logresolve [-s filename] [-c] < access_log > new_log + * + * Arguments: + * -s filename name of a file to record statistics + * -c check the DNS for a matching A record for the host. + * + * Notes: + * + * To generate meaningful statistics from an HTTPD log file, it's good + * to have the domain name of each machine that accessed your site, but + * doing this on the fly can slow HTTPD down. + * + * Compiling NCSA HTTPD with the -DMINIMAL_DNS flag turns IP#->hostname + * resolution off. Before running your stats program, just run your log + * file through this program (logresolve) and all of your IP numbers will + * be resolved into hostnames (where possible). + * + * logresolve takes an HTTPD access log (in the COMMON log file format, + * or any other format that has the IP number/domain name as the first + * field for that matter), and outputs the same file with all of the + * domain names looked up. Where no domain name can be found, the IP + * number is left in. + * + * 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. + * + * The -c option causes logresolve to apply the same check as httpd + * compiled with -DMAXIMUM_DNS; 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. + */ + +#include "apr_lib.h" +#if APR_HAVE_STDIO_H +#include +#endif +#if APR_HAVE_STDLIB_H +#include +#endif +#if APR_HAVE_CTYPE_H +#include +#endif +#if APR_HAVE_NETDB_H +#include +#endif +#if APR_HAVE_NETINET_IN_H +#include +#endif +#if APR_HAVE_STRING_H +#include +#endif +#if APR_HAVE_SYS_SOCKET_H +#include +#endif +#if APR_HAVE_ARPA_INET_H +#include +#endif + +static void cgethost(struct in_addr ipnum, char *string, int check); +static int get_line(char *s, int n); +static void stats(FILE *output); + +#ifdef BEOS +#define NO_ADDRESS NO_DATA +#endif + + +/* maximum line length */ +#ifndef MAXLINE +#define MAXLINE 1024 +#endif + +/* maximum length of a domain name */ +#ifndef MAXDNAME +#define MAXDNAME 256 +#endif + +/* number of buckets in cache hash apr_table_t */ +#define BUCKETS 256 + +#if !APR_HAVE_STRDUP +char *strdup (const char *str) +{ + char *dup; + + if (!(dup = (char *) malloc(strlen(str) + 1))) + return NULL; + dup = strcpy(dup, str); + + return dup; +} +#endif + +/* + * struct nsrec - record of nameservice for cache linked list + * + * ipnum - IP number hostname - hostname noname - nonzero if IP number has no + * hostname, i.e. hostname=IP number + */ + +struct nsrec { + struct in_addr ipnum; + char *hostname; + int noname; + struct nsrec *next; +} *nscache[BUCKETS]; + +/* + * statistics - obvious + */ + +#ifndef h_errno +#ifdef __CYGWIN__ +extern __declspec(dllimport) int h_errno; +#else +extern int h_errno; /* some machines don't have this in their headers */ +#endif +#endif + +/* largest value for h_errno */ + +#define MAX_ERR (NO_ADDRESS) +#define UNKNOWN_ERR (MAX_ERR+1) +#define NO_REVERSE (MAX_ERR+2) + +static int cachehits = 0; +static int cachesize = 0; +static int entries = 0; +static int resolves = 0; +static int withname = 0; +static int errors[MAX_ERR + 3]; + +/* + * cgethost - gets hostname by IP address, caching, and adding unresolvable + * IP numbers with their IP number as hostname, setting noname flag + */ + +static void cgethost (struct in_addr ipnum, char *string, int check) +{ + struct nsrec **current, *new; + struct hostent *hostdata; + char *name; + + current = &nscache[((ipnum.s_addr + (ipnum.s_addr >> 8) + + (ipnum.s_addr >> 16) + (ipnum.s_addr >> 24)) % BUCKETS)]; + + while (*current != NULL && ipnum.s_addr != (*current)->ipnum.s_addr) + current = &(*current)->next; + + if (*current == NULL) { + cachesize++; + new = (struct nsrec *) malloc(sizeof(struct nsrec)); + if (new == NULL) { + perror("malloc"); + fprintf(stderr, "Insufficient memory\n"); + exit(1); + } + *current = new; + new->next = NULL; + + new->ipnum = ipnum; + + hostdata = gethostbyaddr((const char *) &ipnum, sizeof(struct in_addr), + AF_INET); + if (hostdata == NULL) { + if (h_errno > MAX_ERR) + errors[UNKNOWN_ERR]++; + else + errors[h_errno]++; + new->noname = h_errno; + name = strdup(inet_ntoa(ipnum)); + } + else { + new->noname = 0; + name = strdup(hostdata->h_name); + if (check) { + if (name == NULL) { + perror("strdup"); + fprintf(stderr, "Insufficient memory\n"); + exit(1); + } + hostdata = gethostbyname(name); + if (hostdata != NULL) { + char **hptr; + + for (hptr = hostdata->h_addr_list; *hptr != NULL; hptr++) + if (((struct in_addr *) (*hptr))->s_addr == ipnum.s_addr) + break; + if (*hptr == NULL) + hostdata = NULL; + } + if (hostdata == NULL) { + fprintf(stderr, "Bad host: %s != %s\n", name, + inet_ntoa(ipnum)); + new->noname = NO_REVERSE; + free(name); + name = strdup(inet_ntoa(ipnum)); + errors[NO_REVERSE]++; + } + } + } + new->hostname = name; + if (new->hostname == NULL) { + perror("strdup"); + fprintf(stderr, "Insufficient memory\n"); + exit(1); + } + } + else + cachehits++; + + /* size of string == MAXDNAME +1 */ + strncpy(string, (*current)->hostname, MAXDNAME); + string[MAXDNAME] = '\0'; +} + +/* + * prints various statistics to output + */ + +static void stats (FILE *output) +{ + int i; + char *ipstring; + struct nsrec *current; + char *errstring[MAX_ERR + 3]; + + for (i = 0; i < MAX_ERR + 3; i++) + errstring[i] = "Unknown error"; + errstring[HOST_NOT_FOUND] = "Host not found"; + errstring[TRY_AGAIN] = "Try again"; + errstring[NO_RECOVERY] = "Non recoverable error"; + errstring[NO_DATA] = "No data record"; + errstring[NO_ADDRESS] = "No address"; + errstring[NO_REVERSE] = "No reverse entry"; + + fprintf(output, "logresolve Statistics:\n"); + + fprintf(output, "Entries: %d\n", entries); + fprintf(output, " With name : %d\n", withname); + fprintf(output, " Resolves : %d\n", resolves); + if (errors[HOST_NOT_FOUND]) + fprintf(output, " - Not found : %d\n", errors[HOST_NOT_FOUND]); + if (errors[TRY_AGAIN]) + fprintf(output, " - Try again : %d\n", errors[TRY_AGAIN]); + if (errors[NO_DATA]) + fprintf(output, " - No data : %d\n", errors[NO_DATA]); + if (errors[NO_ADDRESS]) + fprintf(output, " - No address: %d\n", errors[NO_ADDRESS]); + if (errors[NO_REVERSE]) + fprintf(output, " - No reverse: %d\n", errors[NO_REVERSE]); + fprintf(output, "Cache hits : %d\n", cachehits); + fprintf(output, "Cache size : %d\n", cachesize); + fprintf(output, "Cache buckets : IP number * hostname\n"); + + for (i = 0; i < BUCKETS; i++) + for (current = nscache[i]; current != NULL; current = current->next) { + ipstring = inet_ntoa(current->ipnum); + if (current->noname == 0) + fprintf(output, " %3d %15s - %s\n", i, ipstring, + current->hostname); + else { + if (current->noname > MAX_ERR + 2) + fprintf(output, " %3d %15s : Unknown error\n", i, + ipstring); + else + fprintf(output, " %3d %15s : %s\n", i, ipstring, + errstring[current->noname]); + } + } +} + + +/* + * gets a line from stdin + */ + +static int get_line (char *s, int n) +{ + char *cp; + + if (!fgets(s, n, stdin)) + return (0); + cp = strchr(s, '\n'); + if (cp) + *cp = '\0'; + return (1); +} + +int main (int argc, char *argv[]) +{ + struct in_addr ipnum; + char *bar, hoststring[MAXDNAME + 1], line[MAXLINE], *statfile; + int i, check; + +#if defined(WIN32) || defined(NETWARE) + /* If we apr'ify this code, apr_pool_create/apr_pool_destroy + * should perform the WSAStartup/WSACleanup for us. + */ + WSADATA wsaData; + WSAStartup(MAKEWORD(2, 0), &wsaData); +#endif + + check = 0; + statfile = NULL; + for (i = 1; i < argc; i++) { + if (strcmp(argv[i], "-c") == 0) + check = 1; + else if (strcmp(argv[i], "-s") == 0) { + if (i == argc - 1) { + fprintf(stderr, "logresolve: missing filename to -s\n"); + exit(1); + } + i++; + statfile = argv[i]; + } + else { + fprintf(stderr, "Usage: logresolve [-s statfile] [-c] < input > output\n"); + exit(0); + } + } + + for (i = 0; i < BUCKETS; i++) + nscache[i] = NULL; + for (i = 0; i < MAX_ERR + 2; i++) + errors[i] = 0; + + while (get_line(line, MAXLINE)) { + if (line[0] == '\0') + continue; + entries++; + if (!apr_isdigit(line[0])) { /* short cut */ + puts(line); + withname++; + continue; + } + bar = strchr(line, ' '); + if (bar != NULL) + *bar = '\0'; + ipnum.s_addr = inet_addr(line); + if (ipnum.s_addr == 0xffffffffu) { + if (bar != NULL) + *bar = ' '; + puts(line); + withname++; + continue; + } + + resolves++; + + cgethost(ipnum, hoststring, check); + if (bar != NULL) + printf("%s %s\n", hoststring, bar + 1); + else + puts(hoststring); + } + +#if defined(WIN32) || defined(NETWARE) + WSACleanup(); +#endif + + if (statfile != NULL) { + FILE *fp; + fp = fopen(statfile, "w"); + if (fp == NULL) { + fprintf(stderr, "logresolve: could not open statistics file '%s'\n" + ,statfile); + exit(1); + } + stats(fp); + fclose(fp); + } + + return (0); +} diff --git a/rubbos/app/httpd-2.0.64/support/logresolve.dsp b/rubbos/app/httpd-2.0.64/support/logresolve.dsp new file mode 100644 index 00000000..d1fbcb6a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/support/logresolve.dsp @@ -0,0 +1,123 @@ +# Microsoft Developer Studio Project File - Name="logresolve" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=logresolve - 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 "logresolve.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 "logresolve.mak" CFG="logresolve - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "logresolve - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "logresolve - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "logresolve - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "APR_DECLARE_STATIC" /D "APU_DECLARE_STATIC" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../srclib/apr/include" /I "../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "APR_DECLARE_STATIC" /D "APU_DECLARE_STATIC" /Fd"Release/logresolve_src" /FD /c +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib advapi32.lib wsock32.lib ws2_32.lib shell32.lib /nologo /subsystem:console +# ADD LINK32 kernel32.lib advapi32.lib wsock32.lib ws2_32.lib shell32.lib /nologo /subsystem:console /debug /opt:ref + +!ELSEIF "$(CFG)" == "logresolve - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "APR_DECLARE_STATIC" /D "APU_DECLARE_STATIC" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../srclib/apr/include" /I "../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "APR_DECLARE_STATIC" /D "APU_DECLARE_STATIC" /Fd"Debug/logresolve_src" /FD /c +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib advapi32.lib wsock32.lib ws2_32.lib shell32.lib /nologo /subsystem:console /incremental:no /debug +# ADD LINK32 kernel32.lib advapi32.lib wsock32.lib ws2_32.lib shell32.lib /nologo /subsystem:console /incremental:no /debug + +!ENDIF + +# Begin Target + +# Name "logresolve - Win32 Release" +# Name "logresolve - Win32 Debug" +# Begin Source File + +SOURCE=.\logresolve.c +# End Source File +# Begin Source File + +SOURCE=.\logresolve.rc +# End Source File +# Begin Source File + +SOURCE=..\build\win32\win32ver.awk + +!IF "$(CFG)" == "logresolve - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\build\win32\win32ver.awk + +".\logresolve.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../build/win32/win32ver.awk logresolve.exe "logresolve Utility" ../include/ap_release.h > .\logresolve.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "logresolve - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\build\win32\win32ver.awk + +".\logresolve.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../build/win32/win32ver.awk logresolve.exe "logresolve Utility" ../include/ap_release.h > .\logresolve.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/support/logresolve.lo b/rubbos/app/httpd-2.0.64/support/logresolve.lo new file mode 100644 index 00000000..20028ace --- /dev/null +++ b/rubbos/app/httpd-2.0.64/support/logresolve.lo @@ -0,0 +1,12 @@ +# logresolve.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/logresolve.o' + +# Name of the non-PIC object. +non_pic_object='logresolve.o' + diff --git a/rubbos/app/httpd-2.0.64/support/logresolve.o b/rubbos/app/httpd-2.0.64/support/logresolve.o new file mode 100644 index 0000000000000000000000000000000000000000..a948c1d0c3a81ce49796ae17cd1153f6a6addcb7 GIT binary patch literal 46184 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 VBp%@S-r;nm2l7$b;cBj){|1Arshj`+ literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/support/logresolve.pl b/rubbos/app/httpd-2.0.64/support/logresolve.pl new file mode 100644 index 00000000..bd517b20 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/support/logresolve.pl @@ -0,0 +1,225 @@ +#!/usr/bin/perl +# +# 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. +# +# +# logresolve.pl +# +# v 1.2 by robh @ imdb.com +# +# usage: logresolve.pl outfile +# +# input = Apache/NCSA/.. logfile with IP numbers at start of lines +# output = same logfile with IP addresses resolved to hostnames where +# name lookups succeeded. +# +# this differs from the C based 'logresolve' in that this script +# spawns a number ($CHILDREN) of subprocesses to resolve addresses +# concurrently and sets a short timeout ($TIMEOUT) for each lookup in +# order to keep things moving quickly. +# +# the parent process handles caching of IP->hostnames using a Perl hash +# it also avoids sending the same IP to multiple child processes to be +# resolved multiple times concurrently. +# +# Depending on the settings of $CHILDREN and $TIMEOUT you should see +# significant reductions in the overall time taken to resolve your +# logfiles. With $CHILDREN=40 and $TIMEOUT=5 I've seen 200,000 - 300,000 +# logfile lines processed per hour compared to ~45,000 per hour +# with 'logresolve'. +# +# I haven't yet seen any noticable reduction in the percentage of IPs +# that fail to get resolved. Your mileage will no doubt vary. 5s is long +# enough to wait IMO. +# +# Known to work with FreeBSD 2.2 +# Known to have problems with Solaris +# +# 980417 - use 'sockaddr_un' for bind/connect to make the script work +# with linux. Fix from Luuk de Boer + +require 5.004; + +$|=1; + +use FileHandle; +use Socket; + +use strict; +no strict 'refs'; + +use vars qw($PROTOCOL); +$PROTOCOL = 0; + +my $CHILDREN = 40; +my $TIMEOUT = 5; + +my $filename; +my %hash = (); +my $parent = $$; + +my @children = (); +for (my $child = 1; $child <=$CHILDREN; $child++) { + my $f = fork(); + if (!$f) { + $filename = "./.socket.$parent.$child"; + if (-e $filename) { unlink($filename) || warn "$filename .. $!\n";} + &child($child); + exit(0); + } + push(@children, $f); +} + +&parent; +&cleanup; + +## remove all temporary files before shutting down +sub cleanup { + # die kiddies, die + kill(15, @children); + for (my $child = 1; $child <=$CHILDREN; $child++) { + if (-e "./.socket.$parent.$child") { + unlink("./.socket.$parent.$child") + || warn ".socket.$parent.$child $!"; + } + } +} + +sub parent { + # Trap some possible signals to trigger temp file cleanup + $SIG{'KILL'} = $SIG{'INT'} = $SIG{'PIPE'} = \&cleanup; + + my %CHILDSOCK; + my $filename; + + ## fork child processes. Each child will create a socket connection + ## to this parent and use an unique temp filename to do so. + for (my $child = 1; $child <=$CHILDREN; $child++) { + $CHILDSOCK{$child}= FileHandle->new; + + if (!socket($CHILDSOCK{$child}, AF_UNIX, SOCK_STREAM, $PROTOCOL)) { + warn "parent socket to child failed $!"; + } + $filename = "./.socket.$parent.$child"; + my $response; + do { + $response = connect($CHILDSOCK{$child}, sockaddr_un($filename)); + if ($response != 1) { + sleep(1); + } + } while ($response != 1); + $CHILDSOCK{$child}->autoflush; + } + ## All child processes should now be ready or at worst warming up + + my (@buffer, $child, $ip, $rest, $hostname, $response); + ## read the logfile lines from STDIN + while() { + @buffer = (); # empty the logfile line buffer array. + $child = 1; # children are numbered 1..N, start with #1 + + # while we have a child to talk to and data to give it.. + do { + push(@buffer, $_); # buffer the line + ($ip, $rest) = split(/ /, $_, 2); # separate IP form rest + + unless ($hash{$ip}) { # resolve if unseen IP + $CHILDSOCK{$child}->print("$ip\n"); # pass IP to next child + $hash{$ip} = $ip; # don't look it up again. + $child++; + } + } while (($child < ($CHILDREN-1)) and ($_ = )); + + ## now poll each child for a response + while (--$child > 0) { + $response = $CHILDSOCK{$child}->getline; + chomp($response); + # child sends us back both the IP and HOSTNAME, no need for us + # to remember what child received any given IP, and no worries + # what order we talk to the children + ($ip, $hostname) = split(/\|/, $response, 2); + $hash{$ip} = $hostname; + } + + # resolve all the logfiles lines held in the log buffer array.. + for (my $line = 0; $line <=$#buffer; $line++) { + # get next buffered line + ($ip, $rest) = split(/ /, $buffer[$line], 2); + # separate IP from rest and replace with cached hostname + printf STDOUT ("%s %s", $hash{$ip}, $rest); + } + } +} + +######################################## + +sub child { + # arg = numeric ID - how the parent refers to me + my $me = shift; + + # add trap for alarm signals. + $SIG{'ALRM'} = sub { die "alarmed"; }; + + # create a socket to communicate with parent + socket(INBOUND, AF_UNIX, SOCK_STREAM, $PROTOCOL) + || die "Error with Socket: !$\n"; + $filename = "./.socket.$parent.$me"; + bind(INBOUND, sockaddr_un($filename)) + || die "Error Binding $filename: $!\n"; + listen(INBOUND, 5) || die "Error Listening: $!\n"; + + my ($ip, $send_back); + my $talk = FileHandle->new; + + # accept a connection from the parent process. We only ever have + # have one connection where we exchange 1 line of info with the + # parent.. 1 line in (IP address), 1 line out (IP + hostname). + accept($talk, INBOUND) || die "Error Accepting: $!\n"; + # disable I/O buffering just in case + $talk->autoflush; + # while the parent keeps sending data, we keep responding.. + while(($ip = $talk->getline)) { + chomp($ip); + # resolve the IP if time permits and send back what we found.. + $send_back = sprintf("%s|%s", $ip, &nslookup($ip)); + $talk->print($send_back."\n"); + } +} + +# perform a time restricted hostname lookup. +sub nslookup { + # get the IP as an arg + my $ip = shift; + my $hostname = undef; + + # do the hostname lookup inside an eval. The eval will use the + # already configured SIGnal handler and drop out of the {} block + # regardless of whether the alarm occured or not. + eval { + alarm($TIMEOUT); + $hostname = gethostbyaddr(gethostbyname($ip), AF_INET); + alarm(0); + }; + if ($@ =~ /alarm/) { + # useful for debugging perhaps.. + # print "alarming, isn't it? ($ip)"; + } + + # return the hostname or the IP address itself if there is no hostname + $hostname ne "" ? $hostname : $ip; +} + + diff --git a/rubbos/app/httpd-2.0.64/support/logresolve.pl.in b/rubbos/app/httpd-2.0.64/support/logresolve.pl.in new file mode 100644 index 00000000..879d2972 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/support/logresolve.pl.in @@ -0,0 +1,225 @@ +#!@perlbin@ +# +# 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. +# +# +# logresolve.pl +# +# v 1.2 by robh @ imdb.com +# +# usage: logresolve.pl outfile +# +# input = Apache/NCSA/.. logfile with IP numbers at start of lines +# output = same logfile with IP addresses resolved to hostnames where +# name lookups succeeded. +# +# this differs from the C based 'logresolve' in that this script +# spawns a number ($CHILDREN) of subprocesses to resolve addresses +# concurrently and sets a short timeout ($TIMEOUT) for each lookup in +# order to keep things moving quickly. +# +# the parent process handles caching of IP->hostnames using a Perl hash +# it also avoids sending the same IP to multiple child processes to be +# resolved multiple times concurrently. +# +# Depending on the settings of $CHILDREN and $TIMEOUT you should see +# significant reductions in the overall time taken to resolve your +# logfiles. With $CHILDREN=40 and $TIMEOUT=5 I've seen 200,000 - 300,000 +# logfile lines processed per hour compared to ~45,000 per hour +# with 'logresolve'. +# +# I haven't yet seen any noticable reduction in the percentage of IPs +# that fail to get resolved. Your mileage will no doubt vary. 5s is long +# enough to wait IMO. +# +# Known to work with FreeBSD 2.2 +# Known to have problems with Solaris +# +# 980417 - use 'sockaddr_un' for bind/connect to make the script work +# with linux. Fix from Luuk de Boer + +require 5.004; + +$|=1; + +use FileHandle; +use Socket; + +use strict; +no strict 'refs'; + +use vars qw($PROTOCOL); +$PROTOCOL = 0; + +my $CHILDREN = 40; +my $TIMEOUT = 5; + +my $filename; +my %hash = (); +my $parent = $$; + +my @children = (); +for (my $child = 1; $child <=$CHILDREN; $child++) { + my $f = fork(); + if (!$f) { + $filename = "./.socket.$parent.$child"; + if (-e $filename) { unlink($filename) || warn "$filename .. $!\n";} + &child($child); + exit(0); + } + push(@children, $f); +} + +&parent; +&cleanup; + +## remove all temporary files before shutting down +sub cleanup { + # die kiddies, die + kill(15, @children); + for (my $child = 1; $child <=$CHILDREN; $child++) { + if (-e "./.socket.$parent.$child") { + unlink("./.socket.$parent.$child") + || warn ".socket.$parent.$child $!"; + } + } +} + +sub parent { + # Trap some possible signals to trigger temp file cleanup + $SIG{'KILL'} = $SIG{'INT'} = $SIG{'PIPE'} = \&cleanup; + + my %CHILDSOCK; + my $filename; + + ## fork child processes. Each child will create a socket connection + ## to this parent and use an unique temp filename to do so. + for (my $child = 1; $child <=$CHILDREN; $child++) { + $CHILDSOCK{$child}= FileHandle->new; + + if (!socket($CHILDSOCK{$child}, AF_UNIX, SOCK_STREAM, $PROTOCOL)) { + warn "parent socket to child failed $!"; + } + $filename = "./.socket.$parent.$child"; + my $response; + do { + $response = connect($CHILDSOCK{$child}, sockaddr_un($filename)); + if ($response != 1) { + sleep(1); + } + } while ($response != 1); + $CHILDSOCK{$child}->autoflush; + } + ## All child processes should now be ready or at worst warming up + + my (@buffer, $child, $ip, $rest, $hostname, $response); + ## read the logfile lines from STDIN + while() { + @buffer = (); # empty the logfile line buffer array. + $child = 1; # children are numbered 1..N, start with #1 + + # while we have a child to talk to and data to give it.. + do { + push(@buffer, $_); # buffer the line + ($ip, $rest) = split(/ /, $_, 2); # separate IP form rest + + unless ($hash{$ip}) { # resolve if unseen IP + $CHILDSOCK{$child}->print("$ip\n"); # pass IP to next child + $hash{$ip} = $ip; # don't look it up again. + $child++; + } + } while (($child < ($CHILDREN-1)) and ($_ = )); + + ## now poll each child for a response + while (--$child > 0) { + $response = $CHILDSOCK{$child}->getline; + chomp($response); + # child sends us back both the IP and HOSTNAME, no need for us + # to remember what child received any given IP, and no worries + # what order we talk to the children + ($ip, $hostname) = split(/\|/, $response, 2); + $hash{$ip} = $hostname; + } + + # resolve all the logfiles lines held in the log buffer array.. + for (my $line = 0; $line <=$#buffer; $line++) { + # get next buffered line + ($ip, $rest) = split(/ /, $buffer[$line], 2); + # separate IP from rest and replace with cached hostname + printf STDOUT ("%s %s", $hash{$ip}, $rest); + } + } +} + +######################################## + +sub child { + # arg = numeric ID - how the parent refers to me + my $me = shift; + + # add trap for alarm signals. + $SIG{'ALRM'} = sub { die "alarmed"; }; + + # create a socket to communicate with parent + socket(INBOUND, AF_UNIX, SOCK_STREAM, $PROTOCOL) + || die "Error with Socket: !$\n"; + $filename = "./.socket.$parent.$me"; + bind(INBOUND, sockaddr_un($filename)) + || die "Error Binding $filename: $!\n"; + listen(INBOUND, 5) || die "Error Listening: $!\n"; + + my ($ip, $send_back); + my $talk = FileHandle->new; + + # accept a connection from the parent process. We only ever have + # have one connection where we exchange 1 line of info with the + # parent.. 1 line in (IP address), 1 line out (IP + hostname). + accept($talk, INBOUND) || die "Error Accepting: $!\n"; + # disable I/O buffering just in case + $talk->autoflush; + # while the parent keeps sending data, we keep responding.. + while(($ip = $talk->getline)) { + chomp($ip); + # resolve the IP if time permits and send back what we found.. + $send_back = sprintf("%s|%s", $ip, &nslookup($ip)); + $talk->print($send_back."\n"); + } +} + +# perform a time restricted hostname lookup. +sub nslookup { + # get the IP as an arg + my $ip = shift; + my $hostname = undef; + + # do the hostname lookup inside an eval. The eval will use the + # already configured SIGnal handler and drop out of the {} block + # regardless of whether the alarm occured or not. + eval { + alarm($TIMEOUT); + $hostname = gethostbyaddr(gethostbyname($ip), AF_INET); + alarm(0); + }; + if ($@ =~ /alarm/) { + # useful for debugging perhaps.. + # print "alarming, isn't it? ($ip)"; + } + + # return the hostname or the IP address itself if there is no hostname + $hostname ne "" ? $hostname : $ip; +} + + diff --git a/rubbos/app/httpd-2.0.64/support/phf_abuse_log.cgi b/rubbos/app/httpd-2.0.64/support/phf_abuse_log.cgi new file mode 100644 index 00000000..57e03332 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/support/phf_abuse_log.cgi @@ -0,0 +1,38 @@ +#!/usr/bin/perl +# +# 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. +# +# +# This script is used to detect people trying to abuse the security hole which +# existed in A CGI script direstributed with Apache 1.0.3 and earlier versions. +# You can redirect them to here using the "" suggestion +# in httpd.conf. +# +# The format logged to is +# "[date] remote_addr remote_host [date] referrer user_agent". + +$LOG = "/var/log/phf_log"; + +require "ctime.pl"; +$when = &ctime(time); +$when =~ s/\n//go; +$ENV{HTTP_USER_AGENT} .= " via $ENV{HTTP_VIA}" if($ENV{HTTP_VIA}); + +open(LOG, ">>$LOG") || die "boo hoo, phf_log $!"; +print LOG "[$when] $ENV{REMOTE_ADDR} $ENV{REMOTE_HOST} $ENV{$HTTP_REFERER} $ENV{HTTP_USER_AGENT}\n"; +close(LOG); + +print "Content-type: text/html\r\n\r\nSmile, you're on Candid Camera.\n"; diff --git a/rubbos/app/httpd-2.0.64/support/phf_abuse_log.cgi.in b/rubbos/app/httpd-2.0.64/support/phf_abuse_log.cgi.in new file mode 100644 index 00000000..39900bf5 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/support/phf_abuse_log.cgi.in @@ -0,0 +1,38 @@ +#!@perlbin@ +# +# 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. +# +# +# This script is used to detect people trying to abuse the security hole which +# existed in A CGI script direstributed with Apache 1.0.3 and earlier versions. +# You can redirect them to here using the "" suggestion +# in httpd.conf. +# +# The format logged to is +# "[date] remote_addr remote_host [date] referrer user_agent". + +$LOG = "/var/log/phf_log"; + +require "ctime.pl"; +$when = &ctime(time); +$when =~ s/\n//go; +$ENV{HTTP_USER_AGENT} .= " via $ENV{HTTP_VIA}" if($ENV{HTTP_VIA}); + +open(LOG, ">>$LOG") || die "boo hoo, phf_log $!"; +print LOG "[$when] $ENV{REMOTE_ADDR} $ENV{REMOTE_HOST} $ENV{$HTTP_REFERER} $ENV{HTTP_USER_AGENT}\n"; +close(LOG); + +print "Content-type: text/html\r\n\r\nSmile, you're on Candid Camera.\n"; diff --git a/rubbos/app/httpd-2.0.64/support/rotatelogs b/rubbos/app/httpd-2.0.64/support/rotatelogs new file mode 100755 index 00000000..f2d38d2b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/support/rotatelogs @@ -0,0 +1,131 @@ +#! /bin/bash + +# rotatelogs - temporary wrapper script for .libs/rotatelogs +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# The rotatelogs program cannot be directly executed until all the libtool +# libraries that it depends on are installed. +# +# This wrapper script should never be moved out of the build directory. +# If it is, it will not operate correctly. + +# Sed substitution that helps us do robust quoting. It backslashifies +# metacharacters that are still active within double-quoted strings. +Xsed='/bin/sed -e 1s/^X//' +sed_quote_subst='s/\([\\`\\"$\\\\]\)/\\\1/g' + +# Be Bourne compatible (taken from Autoconf:_AS_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="(cd /bottlenecks/rubbos/app/httpd-2.0.64/support; { test -z \"\${LIBRARY_PATH+set}\" || unset LIBRARY_PATH || { LIBRARY_PATH=; export LIBRARY_PATH; }; }; { test -z \"\${COMPILER_PATH+set}\" || unset COMPILER_PATH || { COMPILER_PATH=; export COMPILER_PATH; }; }; { test -z \"\${GCC_EXEC_PREFIX+set}\" || unset GCC_EXEC_PREFIX || { GCC_EXEC_PREFIX=; export GCC_EXEC_PREFIX; }; }; { test -z \"\${LD_RUN_PATH+set}\" || unset LD_RUN_PATH || { LD_RUN_PATH=; export LD_RUN_PATH; }; }; { test -z \"\${LD_LIBRARY_PATH+set}\" || unset LD_LIBRARY_PATH || { LD_LIBRARY_PATH=; export LD_LIBRARY_PATH; }; }; PATH=\"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games\"; export PATH; gcc -g -O2 -pthread -D_REENTRANT -D_GNU_SOURCE -DAP_HAVE_DESIGNATED_INITIALIZER -I/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include -I/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include -I/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib -I. -I/bottlenecks/rubbos/app/httpd-2.0.64/os/unix -I/bottlenecks/rubbos/app/httpd-2.0.64/server/mpm/worker -I/bottlenecks/rubbos/app/httpd-2.0.64/modules/http -I/bottlenecks/rubbos/app/httpd-2.0.64/modules/filters -I/bottlenecks/rubbos/app/httpd-2.0.64/modules/proxy -I/bottlenecks/rubbos/app/httpd-2.0.64/include -I/bottlenecks/rubbos/app/httpd-2.0.64/modules/generators -I/bottlenecks/rubbos/app/httpd-2.0.64/modules/dav/main -o \$progdir/\$file .libs/rotatelogs.o -Wl,--export-dynamic -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib /bottlenecks/rubbos/app/httpd-2.0.64/srclib/pcre/.libs/libpcre.a /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/.libs/libaprutil-0.so /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/.libs/libexpat.so /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/.libs/libapr-0.so -lrt -lm -lcrypt -lnsl -lpthread -ldl -Wl,--rpath -Wl,/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/.libs -Wl,--rpath -Wl,/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/.libs -Wl,--rpath -Wl,/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/.libs -Wl,--rpath -Wl,/bottlenecks/rubbos/app/apache2/lib ) " + +# This environment variable determines our operation mode. +if test "$libtool_install_magic" = "%%%MAGIC variable%%%"; then + # install mode needs the following variable: + notinst_deplibs=' /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/libaprutil-0.la /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/libexpat.la /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/libapr-0.la' +else + # When we are sourced in execute mode, $file and $echo are already set. + if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then + echo="echo" + file="$0" + # Make sure echo works. + if test "X$1" = X--no-reexec; then + # Discard the --no-reexec flag, and continue. + shift + elif test "X`($echo '\t') 2>/dev/null`" = 'X\t'; then + # Yippee, $echo works! + : + else + # Restart under the correct shell, and then maybe $echo will work. + exec /bin/bash "$0" --no-reexec ${1+"$@"} + fi + fi + + # Find the directory that this script lives in. + thisdir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + test "x$thisdir" = "x$file" && thisdir=. + + # Follow symbolic links until we get to the real thisdir. + file=`ls -ld "$file" | /bin/sed -n 's/.*-> //p'` + while test -n "$file"; do + destdir=`$echo "X$file" | $Xsed -e 's%/[^/]*$%%'` + + # If there was a directory component, then change thisdir. + if test "x$destdir" != "x$file"; then + case "$destdir" in + [\\/]* | [A-Za-z]:[\\/]*) thisdir="$destdir" ;; + *) thisdir="$thisdir/$destdir" ;; + esac + fi + + file=`$echo "X$file" | $Xsed -e 's%^.*/%%'` + file=`ls -ld "$thisdir/$file" | /bin/sed -n 's/.*-> //p'` + done + + # Try to get the absolute directory name. + absdir=`cd "$thisdir" && pwd` + test -n "$absdir" && thisdir="$absdir" + + program=lt-'rotatelogs' + progdir="$thisdir/.libs" + + if test ! -f "$progdir/$program" || \ + { file=`ls -1dt "$progdir/$program" "$progdir/../$program" 2>/dev/null | /bin/sed 1q`; \ + test "X$file" != "X$progdir/$program"; }; then + + file="$$-$program" + + if test ! -d "$progdir"; then + mkdir "$progdir" + else + rm -f "$progdir/$file" + fi + + # 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 -f "$progdir/$file" + exit 1 + fi + fi + + mv -f "$progdir/$file" "$progdir/$program" 2>/dev/null || + { rm -f "$progdir/$program"; + mv -f "$progdir/$file" "$progdir/$program"; } + rm -f "$progdir/$file" + fi + + if test -f "$progdir/$program"; then + if test "$libtool_execute_magic" != "%%%MAGIC variable%%%"; then + # Run the actual program with our arguments. + + exec "$progdir/$program" ${1+"$@"} + + $echo "$0: cannot exec $program $*" + exit 1 + fi + else + # The program doesn't exist. + $echo "$0: error: \`$progdir/$program' does not exist" 1>&2 + $echo "This script is just a wrapper for $program." 1>&2 + echo "See the libtool documentation for more information." 1>&2 + exit 1 + fi +fi diff --git a/rubbos/app/httpd-2.0.64/support/rotatelogs.c b/rubbos/app/httpd-2.0.64/support/rotatelogs.c new file mode 100644 index 00000000..e7b3a0c5 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/support/rotatelogs.c @@ -0,0 +1,262 @@ +/* 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. + */ + +/* + * Simple program to rotate Apache logs without having to kill the server. + * + * Contributed by Ben Laurie + * + * 12 Mar 1996 + * + * Ported to APR by Mladen Turk + * + * 23 Sep 2001 + * + * -l option added 2004-06-11 + * + * -l causes the use of local time rather than GMT as the base for the + * interval. NB: Using -l in an environment which changes the GMT offset + * (such as for BST or DST) can lead to unpredictable results! + * + */ + + +#include "apr.h" +#include "apr_lib.h" +#include "apr_strings.h" +#include "apr_errno.h" +#include "apr_file_io.h" +#include "apr_file_info.h" +#include "apr_general.h" +#include "apr_time.h" + +#if APR_HAVE_STDLIB_H +#include +#endif +#if APR_HAVE_STRING_H +#include +#endif +#if APR_HAVE_STRINGS_H +#include +#endif + +#define BUFSIZE 65536 +#define ERRMSGSZ 82 + +#ifndef MAX_PATH +#define MAX_PATH 1024 +#endif + +int main (int argc, const char * const argv[]) +{ + char buf[BUFSIZE], buf2[MAX_PATH], errbuf[ERRMSGSZ]; + int tLogEnd = 0, tRotation = 0, utc_offset = 0; + unsigned int sRotation = 0; + int nMessCount = 0; + apr_size_t nRead, nWrite; + int use_strftime = 0; + int use_localtime = 0; + int now = 0; + const char *szLogRoot; + apr_file_t *f_stdin, *nLogFD = NULL, *nLogFDprev = NULL; + apr_pool_t *pool; + char *ptr = NULL; + int argBase = 0; + int argFile = 1; + int argIntv = 2; + int argOffset = 3; + + apr_app_initialize(&argc, &argv, NULL); + atexit(apr_terminate); + + apr_pool_create(&pool, NULL); + if ((argc > 2) && (strcmp(argv[1], "-l") == 0)) { + argBase++; + argFile += argBase; + argIntv += argBase; + argOffset += argBase; + use_localtime = 1; + } + if (argc < (argBase + 3) || argc > (argBase + 4)) { + fprintf(stderr, + "Usage: %s [-l] " + "[offset minutes from UTC] or \n\n", + argv[0]); +#ifdef OS2 + fprintf(stderr, + "Add this:\n\nTransferLog \"|%s.exe /some/where 86400\"\n\n", + argv[0]); +#else + fprintf(stderr, + "Add this:\n\nTransferLog \"|%s /some/where 86400\"\n\n", + argv[0]); + fprintf(stderr, + "or \n\nTransferLog \"|%s /some/where 5M\"\n\n", argv[0]); +#endif + fprintf(stderr, + "to httpd.conf. The generated name will be /some/where.nnnn " + "where nnnn is the\nsystem time at which the log nominally " + "starts (N.B. if using a rotation time,\nthe time will always " + "be a multiple of the rotation time, so you can synchronize\n" + "cron scripts with it). At the end of each rotation time or " + "when the file size\nis reached a new log is started.\n"); + exit(1); + } + + szLogRoot = argv[argFile]; + + ptr = strchr(argv[argIntv], 'M'); + if (ptr) { + if (*(ptr+1) == '\0') { + sRotation = atoi(argv[argIntv]) * 1048576; + } + if (sRotation == 0) { + fprintf(stderr, "Invalid rotation size parameter\n"); + exit(1); + } + } + else { + if (argc >= (argBase + 4)) { + utc_offset = atoi(argv[argOffset]) * 60; + } + tRotation = atoi(argv[argIntv]); + if (tRotation <= 0) { + fprintf(stderr, "Rotation time must be > 0\n"); + exit(6); + } + } + + use_strftime = (strchr(szLogRoot, '%') != NULL); + if (apr_file_open_stdin(&f_stdin, pool) != APR_SUCCESS) { + fprintf(stderr, "Unable to open stdin\n"); + exit(1); + } + + for (;;) { + nRead = sizeof(buf); + if (apr_file_read(f_stdin, buf, &nRead) != APR_SUCCESS) { + exit(3); + } + if (tRotation) { + /* + * Check for our UTC offset every time through the loop, since + * it might change if there's a switch between standard and + * daylight savings time. + */ + if (use_localtime) { + apr_time_exp_t lt; + apr_time_exp_lt(<, apr_time_now()); + utc_offset = lt.tm_gmtoff; + } + now = (int)(apr_time_now() / APR_USEC_PER_SEC) + utc_offset; + if (nLogFD != NULL && now >= tLogEnd) { + nLogFDprev = nLogFD; + nLogFD = NULL; + } + } + else if (sRotation) { + apr_finfo_t finfo; + apr_off_t current_size = -1; + + if ((nLogFD != NULL) && + (apr_file_info_get(&finfo, APR_FINFO_SIZE, nLogFD) == APR_SUCCESS)) { + current_size = finfo.size; + } + + if (current_size > sRotation) { + nLogFDprev = nLogFD; + nLogFD = NULL; + } + } + else { + fprintf(stderr, "No rotation time or size specified\n"); + exit(2); + } + + if (nLogFD == NULL) { + int tLogStart; + + if (tRotation) { + tLogStart = (now / tRotation) * tRotation; + } + else { + tLogStart = (int)apr_time_sec(apr_time_now()); + } + + if (use_strftime) { + apr_time_t tNow = apr_time_from_sec(tLogStart); + apr_time_exp_t e; + apr_size_t rs; + + apr_time_exp_gmt(&e, tNow); + apr_strftime(buf2, &rs, sizeof(buf2), szLogRoot, &e); + } + else { + sprintf(buf2, "%s.%010d", szLogRoot, tLogStart); + } + tLogEnd = tLogStart + tRotation; + apr_file_open(&nLogFD, buf2, + APR_APPEND | APR_WRITE | APR_CREATE | APR_LARGEFILE, + APR_OS_DEFAULT, pool); + if (nLogFD == NULL) { + /* Uh-oh. Failed to open the new log file. Try to clear + * the previous log file, note the lost log entries, + * and keep on truckin'. */ + if (nLogFDprev == NULL) { + fprintf(stderr, "1 Previous file handle doesn't exists %s\n", buf2); + exit(2); + } + else { + nLogFD = nLogFDprev; + sprintf(errbuf, + "Resetting log file due to error opening " + "new log file. %10d messages lost.\n", + nMessCount); + nWrite = strlen(errbuf); + apr_file_trunc(nLogFD, 0); + if (apr_file_write(nLogFD, errbuf, &nWrite) != APR_SUCCESS) { + fprintf(stderr, "Error writing to the file %s\n", buf2); + exit(2); + } + } + } + else if (nLogFDprev) { + apr_file_close(nLogFDprev); + } + nMessCount = 0; + } + nWrite = nRead; + apr_file_write(nLogFD, buf, &nWrite); + if (nWrite != nRead) { + nMessCount++; + sprintf(errbuf, + "Error writing to log file. " + "%10d messages lost.\n", + nMessCount); + nWrite = strlen(errbuf); + apr_file_trunc(nLogFD, 0); + if (apr_file_write(nLogFD, errbuf, &nWrite) != APR_SUCCESS) { + fprintf(stderr, "Error writing to the file %s\n", buf2); + exit(2); + } + } + else { + nMessCount++; + } + } + /* Of course we never, but prevent compiler warnings */ + return 0; +} diff --git a/rubbos/app/httpd-2.0.64/support/rotatelogs.dsp b/rubbos/app/httpd-2.0.64/support/rotatelogs.dsp new file mode 100644 index 00000000..7b351121 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/support/rotatelogs.dsp @@ -0,0 +1,123 @@ +# Microsoft Developer Studio Project File - Name="rotatelogs" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=rotatelogs - 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 "rotatelogs.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 "rotatelogs.mak" CFG="rotatelogs - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "rotatelogs - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "rotatelogs - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "rotatelogs - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "APR_DECLARE_STATIC" /D "APU_DECLARE_STATIC" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../srclib/apr/include" /I "../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "APR_DECLARE_STATIC" /D "APU_DECLARE_STATIC" /Fd"Release/rotatelogs_src" /FD /c +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib advapi32.lib wsock32.lib ws2_32.lib shell32.lib /nologo /subsystem:console +# ADD LINK32 kernel32.lib advapi32.lib wsock32.lib ws2_32.lib shell32.lib /nologo /subsystem:console /debug /opt:ref + +!ELSEIF "$(CFG)" == "rotatelogs - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "APR_DECLARE_STATIC" /D "APU_DECLARE_STATIC" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../srclib/apr/include" /I "../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "APR_DECLARE_STATIC" /D "APU_DECLARE_STATIC" /Fd"Debug/rotatelogs_src" /FD /c +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib advapi32.lib wsock32.lib ws2_32.lib shell32.lib /nologo /subsystem:console /incremental:no /debug +# ADD LINK32 kernel32.lib advapi32.lib wsock32.lib ws2_32.lib shell32.lib /nologo /subsystem:console /incremental:no /debug + +!ENDIF + +# Begin Target + +# Name "rotatelogs - Win32 Release" +# Name "rotatelogs - Win32 Debug" +# Begin Source File + +SOURCE=.\rotatelogs.c +# End Source File +# Begin Source File + +SOURCE=.\rotatelogs.rc +# End Source File +# Begin Source File + +SOURCE=..\build\win32\win32ver.awk + +!IF "$(CFG)" == "rotatelogs - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\build\win32\win32ver.awk + +".\rotatelogs.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../build/win32/win32ver.awk rotatelogs.exe "rotatelogs Utility" ../include/ap_release.h > .\rotatelogs.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "rotatelogs - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\build\win32\win32ver.awk + +".\rotatelogs.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../build/win32/win32ver.awk rotatelogs.exe "rotatelogs Utility" ../include/ap_release.h > .\rotatelogs.rc + +# End Custom Build + +!ENDIF + +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/support/rotatelogs.lo b/rubbos/app/httpd-2.0.64/support/rotatelogs.lo new file mode 100644 index 00000000..de1f5ca6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/support/rotatelogs.lo @@ -0,0 +1,12 @@ +# rotatelogs.lo - a libtool object file +# Generated by ltmain.sh - GNU libtool 1.5.26 (1.1220.2.493 2008/02/01 16:58:18) +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# Name of the PIC object. +pic_object='.libs/rotatelogs.o' + +# Name of the non-PIC object. +non_pic_object='rotatelogs.o' + diff --git a/rubbos/app/httpd-2.0.64/support/rotatelogs.o b/rubbos/app/httpd-2.0.64/support/rotatelogs.o new file mode 100644 index 0000000000000000000000000000000000000000..7ae2ef96267bdf190ae51ea10e8569252254ee3a GIT binary patch literal 34816 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 XEadsRoxlIWY@ELw{1m}u+2;QbEA9Ls literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/support/split-logfile b/rubbos/app/httpd-2.0.64/support/split-logfile new file mode 100644 index 00000000..e67f1df4 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/support/split-logfile @@ -0,0 +1,67 @@ +#!/usr/bin/perl +# +# 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. +# +# +# This script will take a combined Web server access +# log file and break its contents into separate files. +# It assumes that the first field of each line is the +# virtual host identity (put there by "%v"), and that +# the logfiles should be named that+".log" in the current +# directory. +# +# The combined log file is read from stdin. Records read +# will be appended to any existing log files. +# +%is_open = (); + +while ($log_line = ) { + # + # Get the first token from the log record; it's the + # identity of the virtual host to which the record + # applies. + # + ($vhost) = split (/\s/, $log_line); + # + # Normalize the virtual host name to all lowercase. + # If it's blank, the request was handled by the default + # server, so supply a default name. This shouldn't + # happen, but caution rocks. + # + $vhost = lc ($vhost) or "access"; + # + # if the vhost contains a "/" or "\", it is illegal so just use + # the default log to avoid any security issues due if it is interprted + # as a directory separator. + if ($vhost =~ m#[/\\]#) { $vhost = "access" } + # + # If the log file for this virtual host isn't opened + # yet, do it now. + # + if (! $is_open{$vhost}) { + open $vhost, ">>${vhost}.log" + or die ("Can't open ${vhost}.log"); + $is_open{$vhost} = 1; + } + # + # Strip off the first token (which may be null in the + # case of the default server), and write the edited + # record to the current log file. + # + $log_line =~ s/^\S*\s+//; + printf $vhost "%s", $log_line; +} +exit 0; diff --git a/rubbos/app/httpd-2.0.64/support/split-logfile.in b/rubbos/app/httpd-2.0.64/support/split-logfile.in new file mode 100644 index 00000000..061162e8 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/support/split-logfile.in @@ -0,0 +1,67 @@ +#!@perlbin@ +# +# 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. +# +# +# This script will take a combined Web server access +# log file and break its contents into separate files. +# It assumes that the first field of each line is the +# virtual host identity (put there by "%v"), and that +# the logfiles should be named that+".log" in the current +# directory. +# +# The combined log file is read from stdin. Records read +# will be appended to any existing log files. +# +%is_open = (); + +while ($log_line = ) { + # + # Get the first token from the log record; it's the + # identity of the virtual host to which the record + # applies. + # + ($vhost) = split (/\s/, $log_line); + # + # Normalize the virtual host name to all lowercase. + # If it's blank, the request was handled by the default + # server, so supply a default name. This shouldn't + # happen, but caution rocks. + # + $vhost = lc ($vhost) or "access"; + # + # if the vhost contains a "/" or "\", it is illegal so just use + # the default log to avoid any security issues due if it is interprted + # as a directory separator. + if ($vhost =~ m#[/\\]#) { $vhost = "access" } + # + # If the log file for this virtual host isn't opened + # yet, do it now. + # + if (! $is_open{$vhost}) { + open $vhost, ">>${vhost}.log" + or die ("Can't open ${vhost}.log"); + $is_open{$vhost} = 1; + } + # + # Strip off the first token (which may be null in the + # case of the default server), and write the edited + # record to the current log file. + # + $log_line =~ s/^\S*\s+//; + printf $vhost "%s", $log_line; +} +exit 0; diff --git a/rubbos/app/httpd-2.0.64/support/suexec.c b/rubbos/app/httpd-2.0.64/support/suexec.c new file mode 100644 index 00000000..06e55c4d --- /dev/null +++ b/rubbos/app/httpd-2.0.64/support/suexec.c @@ -0,0 +1,619 @@ +/* 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. + */ + +/* + * suexec.c -- "Wrapper" support program for suEXEC behaviour for Apache + * + *********************************************************************** + * + * NOTE! : DO NOT edit this code!!! Unless you know what you are doing, + * editing this code might open up your system in unexpected + * ways to would-be crackers. Every precaution has been taken + * to make this code as safe as possible; alter it at your own + * risk. + * + *********************************************************************** + * + * + */ + +#include "apr.h" +#include "ap_config.h" +#include "suexec.h" + +#include +#include +#include +#include +#include +#if APR_HAVE_UNISTD_H +#include +#endif + +#include +#include +#include + +#ifdef HAVE_PWD_H +#include +#endif + +#ifdef HAVE_GRP_H +#include +#endif + +/* + *********************************************************************** + * There is no initgroups() in QNX, so I believe this is safe :-) + * Use cc -osuexec -3 -O -mf -DQNX suexec.c to compile. + * + * May 17, 1997. + * Igor N. Kovalenko -- infoh@mail.wplus.net + *********************************************************************** + */ + +#if defined(NEED_INITGROUPS) +int initgroups(const char *name, gid_t basegid) +{ + /* QNX and MPE do not appear to support supplementary groups. */ + return 0; +} +#endif + +#if defined(SUNOS4) +extern char *sys_errlist[]; +#define strerror(x) sys_errlist[(x)] +#endif + +#if defined(PATH_MAX) +#define AP_MAXPATH PATH_MAX +#elif defined(MAXPATHLEN) +#define AP_MAXPATH MAXPATHLEN +#else +#define AP_MAXPATH 8192 +#endif + +#define AP_ENVBUF 256 + +extern char **environ; +static FILE *log = NULL; + +char *safe_env_lst[] = +{ + /* variable name starts with */ + "HTTP_", + "SSL_", + + /* variable name is */ + "AUTH_TYPE=", + "CONTENT_LENGTH=", + "CONTENT_TYPE=", + "DATE_GMT=", + "DATE_LOCAL=", + "DOCUMENT_NAME=", + "DOCUMENT_PATH_INFO=", + "DOCUMENT_ROOT=", + "DOCUMENT_URI=", + "FILEPATH_INFO=", + "GATEWAY_INTERFACE=", + "HTTPS=", + "LAST_MODIFIED=", + "PATH_INFO=", + "PATH_TRANSLATED=", + "QUERY_STRING=", + "QUERY_STRING_UNESCAPED=", + "REMOTE_ADDR=", + "REMOTE_HOST=", + "REMOTE_IDENT=", + "REMOTE_PORT=", + "REMOTE_USER=", + "REDIRECT_QUERY_STRING=", + "REDIRECT_REMOTE_USER=", + "REDIRECT_STATUS=", + "REDIRECT_URL=", + "REQUEST_METHOD=", + "REQUEST_URI=", + "SCRIPT_FILENAME=", + "SCRIPT_NAME=", + "SCRIPT_URI=", + "SCRIPT_URL=", + "SERVER_ADMIN=", + "SERVER_NAME=", + "SERVER_ADDR=", + "SERVER_PORT=", + "SERVER_PROTOCOL=", + "SERVER_SIGNATURE=", + "SERVER_SOFTWARE=", + "UNIQUE_ID=", + "USER_NAME=", + "TZ=", + NULL +}; + + +static void err_output(const char *fmt, va_list ap) +{ +#ifdef AP_LOG_EXEC + time_t timevar; + struct tm *lt; + + if (!log) { + if ((log = fopen(AP_LOG_EXEC, "a")) == NULL) { + fprintf(stderr, "failed to open log file\n"); + perror("fopen"); + exit(1); + } + } + + time(&timevar); + lt = localtime(&timevar); + + fprintf(log, "[%d-%.2d-%.2d %.2d:%.2d:%.2d]: ", + lt->tm_year + 1900, lt->tm_mon + 1, lt->tm_mday, + lt->tm_hour, lt->tm_min, lt->tm_sec); + + vfprintf(log, fmt, ap); + + fflush(log); +#endif /* AP_LOG_EXEC */ + return; +} + +static void log_err(const char *fmt,...) +{ +#ifdef AP_LOG_EXEC + va_list ap; + + va_start(ap, fmt); + err_output(fmt, ap); + va_end(ap); +#endif /* AP_LOG_EXEC */ + return; +} + +static void clean_env(void) +{ + char pathbuf[512]; + char **cleanenv; + char **ep; + int cidx = 0; + int idx; + + /* While cleaning the environment, the environment should be clean. + * (e.g. malloc() may get the name of a file for writing debugging info. + * Bad news if MALLOC_DEBUG_FILE is set to /etc/passwd. Sprintf() may be + * susceptible to bad locale settings....) + * (from PR 2790) + */ + char **envp = environ; + char *empty_ptr = NULL; + + environ = &empty_ptr; /* VERY safe environment */ + + if ((cleanenv = (char **) calloc(AP_ENVBUF, sizeof(char *))) == NULL) { + log_err("failed to malloc memory for environment\n"); + exit(120); + } + + sprintf(pathbuf, "PATH=%s", AP_SAFE_PATH); + cleanenv[cidx] = strdup(pathbuf); + cidx++; + + for (ep = envp; *ep && cidx < AP_ENVBUF-1; ep++) { + for (idx = 0; safe_env_lst[idx]; idx++) { + if (!strncmp(*ep, safe_env_lst[idx], + strlen(safe_env_lst[idx]))) { + cleanenv[cidx] = *ep; + cidx++; + break; + } + } + } + + cleanenv[cidx] = NULL; + + environ = cleanenv; +} + +int main(int argc, char *argv[]) +{ + int userdir = 0; /* ~userdir flag */ + uid_t uid; /* user information */ + gid_t gid; /* target group placeholder */ + char *target_uname; /* target user name */ + char *target_gname; /* target group name */ + char *target_homedir; /* target home directory */ + char *actual_uname; /* actual user name */ + char *actual_gname; /* actual group name */ + char *prog; /* name of this program */ + char *cmd; /* command to be executed */ + char cwd[AP_MAXPATH]; /* current working directory */ + char dwd[AP_MAXPATH]; /* docroot working directory */ + struct passwd *pw; /* password entry holder */ + struct group *gr; /* group entry holder */ + struct stat dir_info; /* directory info holder */ + struct stat prg_info; /* program info holder */ + + /* + * Start with a "clean" environment + */ + clean_env(); + + prog = argv[0]; + /* + * Check existence/validity of the UID of the user + * running this program. Error out if invalid. + */ + uid = getuid(); + if ((pw = getpwuid(uid)) == NULL) { + log_err("crit: invalid uid: (%ld)\n", uid); + exit(102); + } + /* + * See if this is a 'how were you compiled' request, and + * comply if so. + */ + if ((argc > 1) + && (! strcmp(argv[1], "-V")) + && ((uid == 0) +#ifdef _OSD_POSIX + /* User name comparisons are case insensitive on BS2000/OSD */ + || (! strcasecmp(AP_HTTPD_USER, pw->pw_name))) +#else /* _OSD_POSIX */ + || (! strcmp(AP_HTTPD_USER, pw->pw_name))) +#endif /* _OSD_POSIX */ + ) { +#ifdef AP_DOC_ROOT + fprintf(stderr, " -D AP_DOC_ROOT=\"%s\"\n", AP_DOC_ROOT); +#endif +#ifdef AP_GID_MIN + fprintf(stderr, " -D AP_GID_MIN=%d\n", AP_GID_MIN); +#endif +#ifdef AP_HTTPD_USER + fprintf(stderr, " -D AP_HTTPD_USER=\"%s\"\n", AP_HTTPD_USER); +#endif +#ifdef AP_LOG_EXEC + fprintf(stderr, " -D AP_LOG_EXEC=\"%s\"\n", AP_LOG_EXEC); +#endif +#ifdef AP_SAFE_PATH + fprintf(stderr, " -D AP_SAFE_PATH=\"%s\"\n", AP_SAFE_PATH); +#endif +#ifdef AP_SUEXEC_UMASK + fprintf(stderr, " -D AP_SUEXEC_UMASK=%03o\n", AP_SUEXEC_UMASK); +#endif +#ifdef AP_UID_MIN + fprintf(stderr, " -D AP_UID_MIN=%d\n", AP_UID_MIN); +#endif +#ifdef AP_USERDIR_SUFFIX + fprintf(stderr, " -D AP_USERDIR_SUFFIX=\"%s\"\n", AP_USERDIR_SUFFIX); +#endif + exit(0); + } + /* + * If there are a proper number of arguments, set + * all of them to variables. Otherwise, error out. + */ + if (argc < 4) { + log_err("too few arguments\n"); + exit(101); + } + target_uname = argv[1]; + target_gname = argv[2]; + cmd = argv[3]; + + /* + * Check to see if the user running this program + * is the user allowed to do so as defined in + * suexec.h. If not the allowed user, error out. + */ +#ifdef _OSD_POSIX + /* User name comparisons are case insensitive on BS2000/OSD */ + if (strcasecmp(AP_HTTPD_USER, pw->pw_name)) { + log_err("user mismatch (%s instead of %s)\n", pw->pw_name, AP_HTTPD_USER); + exit(103); + } +#else /*_OSD_POSIX*/ + if (strcmp(AP_HTTPD_USER, pw->pw_name)) { + log_err("user mismatch (%s instead of %s)\n", pw->pw_name, AP_HTTPD_USER); + exit(103); + } +#endif /*_OSD_POSIX*/ + + /* + * Check for a leading '/' (absolute path) in the command to be executed, + * or attempts to back up out of the current directory, + * to protect against attacks. If any are + * found, error out. Naughty naughty crackers. + */ + if ((cmd[0] == '/') || (!strncmp(cmd, "../", 3)) + || (strstr(cmd, "/../") != NULL)) { + log_err("invalid command (%s)\n", cmd); + exit(104); + } + + /* + * Check to see if this is a ~userdir request. If + * so, set the flag, and remove the '~' from the + * target username. + */ + if (!strncmp("~", target_uname, 1)) { + target_uname++; + userdir = 1; + } + + /* + * Error out if the target username is invalid. + */ + if (strspn(target_uname, "1234567890") != strlen(target_uname)) { + if ((pw = getpwnam(target_uname)) == NULL) { + log_err("invalid target user name: (%s)\n", target_uname); + exit(105); + } + } + else { + if ((pw = getpwuid(atoi(target_uname))) == NULL) { + log_err("invalid target user id: (%s)\n", target_uname); + exit(121); + } + } + + /* + * Error out if the target group name is invalid. + */ + if (strspn(target_gname, "1234567890") != strlen(target_gname)) { + if ((gr = getgrnam(target_gname)) == NULL) { + log_err("invalid target group name: (%s)\n", target_gname); + exit(106); + } + gid = gr->gr_gid; + actual_gname = strdup(gr->gr_name); + } + else { + gid = atoi(target_gname); + actual_gname = strdup(target_gname); + } + +#ifdef _OSD_POSIX + /* + * Initialize BS2000 user environment + */ + { + pid_t pid; + int status; + + switch (pid = ufork(target_uname)) { + case -1: /* Error */ + log_err("failed to setup bs2000 environment for user %s: %s\n", + target_uname, strerror(errno)); + exit(150); + case 0: /* Child */ + break; + default: /* Father */ + while (pid != waitpid(pid, &status, 0)) + ; + /* @@@ FIXME: should we deal with STOP signals as well? */ + if (WIFSIGNALED(status)) { + kill (getpid(), WTERMSIG(status)); + } + exit(WEXITSTATUS(status)); + } + } +#endif /*_OSD_POSIX*/ + + /* + * Save these for later since initgroups will hose the struct + */ + uid = pw->pw_uid; + actual_uname = strdup(pw->pw_name); + target_homedir = strdup(pw->pw_dir); + + /* + * Log the transaction here to be sure we have an open log + * before we setuid(). + */ + log_err("uid: (%s/%s) gid: (%s/%s) cmd: %s\n", + target_uname, actual_uname, + target_gname, actual_gname, + cmd); + + /* + * Error out if attempt is made to execute as root or as + * a UID less than AP_UID_MIN. Tsk tsk. + */ + if ((uid == 0) || (uid < AP_UID_MIN)) { + log_err("cannot run as forbidden uid (%d/%s)\n", uid, cmd); + exit(107); + } + + /* + * Error out if attempt is made to execute as root group + * or as a GID less than AP_GID_MIN. Tsk tsk. + */ + if ((gid == 0) || (gid < AP_GID_MIN)) { + log_err("cannot run as forbidden gid (%d/%s)\n", gid, cmd); + exit(108); + } + + /* + * Change UID/GID here so that the following tests work over NFS. + * + * Initialize the group access list for the target user, + * and setgid() to the target group. If unsuccessful, error out. + */ + if (((setgid(gid)) != 0) || (initgroups(actual_uname, gid) != 0)) { + log_err("failed to setgid (%ld: %s)\n", gid, cmd); + exit(109); + } + + /* + * setuid() to the target user. Error out on fail. + */ + if ((setuid(uid)) != 0) { + log_err("failed to setuid (%ld: %s)\n", uid, cmd); + exit(110); + } + + /* + * Get the current working directory, as well as the proper + * document root (dependant upon whether or not it is a + * ~userdir request). Error out if we cannot get either one, + * or if the current working directory is not in the docroot. + * Use chdir()s and getcwd()s to avoid problems with symlinked + * directories. Yuck. + */ + if (getcwd(cwd, AP_MAXPATH) == NULL) { + log_err("cannot get current working directory\n"); + exit(111); + } + + if (userdir) { + if (((chdir(target_homedir)) != 0) || + ((chdir(AP_USERDIR_SUFFIX)) != 0) || + ((getcwd(dwd, AP_MAXPATH)) == NULL) || + ((chdir(cwd)) != 0)) { + log_err("cannot get docroot information (%s)\n", target_homedir); + exit(112); + } + } + else { + if (((chdir(AP_DOC_ROOT)) != 0) || + ((getcwd(dwd, AP_MAXPATH)) == NULL) || + ((chdir(cwd)) != 0)) { + log_err("cannot get docroot information (%s)\n", AP_DOC_ROOT); + exit(113); + } + } + + if ((strncmp(cwd, dwd, strlen(dwd))) != 0) { + log_err("command not in docroot (%s/%s)\n", cwd, cmd); + exit(114); + } + + /* + * Stat the cwd and verify it is a directory, or error out. + */ + if (((lstat(cwd, &dir_info)) != 0) || !(S_ISDIR(dir_info.st_mode))) { + log_err("cannot stat directory: (%s)\n", cwd); + exit(115); + } + + /* + * Error out if cwd is writable by others. + */ + if ((dir_info.st_mode & S_IWOTH) || (dir_info.st_mode & S_IWGRP)) { + log_err("directory is writable by others: (%s)\n", cwd); + exit(116); + } + + /* + * Error out if we cannot stat the program. + */ + if (((lstat(cmd, &prg_info)) != 0) || (S_ISLNK(prg_info.st_mode))) { + log_err("cannot stat program: (%s)\n", cmd); + exit(117); + } + + /* + * Error out if the program is writable by others. + */ + if ((prg_info.st_mode & S_IWOTH) || (prg_info.st_mode & S_IWGRP)) { + log_err("file is writable by others: (%s/%s)\n", cwd, cmd); + exit(118); + } + + /* + * Error out if the file is setuid or setgid. + */ + if ((prg_info.st_mode & S_ISUID) || (prg_info.st_mode & S_ISGID)) { + log_err("file is either setuid or setgid: (%s/%s)\n", cwd, cmd); + exit(119); + } + + /* + * Error out if the target name/group is different from + * the name/group of the cwd or the program. + */ + if ((uid != dir_info.st_uid) || + (gid != dir_info.st_gid) || + (uid != prg_info.st_uid) || + (gid != prg_info.st_gid)) { + log_err("target uid/gid (%ld/%ld) mismatch " + "with directory (%ld/%ld) or program (%ld/%ld)\n", + uid, gid, + dir_info.st_uid, dir_info.st_gid, + prg_info.st_uid, prg_info.st_gid); + exit(120); + } + /* + * Error out if the program is not executable for the user. + * Otherwise, she won't find any error in the logs except for + * "[error] Premature end of script headers: ..." + */ + if (!(prg_info.st_mode & S_IXUSR)) { + log_err("file has no execute permission: (%s/%s)\n", cwd, cmd); + exit(121); + } + +#ifdef AP_SUEXEC_UMASK + /* + * umask() uses inverse logic; bits are CLEAR for allowed access. + */ + if ((~AP_SUEXEC_UMASK) & 0022) { + log_err("notice: AP_SUEXEC_UMASK of %03o allows " + "write permission to group and/or other\n", AP_SUEXEC_UMASK); + } + umask(AP_SUEXEC_UMASK); +#endif /* AP_SUEXEC_UMASK */ + + /* + * Be sure to close the log file so the CGI can't + * mess with it. If the exec fails, it will be reopened + * automatically when log_err is called. Note that the log + * might not actually be open if AP_LOG_EXEC isn't defined. + * However, the "log" cell isn't ifdef'd so let's be defensive + * and assume someone might have done something with it + * outside an ifdef'd AP_LOG_EXEC block. + */ + if (log != NULL) { + fclose(log); + log = NULL; + } + + /* + * Execute the command, replacing our image with its own. + */ +#ifdef NEED_HASHBANG_EMUL + /* We need the #! emulation when we want to execute scripts */ + { + extern char **environ; + + ap_execve(cmd, &argv[3], environ); + } +#else /*NEED_HASHBANG_EMUL*/ + execv(cmd, &argv[3]); +#endif /*NEED_HASHBANG_EMUL*/ + + /* + * (I can't help myself...sorry.) + * + * Uh oh. Still here. Where's the kaboom? There was supposed to be an + * EARTH-shattering kaboom! + * + * Oh well, log the failure and error out. + */ + log_err("(%d)%s: exec failed (%s)\n", errno, strerror(errno), cmd); + exit(255); +} diff --git a/rubbos/app/httpd-2.0.64/support/suexec.h b/rubbos/app/httpd-2.0.64/support/suexec.h new file mode 100644 index 00000000..8c350b8e --- /dev/null +++ b/rubbos/app/httpd-2.0.64/support/suexec.h @@ -0,0 +1,108 @@ +/* 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. + */ + +/* + * suexec.h -- user-definable variables for the suexec wrapper code. + * (See README.configure on how to customize these variables.) + */ + + +#ifndef _SUEXEC_H +#define _SUEXEC_H + +/* + * Include ap_config_layout so we can work out where the default htdocsdir + * and logsdir are. + */ +#include "ap_config_layout.h" + +/* + * HTTPD_USER -- Define as the username under which Apache normally + * runs. This is the only user allowed to execute + * this program. + */ +#ifndef AP_HTTPD_USER +#define AP_HTTPD_USER "www" +#endif + +/* + * UID_MIN -- Define this as the lowest UID allowed to be a target user + * for suEXEC. For most systems, 500 or 100 is common. + */ +#ifndef AP_UID_MIN +#define AP_UID_MIN 100 +#endif + +/* + * GID_MIN -- Define this as the lowest GID allowed to be a target group + * for suEXEC. For most systems, 100 is common. + */ +#ifndef AP_GID_MIN +#define AP_GID_MIN 100 +#endif + +/* + * USERDIR_SUFFIX -- Define to be the subdirectory under users' + * home directories where suEXEC access should + * be allowed. All executables under this directory + * will be executable by suEXEC as the user so + * they should be "safe" programs. If you are + * using a "simple" UserDir directive (ie. one + * without a "*" in it) this should be set to + * the same value. suEXEC will not work properly + * in cases where the UserDir directive points to + * a location that is not the same as the user's + * home directory as referenced in the passwd file. + * + * If you have VirtualHosts with a different + * UserDir for each, you will need to define them to + * all reside in one parent directory; then name that + * parent directory here. IF THIS IS NOT DEFINED + * PROPERLY, ~USERDIR CGI REQUESTS WILL NOT WORK! + * See the suEXEC documentation for more detailed + * information. + */ +#ifndef AP_USERDIR_SUFFIX +#define AP_USERDIR_SUFFIX "public_html" +#endif + +/* + * LOG_EXEC -- Define this as a filename if you want all suEXEC + * transactions and errors logged for auditing and + * debugging purposes. + */ +#ifndef AP_LOG_EXEC +#define AP_LOG_EXEC DEFAULT_EXP_LOGFILEDIR "/suexec_log" /* Need me? */ +#endif + +/* + * DOC_ROOT -- Define as the DocumentRoot set for Apache. This + * will be the only hierarchy (aside from UserDirs) + * that can be used for suEXEC behavior. + */ +#ifndef AP_DOC_ROOT +#define AP_DOC_ROOT DEFAULT_EXP_HTDOCSDIR +#endif + +/* + * SAFE_PATH -- Define a safe PATH environment to pass to CGI executables. + * + */ +#ifndef AP_SAFE_PATH +#define AP_SAFE_PATH "/usr/local/bin:/usr/bin:/bin" +#endif + +#endif /* _SUEXEC_H */ diff --git a/rubbos/app/httpd-2.0.64/support/utilitiesnw.def b/rubbos/app/httpd-2.0.64/support/utilitiesnw.def new file mode 100644 index 00000000..426b8c96 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/support/utilitiesnw.def @@ -0,0 +1,3 @@ +MODULE APRLIB.NLM +MODULE LIBC.NLM + diff --git a/rubbos/app/httpd-2.0.64/support/win32/ApacheMonitor.c b/rubbos/app/httpd-2.0.64/support/win32/ApacheMonitor.c new file mode 100644 index 00000000..6d97fb7b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/support/win32/ApacheMonitor.c @@ -0,0 +1,1945 @@ +/* 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. + */ + +/* ==================================================================== + * ApacheMonitor.c Simple program to manage and monitor Apache services. + * + * Contributed by Mladen Turk + * + * 05 Aug 2001 + * ==================================================================== + */ + +#define _WIN32_WINNT 0x0500 +#ifndef STRICT +#define STRICT +#endif +#ifndef OEMRESOURCE +#define OEMRESOURCE +#endif + +#if defined(_MSC_VER) && _MSC_VER >= 1400 +#define _CRT_SECURE_NO_DEPRECATE +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "ApacheMonitor.h" + +#ifndef AM_STRINGIFY +/** Properly quote a value as a string in the C preprocessor */ +#define AM_STRINGIFY(n) AM_STRINGIFY_HELPER(n) +/** Helper macro for AM_STRINGIFY */ +#define AM_STRINGIFY_HELPER(n) #n +#endif + +#define OS_VERSION_WIN9X 1 +#define OS_VERSION_WINNT 2 +#define OS_VERSION_WIN2K 3 + +/* Should be enough */ +#define MAX_APACHE_SERVICES 128 +#define MAX_APACHE_COMPUTERS 32 + +#define WM_TRAYMESSAGE (WM_APP+1) +#define WM_UPDATEMESSAGE (WM_USER+1) +#define WM_MANAGEMESSAGE (WM_USER+2) +#define WM_TIMER_REFRESH 10 +#define WM_TIMER_RESCAN 11 +#define SERVICE_APACHE_RESTART 128 +#define XBITMAP 16 +#define YBITMAP 16 +#define MAX_LOADSTRING 100 +#define REFRESH_TIME 2000 /* service refresh time (ms) */ +#define RESCAN_TIME 20000 /* registry rescan time (ms) */ + +typedef struct _st_APACHE_SERVICE +{ + LPTSTR szServiceName; + LPTSTR szDisplayName; + LPTSTR szDescription; + LPTSTR szImagePath; + LPTSTR szComputerName; + DWORD dwPid; +} ST_APACHE_SERVICE; + +typedef struct _st_MONITORED_COMPUTERS +{ + LPTSTR szComputerName; + HKEY hRegistry; +} ST_MONITORED_COMP; + +/* Global variables */ +HINSTANCE g_hInstance = NULL; +TCHAR *g_szTitle; /* The title bar text */ +TCHAR *g_szWindowClass; /* Window Class Name */ +HICON g_icoStop; +HICON g_icoRun; +UINT g_bUiTaskbarCreated; +DWORD g_dwOSVersion; +BOOL g_bDlgServiceOn = FALSE; +BOOL g_bConsoleRun = FALSE; +ST_APACHE_SERVICE g_stServices[MAX_APACHE_SERVICES]; +ST_MONITORED_COMP g_stComputers[MAX_APACHE_COMPUTERS]; + +HBITMAP g_hBmpStart, g_hBmpStop; +HBITMAP g_hBmpPicture, g_hBmpOld; +BOOL g_bRescanServices; +HWND g_hwndServiceDlg; +HWND g_hwndMain; +HWND g_hwndStdoutList; +HWND g_hwndConnectDlg; +HCURSOR g_hCursorHourglass; +HCURSOR g_hCursorArrow; + +HANDLE g_hpipeOutRead; +HANDLE g_hpipeOutWrite; +HANDLE g_hpipeInRead; +HANDLE g_hpipeInWrite; +HANDLE g_hpipeStdError; +LANGID g_LangID; +PROCESS_INFORMATION g_lpRedirectProc; +CRITICAL_SECTION g_stcSection; +LPTSTR g_szLocalHost; + +/* locale language support */ +static TCHAR *g_lpMsg[IDS_MSG_LAST - IDS_MSG_FIRST + 1]; + + +void am_ClearServicesSt() +{ + int i; + for (i = 0; i < MAX_APACHE_SERVICES; i++) + { + if (g_stServices[i].szServiceName) { + free(g_stServices[i].szServiceName); + } + if (g_stServices[i].szDisplayName) { + free(g_stServices[i].szDisplayName); + } + if (g_stServices[i].szDescription) { + free(g_stServices[i].szDescription); + } + if (g_stServices[i].szImagePath) { + free(g_stServices[i].szImagePath); + } + if (g_stServices[i].szComputerName) { + free(g_stServices[i].szComputerName); + } + + } + memset(g_stServices, 0, sizeof(ST_APACHE_SERVICE) * MAX_APACHE_SERVICES); + +} + + +void am_ClearComputersSt() +{ + int i; + for (i = 0; i < MAX_APACHE_COMPUTERS; i++) { + if (g_stComputers[i].szComputerName) { + free(g_stComputers[i].szComputerName); + RegCloseKey(g_stComputers[i].hRegistry); + } + } + memset(g_stComputers, 0, sizeof(ST_MONITORED_COMP) * MAX_APACHE_COMPUTERS); + +} + + +BOOL am_IsComputerConnected(LPTSTR szComputerName) +{ + int i = 0; + while (g_stComputers[i].szComputerName != NULL) { + if (_tcscmp(g_stComputers[i].szComputerName, szComputerName) == 0) { + return TRUE; + } + ++i; + } + return FALSE; +} + + +void am_DisconnectComputer(LPTSTR szComputerName) +{ + int i = 0, j; + while (g_stComputers[i].szComputerName != NULL) { + if (_tcscmp(g_stComputers[i].szComputerName, szComputerName) == 0) { + break; + } + ++i; + } + if (g_stComputers[i].szComputerName != NULL) { + free(g_stComputers[i].szComputerName); + RegCloseKey(g_stComputers[i].hRegistry); + for (j = i; j < MAX_APACHE_COMPUTERS - 1; j++) { + g_stComputers[j].szComputerName= g_stComputers[j+1].szComputerName; + g_stComputers[j].hRegistry = g_stComputers[j+1].hRegistry; + } + g_stComputers[j].szComputerName = NULL; + g_stComputers[j].hRegistry = NULL; + } +} + + +void ErrorMessage(LPCTSTR szError, BOOL bFatal) +{ + LPVOID lpMsgBuf = NULL; + if (szError) { + MessageBox(NULL, szError, g_lpMsg[IDS_MSG_ERROR - IDS_MSG_FIRST], + MB_OK | (bFatal ? MB_ICONERROR : MB_ICONEXCLAMATION)); + } + else { + FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, GetLastError(), g_LangID, + (LPTSTR) &lpMsgBuf, 0, NULL); + MessageBox(NULL, (LPCTSTR)lpMsgBuf, + g_lpMsg[IDS_MSG_ERROR - IDS_MSG_FIRST], + MB_OK | (bFatal ? MB_ICONERROR : MB_ICONEXCLAMATION)); + LocalFree(lpMsgBuf); + } + if (bFatal) { + PostQuitMessage(0); + } +} + + +int am_RespawnAsUserAdmin(HWND hwnd, DWORD op, LPCTSTR szService, + LPCTSTR szComputerName) +{ + TCHAR args[MAX_PATH + MAX_COMPUTERNAME_LENGTH + 12]; + + if (g_dwOSVersion < OS_VERSION_WIN2K) { + ErrorMessage(g_lpMsg[IDS_MSG_SRVFAILED - IDS_MSG_FIRST], FALSE); + return 0; + } + + _sntprintf(args, sizeof(args) / sizeof(TCHAR), + _T("%d \"%s\" \"%s\""), op, szService, + szComputerName ? szComputerName : _T("")); + if (!ShellExecute(hwnd, _T("runas"), __targv[0], args, NULL, SW_NORMAL)) { + ErrorMessage(g_lpMsg[IDS_MSG_SRVFAILED - IDS_MSG_FIRST], + FALSE); + return 0; + } + + return 1; +} + + +BOOL am_ConnectComputer(LPTSTR szComputerName) +{ + int i = 0; + HKEY hKeyRemote; + TCHAR szTmp[MAX_PATH]; + + while (g_stComputers[i].szComputerName != NULL) { + if (_tcscmp(g_stComputers[i].szComputerName, szComputerName) == 0) { + return FALSE; + } + ++i; + } + if (i > MAX_APACHE_COMPUTERS - 1) { + return FALSE; + } + if (RegConnectRegistry(szComputerName, HKEY_LOCAL_MACHINE, &hKeyRemote) + != ERROR_SUCCESS) { + _sntprintf(szTmp, sizeof(szTmp) / sizeof(TCHAR), + g_lpMsg[IDS_MSG_ECONNECT - IDS_MSG_FIRST], + szComputerName); + ErrorMessage(szTmp, FALSE); + return FALSE; + } + else { + g_stComputers[i].szComputerName = _tcsdup(szComputerName); + g_stComputers[i].hRegistry = hKeyRemote; + return TRUE; + } +} + + +LPTSTR GetStringRes(int id) +{ + static TCHAR buffer[MAX_PATH]; + + buffer[0] = 0; + LoadString(GetModuleHandle(NULL), id, buffer, MAX_PATH); + return buffer; +} + + +BOOL GetSystemOSVersion(LPDWORD dwVersion) +{ + OSVERSIONINFO osvi; + /* + Try calling GetVersionEx using the OSVERSIONINFOEX structure. + If that fails, try using the OSVERSIONINFO structure. + */ + memset(&osvi, 0, sizeof(OSVERSIONINFO)); + osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); + + if (!GetVersionEx(&osvi)) { + return FALSE; + } + + switch (osvi.dwPlatformId) + { + case VER_PLATFORM_WIN32_NT: + if (osvi.dwMajorVersion >= 5) + *dwVersion = OS_VERSION_WIN2K; + else + *dwVersion = OS_VERSION_WINNT; + break; + + case VER_PLATFORM_WIN32_WINDOWS: + *dwVersion = OS_VERSION_WIN9X; + break; + + case VER_PLATFORM_WIN32s: + default: + *dwVersion = 0; + return FALSE; + } + return TRUE; +} + + +static VOID ShowNotifyIcon(HWND hWnd, DWORD dwMessage) +{ + NOTIFYICONDATA nid; + int i = 0, n = 0; + + memset(&nid, 0, sizeof(nid)); + nid.cbSize = sizeof(NOTIFYICONDATA); + nid.hWnd = hWnd; + nid.uID = 0xFF; + nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; + nid.uCallbackMessage = WM_TRAYMESSAGE; + + while (g_stServices[i].szServiceName != NULL) + { + if (g_stServices[i].dwPid != 0) { + ++n; + } + ++i; + } + if (dwMessage != NIM_DELETE) + { + if (n) { + nid.hIcon = g_icoRun; + } + else { + nid.hIcon = g_icoStop; + } + } + else { + nid.hIcon = NULL; + } + if (n == i && n > 0) { + _tcscpy(nid.szTip, g_lpMsg[IDS_MSG_RUNNINGALL - IDS_MSG_FIRST]); + } + else if (n) { + _sntprintf(nid.szTip, sizeof(nid.szTip) / sizeof(TCHAR), + g_lpMsg[IDS_MSG_RUNNING - IDS_MSG_FIRST], n, i); + } + else if (i) { + _sntprintf(nid.szTip, sizeof(nid.szTip) / sizeof(TCHAR), + g_lpMsg[IDS_MSG_RUNNINGNONE - IDS_MSG_FIRST], i); + } + else { + _tcscpy(nid.szTip, g_lpMsg[IDS_MSG_NOSERVICES - IDS_MSG_FIRST]); + } + Shell_NotifyIcon(dwMessage, &nid); +} + + +void appendMenuItem(HMENU hMenu, UINT uMenuId, LPTSTR szName, + BOOL fDefault, BOOL fEnabled) +{ + MENUITEMINFO mii; + + memset(&mii, 0, sizeof(MENUITEMINFO)); + mii.cbSize = sizeof(MENUITEMINFO); + mii.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE; + if (_tcslen(szName)) + { + mii.fType = MFT_STRING; + mii.wID = uMenuId; + if (fDefault) { + mii.fState = MFS_DEFAULT; + } + if (!fEnabled) { + mii.fState |= MFS_DISABLED; + } + mii.dwTypeData = szName; + } + else { + mii.fType = MFT_SEPARATOR; + } + InsertMenuItem(hMenu, uMenuId, FALSE, &mii); +} + + +void appendServiceMenu(HMENU hMenu, UINT uMenuId, + LPTSTR szServiceName, BOOL fRunning) +{ + MENUITEMINFO mii; + HMENU smh; + + smh = CreatePopupMenu(); + + appendMenuItem(smh, IDM_SM_START + uMenuId, + g_lpMsg[IDS_MSG_SSTART - IDS_MSG_FIRST], FALSE, !fRunning); + appendMenuItem(smh, IDM_SM_STOP + uMenuId, + g_lpMsg[IDS_MSG_SSTOP - IDS_MSG_FIRST], FALSE, fRunning); + appendMenuItem(smh, IDM_SM_RESTART + uMenuId, + g_lpMsg[IDS_MSG_SRESTART - IDS_MSG_FIRST], FALSE, fRunning); + + memset(&mii, 0, sizeof(MENUITEMINFO)); + mii.cbSize = sizeof(MENUITEMINFO); + mii.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE | MIIM_SUBMENU + | MIIM_CHECKMARKS; + mii.fType = MFT_STRING; + mii.wID = uMenuId; + mii.hbmpChecked = g_hBmpStart; + mii.hbmpUnchecked = g_hBmpStop; + mii.dwTypeData = szServiceName; + mii.hSubMenu = smh; + mii.fState = fRunning ? MFS_CHECKED : MFS_UNCHECKED; + InsertMenuItem(hMenu, IDM_SM_SERVICE + uMenuId, FALSE, &mii); +} + + +void ShowTryPopupMenu(HWND hWnd) +{ + /* create popup menu */ + HMENU hMenu = CreatePopupMenu(); + POINT pt; + + if (hMenu) + { + appendMenuItem(hMenu, IDM_RESTORE, + g_lpMsg[IDS_MSG_MNUSHOW - IDS_MSG_FIRST], + TRUE, TRUE); + if (g_dwOSVersion >= OS_VERSION_WINNT) { + appendMenuItem(hMenu, IDC_SMANAGER, + g_lpMsg[IDS_MSG_MNUSERVICES - IDS_MSG_FIRST], + FALSE, TRUE); + } + appendMenuItem(hMenu, 0, _T(""), FALSE, TRUE); + appendMenuItem(hMenu, IDM_EXIT, + g_lpMsg[IDS_MSG_MNUEXIT - IDS_MSG_FIRST], + FALSE, TRUE); + + if (!SetForegroundWindow(hWnd)) { + SetForegroundWindow(NULL); + } + GetCursorPos(&pt); + TrackPopupMenu(hMenu, TPM_LEFTALIGN|TPM_RIGHTBUTTON, + pt.x, pt.y, 0, hWnd, NULL); + DestroyMenu(hMenu); + } +} + + +void ShowTryServicesMenu(HWND hWnd) +{ + /* create services list popup menu and submenus */ + HMENU hMenu = CreatePopupMenu(); + POINT pt; + int i = 0; + + if (hMenu) + { + while (g_stServices[i].szServiceName != NULL) + { + appendServiceMenu(hMenu, i, g_stServices[i].szDisplayName, + g_stServices[i].dwPid != 0); + ++i; + } + if (i) + { + if (!SetForegroundWindow(hWnd)) { + SetForegroundWindow(NULL); + } + GetCursorPos(&pt); + TrackPopupMenu(hMenu, TPM_LEFTALIGN|TPM_RIGHTBUTTON, + pt.x, pt.y, 0, hWnd, NULL); + DestroyMenu(hMenu); + } + } +} + + +BOOL CenterWindow(HWND hwndChild) +{ + RECT rChild, rWorkArea; + int wChild, hChild; + int xNew, yNew; + BOOL bResult; + + /* Get the Height and Width of the child window */ + GetWindowRect(hwndChild, &rChild); + wChild = rChild.right - rChild.left; + hChild = rChild.bottom - rChild.top; + + /* Get the limits of the 'workarea' */ + bResult = SystemParametersInfo(SPI_GETWORKAREA, sizeof(RECT), + &rWorkArea, 0); + if (!bResult) { + rWorkArea.left = rWorkArea.top = 0; + rWorkArea.right = GetSystemMetrics(SM_CXSCREEN); + rWorkArea.bottom = GetSystemMetrics(SM_CYSCREEN); + } + + /* Calculate new X and Y position*/ + xNew = (rWorkArea.right - wChild) / 2; + yNew = (rWorkArea.bottom - hChild) / 2; + return SetWindowPos(hwndChild, HWND_TOP, xNew, yNew, 0, 0, + SWP_NOSIZE | SWP_SHOWWINDOW); +} + + +static void addListBoxItem(HWND hDlg, LPTSTR lpStr, HBITMAP hBmp) +{ + LRESULT nItem; + + nItem = SendMessage(hDlg, LB_ADDSTRING, 0, (LPARAM)lpStr); + SendMessage(hDlg, LB_SETITEMDATA, nItem, (LPARAM)hBmp); +} + + +static void addListBoxString(HWND hListBox, LPTSTR lpStr) +{ + static int nItems = 0; + if (!g_bDlgServiceOn) { + return; + } + ++nItems; + if (nItems > MAX_LOADSTRING) + { + SendMessage(hListBox, LB_RESETCONTENT, 0, 0); + nItems = 1; + } + ListBox_SetCurSel(hListBox, + ListBox_AddString(hListBox, lpStr)); + +} + + +#ifndef UNICODE +#define addListBoxStringA addListBoxString +#else +static void addListBoxStringA(HWND hListBox, LPSTR lpStr) +{ + static int nItems = 0; + TCHAR WStr[16384]; + + if (!g_bDlgServiceOn) { + return; + } + if (!MultiByteToWideChar(CP_ACP, 0, lpStr, (int)strlen(lpStr) + 1, + WStr, (int) (sizeof(WStr) / sizeof(TCHAR)))) + return; + ++nItems; + if (nItems > MAX_LOADSTRING) + { + SendMessage(hListBox, LB_RESETCONTENT, 0, 0); + nItems = 1; + } + ListBox_SetCurSel(hListBox, + ListBox_AddString(hListBox, WStr)); +} +#endif + + +static DWORD WINAPI ConsoleOutputThread(LPVOID lpThreadParameter) +{ + static BYTE lpBuffer[MAX_PATH+1]; + int nPtr = 0; + BYTE ch; + DWORD dwReaded; + + while (ReadFile(g_hpipeOutRead, &ch, 1, &dwReaded, NULL) == TRUE) + { + if (dwReaded > 0) + { + if (ch == '\n' || nPtr >= MAX_PATH) + { + lpBuffer[nPtr] = '\0'; + addListBoxStringA(g_hwndStdoutList, lpBuffer); + nPtr = 0; + } + else if (ch == '\t' && nPtr < (MAX_PATH - 4)) + { + int i; + for (i = 0; i < 4; ++i) { + lpBuffer[nPtr++] = ' '; + } + } + else if (ch != '\r') { + lpBuffer[nPtr++] = ch; + } + } + } + CloseHandle(g_hpipeInWrite); + CloseHandle(g_hpipeOutRead); + CloseHandle(g_hpipeStdError); + return 0; +} + + +DWORD WINAPI ConsoleWaitingThread(LPVOID lpThreadParameter) +{ + WaitForSingleObject(g_lpRedirectProc.hThread, INFINITE); + CloseHandle(g_lpRedirectProc.hThread); + MessageBeep(100); + g_bConsoleRun = FALSE; + SetCursor(g_hCursorArrow); + return 0; +} + + +BOOL RunRedirectedConsole(LPTSTR szCmdLine) +{ + DWORD dwThreadId; + HANDLE hProc; + STARTUPINFO stInfo; + BOOL bResult; + + memset(&stInfo, 0, sizeof(stInfo)); + stInfo.cb = sizeof(stInfo); + stInfo.dwFlags = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW; + stInfo.wShowWindow = SW_HIDE; + + hProc = GetCurrentProcess(); + + if (!CreatePipe(&g_hpipeInRead, &g_hpipeInWrite, NULL, MAX_PATH)) { + ErrorMessage(NULL, TRUE); + } + if (!CreatePipe(&g_hpipeOutRead, &g_hpipeOutWrite, NULL, MAX_PATH*8)) { + ErrorMessage(NULL, TRUE); + } + DuplicateHandle(hProc, g_hpipeInRead, hProc, &g_hpipeInRead, 0, TRUE, + DUPLICATE_CLOSE_SOURCE|DUPLICATE_SAME_ACCESS); + DuplicateHandle(hProc, g_hpipeOutWrite, hProc, &g_hpipeOutWrite, 0, TRUE, + DUPLICATE_CLOSE_SOURCE|DUPLICATE_SAME_ACCESS); + DuplicateHandle(hProc, g_hpipeOutWrite, hProc, &g_hpipeStdError, 0, TRUE, + DUPLICATE_SAME_ACCESS); + if (!g_hpipeInRead && !g_hpipeOutWrite && !g_hpipeStdError) { + ErrorMessage(NULL, TRUE); + } + stInfo.hStdInput = g_hpipeInRead; + stInfo.hStdOutput = g_hpipeOutWrite; + stInfo.hStdError = g_hpipeStdError; + + bResult = CreateProcess(NULL, + szCmdLine, + NULL, + NULL, + TRUE, + CREATE_SUSPENDED, + NULL, + NULL, + &stInfo, + &g_lpRedirectProc); + + + CloseHandle(g_hpipeInRead); + CloseHandle(g_hpipeOutWrite); + CloseHandle(g_hpipeStdError); + + if (!bResult) + { + CloseHandle(g_hpipeInWrite); + CloseHandle(g_hpipeOutRead); + CloseHandle(g_hpipeStdError); + return FALSE; + } + + CloseHandle(CreateThread(NULL, 0, ConsoleOutputThread, + 0, 0, &dwThreadId)); + ResumeThread(g_lpRedirectProc.hThread); + CloseHandle(CreateThread(NULL, 0, ConsoleWaitingThread, + 0, 0, &dwThreadId)); + + return TRUE; +} + + +BOOL RunAndForgetConsole(LPTSTR szCmdLine, BOOL bRedirectConsole) +{ + STARTUPINFO stInfo; + PROCESS_INFORMATION prInfo; + BOOL bResult; + + if (bRedirectConsole) { + return RunRedirectedConsole(szCmdLine); + } + + memset(&stInfo, 0, sizeof(stInfo)); + stInfo.cb = sizeof(stInfo); + stInfo.dwFlags = STARTF_USESHOWWINDOW; + stInfo.wShowWindow = SW_HIDE; + + bResult = CreateProcess(NULL, + szCmdLine, + NULL, + NULL, + TRUE, + CREATE_NEW_CONSOLE, + NULL, + NULL, + &stInfo, + &prInfo); + + if (!bResult) { + return FALSE; + } + if (g_dwOSVersion == OS_VERSION_WIN9X) { + /* give some time to rescan the status */ + Sleep(2000); + } + CloseHandle(prInfo.hThread); + CloseHandle(prInfo.hProcess); + return TRUE; +} + + +BOOL ApacheManageService(LPCTSTR szServiceName, LPCTSTR szImagePath, + LPTSTR szComputerName, DWORD dwCommand) +{ + TCHAR szBuf[MAX_PATH]; + TCHAR szMsg[MAX_PATH]; + LPTSTR sPos; + BOOL retValue; + BOOL serviceFlag = TRUE; + SC_HANDLE schService; + SC_HANDLE schSCManager; + SERVICE_STATUS schSStatus; + int ticks; + + if (g_dwOSVersion == OS_VERSION_WIN9X) + { + sPos = _tcsstr(szImagePath, _T("-k start")); + if (sPos) + { + _tcsncpy(szBuf, szImagePath, (int)(sPos - szImagePath)); + switch (dwCommand) + { + case SERVICE_CONTROL_STOP: + _tcscat(szBuf, _T(" -k shutdown -n ")); + break; + + case SERVICE_CONTROL_CONTINUE: + _sntprintf(szMsg, sizeof(szMsg) / sizeof(TCHAR), + g_lpMsg[IDS_MSG_SRVSTART - IDS_MSG_FIRST], + szServiceName); + addListBoxString(g_hwndStdoutList, szMsg); + _tcscat(szBuf, _T(" -k start -n ")); + serviceFlag = FALSE; + break; + + case SERVICE_APACHE_RESTART: + _tcscat(szBuf, _T(" -k restart -n ")); + break; + + default: + return FALSE; + } + _tcscat(szBuf, szServiceName); + } + else { + return FALSE; + } + g_bConsoleRun = TRUE; + SetCursor(g_hCursorHourglass); + if (!RunAndForgetConsole(szBuf, serviceFlag)) + { + ErrorMessage(NULL, FALSE); + g_bConsoleRun = FALSE; + SetCursor(g_hCursorArrow); + return FALSE; + } + else if (!serviceFlag) + { + _sntprintf(szMsg, sizeof(szMsg) / sizeof(TCHAR), + g_lpMsg[IDS_MSG_SRVSTARTED - IDS_MSG_FIRST], + szServiceName); + addListBoxString(g_hwndStdoutList, szMsg); + g_bConsoleRun = FALSE; + SetCursor(g_hCursorArrow); + return TRUE; + } + } + else + { + schSCManager = OpenSCManager(szComputerName, NULL, + SC_MANAGER_CONNECT); + if (!schSCManager) { + ErrorMessage(g_lpMsg[IDS_MSG_SRVFAILED - IDS_MSG_FIRST], + FALSE); + return FALSE; + } + + schService = OpenService(schSCManager, szServiceName, + SERVICE_QUERY_STATUS | SERVICE_START | + SERVICE_STOP | SERVICE_USER_DEFINED_CONTROL); + if (schService == NULL) + { + /* Avoid recursion of ImagePath NULL (from this Respawn) */ + if (szImagePath) { + am_RespawnAsUserAdmin(g_hwndMain, dwCommand, + szServiceName, szComputerName); + } + else { + ErrorMessage(g_lpMsg[IDS_MSG_SRVFAILED - IDS_MSG_FIRST], + FALSE); + } + CloseServiceHandle(schSCManager); + return FALSE; + } + else + { + retValue = FALSE; + g_bConsoleRun = TRUE; + SetCursor(g_hCursorHourglass); + switch (dwCommand) + { + case SERVICE_CONTROL_STOP: + _sntprintf(szMsg, sizeof(szMsg) / sizeof(TCHAR), + g_lpMsg[IDS_MSG_SRVSTOP - IDS_MSG_FIRST], + szServiceName); + addListBoxString(g_hwndStdoutList, szMsg); + if (ControlService(schService, SERVICE_CONTROL_STOP, + &schSStatus)) { + Sleep(1000); + while (QueryServiceStatus(schService, &schSStatus)) + { + if (schSStatus.dwCurrentState == SERVICE_STOP_PENDING) + { + Sleep(1000); + } + else { + break; + } + } + } + if (QueryServiceStatus(schService, &schSStatus)) + { + if (schSStatus.dwCurrentState == SERVICE_STOPPED) + { + retValue = TRUE; + _sntprintf(szMsg, sizeof(szMsg) / sizeof(TCHAR), + g_lpMsg[IDS_MSG_SRVSTOPPED - IDS_MSG_FIRST], + szServiceName); + addListBoxString(g_hwndStdoutList, szMsg); + } + } + break; + + case SERVICE_CONTROL_CONTINUE: + _sntprintf(szMsg, sizeof(szMsg) / sizeof(TCHAR), + g_lpMsg[IDS_MSG_SRVSTART - IDS_MSG_FIRST], + szServiceName); + addListBoxString(g_hwndStdoutList, szMsg); + + if (StartService(schService, 0, NULL)) + { + Sleep(1000); + while (QueryServiceStatus(schService, &schSStatus)) + { + if (schSStatus.dwCurrentState == SERVICE_START_PENDING) + { + Sleep(1000); + } + else { + break; + } + } + } + if (QueryServiceStatus(schService, &schSStatus)) + { + if (schSStatus.dwCurrentState == SERVICE_RUNNING) + { + retValue = TRUE; + _sntprintf(szMsg, sizeof(szMsg) / sizeof(TCHAR), + g_lpMsg[IDS_MSG_SRVSTARTED - IDS_MSG_FIRST], + szServiceName); + addListBoxString(g_hwndStdoutList, szMsg); + } + } + break; + + case SERVICE_APACHE_RESTART: + _sntprintf(szMsg, sizeof(szMsg) / sizeof(TCHAR), + g_lpMsg[IDS_MSG_SRVRESTART - IDS_MSG_FIRST], + szServiceName); + addListBoxString(g_hwndStdoutList, szMsg); + if (ControlService(schService, SERVICE_APACHE_RESTART, + &schSStatus)) + { + ticks = 60; + while (schSStatus.dwCurrentState == SERVICE_START_PENDING) + { + Sleep(1000); + if (!QueryServiceStatus(schService, &schSStatus)) + { + CloseServiceHandle(schService); + CloseServiceHandle(schSCManager); + g_bConsoleRun = FALSE; + SetCursor(g_hCursorArrow); + return FALSE; + } + if (!--ticks) { + break; + } + } + } + if (schSStatus.dwCurrentState == SERVICE_RUNNING) + { + retValue = TRUE; + _sntprintf(szMsg, sizeof(szMsg) / sizeof(TCHAR), + g_lpMsg[IDS_MSG_SRVRESTARTED - IDS_MSG_FIRST], + szServiceName); + addListBoxString(g_hwndStdoutList, szMsg); + } + break; + } + CloseServiceHandle(schService); + CloseServiceHandle(schSCManager); + if (!retValue) { + ErrorMessage(g_lpMsg[IDS_MSG_SRVFAILED - IDS_MSG_FIRST], + FALSE); + } + g_bConsoleRun = FALSE; + SetCursor(g_hCursorArrow); + return retValue; + } + return FALSE; + } + + return FALSE; +} + + +BOOL IsServiceRunning(LPCTSTR szServiceName, LPCTSTR szComputerName, + LPDWORD lpdwPid) +{ + DWORD dwPid; + HWND hWnd; + SC_HANDLE schService; + SC_HANDLE schSCManager; + SERVICE_STATUS schSStatus; + + if (g_dwOSVersion == OS_VERSION_WIN9X) + { + hWnd = FindWindow(_T("ApacheWin95ServiceMonitor"), szServiceName); + if (hWnd && GetWindowThreadProcessId(hWnd, &dwPid)) + { + *lpdwPid = 1; + return TRUE; + } + else { + return FALSE; + } + } + else + { + dwPid = 0; + schSCManager = OpenSCManager(szComputerName, NULL, + SC_MANAGER_CONNECT); + if (!schSCManager) { + return FALSE; + } + + schService = OpenService(schSCManager, szServiceName, + SERVICE_QUERY_STATUS); + if (schService != NULL) + { + if (QueryServiceStatus(schService, &schSStatus)) + { + dwPid = schSStatus.dwCurrentState; + if (lpdwPid) { + *lpdwPid = 1; + } + } + CloseServiceHandle(schService); + CloseServiceHandle(schSCManager); + return dwPid == SERVICE_RUNNING ? TRUE : FALSE; + } + else { + g_bRescanServices = TRUE; + } + CloseServiceHandle(schSCManager); + return FALSE; + + } + + return FALSE; +} + + +BOOL FindRunningServices(void) +{ + int i = 0; + DWORD dwPid; + BOOL rv = FALSE; + while (g_stServices[i].szServiceName != NULL) + { + if (!IsServiceRunning(g_stServices[i].szServiceName, + g_stServices[i].szComputerName, &dwPid)) { + dwPid = 0; + } + if (g_stServices[i].dwPid != dwPid) { + rv = TRUE; + } + g_stServices[i].dwPid = dwPid; + ++i; + } + return rv; +} + + +BOOL GetApacheServicesStatus() +{ + TCHAR szKey[MAX_PATH]; + TCHAR achKey[MAX_PATH]; + TCHAR szImagePath[MAX_PATH]; + TCHAR szBuf[MAX_PATH]; + TCHAR szTmp[MAX_PATH]; + HKEY hKey, hSubKey, hKeyRemote; + DWORD retCode, rv, dwKeyType; + DWORD dwBufLen = MAX_PATH; + int i, stPos = 0; + int computers = 0; + + g_bRescanServices = FALSE; + + am_ClearServicesSt(); + while (g_stComputers[computers].szComputerName != NULL) { + hKeyRemote = g_stComputers[computers].hRegistry; + retCode = RegOpenKeyEx(hKeyRemote, + _T("System\\CurrentControlSet\\Services\\"), + 0, KEY_READ, &hKey); + if (retCode != ERROR_SUCCESS) + { + ErrorMessage(NULL, FALSE); + return FALSE; + } + for (i = 0, retCode = ERROR_SUCCESS; retCode == ERROR_SUCCESS; i++) + { + retCode = RegEnumKey(hKey, i, achKey, MAX_PATH); + if (retCode == ERROR_SUCCESS) + { + _tcscpy(szKey, _T("System\\CurrentControlSet\\Services\\")); + _tcscat(szKey, achKey); + + if (RegOpenKeyEx(hKeyRemote, szKey, 0, + KEY_QUERY_VALUE, &hSubKey) == ERROR_SUCCESS) + { + dwBufLen = MAX_PATH; + rv = RegQueryValueEx(hSubKey, _T("ImagePath"), NULL, + &dwKeyType, (LPBYTE)szImagePath, &dwBufLen); + + if (rv == ERROR_SUCCESS + && (dwKeyType == REG_SZ + || dwKeyType == REG_EXPAND_SZ) + && dwBufLen) + { + _tcscpy(szBuf, szImagePath); + CharLower(szBuf); + /* the service name could be httpd*.exe or Apache*.exe */ + if (((_tcsstr(szBuf, _T("\\apache")) != NULL) + || (_tcsstr(szBuf, _T("\\httpd")) != NULL)) + && _tcsstr(szBuf, _T(".exe")) + && (_tcsstr(szBuf, _T("--ntservice")) != NULL + || _tcsstr(szBuf, _T("-k ")) != NULL)) + { + g_stServices[stPos].szServiceName = _tcsdup(achKey); + g_stServices[stPos].szImagePath = _tcsdup(szImagePath); + g_stServices[stPos].szComputerName = + _tcsdup(g_stComputers[computers].szComputerName); + dwBufLen = MAX_PATH; + if (RegQueryValueEx(hSubKey, _T("Description"), NULL, + &dwKeyType, (LPBYTE)szBuf, &dwBufLen) + == ERROR_SUCCESS) { + g_stServices[stPos].szDescription = _tcsdup(szBuf); + } + dwBufLen = MAX_PATH; + if (RegQueryValueEx(hSubKey, _T("DisplayName"), NULL, + &dwKeyType, (LPBYTE)szBuf, &dwBufLen) + == ERROR_SUCCESS) + { + if (_tcscmp(g_stComputers[computers] + .szComputerName, g_szLocalHost) != 0) + { + _tcscpy(szTmp, g_stComputers[computers] + .szComputerName + 2); + _tcscat(szTmp, _T("@")); + _tcscat(szTmp, szBuf); + } + else { + _tcscpy(szTmp, szBuf); + } + g_stServices[stPos].szDisplayName = _tcsdup(szTmp); + + } + ++stPos; + if (stPos >= MAX_APACHE_SERVICES) { + retCode = !ERROR_SUCCESS; + } + } + } + RegCloseKey(hSubKey); + } + } + } + ++computers; + RegCloseKey(hKey); + } + FindRunningServices(); + return TRUE; +} + + +LRESULT CALLBACK ConnectDlgProc(HWND hDlg, UINT message, + WPARAM wParam, LPARAM lParam) +{ + TCHAR szCmp[MAX_COMPUTERNAME_LENGTH+4]; + switch (message) + { + case WM_INITDIALOG: + ShowWindow(hDlg, SW_HIDE); + g_hwndConnectDlg = hDlg; + CenterWindow(hDlg); + ShowWindow(hDlg, SW_SHOW); + SetFocus(GetDlgItem(hDlg, IDC_COMPUTER)); + return TRUE; + + case WM_COMMAND: + switch (LOWORD(wParam)) + { + case IDOK: + memset(szCmp, 0, sizeof(szCmp)); + _tcscpy(szCmp, _T("\\\\")); + SendMessage(GetDlgItem(hDlg, IDC_COMPUTER), WM_GETTEXT, + (WPARAM) MAX_COMPUTERNAME_LENGTH, + (LPARAM) szCmp+2); + + _tcsupr(szCmp); + if (_tcslen(szCmp) < 3) { + EndDialog(hDlg, TRUE); + return TRUE; + } + am_ConnectComputer(szCmp); + SendMessage(g_hwndMain, WM_TIMER, WM_TIMER_RESCAN, 0); + + case IDCANCEL: + EndDialog(hDlg, TRUE); + return TRUE; + + case IDC_LBROWSE: + { + BROWSEINFO bi; + ITEMIDLIST *il; + LPMALLOC pMalloc; + memset(&bi, 0, sizeof(BROWSEINFO)); + SHGetSpecialFolderLocation(hDlg, CSIDL_NETWORK, &il); + + bi.lpszTitle = _T("ApacheMonitor :\nSelect Network Computer!"); + bi.pszDisplayName = szCmp; + bi.hwndOwner = hDlg; + bi.ulFlags = BIF_BROWSEFORCOMPUTER; + bi.lpfn = NULL; + bi.lParam = 0; + bi.iImage = 0; + bi.pidlRoot = il; + + if (SHBrowseForFolder(&bi) != NULL) { + SendMessage(GetDlgItem(hDlg, IDC_COMPUTER), + WM_SETTEXT, + (WPARAM) NULL, (LPARAM) szCmp); + } + if (SHGetMalloc(&pMalloc)) { + pMalloc->lpVtbl->Free(pMalloc, il); + pMalloc->lpVtbl->Release(pMalloc); + } + return TRUE; + } + } + break; + + case WM_QUIT: + case WM_CLOSE: + EndDialog(hDlg, TRUE); + return TRUE; + + default: + return FALSE; + } + return FALSE; + +} + + +LRESULT CALLBACK ServiceDlgProc(HWND hDlg, UINT message, + WPARAM wParam, LPARAM lParam) +{ + TCHAR szBuf[MAX_PATH]; + HWND hListBox; + static HWND hStatusBar; + TEXTMETRIC tm; + int i, y; + HDC hdcMem; + RECT rcBitmap; + LRESULT nItem; + LPMEASUREITEMSTRUCT lpmis; + LPDRAWITEMSTRUCT lpdis; + + memset(szBuf, 0, sizeof(szBuf)); + switch (message) + { + case WM_INITDIALOG: + ShowWindow(hDlg, SW_HIDE); + g_hwndServiceDlg = hDlg; + SetWindowText(hDlg, g_szTitle); + Button_Enable(GetDlgItem(hDlg, IDC_SSTART), FALSE); + Button_Enable(GetDlgItem(hDlg, IDC_SSTOP), FALSE); + Button_Enable(GetDlgItem(hDlg, IDC_SRESTART), FALSE); + Button_Enable(GetDlgItem(hDlg, IDC_SDISCONN), FALSE); + SetWindowText(GetDlgItem(hDlg, IDC_SSTART), + g_lpMsg[IDS_MSG_SSTART - IDS_MSG_FIRST]); + SetWindowText(GetDlgItem(hDlg, IDC_SSTOP), + g_lpMsg[IDS_MSG_SSTOP - IDS_MSG_FIRST]); + SetWindowText(GetDlgItem(hDlg, IDC_SRESTART), + g_lpMsg[IDS_MSG_SRESTART - IDS_MSG_FIRST]); + SetWindowText(GetDlgItem(hDlg, IDC_SMANAGER), + g_lpMsg[IDS_MSG_SERVICES - IDS_MSG_FIRST]); + SetWindowText(GetDlgItem(hDlg, IDC_SCONNECT), + g_lpMsg[IDS_MSG_CONNECT - IDS_MSG_FIRST]); + SetWindowText(GetDlgItem(hDlg, IDC_SEXIT), + g_lpMsg[IDS_MSG_MNUEXIT - IDS_MSG_FIRST]); + if (g_dwOSVersion < OS_VERSION_WINNT) + { + ShowWindow(GetDlgItem(hDlg, IDC_SMANAGER), SW_HIDE); + ShowWindow(GetDlgItem(hDlg, IDC_SCONNECT), SW_HIDE); + ShowWindow(GetDlgItem(hDlg, IDC_SDISCONN), SW_HIDE); + } + hListBox = GetDlgItem(hDlg, IDL_SERVICES); + g_hwndStdoutList = GetDlgItem(hDlg, IDL_STDOUT); + hStatusBar = CreateStatusWindow(0x0800 /* SBT_TOOLTIPS */ + | WS_CHILD | WS_VISIBLE, + _T(""), hDlg, IDC_STATBAR); + if (GetApacheServicesStatus()) + { + i = 0; + while (g_stServices[i].szServiceName != NULL) + { + addListBoxItem(hListBox, g_stServices[i].szDisplayName, + g_stServices[i].dwPid == 0 ? g_hBmpStop + : g_hBmpStart); + ++i; + } + } + CenterWindow(hDlg); + ShowWindow(hDlg, SW_SHOW); + SetFocus(hListBox); + SendMessage(hListBox, LB_SETCURSEL, 0, 0); + return TRUE; + break; + + case WM_MANAGEMESSAGE: + ApacheManageService(g_stServices[LOWORD(wParam)].szServiceName, + g_stServices[LOWORD(wParam)].szImagePath, + g_stServices[LOWORD(wParam)].szComputerName, + LOWORD(lParam)); + + return TRUE; + break; + + case WM_UPDATEMESSAGE: + hListBox = GetDlgItem(hDlg, IDL_SERVICES); + SendMessage(hListBox, LB_RESETCONTENT, 0, 0); + SendMessage(hStatusBar, SB_SETTEXT, 0, (LPARAM)_T("")); + Button_Enable(GetDlgItem(hDlg, IDC_SSTART), FALSE); + Button_Enable(GetDlgItem(hDlg, IDC_SSTOP), FALSE); + Button_Enable(GetDlgItem(hDlg, IDC_SRESTART), FALSE); + Button_Enable(GetDlgItem(hDlg, IDC_SDISCONN), FALSE); + i = 0; + while (g_stServices[i].szServiceName != NULL) + { + addListBoxItem(hListBox, g_stServices[i].szDisplayName, + g_stServices[i].dwPid == 0 ? g_hBmpStop : g_hBmpStart); + ++i; + } + SendMessage(hListBox, LB_SETCURSEL, 0, 0); + /* Dirty hack to bring the window to the foreground */ + SetWindowPos(hDlg, HWND_TOPMOST, 0, 0, 0, 0, + SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW); + SetWindowPos(hDlg, HWND_NOTOPMOST, 0, 0, 0, 0, + SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW); + SetFocus(hListBox); + return TRUE; + break; + + case WM_MEASUREITEM: + lpmis = (LPMEASUREITEMSTRUCT) lParam; + lpmis->itemHeight = YBITMAP; + return TRUE; + + case WM_SETCURSOR: + if (g_bConsoleRun) { + SetCursor(g_hCursorHourglass); + } + else { + SetCursor(g_hCursorArrow); + } + return TRUE; + + case WM_DRAWITEM: + lpdis = (LPDRAWITEMSTRUCT) lParam; + if (lpdis->itemID == -1) { + break; + } + switch (lpdis->itemAction) + { + case ODA_SELECT: + case ODA_DRAWENTIRE: + g_hBmpPicture = (HBITMAP)SendMessage(lpdis->hwndItem, + LB_GETITEMDATA, + lpdis->itemID, (LPARAM) 0); + + hdcMem = CreateCompatibleDC(lpdis->hDC); + g_hBmpOld = SelectObject(hdcMem, g_hBmpPicture); + + BitBlt(lpdis->hDC, lpdis->rcItem.left, lpdis->rcItem.top, + lpdis->rcItem.right - lpdis->rcItem.left, + lpdis->rcItem.bottom - lpdis->rcItem.top, + hdcMem, 0, 0, SRCCOPY); + SendMessage(lpdis->hwndItem, LB_GETTEXT, + lpdis->itemID, (LPARAM) szBuf); + + GetTextMetrics(lpdis->hDC, &tm); + y = (lpdis->rcItem.bottom + lpdis->rcItem.top - tm.tmHeight) / 2; + + SelectObject(hdcMem, g_hBmpOld); + DeleteDC(hdcMem); + + rcBitmap.left = lpdis->rcItem.left + XBITMAP + 2; + rcBitmap.top = lpdis->rcItem.top; + rcBitmap.right = lpdis->rcItem.right; + rcBitmap.bottom = lpdis->rcItem.top + YBITMAP; + + if (lpdis->itemState & ODS_SELECTED) + { + if (g_hBmpPicture == g_hBmpStop) + { + Button_Enable(GetDlgItem(hDlg, IDC_SSTART), TRUE); + Button_Enable(GetDlgItem(hDlg, IDC_SSTOP), FALSE); + Button_Enable(GetDlgItem(hDlg, IDC_SRESTART), FALSE); + } + else if (g_hBmpPicture == g_hBmpStart) + { + Button_Enable(GetDlgItem(hDlg, IDC_SSTART), FALSE); + Button_Enable(GetDlgItem(hDlg, IDC_SSTOP), TRUE); + Button_Enable(GetDlgItem(hDlg, IDC_SRESTART), TRUE); + } + else { + Button_Enable(GetDlgItem(hDlg, IDC_SSTART), FALSE); + Button_Enable(GetDlgItem(hDlg, IDC_SSTOP), FALSE); + Button_Enable(GetDlgItem(hDlg, IDC_SRESTART), FALSE); + } + if (_tcscmp(g_stServices[lpdis->itemID].szComputerName, + g_szLocalHost) == 0) { + Button_Enable(GetDlgItem(hDlg, IDC_SDISCONN), FALSE); + } + else { + Button_Enable(GetDlgItem(hDlg, IDC_SDISCONN), TRUE); + } + + if (g_stServices[lpdis->itemID].szDescription) { + SendMessage(hStatusBar, SB_SETTEXT, 0, + (LPARAM)g_stServices[lpdis->itemID].szDescription); + } + else { + SendMessage(hStatusBar, SB_SETTEXT, 0, (LPARAM)_T("")); + } + SetTextColor(lpdis->hDC, GetSysColor(COLOR_HIGHLIGHTTEXT)); + SetBkColor(lpdis->hDC, GetSysColor(COLOR_HIGHLIGHT)); + FillRect(lpdis->hDC, &rcBitmap, (HBRUSH)(COLOR_HIGHLIGHTTEXT)); + } + else + { + SetTextColor(lpdis->hDC, GetSysColor(COLOR_MENUTEXT)); + SetBkColor(lpdis->hDC, GetSysColor(COLOR_WINDOW)); + FillRect(lpdis->hDC, &rcBitmap, (HBRUSH)(COLOR_WINDOW+1)); + } + TextOut(lpdis->hDC, XBITMAP + 6, y, szBuf, (int)_tcslen(szBuf)); + break; + + case ODA_FOCUS: + break; + } + return TRUE; + case WM_COMMAND: + switch (LOWORD(wParam)) + { + case IDL_SERVICES: + switch (HIWORD(wParam)) + { + case LBN_DBLCLK: + /* if started then stop, if stopped then start */ + hListBox = GetDlgItem(hDlg, IDL_SERVICES); + nItem = SendMessage(hListBox, LB_GETCURSEL, 0, 0); + if (nItem != LB_ERR) + { + g_hBmpPicture = (HBITMAP)SendMessage(hListBox, + LB_GETITEMDATA, + nItem, (LPARAM) 0); + if (g_hBmpPicture == g_hBmpStop) { + SendMessage(hDlg, WM_MANAGEMESSAGE, nItem, + SERVICE_CONTROL_CONTINUE); + } + else { + SendMessage(hDlg, WM_MANAGEMESSAGE, nItem, + SERVICE_CONTROL_STOP); + } + + } + return TRUE; + } + break; + + case IDOK: + EndDialog(hDlg, TRUE); + return TRUE; + + case IDC_SSTART: + Button_Enable(GetDlgItem(hDlg, IDC_SSTART), FALSE); + hListBox = GetDlgItem(hDlg, IDL_SERVICES); + nItem = SendMessage(hListBox, LB_GETCURSEL, 0, 0); + if (nItem != LB_ERR) { + SendMessage(hDlg, WM_MANAGEMESSAGE, nItem, + SERVICE_CONTROL_CONTINUE); + } + Button_Enable(GetDlgItem(hDlg, IDC_SSTART), TRUE); + return TRUE; + + case IDC_SSTOP: + Button_Enable(GetDlgItem(hDlg, IDC_SSTOP), FALSE); + hListBox = GetDlgItem(hDlg, IDL_SERVICES); + nItem = SendMessage(hListBox, LB_GETCURSEL, 0, 0); + if (nItem != LB_ERR) { + SendMessage(hDlg, WM_MANAGEMESSAGE, nItem, + SERVICE_CONTROL_STOP); + } + Button_Enable(GetDlgItem(hDlg, IDC_SSTOP), TRUE); + return TRUE; + + case IDC_SRESTART: + Button_Enable(GetDlgItem(hDlg, IDC_SRESTART), FALSE); + hListBox = GetDlgItem(hDlg, IDL_SERVICES); + nItem = SendMessage(hListBox, LB_GETCURSEL, 0, 0); + if (nItem != LB_ERR) { + SendMessage(hDlg, WM_MANAGEMESSAGE, nItem, + SERVICE_APACHE_RESTART); + } + Button_Enable(GetDlgItem(hDlg, IDC_SRESTART), TRUE); + return TRUE; + + case IDC_SMANAGER: + if (g_dwOSVersion >= OS_VERSION_WIN2K) { + ShellExecute(hDlg, _T("open"), _T("services.msc"), _T("/s"), + NULL, SW_NORMAL); + } + else { + WinExec("Control.exe SrvMgr.cpl Services", SW_NORMAL); + } + return TRUE; + + case IDC_SEXIT: + EndDialog(hDlg, TRUE); + SendMessage(g_hwndMain, WM_COMMAND, (WPARAM)IDM_EXIT, 0); + return TRUE; + + case IDC_SCONNECT: + DialogBox(g_hInstance, MAKEINTRESOURCE(IDD_DLGCONNECT), + hDlg, (DLGPROC)ConnectDlgProc); + return TRUE; + + case IDC_SDISCONN: + hListBox = GetDlgItem(hDlg, IDL_SERVICES); + nItem = SendMessage(hListBox, LB_GETCURSEL, 0, 0); + if (nItem != LB_ERR) { + am_DisconnectComputer(g_stServices[nItem].szComputerName); + SendMessage(g_hwndMain, WM_TIMER, WM_TIMER_RESCAN, 0); + } + return TRUE; + } + break; + + case WM_SIZE: + switch (LOWORD(wParam)) + { + case SIZE_MINIMIZED: + EndDialog(hDlg, TRUE); + return TRUE; + break; + } + break; + + case WM_QUIT: + case WM_CLOSE: + EndDialog(hDlg, TRUE); + return TRUE; + + default: + return FALSE; + } + return FALSE; +} + + +LRESULT CALLBACK WndProc(HWND hWnd, UINT message, + WPARAM wParam, LPARAM lParam) +{ + if (message == g_bUiTaskbarCreated) + { + /* restore the tray icon on shell restart */ + ShowNotifyIcon(hWnd, NIM_ADD); + return DefWindowProc(hWnd, message, wParam, lParam); + } + switch (message) + { + case WM_CREATE: + GetApacheServicesStatus(); + ShowNotifyIcon(hWnd, NIM_ADD); + SetTimer(hWnd, WM_TIMER_REFRESH, REFRESH_TIME, NULL); + SetTimer(hWnd, WM_TIMER_RESCAN, RESCAN_TIME, NULL); + break; + + case WM_TIMER: + switch (wParam) + { + case WM_TIMER_RESCAN: + { + int nPrev = 0, nNew = 0; + EnterCriticalSection(&g_stcSection); + if (FindRunningServices() || g_bRescanServices) + { + ShowNotifyIcon(hWnd, NIM_MODIFY); + if (g_hwndServiceDlg) + PostMessage(g_hwndServiceDlg, WM_UPDATEMESSAGE, 0, 0); + } + /* check if services list changed */ + while (g_stServices[nPrev].szServiceName != NULL) + ++nPrev; + GetApacheServicesStatus(); + while (g_stServices[nNew].szServiceName != NULL) + ++nNew; + if (nPrev != nNew) + { + ShowNotifyIcon(hWnd, NIM_MODIFY); + if (g_hwndServiceDlg) { + PostMessage(g_hwndServiceDlg, WM_UPDATEMESSAGE, 0, 0); + } + } + LeaveCriticalSection(&g_stcSection); + break; + } + + case WM_TIMER_REFRESH: + { + int nPrev = 0, nNew = 0; + EnterCriticalSection(&g_stcSection); + if (g_bRescanServices) + { + GetApacheServicesStatus(); + ShowNotifyIcon(hWnd, NIM_MODIFY); + if (g_hwndServiceDlg) { + PostMessage(g_hwndServiceDlg, WM_UPDATEMESSAGE, 0, 0); + } + } + else if (FindRunningServices()) + { + ShowNotifyIcon(hWnd, NIM_MODIFY); + if (g_hwndServiceDlg) { + PostMessage(g_hwndServiceDlg, WM_UPDATEMESSAGE, 0, 0); + } + } + LeaveCriticalSection(&g_stcSection); + break; + } + } + break; + + case WM_QUIT: + ShowNotifyIcon(hWnd, NIM_DELETE); + break; + + case WM_TRAYMESSAGE: + switch (lParam) + { + case WM_LBUTTONDBLCLK: + if (!g_bDlgServiceOn) + { + g_bDlgServiceOn = TRUE; + DialogBox(g_hInstance, MAKEINTRESOURCE(IDD_DLGSERVICES), + hWnd, (DLGPROC)ServiceDlgProc); + g_bDlgServiceOn = FALSE; + g_hwndServiceDlg = NULL; + } + else if (IsWindow(g_hwndServiceDlg)) + { + /* Dirty hack to bring the window to the foreground */ + SetWindowPos(g_hwndServiceDlg, HWND_TOPMOST, 0, 0, 0, 0, + SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW); + SetWindowPos(g_hwndServiceDlg, HWND_NOTOPMOST, 0, 0, 0, 0, + SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW); + SetFocus(g_hwndServiceDlg); + } + break; + + case WM_LBUTTONUP: + ShowTryServicesMenu(hWnd); + break; + + case WM_RBUTTONUP: + ShowTryPopupMenu(hWnd); + break; + } + break; + + case WM_COMMAND: + if ((LOWORD(wParam) & IDM_SM_START) == IDM_SM_START) + { + ApacheManageService(g_stServices[LOWORD(wParam) + - IDM_SM_START].szServiceName, + g_stServices[LOWORD(wParam) + - IDM_SM_START].szImagePath, + g_stServices[LOWORD(wParam) + - IDM_SM_START].szComputerName, + SERVICE_CONTROL_CONTINUE); + return TRUE; + } + else if ((LOWORD(wParam) & IDM_SM_STOP) == IDM_SM_STOP) + { + ApacheManageService(g_stServices[LOWORD(wParam) + - IDM_SM_STOP].szServiceName, + g_stServices[LOWORD(wParam) + - IDM_SM_STOP].szImagePath, + g_stServices[LOWORD(wParam) + - IDM_SM_STOP].szComputerName, + SERVICE_CONTROL_STOP); + return TRUE; + } + else if ((LOWORD(wParam) & IDM_SM_RESTART) == IDM_SM_RESTART) + { + ApacheManageService(g_stServices[LOWORD(wParam) + - IDM_SM_RESTART].szServiceName, + g_stServices[LOWORD(wParam) + - IDM_SM_RESTART].szImagePath, + g_stServices[LOWORD(wParam) + - IDM_SM_RESTART].szComputerName, + SERVICE_APACHE_RESTART); + return TRUE; + } + switch (LOWORD(wParam)) + { + case IDM_RESTORE: + if (!g_bDlgServiceOn) + { + g_bDlgServiceOn = TRUE; + DialogBox(g_hInstance, MAKEINTRESOURCE(IDD_DLGSERVICES), + hWnd, (DLGPROC)ServiceDlgProc); + g_bDlgServiceOn = FALSE; + g_hwndServiceDlg = NULL; + } + else if (IsWindow(g_hwndServiceDlg)) { + SetFocus(g_hwndServiceDlg); + } + break; + + case IDC_SMANAGER: + if (g_dwOSVersion >= OS_VERSION_WIN2K) { + ShellExecute(NULL, _T("open"), _T("services.msc"), _T("/s"), + NULL, SW_NORMAL); + } + else { + WinExec("Control.exe SrvMgr.cpl Services", SW_NORMAL); + } + return TRUE; + + case IDM_EXIT: + ShowNotifyIcon(hWnd, NIM_DELETE); + PostQuitMessage(0); + return TRUE; + } + + default: + return DefWindowProc(hWnd, message, wParam, lParam); + } + + return FALSE; +} + + +static int KillAWindow(HWND appwindow) +{ + HANDLE appproc; + DWORD procid; + BOOL postres; + + SetLastError(0); + GetWindowThreadProcessId(appwindow, &procid); + if (GetLastError()) + return(2); + + appproc = OpenProcess(SYNCHRONIZE, 0, procid); + postres = PostMessage(appwindow, WM_COMMAND, IDM_EXIT, 0); + if (appproc && postres) { + if (WaitForSingleObject(appproc, 10 /* seconds */ * 1000) + == WAIT_OBJECT_0) { + CloseHandle(appproc); + return (0); + } + } + if (appproc) + CloseHandle(appproc); + + if ((appproc = OpenProcess(PROCESS_TERMINATE, 0, procid)) != NULL) { + if (TerminateProcess(appproc, 0)) { + CloseHandle(appproc); + return (0); + } + CloseHandle(appproc); + } + + /* Perhaps we were short of permissions? */ + return (2); +} + + +static int KillAllMonitors(void) +{ + HWND appwindow; + int exitcode = 0; + PWTS_PROCESS_INFO tsProcs; + DWORD tsProcCount, i; + DWORD thisProcId; + + /* This is graceful, close our own Window, clearing the icon */ + if ((appwindow = FindWindow(g_szWindowClass, g_szTitle)) != NULL) + exitcode = KillAWindow(appwindow); + + if (g_dwOSVersion < OS_VERSION_WIN2K) + return exitcode; + + thisProcId = GetCurrentProcessId(); + + if (!WTSEnumerateProcesses(WTS_CURRENT_SERVER_HANDLE, 0, 1, + &tsProcs, &tsProcCount)) + return exitcode; + + /* This is ungraceful; close other Windows, with a lingering icon. + * Since on terminal server it's not possible to post the message + * to exit across sessions, we have to suffer this side effect + * of a taskbar 'icon' which will evaporate the next time that + * the user hovers over it or when the taskbar area is updated. + */ + for (i = 0; i < tsProcCount; ++i) { + if (_tcscmp(tsProcs[i].pProcessName, _T(AM_STRINGIFY(BIN_NAME))) == 0 + && tsProcs[i].ProcessId != thisProcId) + WTSTerminateProcess(WTS_CURRENT_SERVER_HANDLE, + tsProcs[i].ProcessId, 1); + } + WTSFreeMemory(tsProcs); + return exitcode; +} + + +/* Create main invisible window */ +HWND CreateMainWindow(HINSTANCE hInstance) +{ + HWND hWnd = NULL; + WNDCLASSEX wcex; + + wcex.cbSize = sizeof(WNDCLASSEX); + + wcex.style = CS_HREDRAW | CS_VREDRAW; + wcex.lpfnWndProc = (WNDPROC)WndProc; + wcex.cbClsExtra = 0; + wcex.cbWndExtra = 0; + wcex.hInstance = hInstance; + wcex.hIcon = (HICON)LoadImage(hInstance, MAKEINTRESOURCE(IDI_APSRVMON), + IMAGE_ICON, 32, 32, LR_DEFAULTCOLOR); + wcex.hCursor = g_hCursorArrow; + wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); + wcex.lpszMenuName = 0; + wcex.lpszClassName = g_szWindowClass; + wcex.hIconSm = (HICON)LoadImage(hInstance, MAKEINTRESOURCE(IDI_APSRVMON), + IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR); + + if (RegisterClassEx(&wcex)) { + hWnd = CreateWindow(g_szWindowClass, g_szTitle, + 0, 0, 0, 0, 0, + NULL, NULL, hInstance, NULL); + } + return hWnd; +} + + +#ifndef UNICODE +/* Borrowed from CRT internal.h for _MBCS argc/argv parsing in this GUI app */ +int __cdecl _setargv(void); +#endif + +int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, + LPSTR lpCmdLine, int nCmdShow) +{ + TCHAR szTmp[MAX_LOADSTRING]; + TCHAR szCmp[MAX_COMPUTERNAME_LENGTH+4]; + MSG msg; + /* existing window */ + HWND appwindow; + DWORD dwControl; + int i; + DWORD d; + + if (!GetSystemOSVersion(&g_dwOSVersion)) + { + ErrorMessage(NULL, TRUE); + return 1; + } + + g_LangID = GetUserDefaultLangID(); + if ((g_LangID & 0xFF) != LANG_ENGLISH) { + g_LangID = MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL); + } + for (i = IDS_MSG_FIRST; i <= IDS_MSG_LAST; ++i) { + LoadString(hInstance, i, szTmp, MAX_LOADSTRING); + g_lpMsg[i - IDS_MSG_FIRST] = _tcsdup(szTmp); + } + LoadString(hInstance, IDS_APMONITORTITLE, szTmp, MAX_LOADSTRING); + d = MAX_COMPUTERNAME_LENGTH+1; + _tcscpy(szCmp, _T("\\\\")); + GetComputerName(szCmp + 2, &d); + _tcsupr(szCmp); + g_szLocalHost = _tcsdup(szCmp); + + memset(g_stComputers, 0, sizeof(ST_MONITORED_COMP) * MAX_APACHE_COMPUTERS); + g_stComputers[0].szComputerName = _tcsdup(szCmp); + g_stComputers[0].hRegistry = HKEY_LOCAL_MACHINE; + g_szTitle = _tcsdup(szTmp); + LoadString(hInstance, IDS_APMONITORCLASS, szTmp, MAX_LOADSTRING); + g_szWindowClass = _tcsdup(szTmp); + + appwindow = FindWindow(g_szWindowClass, g_szTitle); + +#ifdef UNICODE + __wargv = CommandLineToArgvW(GetCommandLineW(), &__argc); +#else + _setargv(); +#endif + + if ((__argc == 2) && (_tcscmp(__targv[1], _T("--kill")) == 0)) + { + /* Off to chase and close up every ApacheMonitor taskbar window */ + return KillAllMonitors(); + } + else if ((__argc == 4) && (g_dwOSVersion >= OS_VERSION_WIN2K)) + { + dwControl = _ttoi(__targv[1]); + if ((dwControl != SERVICE_CONTROL_CONTINUE) && + (dwControl != SERVICE_APACHE_RESTART) && + (dwControl != SERVICE_CONTROL_STOP)) + { + return 1; + } + + /* Chase down and close up our session's previous window */ + if ((appwindow) != NULL) + KillAWindow(appwindow); + } + else if (__argc != 1) { + return 1; + } + else if (appwindow) + { + ErrorMessage(g_lpMsg[IDS_MSG_APPRUNNING - IDS_MSG_FIRST], FALSE); + return 0; + } + + g_icoStop = LoadImage(hInstance, MAKEINTRESOURCE(IDI_ICOSTOP), + IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR); + g_icoRun = LoadImage(hInstance, MAKEINTRESOURCE(IDI_ICORUN), + IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR); + g_hCursorHourglass = LoadImage(NULL, MAKEINTRESOURCE(OCR_WAIT), + IMAGE_CURSOR, LR_DEFAULTSIZE, + LR_DEFAULTSIZE, LR_SHARED); + g_hCursorArrow = LoadImage(NULL, MAKEINTRESOURCE(OCR_NORMAL), + IMAGE_CURSOR, LR_DEFAULTSIZE, + LR_DEFAULTSIZE, LR_SHARED); + g_hBmpStart = LoadImage(hInstance, MAKEINTRESOURCE(IDB_BMPRUN), + IMAGE_BITMAP, XBITMAP, YBITMAP, + LR_DEFAULTCOLOR); + g_hBmpStop = LoadImage(hInstance, MAKEINTRESOURCE(IDB_BMPSTOP), + IMAGE_BITMAP, XBITMAP, YBITMAP, + LR_DEFAULTCOLOR); + + memset(g_stServices, 0, sizeof(ST_APACHE_SERVICE) * MAX_APACHE_SERVICES); + CoInitialize(NULL); + InitCommonControls(); + g_hInstance = hInstance; + g_hwndMain = CreateMainWindow(hInstance); + g_bUiTaskbarCreated = RegisterWindowMessage(_T("TaskbarCreated")); + InitializeCriticalSection(&g_stcSection); + g_hwndServiceDlg = NULL; + if (g_hwndMain != NULL) + { + /* To avoid recursion, pass ImagePath NULL (a noop on NT and later) */ + if ((__argc == 4) && (g_dwOSVersion >= OS_VERSION_WIN2K)) + ApacheManageService(__targv[2], NULL, __targv[3], dwControl); + + while (GetMessage(&msg, NULL, 0, 0) == TRUE) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + am_ClearServicesSt(); + } + am_ClearComputersSt(); + DeleteCriticalSection(&g_stcSection); + DestroyIcon(g_icoStop); + DestroyIcon(g_icoRun); + DestroyCursor(g_hCursorHourglass); + DestroyCursor(g_hCursorArrow); + DeleteObject(g_hBmpStart); + DeleteObject(g_hBmpStop); + CoUninitialize(); + return 0; +} + diff --git a/rubbos/app/httpd-2.0.64/support/win32/ApacheMonitor.dsp b/rubbos/app/httpd-2.0.64/support/win32/ApacheMonitor.dsp new file mode 100644 index 00000000..84369aaa --- /dev/null +++ b/rubbos/app/httpd-2.0.64/support/win32/ApacheMonitor.dsp @@ -0,0 +1,143 @@ +# Microsoft Developer Studio Project File - Name="ApacheMonitor" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=ApacheMonitor - 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 "ApacheMonitor.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 "ApacheMonitor.mak" CFG="ApacheMonitor - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "ApacheMonitor - Win32 Release" (based on "Win32 (x86) Application") +!MESSAGE "ApacheMonitor - Win32 Debug" (based on "Win32 (x86) Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "ApacheMonitor - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /EHsc /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /FD /c +# ADD CPP /nologo /MD /W3 /EHsc /O2 /Oy- /Zi /I "../../include" /I "../../srclib/apr/include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "STRICT" /Fd"Release/ApacheMonitor_src" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /i "../../include" /I "../../srclib/apr/include" /d "NDEBUG" /d "APP_FILE" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib comctl32.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib wtsapi32.lib /nologo /subsystem:windows +# ADD LINK32 kernel32.lib user32.lib gdi32.lib comctl32.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib wtsapi32.lib /nologo /subsystem:windows /debug /opt:ref +# Begin Special Build Tool +TargetPath=.\Release\ApacheMonitor.exe +SOURCE="$(InputPath)" +PostBuild_Desc=Embed .manifest +PostBuild_Cmds=if exist $(TargetPath).manifest mt.exe -manifest $(TargetPath).manifest -outputresource:$(TargetPath);2 +# End Special Build Tool + +!ELSEIF "$(CFG)" == "ApacheMonitor - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /FD /c +# ADD CPP /nologo /MDd /W3 /Gm /EHsc /Zi /Od /I "../../include" /I "../../srclib/apr/include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "STRICT" /Fd"Debug/ApacheMonitor_src" /FD /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /i "../../include" /I "../../srclib/apr/include" /d "_DEBUG" /d "APP_FILE" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib comctl32.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib wtsapi32.lib /nologo /subsystem:windows /debug +# ADD LINK32 kernel32.lib user32.lib gdi32.lib comctl32.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib wtsapi32.lib /nologo /subsystem:windows /incremental:no /debug +# Begin Special Build Tool +TargetPath=.\Debug\ApacheMonitor.exe +SOURCE="$(InputPath)" +PostBuild_Desc=Embed .manifest +PostBuild_Cmds=if exist $(TargetPath).manifest mt.exe -manifest $(TargetPath).manifest -outputresource:$(TargetPath);2 +# End Special Build Tool + +!ENDIF + +# Begin Target + +# Name "ApacheMonitor - Win32 Release" +# Name "ApacheMonitor - Win32 Debug" +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# Begin Source File + +SOURCE=.\apache_header.bmp +# End Source File +# Begin Source File + +SOURCE=.\ApacheMonitor.ico +# End Source File +# Begin Source File + +SOURCE=.\aprun.ico +# End Source File +# Begin Source File + +SOURCE=.\apstop.ico +# End Source File +# Begin Source File + +SOURCE=.\srun.bmp +# End Source File +# Begin Source File + +SOURCE=.\sstop.bmp +# End Source File +# End Group +# Begin Source File + +SOURCE=.\ApacheMonitor.c +# End Source File +# Begin Source File + +SOURCE=.\ApacheMonitor.h +# End Source File +# Begin Source File + +SOURCE=.\ApacheMonitor.rc +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/support/win32/ApacheMonitor.h b/rubbos/app/httpd-2.0.64/support/win32/ApacheMonitor.h new file mode 100644 index 00000000..085c45f8 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/support/win32/ApacheMonitor.h @@ -0,0 +1,78 @@ +/* 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. + */ + +/** + * @file ApacheMonitor.h + * @brief Resource definitions for ApacheMonitor.rc and ApacheMonitor.c + */ +#define BIN_NAME ApacheMonitor.exe + +#define IDD_DLGSERVICES 101 +#define IDS_APMONITORTITLE 102 +#define IDS_APMONITORCLASS 103 +#define IDM_RESTORE 104 +#define IDM_EXIT 105 +#define IDI_APSRVMON 106 +#define IDI_ICOSTOP 107 +#define IDI_ICORUN 108 +#define IDC_STATBAR 109 +#define IDC_SSTATUS 110 +#define IDB_BMPSTOP 111 +#define IDB_BMPRUN 112 +#define IDB_BMPHEADER 114 +#define IDL_SERVICES 115 +#define IDL_STDOUT 116 +#define IDC_SSTART 117 +#define IDC_SSTOP 118 +#define IDC_SRESTART 119 +#define IDC_SEXIT 120 +#define IDC_SMANAGER 121 +#define IDD_DLGCONNECT 122 +#define IDC_LREMOTE 123 +#define IDC_LBROWSE 124 +#define IDC_COMPUTER 125 +#define IDC_SCONNECT 126 +#define IDC_SDISCONN 127 +#define IDS_MSG_FIRST 256 +#define IDS_MSG_APPRUNNING 256 +#define IDS_MSG_ERROR 257 +#define IDS_MSG_RUNNINGALL 258 +#define IDS_MSG_RUNNING 259 +#define IDS_MSG_RUNNINGNONE 260 +#define IDS_MSG_NOSERVICES 261 +#define IDS_MSG_MNUSERVICES 262 +#define IDS_MSG_MNUSHOW 263 +#define IDS_MSG_MNUEXIT 264 +#define IDS_MSG_SRVSTART 265 +#define IDS_MSG_SRVSTARTED 266 +#define IDS_MSG_SRVSTOP 267 +#define IDS_MSG_SRVSTOPPED 268 +#define IDS_MSG_SRVRESTART 269 +#define IDS_MSG_SRVRESTARTED 270 +#define IDS_MSG_SRVFAILED 271 +#define IDS_MSG_SSTART 272 +#define IDS_MSG_SSTOP 273 +#define IDS_MSG_SRESTART 274 +#define IDS_MSG_SERVICES 275 +#define IDS_MSG_CONNECT 276 +#define IDS_MSG_ECONNECT 277 +#define IDS_MSG_LAST 277 +#define IDM_SM_SERVICE 0x1100 +#define IDM_SM_START 0x1200 +#define IDM_SM_STOP 0x1400 +#define IDM_SM_RESTART 0x1800 +#define IDC_STATIC -1 + diff --git a/rubbos/app/httpd-2.0.64/support/win32/ApacheMonitor.ico b/rubbos/app/httpd-2.0.64/support/win32/ApacheMonitor.ico new file mode 100644 index 0000000000000000000000000000000000000000..cd28dc520c46b6b6bae3d12fd47d6084b98702e9 GIT binary patch literal 1078 zcma)5J&W5w5Pf^Ta8VOkW7=xeCBs zOkX@V68?4EFEE8_LWAu$Fh#A~G|P_sRkw+TN3Oc%4xY~?)a`M1}`TGP? zeHXso-&d-1V#WCP1hPu2Io~_)ZWAn4lQrE@S0OOGlEX_ucUt*}(Hxw+Ay1Q&Xk2ph z^k;qCjK#j-U%sBL{H(i|ccj*O>5qUUKfG&v{RC_Bf~P=~i*% z^! + +#include "ApacheMonitor.h" + +IDI_APSRVMON ICON DISCARDABLE "ApacheMonitor.ico" +IDI_ICOSTOP ICON DISCARDABLE "apstop.ico" +IDI_ICORUN ICON DISCARDABLE "aprun.ico" + +IDD_DLGSERVICES DIALOGEX 0, 0, 350, 188 +STYLE DS_MODALFRAME | DS_SETFOREGROUND | WS_MINIMIZEBOX | WS_VISIBLE | + WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_CONTROLPARENT +CAPTION "Apache Service Monitor" +FONT 8, "MS Sans Serif" +BEGIN + DEFPUSHBUTTON "&OK",IDOK,298,49,50,14 + LTEXT "Service St&atus :",IDC_SSTATUS,3,40,272,8 + LISTBOX IDL_SERVICES,2,49,285,73,LBS_OWNERDRAWFIXED | + LBS_HASSTRINGS | LBS_USETABSTOPS | LBS_NOINTEGRALHEIGHT | + LBS_DISABLENOSCROLL | WS_VSCROLL | WS_TABSTOP + LISTBOX IDL_STDOUT,2,124,285,51,LBS_NOINTEGRALHEIGHT | + LBS_DISABLENOSCROLL | LBS_NOSEL | WS_VSCROLL + PUSHBUTTON "&Start",IDC_SSTART,298,65,50,14 + PUSHBUTTON "S&top",IDC_SSTOP,298,81,50,14 + PUSHBUTTON "&Restart",IDC_SRESTART,298,97,50,14 + PUSHBUTTON "Ser&vices",IDC_SMANAGER,298,113,50,14 + CONTROL IDB_BMPHEADER,IDC_STATIC,"Static",SS_BITMAP,0,0,349,38 + PUSHBUTTON "&Connect",IDC_SCONNECT,298,129,50,14 + PUSHBUTTON "&Disconnect",IDC_SDISCONN,298,145,50,14 + PUSHBUTTON "E&xit",IDC_SEXIT,298,161,50,14 +END + +IDD_DLGCONNECT DIALOGEX 0, 0, 240, 54 +STYLE DS_MODALFRAME | DS_SETFOREGROUND | WS_VISIBLE | WS_CLIPCHILDREN | + WS_CAPTION | WS_SYSMENU +EXSTYLE WS_EX_CONTROLPARENT +CAPTION "Connect To A Remote Computer" +FONT 8, "MS Sans Serif" +BEGIN + LTEXT "Computer &Name:",IDC_LREMOTE,7,4,155,8 + EDITTEXT IDC_COMPUTER,7,14,169,14,ES_AUTOHSCROLL + DEFPUSHBUTTON "&OK",IDOK,183,14,50,14 + PUSHBUTTON "&Cancel",IDCANCEL,183,34,50,14 + PUSHBUTTON "&Browse",IDC_LBROWSE,7,34,50,14 +END + +IDB_BMPSTOP BITMAP DISCARDABLE "sstop.bmp" +IDB_BMPRUN BITMAP DISCARDABLE "srun.bmp" +IDB_BMPHEADER BITMAP DISCARDABLE "apache_header.bmp" + +STRINGTABLE DISCARDABLE +BEGIN + IDS_APMONITORTITLE "Apache Service Monitor" + IDS_APMONITORCLASS "ApacheServiceMonitorClass" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_MSG_APPRUNNING "Apache monitor is already started" + IDS_MSG_ERROR "Error" + IDS_MSG_RUNNINGALL "Running all Apache services" + IDS_MSG_RUNNING "Running %d of %d Apache services" + IDS_MSG_RUNNINGNONE "Running none of %d Apache services" + IDS_MSG_NOSERVICES "No services installed" + IDS_MSG_MNUSERVICES "Open &Services" + IDS_MSG_MNUSHOW "&Open Apache Monitor" + IDS_MSG_MNUEXIT "E&xit" + IDS_MSG_SRVSTART "The %s service is starting." + IDS_MSG_SRVSTARTED "The %s service has started." + IDS_MSG_SRVSTOP "The %s service is stopping." + IDS_MSG_SRVSTOPPED "The %s service has stopped." + IDS_MSG_SRVRESTART "The %s service is restarting." + IDS_MSG_SRVRESTARTED "The %s service has restarted." + IDS_MSG_SRVFAILED "The requested operation has failed!" + IDS_MSG_SSTART "&Start" + IDS_MSG_SSTOP "S&top" + IDS_MSG_SRESTART "&Restart" + IDS_MSG_SERVICES "Ser&vices" + IDS_MSG_CONNECT "&Connect" + IDS_MSG_ECONNECT "Unable to connect to the remote registry on %s" +END diff --git a/rubbos/app/httpd-2.0.64/support/win32/apache_header.bmp b/rubbos/app/httpd-2.0.64/support/win32/apache_header.bmp new file mode 100644 index 0000000000000000000000000000000000000000..7340fac2acc7ba165617fa4e277abc3162e9d673 GIT binary patch literal 6498 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 literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/support/win32/srun.bmp b/rubbos/app/httpd-2.0.64/support/win32/srun.bmp new file mode 100644 index 0000000000000000000000000000000000000000..90ecd46f178a3444a81a1ef511b643d5b1400a3e GIT binary patch literal 246 zcmZupF%p0<2*W$~`V6=J!QJmT^PVn#p-=KUIJm?B?YT%B5(u#Ew?rJIl~_6^ncYy& ze~FHnszJ<@gi5WI2K)&q+xxh1{}np-1Z}0R)>Wr literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/support/win32/sstop.bmp b/rubbos/app/httpd-2.0.64/support/win32/sstop.bmp new file mode 100644 index 0000000000000000000000000000000000000000..ba73d87aecb8d15cf2270fa70d185c05e980234d GIT binary patch literal 246 zcmZ?r{l)+RWk5;;hy|dSk%0v)(Eui~5kMJ`WJ3dl0+K)`5H~O!IB) + * + * Note: this implementation is _very_ experimental, and error handling + * is far from complete. Using it as a cgi or pipe process allows the + * programmer to discover if facilities such as reliable piped logs + * are working as expected, or answer operator prompts that would + * otherwise be discarded by the service process. + * + * Also note the isservice detection semantics, which far exceed any + * mechanism we have discovered thus far. + * + * -------------------------------------------------------------------- + */ + +#define WIN32_LEAN_AND_MEAN + +#if defined(_MSC_VER) && _MSC_VER >= 1400 +#define _CRT_SECURE_NO_DEPRECATE +#pragma warning(disable: 4996) +#endif + +#include +#include +#include + +const char *options = +"\nwintty: a utility for echoing the stdin stream to a new console window,\n" +"\teven when invoked from within a service (such as the Apache server.)\n" +"\tAlso reflects the console input back to the stdout stream, allowing\n" +"\tthe operator to respond to prompts from the context of a service.\n\n" +"Syntax: %s [opts] [-t \"Window Title\"]\n\n" +" opts: -c{haracter} or -l{ine} input\n" +"\t-q{uiet} or -e{cho} input\n" +"\t-u{nprocessed} or -p{rocessed} input\n" +"\t-n{owrap} or -w{rap} output lines\n" +"\t-f{ormatted} or -r{aw} output lines\n" +"\t-O{output} [number of seconds]\n" +"\t-v{erbose} error reporting (for debugging)\n" +"\t-? for this message\n\n"; + +BOOL verbose = FALSE; + +void printerr(char *fmt, ...) +{ + char str[1024]; + va_list args; + if (!verbose) + return; + va_start(args, fmt); + wvsprintf(str, fmt, args); + OutputDebugString(str); +} + +DWORD WINAPI feedback(LPVOID args); + +typedef struct feedback_args_t { + HANDLE in; + HANDLE out; +} feedback_args_t; + +int main(int argc, char** argv) +{ + char str[1024], *contitle = NULL; + HANDLE hproc, thread; + HANDLE hwinsta = NULL, hsavewinsta; + HANDLE hdesk = NULL, hsavedesk = NULL; + HANDLE conin, conout; + HANDLE hstdin, hstdout, hstderr, hdup; + feedback_args_t feed; + DWORD conmode; + DWORD newinmode = 0, notinmode = 0; + DWORD newoutmode = 0, notoutmode = 0; + DWORD tid; + DWORD len; + DWORD timeout = INFINITE; + BOOL isservice = FALSE; + char *arg0 = argv[0]; + + while (--argc) { + ++argv; + if (**argv == '/' || **argv == '-') { + switch (tolower((*argv)[1])) { + case 'c': + notinmode |= ENABLE_LINE_INPUT; break; + case 'l': + newinmode |= ENABLE_LINE_INPUT; break; + case 'q': + notinmode |= ENABLE_ECHO_INPUT; break; + case 'e': + newinmode |= ENABLE_ECHO_INPUT; break; + case 'u': + notinmode |= ENABLE_PROCESSED_INPUT; break; + case 'p': + newinmode |= ENABLE_PROCESSED_INPUT; break; + case 'n': + notoutmode |= ENABLE_WRAP_AT_EOL_OUTPUT; break; + case 'w': + newoutmode |= ENABLE_WRAP_AT_EOL_OUTPUT; break; + case 'r': + notoutmode |= ENABLE_PROCESSED_OUTPUT; break; + case 'f': + newoutmode |= ENABLE_PROCESSED_OUTPUT; break; + case 'o': + if (*(argv + 1) && *(argv + 1)[0] != '-') { + *(++argv); + timeout = atoi(*argv) / 1000; + --argc; + } + else { + timeout = 0; + } + break; + case 'v': + verbose = TRUE; + break; + case 't': + contitle = *(++argv); + --argc; + break; + case '?': + printf(options, arg0); + exit(1); + default: + printf("wintty option %s not recognized, use -? for help.\n\n", *argv); + exit(1); + } + } + else { + printf("wintty argument %s not understood, use -? for help.\n\n", *argv); + exit(1); + } + } + + hproc = GetCurrentProcess(); + hsavewinsta = GetProcessWindowStation(); + if (!hsavewinsta || hsavewinsta == INVALID_HANDLE_VALUE) { + printerr("GetProcessWindowStation() failed (%d)\n", GetLastError()); + } + else if (!GetUserObjectInformation(hsavewinsta, UOI_NAME, str, sizeof(str), &len)) { + printerr("GetUserObjectInfoformation(hWinSta) failed (%d)\n", GetLastError()); + } + else if (strnicmp(str, "Service-", 8) == 0) { + printerr("WindowStation Name %s is a service\n", str); + isservice = TRUE; + } + SetLastError(0); + + hstdin = GetStdHandle(STD_INPUT_HANDLE); + if (!hstdin || hstdin == INVALID_HANDLE_VALUE) { + printerr("GetStdHandle(STD_INPUT_HANDLE) failed (%d)\n", + GetLastError()); + } + else if (DuplicateHandle(hproc, hstdin, hproc, &hdup, 0, + isservice, DUPLICATE_SAME_ACCESS)) { + CloseHandle(hstdin); + hstdin = hdup; + } + else { + printerr("DupHandle(stdin [%x]) failed (%d)\n", + hstdin, GetLastError()); + } + + hstdout = GetStdHandle(STD_OUTPUT_HANDLE); + if (!hstdout || hstdout == INVALID_HANDLE_VALUE) { + printerr("GetStdHandle(STD_OUTPUT_HANDLE) failed (%d)\n", + GetLastError()); + } + else if (DuplicateHandle(hproc, hstdout, hproc, &hdup, 0, + isservice, DUPLICATE_SAME_ACCESS)) { + CloseHandle(hstdout); + hstdout = hdup; + } + else { + printerr("DupHandle(stdout [%x]) failed (%d)\n", + hstdout, GetLastError()); + } + + hstderr = GetStdHandle(STD_ERROR_HANDLE); + if (!hstderr || hstderr == INVALID_HANDLE_VALUE) { + printerr("GetStdHandle(STD_ERROR_HANDLE) failed (%d)\n", + GetLastError()); + } + else if (DuplicateHandle(hproc, hstderr, hproc, &hdup, 0, + isservice, DUPLICATE_SAME_ACCESS)) { + CloseHandle(hstderr); + hstderr = hdup; + } + else { + printerr("DupHandle(stderr [%x]) failed (%d)\n", + hstderr, GetLastError()); + } + + /* You can't close the console till all the handles above were + * rescued by DuplicateHandle() + */ + if (!FreeConsole()) + printerr("FreeConsole() failed (%d)\n", GetLastError()); + + if (isservice) { +#ifdef WE_EVER_FIGURE_OUT_WHY_THIS_DOESNT_WORK + hsavedesk = GetThreadDesktop(GetCurrentThreadId()); + if (!hsavedesk || hsavedesk == INVALID_HANDLE_VALUE) { + printerr("GetThreadDesktop(GetTID()) failed (%d)\n", GetLastError()); + } + CloseWindowStation(hwinsta); + hwinsta = OpenWindowStation("WinSta0", TRUE, MAXIMUM_ALLOWED); + if (!hwinsta || hwinsta == INVALID_HANDLE_VALUE) { + printerr("OpenWinSta(WinSta0) failed (%d)\n", GetLastError()); + } + else if (!SetProcessWindowStation(hwinsta)) { + printerr("SetProcWinSta(WinSta0) failed (%d)\n", GetLastError()); + } + hdesk = OpenDesktop("Default", 0, TRUE, MAXIMUM_ALLOWED); + if (!hdesk || hdesk == INVALID_HANDLE_VALUE) { + printerr("OpenDesktop(Default) failed (%d)\n", GetLastError()); + } + else if (!SetThreadDesktop(hdesk)) { + printerr("SetThreadDesktop(Default) failed (%d)\n", GetLastError()); + } +#else + PROCESS_INFORMATION pi; + STARTUPINFO si; + DWORD exitcode = 1; + char appbuff[MAX_PATH]; + char *appname = NULL; + char *cmdline = GetCommandLine(); + + if (!GetModuleFileName(NULL, appbuff, sizeof(appbuff))) { + appname = appbuff; + } + + memset(&si, 0, sizeof(si)); + si.cb = sizeof(si); + si.dwFlags = STARTF_USESHOWWINDOW + | STARTF_USESTDHANDLES; + si.lpDesktop = "WinSta0\\Default"; + si.wShowWindow = 1; /* SW_SHOWNORMAL */ + si.hStdInput = hstdin; + si.hStdOutput = hstdout; + si.hStdError = hstderr; + + /* Instantly, upon creating the new process, we will close our + * copies of the handles so our parent isn't confused when the + * child closes their copy of the handle. Without this action, + * we would hold a copy of the handle, and the parent would not + * receive their EOF notification. + */ + if (CreateProcess(appname, cmdline, NULL, NULL, TRUE, + CREATE_SUSPENDED | CREATE_NEW_CONSOLE, + NULL, NULL, &si, &pi)) { + CloseHandle(si.hStdInput); + CloseHandle(si.hStdOutput); + CloseHandle(si.hStdError); + ResumeThread(pi.hThread); + CloseHandle(pi.hThread); + WaitForSingleObject(pi.hProcess, INFINITE); + GetExitCodeProcess(pi.hProcess, &exitcode); + CloseHandle(pi.hProcess); + return exitcode; + } + return 1; +#endif + } + + if (!AllocConsole()) { + printerr("AllocConsole(Default) failed (%d)\n", GetLastError()); + } + + if (contitle && !SetConsoleTitle(contitle)) { + printerr("SetConsoleTitle() failed (%d)\n", GetLastError()); + } + + conout = CreateFile("CONOUT$", GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, + FALSE, OPEN_EXISTING, 0, NULL); + if (!conout || conout == INVALID_HANDLE_VALUE) { + printerr("CreateFile(CONOUT$) failed (%d)\n", GetLastError()); + } + else if (!GetConsoleMode(conout, &conmode)) { + printerr("GetConsoleMode(CONOUT) failed (%d)\n", GetLastError()); + } + else if (!SetConsoleMode(conout, conmode = ((conmode | newoutmode) + & ~notoutmode))) { + printerr("SetConsoleMode(CONOUT, 0x%x) failed (%d)\n", + conmode, GetLastError()); + } + + conin = CreateFile("CONIN$", GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, + FALSE, OPEN_EXISTING, 0, NULL); + if (!conin || conin == INVALID_HANDLE_VALUE) { + printerr("CreateFile(CONIN$) failed (%d)\n", GetLastError()); + } + else if (!GetConsoleMode(conin, &conmode)) { + printerr("GetConsoleMode(CONIN) failed (%d)\n", GetLastError()); + } + else if (!SetConsoleMode(conin, conmode = ((conmode | newinmode) + & ~notinmode))) { + printerr("SetConsoleMode(CONIN, 0x%x) failed (%d)\n", + conmode, GetLastError()); + } + + feed.in = conin; + feed.out = hstdout; + thread = CreateThread(NULL, 0, feedback, (LPVOID)&feed, 0, &tid); + + while (ReadFile(hstdin, str, sizeof(str), &len, NULL)) + if (!len || !WriteFile(conout, str, len, &len, NULL)) + break; + + printerr("[EOF] from stdin (%d)\n", GetLastError()); + + CloseHandle(stdout); + if (!GetConsoleTitle(str, sizeof(str))) { + printerr("SetConsoleTitle() failed (%d)\n", GetLastError()); + } + else { + strcat(str, " - [Finished]"); + if (!SetConsoleTitle(str)) { + printerr("SetConsoleTitle() failed (%d)\n", GetLastError()); + } + } + + WaitForSingleObject(thread, timeout); + FreeConsole(); + if (isservice) { + if (!SetProcessWindowStation(hsavewinsta)) { + len = GetLastError(); + } + if (!SetThreadDesktop(hsavedesk)) { + len = GetLastError(); + } + CloseDesktop(hdesk); + CloseWindowStation(hwinsta); + } + return 0; +} + + +DWORD WINAPI feedback(LPVOID arg) +{ + feedback_args_t *feed = (feedback_args_t*)arg; + char *str[1024]; + DWORD len; + + while (ReadFile(feed->in, str, sizeof(str), &len, NULL)) + if (!len || !WriteFile(feed->out, str, len, &len, NULL)) + break; + + printerr("[EOF] from Console (%d)\n", GetLastError()); + + return 0; +} diff --git a/rubbos/app/httpd-2.0.64/support/win32/wintty.dsp b/rubbos/app/httpd-2.0.64/support/win32/wintty.dsp new file mode 100644 index 00000000..17e7c33c --- /dev/null +++ b/rubbos/app/httpd-2.0.64/support/win32/wintty.dsp @@ -0,0 +1,123 @@ +# Microsoft Developer Studio Project File - Name="wintty" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=wintty - 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 "wintty.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 "wintty.mak" CFG="wintty - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "wintty - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "wintty - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "wintty - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "APR_DECLARE_STATIC" /D "APU_DECLARE_STATIC" /FD /c +# ADD CPP /nologo /MD /W3 /Zi /O2 /I "../srclib/apr/include" /I "../srclib/apr-util/include" /D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "APR_DECLARE_STATIC" /D "APU_DECLARE_STATIC" /Fd"Release/wintty_src" /FD /c +# ADD BASE RSC /l 0x409 /d "NDEBUG" +# ADD RSC /l 0x409 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib shell32.lib /nologo /subsystem:console +# ADD LINK32 kernel32.lib user32.lib advapi32.lib shell32.lib /nologo /subsystem:console /debug /opt:ref + +!ELSEIF "$(CFG)" == "wintty - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MDd /W3 /EHsc /Zi /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /D "APR_DECLARE_STATIC" /D "APU_DECLARE_STATIC" /FD /c +# ADD CPP /nologo /MDd /W3 /EHsc /Zi /Od /I "../srclib/apr/include" /I "../srclib/apr-util/include" /D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "APR_DECLARE_STATIC" /D "APU_DECLARE_STATIC" /Fd"Debug/wintty_src" /FD /c +# ADD BASE RSC /l 0x409 /d "_DEBUG" +# ADD RSC /l 0x409 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib advapi32.lib shell32.lib /nologo /subsystem:console /incremental:no /debug +# ADD LINK32 kernel32.lib user32.lib advapi32.lib shell32.lib /nologo /subsystem:console /incremental:no /debug + +!ENDIF + +# Begin Target + +# Name "wintty - Win32 Release" +# Name "wintty - Win32 Debug" +# Begin Source File + +SOURCE=..\..\build\win32\win32ver.awk + +!IF "$(CFG)" == "wintty - Win32 Release" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\wintty.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk wintty.exe "wintty Console Utility" ../../include/ap_release.h > .\wintty.rc + +# End Custom Build + +!ELSEIF "$(CFG)" == "wintty - Win32 Debug" + +# PROP Ignore_Default_Tool 1 +# Begin Custom Build - Creating Version Resource +InputPath=..\..\build\win32\win32ver.awk + +".\wintty.rc" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" + awk -f ../../build/win32/win32ver.awk wintty.exe "wintty Console Utility" ../../include/ap_release.h > .\wintty.rc + +# End Custom Build + +!ENDIF + +# End Source File +# Begin Source File + +SOURCE=.\wintty.c +# End Source File +# Begin Source File + +SOURCE=.\wintty.rc +# End Source File +# End Target +# End Project diff --git a/rubbos/app/httpd-2.0.64/test/.deps b/rubbos/app/httpd-2.0.64/test/.deps new file mode 100644 index 00000000..e69de29b diff --git a/rubbos/app/httpd-2.0.64/test/.indent.pro b/rubbos/app/httpd-2.0.64/test/.indent.pro new file mode 100644 index 00000000..a9fbe9f9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/test/.indent.pro @@ -0,0 +1,54 @@ +-i4 -npsl -di0 -br -nce -d0 -cli0 -npcs -nfc1 +-TBUFF +-TFILE +-TTRANS +-TUINT4 +-T_trans +-Tallow_options_t +-Tapache_sfio +-Tarray_header +-Tbool_int +-Tbuf_area +-Tbuff_struct +-Tbuffy +-Tcmd_how +-Tcmd_parms +-Tcommand_rec +-Tcommand_struct +-Tconn_rec +-Tcore_dir_config +-Tcore_server_config +-Tdir_maker_func +-Tevent +-Tglobals_s +-Thandler_func +-Thandler_rec +-Tjoblist_s +-Tlisten_rec +-Tmerger_func +-Tmode_t +-Tmodule +-Tmodule_struct +-Tmutex +-Tn_long +-Tother_child_rec +-Toverrides_t +-Tparent_score +-Tpid_t +-Tpiped_log +-Tpool +-Trequest_rec +-Trequire_line +-Trlim_t +-Tscoreboard +-Tsemaphore +-Tserver_addr_rec +-Tserver_rec +-Tserver_rec_chain +-Tshort_score +-Ttable +-Ttable_entry +-Tthread +-Tu_wide_int +-Tvtime_t +-Twide_int diff --git a/rubbos/app/httpd-2.0.64/test/Makefile b/rubbos/app/httpd-2.0.64/test/Makefile new file mode 100644 index 00000000..31afa4a2 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/test/Makefile @@ -0,0 +1,25 @@ +top_srcdir = /bottlenecks/rubbos/app/httpd-2.0.64 +top_builddir = /bottlenecks/rubbos/app/httpd-2.0.64 +srcdir = /bottlenecks/rubbos/app/httpd-2.0.64/test +builddir = /bottlenecks/rubbos/app/httpd-2.0.64/test +VPATH = /bottlenecks/rubbos/app/httpd-2.0.64/test + +# no targets: we don't want to build anything by default. if you want the +# test programs, then "make test" +TARGETS = + +PROGRAMS = + +PROGRAM_LDADD = $(EXTRA_LDFLAGS) $(PROGRAM_DEPENDENCIES) $(EXTRA_LIBS) +PROGRAM_DEPENDENCIES = \ + $(top_srcdir)/srclib/apr-util/libaprutil.la \ + $(top_srcdir)/srclib/apr/libapr.la + +include $(top_builddir)/build/rules.mk + +test: $(PROGRAMS) + +# example for building a test proggie +# dbu_OBJECTS = dbu.lo +# dbu: $(dbu_OBJECTS) +# $(LINK) $(dbu_OBJECTS) $(PROGRAM_LDADD) diff --git a/rubbos/app/httpd-2.0.64/test/Makefile.in b/rubbos/app/httpd-2.0.64/test/Makefile.in new file mode 100644 index 00000000..6d834054 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/test/Makefile.in @@ -0,0 +1,20 @@ + +# no targets: we don't want to build anything by default. if you want the +# test programs, then "make test" +TARGETS = + +PROGRAMS = + +PROGRAM_LDADD = $(EXTRA_LDFLAGS) $(PROGRAM_DEPENDENCIES) $(EXTRA_LIBS) +PROGRAM_DEPENDENCIES = \ + $(top_srcdir)/srclib/apr-util/libaprutil.la \ + $(top_srcdir)/srclib/apr/libapr.la + +include $(top_builddir)/build/rules.mk + +test: $(PROGRAMS) + +# example for building a test proggie +# dbu_OBJECTS = dbu.lo +# dbu: $(dbu_OBJECTS) +# $(LINK) $(dbu_OBJECTS) $(PROGRAM_LDADD) diff --git a/rubbos/app/httpd-2.0.64/test/README b/rubbos/app/httpd-2.0.64/test/README new file mode 100644 index 00000000..9f8be502 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/test/README @@ -0,0 +1,3 @@ +This directory contains useful test code for testing various bits +of Apache functionality. This stuff is for the developers only, +so we might remove it on public releases. diff --git a/rubbos/app/httpd-2.0.64/test/check_chunked b/rubbos/app/httpd-2.0.64/test/check_chunked new file mode 100644 index 00000000..50c56eb0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/test/check_chunked @@ -0,0 +1,58 @@ +#!/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. +# +# +# This is meant to be used on the raw output of an HTTP/1.1 connection +# to check that the chunks are all correctly laid out. It's easiest +# to use a tool like netcat to generate the output. This script +# *insists* that \r exist in the output. +# +# You can find netcat at avian.org:/src/hacks/nc110.tgz. + +use strict; + +my $is_chunked = 0; + +# must toss headers +while(<>) { + if (/^Transfer-Encoding:\s+chunked/i) { + $is_chunked = 1; + } + last if ($_ eq "\r\n"); +} + +$is_chunked || die "wasn't chunked\n"; + +for(;;) { + $_ = <> || die "unexpected end of file!\n"; + + m#^([0-9a-f]+) *\r$#i || die "bogus chunklen: $_"; + + my $chunklen = hex($1); + + exit 0 if ($chunklen == 0); + + chop; chop; + print "$_ "; + + my $data = ''; + read(ARGV, $data, $chunklen) == $chunklen || die "short read!\n"; + + $_ = <> || die "unexpected end of file!\n"; + + $_ eq "\r\n" || die "missing chunk trailer!\n"; +} diff --git a/rubbos/app/httpd-2.0.64/test/cls.c b/rubbos/app/httpd-2.0.64/test/cls.c new file mode 100644 index 00000000..bb0a85d1 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/test/cls.c @@ -0,0 +1,182 @@ +/* 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. + */ + +#include +#include +#include +#include +#include + +/* + * Compare a string to a mask + * Mask characters: + * @ - uppercase letter + * # - lowercase letter + * & - hex digit + * # - digit + * * - swallow remaining characters + * - exact match for any other character + */ +static int checkmask(const char *data, const char *mask) +{ + int i, ch, d; + + for (i = 0; mask[i] != '\0' && mask[i] != '*'; i++) { + ch = mask[i]; + d = data[i]; + if (ch == '@') { + if (!isupper(d)) + return 0; + } + else if (ch == '$') { + if (!islower(d)) + return 0; + } + else if (ch == '#') { + if (!isdigit(d)) + return 0; + } + else if (ch == '&') { + if (!isxdigit(d)) + return 0; + } + else if (ch != d) + return 0; + } + + if (mask[i] == '*') + return 1; + else + return (data[i] == '\0'); +} + +/* + * Converts 8 hex digits to a time integer + */ +static int hex2sec(const char *x) +{ + int i, ch; + unsigned int j; + + for (i = 0, j = 0; i < 8; i++) { + ch = x[i]; + j <<= 4; + if (isdigit(ch)) + j |= ch - '0'; + else if (isupper(ch)) + j |= ch - ('A' - 10); + else + j |= ch - ('a' - 10); + } + if (j == 0xffffffff) + return -1; /* so that it works with 8-byte ints */ + else + return j; +} + +int main(int argc, char **argv) +{ + int i, ver; + DIR *d; + struct dirent *e; + const char *s; + FILE *fp; + char path[FILENAME_MAX + 1]; + char line[1035]; + time_t date, lmod, expire; + unsigned int len; + struct tm ts; + char sdate[30], slmod[30], sexpire[30]; + const char time_format[] = "%e %b %Y %R"; + + if (argc != 2) { + printf("Usage: cls directory\n"); + exit(0); + } + + d = opendir(argv[1]); + if (d == NULL) { + perror("opendir"); + exit(1); + } + + for (;;) { + e = readdir(d); + if (e == NULL) + break; + s = e->d_name; + if (s[0] == '.' || s[0] == '#') + continue; + sprintf(path, "%s/%s", argv[1], s); + fp = fopen(path, "r"); + if (fp == NULL) { + perror("fopen"); + continue; + } + if (fgets(line, 1034, fp) == NULL) { + perror("fgets"); + fclose(fp); + continue; + } + if (!checkmask(line, "&&&&&&&& &&&&&&&& &&&&&&&& &&&&&&&& &&&&&&&&\n")) { + fprintf(stderr, "Bad cache file\n"); + fclose(fp); + continue; + } + date = hex2sec(line); + lmod = hex2sec(line + 9); + expire = hex2sec(line + 18); + ver = hex2sec(line + 27); + len = hex2sec(line + 35); + if (fgets(line, 1034, fp) == NULL) { + perror("fgets"); + fclose(fp); + continue; + } + fclose(fp); + i = strlen(line); + if (strncmp(line, "X-URL: ", 7) != 0 || line[i - 1] != '\n') { + fprintf(stderr, "Bad cache file\n"); + continue; + } + line[i - 1] = '\0'; + if (date != -1) { + ts = *gmtime(&date); + strftime(sdate, 30, time_format, &ts); + } + else + strcpy(sdate, "-"); + + if (lmod != -1) { + ts = *gmtime(&lmod); + strftime(slmod, 30, time_format, &ts); + } + else + strcpy(slmod, "-"); + + if (expire != -1) { + ts = *gmtime(&expire); + strftime(sexpire, 30, time_format, &ts); + } + else + strcpy(sexpire, "-"); + + printf("%s: %d; %s %s %s\n", line + 7, ver, sdate, slmod, sexpire); + } + + closedir(d); + return 0; +} diff --git a/rubbos/app/httpd-2.0.64/test/tcpdumpscii.txt b/rubbos/app/httpd-2.0.64/test/tcpdumpscii.txt new file mode 100644 index 00000000..9c1060ed --- /dev/null +++ b/rubbos/app/httpd-2.0.64/test/tcpdumpscii.txt @@ -0,0 +1,50 @@ + +From marcs@znep.com Fri Apr 17 15:16:16 1998 +Date: Sat, 22 Nov 1997 20:44:10 -0700 (MST) +From: Marc Slemko +To: TLOSAP +Subject: Re: Getting ethernet packets content under FreeBSD? (fwd) +Reply-To: new-httpd@apache.org + +Anyone too lazy to hack tcpdump (eg. my tcpdump has a -X option to display +the data in ASCII) can use something like the below to grab HTTP headers +when debugging broken clients. + +Nothing complicated, but handy. + +---------- Forwarded message ---------- +Date: Sat, 22 Nov 1997 14:35:23 PST +From: Bill Fenner +To: Nate Williams +Cc: bmah@ca.sandia.gov, hackers@FreeBSD.ORG +Subject: Re: Getting ethernet packets content under FreeBSD? + +I usually just use this perl script, which I call "tcpdumpscii". +Then run "tcpdumpscii -s 1500 -x [other tcpdump args]". + + Bill + +#!/import/misc/bin/perl +# +# +open(TCPDUMP,"tcpdump -l @ARGV|"); +while () { + if (/^\s+(\S\S)+/) { + $sav = $_; + $asc = ""; + while (s/\s*(\S\S)\s*//) { + $i = hex($1); + if ($i < 32 || $i > 126) { + $asc .= "."; + } else { + $asc .= pack(C,hex($1)); + } + } + $foo = "." x length($asc); + $_ = $sav; + s/\t/ /g; + s/^$foo/$asc/; + } + print; +} + diff --git a/rubbos/app/httpd-2.0.64/test/test-writev.c b/rubbos/app/httpd-2.0.64/test/test-writev.c new file mode 100644 index 00000000..9e7f04aa --- /dev/null +++ b/rubbos/app/httpd-2.0.64/test/test-writev.c @@ -0,0 +1,101 @@ +/* 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. + */ + +/* + test-writev: use this to figure out if your writev() does intelligent + things on the network. Some writev()s when given multiple buffers + will break them up into multiple packets, which is a waste. + + Linux prior to 2.0.31 has this problem. + + Solaris 2.5, 2.5.1 doesn't appear to, 2.6 hasn't been tested. + + IRIX 5.3 doesn't have this problem. + + To use this you want to snoop the wire with tcpdump, and then run + "test-writev a.b.c.d port#" ... against some TCP service on another + box. For example you can run it against port 80 on another server. + You want to look to see how many data packets are sent, you're hoping + only one of size 300 is sent. +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifndef INADDR_NONE +#define INADDR_NONE (-1ul) +#endif + +void main( int argc, char **argv ) +{ + struct sockaddr_in server_addr; + int s; + struct iovec vector[3]; + char buf[100]; + int i; + const int just_say_no = 1; + + if( argc != 3 ) { +usage: + fprintf( stderr, "usage: test-writev a.b.c.d port#\n" ); + exit( 1 ); + } + server_addr.sin_family = AF_INET; + server_addr.sin_addr.s_addr = inet_addr( argv[1] ); + if( server_addr.sin_addr.s_addr == INADDR_NONE ) { + fprintf( stderr, "bogus address\n" ); + goto usage; + } + server_addr.sin_port = htons( atoi( argv[2] ) ); + + s = socket( AF_INET, SOCK_STREAM, 0 ); + if( s < 0 ) { + perror("socket"); + exit(1); + } + if( connect( s, (struct sockaddr *)&server_addr, sizeof( server_addr ) ) + != 0 ) { + perror("connect"); + exit(1); + } + + if( setsockopt(s, IPPROTO_TCP, TCP_NODELAY, (char*)&just_say_no, + sizeof(just_say_no)) != 0 ) { + perror( "TCP_NODELAY" ); + exit(1); + } + /* now build up a two part writev and write it out */ + for( i = 0; i < sizeof( buf ); ++i ) { + buf[i] = 'x'; + } + vector[0].iov_base = buf; + vector[0].iov_len = sizeof(buf); + vector[1].iov_base = buf; + vector[1].iov_len = sizeof(buf); + vector[2].iov_base = buf; + vector[2].iov_len = sizeof(buf); + + i = writev( s, &vector[0], 3 ); + fprintf( stdout, "i=%d, errno=%d\n", i, errno ); + exit(0); +} diff --git a/rubbos/app/httpd-2.0.64/test/test_find.c b/rubbos/app/httpd-2.0.64/test/test_find.c new file mode 100644 index 00000000..0f401ffd --- /dev/null +++ b/rubbos/app/httpd-2.0.64/test/test_find.c @@ -0,0 +1,78 @@ +/* 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. + */ + +/* This program tests the ap_find_list_item routine in ../main/util.c. + * + * The defines in this sample compile line are specific to Roy's system. + * They should match whatever was used to compile Apache first. + * + gcc -g -O2 -I../os/unix -I../include -o test_find \ + -DSOLARIS2=250 -Wall -DALLOC_DEBUG -DPOOL_DEBUG \ + ../main/alloc.o ../main/buff.o ../main/util.o \ + ../ap/libap.a -lsocket -lnsl test_find.c + * + * Roy Fielding, 1999 + */ +#include +#include +#include "httpd.h" +#include "apr_general.h" + +/* + * Dummy a bunch of stuff just to get a compile + */ +uid_t ap_user_id; +gid_t ap_group_id; +void *ap_dummy_mutex = &ap_dummy_mutex; +char *ap_server_argv0; + +AP_DECLARE(void) ap_block_alarms(void) +{ + ; +} + +AP_DECLARE(void) ap_unblock_alarms(void) +{ + ; +} + +AP_DECLARE(void) ap_log_error(const char *file, int line, int level, + const request_rec *r, const char *fmt, ...) +{ + ; +} + +int main (void) +{ + apr_pool_t *p; + char line[512]; + char tok[512]; + + p = apr_pool_alloc_init(); + + printf("Enter field value to find items within:\n"); + if (!gets(line)) + exit(0); + + printf("Enter search item:\n"); + while (gets(tok)) { + printf(" [%s] == %s\n", tok, ap_find_list_item(p, line, tok) + ? "Yes" : "No"); + printf("Enter search item:\n"); + } + + exit(0); +} diff --git a/rubbos/app/httpd-2.0.64/test/test_limits.c b/rubbos/app/httpd-2.0.64/test/test_limits.c new file mode 100644 index 00000000..8dca825b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/test/test_limits.c @@ -0,0 +1,200 @@ +/************************************************************** + * test_limits.c + * + * A simple program for sending abusive requests to a server, based + * on the sioux.c exploit code that this nimrod posted (see below). + * Roy added options for testing long header fieldsize (-t h), long + * request-lines (-t r), and a long request body (-t b). + * + * FreeBSD 2.2.x, FreeBSD 3.0, IRIX 5.3, IRIX 6.2: + * gcc -o test_limits test_limits.c + * + * Solaris 2.5.1: + * gcc -o test_limits test_limits.c -lsocket -lnsl + * + * + * Message-ID: <861zqspvtw.fsf@niobe.ewox.org> + * Date: Fri, 7 Aug 1998 19:04:27 +0200 + * Sender: Bugtraq List + * From: Dag-Erling Coidan =?ISO-8859-1?Q?Sm=F8rgrav?= + * Subject: YA Apache DoS attack + * + * Copyright (c) 1998 Dag-Erling Codan Smrgrav + * 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 + * in this position and unchanged. + * 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. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software withough specific prior written permission + * + * 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. + * + */ + +/* + * Kudos to Mark Huizer who originally suggested this on freebsd-current + */ + +#include +#include + +#include +#include + +#include +#include +#include +#include +#include + +#define TEST_LONG_REQUEST_LINE 1 +#define TEST_LONG_REQUEST_FIELDS 2 +#define TEST_LONG_REQUEST_FIELDSIZE 3 +#define TEST_LONG_REQUEST_BODY 4 + +void +usage(void) +{ + fprintf(stderr, + "usage: test_limits [-t (r|n|h|b)] [-a address] [-p port] [-n num]\n"); + exit(1); +} + +int +main(int argc, char *argv[]) +{ + struct sockaddr_in sin; + struct hostent *he; + FILE *f; + int o, sd; + + /* default parameters */ + char *addr = "localhost"; + int port = 80; + int num = 1000; + int testtype = TEST_LONG_REQUEST_FIELDS; + + /* get options */ + while ((o = getopt(argc, argv, "t:a:p:n:")) != EOF) + switch (o) { + case 't': + if (*optarg == 'r') + testtype = TEST_LONG_REQUEST_LINE; + else if (*optarg == 'n') + testtype = TEST_LONG_REQUEST_FIELDS; + else if (*optarg == 'h') + testtype = TEST_LONG_REQUEST_FIELDSIZE; + else if (*optarg == 'b') + testtype = TEST_LONG_REQUEST_BODY; + break; + case 'a': + addr = optarg; + break; + case 'p': + port = atoi(optarg); + break; + case 'n': + num = atoi(optarg); + break; + default: + usage(); + } + + if (argc != optind) + usage(); + + /* connect */ + if ((he = gethostbyname(addr)) == NULL) { + perror("gethostbyname"); + exit(1); + } + bzero(&sin, sizeof(sin)); + bcopy(he->h_addr, (char *)&sin.sin_addr, he->h_length); + sin.sin_family = he->h_addrtype; + sin.sin_port = htons(port); + + if ((sd = socket(sin.sin_family, SOCK_STREAM, IPPROTO_TCP)) == -1) { + perror("socket"); + exit(1); + } + + if (connect(sd, (struct sockaddr *)&sin, sizeof(sin)) == -1) { + perror("connect"); + exit(1); + } + + if ((f = fdopen(sd, "r+")) == NULL) { + perror("fdopen"); + exit(1); + } + + /* attack! */ + fprintf(stderr, "Testing like a plague of locusts on %s\n", addr); + + if (testtype == TEST_LONG_REQUEST_LINE) { + fprintf(f, "GET "); + while (num-- && !ferror(f)) { + fprintf(f, "/123456789"); + fflush(f); + } + fprintf(f, " HTTP/1.0\r\n\r\n"); + } + else { + fprintf(f, "GET /fred/foo HTTP/1.0\r\n"); + + if (testtype == TEST_LONG_REQUEST_FIELDSIZE) { + while (num-- && !ferror(f)) { + fprintf(f, "User-Agent: sioux"); + fflush(f); + } + fprintf(f, "\r\n"); + } + else if (testtype == TEST_LONG_REQUEST_FIELDS) { + while (num-- && !ferror(f)) + fprintf(f, "User-Agent: sioux\r\n"); + fprintf(f, "\r\n"); + } + else if (testtype == TEST_LONG_REQUEST_BODY) { + fprintf(f, "User-Agent: sioux\r\n"); + fprintf(f, "Content-Length: 33554433\r\n"); + fprintf(f, "\r\n"); + while (num-- && !ferror(f)) + fprintf(f, "User-Agent: sioux\r\n"); + } + else { + fprintf(f, "\r\n"); + } + } + fflush(f); + + { + apr_ssize_t len; + char buff[512]; + + while ((len = read(sd, buff, 512)) > 0) + len = write(1, buff, len); + } + if (ferror(f)) { + perror("fprintf"); + exit(1); + } + + fclose(f); + exit(0); +} diff --git a/rubbos/app/httpd-2.0.64/test/test_parser.c b/rubbos/app/httpd-2.0.64/test/test_parser.c new file mode 100644 index 00000000..fc17a725 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/test/test_parser.c @@ -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. + */ + +/* This program tests the ap_get_list_item routine in ../main/util.c. + * + * The defines in this sample compile line are specific to Roy's system. + * They should match whatever was used to compile Apache first. + * + gcc -g -O2 -I../os/unix -I../include -o test_parser \ + -DSOLARIS2=250 -Wall -DALLOC_DEBUG -DPOOL_DEBUG \ + ../main/alloc.o ../main/buff.o ../main/util.o \ + ../ap/libap.a -lsocket -lnsl test_parser.c + * + * Roy Fielding, 1999 + */ +#include +#include +#include "httpd.h" +#include "apr_general.h" + +/* + * Dummy a bunch of stuff just to get a compile + */ +uid_t ap_user_id; +gid_t ap_group_id; +void *ap_dummy_mutex = &ap_dummy_mutex; +char *ap_server_argv0; + +AP_DECLARE(void) ap_block_alarms(void) +{ + ; +} + +AP_DECLARE(void) ap_unblock_alarms(void) +{ + ; +} + +AP_DECLARE(void) ap_log_error(const char *file, int line, int level, + const request_rec *r, const char *fmt, ...) +{ + ; +} + +int main (void) +{ + apr_pool_t *p; + const char *field; + char *newstr; + char instr[512]; + + p = apr_pool_alloc_init(); + + while (gets(instr)) { + printf(" [%s] ==\n", instr); + field = instr; + while ((newstr = ap_get_list_item(p, &field)) != NULL) + printf(" <%s> ..\n", newstr); + } + + exit(0); +} diff --git a/rubbos/app/httpd-2.0.64/test/test_select.c b/rubbos/app/httpd-2.0.64/test/test_select.c new file mode 100644 index 00000000..af110356 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/test/test_select.c @@ -0,0 +1,46 @@ +/* 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. + */ + +/* This is just a quick test program to see how long a wait is + * produced by a select loop with an exponential backoff. + * + * gcc -g -O2 -o test_select test_select.c + * test_select + * + * Roy Fielding, 1996 + */ + +#include +#include +#include + +int main (void) +{ + int srv; + long waittime = 4096; + struct timeval tv; + + printf("Start\n"); + while ((waittime > 0) && (waittime < 3000000)) { + printf("%d\n", waittime); + tv.tv_sec = waittime/1000000; + tv.tv_usec = waittime%1000000; + waittime <<= 1; + srv = select(0, NULL, NULL, NULL, &tv); + } + printf("End\n"); + exit(0); +} diff --git a/rubbos/app/httpd-2.0.64/test/time-sem.c b/rubbos/app/httpd-2.0.64/test/time-sem.c new file mode 100644 index 00000000..bdf09316 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/test/time-sem.c @@ -0,0 +1,588 @@ +/* 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. + */ + +/* +time-sem.c has the basics of the semaphores we use in http_main.c. It's +intended for timing differences between various methods on an +architecture. In practice we've found many things affect which semaphore +to be used: + + - NFS filesystems absolutely suck for fcntl() and flock() + + - uslock absolutely sucks on single-processor IRIX boxes, but + absolutely rocks on multi-processor boxes. The converse + is true for fcntl. sysvsem seems a moderate balance. + + - Under Solaris you can't have too many processes use SEM_UNDO, there + might be a tuneable somewhere that increases the limit from 29. + We're not sure what the tunable is, so there's a define + NO_SEM_UNDO which can be used to simulate us trapping/blocking + signals to be able to properly release the semaphore on a clean + child death. You'll also need to define NEED_UNION_SEMUN + under solaris. + +You'll need to define USE_SHMGET_SCOREBOARD if anonymous shared mmap() +doesn't work on your system (i.e. linux). + +argv[1] is the #children, argv[2] is the #iterations per child + +You should run each over many different #children inputs, and choose +#iter such that the program runs for at least a second or so... or even +longer depending on your patience. + +compile with: + +gcc -o time-FCNTL -Wall -O time-sem.c -DUSE_FCNTL_SERIALIZED_ACCEPT +gcc -o time-FLOCK -Wall -O time-sem.c -DUSE_FLOCK_SERIALIZED_ACCEPT +gcc -o time-SYSVSEM -Wall -O time-sem.c -DUSE_SYSVSEM_SERIALIZED_ACCEPT +gcc -o time-SYSVSEM2 -Wall -O time-sem.c -DUSE_SYSVSEM_SERIALIZED_ACCEPT -DNO_SEM_UNDO +gcc -o time-PTHREAD -Wall -O time-sem.c -DUSE_PTHREAD_SERIALIZED_ACCEPT -lpthread +gcc -o time-USLOCK -Wall -O time-sem.c -DUSE_USLOCK_SERIALIZED_ACCEPT + +not all versions work on all systems. +*/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#if defined(USE_FCNTL_SERIALIZED_ACCEPT) + +static struct flock lock_it; +static struct flock unlock_it; + +static int fcntl_fd=-1; + +#define accept_mutex_child_init() +#define accept_mutex_cleanup() + +/* + * Initialize mutex lock. + * Must be safe to call this on a restart. + */ +void +accept_mutex_init(void) +{ + + lock_it.l_whence = SEEK_SET; /* from current point */ + lock_it.l_start = 0; /* -"- */ + lock_it.l_len = 0; /* until end of file */ + lock_it.l_type = F_WRLCK; /* set exclusive/write lock */ + lock_it.l_pid = 0; /* pid not actually interesting */ + unlock_it.l_whence = SEEK_SET; /* from current point */ + unlock_it.l_start = 0; /* -"- */ + unlock_it.l_len = 0; /* until end of file */ + unlock_it.l_type = F_UNLCK; /* set exclusive/write lock */ + unlock_it.l_pid = 0; /* pid not actually interesting */ + + printf("opening test-lock-thing in current directory\n"); + fcntl_fd = open("test-lock-thing", O_CREAT | O_WRONLY | O_EXCL, 0644); + if (fcntl_fd == -1) + { + perror ("open"); + fprintf (stderr, "Cannot open lock file: %s\n", "test-lock-thing"); + exit (1); + } + unlink("test-lock-thing"); +} + +void accept_mutex_on(void) +{ + int ret; + + while ((ret = fcntl(fcntl_fd, F_SETLKW, &lock_it)) < 0 && errno == EINTR) + continue; + + if (ret < 0) { + perror ("fcntl lock_it"); + exit(1); + } +} + +void accept_mutex_off(void) +{ + if (fcntl (fcntl_fd, F_SETLKW, &unlock_it) < 0) + { + perror ("fcntl unlock_it"); + exit(1); + } +} + +#elif defined(USE_FLOCK_SERIALIZED_ACCEPT) + +#include + +static int flock_fd=-1; + +#define FNAME "test-lock-thing" + +/* + * Initialize mutex lock. + * Must be safe to call this on a restart. + */ +void accept_mutex_init(void) +{ + + printf("opening " FNAME " in current directory\n"); + flock_fd = open(FNAME, O_CREAT | O_WRONLY | O_EXCL, 0644); + if (flock_fd == -1) + { + perror ("open"); + fprintf (stderr, "Cannot open lock file: %s\n", "test-lock-thing"); + exit (1); + } +} + +void accept_mutex_child_init(void) +{ + flock_fd = open(FNAME, O_WRONLY, 0600); + if (flock_fd == -1) { + perror("open"); + exit(1); + } +} + +void accept_mutex_cleanup(void) +{ + unlink(FNAME); +} + +void accept_mutex_on(void) +{ + int ret; + + while ((ret = flock(flock_fd, LOCK_EX)) < 0 && errno == EINTR) + continue; + + if (ret < 0) { + perror ("flock(LOCK_EX)"); + exit(1); + } +} + +void accept_mutex_off(void) +{ + if (flock (flock_fd, LOCK_UN) < 0) + { + perror ("flock(LOCK_UN)"); + exit(1); + } +} + +#elif defined (USE_SYSVSEM_SERIALIZED_ACCEPT) + +#include +#include +#include + +static int sem_id = -1; +#ifdef NO_SEM_UNDO +static sigset_t accept_block_mask; +static sigset_t accept_previous_mask; +#endif + +#define accept_mutex_child_init() +#define accept_mutex_cleanup() + +void accept_mutex_init(void) +{ +#ifdef NEED_UNION_SEMUN + /* believe it or not, you need to define this under solaris */ + union semun { + int val; + struct semid_ds *buf; + ushort *array; + }; +#endif + + union semun ick; + + sem_id = semget(999, 1, IPC_CREAT | 0666); + if (sem_id < 0) { + perror ("semget"); + exit (1); + } + ick.val = 1; + if (semctl(sem_id, 0, SETVAL, ick) < 0) { + perror ("semctl"); + exit(1); + } +#ifdef NO_SEM_UNDO + sigfillset(&accept_block_mask); + sigdelset(&accept_block_mask, SIGHUP); + sigdelset(&accept_block_mask, SIGTERM); + sigdelset(&accept_block_mask, SIGUSR1); +#endif +} + +void accept_mutex_on() +{ + struct sembuf op; + +#ifdef NO_SEM_UNDO + if (sigprocmask(SIG_BLOCK, &accept_block_mask, &accept_previous_mask)) { + perror("sigprocmask(SIG_BLOCK)"); + exit (1); + } + op.sem_flg = 0; +#else + op.sem_flg = SEM_UNDO; +#endif + op.sem_num = 0; + op.sem_op = -1; + if (semop(sem_id, &op, 1) < 0) { + perror ("accept_mutex_on"); + exit (1); + } +} + +void accept_mutex_off() +{ + struct sembuf op; + + op.sem_num = 0; + op.sem_op = 1; +#ifdef NO_SEM_UNDO + op.sem_flg = 0; +#else + op.sem_flg = SEM_UNDO; +#endif + if (semop(sem_id, &op, 1) < 0) { + perror ("accept_mutex_off"); + exit (1); + } +#ifdef NO_SEM_UNDO + if (sigprocmask(SIG_SETMASK, &accept_previous_mask, NULL)) { + perror("sigprocmask(SIG_SETMASK)"); + exit (1); + } +#endif +} + +#elif defined (USE_PTHREAD_SERIALIZED_ACCEPT) + +/* note: pthread mutexes aren't released on child death, hence the + * signal goop ... in a real implementation we'd do special things + * during hup, term, usr1. + */ + +#include + +static pthread_mutex_t *mutex; +static sigset_t accept_block_mask; +static sigset_t accept_previous_mask; + +#define accept_mutex_child_init() +#define accept_mutex_cleanup() + +void accept_mutex_init(void) +{ + pthread_mutexattr_t mattr; + int fd; + + fd = open ("/dev/zero", O_RDWR); + if (fd == -1) { + perror ("open(/dev/zero)"); + exit (1); + } + mutex = (pthread_mutex_t *)mmap ((caddr_t)0, sizeof (*mutex), + PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); + if (mutex == (void *)(caddr_t)-1) { + perror ("mmap"); + exit (1); + } + close (fd); + if (pthread_mutexattr_init(&mattr)) { + perror ("pthread_mutexattr_init"); + exit (1); + } + if (pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED)) { + perror ("pthread_mutexattr_setpshared"); + exit (1); + } + if (pthread_mutex_init(mutex, &mattr)) { + perror ("pthread_mutex_init"); + exit (1); + } + sigfillset(&accept_block_mask); + sigdelset(&accept_block_mask, SIGHUP); + sigdelset(&accept_block_mask, SIGTERM); + sigdelset(&accept_block_mask, SIGUSR1); +} + +void accept_mutex_on() +{ + if (sigprocmask(SIG_BLOCK, &accept_block_mask, &accept_previous_mask)) { + perror("sigprocmask(SIG_BLOCK)"); + exit (1); + } + if (pthread_mutex_lock (mutex)) { + perror ("pthread_mutex_lock"); + exit (1); + } +} + +void accept_mutex_off() +{ + if (pthread_mutex_unlock (mutex)) { + perror ("pthread_mutex_unlock"); + exit (1); + } + if (sigprocmask(SIG_SETMASK, &accept_previous_mask, NULL)) { + perror("sigprocmask(SIG_SETMASK)"); + exit (1); + } +} + +#elif defined (USE_USLOCK_SERIALIZED_ACCEPT) + +#include + +static usptr_t *us = NULL; +static ulock_t uslock = NULL; + +#define accept_mutex_child_init() +#define accept_mutex_cleanup() + +void accept_mutex_init(void) +{ + ptrdiff_t old; + /* default is 8 */ +#define CONF_INITUSERS_MAX 15 + if ((old = usconfig(CONF_INITUSERS, CONF_INITUSERS_MAX)) == -1) { + perror("usconfig"); + exit(-1); + } + if ((old = usconfig(CONF_LOCKTYPE, US_NODEBUG)) == -1) { + perror("usconfig"); + exit(-1); + } + if ((old = usconfig(CONF_ARENATYPE, US_SHAREDONLY)) == -1) { + perror("usconfig"); + exit(-1); + } + if ((us = usinit("/dev/zero")) == NULL) { + perror("usinit"); + exit(-1); + } + if ((uslock = usnewlock(us)) == NULL) { + perror("usnewlock"); + exit(-1); + } +} +void accept_mutex_on() +{ + switch(ussetlock(uslock)) { + case 1: + /* got lock */ + break; + case 0: + fprintf(stderr, "didn't get lock\n"); + exit(-1); + case -1: + perror("ussetlock"); + exit(-1); + } +} +void accept_mutex_off() +{ + if (usunsetlock(uslock) == -1) { + perror("usunsetlock"); + exit(-1); + } +} +#endif + + +#ifndef USE_SHMGET_SCOREBOARD +static void *get_shared_mem(apr_size_t size) +{ + void *result; + + /* allocate shared memory for the shared_counter */ + result = (unsigned long *)mmap ((caddr_t)0, size, + PROT_READ|PROT_WRITE, MAP_ANON|MAP_SHARED, -1, 0); + if (result == (void *)(caddr_t)-1) { + perror ("mmap"); + exit (1); + } + return result; +} +#else +#include +#include +#include + +static void *get_shared_mem(apr_size_t size) +{ + key_t shmkey = IPC_PRIVATE; + int shmid = -1; + void *result; +#ifdef MOVEBREAK + char *obrk; +#endif + + if ((shmid = shmget(shmkey, size, IPC_CREAT | SHM_R | SHM_W)) == -1) { + perror("shmget"); + exit(1); + } + +#ifdef MOVEBREAK + /* + * Some SysV systems place the shared segment WAY too close + * to the dynamic memory break point (sbrk(0)). This severely + * limits the use of malloc/sbrk in the program since sbrk will + * refuse to move past that point. + * + * To get around this, we move the break point "way up there", + * attach the segment and then move break back down. Ugly + */ + if ((obrk = sbrk(MOVEBREAK)) == (char *) -1) { + perror("sbrk"); + } +#endif + +#define BADSHMAT ((void *)(-1)) + if ((result = shmat(shmid, 0, 0)) == BADSHMAT) { + perror("shmat"); + } + /* + * We must avoid leaving segments in the kernel's + * (small) tables. + */ + if (shmctl(shmid, IPC_RMID, NULL) != 0) { + perror("shmctl(IPC_RMID)"); + } + if (result == BADSHMAT) /* now bailout */ + exit(1); + +#ifdef MOVEBREAK + if (obrk == (char *) -1) + return; /* nothing else to do */ + if (sbrk(-(MOVEBREAK)) == (char *) -1) { + perror("sbrk 2"); + } +#endif + return result; +} +#endif + +#ifdef _POSIX_PRIORITY_SCHEDULING +/* don't ask */ +#define _P __P +#include +#define YIELD sched_yield() +#else +#define YIELD do { struct timeval zero; zero.tv_sec = zero.tv_usec = 0; select(0,0,0,0,&zero); } while(0) +#endif + +void main (int argc, char **argv) +{ + int num_iter; + int num_child; + int i; + struct timeval first; + struct timeval last; + long ms; + int pid; + unsigned long *shared_counter; + + if (argc != 3) { + fprintf (stderr, "Usage: time-sem num-child num iter\n"); + exit (1); + } + + num_child = atoi (argv[1]); + num_iter = atoi (argv[2]); + + /* allocate shared memory for the shared_counter */ + shared_counter = get_shared_mem(sizeof(*shared_counter)); + + /* initialize counter to 0 */ + *shared_counter = 0; + + accept_mutex_init (); + + /* parent grabs mutex until done spawning children */ + accept_mutex_on (); + + for (i = 0; i < num_child; ++i) { + pid = fork(); + if (pid == 0) { + /* child, do our thing */ + accept_mutex_child_init(); + for (i = 0; i < num_iter; ++i) { + unsigned long tmp; + + accept_mutex_on (); + tmp = *shared_counter; + YIELD; + *shared_counter = tmp + 1; + accept_mutex_off (); + } + exit (0); + } else if (pid == -1) { + perror ("fork"); + exit (1); + } + } + + /* a quick test to see that nothing is screwed up */ + if (*shared_counter != 0) { + puts ("WTF! shared_counter != 0 before the children have been started!"); + exit (1); + } + + gettimeofday (&first, NULL); + /* launch children into action */ + accept_mutex_off (); + for (i = 0; i < num_child; ++i) { + if (wait(NULL) == -1) { + perror ("wait"); + } + } + gettimeofday (&last, NULL); + + if (*shared_counter != num_child * num_iter) { + printf ("WTF! shared_counter != num_child * num_iter!\n" + "shared_counter = %lu\nnum_child = %d\nnum_iter=%d\n", + *shared_counter, + num_child, num_iter); + } + + last.tv_sec -= first.tv_sec; + ms = last.tv_usec - first.tv_usec; + if (ms < 0) { + --last.tv_sec; + ms += 1000000; + } + last.tv_usec = ms; + printf ("%8lu.%06lu\n", last.tv_sec, last.tv_usec); + + accept_mutex_cleanup(); + + exit(0); +} + diff --git a/rubbos/app/httpd-2.0.64/test/zb.c b/rubbos/app/httpd-2.0.64/test/zb.c new file mode 100644 index 00000000..0a6666eb --- /dev/null +++ b/rubbos/app/httpd-2.0.64/test/zb.c @@ -0,0 +1,567 @@ + +/* 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 waranties, +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) + +*/ + +/* -------------------- Notes on compiling ------------------------------ + +This should compile unmodified using gcc on HP-UX, FreeBSD, Linux, +IRIX, Solaris, AIX and Digital Unix (OSF). On Solaris 2.x you will +need to compile with "-lnsl -lsocket" options. If you have any +difficulties compiling then let me know. + +On SunOS 4.x.x you may need to compile with -DSUNOS4 to add the following +two lines of code which appear not to exist in my SunOS headers */ + +#ifdef SUNOS4 +extern char *optarg; +extern int optind, opterr, optopt; +#endif + +/* -------------------------------------------------------------------- */ + +/* affects include files on Solaris */ +#define BSD_COMP + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* ------------------- DEFINITIONS -------------------------- */ + +/* maximum number of requests on a time limited test */ +#define MAX_REQUESTS 50000 + +/* good old state machine */ +#define STATE_UNCONNECTED 0 +#define STATE_CONNECTING 1 +#define STATE_READ 2 + +#define CBUFFSIZE 512 + +struct connection +{ + int fd; + int state; + int read; /* amount of bytes read */ + int bread; /* amount of body read */ + int length; /* Content-Length value used for keep-alive */ + char cbuff[CBUFFSIZE]; /* a buffer to store server response header */ + int cbx; /* offset in cbuffer */ + int keepalive; /* non-zero if a keep-alive request */ + int gotheader; /* non-zero if we have the entire header in cbuff */ + struct timeval start, connect, done; +}; + +struct data +{ + int read; /* number of bytes read */ + int ctime; /* time in ms to connect */ + int time; /* time in ms for connection */ +}; + +#define min(a,b) ((a)<(b))?(a):(b) +#define max(a,b) ((a)>(b))?(a):(b) + +/* --------------------- GLOBALS ---------------------------- */ + +int requests = 1; /* Number of requests to make */ +int concurrency = 1; /* Number of multiple requests to make */ +int tlimit = 0; /* time limit in cs */ +int keepalive = 0; /* try and do keepalive connections */ +char *machine; /* Machine name */ +char *file; /* file name to use */ +char server_name[80]; /* name that server reports */ +int port = 80; /* port to use */ + +int doclen = 0; /* the length the document should be */ +int totalread = 0; /* total number of bytes read */ +int totalbread = 0; /* totoal amount of entity body read */ +int done=0; /* number of requests we have done */ +int doneka=0; /* number of keep alive connections done */ +int good=0, bad=0; /* number of good and bad requests */ + +/* store error cases */ +int err_length = 0, err_conn = 0, err_except = 0; + +struct timeval start, endtime; + +/* global request (and its length) */ +char request[512]; +int reqlen; + +/* one global throw-away buffer to read stuff into */ +char buffer[4096]; + +struct connection *con; /* connection array */ +struct data *stats; /* date for each request */ + +fd_set readbits, writebits; /* bits for select */ +struct sockaddr_in server; /* server addr structure */ + +/* --------------------------------------------------------- */ + +/* simple little function to perror and exit */ + +static void err(char *s) +{ + perror(s); + exit(errno); +} + +/* --------------------------------------------------------- */ + +/* write out request to a connection - assumes we can write + (small) request out in one go into our new socket buffer */ + +void write_request(struct connection *c) +{ + gettimeofday(&c->connect,0); + write(c->fd,request, reqlen); + c->state = STATE_READ; + FD_SET(c->fd, &readbits); + FD_CLR(c->fd, &writebits); +} + +/* --------------------------------------------------------- */ + +/* make an fd non blocking */ + +void nonblock(int fd) +{ + int i=1; + ioctl(fd, FIONBIO, &i); +} + +/* --------------------------------------------------------- */ + +/* returns the time in ms between two timevals */ + +int timedif(struct timeval a, struct timeval b) +{ + register int us,s; + + us = a.tv_usec - b.tv_usec; + us /= 1000; + s = a.tv_sec - b.tv_sec; + s *= 1000; + return s+us; +} + +/* --------------------------------------------------------- */ + +/* calculate and output results and exit */ + +void output_results() +{ + int timetaken; + + gettimeofday(&endtime,0); + timetaken = timedif(endtime, start); + + printf("\n---\n"); + printf("Server: %s\n", server_name); + printf("Document Length: %d\n", doclen); + printf("Concurency Level: %d\n", concurrency); + printf("Time taken for tests: %d.%03d seconds\n", + timetaken/1000, timetaken%1000); + printf("Complete requests: %d\n", done); + printf("Failed requests: %d\n", bad); + if(bad) printf(" (Connect: %d, Length: %d, Exceptions: %d)\n", + err_conn, err_length, err_except); + if(keepalive) printf("Keep-Alive requests: %d\n", doneka); + printf("Bytes transfered: %d\n", totalread); + printf("HTML transfered: %d\n", totalbread); + + /* avoid divide by zero */ + if(timetaken) { + printf("Requests per seconds: %.2f\n", 1000*(float)(done)/timetaken); + printf("Transfer rate: %.2f kb/s\n", + (float)(totalread)/timetaken); + } + + { + /* work out connection times */ + int i; + int totalcon=0, total=0; + int mincon=9999999, mintot=999999; + int maxcon=0, maxtot=0; + + for(i=0; iread = 0; + c->bread = 0; + c->keepalive = 0; + c->cbx = 0; + c->gotheader = 0; + + c->fd = socket(AF_INET, SOCK_STREAM, 0); + if(c->fd<0) err("socket"); + + nonblock(c->fd); + gettimeofday(&c->start,0); + + if(connect(c->fd, (struct sockaddr *) &server, sizeof(server))<0) { + if(errno==EINPROGRESS) { + c->state = STATE_CONNECTING; + FD_SET(c->fd, &writebits); + return; + } + else { + close(c->fd); + err_conn++; + if(bad++>10) { + printf("\nTest aborted after 10 failures\n\n"); + exit(1); + } + start_connect(c); + } + } + + /* connected first time */ + write_request(c); +} + +/* --------------------------------------------------------- */ + +/* close down connection and save stats */ + +void close_connection(struct connection *c) +{ + if(c->read == 0 && c->keepalive) { + /* server has legitiamately shut down an idle keep alive request */ + good--; /* connection never happend */ + } + else { + if(good==1) { + /* first time here */ + doclen = c->bread; + } else if (c->bread!=doclen) { + bad++; + err_length++; + } + + /* save out time */ + if(done < requests) { + struct data s; + gettimeofday(&c->done,0); + s.read = c->read; + s.ctime = timedif(c->connect, c->start); + s.time = timedif(c->done, c->start); + stats[done++] = s; + } + } + + close(c->fd); + FD_CLR(c->fd, &readbits); + FD_CLR(c->fd, &writebits); + + /* connect again */ + start_connect(c); + return; +} + +/* --------------------------------------------------------- */ + +/* read data from connection */ + +void read_connection(struct connection *c) +{ + int r; + + r=read(c->fd,buffer,sizeof(buffer)); + if(r==0 || (r<0 && errno!=EAGAIN)) { + good++; + close_connection(c); + return; + } + + if(r<0 && errno==EAGAIN) return; + + c->read += r; + totalread += r; + + if(!c->gotheader) { + char *s; + int l=4; + int space = CBUFFSIZE - c->cbx - 1; /* -1 to allow for 0 terminator */ + int tocopy = (spacecbuff+c->cbx, buffer, space); + c->cbx += tocopy; space -= tocopy; + c->cbuff[c->cbx] = 0; /* terminate for benefit of strstr */ + s = strstr(c->cbuff, "\r\n\r\n"); + /* this next line is so that we talk to NCSA 1.5 which blatantly breaks + the http specifaction */ + if(!s) { s = strstr(c->cbuff,"\n\n"); l=2; } + + if(!s) { + /* read rest next time */ + if(space) + return; + else { + /* header is in invalid or too big - close connection */ + close(c->fd); + if(bad++>10) { + printf("\nTest aborted after 10 failures\n\n"); + exit(1); + } + FD_CLR(c->fd, &writebits); + start_connect(c); + } + } + else { + /* have full header */ + if(!good) { + /* this is first time, extract some interesting info */ + char *p, *q; + p = strstr(c->cbuff, "Server:"); + q = server_name; + if(p) { p+=8; while(*p>32) *q++ = *p++; } + *q = 0; + } + + c->gotheader = 1; + *s = 0; /* terminate at end of header */ + if(keepalive && + (strstr(c->cbuff, "Keep-Alive") + || strstr(c->cbuff, "keep-alive"))) /* for benefit of MSIIS */ + { + char *cl; + cl = strstr(c->cbuff, "Content-Length:"); + /* for cacky servers like NCSA which break the spec and send a + lower case 'l' */ + if(!cl) cl = strstr(c->cbuff, "Content-length:"); + if(cl) { + c->keepalive=1; + c->length = atoi(cl+16); + } + } + c->bread += c->cbx - (s+l-c->cbuff) + r-tocopy; + totalbread += c->bread; + } + } + else { + /* outside header, everything we have read is entity body */ + c->bread += r; + totalbread += r; + } + + if(c->keepalive && (c->bread >= c->length)) { + /* finished a keep-alive connection */ + good++; doneka++; + /* save out time */ + if(good==1) { + /* first time here */ + doclen = c->bread; + } else if(c->bread!=doclen) { bad++; err_length++; } + if(done < requests) { + struct data s; + gettimeofday(&c->done,0); + s.read = c->read; + s.ctime = timedif(c->connect, c->start); + s.time = timedif(c->done, c->start); + stats[done++] = s; + } + c->keepalive = 0; c->length = 0; c->gotheader=0; c->cbx = 0; + c->read = c->bread = 0; + write_request(c); + c->start = c->connect; /* zero connect time with keep-alive */ + } +} + +/* --------------------------------------------------------- */ + +/* run the tests */ + +int test() +{ + struct timeval timeout, now; + fd_set sel_read, sel_except, sel_write; + int i; + + { + /* get server information */ + struct hostent *he; + he = gethostbyname(machine); + if (!he) err("gethostbyname"); + server.sin_family = he->h_addrtype; + server.sin_port = htons(port); + server.sin_addr.s_addr = ((unsigned long *)(he->h_addr_list[0]))[0]; + } + + con = malloc(concurrency*sizeof(struct connection)); + memset(con,0,concurrency*sizeof(struct connection)); + + stats = malloc(requests * sizeof(struct data)); + + FD_ZERO(&readbits); + FD_ZERO(&writebits); + + /* setup request */ + sprintf(request,"GET %s HTTP/1.0\r\nUser-Agent: ZeusBench/1.0\r\n" + "%sHost: %s\r\nAccept: */*\r\n\r\n", file, + keepalive?"Connection: Keep-Alive\r\n":"", machine ); + + reqlen = strlen(request); + + /* ok - lets start */ + gettimeofday(&start,0); + + /* initialise lots of requests */ + for(i=0; i (tlimit*1000)) { + requests=done; /* so stats are correct */ + output_results(); + } + + /* Timeout of 30 seconds. */ + timeout.tv_sec=30; timeout.tv_usec=0; + n=select(256, &sel_read, &sel_write, &sel_except, &timeout); + if(!n) { + printf("\nServer timed out\n\n"); + exit(1); + } + if(n<1) err("select"); + + for(i=0; i=requests) output_results(); + } + return 0; +} + +/* ------------------------------------------------------- */ + +/* display usage information */ + +void usage(char *progname) { + printf("\nZeusBench v1.0\n\n"); + printf("Usage: %s [-k] [-n requests | -t timelimit (sec)]" + "\n\t\t[-c concurrency] [-p port] \n",progname); + printf("Filename should start with a '/' e.g. /index.html\n\n"); + exit(EINVAL); +} + +/* ------------------------------------------------------- */ + +/* sort out command-line args and call test */ + +int main(int argc, char **argv) { + int c; + if (argc < 3) usage(argv[0]); + + machine = argv[1]; + file = argv[2]; + optind = 3; + while ((c = getopt(argc,argv,"p:n:c:d:t:d:k"))>0) { + switch(c) { + case 'd': + break; + case 'n': + requests = atoi(optarg); + if(!requests) { + printf("Invalid number of requests\n"); + exit(1); + } + break; + case 'k': + keepalive=1; + break; + case 'c': + concurrency = atoi(optarg); + break; + case 'p': + port = atoi(optarg); + break; + case 't': + tlimit = atoi(optarg); + requests = MAX_REQUESTS; /* need to size data array on something */ + break; + default: + usage(argv[0]); + break; + } + } + test(); + return 0; +} + + + + + + -- 2.16.6
    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%0Al)H=?4Z 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 Z%jl4p)2@n2|H)*buLHFG2Rche=6_IWu|@y@ literal 0 HcmV?d00001 diff --git a/rubbos/app/httpd-2.0.64/build/NWGNUenvironment.inc b/rubbos/app/httpd-2.0.64/build/NWGNUenvironment.inc new file mode 100644 index 00000000..e89bbf22 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/build/NWGNUenvironment.inc @@ -0,0 +1,314 @@ +# +# 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 + +# This is a placeholder +# ifndef LDAPSDK +# LDAPSDK = C:/novell/ndk/cldapsdk +# endif + +# This is a placeholder +# ifndef ZLIBSDK +# ZLIBSDK = C:/novell/ndk/zlibsdk +# endif + +ifndef METROWERKS +METROWERKS = C:\Program Files\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 (default) +# optimized - optimization switches are set + +ifdef reltype +RELEASE=$(reltype) +endif + +ifdef RELTYPE +RELEASE=$(RELTYPE) +endif + +ifdef debug +RELEASE=debug +endif + +ifdef DEBUG +RELEASE=debug +endif + +ifdef optimized +RELEASE=optimized +endif + +ifdef OPTIMIZED +RELEASE=optimized +endif + +ifndef RELEASE +RELEASE = optimized +endif + +ifeq "$(RELEASE)" "debug" +OBJDIR = Debug +endif + +ifeq "$(RELEASE)" "noopt" +OBJDIR = Noopt +endif + +ifeq "$(RELEASE)" "optimized" +OBJDIR = Release +endif + +# +# Setup compiler information +# + +# MetroWerks NLM tools +CC = mwccnlm +CPP = mwccnlm +LINK = mwldnlm +LIB = mwldnlm -type library -w nocmdline +WIN_CC = mwcc + +NOVI = $(NOVELLLIBC)\imports + +INCDIRS = $(NOVELLLIBC)\include;$(NOVELLLIBC)\include\nks;$(NOVELLLIBC)\include\winsock; +ifneq "$(LDAPSDK)" "" +INCDIRS := $(INCDIRS);$(LDAPSDK)/inc +endif +ifneq "$(ZLIBSDK)" "" +INCDIRS := $(INCDIRS);$(ZLIBSDK) +endif + +DEFINES = -DNETWARE +ifndef DEBUG +DEFINES += -DNDEBUG +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 + +# MetroWerks Win32 build flags to create build tool +MWCW_MSL = "$(METROWERKS)/MSL" +MWCW_W32 = "$(METROWERKS)/Win32-x86 Support" +WIN_CFLAGS = -O2 -gccinc -nodefaults -proc 586 -w off +WIN_CFLAGS += -ir $(MWCW_MSL) -ir $(MWCW_W32) -lr $(MWCW_MSL) -lr $(MWCW_W32) +WIN_CFLAGS += -lMSL_All_x86.lib -lkernel32.lib -luser32.lib + +# Base compile flags +# and prefix or precompiled header added here. + +# The default flags are as follows: +# +# -c compile only, no link +# -nosyspath treat #include <...> like #include "..." +# -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 -nosyspath -Cpp_exceptions off -RTTI off -align 4 -w nocmdline -proc PII + +# -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)" "optimized" +CFLAGS += -O4,p +endif + +# -prefix pre_nw.h #include pre_nw.h for all files + +CFLAGS += -prefix pre_nw.h + + +PATH:=$(PATH);$(METROWERKS)\bin;$(METROWERKS)\Other Metrowerks Tools\Command Line Tools + +# +# Declare major project deliverables output directories here +# + +ifdef DEST +INSTALL = $(DEST) +ifeq (\, $(findstring \,$(INSTALL))) +INSTDIRS = $(DEST) +endif +endif + +ifdef dest +INSTALL = $(dest) +ifeq (\, $(findstring \,$(INSTALL))) +INSTDIRS = $(dest) +endif +endif + +ifndef INSTALL +INSTALL = $(AP_WORK)\Dist +INSTDIRS = $(AP_WORK)\Dist +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 + +INSTDEVDIRS := \ + $(INSTDIRS) \ + $(INSTALL)\Apache2\include \ + $(INSTALL)\Apache2\lib \ + +INSTDIRS += \ + $(INSTALL)\Apache2 \ + $(INSTALL)\Apache2\bin \ + $(INSTALL)\Apache2\cgi-bin \ + $(INSTALL)\Apache2\conf \ + $(INSTALL)\Apache2\error \ + $(INSTALL)\Apache2\htdocs \ + $(INSTALL)\Apache2\icons \ + $(INSTALL)\Apache2\logs \ + $(INSTALL)\Apache2\man \ + $(INSTALL)\Apache2\manual \ + $(INSTALL)\Apache2\modules \ + +# +# Declare Command and tool macros here +# + +# Os2LibPath is an extra check to see if we are on NT +ifdef Os2LibPath +OS = Windows_NT +endif + +ifeq "$(OS)" "Windows_NT" +CMD=cmd /C +CHK=cmd /C if exist +CHKNOT=cmd /C if not exist +DEL = del /F +DELTREE = cmd /C rd /s/q +WINNT=1 +XCOPYSW = /E +else +CMD=command /C +CHK=command /C if exist +CHKNOT=command /C if not exist +DEL = del +DELTREE = deltree /y +XCOPYSW = /E /Y +endif + + +# +# Setup base C compiler flags +# + +# +# Common directories +# + +STDMOD = $(AP_WORK)/modules +NWOS = $(AP_WORK)/os/netware +SERVER = $(AP_WORK)/server +SRC = $(AP_WORK) +APR = $(APR_WORK) +APRUTIL = $(APU_WORK) +SUPMOD = $(AP_WORK)/support +PCRE = $(AP_WORK)/srclib/pcre +APRTEST = $(APR_WORK)/test +HTTPD = $(AP_WORK)/modules/http +XML = $(APU_WORK)/xml + +# +# Internal Libraries +# + +APRLIB = $(APR)/$(OBJDIR)/aprlib.lib +APRUTLIB = $(APRUTIL)/$(OBJDIR)/aprutil.lib +STMODLIB = $(STDMOD)/$(OBJDIR)/stdmod.lib +PCRELIB = $(PCRE/$(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/rubbos/app/httpd-2.0.64/build/NWGNUhead.inc b/rubbos/app/httpd-2.0.64/build/NWGNUhead.inc new file mode 100644 index 00000000..dbb3f959 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/build/NWGNUhead.inc @@ -0,0 +1,106 @@ +# +# 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) :: + $(CHKNOT) $@\NUL mkdir $@ + +$(INSTDEVDIRS) :: + $(CHKNOT) $@\NUL mkdir $@ + +endif #NO_LICENSE_FILE check + +help : + @echo targets for RELEASE=$(RELEASE): + @echo (default) . . . . libs nlms + @echo all . . . . . . . does everything (libs nlms install) + @echo libs. . . . . . . builds all libs + @echo nlms. . . . . . . builds all nlms + @echo install . . . . . builds libs and nlms and copies install files to + @echo "$(INSTALL)" + @echo installdev. . . . copies headers and files needed for development to + @echo "$(INSTALL)" + @echo clean . . . . . . deletes $(OBJDIR) dirs, *.err, and *.map + @echo clobber_all . . . deletes all possible output from the make + @echo clobber_install . deletes all files in $(INSTALL) + @$(CMD) echo. + @echo Multiple targets can be used on a single nmake command line - + @echo (i.e. $(MAKE) clean all) + @$(CMD) echo. + @echo You can also specify RELEASE=debug, RELEASE=noopt, or RELEASE=optimized + @echo The default is RELEASE=optimized + +clobber_all :: clean clobber_install + +clobber_install :: + -$(DELTREE) $(INSTALL) 2>NUL + +# +# build recursive targets +# + +$(SUBDIRS) : FORCE +ifneq "$(MAKECMDGOALS)" "clean" + $(CMD) echo. + @echo Building $(CURDIR)/$@ +endif + $(MAKE) -C $@ $(MAKECMDGOALS) -f NWGNUmakefile RELEASE=$(RELEASE) DEST="$(INSTALL)" LM_LICENSE_FILE="$(LM_LICENSE_FILE)" + $(CMD) echo. + +FORCE: + +# +# Standard targets +# + +clean :: $(SUBDIRS) + @echo Cleaning up $(CURDIR) + -$(DELTREE) $(OBJDIR) 2> NUL + $(CHK) *.err $(DEL) *.err + $(CHK) *.map $(DEL) *.map + $(CHK) *.d $(DEL) *.d + $(CHK) *.tmp $(DEL) *.tmp + $(CHK) xc.bat $(DEL) xc.bat + -$(DELTREE) $(OBJDIR) 2> NUL + +$(OBJDIR) :: + $(CHKNOT) $(OBJDIR)\nul mkdir $(OBJDIR) + diff --git a/rubbos/app/httpd-2.0.64/build/NWGNUmakefile b/rubbos/app/httpd-2.0.64/build/NWGNUmakefile new file mode 100644 index 00000000..bc7ee5c9 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/build/NWGNUmakefile @@ -0,0 +1,119 @@ +# +# Declare the sub-directories to be built here +# + +SUBDIRS = \ + $(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 = \ + $(APR)/include/apr.h \ + $(APRUTIL)/include/apu.h \ + $(APRUTIL)/include/apr_ldap.h \ + $(NWOS)/test_char.h \ + $(PCRE)/config.h \ + $(PCRE)/pcre.h \ + $(EOLIST) + +nlms :: $(NWOS)/httpd.imp $(NWOS)/chartables.c + +$(NWOS)/httpd.imp : make_nw_export.awk nw_export.i + @echo Generating $(subst /,\,$@) + awk -f make_nw_export.awk nw_export.i | sort >$(NWOS)/httpd.imp + +nw_export.i : nw_export.inc $(FILES_prebuild_headers) $(NLM_NAME)_cc.opt + @echo Generating $(subst /,\,$@) + $(CC) $< @$(NLM_NAME)_cc.opt + +$(NLM_NAME)_cc.opt : NWGNUmakefile $(AP_WORK)\build\NWGNUenvironment.inc $(AP_WORK)\build\NWGNUtail.inc $(AP_WORK)\build\NWGNUhead.inc + $(CHK) $@ $(DEL) $@ + @echo -P >> $@ + @echo -EP >> $@ + @echo -nosyspath >> $@ + @echo -w nocmdline >> $@ + @echo -DNETWARE >> $@ + @echo -DCORE_PRIVATE >> $@ + @echo -I..\include >> $@ + @echo -I..\modules\http >> $@ + @echo -I..\modules\aaa >> $@ + @echo -I..\os\netware >> $@ + @echo -I..\server\mpm\netware >> $@ + @echo -I$(APR)\include >> $@ + @echo -I$(APRUTIL)\include >> $@ + @echo -ir $(NOVELLLIBC) >> $@ + +$(APR)/include/%.h: $(subst /,\,$(APR))\include\%.hnw + @echo Creating $(subst /,\,$@) + copy $< $(subst /,\,$(APR))\include\$(@F) + +$(APRUTIL)/include/%.h: $(subst /,\,$(APRUTIL))\include\%.hnw + @echo Creating $(subst /,\,$@) + copy $< $(subst /,\,$(APRUTIL))\include\$(@F) + +$(PCRE)/%.h: $(subst /,\,$(PCRE))\%.hw + @echo Creating $(subst /,\,$@) + copy $< $(subst /,\,$(PCRE))\$(@F) + +ifneq "$(BUILDTOOL_AS_NLM)" "1" + +$(NWOS)/chartables.c: dftables.exe $(PCRE)/dftables.c $(FILES_prebuild_headers) + @echo Creating $(subst /,\,$@) + @$< > $@ + +%.exe: $(PCRE)/%.c + @echo Creating Build Helper $@ + @$(WIN_CC) $(WIN_CFLAGS) $< -o $@ + +$(NWOS)/test_char.h: gen_test_char.exe $(AP_WORK)/server/gen_test_char.c + @echo Creating $(subst /,\,$@) + @$< > $@ + +%.exe: $(AP_WORK)/server/%.c + @echo Creating Build Helper $@ + @$(WIN_CC) $(WIN_CFLAGS) -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 + +# +# You can use this target if all that is needed is to copy files to the +# installation area +# +install :: nlms FORCE + + +clean :: + $(CHK) nw_export.i $(DEL) nw_export.i + $(CHK) $(NLM_NAME)_cc.opt $(DEL) $(NLM_NAME)_cc.opt + $(CHK) NWGNUversion.inc $(DEL) NWGNUversion.inc + $(CHK) $(subst /,\,$(APR))\include\apr.h $(DEL) $(subst /,\,$(APR))\include\apr.h + $(CHK) $(subst /,\,$(APRUTIL))\include\apu.h $(DEL) $(subst /,\,$(APRUTIL))\include\apu.h + $(CHK) $(subst /,\,$(APRUTIL))\include\apr_ldap.h $(DEL) $(subst /,\,$(APRUTIL))\include\apr_ldap.h + $(CHK) $(subst /,\,$(PCRE))\config.h $(DEL) $(subst /,\,$(PCRE))\config.h + $(CHK) $(subst /,\,$(PCRE))\pcre.h $(DEL) $(subst /,\,$(PCRE))\pcre.h + $(CHK) $(subst /,\,$(NWOS))\httpd.imp $(DEL) $(subst /,\,$(NWOS))\httpd.imp +ifneq "$(BUILDTOOL_AS_NLM)" "1" + $(CHK) $(subst /,\,$(NWOS))\chartables.c $(DEL) $(subst /,\,$(NWOS))\chartables.c + $(CHK) $(subst /,\,$(NWOS))\test_char.h $(DEL) $(subst /,\,$(NWOS))\test_char.h + $(CHK) dftables.exe $(DEL) dftables.exe + $(CHK) gen_test_char.exe $(DEL) gen_test_char.exe +endif + diff --git a/rubbos/app/httpd-2.0.64/build/NWGNUtail.inc b/rubbos/app/httpd-2.0.64/build/NWGNUtail.inc new file mode 100644 index 00000000..a4a951ca --- /dev/null +++ b/rubbos/app/httpd-2.0.64/build/NWGNUtail.inc @@ -0,0 +1,319 @@ +# +# 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. +# +echo NLM_NAME=$(NLM_NAME) +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 = Copyright 2006 The Apache Software Foundation. Licensed under the Apache License Version 2.0. +endif + +# +# Create dependency lists based on the files available +# + +CCOPT_DEPENDS = \ + $(AP_WORK)\build\NWGNUhead.inc \ + $(AP_WORK)\build\NWGNUenvironment.inc \ + $(AP_WORK)\build\NWGNUtail.inc \ + NWGNUmakefile \ + $(CUSTOM_INI) \ + $(EOLIST) + +CPPOPT_DEPENDS = \ + $(AP_WORK)\build\NWGNUhead.inc \ + $(AP_WORK)\build\NWGNUenvironment.inc \ + $(AP_WORK)\build\NWGNUtail.inc \ + NWGNUmakefile \ + $(CUSTOM_INI) \ + $(EOLIST) + +$(NLM_NAME)_LINKOPT_DEPENDS = \ + $(TARGET_lib) \ + $(AP_WORK)\build\NWGNUenvironment.inc \ + NWGNUmakefile \ + $(AP_WORK)\build\NWGNUtail.inc \ + $(CUSTOM_INI) \ + $(VERSION_INC) \ + $(EOLIST) + +ifeq "$(words $(strip $(TARGET_lib)))" "1" +LIB_NAME = $(basename $(notdir $(TARGET_lib))) +$(LIB_NAME)_LIBLST_DEPENDS = \ + $(FILES_lib_objs) \ + $(AP_WORK)\build\NWGNUenvironment.inc \ + NWGNUmakefile \ + $(AP_WORK)\build\NWGNUtail.inc \ + $(CUSTOM_INI) \ + $(EOLIST) +endif + +ifeq "$(wildcard NWGNU$(LIB_NAME))" "NWGNU$(LIB_NAME)" +$(LIB_NAME)_LIBLST_DEPENDS += NWGNU$(LIB_NAME) +endif + +ifeq "$(wildcard NWGNU$(NLM_NAME))" "NWGNU$(NLM_NAME)" +$(NLM_NAME)_LINKOPT_DEPENDS += NWGNU$(NLM_NAME) +CCOPT_DEPENDS += NWGNU$(NLM_NAME) +CPPOPT_DEPENDS += NWGNU$(NLM_NAME) +endif + +# +# Generic compiler rules +# + +$(AP_WORK)\build\NWGNUversion.inc : $(AP_WORK)\include\ap_release.h $(AP_WORK)\build\nw_ver.awk + @echo Generating $(subst /,\,$@) + awk -f $(AP_WORK)\build\nw_ver.awk $(AP_WORK)\include\ap_release.h > $(AP_WORK)\build\NWGNUversion.inc + +-include $(AP_WORK)\build\NWGNUversion.inc + +ifneq "$(strip $(VERSION_STR))" "" +VERSION_INC = $(AP_WORK)\build\NWGNUversion.inc +else +VERSION = 2,0,0 +VERSION_STR = 2.0.0 +endif + + +ifeq "$(words $(strip $(TARGET_nlm)))" "1" + +$(OBJDIR)/%.o: %.c $(OBJDIR)\$(NLM_NAME)_cc.opt + @echo Compiling $< + $(CC) $< -o=$(OBJDIR)\$(@F) @$(OBJDIR)\$(NLM_NAME)_cc.opt + +$(OBJDIR)\$(NLM_NAME)_cc.opt: $(CCOPT_DEPENDS) + $(CHK) $@ $(DEL) $@ + @echo Generating $@ +ifneq "$(strip $(CFLAGS))" "" + @echo $(CFLAGS) >> $@ +endif +ifneq "$(strip $(XCFLAGS))" "" + @echo $(XCFLAGS) >> $@ +endif +ifneq "$(strip $(XINCDIRS))" "" + @echo $(foreach xincdir,$(strip $(subst ;,$(SPACE),$(XINCDIRS))),-I$(xincdir)) >> $@ +endif +ifneq "$(strip $(INCDIRS))" "" + @echo $(foreach incdir,$(strip $(subst ;,$(SPACE),$(INCDIRS))),-I$(incdir)) >> $@ +endif +ifneq "$(strip $(DEFINES))" "" + @echo $(DEFINES) >> $@ +endif +ifneq "$(strip $(XDEFINES))" "" + @echo $(XDEFINES) >> $@ +endif + +$(OBJDIR)/%.o: %.cpp $(OBJDIR)\cpp.opt + @echo Compiling $< + $(CPP) $< -o=$(OBJDIR)\$(@F) @$(OBJDIR)\cpp.opt + +$(OBJDIR)\cpp.opt: $(CPPOPT_DEPENDS) + $(CHK) $@ $(DEL) $@ + @echo Generating $@ +ifneq "$(strip $(CFLAGS))" "" + @echo $(CFLAGS) >> $@ +endif +ifneq "$(strip $(XCFLAGS))" "" + @echo $(XCFLAGS) >> $@ +endif +ifneq "$(strip $(XINCDIRS))" "" + @echo $(foreach xincdir,$(strip $(subst ;,$(SPACE),$(XINCDIRS))),-I$(xincdir)) >> $@ +endif +ifneq "$(strip $(INCDIRS))" "" + @echo $(foreach incdir,$(strip $(subst ;,$(SPACE),$(INCDIRS))),-I$(incdir)) >> $@ +endif +ifneq "$(strip $(DEFINES))" "" + @echo $(DEFINES) >> $@ +endif +ifneq "$(strip $(XDEFINES))" "" + @echo $(XDEFINES) >> $@ +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 + @echo Generating $@ + $(CHK) $(OBJDIR)\$(@F) $(DEL) $(OBJDIR)\$(@F) + $(LIB) -o $(OBJDIR)\$(@F) @$? + +$(OBJDIR)\$(LIB_NAME)_lib.lst: $($(LIB_NAME)_LIBLST_DEPENDS) + $(CHK) $@ $(DEL) $@ + @echo Generating $@ +ifneq "$(strip $(FILES_lib_objs))" "" + @echo $(foreach objfile,$(FILES_lib_objs),$(subst /,\,$(objfile)) ) >> $@ +endif + +else # We must have more than one target library so load the individual makefiles + +$(OBJDIR)/%.lib: NWGNU% $(AP_WORK)\build\NWGNUhead.inc $(AP_WORK)\build\NWGNUtail.inc $(AP_WORK)\build\NWGNUenvironment.inc FORCE + @echo Calling $< + $(MAKE) -f $< $(MAKECMDGOALS) RELEASE=$(RELEASE) + +endif + +# +# Rules to build nlms. +# + +vpath libcpre.o $(NOVELLLIBC)\imports + +# 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 Linking $@ + $(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) + $(CHK) $(OBJDIR)\$(@F) $(DEL) $(OBJDIR)\$(@F) + $(CHK) $(OBJDIR)\$(NLM_NAME)_link.def $(DEL) $(OBJDIR)\$(NLM_NAME)_link.def + @echo Generating $@ + @echo -warnings off >> $@ + @echo -zerobss >> $@ + @echo -desc "$(NLM_DESCRIPTION)" >> $@ + @echo -o $(TARGET_nlm) >> $@ +ifneq "$(FILE_nlm_copyright)" "" + @-type $(FILE_nlm_copyright) >> $@ +else + @echo -copy "$(NLM_COPYRIGHT)" >> $@ +endif +ifeq "$(RELEASE)" "debug" + @echo -g >> $@ + @echo -sym internal >> $@ + @echo -sym codeview4 >> $@ + @echo -osym $(OBJDIR)\$(NLM_NAME).sym >> $@ +else + @echo -sym internal >> $@ +endif + @echo -screenname "$(NLM_SCREEN_NAME)" >> $@ +ifneq "$(NLM_VERSION)" "" + @echo -nlmversion=$(NLM_VERSION) >> $@ +else + @echo -nlmversion=$(VERSION) >> $@ +endif + @echo -l $(NWOS) >> $@ + @echo -l $(AP)/$(OBJDIR) >> $@ + @echo -l $(APR)/$(OBJDIR) >> $@ + @echo -l $(APRUTIL)/$(OBJDIR) >> $@ + @echo -l $(PCRE)/$(OBJDIR) >> $@ + @echo -l $(HTTPD)/$(OBJDIR) >> $@ + @echo -l $(SERVER)/$(OBJDIR) >> $@ + @echo -l $(STDMOD)/$(OBJDIR) >> $@ + @echo -l $(NWOS)/$(OBJDIR) >> $@ + @echo -l "$(METROWERKS)/Novell Support/Metrowerks Support/Libraries/Runtime" >> $@ + @echo -l "$(METROWERKS)/Novell Support/Metrowerks Support/Libraries/MSL C++" >> $@ +ifneq "$(IPV6)" "" + @echo -l $(NOVELLLIBC)\include\winsock\IPV6 >> $@ +endif + @echo -l $(NOVELLLIBC)/imports >> $@ +ifneq "$(LDAPSDK)" "" + @echo -l $(LDAPSDK)/lib/nlm >> $@ +endif + @echo -l $(XML)/$(OBJDIR) >> $@ + @echo -nodefaults >> $@ + @echo -map $(OBJDIR)\$(NLM_NAME).map>> $@ + @echo -threadname "$(NLM_THREAD_NAME)" >> $@ +ifneq "$(NLM_STACK_SIZE)" "" + @echo -stacksize $(subst K,000,$(subst k,K,$(strip $(NLM_STACK_SIZE)))) >> $@ +else + @echo -stacksize 64000 >> $@ +endif +ifneq "$(NLM_ENTRY_SYM)" "" + @echo -entry $(NLM_ENTRY_SYM) >> $@ +endif +ifneq "$(NLM_EXIT_SYM)" "" + @echo -exit $(NLM_EXIT_SYM) >> $@ +endif +ifneq "$(NLM_CHECK_SYM)" "" + @echo -check $(NLM_CHECK_SYM) >> $@ +endif +ifneq "$(NLM_FLAGS)" "" + @echo -flags $(NLM_FLAGS) >> $@ +endif +ifneq "$(strip $(XLFLAGS))" "" + @echo $(XLFLAGS) >> $@ +endif +ifneq "$(strip $(FILES_nlm_objs))" "" + @echo $(foreach objfile,$(strip $(FILES_nlm_objs)),$(subst /,\,$(objfile))) >> $@ +endif +ifneq "$(FILES_nlm_libs)" "" + @echo $(foreach libfile, $(notdir $(strip $(FILES_nlm_libs))),-l$(subst /,\,$(libfile))) >> $@ +endif + @echo -commandfile $(OBJDIR)\$(NLM_NAME)_link.def >> $@ +ifneq "$(FILE_nlm_msg)" "" + @echo Messages $(FILE_nlm_msg) >> $(OBJDIR)\$(NLM_NAME)_link.def +endif +ifneq "$(FILE_nlm_hlp)" "" + @echo Help $(FILE_nlm_hlp) >> $(OBJDIR)\$(NLM_NAME)_link.def +endif +ifneq "$(FILES_nlm_modules)" "" + @echo module $(foreach module,$(subst $(SPACE),$(COMMA),$(strip $(FILES_nlm_modules))),$(subst /,\,$(module))) >> $(OBJDIR)\$(NLM_NAME)_link.def +endif +ifneq "$(FILES_nlm_Ximports)" "" + @echo Import $(foreach import,$(subst $(SPACE),$(COMMA),$(strip $(FILES_nlm_Ximports))),$(subst /,\,$(import))) >> $(OBJDIR)\$(NLM_NAME)_link.def +endif +ifneq "$(FILES_nlm_exports)" "" + @echo Export $(foreach export,$(subst $(SPACE),$(COMMA),$(strip $(FILES_nlm_exports))),$(subst /,\,$(export))) >> $(OBJDIR)\$(NLM_NAME)_link.def +endif + +# if APACHE_UNIPROC is defined, don't include XDCData +ifndef APACHE_UNIPROC +ifneq "$(string $(XDCDATA))" "" + @echo XDCData $(XDCDATA) >> $(OBJDIR)\$(NLM_NAME)_link.def +else + @echo XDCData $(NWOS)\apache.xdc >> $(OBJDIR)\$(NLM_NAME)_link.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% $(AP_WORK)\build\NWGNUhead.inc $(AP_WORK)\build\NWGNUtail.inc $(AP_WORK)\build\NWGNUenvironment.inc $(CUSTOM_INI) $(VERSION_INC) FORCE + @echo Calling $< + $(MAKE) -f $< $(MAKECMDGOALS) RELEASE=$(RELEASE) + $(CMD) echo. + +else + +$(TARGET_nlm): + +endif # NO_LICENSE_FILE + +endif + diff --git a/rubbos/app/httpd-2.0.64/build/PrintPath b/rubbos/app/httpd-2.0.64/build/PrintPath new file mode 100755 index 00000000..2a2b48b6 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/build/apr_common.m4 b/rubbos/app/httpd-2.0.64/build/apr_common.m4 new file mode 100644 index 00000000..ace88c44 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/build/apr_common.m4 @@ -0,0 +1,993 @@ +dnl ----------------------------------------------------------------- +dnl apr_common.m4: APR's general-purpose autoconf macros +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 "$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 $2 where the + dnl 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,[ +if test "x$apr_ste_save_$1" = "x"; 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 +echo " restoring $1 to \"$$1\"" +echo " setting $2$1 to \"$$2$1\"" +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 + 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,[ + 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 + 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 + 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 + 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 + 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='' +]) + + +define(APR_DECIDE,[dnl +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_CHECK_SIZEOF_EXTENDED(INCLUDES, TYPE [, CROSS_SIZE]) +dnl +dnl A variant of AC_CHECK_SIZEOF which allows the checking of +dnl sizes of non-builtin types +dnl +AC_DEFUN(APR_CHECK_SIZEOF_EXTENDED, +[changequote(<<,>>)dnl +dnl The name to #define +define(<>, translit(sizeof_$2, [a-z *], [A-Z_P]))dnl +dnl The cache variable +define(<>, translit(ac_cv_sizeof_$2, [ *],[

    ]))dnl +changequote([, ])dnl +AC_MSG_CHECKING(size of $2) +AC_CACHE_VAL(AC_CV_NAME, +[AC_TRY_RUN([#include +$1 +main() +{ + FILE *f=fopen("conftestval","w"); + if (!f) exit(1); + fprintf(f, "%d\n", sizeof($2)); + exit(0); +}], AC_CV_NAME=`cat conftestval`, AC_CV_NAME=0, ifelse([$3],,, +AC_CV_NAME=$3))])dnl +AC_MSG_RESULT($AC_CV_NAME) +AC_DEFINE_UNQUOTED(AC_TYPE_NAME, $AC_CV_NAME, [The size of ]$2) +undefine([AC_TYPE_NAME])dnl +undefine([AC_CV_NAME])dnl +]) + + +dnl +dnl APR_TRY_COMPILE_NO_WARNING(INCLUDES, FUNCTION-BODY, +dnl [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) +dnl +dnl Tries a compile test with warnings activated so that the result +dnl is false if the code doesn't compile cleanly. +dnl +AC_DEFUN(APR_TRY_COMPILE_NO_WARNING, +[if test "x$CFLAGS_WARN" = "x"; then + apr_tcnw_flags="" +else + apr_tcnw_flags=$CFLAGS_WARN +fi +if test "$ac_cv_prog_gcc" = "yes"; then + apr_tcnw_flags="$apr_tcnw_flags -Werror" +fi +changequote(', ') +cat > conftest.$ac_ext <&AC_FD_CC ; then + ifelse([$3], , :, [rm -rf conftest* + $3]) +else + echo "configure: failed or warning program:" >&AC_FD_CC + cat conftest.$ac_ext >&AC_FD_CC + ifelse([$4], , , [rm -rf conftest* + $4]) +fi +rm -f conftest* +])dnl + +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_MSG_CHECKING(for type of return code from strerror_r) +AC_TRY_RUN([ +#include +#include +#include +main() +{ + 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]) + msg="int" +else + msg="pointer" +fi +AC_MSG_RESULT([$msg]) +] ) +dnl +dnl APR_CHECK_CRYPT_R_STYLE +dnl +dnl Decide which of a couple of flavors of crypt_r() is necessary for +dnl this platform. +dnl +AC_DEFUN(APR_CHECK_CRYPT_R_STYLE,[ +AC_CACHE_CHECK(style of crypt_r, ac_cv_crypt_r_style,[ +dnl +ac_cv_crypt_r_style=none +dnl +AC_TRY_COMPILE([ +#include +],[ +CRYPTD buffer; +crypt_r("passwd", "hash", &buffer); +], ac_cv_crypt_r_style=cryptd) +dnl +if test "$ac_cv_crypt_r_style" = "none"; then +AC_TRY_COMPILE([ +#include +],[ +struct crypt_data buffer; +crypt_r("passwd", "hash", &buffer); +], ac_cv_crypt_r_style=struct_crypt_data) +fi +dnl +]) +if test "$ac_cv_crypt_r_style" = "cryptd"; then + AC_DEFINE(CRYPT_R_CRYPTD, 1, [Define if crypt_r has uses CRYPTD]) +fi +# if we don't combine these conditions, CRYPT_R_STRUCT_CRYPT_DATA +# will end up defined twice +if test "$ac_cv_crypt_r_style" = "struct_crypt_data"; then + AC_DEFINE(CRYPT_R_STRUCT_CRYPT_DATA, 1, [Define if crypt_r uses struct crypt_data]) +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) +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) +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 + 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() { 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_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 +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/rubbos/app/httpd-2.0.64/build/binbuild.sh b/rubbos/app/httpd-2.0.64/build/binbuild.sh new file mode 100755 index 00000000..92fe0a72 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/build/bsd_makefile b/rubbos/app/httpd-2.0.64/build/bsd_makefile new file mode 100755 index 00000000..b8d8189b --- /dev/null +++ b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/build/build-modules-c.awk b/rubbos/app/httpd-2.0.64/build/build-modules-c.awk new file mode 100644 index 00000000..73e8d800 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/build/build-modules-c.awk @@ -0,0 +1,70 @@ +# 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 = " " + 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 " * 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/rubbos/app/httpd-2.0.64/build/buildinfo.sh b/rubbos/app/httpd-2.0.64/build/buildinfo.sh new file mode 100755 index 00000000..e18d0a83 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/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/rubbos/app/httpd-2.0.64/build/config-stubs b/rubbos/app/httpd-2.0.64/build/config-stubs new file mode 100755 index 00000000..425dc802 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/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 . -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/rubbos/app/httpd-2.0.64/build/config.guess b/rubbos/app/httpd-2.0.64/build/config.guess new file mode 100755 index 00000000..115f944a --- /dev/null +++ b/rubbos/app/httpd-2.0.64/build/config.guess @@ -0,0 +1,1502 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 +# Free Software Foundation, Inc. + +timestamp='2010-04-03' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA +# 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + + +# Originally written by Per Bothner. Please send patches (context +# diff format) to and include a ChangeLog +# entry. +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, +2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free +Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +trap 'exit 1' HUP INT TERM + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +set_cc_for_build=' +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" HUP INT PIPE TERM ; +: ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +dummy=$tmp/dummy ; +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > $dummy.c ; + for c in cc gcc c89 c99 ; do + if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac ; set_cc_for_build= ;' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE_ARCH}" in + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ELF__ + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "${UNAME_VERSION}" in + Debian*) + release='-gnu' + ;; + *) + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} + exit ;; + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + exit ;; + *:SolidBSD:*:*) + echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} + exit ;; + macppc:MirBSD:*:*) + echo powerpc-unknown-mirbsd${UNAME_RELEASE} + exit ;; + *:MirBSD:*:*) + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE="alpha" ;; + "EV4.5 (21064)") + UNAME_MACHINE="alpha" ;; + "LCA4 (21066/21068)") + UNAME_MACHINE="alpha" ;; + "EV5 (21164)") + UNAME_MACHINE="alphaev5" ;; + "EV5.6 (21164A)") + UNAME_MACHINE="alphaev56" ;; + "EV5.6 (21164PC)") + UNAME_MACHINE="alphapca56" ;; + "EV5.7 (21164PC)") + UNAME_MACHINE="alphapca57" ;; + "EV6 (21264)") + UNAME_MACHINE="alphaev6" ;; + "EV6.7 (21264A)") + UNAME_MACHINE="alphaev67" ;; + "EV6.8CB (21264C)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8AL (21264B)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8CX (21264D)") + UNAME_MACHINE="alphaev68" ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE="alphaev69" ;; + "EV7 (21364)") + UNAME_MACHINE="alphaev7" ;; + "EV7.9 (21364A)") + UNAME_MACHINE="alphaev79" ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + exit ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit ;; + arm:riscos:*:*|arm:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + s390x:SunOS:*:*) + echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) + echo i386-pc-auroraux${UNAME_RELEASE} + exit ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + eval $set_cc_for_build + SUN_ARCH="i386" + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH="x86_64" + fi + fi + echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && + dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`$dummy $dummyarg` && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos${UNAME_RELEASE} + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit ;; + *:AIX:*:[456]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include + #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 [ ${HP_ARCH} = "hppa2.0w" ] + then + eval $set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | + grep -q __LP64__ + then + HP_ARCH="hppa2.0w" + else + HP_ARCH="hppa64" + fi + fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit ;; + *:FreeBSD:*:*) + case ${UNAME_MACHINE} in + pc98) + echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + amd64) + echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + *) + echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; + esac + exit ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit ;; + *:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit ;; + i*:windows32*:*) + # uname -m includes "-pc" on this system. + echo ${UNAME_MACHINE}-mingw32 + exit ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit ;; + *:Interix*:*) + case ${UNAME_MACHINE} in + x86) + echo i586-pc-interix${UNAME_RELEASE} + exit ;; + authenticamd | genuineintel | EM64T) + echo x86_64-unknown-interix${UNAME_RELEASE} + exit ;; + IA64) + echo ia64-unknown-interix${UNAME_RELEASE} + exit ;; + esac ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit ;; + 8664:Windows_NT:*) + echo x86_64-pc-mks + exit ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-unknown-cygwin + exit ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit ;; + *:GNU:*:*) + # the GNU system + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu + exit ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep -q ld.so.1 + if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + exit ;; + arm*:Linux:*:*) + eval $set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + echo ${UNAME_MACHINE}-unknown-linux-gnu + else + echo ${UNAME_MACHINE}-unknown-linux-gnueabi + fi + exit ;; + avr32*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + cris:Linux:*:*) + echo cris-axis-linux-gnu + exit ;; + crisv32:Linux:*:*) + echo crisv32-axis-linux-gnu + exit ;; + frv:Linux:*:*) + echo frv-unknown-linux-gnu + exit ;; + i*86:Linux:*:*) + LIBC=gnu + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #ifdef __dietlibc__ + LIBC=dietlibc + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'` + echo "${UNAME_MACHINE}-pc-linux-${LIBC}" + exit ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + mips:Linux:*:* | mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef ${UNAME_MACHINE} + #undef ${UNAME_MACHINE}el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=${UNAME_MACHINE}el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=${UNAME_MACHINE} + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'` + test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } + ;; + or32:Linux:*:*) + echo or32-unknown-linux-gnu + exit ;; + padre:Linux:*:*) + echo sparc-unknown-linux-gnu + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-gnu + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-gnu ;; + PA8*) echo hppa2.0-unknown-linux-gnu ;; + *) echo hppa-unknown-linux-gnu ;; + esac + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-gnu + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-gnu + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + vax:Linux:*:*) + echo ${UNAME_MACHINE}-dec-linux-gnu + exit ;; + x86_64:Linux:*:*) + echo x86_64-unknown-linux-gnu + exit ;; + xtensa*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo ${UNAME_MACHINE}-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i586. + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configury will decide that + # this is a cross-build. + echo i586-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + NCR*:*:4.2:* | MPRAS*:*:4.2:*) + OS_REL='.3' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ + && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo ${UNAME_MACHINE}-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + echo i586-pc-haiku + exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} + exit ;; + SX-7:SUPER-UX:*:*) + echo sx7-nec-superux${UNAME_RELEASE} + exit ;; + SX-8:SUPER-UX:*:*) + echo sx8-nec-superux${UNAME_RELEASE} + exit ;; + SX-8R:SUPER-UX:*:*) + echo sx8r-nec-superux${UNAME_RELEASE} + exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown + case $UNAME_PROCESSOR in + i386) + eval $set_cc_for_build + if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + UNAME_PROCESSOR="x86_64" + fi + fi ;; + unknown) UNAME_PROCESSOR=powerpc ;; + esac + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = "x86"; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NSE-?:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk${UNAME_RELEASE} + exit ;; + NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} + exit ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "${UNAME_MACHINE}" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' + exit ;; + i*86:rdos:*:*) + echo ${UNAME_MACHINE}-pc-rdos + exit ;; + i*86:AROS:*:*) + echo ${UNAME_MACHINE}-pc-aros + exit ;; +esac + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +eval $set_cc_for_build +cat >$dummy.c < +# include +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix\n"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +# if !defined (ultrix) +# include +# if defined (BSD) +# if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +# else +# if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# endif +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# else + printf ("vax-dec-ultrix\n"); exit (0); +# endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + c34*) + echo c34-convex-bsd + exit ;; + c38*) + echo c38-convex-bsd + exit ;; + c4*) + echo c4-convex-bsd + exit ;; + esac +fi + +cat >&2 < in order to provide the needed +information to handle your system. + +config.guess timestamp = $timestamp + +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/rubbos/app/httpd-2.0.64/build/config.sub b/rubbos/app/httpd-2.0.64/build/config.sub new file mode 100755 index 00000000..204218c0 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/build/config.sub @@ -0,0 +1,1731 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 +# Free Software Foundation, Inc. + +timestamp='2010-05-21' + +# This file is (in principle) common to ALL GNU software. +# The presence of a machine in this file suggests that SOME GNU software +# can handle that machine. It does not imply ALL GNU software can. +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA +# 02110-1301, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + + +# Please send patches to . Submit a context +# diff and a properly formatted GNU ChangeLog entry. +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# You can get the latest version of this script from: +# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, +2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free +Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \ + linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ + knetbsd*-gnu* | netbsd*-gnu* | \ + kopensolaris*-gnu* | \ + storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis | -knuth | -cray | -microblaze) + os= + basic_machine=$1 + ;; + -bluegene*) + os=-cnk + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco6) + os=-sco5v6 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco5v6*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ + | bfin \ + | c4x | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | fido | fr30 | frv \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ + | lm32 \ + | m32c | m32r | m32rle | m68000 | m68k | m88k \ + | maxq | mb | microblaze | mcore | mep | metag \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64octeon | mips64octeonel \ + | mips64orion | mips64orionel \ + | mips64r5900 | mips64r5900el \ + | mips64vr | mips64vrel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mips64vr5900 | mips64vr5900el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | moxie \ + | mt \ + | msp430 \ + | nios | nios2 \ + | ns16k | ns32k \ + | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ + | pyramid \ + | rx \ + | score \ + | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ + | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ + | spu | strongarm \ + | tahoe | thumb | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ + | ubicom32 \ + | v850 | v850e \ + | we32k \ + | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ + | z8k | z80) + basic_machine=$basic_machine-unknown + ;; + c54x) + basic_machine=tic54x-unknown + ;; + c55x) + basic_machine=tic55x-unknown + ;; + c6x) + basic_machine=tic6x-unknown + ;; + m6811 | m68hc11 | m6812 | m68hc12 | picochip) + # Motorola 68HC11/12. + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + ms1) + basic_machine=mt-unknown + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* | avr32-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* \ + | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ + | lm32-* \ + | m32c-* | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64octeon-* | mips64octeonel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64r5900-* | mips64r5900el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mips64vr5900-* | mips64vr5900el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipstx39-* | mipstx39el-* \ + | mmix-* \ + | mt-* \ + | msp430-* \ + | nios-* | nios2-* \ + | none-* | np1-* | ns16k-* | ns32k-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ + | pyramid-* \ + | romp-* | rs6000-* | rx-* \ + | sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ + | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ + | tahoe-* | thumb-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tile-* | tilegx-* \ + | tron-* \ + | ubicom32-* \ + | v850-* | v850e-* | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ + | xstormy16-* | xtensa*-* \ + | ymp-* \ + | z8k-* | z80-*) + ;; + # Recognize the basic CPU types without company name, with glob match. + xtensa*) + basic_machine=$basic_machine-unknown + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + abacus) + basic_machine=abacus-unknown + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amd64) + basic_machine=x86_64-pc + ;; + amd64-*) + basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aros) + basic_machine=i386-pc + os=-aros + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + blackfin) + basic_machine=bfin-unknown + os=-linux + ;; + blackfin-*) + basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + bluegene*) + basic_machine=powerpc-ibm + os=-cnk + ;; + c54x-*) + basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c55x-*) + basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c6x-*) + basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + cegcc) + basic_machine=arm-unknown + os=-cegcc + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + craynv) + basic_machine=craynv-cray + os=-unicosmp + ;; + cr16) + basic_machine=cr16-unknown + os=-elf + ;; + crds | unos) + basic_machine=m68k-crds + ;; + crisv32 | crisv32-* | etraxfs*) + basic_machine=crisv32-axis + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + crx) + basic_machine=crx-unknown + os=-elf + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dicos) + basic_machine=i686-pc + os=-dicos + ;; + djgpp) + basic_machine=i586-pc + os=-msdosdjgpp + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; +# I'm not sure what "Sysv32" means. Should this be sysv3.2? + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m68knommu) + basic_machine=m68k-unknown + os=-linux + ;; + m68knommu-*) + basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + microblaze) + basic_machine=microblaze-xilinx + ;; + mingw32) + basic_machine=i386-pc + os=-mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + os=-mingw32ce + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + ms1-*) + basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + openrisc | openrisc-*) + basic_machine=or32-unknown + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + parisc) + basic_machine=hppa-unknown + os=-linux + ;; + parisc-*) + basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` + os=-linux + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pc98) + basic_machine=i386-pc + ;; + pc98-*) + basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2 | pentiumiii | pentium3) + basic_machine=i686-pc + ;; + pentium4) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium4-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc) basic_machine=powerpc-unknown + ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rdos) + basic_machine=i386-pc + os=-rdos + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sde) + basic_machine=mipsisa32-sde + os=-elf + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sh5el) + basic_machine=sh5le-unknown + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + # This must be matched before tile*. + tilegx*) + basic_machine=tilegx-unknown + os=-linux-gnu + ;; + tile*) + basic_machine=tile-unknown + os=-linux-gnu + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xbox) + basic_machine=i686-pc + os=-mingw32 + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + z80-*-coff) + basic_machine=z80-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + mmix) + basic_machine=mmix-knuth + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -auroraux) + os=-auroraux + ;; + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \ + | -sym* | -kopensolaris* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* | -aros* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ + | -openbsd* | -solidbsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* | -cegcc* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -linux-android* \ + | -linux-newlib* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ + | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -os400*) + os=-os400 + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -syllable*) + os=-syllable + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -tpf*) + os=-tpf + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -aros*) + os=-aros + ;; + -kaos*) + os=-kaos + ;; + -zvmoe) + os=-zvmoe + ;; + -dicos*) + os=-dicos + ;; + -nacl*) + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + score-*) + os=-elf + ;; + spu-*) + os=-elf + ;; + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + c4x-* | tic4x-*) + os=-coff + ;; + tic54x-*) + os=-coff + ;; + tic55x-*) + os=-coff + ;; + tic6x-*) + os=-coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + # This also exists in the configure program, but was not the + # default. + # os=-sunos4 + ;; + m68*-cisco) + os=-aout + ;; + mep-*) + os=-elf + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-haiku) + os=-haiku + ;; + *-ibm) + os=-aix + ;; + *-knuth) + os=-mmixware + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -cnk*|-aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -os400*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -tpf*) + vendor=ibm + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/rubbos/app/httpd-2.0.64/build/config_vars.mk b/rubbos/app/httpd-2.0.64/build/config_vars.mk new file mode 100644 index 00000000..8d5e4de4 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/build/config_vars.mk @@ -0,0 +1,150 @@ +exp_exec_prefix = /bottlenecks/rubbos/app/apache2 +rel_exec_prefix = +exp_bindir = /bottlenecks/rubbos/app/apache2/bin +rel_bindir = bin +exp_sbindir = /bottlenecks/rubbos/app/apache2/bin +rel_sbindir = bin +exp_libdir = /bottlenecks/rubbos/app/apache2/lib +rel_libdir = lib +exp_libexecdir = /bottlenecks/rubbos/app/apache2/modules +rel_libexecdir = modules +exp_mandir = /bottlenecks/rubbos/app/apache2/man +rel_mandir = man +exp_sysconfdir = /bottlenecks/rubbos/app/apache2/conf +rel_sysconfdir = conf +exp_datadir = /bottlenecks/rubbos/app/apache2 +rel_datadir = +exp_installbuilddir = /bottlenecks/rubbos/app/apache2/build +rel_installbuilddir = build +exp_errordir = /bottlenecks/rubbos/app/apache2/error +rel_errordir = error +exp_iconsdir = /bottlenecks/rubbos/app/apache2/icons +rel_iconsdir = icons +exp_htdocsdir = /bottlenecks/rubbos/app/apache2/htdocs +rel_htdocsdir = htdocs +exp_manualdir = /bottlenecks/rubbos/app/apache2/manual +rel_manualdir = manual +exp_cgidir = /bottlenecks/rubbos/app/apache2/cgi-bin +rel_cgidir = cgi-bin +exp_includedir = /bottlenecks/rubbos/app/apache2/include +rel_includedir = include +exp_localstatedir = /bottlenecks/rubbos/app/apache2 +rel_localstatedir = +exp_runtimedir = /bottlenecks/rubbos/app/apache2/logs +rel_runtimedir = logs +exp_logfiledir = /bottlenecks/rubbos/app/apache2/logs +rel_logfiledir = logs +exp_proxycachedir = /bottlenecks/rubbos/app/apache2/proxy +rel_proxycachedir = proxy +SHLTCFLAGS = -prefer-pic +LTCFLAGS = -prefer-non-pic -static +MOD_ACCESS_LDADD = +MOD_AUTH_LDADD = +MOD_INCLUDE_LDADD = +MOD_LOG_CONFIG_LDADD = +MOD_ENV_LDADD = +MOD_SETENVIF_LDADD = +MPM_NAME = worker +MPM_SUBDIR_NAME = worker +htpasswd_LTFLAGS = +htdigest_LTFLAGS = +rotatelogs_LTFLAGS = +logresolve_LTFLAGS = +htdbm_LTFLAGS = +ab_LTFLAGS = +checkgid_LTFLAGS = +APACHECTL_ULIMIT = ulimit -S -n `ulimit -H -n` +MOD_HTTP_LDADD = +MOD_MIME_LDADD = +MOD_STATUS_LDADD = +MOD_AUTOINDEX_LDADD = +MOD_ASIS_LDADD = +MOD_CGID_LDADD = +MOD_NEGOTIATION_LDADD = +MOD_DIR_LDADD = +MOD_IMAP_LDADD = +MOD_ACTIONS_LDADD = +MOD_USERDIR_LDADD = +MOD_ALIAS_LDADD = +MOD_SO_LDADD = +progname = httpd +MPM_LIB = server/mpm/worker/libworker.la +OS = unix +OS_DIR = unix +BUILTIN_LIBS = modules/aaa/mod_access.la modules/aaa/mod_auth.la modules/filters/mod_include.la modules/loggers/mod_log_config.la modules/metadata/mod_env.la modules/metadata/mod_setenvif.la modules/http/mod_http.la modules/http/mod_mime.la modules/generators/mod_status.la modules/generators/mod_autoindex.la modules/generators/mod_asis.la modules/generators/mod_cgid.la modules/mappers/mod_negotiation.la modules/mappers/mod_dir.la modules/mappers/mod_imap.la modules/mappers/mod_actions.la modules/mappers/mod_userdir.la modules/mappers/mod_alias.la modules/mappers/mod_so.la +SHLIBPATH_VAR = LD_LIBRARY_PATH +OS_SPECIFIC_VARS = +PRE_SHARED_CMDS = echo "" +POST_SHARED_CMDS = echo "" +shared_build = +AP_LIBS = /bottlenecks/rubbos/app/httpd-2.0.64/srclib/pcre/libpcre.la /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/libaprutil-0.la /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/libexpat.la /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/libapr-0.la -lrt -lm -lcrypt -lnsl -lpthread -ldl +AP_BUILD_SRCLIB_DIRS = apr apr-util +AP_CLEAN_SRCLIB_DIRS = apr-util apr +abs_srcdir = /bottlenecks/rubbos/app/httpd-2.0.64 +bindir = ${exec_prefix}/bin +sbindir = ${exec_prefix}/bin +cgidir = ${datadir}/cgi-bin +logfiledir = ${localstatedir}/logs +exec_prefix = ${prefix} +datadir = ${prefix} +localstatedir = ${prefix} +mandir = ${prefix}/man +libdir = ${exec_prefix}/lib +libexecdir = ${exec_prefix}/modules +htdocsdir = ${datadir}/htdocs +manualdir = ${datadir}/manual +includedir = ${prefix}/include +errordir = ${datadir}/error +iconsdir = ${datadir}/icons +sysconfdir = ${prefix}/conf +installbuilddir = ${datadir}/build +runtimedir = ${localstatedir}/logs +proxycachedir = ${localstatedir}/proxy +other_targets = +progname = httpd +prefix = /bottlenecks/rubbos/app/apache2 +AWK = gawk +CC = gcc +CPP = gcc -E +CXX = +CPPFLAGS = +CFLAGS = +CXXFLAGS = +LTFLAGS = --silent +LDFLAGS = +LT_LDFLAGS = -export-dynamic +SH_LDFLAGS = +HTTPD_LDFLAGS = +UTIL_LDFLAGS = +LIBS = +DEFS = +INCLUDES = +NOTEST_CPPFLAGS = -DAP_HAVE_DESIGNATED_INITIALIZER +NOTEST_CFLAGS = +NOTEST_CXXFLAGS = +NOTEST_LDFLAGS = +NOTEST_LIBS = +EXTRA_CPPFLAGS = -D_REENTRANT -D_GNU_SOURCE +EXTRA_CFLAGS = -g -O2 -pthread +EXTRA_CXXFLAGS = +EXTRA_LDFLAGS = -L/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib +EXTRA_LIBS = +EXTRA_INCLUDES = -I/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include -I/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include -I/bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/xml/expat/lib -I. -I$(top_srcdir)/os/$(OS_DIR) -I$(top_srcdir)/server/mpm/$(MPM_SUBDIR_NAME) -I$(top_srcdir)/modules/http -I$(top_srcdir)/modules/filters -I$(top_srcdir)/modules/proxy -I$(top_srcdir)/include -I$(top_srcdir)/modules/generators -I$(top_srcdir)/modules/dav/main +LIBTOOL = /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/libtool $(LTFLAGS) +SHELL = /bin/bash +MODULE_DIRS = aaa filters loggers metadata http generators mappers +MODULE_CLEANDIRS = arch/win32 cache echo experimental proxy ssl test dav/main dav/fs +PORT = 80 +nonssl_listen_stmt_1 = +nonssl_listen_stmt_2 = Listen @@Port@@ +CORE_IMPLIB_FILE = +CORE_IMPLIB = +SH_LIBS = +SH_LIBTOOL = $(LIBTOOL) +MK_IMPLIB = +INSTALL_PROG_FLAGS = +DSO_MODULES = +APR_BINDIR = /bottlenecks/rubbos/app/apache2/bin +APR_INCLUDEDIR = /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr/include +APU_BINDIR = /bottlenecks/rubbos/app/apache2/bin +APU_INCLUDEDIR = /bottlenecks/rubbos/app/httpd-2.0.64/srclib/apr-util/include diff --git a/rubbos/app/httpd-2.0.64/build/default.pl b/rubbos/app/httpd-2.0.64/build/default.pl new file mode 100644 index 00000000..4a73b778 --- /dev/null +++ b/rubbos/app/httpd-2.0.64/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()) { + >>